ZGlmZiAtLWdpdCBhL3NyYy9JTlNUQUxMIGIvc3JjL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhYTZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9JTlNUQUxMCkBAIC0wLDAgKzEsNDI3IEBACitJTlNUQUxMIC0gSW5zdGFsbGF0aW9uIG9mIFZpbSBvbiBkaWZmZXJlbnQgbWFjaGluZXMuCisKK1RoaXMgZmlsZSBjb250YWlucyBpbnN0cnVjdGlvbnMgZm9yIGNvbXBpbGluZyBWaW0uIElmIHlvdSBhbHJlYWR5IGhhdmUgYW4KK2V4ZWN1dGFibGUgdmVyc2lvbiBvZiBWaW0sIHlvdSBkb24ndCBuZWVkIHRoaXMuCisKK0NvbnRlbnRzOgorMS4gR2VuZXJpYworMi4gVW5peAorMy4gUklTQyBPUworNC4gTWFjaW50b3NoCis1LiBPUy8yICh3aXRoIEVNWCAwLjliKQorNi4gQXRhcmkgTWlOVAorCitGb3IgT1MvMzkwIFVuaXggc2VlIC4uL3J1bnRpbWUvZG9jL29zXzM5MC50eHQKK0ZvciBCZUJveCBzZWUgLi4vcnVudGltZS9kb2Mvb3NfYmVvcy50eHQuCitGb3IgQW1pZ2Egc2VlIElOU1RBTExhbWkudHh0CitGb3IgUEMgKE1TLURPUywgV2luZG93cyBOVCwgV2luZG93cyA5NSkgc2VlIElOU1RBTExwYy50eHQKK0ZvciBNYWNpbnRvc2ggc2VlIElOU1RBTExtYWMudHh0CisKKworMS4gR2VuZXJpYworPT09PT09PT09PQorCitJZiB5b3UgY29tcGlsZSBWaW0gd2l0aG91dCBzcGVjaWZ5aW5nIGFueXRoaW5nLCB5b3Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQKK2JlaGF2aW91ciBhcyBpcyBkb2N1bWVudGVkLCB3aGljaCBzaG91bGQgYmUgZmluZSBmb3IgbW9zdCBwZW9wbGUuCisKK0ZvciBmZWF0dXJlcyB0aGF0IHlvdSBjYW4ndCBlbmFibGUvZGlzYWJsZSBpbiBhbm90aGVyIHdheSwgeW91IGNhbiBlZGl0IHRoZQorZmlsZSAiZmVhdHVyZS5oIiB0byBtYXRjaCB5b3VyIHByZWZlcmVuY2VzLgorCisKKzIuIFVuaXgKKz09PT09PT0KKworU3VtbWFyeToKKzEuIG1ha2UJCQlydW4gY29uZmlndXJlLCBjb21waWxlIGFuZCBsaW5rCisyLiBtYWtlIGluc3RhbGwJCWluc3RhbGxhdGlvbiBpbiAvdXNyL2xvY2FsCisKK1RoaXMgd2lsbCBpbmNsdWRlIHRoZSBHVUkgYW5kIFgxMSBsaWJyYXJpZXMsIGlmIHlvdSBoYXZlIHRoZW0uICBJZiB5b3Ugd2FudCBhCit2ZXJzaW9uIG9mIFZpbSB0aGF0IGlzIHNtYWxsIGFuZCBzdGFydHMgdXAgcXVpY2tseSwgc2VlIHRoZSBNYWtlZmlsZSBmb3IgaG93Cit0byBkaXNhYmxlIHRoZSBHVUkgYW5kIFgxMS4gIElmIHlvdSBkb24ndCBoYXZlIE1vdGlmIGFuZC9vciBYMTEsIHRoZXNlCitmZWF0dXJlcyB3aWxsIGJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkuCisKK1NlZSB0aGUgc3RhcnQgb2YgTWFrZWZpbGUgZm9yIG1vcmUgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGFib3V0IGhvdyB0byBjb21waWxlCitWaW0uCisKK0lmIHlvdSBuZWVkIGV4dHJhIGNvbXBpbGVyIGFuZC9vciBsaW5rZXIgYXJndW1lbnRzLCBzZXQgJENGTEFHUyBhbmQvb3IgJExJQlMKK2JlZm9yZSBzdGFydGluZyBjb25maWd1cmUuICBFeGFtcGxlOgorCisJZW52ICBDRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgIExJQlM9LWxtICBtYWtlCisKK1RoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoaW5ncyB0aGF0IGNvbmZpZ3VyZSBkb2Vzbid0IG9mZmVyIGEgc3BlY2lmaWMgYXJndW1lbnQKK2ZvciBvciBmaWd1cmVzIG91dCBieSBpdHNlbGYuICBGaXJzdCB0cnkgcnVubmluZyBjb25maWd1cmUgd2l0aG91dCBleHRyYQorYXJndW1lbnRzLgorCitHTlUgQXV0b2NvbmYgYW5kIGEgZmV3IG90aGVyIHRvb2xzIGhhdmUgYmVlbiB1c2VkIHRvIG1ha2UgVmltIHdvcmsgb24gbWFueQorZGlmZmVyZW50IFVuaXggc3lzdGVtcy4gIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpcyB0aGF0IFZpbSBzaG91bGQgY29tcGlsZQorb24gbW9zdCBzeXRlbXMgd2l0aG91dCBhbnkgYWRqdXN0bWVudHMuICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgd2hlbgorYWRqdXN0bWVudHMgYXJlIHJlcXVpcmVkLCBpdCB0YWtlcyBzb21lIHRpbWUgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGhhcHBlbmluZy4KKworSWYgY29uZmlndXJlIGZpbmRzIGFsbCBsaWJyYXJ5IGZpbGVzIGFuZCB0aGVuIGNvbXBsYWlucyB3aGVuIGxpbmtpbmcgdGhhdCBzb21lCitvZiB0aGVtIGNhbid0IGJlIGZvdW5kLCB5b3VyIGxpbmtlciBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBjb2RlIGZvciBtaXNzaW5nCitsaWJyYXJpZXMuICBWaW0gc2hvdWxkIGJlIGxpbmtlZCBmaW5lIGFueXdheSwgbW9zdGx5IHlvdSBjYW4ganVzdCBpZ25vcmUgdGhlc2UKK2Vycm9ycy4KKworSWYgeW91IHJ1biBjb25maWd1cmUgYnkgaGFuZCAobm90IHVzaW5nIHRoZSBNYWtlZmlsZSksIHJlbWVtYmVyIHRoYXQgYW55CitjaGFuZ2VzIGluIHRoZSBNYWtlZmlsZSBoYXZlIG5vIGluZmx1ZW5jZSBvbiBjb25maWd1cmUuICBUaGlzIG1heSBiZSB3aGF0IHlvdQord2FudCwgYnV0IG1heWJlIG5vdCEKKworVGhlIGFkdmFudGFnZSBvZiBydW5uaW5nIGNvbmZpZ3VyZSBzZXBhcmF0ZWx5LCBpcyB0aGF0IHlvdSBjYW4gd3JpdGUgYSBzY3JpcHQKK3RvIGJ1aWxkIFZpbSwgd2l0aG91dCBjaGFuZ2luZyB0aGUgTWFrZWZpbGUgb3IgZmVhdHVyZS5oLiAgRXhhbXBsZSAodXNpbmcgc2gpOgorCisJQ0ZMQUdTPS1EQ09NUElMRVJfRkxBRyAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1ndWk9bW90aWYKKworT25lIHRoaW5nIHRvIHdhdGNoIG91dCBmb3I6IElmIHRoZSBjb25maWd1cmUgc2NyaXB0IGl0c2VsZiBjaGFuZ2VzLCBydW5uaW5nCisibWFrZSIgd2lsbCBleGVjdXRlIGl0IGFnYWluLCBidXQgd2l0aG91dCB5b3VyIGFyZ3VtZW50cy4gIERvICJtYWtlIGNsZWFuIiBhbmQKK3J1biBjb25maWd1cmUgYWdhaW4uCisKK0lmIHlvdSBhcmUgY29tcGlsaW5nIFZpbSBmb3Igc2V2ZXJhbCBtYWNoaW5lcywgZm9yIGVhY2ggbWFjaGluZToKKyAgYS4gICAgbWFrZSBzaGFkb3cKKyAgYi4gICAgbXYgc2hhZG93IG1hY2hpbmVfbmFtZQorICBjLiAgICBjZCBtYWNoaW5lX25hbWUKKyAgZC4gICAgbWFrZTsgbWFrZSBpbnN0YWxsCisKK1tEb24ndCB1c2UgYSBwYXRoIGZvciBtYWNoaW5lX25hbWUsIGp1c3QgYSBkaXJlY3RvcnkgbmFtZSwgb3RoZXJ3aXNlIHRoZSBsaW5rcwordGhhdCAibWFrZSBzaGFkb3ciIGNyZWF0ZXMgd29uJ3Qgd29yay5dCisKKworVW5peDogQ09NUElMSU5HIFdJVEgvV0lUSE9VVCBHVUkKKworVGhlc2UgY29uZmlndXJlIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hpY2ggR1VJIHRvIHVzZToKKy0tZW5hYmxlLWd1aT0JZ3RrLCBtb3RpZiwgYXRoZW5hIG9yIGF1dG8KKy0tZGlzYWJsZS1ndGstY2hlY2sKKy0tZGlzYWJsZS1tb3RpZi1jaGVjaworLS1kaXNhYmxlLWF0aGVuYS1jaGVjaworCistLWVuYWJsZS1ndWkgZGVmYXVsdHMgdG8gImF1dG8iLCBzbyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgbG9vayBmb3IgYSBHVUkgKGluCit0aGUgb3JkZXIgb2YgR1RLLCBNb3RpZiwgdGhlbiBBdGhlbmEpLiAgSWYgb25lIGlzIGZvdW5kLCB0aGVuIGlzIHVzZXMgaXQgYW5kCitkb2VzIG5vdCBwcm9jZWVkIHRvIGNoZWNrIGFueSBvZiB0aGUgcmVtYWluaW5nIG9uZXMuICBPdGhlcndpc2UsIGl0IG1vdmVzIG9uCit0byB0aGUgbmV4dCBvbmUuCisKKy0tZW5hYmxlLXtndGssbW90aWYsYXRoZW5hfS1jaGVjayBhbGwgZGVmYXVsdCB0byAieWVzIiwgc3VjaCB0aGF0IGlmCistLWVuYWJsZS1ndWkgaXMgImF1dG8iICh3aGljaCBpdCBpcyBieSBkZWZhdWx0KSwgR1RLLCBNb3RpZiwgYW5kIEF0aGVuYSB3aWxsCitiZSBjaGVja2VkIGZvci4gIElmIHlvdSB3YW50IHRvICpleGNsdWRlKiBhIGNlcnRhaW4gY2hlY2ssIHRoZW4geW91IHVzZQorLS1kaXNhYmxlLXtndGssbW90aWYsYXRoZW5hfS1jaGVjay4KKworRm9yIGV4YW1wbGUsIGlmIC0tZW5hYmxlLWd1aSBpcyBzZXQgdG8gImF1dG8iLCBidXQgeW91IGRvbid0IHdhbnQgaXQgbG9vayBmb3IKK01vdGlmLCB5b3UgdGhlbiBhbHNvIHNwZWNpZnkgLS1kaXNhYmxlLW1vdGlmLWNoZWNrLiAgVGhpcyByZXN1bHRzIGluIG9ubHkKK2NoZWNraW5nIGZvciBHVEsgYW5kIEF0aGVuYS4KKworTGFzdGx5LCBpZiB5b3Uga25vdyB3aGljaCBvbmUgeW91IHdhbnQgdG8gdXNlLCB0aGVuIHlvdSBjYW4ganVzdCBkbworLS1lbmFibGUtZ3VpPXtndGssbW90aWYsYXRoZW5hfS4gIFNvIGlmIHlvdSB3YW50ZWQgdG8gb25seSB1c2UgTW90aWYsIHRoZW4KK3lvdSdkIHNwZWNpZnkgLS1lbmFibGUtZ3VpPW1vdGlmLiAgT25jZSB5b3Ugc3BlY2lmeSB3aGF0IHlvdSB3YW50LCB0aGUKKy0tZW5hYmxlLXtndGssbW90aWYsYXRoZW5hfS1jaGVjayBvcHRpb25zIGFyZSBpZ25vcmVkLgorCitGb3IgY29tcGlsaW5nIHdpdGggdGhlIEdUSysgR1VJLCB5b3UgbmVlZCBhIHJlY2VudCB2ZXJzaW9uIG9mIGdsaWIgYW5kIGd0aysuCitDb25maWd1cmUgY2hlY2tzIGZvciBhdCBsZWFzdCB2ZXJzaW9uIDEuMS4xNiwgYnV0IGJlbG93IDIuMC4gIEFuIG9sZGVyIHZlcnNpb25zCitpcyBub3Qgc2VsZWN0ZWQgYXV0b21hdGljYWxseS4gIElmIHlvdSB3YW50IHRvIHVzZSBpdCBhbnl3YXksIHJ1biBjb25maWd1cmUKK3dpdGggIi0tZGlzYWJsZS1ndGt0ZXN0Ii4gIEdUSyAyLjAgZG9lc24ndCB3b3JrIHlldC4KK0dUSyByZXF1aXJlcyBhbiBBTlNJIEMgY29tcGlsZXIuICBJZiB5b3UgZmFpbCB0byBjb21waWxlIFZpbSB3aXRoIEdUSysgKGl0CitpcyB0aGUgcHJlZmVycmVkIGNob2ljZSksIHRyeSBzZWxlY3RpbmcgYW5vdGhlciBvbmUgaW4gdGhlIE1ha2VmaWxlLgorSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIEdUSyBpbnN0YWxsZWQsIGJ1dCBmb3Igc29tZSByZWFzb24gY29uZmlndXJlIHNheXMgeW91CitkbyBub3QsIHlvdSBtYXkgaGF2ZSBsZWZ0LW92ZXIgaGVhZGVyIGZpbGVzIGFuZC9vciBsaWJyYXJ5IGZpbGVzIGZyb20gYW4gb2xkZXIKKyhhbmQgaW5jb21wYXRpYmxlKSB2ZXJzaW9uIG9mIEdUSy4gIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHBsZWFzZSBjaGVjaworYXV0by9jb25maWcubG9nIGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgZ2l2ZSB5b3UgYSBoaW50IGFzIHRvIHdoYXQncworaGFwcGVuaW5nLgorCitVbml4OiBDT01QSUxJTkcgV0lUSCBNVUxUSS1CWVRFCisKK1doZW4geW91IHdhbnQgdG8gY29tcGlsZSB3aXRoIHRoZSBtdWx0aS1ieXRlIGZlYXR1cmVzIGVuYWJsZWQsIG1ha2Ugc3VyZSB5b3UKK2NvbXBpbGUgb24gYSBtYWNoaW5lIHdoZXJlIHRoZSBsb2NhbGUgc2V0dGluZ3MgYWN0dWFsbHkgd29yay4gIG90aGVyd2lzZSB0aGUKK2NvbmZpZ3VyZSB0ZXN0cyBtYXkgZmFpbC4gIFlvdSBuZWVkIHRvIGNvbXBpbGUgd2l0aCAiYmlnIiBmZWF0dXJlczoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1mZWF0dXJlcz1iaWcKKworVW5peDogQ09NUElMSU5HIE9OIExJTlVYCisKK09uIExpbnV4LCB3aGVuIHVzaW5nIC1nIHRvIGNvbXBpbGUgKHdoaWNoIGlzIGRlZmF1bHQgZm9yIGdjYyksIHRoZSBleGVjdXRhYmxlCit3aWxsIHByb2JhYmx5IGJlIHN0YXRpY2FsbHkgbGlua2VkLiAgSWYgeW91IGRvbid0IHdhbnQgdGhpcywgcmVtb3ZlIHRoZSAtZworb3B0aW9uIGZyb20gQ0ZMQUdTLgorCitVbml4OiBQVVRUSU5HIHZpbXJjIElOIC9ldGMKKworU29tZSBMaW51eCBkaXN0cmlidXRpb25zIHByZWZlciB0byBwdXQgdGhlIGdsb2JhbCB2aW1yYyBmaWxlIGluIC9ldGMsIGFuZCB0aGUKK1ZpbSBydW50aW1lIGZpbGVzIGluIC91c3IuICBUaGlzIGNhbiBiZSBkb25lIHdpdGg6CisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UgVklNUkNMT0M9L2V0YyBWSU1SVU5USU1FRElSPS91c3Ivc2hhcmUvdmltIE1BS0U9Im1ha2UgLWUiCisKK1VuaXg6IENPTVBJTElORyBPTiBOZVhUCisKK0FkZCB0aGUgIi1wb3NpeCIgYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyIGJ5IHVzaW5nIG9uZSBvZiB0aGVzZSBjb21tYW5kczoKKwlzZXRlbnYgQ0MgJ2NjIC1wb3NpeCcgKGNzaCkKKwlleHBvcnQgQ0M9J2NjIC1wb3NpeCcgKHNoKQorQW5kIHJ1biBjb25maWd1cmUgd2l0aCAiLS1kaXNhYmxlLW1vdGlmLWNoZWNrIi4KKworCiszLiBSSVNDIE9TCis9PT09PT09PT09PT09CisKK011Y2ggZmlsZSByZW5hbWluZyBpcyBuZWVkZWQgYmVmb3JlIHlvdSBjYW4gY29tcGlsZSBhbnl0aGluZy4KK1lvdSdsbCBuZWVkIFVuaXhMaWIgdG8gbGluayBhZ2FpbnN0LCBHQ0MgYW5kIEdOVSBtYWtlLgorCitJIHN1Z2dlc3QgeW91IGdldCB0aGUgUklTQyBPUyBiaW5hcnkgZGlzdHJpYnV0aW9uLCB3aGljaCBpbmNsdWRlcyB0aGUKK1RlbXBsYXRlcyBmaWxlIGFuZCB0aGUgbG9hZGVyLgorCitUcnkgaGVyZTogaHR0cDovL3d3dy5lY3Muc290b24uYWMudWsvfnRhbDE5NworCitEbworICAgIDpoZWxwIHJpc2NvcworCit3aXRoaW4gdGhlIGVkaXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgb3IgcmVhZCB0aGUgb3NfcmlzY29zLnR4dCBoZWxwIGZpbGUuCisKKworNC4gTWFjaW50b3NoCis9PT09PT09PT09PT0KKworVmltIHNob3VsZCB3b3JrIG9uIHRoZSBNYWNpbnRvc2gsIGJ1dCBJIGRvbid0IGhhdmUgYSBtYWtlZmlsZSBmb3IgaXQuCitXb3JrIGlzIGJlaW5nIGRvbmUgdG8gdXBkYXRlIHRoZSBNYWNpbnRvc2ggcG9ydC4gIEl0J3MgYSBsb3Qgb2Ygd29yazsgZG9uJ3QKK2V4cGVjdCBpdCBzb29uLgorCisKKzUuIE9TLzIKKz09PT09PT0KKworU3VtbWFyeToKK3JlbiBNYWtlZmlsZSBNYWtlZmlsZS51bml4CityZW4gbWFrZWZpbGUub3MyIE1ha2VmaWxlCittYWtlCisKK1RoaXMgcG9ydCBvZiBWaW0gdG8gT1MvMiBpcyBiYXNlZCBvbiB0aGUgZW14IGVudmlyb25tZW50IHRvZ2V0aGVyCit3aXRoIEdOVSBDLiBUaGUgbWFpbiBkZXNpZ24gZ29hbCBvZiBlbXggaXMgdG8gc2ltcGxpZnkgcG9ydGluZyBVbml4Citzb2Z0d2FyZSB0byBPUy8yIGFuZCBET1MuIEJlY2F1c2Ugb2YgdGhpcywgYWxtb3N0IGFsbCB0aGUgVW5peCBkZWZpbmVzCitldGMuIGFscmVhZHkgZXhpc3RpbmcgaW4gdGhlIFZpbSBzb3VyY2UgY29kZSBjb3VsZCBiZSByZXVzZWQuIE9ubHkgd2hlcmUKK09TLzIgc3BlY2lmaWNzIGNhbWUgaW50byBwbGF5IHdlcmUgYWRkaXRpb25hbCBjaGFuZ2VzIG5lY2Vzc2FyeS4gVGhvc2UKK3BsYWNlcyBjYW4gYmUgZm91bmQgYnkgc2VhcmNoaW5nIGZvciAiT1MyIiBhbmQgIl9fRU1YX18iIChJJ3ZlIHRyaWVkIHRvCitrZWVwIGVteC1zcGVjaWZpYyB0aGluZ3Mgc2VwYXJhdGUgZnJvbSBnZW5lcmljIE9TLzIgc3R1ZmYpLgorCitOb3RlOiBUaGlzIE9TLzIgcG9ydCB3b3JrcyB3ZWxsIGZvciBtZSBhbmQgYW4gYWRkaXRpb25hbCBPUy8yIHVzZXIgb24KKyAgICAgIHRoZSBWaW0gZGV2ZWxvcG1lbnQgdGVhbSAoS2Fyc3RlbiBTaWV2ZXJ0KTsgaG93ZXZlciwgc2luY2UgSQorICAgICAgaGF2ZW4ndCBoYWQgYW55IG90aGVyIGZlZWRiYWNrIGZyb20gb3RoZXIgcGVvcGxlLCB0aGF0IGVpdGhlcgorICAgICAgbWVhbnMgbm8gKE9TLzItc3BlY2lmaWMpIGJ1Z3MgZXhpc3QsIG9yIG5vIG9uZSBoYXMgeWV0IGNyZWF0ZWQKKyAgICAgIGEgc2l0dWF0aW9uIGluIHdoaWNoIGFueSBidWdzIGFyZSBhcHBhcmVudC4KKyAgICAgIFJlcG9ydCBhbnkgcHJvYmxlbXMgb3Igb3RoZXIgY29tbWVudHMgdG8gcGF1bEB3YXUubWlzLmFoLm5sCisgICAgICAoZW1haWwgdmFsaWQgdXAgdG8gYXQgbGVhc3QgU2VwdGVtYmVyIDE5OTYsIGFmdGVyIHRoYXQgdHJ5CisgICAgICBwYXVsQHd1cnRlbC5ob2JieS5ubCwgcGF1bEBtdXJwaHkubmwsIG9yIHBhdWxTQHRvZWNvbXBzdC5ubCkuCisgICAgICBUZXh0bW9kZS9ub3RleHRtb2RlIGFuZCBiaW5hcnkgbW9kZSBib3RoIHNlZW0gdG8gd29yayB3ZWxsLgorCitQcmVyZXF1aXNpdGVzOgorLSBUbyBjb21waWxlLCB5b3UgbmVlZCB0aGUgZW14IGVudmlyb25tZW50IChhdCBsZWFzdCByZXYuIDAuOWIpLCBHQ0MsCisgIHNvbWUgbWFrZSB1dGlsaXR5IChHTlUgbWFrZSB3b3JrcyBmaW5lKS4gVGhlc2UgYXJlIGdlbmVyYWxseQorICBhdmFpbGFibGUgYXMgKGFzayBBcmNoaWUgYWJvdXQgdGhlbSk6CisgICAgZW14cnQuemlwICAgICBlbXggcnVudGltZSBwYWNrYWdlCisgICAgZW14ZGV2LnppcCAgICBlbXggZGV2ZWxvcG1lbnQgc3lzdGVtICh3aXRob3V0IGNvbXBpbGVyKQorICBHTlUgcHJvZ3JhbXMgY29tcGlsZWQgZm9yIGVteCwgcGF0Y2hlcyBhbmQgcGF0Y2hlZCBzb3VyY2VzOgorICAgIGdudWRldjEuemlwICAgR05VIGRldmVsb3BtZW50IHRvb2xzIGNvbXBpbGVkIGZvciBlbXggKHBhcnQgMSkKKyAgICBnbnVkZXYyLnppcCAgIEdOVSBkZXZlbG9wbWVudCB0b29scyBjb21waWxlZCBmb3IgZW14IChwYXJ0IDIpCisgICAgZ251bWFrZS56aXAgICBHTlUgbWFrZQorLSBEb24ndCBzZXQgYSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlOyBWaW0gZGVmYXVsdHMgdG8gb3MyYW5zaQorICB3aGljaCBpcyBhdmFpbGFibGUgYXMgYSBidWlsdGluIHRlcm1jYXAgZW50cnkuIFVzaW5nIG90aGVyIHZhbHVlcworICBtYXkgZ2l2ZSBwcm9ibGVtcyEgKE9TLzIgQU5TSSBlbXVsYXRpb24gaXMgcXVpdGUgbGltaXRlZC4pIElmIHlvdQorICBuZWVkIHRvIHNldCBURVJNIGZvciBvdGhlciBwcm9ncmFtcywgeW91IG1heSBjb25zaWRlciBwdXR0aW5nCisgIHNldCB0ZXJtPW9zMmFuc2kgaW4gdGhlIHZpbXJjIGZpbGUuCisKK0NoZWNrIHZpbV9vczIudHh0IGZvciBhZGRpdGlvbmFsIGluZm8gb24gcnVubmluZyBWaW0uCisKKworNi4gQXRhcmkgTWlOVAorPT09PT09PT09PT09PQorCisKK1RvIGNvbXBpbGUgVmltIGZvciBNaU5UIHlvdSBtYXkgZWl0aGVyIGNvcHkgbWFrZWZpbGUubWludCB0byBNYWtlZmlsZSBvciB1c2UKK3RoZSBVbml4IE1ha2VmaWxlIGFkYXB0ZWQgZm9yIHRoZSBNaU5UIGNvbmZpZ3VyYXRpb24uCisKK05vdyBwcm9jZWVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgVW5peCBzZWN0aW9uLgorCitQcmVyZXF1aXNpdGVzOgorCitZb3UgbmVlZCBhIGN1cnNlcyBvciB0ZXJtY2FwIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyBub24tYWxwaGFudW1lcmljCit0ZXJtY2FwIG5hbWVzLiBJZiB5b3UgZG9uJ3QgaGF2ZSBhbnksIGxpbmsgd2l0aCB0ZXJtbGliLm8uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgSU5TVEFMTCBmaWxlIHRoYXQgY29tZXMgd2l0aCBHTlUKK2F1dG9jb25mIDIuMTIuIE5vdCBldmVyeXRoaW5nIGFwcGxpZXMgdG8gVmltLiBSZWFkIE1ha2VmaWxlIHRvbyEKKworCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9zcmMvSU5TVEFMTGFtaS50eHQgYi9zcmMvSU5TVEFMTGFtaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjZDZmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9JTlNUQUxMYW1pLnR4dApAQCAtMCwwICsxLDM0IEBACitJTlNUQUxMYW1pLnR4dCAtIEluc3RhbGxhdGlvbiBvZiBWaW0gZnJvbSBzb3VyY2Ugb24gQW1pZ2EKKworVGhpcyBmaWxlIGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IgY29tcGlsaW5nIFZpbS4gSWYgeW91IGFscmVhZHkgaGF2ZSBhbgorZXhlY3V0YWJsZSB2ZXJzaW9uIG9mIFZpbSwgeW91IGRvbid0IG5lZWQgdGhpcy4KKworVGhlIGZpbGUgImZlYXR1cmUuaCIgY2FuIGJlIGVkaXRlZCB0byBtYXRjaCB5b3VyIHByZWZlcmVuY2VzLiBZb3UgY2FuIHNraXAKK3RoaXMsIHRoZW4geW91IHdpbGwgZ2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFzIGlzIGRvY3VtZW50ZWQsIHdoaWNoIHNob3VsZAorYmUgZmluZSBmb3IgbW9zdCBwZW9wbGUuCisKKworU3VtbWFyeToKK21ha2UgLWYgTWFrZV9tYW54Lm1hawkJTWFueCBDCittYWtlIC1mIE1ha2Vfc2FzLm1hawkJTGF0dGljZS9TQVMgQworbWFrZSAtZiBNYWtlX2RpY2UubWFrCQlESUNFCisKK1RoZSBNYW54IGNvbXBpbGVyIGlzIHByZWZlcnJlZCwgaXQgd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgQW1pZ2EgZXhlY3V0YWJsZQorYW5kIGhhcyBiZWVuIHRlc3RlZCBtb3N0LiBZb3Ugc2hvdWxkIG5vdCBnZXQgYW55IGVycm9ycyBvciB3YXJuaW5ncy4KKworVGhlIFNBUyBjb21waWxlciBjYW4gYmUgdXNlZC4gT2xkZXIgdmVyc2lvbnMgKDYuMCB0byA2LjMpIGRvbid0IHdvcmsgd2l0aCB0aGUKK29wdGltaXplciBzd2l0Y2hlZCBvbi4gVGhpcyBzZWVtcyB0byBiZSBmaXhlZCB3aXRoIDYuNSBvciA2LjU2LCBidXQgdGhpcyBoYXMKK25vdCBiZWVuIHRlc3RlZCBtdWNoLiAgQWxzbyBkaXNhYmxlIG9wdGltaXppbmcgd2hlbiB0aGUgY29tcGlsZXIgcnVucyBvdXQgb2YKK21lbW9yeSBvciBjcmFzaGVzIHRoZSBzeXN0ZW0gKHllcywgdGhhdCBoYXBwZW5zOyBkaWQgSSBzYXkgdGhlIE1hbnggY29tcGlsZXIKK2lzIHByZWZlcnJlZD8pLgorCitUaGUgRElDRSBtYWtlZmlsZSBoYXMgYmVlbiByZXBvcnRlZCB0byB3b3JrIGJ5IG9uZSBwZXJzb24gb25seS4KKworWW91IHdpbGwgaGF2ZSB0byBzZXQgdGhlICJWSU0iIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKK2RvY3VtZW50YXRpb24gZmlsZXMuCisKKworTW9ycGhPUworCitVc2UgdGhlIE1ha2VfbW9ycGgubWFrIE1ha2VmaWxlOgorCW1ha2UgLWYgTWFrZV9tb3JwaC5tYWsKZGlmZiAtLWdpdCBhL3NyYy9JTlNUQUxMbWFjLnR4dCBiL3NyYy9JTlNUQUxMbWFjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjk0NGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0lOU1RBTExtYWMudHh0CkBAIC0wLDAgKzEsMTY0IEBACitJTlNUQUxMbWFjLnR4dCAtIEluc3RhbGxhdGlvbiBvZiBWaW0gb24gTWFjaW50b3NoCisKK1RoaXMgZmlsZSBjb250YWlucyBpbnN0cnVjdGlvbnMgZm9yIGNvbXBpbGluZyBWaW0uIElmIHlvdSBhbHJlYWR5IGhhdmUgYW4KK2V4ZWN1dGFibGUgdmVyc2lvbiBvZiBWaW0sIHlvdSBkb24ndCBuZWVkIHRoaXMuCisKK0FuIGFsdGVybmF0ZSB3YXkgb2YgYnVpbGRpbmcgdGhhdCBCZW5qaSBGaXNoZXIgdXNlcyBjYW4gYmUgZm91bmQgaGVyZToKKworCWh0dHA6Ly9tYWN2aW0uc3dkZXYub3JnL09TWC8jRGV2ZWxvcGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEgTWFjT1MgWAorIDEuMS4gQ2FyYm9uIGludGVyZmFjZQorIDEuMi4gWCAoQXRoZW5hLCBHVEssIE1vdGlmKSBvciBwbGFpbiB0ZXh0LgorCisyIE1hY09TIENsYXNzaWMKKyAyLjEuIENvZGVXYXJyaW9yCisgMi4yLiBNUFcKKworTk9URTogVGhlIENhcmJvbiB2ZXJzaW9uIGNhbiBvbmx5IGJlIGNvbXBpbGVkIHByb3Blcmx5IHVuZGVyCisgICAgICBNYWNPUyBYLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxIE1hY09TIFgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4wIENvbnNpZGVyYXRpb25zCisKKyBPbmx5ICcvJyBzdXBwb3J0ZWQgYXMgcGF0aCBzZXBhcmF0b3IuCisKKzEuMSBDYXJib24gaW50ZXJmYWNlIChkZWZhdWx0KQorCisgWW91IGNhbiBjb21waWxlIHZpbSB3aXRoIHRoZSBzdGFuZGFyZCBVbml4IHJvdXRpbmU6CisgICBjZCAuLgorICAgLi9jb25maWd1cmUKKyAgIG1ha2U7IG1ha2UgaW5zdGFsbAorCisgVGhpcyB3aWxsIGNyZWF0ZSBhIHdvcmtpbmcgVmltLmFwcCBhcHBsaWNhdGlvbiBidW5kbGUgaW4gdGhlIHNyYworIGRpcmVjdG9yeS4gIFlvdSBjYW4gbW92ZSB0aGlzIGJ1bmRsZSAodGhlIFZpbS5hcHAgZGlyZWN0b3J5KSBhbnl3aGVyZQorIHlvdSB3YW50LCBmb3IgZXhhbXBsZSwgL0FwcGxpY2F0aW9ucy4KKworMS4yIFgtV2luZG93cyBvciBQbGFpbiBUZXh0CisKKyBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIENhcmJvbiBpbnRlcmZhY2UsIHlvdSBtdXN0IGV4cGxpY2l0bHkgdGVsbAorIGNvbmZpZ3VyZSB0byB1c2UgYSBkaWZmZXJlbnQgR1VJLgorCisgIGNkIC4uCisgIC4vY29uZmlndXJlIC0tZW5hYmxlLWd1aT1ndGsyCisgIG1ha2U7IG1ha2UgaW5zdGFsbAorCisgTk9URTogVGhlIGZvbGxvd2luZyBHVUkgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorCW5vIChmb3IgdGV4dCksIG1vdGlmLCBhdGhlbmEsIG5leHRhdworCWd0aywgZ3RrMiwgZ25vbWUsIGdub21lMiwKKworIE5PVEU6IFlvdSBuZWVkIHRvIGZpcnN0IGluc3RhbGwgWEZyZWU4NiBhbmQgWERhcndpbi4KKyAgICAgICBQbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5YRGFyd2luLm9yZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNYWNPUyA5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JvdGggJzonIGFuZCAnLycgc3VwcG9ydGVkIGFzIHBhdGggc2VwYXJhdG9yLgorCisyLjE6IENvbXBpbGluZyB3aXRoIENvZGVXYXJpb3IKKworIDEuIEV4cGFuZCB0aGUgcmVzb3VyY2UgZmlsZToKKyAgIG9wZW4gLi4vc3JjL29zX21hYy5yc3IuaHF4IHRvIHByb2R1Y2UgLi4vc3JjL2d1aV9tYWMucnNyYzoKKyAgICUgY2QgdmltNjIvc3JjCisgICAlIG9wZW4gLWEgU3R1ZmZJdFwgRXhwYW5kZXIgb3NfbWFjLnJzci5ocXgKKworIDIuIEV4cGFuZCB0aGUgcHJvamVjdCBmaWxlOgorICAgLSAuLi9zcmMvb3NfbWFjLnNpdC5ocXggKHRvIHByb2R1Y2UgLi4vc3JjL3ZpbS5tY3ApCisKKyAzLiBPcGVuIHZpbS5tY3Agd2l0aCBDb2RlV2FyaW9yCisKKyAgIFRoaXMgaXMgYSBDb2RlV2FyaW9yIDkgcHJvamVjdCBmaWxlLiBXaGVuIHVzaW5nIGEgbmV3ZXIgdmVyc2lvbiwKKyAgIHlvdSBuZWVkIHRvIGNvbnZlcnQgdGhlIGZpbGUuIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGNoYW5nZSBzb21lCisgICBhY2Nlc3MgcGF0aC4KKworICAgTk9URTogdGhlIGN1cnJlbnQgcHJvamVjdCBmaWxlIGlzIG9sZCwgeW91IG5lZWQgdG8gYWRkIGEgZmV3IGZpbGVzOgorCSAoZXhfY21kczIuYywgZm9sZC5jLCBtYnl0ZS5jLCBtb3ZlLmMpCisKKyA0LiBTZWxlY3QgdGhlIHRhcmdldCBQUEMsIDY4ayBGQVQgKHdpdGgvd2l0aG91dCBkZWJ1Z2dlcikKKworIDUuIENvbXBpbGUKKworMi4yOiBDb21waWxpbmcgd2l0aCBNUFcuCisKKyAwLiBZb3Ugd2lsbCBuZWVkIGEgcmVjZW50IHZlcnNpb24gb2YgdGhlIE1QVyBhbmQgdGhlIFVuaXZlcnNhbCBJbnRlcmZhY2VzLgorICAgIFlvdSBjYW4gZ2V0IGJvdGggYXQ6CisJZnRwOi8vZnRwLmFwcGxlLmNvbS9kZXZlbG9wZXIvVG9vbF9DaGVzdC9JbnRlcmZhY2VzLUxpYnJhcmllcy8KKwlmdHA6Ly9mdHAuYXBwbGUuY29tL2RldmVsb3Blci9Ub29sX0NoZXN0L0NvcmVfTWFjX09TX1Rvb2xzLworICAgRm9yIGEgQ2FyYm9uIHZlcnNpb24geW91IHdpbGwgbmVlZCBhIHJlY2VudCBDYXJib24gU0RLIGFzIHdlbGwuCisgICAoV2hlbiB5b3UgaGF2ZSBhbiBvbGRlciB2ZXJzaW9uIGFscmVhZHkgaW5zdGFsbGVkIHlvdSBub3QgYmUgYWJsZSB0bworICAgIGNvbXBpbGUgYSBjYXJib24gdmVyc2lvbi4gVXBkYXRlICJDcmVhdGVNYWtlIiB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBBcHBsZS4KKworIDEuIEV4cGFuZCB0aGUgcmVzb3VyY2UgZmlsZToKKyAgIG9wZW4gLi4vc3JjL29zX21hYy5yc3IuaHF4IHRvIHByb2R1Y2UgLi4vc3JjL2d1aV9tYWMucnNyYzoKKyAgICUgY2QgdmltNjIvc3JjCisgICAlIG9wZW4gLWEgU3R1ZmZJdFwgRXhwYW5kZXIgb3NfbWFjLnJzci5ocXgKKworIDMuIERvdWJsZSBjbGljayBvbiBvc19tYWtlLm1ha2UsIHRoZSBNUFcgd2lsbCBub3cgb3BlbiBpbiB0aGUgY29ycmVjdAorICAgIGZvbGRlciBhbmQgbG9hZCB0aGUgQ3JlYXRlVmltTWFrZSBzY3JpcHQuIENoYW5nZSB0byB0aGUgV29ya3NoZWV0CisgICAgd2luZG93LiBUeXBlICJvc19tYWMuYnVpbGQiIGFuZCBoaXQgRW50ZXIgKG5vdCBSZXR1cm4pLiBBIGRpYWxvZyBib3gKKyAgICB3aWxsIGFwcGVhci4gU2VsZWN0IHRoZSB0YXJnZXQgeW91IHdhbnQuIChWaW0tNjhrLCBWaW0tcHBjLCBWaW0tY2FyYm9uKQorCisgNC4gU2VsZWN0ICJCdWlsZCIgZnJvbSB0aGUgbWVudSAob3IgdHlwZSBjb21tYW5kLUIpLiBUeXBlIHRoZSBwcm9ncmFtIG5hbWUKKyAgICBpbnRvIHRoZSBkaWFsb2cgYm94LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT0xEIEZJTEU6IFNPTUUgSU5GTyBNQVkgU1RJTEwgQkUgVVNFRlVMCisKK05PVEU6IFVzZXJzIG9mIG1vcmUgcmVjZW50IENvZGVXYXJyaW9yIHZlcnNpb24gbWF5IGhhdmUgdG8gcmVzZXQgdGhlIGxpYnJhcnkKKyAgICAgIHBhdGgsIGFuZCBjaGFuZ2UgdGhlIG1jaF9kZWxheSBpbiBvc19tYWMuYyBzbyB0aGUgZmluYWxUaWNrIGlzIHVuc2lnbmVkLgorCitDb21waWxhdGlvbiBpbnN0cnVjdGlvbnM6CisKKzEuIFZpc2l0IHRoZSBWaW0gZnRwIHNpdGUgKHNlZSBmdHA6Ly9mdHAudmltLm9yZy9wdWIvdmltL01JUlJPUlMpCisgICBhbmQgb2J0YWluIHRoZSBmb2xsb3dpbmcgZml2ZSBmaWxlczoKKworICAgdW5peC92aW0tWC5YLXNyYzEudGFyLmd6CisgICB1bml4L3ZpbS1YLlgtc3JjMi50YXIuZ3oKKyAgIHVuaXgvdmltLVguWC1ydDEudGFyLmd6CisgICB1bml4L3ZpbS1YLlgtcnQyLnRhci5negorICAgZXh0cmEvdmltLVguWC1leHRyYS50YXIuZ3oKKworICAgd2hlcmUgWC5YIGlzIHRoZSB2ZXJzaW9uIG51bWJlci4KKworICAgTk9URTogdGhlIGxhbmd1YWdlIHN1cHBvcnQgaXMgbm90IHlldCBzdXBwb3J0ZWQKKworMi4gRXhwYW5kIHRoZSBhcmNoaXZlcy4KKworMy4gQXBwbHkgcGF0Y2hlcyBpZiB0aGV5IGV4aXN0LiAgKFBhdGNoIGZpbGVzIGFyZSBmb3VuZCBpbiB0aGUgZnRwCisgICBzaXRlIGluIHRoZSAicGF0Y2hlcyIgZGlyZWN0b3J5LikKKworNC4gRWRpdCB2aW0tWC5YL3NyYy9mZWF0dXJlLmggZm9yIHlvdXIgcHJlZmVyZW5jZS4gIChZb3UgY2FuIHNraXAKKyAgIHRoaXMsIHRoZW4geW91IHdpbGwgZ2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFzIGlzIGRvY3VtZW50ZWQsCisgICB3aGljaCBzaG91bGQgYmUgZmluZSBmb3IgbW9zdCBwZW9wbGUuKQorCisgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWRkIHRoZSBGRUFUX01CWVRFIGZlYXR1cmUsIHR1cm4gb24KKyAgICNkZWZpbmUgRkVBVF9NQllURQorCis1LiBFeHBhbmQgdGhlIHJlc291cmNlIGZpbGU6CisKKyAgIC0gdmltLVguWC9zcmMvb3NfbWFjLnJzci5ocXggKHRvIHByb2R1Y2UgdmltLVguWC9zcmMvZ3VpX21hYy5yc3JjKQorCis2LiBJZiB1c2luZyBDb2RlV2FycmlvciwgZXhwYW5kIHRoZSBwcm9qZWN0IGZpbGU6CisKKyAgIC0gdmltLVguWC9zcmMvb3NfbWFjLnNpdC5ocXggKHRvIHByb2R1Y2UgdmltLVguWC9zcmMvdmltLm1jcCkKKworICAgVGhlIGxhdHRlciBmaWxlIGlzIHRoZSBDb2RlV2FycmlvciBwcm9qZWN0IGZpbGUgdG8gYmUgdXNlZC4KKworNy4gTGF1bmNoIENvZGVXYXJyaW9yIGJ5IGRvdWJsZSBjbGlja2luZyB2aW0ubWNwLgorCis4LiBDaGVjayBhZGRpdGlvbmFsIGZpbGVzIGlmIHlvdSBpbmNsdWRlIG5vbi1zdGFuZGFyZCBmZWF0dXJlcy4KKworICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhZGRlZCB0aGUgTVVMVElfQllURSBmZWF0dXJlLCBjaGVjaworICAgRXh0cmFzL21ieXRlLmMgaW4gdGhlIHByb2plY3Qgd2luZG93LgorCis5LiBDb21waWxlIGFuZCB5b3Ugd2lsbCBvYnRhaW4gYmluYXJpZXM6IHZpbVBQQywgVmltIDY4aywgYW5kL29yIHZpbUZBVC4KZGlmZiAtLWdpdCBhL3NyYy9JTlNUQUxMcGMudHh0IGIvc3JjL0lOU1RBTExwYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZDMyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9JTlNUQUxMcGMudHh0CkBAIC0wLDAgKzEsMzEwIEBACitJTlNUQUxMcGMudHh0IC0gSW5zdGFsbGF0aW9uIG9mIFZpbSBvbiBQQworCitUaGlzIGZpbGUgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIGZvciBjb21waWxpbmcgVmltLiBJZiB5b3UgYWxyZWFkeSBoYXZlIGFuCitleGVjdXRhYmxlIHZlcnNpb24gb2YgVmltLCB5b3UgZG9uJ3QgbmVlZCB0aGlzLgorCitNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBoZXJlOgorCisJaHR0cDovL215d2VicGFnZS5uZXRzY2FwZS5jb20vc2hhcnBwZW9wbGUvdmltL2hvd3RvLworCitUaGUgZmlsZSAiZmVhdHVyZS5oIiBjYW4gYmUgZWRpdGVkIHRvIG1hdGNoIHlvdXIgcHJlZmVyZW5jZXMuIFlvdSBjYW4gc2tpcAordGhpcywgdGhlbiB5b3Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYXMgaXMgZG9jdW1lbnRlZCwgd2hpY2ggc2hvdWxkCitiZSBmaW5lIGZvciBtb3N0IHBlb3BsZS4KKworCitDb250ZW50czoKKzEuIE1TLURPUworMi4gV2luMzIgKFdpbmRvd3MgTlQgYW5kIFdpbmRvd3MgOTUpCiszLiBXaW5kb3dzIE5UIHdpdGggT3Blbk5UCis0LiBXaW5kb3dzIDMuMQorNS4gVXNpbmcgTWluZ3cKKzYuIENyb3NzIGNvbXBpbGluZyBmb3IgV2luMzIgZnJvbSBhIExpbnV4IG1hY2hpbmUKKzcuIEJ1aWxkaW5nIHdpdGggUHl0aG9uIHN1cHBvcnQKKworCisxLiBNUy1ET1MKKz09PT09PT09PQorCitTdW1tYXJ5OgorcmVuIE1ha2VfYmMzLm1hayBNYWtlZmlsZTsgbWFrZSAgICAgIDE2IGJpdCwgQm9ybGFuZCBDKysgYW5kIFR1cmJvIEMrKworcmVuIE1ha2VfdGNjLm1hayBNYWtlZmlsZTsgbWFrZQkgICAgIDE2IGJpdCwgVHVyYm8gQworbWFrZSAtZiBNYWtlX2RqZy5tYWsJCSAgICAgMzIgYml0LCBESkdQUCAyLjAKK21ha2UgLWYgTWFrZV9iYzUubWFrCQkgICAgIDMyIGJpdCwgQm9ybGFuZCBDKysgNS4wIChlZGl0IGl0IHRvCisJCQkJCSAgICAgZGVmaW5lIERPUykKKworV2FybmluZzogQmUgc3VyZSB0byB1c2UgdGhlIHJpZ2h0IG1ha2UuZXhlLiAgTWljcm9zb2Z0IEMgbWFrZSBkb2Vzbid0IHdvcms7CitCb3JsYW5kIG1ha2Ugb25seSB3b3JrcyB3aXRoIE1ha2VfYmMzLm1haywgTWFrZV9iYzUubWFrIGFuZCBNYWtlX3RjYy5tYWs7CitESkdQUC9HTlUgbWFrZSBtdXN0IGJlIHVzZWQgZm9yIE1ha2VfZGpnLm1hay4KKworVGhlIEJvcmxhbmQgQysrIGNvbXBpbGVyIGhhcyBiZWVuIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIE1TLURPUyBleGVjdXRhYmxlOyBpdAorc2hvdWxkIHdvcmsgd2l0aG91dCBwcm9ibGVtcy4gWW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byBjaGFuZ2UgdGhlIHBhdGhzIGZvcgorTElCUEFUSCBhbmQgSU5DTFVERVBBVEggaW4gdGhlIHN0YXJ0IG9mIHRoZSBNYWtlZmlsZS4gIFlvdSB3aWxsIGdldCB0d28KK3dhcm5pbmdzIHdoaWNoIGNhbiBiZSBpZ25vcmVkIChvbmUgYWJvdXQgX2NobW9kIGFuZCBvbmUgYWJvdXQgcHJlY29tcGlsZWQKK2hlYWRlciBmaWxlcykuCisKK1RoZSAic3Bhd25vIiBsaWJyYXJ5IGJ5IFJhbGYgQnJvd24gd2FzIHVzZWQgaW4gb3JkZXIgdG8gZnJlZSBtZW1vcnkgd2hlbiBWaW0KK3N0YXJ0cyBhIHNoZWxsIG9yIG90aGVyIGV4dGVybmFsIGNvbW1hbmQuICBPbmx5IGFib3V0IDIwMCBieXRlcyBhcmUgdGFrZW4gZnJvbQorY29udmVudGlvbmFsIG1lbW9yeS4gIFdoZW4gcmVjb21waWxpbmcgZ2V0IHRoZSBzcGF3bm8gbGlicmFyeSBmcm9tIFNpbXRlbCwKK2RpcmVjdG9yeSAibXNkb3MvYyIuICBJdCBpcyBjYWxsZWQgc29tZXRoaW5nIGxpa2UgInNwd25vNDEzLnppcCIuICBPciBmb2xsb3cKK3RoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIE1ha2VmaWxlIHRvIHJlbW92ZSB0aGUgbGlicmFyeS4KKworVGhlIFR1cmJvIEMgTWFrZWZpbGUgaGFzIG5vdCBiZWVuIHRlc3RlZCBtdWNoIGxhdGVseS4gSXQgaXMgaW5jbHVkZWQgZm9yIHRob3NlCit0aGF0IGRvbid0IGhhdmUgQysrLiBZb3UgbWF5IG5lZWQgdG8gbWFrZSBhIGZldyBjaGFuZ2VzIHRvIGdldCBpdCB0byB3b3JrLgorCitESkdQUCBuZWVkcyB0byBiZSBpbnN0YWxsZWQgcHJvcGVybHkgdG8gY29tcGlsZSBWaW07IHlvdSBuZWVkIGEgbG90IG9mIHRoaW5ncworYmVmb3JlIGl0IHdvcmtzLiBXaGVuIHlvdXIgc2V0dXAgaXMgT0ssIFZpbSBzaG91bGQgY29tcGlsZSB3aXRoIGp1c3Qgb25lCit3YXJuaW5nIChhYm91dCBhbiBhcmd1bWVudCB0byBzaWduYWwoKSkuCisKK01ha2VfYmM1Lm1hayBpcyBmb3IgdGhvc2UgdGhhdCBoYXZlIEJvcmxhbmQgQysrIDUuMCBvciBsYXRlci4gIEF0IHRoZSB0b3Agb2YKK3RoZSBmaWxlLCB0aGVyZSBhcmUgc29tZSB2YXJpYWJsZXMgeW91IGNhbiBjaGFuZ2UgdG8gbWFrZSBlaXRoZXIgYSAzMi1iaXQKK1dpbmRvd3MgZXhlIChHVUkgb3IgY29uc29sZSBtb2RlKSwgb3IgYSAxNi1iaXQgTVMtRE9TIHZlcnNpb24uCisKK0lmIHlvdSBnZXQgYWxsIGtpbmRzIG9mIHN0cmFuZ2UgZXJyb3IgbWVzc2FnZXMgd2hlbiBjb21waWxpbmcsIHRyeSBhZGRpbmcgPENSPgorY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZS4KKworCisyLiBXaW4zMiAoV2luZG93cyBOVCBhbmQgV2luZG93cyA5NSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdW1tYXJ5OgordmN2YXJzMzIJCQkJICBTZXR1cCBwYXRocyBmb3Igbm1ha2UgYW5kIE1TVkMKKworbm1ha2UgLWYgTWFrZV9tdmMubWFrCQljb25zb2xlICAgV2luMzIgU0RLIG9yIE1pY3Jvc29mdCBWaXN1YWwgQysrCitubWFrZSAtZiBNYWtlX212Yy5tYWsgR1VJPXllcwlHVUkJICBNaWNyb3NvZnQgVmlzdWFsIEMrKworbm1ha2UgLWYgTWFrZV9tdmMubWFrIE9MRT15ZXMJT0xFCSAgTWljcm9zb2Z0IFZpc3VhbCBDKysKK25tYWtlIC1mIE1ha2VfbXZjLm1hayBQRVJMPUM6XFBlcmwgUFlUSE9OPUM6XFB5dGhvbiBldGMuCisJCQkJUGVybCwgUHl0aG9uLCBldGMuCisJCQkJCSAgTWljcm9zb2Z0IFZpc3VhbCBDKysKKworbWFrZSAgLWYgTWFrZV9iYzUubWFrCQlHVUkJICBCb3JsYW5kIEMrKyA1LngKK21ha2UgIC1mIE1ha2VfYmM1Lm1hawkJY29uc29sZQkgIEJvcmxhbmQgQysrIDUueCAoY2hhbmdlIHRoZSBmaWxlKQorbm1ha2UgLWYgTWFrZV9pdmMubWFrIENGRz0iVmltIC0gV2luMzIgUmVsZWFzZSBndmltIgorCQkJCUdVSQkgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQueCBvciBsYXRlcgorbm1ha2UgLWYgTWFrZV9pdmMubWFrIENGRz0iVmltIC0gV2luMzIgUmVsZWFzZSBndmltIE9MRSIKKwkJCQlPTEUJICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0Lnggb3IgbGF0ZXIKKworbWFrZSAgLWYgTWFrZV9jeWcubWFrCQl2YXJpb3VzICAgQ3lnbnVzIGdjYworbWFrZSAgLWYgTWFrZV9taW5ndy5tYWsJCXZhcmlvdXMgICBNaW5nVyB3aXRoIGdjYworCitTZWUgdGhlIHNwZWNpZmljIGZpbGVzIGZvciBjb21tZW50cyBhbmQgb3B0aW9ucy4KKworVGhlc2UgZmlsZXMgaGF2ZSBiZWVuIHN1cHBsaWVkIGJ5IEdlb3JnZSBWLiBSZWlsbHksIEJlbiBTaW5nZXIsIEtlbiBTY290dCBhbmQKK1JvbiBBYXJvbjsgdGhleSBoYXZlIGJlZW4gdGVzdGVkLiAgVGhlIEN5Z251cyBvbmUgbWFueSBub3QgZnVsbHkgd29yayB5ZXQuCitXaXRoIEN5Z251cyBnY2MgeW91IGNhbiB1c2UgdGhlIFVuaXggTWFrZWZpbGUgaW5zdGVhZCAoeW91IG5lZWQgdG8gZ2V0IHRoZQorVW5peCBhcmNoaXZlIHRoZW4pLiAgVGhlbiB5b3UgZ2V0IGEgQ3lnd2luIGFwcGxpY2F0aW9uIChmZWVscyBsaWtlIFZpbSBpcworcnVubmluIG9uIFVuaXgpLCB3aGlsZSB3aXRoIE1ha2VfY3lnLm1hayB5b3UgZ2V0IGEgV2luZG93cyBhcHBsaWNhdGlvbiAobGlrZQord2l0aCB0aGUgb3RoZXIgbWFrZWZpbGVzKS4KKworWW91IGNhbiBhbHNvIHVzZSB0aGUgVmlzdWFsIEMrKyBJREU6IHVzZSBGaWxlL09wZW4gd29ya3NwYWNlLCBzZWxlY3QgdGhlCitNYWtlX2l2Yy5tYWsgZmlsZSwgdGhlbiBzZWxlY3QgQnVpbGQvQnVpbGQgYWxsLiAgVGhpcyBidWlsZHMgdGhlIEdVSSB2ZXJzaW9uCitieSBkZWZhdWx0LgorCitWaW0gZm9yIFdpbjMyIGNvbXBpbGVzIHdpdGggdGhlIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIuMCBjb21waWxlciBhbmQgbGF0ZXIsCithbmQgd2l0aCB0aGUgQm9ybGFuZCBDKysgNC41IDMyLWJpdCBjb21waWxlciBhbmQgbGF0ZXIuICBJdCBjb21waWxlcyBvbgorV2luZG93cyA5NSBhbmQgYWxsIGZvdXIgTlQgcGxhdGZvcm1zOiBpMzg2LCBBbHBoYSwgTUlQUywgYW5kIFBvd2VyUEMuICBUaGUKK05UL2kzODYgYW5kIHRoZSBXaW5kb3dzIDk1IGJpbmFyaWVzIGFyZSBpZGVudGljYWwuICBVc2UgTWFrZV9tdmMubWFrIHRvCitjb21waWxlIHdpdGggVmlzdWFsIEMrKyBhbmQgTWFrZV9iYzUubWFrIHRvIGNvbXBpbGUgd2l0aCBCb3JsYW5kIEMrKy4KKworTWFrZV9tdmMubWFrIGFsbG93cyBhIFZpbSB0byBiZSBidWlsdCB3aXRoIHZhcmlvdXMgZGlmZmVyZW50IGZlYXR1cmVzIGFuZAorZGVidWcgc3VwcG9ydC4gIERlYnVnZ2luZyB3aXRoIE1TIERldnN0dWRpbyBpcyBwcm92aWRlZCBieSBNYWtlX2R2Yy5tYWsuCitGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdXNlIG9mIE1ha2VfZHZjLm1haywgbG9vayBpbiBNYWtlX212Yy5tYWsuCisKK0ZvciBjb21waWxpbmcgR3ZpbSB3aXRoIElNRSBzdXBwb3J0IG9uIGZhci1lYXN0IFdpbmRvd3MsIHVuY29tbWVudCB0aGUKK01VTFRJX0JZVEVfSU1FIGRlZmluZSBpbiB0aGUgc3JjL2ZlYXR1cmUuaCBmaWxlIGJlZm9yZSBjb21waWxpbmcuCisKK1RoZSBXaW4zMiBjb25zb2xlIGJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCBWaXN1YWwgQysrIHZlcnNpb24gNS4wLCB1c2luZworTWFrZV9tdmMubWFrIGFuZCBNYWtlX2JjNS5tYWsgKEJvcmxhbmQgQykuICBPdGhlciBjb21waWxlcnMgc2hvdWxkIGFsc28gd29yay4KK0lmIHlvdSBnZXQgYWxsIGtpbmRzIG9mIHN0cmFuZ2UgZXJyb3IgbWVzc2FnZXMgd2hlbiBjb21waWxpbmcgKHlvdSBzaG91bGRuJ3QKK3dpdGggdGhlIE1pY3Jvc29mdCBvciBCb3JsYW5kIDMyLWJpdCBjb21waWxlcnMpLCB0cnkgYWRkaW5nIDxDUj4gY2hhcmFjdGVycworYXQgdGhlIGVuZCBvZiBlYWNoIGxpbmUuCisKK1lvdSBwcm9iYWJseSBuZWVkIHRvIHJ1biAidmN2YXJzMzIiIGJlZm9yZSB1c2luZyAibm1ha2UiLgorCitGb3IgbWFraW5nIHRoZSBXaW4zMnMgdmVyc2lvbiwgeW91IG5lZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgNC4xIE9SIEVBUkxJRVIuCitJbiB2ZXJzaW9uIDQuMiBzdXBwb3J0IGZvciBXaW4zMnMgd2FzIGRyb3BwZWQhICBVc2UgdGhpcyBjb21tYW5kOgorCW5tYWtlIC1mIE1ha2VfbXZjLm1hayBHVUk9eWVzCisKK1NlZSB0aGUgcmVzcGVjdGl2ZSBNYWtlZmlsZXMgZm9yIG1vcmUgY29tbWVudHMuCisKKworMy4gV2luZG93cyBOVCB3aXRoIE9wZW5OVAorPT09PT09PT09PT09PT09PT09PT09PT09PQorCisoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBBLiBCZW56aW5nZXIpCisKK0J1aWxkaW5nIFZpbSBvbiBPcGVuTlQgMi4wIG9uIFdpbmRvd3MgTlQgNC4wLCB3aXRoIFNvZnR3YXkncyBwcmVyZWxlYXNlIGdjYzoKKzEuIGV4cG9ydCBDT05GSUdfU0hFTEw9Ly9EL09wZW5OVC9iaW4vc2gKKzIuIE1ha2UgdGhlIGZvbGxvd2luZyBleHBvcnRzIGZvciBtb2RpZnlpbmcgY29uZmlnLm1rOgorCWV4cG9ydCBDRkxBR1M9LU8gLVdzaGFkb3cKKwlleHBvcnQgWF9QUkVfTElCUz0tbFhtdQorMi4gUnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCWNvbmZpZ3VyZSAtLXByZWZpeD0vdmltIC0tYmluZGlyPS9iaW4vb3Blbm50IC0tZW5hYmxlLWd1aT1Nb3RpZgorICAgSWYgeW91IGRvbid0IGhhdmUgT3Blbk5UaWYgKE1vdGlmIHN1cHBvcnQpLCB1c2UgdGhpczoKKwljb25maWd1cmUgLS1wcmVmaXg9L3ZpbSAtLWJpbmRpcj0vYmluL29wZW5udCAtLWVuYWJsZS1ndWk9QXRoZW5hCiszLiBFZGl0IE1ha2VmaWxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzaW5jZSB0aGUgTWFrZWZpbGUgaW5jbHVkZSBzeW50YXgKKyAgIGRpZmZlcnMgZnJvbSB0aGF0IG9mIGdtYWtlOgorCSNpbmNsdWRlIGNvbmZpZy5taworCS5pbmNsdWRlICJjb25maWcubWsiCis0LiBDaGFuZ2UgYWxsIGluc3RhbGwgbGlua3MgdG8gYmUgImxuIC1mIiBhbmQgbm90ICJsbiAtcyIuCis1LiBDaGFuZ2UgdG8gdGhlICdjdGFncycgZGlyZWN0b3J5IGFuZCBjb25maWd1cmUuCis2LiBFZGl0IHRoZSBNYWtlZmlsZSBhbmQgcmVtb3ZlIHNwdXJpb3VzIHNwYWNlcyBmcm9tIGxpbmVzIDk5IGFuZCAxMTQuCis3LiBDaGFuZ2Ugc2xpbmsgdG8gImxuIC1mIiBmcm9tICJsbiAtcyIuCis4LiBSZXR1cm4gdG8gdGhlIHNyYyBkaXJlY3RvcnkuCis5LiBtYWtlCisKKworNC4gV2luZG93cyAzLjF4Cis9PT09PT09PT09PT09PT0KKworbWFrZSAtZiBNYWtlX3cxNi5tYWsJCSAgICAgMTYgYml0LCBCb3JsYW5kIEMrKyA1LjAKKworV2FybmluZzogQmUgc3VyZSB0byB1c2UgdGhlIHJpZ2h0IG1ha2UuZXhlLiAgSXQgc2hvdWxkIGJlIEJvcmxhbmQgbWFrZS4KKworWW91IHdpbGwgYWxtb3N0IGNlcnRhaW5seSBoYXZlIHRvIGNoYW5nZSB0aGUgcGF0aHMgZm9yIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMKK2luIHRoZSBNYWtlZmlsZS4gIExvb2sgZm9yICJEOlxCQzUiIGFuZCAiY3RsM2R2MiIuICBZb3Ugd2lsbCBnZXQgYSBudW1iZXIgb2YKK3dhcm5pbmdzIHdoaWNoIGNhbiBiZSBpZ25vcmVkICggX2NobW9kLCBwcmVjb21waWxlZCBoZWFkZXIgZmlsZXMsIGFuZAorInBvc3NpYmx5IGluY29ycmVjdCBhc3NpZ25tZW50IikuCisKK1RoZSBtYWtlZmlsZSBzaG91bGQgYWxzbyB3b3JrIGZvciBCQysrIDQuMCBhbmQgNC41LCBidXQgbWF5IG5lZWQgdHdlYWtpbmcgdG8KK3JlbW92ZSB1bnN1cHBvcnRlZCBjb21waWxlciAmIGxpa2VyIG9wdGlvbnMuCisKKworNS4gTWluZ3cKKz09PT09PT09CisKKyh3cml0dGVuIGJ5IFJvbiBBYXJvbjogPHJvbmFoYXJvbkB5YWhvby5jb20+KQorCitUaGlzIGlzIGFib3V0IGhvdyB0byBwcm9kdWNlIGEgV2luMzIgYmluYXJ5IG9mIGd2aW0gd2l0aCBNaW5ndy4KKworRmlyc3QsIHlvdSBuZWVkIHRvIGdldCB0aGUgJ21pbmd3MzInIGNvbXBpbGVyLCB3aGljaCBpcyBmcmVlIGZvciB0aGUgZG93bmxvYWQKK2F0OgorCisJaHR0cDovL3d3dy5taW5ndy5vcmcvCisKK09uY2UgeW91IGhhdmUgZG93bmxvYWRlZCB0aGUgY29tcGlsZXIgYmluYXJpZXMsIHVucGFjayB0aGVtIG9uIHlvdXIgaGFyZCBkaXNrCitzb21ld2hlcmUsIGFuZCBwdXQgdGhlbSBvbiB5b3VyIFBBVEguICBJZiB5b3UgYXJlIG9uIFdpbjk1Lzk4IHlvdSBjYW4gZWRpdAoreW91ciBBVVRPRVhFQy5CQVQgZmlsZSB3aXRoIGEgbGluZSBsaWtlOgorCisJc2V0IFBBVEg9QzpcR0NDLTIuOTUuMlxCSU47JVBBVEglCisKK29yIG9uIE5ULzIwMDAsIGdvIHRvIHRoZSBDb250cm9sIFBhbmVsLCBTeXN0ZW0sIGFuZCBlZGl0IHRoZSBlbnZpcm9ubWVudCBmcm9tCit0aGVyZS4KKworVGVzdCBpZiBnY2MgaXMgb24geW91ciBwYXRoLiAgRnJvbSBhIENNRCAob3IgQ09NTUFORCBvbiAnOTUvOTgpOgorCisJQzpcPiBnY2MgLS12ZXJzaW9uCisJMi45NS4yCisKKwlDOlw+IG1ha2UgLS12ZXJzaW9uCisJR05VIE1ha2UgdmVyc2lvbiAzLjc3ICguLi5ldGMuLi4pCisKK05vdyB5b3UgYXJlIHJlYWR5IHRvIHJvY2sgJ24nIHJvbGwuICBVbnBhY2sgdGhlIHZpbSBzb3VyY2VzIChsb29rIG9uCit3d3cudmltLm9yZyBmb3IgZXhhY3RseSB3aGljaCB2ZXJzaW9uIG9mIHRoZSB2aW0gZmlsZXMgeW91IG5lZWQpLgorCitDaGFuZ2UgZGlyZWN0b3J5IHRvICd2aW1cc3JjJzoKKworCUM6XD4gY2QgdmltXHNyYworCUM6XFZJTVxTUkM+CisKK2FuZCB5b3UgdHlwZToKKworCW1ha2UgLWYgTWFrZV9taW5nLm1hayBndmltLmV4ZQorCitBZnRlciBjaHVybmluZyBmb3IgYSB3aGlsZSwgeW91IHdpbGwgZW5kIHVwIHdpdGggJ2d2aW0uZXhlJyBpbiB0aGUgJ3ZpbVxzcmMnCitkaXJlY3RvcnkuCisKK1lvdSBzaG91bGQgbm90IG5lZWQgdG8gZG8gKmFueSogZWRpdGluZyBvZiBhbnkgZmlsZXMgdG8gZ2V0IHZpbSBjb21waWxlZCB0aGlzCit3YXkuICBJZiwgZm9yIHNvbWUgcmVhc29uLCB5b3Ugd2FudCB0aGUgY29uc29sZS1tb2RlLW9ubHkgdmVyc2lvbiBvZiB2aW0gKHRoaXMKK2lzIE5PVCByZWNvbW1lbmRlZCBvbiBXaW4zMiwgZXNwZWNpYWxseSBvbiAnOTUvJzk4ISEhKSwgeW91IG5lZWQgb25seSBjaGFuZ2UKK3RoZSAnZ3ZpbS5leGUnIHRvICd2aW0uZXhlJyBpbiB0aGUgJ21ha2UnIGNvbW1hbmRzIGdpdmVuIGFib3ZlLgorCitJZiB5b3UgYXJlIGRpc21heWVkIGJ5IGhvdyBiaWcgdGhlIEVYRSBpcywgSSBzdHJvbmdseSByZWNvbW1lbmQgeW91IGdldCAnVVBYJworKGFsc28gZnJlZSEpIGFuZCBjb21wcmVzcyB0aGUgZmlsZSAodHlwaWNhbCBjb21wcmVzc2lvbiBpcyA1MCUpLiBVUFggY2FuIGJlCitmb3VuZCBhdAorCWh0dHA6Ly91cHgudHN4Lm9yZy8KKworCitBRERJVElPTjogTkxTIHN1cHBvcnQgd2l0aCBNaW5ndworCisoYnkgRWR1YXJkbyBGLiBBbWF0cmlhIDxlZmVybmExQHBsYXRlYS5wbnRpYy5tZWMuZXM+KQorCitJZiB5b3Ugd2FudCBOYXRpb25hbCBMYW5ndWFnZSBTdXBwb3J0LCByZWFkIHRoZSBmaWxlIHNyYy9wby9SRUFETUVfbWluZ3cudHh0LgorWW91IG5lZWQgdG8gdW5jb21tZW50IGxpbmVzIGluIE1ha2VfbWluZy5tYWsgdG8gaGF2ZSBOTFMgZGVmaW5lZC4KKworCis2LiBDcm9zcyBjb21waWxpbmcgZm9yIFdpbjMyIGZyb20gYSBMaW51eCBtYWNoaW5lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyh3cml0dGVuIGJ5IFJvbiBBYXJvbjogPHJvbmFoYXJvbkB5YWhvby5jb20+IHdpdGggaGVscCBmcm9tCitNYXJ0aW4gS2FobGVydCA8bWFydGluLmthaGxlcnRAaW5maW5lb24uY29tPikKKworSWYgeW91IGxpa2UsIHlvdSBjYW4gY29tcGlsZSB0aGUgJ21pbmd3JyBXaW4zMiB2ZXJzaW9uIGZyb20gdGhlIGNvbWZvcnQgb2YKK3lvdXIgTGludXggKG9yIG90aGVyIHVuaXgpIGJveC4gIFRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIGZvbGxvdyBhIGZldyBzdGVwczoKKworCTEpIEluc3RhbGwgdGhlIG1pbmd3MzIgY3Jvc3MtY29tcGlsZXIgKGlmIHlvdSBoYXZlIGl0LCBnbyB0byBzdGVwIDIpCisJCTFhKSBmcm9tICdmdHA6Ly9mdHAubmFub3RlY2gud2lzYy5lZHUvcHViL2toYW4vZ251LXdpbjMyL21pbmd3MzIvc25hcHNob3RzL2djYy0yLjk1LjItMScsCisJCQlnZXQ6CisJCQkJYmludXRpbHMtMTk5OTA4MTgtMS1zcmMudGFyLmd6CisJCQkJbWluZ3ctbXN2Y3J0LTIwMDAwMjAzLnppcAorCQkJCWdjYy0yLjk1LjItMS14ODYtd2luMzIuZGlmZi5negorCQkxYikgZnJvbSAnaHR0cDovL2djYy5nbnUub3JnLycgZ2V0OgorCQkJCWdjYy0yLjk1LjIudGFyLmd6CisJCTFjKSBjcmVhdGUgYSBwbGFjZSB0byBwdXQgdGhlIGNvbXBpbGVyIHNvdXJjZSBhbmQgYmluYXJpZXM6CisJCQkoYXNzdW1pbmcgeW91IGFyZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkpCisJCQlta2RpciBnY2MtYmluCisJCQlta2RpciBnY2Mtc3JjCisJCTFkKSB1bnBhY2sgdGhlIHNvdXJjZXM6CisJCQljZCBnY2Mtc3JjCisJCQl0YXIgeHpmIC4uL2JpbnV0aWxzLTE5OTkwODE4LTEtc3JjLnRhci5negorCQkJdGFyIHh6ZiAuLi9nY2MtMi45NS4yLnRhci5negorCQkJdW56aXAgLi4vbWluZ3ctbXN2Y3J0LTIwMDAwMjAzCisJCTFlKSBidWlsZCB0aGUgZGlmZmVyZW50IHRvb2xzOgorCQkJZXhwb3J0IFBSRUZJWD1+L2djYy1iaW4vCisJCQljZCBnY2MtMi45NS4yCisJCQl6Y2F0IC4uL2djYy0yLjk1LjItMS14ODYtd2luMzIuZGlmZi5neiB8IHBhdGNoIC1wMSAtRQorCQkJY2QgLi4vYmludXRpbHMtMTk5OTA4MTgKKwkJCS4vY29uZmlndXJlIC0tdGFyZ2V0PWk1ODYtcGMtbWluZ3czMm1zdmMgLS1wcmVmaXg9JFBSRUZJWAorCQkJbWFrZQorCQkJbWFrZSBpbnN0YWxsCisJCQljZCAuLi9nY2MtMi45NS4yCisJCQkuL2NvbmZpZ3VyZSAtLXRhcmdldD1pNTg2LXBjLW1pbmd3MzJtc3ZjIFwKKwkJCQktLXdpdGgtbGlicz1+L2djYy1iaW4vaTM4Ni1taW5ndzMybXN2Yy9saWIgXAorCQkJCS0td2l0aC1oZWFkZXJzPX4vZ2NjLWJpbi9pMzg2LW1pbmd3MzJtc3ZjL2luY2x1ZGUgXAorCQkJCS0tZW5hYmxlLWxhbmd1YWdlcz1jKysgXAorCQkJCS0tcHJlZml4PSRQUkVGSVgKKwkJCW1ha2UKKwkJCW1ha2UgaW5zdGFsbAorCQkxZikgQWRkICRQUkVGSVgvYmluIHRvIHlvdXIgJFBBVEguCisKKwkyKSBnZXQgdGhlICp1bml4KiB2ZXJzaW9uIG9mIHRoZSB2aW0gc291cmNlcworCTMpIGluICdNYWtlX21pbmcubWFrJywgc2V0ICdDUk9TUycgdG8gJzEnIGluc3RlYWQgb2YgJzAnLgorCTQpIG1ha2UgLWYgTWFrZV9taW5nLm1hayBndmltLmV4ZQorCitOb3cgeW91IGhhdmUgY3JlYXRlZCB0aGUgV2luZG93cyBiaW5hcnkgZnJvbSB5b3VyIExpbnV4IGJveCEgIEhhdmUgZnVuLi4uCisKKzcuIEJ1aWxkaW5nIHdpdGggUHl0aG9uIHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKHdyaXR0ZW4gYnkgUm9uIEFhcm9uOiA8cm9uYWhhcm9uQHlhaG9vLmNvbT4pCisKK1RoaXMgaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3MzIgY29tcGlsZXIsIGFuZCB0aGUgQWN0aXZlU3RhdGUKK0FjdGl2ZVB5dGhvbjoKKyAgICBodHRwOi8vd3d3LkFjdGl2ZVN0YXRlLmNvbS9Qcm9kdWN0cy9BY3RpdmVQeXRob24vCisKK0FmdGVyIGluc3RhbGxpbmcgdGhlIEFjdGl2ZVB5dGhvbiwgeW91IHdpbGwgaGF2ZSB0byBjcmVhdGUgYSAnbWluZ3czMicKKydsaWJweXRob24yMC5hJyB0byBsaW5rIHdpdGg6CisgICBjZCAkUFlUSE9OL2xpYnMKKyAgIHBleHBvcnRzIHB5dGhvbjIwLmRsbCA+IHB5dGhvbjIwLmRlZgorICAgZGxsdG9vbCAtZCBweXRob24yMC5kZWYgLWwgbGlicHl0aG9uMjAuYQorCitPbmNlIHRoYXQgaXMgZG9uZSwgZWRpdCB0aGUgJ01ha2VfbWluZy5tYWsnIHNvIHRoZSBQWVRIT04gdmFyaWFibGUgcG9pbnRzIHRvCit0aGUgcm9vdCBvZiB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiAoQzpcUHl0aG9uMjAsIGZvciBleGFtcGxlKS4gIElmIHlvdSBhcmUKK2Nyb3NzLWNvbXBpbGluZyBvbiBMaW51eCB3aXRoIHRoZSBtaW5ndzMyIHNldHVwLCB5b3UgbmVlZCB0byBhbHNvIGNvbnZlcnQgYWxsCit0aGUgJ0luY2x1ZGUnIGZpbGVzIHRvICp1bml4KiBsaW5lLWVuZGluZ3MuICBUaGlzIGJhc2ggY29tbWFuZCB3aWxsIGRvIGl0CitlYXNpbHk6CisgICBmb3IgZmlsIGluICouaCA7IGRvIHZpbSAtZSAtYyAnc2V0IGZmPXVuaXh8d3xxJyAkZmlsCisKK05vdyBqdXN0IGRvOgorICAgbWFrZSAtZiBNYWtlX21pbmcubWFrIGd2aW0uZXhlCisKK2FuZCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIFB5dGhvbi1lbmFibGVkLCBXaW4zMiB2ZXJzaW9uLiAgRW5qb3khCmRpZmYgLS1naXQgYS9zcmMvSU5TVEFMTHZtcy50eHQgYi9zcmMvSU5TVEFMTHZtcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkZjZhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9JTlNUQUxMdm1zLnR4dApAQCAtMCwwICsxLDM3NSBAQAorSU5TVEFMTHZtcy50eHQgLSBJbnN0YWxsYXRpb24gb2YgVmltIG9uIE9wZW5WTVMKKworTWFpbnRhaW5lcjogICBab2x0YW4gQXJwYWRmZnkgPGFycGFkZmZ5QHBvbGFyZm94LmNvbT4KK0xhc3QgY2hhbmdlOiAgMjAwMyBNYXkgMDQKKworVGhpcyBmaWxlIGNvbnRhaW5zIGluc3RydWN0aW9ucyBmb3IgY29tcGlsaW5nIFZpbSBvbiBPcGVudm1zLgorSWYgeW91IGFscmVhZHkgaGF2ZSBhbiBleGVjdXRhYmxlIHZlcnNpb24gb2YgVmltLCB5b3UgZG9uJ3QgbmVlZCB0aGlzLgorCitJZiB5b3Ugc2tpcCBzZXR0aW5ncyBkZXNjcmliZWQgaGVyZSwgdGhlbiB5b3Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQgVmltCitiZWhhdmlvciBhcyBpdCBpcyBkb2N1bWVudGVkLCB3aGljaCBzaG91bGQgYmUgZmluZSBmb3IgbW9zdCB1c2Vycy4KKworVGhlIGZpbGUgImZlYXR1cmUuaCIgY2FuIGJlIGVkaXRlZCB0byBtYXRjaCB5b3VyIHByZWZlcmVuY2VzLCBidXQgdGhpcyBmaWxlcworZG9lcyBub3QgZGVzY3JpYmUgcG9zc2liaWxpdGllcyBoaWRkZW4gaW4gZmVhdHVyZS5oIGFjcm9iYXRpY3MsIGhvd2V2ZXIKK3BhcmFtZXRlcnMgZnJvbSBNQUtFX1ZNUy5NTVMgYWN0aXZlbHkgdXNlcyBhbmQgc2V0cyB1cCBwYXJhbWV0ZXJzIGluIHJlbGF0aW9uCit3aXRoIGZlYXR1cmUuaAorCitNb3JlIGluZm9ybWF0aW9uIGFuZCBjYXNlIGFuYWx5c2lzIHlvdSBjYW4gZm91bmQgaW4gb3Nfdm1zLnR4dAorKFtydW50aW1lLmRvY11vc192bXMudHh0IG9yIDpoZWxwIHZtcyBmcm9tIHZpbSBwcm9tcHQpCisKK0NvbnRlbnRzOgorMS4gRG93bmxvYWQgZmlsZXMKKzIuIENvbmZpZ3VyYXRpb24KKzMuIENvbXBpbGF0aW9uIERFQ0MKKzQuIENvbXBpbGF0aW9uIFZBWEMKKzUuIENUQUdTLCBYWEQKKzYuIERlcGxveW1lbnQKKzcuIEdUSyBhbmQgb3RoZXIgZmVhdHVyZXMKKzguIE5vdGVzCis5LiBBdXRob3JzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuIERvd25sb2FkIGZpbGVzCisKKzEuMS4gVmlzaXQgdGhlIFZpbSBmdHAgc2l0ZSAoc2VlIGZ0cDovL2Z0cC52aW0ub3JnL3B1Yi92aW0vTUlSUk9SUykKKyAgICAgYW5kIG9idGFpbiB0aGUgZm9sbG93aW5nIHRocmVlIGZpbGVzOgorCisgICAgIHVuaXgvdmltLVguWC1zcmMudGFyLmd6CisgICAgIHVuaXgvdmltLVguWC1ydC50YXIuZ3oKKyAgICAgZXh0cmEvdmltLVguWC1leHRyYS50YXIuZ3oKKworICAgICB3aGVyZSBYLlggaXMgdGhlIHZlcnNpb24gbnVtYmVyLgorCisxLjIuIEV4cGFuZCB0aGUgdGhyZWUgYXJjaGl2ZXMuCisKKzEuMy4gQXBwbHkgcGF0Y2hlcyBpZiB0aGV5IGV4aXN0LiAgKFBhdGNoIGZpbGVzIGFyZSBmb3VuZCBpbiB0aGUgZnRwCisgICAgIHNpdGUgaW4gdGhlICJwYXRjaGVzIiBkaXJlY3RvcnkuKQorCisxLjQuIFlvdSB3aWxsIG5lZWQgZWl0aGVyIHRoZSBERUNTRVQgbW1zIHV0aWxpdHkgb3IgdGhlIGZyZWVseSBhdmFpbGFibGUgY2xvbmUKKyAgICAgb2YgaXQgY2FsbGVkIG1tayAoVk1TIGhhcyBubyBtYWtlIHV0aWxpdHkgaW4gdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbikuCisgICAgIFlvdSBjYW4gZG93bmxvYWQgbW1rIGZyb20gaHR0cDovL3d3dy5vcGVudm1zLmRpZ2l0YWwuY29tL2ZyZWV3YXJlL01NSy8KKworMS41LiBJZiB5b3Ugd2FudCB0byBoYXZlIFBlcmwsIFB5dGhvbiBvciBUY2wgc3VwcG9ydCBpbiBWaW0geW91IHdpbGwgbmVlZCBWTVMKKyAgICAgZGlzdHJpYnV0aW9ucyBmb3IgdGhlbSBhcyB3ZWxsLgorCisxLjYgIElmIHlvdSB3YW50IHRvIGhhdmUgR1RLIGV4ZWN1dGFibGUsIHlvdSBuZWVkIHRvIGhhdmUgcHJvcGVybHkgaW5zdGFsbGVkCisgICAgIEdUSyBsaWJyYXJpZXMuCisKK05PVEU6IHByb2NlZHVyZSBpbiBjaGFwdGVyIDEgZGVzY3JpYmVzIHNvdXJjZSBjb2RlIHByZXBhcmF0aW9uIGZyb20gbXVsdGkgT1MKK2NvZGUsaG93ZXZlciBpdCBpcyBhdmFpbGFibGUgT3BlblZNUyBvcHJpbWl6ZWQgKGFuZCB0ZXN0ZWQpIHNvdXJjZSBjb2RlIGZyb206CitmdHA6Ly9mdHAucG9sYXJob21lLmNvbS9wdWIvdmltL3NvdXJjZS92bXMvCisKK0N1cnJlbnQgT3BlblZNUyBzb3VyY2UgY29kZSBhcyAuemlwIG9yIC50YXIuZ3ogZmlsZSBpcyBwb3NzaWJsZSB0byBkb3dubG9hZAorZnJvbSBDVlMgbWlycm9yIGZ0cDovL2Z0cC5wb2xhcmhvbWUuY29tL3B1Yi9jdnMvU09VUkNFLworCisKKzIuICAgQ29uZmlndXJhdGlvbgorCisyLjEuIEVkaXQgdmltLVguWC9zcmMvZmVhdHVyZS5oIGZvciB5b3VyIHByZWZlcmVuY2UuICAoWW91IGNhbiBza2lwCisgICAgIHRoaXMsIHRoZW4geW91IHdpbGwgZ2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFzIGlzIGRvY3VtZW50ZWQsCisgICAgIHdoaWNoIHNob3VsZCBiZSBmaW5lIGZvciBtb3N0IHBlb3BsZS4pCisKKyAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGFkZCB0aGUgTVVMVElfQllURSBmZWF0dXJlLCB0dXJuIG9uCisgICAgICNkZWZpbmUgTVVMVElfQllURQorCisyLjIgIEVkaXQgdmltLVguWC9zcmMvTWFrZV92bXMubW1zIHRvIGN1c3RvbWl6ZSB5b3VyIFZpbS4gT3B0aW9ucyBhcmU6CisKKwlQYXJhbWV0ZXIgbmFtZQk6IE1PREVMCisJRGVzY3JpcHRpb24JOiBCdWlsZCBtb2RlbCBzZWxlY3Rpb24KKwlPcHRpb25zOgk6IFRJTlkJICAtIEFsbW9zdCBubyBmZWF0dXJlcyBlbmFibGVkLCBub3QgZXZlbgorCQkJICBtdWx0aXBsZSB3aW5kb3dzCisJCQkgIFNNQUxMICAgLSBGZXcgZmVhdHVyZXMgZW5hYmxlZCwgYXMgYmFzaWMgYXMgcG9zc2libGUKKwkJCSAgTk9STUFMICAtIEEgZGVmYXVsdCBzZWxlY3Rpb24gb2YgZmVhdHVyZXMgZW5hYmxlZAorCQkJICBCSUcJICAtIE1hbnkgZmVhdHVyZXMgZW5hYmxlZCwgYXMgcmljaCBhcyBwb3NzaWJsZS4KKwkJCSAgKE9wZW5WTVMgZGVmYXVsdCkKKwkJCSAgSFVHRQkgIC0gQWxsIHBvc3NpYmxlIGZlYXR1ZXMgZW5hYmxlZC4KKwkJCSAgVW5jb21tZW50ZWQgLSB3aWxsIGRlZmF1bHQgdG8gQklHCisJRGVmYXVsdAkJOiBNT0RFTCA9IEJJRworCisJUGFyYW1ldGVyIG5hbWUJOiBHVUkKKwlEZXNjcmlwdGlvbgk6IEdVSSBvciB0ZXJtaW5hbCBtb2RlIGV4ZWN1dGFibGUKKwlPcHRpb25zOgk6IFlFUyAtIEdVSSBleGVjdXRhYmxlCisJCQkgIFVuY29tbWVudGVkIC0gY2hhciBvbmx5CisJRGVmYXVsdAkJOiBHVUkgPSBZRVMKKworCVBhcmFtZXRlciBuYW1lCTogR1RLCisJRGVzY3JpcHRpb24JOiBFbmFibGUgR1RLIGluIEdVSSBtb2RlLgorCQkJICBJdCBlbmFibGVzIGZlYXR1cmVzIGFzIHRvb2xiYXIgZXRjLgorCU9wdGlvbnM6CTogWUVTIC0gR1RLIGV4ZWN1dGFibGUKKwkJCSAgVW5jb21tZW50ZWQgLSB3aXRob3V0IEdUSworCURlZmF1bHQJCTogVW5jb21tZW50ZWQKKworCVBhcmFtZXRlciBuYW1lCTogREVDQworCURlc2NyaXB0aW9uCTogQ29tcGlsZXIgc2VsZWN0aW9uCisJT3B0aW9uczoJOiBZRVMgLSBERUNDIGNvbXBpbGVyCisJCQkgIFVuY29tbWVudGVkIC0gVkFYQyBjb21waWxlcgorCURlZmF1bHQJCTogREVDQyA9IFlFUworCisJUGFyYW1ldGVyIG5hbWUJOiBDQ1ZFUgorCURlc2NyaXB0aW9uCTogQ29tcGlsZXIgdmVyc2lvbiB3aXRoIDp2ZXIgY29tbWFuZAorCU9wdGlvbnM6CTogWUVTIC0gQ29tcGlsZXIgdmVyc2lvbiBpbmZvIHdpbGwgYmUgYWRkZWQKKwkJCSAgVW5jb21tZW50ZWQgLSB3aWxsIG5vdCBiZSBhZGRlZAorCURlZmF1bHQJCTogQ0NWRVIgPSBZRVMKKworCVBhcmFtZXRlciBuYW1lCTogREVCVUcKKwlEZXNjcmlwdGlvbgk6IEJ1aWxkaW5nIGEgZGVidWcgdmVyc2lvbgorCU9wdGlvbnM6CTogWUVTIC0gZGVidWcgdmVyc2lvbiB3aWxsIGJlIGJ1aWx0CisJCQkgIFVuY29tbWVudGVkIC0gYnVpbGRpbmcgbm9ybWFsIGV4ZWN1dGFibGUKKwlEZWZhdWx0CQk6IFVuY29tbWVudGVkCisKKwlQYXJhbWV0ZXIgbmFtZQk6IFZJTV9UQ0wKKwlEZXNjcmlwdGlvbgk6IEFkZCBUY2wgc3VwcG9ydAorCU9wdGlvbnM6CTogWUVTIC0gQnVpbGQgd2l0aCBzdXBwb3J0CisJCQkgIFVuY29tbWVudGVkIC0gYnVpbGQgd2l0aG91dCBzdXBwb3J0LgorCURlZmF1bHQJCTogVW5jb21tZW50ZWQKKworCVBhcmFtZXRlciBuYW1lCTogVklNX1BFUkwKKwlEZXNjcmlwdGlvbgk6IEFkZCBQZXJsIHN1cHBvcnQKKwlPcHRpb25zOgk6IFlFUyAtIEJ1aWxkIHdpdGggc3VwcG9ydAorCQkJICBVbmNvbW1lbnRlZCAtIGJ1aWxkIHdpdGhvdXQgc3VwcG9ydC4KKwlEZWZhdWx0CQk6IFVuY29tbWVudGVkCisKKwlQYXJhbWV0ZXIgbmFtZQk6IFZJTV9QWVRIT04KKwlEZXNjcmlwdGlvbgk6IEFkZCBQeXRob24gc3VwcG9ydAorCU9wdGlvbnM6CTogWUVTIC0gQnVpbGQgd2l0aCBzdXBwb3J0CisJCQkgIFVuY29tbWVudGVkIC0gYnVpbGQgd2l0aG91dCBzdXBwb3J0LgorCURlZmF1bHQJCTogVW5jb21tZW50ZWQKKworCisJUGFyYW1ldGVyIG5hbWUJOiBWSU1fWElNCisJRGVzY3JpcHRpb24JOiBYIElucHV0IE1ldGhvZC4gRm9yIGVudGVyaW5nIHNwZWNpYWwgbGFuZ3VhZ2VzCisJCQkgIGxpa2UgY2hpbmVzZSBhbmQgSmFwYW5lc2UuIFBsZWFzZSBkZWZpbmUganVzdAorCQkJICBvbmU6IFZJTV9YSU0gb3IgVklNX0hBTkdVTElOCisJT3B0aW9uczoJOiBZRVMgLSBCdWlsZCB3aXRoIHN1cHBvcnQKKwkJCSAgVW5jb21tZW50ZWQgLSBidWlsZCB3aXRob3V0IHN1cHBvcnQuCisJRGVmYXVsdAkJOiBVbmNvbW1lbnRlZAorCisJUGFyYW1ldGVyIG5hbWUJOiBWSU1fSEFOR1VMSU4KKwlEZXNjcmlwdGlvbgk6IEludGVybmFsIEhhbmd1bCBpbnB1dCBtZXRob2QuIEdVSSBvbmx5LgorCQkJICBQbGVhc2UgZGVmaW5lIGp1c3Qgb25lOiBWSU1fWElNIG9yIFZJTV9IQU5HVUxJTgorCU9wdGlvbnM6CTogWUVTIC0gQnVpbGQgd2l0aCBzdXBwb3J0CisJCQkgIFVuY29tbWVudGVkIC0gYnVpbGQgd2l0aG91dCBzdXBwb3J0LgorCURlZmF1bHQJCTogVW5jb21tZW50ZWQKKworCVBhcmFtZXRlciBuYW1lCTogVklNX1RBR19BTllXSElURQorCURlc2NyaXB0aW9uCTogQWxsb3cgYW55IHdoaXRlIHNwYWNlIHRvIHNlcGFyYXRlIHRoZSBmaWVsZHMgaW4gYQorCQkJICB0YWdzIGZpbGUKKwkJCSAgV2hlbiBub3QgZGVmaW5lZCwgb25seSBhIFRBQiBpcyBhbGxvd2VkLgorCU9wdGlvbnM6CTogWUVTIC0gQnVpbGQgd2l0aCBzdXBwb3J0CisJCQkgIFVuY29tbWVudGVkIC0gYnVpbGQgd2l0aG91dCBzdXBwb3J0LgorCURlZmF1bHQJCTogVW5jb21tZW50ZWQKKworICAgICBZb3UgY2FuIGVkaXQgdGhlICpfSU5DIGFuZCAqX0xJQiBxdWFsaWZpZXJzLCBidXQgaXQgaXMgcmVhbGx5CisgICAgIG5vdCByZWNvbW1lbmRlZCBmb3IgYmVnaW5uZXJzLgorCiszLiBDb21waWxhdGlvbiBERUNDCisKKzMuMS4gSWYgeW91IGhhdmUgTVNTIG9uIHlvdXIgc3lzdGVtLCB0aGUgY29tbWFuZAorCisJbW1zIC9kZXNjcmlwPU1ha2Vfdm1zLm1tcworCisgICAgIHdpbGwgc3RhcnQgYnVpbGRpbmcgeW91ciBvd24gY3VzdG9taXplZCB2ZXJzaW9uIG9mIFZpbS4KKyAgICAgVGhlIGFkZXF1YXRlIGNvbW1hbmQgZm9yIG1tayBpczoKKworCW1tayAvZGVzY3JpcD1NYWtlX3Ztcy5tbXMKKworICAgICBOT1RFOiBCZWNhdXNlIG9mIGVtcHR5IC9hdXRvL2NvbmZpZy5oIChuZWVkZWQgZm9yIFVuaXggY29uZmlndXJlKSBidWlsZAorICAgICB3aWxsIGZhaWwgd2l0aCB2ZXJ5IHN0cmFuZ2UgbWVzc2FnZXMuIFRoZXJlZm9yZSBiZWZvcmUgYnVpbGRpbmcsIGl0IGlzCisgICAgIHJlY29tbWVuZGVkIHRvIG1ha2Ugb25lIGNsZWFuIHVwLCB0byBwcmVwYXJlIGV2ZXJ5dGhpbmcgZm9yIE9wZW5WTVMKKyAgICAgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIGlzOgorCisJbW1zIC9kZXNjcmlwPU1ha2Vfdm1zLm1tcyBjbGVhbgorCis0LiBDb21waWxhdGlvbiBWQVhDCisKKzQuMS4gVkFYQyBjb21waWxlciBpcyBub3QgZnVsbHkgQU5TSSBDIGNvbXBhdGlibGUgaW4gcHJlLXByb2Nlc3NvciBkaXJlY3RpdmVzCisgICAgIHNlbWFudGljcywgdGhlcmVmb3JlIHlvdSBoYXZlIHRvIHVzZSBhIGNvbnZlcnRlciBwcm9ncmFtIHdoYXQgd2lsbCBkbyB0aGUKKyAgICAgbGlvbiBwYXJ0IG9mIHRoZSBqb2IuCisKKwlAb3Nfdm1zX2ZpeC5jb20gKi5jICouaCA8LnByb3RvPioucHJvCisKKyAgICAgbW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gb3Nfdm1zX2ZpeC5jb20gZmlsZSBpdHNlbGYuCisKKyAgICAgTk9URTogZXZlbiBpZiBvc192bXNfZml4LmNvbSB3aWxsIGZpeCBhbGwgcHJlLXByb2Nlc3NvciBkaXJlY3RpdmVzIGl0IHdpbGwKKyAgICAgbGVhdmUgc2luZ2UgKGxvbmcpIGxpbmUgZGlyZWN0aXZlcy4gWW91IGhhdmUgdG8gZml4IHRoZW0gbWFudWFsbHkuCisgICAgIEtub3duIHByb2JsZW1hdGljIGZpbGVzIGFyZSBvcHRpb24uaCBhbmQgb3B0aW9uLmMKKworNC4yLiBBZnRlciB0aGUgY29udmVyc2lvbiB5b3UgY2FuIGNvbnRpbnVlIGJ1aWxkaW5nIGFzIGl0IGhhcyBiZWVuIGRlc2NyaWJlZAorICAgICBhYm92ZS4KKworNS4gQ1RBR1MsIFhYRAorCis1LjEuIE1NU19WSU0uRVhFIGlzIGJ1aWxkaW5nIHRvZ2V0aGVyIHdpdGggVklNLkVYRSwgYnV0IGZvciBDVEFHUy5FWEUgYW5kCisgICAgIFhYRC5FWEUgeW91IHNob3VsZCBjaGFuZ2UgdG8gc3ViZGlyZWN0b3J5IDwuQ1RBR1M+IG9yIDwuWFhEPiBhbmQgYnVpbGQKKyAgICAgdGhlbSBzZXBhcmF0ZWx5LgorCis1LjIuIEluIHRoZXNlIGRpcmVjdG9yaWVzIHlvdSBjYW4gZm91bmQgb25lIG1ha2UgZmlsZSBmb3IgVk1TIGFzIHdlbGwuCisgICAgIFBsZWFzZSByZWFkIHRoZSBkZXRhaWxlZCBidWlsZCBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlbGF0ZWQgKi5NTVMgZmlsZS4KKworNi4gICBEZXBsb3ltZW50CisKKzYuMS4gQ29weSBvdmVyIGFsbCBleGVjdXRhYmxlcyB0byB0aGUgZGVwbG95bWVudCBkaXJlY3RvcnkuCisKKzYuMi4gVmltIHVzZXMgYSBzcGVjaWFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgZG9jdW1lbnQgYW5kIHJ1bnRpbWUKKyAgICAgZmlsZXM6CisKKyAgIHZpbSAob3Igd2hlcmV2ZXIpCisgICAgfC0tIGRvYworICAgIHwtLSBzeW50YXgKKyAgICB2aW1yYyAgICAoc3lzdGVtIHJjIGZpbGVzKQorICAgIGd2aW1yYworCis2LjMgRGVmaW5lIGxvZ2ljYWxzIFZJTQorCisJZGVmaW5lL25vbG9nIFZJTSBkZXZpY2U6W2xlYWRpbmctcGF0aC1oZXJlLnZpbV0KKworICAgICB0byBnZXQgdmltLmV4ZSB0byBmaW5kIGl0cyBkb2N1bWVudCwgZmlsZXR5cGUsIGFuZCBzeW50YXggZmlsZXMuCisKKyAgICAgTm93LCBpZiB5b3UgYXJlIGx1Y2t5IHlvdSBzaG91bGQgaGF2ZSBvbmUgb3duIGJ1aWx0LCBjdXN0b21pemVkIGFuZAorICAgICB3b3JraW5nIFZpbS4KKworNy4gICBHVEsgYW5kIG90aGVyIGZlYXR1cmVzCisKKzcuMSAgR2VuZXJhbCBub3RlcworCisgICAgIFRvIGJlIGFibGUgdG8gYnVpbGQgZXh0ZXJuYWwgR1VJIG9yIGxhbmd1YWdlIHN1cHBvcnQgd3lvIGhhdmUgdG8gZW5hYmxlCisgICAgIHJlbGF0ZWQgZmVhdHVyZSBpbiBNQUtFX1ZNUy5NTVMgZmlsZS4gVXN1YWxseSBpdCBuZWVkIHNvbWUgZXh0cmEgdHVuaW5nCisgICAgIGFyb3VuZCBpbmNsdWRlIGZpbGVzLCBzaGFyZWQgbGlicmFyaWVzIGV0Yy4KKworICAgICBQbGVhc2Ugbm90ZSwgdGhhdCBsZWFkaW5nICIsIiBhcmUgdmFsdWFibGUgZm9yIE1NUy9NTUsgc3ludGF4LgorCisgICAgIE1BS0VfVk1TLk1NUyB1c2VzIGRlZmluZXMgYXMgZGVzY3JpYmVkIGJlbG93OgorCis3LjEuMSAgIGZlYXR1cmVfREVGID0gLCJTT01FX0ZFQVRVUkUiCisKKyAgICAgU3VibWl0cyBkZWZpbml0aW9uIHRvIGNvbXBpbGVyIHByZXByb2Nlc3NvciB0byBlbmFibGUgY29kZSBibG9ja3MKKyAgICAgZGVmaW5lZCB3aXRoCisgICAgICNpZmRlZiBTT01FX0ZFQVRVUkUKKyAgICAge3NvbWUgY29kZSBoZXJlfQorICAgICAjZW5kaWYKKworICAgICBFeGFtcGxlOiAgVENMX0RFRiA9ICwiRkVBVF9UQ0wiCisKKworNy4xLjIgICBmZWF0dXJlX1NSQyA9IGNvZGUxLmMgY29kZTIuYworCisgICAgIERlZmluZXMgc291cmNlIGNvZGUgcmVsYXRlZCB3aXRoIHBhcnRpY3VsYXIgZmVhdHVyZS4KKyAgICAgRXhhbXBsZTogIFRDTF9TUkMgPSBpZl90Y2wuYworCis3LjEuMyAgIGZlYXR1cmVfT0JKID0gY29kZTEub2JqIGNvZGUyLm9iagorCisgICAgIExpc3RzIG9iamVjdHMgY3JlYXRlZCBmcm9tIHNvdXJjZSBjb2RlcyBsaXN0ZWQgaW4gZmVhdHVyZV9TUkMKKyAgICAgRXhhbXBsZTogUEVSTF9PQkogPSBpZl9wZXJsc2Zpby5vYmogaWZfcGVybC5vYmoKKworNy4xLjQgIGZlYXR1cmVfTElCID0gLE9TX1ZNU19UQ0wuT1BUL09QVAorCisgICAgIERlZmluZXMgdGhlIGxpYnJhcmllcyB0aGF0IGhhdmUgdG8gYmUgdXNlZCBmb3IgYnVpbGQuCisgICAgIElmIGl0IGlzIGFuIE9QVCBmaWxlIHRoZW4gTUFLRV9WTVMuTU1TIGNyZWF0ZXMgT1BUIGZpbGVzCisgICAgIGluIGdlbl9mZWF0dXJlIHByb2NlZHVyZS4KKworICAgICBFeGFtcGxlOgorICAgICBQRVJMX0xJQiA9ICxPU19WTVNfUEVSTC5PUFQvT1BUCisKKy5JRkRFRiBWSU1fUEVSTAorcGVybF9lbnYgOgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgImNyZWF0aW5nIE9TX1ZNU19QRVJMLk9QVCBmaWxlLiIKKwktQCBvcGVuL3dyaXRlIG9wdF9maWxlIE9TX1ZNU19QRVJMLk9QVAorCS1AIHdyaXRlIG9wdF9maWxlICJQRVJMU0hSIC9zaGFyZSIKKwktQCBjbG9zZSBvcHRfZmlsZQorLkVMU0UKK3BlcmxfZW52IDoKKwktQCAhCisuRU5ESUYKKworCis3LjEuNSAgZmVhdHVyZV9JTkMgPSAsZGthMDpbdGNsODAuZ2VuZXJpY10KKworICAgICBEZWZpbmVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG5lY2Vzc2FyeSBpbmNsdWRlIGZpbGVzIGFyZS4KKyAgICAgRXhhbXBsZTogVENMX0lOQyA9ICxka2EwOlt0Y2w4MC5nZW5lcmljXQorCis3LjIgIEdUSworCisgICAgIFRvIGJ1aWxkIFZJTSB3aXRoIEdUSyB5b3UgaGF2ZSB0byBpbnN0YWxsIEdUSyBvbiB5b3VyIE9wZW5WTVMuCisgICAgIFNvIGZhciBpdCB3b3JrcyBqdXN0IG9uIEFscGhhcy4gTW9yZSBpbmZvcm1hdGlvbiBhdDoKKyAgICAgaHR0cDovL3d3dy5vcGVudm1zLmNvbXBhcS5jb20vb3BlbnZtcy9wcm9kdWN0cy9pcHMvZ3RrLmh0bWwKKworICAgICBZb3UgbmVlZCBhbHNvIHRoZSBPcGVuVk1TIFBvcnRpbmcgTGlicmFyeToKKyAgICAgaHR0cDovL3d3dy5vcGVudm1zLmNvbXBhcS5jb20vb3BlbnZtcy9wcm9kdWN0cy9pcHMvcG9ydGluZy5odG1sCisKKyAgICAgRW5hYmxlIEdUSyBpbiBtYWtlX3Ztcy5tbXMgZmlsZSB3aXRoIEdUSyA9IFlFUworICAgICBEZWZpbmUgR1RLX1JPT1QgdGhhdCBwb2ludHMgdG8geW91ciBHVEsgcm9vdCBkaXJlY3RvcnkuCisKKyAgICAgQnVpbGQgaXQgYXMgbm9ybWFsbHkuCisKKyAgICAgVXNlZCBzaGFyYWJsZSBpbWFnZXMgYXJlOgorCWd0a19yb290OltnbGliXWxpYmdsaWIuZXhlIC9zaGFyZSwtCisJZ3RrX3Jvb3Q6W2dsaWIuZ21vZHVsZV1saWJnbW9kdWxlLmV4ZSAvc2hhcmUsLQorCWd0a19yb290OltndGsuZ2RrXWxpYmdkay5leGUgL3NoYXJlLC0KKwlndGtfcm9vdDpbZ3RrLmd0a11saWJndGsuZXhlIC9zaGFyZQorCisgICAgIER1cmluZyBydW50aW1lIGl0IGlzIHN1Z2dlc3RlZCB0byBoYXZlIGFsbCB0aGVzZSBmaWxlcyBpbnN0YWxsZWQgYW5kCisgICAgIGNvcHllZCB0byBTWVMkTElCUkFSWTogdG8gYmUgYWJsZSB0byB1c2UgaXQgd2l0aG91dCBwcm9ibGVtcy4KKyAgICAgQWxzbyBWTVNfSkFDS0VUUy5FWEUgZnJvbSBPcGVuVk1TIFBvcnRpbmcgTGlicmFyeS4KKworICAgICBQbGVhc2Ugbm90ZSwgdGhhdCBHVEsgdXNlcyAvbmFtZT0oYXNfaXMsc2hvcnQpL2Zsb2F0PWllZWUvaWVlZT1kZW5vcm0KKyAgICAgY29tcGxpZXIgZGlyZWN0aXZlcyB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggInN0YW5kYXJkIiBWTVMgdXNhZ2UsCisgICAgIHRoZXJlZm9yZSBvdGhlciBleHRlcm5hbCBmZWF0dXJlcyBtaWdodCBmYWlsIGFzIFBFUkwsIFBZVEhPTiBhbmQgVENMCisgICAgIHN1cHBvcnQuCisKKzcuMyAgUEVSTAorCisgICAgIFlvdSBoYXZlIHRvIGluc3RhbGwgT3BlblZNUyBwZXJsIHBhY2thZ2UgZnJvbToKKyAgICAgaHR0cDovL3d3dy5vcGVudm1zLmNvbXBhcS5jb20vb3BlbnZtcy9wcm9kdWN0cy9pcHMvYXBhY2hlL2Nzd3NfcGVybF9yZWxub3Rlcy5odG1sIG9yIGJ1aWxkIG9uIHlvdXIgb3duIGZyb20gc291cmNlcyBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5wZXJsLm9yZworCisgICAgIFlvdSBuZWVkIGRlZmluZWQgUEVSTFNIUiBsb2dpY2FsIHRoYXQgcG9pbnRzIHRvIFBFUkwgc2hhcmVhYmxlIGltYWdlCisgICAgIChvciB5b3UgY2FuIGp1c3QgY29weSBvdmVyIHRvIFNZUyRMSUJSQVJZOikKKworICAgICBFbmFibGUgUGVybCBmZWF0dXJlIGF0IG1ha2Vfdm1zLm1tcyB3aXRoIFZJTV9QRVJMID0gWUVTCisKKyAgICAgRWRpdCBQRVJMX0lOQyA9IHRvIHBvaW50IHRvIHBlcmwgaW5jbHVkZXMgZGlyZWN0b3J5IHdoZXJlIGlzIGV4dGVybi5oCisKKyAgICAgQnVpbGQgYXMgdXN1YWxseS4KKworNy40ICBQWVRIT04KKworICAgICBZb3UgaGF2ZSB0byBpbnN0YWxsIGFuIE9wZW5WTVMgcHl0aG9uIHBhY2thZ2UuCisgICAgIFNldCB1cCB0aGUgbm9ybWFsIFB5dGhvbiB3b3JrIGVudmlyb25tZW50LgorCisgICAgIFlvdSBoYXZlIHRvIGhhdmUgZGVmaW5lZCBQWVRIT05fSU5DTFVERSBhbmQgUFlUSE9OX09MQiBsb2dpY2Fscy4KKyAgICAgUFlUSE9OX0lOQ0xVREUgc2hvdWxkIHBvaW50IHRvIFB5dGhvbiBpbmNsdWRlIGZpbGVzIHdoZXJlIGZvciBleDoKKyAgICAgcHl0aG9uLmggaXMgbG9jYXRlZC4KKyAgICAgRW5hYmxlIFB5dGhvbiBmZWF0dXJlIGF0IG1ha2Vfdm1zLm1tcyB3aXRoIFZJTV9QWVRIT04gPSBZRVMKKworICAgICBCdWlsZCBhcyB1c3VhbGx5LgorCis3LjUgIFRDTAorCisgICAgIFlvdSBoYXZlIHRvIGluc3RhbGwgYW4gT3BlblZNUyBUQ0wgcGFja2FnZS4KKyAgICAgU2V0IHVwIHRoZSBub3JtYWwgVENMIHdvcmsgZW52aXJvbm1lbnQuCisKKyAgICAgWW91IGhhdmUgdG8gaGF2ZSBkZWZpbmVkIFRDTFNIUiBsb2dpY2FsIHRoYXQgcG9pbnRzIHRvIHNoYXJlYWJsZSBpbWFnZS4KKworICAgICBFbmFibGUgVENMIGZlYXR1cmUgYXQgbWFrZV92bXMubW1zIHdpdGggVklNX1RDTCA9IFlFUworCisgICAgIEVkaXQgVENMX0lOQyA9IHRvIHBvaW50IHRvIFRDTCBpbmNsdWRlcyBkaXJlY3Rvcnkgd2hlcmUgaXMgdGNsLmgKKworICAgICBCdWlsZCBhcyB1c3VhbGx5LgorCis4LiAgIE5vdGVzCisKKzguMS4gTmV3IENvbXBhcSBDIGNvbXBpbGVyCisKKyAgICAgSWYgeW91IGFyZSB1c2luZyBDb21wYXEgQyBjb21waWxlciBWNi4yIG9yIG5ld2VyLCBJbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgIG9mIHRoZSB0eXBlIFFVRVNUQ09NUEFSRSB3aWxsIGJlIGRpc3BsYXllZC4gWW91IHNob3VsZCBpZ25vcmUgdGhvc2UKKyAgICAgbWVzc2FnZXMgOyB0aGV5IGFyZSBnZW5lcmF0ZWQgb25seSBiZWNhdXNlIHNvbWUgdGVzdCBjb21wYXJpc29ucyBhcmUgZG9uZQorICAgICB3aXRoIHZhcmlhYmxlcyB3aGljaCB0eXBlIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBPUy4gVW5kZXIgVk1TLCB0aG9zZSBhcmUKKyAgICAgInVuc2lnbmVkIiBhbmQgdGhlIGNvbXBpbGVyIGlzc3VlIGEgbWVzc2FnZSB3aGVuZXZlciB0aGUgY29tcGFyaXNvbiBpcworICAgICBkb25lIHdpdGggJzw9JyB0byAwLiBIb3dldmVyLCB0aGUgY29kZSBpcyBjb3JyZWN0IGFuZCB3aWxsIGJlaGF2ZSBhcworICAgICBleHBlY3RlZC4KKyAgICAgKCBKZXJvbWUgTGF1cmV0IDxKTEFVUkVUQG1haWwuY2hlbS5zdW55c2IuZWR1PiBWaW0gNi4wbiApCisJTk9URTogZnJvbSB2ZXJzaW9uIDYuMGFkIFZpbSBjb2RlIGhhcyBiZWVuIHJldmlld2VkIGFuZCB0aGVzZSB3YXJuaW5ncworCWhhdmUgYmVlbiBjb3JyZWN0ZWQuCisKKzkuICAgQXV0aG9ycworCisgICAgIEluaXRpYWwgdmVyc2lvbiwgMjAwMCBKdWwgMTksIFpvbHRhbiBBcnBhZGZmeSA8YXJwYWRmZnlAcG9sYXJmb3guY29tPgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfYWd1aS5tYWsgYi9zcmMvTWFrZV9hZ3VpLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjMwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfYWd1aS5tYWsKQEAgLTAsMCArMSwzNTYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFZJTSBvbiB0aGUgQW1pZ2EsIHVzaW5nIFNBUy9MYXR0aWNlIEMgNi4wIHRvIDYuNTYKKyMKKyMgRG8gTk9UIHVzZSB0aGUgcGVlcGhvbGUgb3B0aW1pemVyIHdpdGggYSB2ZXJzaW9uIGJlZm9yZSA2LjU1IQorIyBJdCBtZXNzZXMgdXAgYWxsIGtpbmRzIG9mIHRoaW5nczoKKyMgRm9yIDYuMCBhbmQgNi4xLCBleHBhbmRfZW52KCkgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuCisjIEZvciA2LjIgYW5kIDYuMyB0aGUgY2FsbCB0byBmcmVlX2xpbmUgaW4gdV9mcmVlZW50cnkgaXMgd3JvbmcuCisjIERvbid0IGtub3cgYWJvdXQgNi41MCwgbWlnaHQgd29yay4uLgorIyBWZXJzaW9uIDYuNTYgc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lLgorIyBZb3Ugc2hvdWxkIHVzZSBNYW54IEF6dGVjIEMgd2hlbmV2ZXIgcG9zc2libGUuCisjCisjIFRoZSBwcm90b3R5cGVzIGZyb20gTWFueCBhbmQgU0FTIGFyZSBpbmNvbXBhdGlibGUuIElmIHRoZSBwcm90b3R5cGVzCisjIHdlcmUgZ2VuZXJhdGVkIGJ5IE1hbngsIGZpcnN0IGRvICJ0b3VjaCAqLmM7IG1ha2UgcHJvdG8iIGJlZm9yZSAibWFrZSIuCisjIFRoZSBwcm90b3R5cGVzIGdlbmVyYXRlZCBvbiBVbml4IHdvcmsgZm9yIGJvdGguCisjCisjIE5vdGU6IE5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC4gVGhpcyB3YXMgZG9uZSB0byBhdm9pZCBoYXZpbmcKKyMgICAgICAgdG8gY29tcGlsZSBldmVyeXRoaW5nIHdoZW4gYSBnbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24gaXMgYWRkZWQuCisKKyM+Pj4+PiBjaG9vc2Ugb3B0aW9uczoKKworI0FOU0kgQ09ERVMKK0FOU0lPRkYgPSAqZVswbQorQkJPTEQgPSAqZVsxbQorV0JPTEQgPSAqZVsybQorSVRBTElDID0gKmVbM20KK1VOREVSTEkgPSAqZVs0bQorQU5TSU9GRiA9ICplWzBtCitGQ09MMSA9ICplWzMxbQorRkNPTDIgPSAqZVszMm0KK0ZDT0wzID0gKmVbMzNtCitGQ09MNCA9ICplWzM0bQorQkNPTDEgPSAqZVs0MW0KK0JDT0wyID0gKmVbNDJtCitCQ09MMyA9ICplWzQzbQorQkNPTDQgPSAqZVs0NG0KKworCisjIyMgU2VlIGZlYXR1cmUuaCBmb3IgYSBsaXN0IG9mIG9wdGlvbmFscy4KKyMjIyBBbnkgb3RoZXIgZGVmaW5lcyBjYW4gYmUgaW5jbHVkZWQgaGVyZS4KKworREVGSU5FUyA9IERFRj1OT19BUlAgREVGPUFNSUdBIERFRj1ORVdTQVNDIERFRj1GRUFUX0dVSV9BTUlHQSBcCisJICAgIERFRj0iU0FTQz02NTgiICMiIHRoaXMgZml4ZXMgYSBidWcgaW4gdGhlIHN5bnRheCBoaWdobGlnaHRpbmcKKworIz4+Pj4+IGlmIEhBVkVfVEdFVEVOVCBpcyBkZWZpbmVkIHRlcm1saWIubyBoYXMgdG8gYmUgdXNlZAorI1RFUk1MSUIgPSB0ZXJtbGliLm8KK1RFUk1MSUIgPQorCisjPj4+Pj4gY2hvb3NlIE5PREVCVUcgZm9yIG5vcm1hbCBjb21waWxpbmcsIHRoZSBvdGhlciBmb3IgZGVidWdnaW5nIGFuZAorIyBwcm9maWxpbmcKKyMgZG9uJ3Qgc3dpdGNoIG9uIGRlYnVnZ2luZyB3aGVuIGdlbmVyYXRpbmcgcHJvdG8gZmlsZXMsIGl0IGNyYXNoZXMgdGhlCisjIGNvbXBpbGVyLgorREJHID0gTk9ERUJVRworI0RCRyA9IERCRz1GVUxMRkxVU0gKKyNEQkcgPSBEQkc9TElORQorCisjPj4+Pj4gY2hvb3NlIE5PT1BUUEVFUCBmb3IgNi4wIHRvIDYuMywgTk9PUFQgZm9yIGRlYnVnZ2luZworI09QVElNSVpFPU5PT1BUUEVFUCBPUFQKKworIyBmb3IgNi41OCB5b3UgY2FuIHVzZSB0aGUgbGluZSBiZWxvdywgYnV0IGJlIHdhcm5lZCBpdCB0YWtlcyBhIGxvb29vbm5uZ2dnIHRpbWUKKyNPUFRJTUlaRT1PUFQgIE9QVElNSVpFUlNDSEVEVUxFUiBPUFRJTUlaRVJUSU1FIE5vT1BUSU1JWkVSQUxJQVMgXAorIwlPcHRpbWl6ZXJDb21wbGV4aXR5PTEwIE9wdGltaXplckRlcHRoPTEwIE9wdGltaXplclJlY3VyRGVwdGg9MTAgXAorIwlPcHRpbWl6ZXJJbkxvY2FsIE9QVFBFRVAKK09QVElNSVpFPU9QVCAgT1BUSU1JWkVSVElNRSBOb09QVElNSVpFUkFMSUFTIFwKKwlPcHRpbWl6ZXJDb21wbGV4aXR5PTEwIE9wdGltaXplckRlcHRoPTEwIE9wdGltaXplclJlY3VyRGVwdGg9MTAgXAorCU9wdGltaXplckluTG9jYWwgT1BUUEVFUAorI09QVElNSVpFID0gTk9PUFQKKworIyBubyBvcHRpbWl6YXRpb24sICh3b3JrcyBvbiBhbGwgcGxhdGZvcm1zKQorI09QVElNSVpFPU5PT1BUCisKKyNnZW5lcmF0ZSBjb2RlIGZvciB5b3VyIHByb2Nlc3NvciAtIG5vdGUgaG93ZXZlciwgdGhhdCB0aGUgMDYwIHNlbGVjdGlvbiB3aWxsIHdvcmsgZm9yIDA0MCdzCisjIGFzIHdlbGwuCisjQ1BVPTY4MDAwCisjQ1BVPTY4MDIwCisjQ1BVPTY4MDMwCisjQ1BVPTY4MDQwCitDUFU9NjgwNjAKKworCisjRXJyb3IgcmVwb3J0aW5nIC0gSSB1c2UgcmV4eCBmb3IgcmVwb3J0aW5nLCBidXQgY29uc29sZSByZXBvcnRpbmcgbWF5IGJlIG1vcmUKKyN1c2VmdWwgZm9yIHNvbWUgcGVvcGxlLgorI0VSUk9SID0gRVJST1JDT05TT0xFIEVSUk9SU09VUkNFIEVSUk9SSElHSExJR0hUCitFUlJPUiA9IEVSUk9SUkVYWCBFUlJPUkNPTlNPTEUgRVJST1JTT1VSQ0UgRVJST1JISUdITElHSFQKKworCisjbWVtb3J5IHR5cGVzLCBpZiB5b3UgaGF2ZSBmYXN0IHVzZSBpdCA6LT4sCisjCUFOWSA9IHdpbGwgd29yayBvbiBhbGwgbWFjaGluZXMKKyMJRkFTVCA9IHRoaXMgaXMgdGhlIGJlc3Qgb3B0aW9uLCBmb3Igc3BlZWQKKyMJQ0hJUCA9IG5vdCBuZWNlc3NhcnkgZm9yIHRoaXMgYXBwbGljYXRpb24uCisjTUVNT1JZVFlQRT1GQVNUCitNRU1PUllUWVBFPUFOWQorCisjTUVNU0laRSAtIHRoaXMgaXMgZm9yIGNvbXBpbGUgdGltZSBvbmx5IGZvciBzcGVlZCBvZiBjb21waWxhdGlvbgorI2RlZmF1bHQgaXMgTEFSR0UKK01FTVNJWkU9SFVHRQorI01FTVNJWkU9TEFSR0UKKyNNRU1TSVpFPVNNQUxMCisKKyM+Pj4+PiBlbmQgb2YgY2hvaWNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NDID0gc2MKKworR1NUPXZpbS5nc3QKK0RFUCA9ICQoR1NUKQorCisKK0NGTEFHUyA9IE5PTElOSyAkKERCRykgIENQVT0kKENQVSkgTk9TVEFDS0NIRUNLCitDRkxBR1MyID0gJChPUFRJTUlaRSkgJChFUlJPUikgR1NUSU1NRURJQVRFIEdTVD0kKEdTVCkKK0NGTEFHUzMgPU5PU0lOVCBTQ09ERSBTREFUQSBTVFJJTkdNRVJHRSBNRU1TSVpFPSQoTUVNU0laRSkKK0NGTEFHUzQgPSAkKERFRklORVMpIERBVEFNRU1PUlk9JChNRU1PUllUWVBFKQorCitQUk9QVCA9IERFRj1QUk9UTyBHUFJPVE8gR1BQQVJNIE1BWElNVU1FUlJPUlM9OTk5IEdFTlBST1RPU1RBVElDUyBHRU5QUk9UT1BBUkFNRVRFUlMKKworU1JDID0gXAorCWJ1ZmZlci5jIFwKKwljaGFyc2V0LmMgXAorCWRpZmYuYyBcCisJZGlncmFwaC5jIFwKKwllZGl0LmMgXAorCWV2YWwuYyBcCisJZXhfY21kcy5jIFwKKwlleF9jbWRzMi5jIFwKKwlleF9kb2NtZC5jIFwKKwlleF9ldmFsLmMgXAorCWV4X2dldGxuLmMgXAorCWZpbGVpby5jIFwKKwlmb2xkLmMgXAorCWdldGNoYXIuYyBcCisJbWFpbi5jIFwKKwltYXJrLmMgXAorCW1lbWZpbGUuYyBcCisJbWVtbGluZS5jIFwKKwltZW51LmMgXAorCW1lc3NhZ2UuYyBcCisJbWlzYzEuYyBcCisJbWlzYzIuYyBcCisJbW92ZS5jIFwKKwlub3JtYWwuYyBcCisJb3BzLmMgXAorCW9wdGlvbi5jIFwKKwlvc19hbWlnYS5jIFwKKwlxdWlja2ZpeC5jIFwKKwlyZWdleHAuYyBcCisJc2NyZWVuLmMgXAorCXNlYXJjaC5jIFwKKwlzeW50YXguYyBcCisJdGFnLmMgXAorCXRlcm0uYyBcCisJdWkuYyBcCisJdW5kby5jIFwKKwl3aW5kb3cuYyBcCisJdmVyc2lvbi5jIFwKKwlndWlfYW1pZ2EuYyBcCisJZ3VpLmMKKworT0JKID0gYnVmZmVyLm8gY2hhcnNldC5vIGRpZmYubyBkaWdyYXBoLm8gZWRpdC5vIGV2YWwubyBleF9jbWRzLm8gZXhfY21kczIubyBleF9kb2NtZC5vIGV4X2V2YWwubyBleF9nZXRsbi5vIFwKKwlmaWxlaW8ubyBmb2xkLm8gZ2V0Y2hhci5vIG1haW4ubyBtYXJrLm8gbWVtZmlsZS5vIG1lbWxpbmUubyBtZW51Lm8gbWVzc2FnZS5vIG1pc2MxLm8gbWlzYzIubyBtb3ZlLm8gXAorCW5vcm1hbC5vIG9wcy5vIG9wdGlvbi5vIG9zX2FtaWdhLm8gcXVpY2tmaXgubyByZWdleHAubyBzY3JlZW4ubyBzZWFyY2gubyBzeW50YXgubyBcCisJdGFnLm8gdGVybS5vIHVpLm8gdW5kby5vIHdpbmRvdy5vIGd1aV9hbWlnYS5vIGd1aS5vICAkKFRFUk1MSUIpCisKK1BSTyA9IFwKKwlidWZmZXIucHJvIFwKKwljaGFyc2V0LnBybyBcCisJZGlmZi5wcm8gXAorCWRpZ3JhcGgucHJvIFwKKwllZGl0LnBybyBcCisJZXZhbC5wcm8gXAorCWV4X2NtZHMucHJvIFwKKwlleF9jbWRzMi5wcm8gXAorCWV4X2RvY21kLnBybyBcCisJZXhfZXZhbC5wcm8gXAorCWV4X2dldGxuLnBybyBcCisJZmlsZWlvLnBybyBcCisJZm9sZC5wcm8gXAorCWdldGNoYXIucHJvIFwKKwltYWluLnBybyBcCisJbWFyay5wcm8gXAorCW1lbWZpbGUucHJvIFwKKwltZW1saW5lLnBybyBcCisJbWVudS5wcm8gXAorCW1lc3NhZ2UucHJvIFwKKwltaXNjMS5wcm8gXAorCW1pc2MyLnBybyBcCisJbW92ZS5wcm8gXAorCW5vcm1hbC5wcm8gXAorCW9wcy5wcm8gXAorCW9wdGlvbi5wcm8gXAorCW9zX2FtaWdhLnBybyBcCisJcXVpY2tmaXgucHJvIFwKKwlyZWdleHAucHJvIFwKKwlzY3JlZW4ucHJvIFwKKwlzZWFyY2gucHJvIFwKKwlzeW50YXgucHJvIFwKKwl0YWcucHJvIFwKKwl0ZXJtLnBybyBcCisJdGVybWxpYi5wcm8gXAorCXVpLnBybyBcCisJdW5kby5wcm8gXAorCXdpbmRvdy5wcm8gXAorCXZlcnNpb24ucHJvIFwKKwlndWlfYW1pZ2EucHJvIFwKKwlndWkucHJvCisKK2FsbDoKKwlAZWNobyAiJChCQ09MMilidWlsZGluZyBwcm90b3R5cGVzLCB0aGlzIG1heSB0YWtlIHNvbWUgdGltZSQoQU5TSU9GRikiCisJQHNtYWtlIHByb3RvCisJQGVjaG8gIiQoQkNPTDIpYnVpbGRpbmcgdmltIHByb2R1Y3Rpb24gdmVyc2lvbiQoQU5TSU9GRikiCisJQHNtYWtlIHZpbQorCitWaW06IHNjb3B0aW9ucyBwcm90byAkKE9CSikgdmVyc2lvbi5jIHZlcnNpb24uaAorCSQoQ0MpICQoQ0ZMQUdTKSB2ZXJzaW9uLmMKKwkkKENDKSBMSU5LICQoT1BUKSAkKENPUFRTKSAkKE9CSikgdmVyc2lvbi5vICQoREJHKSBQTkFNRT1WaW0KKworZGVidWc6IHNjb3B0aW9uIHByb3RvcyAkKE9CSikgdmVyc2lvbi5jIHZlcnNpb24uaAorCSQoQ0MpICQoQ0ZMQUdTKSB2ZXJzaW9uLmMKKwkkKENDKSBMSU5LICQoQ09QVFMpICQoT0JKKSB2ZXJzaW9uLm8gJChEQkcpIFBOQU1FPVZpbQorCitwcm90bzogJChQUk8pCisKK3RhZ3M6ICQoU1JDKQorCXNwYXQgY3RhZ3MgJChTUkMpICouaAorCSNjc2ggLWMgY3RhZ3MgJChTUkMpICouaAorCisjIGNhbid0IHVzZSBkZWxldGUgaGVyZSwgdG9vIG1hbnkgZmlsZSBuYW1lcworY2xlYW46CisJQGVjaG8gcmVtb3ZpbmcgYWxsIG9iamVjdCBmaWxlcworCS1kZWxldGUgJChPQkopID5uaWw6CisKK2Nsb2JiZXI6IGNsZWFuCisJQGVjaG8gcmVtb3ZpbmcgYWxsIHByb3RvdHlwZSBmaWxlcworCS1kZWxldGUgJChQUk8pIFNDT1BUSU9OUyB2aW0gJChHU1QpID4gTklMOgorCisKKyMgZ2VuZXJhdGUgYW4gb3B0aW9ucyBmaWxlLCBhcyB0aGVyZSBpcyBubyB3YXkgdGhlIGFtaWdhIGNvbW1hbmQgbGluZSBjYW4gaGFuZGxlIHRoZQorIyBsZW5ndGhzIHRoYXQgdGhpcyBtYWtlZmlsZSB3aWxsIGltcG9zZSBvbiB0aGUgc2hlbGwuCitzY29wdGlvbnM6IHNtYWtlZmlsZQorCUBlY2hvICIkKEJDT0wyKUdlbmVyYXRpbmcgJChBTlNJT0ZGKSQoRkNPTDQpLSAkQCQoQU5TSU9GRikiCisJQGVjaG8gJChDRkxBR1MpID4gc2NvcHRpb25zCisJQGVjaG8gJChDRkxBR1MxKSA+PiBzY29wdGlvbnMKKwlAZWNobyAkKENGTEFHUzIpID4+IHNjb3B0aW9ucworCUBlY2hvICQoQ0ZMQUdTMykgPj4gc2NvcHRpb25zCisJQGVjaG8gJChDRkxBR1M0KSA+PiBzY29wdGlvbnMKKwlAZWNobyAkKENPUFRTKSA+PnNjb3B0aW9ucworCUBlY2hvIHNjb3B0aW9ucyBoYXMgYmVlbiBidWlsdAorCisKKyNnZW5lcmF0ZSBHbG9iYWxTeW1ib2xUYWJsZSwgd2hpY2ggYm90aCBzcGVlZHMgdXAgdGhlIGNvbXBpbGUgdGltZSwgYnV0IGFsc28KKyNzb2x2ZXMgc29tZSBwcm9ibGVtcyB3aXRoIHByb3RvdHlwZXMsIGFuZCB0eXBlcyAgdGhhdCBhcmUgZGVmaW5lZCBpbiBhIHVuaXh5CisjbWFubmVyLgorIworI0kgdXNlIGEgcHJlcHJvY2Vzc2luZyBzdGFnZSBoZXJlIHRvIHdvcmsgYXJvdW5kYSBidWcgaW4gdGhlIEdTVCBnZW5lcmF0b3IsIGluCisjdGhhdCBpdCBkb2VzIG5vdCBoYW5kbGUgbmVzdGVkIG1ha2VmaWxlcyBwcm9wZXJseSBpbiB0aGlzIHN0YWdlLgorJChHU1QpOiBzY29wdGlvbnMgdmltLmgga2V5bWFwLmggbWFjcm9zLmggYXNjaWkuaCB0ZXJtLmggc3RydWN0cy5oIGd1aS5oIGd1aV9hbWlnYS5oCisJQGVjaG8gIiQoQkNPTDIpR2VuZXJhdGluZyBHbG9iYWwgU3ltYm9sIFRhYmxlICQoQU5TSU9GRikkKEZDT0w0KSAkKEdTVCkgJChBTlNJT0ZGKSIKKwkkKENDKSBQUkVQUk9DRVNTT1JPTkxZIGd1aV9hbWlnYS5oICBvYmplY3RuYW1lIHByZS5oCisJJChDQykgIE1HU1Q9JChHU1QpIHByZS5oIGlnbm9yZT0xMDUsMzE2CisJZGVsIHByZS5oCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5jLm86CisJQGVjaG8gIiQoQkNPTDIpR2VuZXJhdGluZyBvYmplY3QgZm9yICQoQU5TSU9GRikkKEZDT0w0KSAkKi5jIC0+ICRAJChBTlNJT0ZGKSIKKwkkKENDKSAkKi5jCisKKy5jLnBybzoKKwlAZWNobyAiJChCQ09MMilHZW5lcmF0aW5nIHByb3RvdHlwZXMgZm9yICQoQU5TSU9GRikkKEZDT0w0KSAkKi5jIC0+ICRAJChBTlNJT0ZGKSIKKwlAJChDQykgTk9FUlJPUlJFWFggR1BGSUxFPSQqLnBybyAkKFBST1BUKSAkKi5jIGlnbm9yZT0zMDYsMzE2LDMxNywzMDQKKworJChQUk8pOiAkKEdTVCkKKyQoT0JKKTogJChHU1QpCisKKyMgZGVwZW5kYW5jaWVzCitidWZmZXIubzoJYnVmZmVyLmMgJChERVApCitidWZmZXIucHJvOglidWZmZXIuYyAkKERFUCkKK2NoYXJzZXQubzoJY2hhcnNldC5jICAkKERFUCkKK2NoYXJzZXQucHJvOgljaGFyc2V0LmMgJChERVApCitkaWZmLm86CQlkaWZmLmMgICQoREVQKQorZGlmZi5wcm86CWRpZmYuYyAkKERFUCkKK2RpZ3JhcGgubzoJZGlncmFwaC5jICAkKERFUCkKK2RpZ3JhcGgucHJvOglkaWdyYXBoLmMgJChERVApCitlZGl0Lm86CQllZGl0LmMgICQoREVQKQorZWRpdC5wcm86CWVkaXQuYyAgICQoREVQKQorZXZhbC5vOgkJZXZhbC5jICAkKERFUCkKK2V2YWwucHJvOglldmFsLmMgICQoREVQKQorZXhfY21kcy5vOglleF9jbWRzLmMgJChERVApCitleF9jbWRzLnBybzoJZXhfY21kcy5jICAkKERFUCkKK2V4X2NtZHMyLm86CWV4X2NtZHMyLmMgJChERVApCitleF9jbWRzMi5wcm86CWV4X2NtZHMyLmMgJChERVApCitleF9kb2NtZC5vOglleF9kb2NtZC5jIGV4X2NtZHMuaCAgJChERVApCitleF9kb2NtZC5wcm86CWV4X2RvY21kLmMgZXhfY21kcy5oICQoREVQKQorZXhfZXZhbC5vOglleF9ldmFsLmMgZXhfY21kcy5oICAkKERFUCkKK2V4X2V2YWwucHJvOglleF9ldmFsLmMgZXhfY21kcy5oICQoREVQKQorZXhfZ2V0bG4ubzoJZXhfZ2V0bG4uYyAgJChERVApCitleF9nZXRsbi5wcm86CWV4X2dldGxuLmMgICQoREVQKQorZmlsZWlvLm86CWZpbGVpby5jICAkKERFUCkKK2ZpbGVpby5wcm86CWZpbGVpby5jICAgJChERVApCitmb2xkLm86CQlmb2xkLmMgICQoREVQKQorZm9sZC5wcm86CWZvbGQuYyAgICQoREVQKQorZ2V0Y2hhci5vOglnZXRjaGFyLmMgICQoREVQKQorZ2V0Y2hhci5wcm86CWdldGNoYXIuYyAkKERFUCkKK21haW4ubzoJCW1haW4uYyBnbG9iYWxzLmggJChERVApCittYWluLnBybzoJbWFpbi5jIGdsb2JhbHMuaCAkKERFUCkKK21hcmsubzoJCW1hcmsuYyAgJChERVApCittYXJrLnBybzoJbWFyay5jICQoREVQKQorbWVtZmlsZS5vOgltZW1maWxlLmMgICQoREVQKQorbWVtZmlsZS5wcm86CW1lbWZpbGUuYyAkKERFUCkKK21lbWxpbmUubzoJbWVtbGluZS5jICAkKERFUCkKK21lbWxpbmUucHJvOgltZW1saW5lLmMgJChERVApCittZW51Lm86CQltZW51LmMgICQoREVQKQorbWVudS5wcm86CW1lbnUuYyAkKERFUCkKK21lc3NhZ2UubzoJbWVzc2FnZS5jICAkKERFUCkKK21lc3NhZ2UucHJvOgltZXNzYWdlLmMgJChERVApCittaXNjMS5vOgltaXNjMS5jICAkKERFUCkKK21pc2MxLnBybzoJbWlzYzEuYyAgJChERVApCittaXNjMi5vOgltaXNjMi5jICAkKERFUCkKK21pc2MyLnBybzoJbWlzYzIuYyAkKERFUCkKK21vdmUubzoJCW1vdmUuYyAgJChERVApCittb3ZlLnBybzoJbW92ZS5jICQoREVQKQorbm9ybWFsLm86CW5vcm1hbC5jICAkKERFUCkKK25vcm1hbC5wcm86CW5vcm1hbC5jICQoREVQKQorb3BzLm86CQlvcHMuYyAgJChERVApCitvcHMucHJvOglvcHMuYyAgJChERVApCitvcHRpb24ubzoJb3B0aW9uLmMgICQoREVQKQorb3B0aW9uLnBybzoJb3B0aW9uLmMgICAkKERFUCkKK29zX2FtaWdhLm86CW9zX2FtaWdhLmMgICQoREVQKQorb3NfYW1pZ2EucHJvOglvc19hbWlnYS5jICAkKERFUCkKK3F1aWNrZml4Lm86CXF1aWNrZml4LmMgICQoREVQKQorcXVpY2tmaXgucHJvOglxdWlja2ZpeC5jICAkKERFUCkKK3JlZ2V4cC5vOglyZWdleHAuYyAgJChERVApCityZWdleHAucHJvOglyZWdleHAuYyAgJChERVApCitzY3JlZW4ubzoJc2NyZWVuLmMgICQoREVQKQorc2NyZWVuLnBybzoJc2NyZWVuLmMgICQoREVQKQorc2VhcmNoLm86CXNlYXJjaC5jICAkKERFUCkKK3NlYXJjaC5wcm86CXNlYXJjaC5jICAkKERFUCkKK3N5bnRheC5vOglzeW50YXguYyAgICQoREVQKQorc3ludGF4LnBybzoJc3ludGF4LmMgICQoREVQKQordGFnLm86CQl0YWcuYyAgICQoREVQKQordGFnLnBybzoJdGFnLmMgICAkKERFUCkKK3Rlcm0ubzoJCXRlcm0uYyAgICQoREVQKQordGVybS5wcm86CXRlcm0uYyAgJChERVApCit0ZXJtbGliLm86CXRlcm1saWIuYyAgICQoREVQKQordGVybWxpYi5wcm86CXRlcm1saWIuYyAgJChERVApCit1aS5vOgkJdWkuYyAgICQoREVQKQordWkucHJvOgkJdWkuYyAgJChERVApCit1bmRvLm86CQl1bmRvLmMgICAkKERFUCkKK3VuZG8ucHJvOgl1bmRvLmMgICQoREVQKQord2luZG93Lm86CXdpbmRvdy5jICAgJChERVApCit3aW5kb3cucHJvOgl3aW5kb3cuYyAgJChERVApCitndWlfYW1pZ2EubzoJZ3VpX2FtaWdhLmMgJChERVApIGFtaWdhLmgKKyNndWlfYW1pZ2EucHJvOglndWlfYW1pZ2EuYyAkKERFUCkgYW1pZ2EuaAorYW1pZ2EubzoJYW1pZ2EuYyAkKERFUCkgYW1pZ2EuaAorYW1pZ2EucHJvOglhbWlnYS5jICQoREVQKSBhbWlnYS5oCitndWkubzoJCWd1aS5jICAgJChERVApCitndWkucHJvOglndWkuYyAgJChERVApCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9hcm9zLm1hayBiL3NyYy9NYWtlX2Fyb3MubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjZlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9hcm9zLm1hawpAQCAtMCwwICsxLDI5IEBACisjIE1ha2VmaWxlIGZvciBBUk9TCisKK0NGTEFHUyA9IC1waXBlIC1PMiAtV2FsbCAtSXByb3RvIFwKKyAgICAgICAgIC1ETk9fQVJQIC1EVVNFX1RNUE5BTSAtREZFQVRfR1VJX0FNSUdBCisKK1BSRyAgICA9IFZJTQorTElCUyAgID0KK0NDICAgICA9IGkzODYtbGludXgtYXJvcy1nY2MKK0xEICAgICA9IGkzODYtbGludXgtYXJvcy1nY2MKK1JNICAgICA9IHJtCisKK1NSQ1MgICA9IGJ1ZmZlci5jIGNoYXJzZXQuYyBkaWZmLmMgZGlncmFwaC5jIGVkaXQuYyBldmFsLmMgZXhfY21kcy5jICAgICAgICAgIFwKKyAgICAgICAgIGV4X2NtZHMyLmMgZXhfZG9jbWQuYyBleF9ldmFsLmMgZXhfZ2V0bG4uYyBmaWxlaW8uYyBmb2xkLmMgZ2V0Y2hhci5jIFwKKyAgICAgICAgIG1haW4uYyBtYXJrLmMgbWJ5dGUuYyBtZW1maWxlLmMgbWVtbGluZS5jIG1lbnUuYyBtZXNzYWdlLmMgbWlzYzEuYyAgIFwKKyAgICAgICAgIG1pc2MyLmMgbW92ZS5jIG5vcm1hbC5jIG9wcy5jIG9wdGlvbi5jIG9zX2FtaWdhLmMgcXVpY2tmaXguYyAgICAgICAgIFwKKyAgICAgICAgIHJlZ2V4cC5jIHNjcmVlbi5jIHNlYXJjaC5jIHN5bnRheC5jIHRhZy5jIHRlcm0uYyB1aS5jIHVuZG8uYyAgICAgICAgIFwKKyAgICAgICAgIHZlcnNpb24uYyB3aW5kb3cuYyBndWlfYW1pZ2EuYyBndWkuYworCitPQkpTICAgPSAkKFNSQ1M6LmM9Lm8pCisKKworJChQUkcpOiAkKE9CSlMpCisJJHtMRH0gLW8gJChQUkcpICQoT0JKUykgJChMSUJTKQorCisuYy5vOgorCSR7Q0N9IC1jICR7Q0ZMQUdTfSAkPCAtbyAkQAorCitjbGVhbjoKKwkkKFJNKSAtZnYgJChPQkpTKSAkKFBSRykKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2JjMy5tYWsgYi9zcmMvTWFrZV9iYzMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjcwODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9iYzMubWFrCkBAIC0wLDAgKzEsMTczIEBACisjIE1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyAzLjEgb3IgNC4wIHRvIGNvbXBpbGUgYSAxNiBiaXQgdmVyc2lvbiBvZiBWaW0uCisjCisjIFRoZXJlIGFyZSBjb21waWxhdGlvbiBvcHRpb25zIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorIworIyBDb21tYW5kIGxpbmUgdmFyaWFibGVzOgorIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgKEU6XEJPUkxBTkRDKQorIyBERUJVRwkJc2V0IHRvICJ5ZXMiIGZvciBkZWJ1Z2dpbmcgKG5vKQorIyBTUEFXTk8JcGF0aCB0byB0aGUgc3Bhd25vIGxpYnJhcnkgZGlyZWN0b3J5LCBlbXB0eSBpZiB5b3UgZG8gbm90IGhhdmUKKyMJCWl0OyB1c2UgOC4zIGZpbGVuYW1lcyEgKEM6XENDXFNQQVdOKQorCisuQVVUT0RFUEVORAorCishaWZuZGVmIEJPUgorQk9SID0gRTpcQk9STEFOREMKKyFlbmRpZgorCishaWYgKCIkKERFQlVHKSIgPT0gInllcyIpCitERUJVR19GTEFHID0gLXYKKyFlbHNlCitERUJVR19GTEFHID0KKyFlbmRpZgorCitDQyA9ICQoQk9SKVxiaW5cYmNjLmV4ZSArVklNLkNGRworVExJTksgPSAkKEJPUilcYmluXHRsaW5rLmV4ZQorCishaWZuZGVmIFNQQVdOTworU1BBV05PID0gQzpcQ0NcU1BBV04KKyFlbmRpZgorCishaWYgKCIkKFNQQVdOTykiID09ICIiKQorTElCUEFUSCA9ICQoQk9SKVxMSUIKK0lOQ0xVREVQQVRIID0gJChCT1IpXElOQ0xVREUKK1NQQVdORCA9CitTUEFXTkwgPQorIWVsc2UKK0xJQlBBVEggPSAkKEJPUilcTElCOyQoU1BBV05PKQorSU5DTFVERVBBVEggPSAkKEJPUilcSU5DTFVERTskKFNQQVdOTykKK1NQQVdORCA9IDtTUEFXTk8KK1NQQVdOTCA9IHNwYXdubC5saWIKKyFlbmRpZgorCisKKyMJCSpJbXBsaWNpdCBSdWxlcyoKKyMKKyMgdXNlIC12IGZvciBkZWJ1Z2dpbmcKKyMKKy5jLm9iajoKKwkkKENDKSAtYyAkKERFQlVHX0ZMQUcpIHskPCB9CisKKyMJCSpMaXN0IE1hY3JvcyoKKworCitFWEVfZGVwZW5kZW5jaWVzID0gXAorCWJ1ZmZlci5vYmogXAorCWNoYXJzZXQub2JqIFwKKwlkaWZmLm9iaiBcCisJZGlncmFwaC5vYmogXAorCWVkaXQub2JqIFwKKwlldmFsLm9iaiBcCisJZXhfY21kcy5vYmogXAorCWV4X2NtZHMyLm9iaiBcCisJZXhfZG9jbWQub2JqIFwKKwlleF9ldmFsLm9iaiBcCisJZXhfZ2V0bG4ub2JqIFwKKwlmaWxlaW8ub2JqIFwKKwlmb2xkLm9iaiBcCisJZ2V0Y2hhci5vYmogXAorCW1haW4ub2JqIFwKKwltYXJrLm9iaiBcCisJbWVtZmlsZS5vYmogXAorCW1lbWxpbmUub2JqIFwKKwltZW51Lm9iaiBcCisJbWVzc2FnZS5vYmogXAorCW1pc2MxLm9iaiBcCisJbWlzYzIub2JqIFwKKwltb3ZlLm9iaiBcCisJb3NfbXNkb3Mub2JqIFwKKwlub3JtYWwub2JqIFwKKwlvcHMub2JqIFwKKwlvcHRpb24ub2JqIFwKKwlxdWlja2ZpeC5vYmogXAorCXJlZ2V4cC5vYmogXAorCXNjcmVlbi5vYmogXAorCXNlYXJjaC5vYmogXAorCXN5bnRheC5vYmogXAorCXRhZy5vYmogXAorCXRlcm0ub2JqIFwKKwl1aS5vYmogXAorCXVuZG8ub2JqIFwKKwl3aW5kb3cub2JqCisKK2FsbDogdmltLmV4ZSBpbnN0YWxsLmV4ZSB1bmluc3RhbC5leGUgeHhkL3h4ZC5leGUKKworIwkJKkV4cGxpY2l0IFJ1bGVzKgorCit2aW0uZXhlOiB2aW0uY2ZnICQoRVhFX2RlcGVuZGVuY2llcykgdmVyc2lvbi5jCisJJChDQykgJChERUJVR19GTEFHKSAtYyB2ZXJzaW9uLmMKKwkkKFRMSU5LKSAveC9jL0wkKExJQlBBVEgpICQoREVCVUdfRkxBRykgQCYmfAorYzBsLm9iaiAkKEVYRV9kZXBlbmRlbmNpZXMpIHZlcnNpb24ub2JqCit2aW0KKwkJIyBubyBtYXAgZmlsZQorJChTUEFXTkwpIGNsLmxpYgorfAorCitpbnN0YWxsLmV4ZTogZG9zaW5zdC5jCisJJChDQykgLWVpbnN0YWxsICQoREVCVUdfRkxBRykgZG9zaW5zdC5jCisKK3VuaW5zdGFsLmV4ZTogdW5pbnN0YWwuYworCSQoQ0MpICQoREVCVUdfRkxBRykgdW5pbnN0YWwuYworCisjIFRoaXMgbWF5IGZhaWwgZm9yIG9sZGVyIG1ha2UgdmVyc2lvbnMsIGJ1aWxkaW5nIHh4ZCB3aWxsIGZhaWwgYW55d2F5IHRoZW4uCit4eGQveHhkLmV4ZTogeHhkL3h4ZC5jCisJY2QgeHhkCisJJChNQUtFKSAtZiBNYWtlX2JjMy5tYWsgQk9SPSQoQk9SKSBERUJVRz0kKERFQlVHKQorCWNkIC4uCisKKyMgY2xlYW5pbmcgdXA6IERlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCB2aW0uZXhlCisJLWRlbCB2aW0uc3ltCisJLWRlbCBpbnN0YWxsLmV4ZQorCS1kZWwgdW5pbnN0YWwuZXhlCisJLWRlbCB4eGRcKi5vYmoKKwktZGVsIHh4ZFx4eGQuZXhlCisJLWRlbCB2aW0uY2ZnCisJLWRlbCB0ZXN0ZGlyXCoub3V0CisKKyMgSW5kaXZpZHVhbCBGaWxlIERlcGVuZGVuY2llcyAoaW5jb21wbGV0ZSkKK2V4X2RvY21kLm9iajogZXhfZG9jbWQuYyBleF9jbWRzLmgKKworZXhfZXZhbC5vYmo6IGV4X2V2YWwuYyBleF9jbWRzLmgKKworbWFpbi5vYmo6IG1haW4uYyBnbG9iYWxzLmggb3B0aW9uLmgKKwordGVybS5vYmo6IHRlcm0uYyB0ZXJtLmgKKwordmVyc2lvbi5vYmo6IHZlcnNpb24uYyB2ZXJzaW9uLmgKKworCisjIENvbXBpbGVyIENvbmZpZ3VyYXRpb24gRmlsZQorIworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGUgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBmb3IgYmV0dGVyIG1hY2hpbmVzLgorIwlyZXBsYWNlIC0xLSB3aXRoIC0yIHRvIHByb2R1Y2UgY29kZSBmb3IgYSA4MDI4NiBvciBoaWdoZXIKKyMJcmVwbGFjZSAtMS0gd2l0aCAtMyB0byBwcm9kdWNlIGNvZGUgZm9yIGEgODAzODYgb3IgaGlnaGVyCisjCWFkZCAtdiBmb3Igc291cmNlIGRlYnVnZ2luZwordmltLmNmZzogTWFrZV9iYzMubWFrCisJY29weSAmJnwKKy1tbAorLTEtCistZi0KKy1DCistTgorLU8KKy1aCistay0KKy1kCistaAorLXZpLQorLUg9VklNLlNZTQorLXctcGFyCistd2VhcworLXdwcmUKKy1JcHJvdG8KKy1JJChJTkNMVURFUEFUSCkKKy1MJChMSUJQQVRIKQorLURNU0RPUyQoU1BBV05EKQorfCB2aW0uY2ZnCisKK3Rlc3Q6CisJY2QgdGVzdGRpcgorCSQoTUFLRSkgLWYgTWFrZV9kb3MubWFrIHNtYWxsCisJY2QgLi4KZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2JjNS5tYWsgYi9zcmMvTWFrZV9iYzUubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDk0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9iYzUubWFrCkBAIC0wLDAgKzEsMTAwNiBAQAorIworIyBNYWtlZmlsZSBmb3IgVmltLgorIyBDb21waWxlcjogQm9ybGFuZCBDKysgNS4wIGFuZCBsYXRlciAzMi1iaXQgY29tcGlsZXIKKyMgIFRhcmdldHM6IERvczE2IG9yIFdpbjMyIChXaW5kb3dzIE5UIGFuZCBXaW5kb3dzIDk1KSAod2l0aC93aXRob3V0IEdVSSkKKyMKKyMgQ29udHJpYnV0ZWQgYnkgQmVuIFNpbmdlci4KKyMgVXBkYXRlZCA0LzE5OTcgYnkgUm9uIEFhcm9uCisjCTYvMTk5NyAtIGFkZGVkIHN1cHBvcnQgZm9yIDE2IGJpdCBET1MKKyMJTm90ZTogdGhpcyBoYXMgYmVlbiB0ZXN0ZWQsIGFuZCB3b3JrcywgZm9yIEJDNS4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKyMJSGFzIGJlZW4gcmVwb3J0ZWQgTk9UIHRvIHdvcmsgd2l0aCBCQyA0LjUyLiAgTWF5YmUgaXQgY2FuIGJlIGZpeGVkPworIwkxMC8xOTk3IC0gcm9uIC0gZml4ZWQgYnVncyB3LyBCQyA1LjAyCisjCTgvMTk5OCAtIHJvbiAtIHVwZGF0ZWQgd2l0aCBuZXcgdGFyZ2V0cywgZml4ZWQgc29tZSBzdHVmZgorIwkzLzIwMDAgLSBCcmFtOiBNYWRlIGl0IHdvcmsgd2l0aCBCQyA1LjUgZnJlZSBjb21tYW5kIGxpbmUgY29tcGlsZXIsCisjCQkJY2xlYW5lZCB1cCB2YXJpYWJsZXMuCisjCTYvMjAwMSAtIERhbiAtIEFkZGVkIHN1cHBvcnQgZm9yIGNvbXBpbGluZyBQeXRob24gYW5kIFRDTAorIwk3LzIwMDEgLSBEYW4gLSBBZGRlZCBzdXBwb3J0IGZvciBjb21waWxpbmcgUnVieQorIworIyBJdCBidWlsZHMgb24gV2luZG93cyA5NSBhbmQgTlQtSW50ZWwsIHByb2R1Y2luZyB0aGUgc2FtZSBiaW5hcnkgaW4gZWl0aGVyCisjIGNhc2UuICBUbyBidWlsZCB1c2luZyBNaWNyb3NvZnQgVmlzdWFsIEMrKywgdXNlIE1ha2VfbXZjLm1hay4KKyMKKyMgVGhpcyBzaG91bGQgd29yayB3aXRoIHRoZSBmcmVlIEJvcmxhbmQgY29tbWFuZCBsaW5lIGNvbXBpbGVyLCB2ZXJzaW9uIDUuNS4KKyMgWW91IG5lZWQgYXQgbGVhc3Qgc3AxIChzZXJ2aWNlIHBhY2sgMSkuICBXaXRoIHNwMiBpdCBjb21waWxlcyBmYXN0ZXIuCisjIFVzZSBhIGNvbW1hbmQgbGlrZSB0aGlzOgorIyA8cGF0aD5cYmluXG1ha2UgL2YgTWFrZV9iYzUubWFrIEJPUj08cGF0aD4KKyMKKworIyBsZXQgdGhlIG1ha2UgdXRpbGl0eSBkbyB0aGUgaGFyZCB3b3JrOgorLkFVVE9ERVBFTkQKKy5DQUNIRUFVVE9ERVBFTkQKKworIyBWQVJJQUJMRVM6CisjIG5hbWUJCXZhbHVlIChkZWZhdWx0KQorIworIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgaW5zdGFsbCAoYzpcYmM1KQorIyBMSU5LCQluYW1lIG9mIHRoZSBsaW5rZXIgKCQoQk9SKVxiaW5caWxpbmsgaWYgT1NUWVBFIGlzIERPUzE2LAorIwkJJChCT1IpXGJpblxpbGluazMyIG90aGVyd2lzZSkKKyMgR1VJCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgaWYgeW91IHdhbnQgdGhlIEdVSSB2ZXJzaW9uICh5ZXMpCisjIFBFUkwJCWRlZmluZSB0byBwYXRoIHRvIFBlcmwgZGlyIHRvIGdldCBQZXJsIHN1cHBvcnQgKG5vdCBkZWZpbmVkKQorIyAgIFBFUkxfVkVSCSAgZGVmaW5lIHRvIHZlcnNpb24gb2YgUGVybCBiZWluZyB1c2VkICg1NikKKyMgICBEWU5BTUlDX1BFUkwgIG5vIG9yIHllczogc2V0IHRvIHllcyB0byBsb2FkIHRoZSBQZXJsIERMTCBkeW5hbWljYWxseSAobm8pCisjIFBZVEhPTglkZWZpbmUgdG8gcGF0aCB0byBQeXRob24gZGlyIHRvIGdldCBQWVRIT04gc3VwcG9ydCAobm90IGRlZmluZWQpCisjICAgUFlUSE9OX1ZFUgkgICAgZGVmaW5lIHRvIHZlcnNpb24gb2YgUHl0aG9uIGJlaW5nIHVzZWQgKDIyKQorIyAgIERZTkFNSUNfUFlUSE9OICBubyBvciB5ZXM6IHVzZSB5ZXMgdG8gbG9hZCB0aGUgUHl0aG9uIERMTCBkeW5hbWljYWxseSAobm8pCisjIFRDTAkJZGVmaW5lIHRvIHBhdGggdG8gVENMIGRpciB0byBnZXQgVENMIHN1cHBvcnQgKG5vdCBkZWZpbmVkKQorIyAgIFRDTF9WRVIJZGVmaW5lIHRvIHZlcnNpb24gb2YgVENMIGJlaW5nIHVzZWQgKDgzKQorIyAgIERZTkFNSUNfVENMIG5vIG9yIHllczogdXNlIHllcyB0byBsb2FkIHRoZSBUQ0wgRExMIGR5bmFtaWNhbGx5IChubykKKyMgUlVCWQkJZGVmaW5lIHRvIHBhdGggdG8gUnVieSBkaXIgdG8gZ2V0IFJ1Ynkgc3VwcG9ydCAobm90IGRlZmluZWQpCisjCQlOT1RFOiBZb3UgbWF5IGhhdmUgdG8gcmVtb3ZlIHRoZSBkZWZpbmVzIGZvciB1aWRfdCBhbmQgZ2lkX3QKKyMJCWZyb20gdGhlIFJ1YnkgY29uZmlnLmggaGVhZGVyIGZpbGUuCisjICAgUlVCWV9WRVIJZGVmaW5lIHRvIHZlcnNpb24gb2YgUnVieSBiZWluZyB1c2VkICgxNikKKyMJCU5PVEU6IGNvbXBpbGF0aW9uIG9uIFdpbk5ULzJLL1hQIHJlcXVpcmVzCisjCQlhdCBsZWFzdCB2ZXJzaW9uIDEuNi41IG9mIFJ1YnkuICBFYXJsaWVyIHZlcnNpb25zCisjCQlvZiBSdWJ5IHdpbGwgY2F1c2UgYSBjb21waWxlIGVycm9yIG9uIHRoZXNlIHN5c3RlbXMuCisjICAgRFlOQU1JQ19SVUJZIG5vIG9yIHllczogdXNlIHllcyB0byBsb2FkIHRoZSBSdWJ5IERMTCBkeW5hbWljYWxseSAobm8pCisjIE1CWVRFCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgZm9yIG11bHRpLWJ5dGUgc3VwcG9ydCAoeWVzKQorIyBJTUUJCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgbXVsdGktYnl0ZSBJTUUgc3VwcG9ydCAoeWVzKQorIyAgIERZTkFNSUNfSU1FIG5vIG9yIHllczogc2V0IHRvIHllcyB0byBsb2FkIGltbTMyLmRsbCBkeW5hbWljYWxseSAoeWVzKQorIyBHRVRURVhUCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCAoeWVzKQorIyBJQ09OVgkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGZvciBkeW5hbWljIGljb252IHN1cHBvcnQgKHllcykKKyMgT0xFCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgdG8gbWFrZSBPTEUgZ3ZpbSAobm8pCisjIE9TVFlQRQlET1MxNiBvciBXSU4zMiAoV0lOMzIpCisjIERFQlVHCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgaWYgeW91IHdpc2ggYSBERUJVR2dpbmcgYnVpbGQgKG5vKQorIyBDT0RFR1VBUkQJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3YW50IHRvIHVzZSBDT0RFR1VBUkQgKG5vKQorIyBDUFVOUgkJMSB0aHJvdWdoIDY6IHNlbGVjdCAtQ1BVIGFyZ3VtZW50IHRvIGNvbXBpbGUgd2l0aCAoMykKKyMJCTMgZm9yIDM4NiwgNCBmb3IgNDg2LCA1IGZvciBwZW50aXVtLCA2IGZvciBwZW50aXVtIHByby4KKyMgVVNFRExMCW5vIG9yIHllczogc2V0IHRvIHllcyB0byB1c2UgdGhlIFJ1bnRpbWUgbGlicmFyeSBETEwgKG5vKQorIwkJRm9yIFVTRURMTD15ZXMgdGhlIGNjMzI1MC5kbGwgaXMgcmVxdWlyZWQgdG8gcnVuIFZpbS4KKyMgVklNRExMCW5vIG9yIHllczogY3JlYXRlIHZpbTMyLmRsbCwgYW5kIHN0dWIgKGcpdmltLmV4ZSAobm8pCisjIEFMSUdOCQkxLCAyIG9yIDQ6IEFsaWdubWVudCB0byB1c2UgKDQgZm9yIFdpbjMyLCAyIGZvciBET1MxNikKKyMgRkFTVENBTEwJbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIHVzZSByZWdpc3Rlci1iYXNlZCBmdW5jdGlvbiBwcm90b2NvbCAoeWVzKQorIyBPUFRJTUlaRQlTUEFDRSwgU1BFRUQsIG9yIE1BWFNQRUVEOiB0eXBlIG9mIG9wdGltaXphdGlvbiAoTUFYU1BFRUQpCisjIFBPU1RTQ1JJUFQJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGZvciBQb3N0U2NyaXB0IHByaW50aW5nCisjIEZFQVRVUkVTCVRJTlksIFNNQUxMLCBOT1JNQUwsIEJJRyBvciBIVUdFCisjCQkoQklHIGZvciBXSU4zMiwgU01BTEwgZm9yIERPUzE2KQorIyBXSU5WRVIJMHgwNDAwIG9yIDB4MDUwMDogbWluaW11bSBXaW4zMiB2ZXJzaW9uIHRvIHN1cHBvcnQgKDB4MDQwMCkKKyMgQ1NDT1BFCW5vIG9yIHllczogaW5jbHVkZSBzdXBwb3J0IGZvciBDc2NvcGUgaW50ZXJmYWNlICh5ZXMpCisjIE5FVEJFQU5TCW5vIG9yIHllczogaW5jbHVkZSBzdXBwb3J0IGZvciBOZXRiZWFucyBpbnRlcmZhY2UgKHllcyBpZiBHVUkKKyMJCWlzIHllcykKKyMgWFBNCQlkZWZpbmUgdG8gcGF0aCB0byBYUE0gZGlyIHRvIGdldCBzdXBwb3J0IGZvciBsb2FkaW5nIFhQTSBpbWFnZXMuCisKKyMjIyBCT1I6IHJvb3Qgb2YgdGhlIEJDIGluc3RhbGxhdGlvbgorIWlmICgiJChCT1IpIj09IiIpCitCT1IgPSBjOlxiYzUKKyFlbmRpZgorCisjIyMgTElOSzogTmFtZSBvZiB0aGUgbGlua2VyOiB0bGluayBvciBpbGluazMyICh0aGlzIGlzIGJlbG93LCBkZXBlbmRzIG9uCisjICQoT1NUWVBFKQorCisjIyMgR1VJOiB5ZXMgZm9yIEdVSSB2ZXJzaW9uLCBubyBmb3IgY29uc29sZSB2ZXJzaW9uCishaWYgKCIkKEdVSSkiPT0iIikKK0dVSSA9IHllcworIWVuZGlmCisKKyMjIyBNQllURTogeWVzIGZvciBtdWx0aWJ5dGUgc3VwcG9ydCwgbm8gdG8gZGlzYWJsZSBpdC4KKyFpZiAoIiQoTUJZVEUpIj09IiIpCitNQllURSA9IHllcworIWVuZGlmCisKKyMjIyBJTUU6IHllcyBmb3IgbXVsdGlieXRlIHN1cHBvcnQsIG5vIHRvIGRpc2FibGUgaXQuCishaWYgKCIkKElNRSkiPT0iIikKK0lNRSA9IHllcworIWVuZGlmCishaWYgKCIkKERZTkFNSUNfSU1FKSI9PSIiKQorRFlOQU1JQ19JTUUgPSB5ZXMKKyFlbmRpZgorCisjIyMgR0VUVEVYVDogeWVzIGZvciBtdWx0aWxhbmd1YWdlIHN1cHBvcnQsIG5vIHRvIGRpc2FibGUgaXQuCishaWYgKCIkKEdFVFRFWFQpIj09IiIpCitHRVRURVhUID0geWVzCishZW5kaWYKKworIyMjIElDT05WOiB5ZXMgdG8gZW5hYmxlIGR5bmFtaWMtaWNvbnYgc3VwcG9ydCwgbm8gdG8gZGlzYWJsZSBpdAorIWlmICgiJChJQ09OVikiPT0iIikKK0lDT05WID0geWVzCishZW5kaWYKKworIyMjIENTQ09QRTogeWVzIHRvIGVuYWJsZSBDc2NvcGUgc3VwcG9ydCwgbm8gdG8gZGlzYWJsZSBpdAorIWlmICgiJChDU0NPUEUpIj09IiIpCitDU0NPUEUgPSB5ZXMKKyFlbmRpZgorCisjIyMgTkVUQkVBTlM6IHllcyB0byBlbmFibGUgTmV0QmVhbnMgaW50ZXJmYWNlIHN1cHBvcnQsIG5vIHRvIGRpc2FibGUgaXQKKyFpZiAoIiQoTkVUQkVBTlMpIj09IiIpICYmICgiJChHVUkpIj09InllcyIpCitORVRCRUFOUyA9IHllcworIWVuZGlmCisKKyMjIyBQRVJMOiB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IHBlcmwgc3VwcG9ydCBpbiB2aW0KKyMgUEVSTD1jOlxwZXJsCisKKyMjIyBQWVRIT046IHVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IHdhbnQgcHl0aG9uIHN1cHBvcnQgaW4gdmltCisjIFBZVEhPTj1jOlxweXRob24yMgorCisjIyMgUlVCWTogdW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3Ugd2FudCBydWJ5IHN1cHBvcnQgaW4gdmltCisjIFJVQlk9YzpccnVieQorCisjIyMgVENMOiB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IHRjbCBzdXBwb3J0IGluIHZpbQorIyBUQ0w9YzpcdGNsCisKKyMjIyBPTEU6IG5vIGZvciBub3JtYWwgZ3ZpbSwgeWVzIGZvciBPTEUtY2FwYWJsZSBndmltIChvbmx5IHdvcmtzIHdpdGggR1VJKQorI09MRSA9IHllcworCisjIyMgT1NUWVBFOiBET1MxNiBmb3IgV2luZG93cyAzLjEgdmVyc2lvbiwgV0lOMzIgZm9yIFdpbmRvd3MgOTUvOTgvTlQvMjAwMAorIyAgIHZlcnNpb24KKyFpZiAoIiQoT1NUWVBFKSI9PSIiKQorT1NUWVBFID0gV0lOMzIKKyFlbmRpZgorCisjIyMgREVCVUc6IFVuY29tbWVudCB0byBtYWtlIGFuIGV4ZWN1dGFibGUgZm9yIGRlYnVnZ2luZworIyBERUJVRyA9IHllcworIWlmICgiJChERUJVRykiPT0ieWVzIikKK0RFQlVHX0ZMQUcgPSAtdgorIWVuZGlmCisKKyMjIyBDT0RFR1VBUkQ6IFVuY29tbWVudCB0byB1c2UgdGhlIENPREVHVUFSRCBzdHVmZiAoQkMgNS4wIG9yIGxhdGVyKToKKyMgQ09ERUdVQVJEID0geWVzCishaWYgKCIkKENPREVHVUFSRCkiPT0ieWVzIikKK0NPREVHVUFSRF9GTEFHID0gLXZHCishZW5kaWYKKworIyMjIENQVU5SOiBzZXQgeW91ciB0YXJnZXQgcHJvY2Vzc29yICgzIHRvIDYpCishaWYgKCIkKENQVU5SKSIgPT0gImkzODYiKSB8fCAoIiQoQ1BVTlIpIiA9PSAiMyIpCitDUFVOUiA9IDMKKyFlbGlmICgiJChDUFVOUikiID09ICJpNDg2IikgfHwgKCIkKENQVU5SKSIgPT0gIjQiKQorQ1BVTlIgPSA0CishZWxpZiAoIiQoQ1BVTlIpIiA9PSAiaTU4NiIpIHx8ICgiJChDUFVOUikiID09ICI1IikKK0NQVU5SID0gNQorIWVsaWYgKCIkKENQVU5SKSIgPT0gImk2ODYiKSB8fCAoIiQoQ1BVTlIpIiA9PSAiNiIpCitDUFVOUiA9IDYKKyFlbHNlCitDUFVOUiA9IDMKKyFlbmRpZgorCisjIyMgQ29tbWVudCBvdXQgdG8gdXNlIHByZWNvbXBpbGVkIGhlYWRlcnMgKGZhc3RlciwgYnV0IHVzZXMgbG90cyBvZiBkaXNrISkKK0hFQURFUlMgPSAtSCAtSD12aW0uY3NtIC1IYworCisjIyMgVVNFRExMOiBubyBmb3Igc3RhdGljYWxseSBsaW5rZWQgdmVyc2lvbiBvZiBydW4tdGltZSwgeWVzIGZvciBETEwgcnVudGltZQorIWlmICgiJChVU0VETEwpIj09IiIpCitVU0VETEwgPSBubworIWVuZGlmCisKKyMjIyBWSU1ETEw6IHllcyBmb3IgYSBETEwgdmVyc2lvbiBvZiBWSU0gKE5PVCBSRUNPTU1FTkRFRCksIG5vIG90aGVyd2lzZQorI1ZJTURMTCA9IHllcworCisjIyMgQUxJR046IGFsaWdubWVudCB5b3UgZGVzaXJlOiAoMSwyIG9yIDQ6IHMvYiA0IGZvciBXaW4zMiwgMiBmb3IgRE9TKQorIWlmICgiJChBTElHTikiPT0iIikKKyFpZiAoJChPU1RZUEUpPT1ET1MxNikKK0FMSUdOID0gMgorIWVsc2UKK0FMSUdOID0gNAorIWVuZGlmCishZW5kaWYKKworIyMjIEZBU1RDQUxMOiB5ZXMgdG8gdXNlIEZBU1RDQUxMIGNhbGxpbmcgY29udmVudGlvbiAoUkVDT01NRU5ERUQhKSwgbm8gb3RoZXJ3aXNlCisjICAgSW5jb21wYXRpYmxlIHdoZW4gY2FsbGluZyBleHRlcm5hbCBmdW5jdGlvbnMgKGxpa2UgTVNWQy1jb21waWxlZCBETExzKSwgc28KKyMgICBkb24ndCB1c2UgRkFTVENBTEwgd2hlbiBsaW5raW5nIHdpdGggZXh0ZXJuYWwgbGlicy4KKyFpZiAoIiQoRkFTVENBTEwpIj09IiIpICYmIFwKKwkoIiQoUFlUSE9OKSI9PSIiKSAmJiBcCisJKCIkKFBFUkwpIj09IiIpICYmIFwKKwkoIiQoVENMKSI9PSIiKSAmJiBcCisJKCIkKFJVQlkpIj09IiIpICYmIFwKKwkoIiQoSUNPTlYpIiE9InllcyIpICYmIFwKKwkoIiQoSU1FKSIhPSJ5ZXMiKSAmJiBcCisJKCIkKE1CWVRFKSIhPSJ5ZXMiKSAmJiBcCisJKCIkKFhQTSkiPT0iIikKK0ZBU1RDQUxMID0geWVzCishZW5kaWYKKworIyMjIE9QVElNSVpFOiBTUEVFRCB0byBvcHRpbWl6ZSBmb3Igc3BlZWQsIFNQQUNFIG90aGVyd2lzZSAoU1BFRUQgUkVDT01NRU5ERUQpCishaWYgKCIkKE9QVElNSVpFKSI9PSIiKQorT1BUSU1JWkUgPSBNQVhTUEVFRAorIWVuZGlmCisKKyMjIyBGRUFUVVJFUzogVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UgKEJJRyBmb3IgV0lOMzIsIFNNQUxMIGZvciBET1MxNikKKyFpZiAoIiQoRkVBVFVSRVMpIj09IiIpCishIGlmICgkKE9TVFlQRSk9PURPUzE2KQorRkVBVFVSRVMgPSBTTUFMTAorISBlbHNlCitGRUFUVVJFUyA9IEJJRworISBlbmRpZgorIWVuZGlmCisKKyMjIyBQT1NUU0NSSVBUOiB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IFBvc3RTY3JpcHQgcHJpbnRpbmcKKyNQT1NUU0NSSVBUID0geWVzCisKKyMjIworIyBJZiB5b3UgaGF2ZSBhIGZpeGVkIGRpcmVjdG9yeSBmb3IgJFZJTSBvciAkVklNUlVOVElNRSwgb3RoZXIgdGhhbiB0aGUgbm9ybWFsCisjIGRlZmF1bHQsIHVzZSB0aGVzZSBsaW5lcy4KKyNWSU1SQ0xPQyA9IHNvbWV3aGVyZQorI1ZJTVJVTlRJTUVESVIgPSBzb21ld2hlcmUKKworIyMjIFNldCB0aGUgZGVmYXVsdCAkKFdJTlZFUikgdG8gbWFrZSBpdCB3b3JrIHdpdGggQmNjIDUuNS4KKyFpZm5kZWYgV0lOVkVSCitXSU5WRVIgPSAweDA0MDAKKyFlbmRpZgorCisjCisjIFNhbml0eSBjaGVja3MgZm9yIHRoZSBhYm92ZSBvcHRpb25zOgorIworCishaWYgKCQoT1NUWVBFKT09RE9TMTYpCishaWYgKCgkKENQVU5SKSswKT40KQorIWVycm9yIENQVU5SIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDQgZm9yIERPUzE2CishZW5kaWYKKworIWlmICgoJChBTElHTikrMCk+MikKKyFlcnJvciBBTElHTiBNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyIGZvciBET1MxNgorIWVuZGlmCisKKyFlbHNlCSMgbm90IERPUzE2CishaWYgKCgkKENQVU5SKSswKTwzKQorIWVycm9yIENQVU5SIE11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAzIGZvciBXSU4zMgorIWVuZGlmCishZW5kaWYKKworIWlmICgkKE9TVFlQRSkhPVdJTjMyKSAmJiAoJChPU1RZUEUpIT1ET1MxNikKKyFlcnJvciBDaGVjayB0aGUgT1NUWVBFIHZhcmlhYmxlIGFnYWluOiAkKE9TVFlQRSkgaXMgbm90IHN1cHBvcnRlZCEKKyFlbmRpZgorCisjCisjIE9wdGltaXphdGlvbnM6IGNoYW5nZSBhcyBkZXNpcmVkIChSRUNPTU1FTkRBVElPTjogRG9uJ3QgY2hhbmdlISk6CisjCishaWYgKCIkKERFQlVHKSI9PSJ5ZXMiKQorT1BUID0gLU9kIC1OCishZWxzZQorIWlmICgiJChPUFRJTUlaRSkiPT0iU1BBQ0UiKQorT1BUID0gLU8xIC1mLSAtZAorIWVsaWYgKCIkKE9QVElNSVpFKSI9PSJNQVhTUEVFRCIpCitPUFQgPSAtTzIgLWYtIC1kIC1PY2F2aSAtTworIWVsc2UKK09QVCA9IC1PMiAtZi0gLWQgLU9jIC1PCishZW5kaWYKKyFpZiAoIiQoRkFTVENBTEwpIj09InllcyIpCitPUFQgPSAkKE9QVCkgLXByCishZW5kaWYKKyFpZiAoIiQoQ09ERUdVQVJEKSIhPSJ5ZXMiKQorT1BUID0gJChPUFQpIC12aS0KKyFlbmRpZgorIWVuZGlmCishaWYgKCQoT1NUWVBFKT09RE9TMTYpCishdW5kZWYgR1VJCishdW5kZWYgVklNRExMCishdW5kZWYgVVNFRExMCishZW5kaWYKKyMgc2hvdWxkbid0IGhhdmUgdG8gY2hhbmdlOgorTElCID0gJChCT1IpXGxpYgorSU5DTFVERSA9ICQoQk9SKVxpbmNsdWRlOy47cHJvdG8KK0RFRklORVMgPSAtREZFQVRfJChGRUFUVVJFUykgLURXSU4zMiAtREhBVkVfUEFUSERFRiBcCisJICAtRFdJTlZFUj0kKFdJTlZFUikgLURfV0lOMzJfV0lOTlQ9JChXSU5WRVIpCisKKyFpZmRlZiBQRVJMCitJTlRFUlBfREVGSU5FUyA9ICQoSU5URVJQX0RFRklORVMpIC1ERkVBVF9QRVJMCitJTkNMVURFID0gJChQRVJMKVxsaWJcY29yZTskKElOQ0xVREUpCishICBpZm5kZWYgUEVSTF9WRVIKK1BFUkxfVkVSID0gNTYKKyEgIGVuZGlmCishICBpZiAoIiQoRFlOQU1JQ19QRVJMKSIgPT0gInllcyIpCishICAgIGlmICgkKFBFUkxfVkVSKSA+IDU1KQorSU5URVJQX0RFRklORVMgPSAkKElOVEVSUF9ERUZJTkVTKSAtRERZTkFNSUNfUEVSTCAtRERZTkFNSUNfUEVSTF9ETEw9XCJwZXJsJChQRVJMX1ZFUikuZGxsXCIKK1BFUkxfTElCX0ZMQUcgPSAvbm9kZWZhdWx0bGliOgorISAgICBlbHNlCishICAgICAgbWVzc2FnZSAiQ2Fubm90IGR5bmFtaWNhbGx5IGxvYWQgUGVybCB2ZXJzaW9ucyBsZXNzIHRoYW4gNS42LiAgTG9hZGluZyBzdGF0aWNhbGx5Li4uIgorISAgICBlbmRpZgorISAgZW5kaWYKKyFlbmRpZgorCishaWZkZWYgUFlUSE9OCitJTlRFUlBfREVGSU5FUyA9ICQoSU5URVJQX0RFRklORVMpIC1ERkVBVF9QWVRIT04KK0lOQ0xVREUgPSAkKFBZVEhPTilcaW5jbHVkZTskKElOQ0xVREUpCishaWZuZGVmIFBZVEhPTl9WRVIKK1BZVEhPTl9WRVIgPSAyMgorIWVuZGlmCishaWYgIiQoRFlOQU1JQ19QWVRIT04pIiA9PSAieWVzIgorSU5URVJQX0RFRklORVMgPSAkKElOVEVSUF9ERUZJTkVTKSAtRERZTkFNSUNfUFlUSE9OIC1ERFlOQU1JQ19QWVRIT05fRExMPVwicHl0aG9uJChQWVRIT05fVkVSKS5kbGxcIgorUFlUSE9OX0xJQl9GTEFHID0gL25vZGVmYXVsdGxpYjoKKyFlbmRpZgorIWVuZGlmCisKKyFpZmRlZiBSVUJZCishaWZuZGVmIFJVQllfVkVSCitSVUJZX1ZFUiA9IDE2CishZW5kaWYKKyFpZm5kZWYgUlVCWV9WRVJfTE9ORworUlVCWV9WRVJfTE9ORyA9IDEuNgorIWVuZGlmCisKKyFpZiAiJChSVUJZX1ZFUikiID09ICIxNiIKKyFpZm5kZWYgUlVCWV9QTEFURk9STQorUlVCWV9QTEFURk9STSA9IGk1ODYtbXN3aW4zMgorIWVuZGlmCishaWZuZGVmIFJVQllfSU5TVEFMTF9OQU1FCitSVUJZX0lOU1RBTExfTkFNRSA9IG1zd2luMzItcnVieSQoUlVCWV9WRVIpCishZW5kaWYKKyFlbHNlCishaWZuZGVmIFJVQllfUExBVEZPUk0KK1JVQllfUExBVEZPUk0gPSBpMzg2LW1zd2luMzIKKyFlbmRpZgorIWlmbmRlZiBSVUJZX0lOU1RBTExfTkFNRQorUlVCWV9JTlNUQUxMX05BTUUgPSBtc3ZjcnQtcnVieSQoUlVCWV9WRVIpCishZW5kaWYKKyFlbmRpZgorCitJTlRFUlBfREVGSU5FUyA9ICQoSU5URVJQX0RFRklORVMpIC1ERkVBVF9SVUJZCitJTkNMVURFID0gJChSVUJZKVxsaWJccnVieVwkKFJVQllfVkVSX0xPTkcpXCQoUlVCWV9QTEFURk9STSk7JChJTkNMVURFKQorCishaWYgIiQoRFlOQU1JQ19SVUJZKSIgPT0gInllcyIKK0lOVEVSUF9ERUZJTkVTID0gJChJTlRFUlBfREVGSU5FUykgLUREWU5BTUlDX1JVQlkgLUREWU5BTUlDX1JVQllfRExMPVwiJChSVUJZX0lOU1RBTExfTkFNRSkuZGxsXCIKK0lOVEVSUF9ERUZJTkVTID0gJChJTlRFUlBfREVGSU5FUykgLUREWU5BTUlDX1JVQllfVkVSPSQoUlVCWV9WRVIpCitSVUJZX0xJQl9GTEFHID0gL25vZGVmYXVsdGxpYjoKKyFlbmRpZgorIWVuZGlmCisKKyFpZmRlZiBUQ0wKK0lOVEVSUF9ERUZJTkVTID0gJChJTlRFUlBfREVGSU5FUykgLURGRUFUX1RDTAorSU5DTFVERSA9ICQoVENMKVxpbmNsdWRlOyQoSU5DTFVERSkKKyFpZm5kZWYgVENMX1ZFUgorVENMX1ZFUiA9IDgzCishZW5kaWYKK1RDTF9MSUIgPSAkKFRDTClcbGliXHRjbCQoVENMX1ZFUikubGliCitUQ0xfTElCX0ZMQUcgPQorIWlmICIkKERZTkFNSUNfVENMKSIgPT0gInllcyIKK0lOVEVSUF9ERUZJTkVTID0gJChJTlRFUlBfREVGSU5FUykgLUREWU5BTUlDX1RDTCAtRERZTkFNSUNfVENMX0RMTD1cInRjbCQoVENMX1ZFUikuZGxsXCIKK1RDTF9MSUIgPSB0Y2xzdHViJChUQ0xfVkVSKS1ib3IubGliCitUQ0xfTElCX0ZMQUcgPQorIWVuZGlmCishZW5kaWYKKyMKKyMgRE8gTk9UIGNoYW5nZSBiZWxvdzoKKyMKK0NQVUFSRyA9IC0kKENQVU5SKQorQUxJR05BUkcgPSAtYSQoQUxJR04pCisjCishaWYgKCIkKERFQlVHKSI9PSJ5ZXMiKQorREVGSU5FUz0kKERFRklORVMpIC1EREVCVUcKKyFlbmRpZgorIworIWlmICgiJChPTEUpIj09InllcyIpCitERUZJTkVTID0gJChERUZJTkVTKSAtREZFQVRfT0xFCishZW5kaWYKKyMKKyFpZiAoIiQoTUJZVEUpIj09InllcyIpCitNQkRFRklORVMgPSAkKE1CREVGSU5FUykgLURGRUFUX01CWVRFCishZW5kaWYKKyFpZiAoIiQoSU1FKSI9PSJ5ZXMiKQorTUJERUZJTkVTID0gJChNQkRFRklORVMpIC1ERkVBVF9NQllURV9JTUUKKyFpZiAoIiQoRFlOQU1JQ19JTUUpIiA9PSAieWVzIikKK01CREVGSU5FUyA9ICQoTUJERUZJTkVTKSAtRERZTkFNSUNfSU1FCishZW5kaWYKKyFlbmRpZgorIWlmICgiJChJQ09OVikiPT0ieWVzIikKK01CREVGSU5FUyA9ICQoTUJERUZJTkVTKSAtRERZTkFNSUNfSUNPTlYKKyFlbmRpZgorIWlmICgiJChHRVRURVhUKSI9PSJ5ZXMiKQorTUJERUZJTkVTID0gJChNQkRFRklORVMpIC1ERFlOQU1JQ19HRVRURVhUCishZW5kaWYKKworIWlmICgiJChDU0NPUEUpIj09InllcyIpCitERUZJTkVTID0gJChERUZJTkVTKSAtREZFQVRfQ1NDT1BFCishZW5kaWYKKworIWlmICgiJChORVRCRUFOUykiPT0ieWVzIikKK0RFRklORVMgPSAkKERFRklORVMpIC1ERkVBVF9ORVRCRUFOU19JTlRHCishaWYgKCIkKERFQlVHKSI9PSJ5ZXMiKQorREVGSU5FUyA9ICQoREVGSU5FUykgLUROQkRFQlVHCitOQkRFQlVHX0RFUCA9IG5iZGVidWcuaCBuYmRlYnVnLmMKKyFlbmRpZgorIWVuZGlmCisKKyFpZmRlZiBYUE0KK0RFRklORVMgPSAkKERFRklORVMpIC1ERkVBVF9YUE1fVzMyCitJTkNMVURFID0gJChYUE0pXGluY2x1ZGU7JChJTkNMVURFKQorIWVuZGlmCisKKyFpZiAoIiQoR1VJKSI9PSJ5ZXMiKQorREVGSU5FUyA9ICQoREVGSU5FUykgLURGRUFUX0dVSV9XMzIgLURGRUFUX0NMSVBCT0FSRAorIWlmICgiJChERUJVRykiPT0ieWVzIikKK1RBUkdFVCA9IGd2aW1kLmV4ZQorIWVsc2UKK1RBUkdFVCA9IGd2aW0uZXhlCishZW5kaWYKKyFpZiAoIiQoVklNRExMKSI9PSJ5ZXMiKQorRVhFVFlQRT0tV0QKK0RFRklORVMgPSAkKERFRklORVMpIC1EVklNRExMCishZWxzZQorRVhFVFlQRT0tVworIWVuZGlmCitTVEFSVFVQT0JKID0gYzB3MzIub2JqCitMSU5LMiA9IC1hYQorUkVTRklMRSA9IHZpbS5yZXMKKyFlbHNlCishaWYgKCIkKERFQlVHKSI9PSJ5ZXMiKQorVEFSR0VUID0gdmltZC5leGUKKyFlbHNlCisjIGZvciBub3csIGFueXdheTogVklNRExMIGlzIG9ubHkgZm9yIHRoZSBHVUkgdmVyc2lvbgorIXVuZGVmIFZJTURMTAorVEFSR0VUID0gdmltLmV4ZQorIWVuZGlmCishaWYgKCQoT1NUWVBFKT09RE9TMTYpCitERUZJTkVTPSAtREZFQVRfJChGRUFUVVJFUykgLURNU0RPUworRVhFVFlQRT0tbWwKK1NUQVJUVVBPQkogPSBjMGwub2JqCitMSU5LMiA9CishZWxzZQorRVhFVFlQRT0tV0MKK1NUQVJUVVBPQkogPSBjMHgzMi5vYmoKK0xJTksyID0gLWFwIC1PUyAtbyAtUAorIWVuZGlmCitSRVNGSUxFID0gdmltLnJlcworIWVuZGlmCisKKyFpZiAoIiQoVVNFRExMKSI9PSJ5ZXMiKQorREVGSU5FUyA9ICQoREVGSU5FUykgLURfUlRMRExMCishZW5kaWYKKworIWlmICgiJChERUJVRykiPT0ieWVzIikKK09CSkRJUgk9ICQoT1NUWVBFKVxvYmpkYmcKKyFlbHNlCishaWYgKCIkKEdVSSkiPT0ieWVzIikKKyFpZiAoIiQoT0xFKSI9PSJ5ZXMiKQorT0JKRElSCT0gJChPU1RZUEUpXG9sZW9iagorIWVsc2UKK09CSkRJUgk9ICQoT1NUWVBFKVxnb2JqCishZW5kaWYKKyFlbHNlCitPQkpESVIJPSAkKE9TVFlQRSlcb2JqCishZW5kaWYKKyFlbmRpZgorCishaWYgKCIkKFBPU1RTQ1JJUFQpIj09InllcyIpCitERUZJTkVTID0gJChERUZJTkVTKSAtRE1TV0lOUFMKKyFlbmRpZgorCisjIyMjIyBCQVNFIENPTVBJTEVSL1RPT0xTIFJVTEVTICMjIyMjCitNQUtFID0gJChCT1IpXGJpblxtYWtlCitDRkxBR1MgPSAtdy1hdXMgLXctcGFyIC13LXBjaCAtdy1uZ3UgLXctY3N1IC1JJChJTkNMVURFKQorIWlmICgkKE9TVFlQRSk9PURPUzE2KQorQlJDID0KKyFpZiAoIiQoTElOSykiPT0iIikKK0xJTksJPSAkKEJPUilcQklOXFRMaW5rCishZW5kaWYKK0NDICAgPSAkKEJPUilcQklOXEJjYworTEZMQUdTCT0gLVRkZSAtYyAtbSAtTCQoTElCKSAkKERFQlVHX0ZMQUcpICQoTElOSzIpCitMRkxBR1NETEwgID0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtSC0gJChIRUFERVJTKQorIWVsc2UKK0JSQyA9ICQoQk9SKVxCSU5cYnJjMzIKKyFpZiAoIiQoTElOSykiPT0iIikKK0xJTksJPSAkKEJPUilcQklOXElMaW5rMzIKKyFlbmRpZgorQ0MgICA9ICQoQk9SKVxCSU5cQmNjMzIKK0xGTEFHUwk9IC1PUyAtVHBlIC1jIC1tIC1MJChMSUIpICQoREVCVUdfRkxBRykgJChMSU5LMikKK0xGTEFHU0RMTCAgPSAtVHBkIC1jIC1tIC1MJChMSUIpICQoREVCVUdfRkxBRykgJChMSU5LMikKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtZCAtUlQtIC1rLSAtT2kgJChIRUFERVJTKSAtZi0KKyFlbmRpZgorCitDQzEgPSAtYworQ0MyID0gLW8KK0NDQVJHID0gKyQoT0JKRElSKVxiY2MuY2ZnCisKKyMgaW1wbGljaXQgcnVsZXM6CisKKyMgV2l0aG91dCB0aGUgZm9sbG93aW5nLCB0aGUgaW1wbGljaXQgcnVsZSBpbiBCVUlMVElOUy5NQUsgaXMgcGlja2VkIHVwCisjIGZvciBhIHJ1bGUgZm9yIC5jLm9iaiByYXRoZXIgdGhhbiB0aGUgbG9jYWwgaW1wbGljaXQgcnVsZQorLlNVRkZJWEVTCisuU1VGRklYRVMgLmMgLm9iagorLnBhdGguYyA9IC4KKworey59LmN7JChPQkpESVIpfS5vYmo6CisJJChDQykgJChDQ0FSRykgJChDQzEpIC1uJChPQkpESVIpXCB7JDwgfQorCisuY3BwLm9iajoKKwkkKENDKSAkKENDQVJHKSAkKENDMSkgJChDQzIpJEAgJCouY3BwCisKKyFpZiAoJChPU1RZUEUpPT1ET1MxNikKKyFlbHNlICMgd2luMzI6Cit2aW1tYWluID0gXAorCSQoT0JKRElSKVxvc193MzJleGUub2JqCishaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKK3ZpbXdpbm1haW4gPSBcCisJJChPQkpESVIpXG9zX3czMmRsbC5vYmoKKyFlbHNlCit2aW13aW5tYWluID0gXAorCSQoT0JKRElSKVxvc193MzJleGUub2JqCishZW5kaWYKKyFlbmRpZgorCit2aW1vYmogPSAgXAorCSQoT0JKRElSKVxidWZmZXIub2JqIFwKKwkkKE9CSkRJUilcY2hhcnNldC5vYmogXAorCSQoT0JKRElSKVxkaWZmLm9iaiBcCisJJChPQkpESVIpXGRpZ3JhcGgub2JqIFwKKwkkKE9CSkRJUilcZWRpdC5vYmogXAorCSQoT0JKRElSKVxldmFsLm9iaiBcCisJJChPQkpESVIpXGV4X2NtZHMub2JqIFwKKwkkKE9CSkRJUilcZXhfY21kczIub2JqIFwKKwkkKE9CSkRJUilcZXhfZG9jbWQub2JqIFwKKwkkKE9CSkRJUilcZXhfZXZhbC5vYmogXAorCSQoT0JKRElSKVxleF9nZXRsbi5vYmogXAorCSQoT0JKRElSKVxmaWxlaW8ub2JqIFwKKwkkKE9CSkRJUilcZm9sZC5vYmogXAorCSQoT0JKRElSKVxnZXRjaGFyLm9iaiBcCisJJChPQkpESVIpXG1haW4ub2JqIFwKKwkkKE9CSkRJUilcbWFyay5vYmogXAorCSQoT0JKRElSKVxtZW1maWxlLm9iaiBcCisJJChPQkpESVIpXG1lbWxpbmUub2JqIFwKKwkkKE9CSkRJUilcbWVudS5vYmogXAorCSQoT0JKRElSKVxtZXNzYWdlLm9iaiBcCisJJChPQkpESVIpXG1pc2MxLm9iaiBcCisJJChPQkpESVIpXG1pc2MyLm9iaiBcCisJJChPQkpESVIpXG1vdmUub2JqIFwKKwkkKE9CSkRJUilcbWJ5dGUub2JqIFwKKwkkKE9CSkRJUilcbm9ybWFsLm9iaiBcCisJJChPQkpESVIpXG9wcy5vYmogXAorCSQoT0JKRElSKVxvcHRpb24ub2JqIFwKKwkkKE9CSkRJUilccXVpY2tmaXgub2JqIFwKKwkkKE9CSkRJUilccmVnZXhwLm9iaiBcCisJJChPQkpESVIpXHNjcmVlbi5vYmogXAorCSQoT0JKRElSKVxzZWFyY2gub2JqIFwKKwkkKE9CSkRJUilcc3ludGF4Lm9iaiBcCisJJChPQkpESVIpXHRhZy5vYmogXAorCSQoT0JKRElSKVx0ZXJtLm9iaiBcCisJJChPQkpESVIpXHVpLm9iaiBcCisJJChPQkpESVIpXHVuZG8ub2JqIFwKKwkkKE9CSkRJUilcdmVyc2lvbi5vYmogXAorCSQoT0JKRElSKVx3aW5kb3cub2JqIFwKKwkkKE9CSkRJUilccGF0aGRlZi5vYmoKKworIWlmICgiJChPTEUpIj09InllcyIpCit2aW1vYmogPSAkKHZpbW9iaikgXAorCSQoT0JKRElSKVxpZl9vbGUub2JqCishZW5kaWYKKworIWlmZGVmIFBFUkwKK3ZpbW9iaiA9ICQodmltb2JqKSBcCisgICAgJChPQkpESVIpXGlmX3Blcmwub2JqCishZW5kaWYKKworIWlmZGVmIFBZVEhPTgordmltb2JqID0gJCh2aW1vYmopIFwKKyAgICAkKE9CSkRJUilcaWZfcHl0aG9uLm9iagorIWVuZGlmCisKKyFpZmRlZiBSVUJZCit2aW1vYmogPSAkKHZpbW9iaikgXAorICAgICQoT0JKRElSKVxpZl9ydWJ5Lm9iagorIWVuZGlmCisKKyFpZmRlZiBUQ0wKK3ZpbW9iaiA9ICQodmltb2JqKSBcCisgICAgJChPQkpESVIpXGlmX3RjbC5vYmoKKyFlbmRpZgorCishaWYgKCIkKENTQ09QRSkiPT0ieWVzIikKK3ZpbW9iaiA9ICQodmltb2JqKSBcCisgICAgJChPQkpESVIpXGlmX2NzY29wZS5vYmoKKyFlbmRpZgorCishaWYgKCIkKE5FVEJFQU5TKSI9PSJ5ZXMiKQordmltb2JqID0gJCh2aW1vYmopIFwKKyAgICAkKE9CSkRJUilcbmV0YmVhbnMub2JqICQoT0JKRElSKVxndWlfYmV2YWwub2JqCishZW5kaWYKKworIWlmZGVmIFhQTQordmltb2JqID0gJCh2aW1vYmopIFwKKyAgICAkKE9CSkRJUilceHBtX3czMi5vYmoKKyFlbmRpZgorCishaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKK3ZpbWRsbG9iaiA9ICQodmltb2JqKQorIWlmICgiJChERUJVRykiPT0ieWVzIikKK0RMTFRBUkdFVCA9IHZpbTMyZC5kbGwKKyFlbHNlCitETExUQVJHRVQgPSB2aW0zMi5kbGwKKyFlbmRpZgorIWVsc2UKK0RMTFRBUkdFVCA9IGpvZWJvYgorIWVuZGlmCisKKyFpZiAoIiQoR1VJKSI9PSJ5ZXMiKQordmltb2JqID0gJCh2aW1vYmopIFwKKwkkKHZpbXdpbm1haW4pIFwKKwkkKE9CSkRJUilcZ3VpLm9iaiBcCisJJChPQkpESVIpXGd1aV93MzIub2JqCishZW5kaWYKKworIWlmICgkKE9TVFlQRSk9PVdJTjMyKQordmltb2JqID0gJCh2aW1vYmopIFwKKwkkKE9CSkRJUilcb3Nfd2luMzIub2JqICQoT0JKRElSKVxvc19tc3dpbi5vYmoKKyFlbGlmICgkKE9TVFlQRSk9PURPUzE2KQordmltb2JqID0gJCh2aW1vYmopIFwKKwkkKE9CSkRJUilcb3NfbXNkb3Mub2JqCishZW5kaWYKKyMgQmxhYiB3aGF0IHdlIGFyZSBnb2luZyB0byBkbzoKK01TRyA9IENvbXBpbGluZyAkKE9TVFlQRSkgJChUQVJHRVQpICQoT0xFVEFSR0VUKSwgd2l0aDoKKyFpZiAoIiQoR1VJKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIEdVSQorIWVuZGlmCishaWYgKCIkKE9MRSkiPT0ieWVzIikKK01TRyA9ICQoTVNHKSBPTEUKKyFlbmRpZgorIWlmICgiJChVU0VETEwpIj09InllcyIpCitNU0cgPSAkKE1TRykgVVNFRExMCishZW5kaWYKKyFpZiAoIiQoVklNRExMKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIFZJTURMTAorIWVuZGlmCishaWYgKCIkKEZBU1RDQUxMKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIEZBU1RDQUxMCishZW5kaWYKKyFpZiAoIiQoTUJZVEUpIj09InllcyIpCitNU0cgPSAkKE1TRykgTUJZVEUKKyFlbmRpZgorIWlmICgiJChJTUUpIj09InllcyIpCitNU0cgPSAkKE1TRykgSU1FCishIGlmICIkKERZTkFNSUNfSU1FKSIgPT0gInllcyIKK01TRyA9ICQoTVNHKShkeW5hbWljKQorISBlbmRpZgorIWVuZGlmCishaWYgKCIkKEdFVFRFWFQpIj09InllcyIpCitNU0cgPSAkKE1TRykgR0VUVEVYVAorIWVuZGlmCishaWYgKCIkKElDT05WKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIElDT05WCishZW5kaWYKKyFpZiAoIiQoREVCVUcpIj09InllcyIpCitNU0cgPSAkKE1TRykgREVCVUcKKyFlbmRpZgorIWlmICgiJChDT0RFR1VBUkQpIj09InllcyIpCitNU0cgPSAkKE1TRykgQ09ERUdVQVJECishZW5kaWYKKyFpZiAoIiQoQ1NDT1BFKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIENTQ09QRQorIWVuZGlmCishaWYgKCIkKE5FVEJFQU5TKSI9PSJ5ZXMiKQorTVNHID0gJChNU0cpIE5FVEJFQU5TCishZW5kaWYKKyFpZmRlZiBYUE0KK01TRyA9ICQoTVNHKSBYUE0KKyFlbmRpZgorIWlmZGVmIFBFUkwKK01TRyA9ICQoTVNHKSBQRVJMCishIGlmICIkKERZTkFNSUNfUEVSTCkiID09ICJ5ZXMiCitNU0cgPSAkKE1TRykoZHluYW1pYykKKyEgZW5kaWYKKyFlbmRpZgorIWlmZGVmIFBZVEhPTgorTVNHID0gJChNU0cpIFBZVEhPTgorISBpZiAiJChEWU5BTUlDX1BZVEhPTikiID09ICJ5ZXMiCitNU0cgPSAkKE1TRykoZHluYW1pYykKKyEgZW5kaWYKKyFlbmRpZgorIWlmZGVmIFJVQlkKK01TRyA9ICQoTVNHKSBSVUJZCishIGlmICIkKERZTkFNSUNfUlVCWSkiID09ICJ5ZXMiCitNU0cgPSAkKE1TRykoZHluYW1pYykKKyEgZW5kaWYKKyFlbmRpZgorIWlmZGVmIFRDTAorTVNHID0gJChNU0cpIFRDTAorISBpZiAiJChEWU5BTUlDX1RDTCkiID09ICJ5ZXMiCitNU0cgPSAkKE1TRykoZHluYW1pYykKKyEgZW5kaWYKKyFlbmRpZgorTVNHID0gJChNU0cpIGNwdT0kKENQVUFSRykKK01TRyA9ICQoTVNHKSBBbGlnbj0kKEFMSUdOQVJHKQorCishbWVzc2FnZSAkKE1TRykKKworIWlmICgkKE9TVFlQRSk9PURPUzE2KQorVEFSR0VUUyA9ICQoVEFSR0VUKQorIWVsc2UKKyFpZiAoIiQoVklNRExMKSI9PSJ5ZXMiKQorVEFSR0VUUyA9ICQoRExMVEFSR0VUKQorIWVuZGlmCitUQVJHRVRTID0gJChUQVJHRVRTKSAkKFRBUkdFVCkKKyFlbmRpZgorCisjIFRhcmdldHM6CithbGw6IHZpbSB2aW1ydW4uZXhlIGluc3RhbGwuZXhlIHh4ZCB1bmluc3RhbC5leGUgR3ZpbUV4dC9ndmltZXh0LmRsbAorCit2aW06ICQoT1NUWVBFKSAkKE9CSkRJUikgJChPQkpESVIpXGJjYy5jZmcgJChUQVJHRVRTKQorCUBpZiBleGlzdCAkKE9CSkRJUilcdmVyc2lvbi5vYmogZGVsICQoT0JKRElSKVx2ZXJzaW9uLm9iagorCUBpZiBleGlzdCBhdXRvXHBhdGhkZWYuYyBkZWwgYXV0b1xwYXRoZGVmLmMKKworJChPU1RZUEUpOgorCS1AbWQgJChPU1RZUEUpCisKKyQoT0JKRElSKToKKwktQG1kICQoT0JKRElSKQorCit4eGQ6CisJQGNkIHh4ZAorCSQoTUFLRSkgL2YgTWFrZV9iYzUubWFrIEJPUj0iJChCT1IpIiBCQ0M9IiQoQ0MpIgorCUBjZCAuLgorCitHdmltRXh0L2d2aW1leHQuZGxsOiBHdmltRXh0L2d2aW1leHQuY3BwIEd2aW1FeHQvZ3ZpbWV4dC5yYyBHdmltRXh0L2d2aW1leHQuaAorCWNkIEd2aW1FeHQKKwkkKE1BS0UpIC9mIE1ha2VfYmM1Lm1hayBVU0VETEw9JChVU0VETEwpIEJPUj0kKEJPUikKKwljZCAuLgorCitpbnN0YWxsLmV4ZTogZG9zaW5zdC5jICQoT0JKRElSKVxiY2MuY2ZnCishaWYgKCQoT1NUWVBFKT09V0lOMzIpCisJJChDQykgJChDQ0FSRykgLVdDIC1EV0lOMzIgLWVpbnN0YWxsIGRvc2luc3QuYworIWVsc2UKKwkkKENDKSAkKENDQVJHKSAtV0MgLWVpbnN0YWxsIGRvc2luc3QuYworIWVuZGlmCisKK3VuaW5zdGFsLmV4ZTogdW5pbnN0YWwuYyAkKE9CSkRJUilcYmNjLmNmZworIWlmICgkKE9TVFlQRSk9PVdJTjMyKQorCSQoQ0MpICQoQ0NBUkcpIC1XQyAtRFdJTjMyIC1PMiAtZXVuaW5zdGFsIHVuaW5zdGFsLmMKKyFlbHNlCisJJChDQykgJChDQ0FSRykgLVdDIC1PMiAtZXVuaW5zdGFsIHVuaW5zdGFsLmMKKyFlbmRpZgorCitjbGVhbjoKKyFpZiAiJChPUykiID09ICJXaW5kb3dzX05UIgorCSMgRm9yIFdpbmRvd3MgTlQvMjAwMCwgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MgOTUvOTguLi4KKwkjICQoQ09NU1BFQykgbmVlZGVkIHRvIGVuc3VyZSBybWRpci5leGUgaXMgbm90IHJ1bgorCS1AJChDT01TUEVDKSAvQyBybWRpciAvUSAvUyAkKE9CSkRJUikKKyFlbHNlCisJIyBGb3IgV2luZG93cyA5NS85OCwgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MgTlQvMjAwMC4uLgorCS1AZGVsdHJlZSAveSAkKE9CSkRJUikKKyFlbmRpZgorCS1AZGVsICoucmVzCisJLUBkZWwgdmltMzIqLmRsbAorCS1AZGVsIHZpbTMyKi5saWIKKwktQGRlbCAqdmltKi5leGUKKwktQGRlbCAqaW5zdGFsbCouZXhlCisJLUBkZWwgKi5jc20KKwktQGRlbCAqLm1hcAorCS1AZGVsICouaWxjCisJLUBkZWwgKi5pbGQKKwktQGRlbCAqLmlsZgorCS1AZGVsICouaWxzCisJLUBkZWwgKi50ZHMKKyFpZmRlZiBQRVJMCisJLUBkZWwgcGVybC5saWIKKyFlbmRpZgorIWlmZGVmIFBZVEhPTgorCS1AZGVsIHB5dGhvbi5saWIKKyFlbmRpZgorIWlmZGVmIFJVQlkKKwktQGRlbCBydWJ5LmxpYgorIWVuZGlmCishaWZkZWYgVENMCisJLUBkZWwgdGNsLmxpYgorIWVuZGlmCishaWZkZWYgWFBNCisJLUBkZWwgeHBtLmxpYgorIWVuZGlmCisJY2QgeHhkCisJJChNQUtFKSAvZiBNYWtlX2JjNS5tYWsgQk9SPSIkKEJPUikiIGNsZWFuCisJY2QgLi4KKwljZCBHdmltRXh0CisJJChNQUtFKSAvZiBNYWtlX2JjNS5tYWsgQk9SPSIkKEJPUikiIGNsZWFuCisJY2QgLi4KKworJChETExUQVJHRVQpOiAkKE9CSkRJUikgJCh2aW1kbGxvYmopCisgICQoTElOSykgQCYmfAorCSQoTEZMQUdTRExMKSArCisJYzBkMzIub2JqICsKKwkkKHZpbWRsbG9iaikKKwkkPCwkKgorIWlmICgiJChDT0RFR1VBUkQpIj09InllcyIpCisJY2czMi5saWIrCishZW5kaWYKKyMgJChPU1RZUEUpPT1XSU4zMiBjYXVzZXMgb3NfbXN3aW4uYyBjb21waWxhdGlvbi4gRkVBVF9TSE9SVENVVCBpbiBpdCBuZWVkcyBPTEUKKyFpZiAoIiQoT0xFKSI9PSJ5ZXMiIHx8ICQoT1NUWVBFKT09V0lOMzIpCisJb2xlMnczMi5saWIgKworIWVuZGlmCishaWYgKCQoT1NUWVBFKT09V0lOMzIpCisJaW1wb3J0MzIubGliKworIWlmZGVmIFBFUkwKKwkkKFBFUkxfTElCX0ZMQUcpcGVybC5saWIrCishZW5kaWYKKyFpZmRlZiBQWVRIT04KKwkkKFBZVEhPTl9MSUJfRkxBRylweXRob24ubGliKworIWVuZGlmCishaWZkZWYgUlVCWQorCSQoUlVCWV9MSUJfRkxBRylydWJ5LmxpYisKKyFlbmRpZgorIWlmZGVmIFRDTAorCSQoVENMX0xJQl9GTEFHKXRjbC5saWIrCishZW5kaWYKKyFpZmRlZiBYUE0KKwl4cG0ubGliKworIWVuZGlmCishaWYgKCIkKFVTRURMTCkiPT0ieWVzIikKKwljdzMyaS5saWIKKyFlbHNlCisJY3czMi5saWIKKyFlbmRpZgorCXZpbS5kZWYKKyFlbHNlCisJY2wubGliCishZW5kaWYKK3wKKworIWlmICgiJChWSU1ETEwpIj09InllcyIpCiskKFRBUkdFVCk6ICQoT0JKRElSKSAkKERMTFRBUkdFVCkgJCh2aW1tYWluKSAkKE9CSkRJUilcJChSRVNGSUxFKQorIWVsc2UKKyQoVEFSR0VUKTogJChPQkpESVIpICQodmltb2JqKSAkKE9CSkRJUilcJChSRVNGSUxFKQorIWVuZGlmCisgICQoTElOSykgQCYmfAorCSQoTEZMQUdTKSArCisJJChTVEFSVFVQT0JKKSArCishaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKKwkkKHZpbW1haW4pCishZWxzZQorCSQodmltb2JqKQorIWVuZGlmCisJJDwsJCoKKyFpZiAoJChPU1RZUEUpPT1XSU4zMikKKyFpZiAoIiQoQ09ERUdVQVJEKSI9PSJ5ZXMiKQorCWNnMzIubGliKworIWVuZGlmCisjICQoT1NUWVBFKT09V0lOMzIgY2F1c2VzIG9zX21zd2luLmMgY29tcGlsYXRpb24uIEZFQVRfU0hPUlRDVVQgaW4gaXQgbmVlZHMgT0xFCishaWYgKCIkKE9MRSkiPT0ieWVzIiB8fCAkKE9TVFlQRSk9PVdJTjMyKQorCW9sZTJ3MzIubGliICsKKyFlbmRpZgorCWltcG9ydDMyLmxpYisKKyFpZmRlZiBQRVJMCisJJChQRVJMX0xJQl9GTEFHKXBlcmwubGliKworIWVuZGlmCishaWZkZWYgUFlUSE9OCisJJChQWVRIT05fTElCX0ZMQUcpcHl0aG9uLmxpYisKKyFlbmRpZgorIWlmZGVmIFJVQlkKKwkkKFJVQllfTElCX0ZMQUcpcnVieS5saWIrCishZW5kaWYKKyFpZmRlZiBUQ0wKKwkkKFRDTF9MSUJfRkxBRyl0Y2wubGliKworIWVuZGlmCishaWZkZWYgWFBNCisJeHBtLmxpYisKKyFlbmRpZgorIWlmICgiJChVU0VETEwpIj09InllcyIpCisJY3czMmkubGliCishZWxzZQorCWN3MzIubGliCishZW5kaWYKKworCSQoT0JKRElSKVwkKFJFU0ZJTEUpCishZWxzZQorCWVtdS5saWIgKyBjbC5saWIKKyFlbmRpZgorfAorCit0ZXN0OgorCWNkIHRlc3RkaXIKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZV9kb3MubWFrIHdpbjMyCisJY2QgLi4KKworJChPQkpESVIpXGV4X2RvY21kLm9iajogIGV4X2RvY21kLmMgZXhfY21kcy5oCisKKyQoT0JKRElSKVxleF9ldmFsLm9iajogIGV4X2V2YWwuYyBleF9jbWRzLmgKKworJChPQkpESVIpXGlmX29sZS5vYmo6IGlmX29sZS5jcHAKKworJChPQkpESVIpXGlmX3Blcmwub2JqOiBpZl9wZXJsLmMgcGVybC5saWIKKwkkKENDKSAkKENDQVJHKSAkKENDMSkgJChDQzIpJEAgLXBjIGlmX3BlcmwuYworCitpZl9wZXJsLmM6IGlmX3BlcmwueHMgdHlwZW1hcAorCSQoUEVSTClcYmluXHBlcmwuZXhlICQoUEVSTClcbGliXEV4dFV0aWxzXHhzdWJwcCAtcHJvdG90eXBlcyAtdHlwZW1hcCBcCisJICAgICQoUEVSTClcbGliXEV4dFV0aWxzXHR5cGVtYXAgaWZfcGVybC54cyA+ICRACisKKyQoT0JKRElSKVxpZl9weXRob24ub2JqOiBpZl9weXRob24uYyBweXRob24ubGliCisJJChDQykgJChDQ0FSRykgJChDQzEpICQoQ0MyKSRAIC1wYyBpZl9weXRob24uYworCiskKE9CSkRJUilcaWZfcnVieS5vYmo6IGlmX3J1YnkuYyBydWJ5LmxpYgorCSQoQ0MpICQoQ0NBUkcpICQoQ0MxKSAkKENDMikkQCAtcGMgaWZfcnVieS5jCisKKyQoT0JKRElSKVxpZl90Y2wub2JqOiBpZl90Y2wuYyB0Y2wubGliCisJJChDQykgJChDQ0FSRykgJChDQzEpICQoQ0MyKSRAIC1wYyBpZl90Y2wuYworCiskKE9CSkRJUilceHBtX3czMi5vYmo6IHhwbV93MzIuYyB4cG0ubGliCisJJChDQykgJChDQ0FSRykgJChDQzEpICQoQ0MyKSRAIC1wYyB4cG1fdzMyLmMKKworJChPQkpESVIpXG5ldGJlYW5zLm9iajogbmV0YmVhbnMuYyAkKE5CREVCVUdfREVQKQorCSQoQ0MpICQoQ0NBUkcpICQoQ0MxKSAkKENDMikkQCBuZXRiZWFucy5jCisKKyQoT0JKRElSKVx2aW0ucmVzOiB2aW0ucmMgdmVyc2lvbi5oIHRvb2xzLmJtcCB0ZWFyb2ZmLmJtcCBcCisJCXZpbS5pY28gdmltX2Vycm9yLmljbyB2aW1fYWxlcnQuaWNvIHZpbV9pbmZvLmljbyB2aW1fcXVlc3QuaWNvCisJJChCUkMpIC1mbyQoT0JKRElSKVx2aW0ucmVzIC1pICQoQk9SKVxpbmNsdWRlIC13MzIgLXIgdmltLnJjIEAmJnwKKwkkKERFRklORVMpCit8CisKKyQoT0JKRElSKVxwYXRoZGVmLm9iajoJYXV0b1xwYXRoZGVmLmMKKwkkKENDKSAkKENDQVJHKSAkKENDMSkgJChDQzIpJEAgYXV0b1xwYXRoZGVmLmMKKworCisjIE5lZWQgdG8gZXNjYXBlIGJvdGggcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBpbiAkSU5URVJQX0RFRklORVMKK0lOVEVSUF9ERUZJTkVTX0VTQ19CS1M9JChJTlRFUlBfREVGSU5FUzpcPVxcKQorSU5URVJQX0RFRklORVNfRVNDPSQoSU5URVJQX0RFRklORVNfRVNDX0JLUzoiPVwiKQorCisjIE5vdGU6ICB0aGUgc2lsbHkgLyoiKi8gYmVsb3cgYXJlIHRoZXJlIHRvIHRyaWNrIG1ha2UgaW50byBhY2NlcHRpbmcKKyMgdGhlICMgY2hhcmFjdGVyIGFzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY29tbWVudCB3aXRob3V0IG1lc3NpbmcgdXAKKyMgdGhlIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuCithdXRvXHBhdGhkZWYuYzo6CisJLUBtZCBhdXRvCisJQGVjaG8gY3JlYXRpbmcgYXV0by9wYXRoZGVmLmMKKwlAY29weSAveSAmJnwKKy8qIHBhdGhkZWYuYyAqLworLyoiKi8jaW5jbHVkZSAidmltLmgiLyoiKi8KKworY2hhcl91ICpkZWZhdWx0X3ZpbV9kaXIgPSAoY2hhcl91ICopIiQoVklNUkNMT0M6XD1cXCkiOworY2hhcl91ICpkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyID0gKGNoYXJfdSAqKSIkKFZJTVJVTlRJTUVESVI6XD1cXCkiOworY2hhcl91ICphbGxfY2ZsYWdzID0gKGNoYXJfdSAqKSIkKENDOlw9XFwpICQoQ0ZMQUdTOlw9XFwpICQoREVGSU5FUykgJChNQkRFRklORVMpICQoSU5URVJQX0RFRklORVNfRVNDKSAkKE9QVCkgJChFWEVUWVBFKSAkKENQVUFSRykgJChBTElHTkFSRykgJChERUJVR19GTEFHKSAkKENPREVHVUFSRF9GTEFHKSI7CitjaGFyX3UgKmFsbF9sZmxhZ3MgPSAoY2hhcl91ICopIiQoTElOSzpcPVxcKSAkKExGTEFHUzpcPVxcKSI7CitjaGFyX3UgKmNvbXBpbGVkX3VzZXIgPSAoY2hhcl91ICopIiQoVVNFUk5BTUUpIjsKK2NoYXJfdSAqY29tcGlsZWRfc3lzID0gKGNoYXJfdSAqKSIkKFVTRVJET01BSU4pIjsKK3wgYXV0b1xwYXRoZGVmLmMKKworcGVybC5saWI6ICQoUEVSTClcbGliXENPUkVccGVybCQoUEVSTF9WRVIpLmxpYgorCWNvZmYyb21mICQoUEVSTClcbGliXENPUkVccGVybCQoUEVSTF9WRVIpLmxpYiAkQAorCitweXRob24ubGliOiAkKFBZVEhPTilcbGlic1xweXRob24kKFBZVEhPTl9WRVIpLmxpYgorCWNvZmYyb21mICQoUFlUSE9OKVxsaWJzXHB5dGhvbiQoUFlUSE9OX1ZFUikubGliICRACisKK3J1YnkubGliOiAkKFJVQlkpXGxpYlwkKFJVQllfSU5TVEFMTF9OQU1FKS5saWIKKwljb2ZmMm9tZiAkKFJVQlkpXGxpYlwkKFJVQllfSU5TVEFMTF9OQU1FKS5saWIgJEAKKworIyBGb3Igc29tZSByZWFzb24sIHRoZSBjb2ZmMm9tZiBtZXRob2QgZG9lc24ndCB3b3JrIG9uIGxpYlhwbS5saWIsIHNvCisjIHdlIGhhdmUgdG8gbWFudWFsbHkgZ2VuZXJhdGUgYW4gaW1wb3J0IGxpYnJhcnkgc3RyYWlnaHQgZnJvbSB0aGUgRExMLgoreHBtLmxpYjogJChYUE0pXGxpYlxsaWJYcG0ubGliCisJaW1wbGliIC1hICRAICQoWFBNKVxiaW5cbGliWHBtLmRsbAorCit0Y2wubGliOiAkKFRDTF9MSUIpCishaWYgKCIkKERZTkFNSUNfVENMKSIgPT0gInllcyIpCisJY29weSAkKFRDTF9MSUIpICRACishZWxzZQorCWNvZmYyb21mICQoVENMX0xJQikgJEAKKyFlbmRpZgorCishaWYgKCIkKERZTkFNSUNfVENMKSIgPT0gInllcyIpCit0Y2xzdHViJChUQ0xfVkVSKS1ib3IubGliOgorCS1ASUYgTk9UIEVYSVNUICRAIEVDSE8gWW91IG11c3QgZG93bmxvYWQgdGNsc3R1YiQoVENMX1ZFUiktYm9yLmxpYiBzZXBhcmF0ZWx5IGFuZFwKKwlwbGFjZSBpdCBpbiB0aGUgc3JjIGRpcmVjdG9yeSBpbiBvcmRlciB0byBjb21waWxlIGEgZHluYW1pYyBUQ0wtZW5hYmxlZFwKKwkoZyl2aW0gd2l0aCB0aGUgQm9ybGFuZCBjb21waWxlci4gIFlvdSBjYW4gZ2V0IHRoZSB0Y2xzdHViJChUQ0xfVkVSKS1ib3IubGliIGZpbGVcCisJYXQgaHR0cDovL215d2VicGFnZS5uZXRzY2FwZS5jb20vc2hhcnBwZW9wbGUvdmltL3RjbHN0dWIkKFRDTF9WRVIpLWJvci5saWIKKyFlbmRpZgorCisjIHZpbXJ1bi5leGU6Cit2aW1ydW4uZXhlOiB2aW1ydW4uYworIWlmICgiJChVU0VETEwpIj09InllcyIpCisJJChDQykgLVdDIC1PMSAtSSQoSU5DTFVERSkgLUwkKExJQikgLURfUlRMRExMIHZpbXJ1bi5jIGN3MzJtdGkubGliCishZWxzZQorCSQoQ0MpIC1XQyAtTzEgLUkkKElOQ0xVREUpIC1MJChMSUIpIHZpbXJ1bi5jCishZW5kaWYKKworIyBUaGUgZGVwZW5kZW5jeSBvbiAkKE9CSkRJUikgaXMgdG8gaGF2ZSBiY2MuY2ZnIGdlbmVyYXRlZCBlYWNoIHRpbWUuCiskKE9CSkRJUilcYmNjLmNmZzogTWFrZV9iYzUubWFrICQoT0JKRElSKQorICBjb3B5IC95ICYmfAorCSQoQ0ZMQUdTKQorCS1MJChMSUIpCisJJChERUZJTkVTKQorCSQoTUJERUZJTkVTKQorCSQoSU5URVJQX0RFRklORVMpCisJJChFWEVUWVBFKQorCSQoREVCVUdfRkxBRykKKwkkKE9QVCkKKwkkKENPREVHVUFSRF9GTEFHKQorCSQoQ1BVQVJHKQorCSQoQUxJR05BUkcpCit8ICRACisKKyMgdmk6c2V0IHN0cz00IHN3PTQ6CmRpZmYgLS1naXQgYS9zcmMvTWFrZV9jeWcubWFrIGIvc3JjL01ha2VfY3lnLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThlM2QxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfY3lnLm1hawpAQCAtMCwwICsxLDQ5OCBAQAorIworIyBNYWtlZmlsZSBmb3IgVklNIG9uIFdpbjMyLCB1c2luZyBDeWdudXMgZ2NjCisjIExhc3QgdXBkYXRlZCBieSBEYW4gU2hhcnAuICBMYXN0IENoYW5nZTogMjAwNCBBcHIgMjMKKyMKKyMgVGhpcyBjb21waWxlcyBWaW0gYXMgYSBXaW5kb3dzIGFwcGxpY2F0aW9uLiAgSWYgeW91IHdhbnQgVmltIHRvIHJ1biBhcyBhCisjIEN5Z3dpbiBhcHBsaWNhdGlvbiB1c2UgdGhlIE1ha2VmaWxlIChqdXN0IGxpa2Ugb24gVW5peCkuCisjCisjIEdVSQkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3YW50IHRoZSBHVUkgdmVyc2lvbiAoeWVzKQorIyBQRVJMCQlkZWZpbmUgdG8gcGF0aCB0byBQZXJsIGRpciB0byBnZXQgUGVybCBzdXBwb3J0IChub3QgZGVmaW5lZCkKKyMgICBQRVJMX1ZFUgkgIGRlZmluZSB0byB2ZXJzaW9uIG9mIFBlcmwgYmVpbmcgdXNlZCAoNTYpCisjICAgRFlOQU1JQ19QRVJMICBubyBvciB5ZXM6IHNldCB0byB5ZXMgdG8gbG9hZCB0aGUgUGVybCBETEwgZHluYW1pY2FsbHkgKHllcykKKyMgUFlUSE9OCWRlZmluZSB0byBwYXRoIHRvIFB5dGhvbiBkaXIgdG8gZ2V0IFBZVEhPTiBzdXBwb3J0IChub3QgZGVmaW5lZCkKKyMgICBQWVRIT05fVkVSCSAgICBkZWZpbmUgdG8gdmVyc2lvbiBvZiBQeXRob24gYmVpbmcgdXNlZCAoMjIpCisjICAgRFlOQU1JQ19QWVRIT04gIG5vIG9yIHllczogdXNlIHllcyB0byBsb2FkIHRoZSBQeXRob24gRExMIGR5bmFtaWNhbGx5ICh5ZXMpCisjIFRDTAkJZGVmaW5lIHRvIHBhdGggdG8gVENMIGRpciB0byBnZXQgVENMIHN1cHBvcnQgKG5vdCBkZWZpbmVkKQorIyAgIFRDTF9WRVIJZGVmaW5lIHRvIHZlcnNpb24gb2YgVENMIGJlaW5nIHVzZWQgKDgzKQorIyAgIERZTkFNSUNfVENMIG5vIG9yIHllczogdXNlIHllcyB0byBsb2FkIHRoZSBUQ0wgRExMIGR5bmFtaWNhbGx5ICh5ZXMpCisjIFJVQlkJCWRlZmluZSB0byBwYXRoIHRvIFJ1YnkgZGlyIHRvIGdldCBSdWJ5IHN1cHBvcnQgKG5vdCBkZWZpbmVkKQorIyAgIFJVQllfVkVSCWRlZmluZSB0byB2ZXJzaW9uIG9mIFJ1YnkgYmVpbmcgdXNlZCAoMTYpCisjICAgRFlOQU1JQ19SVUJZIG5vIG9yIHllczogdXNlIHllcyB0byBsb2FkIHRoZSBSdWJ5IERMTCBkeW5hbWljYWxseSAoeWVzKQorIyBHRVRURVhUCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgZHluYW1pYyBnZXR0ZXh0IHN1cHBvcnQgKHllcykKKyMgSUNPTlYJCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgZHluYW1pYyBpY29udiBzdXBwb3J0ICh5ZXMpCisjIE1CWVRFCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgdG8gaW5jbHVkZSBtdWx0aWJ5dGUgc3VwcG9ydCAoeWVzKQorIyBJTUUJCW5vIG9yIHllczogc2V0IHRvIHllcyB0byBpbmNsdWRlIElNRSBzdXBwb3J0ICh5ZXMpCisjICAgRFlOQU1JQ19JTUUgbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIGxvYWQgaW1tMzIuZGxsIGR5bmFtaWNhbGx5ICh5ZXMpCisjIE9MRQkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIG1ha2UgT0xFIGd2aW0gKG5vKQorIyBERUJVRwkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3aXNoIGEgREVCVUdnaW5nIGJ1aWxkIChubykKKyMgQ1BVTlIJCWkzODYgdGhyb3VnaCBwZW50aXVtNDogc2VsZWN0IC1tY3B1IGFyZ3VtZW50IHRvIGNvbXBpbGUgd2l0aCAoaTM4NikKKyMgQVJDSAkJaTM4NiB0aHJvdWdoIHBlbnRpdW00OiBzZWxlY3QgLW1hcmNoIGFyZ3VtZW50IHRvIGNvbXBpbGUgd2l0aCAoaTM4NikKKyMgVVNFRExMCW5vIG9yIHllczogc2V0IHRvIHllcyB0byB1c2UgdGhlIFJ1bnRpbWUgbGlicmFyeSBETEwgKG5vKQorIwkJRm9yIFVTRURMTD15ZXMgdGhlIGN5Z3dpbjEuZGxsIGlzIHJlcXVpcmVkIHRvIHJ1biBWaW0uCisjIFBPU1RTQ1JJUFQJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGZvciBQb3N0U2NyaXB0IHByaW50aW5nIChubykKKyMgRkVBVFVSRVMJVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UgKEJJRykKKyMgV0lOVkVSCUxvd2VzdCBXaW4zMiB2ZXJzaW9uIHRvIHN1cHBvcnQuICAoMHgwNDAwKQorIyBDU0NPUEUJbm8gb3IgeWVzOiB0byBpbmNsdWRlIGNzY29wZSBpbnRlcmZhY2Ugc3VwcG9ydCAoeWVzKQorIyBPUFRJTUlaRQlTUEFDRSwgU1BFRUQsIG9yIE1BWFNQRUVEOiBzZXQgb3B0aW1pemF0aW9uIGxldmVsIChNQVhTUEVFRCkKKyMgTkVUQkVBTlMJbm8gb3IgeWVzOiB0byBpbmNsdWRlIG5ldGJlYW5zIGludGVyZmFjZSBzdXBwb3J0ICh5ZXMgd2hlbiBHVUkKKyMJCWlzIHllcykKKyMgWFBNCQlkZWZpbmUgdG8gcGF0aCB0byBYUE0gZGlyIHRvIGdldCBYUE0gaW1hZ2Ugc3VwcG9ydCAobm90IGRlZmluZWQpCisjPj4+Pj4gY2hvb3NlIG9wdGlvbnM6CitpZm5kZWYgR1VJCitHVUk9eWVzCitlbmRpZgorCitpZm5kZWYgRkVBVFVSRVMKK0ZFQVRVUkVTID0gQklHCitlbmRpZgorCitpZm5kZWYgR0VUVEVYVAorR0VUVEVYVCA9IHllcworZW5kaWYKKworaWZuZGVmIElDT05WCitJQ09OViA9IHllcworZW5kaWYKKworaWZuZGVmIE1CWVRFCitNQllURSA9IHllcworZW5kaWYKKworaWZuZGVmIElNRQorSU1FID0geWVzCitlbmRpZgorCitpZm5kZWYgQ1BVTlIKK0NQVU5SID0gaTM4NgorZW5kaWYKKworaWZuZGVmIEFSQ0gKK0FSQ0ggPSBpMzg2CitlbmRpZgorCitpZm5kZWYgV0lOVkVSCitXSU5WRVIgPSAweDA0MDAKK2VuZGlmCisKK2lmbmRlZiBDU0NPUEUKK0NTQ09QRSA9IHllcworZW5kaWYKKworaWZuZGVmIE5FVEJFQU5TCitpZmVxICgkKEdVSSkseWVzKQorTkVUQkVBTlMgPSB5ZXMKK2VuZGlmCitlbmRpZgorCitpZm5kZWYgT1BUSU1JWkUKK09QVElNSVpFID0gTUFYU1BFRUQKK2VuZGlmCisKKyMjIyBTZWUgZmVhdHVyZS5oIGZvciBhIGxpc3Qgb2Ygb3B0aW9uYWxzLgorIyMjIEFueSBvdGhlciBkZWZpbmVzIGNhbiBiZSBpbmNsdWRlZCBoZXJlLgorCitERUZJTkVTID0gLURXSU4zMiAtREhBVkVfUEFUSERFRiAtREZFQVRfJChGRUFUVVJFUykgXAorCSAgLURXSU5WRVI9JChXSU5WRVIpIC1EX1dJTjMyX1dJTk5UPSQoV0lOVkVSKQorSU5DTFVERVMgPSAtbWNwdT0kKENQVU5SKSAtbWFyY2g9JChBUkNIKSAtSXByb3RvCisKKyM+Pj4+PiBuYW1lIG9mIHRoZSBjb21waWxlciBhbmQgbGlua2VyLCBuYW1lIG9mIGxpYiBkaXJlY3RvcnkKK0NDID0gZ2NjCitSQyA9IHdpbmRyZXMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERZTkFNSUNfUEVSTD15ZXMgYW5kIG5vIGJvdGggd29yaworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmRlZiBQRVJMCitERUZJTkVTICs9IC1ERkVBVF9QRVJMCitJTkNMVURFUyArPSAtSSQoUEVSTCkvbGliL0NPUkUKK0VYVFJBX09CSlMgKz0gJChPVVRESVIpL2lmX3BlcmwubworCitpZm5kZWYgRFlOQU1JQ19QRVJMCitEWU5BTUlDX1BFUkwgPSB5ZXMKK2VuZGlmCisKK2lmbmRlZiBQRVJMX1ZFUgorUEVSTF9WRVIgPSA1NgorZW5kaWYKKworaWZlcSAoeWVzLCAkKERZTkFNSUNfUEVSTCkpCitERUZJTkVTICs9IC1ERFlOQU1JQ19QRVJMIC1ERFlOQU1JQ19QRVJMX0RMTD1cInBlcmwkKFBFUkxfVkVSKS5kbGxcIgorZWxzZQorRVhUUkFfTElCUyArPSAkKFBFUkwpL2xpYi9DT1JFL3BlcmwkKFBFUkxfVkVSKS5saWIKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRFlOQU1JQ19QWVRIT049eWVzIHdvcmtzLgorIyBEWU5BTUlDX1BZVEhPTj1ubyBkb2VzIG5vdCAodW5yZXNvbHZlZCBleHRlcm5hbHMgb24gbGluaykuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZGVmIFBZVEhPTgorREVGSU5FUyArPSAtREZFQVRfUFlUSE9OCitJTkNMVURFUyArPSAtSSQoUFlUSE9OKS9pbmNsdWRlCitFWFRSQV9PQkpTICs9ICQoT1VURElSKS9pZl9weXRob24ubworCitpZm5kZWYgRFlOQU1JQ19QWVRIT04KK0RZTkFNSUNfUFlUSE9OID0geWVzCitlbmRpZgorCitpZm5kZWYgUFlUSE9OX1ZFUgorUFlUSE9OX1ZFUiA9IDIyCitlbmRpZgorCitpZmVxICh5ZXMsICQoRFlOQU1JQ19QWVRIT04pKQorREVGSU5FUyArPSAtRERZTkFNSUNfUFlUSE9OIC1ERFlOQU1JQ19QWVRIT05fRExMPVwicHl0aG9uJChQWVRIT05fVkVSKS5kbGxcIgorZWxzZQorRVhUUkFfTElCUyArPSAkKFBZVEhPTikvbGlicy9weXRob24kKFBZVEhPTl9WRVIpLmxpYgorZW5kaWYKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEWU5BTUlDX1JVQlk9eWVzIHdvcmtzLgorIyBEWU5BTUlDX1JVQlk9bm8gZG9lcyBub3QgKHByb2Nlc3MgZXhpdHMpLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmRlZiBSVUJZCisKK2lmbmRlZiBSVUJZX1ZFUgorUlVCWV9WRVI9MTYKK2VuZGlmCisKK2lmbmRlZiBSVUJZX1ZFUl9MT05HCitSVUJZX1ZFUl9MT05HPTEuNgorZW5kaWYKKworaWZuZGVmIERZTkFNSUNfUlVCWQorRFlOQU1JQ19SVUJZID0geWVzCitlbmRpZgorCitpZmVxICgkKFJVQllfVkVSKSwgMTYpCitpZm5kZWYgUlVCWV9QTEFURk9STQorUlVCWV9QTEFURk9STSA9IGk1ODYtbXN3aW4zMgorZW5kaWYKK2lmbmRlZiBSVUJZX0lOU1RBTExfTkFNRQorUlVCWV9JTlNUQUxMX05BTUUgPSBtc3dpbjMyLXJ1YnkkKFJVQllfVkVSKQorZW5kaWYKK2Vsc2UKK2lmbmRlZiBSVUJZX1BMQVRGT1JNCitSVUJZX1BMQVRGT1JNID0gaTM4Ni1tc3dpbjMyCitlbmRpZgoraWZuZGVmIFJVQllfSU5TVEFMTF9OQU1FCitSVUJZX0lOU1RBTExfTkFNRSA9IG1zdmNydC1ydWJ5JChSVUJZX1ZFUikKK2VuZGlmCitlbmRpZgorCitERUZJTkVTICs9IC1ERkVBVF9SVUJZCitJTkNMVURFUyArPSAtSSQoUlVCWSkvbGliL3J1YnkvJChSVUJZX1ZFUl9MT05HKS8kKFJVQllfUExBVEZPUk0pCitFWFRSQV9PQkpTICs9ICQoT1VURElSKS9pZl9ydWJ5Lm8KKworaWZlcSAoeWVzLCAkKERZTkFNSUNfUlVCWSkpCitERUZJTkVTICs9IC1ERFlOQU1JQ19SVUJZIC1ERFlOQU1JQ19SVUJZX0RMTD1cIiQoUlVCWV9JTlNUQUxMX05BTUUpLmRsbFwiCitERUZJTkVTICs9IC1ERFlOQU1JQ19SVUJZX1ZFUj0kKFJVQllfVkVSKQorZWxzZQorRVhUUkFfTElCUyArPSAkKFJVQlkpL2xpYi8kKFJVQllfSU5TVEFMTF9OQU1FKS5saWIKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRFlOQU1JQ19UQ0w9eWVzIGFuZCBubyBib3RoIHdvcmsuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZGVmIFRDTAorREVGSU5FUyArPSAtREZFQVRfVENMCitJTkNMVURFUyArPSAtSSQoVENMKS9pbmNsdWRlCitFWFRSQV9PQkpTICs9ICQoT1VURElSKS9pZl90Y2wubworCitpZm5kZWYgRFlOQU1JQ19UQ0wKK0RZTkFNSUNfVENMID0geWVzCitlbmRpZgorCitpZm5kZWYgVENMX1ZFUgorVENMX1ZFUiA9IDgzCitlbmRpZgorCitpZmVxICh5ZXMsICQoRFlOQU1JQ19UQ0wpKQorREVGSU5FUyArPSAtRERZTkFNSUNfVENMIC1ERFlOQU1JQ19UQ0xfRExMPVwidGNsJChUQ0xfVkVSKS5kbGxcIgorRVhUUkFfTElCUyArPSAkKFRDTCkvbGliL3RjbHN0dWIkKFRDTF9WRVIpLmxpYgorZWxzZQorRVhUUkFfTElCUyArPSAkKFRDTCkvbGliL3RjbCQoVENMX1ZFUikubGliCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICh5ZXMsICQoR0VUVEVYVCkpCitERUZJTkVTICs9IC1ERFlOQU1JQ19HRVRURVhUCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKHllcywgJChJQ09OVikpCitERUZJTkVTICs9IC1ERFlOQU1JQ19JQ09OVgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICh5ZXMsICQoTUJZVEUpKQorREVGSU5FUyArPSAtREZFQVRfTUJZVEUKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoeWVzLCAkKElNRSkpCitERUZJTkVTICs9IC1ERkVBVF9NQllURV9JTUUKKworaWZuZGVmIERZTkFNSUNfSU1FCitEWU5BTUlDX0lNRSA9IHllcworZW5kaWYKKworaWZlcSAoeWVzLCAkKERZTkFNSUNfSU1FKSkKK0RFRklORVMgKz0gLUREWU5BTUlDX0lNRQorZWxzZQorRVhUUkFfTElCUyArPSAtbGltbTMyCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICh5ZXMsICQoREVCVUcpKQorREVGSU5FUyArPSAtRERFQlVHCitJTkNMVURFUyArPSAtZyAtZnN0YWNrLWNoZWNrCitERUJVR19TVUZGSVggPSBkCitlbHNlCisKK2lmZXEgKCQoT1BUSU1JWkUpLCBTSVpFKQorT1BURkxBRyA9IC1PcworZWxzZQoraWZlcSAoJChPUFRJTUlaRSksIE1BWFNQRUVEKQorT1BURkxBRyA9IC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZnJlZy1zdHJ1Y3QtcmV0dXJuIC1tYWxpZ24tZG91YmxlCitlbHNlCitPUFRGTEFHID0gLU8yCitlbmRpZgorZW5kaWYKKworIyBBIGJ1ZyBpbiB0aGUgR0NDIDw9IDMuMiBvcHRpbWl6ZXIgY2FuIGNhdXNlIGEgY3Jhc2guICBUaGUKKyMgZm9sbG93aW5nIG9wdGlvbiByZW1vdmVzIHRoZSBwcm9ibGVtIG9wdGltaXphdGlvbi4KK09QVEZMQUcgKz0gLWZuby1zdHJlbmd0aC1yZWR1Y2UKKworSU5DTFVERVMgKz0gLXMKKworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFVTRURMTD15ZXMgd2lsbCBidWlsZCBhIEN5Z3dpbjMyIGV4ZWN1dGFibGUgdGhhdCByZWxpZXMgb24gY3lnd2luMS5kbGwuCisjIFVTRURMTD1ubyB3aWxsIGJ1aWxkIGEgTWluZ3czMiBleGVjdXRhYmxlIHdpdGggbm8gZXh0cmEgZGxsIGRlcGVuZGVuY2llcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoeWVzLCAkKFVTRURMTCkpCitERUZJTkVTICs9IC1EX01BWF9QQVRIPTI1NiAtRF9fQ1lHV0lOX18KK2Vsc2UKK0lOQ0xVREVTICs9IC1tbm8tY3lnd2luCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKHllcywgJChQT1NUU0NSSVBUKSkKK0RFRklORVMgKz0gLURNU1dJTlBTCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKHllcywgJChDU0NPUEUpKQorREVGSU5FUyArPSAtREZFQVRfQ1NDT1BFCitFWFRSQV9PQkpTICs9ICQoT1VURElSKS9pZl9jc2NvcGUubworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICh5ZXMsICQoTkVUQkVBTlMpKQorREVGSU5FUyArPSAtREZFQVRfTkVUQkVBTlNfSU5URworRVhUUkFfT0JKUyArPSAkKE9VVERJUikvbmV0YmVhbnMubyAkKE9VVERJUikvZ3VpX2JldmFsLm8KK0VYVFJBX0xJQlMgKz0gLWx3c29jazMyCisKK2lmZXEgKHllcywgJChERUJVRykpCitERUZJTkVTICs9IC1ETkJERUJVRworTkJERUJVR19ERVAgPSBuYmRlYnVnLmggbmJkZWJ1Zy5jCitlbmRpZgorCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZGVmIFhQTQorREVGSU5FUyArPSAtREZFQVRfWFBNX1czMgorSU5DTFVERVMgKz0gLUkkKFhQTSkvaW5jbHVkZQorRVhUUkFfT0JKUyArPSAkKE9VVERJUikveHBtX3czMi5vCitFWFRSQV9MSUJTICs9IC1MJChYUE0pL2xpYiAtbFhwbQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICh5ZXMsICQoT0xFKSkKK0RFRklORVMgKz0gLURGRUFUX09MRQorRVhUUkFfT0JKUyArPSAkKE9VVERJUikvaWZfb2xlLm8KK0VYVFJBX0xJQlMgKz0gLWxvbGVhdXQzMiAtbHN0ZGMrKworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKEdVSSkseWVzKQorRVhFID0gZ3ZpbSQoREVCVUdfU1VGRklYKS5leGUKK09VVERJUiA9IGdvYmokKERFQlVHX1NVRkZJWCkKK0RFRklORVMgKz0gLURGRUFUX0dVSV9XMzIgLURGRUFUX0NMSVBCT0FSRAorRVhUUkFfT0JKUyArPSAkKE9VVERJUikvZ3VpLm8gJChPVVRESVIpL2d1aV93MzIubyAkKE9VVERJUikvb3NfdzMyZXhlLm8KK0VYVFJBX0xJQlMgKz0gLW13aW5kb3dzIC1sY29tY3RsMzIKK2Vsc2UKK0VYRSA9IHZpbSQoREVCVUdfU1VGRklYKS5leGUKK09VVERJUiA9IG9iaiQoREVCVUdfU1VGRklYKQorTElCUyArPSAtbHVzZXIzMiAtbGdkaTMyIC1sY29tZGxnMzIKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKHNoLmV4ZSwgJChTSEVMTCkpCitERUwgPSBybQorRElSU0xBU0ggPSAvCitlbHNlCitERUwgPSBkZWwKK0RJUlNMQVNIID0gXFwKK2VuZGlmCisKKyM+Pj4+PiBlbmQgb2YgY2hvaWNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0lOQ0wgPSB2aW0uaCBnbG9iYWxzLmggb3B0aW9uLmgga2V5bWFwLmggbWFjcm9zLmggYXNjaWkuaCB0ZXJtLmggb3Nfd2luMzIuaCBcCisgICAgICAgc3RydWN0cy5oIHZlcnNpb24uaAorCitDRkxBR1MgPSAkKE9QVEZMQUcpICQoREVGSU5FUykgJChJTkNMVURFUykKKworUkNGTEFHUyA9IC1PIGNvZmYgJChERUZJTkVTKQorCitPQkogPSBcCisJJChPVVRESVIpL2J1ZmZlci5vIFwKKwkkKE9VVERJUikvY2hhcnNldC5vIFwKKwkkKE9VVERJUikvZGlmZi5vIFwKKwkkKE9VVERJUikvZGlncmFwaC5vIFwKKwkkKE9VVERJUikvZWRpdC5vIFwKKwkkKE9VVERJUikvZXZhbC5vIFwKKwkkKE9VVERJUikvZXhfY21kcy5vIFwKKwkkKE9VVERJUikvZXhfY21kczIubyBcCisJJChPVVRESVIpL2V4X2RvY21kLm8gXAorCSQoT1VURElSKS9leF9ldmFsLm8gXAorCSQoT1VURElSKS9leF9nZXRsbi5vIFwKKwkkKE9VVERJUikvZmlsZWlvLm8gXAorCSQoT1VURElSKS9mb2xkLm8gXAorCSQoT1VURElSKS9nZXRjaGFyLm8gXAorCSQoT1VURElSKS9tYWluLm8gXAorCSQoT1VURElSKS9tYXJrLm8gXAorCSQoT1VURElSKS9tZW1maWxlLm8gXAorCSQoT1VURElSKS9tZW1saW5lLm8gXAorCSQoT1VURElSKS9tZW51Lm8gXAorCSQoT1VURElSKS9tZXNzYWdlLm8gXAorCSQoT1VURElSKS9taXNjMS5vIFwKKwkkKE9VVERJUikvbWlzYzIubyBcCisJJChPVVRESVIpL21vdmUubyBcCisJJChPVVRESVIpL21ieXRlLm8gXAorCSQoT1VURElSKS9ub3JtYWwubyBcCisJJChPVVRESVIpL29wcy5vIFwKKwkkKE9VVERJUikvb3B0aW9uLm8gXAorCSQoT1VURElSKS9vc193aW4zMi5vIFwKKwkkKE9VVERJUikvb3NfbXN3aW4ubyBcCisJJChPVVRESVIpL3BhdGhkZWYubyBcCisJJChPVVRESVIpL3F1aWNrZml4Lm8gXAorCSQoT1VURElSKS9yZWdleHAubyBcCisJJChPVVRESVIpL3NjcmVlbi5vIFwKKwkkKE9VVERJUikvc2VhcmNoLm8gXAorCSQoT1VURElSKS9zeW50YXgubyBcCisJJChPVVRESVIpL3RhZy5vIFwKKwkkKE9VVERJUikvdGVybS5vIFwKKwkkKE9VVERJUikvdWkubyBcCisJJChPVVRESVIpL3VuZG8ubyBcCisJJChPVVRESVIpL3ZlcnNpb24ubyBcCisJJChPVVRESVIpL3ZpbXJjLm8gXAorCSQoT1VURElSKS93aW5kb3cubyBcCisJJChFWFRSQV9PQkpTKQorCithbGw6ICQoRVhFKSB4eGQveHhkLmV4ZSB2aW1ydW4uZXhlIGluc3RhbGwuZXhlIHVuaW5zdGFsLmV4ZSBHdmltRXh0L2d2aW1leHQuZGxsCisKKyMgQWNjb3JkaW5nIHRvIHRoZSBDeWd3aW4gZG9jIDEuMiBGQVEsIGtlcm5lbDMyIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkIGZvcgorIyBsaW5raW5nIHVubGVzcyBjYWxsaW5nIGxkIGRpcmVjdGx5LgorIyBTZWUgL3Vzci9kb2MvY3lnd2luLWRvYy0xLjIvaHRtbC9mYXFfdG9jLmh0bWwjVE9DOTMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiskKEVYRSk6ICQoT1VURElSKSAkKE9CSikKKwkkKENDKSAkKENGTEFHUykgLW8gJChFWEUpICQoT0JKKSAkKExJQlMpIC1sdXVpZCAtbG9sZTMyICQoRVhUUkFfTElCUykKKworeHhkL3h4ZC5leGU6IHh4ZC94eGQuYworCSQoTUFLRSkgLUMgeHhkIC1mIE1ha2VfY3lnLm1hayBVU0VETEw9JChVU0VETEwpCisKK0d2aW1FeHQvZ3ZpbWV4dC5kbGw6IEd2aW1FeHQvZ3ZpbWV4dC5jcHAgR3ZpbUV4dC9ndmltZXh0LnJjIEd2aW1FeHQvZ3ZpbWV4dC5oCisJJChNQUtFKSAtQyBHdmltRXh0IC1mIE1ha2VfbWluZy5tYWsKKwordmltcnVuLmV4ZTogdmltcnVuLmMKKwkkKENDKSAkKENGTEFHUykgLW8gdmltcnVuLmV4ZSB2aW1ydW4uYyAgJChMSUJTKQorCitpbnN0YWxsLmV4ZTogZG9zaW5zdC5jCisJJChDQykgJChDRkxBR1MpIC1vIGluc3RhbGwuZXhlIGRvc2luc3QuYyAgJChMSUJTKSAtbHV1aWQgLWxvbGUzMgorCit1bmluc3RhbC5leGU6IHVuaW5zdGFsLmMKKwkkKENDKSAkKENGTEFHUykgLW8gdW5pbnN0YWwuZXhlIHVuaW5zdGFsLmMgJChMSUJTKQorCiskKE9VVERJUik6CisJbWtkaXIgJChPVVRESVIpCisKK3RhZ3M6CisJY29tbWFuZCAvYyBjdGFncyAqLmMgJChJTkNMKQorCitjbGVhbjoKKwktJChERUwpICQoT1VURElSKSQoRElSU0xBU0gpKi5vCisJLXJtZGlyICQoT1VURElSKQorCS0kKERFTCkgKi5leGUKK2lmZGVmIFBFUkwKKwktJChERUwpIGlmX3BlcmwuYworZW5kaWYKKwktJChERUwpIHBhdGhkZWYuYworCSQoTUFLRSkgLUMgeHhkIC1mIE1ha2VfY3lnLm1hayBjbGVhbgorCSQoTUFLRSkgLUMgR3ZpbUV4dCAtZiBNYWtlX21pbmcubWFrIGNsZWFuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskKE9VVERJUikvJS5vIDogJS5jICQoSU5DTCkKKwkkKENDKSAtYyAkKENGTEFHUykgJDwgLW8gJEAKKworJChPVVRESVIpL2V4X2RvY21kLm86CWV4X2RvY21kLmMgJChJTkNMKSBleF9jbWRzLmgKKwkkKENDKSAtYyAkKENGTEFHUykgZXhfZG9jbWQuYyAtbyAkKE9VVERJUikvZXhfZG9jbWQubworCiskKE9VVERJUikvZXhfZXZhbC5vOglleF9ldmFsLmMgJChJTkNMKSBleF9jbWRzLmgKKwkkKENDKSAtYyAkKENGTEFHUykgZXhfZXZhbC5jIC1vICQoT1VURElSKS9leF9ldmFsLm8KKworJChPVVRESVIpL2lmX2NzY29wZS5vOglpZl9jc2NvcGUuYyAkKElOQ0wpIGlmX2NzY29wZS5oCisJJChDQykgLWMgJChDRkxBR1MpIGlmX2NzY29wZS5jIC1vICQoT1VURElSKS9pZl9jc2NvcGUubworCiskKE9VVERJUikvaWZfb2xlLm86CWlmX29sZS5jcHAgJChJTkNMKQorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtRF9fSUlEX0RFRklORURfXyBpZl9vbGUuY3BwIC1vICQoT1VURElSKS9pZl9vbGUubworCitpZl9wZXJsLmM6IGlmX3BlcmwueHMgdHlwZW1hcAorCXBlcmwgJChQRVJMKS9saWIvRXh0VXRpbHMveHN1YnBwIC1wcm90b3R5cGVzIC10eXBlbWFwIFwKKwkgICAgICQoUEVSTCkvbGliL0V4dFV0aWxzL3R5cGVtYXAgaWZfcGVybC54cyA+ICRACisKKyQoT1VURElSKS9pZl9wZXJsLm86CWlmX3BlcmwuYyAkKElOQ0wpCitpZmVxICh5ZXMsICQoVVNFRExMKSkKKwkkKENDKSAtYyAkKENGTEFHUykgLUkvdXNyL2luY2x1ZGUvbWluZ3cgLURfX01JTkdXMzJfXyBpZl9wZXJsLmMgLW8gJChPVVRESVIpL2lmX3BlcmwubworZW5kaWYKKworJChPVVRESVIpL2lmX3J1YnkubzoJaWZfcnVieS5jICQoSU5DTCkKK2lmZXEgKDE2LCAkKFJVQllfVkVSKSkKKwkkKENDKSAtYyAkKENGTEFHUykgLVVfV0lOMzIgaWZfcnVieS5jIC1vICQoT1VURElSKS9pZl9ydWJ5Lm8KK2VuZGlmCisKKyQoT1VURElSKS9uZXRiZWFucy5vOgluZXRiZWFucy5jICQoSU5DTCkgJChOQkRFQlVHX0RFUCkKKwkkKENDKSAtYyAkKENGTEFHUykgbmV0YmVhbnMuYyAtbyAkKE9VVERJUikvbmV0YmVhbnMubworCiskKE9VVERJUikvdmltcmMubzoJdmltLnJjIHZlcnNpb24uaCBndWlfdzMyX3JjLmgKKwkkKFJDKSAkKFJDRkxBR1MpIHZpbS5yYyAtbyAkKE9VVERJUikvdmltcmMubworCitwYXRoZGVmLmM6ICQoSU5DTCkKK2lmbmVxIChzaC5leGUsICQoU0hFTEwpKQorCUBlY2hvIGNyZWF0aW5nIHBhdGhkZWYuYworCUBlY2hvICcvKiBwYXRoZGVmLmMgKi8nID4gcGF0aGRlZi5jCisJQGVjaG8gJyNpbmNsdWRlICJ2aW0uaCInID4+IHBhdGhkZWYuYworCUBlY2hvICdjaGFyX3UgKmRlZmF1bHRfdmltX2RpciA9IChjaGFyX3UgKikiJChWSU1SQ0xPQykiOycgPj4gcGF0aGRlZi5jCisJQGVjaG8gJ2NoYXJfdSAqZGVmYXVsdF92aW1ydW50aW1lX2RpciA9IChjaGFyX3UgKikiJChWSU1SVU5USU1FRElSKSI7JyA+PiBwYXRoZGVmLmMKKwlAZWNobyAnY2hhcl91ICphbGxfY2ZsYWdzID0gKGNoYXJfdSAqKSIkKENDKSAkKENGTEFHUykiOycgPj4gcGF0aGRlZi5jCisJQGVjaG8gJ2NoYXJfdSAqYWxsX2xmbGFncyA9IChjaGFyX3UgKikiJChDQykgLXMgLW8gJChFWEUpICQoTElCUykgLWx1dWlkIC1sb2xlMzIgJChFWFRSQV9MSUJTKSI7JyA+PiBwYXRoZGVmLmMKKwlAZWNobyAnY2hhcl91ICpjb21waWxlZF91c2VyID0gKGNoYXJfdSAqKSIkKFVTRVJOQU1FKSI7JyA+PiBwYXRoZGVmLmMKKwlAZWNobyAnY2hhcl91ICpjb21waWxlZF9zeXMgPSAoY2hhcl91ICopIiQoVVNFUkRPTUFJTikiOycgPj4gcGF0aGRlZi5jCitlbHNlCisJQGVjaG8gY3JlYXRpbmcgcGF0aGRlZi5jCisJQGVjaG8gLyogcGF0aGRlZi5jICovID4gcGF0aGRlZi5jCisJQGVjaG8gI2luY2x1ZGUgInZpbS5oIiA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmRlZmF1bHRfdmltX2RpciA9IChjaGFyX3UgKikiJChWSU1SQ0xPQykiOyA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmRlZmF1bHRfdmltcnVudGltZV9kaXIgPSAoY2hhcl91ICopIiQoVklNUlVOVElNRURJUikiOyA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmFsbF9jZmxhZ3MgPSAoY2hhcl91ICopIiQoQ0MpICQoQ0ZMQUdTKSI7ID4+IHBhdGhkZWYuYworCUBlY2hvIGNoYXJfdSAqYWxsX2xmbGFncyA9IChjaGFyX3UgKikiJChDQykgLXMgLW8gJChFWEUpICQoTElCUykgLWx1dWlkIC1sb2xlMzIgJChFWFRSQV9MSUJTKSI7ID4+IHBhdGhkZWYuYworCUBlY2hvIGNoYXJfdSAqY29tcGlsZWRfdXNlciA9IChjaGFyX3UgKikiJChVU0VSTkFNRSkiOyA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmNvbXBpbGVkX3N5cyA9IChjaGFyX3UgKikiJChVU0VSRE9NQUlOKSI7ID4+IHBhdGhkZWYuYworZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2RpY2UubWFrIGIvc3JjL01ha2VfZGljZS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmNmNiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWtlX2RpY2UubWFrCkBAIC0wLDAgKzEsMjA5IEBACisjCisjIE1ha2VmaWxlIGZvciBWSU0sIHVzaW5nIERJQ0UgMworIworCisjPj4+Pj4gY2hvb3NlIG9wdGlvbnM6CisjIyMgU2VlIGZlYXR1cmUuaCBmb3IgYSBsaXN0IG9mIG9wdGlvbmFscy4KKyMjIyBBbnkgb3RoZXIgZGVmaW5lcyBjYW4gYmUgaW5jbHVkZWQgaGVyZS4KK0RFRklORVMgPSAtREhBVkVfVEdFVEVOVCAtRFVQX0JDX1BDX0VYVEVSTiAtRE9TUEVFRF9FWFRFUk4KKworIz4+Pj4+IGlmIEhBVkVfVEdFVEVOVCBpcyBkZWZpbmVkIG8vdGVybWxpYi5vIGhhcyB0byBiZSB1c2VkCitURVJNTElCID0gby90ZXJtbGliLm8KKyNURVJNTElCID0KKworIz4+Pj4+IGVuZCBvZiBjaG9pY2VzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQ0ZMQUdTID0gLWMgLURBTUlHQSAtSXByb3RvICQoREVGSU5FUykKKworU1lNUyA9IHZpbS5zeW1zCitQUkUgPSAtSCR7U1lNU309dmltLmgKK0xJQlMgPSAtbGEKK0NDID0gZGNjCitMRCA9IGRjYworCisuYy5vOgorCSR7Q0N9ICR7UFJFfSAke0NGTEFHU30gJDwgLW8gJEAKKworU1JDID0gXAorCWJ1ZmZlci5jIFwKKwljaGFyc2V0LmMgXAorCWRpZmYuYyBcCisJZGlncmFwaC5jIFwKKwllZGl0LmMgXAorCWV2YWwuYyBcCisJZXhfY21kcy5jIFwKKwlleF9jbWRzMi5jIFwKKwlleF9kb2NtZC5jIFwKKwlleF9ldmFsLmMgXAorCWV4X2dldGxuLmMgXAorCWZpbGVpby5jIFwKKwlmb2xkLmMgXAorCWdldGNoYXIuYyBcCisJbWFpbi5jIFwKKwltYXJrLmMgXAorCW1lbWZpbGUuYyBcCisJbWVtbGluZS5jIFwKKwltZW51LmMgXAorCW1lc3NhZ2UuYyBcCisJbWlzYzEuYyBcCisJbWlzYzIuYyBcCisJbW92ZS5jIFwKKwltYnl0ZS5jIFwKKwlub3JtYWwuYyBcCisJb3BzLmMgXAorCW9wdGlvbi5jIFwKKwlvc19hbWlnYS5jIFwKKwlxdWlja2ZpeC5jIFwKKwlyZWdleHAuYyBcCisJc2NyZWVuLmMgXAorCXNlYXJjaC5jIFwKKwlzeW50YXguYyBcCisJdGFnLmMgXAorCXRlcm0uYyBcCisJdWkuYyBcCisJdW5kby5jIFwKKwl3aW5kb3cuYyBcCisJdmVyc2lvbi5jCisKK09CSiA9CW8vYnVmZmVyLm8gXAorCW8vY2hhcnNldC5vIFwKKwlvL2RpZmYubyBcCisJby9kaWdyYXBoLm8gXAorCW8vZWRpdC5vIFwKKwlvL2V2YWwubyBcCisJby9leF9jbWRzLm8gXAorCW8vZXhfY21kczIubyBcCisJby9leF9kb2NtZC5vIFwKKwlvL2V4X2V2YWwubyBcCisJby9leF9nZXRsbi5vIFwKKwlvL2ZpbGVpby5vIFwKKwlvL2ZvbGQubyBcCisJby9nZXRjaGFyLm8gXAorCW8vbWFpbi5vIFwKKwlvL21hcmsubyBcCisJby9tZW1maWxlLm8gXAorCW8vbWVtbGluZS5vIFwKKwlvL21lbnUubyBcCisJby9tZXNzYWdlLm8gXAorCW8vbWlzYzEubyBcCisJby9taXNjMi5vIFwKKwlvL21vdmUubyBcCisJby9tYnl0ZS5vIFwKKwlvL25vcm1hbC5vIFwKKwlvL29wcy5vIFwKKwlvL29wdGlvbi5vIFwKKwlvL29zX2FtaWdhLm8gXAorCW8vcXVpY2tmaXgubyBcCisJby9yZWdleHAubyBcCisJby9zY3JlZW4ubyBcCisJby9zZWFyY2gubyBcCisJby9zeW50YXgubyBcCisJby90YWcubyBcCisJby90ZXJtLm8gXAorCW8vdWkubyBcCisJby91bmRvLm8gXAorCW8vd2luZG93Lm8gXAorCSQoVEVSTUxJQikKKworVmltOiAkKE9CSikgdmVyc2lvbi5jIHZlcnNpb24uaAorCSR7Q0N9ICQoQ0ZMQUdTKSB2ZXJzaW9uLmMgLW8gby92ZXJzaW9uLm8KKwkke0xEfSAtbyBWaW0gJChPQkopIG8vdmVyc2lvbi5vICQoTElCUykKKworZGVidWc6ICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJHtDQ30gJChDRkxBR1MpIHZlcnNpb24uYyAtbyBvL3ZlcnNpb24ubworCSR7TER9IC1zIC1vIFZpbSAkKE9CSikgby92ZXJzaW9uLm8gJChMSUJTKQorCit0YWdzOgorCWNzaCAtYyBjdGFncyAkKFNSQykgKi5oCisKK2NsZWFuOgorCWRlbGV0ZSBvLyoubyBWaW0gJChTWU1TKQorCiskKFNZTVMpICA6IHZpbS5oIGdsb2JhbHMuaCBrZXltYXAuaCBtYWNyb3MuaCBhc2NpaS5oIHRlcm0uaCBvc19hbWlnYS5oIHN0cnVjdHMuaAorCWRlbGV0ZSAkKFNZTVMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitvL2J1ZmZlci5vOglidWZmZXIuYyAgJChTWU1TKQorCitvL2NoYXJzZXQubzoJY2hhcnNldC5jICAkKFNZTVMpCisKK28vZGlmZi5vOglkaWZmLmMJJChTWU1TKQorCitvL2RpZ3JhcGgubzoJZGlncmFwaC5jICAkKFNZTVMpCisKK28vZWRpdC5vOgllZGl0LmMJJChTWU1TKQorCitvL2V2YWwubzoJZXZhbC5jICAkKFNZTVMpCisKK28vZXhfY21kcy5vOglleF9jbWRzLmMgICQoU1lNUykKKworby9leF9jbWRzMi5vOglleF9jbWRzMi5jICAkKFNZTVMpCisKK28vZXhfZG9jbWQubzoJZXhfZG9jbWQuYyAgJChTWU1TKSBleF9jbWRzLmgKKworby9leF9ldmFsLm86CWV4X2V2YWwuYyAgJChTWU1TKSBleF9jbWRzLmgKKworby9leF9nZXRsbi5vOglleF9nZXRsbi5jICAkKFNZTVMpCisKK28vZmlsZWlvLm86CWZpbGVpby5jICAkKFNZTVMpCisKK28vZm9sZC5vOglmb2xkLmMgICQoU1lNUykKKworby9nZXRjaGFyLm86IGdldGNoYXIuYwkkKFNZTVMpCisKK28vbWFpbi5vOiBtYWluLmMgJChTWU1TKQorCitvL21hcmsubzogbWFyay5jCSQoU1lNUykKKworby9tZW1maWxlLm86CW1lbWZpbGUuYyAgJChTWU1TKQorCitvL21lbWxpbmUubzoJbWVtbGluZS5jICAkKFNZTVMpCisKK28vbWVudS5vOgltZW51LmMgICQoU1lNUykKKworby9tZXNzYWdlLm86CW1lc3NhZ2UuYyAgJChTWU1TKQorCitvL21pc2MxLm86CW1pc2MxLmMgICQoU1lNUykKKworby9taXNjMi5vOgltaXNjMi5jICAkKFNZTVMpCisKK28vbW92ZS5vOgltb3ZlLmMgICQoU1lNUykKKworby9tYnl0ZS5vOgltYnl0ZS5jICAkKFNZTVMpCisKK28vbm9ybWFsLm86CW5vcm1hbC5jICAkKFNZTVMpCisKK28vb3BzLm86CW9wcy5jICAkKFNZTVMpCisKK28vb3B0aW9uLm86CW9wdGlvbi5jICAkKFNZTVMpCisjIEJlY2F1c2Ugb2YgYSBidWcgaW4gREMxIDIuMDYuNDAsIGluaXRpYWxpc2F0aW9uIG9mIHVuaW9ucyBkb2VzIG5vdAorIyB3b3JrIGNvcnJlY3RseS4gZGMxLTIxIGlzIERDMSAyLjA2LjIxIHdoaWNoIGRvZXMgd29yay4KKyMJcmVuYW1lIGRjMS0yMSBkYzEKKwkke0NDfSAke0NGTEFHU30gb3B0aW9uLmMgLW8gby9vcHRpb24ubworIwlyZW5hbWUgZGMxIGRjMS0yMQorCitvL29zX2FtaWdhLm86CW9zX2FtaWdhLmMgICQoU1lNUykgb3NfYW1pZ2EuaAorCitvL3F1aWNrZml4Lm86CXF1aWNrZml4LmMgICQoU1lNUykKKworby9yZWdleHAubzoJcmVnZXhwLmMgICQoU1lNUykgcmVnZXhwLmgKKworby9zY3JlZW4ubzoJc2NyZWVuLmMgICQoU1lNUykKKworby9zZWFyY2gubzoJc2VhcmNoLmMgICQoU1lNUykgcmVnZXhwLmgKKworby9zeW50YXgubzoJc3ludGF4LmMgICQoU1lNUykKKworby90YWcubzoJdGFnLmMgICQoU1lNUykKKworby90ZXJtLm86CXRlcm0uYyAgJChTWU1TKSB0ZXJtLmgKKworby90ZXJtbGliLm86CXRlcm1saWIuYyAkKFNZTVMpCisKK28vdWkubzogdWkuYwkkKFNZTVMpCisKK28vdW5kby5vOiB1bmRvLmMJJChTWU1TKQorCitvL3dpbmRvdy5vOiB3aW5kb3cuYwkkKFNZTVMpCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9kamcubWFrIGIvc3JjL01ha2VfZGpnLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM0MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfZGpnLm1hawpAQCAtMCwwICsxLDEwMiBAQAorIworIyBNYWtlZmlsZSBmb3IgVklNIG9uIE1TRE9TLCB1c2luZyBESkdQUCAyLjAKKyMKKworIz4+Pj4+IGNob29zZSBvcHRpb25zOgorCisjIyMgU2VlIGZlYXR1cmUuaCBmb3IgYSBsaXN0IG9mIG9wdGlvbmFscy4KKyMjIyBBbnkgb3RoZXIgZGVmaW5lcyBjYW4gYmUgaW5jbHVkZWQgaGVyZS4KKworREVGSU5FUyA9CisKKyM+Pj4+PiBuYW1lIG9mIHRoZSBjb21waWxlciBhbmQgbGlua2VyLCBuYW1lIG9mIGxpYiBkaXJlY3RvcnkKK0NDID0gZ2NjCisKKyM+Pj4+PiBlbmQgb2YgY2hvaWNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0lOQ0wgPSB2aW0uaCBnbG9iYWxzLmggb3B0aW9uLmgga2V5bWFwLmggbWFjcm9zLmggYXNjaWkuaCB0ZXJtLmggb3NfbXNkb3MuaCBzdHJ1Y3RzLmgKK0NGTEFHUyA9IC1PMiAtRE1TRE9TIC1JcHJvdG8gJChERUZJTkVTKSAtV2FsbCAtRGludGVycnVwdD0gLURmYXI9IC1ETUFYTUVNPTUxMiAtRF9OQUlWRV9ET1NfUkVHUworCitPQkogPSBcCisJb2JqL2J1ZmZlci5vIFwKKwlvYmovY2hhcnNldC5vIFwKKwlvYmovZGlmZi5vIFwKKwlvYmovZGlncmFwaC5vIFwKKwlvYmovZWRpdC5vIFwKKwlvYmovZXZhbC5vIFwKKwlvYmovZXhfY21kcy5vIFwKKwlvYmovZXhfY21kczIubyBcCisJb2JqL2V4X2RvY21kLm8gXAorCW9iai9leF9ldmFsLm8gXAorCW9iai9leF9nZXRsbi5vIFwKKwlvYmovZmlsZWlvLm8gXAorCW9iai9mb2xkLm8gXAorCW9iai9nZXRjaGFyLm8gXAorCW9iai9tYWluLm8gXAorCW9iai9tYXJrLm8gXAorCW9iai9tZW1maWxlLm8gXAorCW9iai9tZW1saW5lLm8gXAorCW9iai9tZW51Lm8gXAorCW9iai9tZXNzYWdlLm8gXAorCW9iai9taXNjMS5vIFwKKwlvYmovbWlzYzIubyBcCisJb2JqL21vdmUubyBcCisJb2JqL21ieXRlLm8gXAorCW9iai9ub3JtYWwubyBcCisJb2JqL29wcy5vIFwKKwlvYmovb3B0aW9uLm8gXAorCW9iai9vc19tc2Rvcy5vIFwKKwlvYmovcXVpY2tmaXgubyBcCisJb2JqL3JlZ2V4cC5vIFwKKwlvYmovc2NyZWVuLm8gXAorCW9iai9zZWFyY2gubyBcCisJb2JqL3N5bnRheC5vIFwKKwlvYmovdGFnLm8gXAorCW9iai90ZXJtLm8gXAorCW9iai91aS5vIFwKKwlvYmovdW5kby5vIFwKKwlvYmovd2luZG93Lm8gXAorCSQoVEVSTUxJQikKKworYWxsOiB2aW0uZXhlIGluc3RhbGwuZXhlIHVuaW5zdGFsLmV4ZSB4eGQveHhkLmV4ZQorCisjIHZlcnNpb24uYyBpcyBjb21waWxlZCBlYWNoIHRpbWUsIHNvIHRoYXQgaXQgc2V0cyB0aGUgYnVpbGQgdGltZS4KK3ZpbS5leGU6IG9iaiAkKE9CSikgdmVyc2lvbi5jIHZlcnNpb24uaAorCSQoQ0MpICQoQ0ZMQUdTKSAtcyAtbyB2aW0uZXhlIHZlcnNpb24uYyAkKE9CSikgLWxwYworCitpbnN0YWxsLmV4ZTogZG9zaW5zdC5jCisJJChDQykgJChDRkxBR1MpIC1zIC1vIGluc3RhbGwuZXhlIGRvc2luc3QuYyAtbHBjCisKK3VuaW5zdGFsLmV4ZTogdW5pbnN0YWwuYworCSQoQ0MpICQoQ0ZMQUdTKSAtcyAtbyB1bmluc3RhbC5leGUgdW5pbnN0YWwuYyAtbHBjCisKKyMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KK3h4ZC94eGQuZXhlOiB4eGQveHhkLmMKKwkkKE1BS0UpIC0tZGlyZWN0b3J5PXh4ZCAtZiBNYWtlX2RqZy5tYWsKKworb2JqOgorCW1rZGlyIG9iagorCit0YWdzOgorCWNvbW1hbmQgL2MgY3RhZ3MgKi5jICQoSU5DTCkgZXhfY21kcy5oCisKK2NsZWFuOgorCS1kZWwgb2JqXCoubworCS1ybWRpciBvYmoKKwktZGVsIHZpbS5leGUKKwktZGVsIGluc3RhbGwuZXhlCisJLWRlbCB4eGRceHhkLmV4ZQorCS1kZWwgdGVzdGRpclwqLm91dAorCisjIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCit0ZXN0OgorCSQoTUFLRSkgLS1kaXJlY3Rvcnk9dGVzdGRpciAtZiBNYWtlX2Rvcy5tYWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29iai8lLm86ICUuYyBvYmogJChJTkNMKQorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAorCisjIEV4dHJhIGRlcGVuZGVuY3kgKHRoZXJlIGFyZSBhY3R1YWxseSBtYW55IG1vcmUuLi4pCitvYmovZXhfZG9jbWQubzoJZXhfY21kcy5oCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9kdmMubWFrIGIvc3JjL01ha2VfZHZjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM3N2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfZHZjLm1hawpAQCAtMCwwICsxLDEwNSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworIUlGICIkKENGRykiID09ICIiCitDRkc9VmltIC0gV2luMzIgSURFIGZvciBNYWtlX212Yy5tYWsKKyFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBWaW0gLSBXaW4zMiBJREUgZm9yXAorIE1ha2VfbXZjLm1hay4KKyFFTkRJRgorCishSUYgIiQoQ0ZHKSIgIT0gIlZpbSAtIFdpbjMyIElERSBmb3IgTWFrZV9tdmMubWFrIgorIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgorIU1FU1NBR0UKKyFNRVNTQUdFIE5NQUtFIC9mICJNYWtlX2R2Yy5tYWsiIENGRz0iVmltIC0gV2luMzIgSURFIGZvciBNYWtlX212Yy5tYWsiCishTUVTU0FHRQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRQorIU1FU1NBR0UgIlZpbSAtIFdpbjMyIElERSBmb3IgTWFrZV9tdmMubWFrIiAoYmFzZWQgb25cCisgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRgorCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRQorTlVMTD1udWwKKyFFTkRJRgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgIlZpbSAtIFdpbjMyIElERSBmb3IgTWFrZV9tdmMubWFrIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIiIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIiCisjIFBST1AgVGFyZ2V0X0RpciAiIgorT1VURElSPS4KK0lOVERJUj0uCisKK0FMTCA6ICIkKE9VVERJUilcdmltcnVuLmV4ZSIKKworQ0xFQU4gOgorCS1AZXJhc2UgIi5cdmltcnVuLmV4ZSIKKwktQGVyYXNlICIuXHZpbXJ1bi5vYmoiCisKKyMgQUREIENQUCAvbm9sb2dvIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvTWFrZV9kdmMuYnNjIgorQlNDMzJfU0JSUz0KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIgL21hY2hpbmU6SVg4NgorIyBBREQgTElOSzMyIC9ub2xvZ28gL3BkYjpub25lIC9tYWNoaW5lOklYODYgL291dDoidmltcnVuLmV4ZSIKK0xJTkszMl9GTEFHUz0vbm9sb2dvIC9wZGI6bm9uZSAvbWFjaGluZTpJWDg2IC9vdXQ6IiQoT1VURElSKS92aW1ydW4uZXhlIgorTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpL3ZpbXJ1bi5vYmoiCisKKyIkKE9VVERJUilcdmltcnVuLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCitDUFBfUFJPSj0vbm9sb2dvIC9NTCAvYworCisuYy5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwKKworLmNwcC5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwKKworLmN4eC5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwKKworLmMuc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8CisKKy5jcHAuc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8CisKKy5jeHguc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgIlZpbSAtIFdpbjMyIElERSBmb3IgTWFrZV9tdmMubWFrIgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdmltcnVuLmMKKworIiQoSU5URElSKVx2aW1ydW4ub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9pdmMubWFrIGIvc3JjL01ha2VfaXZjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGExNTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfaXZjLm1hawpAQCAtMCwwICsxLDY0OCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorIworIyBNYWtlX2l2Yy5tYWsgTWFrZWZpbGUgdG8gYnVpbGQgdmltIGluIGJvdGggSURFIGFuZCBubWFrZS4KKyMgVGhpcyBmaWxlIGNhbiBiZSBpbXBvcnRlZCBhcyBhIHdvcmtzcGFjZSBpbnRvIFZpc3VhbCBTdHVkaW8uICBJdCBtdXN0IGJlIGluCisjIERPUyBmaWxlZm9ybWF0IHRoZW4hCisjCisjIEl0IGlzIHdvcnRoIG1ha2luZyB0aGUgZmlsZSByZWFkLW9ubHkgYXMgdGhlIFZDNCBJREUgd2lsbCB0cnkgdG8gb3ZlcndyaXRlCisjIGl0IHdpdGggYSBIVUdFTFkgZXhwYW5kZWQgY2xvbmUgb2YgaXRzZWxmLgorIworIyBUaGUgZm9sbG93aW5nIHBvaW50cyBhcmUgd29ydGggbm90aW5nOgorIyAxKSBDb21tZW50cyBoZXJlIGFyZSBpZ25vcmVkIGJ5IFZDWzQ1Nl0uMCBJREVzCisjIDIpICMgQUREIExJTkszMiAvcGRiOi5cRGJnL3ZpbWQucGRiIGlzIHdyaXR0ZW4gc28gcmF0aGVyIHRoYW4KKyMgICAgIyBBREQgTElOSzMyIC9wZGI6Ii5cRGJnL3ZpbWQucGRiIiB0byBhdm9pZCBWQzQgLT4gVkM1IGNvbnZlcnNpb24gZmFpbHVyZQorIyAzKSBJdCBpcyBnb29kIHRvIGRlbGV0ZSAucGRiIGZpbGUgYmVmb3JlIGxpbmtpbmcgdG8gY29wZSB3aXRoIHN3aXRjaCBhbW9uZworIyAgICBWQ1s0NTZdIGFzIElERSBjbGVhbiBhY3Rpb24gZG9lcyBub3QgcmVtb3ZlIHRoYXQgZmlsZSBhbmQgbGluayBjbGFzaGVzCisjICAgIHdpdGggaXQuIFRoZSBmb2xsb3dpbmcgd29ya3MgaW4gVkM1IGJ1dCBub3QgaW4gVkM0IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQKKyMgICAgcHJlLWxpbmsgYWN0aW9ucy4gVGhlIG5tYWtlIGFjdGlvbiBkb2VzIHN1Y2ggZGVsZXRpb25zLgorIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKK1ByZUxpbmtfQ21kcz1AaWYgZXhpc3QgLlxvbGVEYmdcZ3ZpbWQucGRiIGRlbCAuXG9sZURiZ1xndmltZC5wZGIKKyMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAorIyA0KSBJIHdhcyB1bmFibGUgdG8gbWFrZSAhSUZERUYgT0xFLCBldGMuIHdvcmsgaW4gdGhlIFZDNCBJREUuCisjICAgIEkgd2FzIGFpbWluZyBmb3IgNCBjb25maWd1cmF0aW9ucyB3aXRoIHN1Yi1jb25maWd1cmF0aW9ucyBzZWxlY3RlZCBieQorIyAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisjIDUpIE9wdGltaXNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRpc2FibGVkIHZlcnNpb25zIG9mIFZDLiBUaGlzIHJlc3VsdHMgaW4KKyMgICAgbWVzc2FnZXMgZm9yIFJlbGVhc2UgYnVpbGRzIGxpa2U6CisjICAgICAgQ29tbWFuZCBsaW5lIHdhcm5pbmcgRDQwMjUgOiBvdmVycmlkaW5nICcvTzInIHdpdGggJy9PZCcKKyMgNikgbm1ha2UgMS42MiBhbmQgbGF0ZXIgc3VwcG9ydCBiYXRjaCBjb21waWxhdGlvbi4gSSB3YXMgdW5hYmxlIHRvIHVzZSB0aGlzCisjICAgIGluIGEgbWFubmVyIGFjY2VwdGFibGUgdG8gZWFybGllciBJREVzLgorIworIyBIaXN0b3J5CisjCisjIFdoZW4gICAgICAgV2hvICAgICAgIFdoYXQKKyMgMjAwMS0wNy0wNiBXLkJyaXNjb2UgT3JpZ2luYWwgZGVyaXZlZCBmcm9tIE1ha2VfW2dvXXZjLm1hayB3aXRoIGxlc3Mgbm9pc2UKKyMgMjAwMS0wNy0wOCBXLkJyaXNjb2UgRnVydGhlciBub2lzZSByZWR1Y3Rpb247IGNvbnNpc3RlbnQgLm1hcCBhbmQgLnBkYiBsb2dpYworIwkJICAgICAgIEFkZGVkIGluc3RhbGwuZXhlIHJ1bGUsIGV0Yy47IFJlbW92ZWQgdW51c2VkIGxpYnJhcmllcy4KKyMgMjAwMS0wOC0wOSBXLkJyaXNjb2UgUmVzdG9yZWQgVkM0LjAtcmVxdWlyZWQgdHJhaWxpbmcgc3BhY2UgaW4gIU1FU1NBR0UgYWZvcmUKKyMJCSAgICAgICBFbmhhbmNlZCBpZl9vbGUuaWRsIHJ1bGUgdG8gdXNlIC9vdXQgYXJndW1lbnQuCisjCQkgICAgICAgRGVmYXVsdCBydWxlcyBub3cgcmVsYXRpdmUgdG8gLiB0byByZWR1Y2UgSURFL25tYWtlIGRpZnMKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKKyFJRiAiJChDRkcpIiA9PSAiIgorQ0ZHPVZpbSAtIFdpbjMyIFJlbGVhc2UgZ3ZpbSBPTEUKKyFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0gT0xFLgorIUVORElGCisKKyFJRiAiJChDRkcpIiAhPSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIE9MRSJcCisgJiYgIiQoQ0ZHKSIgIT0gIlZpbSAtIFdpbjMyIERlYnVnIGd2aW0gT0xFIlwKKyAmJiAiJChDRkcpIiAhPSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIlwKKyAmJiAiJChDRkcpIiAhPSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSJcCisgJiYgIiQoQ0ZHKSIgIT0gIlZpbSAtIFdpbjMyIFJlbGVhc2UgdmltIlwKKyAmJiAiJChDRkcpIiAhPSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgorIU1FU1NBR0UKKyFNRVNTQUdFIE5NQUtFIC9mICJNYWtlX2l2Yy5tYWsiIENGRz0iVmltIC0gV2luMzIgRGVidWcgdmltIgorIU1FU1NBR0UKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UKKyFNRVNTQUdFICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0gT0xFIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgIlZpbSAtIFdpbjMyIERlYnVnIGd2aW0gT0xFIiAgIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIiAgICAgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJWaW0gLSBXaW4zMiBEZWJ1ZyBndmltIiAgICAgICAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgIlZpbSAtIFdpbjMyIFJlbGVhc2UgdmltIiAgICAgIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAiVmltIC0gV2luMzIgRGVidWcgdmltIiAgICAgICAgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCishRU5ESUYKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorREVMX1RSRUUgPSBybWRpciAvcyAvcQorIUVMU0UKK05VTEw9bnVsCitERUxfVFJFRSA9IGRlbHRyZWUgL3kKKyFFTkRJRgorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJWaW0gLSBXaW4zMiBEZWJ1ZyB2aW0iCisjIFBST1AgVXNlX01GQyAwCisKK1JTQz1yYy5leGUKK0NQUD1jbC5leGUKK0xJTkszMj1saW5rLmV4ZQorCitDUFBfUFJPSj0gL25vbG9nbyAvTVQgL1czIC9HWCAvSSAiLlxwcm90byIgL0QgIldJTjMyIiAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL0kgIi5ccHJvdG8iIC9EICJXSU4zMiIgL2MKKworTElOSzMyX0ZMQUdTPSBvbGRuYW1lcy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMyLmxpYiBjb21jdGwzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYgorIyBBREQgTElOSzMyICBvbGRuYW1lcy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMyLmxpYiBjb21jdGwzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYgorIyBTVUJUUkFDVCBMSU5LMzIgL2luY3JlbWVudGFsOnllcworCitSU0NfUFJPSj0gL2wgMHg0MDkgL2QgIkZFQVRfR1VJX1czMiIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiRkVBVF9HVUlfVzMyIgorCishSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0gT0xFIgorCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAuXG9sZVJlbAorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgLlxvbGVSZWwKKworSU5URElSPS5cb2xlUmVsCitWSU09Z3ZpbQorRVhUUkFTPSIkKElOVERJUikvaWZfb2xlLm9iaiIgIiQoSU5URElSKS92aW0ucmVzIiAiJChJTlRESVIpL2d1aS5vYmoiICIkKElOVERJUikvZ3VpX3czMi5vYmoiICIkKElOVERJUikvb3NfdzMyZXhlLm9iaiIKKworQ1BQX1BST0o9JChDUFBfUFJPSikgL08yIC9EICJOREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9EICJEWU5BTUlDX0dFVFRFWFQiIC9EICJGRUFUX09MRSIgL0ZkLlxvbGVSZWwvIC9Gby5cb2xlUmVsLworIyBBREQgQ1BQICAgICAgICAgICAgL08yIC9EICJOREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9EICJEWU5BTUlDX0dFVFRFWFQiIC9EICJGRUFUX09MRSIgL0ZkLlxvbGVSZWwvIC9Gby5cb2xlUmVsLworCitSU0NfUFJPSj0kKFJTQ19QUk9KKSAvSSAiLlxvbGVSZWwiIC9kICJOREVCVUciIC9kICJGRUFUX09MRSIgL2ZvLlxvbGVSZWxcdmltLnJlcworIyBBREQgUlNDICAgICAgICAgICAgL0kgIi5cb2xlUmVsIiAvZCAiTkRFQlVHIiAvZCAiRkVBVF9PTEUiIC9mby5cb2xlUmVsXHZpbS5yZXMKKworTElOSzMyX0ZMQUdTPSQoTElOSzMyX0ZMQUdTKSAvcGRiOm5vbmUgbGliYy5saWIgb2xlYXV0MzIubGliIC9zdWJzeXN0ZW06d2luZG93cyAvb3V0Oi5cZ3ZpbS5leGUKKyMgQUREIExJTkszMiAgICAgICAgICAgICAgICAgL3BkYjpub25lIGxpYmMubGliIG9sZWF1dDMyLmxpYiAvc3Vic3lzdGVtOndpbmRvd3MgL291dDouXGd2aW0uZXhlCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBEZWJ1ZyBndmltIE9MRSIKKworIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgLlxvbGVEYmcKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyIC5cb2xlRGJnCisKK0lOVERJUj0uXG9sZURiZworVklNPWd2aW1kCitFWFRSQVM9IiQoSU5URElSKS9pZl9vbGUub2JqIiAiJChJTlRESVIpL3ZpbS5yZXMiICIkKElOVERJUikvZ3VpLm9iaiIgIiQoSU5URElSKS9ndWlfdzMyLm9iaiIgIiQoSU5URElSKS9vc193MzJleGUub2JqIgorCitDUFBfUFJPSj0kKENQUF9QUk9KKSAvWmkgL09kIC9EICJfREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9EICJEWU5BTUlDX0dFVFRFWFQiIC9EICJGRUFUX09MRSIgL0ZkLlxvbGVEYmcvIC9Gby5cb2xlRGJnLworIyBBREQgQ1BQICAgICAgICAgICAgL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiRkVBVF9HVUlfVzMyIiAvRCAiRFlOQU1JQ19HRVRURVhUIiAvRCAiRkVBVF9PTEUiIC9GZC5cb2xlRGJnLyAvRm8uXG9sZURiZy8KKworUlNDX1BST0o9JChSU0NfUFJPSikgL0kgLlxvbGVEYmcgL2QgIl9ERUJVRyIgL2QgIkZFQVRfT0xFIiAvZm8uXG9sZURiZ1x2aW0ucmVzCisjIEFERCBSU0MgICAgICAgICAgICAvSSAuXG9sZURiZyAvZCAiX0RFQlVHIiAvZCAiRkVBVF9PTEUiIC9mby5cb2xlRGJnXHZpbS5yZXMKKworTElOSzMyX0ZMQUdTPSQoTElOSzMyX0ZMQUdTKSBsaWJjZC5saWIgb2xlYXV0MzIubGliIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL3Byb2ZpbGUgL3BkYjouXG9sZURiZy9ndmltZC5wZGIgL21hcDouXG9sZURiZ1xndmltZC5tYXAgL291dDouXGd2aW1kLmV4ZQorIyBBREQgTElOSzMyICAgICAgICAgICAgICAgICBsaWJjZC5saWIgb2xlYXV0MzIubGliIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL3Byb2ZpbGUgL3BkYjouXG9sZURiZy9ndmltZC5wZGIgL21hcDouXG9sZURiZ1xndmltZC5tYXAgL291dDouXGd2aW1kLmV4ZQorCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0iCisKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyIC5cZ1JlbAorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgLlxnUmVsCisKK0lOVERJUj0uXGdSZWwKK1ZJTT1ndmltCitFWFRSQVM9IiQoSU5URElSKS92aW0ucmVzIiAiJChJTlRESVIpL2d1aS5vYmoiICIkKElOVERJUikvZ3VpX3czMi5vYmoiICIkKElOVERJUikvb3NfdzMyZXhlLm9iaiIKKworQ1BQX1BST0o9JChDUFBfUFJPSikgL08yIC9EICJOREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9GZC5cZ1JlbC8gL0ZvLlxnUmVsLworIyBBREQgQ1BQICAgICAgICAgICAgL08yIC9EICJOREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9GZC5cZ1JlbC8gL0ZvLlxnUmVsLworCitSU0NfUFJPSj0kKFJTQ19QUk9KKSAvZCAiTkRFQlVHIiAvZm8uXGdSZWxcdmltLnJlcworIyBBREQgUlNDICAgICAgICAgICAgL2QgIk5ERUJVRyIgL2ZvLlxnUmVsXHZpbS5yZXMKKworTElOSzMyX0ZMQUdTPSQoTElOSzMyX0ZMQUdTKSAvcGRiOm5vbmUgbGliYy5saWIgL3N1YnN5c3RlbTp3aW5kb3dzIC9vdXQ6LlxndmltLmV4ZQorIyBBREQgTElOSzMyICAgICAgICAgICAgICAgICAvcGRiOm5vbmUgbGliYy5saWIgL3N1YnN5c3RlbTp3aW5kb3dzIC9vdXQ6LlxndmltLmV4ZQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSIKKworIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgLlxnRGJnCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAuXGdEYmcKKworSU5URElSPS5cZ0RiZworVklNPWd2aW1kCitFWFRSQVM9IiQoSU5URElSKS92aW0ucmVzIiAiJChJTlRESVIpL2d1aS5vYmoiICIkKElOVERJUikvZ3VpX3czMi5vYmoiICIkKElOVERJUikvb3NfdzMyZXhlLm9iaiIKKworQ1BQX1BST0o9JChDUFBfUFJPSikgL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiRkVBVF9HVUlfVzMyIiAvRmQuXGdEYmcvIC9Gby5cZ0RiZy8KKyMgQUREIENQUCAgICAgICAgICAgIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIkZFQVRfR1VJX1czMiIgL0ZkLlxnRGJnLyAvRm8uXGdEYmcvCisKK1JTQ19QUk9KPSQoUlNDX1BST0opIC9kICJfREVCVUciIC9mby5cZ0RiZ1x2aW0ucmVzCisjIEFERCBSU0MgICAgICAgICAgICAvZCAiX0RFQlVHIiAvZm8uXGdEYmdcdmltLnJlcworCitMSU5LMzJfRkxBR1M9JChMSU5LMzJfRkxBR1MpIGxpYmNkLmxpYiAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9wcm9maWxlIC9wZGI6LlxnRGJnL2d2aW1kLnBkYiAvbWFwOi5cZ0RiZ1xndmltZC5tYXAgL291dDouXGd2aW1kLmV4ZQorIyBBREQgTElOSzMyICAgICAgICAgICAgICAgICBsaWJjZC5saWIgL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvcHJvZmlsZSAvcGRiOi5cZ0RiZy9ndmltZC5wZGIgL21hcDouXGdEYmdcZ3ZpbWQubWFwIC9vdXQ6LlxndmltZC5leGUKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIFJlbGVhc2UgdmltIgorCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAuXFJlbAorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgLlxSZWwKKworSU5URElSPS5cUmVsCitWSU09dmltCitFWFRSQVM9CisKK0NQUF9QUk9KPSQoQ1BQX1BST0opIC9PMiAvRCAiTkRFQlVHIiAvRmQuXFJlbC8gL0ZvLlxSZWwvCisjIEFERCBDUFAgICAgICAgICAgICAvTzIgL0QgIk5ERUJVRyIgL0ZkLlxSZWwvIC9Gby5cUmVsLworCitMSU5LMzJfRkxBR1M9JChMSU5LMzJfRkxBR1MpIC9wZGI6bm9uZSBsaWJjLmxpYiAvc3Vic3lzdGVtOmNvbnNvbGUgL291dDouXHZpbS5leGUKKyMgQUREIExJTkszMiAgICAgICAgICAgICAgICAgL3BkYjpub25lIGxpYmMubGliIC9zdWJzeXN0ZW06Y29uc29sZSAvb3V0Oi5cdmltLmV4ZQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAuXERiZworIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgLlxEYmcKKworSU5URElSPS5cRGJnCitWSU09dmltZAorRVhUUkFTPQorCitDUFBfUFJPSj0kKENQUF9QUk9KKSAvWmkgL09kIC9EICJfREVCVUciIC9GZC5cRGJnLyAvRm8uXERiZy8KKyMgQUREIENQUCAgICAgICAgICAgIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0ZkLlxEYmcvIC9Gby5cRGJnLworCitMSU5LMzJfRkxBR1M9JChMSU5LMzJfRkxBR1MpIGxpYmNkLmxpYiAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9wcm9maWxlIC9wZGI6LlxEYmcvdmltZC5wZGIgL21hcDouXERiZy92aW1kLm1hcCAvb3V0Oi5cdmltZC5leGUKKyMgQUREIExJTkszMiAgICAgICAgICAgICAgICAgbGliY2QubGliIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL3Byb2ZpbGUgL3BkYjouXERiZy92aW1kLnBkYiAvbWFwOi5cRGJnL3ZpbWQubWFwIC9vdXQ6Llx2aW1kLmV4ZQorCishRU5ESUYKKworQUxMIDogLlwkKFZJTSkuZXhlIHZpbXJ1bi5leGUgaW5zdGFsbC5leGUgdW5pbnN0YWwuZXhlIHh4ZC94eGQuZXhlIEd2aW1FeHQvZ3ZpbWV4dC5kbGwKKworTElOSzMyX09CSlM9IFwKKwkkKEVYVFJBUykgXAorCSIkKElOVERJUikvYnVmZmVyLm9iaiIgXAorCSIkKElOVERJUikvY2hhcnNldC5vYmoiIFwKKwkiJChJTlRESVIpL2RpZmYub2JqIiBcCisJIiQoSU5URElSKS9kaWdyYXBoLm9iaiIgXAorCSIkKElOVERJUikvZWRpdC5vYmoiIFwKKwkiJChJTlRESVIpL2V2YWwub2JqIiBcCisJIiQoSU5URElSKS9leF9jbWRzLm9iaiIgXAorCSIkKElOVERJUikvZXhfY21kczIub2JqIiBcCisJIiQoSU5URElSKS9leF9kb2NtZC5vYmoiIFwKKwkiJChJTlRESVIpL2V4X2V2YWwub2JqIiBcCisJIiQoSU5URElSKS9leF9nZXRsbi5vYmoiIFwKKwkiJChJTlRESVIpL2ZpbGVpby5vYmoiIFwKKwkiJChJTlRESVIpL2ZvbGQub2JqIiBcCisJIiQoSU5URElSKS9nZXRjaGFyLm9iaiIgXAorCSIkKElOVERJUikvbWFpbi5vYmoiIFwKKwkiJChJTlRESVIpL21hcmsub2JqIiBcCisJIiQoSU5URElSKS9tYnl0ZS5vYmoiIFwKKwkiJChJTlRESVIpL21lbWZpbGUub2JqIiBcCisJIiQoSU5URElSKS9tZW1saW5lLm9iaiIgXAorCSIkKElOVERJUikvbWVudS5vYmoiIFwKKwkiJChJTlRESVIpL21lc3NhZ2Uub2JqIiBcCisJIiQoSU5URElSKS9taXNjMS5vYmoiIFwKKwkiJChJTlRESVIpL21pc2MyLm9iaiIgXAorCSIkKElOVERJUikvbW92ZS5vYmoiIFwKKwkiJChJTlRESVIpL25vcm1hbC5vYmoiIFwKKwkiJChJTlRESVIpL29wcy5vYmoiIFwKKwkiJChJTlRESVIpL29wdGlvbi5vYmoiIFwKKwkiJChJTlRESVIpL29zX21zd2luLm9iaiIgXAorCSIkKElOVERJUikvb3Nfd2luMzIub2JqIiBcCisJIiQoSU5URElSKS9xdWlja2ZpeC5vYmoiIFwKKwkiJChJTlRESVIpL3JlZ2V4cC5vYmoiIFwKKwkiJChJTlRESVIpL3NjcmVlbi5vYmoiIFwKKwkiJChJTlRESVIpL3NlYXJjaC5vYmoiIFwKKwkiJChJTlRESVIpL3N5bnRheC5vYmoiIFwKKwkiJChJTlRESVIpL3RhZy5vYmoiIFwKKwkiJChJTlRESVIpL3Rlcm0ub2JqIiBcCisJIiQoSU5URElSKS91aS5vYmoiIFwKKwkiJChJTlRESVIpL3VuZG8ub2JqIiBcCisJIiQoSU5URElSKS92ZXJzaW9uLm9iaiIgXAorCSIkKElOVERJUikvd2luZG93Lm9iaiIKKworIi5cJChWSU0pLmV4ZSIgOiAiJChJTlRESVIpIiAkKEVYVFJBUykgJChMSU5LMzJfT0JKUykKKwlAaWYgZXhpc3QgJChJTlRESVIpXCQoVklNKS5wZGIgZGVsICQoSU5URElSKVwkKFZJTSkucGRiCisJJChMSU5LMzIpICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQorCisiJChJTlRESVIpIiA6CisJaWYgbm90IGV4aXN0ICIkKElOVERJUikvJChOVUxMKSIgbWtkaXIgIiQoSU5URElSKSIKKworQ0xFQU4gOgorCS1AaWYgZXhpc3QgIiQoSU5URElSKS8kKE5VTEwpIiAkKERFTF9UUkVFKSAiJChJTlRESVIpIgorCS1AaWYgZXhpc3QgJChWSU0pLmV4ZSBlcmFzZSAkKFZJTSkuZXhlCisJLUBpZiBleGlzdCAkKFZJTSkuaWxrIGVyYXNlICQoVklNKS5pbGsKKwktQGlmIGV4aXN0ICQoVklNKS5tYXAgZXJhc2UgJChWSU0pLm1hcAorCS1AaWYgZXhpc3QgJChWSU0pLnBkYiBlcmFzZSAkKFZJTSkucGRiCisJLUBpZiBleGlzdCBETExEQVRBLkMgZXJhc2UgRExMREFUQS5DCisJLUBpZiBleGlzdCBNYWtlX2l2Yy5iYWsgYXR0cmliIC1yIE1ha2VfaXZjLmJhaworCS1AaWYgZXhpc3QgTWFrZV9pdmMuYmFrIGVyYXNlIE1ha2VfaXZjLmJhaworCS1AaWYgZXhpc3QgTWFrZV9pdmMuZHNwIGVyYXNlIE1ha2VfaXZjLmRzcAorCS1AaWYgZXhpc3QgTWFrZV9pdmMuZHN3IGVyYXNlIE1ha2VfaXZjLmRzdworCS1AaWYgZXhpc3QgTWFrZV9pdmMubWRwIGVyYXNlIE1ha2VfaXZjLm1kcAorCS1AaWYgZXhpc3QgTWFrZV9pdmMubmNiIGVyYXNlIE1ha2VfaXZjLm5jYgorCS1AaWYgZXhpc3QgTWFrZV9pdmMub3B0IGVyYXNlIE1ha2VfaXZjLm9wdAorCS1AaWYgZXhpc3QgTWFrZV9pdmMucGxnIGVyYXNlIE1ha2VfaXZjLnBsZworCS1AaWYgZXhpc3QgZG9zaW5zdC5vYmogZXJhc2UgZG9zaW5zdC5vYmoKKwktQGlmIGV4aXN0IGluc3RhbGwuZXhlIGVyYXNlIGluc3RhbGwuZXhlCisJLUBpZiBleGlzdCB1bmluc3RhbC5leGUgZXJhc2UgdW5pbnN0YWwuZXhlCisJLUBpZiBleGlzdCB1bmluc3RhbC5vYmogZXJhc2UgdW5pbnN0YWwub2JqCisJLUBpZiBleGlzdCB2aW1ydW4uZXhlIGVyYXNlIHZpbXJ1bi5leGUKKwktQGlmIGV4aXN0IHZpbXJ1bi5vYmogZXJhc2UgdmltcnVuLm9iagorCisKK2luc3RhbGwuZXhlOiBkb3NpbnN0LmMKKwkkKENQUCkgL0ZlJEAgL25vbG9nbyAvVzMgLUROREVCVUcgLURXSU4zMiBkb3NpbnN0LmMga2VybmVsMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBhZHZhcGkzMi5saWIgdXVpZC5saWIKKwordW5pbnN0YWwuZXhlOiB1bmluc3RhbC5jCisJJChDUFApIC9ub2xvZ28gL1czIC1ETkRFQlVHIC1EV0lOMzIgdW5pbnN0YWwuYyBzaGVsbDMyLmxpYiBhZHZhcGkzMi5saWIKKwordmltcnVuLmV4ZTogdmltcnVuLmMKKwkkKENQUCkgL25vbG9nbyAvVzMgLUROREVCVUcgdmltcnVuLmMKKworeHhkL3h4ZC5leGU6IHh4ZC94eGQuYworCWNkIHh4ZAorCSQoTUFLRSkgL05PTE9HTyAtZiBNYWtlX212Yy5tYWsKKwljZCAuLgorCitHdmltRXh0L2d2aW1leHQuZGxsOiBHdmltRXh0L2d2aW1leHQuY3BwIEd2aW1FeHQvZ3ZpbWV4dC5yYyBHdmltRXh0L2d2aW1leHQuaAorCWNkIEd2aW1FeHQKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZWZpbGUKKwljZCAuLgorCit7Ln0uY3skKElOVERJUikvfS5vYmo6CisJJChDUFApICQoQ1BQX1BST0opICQ8CisKK3sufS5jcHB7JChJTlRESVIpL30ub2JqOgorCSQoQ1BQKSAkKENQUF9QUk9KKSAvSSAkKElOVERJUikgJDwKKworey59LnJjeyQoSU5URElSKS99LnJlczoKKwkkKFJTQykgJChSU0NfUFJPSikgJDwKKworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0gT0xFIgorIyBOYW1lICJWaW0gLSBXaW4zMiBEZWJ1ZyBndmltIE9MRSIKKyMgTmFtZSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIgorIyBOYW1lICJWaW0gLSBXaW4zMiBEZWJ1ZyBndmltIgorIyBOYW1lICJWaW0gLSBXaW4zMiBSZWxlYXNlIHZpbSIKKyMgTmFtZSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGJ1ZmZlci5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxjaGFyc2V0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGRpZmYuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZGlncmFwaC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxlZGl0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGV2YWwuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZXhfY21kcy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleF9jbWRzMi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleF9kb2NtZC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxleF9ldmFsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGV4X2dldGxuLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGZpbGVpby5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxmb2xkLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGdldGNoYXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZ3VpLmMKKworIUlGICAgICAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIFJlbGVhc2UgdmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIERlYnVnIHZpbSIKKworIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCisKKyFFTkRJRgorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxndWlfdzMyLmMKKworIUlGICAgICAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIFJlbGVhc2UgdmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIERlYnVnIHZpbSIKKworIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCisKKyFFTkRJRgorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxvc193MzJleGUuYworCishSUYgICAgICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSB2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVORElGCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGlmX29sZS5jcHAKKworIUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIE9MRSIKKworIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQorIyBCZWdpbiBDdXN0b20gQnVpbGQKKworIiQoSU5URElSKVxpZl9vbGUub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChJTlRESVIpXGlmX29sZS5oIgorIGNsLmV4ZSAvbm9sb2dvIC9NVCAvVzMgL0dYIC9JICIuXHByb3RvIiAvRCAiV0lOMzIiIC9jIC9PMiAvRCAiTkRFQlVHIiAvRCAiRkVBVF9HVUlfVzMyIiAvRCAiRkVBVF9PTEUiIC9GZC5cb2xlUmVsLyAvRm8uXG9sZVJlbC8gL0kgIi5cb2xlUmVsIiAuXGlmX29sZS5jcHAKKyBAcmVtIFRoaXMgaXMgdGhlIGRlZmF1bHQgcnVsZSB3aXRoIC9JICIkKEludERpcikiIGFkZGVkCisKKyMgRW5kIEN1c3RvbSBCdWlsZAorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSBPTEUiCisKKyMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkCisKKyIkKElOVERJUilcaWZfb2xlLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoSU5URElSKVxpZl9vbGUuaCIKKyBjbC5leGUgL25vbG9nbyAvTVQgL1czIC9HWCAvSSAiLlxwcm90byIgL0QgIldJTjMyIiAvYyAvWmkgL09kIC9EICJfREVCVUciIC9EICJGRUFUX0dVSV9XMzIiIC9EICJGRUFUX09MRSIgL0ZkLlxvbGVEYmcvIC9Gby5cb2xlRGJnLyAvSSAiLlxvbGVEYmciIC5caWZfb2xlLmNwcAorIEByZW0gVGhpcyBpcyB0aGUgZGVmYXVsdCBydWxlIHdpdGggL0kgIiQoSW50RGlyKSIgYWRkZWQKKworIyBFbmQgQ3VzdG9tIEJ1aWxkCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSIKKworIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBSZWxlYXNlIHZpbSIKKworIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBEZWJ1ZyB2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRU5ESUYKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caWZfb2xlLmlkbAorCishSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBSZWxlYXNlIGd2aW0gT0xFIgorCisjIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCisjIEJlZ2luIEN1c3RvbSBCdWlsZAorCisiJChJTlRESVIpXGlmX29sZS5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCWlmIGV4aXN0IC5caWZfb2xlLmggZGVsIC5caWZfb2xlLmgKKwltaWRsIC9vdXQgLlxvbGVSZWwgL2lpZCBpaWRfb2xlLmMgL3RsYiB2aW0udGxiIC9wcm94eSBudWwgL2hlYWRlciBpZl9vbGUuaCAuXGlmX29sZS5pZGwKKworIyBFbmQgQ3VzdG9tIEJ1aWxkCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaW0gLSBXaW4zMiBEZWJ1ZyBndmltIE9MRSIKKworIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQorIyBCZWdpbiBDdXN0b20gQnVpbGQKKworIiQoSU5URElSKVxpZl9vbGUuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKwlpZiBleGlzdCAuXGlmX29sZS5oIGRlbCAuXGlmX29sZS5oCisJbWlkbCAvb3V0IC5cb2xlRGJnIC9paWQgaWlkX29sZS5jIC90bGIgdmltLnRsYiAvcHJveHkgbnVsIC9oZWFkZXIgaWZfb2xlLmggLlxpZl9vbGUuaWRsCisKKyMgRW5kIEN1c3RvbSBCdWlsZAorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIERlYnVnIGd2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSB2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVORElGCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG1haW4uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbWFyay5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxtYnl0ZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxtZW1maWxlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG1lbWxpbmUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbWVudS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxtZXNzYWdlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG1pc2MxLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG1pc2MyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG1vdmUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cbm9ybWFsLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXG9wcy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxvcHRpb24uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cb3NfbXN3aW4uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cb3Nfd2luMzIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccXVpY2tmaXguYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmVnZXhwLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHNjcmVlbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxzZWFyY2guYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cc3ludGF4LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHRhZy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0ZXJtLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHVpLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHVuZG8uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdmVyc2lvbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx2aW0ucmMKKworIUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSBndmltIE9MRSIKKworIiQoSU5URElSKVx2aW0ucmVzIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChJTlRESVIpXGlmX29sZS5oIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSBPTEUiCisKKyIkKElOVERJUilcdmltLnJlcyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoSU5URElSKVxpZl9vbGUuaCIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpbSAtIFdpbjMyIFJlbGVhc2UgZ3ZpbSIKKworIiQoSU5URElSKVx2aW0ucmVzIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgZ3ZpbSIKKworIiQoSU5URElSKVx2aW0ucmVzIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgUmVsZWFzZSB2aW0iCisKKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQorCishRUxTRUlGICAiJChDRkcpIiA9PSAiVmltIC0gV2luMzIgRGVidWcgdmltIgorCisjIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKKworIUVORElGCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHdpbmRvdy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zcmMvTWFrZV9tYW54Lm1hayBiL3NyYy9NYWtlX21hbngubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzA2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9tYW54Lm1hawpAQCAtMCwwICsxLDMyMiBAQAorIworIyBNYWtlZmlsZSBmb3IgVklNIG9uIHRoZSBBbWlnYSwgdXNpbmcgQXp0ZWMvTWFueCBDIDUuMCBvciBsYXRlcgorIworIyBOb3RlOiBOb3QgYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuIFRoaXMgd2FzIGRvbmUgdG8gYXZvaWQgaGF2aW5nCisjCXRvIGNvbXBpbGUgZXZlcnl0aGluZyB3aGVuIGEgZ2xvYmFsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGlzIGFkZGVkLgorIwlDYXJlZnVsIHdoZW4gY2hhbmdpbmcgYSBnbG9iYWwgc3RydWN0IG9yIHZhcmlhYmxlIQorIworCisjPj4+Pj4gY2hvb3NlIG9wdGlvbnM6CisKKyMjIyBTZWUgZmVhdHVyZS5oIGZvciBhIGxpc3Qgb2Ygb3B0aW9uYWxzLgorIyMjIEFueSBvdGhlciBkZWZpbmVzIGNhbiBiZSBpbmNsdWRlZCBoZXJlLgorREVGSU5FUyA9CisKKyM+Pj4+PiBpZiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCBvYmovdGVybWxpYi5vIGhhcyB0byBiZSB1c2VkCisjVEVSTUxJQiA9IG9iai90ZXJtbGliLm8KK1RFUk1MSUIgPQorCisjPj4+Pj4gY2hvb3NlIGJldHdlZW4gZGVidWdnaW5nICgtYnMpIG9yIG9wdGltaXppbmcgKC1zbykKK09QVElPTlMgPSAtc28KKyNPUFRJT05TID0gLWJzCisKKyM+Pj4+PiBlbmQgb2YgY2hvaWNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NGTEFHUyA9ICQoT1BUSU9OUykgLXdhcHJ1cSAtcHMgLXFmIC1JcHJvdG8gJChERUZJTkVTKSAtREFNSUdBCisKK0xJQlMgPSAtbGMxNgorU1lNUyA9IHZpbS5zeW1zCitDQyA9IGNjCitMTiA9IGxuCitMTkZMQUdTID0gK3EKK1NIRUxMID0gY3NoCitSRU4gPSAkKFNIRUxMKSAtYyBtdiAtZgorREVMID0gJChTSEVMTCkgLWMgcm0gLWYKKworU1JDID0JYnVmZmVyLmMgXAorCWNoYXJzZXQuYyBcCisJZGlmZi5jIFwKKwlkaWdyYXBoLmMgXAorCWVkaXQuYyBcCisJZXZhbC5jIFwKKwlleF9jbWRzLmMgXAorCWV4X2NtZHMyLmMgXAorCWV4X2RvY21kLmMgXAorCWV4X2V2YWwuYyBcCisJZXhfZ2V0bG4uYyBcCisJZmlsZWlvLmMgXAorCWZvbGQuYyBcCisJZ2V0Y2hhci5jIFwKKwltYWluLmMgXAorCW1hcmsuYyBcCisJbWVtZmlsZS5jIFwKKwltZW1saW5lLmMgXAorCW1lbnUuYyBcCisJbWVzc2FnZS5jIFwKKwltaXNjMS5jIFwKKwltaXNjMi5jIFwKKwltb3ZlLmMgXAorCW1ieXRlLmMgXAorCW5vcm1hbC5jIFwKKwlvcHMuYyBcCisJb3B0aW9uLmMgXAorCW9zX2FtaWdhLmMgXAorCXF1aWNrZml4LmMgXAorCXJlZ2V4cC5jIFwKKwlzY3JlZW4uYyBcCisJc2VhcmNoLmMgXAorCXN5bnRheC5jIFwKKwl0YWcuYyBcCisJdGVybS5jIFwKKwl1aS5jIFwKKwl1bmRvLmMgXAorCXdpbmRvdy5jIFwKKwl2ZXJzaW9uLmMKKworSU5DTCA9IHZpbS5oIGZlYXR1cmUuaCBrZXltYXAuaCBtYWNyb3MuaCBhc2NpaS5oIHRlcm0uaCBzdHJ1Y3RzLmggb3NfYW1pZ2EuaAorCitPQkogPQlvYmovYnVmZmVyLm8gXAorCW9iai9jaGFyc2V0Lm8gXAorCW9iai9kaWZmLm8gXAorCW9iai9kaWdyYXBoLm8gXAorCW9iai9lZGl0Lm8gXAorCW9iai9ldmFsLm8gXAorCW9iai9leF9jbWRzLm8gXAorCW9iai9leF9jbWRzMi5vIFwKKwlvYmovZXhfZG9jbWQubyBcCisJb2JqL2V4X2V2YWwubyBcCisJb2JqL2V4X2dldGxuLm8gXAorCW9iai9maWxlaW8ubyBcCisJb2JqL2ZvbGQubyBcCisJb2JqL2dldGNoYXIubyBcCisJb2JqL21haW4ubyBcCisJb2JqL21hcmsubyBcCisJb2JqL21lbWZpbGUubyBcCisJb2JqL21lbWxpbmUubyBcCisJb2JqL21lbnUubyBcCisJb2JqL21lc3NhZ2UubyBcCisJb2JqL21pc2MxLm8gXAorCW9iai9taXNjMi5vIFwKKwlvYmovbW92ZS5vIFwKKwlvYmovbWJ5dGUubyBcCisJb2JqL25vcm1hbC5vIFwKKwlvYmovb3BzLm8gXAorCW9iai9vcHRpb24ubyBcCisJb2JqL29zX2FtaWdhLm8gXAorCW9iai9xdWlja2ZpeC5vIFwKKwlvYmovcmVnZXhwLm8gXAorCW9iai9zY3JlZW4ubyBcCisJb2JqL3NlYXJjaC5vIFwKKwlvYmovc3ludGF4Lm8gXAorCW9iai90YWcubyBcCisJb2JqL3Rlcm0ubyBcCisJb2JqL3VpLm8gXAorCW9iai91bmRvLm8gXAorCW9iai93aW5kb3cubyBcCisJJChURVJNTElCKQorCitQUk8gPQlwcm90by9idWZmZXIucHJvIFwKKwlwcm90by9jaGFyc2V0LnBybyBcCisJcHJvdG8vZGlmZi5wcm8gXAorCXByb3RvL2RpZ3JhcGgucHJvIFwKKwlwcm90by9lZGl0LnBybyBcCisJcHJvdG8vZXZhbC5wcm8gXAorCXByb3RvL2V4X2NtZHMucHJvIFwKKwlwcm90by9leF9jbWRzMi5wcm8gXAorCXByb3RvL2V4X2RvY21kLnBybyBcCisJcHJvdG8vZXhfZXZhbC5wcm8gXAorCXByb3RvL2V4X2dldGxuLnBybyBcCisJcHJvdG8vZmlsZWlvLnBybyBcCisJcHJvdG8vZm9sZC5wcm8gXAorCXByb3RvL2dldGNoYXIucHJvIFwKKwlwcm90by9tYWluLnBybyBcCisJcHJvdG8vbWFyay5wcm8gXAorCXByb3RvL21lbWZpbGUucHJvIFwKKwlwcm90by9tZW1saW5lLnBybyBcCisJcHJvdG8vbWVudS5wcm8gXAorCXByb3RvL21lc3NhZ2UucHJvIFwKKwlwcm90by9taXNjMS5wcm8gXAorCXByb3RvL21pc2MyLnBybyBcCisJcHJvdG8vbW92ZS5wcm8gXAorCXByb3RvL21ieXRlLnBybyBcCisJcHJvdG8vbm9ybWFsLnBybyBcCisJcHJvdG8vb3BzLnBybyBcCisJcHJvdG8vb3B0aW9uLnBybyBcCisJcHJvdG8vb3NfYW1pZ2EucHJvIFwKKwlwcm90by9xdWlja2ZpeC5wcm8gXAorCXByb3RvL3JlZ2V4cC5wcm8gXAorCXByb3RvL3NjcmVlbi5wcm8gXAorCXByb3RvL3NlYXJjaC5wcm8gXAorCXByb3RvL3N5bnRheC5wcm8gXAorCXByb3RvL3RhZy5wcm8gXAorCXByb3RvL3Rlcm0ucHJvIFwKKwlwcm90by90ZXJtbGliLnBybyBcCisJcHJvdG8vdWkucHJvIFwKKwlwcm90by91bmRvLnBybyBcCisJcHJvdG8vd2luZG93LnBybworCithbGw6IFZpbSB4eGQvWHhkCisKK1ZpbTogb2JqICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJChDQykgJChDRkxBR1MpIHZlcnNpb24uYyAtbyBvYmovdmVyc2lvbi5vCisJJChMTikgJChMTkZMQUdTKSAtbSAtbyBWaW0gJChPQkopIG9iai92ZXJzaW9uLm8gJChMSUJTKQorCitkZWJ1Zzogb2JqICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJChDQykgJChDRkxBR1MpIHZlcnNpb24uYyAtbyBvYmovdmVyc2lvbi5vCisJJChMTikgJChMTkZMQUdTKSAtbSAtZyAtbyBWaW0gJChPQkopIG9iai92ZXJzaW9uLm8gJChMSUJTKQorCit4eGQvWHhkOiB4eGQveHhkLmMKKwkkKFNIRUxMKSAtYyBjZCB4eGQ7IG1ha2UgLWYgTWFrZV9hbWlnYS5tYWs7IGNkIC4uCisKKyMgTWFraW5nIHByb3RvdHlwZXMgd2l0aCBNYW54IGhhcyBiZWVuIHJlbW92ZWQsIGJlY2F1c2UgaXQgY2F1c2VkIHRvbyBtYW55CisjIHByb2JsZW1zLgorI3Byb3RvOiAkKFNZTVMpICQoUFJPKQorCitvYmo6CisJbWFrZWRpciBvYmoKKwordGFnczogJChTUkMpICQoSU5DTCkKKwkkKFNIRUxMKSAtYyBjdGFncyAkKFNSQykgKi5oCisKKyMgY2FuJ3QgdXNlIGRlbGV0ZSBoZXJlLCB0b28gbWFueSBmaWxlIG5hbWVzCitjbGVhbjoKKwkkKERFTCkgJChPQkopIG9iai92ZXJzaW9uLm8gXAorCQlvYmovdGVybWxpYi5vIFZpbSAkKFNZTVMpIHh4ZC9YeGQKKwordGVzdDoKKwkkKFNIRUxMKSAtYyBjZCB0ZXN0ZGlyOyBtYWtlIC1mIE1ha2VfYW1pZ2EubWFrOyBjZCAuLgorCiskKFNZTVMpOiAkKElOQ0wpICQoUFJPKQorCSQoQ0MpICQoQ0ZMQUdTKSAtaG8kKFNZTVMpIHZpbS5oCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFVuZm9ydHVuYXRlbHksIE1hbngncyBtYWtlIGRvZXNuJ3QgdW5kZXJzdGFuZCBhIC5jLm8gcnVsZSwgc28gZWFjaAorIyBjb21waWxhdGlvbiBjb21tYW5kIGhhcyB0byBiZSBnaXZlbiBleHBsaWNpdGx5LgorCitDQ1NZTSA9ICQoQ0MpICQoQ0ZMQUdTKSAtaGkkKFNZTVMpIC1vCitDQ05PU1lNID0gJChDQykgJChDRkxBR1MpIC1vCisKKyQoT0JKKTogJChTWU1TKQorCitvYmovYnVmZmVyLm86CWJ1ZmZlci5jCisJJChDQ1NZTSkgJEAgYnVmZmVyLmMKKworb2JqL2NoYXJzZXQubzoJY2hhcnNldC5jCisJJChDQ1NZTSkgJEAgY2hhcnNldC5jCisKK29iai9kaWZmLm86CWRpZmYuYworCSQoQ0NTWU0pICRAIGRpZmYuYworCitvYmovZGlncmFwaC5vOglkaWdyYXBoLmMKKwkkKENDU1lNKSAkQCBkaWdyYXBoLmMKKworb2JqL2VkaXQubzoJZWRpdC5jCisJJChDQ1NZTSkgJEAgZWRpdC5jCisKK29iai9ldmFsLm86CWV2YWwuYworCSQoQ0NTWU0pICRAIGV2YWwuYworCitvYmovZXhfY21kcy5vOglleF9jbWRzLmMKKwkkKENDU1lNKSAkQCBleF9jbWRzLmMKKworb2JqL2V4X2NtZHMyLm86CWV4X2NtZHMyLmMKKwkkKENDU1lNKSAkQCBleF9jbWRzMi5jCisKKyMgRG9uJ3QgdXNlICQoU1lNUykgaGVyZSwgYmVjYXVzZSBleF9kb2NtZC5jIGRlZmluZXMgRE9fREVDTEFSRV9FWENNRAorb2JqL2V4X2RvY21kLm86CWV4X2RvY21kLmMgZXhfY21kcy5oCisJJChDQ05PU1lNKSAkQCBleF9kb2NtZC5jCisKK29iai9leF9ldmFsLm86CWV4X2V2YWwuYyBleF9jbWRzLmgKKwkkKENDU1lNKSAkQCBleF9ldmFsLmMKKworb2JqL2V4X2dldGxuLm86CWV4X2dldGxuLmMKKwkkKENDU1lNKSAkQCBleF9nZXRsbi5jCisKK29iai9maWxlaW8ubzoJZmlsZWlvLmMKKwkkKENDU1lNKSAkQCBmaWxlaW8uYworCitvYmovZm9sZC5vOglmb2xkLmMKKwkkKENDU1lNKSAkQCBmb2xkLmMKKworb2JqL2dldGNoYXIubzoJZ2V0Y2hhci5jCisJJChDQ1NZTSkgJEAgZ2V0Y2hhci5jCisKKyMgRG9uJ3QgdXNlICQoU1lNUykgaGVyZSwgYmVjYXVzZSBtYWluLmMgZGVmaW5lcyBFWFRFUk4KK29iai9tYWluLm86CW1haW4uYyBvcHRpb24uaCBnbG9iYWxzLmgKKwkkKENDTk9TWU0pICRAIG1haW4uYworCitvYmovbWFyay5vOgltYXJrLmMKKwkkKENDU1lNKSAkQCBtYXJrLmMKKworb2JqL21lbWZpbGUubzoJbWVtZmlsZS5jCisJJChDQ1NZTSkgJEAgbWVtZmlsZS5jCisKK29iai9tZW1saW5lLm86CW1lbWxpbmUuYworCSQoQ0NTWU0pICRAIG1lbWxpbmUuYworCitvYmovbWVudS5vOgltZW51LmMKKwkkKENDU1lNKSAkQCBtZW51LmMKKworIyBEb24ndCB1c2UgJChTWU1TKSBoZXJlLCBiZWNhdXNlIG1lc3NhZ2UuYyBkZWZpbmVzIE1FU1NBR0VfRklMRQorb2JqL21lc3NhZ2UubzoJbWVzc2FnZS5jCisJJChDQ05PU1lNKSAkQCBtZXNzYWdlLmMKKworb2JqL21pc2MxLm86CW1pc2MxLmMKKwkkKENDU1lNKSAkQCBtaXNjMS5jCisKK29iai9taXNjMi5vOgltaXNjMi5jCisJJChDQ1NZTSkgJEAgbWlzYzIuYworCitvYmovbW92ZS5vOgltb3ZlLmMKKwkkKENDU1lNKSAkQCBtb3ZlLmMKKworb2JqL21ieXRlLm86IG1ieXRlLmMKKwkkKENDU1lNKSAkQCBtYnl0ZS5jCisKK29iai9ub3JtYWwubzoJbm9ybWFsLmMKKwkkKENDU1lNKSAkQCBub3JtYWwuYworCitvYmovb3BzLm86CW9wcy5jCisJJChDQ1NZTSkgJEAgb3BzLmMKKworIyBEb24ndCB1c2UgJChTWU1TKSBoZXJlLCBiZWNhdXNlIG9wdGlvbi5oIGRlZmluZXMgdmFyaWFibGVzIGhlcmUKK29iai9vcHRpb24ubzoJb3B0aW9uLmMKKwkkKENDTk9TWU0pICRAIG9wdGlvbi5jCisKK29iai9vc19hbWlnYS5vOglvc19hbWlnYS5jCisJJChDQ1NZTSkgJEAgb3NfYW1pZ2EuYworCitvYmovcXVpY2tmaXgubzoJcXVpY2tmaXguYworCSQoQ0NTWU0pICRAIHF1aWNrZml4LmMKKworb2JqL3JlZ2V4cC5vOglyZWdleHAuYworCSQoQ0NTWU0pICRAIHJlZ2V4cC5jCisKK29iai9zY3JlZW4ubzoJc2NyZWVuLmMKKwkkKENDU1lNKSAkQCBzY3JlZW4uYworCitvYmovc2VhcmNoLm86CXNlYXJjaC5jCisJJChDQ1NZTSkgJEAgc2VhcmNoLmMKKworb2JqL3N5bnRheC5vOglzeW50YXguYworCSQoQ0NTWU0pICRAIHN5bnRheC5jCisKK29iai90YWcubzoJdGFnLmMKKwkkKENDU1lNKSAkQCB0YWcuYworCitvYmovdGVybS5vOgl0ZXJtLmMgdGVybS5oCisJJChDQ1NZTSkgJEAgdGVybS5jCisKK29iai90ZXJtbGliLm86CXRlcm1saWIuYworCSQoQ0NTWU0pICRAIHRlcm1saWIuYworCitvYmovdWkubzoJdWkuYworCSQoQ0NTWU0pICRAIHVpLmMKKworb2JqL3VuZG8ubzoJdW5kby5jCisJJChDQ1NZTSkgJEAgdW5kby5jCisKK29iai93aW5kb3cubzoJd2luZG93LmMKKwkkKENDU1lNKSAkQCB3aW5kb3cuYwpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfbWluZy5tYWsgYi9zcmMvTWFrZV9taW5nLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjc4MDYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfbWluZy5tYWsKQEAgLTAsMCArMSw1NTUgQEAKKyMgTWFrZWZpbGUgZm9yIFZJTSBvbiBXaW4zMiwgdXNpbmcgJ0VHQ1MvbWluZ3czMiAxLjEuMicuCisjIEluZm8gYXQgaHR0cDovL3d3dy5taW5ndy5vcmcKKyMgQWxzbyByZXF1aXJlcyAnR05VIG1ha2UgMy43NycsIHdoaWNoIHlvdSBjYW4gZ2V0IHRocm91Z2ggYSBsaW5rCisjIHRvICdKYW5KYWFwJ3MgcGFnZSBmcm9tIHRoZSBhYm92ZSBwYWdlLgorIyBHZXQgbWlzc2luZyBsaWJyYXJpZXMgZnJvbSBodHRwOi8vZ251d2luMzIuc2YubmV0LgorIworIyBUZXN0ZWQgb24gV2luMzIgTlQgNCBhbmQgV2luOTUuCisjCisjIFRvIG1ha2UgZXZlcnl0aGluZywganVzdCAnbWFrZSAtZiBNYWtlX21pbmcubWFrJworIyBUbyBtYWtlIGp1c3QgZS5nLiBndmltLmV4ZSwgJ21ha2UgLWYgTWFrZV9taW5nLm1hayBndmltLmV4ZScKKyMgQWZ0ZXIgYSBydW4sIHlvdSBjYW4gJ21ha2UgLWYgTWFrZV9taW5nLm1hayBjbGVhbicgdG8gY2xlYW4gdXAKKyMKKyMgTk9URTogU29tZXRpbWVzICdHTlUgTWFrZScgd2lsbCBzdG9wIGFmdGVyIGJ1aWxkaW5nIHZpbXJ1bi5leGUgLS0gSSB0aGluaworIyBpdCdzIGp1c3QgcnVuIG91dCBvZiBtZW1vcnkgb3Igc29tZXRoaW5nLiAgUnVuIGFnYWluLCBhbmQgaXQgd2lsbCBjb250aW51ZQorIyB3aXRoICd4eGQnLgorIworIyAibWFrZSB1cHgiIG1ha2VzICpjb21wcmVzc2VkKiB2ZXJzaW9ucyBvZiB0aGUgR1VJIGFuZCBjb25zb2xlIEVYRXMsIHVzaW5nIHRoZQorIyBleGNlbGxlbnQgVVBYIGNvbXByZXNzb3I6CisjICAgICBodHRwOi8vdXB4LnNvdXJjZWZvcmdlLm5ldC8KKyMKKyMgTWFpbnRhaW5lZCBieSBSb24gQWFyb24gPHJvbmFoYXJvbkB5YWhvby5jb20+CisjIHVwZGF0ZWQgMjAwMyBKYW4gMjAKKworIz4+Pj4+IGNob29zZSBvcHRpb25zOgorIyBzZXQgdG8geWVzIGZvciBhIGRlYnVnIGJ1aWxkCitERUJVRz1ubworIyBzZXQgdG8gU0laRSBmb3Igc2l6ZSwgU1BFRUQgZm9yIHNwZWVkLCBNQVhTUEVFRCBmb3IgbWF4aW1pdW0gb3B0aW1pemF0aW9uCitPUFRJTUlaRT1NQVhTUEVFRAorIyBzZXQgdG8geWVzIHRvIG1ha2UgZ3ZpbSwgbm8gZm9yIHZpbQorR1VJPXllcworIyBGRUFUVVJFUz1bVElOWSB8IFNNQUxMICB8IE5PUk1BTCB8IEJJRyB8IEhVR0VdCisjIHNldCB0byBUSU5ZIHRvIG1ha2UgbWluaW1hbCB2ZXJzaW9uIChmZXcgZmVhdHVyZXMpCitGRUFUVVJFUz1CSUcKKyMgc2V0IHRvIG9uZSBvZiBpMzg2LCBpNDg2LCBpNTg2LCBpNjg2IGFzIHRoZSAqdGFyZ2V0KiBwcm9jZXNzb3IKK0NQVU5SPWk2ODYKKyMgc2V0IHRvIHNhbWUgY2hvaWNlcyBhcyAnQ1BVTlInLCBidXQgd2lsbCBwcmV2ZW50IHJ1bm5pbmcgb24gJ2xvd2VyJyBjcHVzOgorQVJDSD1pMzg2CisjIHNldCB0byB5ZXMgdG8gY3Jvc3MtY29tcGlsZSBmcm9tIHVuaXg7IG5vPW5hdGl2ZSBXaW5kb3dzCitDUk9TUz1ubworIyBzZXQgdG8gcGF0aCB0byBpY29udi5oIGFuZCBsaWJpY29udi5hIHRvIGVuYWJsZSB1c2luZyAnaWNvbnYuZGxsJworI0lDT05WPSIuIgorSUNPTlY9eWVzCitHRVRURVhUPXllcworIyBzZXQgdG8geWVzIHRvIGluY2x1ZGUgbXVsdGlieXRlIHN1cHBvcnQKK01CWVRFPXllcworIyBzZXQgdG8geWVzIHRvIGluY2x1ZGUgSU1FIHN1cHBvcnQKK0lNRT15ZXMKK0RZTkFNSUNfSU1FPXllcworIyBzZXQgdG8geWVzIHRvIGVuYWJsZSB3cml0aW5nIGEgcG9zdHNjcmlwdCBmaWxlIHdpdGggOmhhcmRjb3B5CitQT1NUU0NSSVBUPW5vCisjIHNldCB0byB5ZXMgdG8gZW5hYmxlIE9MRSBzdXBwb3J0CitPTEU9bm8KKyMgU2V0IHRoZSBkZWZhdWx0ICQoV0lOVkVSKSB0byBtYWtlIGl0IHdvcmsgd2l0aCBwcmUtV2luMmsKK1dJTlZFUiA9IDB4MDQwMAorIyBTZXQgdG8geWVzIHRvIGVuYWJsZSBDc2NvcGUgc3VwcG9ydAorQ1NDT1BFPXllcworIyBTZXQgdG8geWVzIHRvIGVuYWJsZSBOZXRiZWFucyBzdXBwb3J0CitORVRCRUFOUz0kKEdVSSkKKworCisjIElmIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCBnZXR0ZXh0LCB1bmRlZmluZSBpdC4KK2lmZXEgKG5vLCAkKEdFVFRFWFQpKQorR0VUVEVYVD0KK2VuZGlmCisjIEFkZGVkIGJ5IEUuRi4gQW1hdHJpYSA8ZWZlcm5hMUBwbGF0ZWEucHRpYy5tZWMuZXM+IDIwMDEgRmViIDIzCisjIFVuY29tbWVudCB0aGUgZmlyc3QgbGluZSBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgaWYgeW91IHdhbnQgTmF0aXZlIExhbmd1YWdlCisjIFN1cHBvcnQuICBZb3UnbGwgbmVlZCBnbnVfZ2V0dGV4dC53aW4zMiwgYSBNSU5HVzMyIFdpbmRvd3MgUE9SVCBvZiBnZXR0ZXh0IGJ5CisjIEZyYW5jbyBCZXogPGZyYW5jby5iZXpAZ214LmRlPi4gIEl0IG1heSBiZSBmb3VuZCBhdAorIyBodHRwOi8vaG9tZS5hLWNpdHkuZGUvZnJhbmNvLmJlei9nZXR0ZXh0L2dldHRleHRfd2luMzJfZW4uaHRtbAorIyBUZXN0ZWQgd2l0aCBtaW5ndzMyIHdpdGggR0NDLTIuOTUuMiBvbiBXaW45OAorIyBVcGRhdGVkIDIwMDEgSnVuIDkKKyNHRVRURVhUPWM6L2dldHRleHQud2luMzIubXN2Y3J0CisjU1RBVElDX0dFVFRFWFQ9VVNFX1NUQVRJQ19HRVRURVhUCisjRFlOQU1JQ19HRVRURVhUPVVTRV9HRVRURVhUX0RMTAorI0RZTkFNSUNfR0VUVEVYVD1VU0VfU0FGRV9HRVRURVhUX0RMTAorU0FGRV9HRVRURVhUX0RMTF9PQkogPSAkKEdFVFRFWFQpL3NyYy9zYWZlX2dldHRleHRfZGxsL3NhZmVfZ2V0dGV4dF9kbGwubworIyBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgdW5jb21tZW50IHRoZSB0d28gZm9sbG93aW5nIGxpbmVzLCB5b3UgZ2V0IGEgInNhZmUiIHZlcnNpb24KKyMgd2l0aG91dCBsaW5raW5nIHRoZSBzYWZlX2dldHRleHRfZGxsLm8gb2JqZWN0IGZpbGUuCisjRFlOQU1JQ19HRVRURVhUPURZTkFNSUNfR0VUVEVYVAorI0dFVFRFWFRfRFlOQU1JQz1nbnVfZ2V0dGV4dC5kbGwKK0lOVExQQVRIPSQoR0VUVEVYVCkvbGliL21pbmd3MzIKK0lOVExMSUI9Z251X2dldHRleHQKKworIyBJZiB5b3UgYXJlIHVzaW5nIGdldHRleHQtMC4xMC4zNSBmcm9tIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZ2V0dGV4dAorIyBvciBnZXR0ZXh0LTAuMTAuMzcgZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21pbmd3cmVwLworIyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZywgYnV0IEkgY2FuJ3QgYnVpbGQgYSBzdGF0aWMgdmVyc2nzbiB3aXRoIHRoZW0sID8tKHwKKyNHRVRURVhUPWM6L2dldHRleHQtMC4xMC4zNy0yMDAxMDQzMAorI1NUQVRJQ19HRVRURVhUPVVTRV9TVEFUSUNfR0VUVEVYVAorI0RZTkFNSUNfR0VUVEVYVD1EWU5BTUlDX0dFVFRFWFQKKyNJTlRMUEFUSD0kKEdFVFRFWFQpL2xpYgorI0lOVExMSUI9aW50bAorCisjIHVuY29tbWVudCAnUEVSTCcgaWYgeW91IHdhbnQgYSBwZXJsLWVuYWJsZWQgdmVyc2lvbgorI1BFUkw9QzovcGVybAoraWZkZWYgUEVSTAoraWZuZGVmIFBFUkxfVkVSCitQRVJMX1ZFUj01NgorZW5kaWYKK2lmbmRlZiBEWU5BTUlDX1BFUkwKK0RZTkFNSUNfUEVSTD15ZXMKK2VuZGlmCisjIG9uIExpbnV4LCBmb3IgY3Jvc3MtY29tcGlsZSwgaXQncyBoZXJlOgorI1BFUkxMSUI9L2hvbWUvcm9uL0FjdGl2ZVBlcmwvbGliCisjIG9uIE5ULCBpdCdzIGhlcmU6CitQRVJMTElCPSQoUEVSTCkvbGliCitQRVJMTElCUz0kKFBFUkxMSUIpL0NvcmUKK2VuZGlmCisKKyMgUHl0aG9uIHN1cHBvcnQgLS0gd29ya3Mgd2l0aCB0aGUgQWN0aXZlU3RhdGUgcHl0aG9uIDIuMCByZWxlYXNlIChhbmQgb3RoZXJzCisjIHRvbywgcHJvYmFibHkpCisjCisjIHVuY29tbWVudCAnUFlUSE9OJyB0byBtYWtlIHB5dGhvbi1lbmFibGVkIHZlcnNpb24KKyMgUHV0IHRoZSBwYXRoIHRvIHRoZSBweXRob24gZGlzdHJvIGhlcmUuICBJZiBjcm9zcyBjb21waWxpbmcgZnJvbSBMaW51eCwgeW91CisjIHdpbGwgYWxzbyBuZWVkIHRvIGNvbnZlcnQgdGhlIGhlYWRlciBmaWxlcyB0byB1bml4IGluc3RlYWQgb2YgZG9zIGZvcm1hdDoKKyMgICBmb3IgZmlsIGluICouaCA7IGRvIHZpbSAtZSAtYyAnc2V0IGZmPXVuaXh8d3xxJyAkZmlsCisjIGFuZCBhbHNvLCB5b3Ugd2lsbCBuZWVkIHRvIG1ha2UgYSBtaW5ndzMyICdsaWJweXRob24yMC5hJyB0byBsaW5rIHdpdGg6CisjICAgY2QgJFBZVEhPTi9saWJzCisjICAgcGV4cG9ydHMgcHl0aG9uMjAuZGxsID4gcHl0aG9uMjAuZGVmCisjICAgZGxsdG9vbCAtZCBweXRob24yMC5kZWYgLWwgbGlicHl0aG9uMjAuYQorIyBvbiBteSBMaW51eCBib3gsIEkgcHV0IHRoZSBQeXRob24gc3R1ZmYgaGVyZToKKyNQWVRIT049L2hvbWUvcm9uL0FjdGl2ZVB5dGhvbi0yLjAuMC0yMDIvc3JjL0NvcmUKKyMgb24gbXkgTlQgYm94LCBpdCdzIGhlcmU6CisjUFlUSE9OPWM6L3B5dGhvbjIwCisKK2lmZGVmIFBZVEhPTgoraWZuZGVmIERZTkFNSUNfUFlUSE9OCitEWU5BTUlDX1BZVEhPTj15ZXMKK2VuZGlmCisKK2lmbmRlZiBQWVRIT05fVkVSCitQWVRIT05fVkVSPTIyCitlbmRpZgorCitpZmVxIChubywkKERZTkFNSUNfUFlUSE9OKSkKK1BZVEhPTkxJQj0tTCQoUFlUSE9OKS9saWJzIC1scHl0aG9uJChQWVRIT05fVkVSKQorZW5kaWYKKyMgbXkgaW5jbHVkZSBmaWxlcyBhcmUgaW4gJ3dpbjMyaW5jJyBvbiBMaW51eCwgYW5kICdpbmNsdWRlJyBpbiB0aGUgc3RhbmRhcmQKKyMgTlQgZGlzdHJvIChBY3RpdmVTdGF0ZSkKK2lmZXEgKCQoQ1JPU1MpLG5vKQorUFlUSE9OSU5DPS1JICQoUFlUSE9OKS9pbmNsdWRlCitlbHNlCitQWVRIT05JTkM9LUkgJChQWVRIT04pL3dpbjMyaW5jCitlbmRpZgorZW5kaWYKKworIwlUQ0wgaW50ZXJmYWNlOgorIwkgIFRDTD1bUGF0aCB0byBUQ0wgZGlyZWN0b3J5XQorIwkgIERZTkFNSUNfVENMPXllcyAodG8gbG9hZCB0aGUgVENMIERMTCBkeW5hbWljYWxseSkKKyMJICBUQ0xfVkVSPVtUQ0wgdmVyc2lvbiwgZWcgODMsIDg0XSAoZGVmYXVsdCBpcyA4MykKKyNUQ0w9YzovdGNsCitpZmRlZiBUQ0wKK2lmbmRlZiBEWU5BTUlDX1RDTAorRFlOQU1JQ19UQ0w9eWVzCitlbmRpZgoraWZuZGVmIFRDTF9WRVIKK1RDTF9WRVIgPSA4MworZW5kaWYKK1RDTElOQyArPSAtSSQoVENMKS9pbmNsdWRlCitlbmRpZgorCisKKyMJUnVieSBpbnRlcmZhY2U6CisjCSAgUlVCWT1bUGF0aCB0byBSdWJ5IGRpcmVjdG9yeV0KKyMJICBEWU5BTUlDX1JVQlk9eWVzICh0byBsb2FkIHRoZSBSdWJ5IERMTCBkeW5hbWljYWxseSkKKyMJICBSVUJZX1ZFUj1bUnVieSB2ZXJzaW9uLCBlZyAxNiwgMTddIChkZWZhdWx0IGlzIDE2KQorIwkgIFJVQllfVkVSX0xPTkc9W1J1YnkgdmVyc2lvbiwgZWcgMS42LCAxLjddIChkZWZhdWx0IGlzIDEuNikKKyMJICAgIFlvdSBtdXN0IHNldCBSVUJZX1ZFUl9MT05HIHdoZW4gY2hhbmdlIFJVQllfVkVSLgorI1JVQlk9YzovcnVieQoraWZkZWYgUlVCWQoraWZuZGVmIERZTkFNSUNfUlVCWQorRFlOQU1JQ19SVUJZPXllcworZW5kaWYKKyMgIFNldCBkZWZhdWx0IHZhbHVlCitpZm5kZWYgUlVCWV9WRVIKK1JVQllfVkVSID0gMTYKK2VuZGlmCitpZm5kZWYgUlVCWV9WRVJfTE9ORworUlVCWV9WRVJfTE9ORyA9IDEuNgorZW5kaWYKKworaWZlcSAoJChSVUJZX1ZFUiksIDE2KQoraWZuZGVmIFJVQllfUExBVEZPUk0KK1JVQllfUExBVEZPUk0gPSBpNTg2LW1zd2luMzIKK2VuZGlmCitpZm5kZWYgUlVCWV9JTlNUQUxMX05BTUUKK1JVQllfSU5TVEFMTF9OQU1FID0gbXN3aW4zMi1ydWJ5JChSVUJZX1ZFUikKK2VuZGlmCitlbHNlCitpZm5kZWYgUlVCWV9QTEFURk9STQorUlVCWV9QTEFURk9STSA9IGkzODYtbXN3aW4zMgorZW5kaWYKK2lmbmRlZiBSVUJZX0lOU1RBTExfTkFNRQorUlVCWV9JTlNUQUxMX05BTUUgPSBtc3ZjcnQtcnVieSQoUlVCWV9WRVIpCitlbmRpZgorZW5kaWYKKworUlVCWUlOQyA9LUkgJChSVUJZKS9saWIvcnVieS8kKFJVQllfVkVSX0xPTkcpLyQoUlVCWV9QTEFURk9STSkKK2lmZXEgKG5vLCAkKERZTkFNSUNfUlVCWSkpCitSVUJZTElCID0gLUwkKFJVQlkpL2xpYiAtbCQoUlVCWV9JTlNUQUxMX05BTUUpCitlbmRpZgorCitlbmRpZiAjIFJVQlkKKworIyBTZWUgZmVhdHVyZS5oIGZvciBhIGxpc3Qgb2Ygb3B0aW9ucy4KKyMgQW55IG90aGVyIGRlZmluZXMgY2FuIGJlIGluY2x1ZGVkIGhlcmUuCitERUZfR1VJPS1ERkVBVF9HVUlfVzMyIC1ERkVBVF9DTElQQk9BUkQKK0RFRklORVM9LURXSU4zMiAtRFdJTlZFUj0kKFdJTlZFUikgLURfV0lOMzJfV0lOTlQ9JChXSU5WRVIpIFwKKwktREhBVkVfUEFUSERFRiAtREZFQVRfJChGRUFUVVJFUykKK2lmZXEgKCQoQ1JPU1MpLHllcykKKyMgY3Jvc3MtY29tcGlsZXI6CitDQyA9IGk1ODYtcGMtbWluZ3czMm1zdmMtZ2NjCitERUwgPSBybQorV0lORFJFUyA9IGk1ODYtcGMtbWluZ3czMm1zdmMtd2luZHJlcworZWxzZQorIyBub3JtYWwgKFdpbmRvd3MpIGNvbXBpbGF0aW9uOgorQ0MgPSBnY2MKK2lmbmVxIChzaC5leGUsICQoU0hFTEwpKQorREVMID0gcm0KK0RJUlNMQVNIID0gLworZWxzZQorREVMID0gZGVsCitESVJTTEFTSCA9IFxcCitlbmRpZgorV0lORFJFUyA9IHdpbmRyZXMKK2VuZGlmCisKKyM+Pj4+PiBlbmQgb2YgY2hvaWNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NGTEFHUyA9IC1JcHJvdG8gJChERUZJTkVTKSAtcGlwZSAtdyAtbWFyY2g9JChBUkNIKSAtbWNwdT0kKENQVU5SKSAtV2FsbAorCitpZmRlZiBHRVRURVhUCitERUZJTkVTICs9LURIQVZFX0dFVFRFWFQgLURIQVZFX0xPQ0FMRV9ICitHRVRURVhUSU5DTFVERSA9ICQoR0VUVEVYVCkvaW5jbHVkZQorR0VUVEVYVExJQiA9ICQoSU5UTFBBVEgpCitpZmVxICh5ZXMsICQoR0VUVEVYVCkpCitERUZJTkVTICs9LUREWU5BTUlDX0dFVFRFWFQKK2Vsc2UKK2lmZGVmIERZTkFNSUNfR0VUVEVYVAorREVGSU5FUyArPS1EJChEWU5BTUlDX0dFVFRFWFQpCitpZmRlZiBHRVRURVhUX0RZTkFNSUMKK0RFRklORVMgKz0gLURHRVRURVhUX0RZTkFNSUMgLURHRVRURVhUX0RMTD1cIiQoR0VUVEVYVF9EWU5BTUlDKVwiCitlbmRpZgorZW5kaWYKK2VuZGlmCitlbmRpZgorCitpZmRlZiBQRVJMCitDRkxBR1MgKz0gLUkkKFBFUkxMSUJTKSAtREZFQVRfUEVSTCAtTCQoUEVSTExJQlMpCitpZmVxICh5ZXMsICQoRFlOQU1JQ19QRVJMKSkKK0NGTEFHUyArPSAtRERZTkFNSUNfUEVSTCAtRERZTkFNSUNfUEVSTF9ETEw9XCJwZXJsJChQRVJMX1ZFUikuZGxsXCIKK2VuZGlmCitlbmRpZgorCitpZmRlZiBSVUJZCitDRkxBR1MgKz0gLURGRUFUX1JVQlkgJChSVUJZSU5DKQoraWZlcSAoeWVzLCAkKERZTkFNSUNfUlVCWSkpCitDRkxBR1MgKz0gLUREWU5BTUlDX1JVQlkgLUREWU5BTUlDX1JVQllfRExMPVwiJChSVUJZX0lOU1RBTExfTkFNRSkuZGxsXCIKK0NGTEFHUyArPSAtRERZTkFNSUNfUlVCWV9WRVI9JChSVUJZX1ZFUikKK2VuZGlmCitlbmRpZgorCitpZmRlZiBQWVRIT04KK0NGTEFHUyArPSAtREZFQVRfUFlUSE9OICQoUFlUSE9OSU5DKQoraWZlcSAoeWVzLCAkKERZTkFNSUNfUFlUSE9OKSkKK0NGTEFHUyArPSAtRERZTkFNSUNfUFlUSE9OIC1ERFlOQU1JQ19QWVRIT05fRExMPVwicHl0aG9uJChQWVRIT05fVkVSKS5kbGxcIgorZW5kaWYKK2VuZGlmCisKK2lmZGVmIFRDTAorQ0ZMQUdTICs9IC1ERkVBVF9UQ0wgJChUQ0xJTkMpCitpZmVxICh5ZXMsICQoRFlOQU1JQ19UQ0wpKQorQ0ZMQUdTICs9IC1ERFlOQU1JQ19UQ0wgLUREWU5BTUlDX1RDTF9ETEw9XCJ0Y2wkKFRDTF9WRVIpLmRsbFwiCitlbmRpZgorZW5kaWYKKworaWZlcSAoJChQT1NUU0NSSVBUKSx5ZXMpCitERUZJTkVTICs9IC1ETVNXSU5QUworZW5kaWYKKworaWZlcSAoeWVzLCAkKE9MRSkpCitERUZJTkVTICs9IC1ERkVBVF9PTEUKK2VuZGlmCisKK2lmZXEgKCQoQ1NDT1BFKSx5ZXMpCitERUZJTkVTICs9IC1ERkVBVF9DU0NPUEUKK2VuZGlmCisKK2lmZXEgKCQoTkVUQkVBTlMpLHllcykKK0RFRklORVMgKz0gLURGRUFUX05FVEJFQU5TX0lOVEcKK2lmZXEgKCQoREVCVUcpLCB5ZXMpCitERUZJTkVTICs9IC1ETkJERUJVRworTkJERUJVR19JTkNMID0gbmJkZWJ1Zy5oCitOQkRFQlVHX1NSQyA9IG5iZGVidWcuYworZW5kaWYKK2VuZGlmCisKK2lmZGVmIFhQTQorQ0ZMQUdTICs9IC1ERkVBVF9YUE1fVzMyIC1JICQoWFBNKS9pbmNsdWRlCitlbmRpZgorCitpZmVxICgkKERFQlVHKSx5ZXMpCitDRkxBR1MgKz0gLWcgLWZzdGFjay1jaGVjaworREVCVUdfU1VGRklYPWQKK2Vsc2UKK2lmZXEgKCQoT1BUSU1JWkUpLCBTSVpFKQorQ0ZMQUdTICs9IC1PcworZWxzZQoraWZlcSAoJChPUFRJTUlaRSksIE1BWFNQRUVEKQorQ0ZMQUdTICs9IC1PMworQ0ZMQUdTICs9IC1mb21pdC1mcmFtZS1wb2ludGVyIC1mcmVnLXN0cnVjdC1yZXR1cm4gLW1hbGlnbi1kb3VibGUKK2Vsc2UgICMgU1BFRUQKK0NGTEFHUyArPSAtTzIKK2VuZGlmCitlbmRpZgorQ0ZMQUdTICs9IC1zCitlbmRpZgorCitMSUIgPSAtbGtlcm5lbDMyIC1sdXNlcjMyIC1sZ2RpMzIgLWxhZHZhcGkzMiAtbGNvbWRsZzMyIC1sY29tY3RsMzIKK0dVSU9CSiA9ICAkKE9VVERJUikvZ3VpLm8gJChPVVRESVIpL2d1aV93MzIubyAkKE9VVERJUikvb3NfdzMyZXhlLm8KK09CSiA9IFwKKwkkKE9VVERJUikvYnVmZmVyLm8gXAorCSQoT1VURElSKS9jaGFyc2V0Lm8gXAorCSQoT1VURElSKS9kaWZmLm8gXAorCSQoT1VURElSKS9kaWdyYXBoLm8gXAorCSQoT1VURElSKS9lZGl0Lm8gXAorCSQoT1VURElSKS9ldmFsLm8gXAorCSQoT1VURElSKS9leF9jbWRzLm8gXAorCSQoT1VURElSKS9leF9jbWRzMi5vIFwKKwkkKE9VVERJUikvZXhfZG9jbWQubyBcCisJJChPVVRESVIpL2V4X2V2YWwubyBcCisJJChPVVRESVIpL2V4X2dldGxuLm8gXAorCSQoT1VURElSKS9maWxlaW8ubyBcCisJJChPVVRESVIpL2ZvbGQubyBcCisJJChPVVRESVIpL2dldGNoYXIubyBcCisJJChPVVRESVIpL21haW4ubyBcCisJJChPVVRESVIpL21hcmsubyBcCisJJChPVVRESVIpL21lbWZpbGUubyBcCisJJChPVVRESVIpL21lbWxpbmUubyBcCisJJChPVVRESVIpL21lbnUubyBcCisJJChPVVRESVIpL21lc3NhZ2UubyBcCisJJChPVVRESVIpL21pc2MxLm8gXAorCSQoT1VURElSKS9taXNjMi5vIFwKKwkkKE9VVERJUikvbW92ZS5vIFwKKwkkKE9VVERJUikvbWJ5dGUubyBcCisJJChPVVRESVIpL25vcm1hbC5vIFwKKwkkKE9VVERJUikvb3BzLm8gXAorCSQoT1VURElSKS9vcHRpb24ubyBcCisJJChPVVRESVIpL29zX3dpbjMyLm8gXAorCSQoT1VURElSKS9vc19tc3dpbi5vIFwKKwkkKE9VVERJUikvcGF0aGRlZi5vIFwKKwkkKE9VVERJUikvcXVpY2tmaXgubyBcCisJJChPVVRESVIpL3JlZ2V4cC5vIFwKKwkkKE9VVERJUikvc2NyZWVuLm8gXAorCSQoT1VURElSKS9zZWFyY2gubyBcCisJJChPVVRESVIpL3N5bnRheC5vIFwKKwkkKE9VVERJUikvdGFnLm8gXAorCSQoT1VURElSKS90ZXJtLm8gXAorCSQoT1VURElSKS91aS5vIFwKKwkkKE9VVERJUikvdW5kby5vIFwKKwkkKE9VVERJUikvdmVyc2lvbi5vIFwKKwkkKE9VVERJUikvdmltcmMubyBcCisJJChPVVRESVIpL3dpbmRvdy5vCisKK2lmZGVmIFBFUkwKK09CSiArPSAkKE9VVERJUikvaWZfcGVybC5vCitlbmRpZgoraWZkZWYgUFlUSE9OCitPQkogKz0gJChPVVRESVIpL2lmX3B5dGhvbi5vCitlbmRpZgoraWZkZWYgUlVCWQorT0JKICs9ICQoT1VURElSKS9pZl9ydWJ5Lm8KK2VuZGlmCitpZmRlZiBUQ0wKK09CSiArPSAkKE9VVERJUikvaWZfdGNsLm8KK2VuZGlmCitpZmVxICgkKENTQ09QRSkseWVzKQorT0JKICs9ICQoT1VURElSKS9pZl9jc2NvcGUubworZW5kaWYKK2lmZXEgKCQoTkVUQkVBTlMpLHllcykKK09CSiArPSAkKE9VVERJUikvbmV0YmVhbnMubyAkKE9VVERJUikvZ3VpX2JldmFsLm8KK0xJQiArPSAtbHdzb2NrMzIKK2VuZGlmCitpZmRlZiBYUE0KK09CSiArPSAkKE9VVERJUikveHBtX3czMi5vCisjIFlvdSdsbCBuZWVkIGxpYlhwbS5hIGZyb20gaHR0cDovL2dudXdpbjMyLnNmLm5ldAorTElCICs9IC1MICQoWFBNKS9saWIgLWxYcG0KK2VuZGlmCisKKworaWZlcSAoJChHVUkpLHllcykKK1RBUkdFVCA6PSBndmltJChERUJVR19TVUZGSVgpLmV4ZQorREVGSU5FUyArPSAkKERFRl9HVUkpCitPQkogKz0gJChHVUlPQkopCitMRkxBR1MgKz0gLW13aW5kb3dzCitPVVRESVIgPSBnb2JqJChERUJVR19TVUZGSVgpCitlbHNlCitUQVJHRVQgOj0gdmltJChERUJVR19TVUZGSVgpLmV4ZQorT1VURElSID0gb2JqJChERUJVR19TVUZGSVgpCitlbmRpZgorCitpZmRlZiBHRVRURVhUCitpZm5lcSAoeWVzLCAkKEdFVFRFWFQpKQorQ0ZMQUdTICs9IC1JJChHRVRURVhUSU5DTFVERSkKK2lmbmRlZiBTVEFUSUNfR0VUVEVYVAorTElCICs9IC1MJChHRVRURVhUTElCKSAtbCQoSU5UTExJQikKK2lmZXEgKFVTRV9TQUZFX0dFVFRFWFRfRExMLCAkKERZTkFNSUNfR0VUVEVYVCkpCitPQkorPSQoU0FGRV9HRVRURVhUX0RMTF9PQkopCitlbmRpZgorZWxzZQorTElCICs9IC1MJChHRVRURVhUTElCKSAtbGludGwKK2VuZGlmCitlbmRpZgorZW5kaWYKKworaWZkZWYgUEVSTAoraWZlcSAobm8sICQoRFlOQU1JQ19QRVJMKSkKK0xJQiArPSAtbHBlcmwkKFBFUkxfVkVSKQorZW5kaWYKK2VuZGlmCisKK2lmZGVmIFRDTAorTElCICs9IC1MJChUQ0wpL2xpYgoraWZlcSAoeWVzLCAkKERZTkFNSUNfVENMKSkKK0xJQiArPSAtbHRjbHN0dWIkKFRDTF9WRVIpCitlbHNlCitMSUIgKz0gLWx0Y2wkKFRDTF9WRVIpCitlbmRpZgorZW5kaWYKKworaWZlcSAoeWVzLCAkKE9MRSkpCitMSUIgKz0gLWxvbGVhdXQzMiAtbHN0ZGMrKworT0JKICs9ICQoT1VURElSKS9pZl9vbGUubworZW5kaWYKKworaWZlcSAoeWVzLCAkKE1CWVRFKSkKK0RFRklORVMgKz0gLURGRUFUX01CWVRFCitlbmRpZgorCitpZmVxICh5ZXMsICQoSU1FKSkKK0RFRklORVMgKz0gLURGRUFUX01CWVRFX0lNRQoraWZlcSAoeWVzLCAkKERZTkFNSUNfSU1FKSkKK0RFRklORVMgKz0gLUREWU5BTUlDX0lNRQorZWxzZQorTElCICs9IC1saW1tMzIKK2VuZGlmCitlbmRpZgorCitpZmRlZiBJQ09OVgoraWZuZXEgKHllcywgJChJQ09OVikpCitMSUIgKz0gLUwkKElDT05WKQorQ0ZMQUdTICs9IC1JJChJQ09OVikKK2VuZGlmCitERUZJTkVTKz0tRERZTkFNSUNfSUNPTlYKK2VuZGlmCisKK2FsbDogJChUQVJHRVQpIHZpbXJ1bi5leGUgeHhkL3h4ZC5leGUgaW5zdGFsbC5leGUgdW5pbnN0YWwuZXhlIEd2aW1FeHQvZ3ZpbWV4dC5kbGwKKwordmltcnVuLmV4ZTogdmltcnVuLmMKKwkkKENDKSAkKENGTEFHUykgLW8gdmltcnVuLmV4ZSB2aW1ydW4uYyAkKExJQikKKworaW5zdGFsbC5leGU6IGRvc2luc3QuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBpbnN0YWxsLmV4ZSBkb3NpbnN0LmMgJChMSUIpIC1sb2xlMzIgLWx1dWlkCisKK3VuaW5zdGFsLmV4ZTogdW5pbnN0YWwuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyB1bmluc3RhbC5leGUgdW5pbnN0YWwuYyAkKExJQikKKworJChUQVJHRVQpOiAkKE9VVERJUikgJChPQkopCisJJChDQykgJChDRkxBR1MpICQoTEZMQUdTKSAtbyAkQCAkKE9CSikgJChMSUIpIC1sb2xlMzIgLWx1dWlkICQoUFlUSE9OTElCKSAkKFJVQllMSUIpCisKK3VweDogZXhlcworCXVweCBndmltLmV4ZQorCXVweCB2aW0uZXhlCisKK3h4ZC94eGQuZXhlOiB4eGQveHhkLmMKKwkkKE1BS0UpIC1DIHh4ZCAtZiBNYWtlX2N5Zy5tYWsKKworR3ZpbUV4dC9ndmltZXh0LmRsbDogR3ZpbUV4dC9ndmltZXh0LmNwcCBHdmltRXh0L2d2aW1leHQucmMgR3ZpbUV4dC9ndmltZXh0LmgKKwkkKE1BS0UpIC1DIEd2aW1FeHQgLWYgTWFrZV9taW5nLm1haworCitjbGVhbjoKKwktJChERUwpICQoT1VURElSKSQoRElSU0xBU0gpKi5vCisJLSQoREVMKSAkKE9VVERJUikkKERJUlNMQVNIKSoucmVzCisJLXJtZGlyICQoT1VURElSKQorCS0kKERFTCkgKi5leGUKKwktJChERUwpIHBhdGhkZWYuYworaWZkZWYgUEVSTAorCS0kKERFTCkgaWZfcGVybC5jCitlbmRpZgorCSQoTUFLRSkgLUMgR3ZpbUV4dCAtZiBNYWtlX21pbmcubWFrIGNsZWFuCisJJChNQUtFKSAtQyB4eGQgLWYgTWFrZV9jeWcubWFrIGNsZWFuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworSU5DTCA9IHZpbS5oIGZlYXR1cmUuaCBvc193aW4zMi5oIG9zX2Rvcy5oIGFzY2lpLmgga2V5bWFwLmggdGVybS5oIG1hY3Jvcy5oIFwKKwlzdHJ1Y3RzLmggcmVnZXhwLmggb3B0aW9uLmggZXhfY21kcy5oIHByb3RvLmggZ2xvYmFscy5oIGZhcnNpLmggXAorCWd1aS5oCisKKyQoT1VURElSKS8lLm8gOiAlLmMgJChJTkNMKQorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPCAtbyAkQAorCiskKE9VVERJUikvdmltcmVzLnJlczogdmltLnJjIHZlcnNpb24uaCBndWlfdzMyX3JjLmgKKwkkKFdJTkRSRVMpICQoREVGSU5FUykgdmltLnJjICQoT1VURElSKS92aW1yZXMucmVzCisKKyQoT1VURElSKS92aW1yYy5vOiAkKE9VVERJUikvdmltcmVzLnJlcworCSQoV0lORFJFUykgJChPVVRESVIpL3ZpbXJlcy5yZXMgJChPVVRESVIpL3ZpbXJjLm8KKworJChPVVRESVIpOgorCW1rZGlyICQoT1VURElSKQorCiskKE9VVERJUikvZXhfZG9jbWQubzoJZXhfZG9jbWQuYyAkKElOQ0wpIGV4X2NtZHMuaAorCSQoQ0MpIC1jICQoQ0ZMQUdTKSBleF9kb2NtZC5jIC1vICQoT1VURElSKS9leF9kb2NtZC5vCisKKyQoT1VURElSKS9leF9ldmFsLm86CWV4X2V2YWwuYyAkKElOQ0wpIGV4X2NtZHMuaAorCSQoQ0MpIC1jICQoQ0ZMQUdTKSBleF9ldmFsLmMgLW8gJChPVVRESVIpL2V4X2V2YWwubworCiskKE9VVERJUikvaWZfY3Njb3BlLm86CWlmX2NzY29wZS5jICQoSU5DTCkgaWZfY3Njb3BlLmgKKwkkKENDKSAtYyAkKENGTEFHUykgaWZfY3Njb3BlLmMgLW8gJChPVVRESVIpL2lmX2NzY29wZS5vCisKKyQoT1VURElSKS9pZl9vbGUubzogaWZfb2xlLmNwcCAkKElOQ0wpCisJJChDQykgJChDRkxBR1MpIC1EX19JSURfREVGSU5FRF9fIC1jIC1vICQoT1VURElSKS9pZl9vbGUubyBpZl9vbGUuY3BwCisKKyQoT1VURElSKS9pZl9ydWJ5Lm86IGlmX3J1YnkuYyAkKElOQ0wpCitpZmVxICgxNiwgJChSVUJZKSkKKwkkKENDKSAkKENGTEFHUykgLVVfV0lOMzIgLWMgLW8gJChPVVRESVIpL2lmX3J1YnkubyBpZl9ydWJ5LmMKK2VuZGlmCisKK2lmX3BlcmwuYzogaWZfcGVybC54cyB0eXBlbWFwCisJcGVybCAkKFBFUkxMSUIpL0V4dFV0aWxzL3hzdWJwcCAtcHJvdG90eXBlcyAtdHlwZW1hcCBcCisJICAgICAkKFBFUkxMSUIpL0V4dFV0aWxzL3R5cGVtYXAgaWZfcGVybC54cyA+ICRACisKKyQoT1VURElSKS9uZXRiZWFucy5vOgluZXRiZWFucy5jICQoSU5DTCkgJChOQkRFQlVHX0lOQ0wpICQoTkJERUJVR19TUkMpCisJJChDQykgLWMgJChDRkxBR1MpIG5ldGJlYW5zLmMgLW8gJChPVVRESVIpL25ldGJlYW5zLm8KKworcGF0aGRlZi5jOiAkKElOQ0wpCitpZm5lcSAoc2guZXhlLCAkKFNIRUxMKSkKKwlAZWNobyBjcmVhdGluZyBwYXRoZGVmLmMKKwlAZWNobyAnLyogcGF0aGRlZi5jICovJyA+IHBhdGhkZWYuYworCUBlY2hvICcjaW5jbHVkZSAidmltLmgiJyA+PiBwYXRoZGVmLmMKKwlAZWNobyAnY2hhcl91ICpkZWZhdWx0X3ZpbV9kaXIgPSAoY2hhcl91ICopIiQoVklNUkNMT0MpIjsnID4+IHBhdGhkZWYuYworCUBlY2hvICdjaGFyX3UgKmRlZmF1bHRfdmltcnVudGltZV9kaXIgPSAoY2hhcl91ICopIiQoVklNUlVOVElNRURJUikiOycgPj4gcGF0aGRlZi5jCisJQGVjaG8gJ2NoYXJfdSAqYWxsX2NmbGFncyA9IChjaGFyX3UgKikiJChDQykgJChDRkxBR1MpIjsnID4+IHBhdGhkZWYuYworCUBlY2hvICdjaGFyX3UgKmFsbF9sZmxhZ3MgPSAoY2hhcl91ICopIiQoQ0MpIC1zIC1vICQoVEFSR0VUKSAkKExJQikgLWx1dWlkIC1sb2xlMzIgJChQWVRIT05MSUIpICQoUlVCWUxJQikiOycgPj4gcGF0aGRlZi5jCisJQGVjaG8gJ2NoYXJfdSAqY29tcGlsZWRfdXNlciA9IChjaGFyX3UgKikiJChVU0VSTkFNRSkiOycgPj4gcGF0aGRlZi5jCisJQGVjaG8gJ2NoYXJfdSAqY29tcGlsZWRfc3lzID0gKGNoYXJfdSAqKSIkKFVTRVJET01BSU4pIjsnID4+IHBhdGhkZWYuYworZWxzZQorCUBlY2hvIGNyZWF0aW5nIHBhdGhkZWYuYworCUBlY2hvIC8qIHBhdGhkZWYuYyAqLyA+IHBhdGhkZWYuYworCUBlY2hvICNpbmNsdWRlICJ2aW0uaCIgPj4gcGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpkZWZhdWx0X3ZpbV9kaXIgPSAoY2hhcl91ICopIiQoVklNUkNMT0MpIjsgPj4gcGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyID0gKGNoYXJfdSAqKSIkKFZJTVJVTlRJTUVESVIpIjsgPj4gcGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICphbGxfY2ZsYWdzID0gKGNoYXJfdSAqKSIkKENDKSAkKENGTEFHUykiOyA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmFsbF9sZmxhZ3MgPSAoY2hhcl91ICopIiQoQ0MpIC1zIC1vICQoVEFSR0VUKSAkKExJQikgLWx1dWlkIC1sb2xlMzIgJChQWVRIT05MSUIpICQoUlVCWUxJQikiOyA+PiBwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmNvbXBpbGVkX3VzZXIgPSAoY2hhcl91ICopIiQoVVNFUk5BTUUpIjsgPj4gcGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpjb21waWxlZF9zeXMgPSAoY2hhcl91ICopIiQoVVNFUkRPTUFJTikiOyA+PiBwYXRoZGVmLmMKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9taW50Lm1hayBiL3NyYy9NYWtlX21pbnQubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2FhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9taW50Lm1hawpAQCAtMCwwICsxLDU2IEBACisjCisjIE1ha2VmaWxlIGZvciBWaW0gb24gTWlOVAkJCQl2aW06dHM9ODpzdz04OnR3PTc4CisjCisjIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgVW5peCBNYWtlZmlsZS4gSXQgaXMgY29uZmlndXJlZCB0byBhY2NvbXBhbnkKKyMgdGhlIE1pTlQgZGlzdHJpYnV0aW9uIG9mIFZpbS4KKyMKKyMgU2VlICJNYWtlZmlsZSIgZm9yIGluc3RydWN0aW9ucyBob3cgdG8gcnVuICJtYWtlIi4KKyMKKyMgQlVUOiBBbHdheXMgcnVuOiAibWFrZSAtZiBNYWtlX21pbnQubWFrIGNvbmZpZyIsCisjICAgICAgYW5kIHRoZW46ICAibWFrZSAtZiBNYWtlX21pbnQubWFrIiEKKyMgT3RoZXJ3aXNlIHRoZSBwb3N0cHJvY2Vzc2luZyB3b24ndCBnZXQgZG9uZS4KKyMKKworIyMjIFRoaXMgTWFrZWZpbGUgaGFzIGJlZW4gc3VjY2VzZnVsbHkgdGVzdGVkIG9uIHRoZXNlIHN5c3RlbXMuCisjIyMgQ2hlY2sgdGhlICgqKSBjb2x1bW4gZm9yIHJlbWFya3MsIGxpc3RlZCBiZWxvdy4KKyMjIyBMYXRlciBjb2RlIGNoYW5nZXMgbWF5IGNhdXNlIHNtYWxsIHByb2JsZW1zLCBvdGhlcndpc2UgVmltIGlzIHN1cHBvc2VkIHRvCisjIyMgY29tcGlsZSBhbmQgcnVuIHdpdGhvdXQgcHJvYmxlbXMuCisKKyNzeXN0ZW06CSAgICAgIGNvbmZpZ3VyYXRpb25zOgkJCXZlcnNpb24gKCopIHRlc3RlZCBieToKKyMtLS0tLS0tLS0tLS0tCSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkgICAgIC0tLS0tLS0gIC0gIC0tLS0tLS0tLS0KKyNNaU5UIDEuMTIuNQkgICAgICBnY2MgZ2NjLTIuNi4xCQkJMy4yOQkgSmVucyBGZWxkZXJob2ZmCisjTWlOVCAxLjEyLjYJICAgICAgZ2NjIGdjYy0yLjYuMQkgIC1HVUkJCTQuNmIJIEplbnMgRmVsZGVyaG9mZgorI01pTlQgMS4xMi42CSAgICAgIGdjYyBnY2MtMi42LjEJICAtR1VJCQk0LjYJIEplbnMgRmVsZGVyaG9mZgorCisjIHNldCB0aGlzIHRvIHRoZSBwYXRobmFtZSBwcmVmaXggb2YgeW91ciBzeW1ib2wgbGluayBlZGl0b3IsIGkuZS4gaWYgaXQgaXMKKyMgL3Vzci9sb2NhbC9iaW4vc3ltLWxkIHNldDoKKyMKK1NZTUxEUFJFRklYID0gL3Vzci9sb2NhbC9iaW4vc3ltLQorI1NZTUxEUFJFRklYID0gL2dudS9iaW4vc3ltLQorCitQT1NUUFJPQ0VTUyA9IGZpeHN0ayAyMGsgJChWSU1UQVJHRVQpCitEQkdQT1NUUFJPQ0VTUyA9IGZpeHN0ayAyMGsgJChEQkdUQVJHRVQpCitEQkdMREZMQUdTID0gLUIkKFNZTUxEUFJFRklYKQorREJHVEFSR0VUID0gJChWSU1UQVJHRVQpLnN5bQorCisKKyMgRGVmYXVsdCB0YXJnZXQgaXMgbWFraW5nIHRoZSBleGVjdXRhYmxlIGFuZCB0aGVuIGRvIHRoZSBwb3N0IHByb2Nlc3NpbmcKK2FsbDogJChWSU1UQVJHRVQpICQoVE9PTFMpCisJJChQT1NUUFJPQ0VTUykKKworZGVidWc6ICQoREJHVEFSR0VUKQorCSQoREJHUE9TVFBST0NFU1MpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIGluY2x1ZGUgdGhlIFVuaXggTWFrZWZpbGUgIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgTWFrZWZpbGUKKworCisjIyMgKE0pICBNaU5UIHdpdGggZ2NjIDIuNi4xIGFuZCBnZGIgMy41CitDQyA9IGdjYyAtbWludAorQ0ZMQUdTID0gLWcgLU8gLUlwcm90bworCiskKERCR1RBUkdFVCk6ICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJChDQykgLWMgJChBTExfQ0ZMQUdTKSB2ZXJzaW9uLmMKKwkkKENDKSAkKExERkxBR1MpICQoREJHTERGTEFHUykgLW8gJChEQkdUQVJHRVQpIC1nICQoT0JKKSBcCisJCXZlcnNpb24ubyAkKEFMTF9MSUJTKQpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfbW9ycGgubWFrIGIvc3JjL01ha2VfbW9ycGgubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2ViNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9tb3JwaC5tYWsKQEAgLTAsMCArMSw4OCBAQAorIworIyBNYWtlZmlsZSBmb3IgVklNLCB1c2luZyBNb3JwaE9TIFNESyAoZ2NjIDIuOTUuMykKKyMKKworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0d28gbGluZXMgYW5kIGNvbW1lbnQgdGhlIHR3byBhZnRlciBpbgorIyBjYXNlIHlvdSB3YW50IHRvIHBsYXkgd2l0aCBHVklNIE1vcnBoT1MuIEJ1dCBpdCdzIHN0aWxsIGtub3duCisjIHRvIG5vdCB3b3JrIGF0IGFsbC4gU28gbWVhbndoaWxlIGl0J3MgYmV0dGVyIHRvIHN0aWNrIHdpdGggVklNLgorCisjIEdWSU0gPQktREZFQVRfR1VJX0FNSUdBCisjIEdWSU1TUkMgPQlndWlfYW1pZ2EuYyBndWkuYworCitHVklNID0KK0dWSU1TUkMgPQorCitDRkxBR1MgPQktYwkJCQkJCVwKKwkJLXBpcGUJCQkJCQlcCisJCS1PMgkJCQkJCVwKKwkJLVdhbGwJCQkJCQlcCisJCQkJCQkJCVwKKwkJLUROT19BUlAJCQkJCVwKKwkJLURVU0VfVE1QTkFNCQkJCQlcCisJCSR7R1ZJTX0JCQkJCQlcCisJCQkJCQkJCVwKKwkJLUkgcHJvdG8JCQkJCVwKKwkJCQkJCQkJXAorCQktbm9peGVtdWwKKworUFJHID0JCVZpbQorTElCUyA9CQktbm9peGVtdWwgLXMKK0NDID0JCWdjYworTEQgPQkJZ2NjCitPQkpEVU1QID0Jb2JqZHVtcAorUk0gPQkJcm0KKworLmMubzoKKwkke0NDfSAke0NGTEFHU30gJDwgLW8gJEAKKworU1JDID0JYnVmZmVyLmMJCQkJCQlcCisJY2hhcnNldC5jCQkJCQkJXAorCWRpZmYuYwkJCQkJCQlcCisJZGlncmFwaC5jCQkJCQkJXAorCWVkaXQuYwkJCQkJCQlcCisJZXZhbC5jCQkJCQkJCVwKKwlleF9jbWRzLmMJCQkJCQlcCisJZXhfY21kczIuYwkJCQkJCVwKKwlleF9kb2NtZC5jCQkJCQkJXAorCWV4X2V2YWwuYwkJCQkJCVwKKwlleF9nZXRsbi5jCQkJCQkJXAorCWZpbGVpby5jCQkJCQkJXAorCWZvbGQuYwkJCQkJCQlcCisJZ2V0Y2hhci5jCQkJCQkJXAorCW1haW4uYwkJCQkJCQlcCisJbWFyay5jCQkJCQkJCVwKKwltYnl0ZS5jCQkJCQkJCVwKKwltZW1maWxlLmMJCQkJCQlcCisJbWVtbGluZS5jCQkJCQkJXAorCW1lbnUuYwkJCQkJCQlcCisJbWVzc2FnZS5jCQkJCQkJXAorCW1pc2MxLmMJCQkJCQkJXAorCW1pc2MyLmMJCQkJCQkJXAorCW1vdmUuYwkJCQkJCQlcCisJbm9ybWFsLmMJCQkJCQlcCisJb3BzLmMJCQkJCQkJXAorCW9wdGlvbi5jCQkJCQkJXAorCW9zX2FtaWdhLmMJCQkJCQlcCisJcXVpY2tmaXguYwkJCQkJCVwKKwlyZWdleHAuYwkJCQkJCVwKKwlzY3JlZW4uYwkJCQkJCVwKKwlzZWFyY2guYwkJCQkJCVwKKwlzeW50YXguYwkJCQkJCVwKKwl0YWcuYwkJCQkJCQlcCisJdGVybS5jCQkJCQkJCVwKKwl1aS5jCQkJCQkJCVwKKwl1bmRvLmMJCQkJCQkJXAorCXZlcnNpb24uYwkJCQkJCVwKKwl3aW5kb3cuYwkJCQkJCVwKKwkke0dWSU1TUkN9CisKK09CSiA9CSQoU1JDOi5jPS5vKQorCiskKFBSRyk6ICQoT0JKKQorCSR7TER9IC1vICQoUFJHKSAkKE9CSikgJChMSUJTKQorCitkdW1wOiAkKFBSRykKKwkkKE9CSkRVTVApIC0tcmVsb2MgLS1kaXNhc3NlbWJsZS1hbGwgJChQUkcpID4gJChQUkcpLnMKKworY2xlYW46CisJJChSTSkgLWZ2ICQoT0JKKSAkKFBSRykgJChQUkcpLnMKZGlmZiAtLWdpdCBhL3NyYy9NYWtlX21wdy5tYWsgYi9zcmMvTWFrZV9tcHcubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOThkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZV9tcHcubWFrCkBAIC0wLDAgKzEsMzg0MyBAQAorIyAgIEZpbGU6ICAgICAgIFZJbS5tYWtlCisjICAgVGFyZ2V0OiAgICAgVkltCisjICAgQ3JlYXRlZDogICAgU3VuZGF5LCBEZWNlbWJlciAyOSwgMjAwMCAwOTo1NToxNCBQTQorCisKK01BS0VGSUxFCT0gVkltLm1ha2UKK6VNb25kb0J1aWxkpQk9IHtNQUtFRklMRX0gICMgTWFrZSBibGFuayB0byBhdm9pZCByZWJ1aWxkcyB3aGVuIG1ha2VmaWxlIGlzIG1vZGlmaWVkCisKK09iakRpcgkJPSA6b2JqOgorSW5jbHVkZXMJPSAgtgorCQkJCSAgLWkgOnNyYzpwcm90bzoKK0NGbGFncwkJPSAtdyAyLDM1IC1lbnVtIGludAorU3ltLVBQQwkJPSAtc3ltIG9mZgorCitQUENDT3B0aW9ucwk9IHtJbmNsdWRlc30ge0NGbGFnc30ge1N5bS1QUEN9CisKKworIyMjIFNvdXJjZSBGaWxlcyAjIyMKKworU3JjRmlsZXMJPSAgtgorCQkJCSAgOnNyYzpidWZmZXIuYyC2CisJCQkJICA6c3JjOmNoYXJzZXQuYyC2CisJCQkJICA6c3JjOmRpZmYuYyC2CisJCQkJICA6c3JjOmRpZ3JhcGguYyC2CisJCQkJICA6c3JjOmVkaXQuYyC2CisJCQkJICA6c3JjOmV2YWwuYyC2CisJCQkJICA6c3JjOmV4X2NtZHMuYyC2CisJCQkJICA6c3JjOmV4X2NtZHMyLmMgtgorCQkJCSAgOnNyYzpleF9kb2NtZC5jILYKKwkJCQkgIDpzcmM6ZXhfZXZhbC5jILYKKwkJCQkgIDpzcmM6ZXhfZ2V0bG4uYyC2CisJCQkJICA6c3JjOmZpbGVpby5jILYKKwkJCQkgIDpzcmM6Zm9sZC5jILYKKwkJCQkgIDpzcmM6Z2V0Y2hhci5jILYKKwkJCQkgIDpzcmM6Z3VpLmMgtgorCQkJCSAgOnNyYzpndWlfbWFjLmMgtgorCQkJCSAgOnNyYzppZl9jc2NvcGUuYyC2CisJCQkJICA6c3JjOm1haW4uYyC2CisJCQkJICA6c3JjOm1hcmsuYyC2CisJCQkJICA6c3JjOm1lbWZpbGUuYyC2CisJCQkJICA6c3JjOm1lbWxpbmUuYyC2CisJCQkJICA6c3JjOm1lbnUuYyC2CisJCQkJICA6c3JjOm1lc3NhZ2UuYyC2CisJCQkJICA6c3JjOm1pc2MxLmMgtgorCQkJCSAgOnNyYzptaXNjMi5jILYKKwkJCQkgIDpzcmM6bW92ZS5jILYKKwkJCQkgIDpzcmM6bXVsdGlieXRlLmMgtgorCQkJCSAgOnNyYzpub3JtYWwuYyC2CisJCQkJICA6c3JjOm9wcy5jILYKKwkJCQkgIDpzcmM6b3B0aW9uLmMgtgorCQkJCSAgOnNyYzpvc19tYWMuYyC2CisJCQkJICA6c3JjOnB0eS5jILYKKwkJCQkgIDpzcmM6cXVpY2tmaXguYyC2CisJCQkJICA6c3JjOnJlZ2V4cC5jILYKKwkJCQkgIDpzcmM6c2NyZWVuLmMgtgorCQkJCSAgOnNyYzpzZWFyY2guYyC2CisJCQkJICA6c3JjOnN5bnRheC5jILYKKwkJCQkgIDpzcmM6dGFnLmMgtgorCQkJCSAgOnNyYzp0ZXJtLmMgtgorCQkJCSAgOnNyYzp0ZXJtbGliLmMgtgorCQkJCSAgOnNyYzp1aS5jILYKKwkJCQkgIDpzcmM6dW5kby5jILYKKwkJCQkgIDpzcmM6dmVyc2lvbi5jILYKKwkJCQkgIDpzcmM6d2luZG93LmMgtgorCQkJCSAgOnNyYzp3c2RlYnVnLmMKKworCisjIyMgT2JqZWN0IEZpbGVzICMjIworCitPYmpGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAgIntPYmpEaXJ9YnVmZmVyLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9Y2hhcnNldC5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWRpZmYuYy54IiC2CisJCQkJICAie09iakRpcn1kaWdyYXBoLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9ZWRpdC5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWV2YWwuYy54IiC2CisJCQkJICAie09iakRpcn1leF9jbWRzLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9ZXhfY21kczIuYy54IiC2CisJCQkJICAie09iakRpcn1leF9kb2NtZC5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWV4X2V2YWwuYy54IiC2CisJCQkJICAie09iakRpcn1leF9nZXRsbi5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWZpbGVpby5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWZvbGQuYy54IiC2CisJCQkJICAie09iakRpcn1nZXRjaGFyLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9Z3VpLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9Z3VpX21hYy5jLngiILYKKwkJCQkgICJ7T2JqRGlyfWlmX2NzY29wZS5jLngiILYKKwkJCQkgICJ7T2JqRGlyfW1haW4uYy54IiC2CisJCQkJICAie09iakRpcn1tYXJrLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9bWVtZmlsZS5jLngiILYKKwkJCQkgICJ7T2JqRGlyfW1lbWxpbmUuYy54IiC2CisJCQkJICAie09iakRpcn1tZW51LmMueCIgtgorCQkJCSAgIntPYmpEaXJ9bWVzc2FnZS5jLngiILYKKwkJCQkgICJ7T2JqRGlyfW1pc2MxLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9bWlzYzIuYy54IiC2CisJCQkJICAie09iakRpcn1tb3ZlLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9bXVsdGlieXRlLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9bm9ybWFsLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9b3BzLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9b3B0aW9uLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9b3NfbWFjLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9cHR5LmMueCIgtgorCQkJCSAgIntPYmpEaXJ9cXVpY2tmaXguYy54IiC2CisJCQkJICAie09iakRpcn1yZWdleHAuYy54IiC2CisJCQkJICAie09iakRpcn1zY3JlZW4uYy54IiC2CisJCQkJICAie09iakRpcn1zZWFyY2guYy54IiC2CisJCQkJICAie09iakRpcn1zeW50YXguYy54IiC2CisJCQkJICAie09iakRpcn10YWcuYy54IiC2CisJCQkJICAie09iakRpcn10ZXJtLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9dGVybWxpYi5jLngiILYKKwkJCQkgICJ7T2JqRGlyfXVpLmMueCIgtgorCQkJCSAgIntPYmpEaXJ9dW5kby5jLngiILYKKwkJCQkgICJ7T2JqRGlyfXZlcnNpb24uYy54IiC2CisJCQkJICAie09iakRpcn13aW5kb3cuYy54IiC2CisJCQkJICAie09iakRpcn13c2RlYnVnLmMueCIKKworCisjIyMgTGlicmFyaWVzICMjIworCitMaWJGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAgIntTaGFyZWRMaWJyYXJpZXN9SW50ZXJmYWNlTGliIiC2CisJCQkJICAie1NoYXJlZExpYnJhcmllc31NYXRoTGliIiC2CisJCQkJICAie1NoYXJlZExpYnJhcmllc31TdGRDTGliIiC2CisJCQkJICAie1BQQ0xpYnJhcmllc31TdGRDUnVudGltZS5vIiC2CisJCQkJICAie1BQQ0xpYnJhcmllc31QUENTdGRDTGliLm8iILYKKwkJCQkgICJ7UFBDTGlicmFyaWVzfVBQQ0NSdW50aW1lLm8iILYKKwkJCQkgICJ7UFBDTGlicmFyaWVzfVBQQ1Rvb2xMaWJzLm8iCisKKworIyMjIERlZmF1bHQgUnVsZXMgIyMjCisKKy5jLnggIMQgIC5jICB7pU1vbmRvQnVpbGSlfQorCXtQUENDfSB7ZGVwRGlyfXtkZWZhdWx0fS5jIC1vIHt0YXJnRGlyfXtkZWZhdWx0fS5jLngge1BQQ0NPcHRpb25zfQorCisKKyMjIyBCdWlsZCBSdWxlcyAjIyMKKworVkltICDExCAge09iakZpbGVzLVBQQ30ge0xpYkZpbGVzLVBQQ30ge6VNb25kb0J1aWxkpX0KKwlQUENMaW5rILYKKwkJLW8ge1Rhcmd9ILYKKwkJe09iakZpbGVzLVBQQ30gtgorCQl7TGliRmlsZXMtUFBDfSC2CisJCXtTeW0tUFBDfSC2CisJCS1tZiAtZCC2CisJCS10ICdBUFBMJyC2CisJCS1jICdWSU0hJworCisKKworIyMjIFJlcXVpcmVkIERlcGVuZGVuY2llcyAjIyMKKworIntPYmpEaXJ9YnVmZmVyLmMueCIgIMQgIDpzcmM6YnVmZmVyLmMKKyJ7T2JqRGlyfWNoYXJzZXQuYy54IiAgxCAgOnNyYzpjaGFyc2V0LmMKKyJ7T2JqRGlyfWRpZmYuYy54IiAgxCAgOnNyYzpkaWZmLmMKKyJ7T2JqRGlyfWRpZ3JhcGguYy54IiAgxCAgOnNyYzpkaWdyYXBoLmMKKyJ7T2JqRGlyfWVkaXQuYy54IiAgxCAgOnNyYzplZGl0LmMKKyJ7T2JqRGlyfWV2YWwuYy54IiAgxCAgOnNyYzpldmFsLmMKKyJ7T2JqRGlyfWV4X2NtZHMuYy54IiAgxCAgOnNyYzpleF9jbWRzLmMKKyJ7T2JqRGlyfWV4X2NtZHMyLmMueCIgIMQgIDpzcmM6ZXhfY21kczIuYworIntPYmpEaXJ9ZXhfZG9jbWQuYy54IiAgxCAgOnNyYzpleF9kb2NtZC5jCisie09iakRpcn1leF9ldmFsLmMueCIgIMQgIDpzcmM6ZXhfZXZhbC5jCisie09iakRpcn1leF9nZXRsbi5jLngiICDEICA6c3JjOmV4X2dldGxuLmMKKyJ7T2JqRGlyfWZpbGVpby5jLngiICDEICA6c3JjOmZpbGVpby5jCisie09iakRpcn1mb2xkLmMueCIgIMQgIDpzcmM6Zm9sZC5jCisie09iakRpcn1nZXRjaGFyLmMueCIgIMQgIDpzcmM6Z2V0Y2hhci5jCisie09iakRpcn1ndWkuYy54IiAgxCAgOnNyYzpndWkuYworIntPYmpEaXJ9Z3VpX21hYy5jLngiICDEICA6c3JjOmd1aV9tYWMuYworIntPYmpEaXJ9aWZfY3Njb3BlLmMueCIgIMQgIDpzcmM6aWZfY3Njb3BlLmMKKyJ7T2JqRGlyfW1haW4uYy54IiAgxCAgOnNyYzptYWluLmMKKyJ7T2JqRGlyfW1hcmsuYy54IiAgxCAgOnNyYzptYXJrLmMKKyJ7T2JqRGlyfW1lbWZpbGUuYy54IiAgxCAgOnNyYzptZW1maWxlLmMKKyJ7T2JqRGlyfW1lbWxpbmUuYy54IiAgxCAgOnNyYzptZW1saW5lLmMKKyJ7T2JqRGlyfW1lbnUuYy54IiAgxCAgOnNyYzptZW51LmMKKyJ7T2JqRGlyfW1lc3NhZ2UuYy54IiAgxCAgOnNyYzptZXNzYWdlLmMKKyJ7T2JqRGlyfW1pc2MxLmMueCIgIMQgIDpzcmM6bWlzYzEuYworIntPYmpEaXJ9bWlzYzIuYy54IiAgxCAgOnNyYzptaXNjMi5jCisie09iakRpcn1tb3ZlLmMueCIgIMQgIDpzcmM6bW92ZS5jCisie09iakRpcn1tdWx0aWJ5dGUuYy54IiAgxCAgOnNyYzptdWx0aWJ5dGUuYworIntPYmpEaXJ9bm9ybWFsLmMueCIgIMQgIDpzcmM6bm9ybWFsLmMKKyJ7T2JqRGlyfW9wcy5jLngiICDEICA6c3JjOm9wcy5jCisie09iakRpcn1vcHRpb24uYy54IiAgxCAgOnNyYzpvcHRpb24uYworIntPYmpEaXJ9b3NfbWFjLmMueCIgIMQgIDpzcmM6b3NfbWFjLmMKKyJ7T2JqRGlyfXB0eS5jLngiICDEICA6c3JjOnB0eS5jCisie09iakRpcn1xdWlja2ZpeC5jLngiICDEICA6c3JjOnF1aWNrZml4LmMKKyJ7T2JqRGlyfXJlZ2V4cC5jLngiICDEICA6c3JjOnJlZ2V4cC5jCisie09iakRpcn1zY3JlZW4uYy54IiAgxCAgOnNyYzpzY3JlZW4uYworIntPYmpEaXJ9c2VhcmNoLmMueCIgIMQgIDpzcmM6c2VhcmNoLmMKKyJ7T2JqRGlyfXN5bnRheC5jLngiICDEICA6c3JjOnN5bnRheC5jCisie09iakRpcn10YWcuYy54IiAgxCAgOnNyYzp0YWcuYworIntPYmpEaXJ9dGVybS5jLngiICDEICA6c3JjOnRlcm0uYworIntPYmpEaXJ9dGVybWxpYi5jLngiICDEICA6c3JjOnRlcm1saWIuYworIntPYmpEaXJ9dWkuYy54IiAgxCAgOnNyYzp1aS5jCisie09iakRpcn11bmRvLmMueCIgIMQgIDpzcmM6dW5kby5jCisie09iakRpcn12ZXJzaW9uLmMueCIgIMQgIDpzcmM6dmVyc2lvbi5jCisie09iakRpcn13aW5kb3cuYy54IiAgxCAgOnNyYzp3aW5kb3cuYworIntPYmpEaXJ9d3NkZWJ1Zy5jLngiICDEICA6c3JjOndzZGVidWcuYworCisKKyMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMgIyMjCisjIyMgQnVpbGQgdGhpcyB0YXJnZXQgdG8gZ2VuZXJhdGUgImluY2x1ZGUgZmlsZSIgZGVwZW5kZW5jaWVzLiAjIyMKKworRGVwZW5kZW5jaWVzICDEICAkT3V0T2ZEYXRlCisJTWFrZURlcGVuZCC2CisJCS1hcHBlbmQge01BS0VGSUxFfSC2CisJCS1pZ25vcmUgIntDSW5jbHVkZXN9IiC2CisJCS1vYmpkaXIgIntPYmpEaXJ9IiC2CisJCS1vYmpleHQgLnggtgorCQl7SW5jbHVkZXN9ILYKKwkJe1NyY0ZpbGVzfQorCisKKyMqKiogRGVwZW5kZW5jaWVzOiBDdXQgaGVyZSAqKioKKyMgVGhlc2UgZGVwZW5kZW5jaWVzIHdlcmUgcHJvZHVjZWQgYXQgMTI6MTc6MDIgVWhyIG9uIEZyZSwgMjkuIERleiAyMDAwIGJ5IE1ha2VEZXBlbmQKKworOm9iajpidWZmZXIuYy54CcQgILYKKwk6c3JjOmJ1ZmZlci5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpjaGFyc2V0LmMueAnEICC2CisJOnNyYzpjaGFyc2V0LmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmRpZmYuYy54CcQgILYKKwk6c3JjOmRpZmYuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6ZGlncmFwaC5jLngJxCAgtgorCTpzcmM6ZGlncmFwaC5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajplZGl0LmMueAnEICC2CisJOnNyYzplZGl0LmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmV2YWwuYy54CcQgILYKKwk6c3JjOmV2YWwuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzp2ZXJzaW9uLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmV4X2NtZHMuYy54CcQgILYKKwk6c3JjOmV4X2NtZHMuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6ZXhfY21kczIuYy54CcQgILYKKwk6c3JjOmV4X2NtZHMyLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmV4X2RvY21kLmMueAnEICC2CisJOnNyYzpleF9kb2NtZC5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpleF9ldmFsLmMueAnEICC2CisJOnNyYzpleF9ldmFsLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmV4X2dldGxuLmMueAnEICC2CisJOnNyYzpleF9nZXRsbi5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpmaWxlaW8uYy54CcQgILYKKwk6c3JjOmZpbGVpby5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpmb2xkLmMueAnEICC2CisJOnNyYzpmb2xkLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOmdldGNoYXIuYy54CcQgILYKKwk6c3JjOmdldGNoYXIuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6Z3VpLmMueAnEICC2CisJOnNyYzpndWkuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6Z3VpX21hYy5jLngJxCAgtgorCTpzcmM6Z3VpX21hYy5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOnNyYzpndWlfbWFjLnIJxCAgtgorCTpzcmM6Z3VpX21hYy5yILYKKwkie1JJbmNsdWRlc30iU3lzVHlwZXMuciC2CisJIntSSW5jbHVkZXN9IlR5cGVzLnIgtgorCTpzcmM6dmVyc2lvbi5oILYKKwkie1JJbmNsdWRlc30iRm9udHMuciC2CisJIntSSW5jbHVkZXN9IkludGxSZXNvdXJjZXMuciC2CisJIntSSW5jbHVkZXN9IlNvdW5kLnIgtgorCSJ7UkluY2x1ZGVzfSJDb25kaXRpb25hbE1hY3Jvcy5yILYKKwkie1JJbmNsdWRlc30iTWFjVHlwZXMuciC2CisJIntSSW5jbHVkZXN9IkNvbnRyb2xzLnIgtgorCSJ7UkluY2x1ZGVzfSJDb250cm9sRGVmaW5pdGlvbnMuciC2CisJIntSSW5jbHVkZXN9Ik1hY1dpbmRvd3MuciC2CisJIntSSW5jbHVkZXN9IkRpYWxvZ3MuciC2CisJIntSSW5jbHVkZXN9Ik1lbnVzLnIgtgorCSJ7UkluY2x1ZGVzfSJJY29ucy5yILYKKwkie1JJbmNsdWRlc30iRmluZGVyLnIgtgorCSJ7UkluY2x1ZGVzfSJRdWlja2RyYXcuciC2CisJIntSSW5jbHVkZXN9IlByb2Nlc3Nlcy5yILYKKwkie1JJbmNsdWRlc30iQXBwbGVFdmVudHMuciC2CisJIntSSW5jbHVkZXN9IlNjcmlwdC5yILYKKwkie1JJbmNsdWRlc30iQ29sbGVjdGlvbnMuciC2CisJIntSSW5jbHVkZXN9IlBpY3RVdGlscy5yILYKKwkie1JJbmNsdWRlc30iQUVEYXRhTW9kZWwucgorCis6b2JqOmlmX2NzY29wZS5jLngJxCAgtgorCTpzcmM6aWZfY3Njb3BlLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6aWZfY3Njb3BlLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOm1haW4uYy54CcQgILYKKwk6c3JjOm1haW4uYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzpmYXJzaS5jILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajptYXJrLmMueAnEICC2CisJOnNyYzptYXJrLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOm1lbWZpbGUuYy54CcQgILYKKwk6c3JjOm1lbWZpbGUuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6bWVtbGluZS5jLngJxCAgtgorCTpzcmM6bWVtbGluZS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajptZW51LmMueAnEICC2CisJOnNyYzptZW51LmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOm1lc3NhZ2UuYy54CcQgILYKKwk6c3JjOm1lc3NhZ2UuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6bWlzYzEuYy54CcQgILYKKwk6c3JjOm1pc2MxLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6dmVyc2lvbi5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajptaXNjMi5jLngJxCAgtgorCTpzcmM6bWlzYzIuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6bW92ZS5jLngJxCAgtgorCTpzcmM6bW92ZS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajptdWx0aWJ5dGUuYy54CcQgILYKKwk6c3JjOm11bHRpYnl0ZS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpub3JtYWwuYy54CcQgILYKKwk6c3JjOm5vcm1hbC5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpvcHMuYy54CcQgILYKKwk6c3JjOm9wcy5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpvcHRpb24uYy54CcQgILYKKwk6c3JjOm9wdGlvbi5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpvc19tYWMuYy54CcQgILYKKwk6c3JjOm9zX21hYy5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpwdHkuYy54CcQgILYKKwk6c3JjOnB0eS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajpxdWlja2ZpeC5jLngJxCAgtgorCTpzcmM6cXVpY2tmaXguYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6cmVnZXhwLmMueAnEICC2CisJOnNyYzpyZWdleHAuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6c2NyZWVuLmMueAnEICC2CisJOnNyYzpzY3JlZW4uYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6c2VhcmNoLmMueAnEICC2CisJOnNyYzpzZWFyY2guYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6c3ludGF4LmMueAnEICC2CisJOnNyYzpzeW50YXguYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6dGFnLmMueAnEICC2CisJOnNyYzp0YWcuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCisKKzpvYmo6dGVybS5jLngJxCAgtgorCTpzcmM6dGVybS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajp0ZXJtbGliLmMueAnEICC2CisJOnNyYzp0ZXJtbGliLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOnVpLmMueAnEICC2CisJOnNyYzp1aS5jILYKKwk6c3JjOnZpbS5oILYKKwk6c3JjOmF1dG86Y29uZmlnLmggtgorCTpzcmM6ZmVhdHVyZS5oILYKKwk6c3JjOm9zX3VuaXguaCC2CisJOnNyYzpvc19tYWMuaCC2CisJOnNyYzp3b3Jrc2hvcC5oILYKKwk6c3JjOmFzY2lpLmggtgorCTpzcmM6a2V5bWFwLmggtgorCTpzcmM6dGVybS5oILYKKwk6c3JjOm1hY3Jvcy5oILYKKwk6c3JjOnN0cnVjdHMuaCC2CisJOnNyYzpnbG9iYWxzLmggtgorCTpzcmM6b3B0aW9uLmggtgorCTpzcmM6ZXhfY21kcy5oILYKKwk6c3JjOnByb3RvLmggtgorCTpzcmM6aW50ZWdyYXRpb24uaCC2CisJOnNyYzp3c2RlYnVnLmggtgorCTpzcmM6cmVnZXhwLmggtgorCTpzcmM6Z3VpLmggtgorCTpzcmM6ZmFyc2kuaCC2CisJOnNyYzpwcm90bzpvc191bml4LnBybyC2CisJOnNyYzpwcm90bzpvc19tYWMucHJvILYKKwk6c3JjOnByb3RvOmJ1ZmZlci5wcm8gtgorCTpzcmM6cHJvdG86Y2hhcnNldC5wcm8gtgorCTpzcmM6cHJvdG86aWZfY3Njb3BlLnBybyC2CisJOnNyYzpwcm90bzpkaWZmLnBybyC2CisJOnNyYzpwcm90bzpkaWdyYXBoLnBybyC2CisJOnNyYzpwcm90bzplZGl0LnBybyC2CisJOnNyYzpwcm90bzpldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzLnBybyC2CisJOnNyYzpwcm90bzpleF9jbWRzMi5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZG9jbWQucHJvILYKKwk6c3JjOnByb3RvOmV4X2V2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2dldGxuLnBybyC2CisJOnNyYzpwcm90bzpmaWxlaW8ucHJvILYKKwk6c3JjOnByb3RvOmZvbGQucHJvILYKKwk6c3JjOnByb3RvOmdldGNoYXIucHJvILYKKwk6c3JjOnByb3RvOmhhbmd1bGluLnBybyC2CisJOnNyYzpwcm90bzptYWluLnBybyC2CisJOnNyYzpwcm90bzptYXJrLnBybyC2CisJOnNyYzpwcm90bzptZW1maWxlLnBybyC2CisJOnNyYzpwcm90bzptZW1saW5lLnBybyC2CisJOnNyYzpwcm90bzptZW51LnBybyC2CisJOnNyYzpwcm90bzptZXNzYWdlLnBybyC2CisJOnNyYzpwcm90bzptaXNjMS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzIucHJvILYKKwk6c3JjOnByb3RvOm1vdmUucHJvILYKKwk6c3JjOnByb3RvOm11bHRpYnl0ZS5wcm8gtgorCTpzcmM6cHJvdG86bm9ybWFsLnBybyC2CisJOnNyYzpwcm90bzpvcHMucHJvILYKKwk6c3JjOnByb3RvOm9wdGlvbi5wcm8gtgorCTpzcmM6cHJvdG86cXVpY2tmaXgucHJvILYKKwk6c3JjOnByb3RvOnJlZ2V4cC5wcm8gtgorCTpzcmM6cHJvdG86c2NyZWVuLnBybyC2CisJOnNyYzpwcm90bzpzZWFyY2gucHJvILYKKwk6c3JjOnByb3RvOnN5bnRheC5wcm8gtgorCTpzcmM6cHJvdG86dGFnLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtLnBybyC2CisJOnNyYzpwcm90bzp0ZXJtbGliLnBybyC2CisJOnNyYzpwcm90bzp1aS5wcm8gtgorCTpzcmM6cHJvdG86dW5kby5wcm8gtgorCTpzcmM6cHJvdG86dmVyc2lvbi5wcm8gtgorCTpzcmM6cHJvdG86d2luZG93LnBybyC2CisJOnNyYzpwcm90bzppZl9weXRob24ucHJvILYKKwk6c3JjOnByb3RvOmlmX3RjbC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcnVieS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpLnBybyC2CisJOnNyYzpwcm90bzpwdHkucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGsucHJvILYKKwk6c3JjOnByb3RvOmd1aV9ndGtfeDExLnBybyC2CisJOnNyYzpwcm90bzpndWlfbW90aWYucHJvILYKKwk6c3JjOnByb3RvOmd1aV9hdGhlbmEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tYWMucHJvILYKKwk6c3JjOnByb3RvOmd1aV94MTEucHJvILYKKwk6c3JjOnByb3RvOndvcmtzaG9wLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsLnBybyC2CisJOnNyYzpwcm90bzppZl9wZXJsc2Zpby5wcm8KKworOm9iajp1bmRvLmMueAnEICC2CisJOnNyYzp1bmRvLmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOnZlcnNpb24uYy54CcQgILYKKwk6c3JjOnZlcnNpb24uYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzp2ZXJzaW9uLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOndpbmRvdy5jLngJxCAgtgorCTpzcmM6d2luZG93LmMgtgorCTpzcmM6dmltLmggtgorCTpzcmM6YXV0bzpjb25maWcuaCC2CisJOnNyYzpmZWF0dXJlLmggtgorCTpzcmM6b3NfdW5peC5oILYKKwk6c3JjOm9zX21hYy5oILYKKwk6c3JjOndvcmtzaG9wLmggtgorCTpzcmM6YXNjaWkuaCC2CisJOnNyYzprZXltYXAuaCC2CisJOnNyYzp0ZXJtLmggtgorCTpzcmM6bWFjcm9zLmggtgorCTpzcmM6c3RydWN0cy5oILYKKwk6c3JjOmdsb2JhbHMuaCC2CisJOnNyYzpvcHRpb24uaCC2CisJOnNyYzpleF9jbWRzLmggtgorCTpzcmM6cHJvdG8uaCC2CisJOnNyYzppbnRlZ3JhdGlvbi5oILYKKwk6c3JjOndzZGVidWcuaCC2CisJOnNyYzpyZWdleHAuaCC2CisJOnNyYzpndWkuaCC2CisJOnNyYzpmYXJzaS5oILYKKwk6c3JjOnByb3RvOm9zX3VuaXgucHJvILYKKwk6c3JjOnByb3RvOm9zX21hYy5wcm8gtgorCTpzcmM6cHJvdG86YnVmZmVyLnBybyC2CisJOnNyYzpwcm90bzpjaGFyc2V0LnBybyC2CisJOnNyYzpwcm90bzppZl9jc2NvcGUucHJvILYKKwk6c3JjOnByb3RvOmRpZmYucHJvILYKKwk6c3JjOnByb3RvOmRpZ3JhcGgucHJvILYKKwk6c3JjOnByb3RvOmVkaXQucHJvILYKKwk6c3JjOnByb3RvOmV2YWwucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMucHJvILYKKwk6c3JjOnByb3RvOmV4X2NtZHMyLnBybyC2CisJOnNyYzpwcm90bzpleF9kb2NtZC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfZ2V0bG4ucHJvILYKKwk6c3JjOnByb3RvOmZpbGVpby5wcm8gtgorCTpzcmM6cHJvdG86Zm9sZC5wcm8gtgorCTpzcmM6cHJvdG86Z2V0Y2hhci5wcm8gtgorCTpzcmM6cHJvdG86aGFuZ3VsaW4ucHJvILYKKwk6c3JjOnByb3RvOm1haW4ucHJvILYKKwk6c3JjOnByb3RvOm1hcmsucHJvILYKKwk6c3JjOnByb3RvOm1lbWZpbGUucHJvILYKKwk6c3JjOnByb3RvOm1lbWxpbmUucHJvILYKKwk6c3JjOnByb3RvOm1lbnUucHJvILYKKwk6c3JjOnByb3RvOm1lc3NhZ2UucHJvILYKKwk6c3JjOnByb3RvOm1pc2MxLnBybyC2CisJOnNyYzpwcm90bzptaXNjMi5wcm8gtgorCTpzcmM6cHJvdG86bW92ZS5wcm8gtgorCTpzcmM6cHJvdG86bXVsdGlieXRlLnBybyC2CisJOnNyYzpwcm90bzpub3JtYWwucHJvILYKKwk6c3JjOnByb3RvOm9wcy5wcm8gtgorCTpzcmM6cHJvdG86b3B0aW9uLnBybyC2CisJOnNyYzpwcm90bzpxdWlja2ZpeC5wcm8gtgorCTpzcmM6cHJvdG86cmVnZXhwLnBybyC2CisJOnNyYzpwcm90bzpzY3JlZW4ucHJvILYKKwk6c3JjOnByb3RvOnNlYXJjaC5wcm8gtgorCTpzcmM6cHJvdG86c3ludGF4LnBybyC2CisJOnNyYzpwcm90bzp0YWcucHJvILYKKwk6c3JjOnByb3RvOnRlcm0ucHJvILYKKwk6c3JjOnByb3RvOnRlcm1saWIucHJvILYKKwk6c3JjOnByb3RvOnVpLnBybyC2CisJOnNyYzpwcm90bzp1bmRvLnBybyC2CisJOnNyYzpwcm90bzp2ZXJzaW9uLnBybyC2CisJOnNyYzpwcm90bzp3aW5kb3cucHJvILYKKwk6c3JjOnByb3RvOmlmX3B5dGhvbi5wcm8gtgorCTpzcmM6cHJvdG86aWZfdGNsLnBybyC2CisJOnNyYzpwcm90bzppZl9ydWJ5LnBybyC2CisJOnNyYzpwcm90bzpndWkucHJvILYKKwk6c3JjOnByb3RvOnB0eS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0ay5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2d0a194MTEucHJvILYKKwk6c3JjOnByb3RvOmd1aV9tb3RpZi5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX2F0aGVuYS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21hYy5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86d29ya3Nob3AucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmwucHJvILYKKwk6c3JjOnByb3RvOmlmX3BlcmxzZmlvLnBybworCis6b2JqOndzZGVidWcuYy54CcQgILYKKwk6c3JjOndzZGVidWcuYyC2CisJOnNyYzp2aW0uaCC2CisJOnNyYzphdXRvOmNvbmZpZy5oILYKKwk6c3JjOmZlYXR1cmUuaCC2CisJOnNyYzpvc191bml4LmggtgorCTpzcmM6b3NfbWFjLmggtgorCTpzcmM6d29ya3Nob3AuaCC2CisJOnNyYzphc2NpaS5oILYKKwk6c3JjOmtleW1hcC5oILYKKwk6c3JjOnRlcm0uaCC2CisJOnNyYzptYWNyb3MuaCC2CisJOnNyYzpzdHJ1Y3RzLmggtgorCTpzcmM6Z2xvYmFscy5oILYKKwk6c3JjOm9wdGlvbi5oILYKKwk6c3JjOmV4X2NtZHMuaCC2CisJOnNyYzpwcm90by5oILYKKwk6c3JjOmludGVncmF0aW9uLmggtgorCTpzcmM6d3NkZWJ1Zy5oILYKKwk6c3JjOnJlZ2V4cC5oILYKKwk6c3JjOmd1aS5oILYKKwk6c3JjOmZhcnNpLmggtgorCTpzcmM6cHJvdG86b3NfdW5peC5wcm8gtgorCTpzcmM6cHJvdG86b3NfbWFjLnBybyC2CisJOnNyYzpwcm90bzpidWZmZXIucHJvILYKKwk6c3JjOnByb3RvOmNoYXJzZXQucHJvILYKKwk6c3JjOnByb3RvOmlmX2NzY29wZS5wcm8gtgorCTpzcmM6cHJvdG86ZGlmZi5wcm8gtgorCTpzcmM6cHJvdG86ZGlncmFwaC5wcm8gtgorCTpzcmM6cHJvdG86ZWRpdC5wcm8gtgorCTpzcmM6cHJvdG86ZXZhbC5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kcy5wcm8gtgorCTpzcmM6cHJvdG86ZXhfY21kczIucHJvILYKKwk6c3JjOnByb3RvOmV4X2RvY21kLnBybyC2CisJOnNyYzpwcm90bzpleF9ldmFsLnBybyC2CisJOnNyYzpwcm90bzpleF9nZXRsbi5wcm8gtgorCTpzcmM6cHJvdG86ZmlsZWlvLnBybyC2CisJOnNyYzpwcm90bzpmb2xkLnBybyC2CisJOnNyYzpwcm90bzpnZXRjaGFyLnBybyC2CisJOnNyYzpwcm90bzpoYW5ndWxpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFpbi5wcm8gtgorCTpzcmM6cHJvdG86bWFyay5wcm8gtgorCTpzcmM6cHJvdG86bWVtZmlsZS5wcm8gtgorCTpzcmM6cHJvdG86bWVtbGluZS5wcm8gtgorCTpzcmM6cHJvdG86bWVudS5wcm8gtgorCTpzcmM6cHJvdG86bWVzc2FnZS5wcm8gtgorCTpzcmM6cHJvdG86bWlzYzEucHJvILYKKwk6c3JjOnByb3RvOm1pc2MyLnBybyC2CisJOnNyYzpwcm90bzptb3ZlLnBybyC2CisJOnNyYzpwcm90bzptdWx0aWJ5dGUucHJvILYKKwk6c3JjOnByb3RvOm5vcm1hbC5wcm8gtgorCTpzcmM6cHJvdG86b3BzLnBybyC2CisJOnNyYzpwcm90bzpvcHRpb24ucHJvILYKKwk6c3JjOnByb3RvOnF1aWNrZml4LnBybyC2CisJOnNyYzpwcm90bzpyZWdleHAucHJvILYKKwk6c3JjOnByb3RvOnNjcmVlbi5wcm8gtgorCTpzcmM6cHJvdG86c2VhcmNoLnBybyC2CisJOnNyYzpwcm90bzpzeW50YXgucHJvILYKKwk6c3JjOnByb3RvOnRhZy5wcm8gtgorCTpzcmM6cHJvdG86dGVybS5wcm8gtgorCTpzcmM6cHJvdG86dGVybWxpYi5wcm8gtgorCTpzcmM6cHJvdG86dWkucHJvILYKKwk6c3JjOnByb3RvOnVuZG8ucHJvILYKKwk6c3JjOnByb3RvOnZlcnNpb24ucHJvILYKKwk6c3JjOnByb3RvOndpbmRvdy5wcm8gtgorCTpzcmM6cHJvdG86aWZfcHl0aG9uLnBybyC2CisJOnNyYzpwcm90bzppZl90Y2wucHJvILYKKwk6c3JjOnByb3RvOmlmX3J1YnkucHJvILYKKwk6c3JjOnByb3RvOmd1aS5wcm8gtgorCTpzcmM6cHJvdG86cHR5LnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrLnBybyC2CisJOnNyYzpwcm90bzpndWlfZ3RrX3gxMS5wcm8gtgorCTpzcmM6cHJvdG86Z3VpX21vdGlmLnBybyC2CisJOnNyYzpwcm90bzpndWlfYXRoZW5hLnBybyC2CisJOnNyYzpwcm90bzpndWlfbWFjLnBybyC2CisJOnNyYzpwcm90bzpndWlfeDExLnBybyC2CisJOnNyYzpwcm90bzp3b3Jrc2hvcC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybC5wcm8gtgorCTpzcmM6cHJvdG86aWZfcGVybHNmaW8ucHJvCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9tdmMubWFrIGIvc3JjL01ha2VfbXZjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWU3N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VfbXZjLm1hawpAQCAtMCwwICsxLDg4OCBAQAorIyBNYWtlZmlsZSBmb3IgVmltIG9uIFdpbjMyIChXaW5kb3dzIE5UIGFuZCBXaW5kb3dzIDk1KSwgdXNpbmcgdGhlCisjIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIueCBhbmQgTVNWQyA0LnggY29tcGlsZXJzIChvciBuZXdlcikuCisjIEl0IGJ1aWxkcyBvbiBXaW5kb3dzIDk1IGFuZCBhbGwgZm91ciBOVCBwbGF0Zm9ybXM6IGkzODYsIEFscGhhLCBNSVBTLCBhbmQKKyMgUG93ZXJQQy4gIFRoZSBOVC9pMzg2IGJpbmFyeSBhbmQgdGhlIFdpbmRvd3MgOTUgYmluYXJ5IGFyZSBpZGVudGljYWwuCisjCisjIFRoaXMgbWFrZWZpbGUgY2FuIGJ1aWxkIHRoZSBjb25zb2xlLCBHVUksIE9MRS1lbmFibGUsIFBlcmwtZW5hYmxlZCBhbmQKKyMgUHl0aG9uLWVuYWJsZWQgdmVyc2lvbnMgb2YgdmltIGZvciBXaW4zMiBwbGF0Zm9ybXMuCisjCisjIFdoZW4gY29tcGlsaW5nIGRpZmZlcmVudCB2ZXJzaW9ucywgZG8gIm5tYWtlIGNsZWFuIiBmaXJzdCEKKyMKKyMgVGhlIGJhc2ljIGNvbW1hbmQgbGluZSB0byBidWlsZCB2aW0gaXM6CisjCW5tYWtlIC1mIE1ha2VfbXZjLm1haworIyBUaGlzIHdpbGwgYnVpbGQgdGhlIGNvbnNvbGUgdmVyc2lvbiBvZiB2aW0gd2l0aCBubyBhZGRpdGlvbmFsIGludGVyZmFjZXMuCisjIFRvIGFkZCBpbnRlcmZhY2VzLCBkZWZpbmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisjCUdVSSBpbnRlcmZhY2U6IEdVST15ZXMgKGRlZmF1bHQgaXMgbm8pCisjCU9MRSBpbnRlcmZhY2U6IE9MRT15ZXMgKHVzdWFsbHkgd2l0aCBHVUk9eWVzKQorIwlNdWx0aWJ5dGUgc3VwcG9ydDogTUJZVEU9eWVzCisjCUlNRSBzdXBwb3J0OiBJTUU9eWVzCShyZXF1aXJlcyBHVUk9eWVzKQorIwkgIERZTkFNSUNfSU1FPVt5ZXMgb3Igbm9dICAodG8gbG9hZCB0aGUgaW1tMzIuZGxsIGR5bmFtaWNhbGx5LCBkZWZhdWx0CisjCSAgaXMgeWVzKQorIwlHbG9iYWwgSU1FIHN1cHBvcnQ6IEdJTUU9eWVzIChyZXF1aXJlcyBHVUk9eWVzKQorIwlQZXJsIGludGVyZmFjZToKKyMJICBQRVJMPVtQYXRoIHRvIFBlcmwgZGlyZWN0b3J5XQorIwkgIERZTkFNSUNfUEVSTD15ZXMgKHRvIGxvYWQgdGhlIFBlcmwgRExMIGR5bmFtaWNhbGx5KQorIwkgIFBFUkxfVkVSPVtQZXJsIHZlcnNpb24sIGluIHRoZSBmb3JtIDU1ICg1LjAwNSksIDU2ICg1LjYueCksIGV0Y10gKGRlZmF1bHQgaXMgNTYpCisjCVB5dGhvbiBpbnRlcmZhY2U6CisjCSAgUFlUSE9OPVtQYXRoIHRvIFB5dGhvbiBkaXJlY3RvcnldCisjCSAgRFlOQU1JQ19QWVRIT049eWVzICh0byBsb2FkIHRoZSBQeXRob24gRExMIGR5bmFtaWNhbGx5KQorIwkgIFBZVEhPTl9WRVI9W1B5dGhvbiB2ZXJzaW9uLCBlZyAxNSwgMjBdICAoZGVmYXVsdCBpcyAyMikKKyMJUnVieSBpbnRlcmZhY2U6CisjCSAgUlVCWT1bUGF0aCB0byBSdWJ5IGRpcmVjdG9yeV0KKyMJICBEWU5BTUlDX1JVQlk9eWVzICh0byBsb2FkIHRoZSBSdWJ5IERMTCBkeW5hbWljYWxseSkKKyMJICBSVUJZX1ZFUj1bUnVieSB2ZXJzaW9uLCBlZyAxNiwgMTddIChkZWZhdWx0IGlzIDE4KQorIwkgIFJVQllfVkVSX0xPTkc9W1J1YnkgdmVyc2lvbiwgZWcgMS42LCAxLjddIChkZWZhdWx0IGlzIDEuOCkKKyMJICAgIFlvdSBtdXN0IHNldCBSVUJZX1ZFUl9MT05HIHdoZW4gY2hhbmdlIFJVQllfVkVSLgorIwlUY2wgaW50ZXJmYWNlOgorIwkgIFRDTD1bUGF0aCB0byBUY2wgZGlyZWN0b3J5XQorIwkgIERZTkFNSUNfVENMPXllcyAodG8gbG9hZCB0aGUgVGNsIERMTCBkeW5hbWljYWxseSkKKyMJICBUQ0xfVkVSPVtUY2wgdmVyc2lvbiwgZS5nLiA4MCwgODNdICAoZGVmYXVsdCBpcyA4MykKKyMJICBUQ0xfVkVSX0xPTkc9W1RjbCB2ZXJzaW9uLCBlZyA4LjNdIChkZWZhdWx0IGlzIDguMykKKyMJICAgIFlvdSBtdXN0IHNldCBUQ0xfVkVSX0xPTkcgd2hlbiB5b3Ugc2V0IFRDTF9WRVIuCisjCURlYnVnIHZlcnNpb246IERFQlVHPXllcworIwlNYXBmaWxlOiBNQVA9W25vLCB5ZXMgb3IgbGluZXNdIChkZWZhdWx0IGlzIHllcykKKyMJICBubzogICAgRG9uJ3Qgd3JpdGUgYSBtYXBmaWxlLgorIwkgIHllczogICBXcml0ZSBhIG5vcm1hbCBtYXBmaWxlLgorIwkgIGxpbmVzOiBXcml0ZSBhIG1hcGZpbGUgd2l0aCBsaW5lIG51bWJlcnMgKG9ubHkgZm9yIFZDNiBhbmQgbGF0ZXIpCisjCVNOaUZGKyBpbnRlcmZhY2U6IFNOSUZGPXllcworIwlDc2NvcGUgc3VwcG9ydDogQ1NDT1BFPXllcworIwlJY29udiBsaWJyYXJ5IHN1cHBvcnQgKGFsd2F5cyBkeW5hbWljYWxseSBsb2FkZWQpOgorIwkgIElDT05WPVt5ZXMgb3Igbm9dICAoZGVmYXVsdCBpcyB5ZXMpCisjCUludGwgbGlicmFyeSBzdXBwb3J0IChhbHdheXMgZHluYW1pY2FsbHkgbG9hZGVkKToKKyMJICBHRVRURVhUPVt5ZXMgb3Igbm9dICAoZGVmYXVsdCBpcyB5ZXMpCisjCVNlZSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2dldHRleHQvCisjICAgICAgIFBvc3RTY3JpcHQgcHJpbnRpbmc6IFBPU1RTQ1JJUFQ9eWVzIChkZWZhdWx0IGlzIG5vKQorIyAgICAgICBGZWF0dXJlIFNldDogRkVBVFVSRVM9W1RJTlksIFNNQUxMLCBOT1JNQUwsIEJJRywgb3IgSFVHRV0gKGRlZmF1bHQgaXMgQklHKQorIyAgICAgICBWZXJzaW9uIFN1cHBvcnQ6IFdJTlZFUj1bMHgwNDAwLCAweDA1MDBdIChkZWZhdWx0IGlzIDB4MDQwMCkKKyMgICAgICAgUHJvY2Vzc29yIFZlcnNpb246IENQVU5SPVtpMzg2LCBpNDg2LCBpNTg2LCBpNjg2XSAoZGVmYXVsdCBpcyBpMzg2KQorIyAgICAgICBPcHRpbWl6YXRpb246IE9QVElNSVpFPVtTUEFDRSwgU1BFRUQsIE1BWFNQRUVEXSAoZGVmYXVsdCBpcyBNQVhTUEVFRCkKKyMgICAgICAgTmV0YmVhbnMgU3VwcG9ydDogTkVUQkVBTlM9W3llcyBvciBub10gKGRlZmF1bHQgaXMgeWVzIGlmIEdVSSBpcyB5ZXMpCisjICAgICAgIFhQTSBJbWFnZSBTdXBwb3J0OiBYUE09W3BhdGggdG8gWFBNIGRpcmVjdG9yeV0KKyMKKyMgWW91IGNhbiBjb21iaW5lIGFueSBvZiB0aGVzZSBpbnRlcmZhY2VzCisjCisjIEV4YW1wbGU6IFRvIGJ1aWxkIHRoZSBub24tZGVidWcsIEdVSSB2ZXJzaW9uIHdpdGggUGVybCBpbnRlcmZhY2U6CisjCW5tYWtlIC1mIE1ha2VfbXZjLm1hayBHVUk9eWVzIFBFUkw9QzpcUGVybAorIworIyBUbyBidWlsZCB1c2luZyBCb3JsYW5kIEMrKywgdXNlIE1ha2VfYmMzLm1hayBvciBNYWtlX2JjNS5tYWsuCisjCisjIERFQlVHIHdpdGggTWFrZV9tdmMubWFrIGFuZCBNYWtlX2R2Yy5tYWs6CisjCVRoaXMgbWFrZWZpbGUgZ2l2ZXMgYSBmaW5lbmVzcyBvZiBjb250cm9sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyMJVmlzdWFsIEMrKyBjb25maWd1cmF0aW9uIGZpbGVzLiAgVGhlcmVmb3JlLCBkZWJ1Z2dpbmcgcmVxdWlyZXMgYSBiaXQgb2YKKyMJZXh0cmEgd29yay4KKyMJTWFrZV9kdmMubWFrIGlzIGEgVmlzdWFsIEMrKyBwcm9qZWN0IHRvIGFjY2VzcyB0aGF0IHN1cHBvcnQuCisjCVRvIHVzZSBNYWtlX2R2Yy5tYWs6CisjCTEpIEJ1aWxkIFZpbSB3aXRoIE1ha2VfbXZjLm1hay4KKyMJICAgICBVc2UgYSAiREVCVUc9eWVzIiBhcmd1bWVudCB0byBidWlsZCBWaW0gd2l0aCBkZWJ1ZyBzdXBwb3J0LgorIwkgICAgIEUuZy4gdGhlIGZvbGxvd2luZyBidWlsZHMgZ3ZpbWQuZXhlOgorIwkJbm1ha2UgLWYgTWFrZV9tdmMubWFrIGRlYnVnPXllcyBndWk9eWVzCisjCTIpIFVzZSBNUyBEZXZzdHVkaW8gYW5kIHNldCBpdCB1cCB0byBhbGxvdyB0aGF0IGZpbGUgdG8gYmUgZGVidWdnZWQ6CisjCSAgICBpKSBQYXNzIE1ha2VfZHZjLm1hayB0byB0aGUgSURFLgorIwkJIFVzZSB0aGUgIm9wZW4gd29ya3NwYWNlIiBtZW51IGVudHJ5IHRvIGxvYWQgTWFrZV9kdmMubWFrLgorIwkJIEFsdGVybmF0aXZlbHksIGZyb20gdGhlIGNvbW1hbmQgbGluZToKKyMJCQltc2RldiAvbm9sb2dvIE1ha2VfZHZjLm1haworIwkJTm90ZTogTWFrZV9kdmMubWFrIGlzIGluIFZDNC4wIGZvcm1hdC4gTGF0ZXIgVkMgdmVyc2lvbnMgc2VlCisjCQl0aGlzIGFuZCBvZmZlciB0byBjb252ZXJ0IGl0IHRvIHRoZWlyIG93biBmb3JtYXQuIEFjY2VwdCB0aGF0LgorIwkJSXQgY3JlYXRlcyBhIGZpbGUgY2FsbGVkIE1ha2VfZHZjLmRzdyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkCisjCQlmb3IgZnVydGhlciBvcGVyYXRpb25zLiAgRS5nLgorIwkJICAgIG1zZGV2IC9ub2xvZ28gTWFrZV9kdmMuZHN3CisjCSAgICBpaSkgU2V0IHRoZSBidWlsdCBleGVjdXRhYmxlIGZvciBkZWJ1Z2dpbmc6CisjCQlhKSBBbHQrRjcvRGVidWcgdGFrZXMgeW91IHRvIHRoZSBEZWJ1ZyBkaWFsb2cuCisjCQliKSBGaWxsICJFeGVjdXRhYmxlIGZvciBkZWJ1ZyBzZXNzaW9uIi4gZS5nLiBndmltZC5leGUKKyMJCWMpIEZpbGwgIlByb2dyYW0gYXJndW1lbnRzIi4gZS5nLiAtUiBkb3NpbnN0LmMKKyMJCWQpIENvbXBsZXRlIHRoZSBkaWFsb2cKKyMJMykgWW91IGNhbiBub3cgZGVidWcgdGhlIGV4ZWN1dGFibGUgeW91IGJ1aWx0IHdpdGggTWFrZV9tdmMubWFrCisjCisjCU5vdGU6IE1ha2VfZHZjLm1hayBidWlsZHMgdmltcnVuLmV4ZSwgYmVjYXVzZSBpdCBtdXN0IGJ1aWxkIHNvbWV0aGluZworIwl0byBiZSBhIHZhbGlkIG1ha2VmaWxlLi4KKworIyMjIFNlZSBmZWF0dXJlLmggZm9yIGEgbGlzdCBvZiBvcHRpb25hbHMuCisjIElmIHlvdSB3YW50IHRvIGJ1aWxkIHNvbWUgb3B0aW9uYWwgZmVhdHVyZXMgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHNvdXJjZSwKKyMgeW91IGNhbiBzZXQgREVGSU5FUyBvbiB0aGUgY29tbWFuZCBsaW5lLCBlLmcuLAorIwlubWFrZSAtZiBtYWtlZmlsZS5tdmMgIkRFRklORVM9LURFTUFDU19UQUdTIgorCisjIEJ1aWxkIG9uIGJvdGggV2luZG93cyBOVCBhbmQgV2luZG93cyA5NQorCitUQVJHRVRPUyA9IEJPVEgKKworIyBTZWxlY3Qgb25lIG9mIGVpZ2h0IG9iamVjdCBjb2RlIGRpcmVjdG9yaWVzLCBkZXBlbmRzIG9uIEdVSSwgT0xFIGFuZCBERUJVRy4KKyMgSWYgeW91IGNoYW5nZSBzb21ldGhpbmcgZWxzZSwgZG8gIm1ha2UgY2xlYW4iIGZpcnN0IQorIWlmICIkKEdVSSkiID09ICJ5ZXMiCitPQkpESVIgPSAuXE9iakcKKyFlbHNlCitPQkpESVIgPSAuXE9iakMKKyFlbmRpZgorIWlmICIkKE9MRSkiID09ICJ5ZXMiCitPQkpESVIgPSAkKE9CSkRJUilPCishZW5kaWYKKyFpZiAiJChERUJVRykiID09ICJ5ZXMiCitPQkpESVIgPSAkKE9CSkRJUilkCishZW5kaWYKKworIyBudHdpbjMyLm1hayByZXF1aXJlcyB0aGF0IENQVSBiZSBzZXQgYXBwcm9wcmlhdGVseQorCishaWZkZWYgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRQorIyBXZSdyZSBvbiBXaW5kb3dzIE5UIG9yIHVzaW5nIFZDIDYKK0NQVSA9ICQoUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSkKKyEgaWYgIiQoQ1BVKSIgPT0gIng4NiIKK0NQVSA9IGkzODYKKyEgZW5kaWYKKyFlbHNlICAjICFQUk9DRVNTT1JfQVJDSElURUNUVVJFCisjIFdlJ3JlIG9uIFdpbmRvd3MgOTUKK0NQVSA9IGkzODYKKyFlbmRpZiAjICFQUk9DRVNTT1JfQVJDSElURUNUVVJFCisKKworIyBCdWlsZCBhIHJldGFpbCB2ZXJzaW9uIGJ5IGRlZmF1bHQKKworIWlmICIkKERFQlVHKSIgIT0gInllcyIKK05PREVCVUcgPSAxCishZWxzZQorTUFLRUZMQUdTX0dWSU1FWFQgPSBERUJVRz15ZXMKKyFlbmRpZgorCisKKyMgQnVpbGQgYSBtdWx0aXRocmVhZGVkIHZlcnNpb24gZm9yIHRoZSBXaW5kb3dzIDk1IGRlYWQga2V5cyBoYWNrCisjIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmsuCisjIE1VTFRJVEhSRUFERUQgPSAxCisKKworIyBHZXQgYWxsIHNvcnRzIG9mIHVzZWZ1bCwgc3RhbmRhcmQgbWFjcm9zIGZyb20gdGhlIFNESy4gIChOb3RlIHRoYXQKKyMgTVNWQyAyLjIgZG9lcyBub3QgaW5zdGFsbCA8bnR3aW4zMi5tYWs+IGluIHRoZSBcbXN2YzIwXGluY2x1ZGUKKyMgZGlyZWN0b3J5LCBidXQgeW91IGNhbiBmaW5kIGl0IGluIFxtc3ZjMjBcaW5jbHVkZSBvbiB0aGUgQ0QtUk9NLgorIyBZb3UgbWF5IGFsc28gbmVlZCA8d2luMzIubWFrPiBmcm9tIHRoZSBzYW1lIHBsYWNlLikKKworIWluY2x1ZGUgPG50d2luMzIubWFrPgorCisKKyM+Pj4+PiBwYXRoIG9mIHRoZSBjb21waWxlciBhbmQgbGlua2VyOyBuYW1lIG9mIGluY2x1ZGUgYW5kIGxpYiBkaXJlY3RvcmllcworIyBQQVRIID0gYzpcbXN2YzIwXGJpbjskKFBBVEgpCisjIElOQ0xVREUgPSBjOlxtc3ZjMjBcaW5jbHVkZQorIyBMSUIgPSBjOlxtc3ZjMjBcbGliCisKKyFpZm5kZWYgQ1RBR1MKK0NUQUdTID0gY3RhZ3MKKyFlbmRpZgorCishaWYgIiQoU05JRkYpIiA9PSAieWVzIgorIyBTTklGRiAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgU05pRkYrLgorU05JRkZfSU5DTCAgPSBpZl9zbmlmZi5oCitTTklGRl9PQkogICA9ICQoT0JKRElSKS9pZl9zbmlmZi5vYmoKK1NOSUZGX0xJQiAgICA9IHNoZWxsMzIubGliCitTTklGRl9ERUZTICA9IC1ERkVBVF9TTklGRgorIyBUaGUgU05pRkYgaW50ZWdyYXRpb24gbmVlZHMgbXVsdGl0aHJlYWRlZCBsaWJyYXJpZXMhCitNVUxUSVRIUkVBREVEID0geWVzCishZW5kaWYKKworIWlmbmRlZiBDU0NPUEUKK0NTQ09QRSA9IHllcworIWVuZGlmCisKKyFpZiAiJChDU0NPUEUpIiA9PSAieWVzIgorIyBDU0NPUEUgLSBJbmNsdWRlIHN1cHBvcnQgZm9yIENzY29wZQorQ1NDT1BFX0lOQ0wgID0gaWZfY3Njb3BlLmgKK0NTQ09QRV9PQkogICA9ICQoT0JKRElSKS9pZl9jc2NvcGUub2JqCitDU0NPUEVfREVGUyAgPSAtREZFQVRfQ1NDT1BFCishZW5kaWYKKworIWlmbmRlZiBORVRCRUFOUworTkVUQkVBTlMgPSAkKEdVSSkKKyFlbmRpZgorCishaWYgIiQoTkVUQkVBTlMpIiA9PSAieWVzIgorIyBORVRCRUFOUyAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgTmV0YmVhbnMgaW50ZWdyYXRpb24KK05FVEJFQU5TX1BSTwk9IHByb3RvL25ldGJlYW5zLnBybworTkVUQkVBTlNfT0JKCT0gJChPQkpESVIpL25ldGJlYW5zLm9iaiAkKE9CSkRJUikvZ3VpX2JldmFsLm9iagorTkVUQkVBTlNfREVGUwk9IC1ERkVBVF9ORVRCRUFOU19JTlRHCishaWYgIiQoREVCVUcpIiA9PSAieWVzIgorTkJERUJVR19ERUZTCT0gLUROQkRFQlVHCitOQkRFQlVHX0lOQ0wJPSBuYmRlYnVnLmgKK05CREVCVUdfU1JDCT0gbmJkZWJ1Zy5jCishZW5kaWYKK05FVEJFQU5TX0xJQiAgID0gV1NvY2szMi5saWIKKyFlbmRpZgorCishaWZkZWYgWFBNCisjIFhQTSAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgWFBNIHNpZ25zCisjIHlvdSBjYW4gZ2V0IHhwbS5saWIgZnJvbSBodHRwOi8vaWFtcGhldC5ubS5ydS94cG0gb3IgY3JlYXRlIGl0IHlvdXJzZWxmCitYUE1fT0JKICAgPSAkKE9CSkRJUikveHBtX3czMi5vYmoKK1hQTV9ERUZTICA9IC1ERkVBVF9YUE1fVzMyCitYUE1fTElCICAgPSAkKFhQTSlcbGliXGxpYlhwbS5saWIKK1hQTV9JTkMJICA9IC1JICQoWFBNKVxpbmNsdWRlCishZW5kaWYKKworIWlmIGRlZmluZWQoVVNFX01TVkNSVCkKK0NWQVJTID0gJChjdmFyc2RsbCkKKyFlbHNlaWYgZGVmaW5lZChNVUxUSVRIUkVBREVEKQorQ1ZBUlMgPSAkKGN2YXJzbXQpCishZWxzZQorQ1ZBUlMgPSAkKGN2YXJzKQorIWVuZGlmCisKKyMgbmVlZCBhZHZhcGkzMi5saWIgZm9yIEdldFVzZXJOYW1lKCkKKyMgbmVlZCBzaGVsbDMyLmxpYiBmb3IgRXh0cmFjdEljb24oKQorIyBnZGkzMi5saWIgYW5kIGNvbWRsZzMyLmxpYiBmb3IgcHJpbnRpbmcgc3VwcG9ydAorIyBvbGUzMi5saWIgYW5kIHV1aWQubGliIGFyZSBuZWVkZWQgZm9yIEZFQVRfU0hPUlRDVVQKK0NPTl9MSUIgPSBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMyLmxpYiBvbGUzMi5saWIgdXVpZC5saWIKKyFpZiAiJChWQzYpIiA9PSAieWVzIgorQ09OX0xJQiA9ICQoQ09OX0xJQikgL0RFTEFZTE9BRDpjb21kbGczMi5kbGwgL0RFTEFZTE9BRDpvbGUzMi5kbGwgRGVsYXlJbXAubGliCishZW5kaWYKKworIyMjIFNldCB0aGUgZGVmYXVsdCAkKFdJTlZFUikgdG8gbWFrZSBpdCB3b3JrIHdpdGggVkMrKzcuMCAoVlMuTkVUKQorIyAgV2hlbiBzZXQgdG8gMHgwNTAwICI6YnJvd3NlIiBzdG9wcyB3b3JraW5nLgorIWlmbmRlZiBXSU5WRVIKK1dJTlZFUiA9IDB4MDQwMAorIWVuZGlmCisKKyMgSWYgeW91IGhhdmUgYSBmaXhlZCBkaXJlY3RvcnkgZm9yICRWSU0gb3IgJFZJTVJVTlRJTUUsIG90aGVyIHRoYW4gdGhlIG5vcm1hbAorIyBkZWZhdWx0LCB1c2UgdGhlc2UgbGluZXMuCisjVklNUkNMT0MgPSBzb21ld2hlcmUKKyNWSU1SVU5USU1FRElSID0gc29tZXdoZXJlCisKK0NGTEFHUyA9IC1jIC9XMyAvbm9sb2dvICQoQ1ZBUlMpIC1JLiAtSXByb3RvIC1ESEFWRV9QQVRIREVGIC1EV0lOMzIgXAorCQkkKFNOSUZGX0RFRlMpICQoQ1NDT1BFX0RFRlMpICQoTkVUQkVBTlNfREVGUykgXAorCQkkKE5CREVCVUdfREVGUykgJChYUE1fREVGUykgXAorCQkkKERFRklORVMpIC1EV0lOVkVSPSQoV0lOVkVSKSAtRF9XSU4zMl9XSU5OVD0kKFdJTlZFUikKKworIz4+Pj4+IGVuZCBvZiBjaG9pY2VzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIWlmZGVmIE9TCitPU19UWVBFCT0gd2lubnQKK0RFTF9UUkVFID0gcm1kaXIgL3MgL3EKKyFlbHNlCitPU19UWVBFCT0gd2luOTUKK0RFTF9UUkVFID0gZGVsdHJlZSAveQorIWVuZGlmCisKK0lOVERJUj0kKE9CSkRJUikKK09VVERJUj0kKE9CSkRJUikKKworIyBDb252ZXJ0IHByb2Nlc3NvciBJRCB0byBNVkMtY29tcGF0aWJsZSBudW1iZXIKKyFpZiAiJChDUFVOUikiID09ICJpMzg2IgorQ1BVQVJHID0gL0czCishZWxzZWlmICIkKENQVU5SKSIgPT0gImk0ODYiCitDUFVBUkcgPSAvRzQKKyFlbHNlaWYgIiQoQ1BVTlIpIiA9PSAiaTU4NiIKK0NQVUFSRyA9IC9HNQorIWVsc2VpZiAiJChDUFVOUikiID09ICJpNjg2IgorQ1BVQVJHID0gL0c2CishZWxzZQorQ1BVQVJHID0KKyFlbmRpZgorCishaWZkZWYgTk9ERUJVRworVklNID0gdmltCishaWYgIiQoT1BUSU1JWkUpIiA9PSAiU1BBQ0UiCitPUFRGTEFHID0gL08xCishZWxzZWlmICIkKE9QVElNSVpFKSIgPT0gIlNQRUVEIgorT1BURkxBRyA9IC9PMgorIWVsc2UgIyBNQVhTUEVFRAorT1BURkxBRyA9IC9PeAorIWVuZGlmCitDRkxBR1MgPSAkKENGTEFHUykgJChPUFRGTEFHKSAtRE5ERUJVRyAvWmkgJChDUFVBUkcpCitSQ0ZMQUdTID0gJChyY2ZsYWdzKSAkKHJjdmFycykgLUROREVCVUcKK1BEQiA9IC9GZCQoT1VURElSKS8KK0xJTktfUERCID0gL1BEQjokKE9VVERJUikvCishIGlmZGVmIFVTRV9NU1ZDUlQKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtTUQKK0xJQkMgPSBtc3ZjcnQubGliCishIGVsc2VpZiBkZWZpbmVkKE1VTFRJVEhSRUFERUQpCitMSUJDID0gbGliY210LmxpYgorISBlbHNlCitMSUJDID0gbGliYy5saWIKKyEgZW5kaWYKKyFlbHNlICAjIERFQlVHCitWSU0gPSB2aW1kCisjIE1TVkMgNC4xCitQREIgPSAvRmQkKE9VVERJUikvCitMSU5LX1BEQiA9IC9QREI6JChPVVRESVIpLworIyBNU1ZDIDIuMgorIyBQREIgPSAvRmQkKE9VVERJUikvdmltLnBkYgorIyBMSU5LX1BEQiA9IC9QREI6JChPVVRESVIpL3ZpbS5wZGIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRF9ERUJVRyAtRERFQlVHIC9aaSAvT2QKK1JDRkxBR1MgPSAkKHJjZmxhZ3MpICQocmN2YXJzKSAtRF9ERUJVRyAtRERFQlVHCisjIFRoZSAvZml4ZWQ6bm8gaXMgbmVlZGVkIGZvciBRdWFudGlmeS4gQXNzdW1lIG5vdCA0Lj8gYXMgdW5zdXBwb3J0ZWQgaW4gVkM0LjAuCishIGlmICIkKF9OTUFLRV9WRVIpIiA9PSAiIgorTElCQyA9CishIGVsc2UKK0xJQkMgPSAvZml4ZWQ6bm8KKyEgZW5kaWYKKworISBpZm5kZWYgVVNFX01TVkNSVAorTElCQyA9ICQoTElCQykgbGliY2QubGliCishIGVsc2UKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtTURkCitMSUJDID0gJChMSUJDKSBtc3ZjcnRkLmxpYgorISBlbmRpZgorIWVuZGlmICMgREVCVUcKKworSU5DTCA9CXZpbS5oIG9zX3dpbjMyLmggYXNjaWkuaCBmZWF0dXJlLmggZ2xvYmFscy5oIGtleW1hcC5oIG1hY3Jvcy5oIFwKKwlwcm90by5oIG9wdGlvbi5oIHN0cnVjdHMuaCB0ZXJtLmggJChTTklGRl9JTkNMKSAkKENTQ09QRV9JTkNMKSBcCisJJChOQkRFQlVHX0lOQ0wpCisKK09CSiA9IFwKKwkkKE9VVERJUilcYnVmZmVyLm9iaiBcCisJJChPVVRESVIpXGNoYXJzZXQub2JqIFwKKwkkKE9VVERJUilcZGlmZi5vYmogXAorCSQoT1VURElSKVxkaWdyYXBoLm9iaiBcCisJJChPVVRESVIpXGVkaXQub2JqIFwKKwkkKE9VVERJUilcZXZhbC5vYmogXAorCSQoT1VURElSKVxleF9jbWRzLm9iaiBcCisJJChPVVRESVIpXGV4X2NtZHMyLm9iaiBcCisJJChPVVRESVIpXGV4X2RvY21kLm9iaiBcCisJJChPVVRESVIpXGV4X2V2YWwub2JqIFwKKwkkKE9VVERJUilcZXhfZ2V0bG4ub2JqIFwKKwkkKE9VVERJUilcZmlsZWlvLm9iaiBcCisJJChPVVRESVIpXGZvbGQub2JqIFwKKwkkKE9VVERJUilcZ2V0Y2hhci5vYmogXAorCSQoT1VURElSKVxtYWluLm9iaiBcCisJJChPVVRESVIpXG1hcmsub2JqIFwKKwkkKE9VVERJUilcbWJ5dGUub2JqIFwKKwkkKE9VVERJUilcbWVtZmlsZS5vYmogXAorCSQoT1VURElSKVxtZW1saW5lLm9iaiBcCisJJChPVVRESVIpXG1lbnUub2JqIFwKKwkkKE9VVERJUilcbWVzc2FnZS5vYmogXAorCSQoT1VURElSKVxtaXNjMS5vYmogXAorCSQoT1VURElSKVxtaXNjMi5vYmogXAorCSQoT1VURElSKVxtb3ZlLm9iaiBcCisJJChPVVRESVIpXG5vcm1hbC5vYmogXAorCSQoT1VURElSKVxvcHMub2JqIFwKKwkkKE9VVERJUilcb3B0aW9uLm9iaiBcCisJJChPVVRESVIpXG9zX21zd2luLm9iaiBcCisJJChPVVRESVIpXG9zX3dpbjMyLm9iaiBcCisJJChPVVRESVIpXHBhdGhkZWYub2JqIFwKKwkkKE9VVERJUilccXVpY2tmaXgub2JqIFwKKwkkKE9VVERJUilccmVnZXhwLm9iaiBcCisJJChPVVRESVIpXHNjcmVlbi5vYmogXAorCSQoT1VURElSKVxzZWFyY2gub2JqIFwKKwkkKE9VVERJUilcc3ludGF4Lm9iaiBcCisJJChPVVRESVIpXHRhZy5vYmogXAorCSQoT1VURElSKVx0ZXJtLm9iaiBcCisJJChPVVRESVIpXHVpLm9iaiBcCisJJChPVVRESVIpXHVuZG8ub2JqIFwKKwkkKE9VVERJUilcd2luZG93Lm9iaiBcCisJJChPVVRESVIpXHZpbS5yZXMKKworIWlmICIkKE9MRSkiID09ICJ5ZXMiCitDRkxBR1MgPSAkKENGTEFHUykgLURGRUFUX09MRQorUkNGTEFHUyA9ICQoUkNGTEFHUykgLURGRUFUX09MRQorT0xFX09CSiA9ICQoT1VURElSKVxpZl9vbGUub2JqCitPTEVfSURMID0gaWZfb2xlLmlkbAorT0xFX0xJQiA9IG9sZWF1dDMyLmxpYgorIWVuZGlmCisKKyFpZiAiJChJTUUpIiA9PSAieWVzIgorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERkVBVF9NQllURV9JTUUKKyFpZm5kZWYgRFlOQU1JQ19JTUUKK0RZTkFNSUNfSU1FID0geWVzCishZW5kaWYKKyFpZiAiJChEWU5BTUlDX0lNRSkiID09ICJ5ZXMiCitDRkxBR1MgPSAkKENGTEFHUykgLUREWU5BTUlDX0lNRQorIWVsc2UKK0lNRV9MSUIgPSBpbW0zMi5saWIKKyFlbmRpZgorIWVuZGlmCisKKyFpZiAiJChHSU1FKSIgPT0gInllcyIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtREdMT0JBTF9JTUUKK09CSiA9ICQoT0JKKSAkKE9VVERJUilcZGltbV9pLm9iaiAkKE9VVERJUilcZ2xibF9pbWUub2JqCitNQllURSA9IHllcworIWVuZGlmCisKKyFpZiAiJChNQllURSkiID09ICJ5ZXMiCitDRkxBR1MgPSAkKENGTEFHUykgLURGRUFUX01CWVRFCishZW5kaWYKKworIWlmICIkKEdVSSkiID09ICJ5ZXMiCitTVUJTWVNURU0gPSB3aW5kb3dzCitDRkxBR1MgPSAkKENGTEFHUykgLURGRUFUX0dVSV9XMzIKK1JDRkxBR1MgPSAkKFJDRkxBR1MpIC1ERkVBVF9HVUlfVzMyCitWSU0gPSBnJChWSU0pCitHVUlfSU5DTCA9IFwKKwlndWkuaCBcCisJcmVnZXhwLmggXAorCWFzY2lpLmggXAorCWV4X2NtZHMuaCBcCisJZmFyc2kuaCBcCisJZmVhdHVyZS5oIFwKKwlnbG9iYWxzLmggXAorCWtleW1hcC5oIFwKKwltYWNyb3MuaCBcCisJb3B0aW9uLmggXAorCW9zX2Rvcy5oIFwKKwlvc193aW4zMi5oCitHVUlfT0JKID0gXAorCSQoT1VURElSKVxndWkub2JqIFwKKwkkKE9VVERJUilcZ3VpX3czMi5vYmogXAorCSQoT1VURElSKVxvc193MzJleGUub2JqCitHVUlfTElCID0gXAorCW9sZG5hbWVzLmxpYiBrZXJuZWwzMi5saWIgZ2RpMzIubGliICQoSU1FX0xJQikgXAorCXdpbnNwb29sLmxpYiBjb21jdGwzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIFwKKwkvbWFjaGluZTokKENQVSkgL25vZGVmYXVsdGxpYgorIWVsc2UKK1NVQlNZU1RFTSA9IGNvbnNvbGUKKyFlbmRpZgorCisjIGljb252LmRsbCBsaWJyYXJ5IChkeW5hbWljYWxseSBsb2FkZWQpCishaWZuZGVmIElDT05WCitJQ09OViA9IHllcworIWVuZGlmCishaWYgIiQoSUNPTlYpIiA9PSAieWVzIgorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERFlOQU1JQ19JQ09OVgorIWVuZGlmCisKKyMgbGliaW50bC5kbGwgbGlicmFyeQorIWlmbmRlZiBHRVRURVhUCitHRVRURVhUID0geWVzCishZW5kaWYKKyFpZiAiJChHRVRURVhUKSIgPT0gInllcyIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRERZTkFNSUNfR0VUVEVYVAorIWVuZGlmCisKKyMgVENMIGludGVyZmFjZQorIWlmZGVmIFRDTAorIWlmbmRlZiBUQ0xfVkVSCitUQ0xfVkVSID0gODMKK1RDTF9WRVJfTE9ORyA9IDguMworIWVuZGlmCishbWVzc2FnZSBUY2wgcmVxdWVzdGVkICh2ZXJzaW9uICQoVENMX1ZFUikpIC0gcm9vdCBkaXIgaXMgIiQoVENMKSIKKyFpZiAiJChEWU5BTUlDX1RDTCkiID09ICJ5ZXMiCishbWVzc2FnZSBUY2wgRExMIHdpbGwgYmUgbG9hZGVkIGR5bmFtaWNhbGx5CitUQ0xfRExMID0gdGNsJChUQ0xfVkVSKS5kbGwKK0NGTEFHUyAgPSAkKENGTEFHUykgLURGRUFUX1RDTCAtRERZTkFNSUNfVENMIC1ERFlOQU1JQ19UQ0xfRExMPVwiJChUQ0xfRExMKVwiIC1ERFlOQU1JQ19UQ0xfVkVSPVwiJChUQ0xfVkVSX0xPTkcpXCIKK1RDTF9PQkoJPSAkKE9VVERJUilcaWZfdGNsLm9iagorVENMX0lOQwk9IC9JICIkKFRDTClcSW5jbHVkZSIgL0kgIiQoVENMKSIKK1RDTF9MSUIgPSAkKFRDTClcbGliXHRjbHN0dWIkKFRDTF9WRVIpLmxpYgorIWVsc2UKK0NGTEFHUyAgPSAkKENGTEFHUykgLURGRUFUX1RDTAorVENMX09CSgk9ICQoT1VURElSKVxpZl90Y2wub2JqCitUQ0xfSU5DCT0gL0kgIiQoVENMKVxJbmNsdWRlIiAvSSAiJChUQ0wpIgorVENMX0xJQiA9ICQoVENMKVxsaWJcdGNsJChUQ0xfVkVSKXZjLmxpYgorIWVuZGlmCishZW5kaWYKKworIyBQWVRIT04gaW50ZXJmYWNlCishaWZkZWYgUFlUSE9OCishaWZuZGVmIFBZVEhPTl9WRVIKK1BZVEhPTl9WRVIgPSAyMgorIWVuZGlmCishbWVzc2FnZSBQeXRob24gcmVxdWVzdGVkICh2ZXJzaW9uICQoUFlUSE9OX1ZFUikpIC0gcm9vdCBkaXIgaXMgIiQoUFlUSE9OKSIKKyFpZiAiJChEWU5BTUlDX1BZVEhPTikiID09ICJ5ZXMiCishbWVzc2FnZSBQeXRob24gRExMIHdpbGwgYmUgbG9hZGVkIGR5bmFtaWNhbGx5CishZW5kaWYKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtREZFQVRfUFlUSE9OCitQWVRIT05fT0JKID0gJChPVVRESVIpXGlmX3B5dGhvbi5vYmoKK1BZVEhPTl9JTkMgPSAvSSAiJChQWVRIT04pXEluY2x1ZGUiIC9JICIkKFBZVEhPTilcUEMiCishaWYgIiQoRFlOQU1JQ19QWVRIT04pIiA9PSAieWVzIgorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERFlOQU1JQ19QWVRIT04gLUREWU5BTUlDX1BZVEhPTl9ETEw9XCJweXRob24kKFBZVEhPTl9WRVIpLmRsbFwiCitQWVRIT05fTElCID0gL25vZGVmYXVsdGxpYjpweXRob24kKFBZVEhPTl9WRVIpLmxpYgorIWVsc2UKK1BZVEhPTl9MSUIgPSAkKFBZVEhPTilcbGlic1xweXRob24kKFBZVEhPTl9WRVIpLmxpYgorIWVuZGlmCishZW5kaWYKKworIyBQZXJsIGludGVyZmFjZQorIWlmZGVmIFBFUkwKKyFpZm5kZWYgUEVSTF9WRVIKK1BFUkxfVkVSID0gNTYKKyFlbmRpZgorIW1lc3NhZ2UgUGVybCByZXF1ZXN0ZWQgKHZlcnNpb24gJChQRVJMX1ZFUikpIC0gcm9vdCBkaXIgaXMgIiQoUEVSTCkiCishaWYgIiQoRFlOQU1JQ19QRVJMKSIgPT0gInllcyIKKyFpZiAkKFBFUkxfVkVSKSA+PSA1NgorIW1lc3NhZ2UgUGVybCBETEwgd2lsbCBiZSBsb2FkZWQgZHluYW1pY2FsbHkKKyFlbHNlCishbWVzc2FnZSBEeW5hbWljIGxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgUGVybCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNS42LjAKKyFtZXNzYWdlIFJldmVydGluZyB0byBzdGF0aWMgbG9hZGluZy4uLgorIXVuZGVmIERZTkFNSUNfUEVSTAorIWVuZGlmCishZW5kaWYKKworIyBJcyBQZXJsIGluc3RhbGxlZCBpbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgZGlyZWN0b3JpZXM/CishaWYgZXhpc3QoJChQRVJMKVxCaW5cTVNXaW4zMi14ODYpCitQRVJMX0FSQ0ggPSBcTVNXaW4zMi14ODYKKyFlbmRpZgorCitQRVJMX0lOQ0RJUiA9ICQoUEVSTClcTGliJChQRVJMX0FSQ0gpXENvcmUKKworIyBWZXJzaW9uLWRlcGVuZGVudCBzdHVmZgorIWlmICQoUEVSTF9WRVIpID09IDU1CitQRVJMX0xJQiA9ICQoUEVSTF9JTkNESVIpXHBlcmwubGliCishZWxzZQorUEVSTF9ETEwgPSBwZXJsJChQRVJMX1ZFUikuZGxsCitQRVJMX0xJQiA9ICQoUEVSTF9JTkNESVIpXHBlcmwkKFBFUkxfVkVSKS5saWIKKyFlbmRpZgorCitDRkxBR1MgPSAkKENGTEFHUykgLURGRUFUX1BFUkwKKworIyBEbyB3ZSB3YW50IHRvIGxvYWQgUGVybCBkeW5hbWljYWxseT8KKyFpZiAiJChEWU5BTUlDX1BFUkwpIiA9PSAieWVzIgorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERFlOQU1JQ19QRVJMIC1ERFlOQU1JQ19QRVJMX0RMTD1cIiQoUEVSTF9ETEwpXCIKKyF1bmRlZiBQRVJMX0xJQgorIWVuZGlmCisKK1BFUkxfRVhFID0gJChQRVJMKVxCaW4kKFBFUkxfQVJDSClccGVybAorUEVSTF9JTkMgPSAvSSAkKFBFUkxfSU5DRElSKQorUEVSTF9PQkogPSAkKE9VVERJUilcaWZfcGVybC5vYmogJChPVVRESVIpXGlmX3BlcmxzZmlvLm9iagorWFNVQlBQID0gJChQRVJMKVxsaWJcRXh0VXRpbHNceHN1YnBwCitYU1VCUFBfVFlQRU1BUCA9ICQoUEVSTClcbGliXEV4dFV0aWxzXHR5cGVtYXAKKworIWVuZGlmCisKKyMKKyMgU3VwcG9ydCBSdWJ5IGludGVyZmFjZQorIworIWlmZGVmIFJVQlkKKyMgIFNldCBkZWZhdWx0IHZhbHVlCishaWZuZGVmIFJVQllfVkVSCitSVUJZX1ZFUiA9IDE4CishZW5kaWYKKyFpZm5kZWYgUlVCWV9WRVJfTE9ORworUlVCWV9WRVJfTE9ORyA9IDEuOAorIWVuZGlmCisKKyFpZiAkKFJVQllfVkVSKSA+PSAxOAorIWlmbmRlZiBSVUJZX1BMQVRGT1JNCitSVUJZX1BMQVRGT1JNID0gaTM4Ni1tc3dpbjMyCishZW5kaWYKKyFpZm5kZWYgUlVCWV9JTlNUQUxMX05BTUUKK1JVQllfSU5TVEFMTF9OQU1FID0gbXN2Y3J0LXJ1YnkkKFJVQllfVkVSKQorIWVuZGlmCishZWxzZQorIWlmbmRlZiBSVUJZX1BMQVRGT1JNCitSVUJZX1BMQVRGT1JNID0gaTU4Ni1tc3dpbjMyCishZW5kaWYKKyFpZm5kZWYgUlVCWV9JTlNUQUxMX05BTUUKK1JVQllfSU5TVEFMTF9OQU1FID0gbXN3aW4zMi1ydWJ5JChSVUJZX1ZFUikKKyFlbmRpZgorIWVuZGlmICMgJChSVUJZX1ZFUikgPj0gMTgKKworIW1lc3NhZ2UgUnVieSByZXF1ZXN0ZWQgKHZlcnNpb24gJChSVUJZX1ZFUikpIC0gcm9vdCBkaXIgaXMgIiQoUlVCWSkiCitDRkxBR1MgPSAkKENGTEFHUykgLURGRUFUX1JVQlkKK1JVQllfT0JKID0gJChPVVRESVIpXGlmX3J1Ynkub2JqCitSVUJZX0lOQyA9IC9JICIkKFJVQlkpXGxpYlxydWJ5XCQoUlVCWV9WRVJfTE9ORylcJChSVUJZX1BMQVRGT1JNKSIKK1JVQllfTElCID0gJChSVUJZKVxsaWJcJChSVUJZX0lOU1RBTExfTkFNRSkubGliCisjIERvIHdlIHdhbnQgdG8gbG9hZCBSdWJ5IGR5bmFtaWNhbGx5PworIWlmICIkKERZTkFNSUNfUlVCWSkiID09ICJ5ZXMiCishbWVzc2FnZSBSdWJ5IERMTCB3aWxsIGJlIGxvYWRlZCBkeW5hbWljYWxseQorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERFlOQU1JQ19SVUJZIC1ERFlOQU1JQ19SVUJZX0RMTD1cIiQoUlVCWV9JTlNUQUxMX05BTUUpLmRsbFwiIC1ERFlOQU1JQ19SVUJZX1ZFUj0kKFJVQllfVkVSKQorIXVuZGVmIFJVQllfTElCCishZW5kaWYKKyFlbmRpZiAjIFJVQlkKKworIworIyBTdXBwb3J0IFBvc3RTY3JpcHQgcHJpbnRpbmcKKyMKKyFpZiAiJChQT1NUU0NSSVBUKSIgPT0gInllcyIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRE1TV0lOUFMKKyFlbmRpZiAjIFBPU1RTQ1JJUFQKKworIworIyBGRUFUVVJFUzogVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UKKyMKKyFpZiAiJChGRUFUVVJFUykiPT0iIgorRkVBVFVSRVMgPSBCSUcKKyFlbmRpZgorQ0ZMQUdTID0gJChDRkxBR1MpIC1ERkVBVF8kKEZFQVRVUkVTKQorCisjCisjIEVuZCBleHRyYSBmZWF0dWFyZSBpbmNsdWRlCisjCishbWVzc2FnZQorCitjb25mbGFncyA9IC9ub2xvZ28gL3N1YnN5c3RlbTokKFNVQlNZU1RFTSkgL2luY3JlbWVudGFsOm5vCisKKyFJRiAiJChNQVApIiA9PSAieWVzIgorIyAiL21hcCIgaXMgZm9yIGRlYnVnZ2luZworY29uZmxhZ3MgPSAkKGNvbmZsYWdzKSAvbWFwCishRUxTRUlGICIkKE1BUCkiID09ICJsaW5lcyIKKyMgIi9tYXBpbmZvOmxpbmVzIiBpcyBmb3IgZGVidWdnaW5nLCBvbmx5IHdvcmtzIGZvciBWQzYgYW5kIGxhdGVyCitjb25mbGFncyA9ICQoY29uZmxhZ3MpIC9tYXAgL21hcGluZm86bGluZXMKKyFFTkRJRgorCitMSU5LQVJHUzEgPSAkKGxpbmtkZWJ1ZykgJChjb25mbGFncykgL25vZGVmYXVsdGxpYjpsaWJjCitMSU5LQVJHUzIgPSAkKENPTl9MSUIpICQoR1VJX0xJQikgJChMSUJDKSAkKE9MRV9MSUIpICB1c2VyMzIubGliICQoU05JRkZfTElCKSBcCisJCSQoUEVSTF9MSUIpICQoUFlUSE9OX0xJQikgJChSVUJZX0xJQikgJChUQ0xfTElCKSBcCisJCSQoTkVUQkVBTlNfTElCKSAkKFhQTV9MSUIpICQoTElOS19QREIpCisKK2FsbDoJJChWSU0pIHZpbXJ1bi5leGUgaW5zdGFsbC5leGUgdW5pbnN0YWwuZXhlIHh4ZC94eGQuZXhlIEd2aW1FeHQvZ3ZpbWV4dC5kbGwKKworJChWSU0pOiAkKE9VVERJUikgJChPQkopICQoR1VJX09CSikgJChPTEVfT0JKKSAkKE9MRV9JREwpICQoUEVSTF9PQkopICQoUFlUSE9OX09CSikgJChSVUJZX09CSikgJChUQ0xfT0JKKSAkKFNOSUZGX09CSikgJChDU0NPUEVfT0JKKSAkKE5FVEJFQU5TX09CSikgJChYUE1fT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJChDQykgJChDRkxBR1MpICB2ZXJzaW9uLmMgL0ZvJChPVVRESVIpL3ZlcnNpb24ub2JqICQoUERCKQorCSQobGluaykgJChMSU5LQVJHUzEpIC1vdXQ6JCouZXhlICQoT0JKKSAkKEdVSV9PQkopICQoT0xFX09CSikgXAorCQkkKFBFUkxfT0JKKSAkKFBZVEhPTl9PQkopICQoUlVCWV9PQkopICQoVENMX09CSikgJChTTklGRl9PQkopIFwKKwkJJChDU0NPUEVfT0JKKSAkKE5FVEJFQU5TX09CSikgJChYUE1fT0JKKSBcCisJCSQoT1VURElSKVx2ZXJzaW9uLm9iaiAkKExJTktBUkdTMikKKworJChWSU0pLmV4ZTogJChWSU0pCisKKyQoT1VURElSKToKKwlpZiBub3QgZXhpc3QgJChPVVRESVIpL251bCAgICBta2RpciAkKE9VVERJUikKKworaW5zdGFsbC5leGU6IGRvc2luc3QuYworCSQoQ0MpIC9ub2xvZ28gLUROREVCVUcgLURXSU4zMiBkb3NpbnN0LmMga2VybmVsMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBhZHZhcGkzMi5saWIgdXVpZC5saWIKKwktIGlmIGV4aXN0IGluc3RhbGwuZXhlIGRlbCBpbnN0YWxsLmV4ZQorCXJlbiBkb3NpbnN0LmV4ZSBpbnN0YWxsLmV4ZQorCit1bmluc3RhbC5leGU6IHVuaW5zdGFsLmMKKwkkKENDKSAvbm9sb2dvIC1ETkRFQlVHIC1EV0lOMzIgdW5pbnN0YWwuYyBzaGVsbDMyLmxpYiBhZHZhcGkzMi5saWIKKwordmltcnVuLmV4ZTogdmltcnVuLmMKKwkkKENDKSAvbm9sb2dvIC1ETkRFQlVHIHZpbXJ1bi5jCisKK3h4ZC94eGQuZXhlOiB4eGQveHhkLmMKKwljZCB4eGQKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZV9tdmMubWFrCisJY2QgLi4KKworR3ZpbUV4dC9ndmltZXh0LmRsbDogR3ZpbUV4dC9ndmltZXh0LmNwcCBHdmltRXh0L2d2aW1leHQucmMgR3ZpbUV4dC9ndmltZXh0LmgKKwljZCBHdmltRXh0CisJJChNQUtFKSAvTk9MT0dPIC1mIE1ha2VmaWxlICQoTUFLRUZMQUdTX0dWSU1FWFQpCisJY2QgLi4KKworCit0YWdzOiBub3RhZ3MKKwkkKENUQUdTKSAqLmMgKi5jcHAgKi5oIGlmX3BlcmwueHMgcHJvdG9cKi5wcm8KKworbm90YWdzOgorCS0gaWYgZXhpc3QgdGFncyBkZWwgdGFncworCitjbGVhbjoKKwktICQoREVMX1RSRUUpICQoT1VURElSKSBhdXRvCisJLSBpZiBleGlzdCAqLm9iaiBkZWwgKi5vYmoKKwktIGlmIGV4aXN0ICQoVklNKS5leGUgZGVsICQoVklNKS5leGUKKwktIGlmIGV4aXN0ICQoVklNKS5pbGsgZGVsICQoVklNKS5pbGsKKwktIGlmIGV4aXN0ICQoVklNKS5wZGIgZGVsICQoVklNKS5wZGIKKwktIGlmIGV4aXN0ICQoVklNKS5tYXAgZGVsICQoVklNKS5tYXAKKwktIGlmIGV4aXN0ICQoVklNKS5uY2IgZGVsICQoVklNKS5uY2IKKwktIGlmIGV4aXN0IHZpbXJ1bi5leGUgZGVsIHZpbXJ1bi5leGUKKwktIGlmIGV4aXN0IGluc3RhbGwuZXhlIGRlbCBpbnN0YWxsLmV4ZQorCS0gaWYgZXhpc3QgdW5pbnN0YWwuZXhlIGRlbCB1bmluc3RhbC5leGUKKwktIGlmIGV4aXN0IGlmX3BlcmwuYyBkZWwgaWZfcGVybC5jCisJLSBpZiBleGlzdCBkaW1tLmggZGVsIGRpbW0uaAorCS0gaWYgZXhpc3QgZGltbV9pLmMgZGVsIGRpbW1faS5jCisJLSBpZiBleGlzdCBkaW1tLnRsYiBkZWwgZGltbS50bGIKKwktIGlmIGV4aXN0IGRvc2luc3QuZXhlIGRlbCBkb3NpbnN0LmV4ZQorCWNkIHh4ZAorCSQoTUFLRSkgL05PTE9HTyAtZiBNYWtlX212Yy5tYWsgY2xlYW4KKwljZCAuLgorCWNkIEd2aW1FeHQKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZWZpbGUgY2xlYW4KKwljZCAuLgorCWNkIEd2aW1FeHQKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZWZpbGUgY2xlYW4KKwljZCAuLgorCS0gaWYgZXhpc3QgdGVzdGRpclwqLm91dCBkZWwgdGVzdGRpclwqLm91dAorCit0ZXN0OgorCWNkIHRlc3RkaXIKKwkkKE1BS0UpIC9OT0xPR08gLWYgTWFrZV9kb3MubWFrIHdpbjMyCisJY2QgLi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ3JlYXRlIGEgZGVmYXVsdCBydWxlIGZvciB0cmFuc2Zvcm1pbmcgLmMgZmlsZXMgdG8gLm9iaiBmaWxlcyBpbiAkKE9VVERJUikKKyMgQmF0Y2ggY29tcGlsYXRpb24gaXMgc3VwcG9ydGVkIGJ5IG5tYWtlIDEuNjIgKHBhcnQgb2YgVlMgNS4wKSBhbmQgbGF0ZXIpCishSUYgIiQoX05NQUtFX1ZFUikiID09ICIiCisuY3skKE9VVERJUikvfS5vYmo6CishRUxTRQorLmN7JChPVVRESVIpL30ub2JqOjoKKyFFTkRJRgorCSQoQ0MpICQoQ0ZMQUdTKSAvRm8kKE9VVERJUikvICQoUERCKSAkPAorCisjIENyZWF0ZSBhIGRlZmF1bHQgcnVsZSBmb3IgdHJhbnNmb3JtaW5nIC5jcHAgZmlsZXMgdG8gLm9iaiBmaWxlcyBpbiAkKE9VVERJUikKKyMgQmF0Y2ggY29tcGlsYXRpb24gaXMgc3VwcG9ydGVkIGJ5IG5tYWtlIDEuNjIgKHBhcnQgb2YgVlMgNS4wKSBhbmQgbGF0ZXIpCishSUYgIiQoX05NQUtFX1ZFUikiID09ICIiCisuY3BweyQoT1VURElSKS99Lm9iajoKKyFFTFNFCisuY3BweyQoT1VURElSKS99Lm9iajo6CishRU5ESUYKKwkkKENDKSAkKENGTEFHUykgL0ZvJChPVVRESVIpLyAkKFBEQikgJDwKKworJChPVVRESVIpL2J1ZmZlci5vYmo6CSQoT1VURElSKSBidWZmZXIuYyAgJChJTkNMKQorCiskKE9VVERJUikvY2hhcnNldC5vYmo6CSQoT1VURElSKSBjaGFyc2V0LmMgICQoSU5DTCkKKworJChPVVRESVIpL2RpZmYub2JqOgkkKE9VVERJUikgZGlmZi5jICAkKElOQ0wpCisKKyQoT1VURElSKS9kaWdyYXBoLm9iajoJJChPVVRESVIpIGRpZ3JhcGguYyAgJChJTkNMKQorCiskKE9VVERJUikvZWRpdC5vYmo6CSQoT1VURElSKSBlZGl0LmMgICQoSU5DTCkKKworJChPVVRESVIpL2V2YWwub2JqOgkkKE9VVERJUikgZXZhbC5jICAkKElOQ0wpCisKKyQoT1VURElSKS9leF9jbWRzLm9iajoJJChPVVRESVIpIGV4X2NtZHMuYyAgJChJTkNMKQorCiskKE9VVERJUikvZXhfY21kczIub2JqOgkkKE9VVERJUikgZXhfY21kczIuYyAgJChJTkNMKQorCiskKE9VVERJUikvZXhfZG9jbWQub2JqOgkkKE9VVERJUikgZXhfZG9jbWQuYyAgJChJTkNMKSBleF9jbWRzLmgKKworJChPVVRESVIpL2V4X2V2YWwub2JqOgkkKE9VVERJUikgZXhfZXZhbC5jICAkKElOQ0wpIGV4X2NtZHMuaAorCiskKE9VVERJUikvZXhfZ2V0bG4ub2JqOgkkKE9VVERJUikgZXhfZ2V0bG4uYyAgJChJTkNMKQorCiskKE9VVERJUikvZmlsZWlvLm9iajoJJChPVVRESVIpIGZpbGVpby5jICAkKElOQ0wpCisKKyQoT1VURElSKS9mb2xkLm9iajoJJChPVVRESVIpIGZvbGQuYyAgJChJTkNMKQorCiskKE9VVERJUikvZ2V0Y2hhci5vYmo6CSQoT1VURElSKSBnZXRjaGFyLmMgICQoSU5DTCkKKworJChPVVRESVIpL2d1aS5vYmo6CSQoT1VURElSKSBndWkuYyAgJChJTkNMKSAkKEdVSV9JTkNMKQorCiskKE9VVERJUikvZ3VpX3czMi5vYmo6CSQoT1VURElSKSBndWlfdzMyLmMgZ3VpX3c0OC5jICQoSU5DTCkgJChHVUlfSU5DTCkKKworJChPVVRESVIpL2lmX2NzY29wZS5vYmo6ICQoT1VURElSKSBpZl9jc2NvcGUuYyAgJChJTkNMKQorCitpZl9wZXJsLmMgOiBpZl9wZXJsLnhzIHR5cGVtYXAKKwkkKFBFUkxfRVhFKSAkKFhTVUJQUCkgLXByb3RvdHlwZXMgLXR5cGVtYXAgJChYU1VCUFBfVFlQRU1BUCkgLXR5cGVtYXAgdHlwZW1hcCBpZl9wZXJsLnhzID4gaWZfcGVybC5jCisKKyQoT1VURElSKS9pZl9wZXJsLm9iajogJChPVVRESVIpIGlmX3BlcmwuYyAgJChJTkNMKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKFBFUkxfSU5DKSBpZl9wZXJsLmMgL0ZvJChPVVRESVIpL2lmX3Blcmwub2JqICQoUERCKQorCiskKE9VVERJUikvaWZfcGVybHNmaW8ub2JqOiAkKE9VVERJUikgaWZfcGVybHNmaW8uYyAgJChJTkNMKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKFBFUkxfSU5DKSBpZl9wZXJsc2Zpby5jIC9GbyQoT1VURElSKS9pZl9wZXJsc2Zpby5vYmogJChQREIpCisKKyQoT1VURElSKS9pZl9weXRob24ub2JqOiAkKE9VVERJUikgaWZfcHl0aG9uLmMgICQoSU5DTCkKKwkkKENDKSAkKENGTEFHUykgJChQWVRIT05fSU5DKSBpZl9weXRob24uYyAvRm8kKE9VVERJUikvaWZfcHl0aG9uLm9iaiAkKFBEQikKKworJChPVVRESVIpL2lmX29sZS5vYmo6ICQoT1VURElSKSBpZl9vbGUuY3BwICAkKElOQ0wpIGlmX29sZS5oCisKKyQoT1VURElSKS9pZl9ydWJ5Lm9iajogJChPVVRESVIpIGlmX3J1YnkuYyAgJChJTkNMKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKFJVQllfSU5DKSBpZl9ydWJ5LmMgL0ZvJChPVVRESVIpL2lmX3J1Ynkub2JqICQoUERCKQorCiskKE9VVERJUikvaWZfc25pZmYub2JqOgkkKE9VVERJUikgaWZfc25pZmYuYyAgJChJTkNMKQorCSQoQ0MpICQoQ0ZMQUdTKSBpZl9zbmlmZi5jIC9GbyQoT1VURElSKS9pZl9zbmlmZi5vYmogJChQREIpCisKKyQoT1VURElSKS9pZl90Y2wub2JqOiAkKE9VVERJUikgaWZfdGNsLmMgICQoSU5DTCkKKwkkKENDKSAkKENGTEFHUykgJChUQ0xfSU5DKSBpZl90Y2wuYyAvRm8kKE9VVERJUikvaWZfdGNsLm9iaiAkKFBEQikKKworJChPVVRESVIpL21haW4ub2JqOgkkKE9VVERJUikgbWFpbi5jICAkKElOQ0wpCisKKyQoT1VURElSKS9tYXJrLm9iajoJJChPVVRESVIpIG1hcmsuYyAgJChJTkNMKQorCiskKE9VVERJUikvbWVtZmlsZS5vYmo6CSQoT1VURElSKSBtZW1maWxlLmMgICQoSU5DTCkKKworJChPVVRESVIpL21lbWxpbmUub2JqOgkkKE9VVERJUikgbWVtbGluZS5jICAkKElOQ0wpCisKKyQoT1VURElSKS9tZW51Lm9iajoJJChPVVRESVIpIG1lbnUuYyAgJChJTkNMKQorCiskKE9VVERJUikvbWVzc2FnZS5vYmo6CSQoT1VURElSKSBtZXNzYWdlLmMgICQoSU5DTCkKKworJChPVVRESVIpL21pc2MxLm9iajoJJChPVVRESVIpIG1pc2MxLmMgICQoSU5DTCkKKworJChPVVRESVIpL21pc2MyLm9iajoJJChPVVRESVIpIG1pc2MyLmMgICQoSU5DTCkKKworJChPVVRESVIpL21vdmUub2JqOgkkKE9VVERJUikgbW92ZS5jICAkKElOQ0wpCisKKyQoT1VURElSKS9tYnl0ZS5vYmo6ICQoT1VURElSKSBtYnl0ZS5jICAkKElOQ0wpCisKKyQoT1VURElSKS9uZXRiZWFucy5vYmo6ICQoT1VURElSKSBuZXRiZWFucy5jICQoTkJERUJVR19TUkMpICQoSU5DTCkKKworJChPVVRESVIpL25vcm1hbC5vYmo6CSQoT1VURElSKSBub3JtYWwuYyAgJChJTkNMKQorCiskKE9VVERJUikvb3B0aW9uLm9iajoJJChPVVRESVIpIG9wdGlvbi5jICAkKElOQ0wpCisKKyQoT1VURElSKS9vcHMub2JqOgkkKE9VVERJUikgb3BzLmMgICQoSU5DTCkKKworJChPVVRESVIpL29zX21zd2luLm9iajoJJChPVVRESVIpIG9zX21zd2luLmMgICQoSU5DTCkKKworJChPVVRESVIpL29zX3dpbjMyLm9iajoJJChPVVRESVIpIG9zX3dpbjMyLmMgICQoSU5DTCkgb3Nfd2luMzIuaAorCiskKE9VVERJUikvb3NfdzMyZXhlLm9iajoJJChPVVRESVIpIG9zX3czMmV4ZS5jICAkKElOQ0wpCisKKyQoT1VURElSKS9wYXRoZGVmLm9iajoJJChPVVRESVIpIGF1dG8vcGF0aGRlZi5jICAkKElOQ0wpCisJJChDQykgJChDRkxBR1MpIGF1dG8vcGF0aGRlZi5jIC9GbyQoT1VURElSKS9wYXRoZGVmLm9iaiAkKFBEQikKKworJChPVVRESVIpL3F1aWNrZml4Lm9iajoJJChPVVRESVIpIHF1aWNrZml4LmMgICQoSU5DTCkKKworJChPVVRESVIpL3JlZ2V4cC5vYmo6CSQoT1VURElSKSByZWdleHAuYyAgJChJTkNMKQorCiskKE9VVERJUikvc2NyZWVuLm9iajoJJChPVVRESVIpIHNjcmVlbi5jICAkKElOQ0wpCisKKyQoT1VURElSKS9zZWFyY2gub2JqOgkkKE9VVERJUikgc2VhcmNoLmMgICQoSU5DTCkKKworJChPVVRESVIpL3N5bnRheC5vYmo6CSQoT1VURElSKSBzeW50YXguYyAgJChJTkNMKQorCiskKE9VVERJUikvdGFnLm9iajoJJChPVVRESVIpIHRhZy5jICAkKElOQ0wpCisKKyQoT1VURElSKS90ZXJtLm9iajoJJChPVVRESVIpIHRlcm0uYyAgJChJTkNMKQorCiskKE9VVERJUikvdWkub2JqOgkkKE9VVERJUikgdWkuYyAgJChJTkNMKQorCiskKE9VVERJUikvdW5kby5vYmo6CSQoT1VURElSKSB1bmRvLmMgICQoSU5DTCkKKworJChPVVRESVIpL3dpbmRvdy5vYmo6CSQoT1VURElSKSB3aW5kb3cuYyAgJChJTkNMKQorCiskKE9VVERJUikveHBtX3czMi5vYmo6ICQoT1VURElSKSB4cG1fdzMyLmMKKwkkKENDKSAkKENGTEFHUykgJChYUE1fSU5DKSB4cG1fdzMyLmMgL0ZvJChPVVRESVIpL3hwbV93MzIub2JqICQoUERCKQorCiskKE9VVERJUikvdmltLnJlczoJJChPVVRESVIpIHZpbS5yYyB2ZXJzaW9uLmggdG9vbHMuYm1wIHRlYXJvZmYuYm1wIHZpbS5pY28gdmltX2Vycm9yLmljbyB2aW1fYWxlcnQuaWNvIHZpbV9pbmZvLmljbyB2aW1fcXVlc3QuaWNvCisJJChSQykgL2wgMHg0MDkgL0ZvJChPVVRESVIpL3ZpbS5yZXMgJChSQ0ZMQUdTKSB2aW0ucmMKKworaWlkX29sZS5jIGlmX29sZS5oIHZpbS50bGI6IGlmX29sZS5pZGwgJChJTlRESVIpICQoT1VURElSKQorCW1pZGwgL25vbG9nbyAvcHJveHkgbnVsIC9paWQgaWlkX29sZS5jIC90bGIgdmltLnRsYiAvaGVhZGVyIGlmX29sZS5oIGlmX29sZS5pZGwKKworZGltbS5oIGRpbW1faS5jOiBkaW1tLmlkbAorCW1pZGwgL25vbG9nbyAvcHJveHkgbnVsIGRpbW0uaWRsCisKKyQoT1VURElSKS9kaW1tX2kub2JqOiAkKE9VVERJUikgZGltbV9pLmMgJChJTkNMKQorCiskKE9VVERJUikvZ2xibF9pbWUub2JqOgkkKE9VVERJUikgZ2xibF9pbWUuY3BwICBkaW1tLmggJChJTkNMKQorCithdXRvL3BhdGhkZWYuYzogYXV0bworCUBlY2hvIGNyZWF0aW5nIGF1dG8vcGF0aGRlZi5jCisJQGVjaG8gLyogcGF0aGRlZi5jICovID4gYXV0b1xwYXRoZGVmLmMKKwlAZWNobyAjaW5jbHVkZSAidmltLmgiID4+IGF1dG9ccGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpkZWZhdWx0X3ZpbV9kaXIgPSAoY2hhcl91ICopIiQoVklNUkNMT0M6XD1cXCkiOyA+PiBhdXRvXHBhdGhkZWYuYworCUBlY2hvIGNoYXJfdSAqZGVmYXVsdF92aW1ydW50aW1lX2RpciA9IChjaGFyX3UgKikiJChWSU1SVU5USU1FRElSOlw9XFwpIjsgPj4gYXV0b1xwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmFsbF9jZmxhZ3MgPSAoY2hhcl91ICopIiQoQ0M6XD1cXCkgJChDRkxBR1MpIjsgPj4gYXV0b1xwYXRoZGVmLmMKKwlAZWNobyBjaGFyX3UgKmFsbF9sZmxhZ3MgPSAoY2hhcl91ICopIiQobGluazpcPVxcKSAkKExJTktBUkdTMTpcPVxcKSAkKExJTktBUkdTMjpcPVxcKSI7ID4+IGF1dG9ccGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpjb21waWxlZF91c2VyID0gKGNoYXJfdSAqKSIkKFVTRVJOQU1FKSI7ID4+IGF1dG9ccGF0aGRlZi5jCisJQGVjaG8gY2hhcl91ICpjb21waWxlZF9zeXMgPSAoY2hhcl91ICopIiQoVVNFUkRPTUFJTikiOyA+PiBhdXRvXHBhdGhkZWYuYworCithdXRvOgorCWlmIG5vdCBleGlzdCBhdXRvL251bCBta2RpciBhdXRvCisKKyMgRW5kIEN1c3RvbSBCdWlsZAorcHJvdG8uaDogXAorCXByb3RvL2J1ZmZlci5wcm8gXAorCXByb3RvL2NoYXJzZXQucHJvIFwKKwlwcm90by9kaWZmLnBybyBcCisJcHJvdG8vZGlncmFwaC5wcm8gXAorCXByb3RvL2VkaXQucHJvIFwKKwlwcm90by9ldmFsLnBybyBcCisJcHJvdG8vZXhfY21kcy5wcm8gXAorCXByb3RvL2V4X2NtZHMyLnBybyBcCisJcHJvdG8vZXhfZG9jbWQucHJvIFwKKwlwcm90by9leF9ldmFsLnBybyBcCisJcHJvdG8vZXhfZ2V0bG4ucHJvIFwKKwlwcm90by9maWxlaW8ucHJvIFwKKwlwcm90by9nZXRjaGFyLnBybyBcCisJcHJvdG8vbWFpbi5wcm8gXAorCXByb3RvL21hcmsucHJvIFwKKwlwcm90by9tZW1maWxlLnBybyBcCisJcHJvdG8vbWVtbGluZS5wcm8gXAorCXByb3RvL21lbnUucHJvIFwKKwlwcm90by9tZXNzYWdlLnBybyBcCisJcHJvdG8vbWlzYzEucHJvIFwKKwlwcm90by9taXNjMi5wcm8gXAorCXByb3RvL21vdmUucHJvIFwKKwlwcm90by9tYnl0ZS5wcm8gXAorCXByb3RvL25vcm1hbC5wcm8gXAorCXByb3RvL29wcy5wcm8gXAorCXByb3RvL29wdGlvbi5wcm8gXAorCXByb3RvL29zX21zd2luLnBybyBcCisJcHJvdG8vb3Nfd2luMzIucHJvIFwKKwlwcm90by9xdWlja2ZpeC5wcm8gXAorCXByb3RvL3JlZ2V4cC5wcm8gXAorCXByb3RvL3NjcmVlbi5wcm8gXAorCXByb3RvL3NlYXJjaC5wcm8gXAorCXByb3RvL3N5bnRheC5wcm8gXAorCXByb3RvL3RhZy5wcm8gXAorCXByb3RvL3Rlcm0ucHJvIFwKKwlwcm90by91aS5wcm8gXAorCXByb3RvL3VuZG8ucHJvIFwKKwlwcm90by93aW5kb3cucHJvIFwKKwkkKE5FVEJFQU5TX1BSTykKKworIyB2aW06IHNldCBub2V0IHN3PTggdHM9OCBzdHM9MCB3bT0wIHR3PTA6CmRpZmYgLS1naXQgYS9zcmMvTWFrZV9vczIubWFrIGIvc3JjL01ha2Vfb3MyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDIxZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2Vfb3MyLm1hawpAQCAtMCwwICsxLDE0NyBAQAorIworIyBNYWtlZmlsZSBmb3IgVklNIG9uIE9TLzIgdXNpbmcgRU1YCXZpbTp0cz04OnN3PTg6dHc9NzgKKyMKKyMgQ3JlYXRlZCBieTogUGF1bCBTbG9vdG1hbgorIworCisjIyMgVGhpcyBNYWtlZmlsZSBoYXMgYmVlbiBzdWNjZXNmdWxseSB0ZXN0ZWQgb24gdGhlc2Ugc3lzdGVtcy4KKyMjIyBDaGVjayB0aGUgKCopIGNvbHVtbiBmb3IgcmVtYXJrcywgbGlzdGVkIGJlbG93LgorIyMjIExhdGVyIGNvZGUgY2hhbmdlcyBtYXkgY2F1c2Ugc21hbGwgcHJvYmxlbXMsIG90aGVyd2lzZSBWaW0gaXMgc3VwcG9zZWQgdG8KKyMjIyBjb21waWxlIGFuZCBydW4gd2l0aG91dCBwcm9ibGVtcy4KKyMjIyBKdXN0IHRvIHNob3cgdGhhdCB0aGlzIGlzIGp1c3QgbGlrZSB0aGUgVW5peCB2ZXJzaW9uIQorCisjc3lzdGVtOgkgICAgICBjb25maWd1cmF0aW9uczoJCSAgICAgdmVyc2lvbiAoKikgdGVzdGVkIGJ5OgorIy0tLS0tLS0tLS0tLS0JICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSAgICAgLS0tLS0tLSAgLSAgLS0tLS0tLS0tLQorI09TLzIgV2FycCBIUEZTICAgICAgIGdjYy0yLjcuMitlbXgtMC45YiAtR1VJCQk0LjUJIFBhdWwgU2xvb3RtYW4KKyNPUy8yIEZBVAkgICAgICBnY2MtMi42LjMrZW14CSAtR1VJCQk0LjUJIEthcnN0ZW4gU2lldmVydAorCisjPj4+Pj4gY2hvb3NlIG9wdGlvbnM6CisKKyMjIyBTZWUgZmVhdHVyZS5oIGZvciBhIGxpc3Qgb2Ygb3B0aW9uYWxzLgorIyMjIEFueSBvdGhlciBkZWZpbmVzIGNhbiBiZSBpbmNsdWRlZCBoZXJlLgorCitERUZJTkVTID0gLURVU0VfU1lTVEVNPTEKKworIz4+Pj4+IG5hbWUgb2YgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIsIG5hbWUgb2YgbGliIGRpcmVjdG9yeQorQ0MgPSBnY2MKKworIz4+Pj4+IGVuZCBvZiBjaG9pY2VzCisKKyMjIyBOYW1lIG9mIHRhcmdldChzKQorVEFSR0VUID0gdmltLmV4ZQorCisjIyMgTmFtZXMgb2YgdGhlIHRvb2xzIHRoYXQgYXJlIGFsc28gbWFkZQorVE9PTFMgPSB4eGQveHhkLmV4ZSB0ZWUvdGVlLmV4ZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworSU5DTCA9IHZpbS5oIGdsb2JhbHMuaCBvcHRpb24uaCBrZXltYXAuaCBtYWNyb3MuaCBhc2NpaS5oIHRlcm0uaCBvc191bml4Lmggc3RydWN0cy5oIG9zX29zMl9jZmcuaAorQ0ZMQUdTID0gLU8yIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1ET1MyIC1XYWxsIC1JcHJvdG8gJChERUZJTkVTKQorCitPQkogPSBcCisJYnVmZmVyLm8gXAorCWNoYXJzZXQubyBcCisJZGlmZi5vIFwKKwlkaWdyYXBoLm8gXAorCWVkaXQubyBcCisJZXZhbC5vIFwKKwlleF9jbWRzLm8gXAorCWV4X2NtZHMyLm8gXAorCWV4X2RvY21kLm8gXAorCWV4X2V2YWwubyBcCisJZXhfZ2V0bG4ubyBcCisJZmlsZWlvLm8gXAorCWZvbGQubyBcCisJZ2V0Y2hhci5vIFwKKwltYWluLm8gXAorCW1hcmsubyBcCisJbWVtZmlsZS5vIFwKKwltZW1saW5lLm8gXAorCW1lbnUubyBcCisJbWVzc2FnZS5vIFwKKwltaXNjMS5vIFwKKwltaXNjMi5vIFwKKwltb3ZlLm8gXAorCW1ieXRlLm8gXAorCW5vcm1hbC5vIFwKKwlvcHMubyBcCisJb3B0aW9uLm8gXAorCXF1aWNrZml4Lm8gXAorCXJlZ2V4cC5vIFwKKwlzY3JlZW4ubyBcCisJc2VhcmNoLm8gXAorCXN5bnRheC5vIFwKKwl0YWcubyBcCisJdGVybS5vIFwKKwl1aS5vIFwKKwl1bmRvLm8gXAorCXdpbmRvdy5vIFwKKwlvc191bml4Lm8KKworTElCUyA9IC1sdGVybWNhcAorCisjIERlZmF1bHQgdGFyZ2V0IGlzIG1ha2luZyB0aGUgZXhlY3V0YWJsZQorYWxsOiAkKFRBUkdFVCkgJChUT09MUykKKworIyBMaW5rIHRoZSB0YXJnZXQgZm9yIG5vcm1hbCB1c2UKK0xGTEFHUyA9IC1aY3J0ZGxsIC1zIC1vICQoVEFSR0VUKSAkKExJQlMpCisKKyQoVEFSR0VUKTogJChPQkopIHZlcnNpb24uYyB2ZXJzaW9uLmgKKwkkKENDKSAkKENGTEFHUykgdmVyc2lvbi5jICQoT0JKKSAkKExGTEFHUykKKworeHhkL3h4ZC5leGU6IHh4ZC94eGQuYworCWNkIHh4ZCAmICQoTUFLRSkgLWYgTWFrZV9vczIubWFrCisKK3RlZS90ZWUuZXhlOiB0ZWUvdGVlLmMKKwljZCB0ZWUgJiAkKE1BS0UpIC1mIE1ha2VmaWxlCisKK3Rlc3Q6CisJY2QgdGVzdGRpciAmICQoTUFLRSkgLWYgTWFrZV9vczIubWFrCisKK2NsZWFuOgorCS1kZWwgKi5vCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5+ICp+ICouYmFrCisJY2QgeHhkICAgJiAkKE1BS0UpIC1mIE1ha2Vfb3MyLm1hayBjbGVhbgorCWNkIHRlZSAgICYgJChNQUtFKSAtZiBNYWtlZmlsZSBjbGVhbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb3NfdW5peC5vOglvc191bml4LmMgICQoSU5DTCkKK2J1ZmZlci5vOglidWZmZXIuYyAgJChJTkNMKQorY2hhcnNldC5vOgljaGFyc2V0LmMgICQoSU5DTCkKK2RpZmYubzoJCWRpZmYuYyAgJChJTkNMKQorZGlncmFwaC5vOglkaWdyYXBoLmMgICQoSU5DTCkKK2VkaXQubzoJCWVkaXQuYyAgJChJTkNMKQorZXZhbC5vOgkJZXZhbC5jICAkKElOQ0wpCitleF9jbWRzLm86CWV4X2NtZHMuYyAgJChJTkNMKQorZXhfY21kczIubzoJZXhfY21kczIuYyAgJChJTkNMKQorZXhfZG9jbWQubzoJZXhfZG9jbWQuYyAgJChJTkNMKSBleF9jbWRzLmgKK2V4X2V2YWwubzoJZXhfZXZhbC5jICAkKElOQ0wpIGV4X2NtZHMuaAorZXhfZ2V0bG4ubzoJZXhfZ2V0bG4uYyAgJChJTkNMKQorZmlsZWlvLm86CWZpbGVpby5jICAkKElOQ0wpCitmb2xkLm86CQlmb2xkLmMgICQoSU5DTCkKK2dldGNoYXIubzoJZ2V0Y2hhci5jICAkKElOQ0wpCittYWluLm86CQltYWluLmMgICQoSU5DTCkKK21hcmsubzoJCW1hcmsuYyAgJChJTkNMKQorbWVtZmlsZS5vOgltZW1maWxlLmMgICQoSU5DTCkKK21lbWxpbmUubzoJbWVtbGluZS5jICAkKElOQ0wpCittZW51Lm86CQltZW51LmMgICQoSU5DTCkKK21lc3NhZ2UubzoJbWVzc2FnZS5jICAkKElOQ0wpCittaXNjMS5vOgltaXNjMS5jICAkKElOQ0wpCittaXNjMi5vOgltaXNjMi5jICAkKElOQ0wpCittb3ZlLm86CQltb3ZlLmMgICQoSU5DTCkKK21ieXRlLm86CW1ieXRlLmMgICQoSU5DTCkKK25vcm1hbC5vOglub3JtYWwuYyAgJChJTkNMKQorb3BzLm86CQlvcHMuYyAgJChJTkNMKQorb3B0aW9uLm86CW9wdGlvbi5jICAkKElOQ0wpCitxdWlja2ZpeC5vOglxdWlja2ZpeC5jICAkKElOQ0wpCityZWdleHAubzoJcmVnZXhwLmMgICQoSU5DTCkKK3NjcmVlbi5vOglzY3JlZW4uYyAgJChJTkNMKQorc2VhcmNoLm86CXNlYXJjaC5jICAkKElOQ0wpCitzeW50YXgubzoJc3ludGF4LmMgICQoSU5DTCkKK3RhZy5vOgkJdGFnLmMgICQoSU5DTCkKK3Rlcm0ubzoJCXRlcm0uYyAgJChJTkNMKQordWkubzoJCXVpLmMgICQoSU5DTCkKK3VuZG8ubzoJCXVuZG8uYyAgJChJTkNMKQord2luZG93Lm86CXdpbmRvdy5jICAkKElOQ0wpCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9yby5tYWsgYi9zcmMvTWFrZV9yby5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjMmY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWtlX3JvLm1hawpAQCAtMCwwICsxLDE2OCBAQAorIworIyBNYWtlZmlsZSBmb3IgVmltIG9uIFJJU0MgT1MgLSBBbmR5IFdpbmdhdGUKKyMKKworR0NDCSAgICA9IGdjYyAtbXRocm93YmFjaworQ0ZMQUdTCSAgID0gLURSSVNDT1MgLURGRUFUX0dVSQorIyBPcHRpbWlzaW5nIG9uIGV4X2RvY21kLmMgc2VlbXMgdG8gY2F1c2Ugc2VnZmF1bHRzIG9uIGNvbXBpbGF0aW9uLiBOZWVkcyBpbnZlc3RpZ2F0aW9uLgorQ0NFWF9ET0NNRCA9ICQoR0NDKSAkKENGTEFHUykKK0NDCSAgID0gJChHQ0MpICQoQ0ZMQUdTKSAtTzIKKyMgLURVUF9CQ19QQ19FWFRFUk4gZm9yIHRlcm0uYyBuZWVkZWQgYXMgQkMgZGVmaW5lZCBpbiB0ZXJtbGliLmMgYW5kIHRlcm0uYworCitURVJNRkxBRyAgID0gLURVUF9CQ19QQ19FWFRFUk4KKworQVNNRkxBR1MgICA9IC10aHJvd2JhY2sgLW9iamFzbSAtZ2NjCisKK09CSlMgPSAgby5idWZmZXIgby5jaGFyc2V0IG8uZGlncmFwaCBvLmVkaXQgby5ldmFsIG8uZXhfY21kcyBvLmV4X2NtZHMyIG8uZGlmZiBcCisJby5leF9kb2NtZCBvLmV4X2V2YWwgby5leF9nZXRsbiBvLmZpbGVpbyBvLmZvbGQgby5nZXRjaGFyIG8ubWFpbiBvLm1hcmsgby5tYnl0ZSAgXAorCW8ubWVtZmlsZSBvLm1lbWxpbmUgby5tZW51IG8ubWVzc2FnZSBvLm1pc2MxIG8ubWlzYzIgby5tb3ZlICAgICBcCisJby5ub3JtYWwgby5vcHMgby5vcHRpb24gby5xdWlja2ZpeCBvLnJlZ2V4cCBvLnNjcmVlbiBvLnNlYXJjaCAgIFwKKwlvLnN5bnRheCBvLnRhZyBvLnRlcm0gby50ZXJtbGliIG8udWkgby51bmRvIG8udmVyc2lvbiBvLndpbmRvdyAgXAorCW8ub3NfcmlzY29zIG8uc3dpcyBvLmd1aSBvLmd1aV9yaXNjb3MKKworVmltOiAkKE9CSlMpCisJJChHQ0MpIC1vIFZpbSAkKE9CSlMpCisKK2luc3RhbGw6IFZpbQorCXNxdWVlemUgLXYgVmltIEAuIVZpbS5WaW0KKworY2xlYW46CisJY3JlYXRlIG8uIWZha2UhIDAKKwl3aXBlIG8uKiB+Y2YKKwlyZW1vdmUgVmltCisKK28uc3dpczogcy5zd2lzCisJYXMgJChBU01GTEFHUykgLW8gby5zd2lzIHMuc3dpcworCisjIFJ1bGVzIGZvciBvYmplY3QgZmlsZXMKKyMgWW91IHNob3VsZG4ndCBuZWVkIHRvIHB1dCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBpbiBhcyBhbGwgYnV0IHRlcm0uYyBoYXZlIHRoZSBzYW1lCisjIHJ1bGUgKGFuZCBvbmx5IHRoZW4gdG8gc2F2ZSBleHRyYSBkZWZpbmVzKSBidXQgc29tZSB2ZXJzaW9ucyBvZiBtYWtlIGFyZSBhd2t3YXJkLgorCitvLmJ1ZmZlcjoJYy5idWZmZXIKKwkkKENDKSAtYyBjLmJ1ZmZlciAtbyBvLmJ1ZmZlcgorCitvLmNoYXJzZXQ6CWMuY2hhcnNldAorCSQoQ0MpIC1jIGMuY2hhcnNldCAtbyBvLmNoYXJzZXQKKworby5kaWdyYXBoOgljLmRpZ3JhcGgKKwkkKENDKSAtYyBjLmRpZ3JhcGggLW8gby5kaWdyYXBoCisKK28uZGlmZjoJCWMuZGlmZgorCSQoQ0MpIC1jIGMuZGlmZiAtbyBvLmRpZmYKKworby5lZGl0OgkJYy5lZGl0CisJJChDQykgLWMgYy5lZGl0IC1vIG8uZWRpdAorCitvLmV2YWw6CQljLmV2YWwKKwkkKENDKSAtYyBjLmV2YWwgLW8gby5ldmFsCisKK28uZXhfY21kczoJYy5leF9jbWRzCisJJChDQykgLWMgYy5leF9jbWRzIC1vIG8uZXhfY21kcworCitvLmV4X2NtZHMyOgljLmV4X2NtZHMyCisJJChDQykgLWMgYy5leF9jbWRzMiAtbyBvLmV4X2NtZHMyCisKK28uZXhfZG9jbWQ6CWMuZXhfZG9jbWQKKwkkKENDRVhfRE9DTUQpIC1jIGMuZXhfZG9jbWQgLW8gby5leF9kb2NtZAorCitvLmV4X2V2YWw6CWMuZXhfZXZhbAorCSQoQ0NFWF9ET0NNRCkgLWMgYy5leF9ldmFsIC1vIG8uZXhfZXZhbAorCitvLmV4X2dldGxuOgljLmV4X2dldGxuCisJJChDQykgLWMgYy5leF9nZXRsbiAtbyBvLmV4X2dldGxuCisKK28uZmlsZWlvOgljLmZpbGVpbworCSQoQ0MpIC1jIGMuZmlsZWlvIC1vIG8uZmlsZWlvCisKK28uZm9sZDoJCWMuZm9sZAorCSQoQ0MpIC1jIGMuZm9sZCAtbyBvLmZvbGQKKworby5nZXRjaGFyOgljLmdldGNoYXIKKwkkKENDKSAtYyBjLmdldGNoYXIgLW8gby5nZXRjaGFyCisKK28uZ3VpOgkJYy5ndWkKKwkkKENDKSAtYyBjLmd1aSAtbyBvLmd1aQorCitvLmd1aV9yaXNjb3M6CWMuZ3VpX3Jpc2NvcworCSQoQ0MpIC1jIGMuZ3VpX3Jpc2NvcyAtbyBvLmd1aV9yaXNjb3MKKworby5tYWluOgkJYy5tYWluCisJJChDQykgLWMgYy5tYWluIC1vIG8ubWFpbgorCitvLm1hcms6CQljLm1hcmsKKwkkKENDKSAtYyBjLm1hcmsgLW8gby5tYXJrCisKK28ubWJ5dGU6CWMubWJ5dGUKKwkkKENDKSAtYyBjLm1ieXRlIC1vIG8ubWJ5dGUKKworby5tZW1maWxlOgljLm1lbWZpbGUKKwkkKENDKSAtYyBjLm1lbWZpbGUgLW8gby5tZW1maWxlCisKK28ubWVtbGluZToJYy5tZW1saW5lCisJJChDQykgLWMgYy5tZW1saW5lIC1vIG8ubWVtbGluZQorCitvLm1lbnU6CQljLm1lbnUKKwkkKENDKSAtYyBjLm1lbnUgLW8gby5tZW51CisKK28ubWVzc2FnZToJYy5tZXNzYWdlCisJJChDQykgLWMgYy5tZXNzYWdlIC1vIG8ubWVzc2FnZQorCitvLm1pc2MxOgljLm1pc2MxCisJJChDQykgLWMgYy5taXNjMSAtbyBvLm1pc2MxCisKK28ubWlzYzI6CWMubWlzYzIKKwkkKENDKSAtYyBjLm1pc2MyIC1vIG8ubWlzYzIKKworby5tb3ZlOgkJYy5tb3ZlCisJJChDQykgLWMgYy5tb3ZlIC1vIG8ubW92ZQorCitvLm5vcm1hbDoJYy5ub3JtYWwKKwkkKENDKSAtYyBjLm5vcm1hbCAtbyBvLm5vcm1hbAorCitvLm9wczoJCWMub3BzCisJJChDQykgLWMgYy5vcHMgLW8gby5vcHMKKworby5vcHRpb246CWMub3B0aW9uCisJJChDQykgLWMgYy5vcHRpb24gLW8gby5vcHRpb24KKworby5vc19yaXNjb3M6CWMub3NfcmlzY29zCisJJChDQykgLWMgYy5vc19yaXNjb3MgLW8gby5vc19yaXNjb3MKKworby5wdHk6CQljLnB0eQorCSQoQ0MpIC1jIGMucHR5IC1vIHAucHR5CisKK28ucXVpY2tmaXg6CWMucXVpY2tmaXgKKwkkKENDKSAtYyBjLnF1aWNrZml4IC1vIG8ucXVpY2tmaXgKKworby5yZWdleHA6CWMucmVnZXhwCisJJChDQykgLWMgYy5yZWdleHAgLW8gby5yZWdleHAKKworby5zY3JlZW46CWMuc2NyZWVuCisJJChDQykgLWMgYy5zY3JlZW4gLW8gby5zY3JlZW4KKworby5zZWFyY2g6CWMuc2VhcmNoCisJJChDQykgLWMgYy5zZWFyY2ggLW8gby5zZWFyY2gKKworby5zeW50YXg6CWMuc3ludGF4CisJJChDQykgLWMgYy5zeW50YXggLW8gby5zeW50YXgKKworby50YWc6CQljLnRhZworCSQoQ0MpIC1jIGMudGFnIC1vIG8udGFnCisKK28udGVybToJCWMudGVybQorCSQoQ0MpICQoVEVSTUZMQUcpIC1jIGMudGVybSAtbyBvLnRlcm0KKworby50ZXJtbGliOgljLnRlcm1saWIKKwkkKENDKSAtYyBjLnRlcm1saWIgLW8gby50ZXJtbGliCisKK28udWk6CQljLnVpCisJJChDQykgLWMgYy51aSAtbyBvLnVpCisKK28udW5kbzoJCWMudW5kbworCSQoQ0MpIC1jIGMudW5kbyAtbyBvLnVuZG8KKworby52ZXJzaW9uOgljLnZlcnNpb24KKwkkKENDKSAtYyBjLnZlcnNpb24gLW8gby52ZXJzaW9uCisKK28ud2luZG93OgljLndpbmRvdworCSQoQ0MpIC1jIGMud2luZG93IC1vIG8ud2luZG93CmRpZmYgLS1naXQgYS9zcmMvTWFrZV9zYXMubWFrIGIvc3JjL01ha2Vfc2FzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc5MDNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2Vfc2FzLm1hawpAQCAtMCwwICsxLDM0NSBAQAorIyB2aW06IHNldCBmdD1tYWtlIDoKKyMgTWFrZWZpbGUgZm9yIFZJTSBvbiB0aGUgQW1pZ2EsIHVzaW5nIFNBUy9MYXR0aWNlIEMgNi4wIHRvIDYuNTgKKyMKKyMgRG8gTk9UIHVzZSB0aGUgcGVlcGhvbGUgb3B0aW1pemVyIHdpdGggYSB2ZXJzaW9uIGJlZm9yZSA2LjU2IQorIyBJdCBtZXNzZXMgdXAgYWxsIGtpbmRzIG9mIHRoaW5nczoKKyMgRm9yIDYuMCBhbmQgNi4xLCBleHBhbmRfZW52KCkgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuCisjIEZvciA2LjIgYW5kIDYuMyB0aGUgY2FsbCB0byBmcmVlX2xpbmUgaW4gdV9mcmVlZW50cnkgaXMgd3JvbmcuCisjIFRoZSAicmVhZC5tZSIgZmlsZSBmb3IgdmVyc2lvbiA2LjU2IGluY2x1ZGVzIGEgcmVtYXJrIGFib3V0IGEgZml4IGZvciB0aGUKKyMgcGVlcGhvbGUgb3B0aW1pemVyLiAgRXZlcnl0aGluZyBiZWZvcmUgNi41NiB3aWxsIHByb2JhYmx5IGZhaWwuCisjCisjIFlvdSBzaG91bGQgdXNlIE1hbnggQXp0ZWMgQyB3aGVuZXZlciBwb3NzaWJsZSwgYmVjYXVzZSBpdCBoYXMgYmVlbiB0ZXN0ZWQuCisjCisjIFRoZSBwcm90b3R5cGVzIGZyb20gTWFueCBhbmQgU0FTIGFyZSBpbmNvbXBhdGlibGUuIElmIHRoZSBwcm90b3R5cGVzCisjIHdlcmUgZ2VuZXJhdGVkIGJ5IE1hbngsIGZpcnN0IGRvICJ0b3VjaCAqLmM7IG1ha2UgcHJvdG8iIGJlZm9yZSAibWFrZSIuCisjIFRoZSBwcm90b3R5cGVzIGdlbmVyYXRlZCBvbiBVbml4IHdvcmsgZm9yIGJvdGguCisjCisjIE5vdGU6IE5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC4gVGhpcyB3YXMgZG9uZSB0byBhdm9pZCBoYXZpbmcKKyMgICAgICAgdG8gY29tcGlsZSBldmVyeXRoaW5nIHdoZW4gYSBnbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24gaXMgYWRkZWQuCisKKyM+Pj4+PiBjaG9vc2Ugb3B0aW9uczoKKworIyMjIFNlZSBmZWF0dXJlLmggZm9yIGEgbGlzdCBvZiBvcHRpb25hbHMuCisjIyMgQW55IG90aGVyIGRlZmluZXMgY2FuIGJlIGluY2x1ZGVkIGhlcmUuCisKKyMgTk9fQVJQCURvbid0IGluY2x1ZGUgQVJQIGZ1bmN0aW9ucworIyBTQVNDPTY1OAlTYXMvQyB2ZXJzaW9uIG51bWJlcgorIyBORVdTQVNDCWZpeGVzIGEgYnVnIGluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nPworREVGSU5FUyA9IERFRj1OT19BUlAgREVGPU5FV1NBU0MgREVGPSJTQVNDPTY1OCIKKworIz4+Pj4+IGlmIEhBVkVfVEdFVEVOVCBpcyBkZWZpbmVkIHRlcm1saWIubyBoYXMgdG8gYmUgdXNlZAorI1RFUk1MSUIgPSB0ZXJtbGliLm8KK1RFUk1MSUIgPQorCisjPj4+Pj4gY2hvb3NlIE5PREVCVUcgZm9yIG5vcm1hbCBjb21waWxpbmcsIHRoZSBvdGhlciBmb3IgZGVidWdnaW5nIGFuZAorIyBwcm9maWxpbmcKKyMgZG9uJ3Qgc3dpdGNoIG9uIGRlYnVnZ2luZyB3aGVuIGdlbmVyYXRpbmcgcHJvdG8gZmlsZXMsIGl0IGNyYXNoZXMgdGhlCisjIGNvbXBpbGVyLgorREJHID0gTk9ERUJVRworI0RCRyA9IERCRz1TRgorCisjPj4+Pj4gY2hvb3NlIE5PT1BUUEVFUCBmb3IgNi4wIHRvIDYuMywgTk9PUFQgZm9yIGRlYnVnZ2luZworIyB3aXRoIHZlcnNpb24gNi41NiBhbmQgbGF0ZXIgeW91IGNhbiBwcm9iYWJseSB1c2UgT1BUCitPUFRJTUlaRSAgPSBPUFQKKyNPUFRJTUlaRSA9IE5PT1BUUEVFUAorI09QVElNSVpFID0gTk9PUFQKKworIyBmb3IgNi41OCB5b3UgY2FuIHVzZSB0aGUgbGluZSBiZWxvdywgYnV0IGJlIHdhcm5lZCBpdCB0YWtlcyBhIGxvb29vbm5uZ2dnIHRpbWUKKyNPUFRJTUlaRT1PUFQgIE9QVElNSVpFUlNDSEVEVUxFUiBPUFRJTUlaRVJUSU1FIE5vT1BUSU1JWkVSQUxJQVMgXAorCU9wdGltaXplckNvbXBsZXhpdHk9MTAgT3B0aW1pemVyRGVwdGg9MTAgT3B0aW1pemVyUmVjdXJEZXB0aD0xMCBcCisJT3B0aW1pemVySW5Mb2NhbCBPUFRQRUVQCisKKyNnZW5lcmF0ZSBjb2RlIGZvciB5b3VyIHByb2Nlc3NvciAtIDY4MDYwIHdpbGwgd29yayBmb3IgMDQwJ3MgYXMgd2VsbC4KK0NQVT02ODAwMAorI0NQVT02ODAyMAorI0NQVT02ODAzMAorI0NQVT02ODA0MAorI0NQVT02ODA2MAorCisjRXJyb3IgcmVwb3J0aW5nIC0gcmV4eCBvciBjb25zb2xlCitFUlJPUiA9IEVSUk9SQ09OU09MRSBFUlJPUlNPVVJDRSBFUlJPUkhJR0hMSUdIVAorI0VSUk9SID0gRVJST1JSRVhYIEVSUk9SQ09OU09MRSBFUlJPUlNPVVJDRSBFUlJPUkhJR0hMSUdIVAorCisjbWVtb3J5IHR5cGVzLCBpZiB5b3UgaGF2ZSBmYXN0IHVzZSBpdCA6LT4sCisjCUFOWSA9IHdpbGwgd29yayBvbiBhbGwgbWFjaGluZXMKKyMJRkFTVCA9IHRoaXMgaXMgdGhlIGJlc3Qgb3B0aW9uLCBmb3Igc3BlZWQKKyNNRU1PUllUWVBFPUZBU1QKK01FTU9SWVRZUEU9QU5ZCisKKyNNRU1TSVpFIC0gdGhpcyBpcyBmb3IgY29tcGlsZSB0aW1lIG9ubHkgZm9yIHNwZWVkIG9mIGNvbXBpbGF0aW9uCisjTUVNU0laRT1IVUdFCitNRU1TSVpFPUxBUkdFCisjTUVNU0laRT1TTUFMTAorCisjPj4+Pj4gZW5kIG9mIGNob2ljZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDQwk9IHNjCitHU1QJPSB2aW0uZ3N0CitDT1BUUwk9IFNJTlQgU0NPREUgU0RBVEEKK1NIRUxMCT0gY3NoCitERUwJPSAkKFNIRUxMKSAtYyBybSAtZgorCisjIGlnbm9yZSBlcnJvciBtZXNzYWdlcyBmb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIHRoZXkgYXJlIG1vc3RseSBub3QgY29ycmVjdAorQ0ZMQUdTICA9IE5PTElOSyAkKERCRykgQ1BVPSQoQ1BVKSBOT1NUQUNLQ0hFQ0sgREVGPUFNSUdBIENPREU9RkFSIGlkaXI9cHJvdG8gaWdub3JlPTMxNworQ0ZMQUdTMiA9ICQoT1BUSU1JWkUpICQoRVJST1IpIEdTVElNTUVESUFURSBHU1Q9JChHU1QpCitDRkxBR1MzID0gJChDT1BUUykgU1RSSU5HTUVSR0UgTUVNU0laRT0kKE1FTVNJWkUpCitDRkxBR1M0ID0gJChERUZJTkVTKSBEQVRBTUVNT1JZPSQoTUVNT1JZVFlQRSkKKworUFJPUFQgPSBERUY9UFJPVE8gR1BST1RPIEdQUEFSTSBNQVhJTVVNRVJST1JTPTk5OSBHRU5QUk9UT1NUQVRJQ1MgR0VOUFJPVE9QQVJBTUVURVJTCisKK1NSQyA9IFwKKwlidWZmZXIuYyBcCisJY2hhcnNldC5jIFwKKwlkaWZmLmMgXAorCWRpZ3JhcGguYyBcCisJZWRpdC5jIFwKKwlldmFsLmMgXAorCWV4X2NtZHMuYyBcCisJZXhfY21kczIuYyBcCisJZXhfZG9jbWQuYyBcCisJZXhfZXZhbC5jIFwKKwlleF9nZXRsbi5jIFwKKwlmaWxlaW8uYyBcCisJZm9sZC5jIFwKKwlnZXRjaGFyLmMgXAorCW1haW4uYyBcCisJbWFyay5jIFwKKwltZW1maWxlLmMgXAorCW1lbWxpbmUuYyBcCisJbWVudS5jIFwKKwltZXNzYWdlLmMgXAorCW1pc2MxLmMgXAorCW1pc2MyLmMgXAorCW1vdmUuYyBcCisJbWJ5dGUuYyBcCisJbm9ybWFsLmMgXAorCW9wcy5jIFwKKwlvcHRpb24uYyBcCisJb3NfYW1pZ2EuYyBcCisJcXVpY2tmaXguYyBcCisJcmVnZXhwLmMgXAorCXNjcmVlbi5jIFwKKwlzZWFyY2guYyBcCisJc3ludGF4LmMgXAorCXRhZy5jIFwKKwl0ZXJtLmMgXAorCXVpLmMgXAorCXVuZG8uYyBcCisJd2luZG93LmMgXAorCXZlcnNpb24uYworCitPQkogPSBcCisJYnVmZmVyLm8gXAorCWNoYXJzZXQubyBcCisJZGlmZi5vIFwKKwlkaWdyYXBoLm8gXAorCWVkaXQubyBcCisJZXZhbC5vIFwKKwlleF9jbWRzLm8gXAorCWV4X2NtZHMyLm8gXAorCWV4X2RvY21kLm8gXAorCWV4X2V2YWwubyBcCisJZXhfZ2V0bG4ubyBcCisJZmlsZWlvLm8gXAorCWZvbGQubyBcCisJZ2V0Y2hhci5vIFwKKwltYWluLm8gXAorCW1hcmsubyBcCisJbWVtZmlsZS5vIFwKKwltZW1saW5lLm8gXAorCW1lbnUubyBcCisJbWVzc2FnZS5vIFwKKwltaXNjMS5vIFwKKwltaXNjMi5vIFwKKwltb3ZlLm8gXAorCW1ieXRlLm8gXAorCW5vcm1hbC5vIFwKKwlvcHMubyBcCisJb3B0aW9uLm8gXAorCW9zX2FtaWdhLm8gXAorCXF1aWNrZml4Lm8gXAorCXJlZ2V4cC5vIFwKKwlzY3JlZW4ubyBcCisJc2VhcmNoLm8gXAorCXN5bnRheC5vIFwKKwl0YWcubyBcCisJdGVybS5vIFwKKwl1aS5vIFwKKwl1bmRvLm8gXAorCXdpbmRvdy5vIFwKKwkkKFRFUk1MSUIpCisKK1BSTyA9IFwKKwlwcm90by9idWZmZXIucHJvIFwKKwlwcm90by9jaGFyc2V0LnBybyBcCisJcHJvdG8vZGlmZi5wcm8gXAorCXByb3RvL2RpZ3JhcGgucHJvIFwKKwlwcm90by9lZGl0LnBybyBcCisJcHJvdG8vZXZhbC5wcm8gXAorCXByb3RvL2V4X2NtZHMucHJvIFwKKwlwcm90by9leF9jbWRzMi5wcm8gXAorCXByb3RvL2V4X2RvY21kLnBybyBcCisJcHJvdG8vZXhfZXZhbC5wcm8gXAorCXByb3RvL2V4X2dldGxuLnBybyBcCisJcHJvdG8vZmlsZWlvLnBybyBcCisJcHJvdG8vZm9sZC5wcm8gXAorCXByb3RvL2dldGNoYXIucHJvIFwKKwlwcm90by9tYWluLnBybyBcCisJcHJvdG8vbWFyay5wcm8gXAorCXByb3RvL21lbWZpbGUucHJvIFwKKwlwcm90by9tZW1saW5lLnBybyBcCisJcHJvdG8vbWVudS5wcm8gXAorCXByb3RvL21lc3NhZ2UucHJvIFwKKwlwcm90by9taXNjMS5wcm8gXAorCXByb3RvL21pc2MyLnBybyBcCisJcHJvdG8vbW92ZS5wcm8gXAorCXByb3RvL21ieXRlLnBybyBcCisJcHJvdG8vbm9ybWFsLnBybyBcCisJcHJvdG8vb3BzLnBybyBcCisJcHJvdG8vb3B0aW9uLnBybyBcCisJcHJvdG8vb3NfYW1pZ2EucHJvIFwKKwlwcm90by9xdWlja2ZpeC5wcm8gXAorCXByb3RvL3JlZ2V4cC5wcm8gXAorCXByb3RvL3NjcmVlbi5wcm8gXAorCXByb3RvL3NlYXJjaC5wcm8gXAorCXByb3RvL3N5bnRheC5wcm8gXAorCXByb3RvL3RhZy5wcm8gXAorCXByb3RvL3Rlcm0ucHJvIFwKKwlwcm90by90ZXJtbGliLnBybyBcCisJcHJvdG8vdWkucHJvIFwKKwlwcm90by91bmRvLnBybyBcCisJcHJvdG8vd2luZG93LnBybworCithbGw6IHByb3RvIFZpbQorCitWaW06IHNjb3B0aW9ucyAkKE9CSikgdmVyc2lvbi5jIHZlcnNpb24uaAorCSQoQ0MpICQoQ0ZMQUdTKSB2ZXJzaW9uLmMKKwkkKENDKSBMSU5LICQoQ09QVFMpICQoT0JKKSB2ZXJzaW9uLm8gJChEQkcpIFBOQU1FPVZpbQorCitkZWJ1Zzogc2NvcHRpb25zICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCisJJChDQykgJChDRkxBR1MpIHZlcnNpb24uYworCSQoQ0MpIExJTksgJChDT1BUUykgJChPQkopIHZlcnNpb24ubyAkKERCRykgUE5BTUU9VmltCisKK3Byb3RvOiAkKEdTVCkgJChQUk8pCisKK3RhZ3M6CisJc3BhdCBjdGFncyAkKFNSQykgKi5oCisjCWNzaCAtYyBjdGFncyAkKFNSQykgKi5oCisKKyMgY2FuJ3QgdXNlIGRlbGV0ZSBoZXJlLCB0b28gbWFueSBmaWxlIG5hbWVzCitjbGVhbjoKKwkkKERFTCkgKi5vIFZpbSAkKEdTVCkKKworIyBnZW5lcmF0ZSBHbG9iYWxTeW1ib2xUYWJsZSwgd2hpY2ggc3BlZWRzIHVwIHRoZSBjb21waWxlIHRpbWUuCisjCisjIEEgcHJlcHJvY2Vzc2luZyBzdGFnZSBpcyB1c2VkIHRvIHdvcmsgYXJvdW5kYSBidWcgaW4gdGhlIEdTVCBnZW5lcmF0b3IsIGluCisjIHRoYXQgaXQgZG9lcyBub3QgaGFuZGxlIG5lc3RlZCBtYWtlZmlsZXMgcHJvcGVybHkgaW4gdGhpcyBzdGFnZS4KKyMgSWdub3JlIGVycm9yIG1lc3NhZ2UgZm9yIG5vdCBwcm9kdWNpbmcgYW55IGNvZGUgKDEwNSkuCiskKEdTVCk6IHNjb3B0aW9ucyB2aW0uaCBrZXltYXAuaCBtYWNyb3MuaCBhc2NpaS5oIHRlcm0uaCBzdHJ1Y3RzLmgKKwkkKENDKSAkKENGTEFHUykgUFJFUFJPQ0VTU09ST05MWSB2aW0uaCBvYmplY3RuYW1lIHByZS5oCisJJChDQykgTUdTVD0kKEdTVCkgcHJlLmggaWdub3JlPTEwNQorCSQoREVMKSBwcmUuaAorCisjIGdlbmVyYXRlIGFuIG9wdGlvbnMgZmlsZSwgYmVjYXVzZSBTQVMvQyBzbWFrZSBjYW4ndCBoYW5kbGUgdGhlIGFtaWdhIGNvbW1hbmQKKyMgbGluZSBjYW4gaGFuZGxlIHRoZSBsZW5ndGhzIHRoYXQgdGhpcyBtYWtlZmlsZSB3aWxsIGltcG9zZSBvbiB0aGUgc2hlbGwuCisjIChNYW54J3MgbWFrZSBjYW4gZG8gdGhpcykuCitzY29wdGlvbnM6IE1ha2Vfc2FzLm1haworCUBlY2hvICJHZW5lcmF0aW5nIC0gJEAgLi4uIgorCUBlY2hvICQoQ0ZMQUdTKSA+IHNjb3B0aW9ucworCUBlY2hvICQoQ0ZMQUdTMSkgPj4gc2NvcHRpb25zCisJQGVjaG8gJChDRkxBR1MyKSA+PiBzY29wdGlvbnMKKwlAZWNobyAkKENGTEFHUzMpID4+IHNjb3B0aW9ucworCUBlY2hvICQoQ0ZMQUdTNCkgPj4gc2NvcHRpb25zCisJQGVjaG8gJChDT1BUUykgPj5zY29wdGlvbnMKKwlAZWNobyBkb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskKE9CSik6ICQoR1NUKSB2aW0uaAorJChQUk8pOiAkKEdTVCkgdmltLmgKKworLmMubzoKKwkkKENDKSAkKENGTEFHUykgJCouYworCisuYy5wcm86CisJJChDQykgJChDRkxBR1MpIEdQRklMRT1wcm90by8kKi5wcm8gJChQUk9QVCkgJCouYworCisjIGRlcGVuZGFuY2llcworYnVmZmVyLm86CQlidWZmZXIuYworcHJvdG8vYnVmZmVyLnBybzoJYnVmZmVyLmMKK2NoYXJzZXQubzoJCWNoYXJzZXQuYworcHJvdG8vY2hhcnNldC5wcm86CWNoYXJzZXQuYworZGlmZi5vOgkJCWRpZmYuYworcHJvdG8vZGlmZi5wcm86CQlkaWZmLmMKK2RpZ3JhcGgubzoJCWRpZ3JhcGguYworcHJvdG8vZGlncmFwaC5wcm86CWRpZ3JhcGguYworZWRpdC5vOgkJCWVkaXQuYworcHJvdG8vZWRpdC5wcm86CQllZGl0LmMKK2V2YWwubzoJCQlldmFsLmMKK3Byb3RvL2V2YWwucHJvOgkJZXZhbC5jCitleF9jbWRzLm86CQlleF9jbWRzLmMKK3Byb3RvL2V4X2NtZHMucHJvOglleF9jbWRzLmMKK2V4X2NtZHMyLm86CQlleF9jbWRzMi5jCitwcm90by9leF9jbWRzMi5wcm86CWV4X2NtZHMyLmMKK2V4X2RvY21kLm86CQlleF9kb2NtZC5jIGV4X2NtZHMuaAorcHJvdG8vZXhfZG9jbWQucHJvOglleF9kb2NtZC5jIGV4X2NtZHMuaAorZXhfZXZhbC5vOgkJZXhfZXZhbC5jIGV4X2NtZHMuaAorcHJvdG8vZXhfZXZhbC5wcm86CWV4X2V2YWwuYyBleF9jbWRzLmgKK2V4X2dldGxuLm86CQlleF9nZXRsbi5jCitwcm90by9leF9nZXRsbi5wcm86CWV4X2dldGxuLmMKK2ZpbGVpby5vOgkJZmlsZWlvLmMKK3Byb3RvL2ZpbGVpby5wcm86CWZpbGVpby5jCitmb2xkLm86CQkJZm9sZC5jCitwcm90by9mb2xkLnBybzoJCWZvbGQuYworZ2V0Y2hhci5vOgkJZ2V0Y2hhci5jCitwcm90by9nZXRjaGFyLnBybzoJZ2V0Y2hhci5jCittYWluLm86CQkJbWFpbi5jCitwcm90by9tYWluLnBybzoJCW1haW4uYworbWFyay5vOgkJCW1hcmsuYworcHJvdG8vbWFyay5wcm86CQltYXJrLmMKK21lbWZpbGUubzoJCW1lbWZpbGUuYworcHJvdG8vbWVtZmlsZS5wcm86CW1lbWZpbGUuYworbWVtbGluZS5vOgkJbWVtbGluZS5jCitwcm90by9tZW1saW5lLnBybzoJbWVtbGluZS5jCittZW51Lm86CQkJbWVudS5jCitwcm90by9tZW51LnBybzoJCW1lbnUuYworbWVzc2FnZS5vOgkJbWVzc2FnZS5jCitwcm90by9tZXNzYWdlLnBybzoJbWVzc2FnZS5jCittaXNjMS5vOgkJbWlzYzEuYworcHJvdG8vbWlzYzEucHJvOgltaXNjMS5jCittaXNjMi5vOgkJbWlzYzIuYworcHJvdG8vbWlzYzIucHJvOgltaXNjMi5jCittb3ZlLm86CQkJbW92ZS5jCitwcm90by9tb3ZlLnBybzoJCW1vdmUuYworbWJ5dGUubzoJCW1ieXRlLmMKK3Byb3RvL21ieXRlLnBybzoJbWJ5dGUuYworbm9ybWFsLm86CQlub3JtYWwuYworcHJvdG8vbm9ybWFsLnBybzoJbm9ybWFsLmMKK29wcy5vOgkJCW9wcy5jCitwcm90by9vcHMucHJvOgkJb3BzLmMKK29wdGlvbi5vOgkJb3B0aW9uLmMKK3Byb3RvL29wdGlvbi5wcm86CW9wdGlvbi5jCitvc19hbWlnYS5vOgkJb3NfYW1pZ2EuYworcHJvdG8vb3NfYW1pZ2EucHJvOglvc19hbWlnYS5jCitxdWlja2ZpeC5vOgkJcXVpY2tmaXguYworcHJvdG8vcXVpY2tmaXgucHJvOglxdWlja2ZpeC5jCityZWdleHAubzoJCXJlZ2V4cC5jCitwcm90by9yZWdleHAucHJvOglyZWdleHAuYworc2NyZWVuLm86CQlzY3JlZW4uYworcHJvdG8vc2NyZWVuLnBybzoJc2NyZWVuLmMKK3NlYXJjaC5vOgkJc2VhcmNoLmMKK3Byb3RvL3NlYXJjaC5wcm86CXNlYXJjaC5jCitzeW50YXgubzoJCXN5bnRheC5jCitwcm90by9zeW50YXgucHJvOglzeW50YXguYwordGFnLm86CQkJdGFnLmMKK3Byb3RvL3RhZy5wcm86CQl0YWcuYwordGVybS5vOgkJCXRlcm0uYworcHJvdG8vdGVybS5wcm86CQl0ZXJtLmMKK3Rlcm1saWIubzoJCXRlcm1saWIuYworcHJvdG8vdGVybWxpYi5wcm86CXRlcm1saWIuYwordWkubzoJCQl1aS5jCitwcm90by91aS5wcm86CQl1aS5jCit1bmRvLm86CQkJdW5kby5jCitwcm90by91bmRvLnBybzoJCXVuZG8uYword2luZG93Lm86CQl3aW5kb3cuYwpkaWZmIC0tZ2l0IGEvc3JjL01ha2Vfdm1zLm1tcyBiL3NyYy9NYWtlX3Ztcy5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjZTkzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWtlX3Ztcy5tbXMKQEAgLTAsMCArMSw0NTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFZpbSBvbiBPcGVuVk1TCisjCisjIE1haW50YWluZXI6ICAgWm9sdGFuIEFycGFkZmZ5IDxhcnBhZGZmeUBwb2xhcmhvbWUuY29tPgorIyBMYXN0IGNoYW5nZTogIDIwMDQgTWF5IDA0CisjCisjIFRoaXMgaGFzIHNjcmlwdCBiZWVuIHRlc3RlZCBvbiBWTVMgNi4yIHRvIDcuMyBvbiBERUMgQWxwaGEgYW5kIFZBWAorIyB3aXRoIE1NUyBhbmQgTU1LCisjCisjIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgYnVpbHQ6CisjCXZpbS5leGU6CXN0YW5kYXJkICh0ZXJtaW5hbCwgR1VJL01vdGlmLCBHVUkvR1RLKQorIwlkdmltLmV4ZToJZGVidWcKKyMKKyMgRWRpdCB0aGUgbGluZXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBiZWxvdyBmb3IgZmluZSB0dW5pbmcuCisjCisjIFRvIGJ1aWxkOiAgICBtbXMvZGVzY3JpcD1NYWtlX3Ztcy5tbXMKKyMgVG8gY2xlYW4gdXA6IG1tcy9kZXNjcmlwPU1ha2Vfdm1zLm1tcyBjbGVhbgorIworIyBIaW50cyBhbmQgZGV0YWlsZWQgZGVzY3JpcHRpb24gY291bGQgYmUgZm91bmQgaW4gSU5TVEFMTFZNUy5UWFQgZmlsZS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQbGF0Zm9ybSBzZWxlY3Rpb24KKyMgRGVmaW5lIHRoaXMgaWYgeW91IHdpbGwgdXNlIHRoZSBWQVggcGxhdGZvcm0gdG8gYnVpbGQuCisjIFZBWCA9IFlFUworCisjIFZNUyB2ZXJzaW9uCisjIFVuY29tbWVudCBpZiB5b3UgdXNlIFZNUyB2ZXJzaW9uIDYuMiBvciBvbGRlcgorIyBPTERfVk1TID0gWUVTCisKKyMgQ29tcGlsZXIgc2VsZWN0aW9uLgorIyBDb21tZW50IG91dCBpZiB5b3UgdXNlIHRoZSBWQVhDIGNvbXBpbGVyCitERUNDID0gWUVTCisKKyMgQnVpbGQgbW9kZWwgc2VsZWN0aW9uCisjIFRJTlkgICAtIEFsbW9zdCBubyBmZWF0dXJlcyBlbmFibGVkLCBub3QgZXZlbiBtdWx0aXBsZSB3aW5kb3dzCisjIFNNQUxMICAtIEZldyBmZWF0dXJlcyBlbmFibGVkLCBhcyBiYXNpYyBhcyBwb3NzaWJsZQorIyBOT1JNQUwgLSBBIGRlZmF1bHQgc2VsZWN0aW9uIG9mIGZlYXR1cmVzIGVuYWJsZWQKKyMgQklHICAgIC0gTWFueSBmZWF0dXJlcyBlbmFibGVkLCBhcyByaWNoIGFzIHBvc3NpYmxlLiAoZGVmYXVsdCkKKyMgSFVHRSAgIC0gQWxsIHBvc3NpYmxlIGZlYXR1ZXMgZW5hYmxlZC4KKyMgUGxlYXNlIHNlbGVjdCBvbmUgb2YgdGhlc2UgYWx0ZXJuYXRpdmVzIGFib3ZlLgorTU9ERUwgPSBCSUcKKworIyBHVUkgb3IgdGVybWluYWwgbW9kZSBleGVjdXRhYmxlLgorIyBDb21tZW50IG91dCBpZiB5b3Ugd2FudCBqdXN0IHRoZSBjaGFyYWN0ZXIgdGVybWluYWwgbW9kZSBvbmx5LgorR1VJID0gWUVTCisKKyMgR1VJIHdpdGggR1RLCisjIElmIHlvdSBoYXZlIEdUSyBpbnN0YWxsZWQgeW91IG1pZ2h0IHdhbnQgdG8gZW5hYmxlIHRoaXMgb3B0aW9uLgorIyBHVEsgPSBZRVMKKworIyBDb21tZW50IG91dCBpZiB5b3Ugd2FudCB0aGUgY29tcGlsZXIgdmVyc2lvbiB3aXRoIDp2ZXIgY29tbWFuZC4KKyMgTk9URTogVGhpcyBwYXJ0IGNhbiBtYWtlIHNvbWUgY29tcGxpY2F0aW9ucyBpZiB5b3UncmUgdXNpbmcgc29tZQorIyBwcmVkZWZpbmVkIHN5bWJvbHMvZmxhZ3MgZm9yIHlvdXIgY29tcGlsZXIuIElmIGRvZXMsIGp1c3QgbGVhdmUgYmVoaW5kCisjIHRoZSBjb21tZW50IHZhcmlhbGJlIENDVkVSLgorQ0NWRVIgPSBZRVMKKworIyBVbmNvbW1lbnQgaWYgd2FudCBhIGRlYnVnIHZlcnNpb24uIFJlc3VsdGluZyBleGVjdXRhYmxlIGlzIERWSU0uRVhFCisjIERldmVsb3BtZW50IHB1cnBvc2Ugb25seSEgTm9ybWFsbHksIGl0IHNob3VsZCBub3QgYmUgZGVmaW5lZC4gISEhCisjIERFQlVHID0gWUVTCisKKyMgTGFuZ3VhZ2VzIHN1cHBvcnQgZm9yIFBlcmwsIFB5dGhvbiwgVENMIGV0Yy4KKyMgSWYgeW91IGRvbid0IG5lZWQgaXQgcmVhbGx5LCBsZWF2ZSB0aGVtIGJlaGluZCB0aGUgY29tbWVudC4KKyMgWW91IHdpbGwgbmVlZCByZWxhdGVkIGxpYnJhcmllcywgaW5jbHVkZSBmaWxlcyBldGMuCisjIFZJTV9UQ0wgICAgPSBZRVMKKyMgVklNX1BFUkwgICA9IFlFUworIyBWSU1fUFlUSE9OID0gWUVTCisjIFZJTV9SVUJZICAgPSBZRVMKKyMgVklNX1NOSUZGICA9IFlFUworCisjIFggSW5wdXQgTWV0aG9kLiAgRm9yIGVudGVyaW5nIHNwZWNpYWwgbGFuZ3VhZ2VzIGxpa2UgY2hpbmVzZSBhbmQKKyMgSmFwYW5lc2UuIFBsZWFzZSBkZWZpbmUganVzdCBvbmU6IFZJTV9YSU0gb3IgVklNX0hBTkdVTElOCisjIElmIHlvdSBkb24ndCBuZWVkIGl0IHJlYWxseSwgbGVhdmUgaXQgYmVoaW5kIHRoZSBjb21tZW50LgorIyBWSU1fWElNID0gWUVTCisKKyMgSW50ZXJuYWwgSGFuZ3VsIGlucHV0IG1ldGhvZC4gR1VJIG9ubHkuCisjIElmIHlvdSBkb24ndCBuZWVkIGl0IHJlYWxseSwgbGVhdmUgaXQgYmVoaW5kIHRoZSBjb21tZW50LgorIyBWSU1fSEFOR1VMSU4gPSBZRVMKKworIyBBbGxvdyBhbnkgd2hpdGUgc3BhY2UgdG8gc2VwYXJhdGUgdGhlIGZpZWxkcyBpbiBhIHRhZ3MgZmlsZQorIyBXaGVuIG5vdCBkZWZpbmVkLCBvbmx5IGEgVEFCIGlzIGFsbG93ZWQuCisjIFZJTV9UQUdfQU5ZV0hJVEUgPSBZRVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEaXJlY3RvcnksIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgY29uZmlndXJhdGlvbiBzZWN0aW9uLgorIyBOb3JtYWxseSB5b3UgbmVlZCBub3QgdG8gY2hhbmdlIGFueXRoaW5nIGJlbG93LiAhCisjIFRoZXNlIG1heSBuZWVkIHRvIGJlIGRlZmluZWQgaWYgdGhpbmdzIGFyZSBub3QgaW4gc3RhbmRhcmQgbG9jYXRpb25zCisjCisjIFlvdSBjYW4gZmluZCBzb21lIGV4cGxhbmF0aW9uIGluIElOU1RBTExWTVMuVFhUCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ29tcGlsZXIgc2V0dXAKKworLklGREVGIFZBWAorLklGREVGIERFQ0MJICAgICAjIFZBWCB3aXRoIERFQ0MKK0NDX0RFRiAgPSBjYy9kZWNjCitQUkVGSVggID0gL3ByZWZpeD1hbGwKKy5FTFNFCQkgICAgICMgVkFYIHdpdGggVkFYQworQ0NfREVGCT0gY2MKK1BSRUZJWAk9CitDQ1ZFUgk9CisuRU5ESUYKKy5FTFNFCQkgICAgICMgQVhQIHdpeGggREVDQworQ0NfREVGICA9IGNjCitQUkVGSVggID0gL3ByZWZpeD1hbGwKKy5FTkRJRgorCitMRF9ERUYgID0gbGluaworQ19JTkMgICA9IFsucHJvdG9dCisKKy5JRkRFRiBPTERfVk1TCitWTVNfREVGID0gLCJPTERfVk1TIgorLkVORElGCisKKy5JRkRFRiBERUJVRworREVCVUdfREVGID0gLCJERUJVRyIKK1RBUkdFVCAgICA9IGR2aW0uZXhlCitDRkxBR1MgICAgPSAvZGVidWcvbm9vcHQkKFBSRUZJWCkKK0xERkxBR1MgICA9IC9kZWJ1ZworLkVMU0UKK1RBUkdFVCAgICA9IHZpbS5leGUKK0NGTEFHUyAgICA9IC9vcHQkKFBSRUZJWCkKK0xERkxBR1MgICA9CisuRU5ESUYKKworIyBQcmVkZWZpbmVkIFZJTSBkaXJlY3RvcmllcworIyBQbGVhc2UsIHVzZSAkVklNIGFuZCAkVklNUlVOVElNRSBsb2dpY2FscyBpbnN0ZWFkCitWSU1MT0MgID0gIiIKK1ZJTVJVTiAgPSAiIgorCitDT05GSUdfSCA9IG9zX3Ztc19jb25mLmgKKworLklGREVGIEdUSworLklGREVGIEdVSQorLkVMU0UKK0dVSSA9IFlFUworLkVORElGCisuRU5ESUYKKworLklGREVGIEdVSQorIyBYL01vdGlmL0dUSyBleGVjdXRhYmxlICAoYWxzbyB3b3JrcyBpbiB0ZXJtaW5hbCBtb2RlICkKKworLklGREVGIEdUSworR1RLX0RJUiAgPSBBTFBIQSRES0EwOltHVEsxMjguXQorREVGUyAgICAgPSAiSEFWRV9DT05GSUdfSCIsIkZFQVRfR1VJX0dUSyIKK0xJQlMgICAgID0gLE9TX1ZNU19HVEsuT1BUL09QVAorR1VJX0ZMQUcgPSAvbmFtZT0oYXNfaXMsc2hvcnQpL2Zsb2F0PWllZWUvaWVlZT1kZW5vcm0KK0dVSV9TUkMgID0gZ3VpLmMgZ3VpX2d0ay5jIGd1aV9ndGtfZi5jIGd1aV9ndGtfeDExLmMgcHR5LmMKK0dVSV9PQkogID0gZ3VpLm9iaiBndWlfZ3RrLm9iaiBndWlfZ3RrX2Yub2JqIGd1aV9ndGtfeDExLm9iaiBwdHkub2JqCitHVUlfSU5DICA9ICwiL2d0a19yb290L2d0ayIsIi9ndGtfcm9vdC9nbGliIgorIyBHVUlfSU5DX1ZFUiBpcyB1c2VkIGp1c3QgZm9yIDp2ZXIgaW5mb3JtYXRpb24KKyMgdGhpcyBzdHJpbmcgc2hvdWxkIGVzY2FwZSBmcm9tIEMgYW5kIERDTCBpbiB0aGUgc2FtZSB0aW1lCitHVUlfSU5DX1ZFUj0gLFwiIi9ndGtfcm9vdC9ndGtcIiIsXCIiL2d0a19yb290L2dsaWJcIiIKKy5lbHNlCitNT1RJRgkgPSBZRVMKK0RFRlMgICAgID0gIkhBVkVfQ09ORklHX0giLCJGRUFUX0dVSV9NT1RJRiIKK0xJQlMgICAgID0gLE9TX1ZNU19NT1RJRi5PUFQvT1BUCitHVUlfRkxBRyA9CitHVUlfU1JDICA9IGd1aS5jIGd1aV9tb3RpZi5jIGd1aV94MTEuYworR1VJX09CSiAgPSBndWkub2JqIGd1aV9tb3RpZi5vYmogZ3VpX3gxMS5vYmoKK0dVSV9JTkMgID0KKy5FTkRJRgorCisjIFlvdSBuZWVkIHRvIGRlZmluZSB0aGVzZSB2YXJpYWJsZXMgaWYgeW91IGRvIG5vdCBoYXZlIERFQ1cgZmlsZXMKKyMgYXQgc3RhbmRhcmQgbG9jYXRpb24KK0dVSV9JTkNfRElSID0gLGRlY3ckaW5jbHVkZToKKyMgR1VJX0xJQl9ESVIgPSAsc3lzJGxpYnJhcnk6CisKKy5FTFNFCisjIENoYXJhY3RlciB0ZXJtaW5hbCBvbmx5IGV4ZWN1dGFibGUKK0RFRlMJID0gIkhBVkVfQ09ORklHX0giCitMSUJTCSA9CisuRU5ESUYKKworLklGREVGIFZJTV9QRVJMCisjIFBlcmwgcmVsYXRlZCBzZXR1cC4KK1BFUkwJID0gcGVybAorUEVSTF9ERUYgPSAsIkZFQVRfUEVSTCIKK1BFUkxfU1JDID0gaWZfcGVybHNmaW8uYyBpZl9wZXJsLnhzCitQRVJMX09CSiA9IGlmX3BlcmxzZmlvLm9iaiBpZl9wZXJsLm9iagorUEVSTF9MSUIgPSAsT1NfVk1TX1BFUkwuT1BUL09QVAorUEVSTF9JTkMgPSAsZGthMDpbcGVybGJ1aWxkLnBlcmwubGliLnZtc19heHAuNV82XzEuY29yZV0KKy5FTkRJRgorCisuSUZERUYgVklNX1BZVEhPTgorIyBQeXRob24gcmVsYXRlZCBzZXR1cC4KK1BZVEhPTl9ERUYgPSAsIkZFQVRfUFlUSE9OIgorUFlUSE9OX1NSQyA9IGlmX3B5dGhvbi5jCitQWVRIT05fT0JKID0gaWZfcHl0aG9uLm9iagorUFlUSE9OX0xJQiA9ICxPU19WTVNfUFlUSE9OLk9QVC9PUFQKK1BZVEhPTl9JTkMgPSAsUFlUSE9OX0lOQ0xVREUKKy5FTkRJRgorCisuSUZERUYgVklNX1RDTAorIyBUQ0wgcmVsYXRlZCBzZXR1cC4KK1RDTF9ERUYgPSAsIkZFQVRfVENMIgorVENMX1NSQyA9IGlmX3RjbC5jCitUQ0xfT0JKID0gaWZfdGNsLm9iagorVENMX0xJQiA9ICxPU19WTVNfVENMLk9QVC9PUFQKK1RDTF9JTkMgPSAsZGthMDpbdGNsODAuZ2VuZXJpY10KKy5FTkRJRgorCisuSUZERUYgVklNX1NOSUZGCisjIFNOSUZGIHJlbGF0ZWQgc2V0dXAuCitTTklGRl9ERUYgPSAsIkZFQVRfU05JRkYiCitTTklGRl9TUkMgPSBpZl9zbmlmZi5jCitTTklGRl9PQkogPSBpZl9zbmlmZi5vYmoKK1NOSUZGX0xJQiA9CitTTklGRl9JTkMgPQorLkVORElGCisKKy5JRkRFRiBWSU1fUlVCWQorIyBSVUJZIHJlbGF0ZWQgc2V0dXAuCitSVUJZX0RFRiA9ICwiRkVBVF9SVUJZIgorUlVCWV9TUkMgPSBpZl9ydWJ5LmMKK1JVQllfT0JKID0gaWZfcnVieS5vYmoKK1JVQllfTElCID0gLE9TX1ZNU19SVUJZLk9QVC9PUFQKK1JVQllfSU5DID0KKy5FTkRJRgorCisuSUZERUYgVklNX1hJTQorIyBYSU0gcmVsYXRlZCBzZXR1cC4KKy5JRkRFRiBHVUkKK1hJTV9ERUYgPSAsIkZFQVRfWElNIgorLkVORElGCisuRU5ESUYKKworLklGREVGIFZJTV9IQU5HVUxJTgorIyBIQU5HVUxJTiByZWxhdGVkIHNldHVwLgorLklGREVGIEdVSQorSEFOR1VMSU5fREVGID0gLCJGRUFUX0hBTkdVTElOIgorSEFOR1VMSU5fU1JDID0gaGFuZ3VsaW4uYworSEFOR1VMSU5fT0JKID0gaGFuZ3VsaW4ub2JqCisuRU5ESUYKKy5FTkRJRgorCisuSUZERUYgVklNX1RBR19BTllXSElURQorIyBUQUdfQU5ZV0hJVEUgcmVsYXRlZCBzZXR1cC4KK1RBR19ERUYgPSAsIkZFQVRfVEFHX0FOWVdISVRFIgorLkVORElGCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbmQgb2YgY29uZmlndXJhdGlvbiBzZWN0aW9uLgorIyBQbGVhc2UsIGRvIG5vdCBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgd2l0aG91dCBwcm9ncmFtbWluZyBleHBlcmllbmNlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK01PREVMX0RFRiA9ICJGRUFUXyQoTU9ERUwpIiwKKworIyBUaGVzZSBnbyBpbnRvIHBhdGhkZWYuYworVklNVVNFUiA9ICInJ0YkRURJVChGJEdFVEpQSSgiICIsIlVTRVJOQU1FIiksIlRSSU0iKSciCitWSU1IT1NUID0gIicnRiRUUk5MTk0oIlNZUyROT0RFIiknJydGJFRSTkxOTSgiVUNYJElORVRfSE9TVCIpJy4nJ0YkVFJOTE5NKCJVQ1gkSU5FVF9ET01BSU4iKSciCisKKy5TVUZGSVhFUyA6IC5vYmogLmMKKworQUxMX0NGTEFHUyA9IC9kZWY9KCQoTU9ERUxfREVGKSQoREVGUykkKFZNU19ERUYpJChERUJVR19ERUYpJChQRVJMX0RFRikkKFBZVEhPTl9ERUYpIC0KKyAkKFRDTF9ERUYpJChTTklGRl9ERUYpJChSVUJZX0RFRikkKFhJTV9ERUYpJChIQU5HVUxJTl9ERUYpJChUQUdfREVGKSkgLQorICQoQ0ZMQUdTKSQoR1VJX0ZMQUcpIC0KKyAvaW5jbHVkZT0oJChDX0lOQykkKEdVSV9JTkNfRElSKSQoR1VJX0lOQykkKFBFUkxfSU5DKSQoUFlUSE9OX0lOQykkKFRDTF9JTkMpKQorCisjIENGTEFHUyBkaXNwbGF5ZWQgaW4gOnZlciBpbmZvcm1hdGlvbgorIyBJdCBpcyBzcGVjaWFsbHkgZm9ybWF0ZWQgZm9yIGNvcnJlY3QgZGlzcGxheSBvZiB1bml4IGxpa2UgaW5jbHVkZXMKKyMgYXMgJChHVUlfSU5DKSAtIHJlcGxhY2VkIHdpdGggJChHVUlfSU5DX1ZFUikKKyMgT3RoZXJ3aXNlIHNob3VsZCBub3QgYmUgYW55IG90aGVyIGRpZmZlcmVuY2UuCitBTExfQ0ZMQUdTX1ZFUiA9IC9kZWY9KCQoTU9ERUxfREVGKSQoREVGUykkKFZNU19ERUYpJChERUJVR19ERUYpJChQRVJMX0RFRikkKFBZVEhPTl9ERUYpIC0KKyAkKFRDTF9ERUYpJChTTklGRl9ERUYpJChSVUJZX0RFRikkKFhJTV9ERUYpJChIQU5HVUxJTl9ERUYpJChUQUdfREVGKSkgLQorICQoQ0ZMQUdTKSQoR1VJX0ZMQUcpIC0KKyAvaW5jbHVkZT0oJChDX0lOQykkKEdVSV9JTkNfRElSKSQoR1VJX0lOQ19WRVIpJChQRVJMX0lOQykkKFBZVEhPTl9JTkMpJChUQ0xfSU5DKSkKKworQUxMX0xJQlMgPSAkKExJQlMpICQoR1VJX0xJQl9ESVIpICQoR1VJX0xJQikgXAorCSAgICQoUEVSTF9MSUIpICQoUFlUSE9OX0xJQikgJChUQ0xfTElCKSAkKFNOSUZGX0xJQikgJChSVUJZX0xJQikKKworU1JDID0JYnVmZmVyLmMgY2hhcnNldC5jIGRpZmYuYyBkaWdyYXBoLmMgZWRpdC5jIGV2YWwuYyBleF9jbWRzLmMgZXhfY21kczIuYyBcCisJZXhfZG9jbWQuYyBleF9ldmFsLmMgZXhfZ2V0bG4uYyBpZl94Y21kc3J2LmMgZmlsZWlvLmMgZm9sZC5jIGdldGNoYXIuYyBcCisJbWFpbi5jIG1hcmsuYyBtZW51LmMgbWJ5dGUuYyBtZW1maWxlLmMgbWVtbGluZS5jIG1lc3NhZ2UuYyBtaXNjMS5jIFwKKwltaXNjMi5jIG1vdmUuYyBub3JtYWwuYyBvcHMuYyBvcHRpb24uYyBxdWlja2ZpeC5jIHJlZ2V4cC5jIHNlYXJjaC5jIFwKKwlzeW50YXguYyB0YWcuYyB0ZXJtLmMgdGVybWxpYi5jIHVpLmMgdW5kby5jIHZlcnNpb24uYyBzY3JlZW4uYyBcCisJd2luZG93LmMgb3NfdW5peC5jIG9zX3Ztcy5jIHBhdGhkZWYuYyBcCisJJChHVUlfU1JDKSAkKFBFUkxfU1JDKSAkKFBZVEhPTl9TUkMpICQoVENMX1NSQykgJChTTklGRl9TUkMpIFwKKwkkKFJVQllfU1JDKSAkKEhBTkdVTElOX1NSQykKKworT0JKID0JYnVmZmVyLm9iaiBjaGFyc2V0Lm9iaiBkaWZmLm9iaiBkaWdyYXBoLm9iaiBlZGl0Lm9iaiBldmFsLm9iaiBcCisJZXhfY21kcy5vYmogZXhfY21kczIub2JqIGV4X2RvY21kLm9iaiBleF9ldmFsLm9iaiBleF9nZXRsbi5vYmogXAorCWlmX3hjbWRzcnYub2JqIGZpbGVpby5vYmogZm9sZC5vYmogZ2V0Y2hhci5vYmogbWFpbi5vYmogbWFyay5vYmogXAorCW1lbnUub2JqIG1lbWZpbGUub2JqIG1lbWxpbmUub2JqIG1lc3NhZ2Uub2JqIG1pc2MxLm9iaiBtaXNjMi5vYmogXAorCW1vdmUub2JqIG1ieXRlLm9iaiBub3JtYWwub2JqIG9wcy5vYmogb3B0aW9uLm9iaiBxdWlja2ZpeC5vYmogXAorCXJlZ2V4cC5vYmogc2VhcmNoLm9iaiBzeW50YXgub2JqIHRhZy5vYmogdGVybS5vYmogdGVybWxpYi5vYmogXAorCXVpLm9iaiB1bmRvLm9iaiBzY3JlZW4ub2JqIHZlcnNpb24ub2JqIHdpbmRvdy5vYmogb3NfdW5peC5vYmogXAorCW9zX3Ztcy5vYmogcGF0aGRlZi5vYmogXAorCSQoR1VJX09CSikgJChQRVJMX09CSikgJChQWVRIT05fT0JKKSAkKFRDTF9PQkopICQoU05JRkZfT0JKKSBcCisJJChSVUJZX09CSikgJChIQU5HVUxJTl9PQkopCisKKyMgRGVmYXVsdCB0YXJnZXQgaXMgbWFraW5nIHRoZSBleGVjdXRhYmxlCithbGwgOiBbLmF1dG9dY29uZmlnLmggbW1rX2NvbXBhdCBtb3RpZl9lbnYgZ3RrX2VudiBwZXJsX2VudiBweXRob25fZW52IHRjbF9lbnYgcnVieV9lbnYgJChUQVJHRVQpCisJISAkQAorCitbLmF1dG9dY29uZmlnLmggOiAkKENPTkZJR19IKQorCWNvcHkvbm9sb2cgJChDT05GSUdfSCkgWy5hdXRvXWNvbmZpZy5oCisKK21ta19jb21wYXQgOgorCS1AIG9wZW4vd3JpdGUgcGQgcGF0aGRlZi5jCisJLUAgd3JpdGUgcGQgIi8qIEVtcHR5IGZpbGUgdG8gc2F0aXNmeSBNTUsgZGVwZW5kLiAgKi8iCisJLUAgd3JpdGUgcGQgIi8qIEl0IHdpbGwgYmUgb3dlcndyaXR0ZW4gbGF0ZXIgb24uLi4gKi8iCisJLUAgY2xvc2UgcGQKK2NsZWFuIDoKKwktQCBpZiAiJydGJFNFQVJDSCgiKi5leGUiKSciIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyAqLmV4ZTsqCisJLUAgaWYgIicnRiRTRUFSQ0goIioub2JqIiknIiAuTkVTLiAiIiB0aGVuIGRlbGV0ZS9ub2NvbmZpcm0vbm9sb2cgKi5vYmo7KgorCS1AIGlmICInJ0YkU0VBUkNIKCJbLmF1dG9dY29uZmlnLmgiKSciIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyBbLmF1dG9dY29uZmlnLmg7KgorCS1AIGlmICInJ0YkU0VBUkNIKCJwYXRoZGVmLmMiKSciIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyBwYXRoZGVmLmM7KgorCS1AIGlmICInJ0YkU0VBUkNIKCJpZl9wZXJsLmMiKSciIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyBpZl9wZXJsLmM7KgorCS1AIGlmICInJ0YkU0VBUkNIKCIqLm9wdCIpJyIgLk5FUy4gIiIgdGhlbiBkZWxldGUvbm9jb25maXJtL25vbG9nICoub3B0OyoKKworIyBMaW5rIHRoZSB0YXJnZXQKKyQoVEFSR0VUKSA6ICQoT0JKKQorCSQoTERfREVGKSAkKExERkxBR1MpIC9leGU9JChUQVJHRVQpICQrICQoQUxMX0xJQlMpCisKKy5jLm9iaiA6CisJJChDQ19ERUYpICQoQUxMX0NGTEFHUykgJDwKKworcGF0aGRlZi5jIDogY2hlY2tfY2N2ZXIgJChDT05GSUdfSCkKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICJjcmVhdGluZyBQQVRIREVGLkMgZmlsZS4iCisJLUAgb3Blbi93cml0ZSBwZCBwYXRoZGVmLmMKKwktQCB3cml0ZSBwZCAiLyogcGF0aGRlZi5jIC0tIERPIE5PVCBFRElUISAqLyIKKwktQCB3cml0ZSBwZCAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBNQUtFX1ZNUy5NTVMiCisJLUAgd3JpdGUgcGQgIiAqIENoYW5nZSB0aGUgZmlsZSBNQUtFX1ZNUy5NTVMgT25seS4gKi8iCisJLUAgd3JpdGUgcGQgInR5cGVkZWYgdW5zaWduZWQgY2hhciAgIGNoYXJfdTsiCisJLUAgd3JpdGUgcGQgImNoYXJfdSAqZGVmYXVsdF92aW1fZGlyID0gKGNoYXJfdSAqKSIkKFZJTUxPQykiOyIKKwktQCB3cml0ZSBwZCAiY2hhcl91ICpkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyID0gKGNoYXJfdSAqKSIkKFZJTVJVTikiOyIKKwktQCB3cml0ZSBwZCAiY2hhcl91ICphbGxfY2ZsYWdzID0gKGNoYXJfdSAqKSIiJChDQ19ERUYpJChBTExfQ0ZMQUdTX1ZFUikiIjsiCisJLUAgd3JpdGUgcGQgImNoYXJfdSAqYWxsX2xmbGFncyA9IChjaGFyX3UgKikiIiQoTERfREVGKSQoTERGTEFHUykgL2V4ZT0kKFRBUkdFVCkgKi5PQkogJChBTExfTElCUykiIjsiCisJLUAgd3JpdGUgcGQgImNoYXJfdSAqY29tcGlsZXJfdmVyc2lvbiA9IChjaGFyX3UgKikgIiInJ0NDX1ZFUiciIjsiCisJLUAgd3JpdGUgcGQgImNoYXJfdSAqY29tcGlsZWRfdXNlciA9IChjaGFyX3UgKikgIiQoVklNVVNFUikiOyIKKwktQCB3cml0ZSBwZCAiY2hhcl91ICpjb21waWxlZF9zeXMgPSAoY2hhcl91ICopICIkKFZJTUhPU1QpIjsiCisJLUAgY2xvc2UgcGQKKworaWZfcGVybC5jIDogaWZfcGVybC54cworCS1AICQoUEVSTCkgUEVSTF9ST09UOltMSUIuRXh0VXRpbHNdeHN1YnBwIC1wcm90b3R5cGVzIC10eXBlbWFwIC0KKyBQRVJMX1JPT1Q6W0xJQi5FeHRVdGlsc110eXBlbWFwIGlmX3BlcmwueHMgPj4gJEAKKworbWFrZV92bXMubW1zIDoKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICJUaGUgbmFtZSBvZiB0aGUgbWFrZWZpbGUgTVVTVCBiZSA8TUFLRV9WTVMuTU1TPiAhISEiCisKKy5JRkRFRiBDQ1ZFUgorIyBUaGlzIHBhcnQgY2FuIG1ha2Ugc29tZSBjb21wbGljYXRpb25zIGlmIHlvdSdyZSB1c2luZyBzb21lIHByZWRlZmluZWQKKyMgc3ltYm9scy9mbGFncyBmb3IgeW91ciBjb21waWxlci4gSWYgZG9lcywganVzdCBjb21tZW50IG91dCBDQ1ZFUiB2YXJpYWJsZQorY2hlY2tfY2N2ZXIgOgorCS1AIGRlZmluZSBzeXMkb3V0cHV0IGNjX3Zlci50bXAKKwktQCAkKENDX0RFRikvdmVyc2lvbgorCS1AIGRlYXNzaWduIHN5cyRvdXRwdXQKKwktQCBvcGVuL3JlYWQgZmlsZSBjY192ZXIudG1wCisJLUAgcmVhZCBmaWxlIENDX1ZFUgorCS1AIGNsb3NlIGZpbGUKKwktQCBkZWxldGUvbm9jb25maXJtL25vbG9nIGNjX3Zlci50bXAuKgorLkVMU0UKK2NoZWNrX2NjdmVyIDoKKwktQCAhCisuRU5ESUYKKworLklGREVGIE1PVElGCittb3RpZl9lbnYgOgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgInVzaW5nIERFQ1cvTW90aWYgZW52aXJvbm1lbnQuIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgImNyZWF0aW5nIE9TX1ZNU19NT1RJRi5PUFQgZmlsZS4iCisJLUAgb3Blbi93cml0ZSBvcHRfZmlsZSBPU19WTVNfTU9USUYuT1BUCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHhtbGlic2hyMTIuZXhlL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHh0bGlic2hycjUuZXhlL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgorCS1AIGNsb3NlIG9wdF9maWxlCisuRUxTRQorbW90aWZfZW52IDoKKwktQCAhCisuRU5ESUYKKworCisuSUZERUYgR1RLCitndGtfZW52IDoKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICJ1c2luZyBHVEsgZW52aXJvbm1lbnQ6IgorCS1AIGRlZmluZS9ub2xvZyBndGtfcm9vdCAvdHJhbnM9Y29uYyAkKEdUS19ESVIpCisJLUAgc2hvdyBsb2dpY2FsIGd0a19yb290CisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgIGluY2x1ZGUgcGF0aDogIiQoR1VJX0lOQykiIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgImNyZWF0aW5nIE9TX1ZNU19HVEsuT1BUIGZpbGUuIgorCS1AIG9wZW4vd3JpdGUgb3B0X2ZpbGUgT1NfVk1TX0dUSy5PUFQKKwktQCB3cml0ZSBvcHRfZmlsZSAiZ3RrX3Jvb3Q6W2dsaWJdbGliZ2xpYi5leGUgL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgImd0a19yb290OltnbGliLmdtb2R1bGVdbGliZ21vZHVsZS5leGUgL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgImd0a19yb290OltndGsuZ2RrXWxpYmdkay5leGUgL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgImd0a19yb290OltndGsuZ3RrXWxpYmd0ay5leGUgL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHhtbGlic2hyMTIuZXhlL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHh0bGlic2hycjUuZXhlL3NoYXJlLC0iCisJLUAgd3JpdGUgb3B0X2ZpbGUgInN5cyRzaGFyZTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgorCS1AIGNsb3NlIG9wdF9maWxlCisuRUxTRQorZ3RrX2VudiA6CisJLUAgIQorLkVORElGCisKKy5JRkRFRiBWSU1fUEVSTAorcGVybF9lbnYgOgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgInVzaW5nIFBFUkwgZW52aXJvbm1lbnQ6IgorCS1AIHNob3cgbG9naWNhbCBQRVJMU0hSCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgIGluY2x1ZGUgcGF0aDogIiIkKFBFUkxfSU5DKSIiIgorCS1AIHNob3cgc3ltYm9sIHBlcmwKKwktQCBvcGVuL3dyaXRlIHBkIGlmX3BlcmwuYworCS1AIHdyaXRlIHBkICIvKiBFbXB0eSBmaWxlIHRvIHNhdGlzZnkgTU1LIGRlcGVuZC4gICovIgorCS1AIHdyaXRlIHBkICIvKiBJdCB3aWxsIGJlIG93ZXJ3cml0dGVuIGxhdGVyIG9uLi4uICovIgorCS1AIGNsb3NlIHBkCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiY3JlYXRpbmcgT1NfVk1TX1BFUkwuT1BUIGZpbGUuIgorCS1AIG9wZW4vd3JpdGUgb3B0X2ZpbGUgT1NfVk1TX1BFUkwuT1BUCisJLUAgd3JpdGUgb3B0X2ZpbGUgIlBFUkxTSFIgL3NoYXJlIgorCS1AIGNsb3NlIG9wdF9maWxlCisuRUxTRQorcGVybF9lbnYgOgorCS1AICEKKy5FTkRJRgorCisuSUZERUYgVklNX1BZVEhPTgorcHl0aG9uX2VudiA6CisJLUAgd3JpdGUgc3lzJG91dHB1dCAidXNpbmcgUFlUSE9OIGVudmlyb25tZW50OiIKKwktQCBzaG93IGxvZ2ljYWwgUFlUSE9OX0lOQ0xVREUKKwktQCBzaG93IGxvZ2ljYWwgUFlUSE9OX09MQgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgImNyZWF0aW5nIE9TX1ZNU19QWVRIT04uT1BUIGZpbGUuIgorCS1AIG9wZW4vd3JpdGUgb3B0X2ZpbGUgT1NfVk1TX1BZVEhPTi5PUFQKKwktQCB3cml0ZSBvcHRfZmlsZSAiUFlUSE9OX09MQjpQWVRIT04uT0xCIC9zaGFyZSIKKwktQCBjbG9zZSBvcHRfZmlsZQorLkVMU0UKK3B5dGhvbl9lbnYgOgorCS1AICEKKy5FTkRJRgorCisuSUZERUYgVklNX1RDTAordGNsX2VudiA6CisJLUAgd3JpdGUgc3lzJG91dHB1dCAidXNpbmcgVENMIGVudmlyb25tZW50OiIKKwktQCBzaG93IGxvZ2ljYWwgVENMU0hSCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgIGluY2x1ZGUgcGF0aDogIiIkKFRDTF9JTkMpIiIiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiY3JlYXRpbmcgT1NfVk1TX1RDTC5PUFQgZmlsZS4iCisJLUAgb3Blbi93cml0ZSBvcHRfZmlsZSBPU19WTVNfVENMLk9QVAorCS1AIHdyaXRlIG9wdF9maWxlICJUQ0xTSFIgL3NoYXJlIgorCS1AIGNsb3NlIG9wdF9maWxlCisuRUxTRQordGNsX2VudiA6CisJLUAgIQorLkVORElGCisKKy5JRkRFRiBWSU1fUlVCWQorcnVieV9lbnYgOgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgInVzaW5nIFJVQlkgZW52aXJvbm1lbnQ6IgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIiAgICBpbmNsdWRlIHBhdGg6ICIiJChSVUJZX0lOQykiIiIKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICJjcmVhdGluZyBPU19WTVNfUlVCWS5PUFQgZmlsZS4iCisJLUAgb3Blbi93cml0ZSBvcHRfZmlsZSBPU19WTVNfUlVCWS5PUFQKKwktQCB3cml0ZSBvcHRfZmlsZSAiUlVCWVNIUiAvc2hhcmUiCisJLUAgY2xvc2Ugb3B0X2ZpbGUKKy5FTFNFCitydWJ5X2VudiA6CisJLUAgIQorLkVORElGCisKKwpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfdzE2Lm1hayBiL3NyYy9NYWtlX3cxNi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0MjVjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9NYWtlX3cxNi5tYWsKQEAgLTAsMCArMSwxOTYgQEAKKyMKKyMgQm9ybGFuZCBDKysgNS4wWzEyXSBtYWtlZmlsZSBmb3IgdmltLCAxNi1iaXQgd2luZG93cyBndWkgdmVyc2lvbgorIyBCeSBWaW5jZSBOZWdyaQorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICogV0FSTklORyEKKyMgKiBUaGlzIHdhcyBvcmlnaW5hbGx5IHByb2R1Y2VkIGJ5IHRoZSBJREUsIGJ1dCBoYXMgc2luY2UgYmVlbgorIyAqIG1vZGlmZWQgdG8gbWFrZSBpdCB3b3JrIHByb3Blcmx5LiBBZGp1c3Qgd2l0aCBjYXJlIQorIyAqIEluIHBhcnRpY3VsYXIsIGxlYXZlIExpbmtlckxvY2FsT3B0c0F0VzE2X2d2aW0xNmRleGUgYWxvbmUKKyMgKiB1bmxlc3MgeW91IGFyZSBhIGd1cnUuCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgTG9vayBmb3IgQk9SIGJlbG93IGFuZCBlaXRoZXIgcGFzcyBhIGRpZmZlcmVudCB2YWx1ZSBvcgorIyBhZGp1c3QgdGhlIHBhdGggYXMgcmVxdWlyZWQuIEZvciBleGFtcGxlCisjICAgbWFrZSAtZk1ha2VfdzE2Lm1hayAtREJPUj1DOlxQRlxCb3JsYW5kXEJDNS4wMSAtQiBCY2NXMTYuY2ZnCisjICAgbWFrZSAtZk1ha2VfdzE2Lm1haworIyBOb3RlOiAkKEJPUikgaXMgZWZmZWN0aXZlbHkgaWdub3JlZCB1bmxlc3MgQmNjVzE2LmNmZyBpcyByZWJ1aWx0LgorIworIyBEb2VzIG5vdCBjb21waWxlIHdpdGggQm9ybGFuZCBDKysgNC41MSBXYWx0ZXIgQnJpc2NvZSAyMDAzLTAyLTI0CisjICJvdXQgb2YgbWVtb3J5IiBmcm9tIGNvbXBpbGVyIGlmIGd2aW0xNiB3aWxkbHkgd3JvbmcuIFdGQiAyMDAzLTAzLTA0CisjCisjIHZpbTE2LmRlZiBtdXN0IGJlIGEgRE9TLWZvcm1hdHRlZCBmaWxlLiAoXHJcbiBsaW5lIGVuZGluZ3MuKQorIyBJdCBpcyBhIFVOSVgtZm9ybWF0dGVkIGZpbGUgKFxuIGxpbmUgZW5kaW5ncykgaW4gdmltLSotZXh0cmEudGFyLmd6CisKKy5BVVRPREVQRU5ECisKKyMKKyMgQm9ybGFuZCBDKysgdG9vbHMKKyMKK0lNUExJQiAgPSBJbXBsaWIKK0JDQyAgICAgPSBCY2MgK0JjY1cxNi5jZmcKK1RMSU5LICAgPSBUTGluaworVExJQiAgICA9IFRMaWIKK0JSQyAgICAgPSBCcmMKK1RBU00gICAgPSBUYXNtCisjCisjIElERSBtYWNyb3MKKyMKKworIworIyBPcHRpb25zCisjCishaWZuZGVmIEJPUgorQk9SID0gRDpcQkM1CishZW5kaWYKKworIyAhaWZuZGVmIElOVERJUiBpcyBsZXRoYWwgY29uc2lkZXJpbmcgQ0xFQU4gYmVsb3cuIFdGQiAyMDAzLTAzLTEzCitJTlRESVI9dzE2CisKKyMgIC9Ud2UgTWFrZSB0aGUgdGFyZ2V0IGEgV2luZG93cyAuRVhFIHdpdGggZXhwbGljaXQgZnVuY3Rpb25zIGV4cG9ydGFibGUgKworIyAgL3ggICBNYXAgZmlsZSBvZmYKKyMgIC9sICAgSW5jbHVkZSBzb3VyY2UgbGluZSBudW1iZXJzIGluIG9iamVjdCBtYXAgZmlsZXNgCisjICAvYyAgIGNhc2Ugc2Vuc2l0aXZlIGxpbmsKKyMgIC9DICAgQ2FzZS1zZW5zaXRpdmUgZXhwb3J0cyBhbmQgaW1wb3J0cyAoMTYtYml0IG9ubHkpCisjICAvayAgIFByb2R1Y2UgIk5vIFN0YWNrIiB3YXJuaW5nLgorIyAgL09hICBNaW5pbWlzZSBzZWdtZW50IGFsaWdubWVudAorIyAgL09jICBNaW5pbWlzZSBDaGFpbiBmaXhlcworIyAgL09pICBNaW5pbWlzZSBJdGVyYXRlZCBkYXRhCisjICAvT3IgIE1pbmltaXNlIHJlc291cmNlIGFsaWdubWVudAorIyAgL1AgICAtUD14ICBDb2RlIHBhY2sgc2l6ZQorIyAgL1YgICBXaW5kb3dzIHZlcnNpb24gZm9yIGFwcGxpY2F0aW9uCisjICAvTCAgIEZvbGRlciB0byBzZWFyY2ggZm9yIGxpYnJhcnkgZmlsZXMKK0xpbmtlckxvY2FsT3B0c0F0VzE2X2d2aW0xNmRleGUgPS9Ud2UveC9sL2MvQy9rL09yL09jL09hL09pL1A9NjU1MzUvVjMuMTAKKworQ29tcEluaGVyaXRPcHRzQXRfZ3ZpbTE2ZGV4ZSA9IFwKKyAgIC1JJChCT1IpXElOQ0xVREU7UFJPVE87LiBcCisgICAtREZFQVRfR1VJO0ZFQVRfR1VJX01TV0lOO0ZFQVRfR1VJX1cxNjtNU1dJTjtXSU4xNjtNU1dJTjE2X0ZBU1RURVhUIFwKKyAgIC1ERkVBVF9UT09MQkFSO1dJTjE2XzNETE9PSworCisjCisjIERlcGVuZGVuY3kgTGlzdAorIworRGVwX0d2aW0xNiA9IFwKKyAgIGd2aW0xNi5leGUKKworT2JqRmlsZXMgPSBcCisgICAkKElOVERJUilcYnVmZmVyLm9ialwKKyAgICQoSU5URElSKVxjaGFyc2V0Lm9ialwKKyAgICQoSU5URElSKVxkaWZmLm9ialwKKyAgICQoSU5URElSKVxkaWdyYXBoLm9ialwKKyAgICQoSU5URElSKVxlZGl0Lm9ialwKKyAgICQoSU5URElSKVxldmFsLm9ialwKKyAgICQoSU5URElSKVxleF9jbWRzLm9ialwKKyAgICQoSU5URElSKVxleF9jbWRzMi5vYmpcCisgICAkKElOVERJUilcZXhfZG9jbWQub2JqXAorICAgJChJTlRESVIpXGV4X2V2YWwub2JqXAorICAgJChJTlRESVIpXGV4X2dldGxuLm9ialwKKyAgICQoSU5URElSKVxmaWxlaW8ub2JqXAorICAgJChJTlRESVIpXGZvbGQub2JqXAorICAgJChJTlRESVIpXGdldGNoYXIub2JqXAorICAgJChJTlRESVIpXGd1aS5vYmpcCisgICAkKElOVERJUilcZ3VpX3cxNi5vYmpcCisgICAkKElOVERJUilcbWFpbi5vYmpcCisgICAkKElOVERJUilcbWFyay5vYmpcCisgICAkKElOVERJUilcbWJ5dGUub2JqXAorICAgJChJTlRESVIpXG1lbWZpbGUub2JqXAorICAgJChJTlRESVIpXG1lbWxpbmUub2JqXAorICAgJChJTlRESVIpXG1lbnUub2JqXAorICAgJChJTlRESVIpXG1lc3NhZ2Uub2JqXAorICAgJChJTlRESVIpXG1pc2MxLm9ialwKKyAgICQoSU5URElSKVxtaXNjMi5vYmpcCisgICAkKElOVERJUilcbW92ZS5vYmpcCisgICAkKElOVERJUilcbm9ybWFsLm9ialwKKyAgICQoSU5URElSKVxvcHMub2JqXAorICAgJChJTlRESVIpXG9wdGlvbi5vYmpcCisgICAkKElOVERJUilcb3Nfd2luMTYub2JqXAorICAgJChJTlRESVIpXG9zX21zZG9zLm9ialwKKyAgICQoSU5URElSKVxvc19tc3dpbi5vYmpcCisgICAkKElOVERJUilccXVpY2tmaXgub2JqXAorICAgJChJTlRESVIpXHJlZ2V4cC5vYmpcCisgICAkKElOVERJUilcc2NyZWVuLm9ialwKKyAgICQoSU5URElSKVxzZWFyY2gub2JqXAorICAgJChJTlRESVIpXHN5bnRheC5vYmpcCisgICAkKElOVERJUilcdGFnLm9ialwKKyAgICQoSU5URElSKVx0ZXJtLm9ialwKKyAgICQoSU5URElSKVx1aS5vYmpcCisgICAkKElOVERJUilcdW5kby5vYmpcCisgICAkKElOVERJUilcdmVyc2lvbi5vYmpcCisgICAkKElOVERJUilcd2luZG93Lm9iagorCitEZXBfZ3ZpbTE2ZGV4ZSA9IFwKKyAgIHZpbXRiYXIubGliXAorICAgdmltMTYuZGVmXAorICAgJChJTlRESVIpXHZpbTE2LnJlc1wKKyAgICQoT2JqRmlsZXMpCisKKyMgV2l0aG91dCB0aGUgZm9sbG93aW5nLCB0aGUgaW1wbGljaXQgcnVsZSBpbiBCVUlMVElOUy5NQUsgaXMgcGlja2VkIHVwCisjIGZvciBhIHJ1bGUgZm9yIC5jLm9iaiByYXRoZXIgdGhhbiB0aGUgbG9jYWwgaW1wbGljaXQgcnVsZQorLlNVRkZJWEVTCisuU1VGRklYRVMgLmMgLm9iagorLnBhdGguYyA9IC4KKworIyAtUC0JRm9yY2UgQysrIGNvbXBpbGF0aW9uIG9mZgorIyAtYwlDb21waWxhdGlvbiBvbmx5CisjIC1uICAgIFBsYWNlIC5PQkogZmlsZXMKK3sufS5jeyQoSU5URElSKX0ub2JqOgorICAkKEJDQykgLVAtIC1jIC1uJChJTlRESVIpXCB7JDwgfQorCitHdmltMTYgOiBCY2NXMTYuY2ZnICQoRGVwX0d2aW0xNikKKyAgZWNobyBNYWtlTm9kZQorCitndmltMTYuZXhlIDogJChEZXBfZ3ZpbTE2ZGV4ZSkKKyAgJChUTElOSykgICAkKExpbmtlckxvY2FsT3B0c0F0VzE2X2d2aW0xNmRleGUpIEAmJnwKK2Mwd2wub2JqICQoT2JqRmlsZXMpCit8LCQqLCx2aW10YmFyIGN0bDNkdjIgaW1wb3J0IGN3bCwgdmltMTYuZGVmLCQoSU5URElSKVx2aW0xNi5yZXMKKworIyBGb3JjZSBvYmplY3RzIHRvIGJlIGJ1aWx0IGlmICQoQk9SKSBjaGFuZ2VzCiskKE9iakZpbGVzKSA6IE1ha2VfdzE2Lm1hayBCY2NXMTYuY2ZnCisKKyQoSU5URElSKVx2aW0xNi5yZXMgOiB2aW0xNi5yYworICAkKEJSQykgLVIgQCYmfAorICAkKENvbXBJbmhlcml0T3B0c0F0X2d2aW0xNmRleGUpIC1mbyQqLnJlcyAkPworfAorCisKKyMgQ29tcGlsZXIgY29uZmlndXJhdGlvbiBmaWxlCisjIFRoZXJlIGlzIG5vIHJ1bGUgZm9yICQoSU5URElSKSBhcyBtYWtlIGFsd2F5cyBzYXlzIGl0IGRvZXMgbm90IGV4aXN0CitCY2NXMTYuY2ZnIDoKKwktQGlmIG5vdCBleGlzdCAkKElOVERJUilcJChOVUxMKSBta2RpciAkKElOVERJUikKKwlDb3B5ICYmfAorLTMJCTsgR2VuZXJhdGUgODAzODYgcHJvdGVjdGVkLW1vZGUgY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMKKy1hCQk7IEJ5dGUgYWxpZ25tZW50CistZGMJCTsgTW92ZSBzdHJpbmcgbGl0ZXJhbHMgZnJvbSBkYXRhIHNlZ21lbnQgdG8gY29kZSBzZWdtZW50CistZmYJCTsgRmFzdCBmbG9hdGluZyBwb2ludAorLUgJCTsgR2VuZXJhdGUgYW5kIHVzZSBwcmVjb21waWxlZCBoZWFkZXJzCistSD0kKElOVERJUilcZ3ZpbTE2LmNzbQk7IGd2aW0xNi5jc20gaXMgdGhlIHByZWNvbXBpbGVkIGhlYWRlciBmaWxlbmFtZQorLWstCQk7IE5vIHN0YW5kYXJkIHN0YWNrIGZyYW1lCistbWwJCTsgTGFyZ2UgbWVtb3J5IG1vZGVsCistT1cJCTsgU3VwcHJlc3MgdGhlIGluYyBicC9kZWMgYnAgb24gd2luZG93cyBmYXIgZnVuY3Rpb25zCistTzEJCTsgR2VuZXJhdGUgc21hbGxlc3QgcG9zc2libGUgY29kZQorLU8yCQk7IEdlbmVyYXRlIGZhc3Rlc3QgcG9zc2libGUgY29kZSAob3ZlcnJpZGVzIHByaW9yIC1PMSBjb250cm9sKQorLXByCQk7IEZhc3RjYWxsIGNhbGxpbmcgY29udmVudGlvbiBwYXNzaW5nIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzCistUi0JCTsgRXhjbHVkZSBicm93c2VyIGluZm9ybWF0aW9uIGluIGdlbmVyYXRlZCAuT0JKIGZpbGVzCistdi0JCTsgVHVybiBvZmYgc291cmNlIGRlYnVnZ2luZworLXZpCQk7IFR1cm4gaW5saW5lIGZ1bmN0aW9uIGV4cGFuc2lvbiBvbgorLVdFCQk7IE9ubHkgX19mYXIgX2V4cG9ydCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkCistdwkJOyBEaXNwbGF5IHdhcm5pbmdzCistdy1wYXIJCTsgU3VwcHJlc3M6IFBhcmFtZXRlciAncGFyYW1ldGVyJyBpcyBuZXZlciB1c2VkCistdy1wY2gJCTsgQ2Fubm90IGNyZWF0ZSBwcmUtY29tcGlsZWQgaGVhZGVyOiBpbml0aWFsaXplZCBkYXRhIGluIGhlYWRlcgorLXctc2lnCQk7IGlkZW50aWZpZXInIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkCistdy11Y3AJCTsgTWl4aW5nIHBvaW50ZXJzIHRvIGRpZmZlcmVudCAnY2hhcicgdHlwZXMKKy13dXNlCQk7ICdpZGVudGlmaWVyJyBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZAorICQoQ29tcEluaGVyaXRPcHRzQXRfZ3ZpbTE2ZGV4ZSkKK3wgJEAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorREVMX1RSRUUgPSBybWRpciAvcyAvcQorIUVMU0UKK05VTEw9bnVsCitERUxfVFJFRSA9IGRlbHRyZWUgL3kKKyFFTkRJRgorCitDTEVBTjoKKwktQGlmIGV4aXN0ICQoSU5URElSKVwkKE5VTEwpICQoREVMX1RSRUUpICQoSU5URElSKQorCS1AaWYgZXhpc3QgQmNjVzE2LmNmZyBlcmFzZSBCY2NXMTYuY2ZnCisJLUBpZiBleGlzdCBndmltMTYuZXhlIGVyYXNlIGd2aW0xNi5leGUKZGlmZiAtLWdpdCBhL3NyYy9SRUFETUUudHh0IGIvc3JjL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViODY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTQwIEBACitSRUFETUUgZm9yIHRoZSBWaW0gc291cmNlIGNvZGUKKworSGVyZSBhcmUgYSBmZXcgaGludHMgZm9yIGZpbmRpbmcgeW91ciB3YXkgYXJvdW5kIHRoZSBzb3VyY2UgY29kZS4gIFRoaXMKK2RvZXNuJ3QgbWFrZSBpdCBsZXNzIGNvbXBsZXggdGhhbiBpdCBpcywgYnV0IGl0IGdldHMgeW91IHN0YXJ0ZWQuCisKK1lvdSBtaWdodCBhbHNvIHdhbnQgdG8gcmVhZCAiOmhlbHAgZGV2ZWxvcG1lbnQiLgorCisKK0pVTVBJTkcgQVJPVU5ECisKK0ZpcnN0IG9mIGFsbCwgdXNlICI6bWFrZSB0YWdzIiB0byBnZW5lcmF0ZSBhIHRhZ3MgZmlsZSwgc28gdGhhdCB5b3UgY2FuIHVzZQordGhlICI6dGFnIiBjb21tYW5kIHRvIGp1bXAgYXJvdW5kIHRoZSBzb3VyY2UgY29kZS4KKworVG8ganVtcCB0byBhIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGRlZmluaXRpb24sIG1vdmUgdGhlIGN1cnNvciBvbiB0aGUgbmFtZSBhbmQKK3VzZSB0aGUgQ1RSTC1dIGNvbW1hbmQuICBVc2UgQ1RSTC1UIG9yIENUUkwtTyB0byBqdW1wIGJhY2suCisKK1RvIGp1bXAgdG8gYSBmaWxlLCBtb3ZlIHRoZSBjdXJzb3Igb24gaXRzIG5hbWUgYW5kIHVzZSB0aGUgImdmIiBjb21tYW5kLgorCitNb3N0IGNvZGUgY2FuIGJlIGZvdW5kIGluIGEgZmlsZSB3aXRoIGFuIG9idmlvdXMgbmFtZSAoaW5jb21wbGV0ZSBsaXN0KToKKwlidWZmZXIuYwltYW5pcHVsYXRpbmcgYnVmZmVycyAobG9hZGVkIGZpbGVzKQorCWRpZmYuYwkJZGlmZiBtb2RlICh2aW1kaWZmKQorCWV2YWwuYwkJZXhwcmVzc2lvbiBldmFsdWF0aW9uCisJZmlsZWlvLmMJcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcworCWZvbGQuYwkJZm9sZGluZworCWdldGNoYXIuYwlnZXR0aW5nIGNoYXJhY3RlcnMgYW5kIGtleSBtYXBwaW5nCisJbWFyay5jCQltYXJrcworCW1lbWZpbGUuYwlzdG9yaW5nIGxpbmVzIGZvciBidWZmZXJzIGluIGEgc3dhcGZpbGUKKwltZW1saW5lLmMJc3RvcmluZyBsaW5lcyBmb3IgYnVmZmVycyBpbiBtZW1vcnkKKwltZW51LmMJCW1lbnVzCisJbWVzc2FnZS5jCShlcnJvcikgbWVzc2FnZXMKKwltYnl0ZS5jCQltdWx0eS1ieXRlIGNoYXJhY3RlciBoYW5kbGluZworCW9wcy5jCQloYW5kbGluZyBvcGVyYXRvcnMgKCJkIiwgInkiLCAicCIpCisJb3B0aW9uLmMJb3B0aW9ucworCXF1aWNrZml4LmMJcXVpY2tmaXggY29tbWFuZHMgKCI6bWFrZSIsICI6Y24iKQorCXNjcmVlbi5jCXVwZGF0aW5nIHRoZSB3aW5kb3dzCisJc2VhcmNoLmMJcGF0dGVybiBzZWFyY2hpbmcKKwl0YWcuYwkJdGFncworCXRlcm0uYwkJdGVybWluYWwgaGFuZGxpbmcsIHRlcm1jYXAgY29kZXMKKwl1bmRvLmMJCXVuZG8gYW5kIHJlZG8KKwl3aW5kb3cuYwloYW5kbGluZyBzcGxpdCB3aW5kb3dzCisKKworSU1QT1JUQU5UIFZBUklBQkxFUworCitUaGUgY3VycmVudCBtb2RlIGlzIHN0b3JlZCBpbiAiU3RhdGUiLiAgVGhlIHZhbHVlcyBpdCBjYW4gaGF2ZSBhcmUgTk9STUFMLAorSU5TRVJULCBDTURMSU5FLCBhbmQgYSBmZXcgb3RoZXJzLgorCitUaGUgY3VycmVudCB3aW5kb3cgaXMgImN1cndpbiIuICBUaGUgY3VycmVudCBidWZmZXIgaXMgImN1cmJ1ZiIuICBUaGVzZSBwb2ludAordG8gc3RydWN0dXJlcyB3aXRoIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHdpbmRvdywgb3B0aW9uIHZhbHVlcywgdGhlIGZpbGUKK25hbWUsIGV0Yy4gIFRoZXNlIGFyZSBkZWZpbmVkIGluIHN0cnVjdHMuaC4KKworQWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIGFyZSBkZWNsYXJlZCBpbiBnbG9iYWxzLmguCisKKworVEhFIE1BSU4gTE9PUAorCitUaGlzIGlzIGNvbnZlbmllbnRseSBjYWxsZWQgbWFpbl9sb29wKCkuICBJdCB1cGRhdGVzIGEgZmV3IHRoaW5ncyBhbmQgdGhlbgorY2FsbHMgbm9ybWFsX2NtZCgpIHRvIHByb2Nlc3MgYSBjb21tYW5kLiAgVGhpcyByZXR1cm5zIHdoZW4gdGhlIGNvbW1hbmQgaXMKK2ZpbmlzaGVkLgorCitUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IFZpbSB3YWl0cyBmb3IgdGhlIHVzZXIgdG8gdHlwZSBhIGNoYXJhY3RlciBhbmQKK3Byb2Nlc3NlcyBpdCB1bnRpbCBhbm90aGVyIGNoYXJhY3RlciBpcyBuZWVkZWQuICBUaHVzIHRoZXJlIGFyZSBzZXZlcmFsIHBsYWNlcword2hlcmUgVmltIHdhaXRzIGZvciBhIGNoYXJhY3RlciB0byBiZSB0eXBlZC4gIFRoZSB2Z2V0YygpIGZ1bmN0aW9uIGlzIHVzZWQgZm9yCit0aGlzLiAgSXQgYWxzbyBoYW5kbGVzIG1hcHBpbmcuCisKK1VwZGF0aW5nIHRoZSBzY3JlZW4gaXMgbW9zdGx5IHBvc3Rwb25lZCB1bnRpbCBhIGNvbW1hbmQgb3IgYSBzZXF1ZW5jZSBvZgorY29tbWFuZHMgaGFzIGZpbmlzaGVkLiAgVGhlIHdvcmsgaXMgZG9uZSBieSB1cGRhdGVfc2NyZWVuKCksIHdoaWNoIGNhbGxzCit3aW5fdXBkYXRlKCkgZm9yIGV2ZXJ5IHdpbmRvdywgd2hpY2ggY2FsbHMgd2luX2xpbmUoKSBmb3IgZXZlcnkgbGluZS4KK1NlZSB0aGUgc3RhcnQgb2Ygc2NyZWVuLmMgZm9yIG1vcmUgZXhwbGFuYXRpb25zLgorCisKK0NPTU1BTkQtTElORSBNT0RFCisKK1doZW4gdHlwaW5nIGEgIjoiLCBub3JtYWxfY21kKCkgd2lsbCBjYWxsIGdldGNtZGxpbmUoKSB0byBvYnRhaW4gYSBsaW5lIHdpdGgKK2FuIEV4IGNvbW1hbmQuICBnZXRjbWRsaW5lKCkgY29udGFpbnMgYSBsb29wIHRoYXQgd2lsbCBoYW5kbGUgZWFjaCB0eXBlZAorY2hhcmFjdGVyLiAgSXQgcmV0dXJucyB3aGVuIGhpdHRpbmcgPENSPiBvciA8RXNjPiBvciBzb21lIG90aGVyIGNoYXJhY3RlciB0aGF0CitlbmRzIHRoZSBjb21tYW5kIGxpbmUgbW9kZS4KKworCitFWCBDT01NQU5EUworCitFeCBjb21tYW5kcyBhcmUgaGFuZGxlZCBieSB0aGUgZnVuY3Rpb24gZG9fY21kbGluZSgpLiAgSXQgZG9lcyB0aGUgZ2VuZXJpYworcGFyc2luZyBvZiB0aGUgIjoiIGNvbW1hbmQgbGluZSBhbmQgY2FsbHMgZG9fb25lX2NtZCgpIGZvciBlYWNoIHNlcGFyYXRlCitjb21tYW5kLiAgSXQgYWxzbyB0YWtlcyBjYXJlIG9mIHdoaWxlIGxvb3BzLgorCitkb19vbmVfY21kKCkgcGFyc2VzIHRoZSByYW5nZSBhbmQgZ2VuZXJpYyBhcmd1bWVudHMgYW5kIHB1dHMgdGhlbSBpbiB0aGUKK2V4YXJnX3QgYW5kIHBhc3NlcyBpdCB0byB0aGUgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRoZSBjb21tYW5kLgorCitUaGUgIjoiIGNvbW1hbmRzIGFyZSBsaXN0ZWQgaW4gZXhfY21kcy5oLiAgVGhlIHRoaXJkIGVudHJ5IG9mIGVhY2ggaXRlbSBpcyB0aGUKK25hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgY29tbWFuZC4gIFRoZSBsYXN0IGVudHJ5IGFyZSB0aGUgZmxhZ3MKK3RoYXQgYXJlIHVzZWQgZm9yIHRoZSBjb21tYW5kLgorCisKK05PUk1BTCBNT0RFIENPTU1BTkRTCisKK1RoZSBOb3JtYWwgbW9kZSBjb21tYW5kcyBhcmUgaGFuZGxlZCBieSB0aGUgbm9ybWFsX2NtZCgpIGZ1bmN0aW9uLiAgSXQgYWxzbworaGFuZGxlcyB0aGUgb3B0aW9uYWwgY291bnQgYW5kIGFuIGV4dHJhIGNoYXJhY3RlciBmb3Igc29tZSBjb21tYW5kcy4gIFRoZXNlCithcmUgcGFzc2VkIGluIGEgY21kYXJnX3QgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgY29tbWFuZC4KKworVGhlcmUgaXMgYSB0YWJsZSBudl9jbWRzIGluIG5vcm1hbC5jIHdoaWNoIGxpc3RzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZXZlcnkKK2NvbW1hbmQuICBUaGUgc2Vjb25kIGVudHJ5IG9mIGVhY2ggaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdAoraGFuZGxlcyB0aGUgY29tbWFuZC4KKworCitJTlNFUlQgTU9ERSBDT01NQU5EUworCitXaGVuIGRvaW5nIGFuICJpIiBvciAiYSIgY29tbWFuZCwgbm9ybWFsX2NtZCgpIHdpbGwgY2FsbCB0aGUgZWRpdCgpIGZ1bmN0aW9uLgorSXQgY29udGFpbnMgYSBsb29wIHRoYXQgd2FpdHMgZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgaGFuZGxlcyBpdC4gIEl0CityZXR1cm5zIHdoZW4gbGVhdmluZyBJbnNlcnQgbW9kZS4KKworCitPUFRJT05TCisKK1RoZXJlIGlzIGEgbGlzdCB3aXRoIGFsbCBvcHRpb24gbmFtZXMgaW4gb3B0aW9uLmMsIGNhbGxlZCBvcHRpb25zW10uCisKKworVEhFIEdVSQorCitNb3N0IG9mIHRoZSBHVUkgY29kZSBpcyBpbXBsZW1lbnRlZCBsaWtlIGl0IHdhcyBhIGNsZXZlciB0ZXJtaW5hbC4gIFR5cGluZyBhCitjaGFyYWN0ZXIsIG1vdmluZyBhIHNjcm9sbGJhciwgY2xpY2tpbmcgdGhlIG1vdXNlLCBldGMuIGFyZSBhbGwgdHJhbnNsYXRlZAoraW50byBldmVudHMgd2hpY2ggYXJlIHdyaXR0ZW4gaW4gdGhlIGlucHV0IGJ1ZmZlci4gIFRoZXNlIGFyZSByZWFkIGJ5IHRoZQorbWFpbiBjb2RlLCBqdXN0IGxpa2UgcmVhZGluZyBmcm9tIGEgdGVybWluYWwuICBUaGUgY29kZSBmb3IgdGhpcyBpcyBzY2F0dGVyZWQKK3Rocm91Z2ggZ3VpLmMuICBGb3IgZXhhbXBsZTogZ3VpX3NlbmRfbW91c2VfZXZlbnQoKSBmb3IgYSBtb3VzZSBjbGljayBhbmQKK2d1aV9tZW51X2NiKCkgZm9yIGEgbWVudSBhY3Rpb24uICBLZXkgaGl0cyBhcmUgaGFuZGxlZCBieSB0aGUgc3lzdGVtLXNwZWNpZmljCitHVUkgY29kZSwgd2hpY2ggY2FsbHMgYWRkX3RvX2lucHV0X2J1ZigpIHRvIHNlbmQgdGhlIGtleSBjb2RlLgorCitVcGRhdGluZyB0aGUgR1VJIHdpbmRvdyBpcyBkb25lIGJ5IHdyaXRpbmcgY29kZXMgaW4gdGhlIG91dHB1dCBidWZmZXIsIGp1c3QKK2xpa2Ugd3JpdGluZyB0byBhIHRlcm1pbmFsLiAgV2hlbiB0aGUgYnVmZmVyIGdldHMgZnVsbCBvciBpcyBmbHVzaGVkLAorZ3VpX3dyaXRlKCkgd2lsbCBwYXJzZSB0aGUgY29kZXMgYW5kIGRyYXcgdGhlIGFwcHJvcHJpYXRlIGl0ZW1zLiAgRmluYWxseSB0aGUKK3N5c3RlbS1zcGVjaWZpYyBHVUkgY29kZSB3aWxsIGJlIGNhbGxlZCB0byBkbyB0aGUgd29yay4KKworCitERUJVR0dJTkcgVEhFIEdVSQorCitSZW1lbWJlciB0byBwcmV2ZW50IHRoYXQgZ3ZpbSBmb3JrcyBhbmQgdGhlIGRlYnVnZ2VyIHRoaW5rcyBWaW0gaGFzIGV4aXRlZCwKK2FkZCB0aGUgIi1mIiBhcmd1bWVudC4gIEluIGdkYjogInJ1biAtZiAtZyIuCisKK1doZW4gc3RlcHBpbmcgdGhyb3VnaCBkaXNwbGF5IHVwZGF0aW5nIGNvZGUsIHRoZSBmb2N1cyBldmVudCBpcyB0cmlnZ2VycmVkCit3aGVuIGdvaW5nIGZyb20gdGhlIGRlYnVnZ2VyIHRvIFZpbSBhbmQgYmFjay4gIFRvIGF2b2lkIHRoaXMsIHJlY29tcGlsZSB3aXRoCitzb21lIGNvZGUgaW4gZ3VpX2ZvY3VzX2NoYW5nZSgpIGRpc2FibGVkLgpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9Db21tYW5kcy5jcHAgYi9zcmMvVmlzVmltL0NvbW1hbmRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTRiN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9Db21tYW5kcy5jcHAKQEAgLTAsMCArMSw2OTMgQEAKKyNpbmNsdWRlICJzdGRhZnguaCIKKyNpbmNsdWRlIDxjb21kZWYuaD4JLy8gRm9yIF9ic3RyX3QKKyNpbmNsdWRlICJWaXNWaW0uaCIKKyNpbmNsdWRlICJDb21tYW5kcy5oIgorI2luY2x1ZGUgIk9sZUF1dC5oIgorCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIG5ldyBERUJVR19ORVcKKyN1bmRlZiBUSElTX0ZJTEUKK3N0YXRpYyBjaGFyIFRISVNfRklMRVtdID0gX19GSUxFX187CisKKyNlbmRpZgorCisKKy8vIENoYW5nZSBkaXJlY3RvcnkgYmVmb3JlIG9wZW5pbmcgZmlsZT8KKyNkZWZpbmUgQ0RfU09VUkNFCQkwCS8vIENkIHRvIHNvdXJjZSBwYXRoCisjZGVmaW5lIENEX1NPVVJDRV9QQVJFTlQJMQkvLyBDZCB0byBwYXJlbnQgZGlyZWN0b3J5IG9mIHNvdXJjZSBwYXRoCisjZGVmaW5lIENEX05PTkUJCQkyCS8vIE5vIGNkCisKKworc3RhdGljIEJPT0wgZ19iRW5hYmxlVmltID0gVFJVRTsJLy8gVmltIGVuYWJsZWQKK3N0YXRpYyBCT09MIGdfYkRldlN0dWRpb0VkaXRvciA9IEZBTFNFOwkvLyBPcGVuIGZpbGUgaW4gRGV2IFN0dWRpbyBlZGl0b3Igc2ltdWx0YW5lb3VzbHkKK3N0YXRpYyBpbnQgZ19DaGFuZ2VEaXIgPSBDRF9OT05FOwkvLyBDRCBhZnRlciBmaWxlIG9wZW4/CisKK3N0YXRpYyB2b2lkIFZpbVNldEVuYWJsZVN0YXRlIChCT09MIGJFbmFibGVTdGF0ZSk7CitzdGF0aWMgQk9PTCBWaW1PcGVuRmlsZSAoQlNUUiYgRmlsZU5hbWUsIGxvbmcgTGluZU5yKTsKK3N0YXRpYyBESVNQSUQgVmltR2V0RGlzcGF0Y2hJZCAoQ09sZUF1dG9tYXRpb25Db250cm9sJiBWaW1PbGUsIGNoYXIqIE1ldGhvZCk7CitzdGF0aWMgdm9pZCBWaW1FcnJEaWFnIChDT2xlQXV0b21hdGlvbkNvbnRyb2wmIFZpbU9sZSk7CitzdGF0aWMgdm9pZCBWaW1DaGFuZ2VEaXIgKENPbGVBdXRvbWF0aW9uQ29udHJvbCYgVmltT2xlLCBESVNQSUQgRGlzcGF0Y2hJZCwgQlNUUiYgRmlsZU5hbWUpOworc3RhdGljIHZvaWQgRGVidWdNc2cgKGNoYXIqIE1zZywgY2hhciogQXJnID0gTlVMTCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENDb21tYW5kcworCitDQ29tbWFuZHM6OkNDb21tYW5kcyAoKQoreworCS8vIG1fcEFwcGxpY2F0aW9uID09IE5VTEw7IE0kIENvZGUgZ2VuZXJhdGlvbiBidWchISEKKwltX3BBcHBsaWNhdGlvbiA9IE5VTEw7CisJbV9wQXBwbGljYXRpb25FdmVudHNPYmogPSBOVUxMOworCW1fcERlYnVnZ2VyRXZlbnRzT2JqID0gTlVMTDsKK30KKworQ0NvbW1hbmRzOjp+Q0NvbW1hbmRzICgpCit7CisJQVNTRVJUIChtX3BBcHBsaWNhdGlvbiAhPSBOVUxMKTsKKwlpZiAobV9wQXBwbGljYXRpb24pCisJeworCQltX3BBcHBsaWNhdGlvbi0+UmVsZWFzZSAoKTsKKwkJbV9wQXBwbGljYXRpb24gPSBOVUxMOworCX0KK30KKwordm9pZCBDQ29tbWFuZHM6OlNldEFwcGxpY2F0aW9uT2JqZWN0IChJQXBwbGljYXRpb24gKiBwQXBwbGljYXRpb24pCit7CisJLy8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIEFkZFJlZidkCisJLy8gZm9yIHVzLCB3aGljaCBDRFNBZGRJbiBkaWQgaW4gaXRzIFF1ZXJ5SW50ZXJmYWNlIGNhbGwKKwkvLyBqdXN0IGJlZm9yZSBpdCBjYWxsZWQgdXMuCisJbV9wQXBwbGljYXRpb24gPSBwQXBwbGljYXRpb247CisJaWYgKCEgbV9wQXBwbGljYXRpb24pCisJCXJldHVybjsKKworCS8vIENyZWF0ZSBBcHBsaWNhdGlvbiBldmVudCBoYW5kbGVycworCVhBcHBsaWNhdGlvbkV2ZW50c09iajo6Q3JlYXRlSW5zdGFuY2UgKCZtX3BBcHBsaWNhdGlvbkV2ZW50c09iaik7CisJaWYgKCEgbV9wQXBwbGljYXRpb25FdmVudHNPYmopCisJeworCQlSZXBvcnRJbnRlcm5hbEVycm9yICgiWEFwcGxpY2F0aW9uRXZlbnRzT2JqOjpDcmVhdGVJbnN0YW5jZSIpOworCQlyZXR1cm47CisJfQorCW1fcEFwcGxpY2F0aW9uRXZlbnRzT2JqLT5BZGRSZWYgKCk7CisJbV9wQXBwbGljYXRpb25FdmVudHNPYmotPkNvbm5lY3QgKG1fcEFwcGxpY2F0aW9uKTsKKwltX3BBcHBsaWNhdGlvbkV2ZW50c09iai0+bV9wQ29tbWFuZHMgPSB0aGlzOworCisjaWZkZWYgTkVWRVIKKwkvLyBDcmVhdGUgRGVidWdnZXIgZXZlbnQgaGFuZGxlcgorCUNDb21QdHIgPCBJRGlzcGF0Y2ggPiBwRGVidWdnZXI7CisJaWYgKFNVQ0NFRURFRCAobV9wQXBwbGljYXRpb24tPmdldF9EZWJ1Z2dlciAoJnBEZWJ1Z2dlcikpCisJICAgICYmIHBEZWJ1Z2dlciAhPSBOVUxMKQorCXsKKwkJWERlYnVnZ2VyRXZlbnRzT2JqOjpDcmVhdGVJbnN0YW5jZSAoJm1fcERlYnVnZ2VyRXZlbnRzT2JqKTsKKwkJbV9wRGVidWdnZXJFdmVudHNPYmotPkFkZFJlZiAoKTsKKwkJbV9wRGVidWdnZXJFdmVudHNPYmotPkNvbm5lY3QgKHBEZWJ1Z2dlcik7CisJCW1fcERlYnVnZ2VyRXZlbnRzT2JqLT5tX3BDb21tYW5kcyA9IHRoaXM7CisJfQorI2VuZGlmCisKKwkvLyBHZXQgc2V0dGluZ3MgZnJvbSByZWdpc3RyeSBIS0VZX0NVUlJFTlRfVVNFUlxTb2Z0d2FyZVxWaW1cVmlzVmltCisJSEtFWSBoQXBwS2V5ID0gR2V0QXBwS2V5ICgiVmltIik7CisJaWYgKGhBcHBLZXkpCisJeworCQlIS0VZIGhTZWN0aW9uS2V5ID0gR2V0U2VjdGlvbktleSAoaEFwcEtleSwgIlZpc1ZpbSIpOworCQlpZiAoaFNlY3Rpb25LZXkpCisJCXsKKwkJCWdfYkVuYWJsZVZpbSA9IEdldFJlZ2lzdHJ5SW50IChoU2VjdGlvbktleSwgIkVuYWJsZVZpbSIsCisJCQkJCQkgICAgICAgZ19iRW5hYmxlVmltKTsKKwkJCWdfYkRldlN0dWRpb0VkaXRvciA9IEdldFJlZ2lzdHJ5SW50KGhTZWN0aW9uS2V5LCJEZXZTdHVkaW9FZGl0b3IiLAorCQkJCQkJCSAgICBnX2JEZXZTdHVkaW9FZGl0b3IpOworCQkJZ19DaGFuZ2VEaXIgPSBHZXRSZWdpc3RyeUludCAoaFNlY3Rpb25LZXksICJDaGFuZ2VEaXIiLAorCQkJCQkJICAgICAgZ19DaGFuZ2VEaXIpOworCQkJUmVnQ2xvc2VLZXkgKGhTZWN0aW9uS2V5KTsKKwkJfQorCQlSZWdDbG9zZUtleSAoaEFwcEtleSk7CisJfQorfQorCit2b2lkIENDb21tYW5kczo6VW5hZHZpc2VGcm9tRXZlbnRzICgpCit7CisJQVNTRVJUIChtX3BBcHBsaWNhdGlvbkV2ZW50c09iaiAhPSBOVUxMKTsKKwlpZiAobV9wQXBwbGljYXRpb25FdmVudHNPYmopCisJeworCQltX3BBcHBsaWNhdGlvbkV2ZW50c09iai0+RGlzY29ubmVjdCAobV9wQXBwbGljYXRpb24pOworCQltX3BBcHBsaWNhdGlvbkV2ZW50c09iai0+UmVsZWFzZSAoKTsKKwkJbV9wQXBwbGljYXRpb25FdmVudHNPYmogPSBOVUxMOworCX0KKworI2lmZGVmIE5FVkVSCisJaWYgKG1fcERlYnVnZ2VyRXZlbnRzT2JqKQorCXsKKwkJLy8gU2luY2Ugd2Ugd2VyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIERlYnVnZ2VyIGV2ZW50cywgd2UKKwkJLy8gc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBEZWJ1Z2dlciBvYmplY3QgYWdhaW4gdG8KKwkJLy8gdW5hZHZpc2UgZnJvbSBpdHMgZXZlbnRzICh0aHVzIHRoZSBWRVJJRllfT0sgYmVsb3ctLXNlZQorCQkvLyBzdGRhZnguaCkuCisJCUNDb21QdHIgPCBJRGlzcGF0Y2ggPiBwRGVidWdnZXI7CisJCVZFUklGWV9PSyAobV9wQXBwbGljYXRpb24tPmdldF9EZWJ1Z2dlciAoJnBEZWJ1Z2dlcikpOworCQlBU1NFUlQgKHBEZWJ1Z2dlciAhPSBOVUxMKTsKKwkJbV9wRGVidWdnZXJFdmVudHNPYmotPkRpc2Nvbm5lY3QgKHBEZWJ1Z2dlcik7CisJCW1fcERlYnVnZ2VyRXZlbnRzT2JqLT5SZWxlYXNlICgpOworCQltX3BEZWJ1Z2dlckV2ZW50c09iaiA9IE5VTEw7CisJfQorI2VuZGlmCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEV2ZW50IGhhbmRsZXJzCisKKy8vIEFwcGxpY2F0aW9uIGV2ZW50cworCitIUkVTVUxUIENDb21tYW5kczo6WEFwcGxpY2F0aW9uRXZlbnRzOjpCZWZvcmVCdWlsZFN0YXJ0ICgpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBTX09LOworfQorCitIUkVTVUxUIENDb21tYW5kczo6WEFwcGxpY2F0aW9uRXZlbnRzOjpCdWlsZEZpbmlzaCAobG9uZyBuTnVtRXJyb3JzLCBsb25nIG5OdW1XYXJuaW5ncykKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisJcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ0NvbW1hbmRzOjpYQXBwbGljYXRpb25FdmVudHM6OkJlZm9yZUFwcGxpY2F0aW9uU2h1dERvd24gKCkKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisJcmV0dXJuIFNfT0s7Cit9CisKKy8vIFRoZSBvcGVuIGRvY3VtZW50IGV2ZW50IGhhbmRsZSBpcyB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlYWwgaW50ZXJmYWNlIHdvcmsKKy8vIGlzIGRvbmUuCisvLyBWaW0gZ2V0cyBjYWxsZWQgZnJvbSBoZXJlLgorLy8KK0hSRVNVTFQgQ0NvbW1hbmRzOjpYQXBwbGljYXRpb25FdmVudHM6OkRvY3VtZW50T3BlbiAoSURpc3BhdGNoICogdGhlRG9jdW1lbnQpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCisJaWYgKCEgZ19iRW5hYmxlVmltKQorCQkvLyBWaW0gbm90IGVuYWJsZWQgb3IgZW1wdHkgY29tbWFuZCBsaW5lIGVudGVyZWQKKwkJcmV0dXJuIFNfT0s7CisKKwkvLyBGaXJzdCBnZXQgdGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorCisJLy8gR2V0IHRoZSBkb2N1bWVudCBvYmplY3QKKwlDQ29tUUlQdHIgPCBJVGV4dERvY3VtZW50LCAmSUlEX0lUZXh0RG9jdW1lbnQgPiBwRG9jICh0aGVEb2N1bWVudCk7CisJaWYgKCEgcERvYykKKwkJcmV0dXJuIFNfT0s7CisKKwlCU1RSIEZpbGVOYW1lOworCWxvbmcgTGluZU5yID0gLTE7CisKKwkvLyBHZXQgdGhlIGRvY3VtZW50IG5hbWUKKwlpZiAoRkFJTEVEIChwRG9jLT5nZXRfRnVsbE5hbWUgKCZGaWxlTmFtZSkpKQorCQlyZXR1cm4gU19PSzsKKworCUxQRElTUEFUQ0ggcERpc3BTZWw7CisKKwkvLyBHZXQgYSBzZWxlY3Rpb24gb2JqZWN0IGRpc3BhdGNoIHBvaW50ZXIKKwlpZiAoU1VDQ0VFREVEIChwRG9jLT5nZXRfU2VsZWN0aW9uICgmcERpc3BTZWwpKSkKKwl7CisJCS8vIEdldCB0aGUgc2VsZWN0aW9uIG9iamVjdAorCQlDQ29tUUlQdHIgPCBJVGV4dFNlbGVjdGlvbiwgJklJRF9JVGV4dFNlbGVjdGlvbiA+IHBTZWwgKHBEaXNwU2VsKTsKKworCQlpZiAocFNlbCkKKwkJCS8vIEdldCB0aGUgc2VsZWN0aW9uIGxpbmUgbnVtYmVyCisJCQlwU2VsLT5nZXRfQ3VycmVudExpbmUgKCZMaW5lTnIpOworCisJCXBEaXNwU2VsLT5SZWxlYXNlICgpOworCX0KKworCS8vIE9wZW4gdGhlIGZpbGUgaW4gVmltIGFuZCBwb3NpdGlvbiB0byB0aGUgY3VycmVudCBsaW5lCisJaWYgKFZpbU9wZW5GaWxlIChGaWxlTmFtZSwgTGluZU5yKSkKKwl7CisJCWlmICghIGdfYkRldlN0dWRpb0VkaXRvcikKKwkJeworCQkJLy8gQ2xvc2UgdGhlIGRvY3VtZW50IGluIGRldmVsb3BlciBzdHVkaW8KKwkJCUNDb21WYXJpYW50IHZTYXZlQ2hhbmdlcyA9IGRzU2F2ZUNoYW5nZXNQcm9tcHQ7CisJCQlEc1NhdmVTdGF0dXMgU2F2ZWQ7CisKKwkJCXBEb2MtPkNsb3NlICh2U2F2ZUNoYW5nZXMsICZTYXZlZCk7CisJCX0KKwl9CisKKwkvLyBXZSdyZSBkb25lIGhlcmUKKwlTeXNGcmVlU3RyaW5nIChGaWxlTmFtZSk7CisJcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ0NvbW1hbmRzOjpYQXBwbGljYXRpb25FdmVudHM6OkJlZm9yZURvY3VtZW50Q2xvc2UgKElEaXNwYXRjaCAqIHRoZURvY3VtZW50KQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKwlyZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBDQ29tbWFuZHM6OlhBcHBsaWNhdGlvbkV2ZW50czo6RG9jdW1lbnRTYXZlIChJRGlzcGF0Y2ggKiB0aGVEb2N1bWVudCkKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisJcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ0NvbW1hbmRzOjpYQXBwbGljYXRpb25FdmVudHM6Ok5ld0RvY3VtZW50IChJRGlzcGF0Y2ggKiB0aGVEb2N1bWVudCkKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisKKwlpZiAoISBnX2JFbmFibGVWaW0pCisJCS8vIFZpbSBub3QgZW5hYmxlZCBvciBlbXB0eSBjb21tYW5kIGxpbmUgZW50ZXJlZAorCQlyZXR1cm4gU19PSzsKKworCS8vIEZpcnN0IGdldCB0aGUgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisKKwlDQ29tUUlQdHIgPCBJVGV4dERvY3VtZW50LCAmSUlEX0lUZXh0RG9jdW1lbnQgPiBwRG9jICh0aGVEb2N1bWVudCk7CisJaWYgKCEgcERvYykKKwkJcmV0dXJuIFNfT0s7CisKKwlCU1RSIEZpbGVOYW1lOworCUhSRVNVTFQgaHI7CisKKwlociA9IHBEb2MtPmdldF9GdWxsTmFtZSAoJkZpbGVOYW1lKTsKKwlpZiAoRkFJTEVEIChocikpCisJCXJldHVybiBTX09LOworCisJLy8gT3BlbiB0aGUgZmlsZSBpbiBWaW0gYW5kIHBvc2l0aW9uIHRvIHRoZSBjdXJyZW50IGxpbmUKKwlpZiAoVmltT3BlbkZpbGUgKEZpbGVOYW1lLCAwKSkKKwl7CisJCWlmICghIGdfYkRldlN0dWRpb0VkaXRvcikKKwkJeworCQkJLy8gQ2xvc2UgdGhlIGRvY3VtZW50IGluIGRldmVsb3BlciBzdHVkaW8KKwkJCUNDb21WYXJpYW50IHZTYXZlQ2hhbmdlcyA9IGRzU2F2ZUNoYW5nZXNQcm9tcHQ7CisJCQlEc1NhdmVTdGF0dXMgU2F2ZWQ7CisKKwkJCXBEb2MtPkNsb3NlICh2U2F2ZUNoYW5nZXMsICZTYXZlZCk7CisJCX0KKwl9CisKKwlTeXNGcmVlU3RyaW5nIChGaWxlTmFtZSk7CisJcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgQ0NvbW1hbmRzOjpYQXBwbGljYXRpb25FdmVudHM6OldpbmRvd0FjdGl2YXRlIChJRGlzcGF0Y2ggKiB0aGVXaW5kb3cpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBTX09LOworfQorCitIUkVTVUxUIENDb21tYW5kczo6WEFwcGxpY2F0aW9uRXZlbnRzOjpXaW5kb3dEZWFjdGl2YXRlIChJRGlzcGF0Y2ggKiB0aGVXaW5kb3cpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBTX09LOworfQorCitIUkVTVUxUIENDb21tYW5kczo6WEFwcGxpY2F0aW9uRXZlbnRzOjpXb3Jrc3BhY2VPcGVuICgpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBTX09LOworfQorCitIUkVTVUxUIENDb21tYW5kczo6WEFwcGxpY2F0aW9uRXZlbnRzOjpXb3Jrc3BhY2VDbG9zZSAoKQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKwlyZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBDQ29tbWFuZHM6OlhBcHBsaWNhdGlvbkV2ZW50czo6TmV3V29ya3NwYWNlICgpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBTX09LOworfQorCisvLyBEZWJ1Z2dlciBldmVudAorCitIUkVTVUxUIENDb21tYW5kczo6WERlYnVnZ2VyRXZlbnRzOjpCcmVha3BvaW50SGl0IChJRGlzcGF0Y2ggKiBwQnJlYWtwb2ludCkKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisJcmV0dXJuIFNfT0s7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc1ZpbSBkaWFsb2cKKworY2xhc3MgQ01haW5EaWFsb2cgOiBwdWJsaWMgQ0RpYWxvZworeworICAgIHB1YmxpYzoKKwlDTWFpbkRpYWxvZyAoQ1duZCAqIHBQYXJlbnQgPSBOVUxMKTsJLy8gU3RhbmRhcmQgY29uc3RydWN0b3IKKworCS8ve3tBRlhfREFUQShDTWFpbkRpYWxvZykKKwllbnVtIHsgSUREID0gSUREX0FERElOTUFJTiB9OworCWludAltX0NoYW5nZURpcjsKKwlCT09MCW1fYkRldlN0dWRpb0VkaXRvcjsKKwkvL319QUZYX0RBVEEKKworCS8ve3tBRlhfVklSVFVBTChDTWFpbkRpYWxvZykKKyAgICBwcm90ZWN0ZWQ6CisJdmlydHVhbCB2b2lkIERvRGF0YUV4Y2hhbmdlIChDRGF0YUV4Y2hhbmdlICogcERYKTsJLy8gRERYL0REViBzdXBwb3J0CisJLy99fUFGWF9WSVJUVUFMCisKKyAgICBwcm90ZWN0ZWQ6CisJLy97e0FGWF9NU0coQ01haW5EaWFsb2cpCisJYWZ4X21zZyB2b2lkIE9uRW5hYmxlKCk7CisJYWZ4X21zZyB2b2lkIE9uRGlzYWJsZSgpOworCS8vfX1BRlhfTVNHCisJREVDTEFSRV9NRVNTQUdFX01BUCAoKQorfTsKKworQ01haW5EaWFsb2c6OkNNYWluRGlhbG9nIChDV25kICogcFBhcmVudCAvKiA9TlVMTCAqLyApCisJOiBDRGlhbG9nIChDTWFpbkRpYWxvZzo6SURELCBwUGFyZW50KQoreworCS8ve3tBRlhfREFUQV9JTklUKENNYWluRGlhbG9nKQorCW1fQ2hhbmdlRGlyID0gLTE7CisJbV9iRGV2U3R1ZGlvRWRpdG9yID0gRkFMU0U7CisJLy99fUFGWF9EQVRBX0lOSVQKK30KKwordm9pZCBDTWFpbkRpYWxvZzo6RG9EYXRhRXhjaGFuZ2UgKENEYXRhRXhjaGFuZ2UgKiBwRFgpCit7CisJQ0RpYWxvZzo6RG9EYXRhRXhjaGFuZ2UgKHBEWCk7CisJLy97e0FGWF9EQVRBX01BUChDTWFpbkRpYWxvZykKKwlERFhfUmFkaW8ocERYLCBJRENfQ0RfU09VUkNFX1BBVEgsIG1fQ2hhbmdlRGlyKTsKKwlERFhfQ2hlY2sgKHBEWCwgSURDX0RFVlNUVURJT19FRElUT1IsIG1fYkRldlN0dWRpb0VkaXRvcik7CisJLy99fUFGWF9EQVRBX01BUAorfQorCitCRUdJTl9NRVNTQUdFX01BUCAoQ01haW5EaWFsb2csIENEaWFsb2cpCisJLy97e0FGWF9NU0dfTUFQKENNYWluRGlhbG9nKQorCS8vfX1BRlhfTVNHX01BUAorRU5EX01FU1NBR0VfTUFQICgpCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENDb21tYW5kcyBtZXRob2RzCisKK1NURE1FVEhPRElNUCBDQ29tbWFuZHM6OlZpc1ZpbURpYWxvZyAoKQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKworCS8vIFVzZSBtX3BBcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGhlIERldmVsb3BlciBTdHVkaW8gQXBwbGljYXRpb24KKwkvLyBvYmplY3QsCisJLy8gYW5kIFZFUklGWV9PSyB0byBzZWUgZXJyb3Igc3RyaW5ncyBpbiBERUJVRyBidWlsZHMgb2YgeW91ciBhZGQtaW4KKwkvLyAoc2VlIHN0ZGFmeC5oKQorCisJVkVSSUZZX09LIChtX3BBcHBsaWNhdGlvbi0+RW5hYmxlTW9kZWxlc3MgKFZBUklBTlRfRkFMU0UpKTsKKworCUNNYWluRGlhbG9nIERsZzsKKworCURsZy5tX2JEZXZTdHVkaW9FZGl0b3IgPSBnX2JEZXZTdHVkaW9FZGl0b3I7CisJRGxnLm1fQ2hhbmdlRGlyID0gZ19DaGFuZ2VEaXI7CisJaWYgKERsZy5Eb01vZGFsICgpID09IElET0spCisJeworCQlnX2JEZXZTdHVkaW9FZGl0b3IgPSBEbGcubV9iRGV2U3R1ZGlvRWRpdG9yOworCQlnX0NoYW5nZURpciA9IERsZy5tX0NoYW5nZURpcjsKKworCQkvLyBTYXZlIHNldHRpbmdzIHRvIHJlZ2lzdHJ5IEhLRVlfQ1VSUkVOVF9VU0VSXFNvZnR3YXJlXFZpbVxWaXNWaW0KKwkJSEtFWSBoQXBwS2V5ID0gR2V0QXBwS2V5ICgiVmltIik7CisJCWlmIChoQXBwS2V5KQorCQl7CisJCQlIS0VZIGhTZWN0aW9uS2V5ID0gR2V0U2VjdGlvbktleSAoaEFwcEtleSwgIlZpc1ZpbSIpOworCQkJaWYgKGhTZWN0aW9uS2V5KQorCQkJeworCQkJCVdyaXRlUmVnaXN0cnlJbnQgKGhTZWN0aW9uS2V5LCAiRGV2U3R1ZGlvRWRpdG9yIiwKKwkJCQkJCSAgZ19iRGV2U3R1ZGlvRWRpdG9yKTsKKwkJCQlXcml0ZVJlZ2lzdHJ5SW50IChoU2VjdGlvbktleSwgIkNoYW5nZURpciIsIGdfQ2hhbmdlRGlyKTsKKwkJCQlSZWdDbG9zZUtleSAoaFNlY3Rpb25LZXkpOworCQkJfQorCQkJUmVnQ2xvc2VLZXkgKGhBcHBLZXkpOworCQl9CisJfQorCisJVkVSSUZZX09LIChtX3BBcHBsaWNhdGlvbi0+RW5hYmxlTW9kZWxlc3MgKFZBUklBTlRfVFJVRSkpOworCXJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ0NvbW1hbmRzOjpWaXNWaW1FbmFibGUgKCkKK3sKKwlBRlhfTUFOQUdFX1NUQVRFIChBZnhHZXRTdGF0aWNNb2R1bGVTdGF0ZSAoKSk7CisJVmltU2V0RW5hYmxlU3RhdGUgKHRydWUpOworCXJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ0NvbW1hbmRzOjpWaXNWaW1EaXNhYmxlICgpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCVZpbVNldEVuYWJsZVN0YXRlIChmYWxzZSk7CisJcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUCBDQ29tbWFuZHM6OlZpc1ZpbVRvZ2dsZSAoKQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKwlWaW1TZXRFbmFibGVTdGF0ZSAoISBnX2JFbmFibGVWaW0pOworCXJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAgQ0NvbW1hbmRzOjpWaXNWaW1Mb2FkICgpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCisJLy8gVXNlIG1fcEFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0aGUgRGV2ZWxvcGVyIFN0dWRpbyBBcHBsaWNhdGlvbiBvYmplY3QsCisJLy8gYW5kIFZFUklGWV9PSyB0byBzZWUgZXJyb3Igc3RyaW5ncyBpbiBERUJVRyBidWlsZHMgb2YgeW91ciBhZGQtaW4KKwkvLyAoc2VlIHN0ZGFmeC5oKQorCisJQ0NvbUJTVFIgYlN0cjsKKwkvLyBEZWZpbmUgZGlzcGF0Y2ggcG9pbnRlcnMgZm9yIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24gb2JqZWN0cworCUNDb21QdHIgPCBJRGlzcGF0Y2ggPiBwRGlzcERvYywgcERpc3BTZWw7CisKKwkvLyBHZXQgYSBkb2N1bWVudCBvYmplY3QgZGlzcGF0Y2ggcG9pbnRlcgorCVZFUklGWV9PSyAobV9wQXBwbGljYXRpb24tPmdldF9BY3RpdmVEb2N1bWVudCAoJnBEaXNwRG9jKSk7CisJaWYgKCEgcERpc3BEb2MpCisJCXJldHVybiBTX09LOworCisJQlNUUiBGaWxlTmFtZTsKKwlsb25nIExpbmVOciA9IC0xOworCisJLy8gR2V0IHRoZSBkb2N1bWVudCBvYmplY3QKKwlDQ29tUUlQdHIgPCBJVGV4dERvY3VtZW50LCAmSUlEX0lUZXh0RG9jdW1lbnQgPiBwRG9jIChwRGlzcERvYyk7CisKKwlpZiAoISBwRG9jKQorCQlyZXR1cm4gU19PSzsKKworCS8vIEdldCB0aGUgZG9jdW1lbnQgbmFtZQorCWlmIChGQUlMRUQgKHBEb2MtPmdldF9GdWxsTmFtZSAoJkZpbGVOYW1lKSkpCisJCXJldHVybiBTX09LOworCisJLy8gR2V0IGEgc2VsZWN0aW9uIG9iamVjdCBkaXNwYXRjaCBwb2ludGVyCisJaWYgKFNVQ0NFRURFRCAocERvYy0+Z2V0X1NlbGVjdGlvbiAoJnBEaXNwU2VsKSkpCisJeworCQkvLyBHZXQgdGhlIHNlbGVjdGlvbiBvYmplY3QKKwkJQ0NvbVFJUHRyIDwgSVRleHRTZWxlY3Rpb24sICZJSURfSVRleHRTZWxlY3Rpb24gPiBwU2VsIChwRGlzcFNlbCk7CisKKwkJaWYgKHBTZWwpCisJCQkvLyBHZXQgdGhlIHNlbGVjdGlvbiBsaW5lIG51bWJlcgorCQkJcFNlbC0+Z2V0X0N1cnJlbnRMaW5lICgmTGluZU5yKTsKKwl9CisKKwkvLyBPcGVuIHRoZSBmaWxlIGluIFZpbQorCVZpbU9wZW5GaWxlIChGaWxlTmFtZSwgTGluZU5yKTsKKworCVN5c0ZyZWVTdHJpbmcgKEZpbGVOYW1lKTsKKwlyZXR1cm4gU19PSzsKK30KKworCisvLworLy8gSGVyZSB3ZSBkbyB0aGUgYWN0dWFsIHByb2Nlc3NpbmcgYW5kIGNvbW11bmljYXRpb24gd2l0aCBWaW0KKy8vCisKKy8vIFNldCB0aGUgZW5hYmxlIHN0YXRlIGFuZCBzYXZlIHRvIHJlZ2lzdHJ5CisvLworc3RhdGljIHZvaWQgVmltU2V0RW5hYmxlU3RhdGUgKEJPT0wgYkVuYWJsZVN0YXRlKQoreworCWdfYkVuYWJsZVZpbSA9IGJFbmFibGVTdGF0ZTsKKwlIS0VZIGhBcHBLZXkgPSBHZXRBcHBLZXkgKCJWaW0iKTsKKwlpZiAoaEFwcEtleSkKKwl7CisJCUhLRVkgaFNlY3Rpb25LZXkgPSBHZXRTZWN0aW9uS2V5IChoQXBwS2V5LCAiVmlzVmltIik7CisJCWlmIChoU2VjdGlvbktleSkKKwkJCVdyaXRlUmVnaXN0cnlJbnQgKGhTZWN0aW9uS2V5LCAiRW5hYmxlVmltIiwgZ19iRW5hYmxlVmltKTsKKwkJUmVnQ2xvc2VLZXkgKGhBcHBLZXkpOworCX0KK30KKworLy8gT3BlbiB0aGUgZmlsZSAnRmlsZU5hbWUnIGluIFZpbSBhbmQgZ290byBsaW5lICdMaW5lTnInCisvLyAnRmlsZU5hbWUnIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gYW4gYWJzb2x1dGUgRE9TIHBhdGggaW5jbHVkaW5nIHRoZSBkcml2ZQorLy8gbGV0dGVyLgorLy8gJ0xpbmVOcicgbXVzdCBjb250YWluIGEgdmFsaWQgbGluZSBudW1iZXIgb3IgMCwgZS4gZy4gZm9yIGEgbmV3IGZpbGUKKy8vCitzdGF0aWMgQk9PTCBWaW1PcGVuRmlsZSAoQlNUUiYgRmlsZU5hbWUsIGxvbmcgTGluZU5yKQoreworCisJLy8gT0xFIGF1dG9tYXRpb24gb2JqZWN0IGZvciBjb20uIHdpdGggVmltCisJLy8gV2hlbiB0aGUgb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLCBpdCdzIGRlc2N0cnVjdG9yIGRlc3Ryb3lzIHRoZSBPTEUgY29ubmVjdGlvbjsKKwkvLyBUaGlzIGlzIGltb3J0YW50IHRvIGF2b2lkIGJsb2NraW5nIHRoZSBvYmplY3QKKwkvLyAoaW4gdGhpcyBtZW1vcnkgY29ycnVwdGlvbiB3b3VsZCBiZSBsaWtlbHkgd2hlbiB0ZXJtaW5hdGluZyBWaW0KKwkvLyB3aGlsZSBzdGlsbCBydW5uaW5nIERldlN0dWRpbykuCisJLy8gU28ga2VlcCB0aGlzIG9iamVjdCBsb2NhbCEKKwlDT2xlQXV0b21hdGlvbkNvbnRyb2wgVmltT2xlOworCisJLy8gOmNkIEQ6L1NyYzIvVmlzVmltLworCS8vCisJLy8gR2V0IGEgZGlzcGF0Y2ggaWQgZm9yIHRoZSBTZW5kS2V5cyBtZXRob2Qgb2YgVmltOworCS8vIGVuYWJsZXMgY29ubmVjdGlvbiB0byBWaW0gaWYgbmVjZXNzYXJ5CisJRElTUElEIERpc3BhdGNoSWQ7CisJRGlzcGF0Y2hJZCA9IFZpbUdldERpc3BhdGNoSWQgKFZpbU9sZSwgIlNlbmRLZXlzIik7CisJaWYgKCEgRGlzcGF0Y2hJZCkKKwkJLy8gT0xFIGVycm9yLCBjYW4ndCBvYnRhaW4gZGlzcGF0Y2ggaWQKKwkJZ290byBPbGVFcnJvcjsKKworCU9MRUNIQVIgQnVmW01BWF9PTEVfU1RSXTsKKwljaGFyIEZpbGVOYW1lVG1wW01BWF9PTEVfU1RSXTsKKwljaGFyIFZpbUNtZFtNQVhfT0xFX1NUUl07CisJY2hhciAqcywgKnA7CisKKwkvLyBQcmVwZW5kIENUUkwtXCBDVFJMLU4gdG8gZXhpdCBpbnNlcnQgbW9kZQorCVZpbUNtZFswXSA9IDB4MWM7CisJVmltQ21kWzFdID0gMHgwZTsKKwlWaW1DbWRbMl0gPSAwOworCisjaWZkZWYgU0lOR0xFX1dJTkRPVworCS8vIFVwZGF0ZSB0aGUgY3VycmVudCBmaWxlIGluIFZpbSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KKwkvLyBEaXNhYmxlZCwgYmVjYXVzZSBpdCBjb3VsZCB3cml0ZSB0aGUgZmlsZSB3aGVuIHlvdSBkb24ndCB3YW50IHRvLgorCXNwcmludGYgKFZpbUNtZCArIDIsICI6dXBcbiIpOworI2VuZGlmCisJaWYgKCEgVmltT2xlLk1ldGhvZCAoRGlzcGF0Y2hJZCwgInMiLCBUT19PTEVfU1RSX0JVRiAoVmltQ21kLCBCdWYpKSkKKwkJZ290byBPbGVFcnJvcjsKKworCS8vIENoYW5nZSBWaW0gd29ya2luZyBkaXJlY3RvcnkgdG8gd2hlcmUgdGhlIGZpbGUgaXMgaWYgZGVzaXJlZAorCWlmIChnX0NoYW5nZURpciAhPSBDRF9OT05FKQorCQlWaW1DaGFuZ2VEaXIgKFZpbU9sZSwgRGlzcGF0Y2hJZCwgRmlsZU5hbWUpOworCisJLy8gTWFrZSBWaW0gb3BlbiB0aGUgZmlsZS4KKwkvLyBJbiB0aGUgZmlsZW5hbWUgY29udmVydCBhbGwgXCB0byAvLCBwdXQgYSBcIGJlZm9yZSBhIHNwYWNlLgorCXNwcmludGYoVmltQ21kLCAiOmRyb3AgIik7CisJc3ByaW50ZihGaWxlTmFtZVRtcCwgIiVTIiwgKGNoYXIgKilGaWxlTmFtZSk7CisJcyA9IFZpbUNtZCArIDY7CisJZm9yIChwID0gRmlsZU5hbWVUbXA7ICpwICE9ICdcMCcgJiYgcyA8IEZpbGVOYW1lVG1wICsgTUFYX09MRV9TVFIgLSA0OworCQkJCQkJCQkJICArK3ApCisJCWlmICgqcCA9PSAnXFwnKQorCQkJKnMrKyA9ICcvJzsKKwkJZWxzZQorCQl7CisJCQlpZiAoKnAgPT0gJyAnKQorCQkJCSpzKysgPSAnXFwnOworCQkJKnMrKyA9ICpwOworCQl9CisJKnMrKyA9ICdcbic7CisJKnMgPSAnXDAnOworCisJaWYgKCEgVmltT2xlLk1ldGhvZCAoRGlzcGF0Y2hJZCwgInMiLCBUT19PTEVfU1RSX0JVRiAoVmltQ21kLCBCdWYpKSkKKwkJZ290byBPbGVFcnJvcjsKKworCWlmIChMaW5lTnIgPiAwKQorCXsKKwkJLy8gR290byBsaW5lCisJCXNwcmludGYgKFZpbUNtZCwgIjolZFxuIiwgTGluZU5yKTsKKwkJaWYgKCEgVmltT2xlLk1ldGhvZCAoRGlzcGF0Y2hJZCwgInMiLCBUT19PTEVfU1RSX0JVRiAoVmltQ21kLCBCdWYpKSkKKwkJCWdvdG8gT2xlRXJyb3I7CisJfQorCisJLy8gTWFrZSBWaW0gY29tZSB0byB0aGUgZm9yZWdyb3VuZAorCWlmICghIFZpbU9sZS5NZXRob2QgKCJTZXRGb3JlZ3JvdW5kIikpCisJCVZpbU9sZS5FcnJEaWFnICgpOworCisJLy8gV2UncmUgZG9uZQorCXJldHVybiB0cnVlOworCisgICAgT2xlRXJyb3I6CisJLy8gVGhlcmUgd2FzIGFuIE9MRSBlcnJvcgorCS8vIENoZWNrIGlmIGl0J3MgdGhlICJ1bmtub3duIGNsYXNzIHN0cmluZyIgZXJyb3IKKwlWaW1FcnJEaWFnIChWaW1PbGUpOworCXJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRoZSBkaXNwYXRjaCBpZCBmb3IgdGhlIFZpbSBtZXRob2QgJ01ldGhvZCcKKy8vIENyZWF0ZSB0aGUgVmltIE9MRSBvYmplY3QgaWYgbmVjZXNzYXJ5CisvLyBSZXR1cm5zIGEgdmFsaWQgZGlzcGF0Y2ggaWQgb3IgbnVsbCBvbiBlcnJvcgorLy8KK3N0YXRpYyBESVNQSUQgVmltR2V0RGlzcGF0Y2hJZCAoQ09sZUF1dG9tYXRpb25Db250cm9sJiBWaW1PbGUsIGNoYXIqIE1ldGhvZCkKK3sKKwkvLyBJbml0aWFsaXplIFZpbSBPTEUgY29ubmVjdGlvbiBpZiBub3QgYWxyZWFkeSBkb25lCisJaWYgKCEgVmltT2xlLklzQ3JlYXRlZCAoKSkKKwl7CisJCWlmICghIFZpbU9sZS5DcmVhdGVPYmplY3QgKCJWaW0uQXBwbGljYXRpb24iKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8vIEdldCB0aGUgZGlzcGF0Y2ggaWQgZm9yIHRoZSBTZW5kS2V5cyBtZXRob2QuCisJLy8gQnkgZG9pbmcgdGhpcywgd2UgYXJlIGNoZWNraW5nIGlmIFZpbSBpcyBzdGlsbCB0aGVyZS4uLgorCURJU1BJRCBEaXNwYXRjaElkID0gVmltT2xlLkdldERpc3BhdGNoSWQgKCJTZW5kS2V5cyIpOworCWlmICghIERpc3BhdGNoSWQpCisJeworCQkvLyBXZSBjYW4ndCBnZXQgYSBkaXNwYXRjaCBpZC4KKwkJLy8gVGhpcyBtZWFucyB0aGF0IHByb2JhYmx5IFZpbSBoYXMgYmVlbiB0ZXJtaW5hdGVkLgorCQkvLyBEb24ndCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGhlcmUsIGluc3RlYWQKKwkJLy8gZGVzdHJveSB0aGUgT0xFIG9iamVjdCBhbmQgdHJ5IHRvIGNvbm5lY3Qgb25jZSBtb3JlCisJCS8vCisJCS8vIEluIGZhY3QsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYmVjYXVzZSB0aGUgT0xFIGF1dC4gb2JqZWN0CisJCS8vIHNob3VsZCBub3QgYmUga2VwdCBsb25nIGVub3VnaCB0byBhbGxvdyB0aGUgdXNlciB0byB0ZXJtaW5hdGUgVmltCisJCS8vIHRvIGF2b2lkIG1lbW9yeSBjb3JydXB0aW9uICh3aHkgdGhlIGhlY2sgaXMgdGhlcmUgbm8gc3lzdGVtIGdhcmJhZ2UKKwkJLy8gY29sbGVjdGlvbiBmb3IgdGhvc2UgZGFtbmVkIE9MRSBtZW1vcnkgY2h1bmtzPz8/KS4KKwkJVmltT2xlLkRlbGV0ZU9iamVjdCAoKTsKKwkJaWYgKCEgVmltT2xlLkNyZWF0ZU9iamVjdCAoIlZpbS5BcHBsaWNhdGlvbiIpKQorCQkJLy8gSWYgdGhpcyBjcmVhdGUgZmFpbHMsIGl0J3MgdGltZSBmb3IgYW4gZXJyb3IgbXNnCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoISAoRGlzcGF0Y2hJZCA9IFZpbU9sZS5HZXREaXNwYXRjaElkICgiU2VuZEtleXMiKSkpCisJCQkvLyBUaGVyZSBpcyBzb21ldGhpbmcgd3JvbmcuLi4KKwkJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBEaXNwYXRjaElkOworfQorCisvLyBPdXRwdXQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYW4gT0xFIGVycm9yCisvLyBDaGVjayBvbiB0aGUgY2xhc3NzdHJpbmcgZXJyb3IsIHdoaWNoIHByb2JhYmx5IG1lYW5zIFZpbSB3YXNuJ3QgcmVnaXN0ZXJlZC4KKy8vCitzdGF0aWMgdm9pZCBWaW1FcnJEaWFnIChDT2xlQXV0b21hdGlvbkNvbnRyb2wmIFZpbU9sZSkKK3sKKwlTQ09ERSBzYyA9IEdldFNjb2RlIChWaW1PbGUuR2V0UmVzdWx0ICgpKTsKKwlpZiAoc2MgPT0gQ09fRV9DTEFTU1NUUklORykKKwl7CisJCWNoYXIgQnVmWzI1Nl07CisJCXNwcmludGYgKEJ1ZiwgIlRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgT0xFIGF1dG9tYXRpb24gc2VydmVyIG5hbWVkICIKKwkJCSAiXCJWaW0uQXBwbGljYXRpb25cIi5cbiIKKwkJCSAiVXNlIHRoZSBPTEUtZW5hYmxlZCB2ZXJzaW9uIG9mIFZpbSB3aXRoIFZpc1ZpbSBhbmQgIgorCQkJICJtYWtlIHN1cmUgdG8gcmVnaXN0ZXIgVmltIGJ5IHJ1bm5pbmcgXCJ2aW0gLXJlZ2lzdGVyXCIuIik7CisJCU1lc3NhZ2VCb3ggKE5VTEwsIEJ1ZiwgIk9MRSBFcnJvciIsIE1CX09LKTsKKwl9CisJZWxzZQorCQlWaW1PbGUuRXJyRGlhZyAoKTsKK30KKworLy8gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IHRoZSBmaWxlICdGaWxlTmFtZScgaXMgaW4gb3IgaXQncyBwYXJlbnQKKy8vIGRpcmVjdG9yeSBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmcgb2YgdGhlIGdsb2JhbCAnZ19DaGFuZ2VEaXInOgorLy8gJ0ZpbGVOYW1lJyBpcyBleHBlY3RlZCB0byBjb250YWluIGFuIGFic29sdXRlIERPUyBwYXRoIGluY2x1ZGluZyB0aGUgZHJpdmUKKy8vIGxldHRlci4KKy8vCUNEX05PTkUKKy8vCUNEX1NPVVJDRV9QQVRICisvLwlDRF9TT1VSQ0VfUEFSRU5UCisvLworc3RhdGljIHZvaWQgVmltQ2hhbmdlRGlyIChDT2xlQXV0b21hdGlvbkNvbnRyb2wmIFZpbU9sZSwgRElTUElEIERpc3BhdGNoSWQsIEJTVFImIEZpbGVOYW1lKQoreworCS8vIERvIGEgOmNkIGZpcnN0CisKKwkvLyBHZXQgdGhlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSAoImRpci8iKQorCUNTdHJpbmcgU3RyRmlsZU5hbWUgPSBGaWxlTmFtZTsKKwljaGFyIERyaXZlW19NQVhfRFJJVkVdOworCWNoYXIgRGlyW19NQVhfRElSXTsKKwljaGFyIERpclVuaXhbX01BWF9ESVIgKiAyXTsKKwljaGFyICpzLCAqdDsKKworCV9zcGxpdHBhdGggKFN0ckZpbGVOYW1lLCBEcml2ZSwgRGlyLCBOVUxMLCBOVUxMKTsKKworCS8vIENvbnZlcnQgdG8gVW5peCBwYXRoIG5hbWUgZm9ybWF0LCBlc2NhcGUgc3BhY2VzLgorCXQgPSBEaXJVbml4OworCWZvciAocyA9IERpcjsgKnM7ICsrcykKKwkJaWYgKCpzID09ICdcXCcpCisJCQkqdCsrID0gJy8nOworCQllbHNlCisJCXsKKwkJCWlmICgqcyA9PSAnICcpCisJCQkJKnQrKyA9ICdcXCc7CisJCQkqdCsrID0gKnM7CisJCX0KKwkqdCA9ICdcMCc7CisKKworCS8vIENvbnN0cnVjdCB0aGUgY2QgY29tbWFuZDsgYXBwZW5kIC8uLiBpZiBjZCB0byBwYXJlbnQKKwkvLyBkaXJlY3RvcnkgYW5kIG5vdCBpbiByb290IGRpcmVjdG9yeQorCU9MRUNIQVIgQnVmW01BWF9PTEVfU1RSXTsKKwljaGFyIFZpbUNtZFtNQVhfT0xFX1NUUl07CisKKwlzcHJpbnRmIChWaW1DbWQsICI6Y2QgJXMlcyVzXG4iLCBEcml2ZSwgRGlyVW5peCwKKwkJIGdfQ2hhbmdlRGlyID09IENEX1NPVVJDRV9QQVJFTlQgJiYgRGlyVW5peFsxXSA/ICIuLiIgOiAiIik7CisJVmltT2xlLk1ldGhvZCAoRGlzcGF0Y2hJZCwgInMiLCBUT19PTEVfU1RSX0JVRiAoVmltQ21kLCBCdWYpKTsKK30KKworI2lmZGVmIF9ERUJVRworLy8gUHJpbnQgb3V0IGEgZGVidWcgbWVzc2FnZQorLy8KK3N0YXRpYyB2b2lkIERlYnVnTXNnIChjaGFyKiBNc2csIGNoYXIqIEFyZykKK3sKKwljaGFyIEJ1Zls0MDBdOworCXNwcmludGYgKEJ1ZiwgTXNnLCBBcmcpOworCUFmeE1lc3NhZ2VCb3ggKEJ1Zik7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9Db21tYW5kcy5oIGIvc3JjL1Zpc1ZpbS9Db21tYW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2M4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL0NvbW1hbmRzLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8vIENvbW1hbmRzLmggOiBoZWFkZXIgZmlsZQorLy8KKworI2lmICFkZWZpbmVkKEFGWF9DT01NQU5EU19IX19BQzcyNjcxN18yOTc3XzExRDFfQjJGM18wMDYwMDgwNDA3ODBfX0lOQ0xVREVEXykKKyNkZWZpbmUgQUZYX0NPTU1BTkRTX0hfX0FDNzI2NzE3XzI5NzdfMTFEMV9CMkYzXzAwNjAwODA0MDc4MF9fSU5DTFVERURfCisKKyNpbmNsdWRlICJ2c3Z0eXBlcy5oIgorCitjbGFzcyBDQ29tbWFuZHMgOgorCXB1YmxpYyAgIENDb21EdWFsSW1wbCA8IElDb21tYW5kcywKKwkJCQkgJklJRF9JQ29tbWFuZHMsCisJCQkJICZMSUJJRF9WaXNWaW0gPiwKKwlwdWJsaWMgICBDQ29tT2JqZWN0Um9vdCwKKwlwdWJsaWMgICBDQ29tQ29DbGFzcyA8IENDb21tYW5kcywKKwkJCQkgJkNMU0lEX0NvbW1hbmRzID4KK3sKKyAgICBwcm90ZWN0ZWQ6CisJSUFwcGxpY2F0aW9uICogbV9wQXBwbGljYXRpb247CisKKyAgICBwdWJsaWM6CisJQ0NvbW1hbmRzICgpOworCX5DQ29tbWFuZHMgKCk7CisJdm9pZCBTZXRBcHBsaWNhdGlvbk9iamVjdCAoSUFwcGxpY2F0aW9uICogbV9wQXBwbGljYXRpb24pOworCUlBcHBsaWNhdGlvbiAqR2V0QXBwbGljYXRpb25PYmplY3QgKCkKKwl7CisJCXJldHVybiBtX3BBcHBsaWNhdGlvbjsKKwl9CisJdm9pZCBVbmFkdmlzZUZyb21FdmVudHMgKCk7CisKKwlCRUdJTl9DT01fTUFQIChDQ29tbWFuZHMpCisJQ09NX0lOVEVSRkFDRV9FTlRSWSAoSURpc3BhdGNoKQorCUNPTV9JTlRFUkZBQ0VfRU5UUlkgKElDb21tYW5kcykKKwlFTkRfQ09NX01BUCAoKQorCURFQ0xBUkVfTk9UX0FHR1JFR0FUQUJMRSAoQ0NvbW1hbmRzKQorCisgICAgcHJvdGVjdGVkOgorCS8vIFRoaXMgY2xhc3MgdGVtcGxhdGUgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIEFwcGxpY2F0aW9uCisJLy8gZXZlbnQgaGFuZGxlciBvYmplY3QgYW5kIHRoZSBEZWJ1Z2dlciBldmVudCBoYW5kbGVyIG9iamVjdCwKKwkvLyB3aGljaCBhcmUgZGVjbGFyZWQgYmVsb3cuCisJdGVtcGxhdGUgPCBjbGFzcyBJRXZlbnRzLAorCQljb25zdCBJSUQgKiBwaWlkRXZlbnRzLAorCQljb25zdCBHVUlEICogcGxpYmlkLAorCQljbGFzcyBYRXZlbnRzLAorCQljb25zdCBDTFNJRCAqIHBDbHNpZEV2ZW50cyA+CisJCWNsYXNzIFhFdmVudEhhbmRsZXIgOgorCQlwdWJsaWMJICAgICAgQ0NvbUR1YWxJbXBsIDwgSUV2ZW50cywKKwkJCSAgICAgIHBpaWRFdmVudHMsCisJCQkgICAgICBwbGliaWQgPiwKKwkJcHVibGljCSAgICAgIENDb21PYmplY3RSb290LAorCQlwdWJsaWMJICAgICAgQ0NvbUNvQ2xhc3MgPCBYRXZlbnRzLAorCQkJICAgICAgcENsc2lkRXZlbnRzID4KKwl7CisJICAgIHB1YmxpYzoKKwkJQkVHSU5fQ09NX01BUCAoWEV2ZW50cykKKwkJQ09NX0lOVEVSRkFDRV9FTlRSWSAoSURpc3BhdGNoKQorCQlDT01fSU5URVJGQUNFX0VOVFJZX0lJRCAoKnBpaWRFdmVudHMsIElFdmVudHMpCisJCUVORF9DT01fTUFQICgpCisJCURFQ0xBUkVfTk9UX0FHR1JFR0FUQUJMRSAoWEV2ZW50cykKKwkJdm9pZCBDb25uZWN0IChJVW5rbm93biAqIHBVbmspCisJCXsKKwkJCVZFUklGWSAoU1VDQ0VFREVEIChBdGxBZHZpc2UgKHBVbmssIHRoaXMsICpwaWlkRXZlbnRzLAorCQkJCQkJICAgICAgJm1fZHdBZHZpc2UpKSk7CisJCX0KKwkJdm9pZCBEaXNjb25uZWN0IChJVW5rbm93biAqIHBVbmspCisJCXsKKwkJCUF0bFVuYWR2aXNlIChwVW5rLCAqcGlpZEV2ZW50cywgbV9kd0FkdmlzZSk7CisJCX0KKworCQlDQ29tbWFuZHMgKm1fcENvbW1hbmRzOworCisJICAgIHByb3RlY3RlZDoKKwkJRFdPUkQgbV9kd0FkdmlzZTsKKwl9OworCisJLy8gVGhpcyBvYmplY3QgaGFuZGxlcyBldmVudHMgZmlyZWQgYnkgdGhlIEFwcGxpY2F0aW9uIG9iamVjdAorCWNsYXNzIFhBcHBsaWNhdGlvbkV2ZW50cyA6IHB1YmxpYyBYRXZlbnRIYW5kbGVyIDwgSUFwcGxpY2F0aW9uRXZlbnRzLAorCQkJJklJRF9JQXBwbGljYXRpb25FdmVudHMsCisJCQkmTElCSURfVmlzVmltLAorCQkJWEFwcGxpY2F0aW9uRXZlbnRzLAorCQkJJkNMU0lEX0FwcGxpY2F0aW9uRXZlbnRzID4KKwl7CisJICAgIHB1YmxpYzoKKwkJLy8gSUFwcGxpY2F0aW9uRXZlbnRzIG1ldGhvZHMKKwkJU1RETUVUSE9EIChCZWZvcmVCdWlsZFN0YXJ0KSAoVEhJUyk7CisJCVNURE1FVEhPRCAoQnVpbGRGaW5pc2gpIChUSElTXyBsb25nIG5OdW1FcnJvcnMsIGxvbmcgbk51bVdhcm5pbmdzKTsKKwkJU1RETUVUSE9EIChCZWZvcmVBcHBsaWNhdGlvblNodXREb3duKSAoVEhJUyk7CisJCVNURE1FVEhPRCAoRG9jdW1lbnRPcGVuKSAoVEhJU18gSURpc3BhdGNoICogdGhlRG9jdW1lbnQpOworCQlTVERNRVRIT0QgKEJlZm9yZURvY3VtZW50Q2xvc2UpIChUSElTXyBJRGlzcGF0Y2ggKiB0aGVEb2N1bWVudCk7CisJCVNURE1FVEhPRCAoRG9jdW1lbnRTYXZlKSAoVEhJU18gSURpc3BhdGNoICogdGhlRG9jdW1lbnQpOworCQlTVERNRVRIT0QgKE5ld0RvY3VtZW50KSAoVEhJU18gSURpc3BhdGNoICogdGhlRG9jdW1lbnQpOworCQlTVERNRVRIT0QgKFdpbmRvd0FjdGl2YXRlKSAoVEhJU18gSURpc3BhdGNoICogdGhlV2luZG93KTsKKwkJU1RETUVUSE9EIChXaW5kb3dEZWFjdGl2YXRlKSAoVEhJU18gSURpc3BhdGNoICogdGhlV2luZG93KTsKKwkJU1RETUVUSE9EIChXb3Jrc3BhY2VPcGVuKSAoVEhJUyk7CisJCVNURE1FVEhPRCAoV29ya3NwYWNlQ2xvc2UpIChUSElTKTsKKwkJU1RETUVUSE9EIChOZXdXb3Jrc3BhY2UpIChUSElTKTsKKwl9OworCXR5cGVkZWYgQ0NvbU9iamVjdCA8IFhBcHBsaWNhdGlvbkV2ZW50cyA+IFhBcHBsaWNhdGlvbkV2ZW50c09iajsKKwlYQXBwbGljYXRpb25FdmVudHNPYmogKm1fcEFwcGxpY2F0aW9uRXZlbnRzT2JqOworCisJLy8gVGhpcyBvYmplY3QgaGFuZGxlcyBldmVudHMgZmlyZWQgYnkgdGhlIEFwcGxpY2F0aW9uIG9iamVjdAorCWNsYXNzIFhEZWJ1Z2dlckV2ZW50cyA6IHB1YmxpYyBYRXZlbnRIYW5kbGVyIDwgSURlYnVnZ2VyRXZlbnRzLAorCQkJJklJRF9JRGVidWdnZXJFdmVudHMsCisJCQkmTElCSURfVmlzVmltLAorCQkJWERlYnVnZ2VyRXZlbnRzLAorCQkJJkNMU0lEX0RlYnVnZ2VyRXZlbnRzID4KKwl7CisJICAgIHB1YmxpYzoKKwkJLy8gSURlYnVnZ2VyRXZlbnRzIG1ldGhvZAorCQlTVERNRVRIT0QgKEJyZWFrcG9pbnRIaXQpIChUSElTXyBJRGlzcGF0Y2ggKiBwQnJlYWtwb2ludCk7CisJfTsKKwl0eXBlZGVmIENDb21PYmplY3QgPCBYRGVidWdnZXJFdmVudHMgPiBYRGVidWdnZXJFdmVudHNPYmo7CisJWERlYnVnZ2VyRXZlbnRzT2JqICptX3BEZWJ1Z2dlckV2ZW50c09iajsKKworICAgIHB1YmxpYzoKKwkvLyBJQ29tbWFuZHMgbWV0aG9kcworCVNURE1FVEhPRCAoVmlzVmltRGlhbG9nKSAoVEhJUyk7CisJU1RETUVUSE9EIChWaXNWaW1FbmFibGUpIChUSElTKTsKKwlTVERNRVRIT0QgKFZpc1ZpbURpc2FibGUpIChUSElTKTsKKwlTVERNRVRIT0QgKFZpc1ZpbVRvZ2dsZSkgKFRISVMpOworCVNURE1FVEhPRCAoVmlzVmltTG9hZCkgKFRISVMpOworfTsKKwordHlwZWRlZiBDQ29tT2JqZWN0IDwgQ0NvbW1hbmRzID4gQ0NvbW1hbmRzT2JqOworCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19CisKKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfQ09NTUFORFNfSF9fQUM3MjY3MTdfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRCkKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vRFNBZGRJbi5jcHAgYi9zcmMvVmlzVmltL0RTQWRkSW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzI1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL0RTQWRkSW4uY3BwCkBAIC0wLDAgKzEsMTYwIEBACisjaW5jbHVkZSAic3RkYWZ4LmgiCisjaW5jbHVkZSAiVmlzVmltLmgiCisjaW5jbHVkZSAiRFNBZGRJbi5oIgorI2luY2x1ZGUgIkNvbW1hbmRzLmgiCisKKyNpZmRlZiBfREVCVUcKKyNkZWZpbmUgbmV3IERFQlVHX05FVworI3VuZGVmIFRISVNfRklMRQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsKKworI2VuZGlmCisKKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZmlyc3QgbG9hZHMgdGhlIGFkZC1pbiwgYW5kIG9uIHN0YXJ0LXVwCisvLyAgb2YgZWFjaCBzdWJzZXF1ZW50IERldmVsb3BlciBTdHVkaW8gc2Vzc2lvbgorU1RETUVUSE9ESU1QIENEU0FkZEluOjpPbkNvbm5lY3Rpb24gKElBcHBsaWNhdGlvbiAqIHBBcHAsIFZBUklBTlRfQk9PTCBiRmlyc3RUaW1lLAorCQkJCSAgICAgbG9uZyBkd0Nvb2tpZSwgVkFSSUFOVF9CT09MICogT25Db25uZWN0aW9uKQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKwkqT25Db25uZWN0aW9uID0gVkFSSUFOVF9GQUxTRTsKKworCS8vIFN0b3JlIGluZm8gcGFzc2VkIHRvIHVzCisJSUFwcGxpY2F0aW9uICpwQXBwbGljYXRpb24gPSBOVUxMOworCUhSRVNVTFQgaHI7CisKKwlociA9IHBBcHAtPlF1ZXJ5SW50ZXJmYWNlIChJSURfSUFwcGxpY2F0aW9uLCAodm9pZCAqKikgJnBBcHBsaWNhdGlvbik7CisJaWYgKEZBSUxFRCAoaHIpKQorCXsKKwkJUmVwb3J0TGFzdEVycm9yIChocik7CisJCXJldHVybiBFX1VORVhQRUNURUQ7CisJfQorCWlmIChwQXBwbGljYXRpb24gPT0gTlVMTCkKKwl7CisJCVJlcG9ydEludGVybmFsRXJyb3IgKCJJQXBwbGljYXRpb246OlF1ZXJ5SW50ZXJmYWNlIik7CisJCXJldHVybiBFX1VORVhQRUNURUQ7CisJfQorCisJbV9kd0Nvb2tpZSA9IGR3Q29va2llOworCisJLy8gQ3JlYXRlIGNvbW1hbmQgZGlzcGF0Y2gsIHNlbmQgaW5mbyBiYWNrIHRvIERldlN0dWRpbworCUNDb21tYW5kc09iajo6Q3JlYXRlSW5zdGFuY2UgKCZtX3BDb21tYW5kcyk7CisJaWYgKCEgbV9wQ29tbWFuZHMpCisJeworCQlSZXBvcnRJbnRlcm5hbEVycm9yICgiQ0NvbW1hbmRzT2JqOjpDcmVhdGVJbnN0YW5jZSIpOworCQlyZXR1cm4gRV9VTkVYUEVDVEVEOworCX0KKwltX3BDb21tYW5kcy0+QWRkUmVmICgpOworCisJLy8gVGhlIFF1ZXJ5SW50ZXJmYWNlIGFib3ZlIEFkZFJlZidkIHRoZSBBcHBsaWNhdGlvbiBvYmplY3QuICBJdCB3aWxsCisJLy8gYmUgUmVsZWFzZSdkIGluIENDb21tYW5kJ3MgZGVzdHJ1Y3Rvci4KKwltX3BDb21tYW5kcy0+U2V0QXBwbGljYXRpb25PYmplY3QgKHBBcHBsaWNhdGlvbik7CisKKwlociA9IHBBcHBsaWNhdGlvbi0+U2V0QWRkSW5JbmZvICgobG9uZykgQWZ4R2V0SW5zdGFuY2VIYW5kbGUgKCksCisJCShMUERJU1BBVENIKSBtX3BDb21tYW5kcywgSURSX1RPT0xCQVJfTUVESVVNLCBJRFJfVE9PTEJBUl9MQVJHRSwKKwkJbV9kd0Nvb2tpZSk7CisJaWYgKEZBSUxFRCAoaHIpKQorCXsKKwkJUmVwb3J0TGFzdEVycm9yIChocik7CisJCXJldHVybiBFX1VORVhQRUNURUQ7CisJfQorCisJLy8gSW5mb3JtIERldlN0dWRpbyBvZiB0aGUgY29tbWFuZHMgd2UgaW1wbGVtZW50CisJaWYgKCEgQWRkQ29tbWFuZCAocEFwcGxpY2F0aW9uLCAiVmlzVmltRGlhbG9nIiwgIlZpc1ZpbURpYWxvZ0NtZCIsCisJCQkgIElEU19DTURfRElBTE9HLCAwLCBiRmlyc3RUaW1lKSkKKwkJcmV0dXJuIEVfVU5FWFBFQ1RFRDsKKwlpZiAoISBBZGRDb21tYW5kIChwQXBwbGljYXRpb24sICJWaXNWaW1FbmFibGUiLCAiVmlzVmltRW5hYmxlQ21kIiwKKwkJCSAgSURTX0NNRF9FTkFCTEUsIDEsIGJGaXJzdFRpbWUpKQorCQlyZXR1cm4gRV9VTkVYUEVDVEVEOworCWlmICghIEFkZENvbW1hbmQgKHBBcHBsaWNhdGlvbiwgIlZpc1ZpbURpc2FibGUiLCAiVmlzVmltRGlzYWJsZUNtZCIsCisJCQkgIElEU19DTURfRElTQUJMRSwgMiwgYkZpcnN0VGltZSkpCisJCXJldHVybiBFX1VORVhQRUNURUQ7CisJaWYgKCEgQWRkQ29tbWFuZCAocEFwcGxpY2F0aW9uLCAiVmlzVmltVG9nZ2xlIiwgIlZpc1ZpbVRvZ2dsZUNtZCIsCisJCQkgIElEU19DTURfVE9HR0xFLCAzLCBiRmlyc3RUaW1lKSkKKwkJcmV0dXJuIEVfVU5FWFBFQ1RFRDsKKwlpZiAoISBBZGRDb21tYW5kIChwQXBwbGljYXRpb24sICJWaXNWaW1Mb2FkIiwgIlZpc1ZpbUxvYWRDbWQiLAorCQkJICBJRFNfQ01EX0xPQUQsIDQsIGJGaXJzdFRpbWUpKQorCQlyZXR1cm4gRV9VTkVYUEVDVEVEOworCisJKk9uQ29ubmVjdGlvbiA9IFZBUklBTlRfVFJVRTsKKwlyZXR1cm4gU19PSzsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgb24gc2h1dC1kb3duLCBhbmQgYWxzbyB3aGVuIHRoZSB1c2VyIHVubG9hZHMgdGhlIGFkZC1pbgorU1RETUVUSE9ESU1QIENEU0FkZEluOjpPbkRpc2Nvbm5lY3Rpb24gKFZBUklBTlRfQk9PTCBiTGFzdFRpbWUpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCisJbV9wQ29tbWFuZHMtPlVuYWR2aXNlRnJvbUV2ZW50cyAoKTsKKwltX3BDb21tYW5kcy0+UmVsZWFzZSAoKTsKKwltX3BDb21tYW5kcyA9IE5VTEw7CisKKwlyZXR1cm4gU19PSzsKK30KKworLy8gQWRkIGEgY29tbWFuZCB0byBEZXZTdHVkaW8KKy8vIENyZWF0ZXMgYSB0b29sYmFyIGJ1dHRvbiBmb3IgdGhlIGNvbW1hbmQgYWxzby4KKy8vICdNZXRob2ROYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kZSBzcGVjaWZpZWQgaW4gdGhlIC5vZGwgZmlsZQorLy8gJ1N0clJlc0lkJyB0aGUgcmVzb3VyY2UgaWQgb2YgdGhlIGRlc2NyaXB0aXZlIHN0cmluZworLy8gJ0dseXBoSW5kZXgnIHRoZSBpbWFnZSBpbmRleCBpbnRvIHRoZSBjb21tYW5kIGJ1dHRvbnMgYml0bWFwCisvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCisvLworYm9vbCBDRFNBZGRJbjo6QWRkQ29tbWFuZCAoSUFwcGxpY2F0aW9uKiBwQXBwLCBjaGFyKiBNZXRob2ROYW1lLCBjaGFyKiBDbWROYW1lLAorCQkJICAgVUlOVCBTdHJSZXNJZCwgVUlOVCBHbHlwaEluZGV4LCBWQVJJQU5UX0JPT0wgYkZpcnN0VGltZSkKK3sKKwlDU3RyaW5nIENtZFN0cmluZzsKKwlDU3RyaW5nIENtZFRleHQ7CisKKwlDbWRUZXh0LkxvYWRTdHJpbmcgKFN0clJlc0lkKTsKKwlDbWRTdHJpbmcgPSBDbWROYW1lOworCUNtZFN0cmluZyArPSBDbWRUZXh0OworCisJQ0NvbUJTVFIgYnN6Q21kU3RyaW5nIChDbWRTdHJpbmcpOworCUNDb21CU1RSIGJzek1ldGhvZCAoTWV0aG9kTmFtZSk7CisJQ0NvbUJTVFIgYnN6Q21kTmFtZSAoQ21kTmFtZSk7CisKKwkvLyAoc2VlIHN0ZGFmeC5oIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBWRVJJRllfT0spCisKKwlWQVJJQU5UX0JPT0wgYlJldDsKKwlWRVJJRllfT0sgKHBBcHAtPkFkZENvbW1hbmQgKGJzekNtZFN0cmluZywgYnN6TWV0aG9kLCBHbHlwaEluZGV4LAorCQkJCSAgICAgbV9kd0Nvb2tpZSwgJmJSZXQpKTsKKwlpZiAoYlJldCA9PSBWQVJJQU5UX0ZBTFNFKQorCXsKKwkJLy8gQWRkQ29tbWFuZCBmYWlsZWQgYmVjYXVzZSBhIGNvbW1hbmQgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCisJCVJlcG9ydEludGVybmFsRXJyb3IgKCJJQXBwbGljYXRpb246OkFkZENvbW1hbmQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIEFkZCB0b29sYmFyIGJ1dHRvbnMgb25seSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBhZGQtaW4KKwkvLyBpcyBiZWluZyBsb2FkZWQuICBUb29sYmFyIGJ1dHRvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtZW1iZXJlZAorCS8vIGJ5IERldmVsb3BlciBTdHVkaW8gZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24sIHNvIHdlIHNob3VsZCBvbmx5CisJLy8gYWRkIHRoZSB0b29sYmFyIGJ1dHRvbnMgb25jZS4KKwlpZiAoYkZpcnN0VGltZSA9PSBWQVJJQU5UX1RSVUUpCisJCVZFUklGWV9PSyAocEFwcC0+QWRkQ29tbWFuZEJhckJ1dHRvbiAoZHNHbHlwaCwgYnN6Q21kTmFtZSwgbV9kd0Nvb2tpZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgUmVwb3J0TGFzdEVycm9yIChIUkVTVUxUIEVycikKK3sKKwljaGFyICpCdWYgPSBOVUxMOworCWNoYXIgTXNnWzUxMl07CisKKwlGb3JtYXRNZXNzYWdlIChGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKwkJICAgICAgIE5VTEwsIEVyciwKKwkJICAgICAgIE1BS0VMQU5HSUQgKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKwkJICAgICAgIEJ1ZiwgNDAwLCBOVUxMKTsKKwlzcHJpbnRmIChNc2csICJVbmV4cGVjdGVkIGVycm9yIChFcnJvciBjb2RlOiAlbHgpXG4lcyIsIEVyciwgQnVmKTsKKworCTo6TWVzc2FnZUJveCAoTlVMTCwgTXNnLCAiVmlzVmltIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisJaWYgKEJ1ZikKKwkJTG9jYWxGcmVlIChCdWYpOworfQorCit2b2lkIFJlcG9ydEludGVybmFsRXJyb3IgKGNoYXIqIEZjdCkKK3sKKwljaGFyIE1zZ1s1MTJdOworCisJc3ByaW50ZiAoTXNnLCAiVW5leHBlY3RlZCBlcnJvclxuJXMgZmFpbGVkIiwgRmN0KTsKKwk6Ok1lc3NhZ2VCb3ggKE5VTEwsIE1zZywgIlZpc1ZpbSIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOworfQorCmRpZmYgLS1naXQgYS9zcmMvVmlzVmltL0RTQWRkSW4uaCBiL3NyYy9WaXNWaW0vRFNBZGRJbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODI4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL0RTQWRkSW4uaApAQCAtMCwwICsxLDUzIEBACisvLyBEU0FkZEluLmggOiBoZWFkZXIgZmlsZQorLy8KKworI2lmICFkZWZpbmVkKEFGWF9EU0FERElOX0hfX0FDNzI2NzE1XzI5NzdfMTFEMV9CMkYzXzAwNjAwODA0MDc4MF9fSU5DTFVERURfKQorI2RlZmluZSBBRlhfRFNBRERJTl9IX19BQzcyNjcxNV8yOTc3XzExRDFfQjJGM18wMDYwMDgwNDA3ODBfX0lOQ0xVREVEXworCisjaW5jbHVkZSAiY29tbWFuZHMuaCIKKworLy8gezRGOUUwMUMwLTQwNkItMTFkMi04MDA2LTAwMDAxQzQwNTA3N30KK0RFRklORV9HVUlEIChDTFNJRF9EU0FkZEluLAorCTB4NGY5ZTAxYzAsIDB4NDA2YiwgMHgxMWQyLCAweDgwLCAweDYsIDB4MCwgMHgwLCAweDFjLCAweDQwLCAweDUwLCAweDc3KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENEU0FkZEluCisKK2NsYXNzIENEU0FkZEluIDoKKwlwdWJsaWMgICBJRFNBZGRJbiwKKwlwdWJsaWMgICBDQ29tT2JqZWN0Um9vdCwKKwlwdWJsaWMgICBDQ29tQ29DbGFzcyA8IENEU0FkZEluLAorCQkgJkNMU0lEX0RTQWRkSW4gPgoreworICAgIHB1YmxpYzoKKwlERUNMQVJFX1JFR0lTVFJZIChDRFNBZGRJbiwgIlZpc1ZpbS5EU0FkZEluLjEiLAorCQkJICAiVmlzVmltIERldmVsb3BlciBTdHVkaW8gQWRkLWluIiwgSURTX1ZJU1ZJTV9MT05HTkFNRSwKKwkJCSAgVEhSRUFERkxBR1NfQk9USCkKKworCUNEU0FkZEluICgpCisJeworCX0KKworCUJFR0lOX0NPTV9NQVAgKENEU0FkZEluKQorCUNPTV9JTlRFUkZBQ0VfRU5UUlkgKElEU0FkZEluKQorCUVORF9DT01fTUFQICgpCisJREVDTEFSRV9OT1RfQUdHUkVHQVRBQkxFIChDRFNBZGRJbikKKworCS8vIElEU0FkZElucworICAgIHB1YmxpYzoKKwlTVERNRVRIT0QgKE9uQ29ubmVjdGlvbikgKFRISVNfIElBcHBsaWNhdGlvbiAqIHBBcHAsIFZBUklBTlRfQk9PTCBiRmlyc3RUaW1lLAorCQkJCSAgbG9uZyBkd0Nvb2tpZSwgVkFSSUFOVF9CT09MICogT25Db25uZWN0aW9uKTsKKwlTVERNRVRIT0QgKE9uRGlzY29ubmVjdGlvbikgKFRISVNfIFZBUklBTlRfQk9PTCBiTGFzdFRpbWUpOworCisgICAgcHJvdGVjdGVkOgorCWJvb2wgQWRkQ29tbWFuZCAoSUFwcGxpY2F0aW9uKiBwQXBwLCBjaGFyKiBNZXRob2ROYW1lLCBjaGFyKiBDbWROYW1lLAorCQkJIFVJTlQgU3RyUmVzSWQsIFVJTlQgR2x5cGhJbmRleCwgVkFSSUFOVF9CT09MIGJGaXJzdFRpbWUpOworCisgICAgcHJvdGVjdGVkOgorCUNDb21tYW5kc09iaiAqIG1fcENvbW1hbmRzOworCURXT1JEIG1fZHdDb29raWU7Cit9OworCisvL3t7QUZYX0lOU0VSVF9MT0NBVElPTn19CisKKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfRFNBRERJTl9IX19BQzcyNjcxNV8yOTc3XzExRDFfQjJGM18wMDYwMDgwNDA3ODBfX0lOQ0xVREVEKQpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9PbGVBdXQuY3BwIGIvc3JjL1Zpc1ZpbS9PbGVBdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDFiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL09sZUF1dC5jcHAKQEAgLTAsMCArMSw3ODEgQEAKKy8vCisvLyBDbGFzcyBmb3IgY3JlYXRpbmcgT0xFIGF1dG9tYXRpb24gY29udHJvbGxlcnMuCisvLworLy8gQ3JlYXRlT2JqZWN0KCkgY3JlYXRlcyBhbiBhdXRvbWF0aW9uIG9iamVjdAorLy8gSW52b2tlKCkgd2lsbCBjYWxsIGEgcHJvcGVydHkgb3IgbWV0aG9kIG9mIHRoZSBhdXRvbWF0aW9uIG9iamVjdC4KKy8vIEdldFByb3BlcnR5KCkgcmV0dXJucyBhIHByb3BlcnR5CisvLyBTZXRQcm9wZXJ0eSgpIGNoYW5nZXMgYSBwcm9wZXJ0eQorLy8gTWV0aG9kKCkgaW52b2tlcyBhIG1ldGhvZAorLy8KKy8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIFZCIGNvZGUgd2lsbCBjb250cm9sIE1pY3Jvc29mdCBXb3JkOgorLy8KKy8vICAgIFByaXZhdGUgU3ViIEZvcm1fTG9hZCgpCisvLyAgICBEaW0gd2IgQXMgT2JqZWN0CisvLyAgICBTZXQgd2IgPSBDcmVhdGVPYmplY3QoIldvcmQuQmFzaWMiKQorLy8gICAgd2IuQXBwU2hvdworLy8gICAgd2IuRmlsZU5ld0RlZmF1bHQKKy8vICAgIHdiLkluc2VydCAiVGhpcyBpcyBhIHRlc3QiCisvLyAgICB3Yi5GaWxlU2F2ZUFzICJjOlxzYW1wbGUuZG9jKSIKKy8vICAgIEVuZCBTdWIKKy8vCisvLyBBIEMrKyBhdXRvbWF0aW9uIGNvbnRyb2xsZXIgdGhhdCBkb2VzIHRoZSBzYW1lIGNhbiBiZSB3cml0dGVuIGFzIGZvbGxvd3M6CisvLyB0aGUgaGVscGVyIGZ1bmN0aW9uczoKKy8vCisvLyAgIFZvaWQgRm9ybUxvYWQgKCkKKy8vICAgeworLy8gICAgICAgQ09sZUF1dG9tYXRpb25Db250cm9sIEF1dDsKKy8vICAgICAgIEF1dC5DcmVhdGVPYmplY3QoIldvcmQuQmFzaWMiKTsKKy8vICAgICAgIEF1dC5NZXRob2QgKCJBcHBTaG93Iik7CisvLyAgICAgICBBdXQuTWV0aG9kICgiRmlsZU5ld0RlZmF1bHQiKTsKKy8vICAgICAgIEF1dC5NZXRob2QgKCJJbnNlcnQiLCAicyIsIChMUE9MRVNUUikgT0xFU1RSICgiVGhpcyBpcyBhIHRlc3QiKSk7CisvLyAgICAgICBBdXQuTWV0aG9kICgiRmlsZVNhdmVBcyIsICJzIiwgT0xFU1RSICgiYzpcXHNhbXBsZS5kb2MiKSk7CisvLyAgIH0KKy8vCisvLworCisjaW5jbHVkZSAic3RkYWZ4LmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAib2xlYXV0LmgiCisKKyNpZmRlZiBfREVCVUcKKyNkZWZpbmUgbmV3IERFQlVHX05FVworI3VuZGVmIFRISVNfRklMRQorc3RhdGljIGNoYXIgVEhJU19GSUxFW10gPSBfX0ZJTEVfXzsKKyNlbmRpZgorCisKK3N0YXRpYyBib29sIENvdW50QXJnc0luRm9ybWF0IChMUENUU1RSIEZvcm1hdCwgVUlOVCogbkFyZ3MpOworc3RhdGljIExQQ1RTVFIgR2V0TmV4dFZhclR5cGUgKExQQ1RTVFIgRm9ybWF0LCBWQVJUWVBFKiBwVmFyVHlwZSk7CisKKworQ09sZUF1dG9tYXRpb25Db250cm9sOjpDT2xlQXV0b21hdGlvbkNvbnRyb2wgKCkKK3sKKwltX3BEaXNwYXRjaCA9IE5VTEw7CisJbV9oUmVzdWx0ID0gTk9FUlJPUjsKKwltX25FcnJBcmcgPSAwOworCVZhcmlhbnRJbml0ICgmbV9WYXJpYW50UmVzdWx0KTsKK30KKworQ09sZUF1dG9tYXRpb25Db250cm9sOjp+Q09sZUF1dG9tYXRpb25Db250cm9sICgpCit7CisJRGVsZXRlT2JqZWN0ICgpOworfQorCit2b2lkIENPbGVBdXRvbWF0aW9uQ29udHJvbDo6RGVsZXRlT2JqZWN0ICgpCit7CisJaWYgKG1fcERpc3BhdGNoKQorCXsKKwkJbV9wRGlzcGF0Y2gtPlJlbGVhc2UgKCk7CisJCW1fcERpc3BhdGNoID0gTlVMTDsKKwl9Cit9CisKKy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEF1dG9tYXRpb24gb2JqZWN0IGFuZAorLy8gb2J0YWlucyBpdCdzIElEaXNwYXRjaCBpbnRlcmZhY2UuCisvLworLy8gUGFyYW1ldGVyczoKKy8vIFByb2dJZAkgIFByb2dJRCBvZiBBdXRvbWF0aW9uIG9iamVjdAorLy8KK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpDcmVhdGVPYmplY3QgKGNoYXIqIFByb2dJZCkKK3sKKwlDTFNJRCBDbHNJZDsJCQkvLyBDTFNJRCBvZiBhdXRvbWF0aW9uIG9iamVjdAorCUxQVU5LTk9XTiBwVW5rbm93biA9IE5VTEw7CS8vIElVbmtub3duIG9mIGF1dG9tYXRpb24gb2JqZWN0CisKKwkvLyBSZXRyaWV2ZSBDTFNJRCBmcm9tIHRoZSBwcm9nSUQgdGhhdCB0aGUgdXNlciBzcGVjaWZpZWQKKwlMUE9MRVNUUiBPbGVQcm9nSWQgPSBUT19PTEVfU1RSIChQcm9nSWQpOworCW1faFJlc3VsdCA9IENMU0lERnJvbVByb2dJRCAoT2xlUHJvZ0lkLCAmQ2xzSWQpOworCWlmIChGQUlMRUQgKG1faFJlc3VsdCkpCisJCWdvdG8gZXJyb3I7CisKKwkvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGF1dG9tYXRpb24gb2JqZWN0IGFuZCBhc2sgZm9yIHRoZQorCS8vIElEaXNwYXRjaCBpbnRlcmZhY2UKKwltX2hSZXN1bHQgPSBDb0NyZWF0ZUluc3RhbmNlIChDbHNJZCwgTlVMTCwgQ0xTQ1RYX1NFUlZFUiwKKwkJCSAgICAgICBJSURfSVVua25vd24sICh2b2lkKiopICZwVW5rbm93bik7CisJaWYgKEZBSUxFRCAobV9oUmVzdWx0KSkKKwkJZ290byBlcnJvcjsKKworCW1faFJlc3VsdCA9IHBVbmtub3duLT5RdWVyeUludGVyZmFjZSAoSUlEX0lEaXNwYXRjaCwgKHZvaWQqKikgJm1fcERpc3BhdGNoKTsKKwlpZiAoRkFJTEVEIChtX2hSZXN1bHQpKQorCQlnb3RvIGVycm9yOworCisJcFVua25vd24tPlJlbGVhc2UgKCk7CisJcmV0dXJuIHRydWU7CisKK2Vycm9yOgorCWlmIChwVW5rbm93bikKKwkJcFVua25vd24tPlJlbGVhc2UgKCk7CisJaWYgKG1fcERpc3BhdGNoKQorCQltX3BEaXNwYXRjaC0+UmVsZWFzZSAoKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybiB0aGUgZGlzcGF0Y2ggaWQgb2YgYSBuYW1lZCBzZXJ2aWNlCisvLyBUaGlzIGlkIGNhbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gR2V0UHJvcGVydHkgKCksIFNldFByb3BlcnR5ICgpIGFuZAorLy8gTWV0aG9kICgpLiBUaGlzIGlzIHRoZSBwcmVmZXJlZCBtZXRob2Qgd2hlbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCisvLworRElTUElEIENPbGVBdXRvbWF0aW9uQ29udHJvbDo6R2V0RGlzcGF0Y2hJZCAoY2hhciogTmFtZSkKK3sKKwlESVNQSUQgRGlzcGF0Y2hJZDsKKworCUFTU0VSVCAobV9wRGlzcGF0Y2gpOworCisJLy8gR2V0IERJU1BJRCBvZiBwcm9wZXJ0eS9tZXRob2QKKwlMUE9MRVNUUiBPbGVOYW1lID0gVE9fT0xFX1NUUiAoTmFtZSk7CisJbV9oUmVzdWx0ID0gbV9wRGlzcGF0Y2gtPkdldElEc09mTmFtZXMgKElJRF9OVUxMLCAmT2xlTmFtZSwgMSwKKwkJCQkJCUxPQ0FMRV9VU0VSX0RFRkFVTFQsICZEaXNwYXRjaElkKTsKKwlpZiAoRkFJTEVEIChtX2hSZXN1bHQpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gRGlzcGF0Y2hJZDsKK30KKworLy8gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSB0aGVzZSBwYXJhbWV0ZXJzOgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gIE5hbWUgICAgICBOYW1lIG9mIHByb3BlcnR5IG9yIG1ldGhvZC4KKy8vCisvLyAgRm9ybWF0ICAgIEZvcm1hdCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHZhcmlhYmxlIGxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0CisvLwkgICAgICBmb2xsb3dzLiBUaGUgZm9ybWF0IHN0cmluZyBjYW4gY29udGFpbiB0aGUgZm9sbHdvaW5nIGNoYXJhY3RlcnMuCisvLwkgICAgICAmID0gbWFyayB0aGUgZm9sbG93aW5nIGZvcm1hdCBjaGFyYWN0ZXIgYXMgVlRfQllSRUYKKy8vCSAgICAgIEIgPSBWVF9CT09MCisvLwkgICAgICBpID0gVlRfSTIKKy8vCSAgICAgIEkgPSBWVF9JNAorLy8JICAgICAgciA9IFZUX1IyCisvLwkgICAgICBSID0gVlRfUjQKKy8vCSAgICAgIGMgPSBWVF9DWQorLy8JICAgICAgcyA9IFZUX0JTVFIgKHN0cmluZyBwb2ludGVyIGNhbiBiZSBwYXNzZWQsCisvLwkJCUJTVFIgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbikuCisvLwkgICAgICBlID0gVlRfRVJST1IKKy8vCSAgICAgIGQgPSBWVF9EQVRFCisvLwkgICAgICB2ID0gVlRfVkFSSUFOVC4gVXNlIHRoaXMgdG8gcGFzcyBkYXRhIHR5cGVzIHRoYXQgYXJlIG5vdCBkZXNjcmliZWQKKy8vCQkJaW4gdGhlIGZvcm1hdCBzdHJpbmcuIChGb3IgZXhhbXBsZSBTYWZlQXJyYXlzKS4KKy8vCSAgICAgIEQgPSBWVF9ESVNQQVRDSAorLy8JICAgICAgVSA9IFZUX1VOS05PV04KKy8vCisvLyAgLi4uICAgICAgIEFyZ3VtZW50cyBvZiB0aGUgcHJvcGVydHkgb3IgbWV0aG9kLgorLy8JICAgICAgQXJndW1lbnRzIGFyZSBkZXNjcmliZWQgYnkgRm9ybWF0LgorLy8KKworYm9vbCBDT2xlQXV0b21hdGlvbkNvbnRyb2w6OkdldFByb3BlcnR5IChjaGFyKiBOYW1lKQoreworCXJldHVybiBJbnZva2UgKERJU1BBVENIX1BST1BFUlRZR0VULCBOYW1lLCBOVUxMLCBOVUxMKTsKK30KKworYm9vbCBDT2xlQXV0b21hdGlvbkNvbnRyb2w6OkdldFByb3BlcnR5IChESVNQSUQgRGlzcGF0Y2hJZCkKK3sKKwlyZXR1cm4gSW52b2tlIChESVNQQVRDSF9QUk9QRVJUWUdFVCwgRGlzcGF0Y2hJZCwgTlVMTCwgTlVMTCk7Cit9CisKK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpQdXRQcm9wZXJ0eSAoY2hhciogTmFtZSwgTFBDVFNUUiBGb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IEFyZ0xpc3Q7CisKKwl2YV9zdGFydCAoQXJnTGlzdCwgRm9ybWF0KTsKKwlib29sIGJSZXQgPSBJbnZva2UgKERJU1BBVENIX1BST1BFUlRZUFVULCBOYW1lLCBGb3JtYXQsIEFyZ0xpc3QpOworCXZhX2VuZCAoQXJnTGlzdCk7CisJcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpQdXRQcm9wZXJ0eSAoRElTUElEIERpc3BhdGNoSWQsIExQQ1RTVFIgRm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBBcmdMaXN0OworCisJdmFfc3RhcnQgKEFyZ0xpc3QsIEZvcm1hdCk7CisJYm9vbCBiUmV0ID0gSW52b2tlIChESVNQQVRDSF9QUk9QRVJUWVBVVCwgRGlzcGF0Y2hJZCwgRm9ybWF0LCBBcmdMaXN0KTsKKwl2YV9lbmQgKEFyZ0xpc3QpOworCXJldHVybiBiUmV0OworfQorCitib29sIENPbGVBdXRvbWF0aW9uQ29udHJvbDo6TWV0aG9kIChjaGFyKiBOYW1lLCBMUENUU1RSIEZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgQXJnTGlzdDsKKworCXZhX3N0YXJ0IChBcmdMaXN0LCBGb3JtYXQpOworCWJvb2wgYlJldCA9IEludm9rZSAoRElTUEFUQ0hfTUVUSE9ELCBOYW1lLCBGb3JtYXQsIEFyZ0xpc3QpOworCXZhX2VuZCAoQXJnTGlzdCk7CisJcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpNZXRob2QgKERJU1BJRCBEaXNwYXRjaElkLCBMUENUU1RSIEZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgQXJnTGlzdDsKKworCXZhX3N0YXJ0IChBcmdMaXN0LCBGb3JtYXQpOworCWJvb2wgYlJldCA9IEludm9rZSAoRElTUEFUQ0hfTUVUSE9ELCBEaXNwYXRjaElkLCBGb3JtYXQsIEFyZ0xpc3QpOworCXZhX2VuZCAoQXJnTGlzdCk7CisJcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpJbnZva2UgKFdPUkQgRmxhZ3MsIGNoYXIqIE5hbWUsCisJCQkJICAgIExQQ1RTVFIgRm9ybWF0LCB2YV9saXN0IEFyZ0xpc3QpCit7CisJRElTUElEIERpc3BhdGNoSWQgPSBHZXREaXNwYXRjaElkIChOYW1lKTsKKwlpZiAoISBEaXNwYXRjaElkKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEludm9rZSAoRmxhZ3MsIERpc3BhdGNoSWQsIEZvcm1hdCwgQXJnTGlzdCk7Cit9CisKK2Jvb2wgQ09sZUF1dG9tYXRpb25Db250cm9sOjpJbnZva2UgKFdPUkQgRmxhZ3MsIERJU1BJRCBEaXNwYXRjaElkLAorCQkJCSAgICBMUENUU1RSIEZvcm1hdCwgdmFfbGlzdCBBcmdMaXN0KQoreworCVVJTlQgQXJnQ291bnQgPSAwOworCVZBUklBTlRBUkcqIEFyZ1ZlY3RvciA9IE5VTEw7CisKKwlBU1NFUlQgKG1fcERpc3BhdGNoKTsKKworCURJU1BQQVJBTVMgRGlzcGF0Y2hQYXJhbXM7CisJbWVtc2V0ICgmRGlzcGF0Y2hQYXJhbXMsIDAsIHNpemVvZiAoRGlzcGF0Y2hQYXJhbXMpKTsKKworCS8vIERldGVybWluZSBudW1iZXIgb2YgYXJndW1lbnRzCisJaWYgKEZvcm1hdCkKKwkJQ291bnRBcmdzSW5Gb3JtYXQgKEZvcm1hdCwgJkFyZ0NvdW50KTsKKworCS8vIFByb3BlcnR5IHB1dHMgaGF2ZSBhIG5hbWVkIGFyZ3VtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgdGhhdAorCS8vIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBhc3NpZ25lZC4KKwlESVNQSUQgRGlzcElkTmFtZWQgPSBESVNQSURfUFJPUEVSVFlQVVQ7CisJaWYgKEZsYWdzICYgRElTUEFUQ0hfUFJPUEVSVFlQVVQpCisJeworCQlpZiAoQXJnQ291bnQgPT0gMCkKKwkJeworCQkJbV9oUmVzdWx0ID0gUmVzdWx0RnJvbVNjb2RlIChFX0lOVkFMSURBUkcpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCURpc3BhdGNoUGFyYW1zLmNOYW1lZEFyZ3MgPSAxOworCQlEaXNwYXRjaFBhcmFtcy5yZ2Rpc3BpZE5hbWVkQXJncyA9ICZEaXNwSWROYW1lZDsKKwl9CisKKwlpZiAoQXJnQ291bnQpCisJeworCQkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWQVJJQU5UQVJHIHBhcmFtZXRlcnMKKwkJQXJnVmVjdG9yID0gKFZBUklBTlRBUkcqKSBDb1Rhc2tNZW1BbGxvYyAoCisJCQkJQXJnQ291bnQgKiBzaXplb2YgKFZBUklBTlRBUkcpKTsKKwkJaWYgKCEgQXJnVmVjdG9yKQorCQl7CisJCQltX2hSZXN1bHQgPSBSZXN1bHRGcm9tU2NvZGUgKEVfT1VUT0ZNRU1PUlkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCW1lbXNldCAoQXJnVmVjdG9yLCAwLCBzaXplb2YgKFZBUklBTlRBUkcpICogQXJnQ291bnQpOworCisJCS8vIEdldCByZWFkeSB0byB3YWxrIHZhcmFyZyBsaXN0CisJCUxQQ1RTVFIgcyA9IEZvcm1hdDsKKworCQlWQVJJQU5UQVJHICpwID0gQXJnVmVjdG9yICsgQXJnQ291bnQgLSAxOyAgLy8gUGFyYW1zIGdvIGluIG9wcG9zaXRlIG9yZGVyCisKKwkJZm9yICg7OykKKwkJeworCQkJVmFyaWFudEluaXQgKHApOworCQkJaWYgKCEgKHMgPSBHZXROZXh0VmFyVHlwZSAocywgJnAtPnZ0KSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChwIDwgQXJnVmVjdG9yKQorCQkJeworCQkJCW1faFJlc3VsdCA9IFJlc3VsdEZyb21TY29kZSAoRV9JTlZBTElEQVJHKTsKKwkJCQlnb3RvIENsZWFudXA7CisJCQl9CisJCQlzd2l0Y2ggKHAtPnZ0KQorCQkJeworCQkJICAgIGNhc2UgVlRfSTI6CisJCQkJVl9JMiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIHNob3J0KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0k0OgorCQkJCVZfSTQgKHApID0gdmFfYXJnIChBcmdMaXN0LCBsb25nKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX1I0OgorCQkJCVZfUjQgKHApID0gdmFfYXJnIChBcmdMaXN0LCBmbG9hdCk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9EQVRFOgorCQkJICAgIGNhc2UgVlRfUjg6CisJCQkJVl9SOCAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIGRvdWJsZSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9DWToKKwkJCQlWX0NZIChwKSA9IHZhX2FyZyAoQXJnTGlzdCwgQ1kpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgVlRfQlNUUjoKKwkJCQlWX0JTVFIgKHApID0gU3lzQWxsb2NTdHJpbmcgKHZhX2FyZyAoQXJnTGlzdCwKKwkJCQkJCQkJICAgICBPTEVDSEFSKikpOworCQkJCWlmICghIHAtPmJzdHJWYWwpCisJCQkJeworCQkJCQltX2hSZXN1bHQgPSBSZXN1bHRGcm9tU2NvZGUgKEVfT1VUT0ZNRU1PUlkpOworCQkJCQlwLT52dCA9IFZUX0VNUFRZOworCQkJCQlnb3RvIENsZWFudXA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICAgIGNhc2UgVlRfRElTUEFUQ0g6CisJCQkJVl9ESVNQQVRDSCAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIExQRElTUEFUQ0gpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgVlRfRVJST1I6CisJCQkJVl9FUlJPUiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIFNDT0RFKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0JPT0w6CisJCQkJVl9CT09MIChwKSA9IHZhX2FyZyAoQXJnTGlzdCwgQk9PTCkgPyAtMSA6IDA7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9WQVJJQU5UOgorCQkJCSpwID0gdmFfYXJnIChBcmdMaXN0LCBWQVJJQU5UQVJHKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX1VOS05PV046CisJCQkJVl9VTktOT1dOIChwKSA9IHZhX2FyZyAoQXJnTGlzdCwgTFBVTktOT1dOKTsKKwkJCQlicmVhazsKKworCQkJICAgIGNhc2UgVlRfSTIgfCBWVF9CWVJFRjoKKwkJCQlWX0kyUkVGIChwKSA9IHZhX2FyZyAoQXJnTGlzdCwgc2hvcnQqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0k0IHwgVlRfQllSRUY6CisJCQkJVl9JNFJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIGxvbmcqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX1I0IHwgVlRfQllSRUY6CisJCQkJVl9SNFJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIGZsb2F0Kik7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9SOCB8IFZUX0JZUkVGOgorCQkJCVZfUjhSRUYgKHApID0gdmFfYXJnIChBcmdMaXN0LCBkb3VibGUqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0RBVEUgfCBWVF9CWVJFRjoKKwkJCQlWX0RBVEVSRUYgKHApID0gdmFfYXJnIChBcmdMaXN0LCBEQVRFKik7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9DWSB8IFZUX0JZUkVGOgorCQkJCVZfQ1lSRUYgKHApID0gdmFfYXJnIChBcmdMaXN0LCBDWSopOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgVlRfQlNUUiB8IFZUX0JZUkVGOgorCQkJCVZfQlNUUlJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIEJTVFIqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0RJU1BBVENIIHwgVlRfQllSRUY6CisJCQkJVl9ESVNQQVRDSFJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIExQRElTUEFUQ0gqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX0VSUk9SIHwgVlRfQllSRUY6CisJCQkJVl9FUlJPUlJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIFNDT0RFKik7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBWVF9CT09MIHwgVlRfQllSRUY6CisJCQkJeworCQkJCQlCT09MKiBwQm9vbCA9IHZhX2FyZyAoQXJnTGlzdCwgQk9PTCopOworCisJCQkJCSpwQm9vbCA9IDA7CisJCQkJCVZfQk9PTFJFRiAocCkgPSAoVkFSSUFOVF9CT09MKikgcEJvb2w7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICAgIGNhc2UgVlRfVkFSSUFOVCB8IFZUX0JZUkVGOgorCQkJCVZfVkFSSUFOVFJFRiAocCkgPSB2YV9hcmcgKEFyZ0xpc3QsIFZBUklBTlRBUkcqKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIFZUX1VOS05PV04gfCBWVF9CWVJFRjoKKwkJCQlWX1VOS05PV05SRUYgKHApID0gdmFfYXJnIChBcmdMaXN0LCBMUFVOS05PV04qKTsKKwkJCQlicmVhazsKKworCQkJICAgIGRlZmF1bHQ6CisJCQkJeworCQkJCQltX2hSZXN1bHQgPSBSZXN1bHRGcm9tU2NvZGUgKEVfSU5WQUxJREFSRyk7CisJCQkJCWdvdG8gQ2xlYW51cDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS0tcDsJLy8gR2V0IHJlYWR5IHRvIGZpbGwgbmV4dCBhcmd1bWVudAorCQl9CisJfQorCisJRGlzcGF0Y2hQYXJhbXMuY0FyZ3MgPSBBcmdDb3VudDsKKwlEaXNwYXRjaFBhcmFtcy5yZ3ZhcmcgPSBBcmdWZWN0b3I7CisKKwkvLyBJbml0aWFsaXplIHJldHVybiB2YXJpYW50LCBpbiBjYXNlIGNhbGxlciBmb3Jnb3QuIENhbGxlciBjYW4gcGFzcworCS8vIE5VTEwgaWYgcmV0dXJuIHZhbHVlIGlzIG5vdCBleHBlY3RlZC4KKwlWYXJpYW50SW5pdCAoJm1fVmFyaWFudFJlc3VsdCk7CisKKwkvLyBNYWtlIHRoZSBjYWxsCisJbV9oUmVzdWx0ID0gbV9wRGlzcGF0Y2gtPkludm9rZSAoRGlzcGF0Y2hJZCwgSUlEX05VTEwsIExPQ0FMRV9VU0VSX0RFRkFVTFQsCisJCQkJCSBGbGFncywgJkRpc3BhdGNoUGFyYW1zLCAmbV9WYXJpYW50UmVzdWx0LAorCQkJCQkgJm1fRXhjZXB0aW9uSW5mbywgJm1fbkVyckFyZyk7CisKKyAgICBDbGVhbnVwOgorCS8vIENsZWFudXAgYW55IGFyZ3VtZW50cyB0aGF0IG5lZWQgY2xlYW51cAorCWlmIChBcmdDb3VudCkKKwl7CisJCVZBUklBTlRBUkcqIHAgPSBBcmdWZWN0b3I7CisKKwkJd2hpbGUgKEFyZ0NvdW50LS0pCisJCXsKKwkJCXN3aXRjaCAocC0+dnQpCisJCQl7CisJCQkgICAgY2FzZSBWVF9CU1RSOgorCQkJCVZhcmlhbnRDbGVhciAocCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkrK3A7CisJCX0KKwkJQ29UYXNrTWVtRnJlZSAoQXJnVmVjdG9yKTsKKwl9CisKKwlyZXR1cm4gRkFJTEVEIChtX2hSZXN1bHQpID8gZmFsc2UgOiB0cnVlOworfQorCisjZGVmaW5lIENBU0VfU0NPREUoc2MpICBcCisJY2FzZSBzYzogXAorCWxzdHJjcHkoKGNoYXIqKUVyck5hbWUsIChjaGFyKikjc2MpOyBcCisJYnJlYWs7CisKK3ZvaWQgQ09sZUF1dG9tYXRpb25Db250cm9sOjpFcnJEaWFnICgpCit7CisJY2hhciBFcnJOYW1lWzIwMF07CisKKwlTQ09ERSBzYyA9IEdldFNjb2RlIChtX2hSZXN1bHQpOworCXN3aXRjaCAoc2MpCisJeworCSAgICAvLyBTQ09ERSdzIGRlZmluZWQgaW4gU0NPREUuSAorCSAgICBDQVNFX1NDT0RFIChTX09LKQorCSAgICBDQVNFX1NDT0RFIChTX0ZBTFNFKQorCSAgICBDQVNFX1NDT0RFIChFX1VORVhQRUNURUQpCisJICAgIENBU0VfU0NPREUgKEVfT1VUT0ZNRU1PUlkpCisJICAgIENBU0VfU0NPREUgKEVfSU5WQUxJREFSRykKKwkgICAgQ0FTRV9TQ09ERSAoRV9OT0lOVEVSRkFDRSkKKwkgICAgQ0FTRV9TQ09ERSAoRV9QT0lOVEVSKQorCSAgICBDQVNFX1NDT0RFIChFX0hBTkRMRSkKKwkgICAgQ0FTRV9TQ09ERSAoRV9BQk9SVCkKKwkgICAgQ0FTRV9TQ09ERSAoRV9GQUlMKQorCSAgICBDQVNFX1NDT0RFIChFX0FDQ0VTU0RFTklFRCkKKworCSAgICAvLyBTQ09ERSdzIGRlZmluZWQgaW4gT0xFMi5ICisJICAgIENBU0VfU0NPREUgKE9MRV9FX09MRVZFUkIpCisJICAgIENBU0VfU0NPREUgKE9MRV9FX0FEVkYpCisJICAgIENBU0VfU0NPREUgKE9MRV9FX0VOVU1fTk9NT1JFKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9BRFZJU0VOT1RTVVBQT1JURUQpCisJICAgIENBU0VfU0NPREUgKE9MRV9FX05PQ09OTkVDVElPTikKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfTk9UUlVOTklORykKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfTk9DQUNIRSkKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfQkxBTkspCisJICAgIENBU0VfU0NPREUgKE9MRV9FX0NMQVNTRElGRikKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfQ0FOVF9HRVRNT05JS0VSKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9DQU5UX0JJTkRUT1NPVVJDRSkKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfU1RBVElDKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9QUk9NUFRTQVZFQ0FOQ0VMTEVEKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9JTlZBTElEUkVDVCkKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfV1JPTkdDT01QT0JKKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9JTlZBTElESFdORCkKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX0VfTk9UX0lOUExBQ0VBQ1RJVkUpCisJICAgIENBU0VfU0NPREUgKE9MRV9FX0NBTlRDT05WRVJUKQorCSAgICBDQVNFX1NDT0RFIChPTEVfRV9OT1NUT1JBR0UpCisKKwkgICAgQ0FTRV9TQ09ERSAoRFZfRV9GT1JNQVRFVEMpCisJICAgIENBU0VfU0NPREUgKERWX0VfRFZUQVJHRVRERVZJQ0UpCisJICAgIENBU0VfU0NPREUgKERWX0VfU1RHTUVESVVNKQorCSAgICBDQVNFX1NDT0RFIChEVl9FX1NUQVREQVRBKQorCSAgICBDQVNFX1NDT0RFIChEVl9FX0xJTkRFWCkKKwkgICAgQ0FTRV9TQ09ERSAoRFZfRV9UWU1FRCkKKwkgICAgQ0FTRV9TQ09ERSAoRFZfRV9DTElQRk9STUFUKQorCSAgICBDQVNFX1NDT0RFIChEVl9FX0RWQVNQRUNUKQorCSAgICBDQVNFX1NDT0RFIChEVl9FX0RWVEFSR0VUREVWSUNFX1NJWkUpCisJICAgIENBU0VfU0NPREUgKERWX0VfTk9JVklFV09CSkVDVCkKKworCSAgICBDQVNFX1NDT0RFIChPTEVfU19VU0VSRUcpCisJICAgIENBU0VfU0NPREUgKE9MRV9TX1NUQVRJQykKKwkgICAgQ0FTRV9TQ09ERSAoT0xFX1NfTUFDX0NMSVBGT1JNQVQpCisKKwkgICAgQ0FTRV9TQ09ERSAoQ09OVkVSVDEwX0VfT0xFU1RSRUFNX0dFVCkKKwkgICAgQ0FTRV9TQ09ERSAoQ09OVkVSVDEwX0VfT0xFU1RSRUFNX1BVVCkKKwkgICAgQ0FTRV9TQ09ERSAoQ09OVkVSVDEwX0VfT0xFU1RSRUFNX0ZNVCkKKwkgICAgQ0FTRV9TQ09ERSAoQ09OVkVSVDEwX0VfT0xFU1RSRUFNX0JJVE1BUF9UT19ESUIpCisJICAgIENBU0VfU0NPREUgKENPTlZFUlQxMF9FX1NUR19GTVQpCisJICAgIENBU0VfU0NPREUgKENPTlZFUlQxMF9FX1NUR19OT19TVERfU1RSRUFNKQorCSAgICBDQVNFX1NDT0RFIChDT05WRVJUMTBfRV9TVEdfRElCX1RPX0JJVE1BUCkKKwkgICAgQ0FTRV9TQ09ERSAoQ09OVkVSVDEwX1NfTk9fUFJFU0VOVEFUSU9OKQorCisJICAgIENBU0VfU0NPREUgKENMSVBCUkRfRV9DQU5UX09QRU4pCisJICAgIENBU0VfU0NPREUgKENMSVBCUkRfRV9DQU5UX0VNUFRZKQorCSAgICBDQVNFX1NDT0RFIChDTElQQlJEX0VfQ0FOVF9TRVQpCisJICAgIENBU0VfU0NPREUgKENMSVBCUkRfRV9CQURfREFUQSkKKwkgICAgQ0FTRV9TQ09ERSAoQ0xJUEJSRF9FX0NBTlRfQ0xPU0UpCisKKwkgICAgQ0FTRV9TQ09ERSAoRFJBR0RST1BfRV9OT1RSRUdJU1RFUkVEKQorCSAgICBDQVNFX1NDT0RFIChEUkFHRFJPUF9FX0FMUkVBRFlSRUdJU1RFUkVEKQorCSAgICBDQVNFX1NDT0RFIChEUkFHRFJPUF9FX0lOVkFMSURIV05EKQorCSAgICBDQVNFX1NDT0RFIChEUkFHRFJPUF9TX0RST1ApCisJICAgIENBU0VfU0NPREUgKERSQUdEUk9QX1NfQ0FOQ0VMKQorCSAgICBDQVNFX1NDT0RFIChEUkFHRFJPUF9TX1VTRURFRkFVTFRDVVJTT1JTKQorCisJICAgIENBU0VfU0NPREUgKE9MRU9CSl9FX05PVkVSQlMpCisJICAgIENBU0VfU0NPREUgKE9MRU9CSl9FX0lOVkFMSURWRVJCKQorCSAgICBDQVNFX1NDT0RFIChPTEVPQkpfU19JTlZBTElEVkVSQikKKwkgICAgQ0FTRV9TQ09ERSAoT0xFT0JKX1NfQ0FOTk9UX0RPVkVSQl9OT1cpCisJICAgIENBU0VfU0NPREUgKE9MRU9CSl9TX0lOVkFMSURIV05EKQorCSAgICBDQVNFX1NDT0RFIChJTlBMQUNFX0VfTk9UVU5ET0FCTEUpCisJICAgIENBU0VfU0NPREUgKElOUExBQ0VfRV9OT1RPT0xTUEFDRSkKKwkgICAgQ0FTRV9TQ09ERSAoSU5QTEFDRV9TX1RSVU5DQVRFRCkKKworCSAgICAvLyBTQ09ERSdzIGRlZmluZWQgaW4gQ09NUE9CSi5ICisJICAgIENBU0VfU0NPREUgKENPX0VfTk9USU5JVElBTElaRUQpCisJICAgIENBU0VfU0NPREUgKENPX0VfQUxSRUFEWUlOSVRJQUxJWkVEKQorCSAgICBDQVNFX1NDT0RFIChDT19FX0NBTlRERVRFUk1JTkVDTEFTUykKKwkgICAgQ0FTRV9TQ09ERSAoQ09fRV9DTEFTU1NUUklORykKKwkgICAgQ0FTRV9TQ09ERSAoQ09fRV9JSURTVFJJTkcpCisJICAgIENBU0VfU0NPREUgKENPX0VfQVBQTk9URk9VTkQpCisJICAgIENBU0VfU0NPREUgKENPX0VfQVBQU0lOR0xFVVNFKQorCSAgICBDQVNFX1NDT0RFIChDT19FX0VSUk9SSU5BUFApCisJICAgIENBU0VfU0NPREUgKENPX0VfRExMTk9URk9VTkQpCisJICAgIENBU0VfU0NPREUgKENPX0VfRVJST1JJTkRMTCkKKwkgICAgQ0FTRV9TQ09ERSAoQ09fRV9XUk9OR09TRk9SQVBQKQorCSAgICBDQVNFX1NDT0RFIChDT19FX09CSk5PVFJFRykKKwkgICAgQ0FTRV9TQ09ERSAoQ09fRV9PQkpJU1JFRykKKwkgICAgQ0FTRV9TQ09ERSAoQ09fRV9PQkpOT1RDT05ORUNURUQpCisJICAgIENBU0VfU0NPREUgKENPX0VfQVBQRElETlRSRUcpCisJICAgIENBU0VfU0NPREUgKENMQVNTX0VfTk9BR0dSRUdBVElPTikKKwkgICAgQ0FTRV9TQ09ERSAoQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRSkKKwkgICAgQ0FTRV9TQ09ERSAoUkVHREJfRV9SRUFEUkVHREIpCisJICAgIENBU0VfU0NPREUgKFJFR0RCX0VfV1JJVEVSRUdEQikKKwkgICAgQ0FTRV9TQ09ERSAoUkVHREJfRV9LRVlNSVNTSU5HKQorCSAgICBDQVNFX1NDT0RFIChSRUdEQl9FX0lOVkFMSURWQUxVRSkKKwkgICAgQ0FTRV9TQ09ERSAoUkVHREJfRV9DTEFTU05PVFJFRykKKwkgICAgQ0FTRV9TQ09ERSAoUkVHREJfRV9JSUROT1RSRUcpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0NBTExfUkVKRUNURUQpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0NBTExfQ0FOQ0VMRUQpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0NBTlRQT1NUX0lOU0VORENBTEwpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0NBTlRDQUxMT1VUX0lOQVNZTkNDQUxMKQorCSAgICBDQVNFX1NDT0RFIChSUENfRV9DQU5UQ0FMTE9VVF9JTkVYVEVSTkFMQ0FMTCkKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfQ09OTkVDVElPTl9URVJNSU5BVEVEKQorCSAgICBDQVNFX1NDT0RFIChSUENfRV9TRVJWRVJfRElFRCkKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfQ0xJRU5UX0RJRUQpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0lOVkFMSURfREFUQVBBQ0tFVCkKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfQ0FOVFRSQU5TTUlUX0NBTEwpCisJICAgIENBU0VfU0NPREUgKFJQQ19FX0NMSUVOVF9DQU5UTUFSU0hBTF9EQVRBKQorCSAgICBDQVNFX1NDT0RFIChSUENfRV9DTElFTlRfQ0FOVFVOTUFSU0hBTF9EQVRBKQorCSAgICBDQVNFX1NDT0RFIChSUENfRV9TRVJWRVJfQ0FOVE1BUlNIQUxfREFUQSkKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfU0VSVkVSX0NBTlRVTk1BUlNIQUxfREFUQSkKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfSU5WQUxJRF9EQVRBKQorCSAgICBDQVNFX1NDT0RFIChSUENfRV9JTlZBTElEX1BBUkFNRVRFUikKKwkgICAgQ0FTRV9TQ09ERSAoUlBDX0VfQ0FOVENBTExPVVRfQUdBSU4pCisJICAgIENBU0VfU0NPREUgKFJQQ19FX1VORVhQRUNURUQpCisKKwkgICAgLy8gU0NPREUncyBkZWZpbmVkIGluIERWT0JKLkgKKwkgICAgQ0FTRV9TQ09ERSAoREFUQV9TX1NBTUVGT1JNQVRFVEMpCisJICAgIENBU0VfU0NPREUgKFZJRVdfRV9EUkFXKQorCSAgICBDQVNFX1NDT0RFIChWSUVXX1NfQUxSRUFEWV9GUk9aRU4pCisJICAgIENBU0VfU0NPREUgKENBQ0hFX0VfTk9DQUNIRV9VUERBVEVEKQorCSAgICBDQVNFX1NDT0RFIChDQUNIRV9TX0ZPUk1BVEVUQ19OT1RTVVBQT1JURUQpCisJICAgIENBU0VfU0NPREUgKENBQ0hFX1NfU0FNRUNBQ0hFKQorCSAgICBDQVNFX1NDT0RFIChDQUNIRV9TX1NPTUVDQUNIRVNfTk9UVVBEQVRFRCkKKworCSAgICAvLyBTQ09ERSdzIGRlZmluZWQgaW4gU1RPUkFHRS5ICisJICAgIENBU0VfU0NPREUgKFNUR19FX0lOVkFMSURGVU5DVElPTikKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfRklMRU5PVEZPVU5EKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9QQVRITk9URk9VTkQpCisJICAgIENBU0VfU0NPREUgKFNUR19FX1RPT01BTllPUEVORklMRVMpCisJICAgIENBU0VfU0NPREUgKFNUR19FX0FDQ0VTU0RFTklFRCkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfSU5WQUxJREhBTkRMRSkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfSU5TVUZGSUNJRU5UTUVNT1JZKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9JTlZBTElEUE9JTlRFUikKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfTk9NT1JFRklMRVMpCisJICAgIENBU0VfU0NPREUgKFNUR19FX0RJU0tJU1dSSVRFUFJPVEVDVEVEKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9TRUVLRVJST1IpCisJICAgIENBU0VfU0NPREUgKFNUR19FX1dSSVRFRkFVTFQpCisJICAgIENBU0VfU0NPREUgKFNUR19FX1JFQURGQVVMVCkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfU0hBUkVWSU9MQVRJT04pCisJICAgIENBU0VfU0NPREUgKFNUR19FX0xPQ0tWSU9MQVRJT04pCisJICAgIENBU0VfU0NPREUgKFNUR19FX0ZJTEVBTFJFQURZRVhJU1RTKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9JTlZBTElEUEFSQU1FVEVSKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9NRURJVU1GVUxMKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9BQk5PUk1BTEFQSUVYSVQpCisJICAgIENBU0VfU0NPREUgKFNUR19FX0lOVkFMSURIRUFERVIpCisJICAgIENBU0VfU0NPREUgKFNUR19FX0lOVkFMSUROQU1FKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9VTktOT1dOKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9VTklNUExFTUVOVEVERlVOQ1RJT04pCisJICAgIENBU0VfU0NPREUgKFNUR19FX0lOVkFMSURGTEFHKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9JTlVTRSkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfTk9UQ1VSUkVOVCkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfUkVWRVJURUQpCisJICAgIENBU0VfU0NPREUgKFNUR19FX0NBTlRTQVZFKQorCSAgICBDQVNFX1NDT0RFIChTVEdfRV9PTERGT1JNQVQpCisJICAgIENBU0VfU0NPREUgKFNUR19FX09MRERMTCkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfU0hBUkVSRVFVSVJFRCkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfTk9URklMRUJBU0VEU1RPUkFHRSkKKwkgICAgQ0FTRV9TQ09ERSAoU1RHX0VfRVhUQU5UTUFSU0hBTExJTkdTKQorCSAgICBDQVNFX1NDT0RFIChTVEdfU19DT05WRVJURUQpCisKKwkgICAgLy8gU0NPREUncyBkZWZpbmVkIGluIFNUT1JBR0UuSAorCSAgICBDQVNFX1NDT0RFIChNS19FX0NPTk5FQ1RNQU5VQUxMWSkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9FWENFRURFRERFQURMSU5FKQorCSAgICBDQVNFX1NDT0RFIChNS19FX05FRURHRU5FUklDKQorCSAgICBDQVNFX1NDT0RFIChNS19FX1VOQVZBSUxBQkxFKQorCSAgICBDQVNFX1NDT0RFIChNS19FX1NZTlRBWCkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9OT09CSkVDVCkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9JTlZBTElERVhURU5TSU9OKQorCSAgICBDQVNFX1NDT0RFIChNS19FX0lOVEVSTUVESUFURUlOVEVSRkFDRU5PVFNVUFBPUlRFRCkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9OT1RCSU5EQUJMRSkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9OT1RCT1VORCkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9DQU5UT1BFTkZJTEUpCisJICAgIENBU0VfU0NPREUgKE1LX0VfTVVTVEJPVEhFUlVTRVIpCisJICAgIENBU0VfU0NPREUgKE1LX0VfTk9JTlZFUlNFKQorCSAgICBDQVNFX1NDT0RFIChNS19FX05PU1RPUkFHRSkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfRV9OT1BSRUZJWCkKKwkgICAgQ0FTRV9TQ09ERSAoTUtfU19SRURVQ0VEX1RPX1NFTEYpCisJICAgIENBU0VfU0NPREUgKE1LX1NfTUUpCisJICAgIENBU0VfU0NPREUgKE1LX1NfSElNKQorCSAgICBDQVNFX1NDT0RFIChNS19TX1VTKQorCSAgICBDQVNFX1NDT0RFIChNS19TX01PTklLRVJBTFJFQURZUkVHSVNURVJFRCkKKworCSAgICAvLyBTQ09ERSdzIGRlZmluZWQgaW4gRElTUEFUQ0guSAorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfVU5LTk9XTklOVEVSRkFDRSkKKwkgICAgQ0FTRV9TQ09ERSAoRElTUF9FX01FTUJFUk5PVEZPVU5EKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfUEFSQU1OT1RGT1VORCkKKwkgICAgQ0FTRV9TQ09ERSAoRElTUF9FX1RZUEVNSVNNQVRDSCkKKwkgICAgQ0FTRV9TQ09ERSAoRElTUF9FX1VOS05PV05OQU1FKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfTk9OQU1FREFSR1MpCisJICAgIENBU0VfU0NPREUgKERJU1BfRV9CQURWQVJUWVBFKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfRVhDRVBUSU9OKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfT1ZFUkZMT1cpCisJICAgIENBU0VfU0NPREUgKERJU1BfRV9CQURJTkRFWCkKKwkgICAgQ0FTRV9TQ09ERSAoRElTUF9FX1VOS05PV05MQ0lEKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfQVJSQVlJU0xPQ0tFRCkKKwkgICAgQ0FTRV9TQ09ERSAoRElTUF9FX0JBRFBBUkFNQ09VTlQpCisJICAgIENBU0VfU0NPREUgKERJU1BfRV9QQVJBTU5PVE9QVElPTkFMKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfQkFEQ0FMTEVFKQorCSAgICBDQVNFX1NDT0RFIChESVNQX0VfTk9UQUNPTExFQ1RJT04pCisKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX0JVRkZFUlRPT1NNQUxMKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfSU5WREFUQVJFQUQpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9VTlNVUEZPUk1BVCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX1JFR0lTVFJZQUNDRVNTKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfTElCTk9UUkVHSVNURVJFRCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX1VOREVGSU5FRFRZUEUpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9RVUFMSUZJRUROQU1FRElTQUxMT1dFRCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX0lOVkFMSURTVEFURSkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX1dST05HVFlQRUtJTkQpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9FTEVNRU5UTk9URk9VTkQpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9BTUJJR1VPVVNOQU1FKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfTkFNRUNPTkZMSUNUKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfVU5LTk9XTkxDSUQpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9ETExGVU5DVElPTk5PVEZPVU5EKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfQkFETU9EVUxFS0lORCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX1NJWkVUT09CSUcpCisJICAgIENBU0VfU0NPREUgKFRZUEVfRV9EVVBMSUNBVEVJRCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX1RZUEVNSVNNQVRDSCkKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX09VVE9GQk9VTkRTKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfSU9FUlJPUikKKwkgICAgQ0FTRV9TQ09ERSAoVFlQRV9FX0NBTlRDUkVBVEVUTVBGSUxFKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfQ0FOVExPQURMSUJSQVJZKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfSU5DT05TSVNURU5UUFJPUEZVTkNTKQorCSAgICBDQVNFX1NDT0RFIChUWVBFX0VfQ0lSQ1VMQVJUWVBFKQorCisJICAgIGRlZmF1bHQ6CisJCWxzdHJjcHkgKEVyck5hbWUsICJVTktOT1dOIFNDT0RFIik7CisJfQorCisJY2hhciBCdWZbMjU2XTsKKwlzcHJpbnRmIChCdWYsICJBbiBPTEUgZXJyb3Igb2NjdXJlZDpcclxuQ29kZSA9ICVzXHJcblJlc3VsdCA9ICVseC4iLAorCQkgKGNoYXIqKSBFcnJOYW1lLCBtX2hSZXN1bHQpOworCU1lc3NhZ2VCb3ggKE5VTEwsIEJ1ZiwgIk9MRSBFcnJvciIsIE1CX09LKTsKK30KKworCitzdGF0aWMgYm9vbCBDb3VudEFyZ3NJbkZvcm1hdCAoTFBDVFNUUiBGb3JtYXQsIFVJTlQqIHBBcmdDb3VudCkKK3sKKwkqcEFyZ0NvdW50ID0gMDsKKworCWlmICghIEZvcm1hdCkKKwkJcmV0dXJuIHRydWU7CisKKwl3aGlsZSAoKkZvcm1hdCkKKwl7CisJCWlmICgqRm9ybWF0ID09ICcmJykKKwkJCUZvcm1hdCsrOworCisJCXN3aXRjaCAoKkZvcm1hdCkKKwkJeworCQkgICAgY2FzZSAnYic6CisJCSAgICBjYXNlICdpJzoKKwkJICAgIGNhc2UgJ0knOgorCQkgICAgY2FzZSAncic6CisJCSAgICBjYXNlICdSJzoKKwkJICAgIGNhc2UgJ2MnOgorCQkgICAgY2FzZSAncyc6CisJCSAgICBjYXNlICdlJzoKKwkJICAgIGNhc2UgJ2QnOgorCQkgICAgY2FzZSAndic6CisJCSAgICBjYXNlICdEJzoKKwkJICAgIGNhc2UgJ1UnOgorCQkJKysgKCpwQXJnQ291bnQpOworCQkJRm9ybWF0Kys7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ1wwJzoKKwkJICAgIGRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBMUENUU1RSIEdldE5leHRWYXJUeXBlIChMUENUU1RSIEZvcm1hdCwgVkFSVFlQRSogcFZhclR5cGUpCit7CisJKnBWYXJUeXBlID0gMDsKKwlpZiAoKkZvcm1hdCA9PSAnJicpCisJeworCQkqcFZhclR5cGUgPSBWVF9CWVJFRjsKKwkJRm9ybWF0Kys7CisJCWlmICghKkZvcm1hdCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlzd2l0Y2ggKCpGb3JtYXQpCisJeworCSAgICBjYXNlICdiJzoKKwkJKnBWYXJUeXBlIHw9IFZUX0JPT0w7CisJCWJyZWFrOworCSAgICBjYXNlICdpJzoKKwkJKnBWYXJUeXBlIHw9IFZUX0kyOworCQlicmVhazsKKwkgICAgY2FzZSAnSSc6CisJCSpwVmFyVHlwZSB8PSBWVF9JNDsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ3InOgorCQkqcFZhclR5cGUgfD0gVlRfUjQ7CisJCWJyZWFrOworCSAgICBjYXNlICdSJzoKKwkJKnBWYXJUeXBlIHw9IFZUX1I4OworCQlicmVhazsKKwkgICAgY2FzZSAnYyc6CisJCSpwVmFyVHlwZSB8PSBWVF9DWTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ3MnOgorCQkqcFZhclR5cGUgfD0gVlRfQlNUUjsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2UnOgorCQkqcFZhclR5cGUgfD0gVlRfRVJST1I7CisJCWJyZWFrOworCSAgICBjYXNlICdkJzoKKwkJKnBWYXJUeXBlIHw9IFZUX0RBVEU7CisJCWJyZWFrOworCSAgICBjYXNlICd2JzoKKwkJKnBWYXJUeXBlIHw9IFZUX1ZBUklBTlQ7CisJCWJyZWFrOworCSAgICBjYXNlICdVJzoKKwkJKnBWYXJUeXBlIHw9IFZUX1VOS05PV047CisJCWJyZWFrOworCSAgICBjYXNlICdEJzoKKwkJKnBWYXJUeXBlIHw9IFZUX0RJU1BBVENIOworCQlicmVhazsKKwkgICAgY2FzZSAnXDAnOgorCQlyZXR1cm4gTlVMTDsJLy8gRW5kIG9mIEZvcm1hdCBzdHJpbmcKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiArK0Zvcm1hdDsKK30KKworI2lmbmRlZiBVTklDT0RFCitjaGFyKiBDb252ZXJ0VG9BbnNpIChPTEVDSEFSKiBzVW5pY29kZSkKK3sKKwlzdGF0aWMgY2hhciBCdWZBc2NpaVtNQVhfT0xFX1NUUl07CisJcmV0dXJuIENvbnZlcnRUb0Fuc2lCdWYgKHNVbmljb2RlLCBCdWZBc2NpaSk7Cit9CisKK2NoYXIqIENvbnZlcnRUb0Fuc2lCdWYgKE9MRUNIQVIqIHNVbmljb2RlLCBjaGFyKiBCdWZBc2NpaSkKK3sKKwlXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9BQ1AsIDAsIHNVbmljb2RlLCAtMSwgQnVmQXNjaWksIE1BWF9PTEVfU1RSLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gQnVmQXNjaWk7Cit9CisKK09MRUNIQVIqIENvbnZlcnRUb1VuaWNvZGUgKGNoYXIqIHNBc2NpaSkKK3sKKwlzdGF0aWMgT0xFQ0hBUiBCdWZVbmljb2RlW01BWF9PTEVfU1RSXTsKKwlyZXR1cm4gQ29udmVydFRvVW5pY29kZUJ1ZiAoc0FzY2lpLCBCdWZVbmljb2RlKTsKK30KKworT0xFQ0hBUiogQ29udmVydFRvVW5pY29kZUJ1ZiAoY2hhciogc0FzY2lpLCBPTEVDSEFSKiBCdWZVbmljb2RlKQoreworCU11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX0FDUCwgMCwgc0FzY2lpLCAtMSwgQnVmVW5pY29kZSwgTUFYX09MRV9TVFIpOworCXJldHVybiBCdWZVbmljb2RlOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vT2xlQXV0LmggYi9zcmMvVmlzVmltL09sZUF1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGU4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL09sZUF1dC5oCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgX19PTEVBVVRfSF9fCisjZGVmaW5lIF9fT0xFQVVUX0hfXworCitjbGFzcyBDT2xlQXV0b21hdGlvbkNvbnRyb2wgOiBwdWJsaWMgQ09iamVjdAoreworICAgIHB1YmxpYzoKKwlDT2xlQXV0b21hdGlvbkNvbnRyb2wgKCk7CisJfkNPbGVBdXRvbWF0aW9uQ29udHJvbCAoKTsKKwlib29sIENyZWF0ZU9iamVjdCAoY2hhciogUHJvZ0lkKTsKKwlESVNQSUQgR2V0RGlzcGF0Y2hJZCAoY2hhciogTmFtZSk7CisJYm9vbCBHZXRQcm9wZXJ0eSAoY2hhciogTmFtZSk7CisJYm9vbCBHZXRQcm9wZXJ0eSAoRElTUElEIERpc3BhdGNoSWQpOworCWJvb2wgUHV0UHJvcGVydHkgKGNoYXIqIE5hbWUsIExQQ1RTVFIgRm9ybWF0LCAuLi4pOworCWJvb2wgUHV0UHJvcGVydHkgKERJU1BJRCBEaXNwYXRjaElkLCBMUENUU1RSIEZvcm1hdCwgLi4uKTsKKwlib29sIE1ldGhvZCAoY2hhciogTmFtZSwgTFBDVFNUUiBGb3JtYXQgPSBOVUxMLCAuLi4pOworCWJvb2wgTWV0aG9kIChESVNQSUQgRGlzcGF0Y2hJZCwgTFBDVFNUUiBGb3JtYXQgPSBOVUxMLCAuLi4pOworCXZvaWQgRGVsZXRlT2JqZWN0ICgpOworCXZvaWQgRXJyRGlhZyAoKTsKKwlib29sIElzQ3JlYXRlZCAoKQorCXsKKwkJcmV0dXJuIG1fcERpc3BhdGNoID8gdHJ1ZSA6IGZhbHNlOworCX0KKwlib29sIElzQWxpdmUgKCk7CisJSFJFU1VMVCBHZXRSZXN1bHQgKCkKKwl7CisJCXJldHVybiBtX2hSZXN1bHQ7CisJfQorCVVJTlQgR2V0RXJyQXJnTnIgKCkKKwl7CisJCXJldHVybiBtX25FcnJBcmc7CisJfQorCUVYQ0VQSU5GTyogR2V0RXhjZXB0aW9uSW5mbyAoKQorCXsKKwkJcmV0dXJuICZtX0V4Y2VwdGlvbkluZm87CisJfQorCUxQVkFSSUFOVCBHZXRSZXN1bHRWYXJpYW50ICgpCisJeworCQlyZXR1cm4gJm1fVmFyaWFudFJlc3VsdDsKKwl9CisKKyAgICBwcm90ZWN0ZWQ6CisJYm9vbCBJbnZva2UgKFdPUkQgRmxhZ3MsIGNoYXIqIE5hbWUsIExQQ1RTVFIgRm9ybWF0LCB2YV9saXN0IEFyZ0xpc3QpOworCWJvb2wgSW52b2tlIChXT1JEIEZsYWdzLCBESVNQSUQgRGlzcGF0Y2hJZCwgTFBDVFNUUiBGb3JtYXQsIHZhX2xpc3QgQXJnTGlzdCk7CisKKyAgICBwcm90ZWN0ZWQ6CisJSURpc3BhdGNoKgltX3BEaXNwYXRjaDsKKwlIUkVTVUxUCQltX2hSZXN1bHQ7CisJVUlOVAkJbV9uRXJyQXJnOworCUVYQ0VQSU5GTwltX0V4Y2VwdGlvbkluZm87CisJVkFSSUFOVEFSRwltX1ZhcmlhbnRSZXN1bHQ7Cit9OworCisjaWZkZWYgVU5JQ09ERQorICAgICNkZWZpbmUgRlJPTV9PTEVfU1RSSU5HKHN0cikJCXN0cgorICAgICNkZWZpbmUgRlJPTV9PTEVfU1RSSU5HX0JVRihzdHIsYnVmKQlzdHIKKyAgICAjZGVmaW5lIFRPX09MRV9TVFIoc3RyKQkJCXN0cgorICAgICNkZWZpbmUgVE9fT0xFX1NUUl9CVUYoc3RyLGJ1ZikJCXN0cgorICAgICNkZWZpbmUgTUFYX09MRV9TVFIJCQkJMQorI2Vsc2UKKyAgICAjZGVmaW5lIEZST01fT0xFX1NUUihzdHIpCQkJQ29udmVydFRvQW5zaShzdHIpCisgICAgI2RlZmluZSBGUk9NX09MRV9TVFJfQlVGKHN0cixidWYpCQlDb252ZXJ0VG9BbnNpQnVmKHN0cixidWYpCisgICAgY2hhciogQ29udmVydFRvQW5zaSAoT0xFQ0hBUiogc1VuaWNvZGUpOworICAgIGNoYXIqIENvbnZlcnRUb0Fuc2lCdWYgKE9MRUNIQVIqIHNVbmljb2RlLCBjaGFyKiBCdWYpOworICAgICNkZWZpbmUgVE9fT0xFX1NUUihzdHIpCQkJQ29udmVydFRvVW5pY29kZShzdHIpCisgICAgI2RlZmluZSBUT19PTEVfU1RSX0JVRihzdHIsYnVmKQkJQ29udmVydFRvVW5pY29kZUJ1ZihzdHIsYnVmKQorICAgIE9MRUNIQVIqIENvbnZlcnRUb1VuaWNvZGUgKGNoYXIqIHNBc2NpaSk7CisgICAgT0xFQ0hBUiogQ29udmVydFRvVW5pY29kZUJ1ZiAoY2hhciogc0FzY2lpLCBPTEVDSEFSKiBCdWYpOworICAgIC8vIE1heGltdW0gbGVuZ3RoIG9mIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgYmV0d2VlbiBBbnNpICYgVW5pY29kZQorICAgICNkZWZpbmUgTUFYX09MRV9TVFIJCQkJNTAwCisjZW5kaWYKKworCisjZW5kaWYJCSAvLyBfX09MRUFVVF9IX18KZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vUkVBRE1FX1Zpc1ZpbS50eHQgYi9zcmMvVmlzVmltL1JFQURNRV9WaXNWaW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1JFQURNRV9WaXNWaW0udHh0CkBAIC0wLDAgKzEsMzIyIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitWaXN1YWwgU3R1ZGlvIC0gVmltIEludGVncmF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoQykgMTk5NyBIZWlrbyBFcmhhcmR0CisKK1Zpc1ZpbSBpcyBhIFZpc3VhbCBTdHVkaW8gQWRkLUluIHRoYXQgYWxsb3dzIFZpbSB0byBiZSBpbnRlZ3JhdGVkCithcyB0aGUgZGVmYXVsdCB0ZXh0IGVkaXRvci4gSXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFZpc3VhbAorU3R1ZGlvIGJ1aWx0LWluIGVkaXRvciB3aGVuIHlvdSBkb3VibGUtY2xpY2sgb24gYSBmaWxlIG9yIHByZXNzIEY0CithZnRlciBjb21waWxpbmcgKGl0IHdpbGwgZ28gdG8gdGhlIHByb3BlciBsaW5lIGluIHRoZSBWaW0gYnVmZmVyKS4KK1RoZSBmaWxlIGNhbiBiZSBsb2FkZWQgZXhjbHVzaXZlbHkgYnkgVmltIG9yIGFkZGl0aW9uYWxseSB0byB0aGUKK2J1aWx0aW4gVmlzdWFsIFN0dWRpbyBlZGl0b3IgKHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgaW4gdGhlIFZpc1ZpbQorY29uZmlndXJhdGlvbiBkaWFsb2cgaW5zaWRlIFZpc3VhbCBTdHVkaW8pLgorVmltIGRvZXMgbm90IHJlcGxhY2UgdGhlIFZpc3VhbCBTdHVkaW8gZWRpdG9yLCBpdCBzdGlsbCBydW5zIGluIGl0cworb3duIHdpbmRvdy4KKworVmlzVmltIGlzIGJhc2VkIHVwb24gVmlzRW1hY3MgYnkgQ2hyaXN0b3BoZXIgUGF5bmUKKyhDb3B5cmlnaHQgKEMpIENocmlzdG9waGVyIFBheW5lIDE5OTcpLgorCitBdXRob3I6IEhlaWtvIEVyaGFyZHQgPEhlaWtvLkVyaGFyZHRAbXVuaWNoLm5ldHN1cmYuZGU+CitCYXNlZCB1cG9uOiBWaXNFbWFjcyBieSBDaHJpc3RvcGhlciBQYXluZSA8cGF5bmVjYUBzYWdpYW4uY29tPgorVmVyc2lvbjogMS4wCitDcmVhdGVkOiAyMyBPY3QgMTk5NworRGF0ZTogMjMgT2N0IDE5OTcKKworVmlzVmltIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVmlzVmltIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorCitWaXNWaW0gd29ya3Mgd2l0aCB0aGUgKk9MRS1lbmFibGVkKiB2ZXJzaW9uIG9mIFZpbSB2ZXJzaW9uIDUuMCBhbmQgaGlnaGVyCitvbmx5ISEhICBZb3UgbXVzdCBkb3dubG9hZCB0aGUgZXh0cmEgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBPTEUtZW5hYmxlZAorZXhlY3V0YWJsZSBmcm9tIHlvdXIgVmltIGRvd25sb2FkIHNpdGUuICBXaGVuIGJ1aWxkaW5nIHlvdXIgb3duIFZpbQorZXhlY3V0YWJsZSwgdXNlIHRoZSBpZl9vbGVfdmMubWFrIG1ha2VmaWxlIChWaW0gNS4xIGFuZCBoaWdoZXIpLgorVmlzVmltIG5lZWRzIERldlN0dWRpbyA1LjAgb3IgaGlnaGVyLiBJdCBkb2VzIG5vdCB3b3JrIHdpdGggRGV2U3R1ZGlvIDQuMi4KKworCitJbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLQorCisxKSBDbG9zZSBydW5uaW5nIGluc3RhbmNlcyBvZiBEZXZTdHVkaW8uCisKKzIpIENvcHkgVmlzVmltLmRsbCBpbnRvIGEgY29udmVuaWVudCBkaXJlY3RvcnkgbGlrZSBcdmltLAorICAgXHZpbVxsaWIsIG9yIFx2aW1cYWRkaW4KKworMykgUmVnaXN0ZXIgdGhlIERMTCB1c2luZyByZWdzdnIzMi5leGUgLi4uICAoU2tpcCB0aGlzIG9uIFdpbmRvd3MgOTUvOTgpCisgICBFeGFtcGxlOgorICAgPiBjZCBcdmltXGFkZGluCisgICA+IHJlZ3N2cjMyIFZpc1ZpbS5kbGwKKyAgIE9uIE5ULCB5b3Ugc2hvdWxkIGRvIHRoaXMgZnJvbSBhbiBhZG1pbmlzdHJhdG9yIGFjY291bnQuCisgICBCZWZvcmUgaW5zdGFsbGluZyBhIG5ldyB2ZXJzaW9uIG9mIFZpc1ZpbSB5b3Ugc2hvdWxkIHVucmVnaXN0ZXIKKyAgIHRoZSBvbGQgb25lIHVzaW5nCisgICA+IHJlZ3N2cjMyIC11bnJlZ2lzdGVyIFZpc1ZpbS5kbGwKKyAgIFRoZSBiYXRjaCBmaWxlcyByZWdpc3Rlci5iYXQgYW5kIHVucmVnaXN0ZXIuYmF0IGNhbiBkbyB0aGF0IGZvciB5b3UuCisKKzNhKSBJZiB5b3UgZGlkbid0IGRvIHRoaXMgeWV0OiBSZWdpc3RlciB0aGUgT0xFIGd2aW06CisgICA+IGd2aW0gLXJlZ2lzdGVyCisKKzQpIFN0YXJ0IFZpc3VhbCBTdHVkaW8gYW5kIGdvIHRvOgorICAgICAgVG9vbHMKKwkgQ3VzdG9taXplLi4uCisJICAgIEFkZC1JbnMgYW5kIE1hY3JvIEZpbGVzCisKKzUpIENsaWNrIG9uIEJyb3dzZSwgYW5kIHBvaW50IFZpc3VhbCBTdHVkaW8gdG8geW91ciBWaXNWaW0uZGxsIGZpbGUuCisKKzYpIENsaWNrIHRoZSBjaGVja2JveCB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IHRvIHVzZSB0aGUgQWRkLUluLCBhbmQKKyAgIENsb3NlIHRoZSBDdXN0b21pemUgZGlhbG9nIGJveC4KKworNykgWW91IHNob3VsZCBub3RpY2UgdGhlIFZpc1ZpbSBUb29sYmFyIHdpdGggdGhlIFZpbSBJY29uLgorICAgQ2xpY2sgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHRvb2xiYXIgdG8gZ2V0IHRvIHRoZSBvcHRpb25zIGRpYWxvZy4KKworCitDb21waWxpbmcgVmlzVmltCistLS0tLS0tLS0tLS0tLS0tCisKK1R3byBPcHRpb25zOgorCisxKSBMb2FkIHRoZSBWaXNWaW0ubWFrIGZpbGUgYXMgYSBXb3Jrc3BhY2UgaW4gVmlzdWFsIFN0dWRpbyBhbmQgY29tcGlsZQorCisyKSBVc2UgdGhlIE1TVkMgY29tbWFuZCBsaW5lIGNvbXBpbGVyOgorCXZjdmFyczMyCisJbm1ha2UgLWYgVmlzVmltLm1haworCisKK1VzaW5nIFZpc1ZpbQorLS0tLS0tLS0tLS0tCisKK1RoZSBWaXNWaW0gRExMIGV4cG9zZXMgc2V2ZXJhbCBmdW5jdGlvbnMgdG8gdGhlIHVzZXIuIFRoZXNlIGZ1bmN0aW9ucyBhcmUKK2FjY2Vzc2libGUgdXNpbmcgdGhlIHRvb2xiYXIgb3IgYnkgYXNzaWduaW5nIGhvdGtleXMgdG8gdGhlbSAoc2VlIGJlbG93KS4KK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB2aXNpYmxlIG9uIHRoZSB0b29sYmFyIChmcm9tIGxlZnQgdG8gcmlnaHQpOgorCisxLiBWaXNWaW0gc2V0dGluZ3MgZGlhbG9nCisgICBUaGUgc2V0dGluZ3MgeW91IGFkanVzdCBoZXJlIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlZ2lzdHJ5IGFuZAorICAgd2lsbCBiZSByZWxvYWRlZCBvbiBwcm9ncmFtIHN0YXJ0dXAuCisKKzIuIEVuYWJsZSBWaW0KKyAgIEVuYWJsZXMgVmltIGFzIFZpc3VhbCBTdHVkaW8gZWRpdG9yLiBDb250cm9sIHdpbGwgYmUgc3dpdGNoZWQgdG8gVmltIHdoZW46CisgICAtIENsaWNraW5nIGEgZmlsZSBpbiB0aGUgZmlsZSB2aWV3CisgICAtIENsaWNraW5nIGEgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBsaW5lCisgICAtIFVzaW5nIHRoZSAnRmlsZS1PcGVuJyBEaWFsb2cKKyAgIC0gU2hvd2luZyB0aGUgY3VycmVudCBzb3VyY2UgbGluZSB3aGVuIGVuY291bnRlcmluZyBhIGRlYnVnZ2VyIGJyZWFrcG9pbnQuCisgICAtIFVzaW5nIEZpbGUtTmV3CisKKzMuIERpc2FibGUgVmltCisgICBUaGUgaW50ZXJuYWwgVmlzdWFsIFN0dWRpbyBlZGl0b3Igd2lsbCBiZSB1c2VkIHRvIGVkaXQgZmlsZXMuCisKKzQuIFRvZ2dsZSBlbmFibGUgc3RhdGUKKyAgIFRvZ2dsZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiBWaXNWaW0uIFVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHRvIGhhdmUKKyAgIG9uZSBidXR0b24gb25seSB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlIFZpbS4KKworNS4gTG9hZCBjdXJyZW50IGZpbGUgaW4gVmltCisgICBMb2FkcyB0aGUgZmlsZSBzaG93biBpbiB0aGUgaW50ZXJuYWwgZWRpdG9yIGludG8gVmltLiBVc2UgdGhpcyBmdW5jdGlvbiBpZgorICAgeW91IHdhbnQgdGhlIGludGVybmFsIGVkaXRvciB0byBzdGF5IGFjdGl2ZSBhbmQganVzdCBlZGl0IG9uZSBmaWxlIGluIFZpbS4KKyAgIFRoaXMgY29tbWFuZCB3b3JrcyBhbHdheXMgd2hldGhlciBWaW0gaXMgZW5hYmxlZCBhcyBkZWZhdWx0IGVkaXRvciBvciBub3QuCisKK1lvdSBjYW5ub3QgdXNlIERldlN0dWRpbydzIGRlYnVnZ2VyIGNvbW1hbmRzIGZyb20gaW5zaWRlIFZpbSwgc28geW91IHNob3VsZAorZGlzYWJsZSBWaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGRlYnVnZ2VyLgorCitZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgVmltIHRvb2xiYXIgaXRzZWxmIG9yIGFkZCB0aGUgVmltIGJ1dHRvbnMgdG8gb3RoZXIKK3Rvb2xiYXJzLgorVG8gaGF2ZSBmYXN0IGFjY2VzcyB0byB0aGUgVmlzVmltIG9wdGlvbnMgZGlhbG9nIEkgc3VnZ2VzdCB0byBjcmVhdGUga2V5Ym9hcmQKK3Nob3J0Y3V0czoKKworMSkgQ2hvb3NlCisgICAgICBUb29scworCSBDdXN0b21pemUuLi4KKwkgICAgS2V5Ym9hcmQKKzIpIENob29zZSBDYXRlZ29yeTpBZGRJbnMgYW5kIENvbW1hbmRzOlZpc1ZpbS4KKzMpIENob29zZSAnTWFpbicgYXMgZWRpdG9yLCBlbnRlciBlYWNoIGhvdGtleSBhbmQgcHJlc3MgdGhlIEFzc2lnbiBidXR0b24uCisgICBJIHN1Z2dlc3Q6CisgICAgICAgVmlzVmltRGlhbG9nQ21kICAgIEFsdCtTaGlmdCtWCisgICAgICAgVmlzVmltRW5hYmxlQ21kICAgIEFsdCtTaGlmdCtFCisgICAgICAgVmlzVmltRGlzYWJsZUNtZCAgIEFsdCtTaGlmdCtECisgICAgICAgVmlzVmltVG9nZ2xlQ21kICAgIEFsdCtTaGlmdCtUCisgICAgICAgVmlzVmltTG9hZENtZCAgICAgIEFsdCtTaGlmdCtHCis0KSBDbG9zZSB0aGUgZGlhbG9nCisKK05vdyBhIHR5cGljYWwgZGVidWdnaW5nIGV4YW1wbGU6CisKK1VzaW5nICJBbHQrU2hpZnQrZCIgeW91IHR1cm4gb2ZmIFZpbSBiZWZvcmUgc3RhcnRpbmcgdGhlIGRlYnVnZ2VyLgorQWZ0ZXIgaGl0dGluZyB0aGUgYnJlYWtwb2ludCB5b3Ugc2luZ2xlIHN0ZXAgdGhyb3VnaCB5b3VyIGFwcGxpY2F0aW9uCit1c2luZyB0aGUgaW50ZXJuYWwgc291cmNlIGNvZGUgZWRpdG9yIGFuZCBleGFtaW5lIHZhcmlhYmxlcy4KK1doZW4geW91IHN0dW1ibGUgYWNyb3NzIHRoZSBsaW5lIHdpdGggdGhlIG51bGwgcG9pbnRlcgorYXNzaWdubWVudCwganVzdCBwcmVzcyAiQWx0K1NoaWZ0K2ciLCBhbmQgY29ycmVjdCB0aGUgZXJyb3IgaW4gVmltLgorU2F2ZSB0aGUgZmlsZSwgcHJlc3MgQWx0K1RhYiB0byByZXR1cm4gdG8gRGV2U3R1ZGlvIGFuZCBwcmVzcyBGNyB0byBjb21waWxlLgorVGhhdCdzIGl0LgorCisKK1Ryb3VibGVzaG9vdGluZworLS0tLS0tLS0tLS0tLS0tCisKKzEuIFdoZW4gb3BlbmluZyBhIGZpbGUgaW4gRGV2U3R1ZGlvIHRoZSBmaWxlIGlzIG9wZW5lZCBpbiB0aGUgRGV2U3R1ZGlvCisgICBlZGl0b3IgYW5kIGltbWVkaWF0ZWx5IHZhbmlzaGVzLiBObyBWaW0gc2hvd3MgdXAuCisgICBDYXVzZTogICAgICAgUHJvYmFibHkgeW91IGRvbid0IGhhdmUgdGhlIE9MRS1lbmFibGVkIFZpbSBvciB5b3UgZGlkbid0CisJCXJlZ2lzdGVyIGl0LgorICAgRXhwbGFuYXRpb246IFZpc1ZpbSBpcyBub3RpZmllZCBieSBEZXZTdHVkaW8gaWYgYW4gJ29wZW4gZG9jdW1lbnQnIGV2ZW50CisJCW9jY3Vycy4gSXQgdGhlbiBjbG9zZXMgdGhlIGRvY3VtZW50IGluIHRoZSBpbnRlcm5hbCBlZGl0b3IKKwkJYW5kIHRyaWVzIHRvIHN0YXJ0IFZpbS4gSWYgVmltIGlzbid0IHByb3Blcmx5IE9MRS1yZWdpc3RlcmVkLAorCQl0aGlzIHdvbid0IHdvcmsuCisgICBXb3JrYXJvdW5kOiAgRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIE9MRS1lbmFibGUgdmVyc2lvbiBvZiBWaW0gYW5kCisJCWV4ZWN1dGUgImd2aW0gLXJlZ2lzdGVyIi4KKworMi4gU29tZXRpbWVzIHdoZW4gY2xpY2tpbmcgb24gYSBmaWxlLCB0aGUgZmlsZSB3b24ndCBiZSBvcGVuZWQgYnkgVmltIGJ1dAorICAgaW5zdGVhZCB0aGUgVmlzdWFsIFN0dWRpbyBlZGl0b3IgY29tZXMgdXAuCisgICBDYXVzZTogICAgICAgVGhlIGZpbGUgd2FzIGFscmVhZHkgbG9hZGVkIGJ5IHRoZSBEZXZTdHVkaW8gZWRpdG9yLgorICAgRXhwbGFuYXRpb246IFZpc1ZpbSB3b3JrcyBieSBob29rcyBleHBvc2VkIGJ5IFZpc3VhbCBTdHVkaW8uCisJCU1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgd29ya3MgZnJvbSB0aGUgT3BlbkRvY3VtZW50IGhvb2suCisJCUlmIGEgZG9jdW1lbnQgaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIFZpc3VhbCBTdHVkaW8gZWRpdG9yLAorCQlubyAnb3BlbiBkb2N1bWVudCcgZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBjbGlja2luZyB0aGUKKwkJZmlsZSBpbiB0aGUgZmlsZSBsaXN0LgorICAgV29ya2Fyb3VuZDogIENsb3NlIHRoZSBkb2N1bWVudCBpbiBWaXN1YWwgU3R1ZGlvIGZpcnN0LgorCiszLiBJIGNhbid0IGdldCBWaXNWaW0gdG8gd29yay4gRWl0aGVyIHRoZSBWaW0gdG9vbGJhciBkb2VzIG5vdCBhcHBlYXIgYXQgYWxsCisgICBvciB3ZWlyZCBjcmFzaGVzIGhhcHBlbi4KKyAgIENhdXNlOiAgICAgICBUaGUgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gaXMgbWVzc2VkIHVwLgorICAgRXhwbGFuYXRpb246IEkgY2FuJ3QgZ2l2ZSB5b3Ugb25lLiBBc2sgTSQuCisgICBXb3JrYXJvdW5kOiAgUmVpbnN0YWxsIERldlN0dWRpbyAoSSBrbm93IHRoaXMgaXMgYnJ1dGUsIGJ1dCBpbiBzb21lIGNhc2VzCisJCWl0IGhlbHBlZCkuIFRoZXJlIHdhcyBvbmUgY2FzZSB3aGVyZSB0aGUgc2VydmljZSBwYWNrIDEgaGFkCisJCXRvIGJlIGluc3RhbGxlZCwgdG9vLgorCis0LiBJZiBhbiBpbnN0YW5jZSBvZiBWaW0gaXMgYWxyZWFkeSBydW5uaW5nLCBWaXNWaW0gd2lsbCB1c2UgdGhhdCBpbnN0YW5jZQorICAgYW5kIG5vdCBzdGFydCBhIG5ldyBvbmUuCisgICBDYXVzZToJIFRoaXMgaXMgcHJvcGVyIE9MRSBiZWhhdmlvdXIKKyAgIEV4cGxhbmF0aW9uOiAgU29tZSBjYWxsIGl0IGEgYnVnLCBzb21lIGEgZmVhdHVyZS4gVGhhdCdzIGp1c3QgdGhlIHdheSBPTEUKKwkJIHdvcmtzLgorCis1LiBXaGVuIGJlaW5nIGluIGluc2VydCBtb2RlIGluIFZpbSBhbmQgc2VsZWN0aW5nIGEgZmlsZSBpbiBWaXN1YWwgU3R1ZGlvLAorICAgdGhlIFZpbSBjb21tYW5kIDplIC4uLiBpcyBpbnNlcnRlZCBhcyB0ZXh0IGluc3RlYWQgb2YgYmVpbmcgZXhlY3V0ZWQuCisgICBDYXVzZToJIFlvdSBwcm9iYWJseSBrbm93Li4uCisgICBFeHBsYW5hdGlvbjogIFRoZSBWaW0gT0xFIGF1dG9tYXRpb24gaW50ZXJmYWNlIGludGVycHJldGVzIHRoZSBWaXNWaW0KKwkJIGNvbW1hbmRzIGFzIGlmIHRoZXkgd2VyZSB0eXBlZCBpbiBieSB0aGUgdXNlci4KKwkJIFNvIGlmIHlvdSdyZSBpbiBpbnNlcnQgbW9kZSBWaW0gY29uc2lkZXJzIGl0IHRvIGJlIHRleHQuCisJCSBJIGRlY2lkZWQgYWdhaW5zdCBzZW5kaW5nIGFuIEVTQyBiZWZvcmUgdGhlIGNvbW1hbmQgYmVjYXVzZQorCQkgaXQgbWF5IGNhdXNlIGEgYmVlcCBvciBhdCBsZWFzdCBhIHNjcmVlbiBmbGFzaCB3aGVuIG5vZWIgaXMKKwkJIHNldC4KKyAgIFdvcmthcm91bmQ6CSBHZXQgdXNlZCB0byBwcmVzcyBFU0MgYmVmb3JlIHN3aXRjaGluZyB0byBEZXZTdHVkaW8uCisKKzYuIEknbSB0aXJlZCBvZiBWaXNWaW0gYnV0IEkgY2FuJ3QgZ2V0IHJpZCBvZiBpdC4gSSBjYW4ndCBkZWxldGUgaXQgaW4KKyAgIFRvb2xzLUN1c3RvbWl6ZS1BZGQtSW5zLgorICAgQ2F1c2U6CSBZb3UgY2FuJ3QgZGVsZXRlIGFuIGl0ZW0geW91IG9uY2UgYWRkZWQgdG8gdGhlIGFkZC1pbnMKKwkJIGxpc3QgYm94LgorICAgRXhwbGFuYXRpb246ICBNJCBqdXN0IGRpZG4ndCBwdXQgYSAnZGVsZXRlJyBidXR0b24gaW4gdGhlIGRpYWxvZyBib3guCisJCSBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIERFTCBrZXkgYWNjZWxsZXJhdG9yIGFzIHdlbGwuLi4KKyAgIFdvcmthcm91bmQ6CSBZb3UgY2FuJ3Qga2lsbCBpdCwgYnV0IHlvdSBjYW4ga25vY2sgaXQgb3V0OgorCQkgMS4gVW5jaGVjayB0aGUgY2hlY2sgYm94IGluIGZyb250IG9mICdWaW0gRGV2ZWxvcGVyIFN0dWRpbworCQkgICAgQWRkLWluJy4KKwkJIDIuIENsb3NlIFZpc3VhbCBTdHVkaW8uCisJCSAzLiBEZWxldGUgVmlzVmltLmRsbCBvciBtb3ZlIGl0IHNvbWV3aGVyZSBpdCBjYW4ndCBiZSBmb3VuZC4KKwkJIDQuIFJ1biBWaXN1YWwgU3R1ZGlvLgorCQkgNS4gVG9vbHMgLT4gQ3Vyc29taXplIC0+QWRkLWlucyBhbmQgTWFjcm8tRmlsZXMuCisJCSA2LiBBIG1lc3NhZ2UgYXBwZWFyczoKKwkJICAgICIuLi4vVmlzVmltLmRsbCIgIlRoaXMgYWRkLWluIG5vIGxvbmdlciBleGlzdHMuICBJdCB3aWxsCisJCSAgICBubyBsb25nZXIgYmUgZGlzcGxheWVkLiIKKwkJIFRoYXQncyBpdCEKKworCitDaGFuZ2UgaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0KKworMS4wYSB0byAxLjAKKy0tLS0tLS0tLS0tCisKKy0gQWxsIHNldHRpbmdzIGluIHRoZSBWaXNWaW0gZGlhbG9nIGFyZSByZW1lbWJlcmVkIGJldHdlZW4gRGV2U3R1ZGlvIHNlc3Npb25zCisgIGJ5IGtlZXBpbmcgdGhlbSBpbiB0aGUgcmVnaXN0cnkgKEhLRVlfQ1VSUkVOVF9VU0VSXFNvZnR3YXJlXFZpbVxWaXNWaW0pLgorLSBBZGRlZCBhbiBvcHRpb24gdG8gZG8gYSA6Y2QgYmVmb3JlIG9wZW5pbmcgdGhlIGZpbGUgKGhhdmluZyBhIGZpbGUgb3BlbmVkCisgIGJ5IGNsaWNraW5nIGl0IGJ1dCBmaW5kaW5nIG91dCB0byBiZSBzdGlsbCBpbiBDOlxXaW5kb3dzXHN5c3RlbSB3aGVuIHRyeWluZyB0bworICBvcGVuIGFub3RoZXIgZmlsZSBieSAiOmUiIGNhbiBiZSBhbm5veWluZykuIENoYW5nZSBkaXJlY3RvcnkgY2FuIGJlCisgIGRvbmUgdG8gdGhlIHNvdXJjZSBmaWxlJ3MgZGlyZWN0b3J5IG9yIGl0J3MgcGFyZW50IGRpcmVjdG9yeS4KKy0gQWRkZWQgc29tZSBleHBsYW5hdGlvbnMgdG8gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBDT19FX0NMQVNTU1RSSU5HIGVycm9yCisgICgiVXNlIE9MRSBWaW0gYW5kIG1ha2Ugc3VyZSB0byByZWdpc3Rlci4uLiIpLgorCisxLjAgdG8gMS4xYQorLS0tLS0tLS0tLS0KKworLSBUaGUgVmlzVmltIHRvb2xiYXIgYnV0dG9uIG5vdyBzaG93cyB0aGUgbmV3IFZpbSBpY29uIGluc3RlYWQgb2YgdGhlIG9sZCBvbmUuCistIE1hZGUgc29tZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLCBhZGRlZCB0aGUgdHJvdWJsZXNob290aW5nIGNoYXB0ZXIKKyAgYW5kIFRvRG8gbGlzdC4KKy0gRmlsZS1OZXctKiBub3cgaW52b2tlcyBWaW0gaW5zdGVhZCBvZiB0aGUgYnVpbHRpbiBlZGl0b3IgaWYgZW5hYmxlZC4KKworMS4xIHRvIDEuMWIKKy0tLS0tLS0tLS0tCisKKy0gRXh0ZW5kZWQgdGhlIFZpc1ZpbSB0b29sYmFyIHRvIGhhdmUgbXVsdGlwbGUgYnV0dG9ucyBpbnN0ZWFkIG9mIG9uZS4KKy0gTW92ZWQgdGhlIGVuYWJsZS9kaXNhYmxlIGNvbW1hbmRzIGZyb20gdGhlIHNldHRpbmdzIGRpYWxvZyB0byB0aGUgdG9vbGJhci4KKy0gQWRkZWQgdGhlIHRvZ2dsZSBlbmFibGUvZGlzYWJsZSBjb21tYW5kCistIEFkZGVkIHRoZSAnbG9hZCBjdXJyZW50IGZpbGUnIGNvbW1hbmQuCisKKzEuMWIgdG8gMS4yCistLS0tLS0tLS0tLQorCitObyBuZXcgZmVhdHVyZXMsIGp1c3Qgc29tZSBmaW5lIHR1bmluZzoKKworLSBDaGFuZ2VkIHRoZSBHVUlEIG9mIHRoZSBWaXNWaW0gT0xFIGludGVyZmFjZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBhCisgIHZlcnNpb24gb2YgVmlzRW1hY3Mgb3IgVmlzVmlsZSBvbiB0aGUgc2FtZSBjb21wdXRlciAoR3V5IEdhc2NvaWduZSkKKy0gRml4ZWQgYSBidWcgY2F1c2VkIGJ5IGEgYnVnIGluIHRoZSBEZXZlbG9wZXIgU3R1ZGlvIGFkZC1pbiBjb2RlIGdlbmVyYXRvcgorICAoQ2xhcmsgTW9yZ2FuKQorLSBGaXhlZCBhIG1lbW9yeSBsZWFrIChDbGFyayBNb3JnYW4pCistIEFkZGVkIGFuIG9wdGlvbiBpbiB0aGUgVmlzVmltIGRpYWxvZyB0byBwcmVwZW5kIEVTQyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hbmQKKyAgdGhhdCBpcyBzZW50IHRvIFZpbS4gVGhpcyB3aWxsIGF2b2lkIGluc2VydGluZyB0aGUgY29tbWFuZCBhcyB0ZXh0IHdoZW4gVmltCisgIGlzIHN0aWxsIGluIGluc2VydCBtb2RlLgorLSBBbiA6dXBkYXRlIGNvbW1hbmQgaXMgc2VudCB0byBWaW0gYmVmb3JlIGFueSBvdGhlciBjb21tYW5kIHRvIHVwZGF0ZSB0aGUKKyAgY3VycmVudCBmaWxlIGlmIGl0IGlzIG1vZGlmaWVkLCBvciBlbHNlIHRoZSBmb2xsb3dpbmcgOmNkIG9yIDplIGNvbW1hbmQgd2lsbCBmYWlsLgorCisxLjIgdG8gMS4zYQorLS0tLS0tLS0tLS0KKworLSBGaXhlZCBhIGJ1ZyBjYXVzZWQgYnkgYSBtaXNzaW5nIEVuYWJsZU1vZGVsZXNzKCkgZnVuY3Rpb24gY2FsbCBpbiBWaW1Mb2FkKCkuCisgIFRoaXMgc2VlbXMgdG8gcmVkdWNlIFZpc1ZpbSBjcmFzaGluZyBEZXZTdHVkaW8gb24gc29tZSBzeXN0ZW1zIChpdAorICBvY2Nhc2lvbmFsbHkgc3RpbGwgc2VlbXMgdG8gaGFwcGVuLCBidXQgaXQncyBtb3JlIHN0YWJsZSBub3cpLgorICAoVmluY2UgTmVncmkpCistIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBuZXcgQ1RSTC1cIENUUkwtTiBjb21tYW5kIG9mIFZpbSA1LjRhLgorICBUaGlzIHByZXZlbnRzIFZpbSBmcm9tIGJlZXBpbmcgd2hlbiBhIFZpc1ZpbSBjb21tYW5kIGlzIGV4ZWN1dGVkIGFuIFZpbSBpcworICBub3QgaW4gaW5zZXJ0IG1vZGUuCisKKworVG9EbyBMaXN0CistLS0tLS0tLS0KKworUDEgaXMgaGlnaGVzdCBwcmlvcml0eSwgUDEwIGxvd2VzdAorCitQOSAgU3dpdGNoaW5nIHRvIERldlN0dWRpbyB1c2luZyBBTFQtVEFCIG1heSBnZXQgYW5ub3lpbmcuIFdvdWxkIGJlIG5pY2UgdG8KKyAgICBoYXZlIHRoZSBvcHRpb24gdG8gbWFwIEFjdGl2YXRlQXBwbGljYXRpb24oIlZpc3VhbCBTdHVkaW8iKSBpbiBWaW0uCisgICAgVmltIERMTHMgd291bGQgc29sdmUgdGhhdCBwcm9ibGVtLgorCitQOCAgRXhlY3V0ZSA6dGFnIGNvbW1hbmQgaW4gVmltIGZvciB3b3JkIHVuZGVyIGN1cnNvciBpbiBEZXZTdHVkaW8KKworUDcgIENvbnRyb2xsaW5nIHRoZSBWaXN1YWwgU3R1ZGlvIERlYnVnZ2VyIGZyb20gaW5zaWRlIFZpbQorICAgIFNlZSBtZXNzYWdlIGFib3ZlLiBBbHNvIGEgJ0RlYnVnJyBoaWdobGlnaCBncm91cCBhbmQgYQorICAgIGNvbW1hbmQgdG8gaGlnaGxpZ2h0IGEgY2VydGFpbiBsaW5lIHdvdWxkIGJlIG5lY2Vzc2FyeS4KKworUDYgIFByb3ZpZGUgYW4gb3B0aW9uIHRvIG9wZW4gdGhlIGN1cnJlbnQgZmlsZSBpbiBWaXNWaW0gaW4KKyAgICBWaXN1YWwgU3R1ZGlvIGVkaXRvcgorICAgIFNhbWUgYXMgYWJvdmUgbWVzc2FnZS4gQSBraW5kIG9mIHR3byB3YXkgT0xFIGF1dG9tYXRpb24gd291bGQgaGF2ZSB0byBiZQorICAgIGVzdGFibGlzaGVkIGJldHdlZW4gVmlzVmltIGFuZCBWaW0uIEFsc28gYSAnRGVidWcnIGhpZ2hsaWdodCBncm91cCBhbmQgYQorICAgIGNvbW1hbmQgdG8gaGlnaGxpZ2h0IGEgY2VydGFpbiBsaW5lIHdvdWxkIGJlIG5lY2Vzc2FyeS4KKworCitLbm93biBQcm9ibGVtcworLS0tLS0tLS0tLS0tLS0KKworLSBPY2Nhc2lvbmFsIG1lbW9yeSBjb3JydXB0aW9ucyBpbiBEZXZTdHVkaW8gbWF5IGFwcGVhciBvbiBzb21lIHN5c3RlbXMuCisgIFJlaW5zdGFsbGluZyBEZXZTdHVkaW8gaGVscGVkIGluIHNvbWUgY2FzZXMuCisgIFRoZSBjYXVzZSBvZiB0aGVzZSBjcmFzaGVzIGlzIHVuY2xlYXI7IHRoZXJlIGlzIG5vIHdheSB0byBkZWJ1ZyB0aGlzLgorICBSZWNvbXBpbGluZyBWaXNWaW0gd2l0aCBEZXZTdHVkaW8gU1AzIGRpZG4ndCBoZWxwLgorICBJIGFzc3VtZSBpdCdzIGEgcHJvYmxlbSBkZWVwIGluc2lkZSB0aGUgRGV2U3R1ZGlvIGFkZC1pbiBPTEUgaW50ZXJmYWNlcy4KKyAgVGhpcyB3aWxsIGhvcGVmdWxseSBiZSBmaXhlZCB3aXRoIERldlN0dWRpbyA2LgorCisKK0hhdmUgZnVuIQorCitIZWlrbyBFcmhhcmR0CitIZWlrby5FcmhhcmR0QG11bmljaC5uZXRzdXJmLmRlCisKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vUmVnLmNwcCBiL3NyYy9WaXNWaW0vUmVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDM3OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9SZWcuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlICJzdGRhZnguaCIKKworLy8gUmV0dXJucyBrZXkgZm9yIEhLRVlfQ1VSUkVOVF9VU0VSXCJTb2Z0d2FyZSJcQ29tcGFueVxBcHBOYW1lCisvLyBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0CisvLyByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGNhbGwgUmVnQ2xvc2VLZXkoKSBvbiB0aGUgcmV0dXJuZWQgSEtFWQorLy8KK0hLRVkgR2V0QXBwS2V5IChjaGFyKiBBcHBOYW1lKQoreworCUhLRVkgaEFwcEtleSA9IE5VTEw7CisJSEtFWSBoU29mdEtleSA9IE5VTEw7CisJaWYgKFJlZ09wZW5LZXlFeCAoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZSIsIDAsIEtFWV9XUklURSB8IEtFWV9SRUFELAorCQkmaFNvZnRLZXkpID09IEVSUk9SX1NVQ0NFU1MpCisJeworCQlEV09SRCBEdW1teTsKKwkJUmVnQ3JlYXRlS2V5RXggKGhTb2Z0S2V5LCBBcHBOYW1lLCAwLCBSRUdfTk9ORSwKKwkJCVJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLCBLRVlfV1JJVEUgfCBLRVlfUkVBRCwgTlVMTCwKKwkJCSZoQXBwS2V5LCAmRHVtbXkpOworCX0KKwlpZiAoaFNvZnRLZXkpCisJCVJlZ0Nsb3NlS2V5IChoU29mdEtleSk7CisKKwlyZXR1cm4gaEFwcEtleTsKK30KKworLy8gUmV0dXJucyBrZXkgZm9yCisvLyBIS0VZX0NVUlJFTlRfVVNFUlwiU29mdHdhcmUiXFJlZ2lzdHJ5S2V5XEFwcE5hbWVcU2VjdGlvbgorLy8gY3JlYXRpbmcgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4KKy8vIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gY2FsbCBSZWdDbG9zZUtleSAoKSBvbiB0aGUgcmV0dXJuZWQgSEtFWQorLy8KK0hLRVkgR2V0U2VjdGlvbktleSAoSEtFWSBoQXBwS2V5LCBMUENUU1RSIFNlY3Rpb24pCit7CisJSEtFWSBoU2VjdGlvbktleSA9IE5VTEw7CisJRFdPUkQgRHVtbXk7CisJUmVnQ3JlYXRlS2V5RXggKGhBcHBLZXksIFNlY3Rpb24sIDAsIFJFR19OT05FLAorCQlSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwgS0VZX1dSSVRFfEtFWV9SRUFELCBOVUxMLAorCQkmaFNlY3Rpb25LZXksICZEdW1teSk7CisJcmV0dXJuIGhTZWN0aW9uS2V5OworfQorCitpbnQgR2V0UmVnaXN0cnlJbnQgKEhLRVkgaFNlY3Rpb25LZXksIExQQ1RTVFIgRW50cnksIGludCBEZWZhdWx0KQoreworCURXT1JEIFZhbHVlOworCURXT1JEIFR5cGU7CisJRFdPUkQgQ291bnQgPSBzaXplb2YgKERXT1JEKTsKKwlpZiAoUmVnUXVlcnlWYWx1ZUV4IChoU2VjdGlvbktleSwgKExQVFNUUikgRW50cnksIE5VTEwsICZUeXBlLAorCQkJICAgICAoTFBCWVRFKSAmVmFsdWUsICZDb3VudCkgPT0gRVJST1JfU1VDQ0VTUykKKwkJcmV0dXJuIFZhbHVlOworCXJldHVybiBEZWZhdWx0OworfQorCitib29sIFdyaXRlUmVnaXN0cnlJbnQgKEhLRVkgaFNlY3Rpb25LZXksIGNoYXIqIEVudHJ5LCBpbnQgblZhbHVlKQoreworCXJldHVybiBSZWdTZXRWYWx1ZUV4IChoU2VjdGlvbktleSwgRW50cnksIE5VTEwsIFJFR19EV09SRCwKKwkJKExQQllURSkgJm5WYWx1ZSwgc2l6ZW9mIChuVmFsdWUpKSA9PSBFUlJPUl9TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9zcmMvVmlzVmltL1JlZ2lzdGVyLmJhdCBiL3NyYy9WaXNWaW0vUmVnaXN0ZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWY1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1JlZ2lzdGVyLmJhdApAQCAtMCwwICsxIEBACityZWdzdnIzMi5leGUgdmlzdmltLmRsbApkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9SZXNvdXJjZS5oIGIvc3JjL1Zpc1ZpbS9SZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOThiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1Jlc291cmNlLmgKQEAgLTAsMCArMSwyOSBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBWaXNWaW0ucmMKKy8vCisjZGVmaW5lIElEU19WSVNWSU1fTE9OR05BTUUJCTEKKyNkZWZpbmUgSURTX1ZJU1ZJTV9ERVNDUklQVElPTgkJMgorI2RlZmluZSBJRFNfQ01EX0RJQUxPRwkJCTMKKyNkZWZpbmUgSURTX0NNRF9FTkFCTEUJCQk0CisjZGVmaW5lIElEU19DTURfRElTQUJMRQkJCTUKKyNkZWZpbmUgSURTX0NNRF9UT0dHTEUJCQk2CisjZGVmaW5lIElEU19DTURfTE9BRAkJCTcKKyNkZWZpbmUgSURSX1RPT0xCQVJfTUVESVVNCQkxMjgKKyNkZWZpbmUgSURSX1RPT0xCQVJfTEFSR0UJCTEyOQorI2RlZmluZSBJRERfQURESU5NQUlOCQkJMTMwCisjZGVmaW5lIElEQ19ERVZTVFVESU9fRURJVE9SCQkxMDAwCisjZGVmaW5lIElEQ19DRF9TT1VSQ0VfUEFUSAkJMTAwMQorI2RlZmluZSBJRENfQ0RfU09VUkNFX1BBUkVOVAkJMTAwMgorI2RlZmluZSBJRENfQ0RfTk9ORQkJCTEwMDMKKworLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKKy8vCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRQkxMzEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUJCTMyNzcxCisjZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFCQkxMDA0CisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRQkJMTAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9TdGRBZnguY3BwIGIvc3JjL1Zpc1ZpbS9TdGRBZnguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjZlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1N0ZEFmeC5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBTdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcworLy8JVmlzRW1hY3MucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKKy8vCXN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgorCisjaW5jbHVkZSAic3RkYWZ4LmgiCisjaW5jbHVkZSAiYXRsaW1wbC5jcHAiCmRpZmYgLS1naXQgYS9zcmMvVmlzVmltL1N0ZEFmeC5oIGIvc3JjL1Zpc1ZpbS9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJmZGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9TdGRBZnguaApAQCAtMCwwICsxLDczIEBACisvLyBTdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCisvLyAgb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0CisvLyAgICAgIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQorLy8KKworI2lmICFkZWZpbmVkKEFGWF9TVERBRlhfSF9fQUM3MjY3MEVfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRF8pCisjZGVmaW5lIEFGWF9TVERBRlhfSF9fQUM3MjY3MEVfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRF8KKworI2RlZmluZSBWQ19FWFRSQUxFQU4JCS8vIEV4Y2x1ZGUgcmFyZWx5LXVzZWQgc3R1ZmYgZnJvbSBXaW5kb3dzIGhlYWRlcnMKKworI2luY2x1ZGUgPGFmeHdpbi5oPgkgICAgLy8gTUZDIGNvcmUgYW5kIHN0YW5kYXJkIGNvbXBvbmVudHMKKyNpbmNsdWRlIDxhZnhkaXNwLmg+CisKKyNpbmNsdWRlIDxhdGxiYXNlLmg+CisvL1lvdSBtYXkgZGVyaXZlIGEgY2xhc3MgZnJvbSBDQ29tTW9kdWxlIGFuZCB1c2UgaXQgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKKy8vc29tZXRoaW5nLCBidXQgZG8gbm90IGNoYW5nZSB0aGUgbmFtZSBvZiBfTW9kdWxlCitleHRlcm4gQ0NvbU1vZHVsZSBfTW9kdWxlOworCisjaW5jbHVkZSA8YXRsY29tLmg+CisKKy8vIERldmVsb3BlciBTdHVkaW8gT2JqZWN0IE1vZGVsCisjaW5jbHVkZSA8T2JqTW9kZWxcYWRkYXV0by5oPgorI2luY2x1ZGUgPE9iak1vZGVsXGFwcGRlZnMuaD4KKyNpbmNsdWRlIDxPYmpNb2RlbFxhcHBhdXRvLmg+CisjaW5jbHVkZSA8T2JqTW9kZWxcYmxkZGVmcy5oPgorI2luY2x1ZGUgPE9iak1vZGVsXGJsZGF1dG8uaD4KKyNpbmNsdWRlIDxPYmpNb2RlbFx0ZXh0ZGVmcy5oPgorI2luY2x1ZGUgPE9iak1vZGVsXHRleHRhdXRvLmg+CisjaW5jbHVkZSA8T2JqTW9kZWxcZGJnZGVmcy5oPgorI2luY2x1ZGUgPE9iak1vZGVsXGRiZ2F1dG8uaD4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlYnVnZ2luZyBzdXBwb3J0CisKKy8vIFVzZSBWRVJJRllfT0sgYXJvdW5kIGFsbCBjYWxscyB0byB0aGUgRGV2ZWxvcGVyIFN0dWRpbyBvYmplY3RzIHdoaWNoCisvLyAgeW91IGV4cGVjdCB0byByZXR1cm4gU19PSy4KKy8vIEluIERFQlVHIGJ1aWxkcyBvZiB5b3VyIGFkZC1pbiwgVkVSSUZZX09LIGRpc3BsYXlzIGFuIEFTU0VSVCBkaWFsb2cgYm94CisvLyAgaWYgdGhlIGV4cHJlc3Npb24gcmV0dXJucyBhbiBIUkVTVUxUIG90aGVyIHRoYW4gU19PSy4gIElmIHRoZSBIUkVTVUxUCisvLyAgaXMgYSBzdWNjZXNzIGNvZGUsIHRoZSBBU1NFUlQgYm94IHdpbGwgZGlzcGxheSB0aGF0IEhSRVNVTFQuICBJZiBpdAorLy8gIGlzIGEgZmFpbHVyZSBjb2RlLCB0aGUgQVNTRVJUIGJveCB3aWxsIGRpc3BsYXkgdGhhdCBIUkVTVUxUIHBsdXMgdGhlCisvLyAgZXJyb3IgZGVzY3JpcHRpb24gc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBvYmplY3Qgd2hpY2ggcmFpc2VkIHRoZSBlcnJvci4KKy8vIEluIFJFVEFJTCBidWlsZHMgb2YgeW91ciBhZGQtaW4sIFZFUklGWV9PSyBqdXN0IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbgorLy8gIGFuZCBpZ25vcmVzIHRoZSByZXR1cm5lZCBIUkVTVUxULgorCisjaWZkZWYgX0RFQlVHCisKK3ZvaWQgR2V0TGFzdEVycm9yRGVzY3JpcHRpb24gKENDb21CU1RSICYgYnN0cik7CS8vIERlZmluZWQgaW4gVmlzVmltLmNwcAorI2RlZmluZSBWRVJJRllfT0soZikgXAorCXsgXAorCQlIUkVTVUxUIGhyID0gKGYpOyBcCisJCWlmIChociAhPSBTX09LKSBcCisJCXsgXAorCQkJaWYgKEZBSUxFRChocikpIFwKKwkJCXsgXAorCQkJCUNDb21CU1RSIGJzdHI7IFwKKwkJCQlHZXRMYXN0RXJyb3JEZXNjcmlwdGlvbihic3RyKTsgXAorCQkJCV9SUFRGMihfQ1JUX0FTU0VSVCwgIk9iamVjdCBjYWxsIHJldHVybmVkICVseFxuXG4lUyIsIGhyLCAoQlNUUikgYnN0cik7IFwKKwkJCX0gXAorCQkJZWxzZSBcCisJCQkJX1JQVEYxKF9DUlRfQVNTRVJULCAiT2JqZWN0IGNhbGwgcmV0dXJuZWQgJWx4IiwgaHIpOyBcCisJCX0gXAorCX0KKworI2Vsc2UgLy9fREVCVUcKKworI2RlZmluZSBWRVJJRllfT0soZikgKGYpOworCisjZW5kaWYgLy9fREVCVUcKKworLy97e0FGWF9JTlNFUlRfTE9DQVRJT059fQorLy8gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gd2lsbCBpbnNlcnQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwcmV2aW91cyBsaW5lLgorCisjZW5kaWYgLy8gIWRlZmluZWQoQUZYX1NUREFGWF9IX19BQzcyNjcwRV8yOTc3XzExRDFfQjJGM18wMDYwMDgwNDA3ODBfX0lOQ0xVREVEKQpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9VblJlZ2lzdC5iYXQgYi9zcmMvVmlzVmltL1VuUmVnaXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWExMDVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9VblJlZ2lzdC5iYXQKQEAgLTAsMCArMSBAQAorcmVnc3ZyMzIuZXhlIC11bnJlZ2lzdGVyIHZpc3ZpbS5kbGwKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vVmlzVmltLmNwcCBiL3NyYy9WaXNWaW0vVmlzVmltLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI5MjVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9WaXNWaW0uY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvLyBWaXNWaW0uY3BwIDogRGVmaW5lcyB0aGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgZm9yIHRoZSBETEwuCisvLworCisjaW5jbHVkZSAic3RkYWZ4LmgiCisjaW5jbHVkZSA8aW5pdGd1aWQuaD4KKyNpbmNsdWRlICJWaXNWaW0uaCIKKyNpbmNsdWRlICJEU0FkZEluLmgiCisjaW5jbHVkZSAiQ29tbWFuZHMuaCIKKworI2lmZGVmIF9ERUJVRworI2RlZmluZSBuZXcgREVCVUdfTkVXCisjdW5kZWYgVEhJU19GSUxFCitzdGF0aWMgY2hhciBUSElTX0ZJTEVbXSA9IF9fRklMRV9fOworCisjZW5kaWYKKworQ0NvbU1vZHVsZSBfTW9kdWxlOworCitCRUdJTl9PQkpFQ1RfTUFQIChPYmplY3RNYXApCitPQkpFQ1RfRU5UUlkgKENMU0lEX0RTQWRkSW4sIENEU0FkZEluKQorRU5EX09CSkVDVF9NQVAgKCkKKworY2xhc3MgQ1Zpc1ZpbUFwcCA6IHB1YmxpYyBDV2luQXBwCit7CisgICAgcHVibGljOgorCUNWaXNWaW1BcHAgKCk7CisKKwkvL3t7QUZYX1ZJUlRVQUwoQ1Zpc1ZpbUFwcCkKKyAgICBwdWJsaWM6CisJdmlydHVhbCBCT09MIEluaXRJbnN0YW5jZSAoKTsKKwl2aXJ0dWFsIGludCBFeGl0SW5zdGFuY2UgKCk7CisJLy99fUFGWF9WSVJUVUFMCisKKwkvL3t7QUZYX01TRyhDVmlzVmltQXBwKQorCS8vfX1BRlhfTVNHCisJREVDTEFSRV9NRVNTQUdFX01BUCAoKQorfTsKKworQkVHSU5fTUVTU0FHRV9NQVAgKENWaXNWaW1BcHAsIENXaW5BcHApCisvL3t7QUZYX01TR19NQVAoQ1Zpc1ZpbUFwcCkKKy8vfX1BRlhfTVNHX01BUAorRU5EX01FU1NBR0VfTUFQICgpCisKKy8vIFRoZSBvbmUgYW5kIG9ubHkgQ1Zpc1ZpbUFwcCBvYmplY3QKK0NWaXNWaW1BcHAgdGhlQXBwOworCitDVmlzVmltQXBwOjpDVmlzVmltQXBwICgpCit7Cit9CisKK0JPT0wgQ1Zpc1ZpbUFwcDo6SW5pdEluc3RhbmNlICgpCit7CisJX01vZHVsZS5Jbml0IChPYmplY3RNYXAsIG1faEluc3RhbmNlKTsKKwlyZXR1cm4gQ1dpbkFwcDo6SW5pdEluc3RhbmNlICgpOworfQorCitpbnQgQ1Zpc1ZpbUFwcDo6RXhpdEluc3RhbmNlICgpCit7CisJX01vZHVsZS5UZXJtICgpOworCXJldHVybiBDV2luQXBwOjpFeGl0SW5zdGFuY2UgKCk7Cit9CisKKy8vIFNwZWNpYWwgZW50cnkgcG9pbnRzIHJlcXVpcmVkIGZvciBpbnByb2Mgc2VydmVycworLy8KKworU1REQVBJIERsbEdldENsYXNzT2JqZWN0IChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHYpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiBfTW9kdWxlLkdldENsYXNzT2JqZWN0IChyY2xzaWQsIHJpaWQsIHBwdik7Cit9CisKK1NUREFQSSBEbGxDYW5VbmxvYWROb3cgKHZvaWQpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCXJldHVybiAoQWZ4RGxsQ2FuVW5sb2FkTm93ICgpID09IFNfT0sgJiYgX01vZHVsZS5HZXRMb2NrQ291bnQgKCkgPT0gMCkKKwkJPyBTX09LIDogU19GQUxTRTsKK30KKworLy8gQnkgZXhwb3J0aW5nIERsbFJlZ2lzdGVyU2VydmVyLCB5b3UgY2FuIHVzZSByZWdzdnIzMi5leGUKKy8vCitTVERBUEkgRGxsUmVnaXN0ZXJTZXJ2ZXIgKHZvaWQpCit7CisJQUZYX01BTkFHRV9TVEFURSAoQWZ4R2V0U3RhdGljTW9kdWxlU3RhdGUgKCkpOworCUhSRVNVTFQgaFJlczsKKworCS8vIFJlZ2lzdGVycyBvYmplY3QsIHR5cGVsaWIgYW5kIGFsbCBpbnRlcmZhY2VzIGluIHR5cGVsaWIKKwloUmVzID0gX01vZHVsZS5SZWdpc3RlclNlcnZlciAoVFJVRSk7CisJaWYgKEZBSUxFRCAoaFJlcykpCisJCS8vIEhhY2s6IFdoZW4gdGhpcyBmYWlscyB3ZSBtaWdodCBiZSBhIG5vcm1hbCB1c2VyLCB3aGlsZSB0aGUKKwkJLy8gYWRtaW4gYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBtb2R1bGUuICBSZXR1cm5pbmcgU19PSyB0aGVuCisJCS8vIG1ha2VzIGl0IHdvcmsuICBXaGVuIHRoZSBtb2R1bGUgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgaXQKKwkJLy8gd2lsbCBzb29uIGZhaWwgaW4gYW5vdGhlciB3YXkuCisJCS8vIG9sZCBjb2RlOiByZXR1cm4gaFJlczsKKwkJcmV0dXJuIFNfT0s7CisKKwlfQVRMX09CSk1BUF9FTlRSWSAqcEVudHJ5ID0gX01vZHVsZS5tX3BPYmpNYXA7CisJQ1JlZ0tleSBrZXk7CisJTE9ORyBsUmVzID0ga2V5Lk9wZW4gKEhLRVlfQ0xBU1NFU19ST09ULCBfVCAoIkNMU0lEIikpOworCisJaWYgKGxSZXMgPT0gRVJST1JfU1VDQ0VTUykKKwl7CisJCVVTRVNfQ09OVkVSU0lPTjsKKwkJTFBPTEVTVFIgbHBPbGVTdHI7CisKKwkJU3RyaW5nRnJvbUNMU0lEICgqcEVudHJ5LT5wY2xzaWQsICZscE9sZVN0cik7CisJCUxQVFNUUiBscHN6ID0gT0xFMlQgKGxwT2xlU3RyKTsKKworCQlsUmVzID0ga2V5Lk9wZW4gKGtleSwgbHBzeik7CisJCWlmIChsUmVzID09IEVSUk9SX1NVQ0NFU1MpCisJCXsKKwkJCUNTdHJpbmcgc3RyRGVzY3JpcHRpb247CisKKwkJCXN0ckRlc2NyaXB0aW9uLkxvYWRTdHJpbmcgKElEU19WSVNWSU1fREVTQ1JJUFRJT04pOworCQkJa2V5LlNldEtleVZhbHVlIChfVCAoIkRlc2NyaXB0aW9uIiksIHN0ckRlc2NyaXB0aW9uKTsKKwkJfQorCQlDb1Rhc2tNZW1GcmVlIChscE9sZVN0cik7CisJfQorCisJaWYgKGxSZXMgIT0gRVJST1JfU1VDQ0VTUykKKwkJaFJlcyA9IEhSRVNVTFRfRlJPTV9XSU4zMiAobFJlcyk7CisKKwlyZXR1cm4gaFJlczsKKworfQorCisvLyBEbGxVbnJlZ2lzdGVyU2VydmVyIC0gUmVtb3ZlcyBlbnRyaWVzIGZyb20gdGhlIHN5c3RlbSByZWdpc3RyeQorLy8KK1NUREFQSSBEbGxVbnJlZ2lzdGVyU2VydmVyICh2b2lkKQoreworCUFGWF9NQU5BR0VfU1RBVEUgKEFmeEdldFN0YXRpY01vZHVsZVN0YXRlICgpKTsKKworCUhSRVNVTFQgaFJlcyA9IFNfT0s7CisJX01vZHVsZS5VbnJlZ2lzdGVyU2VydmVyICgpOworCXJldHVybiBoUmVzOworfQorCisKKy8vIERlYnVnZ2luZyBzdXBwb3J0CisKKy8vIEdldExhc3RFcnJvckRlc2NyaXB0aW9uIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWRVJJRllfT0sKKy8vICBtYWNybywgZGVmaW5lZCBpbiBzdGRhZnguaC4KKworI2lmZGVmIF9ERUJVRworCit2b2lkIEdldExhc3RFcnJvckRlc2NyaXB0aW9uIChDQ29tQlNUUiAmIGJzdHIpCit7CisJQ0NvbVB0ciA8IElFcnJvckluZm8gPiBwRXJyb3JJbmZvOworCWlmIChHZXRFcnJvckluZm8gKDAsICZwRXJyb3JJbmZvKSA9PSBTX09LKQorCQlwRXJyb3JJbmZvLT5HZXREZXNjcmlwdGlvbiAoJmJzdHIpOworfQorCisjZW5kaWYgLy9fREVCVUcKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vVmlzVmltLmRlZiBiL3NyYy9WaXNWaW0vVmlzVmltLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjNkNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9WaXNWaW0uZGVmCkBAIC0wLDAgKzEsMTEgQEAKKzsgVmlzVmltLmRlZiA6IERlY2xhcmVzIHRoZSBtb2R1bGUgcGFyYW1ldGVycyBmb3IgdGhlIERMTC4KKworTElCUkFSWSAgICAgICJWSVNWSU0iCitERVNDUklQVElPTiAgJ1ZJU1ZJTSBXaW5kb3dzIER5bmFtaWMgTGluayBMaWJyYXJ5JworCitFWFBPUlRTCisgICAgOyBFeHBsaWNpdCBleHBvcnRzIGNhbiBnbyBoZXJlCisJRGxsQ2FuVW5sb2FkTm93IFBSSVZBVEUKKwlEbGxHZXRDbGFzc09iamVjdCBQUklWQVRFCisJRGxsUmVnaXN0ZXJTZXJ2ZXIgUFJJVkFURQorCURsbFVucmVnaXN0ZXJTZXJ2ZXIgUFJJVkFURQpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9WaXNWaW0uZGxsIGIvc3JjL1Zpc1ZpbS9WaXNWaW0uZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxN2I0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1Zpc1ZpbS5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9WaXNWaW0uaCBiL3NyYy9WaXNWaW0vVmlzVmltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1OTc3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9WaXNWaW0vVmlzVmltLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gVmlzVklNLmggOiBtYWluIGhlYWRlciBmaWxlIGZvciB0aGUgVmlzVmltIERMTAorLy8KKworI2lmICFkZWZpbmVkKEFGWF9WSVNWSU1fSF9fQUM3MjY3MEJfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRF8pCisjZGVmaW5lIEFGWF9WSVNWSU1fSF9fQUM3MjY3MEJfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRF8KKworI2lmbmRlZiBfX0FGWFdJTl9IX18KKyNlcnJvciBpbmNsdWRlICdzdGRhZnguaCcgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgZm9yIFBDSAorI2VuZGlmCisKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgkJLy8gTWFpbiBzeW1ib2xzCisKKyNpbmNsdWRlIDxPYmpNb2RlbFxhZGRndWlkLmg+CisjaW5jbHVkZSA8T2JqTW9kZWxcYXBwZ3VpZC5oPgorI2luY2x1ZGUgPE9iak1vZGVsXGJsZGd1aWQuaD4KKyNpbmNsdWRlIDxPYmpNb2RlbFx0ZXh0Z3VpZC5oPgorI2luY2x1ZGUgPE9iak1vZGVsXGRiZ2d1aWQuaD4KKworLy8KKy8vIFByb3RvdHlwZXMKKy8vCisKK0hLRVkgR2V0QXBwS2V5IChjaGFyKiBBcHBOYW1lKTsKK0hLRVkgR2V0U2VjdGlvbktleSAoSEtFWSBoQXBwS2V5LCBMUENUU1RSIFNlY3Rpb24pOworaW50IEdldFJlZ2lzdHJ5SW50IChIS0VZIGhTZWN0aW9uS2V5LCBMUENUU1RSIEVudHJ5LCBpbnQgRGVmYXVsdCk7Citib29sIFdyaXRlUmVnaXN0cnlJbnQgKEhLRVkgaFNlY3Rpb25LZXksIGNoYXIqIEVudHJ5LCBpbnQgblZhbHVlKTsKK3ZvaWQgUmVwb3J0TGFzdEVycm9yIChIUkVTVUxUIEVycik7Cit2b2lkIFJlcG9ydEludGVybmFsRXJyb3IgKGNoYXIqIEZjdCk7CisKKy8ve3tBRlhfSU5TRVJUX0xPQ0FUSU9OfX0KKy8vIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIHdpbGwgaW5zZXJ0IGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcHJldmlvdXMgbGluZS4KKworI2VuZGlmIC8vICFkZWZpbmVkKEFGWF9WSVNWSU1fSF9fQUM3MjY3MEJfMjk3N18xMUQxX0IyRjNfMDA2MDA4MDQwNzgwX19JTkNMVURFRCkKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vVmlzVmltLm1hayBiL3NyYy9WaXNWaW0vVmlzVmltLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE5Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9WaXNWaW0ubWFrCkBAIC0wLDAgKzEsMjA1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjAwCisjICoqIERPIE5PVCBFRElUICoqCisjCisjIFdoZW4gICAgICAgV2hvICAgICAgIFdoYXQKKyMgMTk5OS0wOC0wMSBBbm9uICAgICAgT3JpZ2luYWwgVmlzVmltLmRzcAorIyAyMDAxLTA4LTA4IFcuQnJpc2NvZSBCYWNrLXBvcnRlZCB0byBhIGNvbmRlbnNlZCBWQzQgTWFrZWZpbGUKKyMJCSAgICAgICBSZWR1Y2VkIGludGVyLWRlcGVuZGVuY3kgb2YgUmVsZWFzZSBhbmQgRGVidWcgYnVpbGRzLgorIworCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCisKKyFJRiAiJChDRkcpIiA9PSAiIgorQ0ZHPVZpc1ZpbSAtIFdpbjMyIFJlbGVhc2UKKyFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBWaXNWaW0gLSBXaW4zMiBSZWxlYXNlLgorIUVORElGIAorCishSUYgIiQoQ0ZHKSIgIT0gIlZpc1ZpbSAtIFdpbjMyIFJlbGVhc2UiICYmICIkKENGRykiICE9ICJWaXNWaW0gLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIlZpc1ZpbS5tYWsiIENGRz0iVmlzVmltIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiVmlzVmltIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiVmlzVmltIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorREVMX1RSRUUgPSBybWRpciAvcyAvcQorIUVMU0UgCitOVUxMPW51bAorREVMX1RSRUUgPSBkZWx0cmVlIC95CishRU5ESUYgCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJWaXNWaW0gLSBXaW4zMiBSZWxlYXNlIgorIyBQUk9QIFVzZV9NRkMgMgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorTElOSzMyPWxpbmsuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIlZpc1ZpbSAtIFdpbjMyIFJlbGVhc2UiCisKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK09VVERJUj0uXFJlbGVhc2UKK0lOVERJUj0uXFJlbGVhc2UKK0NQUF9PQkpTPS5cUmVsZWFzZS8KKworIyBBREQgQ1BQIC9NRCAvTzIgL0QgIk5ERUJVRyIgL0kuXFJlbGVhc2UKK0NQUF9QUk9KPSAvTUQgL08yIC9EICJOREVCVUciIC9JLlxSZWxlYXNlCisjIEFERCBSU0MgL2QgIk5ERUJVRworUlNDX1BST0o9IC9kICJOREVCVUciCisjIEFERCBMSU5LMzIgL3BkYjpub25lCitMSU5LMzJfRkxBR1M9L3BkYjpub25lCisKKyFFTFNFSUYgICIkKENGRykiID09ICJWaXNWaW0gLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIE91dHB1dF9EaXIgIi5cRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitPVVRESVI9LlxEZWJ1ZworSU5URElSPS5cRGVidWcKK0NQUF9PQkpTPS5cRGVidWcvCisKKyMgQUREIENQUCAvTURkIC9HbSAvWmkgL09kIC9EICJfREVCVUciIC9JLlxEZWJ1ZworQ1BQX1BST0o9IC9NRGQgL0dtIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0kuXERlYnVnIC9GZCIkKElOVERJUikvIgorTVRMX1BST0o9IC9EICJfREVCVUciCisjIEFERCBSU0MgL2QgIl9ERUJVRworUlNDX1BST0o9IC9kICJfREVCVUciCisjIEFERCBMSU5LMzIgL2RlYnVnIC9wZGJ0eXBlOnNlcHQgL3BkYjoiLlxEZWJ1Zy9WaXNWaW0ucGRiIgorTElOSzMyX0ZMQUdTPS9kZWJ1ZyAvcGRidHlwZTpzZXB0IC9wZGI6IiQoT1VURElSKS9WaXNWaW0ucGRiIgorCishRU5ESUYgCisKKyMgQUREIENQUCAgICAgICAgICAgIC9ub2xvZ28gL1czIC9HWCAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfQUZYRExMIiAvRCAiX1VTUkRMTCIgL2MKK0NQUF9QUk9KPSQoQ1BQX1BST0opIC9ub2xvZ28gL1czIC9HWCAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9XSU5ETEwiIC9EICJfQUZYRExMIiAvRCAiX1VTUkRMTCIgL2MgL0ZvIiQoSU5URElSKS8iCisjIEFERCBSU0MgICAgICAgICAgICAvbCAweDQwOSAvZCAiX0FGWERMTCIKK1JTQ19QUk9KPSQoUlNDX1BST0opIC9sIDB4NDA5IC9kICJfQUZYRExMIiAvZm8iJChJTlRESVIpL1Zpc1ZpbS5yZXMiCisjIEFERCBMSU5LMzIgICAgICAgICAgICAgICAgIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NiAvaW5jcmVtZW50YWw6bm8KK0xJTkszMl9GTEFHUz0kKExJTkszMl9GTEFHUykgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2XAorIC9pbmNyZW1lbnRhbDpubyAvZGVmOiIuXFZpc1ZpbS5kZWYiXAorIC9vdXQ6IiQoT1VURElSKS9WaXNWaW0uZGxsIiAvaW1wbGliOiIkKE9VVERJUikvVmlzVmltLmxpYiIKKworQUxMIDogIiQoT1VURElSKVxWaXNWaW0uZGxsIgorCitDTEVBTiA6IAorCS1AaWYgZXhpc3QgIiQoSU5URElSKS8kKE5VTEwpIiAkKERFTF9UUkVFKSAiJChJTlRESVIpIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpL1Zpc1ZpbS5yZXMiIFwKKwkiJChJTlRESVIpL1Zpc1ZpbS5vYmoiIFwKKwkiJChJTlRESVIpL1N0ZEFmeC5vYmoiIFwKKwkiJChJTlRESVIpL1JlZy5vYmoiIFwKKwkiJChJTlRESVIpL0RTQWRkSW4ub2JqIiBcCisJIiQoSU5URElSKS9PbGVBdXQub2JqIiBcCisJIiQoSU5URElSKS9Db21tYW5kcy5vYmoiCisKKyIkKE9VVERJUilcVmlzVmltLmRsbCIgOiAiJChPVVRESVIpIiAiLlxWaXNWaW0uZGVmIiAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKworey59LmN7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKK3sufS5jcHB7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiVmlzVmltIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiVmlzVmltIC0gV2luMzIgRGVidWciCisKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cVmlzVmltLmNwcAorCisiJChJTlRESVIpXFZpc1ZpbS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXFZpc1ZpbS5kZWYKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXFZpc1ZpbS5vZGwKKworIUlGICAiJChDRkcpIiA9PSAiVmlzVmltIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQorIyBCZWdpbiBDdXN0b20gQnVpbGQKKworIiQoSU5URElSKVxWaXNWaW0udGxiIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCW1pZGwgL25vbG9nbyAvbWt0eXBsaWIyMDMgL3dpbjMyIC90bGIgVmlzVmltLnRsYiAvaCBWU1ZUeXBlcy5oIC5cVmlzVmltLm9kbCAvb3V0IC5cUmVsZWFzZSAvRCAiTkRFQlVHIgorCisjIEVuZCBDdXN0b20gQnVpbGQKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlZpc1ZpbSAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCisjIEJlZ2luIEN1c3RvbSBCdWlsZAorCisiJChJTlRESVIpXFZpc1ZpbS50bGIiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisJbWlkbCAvbm9sb2dvIC9ta3R5cGxpYjIwMyAvd2luMzIgL3RsYiBWaXNWaW0udGxiIC9oIFZTVlR5cGVzLmggLlxWaXNWaW0ub2RsIC9vdXQgLlxEZWJ1ZyAvRCAiX0RFQlVHIgorCisjIEVuZCBDdXN0b20gQnVpbGQKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxTdGRBZnguY3BwCisKKyIkKElOVERJUilcU3RkQWZ4Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cVmlzVmltLnJjCisKKyIkKElOVERJUilcVmlzVmltLnJlcyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoSU5URElSKVxWaXNWaW0udGxiIgorICQoUlNDKSAkKFJTQ19QUk9KKSAvaSAiJChJTlRESVIpIiAkKFNPVVJDRSkKKworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cUmVnLmNwcAorCisiJChJTlRESVIpXFJlZy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXERTQWRkSW4uY3BwCisKKyIkKElOVERJUilcRFNBZGRJbi5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXE9sZUF1dC5jcHAKKworIiQoSU5URElSKVxPbGVBdXQub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxDb21tYW5kcy5jcHAKKworIiQoSU5URElSKVxDb21tYW5kcy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3NyYy9WaXNWaW0vVmlzVmltLm9kbCBiL3NyYy9WaXNWaW0vVmlzVmltLm9kbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkxYjhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9WaXNWaW0ub2RsCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFZpc1ZpbS5vZGwgOiB0eXBlIGxpYnJhcnkgc291cmNlIGZvciBWaXNWaW0uZGxsCisKKy8vIFRoaXMgZmlsZSB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgTWFrZSBUeXBlIExpYnJhcnkgKG1rdHlwbGliKSB0b29sIHRvCisvLyBwcm9kdWNlIHRoZSB0eXBlIGxpYnJhcnkgKFZpc1ZpbS50bGIpLgorCitbCXV1aWQoQUM3MjY3MDctMjk3Ny0xMUQxLUIyRjMtMDA2MDA4MDQwNzgwKSwgdmVyc2lvbigxLjApLAorCWhlbHBzdHJpbmcgKCJWaXNWaW0gRGV2ZWxvcGVyIFN0dWRpbyBBZGQtaW4iKSBdCitsaWJyYXJ5IFZpc1ZpbQoreworCWltcG9ydGxpYigic3Rkb2xlMzIudGxiIik7CisJaW1wb3J0bGliKCJkZXZzaGwuZGxsIik7CisJaW1wb3J0bGliKCJpZGVcZGV2ZGJnLnBrZyIpOworCisKKwkvLyAgRHVhbCBpbnRlcmZhY2UgZm9yIENDb21tYW5kcworCS8vCisJLy8gIEFsbCBjb21tYW5kcyB0aGF0IHlvdXIgYWRkLWluIGFkZHMgdG8gRGV2U3R1ZGlvCisJLy8gICBtdXN0IGFwcGVhciBpbiB0aGlzIGludGVyZmFjZS4gIFlvdSBtYXkgdXNlIHRoZQorCS8vICAgQ2xhc3NWaWV3IHRvIGFkZCBtZXRob2RzIHRvIHRoaXMgaW50ZXJmYWNlLCB3aGljaAorCS8vICAgd2lsbCBjYXVzZSBzdHViIGltcGxlbWVudGF0aW9ucyBvZiB0aG9zZSBtZXRob2RzIHRvCisJLy8gICBhcHBlYXIgaW4geW91ciBDQ29tbWFuZHMgY2xhc3MuCisKKwlbCXV1aWQoQUM3MjY3MDMtMjk3Ny0xMUQxLUIyRjMtMDA2MDA4MDQwNzgwKSwKKwkJb2xlYXV0b21hdGlvbiwKKwkJZHVhbAorCV0KKworCWludGVyZmFjZSBJQ29tbWFuZHMgOiBJRGlzcGF0Y2gKKwl7CisJCS8vIG1ldGhvZHMKKwkJW2lkKDEpXQorCQlIUkVTVUxUIFZpc1ZpbURpYWxvZygpOworCQlIUkVTVUxUIFZpc1ZpbUVuYWJsZSgpOworCQlIUkVTVUxUIFZpc1ZpbURpc2FibGUoKTsKKwkJSFJFU1VMVCBWaXNWaW1Ub2dnbGUoKTsKKwkJSFJFU1VMVCBWaXNWaW1Mb2FkKCk7CisJfTsKKworCS8vICBDbGFzcyBpbmZvcm1hdGlvbiBmb3IgQ0NvbW1hbmRzCisKKwlbIHV1aWQoQUM3MjY3MDQtMjk3Ny0xMUQxLUIyRjMtMDA2MDA4MDQwNzgwKSBdCisJY29jbGFzcyBDb21tYW5kcworCXsKKwkJW2RlZmF1bHRdIGludGVyZmFjZSBJQ29tbWFuZHM7CisJfTsKKworCVsgaGlkZGVuLCB1dWlkKEFDNzI2NzA1LTI5NzctMTFEMS1CMkYzLTAwNjAwODA0MDc4MCkgXQorCWNvY2xhc3MgQXBwbGljYXRpb25FdmVudHMKKwl7CisJCVtkZWZhdWx0XSBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uRXZlbnRzOworCX0KKworCVsgaGlkZGVuLCB1dWlkKEFDNzI2NzA2LTI5NzctMTFEMS1CMkYzLTAwNjAwODA0MDc4MCkgXQorCWNvY2xhc3MgRGVidWdnZXJFdmVudHMKKwl7CisJCVtkZWZhdWx0XSBpbnRlcmZhY2UgSURlYnVnZ2VyRXZlbnRzOworCX0KKworCS8ve3tBRlhfQVBQRU5EX09ETH19CisJLy99fUFGWF9BUFBFTkRfT0RMfX0KK307CmRpZmYgLS1naXQgYS9zcmMvVmlzVmltL1Zpc1ZpbS5yYyBiL3NyYy9WaXNWaW0vVmlzVmltLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjdlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvVmlzVmltL1Zpc1ZpbS5yYwpAQCAtMCwwICsxLDE5OSBAQAorLy9NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0LgorLy8KKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuCisvLworI2luY2x1ZGUgImFmeHJlcy5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVuZ2xpc2NoIChVU0EpIHJlc291cmNlcworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCisjaWZkZWYgX1dJTjMyCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKyNlbmRpZiAvL19XSU4zMgorCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBURVhUSU5DTFVERQorLy8KKworMSBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgInJlc291cmNlLmhcMCIKK0VORAorCisyIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiIKKyAgICAiXDAiCitFTkQKKworMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKK0JFR0lOCisgICAgIiNkZWZpbmUgX0FGWF9OT19TUExJVFRFUl9SRVNPVVJDRVNcclxuIgorICAgICIjZGVmaW5lIF9BRlhfTk9fT0xFX1JFU09VUkNFU1xyXG4iCisgICAgIiNkZWZpbmUgX0FGWF9OT19UUkFDS0VSX1JFU09VUkNFU1xyXG4iCisgICAgIiNkZWZpbmUgX0FGWF9OT19QUk9QRVJUWV9SRVNPVVJDRVNcclxuIgorICAgICJcclxuIgorICAgICIjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpXHJcbiIKKyAgICAiI2lmZGVmIF9XSU4zMlxyXG4iCisgICAgIkxBTkdVQUdFIDksIDFcclxuIgorICAgICIjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKVxyXG4iCisgICAgIiNlbmRpZlxyXG4iCisgICAgIiNpbmNsdWRlICIiYWZ4cmVzLnJjIiIgICAgICAgICAvLyBTdGFuZGFyZCBjb21wb25lbnRzXHJcbiIKKyAgICAiI2VuZGlmXHJcbiIKKyAgICAiMSBUWVBFTElCICIiVmlzVmltLnRsYiIiXHJcbiIKKyAgICAiXDAiCitFTkQKKworI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIEJpdG1hcAorLy8KKworSURSX1RPT0xCQVJfTUVESVVNICAgICAgQklUTUFQICBNT1ZFQUJMRSBQVVJFICAgInJlc1xcVG9vbGJhck0uYm1wIgorSURSX1RPT0xCQVJfTEFSR0UgICAgICAgQklUTUFQICBNT1ZFQUJMRSBQVVJFICAgInJlc1xcVG9vbGJhckwuYm1wIgorCisjaWZuZGVmIF9NQUMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gVmVyc2lvbgorLy8KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwxLDAsMQorIFBST0RVQ1RWRVJTSU9OIDEsMSwwLDEKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiVmlzVmltIERMTFwwIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEsIDEsIDAsIDFcMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiVmlzVmltXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAxOTk4XDAiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJWaXNWaW0uRExMXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiVmlzVmltIER5bmFtaWMgTGluayBMaWJyYXJ5XDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMSwgMSwgMCwgMVwwIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gIV9NQUMKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIERpYWxvZworLy8KKworSUREX0FERElOTUFJTiBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDE3OCwgMTI0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiVmltIEFkZC1JbiAxLjQiCitGT05UIDgsICJNUyBTYW5zIFNlcmlmIgorQkVHSU4KKyAgICBDT05UUk9MICAgICAgICAgIiZPcGVuIGZpbGUgaW4gRGV2U3R1ZGlvIGVkaXRvciBzaW11bHRhbmVvdXNseSIsCisgICAgICAgICAgICAgICAgICAgIElEQ19ERVZTVFVESU9fRURJVE9SLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgCisgICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AsNyw3LDE1MywxMAorICAgIEdST1VQQk9YICAgICAgICAiQ3VycmVudCBkaXJlY3RvcnkiLElEQ19TVEFUSUMsNywzNSwxNjQsNTgsV1NfR1JPVVAKKyAgICBDT05UUk9MICAgICAgICAgIlNldCB0byAmc291cmNlIGZpbGUgcGF0aCIsSURDX0NEX1NPVVJDRV9QQVRILCJCdXR0b24iLAorICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsMTcsNDksODUsMTAKKyAgICBDT05UUk9MICAgICAgICAgIlNldCB0byAmcGFyZW50IGRpcmVjdG9yeSBvZiBzb3VyY2UgZmlsZSBwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgSURDX0NEX1NPVVJDRV9QQVJFTlQsIkJ1dHRvbiIsQlNfQVVUT1JBRElPQlVUVE9OLDE3LDYzLAorICAgICAgICAgICAgICAgICAgICAxNDMsMTAKKyAgICBDT05UUk9MICAgICAgICAgIkRvICZub3QgY2hhbmdlIixJRENfQ0RfTk9ORSwiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04sCisgICAgICAgICAgICAgICAgICAgIDE3LDc4LDYzLDEwCisgICAgREVGUFVTSEJVVFRPTiAgICImT2siLElET0ssNywxMDIsNzQsMTQsV1NfR1JPVVAKKyAgICBQVVNIQlVUVE9OICAgICAgIiZDYW5jZWwiLElEQ0FOQ0VMLDk3LDEwMiw3NCwxNCxXU19HUk9VUAorRU5ECisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBERVNJR05JTkZPCisvLworCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICBJRERfQURESU5NQUlOLCBESUFMT0cKKyAgICBCRUdJTgorICAgICAgICBMRUZUTUFSR0lOLCA3CisgICAgICAgIFJJR0hUTUFSR0lOLCAxNzEKKyAgICAgICAgVE9QTUFSR0lOLCA3CisgICAgICAgIEJPVFRPTU1BUkdJTiwgMTE3CisgICAgRU5ECitFTkQKKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBTdHJpbmcgVGFibGUKKy8vCisKK1NUUklOR1RBQkxFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICBJRFNfVklTVklNX0xPTkdOQU1FICAgICAiVmltIERldmVsb3BlciBTdHVkaW8gQWRkLUluIgorICAgIElEU19WSVNWSU1fREVTQ1JJUFRJT04gICJBbGxvd3MgaW50ZWdyYXRpb24gb2YgVmltIGFzIHRoZSB0ZXh0IGVkaXRvciBpbiBEZXZlbG9wZXIgU3R1ZGlvLiIKKyAgICBJRFNfQ01EX0RJQUxPRyAgICAgICAgICAiXG5WaW0gQWRkLUluIERpYWxvZ1xuRGlzcGxheXMgdGhlIG9wdGlvbnMgZGlhbG9nIGJveCBvZiB0aGUgVmltIEFkZC1JblxuVmltIEFkZC1JbiBEaWFsb2ciCisgICAgSURTX0NNRF9FTkFCTEUgICAgICAgICAgIlxuRW5hYmxlIFZpbSBBZGQtSW5cbkVuYWJsZXMgVmltIGFzIFZpc3VhbCBTdHVkaW8gZWRpdG9yXG5FbmFibGUgVmltIEFkZC1JbiIKKyAgICBJRFNfQ01EX0RJU0FCTEUgICAgICAgICAiXG5EaXNhYmxlIFZpbSBBZGQtSW5cbkRpc2FibGVzIFZpbSBhcyBWaXN1YWwgU3R1ZGlvIGVkaXRvclxuRGlzYWJsZSBWaW0gQWRkLUluIgorICAgIElEU19DTURfVE9HR0xFICAgICAgICAgICJcblRvZ2dsZSBWaW0gQWRkLUluIFN0YXRlXG5Ub2dnbGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIFZpbSBBZGQtSW5cblRvZ2dsZSBWaW0gQWRkLUluIFN0YXRlIgorICAgIElEU19DTURfTE9BRCAgICAgICAgICAgICJcblZpbSBBZGQtSW4gTG9hZCBEb2N1bWVudFxuTG9hZHMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaW4gVmltXG5WaW0gQWRkLUluIExvYWQgRG9jdW1lbnQiCitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2NoIChVU0EpIHJlc291cmNlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4KKy8vCisjZGVmaW5lIF9BRlhfTk9fU1BMSVRURVJfUkVTT1VSQ0VTCisjZGVmaW5lIF9BRlhfTk9fT0xFX1JFU09VUkNFUworI2RlZmluZSBfQUZYX05PX1RSQUNLRVJfUkVTT1VSQ0VTCisjZGVmaW5lIF9BRlhfTk9fUFJPUEVSVFlfUkVTT1VSQ0VTCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKKyNpZmRlZiBfV0lOMzIKK0xBTkdVQUdFIDksIDEKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisjZW5kaWYKKyNpbmNsdWRlICJhZnhyZXMucmMiICAgICAgICAgLy8gU3RhbmRhcmQgY29tcG9uZW50cworI2VuZGlmCisxIFRZUEVMSUIgIlZpc1ZpbS50bGIiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQKKwpkaWZmIC0tZ2l0IGEvc3JjL1Zpc1ZpbS9Wc1JlYWRNZS50eHQgYi9zcmMvVmlzVmltL1ZzUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDgwYzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1Zpc1ZpbS9Wc1JlYWRNZS50eHQKQEAgLTAsMCArMSw5MSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgREVWRUxPUEVSIFNUVURJTyBBREQtSU4gOiBWaXNWaW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RoZSBBZGQtaW4gV2l6YXJkIGhhcyBjcmVhdGVkIHRoaXMgVmlzVmltIERMTCBmb3IgeW91LiAgVGhpcyBETEwgbm90IG9ubHkKK2RlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIGNyZWF0aW5nIGEgRGV2ZWxvcGVyIFN0dWRpbyBhZGQtaW4sIGJ1dCBpdCBpcyBhbHNvCithIHN0YXJ0aW5nIHBvaW50IGZvciB3cml0aW5nIHlvdXIgb3duIGFkZC1pbi4KKworQW4gYWRkLWluIG1haW5seSBkb2VzIHR3byB0aGluZ3MuCisJKDEpIEl0IGFkZHMgY29tbWFuZHMgdG8gRGV2ZWxvcGVyIFN0dWRpbywgd2hpY2ggY2FuIHRoZW4gYmUgdGllZAorCSAgICB0byBrZXlzdHJva2VzIG9yIHRvb2xiYXIgYnV0dG9ucyBieSB0aGUgdXNlciBvciBwcm9ncmFtbWF0aWNhbGx5CisJCWJ5IHRoZSBhZGQtaW4uCisJKDIpIEl0IHJlc3BvbmRzIHRvIGV2ZW50cyBmaXJlZCBieSBEZXZlbG9wZXIgU3R1ZGlvLgorSW4gYm90aCBjYXNlcywgdGhlIGFkZC1pbiBjb2RlIGhhcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgRGV2ZWxvcGVyIFN0dWRpbworQXV0b21hdGlvbiBPYmplY3QgTW9kZWwsIGFuZCBtYXkgbWFuaXB1bGF0ZSB0aG9zZSBvYmplY3RzIHRvIGFmZmVjdCB0aGUKK2JlaGF2aW9yIG9mIERldmVsb3BlciBTdHVkaW8uCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciBWaXNWaW0gRExMLgorCisKK1Zpc1ZpbS5oCisgICAgVGhpcyBpcyB0aGUgbWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIERMTC4gIEl0IGRlY2xhcmVzIHRoZQorICAgIENWaXNWaW1BcHAgY2xhc3MuCisKK1Zpc1ZpbS5jcHAKKyAgICBUaGlzIGlzIHRoZSBtYWluIERMTCBzb3VyY2UgZmlsZS4gIEl0IGNvbnRhaW5zIHRoZSBjbGFzcyBDVmlzVmltQXBwLgorICAgIEl0IGFsc28gY29udGFpbnMgdGhlIE9MRSBlbnRyeSBwb2ludHMgcmVxdWlyZWQgb2YgaW5wcm9jIHNlcnZlcnMuCisKK1Zpc1ZpbS5vZGwKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE9iamVjdCBEZXNjcmlwdGlvbiBMYW5ndWFnZSBzb3VyY2UgY29kZSBmb3IgdGhlCisgICAgdHlwZSBsaWJyYXJ5IG9mIHlvdXIgRExMLgorCitWaXNWaW0ucmMKKyAgICBUaGlzIGlzIGEgbGlzdGluZyBvZiBhbGwgb2YgdGhlIE1pY3Jvc29mdCBXaW5kb3dzIHJlc291cmNlcyB0aGF0IHRoZQorICAgIHByb2dyYW0gdXNlcy4gIEl0IGluY2x1ZGVzIHRoZSBzYW1wbGUgdG9vbGJhciBiaXRtYXAgdGhhdCBpcyBzdG9yZWQKKyAgICBpbiB0aGUgUkVTIHN1YmRpcmVjdG9yeS4gIFRoaXMgZmlsZSBjYW4gYmUgZGlyZWN0bHkgZWRpdGVkIGluIE1pY3Jvc29mdAorICAgIERldmVsb3BlciBTdHVkaW8uCisKK3Jlc1xWaXNWaW0ucmMyCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlcyB0aGF0IGFyZSBub3QgZWRpdGVkIGJ5IE1pY3Jvc29mdAorICAgIERldmVsb3BlciBTdHVkaW8uICBZb3Ugc2hvdWxkIHBsYWNlIGFsbCByZXNvdXJjZXMgbm90CisgICAgZWRpdGFibGUgYnkgdGhlIHJlc291cmNlIGVkaXRvciBpbiB0aGlzIGZpbGUuCisKK1Zpc1ZpbS5kZWYKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERMTCB0aGF0IG11c3QgYmUKKyAgICBwcm92aWRlZCB0byBydW4gd2l0aCBNaWNyb3NvZnQgV2luZG93cy4gIEl0IGRlZmluZXMgcGFyYW1ldGVycworICAgIHN1Y2ggYXMgdGhlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBETEwuICBJdCBhbHNvIGV4cG9ydHMKKwlmdW5jdGlvbnMgZnJvbSB0aGUgRExMLgorCitWaXNWaW0uY2x3CisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2xhc3NXaXphcmQgdG8gZWRpdCBleGlzdGluZworICAgIGNsYXNzZXMgb3IgYWRkIG5ldyBjbGFzc2VzLiAgQ2xhc3NXaXphcmQgYWxzbyB1c2VzIHRoaXMgZmlsZSB0byBzdG9yZQorICAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjcmVhdGUgYW5kIGVkaXQgbWVzc2FnZSBtYXBzIGFuZCBkaWFsb2cgZGF0YQorICAgIG1hcHMgYW5kIHRvIGNyZWF0ZSBwcm90b3R5cGUgbWVtYmVyIGZ1bmN0aW9ucy4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FkZC1pbi1zcGVjaWZpYyBmaWxlczoKKworRFNBZGRJbi5jcHAsIERTQWRkSW4uaAorICAgIFRoZXNlIGZpbGVzIGNvbnRhaW4gdGhlIENEU0FkZEluIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHRoZQorICAgIElEU0FkZEluIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGhhbmRsZXJzCisgICAgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3RpbmcgdGhlIGFkZC1pbi4KKworQ29tbWFuZHMuY3BwLCBDb21tYW5kcy5oCisgICAgVGhlc2UgZmlsZXMgY29udGFpbiB0aGUgQ0NvbW1hbmRzIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHlvdXIKKyAgICBjb21tYW5kIGRpc3BhdGNoIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIG9uZSBtZXRob2QKKyAgICBmb3IgZWFjaCBjb21tYW5kIHlvdSBhZGQgdG8gRGV2ZWxvcGVyIFN0dWRpby4KKyAgICBUaGVzZSBmaWxlcyBhbHNvIGNvbnRhaW4gc3R1YiBpbXBsZW1lbnRhdGlvbnMgb2YgaGFuZGxlcnMgZm9yIGFsbCBldmVudHMKKyAgICBmaXJlZCBieSB0aGUgRGV2ZWxvcGVyIFN0dWRpbyBBcHBsaWNhdGlvbiBvYmplY3QuCisKK09sZUF1dC5jcHAKKyAgICBUaGVzZSBmaWxlcyBjb250YWluIGEgZ2VuZXJhbCBPTEUgYXV0b21hdGlvbiBjbGFzcyB1c2VkIHRvIGNvbW11bmljYXRlCisgICAgd2l0aCB2aW0uCisKK1JlZy5jcHAKKyAgICBUaGVzZSBmaWxlcyBjb250YWluIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBzdGFuZGFyZCBmaWxlczoKKworU3RkQWZ4LmgsIFN0ZEFmeC5jcHAKKyAgICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBidWlsZCBhIHByZWNvbXBpbGVkIGhlYWRlciAoUENIKSBmaWxlCisgICAgbmFtZWQgVmlzVmltLnBjaCBhbmQgYSBwcmVjb21waWxlZCB0eXBlcyBmaWxlIG5hbWVkIFN0ZEFmeC5vYmouCisKK1Jlc291cmNlLmgKKyAgICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBoZWFkZXIgZmlsZSwgd2hpY2ggZGVmaW5lcyBuZXcgcmVzb3VyY2UgSURzLgorICAgIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIHJlYWRzIGFuZCB1cGRhdGVzIHRoaXMgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvc3JjL2FyYWJpYy5jIGIvc3JjL2FyYWJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMWY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXJhYmljLmMKQEAgLTAsMCArMSwxMTY4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkICAgIGJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBhcmFiaWMuYzogZnVuY3Rpb25zIGZvciBBcmFiaWMgbGFuZ3VhZ2UKKyAqCisgKiBJbmNsdWRlZCBieSBtYWluLmMsIHdoZW4gRkVBVF9BUkFCSUMgJiBGRUFUX0dVSSBpcyBkZWZpbmVkLgorICoKKyAqIC0tCisgKgorICogQXV0aG9yOiBOYWRpbSBTaGFpa2xpICYgSXNhbSBCYXlhemlkaQorICoKKyAqLworCitzdGF0aWMgaW50ICBBX2lzX2EgX19BUkdTKChpbnQgY3VyX2MpKTsKK3N0YXRpYyBpbnQgIEFfaXNfcyBfX0FSR1MoKGludCBjdXJfYykpOworc3RhdGljIGludCAgQV9pc19mIF9fQVJHUygoaW50IGN1cl9jKSk7CitzdGF0aWMgaW50ICBjaGdfY19hMnMgX19BUkdTKChpbnQgY3VyX2MpKTsKK3N0YXRpYyBpbnQgIGNoZ19jX2EyaSBfX0FSR1MoKGludCBjdXJfYykpOworc3RhdGljIGludCAgY2hnX2NfYTJtIF9fQVJHUygoaW50IGN1cl9jKSk7CitzdGF0aWMgaW50ICBjaGdfY19hMmYgX19BUkdTKChpbnQgY3VyX2MpKTsKK3N0YXRpYyBpbnQgIGNoZ19jX2kybSBfX0FSR1MoKGludCBjdXJfYykpOworc3RhdGljIGludCAgY2hnX2NfZjJtIF9fQVJHUygoaW50IGN1cl9jKSk7CitzdGF0aWMgaW50ICBjaGdfY19sYWEyaSBfX0FSR1MoKGludCBoaWRfYykpOworc3RhdGljIGludCAgY2hnX2NfbGFhMmYgX19BUkdTKChpbnQgaGlkX2MpKTsKK3N0YXRpYyBpbnQgIGhhbGZfc2hhcGUgX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCAgQV9maXJzdGNfbGFhIF9fQVJHUygoaW50IGMxLCBpbnQgYykpOworc3RhdGljIGludCAgQV9pc19oYXJha2F0IF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgIEFfaXNfaXNvIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgIEFfaXNfZm9ybWIgX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCAgQV9pc19vayBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50ICBBX2lzX3ZhbGlkIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgIEFfaXNfc3BlY2lhbCBfX0FSR1MoKGludCBjKSk7CisKKworLyoKKyAqIFJldHVybnMgVHJ1ZSBpZiBjIGlzIGFuIElTTy04ODU5LTYgc2hhcGVkIEFSQUJJQyBsZXR0ZXIgKHVzZXIgZW50ZXJlZCkKKyAqLworICAgIHN0YXRpYyBpbnQKK0FfaXNfYShjdXJfYykKKyAgICBpbnQgY3VyX2M7Cit7CisgICAgc3dpdGNoIChjdXJfYykKKyAgICB7CisJY2FzZSBhX0hBTVpBOgorCWNhc2UgYV9BTEVGX01BRERBOgorCWNhc2UgYV9BTEVGX0hBTVpBX0FCT1ZFOgorCWNhc2UgYV9XQVdfSEFNWkE6CisJY2FzZSBhX0FMRUZfSEFNWkFfQkVMT1c6CisJY2FzZSBhX1lFSF9IQU1aQToKKwljYXNlIGFfQUxFRjoKKwljYXNlIGFfQkVIOgorCWNhc2UgYV9URUhfTUFSQlVUQToKKwljYXNlIGFfVEVIOgorCWNhc2UgYV9USEVIOgorCWNhc2UgYV9KRUVNOgorCWNhc2UgYV9IQUg6CisJY2FzZSBhX0tIQUg6CisJY2FzZSBhX0RBTDoKKwljYXNlIGFfVEhBTDoKKwljYXNlIGFfUkVIOgorCWNhc2UgYV9aQUlOOgorCWNhc2UgYV9TRUVOOgorCWNhc2UgYV9TSEVFTjoKKwljYXNlIGFfU0FEOgorCWNhc2UgYV9EQUQ6CisJY2FzZSBhX1RBSDoKKwljYXNlIGFfWkFIOgorCWNhc2UgYV9BSU46CisJY2FzZSBhX0dIQUlOOgorCWNhc2UgYV9UQVRXRUVMOgorCWNhc2UgYV9GRUg6CisJY2FzZSBhX1FBRjoKKwljYXNlIGFfS0FGOgorCWNhc2UgYV9MQU06CisJY2FzZSBhX01FRU06CisJY2FzZSBhX05PT046CisJY2FzZSBhX0hFSDoKKwljYXNlIGFfV0FXOgorCWNhc2UgYV9BTEVGX01BS1NVUkE6CisJY2FzZSBhX1lFSDoKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBSZXR1cm5zIFRydWUgaWYgYyBpcyBhbiBJc29sYXRlZCBGb3JtLUIgQVJBQklDIGxldHRlcgorICovCisgICAgc3RhdGljIGludAorQV9pc19zKGN1cl9jKQorICAgIGludCBjdXJfYzsKK3sKKyAgICBzd2l0Y2ggKGN1cl9jKQorICAgIHsKKwljYXNlIGFfc19IQU1aQToKKwljYXNlIGFfc19BTEVGX01BRERBOgorCWNhc2UgYV9zX0FMRUZfSEFNWkFfQUJPVkU6CisJY2FzZSBhX3NfV0FXX0hBTVpBOgorCWNhc2UgYV9zX0FMRUZfSEFNWkFfQkVMT1c6CisJY2FzZSBhX3NfWUVIX0hBTVpBOgorCWNhc2UgYV9zX0FMRUY6CisJY2FzZSBhX3NfQkVIOgorCWNhc2UgYV9zX1RFSF9NQVJCVVRBOgorCWNhc2UgYV9zX1RFSDoKKwljYXNlIGFfc19USEVIOgorCWNhc2UgYV9zX0pFRU06CisJY2FzZSBhX3NfSEFIOgorCWNhc2UgYV9zX0tIQUg6CisJY2FzZSBhX3NfREFMOgorCWNhc2UgYV9zX1RIQUw6CisJY2FzZSBhX3NfUkVIOgorCWNhc2UgYV9zX1pBSU46CisJY2FzZSBhX3NfU0VFTjoKKwljYXNlIGFfc19TSEVFTjoKKwljYXNlIGFfc19TQUQ6CisJY2FzZSBhX3NfREFEOgorCWNhc2UgYV9zX1RBSDoKKwljYXNlIGFfc19aQUg6CisJY2FzZSBhX3NfQUlOOgorCWNhc2UgYV9zX0dIQUlOOgorCWNhc2UgYV9zX0ZFSDoKKwljYXNlIGFfc19RQUY6CisJY2FzZSBhX3NfS0FGOgorCWNhc2UgYV9zX0xBTToKKwljYXNlIGFfc19NRUVNOgorCWNhc2UgYV9zX05PT046CisJY2FzZSBhX3NfSEVIOgorCWNhc2UgYV9zX1dBVzoKKwljYXNlIGFfc19BTEVGX01BS1NVUkE6CisJY2FzZSBhX3NfWUVIOgorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAqIFJldHVybnMgVHJ1ZSBpZiBjIGlzIGEgRmluYWwgc2hhcGUgb2YgYW4gQVJBQklDIGxldHRlcgorICovCisgICAgc3RhdGljIGludAorQV9pc19mKGN1cl9jKQorICAgIGludCBjdXJfYzsKK3sKKyAgICBzd2l0Y2ggKGN1cl9jKQorICAgIHsKKwljYXNlIGFfZl9BTEVGX01BRERBOgorCWNhc2UgYV9mX0FMRUZfSEFNWkFfQUJPVkU6CisJY2FzZSBhX2ZfV0FXX0hBTVpBOgorCWNhc2UgYV9mX0FMRUZfSEFNWkFfQkVMT1c6CisJY2FzZSBhX2ZfWUVIX0hBTVpBOgorCWNhc2UgYV9mX0FMRUY6CisJY2FzZSBhX2ZfQkVIOgorCWNhc2UgYV9mX1RFSF9NQVJCVVRBOgorCWNhc2UgYV9mX1RFSDoKKwljYXNlIGFfZl9USEVIOgorCWNhc2UgYV9mX0pFRU06CisJY2FzZSBhX2ZfSEFIOgorCWNhc2UgYV9mX0tIQUg6CisJY2FzZSBhX2ZfREFMOgorCWNhc2UgYV9mX1RIQUw6CisJY2FzZSBhX2ZfUkVIOgorCWNhc2UgYV9mX1pBSU46CisJY2FzZSBhX2ZfU0VFTjoKKwljYXNlIGFfZl9TSEVFTjoKKwljYXNlIGFfZl9TQUQ6CisJY2FzZSBhX2ZfREFEOgorCWNhc2UgYV9mX1RBSDoKKwljYXNlIGFfZl9aQUg6CisJY2FzZSBhX2ZfQUlOOgorCWNhc2UgYV9mX0dIQUlOOgorCWNhc2UgYV9mX0ZFSDoKKwljYXNlIGFfZl9RQUY6CisJY2FzZSBhX2ZfS0FGOgorCWNhc2UgYV9mX0xBTToKKwljYXNlIGFfZl9NRUVNOgorCWNhc2UgYV9mX05PT046CisJY2FzZSBhX2ZfSEVIOgorCWNhc2UgYV9mX1dBVzoKKwljYXNlIGFfZl9BTEVGX01BS1NVUkE6CisJY2FzZSBhX2ZfWUVIOgorCWNhc2UgYV9mX0xBTV9BTEVGX01BRERBX0FCT1ZFOgorCWNhc2UgYV9mX0xBTV9BTEVGX0hBTVpBX0FCT1ZFOgorCWNhc2UgYV9mX0xBTV9BTEVGX0hBTVpBX0JFTE9XOgorCWNhc2UgYV9mX0xBTV9BTEVGOgorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBDaGFuZ2Ugc2hhcGUgLSBmcm9tIElTTy04ODU5LTYvSXNvbGF0ZWQgdG8gRm9ybS1CIElzb2xhdGVkCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGdfY19hMnMoY3VyX2MpCisgICAgaW50IGN1cl9jOworeworICAgIGludCB0ZW1wYzsKKworICAgIHN3aXRjaCAoY3VyX2MpCisgICAgeworCWNhc2UgYV9IQU1aQToKKwkgICAgdGVtcGMgPSBhX3NfSEFNWkE7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX01BRERBOgorCSAgICB0ZW1wYyA9IGFfc19BTEVGX01BRERBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToKKwkgICAgdGVtcGMgPSBhX3NfQUxFRl9IQU1aQV9BQk9WRTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1dBV19IQU1aQToKKwkgICAgdGVtcGMgPSBhX3NfV0FXX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9CRUxPVzoKKwkgICAgdGVtcGMgPSBhX3NfQUxFRl9IQU1aQV9CRUxPVzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1lFSF9IQU1aQToKKwkgICAgdGVtcGMgPSBhX3NfWUVIX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRjoKKwkgICAgdGVtcGMgPSBhX3NfQUxFRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RFSF9NQVJCVVRBOgorCSAgICB0ZW1wYyA9IGFfc19URUhfTUFSQlVUQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBTDoKKwkgICAgdGVtcGMgPSBhX3NfREFMOworCSAgICBicmVhazsKKwljYXNlIGFfVEhBTDoKKwkgICAgdGVtcGMgPSBhX3NfVEhBTDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1JFSDoKKwkgICAgdGVtcGMgPSBhX3NfUkVIOworCSAgICBicmVhazsKKwljYXNlIGFfWkFJTjoKKwkgICAgdGVtcGMgPSBhX3NfWkFJTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RBVFdFRUw6CQkJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGN1cl9jOworCSAgICBicmVhazsKKwljYXNlIGFfV0FXOgorCSAgICB0ZW1wYyA9IGFfc19XQVc7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX01BS1NVUkE6CisJICAgIHRlbXBjID0gYV9zX0FMRUZfTUFLU1VSQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0JFSDoKKwkgICAgdGVtcGMgPSBhX3NfQkVIOworCSAgICBicmVhazsKKwljYXNlIGFfVEVIOgorCSAgICB0ZW1wYyA9IGFfc19URUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9USEVIOgorCSAgICB0ZW1wYyA9IGFfc19USEVIOworCSAgICBicmVhazsKKwljYXNlIGFfSkVFTToKKwkgICAgdGVtcGMgPSBhX3NfSkVFTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0hBSDoKKwkgICAgdGVtcGMgPSBhX3NfSEFIOworCSAgICBicmVhazsKKwljYXNlIGFfS0hBSDoKKwkgICAgdGVtcGMgPSBhX3NfS0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1NFRU46CisJICAgIHRlbXBjID0gYV9zX1NFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TSEVFTjoKKwkgICAgdGVtcGMgPSBhX3NfU0hFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TQUQ6CisJICAgIHRlbXBjID0gYV9zX1NBRDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBRDoKKwkgICAgdGVtcGMgPSBhX3NfREFEOworCSAgICBicmVhazsKKwljYXNlIGFfVEFIOgorCSAgICB0ZW1wYyA9IGFfc19UQUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9aQUg6CisJICAgIHRlbXBjID0gYV9zX1pBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FJTjoKKwkgICAgdGVtcGMgPSBhX3NfQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfR0hBSU46CisJICAgIHRlbXBjID0gYV9zX0dIQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfRkVIOgorCSAgICB0ZW1wYyA9IGFfc19GRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9RQUY6CisJICAgIHRlbXBjID0gYV9zX1FBRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0tBRjoKKwkgICAgdGVtcGMgPSBhX3NfS0FGOworCSAgICBicmVhazsKKwljYXNlIGFfTEFNOgorCSAgICB0ZW1wYyA9IGFfc19MQU07CisJICAgIGJyZWFrOworCWNhc2UgYV9NRUVNOgorCSAgICB0ZW1wYyA9IGFfc19NRUVNOworCSAgICBicmVhazsKKwljYXNlIGFfTk9PTjoKKwkgICAgdGVtcGMgPSBhX3NfTk9PTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0hFSDoKKwkgICAgdGVtcGMgPSBhX3NfSEVIOworCSAgICBicmVhazsKKwljYXNlIGFfWUVIOgorCSAgICB0ZW1wYyA9IGFfc19ZRUg7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHRlbXBjID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcGM7Cit9CisKKworLyoKKyAqIENoYW5nZSBzaGFwZSAtIGZyb20gSVNPLTg4NTktNi9Jc29sYXRlZCB0byBJbml0aWFsCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGdfY19hMmkoY3VyX2MpCisgICAgaW50IGN1cl9jOworeworICAgIGludCB0ZW1wYzsKKworICAgIHN3aXRjaCAoY3VyX2MpCisgICAgeworCWNhc2UgYV9ZRUhfSEFNWkE6CisJICAgIHRlbXBjID0gYV9pX1lFSF9IQU1aQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0hBTVpBOgkJCS8qIGV4Y2VwdGlvbnMgKi8KKwkgICAgdGVtcGMgPSBhX3NfSEFNWkE7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX01BRERBOgkJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGFfc19BTEVGX01BRERBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGFfc19BTEVGX0hBTVpBX0FCT1ZFOworCSAgICBicmVhazsKKwljYXNlIGFfV0FXX0hBTVpBOgkJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGFfc19XQVdfSEFNWkE7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX0hBTVpBX0JFTE9XOgkvKiBleGNlcHRpb25zICovCisJICAgIHRlbXBjID0gYV9zX0FMRUZfSEFNWkFfQkVMT1c7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGOgkJCS8qIGV4Y2VwdGlvbnMgKi8KKwkgICAgdGVtcGMgPSBhX3NfQUxFRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RFSF9NQVJCVVRBOgkJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGFfc19URUhfTUFSQlVUQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBTDoJCQkvKiBleGNlcHRpb25zICovCisJICAgIHRlbXBjID0gYV9zX0RBTDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RIQUw6CQkJLyogZXhjZXB0aW9ucyAqLworCSAgICB0ZW1wYyA9IGFfc19USEFMOworCSAgICBicmVhazsKKwljYXNlIGFfUkVIOgkJCS8qIGV4Y2VwdGlvbnMgKi8KKwkgICAgdGVtcGMgPSBhX3NfUkVIOworCSAgICBicmVhazsKKwljYXNlIGFfWkFJTjoJCQkvKiBleGNlcHRpb25zICovCisJICAgIHRlbXBjID0gYV9zX1pBSU47CisJICAgIGJyZWFrOworCWNhc2UgYV9UQVRXRUVMOgkJCS8qIGV4Y2VwdGlvbnMgKi8KKwkgICAgdGVtcGMgPSBjdXJfYzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1dBVzoJCQkvKiBleGNlcHRpb25zICovCisJICAgIHRlbXBjID0gYV9zX1dBVzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FMRUZfTUFLU1VSQToJCS8qIGV4Y2VwdGlvbnMgKi8KKwkgICAgdGVtcGMgPSBhX3NfQUxFRl9NQUtTVVJBOworCSAgICBicmVhazsKKwljYXNlIGFfQkVIOgorCSAgICB0ZW1wYyA9IGFfaV9CRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9URUg6CisJICAgIHRlbXBjID0gYV9pX1RFSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RIRUg6CisJICAgIHRlbXBjID0gYV9pX1RIRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9KRUVNOgorCSAgICB0ZW1wYyA9IGFfaV9KRUVNOworCSAgICBicmVhazsKKwljYXNlIGFfSEFIOgorCSAgICB0ZW1wYyA9IGFfaV9IQUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9LSEFIOgorCSAgICB0ZW1wYyA9IGFfaV9LSEFIOworCSAgICBicmVhazsKKwljYXNlIGFfU0VFTjoKKwkgICAgdGVtcGMgPSBhX2lfU0VFTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1NIRUVOOgorCSAgICB0ZW1wYyA9IGFfaV9TSEVFTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1NBRDoKKwkgICAgdGVtcGMgPSBhX2lfU0FEOworCSAgICBicmVhazsKKwljYXNlIGFfREFEOgorCSAgICB0ZW1wYyA9IGFfaV9EQUQ7CisJICAgIGJyZWFrOworCWNhc2UgYV9UQUg6CisJICAgIHRlbXBjID0gYV9pX1RBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1pBSDoKKwkgICAgdGVtcGMgPSBhX2lfWkFIOworCSAgICBicmVhazsKKwljYXNlIGFfQUlOOgorCSAgICB0ZW1wYyA9IGFfaV9BSU47CisJICAgIGJyZWFrOworCWNhc2UgYV9HSEFJTjoKKwkgICAgdGVtcGMgPSBhX2lfR0hBSU47CisJICAgIGJyZWFrOworCWNhc2UgYV9GRUg6CisJICAgIHRlbXBjID0gYV9pX0ZFSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1FBRjoKKwkgICAgdGVtcGMgPSBhX2lfUUFGOworCSAgICBicmVhazsKKwljYXNlIGFfS0FGOgorCSAgICB0ZW1wYyA9IGFfaV9LQUY7CisJICAgIGJyZWFrOworCWNhc2UgYV9MQU06CisJICAgIHRlbXBjID0gYV9pX0xBTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX01FRU06CisJICAgIHRlbXBjID0gYV9pX01FRU07CisJICAgIGJyZWFrOworCWNhc2UgYV9OT09OOgorCSAgICB0ZW1wYyA9IGFfaV9OT09OOworCSAgICBicmVhazsKKwljYXNlIGFfSEVIOgorCSAgICB0ZW1wYyA9IGFfaV9IRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9ZRUg6CisJICAgIHRlbXBjID0gYV9pX1lFSDsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgdGVtcGMgPSAwOworICAgIH0KKworICAgIHJldHVybiB0ZW1wYzsKK30KKworCisvKgorICogQ2hhbmdlIHNoYXBlIC0gZnJvbSBJU08tODg1OS02L0lzb2xhdGVkIHRvIE1lZGlhbAorICovCisgICAgc3RhdGljIGludAorY2hnX2NfYTJtKGN1cl9jKQorICAgIGludCBjdXJfYzsKK3sKKyAgICBpbnQgdGVtcGM7CisKKyAgICBzd2l0Y2ggKGN1cl9jKQorICAgIHsKKwljYXNlIGFfSEFNWkE6CQkJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9zX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9NQUREQToJCS8qIGV4Y2VwdGlvbiAqLworCSAgICB0ZW1wYyA9IGFfZl9BTEVGX01BRERBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9mX0FMRUZfSEFNWkFfQUJPVkU7CisJICAgIGJyZWFrOworCWNhc2UgYV9XQVdfSEFNWkE6CQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfV0FXX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9CRUxPVzoJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9mX0FMRUZfSEFNWkFfQkVMT1c7CisJICAgIGJyZWFrOworCWNhc2UgYV9ZRUhfSEFNWkE6CisJICAgIHRlbXBjID0gYV9tX1lFSF9IQU1aQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FMRUY6CQkJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9mX0FMRUY7CisJICAgIGJyZWFrOworCWNhc2UgYV9CRUg6CisJICAgIHRlbXBjID0gYV9tX0JFSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1RFSF9NQVJCVVRBOgkJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9mX1RFSF9NQVJCVVRBOworCSAgICBicmVhazsKKwljYXNlIGFfVEVIOgorCSAgICB0ZW1wYyA9IGFfbV9URUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9USEVIOgorCSAgICB0ZW1wYyA9IGFfbV9USEVIOworCSAgICBicmVhazsKKwljYXNlIGFfSkVFTToKKwkgICAgdGVtcGMgPSBhX21fSkVFTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0hBSDoKKwkgICAgdGVtcGMgPSBhX21fSEFIOworCSAgICBicmVhazsKKwljYXNlIGFfS0hBSDoKKwkgICAgdGVtcGMgPSBhX21fS0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBTDoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfREFMOworCSAgICBicmVhazsKKwljYXNlIGFfVEhBTDoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfVEhBTDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1JFSDoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfUkVIOworCSAgICBicmVhazsKKwljYXNlIGFfWkFJTjoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfWkFJTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1NFRU46CisJICAgIHRlbXBjID0gYV9tX1NFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TSEVFTjoKKwkgICAgdGVtcGMgPSBhX21fU0hFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TQUQ6CisJICAgIHRlbXBjID0gYV9tX1NBRDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBRDoKKwkgICAgdGVtcGMgPSBhX21fREFEOworCSAgICBicmVhazsKKwljYXNlIGFfVEFIOgorCSAgICB0ZW1wYyA9IGFfbV9UQUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9aQUg6CisJICAgIHRlbXBjID0gYV9tX1pBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FJTjoKKwkgICAgdGVtcGMgPSBhX21fQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfR0hBSU46CisJICAgIHRlbXBjID0gYV9tX0dIQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfVEFUV0VFTDoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBjdXJfYzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0ZFSDoKKwkgICAgdGVtcGMgPSBhX21fRkVIOworCSAgICBicmVhazsKKwljYXNlIGFfUUFGOgorCSAgICB0ZW1wYyA9IGFfbV9RQUY7CisJICAgIGJyZWFrOworCWNhc2UgYV9LQUY6CisJICAgIHRlbXBjID0gYV9tX0tBRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0xBTToKKwkgICAgdGVtcGMgPSBhX21fTEFNOworCSAgICBicmVhazsKKwljYXNlIGFfTUVFTToKKwkgICAgdGVtcGMgPSBhX21fTUVFTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX05PT046CisJICAgIHRlbXBjID0gYV9tX05PT047CisJICAgIGJyZWFrOworCWNhc2UgYV9IRUg6CisJICAgIHRlbXBjID0gYV9tX0hFSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1dBVzoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX2ZfV0FXOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9NQUtTVVJBOgkJLyogZXhjZXB0aW9uICovCisJICAgIHRlbXBjID0gYV9mX0FMRUZfTUFLU1VSQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1lFSDoKKwkgICAgdGVtcGMgPSBhX21fWUVIOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB0ZW1wYyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXBjOworfQorCisKKy8qCisgKiBDaGFuZ2Ugc2hhcGUgLSBmcm9tIElTTy04ODU5LTYvSXNvbGF0ZWQgdG8gZmluYWwKKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZ19jX2EyZihjdXJfYykKKyAgICBpbnQgY3VyX2M7Cit7CisgICAgaW50IHRlbXBjOworCisgICAgLyogTk9URTogdGhlc2UgZW5jb2RpbmdzIG5lZWQgdG8gYmUgYWNjb3VudGVkIGZvcgorCisJYV9mX0FMRUZfTUFEREE7CisJYV9mX0FMRUZfSEFNWkFfQUJPVkU7CisJYV9mX0FMRUZfSEFNWkFfQkVMT1c7CisJYV9mX0xBTV9BTEVGX01BRERBX0FCT1ZFOworCWFfZl9MQU1fQUxFRl9IQU1aQV9BQk9WRTsKKwlhX2ZfTEFNX0FMRUZfSEFNWkFfQkVMT1c7CisJKi8KKworICAgIHN3aXRjaCAoY3VyX2MpCisgICAgeworCWNhc2UgYV9IQU1aQToJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBhX3NfSEFNWkE7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX01BRERBOgorCSAgICB0ZW1wYyA9IGFfZl9BTEVGX01BRERBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToKKwkgICAgdGVtcGMgPSBhX2ZfQUxFRl9IQU1aQV9BQk9WRTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1dBV19IQU1aQToKKwkgICAgdGVtcGMgPSBhX2ZfV0FXX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9CRUxPVzoKKwkgICAgdGVtcGMgPSBhX2ZfQUxFRl9IQU1aQV9CRUxPVzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1lFSF9IQU1aQToKKwkgICAgdGVtcGMgPSBhX2ZfWUVIX0hBTVpBOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRjoKKwkgICAgdGVtcGMgPSBhX2ZfQUxFRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0JFSDoKKwkgICAgdGVtcGMgPSBhX2ZfQkVIOworCSAgICBicmVhazsKKwljYXNlIGFfVEVIX01BUkJVVEE6CisJICAgIHRlbXBjID0gYV9mX1RFSF9NQVJCVVRBOworCSAgICBicmVhazsKKwljYXNlIGFfVEVIOgorCSAgICB0ZW1wYyA9IGFfZl9URUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9USEVIOgorCSAgICB0ZW1wYyA9IGFfZl9USEVIOworCSAgICBicmVhazsKKwljYXNlIGFfSkVFTToKKwkgICAgdGVtcGMgPSBhX2ZfSkVFTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0hBSDoKKwkgICAgdGVtcGMgPSBhX2ZfSEFIOworCSAgICBicmVhazsKKwljYXNlIGFfS0hBSDoKKwkgICAgdGVtcGMgPSBhX2ZfS0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBTDoKKwkgICAgdGVtcGMgPSBhX2ZfREFMOworCSAgICBicmVhazsKKwljYXNlIGFfVEhBTDoKKwkgICAgdGVtcGMgPSBhX2ZfVEhBTDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1JFSDoKKwkgICAgdGVtcGMgPSBhX2ZfUkVIOworCSAgICBicmVhazsKKwljYXNlIGFfWkFJTjoKKwkgICAgdGVtcGMgPSBhX2ZfWkFJTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1NFRU46CisJICAgIHRlbXBjID0gYV9mX1NFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TSEVFTjoKKwkgICAgdGVtcGMgPSBhX2ZfU0hFRU47CisJICAgIGJyZWFrOworCWNhc2UgYV9TQUQ6CisJICAgIHRlbXBjID0gYV9mX1NBRDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0RBRDoKKwkgICAgdGVtcGMgPSBhX2ZfREFEOworCSAgICBicmVhazsKKwljYXNlIGFfVEFIOgorCSAgICB0ZW1wYyA9IGFfZl9UQUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9aQUg6CisJICAgIHRlbXBjID0gYV9mX1pBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FJTjoKKwkgICAgdGVtcGMgPSBhX2ZfQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfR0hBSU46CisJICAgIHRlbXBjID0gYV9mX0dIQUlOOworCSAgICBicmVhazsKKwljYXNlIGFfVEFUV0VFTDoJCQkvKiBleGNlcHRpb24gKi8KKwkgICAgdGVtcGMgPSBjdXJfYzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0ZFSDoKKwkgICAgdGVtcGMgPSBhX2ZfRkVIOworCSAgICBicmVhazsKKwljYXNlIGFfUUFGOgorCSAgICB0ZW1wYyA9IGFfZl9RQUY7CisJICAgIGJyZWFrOworCWNhc2UgYV9LQUY6CisJICAgIHRlbXBjID0gYV9mX0tBRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0xBTToKKwkgICAgdGVtcGMgPSBhX2ZfTEFNOworCSAgICBicmVhazsKKwljYXNlIGFfTUVFTToKKwkgICAgdGVtcGMgPSBhX2ZfTUVFTTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX05PT046CisJICAgIHRlbXBjID0gYV9mX05PT047CisJICAgIGJyZWFrOworCWNhc2UgYV9IRUg6CisJICAgIHRlbXBjID0gYV9mX0hFSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX1dBVzoKKwkgICAgdGVtcGMgPSBhX2ZfV0FXOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9NQUtTVVJBOgorCSAgICB0ZW1wYyA9IGFfZl9BTEVGX01BS1NVUkE7CisJICAgIGJyZWFrOworCWNhc2UgYV9ZRUg6CisJICAgIHRlbXBjID0gYV9mX1lFSDsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgdGVtcGMgPSAwOworICAgIH0KKworICAgIHJldHVybiB0ZW1wYzsKK30KKworCisvKgorICogQ2hhbmdlIHNoYXBlIC0gZnJvbSBJbml0aWFsIHRvIE1lZGlhbAorICovCisgICAgc3RhdGljIGludAorY2hnX2NfaTJtKGN1cl9jKQorICAgIGludCBjdXJfYzsKK3sKKyAgICBpbnQgdGVtcGM7CisKKyAgICBzd2l0Y2ggKGN1cl9jKQorICAgIHsKKwljYXNlIGFfaV9ZRUhfSEFNWkE6CisJICAgIHRlbXBjID0gYV9tX1lFSF9IQU1aQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfQkVIOgorCSAgICB0ZW1wYyA9IGFfbV9CRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9pX1RFSDoKKwkgICAgdGVtcGMgPSBhX21fVEVIOworCSAgICBicmVhazsKKwljYXNlIGFfaV9USEVIOgorCSAgICB0ZW1wYyA9IGFfbV9USEVIOworCSAgICBicmVhazsKKwljYXNlIGFfaV9KRUVNOgorCSAgICB0ZW1wYyA9IGFfbV9KRUVNOworCSAgICBicmVhazsKKwljYXNlIGFfaV9IQUg6CisJICAgIHRlbXBjID0gYV9tX0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfS0hBSDoKKwkgICAgdGVtcGMgPSBhX21fS0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfU0VFTjoKKwkgICAgdGVtcGMgPSBhX21fU0VFTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfU0hFRU46CisJICAgIHRlbXBjID0gYV9tX1NIRUVOOworCSAgICBicmVhazsKKwljYXNlIGFfaV9TQUQ6CisJICAgIHRlbXBjID0gYV9tX1NBRDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfREFEOgorCSAgICB0ZW1wYyA9IGFfbV9EQUQ7CisJICAgIGJyZWFrOworCWNhc2UgYV9pX1RBSDoKKwkgICAgdGVtcGMgPSBhX21fVEFIOworCSAgICBicmVhazsKKwljYXNlIGFfaV9aQUg6CisJICAgIHRlbXBjID0gYV9tX1pBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfQUlOOgorCSAgICB0ZW1wYyA9IGFfbV9BSU47CisJICAgIGJyZWFrOworCWNhc2UgYV9pX0dIQUlOOgorCSAgICB0ZW1wYyA9IGFfbV9HSEFJTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfRkVIOgorCSAgICB0ZW1wYyA9IGFfbV9GRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9pX1FBRjoKKwkgICAgdGVtcGMgPSBhX21fUUFGOworCSAgICBicmVhazsKKwljYXNlIGFfaV9LQUY6CisJICAgIHRlbXBjID0gYV9tX0tBRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2lfTEFNOgorCSAgICB0ZW1wYyA9IGFfbV9MQU07CisJICAgIGJyZWFrOworCWNhc2UgYV9pX01FRU06CisJICAgIHRlbXBjID0gYV9tX01FRU07CisJICAgIGJyZWFrOworCWNhc2UgYV9pX05PT046CisJICAgIHRlbXBjID0gYV9tX05PT047CisJICAgIGJyZWFrOworCWNhc2UgYV9pX0hFSDoKKwkgICAgdGVtcGMgPSBhX21fSEVIOworCSAgICBicmVhazsKKwljYXNlIGFfaV9ZRUg6CisJICAgIHRlbXBjID0gYV9tX1lFSDsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgdGVtcGMgPSAwOworICAgIH0KKworICAgIHJldHVybiB0ZW1wYzsKK30KKworCisvKgorICogQ2hhbmdlIHNoYXBlIC0gZnJvbSBGaW5hbCB0byBNZWRpYWwKKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZ19jX2YybShjdXJfYykKKyAgICBpbnQgY3VyX2M7Cit7CisgICAgaW50IHRlbXBjOworCisgICAgc3dpdGNoIChjdXJfYykKKyAgICB7CisJLyogTk9URTogdGhlc2UgZW5jb2RpbmdzIGFyZSBtdWx0aS1wb3NpdGlvbmFsLCBubyA/CisJICAgY2FzZSBhX2ZfQUxFRl9NQUREQToKKwkgICBjYXNlIGFfZl9BTEVGX0hBTVpBX0FCT1ZFOgorCSAgIGNhc2UgYV9mX0FMRUZfSEFNWkFfQkVMT1c6CisJICAgKi8KKwljYXNlIGFfZl9ZRUhfSEFNWkE6CisJICAgIHRlbXBjID0gYV9tX1lFSF9IQU1aQTsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfV0FXX0hBTVpBOgkJLyogZXhjZXB0aW9ucyAqLworCWNhc2UgYV9mX0FMRUY6CisJY2FzZSBhX2ZfVEVIX01BUkJVVEE6CisJY2FzZSBhX2ZfREFMOgorCWNhc2UgYV9mX1RIQUw6CisJY2FzZSBhX2ZfUkVIOgorCWNhc2UgYV9mX1pBSU46CisJY2FzZSBhX2ZfV0FXOgorCWNhc2UgYV9mX0FMRUZfTUFLU1VSQToKKwkgICAgdGVtcGMgPSBjdXJfYzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfQkVIOgorCSAgICB0ZW1wYyA9IGFfbV9CRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9mX1RFSDoKKwkgICAgdGVtcGMgPSBhX21fVEVIOworCSAgICBicmVhazsKKwljYXNlIGFfZl9USEVIOgorCSAgICB0ZW1wYyA9IGFfbV9USEVIOworCSAgICBicmVhazsKKwljYXNlIGFfZl9KRUVNOgorCSAgICB0ZW1wYyA9IGFfbV9KRUVNOworCSAgICBicmVhazsKKwljYXNlIGFfZl9IQUg6CisJICAgIHRlbXBjID0gYV9tX0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfS0hBSDoKKwkgICAgdGVtcGMgPSBhX21fS0hBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfU0VFTjoKKwkgICAgdGVtcGMgPSBhX21fU0VFTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfU0hFRU46CisJICAgIHRlbXBjID0gYV9tX1NIRUVOOworCSAgICBicmVhazsKKwljYXNlIGFfZl9TQUQ6CisJICAgIHRlbXBjID0gYV9tX1NBRDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfREFEOgorCSAgICB0ZW1wYyA9IGFfbV9EQUQ7CisJICAgIGJyZWFrOworCWNhc2UgYV9mX1RBSDoKKwkgICAgdGVtcGMgPSBhX21fVEFIOworCSAgICBicmVhazsKKwljYXNlIGFfZl9aQUg6CisJICAgIHRlbXBjID0gYV9tX1pBSDsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfQUlOOgorCSAgICB0ZW1wYyA9IGFfbV9BSU47CisJICAgIGJyZWFrOworCWNhc2UgYV9mX0dIQUlOOgorCSAgICB0ZW1wYyA9IGFfbV9HSEFJTjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfRkVIOgorCSAgICB0ZW1wYyA9IGFfbV9GRUg7CisJICAgIGJyZWFrOworCWNhc2UgYV9mX1FBRjoKKwkgICAgdGVtcGMgPSBhX21fUUFGOworCSAgICBicmVhazsKKwljYXNlIGFfZl9LQUY6CisJICAgIHRlbXBjID0gYV9tX0tBRjsKKwkgICAgYnJlYWs7CisJY2FzZSBhX2ZfTEFNOgorCSAgICB0ZW1wYyA9IGFfbV9MQU07CisJICAgIGJyZWFrOworCWNhc2UgYV9mX01FRU06CisJICAgIHRlbXBjID0gYV9tX01FRU07CisJICAgIGJyZWFrOworCWNhc2UgYV9mX05PT046CisJICAgIHRlbXBjID0gYV9tX05PT047CisJICAgIGJyZWFrOworCWNhc2UgYV9mX0hFSDoKKwkgICAgdGVtcGMgPSBhX21fSEVIOworCSAgICBicmVhazsKKwljYXNlIGFfZl9ZRUg6CisJICAgIHRlbXBjID0gYV9tX1lFSDsKKwkgICAgYnJlYWs7CisJICAgIC8qIE5PVEU6IHRoZXNlIGVuY29kaW5ncyBhcmUgbXVsdGktcG9zaXRpb25hbCwgbm8gPworCQljYXNlIGFfZl9MQU1fQUxFRl9NQUREQV9BQk9WRToKKwkJY2FzZSBhX2ZfTEFNX0FMRUZfSEFNWkFfQUJPVkU6CisJCWNhc2UgYV9mX0xBTV9BTEVGX0hBTVpBX0JFTE9XOgorCQljYXNlIGFfZl9MQU1fQUxFRjoKKwkJKi8KKwlkZWZhdWx0OgorCSAgICB0ZW1wYyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXBjOworfQorCisKKy8qCisgKiBDaGFuZ2Ugc2hhcGUgLSBmcm9tIENvbWJpbmF0aW9uICgyIGNoYXIpIHRvIGFuIElzb2xhdGVkCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGdfY19sYWEyaShoaWRfYykKKyAgICBpbnQgaGlkX2M7Cit7CisgICAgaW50IHRlbXBjOworCisgICAgc3dpdGNoIChoaWRfYykKKyAgICB7CisJY2FzZSBhX0FMRUZfTUFEREE6CisJICAgIHRlbXBjID0gYV9zX0xBTV9BTEVGX01BRERBX0FCT1ZFOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToKKwkgICAgdGVtcGMgPSBhX3NfTEFNX0FMRUZfSEFNWkFfQUJPVkU7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX0hBTVpBX0JFTE9XOgorCSAgICB0ZW1wYyA9IGFfc19MQU1fQUxFRl9IQU1aQV9CRUxPVzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FMRUY6CisJICAgIHRlbXBjID0gYV9zX0xBTV9BTEVGOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB0ZW1wYyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXBjOworfQorCisKKy8qCisgKiBDaGFuZ2Ugc2hhcGUgLSBmcm9tIENvbWJpbmF0aW9uLUlzb2xhdGVkIHRvIEZpbmFsCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGdfY19sYWEyZihoaWRfYykKKyAgICBpbnQgaGlkX2M7Cit7CisgICAgaW50IHRlbXBjOworCisgICAgc3dpdGNoIChoaWRfYykKKyAgICB7CisJY2FzZSBhX0FMRUZfTUFEREE6CisJICAgIHRlbXBjID0gYV9mX0xBTV9BTEVGX01BRERBX0FCT1ZFOworCSAgICBicmVhazsKKwljYXNlIGFfQUxFRl9IQU1aQV9BQk9WRToKKwkgICAgdGVtcGMgPSBhX2ZfTEFNX0FMRUZfSEFNWkFfQUJPVkU7CisJICAgIGJyZWFrOworCWNhc2UgYV9BTEVGX0hBTVpBX0JFTE9XOgorCSAgICB0ZW1wYyA9IGFfZl9MQU1fQUxFRl9IQU1aQV9CRUxPVzsKKwkgICAgYnJlYWs7CisJY2FzZSBhX0FMRUY6CisJICAgIHRlbXBjID0gYV9mX0xBTV9BTEVGOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB0ZW1wYyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXBjOworfQorCisvKgorICogRG8gImhhbGYtc2hhcGluZyIgb24gY2hhcmFjdGVyICJjIi4gIFJldHVybiB6ZXJvIGlmIG5vIHNoYXBpbmcuCisgKi8KKyAgICBzdGF0aWMgaW50CitoYWxmX3NoYXBlKGMpCisgICAgaW50CQljOworeworICAgIGlmIChBX2lzX2EoYykpCisJcmV0dXJuIGNoZ19jX2EyaShjKTsKKyAgICBpZiAoQV9pc192YWxpZChjKSAmJiBBX2lzX2YoYykpCisJcmV0dXJuIGNoZ19jX2YybShjKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERvIEFyYWJpYyBzaGFwaW5nIG9uIGNoYXJhY3RlciAiYyIuICBSZXR1cm5zIHRoZSBzaGFwZWQgY2hhcmFjdGVyLgorICogb3V0OiAgICAiY2NwIiBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGNoYXJhY3RlciB0byBiZSBzaGFwZWQuCisgKiBpbi9vdXQ6ICJjMXAiIHBvaW50cyB0byB0aGUgZmlyc3QgY29tcG9zaW5nIGNoYXIgZm9yICJjIi4KKyAqIGluOiAgICAgInByZXZfYyIgIGlzIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgKG5vdCBzaGFwZWQpCisgKiBpbjogICAgICJwcmV2X2MxIiBpcyB0aGUgZmlyc3QgY29tcG9zaW5nIGNoYXIgZm9yIHRoZSBwcmV2aW91cyBjaGFyCisgKgkJICAgICAobm90IHNoYXBlZCkKKyAqIGluOiAgICAgIm5leHRfYyIgIGlzIHRoZSBuZXh0IGNoYXJhY3RlciAobm90IHNoYXBlZCkuCisgKi8KKyAgICBpbnQKK2FyYWJpY19zaGFwZShjLCBjY3AsIGMxcCwgcHJldl9jLCBwcmV2X2MxLCBuZXh0X2MpCisgICAgaW50CQljOworICAgIGludAkJKmNjcDsKKyAgICBpbnQJCSpjMXA7CisgICAgaW50CQlwcmV2X2M7CisgICAgaW50CQlwcmV2X2MxOworICAgIGludAkJbmV4dF9jOworeworICAgIGludAkJY3Vycl9jOworICAgIGludAkJc2hhcGVfYzsKKyAgICBpbnQJCWN1cnJfbGFhOworICAgIGludAkJcHJldl9sYWE7CisKKyAgICAvKiBEZWFsIG9ubHkgd2l0aCBBcmFiaWMgY2hhcmFjdGVyLCBwYXNzIGJhY2sgYWxsIG90aGVycyAqLworICAgIGlmICghQV9pc19vayhjKSkKKwlyZXR1cm4gYzsKKworICAgIC8qIGhhbGYtc2hhcGUgY3VycmVudCBhbmQgcHJldmlvdXMgY2hhcmFjdGVyICovCisgICAgc2hhcGVfYyA9IGhhbGZfc2hhcGUocHJldl9jKTsKKworICAgIC8qIFNhdmUgYXdheSBjdXJyZW50IGNoYXJhY3RlciAqLworICAgIGN1cnJfYyA9IGM7CisKKyAgICBjdXJyX2xhYSA9IEFfZmlyc3RjX2xhYShjLCAqYzFwKTsKKyAgICBwcmV2X2xhYSA9IEFfZmlyc3RjX2xhYShwcmV2X2MsIHByZXZfYzEpOworCisgICAgaWYgKGN1cnJfbGFhKQorICAgIHsKKwlpZiAoQV9pc192YWxpZChwcmV2X2MpICYmICFBX2lzX2Yoc2hhcGVfYykKKwkJCQkJICYmICFBX2lzX3Moc2hhcGVfYykgJiYgIXByZXZfbGFhKQorCSAgICBjdXJyX2MgPSBjaGdfY19sYWEyZihjdXJyX2xhYSk7CisJZWxzZQorCSAgICBjdXJyX2MgPSBjaGdfY19sYWEyaShjdXJyX2xhYSk7CisKKwkvKiBSZW1vdmUgdGhlIGNvbXBvc2luZyBjaGFyYWN0ZXIgKi8KKwkqYzFwID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIUFfaXNfdmFsaWQocHJldl9jKSAmJiBBX2lzX3ZhbGlkKG5leHRfYykpCisJY3Vycl9jID0gY2hnX2NfYTJpKGMpOworICAgIGVsc2UgaWYgKCFzaGFwZV9jIHx8IEFfaXNfZihzaGFwZV9jKSB8fCBBX2lzX3Moc2hhcGVfYykgfHwgcHJldl9sYWEpCisJY3Vycl9jID0gQV9pc192YWxpZChuZXh0X2MpID8gY2hnX2NfYTJpKGMpIDogY2hnX2NfYTJzKGMpOworICAgIGVsc2UgaWYgKEFfaXNfdmFsaWQobmV4dF9jKSkKKwljdXJyX2MgPSBBX2lzX2lzbyhjKSA/IGNoZ19jX2EybShjKSA6IGNoZ19jX2kybShjKTsKKyAgICBlbHNlIGlmIChBX2lzX3ZhbGlkKHByZXZfYykpCisJY3Vycl9jID0gY2hnX2NfYTJmKGMpOworICAgIGVsc2UKKwljdXJyX2MgPSBjaGdfY19hMnMoYyk7CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgLS0gY3Vycl9jIHNob3VsZCwgaW4gdGhlIGZ1dHVyZSwgbmV2ZXIgYmUgMC4KKyAgICAgKiBXZSBzaG91bGQsIGluIHRoZSBmdXR1cmUsIGluc2VydCBhIGZhdGFsIGVycm9yIGhlcmUuICovCisgICAgaWYgKGN1cnJfYyA9PSBOVUwpCisJY3Vycl9jID0gYzsKKworICAgIGlmIChjdXJyX2MgIT0gYyAmJiBjY3AgIT0gTlVMTCkKKyAgICB7CisJY2hhcl91IGJ1ZltNQl9NQVhCWVRFU107CisKKwkvKiBVcGRhdGUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGNoYXJhY3Rlci4gKi8KKwkoKm1iX2NoYXIyYnl0ZXMpKGN1cnJfYywgYnVmKTsKKwkqY2NwID0gYnVmWzBdOworICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgc2hhcGVkIGNoYXJhY3RlciAqLworICAgIHJldHVybiBjdXJyX2M7Cit9CisKKworLyoKKyAqIEFfZmlyc3RjX2xhYSByZXR1cm5zIGZpcnN0IGNoYXJhY3RlciBvZiBMQUEgY29tYmluYXRpb24gaWYgaXQgZXhpc3RzCisgKi8KKyAgICBzdGF0aWMgaW50CitBX2ZpcnN0Y19sYWEoYywgYzEpCisgICAgaW50IGM7CS8qIGJhc2UgY2hhcmFjdGVyICovCisgICAgaW50IGMxOwkvKiBmaXJzdCBjb21wb3NpbmcgY2hhcmFjdGVyICovCit7CisgICAgaWYgKGMxICE9IE5VTCAmJiBjID09IGFfTEFNICYmICFBX2lzX2hhcmFrYXQoYzEpKQorCXJldHVybiBjMTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogQV9pc19oYXJha2F0IHJldHVybnMgVFJVRSBpZiAnYycgaXMgYW4gQXJhYmljIEhhcmFrYXQgY2hhcmFjdGVyCisgKgkJKGhhcmFrYXQvdGFud2VlbikKKyAqLworICAgIHN0YXRpYyBpbnQKK0FfaXNfaGFyYWthdChjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoYyA+PSBhX0ZBVEhBVEFOICYmIGMgPD0gYV9TVUtVTik7Cit9CisKKworLyoKKyAqIEFfaXNfaXNvIHJldHVybnMgVFJVRSBpZiAnYycgaXMgYW4gQXJhYmljIElTTy04ODU5LTYgY2hhcmFjdGVyCisgKgkJKGFscGhhYmV0L251bWJlci9wdW5jdHVhdGlvbikKKyAqLworICAgIHN0YXRpYyBpbnQKK0FfaXNfaXNvKGMpCisgICAgaW50IGM7Cit7CisgICAgcmV0dXJuICgoYyA+PSBhX0hBTVpBICYmIGMgPD0gYV9HSEFJTikKKwkgICAgfHwgKGMgPj0gYV9UQVRXRUVMICYmIGMgPD0gYV9IQU1aQV9CRUxPVykKKwkgICAgfHwgYyA9PSBhX01JTklfQUxFRik7Cit9CisKKworLyoKKyAqIEFfaXNfZm9ybWIgcmV0dXJucyBUUlVFIGlmICdjJyBpcyBhbiBBcmFiaWMgMTA2NDYtMSBGb3JtQiBjaGFyYWN0ZXIKKyAqCQkoYWxwaGFiZXQvbnVtYmVyL3B1bmN0dWF0aW9uKQorICovCisgICAgc3RhdGljIGludAorQV9pc19mb3JtYihjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoKGMgPj0gYV9zX0ZBVEhBVEFOICYmIGMgPD0gYV9zX0RBTU1BVEFOKQorCSAgICB8fCBjID09IGFfc19LQVNSQVRBTgorCSAgICB8fCAoYyA+PSBhX3NfRkFUSEEgJiYgYyA8PSBhX2ZfTEFNX0FMRUYpCisJICAgIHx8IGMgPT0gYV9CWVRFX09SREVSX01BUkspOworfQorCisKKy8qCisgKiBBX2lzX29rIHJldHVybnMgVFJVRSBpZiAnYycgaXMgYW4gQXJhYmljIDEwNjQ2ICg4ODU5LTYgb3IgRm9ybS1CKQorICovCisgICAgc3RhdGljIGludAorQV9pc19vayhjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoQV9pc19pc28oYykgfHwgQV9pc19mb3JtYihjKSk7Cit9CisKKworLyoKKyAqIEFfaXNfdmFsaWQgcmV0dXJucyBUUlVFIGlmICdjJyBpcyBhbiBBcmFiaWMgMTA2NDYgKDg4NTktNiBvciBGb3JtLUIpCisgKgkJd2l0aCBzb21lIGV4Y2VwdGlvbnMvZXhjbHVzaW9ucworICovCisgICAgc3RhdGljIGludAorQV9pc192YWxpZChjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoQV9pc19vayhjKSAmJiAhQV9pc19zcGVjaWFsKGMpKTsKK30KKworCisvKgorICogQV9pc19zcGVjaWFsIHJldHVybnMgVFJVRSBpZiAnYycgaXMgbm90IGEgc3BlY2lhbCBBcmFiaWMgY2hhcmFjdGVyLgorICoJCVNwZWNpYWxzIGRvbid0IGFkaGVyZSB0byBtb3N0IG9mIHRoZSBydWxlcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK0FfaXNfc3BlY2lhbChjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoYyA9PSBhX0hBTVpBIHx8IGMgPT0gYV9zX0hBTVpBKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9hcmFiaWMuaCBiL3NyYy9hcmFiaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI4ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FyYWJpYy5oCkBAIC0wLDAgKzEsMjU4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkICAgIGJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogQXJhYmljIGNoYXJhY3RlcnMgYXJlIGNhdGFnb3JpemVkIGludG8gZm9sbG93aW5nIHR5cGVzOgorICoKKyAqIElzb2xhdGVkCS0gaXNvLTg4NTktNiBmb3JtCSAgY2hhciBkZW5vdGVkIHdpdGgJYV8qCisgKiBJbml0aWFsCS0gdW5pY29kZSBmb3JtLUIgc3RhcnQJICBjaGFyIGRlbm90ZWQgd2l0aAlhX2lfKgorICogTWVkaWFsCS0gdW5pY29kZSBmb3JtLUIgbWlkZGxlICAgY2hhciBkZW5vdGVkIHdpdGgJYV9tXyoKKyAqIEZpbmFsCS0gdW5pY29kZSBmb3JtLUIgZmluYWwJICBjaGFyIGRlbm90ZWQgd2l0aAlhX2ZfKgorICogU3RhbmQtQWxvbmUJLSB1bmljb2RlIGZvcm0tQiBpc29sYXRlZCBjaGFyIGRlbm90ZWQgd2l0aAlhX3NfKiAoTk9UIFVTRUQpCisgKgorICogLS0KKyAqCisgKiBBdXRob3I6IE5hZGltIFNoYWlrbGkgJiBJc2FtIEJheWF6aWRpCisgKiAtIChiYXNlZCBvbiBVbmljb2RlKQorICoKKyAqLworCisvKgorICogQXJhYmljIElTTy0xMDY0Ni0xIGNoYXJhY3RlciBzZXQgZGVmaW5pdGlvbgorICovCisKKy8qCisgKiBBcmFiaWMgSVNPLTg4NTktNiAoc3Vic2V0IG9mIDEwNjQ2OyAwNjAwIC0gMDZGRikKKyAqLworI2RlZmluZSBhX0NPTU1BCQkJCTB4MDYwQworI2RlZmluZSBhX1NFTUlDT0xPTgkJCTB4MDYxQgorI2RlZmluZSBhX1FVRVNUSU9OCQkJMHgwNjFGCisjZGVmaW5lIGFfSEFNWkEJCQkJMHgwNjIxCisjZGVmaW5lIGFfQUxFRl9NQUREQQkJCTB4MDYyMgorI2RlZmluZSBhX0FMRUZfSEFNWkFfQUJPVkUJCTB4MDYyMworI2RlZmluZSBhX1dBV19IQU1aQQkJCTB4MDYyNAorI2RlZmluZSBhX0FMRUZfSEFNWkFfQkVMT1cJCTB4MDYyNQorI2RlZmluZSBhX1lFSF9IQU1aQQkJCTB4MDYyNgorI2RlZmluZSBhX0FMRUYJCQkJMHgwNjI3CisjZGVmaW5lIGFfQkVICQkJCTB4MDYyOAorI2RlZmluZSBhX1RFSF9NQVJCVVRBCQkJMHgwNjI5CisjZGVmaW5lIGFfVEVICQkJCTB4MDYyYQorI2RlZmluZSBhX1RIRUgJCQkJMHgwNjJiCisjZGVmaW5lIGFfSkVFTQkJCQkweDA2MmMKKyNkZWZpbmUgYV9IQUgJCQkJMHgwNjJkCisjZGVmaW5lIGFfS0hBSAkJCQkweDA2MmUKKyNkZWZpbmUgYV9EQUwJCQkJMHgwNjJmCisjZGVmaW5lIGFfVEhBTAkJCQkweDA2MzAKKyNkZWZpbmUgYV9SRUgJCQkJMHgwNjMxCisjZGVmaW5lIGFfWkFJTgkJCQkweDA2MzIKKyNkZWZpbmUgYV9TRUVOCQkJCTB4MDYzMworI2RlZmluZSBhX1NIRUVOCQkJCTB4MDYzNAorI2RlZmluZSBhX1NBRAkJCQkweDA2MzUKKyNkZWZpbmUgYV9EQUQJCQkJMHgwNjM2CisjZGVmaW5lIGFfVEFICQkJCTB4MDYzNworI2RlZmluZSBhX1pBSAkJCQkweDA2MzgKKyNkZWZpbmUgYV9BSU4JCQkJMHgwNjM5CisjZGVmaW5lIGFfR0hBSU4JCQkJMHgwNjNhCisjZGVmaW5lIGFfVEFUV0VFTAkJCTB4MDY0MAorI2RlZmluZSBhX0ZFSAkJCQkweDA2NDEKKyNkZWZpbmUgYV9RQUYJCQkJMHgwNjQyCisjZGVmaW5lIGFfS0FGCQkJCTB4MDY0MworI2RlZmluZSBhX0xBTQkJCQkweDA2NDQKKyNkZWZpbmUgYV9NRUVNCQkJCTB4MDY0NQorI2RlZmluZSBhX05PT04JCQkJMHgwNjQ2CisjZGVmaW5lIGFfSEVICQkJCTB4MDY0NworI2RlZmluZSBhX1dBVwkJCQkweDA2NDgKKyNkZWZpbmUgYV9BTEVGX01BS1NVUkEJCQkweDA2NDkKKyNkZWZpbmUgYV9ZRUgJCQkJMHgwNjRhCisKKyNkZWZpbmUgYV9GQVRIQVRBTgkJCTB4MDY0YgorI2RlZmluZSBhX0RBTU1BVEFOCQkJMHgwNjRjCisjZGVmaW5lIGFfS0FTUkFUQU4JCQkweDA2NGQKKyNkZWZpbmUgYV9GQVRIQQkJCQkweDA2NGUKKyNkZWZpbmUgYV9EQU1NQQkJCQkweDA2NGYKKyNkZWZpbmUgYV9LQVNSQQkJCQkweDA2NTAKKyNkZWZpbmUgYV9TSEFEREEJCQkweDA2NTEKKyNkZWZpbmUgYV9TVUtVTgkJCQkweDA2NTIKKworI2RlZmluZSBhX01BRERBX0FCT1ZFCQkJMHgwNjUzCisjZGVmaW5lIGFfSEFNWkFfQUJPVkUJCQkweDA2NTQKKyNkZWZpbmUgYV9IQU1aQV9CRUxPVwkJCTB4MDY1NQorCisjZGVmaW5lIGFfWkVSTwkJCQkweDA2NjAKKyNkZWZpbmUgYV9PTkUJCQkJMHgwNjYxCisjZGVmaW5lIGFfVFdPCQkJCTB4MDY2MgorI2RlZmluZSBhX1RIUkVFCQkJCTB4MDY2MworI2RlZmluZSBhX0ZPVVIJCQkJMHgwNjY0CisjZGVmaW5lIGFfRklWRQkJCQkweDA2NjUKKyNkZWZpbmUgYV9TSVgJCQkJMHgwNjY2CisjZGVmaW5lIGFfU0VWRU4JCQkJMHgwNjY3CisjZGVmaW5lIGFfRUlHSFQJCQkJMHgwNjY4CisjZGVmaW5lIGFfTklORQkJCQkweDA2NjkKKyNkZWZpbmUgYV9QRVJDRU5UCQkJMHgwNjZhCisjZGVmaW5lIGFfREVDSU1BTAkJCTB4MDY2YgorI2RlZmluZSBhX1RIT1VTQU5EUwkJCTB4MDY2YworI2RlZmluZSBhX1NUQVIJCQkJMHgwNjZkCisjZGVmaW5lIGFfTUlOSV9BTEVGCQkJMHgwNjcwCisvKiBSZXN0IG9mIDg4NTktNiBkb2VzIG5vdCByZWxhdGUgdG8gQXJhYmljICovCisKKy8qCisgKiBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm0tQiAoc3Vic2V0IG9mIDEwNjQ2OyBGRTcwIC0gRkVGRikKKyAqCisgKiAgcyAtPiBpc29sYXRlZAorICogIGkgLT4gaW5pdGlhbAorICogIG0gLT4gbWVkaWFsCisgKiAgZiAtPiBmaW5hbAorICoKKyAqLworI2RlZmluZSBhX3NfRkFUSEFUQU4JCQkweGZlNzAKKyNkZWZpbmUgYV9tX1RBVFdFRUxfRkFUSEFUQU4JCTB4ZmU3MQorI2RlZmluZSBhX3NfREFNTUFUQU4JCQkweGZlNzIKKworI2RlZmluZSBhX3NfS0FTUkFUQU4JCQkweGZlNzQKKworI2RlZmluZSBhX3NfRkFUSEEJCQkweGZlNzYKKyNkZWZpbmUgYV9tX0ZBVEhBCQkJMHhmZTc3CisjZGVmaW5lIGFfc19EQU1NQQkJCTB4ZmU3OAorI2RlZmluZSBhX21fREFNTUEJCQkweGZlNzkKKyNkZWZpbmUgYV9zX0tBU1JBCQkJMHhmZTdhCisjZGVmaW5lIGFfbV9LQVNSQQkJCTB4ZmU3YgorI2RlZmluZSBhX3NfU0hBRERBCQkJMHhmZTdjCisjZGVmaW5lIGFfbV9TSEFEREEJCQkweGZlN2QKKyNkZWZpbmUgYV9zX1NVS1VOCQkJMHhmZTdlCisjZGVmaW5lIGFfbV9TVUtVTgkJCTB4ZmU3ZgorCisjZGVmaW5lIGFfc19IQU1aQQkJCTB4ZmU4MAorI2RlZmluZSBhX3NfQUxFRl9NQUREQQkJCTB4ZmU4MQorI2RlZmluZSBhX2ZfQUxFRl9NQUREQQkJCTB4ZmU4MgorI2RlZmluZSBhX3NfQUxFRl9IQU1aQV9BQk9WRQkJMHhmZTgzCisjZGVmaW5lIGFfZl9BTEVGX0hBTVpBX0FCT1ZFCQkweGZlODQKKyNkZWZpbmUgYV9zX1dBV19IQU1aQQkJCTB4ZmU4NQorI2RlZmluZSBhX2ZfV0FXX0hBTVpBCQkJMHhmZTg2CisjZGVmaW5lIGFfc19BTEVGX0hBTVpBX0JFTE9XCQkweGZlODcKKyNkZWZpbmUgYV9mX0FMRUZfSEFNWkFfQkVMT1cJCTB4ZmU4OAorI2RlZmluZSBhX3NfWUVIX0hBTVpBCQkJMHhmZTg5CisjZGVmaW5lIGFfZl9ZRUhfSEFNWkEJCQkweGZlOGEKKyNkZWZpbmUgYV9pX1lFSF9IQU1aQQkJCTB4ZmU4YgorI2RlZmluZSBhX21fWUVIX0hBTVpBCQkJMHhmZThjCisjZGVmaW5lIGFfc19BTEVGCQkJMHhmZThkCisjZGVmaW5lIGFfZl9BTEVGCQkJMHhmZThlCisjZGVmaW5lIGFfc19CRUgJCQkJMHhmZThmCisjZGVmaW5lIGFfZl9CRUgJCQkJMHhmZTkwCisjZGVmaW5lIGFfaV9CRUgJCQkJMHhmZTkxCisjZGVmaW5lIGFfbV9CRUgJCQkJMHhmZTkyCisjZGVmaW5lIGFfc19URUhfTUFSQlVUQQkJCTB4ZmU5MworI2RlZmluZSBhX2ZfVEVIX01BUkJVVEEJCQkweGZlOTQKKyNkZWZpbmUgYV9zX1RFSAkJCQkweGZlOTUKKyNkZWZpbmUgYV9mX1RFSAkJCQkweGZlOTYKKyNkZWZpbmUgYV9pX1RFSAkJCQkweGZlOTcKKyNkZWZpbmUgYV9tX1RFSAkJCQkweGZlOTgKKyNkZWZpbmUgYV9zX1RIRUgJCQkweGZlOTkKKyNkZWZpbmUgYV9mX1RIRUgJCQkweGZlOWEKKyNkZWZpbmUgYV9pX1RIRUgJCQkweGZlOWIKKyNkZWZpbmUgYV9tX1RIRUgJCQkweGZlOWMKKyNkZWZpbmUgYV9zX0pFRU0JCQkweGZlOWQKKyNkZWZpbmUgYV9mX0pFRU0JCQkweGZlOWUKKyNkZWZpbmUgYV9pX0pFRU0JCQkweGZlOWYKKyNkZWZpbmUgYV9tX0pFRU0JCQkweGZlYTAKKyNkZWZpbmUgYV9zX0hBSAkJCQkweGZlYTEKKyNkZWZpbmUgYV9mX0hBSAkJCQkweGZlYTIKKyNkZWZpbmUgYV9pX0hBSAkJCQkweGZlYTMKKyNkZWZpbmUgYV9tX0hBSAkJCQkweGZlYTQKKyNkZWZpbmUgYV9zX0tIQUgJCQkweGZlYTUKKyNkZWZpbmUgYV9mX0tIQUgJCQkweGZlYTYKKyNkZWZpbmUgYV9pX0tIQUgJCQkweGZlYTcKKyNkZWZpbmUgYV9tX0tIQUgJCQkweGZlYTgKKyNkZWZpbmUgYV9zX0RBTAkJCQkweGZlYTkKKyNkZWZpbmUgYV9mX0RBTAkJCQkweGZlYWEKKyNkZWZpbmUgYV9zX1RIQUwJCQkweGZlYWIKKyNkZWZpbmUgYV9mX1RIQUwJCQkweGZlYWMKKyNkZWZpbmUgYV9zX1JFSAkJCQkweGZlYWQKKyNkZWZpbmUgYV9mX1JFSAkJCQkweGZlYWUKKyNkZWZpbmUgYV9zX1pBSU4JCQkweGZlYWYKKyNkZWZpbmUgYV9mX1pBSU4JCQkweGZlYjAKKyNkZWZpbmUgYV9zX1NFRU4JCQkweGZlYjEKKyNkZWZpbmUgYV9mX1NFRU4JCQkweGZlYjIKKyNkZWZpbmUgYV9pX1NFRU4JCQkweGZlYjMKKyNkZWZpbmUgYV9tX1NFRU4JCQkweGZlYjQKKyNkZWZpbmUgYV9zX1NIRUVOCQkJMHhmZWI1CisjZGVmaW5lIGFfZl9TSEVFTgkJCTB4ZmViNgorI2RlZmluZSBhX2lfU0hFRU4JCQkweGZlYjcKKyNkZWZpbmUgYV9tX1NIRUVOCQkJMHhmZWI4CisjZGVmaW5lIGFfc19TQUQJCQkJMHhmZWI5CisjZGVmaW5lIGFfZl9TQUQJCQkJMHhmZWJhCisjZGVmaW5lIGFfaV9TQUQJCQkJMHhmZWJiCisjZGVmaW5lIGFfbV9TQUQJCQkJMHhmZWJjCisjZGVmaW5lIGFfc19EQUQJCQkJMHhmZWJkCisjZGVmaW5lIGFfZl9EQUQJCQkJMHhmZWJlCisjZGVmaW5lIGFfaV9EQUQJCQkJMHhmZWJmCisjZGVmaW5lIGFfbV9EQUQJCQkJMHhmZWMwCisjZGVmaW5lIGFfc19UQUgJCQkJMHhmZWMxCisjZGVmaW5lIGFfZl9UQUgJCQkJMHhmZWMyCisjZGVmaW5lIGFfaV9UQUgJCQkJMHhmZWMzCisjZGVmaW5lIGFfbV9UQUgJCQkJMHhmZWM0CisjZGVmaW5lIGFfc19aQUgJCQkJMHhmZWM1CisjZGVmaW5lIGFfZl9aQUgJCQkJMHhmZWM2CisjZGVmaW5lIGFfaV9aQUgJCQkJMHhmZWM3CisjZGVmaW5lIGFfbV9aQUgJCQkJMHhmZWM4CisjZGVmaW5lIGFfc19BSU4JCQkJMHhmZWM5CisjZGVmaW5lIGFfZl9BSU4JCQkJMHhmZWNhCisjZGVmaW5lIGFfaV9BSU4JCQkJMHhmZWNiCisjZGVmaW5lIGFfbV9BSU4JCQkJMHhmZWNjCisjZGVmaW5lIGFfc19HSEFJTgkJCTB4ZmVjZAorI2RlZmluZSBhX2ZfR0hBSU4JCQkweGZlY2UKKyNkZWZpbmUgYV9pX0dIQUlOCQkJMHhmZWNmCisjZGVmaW5lIGFfbV9HSEFJTgkJCTB4ZmVkMAorI2RlZmluZSBhX3NfRkVICQkJCTB4ZmVkMQorI2RlZmluZSBhX2ZfRkVICQkJCTB4ZmVkMgorI2RlZmluZSBhX2lfRkVICQkJCTB4ZmVkMworI2RlZmluZSBhX21fRkVICQkJCTB4ZmVkNAorI2RlZmluZSBhX3NfUUFGCQkJCTB4ZmVkNQorI2RlZmluZSBhX2ZfUUFGCQkJCTB4ZmVkNgorI2RlZmluZSBhX2lfUUFGCQkJCTB4ZmVkNworI2RlZmluZSBhX21fUUFGCQkJCTB4ZmVkOAorI2RlZmluZSBhX3NfS0FGCQkJCTB4ZmVkOQorI2RlZmluZSBhX2ZfS0FGCQkJCTB4ZmVkYQorI2RlZmluZSBhX2lfS0FGCQkJCTB4ZmVkYgorI2RlZmluZSBhX21fS0FGCQkJCTB4ZmVkYworI2RlZmluZSBhX3NfTEFNCQkJCTB4ZmVkZAorI2RlZmluZSBhX2ZfTEFNCQkJCTB4ZmVkZQorI2RlZmluZSBhX2lfTEFNCQkJCTB4ZmVkZgorI2RlZmluZSBhX21fTEFNCQkJCTB4ZmVlMAorI2RlZmluZSBhX3NfTUVFTQkJCTB4ZmVlMQorI2RlZmluZSBhX2ZfTUVFTQkJCTB4ZmVlMgorI2RlZmluZSBhX2lfTUVFTQkJCTB4ZmVlMworI2RlZmluZSBhX21fTUVFTQkJCTB4ZmVlNAorI2RlZmluZSBhX3NfTk9PTgkJCTB4ZmVlNQorI2RlZmluZSBhX2ZfTk9PTgkJCTB4ZmVlNgorI2RlZmluZSBhX2lfTk9PTgkJCTB4ZmVlNworI2RlZmluZSBhX21fTk9PTgkJCTB4ZmVlOAorI2RlZmluZSBhX3NfSEVICQkJCTB4ZmVlOQorI2RlZmluZSBhX2ZfSEVICQkJCTB4ZmVlYQorI2RlZmluZSBhX2lfSEVICQkJCTB4ZmVlYgorI2RlZmluZSBhX21fSEVICQkJCTB4ZmVlYworI2RlZmluZSBhX3NfV0FXCQkJCTB4ZmVlZAorI2RlZmluZSBhX2ZfV0FXCQkJCTB4ZmVlZQorI2RlZmluZSBhX3NfQUxFRl9NQUtTVVJBCQkweGZlZWYKKyNkZWZpbmUgYV9mX0FMRUZfTUFLU1VSQQkJMHhmZWYwCisjZGVmaW5lIGFfc19ZRUgJCQkJMHhmZWYxCisjZGVmaW5lIGFfZl9ZRUgJCQkJMHhmZWYyCisjZGVmaW5lIGFfaV9ZRUgJCQkJMHhmZWYzCisjZGVmaW5lIGFfbV9ZRUgJCQkJMHhmZWY0CisjZGVmaW5lIGFfc19MQU1fQUxFRl9NQUREQV9BQk9WRQkweGZlZjUKKyNkZWZpbmUgYV9mX0xBTV9BTEVGX01BRERBX0FCT1ZFCTB4ZmVmNgorI2RlZmluZSBhX3NfTEFNX0FMRUZfSEFNWkFfQUJPVkUJMHhmZWY3CisjZGVmaW5lIGFfZl9MQU1fQUxFRl9IQU1aQV9BQk9WRQkweGZlZjgKKyNkZWZpbmUgYV9zX0xBTV9BTEVGX0hBTVpBX0JFTE9XCTB4ZmVmOQorI2RlZmluZSBhX2ZfTEFNX0FMRUZfSEFNWkFfQkVMT1cJMHhmZWZhCisjZGVmaW5lIGFfc19MQU1fQUxFRgkJCTB4ZmVmYgorI2RlZmluZSBhX2ZfTEFNX0FMRUYJCQkweGZlZmMKKworI2RlZmluZSBhX0JZVEVfT1JERVJfTUFSSwkJMHhmZWZmCisKKy8qIFJhbmdlIG9mIEFyYWJpYyBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgc2hhcGVkLiAqLworI2RlZmluZSBBUkFCSUNfQ0hBUihjKQkJKChjKSA+PSBhX0hBTVpBICYmIChjKSA8PSBhX01JTklfQUxFRikKZGlmZiAtLWdpdCBhL3NyYy9hc2NpaS5oIGIvc3JjL2FzY2lpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNDRlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hc2NpaS5oCkBAIC0wLDAgKzEsMjAxIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgb2YgdmFyaW91cyBjb21tb24gY29udHJvbCBjaGFyYWN0ZXJzLgorICogRm9yIEVCQ0RJQyB3ZSBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgdmFsdWVzLgorICovCisKKyNpZm5kZWYgRUJDRElDCisKKy8qIElGX0VCKEFTQ0lJX2NvbnN0YW50LCBFQkNESUNfY29uc3RhbnQpICovCisjZGVmaW5lIElGX0VCKGEsIGIpCWEKKworI2RlZmluZSBDaGFyT3JkKHgpCSgoeCkgPCAnYScgPyAoeCkgLSAnQScgOiAoeCkgLSAnYScpCisjZGVmaW5lIENoYXJPcmRMb3coeCkJKCh4KSAtICdhJykKKyNkZWZpbmUgQ2hhck9yZFVwKHgpCSgoeCkgLSAnQScpCisjZGVmaW5lIFJPVDEzKGMsIGEpCSgoKCgoYykgLSAoYSkpICsgMTMpICUgMjYpICsgKGEpKQorCisjZGVmaW5lIE5VTAkJJ1wwMDAnCisjZGVmaW5lIEJFTEwJCSdcMDA3JworI2RlZmluZSBCUwkJJ1wwMTAnCisjZGVmaW5lIFRBQgkJJ1wwMTEnCisjZGVmaW5lIE5MCQknXDAxMicKKyNkZWZpbmUgTkxfU1RSCQkoY2hhcl91ICopIlwwMTIiCisjZGVmaW5lIEZGCQknXDAxNCcKKyNkZWZpbmUgQ0FSCQknXDAxNScJLyogQ1IgaXMgdXNlZCBieSBNYWMgT1MgWCAqLworI2RlZmluZSBFU0MJCSdcMDMzJworI2RlZmluZSBFU0NfU1RSCQkoY2hhcl91ICopIlwwMzMiCisjZGVmaW5lIEVTQ19TVFJfbmMJIlwwMzMiCisjZGVmaW5lIERFTAkJMHg3ZgorI2RlZmluZSBERUxfU1RSCQkoY2hhcl91ICopIlwxNzciCisjZGVmaW5lIENTSQkJMHg5YgkvKiBDb250cm9sIFNlcXVlbmNlIEludHJvZHVjZXIgKi8KKyNkZWZpbmUgQ1NJX1NUUgkJIlwyMzMiCisjZGVmaW5lIERDUwkJMHg5MAkvKiBEZXZpY2UgQ29udHJvbCBTdHJpbmcgKi8KKyNkZWZpbmUgU1RFUk0JCTB4OWMJLyogU3RyaW5nIFRlcm1pbmF0b3IgKi8KKworI2RlZmluZSBQT1VORAkJMHhBMworCisjZGVmaW5lIEN0cmxfY2hyKHgpCShUT1VQUEVSX0FTQyh4KSBeIDB4NDApIC8qICc/JyAtPiBERUwsICdAJyAtPiBeQCwgZXRjLiAqLworI2RlZmluZSBNZXRhKHgpCQkoKHgpIHwgMHg4MCkKKworI2RlZmluZSBDVFJMX0ZfU1RSCSJcMDA2IgorI2RlZmluZSBDVFJMX0hfU1RSCSJcMDEwIgorI2RlZmluZSBDVFJMX1ZfU1RSCSJcMDI2IgorI2RlZmluZSBDVFJMX1dfU1RSCSJcMDI3IgorCisjZGVmaW5lIEN0cmxfQVQJCTAgICAvKiBAICovCisjZGVmaW5lIEN0cmxfQQkJMQorI2RlZmluZSBDdHJsX0IJCTIKKyNkZWZpbmUgQ3RybF9DCQkzCisjZGVmaW5lIEN0cmxfRAkJNAorI2RlZmluZSBDdHJsX0UJCTUKKyNkZWZpbmUgQ3RybF9GCQk2CisjZGVmaW5lIEN0cmxfRwkJNworI2RlZmluZSBDdHJsX0gJCTgKKyNkZWZpbmUgQ3RybF9JCQk5CisjZGVmaW5lIEN0cmxfSgkJMTAKKyNkZWZpbmUgQ3RybF9LCQkxMQorI2RlZmluZSBDdHJsX0wJCTEyCisjZGVmaW5lIEN0cmxfTQkJMTMKKyNkZWZpbmUgQ3RybF9OCQkxNAorI2RlZmluZSBDdHJsX08JCTE1CisjZGVmaW5lIEN0cmxfUAkJMTYKKyNkZWZpbmUgQ3RybF9RCQkxNworI2RlZmluZSBDdHJsX1IJCTE4CisjZGVmaW5lIEN0cmxfUwkJMTkKKyNkZWZpbmUgQ3RybF9UCQkyMAorI2RlZmluZSBDdHJsX1UJCTIxCisjZGVmaW5lIEN0cmxfVgkJMjIKKyNkZWZpbmUgQ3RybF9XCQkyMworI2RlZmluZSBDdHJsX1gJCTI0CisjZGVmaW5lIEN0cmxfWQkJMjUKKyNkZWZpbmUgQ3RybF9aCQkyNgorI2RlZmluZSBDdHJsX0xTQgkyNyAgLyogWyBMZWZ0IFNxdWFyZSBCcmFja2V0ICovCisjZGVmaW5lIEN0cmxfQlNMCTI4ICAvKiBcIEJhY2tTTGFzaCAqLworI2RlZmluZSBDdHJsX1JTQgkyOSAgLyogXSBSaWdodCBTcXVhcmUgQnJhY2tldCAqLworI2RlZmluZSBDdHJsX0hBVAkzMCAgLyogXiAqLworI2RlZmluZSBDdHJsX18JCTMxCisKKyNlbHNlCisKKy8qIEVCQ0RJQyAqLworCisvKiBJRl9FQihBU0NJSV9jb25zdGFudCwgRUJDRElDX2NvbnN0YW50KSAqLworI2RlZmluZSBJRl9FQihhLCBiKQliCisKKy8qCisgKiBGaW5kaW5nIHRoZSBwb3NpdGlvbiBpbiB0aGUgYWxwaGFiZXQgaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZCBpbiBFQkNESUMuCisgKiBUaGVyZSBhcmUgZ2FwcyBpbiB0aGUgY29kZSB0YWJsZS4KKyAqICdhJyArIDEgPT0gJ2InLCBidXQ6ICdpJyArIDcgPT0gJ2onIGFuZCAncicgKyA4ID09ICdzJworICovCisjZGVmaW5lIENoYXJPcmRfXyhjKSAoKGMpIDwgKCdqJyAtICdhJykgPyAoYykgOiAoKGMpIDwgKCdzJyAtICdhJykgPyAoYykgLSA3IDogKGMpIC0gNyAtIDgpKQorI2RlZmluZSBDaGFyT3JkTG93KHgpIChDaGFyT3JkX18oKHgpIC0gJ2EnKSkKKyNkZWZpbmUgQ2hhck9yZFVwKHgpIChDaGFyT3JkX18oKHgpIC0gJ0EnKSkKKyNkZWZpbmUgQ2hhck9yZCh4KSAoaXN1cHBlcih4KSA/IENoYXJPcmRVcCh4KSA6IENoYXJPcmRMb3coeCkpCisKKyNkZWZpbmUgRUJDRElDX0NIQVJfQUREXyh4KSAoKHgpIDwgMD8nYSc6KHgpPjI1Pyd6JzoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiW3hdKQorI2RlZmluZSBFQkNESUNfQ0hBUl9BREQoYyxzKSAoaXN1cHBlcihjKSA/IHRvdXBwZXIoRUJDRElDX0NIQVJfQUREXyhDaGFyT3JkVXAoYykrKHMpKSkgOiBFQkNESUNfQ0hBUl9BRERfKENoYXJPcmRMb3coYykrKHMpKSkKKworI2RlZmluZSBSMTNfKGMpICgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiWygoYykgKyAxMykgJSAyNl0pCisjZGVmaW5lIFJPVDEzKGMsIGEpICAoaXN1cHBlcihjKSA/IHRvdXBwZXIoUjEzXyhDaGFyT3JkVXAoYykpKSA6IFIxM18oQ2hhck9yZExvdyhjKSkpCisKKyNkZWZpbmUgTlVMCQknXDAwMCcKKyNkZWZpbmUgQkVMTAkJJ1x4MmYnCisjZGVmaW5lIEJTCQknXHgxNicKKyNkZWZpbmUgVEFCCQknXHgwNScKKyNkZWZpbmUgTkwJCSdceDE1JworI2RlZmluZSBOTF9TVFIJCShjaGFyX3UgKikiXHgxNSIKKyNkZWZpbmUgRkYJCSdceDBDJworI2RlZmluZSBDQVIJCSdceDBEJworI2RlZmluZSBFU0MJCSdceDI3JworI2RlZmluZSBFU0NfU1RSCQkoY2hhcl91ICopIlx4MjciCisjZGVmaW5lIEVTQ19TVFJfbmMJIlx4MjciCisjZGVmaW5lIERFTAkJMHgwNworI2RlZmluZSBERUxfU1RSCQkoY2hhcl91ICopIlwwMDciCisvKiBUT0RPOiBFQkNESUMgQ29kZSBwYWdlIGRlcGVuZGVudCAoaGVyZSAxMDQ3KSAqLworI2RlZmluZSBDU0kJCTB4OWIJLyogQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyICovCisjZGVmaW5lIENTSV9TVFIJCSJcMjMzIgorI2RlZmluZSBEQ1MJCTB4OTAJLyogRGV2aWNlIENvbnRyb2wgU3RyaW5nICovCisjZGVmaW5lIFNURVJNCQkweDljCS8qIFN0cmluZyBUZXJtaW5hdG9yICovCisKKyNkZWZpbmUgUE9VTkQJCSejJworCisjZGVmaW5lIENUUkxfRl9TVFIJIlwwNTYiCisjZGVmaW5lIENUUkxfSF9TVFIJIlwwMjYiCisjZGVmaW5lIENUUkxfVl9TVFIJIlwwNjIiCisjZGVmaW5lIENUUkxfV19TVFIJIlwwNDYiCisKKyNkZWZpbmUgQ3RybF9BVAkJMHgwMCAgIC8qIEAgKi8KKyNkZWZpbmUgQ3RybF9BCQkweDAxCisjZGVmaW5lIEN0cmxfQgkJMHgwMgorI2RlZmluZSBDdHJsX0MJCTB4MDMKKyNkZWZpbmUgQ3RybF9ECQkweDM3CisjZGVmaW5lIEN0cmxfRQkJMHgyRAorI2RlZmluZSBDdHJsX0YJCTB4MkUKKyNkZWZpbmUgQ3RybF9HCQkweDJGCisjZGVmaW5lIEN0cmxfSAkJMHgxNgorI2RlZmluZSBDdHJsX0kJCTB4MDUKKyNkZWZpbmUgQ3RybF9KCQkweDE1CisjZGVmaW5lIEN0cmxfSwkJMHgwQgorI2RlZmluZSBDdHJsX0wJCTB4MEMKKyNkZWZpbmUgQ3RybF9NCQkweDBECisjZGVmaW5lIEN0cmxfTgkJMHgwRQorI2RlZmluZSBDdHJsX08JCTB4MEYKKyNkZWZpbmUgQ3RybF9QCQkweDEwCisjZGVmaW5lIEN0cmxfUQkJMHgxMQorI2RlZmluZSBDdHJsX1IJCTB4MTIKKyNkZWZpbmUgQ3RybF9TCQkweDEzCisjZGVmaW5lIEN0cmxfVAkJMHgzQworI2RlZmluZSBDdHJsX1UJCTB4M0QKKyNkZWZpbmUgQ3RybF9WCQkweDMyCisjZGVmaW5lIEN0cmxfVwkJMHgyNgorI2RlZmluZSBDdHJsX1gJCTB4MTgKKyNkZWZpbmUgQ3RybF9ZCQkweDE5CisjZGVmaW5lIEN0cmxfWgkJMHgzRgorI2RlZmluZSBDdHJsX0xTQgkweDI3ICAvKiBbIExlZnQgU3F1YXJlIEJyYWNrZXQgKi8KKyNkZWZpbmUgQ3RybF9SU0IJMHgxRCAgLyogXSBSaWdodCBTcXVhcmUgQnJhY2tldCAqLworI2RlZmluZSBDdHJsX0JTTAkweDFDICAvKiBcIEJhY2tTTGFzaCAqLworI2RlZmluZSBDdHJsX0hBVAkweDFFICAvKiBeICovCisjZGVmaW5lIEN0cmxfXwkJMHgxRgorCisjZGVmaW5lIEN0cmxfY2hyKHgpCShDdHJsVGFibGVbKHgpXSkKK2V4dGVybiBjaGFyIEN0cmxUYWJsZVtdOworCisjZGVmaW5lIEN0cmxDaGFyKHgpCSgoeCA8ICcgJykgPyBDdHJsQ2hhclRhYmxlWyh4KV0gOiAwKQorZXh0ZXJuIGNoYXIgQ3RybENoYXJUYWJsZVtdOworCisjZGVmaW5lIE1ldGFDaGFyKHgpCSgoeCA8ICcgJykgPyBNZXRhQ2hhclRhYmxlWyh4KV0gOiAwKQorZXh0ZXJuIGNoYXIgTWV0YUNoYXJUYWJsZVtdOworCisjZW5kaWYgLyogZGVmaW5lZCBFQkNESUMgKi8KKworLyoKKyAqIENoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBkaXIgbmFtZXMgaW4gYSBwYXRoLgorICogRm9yIE1TLURPUywgV0lOMzIgYW5kIE9TLzIgd2UgdXNlIGEgYmFja3NsYXNoLiAgQSBzbGFzaCBtb3N0bHkgd29ya3MKKyAqIGZpbmUsIGJ1dCB0aGVyZSBhcmUgcGxhY2VzIHdoZXJlIGl0IGRvZXNuJ3QgKGUuZy4gaW4gYSBjb21tYW5kIG5hbWUpLgorICogRm9yIE1hY2ludG9zaCB3ZSB1c2UgYSBjb2xvbi4KKyAqIEZvciBBY29ybiB3ZSB1c2UgYSBkb3QuCisgKi8KKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyMgZGVmaW5lIFBBVEhTRVAJcHNlcGMKKyMgZGVmaW5lIFBBVEhTRVBTVFIJcHNlcHMKKyNlbHNlCisjIGlmZGVmIENPTE9OX0FTX1BBVEhTRVAKKyMgIGRlZmluZSBQQVRIU0VQCSc6JworIyAgZGVmaW5lIFBBVEhTRVBTVFIJIjoiCisjIGVsc2UKKyMgIGlmZGVmIFJJU0NPUworIyAgIGRlZmluZSBQQVRIU0VQCScuJworIyAgIGRlZmluZSBQQVRIU0VQU1RSCSIuIgorIyAgZWxzZQorIyAgIGRlZmluZSBQQVRIU0VQCScvJworIyAgIGRlZmluZSBQQVRIU0VQU1RSCSIvIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2F1dG8vY29uZmlndXJlIGIvc3JjL2F1dG8vY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwNDBhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXV0by9jb25maWd1cmUKQEAgLTAsMCArMSw4NjkyIEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLWRhcndpbiAgICAgICAgRGlzYWJsZSBEYXJ3aW4gKE1hYyBPUyBYKSBzdXBwb3J0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC12aW0tbmFtZT1OQU1FICAgIHdoYXQgdG8gY2FsbCB0aGUgVmltIGV4ZWN1dGFibGUiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtZXgtbmFtZT1OQU1FICAgICB3aGF0IHRvIGNhbGwgdGhlIEV4IGV4ZWN1dGFibGUiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtdmlldy1uYW1lPU5BTUUgICB3aGF0IHRvIGNhbGwgdGhlIFZpZXcgZXhlY3V0YWJsZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbG9iYWwtcnVudGltZT1ESVIgICAgZ2xvYmFsIHJ1bnRpbWUgZGlyZWN0b3J5IGluICdydW50aW1lcGF0aCciCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtbW9kaWZpZWQtYnk9TkFNRSAgICAgICBuYW1lIG9mIHdobyBtb2RpZmllZCBhIHJlbGVhc2UgdmVyc2lvbiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1mZWF0dXJlcz1UWVBFICAgIHRpbnksIHNtYWxsLCBub3JtYWwsIGJpZyBvciBodWdlIChkZWZhdWx0OiBub3JtYWwpIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWNvbXBpbGVkYnk9TkFNRSAgbmFtZSB0byBzaG93IGluIDp2ZXJzaW9uIG1lc3NhZ2UiCithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUteHNtcCAgICAgICAgICBEaXNhYmxlIFhTTVAgc2Vzc2lvbiBtYW5hZ2VtZW50IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLXhzbXAtaW50ZXJhY3QgRGlzYWJsZSBYU01QIGludGVyYWN0aW9uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtcGVybGludGVycCAgICAgSW5jbHVkZSBQZXJsIGludGVycHJldGVyLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXB5dGhvbmludGVycCAgIEluY2x1ZGUgUHl0aG9uIGludGVycHJldGVyLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1weXRob24tY29uZmlnLWRpcj1QQVRIICBQeXRob24ncyBjb25maWcgZGlyZWN0b3J5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtdGNsaW50ZXJwICAgICAgSW5jbHVkZSBUY2wgaW50ZXJwcmV0ZXIuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLXRjbHNoPVBBVEggICAgICAgd2hpY2ggdGNsc2ggdG8gdXNlIChkZWZhdWx0OiB0Y2xzaDguMCkiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1ydWJ5aW50ZXJwICAgICBJbmNsdWRlIFJ1YnkgaW50ZXJwcmV0ZXIuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtY3Njb3BlICAgICAgICAgSW5jbHVkZSBjc2NvcGUgaW50ZXJmYWNlLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXdvcmtzaG9wICAgICAgIEluY2x1ZGUgU3VuIFZpc3VhbCBXb3Jrc2hvcCBzdXBwb3J0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1uZXRiZWFucyAgICAgIERpc2FibGUgTmV0QmVhbnMgaW50ZWdyYXRpb24gc3VwcG9ydC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zbmlmZiAgICAgICAgICBJbmNsdWRlIFNuaWZmIGludGVyZmFjZS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tdWx0aWJ5dGUgICAgICBJbmNsdWRlIG11bHRpYnl0ZSBlZGl0aW5nIHN1cHBvcnQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtaGFuZ3VsaW5wdXQgICAgSW5jbHVkZSBIYW5ndWwgaW5wdXQgc3VwcG9ydC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS14aW0gICAgICAgICAgICBJbmNsdWRlIFhJTSBpbnB1dCBzdXBwb3J0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWZvbnRzZXQgICAgICAgIEluY2x1ZGUgWCBmb250c2V0IG91dHB1dCBzdXBwb3J0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC14ICAgICAgICAgICAgICAgIHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtZ3VpWz1PUFRTXSAgICAgWDExIEdVSSBbZGVmYXVsdD1hdXRvXSBbT1BUUz1hdXRvL25vL2d0ay9ndGsyL2dub21lL2dub21lMi9tb3RpZi9hdGhlbmEvbmVYdGF3L2Jlb3MvcGhvdG9uL2NhcmJvbl0iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1ndGstY2hlY2sgICAgICBJZiBhdXRvLXNlbGVjdCBHVUksIGNoZWNrIGZvciBHVEsgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWd0azItY2hlY2sgICAgIElmIEdUSyBHVUksIGNoZWNrIGZvciBHVEsrIDIgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWdub21lLWNoZWNrICAgIElmIEdUSyBHVUksIGNoZWNrIGZvciBHTk9NRSBbZGVmYXVsdD1ub10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tb3RpZi1jaGVjayAgICBJZiBhdXRvLXNlbGVjdCBHVUksIGNoZWNrIGZvciBNb3RpZiBbZGVmYXVsdD15ZXNdIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYXRoZW5hLWNoZWNrICAgSWYgYXV0by1zZWxlY3QgR1VJLCBjaGVjayBmb3IgQXRoZW5hIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1uZXh0YXctY2hlY2sgICBJZiBhdXRvLXNlbGVjdCBHVUksIGNoZWNrIGZvciBuZVh0YXcgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWNhcmJvbi1jaGVjayAgIElmIGF1dG8tc2VsZWN0IEdVSSwgY2hlY2sgZm9yIENhcmJvbiBbZGVmYXVsdD15ZXNdIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWd0ay1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1ndGstZXhlYy1wcmVmaXg9UEZYIEV4ZWMgcHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ndGt0ZXN0ICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBHVEsgcHJvZ3JhbSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbm9tZS1pbmNsdWRlcz1ESVIgU3BlY2lmeSBsb2NhdGlvbiBvZiBHTk9NRSBoZWFkZXJzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWdub21lLWxpYnM9RElSICAgU3BlY2lmeSBsb2NhdGlvbiBvZiBHTk9NRSBsaWJzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWdub21lICAgICAgICAgICAgU3BlY2lmeSBwcmVmaXggZm9yIEdOT01FIGZpbGVzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLW1vdGlmLWxpYj1TVFJJTkcgICBMaWJyYXJ5IGZvciBNb3RpZiAiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtdGxpYj1saWJyYXJ5ICAgICB0ZXJtaW5hbCBsaWJyYXJ5IHRvIGJlIHVzZWQgIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLWFjbCAgICAgICAgICAgRG9uJ3QgY2hlY2sgZm9yIEFDTCBzdXBwb3J0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ncG0gICAgICAgICAgIERvbid0IHVzZSBncG0gKExpbnV4IG1vdXNlIGRhZW1vbikuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgRG9uJ3Qgc3VwcG9ydCBOTFMgKGdldHRleHQoKSkuIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT5hdXRvL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT12aW0uaAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworCitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVU5JWCAxCitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjIwOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjczMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzYzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorCisjbGluZSA3NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODEwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODM4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Njk6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODg0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4OTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkwMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6OTA3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjkyNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NTg6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKwlmb3IgYWNfcHJvZyBpbiBtYXdrIGdhd2sgbmF3ayBhd2sKK2RvCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5ODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BV0snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQVdLPSIkYWNfY3ZfcHJvZ19BV0siCitpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFXSyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK3Rlc3QgLW4gIiRBV0siICYmIGJyZWFrCitkb25lCisJCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfU1RSSVAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfU1RSSVA9InN0cmlwIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCIgJiYgYWNfY3ZfcHJvZ19TVFJJUD0iOiIKK2ZpCitmaQorU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFNUUklQIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDQzOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKyNpZm5kZWYgX19DWUdXSU5fXworI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworI2VuZGlmCityZXR1cm4gX19DWUdXSU5fXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jeWd3aW49bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKK0NZR1dJTj0KK3Rlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDc2OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiBfX01JTkdXMzJfXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDg4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0Kgorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKK01JTkdXMzI9Cit0ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDc6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCisgIGFjX2N2X2V4ZWV4dD0uZXhlCitlbHNlCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3ZfZXhlZXh0PQorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KKyAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5jIHwgKi5vIHwgKi5vYmopIDs7CisgICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiBjb25mdGVzdCoKKyAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubworZmkKK2ZpCisKK0VYRUVYVD0iIgordGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKK2FjX2V4ZWV4dD0kRVhFRVhUCisKKworaWYgdGVzdCAteiAiJENGTEFHUyI7IHRoZW4KKyAgQ0ZMQUdTPSItTyIKKyAgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgQ0ZMQUdTPSItTzIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLVdhbGwiCitmaQoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgZ2NjdmVyc2lvbj1gIiRDQyIgLS12ZXJzaW9uIHwgc2VkIC1lICcyLCRkO3MvXlteMC05XSpcKFswLTldXC5bMC05Ll0qXCkuKiQvXDEvZydgCisgIGlmIHRlc3QgIiRnY2N2ZXJzaW9uIiA9ICIzLjAuMSIgLW8gIiRnY2N2ZXJzaW9uIiA9ICIzLjAuMiI7IHRoZW4KKyAgICBlY2hvICdHQ0MgMy4wLnggaGFzIGEgYnVnIGluIHRoZSBvcHRpbWl6ZXIsIGRpc2FibGluZyAiLU8jIicKKyAgICBDRkxBR1M9YGVjaG8gIiRDRkxBR1MiIHwgc2VkICdzLy1PWzIzNDU2Nzg5XS8tTy8nYAorICBlbHNlCisgICAgaWYgdGVzdCAiJGdjY3ZlcnNpb24iID0gIjMuMSIgLW8gIiRnY2N2ZXJzaW9uIiA9ICIzLjIiIC1vICIkZ2NjdmVyc2lvbiIgPSAiMy4yLjEiICYmIGBlY2hvICIkQ0ZMQUdTIiB8IGdyZXAgLXYgZm5vLXN0cmVuZ3RoLXJlZHVjZSA+L2Rldi9udWxsYDsgdGhlbgorICAgICAgZWNobyAnR0NDIDMuMSBhbmQgMy4yIGhhdmUgYSBidWcgaW4gdGhlIG9wdGltaXplciwgYWRkaW5nICItZm5vLXN0cmVuZ3RoLXJlZHVjZSInCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLWZuby1zdHJlbmd0aC1yZWR1Y2UiCisgICAgZmkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGNvbXBpbGUgYSBzaW1wbGUgcHJvZ3JhbSwgY2hlY2sgQ0MgYW5kIENGTEFHUworICAoY3Jvc3MgY29tcGlsaW5nIGRvZXNuJ3Qgd29yaykiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordGVzdCAiJEdDQyIgPSB5ZXMgJiYgQ1BQX01NPU07IAorCitpZiB0ZXN0IC1mIC4vdG9vbGNoZWNrOyB0aGVuCisgIGVjaG8gImNoZWNraW5nIGZvciBidWdneSB0b29scyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNjQ6IGNoZWNraW5nIGZvciBidWdneSB0b29scyIgPiY1CisgIHNoIC4vdG9vbGNoZWNrIDE+JjYKK2ZpCisKK09TX0VYVFJBX1NSQz0iIjsgT1NfRVhUUkFfT0JKPSIiCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBCZU9TIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTcxOiBjaGVja2luZyBmb3IgQmVPUyIgPiY1CitjYXNlIGB1bmFtZWAgaW4KKyAgICBCZU9TKQlPU19FWFRSQV9TUkM9b3NfYmVvcy5jOyBPU19FWFRSQV9PQko9b2JqZWN0cy9vc19iZW9zLm8KKwkJQkVPUz15ZXM7IGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7OworICAgICopCQlCRU9TPW5vOyBlY2hvICIkYWNfdCIibm8iIDE+JjY7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUU5YIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTc5OiBjaGVja2luZyBmb3IgUU5YIiA+JjUKK2Nhc2UgYHVuYW1lYCBpbgorICAgIFFOWCkJT1NfRVhUUkFfU1JDPW9zX3FueC5jOyBPU19FWFRSQV9PQko9b2JqZWN0cy9vc19xbngubworCQl0ZXN0IC16ICIkd2l0aF94IiAmJiB3aXRoX3g9bm8KKwkJUU5YPXllczsgZWNobyAiJGFjX3QiInllcyIgMT4mNjs7CisgICAgKikJCVFOWD1ubzsgZWNobyAiJGFjX3QiIm5vIiAxPiY2OzsKK2VzYWMKKworREVGQVVMVF9WSU1OQU1FPXZpbQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIERhcndpbiAoTWFjIE9TIFgpIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTg5OiBjaGVja2luZyBmb3IgRGFyd2luIChNYWMgT1MgWCkiID4mNQoraWYgdGVzdCAiYCh1bmFtZSkgMj4vZGV2L251bGxgIiA9IERhcndpbjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1kaXNhYmxlLWRhcndpbiBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5NDogY2hlY2tpbmcgLS1kaXNhYmxlLWRhcndpbiBhcmd1bWVudCIgPiY1CisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kYXJ3aW4gb3IgLS1kaXNhYmxlLWRhcndpbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kYXJ3aW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2RhcndpbiIKKyAgOgorZWxzZQorICBlbmFibGVfZGFyd2luPSJ5ZXMiCitmaQorCisgIGlmIHRlc3QgIiRlbmFibGVfZGFyd2luIiA9ICJ5ZXMiOyB0aGVuCisgICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgRGFyd2luIGZpbGVzIGFyZSB0aGVyZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgaWYgRGFyd2luIGZpbGVzIGFyZSB0aGVyZSIgPiY1CisgICAgaWYgdGVzdCAtZiBvc19tYWNvc3guYzsgdGhlbgorICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190IiJubywgRGFyd2luIHN1cHBvcnQgZGlzYWJsZWQiIDE+JjYKKyAgICAgIGVuYWJsZV9kYXJ3aW49bm8KKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJGFjX3QiInllcywgRGFyd2luIHN1cHBvcnQgZXhjbHVkZWQiIDE+JjYKKyAgZmkKKworICBpZiB0ZXN0ICIkZW5hYmxlX2RhcndpbiIgPSAieWVzIjsgdGhlbgorICAgIE1BQ09TWD15ZXMKKyAgICBPU19FWFRSQV9TQ1I9Im9zX21hY29zeC5jIjsKKyAgICBPU19FWFRSQV9PQko9Im9iamVjdHMvb3NfbWFjb3N4Lm8iCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1BQ09TX1hfVU5JWCAtSS9EZXZlbG9wZXIvSGVhZGVycy9GbGF0Q2FyYm9uIC1uby1jcHAtcHJlY29tcCIKKworICAgICAgICAgICAgYWNfc2FmZT1gZWNobyAiQ2FyYm9uL0NhcmJvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBDYXJib24vQ2FyYm9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjU6IGNoZWNraW5nIGZvciBDYXJib24vQ2FyYm9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTIzNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIENBUkJPTj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgaWYgdGVzdCAieCRDQVJCT04iID0gInh5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkd2l0aF94IjsgdGhlbgorCXdpdGhfeD1ubworCURFRkFVTFRfVklNTkFNRT1WaW0KKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKworCitoYXZlX2xvY2FsX2luY2x1ZGU9JycKK2hhdmVfbG9jYWxfbGliPScnCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKKyAgICBoYXZlX2xvY2FsX2luY2x1ZGU9YCR7Q0MtY2N9IC1uby1jcHAtcHJlY29tcCAtYyAtdiBjb25mdGVzdC5jIDI+JjEgfCBncmVwICcvdXNyL2xvY2FsL2luY2x1ZGUnYAorICBoYXZlX2xvY2FsX2xpYj1gJHtDQy1jY30gLWMgLXYgY29uZnRlc3QuYyAyPiYxIHwgZ3JlcCAnL3Vzci9sb2NhbC9saWInYAorICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8KK2ZpCitpZiB0ZXN0IC16ICIkaGF2ZV9sb2NhbF9saWIiIC1hIC1kIC91c3IvbG9jYWwvbGliOyB0aGVuCisgIHR0PWBlY2hvICIkTERGTEFHUyIgfCBzZWQgLWUgJ3MrLUwvdXNyL2xvY2FsL2xpYiArK2cnIC1lICdzKy1ML3Vzci9sb2NhbC9saWIkKytnJ2AKKyAgaWYgdGVzdCAiJHR0IiA9ICIkTERGTEFHUyI7IHRoZW4KKyAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgorICBmaQorZmkKK2lmIHRlc3QgLXogIiRoYXZlX2xvY2FsX2luY2x1ZGUiIC1hIC1kIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhlbgorICB0dD1gZWNobyAiJENQUEZMQUdTIiB8IHNlZCAtZSAncystSS91c3IvbG9jYWwvaW5jbHVkZSArK2cnIC1lICdzKy1JL3Vzci9sb2NhbC9pbmNsdWRlJCsrZydgCisgIGlmIHRlc3QgIiR0dCIgPSAiJENQUEZMQUdTIjsgdGhlbgorICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL2xvY2FsL2luY2x1ZGUiCisgIGZpCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtdmltLW5hbWUgYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyOTI6IGNoZWNraW5nIC0td2l0aC12aW0tbmFtZSBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXZpbS1uYW1lIG9yIC0td2l0aG91dC12aW0tbmFtZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdmltX25hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfdmltX25hbWUiCisgIFZJTU5BTUU9IiR3aXRodmFsIjsgZWNobyAiJGFjX3QiIiRWSU1OQU1FIiAxPiY2CitlbHNlCisgIFZJTU5BTUU9IiRERUZBVUxUX1ZJTU5BTUUiOyBlY2hvICIkYWNfdCIiRGVmYXVsdGluZyB0byAkVklNTkFNRSIgMT4mNgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtZXgtbmFtZSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMwMzogY2hlY2tpbmcgLS13aXRoLWV4LW5hbWUgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1leC1uYW1lIG9yIC0td2l0aG91dC1leC1uYW1lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9leF9uYW1lK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2V4X25hbWUiCisgIEVYTkFNRT0iJHdpdGh2YWwiOyBlY2hvICIkYWNfdCIiJEVYTkFNRSIgMT4mNgorZWxzZQorICBFWE5BTUU9ImV4IjsgZWNobyAiJGFjX3QiIkRlZmF1bHRpbmcgdG8gZXgiIDE+JjYKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS13aXRoLXZpZXctbmFtZSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMxNDogY2hlY2tpbmcgLS13aXRoLXZpZXctbmFtZSBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXZpZXctbmFtZSBvciAtLXdpdGhvdXQtdmlldy1uYW1lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF92aWV3X25hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfdmlld19uYW1lIgorICBWSUVXTkFNRT0iJHdpdGh2YWwiOyBlY2hvICIkYWNfdCIiJFZJRVdOQU1FIiAxPiY2CitlbHNlCisgIFZJRVdOQU1FPSJ2aWV3IjsgZWNobyAiJGFjX3QiIkRlZmF1bHRpbmcgdG8gdmlldyIgMT4mNgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0td2l0aC1nbG9iYWwtcnVudGltZSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyNjogY2hlY2tpbmcgLS13aXRoLWdsb2JhbC1ydW50aW1lIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ2xvYmFsLXJ1bnRpbWUgb3IgLS13aXRob3V0LWdsb2JhbC1ydW50aW1lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbG9iYWxfcnVudGltZStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbG9iYWxfcnVudGltZSIKKyAgZWNobyAiJGFjX3QiIiR3aXRodmFsIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSVU5USU1FX0dMT0JBTCAiJHdpdGh2YWwiCitFT0YKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS13aXRoLW1vZGlmaWVkLWJ5IGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQwOiBjaGVja2luZyAtLXdpdGgtbW9kaWZpZWQtYnkgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tb2RpZmllZC1ieSBvciAtLXdpdGhvdXQtbW9kaWZpZWQtYnkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX21vZGlmaWVkX2J5K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX21vZGlmaWVkX2J5IgorICBlY2hvICIkYWNfdCIiJHdpdGh2YWwiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIE1PRElGSUVEX0JZICIkd2l0aHZhbCIKK0VPRgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBpZiBjaGFyYWN0ZXIgc2V0IGlzIEVCQ0RJQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM1NDogY2hlY2tpbmcgaWYgY2hhcmFjdGVyIHNldCBpcyBFQkNESUMiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM1NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisgCitpbnQgbWFpbigpIHsKKyAvKiBUcnlDb21waWxlIGZ1bmN0aW9uIGZvciBDaGFyU2V0LgorICAgVHJlYXQgYW55IGZhaWx1cmUgYXMgQVNDSUkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhcnQuCisgICBVc2UgY29tcGlsZS10aW1lIHJhdGhlciB0aGFuIHJ1bi10aW1lIHRlc3RzIGZvciBjcm9zcy1jb21waWxlcgorICAgdG9sZXJhbmNlLiAgKi8KKyNpZiAnMCchPTI0MAorbWFrZSBhbiBlcnJvciAiQ2hhcmFjdGVyIHNldCBpcyBub3QgRUJDRElDIgorI2VuZGlmIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgIyBUcnlDb21waWxlIGFjdGlvbiBpZiB0cnVlCitjZl9jdl9lYmNkaWM9eWVzIAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgIyBUcnlDb21waWxlIGFjdGlvbiBpZiBmYWxzZQorY2ZfY3ZfZWJjZGljPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisjIGVuZCBvZiBUcnlDb21waWxlIF0pCisjIGVuZCBvZiBDYWNoZVZhbCBDdkViY2RpYworZWNobyAiJGFjX3QiIiRjZl9jdl9lYmNkaWMiIDE+JjYKK2Nhc2UgIiRjZl9jdl9lYmNkaWMiIGluICAjKHZpCisgICAgeWVzKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRUJDRElDIDEKK0VPRgorCisJCWxpbmVfYnJlYWs9JyJcXG4iJworCQk7OworICAgICopCQlsaW5lX2JyZWFrPSciXFwwMTIiJzs7Citlc2FjCisKKworaWYgdGVzdCAiJGNmX2N2X2ViY2RpYyIgPSAieWVzIjsgdGhlbgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIE9TLzM5MCBVbml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzk3OiBjaGVja2luZyBmb3IgT1MvMzkwIFVuaXgiID4mNQorY2FzZSBgdW5hbWVgIGluCisgICAgT1MvMzkwKQlPUzM5MFVuaXg9InllcyI7CisJCQkJCQkJCQkJaWYgdGVzdCAiJENDIiA9ICJjYyI7IHRoZW4KKwkJICBjY209IiRfQ0NfQ0NNT0RFIgorCQkgIGNjbj0iQ0MiCisJCWVsc2UKKwkJICBpZiB0ZXN0ICIkQ0MiID0gImM4OSI7IHRoZW4KKwkJICAgIGNjbT0iJF9DQ19DODlNT0RFIgorCQkgICAgY2NuPSJDODkiCisJCSAgZWxzZQorCQkgICAgY2NtPTEKKwkJICBmaQorCQlmaQorCQlpZiB0ZXN0ICIkY2NtIiAhPSAiMSI7IHRoZW4KKwkJICBlY2hvICIiCisJCSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgIGVjaG8gIiBPbiBPUy8zOTAgVW5peCwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgorCQkgIGVjaG8gIiBfX0NDXyR7Y2NufU1PREUgbXVzdCBiZSBzZXQgdG8gXCIxXCIhIgorCQkgIGVjaG8gIiBEbzoiCisJCSAgZWNobyAiICAgIGV4cG9ydCBfQ0NfJHtjY259TU9ERT0xIgorCQkgIGVjaG8gIiBhbmQgdGhlbiBjYWxsIGNvbmZpZ3VyZSBhZ2Fpbi4iCisJCSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgIGV4aXQgMQorCQlmaQorCQlDRkxBR1M9IiRDRkxBR1MgLURfQUxMX1NPVVJDRSI7IExERkxBR1M9IiRMREZMQUdTIC1XbCxFRElUPU5PIgorCQllY2hvICIkYWNfdCIieWVzIiAxPiY2CisJCTs7CisgICAgKikJCU9TMzkwVW5peD0ibm8iOworCQllY2hvICIkYWNfdCIibm8iIDE+JjYKKwkJOzsKK2VzYWMKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtZmVhdHVyZXMgYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzQ6IGNoZWNraW5nIC0td2l0aC1mZWF0dXJlcyBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWZlYXR1cmVzIG9yIC0td2l0aG91dC1mZWF0dXJlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZmVhdHVyZXMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZmVhdHVyZXMiCisgIGZlYXR1cmVzPSIkd2l0aHZhbCI7IGVjaG8gIiRhY190IiIkZmVhdHVyZXMiIDE+JjYKK2Vsc2UKKyAgZmVhdHVyZXM9Im5vcm1hbCI7IGVjaG8gIiRhY190IiJEZWZhdWx0aW5nIHRvIG5vcm1hbCIgMT4mNgorZmkKKworCitkb3ZpbWRpZmY9IiIKK2RvZ3ZpbWRpZmY9IiIKK2Nhc2UgIiRmZWF0dXJlcyIgaW4KKyAgdGlueSkJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBGRUFUX1RJTlkgMQorRU9GCisgOzsKKyAgc21hbGwpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBGRUFUX1NNQUxMIDEKK0VPRgorIDs7CisgIG5vcm1hbCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfTk9STUFMIDEKK0VPRgorIGRvdmltZGlmZj0iaW5zdGFsbHZpbWRpZmYiOworCQkJZG9ndmltZGlmZj0iaW5zdGFsbGd2aW1kaWZmIiA7OworICBiaWcpCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9CSUcgMQorRU9GCisgZG92aW1kaWZmPSJpbnN0YWxsdmltZGlmZiI7CisJCQlkb2d2aW1kaWZmPSJpbnN0YWxsZ3ZpbWRpZmYiIDs7CisgIGh1Z2UpCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9IVUdFIDEKK0VPRgorIGRvdmltZGlmZj0iaW5zdGFsbHZpbWRpZmYiOworCQkJZG9ndmltZGlmZj0iaW5zdGFsbGd2aW1kaWZmIiA7OworICAqKQkJZWNobyAiJGFjX3QiIlNvcnJ5LCAkZmVhdHVyZXMgaXMgbm90IHN1cHBvcnRlZCIgMT4mNiA7OworZXNhYworCisKKworCitlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtY29tcGlsZWRieSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQ3NzogY2hlY2tpbmcgLS13aXRoLWNvbXBpbGVkYnkgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jb21waWxlZGJ5IG9yIC0td2l0aG91dC1jb21waWxlZGJ5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jb21waWxlZGJ5K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2NvbXBpbGVkYnkiCisgIGNvbXBpbGVkYnk9IiR3aXRodmFsIjsgZWNobyAiJGFjX3QiIiR3aXRodmFsIiAxPiY2CitlbHNlCisgIGNvbXBpbGVkYnk9IiI7IGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZGlzYWJsZS14c21wIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDg5OiBjaGVja2luZyAtLWRpc2FibGUteHNtcCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUteHNtcCBvciAtLWRpc2FibGUteHNtcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV94c21wK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV94c21wIgorICA6CitlbHNlCisgIGVuYWJsZV94c21wPSJ5ZXMiCitmaQorCisKK2lmIHRlc3QgIiRlbmFibGVfeHNtcCIgPSAieWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1kaXNhYmxlLXhzbXAtaW50ZXJhY3QgYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1MDI6IGNoZWNraW5nIC0tZGlzYWJsZS14c21wLWludGVyYWN0IGFyZ3VtZW50IiA+JjUKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXhzbXAtaW50ZXJhY3Qgb3IgLS1kaXNhYmxlLXhzbXAtaW50ZXJhY3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfeHNtcF9pbnRlcmFjdCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfeHNtcF9pbnRlcmFjdCIKKyAgOgorZWxzZQorICBlbmFibGVfeHNtcF9pbnRlcmFjdD0ieWVzIgorZmkKKworICBpZiB0ZXN0ICIkZW5hYmxlX3hzbXBfaW50ZXJhY3QiID0gInllcyI7IHRoZW4KKyAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNFX1hTTVBfSU5URVJBQ1QgMQorRU9GCisKKyAgZWxzZQorICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1lbmFibGUtcGVybGludGVycCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTUyNTogY2hlY2tpbmcgLS1lbmFibGUtcGVybGludGVycCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGVybGludGVycCBvciAtLWRpc2FibGUtcGVybGludGVycCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wZXJsaW50ZXJwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wZXJsaW50ZXJwIgorICA6CitlbHNlCisgIGVuYWJsZV9wZXJsaW50ZXJwPSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX3BlcmxpbnRlcnAiIDE+JjYKK2lmIHRlc3QgIiRlbmFibGVfcGVybGludGVycCIgPSAieWVzIjsgdGhlbgorICAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwZXJsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwZXJsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1NDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3BlcmwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkdmlfY3ZfcGF0aF9wZXJsIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3Blcmw9IiR2aV9jdl9wYXRoX3BlcmwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3Blcmw9IiR2aV9jdl9wYXRoX3BlcmwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF9wZXJsPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZmkKK3ZpX2N2X3BhdGhfcGVybD0iJGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF9wZXJsIgoraWYgdGVzdCAtbiAiJHZpX2N2X3BhdGhfcGVybCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiR2aV9jdl9wYXRoX3BlcmwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgIlgkdmlfY3ZfcGF0aF9wZXJsIiAhPSAiWCI7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBQZXJsIHZlcnNpb24iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1NzQ6IGNoZWNraW5nIFBlcmwgdmVyc2lvbiIgPiY1CisgICAgaWYgJHZpX2N2X3BhdGhfcGVybCAtZSAncmVxdWlyZSA1LjAwM18wMScgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICBldmFsIGAkdmlfY3ZfcGF0aF9wZXJsIC1WOnVzZXRocmVhZHNgCisgICAgIGlmIHRlc3QgIlgkdXNldGhyZWFkcyIgPSAiWFVOS05PV04iIC1vICJYJHVzZXRocmVhZHMiID0gIlh1bmRlZiI7IHRoZW4KKyAgICAgICBiYWR0aHJlYWRzPW5vCisgICAgIGVsc2UKKyAgICAgICBpZiAkdmlfY3ZfcGF0aF9wZXJsIC1lICdyZXF1aXJlIDUuNi4wJyA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJIGV2YWwgYCR2aV9jdl9wYXRoX3BlcmwgLVY6dXNlNTAwNXRocmVhZHNgCisJIGlmIHRlc3QgIlgkdXNlNTAwNXRocmVhZHMiID0gIlhVTktOT1dOIiAtbyAiWCR1c2U1MDA1dGhyZWFkcyIgPSAiWHVuZGVmIjsgdGhlbgorCSAgIGJhZHRocmVhZHM9bm8KKwkgZWxzZQorCSAgIGJhZHRocmVhZHM9eWVzCisJICAgZWNobyAiJGFjX3QiIj4+PiBQZXJsID4gNS42IHdpdGggNS41IHRocmVhZHMgY2Fubm90IGJlIHVzZWQgPDw8IiAxPiY2CisJIGZpCisgICAgICAgZWxzZQorCSBiYWR0aHJlYWRzPXllcworCSBlY2hvICIkYWNfdCIiPj4+IFBlcmwgNS41IHdpdGggdGhyZWFkcyBjYW5ub3QgYmUgdXNlZCA8PDwiIDE+JjYKKyAgICAgICBmaQorICAgICBmaQorICAgICBpZiB0ZXN0ICRiYWR0aHJlYWRzID0gbm87IHRoZW4KKyAgICAgIGVjaG8gIiRhY190IiJPSyIgMT4mNgorICAgICAgZXZhbCBgJHZpX2N2X3BhdGhfcGVybCAtVjpzaHJwZW52YAorICAgICAgaWYgdGVzdCAiWCRzaHJwZW52IiA9ICJYVU5LTk9XTiI7IHRoZW4gIyBwcmUgNS4wMDNfMDQKKwlzaHJwZW52PSIiCisgICAgICBmaQorICAgICAgdmlfY3ZfcGVybGxpYj1gJHZpX2N2X3BhdGhfcGVybCAtTUNvbmZpZyAtZSAncHJpbnQgJENvbmZpZ3twcml2bGliZXhwfSdgCisgICAgICAKKyAgICAgICAgICAgIHBlcmxjcHBmbGFncz1gJHZpX2N2X3BhdGhfcGVybCAtTWxpYj0kc3JjZGlyIC1NRXh0VXRpbHM6OkVtYmVkIFwKKwkgICAgICAtZSAnY2NmbGFncztwZXJsX2luYztwcmludCJcbiInIHwgc2VkIC1lICdzLy1mbm9bXiBdKi8vJ2AKKyAgICAgICAgICAgIHBlcmxsaWJzPWBjZCAkc3JjZGlyOyAkdmlfY3ZfcGF0aF9wZXJsIC1NRXh0VXRpbHM6OkVtYmVkIC1lICdsZG9wdHMnIHwgXAorCQlzZWQgLWUgJy9XYXJuaW5nL2QnIC1lICcvTm90ZSAocHJvYmFibHkgaGFybWxlc3MpL2QnIFwKKwkJCS1lICdzLy1iRTpwZXJsLmV4cC8vJyAtZSAncy8tbGMgLy8nYAorICAgICAgICAgICAgICAgICAgcGVybGxkZmxhZ3M9YGNkICRzcmNkaXI7ICR2aV9jdl9wYXRoX3BlcmwgLU1FeHRVdGlsczo6RW1iZWQgXAorCQktZSAnY2NkbGZsYWdzJyB8IHNlZCAtZSAncy8tYkU6cGVybC5leHAvLydgCisKKyAgICAgICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGlmIGNvbXBpbGUgYW5kIGxpbmsgZmxhZ3MgZm9yIFBlcmwgYXJlIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2MTA6IGNoZWNraW5nIGlmIGNvbXBpbGUgYW5kIGxpbmsgZmxhZ3MgZm9yIFBlcmwgYXJlIHNhbmUiID4mNQorICAgICAgY2ZsYWdzX3NhdmU9JENGTEFHUworICAgICAgbGlic19zYXZlPSRMSUJTCisgICAgICBsZGZsYWdzX3NhdmU9JExERkxBR1MKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkcGVybGNwcGZsYWdzIgorICAgICAgTElCUz0iJExJQlMgJHBlcmxsaWJzIgorICAgICAgTERGTEFHUz0iJHBlcmxsZGZsYWdzICRMREZMQUdTIgorICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYxOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IHBlcmxfb2s9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubzogUEVSTCBESVNBQkxFRCIgMT4mNjsgcGVybF9vaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgICAgQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorICAgICAgTElCUz0kbGlic19zYXZlCisgICAgICBMREZMQUdTPSRsZGZsYWdzX3NhdmUKKyAgICAgIGlmIHRlc3QgJHBlcmxfb2sgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICJYJHBlcmxjcHBmbGFncyIgIT0gIlgiOyB0aGVuCisJICBQRVJMX0NGTEFHUz0iJHBlcmxjcHBmbGFncyIKKwlmaQorCWlmIHRlc3QgIlgkcGVybGxkZmxhZ3MiICE9ICJYIjsgdGhlbgorCSAgTERGTEFHUz0iJHBlcmxsZGZsYWdzICRMREZMQUdTIgorCWZpCisJUEVSTF9MSUJTPSRwZXJsbGlicworCVBFUkxfU1JDPSJhdXRvL2lmX3BlcmwuYyBpZl9wZXJsc2Zpby5jIgorCVBFUkxfT0JKPSJvYmplY3RzL2lmX3BlcmwubyBvYmplY3RzL2lmX3BlcmxzZmlvLm8iCisJUEVSTF9QUk89ImlmX3BlcmwucHJvIGlmX3BlcmxzZmlvLnBybyIKKwljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9QRVJMIDEKK0VPRgorCisgICAgICBmaQorICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190IiI+Pj4gdG9vIG9sZDsgbmVlZCBQZXJsIHZlcnNpb24gNS4wMDNfMDEgb3IgbGF0ZXIgPDw8IiAxPiY2CisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0ICJ4JE1BQ09TWCIgPSAieHllcyI7IHRoZW4KKyAgICAgICAgZGlyPS9TeXN0ZW0vTGlicmFyeS9QZXJsCisgICAgZGFyd2luZGlyPSRkaXIvZGFyd2luCisgICAgaWYgdGVzdCAtZCAkZGFyd2luZGlyOyB0aGVuCisgICAgICBQRVJMPS91c3IvYmluL3BlcmwKKyAgICBlbHNlCisgICAgICAgICAgICBkaXI9L1N5c3RlbS9MaWJyYXJ5L1BlcmwvNS44LjEKKyAgICAgIGRhcndpbmRpcj0kZGlyL2Rhcndpbi10aHJlYWQtbXVsdGktMmxldmVsCisgICAgICBpZiB0ZXN0IC1kICRkYXJ3aW5kaXI7IHRoZW4KKwlQRVJMPS91c3IvYmluL3BlcmwKKyAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KKyAgICAgIFBFUkxfRElSPSIkZGlyIgorICAgICAgUEVSTF9DRkxBR1M9Ii1ERkVBVF9QRVJMIC1JJGRhcndpbmRpci9DT1JFIgorICAgICAgUEVSTF9PQko9Im9iamVjdHMvaWZfcGVybC5vIG9iamVjdHMvaWZfcGVybHNmaW8ubyAkZGFyd2luZGlyL2F1dG8vRHluYUxvYWRlci9EeW5hTG9hZGVyLmEiCisgICAgICBQRVJMX0xJQlM9Ii1MJGRhcndpbmRpci9DT1JFIC1scGVybCIKKyAgICBmaQorICBmaQorZmkKKworCisKKworCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1lbmFibGUtcHl0aG9uaW50ZXJwIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjg4OiBjaGVja2luZyAtLWVuYWJsZS1weXRob25pbnRlcnAgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXB5dGhvbmludGVycCBvciAtLWRpc2FibGUtcHl0aG9uaW50ZXJwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3B5dGhvbmludGVycCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfcHl0aG9uaW50ZXJwIgorICA6CitlbHNlCisgIGVuYWJsZV9weXRob25pbnRlcnA9Im5vIgorZmkKKworZWNobyAiJGFjX3QiIiRlbmFibGVfcHl0aG9uaW50ZXJwIiAxPiY2CitpZiB0ZXN0ICIkZW5hYmxlX3B5dGhvbmludGVycCIgPSAieWVzIjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHl0aG9uIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBweXRob247IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTcwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX3ZpX2N2X3BhdGhfcHl0aG9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJHZpX2N2X3BhdGhfcHl0aG9uIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3B5dGhvbj0iJHZpX2N2X3BhdGhfcHl0aG9uIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF9weXRob249IiR2aV9jdl9wYXRoX3B5dGhvbiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3B5dGhvbj0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2ZpCit2aV9jdl9wYXRoX3B5dGhvbj0iJGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF9weXRob24iCitpZiB0ZXN0IC1uICIkdmlfY3ZfcGF0aF9weXRob24iOyB0aGVuCisgIGVjaG8gIiRhY190IiIkdmlfY3ZfcGF0aF9weXRob24iIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgIlgkdmlfY3ZfcGF0aF9weXRob24iICE9ICJYIjsgdGhlbgorCisgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIFB5dGhvbiB2ZXJzaW9uIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzM3OiBjaGVja2luZyBQeXRob24gdmVyc2lvbiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3sndmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgdmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9uPWAKKwkgICAgJHt2aV9jdl9wYXRoX3B5dGhvbn0gLWMgJ2ltcG9ydCBzeXM7IHByaW50IHN5cy52ZXJzaW9uWzozXSdgCisgICAgCitmaQorCitlY2hvICIkYWNfdCIiJHZpX2N2X3Zhcl9weXRob25fdmVyc2lvbiIgMT4mNgorCisgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIFB5dGhvbiBpcyAxLjQgb3IgYmV0dGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzQ5OiBjaGVja2luZyBQeXRob24gaXMgMS40IG9yIGJldHRlciIgPiY1CisgICAgaWYgJHt2aV9jdl9wYXRoX3B5dGhvbn0gLWMgXAorCSJpbXBvcnQgc3lzOyBzeXMuZXhpdCgke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0gPCAxLjQpIgorICAgIHRoZW4KKyAgICAgIGVjaG8gIiRhY190IiJ5ZXAiIDE+JjYKKworICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgUHl0aG9uJ3MgaW5zdGFsbCBwcmVmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTY6IGNoZWNraW5nIFB5dGhvbidzIGluc3RhbGwgcHJlZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd2aV9jdl9wYXRoX3B5dGhvbl9wZngnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgdmlfY3ZfcGF0aF9weXRob25fcGZ4PWAKKwkgICAgJHt2aV9jdl9wYXRoX3B5dGhvbn0gLWMgXAorCQkiaW1wb3J0IHN5czsgcHJpbnQgc3lzLnByZWZpeCJgIAorZmkKKworZWNobyAiJGFjX3QiIiR2aV9jdl9wYXRoX3B5dGhvbl9wZngiIDE+JjYKKworICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgUHl0aG9uJ3MgZXhlY3V0aW9uIHByZWZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc2ODogY2hlY2tpbmcgUHl0aG9uJ3MgZXhlY3V0aW9uIHByZWZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3sndmlfY3ZfcGF0aF9weXRob25fZXBmeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICB2aV9jdl9wYXRoX3B5dGhvbl9lcGZ4PWAKKwkgICAgJHt2aV9jdl9wYXRoX3B5dGhvbn0gLWMgXAorCQkiaW1wb3J0IHN5czsgcHJpbnQgc3lzLmV4ZWNfcHJlZml4ImAgCitmaQorCitlY2hvICIkYWNfdCIiJHZpX2N2X3BhdGhfcHl0aG9uX2VwZngiIDE+JjYKKworICAgICAgCisgICAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3sndmlfY3ZfcGF0aF9weXRob25wYXRoJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIHZpX2N2X3BhdGhfcHl0aG9ucGF0aD1gCisJICAgIHVuc2V0IFBZVEhPTlBBVEg7CisJICAgICR7dmlfY3ZfcGF0aF9weXRob259IC1jIFwKKwkJImltcG9ydCBzeXMsIHN0cmluZzsgcHJpbnQgc3RyaW5nLmpvaW4oc3lzLnBhdGgsJzonKSJgIAorZmkKKworCisgICAgICAKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHl0aG9uLWNvbmZpZy1kaXIgb3IgLS13aXRob3V0LXB5dGhvbi1jb25maWctZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9weXRob25fY29uZmlnX2RpcitzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9weXRob25fY29uZmlnX2RpciIKKyAgIHZpX2N2X3BhdGhfcHl0aG9uX2NvbmY9IiR7d2l0aHZhbH0iICAKK2ZpCisKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgUHl0aG9uJ3MgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3OTk6IGNoZWNraW5nIFB5dGhvbidzIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd2aV9jdl9wYXRoX3B5dGhvbl9jb25mJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgCisJdmlfY3ZfcGF0aF9weXRob25fY29uZj0KKwlmb3IgcGF0aCBpbiAiJHt2aV9jdl9wYXRoX3B5dGhvbl9wZnh9IiAiJHt2aV9jdl9wYXRoX3B5dGhvbl9lcGZ4fSI7IGRvCisJICBmb3Igc3ViZGlyIGluIGxpYiBzaGFyZTsgZG8KKwkgICAgZD0iJHtwYXRofS8ke3N1YmRpcn0vcHl0aG9uJHt2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb259L2NvbmZpZyIKKwkgICAgaWYgdGVzdCAtZCAiJGQiICYmIHRlc3QgLWYgIiRkL2NvbmZpZy5jIjsgdGhlbgorCSAgICAgIHZpX2N2X3BhdGhfcHl0aG9uX2NvbmY9IiRkIgorCSAgICBmaQorCSAgZG9uZQorCWRvbmUKKyAgICAgIAorZmkKKworZWNobyAiJGFjX3QiIiR2aV9jdl9wYXRoX3B5dGhvbl9jb25mIiAxPiY2CisKKyAgICAgIFBZVEhPTl9DT05GRElSPSIke3ZpX2N2X3BhdGhfcHl0aG9uX2NvbmZ9IgorCisgICAgICBpZiB0ZXN0ICJYJFBZVEhPTl9DT05GRElSIiA9ICJYIjsgdGhlbgorCWVjaG8gIiRhY190IiJjYW4ndCBmaW5kIGl0ISIgMT4mNgorICAgICAgZWxzZQorCisJCQlpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3sndmlfY3ZfcGF0aF9weXRob25fcGxpYnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAKKwkgICAgdG1wX21rZj0iL3RtcC9NYWtlZmlsZS1jb25mJCQiCisJICAgIGNhdCAke1BZVEhPTl9DT05GRElSfS9NYWtlZmlsZSAtIDw8J2VvZicgPiR7dG1wX21rZn0KK19fOgorCUBlY2hvICJweXRob25fTU9ETElCUz0nJChNT0RMSUJTKSciCisJQGVjaG8gInB5dGhvbl9MSUJTPSckKExJQlMpJyIKKwlAZWNobyAicHl0aG9uX1NZU0xJQlM9JyQoU1lTTElCUyknIgorCUBlY2hvICJweXRob25fTElOS0ZPUlNIQVJFRD0nJChMSU5LRk9SU0hBUkVEKSciCitlb2YKKwkgICAgCSAgICBldmFsICJgY2QgJHtQWVRIT05fQ09ORkRJUn0gJiYgbWFrZSAtZiAke3RtcF9ta2Z9IF9fIHwgc2VkICcvIGRpcmVjdG9yeSAvZCdgIgorCSAgICBybSAtZiAke3RtcF9ta2Z9CisJICAgIGlmIHRlc3QgIngkTUFDT1NYIiA9ICJ4eWVzIiAmJiAke3ZpX2N2X3BhdGhfcHl0aG9ufSAtYyBcCisJCSJpbXBvcnQgc3lzOyBzeXMuZXhpdCgke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0gPCAyLjMpIjsgdGhlbgorCSAgICAgIHZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzPSItZnJhbWV3b3JrIFB5dGhvbiIKKwkgICAgZWxzZQorCSAgICAgIGlmIHRlc3QgIiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufSIgPSAiMS40IjsgdGhlbgorCQkgIHZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzPSIke1BZVEhPTl9DT05GRElSfS9saWJNb2R1bGVzLmEgJHtQWVRIT05fQ09ORkRJUn0vbGliUHl0aG9uLmEgJHtQWVRIT05fQ09ORkRJUn0vbGliT2JqZWN0cy5hICR7UFlUSE9OX0NPTkZESVJ9L2xpYlBhcnNlci5hIgorCSAgICAgIGVsc2UKKwkJICB2aV9jdl9wYXRoX3B5dGhvbl9wbGlicz0iLUwke1BZVEhPTl9DT05GRElSfSAtbHB5dGhvbiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufSIKKwkgICAgICBmaQorCSAgICAgIHZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzPSIke3ZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzfSAke3B5dGhvbl9NT0RMSUJTfSAke3B5dGhvbl9MSUJTfSAke3B5dGhvbl9TWVNMSUJTfSAke3B5dGhvbl9MSU5LRk9SU0hBUkVEfSIKKwkgICAgICAJICAgICAgdmlfY3ZfcGF0aF9weXRob25fcGxpYnM9YGVjaG8gJHZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzIHwgc2VkIHMvLWx0ZXJtY2FwLy9gCisJICAgIGZpCisJCitmaQorCisKKwlQWVRIT05fTElCUz0iJHt2aV9jdl9wYXRoX3B5dGhvbl9wbGlic30iCisJaWYgdGVzdCAiJHt2aV9jdl9wYXRoX3B5dGhvbl9wZnh9IiA9ICIke3ZpX2N2X3BhdGhfcHl0aG9uX2VwZnh9IjsgdGhlbgorCSAgUFlUSE9OX0NGTEFHUz0iLUkke3ZpX2N2X3BhdGhfcHl0aG9uX3BmeH0vaW5jbHVkZS9weXRob24ke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0iCisJZWxzZQorCSAgUFlUSE9OX0NGTEFHUz0iLUkke3ZpX2N2X3BhdGhfcHl0aG9uX3BmeH0vaW5jbHVkZS9weXRob24ke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0gLUkke3ZpX2N2X3BhdGhfcHl0aG9uX2VwZnh9L2luY2x1ZGUvcHl0aG9uJHt2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb259IgorCWZpCisJUFlUSE9OX1NSQz0iaWZfcHl0aG9uLmMiCisJCWlmIHRlc3QgIngkTUFDT1NYIiA9ICJ4eWVzIjsgdGhlbgorCSAgUFlUSE9OX09CSj0ib2JqZWN0cy9pZl9weXRob24ubyIKKwllbHNlCisJICBQWVRIT05fT0JKPSJvYmplY3RzL2lmX3B5dGhvbi5vIG9iamVjdHMvcHlfY29uZmlnLm8iCisJZmkKKwlpZiB0ZXN0ICIke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0iID0gIjEuNCI7IHRoZW4KKwkgICBQWVRIT05fT0JKPSIkUFlUSE9OX09CSiBvYmplY3RzL3B5X2dldHBhdGgubyIKKwlmaQorCVBZVEhPTl9HRVRQQVRIX0NGTEFHUz0iLURQWVRIT05QQVRIPSdcIiR7dmlfY3ZfcGF0aF9weXRob25wYXRofVwiJyAtRFBSRUZJWD0nXCIke3ZpX2N2X3BhdGhfcHl0aG9uX3BmeH1cIicgLURFWEVDX1BSRUZJWD0nXCIke3ZpX2N2X3BhdGhfcHl0aG9uX2VwZnh9XCInIgorCisJCQkJCQkJCWVjaG8gJGFjX24gImNoZWNraW5nIGlmIC1wdGhyZWFkIHNob3VsZCBiZSB1c2VkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODcyOiBjaGVja2luZyBpZiAtcHRocmVhZCBzaG91bGQgYmUgdXNlZCIgPiY1CisJdGhyZWFkc2FmZV9mbGFnPQorCXRocmVhZF9saWI9CisJaWYgdGVzdCAieCRNQUNPU1giICE9ICJ4eWVzIjsgdGhlbgorCSAgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGhyZWFkc2FmZV9mbGFnPSItcHRocmVhZCIKKwkgIGlmIHRlc3QgImAodW5hbWUpIDI+L2Rldi9udWxsYCIgPSBGcmVlQlNEOyB0aGVuCisJICAgIHRocmVhZHNhZmVfZmxhZz0iLURfVEhSRUFEX1NBRkUiCisJICAgIHRocmVhZF9saWI9Ii1wdGhyZWFkIgorCSAgZmkKKwlmaQorCWxpYnNfc2F2ZV9vbGQ9JExJQlMKKwlpZiB0ZXN0IC1uICIkdGhyZWFkc2FmZV9mbGFnIjsgdGhlbgorCSAgY2ZsYWdzX3NhdmU9JENGTEFHUworCSAgQ0ZMQUdTPSIkQ0ZMQUdTICR0aHJlYWRzYWZlX2ZsYWciCisJICBMSUJTPSIkTElCUyAkdGhyZWFkX2xpYiIKKwkgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4ODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBQWVRIT05fQ0ZMQUdTPSIkUFlUSE9OX0NGTEFHUyAkdGhyZWFkc2FmZV9mbGFnIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjY7IExJQlM9JGxpYnNfc2F2ZV9vbGQKKwkgICAgIAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCSAgQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorCWVsc2UKKwkgIGVjaG8gIiRhY190IiJubyIgMT4mNgorCWZpCisKKwkJCWVjaG8gJGFjX24gImNoZWNraW5nIGlmIGNvbXBpbGUgYW5kIGxpbmsgZmxhZ3MgZm9yIFB5dGhvbiBhcmUgc2FuZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkxMjogY2hlY2tpbmcgaWYgY29tcGlsZSBhbmQgbGluayBmbGFncyBmb3IgUHl0aG9uIGFyZSBzYW5lIiA+JjUKKwljZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisJbGlic19zYXZlPSRMSUJTCisJQ0ZMQUdTPSIkQ0ZMQUdTICRQWVRIT05fQ0ZMQUdTIgorCUxJQlM9IiRMSUJTICRQWVRIT05fTElCUyIKKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxOTE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgcHl0aG9uX29rPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm86IFBZVEhPTiBESVNBQkxFRCIgMT4mNjsgcHl0aG9uX29rPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisJQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorCUxJQlM9JGxpYnNfc2F2ZQorCWlmIHRlc3QgJHB5dGhvbl9vayA9IHllczsgdGhlbgorCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfUFlUSE9OIDEKK0VPRgorCisJZWxzZQorCSAgTElCUz0kbGlic19zYXZlX29sZAorCSAgUFlUSE9OX1NSQz0KKwkgIFBZVEhPTl9PQko9CisJICBQWVRIT05fTElCUz0KKwkgIFBZVEhPTl9DRkxBR1M9CisJZmkKKworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCIidG9vIG9sZCIgMT4mNgorICAgIGZpCisgIGZpCitmaQorCisKKworCisKKworCitlY2hvICRhY19uICJjaGVja2luZyAtLWVuYWJsZS10Y2xpbnRlcnAgYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NjQ6IGNoZWNraW5nIC0tZW5hYmxlLXRjbGludGVycCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGNsaW50ZXJwIG9yIC0tZGlzYWJsZS10Y2xpbnRlcnAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGNsaW50ZXJwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90Y2xpbnRlcnAiCisgIDoKK2Vsc2UKKyAgZW5hYmxlX3RjbGludGVycD0ibm8iCitmaQorCitlY2hvICIkYWNfdCIiJGVuYWJsZV90Y2xpbnRlcnAiIDE+JjYKKworaWYgdGVzdCAiJGVuYWJsZV90Y2xpbnRlcnAiID0gInllcyI7IHRoZW4KKworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIC0td2l0aC10Y2xzaCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk3ODogY2hlY2tpbmcgLS13aXRoLXRjbHNoIGFyZ3VtZW50IiA+JjUKKyAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC10Y2xzaCBvciAtLXdpdGhvdXQtdGNsc2ggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RjbHNoK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX3RjbHNoIgorICB0Y2xzaF9uYW1lPSIkd2l0aHZhbCI7IGVjaG8gIiRhY190IiIkdGNsc2hfbmFtZSIgMT4mNgorZWxzZQorICB0Y2xzaF9uYW1lPSJ0Y2xzaDguMCI7IGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR0Y2xzaF9uYW1lIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkdGNsc2hfbmFtZTsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfdmlfY3ZfcGF0aF90Y2wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkdmlfY3ZfcGF0aF90Y2wiIGluCisgIC8qKQorICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsPSIkdmlfY3ZfcGF0aF90Y2wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3RjbD0iJHZpX2N2X3BhdGhfdGNsIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZmkKK3ZpX2N2X3BhdGhfdGNsPSIkYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3RjbCIKK2lmIHRlc3QgLW4gIiR2aV9jdl9wYXRoX3RjbCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiR2aV9jdl9wYXRoX3RjbCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgCisKKyAgICBpZiB0ZXN0ICJYJHZpX2N2X3BhdGhfdGNsIiA9ICJYIiAtYSAkdGNsc2hfbmFtZSA9ICJ0Y2xzaDguMCI7IHRoZW4KKyAgICB0Y2xzaF9uYW1lPSJ0Y2xzaDguMiIKKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR0Y2xzaF9uYW1lIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkdGNsc2hfbmFtZTsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDI5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfdmlfY3ZfcGF0aF90Y2wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkdmlfY3ZfcGF0aF90Y2wiIGluCisgIC8qKQorICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsPSIkdmlfY3ZfcGF0aF90Y2wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3RjbD0iJHZpX2N2X3BhdGhfdGNsIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZmkKK3ZpX2N2X3BhdGhfdGNsPSIkYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3RjbCIKK2lmIHRlc3QgLW4gIiR2aV9jdl9wYXRoX3RjbCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiR2aV9jdl9wYXRoX3RjbCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgZmkKKyAgICBpZiB0ZXN0ICJYJHZpX2N2X3BhdGhfdGNsIiA9ICJYIjsgdGhlbgorICAgIHRjbHNoX25hbWU9InRjbHNoIgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHRjbHNoX25hbWUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR0Y2xzaF9uYW1lOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3RjbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiR2aV9jdl9wYXRoX3RjbCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF90Y2w9IiR2aV9jdl9wYXRoX3RjbCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsPSIkdmlfY3ZfcGF0aF90Y2wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfdmlfY3ZfcGF0aF90Y2w9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitmaQordmlfY3ZfcGF0aF90Y2w9IiRhY19jdl9wYXRoX3ZpX2N2X3BhdGhfdGNsIgoraWYgdGVzdCAtbiAiJHZpX2N2X3BhdGhfdGNsIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJHZpX2N2X3BhdGhfdGNsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBmaQorICBpZiB0ZXN0ICJYJHZpX2N2X3BhdGhfdGNsIiAhPSAiWCI7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBUY2wgdmVyc2lvbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEwMjogY2hlY2tpbmcgVGNsIHZlcnNpb24iID4mNQorICAgIGlmIGVjaG8gJ2V4aXQgW2V4cHIgW2luZm8gdGNsdmVyc2lvbl0gPCA4LjBdJyB8ICR2aV9jdl9wYXRoX3RjbCAtIDsgdGhlbgorICAgICAgdGNsdmVyPWBlY2hvICdwdXRzIFtpbmZvIHRjbHZlcnNpb25dJyB8ICR2aV9jdl9wYXRoX3RjbCAtYAorICAgICAgZWNobyAiJGFjX3QiIiR0Y2x2ZXIgLSBPSyIgMT4mNjsKKyAgICAgIHRjbGxvYz1gZWNobyAnc2V0IGwgW2luZm8gbGlicmFyeV07c2V0IGkgW3N0cmluZyBsYXN0IGxpYiAkbF07aW5jciBpIC0yO3B1dHMgW3N0cmluZyByYW5nZSAkbCAwICRpXScgfCAkdmlfY3ZfcGF0aF90Y2wgLWAKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvY2F0aW9uIG9mIFRjbCBpbmNsdWRlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTA5OiBjaGVja2luZyBmb3IgbG9jYXRpb24gb2YgVGNsIGluY2x1ZGUiID4mNQorICAgICAgaWYgdGVzdCAieCRNQUNPU1giICE9ICJ4eWVzIjsgdGhlbgorCXRjbGluYz0iJHRjbGxvYy9pbmNsdWRlICR0Y2xsb2MvaW5jbHVkZS90Y2wgJHRjbGxvYy9pbmNsdWRlL3RjbCR0Y2x2ZXIgL3Vzci9sb2NhbC9pbmNsdWRlIgorICAgICAgZWxzZQorCQl0Y2xpbmM9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1RjbC5mcmFtZXdvcmsvSGVhZGVycyIKKyAgICAgIGZpCisgICAgICBmb3IgdHJ5IGluICR0Y2xpbmM7IGRvCisJaWYgdGVzdCAtZiAiJHRyeS90Y2wuaCI7IHRoZW4KKwkgIGVjaG8gIiRhY190IiIkdHJ5L3RjbC5oIiAxPiY2CisJICBUQ0xfSU5DPSR0cnkKKwkgIGJyZWFrCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgLXogIiRUQ0xfSU5DIjsgdGhlbgorCWVjaG8gIiRhY190IiI8bm90IGZvdW5kPiIgMT4mNgorCVNLSVBfVENMPVlFUworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLXogIiRTS0lQX1RDTCI7IHRoZW4KKwllY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9jYXRpb24gb2YgdGNsQ29uZmlnLnNoIHNjcmlwdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEyODogY2hlY2tpbmcgZm9yIGxvY2F0aW9uIG9mIHRjbENvbmZpZy5zaCBzY3JpcHQiID4mNQorCWlmIHRlc3QgIngkTUFDT1NYIiAhPSAieHllcyI7IHRoZW4KKwkgIHRjbGNuZj1gZWNobyAkdGNsaW5jIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKKwllbHNlCisJICAJICB0Y2xjbmY9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1RjbC5mcmFtZXdvcmsiCisJZmkKKwlmb3IgdHJ5IGluICR0Y2xjbmY7IGRvCisJICBpZiB0ZXN0IC1mICR0cnkvdGNsQ29uZmlnLnNoOyB0aGVuCisJICAgIGVjaG8gIiRhY190IiIkdHJ5L3RjbENvbmZpZy5zaCIgMT4mNgorCSAgICAuICR0cnkvdGNsQ29uZmlnLnNoCisJICAgIAkgICAgVENMX0xJQlM9YGV2YWwgZWNobyAiJFRDTF9MSUJfU1BFQyAkVENMX0xJQlMiYAorCSAgICAJICAgIAkgICAgVENMX0RFRlM9YGVjaG8gJFRDTF9ERUZTIHwgdHIgJyAnICdcMDEyJyB8IHNlZCAtZSAnL14tW15EXS9kJyAtZSAnLy1EW15fXS9kJyAtZSAncy8tRF8vIC1EXy8nIHwgdHIgLWQgJ1wwMTInYAorCSAgICBicmVhaworCSAgZmkKKwlkb25lCisJaWYgdGVzdCAteiAiJFRDTF9MSUJTIjsgdGhlbgorCSAgZWNobyAiJGFjX3QiIjxub3QgZm91bmQ+IiAxPiY2CisJICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgVGNsIGxpYnJhcnkgYnkgbXlzZWxmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTQ2OiBjaGVja2luZyBmb3IgVGNsIGxpYnJhcnkgYnkgbXlzZWxmIiA+JjUKKwkgIHRjbGxpYj1gZWNobyAkdGNsaW5jIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKKwkgIGZvciBleHQgaW4gLnNvIC5hIDsgZG8KKwkgICAgZm9yIHZlciBpbiAiIiAkdGNsdmVyIDsgZG8KKwkgICAgICBmb3IgdHJ5IGluICR0Y2xsaWIgOyBkbworCQl0cnlsaWI9dGNsJHZlciRleHQKKwkJaWYgdGVzdCAtZiAkdHJ5L2xpYiR0cnlsaWIgOyB0aGVuCisJCSAgZWNobyAiJGFjX3QiIiR0cnkvbGliJHRyeWxpYiIgMT4mNgorCQkgIFRDTF9MSUJTPSItTCR0cnkgLWx0Y2wkdmVyIC1sZGwgLWxtIgorCQkgIGlmIHRlc3QgImAodW5hbWUpIDI+L2Rldi9udWxsYCIgPSBTdW5PUyAmJgorCQkJCQkgdW5hbWUgLXIgfCBncmVwICdeNScgPi9kZXYvbnVsbDsgdGhlbgorCQkgICAgVENMX0xJQlM9IiRUQ0xfTElCUyAtUiAkdHJ5IgorCQkgIGZpCisJCSAgYnJlYWsgMworCQlmaQorCSAgICAgIGRvbmUKKwkgICAgZG9uZQorCSAgZG9uZQorCSAgaWYgdGVzdCAteiAiJFRDTF9MSUJTIjsgdGhlbgorCSAgICBlY2hvICIkYWNfdCIiPG5vdCBmb3VuZD4iIDE+JjYKKwkgICAgU0tJUF9UQ0w9WUVTCisJICBmaQorCWZpCisJaWYgdGVzdCAteiAiJFNLSVBfVENMIjsgdGhlbgorCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfVENMIDEKK0VPRgorCisJICBUQ0xfU1JDPWlmX3RjbC5jCisJICBUQ0xfT0JKPW9iamVjdHMvaWZfdGNsLm8KKwkgIFRDTF9QUk89aWZfdGNsLnBybworCSAgVENMX0NGTEFHUz0iLUkkVENMX0lOQyAkVENMX0RFRlMiCisJZmkKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiJGFjX3QiInRvbyBvbGQ7IG5lZWQgVGNsIHZlcnNpb24gOC4wIG9yIGxhdGVyIiAxPiY2CisgICAgZmkKKyAgZmkKK2ZpCisKKworCisKKworCitlY2hvICRhY19uICJjaGVja2luZyAtLWVuYWJsZS1ydWJ5aW50ZXJwIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTkyOiBjaGVja2luZyAtLWVuYWJsZS1ydWJ5aW50ZXJwIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ydWJ5aW50ZXJwIG9yIC0tZGlzYWJsZS1ydWJ5aW50ZXJwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3J1YnlpbnRlcnArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3J1YnlpbnRlcnAiCisgIDoKK2Vsc2UKKyAgZW5hYmxlX3J1YnlpbnRlcnA9Im5vIgorZmkKKworZWNobyAiJGFjX3QiIiRlbmFibGVfcnVieWludGVycCIgMT4mNgoraWYgdGVzdCAiJGVuYWJsZV9ydWJ5aW50ZXJwIiA9ICJ5ZXMiOyB0aGVuCisgIAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJ1YnkiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJ1Ynk7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX3ZpX2N2X3BhdGhfcnVieScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiR2aV9jdl9wYXRoX3J1YnkiIGluCisgIC8qKQorICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfcnVieT0iJHZpX2N2X3BhdGhfcnVieSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX3ZpX2N2X3BhdGhfcnVieT0iJHZpX2N2X3BhdGhfcnVieSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3J1Ynk9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitmaQordmlfY3ZfcGF0aF9ydWJ5PSIkYWNfY3ZfcGF0aF92aV9jdl9wYXRoX3J1YnkiCitpZiB0ZXN0IC1uICIkdmlfY3ZfcGF0aF9ydWJ5IjsgdGhlbgorICBlY2hvICIkYWNfdCIiJHZpX2N2X3BhdGhfcnVieSIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAiWCR2aV9jdl9wYXRoX3J1YnkiICE9ICJYIjsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIFJ1YnkgdmVyc2lvbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI0MTogY2hlY2tpbmcgUnVieSB2ZXJzaW9uIiA+JjUKKyAgICBpZiAkdmlfY3ZfcGF0aF9ydWJ5IC1lICdWRVJTSU9OID49ICIxLjYuMCIgb3IgZXhpdCAxJyA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICBlY2hvICIkYWNfdCIiT0siIDE+JjYKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIFJ1YnkgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjQ1OiBjaGVja2luZyBSdWJ5IGhlYWRlciBmaWxlcyIgPiY1CisgICAgICBydWJ5aGRyZGlyPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIG1rbWYgLWUgJ3ByaW50IENvbmZpZzo6Q09ORklHWyJhcmNoZGlyIl0gfHwgJGhkcmRpcicgMj4vZGV2L251bGxgCisgICAgICBpZiB0ZXN0ICJYJHJ1YnloZHJkaXIiICE9ICJYIjsgdGhlbgorCWVjaG8gIiRhY190IiIkcnVieWhkcmRpciIgMT4mNgorCVJVQllfQ0ZMQUdTPSItSSRydWJ5aGRyZGlyIgorCXJ1YnlsaWJzPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICdwcmludCBDb25maWc6OkNPTkZJR1siTElCUyJdJ2AKKwlpZiB0ZXN0ICJYJHJ1YnlsaWJzIiAhPSAiWCI7IHRoZW4KKwkgIFJVQllfTElCUz0iJHJ1YnlsaWJzIgorCWZpCisJbGlicnVieWFyZz1gJHZpX2N2X3BhdGhfcnVieSAtciByYmNvbmZpZyAtZSAncHJpbnQgQ29uZmlnLmV4cGFuZChDb25maWc6OkNPTkZJR1siTElCUlVCWUFSRyJdKSdgCisJaWYgdGVzdCAtZiAiJHJ1YnloZHJkaXIvJGxpYnJ1YnlhcmciOyB0aGVuCisJICBsaWJydWJ5YXJnPSIkcnVieWhkcmRpci8kbGlicnVieWFyZyIKKwllbHNlCisJICBydWJ5bGliZGlyPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICdwcmludCBDb25maWcuZXhwYW5kKENvbmZpZzo6Q09ORklHWyJsaWJkaXIiXSknYAorCSAgaWYgdGVzdCAtZiAiJHJ1YnlsaWJkaXIvJGxpYnJ1YnlhcmciOyB0aGVuCisJICAgIGxpYnJ1Ynlhcmc9IiRydWJ5bGliZGlyLyRsaWJydWJ5YXJnIgorCSAgZWxpZiB0ZXN0ICIkbGlicnVieWFyZyIgPSAibGlicnVieS5hIjsgdGhlbgorCSAgICAJICAgIGxpYnJ1Ynlhcmc9Ii1scnVieSIKKwkgIGVsc2UKKwkgICAgbGlicnVieWFyZz1gJHZpX2N2X3BhdGhfcnVieSAtciByYmNvbmZpZyAtZSAicHJpbnQgJyRsaWJydWJ5YXJnJy5nc3ViKC8tTFwuLywgJSctTCN7Q29uZmlnLmV4cGFuZChDb25maWc6OkNPTkZJR1tcImxpYmRpclwiXSl9JykiYAorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRsaWJydWJ5YXJnIiAhPSAiWCI7IHRoZW4KKwkgIFJVQllfTElCUz0iJGxpYnJ1YnlhcmcgJFJVQllfTElCUyIKKwlmaQorCXJ1YnlsZGZsYWdzPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICdwcmludCBDb25maWc6OkNPTkZJR1siTERGTEFHUyJdJ2AKKwlpZiB0ZXN0ICJYJHJ1YnlsZGZsYWdzIiAhPSAiWCI7IHRoZW4KKwkgIExERkxBR1M9IiRydWJ5bGRmbGFncyAkTERGTEFHUyIKKwlmaQorCVJVQllfU1JDPSJpZl9ydWJ5LmMiCisJUlVCWV9PQko9Im9iamVjdHMvaWZfcnVieS5vIgorCVJVQllfUFJPPSJpZl9ydWJ5LnBybyIKKwljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9SVUJZIDEKK0VPRgorCisgICAgICBlbHNlCisJZWNobyAiJGFjX3QiIm5vdCBmb3VuZCIgMT4mNgorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCIidG9vIG9sZDsgbmVlZCBSdWJ5IHZlcnNpb24gMS42LjAgb3IgbGF0ZXIiIDE+JjYKKyAgICBmaQorICBmaQorZmkKKworCisKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZW5hYmxlLWNzY29wZSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI5NzogY2hlY2tpbmcgLS1lbmFibGUtY3Njb3BlIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jc2NvcGUgb3IgLS1kaXNhYmxlLWNzY29wZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jc2NvcGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2NzY29wZSIKKyAgOgorZWxzZQorICBlbmFibGVfY3Njb3BlPSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX2NzY29wZSIgMT4mNgoraWYgdGVzdCAiJGVuYWJsZV9jc2NvcGUiID0gInllcyI7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfQ1NDT1BFIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyAtLWVuYWJsZS13b3Jrc2hvcCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMxNTogY2hlY2tpbmcgLS1lbmFibGUtd29ya3Nob3AgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXdvcmtzaG9wIG9yIC0tZGlzYWJsZS13b3Jrc2hvcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV93b3Jrc2hvcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfd29ya3Nob3AiCisgIDoKK2Vsc2UKKyAgZW5hYmxlX3dvcmtzaG9wPSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX3dvcmtzaG9wIiAxPiY2CitpZiB0ZXN0ICIkZW5hYmxlX3dvcmtzaG9wIiA9ICJ5ZXMiOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBGRUFUX1NVTl9XT1JLU0hPUCAxCitFT0YKKworICBXT1JLU0hPUF9TUkM9IndvcmtzaG9wLmMgaW50ZWdyYXRpb24uYyIKKyAgCisgIFdPUktTSE9QX09CSj0ib2JqZWN0cy93b3Jrc2hvcC5vIG9iamVjdHMvaW50ZWdyYXRpb24ubyIKKyAgCisgIGlmIHRlc3QgIiR7ZW5hYmxlX2d1aS14eHh9IiA9IHh4eDsgdGhlbgorICAgIGVuYWJsZV9ndWk9bW90aWYKKyAgZmkKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZGlzYWJsZS1uZXRiZWFucyBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM0MDogY2hlY2tpbmcgLS1kaXNhYmxlLW5ldGJlYW5zIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uZXRiZWFucyBvciAtLWRpc2FibGUtbmV0YmVhbnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmV0YmVhbnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25ldGJlYW5zIgorICA6CitlbHNlCisgIGVuYWJsZV9uZXRiZWFucz0ieWVzIgorZmkKKworaWYgdGVzdCAiJGVuYWJsZV9uZXRiZWFucyIgPSAieWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzUyOiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nc29ja2V0IHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc29ja2V0KCk7CisKK2ludCBtYWluKCkgeworc29ja2V0KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzk5OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CithY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sbnNsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0MDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lKCk7CisKK2ludCBtYWluKCkgeworZ2V0aG9zdGJ5bmFtZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbnNsICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBuZXRiZWFucyBpbnRlZ3JhdGlvbiBpcyBwb3NzaWJsZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ0NjogY2hlY2tpbmcgd2hldGhlciBjb21waWxpbmcgbmV0YmVhbnMgaW50ZWdyYXRpb24gaXMgcG9zc2libGUiID4mNQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkvKiBDaGVjayBiaXRmaWVsZHMgKi8KKwlzdHJ1Y3QgbmJidWYgeworCXVuc2lnbmVkIGludCAgaW5pdERvbmU6MTsKKwl1c2hvcnQgc2lnbm1hcGxlbjsKKwl9OworCSAgICAKK2ludCBtYWluKCkgeworCisJCS8qIENoZWNrIGNyZWF0aW5nIGEgc29ja2V0LiAqLworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyOworCQkodm9pZClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCQkodm9pZClodG9ucygxMDApOworCQkodm9pZClnZXRob3N0YnluYW1lKCJtaWNyb3NvZnQuY29tIik7CisJCWlmIChlcnJubyA9PSBFQ09OTlJFRlVTRUQpCisJCSAgKHZvaWQpY29ubmVjdCgxLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlciwgc2l6ZW9mKHNlcnZlcikpOworCSAgICAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsgZW5hYmxlX25ldGJlYW5zPSJubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2Vsc2UKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZmkKK2lmIHRlc3QgIiRlbmFibGVfbmV0YmVhbnMiID0gInllcyI7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfTkVUQkVBTlNfSU5URyAxCitFT0YKKworICBORVRCRUFOU19TUkM9Im5ldGJlYW5zLmMiCisgIAorICBORVRCRUFOU19PQko9Im9iamVjdHMvbmV0YmVhbnMubyIKKyAgCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyAtLWVuYWJsZS1zbmlmZiBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUwMzogY2hlY2tpbmcgLS1lbmFibGUtc25pZmYgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNuaWZmIG9yIC0tZGlzYWJsZS1zbmlmZiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zbmlmZitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc25pZmYiCisgIDoKK2Vsc2UKKyAgZW5hYmxlX3NuaWZmPSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX3NuaWZmIiAxPiY2CitpZiB0ZXN0ICIkZW5hYmxlX3NuaWZmIiA9ICJ5ZXMiOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBGRUFUX1NOSUZGIDEKK0VPRgorCisgIFNOSUZGX1NSQz0iaWZfc25pZmYuYyIKKyAgCisgIFNOSUZGX09CSj0ib2JqZWN0cy9pZl9zbmlmZi5vIgorICAKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZW5hYmxlLW11bHRpYnl0ZSBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyNTogY2hlY2tpbmcgLS1lbmFibGUtbXVsdGlieXRlIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tdWx0aWJ5dGUgb3IgLS1kaXNhYmxlLW11bHRpYnl0ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tdWx0aWJ5dGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX211bHRpYnl0ZSIKKyAgOgorZWxzZQorICBlbmFibGVfbXVsdGlieXRlPSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX211bHRpYnl0ZSIgMT4mNgoraWYgdGVzdCAiJGVuYWJsZV9tdWx0aWJ5dGUiID0gInllcyI7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfTUJZVEUgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZW5hYmxlLWhhbmd1bGlucHV0IGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTQzOiBjaGVja2luZyAtLWVuYWJsZS1oYW5ndWxpbnB1dCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaGFuZ3VsaW5wdXQgb3IgLS1kaXNhYmxlLWhhbmd1bGlucHV0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2hhbmd1bGlucHV0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9oYW5ndWxpbnB1dCIKKyAgOgorZWxzZQorICBlbmFibGVfaGFuZ3VsaW5wdXQ9Im5vIgorZmkKKworZWNobyAiJGFjX3QiIiRlbmFibGVfaGFuZ3VsaW5wdXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1lbmFibGUteGltIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTU1OiBjaGVja2luZyAtLWVuYWJsZS14aW0gYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXhpbSBvciAtLWRpc2FibGUteGltIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3hpbStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfeGltIgorICBlY2hvICIkYWNfdCIiJGVuYWJsZV94aW0iIDE+JjYKK2Vsc2UKKyAgZW5hYmxlX3hpbT0iYXV0byI7IGVjaG8gIiRhY190IiJkZWZhdWx0aW5nIHRvIGF1dG8iIDE+JjYKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1lbmFibGUtZm9udHNldCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjU2NjogY2hlY2tpbmcgLS1lbmFibGUtZm9udHNldCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZm9udHNldCBvciAtLWRpc2FibGUtZm9udHNldCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mb250c2V0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9mb250c2V0IgorICA6CitlbHNlCisgIGVuYWJsZV9mb250c2V0PSJubyIKK2ZpCisKK2VjaG8gIiRhY190IiIkZW5hYmxlX2ZvbnRzZXQiIDE+JjYKKwordGVzdCAteiAiJHdpdGhfeCIgJiYgd2l0aF94PXllcwordGVzdCAiJHtlbmFibGVfZ3VpLXllc30iICE9IG5vIC1hICJ4JE1BQ09TWCIgIT0gInh5ZXMiIC1hICJ4JFFOWCIgIT0gInh5ZXMiICYmIHdpdGhfeD15ZXMKK2lmIHRlc3QgIiR3aXRoX3giID0gbm87IHRoZW4KKyAgZWNobyAiJGFjX3QiImRlZmF1bHRpbmcgdG86IGRvbid0IEhBVkVfWDExIiAxPiY2CitlbHNlCisgIAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhta21mIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4bWttZjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfeG1rbWZwYXRoJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJHhta21mcGF0aCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfeG1rbWZwYXRoPSIkeG1rbWZwYXRoIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfeG1rbWZwYXRoPSIkeG1rbWZwYXRoIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX3hta21mcGF0aD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2ZpCit4bWttZnBhdGg9IiRhY19jdl9wYXRoX3hta21mcGF0aCIKK2lmIHRlc3QgLW4gIiR4bWttZnBhdGgiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkeG1rbWZwYXRoIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisgICMgSWYgd2UgZmluZCBYLCBzZXQgc2hlbGwgdmFycyB4X2luY2x1ZGVzIGFuZCB4X2xpYnJhcmllcyB0byB0aGUKKyMgcGF0aHMsIG90aGVyd2lzZSBzZXQgbm9feD15ZXMuCisjIFVzZXMgYWNfIHZhcnMgYXMgdGVtcHMgdG8gYWxsb3cgY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIGNhY2hlIGFuZCBjaGVja3MuCisjIC0td2l0aG91dC14IG92ZXJyaWRlcyBldmVyeXRoaW5nIGVsc2UsIGJ1dCBkb2VzIG5vdCB0b3VjaCB0aGUgY2FjaGUuCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgWCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYyNDogY2hlY2tpbmcgZm9yIFgiID4mNQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfeCIKKyAgOgorZmkKKworIyAkaGF2ZV94IGlzIGB5ZXMnLCBgbm8nLCBgZGlzYWJsZWQnLCBvciBlbXB0eSB3aGVuIHdlIGRvIG5vdCB5ZXQga25vdy4KK2lmIHRlc3QgIngkd2l0aF94IiA9IHhubzsgdGhlbgorICAjIFRoZSB1c2VyIGV4cGxpY2l0bHkgZGlzYWJsZWQgWC4KKyAgaGF2ZV94PWRpc2FibGVkCitlbHNlCisgIGlmIHRlc3QgIngkeF9pbmNsdWRlcyIgIT0geE5PTkUgJiYgdGVzdCAieCR4X2xpYnJhcmllcyIgIT0geE5PTkU7IHRoZW4KKyAgICAjIEJvdGggdmFyaWFibGVzIGFyZSBhbHJlYWR5IHNldC4KKyAgICBoYXZlX3g9eWVzCisgIGVsc2UKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oYXZlX3gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIE9uZSBvciBib3RoIG9mIHRoZSB2YXJzIGFyZSBub3Qgc2V0LCBhbmQgdGhlcmUgaXMgbm8gY2FjaGVkIHZhbHVlLgorYWNfeF9pbmNsdWRlcz1OTyBhY194X2xpYnJhcmllcz1OTworcm0gLWZyIGNvbmZ0ZXN0ZGlyCitpZiBta2RpciBjb25mdGVzdGRpcjsgdGhlbgorICBjZCBjb25mdGVzdGRpcgorICAjIE1ha2Ugc3VyZSB0byBub3QgcHV0ICJtYWtlIiBpbiB0aGUgSW1ha2VmaWxlIHJ1bGVzLCBzaW5jZSB3ZSBncmVwIGl0IG91dC4KKyAgY2F0ID4gSW1ha2VmaWxlIDw8J0VPRicKK2FjZmluZHg6CisJQGVjaG8gJ2FjX2ltX2luY3Jvb3Q9IiR7SU5DUk9PVH0iOyBhY19pbV91c3JsaWJkaXI9IiR7VVNSTElCRElSfSI7IGFjX2ltX2xpYmRpcj0iJHtMSUJESVJ9IicKK0VPRgorICBpZiAoeG1rbWYpID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgorICAgICMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorICAgIGV2YWwgYCR7TUFLRS1tYWtlfSBhY2ZpbmR4IDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBtYWtlYAorICAgICMgT3BlbiBXaW5kb3dzIHhta21mIHJlcG9ydGVkbHkgc2V0cyBMSUJESVIgaW5zdGVhZCBvZiBVU1JMSUJESVIuCisgICAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsOyBkbworICAgICAgaWYgdGVzdCAhIC1mICRhY19pbV91c3JsaWJkaXIvbGliWDExLiRhY19leHRlbnNpb24gJiYKKyAgICAgICAgdGVzdCAtZiAkYWNfaW1fbGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uOyB0aGVuCisgICAgICAgIGFjX2ltX3VzcmxpYmRpcj0kYWNfaW1fbGliZGlyOyBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgIyBTY3JlZW4gb3V0IGJvZ3VzIHZhbHVlcyBmcm9tIHRoZSBpbWFrZSBjb25maWd1cmF0aW9uLiAgVGhleSBhcmUKKyAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCisgICAgIyB1c2luZyB0aGVtIHdvdWxkIGJyZWFrIGdjYyBvbiBzeXN0ZW1zIHdoZXJlIGl0IG5lZWRzIGZpeGVkIGluY2x1ZGVzLgorICAgIGNhc2UgIiRhY19pbV9pbmNyb290IiBpbgorCS91c3IvaW5jbHVkZSkgOzsKKwkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9IiRhY19pbV9pbmNyb290IiA7OworICAgIGVzYWMKKyAgICBjYXNlICIkYWNfaW1fdXNybGliZGlyIiBpbgorCS91c3IvbGliIHwgL2xpYikgOzsKKwkqKSB0ZXN0IC1kICIkYWNfaW1fdXNybGliZGlyIiAmJiBhY194X2xpYnJhcmllcz0iJGFjX2ltX3VzcmxpYmRpciIgOzsKKyAgICBlc2FjCisgIGZpCisgIGNkIC4uCisgIHJtIC1mciBjb25mdGVzdGRpcgorZmkKKworaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gTk87IHRoZW4KKyAgIyBHdWVzcyB3aGVyZSB0byBmaW5kIGluY2x1ZGUgZmlsZXMsIGJ5IGxvb2tpbmcgZm9yIHRoaXMgb25lIFgxMSAuaCBmaWxlLgorICB0ZXN0IC16ICIkeF9kaXJlY3RfdGVzdF9pbmNsdWRlIiAmJiB4X2RpcmVjdF90ZXN0X2luY2x1ZGU9WDExL0ludHJpbnNpYy5oCisKKyAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2ODYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCR4X2RpcmVjdF90ZXN0X2luY2x1ZGU+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2OTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgICMgV2UgY2FuIGNvbXBpbGUgdXNpbmcgWCBoZWFkZXJzIHdpdGggbm8gc3BlY2lhbCBpbmNsdWRlIGRpcmVjdG9yeS4KK2FjX3hfaW5jbHVkZXM9CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAjIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZSBpbiBhIHN0YW5kYXJkIHNldCBvZiBjb21tb24gZGlyZWN0b3JpZXMuCisjIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KKyAgZm9yIGFjX2RpciBpbiAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL1gxMS9pbmNsdWRlICAgICAgICAgIFwKKyAgICAvdXNyL1gxMVI2L2luY2x1ZGUgICAgICAgIFwKKyAgICAvdXNyL1gxMVI1L2luY2x1ZGUgICAgICAgIFwKKyAgICAvdXNyL1gxMVI0L2luY2x1ZGUgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2luY2x1ZGUvWDExICAgICAgICAgIFwKKyAgICAvdXNyL2luY2x1ZGUvWDExUjYgICAgICAgIFwKKyAgICAvdXNyL2luY2x1ZGUvWDExUjUgICAgICAgIFwKKyAgICAvdXNyL2luY2x1ZGUvWDExUjQgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xvY2FsL1gxMS9pbmNsdWRlICAgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI2L2luY2x1ZGUgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI1L2luY2x1ZGUgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI0L2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUvWDExICAgIFwKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUvWDExUjYgIFwKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUvWDExUjUgIFwKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUvWDExUjQgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL1gzODYvaW5jbHVkZSAgICAgICAgIFwKKyAgICAvdXNyL3gzODYvaW5jbHVkZSAgICAgICAgIFwKKyAgICAvdXNyL1hGcmVlODYvaW5jbHVkZS9YMTEgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2luY2x1ZGUgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUgICAgICAgIFwKKyAgICAvdXNyL3Vuc3VwcG9ydGVkL2luY2x1ZGUgIFwKKyAgICAvdXNyL2F0aGVuYS9pbmNsdWRlICAgICAgIFwKKyAgICAvdXNyL2xvY2FsL3gxMXI1L2luY2x1ZGUgIFwKKyAgICAvdXNyL2xwcC9YYW1wbGVzL2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL29wZW53aW4vaW5jbHVkZSAgICAgIFwKKyAgICAvdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZSBcCisgICAgOyBcCisgIGRvCisgICAgaWYgdGVzdCAtciAiJGFjX2Rpci8keF9kaXJlY3RfdGVzdF9pbmNsdWRlIjsgdGhlbgorICAgICAgYWNfeF9pbmNsdWRlcz0kYWNfZGlyCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpICMgJGFjX3hfaW5jbHVkZXMgPSBOTworCitpZiB0ZXN0ICIkYWNfeF9saWJyYXJpZXMiID0gTk87IHRoZW4KKyAgIyBDaGVjayBmb3IgdGhlIGxpYnJhcmllcy4KKworICB0ZXN0IC16ICIkeF9kaXJlY3RfdGVzdF9saWJyYXJ5IiAmJiB4X2RpcmVjdF90ZXN0X2xpYnJhcnk9WHQKKyAgdGVzdCAteiAiJHhfZGlyZWN0X3Rlc3RfZnVuY3Rpb24iICYmIHhfZGlyZWN0X3Rlc3RfZnVuY3Rpb249WHRNYWxsb2MKKworICAjIFNlZSBpZiB3ZSBmaW5kIHRoZW0gd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zLgorICAjIERvbid0IGFkZCB0byAkTElCUyBwZXJtYW5lbnRseS4KKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjc2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworJHt4X2RpcmVjdF90ZXN0X2Z1bmN0aW9ufSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgorYWNfeF9saWJyYXJpZXM9CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIExJQlM9IiRhY19zYXZlX0xJQlMiCisjIEZpcnN0IHNlZSBpZiByZXBsYWNpbmcgdGhlIGluY2x1ZGUgYnkgbGliIHdvcmtzLgorIyBDaGVjayBYMTEgYmVmb3JlIFgxMVJuIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBzeW1saW5rIHRvIHRoZSBjdXJyZW50IHJlbGVhc2UuCitmb3IgYWNfZGlyIGluIGBlY2hvICIkYWNfeF9pbmNsdWRlcyIgfCBzZWQgcy9pbmNsdWRlL2xpYi9gIFwKKyAgICAvdXNyL1gxMS9saWIgICAgICAgICAgXAorICAgIC91c3IvWDExUjYvbGliICAgICAgICBcCisgICAgL3Vzci9YMTFSNS9saWIgICAgICAgIFwKKyAgICAvdXNyL1gxMVI0L2xpYiAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9saWIvWDExICAgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTFSNiAgICAgICAgXAorICAgIC91c3IvbGliL1gxMVI1ICAgICAgICBcCisgICAgL3Vzci9saWIvWDExUjQgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvWDExL2xpYiAgICBcCisgICAgL3Vzci9sb2NhbC9YMTFSNi9saWIgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI1L2xpYiAgXAorICAgIC91c3IvbG9jYWwvWDExUjQvbGliICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xvY2FsL2xpYi9YMTEgICAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMVI2ICBcCisgICAgL3Vzci9sb2NhbC9saWIvWDExUjUgIFwKKyAgICAvdXNyL2xvY2FsL2xpYi9YMTFSNCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9YMzg2L2xpYiAgICAgICAgIFwKKyAgICAvdXNyL3gzODYvbGliICAgICAgICAgXAorICAgIC91c3IvWEZyZWU4Ni9saWIvWDExICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xpYiAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvbGliICAgICAgICBcCisgICAgL3Vzci91bnN1cHBvcnRlZC9saWIgIFwKKyAgICAvdXNyL2F0aGVuYS9saWIgICAgICAgXAorICAgIC91c3IvbG9jYWwveDExcjUvbGliICBcCisgICAgL3Vzci9scHAvWGFtcGxlcy9saWIgIFwKKyAgICAvbGliL3Vzci9saWIvWDExCSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9vcGVud2luL2xpYiAgICAgIFwKKyAgICAvdXNyL29wZW53aW4vc2hhcmUvbGliIFwKKyAgICA7IFwKK2RvCisgIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbDsgZG8KKyAgICBpZiB0ZXN0IC1yICRhY19kaXIvbGliJHt4X2RpcmVjdF90ZXN0X2xpYnJhcnl9LiRhY19leHRlbnNpb247IHRoZW4KKyAgICAgIGFjX3hfbGlicmFyaWVzPSRhY19kaXIKKyAgICAgIGJyZWFrIDIKKyAgICBmaQorICBkb25lCitkb25lCitmaQorcm0gLWYgY29uZnRlc3QqCitmaSAjICRhY194X2xpYnJhcmllcyA9IE5PCisKK2lmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IE5PIHx8IHRlc3QgIiRhY194X2xpYnJhcmllcyIgPSBOTzsgdGhlbgorICAjIERpZG4ndCBmaW5kIFggYW55d2hlcmUuICBDYWNoZSB0aGUga25vd24gYWJzZW5jZSBvZiBYLgorICBhY19jdl9oYXZlX3g9ImhhdmVfeD1ubyIKK2Vsc2UKKyAgIyBSZWNvcmQgd2hlcmUgd2UgZm91bmQgWCBmb3IgdGhlIGNhY2hlLgorICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXMgXAorCSAgICAgICAgYWNfeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcyBhY194X2xpYnJhcmllcz0kYWNfeF9saWJyYXJpZXMiCitmaQorZmkKKyAgZmkKKyAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKK2ZpICMgJHdpdGhfeCAhPSBubworCitpZiB0ZXN0ICIkaGF2ZV94IiAhPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRoYXZlX3giIDE+JjYKKyAgbm9feD15ZXMKK2Vsc2UKKyAgIyBJZiBlYWNoIG9mIHRoZSB2YWx1ZXMgd2FzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGl0IG92ZXJyaWRlcyBlYWNoIGd1ZXNzLgorICB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcworICB0ZXN0ICJ4JHhfbGlicmFyaWVzIiA9IHhOT05FICYmIHhfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcworICAjIFVwZGF0ZSB0aGUgY2FjaGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgY29tbWFuZCBsaW5lIHZhbHVlcy4KKyAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzIFwKKwkJYWNfeF9pbmNsdWRlcz0keF9pbmNsdWRlcyBhY194X2xpYnJhcmllcz0keF9saWJyYXJpZXMiCisgIGVjaG8gIiRhY190IiJsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiAxPiY2CitmaQorCitpZiB0ZXN0ICIkbm9feCIgPSB5ZXM7IHRoZW4KKyAgIyBOb3QgYWxsIHByb2dyYW1zIG1heSB1c2UgdGhpcyBzeW1ib2wsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvIGRlZmluZSBpdC4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFhfRElTUExBWV9NSVNTSU5HIDEKK0VPRgorCisgIFhfQ0ZMQUdTPSBYX1BSRV9MSUJTPSBYX0xJQlM9IFhfRVhUUkFfTElCUz0KK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJHhfaW5jbHVkZXMiOyB0aGVuCisgICAgWF9DRkxBR1M9IiRYX0NGTEFHUyAtSSR4X2luY2x1ZGVzIgorICBmaQorCisgICMgSXQgd291bGQgYWxzbyBiZSBuaWNlIHRvIGRvIHRoaXMgZm9yIGFsbCAtTCBvcHRpb25zLCBub3QganVzdCB0aGlzIG9uZS4KKyAgaWYgdGVzdCAtbiAiJHhfbGlicmFyaWVzIjsgdGhlbgorICAgIFhfTElCUz0iJFhfTElCUyAtTCR4X2xpYnJhcmllcyIKKyAgICAjIEZvciBTb2xhcmlzOyBzb21lIHZlcnNpb25zIG9mIFN1biBDQyByZXF1aXJlIGEgc3BhY2UgYWZ0ZXIgLVIgYW5kCisgICAgIyBvdGhlcnMgcmVxdWlyZSBubyBzcGFjZS4gIFdvcmRzIGFyZSBub3Qgc3VmZmljaWVudCAuIC4gLiAuCisgICAgY2FzZSAiYCh1bmFtZSAtc3IpIDI+L2Rldi9udWxsYCIgaW4KKyAgICAiU3VuT1MgNSIqKQorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4NzM6IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKKyAgICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCisgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODgzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19SX25vc3BhY2U9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX1Jfbm9zcGFjZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgICAgaWYgdGVzdCAkYWNfUl9ub3NwYWNlID0geWVzOyB0aGVuCisJZWNobyAiJGFjX3QiIm5vIiAxPiY2CisJWF9MSUJTPSIkWF9MSUJTIC1SJHhfbGlicmFyaWVzIgorICAgICAgZWxzZQorCUxJQlM9IiRhY194c2F2ZV9MSUJTIC1SICR4X2xpYnJhcmllcyIKKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19SX3NwYWNlPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19SX3NwYWNlPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisJaWYgdGVzdCAkYWNfUl9zcGFjZSA9IHllczsgdGhlbgorCSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorCSAgWF9MSUJTPSIkWF9MSUJTIC1SICR4X2xpYnJhcmllcyIKKwllbHNlCisJICBlY2hvICIkYWNfdCIibmVpdGhlciB3b3JrcyIgMT4mNgorCWZpCisgICAgICBmaQorICAgICAgTElCUz0iJGFjX3hzYXZlX0xJQlMiCisgICAgZXNhYworICBmaQorCisgICMgQ2hlY2sgZm9yIHN5c3RlbS1kZXBlbmRlbnQgbGlicmFyaWVzIFggcHJvZ3JhbXMgbXVzdCBsaW5rIHdpdGguCisgICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCisgICMgKC1sSUNFKSwgc2luY2Ugd2UgbWF5IG5lZWQgLWxzb2NrZXQgb3Igd2hhdGV2ZXIgZm9yIFggbGlua2luZy4KKworICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgorICAgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbF9zIC1saW5ldCIKKyAgZWxzZQorICAgICMgTWFydHluLkpvaG5zb25AY2wuY2FtLmFjLnVrIHNheXMgdGhpcyBpcyBuZWVkZWQgZm9yIFVsdHJpeCwgaWYgdGhlIFgKKyAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQga2FybEBjcy51bWIuZWR1IHNheXMKKyAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTM4OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1CithY19saWJfdmFyPWBlY2hvIGRuZXQnXydkbmV0X250b2EgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZG5ldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTQ2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZG5ldF9udG9hKCk7CisKK2ludCBtYWluKCkgeworZG5ldF9udG9hKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbmV0IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk3OTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CithY19saWJfdmFyPWBlY2hvIGRuZXRfc3R1YidfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRuZXRfbnRvYSgpOworCitpbnQgbWFpbigpIHsKK2RuZXRfbnRvYSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sZG5ldF9zdHViIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBmaQorCisgICAgIyBtc2hAY2lzLnVmbC5lZHUgc2F5cyAtbG5zbCAoYW5kIC1sc29ja2V0KSBhcmUgbmVlZGVkIGZvciBoaXMgMzg2L0FULAorICAgICMgdG8gZ2V0IHRoZSBTeXNWIHRyYW5zcG9ydCBmdW5jdGlvbnMuCisgICAgIyBjaGFkQGFuYXNhemkuY29tIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQorICAgICMgbmVlZHMgLWxuc2wuCisgICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKKyAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gZGlja2V5QGNsYXJrLm5ldC4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzAyNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgZ2V0aG9zdGJ5bmFtZSgpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9nZXRob3N0YnluYW1lKSB8fCBkZWZpbmVkIChfX3N0dWJfX19nZXRob3N0YnluYW1lKQorY2hva2UgbWUKKyNlbHNlCitnZXRob3N0YnluYW1lKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ2dldGhvc3RieW5hbWVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgOgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNzY6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxuc2wgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA4NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUoKTsKKworaW50IG1haW4oKSB7CitnZXRob3N0YnluYW1lKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2wiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGZpCisKKyAgICAjIGxpZWRlckBza3lsZXIubWF2ZC5ob25leXdlbGwuY29tIHNheXMgd2l0aG91dCAtbHNvY2tldCwKKyAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKKyAgICAjIDIuMC4gIEJ1dCAtbHNvY2tldCBpcyBicm9rZW4gb24gSVJJWCA1LjIgKGFuZCBpcyBub3QgbmVjZXNzYXJ5CisgICAgIyBvbiBsYXRlciB2ZXJzaW9ucyksIHNheXMgc2ltb25AbGlhLmRpLmVwZmwuY2g6IGl0IGNvbnRhaW5zCisgICAgIyBnZXRob3N0YnkqIHZhcmlhbnRzIHRoYXQgZG9uJ3QgdXNlIHRoZSBuYW1lc2VydmVyIChvciBzb21ldGhpbmcpLgorICAgICMgLWxzb2NrZXQgbXVzdCBiZSBnaXZlbiBiZWZvcmUgLWxuc2wgaWYgYm90aCBhcmUgbmVlZGVkLgorICAgICMgV2UgYXNzdW1lIHRoYXQgaWYgY29ubmVjdCBuZWVkcyAtbG5zbCwgc28gZG9lcyBnZXRob3N0YnluYW1lLgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjb25uZWN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTI1OiBjaGVja2luZyBmb3IgY29ubmVjdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19jb25uZWN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzEzMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBjb25uZWN0KCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgY29ubmVjdCgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2Nvbm5lY3QpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Nvbm5lY3QpCitjaG9rZSBtZQorI2Vsc2UKK2Nvbm5lY3QoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE1MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nY29ubmVjdGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE3NDogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydjb25uZWN0IHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzE4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGNvbm5lY3QoKTsKKworaW50IG1haW4oKSB7Citjb25uZWN0KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGZpCisKKyAgICAjIGdvbWV6QG1pLnVuaS1lcmxhbmdlbi5kZSBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzIxNzogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19yZW1vdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHJlbW92ZSgpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHJlbW92ZSgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX3JlbW92ZSkgfHwgZGVmaW5lZCAoX19zdHViX19fcmVtb3ZlKQorY2hva2UgbWUKKyNlbHNlCityZW1vdmUoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19yZW1vdmU9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3JlbW92ZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3JlbW92ZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI2NjogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gcG9zaXgnXydyZW1vdmUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1scG9zaXggICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzI3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHJlbW92ZSgpOworCitpbnQgbWFpbigpIHsKK3JlbW92ZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1scG9zaXgiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGZpCisKKyAgICAjIEJTREkgQlNEL09TIDIuMSBuZWVkcyAtbGlwYyBmb3IgWE9wZW5EaXNwbGF5LgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG1hdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMwOTogY2hlY2tpbmcgZm9yIHNobWF0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobWF0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzMxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaG1hdCgpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHNobWF0KCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2htYXQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobWF0KQorY2hva2UgbWUKKyNlbHNlCitzaG1hdCgpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzM3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3NobWF0PXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19zaG1hdD1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3NobWF0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19zaG1hdCA9IG5vOyB0aGVuCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNTg6IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1CithY19saWJfdmFyPWBlY2hvIGlwYydfJ3NobWF0IHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGlwYyAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2htYXQoKTsKKworaW50IG1haW4oKSB7CitzaG1hdCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1saXBjIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBmaQorICBmaQorCisgICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgorICBhY19zYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICB0ZXN0IC1uICIkeF9saWJyYXJpZXMiICYmIExERkxBR1M9IiRMREZMQUdTIC1MJHhfbGlicmFyaWVzIgorICAjIFNNIG5lZWRzIElDRSB0byAoZHluYW1pY2FsbHkpIGxpbmsgdW5kZXIgU3VuT1MgNC54IChzbyB3ZSBoYXZlIHRvCisgICMgY2hlY2sgZm9yIElDRSBmaXJzdCksIGJ1dCB3ZSBtdXN0IGxpbmsgaW4gdGhlIG9yZGVyIC1sU00gLWxJQ0Ugb3IKKyAgIyB3ZSBnZXQgdW5kZWZpbmVkIHN5bWJvbHMuICBTbyBhc3N1bWUgd2UgaGF2ZSBTTSBpZiB3ZSBoYXZlIElDRS4KKyAgIyBUaGVzZSBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGJlZm9yZSAtbFgxMSwgdW5saWtlIHRoZSBvdGhlcgorICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KKyAgIyAgLS1pbnRlcnJhbkB1bHVydS5TdGFuZm9yZC5FRFUsIGtiQGNzLnVtYi5lZHUuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDEwOiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CithY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZUNvbm5lY3Rpb25OdW1iZXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sSUNFICRYX0VYVFJBX0xJQlMgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgSWNlQ29ubmVjdGlvbk51bWJlcigpOworCitpbnQgbWFpbigpIHsKK0ljZUNvbm5lY3Rpb25OdW1iZXIoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sU00gLWxJQ0UiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBMREZMQUdTPSIkYWNfc2F2ZV9MREZMQUdTIgorCitmaQorCisKKyAgICAgICAgaWYgdGVzdCAiJE9TMzkwVW5peCIgPSAieWVzIjsgdGhlbgorICAgIENGTEFHUz0iJENGTEFHUyAtVyBjLGRsbCIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAtVyBsLGRsbCIKKyAgICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxTTSAtbElDRSAtbFhtdSIKKyAgZmkKKworICAgIAorICBpZiB0ZXN0IC1kICIkeF9pbmNsdWRlcyIgJiYgdGVzdCAhIC1kICIkeF9saWJyYXJpZXMiOyB0aGVuCisgICAgeF9saWJyYXJpZXM9YGVjaG8gIiR4X2luY2x1ZGVzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2AKKyAgICBlY2hvICIkYWNfdCIiQ29ycmVjdGVkIFggbGlicmFyaWVzIHRvICR4X2xpYnJhcmllcyIgMT4mNgorICAgIFhfTElCUz0iJFhfTElCUyAtTCR4X2xpYnJhcmllcyIKKyAgICBpZiB0ZXN0ICJgKHVuYW1lKSAyPi9kZXYvbnVsbGAiID0gU3VuT1MgJiYKKwkJCQkJIHVuYW1lIC1yIHwgZ3JlcCAnXjUnID4vZGV2L251bGw7IHRoZW4KKyAgICAgIFhfTElCUz0iJFhfTElCUyAtUiAkeF9saWJyYXJpZXMiCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1kICIkeF9saWJyYXJpZXMiICYmIHRlc3QgISAtZCAiJHhfaW5jbHVkZXMiOyB0aGVuCisgICAgeF9pbmNsdWRlcz1gZWNobyAiJHhfbGlicmFyaWVzIiB8IHNlZCBzL2xpYi9pbmNsdWRlL2AKKyAgICBlY2hvICIkYWNfdCIiQ29ycmVjdGVkIFggaW5jbHVkZXMgdG8gJHhfaW5jbHVkZXMiIDE+JjYKKyAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCisgIGZpCisKKyAgICBYX0NGTEFHUz0iYGVjaG8gJFhfQ0ZMQUdTXCAgfCBzZWQgJ3MlLUkvdXNyL2luY2x1ZGUgJSUnYCIKKyAgICBYX0xJQlM9ImBlY2hvICRYX0xJQlNcICB8IHNlZCAncyUtTC91c3IvbGliICUlJ2AiCisgICAgWF9MSUJTPSJgZWNobyAkWF9MSUJTXCAgfCBzZWQgLWUgJ3MlLVIvdXNyL2xpYiAlJScgLWUgJ3MlLVIgL3Vzci9saWIgJSUnYCIKKworCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBpZiBYMTEgaGVhZGVyIGZpbGVzIGNhbiBiZSBmb3VuZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQ4MzogY2hlY2tpbmcgaWYgWDExIGhlYWRlciBmaWxlcyBjYW4gYmUgZm91bmQiID4mNQorICBjZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM0ODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0OTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsgbm9feD15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorCisgIGlmIHRlc3QgIiR7bm9feC1ub30iID0geWVzOyB0aGVuCisgICAgd2l0aF94PW5vCisgIGVsc2UKKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9YMTEgMQorRU9GCisKKyAgICBYX0xJQj0iLWxYdCAtbFgxMSI7CisgICAgCisKKyAgICBhY19zYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIExERkxBR1M9Ii1MJHhfbGlicmFyaWVzICRMREZMQUdTIgorCisgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX1hkbWNwQXV0aERvSXQgaW4gLWxYZG1jcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzUyMDogY2hlY2tpbmcgZm9yIF9YZG1jcEF1dGhEb0l0IGluIC1sWGRtY3AiID4mNQorYWNfbGliX3Zhcj1gZWNobyBYZG1jcCdfJ19YZG1jcEF1dGhEb0l0IHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbFhkbWNwIC1sWHQgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAtbFhkbWNwICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzUyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIF9YZG1jcEF1dGhEb0l0KCk7CisKK2ludCBtYWluKCkgeworX1hkbWNwQXV0aERvSXQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbFhkbWNwIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworICAgICAgICAgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSWNlT3BlbkNvbm5lY3Rpb24gaW4gLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1NjE6IGNoZWNraW5nIGZvciBJY2VPcGVuQ29ubmVjdGlvbiBpbiAtbElDRSIgPiY1CithY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZU9wZW5Db25uZWN0aW9uIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbElDRSAkWF9FWFRSQV9MSUJTICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzU2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIEljZU9wZW5Db25uZWN0aW9uKCk7CisKK2ludCBtYWluKCkgeworSWNlT3BlbkNvbm5lY3Rpb24oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbFNNIC1sSUNFIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworICAgICAgICBMREZMQUdTPSIkWF9MSUJTICRhY19zYXZlX0xERkxBR1MiCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhIGluIC1sWHBtIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjAzOiBjaGVja2luZyBmb3IgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEgaW4gLWxYcG0iID4mNQorYWNfbGliX3Zhcj1gZWNobyBYcG0nXydYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxYcG0gLWxYdCAkWF9QUkVfTElCUyAtbFhwbSAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzYxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhKCk7CisKK2ludCBtYWluKCkgeworWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sWHBtIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBpZiBYMTEgaGVhZGVyIGZpbGVzIGltcGxpY2l0bHkgZGVjbGFyZSByZXR1cm4gdmFsdWVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjQ0OiBjaGVja2luZyBpZiBYMTEgaGVhZGVyIGZpbGVzIGltcGxpY2l0bHkgZGVjbGFyZSByZXR1cm4gdmFsdWVzIiA+JjUKKyAgICBjZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRYX0NGTEFHUyAtV2Vycm9yIgorICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2NDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8taW1wbGljaXQtaW50IgorCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2NjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjZmxhZ3Nfc2F2ZT0iJGNmbGFnc19zYXZlIC1Xbm8taW1wbGljaXQtaW50IgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIidGVzdCBmYWlsZWQiIDE+JjYKKwkKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgICBDRkxBR1M9JGNmbGFnc19zYXZlCisKKyAgICBMREZMQUdTPSIkYWNfc2F2ZV9MREZMQUdTIgorCisgIGZpCitmaQorCit0ZXN0ICJ4JHdpdGhfeCIgPSB4bm8gLWEgIngkQkVPUyIgIT0gInh5ZXMiIC1hICJ4JE1BQ09TWCIgIT0gInh5ZXMiIC1hICJ4JFFOWCIgIT0gInh5ZXMiICYmIGVuYWJsZV9ndWk9bm8KKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1lbmFibGUtZ3VpIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjk1OiBjaGVja2luZyAtLWVuYWJsZS1ndWkgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWd1aSBvciAtLWRpc2FibGUtZ3VpIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2d1aStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZ3VpIgorICA6CitlbHNlCisgIGVuYWJsZV9ndWk9ImF1dG8iCitmaQorCisKK2VuYWJsZV9ndWlfY2Fub249YGVjaG8gIl8kZW5hYmxlX2d1aSIgfCBcCisJc2VkICdzL1sgXystXS8vZzt5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCisKK1NLSVBfR1RLPVlFUworU0tJUF9HVEsyPVlFUworU0tJUF9HTk9NRT1ZRVMKK1NLSVBfTU9USUY9WUVTCitTS0lQX0FUSEVOQT1ZRVMKK1NLSVBfTkVYVEFXPVlFUworU0tJUF9QSE9UT049WUVTCitTS0lQX0JFT1M9WUVTCitTS0lQX0NBUkJPTj1ZRVMKK0dVSVRZUEU9Tk9ORQorCitpZiB0ZXN0ICJ4JEJFT1MiID0gInh5ZXMiOyB0aGVuCisgIFNLSVBfQkVPUz0KKyAgY2FzZSAiJGVuYWJsZV9ndWlfY2Fub24iIGluCisgICAgbm8pCQllY2hvICIkYWNfdCIibm8gR1VJIHN1cHBvcnQiIDE+JjYKKwkJU0tJUF9CRU9TPVlFUyA7OworICAgIHllc3wiIikJZWNobyAiJGFjX3QiInllcyAtIGF1dG9tYXRpYyBHVUkgc3VwcG9ydCIgMT4mNiA7OworICAgIGF1dG8pCWVjaG8gIiRhY190IiJhdXRvIC0gYXV0b21hdGljIEdVSSBzdXBwb3J0IiAxPiY2IDs7CisgICAgYmVvcykJZWNobyAiJGFjX3QiIkJlT1MgR1VJIHN1cHBvcnQiIDE+JjYgOzsKKyAgICAqKQkJZWNobyAiJGFjX3QiIlNvcnJ5LCAkZW5hYmxlX2d1aSBHVUkgaXMgbm90IHN1cHBvcnRlZCIgMT4mNgorCQlTS0lQX0JFT1M9WUVTIDs7CisgIGVzYWMKKworZWxpZiB0ZXN0ICJ4JFFOWCIgPSAieHllcyIgLWEgIngkd2l0aF94IiA9ICJ4bm8iIDsgdGhlbgorICBTS0lQX1BIT1RPTj0KKyAgY2FzZSAiJGVuYWJsZV9ndWlfY2Fub24iIGluCisgICAgbm8pCQllY2hvICIkYWNfdCIibm8gR1VJIHN1cHBvcnQiIDE+JjYKKwkJU0tJUF9QSE9UT049WUVTIDs7CisgICAgeWVzfCIiKQllY2hvICIkYWNfdCIieWVzIC0gYXV0b21hdGljIEdVSSBzdXBwb3J0IiAxPiY2IDs7CisgICAgYXV0bykJZWNobyAiJGFjX3QiImF1dG8gLSBhdXRvbWF0aWMgR1VJIHN1cHBvcnQiIDE+JjYgOzsKKyAgICBwaG90b24pCWVjaG8gIiRhY190IiJQaG90b24gR1VJIHN1cHBvcnQiIDE+JjYgOzsKKyAgICAqKQkJZWNobyAiJGFjX3QiIlNvcnJ5LCAkZW5hYmxlX2d1aSBHVUkgaXMgbm90IHN1cHBvcnRlZCIgMT4mNgorCQlTS0lQX1BIT1RPTj1ZRVMgOzsKKyAgZXNhYworCitlbGlmIHRlc3QgIngkTUFDT1NYIiA9ICJ4eWVzIiAtYSAieCR3aXRoX3giID0gInhubyIgOyB0aGVuCisgIFNLSVBfQ0FSQk9OPQorICBjYXNlICIkZW5hYmxlX2d1aV9jYW5vbiIgaW4KKyAgICBubykJCWVjaG8gIiRhY190IiJubyBHVUkgc3VwcG9ydCIgMT4mNgorCQlTS0lQX0NBUkJPTj1ZRVMgOzsKKyAgICB5ZXN8IiIpCWVjaG8gIiRhY190IiJ5ZXMgLSBhdXRvbWF0aWMgR1VJIHN1cHBvcnQiIDE+JjYgOzsKKyAgICBhdXRvKQllY2hvICIkYWNfdCIiYXV0byAtIGF1dG9tYXRpYyBHVUkgc3VwcG9ydCIgMT4mNiA7OworICAgIGNhcmJvbikJZWNobyAiJGFjX3QiIkNhcmJvbiBHVUkgc3VwcG9ydCIgMT4mNiA7OworICAgICopCQllY2hvICIkYWNfdCIiU29ycnksICRlbmFibGVfZ3VpIEdVSSBpcyBub3Qgc3VwcG9ydGVkIiAxPiY2CisJCVNLSVBfQ0FSQk9OPVlFUyA7OworICBlc2FjCisKK2Vsc2UKKworCisgIGNhc2UgIiRlbmFibGVfZ3VpX2Nhbm9uIiBpbgorICAgIG5vfG5vbmUpCWVjaG8gIiRhY190IiJubyBHVUkgc3VwcG9ydCIgMT4mNiA7OworICAgIHllc3wiInxhdXRvKQllY2hvICIkYWNfdCIieWVzL2F1dG8gLSBhdXRvbWF0aWMgR1VJIHN1cHBvcnQiIDE+JjYKKwkJU0tJUF9HVEs9CisJCVNLSVBfR1RLMj0KKwkJU0tJUF9HTk9NRT0KKwkJU0tJUF9NT1RJRj0KKwkJU0tJUF9BVEhFTkE9CisJCVNLSVBfTkVYVEFXPQorCQlTS0lQX0NBUkJPTj07OworICAgIGd0aykJZWNobyAiJGFjX3QiIkdUSysgMS54IEdVSSBzdXBwb3J0IiAxPiY2CisJCVNLSVBfR1RLPTs7CisgICAgZ3RrMikJZWNobyAiJGFjX3QiIkdUSysgMi54IEdVSSBzdXBwb3J0IiAxPiY2CisJCVNLSVBfR1RLPQorCQlTS0lQX0dUSzI9OzsKKyAgICBnbm9tZSkJZWNobyAiJGFjX3QiIkdOT01FIDEueCBHVUkgc3VwcG9ydCIgMT4mNgorCQlTS0lQX0dOT01FPQorCQlTS0lQX0dUSz07OworICAgIGdub21lMikJZWNobyAiJGFjX3QiIkdOT01FIDIueCBHVUkgc3VwcG9ydCIgMT4mNgorCQlTS0lQX0dOT01FPQorCQlTS0lQX0dUSz0KKwkJU0tJUF9HVEsyPTs7CisgICAgbW90aWYpCWVjaG8gIiRhY190IiJNb3RpZiBHVUkgc3VwcG9ydCIgMT4mNgorCQlTS0lQX01PVElGPTs7CisgICAgYXRoZW5hKQllY2hvICIkYWNfdCIiQXRoZW5hIEdVSSBzdXBwb3J0IiAxPiY2CisJCVNLSVBfQVRIRU5BPTs7CisgICAgbmV4dGF3KQllY2hvICIkYWNfdCIibmVYdGF3IEdVSSBzdXBwb3J0IiAxPiY2CisJCVNLSVBfTkVYVEFXPTs7CisgICAgKikJCWVjaG8gIiRhY190IiJTb3JyeSwgJGVuYWJsZV9ndWkgR1VJIGlzIG5vdCBzdXBwb3J0ZWQiIDE+JjYgOzsKKyAgZXNhYworCitmaQorCitpZiB0ZXN0ICJ4JFNLSVBfR1RLIiAhPSAieFlFUyIgLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ3RrIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJndGsyIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBHVEsiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3OTM6IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIEdUSyIgPiY1CisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ndGstY2hlY2sgb3IgLS1kaXNhYmxlLWd0ay1jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ndGtfY2hlY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2d0a19jaGVjayIKKyAgOgorZWxzZQorICBlbmFibGVfZ3RrX2NoZWNrPSJ5ZXMiCitmaQorCisgIGVjaG8gIiRhY190IiIkZW5hYmxlX2d0a19jaGVjayIgMT4mNgorICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGtfY2hlY2siID0gInhubyI7IHRoZW4KKyAgICBTS0lQX0dUSz1ZRVMKKyAgICBTS0lQX0dOT01FPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX0dUSzIiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJndGsyIiBcCisJCQkJLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ25vbWUyIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBHVEsrIDIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4MTI6IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIEdUSysgMiIgPiY1CisgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ndGsyLWNoZWNrIG9yIC0tZGlzYWJsZS1ndGsyLWNoZWNrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2d0azJfY2hlY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2d0azJfY2hlY2siCisgIDoKK2Vsc2UKKyAgZW5hYmxlX2d0azJfY2hlY2s9InllcyIKK2ZpCisKKyAgZWNobyAiJGFjX3QiIiRlbmFibGVfZ3RrMl9jaGVjayIgMT4mNgorICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGsyX2NoZWNrIiA9ICJ4bm8iOyB0aGVuCisgICAgU0tJUF9HVEsyPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX0dOT01FIiAhPSAieFlFUyIgLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ25vbWUiIFwKKwkJCQkgLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ25vbWUyIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBHTk9NRSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzgzMDogY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgR05PTUUiID4mNQorICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZ25vbWUtY2hlY2sgb3IgLS1kaXNhYmxlLWdub21lLWNoZWNrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2dub21lX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9nbm9tZV9jaGVjayIKKyAgOgorZWxzZQorICBlbmFibGVfZ25vbWVfY2hlY2s9Im5vIgorZmkKKworICBlY2hvICIkYWNfdCIiJGVuYWJsZV9nbm9tZV9jaGVjayIgMT4mNgorICBpZiB0ZXN0ICJ4JGVuYWJsZV9nbm9tZV9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfR05PTUU9WUVTCisgIGZpCitmaQorCitpZiB0ZXN0ICJ4JFNLSVBfTU9USUYiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJtb3RpZiI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgTW90aWYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4NDc6IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIE1vdGlmIiA+JjUKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vdGlmLWNoZWNrIG9yIC0tZGlzYWJsZS1tb3RpZi1jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tb3RpZl9jaGVjaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbW90aWZfY2hlY2siCisgIDoKK2Vsc2UKKyAgZW5hYmxlX21vdGlmX2NoZWNrPSJ5ZXMiCitmaQorCisgIGVjaG8gIiRhY190IiIkZW5hYmxlX21vdGlmX2NoZWNrIiAxPiY2CisgIGlmIHRlc3QgIngkZW5hYmxlX21vdGlmX2NoZWNrIiA9ICJ4bm8iOyB0aGVuCisgICAgU0tJUF9NT1RJRj1ZRVMKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIngkU0tJUF9BVEhFTkEiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJhdGhlbmEiOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIEF0aGVuYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzg2NDogY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgQXRoZW5hIiA+JjUKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWF0aGVuYS1jaGVjayBvciAtLWRpc2FibGUtYXRoZW5hLWNoZWNrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2F0aGVuYV9jaGVjaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfYXRoZW5hX2NoZWNrIgorICA6CitlbHNlCisgIGVuYWJsZV9hdGhlbmFfY2hlY2s9InllcyIKK2ZpCisKKyAgZWNobyAiJGFjX3QiIiRlbmFibGVfYXRoZW5hX2NoZWNrIiAxPiY2CisgIGlmIHRlc3QgIngkZW5hYmxlX2F0aGVuYV9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfQVRIRU5BPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX05FWFRBVyIgIT0gInhZRVMiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gIm5leHRhdyI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgbmVYdGF3IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODgxOiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBuZVh0YXciID4mNQorICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmV4dGF3LWNoZWNrIG9yIC0tZGlzYWJsZS1uZXh0YXctY2hlY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmV4dGF3X2NoZWNrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9uZXh0YXdfY2hlY2siCisgIDoKK2Vsc2UKKyAgZW5hYmxlX25leHRhd19jaGVjaz0ieWVzIgorZmkKKworICBlY2hvICIkYWNfdCIiJGVuYWJsZV9uZXh0YXdfY2hlY2siIDE+JjY7CisgIGlmIHRlc3QgIngkZW5hYmxlX25leHRhd19jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfTkVYVEFXPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX0NBUkJPTiIgIT0gInhZRVMiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gImNhcmJvbiI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgQ2FyYm9uIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODk4OiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBDYXJib24iID4mNQorICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2FyYm9uLWNoZWNrIG9yIC0tZGlzYWJsZS1jYXJib24tY2hlY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY2FyYm9uX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9jYXJib25fY2hlY2siCisgIDoKK2Vsc2UKKyAgZW5hYmxlX2NhcmJvbl9jaGVjaz0ieWVzIgorZmkKKworICBlY2hvICIkYWNfdCIiJGVuYWJsZV9jYXJib25fY2hlY2siIDE+JjY7CisgIGlmIHRlc3QgIngkZW5hYmxlX2NhcmJvbl9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfQ0FSQk9OPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRNQUNPU1giID0gInh5ZXMiIC1hIC16ICIkU0tJUF9DQVJCT04iIC1hICJ4JENBUkJPTiIgPSAieHllcyI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIENhcmJvbiBHVUkiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5MTU6IGNoZWNraW5nIGZvciBDYXJib24gR1VJIiA+JjUKKyAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OworICBHVUlUWVBFPUNBUkJPTkdVSQorICAgIFNLSVBfR1RLPVlFUzsKKyAgU0tJUF9HVEsyPVlFUzsKKyAgU0tJUF9HTk9NRT1ZRVM7CisgIFNLSVBfTU9USUY9WUVTOworICBTS0lQX0FUSEVOQT1ZRVM7CisgIFNLSVBfTkVYVEFXPVlFUzsKKyAgU0tJUF9QSE9UT049WUVTOworICBTS0lQX0JFT1M9WUVTOworICBTS0lQX0NBUkJPTj1ZRVMKK2ZpCisKKworCisKKworCisKKworCisKK2lmIHRlc3QgLXogIiRTS0lQX0dUSyI7IHRoZW4KKworICBlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtZ3RrLXByZWZpeCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk0MTogY2hlY2tpbmcgLS13aXRoLWd0ay1wcmVmaXggYXJndW1lbnQiID4mNQorICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWd0ay1wcmVmaXggb3IgLS13aXRob3V0LWd0ay1wcmVmaXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2d0a19wcmVmaXgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ3RrX3ByZWZpeCIKKyAgZ3RrX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIjsgZWNobyAiJGFjX3QiIiRndGtfY29uZmlnX3ByZWZpeCIgMT4mNgorZWxzZQorICBndGtfY29uZmlnX3ByZWZpeD0iIjsgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgLS13aXRoLWd0ay1leGVjLXByZWZpeCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk1MjogY2hlY2tpbmcgLS13aXRoLWd0ay1leGVjLXByZWZpeCBhcmd1bWVudCIgPiY1CisgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4IG9yIC0td2l0aG91dC1ndGstZXhlYy1wcmVmaXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2d0a19leGVjX3ByZWZpeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9ndGtfZXhlY19wcmVmaXgiCisgIGd0a19jb25maWdfZXhlY19wcmVmaXg9IiR3aXRodmFsIjsgZWNobyAiJGFjX3QiIiRndGtfY29uZmlnX3ByZWZpeCIgMT4mNgorZWxzZQorICBndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIiOyBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworICBlY2hvICRhY19uICJjaGVja2luZyAtLWRpc2FibGUtZ3RrdGVzdCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk2MzogY2hlY2tpbmcgLS1kaXNhYmxlLWd0a3Rlc3QgYXJndW1lbnQiID4mNQorICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZ3RrdGVzdCBvciAtLWRpc2FibGUtZ3RrdGVzdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ndGt0ZXN0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ndGt0ZXN0IgorICA6CitlbHNlCisgIGVuYWJsZV9ndGt0ZXN0PXllcworZmkKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGt0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBlY2hvICIkYWNfdCIiZ3RrIHRlc3QgZW5hYmxlZCIgMT4mNgorICBlbHNlCisgICAgZWNobyAiJGFjX3QiImd0ayB0ZXN0IGRpc2FibGVkIiAxPiY2CisgIGZpCisKKyAgaWYgdGVzdCAieCRndGtfY29uZmlnX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIGd0a19jb25maWdfYXJncz0iJGd0a19jb25maWdfYXJncyAtLXByZWZpeD0kZ3RrX2NvbmZpZ19wcmVmaXgiCisgICAgR1RLX0NPTkZJRz0kZ3RrX2NvbmZpZ19wcmVmaXgvYmluL2d0ay1jb25maWcKKyAgZmkKKyAgaWYgdGVzdCAieCRndGtfY29uZmlnX2V4ZWNfcHJlZml4IiAhPSAieCIgOyB0aGVuCisgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGd0a19jb25maWdfZXhlY19wcmVmaXgiCisgICAgR1RLX0NPTkZJRz0kZ3RrX2NvbmZpZ19leGVjX3ByZWZpeC9iaW4vZ3RrLWNvbmZpZworICBmaQorICBpZiB0ZXN0ICJYJEdUS19DT05GSUciID0gIlgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJndGstY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBndGstY29uZmlnOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HVEtfQ09ORklHJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdUS19DT05GSUciIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dUS19DT05GSUc9IiRHVEtfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR1RLX0NPTkZJRz0iJEdUS19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR1RLX0NPTkZJRz0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1RLX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9HVEtfQ09ORklHPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitHVEtfQ09ORklHPSIkYWNfY3ZfcGF0aF9HVEtfQ09ORklHIgoraWYgdGVzdCAtbiAiJEdUS19DT05GSUciOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR1RLX0NPTkZJRyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBpZiB0ZXN0ICJYJEdUS19DT05GSUciID0gIlhubyI7IHRoZW4KKyAgICAgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ3RrMTItY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBndGsxMi1jb25maWc7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDAyNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dUSzEyX0NPTkZJRycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHVEsxMl9DT05GSUciIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dUSzEyX0NPTkZJRz0iJEdUSzEyX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dUSzEyX0NPTkZJRz0iJEdUSzEyX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HVEsxMl9DT05GSUc9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dUSzEyX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9HVEsxMl9DT05GSUc9Im5vIgorICA7OworZXNhYworZmkKK0dUSzEyX0NPTkZJRz0iJGFjX2N2X3BhdGhfR1RLMTJfQ09ORklHIgoraWYgdGVzdCAtbiAiJEdUSzEyX0NPTkZJRyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHVEsxMl9DT05GSUciIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICBHVEtfQ09ORklHPSIkR1RLMTJfQ09ORklHIgorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCIiVXNpbmcgR1RLIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbSAkR1RLX0NPTkZJRyIgMT4mNgorICBmaQorICBpZiB0ZXN0ICJYJFBLR19DT05GSUciID0gIlgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwa2ctY29uZmlnOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwNjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9QS0dfQ09ORklHJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFBLR19DT05GSUciIGluCisgIC8qKQorICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRQS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyIgJiYgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUEtHX0NPTkZJRyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgZmkKKworICBpZiB0ZXN0ICJ4JEdUS19DT05GSUc6JFBLR19DT05GSUciICE9ICJ4bm86bm8iOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0ICJYJFNLSVBfR1RLMiIgIT0gIlhZRVMiOyB0aGVuCisgICAgICAKKyAgaWYgdGVzdCAiWCRHVEtfQ09ORklHIiAhPSAiWG5vIiAtbyAiWCRQS0dfQ09ORklHIiAhPSAiWG5vIjsgdGhlbgorICB7CisgICAgbWluX2d0a192ZXJzaW9uPTIuMi4wCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdUSyAtIHZlcnNpb24gPj0gJG1pbl9ndGtfdmVyc2lvbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDExMTogY2hlY2tpbmcgZm9yIEdUSyAtIHZlcnNpb24gPj0gJG1pbl9ndGtfdmVyc2lvbiIgPiY1CisgICAgbm9fZ3RrPSIiCisgICAgaWYgKHRlc3QgIlgkU0tJUF9HVEsyIiAhPSAiWFlFUyIgLWEgIlgkUEtHX0NPTkZJRyIgIT0gIlhubyIpIFwKKwkgICYmICRQS0dfQ09ORklHIC0tZXhpc3RzIGd0aystMi4wOyB0aGVuCisgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgZ3RrKy0yLjBgCisgICAgICBHVEtfTElCUz1gJFBLR19DT05GSUcgLS1saWJzIGd0aystMi4wYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRQS0dfQ09ORklHIC0tbW9kdmVyc2lvbiBndGsrLTIuMCB8IFwKKwkgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wxLydgCisgICAgICBndGtfbWlub3JfdmVyc2lvbj1gJFBLR19DT05GSUcgLS1tb2R2ZXJzaW9uIGd0aystMi4wIHwgXAorCSAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDIvJ2AKKyAgICAgIGd0a19taWNyb192ZXJzaW9uPWAkUEtHX0NPTkZJRyAtLW1vZHZlcnNpb24gZ3RrKy0yLjAgfCBcCisJICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMy8nYAorICAgIH0KKyAgICBlbGlmIHRlc3QgIlgkR1RLX0NPTkZJRyIgIT0gIlhubyI7IHRoZW4KKyAgICB7CisgICAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgICAgR1RLX0xJQlM9YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorCSAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDEvJ2AKKyAgICAgIGd0a19taW5vcl92ZXJzaW9uPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKwkgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wyLydgCisgICAgICBndGtfbWljcm9fdmVyc2lvbj1gJEdUS19DT05GSUcgJGd0a19jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisJICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMy8nYAorICAgIH0KKyAgICBlbHNlCisgICAgICBub19ndGs9eWVzCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkZW5hYmxlX2d0a3Rlc3QiID0gInh5ZXMiIC1hICJ4JG5vX2d0ayIgPSAieCI7IHRoZW4KKyAgICB7CisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICBMSUJTPSIkTElCUyAkR1RLX0xJQlMiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtIC1mIGNvbmYuZ3RrdGVzdAorICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MTUyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKCkKK3sKK2ludCBtYWpvciwgbWlub3IsIG1pY3JvOworY2hhciAqdG1wX3ZlcnNpb247CisKK3N5c3RlbSAoInRvdWNoIGNvbmYuZ3RrdGVzdCIpOworCisvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KK3RtcF92ZXJzaW9uID0gZ19zdHJkdXAoIiRtaW5fZ3RrX3ZlcnNpb24iKTsKK2lmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgIGV4aXQoMSk7CisgfQorCitpZiAoKGd0a19tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICgoZ3RrX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmIChndGtfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYKKwkJCQkgICAgIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQoreworICAgIHJldHVybiAwOworfQorcmV0dXJuIDE7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTg0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgbm9fZ3RrPXllcworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKKyAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICB9CisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vX2d0ayIgPSB4IDsgdGhlbgorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZ3RrdGVzdCIgPSAieHllcyI7IHRoZW4KKwllY2hvICIkYWNfdCIieWVzOyBmb3VuZCB2ZXJzaW9uICRndGtfbWFqb3JfdmVyc2lvbi4kZ3RrX21pbm9yX3ZlcnNpb24uJGd0a19taWNyb192ZXJzaW9uIiAxPiY2CisgICAgICBlbHNlCisJZWNobyAiJGFjX3QiImZvdW5kIHZlcnNpb24gJGd0a19tYWpvcl92ZXJzaW9uLiRndGtfbWlub3JfdmVyc2lvbi4kZ3RrX21pY3JvX3ZlcnNpb24iIDE+JjYKKyAgICAgIGZpCisgICAgICBHVEtfTElCTkFNRT0iJEdUS19MSUJTIgorCQkgIEdVSV9JTkNfTE9DPSIkR1RLX0NGTEFHUyIKKyAgICBlbHNlCisgICAgeworICAgICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgICBHVEtfTElCUz0iIgorICAgICAgOgorICAgIH0KKyAgICBmaQorICB9CisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPSIiCisgICAgR1RLX0xJQlM9IiIKKyAgICA6CisgIGZpCisgIAorICAKKyAgcm0gLWYgY29uZi5ndGt0ZXN0CisKKyAgICAgIGlmIHRlc3QgIngkR1RLX0NGTEFHUyIgIT0gIngiOyB0aGVuCisJU0tJUF9BVEhFTkE9WUVTCisJU0tJUF9ORVhUQVc9WUVTCisJU0tJUF9NT1RJRj1ZRVMKKwlHVUlUWVBFPUdUSworCQorICAgICAgZmkKKyAgICBmaQorCisgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRHVUlUWVBFIiAhPSAieEdUSyI7IHRoZW4KKyAgICAgIFNLSVBfR1RLMj1ZRVMKKyAgICAgIAorICBpZiB0ZXN0ICJYJEdUS19DT05GSUciICE9ICJYbm8iIC1vICJYJFBLR19DT05GSUciICE9ICJYbm8iOyB0aGVuCisgIHsKKyAgICBtaW5fZ3RrX3ZlcnNpb249MS4xLjE2CisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdUSyAtIHZlcnNpb24gPj0gJG1pbl9ndGtfdmVyc2lvbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDI0MjogY2hlY2tpbmcgZm9yIEdUSyAtIHZlcnNpb24gPj0gJG1pbl9ndGtfdmVyc2lvbiIgPiY1CisgICAgbm9fZ3RrPSIiCisgICAgaWYgKHRlc3QgIlgkU0tJUF9HVEsyIiAhPSAiWFlFUyIgLWEgIlgkUEtHX0NPTkZJRyIgIT0gIlhubyIpIFwKKwkgICYmICRQS0dfQ09ORklHIC0tZXhpc3RzIGd0aystMi4wOyB0aGVuCisgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgZ3RrKy0yLjBgCisgICAgICBHVEtfTElCUz1gJFBLR19DT05GSUcgLS1saWJzIGd0aystMi4wYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRQS0dfQ09ORklHIC0tbW9kdmVyc2lvbiBndGsrLTIuMCB8IFwKKwkgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wxLydgCisgICAgICBndGtfbWlub3JfdmVyc2lvbj1gJFBLR19DT05GSUcgLS1tb2R2ZXJzaW9uIGd0aystMi4wIHwgXAorCSAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDIvJ2AKKyAgICAgIGd0a19taWNyb192ZXJzaW9uPWAkUEtHX0NPTkZJRyAtLW1vZHZlcnNpb24gZ3RrKy0yLjAgfCBcCisJICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMy8nYAorICAgIH0KKyAgICBlbGlmIHRlc3QgIlgkR1RLX0NPTkZJRyIgIT0gIlhubyI7IHRoZW4KKyAgICB7CisgICAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgICAgR1RLX0xJQlM9YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorCSAgICAgc2VkICdzL1woWzAtOV0qXClcLlwoWzAtOV0qXClcLlwoWzAtOV0qXCkvXDEvJ2AKKyAgICAgIGd0a19taW5vcl92ZXJzaW9uPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKwkgICAgIHNlZCAncy9cKFswLTldKlwpXC5cKFswLTldKlwpXC5cKFswLTldKlwpL1wyLydgCisgICAgICBndGtfbWljcm9fdmVyc2lvbj1gJEdUS19DT05GSUcgJGd0a19jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisJICAgICBzZWQgJ3MvXChbMC05XSpcKVwuXChbMC05XSpcKVwuXChbMC05XSpcKS9cMy8nYAorICAgIH0KKyAgICBlbHNlCisgICAgICBub19ndGs9eWVzCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkZW5hYmxlX2d0a3Rlc3QiID0gInh5ZXMiIC1hICJ4JG5vX2d0ayIgPSAieCI7IHRoZW4KKyAgICB7CisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICBMSUJTPSIkTElCUyAkR1RLX0xJQlMiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtIC1mIGNvbmYuZ3RrdGVzdAorICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKCkKK3sKK2ludCBtYWpvciwgbWlub3IsIG1pY3JvOworY2hhciAqdG1wX3ZlcnNpb247CisKK3N5c3RlbSAoInRvdWNoIGNvbmYuZ3RrdGVzdCIpOworCisvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KK3RtcF92ZXJzaW9uID0gZ19zdHJkdXAoIiRtaW5fZ3RrX3ZlcnNpb24iKTsKK2lmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgIGV4aXQoMSk7CisgfQorCitpZiAoKGd0a19tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICgoZ3RrX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmIChndGtfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYKKwkJCQkgICAgIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQoreworICAgIHJldHVybiAwOworfQorcmV0dXJuIDE7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgbm9fZ3RrPXllcworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKKyAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICB9CisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vX2d0ayIgPSB4IDsgdGhlbgorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZ3RrdGVzdCIgPSAieHllcyI7IHRoZW4KKwllY2hvICIkYWNfdCIieWVzOyBmb3VuZCB2ZXJzaW9uICRndGtfbWFqb3JfdmVyc2lvbi4kZ3RrX21pbm9yX3ZlcnNpb24uJGd0a19taWNyb192ZXJzaW9uIiAxPiY2CisgICAgICBlbHNlCisJZWNobyAiJGFjX3QiImZvdW5kIHZlcnNpb24gJGd0a19tYWpvcl92ZXJzaW9uLiRndGtfbWlub3JfdmVyc2lvbi4kZ3RrX21pY3JvX3ZlcnNpb24iIDE+JjYKKyAgICAgIGZpCisgICAgICBHVEtfTElCTkFNRT0iJEdUS19MSUJTIgorCQkgIEdVSV9JTkNfTE9DPSIkR1RLX0NGTEFHUyIKKyAgICBlbHNlCisgICAgeworICAgICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgICBHVEtfTElCUz0iIgorICAgICAgOgorICAgIH0KKyAgICBmaQorICB9CisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPSIiCisgICAgR1RLX0xJQlM9IiIKKyAgICA6CisgIGZpCisgIAorICAKKyAgcm0gLWYgY29uZi5ndGt0ZXN0CisKKyAgICAgIGlmIHRlc3QgIngkR1RLX0NGTEFHUyIgIT0gIngiOyB0aGVuCisJU0tJUF9BVEhFTkE9WUVTCisJU0tJUF9ORVhUQVc9WUVTCisJU0tJUF9NT1RJRj1ZRVMKKwlHVUlUWVBFPUdUSworCQorICAgICAgZmkKKyAgICBmaQorICBmaQorICAgIGlmIHRlc3QgIngkR1VJVFlQRSIgPSAieEdUSyI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkZ3RrX21ham9yX3ZlcnNpb24iID0gMSAtYSAiMCRndGtfbWlub3JfdmVyc2lvbiIgLWx0IDIgXAorCSAtbyAiJGd0a19tYWpvcl92ZXJzaW9uIiA9IDEgLWEgIiRndGtfbWlub3JfdmVyc2lvbiIgPSAyIC1hICIwJGd0a19taWNyb192ZXJzaW9uIiAtbHQgMzsgdGhlbgorICAgICAgZWNobyAiJGFjX3QiInRoaXMgR1RLIHZlcnNpb24gaXMgb2xkOyB2ZXJzaW9uIDEuMi4zIG9yIGxhdGVyIGlzIHJlY29tbWVuZGVkIiAxPiY2CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIHRlc3QgIjAkZ3RrX21ham9yX3ZlcnNpb24iIC1nZSAyOyB0aGVuCisJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR1RLMiAxCitFT0YKKworCWlmIHRlc3QgIiRndGtfbWlub3JfdmVyc2lvbiIgPSAxIC1hICIwJGd0a19taWNyb192ZXJzaW9uIiAtZ2UgMSBcCisJCXx8IHRlc3QgIjAkZ3RrX21pbm9yX3ZlcnNpb24iIC1nZSAyIFwKKwkJfHwgdGVzdCAiMCRndGtfbWFqb3JfdmVyc2lvbiIgLWd0IDI7IHRoZW4KKwkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dUS19NVUxUSUhFQUQgMQorRU9GCisKKwlmaQorICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRTS0lQX0dOT01FIjsgdGhlbgorICAgICAgeworCQorICAKKyAgCisgIAorCisgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ25vbWUtaW5jbHVkZXMgb3IgLS13aXRob3V0LWdub21lLWluY2x1ZGVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbm9tZV9pbmNsdWRlcytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbm9tZV9pbmNsdWRlcyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1JJHdpdGh2YWwiCisgIAorZmkKKworCisgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ25vbWUtbGlicyBvciAtLXdpdGhvdXQtZ25vbWUtbGlicyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ25vbWVfbGlicytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbm9tZV9saWJzIgorICBMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRodmFsIiBnbm9tZV9wcmVmaXg9JHdpdGh2YWwKKyAgCitmaQorCisKKyAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbm9tZSBvciAtLXdpdGhvdXQtZ25vbWUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dub21lK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dub21lIgorICBpZiB0ZXN0IHgkd2l0aHZhbCA9IHh5ZXM7IHRoZW4KKyAgICAgIHdhbnRfZ25vbWU9eWVzCisgICAgICBoYXZlX2dub21lPXllcworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSB4bm87IHRoZW4KKwl3YW50X2dub21lPW5vCisgICAgICBlbHNlCisJd2FudF9nbm9tZT15ZXMKKwlMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRodmFsL2xpYiIKKwlDRkxBR1M9IiRDRkxBR1MgLUkkd2l0aHZhbC9pbmNsdWRlIgorCWdub21lX3ByZWZpeD0kd2l0aHZhbC9saWIKKyAgICAgIGZpCisgICAgZmkKK2Vsc2UKKyAgd2FudF9nbm9tZT15ZXMKK2ZpCisKKworICBpZiB0ZXN0ICJ4JHdhbnRfZ25vbWUiID0geHllcyAtYSAiMCRndGtfbWFqb3JfdmVyc2lvbiIgLWdlIDI7IHRoZW4KKyAgeworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJnbm9tZXVpLTIuMCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDQzMzogY2hlY2tpbmcgZm9yIGxpYmdub21ldWktMi4wIiA+JjUKKyAgICBpZiAkUEtHX0NPTkZJRyAtLWV4aXN0cyBsaWJnbm9tZXVpLTIuMDsgdGhlbgorICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgICAgR05PTUVfTElCUz1gJFBLR19DT05GSUcgLS1saWJzLW9ubHktbCBsaWJnbm9tZXVpLTIuMGAKKyAgICAgIEdOT01FX0xJQkRJUj1gJFBLR19DT05GSUcgLS1saWJzLW9ubHktTCBsaWJnbm9tZXVpLTIuMGAKKyAgICAgIEdOT01FX0lOQ0xVREVESVI9YCRQS0dfQ09ORklHIC0tY2ZsYWdzIGxpYmdub21ldWktMi4wYAorICAgICAgaGF2ZV9nbm9tZT15ZXMKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCIibm90IGZvdW5kIiAxPiY2CisgICAgICBpZiB0ZXN0ICJ4IiA9IHhmYWlsOyB0aGVuCisJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDb3VsZCBub3QgZmluZCBsaWJnbm9tZXVpLTIuMCB2aWEgcGtnLWNvbmZpZyIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBmaQorICAgIGZpCisgIH0KKyAgZWxpZiB0ZXN0ICJ4JHdhbnRfZ25vbWUiID0geHllczsgdGhlbgorICB7CisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbm9tZS1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdub21lLWNvbmZpZzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NDUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR05PTUVfQ09ORklHJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdOT01FX0NPTkZJRyIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR05PTUVfQ09ORklHPSIkR05PTUVfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR05PTUVfQ09ORklHPSIkR05PTUVfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dOT01FX0NPTkZJRz0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR05PTUVfQ09ORklHIiAmJiBhY19jdl9wYXRoX0dOT01FX0NPTkZJRz0ibm8iCisgIDs7Citlc2FjCitmaQorR05PTUVfQ09ORklHPSIkYWNfY3ZfcGF0aF9HTk9NRV9DT05GSUciCitpZiB0ZXN0IC1uICIkR05PTUVfQ09ORklHIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdOT01FX0NPTkZJRyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBpZiB0ZXN0ICIkR05PTUVfQ09ORklHIiA9ICJubyI7IHRoZW4KKyAgICAgIG5vX2dub21lX2NvbmZpZz0ieWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRHTk9NRV9DT05GSUcgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ0ODk6IGNoZWNraW5nIGlmICRHTk9NRV9DT05GSUcgd29ya3MiID4mNQorICAgICAgaWYgJEdOT01FX0NPTkZJRyAtLWxpYnMtb25seS1sIGdub21lID4vZGV2L251bGwgMj4mMTsgdGhlbgorCWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKwlHTk9NRV9MSUJTPSJgJEdOT01FX0NPTkZJRyAtLWxpYnMtb25seS1sIGdub21lIGdub21ldWlgIgorCUdOT01FX0xJQkRJUj0iYCRHTk9NRV9DT05GSUcgLS1saWJzLW9ubHktTCBnbm9yYmEgZ25vbWV1aWAiCisJR05PTUVfSU5DTFVERURJUj0iYCRHTk9NRV9DT05GSUcgLS1jZmxhZ3MgZ25vcmJhIGdub21ldWlgIgorCWhhdmVfZ25vbWU9eWVzCisgICAgICBlbHNlCisJZWNobyAiJGFjX3QiIm5vIiAxPiY2CisJbm9fZ25vbWVfY29uZmlnPSJ5ZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZXhlY19wcmVmaXggPSB4Tk9ORTsgdGhlbgorICAgICAgaWYgdGVzdCB4JHByZWZpeCA9IHhOT05FOyB0aGVuCisJZ25vbWVfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeC9saWIKKyAgICAgIGVsc2UKKwlnbm9tZV9wcmVmaXg9JHByZWZpeC9saWIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ25vbWVfcHJlZml4PWBldmFsIGVjaG8gXGBlY2hvICRsaWJkaXJcYGAKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJG5vX2dub21lX2NvbmZpZyIgPSAieWVzIjsgdGhlbgorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdub21lQ29uZi5zaCBmaWxlIGluICRnbm9tZV9wcmVmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1MTQ6IGNoZWNraW5nIGZvciBnbm9tZUNvbmYuc2ggZmlsZSBpbiAkZ25vbWVfcHJlZml4IiA+JjUKKyAgICAgIGlmIHRlc3QgLWYgJGdub21lX3ByZWZpeC9nbm9tZUNvbmYuc2g7IHRoZW4KKwllY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKKwllY2hvICJsb2FkaW5nIGdub21lIGNvbmZpZ3VyYXRpb24gZnJvbSIgXAorCSAgIiRnbm9tZV9wcmVmaXgvZ25vbWVDb25mLnNoIgorCS4gJGdub21lX3ByZWZpeC9nbm9tZUNvbmYuc2gKKwloYXZlX2dub21lPXllcworICAgICAgZWxzZQorCWVjaG8gIiRhY190IiJub3QgZm91bmQiIDE+JjYKKwlpZiB0ZXN0IHggPSB4ZmFpbDsgdGhlbgorCSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDb3VsZCBub3QgZmluZCB0aGUgZ25vbWVDb25mLnNoIGZpbGUgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgZ25vbWUtbGlicyBpbnN0YWxsIiAxPiYyOyBleGl0IDE7IH0KKwlmaQorICAgICAgZmkKKyAgICBmaQorICB9CisgIGZpCisKKwlpZiB0ZXN0IHgkaGF2ZV9nbm9tZSA9IHh5ZXMgOyB0aGVuCisJICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9HVUlfR05PTUUgMQorRU9GCisKKwkgIEdVSV9JTkNfTE9DPSIkR1VJX0lOQ19MT0MgJEdOT01FX0lOQ0xVREVESVIiCisJICBHVEtfTElCTkFNRT0iJEdUS19MSUJOQU1FICRHTk9NRV9MSUJESVIgJEdOT01FX0xJQlMiCisJZmkKKyAgICAgIH0KKyAgICAgIGZpCisgICAgfQorICAgIGZpCisgIGZpCitmaQorCisKK2lmIHRlc3QgLXogIiRTS0lQX01PVElGIjsgdGhlbgorICBndWlfWFhYPSIvdXNyL1hYWC9Nb3RpZiogL3Vzci9Nb3RpZiovWFhYIC91c3IvWFhYIC91c3Ivc2hsaWIgL3Vzci9YMTEqL1hYWCAvdXNyL1hYWC9YMTEqIC91c3IvZHQvWFhYIC9sb2NhbC9Nb3RpZiovWFhYIC9sb2NhbC9YWFgvTW90aWYqIC91c3IvbG9jYWwvTW90aWYqL1hYWCAvdXNyL2xvY2FsL1hYWC9Nb3RpZiogL3Vzci9sb2NhbC9YWFggL3Vzci9sb2NhbC9YMTEqL1hYWCAvdXNyL2xvY2FsL0xlc3NUaWYvTW90aWYqL1hYWCAkTU9USUZIT01FL1hYWCIKKyAgICBHVUlfSU5DX0xPQz0iYGVjaG8gJEdVSV9JTkNfTE9DfHNlZCAncyUtSSUlZydgIgorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsb2NhdGlvbiBvZiBNb3RpZiBHVUkgaW5jbHVkZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1NTI6IGNoZWNraW5nIGZvciBsb2NhdGlvbiBvZiBNb3RpZiBHVUkgaW5jbHVkZXMiID4mNQorICBndWlfaW5jbHVkZXM9ImBlY2hvICR4X2luY2x1ZGVzfHNlZCAncyUvXi9eLyokJSUnYCBgZWNobyAiJGd1aV9YWFgiIHwgc2VkIHMvWFhYL2luY2x1ZGUvZ2AgJEdVSV9JTkNfTE9DIgorICBHVUlfSU5DX0xPQz0KKyAgZm9yIHRyeSBpbiAkZ3VpX2luY2x1ZGVzOyBkbworICAgIGlmIHRlc3QgLWYgIiR0cnkvWG0vWG0uaCI7IHRoZW4KKyAgICAgIEdVSV9JTkNfTE9DPSR0cnkKKyAgICBmaQorICBkb25lCisgIGlmIHRlc3QgLW4gIiRHVUlfSU5DX0xPQyI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkR1VJX0lOQ19MT0MiID0gL3Vzci9pbmNsdWRlOyB0aGVuCisgICAgICBHVUlfSU5DX0xPQz0KKyAgICAgIGVjaG8gIiRhY190IiJpbiBkZWZhdWx0IHBhdGgiIDE+JjYKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCIiJEdVSV9JTkNfTE9DIiAxPiY2CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRhY190IiI8bm90IGZvdW5kPiIgMT4mNgorICAgIFNLSVBfTU9USUY9WUVTCisgIGZpCitmaQorCisKK2lmIHRlc3QgLXogIiRTS0lQX01PVElGIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyAtLXdpdGgtbW90aWYtbGliIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTc2OiBjaGVja2luZyAtLXdpdGgtbW90aWYtbGliIGFyZ3VtZW50IiA+JjUKKyAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tb3RpZi1saWIgb3IgLS13aXRob3V0LW1vdGlmLWxpYiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbW90aWZfbGliK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX21vdGlmX2xpYiIKKyAgIE1PVElGX0xJQk5BTUU9IiR7d2l0aHZhbH0iICAKK2ZpCisKKworICBpZiB0ZXN0IC1uICIkTU9USUZfTElCTkFNRSI7IHRoZW4KKyAgICBlY2hvICIkYWNfdCIiJE1PVElGX0xJQk5BTUUiIDE+JjYKKyAgICBHVUlfTElCX0xPQz0KKyAgZWxzZQorICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorCisgICAgICAgIEdVSV9MSUJfTE9DPSJgZWNobyAkR1VJX0xJQl9MT0N8c2VkICdzJS1MJSVnJ2AiCisKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9jYXRpb24gb2YgTW90aWYgR1VJIGxpYnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1OTM6IGNoZWNraW5nIGZvciBsb2NhdGlvbiBvZiBNb3RpZiBHVUkgbGlicyIgPiY1CisgICAgZ3VpX2xpYnM9ImBlY2hvICR4X2xpYnJhcmllc3xzZWQgJ3MlL14vXi8qJCUlJ2AgYGVjaG8gIiRndWlfWFhYIiB8IHNlZCBzL1hYWC9saWIvZ2AgYGVjaG8gIiRHVUlfSU5DX0xPQyIgfCBzZWQgcy9pbmNsdWRlL2xpYi9gICRHVUlfTElCX0xPQyIKKyAgICBHVUlfTElCX0xPQz0KKyAgICBmb3IgdHJ5IGluICRndWlfbGliczsgZG8KKyAgICAgIGZvciBsaWJ0cnkgaW4gIiR0cnkiL2xpYlhtLmEgIiR0cnkiL2xpYlhtLnNvKiAiJHRyeSIvbGliWG0uc2w7IGRvCisJaWYgdGVzdCAtZiAiJGxpYnRyeSI7IHRoZW4KKwkgIEdVSV9MSUJfTE9DPSR0cnkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICBpZiB0ZXN0IC1uICIkR1VJX0xJQl9MT0MiOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1VJX0xJQl9MT0MiID0gL3Vzci9saWI7IHRoZW4KKwlHVUlfTElCX0xPQz0KKwllY2hvICIkYWNfdCIiaW4gZGVmYXVsdCBwYXRoIiAxPiY2CisgICAgICBlbHNlCisJaWYgdGVzdCAtbiAiJEdVSV9MSUJfTE9DIjsgdGhlbgorCSAgZWNobyAiJGFjX3QiIiRHVUlfTElCX0xPQyIgMT4mNgorCSAgaWYgdGVzdCAiYCh1bmFtZSkgMj4vZGV2L251bGxgIiA9IFN1bk9TICYmCisJCQkJCSB1bmFtZSAtciB8IGdyZXAgJ141JyA+L2Rldi9udWxsOyB0aGVuCisJICAgIEdVSV9MSUJfTE9DPSIkR1VJX0xJQl9MT0MgLVIgJEdVSV9MSUJfTE9DIgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIE1PVElGX0xJQk5BTUU9LWxYbQorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190IiI8bm90IGZvdW5kPiIgMT4mNgorICAgICAgU0tJUF9NT1RJRj1ZRVMKKyAgICBmaQorICBmaQorZmkKKworaWYgdGVzdCAteiAiJFNLSVBfTU9USUYiOyB0aGVuCisgIFNLSVBfQVRIRU5BPVlFUworICBTS0lQX05FWFRBVz1ZRVMKKyAgR1VJVFlQRT1NT1RJRgorICAKK2ZpCisKKworR1VJX1hfTElCUz0KKworaWYgdGVzdCAteiAiJFNLSVBfQVRIRU5BIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBpZiBBdGhlbmEgaGVhZGVyIGZpbGVzIGNhbiBiZSBmb3VuZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDYzNjogY2hlY2tpbmcgaWYgQXRoZW5hIGhlYWRlciBmaWxlcyBjYW4gYmUgZm91bmQiID4mNQorICBjZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ2NDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2luY2x1ZGUgPFgxMS9YYXcvUGFuZWQuaD4KK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2OyBTS0lQX0FUSEVOQT1ZRVMgCitmaQorcm0gLWYgY29uZnRlc3QqCisgIENGTEFHUz0kY2ZsYWdzX3NhdmUKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX0FUSEVOQSI7IHRoZW4KKyAgR1VJVFlQRT1BVEhFTkEKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX05FWFRBVyI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgbmVYdGF3IGhlYWRlciBmaWxlcyBjYW4gYmUgZm91bmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2Njg6IGNoZWNraW5nIGlmIG5lWHRhdyBoZWFkZXIgZmlsZXMgY2FuIGJlIGZvdW5kIiA+JjUKKyAgY2ZsYWdzX3NhdmU9JENGTEFHUworICBDRkxBR1M9IiRDRkxBR1MgJFhfQ0ZMQUdTIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NjcyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYMTEvbmVYdGF3L1BhbmVkLmg+CitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2ODE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsgU0tJUF9ORVhUQVc9WUVTIAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBDRkxBR1M9JGNmbGFnc19zYXZlCitmaQorCitpZiB0ZXN0IC16ICIkU0tJUF9ORVhUQVciOyB0aGVuCisgIEdVSVRZUEU9TkVYVEFXCitmaQorCitpZiB0ZXN0IC16ICIkU0tJUF9BVEhFTkEiIC1vIC16ICIkU0tJUF9ORVhUQVciIC1vIC16ICIkU0tJUF9NT1RJRiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRHVUlfSU5DX0xPQyI7IHRoZW4KKyAgICBHVUlfSU5DX0xPQz0tSSJgZWNobyAkR1VJX0lOQ19MT0N8c2VkICdzJS1JJSUnYCIKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJEdVSV9MSUJfTE9DIjsgdGhlbgorICAgIEdVSV9MSUJfTE9DPS1MImBlY2hvICRHVUlfTElCX0xPQ3xzZWQgJ3MlLUwlJSdgIgorICBmaQorCisgICAgbGRmbGFnc19zYXZlPSRMREZMQUdTCisgIExERkxBR1M9IiRYX0xJQlMgJExERkxBR1MiCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYU2hhcGVRdWVyeUV4dGVuc2lvbiBpbiAtbFhleHQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ3MDk6IGNoZWNraW5nIGZvciBYU2hhcGVRdWVyeUV4dGVuc2lvbiBpbiAtbFhleHQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBYZXh0J18nWFNoYXBlUXVlcnlFeHRlbnNpb24gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sWGV4dCAtbFh0ICRYX1BSRV9MSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NzE3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgWFNoYXBlUXVlcnlFeHRlbnNpb24oKTsKKworaW50IG1haW4oKSB7CitYU2hhcGVRdWVyeUV4dGVuc2lvbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgR1VJX1hfTElCUz0iLWxYZXh0IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd3NsZW4gaW4gLWx3IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NzQ5OiBjaGVja2luZyBmb3Igd3NsZW4gaW4gLWx3IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gdydfJ3dzbGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHcgJEdVSV9YX0xJQlMgLWxYdCAkWF9QUkVfTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDc1NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHdzbGVuKCk7CisKK2ludCBtYWluKCkgeword3NsZW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbHciCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxzeW0gaW4gLWxkbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDc4OTogY2hlY2tpbmcgZm9yIGRsc3ltIGluIC1sZGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsc3ltIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGRsICRHVUlfWF9MSUJTIC1sWHQgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ3OTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbHN5bSgpOworCitpbnQgbWFpbigpIHsKK2Rsc3ltKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbCIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYbXVDcmVhdGVTdGlwcGxlZFBpeG1hcCBpbiAtbFhtdSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDgyOTogY2hlY2tpbmcgZm9yIFhtdUNyZWF0ZVN0aXBwbGVkUGl4bWFwIGluIC1sWG11IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gWG11J18nWG11Q3JlYXRlU3RpcHBsZWRQaXhtYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sWG11ICRHVUlfWF9MSUJTIC1sWHQgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ4MzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBYbXVDcmVhdGVTdGlwcGxlZFBpeG1hcCgpOworCitpbnQgbWFpbigpIHsKK1htdUNyZWF0ZVN0aXBwbGVkUGl4bWFwKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBHVUlfWF9MSUJTPSItbFhtdSAkR1VJX1hfTElCUyIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRTS0lQX01PVElGIjsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYcEVuZEpvYiBpbiAtbFhwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0ODcwOiBjaGVja2luZyBmb3IgWHBFbmRKb2IgaW4gLWxYcCIgPiY1CithY19saWJfdmFyPWBlY2hvIFhwJ18nWHBFbmRKb2IgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sWHAgJEdVSV9YX0xJQlMgLWxYbSAtbFh0ICRYX1BSRV9MSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0ODc4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgWHBFbmRKb2IoKTsKKworaW50IG1haW4oKSB7CitYcEVuZEpvYigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgR1VJX1hfTElCUz0iLWxYcCAkR1VJX1hfTElCUyIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGZpCisgIExERkxBR1M9JGxkZmxhZ3Nfc2F2ZQorCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4dHJhIFgxMSBkZWZpbmVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0OTEzOiBjaGVja2luZyBmb3IgZXh0cmEgWDExIGRlZmluZXMiID4mNQorICBOQVJST1dfUFJPVE89CisgIHJtIC1mciBjb25mdGVzdGRpcgorICBpZiBta2RpciBjb25mdGVzdGRpcjsgdGhlbgorICAgIGNkIGNvbmZ0ZXN0ZGlyCisgICAgY2F0ID4gSW1ha2VmaWxlIDw8J0VPRicKK2FjZmluZHg6CisJQGVjaG8gJ05BUlJPV19QUk9UTz0iJHtQUk9UT19ERUZJTkVTfSInCitFT0YKKyAgICBpZiAoeG1rbWYpID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgorICAgICAgZXZhbCBgJHtNQUtFLW1ha2V9IGFjZmluZHggMj4vZGV2L251bGwgfCBncmVwIC12IG1ha2VgCisgICAgZmkKKyAgICBjZCAuLgorICAgIHJtIC1mciBjb25mdGVzdGRpcgorICBmaQorICBpZiB0ZXN0IC16ICIkTkFSUk9XX1BST1RPIjsgdGhlbgorICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBlbHNlCisgICAgZWNobyAiJGFjX3QiIiROQVJST1dfUFJPVE8iIDE+JjYKKyAgZmkKKyAgCitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3hzbXAiID0gInllcyI7IHRoZW4KKyAgY3BwZmxhZ3Nfc2F2ZT0kQ1BQRkxBR1MKKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkWF9DRkxBR1MiCisgIGZvciBhY19oZHIgaW4gWDExL1NNL1NNbGliLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0OTQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDk0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDk1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgQ1BQRkxBR1M9JGNwcGZsYWdzX3NhdmUKK2ZpCisKKworaWYgdGVzdCAteiAiJFNLSVBfQVRIRU5BIiAtbyAteiAiJFNLSVBfTkVYVEFXIiAtbyAteiAiJFNLSVBfTU9USUYiIC1vIC16ICIkU0tJUF9HVEsiOyB0aGVuCisgICAgY3BwZmxhZ3Nfc2F2ZT0kQ1BQRkxBR1MKKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkWF9DRkxBR1MiCisgIGZvciBhY19oZHIgaW4gWDExL3hwbS5oIFgxMS9TdW5rZXlzeW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ5OTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0OTk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICAgaWYgdGVzdCAhICIkZW5hYmxlX3hpbSIgPSAibm8iOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhJTVRleHQgaW4gWDExL1hsaWIuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTAyOTogY2hlY2tpbmcgZm9yIFhJTVRleHQgaW4gWDExL1hsaWIuaCIgPiY1CisgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTAzMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiWElNVGV4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubzsgeGltIGhhcyBiZWVuIGRpc2FibGVkIiAxPiY2OyBlbmFibGVfeGltID0gIm5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisgIGZpCisgIENQUEZMQUdTPSRjcHBmbGFnc19zYXZlCisKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3hpbSIgPSAiYXV0byIgLWEgIiRlbmFibGVfaGFuZ3VsaW5wdXQiICE9ICJ5ZXMiIFwKKwkJLWEgIngkR1VJVFlQRSIgIT0gInhOT05FIiA7IHRoZW4KKyAgICBlY2hvICIkYWNfdCIiWCBHVUkgc2VsZWN0ZWQ7IHhpbSBoYXMgYmVlbiBlbmFibGVkIiAxPiY2CisgICAgZW5hYmxlX3hpbT0ieWVzIgorICBmaQorZmkKKworaWYgdGVzdCAteiAiJFNLSVBfQVRIRU5BIiAtbyAteiAiJFNLSVBfTkVYVEFXIiAtbyAteiAiJFNLSVBfTU9USUYiOyB0aGVuCisgIGNwcGZsYWdzX3NhdmU9JENQUEZMQUdTCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFhfQ0ZMQUdTIgorICBmb3IgYWNfaGRyIGluIFgxMS9YbXUvRWRpdHJlcy5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTA2MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUwNjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgIENQUEZMQUdTPSRjcHBmbGFnc19zYXZlCitmaQorCitpZiB0ZXN0IC16ICIkU0tJUF9NT1RJRiI7IHRoZW4KKyAgY3BwZmxhZ3Nfc2F2ZT0kQ1BQRkxBR1MKKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkWF9DRkxBR1MiCisgIGZvciBhY19oZHIgaW4gWG0vWG0uaCBYbS9YcG1QLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MTA4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTExMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NTExODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgQ1BQRkxBR1M9JGNwcGZsYWdzX3NhdmUKK2ZpCisKK2lmIHRlc3QgIngkR1VJVFlQRSIgPSAieE5PTkUiIC1hICIkZW5hYmxlX3hpbSIgPSAieWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIibm8gR1VJIHNlbGVjdGVkOyB4aW0gaGFzIGJlZW4gZGlzYWJsZWQiIDE+JjYKKyAgZW5hYmxlX3hpbT0ibm8iCitmaQoraWYgdGVzdCAieCRHVUlUWVBFIiA9ICJ4Tk9ORSIgLWEgIiRlbmFibGVfZm9udHNldCIgPSAieWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIibm8gR1VJIHNlbGVjdGVkOyBmb250c2V0IGhhcyBiZWVuIGRpc2FibGVkIiAxPiY2CisgIGVuYWJsZV9mb250c2V0PSJubyIKK2ZpCitpZiB0ZXN0ICJ4JEdVSVRZUEU6JGVuYWJsZV9mb250c2V0IiA9ICJ4R1RLOnllcyIgLWEgIjAkZ3RrX21ham9yX3ZlcnNpb24iIC1nZSAyOyB0aGVuCisgIGVjaG8gIiRhY190IiJHVEsrIDIgR1VJIHNlbGVjdGVkOyBmb250c2V0IGhhcyBiZWVuIGRpc2FibGVkIiAxPiY2CisgIGVuYWJsZV9mb250c2V0PSJubyIKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX0JFT1MiOyB0aGVuCisgIEdVSVRZUEU9QkVPU0dVSQorZmkKKworaWYgdGVzdCAteiAiJFNLSVBfUEhPVE9OIjsgdGhlbgorICBHVUlUWVBFPVBIT1RPTkdVSQorZmkKKworCisKKworCisKK2lmIHRlc3QgIiRlbmFibGVfd29ya3Nob3AiID0gInllcyIgLWEgLW4gIiRTS0lQX01PVElGIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCB1c2Ugd29ya3Nob3Agd2l0aG91dCBNb3RpZiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3hpbSIgPSAieWVzIjsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRkVBVF9YSU0gMQorRU9GCisKK2ZpCitpZiB0ZXN0ICIkZW5hYmxlX2ZvbnRzZXQiID0gInllcyI7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEZFQVRfWEZPTlRTRVQgMQorRU9GCisKK2ZpCisKKworCisKK2lmIHRlc3QgIiRlbmFibGVfaGFuZ3VsaW5wdXQiID0gInllcyI7IHRoZW4KKyAgaWYgdGVzdCAieCRHVUlUWVBFIiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBlY2hvICIkYWNfdCIibm8gR1VJIHNlbGVjdGVkOyBoYW5ndWwgaW5wdXQgaGFzIGJlZW4gZGlzYWJsZWQiIDE+JjYKKyAgICBlbmFibGVfaGFuZ3VsaW5wdXQ9bm8KKyAgZWxzZQorICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBGRUFUX0hBTkdVTElOIDEKK0VPRgorCisgICAgSEFOR1VMSU5fU1JDPWhhbmd1bGluLmMKKyAgICAKKyAgICBIQU5HVUxJTl9PQko9b2JqZWN0cy9oYW5ndWxpbi5vCisgICAgCisgIGZpCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHF1YWxpdHkgb2YgdG91cHBlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTIxMTogY2hlY2tpbmcgcXVhbGl0eSBvZiB0b3VwcGVyIiA+JjUKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtIiAxPiYyOyBleGl0IDE7IH0KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTIxNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KK21haW4oKSB7IGV4aXQodG91cHBlcignQScpID09ICdBJyAmJiB0b2xvd2VyKCd6JykgPT0gJ3onKTsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEJST0tFTl9UT1VQUEVSIDEKK0VPRgorIGVjaG8gIiRhY190IiJiYWQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiImdvb2QiIDE+JjYKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgX19EQVRFX18gYW5kIF9fVElNRV9fIHdvcmsiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUyMzg6IGNoZWNraW5nIHdoZXRoZXIgX19EQVRFX18gYW5kIF9fVElNRV9fIHdvcmsiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI0MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcHJpbnRmKCIoIiBfX0RBVEVfXyAiICIgX19USU1FX18gIikiKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfREFURV9USU1FIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCithY19zYWZlPWBlY2hvICJlbGYuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZWxmLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUyNjM6IGNoZWNraW5nIGZvciBlbGYuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8ZWxmLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBIQVNfRUxGPTEKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0ICIkSEFTX0VMRiIgPSAxOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtYWluIGluIC1sZWxmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1Mjk2OiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbGVsZiIgPiY1CithY19saWJfdmFyPWBlY2hvIGVsZidfJ21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZWxmICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUzMDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gZWxmIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbGVsZiAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKK2FjX2hlYWRlcl9kaXJlbnQ9bm8KK2ZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MzQ1OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTM1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8JGFjX2hkcj4KK2ludCBtYWluKCkgeworRElSICpkaXJwID0gMDsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisjIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCitpZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MzgzOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1CithY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGlyICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUzOTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWxkaXIiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NDI0OiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQorYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx4ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU0MzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQ0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWx4IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU0Njc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU0NzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjU0ODA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTQ5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1NTE1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU1MzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTU0NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NTcxOiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1NTc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmbmRlZiBXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCisjZW5kaWYKKyNpZm5kZWYgV0lGRVhJVEVECisjZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQorI2VuZGlmCitpbnQgbWFpbigpIHsKK2ludCBzOword2FpdCAoJnMpOworcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1OTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQorRU9GCisKK2ZpCisKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSBubzsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGRlZmluZXMgdW5pb24gd2FpdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTYxNTogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBkZWZpbmVzIHVuaW9uIHdhaXQiID4mNQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1NjE3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgoraW50IG1haW4oKSB7Cit1bmlvbiB3YWl0IHh4LCB5eTsgeHggPSB5eQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisJCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKK0VPRgorCisJCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9VTklPTl9XQUlUIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZm9yIGFjX2hkciBpbiBzdGRhcmcuaCBzdGRsaWIuaCBzdHJpbmcuaCBzeXMvc2VsZWN0Lmggc3lzL3V0c25hbWUuaCBcCisJdGVybWNhcC5oIGZjbnRsLmggc2d0dHkuaCBzeXMvaW9jdGwuaCBzeXMvdGltZS5oIHRlcm1pby5oIFwKKwlpY29udi5oIGxhbmdpbmZvLmggdW5pc3RkLmggc3Ryb3B0cy5oIGVycm5vLmggXAorCXN5cy9yZXNvdXJjZS5oIHN5cy9zeXN0ZW1pbmZvLmggbG9jYWxlLmggXAorCXN5cy9zdHJlYW0uaCBzeXMvcHRlbS5oIHRlcm1pb3MuaCBsaWJjLmggc3lzL3N0YXRmcy5oIFwKKwlwb2xsLmggc3lzL3BvbGwuaCBwd2QuaCB1dGltZS5oIHN5cy9wYXJhbS5oIGxpYmludGwuaCBcCisJbGliZ2VuLmggdXRpbC9kZWJ1Zy5oIHV0aWwvbXNnMThuLmggZnJhbWUuaCBwdGhyZWFkX25wLmggXAorCXN5cy9hY2wuaCBzeXMvYWNjZXNzLmggc3lzL3N5c2N0bC5oIHN5cy9zeXNpbmZvLmggd2NoYXIuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU2NTU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1NjYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjY1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCitpZiB0ZXN0ICJ4JE1BQ09TWCIgIT0gInh5ZXMiOyB0aGVuCisgIGZvciBhY19oZHIgaW4gc3RyaW5ncy5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTY5NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU3MDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjU3MDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBpZiBzdHJpbmdzLmggY2FuIGJlIGluY2x1ZGVkIGFmdGVyIHN0cmluZy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzM2OiBjaGVja2luZyBpZiBzdHJpbmdzLmggY2FuIGJlIGluY2x1ZGVkIGFmdGVyIHN0cmluZy5oIiA+JjUKK2NwcGZsYWdzX3NhdmU9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRYX0NGTEFHUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU3NDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgZGVmaW5lZChfQUlYKSAmJiAhZGVmaW5lZChfQUlYNTEpICYmICFkZWZpbmVkKF9OT19QUk9UTykKKyMgZGVmaW5lIF9OT19QUk9UTwkvKiBsaWtlIGluIG9zX3VuaXguaCwgY2F1c2VzIGNvbmZsaWN0IGZvciBBSVggKFdpbm4pICovCisJCQkvKiBidXQgZG9uJ3QgZG8gaXQgb24gQUlYIDUuMSAoVXJpYmFycmkpICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1hNX1hNX0gKKyMgaW5jbHVkZSA8WG0vWG0uaD4JLyogVGhpcyBicmVha3MgaXQgZm9yIEhQLVVYIDExIChTcXVhc3NhYmlhKSAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TVFJJTkdTX0gpCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorCQkKK2ludCBtYWluKCkgeworaW50IGk7IGkgPSAwOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3NjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBOT19TVFJJTkdTX1dJVEhfU1RSSU5HX0ggMQorRU9GCisKKwkJZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitDUFBGTEFHUz0kY3BwZmxhZ3Nfc2F2ZQorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gbmVlZHMgLXRyYWRpdGlvbmFsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1Nzc5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IG5lZWRzIC10cmFkaXRpb25hbCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIGFjX3BhdHRlcm49IkF1dG9jb25mLioneCciCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU3ODUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHNndHR5Lmg+CitBdXRvY29uZiBUSU9DR0VUUAorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIkYWNfcGF0dGVybiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworCisgIGlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsID0gbm87IHRoZW4KKyAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1ODAzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDx0ZXJtaW8uaD4KK0F1dG9jb25mIFRDR0VUQQorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIkYWNfcGF0dGVybiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCisKKyAgZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwiIDE+JjYKKyAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC10cmFkaXRpb25hbCIKKyAgZmkKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1ODI1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU4MzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbW9kZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTAwOiBjaGVja2luZyBmb3IgbW9kZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX21vZGVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU5MDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pbW9kZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9tb2RlX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9tb2RlX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9tb2RlX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfbW9kZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG1vZGVfdCBpbnQKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5MzM6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU5MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBpZF90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTY2OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1OTcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3BpZF90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgcGlkX3QgaW50CitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTk5OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2MDA0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYwMzI6IGNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDYwMzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ1aWRfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV91aWRfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3VpZF90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aWRfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV91aWRfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSB1aWRfdCBpbnQKK0VPRgorCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBnaWRfdCBpbnQKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjA2NjogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl90aW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjA3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CitpbnQgbWFpbigpIHsKK3N0cnVjdCB0bSAqdHA7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjA4MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl90aW1lPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfdGltZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlub190IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTAxOiBjaGVja2luZyBmb3IgaW5vX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW5vX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2MTA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWlub190W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9pbm9fdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX2lub190PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfaW5vX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW5vX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5vX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBkZXZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEzNDogY2hlY2tpbmcgZm9yIGRldl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2Rldl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjEzOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlkZXZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfZGV2X3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9kZXZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2Rldl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX2Rldl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGRldl90IHVuc2lnbmVkCitFT0YKKworZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmxpbV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTY4OiBjaGVja2luZyBmb3IgcmxpbV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3JsaW1fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIoY2FjaGVkKSAkYWNfY3ZfdHlwZV9ybGltX3QiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjE3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCSAgCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pcmxpbV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9ybGltX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9ybGltX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworCSAgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3JsaW1fdCIgMT4mNgorZmkKK2lmIHRlc3QgJGFjX2N2X3R5cGVfcmxpbV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHJsaW1fdCB1bnNpZ25lZCBsb25nCitFT0YKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdGFja190IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MjA1OiBjaGVja2luZyBmb3Igc3RhY2tfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zdGFja190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIihjYWNoZWQpICRhY19jdl90eXBlX3N0YWNrX3QiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjIxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCSAgCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInN0YWNrX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc3RhY2tfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3N0YWNrX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworCSAgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3N0YWNrX3QiIDE+JjYKK2ZpCitpZiB0ZXN0ICRhY19jdl90eXBlX3N0YWNrX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc3RhY2tfdCBzdHJ1Y3Qgc2lnYWx0c3RhY2sKK0VPRgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGFja190IGhhcyBhbiBzc19iYXNlIGZpZWxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MjQwOiBjaGVja2luZyB3aGV0aGVyIHN0YWNrX3QgaGFzIGFuIHNzX2Jhc2UgZmllbGQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjI0MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisJCQkKK2ludCBtYWluKCkgeworc3RhY2tfdCBzaWdzdGs7IHNpZ3N0ay5zc19iYXNlID0gMDsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjI1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NTX0JBU0UgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisKK29saWJzPSIkTElCUyIKK2VjaG8gJGFjX24gImNoZWNraW5nIC0td2l0aC10bGliIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MjczOiBjaGVja2luZyAtLXdpdGgtdGxpYiBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRsaWIgb3IgLS13aXRob3V0LXRsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3RsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfdGxpYiIKKyAgOgorZmkKKworaWYgdGVzdCAtbiAiJHdpdGhfdGxpYiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiR3aXRoX3RsaWIiIDE+JjYKKyAgTElCUz0iJExJQlMgLWwkd2l0aF90bGliIgorZWxzZQorICBlY2hvICIkYWNfdCIiYXV0b21hdGljIHRlcm1pbmFsIGxpYnJhcnkgc2VsZWN0aW9uIiAxPiY2CisgICAgICAgICAgICBjYXNlICJgdW5hbWUgLXMgMj4vZGV2L251bGxgIiBpbgorCU9TRjEpCXRsaWJzPSJuY3Vyc2VzIGN1cnNlcyB0ZXJtbGliIHRlcm1jYXAiOzsKKwkqKQl0bGlicz0ibmN1cnNlcyB0ZXJtbGliIHRlcm1jYXAgY3Vyc2VzIjs7CisgIGVzYWMKKyAgZm9yIGxpYm5hbWUgaW4gJHRsaWJzOyBkbworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sJHtsaWJuYW1lfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjI5MTogY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWwke2xpYm5hbWV9IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gJHtsaWJuYW1lfSdfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sJHtsaWJuYW1lfSAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2Mjk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgdGdldGVudCgpOworCitpbnQgbWFpbigpIHsKK3RnZXRlbnQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYzMTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWwke2xpYm5hbWV9ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGlmIHRlc3QgIngkb2xpYnMiICE9ICJ4JExJQlMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICByZXM9IkZBSUwiCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDYzNDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCittYWluKCkge2NoYXIgKnM7IHM9KGNoYXIgKil0Z290bygiJXAxJWQiLCAwLCAxKTsgZXhpdCgwKTsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYzNTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgcmVzPSJPSyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgcmVzPSJGQUlMIgorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKKyAgICAgIGlmIHRlc3QgIiRyZXMiID0gIk9LIjsgdGhlbgorCWJyZWFrCisgICAgICBmaQorICAgICAgZWNobyAiJGFjX3QiIiRsaWJuYW1lIGxpYnJhcnkgaXMgbm90IHVzYWJsZSIgMT4mNgorICAgICAgTElCUz0iJG9saWJzIgorICAgIGZpCisgIGRvbmUKK2ZpCitpZiB0ZXN0ICJ4JG9saWJzIiAhPSAieCRMSUJTIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIHRhbGsgdGVybWluZm8iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYzNzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgdGFsayB0ZXJtaW5mbyIgPiY1CisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtLiIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDYzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCittYWluKCkKK3tjaGFyICpzOyBzPShjaGFyICopdGdvdG8oIiVwMSVkIiwgMCwgMSk7IGV4aXQoIXN0cmNtcChzPT0wID8gIiIgOiBzLCAiMSIpKTsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYzODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZWNobyAiJGFjX3QiIm5vIC0tIHdlIGFyZSBpbiB0ZXJtY2FwIGxhbmQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyAtLSB0ZXJtaW5mbyBzcG9rZW4gaGVyZSIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFRFUk1JTkZPIDEKK0VPRgorCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZWxzZQorICBlY2hvICIkYWNfdCIibm9uZSBmb3VuZCIgMT4mNgorZmkKKworaWYgdGVzdCAieCRvbGlicyIgIT0gIngkTElCUyI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hhdCB0Z2V0ZW50KCkgcmV0dXJucyBmb3IgYW4gdW5rbm93biB0ZXJtaW5hbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjQwNzogY2hlY2tpbmcgd2hhdCB0Z2V0ZW50KCkgcmV0dXJucyBmb3IgYW4gdW5rbm93biB0ZXJtaW5hbCIgPiY1CisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtLiIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY0MTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCittYWluKCkKK3tjaGFyIHNbMTAwMDBdOyBpbnQgcmVzID0gdGdldGVudChzLCAidGhpc3Rlcm1pbmFsZG9lc25vdGV4aXN0Iik7IGV4aXQocmVzICE9IDApOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIiemVybyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFRHRVRFTlRfWkVST19FUlIgMAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vbi16ZXJvIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0ZXJtY2FwLmggY29udGFpbnMgb3NwZWVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NDM5OiBjaGVja2luZyB3aGV0aGVyIHRlcm1jYXAuaCBjb250YWlucyBvc3BlZWQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjQ0MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1RFUk1DQVBfSAorIyBpbmNsdWRlIDx0ZXJtY2FwLmg+CisjZW5kaWYKKwkJCQoraW50IG1haW4oKSB7Citvc3BlZWQgPSAyMDAwMAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09TUEVFRCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKwllY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9zcGVlZCBjYW4gYmUgZXh0ZXJuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NDY0OiBjaGVja2luZyB3aGV0aGVyIG9zcGVlZCBjYW4gYmUgZXh0ZXJuIiA+JjUKKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2NDY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfVEVSTUNBUF9ICisjIGluY2x1ZGUgPHRlcm1jYXAuaD4KKyNlbmRpZgorZXh0ZXJuIHNob3J0IG9zcGVlZDsKKwkJCQoraW50IG1haW4oKSB7Citvc3BlZWQgPSAyMDAwMAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0Nzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBPU1BFRURfRVhURVJOIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRlcm1jYXAuaCBjb250YWlucyBVUCwgQkMgYW5kIFBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NDk2OiBjaGVja2luZyB3aGV0aGVyIHRlcm1jYXAuaCBjb250YWlucyBVUCwgQkMgYW5kIFBDIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY0OTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCisJCQkKK2ludCBtYWluKCkgeworaWYgKFVQID09IDAgJiYgQkMgPT0gMCkgUEMgPSAxCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjUwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVVBfQkNfUEMgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisJZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBVUCwgQkMgYW5kIFBDIGNhbiBiZSBleHRlcm4iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1MjE6IGNoZWNraW5nIHdoZXRoZXIgVVAsIEJDIGFuZCBQQyBjYW4gYmUgZXh0ZXJuIiA+JjUKKwljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2NTIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfVEVSTUNBUF9ICisjIGluY2x1ZGUgPHRlcm1jYXAuaD4KKyNlbmRpZgorZXh0ZXJuIGNoYXIgKlVQLCAqQkMsIFBDOworCQkJCitpbnQgbWFpbigpIHsKK2lmIChVUCA9PSAwICYmIEJDID09IDApIFBDID0gMQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY1MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBVUF9CQ19QQ19FWFRFUk4gMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisJCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdHB1dHMoKSB1c2VzIG91dGZ1bnR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1NTM6IGNoZWNraW5nIHdoZXRoZXIgdHB1dHMoKSB1c2VzIG91dGZ1bnR5cGUiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjU1NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1RFUk1DQVBfSAorIyBpbmNsdWRlIDx0ZXJtY2FwLmg+CisjZW5kaWYKKwkJCQoraW50IG1haW4oKSB7CitleHRlcm4gaW50IHh4KCk7IHRwdXRzKCJ0ZXN0IiwgMSwgKG91dGZ1bnR5cGUpeHgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU2NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09VVEZVTlRZUEUgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3lzL3NlbGVjdC5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NTgxOiBjaGVja2luZyB3aGV0aGVyIHN5cy9zZWxlY3QuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2NTgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTkzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNZU19TRUxFQ1RfV0lUSF9TWVNfVElNRSAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgL2Rldi9wdGMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY2MTA6IGNoZWNraW5nIGZvciAvZGV2L3B0YyIgPiY1CitpZiB0ZXN0IC1yIC9kZXYvcHRjOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0RFVl9QVEMgMQorRU9GCisKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBTVlI0IHB0eXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY2MjI6IGNoZWNraW5nIGZvciBTVlI0IHB0eXMiID4mNQoraWYgdGVzdCAtYyAvZGV2L3B0bXggOyB0aGVuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY2MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3B0c25hbWUoMCk7Z3JhbnRwdCgwKTt1bmxvY2twdCgwKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVlI0X1BUWVMgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHB0eXJhbmdlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjY1MDogY2hlY2tpbmcgZm9yIHB0eXJhbmdlcyIgPiY1CitpZiB0ZXN0IC1kIC9kZXYvcHR5bSA7IHRoZW4KKyAgcGRpcj0nL2Rldi9wdHltJworZWxzZQorICBwZGlyPScvZGV2JworZmkKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY2NTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmZGVmIE1fVU5JWAorICAgeWVzOworI2VuZGlmCisJCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgcHR5cz1gZWNobyAvZGV2L3B0eXA/P2AKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBwdHlzPWBlY2hvICRwZGlyL3B0eT8/YAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICIkcHR5cyIgIT0gIiRwZGlyL3B0eT8/IiA7IHRoZW4KKyAgcDA9YGVjaG8gJHB0eXMgfCB0ciAnICcgJ1wwMTInIHwgc2VkIC1lICdzL14uKlwoLlwpLiQvXDEvZycgfCBzb3J0IC11IHwgdHIgLWQgJ1wwMTInYAorICBwMT1gZWNobyAkcHR5cyB8IHRyICcgJyAnXDAxMicgfCBzZWQgLWUgJ3MvXi4qXCguXCkkL1wxL2cnICB8IHNvcnQgLXUgfCB0ciAtZCAnXDAxMidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBUWVJBTkdFMCAiJHAwIgorRU9GCisKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUFRZUkFOR0UxICIkcDEiCitFT0YKKworICBlY2hvICIkYWNfdCIiJHAwIC8gJHAxIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJkb24ndCBrbm93IiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBkZWZhdWx0IHR0eSBwZXJtaXNzaW9ucy9ncm91cCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjY5MTogY2hlY2tpbmcgZGVmYXVsdCB0dHkgcGVybWlzc2lvbnMvZ3JvdXAiID4mNQorcm0gLWYgY29uZnRlc3RfZ3JwCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGZhaWxlZCB0byBjb21waWxlIHRlc3QgcHJvZ3JhbSIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY2OTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbigpCit7CisgIHN0cnVjdCBzdGF0IHNiOworICBjaGFyICp4LCp0dHluYW1lKCk7CisgIGludCBvbSwgbTsKKyAgRklMRSAqZnA7CisKKyAgaWYgKCEoeCA9IHR0eW5hbWUoMCkpKSBleGl0KDEpOworICBpZiAoc3RhdCh4LCAmc2IpKSBleGl0KDEpOworICBvbSA9IHNiLnN0X21vZGU7CisgIGlmIChvbSAmIDAwMikgZXhpdCgwKTsKKyAgbSA9IHN5c3RlbSgibWVzZyB5Iik7CisgIGlmIChtID09IC0xIHx8IG0gPT0gMTI3KSBleGl0KDEpOworICBpZiAoc3RhdCh4LCAmc2IpKSBleGl0KDEpOworICBtID0gc2Iuc3RfbW9kZTsKKyAgaWYgKGNobW9kKHgsIG9tKSkgZXhpdCgxKTsKKyAgaWYgKG0gJiAwMDIpIGV4aXQoMCk7CisgIGlmIChzYi5zdF9naWQgPT0gZ2V0Z2lkKCkpIGV4aXQoMSk7CisgIGlmICghKGZwPWZvcGVuKCJjb25mdGVzdF9ncnAiLCAidyIpKSkKKyAgICBleGl0KDEpOworICBmcHJpbnRmKGZwLCAiJWRcbiIsIHNiLnN0X2dpZCk7CisgIGZjbG9zZShmcCk7CisgIGV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NzI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIAorICAgIGlmIHRlc3QgLWYgY29uZnRlc3RfZ3JwOyB0aGVuCisJcHR5Z3JwPWBjYXQgY29uZnRlc3RfZ3JwYAorCWVjaG8gIiRhY190IiJwdHkgbW9kZTogMDYyMCwgZ3JvdXA6ICRwdHlncnAiIDE+JjYKKwljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgUFRZTU9ERSAwNjIwCitFT0YKKworCWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBUWUdST1VQICRwdHlncnAKK0VPRgorCisgICAgZWxzZQorCWVjaG8gIiRhY190IiJwdHlzIGFyZSB3b3JsZCBhY2Nlc3NhYmxlIiAxPiY2CisgICAgZmkKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIiY2FuJ3QgZGV0ZXJtaW5lIC0gYXNzdW1lIHB0eXMgYXJlIHdvcmxkIGFjY2Vzc2FibGUiIDE+JjYKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitybSAtZiBjb25mdGVzdF9ncnAKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY3NjA6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2NzY1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NzgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2lnbmFsID0gdm9pZDsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU0lHUkVUVVJOIHJldHVybgorRU9GCisKK2Vsc2UKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNJR1JFVFVSTiByZXR1cm4gMAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc2lnY29udGV4dCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjgxNDogY2hlY2tpbmcgZm9yIHN0cnVjdCBzaWdjb250ZXh0IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY4MTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+Cit0ZXN0X3NpZygpCit7CisgICAgc3RydWN0IHNpZ2NvbnRleHQgKnNjb250OworICAgIHNjb250ID0gKHN0cnVjdCBzaWdjb250ZXh0ICopMDsKKyAgICByZXR1cm4gMTsKK30gCitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY4MzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NJR0NPTlRFWFQgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGdldGN3ZCBpbXBsZW1lbnRhdGlvbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njg0NjogY2hlY2tpbmcgZ2V0Y3dkIGltcGxlbWVudGF0aW9uIiA+JjUKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtIiAxPiYyOyBleGl0IDE7IH0KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjg1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2NoYXIgKmRhZ2dlcltdID0geyAiSUZTPXB3ZCIsIDAgfTsKK21haW4oKQoreworICBjaGFyIGJ1ZmZlcls1MDBdOworICBleHRlcm4gY2hhciAqKmVudmlyb247CisgIGVudmlyb24gPSBkYWdnZXI7CisgIHJldHVybiBnZXRjd2QoYnVmZmVyLCA1MDApID8gMCA6IDE7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Njg2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIiaXQgaXMgdXNhYmxlIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJpdCBzdGlua3MiIDE+JjYKKwkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEJBRF9HRVRDV0QgMQorRU9GCisKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCisKK2ZvciBhY19mdW5jIGluIGJjbXAgZmNoZGlyIGZjaG93biBmc2Vla28gZnN5bmMgZnRlbGxvIGdldGN3ZCBnZXRwc2V1ZG90dHkgXAorCWdldHB3bmFtIGdldHB3dWlkIGdldHJsaW1pdCBnZXR0aW1lb2ZkYXkgZ2V0d2QgbHN0YXQgbWVtY21wIFwKKwltZW1zZXQgbmFub3NsZWVwIG9wZW5kaXIgcHV0ZW52IHFzb3J0IHJlYWRsaW5rIHNlbGVjdCBzZXRlbnYgXAorCXNldHBnaWQgc2V0c2lkIHNpZ2FsdHN0YWNrIHNpZ3N0YWNrIHNpZ3NldCBzaWdzZXRqbXAgc2lnYWN0aW9uIFwKKwlzaWd2ZWMgc25wcmludGYgc3RyY2FzZWNtcCBzdHJlcnJvciBzdHJmdGltZSBzdHJpY21wIHN0cm5jYXNlY21wIFwKKwlzdHJuaWNtcCBzdHJwYnJrIHN0cnRvbCB0Z2V0ZW50IHRvd2xvd2VyIHRvd3VwcGVyIHVzbGVlcCB1dGltZSB1dGltZXMKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY4ODg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY4OTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjkxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RfYmxrc2l6ZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njk0MjogY2hlY2tpbmcgZm9yIHN0X2Jsa3NpemUiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjk0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2ludCBtYWluKCkgeworCXN0cnVjdCBzdGF0IHN0OworCWludCBuOworCisJc3RhdCgiLyIsICZzdCk7CisJbiA9IChpbnQpc3Quc3RfYmxrc2l6ZTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTU2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RfQkxLU0laRSAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0KCkgaWdub3JlcyBhIHRyYWlsaW5nIHNsYXNoIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2OTcxOiBjaGVja2luZyB3aGV0aGVyIHN0YXQoKSBpZ25vcmVzIGEgdHJhaWxpbmcgc2xhc2giID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0iIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2OTc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorbWFpbigpIHtzdHJ1Y3Qgc3RhdCBzdDsgIGV4aXQoc3RhdCgiY29uZmlndXJlLyIsICZzdCkgIT0gMCk7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVEFUX0lHTk9SRVNfU0xBU0ggMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaWNvbnZfb3BlbigpIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2OTk5OiBjaGVja2luZyBmb3IgaWNvbnZfb3BlbigpIiA+JjUKK3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSIkTElCUyAtbGljb252IgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzAwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX0lDT05WX0gKKyMgaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorICAgIAoraW50IG1haW4oKSB7CitpY29udl9vcGVuKCJmciIsICJ0byIpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXM7IHdpdGggLWxpY29udiIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfSUNPTlYgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgTElCUz0iJHNhdmVfTElCUyIKKyAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MDI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfSUNPTlZfSAorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisJCitpbnQgbWFpbigpIHsKK2ljb252X29wZW4oImZyIiwgInRvIik7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAzNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfSUNPTlYgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvKENPREVTRVQpIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MDU1OiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8oQ09ERVNFVCkiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzA1NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKKyMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKmNzID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTkxfTEFOR0lORk9fQ09ERVNFVCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgLS1kaXNhYmxlLWFjbCBhcmd1bWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzA4MzogY2hlY2tpbmcgLS1kaXNhYmxlLWFjbCBhcmd1bWVudCIgPiY1CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYWNsIG9yIC0tZGlzYWJsZS1hY2wgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYWNsK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9hY2wiCisgIDoKK2Vsc2UKKyAgZW5hYmxlX2FjbD0ieWVzIgorZmkKKworaWYgdGVzdCAiJGVuYWJsZV9hY2wiID0gInllcyI7IHRoZW4KK2VjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFjbF9nZXRfZmlsZSBpbiAtbHBvc2l4MWUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcwOTU6IGNoZWNraW5nIGZvciBhY2xfZ2V0X2ZpbGUgaW4gLWxwb3NpeDFlIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gcG9zaXgxZSdfJ2FjbF9nZXRfZmlsZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxwb3NpeDFlICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcxMDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBhY2xfZ2V0X2ZpbGUoKTsKKworaW50IG1haW4oKSB7CithY2xfZ2V0X2ZpbGUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcxMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIExJQlM9IiRMSUJTIC1scG9zaXgxZSIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWNsX2dldF9maWxlIGluIC1sYWNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MTMzOiBjaGVja2luZyBmb3IgYWNsX2dldF9maWxlIGluIC1sYWNsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gYWNsJ18nYWNsX2dldF9maWxlIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGFjbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MTQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYWNsX2dldF9maWxlKCk7CisKK2ludCBtYWluKCkgeworYWNsX2dldF9maWxlKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBMSUJTPSIkTElCUyAtbGFjbCIKKwkJICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZmdldHhhdHRyIGluIC1sYXR0ciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzE2OTogY2hlY2tpbmcgZm9yIGZnZXR4YXR0ciBpbiAtbGF0dHIiID4mNQorYWNfbGliX3Zhcj1gZWNobyBhdHRyJ18nZmdldHhhdHRyIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGF0dHIgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzE3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGZnZXR4YXR0cigpOworCitpbnQgbWFpbigpIHsKK2ZnZXR4YXR0cigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzE4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWxhdHRyIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWCBBQ0wgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzIxNjogY2hlY2tpbmcgZm9yIFBPU0lYIEFDTCBzdXBwb3J0IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcyMTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfQUNMX0gKKyMgaW5jbHVkZSA8c3lzL2FjbC5oPgorI2VuZGlmCithY2xfdCBhY2w7CitpbnQgbWFpbigpIHsKK2FjbCA9IGFjbF9nZXRfZmlsZSgiZm9vIiwgQUNMX1RZUEVfQUNDRVNTKTsKKwlhY2xfc2V0X2ZpbGUoImZvbyIsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKKwlhY2xfZnJlZShhY2wpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcyMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1BPU0lYX0FDTCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFNvbGFyaXMgQUNMIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcyNDc6IGNoZWNraW5nIGZvciBTb2xhcmlzIEFDTCBzdXBwb3J0IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcyNDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9TWVNfQUNMX0gKKyMgaW5jbHVkZSA8c3lzL2FjbC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2FjbCgiZm9vIiwgR0VUQUNMQ05ULCAwLCBOVUxMKTsKKwkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TT0xBUklTX0FDTCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFJWCBBQ0wgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzI3NTogY2hlY2tpbmcgZm9yIEFJWCBBQ0wgc3VwcG9ydCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3Mjc3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIEhBVkVfU1lTX0FDTF9ICisjIGluY2x1ZGUgPHN5cy9hY2wuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0FDQ0VTU19ICisjIGluY2x1ZGUgPHN5cy9hY2Nlc3MuaD4KKyNlbmRpZgorI2RlZmluZSBfQUxMX1NPVVJDRQorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworaW50IGFjbHNpemU7CitzdHJ1Y3QgYWNsICphY2xlbnQ7CitpbnQgbWFpbigpIHsKK2FjbHNpemUgPSBzaXplb2Yoc3RydWN0IGFjbCk7CisJYWNsZW50ID0gKHZvaWQgKiltYWxsb2MoYWNsc2l6ZSk7CisJc3RhdGFjbCgiZm9vIiwgU1RYX05PUk1BTCwgYWNsZW50LCBhY2xzaXplKTsKKwkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mjk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BSVhfQUNMIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyAtLWRpc2FibGUtZ3BtIGFyZ3VtZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MzE3OiBjaGVja2luZyAtLWRpc2FibGUtZ3BtIGFyZ3VtZW50IiA+JjUKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ncG0gb3IgLS1kaXNhYmxlLWdwbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ncG0rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2dwbSIKKyAgOgorZWxzZQorICBlbmFibGVfZ3BtPSJ5ZXMiCitmaQorCisKK2lmIHRlc3QgIiRlbmFibGVfZ3BtIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBncG0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjczMzA6IGNoZWNraW5nIGZvciBncG0iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3ZpX2N2X2hhdmVfZ3BtJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgb2xpYnM9IiRMSUJTIiA7IExJQlM9Ii1sZ3BtIgorCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDczMzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGdwbS5oPgorCSAgICAjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KK2ludCBtYWluKCkgeworR3BtX0dldExpYlZlcnNpb24oTlVMTCk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgCSAgICAJICAgIHZpX2N2X2hhdmVfZ3BtPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICB2aV9jdl9oYXZlX2dwbT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCUxJQlM9IiRvbGlicyIKKyAgICAKK2ZpCisKK2VjaG8gIiRhY190IiIkdmlfY3ZfaGF2ZV9ncG0iIDE+JjYKKyAgaWYgdGVzdCAkdmlfY3ZfaGF2ZV9ncG0gPSB5ZXM7IHRoZW4KKyAgICBMSUJTPSIkTElCUyAtbGdwbSIKKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HUE0gMQorRU9GCisKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MzcxOiBjaGVja2luZyBmb3IgdnNucHJpbnRmKCkiID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0iIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3Mzc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisJLyogQ2hlY2sgdXNlIG9mIHZzbnByaW50ZigpICovCisJdm9pZCB3YXJuKGNoYXIgKmZtdCwgLi4uKTsKKwl2b2lkIHdhcm4oY2hhciAqZm10LCAuLi4pCisJeworCSAgdmFfbGlzdCBhcDsgY2hhciBidWZbMjBdOworCSAgdmFfc3RhcnQoYXAsIGZtdCk7CisJICB2c25wcmludGYoYnVmLCAyMCwgZm10LCBhcCk7CisJICB2YV9lbmQoYXApOworCX0KKwltYWluKCkKKwl7CisJd2FybigidGVzdGluZyAlc1xuIiwgImEgdmVyeSBsb25nIHN0cmluZyB0aGF0IHdvbid0IGZpdCIpOworCWV4aXQoMCk7CisJfQorCSAgICAKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mzk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1ZTTlBSSU5URiAxCitFT0YKKyBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVuYW1lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NDE1OiBjaGVja2luZyBmb3IgcmVuYW1lIiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc0MTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpIHsKK3JlbmFtZSgidGhpcyIsICJ0aGF0IikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9SRU5BTUUgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXNjdGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc0Mzk6IGNoZWNraW5nIGZvciBzeXNjdGwiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzQ0MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgoraW50IG1haW4oKSB7CisJaW50IG1pYlsyXSwgcjsKKwlzaXplX3QgbGVuOworCisJbWliWzBdID0gQ1RMX0hXOworCW1pYlsxXSA9IEhXX1VTRVJNRU07CisJbGVuID0gc2l6ZW9mKHIpOworCSh2b2lkKXN5c2N0bChtaWIsIDIsICZyLCAmbGVuLCAodm9pZCAqKTAsIChzaXplX3QpMCk7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQ1NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NZU0NUTCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm90IHVzYWJsZSIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzaW5mbyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzQ3MTogY2hlY2tpbmcgZm9yIHN5c2luZm8iID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzQ3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KK2ludCBtYWluKCkgeworCXN0cnVjdCBzeXNpbmZvIHNpbmZvOworCWludCB0OworCisJKHZvaWQpc3lzaW5mbygmc2luZm8pOworCXQgPSBzaW5mby50b3RhbHJhbTsKKwkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1lTSU5GTyAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm90IHVzYWJsZSIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzY29uZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzUwMTogY2hlY2tpbmcgZm9yIHN5c2NvbmYiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzUwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CitpbnQgbWFpbigpIHsKKwkodm9pZClzeXNjb25mKF9TQ19QQUdFU0laRSk7CisJKHZvaWQpc3lzY29uZihfU0NfUEhZU19QQUdFUyk7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzUxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NZU0NPTkYgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vdCB1c2FibGUiIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKworCitlY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIGludCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzUyODogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9pbnQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGZhaWxlZCB0byBjb21waWxlIHRlc3QgcHJvZ3JhbSIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc1MzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisJCW1haW4oKQorCQl7CisJCSAgRklMRSAqZj1mb3BlbigiY29uZnRlc3R2YWwiLCAidyIpOworCQkgIGlmICghZikgZXhpdCgxKTsKKwkJICBmcHJpbnRmKGYsICIlZFxuIiwgKGludClzaXplb2YoaW50KSk7CisJCSAgZXhpdCgwKTsKKwkJfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc1NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3Zfc2l6ZW9mX2ludD1gY2F0IGNvbmZ0ZXN0dmFsYAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9zaXplb2ZfaW50PTAKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3NpemVvZl9pbnQiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbWVtbW92ZS9iY29weS9tZW1jcHkgaGFuZGxlIG92ZXJsYXBzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NTY4OiBjaGVja2luZyB3aGV0aGVyIG1lbW1vdmUvYmNvcHkvbWVtY3B5IGhhbmRsZSBvdmVybGFwcyIgPiY1CitiY29weV90ZXN0X3Byb2c9JworbWFpbigpIHsKKyAgY2hhciBidWZbMTBdOworICBzdHJjcHkoYnVmLCAiYWJjZGVmZ2hpIik7CisgIG1jaF9tZW1tb3ZlKGJ1ZiwgYnVmICsgMiwgMyk7CisgIGlmIChzdHJuY21wKGJ1ZiwgImFiYWJjZiIsIDYpKQorICAgIGV4aXQoMSk7CisgIHN0cmNweShidWYsICJhYmNkZWZnaGkiKTsKKyAgbWNoX21lbW1vdmUoYnVmICsgMiwgYnVmLCAzKTsKKyAgaWYgKHN0cm5jbXAoYnVmLCAiY2RlZGVmIiwgNikpCisgICAgZXhpdCgxKTsKKyAgZXhpdCgwKTsgLyogbGliYyB2ZXJzaW9uIHdvcmtzIHByb3Blcmx5LiAgKi8KK30nCisKKworaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0iIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NTg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNkZWZpbmUgbWNoX21lbW1vdmUocyxkLGwpIG1lbW1vdmUoZCxzLGwpICRiY29weV90ZXN0X3Byb2cKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NTkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBVU0VNRU1NT1ZFIDEKK0VPRgorIGVjaG8gIiRhY190IiJtZW1tb3ZlIGRvZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0iIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NjA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNkZWZpbmUgbWNoX21lbW1vdmUocyxkLGwpIGJjb3B5KGQscyxsKSAkYmNvcHlfdGVzdF9wcm9nCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzYxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNFQkNPUFkgMQorRU9GCisgZWNobyAiJGFjX3QiImJjb3B5IGRvZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0iIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NjI0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNkZWZpbmUgbWNoX21lbW1vdmUocyxkLGwpIG1lbWNweShkLHMsbCkgJGJjb3B5X3Rlc3RfcHJvZworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFVTRU1FTUNQWSAxCitFT0YKKyBlY2hvICIkYWNfdCIibWVtY3B5IGRvZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCisKKworaWYgdGVzdCAiJGVuYWJsZV9tdWx0aWJ5dGUiID0gInllcyI7IHRoZW4KKyAgY2ZsYWdzX3NhdmU9JENGTEFHUworICBsZGZsYWdzX3NhdmU9JExERkxBR1MKKyAgaWYgdGVzdCAtbiAiJHhfaW5jbHVkZXMiIDsgdGhlbgorICAgIENGTEFHUz0iJENGTEFHUyAtSSR4X2luY2x1ZGVzIgorICAgIExERkxBR1M9IiRYX0xJQlMgJExERkxBR1MgLWxYMTEiCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBYX0xPQ0FMRSBuZWVkZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc2NjA6IGNoZWNraW5nIHdoZXRoZXIgWF9MT0NBTEUgbmVlZGVkIiA+JjUKKyAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NjYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxYMTEvWGxvY2FsZS5oPgoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NjY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzY3MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIF9Yc2V0bG9jYWxlKCk7CisKK2ludCBtYWluKCkgeworX1hzZXRsb2NhbGUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2ODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKwkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFhfTE9DQUxFIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgZmkKKyAgQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorICBMREZMQUdTPSRsZGZsYWdzX3NhdmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBfeHBnNF9zZXRydW5lbG9jYWxlIGluIC1seHBnNCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzcxMDogY2hlY2tpbmcgZm9yIF94cGc0X3NldHJ1bmVsb2NhbGUgaW4gLWx4cGc0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8geHBnNCdfJ194cGc0X3NldHJ1bmVsb2NhbGUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1seHBnNCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NzE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgX3hwZzRfc2V0cnVuZWxvY2FsZSgpOworCitpbnQgbWFpbigpIHsKK194cGc0X3NldHJ1bmVsb2NhbGUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc3Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIExJQlM9IiRMSUJTIC1seHBnNCIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBjcmVhdGUgdGFncyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzc1MTogY2hlY2tpbmcgaG93IHRvIGNyZWF0ZSB0YWdzIiA+JjUKK3Rlc3QgLWYgdGFncyAmJiBtdiB0YWdzIHRhZ3Muc2F2ZQoraWYgKGV2YWwgY3RhZ3MgLS12ZXJzaW9uIC9kZXYvbnVsbCB8IGdyZXAgRXh1YmVyYW50KSA8IC9kZXYvbnVsbCAxPiY1IDI+JjE7IHRoZW4KKyAgVEFHUFJHPSJjdGFncyIKK2Vsc2UKKyAgKGV2YWwgZXRhZ3MJICAgL2Rldi9udWxsKSA8IC9kZXYvbnVsbCAxPiY1IDI+JjEgJiYgVEFHUFJHPSJldGFncyIKKyAgKGV2YWwgZXRhZ3MgLWMgICAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JjUgMj4mMSAmJiBUQUdQUkc9ImV0YWdzIC1jIgorICAoZXZhbCBjdGFncwkgICAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JjUgMj4mMSAmJiBUQUdQUkc9ImN0YWdzIgorICAoZXZhbCBjdGFncyAtdCAgIC9kZXYvbnVsbCkgPCAvZGV2L251bGwgMT4mNSAyPiYxICYmIFRBR1BSRz0iY3RhZ3MgLXQiCisgIChldmFsIGN0YWdzIC10cyAgL2Rldi9udWxsKSA8IC9kZXYvbnVsbCAxPiY1IDI+JjEgJiYgVEFHUFJHPSJjdGFncyAtdHMiCisgIChldmFsIGN0YWdzIC10dnMgL2Rldi9udWxsKSA8IC9kZXYvbnVsbCAxPiY1IDI+JjEgJiYgVEFHUFJHPSJjdGFncyAtdHZzIgorICAoZXZhbCBjdGFncyAtaSttIC9kZXYvbnVsbCkgPCAvZGV2L251bGwgMT4mNSAyPiYxICYmIFRBR1BSRz0iY3RhZ3MgLWkrbSIKK2ZpCit0ZXN0IC1mIHRhZ3Muc2F2ZSAmJiBtdiB0YWdzLnNhdmUgdGFncworZWNobyAiJGFjX3QiIiRUQUdQUkciIDE+JjYgCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gbWFuIHdpdGggYSBzZWN0aW9uIG5yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NzY4OiBjaGVja2luZyBob3cgdG8gcnVuIG1hbiB3aXRoIGEgc2VjdGlvbiBuciIgPiY1CitNQU5ERUY9Im1hbiIKKyhldmFsIG1hbiAtcyAyIHJlYWQpIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjUgJiYgTUFOREVGPSJtYW4gLXMiCitlY2hvICIkYWNfdCIiJE1BTkRFRiIgMT4mNgoraWYgdGVzdCAiJE1BTkRFRiIgPSAibWFuIC1zIjsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNFTUFOX1MgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIC0tZGlzYWJsZS1ubHMgYXJndW1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3ODA6IGNoZWNraW5nIC0tZGlzYWJsZS1ubHMgYXJndW1lbnQiID4mNQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICA6CitlbHNlCisgIGVuYWJsZV9ubHM9InllcyIKK2ZpCisKKworaWYgdGVzdCAiJGVuYWJsZV9ubHMiID0gInllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzc5NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGFjX2N2X3Byb2dfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19NU0dGTVQ9Im1zZ2ZtdCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorTVNHRk1UPSIkYWNfY3ZfcHJvZ19NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIE5MUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzgyMjogY2hlY2tpbmcgZm9yIE5MUyIgPiY1CisgIGlmIHRlc3QgLWYgcG8vTWFrZWZpbGU7IHRoZW4KKyAgICBoYXZlX2dldHRleHQ9Im5vIgorICAgIGlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3ODI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK2dldHRleHQoIlRlc3QiKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3ODM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIiZ2V0dGV4dCgpIHdvcmtzIiAxPiY2OyBoYXZlX2dldHRleHQ9InllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgb2xpYnM9JExJQlMKKwkgIExJQlM9IiRMSUJTIC1saW50bCIKKwkgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc4NDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworZ2V0dGV4dCgiVGVzdCIpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc4NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJnZXR0ZXh0KCkgd29ya3Mgd2l0aCAtbGludGwiIDE+JjY7IGhhdmVfZ2V0dGV4dD0ieWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIiZ2V0dGV4dCgpIGRvZXNuJ3Qgd29yayIgMT4mNjsKKwkgICAgICBMSUJTPSRvbGlicworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190IiJtc2dmbXQgbm90IGZvdW5kIC0gZGlzYWJsZWQiIDE+JjY7CisgICAgZmkKKyAgICBpZiB0ZXN0ICRoYXZlX2dldHRleHQgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworICAgICAgTUFLRU1PPXllcworICAgICAgCisgICAgICAgICAgICBmb3IgYWNfZnVuYyBpbiBiaW5kX3RleHRkb21haW5fY29kZXNldAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzg3NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzg4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX25sX21zZ19jYXRfY250ciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzkzMDogY2hlY2tpbmcgZm9yIF9ubF9tc2dfY2F0X2NudHIiID4mNQorICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzkzMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorCQlleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitpbnQgbWFpbigpIHsKKysrX25sX21zZ19jYXRfY250cjsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9OTF9NU0dfQ0FUX0NOVFIgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRhY190IiJubyAicG8vTWFrZWZpbGUiIC0gZGlzYWJsZWQiIDE+JjY7CisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2ZpCisKK2FjX3NhZmU9YGVjaG8gImRsZmNuLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsZmNuLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc5NjM6IGNoZWNraW5nIGZvciBkbGZjbi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3OTY4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTczOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgRExMPWRsZmNuLmgKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CithY19zYWZlPWBlY2hvICJkbC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3OTk0OiBjaGVja2luZyBmb3IgZGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzk5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8ZGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODAwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIERMTD1kbC5oCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworaWYgdGVzdCB4JHtETEx9ID0geGRsZmNuLmg7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfRExGQ05fSCAxCitFT0YKKworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuKCkiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgwMzM6IGNoZWNraW5nIGZvciBkbG9wZW4oKSIgPiY1CisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgwMzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworCQlleHRlcm4gdm9pZCogZGxvcGVuKCk7CisJCWRsb3BlbigpOworICAgICAgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODA0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNjsKKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9ETE9QRU4gMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2OworCSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4oKSBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MDU4OiBjaGVja2luZyBmb3IgZGxvcGVuKCkgaW4gLWxkbCIgPiY1CisJICAgICAgb2xpYnM9JExJQlMKKwkgICAgICBMSUJTPSIkTElCUyAtbGRsIgorCSAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgwNjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworCQkJCWV4dGVybiB2b2lkKiBkbG9wZW4oKTsKKwkJCQlkbG9wZW4oKTsKKwkJIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjgwNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7CisJCQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0RMT1BFTiAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjY7CisJCQkgIExJQlM9JG9saWJzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxzeW0oKSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA5MDogY2hlY2tpbmcgZm9yIGRsc3ltKCkiID4mNQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MDkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKwkJZXh0ZXJuIHZvaWQqIGRsc3ltKCk7CisJCWRsc3ltKCk7CisgICAgICAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OworCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0RMU1lNIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsKKwkgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxzeW0oKSBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MTE1OiBjaGVja2luZyBmb3IgZGxzeW0oKSBpbiAtbGRsIiA+JjUKKwkgICAgICBvbGlicz0kTElCUworCSAgICAgIExJQlM9IiRMSUJTIC1sZGwiCisJICAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODExOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisJCQkJZXh0ZXJuIHZvaWQqIGRsc3ltKCk7CisJCQkJZGxzeW0oKTsKKwkJIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjgxMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7CisJCQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0RMU1lNIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsKKwkJCSAgTElCUz0kb2xpYnMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VsaWYgdGVzdCB4JHtETEx9ID0geGRsLmg7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfRExfSCAxCitFT0YKKworICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQoKSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODE1MjogY2hlY2tpbmcgZm9yIHNobF9sb2FkKCkiID4mNQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MTU0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKwkJZXh0ZXJuIHZvaWQqIHNobF9sb2FkKCk7CisJCXNobF9sb2FkKCk7CisgICAgIAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjgxNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7CisJICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TSExfTE9BRCAxCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjY7CisJICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQoKSBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODE3NzogY2hlY2tpbmcgZm9yIHNobF9sb2FkKCkgaW4gLWxkbGQiID4mNQorCSAgb2xpYnM9JExJQlMKKwkgIExJQlM9IiRMSUJTIC1sZGxkIgorCSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODE4MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisJCQlleHRlcm4gdm9pZCogc2hsX2xvYWQoKTsKKwkJCXNobF9sb2FkKCk7CisJICAgICAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2OworCQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NITF9MT0FEIDEKK0VPRgorCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNjsKKwkJICBMSUJTPSRvbGlicworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2ZvciBhY19oZHIgaW4gc2V0am1wLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjEzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODIxOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODIyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworaWYgdGVzdCAieCRNQUNPU1giID0gInh5ZXMiIC1hIC1uICIkUEVSTCI7IHRoZW4KKyAgICBpZiBlY2hvICRMSUJTIHwgZ3JlcCAtZSAnLWxkbCcgPi9kZXYvbnVsbDsgdGhlbgorICAgIExJQlM9YGVjaG8gJExJQlMgfCBzZWQgcy8tbGRsLy9gCisgICAgUEVSTF9MSUJTPSIkUEVSTF9MSUJTIC1sZGwiCisgIGZpCitmaQorCitpZiB0ZXN0ICJ4JE1BQ09TWCIgPSAieHllcyIgJiYgdGVzdCAieCRDQVJCT04iID0gInh5ZXMiIFwKKwkmJiB0ZXN0ICJ4JEdVSVRZUEUiICE9ICJ4Q0FSQk9OR1VJIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIG5lZWQgLWZyYW1ld29yayBDYXJib24iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyNjA6IGNoZWNraW5nIHdoZXRoZXIgd2UgbmVlZCAtZnJhbWV3b3JrIENhcmJvbiIgPiY1CisgICAgaWYgdGVzdCAieCRlbmFibGVfbXVsdGlieXRlIiA9ICJ4eWVzIiB8fCB0ZXN0ICJ4JGZlYXR1cmVzIiA9PSAieGJpZyIgXAorCXx8IHRlc3QgIngkZmVhdHVyZXMiID0gInhodWdlIjsgdGhlbgorICAgIExJQlM9IiRMSUJTIC1mcmFtZXdvcmsgQ2FyYm9uIgorICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWxzZQorICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBmaQorZmkKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGF1dG8vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gImF1dG8vY29uZmlnLm1rOmNvbmZpZy5tay5pbiBhdXRvL2NvbmZpZy5oOmNvbmZpZy5oLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBGRkxBR1NAJSRGRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENDQCUkQ0MlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFXS0AlJEFXSyVnCitzJUBTVFJJUEAlJFNUUklQJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCitzJUBDUFBfTU1AJSRDUFBfTU0lZworcyVAT1NfRVhUUkFfU1JDQCUkT1NfRVhUUkFfU1JDJWcKK3MlQE9TX0VYVFJBX09CSkAlJE9TX0VYVFJBX09CSiVnCitzJUBWSU1OQU1FQCUkVklNTkFNRSVnCitzJUBFWE5BTUVAJSRFWE5BTUUlZworcyVAVklFV05BTUVAJSRWSUVXTkFNRSVnCitzJUBsaW5lX2JyZWFrQCUkbGluZV9icmVhayVnCitzJUBkb3ZpbWRpZmZAJSRkb3ZpbWRpZmYlZworcyVAZG9ndmltZGlmZkAlJGRvZ3ZpbWRpZmYlZworcyVAY29tcGlsZWRieUAlJGNvbXBpbGVkYnklZworcyVAdmlfY3ZfcGF0aF9wZXJsQCUkdmlfY3ZfcGF0aF9wZXJsJWcKK3MlQHZpX2N2X3BlcmxsaWJAJSR2aV9jdl9wZXJsbGliJWcKK3MlQHNocnBlbnZAJSRzaHJwZW52JWcKK3MlQFBFUkxfU1JDQCUkUEVSTF9TUkMlZworcyVAUEVSTF9PQkpAJSRQRVJMX09CSiVnCitzJUBQRVJMX1BST0AlJFBFUkxfUFJPJWcKK3MlQFBFUkxfQ0ZMQUdTQCUkUEVSTF9DRkxBR1MlZworcyVAUEVSTF9MSUJTQCUkUEVSTF9MSUJTJWcKK3MlQHZpX2N2X3BhdGhfcHl0aG9uQCUkdmlfY3ZfcGF0aF9weXRob24lZworcyVAUFlUSE9OX0NPTkZESVJAJSRQWVRIT05fQ09ORkRJUiVnCitzJUBQWVRIT05fTElCU0AlJFBZVEhPTl9MSUJTJWcKK3MlQFBZVEhPTl9HRVRQQVRIX0NGTEFHU0AlJFBZVEhPTl9HRVRQQVRIX0NGTEFHUyVnCitzJUBQWVRIT05fQ0ZMQUdTQCUkUFlUSE9OX0NGTEFHUyVnCitzJUBQWVRIT05fU1JDQCUkUFlUSE9OX1NSQyVnCitzJUBQWVRIT05fT0JKQCUkUFlUSE9OX09CSiVnCitzJUB2aV9jdl9wYXRoX3RjbEAlJHZpX2N2X3BhdGhfdGNsJWcKK3MlQFRDTF9TUkNAJSRUQ0xfU1JDJWcKK3MlQFRDTF9PQkpAJSRUQ0xfT0JKJWcKK3MlQFRDTF9QUk9AJSRUQ0xfUFJPJWcKK3MlQFRDTF9DRkxBR1NAJSRUQ0xfQ0ZMQUdTJWcKK3MlQFRDTF9MSUJTQCUkVENMX0xJQlMlZworcyVAdmlfY3ZfcGF0aF9ydWJ5QCUkdmlfY3ZfcGF0aF9ydWJ5JWcKK3MlQFJVQllfU1JDQCUkUlVCWV9TUkMlZworcyVAUlVCWV9PQkpAJSRSVUJZX09CSiVnCitzJUBSVUJZX1BST0AlJFJVQllfUFJPJWcKK3MlQFJVQllfQ0ZMQUdTQCUkUlVCWV9DRkxBR1MlZworcyVAUlVCWV9MSUJTQCUkUlVCWV9MSUJTJWcKK3MlQFdPUktTSE9QX1NSQ0AlJFdPUktTSE9QX1NSQyVnCitzJUBXT1JLU0hPUF9PQkpAJSRXT1JLU0hPUF9PQkolZworcyVATkVUQkVBTlNfU1JDQCUkTkVUQkVBTlNfU1JDJWcKK3MlQE5FVEJFQU5TX09CSkAlJE5FVEJFQU5TX09CSiVnCitzJUBTTklGRl9TUkNAJSRTTklGRl9TUkMlZworcyVAU05JRkZfT0JKQCUkU05JRkZfT0JKJWcKK3MlQHhta21mcGF0aEAlJHhta21mcGF0aCVnCitzJUBYX0NGTEFHU0AlJFhfQ0ZMQUdTJWcKK3MlQFhfUFJFX0xJQlNAJSRYX1BSRV9MSUJTJWcKK3MlQFhfTElCU0AlJFhfTElCUyVnCitzJUBYX0VYVFJBX0xJQlNAJSRYX0VYVFJBX0xJQlMlZworcyVAWF9MSUJAJSRYX0xJQiVnCitzJUBHVEtfQ09ORklHQCUkR1RLX0NPTkZJRyVnCitzJUBHVEsxMl9DT05GSUdAJSRHVEsxMl9DT05GSUclZworcyVAUEtHX0NPTkZJR0AlJFBLR19DT05GSUclZworcyVAR1RLX0NGTEFHU0AlJEdUS19DRkxBR1MlZworcyVAR1RLX0xJQlNAJSRHVEtfTElCUyVnCitzJUBHVEtfTElCTkFNRUAlJEdUS19MSUJOQU1FJWcKK3MlQEdOT01FX0xJQlNAJSRHTk9NRV9MSUJTJWcKK3MlQEdOT01FX0xJQkRJUkAlJEdOT01FX0xJQkRJUiVnCitzJUBHTk9NRV9JTkNMVURFRElSQCUkR05PTUVfSU5DTFVERURJUiVnCitzJUBHTk9NRV9DT05GSUdAJSRHTk9NRV9DT05GSUclZworcyVATU9USUZfTElCTkFNRUAlJE1PVElGX0xJQk5BTUUlZworcyVATkFSUk9XX1BST1RPQCUkTkFSUk9XX1BST1RPJWcKK3MlQEdVSV9JTkNfTE9DQCUkR1VJX0lOQ19MT0MlZworcyVAR1VJX0xJQl9MT0NAJSRHVUlfTElCX0xPQyVnCitzJUBHVUlUWVBFQCUkR1VJVFlQRSVnCitzJUBHVUlfWF9MSUJTQCUkR1VJX1hfTElCUyVnCitzJUBIQU5HVUxJTl9TUkNAJSRIQU5HVUxJTl9TUkMlZworcyVASEFOR1VMSU5fT0JKQCUkSEFOR1VMSU5fT0JKJWcKK3MlQFRBR1BSR0AlJFRBR1BSRyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVATUFLRU1PQCUkTUFLRU1PJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtImF1dG8vY29uZmlnLm1rOmNvbmZpZy5tay5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImF1dG8vY29uZmlnLmg6Y29uZmlnLmguaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc3JjL2JpZ3ZpbS5iYXQgYi9zcmMvYmlndmltLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIxMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JpZ3ZpbS5iYXQKQEAgLTAsMCArMSwzIEBACis6OiBjb21tYW5kIHRvIGJ1aWxkIGJpZyBWaW0gd2l0aCBPTEUsIFBlcmwsIFB5dGhvbiwgUnVieSBhbmQgVGNsCitubWFrZSAtZiBNYWtlX212Yy5tYWsgR1VJPXllcyBPTEU9eWVzIFBFUkw9RTpccGVybDU4IERZTkFNSUNfUEVSTD15ZXMgUEVSTF9WRVI9NTggUFlUSE9OPWU6XHB5dGhvbjIzIERZTkFNSUNfUFlUSE9OPXllcyBQWVRIT05fVkVSPTIzIFJVQlk9ZTpccnVieTE4IERZTkFNSUNfUlVCWT15ZXMgUlVCWV9WRVI9MTggUlVCWV9WRVJfTE9ORz0xLjggVENMPWU6XHRjbCBEWU5BTUlDX1RDTD15ZXMgJTEgSU1FPXllcyBDU0NPUEU9eWVzIFhQTT1lOlx4cG0KKwpkaWZmIC0tZ2l0IGEvc3JjL2J1ZmZlci5jIGIvc3JjL2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjU3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVmZmVyLmMKQEAgLTAsMCArMSw1MDcxIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBidWZmZXIuYzogZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUKKyAqLworCisvKgorICogVGhlIGJ1ZmZlciBsaXN0IGlzIGEgZG91YmxlIGxpbmtlZCBsaXN0IG9mIGFsbCBidWZmZXJzLgorICogRWFjaCBidWZmZXIgY2FuIGJlIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXM6CisgKiBuZXZlciBsb2FkZWQ6IEJGX05FVkVSTE9BREVEIGlzIHNldCwgb25seSB0aGUgZmlsZSBuYW1lIGlzIHZhbGlkCisgKiAgIG5vdCBsb2FkZWQ6IGJfbWwubWxfbWZwID09IE5VTEwsIG5vIG1lbWZpbGUgYWxsb2NhdGVkCisgKgkgaGlkZGVuOiBiX253aW5kb3dzID09IDAsIGxvYWRlZCBidXQgbm90IGRpc3BsYXllZCBpbiBhIHdpbmRvdworICoJIG5vcm1hbDogbG9hZGVkIGFuZCBkaXNwbGF5ZWQgaW4gYSB3aW5kb3cKKyAqCisgKiBJbnN0ZWFkIG9mIHN0b3JpbmcgZmlsZSBuYW1lcyBhbGwgb3ZlciB0aGUgcGxhY2UsIGVhY2ggZmlsZSBuYW1lIGlzCisgKiBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBsaXN0LiBJdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBhIG51bWJlci4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZW1lbWJlcnMgYWxsIGZpbGUgbmFtZXMgZXZlciB1c2VkLgorICovCisKKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoRkVBVF9MSVNUQ01EUykgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoRkVBVF9QRVJMKQorc3RhdGljIGNoYXJfdQkqYnVmbGlzdF9tYXRjaCBfX0FSR1MoKHJlZ3Byb2dfVCAqcHJvZywgYnVmX1QgKmJ1ZikpOworIyBkZWZpbmUgSEFWRV9CVUZMSVNUX01BVENICitzdGF0aWMgY2hhcl91CSpmbmFtZV9tYXRjaCBfX0FSR1MoKHJlZ3Byb2dfVCAqcHJvZywgY2hhcl91ICpuYW1lKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCWJ1Zmxpc3Rfc2V0ZnBvcyBfX0FSR1MoKGJ1Zl9UICpidWYsIHdpbl9UICp3aW4sIGxpbmVucl9UIGxudW0sIGNvbG5yX1QgY29sLCBpbnQgY29weV9vcHRpb25zKSk7CitzdGF0aWMgd2luaW5mb19UICpmaW5kX3dpbmluZm8gX19BUkdTKChidWZfVCAqYnVmKSk7CisjaWZkZWYgVU5JWAorc3RhdGljIGJ1Zl9UCSpidWZsaXN0X2ZpbmRuYW1lX3N0YXQgX19BUkdTKChjaGFyX3UgKmZmbmFtZSwgc3RydWN0IHN0YXQgKnN0KSk7CitzdGF0aWMgaW50CW90aGVyZmlsZV9idWYgX19BUkdTKChidWZfVCAqYnVmLCBjaGFyX3UgKmZmbmFtZSwgc3RydWN0IHN0YXQgKnN0cCkpOworc3RhdGljIGludAlidWZfc2FtZV9pbm8gX19BUkdTKChidWZfVCAqYnVmLCBzdHJ1Y3Qgc3RhdCAqc3RwKSk7CisjZWxzZQorc3RhdGljIGludAlvdGhlcmZpbGVfYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZiwgY2hhcl91ICpmZm5hbWUpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVElUTEUKK3N0YXRpYyBpbnQJdGlfY2hhbmdlIF9fQVJHUygoY2hhcl91ICpzdHIsIGNoYXJfdSAqKmxhc3QpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJZnJlZV9idWZmZXIgX19BUkdTKChidWZfVCAqKSk7CitzdGF0aWMgdm9pZAlmcmVlX2J1ZmZlcl9zdHVmZiBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBmcmVlX29wdGlvbnMpKTsKK3N0YXRpYyB2b2lkCWNsZWFyX3dpbmluZm8gX19BUkdTKChidWZfVCAqYnVmKSk7CisKKyNpZmRlZiBVTklYCisjIGRlZmluZSBkZXZfVCBkZXZfdAorI2Vsc2UKKyMgZGVmaW5lIGRldl9UIHVuc2lnbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9TSUdOUykKK3N0YXRpYyB2b2lkIGluc2VydF9zaWduIF9fQVJHUygoYnVmX1QgKmJ1Ziwgc2lnbmxpc3RfVCAqcHJldiwgc2lnbmxpc3RfVCAqbmV4dCwgaW50IGlkLCBsaW5lbnJfVCBsbnVtLCBpbnQgdHlwZW5yKSk7CitzdGF0aWMgdm9pZCBidWZfZGVsZXRlX3NpZ25zIF9fQVJHUygoYnVmX1QgKmJ1ZikpOworI2VuZGlmCisKKy8qCisgKiBPcGVuIGN1cnJlbnQgYnVmZmVyLCB0aGF0IGlzOiBvcGVuIHRoZSBtZW1maWxlIGFuZCByZWFkIHRoZSBmaWxlIGludG8gbWVtb3J5CisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK29wZW5fYnVmZmVyKHJlYWRfc3RkaW4sIGVhcCkKKyAgICBpbnQJCXJlYWRfc3RkaW47CSAgICAvKiByZWFkIGZpbGUgZnJvbSBzdGRpbiAqLworICAgIGV4YXJnX1QJKmVhcDsJCSAgICAvKiBmb3IgZm9yY2VkICdmZicgYW5kICdmZW5jJyBvciBOVUxMICovCit7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBidWZfVAkqb2xkX2N1cmJ1ZjsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBUaGUgJ3JlYWRvbmx5JyBmbGFnIGlzIG9ubHkgc2V0IHdoZW4gQkZfTkVWRVJMT0FERUQgaXMgYmVpbmcgcmVzZXQuCisgICAgICogV2hlbiByZS1lbnRlcmluZyB0aGUgc2FtZSBidWZmZXIsIGl0IHNob3VsZCBub3QgY2hhbmdlLCBiZWNhdXNlIHRoZQorICAgICAqIHVzZXIgbWF5IGhhdmUgcmVzZXQgdGhlIGZsYWcgYnkgaGFuZC4KKyAgICAgKi8KKyAgICBpZiAocmVhZG9ubHltb2RlICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTAorCQkJCQkmJiAoY3VyYnVmLT5iX2ZsYWdzICYgQkZfTkVWRVJMT0FERUQpKQorCWN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsKKworICAgIGlmIChtbF9vcGVuKCkgPT0gRkFJTCkKKyAgICB7CisJLyoKKwkgKiBUaGVyZSBNVVNUIGJlIGEgbWVtZmlsZSwgb3RoZXJ3aXNlIHdlIGNhbid0IGRvIGFueXRoaW5nCisJICogSWYgd2UgY2FuJ3QgY3JlYXRlIG9uZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLCB0YWtlIGFub3RoZXIgYnVmZmVyCisJICovCisJY2xvc2VfYnVmZmVyKE5VTEwsIGN1cmJ1ZiwgMCk7CisJZm9yIChjdXJidWYgPSBmaXJzdGJ1ZjsgY3VyYnVmICE9IE5VTEw7IGN1cmJ1ZiA9IGN1cmJ1Zi0+Yl9uZXh0KQorCSAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCQlicmVhazsKKwkvKgorCSAqIGlmIHRoZXJlIGlzIG5vIG1lbWZpbGUgYXQgYWxsLCBleGl0CisJICogVGhpcyBpcyBPSywgc2luY2UgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gbG9vc2UuCisJICovCisJaWYgKGN1cmJ1ZiA9PSBOVUxMKQorCXsKKwkgICAgRU1TRyhfKCJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIikpOworCSAgICBnZXRvdXQoMik7CisJfQorCUVNU0coXygiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iKSk7CisJZW50ZXJfYnVmZmVyKGN1cmJ1Zik7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogVGhlIGF1dG9jb21tYW5kcyBpbiByZWFkZmlsZSgpIG1heSBjaGFuZ2UgdGhlIGJ1ZmZlciwgYnV0IG9ubHkgQUZURVIKKyAgICAgKiByZWFkaW5nIHRoZSBmaWxlLiAqLworICAgIG9sZF9jdXJidWYgPSBjdXJidWY7CisgICAgbW9kaWZpZWRfd2FzX3NldCA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKiBtYXJrIGN1cnNvciBwb3NpdGlvbiBhcyBiZWluZyBpbnZhbGlkICovCisgICAgY2hhbmdlZF9saW5lX2Fidl9jdXJzKCk7CisKKyAgICBpZiAoY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJICAgICYmIG5ldGJlYW5zUmVhZEZpbGUKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJaW50IG9sZEZpcmUgPSBuZXRiZWFuc0ZpcmVDaGFuZ2VzOworCisJbmV0YmVhbnNGaXJlQ2hhbmdlcyA9IDA7CisjZW5kaWYKKwlyZXR2YWwgPSByZWFkZmlsZShjdXJidWYtPmJfZmZuYW1lLCBjdXJidWYtPmJfZm5hbWUsCisJCSAgKGxpbmVucl9UKTAsIChsaW5lbnJfVCkwLCAobGluZW5yX1QpTUFYTE5VTSwgZWFwLCBSRUFEX05FVyk7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJbmV0YmVhbnNGaXJlQ2hhbmdlcyA9IG9sZEZpcmU7CisjZW5kaWYKKwkvKiBIZWxwIGJ1ZmZlciBpcyBmaWx0ZXJlZC4gKi8KKwlpZiAoY3VyYnVmLT5iX2hlbHApCisJICAgIGZpeF9oZWxwX2J1ZmZlcigpOworICAgIH0KKyAgICBlbHNlIGlmIChyZWFkX3N0ZGluKQorICAgIHsKKwlpbnQJCXNhdmVfYmluID0gY3VyYnVmLT5iX3BfYmluOworCWxpbmVucl9UCWxpbmVfY291bnQ7CisKKwkvKgorCSAqIEZpcnN0IHJlYWQgdGhlIHRleHQgaW4gYmluYXJ5IG1vZGUgaW50byB0aGUgYnVmZmVyLgorCSAqIFRoZW4gcmVhZCBmcm9tIHRoYXQgc2FtZSBidWZmZXIgYW5kIGFwcGVuZCBhdCB0aGUgZW5kLiAgVGhpcyBtYWtlcworCSAqIGl0IHBvc3NpYmxlIHRvIHJldHJ5IHdoZW4gJ2ZpbGVmb3JtYXQnIG9yICdmaWxlZW5jb2RpbmcnIHdhcworCSAqIGd1ZXNzZWQgd3JvbmcuCisJICovCisJY3VyYnVmLT5iX3BfYmluID0gVFJVRTsKKwlyZXR2YWwgPSByZWFkZmlsZShOVUxMLCBOVUxMLCAobGluZW5yX1QpMCwKKwkJICAobGluZW5yX1QpMCwgKGxpbmVucl9UKU1BWExOVU0sIE5VTEwsIFJFQURfTkVXICsgUkVBRF9TVERJTik7CisJY3VyYnVmLT5iX3BfYmluID0gc2F2ZV9iaW47CisJaWYgKHJldHZhbCA9PSBPSykKKwl7CisJICAgIGxpbmVfY291bnQgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgcmV0dmFsID0gcmVhZGZpbGUoTlVMTCwgTlVMTCwgKGxpbmVucl9UKWxpbmVfY291bnQsCisJCQkgICAgKGxpbmVucl9UKTAsIChsaW5lbnJfVClNQVhMTlVNLCBlYXAsIFJFQURfQlVGRkVSKTsKKwkgICAgaWYgKHJldHZhbCA9PSBPSykKKwkgICAgeworCQkvKiBEZWxldGUgdGhlIGJpbmFyeSBsaW5lcy4gKi8KKwkJd2hpbGUgKC0tbGluZV9jb3VudCA+PSAwKQorCQkgICAgbWxfZGVsZXRlKChsaW5lbnJfVCkxLCBGQUxTRSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIERlbGV0ZSB0aGUgY29udmVydGVkIGxpbmVzLiAqLworCQl3aGlsZSAoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPiBsaW5lX2NvdW50KQorCQkgICAgbWxfZGVsZXRlKGxpbmVfY291bnQsIEZBTFNFKTsKKwkgICAgfQorCSAgICAvKiBQdXQgdGhlIGN1cnNvciBvbiB0aGUgZmlyc3QgbGluZS4gKi8KKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gMTsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworI2lmZGVmIEZFQVRfQVVUT0NNRAorIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgYXBwbHlfYXV0b2NtZHNfcmV0dmFsKEVWRU5UX1NURElOUkVBRFBPU1QsIE5VTEwsIE5VTEwsIEZBTFNFLAorCQkJCQkJCWN1cmJ1ZiwgJnJldHZhbCk7CisjIGVsc2UKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfU1RESU5SRUFEUE9TVCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjIGVuZGlmCisjZW5kaWYKKwl9CisgICAgfQorCisgICAgLyogaWYgZmlyc3QgdGltZSBsb2FkaW5nIHRoaXMgYnVmZmVyLCBpbml0IGJfY2hhcnRhYltdICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9mbGFncyAmIEJGX05FVkVSTE9BREVEKQorCSh2b2lkKWJ1Zl9pbml0X2NoYXJ0YWIoY3VyYnVmLCBGQUxTRSk7CisKKyAgICAvKgorICAgICAqIFNldC9yZXNldCB0aGUgQ2hhbmdlZCBmbGFnIGZpcnN0LCBhdXRvY21kcyBtYXkgY2hhbmdlIHRoZSBidWZmZXIuCisgICAgICogQXBwbHkgdGhlIGF1dG9tYXRpYyBjb21tYW5kcywgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIG1vZGVsaW5lcy4KKyAgICAgKiBTbyB0aGUgbW9kZWxpbmVzIGhhdmUgcHJpb3JpdHkgb3ZlciBhdXRvIGNvbW1hbmRzLgorICAgICAqLworICAgIC8qIFdoZW4gcmVhZGluZyBzdGRpbiwgdGhlIGJ1ZmZlciBjb250ZW50cyBhbHdheXMgbmVlZHMgd3JpdGluZywgc28gc2V0CisgICAgICogdGhlIGNoYW5nZWQgZmxhZy4gIFVubGVzcyBpbiByZWFkb25seSBtb2RlOiAibHMgfCBndmlldyAtIi4KKyAgICAgKiBXaGVuIGludGVycnVwdGVkIGFuZCAnY3BvcHRpb25zJyBjb250YWlucyAnaScgc2V0IGNoYW5nZWQgZmxhZy4gKi8KKyAgICBpZiAoKHJlYWRfc3RkaW4gJiYgIXJlYWRvbmx5bW9kZSAmJiAhYnVmZW1wdHkoKSkKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJfHwgbW9kaWZpZWRfd2FzX3NldAkvKiAiOnNldCBtb2RpZmllZCIgdXNlZCBpbiBhdXRvY21kICovCisjIGlmZGVmIEZFQVRfRVZBTAorCQl8fCAoYWJvcnRpbmcoKSAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fSU5UTU9EKSAhPSBOVUxMKQorIyBlbmRpZgorI2VuZGlmCisJCXx8IChnb3RfaW50ICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19JTlRNT0QpICE9IE5VTEwpKQorCWNoYW5nZWQoKTsKKyAgICBlbHNlIGlmIChyZXR2YWwgIT0gRkFJTCkKKwl1bmNoYW5nZWQoY3VyYnVmLCBGQUxTRSk7CisgICAgc2F2ZV9maWxlX2ZmKGN1cmJ1Zik7CQkvKiBrZWVwIHRoaXMgZmlsZWZvcm1hdCAqLworCisgICAgLyogcmVxdWlyZSAiISIgdG8gb3ZlcndyaXRlIHRoZSBmaWxlLCBiZWNhdXNlIGl0IHdhc24ndCByZWFkIGNvbXBsZXRlbHkgKi8KKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoYWJvcnRpbmcoKSkKKyNlbHNlCisgICAgaWYgKGdvdF9pbnQpCisjZW5kaWYKKwljdXJidWYtPmJfZmxhZ3MgfD0gQkZfUkVBREVSUjsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIG5lZWQgdG8gc2V0IHdfdG9wbGluZSwgdW5sZXNzIHNvbWUgYXV0b2NvbW1hbmQgYWxyZWFkeSBkaWQgdGhhdC4gKi8KKyAgICBpZiAoIShjdXJ3aW4tPndfdmFsaWQgJiBWQUxJRF9UT1BMSU5FKSkKKyAgICB7CisJY3Vyd2luLT53X3RvcGxpbmUgPSAxOworIyBpZmRlZiBGRUFUX0RJRkYKKwljdXJ3aW4tPndfdG9wZmlsbCA9IDA7CisjIGVuZGlmCisgICAgfQorIyBpZmRlZiBGRUFUX0VWQUwKKyAgICBhcHBseV9hdXRvY21kc19yZXR2YWwoRVZFTlRfQlVGRU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYsICZyZXR2YWwpOworIyBlbHNlCisgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGRU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworIyBlbmRpZgorI2VuZGlmCisKKyAgICBpZiAocmV0dmFsICE9IEZBSUwpCisgICAgeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCS8qCisJICogVGhlIGF1dG9jb21tYW5kcyBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IGJ1ZmZlci4gIEFwcGx5IHRoZQorCSAqIG1vZGVsaW5lcyB0byB0aGUgY29ycmVjdCBidWZmZXIsIGlmIGl0IHN0aWxsIGV4aXN0cyBhbmQgaXMgbG9hZGVkLgorCSAqLworCWlmIChidWZfdmFsaWQob2xkX2N1cmJ1ZikgJiYgb2xkX2N1cmJ1Zi0+Yl9tbC5tbF9tZnAgIT0gTlVMTCkKKwl7CisJICAgIGFjb19zYXZlX1QJYWNvOworCisJICAgIC8qIEdvIHRvIHRoZSBidWZmZXIgdGhhdCB3YXMgb3BlbmVkLiAqLworCSAgICBhdWNtZF9wcmVwYnVmKCZhY28sIG9sZF9jdXJidWYpOworI2VuZGlmCisJICAgIGRvX21vZGVsaW5lcygpOworCSAgICBjdXJidWYtPmJfZmxhZ3MgJj0gfihCRl9DSEVDS19STyB8IEJGX05FVkVSTE9BREVEKTsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgYXBwbHlfYXV0b2NtZHNfcmV0dmFsKEVWRU5UX0JVRldJTkVOVEVSLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmLAorCQkJCQkJCQkgICAgJnJldHZhbCk7CisjIGVsc2UKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGV0lORU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworIyBlbmRpZgorCisJICAgIC8qIHJlc3RvcmUgY3Vyd2luL2N1cmJ1ZiBhbmQgYSBmZXcgb3RoZXIgdGhpbmdzICovCisJICAgIGF1Y21kX3Jlc3RidWYoJmFjbyk7CisJfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyogTmVlZCB0byB1cGRhdGUgYXV0b21hdGljIGZvbGRpbmcuICovCisgICAgZm9sZFVwZGF0ZUFsbChjdXJ3aW4pOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgImJ1ZiIgcG9pbnRzIHRvIGEgdmFsaWQgYnVmZmVyIChpbiB0aGUgYnVmZmVyIGxpc3QpLgorICovCisgICAgaW50CitidWZfdmFsaWQoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgYnVmX1QJKmJwOworCisgICAgZm9yIChicCA9IGZpcnN0YnVmOyBicCAhPSBOVUxMOyBicCA9IGJwLT5iX25leHQpCisJaWYgKGJwID09IGJ1ZikKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQ2xvc2UgdGhlIGxpbmsgdG8gYSBidWZmZXIuCisgKiAiYWN0aW9uIiBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gbG9uZ2VyIGEgd2luZG93IGZvciB0aGUgYnVmZmVyLgorICogSXQgY2FuIGJlOgorICogMAkJCWJ1ZmZlciBiZWNvbWVzIGhpZGRlbgorICogRE9CVUZfVU5MT0FECQlidWZmZXIgaXMgdW5sb2FkZWQKKyAqIERPQlVGX0RFTEVURQkJYnVmZmVyIGlzIHVubG9hZGVkIGFuZCByZW1vdmVkIGZyb20gYnVmZmVyIGxpc3QKKyAqIERPQlVGX1dJUEUJCWJ1ZmZlciBpcyB1bmxvYWRlZCBhbmQgcmVhbGx5IGRlbGV0ZWQKKyAqIFdoZW4gZG9pbmcgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lIG9uIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlIGNhbGxlciBzaG91bGQKKyAqIGdldCBhIG5ldyBidWZmZXIgdmVyeSBzb29uIQorICoKKyAqIFRoZSAnYnVmaGlkZGVuJyBvcHRpb24gY2FuIGZvcmNlIGZyZWVpbmcgYW5kIGRlbGV0aW5nLgorICovCisgICAgdm9pZAorY2xvc2VfYnVmZmVyKHdpbiwgYnVmLCBhY3Rpb24pCisgICAgd2luX1QJKndpbjsJCS8qIGlmIG5vdCBOVUxMLCBzZXQgYl9sYXN0X2N1cnNvciAqLworICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlhY3Rpb247Cit7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgaW50CQlpc19jdXJidWY7CisgICAgaW50CQlud2luZG93cyA9IGJ1Zi0+Yl9ud2luZG93czsKKyNlbmRpZgorICAgIGludAkJdW5sb2FkX2J1ZiA9IChhY3Rpb24gIT0gMCk7CisgICAgaW50CQlkZWxfYnVmID0gKGFjdGlvbiA9PSBET0JVRl9ERUwgfHwgYWN0aW9uID09IERPQlVGX1dJUEUpOworICAgIGludAkJd2lwZV9idWYgPSAoYWN0aW9uID09IERPQlVGX1dJUEUpOworCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorICAgIC8qCisgICAgICogRm9yY2UgdW5sb2FkaW5nIG9yIGRlbGV0aW5nIHdoZW4gJ2J1ZmhpZGRlbicgc2F5cyBzby4KKyAgICAgKiBUaGUgY2FsbGVyIG11c3QgdGFrZSBjYXJlIG9mIE5PVCBkZWxldGluZy9mcmVlaW5nIHdoZW4gJ2J1ZmhpZGRlbicgaXMKKyAgICAgKiAiaGlkZSIgKG90aGVyd2lzZSB3ZSBjb3VsZCBuZXZlciBmcmVlIG9yIGRlbGV0ZSBhIGJ1ZmZlcikuCisgICAgICovCisgICAgaWYgKGJ1Zi0+Yl9wX2JoWzBdID09ICdkJykJCS8qICdidWZoaWRkZW4nID09ICJkZWxldGUiICovCisgICAgeworCWRlbF9idWYgPSBUUlVFOworCXVubG9hZF9idWYgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChidWYtPmJfcF9iaFswXSA9PSAndycpCS8qICdidWZoaWRkZW4nID09ICJ3aXBlIiAqLworICAgIHsKKwlkZWxfYnVmID0gVFJVRTsKKwl1bmxvYWRfYnVmID0gVFJVRTsKKwl3aXBlX2J1ZiA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKGJ1Zi0+Yl9wX2JoWzBdID09ICd1JykJLyogJ2J1ZmhpZGRlbicgPT0gInVubG9hZCIgKi8KKwl1bmxvYWRfYnVmID0gVFJVRTsKKyNlbmRpZgorCisgICAgaWYgKHdpbiAhPSBOVUxMKQorICAgIHsKKwkvKiBTZXQgYl9sYXN0X2N1cnNvciB3aGVuIGNsb3NpbmcgdGhlIGxhc3Qgd2luZG93IGZvciB0aGUgYnVmZmVyLgorCSAqIFJlbWVtYmVyIHRoZSBsYXN0IGN1cnNvciBwb3NpdGlvbiBhbmQgd2luZG93IG9wdGlvbnMgb2YgdGhlIGJ1ZmZlci4KKwkgKiBUaGlzIHVzZWQgdG8gYmUgb25seSBmb3IgdGhlIGN1cnJlbnQgd2luZG93LCBidXQgdGhlbiBvcHRpb25zIGxpa2UKKwkgKiAnZm9sZG1ldGhvZCcgbWF5IGJlIGxvc3Qgd2l0aCBhICI6b25seSIgY29tbWFuZC4gKi8KKwlpZiAoYnVmLT5iX253aW5kb3dzID09IDEpCisJICAgIHNldF9sYXN0X2N1cnNvcih3aW4pOworCWJ1Zmxpc3Rfc2V0ZnBvcyhidWYsIHdpbiwKKwkJICAgIHdpbi0+d19jdXJzb3IubG51bSA9PSAxID8gMCA6IHdpbi0+d19jdXJzb3IubG51bSwKKwkJICAgIHdpbi0+d19jdXJzb3IuY29sLCBUUlVFKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIGEgd2luZG93LCB0cmlnZ2VyIEJ1ZldpbkxlYXZlICovCisgICAgaWYgKGJ1Zi0+Yl9ud2luZG93cyA9PSAxKQorICAgIHsKKwlhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZXSU5MRUFWRSwgYnVmLT5iX2ZuYW1lLCBidWYtPmJfZm5hbWUsCisJCQkJCQkJCSAgRkFMU0UsIGJ1Zik7CisJaWYgKCFidWZfdmFsaWQoYnVmKSkJICAgIC8qIGF1dG9jb21tYW5kcyBtYXkgZGVsZXRlIHRoZSBidWZmZXIgKi8KKwkgICAgcmV0dXJuOworCisJLyogV2hlbiB0aGUgYnVmZmVyIGJlY29tZXMgaGlkZGVuLCBidXQgaXMgbm90IHVubG9hZGVkLCB0cmlnZ2VyCisJICogQnVmSGlkZGVuICovCisJaWYgKCF1bmxvYWRfYnVmKQorCXsKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGSElEREVOLCBidWYtPmJfZm5hbWUsIGJ1Zi0+Yl9mbmFtZSwKKwkJCQkJCQkJICBGQUxTRSwgYnVmKTsKKwkgICAgaWYgKCFidWZfdmFsaWQoYnVmKSkJLyogYXV0b2NtZHMgbWF5IGRlbGV0ZSB0aGUgYnVmZmVyICovCisJCXJldHVybjsKKwl9CisjIGlmZGVmIEZFQVRfRVZBTAorCWlmIChhYm9ydGluZygpKQkgICAgLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJICAgIHJldHVybjsKKyMgZW5kaWYKKyAgICB9CisgICAgbndpbmRvd3MgPSBidWYtPmJfbndpbmRvd3M7CisjZW5kaWYKKworICAgIC8qIGRlY3JlYXNlIHRoZSBsaW5rIGNvdW50IGZyb20gd2luZG93cyAodW5sZXNzIG5vdCBpbiBhbnkgd2luZG93KSAqLworICAgIGlmIChidWYtPmJfbndpbmRvd3MgPiAwKQorCS0tYnVmLT5iX253aW5kb3dzOworCisgICAgLyogUmV0dXJuIHdoZW4gYSB3aW5kb3cgaXMgZGlzcGxheWluZyB0aGUgYnVmZmVyIG9yIHdoZW4gaXQncyBub3QKKyAgICAgKiB1bmxvYWRlZC4gKi8KKyAgICBpZiAoYnVmLT5iX253aW5kb3dzID4gMCB8fCAhdW5sb2FkX2J1ZikKKyAgICB7CisJaWYgKGJ1ZiA9PSBjdXJidWYpCisJICAgIHVfc3luYygpOwkgICAgLyogc3luYyB1bmRvIGJlZm9yZSBnb2luZyB0byBhbm90aGVyIGJ1ZmZlciAqLworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBBbHdheXMgcmVtb3ZlIHRoZSBidWZmZXIgd2hlbiB0aGVyZSBpcyBubyBmaWxlIG5hbWUuICovCisgICAgaWYgKGJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCkKKwlkZWxfYnVmID0gVFJVRTsKKworICAgIC8qCisgICAgICogRnJlZSBhbGwgdGhpbmdzIGFsbG9jYXRlZCBmb3IgdGhpcyBidWZmZXIuCisgICAgICogQWxzbyBjYWxscyB0aGUgIkJ1ZkRlbGV0ZSIgYXV0b2NvbW1hbmRzIHdoZW4gZGVsX2J1ZiBpcyBUUlVFLgorICAgICAqLworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIFJlbWVtYmVyIGlmIHdlIGFyZSBjbG9zaW5nIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFJlc3RvcmUgdGhlIG51bWJlciBvZgorICAgICAqIHdpbmRvd3MsIHNvIHRoYXQgYXV0b2NvbW1hbmRzIGluIGJ1Zl9mcmVlYWxsKCkgZG9uJ3QgZ2V0IGNvbmZ1c2VkLiAqLworICAgIGlzX2N1cmJ1ZiA9IChidWYgPT0gY3VyYnVmKTsKKyAgICBidWYtPmJfbndpbmRvd3MgPSBud2luZG93czsKKyNlbmRpZgorCisgICAgYnVmX2ZyZWVhbGwoYnVmLCBkZWxfYnVmLCB3aXBlX2J1Zik7CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiBBdXRvY29tbWFuZHMgbWF5IGhhdmUgZGVsZXRlZCB0aGUgYnVmZmVyLiAqLworICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikpCisJcmV0dXJuOworIyBpZmRlZiBGRUFUX0VWQUwKKyAgICAvKiBBdXRvY29tbWFuZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nLiAqLworICAgIGlmIChhYm9ydGluZygpKQorCXJldHVybjsKKyMgZW5kaWYKKworICAgIC8qIEF1dG9jb21tYW5kcyBtYXkgaGF2ZSBvcGVuZWQgb3IgY2xvc2VkIHdpbmRvd3MgZm9yIHRoaXMgYnVmZmVyLgorICAgICAqIERlY3JlbWVudCB0aGUgY291bnQgZm9yIHRoZSBjbG9zZSB3ZSBkbyBoZXJlLiAqLworICAgIGlmIChidWYtPmJfbndpbmRvd3MgPiAwKQorCS0tYnVmLT5iX253aW5kb3dzOworCisgICAgLyoKKyAgICAgKiBJdCdzIHBvc3NpYmxlIHRoYXQgYXV0b2NvbW1hbmRzIGNoYW5nZSBjdXJidWYgdG8gdGhlIG9uZSBiZWluZyBkZWxldGVkLgorICAgICAqIFRoaXMgbWlnaHQgY2F1c2UgdGhlIHByZXZpb3VzIGN1cmJ1ZiB0byBiZSBkZWxldGVkIHVuZXhwZWN0ZWRseS4gIEJ1dAorICAgICAqIGluIHNvbWUgY2FzZXMgaXQncyBPSyB0byBkZWxldGUgdGhlIGN1cmJ1ZiwgYmVjYXVzZSBhIG5ldyBvbmUgaXMKKyAgICAgKiBvYnRhaW5lZCBhbnl3YXkuICBUaGVyZWZvcmUgb25seSByZXR1cm4gaWYgY3VyYnVmIGNoYW5nZWQgdG8gdGhlCisgICAgICogZGVsZXRlZCBidWZmZXIuCisgICAgICovCisgICAgaWYgKGJ1ZiA9PSBjdXJidWYgJiYgIWlzX2N1cmJ1ZikKKwlyZXR1cm47CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIGlmICh1c2luZ05ldGJlYW5zKQorCW5ldGJlYW5zX2ZpbGVfY2xvc2VkKGJ1Zik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgfHwgZGVmaW5lZChGRUFUX1NVTl9XT1JLU0hPUCkKKyAgICAvKiBDaGFuZ2UgZGlyZWN0b3JpZXMgd2hlbiB0aGUgYWNkIG9wdGlvbiBpcyBzZXQgb24uICovCisgICAgaWYgKHBfYWNkICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTAorCQkJCSAgICAgJiYgdmltX2NoZGlyZmlsZShjdXJidWYtPmJfZmZuYW1lKSA9PSBPSykKKwlzaG9ydGVuX2ZuYW1lcyhUUlVFKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBSZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LgorICAgICAqLworICAgIGlmICh3aXBlX2J1ZikKKyAgICB7CisjaWZkZWYgRkVBVF9TVU5fV09SS1NIT1AKKwlpZiAodXNpbmdTdW5Xb3JrU2hvcCkKKwkgICAgd29ya3Nob3BfZmlsZV9jbG9zZWRfbGluZW5vKChjaGFyICopYnVmLT5iX2ZmbmFtZSwKKwkJCShpbnQpYnVmLT5iX2xhc3RfY3Vyc29yLmxudW0pOworI2VuZGlmCisJdmltX2ZyZWUoYnVmLT5iX2ZmbmFtZSk7CisJdmltX2ZyZWUoYnVmLT5iX3NmbmFtZSk7CisJaWYgKGJ1Zi0+Yl9wcmV2ID09IE5VTEwpCisJICAgIGZpcnN0YnVmID0gYnVmLT5iX25leHQ7CisJZWxzZQorCSAgICBidWYtPmJfcHJldi0+Yl9uZXh0ID0gYnVmLT5iX25leHQ7CisJaWYgKGJ1Zi0+Yl9uZXh0ID09IE5VTEwpCisJICAgIGxhc3RidWYgPSBidWYtPmJfcHJldjsKKwllbHNlCisJICAgIGJ1Zi0+Yl9uZXh0LT5iX3ByZXYgPSBidWYtPmJfcHJldjsKKwlmcmVlX2J1ZmZlcihidWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChkZWxfYnVmKQorCXsKKwkgICAgLyogRnJlZSBhbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFuZCByZXNldCBvcHRpb24gdmFsdWVzLCB0byBtYWtlCisJICAgICAqICI6YmRlbCIgY29tcGF0aWJsZSB3aXRoIFZpbSA1LjcuICovCisJICAgIGZyZWVfYnVmZmVyX3N0dWZmKGJ1ZiwgVFJVRSk7CisKKwkgICAgLyogTWFrZSBpdCBsb29rIGxpa2UgYSBuZXcgYnVmZmVyLiAqLworCSAgICBidWYtPmJfZmxhZ3MgPSBCRl9DSEVDS19STyB8IEJGX05FVkVSTE9BREVEOworCisJICAgIC8qIEluaXQgdGhlIG9wdGlvbnMgd2hlbiBsb2FkZWQgYWdhaW4uICovCisJICAgIGJ1Zi0+Yl9wX2luaXRpYWxpemVkID0gRkFMU0U7CisJfQorCWJ1Zl9jbGVhcl9maWxlKGJ1Zik7CisJaWYgKGRlbF9idWYpCisJICAgIGJ1Zi0+Yl9wX2JsID0gRkFMU0U7CisgICAgfQorfQorCisvKgorICogTWFrZSBidWZmZXIgbm90IGNvbnRhaW4gYSBmaWxlLgorICovCisgICAgdm9pZAorYnVmX2NsZWFyX2ZpbGUoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPSAxOworICAgIHVuY2hhbmdlZChidWYsIFRSVUUpOworI2lmbmRlZiBTSE9SVF9GTkFNRQorICAgIGJ1Zi0+Yl9zaG9ydG5hbWUgPSBGQUxTRTsKKyNlbmRpZgorICAgIGJ1Zi0+Yl9wX2VvbCA9IFRSVUU7CisgICAgYnVmLT5iX3N0YXJ0X2VvbCA9IFRSVUU7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGJ1Zi0+Yl9wX2JvbWIgPSBGQUxTRTsKKyNlbmRpZgorICAgIGJ1Zi0+Yl9tbC5tbF9tZnAgPSBOVUxMOworICAgIGJ1Zi0+Yl9tbC5tbF9mbGFncyA9IE1MX0VNUFRZOwkJLyogZW1wdHkgYnVmZmVyICovCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgbmV0YmVhbnNfZGVsZXRlZF9hbGxfbGluZXMoYnVmKTsKKyAgICBuZXRiZWFuc09wZW5GaWxlID0gMDsgIC8qIHJlc2V0IGluIG5ldGJlYW5zX2ZpbGVfb3BlbmVkKCkgKi8KKyNlbmRpZgorfQorCisvKgorICogYnVmX2ZyZWVhbGwoKSAtIGZyZWUgYWxsIHRoaW5ncyBhbGxvY2F0ZWQgZm9yIGEgYnVmZmVyIHRoYXQgYXJlIHJlbGF0ZWQgdG8KKyAqIHRoZSBmaWxlLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitidWZfZnJlZWFsbChidWYsIGRlbF9idWYsIHdpcGVfYnVmKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlkZWxfYnVmOwkvKiBidWZmZXIgaXMgZ29pbmcgdG8gYmUgZGVsZXRlZCAqLworICAgIGludAkJd2lwZV9idWY7CS8qIGJ1ZmZlciBpcyBnb2luZyB0byBiZSB3aXBlZCBvdXQgKi8KK3sKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpbnQJCWlzX2N1cmJ1ZiA9IChidWYgPT0gY3VyYnVmKTsKKworICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRlVOTE9BRCwgYnVmLT5iX2ZuYW1lLCBidWYtPmJfZm5hbWUsIEZBTFNFLCBidWYpOworICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikpCSAgICAvKiBhdXRvY29tbWFuZHMgbWF5IGRlbGV0ZSB0aGUgYnVmZmVyICovCisJcmV0dXJuOworICAgIGlmIChkZWxfYnVmICYmIGJ1Zi0+Yl9wX2JsKQorICAgIHsKKwlhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZERUxFVEUsIGJ1Zi0+Yl9mbmFtZSwgYnVmLT5iX2ZuYW1lLCBGQUxTRSwgYnVmKTsKKwlpZiAoIWJ1Zl92YWxpZChidWYpKQkgICAgLyogYXV0b2NvbW1hbmRzIG1heSBkZWxldGUgdGhlIGJ1ZmZlciAqLworCSAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aXBlX2J1ZikKKyAgICB7CisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGV0lQRU9VVCwgYnVmLT5iX2ZuYW1lLCBidWYtPmJfZm5hbWUsCisJCQkJCQkJCSAgRkFMU0UsIGJ1Zik7CisJaWYgKCFidWZfdmFsaWQoYnVmKSkJICAgIC8qIGF1dG9jb21tYW5kcyBtYXkgZGVsZXRlIHRoZSBidWZmZXIgKi8KKwkgICAgcmV0dXJuOworICAgIH0KKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwlyZXR1cm47CisjIGVuZGlmCisKKyAgICAvKgorICAgICAqIEl0J3MgcG9zc2libGUgdGhhdCBhdXRvY29tbWFuZHMgY2hhbmdlIGN1cmJ1ZiB0byB0aGUgb25lIGJlaW5nIGRlbGV0ZWQuCisgICAgICogVGhpcyBtaWdodCBjYXVzZSBjdXJidWYgdG8gYmUgZGVsZXRlZCB1bmV4cGVjdGVkbHkuICBCdXQgaW4gc29tZSBjYXNlcworICAgICAqIGl0J3MgT0sgdG8gZGVsZXRlIHRoZSBjdXJidWYsIGJlY2F1c2UgYSBuZXcgb25lIGlzIG9idGFpbmVkIGFueXdheS4KKyAgICAgKiBUaGVyZWZvcmUgb25seSByZXR1cm4gaWYgY3VyYnVmIGNoYW5nZWQgdG8gdGhlIGRlbGV0ZWQgYnVmZmVyLgorICAgICAqLworICAgIGlmIChidWYgPT0gY3VyYnVmICYmICFpc19jdXJidWYpCisJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisgICAgZGlmZl9idWZfZGVsZXRlKGJ1Zik7CSAgICAvKiBDYW4ndCB1c2UgJ2RpZmYnIGZvciB1bmxvYWRlZCBidWZmZXIuICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RDTAorICAgIHRjbF9idWZmZXJfZnJlZShidWYpOworI2VuZGlmCisgICAgdV9ibG9ja2ZyZWUoYnVmKTsJCSAgICAvKiBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB1bmRvICovCisgICAgbWxfY2xvc2UoYnVmLCBUUlVFKTsJICAgIC8qIGNsb3NlIGFuZCBkZWxldGUgdGhlIG1lbWxpbmUvbWVtZmlsZSAqLworICAgIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID0gMDsgICAgLyogbm8gbGluZXMgaW4gYnVmZmVyICovCisgICAgdV9jbGVhcmFsbChidWYpOwkJICAgIC8qIHJlc2V0IGFsbCB1bmRvIGluZm9ybWF0aW9uICovCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICBzeW50YXhfY2xlYXIoYnVmKTsJCSAgICAvKiByZXNldCBzeW50YXggaW5mbyAqLworI2VuZGlmCit9CisKKy8qCisgKiBGcmVlIGEgYnVmZmVyIHN0cnVjdHVyZSBhbmQgdGhlIHRoaW5ncyBpdCBjb250YWlucyByZWxhdGVkIHRvIHRoZSBidWZmZXIKKyAqIGl0c2VsZiAobm90IHRoZSBmaWxlLCB0aGF0IG11c3QgaGF2ZSBiZWVuIGRvbmUgYWxyZWFkeSkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJlZV9idWZmZXIoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgZnJlZV9idWZmZXJfc3R1ZmYoYnVmLCBUUlVFKTsKKyNpZmRlZiBGRUFUX1BFUkwKKyAgICBwZXJsX2J1Zl9mcmVlKGJ1Zik7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1BZVEhPTgorICAgIHB5dGhvbl9idWZmZXJfZnJlZShidWYpOworI2VuZGlmCisjaWZkZWYgRkVBVF9SVUJZCisgICAgcnVieV9idWZmZXJfZnJlZShidWYpOworI2VuZGlmCisgICAgdmltX2ZyZWUoYnVmKTsKK30KKworLyoKKyAqIEZyZWUgc3R1ZmYgaW4gdGhlIGJ1ZmZlciBmb3IgIjpiZGVsIiBhbmQgd2hlbiB3aXBpbmcgb3V0IHRoZSBidWZmZXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJlZV9idWZmZXJfc3R1ZmYoYnVmLCBmcmVlX29wdGlvbnMpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCWZyZWVfb3B0aW9uczsJCS8qIGZyZWUgb3B0aW9ucyBhcyB3ZWxsICovCit7CisgICAgaWYgKGZyZWVfb3B0aW9ucykKKyAgICB7CisJY2xlYXJfd2luaW5mbyhidWYpOwkJLyogaW5jbHVkaW5nIHdpbmRvdy1sb2NhbCBvcHRpb25zICovCisJZnJlZV9idWZfb3B0aW9ucyhidWYsIFRSVUUpOworICAgIH0KKyNpZmRlZiBGRUFUX0VWQUwKKyAgICB2YXJfY2xlYXIoJmJ1Zi0+Yl92YXJzKTsJCS8qIGZyZWUgYWxsIGludGVybmFsIHZhcmlhYmxlcyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9VU1JfQ01EUworICAgIHVjX2NsZWFyKCZidWYtPmJfdWNtZHMpOwkJLyogY2xlYXIgbG9jYWwgdXNlciBjb21tYW5kcyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9TSUdOUworICAgIGJ1Zl9kZWxldGVfc2lnbnMoYnVmKTsJCS8qIGRlbGV0ZSBhbnkgc2lnbnMgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBtYXBfY2xlYXJfaW50KGJ1ZiwgTUFQX0FMTF9NT0RFUywgVFJVRSwgRkFMU0UpOyAgLyogY2xlYXIgbG9jYWwgbWFwcGluZ3MgKi8KKyAgICBtYXBfY2xlYXJfaW50KGJ1ZiwgTUFQX0FMTF9NT0RFUywgVFJVRSwgVFJVRSk7ICAgLyogY2xlYXIgbG9jYWwgYWJicmV2cyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbV9mcmVlKGJ1Zi0+Yl9zdGFydF9mZW5jKTsKKyAgICBidWYtPmJfc3RhcnRfZmVuYyA9IE5VTEw7CisjZW5kaWYKK30KKworLyoKKyAqIEZyZWUgdGhlIGJfd2luaW5mbyBsaXN0IGZvciBidWZmZXIgImJ1ZiIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfd2luaW5mbyhidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICB3aW5pbmZvX1QJKndpcDsKKworICAgIHdoaWxlIChidWYtPmJfd2luaW5mbyAhPSBOVUxMKQorICAgIHsKKwl3aXAgPSBidWYtPmJfd2luaW5mbzsKKwlidWYtPmJfd2luaW5mbyA9IHdpcC0+d2lfbmV4dDsKKwlpZiAod2lwLT53aV9vcHRzZXQpCisJeworCSAgICBjbGVhcl93aW5vcHQoJndpcC0+d2lfb3B0KTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgZGVsZXRlRm9sZFJlY3Vyc2UoJndpcC0+d2lfZm9sZHMpOworI2VuZGlmCisJfQorCXZpbV9mcmVlKHdpcCk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX0xJU1RDTURTKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdvIHRvIGFub3RoZXIgYnVmZmVyLiAgSGFuZGxlcyB0aGUgcmVzdWx0IG9mIHRoZSBBVFRFTlRJT04gZGlhbG9nLgorICovCisgICAgdm9pZAorZ290b19idWZmZXIoZWFwLCBzdGFydCwgZGlyLCBjb3VudCkKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzdGFydDsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCWNvdW50OworeworIyBpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgXAorCQkmJiAoZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKSkKKyAgICBidWZfVAkqb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKworICAgIHN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9ESUFMT0c7CisjIGVuZGlmCisgICAgKHZvaWQpZG9fYnVmZmVyKCplYXAtPmNtZCA9PSAncycgPyBET0JVRl9TUExJVCA6IERPQlVGX0dPVE8sCisJCQkJCSAgICAgc3RhcnQsIGRpciwgY291bnQsIGVhcC0+Zm9yY2VpdCk7CisjIGlmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSBcCisJCSYmIChkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpKQorICAgIGlmIChzd2FwX2V4aXN0c19hY3Rpb24gPT0gU0VBX1FVSVQgJiYgKmVhcC0+Y21kID09ICdzJykKKyAgICB7CisJLyogUXVpdHRpbmcgbWVhbnMgY2xvc2luZyB0aGUgc3BsaXQgd2luZG93LCBub3RoaW5nIGVsc2UuICovCisJd2luX2Nsb3NlKGN1cndpbiwgVFJVRSk7CisJc3dhcF9leGlzdHNfYWN0aW9uID0gU0VBX05PTkU7CisgICAgfQorICAgIGVsc2UKKwloYW5kbGVfc3dhcF9leGlzdHMob2xkX2N1cmJ1Zik7CisjIGVuZGlmCit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBIYW5kbGUgdGhlIHNpdHVhdGlvbiBvZiBzd2FwX2V4aXN0c19hY3Rpb24gYmVpbmcgc2V0LgorICogSXQgaXMgYWxsb3dlZCBmb3IgIm9sZF9jdXJidWYiIHRvIGJlIE5VTEwgb3IgaW52YWxpZC4KKyAqLworICAgIHZvaWQKK2hhbmRsZV9zd2FwX2V4aXN0cyhvbGRfY3VyYnVmKQorICAgIGJ1Zl9UCSpvbGRfY3VyYnVmOworeworICAgIGlmIChzd2FwX2V4aXN0c19hY3Rpb24gPT0gU0VBX1FVSVQpCisgICAgeworCS8qIFVzZXIgc2VsZWN0ZWQgUXVpdCBhdCBBVFRFTlRJT04gcHJvbXB0LiAgR28gYmFjayB0byBwcmV2aW91cworCSAqIGJ1ZmZlci4gIElmIHRoYXQgYnVmZmVyIGlzIGdvbmUgb3IgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgb25lLAorCSAqIG9wZW4gYSBuZXcsIGVtcHR5IGJ1ZmZlci4gKi8KKwlzd2FwX2V4aXN0c19hY3Rpb24gPSBTRUFfTk9ORTsJLyogZG9uJ3Qgd2FudCBpdCBhZ2FpbiAqLworCWNsb3NlX2J1ZmZlcihjdXJ3aW4sIGN1cmJ1ZiwgRE9CVUZfVU5MT0FEKTsKKwlpZiAoIWJ1Zl92YWxpZChvbGRfY3VyYnVmKSB8fCBvbGRfY3VyYnVmID09IGN1cmJ1ZikKKwkgICAgb2xkX2N1cmJ1ZiA9IGJ1Zmxpc3RfbmV3KE5VTEwsIE5VTEwsIDFMLAorCQkJCQkgQkxOX0NVUkJVRiB8IEJMTl9MSVNURUQgfCBCTE5fRk9SQ0UpOworCWlmIChvbGRfY3VyYnVmICE9IE5VTEwpCisJICAgIGVudGVyX2J1ZmZlcihvbGRfY3VyYnVmKTsKKwkvKiBJZiAib2xkX2N1cmJ1ZiIgaXMgTlVMTCB3ZSBhcmUgaW4gYmlnIHRyb3VibGUgaGVyZS4uLiAqLworICAgIH0KKyAgICBlbHNlIGlmIChzd2FwX2V4aXN0c19hY3Rpb24gPT0gU0VBX1JFQ09WRVIpCisgICAgeworCS8qIFVzZXIgc2VsZWN0ZWQgUmVjb3ZlciBhdCBBVFRFTlRJT04gcHJvbXB0LiAqLworCW1zZ19zY3JvbGwgPSBUUlVFOworCW1sX3JlY292ZXIoKTsKKwlNU0dfUFVUUygiXG4iKTsJLyogZG9uJ3Qgb3ZlcndyaXRlIHRoZSBsYXN0IG1lc3NhZ2UgKi8KKwljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJZG9fbW9kZWxpbmVzKCk7CisgICAgfQorICAgIHN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9OT05FOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTElTVENNRFMpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogZG9fYnVmZGVsKCkgLSBkZWxldGUgb3IgdW5sb2FkIGJ1ZmZlcihzKQorICoKKyAqIGFkZHJfY291bnQgPT0gMDogIjpiZGVsIiAtIGRlbGV0ZSBjdXJyZW50IGJ1ZmZlcgorICogYWRkcl9jb3VudCA9PSAxOiAiOk4gYmRlbCIgb3IgIjpiZGVsIE4gW04gLi5dIiAtIGZpcnN0IGRlbGV0ZQorICoJCSAgICBidWZmZXIgImVuZF9ibnIiLCB0aGVuIGFueSBvdGhlciBhcmd1bWVudHMuCisgKiBhZGRyX2NvdW50ID09IDI6ICI6TixOIGJkZWwiIC0gZGVsZXRlIGJ1ZmZlcnMgaW4gcmFuZ2UKKyAqCisgKiBjb21tYW5kIGNhbiBiZSBET0JVRl9VTkxPQUQgKCI6YnVubG9hZCIpLCBET0JVRl9XSVBFICgiOmJ3aXBlb3V0Iikgb3IKKyAqIERPQlVGX0RFTCAoIjpiZGVsIikKKyAqCisgKiBSZXR1cm5zIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTAorICovCisgICAgY2hhcl91ICoKK2RvX2J1ZmRlbChjb21tYW5kLCBhcmcsIGFkZHJfY291bnQsIHN0YXJ0X2JuciwgZW5kX2JuciwgZm9yY2VpdCkKKyAgICBpbnQJCWNvbW1hbmQ7CisgICAgY2hhcl91CSphcmc7CQkvKiBwb2ludGVyIHRvIGV4dHJhIGFyZ3VtZW50cyAqLworICAgIGludAkJYWRkcl9jb3VudDsKKyAgICBpbnQJCXN0YXJ0X2JucjsJLyogZmlyc3QgYnVmZmVyIG51bWJlciBpbiBhIHJhbmdlICovCisgICAgaW50CQllbmRfYm5yOwkvKiBidWZmZXIgbnIgb3IgbGFzdCBidWZmZXIgbnIgaW4gYSByYW5nZSAqLworICAgIGludAkJZm9yY2VpdDsKK3sKKyAgICBpbnQJCWRvX2N1cnJlbnQgPSAwOwkvKiBkZWxldGUgY3VycmVudCBidWZmZXI/ICovCisgICAgaW50CQlkZWxldGVkID0gMDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgZGVsZXRlZCAqLworICAgIGNoYXJfdQkqZXJyb3Jtc2cgPSBOVUxMOyAvKiByZXR1cm4gdmFsdWUgKi8KKyAgICBpbnQJCWJucjsJCS8qIGJ1ZmZlciBudW1iZXIgKi8KKyAgICBjaGFyX3UJKnA7CisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBuZXRiZWFuc0Nsb3NlRmlsZSA9IDE7CisjZW5kaWYKKyAgICBpZiAoYWRkcl9jb3VudCA9PSAwKQorICAgIHsKKwkodm9pZClkb19idWZmZXIoY29tbWFuZCwgRE9CVUZfQ1VSUkVOVCwgRk9SV0FSRCwgMCwgZm9yY2VpdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGFkZHJfY291bnQgPT0gMikKKwl7CisJICAgIGlmICgqYXJnKQkJLyogYm90aCByYW5nZSBhbmQgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQgKi8KKwkJcmV0dXJuIChjaGFyX3UgKilfKGVfdHJhaWxpbmcpOworCSAgICBibnIgPSBzdGFydF9ibnI7CisJfQorCWVsc2UJLyogYWRkcl9jb3VudCA9PSAxICovCisJICAgIGJuciA9IGVuZF9ibnI7CisKKwlmb3IgKCA7IWdvdF9pbnQ7IHVpX2JyZWFrY2hlY2soKSkKKwl7CisJICAgIC8qCisJICAgICAqIGRlbGV0ZSB0aGUgY3VycmVudCBidWZmZXIgbGFzdCwgb3RoZXJ3aXNlIHdoZW4gdGhlCisJICAgICAqIGN1cnJlbnQgYnVmZmVyIGlzIGRlbGV0ZWQsIHRoZSBuZXh0IGJ1ZmZlciBiZWNvbWVzCisJICAgICAqIHRoZSBjdXJyZW50IG9uZSBhbmQgd2lsbCBiZSBsb2FkZWQsIHdoaWNoIG1heSB0aGVuCisJICAgICAqIGFsc28gYmUgZGVsZXRlZCwgZXRjLgorCSAgICAgKi8KKwkgICAgaWYgKGJuciA9PSBjdXJidWYtPmJfZm51bSkKKwkJZG9fY3VycmVudCA9IGJucjsKKwkgICAgZWxzZSBpZiAoZG9fYnVmZmVyKGNvbW1hbmQsIERPQlVGX0ZJUlNULCBGT1JXQVJELCAoaW50KWJuciwKKwkJCQkJCQkgICAgICAgZm9yY2VpdCkgPT0gT0spCisJCSsrZGVsZXRlZDsKKworCSAgICAvKgorCSAgICAgKiBmaW5kIG5leHQgYnVmZmVyIG51bWJlciB0byBkZWxldGUvdW5sb2FkCisJICAgICAqLworCSAgICBpZiAoYWRkcl9jb3VudCA9PSAyKQorCSAgICB7CisJCWlmICgrK2JuciA+IGVuZF9ibnIpCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBlbHNlICAgIC8qIGFkZHJfY291bnQgPT0gMSAqLworCSAgICB7CisJCWFyZyA9IHNraXB3aGl0ZShhcmcpOworCQlpZiAoKmFyZyA9PSBOVUwpCisJCSAgICBicmVhazsKKwkJaWYgKCFWSU1fSVNESUdJVCgqYXJnKSkKKwkJeworCQkgICAgcCA9IHNraXB0b3doaXRlX2VzYyhhcmcpOworCQkgICAgYm5yID0gYnVmbGlzdF9maW5kcGF0KGFyZywgcCwgY29tbWFuZCA9PSBET0JVRl9XSVBFLCBGQUxTRSk7CisJCSAgICBpZiAoYm5yIDwgMCkJICAgIC8qIGZhaWxlZCAqLworCQkJYnJlYWs7CisJCSAgICBhcmcgPSBwOworCQl9CisJCWVsc2UKKwkJICAgIGJuciA9IGdldGRpZ2l0cygmYXJnKTsKKwkgICAgfQorCX0KKwlpZiAoIWdvdF9pbnQgJiYgZG9fY3VycmVudCAmJiBkb19idWZmZXIoY29tbWFuZCwgRE9CVUZfRklSU1QsCisJCQkJCSAgRk9SV0FSRCwgZG9fY3VycmVudCwgZm9yY2VpdCkgPT0gT0spCisJICAgICsrZGVsZXRlZDsKKworCWlmIChkZWxldGVkID09IDApCisJeworCSAgICBpZiAoY29tbWFuZCA9PSBET0JVRl9VTkxPQUQpCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIkU1MTU6IE5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIpKTsKKwkgICAgZWxzZSBpZiAoY29tbWFuZCA9PSBET0JVRl9ERUwpCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIkU1MTY6IE5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIikpOworCSAgICBlbHNlCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIkU1MTc6IE5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiKSk7CisJICAgIGVycm9ybXNnID0gSU9idWZmOworCX0KKwllbHNlIGlmIChkZWxldGVkID49IHBfcmVwb3J0KQorCXsKKwkgICAgaWYgKGNvbW1hbmQgPT0gRE9CVUZfVU5MT0FEKQorCSAgICB7CisJCWlmIChkZWxldGVkID09IDEpCisJCSAgICBNU0coXygiMSBidWZmZXIgdW5sb2FkZWQiKSk7CisJCWVsc2UKKwkJICAgIHNtc2coKGNoYXJfdSAqKV8oIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiKSwgZGVsZXRlZCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoY29tbWFuZCA9PSBET0JVRl9ERUwpCisJICAgIHsKKwkJaWYgKGRlbGV0ZWQgPT0gMSkKKwkJICAgIE1TRyhfKCIxIGJ1ZmZlciBkZWxldGVkIikpOworCQllbHNlCisJCSAgICBzbXNnKChjaGFyX3UgKilfKCIlZCBidWZmZXJzIGRlbGV0ZWQiKSwgZGVsZXRlZCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChkZWxldGVkID09IDEpCisJCSAgICBNU0coXygiMSBidWZmZXIgd2lwZWQgb3V0IikpOworCQllbHNlCisJCSAgICBzbXNnKChjaGFyX3UgKilfKCIlZCBidWZmZXJzIHdpcGVkIG91dCIpLCBkZWxldGVkKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBuZXRiZWFuc0Nsb3NlRmlsZSA9IDA7CisjZW5kaWYKKworICAgIHJldHVybiBlcnJvcm1zZzsKK30KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kcyBmb3IgdGhlIGJ1ZmZlciBsaXN0LgorICoKKyAqIGFjdGlvbiA9PSBET0JVRl9HT1RPCSAgICBnbyB0byBzcGVjaWZpZWQgYnVmZmVyCisgKiBhY3Rpb24gPT0gRE9CVUZfU1BMSVQgICAgc3BsaXQgd2luZG93IGFuZCBnbyB0byBzcGVjaWZpZWQgYnVmZmVyCisgKiBhY3Rpb24gPT0gRE9CVUZfVU5MT0FEICAgdW5sb2FkIHNwZWNpZmllZCBidWZmZXIocykKKyAqIGFjdGlvbiA9PSBET0JVRl9ERUwJICAgIGRlbGV0ZSBzcGVjaWZpZWQgYnVmZmVyKHMpIGZyb20gYnVmZmVyIGxpc3QKKyAqIGFjdGlvbiA9PSBET0JVRl9XSVBFCSAgICBkZWxldGUgc3BlY2lmaWVkIGJ1ZmZlcihzKSByZWFsbHkKKyAqCisgKiBzdGFydCA9PSBET0JVRl9DVVJSRU5UICAgZ28gdG8gImNvdW50IiBidWZmZXIgZnJvbSBjdXJyZW50IGJ1ZmZlcgorICogc3RhcnQgPT0gRE9CVUZfRklSU1QJICAgIGdvIHRvICJjb3VudCIgYnVmZmVyIGZyb20gZmlyc3QgYnVmZmVyCisgKiBzdGFydCA9PSBET0JVRl9MQVNUCSAgICBnbyB0byAiY291bnQiIGJ1ZmZlciBmcm9tIGxhc3QgYnVmZmVyCisgKiBzdGFydCA9PSBET0JVRl9NT0QJICAgIGdvIHRvICJjb3VudCIgbW9kaWZpZWQgYnVmZmVyIGZyb20gY3VycmVudCBidWZmZXIKKyAqCisgKiBSZXR1cm4gRkFJTCBvciBPSy4KKyAqLworICAgIGludAorZG9fYnVmZmVyKGFjdGlvbiwgc3RhcnQsIGRpciwgY291bnQsIGZvcmNlaXQpCisgICAgaW50CQlhY3Rpb247CisgICAgaW50CQlzdGFydDsKKyAgICBpbnQJCWRpcjsJCS8qIEZPUldBUkQgb3IgQkFDS1dBUkQgKi8KKyAgICBpbnQJCWNvdW50OwkJLyogYnVmZmVyIG51bWJlciBvciBudW1iZXIgb2YgYnVmZmVycyAqLworICAgIGludAkJZm9yY2VpdDsJLyogVFJVRSBmb3IgOi4uLiEgKi8KK3sKKyAgICBidWZfVAkqYnVmOworICAgIGJ1Zl9UCSpicDsKKyAgICBpbnQJCXVubG9hZCA9IChhY3Rpb24gPT0gRE9CVUZfVU5MT0FEIHx8IGFjdGlvbiA9PSBET0JVRl9ERUwKKwkJCQkJCSAgICAgfHwgYWN0aW9uID09IERPQlVGX1dJUEUpOworCisgICAgc3dpdGNoIChzdGFydCkKKyAgICB7CisJY2FzZSBET0JVRl9GSVJTVDogICBidWYgPSBmaXJzdGJ1ZjsgYnJlYWs7CisJY2FzZSBET0JVRl9MQVNUOiAgICBidWYgPSBsYXN0YnVmOyAgYnJlYWs7CisJZGVmYXVsdDoJICAgIGJ1ZiA9IGN1cmJ1ZjsgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN0YXJ0ID09IERPQlVGX01PRCkJICAgIC8qIGZpbmQgbmV4dCBtb2RpZmllZCBidWZmZXIgKi8KKyAgICB7CisJd2hpbGUgKGNvdW50LS0gPiAwKQorCXsKKwkgICAgZG8KKwkgICAgeworCQlidWYgPSBidWYtPmJfbmV4dDsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkgICAgYnVmID0gZmlyc3RidWY7CisJICAgIH0KKwkgICAgd2hpbGUgKGJ1ZiAhPSBjdXJidWYgJiYgIWJ1ZklzQ2hhbmdlZChidWYpKTsKKwl9CisJaWYgKCFidWZJc0NoYW5nZWQoYnVmKSkKKwl7CisJICAgIEVNU0coXygiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoc3RhcnQgPT0gRE9CVUZfRklSU1QgJiYgY291bnQpIC8qIGZpbmQgc3BlY2lmaWVkIGJ1ZmZlciBudW1iZXIgKi8KKyAgICB7CisJd2hpbGUgKGJ1ZiAhPSBOVUxMICYmIGJ1Zi0+Yl9mbnVtICE9IGNvdW50KQorCSAgICBidWYgPSBidWYtPmJfbmV4dDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlicCA9IE5VTEw7CisJd2hpbGUgKGNvdW50ID4gMCB8fCAoIXVubG9hZCAmJiAhYnVmLT5iX3BfYmwgJiYgYnAgIT0gYnVmKSkKKwl7CisJICAgIC8qIHJlbWVtYmVyIHRoZSBidWZmZXIgd2hlcmUgd2Ugc3RhcnQsIHdlIGNvbWUgYmFjayB0aGVyZSB3aGVuIGFsbAorCSAgICAgKiBidWZmZXJzIGFyZSB1bmxpc3RlZC4gKi8KKwkgICAgaWYgKGJwID09IE5VTEwpCisJCWJwID0gYnVmOworCSAgICBpZiAoZGlyID09IEZPUldBUkQpCisJICAgIHsKKwkJYnVmID0gYnVmLT5iX25leHQ7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJICAgIGJ1ZiA9IGZpcnN0YnVmOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlidWYgPSBidWYtPmJfcHJldjsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkgICAgYnVmID0gbGFzdGJ1ZjsKKwkgICAgfQorCSAgICAvKiBkb24ndCBjb3VudCB1bmxpc3RlZCBidWZmZXJzICovCisJICAgIGlmICh1bmxvYWQgfHwgYnVmLT5iX3BfYmwpCisJICAgIHsKKwkJIC0tY291bnQ7CisJCSBicCA9IE5VTEw7CS8qIHVzZSB0aGlzIGJ1ZmZlciBhcyBuZXcgc3RhcnRpbmcgcG9pbnQgKi8KKwkgICAgfQorCSAgICBpZiAoYnAgPT0gYnVmKQorCSAgICB7CisJCS8qIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuICovCisJCUVNU0coXygiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIikpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoYnVmID09IE5VTEwpCSAgICAvKiBjb3VsZCBub3QgZmluZCBpdCAqLworICAgIHsKKwlpZiAoc3RhcnQgPT0gRE9CVUZfRklSU1QpCisJeworCSAgICAvKiBkb24ndCB3YXJuIHdoZW4gZGVsZXRpbmcgKi8KKwkgICAgaWYgKCF1bmxvYWQpCisJCUVNU0dOKF8oIkU4NjogQnVmZmVyICVsZCBkb2VzIG5vdCBleGlzdCIpLCBjb3VudCk7CisJfQorCWVsc2UgaWYgKGRpciA9PSBGT1JXQVJEKQorCSAgICBFTVNHKF8oIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIpKTsKKwllbHNlCisJICAgIEVNU0coXygiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTElTVENNRFMKKyAgICAvKgorICAgICAqIGRlbGV0ZSBidWZmZXIgYnVmIGZyb20gbWVtb3J5IGFuZC9vciB0aGUgbGlzdAorICAgICAqLworICAgIGlmICh1bmxvYWQpCisgICAgeworCWludAlmb3J3YXJkOworCWludAlyZXR2YWw7CisKKwkvKiBXaGVuIHVubG9hZGluZyBvciBkZWxldGluZyBhIGJ1ZmZlciB0aGF0J3MgYWxyZWFkeSB1bmxvYWRlZCBhbmQKKwkgKiB1bmxpc3RlZDogZmFpbCBzaWxlbnRseS4gKi8KKwlpZiAoYWN0aW9uICE9IERPQlVGX1dJUEUgJiYgYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMICYmICFidWYtPmJfcF9ibCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAoIWZvcmNlaXQgJiYgYnVmSXNDaGFuZ2VkKGJ1ZikpCisJeworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwkgICAgaWYgKChwX2NvbmZpcm0gfHwgY21kbW9kLmNvbmZpcm0pICYmIHBfd3JpdGUpCisJICAgIHsKKwkJZGlhbG9nX2NoYW5nZWQoYnVmLCBGQUxTRSk7CisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCQlpZiAoIWJ1Zl92YWxpZChidWYpKQorCQkgICAgLyogQXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIsIG9vcHMhICBJdCdzIG5vdCBjaGFuZ2VkCisJCSAgICAgKiBub3cuICovCisJCSAgICByZXR1cm4gRkFJTDsKKyMgZW5kaWYKKwkgICAgfQorCSAgICBpZiAoYnVmSXNDaGFuZ2VkKGJ1ZikpCisjZW5kaWYKKwkgICAgeworCQlFTVNHTihfKCJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkIChhZGQgISB0byBvdmVycmlkZSkiKSwKKwkJCQkJCQkJIGJ1Zi0+Yl9mbnVtKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIElmIGRlbGV0aW5nIHRoZSBsYXN0IChsaXN0ZWQpIGJ1ZmZlciwgbWFrZSBpdCBlbXB0eS4KKwkgKiBUaGUgbGFzdCAobGlzdGVkKSBidWZmZXIgY2Fubm90IGJlIHVubG9hZGVkLgorCSAqLworCWZvciAoYnAgPSBmaXJzdGJ1ZjsgYnAgIT0gTlVMTDsgYnAgPSBicC0+Yl9uZXh0KQorCSAgICBpZiAoYnAtPmJfcF9ibCAmJiBicCAhPSBidWYpCisJCWJyZWFrOworCWlmIChicCA9PSBOVUxMICYmIGJ1ZiA9PSBjdXJidWYpCisJeworCSAgICBpZiAoYWN0aW9uID09IERPQlVGX1VOTE9BRCkKKwkgICAgeworCQlFTVNHKF8oIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKworCSAgICAvKiBDbG9zZSBhbnkgb3RoZXIgd2luZG93cyBvbiB0aGlzIGJ1ZmZlciwgdGhlbiBtYWtlIGl0IGVtcHR5LiAqLworI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICB7CisJCXdpbl9UCSp3cCwgKm5leHR3cDsKKworCQlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gbmV4dHdwKQorCQl7CisJCSAgICBuZXh0d3AgPSB3cC0+d19uZXh0OworCQkgICAgaWYgKHdwICE9IGN1cndpbiAmJiB3cC0+d19idWZmZXIgPT0gYnVmKQorCQkgICAgeworCQkJLyogU3RhcnQgYWxsIG92ZXIsIGF1dG9jb21tYW5kcyBtYXkgY2hhbmdlIHRoZSB3aW5kb3cKKwkJCSAqIGxheW91dC4gKi8KKwkJCW5leHR3cCA9IGZpcnN0d2luOworCQkJd2luX2Nsb3NlKHdwLCBGQUxTRSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorI2VuZGlmCisJICAgIHNldHBjbWFyaygpOworCSAgICByZXR2YWwgPSBkb19lY21kKDAsIE5VTEwsIE5VTEwsIE5VTEwsIEVDTURfT05FLAorCQkJCQkJICBmb3JjZWl0ID8gRUNNRF9GT1JDRUlUIDogMCk7CisKKwkgICAgLyoKKwkgICAgICogZG9fZWNtZCgpIG1heSBjcmVhdGUgYSBuZXcgYnVmZmVyLCB0aGVuIHdlIGhhdmUgdG8gZGVsZXRlCisJICAgICAqIHRoZSBvbGQgb25lLiAgQnV0IGRvX2VjbWQoKSBtYXkgaGF2ZSBkb25lIHRoYXQgYWxyZWFkeSwgY2hlY2sKKwkgICAgICogaWYgdGhlIGJ1ZmZlciBzdGlsbCBleGlzdHMuCisJICAgICAqLworCSAgICBpZiAoYnVmICE9IGN1cmJ1ZiAmJiBidWZfdmFsaWQoYnVmKSAmJiBidWYtPmJfbndpbmRvd3MgPT0gMCkKKwkJY2xvc2VfYnVmZmVyKE5VTEwsIGJ1ZiwgYWN0aW9uKTsKKwkgICAgcmV0dXJuIHJldHZhbDsKKwl9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkvKgorCSAqIElmIHRoZSBkZWxldGVkIGJ1ZmZlciBpcyB0aGUgY3VycmVudCBvbmUsIGNsb3NlIHRoZSBjdXJyZW50IHdpbmRvdworCSAqICh1bmxlc3MgaXQncyB0aGUgb25seSB3aW5kb3cpLgorCSAqLworCXdoaWxlIChidWYgPT0gY3VyYnVmICYmIGZpcnN0d2luICE9IGxhc3R3aW4pCisJICAgIHdpbl9jbG9zZShjdXJ3aW4sIEZBTFNFKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiB0aGUgYnVmZmVyIHRvIGJlIGRlbGV0ZWQgaXMgbm90IHRoZSBjdXJyZW50IG9uZSwgZGVsZXRlIGl0IGhlcmUuCisJICovCisJaWYgKGJ1ZiAhPSBjdXJidWYpCisJeworI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICBjbG9zZV93aW5kb3dzKGJ1Zik7CisjZW5kaWYKKwkgICAgaWYgKGJ1ZiAhPSBjdXJidWYgJiYgYnVmX3ZhbGlkKGJ1ZikgJiYgYnVmLT5iX253aW5kb3dzIDw9IDApCisJCWNsb3NlX2J1ZmZlcihOVUxMLCBidWYsIGFjdGlvbik7CisJICAgIHJldHVybiBPSzsKKwl9CisKKwkvKgorCSAqIERlbGV0aW5nIHRoZSBjdXJyZW50IGJ1ZmZlcjogTmVlZCB0byBmaW5kIGFub3RoZXIgYnVmZmVyIHRvIGdvIHRvLgorCSAqIFRoZXJlIG11c3QgYmUgYW5vdGhlciwgb3RoZXJ3aXNlIGl0IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlLgorCSAqIEZpcnN0IHVzZSBhdV9uZXdfY3VyYnVmLCBpZiBpdCBpcyB2YWxpZC4KKwkgKiBUaGVuIHByZWZlciB0aGUgYnVmZmVyIHdlIG1vc3QgcmVjZW50bHkgdmlzaXRlZC4KKwkgKiBFbHNlIHRyeSB0byBmaW5kIG9uZSB0aGF0IGlzIGxvYWRlZCwgYWZ0ZXIgdGhlIGN1cnJlbnQgYnVmZmVyLAorCSAqIHRoZW4gYmVmb3JlIHRoZSBjdXJyZW50IGJ1ZmZlci4KKwkgKiBGaW5hbGx5IHVzZSBhbnkgYnVmZmVyLgorCSAqLworCWJ1ZiA9IE5VTEw7CS8qIHNlbGVjdGVkIGJ1ZmZlciAqLworCWJwID0gTlVMTDsJLyogdXNlZCB3aGVuIG5vIGxvYWRlZCBidWZmZXIgZm91bmQgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlpZiAoYXVfbmV3X2N1cmJ1ZiAhPSBOVUxMICYmIGJ1Zl92YWxpZChhdV9uZXdfY3VyYnVmKSkKKwkgICAgYnVmID0gYXVfbmV3X2N1cmJ1ZjsKKyMgaWZkZWYgRkVBVF9KVU1QTElTVAorCWVsc2UKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfSlVNUExJU1QKKwkgICAgaWYgKGN1cndpbi0+d19qdW1wbGlzdGxlbiA+IDApCisJeworCSAgICBpbnQgICAgIGp1bXBpZHg7CisKKwkgICAganVtcGlkeCA9IGN1cndpbi0+d19qdW1wbGlzdGlkeCAtIDE7CisJICAgIGlmIChqdW1waWR4IDwgMCkKKwkJanVtcGlkeCA9IGN1cndpbi0+d19qdW1wbGlzdGxlbiAtIDE7CisKKwkgICAgZm9yd2FyZCA9IGp1bXBpZHg7CisJICAgIHdoaWxlIChqdW1waWR4ICE9IGN1cndpbi0+d19qdW1wbGlzdGlkeCkKKwkgICAgeworCQlidWYgPSBidWZsaXN0X2ZpbmRucihjdXJ3aW4tPndfanVtcGxpc3RbanVtcGlkeF0uZm1hcmsuZm51bSk7CisJCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQkgICAgaWYgKGJ1ZiA9PSBjdXJidWYgfHwgIWJ1Zi0+Yl9wX2JsKQorCQkJYnVmID0gTlVMTDsJLyogc2tpcCBjdXJyZW50IGFuZCB1bmxpc3RlZCBidWZzICovCisJCSAgICBlbHNlIGlmIChidWYtPmJfbWwubWxfbWZwID09IE5VTEwpCisJCSAgICB7CisJCQkvKiBza2lwIHVubG9hZGVkIGJ1ZiwgYnV0IG1heSBrZWVwIGl0IGZvciBsYXRlciAqLworCQkJaWYgKGJwID09IE5VTEwpCisJCQkgICAgYnAgPSBidWY7CisJCQlidWYgPSBOVUxMOworCQkgICAgfQorCQl9CisJCWlmIChidWYgIT0gTlVMTCkgICAvKiBmb3VuZCBhIHZhbGlkIGJ1ZmZlcjogc3RvcCBzZWFyY2hpbmcgKi8KKwkJICAgIGJyZWFrOworCQkvKiBhZHZhbmNlIHRvIG9sZGVyIGVudHJ5IGluIGp1bXAgbGlzdCAqLworCQlpZiAoIWp1bXBpZHggJiYgY3Vyd2luLT53X2p1bXBsaXN0aWR4ID09IGN1cndpbi0+d19qdW1wbGlzdGxlbikKKwkJICAgIGJyZWFrOworCQlpZiAoLS1qdW1waWR4IDwgMCkKKwkJICAgIGp1bXBpZHggPSBjdXJ3aW4tPndfanVtcGxpc3RsZW4gLSAxOworCQlpZiAoanVtcGlkeCA9PSBmb3J3YXJkKQkJLyogTGlzdCBleGhhdXN0ZWQgZm9yIHN1cmUgKi8KKwkJICAgIGJyZWFrOworCSAgICB9CisJfQorI2VuZGlmCisKKwlpZiAoYnVmID09IE5VTEwpCS8qIE5vIHByZXZpb3VzIGJ1ZmZlciwgVHJ5IDInbmQgYXBwcm9hY2ggKi8KKwl7CisJICAgIGZvcndhcmQgPSBUUlVFOworCSAgICBidWYgPSBjdXJidWYtPmJfbmV4dDsKKwkgICAgZm9yICg7OykKKwkgICAgeworCQlpZiAoYnVmID09IE5VTEwpCisJCXsKKwkJICAgIGlmICghZm9yd2FyZCkJLyogdHJpZWQgYm90aCBkaXJlY3Rpb25zICovCisJCQlicmVhazsKKwkJICAgIGJ1ZiA9IGN1cmJ1Zi0+Yl9wcmV2OworCQkgICAgZm9yd2FyZCA9IEZBTFNFOworCQkgICAgY29udGludWU7CisJCX0KKwkJLyogaW4gbm9uLWhlbHAgYnVmZmVyLCB0cnkgdG8gc2tpcCBoZWxwIGJ1ZmZlcnMsIGFuZCB2diAqLworCQlpZiAoYnVmLT5iX2hlbHAgPT0gY3VyYnVmLT5iX2hlbHAgJiYgYnVmLT5iX3BfYmwpCisJCXsKKwkJICAgIGlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpICAgLyogZm91bmQgbG9hZGVkIGJ1ZmZlciAqLworCQkJYnJlYWs7CisJCSAgICBpZiAoYnAgPT0gTlVMTCkJLyogcmVtZW1iZXIgdW5sb2FkZWQgYnVmIGZvciBsYXRlciAqLworCQkJYnAgPSBidWY7CisJCX0KKwkJaWYgKGZvcndhcmQpCisJCSAgICBidWYgPSBidWYtPmJfbmV4dDsKKwkJZWxzZQorCQkgICAgYnVmID0gYnVmLT5iX3ByZXY7CisJICAgIH0KKwl9CisJaWYgKGJ1ZiA9PSBOVUxMKQkvKiBObyBsb2FkZWQgYnVmZmVyLCB1c2UgdW5sb2FkZWQgb25lICovCisJICAgIGJ1ZiA9IGJwOworCWlmIChidWYgPT0gTlVMTCkJLyogTm8gbG9hZGVkIGJ1ZmZlciwgZmluZCBsaXN0ZWQgb25lICovCisJeworCSAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJCWlmIChidWYtPmJfcF9ibCAmJiBidWYgIT0gY3VyYnVmKQorCQkgICAgYnJlYWs7CisJfQorCWlmIChidWYgPT0gTlVMTCkJLyogU3RpbGwgbm8gYnVmZmVyLCBqdXN0IHRha2Ugb25lICovCisJeworCSAgICBpZiAoY3VyYnVmLT5iX25leHQgIT0gTlVMTCkKKwkJYnVmID0gY3VyYnVmLT5iX25leHQ7CisJICAgIGVsc2UKKwkJYnVmID0gY3VyYnVmLT5iX3ByZXY7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogbWFrZSBidWYgY3VycmVudCBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoYWN0aW9uID09IERPQlVGX1NQTElUKQkgICAgLyogc3BsaXQgd2luZG93IGZpcnN0ICovCisgICAgeworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwkvKiBqdW1wIHRvIGZpcnN0IHdpbmRvdyBjb250YWluaW5nIGJ1ZiBpZiBvbmUgZXhpc3RzICgidXNlb3BlbiIpICovCisJaWYgKHZpbV9zdHJjaHIocF9zd2IsICd1JykgJiYgYnVmX2p1bXBfb3Blbl93aW4oYnVmKSkKKwkgICAgcmV0dXJuIE9LOworCWlmICh3aW5fc3BsaXQoMCwgMCkgPT0gRkFJTCkKKyMgZW5kaWYKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBnbyB0byBjdXJyZW50IGJ1ZmZlciAtIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBpZiAoYnVmID09IGN1cmJ1ZikKKwlyZXR1cm4gT0s7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGJ1ZmZlciBtYXkgYmUgYWJhbmRvbmVkLgorICAgICAqLworICAgIGlmIChhY3Rpb24gPT0gRE9CVUZfR09UTyAmJiAhY2FuX2FiYW5kb24oY3VyYnVmLCBmb3JjZWl0KSkKKyAgICB7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCWlmICgocF9jb25maXJtIHx8IGNtZG1vZC5jb25maXJtKSAmJiBwX3dyaXRlKQorCXsKKwkgICAgZGlhbG9nX2NoYW5nZWQoY3VyYnVmLCBGQUxTRSk7CisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpZiAoIWJ1Zl92YWxpZChidWYpKQorCQkvKiBBdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciwgb29wcyEgKi8KKwkJcmV0dXJuIEZBSUw7CisjIGVuZGlmCisJfQorCWlmIChidWZJc0NoYW5nZWQoY3VyYnVmKSkKKyNlbmRpZgorCXsKKwkgICAgRU1TRyhfKGVfbm93cnRtc2cpKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorICAgIH0KKworICAgIC8qIEdvIHRvIHRoZSBvdGhlciBidWZmZXIuICovCisgICAgc2V0X2N1cmJ1ZihidWYsIGFjdGlvbik7CisKKyNpZiBkZWZpbmVkKEZFQVRfTElTVENNRFMpICYmIGRlZmluZWQoRkVBVF9TQ1JPTExCSU5EKQorICAgIGlmIChhY3Rpb24gPT0gRE9CVUZfU1BMSVQpCisJY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CS8qIHJlc2V0ICdzY3JvbGxiaW5kJyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisgICAgaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwlyZXR1cm4gRkFJTDsKKyNlbmRpZgorCisgICAgcmV0dXJuIE9LOworfQorCisjZW5kaWYgLyogRkVBVF9MSVNUQ01EUyAqLworCisvKgorICogU2V0IGN1cnJlbnQgYnVmZmVyIHRvICJidWYiLiAgRXhlY3V0ZXMgYXV0b2NvbW1hbmRzIGFuZCBjbG9zZXMgY3VycmVudAorICogYnVmZmVyLiAgImFjdGlvbiIgdGVsbHMgaG93IHRvIGNsb3NlIHRoZSBjdXJyZW50IGJ1ZmZlcjoKKyAqIERPQlVGX0dPVE8JICAgIGZyZWUgb3IgaGlkZSBpdAorICogRE9CVUZfU1BMSVQJICAgIG5vdGhpbmcKKyAqIERPQlVGX1VOTE9BRAkgICAgdW5sb2FkIGl0CisgKiBET0JVRl9ERUwJICAgIGRlbGV0ZSBpdAorICogRE9CVUZfV0lQRQkgICAgd2lwZSBpdCBvdXQKKyAqLworICAgIHZvaWQKK3NldF9jdXJidWYoYnVmLCBhY3Rpb24pCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCWFjdGlvbjsKK3sKKyAgICBidWZfVAkqcHJldmJ1ZjsKKyAgICBpbnQJCXVubG9hZCA9IChhY3Rpb24gPT0gRE9CVUZfVU5MT0FEIHx8IGFjdGlvbiA9PSBET0JVRl9ERUwKKwkJCQkJCSAgICAgfHwgYWN0aW9uID09IERPQlVGX1dJUEUpOworCisgICAgc2V0cGNtYXJrKCk7CisgICAgY3Vyd2luLT53X2FsdF9mbnVtID0gY3VyYnVmLT5iX2ZudW07IC8qIHJlbWVtYmVyIGFsdGVybmF0ZSBmaWxlICovCisgICAgYnVmbGlzdF9hbHRmcG9zKCk7CQkJIC8qIHJlbWVtYmVyIGN1cnBvcyAqLworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiBEb24ndCByZXN0YXJ0IFNlbGVjdCBtb2RlIGFmdGVyIHN3aXRjaGluZyB0byBhbm90aGVyIGJ1ZmZlci4gKi8KKyAgICBWSXN1YWxfcmVzZWxlY3QgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyogY2xvc2Vfd2luZG93cygpIG9yIGFwcGx5X2F1dG9jbWRzKCkgbWF5IGNoYW5nZSBjdXJidWYgKi8KKyAgICBwcmV2YnVmID0gY3VyYnVmOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGTEVBVkUsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworIyBpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoYnVmX3ZhbGlkKHByZXZidWYpICYmICFhYm9ydGluZygpKQorIyBlbHNlCisgICAgaWYgKGJ1Zl92YWxpZChwcmV2YnVmKSkKKyMgZW5kaWYKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAodW5sb2FkKQorCSAgICBjbG9zZV93aW5kb3dzKHByZXZidWYpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCWlmIChidWZfdmFsaWQocHJldmJ1ZikgJiYgIWFib3J0aW5nKCkpCisjZWxzZQorCWlmIChidWZfdmFsaWQocHJldmJ1ZikpCisjZW5kaWYKKwkgICAgY2xvc2VfYnVmZmVyKHByZXZidWYgPT0gY3Vyd2luLT53X2J1ZmZlciA/IGN1cndpbiA6IE5VTEwsIHByZXZidWYsCisJCSAgICB1bmxvYWQgPyBhY3Rpb24gOiAoYWN0aW9uID09IERPQlVGX0dPVE8KKwkJCSYmICFQX0hJRChwcmV2YnVmKQorCQkJJiYgIWJ1ZklzQ2hhbmdlZChwcmV2YnVmKSkgPyBET0JVRl9VTkxPQUQgOiAwKTsKKyAgICB9CisjaWZkZWYgRkVBVF9BVVRPQ01ECisjIGlmZGVmIEZFQVRfRVZBTAorICAgIC8qIEFuIGF1dG9jb21tYW5kIG1heSBoYXZlIGRlbGV0ZWQgYnVmIG9yIGFib3J0ZWQgdGhlIHNjcmlwdCBwcm9jZXNzaW5nISAqLworICAgIGlmIChidWZfdmFsaWQoYnVmKSAmJiAhYWJvcnRpbmcoKSkKKyMgZWxzZQorICAgIGlmIChidWZfdmFsaWQoYnVmKSkJICAgIC8qIGFuIGF1dG9jb21tYW5kIG1heSBoYXZlIGRlbGV0ZWQgYnVmISAqLworIyBlbmRpZgorI2VuZGlmCisJZW50ZXJfYnVmZmVyKGJ1Zik7Cit9CisKKy8qCisgKiBFbnRlciBhIG5ldyBjdXJyZW50IGJ1ZmZlci4KKyAqIE9sZCBjdXJidWYgbXVzdCBoYXZlIGJlZW4gYWJhbmRvbmVkIGFscmVhZHkhCisgKi8KKyAgICB2b2lkCitlbnRlcl9idWZmZXIoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgLyogQ29weSBidWZmZXIgYW5kIHdpbmRvdyBsb2NhbCBvcHRpb24gdmFsdWVzLiAgTm90IGZvciBhIGhlbHAgYnVmZmVyLiAqLworICAgIGJ1Zl9jb3B5X29wdGlvbnMoYnVmLCBCQ09fRU5URVIgfCBCQ09fTk9IRUxQKTsKKyAgICBpZiAoIWJ1Zi0+Yl9oZWxwKQorCWdldF93aW5vcHRzKGJ1Zik7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgZWxzZQorCS8qIFJlbW92ZSBhbGwgZm9sZHMgaW4gdGhlIHdpbmRvdy4gKi8KKwljbGVhckZvbGRpbmcoY3Vyd2luKTsKKyAgICBmb2xkVXBkYXRlQWxsKGN1cndpbik7CS8qIHVwZGF0ZSBmb2xkcyAobGF0ZXIpLiAqLworI2VuZGlmCisKKyAgICAvKiBHZXQgdGhlIGJ1ZmZlciBpbiB0aGUgY3VycmVudCB3aW5kb3cuICovCisgICAgY3Vyd2luLT53X2J1ZmZlciA9IGJ1ZjsKKyAgICBjdXJidWYgPSBidWY7CisgICAgKytjdXJidWYtPmJfbndpbmRvd3M7CisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBkaWZmX25ld19idWZmZXIoKTsKKyNlbmRpZgorCisgICAgLyogQ3Vyc29yIG9uIGZpcnN0IGxpbmUgYnkgZGVmYXVsdC4gKi8KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAxOworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBsb2FkZWQuICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgPT0gTlVMTCkJLyogbmVlZCB0byBsb2FkIHRoZSBmaWxlICovCisJb3Blbl9idWZmZXIoRkFMU0UsIE5VTEwpOworICAgIGVsc2UKKyAgICB7CisJbmVlZF9maWxlaW5mbyA9IFRSVUU7CQkvKiBkaXNwbGF5IGZpbGUgaW5mbyBhZnRlciByZWRyYXcgKi8KKwkodm9pZClidWZfY2hlY2tfdGltZXN0YW1wKGN1cmJ1ZiwgRkFMU0UpOyAvKiBjaGVjayBpZiBmaWxlIGNoYW5nZWQgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwljdXJ3aW4tPndfdG9wbGluZSA9IDE7CisjIGlmZGVmIEZFQVRfRElGRgorCWN1cndpbi0+d190b3BmaWxsID0gMDsKKyMgZW5kaWYKKwlhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZFTlRFUiwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGV0lORU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworI2VuZGlmCisgICAgfQorCisgICAgLyogSWYgYXV0b2NvbW1hbmRzIGRpZCBub3QgY2hhbmdlIHRoZSBjdXJzb3IgcG9zaXRpb24sIHJlc3RvcmUgY3Vyc29yIGxudW0KKyAgICAgKiBhbmQgcG9zc2libHkgY3Vyc29yIGNvbC4gKi8KKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID09IDEgJiYgaW5pbmRlbnQoMCkpCisJYnVmbGlzdF9nZXRmcG9zKCk7CisKKyAgICBjaGVja19hcmdfaWR4KGN1cndpbik7CQkvKiBjaGVjayBmb3IgdmFsaWQgYXJnX2lkeCAqLworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBtYWtldGl0bGUoKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGlmIChjdXJ3aW4tPndfdG9wbGluZSA9PSAxKQkJLyogd2hlbiBhdXRvY21kcyBkaWRuJ3QgY2hhbmdlIGl0ICovCisjZW5kaWYKKwlzY3JvbGxfY3Vyc29yX2hhbGZ3YXkoRkFMU0UpOwkvKiByZWRpc3BsYXkgYXQgY29ycmVjdCBwb3NpdGlvbiAqLworCisjaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApCisgICAgLyogQ2hhbmdlIGRpcmVjdG9yaWVzIHdoZW4gdGhlIGFjZCBvcHRpb24gaXMgc2V0IG9uLiAqLworICAgIGlmIChwX2FjZCAmJiBjdXJidWYtPmJfZmZuYW1lICE9IE5VTEwKKwkJCQkgICAgICYmIHZpbV9jaGRpcmZpbGUoY3VyYnVmLT5iX2ZmbmFtZSkgPT0gT0spCisJc2hvcnRlbl9mbmFtZXMoVFJVRSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfS0VZTUFQCisgICAgaWYgKGN1cmJ1Zi0+Yl9rbWFwX3N0YXRlICYgS0VZTUFQX0lOSVQpCisJa2V5bWFwX2luaXQoKTsKKyNlbmRpZgorICAgIHJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworfQorCisvKgorICogZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciBsaXN0CisgKi8KKworLyoKKyAqIEFkZCBhIGZpbGUgbmFtZSB0byB0aGUgYnVmZmVyIGxpc3QuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgc2FtZSBmaWxlIG5hbWUgYWxyZWFkeSBleGlzdHMgcmV0dXJuIGEgcG9pbnRlciB0byB0aGF0IGJ1ZmZlci4KKyAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBpZiBmbmFtZSA9PSBOVUxMLCBhIG5ldyBlbnRyeSBpcyBjcmVhdGVkLgorICogSWYgKGZsYWdzICYgQkxOX0NVUkJVRikgaXMgVFJVRSwgbWF5IHVzZSBjdXJyZW50IGJ1ZmZlci4KKyAqIElmIChmbGFncyAmIEJMTl9MSVNURUQpIGlzIFRSVUUsIGFkZCBuZXcgYnVmZmVyIHRvIGJ1ZmZlciBsaXN0LgorICogSWYgKGZsYWdzICYgQkxOX0RVTU1ZKSBpcyBUUlVFLCBkb24ndCBjb3VudCBpdCBhcyBhIHJlYWwgYnVmZmVyLgorICogSWYgKGZsYWdzICYgQkxOX0ZPUkNFKSBpcyBUUlVFLCBkb24ndCBhYm9ydCBvbiBhbiBlcnJvci4KKyAqIFRoaXMgaXMgdGhlIE9OTFkgd2F5IHRvIGNyZWF0ZSBhIG5ldyBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgIHRvcF9maWxlX251bSA9IDE7CQkvKiBoaWdoZXN0IGZpbGUgbnVtYmVyICovCisKKyAgICBidWZfVCAqCitidWZsaXN0X25ldyhmZm5hbWUsIHNmbmFtZSwgbG51bSwgZmxhZ3MpCisgICAgY2hhcl91CSpmZm5hbWU7CS8qIGZ1bGwgcGF0aCBvZiBmbmFtZSBvciByZWxhdGl2ZSAqLworICAgIGNoYXJfdQkqc2ZuYW1lOwkvKiBzaG9ydCBmbmFtZSBvciBOVUxMICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIHByZWZlcnJlZCBjdXJzb3IgbGluZSAqLworICAgIGludAkJZmxhZ3M7CQkvKiBCTE5fIGRlZmluZXMgKi8KK3sKKyAgICBidWZfVAkqYnVmOworI2lmZGVmIFVOSVgKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKyNlbmRpZgorCisgICAgZm5hbWVfZXhwYW5kKGN1cmJ1ZiwgJmZmbmFtZSwgJnNmbmFtZSk7CS8qIHdpbGwgYWxsb2NhdGUgZmZuYW1lICovCisKKyAgICAvKgorICAgICAqIElmIGZpbGUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCwgdXBkYXRlIHRoZSBlbnRyeS4KKyAgICAgKi8KKyNpZmRlZiBVTklYCisgICAgLyogT24gVW5peCB3ZSBjYW4gdXNlIGlub2RlIG51bWJlcnMgd2hlbiB0aGUgZmlsZSBleGlzdHMuICBXb3JrcyBiZXR0ZXIKKyAgICAgKiBmb3IgaGFyZCBsaW5rcy4gKi8KKyAgICBpZiAoc2ZuYW1lID09IE5VTEwgfHwgbWNoX3N0YXQoKGNoYXIgKilzZm5hbWUsICZzdCkgPCAwKQorCXN0LnN0X2RldiA9IChkZXZfVCktMTsKKyNlbmRpZgorICAgIGlmIChmZm5hbWUgIT0gTlVMTCAmJiAhKGZsYWdzICYgQkxOX0RVTU1ZKSAmJiAoYnVmID0KKyNpZmRlZiBVTklYCisJCWJ1Zmxpc3RfZmluZG5hbWVfc3RhdChmZm5hbWUsICZzdCkKKyNlbHNlCisJCWJ1Zmxpc3RfZmluZG5hbWUoZmZuYW1lKQorI2VuZGlmCisJCSkgIT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoZmZuYW1lKTsKKwlpZiAobG51bSAhPSAwKQorCSAgICBidWZsaXN0X3NldGZwb3MoYnVmLCBjdXJ3aW4sIGxudW0sIChjb2xucl9UKTAsIEZBTFNFKTsKKwkvKiBjb3B5IHRoZSBvcHRpb25zIG5vdywgaWYgJ2NwbycgZG9lc24ndCBoYXZlICdzJyBhbmQgbm90IGRvbmUKKwkgKiBhbHJlYWR5ICovCisJYnVmX2NvcHlfb3B0aW9ucyhidWYsIDApOworCWlmICgoZmxhZ3MgJiBCTE5fTElTVEVEKSAmJiAhYnVmLT5iX3BfYmwpCisJeworCSAgICBidWYtPmJfcF9ibCA9IFRSVUU7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIGlmICghKGZsYWdzICYgQkxOX0RVTU1ZKSkKKwkJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGQURELCBOVUxMLCBOVUxMLCBGQUxTRSwgYnVmKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGhhcyBubyBuYW1lIGFuZCBubyBjb250ZW50cywgdXNlIHRoZSBjdXJyZW50CisgICAgICogYnVmZmVyLglPdGhlcndpc2U6IE5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYnVmZmVyIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIE9OTFkgcGxhY2Ugd2hlcmUgYSBuZXcgYnVmZmVyIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQhCisgICAgICovCisgICAgYnVmID0gTlVMTDsKKyAgICBpZiAoKGZsYWdzICYgQkxOX0NVUkJVRikKKwkgICAgJiYgY3VyYnVmICE9IE5VTEwKKwkgICAgJiYgY3VyYnVmLT5iX2ZmbmFtZSA9PSBOVUxMCisJICAgICYmIGN1cmJ1Zi0+Yl9ud2luZG93cyA8PSAxCisJICAgICYmIChjdXJidWYtPmJfbWwubWxfbWZwID09IE5VTEwgfHwgYnVmZW1wdHkoKSkpCisgICAgeworCWJ1ZiA9IGN1cmJ1ZjsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkvKiBJdCdzIGxpa2UgdGhpcyBidWZmZXIgaXMgZGVsZXRlZC4gIFdhdGNoIG91dCBmb3IgYXV0b2NvbW1hbmRzIHRoYXQKKwkgKiBjaGFuZ2UgY3VyYnVmISAgSWYgdGhhdCBoYXBwZW5zLCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgYW55d2F5LiAqLworCWlmIChjdXJidWYtPmJfcF9ibCkKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGREVMRVRFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwlpZiAoYnVmID09IGN1cmJ1ZikKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGV0lQRU9VVCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjIGlmZGVmIEZFQVRfRVZBTAorCS8qIGF1dG9jbWRzIG1heSBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZyAqLworCWlmICghKGZsYWdzICYgQkxOX0ZPUkNFKSAmJiBhYm9ydGluZygpKQorCSAgICByZXR1cm4gTlVMTDsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisJaWYgKGJ1ZiA9PSBjdXJidWYpCisjIGVuZGlmCisJeworCSAgICAvKiBNYWtlIHN1cmUgJ2J1ZmhpZGRlbicgYW5kICdidWZ0eXBlJyBhcmUgZW1wdHkgKi8KKwkgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYmgpOworCSAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9idCk7CisJfQorI2VuZGlmCisgICAgfQorICAgIGlmIChidWYgIT0gY3VyYnVmIHx8IGN1cmJ1ZiA9PSBOVUxMKQorICAgIHsKKwlidWYgPSAoYnVmX1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKGJ1Zl9UKSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUoZmZuYW1lKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIGlmIChmZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJYnVmLT5iX2ZmbmFtZSA9IGZmbmFtZTsKKwlidWYtPmJfc2ZuYW1lID0gdmltX3N0cnNhdmUoc2ZuYW1lKTsKKyAgICB9CisKKyAgICBjbGVhcl93aW5pbmZvKGJ1Zik7CisgICAgYnVmLT5iX3dpbmluZm8gPSAod2luaW5mb19UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKXNpemVvZih3aW5pbmZvX1QpKTsKKworICAgIGlmICgoZmZuYW1lICE9IE5VTEwgJiYgKGJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCB8fCBidWYtPmJfc2ZuYW1lID09IE5VTEwpKQorCSAgICB8fCBidWYtPmJfd2luaW5mbyA9PSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShidWYtPmJfZmZuYW1lKTsKKwlidWYtPmJfZmZuYW1lID0gTlVMTDsKKwl2aW1fZnJlZShidWYtPmJfc2ZuYW1lKTsKKwlidWYtPmJfc2ZuYW1lID0gTlVMTDsKKwlpZiAoYnVmICE9IGN1cmJ1ZikKKwkgICAgZnJlZV9idWZmZXIoYnVmKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoYnVmID09IGN1cmJ1ZikKKyAgICB7CisJLyogZnJlZSBhbGwgdGhpbmdzIGFsbG9jYXRlZCBmb3IgdGhpcyBidWZmZXIgKi8KKwlidWZfZnJlZWFsbChidWYsIEZBTFNFLCBGQUxTRSk7CisJaWYgKGJ1ZiAhPSBjdXJidWYpCSAvKiBhdXRvY29tbWFuZHMgZGVsZXRlZCB0aGUgYnVmZmVyISAqLworCSAgICByZXR1cm4gTlVMTDsKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJaWYgKCEoZmxhZ3MgJiBCTE5fRk9SQ0UpICYmIGFib3J0aW5nKCkpCisJICAgIHJldHVybiBOVUxMOworI2VuZGlmCisJLyogYnVmLT5iX253aW5kb3dzID0gMDsgd2h5IHdhcyB0aGlzIGhlcmU/ICovCisJZnJlZV9idWZmZXJfc3R1ZmYoYnVmLCBGQUxTRSk7CS8qIGRlbGV0ZSBsb2NhbCB2YXJpYWJsZXMgZXQgYWwuICovCisjaWZkZWYgRkVBVF9LRVlNQVAKKwkvKiBuZWVkIHRvIHJlbG9hZCBsbWFwcyBhbmQgc2V0IGI6a2V5bWFwX25hbWUgKi8KKwljdXJidWYtPmJfa21hcF9zdGF0ZSB8PSBLRVlNQVBfSU5JVDsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogcHV0IG5ldyBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGxpc3QKKwkgKi8KKwlidWYtPmJfbmV4dCA9IE5VTEw7CisJaWYgKGZpcnN0YnVmID09IE5VTEwpCQkvKiBidWZmZXIgbGlzdCBpcyBlbXB0eSAqLworCXsKKwkgICAgYnVmLT5iX3ByZXYgPSBOVUxMOworCSAgICBmaXJzdGJ1ZiA9IGJ1ZjsKKwl9CisJZWxzZQkJCQkvKiBhcHBlbmQgbmV3IGJ1ZmZlciBhdCBlbmQgb2YgbGlzdCAqLworCXsKKwkgICAgbGFzdGJ1Zi0+Yl9uZXh0ID0gYnVmOworCSAgICBidWYtPmJfcHJldiA9IGxhc3RidWY7CisJfQorCWxhc3RidWYgPSBidWY7CisKKwlidWYtPmJfZm51bSA9IHRvcF9maWxlX251bSsrOworCWlmICh0b3BfZmlsZV9udW0gPCAwKQkJLyogd3JhcCBhcm91bmQgKG1heSBjYXVzZSBkdXBsaWNhdGVzKSAqLworCXsKKwkgICAgRU1TRyhfKCJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIpKTsKKwkgICAgaWYgKGVtc2dfc2lsZW50ID09IDApCisJICAgIHsKKwkJb3V0X2ZsdXNoKCk7CisJCXVpX2RlbGF5KDMwMDBMLCBUUlVFKTsJLyogbWFrZSBzdXJlIGl0IGlzIG5vdGljZWQgKi8KKwkgICAgfQorCSAgICB0b3BfZmlsZV9udW0gPSAxOworCX0KKworCS8qCisJICogQWx3YXlzIGNvcHkgdGhlIG9wdGlvbnMgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuCisJICovCisJYnVmX2NvcHlfb3B0aW9ucyhidWYsIEJDT19BTFdBWVMpOworICAgIH0KKworICAgIGJ1Zi0+Yl93aW5pbmZvLT53aV9mcG9zLmxudW0gPSBsbnVtOworICAgIGJ1Zi0+Yl93aW5pbmZvLT53aV93aW4gPSBjdXJ3aW47CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICB2YXJfaW5pdCgmYnVmLT5iX3ZhcnMpOwkJLyogaW5pdCBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyNlbmRpZgorCisgICAgYnVmLT5iX2ZuYW1lID0gYnVmLT5iX3NmbmFtZTsKKyNpZmRlZiBVTklYCisgICAgaWYgKHN0LnN0X2RldiA9PSAoZGV2X1QpLTEpCisJYnVmLT5iX2RldiA9IC0xOworICAgIGVsc2UKKyAgICB7CisJYnVmLT5iX2RldiA9IHN0LnN0X2RldjsKKwlidWYtPmJfaW5vID0gc3Quc3RfaW5vOworICAgIH0KKyNlbmRpZgorICAgIGJ1Zi0+Yl91X3N5bmNlZCA9IFRSVUU7CisgICAgYnVmLT5iX2ZsYWdzID0gQkZfQ0hFQ0tfUk8gfCBCRl9ORVZFUkxPQURFRDsKKyAgICBidWZfY2xlYXJfZmlsZShidWYpOworICAgIGNscmFsbG1hcmtzKGJ1Zik7CQkJLyogY2xlYXIgbWFya3MgKi8KKyAgICBmbWFya3NfY2hlY2tfbmFtZXMoYnVmKTsJCS8qIGNoZWNrIGZpbGUgbWFya3MgZm9yIHRoaXMgZmlsZSAqLworICAgIGJ1Zi0+Yl9wX2JsID0gKGZsYWdzICYgQkxOX0xJU1RFRCkgPyBUUlVFIDogRkFMU0U7CS8qIGluaXQgJ2J1Zmxpc3RlZCcgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoIShmbGFncyAmIEJMTl9EVU1NWSkpCisgICAgeworCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRk5FVywgTlVMTCwgTlVMTCwgRkFMU0UsIGJ1Zik7CisJaWYgKGZsYWdzICYgQkxOX0xJU1RFRCkKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGQURELCBOVUxMLCBOVUxMLCBGQUxTRSwgYnVmKTsKKyMgaWZkZWYgRkVBVF9FVkFMCisJLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJaWYgKCEoZmxhZ3MgJiBCTE5fRk9SQ0UpICYmIGFib3J0aW5nKCkpCisJICAgIHJldHVybiBOVUxMOworIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIEZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIG9wdGlvbnMgb2YgYSBidWZmZXIuCisgKiBJZiAiZnJlZV9wX2ZmIiBpcyBUUlVFIGFsc28gZnJlZSAnZmlsZWZvcm1hdCcsICdidWZ0eXBlJyBhbmQKKyAqICdmaWxlZW5jb2RpbmcnLgorICovCisgICAgdm9pZAorZnJlZV9idWZfb3B0aW9ucyhidWYsIGZyZWVfcF9mZikKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZnJlZV9wX2ZmOworeworICAgIGlmIChmcmVlX3BfZmYpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwljbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9mZW5jKTsKKyNlbmRpZgorCWNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2ZmKTsKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYmgpOworCWNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2J0KTsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9kZWYpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luYyk7CisjIGlmZGVmIEZFQVRfRVZBTAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZXgpOworIyBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZGUpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZGspOworI2VuZGlmCisjaWZkZWYgRkVBVF9DUllQVAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2tleSk7CisjZW5kaWYKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9rcCk7CisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfbXBzKTsKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9mbyk7CisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfaXNrKTsKKyNpZmRlZiBGRUFUX0tFWU1BUAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2tleW1hcCk7CisgICAgZ2FfY2xlYXIoJmJ1Zi0+Yl9rbWFwX2dhKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9jb20pOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfY21zKTsKKyNlbmRpZgorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX25mKTsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX3N5bik7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9zdWEpOworI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZnQpOworI2VuZGlmCisjaWZkZWYgRkVBVF9PU0ZJTEVUWVBFCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3Bfb2Z0KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0lOREVOVAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2NpbmspOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2Npbm8pOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpIHx8IGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9jaW53KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2NwdCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZ3ApOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX21wKTsKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9lZm0pOworI2VuZGlmCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZXApOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX3BhdGgpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX3RhZ3MpOworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2RpY3QpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX3Rzcik7CisjZW5kaWYKKyAgICBidWYtPmJfcF9hciA9IC0xOworfQorCisvKgorICogZ2V0IGFsdGVybmF0ZSBmaWxlIG4KKyAqIHNldCBsaW5lbnIgdG8gbG51bSBvciBhbHRmcG9zLmxudW0gaWYgbG51bSA9PSAwCisgKglhbHNvIHNldCBjdXJzb3IgY29sdW1uIHRvIGFsdGZwb3MuY29sIGlmICdzdGFydG9mbGluZScgaXMgbm90IHNldC4KKyAqIGlmIChvcHRpb25zICYgR0VURl9TRVRNQVJLKSBjYWxsIHNldHBjbWFyaygpCisgKiBpZiAob3B0aW9ucyAmIEdFVEZfQUxUKSB3ZSBhcmUganVtcGluZyB0byBhbiBhbHRlcm5hdGUgZmlsZS4KKyAqIGlmIChvcHRpb25zICYgR0VURl9TV0lUQ0gpIHJlc3BlY3QgJ3N3aXRjaGJ1Zicgc2V0dGluZ3Mgd2hlbiBqdW1waW5nCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIGZvciBzdWNjZXNzCisgKi8KKyAgICBpbnQKK2J1Zmxpc3RfZ2V0ZmlsZShuLCBsbnVtLCBvcHRpb25zLCBmb3JjZWl0KQorICAgIGludAkJbjsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJb3B0aW9uczsKKyAgICBpbnQJCWZvcmNlaXQ7Cit7CisgICAgYnVmX1QJKmJ1ZjsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3AgPSBOVUxMOworI2VuZGlmCisgICAgcG9zX1QJKmZwb3M7CisgICAgY29sbnJfVAljb2w7CisKKyAgICBidWYgPSBidWZsaXN0X2ZpbmRucihuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgeworCWlmICgob3B0aW9ucyAmIEdFVEZfQUxUKSAmJiBuID09IDApCisJICAgIEVNU0coXyhlX25vYWx0KSk7CisJZWxzZQorCSAgICBFTVNHTihfKCJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIiksIG4pOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIGlmIGFsdGVybmF0ZSBmaWxlIGlzIHRoZSBjdXJyZW50IGJ1ZmZlciwgbm90aGluZyB0byBkbyAqLworICAgIGlmIChidWYgPT0gY3VyYnVmKQorCXJldHVybiBPSzsKKworI2lmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDApCisJcmV0dXJuIEZBSUw7CisjZW5kaWYKKworICAgIC8qIGFsdGZwb3MgbWF5IGJlIGNoYW5nZWQgYnkgZ2V0ZmlsZSgpLCBnZXQgaXQgbm93ICovCisgICAgaWYgKGxudW0gPT0gMCkKKyAgICB7CisJZnBvcyA9IGJ1Zmxpc3RfZmluZGZwb3MoYnVmKTsKKwlsbnVtID0gZnBvcy0+bG51bTsKKwljb2wgPSBmcG9zLT5jb2w7CisgICAgfQorICAgIGVsc2UKKwljb2wgPSAwOworCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKG9wdGlvbnMgJiBHRVRGX1NXSVRDSCkKKyAgICB7CisJLyogdXNlIGV4aXN0aW5nIG9wZW4gd2luZG93IGZvciBidWZmZXIgaWYgd2FudGVkICovCisJaWYgKHZpbV9zdHJjaHIocF9zd2IsICd1JykpICAgICAvKiB1c2VvcGVuICovCisJICAgIHdwID0gYnVmX2p1bXBfb3Blbl93aW4oYnVmKTsKKwkvKiBzcGxpdCB3aW5kb3cgaWYgd2FudGVkICgic3BsaXQiKSAqLworCWlmICh3cCA9PSBOVUxMICYmIHZpbV9zdHJjaHIocF9zd2IsICd0JykgJiYgIWJ1ZmVtcHR5KCkpCisJeworCSAgICBpZiAod2luX3NwbGl0KDAsIDApID09IEZBSUwpCisJCXJldHVybiBGQUlMOworIyBpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwkgICAgY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CisjIGVuZGlmCisJfQorICAgIH0KKyNlbmRpZgorCisgICAgKytSZWRyYXdpbmdEaXNhYmxlZDsKKyAgICBpZiAoZ2V0ZmlsZShidWYtPmJfZm51bSwgTlVMTCwgTlVMTCwgKG9wdGlvbnMgJiBHRVRGX1NFVE1BUkspLAorCQkJCQkJCSAgbG51bSwgZm9yY2VpdCkgPD0gMCkKKyAgICB7CisJLS1SZWRyYXdpbmdEaXNhYmxlZDsKKworCS8qIGN1cnNvciBpcyBhdCB0byBCT0wgYW5kIHdfY3Vyc29yLmxudW0gaXMgY2hlY2tlZCBkdWUgdG8gZ2V0ZmlsZSgpICovCisJaWYgKCFwX3NvbCAmJiBjb2wgIT0gMCkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gY29sOworCSAgICBjaGVja19jdXJzb3JfY29sKCk7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKwkgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisJfQorCXJldHVybiBPSzsKKyAgICB9CisgICAgLS1SZWRyYXdpbmdEaXNhYmxlZDsKKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIGdvIHRvIHRoZSBsYXN0IGtub3cgbGluZSBudW1iZXIgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlcgorICovCisgICAgdm9pZAorYnVmbGlzdF9nZXRmcG9zKCkKK3sKKyAgICBwb3NfVAkqZnBvczsKKworICAgIGZwb3MgPSBidWZsaXN0X2ZpbmRmcG9zKGN1cmJ1Zik7CisKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBmcG9zLT5sbnVtOworICAgIGNoZWNrX2N1cnNvcl9sbnVtKCk7CisKKyAgICBpZiAocF9zb2wpCisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIGVsc2UKKyAgICB7CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBmcG9zLT5jb2w7CisJY2hlY2tfY3Vyc29yX2NvbCgpOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwljdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBGaW5kIGZpbGUgaW4gYnVmZmVyIGxpc3QgYnkgbmFtZSAoaXQgaGFzIHRvIGJlIGZvciB0aGUgY3VycmVudCB3aW5kb3cpLgorICogImZmbmFtZSIgbXVzdCBoYXZlIGEgZnVsbCBwYXRoLgorICovCisgICAgYnVmX1QgKgorYnVmbGlzdF9maW5kbmFtZShmZm5hbWUpCisgICAgY2hhcl91CSpmZm5hbWU7Cit7CisjaWZkZWYgVU5JWAorICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZmZuYW1lLCAmc3QpIDwgMCkKKwlzdC5zdF9kZXYgPSAoZGV2X1QpLTE7CisgICAgcmV0dXJuIGJ1Zmxpc3RfZmluZG5hbWVfc3RhdChmZm5hbWUsICZzdCk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGJ1Zmxpc3RfZmluZG5hbWUoKSwgYnV0IHBhc3MgdGhlIHN0YXQgc3RydWN0dXJlIHRvIGF2b2lkIGdldHRpbmcgaXQKKyAqIHR3aWNlIGZvciB0aGUgc2FtZSBmaWxlLgorICovCisgICAgc3RhdGljIGJ1Zl9UICoKK2J1Zmxpc3RfZmluZG5hbWVfc3RhdChmZm5hbWUsIHN0cCkKKyAgICBjaGFyX3UJKmZmbmFtZTsKKyAgICBzdHJ1Y3Qgc3RhdAkqc3RwOworeworI2VuZGlmCisgICAgYnVmX1QJKmJ1ZjsKKworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoIW90aGVyZmlsZV9idWYoYnVmLCBmZm5hbWUKKyNpZmRlZiBVTklYCisJCSAgICAsIHN0cAorI2VuZGlmCisJCSAgICApKQorCSAgICByZXR1cm4gYnVmOworICAgIHJldHVybiBOVUxMOworfQorCisjaWYgZGVmaW5lZChGRUFUX0xJU1RDTURTKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX1BFUkwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRmluZCBmaWxlIGluIGJ1ZmZlciBsaXN0IGJ5IGEgcmVnZXhwIHBhdHRlcm4uCisgKiBSZXR1cm4gZm51bSBvZiB0aGUgZm91bmQgYnVmZmVyLgorICogUmV0dXJuIDwgMCBmb3IgZXJyb3IuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGludAorYnVmbGlzdF9maW5kcGF0KHBhdHRlcm4sIHBhdHRlcm5fZW5kLCB1bmxpc3RlZCwgZGlmZm1vZGUpCisgICAgY2hhcl91CSpwYXR0ZXJuOworICAgIGNoYXJfdQkqcGF0dGVybl9lbmQ7CS8qIHBvaW50ZXIgdG8gZmlyc3QgY2hhciBhZnRlciBwYXR0ZXJuICovCisgICAgaW50CQl1bmxpc3RlZDsJLyogZmluZCB1bmxpc3RlZCBidWZmZXJzICovCisgICAgaW50CQlkaWZmbW9kZTsJLyogZmluZCBkaWZmLW1vZGUgYnVmZmVycyBvbmx5ICovCit7CisgICAgYnVmX1QJKmJ1ZjsKKyAgICByZWdwcm9nX1QJKnByb2c7CisgICAgaW50CQltYXRjaCA9IC0xOworICAgIGludAkJZmluZF9saXN0ZWQ7CisgICAgY2hhcl91CSpwYXQ7CisgICAgY2hhcl91CSpwYXRlbmQ7CisgICAgaW50CQlhdHRlbXB0OworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXRvZ2dsZWRvbGxhcjsKKworICAgIGlmIChwYXR0ZXJuX2VuZCA9PSBwYXR0ZXJuICsgMSAmJiAoKnBhdHRlcm4gPT0gJyUnIHx8ICpwYXR0ZXJuID09ICcjJykpCisgICAgeworCWlmICgqcGF0dGVybiA9PSAnJScpCisJICAgIG1hdGNoID0gY3VyYnVmLT5iX2ZudW07CisJZWxzZQorCSAgICBtYXRjaCA9IGN1cndpbi0+d19hbHRfZm51bTsKKyNpZmRlZiBGRUFUX0RJRkYKKwlpZiAoZGlmZm1vZGUgJiYgIWRpZmZfbW9kZV9idWYoYnVmbGlzdF9maW5kbnIobWF0Y2gpKSkKKwkgICAgbWF0Y2ggPSAtMTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogVHJ5IGZvdXIgd2F5cyBvZiBtYXRjaGluZyBhIGxpc3RlZCBidWZmZXI6CisgICAgICogYXR0ZW1wdCA9PSAwOiB3aXRob3V0ICdeJyBvciAnJCcgKGF0IGFueSBwb3NpdGlvbikKKyAgICAgKiBhdHRlbXB0ID09IDE6IHdpdGggJ14nIGF0IHN0YXJ0IChvbmx5IGF0IHBvc3Rpb24gMCkKKyAgICAgKiBhdHRlbXB0ID09IDI6IHdpdGggJyQnIGF0IGVuZCAob25seSBtYXRjaCBhdCBlbmQpCisgICAgICogYXR0ZW1wdCA9PSAzOiB3aXRoICdeJyBhdCBzdGFydCBhbmQgJyQnIGF0IGVuZCAob25seSBmdWxsIG1hdGNoKQorICAgICAqIFJlcGVhdCB0aGlzIGZvciBmaW5kaW5nIGFuIHVubGlzdGVkIGJ1ZmZlciBpZiB0aGVyZSB3YXMgbm8gbWF0Y2hpbmcKKyAgICAgKiBsaXN0ZWQgYnVmZmVyLgorICAgICAqLworICAgIGVsc2UKKyAgICB7CisJcGF0ID0gZmlsZV9wYXRfdG9fcmVnX3BhdChwYXR0ZXJuLCBwYXR0ZXJuX2VuZCwgTlVMTCwgRkFMU0UpOworCWlmIChwYXQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIC0xOworCXBhdGVuZCA9IHBhdCArIFNUUkxFTihwYXQpIC0gMTsKKwl0b2dnbGVkb2xsYXIgPSAocGF0ZW5kID4gcGF0ICYmICpwYXRlbmQgPT0gJyQnKTsKKworCS8qIEZpcnN0IHRyeSBmaW5kaW5nIGEgbGlzdGVkIGJ1ZmZlci4gIElmIG5vdCBmb3VuZCBhbmQgInVubGlzdGVkIgorCSAqIGlzIFRSVUUsIHRyeSBmaW5kaW5nIGFuIHVubGlzdGVkIGJ1ZmZlci4gKi8KKwlmaW5kX2xpc3RlZCA9IFRSVUU7CisJZm9yICg7OykKKwl7CisJICAgIGZvciAoYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gMzsgKythdHRlbXB0KQorCSAgICB7CisJCS8qIG1heSBhZGQgJ14nIGFuZCAnJCcgKi8KKwkJaWYgKHRvZ2dsZWRvbGxhcikKKwkJICAgICpwYXRlbmQgPSAoYXR0ZW1wdCA8IDIpID8gTlVMIDogJyQnOyAvKiBhZGQvcmVtb3ZlICckJyAqLworCQlwID0gcGF0OworCQlpZiAoKnAgPT0gJ14nICYmICEoYXR0ZW1wdCAmIDEpKQkgLyogYWRkL3JlbW92ZSAnXicgKi8KKwkJICAgICsrcDsKKwkJcHJvZyA9IHZpbV9yZWdjb21wKHAsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworCQlpZiAocHJvZyA9PSBOVUxMKQorCQl7CisJCSAgICB2aW1fZnJlZShwYXQpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKwkJZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCQkgICAgaWYgKGJ1Zi0+Yl9wX2JsID09IGZpbmRfbGlzdGVkCisjaWZkZWYgRkVBVF9ESUZGCisJCQkgICAgJiYgKCFkaWZmbW9kZSB8fCBkaWZmX21vZGVfYnVmKGJ1ZikpCisjZW5kaWYKKwkJCSAgICAmJiBidWZsaXN0X21hdGNoKHByb2csIGJ1ZikgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWlmIChtYXRjaCA+PSAwKQkJLyogYWxyZWFkeSBmb3VuZCBhIG1hdGNoICovCisJCQl7CisJCQkgICAgbWF0Y2ggPSAtMjsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCW1hdGNoID0gYnVmLT5iX2ZudW07CS8qIHJlbWVtYmVyIGZpcnN0IG1hdGNoICovCisJCSAgICB9CisKKwkJdmltX2ZyZWUocHJvZyk7CisJCWlmIChtYXRjaCA+PSAwKQkJCS8qIGZvdW5kIG9uZSBtYXRjaCAqLworCQkgICAgYnJlYWs7CisJICAgIH0KKworCSAgICAvKiBPbmx5IHNlYXJjaCBmb3IgdW5saXN0ZWQgYnVmZmVycyBpZiB0aGVyZSB3YXMgbm8gbWF0Y2ggd2l0aAorCSAgICAgKiBhIGxpc3RlZCBidWZmZXIuICovCisJICAgIGlmICghdW5saXN0ZWQgfHwgIWZpbmRfbGlzdGVkIHx8IG1hdGNoICE9IC0xKQorCQlicmVhazsKKwkgICAgZmluZF9saXN0ZWQgPSBGQUxTRTsKKwl9CisKKwl2aW1fZnJlZShwYXQpOworICAgIH0KKworICAgIGlmIChtYXRjaCA9PSAtMikKKwlFTVNHMihfKCJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIiksIHBhdHRlcm4pOworICAgIGVsc2UgaWYgKG1hdGNoIDwgMCkKKwlFTVNHMihfKCJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiKSwgcGF0dGVybik7CisgICAgcmV0dXJuIG1hdGNoOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEZpbmQgYWxsIGJ1ZmZlciBuYW1lcyB0aGF0IG1hdGNoLgorICogRm9yIGNvbW1hbmQgbGluZSBleHBhbnNpb24gb2YgIjpidWYiIGFuZCAiOnNidWYiLgorICogUmV0dXJuIE9LIGlmIG1hdGNoZXMgZm91bmQsIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitFeHBhbmRCdWZuYW1lcyhwYXQsIG51bV9maWxlLCBmaWxlLCBvcHRpb25zKQorICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJKm51bV9maWxlOworICAgIGNoYXJfdQkqKipmaWxlOworICAgIGludAkJb3B0aW9uczsKK3sKKyAgICBpbnQJCWNvdW50ID0gMDsKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJcm91bmQ7CisgICAgY2hhcl91CSpwOworICAgIGludAkJYXR0ZW1wdDsKKyAgICByZWdwcm9nX1QJKnByb2c7CisKKyAgICAqbnVtX2ZpbGUgPSAwOwkJICAgIC8qIHJldHVybiB2YWx1ZXMgaW4gY2FzZSBvZiBGQUlMICovCisgICAgKmZpbGUgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBhdHRlbXB0ID09IDE6IHRyeSBtYXRjaCB3aXRoICAgICdeJywgbWF0Y2ggYXQgc3RhcnQKKyAgICAgKiBhdHRlbXB0ID09IDI6IHRyeSBtYXRjaCB3aXRob3V0ICdeJywgbWF0Y2ggYW55d2hlcmUKKyAgICAgKi8KKyAgICBmb3IgKGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IDI7ICsrYXR0ZW1wdCkKKyAgICB7CisJaWYgKGF0dGVtcHQgPT0gMikKKwl7CisJICAgIGlmICgqcGF0ICE9ICdeJykJICAgIC8qIHRoZXJlJ3Mgbm8gJ14nLCBubyBuZWVkIHRvIHRyeSBhZ2FpbiAqLworCQlicmVhazsKKwkgICAgKytwYXQ7CQkgICAgLyogc2tpcCB0aGUgJ14nICovCisJfQorCXByb2cgPSB2aW1fcmVnY29tcChwYXQsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworCWlmIChwcm9nID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCisJLyoKKwkgKiByb3VuZCA9PSAxOiBDb3VudCB0aGUgbWF0Y2hlcy4KKwkgKiByb3VuZCA9PSAyOiBCdWlsZCB0aGUgYXJyYXkgdG8ga2VlcCB0aGUgbWF0Y2hlcy4KKwkgKi8KKwlmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKwl7CisJICAgIGNvdW50ID0gMDsKKwkgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCSAgICB7CisJCWlmICghYnVmLT5iX3BfYmwpCS8qIHNraXAgdW5saXN0ZWQgYnVmZmVycyAqLworCQkgICAgY29udGludWU7CisJCXAgPSBidWZsaXN0X21hdGNoKHByb2csIGJ1Zik7CisJCWlmIChwICE9IE5VTEwpCisJCXsKKwkJICAgIGlmIChyb3VuZCA9PSAxKQorCQkJKytjb3VudDsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChvcHRpb25zICYgV0lMRF9IT01FX1JFUExBQ0UpCisJCQkgICAgcCA9IGhvbWVfcmVwbGFjZV9zYXZlKGJ1ZiwgcCk7CisJCQllbHNlCisJCQkgICAgcCA9IHZpbV9zdHJzYXZlKHApOworCQkJKCpmaWxlKVtjb3VudCsrXSA9IHA7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAoY291bnQgPT0gMCkJLyogbm8gbWF0Y2ggZm91bmQsIGJyZWFrIGhlcmUgKi8KKwkJYnJlYWs7CisJICAgIGlmIChyb3VuZCA9PSAxKQorCSAgICB7CisJCSpmaWxlID0gKGNoYXJfdSAqKilhbGxvYygodW5zaWduZWQpKGNvdW50ICogc2l6ZW9mKGNoYXJfdSAqKSkpOworCQlpZiAoKmZpbGUgPT0gTlVMTCkKKwkJeworCQkgICAgdmltX2ZyZWUocHJvZyk7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCSAgICB9CisJfQorCXZpbV9mcmVlKHByb2cpOworCWlmIChjb3VudCkJCS8qIG1hdGNoKGVzKSBmb3VuZCwgYnJlYWsgaGVyZSAqLworCSAgICBicmVhazsKKyAgICB9CisKKyAgICAqbnVtX2ZpbGUgPSBjb3VudDsKKyAgICByZXR1cm4gKGNvdW50ID09IDAgPyBGQUlMIDogT0spOworfQorCisjZW5kaWYgLyogRkVBVF9DTURMX0NPTVBMICovCisKKyNpZmRlZiBIQVZFX0JVRkxJU1RfTUFUQ0gKKy8qCisgKiBDaGVjayBmb3IgYSBtYXRjaCBvbiB0aGUgZmlsZSBuYW1lIGZvciBidWZmZXIgImJ1ZiIgd2l0aCByZWdwcm9nICJwcm9nIi4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorYnVmbGlzdF9tYXRjaChwcm9nLCBidWYpCisgICAgcmVncHJvZ19UCSpwcm9nOworICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgY2hhcl91CSptYXRjaDsKKworICAgIC8qIEZpcnN0IHRyeSB0aGUgc2hvcnQgZmlsZSBuYW1lLCB0aGVuIHRoZSBsb25nIGZpbGUgbmFtZS4gKi8KKyAgICBtYXRjaCA9IGZuYW1lX21hdGNoKHByb2csIGJ1Zi0+Yl9zZm5hbWUpOworICAgIGlmIChtYXRjaCA9PSBOVUxMKQorCW1hdGNoID0gZm5hbWVfbWF0Y2gocHJvZywgYnVmLT5iX2ZmbmFtZSk7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKKy8qCisgKiBUcnkgbWF0Y2hpbmcgdGhlIHJlZ2V4cCBpbiAicHJvZyIgd2l0aCBmaWxlIG5hbWUgIm5hbWUiLgorICogUmV0dXJuICJuYW1lIiB3aGVuIHRoZXJlIGlzIGEgbWF0Y2gsIE5VTEwgd2hlbiBub3QuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2ZuYW1lX21hdGNoKHByb2csIG5hbWUpCisgICAgcmVncHJvZ19UCSpwcm9nOworICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBjaGFyX3UJKm1hdGNoID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworCXJlZ21hdGNoLnJlZ3Byb2cgPSBwcm9nOworI2lmZGVmIENBU0VfSU5TRU5TSVRJVkVfRklMRU5BTUUKKwlyZWdtYXRjaC5ybV9pYyA9IFRSVUU7CQkvKiBBbHdheXMgaWdub3JlIGNhc2UgKi8KKyNlbHNlCisJcmVnbWF0Y2gucm1faWMgPSBGQUxTRTsJCS8qIE5ldmVyIGlnbm9yZSBjYXNlICovCisjZW5kaWYKKworCWlmICh2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIG5hbWUsIChjb2xucl9UKTApKQorCSAgICBtYXRjaCA9IG5hbWU7CisJZWxzZQorCXsKKwkgICAgLyogUmVwbGFjZSAkKEhPTUUpIHdpdGggJ34nIGFuZCB0cnkgbWF0Y2hpbmcgYWdhaW4uICovCisJICAgIHAgPSBob21lX3JlcGxhY2Vfc2F2ZShOVUxMLCBuYW1lKTsKKwkgICAgaWYgKHAgIT0gTlVMTCAmJiB2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIHAsIChjb2xucl9UKTApKQorCQltYXRjaCA9IG5hbWU7CisJICAgIHZpbV9mcmVlKHApOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisjZW5kaWYKKworLyoKKyAqIGZpbmQgZmlsZSBpbiBidWZmZXIgbGlzdCBieSBudW1iZXIKKyAqLworICAgIGJ1Zl9UICoKK2J1Zmxpc3RfZmluZG5yKG5yKQorICAgIGludAkJbnI7Cit7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgIGlmIChuciA9PSAwKQorCW5yID0gY3Vyd2luLT53X2FsdF9mbnVtOworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoYnVmLT5iX2ZudW0gPT0gbnIpCisJICAgIHJldHVybiAoYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdldCBuYW1lIG9mIGZpbGUgJ24nIGluIHRoZSBidWZmZXIgbGlzdC4KKyAqIFdoZW4gdGhlIGZpbGUgaGFzIG5vIG5hbWUgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICogaG9tZV9yZXBsYWNlKCkgaXMgdXNlZCB0byBzaG9ydGVuIHRoZSBmaWxlIG5hbWUgKHVzZWQgZm9yIG1hcmtzKS4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnksIG9mIE5VTEwgd2hlbiBmYWlsZWQuCisgKi8KKyAgICBjaGFyX3UgKgorYnVmbGlzdF9ucjJuYW1lKG4sIGZ1bGxuYW1lLCBoZWxwdGFpbCkKKyAgICBpbnQJCW47CisgICAgaW50CQlmdWxsbmFtZTsKKyAgICBpbnQJCWhlbHB0YWlsOwkvKiBmb3IgaGVscCBidWZmZXJzIHJldHVybiB0YWlsIG9ubHkgKi8KK3sKKyAgICBidWZfVAkqYnVmOworCisgICAgYnVmID0gYnVmbGlzdF9maW5kbnIobik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBob21lX3JlcGxhY2Vfc2F2ZShoZWxwdGFpbCA/IGJ1ZiA6IE5VTEwsCisJCQkJICAgICBmdWxsbmFtZSA/IGJ1Zi0+Yl9mZm5hbWUgOiBidWYtPmJfZm5hbWUpOworfQorCisvKgorICogU2V0IHRoZSAibG51bSIgYW5kICJjb2wiIGZvciB0aGUgYnVmZmVyICJidWYiIGFuZCB0aGUgY3VycmVudCB3aW5kb3cuCisgKiBXaGVuICJjb3B5X29wdGlvbnMiIGlzIFRSVUUgc2F2ZSB0aGUgbG9jYWwgd2luZG93IG9wdGlvbiB2YWx1ZXMuCisgKiBXaGVuICJsbnVtIiBpcyAwIG9ubHkgZG8gdGhlIG9wdGlvbnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYnVmbGlzdF9zZXRmcG9zKGJ1Ziwgd2luLCBsbnVtLCBjb2wsIGNvcHlfb3B0aW9ucykKKyAgICBidWZfVAkqYnVmOworICAgIHdpbl9UCSp3aW47CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBpbnQJCWNvcHlfb3B0aW9uczsKK3sKKyAgICB3aW5pbmZvX1QJKndpcDsKKworICAgIGZvciAod2lwID0gYnVmLT5iX3dpbmluZm87IHdpcCAhPSBOVUxMOyB3aXAgPSB3aXAtPndpX25leHQpCisJaWYgKHdpcC0+d2lfd2luID09IHdpbikKKwkgICAgYnJlYWs7CisgICAgaWYgKHdpcCA9PSBOVUxMKQorICAgIHsKKwkvKiBhbGxvY2F0ZSBhIG5ldyBlbnRyeSAqLworCXdpcCA9ICh3aW5pbmZvX1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKHdpbmluZm9fVCkpOworCWlmICh3aXAgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCXdpcC0+d2lfd2luID0gd2luOworCWlmIChsbnVtID09IDApCQkvKiBzZXQgbG51bSBldmVuIHdoZW4gaXQncyAwICovCisJICAgIGxudW0gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdCAqLworCWlmICh3aXAtPndpX3ByZXYpCisJICAgIHdpcC0+d2lfcHJldi0+d2lfbmV4dCA9IHdpcC0+d2lfbmV4dDsKKwllbHNlCisJICAgIGJ1Zi0+Yl93aW5pbmZvID0gd2lwLT53aV9uZXh0OworCWlmICh3aXAtPndpX25leHQpCisJICAgIHdpcC0+d2lfbmV4dC0+d2lfcHJldiA9IHdpcC0+d2lfcHJldjsKKwlpZiAoY29weV9vcHRpb25zICYmIHdpcC0+d2lfb3B0c2V0KQorCXsKKwkgICAgY2xlYXJfd2lub3B0KCZ3aXAtPndpX29wdCk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIGRlbGV0ZUZvbGRSZWN1cnNlKCZ3aXAtPndpX2ZvbGRzKTsKKyNlbmRpZgorCX0KKyAgICB9CisgICAgaWYgKGxudW0gIT0gMCkKKyAgICB7CisJd2lwLT53aV9mcG9zLmxudW0gPSBsbnVtOworCXdpcC0+d2lfZnBvcy5jb2wgPSBjb2w7CisgICAgfQorICAgIGlmIChjb3B5X29wdGlvbnMpCisgICAgeworCS8qIFNhdmUgdGhlIHdpbmRvdy1zcGVjaWZpYyBvcHRpb24gdmFsdWVzLiAqLworCWNvcHlfd2lub3B0KCZ3aW4tPndfb25lYnVmX29wdCwgJndpcC0+d2lfb3B0KTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwl3aXAtPndpX2ZvbGRfbWFudWFsID0gd2luLT53X2ZvbGRfbWFudWFsOworCWNsb25lRm9sZEdyb3dBcnJheSgmd2luLT53X2ZvbGRzLCAmd2lwLT53aV9mb2xkcyk7CisjZW5kaWYKKwl3aXAtPndpX29wdHNldCA9IFRSVUU7CisgICAgfQorCisgICAgLyogaW5zZXJ0IHRoZSBlbnRyeSBpbiBmcm9udCBvZiB0aGUgbGlzdCAqLworICAgIHdpcC0+d2lfbmV4dCA9IGJ1Zi0+Yl93aW5pbmZvOworICAgIGJ1Zi0+Yl93aW5pbmZvID0gd2lwOworICAgIHdpcC0+d2lfcHJldiA9IE5VTEw7CisgICAgaWYgKHdpcC0+d2lfbmV4dCkKKwl3aXAtPndpX25leHQtPndpX3ByZXYgPSB3aXA7CisKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBGaW5kIGluZm8gZm9yIHRoZSBjdXJyZW50IHdpbmRvdyBpbiBidWZmZXIgImJ1ZiIuCisgKiBJZiBub3QgZm91bmQsIHJldHVybiB0aGUgaW5mbyBmb3IgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCB3aW5kb3cuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGVyZSBpc24ndCBhbnkgaW5mby4KKyAqLworICAgIHN0YXRpYyB3aW5pbmZvX1QgKgorZmluZF93aW5pbmZvKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHdpbmluZm9fVAkqd2lwOworCisgICAgZm9yICh3aXAgPSBidWYtPmJfd2luaW5mbzsgd2lwICE9IE5VTEw7IHdpcCA9IHdpcC0+d2lfbmV4dCkKKwlpZiAod2lwLT53aV93aW4gPT0gY3Vyd2luKQorCSAgICBicmVhazsKKyAgICBpZiAod2lwID09IE5VTEwpCS8qIGlmIG5vIGZwb3MgZm9yIGN1cndpbiwgdXNlIHRoZSBmaXJzdCBpbiB0aGUgbGlzdCAqLworCXdpcCA9IGJ1Zi0+Yl93aW5pbmZvOworICAgIHJldHVybiB3aXA7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgbG9jYWwgd2luZG93IG9wdGlvbnMgdG8gdGhlIHZhbHVlcyBsYXN0IHVzZWQgaW4gdGhpcyB3aW5kb3cuCisgKiBJZiB0aGUgYnVmZmVyIHdhc24ndCB1c2VkIGluIHRoaXMgd2luZG93IGJlZm9yZSwgdXNlIHRoZSB2YWx1ZXMgZnJvbQorICogdGhlIG1vc3QgcmVjZW50bHkgdXNlZCB3aW5kb3cuICBJZiB0aGUgdmFsdWVzIHdlcmUgbmV2ZXIgc2V0LCB1c2UgdGhlCisgKiBnbG9iYWwgdmFsdWVzIGZvciB0aGUgd2luZG93LgorICovCisgICAgdm9pZAorZ2V0X3dpbm9wdHMoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgd2luaW5mb19UCSp3aXA7CisKKyAgICBjbGVhcl93aW5vcHQoJmN1cndpbi0+d19vbmVidWZfb3B0KTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBjbGVhckZvbGRpbmcoY3Vyd2luKTsKKyNlbmRpZgorCisgICAgd2lwID0gZmluZF93aW5pbmZvKGJ1Zik7CisgICAgaWYgKHdpcCAhPSBOVUxMICYmIHdpcC0+d2lfb3B0c2V0KQorICAgIHsKKwljb3B5X3dpbm9wdCgmd2lwLT53aV9vcHQsICZjdXJ3aW4tPndfb25lYnVmX29wdCk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJY3Vyd2luLT53X2ZvbGRfbWFudWFsID0gd2lwLT53aV9mb2xkX21hbnVhbDsKKwljdXJ3aW4tPndfZm9sZGludmFsaWQgPSBUUlVFOworCWNsb25lRm9sZEdyb3dBcnJheSgmd2lwLT53aV9mb2xkcywgJmN1cndpbi0+d19mb2xkcyk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorCWNvcHlfd2lub3B0KCZjdXJ3aW4tPndfYWxsYnVmX29wdCwgJmN1cndpbi0+d19vbmVidWZfb3B0KTsKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIC8qIFNldCAnZm9sZGxldmVsJyB0byAnZm9sZGxldmVsc3RhcnQnIGlmIGl0J3Mgbm90IG5lZ2F0aXZlLiAqLworICAgIGlmIChwX2ZkbHMgPj0gMCkKKwljdXJ3aW4tPndfcF9mZGwgPSBwX2ZkbHM7CisjZW5kaWYKK30KKworLyoKKyAqIEZpbmQgdGhlIHBvc2l0aW9uIChsbnVtIGFuZCBjb2wpIGZvciB0aGUgYnVmZmVyICdidWYnIGZvciB0aGUgY3VycmVudAorICogd2luZG93LgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gbm9fcG9zaXRpb24gaWYgbm8gcG9zaXRpb24gaXMgZm91bmQuCisgKi8KKyAgICBwb3NfVCAqCitidWZsaXN0X2ZpbmRmcG9zKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHdpbmluZm9fVAkqd2lwOworICAgIHN0YXRpYyBwb3NfVCBub19wb3NpdGlvbiA9IHsxLCAwfTsKKworICAgIHdpcCA9IGZpbmRfd2luaW5mbyhidWYpOworICAgIGlmICh3aXAgIT0gTlVMTCkKKwlyZXR1cm4gJih3aXAtPndpX2Zwb3MpOworICAgIGVsc2UKKwlyZXR1cm4gJm5vX3Bvc2l0aW9uOworfQorCisvKgorICogRmluZCB0aGUgbG51bSBmb3IgdGhlIGJ1ZmZlciAnYnVmJyBmb3IgdGhlIGN1cnJlbnQgd2luZG93LgorICovCisgICAgbGluZW5yX1QKK2J1Zmxpc3RfZmluZGxudW0oYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgcmV0dXJuIGJ1Zmxpc3RfZmluZGZwb3MoYnVmKS0+bG51bTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9MSVNUQ01EUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBMaXN0IGFsbCBrbm93IGZpbGUgbmFtZXMgKGZvciA6ZmlsZXMgYW5kIDpidWZmZXJzIGNvbW1hbmQpLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitidWZsaXN0X2xpc3QoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJbGVuOworICAgIGludAkJaTsKKworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMICYmICFnb3RfaW50OyBidWYgPSBidWYtPmJfbmV4dCkKKyAgICB7CisJLyogc2tpcCB1bmxpc3RlZCBidWZmZXJzLCB1bmxlc3MgISB3YXMgdXNlZCAqLworCWlmICghYnVmLT5iX3BfYmwgJiYgIWVhcC0+Zm9yY2VpdCkKKwkgICAgY29udGludWU7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJaWYgKGJ1Zl9zcG5hbWUoYnVmKSAhPSBOVUxMKQorCSAgICBTVFJDUFkoTmFtZUJ1ZmYsIGJ1Zl9zcG5hbWUoYnVmKSk7CisJZWxzZQorCSAgICBob21lX3JlcGxhY2UoYnVmLCBidWYtPmJfZm5hbWUsIE5hbWVCdWZmLCBNQVhQQVRITCwgVFJVRSk7CisKKwlzcHJpbnRmKChjaGFyICopSU9idWZmLCAiJTNkJWMlYyVjJWMlYyBcIiIsCisJCWJ1Zi0+Yl9mbnVtLAorCQlidWYtPmJfcF9ibCA/ICcgJyA6ICd1JywKKwkJYnVmID09IGN1cmJ1ZiA/ICclJyA6CisJCQkoY3Vyd2luLT53X2FsdF9mbnVtID09IGJ1Zi0+Yl9mbnVtID8gJyMnIDogJyAnKSwKKwkJYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMID8gJyAnIDoKKwkJCShidWYtPmJfbndpbmRvd3MgPT0gMCA/ICdoJyA6ICdhJyksCisJCSFidWYtPmJfcF9tYSA/ICctJyA6IChidWYtPmJfcF9ybyA/ICc9JyA6ICcgJyksCisJCShidWYtPmJfZmxhZ3MgJiBCRl9SRUFERVJSKSA/ICd4JworCQkJCQkgICAgOiAoYnVmSXNDaGFuZ2VkKGJ1ZikgPyAnKycgOiAnICcpCisJCSk7CisKKwlsZW4gPSAoaW50KVNUUkxFTihJT2J1ZmYpOworCVNUUk5DUFkoSU9idWZmICsgbGVuLCBOYW1lQnVmZiwgSU9TSVpFIC0gMjAgLSBsZW4pOworCUlPYnVmZltJT1NJWkUgLSAyMCAtIGxlbl0gPSBOVUw7ICAgIC8qIG1ha2Ugc3VyZSBpdCdzIHRlcm1pbmF0ZWQgKi8KKworCWxlbiA9IChpbnQpU1RSTEVOKElPYnVmZik7CisJSU9idWZmW2xlbisrXSA9ICciJzsKKworCS8qIHB1dCAibGluZSA5OTkiIGluIGNvbHVtbiA0MCBvciBhZnRlciB0aGUgZmlsZSBuYW1lICovCisJSU9idWZmW2xlbl0gPSBOVUw7CisJaSA9IDQwIC0gdmltX3N0cnNpemUoSU9idWZmKTsKKwlkbworCXsKKwkgICAgSU9idWZmW2xlbisrXSA9ICcgJzsKKwl9IHdoaWxlICgtLWkgPiAwICYmIGxlbiA8IElPU0laRSAtIDE4KTsKKwlzcHJpbnRmKChjaGFyICopSU9idWZmICsgbGVuLCBfKCJsaW5lICVsZCIpLAorCQlidWYgPT0gY3VyYnVmID8gY3Vyd2luLT53X2N1cnNvci5sbnVtIDoKKwkJCQkobG9uZylidWZsaXN0X2ZpbmRsbnVtKGJ1ZikpOworCW1zZ19vdXR0cmFucyhJT2J1ZmYpOworCW91dF9mbHVzaCgpOwkgICAgLyogb3V0cHV0IG9uZSBsaW5lIGF0IGEgdGltZSAqLworCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBmaWxlICdmbnVtJy4KKyAqIFVzZWQgYnkgRG9PbmVDbWQoKSBmb3IgdHJhbnNsYXRpbmcgJyUnIGFuZCAnIycuCisgKiBVc2VkIGJ5IGluc2VydF9yZWcoKSBhbmQgY21kbGluZV9wYXN0ZSgpIGZvciAnIycgcmVnaXN0ZXIuCisgKiBSZXR1cm4gRkFJTCBpZiBub3QgZm91bmQsIE9LIGZvciBzdWNjZXNzLgorICovCisgICAgaW50CitidWZsaXN0X25hbWVfbnIoZm51bSwgZm5hbWUsIGxudW0pCisgICAgaW50CQlmbnVtOworICAgIGNoYXJfdQkqKmZuYW1lOworICAgIGxpbmVucl9UCSpsbnVtOworeworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBidWYgPSBidWZsaXN0X2ZpbmRucihmbnVtKTsKKyAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5iX2ZuYW1lID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAqZm5hbWUgPSBidWYtPmJfZm5hbWU7CisgICAgKmxudW0gPSBidWZsaXN0X2ZpbmRsbnVtKGJ1Zik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTZXQgdGhlIGZpbGUgbmFtZSBmb3IgImJ1ZiInIHRvICdmZm5hbWUnLCBzaG9ydCBmaWxlIG5hbWUgdG8gJ3NmbmFtZScuCisgKiBUaGUgZmlsZSBuYW1lIHdpdGggdGhlIGZ1bGwgcGF0aCBpcyBhbHNvIHJlbWVtYmVyZWQsIGZvciB3aGVuIDpjZCBpcyB1c2VkLgorICogUmV0dXJucyBGQUlMIGZvciBmYWlsdXJlIChmaWxlIG5hbWUgYWxyZWFkeSBpbiB1c2UgYnkgb3RoZXIgYnVmZmVyKQorICoJT0sgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitzZXRmbmFtZShidWYsIGZmbmFtZSwgc2ZuYW1lLCBtZXNzYWdlKQorICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSpmZm5hbWUsICpzZm5hbWU7CisgICAgaW50CQltZXNzYWdlOworeworICAgIGJ1Zl9UCSpvYnVmOworI2lmZGVmIFVOSVgKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyNlbmRpZgorCisgICAgaWYgKGZmbmFtZSA9PSBOVUxMIHx8ICpmZm5hbWUgPT0gTlVMKQorICAgIHsKKwkvKiBSZW1vdmluZyB0aGUgbmFtZS4gKi8KKwl2aW1fZnJlZShidWYtPmJfZmZuYW1lKTsKKwl2aW1fZnJlZShidWYtPmJfc2ZuYW1lKTsKKwlidWYtPmJfZmZuYW1lID0gTlVMTDsKKwlidWYtPmJfc2ZuYW1lID0gTlVMTDsKKyNpZmRlZiBVTklYCisJc3Quc3RfZGV2ID0gKGRldl9UKS0xOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZm5hbWVfZXhwYW5kKGJ1ZiwgJmZmbmFtZSwgJnNmbmFtZSk7IC8qIHdpbGwgYWxsb2NhdGUgZmZuYW1lICovCisJaWYgKGZmbmFtZSA9PSBOVUxMKQkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisKKwkvKgorCSAqIGlmIHRoZSBmaWxlIG5hbWUgaXMgYWxyZWFkeSB1c2VkIGluIGFub3RoZXIgYnVmZmVyOgorCSAqIC0gaWYgdGhlIGJ1ZmZlciBpcyBsb2FkZWQsIGZhaWwKKwkgKiAtIGlmIHRoZSBidWZmZXIgaXMgbm90IGxvYWRlZCwgZGVsZXRlIGl0IGZyb20gdGhlIGxpc3QKKwkgKi8KKyNpZmRlZiBVTklYCisJaWYgKG1jaF9zdGF0KChjaGFyICopZmZuYW1lLCAmc3QpIDwgMCkKKwkgICAgc3Quc3RfZGV2ID0gKGRldl9UKS0xOworCW9idWYgPSBidWZsaXN0X2ZpbmRuYW1lX3N0YXQoZmZuYW1lLCAmc3QpOworI2Vsc2UKKwlvYnVmID0gYnVmbGlzdF9maW5kbmFtZShmZm5hbWUpOworI2VuZGlmCisJaWYgKG9idWYgIT0gTlVMTCAmJiBvYnVmICE9IGJ1ZikKKwl7CisJICAgIGlmIChvYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQkvKiBpdCdzIGxvYWRlZCwgZmFpbCAqLworCSAgICB7CisJCWlmIChtZXNzYWdlKQorCQkgICAgRU1TRyhfKCJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIpKTsKKwkJdmltX2ZyZWUoZmZuYW1lKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgY2xvc2VfYnVmZmVyKE5VTEwsIG9idWYsIERPQlVGX1dJUEUpOyAvKiBkZWxldGUgZnJvbSB0aGUgbGlzdCAqLworCX0KKwlzZm5hbWUgPSB2aW1fc3Ryc2F2ZShzZm5hbWUpOworCWlmIChmZm5hbWUgPT0gTlVMTCB8fCBzZm5hbWUgPT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKHNmbmFtZSk7CisJICAgIHZpbV9mcmVlKGZmbmFtZSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKyNpZmRlZiBVU0VfRk5BTUVfQ0FTRQorIyBpZmRlZiBVU0VfTE9OR19GTkFNRQorCWlmIChVU0VfTE9OR19GTkFNRSkKKyMgZW5kaWYKKwkgICAgZm5hbWVfY2FzZShzZm5hbWUsIDApOyAgICAvKiBzZXQgY29ycmVjdCBjYXNlIGZvciBzaG9ydCBmaWxlIG5hbWUgKi8KKyNlbmRpZgorCXZpbV9mcmVlKGJ1Zi0+Yl9mZm5hbWUpOworCXZpbV9mcmVlKGJ1Zi0+Yl9zZm5hbWUpOworCWJ1Zi0+Yl9mZm5hbWUgPSBmZm5hbWU7CisJYnVmLT5iX3NmbmFtZSA9IHNmbmFtZTsKKyAgICB9CisgICAgYnVmLT5iX2ZuYW1lID0gYnVmLT5iX3NmbmFtZTsKKyNpZmRlZiBVTklYCisgICAgaWYgKHN0LnN0X2RldiA9PSAoZGV2X1QpLTEpCisJYnVmLT5iX2RldiA9IC0xOworICAgIGVsc2UKKyAgICB7CisJYnVmLT5iX2RldiA9IHN0LnN0X2RldjsKKwlidWYtPmJfaW5vID0gc3Quc3RfaW5vOworICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOworI2VuZGlmCisKKyAgICBidWZfbmFtZV9jaGFuZ2VkKGJ1Zik7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogVGFrZSBjYXJlIG9mIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIHRoZSBuYW1lIG9mIGJ1ZmZlciAiYnVmIiBoYXMKKyAqIGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitidWZfbmFtZV9jaGFuZ2VkKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIC8qCisgICAgICogSWYgdGhlIGZpbGUgbmFtZSBjaGFuZ2VkLCBhbHNvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc3dhcGZpbGUKKyAgICAgKi8KKyAgICBpZiAoYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCW1sX3NldG5hbWUoYnVmKTsKKworICAgIGlmIChjdXJ3aW4tPndfYnVmZmVyID09IGJ1ZikKKwljaGVja19hcmdfaWR4KGN1cndpbik7CS8qIGNoZWNrIGZpbGUgbmFtZSBmb3IgYXJnIGxpc3QgKi8KKyNpZmRlZiBGRUFUX1RJVExFCisgICAgbWFrZXRpdGxlKCk7CQkvKiBzZXQgd2luZG93IHRpdGxlICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBzdGF0dXNfcmVkcmF3X2FsbCgpOwkvKiBzdGF0dXMgbGluZXMgbmVlZCB0byBiZSByZWRyYXduICovCisjZW5kaWYKKyAgICBmbWFya3NfY2hlY2tfbmFtZXMoYnVmKTsJLyogY2hlY2sgbmFtZWQgZmlsZSBtYXJrcyAqLworICAgIG1sX3RpbWVzdGFtcChidWYpOwkJLyogcmVzZXQgdGltZXN0YW1wICovCit9CisKKy8qCisgKiBzZXQgYWx0ZXJuYXRlIGZpbGUgbmFtZSBmb3IgY3VycmVudCB3aW5kb3cKKyAqCisgKiBVc2VkIGJ5IGRvX29uZV9jbWQoKSwgZG9fd3JpdGUoKSBhbmQgZG9fZWNtZCgpLgorICogUmV0dXJuIHRoZSBidWZmZXIuCisgKi8KKyAgICBidWZfVCAqCitzZXRhbHRmbmFtZShmZm5hbWUsIHNmbmFtZSwgbG51bSkKKyAgICBjaGFyX3UJKmZmbmFtZTsKKyAgICBjaGFyX3UJKnNmbmFtZTsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGJ1Zl9UCSpidWY7CisKKyAgICAvKiBDcmVhdGUgYSBidWZmZXIuICAnYnVmbGlzdGVkJyBpcyBub3Qgc2V0IGlmIGl0J3MgYSBuZXcgYnVmZmVyICovCisgICAgYnVmID0gYnVmbGlzdF9uZXcoZmZuYW1lLCBzZm5hbWUsIGxudW0sIDApOworICAgIGlmIChidWYgIT0gTlVMTCkKKwljdXJ3aW4tPndfYWx0X2ZudW0gPSBidWYtPmJfZm51bTsKKyAgICByZXR1cm4gYnVmOworfQorCisvKgorICogR2V0IGFsdGVybmF0ZSBmaWxlIG5hbWUgZm9yIGN1cnJlbnQgd2luZG93LgorICogUmV0dXJuIE5VTEwgaWYgdGhlcmUgaXNuJ3QgYW55LCBhbmQgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmIHJlcXVlc3RlZC4KKyAqLworICAgIGNoYXJfdSAgKgorZ2V0YWx0Zm5hbWUoZXJybXNnKQorICAgIGludAkJZXJybXNnOwkJLyogZ2l2ZSBlcnJvciBtZXNzYWdlICovCit7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBsaW5lbnJfVAlkdW1teTsKKworICAgIGlmIChidWZsaXN0X25hbWVfbnIoMCwgJmZuYW1lLCAmZHVtbXkpID09IEZBSUwpCisgICAgeworCWlmIChlcnJtc2cpCisJICAgIEVNU0coXyhlX25vYWx0KSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmbmFtZTsKK30KKworLyoKKyAqIEFkZCBhIGZpbGUgbmFtZSB0byB0aGUgYnVmbGlzdCBhbmQgcmV0dXJuIGl0cyBudW1iZXIuCisgKiBVc2VzIHNhbWUgZmxhZ3MgYXMgYnVmbGlzdF9uZXcoKSwgZXhjZXB0IEJMTl9EVU1NWS4KKyAqCisgKiB1c2VkIGJ5IHFmX2luaXQoKSwgbWFpbigpIGFuZCBkb2FyZ2xpc3QoKQorICovCisgICAgaW50CitidWZsaXN0X2FkZChmbmFtZSwgZmxhZ3MpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCWZsYWdzOworeworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBidWYgPSBidWZsaXN0X25ldyhmbmFtZSwgTlVMTCwgKGxpbmVucl9UKTAsIGZsYWdzKTsKKyAgICBpZiAoYnVmICE9IE5VTEwpCisJcmV0dXJuIGJ1Zi0+Yl9mbnVtOworICAgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChCQUNLU0xBU0hfSU5fRklMRU5BTUUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQWRqdXN0IHNsYXNoZXMgaW4gZmlsZSBuYW1lcy4gIENhbGxlZCBhZnRlciAnc2hlbGxzbGFzaCcgd2FzIHNldC4KKyAqLworICAgIHZvaWQKK2J1Zmxpc3Rfc2xhc2hfYWRqdXN0KCkKK3sKKyAgICBidWZfVAkqYnA7CisKKyAgICBmb3IgKGJwID0gZmlyc3RidWY7IGJwICE9IE5VTEw7IGJwID0gYnAtPmJfbmV4dCkKKyAgICB7CisJaWYgKGJwLT5iX2ZmbmFtZSAhPSBOVUxMKQorCSAgICBzbGFzaF9hZGp1c3QoYnAtPmJfZmZuYW1lKTsKKwlpZiAoYnAtPmJfc2ZuYW1lICE9IE5VTEwpCisJICAgIHNsYXNoX2FkanVzdChicC0+Yl9zZm5hbWUpOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogU2V0IGFsdGVybmF0ZSBjdXJzb3IgcG9zaXRpb24gZm9yIGN1cnJlbnQgd2luZG93LgorICogQWxzbyBzYXZlIHRoZSBsb2NhbCB3aW5kb3cgb3B0aW9uIHZhbHVlcy4KKyAqLworICAgIHZvaWQKK2J1Zmxpc3RfYWx0ZnBvcygpCit7CisgICAgYnVmbGlzdF9zZXRmcG9zKGN1cmJ1ZiwgY3Vyd2luLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJCQkgIGN1cndpbi0+d19jdXJzb3IuY29sLCBUUlVFKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICdmZm5hbWUnIGlzIG5vdCB0aGUgc2FtZSBmaWxlIGFzIGN1cnJlbnQgZmlsZS4KKyAqIEZuYW1lIG11c3QgaGF2ZSBhIGZ1bGwgcGF0aCAoZXhwYW5kZWQgYnkgbWNoX0Z1bGxOYW1lKCkpLgorICovCisgICAgaW50CitvdGhlcmZpbGUoZmZuYW1lKQorICAgIGNoYXJfdQkqZmZuYW1lOworeworICAgIHJldHVybiBvdGhlcmZpbGVfYnVmKGN1cmJ1ZiwgZmZuYW1lCisjaWZkZWYgVU5JWAorCSAgICAsIE5VTEwKKyNlbmRpZgorCSAgICApOworfQorCisgICAgc3RhdGljIGludAorb3RoZXJmaWxlX2J1ZihidWYsIGZmbmFtZQorI2lmZGVmIFVOSVgKKwksIHN0cAorI2VuZGlmCisJKQorICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSpmZm5hbWU7CisjaWZkZWYgVU5JWAorICAgIHN0cnVjdCBzdGF0CSpzdHA7CisjZW5kaWYKK3sKKyAgICAvKiBubyBuYW1lIGlzIGRpZmZlcmVudCAqLworICAgIGlmIChmZm5hbWUgPT0gTlVMTCB8fCAqZmZuYW1lID09IE5VTCB8fCBidWYtPmJfZmZuYW1lID09IE5VTEwpCisJcmV0dXJuIFRSVUU7CisgICAgaWYgKGZuYW1lY21wKGZmbmFtZSwgYnVmLT5iX2ZmbmFtZSkgPT0gMCkKKwlyZXR1cm4gRkFMU0U7CisjaWZkZWYgVU5JWAorICAgIHsKKwlzdHJ1Y3Qgc3RhdAlzdDsKKworCS8qIElmIG5vIHN0cnVjdCBzdGF0IGdpdmVuLCBnZXQgaXQgbm93ICovCisJaWYgKHN0cCA9PSBOVUxMKQorCXsKKwkgICAgaWYgKGJ1Zi0+Yl9kZXYgPCAwIHx8IG1jaF9zdGF0KChjaGFyICopZmZuYW1lLCAmc3QpIDwgMCkKKwkJc3Quc3RfZGV2ID0gKGRldl9UKS0xOworCSAgICBzdHAgPSAmc3Q7CisJfQorCS8qIFVzZSBkZXYvaW5vIHRvIGNoZWNrIGlmIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUsIGV2ZW4gd2hlbiB0aGUgbmFtZXMKKwkgKiBhcmUgZGlmZmVyZW50IChwb3NzaWJsZSB3aXRoIGxpbmtzKS4gIFN0aWxsIG5lZWQgdG8gY29tcGFyZSB0aGUKKwkgKiBuYW1lIGFib3ZlLCBmb3Igd2hlbiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IHlldC4KKwkgKiBQcm9ibGVtOiBUaGUgZGV2L2lubyBjaGFuZ2VzIHdoZW4gYSBmaWxlIGlzIGRlbGV0ZWQgKGFuZCBjcmVhdGVkCisJICogYWdhaW4pIGFuZCByZW1haW5zIHRoZSBzYW1lIHdoZW4gcmVuYW1lZC9tb3ZlZC4gIFdlIGRvbid0IHdhbnQgdG8KKwkgKiBtY2hfc3RhdCgpIGVhY2ggYnVmZmVyIGVhY2ggdGltZSwgdGhhdCB3b3VsZCBiZSB0b28gc2xvdy4gIEdldCB0aGUKKwkgKiBkZXYvaW5vIGFnYWluIHdoZW4gdGhleSBhcHBlYXIgdG8gbWF0Y2gsIGJ1dCBub3Qgd2hlbiB0aGV5IGFwcGVhcgorCSAqIHRvIGJlIGRpZmZlcmVudDogQ291bGQgc2tpcCBhIGJ1ZmZlciB3aGVuIGl0J3MgYWN0dWFsbHkgdGhlIHNhbWUKKwkgKiBmaWxlLiAqLworCWlmIChidWZfc2FtZV9pbm8oYnVmLCBzdHApKQorCXsKKwkgICAgYnVmX3NldGlubyhidWYpOworCSAgICBpZiAoYnVmX3NhbWVfaW5vKGJ1Ziwgc3RwKSkKKwkJcmV0dXJuIEZBTFNFOworCX0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTZXQgaW5vZGUgYW5kIGRldmljZSBudW1iZXIgZm9yIGEgYnVmZmVyLgorICogTXVzdCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gYl9mbmFtZSBpcyBjaGFuZ2VkIS4KKyAqLworICAgIHZvaWQKK2J1Zl9zZXRpbm8oYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgc3RydWN0IHN0YXQJc3Q7CisKKyAgICBpZiAoYnVmLT5iX2ZuYW1lICE9IE5VTEwgJiYgbWNoX3N0YXQoKGNoYXIgKilidWYtPmJfZm5hbWUsICZzdCkgPj0gMCkKKyAgICB7CisJYnVmLT5iX2RldiA9IHN0LnN0X2RldjsKKwlidWYtPmJfaW5vID0gc3Quc3RfaW5vOworICAgIH0KKyAgICBlbHNlCisJYnVmLT5iX2RldiA9IC0xOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgZGV2L2lubyBpbiBidWZmZXIgImJ1ZiIgbWF0Y2hlcyB3aXRoICJzdHAiLgorICovCisgICAgc3RhdGljIGludAorYnVmX3NhbWVfaW5vKGJ1Ziwgc3RwKQorICAgIGJ1Zl9UCSpidWY7CisgICAgc3RydWN0IHN0YXQgKnN0cDsKK3sKKyAgICByZXR1cm4gKGJ1Zi0+Yl9kZXYgPj0gMAorCSAgICAmJiBzdHAtPnN0X2RldiA9PSBidWYtPmJfZGV2CisJICAgICYmIHN0cC0+c3RfaW5vID09IGJ1Zi0+Yl9pbm8pOworfQorI2VuZGlmCisKKyAgICB2b2lkCitmaWxlaW5mbyhmdWxsbmFtZSwgc2hvcnRoZWxwLCBkb250X3RydW5jYXRlKQorICAgIGludCBmdWxsbmFtZTsKKyAgICBpbnQgc2hvcnRoZWxwOworICAgIGludAlkb250X3RydW5jYXRlOworeworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCW47CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqYnVmZmVyOworCisgICAgYnVmZmVyID0gYWxsb2MoSU9TSVpFKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGZ1bGxuYW1lID4gMSkJICAgIC8qIDIgQ1RSTC1HOiBpbmNsdWRlIGJ1ZmZlciBudW1iZXIgKi8KKyAgICB7CisJc3ByaW50ZigoY2hhciAqKWJ1ZmZlciwgImJ1ZiAlZDogIiwgY3VyYnVmLT5iX2ZudW0pOworCXAgPSBidWZmZXIgKyBTVFJMRU4oYnVmZmVyKTsKKyAgICB9CisgICAgZWxzZQorCXAgPSBidWZmZXI7CisKKyAgICAqcCsrID0gJyInOworICAgIGlmIChidWZfc3BuYW1lKGN1cmJ1ZikgIT0gTlVMTCkKKwlTVFJDUFkocCwgYnVmX3NwbmFtZShjdXJidWYpKTsKKyAgICBlbHNlCisgICAgeworCWlmICghZnVsbG5hbWUgJiYgY3VyYnVmLT5iX2ZuYW1lICE9IE5VTEwpCisJICAgIG5hbWUgPSBjdXJidWYtPmJfZm5hbWU7CisJZWxzZQorCSAgICBuYW1lID0gY3VyYnVmLT5iX2ZmbmFtZTsKKwlob21lX3JlcGxhY2Uoc2hvcnRoZWxwID8gY3VyYnVmIDogTlVMTCwgbmFtZSwgcCwKKwkJCQkJICAoaW50KShJT1NJWkUgLSAocCAtIGJ1ZmZlcikpLCBUUlVFKTsKKyAgICB9CisKKyAgICBzcHJpbnRmKChjaGFyICopYnVmZmVyICsgU1RSTEVOKGJ1ZmZlciksCisJICAgICJcIiVzJXMlcyVzJXMlcyIsCisJICAgIGN1cmJ1ZklzQ2hhbmdlZCgpID8gKHNob3J0bWVzcyhTSE1fTU9EKQorCQkJCQkgID8gICIgWytdIiA6IF8oIiBbTW9kaWZpZWRdIikpIDogIiAiLAorCSAgICAoY3VyYnVmLT5iX2ZsYWdzICYgQkZfTk9URURJVEVEKQorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJICAgICYmICFidF9kb250d3JpdGUoY3VyYnVmKQorI2VuZGlmCisJCQkJCT8gXygiW05vdCBlZGl0ZWRdIikgOiAiIiwKKwkgICAgKGN1cmJ1Zi0+Yl9mbGFncyAmIEJGX05FVykKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCSAgICAmJiAhYnRfZG9udHdyaXRlKGN1cmJ1ZikKKyNlbmRpZgorCQkJCQk/IF8oIltOZXcgZmlsZV0iKSA6ICIiLAorCSAgICAoY3VyYnVmLT5iX2ZsYWdzICYgQkZfUkVBREVSUikgPyBfKCJbUmVhZCBlcnJvcnNdIikgOiAiIiwKKwkgICAgY3VyYnVmLT5iX3Bfcm8gPyAoc2hvcnRtZXNzKFNITV9STykgPyAiW1JPXSIKKwkJCQkJCSAgICAgIDogXygiW3JlYWRvbmx5XSIpKSA6ICIiLAorCSAgICAoY3VyYnVmSXNDaGFuZ2VkKCkgfHwgKGN1cmJ1Zi0+Yl9mbGFncyAmIEJGX1dSSVRFX01BU0spCisJCQkJCQkJICB8fCBjdXJidWYtPmJfcF9ybykgPworCQkJCQkJCQkgICAgIiAiIDogIiIpOworICAgIC8qIFdpdGggMzIgYml0IGxvbmdzIGFuZCBtb3JlIHRoYW4gMjEsNDc0LDgzNiBsaW5lcyBtdWx0aXBseWluZyBieSAxMDAKKyAgICAgKiBjYXVzZXMgYW4gb3ZlcmZsb3csIHRodXMgZm9yIGxhcmdlIG51bWJlcnMgZGl2aWRlIGluc3RlYWQuICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEwMDAwMDBMKQorCW4gPSAoaW50KSgoKGxvbmcpY3Vyd2luLT53X2N1cnNvci5sbnVtKSAvCisJCQkJICAgKChsb25nKWN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC8gMTAwTCkpOworICAgIGVsc2UKKwluID0gKGludCkoKChsb25nKWN1cndpbi0+d19jdXJzb3IubG51bSAqIDEwMEwpIC8KKwkJCQkJICAgIChsb25nKWN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KTsKKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpCisgICAgeworCVNUUkNQWShidWZmZXIgKyBTVFJMRU4oYnVmZmVyKSwgXyhub19saW5lc19tc2cpKTsKKyAgICB9CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBlbHNlIGlmIChwX3J1KQorICAgIHsKKwkvKiBDdXJyZW50IGxpbmUgYW5kIGNvbHVtbiBhcmUgYWxyZWFkeSBvbiB0aGUgc2NyZWVuIC0tIHdlYmIgKi8KKwlpZiAoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPT0gMSkKKwkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZmZlciArIFNUUkxFTihidWZmZXIpLCBfKCIxIGxpbmUgLS0lZCUlLS0iKSwgbik7CisJZWxzZQorCSAgICBzcHJpbnRmKChjaGFyICopYnVmZmVyICsgU1RSTEVOKGJ1ZmZlciksIF8oIiVsZCBsaW5lcyAtLSVkJSUtLSIpLAorCQkJCQkgKGxvbmcpY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQsIG4pOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisJc3ByaW50ZigoY2hhciAqKWJ1ZmZlciArIFNUUkxFTihidWZmZXIpLAorCQlfKCJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIpLAorCQkobG9uZyljdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCShsb25nKWN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LAorCQluKTsKKwl2YWxpZGF0ZV92aXJ0Y29sKCk7CisJY29sX3ByaW50KGJ1ZmZlciArIFNUUkxFTihidWZmZXIpLAorCQkgICAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sICsgMSwgKGludCljdXJ3aW4tPndfdmlydGNvbCArIDEpOworICAgIH0KKworICAgICh2b2lkKWFwcGVuZF9hcmdfbnVtYmVyKGN1cndpbiwgYnVmZmVyLCAhc2hvcnRtZXNzKFNITV9GSUxFKSwgSU9TSVpFKTsKKworICAgIGlmIChkb250X3RydW5jYXRlKQorICAgIHsKKwkvKiBUZW1wb3JhcmlseSBzZXQgbXNnX3Njcm9sbCB0byBhdm9pZCB0aGUgbWVzc2FnZSBiZWluZyB0cnVuY2F0ZWQuCisJICogRmlyc3QgY2FsbCBtc2dfc3RhcnQoKSB0byBnZXQgdGhlIG1lc3NhZ2UgaW4gdGhlIHJpZ2h0IHBsYWNlLiAqLworCW1zZ19zdGFydCgpOworCW4gPSBtc2dfc2Nyb2xsOworCW1zZ19zY3JvbGwgPSBUUlVFOworCW1zZyhidWZmZXIpOworCW1zZ19zY3JvbGwgPSBuOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXAgPSBtc2dfdHJ1bmNfYXR0cihidWZmZXIsIEZBTFNFLCAwKTsKKwlpZiAocmVzdGFydF9lZGl0ICE9IDAgfHwgKG1zZ19zY3JvbGxlZCAmJiAhbmVlZF93YWl0X3JldHVybikpCisJeworCSAgICAvKiBOZWVkIHRvIHJlcGVhdCB0aGUgbWVzc2FnZSBhZnRlciByZWRyYXdpbmcgd2hlbjoKKwkgICAgICogLSBXaGVuIHJlc3RhcnRfZWRpdCBpcyBzZXQgKG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEgZGVsYXkKKwkgICAgICogICBiZWZvcmUgcmVkcmF3aW5nKS4KKwkgICAgICogLSBXaGVuIHRoZSBzY3JlZW4gd2FzIHNjcm9sbGVkIGJ1dCB0aGVyZSBpcyBubyB3YWl0LXJldHVybgorCSAgICAgKiAgIHByb21wdC4gKi8KKwkgICAgc2V0X2tlZXBfbXNnKHApOworCSAgICBrZWVwX21zZ19hdHRyID0gMDsKKwl9CisgICAgfQorCisgICAgdmltX2ZyZWUoYnVmZmVyKTsKK30KKworICAgIHZvaWQKK2NvbF9wcmludChidWYsIGNvbCwgdmNvbCkKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50CSAgICBjb2w7CisgICAgaW50CSAgICB2Y29sOworeworICAgIGlmIChjb2wgPT0gdmNvbCkKKwlzcHJpbnRmKChjaGFyICopYnVmLCAiJWQiLCBjb2wpOworICAgIGVsc2UKKwlzcHJpbnRmKChjaGFyICopYnVmLCAiJWQtJWQiLCBjb2wsIHZjb2wpOworfQorCisjaWYgZGVmaW5lZChGRUFUX1RJVExFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHB1dCBmaWxlIG5hbWUgaW4gdGl0bGUgYmFyIG9mIHdpbmRvdyBhbmQgaW4gaWNvbiB0aXRsZQorICovCisKK3N0YXRpYyBjaGFyX3UgKmxhc3R0aXRsZSA9IE5VTEw7CitzdGF0aWMgY2hhcl91ICpsYXN0aWNvbiA9IE5VTEw7CisKKyAgICB2b2lkCittYWtldGl0bGUoKQoreworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnRfc3RyID0gTlVMTDsKKyAgICBjaGFyX3UJKmlfbmFtZTsKKyAgICBjaGFyX3UJKmlfc3RyID0gTlVMTDsKKyAgICBpbnQJCW1heGxlbiA9IDA7CisgICAgaW50CQlsZW47CisgICAgaW50CQltdXN0c2V0OworICAgIGNoYXJfdQlidWZbSU9TSVpFXTsKKyAgICBpbnQJCW9mZjsKKworICAgIGlmICghcmVkcmF3aW5nKCkpCisgICAgeworCS8qIFBvc3Rwb25lIHVwZGF0aW5nIHRoZSB0aXRsZSB3aGVuICdsYXp5cmVkcmF3JyBpcyBzZXQuICovCisJbmVlZF9tYWtldGl0bGUgPSBUUlVFOworCXJldHVybjsKKyAgICB9CisKKyAgICBuZWVkX21ha2V0aXRsZSA9IEZBTFNFOworICAgIGlmICghcF90aXRsZSAmJiAhcF9pY29uKQorCXJldHVybjsKKworICAgIGlmIChwX3RpdGxlKQorICAgIHsKKwlpZiAocF90aXRsZWxlbiA+IDApCisJeworCSAgICBtYXhsZW4gPSBwX3RpdGxlbGVuICogQ29sdW1ucyAvIDEwMDsKKwkgICAgaWYgKG1heGxlbiA8IDEwKQorCQltYXhsZW4gPSAxMDsKKwl9CisKKwl0X3N0ciA9IGJ1ZjsKKwlpZiAoKnBfdGl0bGVzdHJpbmcgIT0gTlVMKQorCXsKKyNpZmRlZiBGRUFUX1NUTF9PUFQKKwkgICAgaWYgKHN0bF9zeW50YXggJiBTVExfSU5fVElUTEUpCisJCWJ1aWxkX3N0bF9zdHJfaGwoY3Vyd2luLCB0X3N0ciwgc2l6ZW9mKGJ1ZiksCisJCQkJCSAgICAgIHBfdGl0bGVzdHJpbmcsIDAsIG1heGxlbiwgTlVMTCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQl0X3N0ciA9IHBfdGl0bGVzdHJpbmc7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIGZvcm1hdDogImZuYW1lICsgKHBhdGgpICgxIG9mIDIpIC0gVklNIiAqLworCisJICAgIGlmIChjdXJidWYtPmJfZm5hbWUgPT0gTlVMTCkKKwkJU1RSQ1BZKGJ1ZiwgXygiW05vIGZpbGVdIikpOworCSAgICBlbHNlCisJICAgIHsKKwkJcCA9IHRyYW5zc3RyKGdldHRhaWwoY3VyYnVmLT5iX2ZuYW1lKSk7CisJCVNUUk5DUFkoYnVmLCBwLCBJT1NJWkUgLSAxMDApOworCQl2aW1fZnJlZShwKTsKKwkJYnVmW0lPU0laRSAtIDEwMF0gPSBOVUw7IC8qIGluIGNhc2UgaXQgd2FzIHRvbyBsb25nICovCisJICAgIH0KKworCSAgICBzd2l0Y2ggKGJ1ZklzQ2hhbmdlZChjdXJidWYpCisJCSAgICArIChjdXJidWYtPmJfcF9ybyAqIDIpCisJCSAgICArICghY3VyYnVmLT5iX3BfbWEgKiA0KSkKKwkgICAgeworCQljYXNlIDE6IFNUUkNBVChidWYsICIgKyIpOyBicmVhazsKKwkJY2FzZSAyOiBTVFJDQVQoYnVmLCAiID0iKTsgYnJlYWs7CisJCWNhc2UgMzogU1RSQ0FUKGJ1ZiwgIiA9KyIpOyBicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDY6IFNUUkNBVChidWYsICIgLSIpOyBicmVhazsKKwkJY2FzZSA1OgorCQljYXNlIDc6IFNUUkNBVChidWYsICIgLSsiKTsgYnJlYWs7CisJICAgIH0KKworCSAgICBpZiAoY3VyYnVmLT5iX2ZuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJLyogR2V0IHBhdGggb2YgZmlsZSwgcmVwbGFjZSBob21lIGRpciB3aXRoIH4gKi8KKwkJb2ZmID0gKGludClTVFJMRU4oYnVmKTsKKwkJYnVmW29mZisrXSA9ICcgJzsKKwkJYnVmW29mZisrXSA9ICcoJzsKKwkJaG9tZV9yZXBsYWNlKGN1cmJ1ZiwgY3VyYnVmLT5iX2ZmbmFtZSwKKwkJCQkJICAgICAgIGJ1ZiArIG9mZiwgSU9TSVpFIC0gb2ZmLCBUUlVFKTsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJLyogYXZvaWQgImM6L25hbWUiIHRvIGJlIHJlZHVjZWQgdG8gImMiICovCisJCWlmIChpc2FscGhhKGJ1ZltvZmZdKSAmJiBidWZbb2ZmICsgMV0gPT0gJzonKQorCQkgICAgb2ZmICs9IDI7CisjZW5kaWYKKwkJLyogcmVtb3ZlIHRoZSBmaWxlIG5hbWUgKi8KKwkJcCA9IGdldHRhaWwoYnVmICsgb2ZmKTsKKwkJaWYgKHAgPT0gYnVmICsgb2ZmKQorCQl7CisJCSAgICAvKiBtdXN0IGJlIGEgaGVscCBidWZmZXIgKi8KKwkJICAgIFNUUkNQWShidWYgKyBvZmYsIF8oImhlbHAiKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICB3aGlsZSAocCA+IGJ1ZiArIG9mZiArIDEgJiYgdmltX2lzcGF0aHNlcChwWy0xXSkpCisJCQktLXA7CisjaWZkZWYgVk1TCisJCSAgICAvKiBwYXRoIHNlcGFyYXRvciBpcyBwYXJ0IG9mIHRoZSBwYXRoICovCisJCSAgICArK3A7CisjZW5kaWYKKwkJICAgICpwID0gTlVMOworCQl9CisJCS8qIHRyYW5zbGF0ZSB1bnByaW50YWJsZSBjaGFycyAqLworCQlwID0gdHJhbnNzdHIoYnVmICsgb2ZmKTsKKwkJU1RSTkNQWShidWYgKyBvZmYsIHAsIElPU0laRSAtIG9mZik7CisJCXZpbV9mcmVlKHApOworCQlidWZbSU9TSVpFIC0gMV0gPSBOVUw7ICAvKiBpbiBjYXNlIGl0IHdhcyB0b28gbG9uZyAqLworCQlTVFJDQVQoYnVmLCAiKSIpOworCSAgICB9CisKKwkgICAgYXBwZW5kX2FyZ19udW1iZXIoY3Vyd2luLCBidWYsIEZBTFNFLCBJT1NJWkUpOworCisjaWYgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikKKwkgICAgaWYgKHNlcnZlck5hbWUgIT0gTlVMTCkKKwkgICAgeworCQlTVFJDQVQoYnVmLCAiIC0gIik7CisJCVNUUkNBVChidWYsIHNlcnZlck5hbWUpOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlTVFJDQVQoYnVmLCAiIC0gVklNIik7CisKKwkgICAgaWYgKG1heGxlbiA+IDApCisJICAgIHsKKwkJLyogbWFrZSBpdCBzaG9ydGVyIGJ5IHJlbW92aW5nIGEgYml0IGluIHRoZSBtaWRkbGUgKi8KKwkJbGVuID0gdmltX3N0cnNpemUoYnVmKTsKKwkJaWYgKGxlbiA+IG1heGxlbikKKwkJICAgIHRydW5jX3N0cmluZyhidWYsIGJ1ZiwgbWF4bGVuKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgbXVzdHNldCA9IHRpX2NoYW5nZSh0X3N0ciwgJmxhc3R0aXRsZSk7CisKKyAgICBpZiAocF9pY29uKQorICAgIHsKKwlpX3N0ciA9IGJ1ZjsKKwlpZiAoKnBfaWNvbnN0cmluZyAhPSBOVUwpCisJeworI2lmZGVmIEZFQVRfU1RMX09QVAorCSAgICBpZiAoc3RsX3N5bnRheCAmIFNUTF9JTl9JQ09OKQorCQlidWlsZF9zdGxfc3RyX2hsKGN1cndpbiwgaV9zdHIsIHNpemVvZihidWYpLAorCQkJCQkJICAgIHBfaWNvbnN0cmluZywgMCwgMCwgTlVMTCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQlpX3N0ciA9IHBfaWNvbnN0cmluZzsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGJ1Zl9zcG5hbWUoY3VyYnVmKSAhPSBOVUxMKQorCQlpX25hbWUgPSAoY2hhcl91ICopYnVmX3NwbmFtZShjdXJidWYpOworCSAgICBlbHNlCQkgICAgLyogdXNlIGZpbGUgbmFtZSBvbmx5IGluIGljb24gKi8KKwkJaV9uYW1lID0gZ2V0dGFpbChjdXJidWYtPmJfZmZuYW1lKTsKKwkgICAgKmlfc3RyID0gTlVMOworCSAgICAvKiBUcnVuY2F0ZSBuYW1lIGF0IDEwMCBieXRlcy4gKi8KKwkgICAgbGVuID0gU1RSTEVOKGlfbmFtZSk7CisJICAgIGlmIChsZW4gPiAxMDApCisJICAgIHsKKwkJbGVuIC09IDEwMDsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChoYXNfbWJ5dGUpCisJCSAgICBsZW4gKz0gKCptYl90YWlsX29mZikoaV9uYW1lLCBpX25hbWUgKyBsZW4pICsgMTsKKyNlbmRpZgorCQlpX25hbWUgKz0gbGVuOworCSAgICB9CisJICAgIFNUUkNQWShpX3N0ciwgaV9uYW1lKTsKKwkgICAgdHJhbnNfY2hhcmFjdGVycyhpX3N0ciwgSU9TSVpFKTsKKwl9CisgICAgfQorCisgICAgbXVzdHNldCB8PSB0aV9jaGFuZ2UoaV9zdHIsICZsYXN0aWNvbik7CisKKyAgICBpZiAobXVzdHNldCkKKwlyZXNldHRpdGxlKCk7Cit9CisKKy8qCisgKiBVc2VkIGZvciB0aXRsZSBhbmQgaWNvbjogQ2hlY2sgaWYgInN0ciIgZGlmZmVycyBmcm9tICIqbGFzdCIuICBTZXQgIipsYXN0IgorICogZnJvbSAic3RyIiBpZiBpdCBkb2VzLgorICogUmV0dXJuIFRSVUUgd2hlbiAiKmxhc3QiIGNoYW5nZWQuCisgKi8KKyAgICBzdGF0aWMgaW50Cit0aV9jaGFuZ2Uoc3RyLCBsYXN0KQorICAgIGNoYXJfdQkqc3RyOworICAgIGNoYXJfdQkqKmxhc3Q7Cit7CisgICAgaWYgKChzdHIgPT0gTlVMTCkgIT0gKCpsYXN0ID09IE5VTEwpCisJICAgIHx8IChzdHIgIT0gTlVMTCAmJiAqbGFzdCAhPSBOVUxMICYmIFNUUkNNUChzdHIsICpsYXN0KSAhPSAwKSkKKyAgICB7CisJdmltX2ZyZWUoKmxhc3QpOworCWlmIChzdHIgPT0gTlVMTCkKKwkgICAgKmxhc3QgPSBOVUxMOworCWVsc2UKKwkgICAgKmxhc3QgPSB2aW1fc3Ryc2F2ZShzdHIpOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBQdXQgY3VycmVudCB3aW5kb3cgdGl0bGUgYmFjayAodXNlZCBhZnRlciBjYWxsaW5nIGEgc2hlbGwpCisgKi8KKyAgICB2b2lkCityZXNldHRpdGxlKCkKK3sKKyAgICBtY2hfc2V0dGl0bGUobGFzdHRpdGxlLCBsYXN0aWNvbik7Cit9CisjZW5kaWYgLyogRkVBVF9USVRMRSAqLworCisjaWYgZGVmaW5lZChGRUFUX1NUTF9PUFQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQnVpbGQgYSBzdHJpbmcgZnJvbSB0aGUgc3RhdHVzIGxpbmUgaXRlbXMgaW4gZm10LgorICogUmV0dXJuIGxlbmd0aCBvZiBzdHJpbmcgaW4gc2NyZWVuIGNlbGxzLgorICoKKyAqIEl0ZW1zIGFyZSBkcmF3biBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgdGV4dCB0aGF0IHN1cnJvdW5kcyBpdAorICogU3BlY2lhbHM6ICUtPHdpZD4oeHh4JSkgPT4gZ3JvdXAsICU9ID0+IG1pZGRsZSBtYXJrZXIsICU8ID0+IHRydW5jYXRpb24KKyAqIEl0ZW06ICUtPG1pbndpZD4uPG1heHdpZD48aXRlbWNoPiBBbGwgYnV0IDxpdGVtY2g+IGFyZSBvcHRpb25hbAorICoKKyAqIElmIG1heHdpZHRoIGlzIG5vdCB6ZXJvLCB0aGUgc3RyaW5nIHdpbGwgYmUgZmlsbGVkIGF0IGFueSBtaWRkbGUgbWFya2VyCisgKiBvciB0cnVuY2F0ZWQgaWYgdG9vIGxvbmcsIGZpbGxjaGFyIGlzIHVzZWQgZm9yIGFsbCB3aGl0ZXNwYWNlLgorICovCisgICAgaW50CitidWlsZF9zdGxfc3RyX2hsKHdwLCBvdXQsIG91dGxlbiwgZm10LCBmaWxsY2hhciwgbWF4d2lkdGgsIGhsKQorICAgIHdpbl9UCSp3cDsKKyAgICBjaGFyX3UJKm91dDsJCS8qIGJ1ZmZlciB0byB3cml0ZSBpbnRvICovCisgICAgc2l6ZV90CW91dGxlbjsJCS8qIGxlbmd0aCBvZiBvdXRbXSAqLworICAgIGNoYXJfdQkqZm10OworICAgIGludAkJZmlsbGNoYXI7CisgICAgaW50CQltYXh3aWR0aDsKKyAgICBzdHJ1Y3Qgc3RsX2hscmVjICpobDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqdDsKKyAgICBjaGFyX3UJKmxpbmVjb250OworI2lmZGVmIEZFQVRfRVZBTAorICAgIHdpbl9UCSpvX2N1cndpbjsKKyAgICBidWZfVAkqb19jdXJidWY7CisjZW5kaWYKKyAgICBpbnQJCWVtcHR5X2xpbmU7CisgICAgY29sbnJfVAl2aXJ0Y29sOworICAgIGxvbmcJbDsKKyAgICBsb25nCW47CisgICAgaW50CQlwcmV2Y2hhcl9pc2ZsYWc7CisgICAgaW50CQlwcmV2Y2hhcl9pc2l0ZW07CisgICAgaW50CQlpdGVtaXNmbGFnOworICAgIGludAkJZmlsbGFibGU7CisgICAgY2hhcl91CSpzdHI7CisgICAgbG9uZwludW07CisgICAgaW50CQl3aWR0aDsKKyAgICBpbnQJCWl0ZW1jbnQ7CisgICAgaW50CQljdXJpdGVtOworICAgIGludAkJZ3JvdXBpdGVtW1NUTF9NQVhfSVRFTV07CisgICAgaW50CQlncm91cGRlcHRoOworICAgIHN0cnVjdCBzdGxfaXRlbQorICAgIHsKKwljaGFyX3UJCSpzdGFydDsKKwlpbnQJCW1pbndpZDsKKwlpbnQJCW1heHdpZDsKKwllbnVtCisJeworCSAgICBOb3JtYWwsCisJICAgIEVtcHR5LAorCSAgICBHcm91cCwKKwkgICAgTWlkZGxlLAorCSAgICBIaWdobGlnaHQsCisJICAgIFRydW5jCisJfQkJdHlwZTsKKyAgICB9CQlpdGVtW1NUTF9NQVhfSVRFTV07CisgICAgaW50CQltaW53aWQ7CisgICAgaW50CQltYXh3aWQ7CisgICAgaW50CQl6ZXJvcGFkOworICAgIGNoYXJfdQliYXNlOworICAgIGNoYXJfdQlvcHQ7CisjZGVmaW5lIFRNUExFTiA3MAorICAgIGNoYXJfdQl0bXBbVE1QTEVOXTsKKworICAgIGlmIChmaWxsY2hhciA9PSAwKQorCWZpbGxjaGFyID0gJyAnOworICAgIC8qCisgICAgICogR2V0IGxpbmUgJiBjaGVjayBpZiBlbXB0eSAoY3Vyc29ycG9zIHdpbGwgc2hvdyAiMC0xIikuCisgICAgICogSWYgaW52ZXJzaW9uIGlzIHBvc3NpYmxlIHdlIHVzZSBpdC4gRWxzZSAnPScgY2hhcmFjdGVycyBhcmUgdXNlZC4KKyAgICAgKi8KKyAgICBsaW5lY29udCA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCB3cC0+d19jdXJzb3IubG51bSwgRkFMU0UpOworICAgIGVtcHR5X2xpbmUgPSAoKmxpbmVjb250ID09IE5VTCk7CisKKyAgICBncm91cGRlcHRoID0gMDsKKyAgICBwID0gb3V0OworICAgIGN1cml0ZW0gPSAwOworICAgIHByZXZjaGFyX2lzZmxhZyA9IFRSVUU7CisgICAgcHJldmNoYXJfaXNpdGVtID0gRkFMU0U7CisgICAgZm9yIChzID0gZm10OyAqczspCisgICAgeworCWlmICgqcyAhPSBOVUwgJiYgKnMgIT0gJyUnKQorCSAgICBwcmV2Y2hhcl9pc2ZsYWcgPSBwcmV2Y2hhcl9pc2l0ZW0gPSBGQUxTRTsKKworCS8qCisJICogSGFuZGxlIHVwIHRvIHRoZSBuZXh0ICclJyBvciB0aGUgZW5kLgorCSAqLworCXdoaWxlICgqcyAhPSBOVUwgJiYgKnMgIT0gJyUnICYmIHAgKyAxIDwgb3V0ICsgb3V0bGVuKQorCSAgICAqcCsrID0gKnMrKzsKKwlpZiAoKnMgPT0gTlVMIHx8IHAgKyAxID49IG91dCArIG91dGxlbikKKwkgICAgYnJlYWs7CisKKwkvKgorCSAqIEhhbmRsZSBvbmUgJyUnIGl0ZW0uCisJICovCisJcysrOworCWlmICgqcyA9PSAnJScpCisJeworCSAgICBpZiAocCArIDEgPj0gb3V0ICsgb3V0bGVuKQorCQlicmVhazsKKwkgICAgKnArKyA9ICpzKys7CisJICAgIHByZXZjaGFyX2lzZmxhZyA9IHByZXZjaGFyX2lzaXRlbSA9IEZBTFNFOworCSAgICBjb250aW51ZTsKKwl9CisJaWYgKCpzID09IFNUTF9NSURETEVNQVJLKQorCXsKKwkgICAgcysrOworCSAgICBpZiAoZ3JvdXBkZXB0aCA+IDApCisJCWNvbnRpbnVlOworCSAgICBpdGVtW2N1cml0ZW1dLnR5cGUgPSBNaWRkbGU7CisJICAgIGl0ZW1bY3VyaXRlbSsrXS5zdGFydCA9IHA7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoKnMgPT0gU1RMX1RSVU5DTUFSSykKKwl7CisJICAgIHMrKzsKKwkgICAgaXRlbVtjdXJpdGVtXS50eXBlID0gVHJ1bmM7CisJICAgIGl0ZW1bY3VyaXRlbSsrXS5zdGFydCA9IHA7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoKnMgPT0gJyknKQorCXsKKwkgICAgcysrOworCSAgICBpZiAoZ3JvdXBkZXB0aCA8IDEpCisJCWNvbnRpbnVlOworCSAgICBncm91cGRlcHRoLS07CisKKwkgICAgdCA9IGl0ZW1bZ3JvdXBpdGVtW2dyb3VwZGVwdGhdXS5zdGFydDsKKwkgICAgKnAgPSBOVUw7CisJICAgIGwgPSB2aW1fc3Ryc2l6ZSh0KTsKKwkgICAgaWYgKGN1cml0ZW0gPiBncm91cGl0ZW1bZ3JvdXBkZXB0aF0gKyAxCisJCSAgICAmJiBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWlud2lkID09IDApCisJICAgIHsKKwkJLyogcmVtb3ZlIGdyb3VwIGlmIGFsbCBpdGVtcyBhcmUgZW1wdHkgKi8KKwkJZm9yIChuID0gZ3JvdXBpdGVtW2dyb3VwZGVwdGhdICsgMTsgbiA8IGN1cml0ZW07IG4rKykKKwkJICAgIGlmIChpdGVtW25dLnR5cGUgPT0gTm9ybWFsKQorCQkJYnJlYWs7CisJCWlmIChuID09IGN1cml0ZW0pCisJCXsKKwkJICAgIHAgPSB0OworCQkgICAgbCA9IDA7CisJCX0KKwkgICAgfQorCSAgICBpZiAobCA+IGl0ZW1bZ3JvdXBpdGVtW2dyb3VwZGVwdGhdXS5tYXh3aWQpCisJICAgIHsKKwkJLyogdHJ1bmNhdGUsIHJlbW92ZSBuIGJ5dGVzIG9mIHRleHQgYXQgdGhlIHN0YXJ0ICovCisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQl7CisJCSAgICAvKiBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQuICovCisJCSAgICBuID0gMDsKKwkJICAgIHdoaWxlIChsID49IGl0ZW1bZ3JvdXBpdGVtW2dyb3VwZGVwdGhdXS5tYXh3aWQpCisJCSAgICB7CisJCQlsIC09IHB0cjJjZWxscyh0ICsgbik7CisJCQluICs9ICgqbWJfcHRyMmxlbl9jaGVjaykodCArIG4pOworCQkgICAgfQorCQl9CisJCWVsc2UKKyNlbmRpZgorCQkgICAgbiA9IChwIC0gdCkgLSBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWF4d2lkICsgMTsKKworCQkqdCA9ICc8JzsKKwkJbWNoX21lbW1vdmUodCArIDEsIHQgKyBuLCBwIC0gKHQgKyBuKSk7CisJCXAgPSBwIC0gbiArIDE7CisjaWZkZWYgRkVBVF9NQllURQorCQkvKiBGaWxsIHVwIHNwYWNlIGxlZnQgb3ZlciBieSBoYWxmIGEgZG91YmxlLXdpZGUgY2hhci4gKi8KKwkJd2hpbGUgKCsrbCA8IGl0ZW1bZ3JvdXBpdGVtW2dyb3VwZGVwdGhdXS5taW53aWQpCisJCSAgICAqcCsrID0gZmlsbGNoYXI7CisjZW5kaWYKKworCQkvKiBjb3JyZWN0IHRoZSBzdGFydCBvZiB0aGUgaXRlbXMgZm9yIHRoZSB0cnVuY2F0aW9uICovCisJCWZvciAobCA9IGdyb3VwaXRlbVtncm91cGRlcHRoXSArIDE7IGwgPCBjdXJpdGVtOyBsKyspCisJCXsKKwkJICAgIGl0ZW1bbF0uc3RhcnQgLT0gbjsKKwkJICAgIGlmIChpdGVtW2xdLnN0YXJ0IDwgdCkKKwkJCWl0ZW1bbF0uc3RhcnQgPSB0OworCQl9CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYWJzKGl0ZW1bZ3JvdXBpdGVtW2dyb3VwZGVwdGhdXS5taW53aWQpID4gbCkKKwkgICAgeworCQkvKiBmaWxsICovCisJCW4gPSBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWlud2lkOworCQlpZiAobiA8IDApCisJCXsKKwkJICAgIC8qIGZpbGwgYnkgYXBwZW5kaW5nIGNoYXJhY3RlcnMgKi8KKwkJICAgIG4gPSAwIC0gbjsKKwkJICAgIHdoaWxlIChsKysgPCBuICYmIHAgKyAxIDwgb3V0ICsgb3V0bGVuKQorCQkJKnArKyA9IGZpbGxjaGFyOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogZmlsbCBieSBpbnNlcnRpbmcgY2hhcmFjdGVycyAqLworCQkgICAgbWNoX21lbW1vdmUodCArIG4gLSBsLCB0LCBwIC0gdCk7CisJCSAgICBsID0gbiAtIGw7CisJCSAgICBpZiAocCArIGwgPj0gb3V0ICsgb3V0bGVuKQorCQkJbCA9IChvdXQgKyBvdXRsZW4pIC0gcCAtIDE7CisJCSAgICBwICs9IGw7CisJCSAgICBmb3IgKG4gPSBncm91cGl0ZW1bZ3JvdXBkZXB0aF0gKyAxOyBuIDwgY3VyaXRlbTsgbisrKQorCQkJaXRlbVtuXS5zdGFydCArPSBsOworCQkgICAgZm9yICggOyBsID4gMDsgbC0tKQorCQkJKnQrKyA9IGZpbGxjaGFyOworCQl9CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCW1pbndpZCA9IDA7CisJbWF4d2lkID0gOTk5OTsKKwl6ZXJvcGFkID0gRkFMU0U7CisJbCA9IDE7CisJaWYgKCpzID09ICcwJykKKwl7CisJICAgIHMrKzsKKwkgICAgemVyb3BhZCA9IFRSVUU7CisJfQorCWlmICgqcyA9PSAnLScpCisJeworCSAgICBzKys7CisJICAgIGwgPSAtMTsKKwl9CisJaWYgKFZJTV9JU0RJR0lUKCpzKSkKKwl7CisJICAgIG1pbndpZCA9IChpbnQpZ2V0ZGlnaXRzKCZzKTsKKwkgICAgaWYgKG1pbndpZCA8IDApCS8qIG92ZXJmbG93ICovCisJCW1pbndpZCA9IDA7CisJfQorCWlmICgqcyA9PSBTVExfSElHSExJR0hUKQorCXsKKwkgICAgaXRlbVtjdXJpdGVtXS50eXBlID0gSGlnaGxpZ2h0OworCSAgICBpdGVtW2N1cml0ZW1dLnN0YXJ0ID0gcDsKKwkgICAgaXRlbVtjdXJpdGVtXS5taW53aWQgPSBtaW53aWQgPiA5ID8gMSA6IG1pbndpZDsKKwkgICAgcysrOworCSAgICBjdXJpdGVtKys7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoKnMgPT0gJy4nKQorCXsKKwkgICAgcysrOworCSAgICBpZiAoVklNX0lTRElHSVQoKnMpKQorCSAgICB7CisJCW1heHdpZCA9IChpbnQpZ2V0ZGlnaXRzKCZzKTsKKwkJaWYgKG1heHdpZCA8PSAwKQkvKiBvdmVyZmxvdyAqLworCQkgICAgbWF4d2lkID0gNTA7CisJICAgIH0KKwl9CisJbWlud2lkID0gKG1pbndpZCA+IDUwID8gNTAgOiBtaW53aWQpICogbDsKKwlpZiAoKnMgPT0gJygnKQorCXsKKwkgICAgZ3JvdXBpdGVtW2dyb3VwZGVwdGgrK10gPSBjdXJpdGVtOworCSAgICBpdGVtW2N1cml0ZW1dLnR5cGUgPSBHcm91cDsKKwkgICAgaXRlbVtjdXJpdGVtXS5zdGFydCA9IHA7CisJICAgIGl0ZW1bY3VyaXRlbV0ubWlud2lkID0gbWlud2lkOworCSAgICBpdGVtW2N1cml0ZW1dLm1heHdpZCA9IG1heHdpZDsKKwkgICAgcysrOworCSAgICBjdXJpdGVtKys7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAodmltX3N0cmNocihTVExfQUxMLCAqcykgPT0gTlVMTCkKKwl7CisJICAgIHMrKzsKKwkgICAgY29udGludWU7CisJfQorCW9wdCA9ICpzKys7CisKKwkvKiBPSyAtIG5vdyBmb3IgdGhlIHJlYWwgd29yayAqLworCWJhc2UgPSAnRCc7CisJaXRlbWlzZmxhZyA9IEZBTFNFOworCWZpbGxhYmxlID0gVFJVRTsKKwludW0gPSAtMTsKKwlzdHIgPSBOVUxMOworCXN3aXRjaCAob3B0KQorCXsKKwljYXNlIFNUTF9GSUxFUEFUSDoKKwljYXNlIFNUTF9GVUxMUEFUSDoKKwljYXNlIFNUTF9GSUxFTkFNRToKKwkgICAgZmlsbGFibGUgPSBGQUxTRTsJLyogZG9uJ3QgY2hhbmdlICcgJyB0byBmaWxsY2hhciAqLworCSAgICBpZiAoYnVmX3NwbmFtZSh3cC0+d19idWZmZXIpICE9IE5VTEwpCisJCVNUUkNQWShOYW1lQnVmZiwgYnVmX3NwbmFtZSh3cC0+d19idWZmZXIpKTsKKwkgICAgZWxzZQorCSAgICB7CisJCXQgPSAob3B0ID09IFNUTF9GVUxMUEFUSCkgPyB3cC0+d19idWZmZXItPmJfZmZuYW1lCisJCQkJCTogd3AtPndfYnVmZmVyLT5iX2ZuYW1lOworCQlob21lX3JlcGxhY2Uod3AtPndfYnVmZmVyLCB0LCBOYW1lQnVmZiwgTUFYUEFUSEwsIFRSVUUpOworCSAgICB9CisJICAgIHRyYW5zX2NoYXJhY3RlcnMoTmFtZUJ1ZmYsIE1BWFBBVEhMKTsKKwkgICAgaWYgKG9wdCAhPSBTVExfRklMRU5BTUUpCisJCXN0ciA9IE5hbWVCdWZmOworCSAgICBlbHNlCisJCXN0ciA9IGdldHRhaWwoTmFtZUJ1ZmYpOworCSAgICBicmVhazsKKworCWNhc2UgU1RMX1ZJTV9FWFBSOiAvKiAneycgKi8KKwkgICAgaXRlbWlzZmxhZyA9IFRSVUU7CisJICAgIHQgPSBwOworCSAgICB3aGlsZSAoKnMgIT0gJ30nICYmICpzICE9IE5VTCAmJiBwICsgMSA8IG91dCArIG91dGxlbikKKwkJKnArKyA9ICpzKys7CisJICAgIGlmICgqcyAhPSAnfScpCS8qIG1pc3NpbmcgJ30nIG9yIG91dCBvZiBzcGFjZSAqLworCQlicmVhazsKKwkgICAgcysrOworCSAgICAqcCA9IDA7CisJICAgIHAgPSB0OworCisjaWZkZWYgRkVBVF9FVkFMCisJICAgIHNwcmludGYoKGNoYXIgKil0bXAsICIlZCIsIGN1cmJ1Zi0+Yl9mbnVtKTsKKwkgICAgc2V0X2ludGVybmFsX3N0cmluZ192YXIoKGNoYXJfdSAqKSJhY3R1YWxfY3VyYnVmIiwgdG1wKTsKKworCSAgICBvX2N1cmJ1ZiA9IGN1cmJ1ZjsKKwkgICAgb19jdXJ3aW4gPSBjdXJ3aW47CisJICAgIGN1cndpbiA9IHdwOworCSAgICBjdXJidWYgPSB3cC0+d19idWZmZXI7CisKKwkgICAgc3RyID0gZXZhbF90b19zdHJpbmdfc2FmZShwLCAmdCk7CisKKwkgICAgY3Vyd2luID0gb19jdXJ3aW47CisJICAgIGN1cmJ1ZiA9IG9fY3VyYnVmOworCSAgICBkb191bmxldCgoY2hhcl91ICopImc6YWN0dWFsX2N1cmJ1ZiIpOworCisJICAgIGlmIChzdHIgIT0gTlVMTCAmJiAqc3RyICE9IDApCisJICAgIHsKKwkJaWYgKCpza2lwZGlnaXRzKHN0cikgPT0gTlVMKQorCQl7CisJCSAgICBudW0gPSBhdG9pKChjaGFyICopc3RyKTsKKwkJICAgIHZpbV9mcmVlKHN0cik7CisJCSAgICBzdHIgPSBOVUxMOworCQkgICAgaXRlbWlzZmxhZyA9IEZBTFNFOworCQl9CisJICAgIH0KKyNlbmRpZgorCSAgICBicmVhazsKKworCWNhc2UgU1RMX0xJTkU6CisJICAgIG51bSA9ICh3cC0+d19idWZmZXItPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkKKwkJICA/IDBMIDogKGxvbmcpKHdwLT53X2N1cnNvci5sbnVtKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUTF9OVU1MSU5FUzoKKwkgICAgbnVtID0gd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIGJyZWFrOworCisJY2FzZSBTVExfQ09MVU1OOgorCSAgICBudW0gPSAhKFN0YXRlICYgSU5TRVJUKSAmJiBlbXB0eV9saW5lCisJCSAgPyAwIDogKGludCl3cC0+d19jdXJzb3IuY29sICsgMTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUTF9WSVJUQ09MOgorCWNhc2UgU1RMX1ZJUlRDT0xfQUxUOgorCSAgICAvKiBJbiBsaXN0IG1vZGUgdmlydGNvbCBuZWVkcyB0byBiZSByZWNvbXB1dGVkICovCisJICAgIHZpcnRjb2wgPSB3cC0+d192aXJ0Y29sOworCSAgICBpZiAod3AtPndfcF9saXN0ICYmIGxjc190YWIxID09IE5VTCkKKwkgICAgeworCQl3cC0+d19wX2xpc3QgPSBGQUxTRTsKKwkJZ2V0dmNvbCh3cCwgJndwLT53X2N1cnNvciwgTlVMTCwgJnZpcnRjb2wsIE5VTEwpOworCQl3cC0+d19wX2xpc3QgPSBUUlVFOworCSAgICB9CisJICAgICsrdmlydGNvbDsKKwkgICAgLyogRG9uJ3QgZGlzcGxheSAlViBpZiBpdCdzIHRoZSBzYW1lIGFzICVjLiAqLworCSAgICBpZiAob3B0ID09IFNUTF9WSVJUQ09MX0FMVAorCQkgICAgJiYgKHZpcnRjb2wgPT0gKGNvbG5yX1QpKCEoU3RhdGUgJiBJTlNFUlQpICYmIGVtcHR5X2xpbmUKKwkJCSAgICA/IDAgOiAoaW50KXdwLT53X2N1cnNvci5jb2wgKyAxKSkpCisJCWJyZWFrOworCSAgICBudW0gPSAobG9uZyl2aXJ0Y29sOworCSAgICBicmVhazsKKworCWNhc2UgU1RMX1BFUkNFTlRBR0U6CisJICAgIG51bSA9IChpbnQpKCgobG9uZyl3cC0+d19jdXJzb3IubG51bSAqIDEwMEwpIC8KKwkJCShsb25nKXdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUTF9BTFRQRVJDRU5UOgorCSAgICBzdHIgPSB0bXA7CisJICAgIGdldF9yZWxfcG9zKHdwLCBzdHIpOworCSAgICBicmVhazsKKworCWNhc2UgU1RMX0FSR0xJU1RTVEFUOgorCSAgICBmaWxsYWJsZSA9IEZBTFNFOworCSAgICB0bXBbMF0gPSAwOworCSAgICBpZiAoYXBwZW5kX2FyZ19udW1iZXIod3AsIHRtcCwgRkFMU0UsIChpbnQpc2l6ZW9mKHRtcCkpKQorCQlzdHIgPSB0bXA7CisJICAgIGJyZWFrOworCisJY2FzZSBTVExfS0VZTUFQOgorCSAgICBmaWxsYWJsZSA9IEZBTFNFOworCSAgICBpZiAoZ2V0X2tleW1hcF9zdHIod3AsIHRtcCwgVE1QTEVOKSkKKwkJc3RyID0gdG1wOworCSAgICBicmVhazsKKwljYXNlIFNUTF9QQUdFTlVNOgorI2lmZGVmIEZFQVRfUFJJTlRFUgorCSAgICBudW0gPSBnZXRfcHJpbnRlcl9wYWdlX251bSgpOworI2Vsc2UKKwkgICAgbnVtID0gMDsKKyNlbmRpZgorCSAgICBicmVhazsKKworCWNhc2UgU1RMX0JVRk5POgorCSAgICBudW0gPSB3cC0+d19idWZmZXItPmJfZm51bTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUTF9PRkZTRVRfWDoKKwkgICAgYmFzZSA9ICdYJzsKKwljYXNlIFNUTF9PRkZTRVQ6CisjaWZkZWYgRkVBVF9CWVRFT0ZGCisJICAgIGwgPSBtbF9maW5kX2xpbmVfb3Jfb2Zmc2V0KHdwLT53X2J1ZmZlciwgd3AtPndfY3Vyc29yLmxudW0sIE5VTEwpOworCSAgICBudW0gPSAod3AtPndfYnVmZmVyLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpIHx8IGwgPCAwID8KKwkJICAwTCA6IGwgKyAxICsgKCEoU3RhdGUgJiBJTlNFUlQpICYmIGVtcHR5X2xpbmUgPworCQkJCTAgOiAoaW50KXdwLT53X2N1cnNvci5jb2wpOworI2VuZGlmCisJICAgIGJyZWFrOworCisJY2FzZSBTVExfQllURVZBTF9YOgorCSAgICBiYXNlID0gJ1gnOworCWNhc2UgU1RMX0JZVEVWQUw6CisJICAgIGlmICgoKFN0YXRlICYgSU5TRVJUKSAmJiB3cCA9PSBjdXJ3aW4pIHx8IGVtcHR5X2xpbmUpCisJCW51bSA9IDA7CisJICAgIGVsc2UKKwkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJbnVtID0gKCptYl9wdHIyY2hhcikobGluZWNvbnQgKyB3cC0+d19jdXJzb3IuY29sKTsKKyNlbHNlCisJCW51bSA9IGxpbmVjb250W3dwLT53X2N1cnNvci5jb2xdOworI2VuZGlmCisJICAgIH0KKwkgICAgaWYgKG51bSA9PSBOTCkKKwkJbnVtID0gMDsKKwkgICAgZWxzZSBpZiAobnVtID09IENBUiAmJiBnZXRfZmlsZWZvcm1hdCh3cC0+d19idWZmZXIpID09IEVPTF9NQUMpCisJCW51bSA9IE5MOworCSAgICBicmVhazsKKworCWNhc2UgU1RMX1JPRkxBRzoKKwljYXNlIFNUTF9ST0ZMQUdfQUxUOgorCSAgICBpdGVtaXNmbGFnID0gVFJVRTsKKwkgICAgaWYgKHdwLT53X2J1ZmZlci0+Yl9wX3JvKQorCQlzdHIgPSAoY2hhcl91ICopKChvcHQgPT0gU1RMX1JPRkxBR19BTFQpID8gIixSTyIgOiAiW1JPXSIpOworCSAgICBicmVhazsKKworCWNhc2UgU1RMX0hFTFBGTEFHOgorCWNhc2UgU1RMX0hFTFBGTEFHX0FMVDoKKwkgICAgaXRlbWlzZmxhZyA9IFRSVUU7CisJICAgIGlmICh3cC0+d19idWZmZXItPmJfaGVscCkKKwkJc3RyID0gKGNoYXJfdSAqKSgob3B0ID09IFNUTF9IRUxQRkxBR19BTFQpID8gIixITFAiCisJCQkJCQkJICAgICAgIDogXygiW2hlbHBdIikpOworCSAgICBicmVhazsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWNhc2UgU1RMX0ZJTEVUWVBFOgorCSAgICBpZiAoKndwLT53X2J1ZmZlci0+Yl9wX2Z0ICE9IE5VTAorCQkgICAgJiYgU1RSTEVOKHdwLT53X2J1ZmZlci0+Yl9wX2Z0KSA8IFRNUExFTiAtIDMpCisJICAgIHsKKwkJc3ByaW50ZigoY2hhciAqKXRtcCwgIlslc10iLCB3cC0+d19idWZmZXItPmJfcF9mdCk7CisJCXN0ciA9IHRtcDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgU1RMX0ZJTEVUWVBFX0FMVDoKKwkgICAgaXRlbWlzZmxhZyA9IFRSVUU7CisJICAgIGlmICgqd3AtPndfYnVmZmVyLT5iX3BfZnQgIT0gTlVMCisJCSAgICAmJiBTVFJMRU4od3AtPndfYnVmZmVyLT5iX3BfZnQpIDwgVE1QTEVOIC0gMikKKwkgICAgeworCQlzcHJpbnRmKChjaGFyICopdG1wLCAiLCVzIiwgd3AtPndfYnVmZmVyLT5iX3BfZnQpOworCQlmb3IgKHQgPSB0bXA7ICp0ICE9IDA7IHQrKykKKwkJICAgICp0ID0gVE9VUFBFUl9MT0MoKnQpOworCQlzdHIgPSB0bXA7CisJICAgIH0KKwkgICAgYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJY2FzZSBTVExfUFJFVklFV0ZMQUc6CisJY2FzZSBTVExfUFJFVklFV0ZMQUdfQUxUOgorCSAgICBpdGVtaXNmbGFnID0gVFJVRTsKKwkgICAgaWYgKHdwLT53X3BfcHZ3KQorCQlzdHIgPSAoY2hhcl91ICopKChvcHQgPT0gU1RMX1BSRVZJRVdGTEFHX0FMVCkgPyAiLFBSViIKKwkJCQkJCQkgICAgOiBfKCJbUHJldmlld10iKSk7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIFNUTF9NT0RJRklFRDoKKwljYXNlIFNUTF9NT0RJRklFRF9BTFQ6CisJICAgIGl0ZW1pc2ZsYWcgPSBUUlVFOworCSAgICBzd2l0Y2ggKChvcHQgPT0gU1RMX01PRElGSUVEX0FMVCkKKwkJICAgICsgYnVmSXNDaGFuZ2VkKHdwLT53X2J1ZmZlcikgKiAyCisJCSAgICArICghd3AtPndfYnVmZmVyLT5iX3BfbWEpICogNCkKKwkgICAgeworCQljYXNlIDI6IHN0ciA9IChjaGFyX3UgKikiWytdIjsgYnJlYWs7CisJCWNhc2UgMzogc3RyID0gKGNoYXJfdSAqKSIsKyI7IGJyZWFrOworCQljYXNlIDQ6IHN0ciA9IChjaGFyX3UgKikiWy1dIjsgYnJlYWs7CisJCWNhc2UgNTogc3RyID0gKGNoYXJfdSAqKSIsLSI7IGJyZWFrOworCQljYXNlIDY6IHN0ciA9IChjaGFyX3UgKikiWystXSI7IGJyZWFrOworCQljYXNlIDc6IHN0ciA9IChjaGFyX3UgKikiLCstIjsgYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCisJaXRlbVtjdXJpdGVtXS5zdGFydCA9IHA7CisJaXRlbVtjdXJpdGVtXS50eXBlID0gTm9ybWFsOworCWlmIChzdHIgIT0gTlVMTCAmJiAqc3RyKQorCXsKKwkgICAgdCA9IHN0cjsKKwkgICAgaWYgKGl0ZW1pc2ZsYWcpCisJICAgIHsKKwkJaWYgKCh0WzBdICYmIHRbMV0pCisJCQkmJiAoKCFwcmV2Y2hhcl9pc2l0ZW0gJiYgKnQgPT0gJywnKQorCQkJICAgICAgfHwgKHByZXZjaGFyX2lzZmxhZyAmJiAqdCA9PSAnICcpKSkKKwkJICAgIHQrKzsKKwkJcHJldmNoYXJfaXNmbGFnID0gVFJVRTsKKwkgICAgfQorCSAgICBsID0gdmltX3N0cnNpemUodCk7CisJICAgIGlmIChsID4gMCkKKwkJcHJldmNoYXJfaXNpdGVtID0gVFJVRTsKKwkgICAgaWYgKGwgPiBtYXh3aWQpCisJICAgIHsKKwkJd2hpbGUgKGwgPj0gbWF4d2lkKQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCSAgICB7CisJCQlsIC09IHB0cjJjZWxscyh0KTsKKwkJCXQgKz0gKCptYl9wdHIybGVuX2NoZWNrKSh0KTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJbCAtPSBieXRlMmNlbGxzKCp0KyspOworCQlpZiAocCArIDEgPj0gb3V0ICsgb3V0bGVuKQorCQkgICAgYnJlYWs7CisJCSpwKysgPSAnPCc7CisJICAgIH0KKwkgICAgaWYgKG1pbndpZCA+IDApCisJICAgIHsKKwkJZm9yICg7IGwgPCBtaW53aWQgJiYgcCArIDEgPCBvdXQgKyBvdXRsZW47IGwrKykKKwkJeworCQkgICAgLyogRG9uJ3QgcHV0IGEgIi0iIGluIGZyb250IG9mIGEgZGlnaXQuICovCisJCSAgICBpZiAobCArIDEgPT0gbWlud2lkICYmIGZpbGxjaGFyID09ICctJyAmJiBWSU1fSVNESUdJVCgqdCkpCisJCQkqcCsrID0gJyAnOworCQkgICAgZWxzZQorCQkJKnArKyA9IGZpbGxjaGFyOworCQl9CisJCW1pbndpZCA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCQltaW53aWQgKj0gLTE7CisJICAgIHdoaWxlICgqdCAmJiBwICsgMSA8IG91dCArIG91dGxlbikKKwkgICAgeworCQkqcCsrID0gKnQrKzsKKwkJLyogQ2hhbmdlIGEgc3BhY2UgYnkgZmlsbGNoYXIsIHVubGVzcyBmaWxsY2hhciBpcyAnLScgYW5kIGEKKwkJICogZGlnaXQgZm9sbG93cy4gKi8KKwkJaWYgKGZpbGxhYmxlICYmIHBbLTFdID09ICcgJworCQkJCSAgICAgJiYgKCFWSU1fSVNESUdJVCgqdCkgfHwgZmlsbGNoYXIgIT0gJy0nKSkKKwkJICAgIHBbLTFdID0gZmlsbGNoYXI7CisJICAgIH0KKwkgICAgZm9yICg7IGwgPCBtaW53aWQgJiYgcCArIDEgPCBvdXQgKyBvdXRsZW47IGwrKykKKwkJKnArKyA9IGZpbGxjaGFyOworCX0KKwllbHNlIGlmIChudW0gPj0gMCkKKwl7CisJICAgIGludCBuYmFzZSA9IChiYXNlID09ICdEJyA/IDEwIDogKGJhc2UgPT0gJ08nID8gOCA6IDE2KSk7CisJICAgIGNoYXJfdSBuc3RyWzIwXTsKKworCSAgICBpZiAocCArIDIwID49IG91dCArIG91dGxlbikKKwkJYnJlYWs7CQkvKiBub3Qgc3VmZmljaWVudCBzcGFjZSAqLworCSAgICBwcmV2Y2hhcl9pc2l0ZW0gPSBUUlVFOworCSAgICB0ID0gbnN0cjsKKwkgICAgaWYgKG9wdCA9PSBTVExfVklSVENPTF9BTFQpCisJICAgIHsKKwkJKnQrKyA9ICctJzsKKwkJbWlud2lkLS07CisJICAgIH0KKwkgICAgKnQrKyA9ICclJzsKKwkgICAgaWYgKHplcm9wYWQpCisJCSp0KysgPSAnMCc7CisJICAgICp0KysgPSAnKic7CisJICAgICp0KysgPSBuYmFzZSA9PSAxNiA/IGJhc2UgOiAobmJhc2UgPT0gOCA/ICdvJyA6ICdkJyk7CisJICAgICp0ID0gMDsKKworCSAgICBmb3IgKG4gPSBudW0sIGwgPSAxOyBuID49IG5iYXNlOyBuIC89IG5iYXNlKQorCQlsKys7CisJICAgIGlmIChvcHQgPT0gU1RMX1ZJUlRDT0xfQUxUKQorCQlsKys7CisJICAgIGlmIChsID4gbWF4d2lkKQorCSAgICB7CisJCWwgKz0gMjsKKwkJbiA9IGwgLSBtYXh3aWQ7CisJCXdoaWxlIChsLS0gPiBtYXh3aWQpCisJCSAgICBudW0gLz0gbmJhc2U7CisJCSp0KysgPSAnPic7CisJCSp0KysgPSAnJSc7CisJCSp0ID0gdFstM107CisJCSorK3QgPSAwOworCQlzcHJpbnRmKChjaGFyICopcCwgKGNoYXIgKiluc3RyLCAwLCBudW0sIG4pOworCSAgICB9CisJICAgIGVsc2UKKwkJc3ByaW50ZigoY2hhciAqKXAsIChjaGFyICopbnN0ciwgbWlud2lkLCBudW0pOworCSAgICBwICs9IFNUUkxFTihwKTsKKwl9CisJZWxzZQorCSAgICBpdGVtW2N1cml0ZW1dLnR5cGUgPSBFbXB0eTsKKworCWlmIChvcHQgPT0gU1RMX1ZJTV9FWFBSKQorCSAgICB2aW1fZnJlZShzdHIpOworCisJaWYgKG51bSA+PSAwIHx8ICghaXRlbWlzZmxhZyAmJiBzdHIgJiYgKnN0cikpCisJICAgIHByZXZjaGFyX2lzZmxhZyA9IEZBTFNFOwkgICAgLyogSXRlbSBub3QgTlVMTCwgYnV0IG5vdCBhIGZsYWcgKi8KKwljdXJpdGVtKys7CisgICAgfQorICAgICpwID0gTlVMOworICAgIGl0ZW1jbnQgPSBjdXJpdGVtOworCisgICAgd2lkdGggPSB2aW1fc3Ryc2l6ZShvdXQpOworICAgIGlmIChtYXh3aWR0aCA+IDAgJiYgd2lkdGggPiBtYXh3aWR0aCkKKyAgICB7CisJLyogUmVzdWx0IGlzIHRvbyBsb25nLCBtdXN0IHRydW5jdGF0ZSBzb21ld2hlcmUuICovCisJbCA9IDA7CisJaWYgKGl0ZW1jbnQgPT0gMCkKKwkgICAgcyA9IG91dDsKKwllbHNlCisJeworCSAgICBmb3IgKCA7IGwgPCBpdGVtY250OyBsKyspCisJCWlmIChpdGVtW2xdLnR5cGUgPT0gVHJ1bmMpCisJCXsKKwkJICAgIC8qIFRydW5jYXRlIGF0ICU8IGl0ZW0uICovCisJCSAgICBzID0gaXRlbVtsXS5zdGFydDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIGlmIChsID09IGl0ZW1jbnQpCisJICAgIHsKKwkJLyogTm8gJTwgaXRlbSwgdHJ1bmNhdGUgZmlyc3QgaXRlbS4gKi8KKwkJcyA9IGl0ZW1bMF0uc3RhcnQ7CisJCWwgPSAwOworCSAgICB9CisJfQorCisJaWYgKHdpZHRoIC0gdmltX3N0cnNpemUocykgPj0gbWF4d2lkdGgpCisJeworCSAgICAvKiBUcnVuY2F0aW9uIG1hcmsgaXMgYmV5b25kIG1heCBsZW5ndGggKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJcyA9IG91dDsKKwkJd2lkdGggPSAwOworCQlmb3IgKDs7KQorCQl7CisJCSAgICB3aWR0aCArPSBwdHIyY2VsbHMocyk7CisJCSAgICBpZiAod2lkdGggPj0gbWF4d2lkdGgpCisJCQlicmVhazsKKwkJICAgIHMgKz0gKCptYl9wdHIybGVuX2NoZWNrKShzKTsKKwkJfQorCQkvKiBGaWxsIHVwIGZvciBoYWxmIGEgZG91YmxlLXdpZGUgY2hhcmFjdGVyLiAqLworCQl3aGlsZSAoKyt3aWR0aCA8IG1heHdpZHRoKQorCQkgICAgKnMrKyA9IGZpbGxjaGFyOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlzID0gb3V0ICsgbWF4d2lkdGggLSAxOworCSAgICBmb3IgKGwgPSAwOyBsIDwgaXRlbWNudDsgbCsrKQorCQlpZiAoaXRlbVtsXS5zdGFydCA+IHMpCisJCSAgICBicmVhazsKKwkgICAgaXRlbWNudCA9IGw7CisJICAgICpzKysgPSAnPic7CisJICAgICpzID0gMDsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJbiA9IDA7CisJCXdoaWxlICh3aWR0aCA+PSBtYXh3aWR0aCkKKwkJeworCQkgICAgd2lkdGggLT0gcHRyMmNlbGxzKHMgKyBuKTsKKwkJICAgIG4gKz0gKCptYl9wdHIybGVuX2NoZWNrKShzICsgbik7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJbiA9IHdpZHRoIC0gbWF4d2lkdGggKyAxOworCSAgICBwID0gcyArIG47CisJICAgIG1jaF9tZW1tb3ZlKHMgKyAxLCBwLCBTVFJMRU4ocCkgKyAxKTsKKwkgICAgKnMgPSAnPCc7CisKKwkgICAgLyogRmlsbCB1cCBmb3IgaGFsZiBhIGRvdWJsZS13aWRlIGNoYXJhY3Rlci4gKi8KKwkgICAgd2hpbGUgKCsrd2lkdGggPCBtYXh3aWR0aCkKKwkgICAgeworCQlzID0gcyArIFNUUkxFTihzKTsKKwkJKnMrKyA9IGZpbGxjaGFyOworCQkqcyA9IE5VTDsKKwkgICAgfQorCisJICAgIC0tbjsJLyogY291bnQgdGhlICc8JyAqLworCSAgICBmb3IgKDsgbCA8IGl0ZW1jbnQ7IGwrKykKKwkgICAgeworCQlpZiAoaXRlbVtsXS5zdGFydCAtIG4gPj0gcykKKwkJICAgIGl0ZW1bbF0uc3RhcnQgLT0gbjsKKwkJZWxzZQorCQkgICAgaXRlbVtsXS5zdGFydCA9IHM7CisJICAgIH0KKwl9CisJd2lkdGggPSBtYXh3aWR0aDsKKyAgICB9CisgICAgZWxzZSBpZiAod2lkdGggPCBtYXh3aWR0aCAmJiBTVFJMRU4ob3V0KSArIG1heHdpZHRoIC0gd2lkdGggKyAxIDwgb3V0bGVuKQorICAgIHsKKwkvKiBBcHBseSBTVExfTUlERExFIGlmIGFueSAqLworCWZvciAobCA9IDA7IGwgPCBpdGVtY250OyBsKyspCisJICAgIGlmIChpdGVtW2xdLnR5cGUgPT0gTWlkZGxlKQorCQlicmVhazsKKwlpZiAobCA8IGl0ZW1jbnQpCisJeworCSAgICBwID0gaXRlbVtsXS5zdGFydCArIG1heHdpZHRoIC0gd2lkdGg7CisJICAgIG1jaF9tZW1tb3ZlKHAsIGl0ZW1bbF0uc3RhcnQsIFNUUkxFTihpdGVtW2xdLnN0YXJ0KSArIDEpOworCSAgICBmb3IgKHMgPSBpdGVtW2xdLnN0YXJ0OyBzIDwgcDsgcysrKQorCQkqcyA9IGZpbGxjaGFyOworCSAgICBmb3IgKGwrKzsgbCA8IGl0ZW1jbnQ7IGwrKykKKwkJaXRlbVtsXS5zdGFydCArPSBtYXh3aWR0aCAtIHdpZHRoOworCSAgICB3aWR0aCA9IG1heHdpZHRoOworCX0KKyAgICB9CisKKyAgICBpZiAoaGwgIT0gTlVMTCkKKyAgICB7CisJZm9yIChsID0gMDsgbCA8IGl0ZW1jbnQ7IGwrKykKKwl7CisJICAgIGlmIChpdGVtW2xdLnR5cGUgPT0gSGlnaGxpZ2h0KQorCSAgICB7CisJCWhsLT5zdGFydCA9IGl0ZW1bbF0uc3RhcnQ7CisJCWhsLT51c2VyaGwgPSBpdGVtW2xdLm1pbndpZDsKKwkJaGwrKzsKKwkgICAgfQorCX0KKwlobC0+c3RhcnQgPSBOVUxMOworCWhsLT51c2VyaGwgPSAwOworICAgIH0KKworICAgIHJldHVybiB3aWR0aDsKK30KKyNlbmRpZiAvKiBGRUFUX1NUTF9PUFQgKi8KKworI2lmIGRlZmluZWQoRkVBVF9TVExfT1BUKSB8fCBkZWZpbmVkKEZFQVRfQ01ETF9JTkZPKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdldCByZWxhdGl2ZSBjdXJzb3IgcG9zaXRpb24gaW4gd2luZG93LCBpbiB0aGUgZm9ybSA5OSUsIHVzaW5nICJUb3AiLCAiQm90IgorICogb3IgIkFsbCIgd2hlbiBhcHByb3ByaWF0ZS4KKyAqLworICAgIHZvaWQKK2dldF9yZWxfcG9zKHdwLCBzdHIpCisgICAgd2luX1QJKndwOworICAgIGNoYXJfdQkqc3RyOworeworICAgIGxvbmcJYWJvdmU7IC8qIG51bWJlciBvZiBsaW5lcyBhYm92ZSB3aW5kb3cgKi8KKyAgICBsb25nCWJlbG93OyAvKiBudW1iZXIgb2YgbGluZXMgYmVsb3cgd2luZG93ICovCisKKyAgICBhYm92ZSA9IHdwLT53X3RvcGxpbmUgLSAxOworI2lmZGVmIEZFQVRfRElGRgorICAgIGFib3ZlICs9IGRpZmZfY2hlY2tfZmlsbCh3cCwgd3AtPndfdG9wbGluZSkgLSB3cC0+d190b3BmaWxsOworI2VuZGlmCisgICAgYmVsb3cgPSB3cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCAtIHdwLT53X2JvdGxpbmUgKyAxOworICAgIGlmIChiZWxvdyA8PSAwKQorCVNUUkNQWShzdHIsIGFib3ZlID09IDAgPyBfKCJBbGwiKSA6IF8oIkJvdCIpKTsKKyAgICBlbHNlIGlmIChhYm92ZSA8PSAwKQorCVNUUkNQWShzdHIsIF8oIlRvcCIpKTsKKyAgICBlbHNlCisJc3ByaW50ZigoY2hhciAqKXN0ciwgIiUyZCUlIiwgYWJvdmUgPiAxMDAwMDAwTAorCQkJCSAgICA/IChpbnQpKGFib3ZlIC8gKChhYm92ZSArIGJlbG93KSAvIDEwMEwpKQorCQkJCSAgICA6IChpbnQpKGFib3ZlICogMTAwTCAvIChhYm92ZSArIGJlbG93KSkpOworfQorI2VuZGlmCisKKy8qCisgKiBBcHBlbmQgKGZpbGUgMiBvZiA4KSB0byAnYnVmJywgaWYgZWRpdGluZyBtb3JlIHRoYW4gb25lIGZpbGUuCisgKiBSZXR1cm4gVFJVRSBpZiBpdCB3YXMgYXBwZW5kZWQuCisgKi8KKyAgICBpbnQKK2FwcGVuZF9hcmdfbnVtYmVyKHdwLCBidWYsIGFkZF9maWxlLCBtYXhsZW4pCisgICAgd2luX1QJKndwOworICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJYWRkX2ZpbGU7CS8qIEFkZCAiZmlsZSIgYmVmb3JlIHRoZSBhcmcgbnVtYmVyICovCisgICAgaW50CQltYXhsZW47CQkvKiBtYXhpbXVtIG5yIG9mIGNoYXJzIGluIGJ1ZiBvciB6ZXJvKi8KK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoQVJHQ09VTlQgPD0gMSkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICBwID0gYnVmICsgU1RSTEVOKGJ1Zik7CQkvKiBnbyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICBpZiAobWF4bGVuICYmIHAgLSBidWYgKyAzNSA+PSBtYXhsZW4pIC8qIGdldHRpbmcgdG9vIGxvbmcgKi8KKwlyZXR1cm4gRkFMU0U7CisgICAgKnArKyA9ICcgJzsKKyAgICAqcCsrID0gJygnOworICAgIGlmIChhZGRfZmlsZSkKKyAgICB7CisJU1RSQ1BZKHAsICJmaWxlICIpOworCXAgKz0gNTsKKyAgICB9CisgICAgc3ByaW50ZigoY2hhciAqKXAsIHdwLT53X2FyZ19pZHhfaW52YWxpZCA/ICIoJWQpIG9mICVkKSIKKwkJCQkgIDogIiVkIG9mICVkKSIsIHdwLT53X2FyZ19pZHggKyAxLCBBUkdDT1VOVCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBJZiBmbmFtZSBpcyBub3QgYSBmdWxsIHBhdGgsIG1ha2UgaXQgYSBmdWxsIHBhdGguCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSAoTlVMTCBmb3IgZmFpbHVyZSkuCisgKi8KKyAgICBjaGFyX3UgICoKK2ZpeF9mbmFtZShmbmFtZSkKKyAgICBjaGFyX3UgICpmbmFtZTsKK3sKKyAgICAvKgorICAgICAqIEZvcmNlIGV4cGFuZGluZyB0aGUgcGF0aCBhbHdheXMgZm9yIFVuaXgsIGJlY2F1c2Ugc3ltYm9saWMgbGlua3MgbWF5CisgICAgICogbWVzcyB1cCB0aGUgZnVsbCBwYXRoIG5hbWUsIGV2ZW4gdGhvdWdoIGl0IHN0YXJ0cyB3aXRoIGEgJy8nLgorICAgICAqIEFsc28gZXhwYW5kIHdoZW4gdGhlcmUgaXMgIi4uIiBpbiB0aGUgZmlsZSBuYW1lLCB0cnkgdG8gcmVtb3ZlIGl0LAorICAgICAqIGJlY2F1c2UgImM6L3NyYy8uLi9SRUFETUUiIGlzIGVxdWFsIHRvICJjOi9SRUFETUUiLgorICAgICAqIEZvciBNUy1XaW5kb3dzIGFsc28gZXhwYW5kIG5hbWVzIGxpa2UgImxvbmduYX4xIiB0byAibG9uZ25hbWUiLgorICAgICAqLworI2lmZGVmIFVOSVgKKyAgICByZXR1cm4gRnVsbE5hbWVfc2F2ZShmbmFtZSwgVFJVRSk7CisjZWxzZQorICAgIGlmICghdmltX2lzQWJzTmFtZShmbmFtZSkgfHwgc3Ryc3RyKChjaGFyICopZm5hbWUsICIuLiIpICE9IE5VTEwKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKERKR1BQKQorCSAgICB8fCB2aW1fc3RyY2hyKGZuYW1lLCAnficpICE9IE5VTEwKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIEZ1bGxOYW1lX3NhdmUoZm5hbWUsIEZBTFNFKTsKKworICAgIGZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpOworCisjaWZkZWYgVVNFX0ZOQU1FX0NBU0UKKyMgaWZkZWYgVVNFX0xPTkdfRk5BTUUKKyAgICBpZiAoVVNFX0xPTkdfRk5BTUUpCisjIGVuZGlmCisgICAgeworCWlmIChmbmFtZSAhPSBOVUxMKQorCSAgICBmbmFtZV9jYXNlKGZuYW1lLCAwKTsJLyogc2V0IGNvcnJlY3QgY2FzZSBmb3IgZmlsZSBuYW1lICovCisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gZm5hbWU7CisjZW5kaWYKK30KKworLyoKKyAqIE1ha2UgImZmbmFtZSIgYSBmdWxsIGZpbGUgbmFtZSwgc2V0ICJzZm5hbWUiIHRvICJmZm5hbWUiIGlmIG5vdCBOVUxMLgorICogImZmbmFtZSIgYmVjb21lcyBhIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSAob3IgTlVMTCkuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2ZuYW1lX2V4cGFuZChidWYsIGZmbmFtZSwgc2ZuYW1lKQorICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSoqZmZuYW1lOworICAgIGNoYXJfdQkqKnNmbmFtZTsKK3sKKyAgICBpZiAoKmZmbmFtZSA9PSBOVUxMKQkvKiBpZiBubyBmaWxlIG5hbWUgZ2l2ZW4sIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisgICAgaWYgKCpzZm5hbWUgPT0gTlVMTCkJLyogaWYgbm8gc2hvcnQgZmlsZSBuYW1lIGdpdmVuLCB1c2UgZmZuYW1lICovCisJKnNmbmFtZSA9ICpmZm5hbWU7CisgICAgKmZmbmFtZSA9IGZpeF9mbmFtZSgqZmZuYW1lKTsgICAvKiBleHBhbmQgdG8gZnVsbCBwYXRoICovCisKKyNpZmRlZiBGRUFUX1NIT1JUQ1VUCisgICAgaWYgKCFidWYtPmJfcF9iaW4pCisgICAgeworCWNoYXJfdSAgKnJmbmFtZSA9IE5VTEw7CisKKwkvKiBJZiB0aGUgZmlsZSBuYW1lIGlzIGEgc2hvcnRjdXQgZmlsZSwgdXNlIHRoZSBmaWxlIGl0IGxpbmtzIHRvLiAqLworCXJmbmFtZSA9IG1jaF9yZXNvbHZlX3Nob3J0Y3V0KCpmZm5hbWUpOworCWlmIChyZm5hbWUpCisJeworCSAgICB2aW1fZnJlZSgqZmZuYW1lKTsKKwkgICAgKmZmbmFtZSA9IHJmbmFtZTsKKwkgICAgKnNmbmFtZSA9IHJmbmFtZTsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBHZXQgdGhlIGZpbGUgbmFtZSBmb3IgYW4gYXJndW1lbnQgbGlzdCBlbnRyeS4KKyAqLworICAgIGNoYXJfdSAqCithbGlzdF9uYW1lKGFlcCkKKyAgICBhZW50cnlfVAkqYWVwOworeworICAgIGJ1Zl9UCSpicDsKKworICAgIC8qIFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBpZiBpdCBleGlzdHMuICovCisgICAgYnAgPSBidWZsaXN0X2ZpbmRucihhZXAtPmFlX2ZudW0pOworICAgIGlmIChicCA9PSBOVUxMKQorCXJldHVybiBhZXAtPmFlX2ZuYW1lOworICAgIHJldHVybiBicC0+Yl9mbmFtZTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIGRvX2FyZ19hbGwoKTogT3BlbiB1cCB0byAnY291bnQnIHdpbmRvd3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudC4KKyAqLworICAgIHZvaWQKK2RvX2FyZ19hbGwoY291bnQsIGZvcmNlaXQpCisgICAgaW50CWNvdW50OworICAgIGludAlmb3JjZWl0OwkJLyogaGlkZSBidWZmZXJzIGluIGN1cnJlbnQgd2luZG93cyAqLworeworICAgIGludAkJaTsKKyAgICB3aW5fVAkqd3AsICp3cG5leHQ7CisgICAgY2hhcl91CSpvcGVuZWQ7CS8qIGFycmF5IG9mIGZsYWdzIGZvciB3aGljaCBhcmdzIGFyZSBvcGVuICovCisgICAgaW50CQlvcGVuZWRfbGVuOwkvKiBsZW5naHQgb2Ygb3BlbmVkW10gKi8KKyAgICBpbnQJCXVzZV9maXJzdHdpbiA9IEZBTFNFOwkvKiB1c2UgZmlyc3Qgd2luZG93IGZvciBhcmdsaXN0ICovCisgICAgaW50CQlzcGxpdF9yZXQgPSBPSzsKKyAgICBpbnQJCXBfZWFfc2F2ZTsKKyAgICBhbGlzdF9UCSphbGlzdDsJCS8qIGFyZ3VtZW50IGxpc3QgdG8gYmUgdXNlZCAqLworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBpZiAoQVJHQ09VTlQgPD0gMCkKKyAgICB7CisJLyogRG9uJ3QgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLiAgV2UgZG9uJ3Qgd2FudCBpdCB3aGVuIHRoZSAiOmFsbCIKKwkgKiBjb21tYW5kIGlzIGluIHRoZSAudmltcmMuICovCisJcmV0dXJuOworICAgIH0KKyAgICBzZXRwY21hcmsoKTsKKworICAgIG9wZW5lZF9sZW4gPSBBUkdDT1VOVDsKKyAgICBvcGVuZWQgPSBhbGxvY19jbGVhcigodW5zaWduZWQpb3BlbmVkX2xlbik7CisgICAgaWYgKG9wZW5lZCA9PSBOVUxMKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBUcnkgY2xvc2luZyBhbGwgd2luZG93cyB0aGF0IGFyZSBub3QgaW4gdGhlIGFyZ3VtZW50IGxpc3QuCisgICAgICogQWxzbyBjbG9zZSB3aW5kb3dzIHRoYXQgYXJlIG5vdCBmdWxsIHdpZHRoOworICAgICAqIFdoZW4gJ2hpZGRlbicgb3IgImZvcmNlaXQiIHNldCB0aGUgYnVmZmVyIGJlY29tZXMgaGlkZGVuLgorICAgICAqIFdpbmRvd3MgdGhhdCBoYXZlIGEgY2hhbmdlZCBidWZmZXIgYW5kIGNhbid0IGJlIGhpZGRlbiB3b24ndCBiZSBjbG9zZWQuCisgICAgICovCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwbmV4dCkKKyAgICB7CisJd3BuZXh0ID0gd3AtPndfbmV4dDsKKwlidWYgPSB3cC0+d19idWZmZXI7CisJaWYgKGJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTAorCQl8fCBidWYtPmJfbndpbmRvd3MgPiAxCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJfHwgd3AtPndfd2lkdGggIT0gQ29sdW1ucworI2VuZGlmCisJCSkKKwkgICAgaSA9IEFSR0NPVU5UOworCWVsc2UKKwl7CisJICAgIC8qIGNoZWNrIGlmIHRoZSBidWZmZXIgaW4gdGhpcyB3aW5kb3cgaXMgaW4gdGhlIGFyZ2xpc3QgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IEFSR0NPVU5UOyArK2kpCisJICAgIHsKKwkJaWYgKEFSR0xJU1RbaV0uYWVfZm51bSA9PSBidWYtPmJfZm51bQorCQkJfHwgZnVsbHBhdGhjbXAoYWxpc3RfbmFtZSgmQVJHTElTVFtpXSksCisJCQkJCSAgICAgIGJ1Zi0+Yl9mZm5hbWUsIFRSVUUpICYgRlBDX1NBTUUpCisJCXsKKwkJICAgIGlmIChpIDwgb3BlbmVkX2xlbikKKwkJCW9wZW5lZFtpXSA9IFRSVUU7CisJCSAgICBpZiAod3AtPndfYWxpc3QgIT0gY3Vyd2luLT53X2FsaXN0KQorCQkgICAgeworCQkJLyogVXNlIHRoZSBjdXJyZW50IGFyZ3VtZW50IGxpc3QgZm9yIGFsbCB3aW5kb3dzCisJCQkgKiBjb250YWluaW5nIGEgZmlsZSBmcm9tIGl0LiAqLworCQkJYWxpc3RfdW5saW5rKHdwLT53X2FsaXN0KTsKKwkJCXdwLT53X2FsaXN0ID0gY3Vyd2luLT53X2FsaXN0OworCQkJKyt3cC0+d19hbGlzdC0+YWxfcmVmY291bnQ7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCXdwLT53X2FyZ19pZHggPSBpOworCisJaWYgKGkgPT0gQVJHQ09VTlQpCQkvKiBjbG9zZSB0aGlzIHdpbmRvdyAqLworCXsKKwkgICAgaWYgKFBfSElEKGJ1ZikgfHwgZm9yY2VpdCB8fCBidWYtPmJfbndpbmRvd3MgPiAxCisJCQkJCQkJfHwgIWJ1ZklzQ2hhbmdlZChidWYpKQorCSAgICB7CisJCS8qIElmIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQsIGFuZCB3ZSB3b3VsZCBsaWtlIHRvIGhpZGUgaXQsCisJCSAqIHRyeSBhdXRvd3JpdGluZy4gKi8KKwkJaWYgKCFQX0hJRChidWYpICYmIGJ1Zi0+Yl9ud2luZG93cyA8PSAxICYmIGJ1ZklzQ2hhbmdlZChidWYpKQorCQl7CisJCSAgICAodm9pZClhdXRvd3JpdGUoYnVmLCBGQUxTRSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJCSAgICAvKiBjaGVjayBpZiBhdXRvY29tbWFuZHMgcmVtb3ZlZCB0aGUgd2luZG93ICovCisJCSAgICBpZiAoIXdpbl92YWxpZCh3cCkgfHwgIWJ1Zl92YWxpZChidWYpKQorCQkgICAgeworCQkJd3BuZXh0ID0gZmlyc3R3aW47CS8qIHN0YXJ0IGFsbCBvdmVyLi4uICovCisJCQljb250aW51ZTsKKwkJICAgIH0KKyNlbmRpZgorCQl9CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCWlmIChmaXJzdHdpbiA9PSBsYXN0d2luKQkvKiBjYW4ndCBjbG9zZSBsYXN0IHdpbmRvdyAqLworI2VuZGlmCisJCSAgICB1c2VfZmlyc3R3aW4gPSBUUlVFOworI2lmZGVmIEZFQVRfV0lORE9XUworCQllbHNlCisJCXsKKwkJICAgIHdpbl9jbG9zZSh3cCwgIVBfSElEKGJ1ZikgJiYgIWJ1ZklzQ2hhbmdlZChidWYpKTsKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisJCSAgICAvKiBjaGVjayBpZiBhdXRvY29tbWFuZHMgcmVtb3ZlZCB0aGUgbmV4dCB3aW5kb3cgKi8KKwkJICAgIGlmICghd2luX3ZhbGlkKHdwbmV4dCkpCisJCQl3cG5leHQgPSBmaXJzdHdpbjsJLyogc3RhcnQgYWxsIG92ZXIuLi4gKi8KKyMgZW5kaWYKKwkJfQorI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBPcGVuIGEgd2luZG93IGZvciBmaWxlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCB0aGF0IGRvbid0IGhhdmUgb25lLgorICAgICAqIEFSR0NPVU5UIG1heSBjaGFuZ2Ugd2hpbGUgZG9pbmcgdGhpcywgYmVjYXVzZSBvZiBhdXRvY29tbWFuZHMuCisgICAgICovCisgICAgaWYgKGNvdW50ID4gQVJHQ09VTlQgfHwgY291bnQgPD0gMCkKKwljb3VudCA9IEFSR0NPVU5UOworCisgICAgLyogQXV0b2NvbW1hbmRzIG1heSBkbyBhbnl0aGluZyB0byB0aGUgYXJndW1lbnQgbGlzdC4gIE1ha2Ugc3VyZSBpdCdzIG5vdAorICAgICAqIGZyZWVkIHdoaWxlIHdlIGFyZSB3b3JraW5nIGhlcmUgYnkgImxvY2tpbmciIGl0LiAgV2Ugc3RpbGwgaGF2ZSB0bworICAgICAqIHdhdGNoIG91dCBmb3IgaXRzIHNpemUgdG8gYmUgY2hhbmdlZC4gKi8KKyAgICBhbGlzdCA9IGN1cndpbi0+d19hbGlzdDsKKyAgICArK2FsaXN0LT5hbF9yZWZjb3VudDsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIERvbid0IGV4ZWN1dGUgV2luL0J1ZiBFbnRlci9MZWF2ZSBhdXRvY29tbWFuZHMgaGVyZS4gKi8KKyAgICArK2F1dG9jbWRfbm9fZW50ZXI7CisgICAgKythdXRvY21kX25vX2xlYXZlOworI2VuZGlmCisgICAgd2luX2VudGVyKGxhc3R3aW4sIEZBTFNFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgaSA8IGFsaXN0LT5hbF9nYS5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraSkKKyAgICB7CisJaWYgKGFsaXN0ID09ICZnbG9iYWxfYWxpc3QgJiYgaSA9PSBnbG9iYWxfYWxpc3QuYWxfZ2EuZ2FfbGVuIC0gMSkKKwkgICAgYXJnX2hhZF9sYXN0ID0gVFJVRTsKKwlpZiAoaSA8IG9wZW5lZF9sZW4gJiYgb3BlbmVkW2ldKQorCXsKKwkgICAgLyogTW92ZSB0aGUgYWxyZWFkeSBwcmVzZW50IHdpbmRvdyB0byBiZWxvdyB0aGUgY3VycmVudCB3aW5kb3cgKi8KKwkgICAgaWYgKGN1cndpbi0+d19hcmdfaWR4ICE9IGkpCisJICAgIHsKKwkJZm9yICh3cG5leHQgPSBmaXJzdHdpbjsgd3BuZXh0ICE9IE5VTEw7IHdwbmV4dCA9IHdwbmV4dC0+d19uZXh0KQorCQl7CisJCSAgICBpZiAod3BuZXh0LT53X2FyZ19pZHggPT0gaSkKKwkJICAgIHsKKwkJCXdpbl9tb3ZlX2FmdGVyKHdwbmV4dCwgY3Vyd2luKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJZWxzZSBpZiAoc3BsaXRfcmV0ID09IE9LKQorCXsKKwkgICAgaWYgKCF1c2VfZmlyc3R3aW4pCQkvKiBzcGxpdCBjdXJyZW50IHdpbmRvdyAqLworCSAgICB7CisJCXBfZWFfc2F2ZSA9IHBfZWE7CisJCXBfZWEgPSBUUlVFOwkJLyogdXNlIHNwYWNlIGZyb20gYWxsIHdpbmRvd3MgKi8KKwkJc3BsaXRfcmV0ID0gd2luX3NwbGl0KDAsIFdTUF9ST09NIHwgV1NQX0JFTE9XKTsKKwkJcF9lYSA9IHBfZWFfc2F2ZTsKKwkJaWYgKHNwbGl0X3JldCA9PSBGQUlMKQorCQkgICAgY29udGludWU7CisJICAgIH0KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgZWxzZSAgICAvKiBmaXJzdCB3aW5kb3c6IGRvIGF1dG9jbWQgZm9yIGxlYXZpbmcgdGhpcyBidWZmZXIgKi8KKwkJLS1hdXRvY21kX25vX2xlYXZlOworI2VuZGlmCisKKwkgICAgLyoKKwkgICAgICogZWRpdCBmaWxlIGkKKwkgICAgICovCisJICAgIGN1cndpbi0+d19hcmdfaWR4ID0gaTsKKwkgICAgKHZvaWQpZG9fZWNtZCgwLCBhbGlzdF9uYW1lKCZBQVJHTElTVChhbGlzdClbaV0pLCBOVUxMLCBOVUxMLAorCQkgICAgICBFQ01EX09ORSwKKwkJICAgICAgKChQX0hJRChjdXJ3aW4tPndfYnVmZmVyKQorCQkJICAgfHwgYnVmSXNDaGFuZ2VkKGN1cndpbi0+d19idWZmZXIpKSA/IEVDTURfSElERSA6IDApCisJCQkJCQkJICAgICAgICsgRUNNRF9PTERCVUYpOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpZiAodXNlX2ZpcnN0d2luKQorCQkrK2F1dG9jbWRfbm9fbGVhdmU7CisjZW5kaWYKKwkgICAgdXNlX2ZpcnN0d2luID0gRkFMU0U7CisJfQorCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9CisKKyAgICAvKiBSZW1vdmUgdGhlICJsb2NrIiBvbiB0aGUgYXJndW1lbnQgbGlzdC4gKi8KKyAgICBhbGlzdF91bmxpbmsoYWxpc3QpOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLS1hdXRvY21kX25vX2VudGVyOworI2VuZGlmCisgICAgd2luX2VudGVyKGZpcnN0d2luLCBGQUxTRSk7CQkJLyogYmFjayB0byBmaXJzdCB3aW5kb3cgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAtLWF1dG9jbWRfbm9fbGVhdmU7CisjZW5kaWYKKyAgICB2aW1fZnJlZShvcGVuZWQpOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9MSVNUQ01EUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBPcGVuIGEgd2luZG93IGZvciBhIG51bWJlciBvZiBidWZmZXJzLgorICovCisgICAgdm9pZAorZXhfYnVmZmVyX2FsbChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGJ1Zl9UCSpidWY7CisgICAgd2luX1QJKndwLCAqd3BuZXh0OworICAgIGludAkJc3BsaXRfcmV0ID0gT0s7CisgICAgaW50CQlwX2VhX3NhdmU7CisgICAgaW50CQlvcGVuX3dpbnMgPSAwOworICAgIGludAkJcjsKKyAgICBpbnQJCWNvdW50OwkJLyogTWF4aW11bSBudW1iZXIgb2Ygd2luZG93cyB0byBvcGVuLiAqLworICAgIGludAkJYWxsOwkJLyogV2hlbiBUUlVFIGFsc28gbG9hZCBpbmFjdGl2ZSBidWZmZXJzLiAqLworCisgICAgaWYgKGVhcC0+YWRkcl9jb3VudCA9PSAwKQkvKiBtYWtlIGFzIG1hbnkgd2luZG93cyBhcyBwb3NzaWJsZSAqLworCWNvdW50ID0gOTk5OTsKKyAgICBlbHNlCisJY291bnQgPSBlYXAtPmxpbmUyOwkvKiBtYWtlIGFzIG1hbnkgd2luZG93cyBhcyBzcGVjaWZpZWQgKi8KKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3VuaGlkZSB8fCBlYXAtPmNtZGlkeCA9PSBDTURfc3VuaGlkZSkKKwlhbGwgPSBGQUxTRTsKKyAgICBlbHNlCisJYWxsID0gVFJVRTsKKworICAgIHNldHBjbWFyaygpOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENsb3NlIHN1cGVyZmx1b3VzIHdpbmRvd3MgKHR3byB3aW5kb3dzIGZvciB0aGUgc2FtZSBidWZmZXIpLgorICAgICAqIEFsc28gY2xvc2Ugd2luZG93cyB0aGF0IGFyZSBub3QgZnVsbC13aWR0aC4KKyAgICAgKi8KKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3BuZXh0KQorICAgIHsKKwl3cG5leHQgPSB3cC0+d19uZXh0OworCWlmICh3cC0+d19idWZmZXItPmJfbndpbmRvd3MgPiAxCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJfHwgKChjbWRtb2Quc3BsaXQgJiBXU1BfVkVSVCkKKwkJCSAgPyB3cC0+d19oZWlnaHQgKyB3cC0+d19zdGF0dXNfaGVpZ2h0IDwgUm93cyAtIHBfY2gKKwkJCSAgOiB3cC0+d193aWR0aCAhPSBDb2x1bW5zKQorI2VuZGlmCisJCSkKKwl7CisJICAgIHdpbl9jbG9zZSh3cCwgRkFMU0UpOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICB3cG5leHQgPSBmaXJzdHdpbjsJLyoganVzdCBpbiBjYXNlIGFuIGF1dG9jb21tYW5kIGRvZXMgc29tZXRoaW5nCisJCQkJICAgc3RyYW5nZSB3aXRoIHdpbmRvd3MgKi8KKwkgICAgb3Blbl93aW5zID0gMDsKKyNlbmRpZgorCX0KKwllbHNlCisJICAgICsrb3Blbl93aW5zOworICAgIH0KKworICAgIC8qCisgICAgICogR28gdGhyb3VnaCB0aGUgYnVmZmVyIGxpc3QuICBXaGVuIGEgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBhIHdpbmRvdyB5ZXQsCisgICAgICogb3BlbiBvbmUuICBPdGhlcndpc2UgbW92ZSB0aGUgd2luZG93IHRvIHRoZSByaWdodCBwb3NpdGlvbi4KKyAgICAgKiBXYXRjaCBvdXQgZm9yIGF1dG9jb21tYW5kcyB0aGF0IGRlbGV0ZSBidWZmZXJzIG9yIHdpbmRvd3MhCisgICAgICovCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogRG9uJ3QgZXhlY3V0ZSBXaW4vQnVmIEVudGVyL0xlYXZlIGF1dG9jb21tYW5kcyBoZXJlLiAqLworICAgICsrYXV0b2NtZF9ub19lbnRlcjsKKyNlbmRpZgorICAgIHdpbl9lbnRlcihsYXN0d2luLCBGQUxTRSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgKythdXRvY21kX25vX2xlYXZlOworI2VuZGlmCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEwgJiYgb3Blbl93aW5zIDwgY291bnQ7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwkvKiBDaGVjayBpZiB0aGlzIGJ1ZmZlciBuZWVkcyBhIHdpbmRvdyAqLworCWlmICgoIWFsbCAmJiBidWYtPmJfbWwubWxfbWZwID09IE5VTEwpIHx8ICFidWYtPmJfcF9ibCkKKwkgICAgY29udGludWU7CisKKwkvKiBDaGVjayBpZiB0aGlzIGJ1ZmZlciBhbHJlYWR5IGhhcyBhIHdpbmRvdyAqLworCWZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCSAgICBpZiAod3AtPndfYnVmZmVyID09IGJ1ZikKKwkJYnJlYWs7CisJLyogSWYgdGhlIGJ1ZmZlciBhbHJlYWR5IGhhcyBhIHdpbmRvdywgbW92ZSBpdCAqLworCWlmICh3cCAhPSBOVUxMKQorCSAgICB3aW5fbW92ZV9hZnRlcih3cCwgY3Vyd2luKTsKKwllbHNlIGlmIChzcGxpdF9yZXQgPT0gT0spCisJeworCSAgICAvKiBTcGxpdCB0aGUgd2luZG93IGFuZCBwdXQgdGhlIGJ1ZmZlciBpbiBpdCAqLworCSAgICBwX2VhX3NhdmUgPSBwX2VhOworCSAgICBwX2VhID0gVFJVRTsJCS8qIHVzZSBzcGFjZSBmcm9tIGFsbCB3aW5kb3dzICovCisJICAgIHNwbGl0X3JldCA9IHdpbl9zcGxpdCgwLCBXU1BfUk9PTSB8IFdTUF9CRUxPVyk7CisJICAgICsrb3Blbl93aW5zOworCSAgICBwX2VhID0gcF9lYV9zYXZlOworCSAgICBpZiAoc3BsaXRfcmV0ID09IEZBSUwpCisJCWNvbnRpbnVlOworCisJICAgIC8qIE9wZW4gdGhlIGJ1ZmZlciBpbiB0aGlzIHdpbmRvdy4gKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJICAgIHN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9ESUFMT0c7CisjZW5kaWYKKwkgICAgc2V0X2N1cmJ1ZihidWYsIERPQlVGX0dPVE8pOworI2lmZGVmIEZFQVRfQVVUT0NNRAorIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgLyogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgdGhlIGJ1ZmZlciBvciBhYm9ydGVkIHNjcmlwdAorCSAgICAgKiBwcm9jZXNzaW5nISEhICovCisJICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikgfHwgYWJvcnRpbmcoKSkKKyMgZWxzZQorCSAgICBpZiAoIWJ1Zl92YWxpZChidWYpKQkvKiBhdXRvY29tbWFuZHMgZGVsZXRlZCB0aGUgYnVmZmVyISEhICovCisjIGVuZGlmCisJICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJCXN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9OT05FOworI2VuZGlmCisJCWJyZWFrOworCSAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJICAgIGlmIChzd2FwX2V4aXN0c19hY3Rpb24gPT0gU0VBX1FVSVQpCisJICAgIHsKKwkJLyogVXNlciBzZWxlY3RlZCBRdWl0IGF0IEFUVEVOVElPTiBwcm9tcHQ7IGNsb3NlIHRoaXMgd2luZG93LiAqLworCQl3aW5fY2xvc2UoY3Vyd2luLCBUUlVFKTsKKwkJLS1vcGVuX3dpbnM7CisJCXN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9OT05FOworCSAgICB9CisJICAgIGVsc2UKKwkJaGFuZGxlX3N3YXBfZXhpc3RzKE5VTEwpOworI2VuZGlmCisJfQorCisJdWlfYnJlYWtjaGVjaygpOworCWlmIChnb3RfaW50KQorCXsKKwkgICAgKHZvaWQpdmdldGMoKTsJLyogb25seSBicmVhayB0aGUgZmlsZSBsb2FkaW5nLCBub3QgdGhlIHJlc3QgKi8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAtLWF1dG9jbWRfbm9fZW50ZXI7CisjZW5kaWYKKyAgICB3aW5fZW50ZXIoZmlyc3R3aW4sIEZBTFNFKTsJCS8qIGJhY2sgdG8gZmlyc3Qgd2luZG93ICovCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLS1hdXRvY21kX25vX2xlYXZlOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENsb3NlIHN1cGVyZmx1b3VzIHdpbmRvd3MuCisgICAgICovCisgICAgZm9yICh3cCA9IGxhc3R3aW47IG9wZW5fd2lucyA+IGNvdW50OyApCisgICAgeworCXIgPSAoUF9ISUQod3AtPndfYnVmZmVyKSB8fCAhYnVmSXNDaGFuZ2VkKHdwLT53X2J1ZmZlcikKKwkJCQkgICAgIHx8IGF1dG93cml0ZSh3cC0+d19idWZmZXIsIEZBTFNFKSA9PSBPSyk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJaWYgKCF3aW5fdmFsaWQod3ApKQorCXsKKwkgICAgLyogQnVmV3JpdGUgQXV0b2NvbW1hbmRzIG1hZGUgdGhlIHdpbmRvdyBpbnZhbGlkLCBzdGFydCBvdmVyICovCisJICAgIHdwID0gbGFzdHdpbjsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGlmIChyKQorCXsKKwkgICAgd2luX2Nsb3NlKHdwLCAhUF9ISUQod3AtPndfYnVmZmVyKSk7CisJICAgIC0tb3Blbl93aW5zOworCSAgICB3cCA9IGxhc3R3aW47CisJfQorCWVsc2UKKwl7CisJICAgIHdwID0gd3AtPndfcHJldjsKKwkgICAgaWYgKHdwID09IE5VTEwpCisJCWJyZWFrOworCX0KKyAgICB9Cit9CisjIGVuZGlmIC8qIEZFQVRfTElTVENNRFMgKi8KKworI2VuZGlmIC8qIEZFQVRfV0lORE9XUyAqLworCisvKgorICogZG9fbW9kZWxpbmVzKCkgLSBwcm9jZXNzIG1vZGUgbGluZXMgZm9yIHRoZSBjdXJyZW50IGZpbGUKKyAqCisgKiBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSAibWwiIG9wdGlvbiBpc24ndCBzZXQuCisgKi8KK3N0YXRpYyBpbnQgIGNoa19tb2RlbGluZSBfX0FSR1MoKGxpbmVucl9UKSk7CisKKyAgICB2b2lkCitkb19tb2RlbGluZXMoKQoreworICAgIGxpbmVucl9UCSAgICBsbnVtOworICAgIGludAkJICAgIG5tbGluZXM7CisgICAgc3RhdGljIGludAkgICAgZW50ZXJlZCA9IDA7CisKKyAgICBpZiAoIWN1cmJ1Zi0+Yl9wX21sIHx8IChubWxpbmVzID0gKGludClwX21scykgPT0gMCkKKwlyZXR1cm47CisKKyAgICAvKiBEaXNhbGxvdyByZWN1cnNpdmUgZW50cnkgaGVyZS4gIENhbiBoYXBwZW4gd2hlbiBleGVjdXRpbmcgYSBtb2RlbGluZQorICAgICAqIHRyaWdnZXJzIGFuIGF1dG9jb21tYW5kLCB3aGljaCByZWxvYWRzIG1vZGVsaW5lcyB3aXRoIGEgIjpkbyIuICovCisgICAgaWYgKGVudGVyZWQpCisJcmV0dXJuOworCisgICAgKytlbnRlcmVkOworICAgIGZvciAobG51bSA9IDE7IGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgJiYgbG51bSA8PSBubWxpbmVzOworCQkJCQkJCQkgICAgICAgKytsbnVtKQorCWlmIChjaGtfbW9kZWxpbmUobG51bSkgPT0gRkFJTCkKKwkgICAgbm1saW5lcyA9IDA7CisKKyAgICBmb3IgKGxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsgbG51bSA+IDAgJiYgbG51bSA+IG5tbGluZXMKKwkJICAgICAgICYmIGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCAtIG5tbGluZXM7IC0tbG51bSkKKwlpZiAoY2hrX21vZGVsaW5lKGxudW0pID09IEZBSUwpCisJICAgIG5tbGluZXMgPSAwOworICAgIC0tZW50ZXJlZDsKK30KKworI2luY2x1ZGUgInZlcnNpb24uaCIJCS8qIGZvciB2ZXJzaW9uIG51bWJlciAqLworCisvKgorICogY2hrX21vZGVsaW5lKCkgLSBjaGVjayBhIHNpbmdsZSBsaW5lIGZvciBhIG1vZGUgc3RyaW5nCisgKiBSZXR1cm4gRkFJTCBpZiBhbiBlcnJvciBlbmNvdW50ZXJlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Noa19tb2RlbGluZShsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqZTsKKyAgICBjaGFyX3UJKmxpbmVjb3B5OwkJLyogbG9jYWwgY29weSBvZiBhbnkgbW9kZWxpbmUgZm91bmQgKi8KKyAgICBpbnQJCXByZXY7CisgICAgaW50CQl2ZXJzOworICAgIGludAkJZW5kOworICAgIGludAkJcmV0dmFsID0gT0s7CisgICAgY2hhcl91CSpzYXZlX3NvdXJjaW5nX25hbWU7CisgICAgbGluZW5yX1QJc2F2ZV9zb3VyY2luZ19sbnVtOworI2lmZGVmIEZFQVRfRVZBTAorICAgIHNjaWRfVAlzYXZlX1NJRDsKKyNlbmRpZgorCisgICAgcHJldiA9IC0xOworICAgIGZvciAocyA9IG1sX2dldChsbnVtKTsgKnMgIT0gTlVMOyArK3MpCisgICAgeworCWlmIChwcmV2ID09IC0xIHx8IHZpbV9pc3NwYWNlKHByZXYpKQorCXsKKwkgICAgaWYgKChwcmV2ICE9IC0xICYmIFNUUk5DTVAocywgImV4OiIsIChzaXplX3QpMykgPT0gMCkKKwkJICAgIHx8IFNUUk5DTVAocywgInZpOiIsIChzaXplX3QpMykgPT0gMCkKKwkJYnJlYWs7CisJICAgIGlmIChTVFJOQ01QKHMsICJ2aW0iLCAzKSA9PSAwKQorCSAgICB7CisJCWlmIChzWzNdID09ICc8JyB8fCBzWzNdID09ICc9JyB8fCBzWzNdID09ICc+JykKKwkJICAgIGUgPSBzICsgNDsKKwkJZWxzZQorCQkgICAgZSA9IHMgKyAzOworCQl2ZXJzID0gZ2V0ZGlnaXRzKCZlKTsKKwkJaWYgKCplID09ICc6JworCQkJJiYgKHNbM10gPT0gJzonCisJCQkgICAgfHwgKFZJTV9WRVJTSU9OXzEwMCA+PSB2ZXJzICYmIGlzZGlnaXQoc1szXSkpCisJCQkgICAgfHwgKFZJTV9WRVJTSU9OXzEwMCA8IHZlcnMgJiYgc1szXSA9PSAnPCcpCisJCQkgICAgfHwgKFZJTV9WRVJTSU9OXzEwMCA+IHZlcnMgJiYgc1szXSA9PSAnPicpCisJCQkgICAgfHwgKFZJTV9WRVJTSU9OXzEwMCA9PSB2ZXJzICYmIHNbM10gPT0gJz0nKSkpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKwlwcmV2ID0gKnM7CisgICAgfQorCisgICAgaWYgKCpzKQorICAgIHsKKwlkbwkJCQkvKiBza2lwIG92ZXIgImV4OiIsICJ2aToiIG9yICJ2aW06IiAqLworCSAgICArK3M7CisJd2hpbGUgKHNbLTFdICE9ICc6Jyk7CisKKwlzID0gbGluZWNvcHkgPSB2aW1fc3Ryc2F2ZShzKTsJLyogY29weSB0aGUgbGluZSwgaXQgd2lsbCBjaGFuZ2UgKi8KKwlpZiAobGluZWNvcHkgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlzYXZlX3NvdXJjaW5nX2xudW0gPSBzb3VyY2luZ19sbnVtOworCXNhdmVfc291cmNpbmdfbmFtZSA9IHNvdXJjaW5nX25hbWU7CisJc291cmNpbmdfbG51bSA9IGxudW07CQkvKiBwcmVwYXJlIGZvciBlbXNnKCkgKi8KKwlzb3VyY2luZ19uYW1lID0gKGNoYXJfdSAqKSJtb2RlbGluZXMiOworCisJZW5kID0gRkFMU0U7CisJd2hpbGUgKGVuZCA9PSBGQUxTRSkKKwl7CisJICAgIHMgPSBza2lwd2hpdGUocyk7CisJICAgIGlmICgqcyA9PSBOVUwpCisJCWJyZWFrOworCisJICAgIC8qCisJICAgICAqIEZpbmQgZW5kIG9mIHNldCBjb21tYW5kOiAnOicgb3IgZW5kIG9mIGxpbmUuCisJICAgICAqIFNraXAgb3ZlciAiXDoiLCByZXBsYWNpbmcgaXQgd2l0aCAiOiIuCisJICAgICAqLworCSAgICBmb3IgKGUgPSBzOyAqZSAhPSAnOicgJiYgKmUgIT0gTlVMOyArK2UpCisJCWlmIChlWzBdID09ICdcXCcgJiYgZVsxXSA9PSAnOicpCisJCSAgICBTVFJDUFkoZSwgZSArIDEpOworCSAgICBpZiAoKmUgPT0gTlVMKQorCQllbmQgPSBUUlVFOworCisJICAgIC8qCisJICAgICAqIElmIHRoZXJlIGlzIGEgInNldCIgY29tbWFuZCwgcmVxdWlyZSBhIHRlcm1pbmF0aW5nICc6JyBhbmQKKwkgICAgICogaWdub3JlIHRoZSBzdHVmZiBhZnRlciB0aGUgJzonLgorCSAgICAgKiAidmk6c2V0IG9wdCBvcHQgb3B0OiBmb28iIC0tIGZvbyBub3QgaW50ZXJwcmV0ZWQKKwkgICAgICogInZpOm9wdCBvcHQgb3B0OiBmb28iIC0tIGZvbyBpbnRlcnByZXRlZAorCSAgICAgKiBBY2NlcHQgInNlIiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEVsdmlzLgorCSAgICAgKi8KKwkgICAgaWYgKFNUUk5DTVAocywgInNldCAiLCAoc2l6ZV90KTQpID09IDAKKwkJICAgIHx8IFNUUk5DTVAocywgInNlICIsIChzaXplX3QpMykgPT0gMCkKKwkgICAgeworCQlpZiAoKmUgIT0gJzonKQkJLyogbm8gdGVybWluYXRpbmcgJzonPyAqLworCQkgICAgYnJlYWs7CisJCWVuZCA9IFRSVUU7CisJCXMgPSB2aW1fc3RyY2hyKHMsICcgJykgKyAxOworCSAgICB9CisJICAgICplID0gTlVMOwkJCS8qIHRydW5jYXRlIHRoZSBzZXQgY29tbWFuZCAqLworCisJICAgIGlmICgqcyAhPSBOVUwpCQkvKiBza2lwIG92ZXIgYW4gZW1wdHkgIjo6IiAqLworCSAgICB7CisjaWZkZWYgRkVBVF9FVkFMCisJCXNhdmVfU0lEID0gY3VycmVudF9TSUQ7CisJCWN1cnJlbnRfU0lEID0gU0lEX01PREVMSU5FOworI2VuZGlmCisJCXJldHZhbCA9IGRvX3NldChzLCBPUFRfTU9ERUxJTkUgfCBPUFRfTE9DQUwpOworI2lmZGVmIEZFQVRfRVZBTAorCQljdXJyZW50X1NJRCA9IHNhdmVfU0lEOworI2VuZGlmCisJCWlmIChyZXR2YWwgPT0gRkFJTCkJCS8qIHN0b3AgaWYgZXJyb3IgZm91bmQgKi8KKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIHMgPSBlICsgMTsJCQkvKiBhZHZhbmNlIHRvIG5leHQgcGFydCAqLworCX0KKworCXNvdXJjaW5nX2xudW0gPSBzYXZlX3NvdXJjaW5nX2xudW07CisJc291cmNpbmdfbmFtZSA9IHNhdmVfc291cmNpbmdfbmFtZTsKKworCXZpbV9mcmVlKGxpbmVjb3B5KTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIEZFQVRfVklNSU5GTworICAgIGludAorcmVhZF92aW1pbmZvX2J1ZmZlcmxpc3QodmlycCwgd3JpdGluZykKKyAgICB2aXJfVAkqdmlycDsKKyAgICBpbnQJCXdyaXRpbmc7Cit7CisgICAgY2hhcl91CSp0YWI7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBidWZfVAkqYnVmOworICAgIGNoYXJfdQkqc2ZuYW1lOworICAgIGNoYXJfdQkqeGxpbmU7CisKKyAgICAvKiBIYW5kbGUgbG9uZyBsaW5lIGFuZCBlc2NhcGVkIGNoYXJhY3RlcnMuICovCisgICAgeGxpbmUgPSB2aW1pbmZvX3JlYWRzdHJpbmcodmlycCwgMSwgRkFMU0UpOworCisgICAgLyogZG9uJ3QgcmVhZCBpbiBpZiB0aGVyZSBhcmUgZmlsZXMgb24gdGhlIGNvbW1hbmQtbGluZSBvciBpZiB3cml0aW5nOiAqLworICAgIGlmICh4bGluZSAhPSBOVUxMICYmICF3cml0aW5nICYmIEFSR0NPVU5UID09IDAKKwkJCQkgICAgICAgJiYgZmluZF92aW1pbmZvX3BhcmFtZXRlcignJScpICE9IE5VTEwpCisgICAgeworCS8qIEZvcm1hdCBpczogPGZuYW1lPiBUYWIgPGxudW0+IFRhYiA8Y29sPi4KKwkgKiBXYXRjaCBvdXQgZm9yIGEgVGFiIGluIHRoZSBmaWxlIG5hbWUsIHdvcmsgZnJvbSB0aGUgZW5kLiAqLworCWxudW0gPSAwOworCWNvbCA9IDA7CisJdGFiID0gdmltX3N0cnJjaHIoeGxpbmUsICdcdCcpOworCWlmICh0YWIgIT0gTlVMTCkKKwl7CisJICAgICp0YWIrKyA9ICdcMCc7CisJICAgIGNvbCA9IGF0b2koKGNoYXIgKil0YWIpOworCSAgICB0YWIgPSB2aW1fc3RycmNocih4bGluZSwgJ1x0Jyk7CisJICAgIGlmICh0YWIgIT0gTlVMTCkKKwkgICAgeworCQkqdGFiKysgPSAnXDAnOworCQlsbnVtID0gYXRvbCgoY2hhciAqKXRhYik7CisJICAgIH0KKwl9CisKKwkvKiBFeHBhbmQgIn4vIiBpbiB0aGUgZmlsZSBuYW1lIGF0ICJsaW5lICsgMSIgdG8gYSBmdWxsIHBhdGguCisJICogVGhlbiB0cnkgc2hvcnRlbmluZyBpdCBieSBjb21wYXJpbmcgd2l0aCB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKwlleHBhbmRfZW52KHhsaW5lLCBOYW1lQnVmZiwgTUFYUEFUSEwpOworCW1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKTsKKwlzZm5hbWUgPSBzaG9ydGVuX2ZuYW1lKE5hbWVCdWZmLCBJT2J1ZmYpOworCWlmIChzZm5hbWUgPT0gTlVMTCkKKwkgICAgc2ZuYW1lID0gTmFtZUJ1ZmY7CisKKwlidWYgPSBidWZsaXN0X25ldyhOYW1lQnVmZiwgc2ZuYW1lLCAobGluZW5yX1QpMCwgQkxOX0xJU1RFRCk7CisJaWYgKGJ1ZiAhPSBOVUxMKQkvKiBqdXN0IGluIGNhc2UuLi4gKi8KKwl7CisJICAgIGJ1Zi0+Yl9sYXN0X2N1cnNvci5sbnVtID0gbG51bTsKKwkgICAgYnVmLT5iX2xhc3RfY3Vyc29yLmNvbCA9IGNvbDsKKwkgICAgYnVmbGlzdF9zZXRmcG9zKGJ1ZiwgY3Vyd2luLCBsbnVtLCBjb2wsIEZBTFNFKTsKKwl9CisgICAgfQorICAgIHZpbV9mcmVlKHhsaW5lKTsKKworICAgIHJldHVybiB2aW1pbmZvX3JlYWRsaW5lKHZpcnApOworfQorCisgICAgdm9pZAord3JpdGVfdmltaW5mb19idWZmZXJsaXN0KGZwKQorICAgIEZJTEUgICAgKmZwOworeworICAgIGJ1Zl9UCSpidWY7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgd2luX1QJKndpbjsKKyNlbmRpZgorICAgIGNoYXJfdQkqbGluZTsKKworICAgIGlmIChmaW5kX3ZpbWluZm9fcGFyYW1ldGVyKCclJykgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZmlsZSBuYW1lLCBsbnVtIGFuZCBjb2wuICovCisgICAgbGluZSA9IGFsbG9jKE1BWFBBVEhMICsgMzApOworICAgIGlmIChsaW5lID09IE5VTEwpCisJcmV0dXJuOworCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgZm9yICh3aW4gPSBmaXJzdHdpbjsgd2luICE9IE5VTEw7IHdpbiA9IHdpbi0+d19uZXh0KQorCXNldF9sYXN0X2N1cnNvcih3aW4pOworI2Vsc2UKKyAgICBzZXRfbGFzdF9jdXJzb3IoY3Vyd2luKTsKKyNlbmRpZgorCisgICAgZnByaW50ZihmcCwgXygiXG4jIEJ1ZmZlciBsaXN0OlxuIikpOworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMIDsgYnVmID0gYnVmLT5iX25leHQpCisgICAgeworCWlmIChidWYtPmJfZm5hbWUgPT0gTlVMTAorCQl8fCAhYnVmLT5iX3BfYmwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCXx8IGJ0X3F1aWNrZml4KGJ1ZikKKyNlbmRpZgorCQl8fCByZW1vdmFibGUoYnVmLT5iX2ZmbmFtZSkpCisJICAgIGNvbnRpbnVlOworCisJcHV0YygnJScsIGZwKTsKKwlob21lX3JlcGxhY2UoTlVMTCwgYnVmLT5iX2ZmbmFtZSwgbGluZSwgTUFYUEFUSEwsIFRSVUUpOworCXNwcmludGYoKGNoYXIgKilsaW5lICsgU1RSTEVOKGxpbmUpLCAiXHQlbGRcdCVkIiwKKwkJCShsb25nKWJ1Zi0+Yl9sYXN0X2N1cnNvci5sbnVtLAorCQkJYnVmLT5iX2xhc3RfY3Vyc29yLmNvbCk7CisJdmltaW5mb193cml0ZXN0cmluZyhmcCwgbGluZSk7CisgICAgfQorICAgIHZpbV9mcmVlKGxpbmUpOworfQorI2VuZGlmCisKKworLyoKKyAqIFJldHVybiBzcGVjaWFsIGJ1ZmZlciBuYW1lLgorICogUmV0dXJucyBOVUxMIHdoZW4gdGhlIGJ1ZmZlciBoYXMgYSBub3JtYWwgZmlsZSBuYW1lLgorICovCisgICAgY2hhciAqCitidWZfc3BuYW1lKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisgICAgaWYgKGJ0X3F1aWNrZml4KGJ1ZikpCisJcmV0dXJuIF8oIltFcnJvciBMaXN0XSIpOworI2VuZGlmCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorICAgIC8qIFRoZXJlIGlzIG5vIF9maWxlXyB3aGVuICdidWZ0eXBlJyBpcyAibm9maWxlIiwgYl9zZm5hbWUKKyAgICAgKiBjb250YWlucyB0aGUgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgKi8KKyAgICBpZiAoYnRfbm9maWxlKGJ1ZikpCisgICAgeworCWlmIChidWYtPmJfc2ZuYW1lICE9IE5VTEwpCisJICAgIHJldHVybiAoY2hhciAqKWJ1Zi0+Yl9zZm5hbWU7CisJcmV0dXJuICJbU2NyYXRjaF0iOworICAgIH0KKyNlbmRpZgorICAgIGlmIChidWYtPmJfZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gXygiW05vIEZpbGVdIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworI2lmIGRlZmluZWQoRkVBVF9TSUdOUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBJbnNlcnQgdGhlIHNpZ24gaW50byB0aGUgc2lnbmxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zZXJ0X3NpZ24oYnVmLCBwcmV2LCBuZXh0LCBpZCwgbG51bSwgdHlwZW5yKQorICAgIGJ1Zl9UCSpidWY7CQkvKiBidWZmZXIgdG8gc3RvcmUgc2lnbiBpbiAqLworICAgIHNpZ25saXN0X1QJKnByZXY7CQkvKiBwcmV2aW91cyBzaWduIGVudHJ5ICovCisgICAgc2lnbmxpc3RfVAkqbmV4dDsJCS8qIG5leHQgc2lnbiBlbnRyeSAqLworICAgIGludAkJaWQ7CQkvKiBzaWduIElEICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIGxpbmUgbnVtYmVyIHdoaWNoIGdldHMgdGhlIG1hcmsgKi8KKyAgICBpbnQJCXR5cGVucjsJCS8qIHR5cGVuciBvZiBzaWduIHdlIGFyZSBhZGRpbmcgKi8KK3sKKyAgICBzaWdubGlzdF9UCSpuZXdzaWduOworCisgICAgbmV3c2lnbiA9IChzaWdubGlzdF9UICopbGFsbG9jKChsb25nX3Upc2l6ZW9mKHNpZ25saXN0X1QpLCBGQUxTRSk7CisgICAgaWYgKG5ld3NpZ24gIT0gTlVMTCkKKyAgICB7CisJbmV3c2lnbi0+aWQgPSBpZDsKKwluZXdzaWduLT5sbnVtID0gbG51bTsKKwluZXdzaWduLT50eXBlbnIgPSB0eXBlbnI7CisJbmV3c2lnbi0+bmV4dCA9IG5leHQ7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJbmV3c2lnbi0+cHJldiA9IHByZXY7CisJaWYgKG5leHQgIT0gTlVMTCkKKwkgICAgbmV4dC0+cHJldiA9IG5ld3NpZ247CisjZW5kaWYKKworCWlmIChwcmV2ID09IE5VTEwpCisJeworCSAgICAvKiBXaGVuIGFkZGluZyBmaXJzdCBzaWduIG5lZWQgdG8gcmVkcmF3IHRoZSB3aW5kb3dzIHRvIGNyZWF0ZSB0aGUKKwkgICAgICogY29sdW1uIGZvciBzaWducy4gKi8KKwkgICAgaWYgKGJ1Zi0+Yl9zaWdubGlzdCA9PSBOVUxMKQorCSAgICB7CisJCXJlZHJhd19idWZfbGF0ZXIoYnVmLCBOT1RfVkFMSUQpOworCQljaGFuZ2VkX2NsaW5lX2JlZl9jdXJzKCk7CisJICAgIH0KKworCSAgICAvKiBmaXJzdCBzaWduIGluIHNpZ25saXN0ICovCisJICAgIGJ1Zi0+Yl9zaWdubGlzdCA9IG5ld3NpZ247CisJfQorCWVsc2UKKwkgICAgcHJldi0+bmV4dCA9IG5ld3NpZ247CisgICAgfQorfQorCisvKgorICogQWRkIHRoZSBzaWduIGludG8gdGhlIHNpZ25saXN0LiBGaW5kIHRoZSByaWdodCBzcG90IHRvIGRvIGl0IHRob3VnaC4KKyAqLworICAgIHZvaWQKK2J1Zl9hZGRzaWduKGJ1ZiwgaWQsIGxudW0sIHR5cGVucikKKyAgICBidWZfVAkqYnVmOwkJLyogYnVmZmVyIHRvIHN0b3JlIHNpZ24gaW4gKi8KKyAgICBpbnQJCWlkOwkJLyogc2lnbiBJRCAqLworICAgIGxpbmVucl9UCWxudW07CQkvKiBsaW5lIG51bWJlciB3aGljaCBnZXRzIHRoZSBtYXJrICovCisgICAgaW50CQl0eXBlbnI7CQkvKiB0eXBlbnIgb2Ygc2lnbiB3ZSBhcmUgYWRkaW5nICovCit7CisgICAgc2lnbmxpc3RfVAkqc2lnbjsJCS8qIGEgc2lnbiBpbiB0aGUgc2lnbmxpc3QgKi8KKyAgICBzaWdubGlzdF9UCSpwcmV2OwkJLyogdGhlIHByZXZpb3VzIHNpZ24gKi8KKworICAgIHByZXYgPSBOVUxMOworICAgIGZvciAoc2lnbiA9IGJ1Zi0+Yl9zaWdubGlzdDsgc2lnbiAhPSBOVUxMOyBzaWduID0gc2lnbi0+bmV4dCkKKyAgICB7CisJaWYgKGxudW0gPT0gc2lnbi0+bG51bSAmJiBpZCA9PSBzaWduLT5pZCkKKwl7CisJICAgIHNpZ24tPnR5cGVuciA9IHR5cGVucjsKKwkgICAgcmV0dXJuOworCX0KKwllbHNlIGlmICgKKyNpZm5kZWYgRkVBVF9ORVRCRUFOU19JTlRHICAvKiBrZWVwIHNpZ25zIHNvcnRlZCBieSBsbnVtICovCisJCSAgIGlkIDwgMCAmJgorI2VuZGlmCisJCQkgICAgIGxudW0gPCBzaWduLT5sbnVtKQorCXsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcgLyogaW5zZXJ0IG5ldyBzaWduIGF0IGhlYWQgb2YgbGlzdCBmb3IgdGhpcyBsbnVtICovCisJICAgIC8qIFhYWCAtIEdSUDogSXMgdGhpcyBiZWNhdXNlIG9mIHNpZ24gc2xpZGUgcHJvYmxlbT8gT3IgaXMgaXQKKwkgICAgICogcmVhbGx5IG5lZWRlZD8gT3IgaXMgaXQgYmVjYXVzZSB3ZSBhbGxvdyBtdWx0aXBsZSBzaWducyBwZXIKKwkgICAgICogbGluZT8gSWYgc28sIHNob3VsZCBJIGFkZCB0aGF0IGZlYXR1cmUgdG8gRkVBVF9TSUdOUz8KKwkgICAgICovCisJICAgIHdoaWxlIChwcmV2ICE9IE5VTEwgJiYgcHJldi0+bG51bSA9PSBsbnVtKQorCQlwcmV2ID0gcHJldi0+cHJldjsKKwkgICAgaWYgKHByZXYgPT0gTlVMTCkKKwkJc2lnbiA9IGJ1Zi0+Yl9zaWdubGlzdDsKKwkgICAgZWxzZQorCQlzaWduID0gcHJldi0+bmV4dDsKKyNlbmRpZgorCSAgICBpbnNlcnRfc2lnbihidWYsIHByZXYsIHNpZ24sIGlkLCBsbnVtLCB0eXBlbnIpOworCSAgICByZXR1cm47CisJfQorCXByZXYgPSBzaWduOworICAgIH0KKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcgLyogaW5zZXJ0IG5ldyBzaWduIGF0IGhlYWQgb2YgbGlzdCBmb3IgdGhpcyBsbnVtICovCisgICAgLyogWFhYIC0gR1JQOiBTZWUgcHJldmlvdXMgY29tbWVudCAqLworICAgIHdoaWxlIChwcmV2ICE9IE5VTEwgJiYgcHJldi0+bG51bSA9PSBsbnVtKQorCXByZXYgPSBwcmV2LT5wcmV2OworICAgIGlmIChwcmV2ID09IE5VTEwpCisJc2lnbiA9IGJ1Zi0+Yl9zaWdubGlzdDsKKyAgICBlbHNlCisJc2lnbiA9IHByZXYtPm5leHQ7CisjZW5kaWYKKyAgICBpbnNlcnRfc2lnbihidWYsIHByZXYsIHNpZ24sIGlkLCBsbnVtLCB0eXBlbnIpOworCisgICAgcmV0dXJuOworfQorCisgICAgaW50CitidWZfY2hhbmdlX3NpZ25fdHlwZShidWYsIG1hcmtJZCwgdHlwZW5yKQorICAgIGJ1Zl9UCSpidWY7CQkvKiBidWZmZXIgdG8gc3RvcmUgc2lnbiBpbiAqLworICAgIGludAkJbWFya0lkOwkJLyogc2lnbiBJRCAqLworICAgIGludAkJdHlwZW5yOwkJLyogdHlwZW5yIG9mIHNpZ24gd2UgYXJlIGFkZGluZyAqLworeworICAgIHNpZ25saXN0X1QJKnNpZ247CQkvKiBhIHNpZ24gaW4gdGhlIHNpZ25saXN0ICovCisKKyAgICBmb3IgKHNpZ24gPSBidWYtPmJfc2lnbmxpc3Q7IHNpZ24gIT0gTlVMTDsgc2lnbiA9IHNpZ24tPm5leHQpCisgICAgeworCWlmIChzaWduLT5pZCA9PSBtYXJrSWQpCisJeworCSAgICBzaWduLT50eXBlbnIgPSB0eXBlbnI7CisJICAgIHJldHVybiBzaWduLT5sbnVtOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworICAgIGludF91CitidWZfZ2V0c2lnbnR5cGUoYnVmLCBsbnVtLCB0eXBlKQorICAgIGJ1Zl9UCSpidWY7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXR5cGU7CS8qIFNJR05fSUNPTiwgU0lHTl9URVhULCBTSUdOX0FOWSwgU0lHTl9MSU5FSEwgKi8KK3sKKyAgICBzaWdubGlzdF9UCSpzaWduOwkJLyogYSBzaWduIGluIGEgYl9zaWdubGlzdCAqLworCisgICAgZm9yIChzaWduID0gYnVmLT5iX3NpZ25saXN0OyBzaWduICE9IE5VTEw7IHNpZ24gPSBzaWduLT5uZXh0KQorCWlmIChzaWduLT5sbnVtID09IGxudW0KKwkJJiYgKHR5cGUgPT0gU0lHTl9BTlkKKyMgaWZkZWYgRkVBVF9TSUdOX0lDT05TCisJCSAgICB8fCAodHlwZSA9PSBTSUdOX0lDT04KKwkJCSYmIHNpZ25fZ2V0X2ltYWdlKHNpZ24tPnR5cGVucikgIT0gTlVMTCkKKyMgZW5kaWYKKwkJICAgIHx8ICh0eXBlID09IFNJR05fVEVYVAorCQkJJiYgc2lnbl9nZXRfdGV4dChzaWduLT50eXBlbnIpICE9IE5VTEwpCisJCSAgICB8fCAodHlwZSA9PSBTSUdOX0xJTkVITAorCQkJJiYgc2lnbl9nZXRfYXR0cihzaWduLT50eXBlbnIsIFRSVUUpICE9IDApKSkKKwkgICAgcmV0dXJuIHNpZ24tPnR5cGVucjsKKyAgICByZXR1cm4gMDsKK30KKworCisgICAgbGluZW5yX1QKK2J1Zl9kZWxzaWduKGJ1ZiwgaWQpCisgICAgYnVmX1QJKmJ1ZjsJCS8qIGJ1ZmZlciBzaWduIGlzIHN0b3JlZCBpbiAqLworICAgIGludAkJaWQ7CQkvKiBzaWduIGlkICovCit7CisgICAgc2lnbmxpc3RfVAkqKmxhc3RwOwkvKiBwb2ludGVyIHRvIHBvaW50ZXIgdG8gY3VycmVudCBzaWduICovCisgICAgc2lnbmxpc3RfVAkqc2lnbjsJCS8qIGEgc2lnbiBpbiBhIGJfc2lnbmxpc3QgKi8KKyAgICBzaWdubGlzdF9UCSpuZXh0OwkJLyogdGhlIG5leHQgc2lnbiBpbiBhIGJfc2lnbmxpc3QgKi8KKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogbGluZSBudW1iZXIgd2hvc2Ugc2lnbiB3YXMgZGVsZXRlZCAqLworCisgICAgbGFzdHAgPSAmYnVmLT5iX3NpZ25saXN0OworICAgIGxudW0gPSAwOworICAgIGZvciAoc2lnbiA9IGJ1Zi0+Yl9zaWdubGlzdDsgc2lnbiAhPSBOVUxMOyBzaWduID0gbmV4dCkKKyAgICB7CisJbmV4dCA9IHNpZ24tPm5leHQ7CisJaWYgKHNpZ24tPmlkID09IGlkKQorCXsKKwkgICAgKmxhc3RwID0gbmV4dDsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkgICAgaWYgKG5leHQgIT0gTlVMTCkKKwkJbmV4dC0+cHJldiA9IHNpZ24tPnByZXY7CisjZW5kaWYKKwkgICAgbG51bSA9IHNpZ24tPmxudW07CisJICAgIHZpbV9mcmVlKHNpZ24pOworCSAgICBicmVhazsKKwl9CisJZWxzZQorCSAgICBsYXN0cCA9ICZzaWduLT5uZXh0OworICAgIH0KKworICAgIC8qIFdoZW4gZGVsZXRlZCB0aGUgbGFzdCBzaWduIG5lZWQgdG8gcmVkcmF3IHRoZSB3aW5kb3dzIHRvIHJlbW92ZSB0aGUKKyAgICAgKiBzaWduIGNvbHVtbi4gKi8KKyAgICBpZiAoYnVmLT5iX3NpZ25saXN0ID09IE5VTEwpCisgICAgeworCXJlZHJhd19idWZfbGF0ZXIoYnVmLCBOT1RfVkFMSUQpOworCWNoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbG51bTsKK30KKworCisvKgorICogRmluZCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHNpZ24gd2l0aCB0aGUgcmVxdWVzdGVkIGlkLiBJZiB0aGUgc2lnbiBkb2VzCisgKiBub3QgZXhpc3QsIHJldHVybiAwIGFzIHRoZSBsaW5lIG51bWJlci4gVGhpcyB3aWxsIHN0aWxsIGxldCB0aGUgY29ycmVjdCBmaWxlCisgKiBnZXQgbG9hZGVkLgorICovCisgICAgaW50CitidWZfZmluZHNpZ24oYnVmLCBpZCkKKyAgICBidWZfVAkqYnVmOwkJLyogYnVmZmVyIHRvIHN0b3JlIHNpZ24gaW4gKi8KKyAgICBpbnQJCWlkOwkJLyogc2lnbiBJRCAqLworeworICAgIHNpZ25saXN0X1QJKnNpZ247CQkvKiBhIHNpZ24gaW4gdGhlIHNpZ25saXN0ICovCisKKyAgICBmb3IgKHNpZ24gPSBidWYtPmJfc2lnbmxpc3Q7IHNpZ24gIT0gTlVMTDsgc2lnbiA9IHNpZ24tPm5leHQpCisJaWYgKHNpZ24tPmlkID09IGlkKQorCSAgICByZXR1cm4gc2lnbi0+bG51bTsKKworICAgIHJldHVybiAwOworfQorCisgICAgaW50CitidWZfZmluZHNpZ25faWQoYnVmLCBsbnVtKQorICAgIGJ1Zl9UCSpidWY7CQkvKiBidWZmZXIgd2hvc2Ugc2lnbiB3ZSBhcmUgc2VhcmNoaW5nIGZvciAqLworICAgIGxpbmVucl9UCWxudW07CQkvKiBsaW5lIG51bWJlciBvZiBzaWduICovCit7CisgICAgc2lnbmxpc3RfVAkqc2lnbjsJCS8qIGEgc2lnbiBpbiB0aGUgc2lnbmxpc3QgKi8KKworICAgIGZvciAoc2lnbiA9IGJ1Zi0+Yl9zaWdubGlzdDsgc2lnbiAhPSBOVUxMOyBzaWduID0gc2lnbi0+bmV4dCkKKwlpZiAoc2lnbi0+bG51bSA9PSBsbnVtKQorCSAgICByZXR1cm4gc2lnbi0+aWQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCisjIGlmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSB8fCBkZWZpbmVkKFBST1RPKQorLyogc2VlIGlmIGEgZ2l2ZW4gdHlwZSBvZiBzaWduIGV4aXN0cyBvbiBhIHNwZWNpZmljIGxpbmUgKi8KKyAgICBpbnQKK2J1Zl9maW5kc2lnbnR5cGVfaWQoYnVmLCBsbnVtLCB0eXBlbnIpCisgICAgYnVmX1QJKmJ1ZjsJCS8qIGJ1ZmZlciB3aG9zZSBzaWduIHdlIGFyZSBzZWFyY2hpbmcgZm9yICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIGxpbmUgbnVtYmVyIG9mIHNpZ24gKi8KKyAgICBpbnQJCXR5cGVucjsJCS8qIHNpZ24gdHlwZSBudW1iZXIgKi8KK3sKKyAgICBzaWdubGlzdF9UCSpzaWduOwkJLyogYSBzaWduIGluIHRoZSBzaWdubGlzdCAqLworCisgICAgZm9yIChzaWduID0gYnVmLT5iX3NpZ25saXN0OyBzaWduICE9IE5VTEw7IHNpZ24gPSBzaWduLT5uZXh0KQorCWlmIChzaWduLT5sbnVtID09IGxudW0gJiYgc2lnbi0+dHlwZW5yID09IHR5cGVucikKKwkgICAgcmV0dXJuIHNpZ24tPmlkOworCisgICAgcmV0dXJuIDA7Cit9CisKKworIyAgaWYgZGVmaW5lZChGRUFUX1NJR05fSUNPTlMpIHx8IGRlZmluZWQoUFJPVE8pCisvKiByZXR1cm4gdGhlIG51bWJlciBvZiBpY29ucyBvbiB0aGUgZ2l2ZW4gbGluZSAqLworICAgIGludAorYnVmX3NpZ25jb3VudChidWYsIGxudW0pCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHNpZ25saXN0X1QJKnNpZ247CQkvKiBhIHNpZ24gaW4gdGhlIHNpZ25saXN0ICovCisgICAgaW50CQljb3VudCA9IDA7CisKKyAgICBmb3IgKHNpZ24gPSBidWYtPmJfc2lnbmxpc3Q7IHNpZ24gIT0gTlVMTDsgc2lnbiA9IHNpZ24tPm5leHQpCisJaWYgKHNpZ24tPmxudW0gPT0gbG51bSkKKwkgICAgaWYgKHNpZ25fZ2V0X2ltYWdlKHNpZ24tPnR5cGVucikgIT0gTlVMTCkKKwkJY291bnQrKzsKKworICAgIHJldHVybiBjb3VudDsKK30KKyMgIGVuZGlmIC8qIEZFQVRfU0lHTl9JQ09OUyAqLworIyBlbmRpZiAvKiBGRUFUX05FVEJFQU5TX0lOVEcgKi8KKworCisvKgorICogRGVsZXRlIHNpZ25zIGluIGJ1ZmZlciAiYnVmIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitidWZfZGVsZXRlX3NpZ25zKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHNpZ25saXN0X1QJKm5leHQ7CisKKyAgICB3aGlsZSAoYnVmLT5iX3NpZ25saXN0ICE9IE5VTEwpCisgICAgeworCW5leHQgPSBidWYtPmJfc2lnbmxpc3QtPm5leHQ7CisJdmltX2ZyZWUoYnVmLT5iX3NpZ25saXN0KTsKKwlidWYtPmJfc2lnbmxpc3QgPSBuZXh0OworICAgIH0KK30KKworLyoKKyAqIERlbGV0ZSBhbGwgc2lnbnMgaW4gYWxsIGJ1ZmZlcnMuCisgKi8KKyAgICB2b2lkCitidWZfZGVsZXRlX2FsbF9zaWducygpCit7CisgICAgYnVmX1QJKmJ1ZjsJCS8qIGJ1ZmZlciB3ZSBhcmUgY2hlY2tpbmcgZm9yIHNpZ25zICovCisKKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJaWYgKGJ1Zi0+Yl9zaWdubGlzdCAhPSBOVUxMKQorCXsKKwkgICAgLyogTmVlZCB0byByZWRyYXcgdGhlIHdpbmRvd3MgdG8gcmVtb3ZlIHRoZSBzaWduIGNvbHVtbi4gKi8KKwkgICAgcmVkcmF3X2J1Zl9sYXRlcihidWYsIE5PVF9WQUxJRCk7CisJICAgIGJ1Zl9kZWxldGVfc2lnbnMoYnVmKTsKKwl9Cit9CisKKy8qCisgKiBMaXN0IHBsYWNlZCBzaWducyBmb3IgInJidWYiLiAgSWYgInJidWYiIGlzIE5VTEwgZG8gaXQgZm9yIGFsbCBidWZmZXJzLgorICovCisgICAgdm9pZAorc2lnbl9saXN0X3BsYWNlZChyYnVmKQorICAgIGJ1Zl9UCSpyYnVmOworeworICAgIGJ1Zl9UCSpidWY7CisgICAgc2lnbmxpc3RfVAkqcDsKKyAgICBjaGFyCWxidWZbQlVGU0laXTsKKworICAgIE1TR19QVVRTX1RJVExFKF8oIlxuLS0tIFNpZ25zIC0tLSIpKTsKKyAgICBtc2dfcHV0Y2hhcignXG4nKTsKKyAgICBpZiAocmJ1ZiA9PSBOVUxMKQorCWJ1ZiA9IGZpcnN0YnVmOworICAgIGVsc2UKKwlidWYgPSByYnVmOworICAgIHdoaWxlIChidWYgIT0gTlVMTCkKKyAgICB7CisJaWYgKGJ1Zi0+Yl9zaWdubGlzdCAhPSBOVUxMKQorCXsKKyNpZmRlZiBIQVZFX1NOUFJJTlRGCisJICAgIHNucHJpbnRmCisjZWxzZQorCSAgICBzcHJpbnRmCisjZW5kaWYKKwkJKGxidWYsCisjaWZkZWYgSEFWRV9TTlBSSU5URgorCQkgQlVGU0laLAorI2VuZGlmCisJCSAgICBfKCJTaWducyBmb3IgJXM6IiksIGJ1Zi0+Yl9mbmFtZSk7CisJICAgIE1TR19QVVRTX0FUVFIobGJ1ZiwgaGxfYXR0cihITEZfRCkpOworCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKwl9CisJZm9yIChwID0gYnVmLT5iX3NpZ25saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCXsKKwkgICAgc3ByaW50ZihsYnVmLCBfKCIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIiksCisJCQkgICAobG9uZylwLT5sbnVtLCBwLT5pZCwgc2lnbl90eXBlbnIybmFtZShwLT50eXBlbnIpKTsKKwkgICAgTVNHX1BVVFMobGJ1Zik7CisJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCX0KKwlpZiAocmJ1ZiAhPSBOVUxMKQorCSAgICBicmVhazsKKwlidWYgPSBidWYtPmJfbmV4dDsKKyAgICB9Cit9CisKKy8qCisgKiBBZGp1c3QgYSBwbGFjZWQgc2lnbiBmb3IgaW5zZXJ0ZWQvZGVsZXRlZCBsaW5lcy4KKyAqLworICAgIHZvaWQKK3NpZ25fbWFya19hZGp1c3QobGluZTEsIGxpbmUyLCBhbW91bnQsIGFtb3VudF9hZnRlcikKKyAgICBsaW5lbnJfVAlsaW5lMTsKKyAgICBsaW5lbnJfVAlsaW5lMjsKKyAgICBsb25nCWFtb3VudDsKKyAgICBsb25nCWFtb3VudF9hZnRlcjsKK3sKKyAgICBzaWdubGlzdF9UCSpzaWduOwkJLyogYSBzaWduIGluIGEgYl9zaWdubGlzdCAqLworCisgICAgZm9yIChzaWduID0gY3VyYnVmLT5iX3NpZ25saXN0OyBzaWduICE9IE5VTEw7IHNpZ24gPSBzaWduLT5uZXh0KQorICAgIHsKKwlpZiAoc2lnbi0+bG51bSA+PSBsaW5lMSAmJiBzaWduLT5sbnVtIDw9IGxpbmUyKQorCXsKKwkgICAgaWYgKGFtb3VudCA9PSBNQVhMTlVNKQorCQlzaWduLT5sbnVtID0gbGluZTE7CisJICAgIGVsc2UKKwkJc2lnbi0+bG51bSArPSBhbW91bnQ7CisJfQorCWVsc2UgaWYgKHNpZ24tPmxudW0gPiBsaW5lMikKKwkgICAgc2lnbi0+bG51bSArPSBhbW91bnRfYWZ0ZXI7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfU0lHTlMgKi8KKworLyoKKyAqIFNldCAnYnVmbGlzdGVkJyBmb3IgY3VyYnVmIHRvICJvbiIgYW5kIHRyaWdnZXIgYXV0b2NvbW1hbmRzIGlmIGl0IGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitzZXRfYnVmbGlzdGVkKG9uKQorICAgIGludAkJb247Cit7CisgICAgaWYgKG9uICE9IGN1cmJ1Zi0+Yl9wX2JsKQorICAgIHsKKwljdXJidWYtPmJfcF9ibCA9IG9uOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWlmIChvbikKKwkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGQURELCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwllbHNlCisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkRFTEVURSwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBmaWxlIGZvciAiYnVmIiBhZ2FpbiBhbmQgY2hlY2sgaWYgdGhlIGNvbnRlbnRzIGNoYW5nZWQuCisgKiBSZXR1cm4gVFJVRSBpZiBpdCBjaGFuZ2VkIG9yIHRoaXMgY291bGQgbm90IGJlIGNoZWNrZWQuCisgKi8KKyAgICBpbnQKK2J1Zl9jb250ZW50c19jaGFuZ2VkKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIGJ1Zl9UCSpuZXdidWY7CisgICAgaW50CQlkaWZmZXIgPSBUUlVFOworICAgIGxpbmVucl9UCWxudW07CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgYWNvX3NhdmVfVAlhY287CisjZWxzZQorICAgIGJ1Zl9UCSpvbGRfY3VyYnVmID0gY3VyYnVmOworI2VuZGlmCisgICAgZXhhcmdfVAllYTsKKworICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHdpdGhvdXQgcHV0dGluZyBpdCBpbiB0aGUgYnVmZmVyIGxpc3QuICovCisgICAgbmV3YnVmID0gYnVmbGlzdF9uZXcoTlVMTCwgTlVMTCwgKGxpbmVucl9UKTEsIEJMTl9EVU1NWSk7CisgICAgaWYgKG5ld2J1ZiA9PSBOVUxMKQorCXJldHVybiBUUlVFOworCisgICAgLyogRm9yY2UgdGhlICdmaWxlZW5jb2RpbmcnIGFuZCAnZmlsZWZvcm1hdCcgdG8gYmUgZXF1YWwuICovCisgICAgaWYgKHByZXBfZXhhcmcoJmVhLCBidWYpID09IEZBSUwpCisgICAgeworCXdpcGVfYnVmZmVyKG5ld2J1ZiwgRkFMU0UpOworCXJldHVybiBUUlVFOworICAgIH0KKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIHNldCBjdXJ3aW4vY3VyYnVmIHRvIGJ1ZiBhbmQgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKyAgICBhdWNtZF9wcmVwYnVmKCZhY28sIG5ld2J1Zik7CisjZWxzZQorICAgIGN1cmJ1ZiA9IG5ld2J1ZjsKKyAgICBjdXJ3aW4tPndfYnVmZmVyID0gbmV3YnVmOworI2VuZGlmCisKKyAgICBpZiAobWxfb3BlbigpID09IE9LCisJICAgICYmIHJlYWRmaWxlKGJ1Zi0+Yl9mZm5hbWUsIGJ1Zi0+Yl9mbmFtZSwKKwkJCQkgIChsaW5lbnJfVCkwLCAobGluZW5yX1QpMCwgKGxpbmVucl9UKU1BWExOVU0sCisJCQkJCSAgICAmZWEsIFJFQURfTkVXIHwgUkVBRF9EVU1NWSkgPT0gT0spCisgICAgeworCS8qIGNvbXBhcmUgdGhlIHR3byBmaWxlcyBsaW5lIGJ5IGxpbmUgKi8KKwlpZiAoYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBkaWZmZXIgPSBGQUxTRTsKKwkgICAgZm9yIChsbnVtID0gMTsgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsgKytsbnVtKQorCQlpZiAoU1RSQ01QKG1sX2dldF9idWYoYnVmLCBsbnVtLCBGQUxTRSksIG1sX2dldChsbnVtKSkgIT0gMCkKKwkJeworCQkgICAgZGlmZmVyID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShlYS5jbWQpOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogcmVzdG9yZSBjdXJ3aW4vY3VyYnVmIGFuZCBhIGZldyBvdGhlciB0aGluZ3MgKi8KKyAgICBhdWNtZF9yZXN0YnVmKCZhY28pOworI2Vsc2UKKyAgICBjdXJidWYgPSBvbGRfY3VyYnVmOworICAgIGN1cndpbi0+d19idWZmZXIgPSBvbGRfY3VyYnVmOworI2VuZGlmCisKKyAgICBpZiAoY3VyYnVmICE9IG5ld2J1ZikJLyogc2FmZXR5IGNoZWNrICovCisJd2lwZV9idWZmZXIobmV3YnVmLCBGQUxTRSk7CisKKyAgICByZXR1cm4gZGlmZmVyOworfQorCisvKgorICogV2lwZSBvdXQgYSBidWZmZXIgYW5kIGRlY3JlbWVudCB0aGUgbGFzdCBidWZmZXIgbnVtYmVyIGlmIGl0IHdhcyB1c2VkIGZvcgorICogdGhpcyBidWZmZXIuICBDYWxsIHRoaXMgdG8gd2lwZSBvdXQgYSB0ZW1wIGJ1ZmZlciB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55CisgKiBtYXJrcy4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAord2lwZV9idWZmZXIoYnVmLCBhdWNtZCkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJYXVjbWQ7CSAgICAvKiBXaGVuIFRSVUUgdHJpZ2dlciBhdXRvY29tbWFuZHMuICovCit7CisgICAgaWYgKGJ1Zi0+Yl9mbnVtID09IHRvcF9maWxlX251bSAtIDEpCisJLS10b3BfZmlsZV9udW07CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoIWF1Y21kKQkJICAgIC8qIERvbid0IHRyaWdnZXIgQnVmRGVsZXRlIGF1dG9jb21tYW5kcyBoZXJlLiAqLworCSsrYXV0b2NtZF9ibG9jazsKKyNlbmRpZgorICAgIGNsb3NlX2J1ZmZlcihOVUxMLCBidWYsIERPQlVGX1dJUEUpOworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGlmICghYXVjbWQpCisJLS1hdXRvY21kX2Jsb2NrOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9zcmMvY2hhcnNldC5jIGIvc3JjL2NoYXJzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDI0ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NoYXJzZXQuYwpAQCAtMCwwICsxLDE3OTUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKK3N0YXRpYyBpbnQgd2luX2NoYXJ0YWJzaXplIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnAsIGNvbG5yX1QgY29sKSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBpbnQgd2luX25vbGJyX2NoYXJ0YWJzaXplIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnMsIGNvbG5yX1QgY29sLCBpbnQgKmhlYWRwKSk7CisjZW5kaWYKKworc3RhdGljIGludCBucjJoZXggX19BUkdTKChpbnQgYykpOworCitzdGF0aWMgaW50ICAgIGNoYXJ0YWJfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworLyogYl9jaGFydGFiW10gaXMgYW4gYXJyYXkgb2YgMzIgYnl0ZXMsIGVhY2ggYml0IHJlcHJlc2VudGluZyBvbmUgb2YgdGhlCisgKiBjaGFyYWN0ZXJzIDAtMjU1LiAqLworI2RlZmluZSBTRVRfQ0hBUlRBQihidWYsIGMpIChidWYpLT5iX2NoYXJ0YWJbKHVuc2lnbmVkKShjKSA+PiAzXSB8PSAoMSA8PCAoKGMpICYgMHg3KSkKKyNkZWZpbmUgUkVTRVRfQ0hBUlRBQihidWYsIGMpIChidWYpLT5iX2NoYXJ0YWJbKHVuc2lnbmVkKShjKSA+PiAzXSAmPSB+KDEgPDwgKChjKSAmIDB4NykpCisjZGVmaW5lIEdFVF9DSEFSVEFCKGJ1ZiwgYykgKChidWYpLT5iX2NoYXJ0YWJbKHVuc2lnbmVkKShjKSA+PiAzXSAmICgxIDw8ICgoYykgJiAweDcpKSkKKworLyoKKyAqIEZpbGwgY2hhcnRhYltdLiAgQWxzbyBmaWxscyBjdXJidWYtPmJfY2hhcnRhYltdIHdpdGggZmxhZ3MgZm9yIGtleXdvcmQKKyAqIGNoYXJhY3RlcnMgZm9yIGN1cnJlbnQgYnVmZmVyLgorICoKKyAqIERlcGVuZHMgb24gdGhlIG9wdGlvbiBzZXR0aW5ncyAnaXNrZXl3b3JkJywgJ2lzaWRlbnQnLCAnaXNmbmFtZScsCisgKiAnaXNwcmludCcgYW5kICdlbmNvZGluZycuCisgKgorICogVGhlIGluZGV4IGluIGNoYXJ0YWJbXSBkZXBlbmRzIG9uICdlbmNvZGluZyc6CisgKiAtIEZvciBub24tbXVsdGktYnl0ZSBpbmRleCB3aXRoIHRoZSBieXRlIChzYW1lIGFzIHRoZSBjaGFyYWN0ZXIpLgorICogLSBGb3IgREJDUyBpbmRleCB3aXRoIHRoZSBmaXJzdCBieXRlLgorICogLSBGb3IgVVRGLTggaW5kZXggd2l0aCB0aGUgY2hhcmFjdGVyICh3aGVuIGZpcnN0IGJ5dGUgaXMgdXAgdG8gMHg4MCBpdCBpcworICogICB0aGUgc2FtZSBhcyB0aGUgY2hhcmFjdGVyLCBpZiB0aGUgZmlyc3QgYnl0ZSBpcyAweDgwIGFuZCBhYm92ZSBpdCBkZXBlbmRzCisgKiAgIG9uIGZ1cnRoZXIgYnl0ZXMpLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiBjaGFydGFiW106CisgKiAtIFRoZSBsb3dlciB0d28gYml0cywgbWFza2VkIGJ5IENUX0NFTExfTUFTSywgZ2l2ZSB0aGUgbnVtYmVyIG9mIGRpc3BsYXkKKyAqICAgY2VsbHMgdGhlIGNoYXJhY3RlciBvY2N1cGllcyAoMSBvciAyKS4gIE5vdCB2YWxpZCBmb3IgVVRGLTggYWJvdmUgMHg4MC4KKyAqIC0gQ1RfUFJJTlRfQ0hBUiBiaXQgaXMgc2V0IHdoZW4gdGhlIGNoYXJhY3RlciBpcyBwcmludGFibGUgKG5vIG5lZWQgdG8KKyAqICAgdHJhbnNsYXRlIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGRpc3BsYXlpbmcgaXQpLiAgTm90ZSB0aGF0IG9ubHkgREJDUworICogICBjaGFyYWN0ZXJzIGNhbiBoYXZlIDIgZGlzcGxheSBjZWxscyBhbmQgc3RpbGwgYmUgcHJpbnRhYmxlLgorICogLSBDVF9GTkFNRV9DSEFSIGJpdCBpcyBzZXQgd2hlbiB0aGUgY2hhcmFjdGVyIGNhbiBiZSBpbiBhIGZpbGUgbmFtZS4KKyAqIC0gQ1RfSURfQ0hBUiBiaXQgaXMgc2V0IHdoZW4gdGhlIGNoYXJhY3RlciBjYW4gYmUgaW4gYW4gaWRlbnRpZmllci4KKyAqCisgKiBSZXR1cm4gRkFJTCBpZiAnaXNrZXl3b3JkJywgJ2lzaWRlbnQnLCAnaXNmbmFtZScgb3IgJ2lzcHJpbnQnIG9wdGlvbiBoYXMgYW4KKyAqIGVycm9yLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2luaXRfY2hhcnRhYigpCit7CisgICAgcmV0dXJuIGJ1Zl9pbml0X2NoYXJ0YWIoY3VyYnVmLCBUUlVFKTsKK30KKworICAgIGludAorYnVmX2luaXRfY2hhcnRhYihidWYsIGdsb2JhbCkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZ2xvYmFsOwkJLyogRkFMU0U6IG9ubHkgc2V0IGJ1Zi0+Yl9jaGFydGFiW10gKi8KK3sKKyAgICBpbnQJCWM7CisgICAgaW50CQljMjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworICAgIGludAkJdGlsZGU7CisgICAgaW50CQlkb19pc2FscGhhOworCisgICAgaWYgKGdsb2JhbCkKKyAgICB7CisJLyoKKwkgKiBTZXQgdGhlIGRlZmF1bHQgc2l6ZSBmb3IgcHJpbnRhYmxlIGNoYXJhY3RlcnM6CisJICogRnJvbSA8U3BhY2U+IHRvICd+JyBpcyAxIChwcmludGFibGUpLCBvdGhlcnMgYXJlIDIgKG5vdCBwcmludGFibGUpLgorCSAqIFRoaXMgYWxzbyBpbml0cyBhbGwgJ2lzaWRlbnQnIGFuZCAnaXNmbmFtZScgZmxhZ3MgdG8gRkFMU0UuCisJICoKKwkgKiBFQkNESUM6IGFsbCBjaGFycyBiZWxvdyAnICcgYXJlIG5vdCBwcmludGFibGUsIGFsbCBvdGhlcnMgYXJlCisJICogcHJpbnRhYmxlLgorCSAqLworCWMgPSAwOworCXdoaWxlIChjIDwgJyAnKQorCSAgICBjaGFydGFiW2MrK10gPSAoZHlfZmxhZ3MgJiBEWV9VSEVYKSA/IDQgOiAyOworI2lmZGVmIEVCQ0RJQworCXdoaWxlIChjIDwgMjU1KQorI2Vsc2UKKwl3aGlsZSAoYyA8PSAnficpCisjZW5kaWYKKwkgICAgY2hhcnRhYltjKytdID0gMSArIENUX1BSSU5UX0NIQVI7CisjaWZkZWYgRkVBVF9GS01BUAorCWlmIChwX2FsdGtleW1hcCkKKwl7CisJICAgIHdoaWxlIChjIDwgWUUpCisJCWNoYXJ0YWJbYysrXSA9IDEgKyBDVF9QUklOVF9DSEFSOworCX0KKyNlbmRpZgorCXdoaWxlIChjIDwgMjU2KQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIC8qIFVURi04OiBieXRlcyAweGEwIC0gMHhmZiBhcmUgcHJpbnRhYmxlIChsYXRpbjEpICovCisJICAgIGlmIChlbmNfdXRmOCAmJiBjID49IDB4YTApCisJCWNoYXJ0YWJbYysrXSA9IENUX1BSSU5UX0NIQVIgKyAxOworCSAgICAvKiBldWMtanAgY2hhcmFjdGVycyBzdGFydGluZyB3aXRoIDB4OGUgYXJlIHNpbmdsZSB3aWR0aCAqLworCSAgICBlbHNlIGlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgYyA9PSAweDhlKQorCQljaGFydGFiW2MrK10gPSBDVF9QUklOVF9DSEFSICsgMTsKKwkgICAgLyogb3RoZXIgZG91YmxlLWJ5dGUgY2hhcnMgY2FuIGJlIHByaW50YWJsZSBBTkQgZG91YmxlLXdpZHRoICovCisJICAgIGVsc2UgaWYgKGVuY19kYmNzICE9IDAgJiYgTUJfQllURTJMRU4oYykgPT0gMikKKwkJY2hhcnRhYltjKytdID0gQ1RfUFJJTlRfQ0hBUiArIDI7CisJICAgIGVsc2UKKyNlbmRpZgorCQkvKiB0aGUgcmVzdCBpcyB1bnByaW50YWJsZSBieSBkZWZhdWx0ICovCisJCWNoYXJ0YWJbYysrXSA9IChkeV9mbGFncyAmIERZX1VIRVgpID8gNCA6IDI7CisJfQorCisjaWZkZWYgRkVBVF9NQllURQorCS8qIEFzc3VtZSB0aGF0IGV2ZXJ5IG11bHRpLWJ5dGUgY2hhciBpcyBhIGZpbGVuYW1lIGNoYXJhY3Rlci4gKi8KKwlmb3IgKGMgPSAxOyBjIDwgMjU2OyArK2MpCisJICAgIGlmICgoZW5jX2RiY3MgIT0gMCAmJiBNQl9CWVRFMkxFTihjKSA+IDEpCisJCSAgICB8fCAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmIGMgPT0gMHg4ZSkKKwkJICAgIHx8IChlbmNfdXRmOCAmJiBjID49IDB4YTApKQorCQljaGFydGFiW2NdIHw9IENUX0ZOQU1FX0NIQVI7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXQgd29yZCBjaGFyIGZsYWdzIGFsbCB0byBGQUxTRQorICAgICAqLworICAgIHZpbV9tZW1zZXQoYnVmLT5iX2NoYXJ0YWIsIDAsIChzaXplX3QpMzIpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyArK2MpCisgICAgeworCS8qIGRvdWJsZS1ieXRlIGNoYXJhY3RlcnMgYXJlIHByb2JhYmx5IHdvcmQgY2hhcmFjdGVycyAqLworCWlmIChlbmNfZGJjcyAhPSAwICYmIE1CX0JZVEUyTEVOKGMpID09IDIpCisJICAgIFNFVF9DSEFSVEFCKGJ1ZiwgYyk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0xJU1AKKyAgICAvKgorICAgICAqIEluIGxpc3AgbW9kZSB0aGUgJy0nIGNoYXJhY3RlciBpcyBpbmNsdWRlZCBpbiBrZXl3b3Jkcy4KKyAgICAgKi8KKyAgICBpZiAoYnVmLT5iX3BfbGlzcCkKKwlTRVRfQ0hBUlRBQihidWYsICctJyk7CisjZW5kaWYKKworICAgIC8qIFdhbGsgdGhyb3VnaCB0aGUgJ2lzaWRlbnQnLCAnaXNrZXl3b3JkJywgJ2lzZm5hbWUnIGFuZCAnaXNwcmludCcKKyAgICAgKiBvcHRpb25zIEVhY2ggb3B0aW9uIGlzIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLCBjaGFyYWN0ZXIgbnVtYmVycyBvcgorICAgICAqIHJhbmdlcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgZS5nLjogIjIwMC0yMTAseCwjLTE3OCwtIgorICAgICAqLworICAgIGZvciAoaSA9IGdsb2JhbCA/IDAgOiAzOyBpIDw9IDM7ICsraSkKKyAgICB7CisJaWYgKGkgPT0gMCkKKwkgICAgcCA9IHBfaXNpOwkJLyogZmlyc3Qgcm91bmQ6ICdpc2lkZW50JyAqLworCWVsc2UgaWYgKGkgPT0gMSkKKwkgICAgcCA9IHBfaXNwOwkJLyogc2Vjb25kIHJvdW5kOiAnaXNwcmludCcgKi8KKwllbHNlIGlmIChpID09IDIpCisJICAgIHAgPSBwX2lzZjsJCS8qIHRoaXJkIHJvdW5kOiAnaXNmbmFtZScgKi8KKwllbHNlCS8qIGkgPT0gMyAqLworCSAgICBwID0gYnVmLT5iX3BfaXNrOwkvKiBmb3VydGggcm91bmQ6ICdpc2tleXdvcmQnICovCisKKwl3aGlsZSAoKnApCisJeworCSAgICB0aWxkZSA9IEZBTFNFOworCSAgICBkb19pc2FscGhhID0gRkFMU0U7CisJICAgIGlmICgqcCA9PSAnXicgJiYgcFsxXSAhPSBOVUwpCisJICAgIHsKKwkJdGlsZGUgPSBUUlVFOworCQkrK3A7CisJICAgIH0KKwkgICAgaWYgKFZJTV9JU0RJR0lUKCpwKSkKKwkJYyA9IGdldGRpZ2l0cygmcCk7CisJICAgIGVsc2UKKwkJYyA9ICpwKys7CisJICAgIGMyID0gLTE7CisJICAgIGlmICgqcCA9PSAnLScgJiYgcFsxXSAhPSBOVUwpCisJICAgIHsKKwkJKytwOworCQlpZiAoVklNX0lTRElHSVQoKnApKQorCQkgICAgYzIgPSBnZXRkaWdpdHMoJnApOworCQllbHNlCisJCSAgICBjMiA9ICpwKys7CisJICAgIH0KKwkgICAgaWYgKGMgPD0gMCB8fCAoYzIgPCBjICYmIGMyICE9IC0xKSB8fCBjMiA+PSAyNTYKKwkJCQkJCSB8fCAhKCpwID09IE5VTCB8fCAqcCA9PSAnLCcpKQorCQlyZXR1cm4gRkFJTDsKKworCSAgICBpZiAoYzIgPT0gLTEpCS8qIG5vdCBhIHJhbmdlICovCisJICAgIHsKKwkJLyoKKwkJICogQSBzaW5nbGUgJ0AnIChub3QgIkAtQCIpOgorCQkgKiBEZWNpZGUgb24gbGV0dGVycyBiZWluZyBJRC9wcmludGFibGUva2V5d29yZCBjaGFycyB3aXRoCisJCSAqIHN0YW5kYXJkIGZ1bmN0aW9uIGlzYWxwaGEoKS4gVGhpcyB0YWtlcyBjYXJlIG9mIGxvY2FsZSBmb3IKKwkJICogc2luZ2xlLWJ5dGUgY2hhcmFjdGVycykuCisJCSAqLworCQlpZiAoYyA9PSAnQCcpCisJCXsKKwkJICAgIGRvX2lzYWxwaGEgPSBUUlVFOworCQkgICAgYyA9IDE7CisJCSAgICBjMiA9IDI1NTsKKwkJfQorCQllbHNlCisJCSAgICBjMiA9IGM7CisJICAgIH0KKwkgICAgd2hpbGUgKGMgPD0gYzIpCisJICAgIHsKKwkJaWYgKCFkb19pc2FscGhhIHx8IGlzYWxwaGEoYykKKyNpZmRlZiBGRUFUX0ZLTUFQCisJCQl8fCAocF9hbHRrZXltYXAgJiYgKEZfaXNhbHBoYShjKSB8fCBGX2lzZGlnaXQoYykpKQorI2VuZGlmCisJCQkgICAgKQorCQl7CisJCSAgICBpZiAoaSA9PSAwKQkJCS8qIChyZSlzZXQgSUQgZmxhZyAqLworCQkgICAgeworCQkJaWYgKHRpbGRlKQorCQkJICAgIGNoYXJ0YWJbY10gJj0gfkNUX0lEX0NIQVI7CisJCQllbHNlCisJCQkgICAgY2hhcnRhYltjXSB8PSBDVF9JRF9DSEFSOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAoaSA9PSAxKQkJLyogKHJlKXNldCBwcmludGFibGUgKi8KKwkJICAgIHsKKwkJCWlmICgoYyA8ICcgJworI2lmbmRlZiBFQkNESUMKKwkJCQkgICAgfHwgYyA+ICd+JworI2VuZGlmCisjaWZkZWYgRkVBVF9GS01BUAorCQkJCSAgICB8fCAocF9hbHRrZXltYXAKKwkJCQkJJiYgKEZfaXNhbHBoYShjKSB8fCBGX2lzZGlnaXQoYykpKQorI2VuZGlmCisJCQkgICAgKQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCQkvKiBGb3IgZG91YmxlLWJ5dGUgd2Uga2VlcCB0aGUgY2VsbCB3aWR0aCwgc28KKwkJCQkgKiB0aGF0IHdlIGNhbiBkZXRlY3QgaXQgZnJvbSB0aGUgZmlyc3QgYnl0ZS4gKi8KKwkJCQkmJiAhKGVuY19kYmNzICYmIE1CX0JZVEUyTEVOKGMpID09IDIpCisjZW5kaWYKKwkJCSAgICkKKwkJCXsKKwkJCSAgICBpZiAodGlsZGUpCisJCQkgICAgeworCQkJCWNoYXJ0YWJbY10gPSAoY2hhcnRhYltjXSAmIH5DVF9DRUxMX01BU0spCisJCQkJCSAgICAgKyAoKGR5X2ZsYWdzICYgRFlfVUhFWCkgPyA0IDogMik7CisJCQkJY2hhcnRhYltjXSAmPSB+Q1RfUFJJTlRfQ0hBUjsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQljaGFydGFiW2NdID0gKGNoYXJ0YWJbY10gJiB+Q1RfQ0VMTF9NQVNLKSArIDE7CisJCQkJY2hhcnRhYltjXSB8PSBDVF9QUklOVF9DSEFSOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGkgPT0gMikJCS8qIChyZSlzZXQgZm5hbWUgZmxhZyAqLworCQkgICAgeworCQkJaWYgKHRpbGRlKQorCQkJICAgIGNoYXJ0YWJbY10gJj0gfkNUX0ZOQU1FX0NIQVI7CisJCQllbHNlCisJCQkgICAgY2hhcnRhYltjXSB8PSBDVF9GTkFNRV9DSEFSOworCQkgICAgfQorCQkgICAgZWxzZSAvKiBpID09IDMgKi8JCS8qIChyZSlzZXQga2V5d29yZCBmbGFnICovCisJCSAgICB7CisJCQlpZiAodGlsZGUpCisJCQkgICAgUkVTRVRfQ0hBUlRBQihidWYsIGMpOworCQkJZWxzZQorCQkJICAgIFNFVF9DSEFSVEFCKGJ1ZiwgYyk7CisJCSAgICB9CisJCX0KKwkJKytjOworCSAgICB9CisJICAgIHAgPSBza2lwX3RvX29wdGlvbl9wYXJ0KHApOworCX0KKyAgICB9CisgICAgY2hhcnRhYl9pbml0aWFsaXplZCA9IFRSVUU7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogVHJhbnNsYXRlIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gYnVmW2J1ZnNpemVdIGluLXBsYWNlLgorICogVGhlIHJlc3VsdCBpcyBhIHN0cmluZyB3aXRoIG9ubHkgcHJpbnRhYmxlIGNoYXJhY3RlcnMsIGJ1dCBpZiB0aGVyZSBpcyBub3QKKyAqIGVub3VnaCByb29tLCBub3QgYWxsIGNoYXJhY3RlcnMgd2lsbCBiZSB0cmFuc2xhdGVkLgorICovCisgICAgdm9pZAordHJhbnNfY2hhcmFjdGVycyhidWYsIGJ1ZnNpemUpCisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlidWZzaXplOworeworICAgIGludAkJbGVuOwkJLyogbGVuZ3RoIG9mIHN0cmluZyBuZWVkaW5nIHRyYW5zbGF0aW9uICovCisgICAgaW50CQlyb29tOwkJLyogcm9vbSBpbiBidWZmZXIgYWZ0ZXIgc3RyaW5nICovCisgICAgY2hhcl91CSp0cnM7CQkvKiB0cmFuc2xhdGVkIGNoYXJhY3RlciAqLworICAgIGludAkJdHJzX2xlbjsJLyogbGVuZ3RoIG9mIHRyc1tdICovCisKKyAgICBsZW4gPSAoaW50KVNUUkxFTihidWYpOworICAgIHJvb20gPSBidWZzaXplIC0gbGVuOworICAgIHdoaWxlICgqYnVmICE9IDApCisgICAgeworIyBpZmRlZiBGRUFUX01CWVRFCisJLyogQXNzdW1lIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgZG9lc24ndCBuZWVkIHRyYW5zbGF0aW9uLiAqLworCWlmIChoYXNfbWJ5dGUgJiYgKHRyc19sZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKGJ1ZikpID4gMSkKKwkgICAgbGVuIC09IHRyc19sZW47CisJZWxzZQorIyBlbmRpZgorCXsKKwkgICAgdHJzID0gdHJhbnNjaGFyX2J5dGUoKmJ1Zik7CisJICAgIHRyc19sZW4gPSAoaW50KVNUUkxFTih0cnMpOworCSAgICBpZiAodHJzX2xlbiA+IDEpCisJICAgIHsKKwkJcm9vbSAtPSB0cnNfbGVuIC0gMTsKKwkJaWYgKHJvb20gPD0gMCkKKwkJICAgIHJldHVybjsKKwkJbWNoX21lbW1vdmUoYnVmICsgdHJzX2xlbiwgYnVmICsgMSwgKHNpemVfdClsZW4pOworCSAgICB9CisJICAgIG1jaF9tZW1tb3ZlKGJ1ZiwgdHJzLCAoc2l6ZV90KXRyc19sZW4pOworCSAgICAtLWxlbjsKKwl9CisJYnVmICs9IHRyc19sZW47CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoRkVBVF9USVRMRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUcmFuc2xhdGUgYSBzdHJpbmcgaW50byBhbGxvY2F0ZWQgbWVtb3J5LCByZXBsYWNpbmcgc3BlY2lhbCBjaGFycyB3aXRoCisgKiBwcmludGFibGUgY2hhcnMuICBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgY2hhcl91ICoKK3RyYW5zc3RyKHMpCisgICAgY2hhcl91CSpzOworeworICAgIGNoYXJfdQkqcmVzOworICAgIGNoYXJfdQkqcDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsLCBsZW4sIGM7CisgICAgY2hhcl91CWhleGJ1ZlsxMV07CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorICAgIHsKKwkvKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCwgdGFraW5nIGFjY291bnQgb2YgdW5wcmludGFibGUKKwkgKiBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuICovCisJbGVuID0gMDsKKwlwID0gczsKKwl3aGlsZSAoKnAgIT0gTlVMKQorCXsKKwkgICAgaWYgKChsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkgPiAxKQorCSAgICB7CisJCWMgPSAoKm1iX3B0cjJjaGFyKShwKTsKKwkJcCArPSBsOworCQlpZiAodmltX2lzcHJpbnRjKGMpKQorCQkgICAgbGVuICs9IGw7CisJCWVsc2UKKwkJeworCQkgICAgdHJhbnNjaGFyX2hleChoZXhidWYsIGMpOworCQkgICAgbGVuICs9IFNUUkxFTihoZXhidWYpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWwgPSBieXRlMmNlbGxzKCpwKyspOworCQlpZiAobCA+IDApCisJCSAgICBsZW4gKz0gbDsKKwkJZWxzZQorCQkgICAgbGVuICs9IDQ7CS8qIGlsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAqLworCSAgICB9CisJfQorCXJlcyA9IGFsbG9jKCh1bnNpZ25lZCkobGVuICsgMSkpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlyZXMgPSBhbGxvYygodW5zaWduZWQpKHZpbV9zdHJzaXplKHMpICsgMSkpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICB7CisJKnJlcyA9IE5VTDsKKwlwID0gczsKKwl3aGlsZSAoKnAgIT0gTlVMKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKSA+IDEpCisJICAgIHsKKwkJYyA9ICgqbWJfcHRyMmNoYXIpKHApOworCQlpZiAodmltX2lzcHJpbnRjKGMpKQorCQkgICAgU1RSTkNBVChyZXMsIHAsIGwpOwkvKiBhcHBlbmQgcHJpbnRhYmxlIG11bHRpLWJ5dGUgY2hhciAqLworCQllbHNlCisJCSAgICB0cmFuc2NoYXJfaGV4KHJlcyArIFNUUkxFTihyZXMpLCBjKTsKKwkJcCArPSBsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlTVFJDQVQocmVzLCB0cmFuc2NoYXJfYnl0ZSgqcCsrKSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKEZFQVRfSU5TX0VYUEFORCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDb252ZXJ0IHRoZSBzdHJpbmcgInBbbGVuXSIgdG8gZG8gaWdub3JlLWNhc2UgY29tcGFyaW5nLiAgVXNlcyB0aGUgY3VycmVudAorICogbG9jYWxlLiAgUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIChOVUxMIGZvciBvdXQtb2YtbWVtb3J5KS4KKyAqLworICAgIGNoYXJfdSAqCitzdHJfZm9sZGNhc2Uoc3RyLCBsZW4pCisgICAgY2hhcl91CSpzdHI7CisgICAgaW50CQlsZW47Cit7CisgICAgZ2FycmF5X1QJZ2E7CisgICAgaW50CQlpOworCisjZGVmaW5lIEdBX0NIQVIoaSkgICgoY2hhcl91ICopZ2EuZ2FfZGF0YSlbaV0KKyNkZWZpbmUgR0FfUFRSKGkpICAgKChjaGFyX3UgKilnYS5nYV9kYXRhICsgaSkKKworICAgIC8qIENvcHkgInN0ciIgaW50byBhbGxvY2F0ZWQgbWVtb3J5LCB1bm1vZGlmaWVkLiAqLworICAgIGdhX2luaXQyKCZnYSwgMSwgMTApOworICAgIGlmIChnYV9ncm93KCZnYSwgbGVuICsgMSkgPT0gRkFJTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBtY2hfbWVtbW92ZShnYS5nYV9kYXRhLCBzdHIsIChzaXplX3QpbGVuKTsKKyAgICBHQV9DSEFSKGxlbikgPSBOVUw7CisgICAgZ2EuZ2FfbGVuID0gbGVuOworICAgIGdhLmdhX3Jvb20gLT0gbGVuOworCisgICAgLyogTWFrZSBlYWNoIGNoYXJhY3RlciBsb3dlciBjYXNlLiAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChHQV9DSEFSKGkpICE9IE5VTCkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChlbmNfdXRmOCB8fCAoaGFzX21ieXRlICYmIE1CX0JZVEUyTEVOKEdBX0NIQVIoaSkpID4gMSkpCisJeworCSAgICBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJaW50CWMsIGxjOworCisJCWMgPSB1dGZfcHRyMmNoYXIoR0FfUFRSKGkpKTsKKwkJbGMgPSB1dGZfdG9sb3dlcihjKTsKKwkJaWYgKGMgIT0gbGMpCisJCXsKKwkJICAgIGludAkgICAgb2wgPSB1dGZfY2hhcjJsZW4oYyk7CisJCSAgICBpbnQJICAgIG5sID0gdXRmX2NoYXIybGVuKGxjKTsKKworCQkgICAgLyogSWYgdGhlIGJ5dGUgbGVuZ3RoIGNoYW5nZXMgbmVlZCB0byBzaGlmdCB0aGUgZm9sbG93aW5nCisJCSAgICAgKiBjaGFyYWN0ZXJzIGZvcndhcmQgb3IgYmFja3dhcmQuICovCisJCSAgICBpZiAob2wgIT0gbmwpCisJCSAgICB7CisJCQlpZiAobmwgPiBvbCkKKwkJCSAgICBpZiAoZ2FfZ3JvdygmZ2EsIG5sIC0gb2wpID09IEZBSUwpCisJCQkgICAgeworCQkJCS8qIG91dCBvZiBtZW1vcnksIGtlZXAgb2xkIGNoYXIgKi8KKwkJCQlsYyA9IGM7CisJCQkJbmwgPSBvbDsKKwkJCSAgICB9CisJCQlpZiAob2wgIT0gbmwpCisJCQl7CisJCQkgICAgbWNoX21lbW1vdmUoR0FfUFRSKGkpICsgbmwsIEdBX1BUUihpKSArIG9sLAorCQkJCQkJICBTVFJMRU4oR0FfUFRSKGkpICsgb2wpICsgMSk7CisJCQkgICAgZ2EuZ2FfbGVuICs9IG5sIC0gb2w7CisJCQkgICAgZ2EuZ2Ffcm9vbSAtPSBubCAtIG9sOworCQkJfQorCQkgICAgfQorCQkgICAgKHZvaWQpdXRmX2NoYXIyYnl0ZXMobGMsIEdBX1BUUihpKSk7CisJCX0KKwkgICAgfQorCSAgICAvKiBza2lwIHRvIG5leHQgbXVsdGktYnl0ZSBjaGFyICovCisJICAgIGkgKz0gKCptYl9wdHIybGVuX2NoZWNrKShHQV9QVFIoaSkpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIEdBX0NIQVIoaSkgPSBUT0xPV0VSX0xPQyhHQV9DSEFSKGkpKTsKKwkgICAgKytpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gKGNoYXJfdSAqKWdhLmdhX2RhdGE7Cit9CisjZW5kaWYKKworLyoKKyAqIENhdGNoIDIyOiBjaGFydGFiW10gY2FuJ3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBvcHRpb25zIGFyZQorICogaW5pdGlhbGl6ZWQsIGFuZCBpbml0aWFsaXppbmcgb3B0aW9ucyBtYXkgY2F1c2UgdHJhbnNjaGFyKCkgdG8gYmUgY2FsbGVkIQorICogV2hlbiBjaGFydGFiX2luaXRpYWxpemVkID09IEZBTFNFIGRvbid0IHVzZSBjaGFydGFiW10uCisgKiBEb2VzIE5PVCB3b3JrIGZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMsIGMgbXVzdCBiZSA8PSAyNTUuCisgKiBBbHNvIGRvZXNuJ3Qgd29yayBmb3IgdGhlIGZpcnN0IGJ5dGUgb2YgYSBtdWx0aS1ieXRlLCAiYyIgbXVzdCBiZSBhCisgKiBjaGFyYWN0ZXIhCisgKi8KK3N0YXRpYyBjaGFyX3UJdHJhbnNjaGFyX2J1Zls3XTsKKworICAgIGNoYXJfdSAqCit0cmFuc2NoYXIoYykKKyAgICBpbnQJCWM7Cit7CisgICAgaW50CQkJaTsKKworICAgIGkgPSAwOworICAgIGlmIChJU19TUEVDSUFMKGMpKQkgICAgLyogc3BlY2lhbCBrZXkgY29kZSwgZGlzcGxheSBhcyB+QCBjaGFyICovCisgICAgeworCXRyYW5zY2hhcl9idWZbMF0gPSAnfic7CisJdHJhbnNjaGFyX2J1ZlsxXSA9ICdAJzsKKwlpID0gMjsKKwljID0gS19TRUNPTkQoYyk7CisgICAgfQorCisgICAgaWYgKCghY2hhcnRhYl9pbml0aWFsaXplZCAmJiAoCisjaWZkZWYgRUJDRElDCisJCSAgICAoYyA+PSA2NCAmJiBjIDwgMjU1KQorI2Vsc2UKKwkJICAgIChjID49ICcgJyAmJiBjIDw9ICd+JykKKyNlbmRpZgorI2lmZGVmIEZFQVRfRktNQVAKKwkJCXx8IEZfaXNjaGFyKGMpCisjZW5kaWYKKwkJKSkgfHwgKGMgPCAyNTYgJiYgdmltX2lzcHJpbnRjX3N0cmljdChjKSkpCisgICAgeworCS8qIHByaW50YWJsZSBjaGFyYWN0ZXIgKi8KKwl0cmFuc2NoYXJfYnVmW2ldID0gYzsKKwl0cmFuc2NoYXJfYnVmW2kgKyAxXSA9IE5VTDsKKyAgICB9CisgICAgZWxzZQorCXRyYW5zY2hhcl9ub25wcmludCh0cmFuc2NoYXJfYnVmICsgaSwgYyk7CisgICAgcmV0dXJuIHRyYW5zY2hhcl9idWY7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTGlrZSB0cmFuc2NoYXIoKSwgYnV0IGNhbGxlZCB3aXRoIGEgYnl0ZSBpbnN0ZWFkIG9mIGEgY2hhcmFjdGVyLiAgQ2hlY2tzCisgKiBmb3IgYW4gaWxsZWdhbCBVVEYtOCBieXRlLgorICovCisgICAgY2hhcl91ICoKK3RyYW5zY2hhcl9ieXRlKGMpCisgICAgaW50CQljOworeworICAgIGlmIChlbmNfdXRmOCAmJiBjID49IDB4ODApCisgICAgeworCXRyYW5zY2hhcl9ub25wcmludCh0cmFuc2NoYXJfYnVmLCBjKTsKKwlyZXR1cm4gdHJhbnNjaGFyX2J1ZjsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zY2hhcihjKTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVydCBub24tcHJpbnRhYmxlIGNoYXJhY3RlciB0byB0d28gb3IgbW9yZSBwcmludGFibGUgY2hhcmFjdGVycyBpbgorICogImJ1ZltdIi4gICJidWYiIG5lZWRzIHRvIGJlIGFibGUgdG8gaG9sZCBmaXZlIGJ5dGVzLgorICogRG9lcyBOT1Qgd29yayBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLCBjIG11c3QgYmUgPD0gMjU1LgorICovCisgICAgdm9pZAordHJhbnNjaGFyX25vbnByaW50KGJ1ZiwgYykKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWM7Cit7CisgICAgaWYgKGMgPT0gTkwpCisJYyA9IE5VTDsJCS8qIHdlIHVzZSBuZXdsaW5lIGluIHBsYWNlIG9mIGEgTlVMICovCisgICAgZWxzZSBpZiAoYyA9PSBDQVIgJiYgZ2V0X2ZpbGVmb3JtYXQoY3VyYnVmKSA9PSBFT0xfTUFDKQorCWMgPSBOTDsJCQkvKiB3ZSB1c2UgQ1IgaW4gcGxhY2Ugb2YgIE5MIGluIHRoaXMgY2FzZSAqLworCisgICAgaWYgKGR5X2ZsYWdzICYgRFlfVUhFWCkJCS8qICdkaXNwbGF5JyBoYXMgInVoZXgiICovCisJdHJhbnNjaGFyX2hleChidWYsIGMpOworCisjaWZkZWYgRUJDRElDCisgICAgLyogRm9yIEVCQ0RJQyBvbmx5IHRoZSBjaGFyYWN0ZXJzIDAtNjMgYW5kIDI1NSBhcmUgbm90IHByaW50YWJsZSAqLworICAgIGVsc2UgaWYgKEN0cmxDaGFyKGMpICE9IDAgfHwgYyA9PSBERUwpCisjZWxzZQorICAgIGVsc2UgaWYgKGMgPD0gMHg3ZikJCQkJLyogMHgwMCAtIDB4MWYgYW5kIDB4N2YgKi8KKyNlbmRpZgorICAgIHsKKwlidWZbMF0gPSAnXic7CisjaWZkZWYgRUJDRElDCisJaWYgKGMgPT0gREVMKQorCSAgICBidWZbMV0gPSAnPyc7CQkvKiBERUwgZGlzcGxheWVkIGFzIF4/ICovCisJZWxzZQorCSAgICBidWZbMV0gPSBDdHJsQ2hhcihjKTsKKyNlbHNlCisJYnVmWzFdID0gYyBeIDB4NDA7CQkvKiBERUwgZGlzcGxheWVkIGFzIF4/ICovCisjZW5kaWYKKworCWJ1ZlsyXSA9IE5VTDsKKyAgICB9CisjaWZkZWYgRkVBVF9NQllURQorICAgIGVsc2UgaWYgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkKKyAgICB7CisJdHJhbnNjaGFyX2hleChidWYsIGMpOworICAgIH0KKyNlbmRpZgorI2lmbmRlZiBFQkNESUMKKyAgICBlbHNlIGlmIChjID49ICcgJyArIDB4ODAgJiYgYyA8PSAnficgKyAweDgwKSAgICAvKiAweGEwIC0gMHhmZSAqLworICAgIHsKKwlidWZbMF0gPSAnfCc7CisJYnVmWzFdID0gYyAtIDB4ODA7CisJYnVmWzJdID0gTlVMOworICAgIH0KKyNlbHNlCisgICAgZWxzZSBpZiAoYyA8IDY0KQorICAgIHsKKwlidWZbMF0gPSAnfic7CisJYnVmWzFdID0gTWV0YUNoYXIoYyk7CisJYnVmWzJdID0gTlVMOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UJCQkJCSAgICAvKiAweDgwIC0gMHg5ZiBhbmQgMHhmZiAqLworICAgIHsKKwkvKgorCSAqIFRPRE86IEVCQ0RJQyBJIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMgY2hhcnMsIHNvIEkgZGlzcGxheQorCSAqIHRoZW0gYXMgJ34/JyBmb3Igbm93CisJICovCisJYnVmWzBdID0gJ34nOworI2lmZGVmIEVCQ0RJQworCWJ1ZlsxXSA9ICc/JzsJCQkvKiAweGZmIGRpc3BsYXllZCBhcyB+PyAqLworI2Vsc2UKKwlidWZbMV0gPSAoYyAtIDB4ODApIF4gMHg0MDsJLyogMHhmZiBkaXNwbGF5ZWQgYXMgfj8gKi8KKyNlbmRpZgorCWJ1ZlsyXSA9IE5VTDsKKyAgICB9Cit9CisKKyAgICB2b2lkCit0cmFuc2NoYXJfaGV4KGJ1ZiwgYykKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWM7Cit7CisgICAgaW50CQlpID0gMDsKKworICAgIGJ1ZlswXSA9ICc8JzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGMgPiAyNTUpCisgICAgeworCWJ1ZlsrK2ldID0gbnIyaGV4KCh1bnNpZ25lZCljID4+IDEyKTsKKwlidWZbKytpXSA9IG5yMmhleCgodW5zaWduZWQpYyA+PiA4KTsKKyAgICB9CisjZW5kaWYKKyAgICBidWZbKytpXSA9IG5yMmhleCgodW5zaWduZWQpYyA+PiA0KTsKKyAgICBidWZbKytpXSA9IG5yMmhleChjKTsKKyAgICBidWZbKytpXSA9ICc+JzsKKyAgICBidWZbKytpXSA9IE5VTDsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlIGxvd2VyIDQgYml0cyBvZiBieXRlICJjIiB0byBpdHMgaGV4IGNoYXJhY3Rlci4KKyAqIExvd2VyIGNhc2UgbGV0dGVycyBhcmUgdXNlZCB0byBhdm9pZCB0aGUgY29uZnVzaW9uIG9mIDxGMT4gYmVpbmcgMHhmMSBvcgorICogZnVuY3Rpb24ga2V5IDEuCisgKi8KKyAgICBzdGF0aWMgaW50CitucjJoZXgoYykKKyAgICBpbnQJCWM7Cit7CisgICAgaWYgKChjICYgMHhmKSA8PSA5KQorCXJldHVybiAoYyAmIDB4ZikgKyAnMCc7CisgICAgcmV0dXJuIChjICYgMHhmKSAtIDEwICsgJ2EnOworfQorCisvKgorICogUmV0dXJuIG51bWJlciBvZiBkaXNwbGF5IGNlbGxzIG9jY3VwaWVkIGJ5IGJ5dGUgImIiLgorICogQ2FsbGVyIG11c3QgbWFrZSBzdXJlIDAgPD0gYiA8PSAyNTUuCisgKiBGb3IgbXVsdGktYnl0ZSBtb2RlICJiIiBtdXN0IGJlIHRoZSBmaXJzdCBieXRlIG9mIGEgY2hhcmFjdGVyLgorICogQSBUQUIgaXMgY291bnRlZCBhcyB0d28gY2VsbHM6ICJeSSIuCisgKiBGb3IgVVRGLTggbW9kZSB0aGlzIHdpbGwgcmV0dXJuIDAgZm9yIGJ5dGVzID49IDB4ODAsIGJlY2F1c2UgdGhlIG51bWJlciBvZgorICogY2VsbHMgZGVwZW5kcyBvbiBmdXJ0aGVyIGJ5dGVzLgorICovCisgICAgaW50CitieXRlMmNlbGxzKGIpCisgICAgaW50CQliOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX3V0ZjggJiYgYiA+PSAweDgwKQorCXJldHVybiAwOworI2VuZGlmCisgICAgcmV0dXJuIChjaGFydGFiW2JdICYgQ1RfQ0VMTF9NQVNLKTsKK30KKworLyoKKyAqIFJldHVybiBudW1iZXIgb2YgZGlzcGxheSBjZWxscyBvY2N1cGllZCBieSBjaGFyYWN0ZXIgImMiLgorICogImMiIGNhbiBiZSBhIHNwZWNpYWwga2V5IChuZWdhdGl2ZSBudW1iZXIpIGluIHdoaWNoIGNhc2UgMyBvciA0IGlzIHJldHVybmVkLgorICogQSBUQUIgaXMgY291bnRlZCBhcyB0d28gY2VsbHM6ICJeSSIgb3IgZm91cjogIjwwOT4iLgorICovCisgICAgaW50CitjaGFyMmNlbGxzKGMpCisgICAgaW50CQljOworeworICAgIGlmIChJU19TUEVDSUFMKGMpKQorCXJldHVybiBjaGFyMmNlbGxzKEtfU0VDT05EKGMpKSArIDI7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChjID49IDB4ODApCisgICAgeworCS8qIFVURi04OiBhYm92ZSAweDgwIG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlICovCisJaWYgKGVuY191dGY4KQorCSAgICByZXR1cm4gdXRmX2NoYXIyY2VsbHMoYyk7CisJLyogREJDUzogZG91YmxlLWJ5dGUgbWVhbnMgZG91YmxlLXdpZHRoLCBleGNlcHQgZm9yIGV1Yy1qcCB3aXRoIGZpcnN0CisJICogYnl0ZSAweDhlICovCisJaWYgKGVuY19kYmNzICE9IDAgJiYgYyA+PSAweDEwMCkKKwl7CisJICAgIGlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgKCh1bnNpZ25lZCljID4+IDgpID09IDB4OGUpCisJCXJldHVybiAxOworCSAgICByZXR1cm4gMjsKKwl9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChjaGFydGFiW2MgJiAweGZmXSAmIENUX0NFTExfTUFTSyk7Cit9CisKKy8qCisgKiBSZXR1cm4gbnVtYmVyIG9mIGRpc3BsYXkgY2VsbHMgb2NjdXBpZWQgYnkgY2hhcmFjdGVyIGF0ICIqcCIuCisgKiBBIFRBQiBpcyBjb3VudGVkIGFzIHR3byBjZWxsczogIl5JIiBvciBmb3VyOiAiPDA5PiIuCisgKi8KKyAgICBpbnQKK3B0cjJjZWxscyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogRm9yIFVURi04IHdlIG5lZWQgdG8gbG9vayBhdCBtb3JlIGJ5dGVzIGlmIHRoZSBmaXJzdCBieXRlIGlzID49IDB4ODAuICovCisgICAgaWYgKGVuY191dGY4ICYmICpwID49IDB4ODApCisJcmV0dXJuIHV0Zl9wdHIyY2VsbHMocCk7CisgICAgLyogRm9yIERCQ1Mgd2UgY2FuIHRlbGwgdGhlIGNlbGwgY291bnQgZnJvbSB0aGUgZmlyc3QgYnl0ZS4gKi8KKyNlbmRpZgorICAgIHJldHVybiAoY2hhcnRhYlsqcF0gJiBDVF9DRUxMX01BU0spOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBzdHJpbmcgInMiIHdpbGwgdGFrZSBvbiB0aGUgc2NyZWVuLAorICogY291bnRpbmcgVEFCcyBhcyB0d28gY2hhcmFjdGVyczogIl5JIi4KKyAqLworICAgIGludAordmltX3N0cnNpemUocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgcmV0dXJuIHZpbV9zdHJuc2l6ZShzLCAoaW50KU1BWENPTCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0cmluZyAic1tsZW5dIiB3aWxsIHRha2Ugb24gdGhlIHNjcmVlbiwKKyAqIGNvdW50aW5nIFRBQnMgYXMgdHdvIGNoYXJhY3RlcnM6ICJeSSIuCisgKi8KKyAgICBpbnQKK3ZpbV9zdHJuc2l6ZShzLCBsZW4pCisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworeworICAgIGludAkJc2l6ZSA9IDA7CisKKyAgICB3aGlsZSAoKnMgIT0gTlVMICYmIC0tbGVuID49IDApCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50CSAgICBsID0gKCptYl9wdHIybGVuX2NoZWNrKShzKTsKKworCSAgICBzaXplICs9IHB0cjJjZWxscyhzKTsKKwkgICAgcyArPSBsOworCSAgICBsZW4gLT0gbCAtIDE7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBzaXplICs9IGJ5dGUyY2VsbHMoKnMrKyk7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyAnYycgd2lsbCB0YWtlIG9uIHRoZSBzY3JlZW4sIHRha2luZworICogaW50byBhY2NvdW50IHRoZSBzaXplIG9mIGEgdGFiLgorICogVXNlIGEgZGVmaW5lIHRvIG1ha2UgaXQgZmFzdCwgdGhpcyBpcyB1c2VkIHZlcnkgb2Z0ZW4hISEKKyAqIEFsc28gc2VlIGdldHZjb2woKSBiZWxvdy4KKyAqLworCisjZGVmaW5lIFJFVF9XSU5fQlVGX0NIQVJUQUJTSVpFKHdwLCBidWYsIHAsIGNvbCkgXAorICAgIGlmICgqKHApID09IFRBQiAmJiAoISh3cCktPndfcF9saXN0IHx8IGxjc190YWIxKSkgXAorICAgIHsgXAorCWludCB0czsgXAorCXRzID0gKGJ1ZiktPmJfcF90czsgXAorCXJldHVybiAoaW50KSh0cyAtIChjb2wgJSB0cykpOyBcCisgICAgfSBcCisgICAgZWxzZSBcCisJcmV0dXJuIHB0cjJjZWxscyhwKTsKKworI2lmIGRlZmluZWQoRkVBVF9WUkVQTEFDRSkgfHwgZGVmaW5lZChGRUFUX0VYX0VYVFJBKSB8fCBkZWZpbmVkKEZFQVRfR1VJKSBcCisJfHwgZGVmaW5lZChGRUFUX1ZJUlRVQUxFRElUKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGludAorY2hhcnRhYnNpemUocCwgY29sKQorICAgIGNoYXJfdQkqcDsKKyAgICBjb2xucl9UCWNvbDsKK3sKKyAgICBSRVRfV0lOX0JVRl9DSEFSVEFCU0laRShjdXJ3aW4sIGN1cmJ1ZiwgcCwgY29sKQorfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworICAgIHN0YXRpYyBpbnQKK3dpbl9jaGFydGFic2l6ZSh3cCwgcCwgY29sKQorICAgIHdpbl9UCSp3cDsKKyAgICBjaGFyX3UJKnA7CisgICAgY29sbnJfVAljb2w7Cit7CisgICAgUkVUX1dJTl9CVUZfQ0hBUlRBQlNJWkUod3AsIHdwLT53X2J1ZmZlciwgcCwgY29sKQorfQorI2VuZGlmCisKKy8qCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSBzdHJpbmcgJ3MnIHdpbGwgdGFrZSBvbiB0aGUgc2NyZWVuLAorICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgc2l6ZSBvZiBhIHRhYgorICovCisgICAgaW50CitsaW5ldGFic2l6ZShzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICBjb2xucl9UCWNvbCA9IDA7CisKKyAgICB3aGlsZSAoKnMgIT0gTlVMKQorCWNvbCArPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZzLCBjb2wpOworICAgIHJldHVybiAoaW50KWNvbDsKK30KKworLyoKKyAqIExpa2UgbGluZXRhYnNpemUoKSwgYnV0IGZvciBhIGdpdmVuIHdpbmRvdyBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9uZS4KKyAqLworICAgIGludAord2luX2xpbmV0YWJzaXplKHdwLCBwLCBsZW4pCisgICAgd2luX1QJKndwOworICAgIGNoYXJfdQkqcDsKKyAgICBjb2xucl9UCWxlbjsKK3sKKyAgICBjb2xucl9UCWNvbCA9IDA7CisgICAgY2hhcl91CSpzOworCisgICAgZm9yIChzID0gcDsgKnMgIT0gTlVMICYmIChsZW4gPT0gTUFYQ09MIHx8IHMgPCBwICsgbGVuKTsgKQorICAgIHsKKwljb2wgKz0gd2luX2xicl9jaGFydGFic2l6ZSh3cCwgcywgY29sLCBOVUxMKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpOworCWVsc2UKKyNlbmRpZgorCSAgICArK3M7CisgICAgfQorICAgIHJldHVybiAoaW50KWNvbDsKK30KKworLyoKKyAqIHJldHVybiBUUlVFIGlmICdjJyBpcyBhIG5vcm1hbCBpZGVudGlmaWVyIGNoYXJhY3RlcgorICogbGV0dGVycyBhbmQgY2hhcmFjdGVycyBmcm9tICdpc2lkZW50JyBvcHRpb24uCisgKi8KKyAgICBpbnQKK3ZpbV9pc0lEYyhjKQorICAgIGludCBjOworeworICAgIHJldHVybiAoYyA+IDAgJiYgYyA8IDB4MTAwICYmIChjaGFydGFiW2NdICYgQ1RfSURfQ0hBUikpOworfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgJ2MnIGlzIGEga2V5d29yZCBjaGFyYWN0ZXI6IExldHRlcnMgYW5kIGNoYXJhY3RlcnMgZnJvbQorICogJ2lza2V5d29yZCcgb3B0aW9uIGZvciBjdXJyZW50IGJ1ZmZlci4KKyAqIEZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgbWJfZ2V0X2NsYXNzKCkgaXMgdXNlZCAoYnVpbHRpbiBydWxlcykuCisgKi8KKyAgICBpbnQKK3ZpbV9pc3dvcmRjKGMpCisgICAgaW50IGM7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChjID49IDB4MTAwKQorICAgIHsKKwlpZiAoZW5jX2RiY3MgIT0gMCkKKwkgICAgcmV0dXJuIGRiY3NfY2xhc3MoKHVuc2lnbmVkKWMgPj4gOCwgYyAmIDB4ZmYpID49IDI7CisJaWYgKGVuY191dGY4KQorCSAgICByZXR1cm4gdXRmX2NsYXNzKGMpID49IDI7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChjID4gMCAmJiBjIDwgMHgxMDAgJiYgR0VUX0NIQVJUQUIoY3VyYnVmLCBjKSAhPSAwKTsKK30KKworLyoKKyAqIEp1c3QgbGlrZSB2aW1faXN3b3JkYygpIGJ1dCB1c2VzIGEgcG9pbnRlciB0byB0aGUgKG11bHRpLWJ5dGUpIGNoYXJhY3Rlci4KKyAqLworICAgIGludAordmltX2lzd29yZHAocCkKKyAgICBjaGFyX3UgKnA7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUgJiYgTUJfQllURTJMRU4oKnApID4gMSkKKwlyZXR1cm4gbWJfZ2V0X2NsYXNzKHApID49IDI7CisjZW5kaWYKKyAgICByZXR1cm4gR0VUX0NIQVJUQUIoY3VyYnVmLCAqcCkgIT0gMDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9TWU5fSEwpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgaW50Cit2aW1faXN3b3JkY19idWYocCwgYnVmKQorICAgIGNoYXJfdQkqcDsKKyAgICBidWZfVAkqYnVmOworeworIyBpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSAmJiBNQl9CWVRFMkxFTigqcCkgPiAxKQorCXJldHVybiBtYl9nZXRfY2xhc3MocCkgPj0gMjsKKyMgZW5kaWYKKyAgICByZXR1cm4gKEdFVF9DSEFSVEFCKGJ1ZiwgKnApICE9IDApOworfQorI2VuZGlmCisKKy8qCisgKiByZXR1cm4gVFJVRSBpZiAnYycgaXMgYSB2YWxpZCBmaWxlLW5hbWUgY2hhcmFjdGVyCisgKiBBc3N1bWUgY2hhcmFjdGVycyBhYm92ZSAweDEwMCBhcmUgdmFsaWQgKG11bHRpLWJ5dGUpLgorICovCisgICAgaW50Cit2aW1faXNmaWxlYyhjKQorICAgIGludAljOworeworICAgIHJldHVybiAoYyA+PSAweDEwMCB8fCAoYyA+IDAgJiYgKGNoYXJ0YWJbY10gJiBDVF9GTkFNRV9DSEFSKSkpOworfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgJ2MnIGlzIGEgcHJpbnRhYmxlIGNoYXJhY3RlcgorICogQXNzdW1lIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAgYXJlIHByaW50YWJsZSAobXVsdGktYnl0ZSksIGV4Y2VwdCBmb3IKKyAqIFVuaWNvZGUuCisgKi8KKyAgICBpbnQKK3ZpbV9pc3ByaW50YyhjKQorICAgIGludCBjOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX3V0ZjggJiYgYyA+PSAweDEwMCkKKwlyZXR1cm4gdXRmX3ByaW50YWJsZShjKTsKKyNlbmRpZgorICAgIHJldHVybiAoYyA+PSAweDEwMCB8fCAoYyA+IDAgJiYgKGNoYXJ0YWJbY10gJiBDVF9QUklOVF9DSEFSKSkpOworfQorCisvKgorICogU3RyaWN0IHZlcnNpb24gb2YgdmltX2lzcHJpbnRjKGMpLCBkb24ndCByZXR1cm4gVFJVRSBpZiAiYyIgaXMgdGhlIGhlYWQKKyAqIGJ5dGUgb2YgYSBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIuCisgKi8KKyAgICBpbnQKK3ZpbV9pc3ByaW50Y19zdHJpY3QoYykKKyAgICBpbnQJYzsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY19kYmNzICE9IDAgJiYgYyA8IDB4MTAwICYmIE1CX0JZVEUyTEVOKGMpID4gMSkKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHgxMDApCisJcmV0dXJuIHV0Zl9wcmludGFibGUoYyk7CisjZW5kaWYKKyAgICByZXR1cm4gKGMgPj0gMHgxMDAgfHwgKGMgPiAwICYmIChjaGFydGFiW2NdICYgQ1RfUFJJTlRfQ0hBUikpKTsKK30KKworLyoKKyAqIGxpa2UgY2hhcnRhYnNpemUoKSwgYnV0IGFsc28gY2hlY2sgZm9yIGxpbmUgYnJlYWtzIG9uIHRoZSBzY3JlZW4KKyAqLworICAgIGludAorbGJyX2NoYXJ0YWJzaXplKHMsIGNvbCkKKyAgICB1bnNpZ25lZCBjaGFyCSpzOworICAgIGNvbG5yX1QJCWNvbDsKK3sKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworICAgIGlmICghY3Vyd2luLT53X3BfbGJyICYmICpwX3NiciA9PSBOVUwpCisgICAgeworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChjdXJ3aW4tPndfcF93cmFwKQorCSAgICByZXR1cm4gd2luX25vbGJyX2NoYXJ0YWJzaXplKGN1cndpbiwgcywgY29sLCBOVUxMKTsKKyNlbmRpZgorCVJFVF9XSU5fQlVGX0NIQVJUQUJTSVpFKGN1cndpbiwgY3VyYnVmLCBzLCBjb2wpCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICB9CisgICAgcmV0dXJuIHdpbl9sYnJfY2hhcnRhYnNpemUoY3Vyd2luLCBzLCBjb2wsIE5VTEwpOworI2VuZGlmCit9CisKKy8qCisgKiBDYWxsIGxicl9jaGFydGFic2l6ZSgpIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyLgorICovCisgICAgaW50CitsYnJfY2hhcnRhYnNpemVfYWR2KHMsIGNvbCkKKyAgICBjaGFyX3UJKipzOworICAgIGNvbG5yX1QJY29sOworeworICAgIGludAkJcmV0dmFsOworCisgICAgcmV0dmFsID0gbGJyX2NoYXJ0YWJzaXplKCpzLCBjb2wpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorCSpzICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoKnMpOworICAgIGVsc2UKKyNlbmRpZgorCSsrKnM7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB2ZXJ5IG9mdGVuLCBrZWVwIGl0IGZhc3QhISEhCisgKgorICogSWYgImhlYWRwIiBub3QgTlVMTCwgc2V0ICpoZWFkcCB0byB0aGUgc2l6ZSBvZiB3aGF0IHdlIGZvciAnc2hvd2JyZWFrJworICogc3RyaW5nIGF0IHN0YXJ0IG9mIGxpbmUuICBXYXJuaW5nOiAqaGVhZHAgaXMgb25seSBzZXQgaWYgaXQncyBhIG5vbi16ZXJvCisgKiB2YWx1ZSwgaW5pdCB0byAwIGJlZm9yZSBjYWxsaW5nLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK3dpbl9sYnJfY2hhcnRhYnNpemUod3AsIHMsIGNvbCwgaGVhZHApCisgICAgd2luX1QJKndwOworICAgIGNoYXJfdQkqczsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBpbnQJCSpoZWFkcDsKK3sKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworICAgIGludAkJYzsKKyAgICBpbnQJCXNpemU7CisgICAgY29sbnJfVAljb2wyOworICAgIGNvbG5yX1QJY29sbWF4OworICAgIGludAkJYWRkZWQ7CisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCW1iX2FkZGVkID0gMDsKKyMgZWxzZQorIyAgZGVmaW5lIG1iX2FkZGVkIDAKKyMgZW5kaWYKKyAgICBpbnQJCW51bWJlcmV4dHJhOworICAgIGNoYXJfdQkqcHM7CisgICAgaW50CQl0YWJfY29yciA9ICgqcyA9PSBUQUIpOworCisgICAgLyoKKyAgICAgKiBObyAnbGluZWJyZWFrJyBhbmQgJ3Nob3dicmVhayc6IHJldHVybiBxdWlja2x5LgorICAgICAqLworICAgIGlmICghd3AtPndfcF9sYnIgJiYgKnBfc2JyID09IE5VTCkKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKHdwLT53X3Bfd3JhcCkKKwkgICAgcmV0dXJuIHdpbl9ub2xicl9jaGFydGFic2l6ZSh3cCwgcywgY29sLCBoZWFkcCk7CisjZW5kaWYKKwlSRVRfV0lOX0JVRl9DSEFSVEFCU0laRSh3cCwgd3AtPndfYnVmZmVyLCBzLCBjb2wpCisgICAgfQorCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICAvKgorICAgICAqIEZpcnN0IGdldCBub3JtYWwgc2l6ZSwgd2l0aG91dCAnbGluZWJyZWFrJworICAgICAqLworICAgIHNpemUgPSB3aW5fY2hhcnRhYnNpemUod3AsIHMsIGNvbCk7CisgICAgYyA9ICpzOworCisgICAgLyoKKyAgICAgKiBJZiAnbGluZWJyZWFrJyBzZXQgY2hlY2sgYXQgYSBibGFuayBiZWZvcmUgYSBub24tYmxhbmsgaWYgdGhlIGxpbmUKKyAgICAgKiBuZWVkcyBhIGJyZWFrIGhlcmUKKyAgICAgKi8KKyAgICBpZiAod3AtPndfcF9sYnIKKwkgICAgJiYgdmltX2lzYnJlYWsoYykKKwkgICAgJiYgIXZpbV9pc2JyZWFrKHNbMV0pCisJICAgICYmICF3cC0+d19wX2xpc3QKKwkgICAgJiYgd3AtPndfcF93cmFwCisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgICYmIHdwLT53X3dpZHRoICE9IDAKKyMgZW5kaWYKKyAgICAgICApCisgICAgeworCS8qCisJICogQ291bnQgYWxsIGNoYXJhY3RlcnMgZnJvbSBmaXJzdCBub24tYmxhbmsgYWZ0ZXIgYSBibGFuayB1cCB0byBuZXh0CisJICogbm9uLWJsYW5rIGFmdGVyIGEgYmxhbmsuCisJICovCisJbnVtYmVyZXh0cmEgPSB3aW5fY29sX29mZih3cCk7CisJY29sMiA9IGNvbDsKKwljb2xtYXggPSBXX1dJRFRIKHdwKSAtIG51bWJlcmV4dHJhOworCWlmIChjb2wgPj0gY29sbWF4KQorCSAgICBjb2xtYXggKz0gKCgoY29sIC0gY29sbWF4KQorCQkJLyAoY29sbWF4ICsgd2luX2NvbF9vZmYyKHdwKSkpICsgMSkKKwkJCSogKGNvbG1heCArIHdpbl9jb2xfb2ZmMih3cCkpOworCWZvciAoOzspCisJeworCSAgICBwcyA9IHM7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpOworCSAgICBlbHNlCisjIGVuZGlmCisJCSsrczsKKwkgICAgYyA9ICpzOworCSAgICBpZiAoIShjICE9IE5VTAorCQkgICAgJiYgKHZpbV9pc2JyZWFrKGMpCisJCQl8fCAoIXZpbV9pc2JyZWFrKGMpCisJCQkgICAgJiYgKGNvbDIgPT0gY29sIHx8ICF2aW1faXNicmVhaygqcHMpKSkpKSkKKwkJYnJlYWs7CisKKwkgICAgY29sMiArPSB3aW5fY2hhcnRhYnNpemUod3AsIHMsIGNvbDIpOworCSAgICBpZiAoY29sMiA+PSBjb2xtYXgpCQkvKiBkb2Vzbid0IGZpdCAqLworCSAgICB7CisJCXNpemUgPSBjb2xtYXggLSBjb2w7CisJCXRhYl9jb3JyID0gRkFMU0U7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGVsc2UgaWYgKGhhc19tYnl0ZSAmJiBzaXplID09IDIgJiYgTUJfQllURTJMRU4oKnMpID4gMQorCQkJCSAgICAmJiB3cC0+d19wX3dyYXAgJiYgaW5fd2luX2JvcmRlcih3cCwgY29sKSkKKyAgICB7CisJKytzaXplOwkJLyogQ291bnQgdGhlICI+IiBpbiB0aGUgbGFzdCBjb2x1bW4uICovCisJbWJfYWRkZWQgPSAxOworICAgIH0KKyMgZW5kaWYKKworICAgIC8qCisgICAgICogTWF5IGhhdmUgdG8gYWRkIHNvbWV0aGluZyBmb3IgJ3Nob3dicmVhaycgc3RyaW5nIGF0IHN0YXJ0IG9mIGxpbmUKKyAgICAgKiBTZXQgKmhlYWRwIHRvIHRoZSBzaXplIG9mIHdoYXQgd2UgYWRkLgorICAgICAqLworICAgIGFkZGVkID0gMDsKKyAgICBpZiAoKnBfc2JyICE9IE5VTCAmJiB3cC0+d19wX3dyYXAgJiYgY29sICE9IDApCisgICAgeworCW51bWJlcmV4dHJhID0gd2luX2NvbF9vZmYod3ApOworCWNvbCArPSBudW1iZXJleHRyYSArIG1iX2FkZGVkOworCWlmIChjb2wgPj0gKGNvbG5yX1QpV19XSURUSCh3cCkpCisJeworCSAgICBjb2wgLT0gV19XSURUSCh3cCk7CisJICAgIG51bWJlcmV4dHJhID0gV19XSURUSCh3cCkgLSAobnVtYmVyZXh0cmEgLSB3aW5fY29sX29mZjIod3ApKTsKKwkgICAgaWYgKG51bWJlcmV4dHJhID4gMCkKKwkJY29sID0gY29sICUgbnVtYmVyZXh0cmE7CisJfQorCWlmIChjb2wgPT0gMCB8fCBjb2wgKyBzaXplID4gKGNvbG5yX1QpV19XSURUSCh3cCkpCisJeworCSAgICBhZGRlZCA9IHZpbV9zdHJzaXplKHBfc2JyKTsKKwkgICAgaWYgKHRhYl9jb3JyKQorCQlzaXplICs9IChhZGRlZCAvIHdwLT53X2J1ZmZlci0+Yl9wX3RzKSAqIHdwLT53X2J1ZmZlci0+Yl9wX3RzOworCSAgICBlbHNlCisJCXNpemUgKz0gYWRkZWQ7CisJICAgIGlmIChjb2wgIT0gMCkKKwkJYWRkZWQgPSAwOworCX0KKyAgICB9CisgICAgaWYgKGhlYWRwICE9IE5VTEwpCisJKmhlYWRwID0gYWRkZWQgKyBtYl9hZGRlZDsKKyAgICByZXR1cm4gc2l6ZTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIExpa2Ugd2luX2xicl9jaGFydGFic2l6ZSgpLCBleGNlcHQgdGhhdCB3ZSBrbm93ICdsaW5lYnJlYWsnIGlzIG9mZiBhbmQKKyAqICd3cmFwJyBpcyBvbi4gIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBjaGVjayBmb3IgYSBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIgdGhhdAorICogZG9lc24ndCBmaXQgYXQgdGhlIGVuZCBvZiB0aGUgc2NyZWVuIGxpbmUuCisgKi8KKyAgICBzdGF0aWMgaW50Cit3aW5fbm9sYnJfY2hhcnRhYnNpemUod3AsIHMsIGNvbCwgaGVhZHApCisgICAgd2luX1QJKndwOworICAgIGNoYXJfdQkqczsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBpbnQJCSpoZWFkcDsKK3sKKyAgICBpbnQJCW47CisKKyAgICBpZiAoKnMgPT0gVEFCICYmICghd3AtPndfcF9saXN0IHx8IGxjc190YWIxKSkKKyAgICB7CisJbiA9IHdwLT53X2J1ZmZlci0+Yl9wX3RzOworCXJldHVybiAoaW50KShuIC0gKGNvbCAlIG4pKTsKKyAgICB9CisgICAgbiA9IHB0cjJjZWxscyhzKTsKKyAgICAvKiBBZGQgb25lIGNlbGwgZm9yIGEgZG91YmxlLXdpZHRoIGNoYXJhY3RlciBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlCisgICAgICogd2luZG93LCBkaXNwbGF5ZWQgd2l0aCBhICI+Ii4gKi8KKyAgICBpZiAobiA9PSAyICYmIE1CX0JZVEUyTEVOKCpzKSA+IDEgJiYgaW5fd2luX2JvcmRlcih3cCwgY29sKSkKKyAgICB7CisJaWYgKGhlYWRwICE9IE5VTEwpCisJICAgICpoZWFkcCA9IDE7CisJcmV0dXJuIDM7CisgICAgfQorICAgIHJldHVybiBuOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdmlydHVhbCBjb2x1bW4gInZjb2wiIGlzIGluIHRoZSByaWdodG1vc3QgY29sdW1uIG9mIHdpbmRvdworICogIndwIi4KKyAqLworICAgIGludAoraW5fd2luX2JvcmRlcih3cCwgdmNvbCkKKyAgICB3aW5fVAkqd3A7CisgICAgY29sbnJfVAl2Y29sOworeworICAgIGNvbG5yX1QJd2lkdGgxOwkJLyogd2lkdGggb2YgZmlyc3QgbGluZSAoYWZ0ZXIgbGluZSBudW1iZXIpICovCisgICAgY29sbnJfVAl3aWR0aDI7CQkvKiB3aWR0aCBvZiBmdXJ0aGVyIGxpbmVzICovCisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmICh3cC0+d193aWR0aCA9PSAwKQkvKiB0aGVyZSBpcyBubyBib3JkZXIgKi8KKwlyZXR1cm4gRkFMU0U7CisjZW5kaWYKKyAgICB3aWR0aDEgPSBXX1dJRFRIKHdwKSAtIHdpbl9jb2xfb2ZmKHdwKTsKKyAgICBpZiAodmNvbCA8IHdpZHRoMSAtIDEpCisJcmV0dXJuIEZBTFNFOworICAgIGlmICh2Y29sID09IHdpZHRoMSAtIDEpCisJcmV0dXJuIFRSVUU7CisgICAgd2lkdGgyID0gd2lkdGgxICsgd2luX2NvbF9vZmYyKHdwKTsKKyAgICByZXR1cm4gKCh2Y29sIC0gd2lkdGgxKSAlIHdpZHRoMiA9PSB3aWR0aDIgLSAxKTsKK30KKyNlbmRpZiAvKiBGRUFUX01CWVRFICovCisKKy8qCisgKiBHZXQgdmlydHVhbCBjb2x1bW4gbnVtYmVyIG9mIHBvcy4KKyAqICBzdGFydDogb24gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoaXMgY2hhcmFjdGVyIChUQUIsIGN0cmwpCisgKiBjdXJzb3I6IHdoZXJlIHRoZSBjdXJzb3IgaXMgb24gdGhpcyBjaGFyYWN0ZXIgKGZpcnN0IGNoYXIsIGV4Y2VwdCBmb3IgVEFCKQorICogICAgZW5kOiBvbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGlzIGNoYXJhY3RlciAoVEFCLCBjdHJsKQorICoKKyAqIFRoaXMgaXMgdXNlZCB2ZXJ5IG9mdGVuLCBrZWVwIGl0IGZhc3QhCisgKi8KKyAgICB2b2lkCitnZXR2Y29sKHdwLCBwb3MsIHN0YXJ0LCBjdXJzb3IsIGVuZCkKKyAgICB3aW5fVAkqd3A7CisgICAgcG9zX1QJKnBvczsKKyAgICBjb2xucl9UCSpzdGFydDsKKyAgICBjb2xucl9UCSpjdXJzb3I7CisgICAgY29sbnJfVAkqZW5kOworeworICAgIGNvbG5yX1QJdmNvbDsKKyAgICBjaGFyX3UJKnB0cjsJCS8qIHBvaW50cyB0byBjdXJyZW50IGNoYXIgKi8KKyAgICBjaGFyX3UJKnBvc3B0cjsJLyogcG9pbnRzIHRvIGNoYXIgYXQgcG9zLT5jb2wgKi8KKyAgICBpbnQJCWluY3I7CisgICAgaW50CQloZWFkOworICAgIGludAkJdHMgPSB3cC0+d19idWZmZXItPmJfcF90czsKKyAgICBpbnQJCWM7CisKKyAgICB2Y29sID0gMDsKKyAgICBwdHIgPSBtbF9nZXRfYnVmKHdwLT53X2J1ZmZlciwgcG9zLT5sbnVtLCBGQUxTRSk7CisgICAgcG9zcHRyID0gcHRyICsgcG9zLT5jb2w7CisKKyAgICAvKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB2ZXJ5IG9mdGVuLCBkbyBzb21lIHNwZWVkIG9wdGltaXphdGlvbnMuCisgICAgICogV2hlbiAnbGlzdCcsICdsaW5lYnJlYWsnIGFuZCAnc2hvd2JyZWFrJyBhcmUgbm90IHNldCB1c2UgYSBzaW1wbGUgbG9vcC4KKyAgICAgKiBBbHNvIHVzZSB0aGlzIHdoZW4gJ2xpc3QnIGlzIHNldCBidXQgdGFicyB0YWtlIHRoZWlyIG5vcm1hbCBzaXplLgorICAgICAqLworICAgIGlmICgoIXdwLT53X3BfbGlzdCB8fCBsY3NfdGFiMSAhPSBOVUwpCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkgICAgJiYgIXdwLT53X3BfbGJyICYmICpwX3NiciA9PSBOVUwKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisjaWZuZGVmIEZFQVRfTUJZVEUKKwloZWFkID0gMDsKKyNlbmRpZgorCWZvciAoOzspCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaGVhZCA9IDA7CisjZW5kaWYKKwkgICAgYyA9ICpwdHI7CisJICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkgICAgaWYgKGMgPT0gTlVMKQorCSAgICB7CisJCWluY3IgPSAxOwkvKiBOVUwgYXQgZW5kIG9mIGxpbmUgb25seSB0YWtlcyBvbmUgY29sdW1uICovCisJCWJyZWFrOworCSAgICB9CisJICAgIC8qIEEgdGFiIGdldHMgZXhwYW5kZWQsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gKi8KKwkgICAgaWYgKGMgPT0gVEFCKQorCQlpbmNyID0gdHMgLSAodmNvbCAlIHRzKTsKKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQl7CisJCSAgICAvKiBGb3IgdXRmLTgsIGlmIHRoZSBieXRlIGlzID49IDB4ODAsIG5lZWQgdG8gbG9vayBhdAorCQkgICAgICogZnVydGhlciBieXRlcyB0byBmaW5kIHRoZSBjZWxsIHdpZHRoLiAqLworCQkgICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkKKwkJCWluY3IgPSB1dGZfcHRyMmNlbGxzKHB0cik7CisJCSAgICBlbHNlCisJCQlpbmNyID0gQ0hBUlNJWkUoYyk7CisKKwkJICAgIC8qIElmIGEgZG91YmxlLWNlbGwgY2hhciBkb2Vzbid0IGZpdCBhdCB0aGUgZW5kIG9mIGEgbGluZQorCQkgICAgICogaXQgd3JhcHMgdG8gdGhlIG5leHQgbGluZSwgaXQncyBsaWtlIHRoaXMgY2hhciBpcyB0aHJlZQorCQkgICAgICogY2VsbHMgd2lkZS4gKi8KKwkJICAgIGlmIChpbmNyID09IDIgJiYgd3AtPndfcF93cmFwICYmIGluX3dpbl9ib3JkZXIod3AsIHZjb2wpKQorCQkgICAgeworCQkJKytpbmNyOworCQkJaGVhZCA9IDE7CisJCSAgICB9CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCSAgICBpbmNyID0gQ0hBUlNJWkUoYyk7CisJICAgIH0KKworCSAgICBpZiAocHRyID49IHBvc3B0cikJLyogY2hhcmFjdGVyIGF0IHBvcy0+Y29sICovCisJCWJyZWFrOworCisJICAgIHZjb2wgKz0gaW5jcjsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXB0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cik7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3B0cjsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIC8qIEEgdGFiIGdldHMgZXhwYW5kZWQsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gKi8KKwkgICAgaGVhZCA9IDA7CisJICAgIGluY3IgPSB3aW5fbGJyX2NoYXJ0YWJzaXplKHdwLCBwdHIsIHZjb2wsICZoZWFkKTsKKwkgICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCSAgICBpZiAoKnB0ciA9PSBOVUwpCisJICAgIHsKKwkJaW5jciA9IDE7CS8qIE5VTCBhdCBlbmQgb2YgbGluZSBvbmx5IHRha2VzIG9uZSBjb2x1bW4gKi8KKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBpZiAocHRyID49IHBvc3B0cikJLyogY2hhcmFjdGVyIGF0IHBvcy0+Y29sICovCisJCWJyZWFrOworCisJICAgIHZjb2wgKz0gaW5jcjsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXB0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cik7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3B0cjsKKwl9CisgICAgfQorICAgIGlmIChzdGFydCAhPSBOVUxMKQorCSpzdGFydCA9IHZjb2wgKyBoZWFkOworICAgIGlmIChlbmQgIT0gTlVMTCkKKwkqZW5kID0gdmNvbCArIGluY3IgLSAxOworICAgIGlmIChjdXJzb3IgIT0gTlVMTCkKKyAgICB7CisJaWYgKCpwdHIgPT0gVEFCCisJCSYmIChTdGF0ZSAmIE5PUk1BTCkKKwkJJiYgIXdwLT53X3BfbGlzdAorCQkmJiAhdmlydHVhbF9hY3RpdmUoKQorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICEoVklzdWFsX2FjdGl2ZQorCQkJCSAgICYmICgqcF9zZWwgPT0gJ2UnIHx8IGx0b3JlcSgqcG9zLCBWSXN1YWwpKSkKKyNlbmRpZgorCQkpCisJICAgICpjdXJzb3IgPSB2Y29sICsgaW5jciAtIDE7CSAgICAvKiBjdXJzb3IgYXQgZW5kICovCisJZWxzZQorCSAgICAqY3Vyc29yID0gdmNvbCArIGhlYWQ7CSAgICAvKiBjdXJzb3IgYXQgc3RhcnQgKi8KKyAgICB9Cit9CisKKy8qCisgKiBHZXQgdmlydHVhbCBjdXJzb3IgY29sdW1uIGluIHRoZSBjdXJyZW50IHdpbmRvdywgcHJldGVuZGluZyAnbGlzdCcgaXMgb2ZmLgorICovCisgICAgY29sbnJfVAorZ2V0dmNvbF9ub2xpc3QocG9zcCkKKyAgICBwb3NfVAkqcG9zcDsKK3sKKyAgICBpbnQJCWxpc3Rfc2F2ZSA9IGN1cndpbi0+d19wX2xpc3Q7CisgICAgY29sbnJfVAl2Y29sOworCisgICAgY3Vyd2luLT53X3BfbGlzdCA9IEZBTFNFOworICAgIGdldHZjb2woY3Vyd2luLCBwb3NwLCBOVUxMLCAmdmNvbCwgTlVMTCk7CisgICAgY3Vyd2luLT53X3BfbGlzdCA9IGxpc3Rfc2F2ZTsKKyAgICByZXR1cm4gdmNvbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9WSVJUVUFMRURJVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgdmlydHVhbCBjb2x1bW4gaW4gdmlydHVhbCBtb2RlLgorICovCisgICAgdm9pZAorZ2V0dnZjb2wod3AsIHBvcywgc3RhcnQsIGN1cnNvciwgZW5kKQorICAgIHdpbl9UCSp3cDsKKyAgICBwb3NfVAkqcG9zOworICAgIGNvbG5yX1QJKnN0YXJ0OworICAgIGNvbG5yX1QJKmN1cnNvcjsKKyAgICBjb2xucl9UCSplbmQ7Cit7CisgICAgY29sbnJfVAljb2w7CisgICAgY29sbnJfVAljb2xhZGQ7CisgICAgY29sbnJfVAllbmRhZGQ7CisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJKnB0cjsKKyMgZW5kaWYKKworICAgIGlmICh2aXJ0dWFsX2FjdGl2ZSgpKQorICAgIHsKKwkvKiBGb3IgdmlydHVhbCBtb2RlLCBvbmx5IHdhbnQgb25lIHZhbHVlICovCisJZ2V0dmNvbCh3cCwgcG9zLCAmY29sLCBOVUxMLCBOVUxMKTsKKworCWNvbGFkZCA9IHBvcy0+Y29sYWRkOworCWVuZGFkZCA9IDA7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkvKiBDYW5ub3QgcHV0IHRoZSBjdXJzb3Igb24gcGFydCBvZiBhIHdpZGUgY2hhcmFjdGVyLiAqLworCXB0ciA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBwb3MtPmxudW0sIEZBTFNFKTsKKwlpZiAocG9zLT5jb2wgPCBTVFJMRU4ocHRyKSkKKwl7CisJICAgIGludCBjID0gKCptYl9wdHIyY2hhcikocHRyICsgcG9zLT5jb2wpOworCisJICAgIGlmIChjICE9IFRBQiAmJiB2aW1faXNwcmludGMoYykpCisJICAgIHsKKwkJZW5kYWRkID0gY2hhcjJjZWxscyhjKSAtIDE7CisJCWlmIChjb2xhZGQgPj0gZW5kYWRkKQorCQkgICAgY29sYWRkIC09IGVuZGFkZDsKKwkJZWxzZQorCQkgICAgY29sYWRkID0gMDsKKwkgICAgfQorCX0KKyMgZW5kaWYKKwljb2wgKz0gY29sYWRkOworCWlmIChzdGFydCAhPSBOVUxMKQorCSAgICAqc3RhcnQgPSBjb2w7CisJaWYgKGN1cnNvciAhPSBOVUxMKQorCSAgICAqY3Vyc29yID0gY29sOworCWlmIChlbmQgIT0gTlVMTCkKKwkgICAgKmVuZCA9IGNvbCArIGVuZGFkZDsKKyAgICB9CisgICAgZWxzZQorCWdldHZjb2wod3AsIHBvcywgc3RhcnQsIGN1cnNvciwgZW5kKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1ZJU1VBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgdGhlIGxlZnRtb3N0IGFuZCByaWdodG1vc3QgdmlydHVhbCBjb2x1bW4gb2YgcG9zMSBhbmQgcG9zMi4KKyAqIFVzZWQgZm9yIFZpc3VhbCBibG9jayBtb2RlLgorICovCisgICAgdm9pZAorZ2V0dmNvbHMod3AsIHBvczEsIHBvczIsIGxlZnQsIHJpZ2h0KQorICAgIHdpbl9UCSp3cDsKKyAgICBwb3NfVAkqcG9zMSwgKnBvczI7CisgICAgY29sbnJfVAkqbGVmdCwgKnJpZ2h0OworeworICAgIGNvbG5yX1QJZnJvbTEsIGZyb20yLCB0bzEsIHRvMjsKKworICAgIGlmIChsdHAocG9zMSwgcG9zMikpCisgICAgeworCWdldHZ2Y29sKHdwLCBwb3MxLCAmZnJvbTEsIE5VTEwsICZ0bzEpOworCWdldHZ2Y29sKHdwLCBwb3MyLCAmZnJvbTIsIE5VTEwsICZ0bzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWdldHZ2Y29sKHdwLCBwb3MyLCAmZnJvbTEsIE5VTEwsICZ0bzEpOworCWdldHZ2Y29sKHdwLCBwb3MxLCAmZnJvbTIsIE5VTEwsICZ0bzIpOworICAgIH0KKyAgICBpZiAoZnJvbTIgPCBmcm9tMSkKKwkqbGVmdCA9IGZyb20yOworICAgIGVsc2UKKwkqbGVmdCA9IGZyb20xOworICAgIGlmICh0bzIgPiB0bzEpCisgICAgeworCWlmICgqcF9zZWwgPT0gJ2UnICYmIGZyb20yIC0gMSA+PSB0bzEpCisJICAgICpyaWdodCA9IGZyb20yIC0gMTsKKwllbHNlCisJICAgICpyaWdodCA9IHRvMjsKKyAgICB9CisgICAgZWxzZQorCSpyaWdodCA9IHRvMTsKK30KKyNlbmRpZgorCisvKgorICogc2tpcHdoaXRlOiBza2lwIG92ZXIgJyAnIGFuZCAnXHQnLgorICovCisgICAgY2hhcl91ICoKK3NraXB3aGl0ZShwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICB3aGlsZSAodmltX2lzd2hpdGUoKnApKSAvKiBza2lwIHRvIG5leHQgbm9uLXdoaXRlICovCisJKytwOworICAgIHJldHVybiBwOworfQorCisvKgorICogc2tpcGRpZ2l0czogc2tpcCBvdmVyIGRpZ2l0czsKKyAqLworICAgIGNoYXJfdSAqCitza2lwZGlnaXRzKHApCisgICAgY2hhcl91CSpwOworeworICAgIHdoaWxlIChWSU1fSVNESUdJVCgqcCkpCS8qIHNraXAgdG8gbmV4dCBub24tZGlnaXQgKi8KKwkrK3A7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBWYXJpYW50IG9mIGlzZGlnaXQoKSB0aGF0IGNhbiBoYW5kbGUgY2hhcmFjdGVycyA+IDB4MTAwLgorICogV2UgZG9uJ3QgdXNlIGlzZGlnaXQoKSBoZXJlLCBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyBpdCBhbHNvIGNvbnNpZGVycworICogc3VwZXJzY3JpcHQgMSB0byBiZSBhIGRpZ2l0LgorICogVXNlIHRoZSBWSU1fSVNESUdJVCgpIG1hY3JvIGZvciBzaW1wbGUgYXJndW1lbnRzLgorICovCisgICAgaW50Cit2aW1faXNkaWdpdChjKQorICAgIGludAkJYzsKK3sKKyAgICByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknKTsKK30KKworLyoKKyAqIFZhcmlhbnQgb2YgaXN4ZGlnaXQoKSB0aGF0IGNhbiBoYW5kbGUgY2hhcmFjdGVycyA+IDB4MTAwLgorICogV2UgZG9uJ3QgdXNlIGlzeGRpZ2l0KCkgaGVyZSwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgYWxzbyBjb25zaWRlcnMKKyAqIHN1cGVyc2NyaXB0IDEgdG8gYmUgYSBkaWdpdC4KKyAqLworICAgIGludAordmltX2lzeGRpZ2l0KGMpCisgICAgaW50CQljOworeworICAgIHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCXx8IChjID49ICdBJyAmJiBjIDw9ICdGJyk7Cit9CisKKy8qCisgKiBza2lwdG93aGl0ZTogc2tpcCBvdmVyIHRleHQgdW50aWwgJyAnIG9yICdcdCcgb3IgTlVMLgorICovCisgICAgY2hhcl91ICoKK3NraXB0b3doaXRlKHApCisgICAgY2hhcl91CSpwOworeworICAgIHdoaWxlICgqcCAhPSAnICcgJiYgKnAgIT0gJ1x0JyAmJiAqcCAhPSBOVUwpCisJKytwOworICAgIHJldHVybiBwOworfQorCisjaWYgZGVmaW5lZChGRUFUX0xJU1RDTURTKSB8fCBkZWZpbmVkKEZFQVRfU0lHTlMpIHx8IGRlZmluZWQoRkVBVF9TTklGRikgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogc2tpcHRvd2hpdGVfZXNjOiBMaWtlIHNraXB0b3doaXRlKCksIGJ1dCBhbHNvIHNraXAgZXNjYXBlZCBjaGFycworICovCisgICAgY2hhcl91ICoKK3NraXB0b3doaXRlX2VzYyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcgJiYgKnAgIT0gTlVMKQorICAgIHsKKwlpZiAoKCpwID09ICdcXCcgfHwgKnAgPT0gQ3RybF9WKSAmJiAqKHAgKyAxKSAhPSBOVUwpCisJICAgICsrcDsKKwkrK3A7CisgICAgfQorICAgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qCisgKiBHZXRkaWdpdHM6IEdldCBhIG51bWJlciBmcm9tIGEgc3RyaW5nIGFuZCBza2lwIG92ZXIgaXQuCisgKiBOb3RlOiB0aGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgY2hhcl91IHBvaW50ZXIhCisgKi8KKyAgICBsb25nCitnZXRkaWdpdHMocHApCisgICAgY2hhcl91ICoqcHA7Cit7CisgICAgY2hhcl91CSpwOworICAgIGxvbmcJcmV0dmFsOworCisgICAgcCA9ICpwcDsKKyAgICByZXR2YWwgPSBhdG9sKChjaGFyICopcCk7CisgICAgaWYgKCpwID09ICctJykJCS8qIHNraXAgbmVnYXRpdmUgc2lnbiAqLworCSsrcDsKKyAgICBwID0gc2tpcGRpZ2l0cyhwKTsJCS8qIHNraXAgdG8gbmV4dCBub24tZGlnaXQgKi8KKyAgICAqcHAgPSBwOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAibGJ1ZiIgaXMgZW1wdHkgb3Igb25seSBjb250YWlucyBibGFua3MuCisgKi8KKyAgICBpbnQKK3ZpbV9pc2JsYW5rbGluZShsYnVmKQorICAgIGNoYXJfdQkqbGJ1ZjsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBwID0gc2tpcHdoaXRlKGxidWYpOworICAgIHJldHVybiAoKnAgPT0gTlVMIHx8ICpwID09ICdccicgfHwgKnAgPT0gJ1xuJyk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYSBsb25nIGFuZC9vciB1bnNpZ25lZCBsb25nLCB0YWtpbmcgY2FyZSBvZgorICogaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMuCisgKiBJZiAiaGV4cCIgaXMgbm90IE5VTEwsIHJldHVybnMgYSBmbGFnIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIHRoZSBudW1iZXI6CisgKiAgMAkgICAgZGVjaW1hbAorICogICcwJwkgICAgb2N0YWwKKyAqICAnWCcJICAgIGhleAorICogICd4JwkgICAgaGV4CisgKiBJZiAibGVuIiBpcyBub3QgTlVMTCwgdGhlIGxlbmd0aCBvZiB0aGUgbnVtYmVyIGluIGNoYXJhY3RlcnMgaXMgcmV0dXJuZWQuCisgKiBJZiAibnB0ciIgaXMgbm90IE5VTEwsIHRoZSBzaWduZWQgcmVzdWx0IGlzIHJldHVybmVkIGluIGl0LgorICogSWYgInVucHRyIiBpcyBub3QgTlVMTCwgdGhlIHVuc2lnbmVkIHJlc3VsdCBpcyByZXR1cm5lZCBpbiBpdC4KKyAqLworICAgIHZvaWQKK3ZpbV9zdHIybnIoc3RhcnQsIGhleHAsIGxlbiwgZG9vY3QsIGRvaGV4LCBucHRyLCB1bnB0cikKKyAgICBjaGFyX3UJCSpzdGFydDsKKyAgICBpbnQJCQkqaGV4cDsJICAgIC8qIHJldHVybjogdHlwZSBvZiBudW1iZXIgMCA9IGRlY2ltYWwsICd4JworCQkJCSAgICAgICBvciAnWCcgaXMgaGV4LCAnMCcgPSBvY3RhbCAqLworICAgIGludAkJCSpsZW47CSAgICAvKiByZXR1cm46IGRldGVjdGVkIGxlbmd0aCBvZiBudW1iZXIgKi8KKyAgICBpbnQJCQlkb29jdDsJICAgIC8qIHJlY29nbml6ZSBvY3RhbCBudW1iZXIgKi8KKyAgICBpbnQJCQlkb2hleDsJICAgIC8qIHJlY29nbml6ZSBoZXggbnVtYmVyICovCisgICAgbG9uZwkJKm5wdHI7CSAgICAvKiByZXR1cm46IHNpZ25lZCByZXN1bHQgKi8KKyAgICB1bnNpZ25lZCBsb25nCSp1bnB0cjsJICAgIC8qIHJldHVybjogdW5zaWduZWQgcmVzdWx0ICovCit7CisgICAgY2hhcl91CSAgICAqcHRyID0gc3RhcnQ7CisgICAgaW50CQkgICAgaGV4ID0gMDsJCS8qIGRlZmF1bHQgaXMgZGVjaW1hbCAqLworICAgIGludAkJICAgIG5lZ2F0aXZlID0gRkFMU0U7CisgICAgbG9uZwkgICAgbiA9IDA7CisgICAgdW5zaWduZWQgbG9uZyAgIHVuID0gMDsKKworICAgIGlmIChwdHJbMF0gPT0gJy0nKQorICAgIHsKKwluZWdhdGl2ZSA9IFRSVUU7CisJKytwdHI7CisgICAgfQorCisgICAgaWYgKHB0clswXSA9PSAnMCcpCQkJLyogY291bGQgYmUgaGV4IG9yIG9jdGFsICovCisgICAgeworCWhleCA9IHB0clsxXTsKKwlpZiAoZG9oZXggJiYgKGhleCA9PSAnWCcgfHwgaGV4ID09ICd4JykgJiYgdmltX2lzeGRpZ2l0KHB0clsyXSkpCisJICAgIHB0ciArPSAyOwkJCS8qIGhleGFkZWNpbWFsICovCisJZWxzZQorCXsKKwkgICAgaWYgKGRvb2N0ICYmIFZJTV9JU0RJR0lUKGhleCkpCisJCWhleCA9ICcwJzsJCS8qIG9jdGFsICovCisJICAgIGVsc2UKKwkJaGV4ID0gMDsJCS8qIDAgYnkgaXRzZWxmIGlzIGRlY2ltYWwgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEbyB0aGUgc3RyaW5nLXRvLW51bWVyaWMgY29udmVyc2lvbiAibWFudWFsbHkiIHRvIGF2b2lkIHNzY2FuZiBxdWlya3MuCisgICAgICovCisgICAgaWYgKGhleCkKKyAgICB7CisJaWYgKGhleCA9PSAnMCcpCisJeworCSAgICAvKiBvY3RhbCAqLworCSAgICB3aGlsZSAoJzAnIDw9ICpwdHIgJiYgKnB0ciA8PSAnNycpCisJICAgIHsKKwkJbiA9IDggKiBuICsgKGxvbmcpKCpwdHIgLSAnMCcpOworCQl1biA9IDggKiB1biArICh1bnNpZ25lZCBsb25nKSgqcHRyIC0gJzAnKTsKKwkJKytwdHI7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLyogaGV4ICovCisJICAgIHdoaWxlICh2aW1faXN4ZGlnaXQoKnB0cikpCisJICAgIHsKKwkJbiA9IDE2ICogbiArIChsb25nKWhleDJucigqcHRyKTsKKwkJdW4gPSAxNiAqIHVuICsgKHVuc2lnbmVkIGxvbmcpaGV4Mm5yKCpwdHIpOworCQkrK3B0cjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBkZWNpbWFsICovCisJd2hpbGUgKFZJTV9JU0RJR0lUKCpwdHIpKQorCXsKKwkgICAgbiA9IDEwICogbiArIChsb25nKSgqcHRyIC0gJzAnKTsKKwkgICAgdW4gPSAxMCAqIHVuICsgKHVuc2lnbmVkIGxvbmcpKCpwdHIgLSAnMCcpOworCSAgICArK3B0cjsKKwl9CisgICAgfQorCisgICAgaWYgKCFoZXggJiYgbmVnYXRpdmUpICAgLyogYWNjb3VudCBmb3IgbGVhZGluZyAnLScgZm9yIGRlY2ltYWwgbnVtYmVycyAqLworCW4gPSAtbjsKKworICAgIGlmIChoZXhwICE9IE5VTEwpCisJKmhleHAgPSBoZXg7CisgICAgaWYgKGxlbiAhPSBOVUxMKQorCSpsZW4gPSAoaW50KShwdHIgLSBzdGFydCk7CisgICAgaWYgKG5wdHIgIT0gTlVMTCkKKwkqbnB0ciA9IG47CisgICAgaWYgKHVucHRyICE9IE5VTEwpCisJKnVucHRyID0gdW47Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGhleCBjaGFyYWN0ZXIuCisgKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGFyZ3VtZW50IGlzICcwJyAtICc5JywgJ0EnIC0gJ0YnIG9yICdhJyAtICdmJy4KKyAqLworICAgIGludAoraGV4Mm5yKGMpCisgICAgaW50CQljOworeworICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwlyZXR1cm4gYyAtICdhJyArIDEwOworICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwlyZXR1cm4gYyAtICdBJyArIDEwOworICAgIHJldHVybiBjIC0gJzAnOworfQorCisjaWYgZGVmaW5lZChGRUFUX1RFUk1SRVNQT05TRSkgXAorCXx8IChkZWZpbmVkKEZFQVRfR1VJX0dUSykgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENvbnZlcnQgdHdvIGhleCBjaGFyYWN0ZXJzIHRvIGEgYnl0ZS4KKyAqIFJldHVybiAtMSBpZiBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaXMgbm90IGhleC4KKyAqLworICAgIGludAoraGV4aGV4Mm5yKHApCisgICAgY2hhcl91CSpwOworeworICAgIGlmICghdmltX2lzeGRpZ2l0KHBbMF0pIHx8ICF2aW1faXN4ZGlnaXQocFsxXSkpCisJcmV0dXJuIC0xOworICAgIHJldHVybiAoaGV4Mm5yKHBbMF0pIDw8IDQpICsgaGV4Mm5yKHBbMV0pOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAic3RyIiBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaCB0aGF0IHNob3VsZCBiZSByZW1vdmVkLgorICogRm9yIE1TLURPUywgV0lOMzIgYW5kIE9TLzIgdGhpcyBpcyBvbmx5IGRvbmUgd2hlbiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZQorICogYmFja3NsYXNoIGlzIG5vdCBhIG5vcm1hbCBmaWxlIG5hbWUgY2hhcmFjdGVyLgorICogJyQnIGlzIGEgdmFsaWQgZmlsZSBuYW1lIGNoYXJhY3Rlciwgd2UgZG9uJ3QgcmVtb3ZlIHRoZSBiYWNrc2xhc2ggYmVmb3JlCisgKiBpdC4gIFRoaXMgbWVhbnMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhZnRlciBhCisgKiBiYWNrc2xhc2guICAiQzpcJFZJTVxkb2MiIGlzIHRha2VuIGxpdGVyYWxseSwgb25seSAiJFZJTVxkb2MiIHdvcmtzLgorICogQWx0aG91Z2ggIlwgbmFtZSIgaXMgdmFsaWQsIHRoZSBiYWNrc2xhc2ggaW4gIlByb2dyYW1cIGZpbGVzIiBtdXN0IGJlCisgKiByZW1vdmVkLiAgQXNzdW1lIGEgZmlsZSBuYW1lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHNwYWNlLgorICogRm9yIG11bHRpLWJ5dGUgbmFtZXMsIG5ldmVyIHJlbW92ZSBhIGJhY2tzbGFzaCBiZWZvcmUgYSBub24tYXNjaWkKKyAqIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgYWxsIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgZmlsZSBuYW1lCisgKiBjaGFyYWN0ZXJzLgorICovCisgICAgaW50CityZW1fYmFja3NsYXNoKHN0cikKKyAgICBjaGFyX3UgICpzdHI7Cit7CisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisgICAgcmV0dXJuIChzdHJbMF0gPT0gJ1xcJworIyBpZmRlZiBGRUFUX01CWVRFCisJICAgICYmIHN0clsxXSA8IDB4ODAKKyMgZW5kaWYKKwkgICAgJiYgKHN0clsxXSA9PSAnICcKKwkJfHwgKHN0clsxXSAhPSBOVUwKKwkJICAgICYmIHN0clsxXSAhPSAnKicKKwkJICAgICYmIHN0clsxXSAhPSAnPycKKwkJICAgICYmICF2aW1faXNmaWxlYyhzdHJbMV0pKSkpOworI2Vsc2UKKyAgICByZXR1cm4gKHN0clswXSA9PSAnXFwnICYmIHN0clsxXSAhPSBOVUwpOworI2VuZGlmCit9CisKKy8qCisgKiBIYWx2ZSB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGluIGEgZmlsZSBuYW1lIGFyZ3VtZW50LgorICogRm9yIE1TLURPUyB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgYmFja3NsYXNoCisgKiBpcyBub3QgYSBub3JtYWwgZmlsZSBjaGFyYWN0ZXIuCisgKi8KKyAgICB2b2lkCitiYWNrc2xhc2hfaGFsdmUocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgZm9yICggOyAqcDsgKytwKQorCWlmIChyZW1fYmFja3NsYXNoKHApKQorCSAgICBTVFJDUFkocCwgcCArIDEpOworfQorCisvKgorICogYmFja3NsYXNoX2hhbHZlKCkgcGx1cyBzYXZlIHRoZSByZXN1bHQgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworICAgIGNoYXJfdSAqCitiYWNrc2xhc2hfaGFsdmVfc2F2ZShwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBjaGFyX3UJKnJlczsKKworICAgIHJlcyA9IHZpbV9zdHJzYXZlKHApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKwlyZXR1cm4gcDsKKyAgICBiYWNrc2xhc2hfaGFsdmUocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgKGRlZmluZWQoRUJDRElDKSAmJiBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVGFibGUgZm9yIEVCQ0RJQyB0byBBU0NJSSBjb252ZXJzaW9uIHVuYXNoYW1lZGx5IHRha2VuIGZyb20geHhkLmMhCisgKiBUaGUgZmlyc3QgNjQgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFwIGNvbnRyb2wgY2hhcmFjdGVycyBkZWZpbmVkIGluCisgKiBhc2NpaS5oCisgKi8KK3N0YXRpYyBjaGFyX3UgZWJjZGljMmFzY2lpX3RhYlsyNTZdID0KK3sKKyAgICAwMDAwLCAwMDAxLCAwMDAyLCAwMDAzLCAwMDA0LCAwMDExLCAwMDA2LCAwMTc3LAorICAgIDAwMTAsIDAwMTEsIDAwMTIsIDAwMTMsIDAwMTQsIDAwMTUsIDAwMTYsIDAwMTcsCisgICAgMDAyMCwgMDAyMSwgMDAyMiwgMDAyMywgMDAyNCwgMDAxMiwgMDAxMCwgMDAyNywKKyAgICAwMDMwLCAwMDMxLCAwMDMyLCAwMDMzLCAwMDMzLCAwMDM1LCAwMDM2LCAwMDM3LAorICAgIDAwNDAsIDAwNDEsIDAwNDIsIDAwNDMsIDAwNDQsIDAwNDUsIDAwNDYsIDAwNDcsCisgICAgMDA1MCwgMDA1MSwgMDA1MiwgMDA1MywgMDA1NCwgMDA1NSwgMDA1NiwgMDA1NywKKyAgICAwMDYwLCAwMDYxLCAwMDYyLCAwMDYzLCAwMDY0LCAwMDY1LCAwMDY2LCAwMDY3LAorICAgIDAwNzAsIDAwNzEsIDAwNzIsIDAwNzMsIDAwNzQsIDAwNzUsIDAwNzYsIDAwNzcsCisgICAgMDA0MCwgMDI0MCwgMDI0MSwgMDI0MiwgMDI0MywgMDI0NCwgMDI0NSwgMDI0NiwKKyAgICAwMjQ3LCAwMjUwLCAwMzI1LCAwMDU2LCAwMDc0LCAwMDUwLCAwMDUzLCAwMTc0LAorICAgIDAwNDYsIDAyNTEsIDAyNTIsIDAyNTMsIDAyNTQsIDAyNTUsIDAyNTYsIDAyNTcsCisgICAgMDI2MCwgMDI2MSwgMDA0MSwgMDA0NCwgMDA1MiwgMDA1MSwgMDA3MywgMDE3NiwKKyAgICAwMDU1LCAwMDU3LCAwMjYyLCAwMjYzLCAwMjY0LCAwMjY1LCAwMjY2LCAwMjY3LAorICAgIDAyNzAsIDAyNzEsIDAzMTMsIDAwNTQsIDAwNDUsIDAxMzcsIDAwNzYsIDAwNzcsCisgICAgMDI3MiwgMDI3MywgMDI3NCwgMDI3NSwgMDI3NiwgMDI3NywgMDMwMCwgMDMwMSwKKyAgICAwMzAyLCAwMTQwLCAwMDcyLCAwMDQzLCAwMTAwLCAwMDQ3LCAwMDc1LCAwMDQyLAorICAgIDAzMDMsIDAxNDEsIDAxNDIsIDAxNDMsIDAxNDQsIDAxNDUsIDAxNDYsIDAxNDcsCisgICAgMDE1MCwgMDE1MSwgMDMwNCwgMDMwNSwgMDMwNiwgMDMwNywgMDMxMCwgMDMxMSwKKyAgICAwMzEyLCAwMTUyLCAwMTUzLCAwMTU0LCAwMTU1LCAwMTU2LCAwMTU3LCAwMTYwLAorICAgIDAxNjEsIDAxNjIsIDAxMzYsIDAzMTQsIDAzMTUsIDAzMTYsIDAzMTcsIDAzMjAsCisgICAgMDMyMSwgMDM0NSwgMDE2MywgMDE2NCwgMDE2NSwgMDE2NiwgMDE2NywgMDE3MCwKKyAgICAwMTcxLCAwMTcyLCAwMzIyLCAwMzIzLCAwMzI0LCAwMTMzLCAwMzI2LCAwMzI3LAorICAgIDAzMzAsIDAzMzEsIDAzMzIsIDAzMzMsIDAzMzQsIDAzMzUsIDAzMzYsIDAzMzcsCisgICAgMDM0MCwgMDM0MSwgMDM0MiwgMDM0MywgMDM0NCwgMDEzNSwgMDM0NiwgMDM0NywKKyAgICAwMTczLCAwMTAxLCAwMTAyLCAwMTAzLCAwMTA0LCAwMTA1LCAwMTA2LCAwMTA3LAorICAgIDAxMTAsIDAxMTEsIDAzNTAsIDAzNTEsIDAzNTIsIDAzNTMsIDAzNTQsIDAzNTUsCisgICAgMDE3NSwgMDExMiwgMDExMywgMDExNCwgMDExNSwgMDExNiwgMDExNywgMDEyMCwKKyAgICAwMTIxLCAwMTIyLCAwMzU2LCAwMzU3LCAwMzYwLCAwMzYxLCAwMzYyLCAwMzYzLAorICAgIDAxMzQsIDAyMzcsIDAxMjMsIDAxMjQsIDAxMjUsIDAxMjYsIDAxMjcsIDAxMzAsCisgICAgMDEzMSwgMDEzMiwgMDM2NCwgMDM2NSwgMDM2NiwgMDM2NywgMDM3MCwgMDM3MSwKKyAgICAwMDYwLCAwMDYxLCAwMDYyLCAwMDYzLCAwMDY0LCAwMDY1LCAwMDY2LCAwMDY3LAorICAgIDAwNzAsIDAwNzEsIDAzNzIsIDAzNzMsIDAzNzQsIDAzNzUsIDAzNzYsIDAzNzcKK307CisKKy8qCisgKiBDb252ZXJ0IGEgYnVmZmVyIHdvcnRoIG9mIGNoYXJhY3RlcnMgZnJvbSBFQkNESUMgdG8gQVNDSUkuICBPbmx5IHVzZWZ1bCBpZgorICogd2FudGluZyA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIG91dCB0aGUgb3RoZXIgZW5kLgorICovCisgICAgdm9pZAorZWJjZGljMmFzY2lpKGJ1ZmZlciwgbGVuKQorICAgIGNoYXJfdQkqYnVmZmVyOworICAgIGludAkJbGVuOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwlidWZmZXJbaV0gPSBlYmNkaWMyYXNjaWlfdGFiW2J1ZmZlcltpXV07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb25maWcuYWFwLmluIGIvc3JjL2NvbmZpZy5hYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjNzRkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb25maWcuYWFwLmluCkBAIC0wLDAgKzEsMTE1IEBACisjIGNvbmZpZy5hYXAuaW46IHJlY2lwZSB0cmFuc2Zvcm1lZCBpbnRvIGF1dG8vY29uZmlnLmFhcCBieSBjb25maWd1cmUuCisKK1ZJTU5BTUUJCT0gQFZJTU5BTUVACitFWE5BTUUJCT0gQEVYTkFNRUAKK1ZJRVdOQU1FCT0gQFZJRVdOQU1FQAorCitDQwkJPSBAQ0NACitERUZTCQk9IEBERUZTQAorQ09ORl9DRkxBR1MJPSBAQ0ZMQUdTQAorQ1BQRkxBR1MJPSBAQ1BQRkxBR1NACitzcmNkaXIJCT0gQHNyY2RpckAKK1ZQQVRICQk9IEBzcmNkaXJACitDT05GX0xERkxBR1MJPSBATERGTEFHU0AKK0NPTkZfTElCUwk9IEBMSUJTQAorVEFHUFJHCQk9IEBUQUdQUkdACisKK0NQUAkJPSBAQ1BQQAorQ1BQX01NCQk9IEBDUFBfTU1ACitYX0NGTEFHUwk9IEBYX0NGTEFHU0AKK1hfTElCU19ESVIJPSBAWF9MSUJTQAorWF9QUkVfTElCUwk9IEBYX1BSRV9MSUJTQAorWF9FWFRSQV9MSUJTCT0gQFhfRVhUUkFfTElCU0AKK1hfTElCUwkJPSBAWF9MSUJACisKK1BFUkwJCT0gQHZpX2N2X3BhdGhfcGVybEAKK1BFUkxMSUIJCT0gQHZpX2N2X3BlcmxsaWJACitQRVJMX0xJQlMJPSBAUEVSTF9MSUJTQAorU0hSUEVOVgkJPSBAc2hycGVudkAKK1BFUkxfU1JDCT0gQFBFUkxfU1JDQAorUEVSTF9PQkoJPSBAUEVSTF9PQkpACitQRVJMX1BSTwk9IEBQRVJMX1BST0AKK1BFUkxfQ0ZMQUdTCT0gQFBFUkxfQ0ZMQUdTQAorCitQWVRIT05fU1JDCT0gQFBZVEhPTl9TUkNACitQWVRIT05fT0JKCT0gQFBZVEhPTl9PQkpACitQWVRIT05fQ0ZMQUdTCT0gQFBZVEhPTl9DRkxBR1NACitQWVRIT05fTElCUwk9IEBQWVRIT05fTElCU0AKK1BZVEhPTl9DT05GRElSCT0gQFBZVEhPTl9DT05GRElSQAorUFlUSE9OX0dFVFBBVEhfQ0ZMQUdTID0gQFBZVEhPTl9HRVRQQVRIX0NGTEFHU0AKKworVENMCQk9IEB2aV9jdl9wYXRoX3RjbEAKK1RDTF9TUkMJCT0gQFRDTF9TUkNACitUQ0xfT0JKCQk9IEBUQ0xfT0JKQAorVENMX1BSTwkJPSBAVENMX1BST0AKK1RDTF9DRkxBR1MJPSBAVENMX0NGTEFHU0AKK1RDTF9MSUJTCT0gQFRDTF9MSUJTQAorCitIQU5HVUxJTl9TUkMJPSBASEFOR1VMSU5fU1JDQAorSEFOR1VMSU5fT0JKCT0gQEhBTkdVTElOX09CSkAKKworV09SS1NIT1BfU1JDCT0gQFdPUktTSE9QX1NSQ0AKK1dPUktTSE9QX09CSgk9IEBXT1JLU0hPUF9PQkpACisKK05FVEJFQU5TX1NSQwk9IEBORVRCRUFOU19TUkNACitORVRCRUFOU19PQkoJPSBATkVUQkVBTlNfT0JKQAorCitSVUJZCQk9IEB2aV9jdl9wYXRoX3J1YnlACitSVUJZX1NSQwk9IEBSVUJZX1NSQ0AKK1JVQllfT0JKCT0gQFJVQllfT0JKQAorUlVCWV9QUk8JPSBAUlVCWV9QUk9ACitSVUJZX0NGTEFHUwk9IEBSVUJZX0NGTEFHU0AKK1JVQllfTElCUwk9IEBSVUJZX0xJQlNACisKK1NOSUZGX1NSQwk9IEBTTklGRl9TUkNACitTTklGRl9PQkoJPSBAU05JRkZfT0JKQAorCitBV0sJCT0gQEFXS0AKKworU1RSSVAJCT0gQFNUUklQQAorCitFWEVFWFQJCT0gQEVYRUVYVEAKKworQ09NUElMRURCWQk9IEBjb21waWxlZGJ5QAorCitJTlNUQUxMVklNRElGRgk9IEBkb3ZpbWRpZmZACitJTlNUQUxMR1ZJTURJRkYJPSBAZG9ndmltZGlmZkAKKworIyMjIExpbmUgYnJlYWsgY2hhcmFjdGVyIGFzIG9jdGFsIG51bWJlciBmb3IgInRyIgorTkwJCT0gQGxpbmVfYnJlYWtACisKKyMjIyBUb3AgZGlyZWN0b3J5IGZvciBldmVyeXRoaW5nCisjICAgQ2FuIGJlIG92ZXJydWxlZCB3aXRoICJQUkVGSVg9ZGlyIiwgdGh1cyBkZWxheSB1c2luZyBpdC4KK3ByZWZpeAkJPSBAcHJlZml4QAorCisjIyMgVG9wIGRpcmVjdG9yeSBmb3IgdGhlIGJpbmFyeQorZXhlY19wcmVmaXgJJD0gQGV4ZWNfcHJlZml4QAorCisjIyMgUHJlZml4IGZvciBsb2NhdGlvbiBvZiBkYXRhIGZpbGVzCitCSU5ESVIJCSQ9IEBiaW5kaXJACisKKyMjIyBQcmVmaXggZm9yIGxvY2F0aW9uIG9mIGRhdGEgZmlsZXMKK0RBVEFESVIJCSQ9IEBkYXRhZGlyQAorCisjIyMgUHJlZml4IGZvciBsb2NhdGlvbiBvZiBtYW4gcGFnZXMKK01BTkRJUgkJJD0gQG1hbmRpckAKKworIyMjIERvIHdlIGhhdmUgYSBHVUkKK0dVSQkJPSBAR1VJVFlQRUAKK05BUlJPV19QUk9UTwk9IEBOQVJST1dfUFJPVE9ACitHVEtfTElCTkFNRQk9IEBHVEtfTElCTkFNRUAKK01PVElGX0xJQk5BTUUJPSBATU9USUZfTElCTkFNRUAKK0dVSV9JTkNfTE9DCT0gQEdVSV9JTkNfTE9DQAorR1VJX0xJQl9MT0MJPSBAR1VJX0xJQl9MT0NACitHVUlfWF9MSUJTCT0gQEdVSV9YX0xJQlNACisKKyMjIyBBbnkgT1MgZGVwZW5kZW50IGV4dHJhIHNvdXJjZSBhbmQgb2JqZWN0IGZpbGUKK09TX0VYVFJBX1NSQwk9IEBPU19FWFRSQV9TUkNACitPU19FWFRSQV9PQkoJPSBAT1NfRVhUUkFfT0JKQAorCisjIyMgSWYgdGhlICoucG8gZmlsZXMgYXJlIHRvIGJlIHRyYW5zbGF0ZWQgdG8gKi5tbyBmaWxlcy4KK01BS0VNTwkJPSBATUFLRU1PQAorCisjIE1ha2Ugc3VyZSB0aGF0ICJtYWtlIGZpcnN0IiB3aWxsIHJ1biAibWFrZSBhbGwiIG9uY2UgY29uZmlndXJlIGhhcyBkb25lIGl0cworIyB3b3JrLiAgVGhpcyBpcyBuZWVkZWQgd2hlbiB1c2luZyB0aGUgTWFrZWZpbGUgaW4gdGhlIHRvcCBkaXJlY3RvcnkuCitmaXJzdDogYWxsCmRpZmYgLS1naXQgYS9zcmMvY29uZmlnLmguaW4gYi9zcmMvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMjY2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb25maWcuaC5pbgpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlciwgYW5kCisgKiBtYW51YWxseSBjaGFuZ2VkIGFmdGVyIHRoYXQuCisgKi8KKworLyogRGVmaW5lIGlmIHdlIGhhdmUgRUJDRElDIGNvZGUgKi8KKyN1bmRlZiBFQkNESUMKKworLyogRGVmaW5lIHVubGVzcyBubyBYIHN1cHBvcnQgZm91bmQgKi8KKyN1bmRlZiBIQVZFX1gxMQorCisvKiBEZWZpbmUgd2hlbiB0ZXJtaW5mbyBzdXBwb3J0IGZvdW5kICovCisjdW5kZWYgVEVSTUlORk8KKworLyogRGVmaW5lIHdoZW4gdGVybWNhcC5oIGNvbnRhaW5zIG9zcGVlZCAqLworI3VuZGVmIEhBVkVfT1NQRUVECisKKy8qIERlZmluZSB3aGVuIG9zcGVlZCBjYW4gYmUgZXh0ZXJuICovCisjdW5kZWYgT1NQRUVEX0VYVEVSTgorCisvKiBEZWZpbmUgd2hlbiB0ZXJtY2FwLmggY29udGFpbnMgVVAsIEJDIGFuZCBQQyAqLworI3VuZGVmIEhBVkVfVVBfQkNfUEMKKworLyogRGVmaW5lIHdoZW4gVVAsIEJDIGFuZCBQQyBjYW4gYmUgZXh0ZXJuICovCisjdW5kZWYgVVBfQkNfUENfRVhURVJOCisKKy8qIERlZmluZSB3aGVuIHRlcm1jYXAuaCBkZWZpbmVzIG91dGZ1bnR5cGUgKi8KKyN1bmRlZiBIQVZFX09VVEZVTlRZUEUKKworLyogRGVmaW5lIHdoZW4gX19EQVRFX18gIiAiIF9fVElNRV9fIGNhbiBiZSB1c2VkICovCisjdW5kZWYgSEFWRV9EQVRFX1RJTUUKKworLyogZGVmaW5lZCBhbHdheXMgd2hlbiB1c2luZyBjb25maWd1cmUgKi8KKyN1bmRlZiBVTklYCisKKy8qIERlZmluZWQgdG8gdGhlIHNpemUgb2YgYW4gaW50ICovCisjdW5kZWYgU0laRU9GX0lOVAorCisvKgorICogSWYgd2UgY2Fubm90IHRydXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZyb20gdGhlIGxpYnJhcmllcywgd2UgdXNlIG91cgorICogb3duIHNhZmUgYnV0IHByb2JhYmx5IHNsb3dlciB2aW1fbWVtbW92ZSgpLgorICovCisjdW5kZWYgVVNFQkNPUFkKKyN1bmRlZiBVU0VNRU1NT1ZFCisjdW5kZWYgVVNFTUVNQ1BZCisKKy8qIERlZmluZSB3aGVuICJtYW4gLXMgMiIgaXMgdG8gYmUgdXNlZCAqLworI3VuZGVmIFVTRU1BTl9TCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgbW9kZV90CisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBwaWRfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHVpZF90CisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBnaWRfdAorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIGlub190CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIGRldl90CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgcmxpbV90CisKKy8qIERlZmluZSB0byBgc3RydWN0IHNpZ2FsdHN0YWNrJyBpZiA8c2lnbmFsLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzdGFja190CisKKy8qIERlZmluZSBpZiBzdGFja190IGhhcyB0aGUgc3NfYmFzZSBmaWVsZC4gKi8KKyN1bmRlZiBIQVZFX1NTX0JBU0UKKworLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAgKi8KKyN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDxzeXMvc2VsZWN0Lmg+LiAgKi8KKyN1bmRlZiBTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIC9kZXYvcHRjICovCisjdW5kZWYgSEFWRV9ERVZfUFRDCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBTeXM0IHB0eXMgKi8KKyN1bmRlZiBIQVZFX1NWUjRfUFRZUworCisvKiBEZWZpbmUgdG8gcmFuZ2Ugb2YgcHR5IG5hbWVzIHRvIHRyeSAqLworI3VuZGVmIFBUWVJBTkdFMAorI3VuZGVmIFBUWVJBTkdFMQorCisvKiBEZWZpbmUgbW9kZSBmb3IgcHR5ICovCisjdW5kZWYgUFRZTU9ERQorCisvKiBEZWZpbmUgZ3JvdXAgZm9yIHB0eSAqLworI3VuZGVmIFBUWUdST1VQCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogRGVmaW5lIGFzIHRoZSBjb21tYW5kIGF0IHRoZSBlbmQgb2Ygc2lnbmFsIGhhbmRsZXJzICgiIiBvciAicmV0dXJuIDA7IikuICAqLworI3VuZGVmIFNJR1JFVFVSTgorCisvKiBEZWZpbmUgaWYgc3RydWN0IHNpZ2NvbnRleHQgaXMgcHJlc2VudCAqLworI3VuZGVmIEhBVkVfU0lHQ09OVEVYVAorCisvKiBEZWZpbmUgaWYgdG91dXBlci90b2xvd2VyIG9ubHkgd29yayBvbiBsb3dlci91cGVyY2FzZSBjaGFyYWN0ZXJzICovCisjdW5kZWYgQlJPS0VOX1RPVVBQRVIKKworLyogRGVmaW5lIGlmIHN0YXQoKSBpZ25vcmVzIGEgdHJhaWxpbmcgc2xhc2ggKi8KKyN1bmRlZiBTVEFUX0lHTk9SRVNfU0xBU0gKKworLyogRGVmaW5lIGlmIHRnZXRzdHIoKSBoYXMgYSBzZWNvbmQgYXJndW1lbnQgdGhhdCBpcyAoY2hhciAqKSAqLworI3VuZGVmIFRHRVRTVFJfQ0hBUl9QCisKKy8qIERlZmluZSBpZiB0Z2V0ZW50KCkgcmV0dXJucyB6ZXJvIGZvciBhbiBlcnJvciAqLworI3VuZGVmIFRHRVRFTlRfWkVST19FUlIKKworLyogRGVmaW5lIGlmIHRoZSBnZXRjd2QoKSBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQuICAqLworI3VuZGVmIEJBRF9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSB0aGUgZnVuY3Rpb246ICovCisjdW5kZWYgSEFWRV9CQ01QCisjdW5kZWYgSEFWRV9GQ0hESVIKKyN1bmRlZiBIQVZFX0ZDSE9XTgorI3VuZGVmIEhBVkVfRlNFRUtPCisjdW5kZWYgSEFWRV9GU1lOQworI3VuZGVmIEhBVkVfRlRFTExPCisjdW5kZWYgSEFWRV9HRVRDV0QKKyN1bmRlZiBIQVZFX0dFVFBTRVVET1RUWQorI3VuZGVmIEhBVkVfR0VUUFdOQU0KKyN1bmRlZiBIQVZFX0dFVFBXVUlECisjdW5kZWYgSEFWRV9HRVRSTElNSVQKKyN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorI3VuZGVmIEhBVkVfR0VUV0QKKyN1bmRlZiBIQVZFX0lDT05WCisjdW5kZWYgSEFWRV9OTF9MQU5HSU5GT19DT0RFU0VUCisjdW5kZWYgSEFWRV9MU1RBVAorI3VuZGVmIEhBVkVfTUVNQ01QCisjdW5kZWYgSEFWRV9NRU1TRVQKKyN1bmRlZiBIQVZFX05BTk9TTEVFUAorI3VuZGVmIEhBVkVfT1BFTkRJUgorI3VuZGVmIEhBVkVfUFVURU5WCisjdW5kZWYgSEFWRV9RU09SVAorI3VuZGVmIEhBVkVfUkVBRExJTksKKyN1bmRlZiBIQVZFX1JFTkFNRQorI3VuZGVmIEhBVkVfU0VMRUNUCisjdW5kZWYgSEFWRV9TRVRFTlYKKyN1bmRlZiBIQVZFX1NFVFBHSUQKKyN1bmRlZiBIQVZFX1NFVFNJRAorI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisjdW5kZWYgSEFWRV9TSUdBTFRTVEFDSworI3VuZGVmIEhBVkVfU0lHU0VUCisjdW5kZWYgSEFWRV9TSUdTRVRKTVAKKyN1bmRlZiBIQVZFX1NJR1NUQUNLCisjdW5kZWYgSEFWRV9TSUdWRUMKKyN1bmRlZiBIQVZFX1NOUFJJTlRGCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisjdW5kZWYgSEFWRV9TVFJFUlJPUgorI3VuZGVmIEhBVkVfU1RSRlRJTUUKKyN1bmRlZiBIQVZFX1NUUklDTVAKKyN1bmRlZiBIQVZFX1NUUk5DQVNFQ01QCisjdW5kZWYgSEFWRV9TVFJOSUNNUAorI3VuZGVmIEhBVkVfU1RSUEJSSworI3VuZGVmIEhBVkVfU1RSVE9MCisjdW5kZWYgSEFWRV9TVF9CTEtTSVpFCisjdW5kZWYgSEFWRV9TWVNDT05GCisjdW5kZWYgSEFWRV9TWVNDVEwKKyN1bmRlZiBIQVZFX1NZU0lORk8KKyN1bmRlZiBIQVZFX1RHRVRFTlQKKyN1bmRlZiBIQVZFX1RPV0xPV0VSCisjdW5kZWYgSEFWRV9UT1dVUFBFUgorI3VuZGVmIEhBVkVfVVNMRUVQCisjdW5kZWYgSEFWRV9VVElNRQorI3VuZGVmIEhBVkVfQklORF9URVhURE9NQUlOX0NPREVTRVQKKworLyogRGVmaW5lIGlmIHlvdSBkbyBub3QgaGF2ZSB1dGltZSgpLCBidXQgZG8gaGF2ZSB0aGUgdXRpbWVzKCkgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VVElNRVMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBoZWFkZXIgZmlsZTogKi8KKyN1bmRlZiBIQVZFX0RJUkVOVF9ICisjdW5kZWYgSEFWRV9FUlJOT19ICisjdW5kZWYgSEFWRV9GQ05UTF9ICisjdW5kZWYgSEFWRV9GUkFNRV9ICisjdW5kZWYgSEFWRV9JQ09OVl9ICisjdW5kZWYgSEFWRV9MQU5HSU5GT19ICisjdW5kZWYgSEFWRV9MSUJDX0gKKyN1bmRlZiBIQVZFX0xJQkdFTl9ICisjdW5kZWYgSEFWRV9MSUJJTlRMX0gKKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisjdW5kZWYgSEFWRV9ORElSX0gKKyN1bmRlZiBIQVZFX1BPTExfSAorI3VuZGVmIEhBVkVfUFRIUkVBRF9OUF9ICisjdW5kZWYgSEFWRV9QV0RfSAorI3VuZGVmIEhBVkVfU0VUSk1QX0gKKyN1bmRlZiBIQVZFX1NHVFRZX0gKKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorI3VuZGVmIEhBVkVfU1RST1BUU19ICisjdW5kZWYgSEFWRV9TWVNfQUNDRVNTX0gKKyN1bmRlZiBIQVZFX1NZU19BQ0xfSAorI3VuZGVmIEhBVkVfU1lTX0RJUl9ICisjdW5kZWYgSEFWRV9TWVNfSU9DVExfSAorI3VuZGVmIEhBVkVfU1lTX05ESVJfSAorI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyN1bmRlZiBIQVZFX1NZU19QT0xMX0gKKyN1bmRlZiBIQVZFX1NZU19QVEVNX0gKKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisjdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyN1bmRlZiBIQVZFX1NZU19TVEFURlNfSAorI3VuZGVmIEhBVkVfU1lTX1NUUkVBTV9ICisjdW5kZWYgSEFWRV9TWVNfU1lTQ1RMX0gKKyN1bmRlZiBIQVZFX1NZU19TWVNJTkZPX0gKKyN1bmRlZiBIQVZFX1NZU19TWVNURU1JTkZPX0gKKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKyN1bmRlZiBIQVZFX1NZU19VVFNOQU1FX0gKKyN1bmRlZiBIQVZFX1dDSEFSX0gKKyN1bmRlZiBIQVZFX1RFUk1DQVBfSAorI3VuZGVmIEhBVkVfVEVSTUlPU19ICisjdW5kZWYgSEFWRV9URVJNSU9fSAorI3VuZGVmIEhBVkVfVU5JU1REX0gKKyN1bmRlZiBIQVZFX1VUSUxfREVCVUdfSAorI3VuZGVmIEhBVkVfVVRJTF9NU0dJMThOX0gKKyN1bmRlZiBIQVZFX1VUSU1FX0gKKyN1bmRlZiBIQVZFX1gxMV9TVU5LRVlTWU1fSAorI3VuZGVmIEhBVkVfWE1fWE1fSAorI3VuZGVmIEhBVkVfWE1fWFBNUF9ICisjdW5kZWYgSEFWRV9YMTFfWFBNX0gKKyN1bmRlZiBIQVZFX1gxMV9YTVVfRURJVFJFU19ICisjdW5kZWYgSEFWRV9YMTFfU01fU01MSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19XQUlUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgPHN5cy93YWl0Lmg+IHRoYXQgaXMgbm90IFBPU0lYLjEgY29tcGF0aWJsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSU9OX1dBSVQKKworLyogVGhpcyBpcyBjdXJyZW50bHkgdW51c2VkIGluIHZpbTogKi8KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKy8qICN1bmRlZiBTVERDX0hFQURFUlMgKi8KKworLyogaW5zdGVhZCwgd2UgY2hlY2sgYSBmZXcgU1REQyB0aGluZ3Mgb3Vyc2VsdmVzICovCisjdW5kZWYgSEFWRV9TVERBUkdfSAorI3VuZGVmIEhBVkVfU1RETElCX0gKKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiBzdHJpbmdzLmggY2Fubm90IGJlIGluY2x1ZGVkIHdoZW4gc3RyaW5ncy5oIGFscmVhZHkgaXMgKi8KKyN1bmRlZiBOT19TVFJJTkdTX1dJVEhfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRpbnkgZmVhdHVyZXMuICovCisjdW5kZWYgRkVBVF9USU5ZCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBzbWFsbCBmZWF0dXJlcy4gKi8KKyN1bmRlZiBGRUFUX1NNQUxMCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBub3JtYWwgZmVhdHVyZXMuICovCisjdW5kZWYgRkVBVF9OT1JNQUwKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IGJpZyBmZWF0dXJlcy4gKi8KKyN1bmRlZiBGRUFUX0JJRworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgaHVnZSBmZWF0dXJlcy4gKi8KKyN1bmRlZiBGRUFUX0hVR0UKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIFBlcmwgaW50ZXJwcmV0ZXIuICovCisjdW5kZWYgRkVBVF9QRVJMCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICovCisjdW5kZWYgRkVBVF9QWVRIT04KKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIuICovCisjdW5kZWYgRkVBVF9SVUJZCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBUY2wgaW50ZXJwcmV0ZXIuICovCisjdW5kZWYgRkVBVF9UQ0wKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIFNuaWZmIGludGVyZmFjZS4gKi8KKyN1bmRlZiBGRUFUX1NOSUZGCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgQUNMICovCisjdW5kZWYgSEFWRV9QT1NJWF9BQ0wKKyN1bmRlZiBIQVZFX1NPTEFSSVNfQUNMCisjdW5kZWYgSEFWRV9BSVhfQUNMCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBvZiBHUE0gKExpbnV4IGNvbnNvbGUgbW91c2UgZGFlbW9uKSAqLworI3VuZGVmIEhBVkVfR1BNCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBDc2NvcGUgaW50ZXJmYWNlLiAqLworI3VuZGVmIEZFQVRfQ1NDT1BFCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIG11bHRpYnl0ZSBzdXBwb3J0LiAqLworI3VuZGVmIEZFQVRfTUJZVEUKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgZm9udHNldCBzdXBwb3J0LiAqLworI3VuZGVmIEZFQVRfWEZPTlRTRVQKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgWElNIHN1cHBvcnQuICovCisjdW5kZWYgRkVBVF9YSU0KKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgSGFuZ3VsIGlucHV0IHN1cHBvcnQuICovCisjdW5kZWYgRkVBVF9IQU5HVUxJTgorCisvKiBEZWZpbmUgaWYgeW91IHVzZSBHVEsgYW5kIHdhbnQgR05PTUUgc3VwcG9ydC4gKi8KKyN1bmRlZiBGRUFUX0dVSV9HTk9NRQorCisvKiBEZWZpbmUgaWYgR1RLKyAyIGlzIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBIQVZFX0dUSzIKKworLyogRGVmaW5lIGlmIEdUSysgbXVsdGloZWFkIHN1cHBvcnQgaXMgYXZhaWxhYmxlIChyZXF1aXJlcyBHVEsrID49IDIuMS4xKS4gKi8KKyN1bmRlZiBIQVZFX0dUS19NVUxUSUhFQUQKKworLyogRGVmaW5lIGlmIHlvdXIgWCBoYXMgb3duIGxvY2FsZSBsaWJyYXJ5ICovCisjdW5kZWYgWF9MT0NBTEUKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgZGxmY24uaC4gKi8KKyN1bmRlZiBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIGlmIHRoZXJlIGlzIGEgd29ya2luZyBnZXR0ZXh0KCkuICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBpZiBfbmxfbXNnX2NhdF9jbnRyIGlzIHByZXNlbnQuICovCisjdW5kZWYgSEFWRV9OTF9NU0dfQ0FUX0NOVFIKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgZGxvcGVuKCkgKi8KKyN1bmRlZiBIQVZFX0RMT1BFTgorCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSBkbHN5bSgpICovCisjdW5kZWYgSEFWRV9ETFNZTQorCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSBkbC5oLiAqLworI3VuZGVmIEhBVkVfRExfSAorCisvKiBEZWZpbmUgaWYgd2UgaGF2ZSBzaGxfbG9hZCgpICovCisjdW5kZWYgSEFWRV9TSExfTE9BRAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBTdW4gVmlzdWFsIFdvcmtzaG9wIHN1cHBvcnQuICovCisjdW5kZWYgRkVBVF9TVU5fV09SS1NIT1AKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgTmV0QmVhbnMgaW50ZWdyYXRpb24uICovCisjdW5kZWYgRkVBVF9ORVRCRUFOU19JTlRHCisKKy8qIERlZmluZSBkZWZhdWx0IGdsb2JhbCBydW50aW1lIHBhdGggKi8KKyN1bmRlZiBSVU5USU1FX0dMT0JBTAorCisvKiBEZWZpbmUgbmFtZSBvZiB3aG8gbW9kaWZpZWQgYSByZWxlYXNlZCBWaW0gKi8KKyN1bmRlZiBNT0RJRklFRF9CWQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgWFNNUCBpbnRlcmFjdGlvbiBhcyB3ZWxsIGFzIHZhbmlsbGEgc3dhcGZpbGUgc2FmZXR5ICovCisjdW5kZWYgVVNFX1hTTVBfSU5URVJBQ1QKKworLyogRGVmaW5lIGlmIHZzbnByaW50ZigpIHdvcmtzICovCisjdW5kZWYgSEFWRV9WU05QUklOVEYKZGlmZiAtLWdpdCBhL3NyYy9jb25maWcubWsuZGlzdCBiL3NyYy9jb25maWcubWsuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdjMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbmZpZy5tay5kaXN0CkBAIC0wLDAgKzEsNSBAQAordGhlIGZpcnN0IHRhcmdldHMgdG8gbWFrZSB2aW0gYXJlOiBzY3JhdGNoIGNvbmZpZyBteXNlbGYKK3NyY2RpciA9IC4KK1ZJTU5BTUUgPSB2aW0KK0VYTkFNRSA9IGV4CitWSUVXTkFNRSA9IHZpZXcKZGlmZiAtLWdpdCBhL3NyYy9jb25maWcubWsuaW4gYi9zcmMvY29uZmlnLm1rLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjY0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29uZmlnLm1rLmluCkBAIC0wLDAgKzEsMTM3IEBACisjCisjIGNvbmZpZy5tay5pbiAtLSBhdXRvY29uZiB0ZW1wbGF0ZSBmb3IgVmltIG9uIFVuaXgJCXZpbTp0cz04OnN3PTg6CisjCisjIERPIE5PVCBFRElUIGNvbmZpZy5tayEhICBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGNvbmZpZ3VyZS4KKyMgRWRpdCBNYWtlZmlsZSBhbmQgcnVuICJtYWtlIiBvciBydW4gLi9jb25maWd1cmUgd2l0aCBvdGhlciBhcmd1bWVudHMuCisjCisjIENvbmZpZ3VyZSBkb2VzIG5vdCBlZGl0IHRoZSBtYWtlZmlsZSBkaXJlY3RseS4gVGhpcyBtZXRob2QgaXMgbm90IHRoZQorIyBzdGFuZGFyZCB1c2Ugb2YgR05VIGF1dG9jb25mLCBidXQgaXQgaGFzIHR3byBhZHZhbnRhZ2VzOgorIyAgIGEpIFRoZSB1c2VyIGNhbiBvdmVycmlkZSBldmVyeSBjaG9pY2UgbWFkZSBieSBjb25maWd1cmUuCisjICAgYikgTW9kaWZpY2F0aW9ucyB0byB0aGUgbWFrZWZpbGUgYXJlIG5vdCBsb3N0IHdoZW4gY29uZmlndXJlIGlzIHJ1bi4KKyMKKyMgSSBob3BlIHRoaXMgaXMgd29ydGggYmVpbmcgbm9uc3RhbmRhcmQuIGp3LgorCitAU0VUX01BS0VACisKK1ZJTU5BTUUJCT0gQFZJTU5BTUVACitFWE5BTUUJCT0gQEVYTkFNRUAKK1ZJRVdOQU1FCT0gQFZJRVdOQU1FQAorCitDQwkJPSBAQ0NACitERUZTCQk9IEBERUZTQAorQ0ZMQUdTCQk9IEBDRkxBR1NACitDUFBGTEFHUwk9IEBDUFBGTEFHU0AKK3NyY2RpcgkJPSBAc3JjZGlyQAorVlBBVEgJCT0gQHNyY2RpckAKK0xERkxBR1MJCT0gQExERkxBR1NACitMSUJTCQk9IEBMSUJTQAorVEFHUFJHCQk9IEBUQUdQUkdACisKK0NQUAkJPSBAQ1BQQAorQ1BQX01NCQk9IEBDUFBfTU1ACitYX0NGTEFHUwk9IEBYX0NGTEFHU0AKK1hfTElCU19ESVIJPSBAWF9MSUJTQAorWF9QUkVfTElCUwk9IEBYX1BSRV9MSUJTQAorWF9FWFRSQV9MSUJTCT0gQFhfRVhUUkFfTElCU0AKK1hfTElCUwkJPSBAWF9MSUJACisKK1BFUkwJCT0gQHZpX2N2X3BhdGhfcGVybEAKK1BFUkxMSUIJCT0gQHZpX2N2X3BlcmxsaWJACitQRVJMX0xJQlMJPSBAUEVSTF9MSUJTQAorU0hSUEVOVgkJPSBAc2hycGVudkAKK1BFUkxfU1JDCT0gQFBFUkxfU1JDQAorUEVSTF9PQkoJPSBAUEVSTF9PQkpACitQRVJMX1BSTwk9IEBQRVJMX1BST0AKK1BFUkxfQ0ZMQUdTCT0gQFBFUkxfQ0ZMQUdTQAorCitQWVRIT05fU1JDCT0gQFBZVEhPTl9TUkNACitQWVRIT05fT0JKCT0gQFBZVEhPTl9PQkpACitQWVRIT05fQ0ZMQUdTCT0gQFBZVEhPTl9DRkxBR1NACitQWVRIT05fTElCUwk9IEBQWVRIT05fTElCU0AKK1BZVEhPTl9DT05GRElSCT0gQFBZVEhPTl9DT05GRElSQAorUFlUSE9OX0dFVFBBVEhfQ0ZMQUdTID0gQFBZVEhPTl9HRVRQQVRIX0NGTEFHU0AKKworVENMCQk9IEB2aV9jdl9wYXRoX3RjbEAKK1RDTF9TUkMJCT0gQFRDTF9TUkNACitUQ0xfT0JKCQk9IEBUQ0xfT0JKQAorVENMX1BSTwkJPSBAVENMX1BST0AKK1RDTF9DRkxBR1MJPSBAVENMX0NGTEFHU0AKK1RDTF9MSUJTCT0gQFRDTF9MSUJTQAorCitIQU5HVUxJTl9TUkMJPSBASEFOR1VMSU5fU1JDQAorSEFOR1VMSU5fT0JKCT0gQEhBTkdVTElOX09CSkAKKworV09SS1NIT1BfU1JDCT0gQFdPUktTSE9QX1NSQ0AKK1dPUktTSE9QX09CSgk9IEBXT1JLU0hPUF9PQkpACisKK05FVEJFQU5TX1NSQwk9IEBORVRCRUFOU19TUkNACitORVRCRUFOU19PQkoJPSBATkVUQkVBTlNfT0JKQAorCitSVUJZCQk9IEB2aV9jdl9wYXRoX3J1YnlACitSVUJZX1NSQwk9IEBSVUJZX1NSQ0AKK1JVQllfT0JKCT0gQFJVQllfT0JKQAorUlVCWV9QUk8JPSBAUlVCWV9QUk9ACitSVUJZX0NGTEFHUwk9IEBSVUJZX0NGTEFHU0AKK1JVQllfTElCUwk9IEBSVUJZX0xJQlNACisKK1NOSUZGX1NSQwk9IEBTTklGRl9TUkNACitTTklGRl9PQkoJPSBAU05JRkZfT0JKQAorCitBV0sJCT0gQEFXS0AKKworU1RSSVAJCT0gQFNUUklQQAorCitFWEVFWFQJCT0gQEVYRUVYVEAKKworQ09NUElMRURCWQk9IEBjb21waWxlZGJ5QAorCitJTlNUQUxMVklNRElGRgk9IEBkb3ZpbWRpZmZACitJTlNUQUxMR1ZJTURJRkYJPSBAZG9ndmltZGlmZkAKKworIyMjIExpbmUgYnJlYWsgY2hhcmFjdGVyIGFzIG9jdGFsIG51bWJlciBmb3IgInRyIgorTkwJCT0gQGxpbmVfYnJlYWtACisKKyMjIyBUb3AgZGlyZWN0b3J5IGZvciBldmVyeXRoaW5nCitwcmVmaXgJCT0gQHByZWZpeEAKKworIyMjIFRvcCBkaXJlY3RvcnkgZm9yIHRoZSBiaW5hcnkKK2V4ZWNfcHJlZml4CT0gQGV4ZWNfcHJlZml4QAorCisjIyMgUHJlZml4IGZvciBsb2NhdGlvbiBvZiBkYXRhIGZpbGVzCitCSU5ESVIJCT0gQGJpbmRpckAKKworIyMjIFByZWZpeCBmb3IgbG9jYXRpb24gb2YgZGF0YSBmaWxlcworREFUQURJUgkJPSBAZGF0YWRpckAKKworIyMjIFByZWZpeCBmb3IgbG9jYXRpb24gb2YgbWFuIHBhZ2VzCitNQU5ESVIJCT0gQG1hbmRpckAKKworIyMjIERvIHdlIGhhdmUgYSBHVUkKK0dVSV9JTkNfTE9DCT0gQEdVSV9JTkNfTE9DQAorR1VJX0xJQl9MT0MJPSBAR1VJX0xJQl9MT0NACitHVUlfU1JDCQk9ICQoQEdVSVRZUEVAX1NSQykKK0dVSV9PQkoJCT0gJChAR1VJVFlQRUBfT0JKKQorR1VJX0RFRlMJPSAkKEBHVUlUWVBFQF9ERUZTKQorR1VJX0lQQVRICT0gJChAR1VJVFlQRUBfSVBBVEgpCitHVUlfTElCU19ESVIJPSAkKEBHVUlUWVBFQF9MSUJTX0RJUikKK0dVSV9MSUJTMQk9ICQoQEdVSVRZUEVAX0xJQlMxKQorR1VJX0xJQlMyCT0gJChAR1VJVFlQRUBfTElCUzIpCitHVUlfSU5TVEFMTAk9ICQoQEdVSVRZUEVAX0lOU1RBTEwpCitHVUlfVEFSR0VUUwk9ICQoQEdVSVRZUEVAX1RBUkdFVFMpCitHVUlfTUFOX1RBUkdFVFMJPSAkKEBHVUlUWVBFQF9NQU5fVEFSR0VUUykKK0dVSV9URVNUVEFSR0VUCT0gJChAR1VJVFlQRUBfVEVTVFRBUkdFVCkKK05BUlJPV19QUk9UTwk9IEBOQVJST1dfUFJPVE9ACitHVUlfWF9MSUJTCT0gQEdVSV9YX0xJQlNACitNT1RJRl9MSUJOQU1FCT0gQE1PVElGX0xJQk5BTUVACitHVEtfTElCTkFNRQk9IEBHVEtfTElCTkFNRUAKKworIyMjIEFueSBPUyBkZXBlbmRlbnQgZXh0cmEgc291cmNlIGFuZCBvYmplY3QgZmlsZQorT1NfRVhUUkFfU1JDCT0gQE9TX0VYVFJBX1NSQ0AKK09TX0VYVFJBX09CSgk9IEBPU19FWFRSQV9PQkpACisKKyMjIyBJZiB0aGUgKi5wbyBmaWxlcyBhcmUgdG8gYmUgdHJhbnNsYXRlZCB0byAqLm1vIGZpbGVzLgorTUFLRU1PCQk9IEBNQUtFTU9ACisKKyMgTWFrZSBzdXJlIHRoYXQgIm1ha2UgZmlyc3QiIHdpbGwgcnVuICJtYWtlIGFsbCIgb25jZSBjb25maWd1cmUgaGFzIGRvbmUgaXRzCisjIHdvcmsuICBUaGlzIGlzIG5lZWRlZCB3aGVuIHVzaW5nIHRoZSBNYWtlZmlsZSBpbiB0aGUgdG9wIGRpcmVjdG9yeS4KK2ZpcnN0OiBhbGwKZGlmZiAtLWdpdCBhL3NyYy9jb25maWd1cmUgYi9zcmMvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlMjI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29uZmlndXJlCkBAIC0wLDAgKzEsNCBAQAorIyEgL2Jpbi9zaAorIyBydW4gdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQKK0NPTkZJR19TVEFUVVM9YXV0by9jb25maWcuc3RhdHVzIFwKKwlhdXRvL2NvbmZpZ3VyZSAiJEAiIC0tc3JjZGlyPSIke3NyY2Rpci0ufSIgLS1jYWNoZS1maWxlPWF1dG8vY29uZmlnLmNhY2hlCmRpZmYgLS1naXQgYS9zcmMvY29uZmlndXJlLmluIGIvc3JjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzIzZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDI2NjAgQEAKK2RubCBjb25maWd1cmUuaW46IGF1dG9jb25mIHNjcmlwdCBmb3IgVmltCisKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIDIuMTIgb3IgMi4xMyB0byBwcm9kdWNlICJjb25maWd1cmUiLgorZG5sIFNob3VsZCBhbHNvIHdvcmsgd2l0aCBhdXRvY29uZiAyLjU0IGFuZCBsYXRlci4KKworQUNfSU5JVCh2aW0uaCkKK0FDX0NPTkZJR19IRUFERVIoYXV0by9jb25maWcuaDpjb25maWcuaC5pbikKKworZG5sIEJlaW5nIGFibGUgdG8gcnVuIGNvbmZpZ3VyZSBtZWFucyB0aGUgc3lzdGVtIGlzIFVuaXggKGNvbXBhdGlibGUpLgorQUNfREVGSU5FKFVOSVgpCitBQ19QUk9HX01BS0VfU0VUCisKK2RubCBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DQwlkbmwgcmVxdWlyZWQgYnkgYWxtb3N0IGV2ZXJ5dGhpbmcKK0FDX1BST0dfQ1BQCWRubCByZXF1aXJlZCBieSBoZWFkZXIgZmlsZSBjaGVja3MKK0FDX1BST0dSQU1fRUdSRVAgZG5sIHJlcXVpcmVkIGJ5IEFDX0VHUkVQX0NQUAorQUNfSVNDX1BPU0lYCWRubCByZXF1aXJlZCBieSBBQ19DX0NST1NTCitBQ19QUk9HX0FXSwlkbmwgcmVxdWlyZWQgZm9yICJtYWtlIGh0bWwiIGluIC4uL2RvYworCitkbmwgRG9uJ3Qgc3RyaXAgaWYgd2UgZG9uJ3QgaGF2ZSBpdAorQUNfQ0hFQ0tfUFJPRyhTVFJJUCwgc3RyaXAsIHN0cmlwLCA6KQorCitkbmwgQ2hlY2sgZm9yIGV4dGVudGlvbiBvZiBleGVjdXRhYmxlcworQUNfRVhFRVhUCisKK2RubCBTZXQgZGVmYXVsdCB2YWx1ZSBmb3IgQ0ZMQUdTIGlmIG5vbmUgaXMgZGVmaW5lZCBvciBpdCdzIGVtcHR5CitpZiB0ZXN0IC16ICIkQ0ZMQUdTIjsgdGhlbgorICBDRkxBR1M9Ii1PIgorICB0ZXN0ICIkR0NDIiA9IHllcyAmJiBDRkxBR1M9Ii1PMiAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtV2FsbCIKK2ZpCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBnY2N2ZXJzaW9uPWAiJENDIiAtLXZlcnNpb24gfCBzZWQgLWUgJzIsJGQ7cy9eW1teMC05XV0qXChbWzAtOV1dXC5bWzAtOS5dXSpcKS4qJC9cMS9nJ2AKKyAgaWYgdGVzdCAiJGdjY3ZlcnNpb24iID0gIjMuMC4xIiAtbyAiJGdjY3ZlcnNpb24iID0gIjMuMC4yIjsgdGhlbgorICAgIGVjaG8gJ0dDQyAzLjAueCBoYXMgYSBidWcgaW4gdGhlIG9wdGltaXplciwgZGlzYWJsaW5nICItTyMiJworICAgIENGTEFHUz1gZWNobyAiJENGTEFHUyIgfCBzZWQgJ3MvLU9bWzIzNDU2Nzg5XV0vLU8vJ2AKKyAgZWxzZQorICAgIGlmIHRlc3QgIiRnY2N2ZXJzaW9uIiA9ICIzLjEiIC1vICIkZ2NjdmVyc2lvbiIgPSAiMy4yIiAtbyAiJGdjY3ZlcnNpb24iID0gIjMuMi4xIiAmJiBgZWNobyAiJENGTEFHUyIgfCBncmVwIC12IGZuby1zdHJlbmd0aC1yZWR1Y2UgPi9kZXYvbnVsbGA7IHRoZW4KKyAgICAgIGVjaG8gJ0dDQyAzLjEgYW5kIDMuMiBoYXZlIGEgYnVnIGluIHRoZSBvcHRpbWl6ZXIsIGFkZGluZyAiLWZuby1zdHJlbmd0aC1yZWR1Y2UiJworICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tc3RyZW5ndGgtcmVkdWNlIgorICAgIGZpCisgIGZpCitmaQorCitkbmwgSWYgY29uZmlndXJlIHRoaW5rcyB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLCB0aGVyZSBpcyBwcm9iYWJseSBzb21ldGhpbmcKK2RubCB3cm9uZyB3aXRoIHRoZSBDQyBvciBDRkxBR1Mgc2V0dGluZ3MsIGdpdmUgYW4gdW5kZXJzdGFuZGFibGUgZXJyb3IgbWVzc2FnZQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHNpbXBsZSBwcm9ncmFtLCBjaGVjayBDQyBhbmQgQ0ZMQUdTCisgIChjcm9zcyBjb21waWxpbmcgZG9lc24ndCB3b3JrKV0pCitmaQorCitkbmwgZ2NjLWNwcCBoYXMgdGhlIHdvbmRlcmZ1bCAtTU0gb3B0aW9uIHRvIHByb2R1Y2UgbmljZXIgZGVwZW5kZW5jaWVzCit0ZXN0ICIkR0NDIiA9IHllcyAmJiBDUFBfTU09TTsgQUNfU1VCU1QoQ1BQX01NKQorCitpZiB0ZXN0IC1mIC4vdG9vbGNoZWNrOyB0aGVuCisgIEFDX0NIRUNLSU5HKGZvciBidWdneSB0b29scykKKyAgc2ggLi90b29sY2hlY2sgMT4mQUNfRkRfTVNHCitmaQorCitPU19FWFRSQV9TUkM9IiI7IE9TX0VYVFJBX09CSj0iIgorCitkbmwgQ2hlY2sgZm9yIEJlT1MsIHdoaWNoIG5lZWRzIGFuIGV4dHJhIHNvdXJjZSBmaWxlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEJlT1MpCitjYXNlIGB1bmFtZWAgaW4KKyAgICBCZU9TKQlPU19FWFRSQV9TUkM9b3NfYmVvcy5jOyBPU19FWFRSQV9PQko9b2JqZWN0cy9vc19iZW9zLm8KKwkJQkVPUz15ZXM7IEFDX01TR19SRVNVTFQoeWVzKTs7CisgICAgKikJCUJFT1M9bm87IEFDX01TR19SRVNVTFQobm8pOzsKK2VzYWMKKworZG5sIElmIFFOWCBpcyBmb3VuZCwgYXNzdW1lIHdlIGRvbid0IHdhbnQgdG8gdXNlIFhwaG90b24KK2RubCB1bmxlc3MgaXQgd2FzIHNwZWNpZmljYWxseSBhc2tlZCBmb3IgKC0td2l0aC14KQorQUNfTVNHX0NIRUNLSU5HKGZvciBRTlgpCitjYXNlIGB1bmFtZWAgaW4KKyAgICBRTlgpCU9TX0VYVFJBX1NSQz1vc19xbnguYzsgT1NfRVhUUkFfT0JKPW9iamVjdHMvb3NfcW54Lm8KKwkJdGVzdCAteiAiJHdpdGhfeCIgJiYgd2l0aF94PW5vCisJCVFOWD15ZXM7IEFDX01TR19SRVNVTFQoeWVzKTs7CisgICAgKikJCVFOWD1ubzsgQUNfTVNHX1JFU1VMVChubyk7OworZXNhYworCitkbmwgQ2hlY2sgZm9yIERhcndpbiBhbmQgTWFjT1MgWAorZG5sIFdlIGRvIGEgY2hlY2sgZm9yIE1hY09TIFggaW4gdGhlIHZlcnkgYmVnaW5uaW5nIGJlY2F1c2UgdGhlcmUKK2RubCBhcmUgYSBsb3Qgb2Ygb3RoZXIgdGhpbmdzIHdlIG5lZWQgdG8gY2hhbmdlIGJlc2lkZXMgR1VJIHN0dWZmCitERUZBVUxUX1ZJTU5BTUU9dmltCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBEYXJ3aW4gKE1hYyBPUyBYKV0pCitpZiB0ZXN0ICJgKHVuYW1lKSAyPi9kZXYvbnVsbGAiID0gRGFyd2luOyB0aGVuCisgIEFDX01TR19SRVNVTFQoeWVzKQorCisgIEFDX01TR19DSEVDS0lORygtLWRpc2FibGUtZGFyd2luIGFyZ3VtZW50KQorICBBQ19BUkdfRU5BQkxFKGRhcndpbiwKKwkgIFsgIC0tZGlzYWJsZS1kYXJ3aW4gICAgICAgIERpc2FibGUgRGFyd2luIChNYWMgT1MgWCkgc3VwcG9ydC5dLAorCSAgLCBbZW5hYmxlX2Rhcndpbj0ieWVzIl0pCisgIGlmIHRlc3QgIiRlbmFibGVfZGFyd2luIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoaWYgRGFyd2luIGZpbGVzIGFyZSB0aGVyZSkKKyAgICBpZiB0ZXN0IC1mIG9zX21hY29zeC5jOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKFtubywgRGFyd2luIHN1cHBvcnQgZGlzYWJsZWRdKQorICAgICAgZW5hYmxlX2Rhcndpbj1ubworICAgIGZpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFt5ZXMsIERhcndpbiBzdXBwb3J0IGV4Y2x1ZGVkXSkKKyAgZmkKKworICBpZiB0ZXN0ICIkZW5hYmxlX2RhcndpbiIgPSAieWVzIjsgdGhlbgorICAgIE1BQ09TWD15ZXMKKyAgICBPU19FWFRSQV9TQ1I9Im9zX21hY29zeC5jIjsKKyAgICBPU19FWFRSQV9PQko9Im9iamVjdHMvb3NfbWFjb3N4Lm8iCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1BQ09TX1hfVU5JWCAtSS9EZXZlbG9wZXIvSGVhZGVycy9GbGF0Q2FyYm9uIC1uby1jcHAtcHJlY29tcCIKKworICAgIGRubCBJZiBDYXJib24gaXMgZm91bmQsIGFzc3VtZSB3ZSBkb24ndCB3YW50IFgxMQorICAgIGRubCB1bmxlc3MgaXQgd2FzIHNwZWNpZmljYWxseSBhc2tlZCBmb3IgKC0td2l0aC14KQorICAgIEFDX0NIRUNLX0hFQURFUihDYXJib24vQ2FyYm9uLmgsIENBUkJPTj15ZXMpCisgICAgaWYgdGVzdCAieCRDQVJCT04iID0gInh5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkd2l0aF94IjsgdGhlbgorCXdpdGhfeD1ubworCURFRkFVTFRfVklNTkFNRT1WaW0KKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCisKK0FDX1NVQlNUKE9TX0VYVFJBX1NSQykKK0FDX1NVQlNUKE9TX0VYVFJBX09CSikKKworZG5sIEFkZCAvdXNyL2xvY2FsL2xpYiB0byAkTERGTEFHUyBhbmQgL3Vzci9sb2NhbC9pbmNsdWRlIHRvIENGTEFHUy4KK2RubCBPbmx5IHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMgYW5kIGl0IHdhc24ndCB0aGVyZSB5ZXQuCitkbmwgRm9yIGdjYyBkb24ndCBkbyB0aGlzIHdoZW4gaXQgaXMgYWxyZWFkeSBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KK2hhdmVfbG9jYWxfaW5jbHVkZT0nJworaGF2ZV9sb2NhbF9saWI9JycKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworICBkbmwgLW5vLWNwcC1wcmVjb21wIGlzIG5lZWRlZCBmb3IgT1MgWCAxMC4yIChCZW4gRm93bGVyKQorICBoYXZlX2xvY2FsX2luY2x1ZGU9YCR7Q0MtY2N9IC1uby1jcHAtcHJlY29tcCAtYyAtdiBjb25mdGVzdC5jIDI+JjEgfCBncmVwICcvdXNyL2xvY2FsL2luY2x1ZGUnYAorICBoYXZlX2xvY2FsX2xpYj1gJHtDQy1jY30gLWMgLXYgY29uZnRlc3QuYyAyPiYxIHwgZ3JlcCAnL3Vzci9sb2NhbC9saWInYAorICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8KK2ZpCitpZiB0ZXN0IC16ICIkaGF2ZV9sb2NhbF9saWIiIC1hIC1kIC91c3IvbG9jYWwvbGliOyB0aGVuCisgIHR0PWBlY2hvICIkTERGTEFHUyIgfCBzZWQgLWUgJ3MrLUwvdXNyL2xvY2FsL2xpYiArK2cnIC1lICdzKy1ML3Vzci9sb2NhbC9saWIkKytnJ2AKKyAgaWYgdGVzdCAiJHR0IiA9ICIkTERGTEFHUyI7IHRoZW4KKyAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgorICBmaQorZmkKK2lmIHRlc3QgLXogIiRoYXZlX2xvY2FsX2luY2x1ZGUiIC1hIC1kIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhlbgorICB0dD1gZWNobyAiJENQUEZMQUdTIiB8IHNlZCAtZSAncystSS91c3IvbG9jYWwvaW5jbHVkZSArK2cnIC1lICdzKy1JL3Vzci9sb2NhbC9pbmNsdWRlJCsrZydgCisgIGlmIHRlc3QgIiR0dCIgPSAiJENQUEZMQUdTIjsgdGhlbgorICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkvdXNyL2xvY2FsL2luY2x1ZGUiCisgIGZpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoLS13aXRoLXZpbS1uYW1lIGFyZ3VtZW50KQorQUNfQVJHX1dJVEgodmltLW5hbWUsIFsgIC0td2l0aC12aW0tbmFtZT1OQU1FICAgIHdoYXQgdG8gY2FsbCB0aGUgVmltIGV4ZWN1dGFibGVdLAorCVZJTU5BTUU9IiR3aXRodmFsIjsgQUNfTVNHX1JFU1VMVCgkVklNTkFNRSksCisJVklNTkFNRT0iJERFRkFVTFRfVklNTkFNRSI7IEFDX01TR19SRVNVTFQoRGVmYXVsdGluZyB0byAkVklNTkFNRSkpCitBQ19TVUJTVChWSU1OQU1FKQorQUNfTVNHX0NIRUNLSU5HKC0td2l0aC1leC1uYW1lIGFyZ3VtZW50KQorQUNfQVJHX1dJVEgoZXgtbmFtZSwgWyAgLS13aXRoLWV4LW5hbWU9TkFNRSAgICAgd2hhdCB0byBjYWxsIHRoZSBFeCBleGVjdXRhYmxlXSwKKwlFWE5BTUU9IiR3aXRodmFsIjsgQUNfTVNHX1JFU1VMVCgkRVhOQU1FKSwKKwlFWE5BTUU9ImV4IjsgQUNfTVNHX1JFU1VMVChEZWZhdWx0aW5nIHRvIGV4KSkKK0FDX1NVQlNUKEVYTkFNRSkKK0FDX01TR19DSEVDS0lORygtLXdpdGgtdmlldy1uYW1lIGFyZ3VtZW50KQorQUNfQVJHX1dJVEgodmlldy1uYW1lLCBbICAtLXdpdGgtdmlldy1uYW1lPU5BTUUgICB3aGF0IHRvIGNhbGwgdGhlIFZpZXcgZXhlY3V0YWJsZV0sCisJVklFV05BTUU9IiR3aXRodmFsIjsgQUNfTVNHX1JFU1VMVCgkVklFV05BTUUpLAorCVZJRVdOQU1FPSJ2aWV3IjsgQUNfTVNHX1JFU1VMVChEZWZhdWx0aW5nIHRvIHZpZXcpKQorQUNfU1VCU1QoVklFV05BTUUpCisKK0FDX01TR19DSEVDS0lORygtLXdpdGgtZ2xvYmFsLXJ1bnRpbWUgYXJndW1lbnQpCitBQ19BUkdfV0lUSChnbG9iYWwtcnVudGltZSwgWyAgLS13aXRoLWdsb2JhbC1ydW50aW1lPURJUiAgICBnbG9iYWwgcnVudGltZSBkaXJlY3RvcnkgaW4gJ3J1bnRpbWVwYXRoJ10sCisJQUNfTVNHX1JFU1VMVCgkd2l0aHZhbCk7IEFDX0RFRklORV9VTlFVT1RFRChSVU5USU1FX0dMT0JBTCwgIiR3aXRodmFsIiksCisJQUNfTVNHX1JFU1VMVChubykpCisKK0FDX01TR19DSEVDS0lORygtLXdpdGgtbW9kaWZpZWQtYnkgYXJndW1lbnQpCitBQ19BUkdfV0lUSChtb2RpZmllZC1ieSwgWyAgLS13aXRoLW1vZGlmaWVkLWJ5PU5BTUUgICAgICAgbmFtZSBvZiB3aG8gbW9kaWZpZWQgYSByZWxlYXNlIHZlcnNpb25dLAorCUFDX01TR19SRVNVTFQoJHdpdGh2YWwpOyBBQ19ERUZJTkVfVU5RVU9URUQoTU9ESUZJRURfQlksICIkd2l0aHZhbCIpLAorCUFDX01TR19SRVNVTFQobm8pKQorCitkbmwgQ2hlY2sgZm9yIEVCQ0RJQyBzdG9sZW4gZnJvbSB0aGUgTFlOWCBwb3J0IHRvIE9TMzkwIFVuaXgKK0FDX01TR19DSEVDS0lORyhpZiBjaGFyYWN0ZXIgc2V0IGlzIEVCQ0RJQykKK0FDX1RSWV9DT01QSUxFKFsgXSwKK1sgLyogVHJ5Q29tcGlsZSBmdW5jdGlvbiBmb3IgQ2hhclNldC4KKyAgIFRyZWF0IGFueSBmYWlsdXJlIGFzIEFTQ0lJIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXJ0LgorICAgVXNlIGNvbXBpbGUtdGltZSByYXRoZXIgdGhhbiBydW4tdGltZSB0ZXN0cyBmb3IgY3Jvc3MtY29tcGlsZXIKKyAgIHRvbGVyYW5jZS4gICovCisjaWYgJzAnIT0yNDAKK21ha2UgYW4gZXJyb3IgIkNoYXJhY3RlciBzZXQgaXMgbm90IEVCQ0RJQyIKKyNlbmRpZiBdLAorWyAjIFRyeUNvbXBpbGUgYWN0aW9uIGlmIHRydWUKK2NmX2N2X2ViY2RpYz15ZXMgXSwKK1sgIyBUcnlDb21waWxlIGFjdGlvbiBpZiBmYWxzZQorY2ZfY3ZfZWJjZGljPW5vXSkKKyMgZW5kIG9mIFRyeUNvbXBpbGUgXSkKKyMgZW5kIG9mIENhY2hlVmFsIEN2RWJjZGljCitBQ19NU0dfUkVTVUxUKCRjZl9jdl9lYmNkaWMpCitjYXNlICIkY2ZfY3ZfZWJjZGljIiBpbiAgIyh2aQorICAgIHllcykJQUNfREVGSU5FKEVCQ0RJQykKKwkJbGluZV9icmVhaz0nIlxcbiInCisJCTs7CisgICAgKikJCWxpbmVfYnJlYWs9JyJcXDAxMiInOzsKK2VzYWMKK0FDX1NVQlNUKGxpbmVfYnJlYWspCisKK2lmIHRlc3QgIiRjZl9jdl9lYmNkaWMiID0gInllcyI7IHRoZW4KK2RubCBJZiB3ZSBoYXZlIEVCQ0RJQyB3ZSBtb3N0IGxpa2xleSBoYXZlIE9TMzkwIFVuaXgsIGxldCdzIHRlc3QgaXQhCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIE9TLzM5MCBVbml4KQorY2FzZSBgdW5hbWVgIGluCisgICAgT1MvMzkwKQlPUzM5MFVuaXg9InllcyI7CisJCWRubCBJZiB1c2luZyBjYyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgX0NDX0NDTU9ERSBtdXN0IGJlCisJCWRubCBzZXQgdG8gIjEiLCBzbyB0aGF0IHNvbWUgY29tcGlsZXIgZXh0ZW5zaW9ucyBhcmUgZW5hYmxlZC4KKwkJZG5sIElmIHVzaW5nIGM4OSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmFtZWQgX0NDX0M4OU1PREUuCisJCWRubCBOb3RlOiBjb21waWxlIHdpdGggYzg5IG5ldmVyIHRlc3RlZC4KKwkJaWYgdGVzdCAiJENDIiA9ICJjYyI7IHRoZW4KKwkJICBjY209IiRfQ0NfQ0NNT0RFIgorCQkgIGNjbj0iQ0MiCisJCWVsc2UKKwkJICBpZiB0ZXN0ICIkQ0MiID0gImM4OSI7IHRoZW4KKwkJICAgIGNjbT0iJF9DQ19DODlNT0RFIgorCQkgICAgY2NuPSJDODkiCisJCSAgZWxzZQorCQkgICAgY2NtPTEKKwkJICBmaQorCQlmaQorCQlpZiB0ZXN0ICIkY2NtIiAhPSAiMSI7IHRoZW4KKwkJICBlY2hvICIiCisJCSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgIGVjaG8gIiBPbiBPUy8zOTAgVW5peCwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgorCQkgIGVjaG8gIiBfX0NDXyR7Y2NufU1PREUgbXVzdCBiZSBzZXQgdG8gXCIxXCIhIgorCQkgIGVjaG8gIiBEbzoiCisJCSAgZWNobyAiICAgIGV4cG9ydCBfQ0NfJHtjY259TU9ERT0xIgorCQkgIGVjaG8gIiBhbmQgdGhlbiBjYWxsIGNvbmZpZ3VyZSBhZ2Fpbi4iCisJCSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgIGV4aXQgMQorCQlmaQorCQlDRkxBR1M9IiRDRkxBR1MgLURfQUxMX1NPVVJDRSI7IExERkxBR1M9IiRMREZMQUdTIC1XbCxFRElUPU5PIgorCQlBQ19NU0dfUkVTVUxUKHllcykKKwkJOzsKKyAgICAqKQkJT1MzOTBVbml4PSJubyI7CisJCUFDX01TR19SRVNVTFQobm8pCisJCTs7Citlc2FjCitmaQorCisKK2RubCBDaGVjayB1c2VyIHJlcXVlc3RlZCBmZWF0dXJlcy4KKworQUNfTVNHX0NIRUNLSU5HKC0td2l0aC1mZWF0dXJlcyBhcmd1bWVudCkKK0FDX0FSR19XSVRIKGZlYXR1cmVzLCBbICAtLXdpdGgtZmVhdHVyZXM9VFlQRSAgICB0aW55LCBzbWFsbCwgbm9ybWFsLCBiaWcgb3IgaHVnZSAoZGVmYXVsdDogbm9ybWFsKV0sCisJZmVhdHVyZXM9IiR3aXRodmFsIjsgQUNfTVNHX1JFU1VMVCgkZmVhdHVyZXMpLAorCWZlYXR1cmVzPSJub3JtYWwiOyBBQ19NU0dfUkVTVUxUKERlZmF1bHRpbmcgdG8gbm9ybWFsKSkKKworZG92aW1kaWZmPSIiCitkb2d2aW1kaWZmPSIiCitjYXNlICIkZmVhdHVyZXMiIGluCisgIHRpbnkpCQlBQ19ERUZJTkUoRkVBVF9USU5ZKSA7OworICBzbWFsbCkJQUNfREVGSU5FKEZFQVRfU01BTEwpIDs7CisgIG5vcm1hbCkJQUNfREVGSU5FKEZFQVRfTk9STUFMKSBkb3ZpbWRpZmY9Imluc3RhbGx2aW1kaWZmIjsKKwkJCWRvZ3ZpbWRpZmY9Imluc3RhbGxndmltZGlmZiIgOzsKKyAgYmlnKQkJQUNfREVGSU5FKEZFQVRfQklHKSBkb3ZpbWRpZmY9Imluc3RhbGx2aW1kaWZmIjsKKwkJCWRvZ3ZpbWRpZmY9Imluc3RhbGxndmltZGlmZiIgOzsKKyAgaHVnZSkJCUFDX0RFRklORShGRUFUX0hVR0UpIGRvdmltZGlmZj0iaW5zdGFsbHZpbWRpZmYiOworCQkJZG9ndmltZGlmZj0iaW5zdGFsbGd2aW1kaWZmIiA7OworICAqKQkJQUNfTVNHX1JFU1VMVChbU29ycnksICRmZWF0dXJlcyBpcyBub3Qgc3VwcG9ydGVkXSkgOzsKK2VzYWMKKworQUNfU1VCU1QoZG92aW1kaWZmKQorQUNfU1VCU1QoZG9ndmltZGlmZikKKworQUNfTVNHX0NIRUNLSU5HKC0td2l0aC1jb21waWxlZGJ5IGFyZ3VtZW50KQorQUNfQVJHX1dJVEgoY29tcGlsZWRieSwgWyAgLS13aXRoLWNvbXBpbGVkYnk9TkFNRSAgbmFtZSB0byBzaG93IGluIDp2ZXJzaW9uIG1lc3NhZ2VdLAorCWNvbXBpbGVkYnk9IiR3aXRodmFsIjsgQUNfTVNHX1JFU1VMVCgkd2l0aHZhbCksCisJY29tcGlsZWRieT0iIjsgQUNfTVNHX1JFU1VMVChubykpCitBQ19TVUJTVChjb21waWxlZGJ5KQorCitBQ19NU0dfQ0hFQ0tJTkcoLS1kaXNhYmxlLXhzbXAgYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKHhzbXAsCisJWyAgLS1kaXNhYmxlLXhzbXAgICAgICAgICAgRGlzYWJsZSBYU01QIHNlc3Npb24gbWFuYWdlbWVudF0sCisJLCBlbmFibGVfeHNtcD0ieWVzIikKKworaWYgdGVzdCAiJGVuYWJsZV94c21wIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQobm8pCisgIEFDX01TR19DSEVDS0lORygtLWRpc2FibGUteHNtcC1pbnRlcmFjdCBhcmd1bWVudCkKKyAgQUNfQVJHX0VOQUJMRSh4c21wLWludGVyYWN0LAorCSAgWyAgLS1kaXNhYmxlLXhzbXAtaW50ZXJhY3QgRGlzYWJsZSBYU01QIGludGVyYWN0aW9uXSwKKwkgICwgZW5hYmxlX3hzbXBfaW50ZXJhY3Q9InllcyIpCisgIGlmIHRlc3QgIiRlbmFibGVfeHNtcF9pbnRlcmFjdCIgPSAieWVzIjsgdGhlbgorICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgQUNfREVGSU5FKFVTRV9YU01QX0lOVEVSQUNUKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgIGZpCitlbHNlCisgIEFDX01TR19SRVNVTFQoeWVzKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLXBlcmxpbnRlcnAgYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKHBlcmxpbnRlcnAsCisJWyAgLS1lbmFibGUtcGVybGludGVycCAgICAgSW5jbHVkZSBQZXJsIGludGVycHJldGVyLl0sICwKKwlbZW5hYmxlX3BlcmxpbnRlcnA9Im5vIl0pCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfcGVybGludGVycCkKK2lmIHRlc3QgIiRlbmFibGVfcGVybGludGVycCIgPSAieWVzIjsgdGhlbgorICBBQ19TVUJTVCh2aV9jdl9wYXRoX3BlcmwpCisgIEFDX1BBVEhfUFJPRyh2aV9jdl9wYXRoX3BlcmwsIHBlcmwpCisgIGlmIHRlc3QgIlgkdmlfY3ZfcGF0aF9wZXJsIiAhPSAiWCI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoUGVybCB2ZXJzaW9uKQorICAgIGlmICR2aV9jdl9wYXRoX3BlcmwgLWUgJ3JlcXVpcmUgNS4wMDNfMDEnID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgZXZhbCBgJHZpX2N2X3BhdGhfcGVybCAtVjp1c2V0aHJlYWRzYAorICAgICBpZiB0ZXN0ICJYJHVzZXRocmVhZHMiID0gIlhVTktOT1dOIiAtbyAiWCR1c2V0aHJlYWRzIiA9ICJYdW5kZWYiOyB0aGVuCisgICAgICAgYmFkdGhyZWFkcz1ubworICAgICBlbHNlCisgICAgICAgaWYgJHZpX2N2X3BhdGhfcGVybCAtZSAncmVxdWlyZSA1LjYuMCcgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCSBldmFsIGAkdmlfY3ZfcGF0aF9wZXJsIC1WOnVzZTUwMDV0aHJlYWRzYAorCSBpZiB0ZXN0ICJYJHVzZTUwMDV0aHJlYWRzIiA9ICJYVU5LTk9XTiIgLW8gIlgkdXNlNTAwNXRocmVhZHMiID0gIlh1bmRlZiI7IHRoZW4KKwkgICBiYWR0aHJlYWRzPW5vCisJIGVsc2UKKwkgICBiYWR0aHJlYWRzPXllcworCSAgIEFDX01TR19SRVNVTFQoPj4+IFBlcmwgPiA1LjYgd2l0aCA1LjUgdGhyZWFkcyBjYW5ub3QgYmUgdXNlZCA8PDwpCisJIGZpCisgICAgICAgZWxzZQorCSBiYWR0aHJlYWRzPXllcworCSBBQ19NU0dfUkVTVUxUKD4+PiBQZXJsIDUuNSB3aXRoIHRocmVhZHMgY2Fubm90IGJlIHVzZWQgPDw8KQorICAgICAgIGZpCisgICAgIGZpCisgICAgIGlmIHRlc3QgJGJhZHRocmVhZHMgPSBubzsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVChPSykKKyAgICAgIGV2YWwgYCR2aV9jdl9wYXRoX3BlcmwgLVY6c2hycGVudmAKKyAgICAgIGlmIHRlc3QgIlgkc2hycGVudiIgPSAiWFVOS05PV04iOyB0aGVuICMgcHJlIDUuMDAzXzA0CisJc2hycGVudj0iIgorICAgICAgZmkKKyAgICAgIHZpX2N2X3BlcmxsaWI9YCR2aV9jdl9wYXRoX3BlcmwgLU1Db25maWcgLWUgJ3ByaW50ICRDb25maWd7cHJpdmxpYmV4cH0nYAorICAgICAgQUNfU1VCU1QodmlfY3ZfcGVybGxpYikKKyAgICAgIGRubCBSZW1vdmUgIi1mbm8tc29tZXRoaW5nIiwgaXQgYnJlYWtzIHVzaW5nIGNwcm90by4KKyAgICAgIHBlcmxjcHBmbGFncz1gJHZpX2N2X3BhdGhfcGVybCAtTWxpYj0kc3JjZGlyIC1NRXh0VXRpbHM6OkVtYmVkIFwKKwkgICAgICAtZSAnY2NmbGFncztwZXJsX2luYztwcmludCJcbiInIHwgc2VkIC1lICdzLy1mbm9bW14gXV0qLy8nYAorICAgICAgZG5sIFJlbW92ZSAiLWxjIiwgaXQgYnJlYWtzIG9uIEZyZWVCU0Qgd2hlbiB1c2luZyAiLXB0aHJlYWQiLgorICAgICAgcGVybGxpYnM9YGNkICRzcmNkaXI7ICR2aV9jdl9wYXRoX3BlcmwgLU1FeHRVdGlsczo6RW1iZWQgLWUgJ2xkb3B0cycgfCBcCisJCXNlZCAtZSAnL1dhcm5pbmcvZCcgLWUgJy9Ob3RlIChwcm9iYWJseSBoYXJtbGVzcykvZCcgXAorCQkJLWUgJ3MvLWJFOnBlcmwuZXhwLy8nIC1lICdzLy1sYyAvLydgCisgICAgICBkbmwgRG9uJ3QgYWRkIHBlcmwgbGliIHRvICRMSUJTOiBpZiBpdCdzIG5vdCBpbiBMRF9MSUJSQVJZX1BBVEgKKyAgICAgIGRubCBhIHRlc3QgaW4gY29uZmlndXJlIG1heSBmYWlsIGJlY2F1c2Ugb2YgdGhhdC4KKyAgICAgIHBlcmxsZGZsYWdzPWBjZCAkc3JjZGlyOyAkdmlfY3ZfcGF0aF9wZXJsIC1NRXh0VXRpbHM6OkVtYmVkIFwKKwkJLWUgJ2NjZGxmbGFncycgfCBzZWQgLWUgJ3MvLWJFOnBlcmwuZXhwLy8nYAorCisgICAgICBkbmwgY2hlY2sgdGhhdCBjb21waWxpbmcgYSBzaW1wbGUgcHJvZ3JhbSBzdGlsbCB3b3JrcyB3aXRoIHRoZSBmbGFncworICAgICAgZG5sIGFkZGVkIGZvciBQZXJsLgorICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlIGFuZCBsaW5rIGZsYWdzIGZvciBQZXJsIGFyZSBzYW5lXSkKKyAgICAgIGNmbGFnc19zYXZlPSRDRkxBR1MKKyAgICAgIGxpYnNfc2F2ZT0kTElCUworICAgICAgbGRmbGFnc19zYXZlPSRMREZMQUdTCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJHBlcmxjcHBmbGFncyIKKyAgICAgIExJQlM9IiRMSUJTICRwZXJsbGlicyIKKyAgICAgIExERkxBR1M9IiRwZXJsbGRmbGFncyAkTERGTEFHUyIKKyAgICAgIEFDX1RSWV9MSU5LKCxbIF0sCisJICAgICBBQ19NU0dfUkVTVUxUKHllcyk7IHBlcmxfb2s9eWVzLAorCSAgICAgQUNfTVNHX1JFU1VMVChubzogUEVSTCBESVNBQkxFRCk7IHBlcmxfb2s9bm8pCisgICAgICBDRkxBR1M9JGNmbGFnc19zYXZlCisgICAgICBMSUJTPSRsaWJzX3NhdmUKKyAgICAgIExERkxBR1M9JGxkZmxhZ3Nfc2F2ZQorICAgICAgaWYgdGVzdCAkcGVybF9vayA9IHllczsgdGhlbgorCWlmIHRlc3QgIlgkcGVybGNwcGZsYWdzIiAhPSAiWCI7IHRoZW4KKwkgIFBFUkxfQ0ZMQUdTPSIkcGVybGNwcGZsYWdzIgorCWZpCisJaWYgdGVzdCAiWCRwZXJsbGRmbGFncyIgIT0gIlgiOyB0aGVuCisJICBMREZMQUdTPSIkcGVybGxkZmxhZ3MgJExERkxBR1MiCisJZmkKKwlQRVJMX0xJQlM9JHBlcmxsaWJzCisJUEVSTF9TUkM9ImF1dG8vaWZfcGVybC5jIGlmX3BlcmxzZmlvLmMiCisJUEVSTF9PQko9Im9iamVjdHMvaWZfcGVybC5vIG9iamVjdHMvaWZfcGVybHNmaW8ubyIKKwlQRVJMX1BSTz0iaWZfcGVybC5wcm8gaWZfcGVybHNmaW8ucHJvIgorCUFDX0RFRklORShGRUFUX1BFUkwpCisgICAgICBmaQorICAgICBmaQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQoPj4+IHRvbyBvbGQ7IG5lZWQgUGVybCB2ZXJzaW9uIDUuMDAzXzAxIG9yIGxhdGVyIDw8PCkKKyAgICBmaQorICBmaQorCisgIGlmIHRlc3QgIngkTUFDT1NYIiA9ICJ4eWVzIjsgdGhlbgorICAgIGRubCBNYWMgT1MgWCAxMC4yIG9yIDEwLjMKKyAgICBkaXI9L1N5c3RlbS9MaWJyYXJ5L1BlcmwKKyAgICBkYXJ3aW5kaXI9JGRpci9kYXJ3aW4KKyAgICBpZiB0ZXN0IC1kICRkYXJ3aW5kaXI7IHRoZW4KKyAgICAgIFBFUkw9L3Vzci9iaW4vcGVybAorICAgIGVsc2UKKyAgICAgIGRubCBNYWMgT1MgWCAxMC4zCisgICAgICBkaXI9L1N5c3RlbS9MaWJyYXJ5L1BlcmwvNS44LjEKKyAgICAgIGRhcndpbmRpcj0kZGlyL2Rhcndpbi10aHJlYWQtbXVsdGktMmxldmVsCisgICAgICBpZiB0ZXN0IC1kICRkYXJ3aW5kaXI7IHRoZW4KKwlQRVJMPS91c3IvYmluL3BlcmwKKyAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KKyAgICAgIFBFUkxfRElSPSIkZGlyIgorICAgICAgUEVSTF9DRkxBR1M9Ii1ERkVBVF9QRVJMIC1JJGRhcndpbmRpci9DT1JFIgorICAgICAgUEVSTF9PQko9Im9iamVjdHMvaWZfcGVybC5vIG9iamVjdHMvaWZfcGVybHNmaW8ubyAkZGFyd2luZGlyL2F1dG8vRHluYUxvYWRlci9EeW5hTG9hZGVyLmEiCisgICAgICBQRVJMX0xJQlM9Ii1MJGRhcndpbmRpci9DT1JFIC1scGVybCIKKyAgICBmaQorICBmaQorZmkKK0FDX1NVQlNUKHNocnBlbnYpCitBQ19TVUJTVChQRVJMX1NSQykKK0FDX1NVQlNUKFBFUkxfT0JKKQorQUNfU1VCU1QoUEVSTF9QUk8pCitBQ19TVUJTVChQRVJMX0NGTEFHUykKK0FDX1NVQlNUKFBFUkxfTElCUykKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLXB5dGhvbmludGVycCBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUocHl0aG9uaW50ZXJwLAorCVsgIC0tZW5hYmxlLXB5dGhvbmludGVycCAgIEluY2x1ZGUgUHl0aG9uIGludGVycHJldGVyLl0sICwKKwlbZW5hYmxlX3B5dGhvbmludGVycD0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9weXRob25pbnRlcnApCitpZiB0ZXN0ICIkZW5hYmxlX3B5dGhvbmludGVycCIgPSAieWVzIjsgdGhlbgorICBkbmwgLS0gZmluZCB0aGUgcHl0aG9uIGV4ZWN1dGFibGUKKyAgQUNfUEFUSF9QUk9HKHZpX2N2X3BhdGhfcHl0aG9uLCBweXRob24pCisgIGlmIHRlc3QgIlgkdmlfY3ZfcGF0aF9weXRob24iICE9ICJYIjsgdGhlbgorCisgICAgZG5sIC0tIGdldCBpdHMgdmVyc2lvbiBudW1iZXIKKyAgICBBQ19DQUNIRV9DSEVDSyhQeXRob24gdmVyc2lvbix2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb24sCisgICAgW1t2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb249YAorCSAgICAke3ZpX2N2X3BhdGhfcHl0aG9ufSAtYyAnaW1wb3J0IHN5czsgcHJpbnQgc3lzLnZlcnNpb25bOjNdJ2AKKyAgICBdXSkKKworICAgIGRubCAtLSBpdCBtdXN0IGJlIGF0IGxlYXN0IHZlcnNpb24gMS40CisgICAgQUNfTVNHX0NIRUNLSU5HKFB5dGhvbiBpcyAxLjQgb3IgYmV0dGVyKQorICAgIGlmICR7dmlfY3ZfcGF0aF9weXRob259IC1jIFwKKwkiaW1wb3J0IHN5czsgc3lzLmV4aXQoJHt2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb259IDwgMS40KSIKKyAgICB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKHllcCkKKworICAgICAgZG5sIC0tIGZpbmQgd2hlcmUgcHl0aG9uIHRoaW5rcyBpdCB3YXMgaW5zdGFsbGVkCisgICAgICBBQ19DQUNIRV9DSEVDSyhQeXRob24ncyBpbnN0YWxsIHByZWZpeCx2aV9jdl9wYXRoX3B5dGhvbl9wZngsCisgICAgICBbIHZpX2N2X3BhdGhfcHl0aG9uX3BmeD1gCisJICAgICR7dmlfY3ZfcGF0aF9weXRob259IC1jIFwKKwkJImltcG9ydCBzeXM7IHByaW50IHN5cy5wcmVmaXgiYCBdKQorCisgICAgICBkbmwgLS0gYW5kIHdoZXJlIGl0IHRoaW5rcyBpdCBydW5zCisgICAgICBBQ19DQUNIRV9DSEVDSyhQeXRob24ncyBleGVjdXRpb24gcHJlZml4LHZpX2N2X3BhdGhfcHl0aG9uX2VwZngsCisgICAgICBbIHZpX2N2X3BhdGhfcHl0aG9uX2VwZng9YAorCSAgICAke3ZpX2N2X3BhdGhfcHl0aG9ufSAtYyBcCisJCSJpbXBvcnQgc3lzOyBwcmludCBzeXMuZXhlY19wcmVmaXgiYCBdKQorCisgICAgICBkbmwgLS0gcHl0aG9uJ3MgaW50ZXJuYWwgbGlicmFyeSBwYXRoCisKKyAgICAgIEFDX0NBQ0hFX1ZBTCh2aV9jdl9wYXRoX3B5dGhvbnBhdGgsCisgICAgICBbIHZpX2N2X3BhdGhfcHl0aG9ucGF0aD1gCisJICAgIHVuc2V0IFBZVEhPTlBBVEg7CisJICAgICR7dmlfY3ZfcGF0aF9weXRob259IC1jIFwKKwkJImltcG9ydCBzeXMsIHN0cmluZzsgcHJpbnQgc3RyaW5nLmpvaW4oc3lzLnBhdGgsJzonKSJgIF0pCisKKyAgICAgIGRubCAtLSB3aGVyZSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgYXJjaGl2ZXMgYXJlCisKKyAgICAgIEFDX0FSR19XSVRIKHB5dGhvbi1jb25maWctZGlyLAorCVsgIC0td2l0aC1weXRob24tY29uZmlnLWRpcj1QQVRIICBQeXRob24ncyBjb25maWcgZGlyZWN0b3J5XSwKKwlbIHZpX2N2X3BhdGhfcHl0aG9uX2NvbmY9IiR7d2l0aHZhbH0iIF0gKQorCisgICAgICBBQ19DQUNIRV9DSEVDSyhQeXRob24ncyBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSx2aV9jdl9wYXRoX3B5dGhvbl9jb25mLAorICAgICAgWworCXZpX2N2X3BhdGhfcHl0aG9uX2NvbmY9CisJZm9yIHBhdGggaW4gIiR7dmlfY3ZfcGF0aF9weXRob25fcGZ4fSIgIiR7dmlfY3ZfcGF0aF9weXRob25fZXBmeH0iOyBkbworCSAgZm9yIHN1YmRpciBpbiBsaWIgc2hhcmU7IGRvCisJICAgIGQ9IiR7cGF0aH0vJHtzdWJkaXJ9L3B5dGhvbiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufS9jb25maWciCisJICAgIGlmIHRlc3QgLWQgIiRkIiAmJiB0ZXN0IC1mICIkZC9jb25maWcuYyI7IHRoZW4KKwkgICAgICB2aV9jdl9wYXRoX3B5dGhvbl9jb25mPSIkZCIKKwkgICAgZmkKKwkgIGRvbmUKKwlkb25lCisgICAgICBdKQorCisgICAgICBQWVRIT05fQ09ORkRJUj0iJHt2aV9jdl9wYXRoX3B5dGhvbl9jb25mfSIKKworICAgICAgaWYgdGVzdCAiWCRQWVRIT05fQ09ORkRJUiIgPSAiWCI7IHRoZW4KKwlBQ19NU0dfUkVTVUxUKFtjYW4ndCBmaW5kIGl0IV0pCisgICAgICBlbHNlCisKKwlkbmwgLS0gd2UgbmVlZCB0byBleGFtaW5lIFB5dGhvbidzIGNvbmZpZy9NYWtlZmlsZSB0b28KKwlkbmwgICAgc2VlIHdoYXQgdGhlIGludGVycHJldGVyIGlzIGJ1aWx0IGZyb20KKwlBQ19DQUNIRV9WQUwodmlfY3ZfcGF0aF9weXRob25fcGxpYnMsCisJWworCSAgICB0bXBfbWtmPSIvdG1wL01ha2VmaWxlLWNvbmYkJCIKKwkgICAgY2F0ICR7UFlUSE9OX0NPTkZESVJ9L01ha2VmaWxlIC0gPDwnZW9mJyA+JHt0bXBfbWtmfQorX186CisJQGVjaG8gInB5dGhvbl9NT0RMSUJTPSckKE1PRExJQlMpJyIKKwlAZWNobyAicHl0aG9uX0xJQlM9JyQoTElCUyknIgorCUBlY2hvICJweXRob25fU1lTTElCUz0nJChTWVNMSUJTKSciCisJQGVjaG8gInB5dGhvbl9MSU5LRk9SU0hBUkVEPSckKExJTktGT1JTSEFSRUQpJyIKK2VvZgorCSAgICBkbmwgLS0gZGVsZXRlIHRoZSBsaW5lcyBmcm9tIG1ha2UgYWJvdXQgRW50ZXJpbmcvTGVhdmluZyBkaXJlY3RvcnkKKwkgICAgZXZhbCAiYGNkICR7UFlUSE9OX0NPTkZESVJ9ICYmIG1ha2UgLWYgJHt0bXBfbWtmfSBfXyB8IHNlZCAnLyBkaXJlY3RvcnkgL2QnYCIKKwkgICAgcm0gLWYgJHt0bXBfbWtmfQorCSAgICBpZiB0ZXN0ICJ4JE1BQ09TWCIgPSAieHllcyIgJiYgJHt2aV9jdl9wYXRoX3B5dGhvbn0gLWMgXAorCQkiaW1wb3J0IHN5czsgc3lzLmV4aXQoJHt2aV9jdl92YXJfcHl0aG9uX3ZlcnNpb259IDwgMi4zKSI7IHRoZW4KKwkgICAgICB2aV9jdl9wYXRoX3B5dGhvbl9wbGlicz0iLWZyYW1ld29yayBQeXRob24iCisJICAgIGVsc2UKKwkgICAgICBpZiB0ZXN0ICIke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0iID0gIjEuNCI7IHRoZW4KKwkJICB2aV9jdl9wYXRoX3B5dGhvbl9wbGlicz0iJHtQWVRIT05fQ09ORkRJUn0vbGliTW9kdWxlcy5hICR7UFlUSE9OX0NPTkZESVJ9L2xpYlB5dGhvbi5hICR7UFlUSE9OX0NPTkZESVJ9L2xpYk9iamVjdHMuYSAke1BZVEhPTl9DT05GRElSfS9saWJQYXJzZXIuYSIKKwkgICAgICBlbHNlCisJCSAgdmlfY3ZfcGF0aF9weXRob25fcGxpYnM9Ii1MJHtQWVRIT05fQ09ORkRJUn0gLWxweXRob24ke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0iCisJICAgICAgZmkKKwkgICAgICB2aV9jdl9wYXRoX3B5dGhvbl9wbGlicz0iJHt2aV9jdl9wYXRoX3B5dGhvbl9wbGlic30gJHtweXRob25fTU9ETElCU30gJHtweXRob25fTElCU30gJHtweXRob25fU1lTTElCU30gJHtweXRob25fTElOS0ZPUlNIQVJFRH0iCisJICAgICAgZG5sIHJlbW92ZSAtbHRlcm1jYXAsIGl0IGNhbiBjb25mbGljdCB3aXRoIGFuIGVhcmxpZXIgLWxuY3Vyc2VzCisJICAgICAgdmlfY3ZfcGF0aF9weXRob25fcGxpYnM9YGVjaG8gJHZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzIHwgc2VkIHMvLWx0ZXJtY2FwLy9gCisJICAgIGZpCisJXSkKKworCVBZVEhPTl9MSUJTPSIke3ZpX2N2X3BhdGhfcHl0aG9uX3BsaWJzfSIKKwlpZiB0ZXN0ICIke3ZpX2N2X3BhdGhfcHl0aG9uX3BmeH0iID0gIiR7dmlfY3ZfcGF0aF9weXRob25fZXBmeH0iOyB0aGVuCisJICBQWVRIT05fQ0ZMQUdTPSItSSR7dmlfY3ZfcGF0aF9weXRob25fcGZ4fS9pbmNsdWRlL3B5dGhvbiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufSIKKwllbHNlCisJICBQWVRIT05fQ0ZMQUdTPSItSSR7dmlfY3ZfcGF0aF9weXRob25fcGZ4fS9pbmNsdWRlL3B5dGhvbiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufSAtSSR7dmlfY3ZfcGF0aF9weXRob25fZXBmeH0vaW5jbHVkZS9weXRob24ke3ZpX2N2X3Zhcl9weXRob25fdmVyc2lvbn0iCisJZmkKKwlQWVRIT05fU1JDPSJpZl9weXRob24uYyIKKwlkbmwgRm9yIE1hYyBPU1ggMTAuMiBjb25maWcubyBpcyBpbmNsdWRlZCBpbiB0aGUgUHl0aG9uIGxpYnJhcnkuCisJaWYgdGVzdCAieCRNQUNPU1giID0gInh5ZXMiOyB0aGVuCisJICBQWVRIT05fT0JKPSJvYmplY3RzL2lmX3B5dGhvbi5vIgorCWVsc2UKKwkgIFBZVEhPTl9PQko9Im9iamVjdHMvaWZfcHl0aG9uLm8gb2JqZWN0cy9weV9jb25maWcubyIKKwlmaQorCWlmIHRlc3QgIiR7dmlfY3ZfdmFyX3B5dGhvbl92ZXJzaW9ufSIgPSAiMS40IjsgdGhlbgorCSAgIFBZVEhPTl9PQko9IiRQWVRIT05fT0JKIG9iamVjdHMvcHlfZ2V0cGF0aC5vIgorCWZpCisJUFlUSE9OX0dFVFBBVEhfQ0ZMQUdTPSItRFBZVEhPTlBBVEg9J1wiJHt2aV9jdl9wYXRoX3B5dGhvbnBhdGh9XCInIC1EUFJFRklYPSdcIiR7dmlfY3ZfcGF0aF9weXRob25fcGZ4fVwiJyAtREVYRUNfUFJFRklYPSdcIiR7dmlfY3ZfcGF0aF9weXRob25fZXBmeH1cIiciCisKKwlkbmwgT24gRnJlZUJTRCBsaW5raW5nIHdpdGggIi1wdGhyZWFkIiBpcyByZXF1aXJlZCB0byB1c2UgdGhyZWFkcy4KKwlkbmwgX1RIUkVBRF9TQUZFIG11c3QgYmUgdXNlZCBmb3IgY29tcGlsaW5nIHRoZW4uCisJZG5sIFRoZSAiLXB0aHJlYWQiIGlzIGFkZGVkIHRvICRMSUJTLCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY2hlY2sgZm9yCisJZG5sIHNpZ2FsdHN0YWNrKCkgd2lsbCBsb29rIGluIGxpYmNfciAoaXQncyB0aGVyZSBpbiBsaWJjISkuCisJZG5sIE90aGVyd2lzZSwgd2hlbiB1c2luZyBHQ0MsIHRyeSBhZGRpbmcgLXB0aHJlYWQgdG8gJENGTEFHUy4gIEdDQworCWRubCB3aWxsIHRoZW4gZGVmaW5lIHRhcmdldC1zcGVjaWZpYyBkZWZpbmVzLCBlLmcuLCAtRF9SRUVOVFJBTlQuCisJZG5sIERvbid0IGRvIHRoaXMgZm9yIE1hYyBPU1gsIC1wdGhyZWFkIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorCUFDX01TR19DSEVDS0lORyhbaWYgLXB0aHJlYWQgc2hvdWxkIGJlIHVzZWRdKQorCXRocmVhZHNhZmVfZmxhZz0KKwl0aHJlYWRfbGliPQorCWlmIHRlc3QgIngkTUFDT1NYIiAhPSAieHllcyI7IHRoZW4KKwkgIHRlc3QgIiRHQ0MiID0geWVzICYmIHRocmVhZHNhZmVfZmxhZz0iLXB0aHJlYWQiCisJICBpZiB0ZXN0ICJgKHVuYW1lKSAyPi9kZXYvbnVsbGAiID0gRnJlZUJTRDsgdGhlbgorCSAgICB0aHJlYWRzYWZlX2ZsYWc9Ii1EX1RIUkVBRF9TQUZFIgorCSAgICB0aHJlYWRfbGliPSItcHRocmVhZCIKKwkgIGZpCisJZmkKKwlsaWJzX3NhdmVfb2xkPSRMSUJTCisJaWYgdGVzdCAtbiAiJHRocmVhZHNhZmVfZmxhZyI7IHRoZW4KKwkgIGNmbGFnc19zYXZlPSRDRkxBR1MKKwkgIENGTEFHUz0iJENGTEFHUyAkdGhyZWFkc2FmZV9mbGFnIgorCSAgTElCUz0iJExJQlMgJHRocmVhZF9saWIiCisJICBBQ19UUllfTElOSygsWyBdLAorCSAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpOyBQWVRIT05fQ0ZMQUdTPSIkUFlUSE9OX0NGTEFHUyAkdGhyZWFkc2FmZV9mbGFnIiwKKwkgICAgIEFDX01TR19SRVNVTFQobm8pOyBMSUJTPSRsaWJzX3NhdmVfb2xkCisJICAgICApCisJICBDRkxBR1M9JGNmbGFnc19zYXZlCisJZWxzZQorCSAgQUNfTVNHX1JFU1VMVChubykKKwlmaQorCisJZG5sIGNoZWNrIHRoYXQgY29tcGlsaW5nIGEgc2ltcGxlIHByb2dyYW0gc3RpbGwgd29ya3Mgd2l0aCB0aGUgZmxhZ3MKKwlkbmwgYWRkZWQgZm9yIFB5dGhvbi4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2lmIGNvbXBpbGUgYW5kIGxpbmsgZmxhZ3MgZm9yIFB5dGhvbiBhcmUgc2FuZV0pCisJY2ZsYWdzX3NhdmU9JENGTEFHUworCWxpYnNfc2F2ZT0kTElCUworCUNGTEFHUz0iJENGTEFHUyAkUFlUSE9OX0NGTEFHUyIKKwlMSUJTPSIkTElCUyAkUFlUSE9OX0xJQlMiCisJQUNfVFJZX0xJTksoLFsgXSwKKwkgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpOyBweXRob25fb2s9eWVzLAorCSAgICAgICBBQ19NU0dfUkVTVUxUKG5vOiBQWVRIT04gRElTQUJMRUQpOyBweXRob25fb2s9bm8pCisJQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorCUxJQlM9JGxpYnNfc2F2ZQorCWlmIHRlc3QgJHB5dGhvbl9vayA9IHllczsgdGhlbgorCSAgQUNfREVGSU5FKEZFQVRfUFlUSE9OKQorCWVsc2UKKwkgIExJQlM9JGxpYnNfc2F2ZV9vbGQKKwkgIFBZVEhPTl9TUkM9CisJICBQWVRIT05fT0JKPQorCSAgUFlUSE9OX0xJQlM9CisJICBQWVRIT05fQ0ZMQUdTPQorCWZpCisKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVCh0b28gb2xkKQorICAgIGZpCisgIGZpCitmaQorQUNfU1VCU1QoUFlUSE9OX0NPTkZESVIpCitBQ19TVUJTVChQWVRIT05fTElCUykKK0FDX1NVQlNUKFBZVEhPTl9HRVRQQVRIX0NGTEFHUykKK0FDX1NVQlNUKFBZVEhPTl9DRkxBR1MpCitBQ19TVUJTVChQWVRIT05fU1JDKQorQUNfU1VCU1QoUFlUSE9OX09CSikKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLXRjbGludGVycCBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUodGNsaW50ZXJwLAorCVsgIC0tZW5hYmxlLXRjbGludGVycCAgICAgIEluY2x1ZGUgVGNsIGludGVycHJldGVyLl0sICwKKwlbZW5hYmxlX3RjbGludGVycD0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV90Y2xpbnRlcnApCisKK2lmIHRlc3QgIiRlbmFibGVfdGNsaW50ZXJwIiA9ICJ5ZXMiOyB0aGVuCisKKyAgZG5sIG9uIEZyZWVCU0QgdGNsc2ggaXMgYSBzaWxseSBzY3JpcHQsIGxvb2sgZm9yIHRjbHNoOC4wIG9yIHRjbHNoOC4yCisgIEFDX01TR19DSEVDS0lORygtLXdpdGgtdGNsc2ggYXJndW1lbnQpCisgIEFDX0FSR19XSVRIKHRjbHNoLCBbICAtLXdpdGgtdGNsc2g9UEFUSCAgICAgICB3aGljaCB0Y2xzaCB0byB1c2UgKGRlZmF1bHQ6IHRjbHNoOC4wKV0sCisJdGNsc2hfbmFtZT0iJHdpdGh2YWwiOyBBQ19NU0dfUkVTVUxUKCR0Y2xzaF9uYW1lKSwKKwl0Y2xzaF9uYW1lPSJ0Y2xzaDguMCI7IEFDX01TR19SRVNVTFQobm8pKQorICBBQ19QQVRIX1BST0codmlfY3ZfcGF0aF90Y2wsICR0Y2xzaF9uYW1lKQorICBBQ19TVUJTVCh2aV9jdl9wYXRoX3RjbCkKKworICBkbmwgd2hlbiBubyBzcGVjaWZpYyB2ZXJzaW9uIHNwZWNpZmllZCwgYWxzbyB0cnkgOC4yCisgIGlmIHRlc3QgIlgkdmlfY3ZfcGF0aF90Y2wiID0gIlgiIC1hICR0Y2xzaF9uYW1lID0gInRjbHNoOC4wIjsgdGhlbgorICAgIHRjbHNoX25hbWU9InRjbHNoOC4yIgorICAgIEFDX1BBVEhfUFJPRyh2aV9jdl9wYXRoX3RjbCwgJHRjbHNoX25hbWUpCisgIGZpCisgIGRubCBzdGlsbCBkaWRuJ3QgZmluZCBpdCwgdHJ5IHdpdGhvdXQgdmVyc2lvbiBudW1iZXIKKyAgaWYgdGVzdCAiWCR2aV9jdl9wYXRoX3RjbCIgPSAiWCI7IHRoZW4KKyAgICB0Y2xzaF9uYW1lPSJ0Y2xzaCIKKyAgICBBQ19QQVRIX1BST0codmlfY3ZfcGF0aF90Y2wsICR0Y2xzaF9uYW1lKQorICBmaQorICBpZiB0ZXN0ICJYJHZpX2N2X3BhdGhfdGNsIiAhPSAiWCI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoVGNsIHZlcnNpb24pCisgICAgaWYgZWNobyAnZXhpdCBbW2V4cHIgW2luZm8gdGNsdmVyc2lvbl0gPCA4LjBdXScgfCAkdmlfY3ZfcGF0aF90Y2wgLSA7IHRoZW4KKyAgICAgIHRjbHZlcj1gZWNobyAncHV0cyBbW2luZm8gdGNsdmVyc2lvbl1dJyB8ICR2aV9jdl9wYXRoX3RjbCAtYAorICAgICAgQUNfTVNHX1JFU1VMVCgkdGNsdmVyIC0gT0spOworICAgICAgdGNsbG9jPWBlY2hvICdzZXQgbCBbW2luZm8gbGlicmFyeV1dO3NldCBpIFtbc3RyaW5nIGxhc3QgbGliICRsXV07aW5jciBpIC0yO3B1dHMgW1tzdHJpbmcgcmFuZ2UgJGwgMCAkaV1dJyB8ICR2aV9jdl9wYXRoX3RjbCAtYAorCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvY2F0aW9uIG9mIFRjbCBpbmNsdWRlKQorICAgICAgaWYgdGVzdCAieCRNQUNPU1giICE9ICJ4eWVzIjsgdGhlbgorCXRjbGluYz0iJHRjbGxvYy9pbmNsdWRlICR0Y2xsb2MvaW5jbHVkZS90Y2wgJHRjbGxvYy9pbmNsdWRlL3RjbCR0Y2x2ZXIgL3Vzci9sb2NhbC9pbmNsdWRlIgorICAgICAgZWxzZQorCWRubCBGb3IgTWFjIE9TIFggMTAuMywgdXNlIHRoZSBPUy1wcm92aWRlZCBmcmFtZXdvcmsgbG9jYXRpb24KKwl0Y2xpbmM9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1RjbC5mcmFtZXdvcmsvSGVhZGVycyIKKyAgICAgIGZpCisgICAgICBmb3IgdHJ5IGluICR0Y2xpbmM7IGRvCisJaWYgdGVzdCAtZiAiJHRyeS90Y2wuaCI7IHRoZW4KKwkgIEFDX01TR19SRVNVTFQoJHRyeS90Y2wuaCkKKwkgIFRDTF9JTkM9JHRyeQorCSAgYnJlYWsKKwlmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJFRDTF9JTkMiOyB0aGVuCisJQUNfTVNHX1JFU1VMVCg8bm90IGZvdW5kPikKKwlTS0lQX1RDTD1ZRVMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC16ICIkU0tJUF9UQ0wiOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKGZvciBsb2NhdGlvbiBvZiB0Y2xDb25maWcuc2ggc2NyaXB0KQorCWlmIHRlc3QgIngkTUFDT1NYIiAhPSAieHllcyI7IHRoZW4KKwkgIHRjbGNuZj1gZWNobyAkdGNsaW5jIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKKwllbHNlCisJICBkbmwgRm9yIE1hYyBPUyBYIDEwLjMsIHVzZSB0aGUgT1MtcHJvdmlkZWQgZnJhbWV3b3JrIGxvY2F0aW9uCisJICB0Y2xjbmY9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1RjbC5mcmFtZXdvcmsiCisJZmkKKwlmb3IgdHJ5IGluICR0Y2xjbmY7IGRvCisJICBpZiB0ZXN0IC1mICR0cnkvdGNsQ29uZmlnLnNoOyB0aGVuCisJICAgIEFDX01TR19SRVNVTFQoJHRyeS90Y2xDb25maWcuc2gpCisJICAgIC4gJHRyeS90Y2xDb25maWcuc2gKKwkgICAgZG5sIHVzZSBldmFsLCBiZWNhdXNlIHRjbCA4LjIgaW5jbHVkZXMgJHtUQ0xfREJHWH0KKwkgICAgVENMX0xJQlM9YGV2YWwgZWNobyAiJFRDTF9MSUJfU1BFQyAkVENMX0xJQlMiYAorCSAgICBkbmwgVXNlICRUQ0xfREVGUyBmb3IgLURfVEhSRUFEX1NBRkUgZXQgYWwuICBCdXQgb25seSB1c2UgdGhlCisJICAgIGRubCAiLURfQUJDIiBpdGVtcy4KKwkgICAgVENMX0RFRlM9YGVjaG8gJFRDTF9ERUZTIHwgdHIgJyAnICdcMDEyJyB8IHNlZCAtZSAnL14tW1teRF1dL2QnIC1lICcvLURbW15fXV0vZCcgLWUgJ3MvLURfLyAtRF8vJyB8IHRyIC1kICdcMDEyJ2AKKwkgICAgYnJlYWsKKwkgIGZpCisJZG9uZQorCWlmIHRlc3QgLXogIiRUQ0xfTElCUyI7IHRoZW4KKwkgIEFDX01TR19SRVNVTFQoPG5vdCBmb3VuZD4pCisJICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRjbCBsaWJyYXJ5IGJ5IG15c2VsZikKKwkgIHRjbGxpYj1gZWNobyAkdGNsaW5jIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKKwkgIGZvciBleHQgaW4gLnNvIC5hIDsgZG8KKwkgICAgZm9yIHZlciBpbiAiIiAkdGNsdmVyIDsgZG8KKwkgICAgICBmb3IgdHJ5IGluICR0Y2xsaWIgOyBkbworCQl0cnlsaWI9dGNsJHZlciRleHQKKwkJaWYgdGVzdCAtZiAkdHJ5L2xpYiR0cnlsaWIgOyB0aGVuCisJCSAgQUNfTVNHX1JFU1VMVCgkdHJ5L2xpYiR0cnlsaWIpCisJCSAgVENMX0xJQlM9Ii1MJHRyeSAtbHRjbCR2ZXIgLWxkbCAtbG0iCisJCSAgaWYgdGVzdCAiYCh1bmFtZSkgMj4vZGV2L251bGxgIiA9IFN1bk9TICYmCisJCQkJCSB1bmFtZSAtciB8IGdyZXAgJ141JyA+L2Rldi9udWxsOyB0aGVuCisJCSAgICBUQ0xfTElCUz0iJFRDTF9MSUJTIC1SICR0cnkiCisJCSAgZmkKKwkJICBicmVhayAzCisJCWZpCisJICAgICAgZG9uZQorCSAgICBkb25lCisJICBkb25lCisJICBpZiB0ZXN0IC16ICIkVENMX0xJQlMiOyB0aGVuCisJICAgIEFDX01TR19SRVNVTFQoPG5vdCBmb3VuZD4pCisJICAgIFNLSVBfVENMPVlFUworCSAgZmkKKwlmaQorCWlmIHRlc3QgLXogIiRTS0lQX1RDTCI7IHRoZW4KKwkgIEFDX0RFRklORShGRUFUX1RDTCkKKwkgIFRDTF9TUkM9aWZfdGNsLmMKKwkgIFRDTF9PQko9b2JqZWN0cy9pZl90Y2wubworCSAgVENMX1BSTz1pZl90Y2wucHJvCisJICBUQ0xfQ0ZMQUdTPSItSSRUQ0xfSU5DICRUQ0xfREVGUyIKKwlmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKHRvbyBvbGQ7IG5lZWQgVGNsIHZlcnNpb24gOC4wIG9yIGxhdGVyKQorICAgIGZpCisgIGZpCitmaQorQUNfU1VCU1QoVENMX1NSQykKK0FDX1NVQlNUKFRDTF9PQkopCitBQ19TVUJTVChUQ0xfUFJPKQorQUNfU1VCU1QoVENMX0NGTEFHUykKK0FDX1NVQlNUKFRDTF9MSUJTKQorCitBQ19NU0dfQ0hFQ0tJTkcoLS1lbmFibGUtcnVieWludGVycCBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUocnVieWludGVycCwKKwlbICAtLWVuYWJsZS1ydWJ5aW50ZXJwICAgICBJbmNsdWRlIFJ1YnkgaW50ZXJwcmV0ZXIuXSwgLAorCVtlbmFibGVfcnVieWludGVycD0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9ydWJ5aW50ZXJwKQoraWYgdGVzdCAiJGVuYWJsZV9ydWJ5aW50ZXJwIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1NVQlNUKHZpX2N2X3BhdGhfcnVieSkKKyAgQUNfUEFUSF9QUk9HKHZpX2N2X3BhdGhfcnVieSwgcnVieSkKKyAgaWYgdGVzdCAiWCR2aV9jdl9wYXRoX3J1YnkiICE9ICJYIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhSdWJ5IHZlcnNpb24pCisgICAgaWYgJHZpX2N2X3BhdGhfcnVieSAtZSAnVkVSU0lPTiA+PSAiMS42LjAiIG9yIGV4aXQgMScgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVChPSykKKyAgICAgIEFDX01TR19DSEVDS0lORyhSdWJ5IGhlYWRlciBmaWxlcykKKyAgICAgIHJ1YnloZHJkaXI9YCR2aV9jdl9wYXRoX3J1YnkgLXIgbWttZiAtZSAncHJpbnQgQ29uZmlnOjpDT05GSUdbWyJhcmNoZGlyIl1dIHx8ICRoZHJkaXInIDI+L2Rldi9udWxsYAorICAgICAgaWYgdGVzdCAiWCRydWJ5aGRyZGlyIiAhPSAiWCI7IHRoZW4KKwlBQ19NU0dfUkVTVUxUKCRydWJ5aGRyZGlyKQorCVJVQllfQ0ZMQUdTPSItSSRydWJ5aGRyZGlyIgorCXJ1YnlsaWJzPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICdwcmludCBDb25maWc6OkNPTkZJR1tbIkxJQlMiXV0nYAorCWlmIHRlc3QgIlgkcnVieWxpYnMiICE9ICJYIjsgdGhlbgorCSAgUlVCWV9MSUJTPSIkcnVieWxpYnMiCisJZmkKKwlsaWJydWJ5YXJnPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICdwcmludCBDb25maWcuZXhwYW5kKENvbmZpZzo6Q09ORklHW1siTElCUlVCWUFSRyJdXSknYAorCWlmIHRlc3QgLWYgIiRydWJ5aGRyZGlyLyRsaWJydWJ5YXJnIjsgdGhlbgorCSAgbGlicnVieWFyZz0iJHJ1YnloZHJkaXIvJGxpYnJ1YnlhcmciCisJZWxzZQorCSAgcnVieWxpYmRpcj1gJHZpX2N2X3BhdGhfcnVieSAtciByYmNvbmZpZyAtZSAncHJpbnQgQ29uZmlnLmV4cGFuZChDb25maWc6OkNPTkZJR1tbImxpYmRpciJdXSknYAorCSAgaWYgdGVzdCAtZiAiJHJ1YnlsaWJkaXIvJGxpYnJ1YnlhcmciOyB0aGVuCisJICAgIGxpYnJ1Ynlhcmc9IiRydWJ5bGliZGlyLyRsaWJydWJ5YXJnIgorCSAgZWxpZiB0ZXN0ICIkbGlicnVieWFyZyIgPSAibGlicnVieS5hIjsgdGhlbgorCSAgICBkbmwgcmVxdWlyZWQgb24gTWFjIE9TIDEwLjMgd2hlcmUgbGlicnVieS5hIGRvZXNuJ3QgZXhpc3QKKwkgICAgbGlicnVieWFyZz0iLWxydWJ5IgorCSAgZWxzZQorCSAgICBsaWJydWJ5YXJnPWAkdmlfY3ZfcGF0aF9ydWJ5IC1yIHJiY29uZmlnIC1lICJwcmludCAnJGxpYnJ1YnlhcmcnLmdzdWIoLy1MXC4vLCAlJy1MI3tDb25maWcuZXhwYW5kKENvbmZpZzo6Q09ORklHW1wibGliZGlyXCJdKX0nKSJgCisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICJYJGxpYnJ1YnlhcmciICE9ICJYIjsgdGhlbgorCSAgUlVCWV9MSUJTPSIkbGlicnVieWFyZyAkUlVCWV9MSUJTIgorCWZpCisJcnVieWxkZmxhZ3M9YCR2aV9jdl9wYXRoX3J1YnkgLXIgcmJjb25maWcgLWUgJ3ByaW50IENvbmZpZzo6Q09ORklHW1siTERGTEFHUyJdXSdgCisJaWYgdGVzdCAiWCRydWJ5bGRmbGFncyIgIT0gIlgiOyB0aGVuCisJICBMREZMQUdTPSIkcnVieWxkZmxhZ3MgJExERkxBR1MiCisJZmkKKwlSVUJZX1NSQz0iaWZfcnVieS5jIgorCVJVQllfT0JKPSJvYmplY3RzL2lmX3J1YnkubyIKKwlSVUJZX1BSTz0iaWZfcnVieS5wcm8iCisJQUNfREVGSU5FKEZFQVRfUlVCWSkKKyAgICAgIGVsc2UKKwlBQ19NU0dfUkVTVUxUKG5vdCBmb3VuZCwgZGlzYWJsaW5nIFJ1YnkpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQodG9vIG9sZDsgbmVlZCBSdWJ5IHZlcnNpb24gMS42LjAgb3IgbGF0ZXIpCisgICAgZmkKKyAgZmkKK2ZpCitBQ19TVUJTVChSVUJZX1NSQykKK0FDX1NVQlNUKFJVQllfT0JKKQorQUNfU1VCU1QoUlVCWV9QUk8pCitBQ19TVUJTVChSVUJZX0NGTEFHUykKK0FDX1NVQlNUKFJVQllfTElCUykKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLWNzY29wZSBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUoY3Njb3BlLAorCVsgIC0tZW5hYmxlLWNzY29wZSAgICAgICAgIEluY2x1ZGUgY3Njb3BlIGludGVyZmFjZS5dLCAsCisJW2VuYWJsZV9jc2NvcGU9Im5vIl0pCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfY3Njb3BlKQoraWYgdGVzdCAiJGVuYWJsZV9jc2NvcGUiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEZFQVRfQ1NDT1BFKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLXdvcmtzaG9wIGFyZ3VtZW50KQorQUNfQVJHX0VOQUJMRSh3b3Jrc2hvcCwKKwlbICAtLWVuYWJsZS13b3Jrc2hvcCAgICAgICBJbmNsdWRlIFN1biBWaXN1YWwgV29ya3Nob3Agc3VwcG9ydC5dLCAsCisJW2VuYWJsZV93b3Jrc2hvcD0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV93b3Jrc2hvcCkKK2lmIHRlc3QgIiRlbmFibGVfd29ya3Nob3AiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEZFQVRfU1VOX1dPUktTSE9QKQorICBXT1JLU0hPUF9TUkM9IndvcmtzaG9wLmMgaW50ZWdyYXRpb24uYyIKKyAgQUNfU1VCU1QoV09SS1NIT1BfU1JDKQorICBXT1JLU0hPUF9PQko9Im9iamVjdHMvd29ya3Nob3AubyBvYmplY3RzL2ludGVncmF0aW9uLm8iCisgIEFDX1NVQlNUKFdPUktTSE9QX09CSikKKyAgaWYgdGVzdCAiJHtlbmFibGVfZ3VpLXh4eH0iID0geHh4OyB0aGVuCisgICAgZW5hYmxlX2d1aT1tb3RpZgorICBmaQorZmkKKworQUNfTVNHX0NIRUNLSU5HKC0tZGlzYWJsZS1uZXRiZWFucyBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUobmV0YmVhbnMsCisJWyAgLS1kaXNhYmxlLW5ldGJlYW5zICAgICAgRGlzYWJsZSBOZXRCZWFucyBpbnRlZ3JhdGlvbiBzdXBwb3J0Ll0sCisJLCBbZW5hYmxlX25ldGJlYW5zPSJ5ZXMiXSkKK2lmIHRlc3QgIiRlbmFibGVfbmV0YmVhbnMiID0gInllcyI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChubykKKyAgZG5sIE9uIFNvbGFyaXMgd2UgbmVlZCB0aGUgc29ja2V0IGFuZCBuc2wgbGlicmFyeS4KKyAgQUNfQ0hFQ0tfTElCKHNvY2tldCwgc29ja2V0KQorICBBQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lKQorICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBjb21waWxpbmcgbmV0YmVhbnMgaW50ZWdyYXRpb24gaXMgcG9zc2libGUpCisgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJLyogQ2hlY2sgYml0ZmllbGRzICovCisJc3RydWN0IG5iYnVmIHsKKwl1bnNpZ25lZCBpbnQgIGluaXREb25lOjE7CisJdXNob3J0IHNpZ25tYXBsZW47CisJfTsKKwkgICAgXSwgWworCQkvKiBDaGVjayBjcmVhdGluZyBhIHNvY2tldC4gKi8KKwkJc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsKKwkJKHZvaWQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwkJKHZvaWQpaHRvbnMoMTAwKTsKKwkJKHZvaWQpZ2V0aG9zdGJ5bmFtZSgibWljcm9zb2Z0LmNvbSIpOworCQlpZiAoZXJybm8gPT0gRUNPTk5SRUZVU0VEKQorCQkgICh2b2lkKWNvbm5lY3QoMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKTsKKwkgICAgXSwKKwlBQ19NU0dfUkVTVUxUKHllcyksCisJQUNfTVNHX1JFU1VMVChubyk7IGVuYWJsZV9uZXRiZWFucz0ibm8iKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKHllcykKK2ZpCitpZiB0ZXN0ICIkZW5hYmxlX25ldGJlYW5zIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0RFRklORShGRUFUX05FVEJFQU5TX0lOVEcpCisgIE5FVEJFQU5TX1NSQz0ibmV0YmVhbnMuYyIKKyAgQUNfU1VCU1QoTkVUQkVBTlNfU1JDKQorICBORVRCRUFOU19PQko9Im9iamVjdHMvbmV0YmVhbnMubyIKKyAgQUNfU1VCU1QoTkVUQkVBTlNfT0JKKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLXNuaWZmIGFyZ3VtZW50KQorQUNfQVJHX0VOQUJMRShzbmlmZiwKKwlbICAtLWVuYWJsZS1zbmlmZiAgICAgICAgICBJbmNsdWRlIFNuaWZmIGludGVyZmFjZS5dLCAsCisJW2VuYWJsZV9zbmlmZj0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9zbmlmZikKK2lmIHRlc3QgIiRlbmFibGVfc25pZmYiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEZFQVRfU05JRkYpCisgIFNOSUZGX1NSQz0iaWZfc25pZmYuYyIKKyAgQUNfU1VCU1QoU05JRkZfU1JDKQorICBTTklGRl9PQko9Im9iamVjdHMvaWZfc25pZmYubyIKKyAgQUNfU1VCU1QoU05JRkZfT0JKKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLW11bHRpYnl0ZSBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUobXVsdGlieXRlLAorCVsgIC0tZW5hYmxlLW11bHRpYnl0ZSAgICAgIEluY2x1ZGUgbXVsdGlieXRlIGVkaXRpbmcgc3VwcG9ydC5dLCAsCisJW2VuYWJsZV9tdWx0aWJ5dGU9Im5vIl0pCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfbXVsdGlieXRlKQoraWYgdGVzdCAiJGVuYWJsZV9tdWx0aWJ5dGUiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEZFQVRfTUJZVEUpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoLS1lbmFibGUtaGFuZ3VsaW5wdXQgYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKGhhbmd1bGlucHV0LAorCVsgIC0tZW5hYmxlLWhhbmd1bGlucHV0ICAgIEluY2x1ZGUgSGFuZ3VsIGlucHV0IHN1cHBvcnQuXSwgLAorCVtlbmFibGVfaGFuZ3VsaW5wdXQ9Im5vIl0pCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfaGFuZ3VsaW5wdXQpCisKK0FDX01TR19DSEVDS0lORygtLWVuYWJsZS14aW0gYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKHhpbSwKKwlbICAtLWVuYWJsZS14aW0gICAgICAgICAgICBJbmNsdWRlIFhJTSBpbnB1dCBzdXBwb3J0Ll0sCisJQUNfTVNHX1JFU1VMVCgkZW5hYmxlX3hpbSksCisJW2VuYWJsZV94aW09ImF1dG8iOyBBQ19NU0dfUkVTVUxUKGRlZmF1bHRpbmcgdG8gYXV0byldKQorZG5sIGRlZmluaW5nIEZFQVRfWElNIGlzIGRlbGF5ZWQsIHNvIHRoYXQgaXQgY2FuIGJlIGRpc2FibGVkIGZvciBvbGRlciBHVEsKKworQUNfTVNHX0NIRUNLSU5HKC0tZW5hYmxlLWZvbnRzZXQgYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKGZvbnRzZXQsCisJWyAgLS1lbmFibGUtZm9udHNldCAgICAgICAgSW5jbHVkZSBYIGZvbnRzZXQgb3V0cHV0IHN1cHBvcnQuXSwgLAorCVtlbmFibGVfZm9udHNldD0ibm8iXSkKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9mb250c2V0KQorZG5sIGRlZmluaW5nIEZFQVRfWEZPTlRTRVQgaXMgZGVsYXllZCwgc28gdGhhdCBpdCBjYW4gYmUgZGlzYWJsZWQgZm9yIG5vIEdVSQorCit0ZXN0IC16ICIkd2l0aF94IiAmJiB3aXRoX3g9eWVzCit0ZXN0ICIke2VuYWJsZV9ndWkteWVzfSIgIT0gbm8gLWEgIngkTUFDT1NYIiAhPSAieHllcyIgLWEgIngkUU5YIiAhPSAieHllcyIgJiYgd2l0aF94PXllcworaWYgdGVzdCAiJHdpdGhfeCIgPSBubzsgdGhlbgorICBBQ19NU0dfUkVTVUxUKGRlZmF1bHRpbmcgdG86IGRvbid0IEhBVkVfWDExKQorZWxzZQorICBkbmwgRG8gdGhpcyBjaGVjayBlYXJseSwgc28gdGhhdCBpdHMgZmFpbHVyZSBjYW4gb3ZlcnJpZGUgdXNlciByZXF1ZXN0cy4KKworICBBQ19QQVRIX1BST0coeG1rbWZwYXRoLCB4bWttZikKKworICBBQ19QQVRIX1hUUkEKKworICBkbmwgT24gT1MzOTBVbml4IHRoZSBYIGxpYnJhcmllcyBhcmUgRExMcy4gVG8gdXNlIHRoZW0gdGhlIGNvZGUgbXVzdAorICBkbmwgYmUgY29tcGlsZWQgd2l0aCBhIHNwZWNpYWwgb3B0aW9uLgorICBkbmwgQWxzbyBhZGQgU00sIElDRSBhbmQgWG11IHRvIFhfRVhUUkFfTElCUy4KKyAgaWYgdGVzdCAiJE9TMzkwVW5peCIgPSAieWVzIjsgdGhlbgorICAgIENGTEFHUz0iJENGTEFHUyAtVyBjLGRsbCIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAtVyBsLGRsbCIKKyAgICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxTTSAtbElDRSAtbFhtdSIKKyAgZmkKKworICBkbmwgT24gbXkgSFBVWCBzeXN0ZW0gdGhlIFggaW5jbHVkZSBkaXIgaXMgZm91bmQsIGJ1dCB0aGUgbGliIGRpciBub3QuCisgIGRubCBUaGlzIGlzIGEgZGVzcGFyYXRlIHRyeSB0byBmaXggdGhpcy4KKworICBpZiB0ZXN0IC1kICIkeF9pbmNsdWRlcyIgJiYgdGVzdCAhIC1kICIkeF9saWJyYXJpZXMiOyB0aGVuCisgICAgeF9saWJyYXJpZXM9YGVjaG8gIiR4X2luY2x1ZGVzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2AKKyAgICBBQ19NU0dfUkVTVUxUKENvcnJlY3RlZCBYIGxpYnJhcmllcyB0byAkeF9saWJyYXJpZXMpCisgICAgWF9MSUJTPSIkWF9MSUJTIC1MJHhfbGlicmFyaWVzIgorICAgIGlmIHRlc3QgImAodW5hbWUpIDI+L2Rldi9udWxsYCIgPSBTdW5PUyAmJgorCQkJCQkgdW5hbWUgLXIgfCBncmVwICdeNScgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgWF9MSUJTPSIkWF9MSUJTIC1SICR4X2xpYnJhcmllcyIKKyAgICBmaQorICBmaQorCisgIGlmIHRlc3QgLWQgIiR4X2xpYnJhcmllcyIgJiYgdGVzdCAhIC1kICIkeF9pbmNsdWRlcyI7IHRoZW4KKyAgICB4X2luY2x1ZGVzPWBlY2hvICIkeF9saWJyYXJpZXMiIHwgc2VkIHMvbGliL2luY2x1ZGUvYAorICAgIEFDX01TR19SRVNVTFQoQ29ycmVjdGVkIFggaW5jbHVkZXMgdG8gJHhfaW5jbHVkZXMpCisgICAgWF9DRkxBR1M9IiRYX0NGTEFHUyAtSSR4X2luY2x1ZGVzIgorICBmaQorCisgIGRubCBSZW1vdmUgIi1JL3Vzci9pbmNsdWRlICIgZnJvbSBYX0NGTEFHUywgc2hvdWxkIG5vdCBiZSBuZWVkZWQuCisgIFhfQ0ZMQUdTPSJgZWNobyAkWF9DRkxBR1NcICB8IHNlZCAncyUtSS91c3IvaW5jbHVkZSAlJSdgIgorICBkbmwgUmVtb3ZlICItTC91c3IvbGliICIgZnJvbSBYX0xJQlMsIHNob3VsZCBub3QgYmUgbmVlZGVkLgorICBYX0xJQlM9ImBlY2hvICRYX0xJQlNcICB8IHNlZCAncyUtTC91c3IvbGliICUlJ2AiCisgIGRubCBTYW1lIGZvciAiLVIvdXNyL2xpYiAiLgorICBYX0xJQlM9ImBlY2hvICRYX0xJQlNcICB8IHNlZCAtZSAncyUtUi91c3IvbGliICUlJyAtZSAncyUtUiAvdXNyL2xpYiAlJSdgIgorCisKKyAgZG5sIENoZWNrIGlmIHRoZSBYMTEgaGVhZGVyIGZpbGVzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLiBPbiBzb21lIHN5c3RlbXMKKyAgZG5sIFhsaWIuaCBpbmNsdWRlcyBmaWxlcyB0aGF0IGRvbid0IGV4aXN0CisgIEFDX01TR19DSEVDS0lORyhpZiBYMTEgaGVhZGVyIGZpbGVzIGNhbiBiZSBmb3VuZCkKKyAgY2ZsYWdzX3NhdmU9JENGTEFHUworICBDRkxBR1M9IiRDRkxBR1MgJFhfQ0ZMQUdTIgorICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPFgxMS9YbGliLmg+XSwgLAorCUFDX01TR19SRVNVTFQoeWVzKSwKKwlBQ19NU0dfUkVTVUxUKG5vKTsgbm9feD15ZXMpCisgIENGTEFHUz0kY2ZsYWdzX3NhdmUKKworICBpZiB0ZXN0ICIke25vX3gtbm99IiA9IHllczsgdGhlbgorICAgIHdpdGhfeD1ubworICBlbHNlCisgICAgQUNfREVGSU5FKEhBVkVfWDExKQorICAgIFhfTElCPSItbFh0IC1sWDExIjsKKyAgICBBQ19TVUJTVChYX0xJQikKKworICAgIGFjX3NhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgTERGTEFHUz0iLUwkeF9saWJyYXJpZXMgJExERkxBR1MiCisKKyAgICBkbmwgQ2hlY2sgZm9yIC1sWGRtY3AgKG5lZWRlZCBvbiBTdW5PUyA0LjEuNCkKKyAgICBkbmwgRm9yIEhQLVVYIDEwLjIwIGl0IG11c3QgYmUgYmVmb3JlIC1sU00gLWxJQ0UKKyAgICBBQ19DSEVDS19MSUIoWGRtY3AsIF9YZG1jcEF1dGhEb0l0LCBbWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sWGRtY3AiXSwsCisJCVstbFh0ICRYX1BSRV9MSUJTIC1sWDExICRYX0VYVFJBX0xJQlMgLWxYZG1jcF0pCisKKyAgICBkbmwgU29tZSBzeXN0ZW1zIG5lZWQgLWxuc2wgLWxzb2NrZXQgd2hlbiB0ZXN0aW5nIGZvciBJQ0UuCisgICAgZG5sIFRoZSBjaGVjayBhYm92ZSBkb2Vzbid0IGRvIHRoaXMsIHRyeSBoZXJlIChhZ2FpbikuICBBbHNvIG5lZWRlZCB0byBnZXQKKyAgICBkbmwgdGhlbSBhZnRlciBYZG1jcC4gIGxpbmsuc2ggd2lsbCByZW1vdmUgdGhlbSB3aGVuIG5vdCBuZWVkZWQuCisgICAgZG5sIENoZWNrIGZvciBvdGhlciBmdW5jdGlvbiB0aGFuIGFib3ZlIHRvIGF2b2lkIHRoZSBjYWNoZWQgdmFsdWUKKyAgICBBQ19DSEVDS19MSUIoSUNFLCBJY2VPcGVuQ29ubmVjdGlvbiwKKwkJICBbWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sU00gLWxJQ0UiXSwsIFskWF9FWFRSQV9MSUJTXSkKKworICAgIGRubCBDaGVjayBmb3IgLWxYcG0gKG5lZWRlZCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBNb3RpZikKKyAgICBMREZMQUdTPSIkWF9MSUJTICRhY19zYXZlX0xERkxBR1MiCisgICAgQUNfQ0hFQ0tfTElCKFhwbSwgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEsIFtYX1BSRV9MSUJTPSIkWF9QUkVfTElCUyAtbFhwbSJdLCwKKwkJWy1sWHQgJFhfUFJFX0xJQlMgLWxYcG0gLWxYMTEgJFhfRVhUUkFfTElCU10pCisKKyAgICBkbmwgQ2hlY2sgdGhhdCB0aGUgWDExIGhlYWRlciBmaWxlcyBkb24ndCB1c2UgaW1wbGljaXQgZGVjbGFyYXRpb25zCisgICAgQUNfTVNHX0NIRUNLSU5HKGlmIFgxMSBoZWFkZXIgZmlsZXMgaW1wbGljaXRseSBkZWNsYXJlIHJldHVybiB2YWx1ZXMpCisgICAgY2ZsYWdzX3NhdmU9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MgLVdlcnJvciIKKyAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPFgxMS9YbGliLmg+XSwgLAorCUFDX01TR19SRVNVTFQobm8pLAorCUNGTEFHUz0iJENGTEFHUyAtV25vLWltcGxpY2l0LWludCIKKwlBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPFgxMS9YbGliLmg+XSwgLAorCSAgICBBQ19NU0dfUkVTVUxUKHllcyk7IGNmbGFnc19zYXZlPSIkY2ZsYWdzX3NhdmUgLVduby1pbXBsaWNpdC1pbnQiLAorCSAgICBBQ19NU0dfUkVTVUxUKHRlc3QgZmFpbGVkKQorCSkKKyAgICApCisgICAgQ0ZMQUdTPSRjZmxhZ3Nfc2F2ZQorCisgICAgTERGTEFHUz0iJGFjX3NhdmVfTERGTEFHUyIKKworICBmaQorZmkKKwordGVzdCAieCR3aXRoX3giID0geG5vIC1hICJ4JEJFT1MiICE9ICJ4eWVzIiAtYSAieCRNQUNPU1giICE9ICJ4eWVzIiAtYSAieCRRTlgiICE9ICJ4eWVzIiAmJiBlbmFibGVfZ3VpPW5vCisKK0FDX01TR19DSEVDS0lORygtLWVuYWJsZS1ndWkgYXJndW1lbnQpCitBQ19BUkdfRU5BQkxFKGd1aSwKKyBbICAtLWVuYWJsZS1ndWlbPU9QVFNdICAgICBYMTEgR1VJIFtkZWZhdWx0PWF1dG9dIFtPUFRTPWF1dG8vbm8vZ3RrL2d0azIvZ25vbWUvZ25vbWUyL21vdGlmL2F0aGVuYS9uZVh0YXcvYmVvcy9waG90b24vY2FyYm9uXV0sICwgZW5hYmxlX2d1aT0iYXV0byIpCisKK2RubCBDYW5vbmljYWxpemUgdGhlIC0tZW5hYmxlLWd1aT0gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkLgorZG5sIERvIG5vdCB1c2UgY2hhcmFjdGVyIGNsYXNzZXMgZm9yIHBvcnRhYmlsaXR5IHdpdGggb2xkIHRvb2xzLgorZW5hYmxlX2d1aV9jYW5vbj1gZWNobyAiXyRlbmFibGVfZ3VpIiB8IFwKKwlzZWQgJ3MvW1sgXystXV0vL2c7eS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAorCitkbmwgU2tpcCBldmVyeXRoaW5nIGJ5IGRlZmF1bHQuCitTS0lQX0dUSz1ZRVMKK1NLSVBfR1RLMj1ZRVMKK1NLSVBfR05PTUU9WUVTCitTS0lQX01PVElGPVlFUworU0tJUF9BVEhFTkE9WUVTCitTS0lQX05FWFRBVz1ZRVMKK1NLSVBfUEhPVE9OPVlFUworU0tJUF9CRU9TPVlFUworU0tJUF9DQVJCT049WUVTCitHVUlUWVBFPU5PTkUKKworaWYgdGVzdCAieCRCRU9TIiA9ICJ4eWVzIjsgdGhlbgorICBTS0lQX0JFT1M9CisgIGNhc2UgIiRlbmFibGVfZ3VpX2Nhbm9uIiBpbgorICAgIG5vKQkJQUNfTVNHX1JFU1VMVChubyBHVUkgc3VwcG9ydCkKKwkJU0tJUF9CRU9TPVlFUyA7OworICAgIHllc3wiIikJQUNfTVNHX1JFU1VMVCh5ZXMgLSBhdXRvbWF0aWMgR1VJIHN1cHBvcnQpIDs7CisgICAgYXV0bykJQUNfTVNHX1JFU1VMVChhdXRvIC0gYXV0b21hdGljIEdVSSBzdXBwb3J0KSA7OworICAgIGJlb3MpCUFDX01TR19SRVNVTFQoQmVPUyBHVUkgc3VwcG9ydCkgOzsKKyAgICAqKQkJQUNfTVNHX1JFU1VMVChbU29ycnksICRlbmFibGVfZ3VpIEdVSSBpcyBub3Qgc3VwcG9ydGVkXSkKKwkJU0tJUF9CRU9TPVlFUyA7OworICBlc2FjCisKK2VsaWYgdGVzdCAieCRRTlgiID0gInh5ZXMiIC1hICJ4JHdpdGhfeCIgPSAieG5vIiA7IHRoZW4KKyAgU0tJUF9QSE9UT049CisgIGNhc2UgIiRlbmFibGVfZ3VpX2Nhbm9uIiBpbgorICAgIG5vKQkJQUNfTVNHX1JFU1VMVChubyBHVUkgc3VwcG9ydCkKKwkJU0tJUF9QSE9UT049WUVTIDs7CisgICAgeWVzfCIiKQlBQ19NU0dfUkVTVUxUKHllcyAtIGF1dG9tYXRpYyBHVUkgc3VwcG9ydCkgOzsKKyAgICBhdXRvKQlBQ19NU0dfUkVTVUxUKGF1dG8gLSBhdXRvbWF0aWMgR1VJIHN1cHBvcnQpIDs7CisgICAgcGhvdG9uKQlBQ19NU0dfUkVTVUxUKFBob3RvbiBHVUkgc3VwcG9ydCkgOzsKKyAgICAqKQkJQUNfTVNHX1JFU1VMVChbU29ycnksICRlbmFibGVfZ3VpIEdVSSBpcyBub3Qgc3VwcG9ydGVkXSkKKwkJU0tJUF9QSE9UT049WUVTIDs7CisgIGVzYWMKKworZWxpZiB0ZXN0ICJ4JE1BQ09TWCIgPSAieHllcyIgLWEgIngkd2l0aF94IiA9ICJ4bm8iIDsgdGhlbgorICBTS0lQX0NBUkJPTj0KKyAgY2FzZSAiJGVuYWJsZV9ndWlfY2Fub24iIGluCisgICAgbm8pCQlBQ19NU0dfUkVTVUxUKG5vIEdVSSBzdXBwb3J0KQorCQlTS0lQX0NBUkJPTj1ZRVMgOzsKKyAgICB5ZXN8IiIpCUFDX01TR19SRVNVTFQoeWVzIC0gYXV0b21hdGljIEdVSSBzdXBwb3J0KSA7OworICAgIGF1dG8pCUFDX01TR19SRVNVTFQoYXV0byAtIGF1dG9tYXRpYyBHVUkgc3VwcG9ydCkgOzsKKyAgICBjYXJib24pCUFDX01TR19SRVNVTFQoQ2FyYm9uIEdVSSBzdXBwb3J0KSA7OworICAgICopCQlBQ19NU0dfUkVTVUxUKFtTb3JyeSwgJGVuYWJsZV9ndWkgR1VJIGlzIG5vdCBzdXBwb3J0ZWRdKQorCQlTS0lQX0NBUkJPTj1ZRVMgOzsKKyAgZXNhYworCitlbHNlCisKKworICBjYXNlICIkZW5hYmxlX2d1aV9jYW5vbiIgaW4KKyAgICBub3xub25lKQlBQ19NU0dfUkVTVUxUKG5vIEdVSSBzdXBwb3J0KSA7OworICAgIHllc3wiInxhdXRvKQlBQ19NU0dfUkVTVUxUKHllcy9hdXRvIC0gYXV0b21hdGljIEdVSSBzdXBwb3J0KQorCQlTS0lQX0dUSz0KKwkJU0tJUF9HVEsyPQorCQlTS0lQX0dOT01FPQorCQlTS0lQX01PVElGPQorCQlTS0lQX0FUSEVOQT0KKwkJU0tJUF9ORVhUQVc9CisJCVNLSVBfQ0FSQk9OPTs7CisgICAgZ3RrKQlBQ19NU0dfUkVTVUxUKEdUSysgMS54IEdVSSBzdXBwb3J0KQorCQlTS0lQX0dUSz07OworICAgIGd0azIpCUFDX01TR19SRVNVTFQoR1RLKyAyLnggR1VJIHN1cHBvcnQpCisJCVNLSVBfR1RLPQorCQlTS0lQX0dUSzI9OzsKKyAgICBnbm9tZSkJQUNfTVNHX1JFU1VMVChHTk9NRSAxLnggR1VJIHN1cHBvcnQpCisJCVNLSVBfR05PTUU9CisJCVNLSVBfR1RLPTs7CisgICAgZ25vbWUyKQlBQ19NU0dfUkVTVUxUKEdOT01FIDIueCBHVUkgc3VwcG9ydCkKKwkJU0tJUF9HTk9NRT0KKwkJU0tJUF9HVEs9CisJCVNLSVBfR1RLMj07OworICAgIG1vdGlmKQlBQ19NU0dfUkVTVUxUKE1vdGlmIEdVSSBzdXBwb3J0KQorCQlTS0lQX01PVElGPTs7CisgICAgYXRoZW5hKQlBQ19NU0dfUkVTVUxUKEF0aGVuYSBHVUkgc3VwcG9ydCkKKwkJU0tJUF9BVEhFTkE9OzsKKyAgICBuZXh0YXcpCUFDX01TR19SRVNVTFQobmVYdGF3IEdVSSBzdXBwb3J0KQorCQlTS0lQX05FWFRBVz07OworICAgICopCQlBQ19NU0dfUkVTVUxUKFtTb3JyeSwgJGVuYWJsZV9ndWkgR1VJIGlzIG5vdCBzdXBwb3J0ZWRdKSA7OworICBlc2FjCisKK2ZpCisKK2lmIHRlc3QgIngkU0tJUF9HVEsiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJndGsiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gImd0azIiOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBHVEspCisgIEFDX0FSR19FTkFCTEUoZ3RrLWNoZWNrLAorCVsgIC0tZW5hYmxlLWd0ay1jaGVjayAgICAgIElmIGF1dG8tc2VsZWN0IEdVSSwgY2hlY2sgZm9yIEdUSyBbZGVmYXVsdD15ZXNdXSwKKwksIGVuYWJsZV9ndGtfY2hlY2s9InllcyIpCisgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9ndGtfY2hlY2spCisgIGlmIHRlc3QgIngkZW5hYmxlX2d0a19jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfR1RLPVlFUworICAgIFNLSVBfR05PTUU9WUVTCisgIGZpCitmaQorCitpZiB0ZXN0ICJ4JFNLSVBfR1RLMiIgIT0gInhZRVMiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gImd0azIiIFwKKwkJCQktYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJnbm9tZTIiOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBHVEsrIDIpCisgIEFDX0FSR19FTkFCTEUoZ3RrMi1jaGVjaywKKwlbICAtLWVuYWJsZS1ndGsyLWNoZWNrICAgICBJZiBHVEsgR1VJLCBjaGVjayBmb3IgR1RLKyAyIFtkZWZhdWx0PXllc11dLAorCSwgZW5hYmxlX2d0azJfY2hlY2s9InllcyIpCisgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9ndGsyX2NoZWNrKQorICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGsyX2NoZWNrIiA9ICJ4bm8iOyB0aGVuCisgICAgU0tJUF9HVEsyPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX0dOT01FIiAhPSAieFlFUyIgLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ25vbWUiIFwKKwkJCQkgLWEgIiRlbmFibGVfZ3VpX2Nhbm9uIiAhPSAiZ25vbWUyIjsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBvciBub3QgdG8gbG9vayBmb3IgR05PTUUpCisgIEFDX0FSR19FTkFCTEUoZ25vbWUtY2hlY2ssCisJWyAgLS1lbmFibGUtZ25vbWUtY2hlY2sgICAgSWYgR1RLIEdVSSwgY2hlY2sgZm9yIEdOT01FIFtkZWZhdWx0PW5vXV0sCisJLCBlbmFibGVfZ25vbWVfY2hlY2s9Im5vIikKKyAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2dub21lX2NoZWNrKQorICBpZiB0ZXN0ICJ4JGVuYWJsZV9nbm9tZV9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfR05PTUU9WUVTCisgIGZpCitmaQorCitpZiB0ZXN0ICJ4JFNLSVBfTU9USUYiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJtb3RpZiI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIE1vdGlmKQorICBBQ19BUkdfRU5BQkxFKG1vdGlmLWNoZWNrLAorCVsgIC0tZW5hYmxlLW1vdGlmLWNoZWNrICAgIElmIGF1dG8tc2VsZWN0IEdVSSwgY2hlY2sgZm9yIE1vdGlmIFtkZWZhdWx0PXllc11dLAorCSwgZW5hYmxlX21vdGlmX2NoZWNrPSJ5ZXMiKQorICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfbW90aWZfY2hlY2spCisgIGlmIHRlc3QgIngkZW5hYmxlX21vdGlmX2NoZWNrIiA9ICJ4bm8iOyB0aGVuCisgICAgU0tJUF9NT1RJRj1ZRVMKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIngkU0tJUF9BVEhFTkEiICE9ICJ4WUVTIiAtYSAiJGVuYWJsZV9ndWlfY2Fub24iICE9ICJhdGhlbmEiOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIG9yIG5vdCB0byBsb29rIGZvciBBdGhlbmEpCisgIEFDX0FSR19FTkFCTEUoYXRoZW5hLWNoZWNrLAorCVsgIC0tZW5hYmxlLWF0aGVuYS1jaGVjayAgIElmIGF1dG8tc2VsZWN0IEdVSSwgY2hlY2sgZm9yIEF0aGVuYSBbZGVmYXVsdD15ZXNdXSwKKwksIGVuYWJsZV9hdGhlbmFfY2hlY2s9InllcyIpCisgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9hdGhlbmFfY2hlY2spCisgIGlmIHRlc3QgIngkZW5hYmxlX2F0aGVuYV9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfQVRIRU5BPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX05FWFRBVyIgIT0gInhZRVMiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gIm5leHRhdyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIG5lWHRhdykKKyAgQUNfQVJHX0VOQUJMRShuZXh0YXctY2hlY2ssCisJWyAgLS1lbmFibGUtbmV4dGF3LWNoZWNrICAgSWYgYXV0by1zZWxlY3QgR1VJLCBjaGVjayBmb3IgbmVYdGF3IFtkZWZhdWx0PXllc11dLAorCSwgZW5hYmxlX25leHRhd19jaGVjaz0ieWVzIikKKyAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX25leHRhd19jaGVjayk7CisgIGlmIHRlc3QgIngkZW5hYmxlX25leHRhd19jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfTkVYVEFXPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRTS0lQX0NBUkJPTiIgIT0gInhZRVMiIC1hICIkZW5hYmxlX2d1aV9jYW5vbiIgIT0gImNhcmJvbiI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgb3Igbm90IHRvIGxvb2sgZm9yIENhcmJvbikKKyAgQUNfQVJHX0VOQUJMRShjYXJib24tY2hlY2ssCisJWyAgLS1lbmFibGUtY2FyYm9uLWNoZWNrICAgSWYgYXV0by1zZWxlY3QgR1VJLCBjaGVjayBmb3IgQ2FyYm9uIFtkZWZhdWx0PXllc11dLAorCSwgZW5hYmxlX2NhcmJvbl9jaGVjaz0ieWVzIikKKyAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2NhcmJvbl9jaGVjayk7CisgIGlmIHRlc3QgIngkZW5hYmxlX2NhcmJvbl9jaGVjayIgPSAieG5vIjsgdGhlbgorICAgIFNLSVBfQ0FSQk9OPVlFUworICBmaQorZmkKKworaWYgdGVzdCAieCRNQUNPU1giID0gInh5ZXMiIC1hIC16ICIkU0tJUF9DQVJCT04iIC1hICJ4JENBUkJPTiIgPSAieHllcyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBDYXJib24gR1VJKQorICBkbmwgYWxyZWFkeSBkaWQgdGhpcworICBBQ19NU0dfUkVTVUxUKHllcyk7CisgIEdVSVRZUEU9Q0FSQk9OR1VJCisgIGRubCBza2lwIGV2ZXJ5dGhpbmcgZWxzZQorICBTS0lQX0dUSz1ZRVM7CisgIFNLSVBfR1RLMj1ZRVM7CisgIFNLSVBfR05PTUU9WUVTOworICBTS0lQX01PVElGPVlFUzsKKyAgU0tJUF9BVEhFTkE9WUVTOworICBTS0lQX05FWFRBVz1ZRVM7CisgIFNLSVBfUEhPVE9OPVlFUzsKKyAgU0tJUF9CRU9TPVlFUzsKKyAgU0tJUF9DQVJCT049WUVTCitmaQorCisKK2RubAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZ3RrLWNvbmZpZyBzY3JpcHQKK2RubAorCitkbmwgZGVmaW5lIGFuIGF1dG9jb25mIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBhIHNwZWNpZmllZCB2ZXJzaW9uIG9mIEdUSywgYW5kCitkbmwgdHJ5IHRvIGNvbXBpbGUvbGluayBhIEdUSyBwcm9ncmFtLiAgdGhpcyBnZXRzIHVzZWQgb25jZSBmb3IgR1RLIDEuMS4xNi4KK2RubAorZG5sIEFNX1BBVEhfR1RLKFtNSU5JTVVNLVZFUlNJT04sIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dXSkKK2RubCBUZXN0IGZvciBHVEssIGFuZCBkZWZpbmUgR1RLX0NGTEFHUyBhbmQgR1RLX0xJQlMKK2RubAorQUNfREVGVU4oQU1fUEFUSF9HVEssCitbCisgIGlmIHRlc3QgIlgkR1RLX0NPTkZJRyIgIT0gIlhubyIgLW8gIlgkUEtHX0NPTkZJRyIgIT0gIlhubyI7IHRoZW4KKyAgeworICAgIG1pbl9ndGtfdmVyc2lvbj1pZmVsc2UoWyQxXSwgLDAuOTkuNywkMSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdUSyAtIHZlcnNpb24gPj0gJG1pbl9ndGtfdmVyc2lvbikKKyAgICBub19ndGs9IiIKKyAgICBpZiAodGVzdCAiWCRTS0lQX0dUSzIiICE9ICJYWUVTIiAtYSAiWCRQS0dfQ09ORklHIiAhPSAiWG5vIikgXAorCSAgJiYgJFBLR19DT05GSUcgLS1leGlzdHMgZ3RrKy0yLjA7IHRoZW4KKyAgICB7CisgICAgICBkbmwgV2Ugc2hvdWxkIGJlIHVzaW5nIFBLR19DSEVDS19NT0RVTEVTKCkgaW5zdGVhZCBvZiB0aGlzIGhhY2suCisgICAgICBkbmwgQnV0IEkgZ3Vlc3MgdGhlIGRlcGVuZGVuY3kgb24gcGtnY29uZmlnLm00IGlzIG5vdCB3YW50ZWQgb3IKKyAgICAgIGRubCBzb21ldGhpbmcgbGlrZSB0aGF0LgorICAgICAgR1RLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgZ3RrKy0yLjBgCisgICAgICBHVEtfTElCUz1gJFBLR19DT05GSUcgLS1saWJzIGd0aystMi4wYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRQS0dfQ09ORklHIC0tbW9kdmVyc2lvbiBndGsrLTIuMCB8IFwKKwkgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wxLydgCisgICAgICBndGtfbWlub3JfdmVyc2lvbj1gJFBLR19DT05GSUcgLS1tb2R2ZXJzaW9uIGd0aystMi4wIHwgXAorCSAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICAgIGd0a19taWNyb192ZXJzaW9uPWAkUEtHX0NPTkZJRyAtLW1vZHZlcnNpb24gZ3RrKy0yLjAgfCBcCisJICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMy8nYAorICAgIH0KKyAgICBlbGlmIHRlc3QgIlgkR1RLX0NPTkZJRyIgIT0gIlhubyI7IHRoZW4KKyAgICB7CisgICAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgICAgR1RLX0xJQlM9YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgICAgZ3RrX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorCSAgICAgc2VkICdzL1woW1swLTldXSpcKVwuXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICAgIGd0a19taW5vcl92ZXJzaW9uPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKwkgICAgIHNlZCAncy9cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKVwuXChbWzAtOV1dKlwpL1wyLydgCisgICAgICBndGtfbWljcm9fdmVyc2lvbj1gJEdUS19DT05GSUcgJGd0a19jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisJICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpXC5cKFtbMC05XV0qXClcLlwoW1swLTldXSpcKS9cMy8nYAorICAgIH0KKyAgICBlbHNlCisgICAgICBub19ndGs9eWVzCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkZW5hYmxlX2d0a3Rlc3QiID0gInh5ZXMiIC1hICJ4JG5vX2d0ayIgPSAieCI7IHRoZW4KKyAgICB7CisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICBMSUJTPSIkTElCUyAkR1RLX0xJQlMiCisKKyAgICAgIGRubAorICAgICAgZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdUSyBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKKyAgICAgIGRubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgZ3RrLWNvbmZpZyB0byBzb21lIGV4dGVudAorICAgICAgZG5sCisgICAgICBybSAtZiBjb25mLmd0a3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKCkKK3sKK2ludCBtYWpvciwgbWlub3IsIG1pY3JvOworY2hhciAqdG1wX3ZlcnNpb247CisKK3N5c3RlbSAoInRvdWNoIGNvbmYuZ3RrdGVzdCIpOworCisvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KK3RtcF92ZXJzaW9uID0gZ19zdHJkdXAoIiRtaW5fZ3RrX3ZlcnNpb24iKTsKK2lmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgIGV4aXQoMSk7CisgfQorCitpZiAoKGd0a19tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICgoZ3RrX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmIChndGtfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYKKwkJCQkgICAgIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQoreworICAgIHJldHVybiAwOworfQorcmV0dXJuIDE7Cit9CitdLCwgbm9fZ3RrPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgfQorICAgIGZpCisgICAgaWYgdGVzdCAieCRub19ndGsiID0geCA7IHRoZW4KKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2d0a3Rlc3QiID0gInh5ZXMiOyB0aGVuCisJQUNfTVNHX1JFU1VMVCh5ZXM7IGZvdW5kIHZlcnNpb24gJGd0a19tYWpvcl92ZXJzaW9uLiRndGtfbWlub3JfdmVyc2lvbi4kZ3RrX21pY3JvX3ZlcnNpb24pCisgICAgICBlbHNlCisJQUNfTVNHX1JFU1VMVChmb3VuZCB2ZXJzaW9uICRndGtfbWFqb3JfdmVyc2lvbi4kZ3RrX21pbm9yX3ZlcnNpb24uJGd0a19taWNyb192ZXJzaW9uKQorICAgICAgZmkKKyAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgICAgZWxzZQorICAgIHsKKyAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgICBHVEtfTElCUz0iIgorICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgICB9CisgICAgZmkKKyAgfQorICBlbHNlCisgICAgR1RLX0NGTEFHUz0iIgorICAgIEdUS19MSUJTPSIiCisgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoR1RLX0NGTEFHUykKKyAgQUNfU1VCU1QoR1RLX0xJQlMpCisgIHJtIC1mIGNvbmYuZ3RrdGVzdAorXSkKKworZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZG5sIGdub21lCitkbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbR05PTUVfSU5JVF9IT09LXSwKK1sKKyAgQUNfU1VCU1QoR05PTUVfTElCUykKKyAgQUNfU1VCU1QoR05PTUVfTElCRElSKQorICBBQ19TVUJTVChHTk9NRV9JTkNMVURFRElSKQorCisgIEFDX0FSR19XSVRIKGdub21lLWluY2x1ZGVzLAorICAgIFsgIC0td2l0aC1nbm9tZS1pbmNsdWRlcz1ESVIgU3BlY2lmeSBsb2NhdGlvbiBvZiBHTk9NRSBoZWFkZXJzXSwKKyAgICBbQ0ZMQUdTPSIkQ0ZMQUdTIC1JJHdpdGh2YWwiXQorICApCisKKyAgQUNfQVJHX1dJVEgoZ25vbWUtbGlicywKKyAgICBbICAtLXdpdGgtZ25vbWUtbGlicz1ESVIgICBTcGVjaWZ5IGxvY2F0aW9uIG9mIEdOT01FIGxpYnNdLAorICAgIFtMREZMQUdTPSIkTERGTEFHUyAtTCR3aXRodmFsIiBnbm9tZV9wcmVmaXg9JHdpdGh2YWxdCisgICkKKworICBBQ19BUkdfV0lUSChnbm9tZSwKKyAgICBbICAtLXdpdGgtZ25vbWUgICAgICAgICAgICBTcGVjaWZ5IHByZWZpeCBmb3IgR05PTUUgZmlsZXNdLAorICAgIGlmIHRlc3QgeCR3aXRodmFsID0geHllczsgdGhlbgorICAgICAgd2FudF9nbm9tZT15ZXMKKyAgICAgIGlmZWxzZShbJDFdLCBbXSwgOiwgWyQxXSkKKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0geG5vOyB0aGVuCisJd2FudF9nbm9tZT1ubworICAgICAgZWxzZQorCXdhbnRfZ25vbWU9eWVzCisJTERGTEFHUz0iJExERkxBR1MgLUwkd2l0aHZhbC9saWIiCisJQ0ZMQUdTPSIkQ0ZMQUdTIC1JJHdpdGh2YWwvaW5jbHVkZSIKKwlnbm9tZV9wcmVmaXg9JHdpdGh2YWwvbGliCisgICAgICBmaQorICAgIGZpLAorICAgIHdhbnRfZ25vbWU9eWVzKQorCisgIGlmIHRlc3QgIngkd2FudF9nbm9tZSIgPSB4eWVzIC1hICIwJGd0a19tYWpvcl92ZXJzaW9uIiAtZ2UgMjsgdGhlbgorICB7CisgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBsaWJnbm9tZXVpLTIuMCkKKyAgICBpZiAkUEtHX0NPTkZJRyAtLWV4aXN0cyBsaWJnbm9tZXVpLTIuMDsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICBHTk9NRV9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMtb25seS1sIGxpYmdub21ldWktMi4wYAorICAgICAgR05PTUVfTElCRElSPWAkUEtHX0NPTkZJRyAtLWxpYnMtb25seS1MIGxpYmdub21ldWktMi4wYAorICAgICAgR05PTUVfSU5DTFVERURJUj1gJFBLR19DT05GSUcgLS1jZmxhZ3MgbGliZ25vbWV1aS0yLjBgCisgICAgICAkMQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQobm90IGZvdW5kKQorICAgICAgaWYgdGVzdCAieCQyIiA9IHhmYWlsOyB0aGVuCisJQUNfTVNHX0VSUk9SKENvdWxkIG5vdCBmaW5kIGxpYmdub21ldWktMi4wIHZpYSBwa2ctY29uZmlnKQorICAgICAgZmkKKyAgICBmaQorICB9CisgIGVsaWYgdGVzdCAieCR3YW50X2dub21lIiA9IHh5ZXM7IHRoZW4KKyAgeworICAgIEFDX1BBVEhfUFJPRyhHTk9NRV9DT05GSUcsZ25vbWUtY29uZmlnLG5vKQorICAgIGlmIHRlc3QgIiRHTk9NRV9DT05GSUciID0gIm5vIjsgdGhlbgorICAgICAgbm9fZ25vbWVfY29uZmlnPSJ5ZXMiCisgICAgZWxzZQorICAgICAgQUNfTVNHX0NIRUNLSU5HKGlmICRHTk9NRV9DT05GSUcgd29ya3MpCisgICAgICBpZiAkR05PTUVfQ09ORklHIC0tbGlicy1vbmx5LWwgZ25vbWUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJQUNfTVNHX1JFU1VMVCh5ZXMpCisJR05PTUVfTElCUz0iYCRHTk9NRV9DT05GSUcgLS1saWJzLW9ubHktbCBnbm9tZSBnbm9tZXVpYCIKKwlHTk9NRV9MSUJESVI9ImAkR05PTUVfQ09ORklHIC0tbGlicy1vbmx5LUwgZ25vcmJhIGdub21ldWlgIgorCUdOT01FX0lOQ0xVREVESVI9ImAkR05PTUVfQ09ORklHIC0tY2ZsYWdzIGdub3JiYSBnbm9tZXVpYCIKKwkkMQorICAgICAgZWxzZQorCUFDX01TR19SRVNVTFQobm8pCisJbm9fZ25vbWVfY29uZmlnPSJ5ZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZXhlY19wcmVmaXggPSB4Tk9ORTsgdGhlbgorICAgICAgaWYgdGVzdCB4JHByZWZpeCA9IHhOT05FOyB0aGVuCisJZ25vbWVfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeC9saWIKKyAgICAgIGVsc2UKKwlnbm9tZV9wcmVmaXg9JHByZWZpeC9saWIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ25vbWVfcHJlZml4PWBldmFsIGVjaG8gXGBlY2hvICRsaWJkaXJcYGAKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJG5vX2dub21lX2NvbmZpZyIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBnbm9tZUNvbmYuc2ggZmlsZSBpbiAkZ25vbWVfcHJlZml4KQorICAgICAgaWYgdGVzdCAtZiAkZ25vbWVfcHJlZml4L2dub21lQ29uZi5zaDsgdGhlbgorCUFDX01TR19SRVNVTFQoZm91bmQpCisJZWNobyAibG9hZGluZyBnbm9tZSBjb25maWd1cmF0aW9uIGZyb20iIFwKKwkgICIkZ25vbWVfcHJlZml4L2dub21lQ29uZi5zaCIKKwkuICRnbm9tZV9wcmVmaXgvZ25vbWVDb25mLnNoCisJJDEKKyAgICAgIGVsc2UKKwlBQ19NU0dfUkVTVUxUKG5vdCBmb3VuZCkKKwlpZiB0ZXN0IHgkMiA9IHhmYWlsOyB0aGVuCisJICBBQ19NU0dfRVJST1IoQ291bGQgbm90IGZpbmQgdGhlIGdub21lQ29uZi5zaCBmaWxlIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IGdub21lLWxpYnMgaW5zdGFsbCkKKwlmaQorICAgICAgZmkKKyAgICBmaQorICB9CisgIGZpCitdKQorCitBQ19ERUZVTihbR05PTUVfSU5JVF0sWworCUdOT01FX0lOSVRfSE9PSyhbXSxmYWlsKQorXSkKKworCitkbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkbmwgQ2hlY2sgZm9yIEdUSy4gIEZpcnN0IGNoZWNrcyBmb3IgZ3RrLWNvbmZpZywgY2F1c2UgaXQgbmVlZHMgdGhhdCB0byBnZXQgdGhlCitkbmwgY29ycmVjdCBjb21waWxlciBmbGFncy4gIFRoZW4gY2hlY2tzIGZvciBHVEsgMS4xLjE2LiAgSWYgdGhhdCBmYWlscywgdGhlbgorZG5sIGl0IGNoZWNrcyBmb3IgMS4wLjYuICBJZiBib3RoIGZhaWwsIHRoZW4gY29udGludWUgb24gZm9yIE1vdGlmIGFzIGJlZm9yZS4uLgorZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgdGVzdCAteiAiJFNLSVBfR1RLIjsgdGhlbgorCisgIEFDX01TR19DSEVDS0lORygtLXdpdGgtZ3RrLXByZWZpeCBhcmd1bWVudCkKKyAgQUNfQVJHX1dJVEgoZ3RrLXByZWZpeCxbICAtLXdpdGgtZ3RrLXByZWZpeD1QRlggICBQcmVmaXggd2hlcmUgR1RLIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKwlndGtfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiOyBBQ19NU0dfUkVTVUxUKCRndGtfY29uZmlnX3ByZWZpeCksCisJZ3RrX2NvbmZpZ19wcmVmaXg9IiI7IEFDX01TR19SRVNVTFQobm8pKQorCisgIEFDX01TR19DSEVDS0lORygtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4IGFyZ3VtZW50KQorICBBQ19BUkdfV0lUSChndGstZXhlYy1wcmVmaXgsWyAgLS13aXRoLWd0ay1leGVjLXByZWZpeD1QRlggRXhlYyBwcmVmaXggd2hlcmUgR1RLIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKwlndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCI7IEFDX01TR19SRVNVTFQoJGd0a19jb25maWdfcHJlZml4KSwKKwlndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIiOyBBQ19NU0dfUkVTVUxUKG5vKSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoLS1kaXNhYmxlLWd0a3Rlc3QgYXJndW1lbnQpCisgIEFDX0FSR19FTkFCTEUoZ3RrdGVzdCwgWyAgLS1kaXNhYmxlLWd0a3Rlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEdUSyBwcm9ncmFtXSwKKwksIGVuYWJsZV9ndGt0ZXN0PXllcykKKyAgaWYgdGVzdCAieCRlbmFibGVfZ3RrdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChndGsgdGVzdCBlbmFibGVkKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChndGsgdGVzdCBkaXNhYmxlZCkKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGd0a19jb25maWdfcHJlZml4IiAhPSAieCIgOyB0aGVuCisgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tcHJlZml4PSRndGtfY29uZmlnX3ByZWZpeCIKKyAgICBHVEtfQ09ORklHPSRndGtfY29uZmlnX3ByZWZpeC9iaW4vZ3RrLWNvbmZpZworICBmaQorICBpZiB0ZXN0ICJ4JGd0a19jb25maWdfZXhlY19wcmVmaXgiICE9ICJ4IiA7IHRoZW4KKyAgICBndGtfY29uZmlnX2FyZ3M9IiRndGtfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kZ3RrX2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgICBHVEtfQ09ORklHPSRndGtfY29uZmlnX2V4ZWNfcHJlZml4L2Jpbi9ndGstY29uZmlnCisgIGZpCisgIGlmIHRlc3QgIlgkR1RLX0NPTkZJRyIgPSAiWCI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coR1RLX0NPTkZJRywgZ3RrLWNvbmZpZywgbm8pCisgICAgaWYgdGVzdCAiWCRHVEtfQ09ORklHIiA9ICJYbm8iOyB0aGVuCisgICAgICBkbmwgU29tZSBkaXN0cmlidXRpb25zIGNhbGwgaXQgZ3RrMTItY29uZmlnLCBhbm5veWluZyEKKyAgICAgIEFDX1BBVEhfUFJPRyhHVEsxMl9DT05GSUcsIGd0azEyLWNvbmZpZywgbm8pCisgICAgICBHVEtfQ09ORklHPSIkR1RLMTJfQ09ORklHIgorICAgIGZpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFVzaW5nIEdUSyBjb25maWd1cmF0aW9uIHByb2dyYW0gJEdUS19DT05GSUcpCisgIGZpCisgIGlmIHRlc3QgIlgkUEtHX0NPTkZJRyIgPSAiWCI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coUEtHX0NPTkZJRywgcGtnLWNvbmZpZywgbm8pCisgIGZpCisKKyAgaWYgdGVzdCAieCRHVEtfQ09ORklHOiRQS0dfQ09ORklHIiAhPSAieG5vOm5vIjsgdGhlbgorICAgIGRubCBGaXJzdCB0cnkgZmluZGluZyB2ZXJzaW9uIDIuMi4wIG9yIGxhdGVyLiAgVGhlIDIuMC54IHNlcmllcyBoYXMKKyAgICBkbmwgcHJvYmxlbXMgKGJvbGQgZm9udHMsIC0tcmVtb3RlIGRvZXNuJ3Qgd29yaykuCisgICAgaWYgdGVzdCAiWCRTS0lQX0dUSzIiICE9ICJYWUVTIjsgdGhlbgorICAgICAgQU1fUEFUSF9HVEsoMi4yLjAsCisJCSAgW0dUS19MSUJOQU1FPSIkR1RLX0xJQlMiCisJCSAgR1VJX0lOQ19MT0M9IiRHVEtfQ0ZMQUdTIl0sICkKKyAgICAgIGlmIHRlc3QgIngkR1RLX0NGTEFHUyIgIT0gIngiOyB0aGVuCisJU0tJUF9BVEhFTkE9WUVTCisJU0tJUF9ORVhUQVc9WUVTCisJU0tJUF9NT1RJRj1ZRVMKKwlHVUlUWVBFPUdUSworCUFDX1NVQlNUKEdUS19MSUJOQU1FKQorICAgICAgZmkKKyAgICBmaQorCisgICAgZG5sIElmIHRoZXJlIGlzIG5vIDIuMi4wIG9yIGxhdGVyIHRyeSB0aGUgMS54Lnggc2VyaWVzLiAgV2UgcmVxdWlyZSBhdAorICAgIGRubCBsZWFzdCBHVEsgMS4xLjE2LiAgMS4wLjYgZG9lc24ndCB3b3JrLiAgMS4xLjEgdG8gMS4xLjE1CisgICAgZG5sIHdlcmUgdGVzdCB2ZXJzaW9ucy4KKyAgICBpZiB0ZXN0ICJ4JEdVSVRZUEUiICE9ICJ4R1RLIjsgdGhlbgorICAgICAgU0tJUF9HVEsyPVlFUworICAgICAgQU1fUEFUSF9HVEsoMS4xLjE2LAorCQkgIFtHVEtfTElCTkFNRT0iJEdUS19MSUJTIgorCQkgIEdVSV9JTkNfTE9DPSIkR1RLX0NGTEFHUyJdLCApCisgICAgICBpZiB0ZXN0ICJ4JEdUS19DRkxBR1MiICE9ICJ4IjsgdGhlbgorCVNLSVBfQVRIRU5BPVlFUworCVNLSVBfTkVYVEFXPVlFUworCVNLSVBfTU9USUY9WUVTCisJR1VJVFlQRT1HVEsKKwlBQ19TVUJTVChHVEtfTElCTkFNRSkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKyAgZG5sIEdpdmUgYSB3YXJuaW5nIGlmIEdUSyBpcyBvbGRlciB0aGFuIDEuMi4zCisgIGlmIHRlc3QgIngkR1VJVFlQRSIgPSAieEdUSyI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkZ3RrX21ham9yX3ZlcnNpb24iID0gMSAtYSAiMCRndGtfbWlub3JfdmVyc2lvbiIgLWx0IDIgXAorCSAtbyAiJGd0a19tYWpvcl92ZXJzaW9uIiA9IDEgLWEgIiRndGtfbWlub3JfdmVyc2lvbiIgPSAyIC1hICIwJGd0a19taWNyb192ZXJzaW9uIiAtbHQgMzsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVCh0aGlzIEdUSyB2ZXJzaW9uIGlzIG9sZDsgdmVyc2lvbiAxLjIuMyBvciBsYXRlciBpcyByZWNvbW1lbmRlZCkKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgdGVzdCAiMCRndGtfbWFqb3JfdmVyc2lvbiIgLWdlIDI7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9HVEsyKQorCWlmIHRlc3QgIiRndGtfbWlub3JfdmVyc2lvbiIgPSAxIC1hICIwJGd0a19taWNyb192ZXJzaW9uIiAtZ2UgMSBcCisJCXx8IHRlc3QgIjAkZ3RrX21pbm9yX3ZlcnNpb24iIC1nZSAyIFwKKwkJfHwgdGVzdCAiMCRndGtfbWFqb3JfdmVyc2lvbiIgLWd0IDI7IHRoZW4KKwkgIEFDX0RFRklORShIQVZFX0dUS19NVUxUSUhFQUQpCisJZmkKKyAgICAgIGZpCisgICAgICBkbmwKKyAgICAgIGRubCBpZiBHVEsgZXhpc3RzLCBhbmQgaXQncyBub3QgdGhlIDEuMC54IHNlcmllcywgdGhlbiBjaGVjayBmb3IgR05PTUUuCisgICAgICBkbmwKKyAgICAgIGlmIHRlc3QgLXogIiRTS0lQX0dOT01FIjsgdGhlbgorICAgICAgeworCUdOT01FX0lOSVRfSE9PSyhbaGF2ZV9nbm9tZT15ZXNdKQorCWlmIHRlc3QgeCRoYXZlX2dub21lID0geHllcyA7IHRoZW4KKwkgIEFDX0RFRklORShGRUFUX0dVSV9HTk9NRSkKKwkgIEdVSV9JTkNfTE9DPSIkR1VJX0lOQ19MT0MgJEdOT01FX0lOQ0xVREVESVIiCisJICBHVEtfTElCTkFNRT0iJEdUS19MSUJOQU1FICRHTk9NRV9MSUJESVIgJEdOT01FX0xJQlMiCisJZmkKKyAgICAgIH0KKyAgICAgIGZpCisgICAgfQorICAgIGZpCisgIGZpCitmaQorCitkbmwgQ2hlY2sgZm9yIE1vdGlmIGluY2x1ZGUgZmlsZXMgbG9jYXRpb24uCitkbmwgVGhlIExBU1Qgb25lIGZvdW5kIGlzIHVzZWQsIHRoaXMgbWFrZXMgdGhlIGhpZ2hlc3QgdmVyc2lvbiB0byBiZSB1c2VkLAorZG5sIGUuZy4gd2hlbiBNb3RpZjEuMiBhbmQgTW90aWYyLjAgYXJlIGJvdGggcHJlc2VudC4KKworaWYgdGVzdCAteiAiJFNLSVBfTU9USUYiOyB0aGVuCisgIGd1aV9YWFg9Ii91c3IvWFhYL01vdGlmKiAvdXNyL01vdGlmKi9YWFggL3Vzci9YWFggL3Vzci9zaGxpYiAvdXNyL1gxMSovWFhYIC91c3IvWFhYL1gxMSogL3Vzci9kdC9YWFggL2xvY2FsL01vdGlmKi9YWFggL2xvY2FsL1hYWC9Nb3RpZiogL3Vzci9sb2NhbC9Nb3RpZiovWFhYIC91c3IvbG9jYWwvWFhYL01vdGlmKiAvdXNyL2xvY2FsL1hYWCAvdXNyL2xvY2FsL1gxMSovWFhYIC91c3IvbG9jYWwvTGVzc1RpZi9Nb3RpZiovWFhYICRNT1RJRkhPTUUvWFhYIgorICBkbmwgUmVtb3ZlICItSSIgZnJvbSBiZWZvcmUgJEdVSV9JTkNfTE9DIGlmIGl0J3MgdGhlcmUKKyAgR1VJX0lOQ19MT0M9ImBlY2hvICRHVUlfSU5DX0xPQ3xzZWQgJ3MlLUklJWcnYCIKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvY2F0aW9uIG9mIE1vdGlmIEdVSSBpbmNsdWRlcykKKyAgZ3VpX2luY2x1ZGVzPSJgZWNobyAkeF9pbmNsdWRlc3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgIGBlY2hvICIkZ3VpX1hYWCIgfCBzZWQgcy9YWFgvaW5jbHVkZS9nYCAkR1VJX0lOQ19MT0MiCisgIEdVSV9JTkNfTE9DPQorICBmb3IgdHJ5IGluICRndWlfaW5jbHVkZXM7IGRvCisgICAgaWYgdGVzdCAtZiAiJHRyeS9YbS9YbS5oIjsgdGhlbgorICAgICAgR1VJX0lOQ19MT0M9JHRyeQorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAtbiAiJEdVSV9JTkNfTE9DIjsgdGhlbgorICAgIGlmIHRlc3QgIiRHVUlfSU5DX0xPQyIgPSAvdXNyL2luY2x1ZGU7IHRoZW4KKyAgICAgIEdVSV9JTkNfTE9DPQorICAgICAgQUNfTVNHX1JFU1VMVChpbiBkZWZhdWx0IHBhdGgpCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVCgkR1VJX0lOQ19MT0MpCisgICAgZmkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoPG5vdCBmb3VuZD4pCisgICAgU0tJUF9NT1RJRj1ZRVMKKyAgZmkKK2ZpCisKK2RubCBDaGVjayBmb3IgTW90aWYgbGlicmFyeSBmaWxlcyBsb2NhdGlvbi4gIEluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBpbmNsdWRlCitkbmwgZmlsZXMsIHRvIGF2b2lkIGEgbWl4dXAgaWYgc2V2ZXJhbCB2ZXJzaW9ucyBhcmUgcHJlc2VudAorCitpZiB0ZXN0IC16ICIkU0tJUF9NT1RJRiI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKC0td2l0aC1tb3RpZi1saWIgYXJndW1lbnQpCisgIEFDX0FSR19XSVRIKG1vdGlmLWxpYiwKKyAgWyAgLS13aXRoLW1vdGlmLWxpYj1TVFJJTkcgICBMaWJyYXJ5IGZvciBNb3RpZiBdLAorICBbIE1PVElGX0xJQk5BTUU9IiR7d2l0aHZhbH0iIF0gKQorCisgIGlmIHRlc3QgLW4gIiRNT1RJRl9MSUJOQU1FIjsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoJE1PVElGX0xJQk5BTUUpCisgICAgR1VJX0xJQl9MT0M9CisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorCisgICAgZG5sIFJlbW92ZSAiLUwiIGZyb20gYmVmb3JlICRHVUlfTElCX0xPQyBpZiBpdCdzIHRoZXJlCisgICAgR1VJX0xJQl9MT0M9ImBlY2hvICRHVUlfTElCX0xPQ3xzZWQgJ3MlLUwlJWcnYCIKKworICAgIEFDX01TR19DSEVDS0lORyhmb3IgbG9jYXRpb24gb2YgTW90aWYgR1VJIGxpYnMpCisgICAgZ3VpX2xpYnM9ImBlY2hvICR4X2xpYnJhcmllc3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgIGBlY2hvICIkZ3VpX1hYWCIgfCBzZWQgcy9YWFgvbGliL2dgIGBlY2hvICIkR1VJX0lOQ19MT0MiIHwgc2VkIHMvaW5jbHVkZS9saWIvYCAkR1VJX0xJQl9MT0MiCisgICAgR1VJX0xJQl9MT0M9CisgICAgZm9yIHRyeSBpbiAkZ3VpX2xpYnM7IGRvCisgICAgICBmb3IgbGlidHJ5IGluICIkdHJ5Ii9saWJYbS5hICIkdHJ5Ii9saWJYbS5zbyogIiR0cnkiL2xpYlhtLnNsOyBkbworCWlmIHRlc3QgLWYgIiRsaWJ0cnkiOyB0aGVuCisJICBHVUlfTElCX0xPQz0kdHJ5CisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgaWYgdGVzdCAtbiAiJEdVSV9MSUJfTE9DIjsgdGhlbgorICAgICAgZG5sIFJlbW92ZSAvdXNyL2xpYiwgaXQgY2F1c2VzIHRyb3VibGUgb24gc29tZSBzeXN0ZW1zCisgICAgICBpZiB0ZXN0ICIkR1VJX0xJQl9MT0MiID0gL3Vzci9saWI7IHRoZW4KKwlHVUlfTElCX0xPQz0KKwlBQ19NU0dfUkVTVUxUKGluIGRlZmF1bHQgcGF0aCkKKyAgICAgIGVsc2UKKwlpZiB0ZXN0IC1uICIkR1VJX0xJQl9MT0MiOyB0aGVuCisJICBBQ19NU0dfUkVTVUxUKCRHVUlfTElCX0xPQykKKwkgIGlmIHRlc3QgImAodW5hbWUpIDI+L2Rldi9udWxsYCIgPSBTdW5PUyAmJgorCQkJCQkgdW5hbWUgLXIgfCBncmVwICdeNScgPi9kZXYvbnVsbDsgdGhlbgorCSAgICBHVUlfTElCX0xPQz0iJEdVSV9MSUJfTE9DIC1SICRHVUlfTElCX0xPQyIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgICBNT1RJRl9MSUJOQU1FPS1sWG0KKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKDxub3QgZm91bmQ+KQorICAgICAgU0tJUF9NT1RJRj1ZRVMKKyAgICBmaQorICBmaQorZmkKKworaWYgdGVzdCAteiAiJFNLSVBfTU9USUYiOyB0aGVuCisgIFNLSVBfQVRIRU5BPVlFUworICBTS0lQX05FWFRBVz1ZRVMKKyAgR1VJVFlQRT1NT1RJRgorICBBQ19TVUJTVChNT1RJRl9MSUJOQU1FKQorZmkKKworZG5sIENoZWNrIGlmIHRoZSBBdGhlbmEgZmlsZXMgY2FuIGJlIGZvdW5kCisKK0dVSV9YX0xJQlM9CisKK2lmIHRlc3QgLXogIiRTS0lQX0FUSEVOQSI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKGlmIEF0aGVuYSBoZWFkZXIgZmlsZXMgY2FuIGJlIGZvdW5kKQorICBjZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MiCisgIEFDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjaW5jbHVkZSA8WDExL1hhdy9QYW5lZC5oPl0sICwKKwlBQ19NU0dfUkVTVUxUKHllcyksCisJQUNfTVNHX1JFU1VMVChubyk7IFNLSVBfQVRIRU5BPVlFUyApCisgIENGTEFHUz0kY2ZsYWdzX3NhdmUKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX0FUSEVOQSI7IHRoZW4KKyAgR1VJVFlQRT1BVEhFTkEKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX05FWFRBVyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKGlmIG5lWHRhdyBoZWFkZXIgZmlsZXMgY2FuIGJlIGZvdW5kKQorICBjZmxhZ3Nfc2F2ZT0kQ0ZMQUdTCisgIENGTEFHUz0iJENGTEFHUyAkWF9DRkxBR1MiCisgIEFDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjaW5jbHVkZSA8WDExL25lWHRhdy9QYW5lZC5oPl0sICwKKwlBQ19NU0dfUkVTVUxUKHllcyksCisJQUNfTVNHX1JFU1VMVChubyk7IFNLSVBfTkVYVEFXPVlFUyApCisgIENGTEFHUz0kY2ZsYWdzX3NhdmUKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX05FWFRBVyI7IHRoZW4KKyAgR1VJVFlQRT1ORVhUQVcKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX0FUSEVOQSIgLW8gLXogIiRTS0lQX05FWFRBVyIgLW8gLXogIiRTS0lQX01PVElGIjsgdGhlbgorICBkbmwgUHJlcGVuZCAtSSBhbmQgLUwgdG8gJEdVSV9JTkNfTE9DIGFuZCAkR1VJX0xJQl9MT0MgaWYgbm90IGVtcHR5CisgIGRubCBBdm9pZCBhZGRpbmcgaXQgd2hlbiBpdCB0d2ljZQorICBpZiB0ZXN0IC1uICIkR1VJX0lOQ19MT0MiOyB0aGVuCisgICAgR1VJX0lOQ19MT0M9LUkiYGVjaG8gJEdVSV9JTkNfTE9DfHNlZCAncyUtSSUlJ2AiCisgIGZpCisgIGlmIHRlc3QgLW4gIiRHVUlfTElCX0xPQyI7IHRoZW4KKyAgICBHVUlfTElCX0xPQz0tTCJgZWNobyAkR1VJX0xJQl9MT0N8c2VkICdzJS1MJSUnYCIKKyAgZmkKKworICBkbmwgQ2hlY2sgZm9yIC1sWGV4dCBhbmQgdGhlbiBmb3IgLWxYbXUKKyAgbGRmbGFnc19zYXZlPSRMREZMQUdTCisgIExERkxBR1M9IiRYX0xJQlMgJExERkxBR1MiCisgIEFDX0NIRUNLX0xJQihYZXh0LCBYU2hhcGVRdWVyeUV4dGVuc2lvbiwgW0dVSV9YX0xJQlM9Ii1sWGV4dCJdLCwKKwkJWy1sWHQgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCU10pCisgIGRubCBGb3IgU29sYXJpcyB3ZSBuZWVkIC1sdyBhbmQgLWxkbCBiZWZvcmUgbGlua2luZyB3aXRoIC1sWG11IHdvcmtzLgorICBBQ19DSEVDS19MSUIodywgd3NsZW4sIFtYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWx3Il0sLAorCQlbJEdVSV9YX0xJQlMgLWxYdCAkWF9QUkVfTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTXSkKKyAgQUNfQ0hFQ0tfTElCKGRsLCBkbHN5bSwgW1hfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRsIl0sLAorCQlbJEdVSV9YX0xJQlMgLWxYdCAkWF9QUkVfTElCUyAtbFgxMSAkWF9FWFRSQV9MSUJTXSkKKyAgQUNfQ0hFQ0tfTElCKFhtdSwgWG11Q3JlYXRlU3RpcHBsZWRQaXhtYXAsIFtHVUlfWF9MSUJTPSItbFhtdSAkR1VJX1hfTElCUyJdLCwKKwkJWyRHVUlfWF9MSUJTIC1sWHQgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCU10pCisgIGlmIHRlc3QgLXogIiRTS0lQX01PVElGIjsgdGhlbgorICAgIEFDX0NIRUNLX0xJQihYcCwgWHBFbmRKb2IsIFtHVUlfWF9MSUJTPSItbFhwICRHVUlfWF9MSUJTIl0sLAorCQlbJEdVSV9YX0xJQlMgLWxYbSAtbFh0ICRYX1BSRV9MSUJTIC1sWDExICRYX0VYVFJBX0xJQlNdKQorICBmaQorICBMREZMQUdTPSRsZGZsYWdzX3NhdmUKKworICBkbmwgRXhlY3V0ZSB4bWttZiB0byBmaWd1cmUgb3V0IGlmIC1ETkFSUk9XUFJPVE8gaXMgbmVlZGVkLgorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGV4dHJhIFgxMSBkZWZpbmVzKQorICBOQVJST1dfUFJPVE89CisgIHJtIC1mciBjb25mdGVzdGRpcgorICBpZiBta2RpciBjb25mdGVzdGRpcjsgdGhlbgorICAgIGNkIGNvbmZ0ZXN0ZGlyCisgICAgY2F0ID4gSW1ha2VmaWxlIDw8J0VPRicKK2FjZmluZHg6CisJQGVjaG8gJ05BUlJPV19QUk9UTz0iJHtQUk9UT19ERUZJTkVTfSInCitFT0YKKyAgICBpZiAoeG1rbWYpID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgorICAgICAgZXZhbCBgJHtNQUtFLW1ha2V9IGFjZmluZHggMj4vZGV2L251bGwgfCBncmVwIC12IG1ha2VgCisgICAgZmkKKyAgICBjZCAuLgorICAgIHJtIC1mciBjb25mdGVzdGRpcgorICBmaQorICBpZiB0ZXN0IC16ICIkTkFSUk9XX1BST1RPIjsgdGhlbgorICAgIEFDX01TR19SRVNVTFQobm8pCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKCROQVJST1dfUFJPVE8pCisgIGZpCisgIEFDX1NVQlNUKE5BUlJPV19QUk9UTykKK2ZpCisKK2RubCBMb29rIGZvciBYU01QIHN1cHBvcnQgLSBidXQgZG9uJ3QgbmVjZXNzYXJpbHkgcmVzdHJpY3QgaXQgdG8gWDExIEdVSXMKK2RubCB1c2UgdGhlIFgxMSBpbmNsdWRlIHBhdGgKK2lmIHRlc3QgIiRlbmFibGVfeHNtcCIgPSAieWVzIjsgdGhlbgorICBjcHBmbGFnc19zYXZlPSRDUFBGTEFHUworICBDUFBGTEFHUz0iJENQUEZMQUdTICRYX0NGTEFHUyIKKyAgQUNfQ0hFQ0tfSEVBREVSUyhYMTEvU00vU01saWIuaCkKKyAgQ1BQRkxBR1M9JGNwcGZsYWdzX3NhdmUKK2ZpCisKKworaWYgdGVzdCAteiAiJFNLSVBfQVRIRU5BIiAtbyAteiAiJFNLSVBfTkVYVEFXIiAtbyAteiAiJFNLSVBfTU9USUYiIC1vIC16ICIkU0tJUF9HVEsiOyB0aGVuCisgIGRubCBDaGVjayBmb3IgWDExL3hwbS5oIGFuZCBYMTEvU3Vua2V5c3ltLmggd2l0aCB0aGUgR1VJIGluY2x1ZGUgcGF0aAorICBjcHBmbGFnc19zYXZlPSRDUFBGTEFHUworICBDUFBGTEFHUz0iJENQUEZMQUdTICRYX0NGTEFHUyIKKyAgQUNfQ0hFQ0tfSEVBREVSUyhYMTEveHBtLmggWDExL1N1bmtleXN5bS5oKQorCisgIGRubCBhdXRvbWF0aWNhbGx5IGRpc2FibGUgWElNIHdoZW4gWElNdGV4dCBpc24ndCBpbiBYMTEvWGxpYi5oCisgIGlmIHRlc3QgISAiJGVuYWJsZV94aW0iID0gIm5vIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhmb3IgWElNVGV4dCBpbiBYMTEvWGxpYi5oKQorICAgIEFDX0VHUkVQX0NQUChYSU1UZXh0LCBbI2luY2x1ZGUgPFgxMS9YbGliLmg+XSwKKwkJICBBQ19NU0dfUkVTVUxUKHllcyksCisJCSAgQUNfTVNHX1JFU1VMVChubzsgeGltIGhhcyBiZWVuIGRpc2FibGVkKTsgZW5hYmxlX3hpbSA9ICJubyIpCisgIGZpCisgIENQUEZMQUdTPSRjcHBmbGFnc19zYXZlCisKKyAgZG5sIGF1dG9tYXRpY2FsbHkgZW5hYmxlIFhJTSB3aGVuIGhhbmd1bCBpbnB1dCBpc24ndCBlbmFibGVkCisgIGlmIHRlc3QgIiRlbmFibGVfeGltIiA9ICJhdXRvIiAtYSAiJGVuYWJsZV9oYW5ndWxpbnB1dCIgIT0gInllcyIgXAorCQktYSAieCRHVUlUWVBFIiAhPSAieE5PTkUiIDsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoWCBHVUkgc2VsZWN0ZWQ7IHhpbSBoYXMgYmVlbiBlbmFibGVkKQorICAgIGVuYWJsZV94aW09InllcyIKKyAgZmkKK2ZpCisKK2lmIHRlc3QgLXogIiRTS0lQX0FUSEVOQSIgLW8gLXogIiRTS0lQX05FWFRBVyIgLW8gLXogIiRTS0lQX01PVElGIjsgdGhlbgorICBjcHBmbGFnc19zYXZlPSRDUFBGTEFHUworICBDUFBGTEFHUz0iJENQUEZMQUdTICRYX0NGTEFHUyIKKyAgQUNfQ0hFQ0tfSEVBREVSUyhYMTEvWG11L0VkaXRyZXMuaCkKKyAgQ1BQRkxBR1M9JGNwcGZsYWdzX3NhdmUKK2ZpCisKK2RubCBPbmx5IHVzZSB0aGUgWG0gZGlyZWN0b3J5IHdoZW4gY29tcGlsaW5nIE1vdGlmLCBkb24ndCB1c2UgaXQgZm9yIEF0aGVuYQoraWYgdGVzdCAteiAiJFNLSVBfTU9USUYiOyB0aGVuCisgIGNwcGZsYWdzX3NhdmU9JENQUEZMQUdTCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFhfQ0ZMQUdTIgorICBBQ19DSEVDS19IRUFERVJTKFhtL1htLmggWG0vWHBtUC5oKQorICBDUFBGTEFHUz0kY3BwZmxhZ3Nfc2F2ZQorZmkKKworaWYgdGVzdCAieCRHVUlUWVBFIiA9ICJ4Tk9ORSIgLWEgIiRlbmFibGVfeGltIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQobm8gR1VJIHNlbGVjdGVkOyB4aW0gaGFzIGJlZW4gZGlzYWJsZWQpCisgIGVuYWJsZV94aW09Im5vIgorZmkKK2lmIHRlc3QgIngkR1VJVFlQRSIgPSAieE5PTkUiIC1hICIkZW5hYmxlX2ZvbnRzZXQiID0gInllcyI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChubyBHVUkgc2VsZWN0ZWQ7IGZvbnRzZXQgaGFzIGJlZW4gZGlzYWJsZWQpCisgIGVuYWJsZV9mb250c2V0PSJubyIKK2ZpCitpZiB0ZXN0ICJ4JEdVSVRZUEU6JGVuYWJsZV9mb250c2V0IiA9ICJ4R1RLOnllcyIgLWEgIjAkZ3RrX21ham9yX3ZlcnNpb24iIC1nZSAyOyB0aGVuCisgIEFDX01TR19SRVNVTFQoR1RLKyAyIEdVSSBzZWxlY3RlZDsgZm9udHNldCBoYXMgYmVlbiBkaXNhYmxlZCkKKyAgZW5hYmxlX2ZvbnRzZXQ9Im5vIgorZmkKKworZG5sIFRoZXJlIGlzIG5vIHRlc3QgZm9yIHRoZSBCZU9TIEdVSSwgaWYgaXQncyBzZWxlY3RlZCBpdCdzIHVzZWQKK2lmIHRlc3QgLXogIiRTS0lQX0JFT1MiOyB0aGVuCisgIEdVSVRZUEU9QkVPU0dVSQorZmkKKworaWYgdGVzdCAteiAiJFNLSVBfUEhPVE9OIjsgdGhlbgorICBHVUlUWVBFPVBIT1RPTkdVSQorZmkKKworQUNfU1VCU1QoR1VJX0lOQ19MT0MpCitBQ19TVUJTVChHVUlfTElCX0xPQykKK0FDX1NVQlNUKEdVSVRZUEUpCitBQ19TVUJTVChHVUlfWF9MSUJTKQorCitpZiB0ZXN0ICIkZW5hYmxlX3dvcmtzaG9wIiA9ICJ5ZXMiIC1hIC1uICIkU0tJUF9NT1RJRiI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgdXNlIHdvcmtzaG9wIHdpdGhvdXQgTW90aWZdKQorZmkKKworZG5sIGRlZmluaW5nIEZFQVRfWElNIGFuZCBGRUFUX1hGT05UU0VUIGlzIGRlbGF5ZWQsIHNvIHRoYXQgdGhleSBjYW4gYmUgZGlzYWJsZWQKK2lmIHRlc3QgIiRlbmFibGVfeGltIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0RFRklORShGRUFUX1hJTSkKK2ZpCitpZiB0ZXN0ICIkZW5hYmxlX2ZvbnRzZXQiID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEZFQVRfWEZPTlRTRVQpCitmaQorCisKK2RubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RubCBlbmQgb2YgR1VJLWNoZWNraW5nCitkbmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZG5sIE9ubHkgcmVhbGx5IGVuYWJsZSBoYW5ndWwgaW5wdXQgd2hlbiBHVUkgYW5kIFhGT05UU0VUIGFyZSBhdmFpbGFibGUKK2lmIHRlc3QgIiRlbmFibGVfaGFuZ3VsaW5wdXQiID0gInllcyI7IHRoZW4KKyAgaWYgdGVzdCAieCRHVUlUWVBFIiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKG5vIEdVSSBzZWxlY3RlZDsgaGFuZ3VsIGlucHV0IGhhcyBiZWVuIGRpc2FibGVkKQorICAgIGVuYWJsZV9oYW5ndWxpbnB1dD1ubworICBlbHNlCisgICAgQUNfREVGSU5FKEZFQVRfSEFOR1VMSU4pCisgICAgSEFOR1VMSU5fU1JDPWhhbmd1bGluLmMKKyAgICBBQ19TVUJTVChIQU5HVUxJTl9TUkMpCisgICAgSEFOR1VMSU5fT0JKPW9iamVjdHMvaGFuZ3VsaW4ubworICAgIEFDX1NVQlNUKEhBTkdVTElOX09CSikKKyAgZmkKK2ZpCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcmllcyBhbmQgaW5jbHVkZSBmaWxlcy4KKworQUNfTVNHX0NIRUNLSU5HKHF1YWxpdHkgb2YgdG91cHBlcikKK0FDX1RSWV9SVU4oWyNpbmNsdWRlIDxjdHlwZS5oPgorbWFpbigpIHsgZXhpdCh0b3VwcGVyKCdBJykgPT0gJ0EnICYmIHRvbG93ZXIoJ3onKSA9PSAneicpOyB9XSwKKwlBQ19ERUZJTkUoQlJPS0VOX1RPVVBQRVIpIEFDX01TR19SRVNVTFQoYmFkKSwKKwlBQ19NU0dfUkVTVUxUKGdvb2QpLCBBQ19NU0dfRVJST1IoZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtKSkKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgX19EQVRFX18gYW5kIF9fVElNRV9fIHdvcmspCitBQ19UUllfQ09NUElMRSgsIFtwcmludGYoIigiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiKSIpO10sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9EQVRFX1RJTUUpLAorCUFDX01TR19SRVNVTFQobm8pKQorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19DSEVDS19IRUFERVIoZWxmLmgsIEhBU19FTEY9MSkKK2RubCBBQ19DSEVDS19IRUFERVIoZHdhcmYuaCwgU1ZSND0xKQoraWYgdGVzdCAiJEhBU19FTEYiID0gMTsgdGhlbgorICBBQ19DSEVDS19MSUIoZWxmLCBtYWluKQorZmkKKworQUNfSEVBREVSX0RJUkVOVAorCitkbmwgY2hlY2sgZm9yIHN0YW5kYXJkIGhlYWRlcnMsIHdlIGRvbid0IHVzZSB0aGlzIGluIFZpbSBidXQgb3RoZXIgc3R1ZmYKK2RubCBpbiBhdXRvY29uZiBuZWVkcyBpdAorQUNfSEVBREVSX1NUREMKK0FDX0hFQURFUl9TWVNfV0FJVAorCitkbmwgSWYgc3lzL3dhaXQuaCBpcyBub3QgZm91bmQgaXQgbWlnaHQgc3RpbGwgZXhpc3QgYnV0IG5vdCBiZSBQT1NJWAorZG5sIGNvbXBsaWFudC4gSW4gdGhhdCBjYXNlIHdlIGRlZmluZSBIQVZFX1VOSU9OX1dBSVQgKGZvciBOZVhUKQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSBubzsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzeXMvd2FpdC5oIHRoYXQgZGVmaW5lcyB1bmlvbiB3YWl0XSkKKyAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvd2FpdC5oPl0sCisJCQlbdW5pb24gd2FpdCB4eCwgeXk7IHh4ID0geXldLAorCQlBQ19NU0dfUkVTVUxUKHllcykKKwkJCUFDX0RFRklORShIQVZFX1NZU19XQUlUX0gpCisJCQlBQ19ERUZJTkUoSEFWRV9VTklPTl9XQUlUKSwKKwkJQUNfTVNHX1JFU1VMVChubykpCitmaQorCitBQ19DSEVDS19IRUFERVJTKHN0ZGFyZy5oIHN0ZGxpYi5oIHN0cmluZy5oIHN5cy9zZWxlY3QuaCBzeXMvdXRzbmFtZS5oIFwKKwl0ZXJtY2FwLmggZmNudGwuaCBzZ3R0eS5oIHN5cy9pb2N0bC5oIHN5cy90aW1lLmggdGVybWlvLmggXAorCWljb252LmggbGFuZ2luZm8uaCB1bmlzdGQuaCBzdHJvcHRzLmggZXJybm8uaCBcCisJc3lzL3Jlc291cmNlLmggc3lzL3N5c3RlbWluZm8uaCBsb2NhbGUuaCBcCisJc3lzL3N0cmVhbS5oIHN5cy9wdGVtLmggdGVybWlvcy5oIGxpYmMuaCBzeXMvc3RhdGZzLmggXAorCXBvbGwuaCBzeXMvcG9sbC5oIHB3ZC5oIHV0aW1lLmggc3lzL3BhcmFtLmggbGliaW50bC5oIFwKKwlsaWJnZW4uaCB1dGlsL2RlYnVnLmggdXRpbC9tc2cxOG4uaCBmcmFtZS5oIHB0aHJlYWRfbnAuaCBcCisJc3lzL2FjbC5oIHN5cy9hY2Nlc3MuaCBzeXMvc3lzY3RsLmggc3lzL3N5c2luZm8uaCB3Y2hhci5oKQorCitkbmwgT24gTWFjIE9TIFggc3RyaW5ncy5oIGV4aXN0cyBidXQgcHJvZHVjZXMgYSB3YXJuaW5nIG1lc3NhZ2UgOi0oCitpZiB0ZXN0ICJ4JE1BQ09TWCIgIT0gInh5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX0hFQURFUlMoc3RyaW5ncy5oKQorZmkKKworZG5sIENoZWNrIGlmIHN0cmluZ3MuaCBhbmQgc3RyaW5nLmggY2FuIGJvdGggYmUgaW5jbHVkZWQgd2hlbiBkZWZpbmVkLgorQUNfTVNHX0NIRUNLSU5HKFtpZiBzdHJpbmdzLmggY2FuIGJlIGluY2x1ZGVkIGFmdGVyIHN0cmluZy5oXSkKK2NwcGZsYWdzX3NhdmU9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRYX0NGTEFHUyIKK0FDX1RSWV9DT01QSUxFKFsKKyNpZiBkZWZpbmVkKF9BSVgpICYmICFkZWZpbmVkKF9BSVg1MSkgJiYgIWRlZmluZWQoX05PX1BST1RPKQorIyBkZWZpbmUgX05PX1BST1RPCS8qIGxpa2UgaW4gb3NfdW5peC5oLCBjYXVzZXMgY29uZmxpY3QgZm9yIEFJWCAoV2lubikgKi8KKwkJCS8qIGJ1dCBkb24ndCBkbyBpdCBvbiBBSVggNS4xIChVcmliYXJyaSkgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfWE1fWE1fSAorIyBpbmNsdWRlIDxYbS9YbS5oPgkvKiBUaGlzIGJyZWFrcyBpdCBmb3IgSFAtVVggMTEgKFNxdWFzc2FiaWEpICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NUUklOR1NfSCkKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisJCV0sIFtpbnQgaTsgaSA9IDA7XSwKKwkJQUNfTVNHX1JFU1VMVCh5ZXMpLAorCQlBQ19ERUZJTkUoTk9fU1RSSU5HU19XSVRIX1NUUklOR19IKQorCQlBQ19NU0dfUkVTVUxUKG5vKSkKK0NQUEZMQUdTPSRjcHBmbGFnc19zYXZlCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKK0FDX0NfQ09OU1QKK0FDX1RZUEVfTU9ERV9UCitBQ19UWVBFX09GRl9UCitBQ19UWVBFX1BJRF9UCitBQ19UWVBFX1NJWkVfVAorQUNfVFlQRV9VSURfVAorQUNfSEVBREVSX1RJTUUKK0FDX0NIRUNLX1RZUEUoaW5vX3QsIGxvbmcpCitBQ19DSEVDS19UWVBFKGRldl90LCB1bnNpZ25lZCkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBybGltX3QpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9ybGltX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFsoY2FjaGVkKSAkYWNfY3ZfdHlwZV9ybGltX3RdKQorZWxzZQorICBBQ19FR1JFUF9DUFAoZG5sCitjaGFuZ2VxdW90ZSg8PCw+PilkbmwKKzw8KF58W15hLXpBLVpfMC05XSlybGltX3RbXmEtekEtWl8wLTldPj5kbmwKK2NoYW5nZXF1b3RlKFssXSksCisgIFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCSAgXSwgYWNfY3ZfdHlwZV9ybGltX3Q9eWVzLCBhY19jdl90eXBlX3JsaW1fdD1ubykKKwkgIEFDX01TR19SRVNVTFQoJGFjX2N2X3R5cGVfcmxpbV90KQorZmkKK2lmIHRlc3QgJGFjX2N2X3R5cGVfcmxpbV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHJsaW1fdCB1bnNpZ25lZCBsb25nCitFT0YKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3Igc3RhY2tfdCkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3N0YWNrX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFsoY2FjaGVkKSAkYWNfY3ZfdHlwZV9zdGFja190XSkKK2Vsc2UKKyAgQUNfRUdSRVBfQ1BQKHN0YWNrX3QsCisgIFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCSAgXSwgYWNfY3ZfdHlwZV9zdGFja190PXllcywgYWNfY3ZfdHlwZV9zdGFja190PW5vKQorCSAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdHlwZV9zdGFja190KQorZmkKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc3RhY2tfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzdGFja190IHN0cnVjdCBzaWdhbHRzdGFjaworRU9GCitmaQorCitkbmwgQlNESSB1c2VzIHNzX2Jhc2Ugd2hpbGUgb3RoZXJzIHVzZSBzc19zcCBmb3IgdGhlIHN0YWNrIHBvaW50ZXIuCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBzdGFja190IGhhcyBhbiBzc19iYXNlIGZpZWxkKQorQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKwkJCV0sIFtzdGFja190IHNpZ3N0azsgc2lnc3RrLnNzX2Jhc2UgPSAwOyBdLAorCUFDX01TR19SRVNVTFQoeWVzKTsgQUNfREVGSU5FKEhBVkVfU1NfQkFTRSksCisJQUNfTVNHX1JFU1VMVChubykpCisKK29saWJzPSIkTElCUyIKK0FDX01TR19DSEVDS0lORygtLXdpdGgtdGxpYiBhcmd1bWVudCkKK0FDX0FSR19XSVRIKHRsaWIsIFsgIC0td2l0aC10bGliPWxpYnJhcnkgICAgIHRlcm1pbmFsIGxpYnJhcnkgdG8gYmUgdXNlZCBdLCkKK2lmIHRlc3QgLW4gIiR3aXRoX3RsaWIiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJHdpdGhfdGxpYikKKyAgTElCUz0iJExJQlMgLWwkd2l0aF90bGliIgorZWxzZQorICBBQ19NU0dfUkVTVUxUKFthdXRvbWF0aWMgdGVybWluYWwgbGlicmFyeSBzZWxlY3Rpb25dKQorICBkbmwgIE9uIEhQLVVYIDEwLjEwIHRlcm1jYXAgb3IgdGVybWxpYiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCisgIGRubCAgY3Vyc2VzLCBiZWNhdXNlIGN1cnNlcyBpcyBtdWNoIHNsb3dlci4KKyAgZG5sICBOZXdlciB2ZXJzaW9ucyBvZiBuY3Vyc2VzIGFyZSBwcmVmZXJyZWQgb3ZlciBhbnl0aGluZy4KKyAgZG5sICBPbGRlciB2ZXJzaW9ucyBvZiBuY3Vyc2VzIGhhdmUgYnVncywgZ2V0IGEgbmV3IG9uZSEKKyAgZG5sICBEaWdpdGFsIFVuaXggKE9TRjEpIHNob3VsZCB1c2UgY3Vyc2VzIChSb25hbGQgU2NoaWxkKS4KKyAgY2FzZSAiYHVuYW1lIC1zIDI+L2Rldi9udWxsYCIgaW4KKwlPU0YxKQl0bGlicz0ibmN1cnNlcyBjdXJzZXMgdGVybWxpYiB0ZXJtY2FwIjs7CisJKikJdGxpYnM9Im5jdXJzZXMgdGVybWxpYiB0ZXJtY2FwIGN1cnNlcyI7OworICBlc2FjCisgIGZvciBsaWJuYW1lIGluICR0bGliczsgZG8KKyAgICBBQ19DSEVDS19MSUIoJHtsaWJuYW1lfSwgdGdldGVudCwsKQorICAgIGlmIHRlc3QgIngkb2xpYnMiICE9ICJ4JExJQlMiOyB0aGVuCisgICAgICBkbmwgSXQncyBwb3NzaWJsZSB0aGF0IGEgbGlicmFyeSBpcyBmb3VuZCBidXQgaXQgZG9lc24ndCB3b3JrCisgICAgICBkbmwgZS5nLiwgc2hhcmVkIGxpYnJhcnkgdGhhdCBjYW5ub3QgYmUgZm91bmQKKyAgICAgIGRubCBjb21waWxlIGFuZCBydW4gYSB0ZXN0IHByb2dyYW0gdG8gYmUgc3VyZQorICAgICAgQUNfVFJZX1JVTihbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCittYWluKCkge2NoYXIgKnM7IHM9KGNoYXIgKil0Z290bygiJXAxJWQiLCAwLCAxKTsgZXhpdCgwKTsgfV0sCisJCQkgIHJlcz0iT0siLCByZXM9IkZBSUwiLCByZXM9IkZBSUwiKQorICAgICAgaWYgdGVzdCAiJHJlcyIgPSAiT0siOyB0aGVuCisJYnJlYWsKKyAgICAgIGZpCisgICAgICBBQ19NU0dfUkVTVUxUKCRsaWJuYW1lIGxpYnJhcnkgaXMgbm90IHVzYWJsZSkKKyAgICAgIExJQlM9IiRvbGlicyIKKyAgICBmaQorICBkb25lCitmaQoraWYgdGVzdCAieCRvbGlicyIgIT0gIngkTElCUyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgdGFsayB0ZXJtaW5mbykKKyAgQUNfVFJZX1JVTihbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCittYWluKCkKK3tjaGFyICpzOyBzPShjaGFyICopdGdvdG8oIiVwMSVkIiwgMCwgMSk7IGV4aXQoIXN0cmNtcChzPT0wID8gIiIgOiBzLCAiMSIpKTsgfV0sCisJICBBQ19NU0dfUkVTVUxUKFtubyAtLSB3ZSBhcmUgaW4gdGVybWNhcCBsYW5kXSksCisJICBBQ19NU0dfUkVTVUxUKFt5ZXMgLS0gdGVybWluZm8gc3Bva2VuIGhlcmVdKTsgQUNfREVGSU5FKFRFUk1JTkZPKSwKKwkgIEFDX01TR19FUlJPUihmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0uKSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lIGZvdW5kKQorZmkKKworaWYgdGVzdCAieCRvbGlicyIgIT0gIngkTElCUyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKHdoYXQgdGdldGVudCgpIHJldHVybnMgZm9yIGFuIHVua25vd24gdGVybWluYWwpCisgIEFDX1RSWV9SVU4oWworI2lmZGVmIEhBVkVfVEVSTUNBUF9ICisjIGluY2x1ZGUgPHRlcm1jYXAuaD4KKyNlbmRpZgorbWFpbigpCit7Y2hhciBzWzEwMDAwXTsgaW50IHJlcyA9IHRnZXRlbnQocywgInRoaXN0ZXJtaW5hbGRvZXNub3RleGlzdCIpOyBleGl0KHJlcyAhPSAwKTsgfV0sCisJICBBQ19NU0dfUkVTVUxUKHplcm8pOyBBQ19ERUZJTkUoVEdFVEVOVF9aRVJPX0VSUiwgMCksCisJICBBQ19NU0dfUkVTVUxUKG5vbi16ZXJvKSwKKwkgIEFDX01TR19FUlJPUihmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0uKSkKK2ZpCisKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRlcm1jYXAuaCBjb250YWlucyBvc3BlZWQpCitBQ19UUllfTElOSyhbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCisJCQldLCBbb3NwZWVkID0gMjAwMDBdLAorCUFDX01TR19SRVNVTFQoeWVzKTsgQUNfREVGSU5FKEhBVkVfT1NQRUVEKSwKKwlbQUNfTVNHX1JFU1VMVChubykKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBvc3BlZWQgY2FuIGJlIGV4dGVybikKKwlBQ19UUllfTElOSyhbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCitleHRlcm4gc2hvcnQgb3NwZWVkOworCQkJXSwgW29zcGVlZCA9IDIwMDAwXSwKKwkJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoT1NQRUVEX0VYVEVSTiksCisJCUFDX01TR19SRVNVTFQobm8pKV0KKwkpCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0ZXJtY2FwLmggY29udGFpbnMgVVAsIEJDIGFuZCBQQ10pCitBQ19UUllfTElOSyhbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCisJCQldLCBbaWYgKFVQID09IDAgJiYgQkMgPT0gMCkgUEMgPSAxXSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX1VQX0JDX1BDKSwKKwlbQUNfTVNHX1JFU1VMVChubykKKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgVVAsIEJDIGFuZCBQQyBjYW4gYmUgZXh0ZXJuXSkKKwlBQ19UUllfTElOSyhbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCitleHRlcm4gY2hhciAqVVAsICpCQywgUEM7CisJCQldLCBbaWYgKFVQID09IDAgJiYgQkMgPT0gMCkgUEMgPSAxXSwKKwkJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoVVBfQkNfUENfRVhURVJOKSwKKwkJQUNfTVNHX1JFU1VMVChubykpXQorCSkKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdHB1dHMoKSB1c2VzIG91dGZ1bnR5cGUpCitBQ19UUllfQ09NUElMRShbCisjaWZkZWYgSEFWRV9URVJNQ0FQX0gKKyMgaW5jbHVkZSA8dGVybWNhcC5oPgorI2VuZGlmCisJCQldLCBbZXh0ZXJuIGludCB4eCgpOyB0cHV0cygidGVzdCIsIDEsIChvdXRmdW50eXBlKXh4KV0sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9PVVRGVU5UWVBFKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKKworZG5sIE9uIHNvbWUgU0NPIG1hY2hpbmVzIHN5cy9zZWxlY3QgcmVkZWZpbmVzIHN0cnVjdCB0aW1ldmFsCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3lzL3NlbGVjdC5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkXSkKK0FDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD5dLCAsCisJICBBQ19NU0dfUkVTVUxUKHllcykKKwkJCUFDX0RFRklORShTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUpLAorCSAgQUNfTVNHX1JFU1VMVChubykpCisKK2RubCBBQ19ERUNMX1NZU19TSUdMSVNUCisKK2RubCBDaGVja3MgZm9yIHB0eS5jIChjb3BpZWQgZnJvbSBzY3JlZW4pID09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvcHRjKQoraWYgdGVzdCAtciAvZGV2L3B0YzsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9ERVZfUFRDKQorICBBQ19NU0dfUkVTVUxUKHllcykKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3IgU1ZSNCBwdHlzKQoraWYgdGVzdCAtYyAvZGV2L3B0bXggOyB0aGVuCisgIEFDX1RSWV9MSU5LKFtdLCBbcHRzbmFtZSgwKTtncmFudHB0KDApO3VubG9ja3B0KDApO10sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9TVlI0X1BUWVMpLAorCUFDX01TR19SRVNVTFQobm8pKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBwdHlyYW5nZXMpCitpZiB0ZXN0IC1kIC9kZXYvcHR5bSA7IHRoZW4KKyAgcGRpcj0nL2Rldi9wdHltJworZWxzZQorICBwZGlyPScvZGV2JworZmkKK2RubCBTQ08gdXNlcyBwdHlwJWQKK0FDX0VHUkVQX0NQUCh5ZXMsCitbI2lmZGVmIE1fVU5JWAorICAgeWVzOworI2VuZGlmCisJXSwgcHR5cz1gZWNobyAvZGV2L3B0eXA/P2AsIHB0eXM9YGVjaG8gJHBkaXIvcHR5Pz9gKQorZG5sIGlmIHRlc3QgLWMgL2Rldi9wdHlwMTk7IHRoZW4KK2RubCBwdHlzPWBlY2hvIC9kZXYvcHR5cD8/YAorZG5sIGVsc2UKK2RubCBwdHlzPWBlY2hvICRwZGlyL3B0eT8/YAorZG5sIGZpCitpZiB0ZXN0ICIkcHR5cyIgIT0gIiRwZGlyL3B0eT8/IiA7IHRoZW4KKyAgcDA9YGVjaG8gJHB0eXMgfCB0ciAnICcgJ1wwMTInIHwgc2VkIC1lICdzL14uKlwoLlwpLiQvXDEvZycgfCBzb3J0IC11IHwgdHIgLWQgJ1wwMTInYAorICBwMT1gZWNobyAkcHR5cyB8IHRyICcgJyAnXDAxMicgfCBzZWQgLWUgJ3MvXi4qXCguXCkkL1wxL2cnICB8IHNvcnQgLXUgfCB0ciAtZCAnXDAxMidgCisgIEFDX0RFRklORV9VTlFVT1RFRChQVFlSQU5HRTAsIiRwMCIpCisgIEFDX0RFRklORV9VTlFVT1RFRChQVFlSQU5HRTEsIiRwMSIpCisgIEFDX01TR19SRVNVTFQoWyRwMCAvICRwMV0pCitlbHNlCisgIEFDX01TR19SRVNVTFQoW2Rvbid0IGtub3ddKQorZmkKKworZG5sICAgICoqKiogIHB0eSBtb2RlL2dyb3VwIGhhbmRsaW5nICoqKioKK2RubAorZG5sIHN1cHBvcnQgcHJvdmlkZWQgYnkgTHVrZSBNZXdidXJuIDxsbUBybWl0LmVkdS5hdT4sIDkzMTIyMgorQUNfTVNHX0NIRUNLSU5HKGRlZmF1bHQgdHR5IHBlcm1pc3Npb25zL2dyb3VwKQorcm0gLWYgY29uZnRlc3RfZ3JwCitBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CittYWluKCkKK3sKKyAgc3RydWN0IHN0YXQgc2I7CisgIGNoYXIgKngsKnR0eW5hbWUoKTsKKyAgaW50IG9tLCBtOworICBGSUxFICpmcDsKKworICBpZiAoISh4ID0gdHR5bmFtZSgwKSkpIGV4aXQoMSk7CisgIGlmIChzdGF0KHgsICZzYikpIGV4aXQoMSk7CisgIG9tID0gc2Iuc3RfbW9kZTsKKyAgaWYgKG9tICYgMDAyKSBleGl0KDApOworICBtID0gc3lzdGVtKCJtZXNnIHkiKTsKKyAgaWYgKG0gPT0gLTEgfHwgbSA9PSAxMjcpIGV4aXQoMSk7CisgIGlmIChzdGF0KHgsICZzYikpIGV4aXQoMSk7CisgIG0gPSBzYi5zdF9tb2RlOworICBpZiAoY2htb2QoeCwgb20pKSBleGl0KDEpOworICBpZiAobSAmIDAwMikgZXhpdCgwKTsKKyAgaWYgKHNiLnN0X2dpZCA9PSBnZXRnaWQoKSkgZXhpdCgxKTsKKyAgaWYgKCEoZnA9Zm9wZW4oImNvbmZ0ZXN0X2dycCIsICJ3IikpKQorICAgIGV4aXQoMSk7CisgIGZwcmludGYoZnAsICIlZFxuIiwgc2Iuc3RfZ2lkKTsKKyAgZmNsb3NlKGZwKTsKKyAgZXhpdCgwKTsKK30KK10sWworICAgIGlmIHRlc3QgLWYgY29uZnRlc3RfZ3JwOyB0aGVuCisJcHR5Z3JwPWBjYXQgY29uZnRlc3RfZ3JwYAorCUFDX01TR19SRVNVTFQoW3B0eSBtb2RlOiAwNjIwLCBncm91cDogJHB0eWdycF0pCisJQUNfREVGSU5FKFBUWU1PREUsIDA2MjApCisJQUNfREVGSU5FX1VOUVVPVEVEKFBUWUdST1VQLCRwdHlncnApCisgICAgZWxzZQorCUFDX01TR19SRVNVTFQoW3B0eXMgYXJlIHdvcmxkIGFjY2Vzc2FibGVdKQorICAgIGZpCitdLAorICAgIEFDX01TR19SRVNVTFQoW2Nhbid0IGRldGVybWluZSAtIGFzc3VtZSBwdHlzIGFyZSB3b3JsZCBhY2Nlc3NhYmxlXSksCisgICAgQUNfTVNHX0VSUk9SKGZhaWxlZCB0byBjb21waWxlIHRlc3QgcHJvZ3JhbSkpCitybSAtZiBjb25mdGVzdF9ncnAKKworZG5sIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FDX1RZUEVfU0lHTkFMCisKK2RubCBmaW5kIG91dCB3aGF0IHRvIHVzZSBhdCB0aGUgZW5kIG9mIGEgc2lnbmFsIGZ1bmN0aW9uCitpZiB0ZXN0ICRhY19jdl90eXBlX3NpZ25hbCA9IHZvaWQ7IHRoZW4KKyAgQUNfREVGSU5FKFNJR1JFVFVSTiwgW3JldHVybl0pCitlbHNlCisgIEFDX0RFRklORShTSUdSRVRVUk4sIFtyZXR1cm4gMF0pCitmaQorCitkbmwgY2hlY2sgaWYgc3RydWN0IHNpZ2NvbnRleHQgaXMgZGVmaW5lZCAodXNlZCBmb3IgU0dJIG9ubHkpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN0cnVjdCBzaWdjb250ZXh0KQorQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHNpZ25hbC5oPgordGVzdF9zaWcoKQoreworICAgIHN0cnVjdCBzaWdjb250ZXh0ICpzY29udDsKKyAgICBzY29udCA9IChzdHJ1Y3Qgc2lnY29udGV4dCAqKTA7CisgICAgcmV0dXJuIDE7Cit9IF0sICwKKwkgIEFDX01TR19SRVNVTFQoeWVzKQorCQlBQ19ERUZJTkUoSEFWRV9TSUdDT05URVhUKSwKKwkgIEFDX01TR19SRVNVTFQobm8pKQorCitkbmwgdHJpY2t5IHN0dWZmOiB0cnkgdG8gZmluZCBvdXQgaWYgZ2V0Y3dkKCkgaXMgaW1wbGVtZW50ZWQgd2l0aAorZG5sIHN5c3RlbSgic2ggLWMgcHdkIikKK0FDX01TR19DSEVDS0lORyhnZXRjd2QgaW1wbGVtZW50YXRpb24pCitBQ19UUllfUlVOKFsKK2NoYXIgKmRhZ2dlcltdID0geyAiSUZTPXB3ZCIsIDAgfTsKK21haW4oKQoreworICBjaGFyIGJ1ZmZlcls1MDBdOworICBleHRlcm4gY2hhciAqKmVudmlyb247CisgIGVudmlyb24gPSBkYWdnZXI7CisgIHJldHVybiBnZXRjd2QoYnVmZmVyLCA1MDApID8gMCA6IDE7Cit9XSwKKwlBQ19NU0dfUkVTVUxUKGl0IGlzIHVzYWJsZSksCisJQUNfTVNHX1JFU1VMVChpdCBzdGlua3MpCisJCUFDX0RFRklORShCQURfR0VUQ1dEKSwKKwlBQ19NU0dfRVJST1IoZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtKSkKKworZG5sIENoZWNrIGZvciBmdW5jdGlvbnMgaW4gb25lIGJpZyBjYWxsLCB0byByZWR1Y2UgdGhlIHNpemUgb2YgY29uZmlndXJlCitBQ19DSEVDS19GVU5DUyhiY21wIGZjaGRpciBmY2hvd24gZnNlZWtvIGZzeW5jIGZ0ZWxsbyBnZXRjd2QgZ2V0cHNldWRvdHR5IFwKKwlnZXRwd25hbSBnZXRwd3VpZCBnZXRybGltaXQgZ2V0dGltZW9mZGF5IGdldHdkIGxzdGF0IG1lbWNtcCBcCisJbWVtc2V0IG5hbm9zbGVlcCBvcGVuZGlyIHB1dGVudiBxc29ydCByZWFkbGluayBzZWxlY3Qgc2V0ZW52IFwKKwlzZXRwZ2lkIHNldHNpZCBzaWdhbHRzdGFjayBzaWdzdGFjayBzaWdzZXQgc2lnc2V0am1wIHNpZ2FjdGlvbiBcCisJc2lndmVjIHNucHJpbnRmIHN0cmNhc2VjbXAgc3RyZXJyb3Igc3RyZnRpbWUgc3RyaWNtcCBzdHJuY2FzZWNtcCBcCisJc3RybmljbXAgc3RycGJyayBzdHJ0b2wgdGdldGVudCB0b3dsb3dlciB0b3d1cHBlciB1c2xlZXAgdXRpbWUgdXRpbWVzKQorCitkbmwgZnN0YXRmcygpIGNhbiB0YWtlIDIgdG8gNCBhcmd1bWVudHMsIHRyeSB0byB1c2Ugc3RfYmxrc2l6ZSBpZiBwb3NzaWJsZQorQUNfTVNHX0NIRUNLSU5HKGZvciBzdF9ibGtzaXplKQorQUNfVFJZX0NPTVBJTEUoCitbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+XSwKK1sJc3RydWN0IHN0YXQgc3Q7CisJaW50IG47CisKKwlzdGF0KCIvIiwgJnN0KTsKKwluID0gKGludClzdC5zdF9ibGtzaXplO10sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9TVF9CTEtTSVpFKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgc3RhdCgpIGlnbm9yZXMgYSB0cmFpbGluZyBzbGFzaCkKK0FDX1RSWV9SVU4oCitbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CittYWluKCkge3N0cnVjdCBzdGF0IHN0OyAgZXhpdChzdGF0KCJjb25maWd1cmUvIiwgJnN0KSAhPSAwKTsgfV0sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoU1RBVF9JR05PUkVTX1NMQVNIKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSwgQUNfTVNHX0VSUk9SKGZhaWxlZCB0byBjb21waWxlIHRlc3QgcHJvZ3JhbSkpCisKK2RubCBMaW5rIHdpdGggaWNvbnYgZm9yIGNoYXJzZXQgdHJhbnNsYXRpb24sIGlmIG5vdCBmb3VuZCB3aXRob3V0IGxpYnJhcnkuCitkbmwgY2hlY2sgZm9yIGljb252KCkgcmVxdWlyZXMgaW5jbHVkaW5nIGljb252LmgKK2RubCBBZGQgIi1saWNvbnYiIHdoZW4gcG9zc2libGU7IFNvbGFyaXMgaGFzIGljb252IGJ1dCB1c2UgR05VIGljb252IHdoZW4gaXQKK2RubCBoYXMgYmVlbiBpbnN0YWxsZWQuCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGljb252X29wZW4oKSkKK3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSIkTElCUyAtbGljb252IgorQUNfVFJZX0xJTksoWworI2lmZGVmIEhBVkVfSUNPTlZfSAorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisgICAgXSwgW2ljb252X29wZW4oImZyIiwgInRvIik7XSwKKyAgICBBQ19NU0dfUkVTVUxUKHllczsgd2l0aCAtbGljb252KTsgQUNfREVGSU5FKEhBVkVfSUNPTlYpLAorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgQUNfVFJZX0xJTksoWworI2lmZGVmIEhBVkVfSUNPTlZfSAorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisJXSwgW2ljb252X29wZW4oImZyIiwgInRvIik7XSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX0lDT05WKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkpCisKKworQUNfTVNHX0NIRUNLSU5HKGZvciBubF9sYW5naW5mbyhDT0RFU0VUKSkKK0FDX1RSWV9MSU5LKFsKKyNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKKyMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyNlbmRpZgorXSwgW2NoYXIgKmNzID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7XSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX05MX0xBTkdJTkZPX0NPREVTRVQpLAorCUFDX01TR19SRVNVTFQobm8pKQorCitkbmwgTGluayB3aXRoIC1scG9zaXgxZSBmb3IgQUNMIHN0dWZmOyBpZiBub3QgZm91bmQsIHRyeSAtbGFjbCBmb3IgU0dJCitkbmwgd2hlbiAtbGFjbCB3b3JrcywgYWxzbyB0cnkgdG8gdXNlIC1sYXR0ciAocmVxdWlyZWQgZm9yIERlYmlhbikuCitBQ19NU0dfQ0hFQ0tJTkcoLS1kaXNhYmxlLWFjbCBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUoYWNsLAorCVsgIC0tZGlzYWJsZS1hY2wgICAgICAgICAgIERvbid0IGNoZWNrIGZvciBBQ0wgc3VwcG9ydC5dLAorCSwgW2VuYWJsZV9hY2w9InllcyJdKQoraWYgdGVzdCAiJGVuYWJsZV9hY2wiID0gInllcyI7IHRoZW4KK0FDX01TR19SRVNVTFQobm8pCitBQ19DSEVDS19MSUIocG9zaXgxZSwgYWNsX2dldF9maWxlLCBbTElCUz0iJExJQlMgLWxwb3NpeDFlIl0sCisJQUNfQ0hFQ0tfTElCKGFjbCwgYWNsX2dldF9maWxlLCBbTElCUz0iJExJQlMgLWxhY2wiCisJCSAgQUNfQ0hFQ0tfTElCKGF0dHIsIGZnZXR4YXR0ciwgTElCUz0iJExJQlMgLWxhdHRyIiwsKV0sLCksKQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIFBPU0lYIEFDTCBzdXBwb3J0KQorQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX0FDTF9ICisjIGluY2x1ZGUgPHN5cy9hY2wuaD4KKyNlbmRpZgorYWNsX3QgYWNsO10sIFthY2wgPSBhY2xfZ2V0X2ZpbGUoImZvbyIsIEFDTF9UWVBFX0FDQ0VTUyk7CisJYWNsX3NldF9maWxlKCJmb28iLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CisJYWNsX2ZyZWUoYWNsKTtdLAorCUFDX01TR19SRVNVTFQoeWVzKTsgQUNfREVGSU5FKEhBVkVfUE9TSVhfQUNMKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBTb2xhcmlzIEFDTCBzdXBwb3J0KQorQUNfVFJZX0xJTksoWworI2lmZGVmIEhBVkVfU1lTX0FDTF9ICisjIGluY2x1ZGUgPHN5cy9hY2wuaD4KKyNlbmRpZl0sIFthY2woImZvbyIsIEdFVEFDTENOVCwgMCwgTlVMTCk7CisJXSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX1NPTEFSSVNfQUNMKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBBSVggQUNMIHN1cHBvcnQpCitBQ19UUllfTElOSyhbCisjaWZkZWYgSEFWRV9TWVNfQUNMX0gKKyMgaW5jbHVkZSA8c3lzL2FjbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQUNDRVNTX0gKKyMgaW5jbHVkZSA8c3lzL2FjY2Vzcy5oPgorI2VuZGlmCisjZGVmaW5lIF9BTExfU09VUkNFCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitpbnQgYWNsc2l6ZTsKK3N0cnVjdCBhY2wgKmFjbGVudDtdLCBbYWNsc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWNsKTsKKwlhY2xlbnQgPSAodm9pZCAqKW1hbGxvYyhhY2xzaXplKTsKKwlzdGF0YWNsKCJmb28iLCBTVFhfTk9STUFMLCBhY2xlbnQsIGFjbHNpemUpOworCV0sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9BSVhfQUNMKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVCh5ZXMpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoLS1kaXNhYmxlLWdwbSBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUoZ3BtLAorCVsgIC0tZGlzYWJsZS1ncG0gICAgICAgICAgIERvbid0IHVzZSBncG0gKExpbnV4IG1vdXNlIGRhZW1vbikuXSwgLAorCVtlbmFibGVfZ3BtPSJ5ZXMiXSkKKworaWYgdGVzdCAiJGVuYWJsZV9ncG0iID0gInllcyI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChubykKKyAgZG5sIENoZWNraW5nIGlmIGdwbSBzdXBwb3J0IGNhbiBiZSBjb21waWxlZAorICBBQ19DQUNIRV9DSEVDSyhbZm9yIGdwbV0sIHZpX2N2X2hhdmVfZ3BtLAorCVtvbGlicz0iJExJQlMiIDsgTElCUz0iLWxncG0iXQorCUFDX1RSWV9MSU5LKAorCSAgICBbI2luY2x1ZGUgPGdwbS5oPgorCSAgICAjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD5dLAorCSAgICBbR3BtX0dldExpYlZlcnNpb24oTlVMTCk7XSwKKwkgICAgZG5sIENvbmZpZ3VyZSBkZWZpbmVzIEhBVkVfR1BNLCBpZiBpdCBpcyBkZWZpbmVkIGZlYXR1cmUuaCBkZWZpbmVzCisJICAgIGRubCBGRUFUX01PVVNFX0dQTSBpZiBtb3VzZSBzdXBwb3J0IGlzIGluY2x1ZGVkCisJICAgIFt2aV9jdl9oYXZlX2dwbT15ZXNdLAorCSAgICBbdmlfY3ZfaGF2ZV9ncG09bm9dKQorCVtMSUJTPSIkb2xpYnMiXQorICAgICkKKyAgaWYgdGVzdCAkdmlfY3ZfaGF2ZV9ncG0gPSB5ZXM7IHRoZW4KKyAgICBMSUJTPSIkTElCUyAtbGdwbSIKKyAgICBBQ19ERUZJTkUoSEFWRV9HUE0pCisgIGZpCitlbHNlCisgIEFDX01TR19SRVNVTFQoeWVzKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKGZvciB2c25wcmludGYoKSkKK0FDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisJLyogQ2hlY2sgdXNlIG9mIHZzbnByaW50ZigpICovCisJdm9pZCB3YXJuKGNoYXIgKmZtdCwgLi4uKTsKKwl2b2lkIHdhcm4oY2hhciAqZm10LCAuLi4pCisJeworCSAgdmFfbGlzdCBhcDsgY2hhciBidWZbMjBdOworCSAgdmFfc3RhcnQoYXAsIGZtdCk7CisJICB2c25wcmludGYoYnVmLCAyMCwgZm10LCBhcCk7CisJICB2YV9lbmQoYXApOworCX0KKwltYWluKCkKKwl7CisJd2FybigidGVzdGluZyAlc1xuIiwgImEgdmVyeSBsb25nIHN0cmluZyB0aGF0IHdvbid0IGZpdCIpOworCWV4aXQoMCk7CisJfQorCSAgICBdLAorCUFDX0RFRklORShIQVZFX1ZTTlBSSU5URikgQUNfTVNHX1JFU1VMVCh5ZXMpLAorCUFDX01TR19SRVNVTFQobm8pLAorCUFDX01TR19FUlJPUihmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0pKQorCisKK2RubCByZW5hbWUgbmVlZHMgdG8gYmUgY2hlY2tlZCBzZXBhcmF0ZWx5IHRvIHdvcmsgb24gTmV4dHN0ZXAgd2l0aCBjYworQUNfTVNHX0NIRUNLSU5HKGZvciByZW5hbWUpCitBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGlvLmg+XSwgW3JlbmFtZSgidGhpcyIsICJ0aGF0IildLAorCUFDX01TR19SRVNVTFQoeWVzKTsgQUNfREVGSU5FKEhBVkVfUkVOQU1FKSwKKwlBQ19NU0dfUkVTVUxUKG5vKSkKKworZG5sIHN5c2N0bCgpIG1heSBleGlzdCBidXQgbm90IHRoZSBhcmd1bWVudHMgd2UgdXNlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN5c2N0bCkKK0FDX1RSWV9DT01QSUxFKAorWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+XSwKK1sJaW50IG1pYlsyXSwgcjsKKwlzaXplX3QgbGVuOworCisJbWliWzBdID0gQ1RMX0hXOworCW1pYlsxXSA9IEhXX1VTRVJNRU07CisJbGVuID0gc2l6ZW9mKHIpOworCSh2b2lkKXN5c2N0bChtaWIsIDIsICZyLCAmbGVuLCAodm9pZCAqKTAsIChzaXplX3QpMCk7CisJXSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX1NZU0NUTCksCisJQUNfTVNHX1JFU1VMVChub3QgdXNhYmxlKSkKKworZG5sIHN5c2luZm8oKSBtYXkgZXhpc3QgYnV0IG5vdCBiZSBMaW51eCBjb21wYXRpYmxlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN5c2luZm8pCitBQ19UUllfQ09NUElMRSgKK1sjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2luZm8uaD5dLAorWwlzdHJ1Y3Qgc3lzaW5mbyBzaW5mbzsKKwlpbnQgdDsKKworCSh2b2lkKXN5c2luZm8oJnNpbmZvKTsKKwl0ID0gc2luZm8udG90YWxyYW07CisJXSwKKwlBQ19NU0dfUkVTVUxUKHllcyk7IEFDX0RFRklORShIQVZFX1NZU0lORk8pLAorCUFDX01TR19SRVNVTFQobm90IHVzYWJsZSkpCisKK2RubCBzeXNjb25mKCkgbWF5IGV4aXN0IGJ1dCBub3Qgc3VwcG9ydCB3aGF0IHdlIHdhbnQgdG8gdXNlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN5c2NvbmYpCitBQ19UUllfQ09NUElMRSgKK1sjaW5jbHVkZSA8dW5pc3RkLmg+XSwKK1sJKHZvaWQpc3lzY29uZihfU0NfUEFHRVNJWkUpOworCSh2b2lkKXN5c2NvbmYoX1NDX1BIWVNfUEFHRVMpOworCV0sCisJQUNfTVNHX1JFU1VMVCh5ZXMpOyBBQ19ERUZJTkUoSEFWRV9TWVNDT05GKSwKKwlBQ19NU0dfUkVTVUxUKG5vdCB1c2FibGUpKQorCitkbmwgT3VyIG93biB2ZXJzaW9uIG9mIEFDX0NIRUNLX1NJWkVPRihpbnQpOyBmaXhlcyBhIGJ1ZyB3aGVuIHNpemVvZigpIGNhbid0CitkbmwgYmUgcHJpbnRlZCB3aXRoICIlZCIsIGFuZCBhdm9pZHMgYSB3YXJuaW5nIGZvciBjcm9zcy1jb21waWxpbmcuCisKK0FDX01TR19DSEVDS0lORyhzaXplIG9mIGludCkKK0FDX0NBQ0hFX1ZBTChhY19jdl9zaXplb2ZfaW50LAorCVtBQ19UUllfUlVOKFsjaW5jbHVkZSA8c3RkaW8uaD4KKwkJbWFpbigpCisJCXsKKwkJICBGSUxFICpmPWZvcGVuKCJjb25mdGVzdHZhbCIsICJ3Iik7CisJCSAgaWYgKCFmKSBleGl0KDEpOworCQkgIGZwcmludGYoZiwgIiVkXG4iLCAoaW50KXNpemVvZihpbnQpKTsKKwkJICBleGl0KDApOworCQl9XSwKKwkgICAgYWNfY3Zfc2l6ZW9mX2ludD1gY2F0IGNvbmZ0ZXN0dmFsYCwKKwkgICAgYWNfY3Zfc2l6ZW9mX2ludD0wLAorCSAgICBBQ19NU0dfRVJST1IoZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtKSldKQorQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc2l6ZW9mX2ludCkKK0FDX0RFRklORV9VTlFVT1RFRChTSVpFT0ZfSU5ULCAkYWNfY3Zfc2l6ZW9mX2ludCkKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbWVtbW92ZS9iY29weS9tZW1jcHkgaGFuZGxlIG92ZXJsYXBzKQorW2Jjb3B5X3Rlc3RfcHJvZz0nCittYWluKCkgeworICBjaGFyIGJ1ZlsxMF07CisgIHN0cmNweShidWYsICJhYmNkZWZnaGkiKTsKKyAgbWNoX21lbW1vdmUoYnVmLCBidWYgKyAyLCAzKTsKKyAgaWYgKHN0cm5jbXAoYnVmLCAiYWJhYmNmIiwgNikpCisgICAgZXhpdCgxKTsKKyAgc3RyY3B5KGJ1ZiwgImFiY2RlZmdoaSIpOworICBtY2hfbWVtbW92ZShidWYgKyAyLCBidWYsIDMpOworICBpZiAoc3RybmNtcChidWYsICJjZGVkZWYiLCA2KSkKKyAgICBleGl0KDEpOworICBleGl0KDApOyAvKiBsaWJjIHZlcnNpb24gd29ya3MgcHJvcGVybHkuICAqLworfSddCisKK2RubCBDaGVjayBmb3IgbWVtbW92ZSgpIGJlZm9yZSBiY29weSgpLCBtYWtlcyBtZW1tb3ZlKCkgYmUgdXNlZCB3aGVuIGJvdGggYXJlCitkbmwgcHJlc2VudCwgZml4ZXMgcHJvYmxlbSB3aXRoIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIFNvbGFyaXMgMi40IGFuZCAyLjUuCisKK0FDX1RSWV9SVU4oWyNkZWZpbmUgbWNoX21lbW1vdmUocyxkLGwpIG1lbW1vdmUoZCxzLGwpICRiY29weV90ZXN0X3Byb2ddLAorICAgIEFDX0RFRklORShVU0VNRU1NT1ZFKSBBQ19NU0dfUkVTVUxUKG1lbW1vdmUgZG9lcyksCisgICAgQUNfVFJZX1JVTihbI2RlZmluZSBtY2hfbWVtbW92ZShzLGQsbCkgYmNvcHkoZCxzLGwpICRiY29weV90ZXN0X3Byb2ddLAorCUFDX0RFRklORShVU0VCQ09QWSkgQUNfTVNHX1JFU1VMVChiY29weSBkb2VzKSwKKwlBQ19UUllfUlVOKFsjZGVmaW5lIG1jaF9tZW1tb3ZlKHMsZCxsKSBtZW1jcHkoZCxzLGwpICRiY29weV90ZXN0X3Byb2ddLAorCSAgICBBQ19ERUZJTkUoVVNFTUVNQ1BZKSBBQ19NU0dfUkVTVUxUKG1lbWNweSBkb2VzKSwgQUNfTVNHX1JFU1VMVChubyksCisJICAgIEFDX01TR19FUlJPUihmYWlsZWQgdG8gY29tcGlsZSB0ZXN0IHByb2dyYW0pKSwKKwlBQ19NU0dfRVJST1IoZmFpbGVkIHRvIGNvbXBpbGUgdGVzdCBwcm9ncmFtKSksCisgICAgQUNfTVNHX0VSUk9SKGZhaWxlZCB0byBjb21waWxlIHRlc3QgcHJvZ3JhbSkpCisKK2RubCBDaGVjayBmb3IgbXVsdGlieXRlIGxvY2FsZSBmdW5jdGlvbnMKK2RubCBGaW5kIG91dCBpZiBfWHNldGxvY2FsZSgpIGlzIHN1cHBvcnRlZCBieSBsaWJYMTEuCitkbmwgQ2hlY2sgaWYgWF9MT0NBTEUgc2hvdWxkIGJlIGRlZmluZWQuCisKK2lmIHRlc3QgIiRlbmFibGVfbXVsdGlieXRlIiA9ICJ5ZXMiOyB0aGVuCisgIGNmbGFnc19zYXZlPSRDRkxBR1MKKyAgbGRmbGFnc19zYXZlPSRMREZMQUdTCisgIGlmIHRlc3QgLW4gIiR4X2luY2x1ZGVzIiA7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLUkkeF9pbmNsdWRlcyIKKyAgICBMREZMQUdTPSIkWF9MSUJTICRMREZMQUdTIC1sWDExIgorICAgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIFhfTE9DQUxFIG5lZWRlZCkKKyAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPFgxMS9YbG9jYWxlLmg+XSwsCisJQUNfVFJZX0xJTktfRlVOQyhbX1hzZXRsb2NhbGVdLCBbQUNfTVNHX1JFU1VMVCh5ZXMpCisJCUFDX0RFRklORShYX0xPQ0FMRSldLCBBQ19NU0dfUkVTVUxUKG5vKSksCisJQUNfTVNHX1JFU1VMVChubykpCisgIGZpCisgIENGTEFHUz0kY2ZsYWdzX3NhdmUKKyAgTERGTEFHUz0kbGRmbGFnc19zYXZlCitmaQorCitkbmwgTGluayB3aXRoIHhwZzQsIGl0IGlzIHNhaWQgdG8gbWFrZSBLb3JlYW4gbG9jYWxlIHdvcmtpbmcKK0FDX0NIRUNLX0xJQih4cGc0LCBfeHBnNF9zZXRydW5lbG9jYWxlLCBbTElCUz0iJExJQlMgLWx4cGc0Il0sLCkKKworZG5sIENoZWNrIGhvdyB3ZSBjYW4gcnVuIGN0YWdzCitkbmwgLS12ZXJzaW9uIGZvciBFeHViZXJhbnQgY3RhZ3MgKHByZWZlcnJlZCkKK2RubCAtdCBmb3IgdHlwZWRlZnMgKG1hbnkgY3RhZ3MgaGF2ZSB0aGlzKQorZG5sIC1zIGZvciBzdGF0aWMgZnVuY3Rpb25zIChFbHZpcyBjdGFncyBvbmx5PykKK2RubCAtdiBmb3IgdmFyaWFibGVzLiBEYW5nZXJvdXMsIG1vc3QgY3RhZ3MgdGFrZSB0aGlzIGZvciAndmdyaW5kIHN0eWxlJy4KK2RubCAtaSttIHRvIHRlc3QgZm9yIG9sZGVyIEV4dWJlcmFudCBjdGFncworQUNfTVNHX0NIRUNLSU5HKGhvdyB0byBjcmVhdGUgdGFncykKK3Rlc3QgLWYgdGFncyAmJiBtdiB0YWdzIHRhZ3Muc2F2ZQoraWYgKGV2YWwgY3RhZ3MgLS12ZXJzaW9uIC9kZXYvbnVsbCB8IGdyZXAgRXh1YmVyYW50KSA8IC9kZXYvbnVsbCAxPiZBQ19GRF9DQyAyPiYxOyB0aGVuCisgIFRBR1BSRz0iY3RhZ3MiCitlbHNlCisgIChldmFsIGV0YWdzCSAgIC9kZXYvbnVsbCkgPCAvZGV2L251bGwgMT4mQUNfRkRfQ0MgMj4mMSAmJiBUQUdQUkc9ImV0YWdzIgorICAoZXZhbCBldGFncyAtYyAgIC9kZXYvbnVsbCkgPCAvZGV2L251bGwgMT4mQUNfRkRfQ0MgMj4mMSAmJiBUQUdQUkc9ImV0YWdzIC1jIgorICAoZXZhbCBjdGFncwkgICAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JkFDX0ZEX0NDIDI+JjEgJiYgVEFHUFJHPSJjdGFncyIKKyAgKGV2YWwgY3RhZ3MgLXQgICAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JkFDX0ZEX0NDIDI+JjEgJiYgVEFHUFJHPSJjdGFncyAtdCIKKyAgKGV2YWwgY3RhZ3MgLXRzICAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JkFDX0ZEX0NDIDI+JjEgJiYgVEFHUFJHPSJjdGFncyAtdHMiCisgIChldmFsIGN0YWdzIC10dnMgL2Rldi9udWxsKSA8IC9kZXYvbnVsbCAxPiZBQ19GRF9DQyAyPiYxICYmIFRBR1BSRz0iY3RhZ3MgLXR2cyIKKyAgKGV2YWwgY3RhZ3MgLWkrbSAvZGV2L251bGwpIDwgL2Rldi9udWxsIDE+JkFDX0ZEX0NDIDI+JjEgJiYgVEFHUFJHPSJjdGFncyAtaSttIgorZmkKK3Rlc3QgLWYgdGFncy5zYXZlICYmIG12IHRhZ3Muc2F2ZSB0YWdzCitBQ19NU0dfUkVTVUxUKCRUQUdQUkcpIEFDX1NVQlNUKFRBR1BSRykKKworZG5sIENoZWNrIGhvdyB3ZSBjYW4gcnVuIG1hbiB3aXRoIGEgc2VjdGlvbiBudW1iZXIKK0FDX01TR19DSEVDS0lORyhob3cgdG8gcnVuIG1hbiB3aXRoIGEgc2VjdGlvbiBucikKK01BTkRFRj0ibWFuIgorKGV2YWwgbWFuIC1zIDIgcmVhZCkgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mQUNfRkRfQ0MgJiYgTUFOREVGPSJtYW4gLXMiCitBQ19NU0dfUkVTVUxUKCRNQU5ERUYpCitpZiB0ZXN0ICIkTUFOREVGIiA9ICJtYW4gLXMiOyB0aGVuCisgIEFDX0RFRklORShVU0VNQU5fUykKK2ZpCisKK2RubCBDaGVjayBpZiBnZXR0ZXh0KCkgaXMgd29ya2luZyBhbmQgaWYgaXQgbmVlZHMgLWxpbnRsCitBQ19NU0dfQ0hFQ0tJTkcoLS1kaXNhYmxlLW5scyBhcmd1bWVudCkKK0FDX0FSR19FTkFCTEUobmxzLAorCVsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIERvbid0IHN1cHBvcnQgTkxTIChnZXR0ZXh0KCkpLl0sICwKKwlbZW5hYmxlX25scz0ieWVzIl0pCisKK2lmIHRlc3QgIiRlbmFibGVfbmxzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQobm8pCisgIEFDX0NIRUNLX1BST0coTVNHRk1ULCBtc2dmbXQsIG1zZ2ZtdCwgKQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBOTFNdKQorICBpZiB0ZXN0IC1mIHBvL01ha2VmaWxlOyB0aGVuCisgICAgaGF2ZV9nZXR0ZXh0PSJubyIKKyAgICBpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICAgICAgQUNfVFJZX0xJTksoCisJWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwKKwlbZ2V0dGV4dCgiVGVzdCIpO10sCisJQUNfTVNHX1JFU1VMVChbZ2V0dGV4dCgpIHdvcmtzXSk7IGhhdmVfZ2V0dGV4dD0ieWVzIiwKKwkgIG9saWJzPSRMSUJTCisJICBMSUJTPSIkTElCUyAtbGludGwiCisJICBBQ19UUllfTElOSygKKwkgICAgICBbI2luY2x1ZGUgPGxpYmludGwuaD5dLAorCSAgICAgIFtnZXR0ZXh0KCJUZXN0Iik7XSwKKwkgICAgICBBQ19NU0dfUkVTVUxUKFtnZXR0ZXh0KCkgd29ya3Mgd2l0aCAtbGludGxdKTsgaGF2ZV9nZXR0ZXh0PSJ5ZXMiLAorCSAgICAgIEFDX01TR19SRVNVTFQoW2dldHRleHQoKSBkb2Vzbid0IHdvcmtdKTsKKwkgICAgICBMSUJTPSRvbGlicykpCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbXNnZm10IG5vdCBmb3VuZCAtIGRpc2FibGVkXSk7CisgICAgZmkKKyAgICBpZiB0ZXN0ICRoYXZlX2dldHRleHQgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCkKKyAgICAgIE1BS0VNTz15ZXMKKyAgICAgIEFDX1NVQlNUKE1BS0VNTykKKyAgICAgIGRubCB0aGlzIHdhcyBhZGRlZCBpbiBHTlUgZ2V0dGV4dCAwLjEwLjM2CisgICAgICBBQ19DSEVDS19GVU5DUyhiaW5kX3RleHRkb21haW5fY29kZXNldCkKKyAgICAgIGRubCBfbmxfbXNnX2NhdF9jbnRyIGlzIHJlcXVpcmVkIGZvciBHTlUgZ2V0dGV4dAorICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgX25sX21zZ19jYXRfY250cl0pCisgICAgICBBQ19UUllfTElOSygKKwkJWyNpbmNsdWRlIDxsaWJpbnRsLmg+CisJCWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjtdLAorCQlbKytfbmxfbXNnX2NhdF9jbnRyO10sCisJCUFDX01TR19SRVNVTFQoW3llc10pOyBBQ19ERUZJTkUoSEFWRV9OTF9NU0dfQ0FUX0NOVFIpLAorCQlBQ19NU0dfUkVTVUxUKFtub10pKQorICAgIGZpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtubyAicG8vTWFrZWZpbGUiIC0gZGlzYWJsZWRdKTsKKyAgZmkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVCh5ZXMpCitmaQorCitkbmwgQ2hlY2sgZm9yIGR5bmFtaWMgbGlua2luZyBsb2FkZXIKK0FDX0NIRUNLX0hFQURFUihkbGZjbi5oLCBETEw9ZGxmY24uaCwgW0FDX0NIRUNLX0hFQURFUihkbC5oLCBETEw9ZGwuaCldKQoraWYgdGVzdCB4JHtETEx9ID0geGRsZmNuLmg7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfRExGQ05fSCwgMSwgWyBEZWZpbmUgaWYgd2UgaGF2ZSBkbGZjbi5oLiBdKQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBkbG9wZW4oKV0pCisgIEFDX1RSWV9MSU5LKCxbCisJCWV4dGVybiB2b2lkKiBkbG9wZW4oKTsKKwkJZGxvcGVuKCk7CisgICAgICBdLAorICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpOworCSAgICAgIEFDX0RFRklORShIQVZFX0RMT1BFTiwgMSwgWyBEZWZpbmUgaWYgd2UgaGF2ZSBkbG9wZW4oKSBdKSwKKyAgICAgIEFDX01TR19SRVNVTFQobm8pOworCSAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGRsb3BlbigpIGluIC1sZGxdKQorCSAgICAgIG9saWJzPSRMSUJTCisJICAgICAgTElCUz0iJExJQlMgLWxkbCIKKwkgICAgICBBQ19UUllfTElOSygsWworCQkJCWV4dGVybiB2b2lkKiBkbG9wZW4oKTsKKwkJCQlkbG9wZW4oKTsKKwkJIF0sCisJCSBBQ19NU0dfUkVTVUxUKHllcyk7CisJCQkgIEFDX0RFRklORShIQVZFX0RMT1BFTiwgMSwgWyBEZWZpbmUgaWYgd2UgaGF2ZSBkbG9wZW4oKSBdKSwKKwkJIEFDX01TR19SRVNVTFQobm8pOworCQkJICBMSUJTPSRvbGlicykpCisgIGRubCBSZWxpYW50VU5JWCBoYXMgZGxvcGVuKCkgaW4gbGliYyBidXQgZXZlcnl0aGluZyBlbHNlIGluIGxpYmRsCisgIGRubCBpY2sgOi0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGRsc3ltKCldKQorICBBQ19UUllfTElOSygsWworCQlleHRlcm4gdm9pZCogZGxzeW0oKTsKKwkJZGxzeW0oKTsKKyAgICAgIF0sCisgICAgICBBQ19NU0dfUkVTVUxUKHllcyk7CisJICAgICAgQUNfREVGSU5FKEhBVkVfRExTWU0sIDEsIFsgRGVmaW5lIGlmIHdlIGhhdmUgZGxzeW0oKSBdKSwKKyAgICAgIEFDX01TR19SRVNVTFQobm8pOworCSAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGRsc3ltKCkgaW4gLWxkbF0pCisJICAgICAgb2xpYnM9JExJQlMKKwkgICAgICBMSUJTPSIkTElCUyAtbGRsIgorCSAgICAgIEFDX1RSWV9MSU5LKCxbCisJCQkJZXh0ZXJuIHZvaWQqIGRsc3ltKCk7CisJCQkJZGxzeW0oKTsKKwkJIF0sCisJCSBBQ19NU0dfUkVTVUxUKHllcyk7CisJCQkgIEFDX0RFRklORShIQVZFX0RMU1lNLCAxLCBbIERlZmluZSBpZiB3ZSBoYXZlIGRsc3ltKCkgXSksCisJCSBBQ19NU0dfUkVTVUxUKG5vKTsKKwkJCSAgTElCUz0kb2xpYnMpKQorZWxpZiB0ZXN0IHgke0RMTH0gPSB4ZGwuaDsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9ETF9ILCAxLCBbIERlZmluZSBpZiB3ZSBoYXZlIGRsLmguIF0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIHNobF9sb2FkKCldKQorICBBQ19UUllfTElOSygsWworCQlleHRlcm4gdm9pZCogc2hsX2xvYWQoKTsKKwkJc2hsX2xvYWQoKTsKKyAgICAgXSwKKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpOworCSAgQUNfREVGSU5FKEhBVkVfU0hMX0xPQUQsIDEsIFsgRGVmaW5lIGlmIHdlIGhhdmUgc2hsX2xvYWQoKSBdKSwKKyAgICAgQUNfTVNHX1JFU1VMVChubyk7CisJICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaGxfbG9hZCgpIGluIC1sZGxkXSkKKwkgIG9saWJzPSRMSUJTCisJICBMSUJTPSIkTElCUyAtbGRsZCIKKwkgIEFDX1RSWV9MSU5LKCxbCisJCQlleHRlcm4gdm9pZCogc2hsX2xvYWQoKTsKKwkJCXNobF9sb2FkKCk7CisJICAgICBdLAorCSAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpOworCQkgIEFDX0RFRklORShIQVZFX1NITF9MT0FELCAxLCBbIERlZmluZSBpZiB3ZSBoYXZlIHNobF9sb2FkKCkgXSksCisJICAgICBBQ19NU0dfUkVTVUxUKG5vKTsKKwkJICBMSUJTPSRvbGlicykpCitmaQorQUNfQ0hFQ0tfSEVBREVSUyhzZXRqbXAuaCkKKworaWYgdGVzdCAieCRNQUNPU1giID0gInh5ZXMiIC1hIC1uICIkUEVSTCI7IHRoZW4KKyAgZG5sIC1sZGwgbXVzdCBjb21lIGFmdGVyIER5bmFMb2FkZXIuYQorICBpZiBlY2hvICRMSUJTIHwgZ3JlcCAtZSAnLWxkbCcgPi9kZXYvbnVsbDsgdGhlbgorICAgIExJQlM9YGVjaG8gJExJQlMgfCBzZWQgcy8tbGRsLy9gCisgICAgUEVSTF9MSUJTPSIkUEVSTF9MSUJTIC1sZGwiCisgIGZpCitmaQorCitpZiB0ZXN0ICJ4JE1BQ09TWCIgPSAieHllcyIgJiYgdGVzdCAieCRDQVJCT04iID0gInh5ZXMiIFwKKwkmJiB0ZXN0ICJ4JEdVSVRZUEUiICE9ICJ4Q0FSQk9OR1VJIjsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBuZWVkIC1mcmFtZXdvcmsgQ2FyYm9uKQorICBkbmwgY2hlY2sgZm9yIE1BQ09TWCB3aXRob3V0IENhcmJvbiBHVUksIGJ1dCB3aXRoIEZFQVRfTUJZVEUKKyAgaWYgdGVzdCAieCRlbmFibGVfbXVsdGlieXRlIiA9ICJ4eWVzIiB8fCB0ZXN0ICJ4JGZlYXR1cmVzIiA9PSAieGJpZyIgXAorCXx8IHRlc3QgIngkZmVhdHVyZXMiID0gInhodWdlIjsgdGhlbgorICAgIExJQlM9IiRMSUJTIC1mcmFtZXdvcmsgQ2FyYm9uIgorICAgIEFDX01TR19SRVNVTFQoeWVzKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChubykKKyAgZmkKK2ZpCisKKworZG5sIHdyaXRlIG91dHB1dCBmaWxlcworQUNfT1VUUFVUKGF1dG8vY29uZmlnLm1rOmNvbmZpZy5tay5pbikKKworZG5sIHZpbTogc2V0IHN3PTIgdHc9NzggZm8rPWw6CmRpZmYgLS1naXQgYS9zcmMvZGVocXgucHkgYi9zcmMvZGVocXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5Y2VmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZWhxeC5weQpAQCAtMCwwICsxLDQwIEBACisjIFB5dGhvbiBzY3JpcHQgdG8gZ2V0IGJvdGggdGhlIGRhdGEgYW5kIHJlc291cmNlIGZvcmsgZnJvbSBhIEJpbkhleCBlbmNvZGVkCisjIGZpbGUuCisjIEF1dGhvcjogVGFybyBNdXJhb2thCisjIExhc3QgQ2hhbmdlOiAyMDAzIE9jdCAyNQorCitpbXBvcnQgc3lzCitpbXBvcnQgYmluaGV4CisKK2lucHV0ID0gc3lzLmFyZ3ZbMV0KK2NvbnYgPSBiaW5oZXguSGV4QmluKGlucHV0KQoraW5mbyA9IGNvbnYuRkluZm8KK291dCA9IGNvbnYuRk5hbWUKK291dF9kYXRhID0gb3V0CitvdXRfcnNyYyA9IG91dCArICcucnNyY2ZvcmsnCisjcHJpbnQgJ291dF9yc3JjPScgKyBvdXRfcnNyYworcHJpbnQgJ0luIGZpbGU6ICcgKyBpbnB1dAorCitvdXRmaWxlID0gb3BlbihvdXRfZGF0YSwgJ3diJykKK3ByaW50ICcgIE91dCBkYXRhIGZvcms6ICcgKyBvdXRfZGF0YQord2hpbGUgMToKKyAgICBkID0gY29udi5yZWFkKDEyODAwMCkKKyAgICBpZiBub3QgZDogYnJlYWsKKyAgICBvdXRmaWxlLndyaXRlKGQpCitvdXRmaWxlLmNsb3NlKCkKK2NvbnYuY2xvc2VfZGF0YSgpCisKK2QgPSBjb252LnJlYWRfcnNyYygxMjgwMDApCitpZiBkOgorICAgIHByaW50ICcgIE91dCByc3JjIGZvcms6ICcgKyBvdXRfcnNyYworICAgIG91dGZpbGUgPSBvcGVuKG91dF9yc3JjLCAnd2InKQorICAgIG91dGZpbGUud3JpdGUoZCkKKyAgICB3aGlsZSAxOgorICAgICAgICBkID0gY29udi5yZWFkX3JzcmMoMTI4MDAwKQorICAgICAgICBpZiBub3QgZDogYnJlYWsKKyAgICAgICAgb3V0ZmlsZS53cml0ZShkKQorICAgIG91dGZpbGUuY2xvc2UoKQorCitjb252LmNsb3NlKCkKKworIyB2aW06c2V0IHRzPTggc3RzPTQgc3c9NCBldDoKZGlmZiAtLWdpdCBhL3NyYy9kaWZmLmMgYi9zcmMvZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDU4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGlmZi5jCkBAIC0wLDAgKzEsMjIwOCBAQAorLyogdmltOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIGRpZmYuYzogY29kZSBmb3IgZGlmZidpbmcgdHdvIG9yIHRocmVlIGJ1ZmZlcnMuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChGRUFUX0RJRkYpIHx8IGRlZmluZWQoUFJPVE8pCisKKyNkZWZpbmUgREJfQ09VTlQgNAkvKiB1cCB0byBmb3VyIGJ1ZmZlcnMgY2FuIGJlIGRpZmYnZWQgKi8KKworLyoKKyAqIEVhY2ggZGlmZmJsb2NrIGRlZmluZXMgd2hlcmUgYSBibG9jayBvZiBsaW5lcyBzdGFydHMgaW4gZWFjaCBvZiB0aGUgYnVmZmVycworICogYW5kIGhvdyBtYW55IGxpbmVzIGl0IG9jY3VwaWVzIGluIHRoYXQgYnVmZmVyLiAgV2hlbiB0aGUgbGluZXMgYXJlIG1pc3NpbmcKKyAqIGluIHRoZSBidWZmZXIgdGhlIGRmX2NvdW50W10gaXMgemVyby4gIFRoaXMgaXMgYWxsIGNvdW50ZWQgaW4KKyAqIGJ1ZmZlciBsaW5lcy4KKyAqIFRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgdW5jaGFuZ2VkIGxpbmUgaW4gYmV0d2VlbiB0aGUgZGlmZnMuCisgKiBPdGhlcndpc2UgaXQgd291bGQgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIHRoZSBkaWZmIGFib3ZlIG9yIGJlbG93IGl0LgorICogZGZfbG51bVtdICsgZGZfY291bnRbXSBpcyB0aGUgbG51bSBiZWxvdyB0aGUgY2hhbmdlLiAgV2hlbiBpbiBvbmUgYnVmZmVyCisgKiBsaW5lcyBoYXZlIGJlZW4gaW5zZXJ0ZWQsIGluIHRoZSBvdGhlciBidWZmZXIgZGZfbG51bVtdIGlzIHRoZSBsaW5lIGJlbG93CisgKiB0aGUgaW5zZXJ0aW9uIGFuZCBkZl9jb3VudFtdIGlzIHplcm8uICBXaGVuIGFwcGVuZGluZyBsaW5lcyBhdCB0aGUgZW5kIG9mCisgKiB0aGUgYnVmZmVyLCBkZl9sbnVtW10gaXMgb25lIGJleW9uZCB0aGUgZW5kIQorICogVGhpcyBpcyB1c2luZyBhIGxpbmtlZCBsaXN0LCBiZWNhdXNlIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgaXMgZXhwZWN0ZWQKKyAqIHRvIGJlIHJlYXNvbmFibGUgc21hbGwuICBUaGUgbGlzdCBpcyBzb3J0ZWQgb24gbG51bS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGlmZmJsb2NrIGRpZmZfVDsKK3N0cnVjdCBkaWZmYmxvY2sKK3sKKyAgICBkaWZmX1QJKmRmX25leHQ7CisgICAgbGluZW5yX1QJZGZfbG51bVtEQl9DT1VOVF07CS8qIGxpbmUgbnVtYmVyIGluIGJ1ZmZlciAqLworICAgIGxpbmVucl9UCWRmX2NvdW50W0RCX0NPVU5UXTsJLyogbnIgb2YgaW5zZXJ0ZWQvY2hhbmdlZCBsaW5lcyAqLworfTsKKworc3RhdGljIGRpZmZfVAkqZmlyc3RfZGlmZiA9IE5VTEw7CisKK3N0YXRpYyBidWZfVAkqKGRpZmZidWZbREJfQ09VTlRdKTsKKworc3RhdGljIGludAlkaWZmX2ludmFsaWQgPSBUUlVFOwkvKiBsaXN0IG9mIGRpZmZzIGlzIG91dGRhdGVkICovCisKK3N0YXRpYyBpbnQJZGlmZl9idXN5ID0gRkFMU0U7CS8qIGV4X2RpZmZnZXRwdXQoKSBpcyBidXN5ICovCisKKy8qIGZsYWdzIG9idGFpbmVkIGZyb20gdGhlICdkaWZmb3B0JyBvcHRpb24gKi8KKyNkZWZpbmUgRElGRl9GSUxMRVIJMQkvKiBkaXNwbGF5IGZpbGxlciBsaW5lcyAqLworI2RlZmluZSBESUZGX0lDQVNFCTIJLyogaWdub3JlIGNhc2UgKi8KKyNkZWZpbmUgRElGRl9JV0hJVEUJNAkvKiBpZ25vcmUgY2hhbmdlIGluIHdoaXRlIHNwYWNlICovCitzdGF0aWMgaW50CWRpZmZfZmxhZ3MgPSBESUZGX0ZJTExFUjsKKworI2RlZmluZSBMQlVGTEVOIDUwCQkvKiBsZW5ndGggb2YgbGluZSBpbiBkaWZmIGZpbGUgKi8KKworc3RhdGljIGludCBkaWZmX2Ffd29ya3MgPSBNQVlCRTsgLyogVFJVRSB3aGVuICJkaWZmIC1hIiB3b3JrcywgRkFMU0Ugd2hlbiBpdAorCQkJCSAgICBkb2Vzbid0IHdvcmssIE1BWUJFIHdoZW4gbm90IGNoZWNrZWQgeWV0ICovCisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKK3N0YXRpYyBpbnQgZGlmZl9iaW5fd29ya3MgPSBNQVlCRTsgLyogVFJVRSB3aGVuICJkaWZmIC0tYmluYXJ5IiB3b3JrcywgRkFMU0UKKwkJCQkgICAgICB3aGVuIGl0IGRvZXNuJ3Qgd29yaywgTUFZQkUgd2hlbiBub3QKKwkJCQkgICAgICBjaGVja2VkIHlldCAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgZGlmZl9idWZfaWR4IF9fQVJHUygoYnVmX1QgKmJ1ZikpOworc3RhdGljIHZvaWQgZGlmZl9jaGVja191bmNoYW5nZWQgX19BUkdTKChkaWZmX1QgKmRwKSk7CitzdGF0aWMgaW50IGRpZmZfY2hlY2tfc2FuaXR5IF9fQVJHUygoZGlmZl9UICpkcCkpOworc3RhdGljIHZvaWQgZGlmZl9yZWRyYXcgX19BUkdTKChpbnQgZG9mb2xkKSk7CitzdGF0aWMgaW50IGRpZmZfd3JpdGUgX19BUkdTKChidWZfVCAqYnVmLCBjaGFyX3UgKmZuYW1lKSk7CitzdGF0aWMgdm9pZCBkaWZmX2ZpbGUgX19BUkdTKChjaGFyX3UgKnRtcF9vcmlnLCBjaGFyX3UgKnRtcF9uZXcsIGNoYXJfdSAqdG1wX2RpZmYpKTsKK3N0YXRpYyB2b2lkIGRpZmZfY2xlYXIgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IGRpZmZfZXF1YWxfZW50cnkgX19BUkdTKChkaWZmX1QgKmRwLCBpbnQgaWR4MSwgaW50IGlkeDIpKTsKK3N0YXRpYyBpbnQgZGlmZl9jbXAgX19BUkdTKChjaGFyX3UgKnMxLCBjaGFyX3UgKnMyKSk7CisjaWZkZWYgRkVBVF9GT0xESU5HCitzdGF0aWMgdm9pZCBkaWZmX2ZvbGRfdXBkYXRlIF9fQVJHUygoZGlmZl9UICpkcCwgaW50IHNraXBfaWR4KSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGRpZmZfcmVhZCBfX0FSR1MoKGludCBpZHhfb3JpZywgaW50IGlkeF9uZXcsIGNoYXJfdSAqZm5hbWUpKTsKK3N0YXRpYyB2b2lkIGRpZmZfY29weV9lbnRyeSBfX0FSR1MoKGRpZmZfVCAqZHByZXYsIGRpZmZfVCAqZHAsIGludCBpZHhfb3JpZywgaW50IGlkeF9uZXcpKTsKK3N0YXRpYyBkaWZmX1QgKmRpZmZfYWxsb2NfbmV3IF9fQVJHUygoZGlmZl9UICpkcHJldiwgZGlmZl9UICpkcCkpOworCisjaWZuZGVmIFVTRV9DUgorIyBkZWZpbmUgdGFnX2ZnZXRzIHZpbV9mZ2V0cworI2VuZGlmCisKKy8qCisgKiBDYWxsIHRoaXMgd2hlbiBhIG5ldyBidWZmZXIgaXMgYmVpbmcgZWRpdGVkIGluIHRoZSBjdXJyZW50IHdpbmRvdy4gIGN1cmJ1ZgorICogbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQuCisgKiBNYXJrcyB0aGUgY3VycmVudCBidWZmZXIgYXMgYmVpbmcgcGFydCBvZiB0aGUgZGlmZiBhbmQgcmVxdWlyZWluZyB1cGRhdGluZy4KKyAqIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBhbnkgYXV0b2NtZCwgYmVjYXVzZSBhIGNvbW1hbmQgdGhlIHVzZXMgaW5mbworICogYWJvdXQgdGhlIHNjcmVlbiBjb250ZW50cy4KKyAqLworICAgIHZvaWQKK2RpZmZfbmV3X2J1ZmZlcigpCit7CisgICAgaWYgKGN1cndpbi0+d19wX2RpZmYpCisJZGlmZl9idWZfYWRkKGN1cmJ1Zik7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBkZWxldGluZyBvciB1bmxvYWRpbmcgYSBidWZmZXI6IE5vIGxvbmdlciBtYWtlIGEgZGlmZiB3aXRoIGl0LgorICogQWxzbyBjYWxsZWQgd2hlbiAnZGlmZicgaXMgcmVzZXQgaW4gdGhlIGxhc3Qgd2luZG93IHNob3dpbmcgYSBkaWZmIGZvciBhCisgKiBidWZmZXIuCisgKi8KKyAgICB2b2lkCitkaWZmX2J1Zl9kZWxldGUoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaW50CQlpOworCisgICAgaSA9IGRpZmZfYnVmX2lkeChidWYpOworICAgIGlmIChpICE9IERCX0NPVU5UKQorICAgIHsKKwlkaWZmYnVmW2ldID0gTlVMTDsKKwlkaWZmX2ludmFsaWQgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqIEFkZCBhIGJ1ZmZlciB0byBtYWtlIGRpZmZzIGZvci4KKyAqLworICAgIHZvaWQKK2RpZmZfYnVmX2FkZChidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoZGlmZl9idWZfaWR4KGJ1ZikgIT0gREJfQ09VTlQpCisJcmV0dXJuOwkJLyogSXQncyBhbHJlYWR5IHRoZXJlLiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJaWYgKGRpZmZidWZbaV0gPT0gTlVMTCkKKwl7CisJICAgIGRpZmZidWZbaV0gPSBidWY7CisJICAgIGRpZmZfaW52YWxpZCA9IFRSVUU7CisJICAgIHJldHVybjsKKwl9CisKKyAgICBFTVNHTihfKCJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiKSwgREJfQ09VTlQpOworfQorCisvKgorICogRmluZCBidWZmZXIgImJ1ZiIgaW4gdGhlIGxpc3Qgb2YgZGlmZiBidWZmZXJzLgorICogUmV0dXJuIGl0cyBpbmRleCBvciBEQl9DT1VOVCBpZiBub3QgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgaW50CitkaWZmX2J1Zl9pZHgoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaW50CQlpZHg7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IERCX0NPVU5UOyArK2lkeCkKKwlpZiAoZGlmZmJ1ZltpZHhdID09IGJ1ZikKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGlkeDsKK30KKworLyoKKyAqIE1hcmsgdGhlIGRpZmYgaW5mbyBhcyBpbnZhbGlkLCBpdCB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBpbmZvIGlzIHJlcXVlc3RlZC4KKyAqLworICAgIHZvaWQKK2RpZmZfaW52YWxpZGF0ZSgpCit7CisgICAgaWYgKGN1cndpbi0+d19wX2RpZmYpCisgICAgeworCWRpZmZfaW52YWxpZCA9IFRSVUU7CisJZGlmZl9yZWRyYXcoVFJVRSk7CisgICAgfQorfQorCisvKgorICogQ2FsbGVkIGJ5IG1hcmtfYWRqdXN0KCk6IHVwZGF0ZSBsaW5lIG51bWJlcnMuCisgKiBUaGlzIGF0dGVtcHRzIHRvIHVwZGF0ZSB0aGUgY2hhbmdlcyBhcyBtdWNoIGFzIHBvc3NpYmxlOgorICogV2hlbiBpbnNlcnRpbmcvZGVsZXRpbmcgbGluZXMgb3V0c2lkZSBvZiBleGlzdGluZyBjaGFuZ2UgYmxvY2tzLCBjcmVhdGUgYQorICogbmV3IGNoYW5nZSBibG9jayBhbmQgdXBkYXRlIHRoZSBsaW5lIG51bWJlcnMgaW4gZm9sbG93aW5nIGJsb2Nrcy4KKyAqIFdoZW4gaW5zZXJ0aW5nL2RlbGV0aW5nIGxpbmVzIGluIGV4aXN0aW5nIGNoYW5nZSBibG9ja3MsIHVwZGF0ZSB0aGVtLgorICovCisgICAgdm9pZAorZGlmZl9tYXJrX2FkanVzdChsaW5lMSwgbGluZTIsIGFtb3VudCwgYW1vdW50X2FmdGVyKQorICAgIGxpbmVucl9UCWxpbmUxOworICAgIGxpbmVucl9UCWxpbmUyOworICAgIGxvbmcJYW1vdW50OworICAgIGxvbmcJYW1vdW50X2FmdGVyOworeworICAgIGRpZmZfVAkqZHA7CisgICAgZGlmZl9UCSpkcHJldjsKKyAgICBkaWZmX1QJKmRuZXh0OworICAgIGludAkJaWR4OworICAgIGludAkJaTsKKyAgICBpbnQJCWluc2VydGVkLCBkZWxldGVkOworICAgIGludAkJbiwgb2ZmOworICAgIGxpbmVucl9UCWxhc3Q7CisgICAgbGluZW5yX1QJbG51bV9kZWxldGVkID0gbGluZTE7CS8qIGxudW0gb2YgcmVtYWluaW5nIGRlbGV0aW9uICovCisgICAgaW50CQljaGVja191bmNoYW5nZWQ7CisKKyAgICAvKiBGaW5kIHRoZSBpbmRleCBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLiAqLworICAgIGlkeCA9IGRpZmZfYnVmX2lkeChjdXJidWYpOworICAgIGlmIChpZHggPT0gREJfQ09VTlQpCisJcmV0dXJuOwkJLyogVGhpcyBidWZmZXIgZG9lc24ndCBoYXZlIGRpZmZzLiAqLworCisgICAgaWYgKGxpbmUyID09IE1BWExOVU0pCisgICAgeworCS8qIG1hcmtfYWRqdXN0KDk5LCBNQVhMTlVNLCA5LCAwKTogaW5zZXJ0IGxpbmVzICovCisJaW5zZXJ0ZWQgPSBhbW91bnQ7CisJZGVsZXRlZCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKGFtb3VudF9hZnRlciA+IDApCisgICAgeworCS8qIG1hcmtfYWRqdXN0KDk5LCA5OCwgTUFYTE5VTSwgOSk6IGEgY2hhbmdlIHRoYXQgaW5zZXJ0cyBsaW5lcyovCisJaW5zZXJ0ZWQgPSBhbW91bnRfYWZ0ZXI7CisJZGVsZXRlZCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogbWFya19hZGp1c3QoOTgsIDk5LCBNQVhMTlVNLCAtMik6IGRlbGV0ZSBsaW5lcyAqLworCWluc2VydGVkID0gMDsKKwlkZWxldGVkID0gLWFtb3VudF9hZnRlcjsKKyAgICB9CisKKyAgICBkcHJldiA9IE5VTEw7CisgICAgZHAgPSBmaXJzdF9kaWZmOworICAgIGZvciAoOzspCisgICAgeworCS8qIElmIHRoZSBjaGFuZ2UgaXMgYWZ0ZXIgdGhlIHByZXZpb3VzIGRpZmYgYmxvY2sgYW5kIGJlZm9yZSB0aGUgbmV4dAorCSAqIGRpZmYgYmxvY2ssIHRodXMgbm90IHRvdWNoaW5nIGFuIGV4aXN0aW5nIGNoYW5nZSwgY3JlYXRlIGEgbmV3IGRpZmYKKwkgKiBibG9jay4gIERvbid0IGRvIHRoaXMgd2hlbiBleF9kaWZmZ2V0cHV0KCkgaXMgYnVzeS4gKi8KKwlpZiAoKGRwID09IE5VTEwgfHwgZHAtPmRmX2xudW1baWR4XSAtIDEgPiBsaW5lMgorCQkgICAgfHwgKGxpbmUyID09IE1BWExOVU0gJiYgZHAtPmRmX2xudW1baWR4XSA+IGxpbmUxKSkKKwkJJiYgKGRwcmV2ID09IE5VTEwKKwkJICAgIHx8IGRwcmV2LT5kZl9sbnVtW2lkeF0gKyBkcHJldi0+ZGZfY291bnRbaWR4XSA8IGxpbmUxKQorCQkmJiAhZGlmZl9idXN5KQorCXsKKwkgICAgZG5leHQgPSBkaWZmX2FsbG9jX25ldyhkcHJldiwgZHApOworCSAgICBpZiAoZG5leHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJICAgIGRuZXh0LT5kZl9sbnVtW2lkeF0gPSBsaW5lMTsKKwkgICAgZG5leHQtPmRmX2NvdW50W2lkeF0gPSBpbnNlcnRlZDsKKwkgICAgZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJCWlmIChkaWZmYnVmW2ldICE9IE5VTEwgJiYgaSAhPSBpZHgpCisJCXsKKwkJICAgIGlmIChkcHJldiA9PSBOVUxMKQorCQkJZG5leHQtPmRmX2xudW1baV0gPSBsaW5lMTsKKwkJICAgIGVsc2UKKwkJCWRuZXh0LT5kZl9sbnVtW2ldID0gbGluZTEKKwkJCSAgICArIChkcHJldi0+ZGZfbG51bVtpXSArIGRwcmV2LT5kZl9jb3VudFtpXSkKKwkJCSAgICAtIChkcHJldi0+ZGZfbG51bVtpZHhdICsgZHByZXYtPmRmX2NvdW50W2lkeF0pOworCQkgICAgZG5leHQtPmRmX2NvdW50W2ldID0gZGVsZXRlZDsKKwkJfQorCX0KKworCS8qIGlmIGF0IGVuZCBvZiB0aGUgbGlzdCwgcXVpdCAqLworCWlmIChkcCA9PSBOVUxMKQorCSAgICBicmVhazsKKworCS8qCisJICogQ2hlY2sgZm9yIHRoZXNlIHNpdHVhdGlvbnM6CisJICoJICAxICAyCTMKKwkgKgkgIDEgIDIJMworCSAqIGxpbmUxICAgICAyCTMgIDQgIDUKKwkgKgkgICAgIDIJMyAgNCAgNQorCSAqCSAgICAgMgkzICA0ICA1CisJICogbGluZTIgICAgIDIJMyAgNCAgNQorCSAqCQkzICAgICA1ICA2CisJICoJCTMgICAgIDUgIDYKKwkgKi8KKwkvKiBjb21wdXRlIGxhc3QgbGluZSBvZiB0aGlzIGNoYW5nZSAqLworCWxhc3QgPSBkcC0+ZGZfbG51bVtpZHhdICsgZHAtPmRmX2NvdW50W2lkeF0gLSAxOworCisJLyogMS4gY2hhbmdlIGNvbXBsZXRlbHkgYWJvdmUgbGluZTE6IG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAobGFzdCA+PSBsaW5lMSAtIDEpCisJeworCSAgICAvKiA2LiBjaGFuZ2UgYmVsb3cgbGluZTI6IG9ubHkgYWRqdXN0IGZvciBhbW91bnRfYWZ0ZXI7IGFsc28gd2hlbgorCSAgICAgKiAiZGVsZXRlZCIgYmVjYW1lIHplcm8gd2hlbiBkZWxldGVkIGFsbCBsaW5lcyBiZXR3ZWVuIHR3byBkaWZmcyAqLworCSAgICBpZiAoZHAtPmRmX2xudW1baWR4XSAtIChkZWxldGVkICsgaW5zZXJ0ZWQgIT0gMCkgPiBsaW5lMikKKwkgICAgeworCQlpZiAoYW1vdW50X2FmdGVyID09IDApCisJCSAgICBicmVhazsJLyogbm90aGluZyBsZWZ0IHRvIGNoYW5nZSAqLworCQlkcC0+ZGZfbG51bVtpZHhdICs9IGFtb3VudF9hZnRlcjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJY2hlY2tfdW5jaGFuZ2VkID0gRkFMU0U7CisKKwkJLyogMi4gMy4gNC4gNS46IGluc2VydGVkL2RlbGV0ZWQgbGluZXMgdG91Y2hpbmcgdGhpcyBkaWZmLiAqLworCQlpZiAoZGVsZXRlZCA+IDApCisJCXsKKwkJICAgIGlmIChkcC0+ZGZfbG51bVtpZHhdID49IGxpbmUxKQorCQkgICAgeworCQkJb2ZmID0gZHAtPmRmX2xudW1baWR4XSAtIGxudW1fZGVsZXRlZDsKKwkJCWlmIChsYXN0IDw9IGxpbmUyKQorCQkJeworCQkJICAgIC8qIDQuIGRlbGV0ZSBhbGwgbGluZXMgb2YgZGlmZiAqLworCQkJICAgIGlmIChkcC0+ZGZfbmV4dCAhPSBOVUxMCisJCQkJICAgICYmIGRwLT5kZl9uZXh0LT5kZl9sbnVtW2lkeF0gLSAxIDw9IGxpbmUyKQorCQkJICAgIHsKKwkJCQkvKiBkZWxldGUgY29udGludWVzIGluIG5leHQgZGlmZiwgb25seSBkbworCQkJCSAqIGxpbmVzIHVudGlsIHRoYXQgb25lICovCisJCQkJbiA9IGRwLT5kZl9uZXh0LT5kZl9sbnVtW2lkeF0gLSBsbnVtX2RlbGV0ZWQ7CisJCQkJZGVsZXRlZCAtPSBuOworCQkJCW4gLT0gZHAtPmRmX2NvdW50W2lkeF07CisJCQkJbG51bV9kZWxldGVkID0gZHAtPmRmX25leHQtPmRmX2xudW1baWR4XTsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJCW4gPSBkZWxldGVkIC0gZHAtPmRmX2NvdW50W2lkeF07CisJCQkgICAgZHAtPmRmX2NvdW50W2lkeF0gPSAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIC8qIDUuIGRlbGV0ZSBsaW5lcyBhdCBvciBqdXN0IGJlZm9yZSB0b3Agb2YgZGlmZiAqLworCQkJICAgIG4gPSBvZmY7CisJCQkgICAgZHAtPmRmX2NvdW50W2lkeF0gLT0gbGluZTIgLSBkcC0+ZGZfbG51bVtpZHhdICsgMTsKKwkJCSAgICBjaGVja191bmNoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJZHAtPmRmX2xudW1baWR4XSA9IGxpbmUxOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJb2ZmID0gMDsKKwkJCWlmIChsYXN0IDwgbGluZTIpCisJCQl7CisJCQkgICAgLyogMi4gZGVsZXRlIGF0IGVuZCBvZiBvZiBkaWZmICovCisJCQkgICAgZHAtPmRmX2NvdW50W2lkeF0gLT0gbGFzdCAtIGxudW1fZGVsZXRlZCArIDE7CisJCQkgICAgaWYgKGRwLT5kZl9uZXh0ICE9IE5VTEwKKwkJCQkgICAgJiYgZHAtPmRmX25leHQtPmRmX2xudW1baWR4XSAtIDEgPD0gbGluZTIpCisJCQkgICAgeworCQkJCS8qIGRlbGV0ZSBjb250aW51ZXMgaW4gbmV4dCBkaWZmLCBvbmx5IGRvCisJCQkJICogbGluZXMgdW50aWwgdGhhdCBvbmUgKi8KKwkJCQluID0gZHAtPmRmX25leHQtPmRmX2xudW1baWR4XSAtIDEgLSBsYXN0OworCQkJCWRlbGV0ZWQgLT0gZHAtPmRmX25leHQtPmRmX2xudW1baWR4XQorCQkJCQkJCSAgICAgICAtIGxudW1fZGVsZXRlZDsKKwkJCQlsbnVtX2RlbGV0ZWQgPSBkcC0+ZGZfbmV4dC0+ZGZfbG51bVtpZHhdOworCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkJbiA9IGxpbmUyIC0gbGFzdDsKKwkJCSAgICBjaGVja191bmNoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIC8qIDMuIGRlbGV0ZSBsaW5lcyBpbnNpZGUgdGhlIGRpZmYgKi8KKwkJCSAgICBuID0gMDsKKwkJCSAgICBkcC0+ZGZfY291bnRbaWR4XSAtPSBkZWxldGVkOworCQkJfQorCQkgICAgfQorCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgREJfQ09VTlQ7ICsraSkKKwkJCWlmIChkaWZmYnVmW2ldICE9IE5VTEwgJiYgaSAhPSBpZHgpCisJCQl7CisJCQkgICAgZHAtPmRmX2xudW1baV0gLT0gb2ZmOworCQkJICAgIGRwLT5kZl9jb3VudFtpXSArPSBuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGRwLT5kZl9sbnVtW2lkeF0gPD0gbGluZTEpCisJCSAgICB7CisJCQkvKiBpbnNlcnRlZCBsaW5lcyBzb21ld2hlcmUgaW4gdGhpcyBkaWZmICovCisJCQlkcC0+ZGZfY291bnRbaWR4XSArPSBpbnNlcnRlZDsKKwkJCWNoZWNrX3VuY2hhbmdlZCA9IFRSVUU7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQkvKiBpbnNlcnRlZCBsaW5lcyBzb21ld2hlcmUgYWJvdmUgdGhpcyBkaWZmICovCisJCQlkcC0+ZGZfbG51bVtpZHhdICs9IGluc2VydGVkOworCQl9CisKKwkJaWYgKGNoZWNrX3VuY2hhbmdlZCkKKwkJICAgIC8qIENoZWNrIGlmIGluc2VydGVkIGxpbmVzIGFyZSBlcXVhbCwgbWF5IHJlZHVjZSB0aGUKKwkJICAgICAqIHNpemUgb2YgdGhlIGRpZmYuICBUT0RPOiBhbHNvIGNoZWNrIGZvciBlcXVhbCBsaW5lcworCQkgICAgICogaW4gdGhlIG1pZGRsZSBhbmQgcGVyaGFwcyBzcGxpdCB0aGUgYmxvY2suICovCisJCSAgICBkaWZmX2NoZWNrX3VuY2hhbmdlZChkcCk7CisJICAgIH0KKwl9CisKKwkvKiBjaGVjayBpZiB0aGlzIGJsb2NrIHRvdWNoZXMgdGhlIHByZXZpb3VzIG9uZSwgbWF5IG1lcmdlIHRoZW0uICovCisJaWYgKGRwcmV2ICE9IE5VTEwgJiYgZHByZXYtPmRmX2xudW1baWR4XSArIGRwcmV2LT5kZl9jb3VudFtpZHhdCisJCQkJCQkJICA9PSBkcC0+ZGZfbG51bVtpZHhdKQorCXsKKwkgICAgZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJCWlmIChkaWZmYnVmW2ldICE9IE5VTEwpCisJCSAgICBkcHJldi0+ZGZfY291bnRbaV0gKz0gZHAtPmRmX2NvdW50W2ldOworCSAgICBkcHJldi0+ZGZfbmV4dCA9IGRwLT5kZl9uZXh0OworCSAgICB2aW1fZnJlZShkcCk7CisJICAgIGRwID0gZHByZXYtPmRmX25leHQ7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbnRyeS4gKi8KKwkgICAgZHByZXYgPSBkcDsKKwkgICAgZHAgPSBkcC0+ZGZfbmV4dDsKKwl9CisgICAgfQorCisgICAgZHByZXYgPSBOVUxMOworICAgIGRwID0gZmlyc3RfZGlmZjsKKyAgICB3aGlsZSAoZHAgIT0gTlVMTCkKKyAgICB7CisJLyogQWxsIGNvdW50cyBhcmUgemVybywgcmVtb3ZlIHRoaXMgZW50cnkuICovCisJZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJICAgIGlmIChkaWZmYnVmW2ldICE9IE5VTEwgJiYgZHAtPmRmX2NvdW50W2ldICE9IDApCisJCWJyZWFrOworCWlmIChpID09IERCX0NPVU5UKQorCXsKKwkgICAgZG5leHQgPSBkcC0+ZGZfbmV4dDsKKwkgICAgdmltX2ZyZWUoZHApOworCSAgICBkcCA9IGRuZXh0OworCSAgICBpZiAoZHByZXYgPT0gTlVMTCkKKwkJZmlyc3RfZGlmZiA9IGRuZXh0OworCSAgICBlbHNlCisJCWRwcmV2LT5kZl9uZXh0ID0gZG5leHQ7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbnRyeS4gKi8KKwkgICAgZHByZXYgPSBkcDsKKwkgICAgZHAgPSBkcC0+ZGZfbmV4dDsKKwl9CisKKyAgICB9CisgICAgZGlmZl9yZWRyYXcoVFJVRSk7CisKKyAgICAvKiBSZWNvbXB1dGUgdGhlIHNjcm9sbCBiaW5kaW5nLCBtYXkgcmVtb3ZlIG9yIGFkZCBmaWxsZXIgbGluZXMgKGUuZy4sCisgICAgICogd2hlbiBhZGRpbmcgbGluZXMgYWJvdmUgd190b3BsaW5lKS4gKi8KKyAgICBjaGVja19zY3JvbGxiaW5kKChsaW5lbnJfVCkwLCAwTCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBkaWZmIGJsb2NrIGFuZCBsaW5rIGl0IGJldHdlZW4gImRwcmV2IiBhbmQgImRwIi4KKyAqLworICAgIHN0YXRpYyBkaWZmX1QgKgorZGlmZl9hbGxvY19uZXcoZHByZXYsIGRwKQorICAgIGRpZmZfVAkqZHByZXY7CisgICAgZGlmZl9UCSpkcDsKK3sKKyAgICBkaWZmX1QJKmRuZXc7CisKKyAgICBkbmV3ID0gKGRpZmZfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoZGlmZl9UKSk7CisgICAgaWYgKGRuZXcgIT0gTlVMTCkKKyAgICB7CisJZG5ldy0+ZGZfbmV4dCA9IGRwOworCWlmIChkcHJldiA9PSBOVUxMKQorCSAgICBmaXJzdF9kaWZmID0gZG5ldzsKKwllbHNlCisJICAgIGRwcmV2LT5kZl9uZXh0ID0gZG5ldzsKKyAgICB9CisgICAgcmV0dXJuIGRuZXc7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZGlmZiBibG9jayAiZHAiIGNhbiBiZSBtYWRlIHNtYWxsZXIgZm9yIGxpbmVzIGF0IHRoZSBzdGFydCBhbmQKKyAqIGVuZCB0aGF0IGFyZSBlcXVhbC4gIENhbGxlZCBhZnRlciBpbnNlcnRpbmcgbGluZXMuCisgKiBUaGlzIG1heSByZXN1bHQgaW4gYSBjaGFuZ2Ugd2hlcmUgYWxsIGJ1ZmZlcnMgaGF2ZSB6ZXJvIGxpbmVzLCB0aGUgY2FsbGVyCisgKiBtdXN0IHRha2UgY2FyZSBvZiByZW1vdmluZyBpdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkaWZmX2NoZWNrX3VuY2hhbmdlZChkcCkKKyAgICBkaWZmX1QJKmRwOworeworICAgIGludAkJaV9vcmc7CisgICAgaW50CQlpX25ldzsKKyAgICBpbnQJCW9mZl9vcmcsIG9mZl9uZXc7CisgICAgY2hhcl91CSpsaW5lX29yZzsKKyAgICBpbnQJCWRpciA9IEZPUldBUkQ7CisKKyAgICAvKiBGaW5kIHRoZSBmaXJzdCBidWZmZXJzLCB1c2UgaXQgYXMgdGhlIG9yaWdpbmFsLCBjb21wYXJlIHRoZSBvdGhlcgorICAgICAqIGJ1ZmZlciBsaW5lcyBhZ2FpbnN0IHRoaXMgb25lLiAqLworICAgIGZvciAoaV9vcmcgPSAwOyBpX29yZyA8IERCX0NPVU5UOyArK2lfb3JnKQorCWlmIChkaWZmYnVmW2lfb3JnXSAhPSBOVUxMKQorCSAgICBicmVhazsKKyAgICBpZiAoaV9vcmcgPT0gREJfQ09VTlQpCS8qIHNhZmV0eSBjaGVjayAqLworCXJldHVybjsKKworICAgIGlmIChkaWZmX2NoZWNrX3Nhbml0eShkcCkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICAvKiBGaXJzdCBjaGVjayBsaW5lcyBhdCB0aGUgdG9wLCB0aGVuIGF0IHRoZSBib3R0b20uICovCisgICAgb2ZmX29yZyA9IDA7CisgICAgb2ZmX25ldyA9IDA7CisgICAgZm9yICg7OykKKyAgICB7CisJLyogUmVwZWF0IHVudGlsIGEgbGluZSBpcyBmb3VuZCB3aGljaCBpcyBkaWZmZXJlbnQgb3IgdGhlIG51bWJlciBvZgorCSAqIGxpbmVzIGhhcyBiZWNvbWUgemVyby4gKi8KKwl3aGlsZSAoZHAtPmRmX2NvdW50W2lfb3JnXSA+IDApCisJeworCSAgICAvKiBDb3B5IHRoZSBsaW5lLCB0aGUgbmV4dCBtbF9nZXQoKSB3aWxsIGludmFsaWRhdGUgaXQuICAqLworCSAgICBpZiAoZGlyID09IEJBQ0tXQVJEKQorCQlvZmZfb3JnID0gZHAtPmRmX2NvdW50W2lfb3JnXSAtIDE7CisJICAgIGxpbmVfb3JnID0gdmltX3N0cnNhdmUobWxfZ2V0X2J1ZihkaWZmYnVmW2lfb3JnXSwKKwkJCQkJZHAtPmRmX2xudW1baV9vcmddICsgb2ZmX29yZywgRkFMU0UpKTsKKwkgICAgaWYgKGxpbmVfb3JnID09IE5VTEwpCisJCXJldHVybjsKKwkgICAgZm9yIChpX25ldyA9IGlfb3JnICsgMTsgaV9uZXcgPCBEQl9DT1VOVDsgKytpX25ldykKKwkgICAgeworCQlpZiAoZGlmZmJ1ZltpX25ld10gPT0gTlVMTCkKKwkJICAgIGNvbnRpbnVlOworCQlpZiAoZGlyID09IEJBQ0tXQVJEKQorCQkgICAgb2ZmX25ldyA9IGRwLT5kZl9jb3VudFtpX25ld10gLSAxOworCQkvKiBpZiBvdGhlciBidWZmZXIgZG9lc24ndCBoYXZlIHRoaXMgbGluZSwgaXQgd2FzIGluc2VydGVkICovCisJCWlmIChvZmZfbmV3IDwgMCB8fCBvZmZfbmV3ID49IGRwLT5kZl9jb3VudFtpX25ld10pCisJCSAgICBicmVhazsKKwkJaWYgKGRpZmZfY21wKGxpbmVfb3JnLCBtbF9nZXRfYnVmKGRpZmZidWZbaV9uZXddLAorCQkJCSAgIGRwLT5kZl9sbnVtW2lfbmV3XSArIG9mZl9uZXcsIEZBTFNFKSkgIT0gMCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIHZpbV9mcmVlKGxpbmVfb3JnKTsKKworCSAgICAvKiBTdG9wIHdoZW4gYSBsaW5lIGlzbid0IGVxdWFsIGluIGFsbCBkaWZmIGJ1ZmZlcnMuICovCisJICAgIGlmIChpX25ldyAhPSBEQl9DT1VOVCkKKwkJYnJlYWs7CisKKwkgICAgLyogTGluZSBtYXRjaGVkIGluIGFsbCBidWZmZXJzLCByZW1vdmUgaXQgZnJvbSB0aGUgZGlmZi4gKi8KKwkgICAgZm9yIChpX25ldyA9IGlfb3JnOyBpX25ldyA8IERCX0NPVU5UOyArK2lfbmV3KQorCQlpZiAoZGlmZmJ1ZltpX25ld10gIT0gTlVMTCkKKwkJeworCQkgICAgaWYgKGRpciA9PSBGT1JXQVJEKQorCQkJKytkcC0+ZGZfbG51bVtpX25ld107CisJCSAgICAtLWRwLT5kZl9jb3VudFtpX25ld107CisJCX0KKwl9CisJaWYgKGRpciA9PSBCQUNLV0FSRCkKKwkgICAgYnJlYWs7CisJZGlyID0gQkFDS1dBUkQ7CisgICAgfQorfQorCisvKgorICogQ2hlY2sgaWYgYSBkaWZmIGJsb2NrIGRvZXNuJ3QgY29udGFpbiBpbnZhbGlkIGxpbmUgbnVtYmVycy4KKyAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBkaWZmIHByb2dyYW0gcmV0dXJucyBpbnZhbGlkIHJlc3VsdHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitkaWZmX2NoZWNrX3Nhbml0eShkcCkKKyAgICBkaWZmX1QJKmRwOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQl9DT1VOVDsgKytpKQorCWlmIChkaWZmYnVmW2ldICE9IE5VTEwpCisJICAgIGlmIChkcC0+ZGZfbG51bVtpXSArIGRwLT5kZl9jb3VudFtpXSAtIDEKKwkJCQkJICAgICA+IGRpZmZidWZbaV0tPmJfbWwubWxfbGluZV9jb3VudCkKKwkJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogTWFyayBhbGwgZGlmZiBidWZmZXJzIGZvciByZWRyYXcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlmZl9yZWRyYXcoZG9mb2xkKQorICAgIGludAkJZG9mb2xkOwkgICAgLyogYWxzbyByZWNvbXB1dGUgdGhlIGZvbGRzICovCit7CisgICAgd2luX1QJKndwOworICAgIGludAkJbjsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICh3cC0+d19wX2RpZmYpCisJeworCSAgICByZWRyYXdfd2luX2xhdGVyKHdwLCBOT1RfVkFMSUQpOworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoZG9mb2xkICYmIGZvbGRtZXRob2RJc0RpZmYod3ApKQorCQlmb2xkVXBkYXRlQWxsKHdwKTsKKyNlbmRpZgorCSAgICAvKiBBIGNoYW5nZSBtYXkgaGF2ZSBtYWRlIGZpbGxlciBsaW5lcyBpbnZhbGlkLCBuZWVkIHRvIHRha2UgY2FyZQorCSAgICAgKiBvZiB0aGF0IGZvciBvdGhlciB3aW5kb3dzLiAqLworCSAgICBpZiAod3AgIT0gY3Vyd2luICYmIHdwLT53X3RvcGZpbGwgPiAwKQorCSAgICB7CisJCW4gPSBkaWZmX2NoZWNrKHdwLCB3cC0+d190b3BsaW5lKTsKKwkJaWYgKHdwLT53X3RvcGZpbGwgPiBuKQorCQkgICAgd3AtPndfdG9wZmlsbCA9IChuIDwgMCA/IDAgOiBuKTsKKwkgICAgfQorCX0KK30KKworLyoKKyAqIFdyaXRlIGJ1ZmZlciAiYnVmIiB0byBmaWxlICJuYW1lIi4KKyAqIEFsd2F5cyB1c2UgJ2ZpbGVmb3JtYXQnIHNldCB0byAidW5peCIuCisgKiBSZXR1cm4gRkFJTCBmb3IgZmFpbHVyZQorICovCisgICAgc3RhdGljIGludAorZGlmZl93cml0ZShidWYsIGZuYW1lKQorICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyAgICBpbnQJCXI7CisgICAgY2hhcl91CSpzYXZlX2ZmOworCisgICAgc2F2ZV9mZiA9IGJ1Zi0+Yl9wX2ZmOworICAgIGJ1Zi0+Yl9wX2ZmID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKUZGX1VOSVgpOworICAgIHIgPSBidWZfd3JpdGUoYnVmLCBmbmFtZSwgTlVMTCwgKGxpbmVucl9UKTEsIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LAorCQkJCQkgICAgIE5VTEwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUpOworICAgIGZyZWVfc3RyaW5nX29wdGlvbihidWYtPmJfcF9mZik7CisgICAgYnVmLT5iX3BfZmYgPSBzYXZlX2ZmOworICAgIHJldHVybiByOworfQorCisvKgorICogQ29tcGxldGVseSB1cGRhdGUgdGhlIGRpZmZzIGZvciB0aGUgYnVmZmVycyBpbnZvbHZlZC4KKyAqIFRoaXMgdXNlcyB0aGUgb3JkaW5hcnkgImRpZmYiIGNvbW1hbmQuCisgKiBUaGUgYnVmZmVycyBhcmUgd3JpdHRlbiB0byBhIGZpbGUsIGFsc28gZm9yIHVubW9kaWZpZWQgYnVmZmVycyAodGhlIGZpbGUKKyAqIGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieSBhdXRvY29tbWFuZHMsIGUuZy4gdGhlIG5ldHJ3IHBsdWdpbikuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X2RpZmZ1cGRhdGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJaWR4X29yaWc7CisgICAgaW50CQlpZHhfbmV3OworICAgIGNoYXJfdQkqdG1wX29yaWc7CisgICAgY2hhcl91CSp0bXBfbmV3OworICAgIGNoYXJfdQkqdG1wX2RpZmY7CisgICAgRklMRQkqZmQ7CisgICAgaW50CQlvazsKKworICAgIC8qIERlbGV0ZSBhbGwgZGlmZmJsb2Nrcy4gKi8KKyAgICBkaWZmX2NsZWFyKCk7CisgICAgZGlmZl9pbnZhbGlkID0gRkFMU0U7CisKKyAgICAvKiBVc2UgdGhlIGZpcnN0IGJ1ZmZlciBhcyB0aGUgb3JpZ2luYWwgdGV4dC4gKi8KKyAgICBmb3IgKGlkeF9vcmlnID0gMDsgaWR4X29yaWcgPCBEQl9DT1VOVDsgKytpZHhfb3JpZykKKwlpZiAoZGlmZmJ1ZltpZHhfb3JpZ10gIT0gTlVMTCkKKwkgICAgYnJlYWs7CisgICAgaWYgKGlkeF9vcmlnID09IERCX0NPVU5UKQorCXJldHVybjsKKworICAgIC8qIE9ubHkgbmVlZCB0byBkbyBzb21ldGhpbmcgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGJ1ZmZlci4gKi8KKyAgICBmb3IgKGlkeF9uZXcgPSBpZHhfb3JpZyArIDE7IGlkeF9uZXcgPCBEQl9DT1VOVDsgKytpZHhfbmV3KQorCWlmIChkaWZmYnVmW2lkeF9uZXddICE9IE5VTEwpCisJICAgIGJyZWFrOworICAgIGlmIChpZHhfbmV3ID09IERCX0NPVU5UKQorCXJldHVybjsKKworICAgIC8qIFdlIG5lZWQgdGhyZWUgdGVtcCBmaWxlIG5hbWVzLiAqLworICAgIHRtcF9vcmlnID0gdmltX3RlbXBuYW1lKCdvJyk7CisgICAgdG1wX25ldyA9IHZpbV90ZW1wbmFtZSgnbicpOworICAgIHRtcF9kaWZmID0gdmltX3RlbXBuYW1lKCdkJyk7CisgICAgaWYgKHRtcF9vcmlnID09IE5VTEwgfHwgdG1wX25ldyA9PSBOVUxMIHx8IHRtcF9kaWZmID09IE5VTEwpCisJZ290byB0aGVlbmQ7CisKKyAgICAvKgorICAgICAqIERvIGEgcXVpY2sgdGVzdCBpZiAiZGlmZiIgcmVhbGx5IHdvcmtzLiAgT3RoZXJ3aXNlIGl0IGxvb2tzIGxpa2UgdGhlcmUKKyAgICAgKiBhcmUgbm8gZGlmZmVyZW5jZXMuICBDYW4ndCB1c2UgdGhlIHJldHVybiB2YWx1ZSwgaXQncyBub24temVybyB3aGVuCisgICAgICogdGhlcmUgYXJlIGRpZmZlcmVuY2VzLgorICAgICAqIE1heSB0cnkgdHdpY2UsIGZpcnN0IHdpdGggIi1hIiBhbmQgdGhlbiB3aXRob3V0LgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCW9rID0gRkFMU0U7CisJZmQgPSBmb3BlbigoY2hhciAqKXRtcF9vcmlnLCAidyIpOworCWlmIChmZCAhPSBOVUxMKQorCXsKKwkgICAgZndyaXRlKCJsaW5lMVxuIiwgKHNpemVfdCk2LCAoc2l6ZV90KTEsIGZkKTsKKwkgICAgZmNsb3NlKGZkKTsKKwkgICAgZmQgPSBmb3BlbigoY2hhciAqKXRtcF9uZXcsICJ3Iik7CisJICAgIGlmIChmZCAhPSBOVUxMKQorCSAgICB7CisJCWZ3cml0ZSgibGluZTJcbiIsIChzaXplX3QpNiwgKHNpemVfdCkxLCBmZCk7CisJCWZjbG9zZShmZCk7CisJCWRpZmZfZmlsZSh0bXBfb3JpZywgdG1wX25ldywgdG1wX2RpZmYpOworCQlmZCA9IGZvcGVuKChjaGFyICopdG1wX2RpZmYsICJyIik7CisJCWlmIChmZCAhPSBOVUxMKQorCQl7CisJCSAgICBjaGFyX3UJbGluZWJ1ZltMQlVGTEVOXTsKKworCQkgICAgZm9yICg7OykKKwkJICAgIHsKKwkJCS8qIFRoZXJlIG11c3QgYmUgYSBsaW5lIHRoYXQgY29udGFpbnMgIjFjMSIuICovCisJCQlpZiAodGFnX2ZnZXRzKGxpbmVidWYsIExCVUZMRU4sIGZkKSkKKwkJCSAgICBicmVhazsKKwkJCWlmIChTVFJOQ01QKGxpbmVidWYsICIxYzEiLCAzKSA9PSAwKQorCQkJICAgIG9rID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGZjbG9zZShmZCk7CisJCX0KKwkJbWNoX3JlbW92ZSh0bXBfZGlmZik7CisJCW1jaF9yZW1vdmUodG1wX25ldyk7CisJICAgIH0KKwkgICAgbWNoX3JlbW92ZSh0bXBfb3JpZyk7CisJfQorCisjaWZkZWYgRkVBVF9FVkFMCisJLyogV2hlbiB1c2luZyAnZGlmZmV4cHInIGJyZWFrIGhlcmUuICovCisJaWYgKCpwX2RleCAhPSBOVUwpCisJICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorCS8qIElmIHRoZSAiLWEiIGFyZ3VtZW50IHdvcmtzLCBhbHNvIGNoZWNrIGlmICItLWJpbmFyeSIgd29ya3MuICovCisJaWYgKG9rICYmIGRpZmZfYV93b3JrcyA9PSBNQVlCRSAmJiBkaWZmX2Jpbl93b3JrcyA9PSBNQVlCRSkKKwl7CisJICAgIGRpZmZfYV93b3JrcyA9IFRSVUU7CisJICAgIGRpZmZfYmluX3dvcmtzID0gVFJVRTsKKwkgICAgY29udGludWU7CisJfQorCWlmICghb2sgJiYgZGlmZl9hX3dvcmtzID09IFRSVUUgJiYgZGlmZl9iaW5fd29ya3MgPT0gVFJVRSkKKwl7CisJICAgIC8qIFRyaWVkIC0tYmluYXJ5LCBidXQgaXQgZmFpbGVkLiAiLWEiIHdvcmtzIHRob3VnaC4gKi8KKwkgICAgZGlmZl9iaW5fd29ya3MgPSBGQUxTRTsKKwkgICAgb2sgPSBUUlVFOworCX0KKyNlbmRpZgorCisJLyogSWYgd2UgY2hlY2tlZCBpZiAiLWEiIHdvcmtzIGFscmVhZHksIGJyZWFrIGhlcmUuICovCisJaWYgKGRpZmZfYV93b3JrcyAhPSBNQVlCRSkKKwkgICAgYnJlYWs7CisJZGlmZl9hX3dvcmtzID0gb2s7CisKKwkvKiBJZiAiLWEiIHdvcmtzIGJyZWFrIGhlcmUsIG90aGVyd2lzZSByZXRyeSB3aXRob3V0ICItYSIuICovCisJaWYgKG9rKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFvaykKKyAgICB7CisJRU1TRyhfKCJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiKSk7CisJZGlmZl9hX3dvcmtzID0gTUFZQkU7CisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKwlkaWZmX2Jpbl93b3JrcyA9IE1BWUJFOworI2VuZGlmCisJZ290byB0aGVlbmQ7CisgICAgfQorCisgICAgLyogV3JpdGUgdGhlIGZpcnN0IGJ1ZmZlciB0byBhIHRlbXBmaWxlLiAqLworICAgIGJ1ZiA9IGRpZmZidWZbaWR4X29yaWddOworICAgIGlmIChkaWZmX3dyaXRlKGJ1ZiwgdG1wX29yaWcpID09IEZBSUwpCisJZ290byB0aGVlbmQ7CisKKyAgICAvKiBNYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBidWZmZXIgYW5kIGV2ZXJ5IG90aGVyLiAqLworICAgIGZvciAoaWR4X25ldyA9IGlkeF9vcmlnICsgMTsgaWR4X25ldyA8IERCX0NPVU5UOyArK2lkeF9uZXcpCisgICAgeworCWJ1ZiA9IGRpZmZidWZbaWR4X25ld107CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlpZiAoZGlmZl93cml0ZShidWYsIHRtcF9uZXcpID09IEZBSUwpCisJICAgIGNvbnRpbnVlOworCWRpZmZfZmlsZSh0bXBfb3JpZywgdG1wX25ldywgdG1wX2RpZmYpOworCisJLyogUmVhZCB0aGUgZGlmZiBvdXRwdXQgYW5kIGFkZCBlYWNoIGVudHJ5IHRvIHRoZSBkaWZmIGxpc3QuICovCisJZGlmZl9yZWFkKGlkeF9vcmlnLCBpZHhfbmV3LCB0bXBfZGlmZik7CisJbWNoX3JlbW92ZSh0bXBfZGlmZik7CisJbWNoX3JlbW92ZSh0bXBfbmV3KTsKKyAgICB9CisgICAgbWNoX3JlbW92ZSh0bXBfb3JpZyk7CisKKyAgICBkaWZmX3JlZHJhdyhUUlVFKTsKKwordGhlZW5kOgorICAgIHZpbV9mcmVlKHRtcF9vcmlnKTsKKyAgICB2aW1fZnJlZSh0bXBfbmV3KTsKKyAgICB2aW1fZnJlZSh0bXBfZGlmZik7Cit9CisKKy8qCisgKiBNYWtlIGEgZGlmZiBiZXR3ZWVuIGZpbGVzICJ0bXBfb3JpZyIgYW5kICJ0bXBfbmV3IiwgcmVzdWx0cyBpbiAidG1wX2RpZmYiLgorICovCisgICAgc3RhdGljIHZvaWQKK2RpZmZfZmlsZSh0bXBfb3JpZywgdG1wX25ldywgdG1wX2RpZmYpCisgICAgY2hhcl91CSp0bXBfb3JpZzsKKyAgICBjaGFyX3UJKnRtcF9uZXc7CisgICAgY2hhcl91CSp0bXBfZGlmZjsKK3sKKyAgICBjaGFyX3UJKmNtZDsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIGlmICgqcF9kZXggIT0gTlVMKQorCS8qIFVzZSAnZGlmZmV4cHInIHRvIGdlbmVyYXRlIHRoZSBkaWZmIGZpbGUuICovCisJZXZhbF9kaWZmKHRtcF9vcmlnLCB0bXBfbmV3LCB0bXBfZGlmZik7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWNtZCA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKHRtcF9vcmlnKSArIFNUUkxFTih0bXBfbmV3KQorCQkJCSsgU1RSTEVOKHRtcF9kaWZmKSArIFNUUkxFTihwX3NycikgKyAyNykpOworCWlmIChjbWQgIT0gTlVMTCkKKwl7CisJICAgIC8qIEJ1aWxkIHRoZSBkaWZmIGNvbW1hbmQgYW5kIGV4ZWN1dGUgaXQuICBBbHdheXMgdXNlIC1hLCBiaW5hcnkKKwkgICAgICogZGlmZmVyZW5jZXMgYXJlIG9mIG5vIHVzZS4gIElnbm9yZSBlcnJvcnMsIGRpZmYgcmV0dXJucworCSAgICAgKiBub24temVybyB3aGVuIGRpZmZlcmVuY2VzIGhhdmUgYmVlbiBmb3VuZC4gKi8KKwkgICAgc3ByaW50ZigoY2hhciAqKWNtZCwgImRpZmYgJXMlcyVzJXMlcyAlcyIsCisJCSAgICBkaWZmX2Ffd29ya3MgPT0gRkFMU0UgPyAiIiA6ICItYSAiLAorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisJCSAgICBkaWZmX2Jpbl93b3JrcyA9PSBUUlVFID8gIi0tYmluYXJ5ICIgOiAiIiwKKyNlbHNlCisJCSAgICAiIiwKKyNlbmRpZgorCQkgICAgKGRpZmZfZmxhZ3MgJiBESUZGX0lXSElURSkgPyAiLWIgIiA6ICIiLAorCQkgICAgKGRpZmZfZmxhZ3MgJiBESUZGX0lDQVNFKSA/ICItaSAiIDogIiIsCisJCSAgICB0bXBfb3JpZywgdG1wX25ldyk7CisJICAgIGFwcGVuZF9yZWRpcihjbWQsIHBfc3JyLCB0bXBfZGlmZik7CisJICAgICh2b2lkKWNhbGxfc2hlbGwoY21kLCBTSEVMTF9GSUxURVJ8U0hFTExfU0lMRU5UfFNIRUxMX0RPT1VUKTsKKwkgICAgdmltX2ZyZWUoY21kKTsKKwl9CisgICAgfQorfQorCisvKgorICogQ3JlYXRlIGEgbmV3IHZlcnNpb24gb2YgYSBmaWxlIGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIGFuZCBhIGRpZmYgZmlsZS4KKyAqIFRoZSBidWZmZXIgaXMgd3JpdHRlbiB0byBhIGZpbGUsIGFsc28gZm9yIHVubW9kaWZpZWQgYnVmZmVycyAodGhlIGZpbGUKKyAqIGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieSBhdXRvY29tbWFuZHMsIGUuZy4gdGhlIG5ldHJ3IHBsdWdpbikuCisgKi8KKyAgICB2b2lkCitleF9kaWZmcGF0Y2goZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKnRtcF9vcmlnOwkvKiBuYW1lIG9mIG9yaWdpbmFsIHRlbXAgZmlsZSAqLworICAgIGNoYXJfdQkqdG1wX25ldzsJLyogbmFtZSBvZiBwYXRjaGVkIHRlbXAgZmlsZSAqLworICAgIGNoYXJfdQkqYnVmID0gTlVMTDsKKyAgICB3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKyAgICBjaGFyX3UJKm5ld25hbWUgPSBOVUxMOwkvKiBuYW1lIG9mIHBhdGNoZWQgZmlsZSBidWZmZXIgKi8KKyNpZmRlZiBVTklYCisgICAgY2hhcl91CWRpcmJ1ZltNQVhQQVRITF07CisgICAgY2hhcl91CSpmdWxsbmFtZSA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0JST1dTRQorICAgIGNoYXJfdQkqYnJvd3NlRmlsZSA9IE5VTEw7CisgICAgaW50CQlicm93c2VfZmxhZyA9IGNtZG1vZC5icm93c2U7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQlJPV1NFCisgICAgaWYgKGNtZG1vZC5icm93c2UpCisgICAgeworCWJyb3dzZUZpbGUgPSBkb19icm93c2UoRkFMU0UsIChjaGFyX3UgKilfKCJQYXRjaCBmaWxlIiksCisJCQkgZWFwLT5hcmcsIE5VTEwsIE5VTEwsIEJST1dTRV9GSUxURVJfQUxMX0ZJTEVTLCBOVUxMKTsKKwlpZiAoYnJvd3NlRmlsZSA9PSBOVUxMKQorCSAgICByZXR1cm47CQkvKiBvcGVyYXRpb24gY2FuY2VsbGVkICovCisJZWFwLT5hcmcgPSBicm93c2VGaWxlOworCWNtZG1vZC5icm93c2UgPSBGQUxTRTsJLyogZG9uJ3QgbGV0IGRvX2VjbWQoKSBicm93c2UgYWdhaW4gKi8KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFdlIG5lZWQgdHdvIHRlbXAgZmlsZSBuYW1lcy4gKi8KKyAgICB0bXBfb3JpZyA9IHZpbV90ZW1wbmFtZSgnbycpOworICAgIHRtcF9uZXcgPSB2aW1fdGVtcG5hbWUoJ24nKTsKKyAgICBpZiAodG1wX29yaWcgPT0gTlVMTCB8fCB0bXBfbmV3ID09IE5VTEwpCisJZ290byB0aGVlbmQ7CisKKyAgICAvKiBXcml0ZSB0aGUgY3VycmVudCBidWZmZXIgdG8gInRtcF9vcmlnIi4gKi8KKyAgICBpZiAoYnVmX3dyaXRlKGN1cmJ1ZiwgdG1wX29yaWcsIE5VTEwsCisJCShsaW5lbnJfVCkxLCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwKKwkJCQkgICAgIE5VTEwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUpID09IEZBSUwpCisJZ290byB0aGVlbmQ7CisKKyNpZmRlZiBVTklYCisgICAgLyogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwYXRjaGZpbGUsIGNoYW5naW5nIGRpcmVjdG9yeSBiZWxvdy4gKi8KKyAgICBmdWxsbmFtZSA9IEZ1bGxOYW1lX3NhdmUoZWFwLT5hcmcsIEZBTFNFKTsKKyNlbmRpZgorICAgIGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKHRtcF9vcmlnKSArICgKKyMgaWZkZWYgVU5JWAorCQkgICAgZnVsbG5hbWUgIT0gTlVMTCA/IFNUUkxFTihmdWxsbmFtZSkgOgorIyBlbmRpZgorCQkgICAgU1RSTEVOKGVhcC0+YXJnKSkgKyBTVFJMRU4odG1wX25ldykgKyAxNikpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlnb3RvIHRoZWVuZDsKKworI2lmZGVmIFVOSVgKKyAgICAvKiBUZW1wb3JhcmFseSBjaGRpciB0byAvdG1wLCB0byBhdm9pZCBwYXRjaGluZyBmaWxlcyBpbiB0aGUgY3VycmVudAorICAgICAqIGRpcmVjdG9yeSB3aGVuIHRoZSBwYXRjaCBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcGF0Y2guICBXaGVuIHdlCisgICAgICogaGF2ZSBvdXIgb3duIHRlbXAgZGlyIHVzZSB0aGF0IGluc3RlYWQsIGl0IHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIHdlCisgICAgICogZXhpdCAoYW55IC5yZWogZmlsZXMgY3JlYXRlZCkuICBEb24ndCBjaGFuZ2UgZGlyZWN0b3J5IGlmIHdlIGNhbid0CisgICAgICogcmV0dXJuIHRvIHRoZSBjdXJyZW50LiAqLworICAgIGlmIChtY2hfZGlybmFtZShkaXJidWYsIE1BWFBBVEhMKSAhPSBPSyB8fCBtY2hfY2hkaXIoKGNoYXIgKilkaXJidWYpICE9IDApCisJZGlyYnVmWzBdID0gTlVMOworICAgIGVsc2UKKyAgICB7CisjIGlmZGVmIFRFTVBESVJOQU1FUworCWlmICh2aW1fdGVtcGRpciAhPSBOVUxMKQorCSAgICBtY2hfY2hkaXIoKGNoYXIgKil2aW1fdGVtcGRpcik7CisJZWxzZQorIyBlbmRpZgorCSAgICBtY2hfY2hkaXIoIi90bXAiKTsKKwlzaG9ydGVuX2ZuYW1lcyhUUlVFKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIGlmICgqcF9wZXggIT0gTlVMKQorCS8qIFVzZSAncGF0Y2hleHByJyB0byBnZW5lcmF0ZSB0aGUgbmV3IGZpbGUuICovCisJZXZhbF9wYXRjaCh0bXBfb3JpZywKKyMgaWZkZWYgVU5JWAorCQlmdWxsbmFtZSAhPSBOVUxMID8gZnVsbG5hbWUgOgorIyBlbmRpZgorCQllYXAtPmFyZywgdG1wX25ldyk7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qIEJ1aWxkIHRoZSBwYXRjaCBjb21tYW5kIGFuZCBleGVjdXRlIGl0LiAgSWdub3JlIGVycm9ycy4gIFN3aXRjaCB0bworCSAqIGNvb2tlZCBtb2RlIHRvIGFsbG93IHRoZSB1c2VyIHRvIHJlc3BvbmQgdG8gcHJvbXB0cy4gKi8KKwlzcHJpbnRmKChjaGFyICopYnVmLCAicGF0Y2ggLW8gJXMgJXMgPCBcIiVzXCIiLCB0bXBfbmV3LCB0bXBfb3JpZywKKyMgaWZkZWYgVU5JWAorCQlmdWxsbmFtZSAhPSBOVUxMID8gZnVsbG5hbWUgOgorIyBlbmRpZgorCQllYXAtPmFyZyk7CisJKHZvaWQpY2FsbF9zaGVsbChidWYsIFNIRUxMX0ZJTFRFUiB8IFNIRUxMX0NPT0tFRCk7CisgICAgfQorCisjaWZkZWYgVU5JWAorICAgIGlmIChkaXJidWZbMF0gIT0gTlVMKQorICAgIHsKKwlpZiAobWNoX2NoZGlyKChjaGFyICopZGlyYnVmKSAhPSAwKQorCSAgICBFTVNHKF8oZV9wcmV2X2RpcikpOworCXNob3J0ZW5fZm5hbWVzKFRSVUUpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogcGF0Y2ggcHJvYmFibHkgaGFzIHdyaXR0ZW4gb3ZlciB0aGUgc2NyZWVuICovCisgICAgcmVkcmF3X2xhdGVyKENMRUFSKTsKKworICAgIC8qIERlbGV0ZSBhbnkgLm9yaWcgb3IgLnJlaiBmaWxlIGNyZWF0ZWQuICovCisgICAgU1RSQ1BZKGJ1ZiwgdG1wX25ldyk7CisgICAgU1RSQ0FUKGJ1ZiwgIi5vcmlnIik7CisgICAgbWNoX3JlbW92ZShidWYpOworICAgIFNUUkNQWShidWYsIHRtcF9uZXcpOworICAgIFNUUkNBVChidWYsICIucmVqIik7CisgICAgbWNoX3JlbW92ZShidWYpOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMKQorICAgIHsKKwluZXduYW1lID0gdmltX3N0cm5zYXZlKGN1cmJ1Zi0+Yl9mbmFtZSwKKwkJCQkJICAoaW50KShTVFJMRU4oY3VyYnVmLT5iX2ZuYW1lKSArIDQpKTsKKwlpZiAobmV3bmFtZSAhPSBOVUxMKQorCSAgICBTVFJDQVQobmV3bmFtZSwgIi5uZXciKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKyAgICBpZiAod2luX3NwbGl0KDAsIDApICE9IEZBSUwpCisgICAgeworCS8qIFByZXRlbmQgaXQgd2FzIGEgIjpzcGxpdCBmbmFtZSIgY29tbWFuZCAqLworCWVhcC0+Y21kaWR4ID0gQ01EX3NwbGl0OworCWVhcC0+YXJnID0gdG1wX25ldzsKKwlkb19leGVkaXQoZWFwLCBvbGRfY3Vyd2luKTsKKworCWlmIChjdXJ3aW4gIT0gb2xkX2N1cndpbikJCS8qIHNwbGl0IG11c3QgaGF2ZSB3b3JrZWQgKi8KKwl7CisJICAgIC8qIFNldCAnZGlmZicsICdzY3JvbGxiaW5kJyBvbiBhbmQgJ3dyYXAnIG9mZi4gKi8KKwkgICAgZGlmZl93aW5fb3B0aW9ucyhjdXJ3aW4sIFRSVUUpOworCSAgICBkaWZmX3dpbl9vcHRpb25zKG9sZF9jdXJ3aW4sIFRSVUUpOworCisJICAgIGlmIChuZXduYW1lICE9IE5VTEwpCisJICAgIHsKKwkJLyogZG8gYSAiOmZpbGUgZmlsZW5hbWUubmV3IiBvbiB0aGUgcGF0Y2hlZCBidWZmZXIgKi8KKwkJZWFwLT5hcmcgPSBuZXduYW1lOworCQlleF9maWxlKGVhcCk7CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJLyogRG8gZmlsZXR5cGUgZGV0ZWN0aW9uIHdpdGggdGhlIG5ldyBuYW1lLiAqLworCQlkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopIjpkb2F1IGZpbGV0eXBlZGV0ZWN0IEJ1ZlJlYWQiKTsKKyNlbmRpZgorCSAgICB9CisJfQorICAgIH0KKwordGhlZW5kOgorICAgIGlmICh0bXBfb3JpZyAhPSBOVUxMKQorCW1jaF9yZW1vdmUodG1wX29yaWcpOworICAgIHZpbV9mcmVlKHRtcF9vcmlnKTsKKyAgICBpZiAodG1wX25ldyAhPSBOVUxMKQorCW1jaF9yZW1vdmUodG1wX25ldyk7CisgICAgdmltX2ZyZWUodG1wX25ldyk7CisgICAgdmltX2ZyZWUobmV3bmFtZSk7CisgICAgdmltX2ZyZWUoYnVmKTsKKyNpZmRlZiBVTklYCisgICAgdmltX2ZyZWUoZnVsbG5hbWUpOworI2VuZGlmCisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICB2aW1fZnJlZShicm93c2VGaWxlKTsKKyAgICBjbWRtb2QuYnJvd3NlID0gYnJvd3NlX2ZsYWc7CisjZW5kaWYKK30KKworLyoKKyAqIFNwbGl0IHRoZSB3aW5kb3cgYW5kIGVkaXQgYW5vdGhlciBmaWxlLCBzZXR0aW5nIG9wdGlvbnMgdG8gc2hvdyB0aGUgZGlmZnMuCisgKi8KKyAgICB2b2lkCitleF9kaWZmc3BsaXQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICB3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorICAgIGlmICh3aW5fc3BsaXQoMCwgMCkgIT0gRkFJTCkKKyAgICB7CisJLyogUHJldGVuZCBpdCB3YXMgYSAiOnNwbGl0IGZuYW1lIiBjb21tYW5kICovCisJZWFwLT5jbWRpZHggPSBDTURfc3BsaXQ7CisJZG9fZXhlZGl0KGVhcCwgb2xkX2N1cndpbik7CisKKwlpZiAoY3Vyd2luICE9IG9sZF9jdXJ3aW4pCQkvKiBzcGxpdCBtdXN0IGhhdmUgd29ya2VkICovCisJeworCSAgICAvKiBTZXQgJ2RpZmYnLCAnc2Nyb2xsYmluZCcgb24gYW5kICd3cmFwJyBvZmYuICovCisJICAgIGRpZmZfd2luX29wdGlvbnMoY3Vyd2luLCBUUlVFKTsKKwkgICAgZGlmZl93aW5fb3B0aW9ucyhvbGRfY3Vyd2luLCBUUlVFKTsKKwl9CisgICAgfQorfQorCisvKgorICogU2V0IG9wdGlvbnMgdG8gc2hvdyBkaWZzIGZvciB0aGUgY3VycmVudCB3aW5kb3cuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X2RpZmZ0aGlzKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgLyogU2V0ICdkaWZmJywgJ3Njcm9sbGJpbmQnIG9uIGFuZCAnd3JhcCcgb2ZmLiAqLworICAgIGRpZmZfd2luX29wdGlvbnMoY3Vyd2luLCBUUlVFKTsKK30KKworLyoKKyAqIFNldCBvcHRpb25zIGluIHdpbmRvdyAid3AiIGZvciBkaWZmIG1vZGUuCisgKi8KKyAgICB2b2lkCitkaWZmX3dpbl9vcHRpb25zKHdwLCBhZGRidWYpCisgICAgd2luX1QJKndwOworICAgIGludAkJYWRkYnVmOwkJLyogQWRkIGJ1ZmZlciB0byBkaWZmLiAqLworeworICAgIHdwLT53X3BfZGlmZiA9IFRSVUU7CisgICAgd3AtPndfcF9zY2IgPSBUUlVFOworICAgIHdwLT53X3Bfd3JhcCA9IEZBTFNFOworIyBpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICB7CisJd2luX1QJICAgICpvbGRfY3Vyd2luID0gY3Vyd2luOworCisJY3Vyd2luID0gd3A7CisJY3VyYnVmID0gY3Vyd2luLT53X2J1ZmZlcjsKKwlzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJmZG0iLCAtMSwgKGNoYXJfdSAqKSJkaWZmIiwKKwkJCQkJCQkgIE9QVF9MT0NBTHxPUFRfRlJFRSk7CisJY3Vyd2luID0gb2xkX2N1cndpbjsKKwljdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworCXdwLT53X3BfZmRjID0gMjsKKwl3cC0+d19wX2ZlbiA9IFRSVUU7CisJd3AtPndfcF9mZGwgPSAwOworCWZvbGRVcGRhdGVBbGwod3ApOworCWNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsgLyogbWFrZSBzdXJlIHRvcGxpbmUgaXMgbm90IGhhbGZ3YXkgYSBmb2xkICovCisgICAgfQorIyBlbmRpZgorI2lmZGVmIEZFQVRfU0NST0xMQklORAorICAgIGlmICh2aW1fc3RyY2hyKHBfc2JvLCAnaCcpID09IE5VTEwpCisJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJzZXQgc2JvKz1ob3IiKTsKKyNlbmRpZgorCisgICAgaWYgKGFkZGJ1ZikKKwlkaWZmX2J1Zl9hZGQod3AtPndfYnVmZmVyKTsKKyAgICByZWRyYXdfd2luX2xhdGVyKHdwLCBOT1RfVkFMSUQpOworfQorCisvKgorICogUmVhZCB0aGUgZGlmZiBvdXRwdXQgYW5kIGFkZCBlYWNoIGVudHJ5IHRvIHRoZSBkaWZmIGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlmZl9yZWFkKGlkeF9vcmlnLCBpZHhfbmV3LCBmbmFtZSkKKyAgICBpbnQJCWlkeF9vcmlnOwkvKiBpZHggb2Ygb3JpZ2luYWwgZmlsZSAqLworICAgIGludAkJaWR4X25ldzsJLyogaWR4IG9mIG5ldyBmaWxlICovCisgICAgY2hhcl91CSpmbmFtZTsJCS8qIG5hbWUgb2YgZGlmZiBvdXRwdXQgZmlsZSAqLworeworICAgIEZJTEUJKmZkOworICAgIGRpZmZfVAkqZHByZXYgPSBOVUxMOworICAgIGRpZmZfVAkqZHAgPSBmaXJzdF9kaWZmOworICAgIGRpZmZfVAkqZG4sICpkcGw7CisgICAgbG9uZwlmMSwgbDEsIGYyLCBsMjsKKyAgICBjaGFyX3UJbGluZWJ1ZltMQlVGTEVOXTsgICAvKiBvbmx5IG5lZWQgdG8gaG9sZCB0aGUgZGlmZiBsaW5lICovCisgICAgaW50CQlkaWZmdHlwZTsKKyAgICBjaGFyX3UJKnA7CisgICAgbG9uZwlvZmY7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCWxudW1fb3JpZywgbG51bV9uZXc7CisgICAgbG9uZwljb3VudF9vcmlnLCBjb3VudF9uZXc7CisgICAgaW50CQlub3RzZXQgPSBUUlVFOwkgICAgLyogYmxvY2sgIipkcCIgbm90IHNldCB5ZXQgKi8KKworICAgIGZkID0gZm9wZW4oKGNoYXIgKilmbmFtZSwgInIiKTsKKyAgICBpZiAoZmQgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKCJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAodGFnX2ZnZXRzKGxpbmVidWYsIExCVUZMRU4sIGZkKSkKKwkgICAgYnJlYWs7CQkvKiBlbmQgb2YgZmlsZSAqLworCWlmICghaXNkaWdpdCgqbGluZWJ1ZikpCisJICAgIGNvbnRpbnVlOwkJLyogbm90IHRoZSBzdGFydCBvZiBhIGRpZmYgYmxvY2sgKi8KKworCS8qIFRoaXMgbGluZSBtdXN0IGJlIG9uZSBvZiB0aHJlZSBmb3JtYXRzOgorCSAqIHtmaXJzdH1bLHtsYXN0fV1je2ZpcnN0fVsse2xhc3R9XQorCSAqIHtmaXJzdH1he2ZpcnN0fVsse2xhc3R9XQorCSAqIHtmaXJzdH1bLHtsYXN0fV1ke2ZpcnN0fQorCSAqLworCXAgPSBsaW5lYnVmOworCWYxID0gZ2V0ZGlnaXRzKCZwKTsKKwlpZiAoKnAgPT0gJywnKQorCXsKKwkgICAgKytwOworCSAgICBsMSA9IGdldGRpZ2l0cygmcCk7CisJfQorCWVsc2UKKwkgICAgbDEgPSBmMTsKKwlpZiAoKnAgIT0gJ2EnICYmICpwICE9ICdjJyAmJiAqcCAhPSAnZCcpCisJICAgIGNvbnRpbnVlOwkJLyogaW52YWxpZCBkaWZmIGZvcm1hdCAqLworCWRpZmZ0eXBlID0gKnArKzsKKwlmMiA9IGdldGRpZ2l0cygmcCk7CisJaWYgKCpwID09ICcsJykKKwl7CisJICAgICsrcDsKKwkgICAgbDIgPSBnZXRkaWdpdHMoJnApOworCX0KKwllbHNlCisJICAgIGwyID0gZjI7CisJaWYgKGwxIDwgZjEgfHwgbDIgPCBmMikKKwkgICAgY29udGludWU7CQkvKiBpbnZhbGlkIGxpbmUgcmFuZ2UgKi8KKworCWlmIChkaWZmdHlwZSA9PSAnYScpCisJeworCSAgICBsbnVtX29yaWcgPSBmMSArIDE7CisJICAgIGNvdW50X29yaWcgPSAwOworCX0KKwllbHNlCisJeworCSAgICBsbnVtX29yaWcgPSBmMTsKKwkgICAgY291bnRfb3JpZyA9IGwxIC0gZjEgKyAxOworCX0KKwlpZiAoZGlmZnR5cGUgPT0gJ2QnKQorCXsKKwkgICAgbG51bV9uZXcgPSBmMiArIDE7CisJICAgIGNvdW50X25ldyA9IDA7CisJfQorCWVsc2UKKwl7CisJICAgIGxudW1fbmV3ID0gZjI7CisJICAgIGNvdW50X25ldyA9IGwyIC0gZjIgKyAxOworCX0KKworCS8qIEdvIG92ZXIgYmxvY2tzIGJlZm9yZSB0aGUgY2hhbmdlLCBmb3Igd2hpY2ggb3JpZyBhbmQgbmV3IGFyZSBlcXVhbC4KKwkgKiBDb3B5IGJsb2NrcyBmcm9tIG9yaWcgdG8gbmV3LiAqLworCXdoaWxlIChkcCAhPSBOVUxMCisJCSYmIGxudW1fb3JpZyA+IGRwLT5kZl9sbnVtW2lkeF9vcmlnXSArIGRwLT5kZl9jb3VudFtpZHhfb3JpZ10pCisJeworCSAgICBpZiAobm90c2V0KQorCQlkaWZmX2NvcHlfZW50cnkoZHByZXYsIGRwLCBpZHhfb3JpZywgaWR4X25ldyk7CisJICAgIGRwcmV2ID0gZHA7CisJICAgIGRwID0gZHAtPmRmX25leHQ7CisJICAgIG5vdHNldCA9IFRSVUU7CisJfQorCisJaWYgKGRwICE9IE5VTEwKKwkJJiYgbG51bV9vcmlnIDw9IGRwLT5kZl9sbnVtW2lkeF9vcmlnXSArIGRwLT5kZl9jb3VudFtpZHhfb3JpZ10KKwkJJiYgbG51bV9vcmlnICsgY291bnRfb3JpZyA+PSBkcC0+ZGZfbG51bVtpZHhfb3JpZ10pCisJeworCSAgICAvKiBOZXcgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBibG9jayhzKS4KKwkgICAgICogRmlyc3QgZmluZCBsYXN0IGJsb2NrIHRoYXQgb3ZlcmxhcHMuICovCisJICAgIGZvciAoZHBsID0gZHA7IGRwbC0+ZGZfbmV4dCAhPSBOVUxMOyBkcGwgPSBkcGwtPmRmX25leHQpCisJCWlmIChsbnVtX29yaWcgKyBjb3VudF9vcmlnIDwgZHBsLT5kZl9uZXh0LT5kZl9sbnVtW2lkeF9vcmlnXSkKKwkJICAgIGJyZWFrOworCisJICAgIC8qIElmIHRoZSBuZXdseSBmb3VuZCBibG9jayBzdGFydHMgYmVmb3JlIHRoZSBvbGQgb25lLCBzZXQgdGhlCisJICAgICAqIHN0YXJ0IGJhY2sgYSBudW1iZXIgb2YgbGluZXMuICovCisJICAgIG9mZiA9IGRwLT5kZl9sbnVtW2lkeF9vcmlnXSAtIGxudW1fb3JpZzsKKwkgICAgaWYgKG9mZiA+IDApCisJICAgIHsKKwkJZm9yIChpID0gaWR4X29yaWc7IGkgPCBpZHhfbmV3OyArK2kpCisJCSAgICBpZiAoZGlmZmJ1ZltpXSAhPSBOVUxMKQorCQkJZHAtPmRmX2xudW1baV0gLT0gb2ZmOworCQlkcC0+ZGZfbG51bVtpZHhfbmV3XSA9IGxudW1fbmV3OworCQlkcC0+ZGZfY291bnRbaWR4X25ld10gPSBjb3VudF9uZXc7CisJICAgIH0KKwkgICAgZWxzZSBpZiAobm90c2V0KQorCSAgICB7CisJCS8qIG5ldyBibG9jayBpbnNpZGUgZXhpc3Rpbmcgb25lLCBhZGp1c3QgbmV3IGJsb2NrICovCisJCWRwLT5kZl9sbnVtW2lkeF9uZXddID0gbG51bV9uZXcgKyBvZmY7CisJCWRwLT5kZl9jb3VudFtpZHhfbmV3XSA9IGNvdW50X25ldyAtIG9mZjsKKwkgICAgfQorCSAgICBlbHNlCisJCS8qIHNlY29uZCBvdmVybGFwIG9mIG5ldyBibG9jayB3aXRoIGV4aXN0aW5nIGJsb2NrICovCisJCWRwLT5kZl9jb3VudFtpZHhfbmV3XSArPSBjb3VudF9uZXcgLSBjb3VudF9vcmlnOworCisJICAgIC8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgdG8gaW5jbHVkZSBhbGwgdGhlIGxpbmVzIHRvIHRoZQorCSAgICAgKiBlbmQgb2YgdGhlIGV4aXN0aW5nIGJsb2NrIG9yIHRoZSBuZXcgZGlmZiwgd2hhdGV2ZXIgZW5kcyBsYXN0LiAqLworCSAgICBvZmYgPSAobG51bV9vcmlnICsgY291bnRfb3JpZykKKwkJCSAtIChkcGwtPmRmX2xudW1baWR4X29yaWddICsgZHBsLT5kZl9jb3VudFtpZHhfb3JpZ10pOworCSAgICBpZiAob2ZmIDwgMCkKKwkgICAgeworCQkvKiBuZXcgY2hhbmdlIGVuZHMgaW4gZXhpc3RpbmcgYmxvY2ssIGFkanVzdCB0aGUgZW5kIGlmIG5vdAorCQkgKiBkb25lIGFscmVhZHkgKi8KKwkJaWYgKG5vdHNldCkKKwkJICAgIGRwLT5kZl9jb3VudFtpZHhfbmV3XSArPSAtb2ZmOworCQlvZmYgPSAwOworCSAgICB9CisJICAgIGZvciAoaSA9IGlkeF9vcmlnOyBpIDwgaWR4X25ldyArICFub3RzZXQ7ICsraSkKKwkJaWYgKGRpZmZidWZbaV0gIT0gTlVMTCkKKwkJICAgIGRwLT5kZl9jb3VudFtpXSA9IGRwbC0+ZGZfbG51bVtpXSArIGRwbC0+ZGZfY291bnRbaV0KKwkJCQkJCSAgICAgICAtIGRwLT5kZl9sbnVtW2ldICsgb2ZmOworCisJICAgIC8qIERlbGV0ZSB0aGUgZGlmZiBibG9ja3MgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIGludG8gb25lLiAqLworCSAgICBkbiA9IGRwLT5kZl9uZXh0OworCSAgICBkcC0+ZGZfbmV4dCA9IGRwbC0+ZGZfbmV4dDsKKwkgICAgd2hpbGUgKGRuICE9IGRwLT5kZl9uZXh0KQorCSAgICB7CisJCWRwbCA9IGRuLT5kZl9uZXh0OworCQl2aW1fZnJlZShkbik7CisJCWRuID0gZHBsOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEFsbG9jYXRlIGEgbmV3IGRpZmZibG9jay4gKi8KKwkgICAgZHAgPSBkaWZmX2FsbG9jX25ldyhkcHJldiwgZHApOworCSAgICBpZiAoZHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJICAgIGRwLT5kZl9sbnVtW2lkeF9vcmlnXSA9IGxudW1fb3JpZzsKKwkgICAgZHAtPmRmX2NvdW50W2lkeF9vcmlnXSA9IGNvdW50X29yaWc7CisJICAgIGRwLT5kZl9sbnVtW2lkeF9uZXddID0gbG51bV9uZXc7CisJICAgIGRwLT5kZl9jb3VudFtpZHhfbmV3XSA9IGNvdW50X25ldzsKKworCSAgICAvKiBTZXQgdmFsdWVzIGZvciBvdGhlciBidWZmZXJzLCB0aGVzZSBtdXN0IGJlIGVxdWFsIHRvIHRoZQorCSAgICAgKiBvcmlnaW5hbCBidWZmZXIsIG90aGVyd2lzZSB0aGVyZSB3b3VsZCBoYXZlIGJlZW4gYSBjaGFuZ2UKKwkgICAgICogYWxyZWFkeS4gKi8KKwkgICAgZm9yIChpID0gaWR4X29yaWcgKyAxOyBpIDwgaWR4X25ldzsgKytpKQorCQlpZiAoZGlmZmJ1ZltpXSAhPSBOVUxMKQorCQkgICAgZGlmZl9jb3B5X2VudHJ5KGRwcmV2LCBkcCwgaWR4X29yaWcsIGkpOworCX0KKwlub3RzZXQgPSBGQUxTRTsJCS8qICIqZHAiIGhhcyBiZWVuIHNldCAqLworICAgIH0KKworICAgIC8qIGZvciByZW1haW5pbmcgZGlmZiBibG9ja3Mgb3JpZyBhbmQgbmV3IGFyZSBlcXVhbCAqLworICAgIHdoaWxlIChkcCAhPSBOVUxMKQorICAgIHsKKwlpZiAobm90c2V0KQorCSAgICBkaWZmX2NvcHlfZW50cnkoZHByZXYsIGRwLCBpZHhfb3JpZywgaWR4X25ldyk7CisJZHByZXYgPSBkcDsKKwlkcCA9IGRwLT5kZl9uZXh0OworCW5vdHNldCA9IFRSVUU7CisgICAgfQorCisgICAgZmNsb3NlKGZkKTsKK30KKworLyoKKyAqIENvcHkgYW4gZW50cnkgYXQgImRwIiBmcm9tICJpZHhfb3JpZyIgdG8gImlkeF9uZXciLgorICovCisgICAgc3RhdGljIHZvaWQKK2RpZmZfY29weV9lbnRyeShkcHJldiwgZHAsIGlkeF9vcmlnLCBpZHhfbmV3KQorICAgIGRpZmZfVAkqZHByZXY7CisgICAgZGlmZl9UCSpkcDsKKyAgICBpbnQJCWlkeF9vcmlnOworICAgIGludAkJaWR4X25ldzsKK3sKKyAgICBsb25nCW9mZjsKKworICAgIGlmIChkcHJldiA9PSBOVUxMKQorCW9mZiA9IDA7CisgICAgZWxzZQorCW9mZiA9IChkcHJldi0+ZGZfbG51bVtpZHhfb3JpZ10gKyBkcHJldi0+ZGZfY291bnRbaWR4X29yaWddKQorCSAgICAtIChkcHJldi0+ZGZfbG51bVtpZHhfbmV3XSArIGRwcmV2LT5kZl9jb3VudFtpZHhfbmV3XSk7CisgICAgZHAtPmRmX2xudW1baWR4X25ld10gPSBkcC0+ZGZfbG51bVtpZHhfb3JpZ10gLSBvZmY7CisgICAgZHAtPmRmX2NvdW50W2lkeF9uZXddID0gZHAtPmRmX2NvdW50W2lkeF9vcmlnXTsKK30KKworLyoKKyAqIENsZWFyIHRoZSBsaXN0IG9mIGRpZmZibG9ja3MuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlmZl9jbGVhcigpCit7CisgICAgZGlmZl9UCSpwLCAqbmV4dF9wOworCisgICAgZm9yIChwID0gZmlyc3RfZGlmZjsgcCAhPSBOVUxMOyBwID0gbmV4dF9wKQorICAgIHsKKwluZXh0X3AgPSBwLT5kZl9uZXh0OworCXZpbV9mcmVlKHApOworICAgIH0KKyAgICBmaXJzdF9kaWZmID0gTlVMTDsKK30KKworLyoKKyAqIENoZWNrIGRpZmYgc3RhdHVzIGZvciBsaW5lICJsbnVtIiBpbiBidWZmZXIgImJ1ZiI6CisgKiBSZXR1cm5zIDAgZm9yIG5vdGhpbmcgc3BlY2lhbAorICogUmV0dXJucyAtMSBmb3IgYSBsaW5lIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGFzIGNoYW5nZWQuCisgKiBSZXR1cm5zIC0yIGZvciBhIGxpbmUgdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgYXMgYWRkZWQvZGVsZXRlZC4KKyAqIFJldHVybnMgPiAwIGZvciBpbnNlcnRpbmcgdGhhdCBtYW55IGZpbGxlciBsaW5lcyBhYm92ZSBpdCAobmV2ZXIgaGFwcGVucworICogd2hlbiAnZGlmZm9wdCcgZG9lc24ndCBjb250YWluICJmaWxsZXIiKS4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd2luZG93cyB3aGVyZSAnZGlmZicgaXMgc2V0LgorICovCisgICAgaW50CitkaWZmX2NoZWNrKHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGludAkJaWR4OwkJLyogaW5kZXggaW4gZGlmZmJ1ZltdIGZvciB0aGlzIGJ1ZmZlciAqLworICAgIGRpZmZfVAkqZHA7CisgICAgaW50CQltYXhjb3VudDsKKyAgICBpbnQJCWk7CisgICAgYnVmX1QJKmJ1ZiA9IHdwLT53X2J1ZmZlcjsKKyAgICBpbnQJCWNtcDsKKworICAgIGlmIChkaWZmX2ludmFsaWQpCisJZXhfZGlmZnVwZGF0ZShOVUxMKTsJCS8qIHVwZGF0ZSBhZnRlciBhIGJpZyBjaGFuZ2UgKi8KKworICAgIGlmIChmaXJzdF9kaWZmID09IE5VTEwgfHwgIXdwLT53X3BfZGlmZikJLyogbm8gZGlmZnMgYXQgYWxsICovCisJcmV0dXJuIDA7CisKKyAgICAvKiBzYWZldHkgY2hlY2s6ICJsbnVtIiBtdXN0IGJlIGEgYnVmZmVyIGxpbmUgKi8KKyAgICBpZiAobG51bSA8IDEgfHwgbG51bSA+IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMSkKKwlyZXR1cm4gMDsKKworICAgIGlkeCA9IGRpZmZfYnVmX2lkeChidWYpOworICAgIGlmIChpZHggPT0gREJfQ09VTlQpCisJcmV0dXJuIDA7CQkvKiBubyBkaWZmcyBmb3IgYnVmZmVyICJidWYiICovCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKiBBIGNsb3NlZCBmb2xkIG5ldmVyIGhhcyBmaWxsZXIgbGluZXMuICovCisgICAgaWYgKGhhc0ZvbGRpbmdXaW4od3AsIGxudW0sIE5VTEwsIE5VTEwsIFRSVUUsIE5VTEwpKQorCXJldHVybiAwOworI2VuZGlmCisKKyAgICAvKiBzZWFyY2ggZm9yIGEgY2hhbmdlIHRoYXQgaW5jbHVkZXMgImxudW0iIGluIHRoZSBsaXN0IG9mIGRpZmZibG9ja3MuICovCisgICAgZm9yIChkcCA9IGZpcnN0X2RpZmY7IGRwICE9IE5VTEw7IGRwID0gZHAtPmRmX25leHQpCisJaWYgKGxudW0gPD0gZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdKQorCSAgICBicmVhazsKKyAgICBpZiAoZHAgPT0gTlVMTCB8fCBsbnVtIDwgZHAtPmRmX2xudW1baWR4XSkKKwlyZXR1cm4gMDsKKworICAgIGlmIChsbnVtIDwgZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdKQorICAgIHsKKwlpbnQJemVybyA9IEZBTFNFOworCisJLyogQ2hhbmdlZCBvciBpbnNlcnRlZCBsaW5lLiAgSWYgdGhlIG90aGVyIGJ1ZmZlcnMgaGF2ZSBhIGNvdW50IG9mCisJICogemVybywgdGhlIGxpbmVzIHdlcmUgaW5zZXJ0ZWQuICBJZiB0aGUgb3RoZXIgYnVmZmVycyBoYXZlIHRoZSBzYW1lCisJICogY291bnQsIGNoZWNrIGlmIHRoZSBsaW5lcyBhcmUgaWRlbnRpY2FsLiAqLworCWNtcCA9IEZBTFNFOworCWZvciAoaSA9IDA7IGkgPCBEQl9DT1VOVDsgKytpKQorCSAgICBpZiAoaSAhPSBpZHggJiYgZGlmZmJ1ZltpXSAhPSBOVUxMKQorCSAgICB7CisJCWlmIChkcC0+ZGZfY291bnRbaV0gPT0gMCkKKwkJICAgIHplcm8gPSBUUlVFOworCQllbHNlCisJCXsKKwkJICAgIGlmIChkcC0+ZGZfY291bnRbaV0gIT0gZHAtPmRmX2NvdW50W2lkeF0pCisJCQlyZXR1cm4gLTE7CSAgICAvKiBuciBvZiBsaW5lcyBjaGFuZ2VkLiAqLworCQkgICAgY21wID0gVFJVRTsKKwkJfQorCSAgICB9CisJaWYgKGNtcCkKKwl7CisJICAgIC8qIENvbXBhcmUgYWxsIGxpbmVzLiAgSWYgdGhleSBhcmUgZXF1YWwgdGhlIGxpbmVzIHdlcmUgaW5zZXJ0ZWQKKwkgICAgICogaW4gc29tZSBidWZmZXJzLCBkZWxldGVkIGluIG90aGVycywgYnV0IG5vdCBjaGFuZ2VkLiAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgREJfQ09VTlQ7ICsraSkKKwkJaWYgKGkgIT0gaWR4ICYmIGRpZmZidWZbaV0gIT0gTlVMTCAmJiBkcC0+ZGZfY291bnRbaV0gIT0gMCkKKwkJICAgIGlmICghZGlmZl9lcXVhbF9lbnRyeShkcCwgaWR4LCBpKSkKKwkJCXJldHVybiAtMTsKKwl9CisJLyogSWYgdGhlcmUgaXMgbm8gYnVmZmVyIHdpdGggemVybyBsaW5lcyB0aGVuIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UKKwkgKiBhbnkgbG9uZ2VyLiAgSGFwcGVucyB3aGVuIG1ha2luZyBhIGNoYW5nZSAob3IgdW5kbykgdGhhdCByZW1vdmVzCisJICogdGhlIGRpZmZlcmVuY2UuICBDYW4ndCByZW1vdmUgdGhlIGVudHJ5IGhlcmUsIHdlIG1pZ2h0IGJlIGhhbGZ3YXkKKwkgKiB1cGRhdGluZyB0aGUgd2luZG93LiAgSnVzdCByZXBvcnQgdGhlIHRleHQgYXMgdW5jaGFuZ2VkLiAgT3RoZXIKKwkgKiB3aW5kb3dzIG1pZ2h0IHN0aWxsIHNob3cgdGhlIGNoYW5nZSB0aG91Z2guICovCisJaWYgKHplcm8gPT0gRkFMU0UpCisJICAgIHJldHVybiAwOworCXJldHVybiAtMjsKKyAgICB9CisKKyAgICAvKiBJZiAnZGlmZm9wdCcgZG9lc24ndCBjb250YWluICJmaWxsZXIiLCByZXR1cm4gMC4gKi8KKyAgICBpZiAoIShkaWZmX2ZsYWdzICYgRElGRl9GSUxMRVIpKQorCXJldHVybiAwOworCisgICAgLyogSW5zZXJ0IGZpbGxlciBsaW5lcyBhYm92ZSB0aGUgbGluZSBqdXN0IGJlbG93IHRoZSBjaGFuZ2UuICBXaWxsIHJldHVybgorICAgICAqIDAgd2hlbiB0aGlzIGJ1ZiBoYWQgdGhlIG1heCBjb3VudC4gKi8KKyAgICBtYXhjb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJaWYgKGRpZmZidWZbaV0gIT0gTlVMTCAmJiBkcC0+ZGZfY291bnRbaV0gPiBtYXhjb3VudCkKKwkgICAgbWF4Y291bnQgPSBkcC0+ZGZfY291bnRbaV07CisgICAgcmV0dXJuIG1heGNvdW50IC0gZHAtPmRmX2NvdW50W2lkeF07Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBlbnRyaWVzIGluIGRpZmYgIipkcCIgYW5kIHJldHVybiBUUlVFIGlmIHRoZXkgYXJlIGVxdWFsLgorICovCisgICAgc3RhdGljIGludAorZGlmZl9lcXVhbF9lbnRyeShkcCwgaWR4MSwgaWR4MikKKyAgICBkaWZmX1QJKmRwOworICAgIGludAkJaWR4MTsKKyAgICBpbnQJCWlkeDI7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWNtcDsKKworICAgIGlmIChkcC0+ZGZfY291bnRbaWR4MV0gIT0gZHAtPmRmX2NvdW50W2lkeDJdKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAoZGlmZl9jaGVja19zYW5pdHkoZHApID09IEZBSUwpCisJcmV0dXJuIEZBTFNFOworICAgIGZvciAoaSA9IDA7IGkgPCBkcC0+ZGZfY291bnRbaWR4MV07ICsraSkKKyAgICB7CisJbGluZSA9IHZpbV9zdHJzYXZlKG1sX2dldF9idWYoZGlmZmJ1ZltpZHgxXSwKKwkJCQkJICAgICAgIGRwLT5kZl9sbnVtW2lkeDFdICsgaSwgRkFMU0UpKTsKKwlpZiAobGluZSA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFMU0U7CisJY21wID0gZGlmZl9jbXAobGluZSwgbWxfZ2V0X2J1ZihkaWZmYnVmW2lkeDJdLAorCQkJCQkgICAgICAgZHAtPmRmX2xudW1baWR4Ml0gKyBpLCBGQUxTRSkpOworCXZpbV9mcmVlKGxpbmUpOworCWlmIChjbXAgIT0gMCkKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIENvbXBhcmUgc3RyaW5ncyAiczEiIGFuZCAiczIiIGFjY29yZGluZyB0byAnZGlmZm9wdCcuCisgKiBSZXR1cm4gbm9uLXplcm8gd2hlbiB0aGV5IGFyZSBkaWZmZXJlbnQuCisgKi8KKyAgICBzdGF0aWMgaW50CitkaWZmX2NtcChzMSwgczIpCisgICAgY2hhcl91CSpzMTsKKyAgICBjaGFyX3UJKnMyOworeworICAgIGNoYXJfdQkqcDEsICpwMjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsOworI2VuZGlmCisKKyAgICBpZiAoKGRpZmZfZmxhZ3MgJiAoRElGRl9JQ0FTRSB8IERJRkZfSVdISVRFKSkgPT0gMCkKKwlyZXR1cm4gU1RSQ01QKHMxLCBzMik7CisgICAgaWYgKChkaWZmX2ZsYWdzICYgRElGRl9JQ0FTRSkgJiYgIShkaWZmX2ZsYWdzICYgRElGRl9JV0hJVEUpKQorCXJldHVybiBNQl9TVFJJQ01QKHMxLCBzMik7CisKKyAgICAvKiBJZ25vcmUgd2hpdGUgc3BhY2UgY2hhbmdlcyBhbmQgcG9zc2libHkgaWdub3JlIGNhc2UuICovCisgICAgcDEgPSBzMTsKKyAgICBwMiA9IHMyOworICAgIHdoaWxlICgqcDEgIT0gTlVMICYmICpwMiAhPSBOVUwpCisgICAgeworCWlmICh2aW1faXN3aGl0ZSgqcDEpICYmIHZpbV9pc3doaXRlKCpwMikpCisJeworCSAgICBwMSA9IHNraXB3aGl0ZShwMSk7CisJICAgIHAyID0gc2tpcHdoaXRlKHAyKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGwgID0gKCptYl9wdHIybGVuX2NoZWNrKShwMSk7CisJICAgIGlmIChsICE9ICgqbWJfcHRyMmxlbl9jaGVjaykocDIpKQorCQlicmVhazsKKwkgICAgaWYgKGwgPiAxKQorCSAgICB7CisJCWlmIChTVFJOQ01QKHAxLCBwMiwgbCkgIT0gMAorCQkJJiYgKCFlbmNfdXRmOAorCQkJICAgIHx8ICEoZGlmZl9mbGFncyAmIERJRkZfSUNBU0UpCisJCQkgICAgfHwgdXRmX2ZvbGQodXRmX3B0cjJjaGFyKHAxKSkKKwkJCQkJICAgICAgICE9IHV0Zl9mb2xkKHV0Zl9wdHIyY2hhcihwMikpKSkKKwkJICAgIGJyZWFrOworCQlwMSArPSBsOworCQlwMiArPSBsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWlmICgqcDEgIT0gKnAyICYmICghKGRpZmZfZmxhZ3MgJiBESUZGX0lDQVNFKQorCQkJCSAgICAgfHwgVE9MT1dFUl9MT0MoKnAxKSAhPSBUT0xPV0VSX0xPQygqcDIpKSkKKwkJICAgIGJyZWFrOworCQkrK3AxOworCQkrK3AyOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIElnbm9yZSB0cmFpbGluZyB3aGl0ZSBzcGFjZS4gKi8KKyAgICBwMSA9IHNraXB3aGl0ZShwMSk7CisgICAgcDIgPSBza2lwd2hpdGUocDIpOworICAgIGlmICgqcDEgIT0gTlVMIHx8ICpwMiAhPSBOVUwpCisJcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxsZXIgbGluZXMgYWJvdmUgImxudW0iLgorICovCisgICAgaW50CitkaWZmX2NoZWNrX2ZpbGwod3AsIGxudW0pCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgaW50CQluOworCisgICAgLyogYmUgcXVpY2sgd2hlbiB0aGVyZSBhcmUgbm8gZmlsbGVyIGxpbmVzICovCisgICAgaWYgKCEoZGlmZl9mbGFncyAmIERJRkZfRklMTEVSKSkKKwlyZXR1cm4gMDsKKyAgICBuID0gZGlmZl9jaGVjayh3cCwgbG51bSk7CisgICAgaWYgKG4gPD0gMCkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gbjsKK30KKworLyoKKyAqIFNldCB0aGUgdG9wbGluZSBvZiAidG93aW4iIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBpbiAiZnJvbXdpbiIsIHNvIHRoYXQgdGhleQorICogc2hvdyB0aGUgc2FtZSBkaWZmJ2VkIGxpbmVzLgorICovCisgICAgdm9pZAorZGlmZl9zZXRfdG9wbGluZShmcm9td2luLCB0b3dpbikKKyAgICB3aW5fVAkqZnJvbXdpbjsKKyAgICB3aW5fVAkqdG93aW47Cit7CisgICAgYnVmX1QJKmJ1ZiA9IGZyb213aW4tPndfYnVmZmVyOworICAgIGxpbmVucl9UCWxudW0gPSBmcm9td2luLT53X3RvcGxpbmU7CisgICAgaW50CQlpZHg7CisgICAgZGlmZl9UCSpkcDsKKyAgICBpbnQJCWk7CisKKyAgICBpZHggPSBkaWZmX2J1Zl9pZHgoYnVmKTsKKyAgICBpZiAoaWR4ID09IERCX0NPVU5UKQorCXJldHVybjsJCS8qIHNhZmV0eSBjaGVjayAqLworCisgICAgaWYgKGRpZmZfaW52YWxpZCkKKwlleF9kaWZmdXBkYXRlKE5VTEwpOwkJLyogdXBkYXRlIGFmdGVyIGEgYmlnIGNoYW5nZSAqLworCisgICAgdG93aW4tPndfdG9wZmlsbCA9IDA7CisKKyAgICAvKiBzZWFyY2ggZm9yIGEgY2hhbmdlIHRoYXQgaW5jbHVkZXMgImxudW0iIGluIHRoZSBsaXN0IG9mIGRpZmZibG9ja3MuICovCisgICAgZm9yIChkcCA9IGZpcnN0X2RpZmY7IGRwICE9IE5VTEw7IGRwID0gZHAtPmRmX25leHQpCisJaWYgKGxudW0gPD0gZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdKQorCSAgICBicmVhazsKKyAgICBpZiAoZHAgPT0gTlVMTCkKKyAgICB7CisJLyogQWZ0ZXIgbGFzdCBjaGFuZ2UsIGNvbXB1dGUgdG9wbGluZSByZWxhdGl2ZSB0byBlbmQgb2YgZmlsZTsgbm8KKwkgKiBmaWxsZXIgbGluZXMuICovCisJdG93aW4tPndfdG9wbGluZSA9IHRvd2luLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50CisJCQkJCSAgIC0gKGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gbG51bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogRmluZCBpbmRleCBmb3IgInRvd2luIi4gKi8KKwlpID0gZGlmZl9idWZfaWR4KHRvd2luLT53X2J1ZmZlcik7CisJaWYgKGkgPT0gREJfQ09VTlQpCisJICAgIHJldHVybjsJCS8qIHNhZmV0eSBjaGVjayAqLworCisJdG93aW4tPndfdG9wbGluZSA9IGxudW0gKyAoZHAtPmRmX2xudW1baV0gLSBkcC0+ZGZfbG51bVtpZHhdKTsKKwlpZiAobG51bSA+PSBkcC0+ZGZfbG51bVtpZHhdKQorCXsKKwkgICAgLyogSW5zaWRlIGEgY2hhbmdlOiBjb21wdXRlIGZpbGxlciBsaW5lcy4gKi8KKwkgICAgaWYgKGRwLT5kZl9jb3VudFtpXSA9PSBkcC0+ZGZfY291bnRbaWR4XSkKKwkJdG93aW4tPndfdG9wZmlsbCA9IGZyb213aW4tPndfdG9wZmlsbDsKKwkgICAgZWxzZSBpZiAoZHAtPmRmX2NvdW50W2ldID4gZHAtPmRmX2NvdW50W2lkeF0pCisJICAgIHsKKwkJaWYgKGxudW0gPT0gZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdKQorCQkgICAgdG93aW4tPndfdG9wbGluZSA9IGRwLT5kZl9sbnVtW2ldICsgZHAtPmRmX2NvdW50W2ldCisJCQkJCQkJIC0gZnJvbXdpbi0+d190b3BmaWxsOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAodG93aW4tPndfdG9wbGluZSA+PSBkcC0+ZGZfbG51bVtpXSArIGRwLT5kZl9jb3VudFtpXSkKKwkJeworCQkgICAgaWYgKGRpZmZfZmxhZ3MgJiBESUZGX0ZJTExFUikKKwkJCXRvd2luLT53X3RvcGZpbGwgPSBkcC0+ZGZfbG51bVtpZHhdCisJCQkJCQkgICArIGRwLT5kZl9jb3VudFtpZHhdIC0gbG51bTsKKwkJICAgIHRvd2luLT53X3RvcGxpbmUgPSBkcC0+ZGZfbG51bVtpXSArIGRwLT5kZl9jb3VudFtpXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIHNhZmV0eSBjaGVjayAoaWYgZGlmZiBpbmZvIGdldHMgb3V0ZGF0ZWQgc3RyYW5nZSB0aGluZ3MgbWF5IGhhcHBlbikgKi8KKyAgICB0b3dpbi0+d19ib3RmaWxsID0gRkFMU0U7CisgICAgaWYgKHRvd2luLT53X3RvcGxpbmUgPiB0b3dpbi0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJdG93aW4tPndfdG9wbGluZSA9IHRvd2luLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50OworCXRvd2luLT53X2JvdGZpbGwgPSBUUlVFOworICAgIH0KKyAgICBpZiAodG93aW4tPndfdG9wbGluZSA8IDEpCisgICAgeworCXRvd2luLT53X3RvcGxpbmUgPSAxOworCXRvd2luLT53X3RvcGZpbGwgPSAwOworICAgIH0KKworICAgIC8qIFdoZW4gd190b3BsaW5lIGNoYW5nZXMgbmVlZCB0byByZWNvbXB1dGUgd19ib3RsaW5lIGFuZCBjdXJzb3IgcG9zaXRpb24gKi8KKyAgICBpbnZhbGlkYXRlX2JvdGxpbmVfd2luKHRvd2luKTsKKyAgICBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnNfd2luKHRvd2luKTsKKworICAgIGNoZWNrX3RvcGZpbGwodG93aW4sIEZBTFNFKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAodm9pZCloYXNGb2xkaW5nV2luKHRvd2luLCB0b3dpbi0+d190b3BsaW5lLCAmdG93aW4tPndfdG9wbGluZSwKKwkJCQkJCQkgICAgTlVMTCwgVFJVRSwgTlVMTCk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gJ2RpZmZvcHQnIGlzIGNoYW5nZWQuCisgKi8KKyAgICBpbnQKK2RpZmZvcHRfY2hhbmdlZCgpCit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJZGlmZl9jb250ZXh0X25ldyA9IDY7CisgICAgaW50CQlkaWZmX2ZsYWdzX25ldyA9IDA7CisKKyAgICBwID0gcF9kaXA7CisgICAgd2hpbGUgKCpwICE9IE5VTCkKKyAgICB7CisJaWYgKFNUUk5DTVAocCwgImZpbGxlciIsIDYpID09IDApCisJeworCSAgICBwICs9IDY7CisJICAgIGRpZmZfZmxhZ3NfbmV3IHw9IERJRkZfRklMTEVSOworCX0KKwllbHNlIGlmIChTVFJOQ01QKHAsICJjb250ZXh0OiIsIDgpID09IDAgJiYgVklNX0lTRElHSVQocFs4XSkpCisJeworCSAgICBwICs9IDg7CisJICAgIGRpZmZfY29udGV4dF9uZXcgPSBnZXRkaWdpdHMoJnApOworCX0KKwllbHNlIGlmIChTVFJOQ01QKHAsICJpY2FzZSIsIDUpID09IDApCisJeworCSAgICBwICs9IDU7CisJICAgIGRpZmZfZmxhZ3NfbmV3IHw9IERJRkZfSUNBU0U7CisJfQorCWVsc2UgaWYgKFNUUk5DTVAocCwgIml3aGl0ZSIsIDYpID09IDApCisJeworCSAgICBwICs9IDY7CisJICAgIGRpZmZfZmxhZ3NfbmV3IHw9IERJRkZfSVdISVRFOworCX0KKwlpZiAoKnAgIT0gJywnICYmICpwICE9IE5VTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJaWYgKCpwID09ICcsJykKKwkgICAgKytwOworICAgIH0KKworICAgIC8qIElmICJpY2FzZSIgb3IgIml3aGl0ZSIgd2FzIGFkZGVkIG9yIHJlbW92ZWQsIG5lZWQgdG8gdXBkYXRlIHRoZSBkaWZmLiAqLworICAgIGlmIChkaWZmX2ZsYWdzICE9IGRpZmZfZmxhZ3NfbmV3KQorCWRpZmZfaW52YWxpZCA9IFRSVUU7CisKKyAgICBkaWZmX2ZsYWdzID0gZGlmZl9mbGFnc19uZXc7CisgICAgZGlmZl9jb250ZXh0ID0gZGlmZl9jb250ZXh0X25ldzsKKworICAgIGRpZmZfcmVkcmF3KFRSVUUpOworCisgICAgLyogcmVjb21wdXRlIHRoZSBzY3JvbGwgYmluZGluZyB3aXRoIHRoZSBuZXcgb3B0aW9uIHZhbHVlLCBtYXkKKyAgICAgKiByZW1vdmUgb3IgYWRkIGZpbGxlciBsaW5lcyAqLworICAgIGNoZWNrX3Njcm9sbGJpbmQoKGxpbmVucl9UKTAsIDBMKTsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEZpbmQgdGhlIGRpZmZlcmVuY2Ugd2l0aGluIGEgY2hhbmdlZCBsaW5lLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBsaW5lIHdhcyBhZGRlZCwgbm8gb3RoZXIgYnVmZmVyIGhhcyBpdC4KKyAqLworICAgIGludAorZGlmZl9maW5kX2NoYW5nZSh3cCwgbG51bSwgc3RhcnRwLCBlbmRwKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJKnN0YXJ0cDsJLyogZmlyc3QgY2hhciBvZiB0aGUgY2hhbmdlICovCisgICAgaW50CQkqZW5kcDsJCS8qIGxhc3QgY2hhciBvZiB0aGUgY2hhbmdlICovCit7CisgICAgY2hhcl91CSpsaW5lX29yZzsKKyAgICBjaGFyX3UJKmxpbmVfbmV3OworICAgIGludAkJaTsKKyAgICBpbnQJCXNpLCBlaV9vcmcsIGVpX25ldzsKKyAgICBkaWZmX1QJKmRwOworICAgIGludAkJaWR4OworICAgIGludAkJb2ZmOworICAgIGludAkJYWRkZWQgPSBUUlVFOworCisgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGxpbmUsIHRoZSBuZXh0IG1sX2dldCgpIHdpbGwgaW52YWxpZGF0ZSBpdC4gKi8KKyAgICBsaW5lX29yZyA9IHZpbV9zdHJzYXZlKG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBsbnVtLCBGQUxTRSkpOworICAgIGlmIChsaW5lX29yZyA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworICAgIGlkeCA9IGRpZmZfYnVmX2lkeCh3cC0+d19idWZmZXIpOworICAgIGlmIChpZHggPT0gREJfQ09VTlQpCS8qIGNhbm5vdCBoYXBwZW4gKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBzZWFyY2ggZm9yIGEgY2hhbmdlIHRoYXQgaW5jbHVkZXMgImxudW0iIGluIHRoZSBsaXN0IG9mIGRpZmZibG9ja3MuICovCisgICAgZm9yIChkcCA9IGZpcnN0X2RpZmY7IGRwICE9IE5VTEw7IGRwID0gZHAtPmRmX25leHQpCisJaWYgKGxudW0gPD0gZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdKQorCSAgICBicmVhazsKKyAgICBpZiAoZHAgPT0gTlVMTCB8fCBkaWZmX2NoZWNrX3Nhbml0eShkcCkgPT0gRkFJTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBvZmYgPSBsbnVtIC0gZHAtPmRmX2xudW1baWR4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQl9DT1VOVDsgKytpKQorCWlmIChkaWZmYnVmW2ldICE9IE5VTEwgJiYgaSAhPSBpZHgpCisJeworCSAgICAvKiBTa2lwIGxpbmVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgb3RoZXIgY2hhbmdlIChmaWxsZXIgbGluZXMpLiAqLworCSAgICBpZiAob2ZmID49IGRwLT5kZl9jb3VudFtpXSkKKwkJY29udGludWU7CisJICAgIGFkZGVkID0gRkFMU0U7CisJICAgIGxpbmVfbmV3ID0gbWxfZ2V0X2J1ZihkaWZmYnVmW2ldLCBkcC0+ZGZfbG51bVtpXSArIG9mZiwgRkFMU0UpOworCisJICAgIC8qIFNlYXJjaCBmb3Igc3RhcnQgb2YgZGlmZmVyZW5jZSAqLworCSAgICBmb3IgKHNpID0gMDsgbGluZV9vcmdbc2ldICE9IE5VTCAmJiBsaW5lX29yZ1tzaV0gPT0gbGluZV9uZXdbc2ldOyApCisJCSsrc2k7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCS8qIE1vdmUgYmFjayB0byBmaXJzdCBieXRlIG9mIGNoYXJhY3RlciBpbiBib3RoIGxpbmVzIChtYXkKKwkJICogaGF2ZSAibm5eIiBpbiBsaW5lX29yZyBhbmQgIm5eIGluIGxpbmVfbmV3KS4gKi8KKwkJc2kgLT0gKCptYl9oZWFkX29mZikobGluZV9vcmcsIGxpbmVfb3JnICsgc2kpOworCQlzaSAtPSAoKm1iX2hlYWRfb2ZmKShsaW5lX25ldywgbGluZV9uZXcgKyBzaSk7CisJICAgIH0KKyNlbmRpZgorCSAgICBpZiAoKnN0YXJ0cCA+IHNpKQorCQkqc3RhcnRwID0gc2k7CisKKwkgICAgLyogU2VhcmNoIGZvciBlbmQgb2YgZGlmZmVyZW5jZSwgaWYgYW55LiAqLworCSAgICBpZiAobGluZV9vcmdbc2ldICE9IE5VTCB8fCBsaW5lX25ld1tzaV0gIT0gTlVMKQorCSAgICB7CisJCWVpX29yZyA9IChpbnQpU1RSTEVOKGxpbmVfb3JnKTsKKwkJZWlfbmV3ID0gKGludClTVFJMRU4obGluZV9uZXcpOworCQl3aGlsZSAoZWlfb3JnID49ICpzdGFydHAgJiYgZWlfbmV3ID49ICpzdGFydHAKKwkJCSYmIGVpX29yZyA+PSAwICYmIGVpX25ldyA+PSAwCisJCQkmJiBsaW5lX29yZ1tlaV9vcmddID09IGxpbmVfbmV3W2VpX25ld10pCisJCXsKKwkJICAgIC0tZWlfb3JnOworCQkgICAgLS1laV9uZXc7CisJCX0KKwkJaWYgKCplbmRwIDwgZWlfb3JnKQorCQkgICAgKmVuZHAgPSBlaV9vcmc7CisJICAgIH0KKwl9CisKKyAgICB2aW1fZnJlZShsaW5lX29yZyk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCisjaWYgZGVmaW5lZChGRUFUX0ZPTERJTkcpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgaWYgbGluZSAibG51bSIgaXMgbm90IGNsb3NlIHRvIGEgZGlmZiBibG9jaywgdGhpcyBsaW5lIHNob3VsZAorICogYmUgaW4gYSBmb2xkLgorICogUmV0dXJuIEZBTFNFIGlmIHRoZXJlIGFyZSBubyBkaWZmIGJsb2NrcyBhdCBhbGwgaW4gdGhpcyB3aW5kb3cuCisgKi8KKyAgICBpbnQKK2RpZmZfaW5mb2xkKHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGludAkJaTsKKyAgICBpbnQJCWlkeCA9IC0xOworICAgIGludAkJb3RoZXIgPSBGQUxTRTsKKyAgICBkaWZmX1QJKmRwOworCisgICAgLyogUmV0dXJuIGlmICdkaWZmJyBpc24ndCBzZXQuICovCisgICAgaWYgKCF3cC0+d19wX2RpZmYpCisJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisgICAgeworCWlmIChkaWZmYnVmW2ldID09IHdwLT53X2J1ZmZlcikKKwkgICAgaWR4ID0gaTsKKwllbHNlIGlmIChkaWZmYnVmW2ldICE9IE5VTEwpCisJICAgIG90aGVyID0gVFJVRTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gaGVyZSBpZiB0aGVyZSBhcmUgbm8gZGlmZnMgaW4gdGhlIHdpbmRvdyAqLworICAgIGlmIChpZHggPT0gLTEgfHwgIW90aGVyKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChkaWZmX2ludmFsaWQpCisJZXhfZGlmZnVwZGF0ZShOVUxMKTsJCS8qIHVwZGF0ZSBhZnRlciBhIGJpZyBjaGFuZ2UgKi8KKworICAgIC8qIFJldHVybiBpZiB0aGVyZSBhcmUgbm8gZGlmZiBibG9ja3MuICBBbGwgbGluZXMgd2lsbCBiZSBmb2xkZWQuICovCisgICAgaWYgKGZpcnN0X2RpZmYgPT0gTlVMTCkKKwlyZXR1cm4gVFJVRTsKKworICAgIGZvciAoZHAgPSBmaXJzdF9kaWZmOyBkcCAhPSBOVUxMOyBkcCA9IGRwLT5kZl9uZXh0KQorICAgIHsKKwkvKiBJZiB0aGlzIGNoYW5nZSBpcyBiZWxvdyB0aGUgbGluZSB0aGVyZSBjYW4ndCBiZSBhbnkgZnVydGhlciBtYXRjaC4gKi8KKwlpZiAoZHAtPmRmX2xudW1baWR4XSAtIGRpZmZfY29udGV4dCA+IGxudW0pCisJICAgIGJyZWFrOworCS8qIElmIHRoaXMgY2hhbmdlIGVuZHMgYmVmb3JlIHRoZSBsaW5lIHdlIGhhdmUgYSBtYXRjaC4gKi8KKwlpZiAoZHAtPmRmX2xudW1baWR4XSArIGRwLT5kZl9jb3VudFtpZHhdICsgZGlmZl9jb250ZXh0ID4gbG51bSkKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICogImRwIiBhbmQgImRvIiBjb21tYW5kcy4KKyAqLworICAgIHZvaWQKK252X2RpZmZnZXRwdXQocHV0KQorICAgIGludAkJcHV0OworeworICAgIGV4YXJnX1QJZWE7CisKKyAgICBlYS5hcmcgPSAoY2hhcl91ICopIiI7CisgICAgaWYgKHB1dCkKKwllYS5jbWRpZHggPSBDTURfZGlmZnB1dDsKKyAgICBlbHNlCisJZWEuY21kaWR4ID0gQ01EX2RpZmZnZXQ7CisgICAgZWEuYWRkcl9jb3VudCA9IDA7CisgICAgZWEubGluZTEgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgZWEubGluZTIgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgZXhfZGlmZmdldHB1dCgmZWEpOworfQorCisvKgorICogIjpkaWZmZ2V0IgorICogIjpkaWZmcHV0IgorICovCisgICAgdm9pZAorZXhfZGlmZmdldHB1dChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQljb3VudDsKKyAgICBsaW5lbnJfVAlvZmYgPSAwOworICAgIGRpZmZfVAkqZHA7CisgICAgZGlmZl9UCSpkcHJldjsKKyAgICBkaWZmX1QJKmRmcmVlOworICAgIGludAkJaWR4X2N1cjsKKyAgICBpbnQJCWlkeF9vdGhlcjsKKyAgICBpbnQJCWlkeF9mcm9tOworICAgIGludAkJaWR4X3RvOworICAgIGludAkJaTsKKyAgICBpbnQJCWFkZGVkOworICAgIGNoYXJfdQkqcDsKKyAgICBhY29fc2F2ZV9UCWFjbzsKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJc3RhcnRfc2tpcCwgZW5kX3NraXA7CisgICAgaW50CQluZXdfY291bnQ7CisKKyAgICAvKiBGaW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBpbiB0aGUgbGlzdCBvZiBkaWZmIGJ1ZmZlcnMuICovCisgICAgaWR4X2N1ciA9IGRpZmZfYnVmX2lkeChjdXJidWYpOworICAgIGlmIChpZHhfY3VyID09IERCX0NPVU5UKQorICAgIHsKKwlFTVNHKF8oIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCplYXAtPmFyZyA9PSBOVUwpCisgICAgeworCS8qIE5vIGFyZ3VtZW50OiBGaW5kIHRoZSBvdGhlciBidWZmZXIgaW4gdGhlIGxpc3Qgb2YgZGlmZiBidWZmZXJzLiAqLworCWZvciAoaWR4X290aGVyID0gMDsgaWR4X290aGVyIDwgREJfQ09VTlQ7ICsraWR4X290aGVyKQorCSAgICBpZiAoZGlmZmJ1ZltpZHhfb3RoZXJdICE9IGN1cmJ1ZiAmJiBkaWZmYnVmW2lkeF9vdGhlcl0gIT0gTlVMTCkKKwkJYnJlYWs7CisJaWYgKGlkeF9vdGhlciA9PSBEQl9DT1VOVCkKKwl7CisJICAgIEVNU0coXygiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIpKTsKKwkgICAgcmV0dXJuOworCX0KKworCS8qIENoZWNrIHRoYXQgdGhlcmUgaXNuJ3QgYSB0aGlyZCBidWZmZXIgaW4gdGhlIGxpc3QgKi8KKwlmb3IgKGkgPSBpZHhfb3RoZXIgKyAxOyBpIDwgREJfQ09VTlQ7ICsraSkKKwkgICAgaWYgKGRpZmZidWZbaV0gIT0gY3VyYnVmICYmIGRpZmZidWZbaV0gIT0gTlVMTCkKKwkgICAgeworCQlFTVNHKF8oIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIpKTsKKwkJcmV0dXJuOworCSAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogQnVmZmVyIG51bWJlciBvciBwYXR0ZXJuIGdpdmVuLiAgSWdub3JlIHRyYWlsaW5nIHdoaXRlIHNwYWNlLiAqLworCXAgPSBlYXAtPmFyZyArIFNUUkxFTihlYXAtPmFyZyk7CisJd2hpbGUgKHAgPiBlYXAtPmFyZyAmJiB2aW1faXN3aGl0ZShwWy0xXSkpCisJICAgIC0tcDsKKwlmb3IgKGkgPSAwOyB2aW1faXNkaWdpdChlYXAtPmFyZ1tpXSkgJiYgZWFwLT5hcmcgKyBpIDwgcDsgKytpKQorCSAgICA7CisJaWYgKGVhcC0+YXJnICsgaSA9PSBwKQkgICAgLyogZGlnaXRzIG9ubHkgKi8KKwkgICAgaSA9IGF0b2woKGNoYXIgKillYXAtPmFyZyk7CisJZWxzZQorCXsKKwkgICAgaSA9IGJ1Zmxpc3RfZmluZHBhdChlYXAtPmFyZywgcCwgRkFMU0UsIFRSVUUpOworCSAgICBpZiAoaSA8IDApCisJCXJldHVybjsJCS8qIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBnaXZlbiAqLworCX0KKwlidWYgPSBidWZsaXN0X2ZpbmRucihpKTsKKwlpZiAoYnVmID09IE5VTEwpCisJeworCSAgICBFTVNHMihfKCJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiKSwgZWFwLT5hcmcpOworCSAgICByZXR1cm47CisJfQorCWlkeF9vdGhlciA9IGRpZmZfYnVmX2lkeChidWYpOworCWlmIChpZHhfb3RoZXIgPT0gREJfQ09VTlQpCisJeworCSAgICBFTVNHMihfKCJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiKSwgZWFwLT5hcmcpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIGRpZmZfYnVzeSA9IFRSVUU7CisKKyAgICAvKiBXaGVuIG5vIHJhbmdlIGdpdmVuIGluY2x1ZGUgdGhlIGxpbmUgYWJvdmUgb3IgYmVsb3cgdGhlIGN1cnNvci4gKi8KKyAgICBpZiAoZWFwLT5hZGRyX2NvdW50ID09IDApCisgICAgeworCS8qIE1ha2UgaXQgcG9zc2libGUgdGhhdCAiOmRpZmZnZXQiIG9uIHRoZSBsYXN0IGxpbmUgZ2V0cyBsaW5lIGJlbG93CisJICogdGhlIGN1cnNvciBsaW5lIHdoZW4gdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBhYm92ZSB0aGUgY3Vyc29yLiAqLworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfZGlmZmdldAorCQkmJiBlYXAtPmxpbmUxID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50CisJCSYmIGRpZmZfY2hlY2soY3Vyd2luLCBlYXAtPmxpbmUxKSA9PSAwCisJCSYmIChlYXAtPmxpbmUxID09IDEgfHwgZGlmZl9jaGVjayhjdXJ3aW4sIGVhcC0+bGluZTEgLSAxKSA9PSAwKSkKKwkgICAgKytlYXAtPmxpbmUyOworCWVsc2UgaWYgKGVhcC0+bGluZTEgPiAwKQorCSAgICAtLWVhcC0+bGluZTE7CisgICAgfQorCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9kaWZmZ2V0KQorICAgIHsKKwlpZHhfZnJvbSA9IGlkeF9vdGhlcjsKKwlpZHhfdG8gPSBpZHhfY3VyOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlkeF9mcm9tID0gaWR4X2N1cjsKKwlpZHhfdG8gPSBpZHhfb3RoZXI7CisJLyogTmVlZCB0byBtYWtlIHRoZSBvdGhlciBidWZmZXIgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGJlIGFibGUgdG8gbWFrZQorCSAqIGNoYW5nZXMgaW4gaXQuICovCisJLyogc2V0IGN1cndpbi9jdXJidWYgdG8gYnVmIGFuZCBzYXZlIGEgZmV3IHRoaW5ncyAqLworCWF1Y21kX3ByZXBidWYoJmFjbywgZGlmZmJ1ZltpZHhfb3RoZXJdKTsKKyAgICB9CisKKyAgICBkcHJldiA9IE5VTEw7CisgICAgZm9yIChkcCA9IGZpcnN0X2RpZmY7IGRwICE9IE5VTEw7ICkKKyAgICB7CisJaWYgKGRwLT5kZl9sbnVtW2lkeF9jdXJdID4gZWFwLT5saW5lMiArIG9mZikKKwkgICAgYnJlYWs7CS8qIHBhc3QgdGhlIHJhbmdlIHRoYXQgd2FzIHNwZWNpZmllZCAqLworCisJZGZyZWUgPSBOVUxMOworCWxudW0gPSBkcC0+ZGZfbG51bVtpZHhfdG9dOworCWNvdW50ID0gZHAtPmRmX2NvdW50W2lkeF90b107CisJaWYgKGRwLT5kZl9sbnVtW2lkeF9jdXJdICsgZHAtPmRmX2NvdW50W2lkeF9jdXJdID4gZWFwLT5saW5lMSArIG9mZgorCQkmJiB1X3NhdmUobG51bSAtIDEsIGxudW0gKyBjb3VudCkgIT0gRkFJTCkKKwl7CisJICAgIC8qIEluc2lkZSB0aGUgc3BlY2lmaWVkIHJhbmdlIGFuZCBzYXZpbmcgZm9yIHVuZG8gd29ya2VkLiAqLworCSAgICBzdGFydF9za2lwID0gMDsKKwkgICAgZW5kX3NraXAgPSAwOworCSAgICBpZiAoZWFwLT5hZGRyX2NvdW50ID4gMCkKKwkgICAgeworCQkvKiBBIHJhbmdlIHdhcyBzcGVjaWZpZWQ6IGNoZWNrIGlmIGxpbmVzIG5lZWQgdG8gYmUgc2tpcHBlZC4gKi8KKwkJc3RhcnRfc2tpcCA9IGVhcC0+bGluZTEgKyBvZmYgLSBkcC0+ZGZfbG51bVtpZHhfY3VyXTsKKwkJaWYgKHN0YXJ0X3NraXAgPiAwKQorCQl7CisJCSAgICAvKiByYW5nZSBzdGFydHMgYmVsb3cgc3RhcnQgb2YgY3VycmVudCBkaWZmIGJsb2NrICovCisJCSAgICBpZiAoc3RhcnRfc2tpcCA+IGNvdW50KQorCQkgICAgeworCQkJbG51bSArPSBjb3VudDsKKwkJCWNvdW50ID0gMDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWNvdW50IC09IHN0YXJ0X3NraXA7CisJCQlsbnVtICs9IHN0YXJ0X3NraXA7CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQkgICAgc3RhcnRfc2tpcCA9IDA7CisKKwkJZW5kX3NraXAgPSBkcC0+ZGZfbG51bVtpZHhfY3VyXSArIGRwLT5kZl9jb3VudFtpZHhfY3VyXSAtIDEKKwkJCQkJCQkgLSAoZWFwLT5saW5lMiArIG9mZik7CisJCWlmIChlbmRfc2tpcCA+IDApCisJCXsKKwkJICAgIC8qIHJhbmdlIGVuZHMgYWJvdmUgZW5kIG9mIGN1cnJlbnQvZnJvbSBkaWZmIGJsb2NrICovCisJCSAgICBpZiAoaWR4X2N1ciA9PSBpZHhfZnJvbSkJLyogOmRpZmZwdXQgKi8KKwkJICAgIHsKKwkJCWkgPSBkcC0+ZGZfY291bnRbaWR4X2N1cl0gLSBzdGFydF9za2lwIC0gZW5kX3NraXA7CisJCQlpZiAoY291bnQgPiBpKQorCQkJICAgIGNvdW50ID0gaTsKKwkJICAgIH0KKwkJICAgIGVsc2UJCQkvKiA6ZGlmZmdldCAqLworCQkgICAgeworCQkJY291bnQgLT0gZW5kX3NraXA7CisJCQllbmRfc2tpcCA9IGRwLT5kZl9jb3VudFtpZHhfZnJvbV0gLSBzdGFydF9za2lwIC0gY291bnQ7CisJCQlpZiAoZW5kX3NraXAgPCAwKQorCQkJICAgIGVuZF9za2lwID0gMDsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCSAgICBlbmRfc2tpcCA9IDA7CisJICAgIH0KKworCSAgICBhZGRlZCA9IDA7CisJICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCSAgICB7CisJCW1sX2RlbGV0ZShsbnVtLCBGQUxTRSk7CisJCS0tYWRkZWQ7CisJICAgIH0KKwkgICAgZm9yIChpID0gMDsgaSA8IGRwLT5kZl9jb3VudFtpZHhfZnJvbV0gLSBzdGFydF9za2lwIC0gZW5kX3NraXA7ICsraSkKKwkgICAgeworCQlsaW5lbnJfVCBucjsKKworCQluciA9IGRwLT5kZl9sbnVtW2lkeF9mcm9tXSArIHN0YXJ0X3NraXAgKyBpOworCQlpZiAobnIgPiBkaWZmYnVmW2lkeF9mcm9tXS0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkgICAgYnJlYWs7CisJCXAgPSB2aW1fc3Ryc2F2ZShtbF9nZXRfYnVmKGRpZmZidWZbaWR4X2Zyb21dLCBuciwgRkFMU0UpKTsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJeworCQkgICAgbWxfYXBwZW5kKGxudW0gKyBpIC0gMSwgcCwgMCwgRkFMU0UpOworCQkgICAgdmltX2ZyZWUocCk7CisJCSAgICArK2FkZGVkOworCQl9CisJICAgIH0KKwkgICAgbmV3X2NvdW50ID0gZHAtPmRmX2NvdW50W2lkeF90b10gKyBhZGRlZDsKKwkgICAgZHAtPmRmX2NvdW50W2lkeF90b10gPSBuZXdfY291bnQ7CisKKwkgICAgaWYgKHN0YXJ0X3NraXAgPT0gMCAmJiBlbmRfc2tpcCA9PSAwKQorCSAgICB7CisJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgYnVmZmVycyBhbmQgaWYgdGhlIGRpZmYgaXMKKwkJICogZXF1YWwgaW4gdGhlbS4gKi8KKwkJZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJCSAgICBpZiAoZGlmZmJ1ZltpXSAhPSBOVUxMICYmIGkgIT0gaWR4X2Zyb20gJiYgaSAhPSBpZHhfdG8KKwkJCSAgICAmJiAhZGlmZl9lcXVhbF9lbnRyeShkcCwgaWR4X2Zyb20sIGkpKQorCQkJYnJlYWs7CisJCWlmIChpID09IERCX0NPVU5UKQorCQl7CisJCSAgICAvKiBkZWxldGUgdGhlIGRpZmYgZW50cnksIHRoZSBidWZmZXJzIGFyZSBub3cgZXF1YWwgaGVyZSAqLworCQkgICAgZGZyZWUgPSBkcDsKKwkJICAgIGRwID0gZHAtPmRmX25leHQ7CisJCSAgICBpZiAoZHByZXYgPT0gTlVMTCkKKwkJCWZpcnN0X2RpZmYgPSBkcDsKKwkJICAgIGVsc2UKKwkJCWRwcmV2LT5kZl9uZXh0ID0gZHA7CisJCX0KKwkgICAgfQorCisJICAgIC8qIEFkanVzdCBtYXJrcy4gIFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGZvbGxvd2luZyBlbnRyaWVzISAqLworCSAgICBpZiAoYWRkZWQgIT0gMCkKKwkgICAgeworCQltYXJrX2FkanVzdChsbnVtLCBsbnVtICsgY291bnQgLSAxLCAobG9uZylNQVhMTlVNLCAobG9uZylhZGRlZCk7CisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPj0gbG51bSkKKwkJeworCQkgICAgLyogQWRqdXN0IHRoZSBjdXJzb3IgcG9zaXRpb24gaWYgaXQncyBpbi9hZnRlciB0aGUgY2hhbmdlZAorCQkgICAgICogbGluZXMuICovCisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID49IGxudW0gKyBjb3VudCkKKwkJCWN1cndpbi0+d19jdXJzb3IubG51bSArPSBhZGRlZDsKKwkJICAgIGVsc2UgaWYgKGFkZGVkIDwgMCkKKwkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJCX0KKwkgICAgfQorCSAgICBjaGFuZ2VkX2xpbmVzKGxudW0sIDAsIGxudW0gKyBjb3VudCwgKGxvbmcpYWRkZWQpOworCisJICAgIGlmIChkZnJlZSAhPSBOVUxMKQorCSAgICB7CisJCS8qIERpZmYgaXMgZGVsZXRlZCwgdXBkYXRlIGZvbGRzIGluIG90aGVyIHdpbmRvd3MuICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWRpZmZfZm9sZF91cGRhdGUoZGZyZWUsIGlkeF90byk7CisjZW5kaWYKKwkJdmltX2ZyZWUoZGZyZWUpOworCSAgICB9CisJICAgIGVsc2UKKwkJLyogbWFya19hZGp1c3QoKSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjb3VudCBpbiBhIHdyb25nIHdheSAqLworCQlkcC0+ZGZfY291bnRbaWR4X3RvXSA9IG5ld19jb3VudDsKKworCSAgICAvKiBXaGVuIGNoYW5naW5nIHRoZSBjdXJyZW50IGJ1ZmZlciwga2VlcCB0cmFjayBvZiBsaW5lIG51bWJlcnMgKi8KKwkgICAgaWYgKGlkeF9jdXIgPT0gaWR4X3RvKQorCQlvZmYgKz0gYWRkZWQ7CisJfQorCisJLyogSWYgYmVmb3JlIHRoZSByYW5nZSBvciBub3QgZGVsZXRlZCwgZ28gdG8gbmV4dCBkaWZmLiAqLworCWlmIChkZnJlZSA9PSBOVUxMKQorCXsKKwkgICAgZHByZXYgPSBkcDsKKwkgICAgZHAgPSBkcC0+ZGZfbmV4dDsKKwl9CisgICAgfQorCisgICAgLyogcmVzdG9yZSBjdXJ3aW4vY3VyYnVmIGFuZCBhIGZldyBvdGhlciB0aGluZ3MgKi8KKyAgICBpZiAoaWR4X290aGVyID09IGlkeF90bykKKyAgICB7CisJLyogU3luY2luZyB1bmRvIG9ubHkgd29ya3MgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciwgYnV0IHdlIGNoYW5nZQorCSAqIGFub3RoZXIgYnVmZmVyLiAgU3luYyB1bmRvIGlmIHRoZSBjb21tYW5kIHdhcyB0eXBlZC4gIFRoaXMgaXNuJ3QKKwkgKiAxMDAlIHJpZ2h0IHdoZW4gIjpkaWZmcHV0IiBpcyB1c2VkIGluIGEgZnVuY3Rpb24gb3IgbWFwcGluZy4gKi8KKwlpZiAoS2V5VHlwZWQpCisJICAgIHVfc3luYygpOworCWF1Y21kX3Jlc3RidWYoJmFjbyk7CisgICAgfQorCisgICAgZGlmZl9idXN5ID0gRkFMU0U7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBjdXJzb3IgaXMgb24gYSB2YWxpZCBjaGFyYWN0ZXIgYW5kIHVwZGF0ZSBpdCdzIHBvc2l0aW9uLgorICAgICAqIFdoZW4gdGhlcmUgd2VyZSBmaWxsZXIgbGluZXMgdGhlIHRvcGxpbmUgaGFzIGJlY29tZSBpbnZhbGlkLiAqLworICAgIGNoZWNrX2N1cnNvcigpOworICAgIGNoYW5nZWRfbGluZV9hYnZfY3VycygpOworCisgICAgLyogQWxzbyBuZWVkIHRvIHJlZHJhdyB0aGUgb3RoZXIgYnVmZmVycy4gKi8KKyAgICBkaWZmX3JlZHJhdyhGQUxTRSk7Cit9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKy8qCisgKiBVcGRhdGUgZm9sZHMgZm9yIGFsbCBkaWZmIGJ1ZmZlcnMgZm9yIGVudHJ5ICJkcCIuCisgKiBTa2lwIGJ1ZmZlciB3aXRoIGluZGV4ICJza2lwX2lkeCIuCisgKiBXaGVuIHRoZXJlIGFyZSBubyBkaWZmcywgYWxsIGZvbGRzIGFyZSByZW1vdmVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2RpZmZfZm9sZF91cGRhdGUoZHAsIHNraXBfaWR4KQorICAgIGRpZmZfVAkqZHA7CisgICAgaW50CQlza2lwX2lkeDsKK3sKKyAgICBpbnQJCWk7CisgICAgd2luX1QJKndwOworCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisJZm9yIChpID0gMDsgaSA8IERCX0NPVU5UOyArK2kpCisJICAgIGlmIChkaWZmYnVmW2ldID09IHdwLT53X2J1ZmZlciAmJiBpICE9IHNraXBfaWR4KQorCQlmb2xkVXBkYXRlKHdwLCBkcC0+ZGZfbG51bVtpXSwKKwkJCQkJICAgIGRwLT5kZl9sbnVtW2ldICsgZHAtPmRmX2NvdW50W2ldKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgaWYgYnVmZmVyICJidWYiIGlzIGluIGRpZmYtbW9kZS4KKyAqLworICAgIGludAorZGlmZl9tb2RlX2J1ZihidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICByZXR1cm4gZGlmZl9idWZfaWR4KGJ1ZikgIT0gREJfQ09VTlQ7Cit9CisKKy8qCisgKiBNb3ZlICJjb3VudCIgdGltZXMgaW4gZGlyZWN0aW9uICJkaXIiIHRvIHRoZSBuZXh0IGRpZmYgYmxvY2suCisgKiBSZXR1cm4gRkFJTCBpZiB0aGVyZSBpc24ndCBzdWNoIGEgZGlmZiBibG9jay4KKyAqLworICAgIGludAorZGlmZl9tb3ZlX3RvKGRpciwgY291bnQpCisgICAgaW50CQlkaXI7CisgICAgbG9uZwljb3VudDsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBsaW5lbnJfVAlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGRpZmZfVAkqZHA7CisKKyAgICBpZHggPSBkaWZmX2J1Zl9pZHgoY3VyYnVmKTsKKyAgICBpZiAoaWR4ID09IERCX0NPVU5UIHx8IGZpcnN0X2RpZmYgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGlmIChkaWZmX2ludmFsaWQpCisJZXhfZGlmZnVwZGF0ZShOVUxMKTsJCS8qIHVwZGF0ZSBhZnRlciBhIGJpZyBjaGFuZ2UgKi8KKworICAgIGlmIChmaXJzdF9kaWZmID09IE5VTEwpCQkvKiBubyBkaWZmcyB0b2RheSAqLworCXJldHVybiBGQUlMOworCisgICAgd2hpbGUgKC0tY291bnQgPj0gMCkKKyAgICB7CisJLyogQ2hlY2sgaWYgYWxyZWFkeSBiZWZvcmUgZmlyc3QgZGlmZi4gKi8KKwlpZiAoZGlyID09IEJBQ0tXQVJEICYmIGxudW0gPD0gZmlyc3RfZGlmZi0+ZGZfbG51bVtpZHhdKQorCSAgICBicmVhazsKKworCWZvciAoZHAgPSBmaXJzdF9kaWZmOyA7IGRwID0gZHAtPmRmX25leHQpCisJeworCSAgICBpZiAoZHAgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGlmICgoZGlyID09IEZPUldBUkQgJiYgbG51bSA8IGRwLT5kZl9sbnVtW2lkeF0pCisJCSAgICB8fCAoZGlyID09IEJBQ0tXQVJECisJCQkmJiAoZHAtPmRmX25leHQgPT0gTlVMTAorCQkJICAgIHx8IGxudW0gPD0gZHAtPmRmX25leHQtPmRmX2xudW1baWR4XSkpKQorCSAgICB7CisJCWxudW0gPSBkcC0+ZGZfbG51bVtpZHhdOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBkb24ndCBlbmQgdXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisgICAgaWYgKGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwlsbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisKKyAgICAvKiBXaGVuIHRoZSBjdXJzb3IgZGlkbid0IG1vdmUgYXQgYWxsIHdlIGZhaWwuICovCisgICAgaWYgKGxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCXJldHVybiBGQUlMOworCisgICAgc2V0cGNtYXJrKCk7CisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRk9MRElORykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBGb3IgbGluZSAibG51bSIgaW4gdGhlIGN1cnJlbnQgd2luZG93IGZpbmQgdGhlIGVxdWl2YWxlbnQgbG51bSBpbiB3aW5kb3cKKyAqICJ3cCIsIGNvbXBlbnNhdGluZyBmb3IgaW5zZXJ0ZWQvZGVsZXRlZCBsaW5lcy4KKyAqLworICAgIGxpbmVucl9UCitkaWZmX2xudW1fd2luKGxudW0sIHdwKQorICAgIGxpbmVucl9UCWxudW07CisgICAgd2luX1QJKndwOworeworICAgIGRpZmZfVAkqZHA7CisgICAgaW50CQlpZHg7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCW47CisKKyAgICBpZHggPSBkaWZmX2J1Zl9pZHgoY3VyYnVmKTsKKyAgICBpZiAoaWR4ID09IERCX0NPVU5UKQkJLyogc2FmZXR5IGNoZWNrICovCisJcmV0dXJuIChsaW5lbnJfVCkwOworCisgICAgaWYgKGRpZmZfaW52YWxpZCkKKwlleF9kaWZmdXBkYXRlKE5VTEwpOwkJLyogdXBkYXRlIGFmdGVyIGEgYmlnIGNoYW5nZSAqLworCisgICAgLyogc2VhcmNoIGZvciBhIGNoYW5nZSB0aGF0IGluY2x1ZGVzICJsbnVtIiBpbiB0aGUgbGlzdCBvZiBkaWZmYmxvY2tzLiAqLworICAgIGZvciAoZHAgPSBmaXJzdF9kaWZmOyBkcCAhPSBOVUxMOyBkcCA9IGRwLT5kZl9uZXh0KQorCWlmIChsbnVtIDw9IGRwLT5kZl9sbnVtW2lkeF0gKyBkcC0+ZGZfY291bnRbaWR4XSkKKwkgICAgYnJlYWs7CisKKyAgICAvKiBXaGVuIGFmdGVyIHRoZSBsYXN0IGNoYW5nZSwgY29tcHV0ZSByZWxhdGl2ZSB0byB0aGUgbGFzdCBsaW5lIG51bWJlci4gKi8KKyAgICBpZiAoZHAgPT0gTlVMTCkKKwlyZXR1cm4gd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQKKwkJCQkJLSAoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLSBsbnVtKTsKKworICAgIC8qIEZpbmQgaW5kZXggZm9yICJ3cCIuICovCisgICAgaSA9IGRpZmZfYnVmX2lkeCh3cC0+d19idWZmZXIpOworICAgIGlmIChpID09IERCX0NPVU5UKQkJCS8qIHNhZmV0eSBjaGVjayAqLworCXJldHVybiAobGluZW5yX1QpMDsKKworICAgIG4gPSBsbnVtICsgKGRwLT5kZl9sbnVtW2ldIC0gZHAtPmRmX2xudW1baWR4XSk7CisgICAgaWYgKG4gPiBkcC0+ZGZfbG51bVtpXSArIGRwLT5kZl9jb3VudFtpXSkKKwluID0gZHAtPmRmX2xudW1baV0gKyBkcC0+ZGZfY291bnRbaV07CisgICAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworI2VuZGlmCS8qIEZFQVRfRElGRiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2RpZ3JhcGguYyBiL3NyYy9kaWdyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2MWNlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kaWdyYXBoLmMKQEAgLTAsMCArMSwyNTEzIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBkaWdyYXBoLmM6IGNvZGUgZm9yIGRpZ3JhcGhzCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChGRUFUX0RJR1JBUEhTKSB8fCBkZWZpbmVkKFBST1RPKQorCisjaWZkZWYgRkVBVF9NQllURQordHlwZWRlZiBpbnQgcmVzdWx0X1Q7CisjZWxzZQordHlwZWRlZiBjaGFyX3UgcmVzdWx0X1Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgZGlncmFwaAoreworICAgIGNoYXJfdQljaGFyMTsKKyAgICBjaGFyX3UJY2hhcjI7CisgICAgcmVzdWx0X1QJcmVzdWx0OworfSBkaWdyX1Q7CisKK3N0YXRpYyBpbnQgZ2V0ZXhhY3RkaWdyYXBoIF9fQVJHUygoaW50LCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgcHJpbnRkaWdyYXBoIF9fQVJHUygoZGlncl9UICopKTsKKworLyogZGlncmFwaHMgYWRkZWQgYnkgdGhlIHVzZXIgKi8KK3N0YXRpYyBnYXJyYXlfVAl1c2VyX2RpZ3JhcGhzID0gezAsIDAsIHNpemVvZihkaWdyX1QpLCAxMCwgTlVMTH07CisKKy8qCisgKiBOb3RlOiBDaGFyYWN0ZXJzIG1hcmtlZCB3aXRoIFhYIGFyZSBub3QgaW5jbHVkZWQgbGl0ZXJhbGx5LCBiZWNhdXNlIHNvbWUKKyAqIGNvbXBpbGVycyBjYW5ub3QgaGFuZGxlIHRoZW0gKEFtaWdhIFNBUy9DIGlzIHRoZSBtb3N0IHBpY2t5IG9uZSkuCisgKi8KKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikKKwkvKgorCSAqIE1TRE9TIGRpZ3JhcGhzLgorCSAqLworZGlncl9UCWRpZ3JhcGhkZWZhdWx0W10gPQorICAgICAgIHt7J0MnLCAnLCcsIDEyOH0sCS8qIH5AIFhYICovCisJeyd1JywgJyInLCAxMjl9LAkvKiCBICovCisJeydlJywgJ1wnJywgMTMwfSwJLyoggiAqLworCXsnYScsICdeJywgMTMxfSwJLyoggyAqLworCXsnYScsICciJywgMTMyfSwJLyoghCAqLworCXsnYScsICdgJywgMTMzfSwJLyoghSAqLworCXsnYScsICdAJywgMTM0fSwJLyoghiAqLworCXsnYycsICcsJywgMTM1fSwJLyogfkcgWFggKi8KKwl7J2UnLCAnXicsIDEzNn0sCS8qIH5IIFhYICovCisJeydlJywgJyInLCAxMzd9LAkvKiCJICovCisJeydlJywgJ2AnLCAxMzh9LAkvKiCKICovCisJeydpJywgJyInLCAxMzl9LAkvKiCLICovCisJeydpJywgJ14nLCAxNDB9LAkvKiCMICovCisJeydpJywgJ2AnLCAxNDF9LAkvKiCNICovCisJeydBJywgJyInLCAxNDJ9LAkvKiB+TiBYWCAqLworCXsnQScsICdAJywgMTQzfSwJLyogjyAqLworCXsnRScsICdcJycsIDE0NH0sCS8qIJAgKi8KKwl7J2EnLCAnZScsIDE0NX0sCS8qIJEgKi8KKwl7J0EnLCAnRScsIDE0Nn0sCS8qIJIgKi8KKwl7J28nLCAnXicsIDE0N30sCS8qIJMgKi8KKwl7J28nLCAnIicsIDE0OH0sCS8qIJQgKi8KKwl7J28nLCAnYCcsIDE0OX0sCS8qIJUgKi8KKwl7J3UnLCAnXicsIDE1MH0sCS8qIJYgKi8KKwl7J3UnLCAnYCcsIDE1MX0sCS8qIJcgKi8KKwl7J3knLCAnIicsIDE1Mn0sCS8qIJggKi8KKwl7J08nLCAnIicsIDE1M30sCS8qIJkgKi8KKwl7J1UnLCAnIicsIDE1NH0sCS8qIJogKi8KKwl7J2MnLCAnfCcsIDE1NX0sCS8qIJsgKi8KKwl7JyQnLCAnJCcsIDE1Nn0sCS8qIJwgKi8KKwl7J1knLCAnLScsIDE1N30sCS8qIH5dIFhYICovCisJeydQJywgJ3QnLCAxNTh9LAkvKiCeICovCisJeydmJywgJ2YnLCAxNTl9LAkvKiCfICovCisJeydhJywgJ1wnJywgMTYwfSwJLyogoCAqLworCXsnaScsICdcJycsIDE2MX0sCS8qIKEgKi8KKwl7J28nLCAnXCcnLCAxNjJ9LAkvKiCiICovCisJeyd1JywgJ1wnJywgMTYzfSwJLyogeCBYWCAqLworCXsnbicsICd+JywgMTY0fSwJLyogpCAqLworCXsnTicsICd+JywgMTY1fSwJLyogpSAqLworCXsnYScsICdhJywgMTY2fSwJLyogpiAqLworCXsnbycsICdvJywgMTY3fSwJLyogpyAqLworCXsnficsICc/JywgMTY4fSwJLyogqCAqLworCXsnLScsICdhJywgMTY5fSwJLyogqSAqLworCXsnYScsICctJywgMTcwfSwJLyogqiAqLworCXsnMScsICcyJywgMTcxfSwJLyogqyAqLworCXsnMScsICc0JywgMTcyfSwJLyogrCAqLworCXsnficsICchJywgMTczfSwJLyogrSAqLworCXsnPCcsICc8JywgMTc0fSwJLyogriAqLworCXsnPicsICc+JywgMTc1fSwJLyogryAqLworCisJeydzJywgJ3MnLCAyMjV9LAkvKiDhICovCisJeydqJywgJ3UnLCAyMzB9LAkvKiDmICovCisJeydvJywgJy8nLCAyMzd9LAkvKiDtICovCisJeycrJywgJy0nLCAyNDF9LAkvKiDxICovCisJeyc+JywgJz0nLCAyNDJ9LAkvKiDyICovCisJeyc8JywgJz0nLCAyNDN9LAkvKiDzICovCisJeyc6JywgJy0nLCAyNDZ9LAkvKiD2ICovCisJeyd+JywgJ34nLCAyNDd9LAkvKiD3ICovCisJeyd+JywgJ28nLCAyNDh9LAkvKiD4ICovCisJeycyJywgJzInLCAyNTN9LAkvKiD9ICovCisJe05VTCwgTlVMLCBOVUx9CisJfTsKKworI2Vsc2UJLyogIU1TRE9TICYmICFPUzIgKi8KKyMgaWZkZWYgX19NSU5UX18KKworCS8qCisJICogQVRBUkkgZGlncmFwaHMKKwkgKi8KK2RpZ3JfVAlkaWdyYXBoZGVmYXVsdFtdID0KKyAgICAgICB7eydDJywgJywnLCAxMjh9LAkvKiB+QCBYWCAqLworCXsndScsICciJywgMTI5fSwJLyoggSAqLworCXsnZScsICdcJycsIDEzMH0sCS8qIIIgKi8KKwl7J2EnLCAnXicsIDEzMX0sCS8qIIMgKi8KKwl7J2EnLCAnIicsIDEzMn0sCS8qIIQgKi8KKwl7J2EnLCAnYCcsIDEzM30sCS8qIIUgKi8KKwl7J2EnLCAnQCcsIDEzNH0sCS8qIIYgKi8KKwl7J2MnLCAnLCcsIDEzNX0sCS8qIH5HIFhYICovCisJeydlJywgJ14nLCAxMzZ9LAkvKiB+SCBYWCAqLworCXsnZScsICciJywgMTM3fSwJLyogiSAqLworCXsnZScsICdgJywgMTM4fSwJLyogiiAqLworCXsnaScsICciJywgMTM5fSwJLyogiyAqLworCXsnaScsICdeJywgMTQwfSwJLyogjCAqLworCXsnaScsICdgJywgMTQxfSwJLyogjSAqLworCXsnQScsICciJywgMTQyfSwJLyogjiAqLworCXsnQScsICdAJywgMTQzfSwJLyogjyAqLworCXsnRScsICdcJycsIDE0NH0sCS8qIJAgKi8KKwl7J2EnLCAnZScsIDE0NX0sCS8qIJEgKi8KKwl7J0EnLCAnRScsIDE0Nn0sCS8qIJIgKi8KKwl7J28nLCAnXicsIDE0N30sCS8qIJMgKi8KKwl7J28nLCAnIicsIDE0OH0sCS8qIJQgKi8KKwl7J28nLCAnYCcsIDE0OX0sCS8qIJUgKi8KKwl7J3UnLCAnXicsIDE1MH0sCS8qIJYgKi8KKwl7J3UnLCAnYCcsIDE1MX0sCS8qIJcgKi8KKwl7J3knLCAnIicsIDE1Mn0sCS8qIJggKi8KKwl7J08nLCAnIicsIDE1M30sCS8qIJkgKi8KKwl7J1UnLCAnIicsIDE1NH0sCS8qIJogKi8KKwl7J2MnLCAnfCcsIDE1NX0sCS8qIJsgKi8KKwl7JyQnLCAnJCcsIDE1Nn0sCS8qIJwgKi8KKwl7J1knLCAnLScsIDE1N30sCS8qIH5dIFhYICovCisJeydzJywgJ3MnLCAxNTh9LAkvKiCeICovCisJeydmJywgJ2YnLCAxNTl9LAkvKiCfICovCisJeydhJywgJ1wnJywgMTYwfSwJLyogoCAqLworCXsnaScsICdcJycsIDE2MX0sCS8qIKEgKi8KKwl7J28nLCAnXCcnLCAxNjJ9LAkvKiCiICovCisJeyd1JywgJ1wnJywgMTYzfSwJLyogoyAqLworCXsnbicsICd+JywgMTY0fSwJLyogpCAqLworCXsnTicsICd+JywgMTY1fSwJLyogpSAqLworCXsnYScsICdhJywgMTY2fSwJLyogpiAqLworCXsnbycsICdvJywgMTY3fSwJLyogpyAqLworCXsnficsICc/JywgMTY4fSwJLyogqCAqLworCXsnLScsICdhJywgMTY5fSwJLyogqSAqLworCXsnYScsICctJywgMTcwfSwJLyogqiAqLworCXsnMScsICcyJywgMTcxfSwJLyogqyAqLworCXsnMScsICc0JywgMTcyfSwJLyogrCAqLworCXsnficsICchJywgMTczfSwJLyogrSAqLworCXsnPCcsICc8JywgMTc0fSwJLyogriAqLworCXsnPicsICc+JywgMTc1fSwJLyogryAqLworCXsnaicsICd1JywgMjMwfSwJLyog5iAqLworCXsnbycsICcvJywgMjM3fSwJLyog7SAqLworCXsnKycsICctJywgMjQxfSwJLyog8SAqLworCXsnPicsICc9JywgMjQyfSwJLyog8iAqLworCXsnPCcsICc9JywgMjQzfSwJLyog8yAqLworCXsnOicsICctJywgMjQ2fSwJLyog9iAqLworCXsnficsICd+JywgMjQ3fSwJLyog9yAqLworCXsnficsICdvJywgMjQ4fSwJLyog+CAqLworCXsnMicsICcyJywgMjUzfSwJLyog/SAqLworCXtOVUwsIE5VTCwgTlVMfQorCX07CisKKyMgZWxzZQkvKiAhX19NSU5UX18gKi8KKyMgIGlmZGVmIEhQVVhfRElHUkFQSFMKKworCS8qCisJICogZGlmZmVyZW50IEhQVVggZGlncmFwaHMKKwkgKi8KK2RpZ3JfVAlkaWdyYXBoZGVmYXVsdFtdID0KKyAgICAgICB7eydBJywgJ2AnLCAxNjF9LAkvKiChICovCisJeydBJywgJ14nLCAxNjJ9LAkvKiCiICovCisJeydFJywgJ2AnLCAxNjN9LAkvKiCjICovCisJeydFJywgJ14nLCAxNjR9LAkvKiCkICovCisJeydFJywgJyInLCAxNjV9LAkvKiClICovCisJeydJJywgJ14nLCAxNjZ9LAkvKiCmICovCisJeydJJywgJyInLCAxNjd9LAkvKiCnICovCisJeydcJycsICdcJycsIDE2OH0sCS8qIKggKi8KKwl7J2AnLCAnYCcsIDE2OX0sCS8qIKkgKi8KKwl7J14nLCAnXicsIDE3MH0sCS8qIKogKi8KKwl7JyInLCAnIicsIDE3MX0sCS8qIKsgKi8KKwl7J34nLCAnficsIDE3Mn0sCS8qIKwgKi8KKwl7J1UnLCAnYCcsIDE3M30sCS8qIK0gKi8KKwl7J1UnLCAnXicsIDE3NH0sCS8qIK4gKi8KKwl7J0wnLCAnPScsIDE3NX0sCS8qIK8gKi8KKwl7J34nLCAnXycsIDE3Nn0sCS8qILAgKi8KKwl7J1knLCAnXCcnLCAxNzd9LAkvKiCxICovCisJeyd5JywgJ1wnJywgMTc4fSwJLyogsiAqLworCXsnficsICdvJywgMTc5fSwJLyogsyAqLworCXsnQycsICcsJywgMTgwfSwJLyogtCAqLworCXsnYycsICcsJywgMTgxfSwJLyogtSAqLworCXsnTicsICd+JywgMTgyfSwJLyogtiAqLworCXsnbicsICd+JywgMTgzfSwJLyogtyAqLworCXsnficsICchJywgMTg0fSwJLyoguCAqLworCXsnficsICc/JywgMTg1fSwJLyoguSAqLworCXsnbycsICd4JywgMTg2fSwJLyoguiAqLworCXsnTCcsICctJywgMTg3fSwJLyoguyAqLworCXsnWScsICc9JywgMTg4fSwJLyogvCAqLworCXsncCcsICdwJywgMTg5fSwJLyogvSAqLworCXsnZicsICdsJywgMTkwfSwJLyogviAqLworCXsnYycsICd8JywgMTkxfSwJLyogvyAqLworCXsnYScsICdeJywgMTkyfSwJLyogwCAqLworCXsnZScsICdeJywgMTkzfSwJLyogwSAqLworCXsnbycsICdeJywgMTk0fSwJLyogwiAqLworCXsndScsICdeJywgMTk1fSwJLyogwyAqLworCXsnYScsICdcJycsIDE5Nn0sCS8qIMQgKi8KKwl7J2UnLCAnXCcnLCAxOTd9LAkvKiDFICovCisJeydvJywgJ1wnJywgMTk4fSwJLyogxiAqLworCXsndScsICdcJycsIDE5OX0sCS8qIMcgKi8KKwl7J2EnLCAnYCcsIDIwMH0sCS8qIMggKi8KKwl7J2UnLCAnYCcsIDIwMX0sCS8qIMkgKi8KKwl7J28nLCAnYCcsIDIwMn0sCS8qIMogKi8KKwl7J3UnLCAnYCcsIDIwM30sCS8qIMsgKi8KKwl7J2EnLCAnIicsIDIwNH0sCS8qIMwgKi8KKwl7J2UnLCAnIicsIDIwNX0sCS8qIM0gKi8KKwl7J28nLCAnIicsIDIwNn0sCS8qIM4gKi8KKwl7J3UnLCAnIicsIDIwN30sCS8qIM8gKi8KKwl7J0EnLCAnbycsIDIwOH0sCS8qINAgKi8KKwl7J2knLCAnXicsIDIwOX0sCS8qINEgKi8KKwl7J08nLCAnLycsIDIxMH0sCS8qINIgKi8KKwl7J0EnLCAnRScsIDIxMX0sCS8qINMgKi8KKwl7J2EnLCAnbycsIDIxMn0sCS8qINQgKi8KKwl7J2knLCAnXCcnLCAyMTN9LAkvKiDVICovCisJeydvJywgJy8nLCAyMTR9LAkvKiDWICovCisJeydhJywgJ2UnLCAyMTV9LAkvKiDXICovCisJeydBJywgJyInLCAyMTZ9LAkvKiDYICovCisJeydpJywgJ2AnLCAyMTd9LAkvKiDZICovCisJeydPJywgJyInLCAyMTh9LAkvKiDaICovCisJeydVJywgJyInLCAyMTl9LAkvKiDbICovCisJeydFJywgJ1wnJywgMjIwfSwJLyog3CAqLworCXsnaScsICciJywgMjIxfSwJLyog3SAqLworCXsncycsICdzJywgMjIyfSwJLyog3iAqLworCXsnTycsICdeJywgMjIzfSwJLyog3yAqLworCXsnQScsICdcJycsIDIyNH0sCS8qIOAgKi8KKwl7J0EnLCAnficsIDIyNX0sCS8qIOEgKi8KKwl7J2EnLCAnficsIDIyNn0sCS8qIOIgKi8KKwl7J0QnLCAnLScsIDIyN30sCS8qIOMgKi8KKwl7J2QnLCAnLScsIDIyOH0sCS8qIOQgKi8KKwl7J0knLCAnXCcnLCAyMjl9LAkvKiDlICovCisJeydJJywgJ2AnLCAyMzB9LAkvKiDmICovCisJeydPJywgJ1wnJywgMjMxfSwJLyog5yAqLworCXsnTycsICdgJywgMjMyfSwJLyog6CAqLworCXsnTycsICd+JywgMjMzfSwJLyog6SAqLworCXsnbycsICd+JywgMjM0fSwJLyog6iAqLworCXsnUycsICd+JywgMjM1fSwJLyog6yAqLworCXsncycsICd+JywgMjM2fSwJLyog7CAqLworCXsnVScsICdcJycsIDIzN30sCS8qIO0gKi8KKwl7J1knLCAnIicsIDIzOH0sCS8qIO4gKi8KKwl7J3knLCAnIicsIDIzOX0sCS8qIO8gKi8KKwl7J3AnLCAnLScsIDI0MH0sCS8qIPAgKi8KKwl7J3AnLCAnficsIDI0MX0sCS8qIPEgKi8KKwl7J34nLCAnLicsIDI0Mn0sCS8qIPIgKi8KKwl7J2onLCAndScsIDI0M30sCS8qIPMgKi8KKwl7J1AnLCAncCcsIDI0NH0sCS8qIPQgKi8KKwl7JzMnLCAnNCcsIDI0NX0sCS8qIPUgKi8KKwl7Jy0nLCAnLScsIDI0Nn0sCS8qIPYgKi8KKwl7JzEnLCAnNCcsIDI0N30sCS8qIPcgKi8KKwl7JzEnLCAnMicsIDI0OH0sCS8qIPggKi8KKwl7J2EnLCAnXycsIDI0OX0sCS8qIPkgKi8KKwl7J28nLCAnXycsIDI1MH0sCS8qIPogKi8KKwl7JzwnLCAnPCcsIDI1MX0sCS8qIPsgKi8KKwl7J3gnLCAneCcsIDI1Mn0sCS8qIPwgKi8KKwl7Jz4nLCAnPicsIDI1M30sCS8qIP0gKi8KKwl7JysnLCAnLScsIDI1NH0sCS8qIP4gKi8KKwl7J24nLCAndScsIDI1NX0sCS8qIHggWFggKi8KKwl7TlVMLCBOVUwsIE5VTH0KKwl9OworCisjICBlbHNlCS8qICFIUFVYX0RJR1JBUEhTICovCisKKyMgICBpZmRlZiBFQkNESUMKKworCS8qCisJICogRUJDRElDIC0gSVNPIGRpZ3JhcGhzCisJICogVE9ETzogRUJDRElDIFRhYmxlIGlzIENvZGUtUGFnZSAxMDQ3CisJICovCitkaWdyX1QJZGlncmFwaGRlZmF1bHRbXSA9CisgICAgICAge3snYScsICdeJywgICAgNjZ9LAkvKiDiICovCisJeydhJywgJyInLCAgICA2N30sCS8qIOQgKi8KKwl7J2EnLCAnYCcsICAgIDY4fSwJLyog4CAqLworCXsnYScsICdcJycsICAgNjl9LAkvKiDhICovCisJeydhJywgJ34nLCAgICA3MH0sCS8qIOMgKi8KKwl7J2EnLCAnQCcsICAgIDcxfSwJLyog5SAqLworCXsnYScsICdhJywgICAgNzF9LAkvKiDlICovCisJeydjJywgJywnLCAgICA3Mn0sCS8qIOcgKi8KKwl7J24nLCAnficsICAgIDczfSwJLyog8SAqLworCXsnYycsICd8JywgICAgNzR9LAkvKiCiICovCisJeydlJywgJ1wnJywgICA4MX0sCS8qIOkgKi8KKwl7J2UnLCAnXicsICAgIDgyfSwJLyog6iAqLworCXsnZScsICciJywgICAgODN9LAkvKiDrICovCisJeydlJywgJ2AnLCAgICA4NH0sCS8qIOggKi8KKwl7J2knLCAnXCcnLCAgIDg1fSwJLyog7SAqLworCXsnaScsICdeJywgICAgODZ9LAkvKiDuICovCisJeydpJywgJyInLCAgICA4N30sCS8qIO8gKi8KKwl7J2knLCAnYCcsICAgIDg4fSwJLyog7CAqLworCXsncycsICdzJywgICAgODl9LAkvKiDfICovCisJeydBJywgJ14nLCAgICA5OH0sCS8qIMIgKi8KKwl7J0EnLCAnIicsICAgIDk5fSwJLyogxCAqLworCXsnQScsICdgJywgICAxMDB9LAkvKiDAICovCisJeydBJywgJ1wnJywgIDEwMX0sCS8qIMEgKi8KKwl7J0EnLCAnficsICAgMTAyfSwJLyogwyAqLworCXsnQScsICdAJywgICAxMDN9LAkvKiDFICovCisJeydBJywgJ0EnLCAgIDEwM30sCS8qIMUgKi8KKwl7J0MnLCAnLCcsICAgMTA0fSwJLyogxyAqLworCXsnTicsICd+JywgICAxMDV9LAkvKiDRICovCisJeyd8JywgJ3wnLCAgIDEwNn0sCS8qIKYgKi8KKwl7J28nLCAnLycsICAgMTEyfSwJLyog+CAqLworCXsnRScsICdcJycsICAxMTN9LAkvKiDJICovCisJeydFJywgJ14nLCAgIDExNH0sCS8qIMogKi8KKwl7J0UnLCAnIicsICAgMTE1fSwJLyogyyAqLworCXsnRScsICdgJywgICAxMTZ9LAkvKiDIICovCisJeydJJywgJ1wnJywgIDExN30sCS8qIM0gKi8KKwl7J0knLCAnXicsICAgMTE4fSwJLyogziAqLworCXsnSScsICciJywgICAxMTl9LAkvKiDPICovCisJeydJJywgJ2AnLCAgIDEyMH0sCS8qIMwgKi8KKwl7J08nLCAnLycsICAgMTI4fSwJLyogMC8gWFggKi8KKwl7JzwnLCAnPCcsICAgMTM4fSwJLyogqyAqLworCXsnPicsICc+JywgICAxMzl9LAkvKiC7ICovCisJeydkJywgJy0nLCAgIDE0MH0sCS8qIPAgKi8KKwl7J3knLCAnXCcnLCAgMTQxfSwJLyog/SAqLworCXsnaScsICdwJywgICAxNDJ9LAkvKiD+ICovCisJeycrJywgJy0nLCAgIDE0M30sCS8qILEgKi8KKwl7J34nLCAnbycsICAgMTQ0fSwJLyogsCAqLworCXsnYScsICctJywgICAxNTR9LAkvKiCqICovCisJeydvJywgJy0nLCAgIDE1NX0sCS8qILogKi8KKwl7J2EnLCAnZScsICAgMTU2fSwJLyog5iAqLworCXsnLCcsICcsJywgICAxNTd9LAkvKiAsIFhYICovCisJeydBJywgJ0UnLCAgIDE1OH0sCS8qIMYgKi8KKwl7J28nLCAneCcsICAgMTU5fSwJLyogpCAtIGN1cnJlbmN5IHN5bWJvbCBpbiBJU08gODg1OS0xICovCisJeydlJywgJz0nLCAgIDE1OX0sCS8qIKQgLSBldXJvIHN5bWJvbCBpbiBJU08gODg1OS0xNSAqLworCXsnaicsICd1JywgICAxNjB9LAkvKiC1ICovCisJeyd5JywgJyInLCAgIDE2N30sCS8qIHggWFggKi8KKwl7J34nLCAnIScsICAgMTcwfSwJLyogoSAqLworCXsnficsICc/JywgICAxNzF9LAkvKiC/ICovCisJeydEJywgJy0nLCAgIDE3Mn0sCS8qINAgKi8KKwl7J0knLCAncCcsICAgMTc0fSwJLyog3iAqLworCXsncicsICdPJywgICAxNzV9LAkvKiCuICovCisJeyctJywgJywnLCAgIDE3Nn0sCS8qIKwgKi8KKwl7JyQnLCAnJCcsICAgMTc3fSwJLyogoyAqLworCXsnWScsICctJywgICAxNzh9LAkvKiClICovCisJeyd+JywgJy4nLCAgIDE3OX0sCS8qILcgKi8KKwl7J2MnLCAnTycsICAgMTgwfSwJLyogqSAqLworCXsncCcsICdhJywgICAxODF9LAkvKiCnICovCisJeydwJywgJ3AnLCAgIDE4Mn0sCS8qILYgKi8KKwl7JzEnLCAnNCcsICAgMTgzfSwJLyogvCAqLworCXsnMScsICcyJywgICAxODR9LAkvKiC9ICovCisJeyczJywgJzQnLCAgIDE4NX0sCS8qIL4gKi8KKwl7J1knLCAnXCcnLCAgMTg2fSwJLyog3SAqLworCXsnIicsICciJywgICAxODd9LAkvKiCoICovCisJeyctJywgJz0nLCAgIDE4OH0sCS8qIK8gKi8KKwl7J1wnJywgJ1wnJywgMTkwfSwJLyogtCAqLworCXsnTycsICdFJywgICAxOTF9LAkvKiDXIC0gT0UgaW4gSVNPIDg4NTktMTUgKi8KKwl7Jy8nLCAnXFwnLCAgMTkxfSwJLyog1yAtIG11bHRpcGxpY2F0aW9uIHN5bWJvbCBpbiBJU08gODg1OS0xICovCisJeyctJywgJy0nLCAgIDIwMn0sCS8qIK0gKi8KKwl7J28nLCAnXicsICAgMjAzfSwJLyog9CAqLworCXsnbycsICciJywgICAyMDR9LAkvKiD2ICovCisJeydvJywgJ2AnLCAgIDIwNX0sCS8qIPIgKi8KKwl7J28nLCAnXCcnLCAgMjA2fSwJLyog8yAqLworCXsnbycsICd+JywgICAyMDd9LAkvKiD1ICovCisJeycxJywgJzEnLCAgIDIxOH0sCS8qILkgKi8KKwl7J3UnLCAnXicsICAgMjE5fSwJLyog+yAqLworCXsndScsICciJywgICAyMjB9LAkvKiD8ICovCisJeyd1JywgJ2AnLCAgIDIyMX0sCS8qIPkgKi8KKwl7J3UnLCAnXCcnLCAgMjIyfSwJLyog+iAqLworCXsnOicsICctJywgICAyMjV9LAkvKiD3IC0gZGl2aXNpb24gc3ltYm9sIGluIElTTyA4ODU5LTEgKi8KKwl7J28nLCAnZScsICAgMjI1fSwJLyog9yAtIG9lIGluIElTTyA4ODU5LTE1ICovCisJeycyJywgJzInLCAgIDIzNH0sCS8qILIgKi8KKwl7J08nLCAnXicsICAgMjM1fSwJLyog1CAqLworCXsnTycsICciJywgICAyMzZ9LAkvKiDWICovCisJeydPJywgJ2AnLCAgIDIzN30sCS8qINIgKi8KKwl7J08nLCAnXCcnLCAgMjM4fSwJLyog0yAqLworCXsnTycsICd+JywgICAyMzl9LAkvKiDVICovCisJeyczJywgJzMnLCAgIDI1MH0sCS8qILMgKi8KKwl7J1UnLCAnXicsICAgMjUxfSwJLyog2yAqLworCXsnVScsICciJywgICAyNTJ9LAkvKiDcICovCisJeydVJywgJ2AnLCAgIDI1M30sCS8qINkgKi8KKwl7J1UnLCAnXCcnLCAgMjU0fSwJLyog2iAqLworCXtOVUwsIE5VTCwgTlVMfQorCX07CisKKyMgICBlbHNlCisjICAgIGlmIGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKEZFQVRfTUJZVEUpCisKKwkvKgorCSAqIE1hY2ludG9zaCBkaWdyYXBocworCSAqLworZGlncl9UCWRpZ3JhcGhkZWZhdWx0W10gPQorICAgICAgIHt7J2EnLCAndCcsIDY0fSwJCS8qIEAgKi8KKwl7J0EnLCAnIicsIDEyOH0sCS8qIH5AIFhYICovCisJeydBJywgJ28nLCAxMjl9LAkvKiDFICovCisJeydDJywgJywnLCAxMzB9LAkvKiDHICovCisJeydFJywgJ1wnJywgMTMxfSwJLyogySAqLworCXsnTicsICd+JywgMTMyfSwJLyog0SAqLworCXsnTycsICciJywgMTMzfSwJLyog1iAqLworCXsnVScsICciJywgMTM0fSwJLyog3CAqLworCXsnYScsICdcJycsIDEzNX0sCS8qIH5HIFhYICovCisJeydhJywgJ2AnLCAxMzZ9LAkvKiB+SCBYWCAqLworCXsnYScsICdeJywgMTM3fSwJLyog4iAqLworCXsnYScsICciJywgMTM4fSwJLyog5CAqLworCXsnYScsICd+JywgMTM5fSwJLyog4yAqLworCXsnYScsICdvJywgMTQwfSwJLyog5SAqLworCXsnYycsICcsJywgMTQxfSwJLyog5yAqLworCXsnZScsICdcJycsIDE0Mn0sCS8qIOkgKi8KKwl7J2UnLCAnYCcsIDE0M30sCS8qIOggKi8KKwl7J2UnLCAnXicsIDE0NH0sCS8qIOogKi8KKwl7J2UnLCAnIicsIDE0NX0sCS8qIOsgKi8KKwl7J2knLCAnXCcnLCAxNDZ9LAkvKiDtICovCisJeydpJywgJ2AnLCAxNDd9LAkvKiDsICovCisJeydpJywgJ14nLCAxNDh9LAkvKiDuICovCisJeydpJywgJyInLCAxNDl9LAkvKiDvICovCisJeyduJywgJ34nLCAxNTB9LAkvKiDxICovCisJeydvJywgJ1wnJywgMTUxfSwJLyog8yAqLworCXsnbycsICdgJywgMTUyfSwJLyog8iAqLworCXsnbycsICdeJywgMTUzfSwJLyog9CAqLworCXsnbycsICciJywgMTU0fSwJLyog9iAqLworCXsnbycsICd+JywgMTU1fSwJLyogbyAqLworCXsndScsICdcJycsIDE1Nn0sCS8qIPogKi8KKwl7J3UnLCAnYCcsIDE1N30sCS8qIH5dIFhYICovCisJeyd1JywgJ14nLCAxNTh9LAkvKiD7ICovCisJeyd1JywgJyInLCAxNTl9LAkvKiD8ICovCisJeycrJywgJ18nLCAxNjB9LAkvKiDdICovCisJeyd+JywgJ28nLCAxNjF9LAkvKiCwICovCisJeydjJywgJ3wnLCAxNjJ9LAkvKiCiICovCisJeyckJywgJyQnLCAxNjN9LAkvKiCjICovCisJeydwJywgJ2EnLCAxNjR9LAkvKiCnICovCisJeycuJywgJy4nLCAxNjV9LAkvKiAqICovCisJeydQJywgJ1AnLCAxNjZ9LAkvKiC2ICovCisJeydzJywgJ3MnLCAxNjd9LAkvKiDfICovCisJeydyJywgJ08nLCAxNjh9LAkvKiCuICovCisJeydjJywgJ08nLCAxNjl9LAkvKiCpICovCisJeydUJywgJ00nLCAxNzB9LAkvKiCBICovCisJeyc9JywgJy8nLCAxNzN9LAkvKiCCICovCisJeydBJywgJ0UnLCAxNzR9LAkvKiDGICovCisJeydPJywgJy8nLCAxNzV9LAkvKiDYICovCisJeycwJywgJzAnLCAxNzZ9LAkvKiCDICovCisJeycrJywgJy0nLCAxNzd9LAkvKiCxICovCisJeyc8JywgJz0nLCAxNzh9LAkvKiC+ICovCisJeyc+JywgJz0nLCAxNzl9LAkvKiCEICovCisJeydZJywgJy0nLCAxODB9LAkvKiClICovCisJeydqJywgJ3UnLCAxODF9LAkvKiC1ICovCisJeydtJywgJ3UnLCAxODF9LAkvKiC1ICovCisJeydkJywgJ2QnLCAxODJ9LAkvKiCPICovCisJeydTJywgJ1MnLCAxODN9LAkvKiCFICovCisJeydTJywgJ0knLCAxODN9LAkvKiCFICovCisJeydQJywgJ0knLCAxODR9LAkvKiC9ICovCisJeydwJywgJ2knLCAxODV9LAkvKiC8ICovCisJeydJJywgJ0knLCAxODZ9LAkvKiCGICovCisJeydhJywgJy0nLCAxODd9LAkvKiC7ICovCisJeydvJywgJy0nLCAxODh9LAkvKiC6ICovCisJeydPJywgJ00nLCAxODl9LAkvKiC9ICovCisJeydhJywgJ2UnLCAxOTB9LAkvKiDmICovCisJeydvJywgJy8nLCAxOTF9LAkvKiD4ICovCisJeyd+JywgJz8nLCAxOTJ9LAkvKiC/ICovCisJeyd+JywgJyEnLCAxOTN9LAkvKiChICovCisJeyctJywgJywnLCAxOTR9LAkvKiCsICovCisJeyd2JywgJy0nLCAxOTV9LAkvKiB+SCBYWCAqLworCXsnZicsICctJywgMTk2fSwJLyognyAqLworCXsnficsICd+JywgMTk3fSwJLyogiSAqLworCXsnRCcsICdFJywgMTk4fSwJLyogkCAqLworCXsnPCcsICc8JywgMTk5fSwJLyogqyAqLworCXsnPicsICc+JywgMjAwfSwJLyoguyAqLworCXsnLicsICc6JywgMjAxfSwJLyogiiAqLworCXsnQScsICdgJywgMjAzfSwJLyogwCAqLworCXsnQScsICd+JywgMjA0fSwJLyogwyAqLworCXsnTycsICd+JywgMjA1fSwJLyog1SAqLworCXsnTycsICdFJywgMjA2fSwJLyogkSAqLworCXsnbycsICdlJywgMjA3fSwJLyogpiAqLworCXsnLScsICcuJywgMjA4fSwJLyogLSAqLworCXsnLScsICctJywgMjA5fSwJLyogLSAqLworCXsnYCcsICdgJywgMjEwfSwJLyogIiAqLworCXsnXCcnLCAnXCcnLCAyMTF9LAkvKiAiICovCisJeydgJywgJyAnLCAyMTJ9LAkvKiAnICovCisJeydcJycsICcgJywgMjEzfSwJLyogJyAqLworCXsnLScsICc6JywgMjE0fSwJLyog9yAqLworCXsnRCcsICdJJywgMjE1fSwJLyog1yAqLworCXsneScsICc6JywgMjE2fSwJLyog/yAqLworCXsnWScsICc6JywgMjE3fSwJLyogjSAqLworCXsnLycsICcvJywgMjE4fSwJLyogjiAqLworCXsnRScsICc9JywgMjE5fSwJLyogpCBFdXJvIFN5c3RlbSA+PTguNSAqLworCXsnbycsICd4JywgMjE5fSwJLyogpCBDdXJyZW5jeSBTeXN0ZW0gPD04LjEqLworCXsnPCcsICcgJywgMjIwfSwJLyog0CAqLworCXsnPicsICcgJywgMjIxfSwJLyog8CAqLworCXsnZicsICdpJywgMjIyfSwJLyog3iAqLworCXsnZicsICdsJywgMjIzfSwJLyog/iAqLworCXsnKycsICcrJywgMjI0fSwJLyog/SAqLworCXsnficsICcuJywgMjI1fSwJLyogtyAqLworCXsnLCcsICcgJywgMjI2fSwJLyogkiAqLworCXsnLCcsICcsJywgMjI3fSwJLyogkyAqLworCXsnJScsICcuJywgMjI4fSwJLyoglCAqLworCXsnJScsICcwJywgMjI4fSwJLyoglCAqLworCXsnQScsICdeJywgMjI5fSwJLyogwiAqLworCXsnRScsICdeJywgMjMwfSwJLyogyiAqLworCXsnQScsICdcJycsIDIzMX0sCS8qIMEgKi8KKwl7J0UnLCAnIicsIDIzMn0sCS8qIMsgKi8KKwl7J0UnLCAnYCcsIDIzM30sCS8qIMggKi8KKwl7J0knLCAnXCcnLCAyMzR9LAkvKiDNICovCisJeydJJywgJ14nLCAyMzV9LAkvKiDOICovCisJeydJJywgJyInLCAyMzZ9LAkvKiDPICovCisJeydJJywgJ2AnLCAyMzd9LAkvKiDMICovCisJeydPJywgJ1wnJywgMjM4fSwJLyog0yAqLworCXsnTycsICdeJywgMjM5fSwJLyog1CAqLworCXsnQScsICdQJywgMjQwfSwJLyoglSAqLworCXsnTycsICdgJywgMjQxfSwJLyog0iAqLworCXsnVScsICdcJycsIDI0Mn0sCS8qINogKi8KKwl7J1UnLCAnXicsIDI0M30sCS8qINsgKi8KKwl7J1UnLCAnYCcsIDI0NH0sCS8qINkgKi8KKwl7J2knLCAnLicsIDI0NX0sCS8qIJ4gKi8KKwl7TlVMLCBOVUwsIE5VTH0KKwl9OworCisjICAgIGVsc2UJLyogIU1BQ09TICovCisKKyMgICAgIGlmZGVmIE9MRF9ESUdSQVBIUworCisJLyoKKwkgKiBkaWdyYXBocyBjb21wYXRpYmxlIHdpdGggVmltIDUueAorCSAqLworZGlncl9UCWRpZ3JhcGhkZWZhdWx0W10gPQorICAgICAgIHt7J34nLCAnIScsIDE2MX0sCS8qIKEgKi8KKwl7J2MnLCAnfCcsIDE2Mn0sCS8qIKIgKi8KKwl7JyQnLCAnJCcsIDE2M30sCS8qIKMgKi8KKwl7J28nLCAneCcsIDE2NH0sCS8qIKQgLSBjdXJyZW5jeSBzeW1ib2wgaW4gSVNPIDg4NTktMSAqLworCXsnZScsICc9JywgMTY0fSwJLyogpCAtIGV1cm8gc3ltYm9sIGluIElTTyA4ODU5LTE1ICovCisJeydZJywgJy0nLCAxNjV9LAkvKiClICovCisJeyd8JywgJ3wnLCAxNjZ9LAkvKiCmICovCisJeydwJywgJ2EnLCAxNjd9LAkvKiCnICovCisJeyciJywgJyInLCAxNjh9LAkvKiCoICovCisJeydjJywgJ08nLCAxNjl9LAkvKiCpICovCisJeydhJywgJy0nLCAxNzB9LAkvKiCqICovCisJeyc8JywgJzwnLCAxNzF9LAkvKiCrICovCisJeyctJywgJywnLCAxNzJ9LAkvKiCsICovCisJeyctJywgJy0nLCAxNzN9LAkvKiCtICovCisJeydyJywgJ08nLCAxNzR9LAkvKiCuICovCisJeyctJywgJz0nLCAxNzV9LAkvKiCvICovCisJeyd+JywgJ28nLCAxNzZ9LAkvKiCwICovCisJeycrJywgJy0nLCAxNzd9LAkvKiCxICovCisJeycyJywgJzInLCAxNzh9LAkvKiCyICovCisJeyczJywgJzMnLCAxNzl9LAkvKiCzICovCisJeydcJycsICdcJycsIDE4MH0sCS8qILQgKi8KKwl7J2onLCAndScsIDE4MX0sCS8qILUgKi8KKwl7J3AnLCAncCcsIDE4Mn0sCS8qILYgKi8KKwl7J34nLCAnLicsIDE4M30sCS8qILcgKi8KKwl7JywnLCAnLCcsIDE4NH0sCS8qILggKi8KKwl7JzEnLCAnMScsIDE4NX0sCS8qILkgKi8KKwl7J28nLCAnLScsIDE4Nn0sCS8qILogKi8KKwl7Jz4nLCAnPicsIDE4N30sCS8qILsgKi8KKwl7JzEnLCAnNCcsIDE4OH0sCS8qILwgKi8KKwl7JzEnLCAnMicsIDE4OX0sCS8qIL0gKi8KKwl7JzMnLCAnNCcsIDE5MH0sCS8qIL4gKi8KKwl7J34nLCAnPycsIDE5MX0sCS8qIL8gKi8KKwl7J0EnLCAnYCcsIDE5Mn0sCS8qIMAgKi8KKwl7J0EnLCAnXCcnLCAxOTN9LAkvKiDBICovCisJeydBJywgJ14nLCAxOTR9LAkvKiDCICovCisJeydBJywgJ34nLCAxOTV9LAkvKiDDICovCisJeydBJywgJyInLCAxOTZ9LAkvKiDEICovCisJeydBJywgJ0AnLCAxOTd9LAkvKiDFICovCisJeydBJywgJ0EnLCAxOTd9LAkvKiDFICovCisJeydBJywgJ0UnLCAxOTh9LAkvKiDGICovCisJeydDJywgJywnLCAxOTl9LAkvKiDHICovCisJeydFJywgJ2AnLCAyMDB9LAkvKiDIICovCisJeydFJywgJ1wnJywgMjAxfSwJLyogySAqLworCXsnRScsICdeJywgMjAyfSwJLyogyiAqLworCXsnRScsICciJywgMjAzfSwJLyogyyAqLworCXsnSScsICdgJywgMjA0fSwJLyogzCAqLworCXsnSScsICdcJycsIDIwNX0sCS8qIM0gKi8KKwl7J0knLCAnXicsIDIwNn0sCS8qIM4gKi8KKwl7J0knLCAnIicsIDIwN30sCS8qIM8gKi8KKwl7J0QnLCAnLScsIDIwOH0sCS8qINAgKi8KKwl7J04nLCAnficsIDIwOX0sCS8qINEgKi8KKwl7J08nLCAnYCcsIDIxMH0sCS8qINIgKi8KKwl7J08nLCAnXCcnLCAyMTF9LAkvKiDTICovCisJeydPJywgJ14nLCAyMTJ9LAkvKiDUICovCisJeydPJywgJ34nLCAyMTN9LAkvKiDVICovCisJeydPJywgJyInLCAyMTR9LAkvKiDWICovCisJeycvJywgJ1xcJywgMjE1fSwJLyog1yAtIG11bHRpcGxpY2F0aW9uIHN5bWJvbCBpbiBJU08gODg1OS0xICovCisJeydPJywgJ0UnLCAyMTV9LAkvKiDXIC0gT0UgaW4gSVNPIDg4NTktMTUgKi8KKwl7J08nLCAnLycsIDIxNn0sCS8qINggKi8KKwl7J1UnLCAnYCcsIDIxN30sCS8qINkgKi8KKwl7J1UnLCAnXCcnLCAyMTh9LAkvKiDaICovCisJeydVJywgJ14nLCAyMTl9LAkvKiDbICovCisJeydVJywgJyInLCAyMjB9LAkvKiDcICovCisJeydZJywgJ1wnJywgMjIxfSwJLyog3SAqLworCXsnSScsICdwJywgMjIyfSwJLyog3iAqLworCXsncycsICdzJywgMjIzfSwJLyog3yAqLworCXsnYScsICdgJywgMjI0fSwJLyog4CAqLworCXsnYScsICdcJycsIDIyNX0sCS8qIOEgKi8KKwl7J2EnLCAnXicsIDIyNn0sCS8qIOIgKi8KKwl7J2EnLCAnficsIDIyN30sCS8qIOMgKi8KKwl7J2EnLCAnIicsIDIyOH0sCS8qIOQgKi8KKwl7J2EnLCAnQCcsIDIyOX0sCS8qIOUgKi8KKwl7J2EnLCAnYScsIDIyOX0sCS8qIOUgKi8KKwl7J2EnLCAnZScsIDIzMH0sCS8qIOYgKi8KKwl7J2MnLCAnLCcsIDIzMX0sCS8qIOcgKi8KKwl7J2UnLCAnYCcsIDIzMn0sCS8qIOggKi8KKwl7J2UnLCAnXCcnLCAyMzN9LAkvKiDpICovCisJeydlJywgJ14nLCAyMzR9LAkvKiDqICovCisJeydlJywgJyInLCAyMzV9LAkvKiDrICovCisJeydpJywgJ2AnLCAyMzZ9LAkvKiDsICovCisJeydpJywgJ1wnJywgMjM3fSwJLyog7SAqLworCXsnaScsICdeJywgMjM4fSwJLyog7iAqLworCXsnaScsICciJywgMjM5fSwJLyog7yAqLworCXsnZCcsICctJywgMjQwfSwJLyog8CAqLworCXsnbicsICd+JywgMjQxfSwJLyog8SAqLworCXsnbycsICdgJywgMjQyfSwJLyog8iAqLworCXsnbycsICdcJycsIDI0M30sCS8qIPMgKi8KKwl7J28nLCAnXicsIDI0NH0sCS8qIPQgKi8KKwl7J28nLCAnficsIDI0NX0sCS8qIPUgKi8KKwl7J28nLCAnIicsIDI0Nn0sCS8qIPYgKi8KKwl7JzonLCAnLScsIDI0N30sCS8qIPcgLSBkaXZpc2lvbiBzeW1ib2wgaW4gSVNPIDg4NTktMSAqLworCXsnbycsICdlJywgMjQ3fSwJLyog9yAtIG9lIGluIElTTyA4ODU5LTE1ICovCisJeydvJywgJy8nLCAyNDh9LAkvKiD4ICovCisJeyd1JywgJ2AnLCAyNDl9LAkvKiD5ICovCisJeyd1JywgJ1wnJywgMjUwfSwJLyog+iAqLworCXsndScsICdeJywgMjUxfSwJLyog+yAqLworCXsndScsICciJywgMjUyfSwJLyog/CAqLworCXsneScsICdcJycsIDI1M30sCS8qIP0gKi8KKwl7J2knLCAncCcsIDI1NH0sCS8qIP4gKi8KKwl7J3knLCAnIicsIDI1NX0sCS8qIHggWFggKi8KKwl7TlVMLCBOVUwsIE5VTH0KKwl9OworIyAgICAgZWxzZSAvKiBPTERfRElHUkFQSFMgKi8KKworCS8qCisJICogZGlncmFwaHMgZm9yIFVuaWNvZGUgZnJvbSBSRkMxMzQ1CisJICogKGFsc28gd29yayBmb3IgSVNPLTg4NTktMSBha2EgbGF0aW4xKQorCSAqLworZGlncl9UCWRpZ3JhcGhkZWZhdWx0W10gPQorICAgICAgIHsKKwl7J04nLCAnVScsIDB4MGF9LAkvKiBMRiBmb3IgTlVMICovCisJeydTJywgJ0gnLCAweDAxfSwKKwl7J1MnLCAnWCcsIDB4MDJ9LAorCXsnRScsICdYJywgMHgwM30sCisJeydFJywgJ1QnLCAweDA0fSwKKwl7J0UnLCAnUScsIDB4MDV9LAorCXsnQScsICdLJywgMHgwNn0sCisJeydCJywgJ0wnLCAweDA3fSwKKwl7J0InLCAnUycsIDB4MDh9LAorCXsnSCcsICdUJywgMHgwOX0sCisJeydMJywgJ0YnLCAweDBhfSwKKwl7J1YnLCAnVCcsIDB4MGJ9LAorCXsnRicsICdGJywgMHgwY30sCisJeydDJywgJ1InLCAweDBkfSwKKwl7J1MnLCAnTycsIDB4MGV9LAorCXsnUycsICdJJywgMHgwZn0sCisJeydEJywgJ0wnLCAweDEwfSwKKwl7J0QnLCAnMScsIDB4MTF9LAorCXsnRCcsICcyJywgMHgxMn0sCisJeydEJywgJzMnLCAweDEzfSwKKwl7J0QnLCAnNCcsIDB4MTR9LAorCXsnTicsICdLJywgMHgxNX0sCisJeydTJywgJ1knLCAweDE2fSwKKwl7J0UnLCAnQicsIDB4MTd9LAorCXsnQycsICdOJywgMHgxOH0sCisJeydFJywgJ00nLCAweDE5fSwKKwl7J1MnLCAnQicsIDB4MWF9LAorCXsnRScsICdDJywgMHgxYn0sCisJeydGJywgJ1MnLCAweDFjfSwKKwl7J0cnLCAnUycsIDB4MWR9LAorCXsnUicsICdTJywgMHgxZX0sCisJeydVJywgJ1MnLCAweDFmfSwKKwl7J1MnLCAnUCcsIDB4MjB9LAorCXsnTicsICdiJywgMHgyM30sCisJeydEJywgJ08nLCAweDI0fSwKKwl7J0EnLCAndCcsIDB4NDB9LAorCXsnPCcsICcoJywgMHg1Yn0sCisJeycvJywgJy8nLCAweDVjfSwKKwl7JyknLCAnPicsIDB4NWR9LAorCXsnXCcnLCAnPicsIDB4NWV9LAorCXsnXCcnLCAnIScsIDB4NjB9LAorCXsnKCcsICchJywgMHg3Yn0sCisJeychJywgJyEnLCAweDdjfSwKKwl7JyEnLCAnKScsIDB4N2R9LAorCXsnXCcnLCAnPycsIDB4N2V9LAorCXsnRCcsICdUJywgMHg3Zn0sCisJeydQJywgJ0EnLCAweDgwfSwKKwl7J0gnLCAnTycsIDB4ODF9LAorCXsnQicsICdIJywgMHg4Mn0sCisJeydOJywgJ0gnLCAweDgzfSwKKwl7J0knLCAnTicsIDB4ODR9LAorCXsnTicsICdMJywgMHg4NX0sCisJeydTJywgJ0EnLCAweDg2fSwKKwl7J0UnLCAnUycsIDB4ODd9LAorCXsnSCcsICdTJywgMHg4OH0sCisJeydIJywgJ0onLCAweDg5fSwKKwl7J1YnLCAnUycsIDB4OGF9LAorCXsnUCcsICdEJywgMHg4Yn0sCisJeydQJywgJ1UnLCAweDhjfSwKKwl7J1InLCAnSScsIDB4OGR9LAorCXsnUycsICcyJywgMHg4ZX0sCisJeydTJywgJzMnLCAweDhmfSwKKwl7J0QnLCAnQycsIDB4OTB9LAorCXsnUCcsICcxJywgMHg5MX0sCisJeydQJywgJzInLCAweDkyfSwKKwl7J1QnLCAnUycsIDB4OTN9LAorCXsnQycsICdDJywgMHg5NH0sCisJeydNJywgJ1cnLCAweDk1fSwKKwl7J1MnLCAnRycsIDB4OTZ9LAorCXsnRScsICdHJywgMHg5N30sCisJeydTJywgJ1MnLCAweDk4fSwKKwl7J0cnLCAnQycsIDB4OTl9LAorCXsnUycsICdDJywgMHg5YX0sCisJeydDJywgJ0knLCAweDlifSwKKwl7J1MnLCAnVCcsIDB4OWN9LAorCXsnTycsICdDJywgMHg5ZH0sCisJeydQJywgJ00nLCAweDllfSwKKwl7J0EnLCAnQycsIDB4OWZ9LAorCXsnTicsICdTJywgMHhhMH0sCisJeychJywgJ0knLCAweGExfSwKKwl7J0MnLCAndCcsIDB4YTJ9LAorCXsnUCcsICdkJywgMHhhM30sCisJeydDJywgJ3UnLCAweGE0fSwKKwl7J1knLCAnZScsIDB4YTV9LAorCXsnQicsICdCJywgMHhhNn0sCisJeydTJywgJ0UnLCAweGE3fSwKKwl7J1wnJywgJzonLCAweGE4fSwKKwl7J0MnLCAnbycsIDB4YTl9LAorCXsnLScsICdhJywgMHhhYX0sCisJeyc8JywgJzwnLCAweGFifSwKKwl7J04nLCAnTycsIDB4YWN9LAorCXsnLScsICctJywgMHhhZH0sCisJeydSJywgJ2cnLCAweGFlfSwKKwl7J1wnJywgJ20nLCAweGFmfSwKKwl7J0QnLCAnRycsIDB4YjB9LAorCXsnKycsICctJywgMHhiMX0sCisJeycyJywgJ1MnLCAweGIyfSwKKwl7JzMnLCAnUycsIDB4YjN9LAorCXsnXCcnLCAnXCcnLCAweGI0fSwKKwl7J00nLCAneScsIDB4YjV9LAorCXsnUCcsICdJJywgMHhiNn0sCisJeycuJywgJ00nLCAweGI3fSwKKwl7J1wnJywgJywnLCAweGI4fSwKKwl7JzEnLCAnUycsIDB4Yjl9LAorCXsnLScsICdvJywgMHhiYX0sCisJeyc+JywgJz4nLCAweGJifSwKKwl7JzEnLCAnNCcsIDB4YmN9LAorCXsnMScsICcyJywgMHhiZH0sCisJeyczJywgJzQnLCAweGJlfSwKKwl7Jz8nLCAnSScsIDB4YmZ9LAorCXsnQScsICchJywgMHhjMH0sCisJeydBJywgJ1wnJywgMHhjMX0sCisJeydBJywgJz4nLCAweGMyfSwKKwl7J0EnLCAnPycsIDB4YzN9LAorCXsnQScsICc6JywgMHhjNH0sCisJeydBJywgJ0EnLCAweGM1fSwKKwl7J0EnLCAnRScsIDB4YzZ9LAorCXsnQycsICcsJywgMHhjN30sCisJeydFJywgJyEnLCAweGM4fSwKKwl7J0UnLCAnXCcnLCAweGM5fSwKKwl7J0UnLCAnPicsIDB4Y2F9LAorCXsnRScsICc6JywgMHhjYn0sCisJeydJJywgJyEnLCAweGNjfSwKKwl7J0knLCAnXCcnLCAweGNkfSwKKwl7J0knLCAnPicsIDB4Y2V9LAorCXsnSScsICc6JywgMHhjZn0sCisJeydEJywgJy0nLCAweGQwfSwKKwl7J04nLCAnPycsIDB4ZDF9LAorCXsnTycsICchJywgMHhkMn0sCisJeydPJywgJ1wnJywgMHhkM30sCisJeydPJywgJz4nLCAweGQ0fSwKKwl7J08nLCAnPycsIDB4ZDV9LAorCXsnTycsICc6JywgMHhkNn0sCisJeycqJywgJ1gnLCAweGQ3fSwKKwl7J08nLCAnLycsIDB4ZDh9LAorCXsnVScsICchJywgMHhkOX0sCisJeydVJywgJ1wnJywgMHhkYX0sCisJeydVJywgJz4nLCAweGRifSwKKwl7J1UnLCAnOicsIDB4ZGN9LAorCXsnWScsICdcJycsIDB4ZGR9LAorCXsnVCcsICdIJywgMHhkZX0sCisJeydzJywgJ3MnLCAweGRmfSwKKwl7J2EnLCAnIScsIDB4ZTB9LAorCXsnYScsICdcJycsIDB4ZTF9LAorCXsnYScsICc+JywgMHhlMn0sCisJeydhJywgJz8nLCAweGUzfSwKKwl7J2EnLCAnOicsIDB4ZTR9LAorCXsnYScsICdhJywgMHhlNX0sCisJeydhJywgJ2UnLCAweGU2fSwKKwl7J2MnLCAnLCcsIDB4ZTd9LAorCXsnZScsICchJywgMHhlOH0sCisJeydlJywgJ1wnJywgMHhlOX0sCisJeydlJywgJz4nLCAweGVhfSwKKwl7J2UnLCAnOicsIDB4ZWJ9LAorCXsnaScsICchJywgMHhlY30sCisJeydpJywgJ1wnJywgMHhlZH0sCisJeydpJywgJz4nLCAweGVlfSwKKwl7J2knLCAnOicsIDB4ZWZ9LAorCXsnZCcsICctJywgMHhmMH0sCisJeyduJywgJz8nLCAweGYxfSwKKwl7J28nLCAnIScsIDB4ZjJ9LAorCXsnbycsICdcJycsIDB4ZjN9LAorCXsnbycsICc+JywgMHhmNH0sCisJeydvJywgJz8nLCAweGY1fSwKKwl7J28nLCAnOicsIDB4ZjZ9LAorCXsnLScsICc6JywgMHhmN30sCisJeydvJywgJy8nLCAweGY4fSwKKwl7J3UnLCAnIScsIDB4Zjl9LAorCXsndScsICdcJycsIDB4ZmF9LAorCXsndScsICc+JywgMHhmYn0sCisJeyd1JywgJzonLCAweGZjfSwKKwl7J3knLCAnXCcnLCAweGZkfSwKKwl7J3QnLCAnaCcsIDB4ZmV9LAorCXsneScsICc6JywgMHhmZn0sCisKKyMgICAgICBpZmRlZiBGRUFUX01CWVRFCisjCWRlZmluZSBVU0VfVU5JQ09ERV9ESUdSQVBIUworCisJeydBJywgJy0nLCAweDAxMDB9LAorCXsnYScsICctJywgMHgwMTAxfSwKKwl7J0EnLCAnKCcsIDB4MDEwMn0sCisJeydhJywgJygnLCAweDAxMDN9LAorCXsnQScsICc7JywgMHgwMTA0fSwKKwl7J2EnLCAnOycsIDB4MDEwNX0sCisJeydDJywgJ1wnJywgMHgwMTA2fSwKKwl7J2MnLCAnXCcnLCAweDAxMDd9LAorCXsnQycsICc+JywgMHgwMTA4fSwKKwl7J2MnLCAnPicsIDB4MDEwOX0sCisJeydDJywgJy4nLCAweDAxMGF9LAorCXsnYycsICcuJywgMHgwMTBifSwKKwl7J0MnLCAnPCcsIDB4MDEwY30sCisJeydjJywgJzwnLCAweDAxMGR9LAorCXsnRCcsICc8JywgMHgwMTBlfSwKKwl7J2QnLCAnPCcsIDB4MDEwZn0sCisJeydEJywgJy8nLCAweDAxMTB9LAorCXsnZCcsICcvJywgMHgwMTExfSwKKwl7J0UnLCAnLScsIDB4MDExMn0sCisJeydlJywgJy0nLCAweDAxMTN9LAorCXsnRScsICcoJywgMHgwMTE0fSwKKwl7J2UnLCAnKCcsIDB4MDExNX0sCisJeydFJywgJy4nLCAweDAxMTZ9LAorCXsnZScsICcuJywgMHgwMTE3fSwKKwl7J0UnLCAnOycsIDB4MDExOH0sCisJeydlJywgJzsnLCAweDAxMTl9LAorCXsnRScsICc8JywgMHgwMTFhfSwKKwl7J2UnLCAnPCcsIDB4MDExYn0sCisJeydHJywgJz4nLCAweDAxMWN9LAorCXsnZycsICc+JywgMHgwMTFkfSwKKwl7J0cnLCAnKCcsIDB4MDExZX0sCisJeydnJywgJygnLCAweDAxMWZ9LAorCXsnRycsICcuJywgMHgwMTIwfSwKKwl7J2cnLCAnLicsIDB4MDEyMX0sCisJeydHJywgJywnLCAweDAxMjJ9LAorCXsnZycsICcsJywgMHgwMTIzfSwKKwl7J0gnLCAnPicsIDB4MDEyNH0sCisJeydoJywgJz4nLCAweDAxMjV9LAorCXsnSCcsICcvJywgMHgwMTI2fSwKKwl7J2gnLCAnLycsIDB4MDEyN30sCisJeydJJywgJz8nLCAweDAxMjh9LAorCXsnaScsICc/JywgMHgwMTI5fSwKKwl7J0knLCAnLScsIDB4MDEyYX0sCisJeydpJywgJy0nLCAweDAxMmJ9LAorCXsnSScsICcoJywgMHgwMTJjfSwKKwl7J2knLCAnKCcsIDB4MDEyZH0sCisJeydJJywgJzsnLCAweDAxMmV9LAorCXsnaScsICc7JywgMHgwMTJmfSwKKwl7J0knLCAnLicsIDB4MDEzMH0sCisJeydpJywgJy4nLCAweDAxMzF9LAorCXsnSScsICdKJywgMHgwMTMyfSwKKwl7J2knLCAnaicsIDB4MDEzM30sCisJeydKJywgJz4nLCAweDAxMzR9LAorCXsnaicsICc+JywgMHgwMTM1fSwKKwl7J0snLCAnLCcsIDB4MDEzNn0sCisJeydrJywgJywnLCAweDAxMzd9LAorCXsnaycsICdrJywgMHgwMTM4fSwKKwl7J0wnLCAnXCcnLCAweDAxMzl9LAorCXsnbCcsICdcJycsIDB4MDEzYX0sCisJeydMJywgJywnLCAweDAxM2J9LAorCXsnbCcsICcsJywgMHgwMTNjfSwKKwl7J0wnLCAnPCcsIDB4MDEzZH0sCisJeydsJywgJzwnLCAweDAxM2V9LAorCXsnTCcsICcuJywgMHgwMTNmfSwKKwl7J2wnLCAnLicsIDB4MDE0MH0sCisJeydMJywgJy8nLCAweDAxNDF9LAorCXsnbCcsICcvJywgMHgwMTQyfSwKKwl7J04nLCAnXCcnLCAweDAxNDN9LAorCXsnbicsICdcJycsIDB4MDE0NH0sCisJeydOJywgJywnLCAweDAxNDV9LAorCXsnbicsICcsJywgMHgwMTQ2fSwKKwl7J04nLCAnPCcsIDB4MDE0N30sCisJeyduJywgJzwnLCAweDAxNDh9LAorCXsnXCcnLCAnbicsIDB4MDE0OX0sCisJeydOJywgJ0cnLCAweDAxNGF9LAorCXsnbicsICdnJywgMHgwMTRifSwKKwl7J08nLCAnLScsIDB4MDE0Y30sCisJeydvJywgJy0nLCAweDAxNGR9LAorCXsnTycsICcoJywgMHgwMTRlfSwKKwl7J28nLCAnKCcsIDB4MDE0Zn0sCisJeydPJywgJyInLCAweDAxNTB9LAorCXsnbycsICciJywgMHgwMTUxfSwKKwl7J08nLCAnRScsIDB4MDE1Mn0sCisJeydvJywgJ2UnLCAweDAxNTN9LAorCXsnUicsICdcJycsIDB4MDE1NH0sCisJeydyJywgJ1wnJywgMHgwMTU1fSwKKwl7J1InLCAnLCcsIDB4MDE1Nn0sCisJeydyJywgJywnLCAweDAxNTd9LAorCXsnUicsICc8JywgMHgwMTU4fSwKKwl7J3InLCAnPCcsIDB4MDE1OX0sCisJeydTJywgJ1wnJywgMHgwMTVhfSwKKwl7J3MnLCAnXCcnLCAweDAxNWJ9LAorCXsnUycsICc+JywgMHgwMTVjfSwKKwl7J3MnLCAnPicsIDB4MDE1ZH0sCisJeydTJywgJywnLCAweDAxNWV9LAorCXsncycsICcsJywgMHgwMTVmfSwKKwl7J1MnLCAnPCcsIDB4MDE2MH0sCisJeydzJywgJzwnLCAweDAxNjF9LAorCXsnVCcsICcsJywgMHgwMTYyfSwKKwl7J3QnLCAnLCcsIDB4MDE2M30sCisJeydUJywgJzwnLCAweDAxNjR9LAorCXsndCcsICc8JywgMHgwMTY1fSwKKwl7J1QnLCAnLycsIDB4MDE2Nn0sCisJeyd0JywgJy8nLCAweDAxNjd9LAorCXsnVScsICc/JywgMHgwMTY4fSwKKwl7J3UnLCAnPycsIDB4MDE2OX0sCisJeydVJywgJy0nLCAweDAxNmF9LAorCXsndScsICctJywgMHgwMTZifSwKKwl7J1UnLCAnKCcsIDB4MDE2Y30sCisJeyd1JywgJygnLCAweDAxNmR9LAorCXsnVScsICcwJywgMHgwMTZlfSwKKwl7J3UnLCAnMCcsIDB4MDE2Zn0sCisJeydVJywgJyInLCAweDAxNzB9LAorCXsndScsICciJywgMHgwMTcxfSwKKwl7J1UnLCAnOycsIDB4MDE3Mn0sCisJeyd1JywgJzsnLCAweDAxNzN9LAorCXsnVycsICc+JywgMHgwMTc0fSwKKwl7J3cnLCAnPicsIDB4MDE3NX0sCisJeydZJywgJz4nLCAweDAxNzZ9LAorCXsneScsICc+JywgMHgwMTc3fSwKKwl7J1knLCAnOicsIDB4MDE3OH0sCisJeydaJywgJ1wnJywgMHgwMTc5fSwKKwl7J3onLCAnXCcnLCAweDAxN2F9LAorCXsnWicsICcuJywgMHgwMTdifSwKKwl7J3onLCAnLicsIDB4MDE3Y30sCisJeydaJywgJzwnLCAweDAxN2R9LAorCXsneicsICc8JywgMHgwMTdlfSwKKwl7J08nLCAnOScsIDB4MDFhMH0sCisJeydvJywgJzknLCAweDAxYTF9LAorCXsnTycsICdJJywgMHgwMWEyfSwKKwl7J28nLCAnaScsIDB4MDFhM30sCisJeyd5JywgJ3InLCAweDAxYTZ9LAorCXsnVScsICc5JywgMHgwMWFmfSwKKwl7J3UnLCAnOScsIDB4MDFiMH0sCisJeydaJywgJy8nLCAweDAxYjV9LAorCXsneicsICcvJywgMHgwMWI2fSwKKwl7J0UnLCAnRCcsIDB4MDFiN30sCisJeydBJywgJzwnLCAweDAxY2R9LAorCXsnYScsICc8JywgMHgwMWNlfSwKKwl7J0knLCAnPCcsIDB4MDFjZn0sCisJeydpJywgJzwnLCAweDAxZDB9LAorCXsnTycsICc8JywgMHgwMWQxfSwKKwl7J28nLCAnPCcsIDB4MDFkMn0sCisJeydVJywgJzwnLCAweDAxZDN9LAorCXsndScsICc8JywgMHgwMWQ0fSwKKwl7J0EnLCAnMScsIDB4MDFkZX0sCisJeydhJywgJzEnLCAweDAxZGZ9LAorCXsnQScsICc3JywgMHgwMWUwfSwKKwl7J2EnLCAnNycsIDB4MDFlMX0sCisJeydBJywgJzMnLCAweDAxZTJ9LAorCXsnYScsICczJywgMHgwMWUzfSwKKwl7J0cnLCAnLycsIDB4MDFlNH0sCisJeydnJywgJy8nLCAweDAxZTV9LAorCXsnRycsICc8JywgMHgwMWU2fSwKKwl7J2cnLCAnPCcsIDB4MDFlN30sCisJeydLJywgJzwnLCAweDAxZTh9LAorCXsnaycsICc8JywgMHgwMWU5fSwKKwl7J08nLCAnOycsIDB4MDFlYX0sCisJeydvJywgJzsnLCAweDAxZWJ9LAorCXsnTycsICcxJywgMHgwMWVjfSwKKwl7J28nLCAnMScsIDB4MDFlZH0sCisJeydFJywgJ1onLCAweDAxZWV9LAorCXsnZScsICd6JywgMHgwMWVmfSwKKwl7J2onLCAnPCcsIDB4MDFmMH0sCisJeydHJywgJ1wnJywgMHgwMWY0fSwKKwl7J2cnLCAnXCcnLCAweDAxZjV9LAorCXsnOycsICdTJywgMHgwMmJmfSwKKwl7J1wnJywgJzwnLCAweDAyYzd9LAorCXsnXCcnLCAnKCcsIDB4MDJkOH0sCisJeydcJycsICcuJywgMHgwMmQ5fSwKKwl7J1wnJywgJzAnLCAweDAyZGF9LAorCXsnXCcnLCAnOycsIDB4MDJkYn0sCisJeydcJycsICciJywgMHgwMmRkfSwKKwl7J0EnLCAnJScsIDB4MDM4Nn0sCisJeydFJywgJyUnLCAweDAzODh9LAorCXsnWScsICclJywgMHgwMzg5fSwKKwl7J0knLCAnJScsIDB4MDM4YX0sCisJeydPJywgJyUnLCAweDAzOGN9LAorCXsnVScsICclJywgMHgwMzhlfSwKKwl7J1cnLCAnJScsIDB4MDM4Zn0sCisJeydpJywgJzMnLCAweDAzOTB9LAorCXsnQScsICcqJywgMHgwMzkxfSwKKwl7J0InLCAnKicsIDB4MDM5Mn0sCisJeydHJywgJyonLCAweDAzOTN9LAorCXsnRCcsICcqJywgMHgwMzk0fSwKKwl7J0UnLCAnKicsIDB4MDM5NX0sCisJeydaJywgJyonLCAweDAzOTZ9LAorCXsnWScsICcqJywgMHgwMzk3fSwKKwl7J0gnLCAnKicsIDB4MDM5OH0sCisJeydJJywgJyonLCAweDAzOTl9LAorCXsnSycsICcqJywgMHgwMzlhfSwKKwl7J0wnLCAnKicsIDB4MDM5Yn0sCisJeydNJywgJyonLCAweDAzOWN9LAorCXsnTicsICcqJywgMHgwMzlkfSwKKwl7J0MnLCAnKicsIDB4MDM5ZX0sCisJeydPJywgJyonLCAweDAzOWZ9LAorCXsnUCcsICcqJywgMHgwM2EwfSwKKwl7J1InLCAnKicsIDB4MDNhMX0sCisJeydTJywgJyonLCAweDAzYTN9LAorCXsnVCcsICcqJywgMHgwM2E0fSwKKwl7J1UnLCAnKicsIDB4MDNhNX0sCisJeydGJywgJyonLCAweDAzYTZ9LAorCXsnWCcsICcqJywgMHgwM2E3fSwKKwl7J1EnLCAnKicsIDB4MDNhOH0sCisJeydXJywgJyonLCAweDAzYTl9LAorCXsnSicsICcqJywgMHgwM2FhfSwKKwl7J1YnLCAnKicsIDB4MDNhYn0sCisJeydhJywgJyUnLCAweDAzYWN9LAorCXsnZScsICclJywgMHgwM2FkfSwKKwl7J3knLCAnJScsIDB4MDNhZX0sCisJeydpJywgJyUnLCAweDAzYWZ9LAorCXsndScsICczJywgMHgwM2IwfSwKKwl7J2EnLCAnKicsIDB4MDNiMX0sCisJeydiJywgJyonLCAweDAzYjJ9LAorCXsnZycsICcqJywgMHgwM2IzfSwKKwl7J2QnLCAnKicsIDB4MDNiNH0sCisJeydlJywgJyonLCAweDAzYjV9LAorCXsneicsICcqJywgMHgwM2I2fSwKKwl7J3knLCAnKicsIDB4MDNiN30sCisJeydoJywgJyonLCAweDAzYjh9LAorCXsnaScsICcqJywgMHgwM2I5fSwKKwl7J2snLCAnKicsIDB4MDNiYX0sCisJeydsJywgJyonLCAweDAzYmJ9LAorCXsnbScsICcqJywgMHgwM2JjfSwKKwl7J24nLCAnKicsIDB4MDNiZH0sCisJeydjJywgJyonLCAweDAzYmV9LAorCXsnbycsICcqJywgMHgwM2JmfSwKKwl7J3AnLCAnKicsIDB4MDNjMH0sCisJeydyJywgJyonLCAweDAzYzF9LAorCXsnKicsICdzJywgMHgwM2MyfSwKKwl7J3MnLCAnKicsIDB4MDNjM30sCisJeyd0JywgJyonLCAweDAzYzR9LAorCXsndScsICcqJywgMHgwM2M1fSwKKwl7J2YnLCAnKicsIDB4MDNjNn0sCisJeyd4JywgJyonLCAweDAzYzd9LAorCXsncScsICcqJywgMHgwM2M4fSwKKwl7J3cnLCAnKicsIDB4MDNjOX0sCisJeydqJywgJyonLCAweDAzY2F9LAorCXsndicsICcqJywgMHgwM2NifSwKKwl7J28nLCAnJScsIDB4MDNjY30sCisJeyd1JywgJyUnLCAweDAzY2R9LAorCXsndycsICclJywgMHgwM2NlfSwKKwl7J1wnJywgJ0cnLCAweDAzZDh9LAorCXsnLCcsICdHJywgMHgwM2Q5fSwKKwl7J1QnLCAnMycsIDB4MDNkYX0sCisJeyd0JywgJzMnLCAweDAzZGJ9LAorCXsnTScsICczJywgMHgwM2RjfSwKKwl7J20nLCAnMycsIDB4MDNkZH0sCisJeydLJywgJzMnLCAweDAzZGV9LAorCXsnaycsICczJywgMHgwM2RmfSwKKwl7J1AnLCAnMycsIDB4MDNlMH0sCisJeydwJywgJzMnLCAweDAzZTF9LAorCXsnXCcnLCAnJScsIDB4MDNmNH0sCisJeydqJywgJzMnLCAweDAzZjV9LAorCXsnSScsICdPJywgMHgwNDAxfSwKKwl7J0QnLCAnJScsIDB4MDQwMn0sCisJeydHJywgJyUnLCAweDA0MDN9LAorCXsnSScsICdFJywgMHgwNDA0fSwKKwl7J0QnLCAnUycsIDB4MDQwNX0sCisJeydJJywgJ0knLCAweDA0MDZ9LAorCXsnWScsICdJJywgMHgwNDA3fSwKKwl7J0onLCAnJScsIDB4MDQwOH0sCisJeydMJywgJ0onLCAweDA0MDl9LAorCXsnTicsICdKJywgMHgwNDBhfSwKKwl7J1QnLCAncycsIDB4MDQwYn0sCisJeydLJywgJ0onLCAweDA0MGN9LAorCXsnVicsICclJywgMHgwNDBlfSwKKwl7J0QnLCAnWicsIDB4MDQwZn0sCisJeydBJywgJz0nLCAweDA0MTB9LAorCXsnQicsICc9JywgMHgwNDExfSwKKwl7J1YnLCAnPScsIDB4MDQxMn0sCisJeydHJywgJz0nLCAweDA0MTN9LAorCXsnRCcsICc9JywgMHgwNDE0fSwKKwl7J0UnLCAnPScsIDB4MDQxNX0sCisJeydaJywgJyUnLCAweDA0MTZ9LAorCXsnWicsICc9JywgMHgwNDE3fSwKKwl7J0knLCAnPScsIDB4MDQxOH0sCisJeydKJywgJz0nLCAweDA0MTl9LAorCXsnSycsICc9JywgMHgwNDFhfSwKKwl7J0wnLCAnPScsIDB4MDQxYn0sCisJeydNJywgJz0nLCAweDA0MWN9LAorCXsnTicsICc9JywgMHgwNDFkfSwKKwl7J08nLCAnPScsIDB4MDQxZX0sCisJeydQJywgJz0nLCAweDA0MWZ9LAorCXsnUicsICc9JywgMHgwNDIwfSwKKwl7J1MnLCAnPScsIDB4MDQyMX0sCisJeydUJywgJz0nLCAweDA0MjJ9LAorCXsnVScsICc9JywgMHgwNDIzfSwKKwl7J0YnLCAnPScsIDB4MDQyNH0sCisJeydIJywgJz0nLCAweDA0MjV9LAorCXsnQycsICc9JywgMHgwNDI2fSwKKwl7J0MnLCAnJScsIDB4MDQyN30sCisJeydTJywgJyUnLCAweDA0Mjh9LAorCXsnUycsICdjJywgMHgwNDI5fSwKKwl7Jz0nLCAnIicsIDB4MDQyYX0sCisJeydZJywgJz0nLCAweDA0MmJ9LAorCXsnJScsICciJywgMHgwNDJjfSwKKwl7J0onLCAnRScsIDB4MDQyZH0sCisJeydKJywgJ1UnLCAweDA0MmV9LAorCXsnSicsICdBJywgMHgwNDJmfSwKKwl7J2EnLCAnPScsIDB4MDQzMH0sCisJeydiJywgJz0nLCAweDA0MzF9LAorCXsndicsICc9JywgMHgwNDMyfSwKKwl7J2cnLCAnPScsIDB4MDQzM30sCisJeydkJywgJz0nLCAweDA0MzR9LAorCXsnZScsICc9JywgMHgwNDM1fSwKKwl7J3onLCAnJScsIDB4MDQzNn0sCisJeyd6JywgJz0nLCAweDA0Mzd9LAorCXsnaScsICc9JywgMHgwNDM4fSwKKwl7J2onLCAnPScsIDB4MDQzOX0sCisJeydrJywgJz0nLCAweDA0M2F9LAorCXsnbCcsICc9JywgMHgwNDNifSwKKwl7J20nLCAnPScsIDB4MDQzY30sCisJeyduJywgJz0nLCAweDA0M2R9LAorCXsnbycsICc9JywgMHgwNDNlfSwKKwl7J3AnLCAnPScsIDB4MDQzZn0sCisJeydyJywgJz0nLCAweDA0NDB9LAorCXsncycsICc9JywgMHgwNDQxfSwKKwl7J3QnLCAnPScsIDB4MDQ0Mn0sCisJeyd1JywgJz0nLCAweDA0NDN9LAorCXsnZicsICc9JywgMHgwNDQ0fSwKKwl7J2gnLCAnPScsIDB4MDQ0NX0sCisJeydjJywgJz0nLCAweDA0NDZ9LAorCXsnYycsICclJywgMHgwNDQ3fSwKKwl7J3MnLCAnJScsIDB4MDQ0OH0sCisJeydzJywgJ2MnLCAweDA0NDl9LAorCXsnPScsICdcJycsIDB4MDQ0YX0sCisJeyd5JywgJz0nLCAweDA0NGJ9LAorCXsnJScsICdcJycsIDB4MDQ0Y30sCisJeydqJywgJ2UnLCAweDA0NGR9LAorCXsnaicsICd1JywgMHgwNDRlfSwKKwl7J2onLCAnYScsIDB4MDQ0Zn0sCisJeydpJywgJ28nLCAweDA0NTF9LAorCXsnZCcsICclJywgMHgwNDUyfSwKKwl7J2cnLCAnJScsIDB4MDQ1M30sCisJeydpJywgJ2UnLCAweDA0NTR9LAorCXsnZCcsICdzJywgMHgwNDU1fSwKKwl7J2knLCAnaScsIDB4MDQ1Nn0sCisJeyd5JywgJ2knLCAweDA0NTd9LAorCXsnaicsICclJywgMHgwNDU4fSwKKwl7J2wnLCAnaicsIDB4MDQ1OX0sCisJeyduJywgJ2onLCAweDA0NWF9LAorCXsndCcsICdzJywgMHgwNDVifSwKKwl7J2snLCAnaicsIDB4MDQ1Y30sCisJeyd2JywgJyUnLCAweDA0NWV9LAorCXsnZCcsICd6JywgMHgwNDVmfSwKKwl7J1knLCAnMycsIDB4MDQ2Mn0sCisJeyd5JywgJzMnLCAweDA0NjN9LAorCXsnTycsICczJywgMHgwNDZhfSwKKwl7J28nLCAnMycsIDB4MDQ2Yn0sCisJeydGJywgJzMnLCAweDA0NzJ9LAorCXsnZicsICczJywgMHgwNDczfSwKKwl7J1YnLCAnMycsIDB4MDQ3NH0sCisJeyd2JywgJzMnLCAweDA0NzV9LAorCXsnQycsICczJywgMHgwNDgwfSwKKwl7J2MnLCAnMycsIDB4MDQ4MX0sCisJeydHJywgJzMnLCAweDA0OTB9LAorCXsnZycsICczJywgMHgwNDkxfSwKKwl7J0EnLCAnKycsIDB4MDVkMH0sCisJeydCJywgJysnLCAweDA1ZDF9LAorCXsnRycsICcrJywgMHgwNWQyfSwKKwl7J0QnLCAnKycsIDB4MDVkM30sCisJeydIJywgJysnLCAweDA1ZDR9LAorCXsnVycsICcrJywgMHgwNWQ1fSwKKwl7J1onLCAnKycsIDB4MDVkNn0sCisJeydYJywgJysnLCAweDA1ZDd9LAorCXsnVCcsICdqJywgMHgwNWQ4fSwKKwl7J0onLCAnKycsIDB4MDVkOX0sCisJeydLJywgJyUnLCAweDA1ZGF9LAorCXsnSycsICcrJywgMHgwNWRifSwKKwl7J0wnLCAnKycsIDB4MDVkY30sCisJeydNJywgJyUnLCAweDA1ZGR9LAorCXsnTScsICcrJywgMHgwNWRlfSwKKwl7J04nLCAnJScsIDB4MDVkZn0sCisJeydOJywgJysnLCAweDA1ZTB9LAorCXsnUycsICcrJywgMHgwNWUxfSwKKwl7J0UnLCAnKycsIDB4MDVlMn0sCisJeydQJywgJyUnLCAweDA1ZTN9LAorCXsnUCcsICcrJywgMHgwNWU0fSwKKwl7J1onLCAnaicsIDB4MDVlNX0sCisJeydaJywgJ0onLCAweDA1ZTZ9LAorCXsnUScsICcrJywgMHgwNWU3fSwKKwl7J1InLCAnKycsIDB4MDVlOH0sCisJeydTJywgJ2gnLCAweDA1ZTl9LAorCXsnVCcsICcrJywgMHgwNWVhfSwKKwl7JywnLCAnKycsIDB4MDYwY30sCisJeyc7JywgJysnLCAweDA2MWJ9LAorCXsnPycsICcrJywgMHgwNjFmfSwKKwl7J0gnLCAnXCcnLCAweDA2MjF9LAorCXsnYScsICdNJywgMHgwNjIyfSwKKwl7J2EnLCAnSCcsIDB4MDYyM30sCisJeyd3JywgJ0gnLCAweDA2MjR9LAorCXsnYScsICdoJywgMHgwNjI1fSwKKwl7J3knLCAnSCcsIDB4MDYyNn0sCisJeydhJywgJysnLCAweDA2Mjd9LAorCXsnYicsICcrJywgMHgwNjI4fSwKKwl7J3QnLCAnbScsIDB4MDYyOX0sCisJeyd0JywgJysnLCAweDA2MmF9LAorCXsndCcsICdrJywgMHgwNjJifSwKKwl7J2cnLCAnKycsIDB4MDYyY30sCisJeydoJywgJ2snLCAweDA2MmR9LAorCXsneCcsICcrJywgMHgwNjJlfSwKKwl7J2QnLCAnKycsIDB4MDYyZn0sCisJeydkJywgJ2snLCAweDA2MzB9LAorCXsncicsICcrJywgMHgwNjMxfSwKKwl7J3onLCAnKycsIDB4MDYzMn0sCisJeydzJywgJysnLCAweDA2MzN9LAorCXsncycsICduJywgMHgwNjM0fSwKKwl7J2MnLCAnKycsIDB4MDYzNX0sCisJeydkJywgJ2QnLCAweDA2MzZ9LAorCXsndCcsICdqJywgMHgwNjM3fSwKKwl7J3onLCAnSCcsIDB4MDYzOH0sCisJeydlJywgJysnLCAweDA2Mzl9LAorCXsnaScsICcrJywgMHgwNjNhfSwKKwl7JysnLCAnKycsIDB4MDY0MH0sCisJeydmJywgJysnLCAweDA2NDF9LAorCXsncScsICcrJywgMHgwNjQyfSwKKwl7J2snLCAnKycsIDB4MDY0M30sCisJeydsJywgJysnLCAweDA2NDR9LAorCXsnbScsICcrJywgMHgwNjQ1fSwKKwl7J24nLCAnKycsIDB4MDY0Nn0sCisJeydoJywgJysnLCAweDA2NDd9LAorCXsndycsICcrJywgMHgwNjQ4fSwKKwl7J2onLCAnKycsIDB4MDY0OX0sCisJeyd5JywgJysnLCAweDA2NGF9LAorCXsnOicsICcrJywgMHgwNjRifSwKKwl7JyInLCAnKycsIDB4MDY0Y30sCisJeyc9JywgJysnLCAweDA2NGR9LAorCXsnLycsICcrJywgMHgwNjRlfSwKKwl7J1wnJywgJysnLCAweDA2NGZ9LAorCXsnMScsICcrJywgMHgwNjUwfSwKKwl7JzMnLCAnKycsIDB4MDY1MX0sCisJeycwJywgJysnLCAweDA2NTJ9LAorCXsnYScsICdTJywgMHgwNjcwfSwKKwl7J3AnLCAnKycsIDB4MDY3ZX0sCisJeyd2JywgJysnLCAweDA2YTR9LAorCXsnZycsICdmJywgMHgwNmFmfSwKKwl7JzAnLCAnYScsIDB4MDZmMH0sCisJeycxJywgJ2EnLCAweDA2ZjF9LAorCXsnMicsICdhJywgMHgwNmYyfSwKKwl7JzMnLCAnYScsIDB4MDZmM30sCisJeyc0JywgJ2EnLCAweDA2ZjR9LAorCXsnNScsICdhJywgMHgwNmY1fSwKKwl7JzYnLCAnYScsIDB4MDZmNn0sCisJeyc3JywgJ2EnLCAweDA2Zjd9LAorCXsnOCcsICdhJywgMHgwNmY4fSwKKwl7JzknLCAnYScsIDB4MDZmOX0sCisJeydCJywgJy4nLCAweDFlMDJ9LAorCXsnYicsICcuJywgMHgxZTAzfSwKKwl7J0InLCAnXycsIDB4MWUwNn0sCisJeydiJywgJ18nLCAweDFlMDd9LAorCXsnRCcsICcuJywgMHgxZTBhfSwKKwl7J2QnLCAnLicsIDB4MWUwYn0sCisJeydEJywgJ18nLCAweDFlMGV9LAorCXsnZCcsICdfJywgMHgxZTBmfSwKKwl7J0QnLCAnLCcsIDB4MWUxMH0sCisJeydkJywgJywnLCAweDFlMTF9LAorCXsnRicsICcuJywgMHgxZTFlfSwKKwl7J2YnLCAnLicsIDB4MWUxZn0sCisJeydHJywgJy0nLCAweDFlMjB9LAorCXsnZycsICctJywgMHgxZTIxfSwKKwl7J0gnLCAnLicsIDB4MWUyMn0sCisJeydoJywgJy4nLCAweDFlMjN9LAorCXsnSCcsICc6JywgMHgxZTI2fSwKKwl7J2gnLCAnOicsIDB4MWUyN30sCisJeydIJywgJywnLCAweDFlMjh9LAorCXsnaCcsICcsJywgMHgxZTI5fSwKKwl7J0snLCAnXCcnLCAweDFlMzB9LAorCXsnaycsICdcJycsIDB4MWUzMX0sCisJeydLJywgJ18nLCAweDFlMzR9LAorCXsnaycsICdfJywgMHgxZTM1fSwKKwl7J0wnLCAnXycsIDB4MWUzYX0sCisJeydsJywgJ18nLCAweDFlM2J9LAorCXsnTScsICdcJycsIDB4MWUzZX0sCisJeydtJywgJ1wnJywgMHgxZTNmfSwKKwl7J00nLCAnLicsIDB4MWU0MH0sCisJeydtJywgJy4nLCAweDFlNDF9LAorCXsnTicsICcuJywgMHgxZTQ0fSwKKwl7J24nLCAnLicsIDB4MWU0NX0sCisJeydOJywgJ18nLCAweDFlNDh9LAorCXsnbicsICdfJywgMHgxZTQ5fSwKKwl7J1AnLCAnXCcnLCAweDFlNTR9LAorCXsncCcsICdcJycsIDB4MWU1NX0sCisJeydQJywgJy4nLCAweDFlNTZ9LAorCXsncCcsICcuJywgMHgxZTU3fSwKKwl7J1InLCAnLicsIDB4MWU1OH0sCisJeydyJywgJy4nLCAweDFlNTl9LAorCXsnUicsICdfJywgMHgxZTVlfSwKKwl7J3InLCAnXycsIDB4MWU1Zn0sCisJeydTJywgJy4nLCAweDFlNjB9LAorCXsncycsICcuJywgMHgxZTYxfSwKKwl7J1QnLCAnLicsIDB4MWU2YX0sCisJeyd0JywgJy4nLCAweDFlNmJ9LAorCXsnVCcsICdfJywgMHgxZTZlfSwKKwl7J3QnLCAnXycsIDB4MWU2Zn0sCisJeydWJywgJz8nLCAweDFlN2N9LAorCXsndicsICc/JywgMHgxZTdkfSwKKwl7J1cnLCAnIScsIDB4MWU4MH0sCisJeyd3JywgJyEnLCAweDFlODF9LAorCXsnVycsICdcJycsIDB4MWU4Mn0sCisJeyd3JywgJ1wnJywgMHgxZTgzfSwKKwl7J1cnLCAnOicsIDB4MWU4NH0sCisJeyd3JywgJzonLCAweDFlODV9LAorCXsnVycsICcuJywgMHgxZTg2fSwKKwl7J3cnLCAnLicsIDB4MWU4N30sCisJeydYJywgJy4nLCAweDFlOGF9LAorCXsneCcsICcuJywgMHgxZThifSwKKwl7J1gnLCAnOicsIDB4MWU4Y30sCisJeyd4JywgJzonLCAweDFlOGR9LAorCXsnWScsICcuJywgMHgxZThlfSwKKwl7J3knLCAnLicsIDB4MWU4Zn0sCisJeydaJywgJz4nLCAweDFlOTB9LAorCXsneicsICc+JywgMHgxZTkxfSwKKwl7J1onLCAnXycsIDB4MWU5NH0sCisJeyd6JywgJ18nLCAweDFlOTV9LAorCXsnaCcsICdfJywgMHgxZTk2fSwKKwl7J3QnLCAnOicsIDB4MWU5N30sCisJeyd3JywgJzAnLCAweDFlOTh9LAorCXsneScsICcwJywgMHgxZTk5fSwKKwl7J0EnLCAnMicsIDB4MWVhMn0sCisJeydhJywgJzInLCAweDFlYTN9LAorCXsnRScsICcyJywgMHgxZWJhfSwKKwl7J2UnLCAnMicsIDB4MWViYn0sCisJeydFJywgJz8nLCAweDFlYmN9LAorCXsnZScsICc/JywgMHgxZWJkfSwKKwl7J0knLCAnMicsIDB4MWVjOH0sCisJeydpJywgJzInLCAweDFlYzl9LAorCXsnTycsICcyJywgMHgxZWNlfSwKKwl7J28nLCAnMicsIDB4MWVjZn0sCisJeydVJywgJzInLCAweDFlZTZ9LAorCXsndScsICcyJywgMHgxZWU3fSwKKwl7J1knLCAnIScsIDB4MWVmMn0sCisJeyd5JywgJyEnLCAweDFlZjN9LAorCXsnWScsICcyJywgMHgxZWY2fSwKKwl7J3knLCAnMicsIDB4MWVmN30sCisJeydZJywgJz8nLCAweDFlZjh9LAorCXsneScsICc/JywgMHgxZWY5fSwKKwl7JzsnLCAnXCcnLCAweDFmMDB9LAorCXsnLCcsICdcJycsIDB4MWYwMX0sCisJeyc7JywgJyEnLCAweDFmMDJ9LAorCXsnLCcsICchJywgMHgxZjAzfSwKKwl7Jz8nLCAnOycsIDB4MWYwNH0sCisJeyc/JywgJywnLCAweDFmMDV9LAorCXsnIScsICc6JywgMHgxZjA2fSwKKwl7Jz8nLCAnOicsIDB4MWYwN30sCisJeycxJywgJ04nLCAweDIwMDJ9LAorCXsnMScsICdNJywgMHgyMDAzfSwKKwl7JzMnLCAnTScsIDB4MjAwNH0sCisJeyc0JywgJ00nLCAweDIwMDV9LAorCXsnNicsICdNJywgMHgyMDA2fSwKKwl7JzEnLCAnVCcsIDB4MjAwOX0sCisJeycxJywgJ0gnLCAweDIwMGF9LAorCXsnLScsICcxJywgMHgyMDEwfSwKKwl7Jy0nLCAnTicsIDB4MjAxM30sCisJeyctJywgJ00nLCAweDIwMTR9LAorCXsnLScsICczJywgMHgyMDE1fSwKKwl7JyEnLCAnMicsIDB4MjAxNn0sCisJeyc9JywgJzInLCAweDIwMTd9LAorCXsnXCcnLCAnNicsIDB4MjAxOH0sCisJeydcJycsICc5JywgMHgyMDE5fSwKKwl7Jy4nLCAnOScsIDB4MjAxYX0sCisJeyc5JywgJ1wnJywgMHgyMDFifSwKKwl7JyInLCAnNicsIDB4MjAxY30sCisJeyciJywgJzknLCAweDIwMWR9LAorCXsnOicsICc5JywgMHgyMDFlfSwKKwl7JzknLCAnIicsIDB4MjAxZn0sCisJeycvJywgJy0nLCAweDIwMjB9LAorCXsnLycsICc9JywgMHgyMDIxfSwKKwl7Jy4nLCAnLicsIDB4MjAyNX0sCisJeyclJywgJzAnLCAweDIwMzB9LAorCXsnMScsICdcJycsIDB4MjAzMn0sCisJeycyJywgJ1wnJywgMHgyMDMzfSwKKwl7JzMnLCAnXCcnLCAweDIwMzR9LAorCXsnMScsICciJywgMHgyMDM1fSwKKwl7JzInLCAnIicsIDB4MjAzNn0sCisJeyczJywgJyInLCAweDIwMzd9LAorCXsnQycsICdhJywgMHgyMDM4fSwKKwl7JzwnLCAnMScsIDB4MjAzOX0sCisJeyc+JywgJzEnLCAweDIwM2F9LAorCXsnOicsICdYJywgMHgyMDNifSwKKwl7J1wnJywgJy0nLCAweDIwM2V9LAorCXsnLycsICdmJywgMHgyMDQ0fSwKKwl7JzAnLCAnUycsIDB4MjA3MH0sCisJeyc0JywgJ1MnLCAweDIwNzR9LAorCXsnNScsICdTJywgMHgyMDc1fSwKKwl7JzYnLCAnUycsIDB4MjA3Nn0sCisJeyc3JywgJ1MnLCAweDIwNzd9LAorCXsnOCcsICdTJywgMHgyMDc4fSwKKwl7JzknLCAnUycsIDB4MjA3OX0sCisJeycrJywgJ1MnLCAweDIwN2F9LAorCXsnLScsICdTJywgMHgyMDdifSwKKwl7Jz0nLCAnUycsIDB4MjA3Y30sCisJeycoJywgJ1MnLCAweDIwN2R9LAorCXsnKScsICdTJywgMHgyMDdlfSwKKwl7J24nLCAnUycsIDB4MjA3Zn0sCisJeycwJywgJ3MnLCAweDIwODB9LAorCXsnMScsICdzJywgMHgyMDgxfSwKKwl7JzInLCAncycsIDB4MjA4Mn0sCisJeyczJywgJ3MnLCAweDIwODN9LAorCXsnNCcsICdzJywgMHgyMDg0fSwKKwl7JzUnLCAncycsIDB4MjA4NX0sCisJeyc2JywgJ3MnLCAweDIwODZ9LAorCXsnNycsICdzJywgMHgyMDg3fSwKKwl7JzgnLCAncycsIDB4MjA4OH0sCisJeyc5JywgJ3MnLCAweDIwODl9LAorCXsnKycsICdzJywgMHgyMDhhfSwKKwl7Jy0nLCAncycsIDB4MjA4Yn0sCisJeyc9JywgJ3MnLCAweDIwOGN9LAorCXsnKCcsICdzJywgMHgyMDhkfSwKKwl7JyknLCAncycsIDB4MjA4ZX0sCisJeydMJywgJ2knLCAweDIwYTR9LAorCXsnUCcsICd0JywgMHgyMGE3fSwKKwl7J1cnLCAnPScsIDB4MjBhOX0sCisJeydvJywgJ0MnLCAweDIxMDN9LAorCXsnYycsICdvJywgMHgyMTA1fSwKKwl7J28nLCAnRicsIDB4MjEwOX0sCisJeydOJywgJzAnLCAweDIxMTZ9LAorCXsnUCcsICdPJywgMHgyMTE3fSwKKwl7J1InLCAneCcsIDB4MjExZX0sCisJeydTJywgJ00nLCAweDIxMjB9LAorCXsnVCcsICdNJywgMHgyMTIyfSwKKwl7J08nLCAnbScsIDB4MjEyNn0sCisJeydBJywgJ08nLCAweDIxMmJ9LAorCXsnMScsICczJywgMHgyMTUzfSwKKwl7JzInLCAnMycsIDB4MjE1NH0sCisJeycxJywgJzUnLCAweDIxNTV9LAorCXsnMicsICc1JywgMHgyMTU2fSwKKwl7JzMnLCAnNScsIDB4MjE1N30sCisJeyc0JywgJzUnLCAweDIxNTh9LAorCXsnMScsICc2JywgMHgyMTU5fSwKKwl7JzUnLCAnNicsIDB4MjE1YX0sCisJeycxJywgJzgnLCAweDIxNWJ9LAorCXsnMycsICc4JywgMHgyMTVjfSwKKwl7JzUnLCAnOCcsIDB4MjE1ZH0sCisJeyc3JywgJzgnLCAweDIxNWV9LAorCXsnMScsICdSJywgMHgyMTYwfSwKKwl7JzInLCAnUicsIDB4MjE2MX0sCisJeyczJywgJ1InLCAweDIxNjJ9LAorCXsnNCcsICdSJywgMHgyMTYzfSwKKwl7JzUnLCAnUicsIDB4MjE2NH0sCisJeyc2JywgJ1InLCAweDIxNjV9LAorCXsnNycsICdSJywgMHgyMTY2fSwKKwl7JzgnLCAnUicsIDB4MjE2N30sCisJeyc5JywgJ1InLCAweDIxNjh9LAorCXsnYScsICdSJywgMHgyMTY5fSwKKwl7J2InLCAnUicsIDB4MjE2YX0sCisJeydjJywgJ1InLCAweDIxNmJ9LAorCXsnMScsICdyJywgMHgyMTcwfSwKKwl7JzInLCAncicsIDB4MjE3MX0sCisJeyczJywgJ3InLCAweDIxNzJ9LAorCXsnNCcsICdyJywgMHgyMTczfSwKKwl7JzUnLCAncicsIDB4MjE3NH0sCisJeyc2JywgJ3InLCAweDIxNzV9LAorCXsnNycsICdyJywgMHgyMTc2fSwKKwl7JzgnLCAncicsIDB4MjE3N30sCisJeyc5JywgJ3InLCAweDIxNzh9LAorCXsnYScsICdyJywgMHgyMTc5fSwKKwl7J2InLCAncicsIDB4MjE3YX0sCisJeydjJywgJ3InLCAweDIxN2J9LAorCXsnPCcsICctJywgMHgyMTkwfSwKKwl7Jy0nLCAnIScsIDB4MjE5MX0sCisJeyctJywgJz4nLCAweDIxOTJ9LAorCXsnLScsICd2JywgMHgyMTkzfSwKKwl7JzwnLCAnPicsIDB4MjE5NH0sCisJeydVJywgJ0QnLCAweDIxOTV9LAorCXsnPCcsICc9JywgMHgyMWQwfSwKKwl7Jz0nLCAnPicsIDB4MjFkMn0sCisJeyc9JywgJz0nLCAweDIxZDR9LAorCXsnRicsICdBJywgMHgyMjAwfSwKKwl7J2QnLCAnUCcsIDB4MjIwMn0sCisJeydUJywgJ0UnLCAweDIyMDN9LAorCXsnLycsICcwJywgMHgyMjA1fSwKKwl7J0QnLCAnRScsIDB4MjIwNn0sCisJeydOJywgJ0InLCAweDIyMDd9LAorCXsnKCcsICctJywgMHgyMjA4fSwKKwl7Jy0nLCAnKScsIDB4MjIwYn0sCisJeycqJywgJ1AnLCAweDIyMGZ9LAorCXsnKycsICdaJywgMHgyMjExfSwKKwl7Jy0nLCAnMicsIDB4MjIxMn0sCisJeyctJywgJysnLCAweDIyMTN9LAorCXsnKicsICctJywgMHgyMjE3fSwKKwl7J08nLCAnYicsIDB4MjIxOH0sCisJeydTJywgJ2InLCAweDIyMTl9LAorCXsnUicsICdUJywgMHgyMjFhfSwKKwl7JzAnLCAnKCcsIDB4MjIxZH0sCisJeycwJywgJzAnLCAweDIyMWV9LAorCXsnLScsICdMJywgMHgyMjFmfSwKKwl7Jy0nLCAnVicsIDB4MjIyMH0sCisJeydQJywgJ1AnLCAweDIyMjV9LAorCXsnQScsICdOJywgMHgyMjI3fSwKKwl7J08nLCAnUicsIDB4MjIyOH0sCisJeycoJywgJ1UnLCAweDIyMjl9LAorCXsnKScsICdVJywgMHgyMjJhfSwKKwl7J0knLCAnbicsIDB4MjIyYn0sCisJeydEJywgJ0knLCAweDIyMmN9LAorCXsnSScsICdvJywgMHgyMjJlfSwKKwl7Jy4nLCAnOicsIDB4MjIzNH0sCisJeyc6JywgJy4nLCAweDIyMzV9LAorCXsnOicsICdSJywgMHgyMjM2fSwKKwl7JzonLCAnOicsIDB4MjIzN30sCisJeyc/JywgJzEnLCAweDIyM2N9LAorCXsnQycsICdHJywgMHgyMjNlfSwKKwl7Jz8nLCAnLScsIDB4MjI0M30sCisJeyc/JywgJz0nLCAweDIyNDV9LAorCXsnPycsICcyJywgMHgyMjQ4fSwKKwl7Jz0nLCAnPycsIDB4MjI0Y30sCisJeydIJywgJ0knLCAweDIyNTN9LAorCXsnIScsICc9JywgMHgyMjYwfSwKKwl7Jz0nLCAnMycsIDB4MjI2MX0sCisJeyc9JywgJzwnLCAweDIyNjR9LAorCXsnPicsICc9JywgMHgyMjY1fSwKKwl7JzwnLCAnKicsIDB4MjI2YX0sCisJeycqJywgJz4nLCAweDIyNmJ9LAorCXsnIScsICc8JywgMHgyMjZlfSwKKwl7JyEnLCAnPicsIDB4MjI2Zn0sCisJeycoJywgJ0MnLCAweDIyODJ9LAorCXsnKScsICdDJywgMHgyMjgzfSwKKwl7JygnLCAnXycsIDB4MjI4Nn0sCisJeycpJywgJ18nLCAweDIyODd9LAorCXsnMCcsICcuJywgMHgyMjk5fSwKKwl7JzAnLCAnMicsIDB4MjI5YX0sCisJeyctJywgJ1QnLCAweDIyYTV9LAorCXsnLicsICdQJywgMHgyMmM1fSwKKwl7JzonLCAnMycsIDB4MjJlZX0sCisJeycuJywgJzMnLCAweDIyZWZ9LAorCXsnRScsICdoJywgMHgyMzAyfSwKKwl7JzwnLCAnNycsIDB4MjMwOH0sCisJeyc+JywgJzcnLCAweDIzMDl9LAorCXsnNycsICc8JywgMHgyMzBhfSwKKwl7JzcnLCAnPicsIDB4MjMwYn0sCisJeydOJywgJ0knLCAweDIzMTB9LAorCXsnKCcsICdBJywgMHgyMzEyfSwKKwl7J1QnLCAnUicsIDB4MjMxNX0sCisJeydJJywgJ3UnLCAweDIzMjB9LAorCXsnSScsICdsJywgMHgyMzIxfSwKKwl7JzwnLCAnLycsIDB4MjMyOX0sCisJeycvJywgJz4nLCAweDIzMmF9LAorCXsnVicsICdzJywgMHgyNDIzfSwKKwl7JzEnLCAnaCcsIDB4MjQ0MH0sCisJeyczJywgJ2gnLCAweDI0NDF9LAorCXsnMicsICdoJywgMHgyNDQyfSwKKwl7JzQnLCAnaCcsIDB4MjQ0M30sCisJeycxJywgJ2onLCAweDI0NDZ9LAorCXsnMicsICdqJywgMHgyNDQ3fSwKKwl7JzMnLCAnaicsIDB4MjQ0OH0sCisJeyc0JywgJ2onLCAweDI0NDl9LAorCXsnMScsICcuJywgMHgyNDg4fSwKKwl7JzInLCAnLicsIDB4MjQ4OX0sCisJeyczJywgJy4nLCAweDI0OGF9LAorCXsnNCcsICcuJywgMHgyNDhifSwKKwl7JzUnLCAnLicsIDB4MjQ4Y30sCisJeyc2JywgJy4nLCAweDI0OGR9LAorCXsnNycsICcuJywgMHgyNDhlfSwKKwl7JzgnLCAnLicsIDB4MjQ4Zn0sCisJeyc5JywgJy4nLCAweDI0OTB9LAorCXsnaCcsICdoJywgMHgyNTAwfSwKKwl7J0gnLCAnSCcsIDB4MjUwMX0sCisJeyd2JywgJ3YnLCAweDI1MDJ9LAorCXsnVicsICdWJywgMHgyNTAzfSwKKwl7JzMnLCAnLScsIDB4MjUwNH0sCisJeyczJywgJ18nLCAweDI1MDV9LAorCXsnMycsICchJywgMHgyNTA2fSwKKwl7JzMnLCAnLycsIDB4MjUwN30sCisJeyc0JywgJy0nLCAweDI1MDh9LAorCXsnNCcsICdfJywgMHgyNTA5fSwKKwl7JzQnLCAnIScsIDB4MjUwYX0sCisJeyc0JywgJy8nLCAweDI1MGJ9LAorCXsnZCcsICdyJywgMHgyNTBjfSwKKwl7J2QnLCAnUicsIDB4MjUwZH0sCisJeydEJywgJ3InLCAweDI1MGV9LAorCXsnRCcsICdSJywgMHgyNTBmfSwKKwl7J2QnLCAnbCcsIDB4MjUxMH0sCisJeydkJywgJ0wnLCAweDI1MTF9LAorCXsnRCcsICdsJywgMHgyNTEyfSwKKwl7J0wnLCAnRCcsIDB4MjUxM30sCisJeyd1JywgJ3InLCAweDI1MTR9LAorCXsndScsICdSJywgMHgyNTE1fSwKKwl7J1UnLCAncicsIDB4MjUxNn0sCisJeydVJywgJ1InLCAweDI1MTd9LAorCXsndScsICdsJywgMHgyNTE4fSwKKwl7J3UnLCAnTCcsIDB4MjUxOX0sCisJeydVJywgJ2wnLCAweDI1MWF9LAorCXsnVScsICdMJywgMHgyNTFifSwKKwl7J3YnLCAncicsIDB4MjUxY30sCisJeyd2JywgJ1InLCAweDI1MWR9LAorCXsnVicsICdyJywgMHgyNTIwfSwKKwl7J1YnLCAnUicsIDB4MjUyM30sCisJeyd2JywgJ2wnLCAweDI1MjR9LAorCXsndicsICdMJywgMHgyNTI1fSwKKwl7J1YnLCAnbCcsIDB4MjUyOH0sCisJeydWJywgJ0wnLCAweDI1MmJ9LAorCXsnZCcsICdoJywgMHgyNTJjfSwKKwl7J2QnLCAnSCcsIDB4MjUyZn0sCisJeydEJywgJ2gnLCAweDI1MzB9LAorCXsnRCcsICdIJywgMHgyNTMzfSwKKwl7J3UnLCAnaCcsIDB4MjUzNH0sCisJeyd1JywgJ0gnLCAweDI1Mzd9LAorCXsnVScsICdoJywgMHgyNTM4fSwKKwl7J1UnLCAnSCcsIDB4MjUzYn0sCisJeyd2JywgJ2gnLCAweDI1M2N9LAorCXsndicsICdIJywgMHgyNTNmfSwKKwl7J1YnLCAnaCcsIDB4MjU0Mn0sCisJeydWJywgJ0gnLCAweDI1NGJ9LAorCXsnRicsICdEJywgMHgyNTcxfSwKKwl7J0InLCAnRCcsIDB4MjU3Mn0sCisJeydUJywgJ0InLCAweDI1ODB9LAorCXsnTCcsICdCJywgMHgyNTg0fSwKKwl7J0YnLCAnQicsIDB4MjU4OH0sCisJeydsJywgJ0InLCAweDI1OGN9LAorCXsnUicsICdCJywgMHgyNTkwfSwKKwl7Jy4nLCAnUycsIDB4MjU5MX0sCisJeyc6JywgJ1MnLCAweDI1OTJ9LAorCXsnPycsICdTJywgMHgyNTkzfSwKKwl7J2YnLCAnUycsIDB4MjVhMH0sCisJeydPJywgJ1MnLCAweDI1YTF9LAorCXsnUicsICdPJywgMHgyNWEyfSwKKwl7J1InLCAncicsIDB4MjVhM30sCisJeydSJywgJ0YnLCAweDI1YTR9LAorCXsnUicsICdZJywgMHgyNWE1fSwKKwl7J1InLCAnSCcsIDB4MjVhNn0sCisJeydSJywgJ1onLCAweDI1YTd9LAorCXsnUicsICdLJywgMHgyNWE4fSwKKwl7J1InLCAnWCcsIDB4MjVhOX0sCisJeydzJywgJ0InLCAweDI1YWF9LAorCXsnUycsICdSJywgMHgyNWFjfSwKKwl7J08nLCAncicsIDB4MjVhZH0sCisJeydVJywgJ1QnLCAweDI1YjJ9LAorCXsndScsICdUJywgMHgyNWIzfSwKKwl7J1AnLCAnUicsIDB4MjViNn0sCisJeydUJywgJ3InLCAweDI1Yjd9LAorCXsnRCcsICd0JywgMHgyNWJjfSwKKwl7J2QnLCAnVCcsIDB4MjViZH0sCisJeydQJywgJ0wnLCAweDI1YzB9LAorCXsnVCcsICdsJywgMHgyNWMxfSwKKwl7J0QnLCAnYicsIDB4MjVjNn0sCisJeydEJywgJ3cnLCAweDI1Yzd9LAorCXsnTCcsICdaJywgMHgyNWNhfSwKKwl7JzAnLCAnbScsIDB4MjVjYn0sCisJeycwJywgJ28nLCAweDI1Y2V9LAorCXsnMCcsICdNJywgMHgyNWNmfSwKKwl7JzAnLCAnTCcsIDB4MjVkMH0sCisJeycwJywgJ1InLCAweDI1ZDF9LAorCXsnUycsICduJywgMHgyNWQ4fSwKKwl7J0knLCAnYycsIDB4MjVkOX0sCisJeydGJywgJ2QnLCAweDI1ZTJ9LAorCXsnQicsICdkJywgMHgyNWUzfSwKKwl7JyonLCAnMicsIDB4MjYwNX0sCisJeycqJywgJzEnLCAweDI2MDZ9LAorCXsnPCcsICdIJywgMHgyNjFjfSwKKwl7Jz4nLCAnSCcsIDB4MjYxZX0sCisJeycwJywgJ3UnLCAweDI2M2F9LAorCXsnMCcsICdVJywgMHgyNjNifSwKKwl7J1MnLCAnVScsIDB4MjYzY30sCisJeydGJywgJ20nLCAweDI2NDB9LAorCXsnTScsICdsJywgMHgyNjQyfSwKKwl7J2MnLCAnUycsIDB4MjY2MH0sCisJeydjJywgJ0gnLCAweDI2NjF9LAorCXsnYycsICdEJywgMHgyNjYyfSwKKwl7J2MnLCAnQycsIDB4MjY2M30sCisJeydNJywgJ2QnLCAweDI2Njl9LAorCXsnTScsICc4JywgMHgyNjZhfSwKKwl7J00nLCAnMicsIDB4MjY2Yn0sCisJeydNJywgJ2InLCAweDI2NmR9LAorCXsnTScsICd4JywgMHgyNjZlfSwKKwl7J00nLCAnWCcsIDB4MjY2Zn0sCisJeydPJywgJ0snLCAweDI3MTN9LAorCXsnWCcsICdYJywgMHgyNzE3fSwKKwl7Jy0nLCAnWCcsIDB4MjcyMH0sCisJeydJJywgJ1MnLCAweDMwMDB9LAorCXsnLCcsICdfJywgMHgzMDAxfSwKKwl7Jy4nLCAnXycsIDB4MzAwMn0sCisJeycrJywgJyInLCAweDMwMDN9LAorCXsnKycsICdfJywgMHgzMDA0fSwKKwl7JyonLCAnXycsIDB4MzAwNX0sCisJeyc7JywgJ18nLCAweDMwMDZ9LAorCXsnMCcsICdfJywgMHgzMDA3fSwKKwl7JzwnLCAnKycsIDB4MzAwYX0sCisJeyc+JywgJysnLCAweDMwMGJ9LAorCXsnPCcsICdcJycsIDB4MzAwY30sCisJeyc+JywgJ1wnJywgMHgzMDBkfSwKKwl7JzwnLCAnIicsIDB4MzAwZX0sCisJeyc+JywgJyInLCAweDMwMGZ9LAorCXsnKCcsICciJywgMHgzMDEwfSwKKwl7JyknLCAnIicsIDB4MzAxMX0sCisJeyc9JywgJ1QnLCAweDMwMTJ9LAorCXsnPScsICdfJywgMHgzMDEzfSwKKwl7JygnLCAnXCcnLCAweDMwMTR9LAorCXsnKScsICdcJycsIDB4MzAxNX0sCisJeycoJywgJ0knLCAweDMwMTZ9LAorCXsnKScsICdJJywgMHgzMDE3fSwKKwl7Jy0nLCAnPycsIDB4MzAxY30sCisJeydBJywgJzUnLCAweDMwNDF9LAorCXsnYScsICc1JywgMHgzMDQyfSwKKwl7J0knLCAnNScsIDB4MzA0M30sCisJeydpJywgJzUnLCAweDMwNDR9LAorCXsnVScsICc1JywgMHgzMDQ1fSwKKwl7J3UnLCAnNScsIDB4MzA0Nn0sCisJeydFJywgJzUnLCAweDMwNDd9LAorCXsnZScsICc1JywgMHgzMDQ4fSwKKwl7J08nLCAnNScsIDB4MzA0OX0sCisJeydvJywgJzUnLCAweDMwNGF9LAorCXsnaycsICdhJywgMHgzMDRifSwKKwl7J2cnLCAnYScsIDB4MzA0Y30sCisJeydrJywgJ2knLCAweDMwNGR9LAorCXsnZycsICdpJywgMHgzMDRlfSwKKwl7J2snLCAndScsIDB4MzA0Zn0sCisJeydnJywgJ3UnLCAweDMwNTB9LAorCXsnaycsICdlJywgMHgzMDUxfSwKKwl7J2cnLCAnZScsIDB4MzA1Mn0sCisJeydrJywgJ28nLCAweDMwNTN9LAorCXsnZycsICdvJywgMHgzMDU0fSwKKwl7J3MnLCAnYScsIDB4MzA1NX0sCisJeyd6JywgJ2EnLCAweDMwNTZ9LAorCXsncycsICdpJywgMHgzMDU3fSwKKwl7J3onLCAnaScsIDB4MzA1OH0sCisJeydzJywgJ3UnLCAweDMwNTl9LAorCXsneicsICd1JywgMHgzMDVhfSwKKwl7J3MnLCAnZScsIDB4MzA1Yn0sCisJeyd6JywgJ2UnLCAweDMwNWN9LAorCXsncycsICdvJywgMHgzMDVkfSwKKwl7J3onLCAnbycsIDB4MzA1ZX0sCisJeyd0JywgJ2EnLCAweDMwNWZ9LAorCXsnZCcsICdhJywgMHgzMDYwfSwKKwl7J3QnLCAnaScsIDB4MzA2MX0sCisJeydkJywgJ2knLCAweDMwNjJ9LAorCXsndCcsICdVJywgMHgzMDYzfSwKKwl7J3QnLCAndScsIDB4MzA2NH0sCisJeydkJywgJ3UnLCAweDMwNjV9LAorCXsndCcsICdlJywgMHgzMDY2fSwKKwl7J2QnLCAnZScsIDB4MzA2N30sCisJeyd0JywgJ28nLCAweDMwNjh9LAorCXsnZCcsICdvJywgMHgzMDY5fSwKKwl7J24nLCAnYScsIDB4MzA2YX0sCisJeyduJywgJ2knLCAweDMwNmJ9LAorCXsnbicsICd1JywgMHgzMDZjfSwKKwl7J24nLCAnZScsIDB4MzA2ZH0sCisJeyduJywgJ28nLCAweDMwNmV9LAorCXsnaCcsICdhJywgMHgzMDZmfSwKKwl7J2InLCAnYScsIDB4MzA3MH0sCisJeydwJywgJ2EnLCAweDMwNzF9LAorCXsnaCcsICdpJywgMHgzMDcyfSwKKwl7J2InLCAnaScsIDB4MzA3M30sCisJeydwJywgJ2knLCAweDMwNzR9LAorCXsnaCcsICd1JywgMHgzMDc1fSwKKwl7J2InLCAndScsIDB4MzA3Nn0sCisJeydwJywgJ3UnLCAweDMwNzd9LAorCXsnaCcsICdlJywgMHgzMDc4fSwKKwl7J2InLCAnZScsIDB4MzA3OX0sCisJeydwJywgJ2UnLCAweDMwN2F9LAorCXsnaCcsICdvJywgMHgzMDdifSwKKwl7J2InLCAnbycsIDB4MzA3Y30sCisJeydwJywgJ28nLCAweDMwN2R9LAorCXsnbScsICdhJywgMHgzMDdlfSwKKwl7J20nLCAnaScsIDB4MzA3Zn0sCisJeydtJywgJ3UnLCAweDMwODB9LAorCXsnbScsICdlJywgMHgzMDgxfSwKKwl7J20nLCAnbycsIDB4MzA4Mn0sCisJeyd5JywgJ0EnLCAweDMwODN9LAorCXsneScsICdhJywgMHgzMDg0fSwKKwl7J3knLCAnVScsIDB4MzA4NX0sCisJeyd5JywgJ3UnLCAweDMwODZ9LAorCXsneScsICdPJywgMHgzMDg3fSwKKwl7J3knLCAnbycsIDB4MzA4OH0sCisJeydyJywgJ2EnLCAweDMwODl9LAorCXsncicsICdpJywgMHgzMDhhfSwKKwl7J3InLCAndScsIDB4MzA4Yn0sCisJeydyJywgJ2UnLCAweDMwOGN9LAorCXsncicsICdvJywgMHgzMDhkfSwKKwl7J3cnLCAnQScsIDB4MzA4ZX0sCisJeyd3JywgJ2EnLCAweDMwOGZ9LAorCXsndycsICdpJywgMHgzMDkwfSwKKwl7J3cnLCAnZScsIDB4MzA5MX0sCisJeyd3JywgJ28nLCAweDMwOTJ9LAorCXsnbicsICc1JywgMHgzMDkzfSwKKwl7J3YnLCAndScsIDB4MzA5NH0sCisJeyciJywgJzUnLCAweDMwOWJ9LAorCXsnMCcsICc1JywgMHgzMDljfSwKKwl7JyonLCAnNScsIDB4MzA5ZH0sCisJeycrJywgJzUnLCAweDMwOWV9LAorCXsnYScsICc2JywgMHgzMGExfSwKKwl7J0EnLCAnNicsIDB4MzBhMn0sCisJeydpJywgJzYnLCAweDMwYTN9LAorCXsnSScsICc2JywgMHgzMGE0fSwKKwl7J3UnLCAnNicsIDB4MzBhNX0sCisJeydVJywgJzYnLCAweDMwYTZ9LAorCXsnZScsICc2JywgMHgzMGE3fSwKKwl7J0UnLCAnNicsIDB4MzBhOH0sCisJeydvJywgJzYnLCAweDMwYTl9LAorCXsnTycsICc2JywgMHgzMGFhfSwKKwl7J0snLCAnYScsIDB4MzBhYn0sCisJeydHJywgJ2EnLCAweDMwYWN9LAorCXsnSycsICdpJywgMHgzMGFkfSwKKwl7J0cnLCAnaScsIDB4MzBhZX0sCisJeydLJywgJ3UnLCAweDMwYWZ9LAorCXsnRycsICd1JywgMHgzMGIwfSwKKwl7J0snLCAnZScsIDB4MzBiMX0sCisJeydHJywgJ2UnLCAweDMwYjJ9LAorCXsnSycsICdvJywgMHgzMGIzfSwKKwl7J0cnLCAnbycsIDB4MzBiNH0sCisJeydTJywgJ2EnLCAweDMwYjV9LAorCXsnWicsICdhJywgMHgzMGI2fSwKKwl7J1MnLCAnaScsIDB4MzBiN30sCisJeydaJywgJ2knLCAweDMwYjh9LAorCXsnUycsICd1JywgMHgzMGI5fSwKKwl7J1onLCAndScsIDB4MzBiYX0sCisJeydTJywgJ2UnLCAweDMwYmJ9LAorCXsnWicsICdlJywgMHgzMGJjfSwKKwl7J1MnLCAnbycsIDB4MzBiZH0sCisJeydaJywgJ28nLCAweDMwYmV9LAorCXsnVCcsICdhJywgMHgzMGJmfSwKKwl7J0QnLCAnYScsIDB4MzBjMH0sCisJeydUJywgJ2knLCAweDMwYzF9LAorCXsnRCcsICdpJywgMHgzMGMyfSwKKwl7J1QnLCAnVScsIDB4MzBjM30sCisJeydUJywgJ3UnLCAweDMwYzR9LAorCXsnRCcsICd1JywgMHgzMGM1fSwKKwl7J1QnLCAnZScsIDB4MzBjNn0sCisJeydEJywgJ2UnLCAweDMwYzd9LAorCXsnVCcsICdvJywgMHgzMGM4fSwKKwl7J0QnLCAnbycsIDB4MzBjOX0sCisJeydOJywgJ2EnLCAweDMwY2F9LAorCXsnTicsICdpJywgMHgzMGNifSwKKwl7J04nLCAndScsIDB4MzBjY30sCisJeydOJywgJ2UnLCAweDMwY2R9LAorCXsnTicsICdvJywgMHgzMGNlfSwKKwl7J0gnLCAnYScsIDB4MzBjZn0sCisJeydCJywgJ2EnLCAweDMwZDB9LAorCXsnUCcsICdhJywgMHgzMGQxfSwKKwl7J0gnLCAnaScsIDB4MzBkMn0sCisJeydCJywgJ2knLCAweDMwZDN9LAorCXsnUCcsICdpJywgMHgzMGQ0fSwKKwl7J0gnLCAndScsIDB4MzBkNX0sCisJeydCJywgJ3UnLCAweDMwZDZ9LAorCXsnUCcsICd1JywgMHgzMGQ3fSwKKwl7J0gnLCAnZScsIDB4MzBkOH0sCisJeydCJywgJ2UnLCAweDMwZDl9LAorCXsnUCcsICdlJywgMHgzMGRhfSwKKwl7J0gnLCAnbycsIDB4MzBkYn0sCisJeydCJywgJ28nLCAweDMwZGN9LAorCXsnUCcsICdvJywgMHgzMGRkfSwKKwl7J00nLCAnYScsIDB4MzBkZX0sCisJeydNJywgJ2knLCAweDMwZGZ9LAorCXsnTScsICd1JywgMHgzMGUwfSwKKwl7J00nLCAnZScsIDB4MzBlMX0sCisJeydNJywgJ28nLCAweDMwZTJ9LAorCXsnWScsICdBJywgMHgzMGUzfSwKKwl7J1knLCAnYScsIDB4MzBlNH0sCisJeydZJywgJ1UnLCAweDMwZTV9LAorCXsnWScsICd1JywgMHgzMGU2fSwKKwl7J1knLCAnTycsIDB4MzBlN30sCisJeydZJywgJ28nLCAweDMwZTh9LAorCXsnUicsICdhJywgMHgzMGU5fSwKKwl7J1InLCAnaScsIDB4MzBlYX0sCisJeydSJywgJ3UnLCAweDMwZWJ9LAorCXsnUicsICdlJywgMHgzMGVjfSwKKwl7J1InLCAnbycsIDB4MzBlZH0sCisJeydXJywgJ0EnLCAweDMwZWV9LAorCXsnVycsICdhJywgMHgzMGVmfSwKKwl7J1cnLCAnaScsIDB4MzBmMH0sCisJeydXJywgJ2UnLCAweDMwZjF9LAorCXsnVycsICdvJywgMHgzMGYyfSwKKwl7J04nLCAnNicsIDB4MzBmM30sCisJeydWJywgJ3UnLCAweDMwZjR9LAorCXsnSycsICdBJywgMHgzMGY1fSwKKwl7J0snLCAnRScsIDB4MzBmNn0sCisJeydWJywgJ2EnLCAweDMwZjd9LAorCXsnVicsICdpJywgMHgzMGY4fSwKKwl7J1YnLCAnZScsIDB4MzBmOX0sCisJeydWJywgJ28nLCAweDMwZmF9LAorCXsnLicsICc2JywgMHgzMGZifSwKKwl7Jy0nLCAnNicsIDB4MzBmY30sCisJeycqJywgJzYnLCAweDMwZmR9LAorCXsnKycsICc2JywgMHgzMGZlfSwKKwl7J2InLCAnNCcsIDB4MzEwNX0sCisJeydwJywgJzQnLCAweDMxMDZ9LAorCXsnbScsICc0JywgMHgzMTA3fSwKKwl7J2YnLCAnNCcsIDB4MzEwOH0sCisJeydkJywgJzQnLCAweDMxMDl9LAorCXsndCcsICc0JywgMHgzMTBhfSwKKwl7J24nLCAnNCcsIDB4MzEwYn0sCisJeydsJywgJzQnLCAweDMxMGN9LAorCXsnZycsICc0JywgMHgzMTBkfSwKKwl7J2snLCAnNCcsIDB4MzEwZX0sCisJeydoJywgJzQnLCAweDMxMGZ9LAorCXsnaicsICc0JywgMHgzMTEwfSwKKwl7J3EnLCAnNCcsIDB4MzExMX0sCisJeyd4JywgJzQnLCAweDMxMTJ9LAorCXsneicsICdoJywgMHgzMTEzfSwKKwl7J2MnLCAnaCcsIDB4MzExNH0sCisJeydzJywgJ2gnLCAweDMxMTV9LAorCXsncicsICc0JywgMHgzMTE2fSwKKwl7J3onLCAnNCcsIDB4MzExN30sCisJeydjJywgJzQnLCAweDMxMTh9LAorCXsncycsICc0JywgMHgzMTE5fSwKKwl7J2EnLCAnNCcsIDB4MzExYX0sCisJeydvJywgJzQnLCAweDMxMWJ9LAorCXsnZScsICc0JywgMHgzMTFjfSwKKwl7J2EnLCAnaScsIDB4MzExZX0sCisJeydlJywgJ2knLCAweDMxMWZ9LAorCXsnYScsICd1JywgMHgzMTIwfSwKKwl7J28nLCAndScsIDB4MzEyMX0sCisJeydhJywgJ24nLCAweDMxMjJ9LAorCXsnZScsICduJywgMHgzMTIzfSwKKwl7J2EnLCAnTicsIDB4MzEyNH0sCisJeydlJywgJ04nLCAweDMxMjV9LAorCXsnZScsICdyJywgMHgzMTI2fSwKKwl7J2knLCAnNCcsIDB4MzEyN30sCisJeyd1JywgJzQnLCAweDMxMjh9LAorCXsnaScsICd1JywgMHgzMTI5fSwKKwl7J3YnLCAnNCcsIDB4MzEyYX0sCisJeyduJywgJ0cnLCAweDMxMmJ9LAorCXsnZycsICduJywgMHgzMTJjfSwKKwl7JzEnLCAnYycsIDB4MzIyMH0sCisJeycyJywgJ2MnLCAweDMyMjF9LAorCXsnMycsICdjJywgMHgzMjIyfSwKKwl7JzQnLCAnYycsIDB4MzIyM30sCisJeyc1JywgJ2MnLCAweDMyMjR9LAorCXsnNicsICdjJywgMHgzMjI1fSwKKwl7JzcnLCAnYycsIDB4MzIyNn0sCisJeyc4JywgJ2MnLCAweDMyMjd9LAorCXsnOScsICdjJywgMHgzMjI4fSwKKwl7JyAnLCAnICcsIDB4ZTAwMH0sCisJeycvJywgJ2MnLCAweGUwMDF9LAorCXsnVScsICdBJywgMHhlMDAyfSwKKwl7J1UnLCAnQicsIDB4ZTAwM30sCisJeyciJywgJzMnLCAweGUwMDR9LAorCXsnIicsICcxJywgMHhlMDA1fSwKKwl7JyInLCAnIScsIDB4ZTAwNn0sCisJeyciJywgJ1wnJywgMHhlMDA3fSwKKwl7JyInLCAnPicsIDB4ZTAwOH0sCisJeyciJywgJz8nLCAweGUwMDl9LAorCXsnIicsICctJywgMHhlMDBhfSwKKwl7JyInLCAnKCcsIDB4ZTAwYn0sCisJeyciJywgJy4nLCAweGUwMGN9LAorCXsnIicsICc6JywgMHhlMDBkfSwKKwl7JyInLCAnMCcsIDB4ZTAwZX0sCisJeyciJywgJyInLCAweGUwMGZ9LAorCXsnIicsICc8JywgMHhlMDEwfSwKKwl7JyInLCAnLCcsIDB4ZTAxMX0sCisJeyciJywgJzsnLCAweGUwMTJ9LAorCXsnIicsICdfJywgMHhlMDEzfSwKKwl7JyInLCAnPScsIDB4ZTAxNH0sCisJeyciJywgJy8nLCAweGUwMTV9LAorCXsnIicsICdpJywgMHhlMDE2fSwKKwl7JyInLCAnZCcsIDB4ZTAxN30sCisJeyciJywgJ3AnLCAweGUwMTh9LAorCXsnOycsICc7JywgMHhlMDE5fSwKKwl7JywnLCAnLCcsIDB4ZTAxYX0sCisJeydiJywgJzMnLCAweGUwMWJ9LAorCXsnQycsICdpJywgMHhlMDFjfSwKKwl7J2YnLCAnKCcsIDB4ZTAxZH0sCisJeydlJywgJ2QnLCAweGUwMWV9LAorCXsnYScsICdtJywgMHhlMDFmfSwKKwl7J3AnLCAnbScsIDB4ZTAyMH0sCisJeydGJywgJ2wnLCAweGUwMjN9LAorCXsnRycsICdGJywgMHhlMDI0fSwKKwl7Jz4nLCAnVicsIDB4ZTAyNX0sCisJeychJywgJyonLCAweGUwMjZ9LAorCXsnPycsICcqJywgMHhlMDI3fSwKKwl7J0onLCAnPCcsIDB4ZTAyOH0sCisJeydmJywgJ2YnLCAweGZiMDB9LAorCXsnZicsICdpJywgMHhmYjAxfSwKKwl7J2YnLCAnbCcsIDB4ZmIwMn0sCisJeydmJywgJ3QnLCAweGZiMDV9LAorCXsncycsICd0JywgMHhmYjA2fSwKKyMgICAgICBlbmRpZiAvKiBGRUFUX01CWVRFICovCisJe05VTCwgTlVMLCBOVUx9CisgICAgICAgfTsKKworIyAgICAgZW5kaWYgLyogT0xEX0RJR1JBUEhTICovCisKKyMgICAgZW5kaWYgLyogTWFjaW50b3NoICovCisjICAgZW5kaWYgLyogRUJDRElDICovCisjICBlbmRpZiAgICAvKiAhSFBVWF9ESUdSQVBIUyAqLworIyBlbmRpZgkvKiAhX19NSU5UX18gKi8KKyNlbmRpZgkvKiAhTVNET1MgJiYgIU9TMiAqLworCisvKgorICogaGFuZGxlIGRpZ3JhcGhzIGFmdGVyIHR5cGluZyBhIGNoYXJhY3RlcgorICovCisgICAgaW50Citkb19kaWdyYXBoKGMpCisgICAgaW50CSAgICBjOworeworICAgIHN0YXRpYyBpbnQJYmFja3NwYWNlZDsJLyogY2hhcmFjdGVyIGJlZm9yZSBLX0JTICovCisgICAgc3RhdGljIGludAlsYXN0Y2hhcjsJLyogbGFzdCB0eXBlZCBjaGFyYWN0ZXIgKi8KKworICAgIGlmIChjID09IC0xKQkJLyogaW5pdCB2YWx1ZXMgKi8KKyAgICB7CisJYmFja3NwYWNlZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmIChwX2RnKQorICAgIHsKKwlpZiAoYmFja3NwYWNlZCA+PSAwKQorCSAgICBjID0gZ2V0ZGlncmFwaChiYWNrc3BhY2VkLCBjLCBGQUxTRSk7CisJYmFja3NwYWNlZCA9IC0xOworCWlmICgoYyA9PSBLX0JTIHx8IGMgPT0gQ3RybF9IKSAmJiBsYXN0Y2hhciA+PSAwKQorCSAgICBiYWNrc3BhY2VkID0gbGFzdGNoYXI7CisgICAgfQorICAgIGxhc3RjaGFyID0gYzsKKyAgICByZXR1cm4gYzsKK30KKworLyoKKyAqIEdldCBhIGRpZ3JhcGguICBVc2VkIGFmdGVyIHR5cGluZyBDVFJMLUsgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBub3JtYWwKKyAqIG1vZGUuCisgKiBSZXR1cm5zIGNvbXBvc2VkIGNoYXJhY3Rlciwgb3IgTlVMIHdoZW4gRVNDIHdhcyB1c2VkLgorICovCisgICAgaW50CitnZXRfZGlncmFwaChjbWRsaW5lKQorICAgIGludAkJY21kbGluZTsJLyogVFJVRSB3aGVuIGNhbGxlZCBmcm9tIHRoZSBjbWRsaW5lICovCit7CisgICAgaW50CQljLCBjYzsKKworICAgICsrbm9fbWFwcGluZzsKKyAgICArK2FsbG93X2tleXM7CisgICAgYyA9IHNhZmVfdmdldGMoKTsKKyAgICAtLW5vX21hcHBpbmc7CisgICAgLS1hbGxvd19rZXlzOworICAgIGlmIChjICE9IEVTQykJCS8qIEVTQyBjYW5jZWxzIENUUkwtSyAqLworICAgIHsKKwlpZiAoSVNfU1BFQ0lBTChjKSkJLyogaW5zZXJ0IHNwZWNpYWwga2V5IGNvZGUgKi8KKwkgICAgcmV0dXJuIGM7CisJaWYgKGNtZGxpbmUpCisJeworCSAgICBpZiAoY2hhcjJjZWxscyhjKSA9PSAxCisjaWYgZGVmaW5lZChGRUFUX0NSWVBUKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkKKwkJICAgICYmIGNtZGxpbmVfc3RhciA9PSAwCisjZW5kaWYKKwkJICAgICkKKwkJcHV0Y21kbGluZShjLCBUUlVFKTsKKwl9CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwllbHNlCisJICAgIGFkZF90b19zaG93Y21kKGMpOworI2VuZGlmCisJKytub19tYXBwaW5nOworCSsrYWxsb3dfa2V5czsKKwljYyA9IHNhZmVfdmdldGMoKTsKKwktLW5vX21hcHBpbmc7CisJLS1hbGxvd19rZXlzOworCWlmIChjYyAhPSBFU0MpCSAgICAvKiBFU0MgY2FuY2VscyBDVFJMLUsgKi8KKwkgICAgcmV0dXJuIGdldGRpZ3JhcGgoYywgY2MsIFRSVUUpOworICAgIH0KKyAgICByZXR1cm4gTlVMOworfQorCisvKgorICogTG9va3VwIHRoZSBwYWlyICJjaGFyMSIsICJjaGFyMiIgaW4gdGhlIGRpZ3JhcGggdGFibGVzLgorICogSWYgbm8gbWF0Y2gsIHJldHVybiAiY2hhcjIiLgorICogSWYgIm1ldGEiIGlzIFRSVUUgYW5kICJjaGFyMSIgaXMgYSBzcGFjZSwgcmV0dXJuICJjaGFyMiIgfCAweDgwLgorICovCisgICAgc3RhdGljIGludAorZ2V0ZXhhY3RkaWdyYXBoKGNoYXIxLCBjaGFyMiwgbWV0YSkKKyAgICBpbnQJCWNoYXIxOworICAgIGludAkJY2hhcjI7CisgICAgaW50CQltZXRhOworeworICAgIGludAkJaTsKKyAgICBpbnQJCXJldHZhbCA9IDA7CisgICAgZGlncl9UCSpkcDsKKworICAgIGlmIChJU19TUEVDSUFMKGNoYXIxKSB8fCBJU19TUEVDSUFMKGNoYXIyKSkKKwlyZXR1cm4gY2hhcjI7CisKKyAgICAvKgorICAgICAqIFNlYXJjaCB1c2VyIGRpZ3JhcGhzIGZpcnN0LgorICAgICAqLworICAgIGRwID0gKGRpZ3JfVCAqKXVzZXJfZGlncmFwaHMuZ2FfZGF0YTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdXNlcl9kaWdyYXBocy5nYV9sZW47ICsraSkKKyAgICB7CisJaWYgKChpbnQpZHAtPmNoYXIxID09IGNoYXIxICYmIChpbnQpZHAtPmNoYXIyID09IGNoYXIyKQorCXsKKwkgICAgcmV0dmFsID0gZHAtPnJlc3VsdDsKKwkgICAgYnJlYWs7CisJfQorCSsrZHA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWFyY2ggZGVmYXVsdCBkaWdyYXBocy4KKyAgICAgKi8KKyAgICBpZiAocmV0dmFsID09IDApCisgICAgeworCWRwID0gZGlncmFwaGRlZmF1bHQ7CisJZm9yIChpID0gMDsgZHAtPmNoYXIxICE9IDA7ICsraSkKKwl7CisJICAgIGlmICgoaW50KWRwLT5jaGFyMSA9PSBjaGFyMSAmJiAoaW50KWRwLT5jaGFyMiA9PSBjaGFyMikKKwkgICAgeworCQlyZXR2YWwgPSBkcC0+cmVzdWx0OworCQlicmVhazsKKwkgICAgfQorCSAgICArK2RwOworCX0KKyAgICB9CisjaWZkZWYgRkVBVF9NQllURQorIyBpZmRlZiBVU0VfVU5JQ09ERV9ESUdSQVBIUworICAgIGlmIChyZXR2YWwgIT0gMCAmJiAhZW5jX3V0ZjgpCisgICAgeworCWNoYXJfdQkgICAgYnVmWzZdLCAqdG87CisJdmltY29udl9UICAgdmM7CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIFVuaWNvZGUgZGlncmFwaCB0byAnZW5jb2RpbmcnLgorCSAqLworCWkgPSB1dGZfY2hhcjJieXRlcyhyZXR2YWwsIGJ1Zik7CisJcmV0dmFsID0gMDsKKwl2Yy52Y190eXBlID0gQ09OVl9OT05FOworCWlmIChjb252ZXJ0X3NldHVwKCZ2YywgKGNoYXJfdSAqKSJ1dGYtOCIsIHBfZW5jKSA9PSBPSykKKwl7CisJICAgIHZjLnZjX2ZhaWwgPSBUUlVFOworCSAgICB0byA9IHN0cmluZ19jb252ZXJ0KCZ2YywgYnVmLCAmaSk7CisJICAgIGlmICh0byAhPSBOVUxMKQorCSAgICB7CisJCXJldHZhbCA9ICgqbWJfcHRyMmNoYXIpKHRvKTsKKwkJdmltX2ZyZWUodG8pOworCSAgICB9CisJICAgICh2b2lkKWNvbnZlcnRfc2V0dXAoJnZjLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgfQorIyBlbmRpZgorCisgICAgLyogSWdub3JlIG11bHRpLWJ5dGUgY2hhcmFjdGVycyB3aGVuIG5vdCBpbiBtdWx0aS1ieXRlIG1vZGUuICovCisgICAgaWYgKCFoYXNfbWJ5dGUgJiYgcmV0dmFsID4gMHhmZikKKwlyZXR2YWwgPSAwOworI2VuZGlmCisKKyAgICBpZiAocmV0dmFsID09IDApCQkvKiBkaWdyYXBoIGRlbGV0ZWQgb3Igbm90IGZvdW5kICovCisgICAgeworCWlmIChjaGFyMSA9PSAnICcgJiYgbWV0YSkJLyogPHNwYWNlPiA8Y2hhcj4gLS0+IG1ldGEtY2hhciAqLworCSAgICByZXR1cm4gKGNoYXIyIHwgMHg4MCk7CisJcmV0dXJuIGNoYXIyOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogR2V0IGRpZ3JhcGguCisgKiBBbGxvdyBmb3IgYm90aCBjaGFyMS1jaGFyMiBhbmQgY2hhcjItY2hhcjEKKyAqLworICAgIGludAorZ2V0ZGlncmFwaChjaGFyMSwgY2hhcjIsIG1ldGEpCisgICAgaW50CWNoYXIxOworICAgIGludAljaGFyMjsKKyAgICBpbnQJbWV0YTsKK3sKKyAgICBpbnQJICAgIHJldHZhbDsKKworICAgIGlmICgoKHJldHZhbCA9IGdldGV4YWN0ZGlncmFwaChjaGFyMSwgY2hhcjIsIG1ldGEpKSA9PSBjaGFyMikKKwkgICAgJiYgKGNoYXIxICE9IGNoYXIyKQorCSAgICAmJiAoKHJldHZhbCA9IGdldGV4YWN0ZGlncmFwaChjaGFyMiwgY2hhcjEsIG1ldGEpKSA9PSBjaGFyMSkpCisJcmV0dXJuIGNoYXIyOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBBZGQgdGhlIGRpZ3JhcGhzIGluIHRoZSBhcmd1bWVudCB0byB0aGUgZGlncmFwaCB0YWJsZS4KKyAqIGZvcm1hdDoge2MxfXtjMn0gY2hhciB7YzF9e2MyfSBjaGFyIC4uLgorICovCisgICAgdm9pZAorcHV0ZGlncmFwaChzdHIpCisgICAgY2hhcl91ICpzdHI7Cit7CisgICAgaW50CQljaGFyMSwgY2hhcjIsIG47CisgICAgaW50CQlpOworICAgIGRpZ3JfVAkqZHA7CisKKyAgICB3aGlsZSAoKnN0ciAhPSBOVUwpCisgICAgeworCXN0ciA9IHNraXB3aGl0ZShzdHIpOworCWlmICgqc3RyID09IE5VTCkKKwkgICAgcmV0dXJuOworCWNoYXIxID0gKnN0cisrOworCWNoYXIyID0gKnN0cisrOworCWlmIChjaGFyMiA9PSAwKQorCXsKKwkgICAgRU1TRyhfKGVfaW52YXJnKSk7CisJICAgIHJldHVybjsKKwl9CisJaWYgKGNoYXIxID09IEVTQyB8fCBjaGFyMiA9PSBFU0MpCisJeworCSAgICBFTVNHKF8oIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIikpOworCSAgICByZXR1cm47CisJfQorCXN0ciA9IHNraXB3aGl0ZShzdHIpOworCWlmICghVklNX0lTRElHSVQoKnN0cikpCisJeworCSAgICBFTVNHKF8oZV9udW1iZXJfZXhwKSk7CisJICAgIHJldHVybjsKKwl9CisJbiA9IGdldGRpZ2l0cygmc3RyKTsKKworCS8qIElmIHRoZSBkaWdyYXBoIGFscmVhZHkgZXhpc3RzLCByZXBsYWNlIHRoZSByZXN1bHQuICovCisJZHAgPSAoZGlncl9UICopdXNlcl9kaWdyYXBocy5nYV9kYXRhOworCWZvciAoaSA9IDA7IGkgPCB1c2VyX2RpZ3JhcGhzLmdhX2xlbjsgKytpKQorCXsKKwkgICAgaWYgKChpbnQpZHAtPmNoYXIxID09IGNoYXIxICYmIChpbnQpZHAtPmNoYXIyID09IGNoYXIyKQorCSAgICB7CisJCWRwLT5yZXN1bHQgPSBuOworCQlicmVhazsKKwkgICAgfQorCSAgICArK2RwOworCX0KKworCS8qIEFkZCBhIG5ldyBkaWdyYXBoIHRvIHRoZSB0YWJsZS4gKi8KKwlpZiAoaSA9PSB1c2VyX2RpZ3JhcGhzLmdhX2xlbikKKwl7CisJICAgIGlmIChnYV9ncm93KCZ1c2VyX2RpZ3JhcGhzLCAxKSA9PSBPSykKKwkgICAgeworCQlkcCA9IChkaWdyX1QgKil1c2VyX2RpZ3JhcGhzLmdhX2RhdGEgKyB1c2VyX2RpZ3JhcGhzLmdhX2xlbjsKKwkJZHAtPmNoYXIxID0gY2hhcjE7CisJCWRwLT5jaGFyMiA9IGNoYXIyOworCQlkcC0+cmVzdWx0ID0gbjsKKwkJKyt1c2VyX2RpZ3JhcGhzLmdhX2xlbjsKKwkJLS11c2VyX2RpZ3JhcGhzLmdhX3Jvb207CisJICAgIH0KKwl9CisgICAgfQorfQorCisgICAgdm9pZAorbGlzdGRpZ3JhcGhzKCkKK3sKKyAgICBpbnQJCWk7CisgICAgZGlncl9UCSpkcDsKKworICAgIG1zZ19wdXRjaGFyKCdcbicpOworCisgICAgZHAgPSBkaWdyYXBoZGVmYXVsdDsKKyAgICBmb3IgKGkgPSAwOyBkcC0+Y2hhcjEgIT0gTlVMICYmICFnb3RfaW50OyArK2kpCisgICAgeworI2lmIGRlZmluZWQoVVNFX1VOSUNPREVfRElHUkFQSFMpICYmIGRlZmluZWQoRkVBVF9NQllURSkKKwlkaWdyX1QgdG1wOworCisJLyogTWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVzdWx0IHRvICdlbmNvZGluZycuICovCisJdG1wLmNoYXIxID0gZHAtPmNoYXIxOworCXRtcC5jaGFyMiA9IGRwLT5jaGFyMjsKKwl0bXAucmVzdWx0ID0gZ2V0ZXhhY3RkaWdyYXBoKHRtcC5jaGFyMSwgdG1wLmNoYXIyLCBGQUxTRSk7CisJaWYgKHRtcC5yZXN1bHQgIT0gMCAmJiB0bXAucmVzdWx0ICE9IHRtcC5jaGFyMgorCQkJCQkgICYmIChoYXNfbWJ5dGUgfHwgdG1wLnJlc3VsdCA8PSAyNTUpKQorCSAgICBwcmludGRpZ3JhcGgoJnRtcCk7CisjZWxzZQorCisJaWYgKGdldGV4YWN0ZGlncmFwaChkcC0+Y2hhcjEsIGRwLT5jaGFyMiwgRkFMU0UpID09IGRwLT5yZXN1bHQKKyMgaWZkZWYgRkVBVF9NQllURQorCQkmJiAoaGFzX21ieXRlIHx8IGRwLT5yZXN1bHQgPD0gMjU1KQorIyBlbmRpZgorCQkpCisJICAgIHByaW50ZGlncmFwaChkcCk7CisjZW5kaWYKKwkrK2RwOworCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9CisKKyAgICBkcCA9IChkaWdyX1QgKil1c2VyX2RpZ3JhcGhzLmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IHVzZXJfZGlncmFwaHMuZ2FfbGVuICYmICFnb3RfaW50OyArK2kpCisgICAgeworCXByaW50ZGlncmFwaChkcCk7CisJdWlfYnJlYWtjaGVjaygpOworCSsrZHA7CisgICAgfQorICAgIG11c3RfcmVkcmF3ID0gQ0xFQVI7ICAgIC8qIGNsZWFyIHNjcmVlbiwgYmVjYXVzZSBzb21lIGRpZ3JhcGhzIG1heSBiZQorCQkJICAgICAgIHdyb25nLCBpbiB3aGljaCBjYXNlIHdlIG1lc3NlZCB1cCBTY3JlZW5MaW5lcyAqLworfQorCisgICAgc3RhdGljIHZvaWQKK3ByaW50ZGlncmFwaChkcCkKKyAgICBkaWdyX1QJKmRwOworeworICAgIGNoYXJfdQlidWZbMzBdOworICAgIGNoYXJfdQkqcDsKKworICAgIGludAkJbGlzdF93aWR0aDsKKworICAgIGlmICgoZHlfZmxhZ3MgJiBEWV9VSEVYKQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgaGFzX21ieXRlCisjZW5kaWYKKwkgICAgKQorCWxpc3Rfd2lkdGggPSAxMzsKKyAgICBlbHNlCisJbGlzdF93aWR0aCA9IDExOworCisgICAgaWYgKGRwLT5yZXN1bHQgIT0gMCkKKyAgICB7CisJaWYgKG1zZ19jb2wgPiBDb2x1bW5zIC0gbGlzdF93aWR0aCkKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJaWYgKG1zZ19jb2wpCisJICAgIHdoaWxlIChtc2dfY29sICUgbGlzdF93aWR0aCAhPSAwKQorCQltc2dfcHV0Y2hhcignICcpOworCisJcCA9IGJ1ZjsKKwkqcCsrID0gZHAtPmNoYXIxOworCSpwKysgPSBkcC0+Y2hhcjI7CisJKnArKyA9ICcgJzsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIC8qIGFkZCBhIHNwYWNlIHRvIGRyYXcgYSBjb21wb3NpbmcgY2hhciBvbiAqLworCSAgICBpZiAoZW5jX3V0ZjggJiYgdXRmX2lzY29tcG9zaW5nKGRwLT5yZXN1bHQpKQorCQkqcCsrID0gJyAnOworCSAgICBwICs9ICgqbWJfY2hhcjJieXRlcykoZHAtPnJlc3VsdCwgcCk7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICAqcCsrID0gZHAtPnJlc3VsdDsKKwlpZiAoY2hhcjJjZWxscyhkcC0+cmVzdWx0KSA9PSAxKQorCSAgICAqcCsrID0gJyAnOworCXNwcmludGYoKGNoYXIgKilwLCAiICUzZCIsIGRwLT5yZXN1bHQpOworCW1zZ19vdXR0cmFucyhidWYpOworICAgIH0KK30KKworI2VuZGlmIC8qIEZFQVRfRElHUkFQSFMgKi8KKworI2lmIGRlZmluZWQoRkVBVF9LRVlNQVApIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qIHN0cnVjdHVyZSB1c2VkIGZvciBiX2ttYXBfZ2EuZ2FfZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyX3UJKmZyb207CisgICAgY2hhcl91CSp0bzsKK30ga21hcF9UOworCisjZGVmaW5lIEtNQVBfTUFYTEVOIDIwCSAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiAiZnJvbSIgb3IgInRvIiAqLworCitzdGF0aWMgdm9pZCBrZXltYXBfdW5sb2FkIF9fQVJHUygodm9pZCkpOworCisvKgorICogU2V0IHVwIGtleSBtYXBwaW5nIHRhYmxlcyBmb3IgdGhlICdrZXltYXAnIG9wdGlvbgorICovCisgICAgY2hhcl91ICoKK2tleW1hcF9pbml0KCkKK3sKKyAgICBjdXJidWYtPmJfa21hcF9zdGF0ZSAmPSB+S0VZTUFQX0lOSVQ7CisKKyAgICBpZiAoKmN1cmJ1Zi0+Yl9wX2tleW1hcCA9PSBOVUwpCisgICAgeworCS8qIFN0b3AgYW55IGFjdGl2ZSBrZXltYXAgYW5kIGNsZWFyIHRoZSB0YWJsZS4gKi8KKwlrZXltYXBfdW5sb2FkKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY2hhcl91CSpidWY7CisKKwkvKiBTb3VyY2UgdGhlIGtleW1hcCBmaWxlLiAgSXQgd2lsbCBjb250YWluIGEgIjpsb2Fka2V5bWFwIiBjb21tYW5kCisJICogd2hpY2ggd2lsbCBjYWxsIGV4X2xvYWRrZXltYXAoKSBiZWxvdy4gKi8KKwlidWYgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihjdXJidWYtPmJfcF9rZXltYXApCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCQkJCSAgICAgICArIFNUUkxFTihwX2VuYykKKyMgZW5kaWYKKwkJCQkJCSAgICAgICArIDE0KSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICByZXR1cm4gZV9vdXRvZm1lbTsKKworIyBpZmRlZiBGRUFUX01CWVRFCisJLyogdHJ5IGZpbmRpbmcgImtleW1hcC8na2V5bWFwJ18nZW5jb2RpbmcnLnZpbSIgIGluICdydW50aW1lcGF0aCcgKi8KKwlzcHJpbnRmKChjaGFyICopYnVmLCAia2V5bWFwLyVzXyVzLnZpbSIsIGN1cmJ1Zi0+Yl9wX2tleW1hcCwgcF9lbmMpOworCWlmIChjbWRfcnVudGltZShidWYsIEZBTFNFKSA9PSBGQUlMKQorIyBlbmRpZgorCXsKKwkgICAgLyogdHJ5IGZpbmRpbmcgImtleW1hcC8na2V5bWFwJy52aW0iIGluICdydW50aW1lcGF0aCcgICovCisJICAgIHNwcmludGYoKGNoYXIgKilidWYsICJrZXltYXAvJXMudmltIiwgY3VyYnVmLT5iX3Bfa2V5bWFwKTsKKwkgICAgaWYgKGNtZF9ydW50aW1lKGJ1ZiwgRkFMU0UpID09IEZBSUwpCisJICAgIHsKKwkJdmltX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIChjaGFyX3UgKilOXygiRTU0NDogS2V5bWFwIGZpbGUgbm90IGZvdW5kIik7CisJICAgIH0KKwl9CisJdmltX2ZyZWUoYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICI6bG9hZGtleW1hcCIgY29tbWFuZDogbG9hZCB0aGUgZm9sbG93aW5nIGxpbmVzIGFzIHRoZSBrZXltYXAuCisgKi8KKyAgICB2b2lkCitleF9sb2Fka2V5bWFwKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnM7CisgICAga21hcF9UCSprcDsKKyNkZWZpbmUgS01BUF9MTEVOICAgMjAwCSAgICAvKiBtYXggbGVuZ3RoIG9mICJ0byIgYW5kICJmcm9tIiB0b2dldGhlciAqLworICAgIGNoYXJfdQlidWZbS01BUF9MTEVOICsgMTFdOworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnNhdmVfY3BvID0gcF9jcG87CisKKyAgICBpZiAoIWdldGxpbmVfZXF1YWwoZWFwLT5nZXRsaW5lLCBlYXAtPmNvb2tpZSwgZ2V0c291cmNlbGluZSkpCisgICAgeworCUVNU0coXygiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIikpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0b3AgYW55IGFjdGl2ZSBrZXltYXAgYW5kIGNsZWFyIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBrZXltYXBfdW5sb2FkKCk7CisKKyAgICBjdXJidWYtPmJfa21hcF9zdGF0ZSA9IDA7CisgICAgZ2FfaW5pdDIoJmN1cmJ1Zi0+Yl9rbWFwX2dhLCAoaW50KXNpemVvZihrbWFwX1QpLCAyMCk7CisKKyAgICAvKiBTZXQgJ2Nwb3B0aW9ucycgdG8gIkMiIHRvIGF2b2lkIGxpbmUgY29udGludWF0aW9uLiAqLworICAgIHBfY3BvID0gKGNoYXJfdSAqKSJDIjsKKworICAgIC8qCisgICAgICogR2V0IGVhY2ggbGluZSBvZiB0aGUgc291cmNlZCBmaWxlLCBicmVhayBhdCB0aGUgZW5kLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCWxpbmUgPSBlYXAtPmdldGxpbmUoMCwgZWFwLT5jb29raWUsIDApOworCWlmIChsaW5lID09IE5VTEwpCisJICAgIGJyZWFrOworCisJcCA9IHNraXB3aGl0ZShsaW5lKTsKKwlpZiAoKnAgIT0gJyInICYmICpwICE9IE5VTCAmJiBnYV9ncm93KCZjdXJidWYtPmJfa21hcF9nYSwgMSkgPT0gT0spCisJeworCSAgICBrcCA9IChrbWFwX1QgKiljdXJidWYtPmJfa21hcF9nYS5nYV9kYXRhICsgY3VyYnVmLT5iX2ttYXBfZ2EuZ2FfbGVuOworCSAgICBzID0gc2tpcHRvd2hpdGUocCk7CisJICAgIGtwLT5mcm9tID0gdmltX3N0cm5zYXZlKHAsIChpbnQpKHMgLSBwKSk7CisJICAgIHAgPSBza2lwd2hpdGUocyk7CisJICAgIHMgPSBza2lwdG93aGl0ZShwKTsKKwkgICAga3AtPnRvID0gdmltX3N0cm5zYXZlKHAsIChpbnQpKHMgLSBwKSk7CisKKwkgICAgaWYgKGtwLT5mcm9tID09IE5VTEwgfHwga3AtPnRvID09IE5VTEwKKwkJICAgIHx8IFNUUkxFTihrcC0+ZnJvbSkgKyBTVFJMRU4oa3AtPnRvKSA+PSBLTUFQX0xMRU4pCisJICAgIHsKKwkJdmltX2ZyZWUoa3AtPmZyb20pOworCQl2aW1fZnJlZShrcC0+dG8pOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkrK2N1cmJ1Zi0+Yl9rbWFwX2dhLmdhX2xlbjsKKwkJLS1jdXJidWYtPmJfa21hcF9nYS5nYV9yb29tOworCSAgICB9CisJfQorCXZpbV9mcmVlKGxpbmUpOworICAgIH0KKworICAgIC8qCisgICAgICogc2V0dXAgIjpsbm9yZW1hcCIgdG8gbWFwIHRoZSBrZXlzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IGN1cmJ1Zi0+Yl9rbWFwX2dhLmdhX2xlbjsgKytpKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopYnVmLCAiPGJ1ZmZlcj4gJXMgJXMiLAorCQkJCSgoa21hcF9UICopY3VyYnVmLT5iX2ttYXBfZ2EuZ2FfZGF0YSlbaV0uZnJvbSwKKwkJCQkgKChrbWFwX1QgKiljdXJidWYtPmJfa21hcF9nYS5nYV9kYXRhKVtpXS50byk7CisJKHZvaWQpZG9fbWFwKDIsIGJ1ZiwgTEFOR01BUCwgRkFMU0UpOworICAgIH0KKworICAgIHBfY3BvID0gc2F2ZV9jcG87CisKKyAgICBjdXJidWYtPmJfa21hcF9zdGF0ZSB8PSBLRVlNQVBfTE9BREVEOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHN0YXR1c19yZWRyYXdfY3VyYnVmKCk7CisjZW5kaWYKK30KKworLyoKKyAqIFN0b3AgdXNpbmcgJ2tleW1hcCcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAora2V5bWFwX3VubG9hZCgpCit7CisgICAgY2hhcl91CWJ1ZltLTUFQX01BWExFTiArIDEwXTsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpzYXZlX2NwbyA9IHBfY3BvOworCisgICAgaWYgKCEoY3VyYnVmLT5iX2ttYXBfc3RhdGUgJiBLRVlNQVBfTE9BREVEKSkKKwlyZXR1cm47CisKKyAgICAvKiBTZXQgJ2Nwb3B0aW9ucycgdG8gIkMiIHRvIGF2b2lkIGxpbmUgY29udGludWF0aW9uLiAqLworICAgIHBfY3BvID0gKGNoYXJfdSAqKSJDIjsKKworICAgIC8qIGNsZWFyIHRoZSAiOmxtYXAicyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdXJidWYtPmJfa21hcF9nYS5nYV9sZW47ICsraSkKKyAgICB7CisJc3ByaW50ZigoY2hhciAqKWJ1ZiwgIjxidWZmZXI+ICVzIiwKKwkJKChrbWFwX1QgKiljdXJidWYtPmJfa21hcF9nYS5nYV9kYXRhKVtpXS5mcm9tKTsKKwkodm9pZClkb19tYXAoMSwgYnVmLCBMQU5HTUFQLCBGQUxTRSk7CisgICAgfQorCisgICAgcF9jcG8gPSBzYXZlX2NwbzsKKworICAgIGdhX2NsZWFyKCZjdXJidWYtPmJfa21hcF9nYSk7CisgICAgY3VyYnVmLT5iX2ttYXBfc3RhdGUgJj0gfktFWU1BUF9MT0FERUQ7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgc3RhdHVzX3JlZHJhd19jdXJidWYoKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogRkVBVF9LRVlNQVAgKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL2RpbW0uaWRsIGIvc3JjL2RpbW0uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDQ5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGltbS5pZGwKQEAgLTAsMCArMSw1NDQgQEAKKy8vKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTWljcm9zb2Z0IFdpbmRvd3MKKy8vICBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgMTk5Mi0yMDAwLgorLy8KKy8vICBGaWxlOiBkaW1tLmlkbAorLy8KKy8vICBDb250ZW50czogQWN0aXZlSU1NIGludGVyZmFjZSBkZWZpbml0aW9ucworLy8KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NwcF9xdW90ZSgiLy89LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09IikKK2NwcF9xdW90ZSgiLy8gZGltbS5oIikKK2NwcF9xdW90ZSgiLy89LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09IikKK2NwcF9xdW90ZSgiLy8gKEMpIENvcHlyaWdodCAxOTk1LTE5OTggTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iKQorY3BwX3F1b3RlKCIvLyIpCitjcHBfcXVvdGUoIi8vIFRISVMgQ09ERSBBTkQgSU5GT1JNQVRJT04gSVMgUFJPVklERUQgXCJBUyBJU1wiIFdJVEhPVVQgV0FSUkFOVFkgT0YiKQorY3BwX3F1b3RlKCIvLyBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIikKK2NwcF9xdW90ZSgiLy8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EL09SIEZJVE5FU1MgRk9SIEEiKQorY3BwX3F1b3RlKCIvLyBQQVJUSUNVTEFSIFBVUlBPU0UuIikKK2NwcF9xdW90ZSgiLy89LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09IikKK2NwcF9xdW90ZSgiIikKK2NwcF9xdW90ZSgiI3ByYWdtYSBjb21tZW50KGxpYixcInV1aWQubGliXCIpIikKK2NwcF9xdW90ZSgiIikKK2NwcF9xdW90ZSgiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitjcHBfcXVvdGUoIi8vIElBY3RpdmVJTU0gSW50ZXJmYWNlcy4iKQorY3BwX3F1b3RlKCIiKQorCisvKgorRGlzYWJsZSBhIHdhcm5pbmcgYWJvdXQgbGFjayBvZiBwb2x5bW9ycGhpYyB0eXBlIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29ucworLSB0aGUgb25seSByZWFzb24gdG8gaGF2ZSBsaWJyYXJ5IGJsb2NrIGluIHRoZSBmaWxlIGlzIHRvIG1ha2UgbWlkbCBhY2NlcHQgY29jbGFzcworICBzdGF0ZW1lbnQgYW5kIGdlbmVyYXRlIENMU0lEIGZvciBDQWN0aXZlSU1NLgorLSB0aGUgZ2VuZXJhdGVkIGRpbW1faS5jIGhhcyB0aGUgY2xzaWQgYW5kIHRoYXQgZmlsZSBpcyB1c2VkIHRvIGhhdmUgY2xzaWQgYXZhaWxhYmxlCistIHRoZSBkaW1tLnRsYiBpcyBub3QgdXNlZCBhdCBhbGwKKy0gb24gdG9wIG9mIGl0LCB0aGVyZSBpcyBubyBwbGFucyB0byBwb3J0IHRoZSBhcHAgdXNpbmcgZGltbS5pZGwgdG8gNjRiIHBsYXRmb3JtLgorKi8KKy8qCisgKiBtaWRsX3ByYWdtYSBpcyB1bnN1cHBvcnRlZCBpbiBtaWRsIHZlcnNpb24gMy4wMSBzaGlwcGVkIHdpdGggVkM1LjAuCisgKiBJdCBpcyBzdXBwb3J0ZWQgaW4gbWlkbCB2ZXJzaW9uIDUuMDEgc2hpcHBlZCB3aXRoIFZDNi4wCisgKiBJIGNvdWxkIG5vdCBwcm9kdWNlIG1lc3NhZ2UgMjM5NS4gSXMgdGhpcyBuZWVkZWQ/IFcuQnJpc2NvZSAyMDAxLTA4LTE0CisgKi8KKyNpZiAoX19taWRsID49IDUwMSkKK21pZGxfcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDIzOTUpIC8vIHBvbHltb3JwaGljIHR5cGVzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFRMQgorI2VuZGlmCisKKyNpZm5kZWYgRE9fTk9fSU1QT1JUUworaW1wb3J0ICJ1bmtud24uaWRsIjsKKyNlbmRpZgorCitbCisgICAgdXVpZCg0OTU1REQzMC1CMTU5LTExZDAtOEZDRi0wMEFBMDA2QkNDNTkpLAorICAgIGhlbHBzdHJpbmcoIkFjdGl2ZUlNTSIpLAorICAgIGxjaWQoMHgwMDAwKSwKKyAgICB2ZXJzaW9uKDAuMSkKK10KK2xpYnJhcnkgQWN0aXZlSU1NCit7CisgICAgaW1wb3J0bGliKCJzdGRvbGUyLnRsYiIpOworCisgICAgY3BwX3F1b3RlKCIjaW5jbHVkZSA8aW1tLmg+IikKKworICAgIGNwcF9xdW90ZSgiI2lmIDAiKQorCisgICAgdHlwZWRlZiBXT1JEIExBTkdJRDsKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICBMUFNUUiAgIGxwUmVhZGluZzsKKyAgICAgICAgTFBTVFIgICBscFdvcmQ7CisgICAgfSBSRUdJU1RFUldPUkRBOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIExQV1NUUiAgIGxwUmVhZGluZzsKKyAgICAgICAgTFBXU1RSICAgbHBXb3JkOworICAgIH0gUkVHSVNURVJXT1JEVzsKKworICAgICNkZWZpbmUgTEZfRkFDRVNJWkUgICAgICAgICAzMgorCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIExPTkcgICAgICBsZkhlaWdodDsKKyAgICAgICAgTE9ORyAgICAgIGxmV2lkdGg7CisgICAgICAgIExPTkcgICAgICBsZkVzY2FwZW1lbnQ7CisgICAgICAgIExPTkcgICAgICBsZk9yaWVudGF0aW9uOworICAgICAgICBMT05HICAgICAgbGZXZWlnaHQ7CisgICAgICAgIEJZVEUgICAgICBsZkl0YWxpYzsKKyAgICAgICAgQllURSAgICAgIGxmVW5kZXJsaW5lOworICAgICAgICBCWVRFICAgICAgbGZTdHJpa2VPdXQ7CisgICAgICAgIEJZVEUgICAgICBsZkNoYXJTZXQ7CisgICAgICAgIEJZVEUgICAgICBsZk91dFByZWNpc2lvbjsKKyAgICAgICAgQllURSAgICAgIGxmQ2xpcFByZWNpc2lvbjsKKyAgICAgICAgQllURSAgICAgIGxmUXVhbGl0eTsKKyAgICAgICAgQllURSAgICAgIGxmUGl0Y2hBbmRGYW1pbHk7CisgICAgICAgIENIQVIgICAgICBsZkZhY2VOYW1lW0xGX0ZBQ0VTSVpFXTsKKyAgICB9IExPR0ZPTlRBOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIExPTkcgICAgICBsZkhlaWdodDsKKyAgICAgICAgTE9ORyAgICAgIGxmV2lkdGg7CisgICAgICAgIExPTkcgICAgICBsZkVzY2FwZW1lbnQ7CisgICAgICAgIExPTkcgICAgICBsZk9yaWVudGF0aW9uOworICAgICAgICBMT05HICAgICAgbGZXZWlnaHQ7CisgICAgICAgIEJZVEUgICAgICBsZkl0YWxpYzsKKyAgICAgICAgQllURSAgICAgIGxmVW5kZXJsaW5lOworICAgICAgICBCWVRFICAgICAgbGZTdHJpa2VPdXQ7CisgICAgICAgIEJZVEUgICAgICBsZkNoYXJTZXQ7CisgICAgICAgIEJZVEUgICAgICBsZk91dFByZWNpc2lvbjsKKyAgICAgICAgQllURSAgICAgIGxmQ2xpcFByZWNpc2lvbjsKKyAgICAgICAgQllURSAgICAgIGxmUXVhbGl0eTsKKyAgICAgICAgQllURSAgICAgIGxmUGl0Y2hBbmRGYW1pbHk7CisgICAgICAgIFdDSEFSICAgICBsZkZhY2VOYW1lW0xGX0ZBQ0VTSVpFXTsKKyAgICB9IExPR0ZPTlRXOworCisgICAgdHlwZWRlZiBEV09SRCAgICAgSElNQzsKKyAgICB0eXBlZGVmIERXT1JEICAgICBISU1DQzsKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICBEV09SRCBkd0luZGV4OworICAgICAgICBEV09SRCBkd1N0eWxlOworICAgICAgICBQT0lOVCBwdEN1cnJlbnRQb3M7CisgICAgICAgIFJFQ1QgIHJjQXJlYTsKKyAgICB9IENBTkRJREFURUZPUk07CisKKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgRFdPUkQgZHdTdHlsZTsKKyAgICAgICAgUE9JTlQgcHRDdXJyZW50UG9zOworICAgICAgICBSRUNUICByY0FyZWE7CisgICAgfSBDT01QT1NJVElPTkZPUk07CisKKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgRFdPUkQgZHdTaXplOworICAgICAgICBEV09SRCBkd1N0eWxlOworICAgICAgICBEV09SRCBkd0NvdW50OworICAgICAgICBEV09SRCBkd1NlbGVjdGlvbjsKKyAgICAgICAgRFdPUkQgZHdQYWdlU3RhcnQ7CisgICAgICAgIERXT1JEIGR3UGFnZVNpemU7CisgICAgICAgIERXT1JEIGR3T2Zmc2V0WzFdOworICAgIH0gQ0FORElEQVRFTElTVDsKKworICAgICNkZWZpbmUgU1RZTEVfREVTQ1JJUFRJT05fU0laRSAgMzIKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICBEV09SRCAgICAgICBkd1N0eWxlOworICAgICAgICBDSEFSICAgICAgICBzekRlc2NyaXB0aW9uW1NUWUxFX0RFU0NSSVBUSU9OX1NJWkVdOworICAgIH0gU1RZTEVCVUZBOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIERXT1JEICAgICAgIGR3U3R5bGU7CisgICAgICAgIFdDSEFSICAgICAgIHN6RGVzY3JpcHRpb25bU1RZTEVfREVTQ1JJUFRJT05fU0laRV07CisgICAgfSBTVFlMRUJVRlc7CisKKyAgICB0eXBlZGVmIFdPUkQgQVRPTTsKKworICAgIGNwcF9xdW90ZSgiI2VuZGlmIikKKworICAgIGNwcF9xdW90ZSgiI2lmIChXSU5WRVIgPCAweDA0MEEpIikKKworICAgICNkZWZpbmUgSU1FTUVOVUlURU1fU1RSSU5HX1NJWkUgODAKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICBVSU5UICAgICAgICBjYlNpemU7CisgICAgICAgIFVJTlQgICAgICAgIGZUeXBlOworICAgICAgICBVSU5UICAgICAgICBmU3RhdGU7CisgICAgICAgIFVJTlQgICAgICAgIHdJRDsKKyAgICAgICAgSEJJVE1BUCAgICAgaGJtcENoZWNrZWQ7CisgICAgICAgIEhCSVRNQVAgICAgIGhibXBVbmNoZWNrZWQ7CisgICAgICAgIERXT1JEICAgICAgIGR3SXRlbURhdGE7CisgICAgICAgIENIQVIgICAgICAgIHN6U3RyaW5nW0lNRU1FTlVJVEVNX1NUUklOR19TSVpFXTsKKyAgICAgICAgSEJJVE1BUCAgICAgaGJtcEl0ZW07CisgICAgfSBJTUVNRU5VSVRFTUlORk9BOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIFVJTlQgICAgICAgIGNiU2l6ZTsKKyAgICAgICAgVUlOVCAgICAgICAgZlR5cGU7CisgICAgICAgIFVJTlQgICAgICAgIGZTdGF0ZTsKKyAgICAgICAgVUlOVCAgICAgICAgd0lEOworICAgICAgICBIQklUTUFQICAgICBoYm1wQ2hlY2tlZDsKKyAgICAgICAgSEJJVE1BUCAgICAgaGJtcFVuY2hlY2tlZDsKKyAgICAgICAgRFdPUkQgICAgICAgZHdJdGVtRGF0YTsKKyAgICAgICAgV0NIQVIgICAgICAgc3pTdHJpbmdbSU1FTUVOVUlURU1fU1RSSU5HX1NJWkVdOworICAgICAgICBIQklUTUFQICAgICBoYm1wSXRlbTsKKyAgICB9IElNRU1FTlVJVEVNSU5GT1c7CisKKyAgICBjcHBfcXVvdGUoIiNlbmRpZiIpCisKKyAgICBjcHBfcXVvdGUoIiNpZm5kZWYgX0RES0lNTV9IXyIpCisKKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgSFdORCAgICAgICAgICAgICAgICBoV25kOworICAgICAgICBCT09MICAgICAgICAgICAgICAgIGZPcGVuOworICAgICAgICBQT0lOVCAgICAgICAgICAgICAgIHB0U3RhdHVzV25kUG9zOworICAgICAgICBQT0lOVCAgICAgICAgICAgICAgIHB0U29mdEtiZFBvczsKKyAgICAgICAgRFdPUkQgICAgICAgICAgICAgICBmZHdDb252ZXJzaW9uOworICAgICAgICBEV09SRCAgICAgICAgICAgICAgIGZkd1NlbnRlbmNlOworICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICBMT0dGT05UQSAgICAgICAgQTsKKyAgICAgICAgICAgIExPR0ZPTlRXICAgICAgICBXOworICAgICAgICB9IGxmRm9udDsKKyAgICAgICAgQ09NUE9TSVRJT05GT1JNICAgICBjZkNvbXBGb3JtOworICAgICAgICBDQU5ESURBVEVGT1JNICAgICAgIGNmQ2FuZEZvcm1bNF07CisgICAgICAgIEhJTUNDICAgICAgICAgICAgICAgaENvbXBTdHI7CisgICAgICAgIEhJTUNDICAgICAgICAgICAgICAgaENhbmRJbmZvOworICAgICAgICBISU1DQyAgICAgICAgICAgICAgIGhHdWlkZUxpbmU7CisgICAgICAgIEhJTUNDICAgICAgICAgICAgICAgaFByaXZhdGU7CisgICAgICAgIERXT1JEICAgICAgICAgICAgICAgZHdOdW1Nc2dCdWY7CisgICAgICAgIEhJTUNDICAgICAgICAgICAgICAgaE1zZ0J1ZjsKKyAgICAgICAgRFdPUkQgICAgICAgICAgICAgICBmZHdJbml0OworICAgICAgICBEV09SRCAgICAgICAgICAgICAgIGR3UmVzZXJ2ZVszXTsKKyAgICB9IElOUFVUQ09OVEVYVDsKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICBEV09SRCAgICAgICBkd1ByaXZhdGVEYXRhU2l6ZTsKKyAgICAgICAgRFdPUkQgICAgICAgZmR3UHJvcGVydHk7CisgICAgICAgIERXT1JEICAgICAgIGZkd0NvbnZlcnNpb25DYXBzOworICAgICAgICBEV09SRCAgICAgICBmZHdTZW50ZW5jZUNhcHM7CisgICAgICAgIERXT1JEICAgICAgIGZkd1VJQ2FwczsKKyAgICAgICAgRFdPUkQgICAgICAgZmR3U0NTQ2FwczsKKyAgICAgICAgRFdPUkQgICAgICAgZmR3U2VsZWN0Q2FwczsKKyAgICB9IElNRUlORk87CisKKyAgICBjcHBfcXVvdGUoIiNlbmRpZiIpCisKKyAgICBbCisgICAgICBvYmplY3QsCisgICAgICB1dWlkKDA4QzAzNDEyLUY5NkItMTFkMC1BNDc1LTAwQUEwMDZCQ0M1OSksCisgICAgICBwb2ludGVyX2RlZmF1bHQodW5pcXVlKQorICAgIF0KKyAgICBpbnRlcmZhY2UgSUVudW1SZWdpc3RlcldvcmRBIDogSVVua25vd24KKyAgICB7CisgICAgICAgIEhSRVNVTFQgQ2xvbmUoW291dF0gSUVudW1SZWdpc3RlcldvcmRBICoqcHBFbnVtKTsKKyAgICAgICAgSFJFU1VMVCBOZXh0KFtpbl0gVUxPTkcgdWxDb3VudCwgW291dF0gUkVHSVNURVJXT1JEQSAqcmdSZWdpc3RlcldvcmQsIFtvdXRdIFVMT05HICpwY0ZldGNoZWQpOworICAgICAgICBIUkVTVUxUIFJlc2V0KCk7CisgICAgICAgIEhSRVNVTFQgU2tpcChbaW5dIFVMT05HIHVsQ291bnQpOworICAgIH07CisKKyAgICBbCisgICAgICBvYmplY3QsCisgICAgICB1dWlkKDQ5NTVERDMxLUIxNTktMTFkMC04RkNGLTAwQUEwMDZCQ0M1OSksCisgICAgICBwb2ludGVyX2RlZmF1bHQodW5pcXVlKQorICAgIF0KKyAgICBpbnRlcmZhY2UgSUVudW1SZWdpc3RlcldvcmRXIDogSVVua25vd24KKyAgICB7CisgICAgICAgIEhSRVNVTFQgQ2xvbmUoW291dF0gSUVudW1SZWdpc3RlcldvcmRXICoqcHBFbnVtKTsKKyAgICAgICAgSFJFU1VMVCBOZXh0KFtpbl0gVUxPTkcgdWxDb3VudCwgW291dF0gUkVHSVNURVJXT1JEVyAqcmdSZWdpc3RlcldvcmQsIFtvdXRdIFVMT05HICpwY0ZldGNoZWQpOworICAgICAgICBIUkVTVUxUIFJlc2V0KCk7CisgICAgICAgIEhSRVNVTFQgU2tpcChbaW5dIFVMT05HIHVsQ291bnQpOworICAgIH07CisKKworICAgIFsKKyAgICAgIG9iamVjdCwKKyAgICAgIHV1aWQoMDliNWVhYjAtZjk5Ny0xMWQxLTkzZDQtMDA2MGIwNjdiODZlKSwKKyAgICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCisgICAgXQorICAgIGludGVyZmFjZSBJRW51bUlucHV0Q29udGV4dCA6IElVbmtub3duCisgICAgeworICAgICAgICBIUkVTVUxUIENsb25lKFtvdXRdIElFbnVtSW5wdXRDb250ZXh0ICoqcHBFbnVtKTsKKyAgICAgICAgSFJFU1VMVCBOZXh0KFtpbl0gVUxPTkcgdWxDb3VudCwgW291dF0gSElNQyAqcmdJbnB1dENvbnRleHQsIFtvdXRdIFVMT05HICpwY0ZldGNoZWQpOworICAgICAgICBIUkVTVUxUIFJlc2V0KCk7CisgICAgICAgIEhSRVNVTFQgU2tpcChbaW5dIFVMT05HIHVsQ291bnQpOworICAgIH07CisKKworICAgIFsKKyAgICAgIG9iamVjdCwKKyAgICAgIHV1aWQoYjM0NTgwODItYmQwMC0xMWQxLTkzOWItMDA2MGIwNjdiODZlKSwKKyAgICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCisgICAgXQorICAgIGludGVyZmFjZSBJQWN0aXZlSU1NUmVnaXN0cmFyIDogSVVua25vd24KKyAgICB7CisgICAgICAgIEhSRVNVTFQgUmVnaXN0ZXJJTUUoW2luXSBSRUZDTFNJRCByY2xzaWQsIFtpbl0gTEFOR0lEIGxnaWQsIFtpbl0gTFBDV1NUUiBwc3pJY29uRmlsZSwgW2luXSBMUENXU1RSIHBzekRlc2MpOworICAgICAgICBIUkVTVUxUIFVucmVnaXN0ZXJJTUUoW2luXSBSRUZDTFNJRCByY2xzaWQpOworICAgIH07CisKKyAgICBbCisgICAgICBvYmplY3QsCisgICAgICB1dWlkKGI1Y2YyY2ZhLThhZWItMTFkMS05MzY0LTAwNjBiMDY3Yjg2ZSksCisgICAgICBwb2ludGVyX2RlZmF1bHQodW5pcXVlKQorICAgIF0KKyAgICBpbnRlcmZhY2UgSUFjdGl2ZUlNTU1lc3NhZ2VQdW1wT3duZXIgOiBJVW5rbm93bgorICAgIHsKKyAgICAgICAgSFJFU1VMVCBTdGFydCgpOworICAgICAgICBIUkVTVUxUIEVuZCgpOworICAgICAgICBIUkVTVUxUIE9uVHJhbnNsYXRlTWVzc2FnZShbaW5dIGNvbnN0IE1TRyAqcE1zZyk7CisgICAgICAgIEhSRVNVTFQgUGF1c2UoW291dF0gRFdPUkQgKnBkd0Nvb2tpZSk7CisgICAgICAgIEhSRVNVTFQgUmVzdW1lKFtpbl0gRFdPUkQgZHdDb29raWUpOworICAgIH0KKworICAgIFsKKyAgICAgIG9iamVjdCwKKyAgICAgIHV1aWQoMDhjMGUwNDAtNjJkMS0xMWQxLTkzMjYtMDA2MGIwNjdiODZlKSwKKyAgICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCisgICAgXQorICAgIGludGVyZmFjZSBJQWN0aXZlSU1NQXBwIDogSVVua25vd24KKyAgICB7CisgICAgICAgIEhSRVNVTFQgQXNzb2NpYXRlQ29udGV4dChbaW5dIEhXTkQgaFduZCwgW2luXSBISU1DIGhJTUUsIFtvdXRdIEhJTUMgKnBoUHJldik7CisgICAgICAgIEhSRVNVTFQgQ29uZmlndXJlSU1FQShbaW5dIEhLTCBoS0wsIFtpbl0gSFdORCBoV25kLCBbaW5dIERXT1JEIGR3TW9kZSwgW2luXSBSRUdJU1RFUldPUkRBICpwRGF0YSk7CisgICAgICAgIEhSRVNVTFQgQ29uZmlndXJlSU1FVyhbaW5dIEhLTCBoS0wsIFtpbl0gSFdORCBoV25kLCBbaW5dIERXT1JEIGR3TW9kZSwgW2luXSBSRUdJU1RFUldPUkRXICpwRGF0YSk7CisgICAgICAgIEhSRVNVTFQgQ3JlYXRlQ29udGV4dChbb3V0XSBISU1DICpwaElNQyk7CisgICAgICAgIEhSRVNVTFQgRGVzdHJveUNvbnRleHQoW2luXSBISU1DIGhJTUUpOworICAgICAgICBIUkVTVUxUIEVudW1SZWdpc3RlcldvcmRBKFtpbl0gSEtMIGhLTCwgW2luXSBMUFNUUiBzelJlYWRpbmcsIFtpbl0gRFdPUkQgZHdTdHlsZSwgW2luXSBMUFNUUiBzelJlZ2lzdGVyLCBbaW5dIExQVk9JRCBwRGF0YSwgW291dF0gSUVudW1SZWdpc3RlcldvcmRBICoqcEVudW0pOworICAgICAgICBIUkVTVUxUIEVudW1SZWdpc3RlcldvcmRXKFtpbl0gSEtMIGhLTCwgW2luXSBMUFdTVFIgc3pSZWFkaW5nLCBbaW5dIERXT1JEIGR3U3R5bGUsIFtpbl0gTFBXU1RSIHN6UmVnaXN0ZXIsIFtpbl0gTFBWT0lEIHBEYXRhLCBbb3V0XSBJRW51bVJlZ2lzdGVyV29yZFcgKipwRW51bSk7CisgICAgICAgIEhSRVNVTFQgRXNjYXBlQShbaW5dIEhLTCBoS0wsIFtpbl0gSElNQyBoSU1DLCBbaW5dIFVJTlQgdUVzY2FwZSwgW2luLCBvdXRdIExQVk9JRCBwRGF0YSwgW291dF0gTFJFU1VMVCAqcGxSZXN1bHQpOworICAgICAgICBIUkVTVUxUIEVzY2FwZVcoW2luXSBIS0wgaEtMLCBbaW5dIEhJTUMgaElNQywgW2luXSBVSU5UIHVFc2NhcGUsIFtpbiwgb3V0XSBMUFZPSUQgcERhdGEsIFtvdXRdIExSRVNVTFQgKnBsUmVzdWx0KTsKKyAgICAgICAgSFJFU1VMVCBHZXRDYW5kaWRhdGVMaXN0QShbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0luZGV4LCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW291dF0gQ0FORElEQVRFTElTVCAqcENhbmRMaXN0LCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0Q2FuZGlkYXRlTGlzdFcoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBVSU5UIHVCdWZMZW4sIFtvdXRdIENBTkRJREFURUxJU1QgKnBDYW5kTGlzdCwgW291dF0gVUlOVCAqcHVDb3BpZWQpOworICAgICAgICBIUkVTVUxUIEdldENhbmRpZGF0ZUxpc3RDb3VudEEoW2luXSBISU1DIGhJTUMsIFtvdXRdIERXT1JEICpwZHdMaXN0U2l6ZSwgW291dF0gRFdPUkQgKnBkd0J1Zkxlbik7CisgICAgICAgIEhSRVNVTFQgR2V0Q2FuZGlkYXRlTGlzdENvdW50VyhbaW5dIEhJTUMgaElNQywgW291dF0gRFdPUkQgKnBkd0xpc3RTaXplLCBbb3V0XSBEV09SRCAqcGR3QnVmTGVuKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDYW5kaWRhdGVXaW5kb3coW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW291dF0gQ0FORElEQVRFRk9STSAqcENhbmRpZGF0ZSk7CisgICAgICAgIEhSRVNVTFQgR2V0Q29tcG9zaXRpb25Gb250QShbaW5dIEhJTUMgaElNQywgW291dF0gTE9HRk9OVEEgKnBsZik7CisgICAgICAgIEhSRVNVTFQgR2V0Q29tcG9zaXRpb25Gb250VyhbaW5dIEhJTUMgaElNQywgW291dF0gTE9HRk9OVFcgKnBsZik7CisgICAgICAgIEhSRVNVTFQgR2V0Q29tcG9zaXRpb25TdHJpbmdBKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gRFdPUkQgZHdCdWZMZW4sIFtvdXRdIExPTkcgKnBsQ29waWVkLCBbb3V0XSBMUFZPSUQgcEJ1Zik7CisgICAgICAgIEhSRVNVTFQgR2V0Q29tcG9zaXRpb25TdHJpbmdXKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gRFdPUkQgZHdCdWZMZW4sIFtvdXRdIExPTkcgKnBsQ29waWVkLCBbb3V0XSBMUFZPSUQgcEJ1Zik7CisgICAgICAgIEhSRVNVTFQgR2V0Q29tcG9zaXRpb25XaW5kb3coW2luXSBISU1DIGhJTUMsIFtvdXRdIENPTVBPU0lUSU9ORk9STSAqcENvbXBGb3JtKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb250ZXh0KFtpbl0gSFdORCBoV25kLCBbb3V0XSBISU1DICpwaElNQyk7CisgICAgICAgIEhSRVNVTFQgR2V0Q29udmVyc2lvbkxpc3RBKFtpbl0gSEtMIGhLTCwgW2luXSBISU1DIGhJTUMsIFtpbl0gTFBTVFIgcFNyYywgW2luXSBVSU5UIHVCdWZMZW4sIFtpbl0gVUlOVCB1RmxhZywgW291dF0gQ0FORElEQVRFTElTVCAqcERzdCwgW291dF0gVUlOVCAqcHVDb3BpZWQpOworICAgICAgICBIUkVTVUxUIEdldENvbnZlcnNpb25MaXN0VyhbaW5dIEhLTCBoS0wsIFtpbl0gSElNQyBoSU1DLCBbaW5dIExQV1NUUiBwU3JjLCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW2luXSBVSU5UIHVGbGFnLCBbb3V0XSBDQU5ESURBVEVMSVNUICpwRHN0LCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0Q29udmVyc2lvblN0YXR1cyhbaW5dIEhJTUMgaElNQywgW291dF0gRFdPUkQgKnBmZHdDb252ZXJzaW9uLCBbb3V0XSBEV09SRCAqcGZkd1NlbnRlbmNlKTsKKyAgICAgICAgSFJFU1VMVCBHZXREZWZhdWx0SU1FV25kKFtpbl0gSFdORCBoV25kLCBbb3V0XSBIV05EICpwaERlZlduZCk7CisgICAgICAgIEhSRVNVTFQgR2V0RGVzY3JpcHRpb25BKFtpbl0gSEtMIGhLTCwgW2luXSBVSU5UIHVCdWZMZW4sIFtvdXRdIExQU1RSIHN6RGVzY3JpcHRpb24sIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXREZXNjcmlwdGlvblcoW2luXSBIS0wgaEtMLCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW291dF0gTFBXU1RSIHN6RGVzY3JpcHRpb24sIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRHdWlkZUxpbmVBKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gRFdPUkQgZHdCdWZMZW4sIFtvdXRdIExQU1RSIHBCdWYsIFtvdXRdIERXT1JEICpwZHdSZXN1bHQpOworICAgICAgICBIUkVTVUxUIEdldEd1aWRlTGluZVcoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBEV09SRCBkd0J1ZkxlbiwgW291dF0gTFBXU1RSIHBCdWYsIFtvdXRdIERXT1JEICpwZHdSZXN1bHQpOworICAgICAgICBIUkVTVUxUIEdldElNRUZpbGVOYW1lQShbaW5dIEhLTCBoS0wsIFtpbl0gVUlOVCB1QnVmTGVuLCBbb3V0XSBMUFNUUiBzekZpbGVOYW1lLCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0SU1FRmlsZU5hbWVXKFtpbl0gSEtMIGhLTCwgW2luXSBVSU5UIHVCdWZMZW4sIFtvdXRdIExQV1NUUiBzekZpbGVOYW1lLCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0T3BlblN0YXR1cyhbaW5dIEhJTUMgaElNQyk7CisgICAgICAgIEhSRVNVTFQgR2V0UHJvcGVydHkoW2luXSBIS0wgaEtMLCBbaW5dIERXT1JEIGZkd0luZGV4LCBbb3V0XSBEV09SRCAqcGR3UHJvcGVydHkpOworICAgICAgICBIUkVTVUxUIEdldFJlZ2lzdGVyV29yZFN0eWxlQShbaW5dIEhLTCBoS0wsIFtpbl0gVUlOVCBuSXRlbSwgW291dF0gU1RZTEVCVUZBICpwU3R5bGVCdWYsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRSZWdpc3RlcldvcmRTdHlsZVcoW2luXSBIS0wgaEtMLCBbaW5dIFVJTlQgbkl0ZW0sIFtvdXRdIFNUWUxFQlVGVyAqcFN0eWxlQnVmLCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0U3RhdHVzV2luZG93UG9zKFtpbl0gSElNQyBoSU1DLCBbb3V0XSBQT0lOVCAqcHB0UG9zKTsKKyAgICAgICAgSFJFU1VMVCBHZXRWaXJ0dWFsS2V5KFtpbl0gSFdORCBoV25kLCBbb3V0XSBVSU5UICpwdVZpcnR1YWxLZXkpOworICAgICAgICBIUkVTVUxUIEluc3RhbGxJTUVBKFtpbl0gTFBTVFIgc3pJTUVGaWxlTmFtZSwgW2luXSBMUFNUUiBzekxheW91dFRleHQsIFtvdXRdIEhLTCAqcGhLTCk7CisgICAgICAgIEhSRVNVTFQgSW5zdGFsbElNRVcoW2luXSBMUFdTVFIgc3pJTUVGaWxlTmFtZSwgW2luXSBMUFdTVFIgc3pMYXlvdXRUZXh0LCBbb3V0XSBIS0wgKnBoS0wpOworICAgICAgICBIUkVTVUxUIElzSU1FKFtpbl0gSEtMIGhLTCk7CisgICAgICAgIEhSRVNVTFQgSXNVSU1lc3NhZ2VBKFtpbl0gSFdORCBoV25kSU1FLCBbaW5dIFVJTlQgbXNnLCBbaW5dIFdQQVJBTSB3UGFyYW0sIFtpbl0gTFBBUkFNIGxQYXJhbSk7CisgICAgICAgIEhSRVNVTFQgSXNVSU1lc3NhZ2VXKFtpbl0gSFdORCBoV25kSU1FLCBbaW5dIFVJTlQgbXNnLCBbaW5dIFdQQVJBTSB3UGFyYW0sIFtpbl0gTFBBUkFNIGxQYXJhbSk7CisgICAgICAgIEhSRVNVTFQgTm90aWZ5SU1FKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3QWN0aW9uLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gRFdPUkQgZHdWYWx1ZSk7CisgICAgICAgIEhSRVNVTFQgUmVnaXN0ZXJXb3JkQShbaW5dIEhLTCBoS0wsIFtpbl0gTFBTVFIgc3pSZWFkaW5nLCBbaW5dIERXT1JEIGR3U3R5bGUsIFtpbl0gTFBTVFIgc3pSZWdpc3Rlcik7CisgICAgICAgIEhSRVNVTFQgUmVnaXN0ZXJXb3JkVyhbaW5dIEhLTCBoS0wsIFtpbl0gTFBXU1RSIHN6UmVhZGluZywgW2luXSBEV09SRCBkd1N0eWxlLCBbaW5dIExQV1NUUiBzelJlZ2lzdGVyKTsKKyAgICAgICAgSFJFU1VMVCBSZWxlYXNlQ29udGV4dChbaW5dIEhXTkQgaFduZCwgW2luXSBISU1DIGhJTUMpOworICAgICAgICBIUkVTVUxUIFNldENhbmRpZGF0ZVdpbmRvdyhbaW5dIEhJTUMgaElNQywgW2luXSBDQU5ESURBVEVGT1JNICpwQ2FuZGlkYXRlKTsKKyAgICAgICAgSFJFU1VMVCBTZXRDb21wb3NpdGlvbkZvbnRBKFtpbl0gSElNQyBoSU1DLCBbaW5dIExPR0ZPTlRBICpwbGYpOworICAgICAgICBIUkVTVUxUIFNldENvbXBvc2l0aW9uRm9udFcoW2luXSBISU1DIGhJTUMsIFtpbl0gTE9HRk9OVFcgKnBsZik7CisgICAgICAgIEhSRVNVTFQgU2V0Q29tcG9zaXRpb25TdHJpbmdBKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gTFBWT0lEIHBDb21wLCBbaW5dIERXT1JEIGR3Q29tcExlbiwgW2luXSBMUFZPSUQgcFJlYWQsIFtpbl0gRFdPUkQgZHdSZWFkTGVuKTsKKyAgICAgICAgSFJFU1VMVCBTZXRDb21wb3NpdGlvblN0cmluZ1coW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBMUFZPSUQgcENvbXAsIFtpbl0gRFdPUkQgZHdDb21wTGVuLCBbaW5dIExQVk9JRCBwUmVhZCwgW2luXSBEV09SRCBkd1JlYWRMZW4pOworICAgICAgICBIUkVTVUxUIFNldENvbXBvc2l0aW9uV2luZG93KFtpbl0gSElNQyBoSU1DLCBbaW5dIENPTVBPU0lUSU9ORk9STSAqcENvbXBGb3JtKTsKKyAgICAgICAgSFJFU1VMVCBTZXRDb252ZXJzaW9uU3RhdHVzKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGZkd0NvbnZlcnNpb24sIFtpbl0gRFdPUkQgZmR3U2VudGVuY2UpOworICAgICAgICBIUkVTVUxUIFNldE9wZW5TdGF0dXMoW2luXSBISU1DIGhJTUMsIFtpbl0gQk9PTCBmT3Blbik7CisgICAgICAgIEhSRVNVTFQgU2V0U3RhdHVzV2luZG93UG9zKFtpbl0gSElNQyBoSU1DLCBbaW5dIFBPSU5UICpwcHRQb3MpOworICAgICAgICBIUkVTVUxUIFNpbXVsYXRlSG90S2V5KFtpbl0gSFdORCBoV25kLCBbaW5dIERXT1JEIGR3SG90S2V5SUQpOworICAgICAgICBIUkVTVUxUIFVucmVnaXN0ZXJXb3JkQShbaW5dIEhLTCBoS0wsIFtpbl0gTFBTVFIgc3pSZWFkaW5nLCBbaW5dIERXT1JEIGR3U3R5bGUsIFtpbl0gTFBTVFIgc3pVbnJlZ2lzdGVyKTsKKyAgICAgICAgSFJFU1VMVCBVbnJlZ2lzdGVyV29yZFcoW2luXSBIS0wgaEtMLCBbaW5dIExQV1NUUiBzelJlYWRpbmcsIFtpbl0gRFdPUkQgZHdTdHlsZSwgW2luXSBMUFdTVFIgc3pVbnJlZ2lzdGVyKTsKKworICAgICAgICBIUkVTVUxUIEFjdGl2YXRlKFtpbl0gQk9PTCBmUmVzdG9yZUxheW91dCk7CisgICAgICAgIEhSRVNVTFQgRGVhY3RpdmF0ZSgpOworCisgICAgICAgIEhSRVNVTFQgT25EZWZXaW5kb3dQcm9jKFtpbl0gSFdORCBoV25kLCBbaW5dIFVJTlQgTXNnLCBbaW5dIFdQQVJBTSB3UGFyYW0sIFtpbl0gTFBBUkFNIGxQYXJhbSwgW291dF0gTFJFU1VMVCAqcGxSZXN1bHQpOworCisgICAgICAgIEhSRVNVTFQgRmlsdGVyQ2xpZW50V2luZG93cyhbaW5dIEFUT00gKmFhQ2xhc3NMaXN0LCBbaW5dIFVJTlQgdVNpemUpOworCisgICAgICAgIEhSRVNVTFQgR2V0Q29kZVBhZ2VBKFtpbl0gSEtMIGhLTCwgW291dF0gVUlOVCAqdUNvZGVQYWdlKTsKKyAgICAgICAgSFJFU1VMVCBHZXRMYW5nSWQoW2luXSBIS0wgaEtMLCBbb3V0XSBMQU5HSUQgKnBsaWQpOworCisgICAgICAgIC8vIHdpbjk4L250NSBhcGlzCisgICAgICAgIEhSRVNVTFQgQXNzb2NpYXRlQ29udGV4dEV4KFtpbl0gSFdORCBoV25kLCBbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0ZsYWdzKTsKKyAgICAgICAgSFJFU1VMVCBEaXNhYmxlSU1FKFtpbl0gRFdPUkQgaWRUaHJlYWQpOworICAgICAgICBIUkVTVUxUIEdldEltZU1lbnVJdGVtc0EoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdGbGFncywgW2luXSBEV09SRCBkd1R5cGUsIFtpbl0gSU1FTUVOVUlURU1JTkZPQSAqcEltZVBhcmVudE1lbnUsIFtvdXRdIElNRU1FTlVJVEVNSU5GT0EgKnBJbWVNZW51LCBbaW5dIERXT1JEIGR3U2l6ZSwgW291dF0gRFdPUkQgKnBkd1Jlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgR2V0SW1lTWVudUl0ZW1zVyhbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0ZsYWdzLCBbaW5dIERXT1JEIGR3VHlwZSwgW2luXSBJTUVNRU5VSVRFTUlORk9XICpwSW1lUGFyZW50TWVudSwgW291dF0gSU1FTUVOVUlURU1JTkZPVyAqcEltZU1lbnUsIFtpbl0gRFdPUkQgZHdTaXplLCBbb3V0XSBEV09SRCAqcGR3UmVzdWx0KTsKKyAgICAgICAgSFJFU1VMVCBFbnVtSW5wdXRDb250ZXh0KFtpbl0gRFdPUkQgaWRUaHJlYWQsIFtvdXRdIElFbnVtSW5wdXRDb250ZXh0ICoqcHBFbnVtKTsKKyAgICB9OworCisgICAgWworICAgICAgb2JqZWN0LAorICAgICAgdXVpZCgwOEMwMzQxMS1GOTZCLTExZDAtQTQ3NS0wMEFBMDA2QkNDNTkpLAorICAgICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKKyAgICBdCisgICAgaW50ZXJmYWNlIElBY3RpdmVJTU1JTUUgOiBJVW5rbm93bgorICAgIHsKKyAgICAgICAgSFJFU1VMVCBBc3NvY2lhdGVDb250ZXh0KFtpbl0gSFdORCBoV25kLCBbaW5dIEhJTUMgaElNRSwgW291dF0gSElNQyAqcGhQcmV2KTsKKyAgICAgICAgSFJFU1VMVCBDb25maWd1cmVJTUVBKFtpbl0gSEtMIGhLTCwgW2luXSBIV05EIGhXbmQsIFtpbl0gRFdPUkQgZHdNb2RlLCBbaW5dIFJFR0lTVEVSV09SREEgKnBEYXRhKTsKKyAgICAgICAgSFJFU1VMVCBDb25maWd1cmVJTUVXKFtpbl0gSEtMIGhLTCwgW2luXSBIV05EIGhXbmQsIFtpbl0gRFdPUkQgZHdNb2RlLCBbaW5dIFJFR0lTVEVSV09SRFcgKnBEYXRhKTsKKyAgICAgICAgSFJFU1VMVCBDcmVhdGVDb250ZXh0KFtvdXRdIEhJTUMgKnBoSU1DKTsKKyAgICAgICAgSFJFU1VMVCBEZXN0cm95Q29udGV4dChbaW5dIEhJTUMgaElNRSk7CisgICAgICAgIEhSRVNVTFQgRW51bVJlZ2lzdGVyV29yZEEoW2luXSBIS0wgaEtMLCBbaW5dIExQU1RSIHN6UmVhZGluZywgW2luXSBEV09SRCBkd1N0eWxlLCBbaW5dIExQU1RSIHN6UmVnaXN0ZXIsIFtpbl0gTFBWT0lEIHBEYXRhLCBbb3V0XSBJRW51bVJlZ2lzdGVyV29yZEEgKipwRW51bSk7CisgICAgICAgIEhSRVNVTFQgRW51bVJlZ2lzdGVyV29yZFcoW2luXSBIS0wgaEtMLCBbaW5dIExQV1NUUiBzelJlYWRpbmcsIFtpbl0gRFdPUkQgZHdTdHlsZSwgW2luXSBMUFdTVFIgc3pSZWdpc3RlciwgW2luXSBMUFZPSUQgcERhdGEsIFtvdXRdIElFbnVtUmVnaXN0ZXJXb3JkVyAqKnBFbnVtKTsKKyAgICAgICAgSFJFU1VMVCBFc2NhcGVBKFtpbl0gSEtMIGhLTCwgW2luXSBISU1DIGhJTUMsIFtpbl0gVUlOVCB1RXNjYXBlLCBbaW4sIG91dF0gTFBWT0lEIHBEYXRhLCBbb3V0XSBMUkVTVUxUICpwbFJlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgRXNjYXBlVyhbaW5dIEhLTCBoS0wsIFtpbl0gSElNQyBoSU1DLCBbaW5dIFVJTlQgdUVzY2FwZSwgW2luLCBvdXRdIExQVk9JRCBwRGF0YSwgW291dF0gTFJFU1VMVCAqcGxSZXN1bHQpOworICAgICAgICBIUkVTVUxUIEdldENhbmRpZGF0ZUxpc3RBKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gVUlOVCB1QnVmTGVuLCBbb3V0XSBDQU5ESURBVEVMSVNUICpwQ2FuZExpc3QsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDYW5kaWRhdGVMaXN0VyhbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0luZGV4LCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW291dF0gQ0FORElEQVRFTElTVCAqcENhbmRMaXN0LCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0Q2FuZGlkYXRlTGlzdENvdW50QShbaW5dIEhJTUMgaElNQywgW291dF0gRFdPUkQgKnBkd0xpc3RTaXplLCBbb3V0XSBEV09SRCAqcGR3QnVmTGVuKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDYW5kaWRhdGVMaXN0Q291bnRXKFtpbl0gSElNQyBoSU1DLCBbb3V0XSBEV09SRCAqcGR3TGlzdFNpemUsIFtvdXRdIERXT1JEICpwZHdCdWZMZW4pOworICAgICAgICBIUkVTVUxUIEdldENhbmRpZGF0ZVdpbmRvdyhbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0luZGV4LCBbb3V0XSBDQU5ESURBVEVGT1JNICpwQ2FuZGlkYXRlKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb21wb3NpdGlvbkZvbnRBKFtpbl0gSElNQyBoSU1DLCBbb3V0XSBMT0dGT05UQSAqcGxmKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb21wb3NpdGlvbkZvbnRXKFtpbl0gSElNQyBoSU1DLCBbb3V0XSBMT0dGT05UVyAqcGxmKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb21wb3NpdGlvblN0cmluZ0EoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBEV09SRCBkd0J1ZkxlbiwgW291dF0gTE9ORyAqcGxDb3BpZWQsIFtvdXRdIExQVk9JRCBwQnVmKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb21wb3NpdGlvblN0cmluZ1coW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBEV09SRCBkd0J1ZkxlbiwgW291dF0gTE9ORyAqcGxDb3BpZWQsIFtvdXRdIExQVk9JRCBwQnVmKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb21wb3NpdGlvbldpbmRvdyhbaW5dIEhJTUMgaElNQywgW291dF0gQ09NUE9TSVRJT05GT1JNICpwQ29tcEZvcm0pOworICAgICAgICBIUkVTVUxUIEdldENvbnRleHQoW2luXSBIV05EIGhXbmQsIFtvdXRdIEhJTUMgKnBoSU1DKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb252ZXJzaW9uTGlzdEEoW2luXSBIS0wgaEtMLCBbaW5dIEhJTUMgaElNQywgW2luXSBMUFNUUiBwU3JjLCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW2luXSBVSU5UIHVGbGFnLCBbb3V0XSBDQU5ESURBVEVMSVNUICpwRHN0LCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgR2V0Q29udmVyc2lvbkxpc3RXKFtpbl0gSEtMIGhLTCwgW2luXSBISU1DIGhJTUMsIFtpbl0gTFBXU1RSIHBTcmMsIFtpbl0gVUlOVCB1QnVmTGVuLCBbaW5dIFVJTlQgdUZsYWcsIFtvdXRdIENBTkRJREFURUxJU1QgKnBEc3QsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb252ZXJzaW9uU3RhdHVzKFtpbl0gSElNQyBoSU1DLCBbb3V0XSBEV09SRCAqcGZkd0NvbnZlcnNpb24sIFtvdXRdIERXT1JEICpwZmR3U2VudGVuY2UpOworICAgICAgICBIUkVTVUxUIEdldERlZmF1bHRJTUVXbmQoW2luXSBIV05EIGhXbmQsIFtvdXRdIEhXTkQgKnBoRGVmV25kKTsKKyAgICAgICAgSFJFU1VMVCBHZXREZXNjcmlwdGlvbkEoW2luXSBIS0wgaEtMLCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW291dF0gTFBTVFIgc3pEZXNjcmlwdGlvbiwgW291dF0gVUlOVCAqcHVDb3BpZWQpOworICAgICAgICBIUkVTVUxUIEdldERlc2NyaXB0aW9uVyhbaW5dIEhLTCBoS0wsIFtpbl0gVUlOVCB1QnVmTGVuLCBbb3V0XSBMUFdTVFIgc3pEZXNjcmlwdGlvbiwgW291dF0gVUlOVCAqcHVDb3BpZWQpOworICAgICAgICBIUkVTVUxUIEdldEd1aWRlTGluZUEoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBEV09SRCBkd0J1ZkxlbiwgW291dF0gTFBTVFIgcEJ1ZiwgW291dF0gRFdPUkQgKnBkd1Jlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgR2V0R3VpZGVMaW5lVyhbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0luZGV4LCBbaW5dIERXT1JEIGR3QnVmTGVuLCBbb3V0XSBMUFdTVFIgcEJ1ZiwgW291dF0gRFdPUkQgKnBkd1Jlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgR2V0SU1FRmlsZU5hbWVBKFtpbl0gSEtMIGhLTCwgW2luXSBVSU5UIHVCdWZMZW4sIFtvdXRdIExQU1RSIHN6RmlsZU5hbWUsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRJTUVGaWxlTmFtZVcoW2luXSBIS0wgaEtMLCBbaW5dIFVJTlQgdUJ1ZkxlbiwgW291dF0gTFBXU1RSIHN6RmlsZU5hbWUsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRPcGVuU3RhdHVzKFtpbl0gSElNQyBoSU1DKTsKKyAgICAgICAgSFJFU1VMVCBHZXRQcm9wZXJ0eShbaW5dIEhLTCBoS0wsIFtpbl0gRFdPUkQgZmR3SW5kZXgsIFtvdXRdIERXT1JEICpwZHdQcm9wZXJ0eSk7CisgICAgICAgIEhSRVNVTFQgR2V0UmVnaXN0ZXJXb3JkU3R5bGVBKFtpbl0gSEtMIGhLTCwgW2luXSBVSU5UIG5JdGVtLCBbb3V0XSBTVFlMRUJVRkEgKnBTdHlsZUJ1ZiwgW291dF0gVUlOVCAqcHVDb3BpZWQpOworICAgICAgICBIUkVTVUxUIEdldFJlZ2lzdGVyV29yZFN0eWxlVyhbaW5dIEhLTCBoS0wsIFtpbl0gVUlOVCBuSXRlbSwgW291dF0gU1RZTEVCVUZXICpwU3R5bGVCdWYsIFtvdXRdIFVJTlQgKnB1Q29waWVkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRTdGF0dXNXaW5kb3dQb3MoW2luXSBISU1DIGhJTUMsIFtvdXRdIFBPSU5UICpwcHRQb3MpOworICAgICAgICBIUkVTVUxUIEdldFZpcnR1YWxLZXkoW2luXSBIV05EIGhXbmQsIFtvdXRdIFVJTlQgKnB1VmlydHVhbEtleSk7CisgICAgICAgIEhSRVNVTFQgSW5zdGFsbElNRUEoW2luXSBMUFNUUiBzeklNRUZpbGVOYW1lLCBbaW5dIExQU1RSIHN6TGF5b3V0VGV4dCwgW291dF0gSEtMICpwaEtMKTsKKyAgICAgICAgSFJFU1VMVCBJbnN0YWxsSU1FVyhbaW5dIExQV1NUUiBzeklNRUZpbGVOYW1lLCBbaW5dIExQV1NUUiBzekxheW91dFRleHQsIFtvdXRdIEhLTCAqcGhLTCk7CisgICAgICAgIEhSRVNVTFQgSXNJTUUoW2luXSBIS0wgaEtMKTsKKyAgICAgICAgSFJFU1VMVCBJc1VJTWVzc2FnZUEoW2luXSBIV05EIGhXbmRJTUUsIFtpbl0gVUlOVCBtc2csIFtpbl0gV1BBUkFNIHdQYXJhbSwgW2luXSBMUEFSQU0gbFBhcmFtKTsKKyAgICAgICAgSFJFU1VMVCBJc1VJTWVzc2FnZVcoW2luXSBIV05EIGhXbmRJTUUsIFtpbl0gVUlOVCBtc2csIFtpbl0gV1BBUkFNIHdQYXJhbSwgW2luXSBMUEFSQU0gbFBhcmFtKTsKKyAgICAgICAgSFJFU1VMVCBOb3RpZnlJTUUoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdBY3Rpb24sIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBEV09SRCBkd1ZhbHVlKTsKKyAgICAgICAgSFJFU1VMVCBSZWdpc3RlcldvcmRBKFtpbl0gSEtMIGhLTCwgW2luXSBMUFNUUiBzelJlYWRpbmcsIFtpbl0gRFdPUkQgZHdTdHlsZSwgW2luXSBMUFNUUiBzelJlZ2lzdGVyKTsKKyAgICAgICAgSFJFU1VMVCBSZWdpc3RlcldvcmRXKFtpbl0gSEtMIGhLTCwgW2luXSBMUFdTVFIgc3pSZWFkaW5nLCBbaW5dIERXT1JEIGR3U3R5bGUsIFtpbl0gTFBXU1RSIHN6UmVnaXN0ZXIpOworICAgICAgICBIUkVTVUxUIFJlbGVhc2VDb250ZXh0KFtpbl0gSFdORCBoV25kLCBbaW5dIEhJTUMgaElNQyk7CisgICAgICAgIEhSRVNVTFQgU2V0Q2FuZGlkYXRlV2luZG93KFtpbl0gSElNQyBoSU1DLCBbaW5dIENBTkRJREFURUZPUk0gKnBDYW5kaWRhdGUpOworICAgICAgICBIUkVTVUxUIFNldENvbXBvc2l0aW9uRm9udEEoW2luXSBISU1DIGhJTUMsIFtpbl0gTE9HRk9OVEEgKnBsZik7CisgICAgICAgIEhSRVNVTFQgU2V0Q29tcG9zaXRpb25Gb250VyhbaW5dIEhJTUMgaElNQywgW2luXSBMT0dGT05UVyAqcGxmKTsKKyAgICAgICAgSFJFU1VMVCBTZXRDb21wb3NpdGlvblN0cmluZ0EoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSBMUFZPSUQgcENvbXAsIFtpbl0gRFdPUkQgZHdDb21wTGVuLCBbaW5dIExQVk9JRCBwUmVhZCwgW2luXSBEV09SRCBkd1JlYWRMZW4pOworICAgICAgICBIUkVTVUxUIFNldENvbXBvc2l0aW9uU3RyaW5nVyhbaW5dIEhJTUMgaElNQywgW2luXSBEV09SRCBkd0luZGV4LCBbaW5dIExQVk9JRCBwQ29tcCwgW2luXSBEV09SRCBkd0NvbXBMZW4sIFtpbl0gTFBWT0lEIHBSZWFkLCBbaW5dIERXT1JEIGR3UmVhZExlbik7CisgICAgICAgIEhSRVNVTFQgU2V0Q29tcG9zaXRpb25XaW5kb3coW2luXSBISU1DIGhJTUMsIFtpbl0gQ09NUE9TSVRJT05GT1JNICpwQ29tcEZvcm0pOworICAgICAgICBIUkVTVUxUIFNldENvbnZlcnNpb25TdGF0dXMoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZmR3Q29udmVyc2lvbiwgW2luXSBEV09SRCBmZHdTZW50ZW5jZSk7CisgICAgICAgIEhSRVNVTFQgU2V0T3BlblN0YXR1cyhbaW5dIEhJTUMgaElNQywgW2luXSBCT09MIGZPcGVuKTsKKyAgICAgICAgSFJFU1VMVCBTZXRTdGF0dXNXaW5kb3dQb3MoW2luXSBISU1DIGhJTUMsIFtpbl0gUE9JTlQgKnBwdFBvcyk7CisgICAgICAgIEhSRVNVTFQgU2ltdWxhdGVIb3RLZXkoW2luXSBIV05EIGhXbmQsIFtpbl0gRFdPUkQgZHdIb3RLZXlJRCk7CisgICAgICAgIEhSRVNVTFQgVW5yZWdpc3RlcldvcmRBKFtpbl0gSEtMIGhLTCwgW2luXSBMUFNUUiBzelJlYWRpbmcsIFtpbl0gRFdPUkQgZHdTdHlsZSwgW2luXSBMUFNUUiBzelVucmVnaXN0ZXIpOworICAgICAgICBIUkVTVUxUIFVucmVnaXN0ZXJXb3JkVyhbaW5dIEhLTCBoS0wsIFtpbl0gTFBXU1RSIHN6UmVhZGluZywgW2luXSBEV09SRCBkd1N0eWxlLCBbaW5dIExQV1NUUiBzelVucmVnaXN0ZXIpOworCisgICAgICAgIC8vIGltZSBoZWxwZXIgbWV0aG9kcworICAgICAgICBIUkVTVUxUIEdlbmVyYXRlTWVzc2FnZShbaW5dIEhJTUMgaElNQyk7CisKKyAgICAgICAgLy8gSElNQyBhbmQgSElNQ0MgbWFuYWdlbWVudCBhcGkncworICAgICAgICBIUkVTVUxUIExvY2tJTUMoW2luXSBISU1DIGhJTUMsIFtvdXRdIElOUFVUQ09OVEVYVCAqKnBwSU1DKTsKKyAgICAgICAgSFJFU1VMVCBVbmxvY2tJTUMoW2luXSBISU1DIGhJTUMpOworICAgICAgICBIUkVTVUxUIEdldElNQ0xvY2tDb3VudChbaW5dIEhJTUMgaElNQywgW291dF0gRFdPUkQgKnBkd0xvY2tDb3VudCk7CisgICAgICAgIEhSRVNVTFQgQ3JlYXRlSU1DQyhbaW5dIERXT1JEIGR3U2l6ZSwgW291dF0gSElNQ0MgKnBoSU1DQyk7CisgICAgICAgIEhSRVNVTFQgRGVzdHJveUlNQ0MoW2luXSBISU1DQyBoSU1DQyk7CisgICAgICAgIEhSRVNVTFQgTG9ja0lNQ0MoW2luXSBISU1DQyBoSU1DQywgW291dF0gdm9pZCAqKnBwdik7CisgICAgICAgIEhSRVNVTFQgVW5sb2NrSU1DQyhbaW5dIEhJTUNDIGhJTUNDKTsKKyAgICAgICAgSFJFU1VMVCBSZVNpemVJTUNDKFtpbl0gSElNQ0MgaElNQ0MsIFtpbl0gRFdPUkQgZHdTaXplLCBbb3V0XSBISU1DQyAqcGhJTUNDKTsKKyAgICAgICAgSFJFU1VMVCBHZXRJTUNDU2l6ZShbaW5dIEhJTUNDIGhJTUNDLCBbb3V0XSBEV09SRCAqcGR3U2l6ZSk7CisgICAgICAgIEhSRVNVTFQgR2V0SU1DQ0xvY2tDb3VudChbaW5dIEhJTUNDIGhJTUNDLCBbb3V0XSBEV09SRCAqcGR3TG9ja0NvdW50KTsKKworICAgICAgICAvLyBob3Qga2V5IG1hbmlwdWxhdGlvbiBhcGkncworICAgICAgICBIUkVTVUxUIEdldEhvdEtleShbaW5dIERXT1JEIGR3SG90S2V5SUQsIFtvdXRdIFVJTlQgKnB1TW9kaWZpZXJzLCBbb3V0XSBVSU5UICpwdVZLZXksIFtvdXRdIEhLTCAqcGhLTCk7CisgICAgICAgIEhSRVNVTFQgU2V0SG90S2V5KFtpbl0gRFdPUkQgZHdIb3RLZXlJRCwgW2luXSBVSU5UIHVNb2RpZmllcnMsIFtpbl0gVUlOVCB1VktleSwgW2luXSBIS0wgaEtMKTsKKworICAgICAgICAvLyBzb2Z0IGtleWJvYXJkIGFwaSdzCisgICAgICAgIEhSRVNVTFQgQ3JlYXRlU29mdEtleWJvYXJkKFtpbl0gVUlOVCB1VHlwZSwgW2luXSBIV05EIGhPd25lciwgW2luXSBpbnQgeCwgW2luXSBpbnQgeSwgW291dF0gSFdORCAqcGhTb2Z0S2JkV25kKTsKKyAgICAgICAgSFJFU1VMVCBEZXN0cm95U29mdEtleWJvYXJkKFtpbl0gSFdORCBoU29mdEtiZFduZCk7CisgICAgICAgIEhSRVNVTFQgU2hvd1NvZnRLZXlib2FyZChbaW5dIEhXTkQgaFNvZnRLYmRXbmQsIFtpbl0gaW50IG5DbWRTaG93KTsKKworICAgICAgICBIUkVTVUxUIEdldENvZGVQYWdlQShbaW5dIEhLTCBoS0wsIFtvdXRdIFVJTlQgKnVDb2RlUGFnZSk7CisgICAgICAgIEhSRVNVTFQgR2V0TGFuZ0lkKFtpbl0gSEtMIGhLTCwgW291dF0gTEFOR0lEICpwbGlkKTsKKworICAgICAgICBIUkVTVUxUIEtleWJkRXZlbnQoW2luXSBMQU5HSUQgbGdpZElNRSwgW2luXSBCWVRFIGJWaywgW2luXSBCWVRFIGJTY2FuLCBbaW5dIERXT1JEIGR3RmxhZ3MsIFtpbl0gRFdPUkQgZHdFeHRyYUluZm8pOworCisgICAgICAgIEhSRVNVTFQgTG9ja01vZGFsKCk7CisgICAgICAgIEhSRVNVTFQgVW5sb2NrTW9kYWwoKTsKKworICAgICAgICAvLyB3aW45OC9udDUgYXBpcworICAgICAgICBIUkVTVUxUIEFzc29jaWF0ZUNvbnRleHRFeChbaW5dIEhXTkQgaFduZCwgW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdGbGFncyk7CisgICAgICAgIEhSRVNVTFQgRGlzYWJsZUlNRShbaW5dIERXT1JEIGlkVGhyZWFkKTsKKyAgICAgICAgSFJFU1VMVCBHZXRJbWVNZW51SXRlbXNBKFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3RmxhZ3MsIFtpbl0gRFdPUkQgZHdUeXBlLCBbaW5dIElNRU1FTlVJVEVNSU5GT0EgKnBJbWVQYXJlbnRNZW51LCBbb3V0XSBJTUVNRU5VSVRFTUlORk9BICpwSW1lTWVudSwgW2luXSBEV09SRCBkd1NpemUsIFtvdXRdIERXT1JEICpwZHdSZXN1bHQpOworICAgICAgICBIUkVTVUxUIEdldEltZU1lbnVJdGVtc1coW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdGbGFncywgW2luXSBEV09SRCBkd1R5cGUsIFtpbl0gSU1FTUVOVUlURU1JTkZPVyAqcEltZVBhcmVudE1lbnUsIFtvdXRdIElNRU1FTlVJVEVNSU5GT1cgKnBJbWVNZW51LCBbaW5dIERXT1JEIGR3U2l6ZSwgW291dF0gRFdPUkQgKnBkd1Jlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgRW51bUlucHV0Q29udGV4dChbaW5dIERXT1JEIGlkVGhyZWFkLCBbb3V0XSBJRW51bUlucHV0Q29udGV4dCAqKnBwRW51bSk7CisgICAgICAgIEhSRVNVTFQgUmVxdWVzdE1lc3NhZ2VBKFtpbl0gSElNQyBoSU1DLCBbaW5dIFdQQVJBTSB3UGFyYW0sIFtpbl0gTFBBUkFNIGxQYXJhbSwgW291dF0gTFJFU1VMVCAqcGxSZXN1bHQpOworICAgICAgICBIUkVTVUxUIFJlcXVlc3RNZXNzYWdlVyhbaW5dIEhJTUMgaElNQywgW2luXSBXUEFSQU0gd1BhcmFtLCBbaW5dIExQQVJBTSBsUGFyYW0sIFtvdXRdIExSRVNVTFQgKnBsUmVzdWx0KTsKKworICAgICAgICBIUkVTVUxUIFNlbmRJTUNBKFtpbl0gSFdORCBoV25kLCBbaW5dIFVJTlQgdU1zZywgW2luXSBXUEFSQU0gd1BhcmFtLCBbaW5dIExQQVJBTSBsUGFyYW0sIFtvdXRdIExSRVNVTFQgKnBsUmVzdWx0KTsKKyAgICAgICAgSFJFU1VMVCBTZW5kSU1DVyhbaW5dIEhXTkQgaFduZCwgW2luXSBVSU5UIHVNc2csIFtpbl0gV1BBUkFNIHdQYXJhbSwgW2luXSBMUEFSQU0gbFBhcmFtLCBbb3V0XSBMUkVTVUxUICpwbFJlc3VsdCk7CisKKyAgICAgICAgSFJFU1VMVCBJc1NsZWVwaW5nKCk7CisgICAgfTsKKworICAgIFsKKyAgICAgIG9iamVjdCwKKyAgICAgIHV1aWQoNkZFMjA5NjItRDA3Ny0xMWQwLThGRTctMDBBQTAwNkJDQzU5KSwKKyAgICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCisgICAgXQorICAgIGludGVyZmFjZSBJQWN0aXZlSU1FIDogSVVua25vd24KKyAgICB7CisgICAgICAgIEhSRVNVTFQgSW5xdWlyZShbaW5dIERXT1JEIGR3U3lzdGVtSW5mb0ZsYWdzLCBbb3V0XSBJTUVJTkZPICpwSU1FSW5mbywgW291dF0gTFBXU1RSIHN6V25kQ2xhc3MsIFtvdXRdIERXT1JEICpwZHdQcml2YXRlKTsKKyAgICAgICAgSFJFU1VMVCBDb252ZXJzaW9uTGlzdChbaW5dIEhJTUMgaElNQywgW2luXSBMUFdTVFIgc3pTb3VyY2UsIFtpbl0gVUlOVCB1RmxhZywgW2luXSBVSU5UIHVCdWZMZW4sIFtvdXRdIENBTkRJREFURUxJU1QgKnBEZXN0LCBbb3V0XSBVSU5UICpwdUNvcGllZCk7CisgICAgICAgIEhSRVNVTFQgQ29uZmlndXJlKFtpbl0gSEtMIGhLTCwgW2luXSBIV05EIGhXbmQsIFtpbl0gRFdPUkQgZHdNb2RlLCBbaW5dIFJFR0lTVEVSV09SRFcgKnBSZWdpc3RlcldvcmQpOworICAgICAgICBIUkVTVUxUIERlc3Ryb3koW2luXSBVSU5UIHVSZXNlcnZlZCk7CisgICAgICAgIEhSRVNVTFQgRXNjYXBlKFtpbl0gSElNQyBoSU1DLCBbaW5dIFVJTlQgdUVzY2FwZSwgW2luLCBvdXRdIHZvaWQgKnBEYXRhLCBbb3V0XSBMUkVTVUxUICpwbFJlc3VsdCk7CisgICAgICAgIEhSRVNVTFQgU2V0QWN0aXZlQ29udGV4dChbaW5dIEhJTUMgaElNQywgW2luXSBCT09MIGZGbGFnKTsKKyAgICAgICAgSFJFU1VMVCBQcm9jZXNzS2V5KFtpbl0gSElNQyBoSU1DLCBbaW5dIFVJTlQgdVZpcktleSwgW2luXSBEV09SRCBsUGFyYW0sIFtpbl0gQllURSAqcGJLZXlTdGF0ZSk7CisgICAgICAgIEhSRVNVTFQgTm90aWZ5KFtpbl0gSElNQyBoSU1DLCBbaW5dIERXT1JEIGR3QWN0aW9uLCBbaW5dIERXT1JEIGR3SW5kZXgsIFtpbl0gRFdPUkQgZHdWYWx1ZSk7CisgICAgICAgIEhSRVNVTFQgU2VsZWN0KFtpbl0gSElNQyBoSU1DLCBbaW5dIEJPT0wgZlNlbGVjdCk7CisgICAgICAgIEhSRVNVTFQgU2V0Q29tcG9zaXRpb25TdHJpbmcoW2luXSBISU1DIGhJTUMsIFtpbl0gRFdPUkQgZHdJbmRleCwgW2luXSB2b2lkICpwQ29tcCwgW2luXSBEV09SRCBkd0NvbXBMZW4sIFtpbl0gdm9pZCAqcFJlYWQsIFtpbl0gRFdPUkQgZHdSZWFkTGVuKTsKKyAgICAgICAgSFJFU1VMVCBUb0FzY2lpRXgoW2luXSBVSU5UIHVWaXJLZXksIFtpbl0gVUlOVCB1U2NhbkNvZGUsIFtpbl0gQllURSAqcGJLZXlTdGF0ZSwgW2luXSBVSU5UIGZ1U3RhdGUsIFtpbl0gSElNQyBoSU1DLCBbb3V0XSBEV09SRCAqcGR3VHJhbnNCdWYsIFtvdXRdIFVJTlQgKnB1U2l6ZSk7CisgICAgICAgIEhSRVNVTFQgUmVnaXN0ZXJXb3JkKFtpbl0gTFBXU1RSIHN6UmVhZGluZywgW2luXSBEV09SRCBkd1N0eWxlLCBbaW5dIExQV1NUUiBzelN0cmluZyk7CisgICAgICAgIEhSRVNVTFQgVW5yZWdpc3RlcldvcmQoW2luXSBMUFdTVFIgc3pSZWFkaW5nLCBbaW5dIERXT1JEICBkd1N0eWxlLCBbaW5dIExQV1NUUiBzelN0cmluZyk7CisgICAgICAgIEhSRVNVTFQgR2V0UmVnaXN0ZXJXb3JkU3R5bGUoW2luXSBVSU5UIG5JdGVtLCBbb3V0XSBTVFlMRUJVRlcgKnBTdHlsZUJ1ZiwgW291dF0gVUlOVCAqcHVCdWZTaXplKTsKKyAgICAgICAgSFJFU1VMVCBFbnVtUmVnaXN0ZXJXb3JkKFtpbl0gTFBXU1RSIHN6UmVhZGluZywgW2luXSBEV09SRCBkd1N0eWxlLCBbaW5dIExQV1NUUiBzelJlZ2lzdGVyLCBbaW5dIExQVk9JRCBwRGF0YSwgW291dF0gSUVudW1SZWdpc3RlcldvcmRXICoqcHBFbnVtKTsKKyAgICAgICAgSFJFU1VMVCBHZXRDb2RlUGFnZUEoW291dF0gVUlOVCAqdUNvZGVQYWdlKTsKKyAgICAgICAgSFJFU1VMVCBHZXRMYW5nSWQoW291dF0gTEFOR0lEICpwbGlkKTsKKyAgICB9OworCisgICAgWworICAgICAgb2JqZWN0LAorICAgICAgdXVpZChlMWM0YmYwZS0yZDUzLTExZDItOTNlMS0wMDYwYjA2N2I4NmUpLAorICAgICAgcG9pbnRlcl9kZWZhdWx0KHVuaXF1ZSkKKyAgICBdCisgICAgaW50ZXJmYWNlIElBY3RpdmVJTUUyIDogSUFjdGl2ZUlNRQorICAgIHsKKyAgICAgICAgSFJFU1VMVCBTbGVlcCgpOworICAgICAgICBIUkVTVUxUIFVuc2xlZXAoW2luXSBCT09MIGZEZWFkKTsKKyAgICB9OworCisgICAgWworICAgICAgdXVpZCg0OTU1REQzMy1CMTU5LTExZDAtOEZDRi0wMEFBMDA2QkNDNTkpLAorICAgIF0KKyAgICBjb2NsYXNzIENBY3RpdmVJTU0KKyAgICB7CisgICAgICAgIFtkZWZhdWx0XSBpbnRlcmZhY2UgSUFjdGl2ZUlNTUFwcDsKKyAgICAgICAgaW50ZXJmYWNlIElBY3RpdmVJTU1JTUU7CisgICAgICAgIGludGVyZmFjZSBJQWN0aXZlSU1NUmVnaXN0cmFyOworICAgICAgICBpbnRlcmZhY2UgSUFjdGl2ZUlNTU1lc3NhZ2VQdW1wT3duZXI7CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3NyYy9kbGxkYXRhLmMgYi9zcmMvZGxsZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzEyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGxsZGF0YS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERsbERhdGEgZmlsZSAtLSBnZW5lcmF0ZWQgYnkgTUlETCBjb21waWxlcgorCisJRE8gTk9UIEFMVEVSIFRISVMgRklMRQorCisgICBUaGlzIGZpbGUgaXMgcmVnZW5lcmF0ZWQgYnkgTUlETCBvbiBldmVyeSBJREwgZmlsZSBjb21waWxlLgorCisgICBUbyBjb21wbGV0ZWx5IHJlY29uc3RydWN0IHRoaXMgZmlsZSwgZGVsZXRlIGl0IGFuZCByZXJ1biBNSURMCisgICBvbiBhbGwgdGhlIElETCBmaWxlcyBpbiB0aGlzIERMTCwgc3BlY2lmeWluZyB0aGlzIGZpbGUgZm9yIHRoZQorICAgL2RsbGRhdGEgY29tbWFuZCBsaW5lIG9wdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUFJPWFlfREVMRUdBVElPTgorCisjaW5jbHVkZSA8cnBjcHJveHkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiICAgeworI2VuZGlmCisKK0VYVEVSTl9QUk9YWV9GSUxFKCBpZl9vbGUgKQorCisKK1BST1hZRklMRV9MSVNUX1NUQVJUCisvKiBTdGFydCBvZiBsaXN0ICovCisgIFJFRkVSRU5DRV9QUk9YWV9GSUxFKCBpZl9vbGUgKSwKKy8qIEVuZCBvZiBsaXN0ICovCitQUk9YWUZJTEVfTElTVF9FTkQKKworCitETExEQVRBX1JPVVRJTkVTKCBhUHJveHlGaWxlTGlzdCwgR0VUX0RMTF9DTFNJRCApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLypleHRlcm4gIkMiICovCisjZW5kaWYKKworLyogZW5kIG9mIGdlbmVyYXRlZCBkbGxkYXRhIGZpbGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9kb3NpbnN0LmMgYi9zcmMvZG9zaW5zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWYxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZG9zaW5zdC5jCkBAIC0wLDAgKzEsMjQ2MSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogZG9zaW5zdC5jOiBJbnN0YWxsIHByb2dyYW0gZm9yIFZpbSBvbiBNUy1ET1MgYW5kIE1TLVdpbmRvd3MKKyAqCisgKiBDb21waWxlIHdpdGggTWFrZV9tdmMubWFrLCBNYWtlX2JjMy5tYWssIE1ha2VfYmM1Lm1hayBvciBNYWtlX2RqZy5tYWsuCisgKi8KKworLyoKKyAqIEluY2x1ZGUgY29tbW9uIGNvZGUgZm9yIGRvc2luc3QuYyBhbmQgdW5pbnN0YWwuYy4KKyAqLworI2RlZmluZSBET1NJTlNUCisjaW5jbHVkZSAiZG9zaW5zdC5oIgorCisvKiBNYWNybyB0byBkbyBhbiBlcnJvciBjaGVjayBJIHdhcyB0eXBpbmcgb3ZlciBhbmQgb3ZlciAqLworI2RlZmluZSBDSEVDS19SRUdfRVJST1IoY29kZSkgaWYgKGNvZGUgIT0gRVJST1JfU1VDQ0VTUykgeyBwcmludGYoIiVsZCBlcnJvciBudW1iZXI6ICAlbGRcbiIsIChsb25nKV9fTElORV9fLCAobG9uZyljb2RlKTsgcmV0dXJuIDE7IH0KKworaW50CWhhc192aW0gPSAwOwkJLyogaW5zdGFsbGFibGUgdmltLmV4ZSBleGlzdHMgKi8KK2ludAloYXNfZ3ZpbSA9IDA7CQkvKiBpbnN0YWxsYWJsZSBndmltLmV4ZSBleGlzdHMgKi8KKworY2hhcglvbGR2aW1yY1tCVUZTSVpFXTsJLyogbmFtZSBvZiBleGlzdGluZyB2aW1yYyBmaWxlICovCitjaGFyCXZpbXJjW0JVRlNJWkVdOwkJLyogbmFtZSBvZiB2aW1yYyBmaWxlIHRvIGNyZWF0ZSAqLworCitjaGFyCSpkZWZhdWx0X2JhdF9kaXIgPSBOVUxMOyAgLyogd2hlbiBub3QgTlVMTCwgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgIGRpcmVjdG9yeSB0byB3cml0ZSAuYmF0IGZpbGVzIGluICovCitjaGFyCSpkZWZhdWx0X3ZpbV9kaXIgPSBOVUxMOyAgLyogd2hlbiBub3QgTlVMTCwgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgIGluc3RhbGwgZGlyIGZvciBOU0lTICovCisjaWYgMAorY2hhcglob21lZGlyW0JVRlNJWkVdOwkvKiBob21lIGRpcmVjdG9yeSBvciAiIiAqLworI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgZWFjaCBjaG9pY2UgdGhlIHVzZXIgY2FuIG1ha2UuCisgKi8KK3N0cnVjdCBjaG9pY2UKK3sKKyAgICBpbnQJICAgIGFjdGl2ZTsJCQkvKiBub24temVybyB3aGVuIGNob2ljZSBpcyBhY3RpdmUgKi8KKyAgICBjaGFyICAgICp0ZXh0OwkJCS8qIHRleHQgZGlzcGxheWVkIGZvciB0aGlzIGNob2ljZSAqLworICAgIHZvaWQgICAgKCpjaGFuZ2VmdW5jKShpbnQgaWR4KTsJLyogZnVuY3Rpb24gdG8gY2hhbmdlIHRoaXMgY2hvaWNlICovCisgICAgaW50CSAgICBhcmc7CQkJLyogYXJndW1lbnQgZm9yIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAoKmluc3RhbGxmdW5jKShpbnQgaWR4KTsJLyogZnVuY3Rpb24gdG8gaW5zdGFsbCB0aGlzIGNob2ljZSAqLworfTsKKworc3RydWN0IGNob2ljZQljaG9pY2VzWzMwXTsJCS8qIGNob2ljZXMgdGhlIHVzZXIgY2FuIG1ha2UgKi8KK2ludAkJY2hvaWNlX2NvdW50ID0gMDsJLyogbnVtYmVyIG9mIGNob2ljZXMgYXZhaWxhYmxlICovCisKKyNkZWZpbmUgVEFCTEVfU0laRShzKQkoaW50KShzaXplb2YocykgLyBzaXplb2YoKnMpKQorCitlbnVtCit7CisgICAgY29tcGF0X3ZpID0gMSwKKyAgICBjb21wYXRfc29tZV9lbmhhbmNlbWVudHMsCisgICAgY29tcGF0X2FsbF9lbmhhbmNlbWVudHMKK307CitjaGFyCSooY29tcGF0X2Nob2ljZXNbXSkgPQoreworICAgICJcbkNob29zZSB0aGUgZGVmYXVsdCB3YXkgdG8gcnVuIFZpbToiLAorICAgICJWaSBjb21wYXRpYmxlIiwKKyAgICAid2l0aCBzb21lIFZpbSBlaGFuY2VtZW50cyIsCisgICAgIndpdGggc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgb3RoZXIgZmVhdHVyZXMgc3dpdGNoZWQgb24iLAorfTsKK2ludAljb21wYXRfY2hvaWNlID0gKGludCljb21wYXRfYWxsX2VuaGFuY2VtZW50czsKK2NoYXIJKmNvbXBhdF90ZXh0ID0gIi0gcnVuIFZpbSAlcyI7CisKK2VudW0KK3sKKyAgICByZW1hcF9ubyA9IDEsCisgICAgcmVtYXBfd2luCit9OworY2hhcgkqKHJlbWFwX2Nob2ljZXNbXSkgPQoreworICAgICJcbkNob29zZToiLAorICAgICJEbyBub3QgcmVtYXAga2V5cyBmb3IgV2luZG93cyBiZWhhdmlvciIsCisgICAgIlJlbWFwIGEgZmV3IGtleXMgZm9yIFdpbmRvd3MgYmVoYXZpb3IgKDxDLVY+LCA8Qy1DPiwgZXRjKSIsCit9OworaW50CXJlbWFwX2Nob2ljZSA9IChpbnQpcmVtYXBfd2luOworY2hhcgkqcmVtYXBfdGV4dCA9ICItICVzIjsKKworZW51bQoreworICAgIG1vdXNlX3h0ZXJtID0gMSwKKyAgICBtb3VzZV9tc3dpbgorfTsKK2NoYXIJKihtb3VzZV9jaG9pY2VzW10pID0KK3sKKyAgICAiXG5DaG9vc2UgdGhlIHdheSBob3cgVmltIHVzZXMgdGhlIG1vdXNlOiIsCisgICAgInJpZ2h0IGJ1dHRvbiBleHRlbmRzIHNlbGVjdGlvbiAodGhlIFVuaXggd2F5KSIsCisgICAgInJpZ2h0IGJ1dHRvbiBoYXMgYSBwb3B1cCBtZW51ICh0aGUgV2luZG93cyB3YXkpIiwKK307CitpbnQJbW91c2VfY2hvaWNlID0gKGludCltb3VzZV9tc3dpbjsKK2NoYXIJKm1vdXNlX3RleHQgPSAiLSBUaGUgbW91c2UgJXMiOworCitlbnVtCit7CisgICAgdmltZmlsZXNfZGlyX25vbmUgPSAxLAorICAgIHZpbWZpbGVzX2Rpcl92aW0sCisgICAgdmltZmlsZXNfZGlyX2hvbWUKK307CitzdGF0aWMgY2hhciAgICAqKHZpbWZpbGVzX2Rpcl9jaG9pY2VzW10pID0KK3sKKyAgICAiXG5DcmVhdGUgcGx1Z2luIGRpcmVjdG9yaWVzOiIsCisgICAgIk5vIiwKKyAgICAiSW4gdGhlIFZJTSBkaXJlY3RvcnkiLAorICAgICJJbiB5b3VyIEhPTUUgZGlyZWN0b3J5IiwKK307CitzdGF0aWMgaW50ICAgICB2aW1maWxlc19kaXJfY2hvaWNlOworCisvKiBub24temVybyB3aGVuIHNlbGVjdGVkIHRvIGluc3RhbGwgdGhlIHBvcHVwIG1lbnUgZW50cnkuICovCitzdGF0aWMgaW50CWluc3RhbGxfcG9wdXAgPSAwOworCisvKiBub24temVybyB3aGVuIHNlbGVjdGVkIHRvIGluc3RhbGwgdGhlICJPcGVuIHdpdGgiIGVudHJ5LiAqLworc3RhdGljIGludAlpbnN0YWxsX29wZW53aXRoID0gMDsKKworLyogbm9uLXplcm8gd2hlbiBuZWVkIHRvIGFkZCBhbiB1bmluc3RhbGwgZW50cnkgaW4gdGhlIHJlZ2lzdHJ5ICovCitzdGF0aWMgaW50CW5lZWRfdW5pbnN0YWxsX2VudHJ5ID0gMDsKKworLyoKKyAqIERlZmluaXRpb25zIG9mIHRoZSBkaXJlY3RvcnkgbmFtZSAodW5kZXIgJFZJTSkgb2YgdGhlIHZpbWZpbGVzIGRpcmVjdG9yeQorICogYW5kIGl0cyBzdWJkaXJlY3RvcmllczoKKyAqLworc3RhdGljIGNoYXIJKih2aW1maWxlc19zdWJkaXJzW10pID0KK3sKKyAgICAiY29sb3JzIiwKKyAgICAiY29tcGlsZXIiLAorICAgICJkb2MiLAorICAgICJmdGRldGVjdCIsCisgICAgImZ0cGx1Z2luIiwKKyAgICAiaW5kZW50IiwKKyAgICAia2V5bWFwIiwKKyAgICAicGx1Z2luIiwKKyAgICAic3ludGF4IiwKK307CisKKy8qCisgKiBDb3B5IGEgZGlyZWN0b3J5IG5hbWUgZnJvbSAiZGlyIiB0byAiYnVmIiwgZG91YmxpbmcgYmFja3NsYXNoZXMuCisgKiBBbHNvIG1ha2Ugc3VyZSBpdCBlbmRzIGluIGEgZG91YmxlIGJhY2tzbGFzaC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkb3VibGVfYnMoY2hhciAqZGlyLCBjaGFyICpidWYpCit7CisgICAgY2hhciAqZCA9IGJ1ZjsKKyAgICBjaGFyICpzOworCisgICAgZm9yIChzID0gZGlyOyAqczsgKytzKQorICAgIHsKKwlpZiAoKnMgPT0gJ1xcJykKKwkgICAgKmQrKyA9ICdcXCc7CisJKmQrKyA9ICpzOworICAgIH0KKyAgICAvKiB3aGVuIGRpciBpcyBub3QgZW1wdHksIGl0IG11c3QgZW5kIGluIGEgZG91YmxlIGJhY2tzbGFzaCAqLworICAgIGlmIChkID4gYnVmICYmIGRbLTFdICE9ICdcXCcpCisgICAgeworCSpkKysgPSAnXFwnOworCSpkKysgPSAnXFwnOworICAgIH0KKyAgICAqZCA9IE5VTDsKK30KKworLyoKKyAqIE9idGFpbiBhIGNob2ljZSBmcm9tIGEgdGFibGUuCisgKiBGaXJzdCBlbnRyeSBpcyBhIHF1ZXN0aW9uLCBvdGhlcnMgYXJlIGNob2ljZXMuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfY2hvaWNlKGNoYXIgKip0YWJsZSwgaW50IGVudHJpZXMpCit7CisgICAgaW50CQlhbnN3ZXI7CisgICAgaW50CQlpZHg7CisgICAgY2hhcglkdW1teVsxMDBdOworCisgICAgZG8KKyAgICB7CisJZm9yIChpZHggPSAwOyBpZHggPCBlbnRyaWVzOyArK2lkeCkKKwl7CisJICAgIGlmIChpZHgpCisJCXByaW50ZigiJTJkICAiLCBpZHgpOworCSAgICBwcmludGYodGFibGVbaWR4XSk7CisJICAgIHByaW50ZigiXG4iKTsKKwl9CisJcHJpbnRmKCJDaG9pY2U6ICIpOworCWlmIChzY2FuZigiJWQiLCAmYW5zd2VyKSAhPSAxKQorCXsKKwkgICAgc2NhbmYoIiU5OXMiLCBkdW1teSk7CisJICAgIGFuc3dlciA9IDA7CisJfQorICAgIH0KKyAgICB3aGlsZSAoYW5zd2VyIDwgMSB8fCBhbnN3ZXIgPj0gZW50cmllcyk7CisKKyAgICByZXR1cm4gYW5zd2VyOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIHVzZXIgdW5wYWNrZWQgdGhlIGFyY2hpdmVzIHByb3Blcmx5LgorICogU2V0cyAicnVudGltZWlkeCIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfdW5wYWNrKHZvaWQpCit7CisgICAgY2hhcglidWZbQlVGU0laRV07CisgICAgRklMRQkqZmQ7CisgICAgc3RydWN0IHN0YXQJc3Q7CisKKyAgICAvKiBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgdGhlIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIgaW4gaW5zdGFsbGRpcltdICovCisgICAgcnVudGltZWlkeCA9IHN0cmxlbihpbnN0YWxsZGlyKSAtIHN0cmxlbihWSU1fVkVSU0lPTl9OT0RPVCk7CisgICAgaWYgKHJ1bnRpbWVpZHggPD0gMAorCSAgICB8fCBzdHJpY21wKGluc3RhbGxkaXIgKyBydW50aW1laWR4LCBWSU1fVkVSU0lPTl9OT0RPVCkgIT0gMAorCSAgICB8fCAoaW5zdGFsbGRpcltydW50aW1laWR4IC0gMV0gIT0gJy8nCisJCSYmIGluc3RhbGxkaXJbcnVudGltZWlkeCAtIDFdICE9ICdcXCcpKQorICAgIHsKKwlwcmludGYoIkVSUk9SOiBJbnN0YWxsIHByb2dyYW0gbm90IGluIGRpcmVjdG9yeSBcIiVzXCJcbiIsCisJCVZJTV9WRVJTSU9OX05PRE9UKTsKKwlwcmludGYoIlRoaXMgcHJvZ3JhbSBjYW4gb25seSB3b3JrIHdoZW4gaXQgaXMgbG9jYXRlZCBpbiBpdHMgb3JpZ2luYWwgZGlyZWN0b3J5XG4iKTsKKwlteWV4aXQoMSk7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgZmlsZXR5cGUudmltIGlzIHByZXNlbnQsIHdoaWNoIG1lYW5zIHRoZSBydW50aW1lIGFyY2hpdmUgaGFzCisgICAgICogYmVlbiB1bnBhY2tlZCAgKi8KKyAgICBzcHJpbnRmKGJ1ZiwgIiVzXFxmaWxldHlwZS52aW0iLCBpbnN0YWxsZGlyKTsKKyAgICBpZiAoc3RhdChidWYsICZzdCkgPCAwKQorICAgIHsKKwlwcmludGYoIkVSUk9SOiBDYW5ub3QgZmluZCBmaWxldHlwZS52aW0gaW4gXCIlc1wiXG4iLCBpbnN0YWxsZGlyKTsKKwlwcmludGYoIkl0IGxvb2tzIGxpa2UgeW91IGRpZCBub3QgdW5wYWNrIHRoZSBydW50aW1lIGFyY2hpdmUuXG4iKTsKKwlwcmludGYoIllvdSBtdXN0IHVucGFjayB0aGUgcnVudGltZSBhcmNoaXZlIFwidmltJXNydC56aXBcIiBiZWZvcmUgaW5zdGFsbGluZy5cbiIsCisJCVZJTV9WRVJTSU9OX05PRE9UICsgMyk7CisJbXlleGl0KDEpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHZpbS5leGUgb3IgZ3ZpbS5leGUgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLworICAgIGlmICgoZmQgPSBmb3BlbigiZ3ZpbS5leGUiLCAiciIpKSAhPSBOVUxMKQorICAgIHsKKwlmY2xvc2UoZmQpOworCWhhc19ndmltID0gMTsKKyAgICB9CisgICAgaWYgKChmZCA9IGZvcGVuKCJ2aW0uZXhlIiwgInIiKSkgIT0gTlVMTCkKKyAgICB7CisJZmNsb3NlKGZkKTsKKwloYXNfdmltID0gMTsKKyAgICB9CisgICAgaWYgKCFoYXNfZ3ZpbSAmJiAhaGFzX3ZpbSkKKyAgICB7CisJcHJpbnRmKCJFUlJPUjogQ2Fubm90IGZpbmQgYW55IFZpbSBleGVjdXRhYmxlcyBpbiBcIiVzXCJcblxuIiwKKwkJCQkJCQkJICBpbnN0YWxsZGlyKTsKKwlteWV4aXQoMSk7CisgICAgfQorfQorCisvKgorICogQ29tcGFyZSBwYXRocyAicFtwbGVuXSIgdG8gInFbcWxlbl0iLiAgUmV0dXJuIDAgaWYgdGhleSBtYXRjaC4KKyAqIElnbm9yZXMgY2FzZSBhbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiAnLycgYW5kICdcJy4KKyAqICJwbGVuIiBhbmQgInFsZW4iIGNhbiBiZSBuZWdhdGl2ZSwgc3RybGVuKCkgaXMgdXNlZCB0aGVuLgorICovCisgICAgc3RhdGljIGludAorcGF0aGNtcChjaGFyICpwLCBpbnQgcGxlbiwgY2hhciAqcSwgaW50IHFsZW4pCit7CisgICAgaW50CQlpOworCisgICAgaWYgKHBsZW4gPCAwKQorCXBsZW4gPSBzdHJsZW4ocCk7CisgICAgaWYgKHFsZW4gPCAwKQorCXFsZW4gPSBzdHJsZW4ocSk7CisgICAgZm9yIChpID0gMDsgOyArK2kpCisgICAgeworCS8qIEVuZCBvZiAicCI6IGNoZWNrIGlmICJxIiBhbHNvIGVuZHMgb3IganVzdCBoYXMgYSBzbGFzaC4gKi8KKwlpZiAoaSA9PSBwbGVuKQorCXsKKwkgICAgaWYgKGkgPT0gcWxlbikgIC8qIG1hdGNoICovCisJCXJldHVybiAwOworCSAgICBpZiAoaSA9PSBxbGVuIC0gMSAmJiAocVtpXSA9PSAnXFwnIHx8IHFbaV0gPT0gJy8nKSkKKwkJcmV0dXJuIDA7ICAgLyogbWF0Y2ggd2l0aCB0cmFpbGluZyBzbGFzaCAqLworCSAgICByZXR1cm4gMTsJICAgIC8qIG5vIG1hdGNoICovCisJfQorCisJLyogRW5kIG9mICJxIjogY2hlY2sgaWYgInAiIGFsc28gZW5kcyBvciBqdXN0IGhhcyBhIHNsYXNoLiAqLworCWlmIChpID09IHFsZW4pCisJeworCSAgICBpZiAoaSA9PSBwbGVuKSAgLyogbWF0Y2ggKi8KKwkJcmV0dXJuIDA7CisJICAgIGlmIChpID09IHBsZW4gLSAxICYmIChwW2ldID09ICdcXCcgfHwgcFtpXSA9PSAnLycpKQorCQlyZXR1cm4gMDsgICAvKiBtYXRjaCB3aXRoIHRyYWlsaW5nIHNsYXNoICovCisJICAgIHJldHVybiAxOwkgICAgLyogbm8gbWF0Y2ggKi8KKwl9CisKKwlpZiAoIShteXRvdXBwZXIocFtpXSkgPT0gbXl0b3VwcGVyKHFbaV0pCisJCXx8ICgocFtpXSA9PSAnLycgfHwgcFtpXSA9PSAnXFwnKQorCQkgICAgJiYgKHFbaV0gPT0gJy8nIHx8IHFbaV0gPT0gJ1xcJykpKSkKKwkgICAgcmV0dXJuIDE7CSAgICAvKiBubyBtYXRjaCAqLworICAgIH0KKyAgICAvKk5PVFJFQUNIRUQqLworfQorCisvKgorICogSWYgdGhlIGV4ZWN1dGFibGUgIioqZGVzdGluYXRpb24iIGlzIGluIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSwgZmluZCBhbm90aGVyCisgKiBvbmUgaW4gJFBBVEguCisgKiBPbiBpbnB1dCAiKipkZXN0aW5hdGlvbiIgaXMgdGhlIHBhdGggb2YgYW4gZXhlY3V0YWJsZSBpbiBhbGxvY2F0ZWQgbWVtb3J5CisgKiAob3IgTlVMTCkuCisgKiAiKmRlc3RpbmF0aW9uIiBpcyBzZXQgdG8gTlVMTCBvciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZmluZG9sZGZpbGUoY2hhciAqKmRlc3RpbmF0aW9uKQoreworICAgIGNoYXIJKmJwID0gKmRlc3RpbmF0aW9uOworICAgIHNpemVfdAlpbmRpcl9sID0gc3RybGVuKGluc3RhbGxkaXIpOworICAgIGNoYXIJKmNwID0gYnAgKyBpbmRpcl9sOworICAgIGNoYXIJKnRtcG5hbWU7CisgICAgY2hhcgkqZmFybmFtZTsKKworICAgIC8qCisgICAgICogTm8gYWN0aW9uIG5lZWRlZCBpZiBleGUgbm90IGZvdW5kIG9yIG5vdCBpbiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBpZiAoYnAgPT0gTlVMTAorCSAgICB8fCBzdHJuaWNtcChicCwgaW5zdGFsbGRpciwgaW5kaXJfbCkgIT0gMAorCSAgICB8fCBzdHJjaHIoIi9cXCIsICpjcCsrKSA9PSBOVUxMCisJICAgIHx8IHN0cmNocihjcCwgJ1xcJykgIT0gTlVMTAorCSAgICB8fCBzdHJjaHIoY3AsICcvJykgIT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICB0bXBuYW1lID0gYWxsb2MoKGludClzdHJsZW4oY3ApICsgMSk7CisgICAgc3RyY3B5KHRtcG5hbWUsIGNwKTsKKyAgICB0bXBuYW1lW3N0cmxlbih0bXBuYW1lKSAtIDFdID0gJ3gnOwkvKiAuZXhlIC0+IC5leHggKi8KKworICAgIGlmIChhY2Nlc3ModG1wbmFtZSwgMCkgPT0gMCkKKyAgICB7CisJcHJpbnRmKCJcbkVSUk9SOiAlcyBhbmQgJXMgY2xhc2guICBSZW1vdmUgb3IgcmVuYW1lICVzLlxuIiwKKwkgICAgdG1wbmFtZSwgY3AsIHRtcG5hbWUpOworCW15ZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAocmVuYW1lKGNwLCB0bXBuYW1lKSAhPSAwKQorICAgIHsKKwlwcmludGYoIlxuRVJST1I6IGZhaWxlZCB0byByZW5hbWUgJXMgdG8gJXM6ICVzXG4iLAorCSAgICBjcCwgdG1wbmFtZSwgc3RyZXJyb3IoMCkpOworCW15ZXhpdCgxKTsKKyAgICB9CisKKyAgICBmYXJuYW1lID0gc2VhcmNocGF0aF9zYXZlKGNwKTsKKworICAgIGlmIChyZW5hbWUodG1wbmFtZSwgY3ApICE9IDApCisgICAgeworCXByaW50ZigiXG5FUlJPUjogZmFpbGVkIHRvIHJlbmFtZSAlcyBiYWNrIHRvICVzOiAlc1xuIiwKKwkgICAgdG1wbmFtZSwgY3AsIHN0cmVycm9yKDApKTsKKwlteWV4aXQoMSk7CisgICAgfQorCisgICAgZnJlZSgqZGVzdGluYXRpb24pOworICAgIGZyZWUodG1wbmFtZSk7CisgICAgKmRlc3RpbmF0aW9uID0gZmFybmFtZTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGEgdmltLltleGV8YmF0fCwgZ3ZpbS5bZXhlfGJhdHwsIGV0Yy4gaW4gdGhlIHBhdGguCisgKiBXaGVuICJjaGVja19iYXRfb25seSIgaXMgVFJVRSwgb25seSBmaW5kICJkZWZhdWx0X2JhdF9kaXIiLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZpbmRfYmF0X2V4ZShpbnQgY2hlY2tfYmF0X29ubHkpCit7CisgICAgaW50CQlpOworCisgICAgbWNoX2NoZGlyKHN5c2RyaXZlKTsJLyogYXZvaWQgbG9va2luZyBpbiB0aGUgImluc3RhbGxkaXIiICovCisKKyAgICBmb3IgKGkgPSAxOyBpIDwgVEFSR0VUX0NPVU5UOyArK2kpCisgICAgeworCXRhcmdldHNbaV0ub2xkYmF0ID0gc2VhcmNocGF0aF9zYXZlKHRhcmdldHNbaV0uYmF0bmFtZSk7CisJaWYgKCFjaGVja19iYXRfb25seSkKKwkgICAgdGFyZ2V0c1tpXS5vbGRleGUgPSBzZWFyY2hwYXRoX3NhdmUodGFyZ2V0c1tpXS5leGVuYW1lKTsKKworCWlmIChkZWZhdWx0X2JhdF9kaXIgPT0gTlVMTCAmJiB0YXJnZXRzW2ldLm9sZGJhdCAhPSBOVUxMKQorCXsKKwkgICAgZGVmYXVsdF9iYXRfZGlyID0gYWxsb2Moc3RybGVuKHRhcmdldHNbaV0ub2xkYmF0KSArIDEpOworCSAgICBzdHJjcHkoZGVmYXVsdF9iYXRfZGlyLCB0YXJnZXRzW2ldLm9sZGJhdCk7CisJICAgIHJlbW92ZV90YWlsKGRlZmF1bHRfYmF0X2Rpcik7CisJfQorCWlmIChjaGVja19iYXRfb25seSAmJiB0YXJnZXRzW2ldLm9sZGJhdCAhPSBOVUxMKQorCSAgICBmcmVlKHRhcmdldHNbaV0ub2xkYmF0KTsKKyAgICB9CisKKyAgICBtY2hfY2hkaXIoaW5zdGFsbGRpcik7Cit9CisKKyNpZmRlZiBXSU4zMjY0CisvKgorICogR2V0IHRoZSB2YWx1ZSBvZiAkVklNUlVOVElNRSBvciAkVklNIGFuZCB3cml0ZSBpdCBpbiAkVEVNUC92aW1pbmkuaW5pLCBzbworICogdGhhdCBOU0lTIGNhbiByZWFkIGl0LgorICogV2hlbiBub3Qgc2V0LCB1c2UgdGhlIGRpcmVjdG9yeSBvZiBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIFZpbS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitnZXRfdmltX2Vudih2b2lkKQoreworICAgIGNoYXIJKnZpbTsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKyAgICBGSUxFCSpmZDsKKyAgICBjaGFyCWZuYW1lW0JVRlNJWkVdOworCisgICAgLyogRmlyc3QgZ2V0ICRWSU1SVU5USU1FLiAgSWYgaXQncyBzZXQsIHJlbW92ZSB0aGUgdGFpbC4gKi8KKyAgICB2aW0gPSBnZXRlbnYoIlZJTVJVTlRJTUUiKTsKKyAgICBpZiAodmltICE9IE5VTEwgJiYgKnZpbSAhPSAwKQorICAgIHsKKwlzdHJjcHkoYnVmLCB2aW0pOworCXJlbW92ZV90YWlsKGJ1Zik7CisJdmltID0gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXZpbSA9IGdldGVudigiVklNIik7CisJaWYgKHZpbSA9PSBOVUxMIHx8ICp2aW0gPT0gMCkKKwl7CisJICAgIC8qIFVzZSB0aGUgZGlyZWN0b3J5IGZyb20gYW4gb2xkIHVuaW5zdGFsbCBlbnRyeS4gKi8KKwkgICAgaWYgKGRlZmF1bHRfdmltX2RpciAhPSBOVUxMKQorCQl2aW0gPSBkZWZhdWx0X3ZpbV9kaXI7CisJICAgIGVsc2UKKwkJLyogTGV0IE5TSVMga25vdyB0aGVyZSBpcyBubyBkZWZhdWx0LCBpdCBzaG91bGQgdXNlCisJCSAqICRQUk9HUkFNRklsRVMuICovCisJCXZpbSA9ICIiOworCX0KKyAgICB9CisKKyAgICAvKiBOU0lTIGFsc28gdXNlcyBHZXRUZW1wUGF0aCgpLCB0aHVzIHdlIHNob3VsZCBnZXQgdGhlIHNhbWUgZGlyZWN0b3J5CisgICAgICogbmFtZSBhcyB3aGVyZSBOU0lTIHdpbGwgbG9vayBmb3IgdmltaW5pLmluaS4gKi8KKyAgICBHZXRUZW1wUGF0aChCVUZTSVpFLCBmbmFtZSk7CisgICAgYWRkX3BhdGhzZXAoZm5hbWUpOworICAgIHN0cmNhdChmbmFtZSwgInZpbWluaS5pbmkiKTsKKworICAgIGZkID0gZm9wZW4oZm5hbWUsICJ3Iik7CisgICAgaWYgKGZkICE9IE5VTEwpCisgICAgeworCS8qIE1ha2UgaXQgbG9vayBsaWtlIGFuIC5pbmkgZmlsZSwgc28gdGhhdCBOU0lTIGNhbiByZWFkIGl0IHdpdGggYQorCSAqIFJlYWRJTklTdHIgY29tbWFuZC4gKi8KKwlmcHJpbnRmKGZkLCAiW3ZpbWluaV1cbiIpOworCWZwcmludGYoZmQsICJkaXI9XCIlc1wiXG4iLCB2aW0pOworCWZjbG9zZShmZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZm5hbWUpOworCVNsZWVwKDIwMDApOworICAgIH0KK30KKworLyoKKyAqIENoZWNrIGZvciBhbHJlYWR5IGluc3RhbGxlZCBWaW1zLgorICogUmV0dXJuIG5vbi16ZXJvIHdoZW4gZm91bmQgb25lLgorICovCisgICAgc3RhdGljIGludAordW5pbnN0YWxsX2NoZWNrKHZvaWQpCit7CisgICAgSEtFWQlrZXlfaGFuZGxlOworICAgIEhLRVkJdW5pbnN0YWxsX2tleV9oYW5kbGU7CisgICAgY2hhcgkqdW5pbnN0YWxsX2tleSA9ICJzb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsIjsKKyAgICBjaGFyCXN1YmtleV9uYW1lX2J1ZmZbQlVGU0laRV07CisgICAgY2hhcgl0ZW1wX3N0cmluZ19idWZmZXJbQlVGU0laRV07CisgICAgRFdPUkQJbG9jYWxfYnVmc2l6ZSA9IEJVRlNJWkU7CisgICAgRklMRVRJTUUJdGVtcF9wZmlsZXRpbWU7CisgICAgRFdPUkQJa2V5X2luZGV4OworICAgIGNoYXIJaW5wdXQ7CisgICAgbG9uZwljb2RlOworICAgIERXT1JECXZhbHVlX3R5cGU7CisgICAgRFdPUkQJb3JpZ19udW1fa2V5czsKKyAgICBEV09SRAluZXdfbnVtX2tleXM7CisgICAgaW50CQlmb3VuZG9uZSA9IDA7CisKKyAgICBjb2RlID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgdW5pbnN0YWxsX2tleSwgMCwgS0VZX1JFQUQsCisJCQkJCQkJCSAma2V5X2hhbmRsZSk7CisgICAgQ0hFQ0tfUkVHX0VSUk9SKGNvZGUpOworCisgICAgZm9yIChrZXlfaW5kZXggPSAwOworCSBSZWdFbnVtS2V5RXgoa2V5X2hhbmRsZSwga2V5X2luZGV4LCBzdWJrZXlfbmFtZV9idWZmLCAmbG9jYWxfYnVmc2l6ZSwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgJnRlbXBfcGZpbGV0aW1lKSAhPSBFUlJPUl9OT19NT1JFX0lURU1TOworCSAgICBrZXlfaW5kZXgrKykKKyAgICB7CisJbG9jYWxfYnVmc2l6ZSA9IEJVRlNJWkU7CisJaWYgKHN0cm5jbXAoIlZpbSIsIHN1YmtleV9uYW1lX2J1ZmYsIDMpID09IDApCisJeworCSAgICAvKiBPcGVuIHRoZSBrZXkgbmFtZWQgVmltKiAqLworCSAgICBjb2RlID0gUmVnT3BlbktleUV4KGtleV9oYW5kbGUsIHN1YmtleV9uYW1lX2J1ZmYsIDAsIEtFWV9SRUFELAorCQkgICAgJnVuaW5zdGFsbF9rZXlfaGFuZGxlKTsKKwkgICAgQ0hFQ0tfUkVHX0VSUk9SKGNvZGUpOworCisJICAgIC8qIGdldCB0aGUgRGlzcGxheU5hbWUgb3V0IG9mIGl0IHRvIHNob3cgdGhlIHVzZXIgKi8KKwkgICAgY29kZSA9IFJlZ1F1ZXJ5VmFsdWVFeCh1bmluc3RhbGxfa2V5X2hhbmRsZSwgImRpc3BsYXluYW1lIiwgMCwKKwkJICAgICZ2YWx1ZV90eXBlLCAoTFBCWVRFKXRlbXBfc3RyaW5nX2J1ZmZlciwKKwkJICAgICZsb2NhbF9idWZzaXplKTsKKwkgICAgbG9jYWxfYnVmc2l6ZSA9IEJVRlNJWkU7CisJICAgIENIRUNLX1JFR19FUlJPUihjb2RlKTsKKworCSAgICBmb3VuZG9uZSA9IDE7CisJICAgIHByaW50ZigiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCSAgICBwcmludGYoIlZpbSBJbnN0YWxsIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhbiBleGlzdGluZyBWaW0gdmVyc2lvbi5cbiIpOworCSAgICBwcmludGYoIlRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpczpcbiIpOworCSAgICBwcmludGYoIlxuICAgICAgICBcIiVzXCJcblxuIiwgdGVtcF9zdHJpbmdfYnVmZmVyKTsKKworCSAgICBwcmludGYoIkluc3RhbGxpbmcgdGhlIG5ldyB2ZXJzaW9uIHdpbGwgZGlzYWJsZSBwYXJ0IG9mIHRoZSBleGlzdGluZyB2ZXJzaW9uLlxuIik7CisJICAgIHByaW50ZigiKFRoZSBiYXRjaCBmaWxlcyB1c2VkIGluIGEgY29uc29sZSBhbmQgdGhlIFwiRWRpdCB3aXRoIFZpbVwiIGVudHJ5IGluXG4iKTsKKwkgICAgcHJpbnRmKCJ0aGUgcG9wdXAgbWVudSB3aWxsIHVzZSB0aGUgbmV3IHZlcnNpb24pXG4iKTsKKworCSAgICBwcmludGYoIlxuRG8geW91IHdhbnQgdG8gdW5pbnN0YWxsIFwiJXNcIiBub3c/XG4oeSllcy8obilvKSAgIiwgdGVtcF9zdHJpbmdfYnVmZmVyKTsKKwkgICAgZmZsdXNoKHN0ZG91dCk7CisKKwkgICAgLyogZ2V0IHRoZSBVbmluc3RhbGxTdHJpbmcgKi8KKwkgICAgY29kZSA9IFJlZ1F1ZXJ5VmFsdWVFeCh1bmluc3RhbGxfa2V5X2hhbmRsZSwgInVuaW5zdGFsbHN0cmluZyIsIDAsCisJCSAgICAmdmFsdWVfdHlwZSwgKExQQllURSl0ZW1wX3N0cmluZ19idWZmZXIsICZsb2NhbF9idWZzaXplKTsKKwkgICAgbG9jYWxfYnVmc2l6ZSA9IEJVRlNJWkU7CisJICAgIENIRUNLX1JFR19FUlJPUihjb2RlKTsKKworCSAgICAvKiBSZW1lbWJlciB0aGUgZGlyZWN0b3J5LCBpdCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBOU0lTLiAqLworCSAgICBkZWZhdWx0X3ZpbV9kaXIgPSBhbGxvYyhzdHJsZW4odGVtcF9zdHJpbmdfYnVmZmVyKSArIDEpOworCSAgICBzdHJjcHkoZGVmYXVsdF92aW1fZGlyLCB0ZW1wX3N0cmluZ19idWZmZXIpOworCSAgICByZW1vdmVfdGFpbChkZWZhdWx0X3ZpbV9kaXIpOworCSAgICByZW1vdmVfdGFpbChkZWZhdWx0X3ZpbV9kaXIpOworCisJICAgIGlucHV0ID0gJ24nOworCSAgICBkbworCSAgICB7CisJCWlmIChpbnB1dCAhPSAnbicpCisJCSAgICBwcmludGYoIiVjIGlzIGFuIGludmFsaWQgcmVwbHkuICBQbGVhc2UgZW50ZXIgZWl0aGVyICd5JyBvciAnbidcbiIsIGlucHV0KTsKKworCQlyZXdpbmQoc3RkaW4pOworCQlzY2FuZigiJWMiLCAmaW5wdXQpOworCQlzd2l0Y2ggKGlucHV0KQorCQl7CisJCSAgICBjYXNlICd5JzoKKwkJICAgIGNhc2UgJ1knOgorCQkJLyogc2F2ZSB0aGUgbnVtYmVyIG9mIHVuaW5zdGFsbCBrZXlzIHNvIHdlIGNhbiBrbm93IGlmCisJCQkgKiBpdCBjaGFuZ2VkICovCisJCQlSZWdRdWVyeUluZm9LZXkoa2V5X2hhbmRsZSwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJICAgICAmb3JpZ19udW1fa2V5cywgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCSAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisJCQkvKiBEZWxldGUgdGhlIHVuaW5zdGFsbCBrZXkuICBJdCBoYXMgbm8gc3Via2V5cywgc28KKwkJCSAqIHRoaXMgaXMgZWFzeS4gIERvIHRoaXMgYmVmb3JlIHVuaW5zdGFsbGluZywgdGhhdAorCQkJICogbWF5IHRyeSB0byBkZWxldGUgdGhlIGtleSBhcyB3ZWxsLiAqLworCQkJUmVnRGVsZXRlS2V5KGtleV9oYW5kbGUsIHN1YmtleV9uYW1lX2J1ZmYpOworCisJCQkvKiBGaW5kIGV4aXN0aW5nIC5iYXQgZmlsZXMgYmVmb3JlIGRlbGV0aW5nIHRoZW0uICAqLworCQkJZmluZF9iYXRfZXhlKFRSVUUpOworCisJCQkvKiBFeGVjdXRlIHRoZSB1bmluc3RhbGwgcHJvZ3JhbS4gIFB1dCBpdCBpbiBkb3VibGUKKwkJCSAqIHF1b3RlcyBpZiB0aGVyZSBpcyBhbiBlbWJlZGRlZCBzcGFjZS4gKi8KKwkJCWlmIChzdHJjaHIodGVtcF9zdHJpbmdfYnVmZmVyLCAnICcpICE9IE5VTEwpCisJCQl7CisJCQkgICAgY2hhciBidWZbQlVGU0laRV07CisKKwkJCSAgICBzdHJjcHkoYnVmLCB0ZW1wX3N0cmluZ19idWZmZXIpOworCQkJICAgIHNwcmludGYodGVtcF9zdHJpbmdfYnVmZmVyLCAiXCIlc1wiIiwgYnVmKTsKKwkJCX0KKwkJCXJ1bl9jb21tYW5kKHRlbXBfc3RyaW5nX2J1ZmZlcik7CisKKwkJCS8qIENoZWNrIGlmIGFuIHVuaXN0YWxsIHJlZyBrZXkgd2FzIGRlbGV0ZWQuCisJCQkgKiBpZiBpdCB3YXMsIHdlIHdhbnQgdG8gZGVjcmVtZW50IGtleV9pbmRleC4KKwkJCSAqIGlmIHdlIGRvbid0IGRvIHRoaXMsIHdlIHdpbGwgc2tpcCB0aGUga2V5CisJCQkgKiBpbW1lZGlhdGVseSBhZnRlciBhbnkga2V5IHRoYXQgd2UgZGVsZXRlLiAgKi8KKwkJCVJlZ1F1ZXJ5SW5mb0tleShrZXlfaGFuZGxlLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkgICAgICAmbmV3X251bV9rZXlzLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCQlpZiAobmV3X251bV9rZXlzIDwgb3JpZ19udW1fa2V5cykKKwkJCSAgICBrZXlfaW5kZXgtLTsKKworCQkJaW5wdXQgPSAneSc7CisJCQlicmVhazsKKworCQkgICAgY2FzZSAnbic6CisJCSAgICBjYXNlICdOJzoKKwkJCS8qIERvIG5vdCB1bmluc3RhbGwgKi8KKwkJCWlucHV0ID0gJ24nOworCQkJYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6IC8qIGp1c3QgZHJvcCB0aHJvdWdoIGFuZCByZWRvIHRoZSBsb29wICovCisJCQlicmVhazsKKwkJfQorCisJICAgIH0gd2hpbGUgKGlucHV0ICE9ICduJyAmJiBpbnB1dCAhPSAneScpOworCisJICAgIFJlZ0Nsb3NlS2V5KHVuaW5zdGFsbF9rZXlfaGFuZGxlKTsKKwl9CisgICAgfQorICAgIFJlZ0Nsb3NlS2V5KGtleV9oYW5kbGUpOworCisgICAgcmV0dXJuIGZvdW5kb25lOworfQorI2VuZGlmCisKKy8qCisgKiBGaW5kIG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLgorICovCisgICAgc3RhdGljIHZvaWQKK2luc3BlY3Rfc3lzdGVtKHZvaWQpCit7CisgICAgY2hhcgkqcDsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKyAgICBGSUxFCSpmZDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlmb3VuZG9uZTsKKworICAgIC8qIFRoaXMgbWF5IHRha2UgYSBsaXR0bGUgd2hpbGUsIGxldCB0aGUgdXNlciBrbm93IHdoYXQgd2UncmUgZG9pbmcuICovCisgICAgcHJpbnRmKCJJbnNwZWN0aW5nIHN5c3RlbS4uLlxuIik7CisKKyAgICAvKgorICAgICAqIElmICRWSU0gaXMgc2V0LCBjaGVjayB0aGF0IGl0J3MgcG9pbnRpbmcgdG8gb3VyIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwID0gZ2V0ZW52KCJWSU0iKTsKKyAgICBpZiAocCAhPSBOVUxMICYmIHBhdGhjbXAocCwgLTEsIGluc3RhbGxkaXIsIHJ1bnRpbWVpZHggLSAxKSAhPSAwKQorICAgIHsKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIkVklNIGlzIHNldCB0byBcIiVzXCIuXG4iLCBwKTsKKwlwcmludGYoIlRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hlcmUgdGhpcyB2ZXJzaW9uIG9mIFZpbSBpczpcbiIpOworCXN0cmNweShidWYsIGluc3RhbGxkaXIpOworCSooYnVmICsgcnVudGltZWlkeCAtIDEpID0gTlVMOworCXByaW50ZigiXCIlc1wiXG4iLCBidWYpOworCXByaW50ZigiWW91IG11c3QgYWRqdXN0IG9yIHJlbW92ZSB0aGUgc2V0dGluZyBvZiAkVklNLFxuIik7CisJaWYgKGludGVyYWN0aXZlKQorCXsKKwkgICAgcHJpbnRmKCJ0byBiZSBhYmxlIHRvIHVzZSB0aGlzIGluc3RhbGwgcHJvZ3JhbS5cbiIpOworCSAgICBteWV4aXQoMSk7CisJfQorCXByaW50Zigib3RoZXJ3aXNlIFZpbSBXSUxMIE5PVCBXT1JLIHByb3Blcmx5IVxuIik7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgJFZJTVJVTlRJTUUgaXMgc2V0LCBjaGVjayB0aGF0IGl0J3MgcG9pbnRpbmcgdG8gb3VyIHJ1bnRpbWUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHAgPSBnZXRlbnYoIlZJTVJVTlRJTUUiKTsKKyAgICBpZiAocCAhPSBOVUxMICYmIHBhdGhjbXAocCwgLTEsIGluc3RhbGxkaXIsIC0xKSAhPSAwKQorICAgIHsKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIkVklNUlVOVElNRSBpcyBzZXQgdG8gXCIlc1wiLlxuIiwgcCk7CisJcHJpbnRmKCJUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoZXJlIHRoaXMgdmVyc2lvbiBvZiBWaW0gaXM6XG4iKTsKKwlwcmludGYoIlwiJXNcIlxuIiwgaW5zdGFsbGRpcik7CisJcHJpbnRmKCJZb3UgbXVzdCBhZGp1c3Qgb3IgcmVtb3ZlIHRoZSBzZXR0aW5nIG9mICRWSU1SVU5USU1FLFxuIik7CisJaWYgKGludGVyYWN0aXZlKQorCXsKKwkgICAgcHJpbnRmKCJ0byBiZSBhYmxlIHRvIHVzZSB0aGlzIGluc3RhbGwgcHJvZ3JhbS5cbiIpOworCSAgICBteWV4aXQoMSk7CisJfQorCXByaW50Zigib3RoZXJ3aXNlIFZpbSBXSUxMIE5PVCBXT1JLIHByb3Blcmx5IVxuIik7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSB2aW0uW2V4ZXxiYXR8LCBndmltLltleGV8YmF0fCwgZXRjLiBpbiB0aGUgcGF0aC4KKyAgICAgKi8KKyAgICBmaW5kX2JhdF9leGUoRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBBIC5leGUgaW4gdGhlIGluc3RhbGwgZGlyZWN0b3J5IG1heSBiZSBmb3VuZCBhbnl3YXkgb24gV2luZG93cyAyMDAwLgorICAgICAqIENoZWNrIGZvciB0aGlzIHNpdHVhdGlvbiBhbmQgZmluZCBhbm90aGVyIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5LgorICAgICAqIHcuYnJpc2NvZUBwb25sLmNvbSAyMDAxLTAxLTIwCisgICAgICovCisgICAgZm91bmRvbmUgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCBUQVJHRVRfQ09VTlQ7ICsraSkKKyAgICB7CisJZmluZG9sZGZpbGUoJih0YXJnZXRzW2ldLm9sZGV4ZSkpOworCWlmICh0YXJnZXRzW2ldLm9sZGV4ZSAhPSBOVUxMKQorCSAgICBmb3VuZG9uZSA9IDE7CisgICAgfQorCisgICAgaWYgKGZvdW5kb25lKQorICAgIHsKKwlwcmludGYoIldhcm5pbmc6IEZvdW5kIFZpbSBleGVjdXRhYmxlKHMpIGluIHlvdXIgJFBBVEg6XG4iKTsKKwlmb3IgKGkgPSAxOyBpIDwgVEFSR0VUX0NPVU5UOyArK2kpCisJICAgIGlmICh0YXJnZXRzW2ldLm9sZGV4ZSAhPSBOVUxMKQorCQlwcmludGYoIiVzXG4iLCB0YXJnZXRzW2ldLm9sZGV4ZSk7CisJcHJpbnRmKCJJdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgdmVyc2lvbiB5b3UgYXJlIGluc3RhbGxpbmcuXG4iKTsKKwlwcmludGYoIlBsZWFzZSBkZWxldGUgb3IgcmVuYW1lIGl0LCBvciBhZGp1c3QgeW91ciAkUEFUSCBzZXR0aW5nLlxuIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyAuLi9fdmltcmMgb3IgLi4vLnZpbXJjIGZpbGUuCisgICAgICovCisgICAgc3RyY3B5KG9sZHZpbXJjLCBpbnN0YWxsZGlyKTsKKyAgICBzdHJjcHkob2xkdmltcmMgKyBydW50aW1laWR4LCAiX3ZpbXJjIik7CisgICAgaWYgKChmZCA9IGZvcGVuKG9sZHZpbXJjLCAiciIpKSA9PSBOVUxMKQorICAgIHsKKwlzdHJjcHkob2xkdmltcmMgKyBydW50aW1laWR4LCAidmltcmN+MSIpOyAvKiBzaG9ydCB2ZXJzaW9uIG9mIC52aW1yYyAqLworCWlmICgoZmQgPSBmb3BlbihvbGR2aW1yYywgInIiKSkgPT0gTlVMTCkKKwl7CisJICAgIHN0cmNweShvbGR2aW1yYyArIHJ1bnRpbWVpZHgsICIudmltcmMiKTsKKwkgICAgZmQgPSBmb3BlbihvbGR2aW1yYywgInIiKTsKKwl9CisgICAgfQorICAgIGlmIChmZCAhPSBOVUxMKQorCWZjbG9zZShmZCk7CisgICAgZWxzZQorCSpvbGR2aW1yYyA9IE5VTDsKKworI2lmIDAgLyogY3VycmVudGx5IG5vdCB1c2VkICovCisgICAgLyoKKyAgICAgKiBHZXQgZGVmYXVsdCBob21lIGRpcmVjdG9yeS4KKyAgICAgKiBQcmVmZXIgJEhPTUUgaWYgaXQncyBzZXQuICBGb3IgV2luIE5UIHVzZSAkSE9NRURSSVZFIGFuZCAkSE9NRVBBVEguCisgICAgICogT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhICJjOiIgZHJpdmUgdXNlIHRoYXQuCisgICAgICovCisgICAgcCA9IGdldGVudigiSE9NRSIpOworICAgIGlmIChwICE9IE5VTEwgJiYgKnAgIT0gTlVMICYmIHN0cmxlbihwKSA8IEJVRlNJWkUpCisJc3RyY3B5KGhvbWVkaXIsIHApOworICAgIGVsc2UKKyAgICB7CisJcCA9IGdldGVudigiSE9NRURSSVZFIik7CisJaWYgKHAgIT0gTlVMTCAmJiAqcCAhPSBOVUwgJiYgc3RybGVuKHApICsgMiA8IEJVRlNJWkUpCisJeworCSAgICBzdHJjcHkoaG9tZWRpciwgcCk7CisJICAgIHAgPSBnZXRlbnYoIkhPTUVQQVRIIik7CisJICAgIGlmIChwICE9IE5VTEwgJiYgKnAgIT0gTlVMICYmIHN0cmxlbihob21lZGlyKSArIHN0cmxlbihwKSA8IEJVRlNJWkUpCisJCXN0cmNhdChob21lZGlyLCBwKTsKKwkgICAgZWxzZQorCQlzdHJjYXQoaG9tZWRpciwgIlxcIik7CisJfQorCWVsc2UKKwl7CisJICAgIHN0cnVjdCBzdGF0IHN0OworCisJICAgIGlmIChzdGF0KCJjOlxcIiwgJnN0KSA9PSAwKQorCQlzdHJjcHkoaG9tZWRpciwgImM6XFwiKTsKKwkgICAgZWxzZQorCQkqaG9tZWRpciA9IE5VTDsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBBZGQgYSBkdW1teSBjaG9pY2UgdG8gYXZvaWQgdGhhdCB0aGUgbnVtYmVyaW5nIGNoYW5nZXMgZGVwZW5kaW5nIG9uIGl0ZW1zCisgKiBpbiB0aGUgZW52aXJvbm1lbnQuICBUaGUgdXNlciBtYXkgdHlwZSBhIG51bWJlciBoZSByZW1lbWJlcmVkIHdpdGhvdXQKKyAqIGxvb2tpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYWRkX2R1bW15X2Nob2ljZSh2b2lkKQoreworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmFjdGl2ZSA9IDA7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmNoYW5nZWZ1bmMgPSBOVUxMOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisgICAgKytjaG9pY2VfY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3R1ZmYgZm9yIGNyZWF0aW5nIHRoZSBiYXRjaCBmaWxlcy4KKyAqLworCisvKgorICogSW5zdGFsbCB0aGUgdmltLmJhdCwgZ3ZpbS5iYXQsIGV0Yy4gZmlsZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zdGFsbF9iYXRfY2hvaWNlKGludCBpZHgpCit7CisgICAgY2hhcgkqYmF0cGF0aCA9IHRhcmdldHNbY2hvaWNlc1tpZHhdLmFyZ10uYmF0cGF0aDsKKyAgICBjaGFyCSpvbGRuYW1lID0gdGFyZ2V0c1tjaG9pY2VzW2lkeF0uYXJnXS5vbGRiYXQ7CisgICAgY2hhcgkqZXhlbmFtZSA9IHRhcmdldHNbY2hvaWNlc1tpZHhdLmFyZ10uZXhlbmFtZWFyZzsKKyAgICBjaGFyCSp2aW1hcmcgPSB0YXJnZXRzW2Nob2ljZXNbaWR4XS5hcmddLmV4ZWFyZzsKKyAgICBGSUxFCSpmZDsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKworICAgIGlmICgqYmF0cGF0aCAhPSBOVUwpCisgICAgeworCWZkID0gZm9wZW4oYmF0cGF0aCwgInciKTsKKwlpZiAoZmQgPT0gTlVMTCkKKwkgICAgcHJpbnRmKCJcbkVSUk9SOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmcuXG4iLCBiYXRwYXRoKTsKKwllbHNlCisJeworCSAgICBuZWVkX3VuaW5zdGFsbF9lbnRyeSA9IDE7CisKKwkgICAgZnByaW50ZihmZCwgIkBlY2hvIG9mZlxuIik7CisJICAgIGZwcmludGYoZmQsICJyZW0gLS0gUnVuIFZpbSAtLVxuXG4iKTsKKworCSAgICBzdHJjcHkoYnVmLCBpbnN0YWxsZGlyKTsKKwkgICAgYnVmW3J1bnRpbWVpZHggLSAxXSA9IE5VTDsKKwkgICAgLyogRG9uJ3QgdXNlIGRvdWJsZSBxdW90ZXMgZm9yIHRoZSB2YWx1ZSBoZXJlLCBhbHNvIHdoZW4gYnVmCisJICAgICAqIGNvbnRhaW5zIGEgc3BhY2UuICBUaGUgcXVvdGVzIHdvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB2YWx1ZQorCSAgICAgKiBmb3IgTVNET1MgYW5kIE5ULiAqLworCSAgICBmcHJpbnRmKGZkLCAic2V0IFZJTT0lc1xuXG4iLCBidWYpOworCisJICAgIHN0cmNweShidWYsIGluc3RhbGxkaXIgKyBydW50aW1laWR4KTsKKwkgICAgYWRkX3BhdGhzZXAoYnVmKTsKKwkgICAgc3RyY2F0KGJ1ZiwgZXhlbmFtZSk7CisKKwkgICAgLyogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIGV4ZWN1dGFibGUgY291bGQgbm90IGJlIGZvdW5kLiAqLworCSAgICBmcHJpbnRmKGZkLCAiaWYgZXhpc3QgXCIlJVZJTSUlXFwlc1wiIGdvdG8gaGF2ZXZpbVxuIiwgYnVmKTsKKwkgICAgZnByaW50ZihmZCwgImVjaG8gXCIlJVZJTSUlXFwlc1wiIG5vdCBmb3VuZFxuIiwgYnVmKTsKKwkgICAgZnByaW50ZihmZCwgImdvdG8gZW9mXG5cbiIpOworCSAgICBmcHJpbnRmKGZkLCAiOmhhdmV2aW1cbiIpOworCisJICAgIGZwcmludGYoZmQsICJyZW0gY29sbGVjdCB0aGUgYXJndW1lbnRzIGluIFZJTUFSR1MgZm9yIFdpbjk1XG4iKTsKKwkgICAgZnByaW50ZihmZCwgInNldCBWSU1BUkdTPVxuIik7CisJICAgIGlmICgqZXhlbmFtZSA9PSAnZycpCisJCWZwcmludGYoZmQsICJzZXQgVklNTk9GT1JLPVxuIik7CisJICAgIGZwcmludGYoZmQsICI6bG9vcHN0YXJ0XG4iKTsKKwkgICAgZnByaW50ZihmZCwgImlmIC4lJTE9PS4gZ290byBsb29wZW5kXG4iKTsKKwkgICAgaWYgKCpleGVuYW1lID09ICdnJykKKwkgICAgeworCQlmcHJpbnRmKGZkLCAiaWYgTk9UIC4lJTE9PS4tZiBnb3RvIG5vZm9ya2FyZ1xuIik7CisJCWZwcmludGYoZmQsICJzZXQgVklNTk9GT1JLPTFcbiIpOworCQlmcHJpbnRmKGZkLCAiOm5vZm9ya2FyZ1xuIik7CisJICAgIH0KKwkgICAgZnByaW50ZihmZCwgInNldCBWSU1BUkdTPSUlVklNQVJHUyUlICUlMVxuIik7CisJICAgIGZwcmludGYoZmQsICJzaGlmdFxuIik7CisJICAgIGZwcmludGYoZmQsICJnb3RvIGxvb3BzdGFydFxuXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIjpsb29wZW5kXG4iKTsKKworCSAgICBmcHJpbnRmKGZkLCAiaWYgLiUlT1MlJT09LldpbmRvd3NfTlQgZ290byBudGFjdGlvblxuXG4iKTsKKworCSAgICAvKiBGb3IgZ3ZpbS5leGUgdXNlICJzdGFydCIgdG8gYXZvaWQgdGhhdCB0aGUgY29uc29sZSB3aW5kb3cgc3RheXMKKwkgICAgICogb3Blbi4gKi8KKwkgICAgaWYgKCpleGVuYW1lID09ICdnJykKKwkgICAgeworCQlmcHJpbnRmKGZkLCAiaWYgLiUlVklNTk9GT1JLJSU9PS4xIGdvdG8gbm9mb3JrXG4iKTsKKwkJZnByaW50ZihmZCwgInN0YXJ0ICIpOworCSAgICB9CisKKwkgICAgLyogRG8gdXNlIHF1b3RlcyBoZXJlIGlmIHRoZSBwYXRoIGluY2x1ZGVzIGEgc3BhY2UuICovCisJICAgIGlmIChzdHJjaHIoaW5zdGFsbGRpciwgJyAnKSAhPSBOVUxMKQorCQlmcHJpbnRmKGZkLCAiXCIlJVZJTSUlXFwlc1wiICVzICUlVklNQVJHUyUlXG4iLCBidWYsIHZpbWFyZyk7CisJICAgIGVsc2UKKwkJZnByaW50ZihmZCwgIiUlVklNJSVcXCVzICVzICUlVklNQVJHUyUlXG4iLCBidWYsIHZpbWFyZyk7CisJICAgIGZwcmludGYoZmQsICJnb3RvIGVvZlxuXG4iKTsKKworCSAgICBpZiAoKmV4ZW5hbWUgPT0gJ2cnKQorCSAgICB7CisJCWZwcmludGYoZmQsICI6bm9mb3JrXG4iKTsKKwkJZnByaW50ZihmZCwgInN0YXJ0IC93ICIpOworCQkvKiBEbyB1c2UgcXVvdGVzIGhlcmUgaWYgdGhlIHBhdGggaW5jbHVkZXMgYSBzcGFjZS4gKi8KKwkJaWYgKHN0cmNocihpbnN0YWxsZGlyLCAnICcpICE9IE5VTEwpCisJCSAgICBmcHJpbnRmKGZkLCAiXCIlJVZJTSUlXFwlc1wiICVzICUlVklNQVJHUyUlXG4iLCBidWYsCisJCQkJCQkJCSAgICAgIHZpbWFyZyk7CisJCWVsc2UKKwkJICAgIGZwcmludGYoZmQsICIlJVZJTSUlXFwlcyAlcyAlJVZJTUFSR1MlJVxuIiwgYnVmLCB2aW1hcmcpOworCQlmcHJpbnRmKGZkLCAiZ290byBlb2ZcblxuIik7CisJICAgIH0KKworCSAgICBmcHJpbnRmKGZkLCAiOm50YWN0aW9uXG4iKTsKKwkgICAgZnByaW50ZihmZCwgInJlbSBmb3IgV2luTlQgd2UgY2FuIHVzZSAlJSpcbiIpOworCisJICAgIC8qIEZvciBndmltLmV4ZSB1c2UgInN0YXJ0IC9iIiB0byBhdm9pZCB0aGF0IHRoZSBjb25zb2xlIHdpbmRvdworCSAgICAgKiBzdGF5cyBvcGVuLiAqLworCSAgICBpZiAoKmV4ZW5hbWUgPT0gJ2cnKQorCSAgICB7CisJCWZwcmludGYoZmQsICJpZiAuJSVWSU1OT0ZPUkslJT09LjEgZ290byBub2ZvcmtudFxuIik7CisJCWZwcmludGYoZmQsICJzdGFydCBcImR1bW15XCIgL2IgIik7CisJICAgIH0KKworCSAgICAvKiBEbyB1c2UgcXVvdGVzIGhlcmUgaWYgdGhlIHBhdGggaW5jbHVkZXMgYSBzcGFjZS4gKi8KKwkgICAgaWYgKHN0cmNocihpbnN0YWxsZGlyLCAnICcpICE9IE5VTEwpCisJCWZwcmludGYoZmQsICJcIiUlVklNJSVcXCVzXCIgJXMgJSUqXG4iLCBidWYsIHZpbWFyZyk7CisJICAgIGVsc2UKKwkJZnByaW50ZihmZCwgIiUlVklNJSVcXCVzICVzICUlKlxuIiwgYnVmLCB2aW1hcmcpOworCSAgICBmcHJpbnRmKGZkLCAiZ290byBlb2ZcblxuIik7CisKKwkgICAgaWYgKCpleGVuYW1lID09ICdnJykKKwkgICAgeworCQlmcHJpbnRmKGZkLCAiOm5vZm9ya250XG4iKTsKKwkJZnByaW50ZihmZCwgInN0YXJ0IFwiZHVtbXlcIiAvYiAvd2FpdCAiKTsKKwkJLyogRG8gdXNlIHF1b3RlcyBoZXJlIGlmIHRoZSBwYXRoIGluY2x1ZGVzIGEgc3BhY2UuICovCisJCWlmIChzdHJjaHIoaW5zdGFsbGRpciwgJyAnKSAhPSBOVUxMKQorCQkgICAgZnByaW50ZihmZCwgIlwiJSVWSU0lJVxcJXNcIiAlcyAlJSpcbiIsIGJ1ZiwgdmltYXJnKTsKKwkJZWxzZQorCQkgICAgZnByaW50ZihmZCwgIiUlVklNJSVcXCVzICVzICUlKlxuIiwgYnVmLCB2aW1hcmcpOworCSAgICB9CisKKwkgICAgZnByaW50ZihmZCwgIlxuOmVvZlxuIik7CisJICAgIGZwcmludGYoZmQsICJzZXQgVklNQVJHUz1cbiIpOworCSAgICBpZiAoKmV4ZW5hbWUgPT0gJ2cnKQorCQlmcHJpbnRmKGZkLCAic2V0IFZJTU5PRk9SSz1cbiIpOworCisJICAgIGZjbG9zZShmZCk7CisJICAgIHByaW50ZigiJXMgaGFzIGJlZW4gJXNcbiIsIGJhdHBhdGgsCisJCQkJIG9sZG5hbWUgPT0gTlVMTCA/ICJjcmVhdGVkIiA6ICJvdmVyd3JpdHRlbiIpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBNYWtlIHRoZSB0ZXh0IHN0cmluZyBmb3IgY2hvaWNlICJpZHgiLgorICogVGhlIGZvcm1hdCAiZm10IiBpcyBtdXN0IGhhdmUgb25lICVzIGl0ZW0sIHdoaWNoICJhcmciIGlzIHVzZWQgZm9yLgorICovCisgICAgc3RhdGljIHZvaWQKK2FsbG9jX3RleHQoaW50IGlkeCwgY2hhciAqZm10LCBjaGFyICphcmcpCit7CisgICAgaWYgKGNob2ljZXNbaWR4XS50ZXh0ICE9IE5VTEwpCisJZnJlZShjaG9pY2VzW2lkeF0udGV4dCk7CisKKyAgICBjaG9pY2VzW2lkeF0udGV4dCA9IGFsbG9jKChpbnQpKHN0cmxlbihmbXQpICsgc3RybGVuKGFyZykpIC0gMSk7CisgICAgc3ByaW50ZihjaG9pY2VzW2lkeF0udGV4dCwgZm10LCBhcmcpOworfQorCisvKgorICogVG9nZ2xlIHRoZSAiT3ZlcndyaXRlIC4uLi92aW0uYmF0IiB0byAiRG9uJ3Qgb3ZlcndyaXRlIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCit0b2dnbGVfYmF0X2Nob2ljZShpbnQgaWR4KQoreworICAgIGNoYXIJKmJhdG5hbWUgPSB0YXJnZXRzW2Nob2ljZXNbaWR4XS5hcmddLmJhdHBhdGg7CisgICAgY2hhcgkqb2xkbmFtZSA9IHRhcmdldHNbY2hvaWNlc1tpZHhdLmFyZ10ub2xkYmF0OworCisgICAgaWYgKCpiYXRuYW1lID09IE5VTCkKKyAgICB7CisJYWxsb2NfdGV4dChpZHgsICIgICAgT3ZlcndyaXRlICVzIiwgb2xkbmFtZSk7CisJc3RyY3B5KGJhdG5hbWUsIG9sZG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWFsbG9jX3RleHQoaWR4LCAiICAgIERvIE5PVCBvdmVyd3JpdGUgJXMiLCBvbGRuYW1lKTsKKwkqYmF0bmFtZSA9IE5VTDsKKyAgICB9Cit9CisKKy8qCisgKiBEbyBzb21lIHdvcmsgZm9yIGEgYmF0Y2ggZmlsZSBlbnRyeTogQXBwZW5kIHRoZSBiYXRjaCBmaWxlIG5hbWUgdG8gdGhlIHBhdGgKKyAqIGFuZCBzZXQgdGhlIHRleHQgZm9yIHRoZSBjaG9pY2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0X2JhdF90ZXh0KGludCBpZHgsIGNoYXIgKmJhdHBhdGgsIGNoYXIgKm5hbWUpCit7CisgICAgc3RyY2F0KGJhdHBhdGgsIG5hbWUpOworCisgICAgYWxsb2NfdGV4dChpZHgsICIgICAgQ3JlYXRlICVzIiwgYmF0cGF0aCk7Cit9CisKKy8qCisgKiBTZWxlY3QgYSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGJhdGNoIGZpbGUgbGluZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGFuZ2VfYmF0X2Nob2ljZShpbnQgaWR4KQoreworICAgIGNoYXIJKnBhdGg7CisgICAgY2hhcgkqYmF0cGF0aDsKKyAgICBjaGFyCSpuYW1lOworICAgIGludAkJbjsKKyAgICBjaGFyCSpzOworICAgIGNoYXIJKnA7CisgICAgaW50CQljb3VudDsKKyAgICBjaGFyCSoqbmFtZXMgPSBOVUxMOworICAgIGludAkJaTsKKyAgICBpbnQJCXRhcmdldCA9IGNob2ljZXNbaWR4XS5hcmc7CisKKyAgICBuYW1lID0gdGFyZ2V0c1t0YXJnZXRdLmJhdG5hbWU7CisgICAgYmF0cGF0aCA9IHRhcmdldHNbdGFyZ2V0XS5iYXRwYXRoOworCisgICAgcGF0aCA9IGdldGVudigiUEFUSCIpOworICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgeworCXByaW50ZigiXG5FUlJPUjogVGhlIHZhcmlhYmxlICRQQVRIIGlzIG5vdCBzZXRcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGZpcnN0IHJvdW5kOiBjb3VudCBudW1iZXIgb2YgbmFtZXMgaW4gcGF0aDsKKyAgICAgKiBzZWNvbmQgcm91bmQ6IHNhdmUgbmFtZXMgdG8gbmFtZXNbXS4KKyAgICAgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwljb3VudCA9IDE7CisJZm9yIChwID0gcGF0aDsgKnA7ICkKKwl7CisJICAgIHMgPSBzdHJjaHIocCwgJzsnKTsKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkJcyA9IHAgKyBzdHJsZW4ocCk7CisJICAgIGlmIChuYW1lcyAhPSBOVUxMKQorCSAgICB7CisJCW5hbWVzW2NvdW50XSA9IGFsbG9jKChpbnQpKHMgLSBwKSArIDEpOworCQlzdHJuY3B5KG5hbWVzW2NvdW50XSwgcCwgcyAtIHApOworCQluYW1lc1tjb3VudF1bcyAtIHBdID0gTlVMOworCSAgICB9CisJICAgICsrY291bnQ7CisJICAgIHAgPSBzOworCSAgICBpZiAoKnAgIT0gTlVMKQorCQkrK3A7CisJfQorCWlmIChuYW1lcyAhPSBOVUxMKQorCSAgICBicmVhazsKKwluYW1lcyA9IGFsbG9jKChpbnQpKGNvdW50ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisgICAgfQorICAgIG5hbWVzWzBdID0gYWxsb2MoNTApOworICAgIHNwcmludGYobmFtZXNbMF0sICJTZWxlY3QgZGlyZWN0b3J5IHRvIGNyZWF0ZSAlcyBpbjoiLCBuYW1lKTsKKyAgICBuYW1lc1tjb3VudF0gPSBhbGxvYyg1MCk7CisgICAgaWYgKGNob2ljZXNbaWR4XS5hcmcgPT0gMCkKKwlzcHJpbnRmKG5hbWVzW2NvdW50XSwgIkRvIG5vdCBjcmVhdGUgYW55IC5iYXQgZmlsZS4iKTsKKyAgICBlbHNlCisJc3ByaW50ZihuYW1lc1tjb3VudF0sICJEbyBub3QgY3JlYXRlIGEgJXMgZmlsZS4iLCBuYW1lKTsKKyAgICBuID0gZ2V0X2Nob2ljZShuYW1lcywgY291bnQgKyAxKTsKKworICAgIGlmIChuID09IGNvdW50KQorICAgIHsKKwkvKiBTZWxlY3RlZCBsYXN0IGl0ZW0sIGRvbid0IGNyZWF0ZSBiYXQgZmlsZS4gKi8KKwkqYmF0cGF0aCA9IE5VTDsKKwlpZiAoY2hvaWNlc1tpZHhdLmFyZyAhPSAwKQorCSAgICBhbGxvY190ZXh0KGlkeCwgIiAgICBEbyBOT1QgY3JlYXRlICVzIiwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogU2VsZWN0ZWQgb25lIG9mIHRoZSBwYXRocy4gIEZvciB0aGUgZmlyc3QgaXRlbSBvbmx5IGtlZXAgdGhlIHBhdGgsCisJICogZm9yIHRoZSBvdGhlcnMgYXBwZW5kIHRoZSBiYXRjaCBmaWxlIG5hbWUuICovCisJc3RyY3B5KGJhdHBhdGgsIG5hbWVzW25dKTsKKwlhZGRfcGF0aHNlcChiYXRwYXRoKTsKKwlpZiAoY2hvaWNlc1tpZHhdLmFyZyAhPSAwKQorCSAgICBzZXRfYmF0X3RleHQoaWR4LCBiYXRwYXRoLCBuYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGNvdW50OyArK2kpCisJZnJlZShuYW1lc1tpXSk7CisgICAgZnJlZShuYW1lcyk7Cit9CisKK2NoYXIgKmJhdF90ZXh0X3llcyA9ICJJbnN0YWxsIC5iYXQgZmlsZXMgdG8gdXNlIFZpbSBhdCB0aGUgY29tbWFuZCBsaW5lOiI7CitjaGFyICpiYXRfdGV4dF9ubyA9ICJkbyBOT1QgaW5zdGFsbCAuYmF0IGZpbGVzIHRvIHVzZSBWaW0gYXQgdGhlIGNvbW1hbmQgbGluZSI7CisKKyAgICBzdGF0aWMgdm9pZAorY2hhbmdlX21haW5fYmF0X2Nob2ljZShpbnQgaWR4KQoreworICAgIGludAkJaTsKKworICAgIC8qIGxldCB0aGUgdXNlciBzZWxlY3QgYSBkZWZhdWx0IGRpcmVjdG9yeSBvciBOT05FICovCisgICAgY2hhbmdlX2JhdF9jaG9pY2UoaWR4KTsKKworICAgIGlmICh0YXJnZXRzWzBdLmJhdHBhdGhbMF0gIT0gTlVMKQorCWNob2ljZXNbaWR4XS50ZXh0ID0gYmF0X3RleHRfeWVzOworICAgIGVsc2UKKwljaG9pY2VzW2lkeF0udGV4dCA9IGJhdF90ZXh0X25vOworCisgICAgLyogdXBkYXRlIHRoZSBpbmRpdmlkdWFsIGJhdGNoIGZpbGUgc2VsZWN0aW9ucyAqLworICAgIGZvciAoaSA9IDE7IGkgPCBUQVJHRVRfQ09VTlQ7ICsraSkKKyAgICB7CisJLyogT25seSBtYWtlIGl0IGFjdGl2ZSB3aGVuIHRoZSBmaXJzdCBpdGVtIGhhcyBhIHBhdGggYW5kIHRoZSB2aW0uZXhlCisJICogb3IgZ3ZpbS5leGUgZXhpc3RzICh0aGVyZSBpcyBhIGNoYW5nZWZ1bmMgdGhlbikuICovCisJaWYgKHRhcmdldHNbMF0uYmF0cGF0aFswXSAhPSBOVUwKKwkJJiYgY2hvaWNlc1tpZHggKyBpXS5jaGFuZ2VmdW5jICE9IE5VTEwpCisJeworCSAgICBjaG9pY2VzW2lkeCArIGldLmFjdGl2ZSA9IDE7CisJICAgIGlmIChjaG9pY2VzW2lkeCArIGldLmNoYW5nZWZ1bmMgPT0gY2hhbmdlX2JhdF9jaG9pY2UKKwkJICAgICYmIHRhcmdldHNbaV0uYmF0cGF0aFswXSAhPSBOVUwpCisJICAgIHsKKwkJc3RyY3B5KHRhcmdldHNbaV0uYmF0cGF0aCwgdGFyZ2V0c1swXS5iYXRwYXRoKTsKKwkJc2V0X2JhdF90ZXh0KGlkeCArIGksIHRhcmdldHNbaV0uYmF0cGF0aCwgdGFyZ2V0c1tpXS5iYXRuYW1lKTsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIGNob2ljZXNbaWR4ICsgaV0uYWN0aXZlID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgY2hvaWNlIGZvciBjcmVhdGluZyBhIGJhdGNoIGZpbGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdF9iYXRfY2hvaWNlKGludCB0YXJnZXQpCit7CisgICAgY2hhcgkqYmF0cGF0aCA9IHRhcmdldHNbdGFyZ2V0XS5iYXRwYXRoOworICAgIGNoYXIJKm9sZGJhdCA9IHRhcmdldHNbdGFyZ2V0XS5vbGRiYXQ7CisgICAgY2hhcgkqcDsKKyAgICBpbnQJCWk7CisKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYXJnID0gdGFyZ2V0OworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IGluc3RhbGxfYmF0X2Nob2ljZTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gMTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0udGV4dCA9IE5VTEw7CS8qIHdpbGwgYmUgc2V0IGJlbG93ICovCisgICAgaWYgKG9sZGJhdCAhPSBOVUxMKQorICAgIHsKKwkvKiBBIFtnXXZpbS5iYXQgZXhpc3RzOiBPbmx5IGNob2ljZSBpcyB0byBvdmVyd3JpdGUgaXQgb3Igbm90LiAqLworCWNob2ljZXNbY2hvaWNlX2NvdW50XS5jaGFuZ2VmdW5jID0gdG9nZ2xlX2JhdF9jaG9pY2U7CisJKmJhdHBhdGggPSBOVUw7CisJdG9nZ2xlX2JhdF9jaG9pY2UoY2hvaWNlX2NvdW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoZGVmYXVsdF9iYXRfZGlyICE9IE5VTEwpCisJICAgIC8qIFByZWZlciB1c2luZyB0aGUgc2FtZSBwYXRoIGFzIGFuIGV4aXN0aW5nIC5iYXQgZmlsZS4gKi8KKwkgICAgc3RyY3B5KGJhdHBhdGgsIGRlZmF1bHRfYmF0X2Rpcik7CisJZWxzZQorCXsKKwkgICAgLyogTm8gW2dddmltLmJhdCBleGlzdHM6IFdyaXRlIGl0IHRvIGEgZGlyZWN0b3J5IGluICRQQVRILiAgVXNlCisJICAgICAqICRXSU5ESVIgYnkgZGVmYXVsdCwgaWYgaXQncyBlbXB0eSB0aGUgZmlyc3QgaXRlbSBpbiAkUEFUSC4gKi8KKwkgICAgcCA9IGdldGVudigiV0lORElSIik7CisJICAgIGlmIChwICE9IE5VTEwgJiYgKnAgIT0gTlVMKQorCQlzdHJjcHkoYmF0cGF0aCwgcCk7CisJICAgIGVsc2UKKwkgICAgeworCQlwID0gZ2V0ZW52KCJQQVRIIik7CisJCWlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQkJLyogImNhbm5vdCBoYXBwZW4iICovCisJCSAgICBzdHJjcHkoYmF0cGF0aCwgIkM6L1dpbmRvd3MiKTsKKwkJZWxzZQorCQl7CisJCSAgICBpID0gMDsKKwkJICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnAgIT0gJzsnKQorCQkJYmF0cGF0aFtpKytdID0gKnArKzsKKwkJICAgIGJhdHBhdGhbaV0gPSBOVUw7CisJCX0KKwkgICAgfQorCX0KKwlhZGRfcGF0aHNlcChiYXRwYXRoKTsKKwlzZXRfYmF0X3RleHQoY2hvaWNlX2NvdW50LCBiYXRwYXRoLCB0YXJnZXRzW3RhcmdldF0uYmF0bmFtZSk7CisKKwljaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IGNoYW5nZV9iYXRfY2hvaWNlOworICAgIH0KKyAgICArK2Nob2ljZV9jb3VudDsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgY2hvaWNlcyBmb3IgaW5zdGFsbGluZyAuYmF0IGZpbGVzLgorICogRm9yIHRoZXNlIGl0ZW1zICJhcmciIGlzIHRoZSBpbmRleCBpbiB0YXJnZXRzW10uCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdF9iYXRfY2hvaWNlcyh2b2lkKQoreworICAgIGludAkJaTsKKworICAgIC8qIFRoZSBmaXJzdCBpdGVtIGlzIHVzZWQgdG8gc3dpdGNoIGluc3RhbGxpbmcgYmF0Y2ggZmlsZXMgb24vb2ZmIGFuZAorICAgICAqIHNldHRpbmcgdGhlIGRlZmF1bHQgcGF0aC4gKi8KKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0udGV4dCA9IGJhdF90ZXh0X3llczsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IGNoYW5nZV9tYWluX2JhdF9jaG9pY2U7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmluc3RhbGxmdW5jID0gTlVMTDsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gMTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYXJnID0gMDsKKyAgICArK2Nob2ljZV9jb3VudDsKKworICAgIC8qIEFkZCBpdGVtcyBmb3IgZWFjaCBiYXRjaCBmaWxlIHRhcmdldC4gIE9ubHkgdXNlZCB3aGVuIG5vdCBkaXNhYmxlZCBieQorICAgICAqIHRoZSBmaXJzdCBpdGVtLiAgV2hlbiBhIC5leGUgZXhpc3RzLCBkb24ndCBvZmZlciB0byBjcmVhdGUgYSAuYmF0LiAqLworICAgIGZvciAoaSA9IDE7IGkgPCBUQVJHRVRfQ09VTlQ7ICsraSkKKwlpZiAodGFyZ2V0c1tpXS5vbGRleGUgPT0gTlVMTAorCQkmJiAodGFyZ2V0c1tpXS5leGVuYW1lYXJnWzBdID09ICdnJyA/IGhhc19ndmltIDogaGFzX3ZpbSkpCisJICAgIGluaXRfYmF0X2Nob2ljZShpKTsKKwllbHNlCisJICAgIGFkZF9kdW1teV9jaG9pY2UoKTsKK30KKworLyoKKyAqIEluc3RhbGwgdGhlIHZpbXJjIGZpbGUuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitpbnN0YWxsX3ZpbXJjKGludCBpZHgpCit7CisgICAgRklMRQkqZmQsICp0ZmQ7CisgICAgY2hhcgkqZm5hbWU7CisgICAgY2hhcgkqcDsKKworICAgIC8qIElmIGFuIG9sZCB2aW1yYyBmaWxlIGV4aXN0cywgb3ZlcndyaXRlIGl0LgorICAgICAqIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgb25lLiAqLworICAgIGlmICgqb2xkdmltcmMgIT0gTlVMKQorCWZuYW1lID0gb2xkdmltcmM7CisgICAgZWxzZQorCWZuYW1lID0gdmltcmM7CisKKyAgICBmZCA9IGZvcGVuKGZuYW1lLCAidyIpOworICAgIGlmIChmZCA9PSBOVUxMKQorICAgIHsKKwlwcmludGYoIlxuRVJST1I6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZy5cbiIsIGZuYW1lKTsKKwlyZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAoY29tcGF0X2Nob2ljZSkKKyAgICB7CisJY2FzZSBjb21wYXRfdmk6CisJCSAgICBmcHJpbnRmKGZkLCAic2V0IGNvbXBhdGlibGVcbiIpOworCQkgICAgYnJlYWs7CisJY2FzZSBjb21wYXRfc29tZV9lbmhhbmNlbWVudHM6CisJCSAgICBmcHJpbnRmKGZkLCAic2V0IG5vY29tcGF0aWJsZVxuIik7CisJCSAgICBicmVhazsKKwljYXNlIGNvbXBhdF9hbGxfZW5oYW5jZW1lbnRzOgorCQkgICAgZnByaW50ZihmZCwgInNldCBub2NvbXBhdGlibGVcbiIpOworCQkgICAgZnByaW50ZihmZCwgInNvdXJjZSAkVklNUlVOVElNRS92aW1yY19leGFtcGxlLnZpbVxuIik7CisJCSAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChyZW1hcF9jaG9pY2UpCisgICAgeworCWNhc2UgcmVtYXBfbm86CisJCSAgICBicmVhazsKKwljYXNlIHJlbWFwX3dpbjoKKwkJICAgIGZwcmludGYoZmQsICJzb3VyY2UgJFZJTVJVTlRJTUUvbXN3aW4udmltXG4iKTsKKwkJICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKG1vdXNlX2Nob2ljZSkKKyAgICB7CisJY2FzZSBtb3VzZV94dGVybToKKwkJICAgIGZwcmludGYoZmQsICJiZWhhdmUgeHRlcm1cbiIpOworCQkgICAgYnJlYWs7CisJY2FzZSBtb3VzZV9tc3dpbjoKKwkJICAgIGZwcmludGYoZmQsICJiZWhhdmUgbXN3aW5cbiIpOworCQkgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgodGZkID0gZm9wZW4oImRpZmYuZXhlIiwgInIiKSkgIT0gTlVMTCkKKyAgICB7CisJLyogVXNlIHRoZSBkaWZmLmV4ZSB0aGF0IGNvbWVzIHdpdGggdGhlIHNlbGYtZXh0cmFjdGluZyBndmltLmV4ZS4gKi8KKwlmY2xvc2UodGZkKTsKKwlmcHJpbnRmKGZkLCAiXG4iKTsKKwlmcHJpbnRmKGZkLCAic2V0IGRpZmZleHByPU15RGlmZigpXG4iKTsKKwlmcHJpbnRmKGZkLCAiZnVuY3Rpb24gTXlEaWZmKClcbiIpOworCWZwcmludGYoZmQsICIgIGxldCBvcHQgPSAnLWEgLS1iaW5hcnkgJ1xuIik7CisJZnByaW50ZihmZCwgIiAgaWYgJmRpZmZvcHQgPX4gJ2ljYXNlJyB8IGxldCBvcHQgPSBvcHQgLiAnLWkgJyB8IGVuZGlmXG4iKTsKKwlmcHJpbnRmKGZkLCAiICBpZiAmZGlmZm9wdCA9fiAnaXdoaXRlJyB8IGxldCBvcHQgPSBvcHQgLiAnLWIgJyB8IGVuZGlmXG4iKTsKKwkvKiBVc2UgcXVvdGVzIG9ubHkgd2hlbiBuZWVkZWQsIHRoZXkgbWF5IGNhdXNlIHRyb3VibGUuICovCisJZnByaW50ZihmZCwgIiAgbGV0IGFyZzEgPSB2OmZuYW1lX2luXG4iKTsKKwlmcHJpbnRmKGZkLCAiICBpZiBhcmcxID1+ICcgJyB8IGxldCBhcmcxID0gJ1wiJyAuIGFyZzEgLiAnXCInIHwgZW5kaWZcbiIpOworCWZwcmludGYoZmQsICIgIGxldCBhcmcyID0gdjpmbmFtZV9uZXdcbiIpOworCWZwcmludGYoZmQsICIgIGlmIGFyZzIgPX4gJyAnIHwgbGV0IGFyZzIgPSAnXCInIC4gYXJnMiAuICdcIicgfCBlbmRpZlxuIik7CisJZnByaW50ZihmZCwgIiAgbGV0IGFyZzMgPSB2OmZuYW1lX291dFxuIik7CisJZnByaW50ZihmZCwgIiAgaWYgYXJnMyA9fiAnICcgfCBsZXQgYXJnMyA9ICdcIicgLiBhcmczIC4gJ1wiJyB8IGVuZGlmXG4iKTsKKwlwID0gc3RyY2hyKGluc3RhbGxkaXIsICcgJyk7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIC8qIFRoZSBwYXRoIGhhcyBhIHNwYWNlLiAgV2hlbiB1c2luZyBjbWQuZXhlIChXaW4gTlQvMjAwMC9YUCkgcHV0CisJICAgICAqIHF1b3RlcyBhcm91bmQgdGhlIHdob2xlIGNvbW1hbmQgYW5kIGFyb3VuZCB0aGUgZGlmZiBjb21tYW5kLgorCSAgICAgKiBPdGhlcndpc2UgcHV0IGEgZG91YmxlIHF1b3RlIGp1c3QgYmVmb3JlIHRoZSBzcGFjZSBhbmQgYXQgdGhlCisJICAgICAqIGVuZCBvZiB0aGUgY29tbWFuZC4gIFB1dHRpbmcgcXVvdGVzIGFyb3VuZCB0aGUgd2hvbGUgdGhpbmcKKwkgICAgICogZG9lc24ndCB3b3JrIG9uIFdpbiA5NS85OC9NRS4gIFRoaXMgaXMgbW9zdGx5IGd1ZXNzZWQhICovCisJICAgIGZwcmludGYoZmQsICIgIGlmICZzaCA9fiAnXFw8Y21kJ1xuIik7CisJICAgIGZwcmludGYoZmQsICIgICAgc2lsZW50IGV4ZWN1dGUgJyFcIlwiJXNcXGRpZmZcIiAnIC4gb3B0IC4gYXJnMSAuICcgJyAuIGFyZzIgLiAnID4gJyAuIGFyZzMgLiAnXCInXG4iLCBpbnN0YWxsZGlyKTsKKwkgICAgZnByaW50ZihmZCwgIiAgZWxzZVxuIik7CisJICAgICpwID0gTlVMOworCSAgICBmcHJpbnRmKGZkLCAiICAgIHNpbGVudCBleGVjdXRlICchJXNcIiAlc1xcZGlmZlwiICcgLiBvcHQgLiBhcmcxIC4gJyAnIC4gYXJnMiAuICcgPiAnIC4gYXJnM1xuIiwgaW5zdGFsbGRpciwgcCArIDEpOworCSAgICAqcCA9ICcgJzsKKwkgICAgZnByaW50ZihmZCwgIiAgZW5kaWZcbiIpOworCX0KKwllbHNlCisJICAgIGZwcmludGYoZmQsICIgIHNpbGVudCBleGVjdXRlICchJXNcXGRpZmYgJyAuIG9wdCAuIGFyZzEgLiAnICcgLiBhcmcyIC4gJyA+ICcgLiBhcmczXG4iLCBpbnN0YWxsZGlyKTsKKwlmcHJpbnRmKGZkLCAiZW5kZnVuY3Rpb25cbiIpOworCWZwcmludGYoZmQsICJcbiIpOworICAgIH0KKyAgICBmY2xvc2UoZmQpOworICAgIHByaW50ZigiJXMgaGFzIGJlZW4gd3JpdHRlblxuIiwgZm5hbWUpOworfQorCisgICAgc3RhdGljIHZvaWQKK2NoYW5nZV92aW1yY19jaG9pY2UoaW50IGlkeCkKK3sKKyAgICBpZiAoY2hvaWNlc1tpZHhdLmluc3RhbGxmdW5jICE9IE5VTEwpCisgICAgeworCS8qIFN3aXRjaCB0byBOT1QgY2hhbmdlIG9yIGNyZWF0ZSBhIHZpbXJjIGZpbGUuICovCisJaWYgKCpvbGR2aW1yYyAhPSBOVUwpCisJICAgIGFsbG9jX3RleHQoaWR4LCAiRG8gTk9UIGNoYW5nZSBzdGFydHVwIGZpbGUgJXMiLCBvbGR2aW1yYyk7CisJZWxzZQorCSAgICBhbGxvY190ZXh0KGlkeCwgIkRvIE5PVCBjcmVhdGUgc3RhcnR1cCBmaWxlICVzIiwgdmltcmMpOworCWNob2ljZXNbaWR4XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisJY2hvaWNlc1tpZHggKyAxXS5hY3RpdmUgPSAwOworCWNob2ljZXNbaWR4ICsgMl0uYWN0aXZlID0gMDsKKwljaG9pY2VzW2lkeCArIDNdLmFjdGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogU3dpdGNoIHRvIGNoYW5nZSBvciBjcmVhdGUgYSB2aW1yYyBmaWxlLiAqLworCWlmICgqb2xkdmltcmMgIT0gTlVMKQorCSAgICBhbGxvY190ZXh0KGlkeCwgIk92ZXJ3cml0ZSBzdGFydHVwIGZpbGUgJXMgd2l0aDoiLCBvbGR2aW1yYyk7CisJZWxzZQorCSAgICBhbGxvY190ZXh0KGlkeCwgIkNyZWF0ZSBzdGFydHVwIGZpbGUgJXMgd2l0aDoiLCB2aW1yYyk7CisJY2hvaWNlc1tpZHhdLmluc3RhbGxmdW5jID0gaW5zdGFsbF92aW1yYzsKKwljaG9pY2VzW2lkeCArIDFdLmFjdGl2ZSA9IDE7CisJY2hvaWNlc1tpZHggKyAyXS5hY3RpdmUgPSAxOworCWNob2ljZXNbaWR4ICsgM10uYWN0aXZlID0gMTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGNob2ljZSBob3cgdG8gcnVuIFZpbS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGFuZ2VfcnVuX2Nob2ljZShpbnQgaWR4KQoreworICAgIGNvbXBhdF9jaG9pY2UgPSBnZXRfY2hvaWNlKGNvbXBhdF9jaG9pY2VzLCBUQUJMRV9TSVpFKGNvbXBhdF9jaG9pY2VzKSk7CisgICAgYWxsb2NfdGV4dChpZHgsIGNvbXBhdF90ZXh0LCBjb21wYXRfY2hvaWNlc1tjb21wYXRfY2hvaWNlXSk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGNob2ljZSBpZiBrZXlzIGFyZSB0byBiZSByZW1hcHBlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGFuZ2VfcmVtYXBfY2hvaWNlKGludCBpZHgpCit7CisgICAgcmVtYXBfY2hvaWNlID0gZ2V0X2Nob2ljZShyZW1hcF9jaG9pY2VzLCBUQUJMRV9TSVpFKHJlbWFwX2Nob2ljZXMpKTsKKyAgICBhbGxvY190ZXh0KGlkeCwgcmVtYXBfdGV4dCwgcmVtYXBfY2hvaWNlc1tyZW1hcF9jaG9pY2VdKTsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgY2hvaWNlIGhvdyB0byBzZWxlY3QgdGV4dC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGFuZ2VfbW91c2VfY2hvaWNlKGludCBpZHgpCit7CisgICAgbW91c2VfY2hvaWNlID0gZ2V0X2Nob2ljZShtb3VzZV9jaG9pY2VzLCBUQUJMRV9TSVpFKG1vdXNlX2Nob2ljZXMpKTsKKyAgICBhbGxvY190ZXh0KGlkeCwgbW91c2VfdGV4dCwgbW91c2VfY2hvaWNlc1ttb3VzZV9jaG9pY2VdKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitpbml0X3ZpbXJjX2Nob2ljZXModm9pZCkKK3sKKyAgICAvKiBzZXQgcGF0aCBmb3IgYSBuZXcgX3ZpbXJjIGZpbGUgKGFsc28gd2hlbiBub3QgdXNlZCkgKi8KKyAgICBzdHJjcHkodmltcmMsIGluc3RhbGxkaXIpOworICAgIHN0cmNweSh2aW1yYyArIHJ1bnRpbWVpZHgsICJfdmltcmMiKTsKKworICAgIC8qIFNldCBvcHBvc2l0ZSB2YWx1ZSBhbmQgdGhlbiB0b2dnbGUgaXQgYnkgY2FsbGluZyBjaGFuZ2VfdmltcmNfY2hvaWNlKCkgKi8KKyAgICBpZiAoKm9sZHZpbXJjID09IE5VTCkKKwljaG9pY2VzW2Nob2ljZV9jb3VudF0uaW5zdGFsbGZ1bmMgPSBOVUxMOworICAgIGVsc2UKKwljaG9pY2VzW2Nob2ljZV9jb3VudF0uaW5zdGFsbGZ1bmMgPSBpbnN0YWxsX3ZpbXJjOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS50ZXh0ID0gTlVMTDsKKyAgICBjaGFuZ2VfdmltcmNfY2hvaWNlKGNob2ljZV9jb3VudCk7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmNoYW5nZWZ1bmMgPSBjaGFuZ2VfdmltcmNfY2hvaWNlOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5hY3RpdmUgPSAxOworICAgICsrY2hvaWNlX2NvdW50OworCisgICAgLyogZGVmYXVsdCB3YXkgdG8gcnVuIFZpbSAqLworICAgIGFsbG9jX3RleHQoY2hvaWNlX2NvdW50LCBjb21wYXRfdGV4dCwgY29tcGF0X2Nob2ljZXNbY29tcGF0X2Nob2ljZV0pOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5jaGFuZ2VmdW5jID0gY2hhbmdlX3J1bl9jaG9pY2U7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmluc3RhbGxmdW5jID0gTlVMTDsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gKCpvbGR2aW1yYyA9PSBOVUwpOworICAgICsrY2hvaWNlX2NvdW50OworCisgICAgLyogV2hldGhlciB0byByZW1hcCBrZXlzICovCisgICAgYWxsb2NfdGV4dChjaG9pY2VfY291bnQsIHJlbWFwX3RleHQgLCByZW1hcF9jaG9pY2VzW3JlbWFwX2Nob2ljZV0pOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5jaGFuZ2VmdW5jID0gY2hhbmdlX3JlbWFwX2Nob2ljZTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uaW5zdGFsbGZ1bmMgPSBOVUxMOzsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gKCpvbGR2aW1yYyA9PSBOVUwpOworICAgICsrY2hvaWNlX2NvdW50OworCisgICAgLyogZGVmYXVsdCB3YXkgdG8gdXNlIHRoZSBtb3VzZSAqLworICAgIGFsbG9jX3RleHQoY2hvaWNlX2NvdW50LCBtb3VzZV90ZXh0LCBtb3VzZV9jaG9pY2VzW21vdXNlX2Nob2ljZV0pOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5jaGFuZ2VmdW5jID0gY2hhbmdlX21vdXNlX2Nob2ljZTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uaW5zdGFsbGZ1bmMgPSBOVUxMOzsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gKCpvbGR2aW1yYyA9PSBOVUwpOworICAgICsrY2hvaWNlX2NvdW50OworfQorCisvKgorICogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgcmVnaXN0cnk6CisgKiAtIHRvIGFkZCAiRWRpdCB3aXRoIFZpbSIgdG8gdGhlIGNvbnRleHQgKiBtZW51CisgKiAtIHRvIGFkZCBWaW0gdG8gdGhlICJPcGVuIHdpdGguLi4iIGxpc3QKKyAqIC0gdG8gdW5pbnN0YWxsIFZpbQorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zdGFsbF9yZWdpc3RyeSh2b2lkKQoreworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChVTklYX0xJTlQpCisgICAgRklMRQkqZmQ7CisgICAgY29uc3QgY2hhcgkqdmltX2V4dF9UaHJlYWRpbmdNb2RlbCA9ICJBcGFydG1lbnQiOworICAgIGNvbnN0IGNoYXIJKnZpbV9leHRfbmFtZSA9ICJWaW0gU2hlbGwgRXh0ZW5zaW9uIjsKKyAgICBjb25zdCBjaGFyCSp2aW1fZXh0X2Nsc2lkID0gIns1MUVFRTI0Mi1BRDg3LTExZDMtOUMxRS0wMDkwMjc4QkJEOTl9IjsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKworICAgIGZkID0gZm9wZW4oInZpbS5yZWciLCAidyIpOworICAgIGlmIChmZCA9PSBOVUxMKQorCXByaW50ZigiRVJST1I6IENvdWxkIG5vdCBvcGVuIHZpbS5yZWcgZm9yIHdyaXRpbmdcbiIpOworICAgIGVsc2UKKyAgICB7CisJZG91YmxlX2JzKGluc3RhbGxkaXIsIGJ1Zik7IC8qIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMgKi8KKworCS8qCisJICogV3JpdGUgdGhlIHJlZ2lzdHJ5IGVudHJpZXMgZm9yIHRoZSAiRWRpdCB3aXRoIFZpbSIgbWVudS4KKwkgKi8KKwlmcHJpbnRmKGZkLCAiUkVHRURJVDRcbiIpOworCWZwcmludGYoZmQsICJcbiIpOworCWlmIChpbnN0YWxsX3BvcHVwKQorCXsKKwkgICAgY2hhcglidWZnW0JVRlNJWkVdOworCSAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworCSAgICBpZiAoc3RhdCgiZ3ZpbWV4dC5kbGwiLCAmc3QpID49IDApCisJCXN0cmNweShidWZnLCBidWYpOworCSAgICBlbHNlCisJCS8qIGd2aW1leHQuZGxsIGlzIGluIGd2aW1leHQgc3ViZGlyICovCisJCXNwcmludGYoYnVmZywgIiVzZ3ZpbWV4dFxcXFwiLCBidWYpOworCisJICAgIHByaW50ZigiQ3JlYXRpbmcgXCJFZGl0IHdpdGggVmltXCIgcG9wdXAgbWVudSBlbnRyeVxuIik7CisKKwkgICAgZnByaW50ZihmZCwgIkhLRVlfQ0xBU1NFU19ST09UXFxDTFNJRFxcJXNcbiIsIHZpbV9leHRfY2xzaWQpOworCSAgICBmcHJpbnRmKGZkLCAiQD1cIiVzXCJcbiIsIHZpbV9leHRfbmFtZSk7CisJICAgIGZwcmludGYoZmQsICJbSEtFWV9DTEFTU0VTX1JPT1RcXENMU0lEXFwlc1xcSW5Qcm9jU2VydmVyMzJdXG4iLAorCQkJCQkJCSAgICAgICB2aW1fZXh0X2Nsc2lkKTsKKwkgICAgZnByaW50ZihmZCwgIkA9XCIlc2d2aW1leHQuZGxsXCJcbiIsIGJ1ZmcpOworCSAgICBmcHJpbnRmKGZkLCAiXCJUaHJlYWRpbmdNb2RlbFwiPVwiJXNcIlxuIiwgdmltX2V4dF9UaHJlYWRpbmdNb2RlbCk7CisJICAgIGZwcmludGYoZmQsICJcbiIpOworCSAgICBmcHJpbnRmKGZkLCAiW0hLRVlfQ0xBU1NFU19ST09UXFwqXFxzaGVsbGV4XFxDb250ZXh0TWVudUhhbmRsZXJzXFxndmltXVxuIik7CisJICAgIGZwcmludGYoZmQsICJAPVwiJXNcIlxuIiwgdmltX2V4dF9jbHNpZCk7CisJICAgIGZwcmludGYoZmQsICJcbiIpOworCSAgICBmcHJpbnRmKGZkLCAiW0hLRVlfTE9DQUxfTUFDSElORVxcU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFNoZWxsIEV4dGVuc2lvbnNcXEFwcHJvdmVkXVxuIik7CisJICAgIGZwcmludGYoZmQsICJcIiVzXCI9XCIlc1wiXG4iLCB2aW1fZXh0X2Nsc2lkLCB2aW1fZXh0X25hbWUpOworCSAgICBmcHJpbnRmKGZkLCAiXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIltIS0VZX0xPQ0FMX01BQ0hJTkVcXFNvZnR3YXJlXFxWaW1cXEd2aW1dXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIlwicGF0aFwiPVwiJXNndmltLmV4ZVwiXG4iLCBidWYpOworCSAgICBmcHJpbnRmKGZkLCAiXG4iKTsKKwl9CisKKwlpZiAoaW5zdGFsbF9vcGVud2l0aCkKKwl7CisJICAgIHByaW50ZigiQ3JlYXRpbmcgXCJPcGVuIHdpdGggLi4uXCIgbGlzdCBlbnRyeVxuIik7CisKKwkgICAgZnByaW50ZihmZCwgIltIS0VZX0NMQVNTRVNfUk9PVFxcQXBwbGljYXRpb25zXFxndmltLmV4ZV1cblxuIik7CisJICAgIGZwcmludGYoZmQsICJbSEtFWV9DTEFTU0VTX1JPT1RcXEFwcGxpY2F0aW9uc1xcZ3ZpbS5leGVcXHNoZWxsXVxuXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIltIS0VZX0NMQVNTRVNfUk9PVFxcQXBwbGljYXRpb25zXFxndmltLmV4ZVxcc2hlbGxcXGVkaXRdXG5cbiIpOworCSAgICBmcHJpbnRmKGZkLCAiW0hLRVlfQ0xBU1NFU19ST09UXFxBcHBsaWNhdGlvbnNcXGd2aW0uZXhlXFxzaGVsbFxcZWRpdFxcY29tbWFuZF1cbiIpOworCSAgICBmcHJpbnRmKGZkLCAiQD1cIiVzZ3ZpbS5leGUgXFxcIiUlMVxcXCJcIlxuXG4iLCBidWYpOworCSAgICBmcHJpbnRmKGZkLCAiW0hLRVlfQ0xBU1NFU19ST09UXFwuaHRtXFxPcGVuV2l0aExpc3RcXGd2aW0uZXhlXVxuXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIltIS0VZX0NMQVNTRVNfUk9PVFxcLnZpbVxcT3BlbldpdGhMaXN0XFxndmltLmV4ZV1cblxuIik7CisJICAgIGZwcmludGYoZmQsICJbSEtFWV9DTEFTU0VTX1JPT1RcXCpcXE9wZW5XaXRoTGlzdFxcZ3ZpbS5leGVdXG5cbiIpOworCX0KKworCXByaW50ZigiQ3JlYXRpbmcgYW4gdW5pbnN0YWxsIGVudHJ5XG4iKTsKKworCS8qIFRoZSByZWdpc3RyeSBlbnRyaWVzIGZvciB1bmluc3RhbGxpbmcgdGhlIG1lbnUgKi8KKwlmcHJpbnRmKGZkLCAiW0hLRVlfTE9DQUxfTUFDSElORVxcU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcVmltICIgVklNX1ZFUlNJT05fU0hPUlQgIl1cbiIpOworCisJLyogRm9yIHRoZSBOU0lTIGluc3RhbGxlciB1c2UgdGhlIGdlbmVyYXRlZCB1bmluc3RhbGxlci4gKi8KKwlpZiAoaW50ZXJhY3RpdmUpCisJeworCSAgICBmcHJpbnRmKGZkLCAiXCJEaXNwbGF5TmFtZVwiPVwiVmltICIgVklNX1ZFUlNJT05fU0hPUlQgIlwiXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIlwiVW5pbnN0YWxsU3RyaW5nXCI9XCIlc3VuaW5zdGFsLmV4ZVwiXG4iLCBidWYpOworCX0KKwllbHNlCisJeworCSAgICBmcHJpbnRmKGZkLCAiXCJEaXNwbGF5TmFtZVwiPVwiVmltICIgVklNX1ZFUlNJT05fU0hPUlQgIiAoc2VsZi1pbnN0YWxsaW5nKVwiXG4iKTsKKwkgICAgZnByaW50ZihmZCwgIlwiVW5pbnN0YWxsU3RyaW5nXCI9XCIlc3VuaW5zdGFsbC1ndWkuZXhlXCJcbiIsIGJ1Zik7CisJfQorCisJZmNsb3NlKGZkKTsKKworCXJ1bl9jb21tYW5kKCJyZWdlZGl0IC9zIHZpbS5yZWciKTsKKworCXJlbW92ZSgidmltLnJlZyIpOworICAgIH0KKyNlbmRpZiAvKiBpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFdJTjMyNjQpICovCit9CisKKyAgICBzdGF0aWMgdm9pZAorY2hhbmdlX3BvcHVwX2Nob2ljZShpbnQgaWR4KQoreworICAgIGlmIChpbnN0YWxsX3BvcHVwID09IDApCisgICAgeworCWNob2ljZXNbaWR4XS50ZXh0ID0gIkluc3RhbGwgYW4gZW50cnkgZm9yIFZpbSBpbiB0aGUgcG9wdXAgbWVudSBmb3IgdGhlIHJpZ2h0XG4gICAgbW91c2UgYnV0dG9uIHNvIHRoYXQgeW91IGNhbiBlZGl0IGFueSBmaWxlIHdpdGggVmltIjsKKwlpbnN0YWxsX3BvcHVwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaG9pY2VzW2lkeF0udGV4dCA9ICJEbyBOT1QgaW5zdGFsbCBhbiBlbnRyeSBmb3IgVmltIGluIHRoZSBwb3B1cCBtZW51IGZvciB0aGVcbiAgICByaWdodCBtb3VzZSBidXR0b24gdG8gZWRpdCBhbnkgZmlsZSB3aXRoIFZpbSI7CisJaW5zdGFsbF9wb3B1cCA9IDA7CisgICAgfQorfQorCisvKgorICogT25seSBhZGQgdGhlIGNob2ljZSBmb3IgdGhlIHBvcHVwIG1lbnUgZW50cnkgd2hlbiBndmltLmV4ZSB3YXMgZm91bmQgYW5kCisgKiBib3RoIGd2aW1leHQuZGxsIGFuZCByZWdlZGl0LmV4ZSBleGlzdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X3BvcHVwX2Nob2ljZSh2b2lkKQoreworICAgIHN0cnVjdCBzdGF0CXN0OworCisgICAgaWYgKGhhc19ndmltCisJICAgICYmIChzdGF0KCJndmltZXh0LmRsbCIsICZzdCkgPj0gMAorCQl8fCBzdGF0KCJndmltZXh0L2d2aW1leHQuZGxsIiwgJnN0KSA+PSAwKQorI2lmbmRlZiBXSU4zMjY0CisJICAgICYmIHNlYXJjaHBhdGgoInJlZ2VkaXQuZXhlIikgIT0gTlVMTAorI2VuZGlmCisgICAgICAgKQorICAgIHsKKwljaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IGNoYW5nZV9wb3B1cF9jaG9pY2U7CisJY2hvaWNlc1tjaG9pY2VfY291bnRdLmluc3RhbGxmdW5jID0gTlVMTDsKKwljaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gMTsKKwljaGFuZ2VfcG9wdXBfY2hvaWNlKGNob2ljZV9jb3VudCk7ICAvKiBzZXQgdGhlIHRleHQgKi8KKwkrK2Nob2ljZV9jb3VudDsKKyAgICB9CisgICAgZWxzZQorCWFkZF9kdW1teV9jaG9pY2UoKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitjaGFuZ2Vfb3BlbndpdGhfY2hvaWNlKGludCBpZHgpCit7CisgICAgaWYgKGluc3RhbGxfb3BlbndpdGggPT0gMCkKKyAgICB7CisJY2hvaWNlc1tpZHhdLnRleHQgPSAiQWRkIFZpbSB0byB0aGUgXCJPcGVuIFdpdGguLi5cIiBsaXN0IGluIHRoZSBwb3B1cCBtZW51IGZvciB0aGUgcmlnaHRcbiAgICBtb3VzZSBidXR0b24gc28gdGhhdCB5b3UgY2FuIGVkaXQgYW55IGZpbGUgd2l0aCBWaW0iOworCWluc3RhbGxfb3BlbndpdGggPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWNob2ljZXNbaWR4XS50ZXh0ID0gIkRvIE5PVCBhZGQgVmltIHRvIHRoZSBcIk9wZW4gV2l0aC4uLlwiIGxpc3QgaW4gdGhlIHBvcHVwIG1lbnUgZm9yIHRoZVxuICAgIHJpZ2h0IG1vdXNlIGJ1dHRvbiB0byBlZGl0IGFueSBmaWxlIHdpdGggVmltIjsKKwlpbnN0YWxsX29wZW53aXRoID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBPbmx5IGFkZCB0aGUgY2hvaWNlIGZvciB0aGUgb3Blbi13aXRoIG1lbnUgZW50cnkgd2hlbiBndmltLmV4ZSB3YXMgZm91bmQKKyAqIGFuZCBhbmQgcmVnZWRpdC5leGUgZXhpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdF9vcGVud2l0aF9jaG9pY2Uodm9pZCkKK3sKKyAgICBpZiAoaGFzX2d2aW0KKyNpZm5kZWYgV0lOMzI2NAorCSAgICAmJiBzZWFyY2hwYXRoKCJyZWdlZGl0LmV4ZSIpICE9IE5VTEwKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisJY2hvaWNlc1tjaG9pY2VfY291bnRdLmNoYW5nZWZ1bmMgPSBjaGFuZ2Vfb3BlbndpdGhfY2hvaWNlOworCWNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisJY2hvaWNlc1tjaG9pY2VfY291bnRdLmFjdGl2ZSA9IDE7CisJY2hhbmdlX29wZW53aXRoX2Nob2ljZShjaG9pY2VfY291bnQpOyAgLyogc2V0IHRoZSB0ZXh0ICovCisJKytjaG9pY2VfY291bnQ7CisgICAgfQorICAgIGVsc2UKKwlhZGRfZHVtbXlfY2hvaWNlKCk7Cit9CisKKyNpZmRlZiBXSU4zMjY0CisvKiBjcmVhdGVfc2hvcnRjdXQKKyAqCisgKiBDcmVhdGUgYSBzaGVsbCBsaW5rLgorICoKKyAqIHJldHVybnMgMCBvbiBmYWlsdXJlLCBub24temVybyBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisgKgorICogTk9URTogIEN1cnJlbnRseSB1bnRlc3RlZCB3aXRoIG1pbmd3LgorICovCisgICAgaW50CitjcmVhdGVfc2hvcnRjdXQoCisJY29uc3QgY2hhciAqc2hvcnRjdXRfbmFtZSwKKwljb25zdCBjaGFyICppY29uZmlsZV9wYXRoLAorCWludAkgICAgaWNvbmluZGV4LAorCWNvbnN0IGNoYXIgKnNob3J0Y3V0X3RhcmdldCwKKwljb25zdCBjaGFyICpzaG9ydGN1dF9hcmdzLAorCWNvbnN0IGNoYXIgKndvcmtpbmdkaXIKKwkpCit7CisgICAgSVNoZWxsTGluawkgICAgKnNoZWxsbGlua19wdHI7CisgICAgSFJFU1VMVAkgICAgaHJlczsKKyAgICBJUGVyc2lzdEZpbGUJICAgICpwZXJzaXN0ZmlsZV9wdHI7CisKKyAgICAvKiBJbml0aWFsaXplIENPTSBsaWJyYXJ5ICovCisgICAgaHJlcyA9IENvSW5pdGlhbGl6ZShOVUxMKTsKKyAgICBpZiAoIVNVQ0NFRURFRChocmVzKSkKKyAgICB7CisJcHJpbnRmKCJFcnJvcjogIENvdWxkIG5vdCBvcGVuIHRoZSBDT00gbGlicmFyeS4gIE5vdCBjcmVhdGluZyBzaG9ydGN1dC5cbiIpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIEluc3RhbnRpYXRlIGEgQ09NIG9iamVjdCBmb3IgdGhlIFNoZWxsTGluaywgc3RvcmUgYSBwb2ludGVyIHRvIGl0CisgICAgICogaW4gc2hlbGxsaW5rX3B0ci4gICovCisgICAgaHJlcyA9IENvQ3JlYXRlSW5zdGFuY2UoJkNMU0lEX1NoZWxsTGluaywKKwkJCSAgIE5VTEwsCisJCQkgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKwkJCSAgICZJSURfSVNoZWxsTGluaywKKwkJCSAgICh2b2lkICoqKSAmc2hlbGxsaW5rX3B0cik7CisKKyAgICBpZiAoU1VDQ0VFREVEKGhyZXMpKSAvKiBJZiB0aGUgaW5zdGFudGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4uLiAqLworICAgIHsKKwkvKiAuLi5UaGVuIGJ1aWxkIGEgUGVyc2lzdEZpbGUgaW50ZXJmYWNlIGZvciB0aGUgU2hlbGxMaW5rIHNvIHdlIGNhbgorCSAqIHNhdmUgaXQgYXMgYSBmaWxlIGFmdGVyIHdlIGJ1aWxkIGl0LiAgKi8KKwlocmVzID0gc2hlbGxsaW5rX3B0ci0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShzaGVsbGxpbmtfcHRyLAorCQkmSUlEX0lQZXJzaXN0RmlsZSwgKHZvaWQgKiopICZwZXJzaXN0ZmlsZV9wdHIpOworCisJaWYgKFNVQ0NFRURFRChocmVzKSkKKwl7CisJICAgIHdjaGFyX3Qgd3N6W0JVRlNJWkVdOworCisJICAgIC8qIHRyYW5zbGF0ZSB0aGUgKHBvc3NpYmx5KSBtdWx0aWJ5dGUgc2hvcnRjdXQgZmlsZW5hbWUgdG8gd2luZG93cworCSAgICAgKiBVbmljb2RlIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgZmlsZSBuYW1lLgorCSAgICAgKi8KKwkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHNob3J0Y3V0X25hbWUsIC0xLCB3c3osIEJVRlNJWkUpOworCisJICAgIC8qIHNldCB0aGUgYXR0cmlidXRlcyAqLworCSAgICBzaGVsbGxpbmtfcHRyLT5scFZ0YmwtPlNldFBhdGgoc2hlbGxsaW5rX3B0ciwgc2hvcnRjdXRfdGFyZ2V0KTsKKwkgICAgc2hlbGxsaW5rX3B0ci0+bHBWdGJsLT5TZXRXb3JraW5nRGlyZWN0b3J5KHNoZWxsbGlua19wdHIsCisJCQkJCQkJCSAgd29ya2luZ2Rpcik7CisJICAgIHNoZWxsbGlua19wdHItPmxwVnRibC0+U2V0SWNvbkxvY2F0aW9uKHNoZWxsbGlua19wdHIsCisJCQkJCQkgICAgaWNvbmZpbGVfcGF0aCwgaWNvbmluZGV4KTsKKwkgICAgc2hlbGxsaW5rX3B0ci0+bHBWdGJsLT5TZXRBcmd1bWVudHMoc2hlbGxsaW5rX3B0ciwgc2hvcnRjdXRfYXJncyk7CisKKwkgICAgLyogc2F2ZSB0aGUgc2hvcnRjdXQgdG8gYSBmaWxlIGFuZCByZXR1cm4gdGhlIFBlcnNpc3RGaWxlIG9iamVjdCovCisJICAgIHBlcnNpc3RmaWxlX3B0ci0+bHBWdGJsLT5TYXZlKHBlcnNpc3RmaWxlX3B0ciwgd3N6LCAxKTsKKwkgICAgcGVyc2lzdGZpbGVfcHRyLT5scFZ0YmwtPlJlbGVhc2UocGVyc2lzdGZpbGVfcHRyKTsKKwl9CisJZWxzZQorCXsKKwkgICAgcHJpbnRmKCJRdWVyeUludGVyZmFjZSBFcnJvclxuIik7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCS8qIFJldHVybiB0aGUgU2hlbGxMaW5rIG9iamVjdCAqLworCXNoZWxsbGlua19wdHItPmxwVnRibC0+UmVsZWFzZShzaGVsbGxpbmtfcHRyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlwcmludGYoIkNvQ3JlYXRlSW5zdGFuY2UgRXJyb3IgLSBocmVzID0gJTA4eFxuIiwgKGludClocmVzKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBCdWlsZCBhIHBhdGggdG8gd2hlcmUgd2Ugd2lsbCBwdXQgYSBzcGVjaWZpZWQgbGluay4KKyAqCisgKiBSZXR1cm4gMCBvbiBlcnJvciwgbm9uLXplcm8gb24gc3VjY2VzcworICovCisgICBpbnQKK2J1aWxkX2xpbmtfbmFtZSgKKwljaGFyCSAgICpsaW5rX3BhdGgsCisJY29uc3QgY2hhciAqbGlua19uYW1lLAorCWNvbnN0IGNoYXIgKnNoZWxsX2ZvbGRlcl9uYW1lKQoreworICAgIGNoYXIJc2hlbGxfZm9sZGVyX3BhdGhbQlVGU0laRV07CisKKyAgICBpZiAoZ2V0X3NoZWxsX2ZvbGRlcl9wYXRoKHNoZWxsX2ZvbGRlcl9wYXRoLCBzaGVsbF9mb2xkZXJfbmFtZSkgPT0gRkFJTCkKKyAgICB7CisJcHJpbnRmKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbmQgdGhlIHBhdGggdG8gJXMuXG4iLAorCQkJCQkJCSAgIHNoZWxsX2ZvbGRlcl9uYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMgKGNyZWF0ZSBTdGFydCBNZW51XFByb2dyYW1zXFZpbSkuCisgICAgICogSWdub3JlIGVycm9ycyBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gKi8KKyAgICB2aW1fbWtkaXIoc2hlbGxfZm9sZGVyX3BhdGgsIDA3NTUpOworCisgICAgLyogYnVpbGQgdGhlIHBhdGggdG8gdGhlIHNob3J0Y3V0IGFuZCB0aGUgcGF0aCB0byBndmltLmV4ZSAqLworICAgIHNwcmludGYobGlua19wYXRoLCAiJXNcXCVzLmxuayIsIHNoZWxsX2ZvbGRlcl9wYXRoLCBsaW5rX25hbWUpOworCisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIGludAorYnVpbGRfc2hvcnRjdXQoCisJY29uc3QgY2hhciAqbmFtZSwJLyogTmFtZSBvZiB0aGUgc2hvcnRjdXQgKi8KKwljb25zdCBjaGFyICpleGVuYW1lLAkvKiBOYW1lIG9mIHRoZSBleGVjdXRhYmxlIChlLmcuLCB2aW0uZXhlKSAqLworCWNvbnN0IGNoYXIgKmFyZ3MsCisJY29uc3QgY2hhciAqc2hlbGxfZm9sZGVyLAorCWNvbnN0IGNoYXIgKndvcmtpbmdkaXIpCit7CisgICAgY2hhcglleGVjdXRhYmxlX3BhdGhbQlVGU0laRV07CisgICAgY2hhcglsaW5rX25hbWVbQlVGU0laRV07CisKKyAgICBzcHJpbnRmKGV4ZWN1dGFibGVfcGF0aCwgIiVzXFwlcyIsIGluc3RhbGxkaXIsIGV4ZW5hbWUpOworCisgICAgaWYgKGJ1aWxkX2xpbmtfbmFtZShsaW5rX25hbWUsIG5hbWUsIHNoZWxsX2ZvbGRlcikgPT0gRkFJTCkKKyAgICB7CisJcHJpbnRmKCJBbiBlcnJvciBoYXMgb2NjdXJyZWQuICBBIHNob3J0Y3V0IHRvICVzIHdpbGwgbm90IGJlIGNyZWF0ZWQgJXMuXG4iLAorCQluYW1lLAorCQkqc2hlbGxfZm9sZGVyID09ICdkJyA/ICJvbiB0aGUgZGVza3RvcCIgOiAiaW4gdGhlIFN0YXJ0IG1lbnUiKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIHNob3J0Y3V0OiAqLworICAgIHJldHVybiBjcmVhdGVfc2hvcnRjdXQobGlua19uYW1lLCBleGVjdXRhYmxlX3BhdGgsIDAsCisJCQkJCSAgIGV4ZWN1dGFibGVfcGF0aCwgYXJncywgd29ya2luZ2Rpcik7Cit9CisKKy8qCisgKiBXZSB1c2VkIHRvIHVzZSAiaG9tZWRpciIgYXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCBidXQgdGhhdCBpcyBhIGJhZCBjaG9pY2UKKyAqIG9uIG11bHRpLXVzZXIgc3lzdGVtcy4gIE5vdCBzcGVjaWZ5aW5nIGEgZGlyZWN0b3J5IGFwcGVhcnMgdG8gd29yayBiZXN0LgorICovCisjZGVmaW5lIFdPUktESVIgIiIKKworLyoKKyAqIENyZWF0ZSBzaG9ydGN1dChzKSBpbiB0aGUgU3RhcnQgTWVudVxQcm9ncmFtc1xWaW0gZm9sZGVyLgorICovCisgICAgc3RhdGljIHZvaWQKK2luc3RhbGxfc3RhcnRfbWVudShpbnQgaWR4KQoreworICAgIG5lZWRfdW5pbnN0YWxsX2VudHJ5ID0gMTsKKyAgICBwcmludGYoIkNyZWF0aW5nIHN0YXJ0IG1lbnVcbiIpOworICAgIGlmIChoYXNfdmltKQorICAgIHsKKwlpZiAoYnVpbGRfc2hvcnRjdXQoIlZpbSIsICJ2aW0uZXhlIiwgIiIsCisJCQkJCSAgICAgIFZJTV9TVEFSVE1FTlUsIFdPUktESVIpID09IEZBSUwpCisJICAgIHJldHVybjsKKwlpZiAoYnVpbGRfc2hvcnRjdXQoIlZpbSBSZWFkLW9ubHkiLCAidmltLmV4ZSIsICItUiIsCisJCQkJCSAgICAgIFZJTV9TVEFSVE1FTlUsIFdPUktESVIpID09IEZBSUwpCisJICAgIHJldHVybjsKKwlpZiAoYnVpbGRfc2hvcnRjdXQoIlZpbSBEaWZmIiwgInZpbS5leGUiLCAiLWQiLAorCQkJCQkgICAgICBWSU1fU1RBUlRNRU5VLCBXT1JLRElSKSA9PSBGQUlMKQorCSAgICByZXR1cm47CisgICAgfQorICAgIGlmIChoYXNfZ3ZpbSkKKyAgICB7CisJaWYgKGJ1aWxkX3Nob3J0Y3V0KCJnVmltIiwgImd2aW0uZXhlIiwgIiIsCisJCQkJCSAgICAgIFZJTV9TVEFSVE1FTlUsIFdPUktESVIpID09IEZBSUwpCisJICAgIHJldHVybjsKKwlpZiAoYnVpbGRfc2hvcnRjdXQoImdWaW0gRWFzeSIsICJndmltLmV4ZSIsICIteSIsCisJCQkJCSAgICAgIFZJTV9TVEFSVE1FTlUsIFdPUktESVIpID09IEZBSUwpCisJICAgIHJldHVybjsKKwlpZiAoYnVpbGRfc2hvcnRjdXQoImdWaW0gUmVhZC1vbmx5IiwgImd2aW0uZXhlIiwgIi1SIiwKKwkJCQkJICAgICAgVklNX1NUQVJUTUVOVSwgV09SS0RJUikgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworCWlmIChidWlsZF9zaG9ydGN1dCgiZ1ZpbSBEaWZmIiwgImd2aW0uZXhlIiwgIi1kIiwKKwkJCQkJICAgICAgVklNX1NUQVJUTUVOVSwgV09SS0RJUikgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYnVpbGRfc2hvcnRjdXQoIlVuaW5zdGFsbCIsCisJCWludGVyYWN0aXZlID8gInVuaW5zdGFsLmV4ZSIgOiAidW5pbnN0YWxsLWd1aS5leGUiLCAiIiwKKwkJCQkJICAgVklNX1NUQVJUTUVOVSwgaW5zdGFsbGRpcikgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgLyogRm9yIFdpbmRvd3MgTlQgdGhlIHdvcmtpbmcgZGlyIG9mIHRoZSB2aW10dXRvci5iYXQgbXVzdCBiZSByaWdodCwKKyAgICAgKiBvdGhlcndpc2UgZ3ZpbS5leGUgd29uJ3QgYmUgZm91bmQgYW5kIHVzaW5nIGd2aW1iYXQgZG9lc24ndCB3b3JrLiAqLworICAgIGlmIChidWlsZF9zaG9ydGN1dCgiVmltIHR1dG9yIiwgInZpbXR1dG9yLmJhdCIsICIiLAorCQkJCQkgICBWSU1fU1RBUlRNRU5VLCBpbnN0YWxsZGlyKSA9PSBGQUlMKQorCXJldHVybjsKKyAgICBpZiAoYnVpbGRfc2hvcnRjdXQoIkhlbHAiLCBoYXNfZ3ZpbSA/ICJndmltLmV4ZSIgOiAidmltLmV4ZSIsICItYyBoIiwKKwkJCQkJICAgICAgVklNX1NUQVJUTUVOVSwgV09SS0RJUikgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgeworCWNoYXIJc2hlbGxfZm9sZGVyX3BhdGhbQlVGU0laRV07CisKKwkvKiBDcmVhdGluZyB0aGUgVVJMIHNob3J0Y3V0IHdvcmtzIGEgYml0IGRpZmZlcmVudGx5Li4uICovCisJaWYgKGdldF9zaGVsbF9mb2xkZXJfcGF0aChzaGVsbF9mb2xkZXJfcGF0aCwgVklNX1NUQVJUTUVOVSkgPT0gRkFJTCkKKwl7CisJICAgIHByaW50ZigiRmluZGluZyB0aGUgcGF0aCBvZiB0aGUgU3RhcnQgbWVudSBmYWlsZWRcbiIpOworCSAgICByZXR1cm4gOworCX0KKwlhZGRfcGF0aHNlcChzaGVsbF9mb2xkZXJfcGF0aCk7CisJc3RyY2F0KHNoZWxsX2ZvbGRlcl9wYXRoLCAiVmltIE9ubGluZS51cmwiKTsKKwlpZiAoIVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIkludGVybmV0U2hvcnRjdXQiLCAiVVJMIiwKKwkJCQkgICAgICJodHRwOi8vdmltLnNmLm5ldC8iLCBzaGVsbF9mb2xkZXJfcGF0aCkpCisJeworCSAgICBwcmludGYoIkNyZWF0aW5nIHRoZSBWaW0gb25saW5lIFVSTCBmYWlsZWRcbiIpOworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCit0b2dnbGVfc3RhcnRtZW51X2Nob2ljZShpbnQgaWR4KQoreworICAgIGlmIChjaG9pY2VzW2lkeF0uaW5zdGFsbGZ1bmMgPT0gTlVMTCkKKyAgICB7CisJY2hvaWNlc1tpZHhdLmluc3RhbGxmdW5jID0gaW5zdGFsbF9zdGFydF9tZW51OworCWNob2ljZXNbaWR4XS50ZXh0ID0gIkFkZCBWaW0gdG8gdGhlIFN0YXJ0IG1lbnUiOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWNob2ljZXNbaWR4XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisJY2hvaWNlc1tpZHhdLnRleHQgPSAiRG8gTk9UIGFkZCBWaW0gdG8gdGhlIFN0YXJ0IG1lbnUiOworICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvIGFjdHVhbGx5IGNyZWF0ZSB0aGUgc2hvcnRjdXRzCisgKgorICogQ3VycmVudGx5IEkgYW0gc3VwcGx5aW5nIG5vIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzaG9ydGN1dC4gIFRoaXMKKyAqICAgIG1lYW5zIHRoYXQgdGhlIGluaXRpYWwgd29ya2luZyBkaXIgd2lsbCBiZToKKyAqICAgIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaG9ydGN1dCBpZiBubyBmaWxlIGlzIHN1cHBsaWVkCisgKiAgICAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBiZWluZyBlZGl0ZWQgaWYgYSBmaWxlIGlzIHN1cHBsaWVkIChpZSB2aWEKKyAqICAgICAgZHJhZyBhbmQgZHJvcCBvbnRvIHRoZSBzaG9ydGN1dCkuCisgKi8KKyAgICB2b2lkCitpbnN0YWxsX3Nob3J0Y3V0X2d2aW0oaW50IGlkeCkKK3sKKyAgICAvKiBDcmVhdGUgc2hvcnRjdXQocykgb24gdGhlIGRlc2t0b3AgKi8KKyAgICBpZiAoY2hvaWNlc1tpZHhdLmFyZykKKyAgICB7CisJKHZvaWQpYnVpbGRfc2hvcnRjdXQoaWNvbl9uYW1lc1swXSwgImd2aW0uZXhlIiwKKwkJCQkJCSAgICAgICIiLCAiZGVza3RvcCIsIFdPUktESVIpOworCW5lZWRfdW5pbnN0YWxsX2VudHJ5ID0gMTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitpbnN0YWxsX3Nob3J0Y3V0X2V2aW0oaW50IGlkeCkKK3sKKyAgICBpZiAoY2hvaWNlc1tpZHhdLmFyZykKKyAgICB7CisJKHZvaWQpYnVpbGRfc2hvcnRjdXQoaWNvbl9uYW1lc1sxXSwgImd2aW0uZXhlIiwKKwkJCQkJCSAgICAiLXkiLCAiZGVza3RvcCIsIFdPUktESVIpOworCW5lZWRfdW5pbnN0YWxsX2VudHJ5ID0gMTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitpbnN0YWxsX3Nob3J0Y3V0X2d2aWV3KGludCBpZHgpCit7CisgICAgaWYgKGNob2ljZXNbaWR4XS5hcmcpCisgICAgeworCSh2b2lkKWJ1aWxkX3Nob3J0Y3V0KGljb25fbmFtZXNbMl0sICJndmltLmV4ZSIsCisJCQkJCQkgICAgIi1SIiwgImRlc2t0b3AiLCBXT1JLRElSKTsKKwluZWVkX3VuaW5zdGFsbF9lbnRyeSA9IDE7CisgICAgfQorfQorCisgICAgdm9pZAordG9nZ2xlX3Nob3J0Y3V0X2Nob2ljZShpbnQgaWR4KQoreworICAgIGNoYXIJKmFyZzsKKworICAgIGlmIChjaG9pY2VzW2lkeF0uaW5zdGFsbGZ1bmMgPT0gaW5zdGFsbF9zaG9ydGN1dF9ndmltKQorCWFyZyA9ICJnVmltIjsKKyAgICBlbHNlIGlmIChjaG9pY2VzW2lkeF0uaW5zdGFsbGZ1bmMgPT0gaW5zdGFsbF9zaG9ydGN1dF9ldmltKQorCWFyZyA9ICJnVmltIEVhc3kiOworICAgIGVsc2UKKwlhcmcgPSAiZ1ZpbSBSZWFkLW9ubHkiOworICAgIGlmIChjaG9pY2VzW2lkeF0uYXJnKQorICAgIHsKKwljaG9pY2VzW2lkeF0uYXJnID0gMDsKKwlhbGxvY190ZXh0KGlkeCwgIkRvIE5PVCBjcmVhdGUgYSBkZXNrdG9wIGljb24gZm9yICVzIiwgYXJnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaG9pY2VzW2lkeF0uYXJnID0gMTsKKwlhbGxvY190ZXh0KGlkeCwgIkNyZWF0ZSBhIGRlc2t0b3AgaWNvbiBmb3IgJXMiLCBhcmcpOworICAgIH0KK30KKyNlbmRpZiAvKiBXSU4zMjY0ICovCisKKyAgICBzdGF0aWMgdm9pZAoraW5pdF9zdGFydG1lbnVfY2hvaWNlKHZvaWQpCit7CisjaWZkZWYgV0lOMzI2NAorICAgIC8qIFN0YXJ0IG1lbnUgKi8KKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IHRvZ2dsZV9zdGFydG1lbnVfY2hvaWNlOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IE5VTEw7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmFjdGl2ZSA9IDE7CisgICAgdG9nZ2xlX3N0YXJ0bWVudV9jaG9pY2UoY2hvaWNlX2NvdW50KTsJLyogc2V0IHRoZSB0ZXh0ICovCisgICAgKytjaG9pY2VfY291bnQ7CisjZWxzZQorICAgIGFkZF9kdW1teV9jaG9pY2UoKTsKKyNlbmRpZgorfQorCisvKgorICogQWRkIHRoZSBjaG9pY2UgZm9yIHRoZSBkZXNrdG9wIHNob3J0Y3V0cy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X3Nob3J0Y3V0X2Nob2ljZXModm9pZCkKK3sKKyNpZmRlZiBXSU4zMjY0CisgICAgLyogU2hvcnRjdXQgdG8gZ3ZpbSAqLworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS50ZXh0ID0gTlVMTDsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYXJnID0gMDsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uYWN0aXZlID0gaGFzX2d2aW07CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmNoYW5nZWZ1bmMgPSB0b2dnbGVfc2hvcnRjdXRfY2hvaWNlOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IGluc3RhbGxfc2hvcnRjdXRfZ3ZpbTsKKyAgICB0b2dnbGVfc2hvcnRjdXRfY2hvaWNlKGNob2ljZV9jb3VudCk7CisgICAgKytjaG9pY2VfY291bnQ7CisKKyAgICAvKiBTaG9ydGN1dCB0byBldmltICovCisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLnRleHQgPSBOVUxMOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5hcmcgPSAwOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5hY3RpdmUgPSBoYXNfZ3ZpbTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IHRvZ2dsZV9zaG9ydGN1dF9jaG9pY2U7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmluc3RhbGxmdW5jID0gaW5zdGFsbF9zaG9ydGN1dF9ldmltOworICAgIHRvZ2dsZV9zaG9ydGN1dF9jaG9pY2UoY2hvaWNlX2NvdW50KTsKKyAgICArK2Nob2ljZV9jb3VudDsKKworICAgIC8qIFNob3J0Y3V0IHRvIGd2aWV3ICovCisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLnRleHQgPSBOVUxMOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5hcmcgPSAwOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5hY3RpdmUgPSBoYXNfZ3ZpbTsKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0uY2hhbmdlZnVuYyA9IHRvZ2dsZV9zaG9ydGN1dF9jaG9pY2U7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmluc3RhbGxmdW5jID0gaW5zdGFsbF9zaG9ydGN1dF9ndmlldzsKKyAgICB0b2dnbGVfc2hvcnRjdXRfY2hvaWNlKGNob2ljZV9jb3VudCk7CisgICAgKytjaG9pY2VfY291bnQ7CisjZWxzZQorICAgIGFkZF9kdW1teV9jaG9pY2UoKTsKKyAgICBhZGRfZHVtbXlfY2hvaWNlKCk7CisgICAgYWRkX2R1bW15X2Nob2ljZSgpOworI2VuZGlmCit9CisKKyNpZmRlZiBXSU4zMjY0CisvKgorICogQXR0ZW1wdCB0byByZWdpc3RlciBPTEUgZm9yIFZpbS4KKyAqLworICAgc3RhdGljIHZvaWQKK2luc3RhbGxfT0xFX3JlZ2lzdGVyKHZvaWQpCit7CisgICAgY2hhciByZWdpc3Rlcl9jb21tYW5kX3N0cmluZ1tCVUZTSVpFICsgMzBdOworCisgICAgcHJpbnRmKCJcbi0tLSBBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIFZpbSB3aXRoIE9MRSAtLS1cbiIpOworICAgIHByaW50ZigiKFRoZXJlIGlzIG5vIG1lc3NhZ2Ugd2hldGhlciB0aGlzIHdvcmtzIG9yIG5vdC4pXG4iKTsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisgICAgc3ByaW50ZihyZWdpc3Rlcl9jb21tYW5kX3N0cmluZywgIlwiJXNcXGd2aW0uZXhlXCIgLXNpbGVudCAtcmVnaXN0ZXIiLCBpbnN0YWxsZGlyKTsKKyNlbHNlCisgICAgLyogaGFuZGxlIHRoaXMgZGlmZmVyZW50bHkgZm9yIEN5Z3dpbiB3aGljaCBzb21ldGltZXMgaGFzIHRyb3VibGUgd2l0aAorICAgICAqIFdpbmRvd3Mtc3R5bGUgcGF0aG5hbWVzIGhlcmUuICovCisgICAgc3ByaW50ZihyZWdpc3Rlcl9jb21tYW5kX3N0cmluZywgIi4vZ3ZpbS5leGUgLXNpbGVudCAtcmVnaXN0ZXIiKTsKKyNlbmRpZgorICAgIHN5c3RlbShyZWdpc3Rlcl9jb21tYW5kX3N0cmluZyk7Cit9CisjZW5kaWYgLyogV0lOMzI2NCAqLworCisvKgorICogUmVtb3ZlIHRoZSBsYXN0IHBhcnQgb2YgZGlyZWN0b3J5ICJwYXRoW10iIHRvIGdldCBpdHMgcGFyZW50LCBhbmQgcHV0IHRoZQorICogcmVzdWx0IGluICJ0b1tdIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkaXJfcmVtb3ZlX2xhc3QoY29uc3QgY2hhciAqcGF0aCwgY2hhciB0b1tCVUZTSVpFXSkKK3sKKyAgICBjaGFyIGM7CisgICAgbG9uZyBsYXN0X2NoYXJfdG9fY29weTsKKyAgICBsb25nIHBhdGhfbGVuZ3RoID0gc3RybGVuKHBhdGgpOworCisgICAgLyogc2tpcCB0aGUgbGFzdCBjaGFyYWN0ZXIganVzdCBpbiBjYXNlIGl0IGlzIGEgJ1xcJyAqLworICAgIGxhc3RfY2hhcl90b19jb3B5ID0gcGF0aF9sZW5ndGggLSAyOworICAgIGMgPSBwYXRoW2xhc3RfY2hhcl90b19jb3B5XTsKKworICAgIHdoaWxlIChjICE9ICdcXCcpCisgICAgeworCWxhc3RfY2hhcl90b19jb3B5LS07CisJYyA9IHBhdGhbbGFzdF9jaGFyX3RvX2NvcHldOworICAgIH0KKworICAgIHN0cm5jcHkodG8sIHBhdGgsIChzaXplX3QpbGFzdF9jaGFyX3RvX2NvcHkpOworICAgIHRvW2xhc3RfY2hhcl90b19jb3B5XSA9IE5VTDsKK30KKworICAgIHN0YXRpYyB2b2lkCitzZXRfZGlyZWN0b3JpZXNfdGV4dChpbnQgaWR4KQoreworICAgIGlmICh2aW1maWxlc19kaXJfY2hvaWNlID09IChpbnQpdmltZmlsZXNfZGlyX25vbmUpCisJYWxsb2NfdGV4dChpZHgsICJEbyBOT1QgY3JlYXRlIHBsdWdpbiBkaXJlY3RvcmllcyVzIiwgIiIpOworICAgIGVsc2UKKwlhbGxvY190ZXh0KGlkeCwgIkNyZWF0ZSBwbHVnaW4gZGlyZWN0b3JpZXM6ICVzIiwKKwkJCQkgICB2aW1maWxlc19kaXJfY2hvaWNlc1t2aW1maWxlc19kaXJfY2hvaWNlXSk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGRpcmVjdG9yeSB0aGF0IHRoZSB2aW0gcGx1Z2luIGRpcmVjdG9yaWVzIHdpbGwgYmUgY3JlYXRlZCBpbjoKKyAqICRIT01FLCAkVklNIG9yIG5vd2hlcmUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hhbmdlX2RpcmVjdG9yaWVzX2Nob2ljZShpbnQgaWR4KQoreworICAgIGludAkgICAgY2hvaWNlX2NvdW50ID0gVEFCTEVfU0laRSh2aW1maWxlc19kaXJfY2hvaWNlcyk7CisKKyAgICAvKiBEb24ndCBvZmZlciB0aGUgJEhPTUUgY2hvaWNlIGlmICRIT01FIGlzbid0IHNldC4gKi8KKyAgICBpZiAoZ2V0ZW52KCJIT01FIikgPT0gTlVMTCkKKwktLWNob2ljZV9jb3VudDsKKyAgICB2aW1maWxlc19kaXJfY2hvaWNlID0gZ2V0X2Nob2ljZSh2aW1maWxlc19kaXJfY2hvaWNlcywgY2hvaWNlX2NvdW50KTsKKyAgICBzZXRfZGlyZWN0b3JpZXNfdGV4dChpZHgpOworfQorCisvKgorICogQ3JlYXRlIHRoZSBwbHVnaW4gZGlyZWN0b3JpZXMuLi4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2luc3RhbGxfdmltZmlsZXNkaXIoaW50IGlkeCkKK3sKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwOworICAgIGNoYXIgdmltZGlyX3BhdGhbQlVGU0laRV07CisgICAgY2hhciB2aW1maWxlc19wYXRoW0JVRlNJWkVdOworICAgIGNoYXIgdG1wX2Rpcm5hbWVbQlVGU0laRV07CisKKyAgICAvKiBzd2l0Y2ggb24gdGhlIGxvY2F0aW9uIHRoYXQgdGhlIHVzZXIgd2FudHMgdGhlIHBsdWdpbiBkaXJlY3RvcmllcworICAgICAqIGJ1aWx0IGluICovCisgICAgc3dpdGNoICh2aW1maWxlc19kaXJfY2hvaWNlKQorICAgIHsKKwljYXNlIHZpbWZpbGVzX2Rpcl92aW06CisJeworCSAgICAvKiBHbyB0byB0aGUgJVZJTSUgZGlyZWN0b3J5IC0gY2hlY2sgZW52IGZpcnN0LCB0aGVuIGdvIG9uZSBkaXIKKwkgICAgICoJICAgYmVsb3cgaW5zdGFsbGRpciBpZiB0aGVyZSBpcyBubyAlVklNJSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKwkgICAgICoJICAgVGhlIGFjY3VyYWN5IG9mICRWSU0gaXMgY2hlY2tlZCBpbiBpbnNwZWN0X3N5c3RlbSgpLCBzbyB3ZQorCSAgICAgKgkgICBjYW4gYmUgc3VyZSBpdCBpcyBvayB0byB1c2UgaGVyZS4gKi8KKwkgICAgcCA9IGdldGVudigiVklNIik7CisJICAgIGlmIChwID09IE5VTEwpIC8qIE5vICRWSU0gaW4gcGF0aCAqLworCQlkaXJfcmVtb3ZlX2xhc3QoaW5zdGFsbGRpciwgdmltZGlyX3BhdGgpOworCSAgICBlbHNlCisJCXN0cmNweSh2aW1kaXJfcGF0aCwgcCk7CisJICAgIGJyZWFrOworCX0KKwljYXNlIHZpbWZpbGVzX2Rpcl9ob21lOgorCXsKKwkgICAgLyogRmluZCB0aGUgJEhPTUUgZGlyZWN0b3J5LiAgSXRzIGV4aXN0ZW5jZSB3YXMgYWxyZWFkeSBjaGVja2VkLiAqLworCSAgICBwID0gZ2V0ZW52KCJIT01FIik7CisJICAgIGlmIChwID09IE5VTEwpCisJICAgIHsKKwkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogJEhPTUUgaXMgTlVMTFxuIik7CisJCXAgPSAiYzpcXCI7CisJICAgIH0KKwkgICAgc3RyY3B5KHZpbWRpcl9wYXRoLCBwKTsKKwkgICAgYnJlYWs7CisJfQorCWNhc2UgdmltZmlsZXNfZGlyX25vbmU6CisJeworCSAgICAvKiBEbyBub3QgY3JlYXRlIHZpbSBwbHVnaW4gZGlyZWN0b3J5ICovCisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgLyogTm93LCBqdXN0IGNyZWF0ZSB0aGUgZGlyZWN0b3J5LglJZiBpdCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBmYWlsCisgICAgICogc2lsZW50bHkuICAqLworICAgIHNwcmludGYodmltZmlsZXNfcGF0aCwgIiVzXFx2aW1maWxlcyIsIHZpbWRpcl9wYXRoKTsKKyAgICB2aW1fbWtkaXIodmltZmlsZXNfcGF0aCwgMDc1NSk7CisKKyAgICBwcmludGYoIkNyZWF0aW5nIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgaW4gXCIlc1wiOlxuIiwgdmltZmlsZXNfcGF0aCk7CisgICAgZm9yIChpID0gMDsgaSA8IFRBQkxFX1NJWkUodmltZmlsZXNfc3ViZGlycyk7IGkrKykKKyAgICB7CisJc3ByaW50Zih0bXBfZGlybmFtZSwgIiVzXFwlcyIsIHZpbWZpbGVzX3BhdGgsIHZpbWZpbGVzX3N1YmRpcnNbaV0pOworCXByaW50ZigiICAlcyIsIHZpbWZpbGVzX3N1YmRpcnNbaV0pOworCXZpbV9ta2Rpcih0bXBfZGlybmFtZSwgMDc1NSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworLyoKKyAqIEFkZCB0aGUgY3JlYXRpb24gb2YgcnVudGltZSBmaWxlcyB0byB0aGUgc2V0dXAgc2VxdWVuY2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdF9kaXJlY3Rvcmllc19jaG9pY2Uodm9pZCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKyAgICBjaGFyCXRtcF9kaXJuYW1lW0JVRlNJWkVdOworICAgIGNoYXIJKnA7CisKKyAgICBjaG9pY2VzW2Nob2ljZV9jb3VudF0udGV4dCA9IGFsbG9jKDE1MCk7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmNoYW5nZWZ1bmMgPSBjaGFuZ2VfZGlyZWN0b3JpZXNfY2hvaWNlOworICAgIGNob2ljZXNbY2hvaWNlX2NvdW50XS5pbnN0YWxsZnVuYyA9IGluc3RhbGxfdmltZmlsZXNkaXI7CisgICAgY2hvaWNlc1tjaG9pY2VfY291bnRdLmFjdGl2ZSA9IDE7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgImNvbXBpbGVyIiBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMuICBUaGF0J3MgYSBnb29kCisgICAgICogaW5kaWNhdGlvbiB0aGF0IHRoZSBwbHVnaW4gZGlyZWN0b3JpZXMgd2VyZSBhbHJlYWR5IGNyZWF0ZWQuICovCisgICAgaWYgKGdldGVudigiSE9NRSIpICE9IE5VTEwpCisgICAgeworCXZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl9ob21lOworCXNwcmludGYodG1wX2Rpcm5hbWUsICIlc1xcdmltZmlsZXNcXGNvbXBpbGVyIiwgZ2V0ZW52KCJIT01FIikpOworCWlmIChzdGF0KHRtcF9kaXJuYW1lLCAmc3QpID09IDApCisJICAgIHZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl9ub25lOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl92aW07CisJcCA9IGdldGVudigiVklNIik7CisJaWYgKHAgPT0gTlVMTCkgLyogTm8gJFZJTSBpbiBwYXRoLCB1c2UgdGhlIGluc3RhbGwgZGlyICovCisJICAgIGRpcl9yZW1vdmVfbGFzdChpbnN0YWxsZGlyLCB0bXBfZGlybmFtZSk7CisJZWxzZQorCSAgICBzdHJjcHkodG1wX2Rpcm5hbWUsIHApOworCXN0cmNhdCh0bXBfZGlybmFtZSwgIlxcdmltZmlsZXNcXGNvbXBpbGVyIik7CisJaWYgKHN0YXQodG1wX2Rpcm5hbWUsICZzdCkgPT0gMCkKKwkgICAgdmltZmlsZXNfZGlyX2Nob2ljZSA9IChpbnQpdmltZmlsZXNfZGlyX25vbmU7CisgICAgfQorCisgICAgc2V0X2RpcmVjdG9yaWVzX3RleHQoY2hvaWNlX2NvdW50KTsKKyAgICArK2Nob2ljZV9jb3VudDsKK30KKworLyoKKyAqIFNldHVwIHRoZSBjaG9pY2VzIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0dXBfY2hvaWNlcyh2b2lkKQoreworICAgIC8qIGluc3RhbGwgdGhlIGJhdGNoIGZpbGVzICovCisgICAgaW5pdF9iYXRfY2hvaWNlcygpOworCisgICAgLyogKG92ZXIpIHdyaXRlIF92aW1yYyBmaWxlICovCisgICAgaW5pdF92aW1yY19jaG9pY2VzKCk7CisKKyAgICAvKiBXaGV0aGVyIHRvIGFkZCBWaW0gdG8gdGhlIHBvcHVwIG1lbnUgKi8KKyAgICBpbml0X3BvcHVwX2Nob2ljZSgpOworCisgICAgLyogV2hldGhlciB0byBhZGQgVmltIHRvIHRoZSAiT3BlbiBXaXRoLi4uIiBtZW51ICovCisgICAgaW5pdF9vcGVud2l0aF9jaG9pY2UoKTsKKworICAgIC8qIFdoZXRoZXIgdG8gYWRkIFZpbSB0byB0aGUgU3RhcnQgTWVudS4gKi8KKyAgICBpbml0X3N0YXJ0bWVudV9jaG9pY2UoKTsKKworICAgIC8qIFdoZXRoZXIgdG8gYWRkIHNob3J0Y3V0cyB0byB0aGUgRGVza3RvcC4gKi8KKyAgICBpbml0X3Nob3J0Y3V0X2Nob2ljZXMoKTsKKworICAgIC8qIFdoZXRoZXIgdG8gY3JlYXRlIHRoZSBydW50aW1lIGRpcmVjdG9yaWVzLiAqLworICAgIGluaXRfZGlyZWN0b3JpZXNfY2hvaWNlKCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHJpbnRfY21kX2xpbmVfaGVscCh2b2lkKQoreworICAgIHByaW50ZigiVmltIGluc3RhbGxlciBub24taW50ZXJhY3RpdmUgY29tbWFuZCBsaW5lIGFyZ3VtZW50czpcbiIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIi1jcmVhdGUtYmF0ZmlsZXMgIFt2aW0gZ3ZpbSBldmltIHZpZXcgZ3ZpZXcgdmltZGlmZiBndmltZGlmZl1cbiIpOworICAgIHByaW50ZigiICAgIENyZWF0ZSAuYmF0IGZpbGVzIGZvciBWaW0gdmFyaWFudHMgaW4gdGhlIFdpbmRvd3MgZGlyZWN0b3J5LlxuIik7CisgICAgcHJpbnRmKCItY3JlYXRlLXZpbXJjXG4iKTsKKyAgICBwcmludGYoIiAgICBDcmVhdGUgYSBkZWZhdWx0IF92aW1yYyBmaWxlIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuIik7CisgICAgcHJpbnRmKCItaW5zdGFsbC1wb3B1cFxuIik7CisgICAgcHJpbnRmKCIgICAgSW5zdGFsbCB0aGUgRWRpdC13aXRoLVZpbSBjb250ZXh0IG1lbnUgZW50cnlcbiIpOworICAgIHByaW50ZigiLWluc3RhbGwtb3BlbndpdGhcbiIpOworICAgIHByaW50ZigiICAgIEFkZCBWaW0gdG8gdGhlIFwiT3BlbiBXaXRoLi4uXCIgY29udGV4dCBtZW51IGxpc3RcbiIpOworI2lmZGVmIFdJTjMyNjQKKyAgICBwcmludGYoIi1hZGQtc3RhcnQtbWVudSIpOworICAgIHByaW50ZigiICAgIEFkZCBWaW0gdG8gdGhlIHN0YXJ0IG1lbnVcbiIpOworICAgIHByaW50ZigiLWluc3RhbGwtaWNvbnMiKTsKKyAgICBwcmludGYoIiAgICBDcmVhdGUgaWNvbnMgZm9yIGdWaW0gZXhlY3V0YWJsZXMgb24gdGhlIGRlc2t0b3BcbiIpOworI2VuZGlmCisgICAgcHJpbnRmKCItY3JlYXRlLWRpcmVjdG9yaWVzIFt2aW18aG9tZV1cbiIpOworICAgIHByaW50ZigiICAgIENyZWF0ZSBydW50aW1lIGRpcmVjdG9yaWVzIHRvIGRyb3AgcGx1Z2lucyBpbnRvOyBpbiB0aGUgJFZJTVxuIik7CisgICAgcHJpbnRmKCIgICAgb3IgJEhPTUUgZGlyZWN0b3J5XG4iKTsKKyNpZmRlZiBXSU4zMjY0CisgICAgcHJpbnRmKCItcmVnaXN0ZXItT0xFIik7CisgICAgcHJpbnRmKCIgICAgUmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFXG4iKTsKKyNlbmRpZgorICAgIHByaW50ZigiXG4iKTsKK30KKworLyoKKyAqIFNldHVwIGluc3RhbGxhdGlvbiBjaG9pY2VzIGJhc2VkIG9uIGNvbW1hbmQgbGluZSBzd2l0Y2hlcworICovCisgICAgc3RhdGljIHZvaWQKK2NvbW1hbmRfbGluZV9zZXR1cF9jaG9pY2VzKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworCWlmIChzdHJjbXAoYXJndltpXSwgIi1jcmVhdGUtYmF0ZmlsZXMiKSA9PSAwKQorCXsKKwkgICAgaWYgKGkgKyAxID09IGFyZ2MpCisJCWNvbnRpbnVlOworCSAgICB3aGlsZSAoYXJndltpICsgMV1bMF0gIT0gJy0nICYmIGkgPCBhcmdjKQorCSAgICB7CisJCWkrKzsKKwkJZm9yIChqID0gMTsgaiA8IFRBUkdFVF9DT1VOVDsgKytqKQorCQkgICAgaWYgKCh0YXJnZXRzW2pdLmV4ZW5hbWVhcmdbMF0gPT0gJ2cnID8gaGFzX2d2aW0gOiBoYXNfdmltKQorCQkJICAgICYmIHN0cmNtcChhcmd2W2ldLCB0YXJnZXRzW2pdLm5hbWUpID09IDApCisJCSAgICB7CisJCQlpbml0X2JhdF9jaG9pY2Uoaik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJaWYgKGogPT0gVEFSR0VUX0NPVU5UKQorCQkgICAgcHJpbnRmKCIlcyBpcyBub3QgYSB2YWxpZCBjaG9pY2UgZm9yIC1jcmVhdGUtYmF0ZmlsZXNcbiIsCisJCQkJCQkJCSAgICAgYXJndltpXSk7CisKKwkJaWYgKGkgKyAxID09IGFyZ2MpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKwllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1jcmVhdGUtdmltcmMiKSA9PSAwKQorCXsKKwkgICAgLyogU2V0dXAgZGVmYXVsdCB2aW1yYyBjaG9pY2VzLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIF92aW1yYyBmaWxlLAorCSAgICAgKiBpdCB3aWxsIE5PVCBiZSBvdmVyd3JpdHRlbi4KKwkgICAgICovCisJICAgIGluaXRfdmltcmNfY2hvaWNlcygpOworCX0KKwllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1pbnN0YWxsLXBvcHVwIikgPT0gMCkKKwl7CisJICAgIGluaXRfcG9wdXBfY2hvaWNlKCk7CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWluc3RhbGwtb3BlbndpdGgiKSA9PSAwKQorCXsKKwkgICAgaW5pdF9vcGVud2l0aF9jaG9pY2UoKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItYWRkLXN0YXJ0LW1lbnUiKSA9PSAwKQorCXsKKwkgICAgaW5pdF9zdGFydG1lbnVfY2hvaWNlKCk7CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWluc3RhbGwtaWNvbnMiKSA9PSAwKQorCXsKKwkgICAgaW5pdF9zaG9ydGN1dF9jaG9pY2VzKCk7CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWNyZWF0ZS1kaXJlY3RvcmllcyIpID09IDApCisJeworCSAgICBpbml0X2RpcmVjdG9yaWVzX2Nob2ljZSgpOworCSAgICBpZiAoYXJndltpICsgMV1bMF0gIT0gJy0nKQorCSAgICB7CisJCWkrKzsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCAidmltIikgPT0gMCkKKwkJICAgIHZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl92aW07CisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiaG9tZSIpID09IDApCisJCXsKKwkJICAgIGlmIChnZXRlbnYoIkhPTUUiKSA9PSBOVUxMKSAvKiBObyAkSE9NRSBpbiBlbnZpcm9ubWVudCAqLworCQkJdmltZmlsZXNfZGlyX2Nob2ljZSA9IChpbnQpdmltZmlsZXNfZGlyX3ZpbTsKKwkJICAgIGVsc2UKKwkJCXZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl9ob21lOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgcHJpbnRmKCJVbmtub3duIGFyZ3VtZW50IGZvciAtY3JlYXRlLWRpcmVjdG9yaWVzOiAlc1xuIiwKKwkJCQkJCQkJICAgICBhcmd2W2ldKTsKKwkJICAgIHByaW50X2NtZF9saW5lX2hlbHAoKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgLyogTm8gY2hvaWNlIHNwZWNpZmllZCwgZGVmYXVsdCB0byB2aW0gZGlyZWN0b3J5ICovCisJCXZpbWZpbGVzX2Rpcl9jaG9pY2UgPSAoaW50KXZpbWZpbGVzX2Rpcl92aW07CisJfQorI2lmZGVmIFdJTjMyNjQKKwllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1yZWdpc3Rlci1PTEUiKSA9PSAwKQorCXsKKwkgICAgLyogVGhpcyBpcyBhbHdheXMgZG9uZSB3aGVuIGd2aW0gaXMgZm91bmQgKi8KKwl9CisjZW5kaWYKKwllbHNlIC8qIFVua25vd24gc3dpdGNoICovCisJeworCSAgICBwcmludGYoIkdvdCB1bmtub3duIGFyZ3VtZW50IGFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOworCSAgICBwcmludF9jbWRfbGluZV9oZWxwKCk7CisJfQorICAgIH0KK30KKworCisvKgorICogU2hvdyBhIGZldyBzY3JlZW5zIGZ1bGwgb2YgaGVscGZ1bCBpbmZvcm1hdGlvbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzaG93X2hlbHAodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciAqKGl0ZW1zW10pID0KKyAgICB7CisiSW5zdGFsbGluZyAuYmF0IGZpbGVzXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiVGhlIHZpbS5iYXQgZmlsZSBpcyB3cml0dGVuIGluIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgaW4gJFBBVEguXG4iCisiVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydCBWaW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuIgorIklmIHZpbS5leGUgY2FuIGJlIGZvdW5kIGluICRQQVRILCB0aGUgY2hvaWNlIGZvciB2aW0uYmF0IHdpbGwgbm90IGJlXG4iCisicHJlc2VudC4gIEl0IGlzIGFzc3VtZWQgeW91IHdpbGwgdXNlIHRoZSBleGlzdGluZyB2aW0uZXhlLlxuIgorIklmIHZpbS5iYXQgY2FuIGFscmVhZHkgYmUgZm91bmQgaW4gJFBBVEggdGhpcyBpcyBwcm9iYWJseSBmb3IgYW4gb2xkXG4iCisidmVyc2lvbiBvZiBWaW0gKGJ1dCB0aGlzIGlzIG5vdCBjaGVja2VkISkuICBZb3UgY2FuIG92ZXJ3cml0ZSBpdC5cbiIKKyJJZiBubyB2aW0uYmF0IGFscmVhZHkgZXhpc3RzLCB5b3UgY2FuIHNlbGVjdCBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGluXG4iCisiJFBBVEggZm9yIGNyZWF0aW5nIHRoZSBiYXRjaCBmaWxlLCBvciBkaXNhYmxlIGNyZWF0aW5nIGEgdmltLmJhdCBmaWxlLlxuIgorIlxuIgorIklmIHlvdSBjaG9vc2Ugbm90IHRvIGNyZWF0ZSB0aGUgdmltLmJhdCBmaWxlLCBWaW0gY2FuIHN0aWxsIGJlIGV4ZWN1dGVkXG4iCisiaW4gb3RoZXIgd2F5cywgYnV0IG5vdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4iCisiXG4iCisiVGhlIHNhbWUgYXBwbGllcyB0byBjaG9pY2VzIGZvciBndmltLCBldmltLCAoZyl2aWV3LCBhbmQgKGcpdmltZGlmZi5cbiIKKyJUaGUgZmlyc3QgaXRlbSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHBhdGggZm9yIGFsbCBvZiB0aGVtLlxuIgorLAorIkNyZWF0aW5nIGEgX3ZpbXJjIGZpbGVcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiVGhlIF92aW1yYyBmaWxlIGlzIHVzZWQgdG8gc2V0IG9wdGlvbnMgZm9yIGhvdyBWaW0gYmVoYXZlcy5cbiIKKyJUaGUgaW5zdGFsbCBwcm9ncmFtIGNhbiBjcmVhdGUgYSBfdmltcmMgZmlsZSB3aXRoIGEgZmV3IGJhc2ljIGNob2ljZXMuXG4iCisiWW91IGNhbiBlZGl0IHRoaXMgZmlsZSBsYXRlciB0byB0dW5lIHlvdXIgcHJlZmVyZW5jZXMuXG4iCisiSWYgeW91IGFscmVhZHkgaGF2ZSBhIF92aW1yYyBvciAudmltcmMgZmlsZSBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4iCisiRG9uJ3QgZG8gdGhhdCBpZiB5b3UgaGF2ZSBtYWRlIGNoYW5nZXMgdG8gaXQuXG4iCissCisiVmltIGZlYXR1cmVzXG4iCisiLS0tLS0tLS0tLS0tXG4iCisiKHRoaXMgY2hvaWNlIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gY3JlYXRpbmcgYSBfdmltcmMgZmlsZSlcbiIKKyIxLiBWaW0gY2FuIHJ1biBpbiBWaS1jb21wYXRpYmxlIG1vZGUuICBNYW55IG5pY2UgVmltIGZlYXR1cmVzIGFyZSB0aGVuXG4iCisiICAgZGlzYWJsZWQuICBJbiB0aGUgbm90LVZpLWNvbXBhdGlibGUgbW9kZSBWaW0gaXMgc3RpbGwgbW9zdGx5IFZpXG4iCisiICAgY29tcGF0aWJsZSwgYnV0IGFkZHMgbmljZSBmZWF0dXJlcyBsaWtlIG11bHRpLWxldmVsIHVuZG8uICBPbmx5XG4iCisiICAgY2hvb3NlIFZpLWNvbXBhdGlibGUgaWYgeW91IHJlYWxseSBuZWVkIGZ1bGwgVmkgY29tcGF0aWJpbGl0eS5cbiIKKyIyLiBSdW5uaW5nIFZpbSB3aXRoIHNvbWUgZW5oYW5jZW1lbnRzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHNvbWUgb2ZcbiIKKyIgICB0aGUgbmljZSBWaW0gZmVhdHVyZXMsIGJ1dCBoYXZlIGEgc2xvdyBjb21wdXRlciBhbmQgd2FudCB0byBrZWVwIGl0XG4iCisiICAgcmVhbGx5IGZhc3QuXG4iCisiMy4gU3ludGF4IGhpZ2hsaWdodGluZyBzaG93cyBtYW55IGZpbGVzIGluIGNvbG9yLiAgTm90IG9ubHkgZG9lcyB0aGlzIGxvb2tcbiIKKyIgICBuaWNlLCBpdCBhbHNvIG1ha2VzIGl0IGVhc2llciB0byBzcG90IGVycm9ycyBhbmQgeW91IGNhbiB3b3JrIGZhc3Rlci5cbiIKKyIgICBUaGUgb3RoZXIgZmVhdHVyZXMgaW5jbHVkZSBlZGl0aW5nIGNvbXByZXNzZWQgZmlsZXMuXG4iCissCisiV2luZG93cyBrZXkgbWFwcGluZ1xuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyIodGhpcyBjaG9pY2UgaXMgb25seSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZyBhIF92aW1yYyBmaWxlKVxuIgorIlVuZGVyIE1TLVdpbmRvd3MgdGhlIENUUkwtQyBrZXkgY29waWVzIHRleHQgdG8gdGhlIGNsaXBib2FyZCBhbmQgQ1RSTC1WXG4iCisicGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLiAgVGhlcmUgYXJlIGEgZmV3IG1vcmUga2V5cyBsaWtlIHRoZXNlLlxuIgorIlVuZm9ydHVuYXRlbHksIGluIFZpbSB0aGVzZSBrZXlzIG5vcm1hbGx5IGhhdmUgYW5vdGhlciBtZWFuaW5nLlxuIgorIjEuIENob29zZSB0byBoYXZlIHRoZSBrZXlzIGxpa2UgdGhleSBub3JtYWxseSBhcmUgaW4gVmltICh1c2VmdWwgaWYgeW91XG4iCisiICAgYWxzbyB1c2UgVmltIG9uIG90aGVyIHN5c3RlbXMpLlxuIgorIjIuIENob29zZSB0byBoYXZlIHRoZSBrZXlzIHdvcmsgbGlrZSB0aGV5IGFyZSB1c2VkIG9uIE1TLVdpbmRvd3MgKHVzZWZ1bFxuIgorIiAgIGlmIHlvdSBtb3N0bHkgd29yayBvbiBNUy1XaW5kb3dzKS5cbiIKKywKKyJNb3VzZSB1c2VcbiIKKyItLS0tLS0tLS1cbiIKKyIodGhpcyBjaG9pY2UgaXMgb25seSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZyBhIF92aW1yYyBmaWxlKVxuIgorIlRoZSByaWdodCBtb3VzZSBidXR0b24gY2FuIGJlIHVzZWQgaW4gdHdvIHdheXM6XG4iCisiMS4gVGhlIFVuaXggd2F5IGlzIHRvIGV4dGVuZCBhbiBleGlzdGluZyBzZWxlY3Rpb24uICBUaGUgcG9wdXAgbWVudSBpc1xuIgorIiAgIG5vdCBhdmFpbGFibGUuXG4iCisiMi4gVGhlIE1TLVdpbmRvd3Mgd2F5IGlzIHRvIHNob3cgYSBwb3B1cCBtZW51LCB3aGljaCBhbGxvd3MgeW91IHRvXG4iCisiICAgY29weS9wYXN0ZSB0ZXh0LCB1bmRvL3JlZG8sIGV0Yy4gIEV4dGVuZGluZyB0aGUgc2VsZWN0aW9uIGNhbiBzdGlsbCBiZVxuIgorIiAgIGRvbmUgYnkga2VlcGluZyBTSElGVCBwcmVzc2VkIHdoaWxlIHVzaW5nIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvblxuIgorLAorIkVkaXQtd2l0aC1WaW0gY29udGV4dCBtZW51IGVudHJ5XG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyIodGhpcyBjaG9pY2UgaXMgb25seSBhdmFpbGFibGUgd2hlbiBndmltLmV4ZSBhbmQgZ3ZpbWV4dC5kbGwgYXJlIHByZXNlbnQpXG4iCisiWW91IGNhbiBhc3NvY2lhdGUgZGlmZmVyZW50IGZpbGUgdHlwZXMgd2l0aCBWaW0sIHNvIHRoYXQgeW91IGNhbiAoZG91YmxlKVxuIgorImNsaWNrIG9uIGEgZmlsZSB0byBlZGl0IGl0IHdpdGggVmltLiAgVGhpcyBtZWFucyB5b3UgaGF2ZSB0byBpbmRpdmlkdWFsbHlcbiIKKyJzZWxlY3QgZWFjaCBmaWxlIHR5cGUuXG4iCisiQW4gYWx0ZXJuYXRpdmUgaXMgdGhlIG9wdGlvbiBvZmZlcmVkIGhlcmU6IEluc3RhbGwgYW4gXCJFZGl0IHdpdGggVmltXCJcbiIKKyJlbnRyeSBpbiB0aGUgcG9wdXAgbWVudSBmb3IgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbi4gIFRoaXMgbWVhbnMgeW91IGNhblxuIgorImVkaXQgYW55IGZpbGUgd2l0aCBWaW0uXG4iCissCisiXCJPcGVuIFdpdGguLi5cIiBjb250ZXh0IG1lbnUgZW50cnlcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorIih0aGlzIGNob2ljZSBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIGd2aW0uZXhlIGlzIHByZXNlbnQpXG4iCisiVGhpcyBvcHRpb24gYWRkcyBWaW0gdG8gdGhlIFwiT3BlbiBXaXRoLi4uXCIgZW50cnkgaW4gdGhlIHBvcHVwIG1lbnUgZm9yXG4iCisidGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbi4gIFRoaXMgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBlZGl0IEhUTUwgZmlsZXNcbiIKKyJkaXJlY3RseSBmcm9tIEludGVybmV0IEV4cGxvcmVyLlxuIgorLAorIkFkZCBWaW0gdG8gdGhlIFN0YXJ0IG1lbnVcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSW4gV2luZG93cyA5NSBhbmQgbGF0ZXIsIFZpbSBjYW4gYmUgYWRkZWQgdG8gdGhlIFN0YXJ0IG1lbnUuICBUaGlzIHdpbGxcbiIKKyJjcmVhdGUgYSBzdWJtZW51IHdpdGggYW4gZW50cnkgZm9yIHZpbSwgZ3ZpbSwgZXZpbSwgdmltZGlmZiwgZXRjLi5cbiIKKywKKyJJY29ucyBvbiB0aGUgZGVza3RvcFxuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiKHRoZXNlIGNob2ljZXMgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4gaW5zdGFsbGluZyBndmltKVxuIgorIkluIFdpbmRvd3MgOTUgYW5kIGxhdGVyLCBzaG9ydGN1dHMgKGljb25zKSBjYW4gYmUgY3JlYXRlZCBvbiB0aGUgRGVza3RvcC5cbiIKKywKKyJDcmVhdGUgcGx1Z2luIGRpcmVjdG9yaWVzXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorIlBsdWdpbiBkaXJlY3RvcmllcyBhbGxvdyBleHRlbmRpbmcgVmltIGJ5IGRyb3BwaW5nIGEgZmlsZSBpbnRvIGEgZGlyZWN0b3J5LlxuIgorIlRoaXMgY2hvaWNlIGFsbG93cyBjcmVhdGluZyB0aGVtIGluICRIT01FIChpZiB5b3UgaGF2ZSBhIGhvbWUgZGlyZWN0b3J5KSBvclxuIgorIiRWSU0gKHVzZWQgZm9yIGV2ZXJ5Ym9keSBvbiB0aGUgc3lzdGVtKS5cbiIKKywKK05VTEwKKyAgICB9OworICAgIGludAkJaTsKKyAgICBpbnQJCWM7CisKKyAgICByZXdpbmQoc3RkaW4pOworICAgIHByaW50ZigiXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpdGVtc1tpXSAhPSBOVUxMOyArK2kpCisgICAgeworCXByaW50ZihpdGVtc1tpXSk7CisJcHJpbnRmKCJcbiIpOworCXByaW50ZigiSGl0IEVudGVyIHRvIGNvbnRpbnVlLCBiIChiYWNrKSBvciBxIChxdWl0IGhlbHApOiAiKTsKKwljID0gZ2V0Y2hhcigpOworCXJld2luZChzdGRpbik7CisJaWYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKQorCXsKKwkgICAgaWYgKGkgPT0gMCkKKwkJLS1pOworCSAgICBlbHNlCisJCWkgLT0gMjsKKwl9CisJaWYgKGMgPT0gJ3EnIHx8IGMgPT0gJ1EnKQorCSAgICBicmVhazsKKwlwcmludGYoIlxuIik7CisgICAgfQorfQorCisvKgorICogSW5zdGFsbCB0aGUgY2hvaWNlcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnN0YWxsKHZvaWQpCit7CisgICAgaW50CQlpOworCisgICAgLyogSW5zdGFsbCB0aGUgc2VsZWN0ZWQgY2hvaWNlcy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hvaWNlX2NvdW50OyArK2kpCisJaWYgKGNob2ljZXNbaV0uaW5zdGFsbGZ1bmMgIT0gTlVMTCAmJiBjaG9pY2VzW2ldLmFjdGl2ZSkKKwkgICAgKGNob2ljZXNbaV0uaW5zdGFsbGZ1bmMpKGkpOworCisgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgcmVnaXN0cnksIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAoaW5zdGFsbF9wb3B1cAorCSAgICB8fCBpbnN0YWxsX29wZW53aXRoCisJICAgIHx8IChuZWVkX3VuaW5zdGFsbF9lbnRyeSAmJiBpbnRlcmFjdGl2ZSkKKwkgICAgfHwgIWludGVyYWN0aXZlKQorCWluc3RhbGxfcmVnaXN0cnkoKTsKKworI2lmZGVmIFdJTjMyNjQKKyAgICAvKiBSZWdpc3RlciBndmltIHdpdGggT0xFLiAqLworICAgIGlmIChoYXNfZ3ZpbSkKKwlpbnN0YWxsX09MRV9yZWdpc3RlcigpOworI2VuZGlmCit9CisKKy8qCisgKiByZXF1ZXN0X2Nob2ljZQorICovCisgICAgc3RhdGljIHZvaWQKK3JlcXVlc3RfY2hvaWNlKHZvaWQpCit7CisgICAgaW50CQkgICAgICBpOworCisgICAgcHJpbnRmKCJcblxuSW5zdGFsbCB3aWxsIGRvIGZvciB5b3U6XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hvaWNlX2NvdW50OyArK2kpCisgICAgICBpZiAoY2hvaWNlc1tpXS5hY3RpdmUpCisJICBwcmludGYoIiUyZCAgJXNcbiIsIGkgKyAxLCBjaG9pY2VzW2ldLnRleHQpOworICAgIHByaW50ZigiVG8gY2hhbmdlIGFuIGl0ZW0sIGVudGVyIGl0cyBudW1iZXJcblxuIik7CisgICAgcHJpbnRmKCJFbnRlciBpdGVtIG51bWJlciwgaCAoaGVscCksIGQgKGRvIGl0KSBvciBxIChxdWl0KTogIik7Cit9CisKKyAgICBpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludAkJaTsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKworICAgIC8qCisgICAgICogUnVuIGludGVyYWN0aXZlbHkgaWYgdGhlcmUgYXJlIG5vIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICovCisgICAgaWYgKGFyZ2MgPiAxKQorCWludGVyYWN0aXZlID0gMDsKKyAgICBlbHNlCisJaW50ZXJhY3RpdmUgPSAxOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGlzIHByb2dyYW0uICovCisgICAgZG9faW5pdHMoYXJndik7CisKKyNpZmRlZiBXSU4zMjY0CisgICAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLXVuaW5zdGFsbC1jaGVjayIpID09IDApCisgICAgeworCS8qIE9ubHkgY2hlY2sgZm9yIGFscmVhZHkgaW5zdGFsbGVkIFZpbXMuICBVc2VkIGJ5IE5TSVMgaW5zdGFsbGVyLiAqLworCWkgPSB1bmluc3RhbGxfY2hlY2soKTsKKworCS8qIEZpbmQgdGhlIHZhbHVlIG9mICRWSU0sIGJlY2F1c2UgTlNJUyBpc24ndCBhYmxlIHRvIGRvIHRoaXMgYnkKKwkgKiBpdHNlbGYuICovCisJZ2V0X3ZpbV9lbnYoKTsKKworCS8qIFdoZW4gbm90aGluZyBmb3VuZCBleGl0IHF1aWV0bHkuICBJZiBzb21ldGhpbmcgZm91bmQgd2FpdCBmb3IKKwkgKiByZXR1cm4gcHJlc3NlZC4gKi8KKwlpZiAoaSkKKwkgICAgbXlleGl0KDApOworCWV4aXQoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBwcmludGYoIlRoaXMgcHJvZ3JhbSBzZXRzIHVwIHRoZSBpbnN0YWxsYXRpb24gb2YgVmltICIKKwkJCQkJCSAgIFZJTV9WRVJTSU9OX01FRElVTSAiXG5cbiIpOworCisgICAgLyogQ2hlY2sgaWYgdGhlIHVzZXIgdW5wYWNrZWQgdGhlIGFyY2hpdmVzIHByb3Blcmx5LiAqLworICAgIGNoZWNrX3VucGFjaygpOworCisjaWZkZWYgV0lOMzI2NAorICAgIC8qIENoZWNrIGZvciBhbHJlYWR5IGluc3RhbGxlZCBWaW1zLiAqLworICAgIGlmIChpbnRlcmFjdGl2ZSkKKwl1bmluc3RhbGxfY2hlY2soKTsKKyNlbmRpZgorCisgICAgLyogRmluZCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbS4gKi8KKyAgICBpbnNwZWN0X3N5c3RlbSgpOworCisgICAgaWYgKGludGVyYWN0aXZlKQorICAgIHsKKwkvKiBTZXR1cCBhbGwgdGhlIGNob2ljZXMuICovCisJc2V0dXBfY2hvaWNlcygpOworCisJLyogTGV0IHRoZSB1c2VyIGNoYW5nZSBjaG9pY2VzIGFuZCBmaW5hbGx5IGluc3RhbGwgKG9yIHF1aXQpLiAqLworCWZvciAoOzspCisJeworCSAgICByZXF1ZXN0X2Nob2ljZSgpOworCSAgICByZXdpbmQoc3RkaW4pOworCSAgICBpZiAoc2NhbmYoIiU5OXMiLCBidWYpID09IDEpCisJICAgIHsKKwkJaWYgKGlzZGlnaXQoYnVmWzBdKSkKKwkJeworCQkgICAgLyogQ2hhbmdlIGEgY2hvaWNlLiAqLworCQkgICAgaSA9IGF0b2koYnVmKTsKKwkJICAgIGlmIChpID4gMCAmJiBpIDw9IGNob2ljZV9jb3VudCAmJiBjaG9pY2VzW2kgLSAxXS5hY3RpdmUpCisJCQkoY2hvaWNlc1tpIC0gMV0uY2hhbmdlZnVuYykoaSAtIDEpOworCQkgICAgZWxzZQorCQkJcHJpbnRmKCJcbklsbGVnYWwgY2hvaWNlXG4iKTsKKwkJfQorCQllbHNlIGlmIChidWZbMF0gPT0gJ2gnIHx8IGJ1ZlswXSA9PSAnSCcpCisJCXsKKwkJICAgIC8qIEhlbHAgKi8KKwkJICAgIHNob3dfaGVscCgpOworCQl9CisJCWVsc2UgaWYgKGJ1ZlswXSA9PSAnZCcgfHwgYnVmWzBdID09ICdEJykKKwkJeworCQkgICAgLyogSW5zdGFsbCEgKi8KKwkJICAgIGluc3RhbGwoKTsKKwkJICAgIHByaW50ZigiXG5UaGF0IGZpbmlzaGVzIHRoZSBpbnN0YWxsYXRpb24uICBIYXBweSBWaW1taW5nIVxuIik7CisJCSAgICBicmVhazsKKwkJfQorCQllbHNlIGlmIChidWZbMF0gPT0gJ3EnIHx8IGJ1ZlswXSA9PSAnUScpCisJCXsKKwkJICAgIC8qIFF1aXQgKi8KKwkJICAgIHByaW50ZigiXG5FeGl0aW5nIHdpdGhvdXQgYW55dGhpbmcgZG9uZVxuIik7CisJCSAgICBicmVhazsKKwkJfQorCQllbHNlCisJCSAgICBwcmludGYoIlxuSWxsZWdhbCBjaG9pY2VcbiIpOworCSAgICB9CisJfQorCXByaW50ZigiXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIFJ1biBub24taW50ZXJhY3RpdmUgLSBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2hlcworCSAqLworCWNvbW1hbmRfbGluZV9zZXR1cF9jaG9pY2VzKGFyZ2MsIGFyZ3YpOworCWluc3RhbGwoKTsKKyAgICB9CisKKyAgICBteWV4aXQoMCk7CisgICAgLypOT1RSRUFDSEVEKi8KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9kb3NpbnN0LmggYi9zcmMvZG9zaW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjRkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZG9zaW5zdC5oCkBAIC0wLDAgKzEsNjQ1IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogZG9zaW5zdC5oOiBDb21tb24gY29kZSBmb3IgZG9zaW5zdC5jIGFuZCB1bmluc3RhbC5jCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmbmRlZiBVTklYX0xJTlQKKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8Y3R5cGUuaD4KKworIyBpZm5kZWYgX19DWUdXSU5fXworIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQoV0lOMzIpCisjICBkZWZpbmUgV0lOMzI2NAorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaW5jbHVkZSA8c2hsb2JqLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGRpci5oPgorIyAgaW5jbHVkZSA8Ymlvcy5oPgorIyAgaW5jbHVkZSA8ZG9zLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFVOSVhfTElOVAorLyogUnVubmluZyBsaW50IG9uIFVuaXg6IFNvbWUgdGhpbmdzIGFyZSBtaXNzaW5nLiAqLworY2hhciAqc2VhcmNocGF0aChjaGFyICpuYW1lKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChVTklYX0xJTlQpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFVOSVhfTElOVCkKKyMgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBta2RpcigoY2hhciAqKSh4KSwgeSkKKyNlbHNlCisjIGlmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBfbWtkaXIoKGNoYXIgKikoeCkpCisjIGVsc2UKKyMgIGRlZmluZSB2aW1fbWtkaXIoeCwgeSkgbWtkaXIoKGNoYXIgKikoeCkpCisjIGVuZGlmCisjZW5kaWYKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjZGVmaW5lIEJVRlNJWkUgNTEyCQkvKiBsb25nIGVub3VnaCB0byBob2xkIGEgZmlsZSBuYW1lIHBhdGggKi8KKyNkZWZpbmUgTlVMIDAKKworI2RlZmluZSBGQUlMIDAKKyNkZWZpbmUgT0sgMQorCisjaWZuZGVmIEZBTFNFCisjIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorIyBkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2RlZmluZSBWSU1fU1RBUlRNRU5VICJQcm9ncmFtc1xcVmltICIgVklNX1ZFUlNJT05fU0hPUlQKKworaW50CWludGVyYWN0aXZlOwkJLyogbm9uLXplcm8gd2hlbiBydW5uaW5nIGludGVyYWN0aXZlbHkgKi8KKworLyoKKyAqIENhbGwgbWFsbG9jKCkgYW5kIGV4aXQgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgc3RhdGljIHZvaWQgKgorYWxsb2MoaW50IGxlbikKK3sKKyAgICBjaGFyICpzOworCisgICAgcyA9IG1hbGxvYyhsZW4pOworICAgIGlmIChzID09IE5VTEwpCisgICAgeworCXByaW50ZigiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCWV4aXQoMSk7CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKXM7Cit9CisKKy8qCisgKiBUaGUgdG91cHBlcigpIGluIEJjYyA1LjUgZG9lc24ndCB3b3JrLCB1c2Ugb3VyIG93biBpbXBsZW1lbnRhdGlvbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK215dG91cHBlcihpbnQgYykKK3sKKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJcmV0dXJuIGMgLSAnYScgKyAnQSc7CisgICAgcmV0dXJuIGM7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbXlleGl0KGludCBuKQoreworICAgIGlmICghaW50ZXJhY3RpdmUpCisgICAgeworCS8qIFByZXNlbnQgYSBwcm9tcHQsIG90aGVyd2lzZSBlcnJvciBtZXNzYWdlcyBjYW4ndCBiZSByZWFkLiAqLworCXByaW50ZigiUHJlc3MgRW50ZXIgdG8gY29udGludWVcbiIpOworCXJld2luZChzdGRpbik7CisJKHZvaWQpZ2V0Y2hhcigpOworICAgIH0KKyAgICBleGl0KG4pOworfQorCisjaWZkZWYgV0lOMzI2NAorLyogVGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESyBvciBWaXN1YWwgQysrICovCisKKyNpZm5kZWYgVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MKKyMgZGVmaW5lIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTIDEKKyNlbmRpZgorCitzdGF0aWMgRFdPUkQgZ19QbGF0Zm9ybUlkOworCisvKgorICogU2V0IGdfUGxhdGZvcm1JZCB0byBWRVJfUExBVEZPUk1fV0lOMzJfTlQgKE5UKSBvcgorICogVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MgKFdpbjk1KS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitQbGF0Zm9ybUlkKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gRkFMU0U7CisKKyAgICBpZiAoIWRvbmUpCisgICAgeworCU9TVkVSU0lPTklORk8gb3ZpOworCisJb3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yob3ZpKTsKKwlHZXRWZXJzaW9uRXgoJm92aSk7CisKKwlnX1BsYXRmb3JtSWQgPSBvdmkuZHdQbGF0Zm9ybUlkOworCWRvbmUgPSBUUlVFOworICAgIH0KK30KKworIyBpZmRlZiBfX0JPUkxBTkRDX18KKy8qIEJvcmxhbmQgZGVmaW5lcyBpdHMgb3duIHNlYXJjaHBhdGgoKSBpbiBkaXIuaCAqLworIyAgaW5jbHVkZSA8ZGlyLmg+CisjIGVsc2UKKyAgICBzdGF0aWMgY2hhciAqCitzZWFyY2hwYXRoKGNoYXIgKm5hbWUpCit7CisgICAgc3RhdGljIGNoYXIgd2lkZW5hbWVbMiAqIEJVRlNJWkVdOworICAgIHN0YXRpYyBjaGFyIGxvY2F0aW9uWzIgKiBCVUZTSVpFICsgMl07CisKKyAgICAvKiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEZpbmRFeGVjdXRhYmxlQSgpIG9uIFdpbmRvd3MgTlQuCisgICAgICogVXNlIEZpbmRFeGVjdXRhYmxlVygpIGluc3RlYWQuLi4gKi8KKyAgICBQbGF0Zm9ybUlkKCk7CisgICAgaWYgKGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpCisgICAgeworCU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCAoTFBDVFNUUiluYW1lLCAtMSwKKwkJKExQV1NUUil3aWRlbmFtZSwgQlVGU0laRSk7CisJaWYgKEZpbmRFeGVjdXRhYmxlVygoTFBDV1NUUil3aWRlbmFtZSwgKExQQ1dTVFIpIiIsCisJCSAgICAoTFBXU1RSKWxvY2F0aW9uKSA+IChISU5TVEFOQ0UpMzIpCisJeworCSAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKExQV1NUUilsb2NhdGlvbiwgLTEsCisJCSAgICAoTFBTVFIpd2lkZW5hbWUsIDIgKiBCVUZTSVpFLCBOVUxMLCBOVUxMKTsKKwkgICAgcmV0dXJuIHdpZGVuYW1lOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoRmluZEV4ZWN1dGFibGVBKChMUENUU1RSKW5hbWUsIChMUENUU1RSKSIiLAorCQkgICAgKExQVFNUUilsb2NhdGlvbikgPiAoSElOU1RBTkNFKTMyKQorCSAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDYWxsIHNlYXJjaHBhdGgoKSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGluIGFsbG9jYXRlZCBtZW1vcnksIG9yIHJldHVybiBOVUxMLgorICovCisgICAgc3RhdGljIGNoYXIgKgorc2VhcmNocGF0aF9zYXZlKGNoYXIgKm5hbWUpCit7CisgICAgY2hhcgkqcDsKKyAgICBjaGFyCSpzOworCisgICAgcCA9IHNlYXJjaHBhdGgobmFtZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBzID0gYWxsb2Moc3RybGVuKHApICsgMSk7CisgICAgc3RyY3B5KHMsIHApOworICAgIHJldHVybiBzOworfQorCisjaWZkZWYgV0lOMzI2NAorLyoKKyAqIEdldCB0aGUgcGF0aCB0byBhIHJlcXVlc3RlZCBXaW5kb3dzIHNoZWxsIGZvbGRlci4KKyAqCisgKiBSZXR1cm4gRkFJTCBvbiBlcnJvciwgT0sgb24gc3VjY2VzcworICovCisgICAgaW50CitnZXRfc2hlbGxfZm9sZGVyX3BhdGgoCisJY2hhciAqc2hlbGxfZm9sZGVyX3BhdGgsCisJY29uc3QgY2hhciAqc2hlbGxfZm9sZGVyX25hbWUpCit7CisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIHN1Y2Nlc3NmdWxseSBidWlsdCB3aXRoIG1ha2VfbXZjLm1hay4KKyAgICAgKiBUaGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgd29ya2VkIG9uIFdpbmRvd3MgOTUsIE1pbGxlbm5pdW0gRWRpdGlvbiwgYW5kCisgICAgICogMjAwMCBQcm9mZXNzaW9uYWwuICBCdXQgaXQgd2FzIGNoYW5nZWQgYWZ0ZXIgdGVzdGluZy4uLgorICAgICAqLworICAgIExQSVRFTUlETElTVCAgICBwaWRsID0gMDsgLyogUG9pbnRlciB0byBhbiBJdGVtIElEIGxpc3QgYWxsb2NhdGVkIGJlbG93ICovCisgICAgTFBNQUxMT0MJICAgIHBNYWxsb2M7ICAvKiBQb2ludGVyIHRvIGFuIElNYWxsb2MgaW50ZXJmYWNlICovCisgICAgaW50CQkgICAgY3NpZGw7CisgICAgaW50CQkgICAgYWx0X2NzaWRsID0gLTE7CisgICAgc3RhdGljIGludAkgICAgZGVza3RvcF9jc2lkbCA9IC0xOworICAgIHN0YXRpYyBpbnQJICAgIHByb2dyYW1zX2NzaWRsID0gLTE7CisgICAgaW50CQkgICAgKnBjc2lkbDsKKyAgICBpbnQJCSAgICByOworCisgICAgaWYgKHN0cmNtcChzaGVsbF9mb2xkZXJfbmFtZSwgImRlc2t0b3AiKSA9PSAwKQorICAgIHsKKwlwY3NpZGwgPSAmZGVza3RvcF9jc2lkbDsKKyNpZmRlZiBDU0lETF9DT01NT05fREVTS1RPUERJUkVDVE9SWQorCWNzaWRsID0gQ1NJRExfQ09NTU9OX0RFU0tUT1BESVJFQ1RPUlk7CisJYWx0X2NzaWRsID0gQ1NJRExfREVTS1RPUDsKKyNlbHNlCisJY3NpZGwgPSBDU0lETF9ERVNLVE9QOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAoc2hlbGxfZm9sZGVyX25hbWUsICJQcm9ncmFtcyIsIDgpID09IDApCisgICAgeworCXBjc2lkbCA9ICZwcm9ncmFtc19jc2lkbDsKKyNpZmRlZiBDU0lETF9DT01NT05fUFJPR1JBTVMKKwljc2lkbCA9IENTSURMX0NPTU1PTl9QUk9HUkFNUzsKKwlhbHRfY3NpZGwgPSBDU0lETF9QUk9HUkFNUzsKKyNlbHNlCisJY3NpZGwgPSBDU0lETF9QUk9HUkFNUzsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCXByaW50ZigiXG5FUlJPUiAoaW50ZXJuYWwpIHVucmVjb2duaXNlZCBzaGVsbF9mb2xkZXJfbmFtZTogXCIlc1wiXG5cbiIsCisJCQkJCQkJICAgc2hlbGxfZm9sZGVyX25hbWUpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIERpZCB0aGlzIHN0dWZmIGJlZm9yZSwgdXNlIHRoZSBzYW1lIElEIGFnYWluLiAqLworICAgIGlmICgqcGNzaWRsID49IDApCisgICAgeworCWNzaWRsID0gKnBjc2lkbDsKKwlhbHRfY3NpZGwgPSAtMTsKKyAgICB9CisKK3JldHJ5OgorICAgIC8qIEluaXRpYWxpemUgcG9pbnRlciB0byBJTWFsbG9jIGludGVyZmFjZSAqLworICAgIGlmIChOT0VSUk9SICE9IFNIR2V0TWFsbG9jKCZwTWFsbG9jKSkKKyAgICB7CisJcHJpbnRmKCJcbkVSUk9SIGdldHRpbmcgaW50ZXJmYWNlIGZvciBzaGVsbF9mb2xkZXJfbmFtZTogXCIlc1wiXG5cbiIsCisJCQkJCQkJICAgc2hlbGxfZm9sZGVyX25hbWUpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIEdldCBhbiBJVEVNSURMSVNUIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvbGRlciBjb2RlICovCisgICAgaWYgKE5PRVJST1IgIT0gU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oMCwgY3NpZGwsICZwaWRsKSkKKyAgICB7CisJaWYgKGFsdF9jc2lkbCA8IDAgfHwgTk9FUlJPUiAhPSBTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbigwLAorCQkJCQkJCSAgICBhbHRfY3NpZGwsICZwaWRsKSkKKwl7CisJICAgIHByaW50ZigiXG5FUlJPUiBnZXR0aW5nIElURU1JRExJU1QgZm9yIHNoZWxsX2ZvbGRlcl9uYW1lOiBcIiVzXCJcblxuIiwKKwkJCQkJCQkgICBzaGVsbF9mb2xkZXJfbmFtZSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwljc2lkbCA9IGFsdF9jc2lkbDsKKwlhbHRfY3NpZGwgPSAtMTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgdGhhdCBJVEVNSURMSVNUIHRvIGEgc3RyaW5nICovCisgICAgciA9IFNIR2V0UGF0aEZyb21JRExpc3QocGlkbCwgc2hlbGxfZm9sZGVyX3BhdGgpOworCisgICAgLyogRnJlZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggcGlkbCAqLworICAgIHBNYWxsb2MtPmxwVnRibC0+RnJlZShwTWFsbG9jLCBwaWRsKTsKKyAgICAvKiBSZWxlYXNlIHRoZSBJTWFsbG9jIGludGVyZmFjZSAqLworICAgIHBNYWxsb2MtPmxwVnRibC0+UmVsZWFzZShwTWFsbG9jKTsKKworICAgIGlmICghcikKKyAgICB7CisJaWYgKGFsdF9jc2lkbCA+PSAwKQorCXsKKwkgICAgLyogV2UgcHJvYmFibHkgZ2V0IGhlcmUgZm9yIFdpbmRvd3MgOTU6IHRoZSAiYWxsIHVzZXJzIgorCSAgICAgKiBkZXNrdG9wL3N0YXJ0IG1lbnUgZW50cnkgZG9lc24ndCBleGlzdC4gKi8KKwkgICAgY3NpZGwgPSBhbHRfY3NpZGw7CisJICAgIGFsdF9jc2lkbCA9IC0xOworCSAgICBnb3RvIHJldHJ5OworCX0KKwlwcmludGYoIlxuRVJST1IgdHJhbnNsYXRpbmcgSVRFTUlETElTVCBmb3Igc2hlbGxfZm9sZGVyX25hbWU6IFwiJXNcIlxuXG4iLAorCQkJCQkJCSAgIHNoZWxsX2ZvbGRlcl9uYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhbiBhbHRlcm5hdGl2ZTogdmVyaWZ5IHdlIGNhbiB3cml0ZSBpbiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKiBUaGlzIHNob3VsZCBjYXVzZSBhIHJldHJ5IHdoZW4gdGhlICJhbGwgdXNlcnMiIGRpcmVjdG9yeSBleGlzdHMgYnV0IHdlCisgICAgICogYXJlIGEgbm9ybWFsIHVzZXIgYW5kIGNhbid0IHdyaXRlIHRoZXJlLiAqLworICAgIGlmIChhbHRfY3NpZGwgPj0gMCkKKyAgICB7CisJY2hhciB0YnVmW0JVRlNJWkVdOworCUZJTEUgKmZkOworCisJc3RyY3B5KHRidWYsIHNoZWxsX2ZvbGRlcl9wYXRoKTsKKwlzdHJjYXQodGJ1ZiwgIlxcdmltIHdyaXRlIHRlc3QiKTsKKwlmZCA9IGZvcGVuKHRidWYsICJ3Iik7CisJaWYgKGZkID09IE5VTEwpCisJeworCSAgICBjc2lkbCA9IGFsdF9jc2lkbDsKKwkgICAgYWx0X2NzaWRsID0gLTE7CisJICAgIGdvdG8gcmV0cnk7CisJfQorCWZjbG9zZShmZCk7CisJdW5saW5rKHRidWYpOworICAgIH0KKworICAgIC8qCisgICAgICogS2VlcCB0aGUgZm91bmQgY3NpZGwgZm9yIG5leHQgdGltZSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoZQorICAgICAqIHdyaXRlIHRlc3QgZXZlcnkgdGltZS4KKyAgICAgKi8KKyAgICBpZiAoKnBjc2lkbCA8IDApCisJKnBjc2lkbCA9IGNzaWRsOworCisgICAgaWYgKHN0cm5jbXAoc2hlbGxfZm9sZGVyX25hbWUsICJQcm9ncmFtc1xcIiwgOSkgPT0gMCkKKwlzdHJjYXQoc2hlbGxfZm9sZGVyX3BhdGgsIHNoZWxsX2ZvbGRlcl9uYW1lICsgOCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIExpc3Qgb2YgdGFyZ2V0cy4gIFRoZSBmaXJzdCBvbmUgKGluZGV4IHplcm8pIGlzIHVzZWQgZm9yIHRoZSBkZWZhdWx0IHBhdGgKKyAqIGZvciB0aGUgYmF0Y2ggZmlsZXMuCisgKi8KKyNkZWZpbmUgVEFSR0VUX0NPVU5UICA4CisKK3N0cnVjdAoreworICAgIGNoYXIJKm5hbWU7CQkvKiBWaW0gZXhlIG5hbWUgKHdpdGhvdXQgLmV4ZSkgKi8KKyAgICBjaGFyCSpiYXRuYW1lOwkvKiBiYXRjaCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyCSpsbmtuYW1lOwkvKiBzaG9ydGN1dCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyCSpleGVuYW1lOwkvKiBleGUgZmlsZSBuYW1lICovCisgICAgY2hhcgkqZXhlbmFtZWFyZzsJLyogZXhlIGZpbGUgbmFtZSB3aGVuIHVzaW5nIGV4ZWFyZyAqLworICAgIGNoYXIJKmV4ZWFyZzsJLyogYXJndW1lbnQgZm9yIHZpbS5leGUgb3IgZ3ZpbS5leGUgKi8KKyAgICBjaGFyCSpvbGRiYXQ7CS8qIHBhdGggdG8gZXhpc3RpbmcgeHh4LmJhdCBvciBOVUxMICovCisgICAgY2hhcgkqb2xkZXhlOwkvKiBwYXRoIHRvIGV4aXN0aW5nIHh4eC5leGUgb3IgTlVMTCAqLworICAgIGNoYXIJYmF0cGF0aFtCVUZTSVpFXTsgIC8qIHBhdGggb2YgYmF0Y2ggZmlsZSB0byBjcmVhdGU7IG5vdAorCQkJCSAgICAgIGNyZWF0ZWQgd2hlbiBpdCdzIGVtcHR5ICovCit9IHRhcmdldHNbVEFSR0VUX0NPVU5UXSA9Cit7CisgICAgeyJhbGwiLAkiYmF0Y2ggZmlsZXMifSwKKyAgICB7InZpbSIsCSJ2aW0uYmF0IiwJIlZpbS5sbmsiLAorCQkJCQkidmltLmV4ZSIsICAgICJ2aW0uZXhlIiwgICIifSwKKyAgICB7Imd2aW0iLAkiZ3ZpbS5iYXQiLAkiZ1ZpbS5sbmsiLAorCQkJCQkiZ3ZpbS5leGUiLCAgICJndmltLmV4ZSIsICIifSwKKyAgICB7ImV2aW0iLAkiZXZpbS5iYXQiLAkiZ1ZpbSBFYXN5LmxuayIsCisJCQkJCSJldmltLmV4ZSIsICAgImd2aW0uZXhlIiwgIi15In0sCisgICAgeyJ2aWV3IiwJInZpZXcuYmF0IiwJIlZpbSBSZWFkLW9ubHkubG5rIiwKKwkJCQkJInZpZXcuZXhlIiwgICAidmltLmV4ZSIsICAiLVIifSwKKyAgICB7Imd2aWV3IiwJImd2aWV3LmJhdCIsCSJnVmltIFJlYWQtb25seS5sbmsiLAorCQkJCQkiZ3ZpZXcuZXhlIiwgICJndmltLmV4ZSIsICItUiJ9LAorICAgIHsidmltZGlmZiIsICJ2aW1kaWZmLmJhdCIsCSJWaW0gRGlmZi5sbmsiLAorCQkJCQkidmltZGlmZi5leGUiLCJ2aW0uZXhlIiwgICItZCJ9LAorICAgIHsiZ3ZpbWRpZmYiLCJndmltZGlmZi5iYXQiLAkiZ1ZpbSBEaWZmLmxuayIsCisJCQkJCSJndmltZGlmZi5leGUiLCJndmltLmV4ZSIsICItZCJ9LAorfTsKKworI2RlZmluZSBJQ09OX0NPVU5UIDMKK2NoYXIgKihpY29uX25hbWVzW0lDT05fQ09VTlRdKSA9CisJeyJnVmltICIgVklNX1ZFUlNJT05fU0hPUlQsCisJICJnVmltIEVhc3kgIiBWSU1fVkVSU0lPTl9TSE9SVCwKKwkgImdWaW0gUmVhZCBvbmx5ICIgVklNX1ZFUlNJT05fU0hPUlR9OworY2hhciAqKGljb25fbGlua19uYW1lc1tJQ09OX0NPVU5UXSkgPQorCXsiZ1ZpbSAiIFZJTV9WRVJTSU9OX1NIT1JUICIubG5rIiwKKwkgImdWaW0gRWFzeSAiIFZJTV9WRVJTSU9OX1NIT1JUICIubG5rIiwKKwkgImdWaW0gUmVhZCBvbmx5ICIgVklNX1ZFUlNJT05fU0hPUlQgIi5sbmsifTsKKworLyogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRvc2luc3QuYyBhbmQgZm9yIHVuaW5zdGFsLmMgd2hlbiBub3QgYmVpbmcgYWJsZSB0bworICogZGlyZWN0bHkgYWNjZXNzIHJlZ2lzdHJ5IGVudHJpZXMuICovCisjaWYgIWRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChET1NJTlNUKQorLyoKKyAqIFJ1biBhbiBleHRlcm5hbCBjb21tYW5kIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcnVuX2NvbW1hbmQoY2hhciAqY21kKQoreworICAgIGNoYXIJKmNtZF9wYXRoOworICAgIGNoYXIJY21kX2J1ZltCVUZTSVpFXTsKKyAgICBjaGFyCSpwOworCisgICAgLyogT24gV2luTlQsICdzdGFydCcgaXMgYSBzaGVsbCBidWlsdC1pbiBmb3IgY21kLmV4ZSByYXRoZXIgdGhhbiBhbgorICAgICAqIGV4ZWN1dGFibGUgKHN0YXJ0LmV4ZSkgbGlrZSBpbiBXaW45eC4gIERKR1BQLCBiZWluZyBhIERPUyBwcm9ncmFtLAorICAgICAqIGlzIGdpdmVuIHRoZSBDT01TUEVDIGNvbW1hbmQuY29tIGJ5IFdpbk5ULCBzbyB3ZSBoYXZlIHRvIGZpbmQKKyAgICAgKiBjbWQuZXhlIG1hbnVhbGx5IGFuZCB1c2UgaXQuICovCisgICAgY21kX3BhdGggPSBzZWFyY2hwYXRoX3NhdmUoImNtZC5leGUiKTsKKyAgICBpZiAoY21kX3BhdGggIT0gTlVMTCkKKyAgICB7CisJLyogVGhlcmUgaXMgYSBjbWQuZXhlLCBzbyB0aGlzIG1pZ2h0IGJlIFdpbmRvd3MgTlQuICBJZiBpdCBpcywKKwkgKiB3ZSBuZWVkIHRvIGNhbGwgY21kLmV4ZSBleHBsaWNpdGx5LiAgSWYgaXQgaXMgYSBsYXRlciBPUywKKwkgKiBjYWxsaW5nIGNtZC5leGUgd29uJ3QgaHVydCBpZiBpdCBpcyBwcmVzZW50LgorCSAqIEFsc28sICJ3YWl0IiBvbiBOVCBleHBlY3RzIGEgd2luZG93IHRpdGxlIGFyZ3VtZW50LgorCSAqLworCS8qIFJlcGxhY2UgdGhlIHNsYXNoZXMgd2l0aCBiYWNrc2xhc2hlcy4gKi8KKwl3aGlsZSAoKHAgPSBzdHJjaHIoY21kX3BhdGgsICcvJykpICE9IE5VTEwpCisJICAgICpwID0gJ1xcJzsKKwlzcHJpbnRmKGNtZF9idWYsICIlcyAvYyBzdGFydCBcInZpbWNtZFwiIC93ICVzIiwgY21kX3BhdGgsIGNtZCk7CisJZnJlZShjbWRfcGF0aCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogTm8gY21kLmV4ZSwganVzdCBtYWtlIHRoZSBjYWxsIGFuZCBsZXQgdGhlIHN5c3RlbSBoYW5kbGUgaXQuICovCisJc3ByaW50ZihjbWRfYnVmLCAic3RhcnQgL3cgJXMiLCBjbWQpOworICAgIH0KKyAgICBzeXN0ZW0oY21kX2J1Zik7Cit9CisjZW5kaWYKKworLyoKKyAqIEFwcGVuZCBhIGJhY2tzbGFzaCB0byAibmFtZSIgaWYgdGhlcmUgaXNuJ3Qgb25lIHlldC4KKyAqLworICAgIHN0YXRpYyB2b2lkCithZGRfcGF0aHNlcChjaGFyICpuYW1lKQoreworICAgIGludAkJbGVuID0gc3RybGVuKG5hbWUpOworCisgICAgaWYgKGxlbiA+IDAgJiYgbmFtZVtsZW4gLSAxXSAhPSAnXFwnICYmIG5hbWVbbGVuIC0gMV0gIT0gJy8nKQorCXN0cmNhdChuYW1lLCAiXFwiKTsKK30KKworLyoKKyAqIFRoZSBub3JtYWwgY2hkaXIoKSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGRlZmF1bHQgZHJpdmUuICBUaGlzIG9uZSBkb2VzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK2NoYW5nZV9kcml2ZShpbnQgZHJpdmUpCit7CisjaWZkZWYgV0lOMzI2NAorICAgIGNoYXIgdGVtcFszXSA9ICItOiI7CisgICAgdGVtcFswXSA9IChjaGFyKShkcml2ZSArICdBJyAtIDEpOworICAgIHJldHVybiAhU2V0Q3VycmVudERpcmVjdG9yeSh0ZW1wKTsKKyNlbHNlCisjIGlmbmRlZiBVTklYX0xJTlQKKyAgICB1bmlvbiBSRUdTIHJlZ3M7CisKKyAgICByZWdzLmguYWggPSAweDBlOworICAgIHJlZ3MuaC5kbCA9IGRyaXZlIC0gMTsKKyAgICBpbnRkb3MoJnJlZ3MsICZyZWdzKTsgICAvKiBzZXQgZGVmYXVsdCBkcml2ZSAqLworICAgIHJlZ3MuaC5haCA9IDB4MTk7CisgICAgaW50ZG9zKCZyZWdzLCAmcmVncyk7ICAgLyogZ2V0IGRlZmF1bHQgZHJpdmUgKi8KKyAgICBpZiAocmVncy5oLmFsID09IGRyaXZlIC0gMSkKKwlyZXR1cm4gMDsKKyMgZW5kaWYKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworLyoKKyAqIENoYW5nZSBkaXJlY3RvcnkgdG8gInBhdGgiLgorICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CittY2hfY2hkaXIoY2hhciAqcGF0aCkKK3sKKyAgICBpZiAocGF0aFswXSA9PSBOVUwpCQkvKiBqdXN0IGNoZWNraW5nLi4uICovCisJcmV0dXJuIDA7CisgICAgaWYgKHBhdGhbMV0gPT0gJzonKQkJLyogaGFzIGEgZHJpdmUgbmFtZSAqLworICAgIHsKKwlpZiAoY2hhbmdlX2RyaXZlKG15dG91cHBlcihwYXRoWzBdKSAtICdBJyArIDEpKQorCSAgICByZXR1cm4gLTE7CQkvKiBpbnZhbGlkIGRyaXZlIG5hbWUgKi8KKwlwYXRoICs9IDI7CisgICAgfQorICAgIGlmICgqcGF0aCA9PSBOVUwpCQkvKiBkcml2ZSBuYW1lIG9ubHkgKi8KKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gY2hkaXIocGF0aCk7CQkvKiBsZXQgdGhlIG5vcm1hbCBjaGRpcigpIGRvIHRoZSByZXN0ICovCit9CisKKy8qCisgKiBFeHBhbmQgdGhlIGV4ZWN1dGFibGUgbmFtZSBpbnRvIGEgZnVsbCBwYXRoIG5hbWUuCisgKi8KKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQoV0lOMzI2NCkKKworLyogT25seSBCb3JsYW5kIEMrKyBoYXMgdGhpcy4gKi8KKyMgZGVmaW5lIG15X2Z1bGxwYXRoKGIsIG4sIGwpIF9mdWxscGF0aChiLCBuLCBsKQorCisjZWxzZQorICAgIHN0YXRpYyBjaGFyICoKK215X2Z1bGxwYXRoKGNoYXIgKmJ1ZiwgY2hhciAqZm5hbWUsIGludCBsZW4pCit7CisjIGlmZGVmIFdJTjMyNjQKKyAgICAvKiBPbmx5IEdldE1vZHVsZUZpbGVOYW1lKCkgd2lsbCBnZXQgdGhlIGxvbmcgZmlsZSBuYW1lIHBhdGguCisgICAgICogR2V0RnVsbFBhdGhOYW1lKCkgbWF5IHN0aWxsIHVzZSB0aGUgc2hvcnQgKEZBVCkgbmFtZS4gKi8KKyAgICBEV09SRCBsZW5fcmVhZCA9IEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGJ1ZiwgKHNpemVfdClsZW4pOworCisgICAgcmV0dXJuIChsZW5fcmVhZCA+IDAgJiYgbGVuX3JlYWQgPCAoRFdPUkQpbGVuKSA/IGJ1ZiA6IE5VTEw7CisjIGVsc2UKKyAgICBjaGFyCW9sZGRpcltCVUZTSVpFXTsKKyAgICBjaGFyCSpwLCAqcTsKKyAgICBpbnQJCWM7CisgICAgY2hhcgkqcmV0dmFsID0gYnVmOworCisgICAgaWYgKHN0cmNocihmbmFtZSwgJzonKSAhPSBOVUxMKQkvKiBhbGxyZWFkeSBleHBhbmRlZCAqLworICAgIHsKKwlzdHJuY3B5KGJ1ZiwgZm5hbWUsIGxlbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJKmJ1ZiA9IE5VTDsKKwkvKgorCSAqIGNoYW5nZSB0byB0aGUgZGlyZWN0b3J5IGZvciBhIG1vbWVudCwKKwkgKiBhbmQgdGhlbiBkbyB0aGUgZ2V0d2QoKSAoYW5kIGdldCBiYWNrIHRvIHdoZXJlIHdlIHdlcmUpLgorCSAqIFRoaXMgd2lsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lIHdpdGggIi4uLyIgdGhpbmdzLgorCSAqLworCXAgPSBzdHJyY2hyKGZuYW1lLCAnLycpOworCXEgPSBzdHJyY2hyKGZuYW1lLCAnXFwnKTsKKwlpZiAocSAhPSBOVUxMICYmIChwID09IE5VTEwgfHwgcSA+IHApKQorCSAgICBwID0gcTsKKwlxID0gc3RycmNocihmbmFtZSwgJzonKTsKKwlpZiAocSAhPSBOVUxMICYmIChwID09IE5VTEwgfHwgcSA+IHApKQorCSAgICBwID0gcTsKKwlpZiAocCAhPSBOVUxMKQorCXsKKwkgICAgaWYgKGdldGN3ZChvbGRkaXIsIEJVRlNJWkUpID09IE5VTEwpCisJICAgIHsKKwkJcCA9IE5VTEw7CQkvKiBjYW4ndCBnZXQgY3VycmVudCBkaXI6IGRvbid0IGNoZGlyICovCisJCXJldHZhbCA9IE5VTEw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChwID09IGZuYW1lKQkJLyogL2ZuYW1lCQkqLworCQkgICAgcSA9IHAgKyAxOwkJLyogLT4gLwkJCSovCisJCWVsc2UgaWYgKHEgKyAxID09IHApCS8qIC4uLiBjOlxmb28JCSovCisJCSAgICBxID0gcCArIDE7CQkvKiAtPiBjOlwJCSovCisJCWVsc2UJCQkvKiBidXQgYzpcZm9vXGJhcgkqLworCQkgICAgcSA9IHA7CQkvKiAtPiBjOlxmb28JCSovCisKKwkJYyA9ICpxOwkJCS8qIHRydW5jYXRlIGF0IHN0YXJ0IG9mIGZuYW1lICovCisJCSpxID0gTlVMOworCQlpZiAobWNoX2NoZGlyKGZuYW1lKSkJLyogY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgKi8KKwkJICAgIHJldHZhbCA9IE5VTEw7CisJCWVsc2UKKwkJeworCQkgICAgZm5hbWUgPSBxOworCQkgICAgaWYgKGMgPT0gJ1xcJykJLyogaWYgd2UgY3V0IHRoZSBuYW1lIGF0IGEgKi8KKwkJCWZuYW1lKys7CS8qICdcJywgZG9uJ3QgYWRkIGl0IGFnYWluICovCisJCX0KKwkJKnEgPSBjOworCSAgICB9CisJfQorCWlmIChnZXRjd2QoYnVmLCBsZW4pID09IE5VTEwpCisJeworCSAgICByZXR2YWwgPSBOVUxMOworCSAgICAqYnVmID0gTlVMOworCX0KKwkvKgorCSAqIENvbmNhdGVuYXRlIHRoZSBmaWxlIG5hbWUgdG8gdGhlIHBhdGguCisJICovCisJaWYgKHN0cmxlbihidWYpICsgc3RybGVuKGZuYW1lKSA+PSBsZW4gLSAxKQorCXsKKwkgICAgcHJpbnRmKCJFUlJPUjogRmlsZSBuYW1lIHRvbyBsb25nIVxuIik7CisJICAgIG15ZXhpdCgxKTsKKwl9CisJYWRkX3BhdGhzZXAoYnVmKTsKKwlzdHJjYXQoYnVmLCBmbmFtZSk7CisJaWYgKHApCisJICAgIG1jaF9jaGRpcihvbGRkaXIpOworICAgIH0KKworICAgIC8qIFJlcGxhY2UgZm9yd2FyZCBzbGFzaGVzIHdpdGggYmFja3NsYXNoZXMsIHJlcXVpcmVkIGZvciB0aGUgcGF0aCB0byBhCisgICAgICogY29tbWFuZC4gKi8KKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIoYnVmLCAnLycpKSAhPSBOVUxMKQorCSpwID0gJ1xcJzsKKworICAgIHJldHVybiByZXR2YWw7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIFJlbW92ZSB0aGUgdGFpbCBmcm9tIGEgZmlsZSBvciBkaXJlY3RvcnkgbmFtZS4KKyAqIFB1dHMgYSBOVUwgb24gdGhlIGxhc3QgJy8nIG9yICdcJy4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZW1vdmVfdGFpbChjaGFyICpwYXRoKQoreworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IHN0cmxlbihwYXRoKSAtIDE7IGkgPiAwOyAtLWkpCisJaWYgKHBhdGhbaV0gPT0gJy8nIHx8IHBhdGhbaV0gPT0gJ1xcJykKKwl7CisJICAgIHBhdGhbaV0gPSBOVUw7CisJICAgIGJyZWFrOworCX0KK30KKworCitjaGFyCWluc3RhbGxkaXJbQlVGU0laRV07CS8qIHRvcCBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpciwgd2hlcmUgdGhlCisJCQkJICAgaW5zdGFsbC5leGUgaXMgbG9jYXRlZCwgRS5nLjoKKwkJCQkgICAiYzpcdmltXHZpbTYwIiAqLworaW50CXJ1bnRpbWVpZHg7CQkvKiBpbmRleCBpbiBpbnN0YWxsZGlyW10gd2hlcmUgInZpbTYwIiBzdGFydHMgKi8KK2NoYXIJKnN5c2RyaXZlOwkJLyogc3lzdGVtIGRyaXZlIG9yICJjOlwiICovCisKKy8qCisgKiBTZXR1cCBmb3IgdXNpbmcgdGhpcyBwcm9ncmFtLgorICogU2V0cyAiaW5zdGFsbGRpcltdIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkb19pbml0cyhjaGFyICoqYXJndikKK3sKKyNpZmRlZiBESkdQUAorICAgIC8qCisgICAgICogVXNlIExvbmcgRmlsZSBOYW1lcyBieSBkZWZhdWx0LCBpZiAkTEZOIG5vdCBzZXQuCisgICAgICovCisgICAgaWYgKGdldGVudigiTEZOIikgPT0gTlVMTCkKKwlwdXRlbnYoIkxGTj15Iik7CisjZW5kaWYKKworICAgIC8qIEZpbmQgb3V0IHRoZSBmdWxsIHBhdGggb2Ygb3VyIGV4ZWN1dGFibGUuICovCisgICAgaWYgKG15X2Z1bGxwYXRoKGluc3RhbGxkaXIsIGFyZ3ZbMF0sIEJVRlNJWkUpID09IE5VTEwpCisgICAgeworCXByaW50ZigiRVJST1I6IENhbm5vdCBnZXQgbmFtZSBvZiBleGVjdXRhYmxlXG4iKTsKKwlteWV4aXQoMSk7CisgICAgfQorICAgIC8qIHJlbW92ZSB0aGUgdGFpbCwgdGhlIGV4ZWN1dGFibGUgbmFtZSAiaW5zdGFsbC5leGUiICovCisgICAgcmVtb3ZlX3RhaWwoaW5zdGFsbGRpcik7CisKKyAgICAvKiBjaGFuZ2UgdG8gdGhlIGluc3RhbGxkaXIgKi8KKyAgICBtY2hfY2hkaXIoaW5zdGFsbGRpcik7CisKKyAgICAvKiBGaW5kIHRoZSBzeXN0ZW0gZHJpdmUuICBPbmx5IHVzZWQgZm9yIHNlYXJjaGluZyB0aGUgVmltIGV4ZWN1dGFibGUsIG5vdAorICAgICAqIHZlcnkgaW1wb3J0YW50LiAqLworICAgIHN5c2RyaXZlID0gZ2V0ZW52KCJTWVNURU1EUklWRSIpOworICAgIGlmIChzeXNkcml2ZSA9PSBOVUxMIHx8ICpzeXNkcml2ZSA9PSBOVUwpCisJc3lzZHJpdmUgPSAiQzpcXCI7Cit9CmRpZmYgLS1naXQgYS9zcmMvZWRpdC5jIGIvc3JjL2VkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQyZjVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VkaXQuYwpAQCAtMCwwICsxLDc2MTQgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIGVkaXQuYzogZnVuY3Rpb25zIGZvciBJbnNlcnQgbW9kZQorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorLyoKKyAqIGRlZmluaXRpb25zIHVzZWQgZm9yIENUUkwtWCBzdWJtb2RlCisgKi8KKyNkZWZpbmUgQ1RSTF9YX1dBTlRfSURFTlQJMHgxMDAKKworI2RlZmluZSBDVFJMX1hfTk9UX0RFRklORURfWUVUCTEKKyNkZWZpbmUgQ1RSTF9YX1NDUk9MTAkJMgorI2RlZmluZSBDVFJMX1hfV0hPTEVfTElORQkzCisjZGVmaW5lIENUUkxfWF9GSUxFUwkJNAorI2RlZmluZSBDVFJMX1hfVEFHUwkJKDUgKyBDVFJMX1hfV0FOVF9JREVOVCkKKyNkZWZpbmUgQ1RSTF9YX1BBVEhfUEFUVEVSTlMJKDYgKyBDVFJMX1hfV0FOVF9JREVOVCkKKyNkZWZpbmUgQ1RSTF9YX1BBVEhfREVGSU5FUwkoNyArIENUUkxfWF9XQU5UX0lERU5UKQorI2RlZmluZSBDVFJMX1hfRklOSVNIRUQJCTgKKyNkZWZpbmUgQ1RSTF9YX0RJQ1RJT05BUlkJKDkgKyBDVFJMX1hfV0FOVF9JREVOVCkKKyNkZWZpbmUgQ1RSTF9YX1RIRVNBVVJVUwkoMTAgKyBDVFJMX1hfV0FOVF9JREVOVCkKKyNkZWZpbmUgQ1RSTF9YX0NNRExJTkUJCTExCisKKyNkZWZpbmUgQ0hFQ0tfS0VZU19USU1FCQkzMAorCisjZGVmaW5lIENUUkxfWF9NU0coaSkgY3RybF94X21zZ3NbKGkpICYgfkNUUkxfWF9XQU5UX0lERU5UXQorCitzdGF0aWMgY2hhciAqY3RybF94X21zZ3NbXSA9Cit7CisgICAgTl8oIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIiksIC8qIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLiAqLworICAgIE5fKCIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiKSwKKyAgICAvKiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyAgICAgKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvICovCisgICAgTl8oIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OXlApIiksCisgICAgTl8oIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5MXk5eUCkiKSwKKyAgICBOXygiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRl5OXlApIiksCisgICAgTl8oIiBUYWcgY29tcGxldGlvbiAoXl1eTl5QKSIpLAorICAgIE5fKCIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OXlApIiksCisgICAgTl8oIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EXk5eUCkiKSwKKyAgICBOVUxMLAorICAgIE5fKCIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheS15OXlApIiksCisgICAgTl8oIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlReTl5QKSIpLAorICAgIE5fKCIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WXk5eUCkiKQorfTsKKworc3RhdGljIGNoYXJfdSBlX2hpdGVuZFtdID0gTl8oIkhpdCBlbmQgb2YgcGFyYWdyYXBoIik7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBvbmUgbWF0Y2ggZm9yIGluc2VydCBjb21wbGV0aW9uLgorICovCitzdHJ1Y3QgQ29tcGxldGlvbgoreworICAgIHN0cnVjdCBDb21wbGV0aW9uCSpuZXh0OworICAgIHN0cnVjdCBDb21wbGV0aW9uCSpwcmV2OworICAgIGNoYXJfdQkJKnN0cjsJICAvKiBtYXRjaGVkIHRleHQgKi8KKyAgICBjaGFyX3UJCSpmbmFtZTsJICAvKiBmaWxlIGNvbnRhaW5pbmcgdGhlIG1hdGNoICovCisgICAgaW50CQkJb3JpZ2luYWw7IC8qIE9SSUdJTkFMX1RFWFQsIENPTlRfU19JUE9TIG9yIEZSRUVfRk5BTUUgKi8KKyAgICBpbnQJCQludW1iZXI7CSAgLyogc2VxdWVuY2UgbnVtYmVyICovCit9OworCisvKiB0aGUgb3JpZ2luYWwgdGV4dCB3aGVuIHRoZSBleHBhbnNpb24gYmVndW4gKi8KKyNkZWZpbmUgT1JJR0lOQUxfVEVYVAkoMSkKKyNkZWZpbmUgRlJFRV9GTkFNRQkoMikKKworLyoKKyAqIEFsbCB0aGUgY3VycmVudCBtYXRjaGVzIGFyZSBzdG9yZWQgaW4gYSBsaXN0LgorICogImZpcnN0X21hdGNoIiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgorICogImN1cnJfbWF0Y2giIHBvaW50cyB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVudHJ5LgorICogInNob3duX21hdGNoIiBpcyBkaWZmZXJlbnQgZnJvbSBjdXJyX21hdGNoIGR1cmluZyBpbnNfY29tcGxfZ2V0X2V4cCgpLgorICovCitzdGF0aWMgc3RydWN0IENvbXBsZXRpb24gICAgKmZpcnN0X21hdGNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgQ29tcGxldGlvbiAgICAqY3Vycl9tYXRjaCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IENvbXBsZXRpb24gICAgKnNob3duX21hdGNoID0gTlVMTDsKKworc3RhdGljIGludAkJICAgIHN0YXJ0ZWRfY29tcGxldGlvbiA9IEZBTFNFOworc3RhdGljIGludAkJICAgIGNvbXBsZXRpb25fbWF0Y2hlcyA9IDA7CitzdGF0aWMgY2hhcl91CQkgICAgKmNvbXBsZXRlX3BhdCA9IE5VTEw7CitzdGF0aWMgaW50CQkgICAgY29tcGxldGVfZGlyZWN0aW9uID0gRk9SV0FSRDsKK3N0YXRpYyBpbnQJCSAgICBzaG93bl9kaXJlY3Rpb24gPSBGT1JXQVJEOworc3RhdGljIGludAkJICAgIGNvbXBsZXRpb25fcGVuZGluZyA9IEZBTFNFOworc3RhdGljIHBvc19UCQkgICAgaW5pdGlhbF9wb3M7CitzdGF0aWMgY29sbnJfVAkJICAgIGNvbXBsZXRlX2NvbCA9IDA7CS8qIGNvbHVtbiB3aGVyZSB0aGUgdGV4dCBzdGFydHMKKwkJCQkJCSAgIHRoYXQgaXMgYmVpbmcgY29tcGxldGVkICovCitzdGF0aWMgaW50CQkgICAgc2F2ZV9zbTsKK3N0YXRpYyBjaGFyX3UJCSAgICAqb3JpZ2luYWxfdGV4dCA9IE5VTEw7ICAvKiB0ZXh0IGJlZm9yZSBjb21wbGV0aW9uICovCitzdGF0aWMgaW50CQkgICAgY29udGludWVfbW9kZSA9IDA7CitzdGF0aWMgZXhwYW5kX1QJCSAgICBjb21wbGV0ZV94cDsKKworc3RhdGljIGludCAgaW5zX2NvbXBsX2FkZCBfX0FSR1MoKGNoYXJfdSAqc3RyLCBpbnQgbGVuLCBjaGFyX3UgKiwgaW50IGRpciwgaW50IHJldXNlKSk7CitzdGF0aWMgdm9pZCBpbnNfY29tcGxfYWRkX21hdGNoZXMgX19BUkdTKChpbnQgbnVtX21hdGNoZXMsIGNoYXJfdSAqKm1hdGNoZXMsIGludCBkaXIpKTsKK3N0YXRpYyBpbnQgIGluc19jb21wbF9tYWtlX2N5Y2xpYyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGluc19jb21wbF9kaWN0aW9uYXJpZXMgX19BUkdTKChjaGFyX3UgKmRpY3QsIGNoYXJfdSAqcGF0LCBpbnQgZGlyLCBpbnQgZmxhZ3MsIGludCB0aGVzYXVydXMpKTsKK3N0YXRpYyB2b2lkIGluc19jb21wbF9mcmVlIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX2NvbXBsX2NsZWFyIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX2NvbXBsX3ByZXAgX19BUkdTKChpbnQgYykpOworc3RhdGljIGJ1Zl9UICppbnNfY29tcGxfbmV4dF9idWYgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgZmxhZykpOworc3RhdGljIGludCAgaW5zX2NvbXBsX2dldF9leHAgX19BUkdTKChwb3NfVCAqaW5pLCBpbnQgZGlyKSk7CitzdGF0aWMgdm9pZCBpbnNfY29tcGxfZGVsZXRlIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX2NvbXBsX2luc2VydCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgIGluc19jb21wbF9uZXh0IF9fQVJHUygoaW50IGFsbG93X2dldF9leHBhbnNpb24pKTsKK3N0YXRpYyBpbnQgIGluc19jb21wbGV0ZSBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50ICBxdW90ZV9tZXRhIF9fQVJHUygoY2hhcl91ICpkZXN0LCBjaGFyX3UgKnN0ciwgaW50IGxlbikpOworI2VuZGlmIC8qIEZFQVRfSU5TX0VYUEFORCAqLworCisjZGVmaW5lIEJBQ0tTUEFDRV9DSEFSCQkgICAgMQorI2RlZmluZSBCQUNLU1BBQ0VfV09SRAkJICAgIDIKKyNkZWZpbmUgQkFDS1NQQUNFX1dPUkRfTk9UX1NQQUNFICAgIDMKKyNkZWZpbmUgQkFDS1NQQUNFX0xJTkUJCSAgICA0CisKK3N0YXRpYyB2b2lkIGluc19yZWRyYXcgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBpbnNfY3RybF92IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgdW5kaXNwbGF5X2RvbGxhciBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGluc2VydF9zcGVjaWFsIF9fQVJHUygoaW50LCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgY2hlY2tfYXV0b19mb3JtYXQgX19BUkdTKChpbnQpKTsKK3N0YXRpYyB2b2lkIHJlZG9fbGl0ZXJhbCBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgdm9pZCBzdGFydF9hcnJvdyBfX0FSR1MoKHBvc19UICplbmRfaW5zZXJ0X3BvcykpOworc3RhdGljIHZvaWQgc3RvcF9pbnNlcnQgX19BUkdTKChwb3NfVCAqZW5kX2luc2VydF9wb3MsIGludCBlc2MpKTsKK3N0YXRpYyBpbnQgIGVjaGVja19hYmJyIF9fQVJHUygoaW50KSk7CitzdGF0aWMgdm9pZCByZXBsYWNlX3B1c2hfb2ZmIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgIHJlcGxhY2VfcG9wIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgcmVwbGFjZV9qb2luIF9fQVJHUygoaW50IG9mZikpOworc3RhdGljIHZvaWQgcmVwbGFjZV9wb3BfaW5zIF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyB2b2lkIG1iX3JlcGxhY2VfcG9wX2lucyBfX0FSR1MoKGludCBjYykpOworI2VuZGlmCitzdGF0aWMgdm9pZCByZXBsYWNlX2ZsdXNoIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgcmVwbGFjZV9kb19icyBfX0FSR1MoKHZvaWQpKTsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKK3N0YXRpYyBpbnQgY2luZGVudF9vbiBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgaW5zX3JlZyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGluc19jdHJsX2cgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50ICBpbnNfZXNjIF9fQVJHUygobG9uZyAqY291bnQsIGludCBjbWRjaGFyKSk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKK3N0YXRpYyB2b2lkIGluc19jdHJsXyBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCitzdGF0aWMgaW50IGluc19zdGFydF9zZWxlY3QgX19BUkdTKChpbnQgYykpOworI2VuZGlmCitzdGF0aWMgdm9pZCBpbnNfc2hpZnQgX19BUkdTKChpbnQgYywgaW50IGxhc3RjKSk7CitzdGF0aWMgdm9pZCBpbnNfZGVsIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCAgaW5zX2JzIF9fQVJHUygoaW50IGMsIGludCBtb2RlLCBpbnQgKmluc2VydGVkX3NwYWNlX3ApKTsKKyNpZmRlZiBGRUFUX01PVVNFCitzdGF0aWMgdm9pZCBpbnNfbW91c2UgX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQgaW5zX21vdXNlc2Nyb2xsIF9fQVJHUygoaW50IHVwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGluc19sZWZ0IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX2hvbWUgX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQgaW5zX2VuZCBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgdm9pZCBpbnNfc19sZWZ0IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX3JpZ2h0IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaW5zX3NfcmlnaHQgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBpbnNfdXAgX19BUkdTKChpbnQgc3RhcnRjb2wpKTsKK3N0YXRpYyB2b2lkIGluc19wYWdldXAgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBpbnNfZG93biBfX0FSR1MoKGludCBzdGFydGNvbCkpOworc3RhdGljIHZvaWQgaW5zX3BhZ2Vkb3duIF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfRE5ECitzdGF0aWMgdm9pZCBpbnNfZHJvcCBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorc3RhdGljIGludCAgaW5zX3RhYiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgIGluc19lb2wgX19BUkdTKChpbnQgYykpOworI2lmZGVmIEZFQVRfRElHUkFQSFMKK3N0YXRpYyBpbnQgIGluc19kaWdyYXBoIF9fQVJHUygodm9pZCkpOworI2VuZGlmCitzdGF0aWMgaW50ICBpbnNfY29weWNoYXIgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorc3RhdGljIHZvaWQgaW5zX3RyeV9zaSBfX0FSR1MoKGludCBjKSk7CisjZW5kaWYKK3N0YXRpYyBjb2xucl9UIGdldF9ub2xpc3RfdmlydGNvbCBfX0FSR1MoKHZvaWQpKTsKKworc3RhdGljIGNvbG5yX1QJSW5zc3RhcnRfdGV4dGxlbjsJLyogbGVuZ3RoIG9mIGxpbmUgd2hlbiBpbnNlcnQgc3RhcnRlZCAqLworc3RhdGljIGNvbG5yX1QJSW5zc3RhcnRfYmxhbmtfdmNvbDsJLyogdmNvbCBmb3IgZmlyc3QgaW5zZXJ0ZWQgYmxhbmsgKi8KKworc3RhdGljIGNoYXJfdQkqbGFzdF9pbnNlcnQgPSBOVUxMOwkvKiB0aGUgdGV4dCBvZiB0aGUgcHJldmlvdXMgaW5zZXJ0LAorCQkJCQkgICBLX1NQRUNJQUwgYW5kIENTSSBhcmUgZXNjYXBlZCAqLworc3RhdGljIGludAlsYXN0X2luc2VydF9za2lwOyAvKiBuciBvZiBjaGFycyBpbiBmcm9udCBvZiBwcmV2aW91cyBpbnNlcnQgKi8KK3N0YXRpYyBpbnQJbmV3X2luc2VydF9za2lwOyAgLyogbnIgb2YgY2hhcnMgaW4gZnJvbnQgb2YgY3VycmVudCBpbnNlcnQgKi8KKworI2lmZGVmIEZFQVRfQ0lOREVOVAorc3RhdGljIGludAljYW5fY2luZGVudDsJCS8qIG1heSBkbyBjaW5kZW50aW5nIG9uIHRoaXMgbGluZSAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQJb2xkX2luZGVudCA9IDA7CQkvKiBmb3IgXl5EIGNvbW1hbmQgaW4gaW5zZXJ0IG1vZGUgKi8KKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCitpbnQJCXJldmluc19vbjsJCS8qIHJldmVyc2UgaW5zZXJ0IG1vZGUgb24gKi8KK2ludAkJcmV2aW5zX2NoYXJzOwkJLyogaG93IG11Y2ggdG8gc2tpcCBhZnRlciBlZGl0ICovCitpbnQJCXJldmluc19sZWdhbDsJCS8qIHdhcyB0aGUgbGFzdCBjaGFyICdsZWdhbCc/ICovCitpbnQJCXJldmluc19zY29sOwkJLyogc3RhcnQgY29sdW1uIG9mIHJldmlucyBzZXNzaW9uICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQorc3RhdGljIHNob3J0CXByZXZpb3VzX3NjcmlwdCA9IHNtUm9tYW47CisjZW5kaWYKKworc3RhdGljIGludAlpbnNfbmVlZF91bmRvOwkJLyogY2FsbCB1X3NhdmUoKSBiZWZvcmUgaW5zZXJ0aW5nIGEKKwkJCQkJICAgY2hhci4gIFNldCB3aGVuIGVkaXQoKSBpcyBjYWxsZWQuCisJCQkJCSAgIGFmdGVyIHRoYXQgYXJyb3dfdXNlZCBpcyB1c2VkLiAqLworCitzdGF0aWMgaW50CWRpZF9hZGRfc3BhY2UgPSBGQUxTRTsJLyogYXV0b19mb3JtYXQoKSBhZGRlZCBhbiBleHRyYSBzcGFjZQorCQkJCQkgICB1bmRlciB0aGUgY3Vyc29yICovCisKKy8qCisgKiBlZGl0KCk6IFN0YXJ0IGluc2VydGluZyB0ZXh0LgorICoKKyAqICJjbWRjaGFyIiBjYW4gYmU6CisgKiAnaScJbm9ybWFsIGluc2VydCBjb21tYW5kCisgKiAnYScJbm9ybWFsIGFwcGVuZCBjb21tYW5kCisgKiAnUicJcmVwbGFjZSBjb21tYW5kCisgKiAncicJInI8Q1I+IiBjb21tYW5kOiBpbnNlcnQgb25lIDxDUj4uICBOb3RlOiBjb3VudCBjYW4gYmUgPiAxLCBmb3IgcmVkbywKKyAqCWJ1dCBzdGlsbCBvbmx5IG9uZSA8Q1I+IGlzIGluc2VydGVkLiAgVGhlIDxFc2M+IGlzIG5vdCB1c2VkIGZvciByZWRvLgorICogJ2cnCSJnSSIgY29tbWFuZC4KKyAqICdWJwkiZ1IiIGNvbW1hbmQgZm9yIFZpcnR1YWwgUmVwbGFjZSBtb2RlLgorICogJ3YnCSJnciIgY29tbWFuZCBmb3Igc2luZ2xlIGNoYXJhY3RlciBWaXJ0dWFsIFJlcGxhY2UgbW9kZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgcmVjdXJzaXZlbHkuICBGb3IgQ1RSTC1PIGNvbW1hbmRzLCBpdCByZXR1cm5zCisgKiBhbmQgbGV0cyB0aGUgY2FsbGVyIGhhbmRsZSB0aGUgTm9ybWFsLW1vZGUgY29tbWFuZC4KKyAqCisgKiBSZXR1cm4gVFJVRSBpZiBhIENUUkwtTyBjb21tYW5kIGNhdXNlZCB0aGUgcmV0dXJuIChpbnNlcnQgbW9kZSBwZW5kaW5nKS4KKyAqLworICAgIGludAorZWRpdChjbWRjaGFyLCBzdGFydGxuLCBjb3VudCkKKyAgICBpbnQJCWNtZGNoYXI7CisgICAgaW50CQlzdGFydGxuOwkvKiBpZiBzZXQsIGluc2VydCBhdCBzdGFydCBvZiBsaW5lICovCisgICAgbG9uZwljb3VudDsKK3sKKyAgICBpbnQJCWMgPSAwOworICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJbGFzdGM7CisgICAgY29sbnJfVAltaW5jb2w7CisgICAgc3RhdGljIGxpbmVucl9UIG9fbG51bSA9IDA7CisgICAgc3RhdGljIGludAlvX2VvbCA9IEZBTFNFOworICAgIGludAkJaTsKKyAgICBpbnQJCWRpZF9iYWNrc3BhY2UgPSBUUlVFOwkgICAgLyogcHJldmlvdXMgY2hhciB3YXMgYmFja3NwYWNlICovCisjaWZkZWYgRkVBVF9DSU5ERU5UCisgICAgaW50CQlsaW5lX2lzX3doaXRlID0gRkFMU0U7CSAgICAvKiBsaW5lIGlzIGVtcHR5IGJlZm9yZSBpbnNlcnQgKi8KKyNlbmRpZgorICAgIGxpbmVucl9UCW9sZF90b3BsaW5lID0gMDsJICAgIC8qIHRvcGxpbmUgYmVmb3JlIGluc2VydGlvbiAqLworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJb2xkX3RvcGZpbGwgPSAtMTsKKyNlbmRpZgorICAgIGludAkJaW5zZXJ0ZWRfc3BhY2UgPSBGQUxTRTsgICAgIC8qIGp1c3QgaW5zZXJ0ZWQgYSBzcGFjZSAqLworICAgIGludAkJcmVwbGFjZVN0YXRlID0gUkVQTEFDRTsKKyAgICBpbnQJCWRpZF9yZXN0YXJ0X2VkaXQgPSByZXN0YXJ0X2VkaXQ7CisKKyAgICAvKiBzbGVlcCBiZWZvcmUgcmVkcmF3aW5nLCBuZWVkZWQgZm9yICJDVFJMLU8gOiIgdGhhdCByZXN1bHRzIGluIGFuCisgICAgICogZXJyb3IgbWVzc2FnZSAqLworICAgIGNoZWNrX2Zvcl9kZWxheShUUlVFKTsKKworI2lmZGVmIEhBVkVfU0FOREJPWAorICAgIC8qIERvbid0IGFsbG93IGluc2VydGluZyBpbiB0aGUgc2FuZGJveC4gKi8KKyAgICBpZiAoc2FuZGJveCAhPSAwKQorICAgIHsKKwlFTVNHKF8oZV9zYW5kYm94KSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisgICAgaW5zX2NvbXBsX2NsZWFyKCk7CSAgICAvKiBjbGVhciBzdHVmZiBmb3IgQ1RSTC1YIG1vZGUgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIC8qCisgICAgICogV2hlbiBkb2luZyBhIHBhc3RlIHdpdGggdGhlIG1pZGRsZSBtb3VzZSBidXR0b24sIEluc3N0YXJ0IGlzIHNldCB0bworICAgICAqIHdoZXJlIHRoZSBwYXN0ZSBzdGFydGVkLgorICAgICAqLworICAgIGlmICh3aGVyZV9wYXN0ZV9zdGFydGVkLmxudW0gIT0gMCkKKwlJbnNzdGFydCA9IHdoZXJlX3Bhc3RlX3N0YXJ0ZWQ7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCUluc3N0YXJ0ID0gY3Vyd2luLT53X2N1cnNvcjsKKwlpZiAoc3RhcnRsbikKKwkgICAgSW5zc3RhcnQuY29sID0gMDsKKyAgICB9CisgICAgSW5zc3RhcnRfdGV4dGxlbiA9IGxpbmV0YWJzaXplKG1sX2dldF9jdXJsaW5lKCkpOworICAgIEluc3N0YXJ0X2JsYW5rX3Zjb2wgPSBNQVhDT0w7CisgICAgaWYgKCFkaWRfYWkpCisJYWlfY29sID0gMDsKKworICAgIGlmIChjbWRjaGFyICE9IE5VTCAmJiByZXN0YXJ0X2VkaXQgPT0gMCkKKyAgICB7CisJUmVzZXRSZWRvYnVmZigpOworCUFwcGVuZE51bWJlclRvUmVkb2J1ZmYoY291bnQpOworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwlpZiAoY21kY2hhciA9PSAnVicgfHwgY21kY2hhciA9PSAndicpCisJeworCSAgICAvKiAiZ1IiIG9yICJnciIgY29tbWFuZCAqLworCSAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZignZycpOworCSAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZigoY21kY2hhciA9PSAndicpID8gJ3InIDogJ1InKTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZihjbWRjaGFyKTsKKwkgICAgaWYgKGNtZGNoYXIgPT0gJ2cnKQkJICAgIC8qICJnSSIgY29tbWFuZCAqLworCQlBcHBlbmRDaGFyVG9SZWRvYnVmZignSScpOworCSAgICBlbHNlIGlmIChjbWRjaGFyID09ICdyJykJICAgIC8qICJyPENSPiIgY29tbWFuZCAqLworCQljb3VudCA9IDE7CQkgICAgLyogaW5zZXJ0IG9ubHkgb25lIDxDUj4gKi8KKwl9CisgICAgfQorCisgICAgaWYgKGNtZGNoYXIgPT0gJ1InKQorICAgIHsKKyNpZmRlZiBGRUFUX0ZLTUFQCisJaWYgKHBfZmttYXAgJiYgcF9yaSkKKwl7CisJICAgIGJlZXBfZmx1c2goKTsKKwkgICAgRU1TRyhmYXJzaV90ZXh0XzMpOwkgICAgLyogZW5jb2RlZCBpbiBGYXJzaSAqLworCSAgICBTdGF0ZSA9IElOU0VSVDsKKwl9CisJZWxzZQorI2VuZGlmCisJU3RhdGUgPSBSRVBMQUNFOworICAgIH0KKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisgICAgZWxzZSBpZiAoY21kY2hhciA9PSAnVicgfHwgY21kY2hhciA9PSAndicpCisgICAgeworCVN0YXRlID0gVlJFUExBQ0U7CisJcmVwbGFjZVN0YXRlID0gVlJFUExBQ0U7CisJb3JpZ19saW5lX2NvdW50ID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJdnJfbGluZXNfY2hhbmdlZCA9IDE7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorCVN0YXRlID0gSU5TRVJUOworCisgICAgc3RvcF9pbnNlcnRfbW9kZSA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBOZWVkIHRvIHJlY29tcHV0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLCBpdCBtaWdodCBtb3ZlIHdoZW4gdGhlIGN1cnNvciBpcworICAgICAqIG9uIGEgVEFCIG9yIHNwZWNpYWwgY2hhcmFjdGVyLgorICAgICAqLworICAgIGN1cnNfY29sdW1ucyhUUlVFKTsKKworICAgIC8qCisgICAgICogRW5hYmxlIGxhbmdtYXAgb3IgSU1FLCBpbmRpY2F0ZWQgYnkgJ2ltaW5zZXJ0Jy4KKyAgICAgKiBOb3RlIHRoYXQgSU1FIG1heSBlbmFibGVkL2Rpc2FibGVkIHdpdGhvdXQgdXMgbm90aWNpbmcgaGVyZSwgdGh1cyB0aGUKKyAgICAgKiAnaW1pbnNlcnQnIHZhbHVlIG1heSBub3QgcmVmbGVjdCB3aGF0IGlzIGFjdHVhbGx5IHVzZWQuICBJdCBpcyB1cGRhdGVkCisgICAgICogd2hlbiBoaXR0aW5nIDxFc2M+LgorICAgICAqLworICAgIGlmIChjdXJidWYtPmJfcF9pbWluc2VydCA9PSBCX0lNT0RFX0xNQVApCisJU3RhdGUgfD0gTEFOR01BUDsKKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorICAgIGltX3NldF9hY3RpdmUoY3VyYnVmLT5iX3BfaW1pbnNlcnQgPT0gQl9JTU9ERV9JTSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQorICAgIEtleVNjcmlwdChwcmV2aW91c19zY3JpcHQpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgc2V0bW91c2UoKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgY2xlYXJfc2hvd2NtZCgpOworI2VuZGlmCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICAvKiB0aGVyZSBpcyBubyByZXZlcnNlIHJlcGxhY2UgbW9kZSAqLworICAgIHJldmluc19vbiA9IChTdGF0ZSA9PSBJTlNFUlQgJiYgcF9yaSk7CisgICAgaWYgKHJldmluc19vbikKKwl1bmRpc3BsYXlfZG9sbGFyKCk7CisgICAgcmV2aW5zX2NoYXJzID0gMDsKKyAgICByZXZpbnNfbGVnYWwgPSAwOworICAgIHJldmluc19zY29sID0gLTE7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSGFuZGxlIHJlc3RhcnRpbmcgSW5zZXJ0IG1vZGUuCisgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgIkNUUkwtTyAuIiAocmVwZWF0IGFuIGluc2VydCk6IHdlIGdldCBoZXJlIHdpdGgKKyAgICAgKiByZXN0YXJ0X2VkaXQgbm9uLXplcm8sIGFuZCBzb21ldGhpbmcgaW4gdGhlIHN0dWZmIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpZiAocmVzdGFydF9lZGl0ICE9IDAgJiYgc3R1ZmZfZW1wdHkoKSkKKyAgICB7CisjaWZkZWYgRkVBVF9NT1VTRQorCS8qCisJICogQWZ0ZXIgYSBwYXN0ZSB3ZSBjb25zaWRlciB0ZXh0IHR5cGVkIHRvIGJlIHBhcnQgb2YgdGhlIGluc2VydCBmb3IKKwkgKiB0aGUgcGFzdGVkIHRleHQuIFlvdSBjYW4gYmFja3NwYWNlIG92ZXIgdGhlIHBhc3RlZCB0ZXh0IHRvby4KKwkgKi8KKwlpZiAod2hlcmVfcGFzdGVfc3RhcnRlZC5sbnVtKQorCSAgICBhcnJvd191c2VkID0gRkFMU0U7CisJZWxzZQorI2VuZGlmCisJICAgIGFycm93X3VzZWQgPSBUUlVFOworCXJlc3RhcnRfZWRpdCA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBjdXJzb3Igd2FzIGFmdGVyIHRoZSBlbmQtb2YtbGluZSBiZWZvcmUgdGhlIENUUkwtTyBhbmQgaXQgaXMKKwkgKiBub3cgYXQgdGhlIGVuZC1vZi1saW5lLCBwdXQgaXQgYWZ0ZXIgdGhlIGVuZC1vZi1saW5lICh0aGlzIGlzIG5vdAorCSAqIGNvcnJlY3QgaW4gdmVyeSByYXJlIGNhc2VzKS4KKwkgKiBBbHNvIGRvIHRoaXMgaWYgY3Vyc3dhbnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZpcnR1YWwKKwkgKiBjb2x1bW4uICBFZyBhZnRlciAiXk8kIiBvciAiXk84MHwiLgorCSAqLworCXZhbGlkYXRlX3ZpcnRjb2woKTsKKwl1cGRhdGVfY3Vyc3dhbnQoKTsKKwlpZiAoKChvX2VvbCAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gb19sbnVtKQorCQkgICAgfHwgY3Vyd2luLT53X2N1cnN3YW50ID4gY3Vyd2luLT53X3ZpcnRjb2wpCisJCSYmICoocHRyID0gbWxfZ2V0X2N1cmxpbmUoKSArIGN1cndpbi0+d19jdXJzb3IuY29sKSAhPSBOVUwpCisJeworCSAgICBpZiAocHRyWzFdID09IE5VTCkKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGVsc2UgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlpID0gKCptYl9wdHIybGVuX2NoZWNrKShwdHIpOworCQlpZiAocHRyW2ldID09IE5VTCkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sICs9IGk7CisJICAgIH0KKyNlbmRpZgorCX0KKwlvX2VvbCA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlCisJYXJyb3dfdXNlZCA9IEZBTFNFOworCisgICAgLyogd2UgYXJlIGluIGluc2VydCBtb2RlIG5vdywgZG9uJ3QgbmVlZCB0byBzdGFydCBpdCBhbnltb3JlICovCisgICAgbmVlZF9zdGFydF9pbnNlcnRtb2RlID0gRkFMU0U7CisKKyAgICAvKiBOZWVkIHRvIHNhdmUgdGhlIGxpbmUgZm9yIHVuZG8gYmVmb3JlIGluc2VydGluZyB0aGUgZmlyc3QgY2hhci4gKi8KKyAgICBpbnNfbmVlZF91bmRvID0gVFJVRTsKKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICB3aGVyZV9wYXN0ZV9zdGFydGVkLmxudW0gPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9DSU5ERU5UCisgICAgY2FuX2NpbmRlbnQgPSBUUlVFOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyogVGhlIGN1cnNvciBsaW5lIGlzIG5vdCBpbiBhIGNsb3NlZCBmb2xkLCB1bmxlc3MgJ2luc2VydG1vZGUnIGlzIHNldCBvcgorICAgICAqIHJlc3RhcnRpbmcuICovCisgICAgaWYgKCFwX2ltICYmIGRpZF9yZXN0YXJ0X2VkaXQgPT0gMCkKKwlmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIElmICdzaG93bW9kZScgaXMgc2V0LCBzaG93IHRoZSBjdXJyZW50IChpbnNlcnQvcmVwbGFjZS8uLikgbW9kZS4KKyAgICAgKiBBIHdhcm5pbmcgbWVzc2FnZSBmb3IgY2hhbmdpbmcgYSByZWFkb25seSBmaWxlIGlzIGdpdmVuIGhlcmUsIGJlZm9yZQorICAgICAqIGFjdHVhbGx5IGNoYW5naW5nIGFueXRoaW5nLiAgSXQncyBwdXQgYWZ0ZXIgdGhlIG1vZGUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBpID0gMDsKKyAgICBpZiAocF9zbWQpCisJaSA9IHNob3dtb2RlKCk7CisKKyAgICBpZiAoIXBfaW0gJiYgZGlkX3Jlc3RhcnRfZWRpdCA9PSAwKQorCWNoYW5nZV93YXJuaW5nKGkgKyAxKTsKKworI2lmZGVmIENVUlNPUl9TSEFQRQorICAgIHVpX2N1cnNvcl9zaGFwZSgpOwkJLyogbWF5IHNob3cgZGlmZmVyZW50IGN1cnNvciBzaGFwZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUdSQVBIUworICAgIGRvX2RpZ3JhcGgoLTEpOwkJLyogY2xlYXIgZGlncmFwaHMgKi8KKyNlbmRpZgorCisvKgorICogR2V0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgcmVkbyBidWZmZXIsIHRob3NlIGNoYXJhY3RlcnMgaGF2ZSB0byBiZQorICogc2tpcHBlZCBpZiB3ZSB3YW50IHRvIGdldCB0byB0aGUgaW5zZXJ0ZWQgY2hhcmFjdGVycy4KKyAqLworICAgIHB0ciA9IGdldF9pbnNlcnRlZCgpOworICAgIGlmIChwdHIgPT0gTlVMTCkKKwluZXdfaW5zZXJ0X3NraXAgPSAwOworICAgIGVsc2UKKyAgICB7CisJbmV3X2luc2VydF9za2lwID0gKGludClTVFJMRU4ocHRyKTsKKwl2aW1fZnJlZShwdHIpOworICAgIH0KKworICAgIG9sZF9pbmRlbnQgPSAwOworCisgICAgLyoKKyAgICAgKiBNYWluIGxvb3AgaW4gSW5zZXJ0IG1vZGU6IHJlcGVhdCB1bnRpbCBJbnNlcnQgbW9kZSBpcyBsZWZ0LgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJaWYgKCFyZXZpbnNfbGVnYWwpCisJICAgIHJldmluc19zY29sID0gLTE7CSAgICAvKiByZXNldCBvbiBpbGxlZ2FsIG1vdGlvbnMgKi8KKwllbHNlCisJICAgIHJldmluc19sZWdhbCA9IDA7CisjZW5kaWYKKwlpZiAoYXJyb3dfdXNlZCkJICAgIC8qIGRvbid0IHJlcGVhdCBpbnNlcnQgd2hlbiBhcnJvdyBrZXkgdXNlZCAqLworCSAgICBjb3VudCA9IDA7CisKKwlpZiAoc3RvcF9pbnNlcnRfbW9kZSkKKwl7CisJICAgIC8qICI6c3RvcGluc2VydCIgdXNlZCBvciAnaW5zZXJ0bW9kZScgcmVzZXQgKi8KKwkgICAgY291bnQgPSAwOworCSAgICBnb3RvIGRvRVNDa2V5OworCX0KKworCS8qIHNldCBjdXJ3aW4tPndfY3Vyc3dhbnQgZm9yIG5leHQgS19ET1dOIG9yIEtfVVAgKi8KKwlpZiAoIWFycm93X3VzZWQpCisJICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCisJLyogSWYgdGhlcmUgaXMgbm8gdHlwZWFoZWFkIG1heSBjaGVjayBmb3IgdGltZXN0YW1wcyAoZS5nLiwgZm9yIHdoZW4gYQorCSAqIG1lbnUgaW52b2tlZCBhIHNoZWxsIGNvbW1hbmQpLiAqLworCWlmIChzdHVmZl9lbXB0eSgpKQorCXsKKwkgICAgZGlkX2NoZWNrX3RpbWVzdGFtcHMgPSBGQUxTRTsKKwkgICAgaWYgKG5lZWRfY2hlY2tfdGltZXN0YW1wcykKKwkJY2hlY2tfdGltZXN0YW1wcyhGQUxTRSk7CisJfQorCisJLyoKKwkgKiBXaGVuIGVtc2coKSB3YXMgY2FsbGVkIG1zZ19zY3JvbGwgd2lsbCBoYXZlIGJlZW4gc2V0LgorCSAqLworCW1zZ19zY3JvbGwgPSBGQUxTRTsKKworI2lmZGVmIEZFQVRfR1VJCisJLyogV2hlbiAnbW91c2Vmb2N1cycgaXMgc2V0IGEgbW91c2UgbW92ZW1lbnQgbWF5IGhhdmUgdGFrZW4gdXMgdG8KKwkgKiBhbm90aGVyIHdpbmRvdy4gICJuZWVkX21vdXNlX2NvcnJlY3QiIG1heSB0aGVuIGJlIHNldCBiZWNhdXNlIG9mIGFuCisJICogYXV0b2NvbW1hbmQuICovCisJaWYgKG5lZWRfbW91c2VfY29ycmVjdCkKKwkgICAgZ3VpX21vdXNlX2NvcnJlY3QoKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GT0xESU5HCisJLyogT3BlbiBmb2xkIGF0IHRoZSBjdXJzb3IgbGluZSwgYWNjb3JkaW5nIHRvICdmb2xkb3BlbicuICovCisJaWYgKGZkb19mbGFncyAmIEZET19JTlNFUlQpCisJICAgIGZvbGRPcGVuQ3Vyc29yKCk7CisJLyogQ2xvc2UgZm9sZHMgd2hlcmUgdGhlIGN1cnNvciBpc24ndCwgYWNjb3JkaW5nIHRvICdmb2xkY2xvc2UnICovCisJaWYgKCFjaGFyX2F2YWlsKCkpCisJICAgIGZvbGRDaGVja0Nsb3NlKCk7CisjZW5kaWYKKworCS8qCisJICogSWYgd2UgaW5zZXJ0ZWQgYSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24gb2YgdGhlIGxhc3QgbGluZSBpbgorCSAqIHRoZSB3aW5kb3csIHNjcm9sbCB0aGUgd2luZG93IG9uZSBsaW5lIHVwLiBUaGlzIGF2b2lkcyBhbiBleHRyYQorCSAqIHJlZHJhdy4KKwkgKiBUaGlzIGlzIGRldGVjdGVkIHdoZW4gdGhlIGN1cnNvciBjb2x1bW4gaXMgc21hbGxlciBhZnRlciBpbnNlcnRpbmcKKwkgKiBzb21ldGhpbmcuCisJICogRG9uJ3QgZG8gdGhpcyB3aGVuIHRoZSB0b3BsaW5lIGNoYW5nZWQgYWxyZWFkeSwgaXQgaGFzCisJICogYWxyZWFkeSBiZWVuIGFkanVzdGVkIChieSBpbnNlcnRjaGFyKCkgY2FsbGluZyBvcGVuX2xpbmUoKSkpLgorCSAqLworCWlmIChjdXJidWYtPmJfbW9kX3NldAorCQkmJiBjdXJ3aW4tPndfcF93cmFwCisJCSYmICFkaWRfYmFja3NwYWNlCisJCSYmIGN1cndpbi0+d190b3BsaW5lID09IG9sZF90b3BsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJCSYmIGN1cndpbi0+d190b3BmaWxsID09IG9sZF90b3BmaWxsCisjZW5kaWYKKwkJKQorCXsKKwkgICAgbWluY29sID0gY3Vyd2luLT53X3djb2w7CisJICAgIHZhbGlkYXRlX2N1cnNvcl9jb2woKTsKKworCSAgICBpZiAoKGludCljdXJ3aW4tPndfd2NvbCA8IChpbnQpbWluY29sIC0gY3VyYnVmLT5iX3BfdHMKKwkJICAgICYmIGN1cndpbi0+d193cm93ID09IFdfV0lOUk9XKGN1cndpbikKKwkJCQkJCSArIGN1cndpbi0+d19oZWlnaHQgLSAxIC0gcF9zbworCQkgICAgJiYgKGN1cndpbi0+d19jdXJzb3IubG51bSAhPSBjdXJ3aW4tPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkJfHwgY3Vyd2luLT53X3RvcGZpbGwgPiAwCisjZW5kaWYKKwkJICAgICkpCisJICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJaWYgKGN1cndpbi0+d190b3BmaWxsID4gMCkKKwkJICAgIC0tY3Vyd2luLT53X3RvcGZpbGw7CisJCWVsc2UKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCQlpZiAoaGFzRm9sZGluZyhjdXJ3aW4tPndfdG9wbGluZSwgTlVMTCwgJm9sZF90b3BsaW5lKSkKKwkJICAgIHNldF90b3BsaW5lKGN1cndpbiwgb2xkX3RvcGxpbmUgKyAxKTsKKwkJZWxzZQorI2VuZGlmCisJCSAgICBzZXRfdG9wbGluZShjdXJ3aW4sIGN1cndpbi0+d190b3BsaW5lICsgMSk7CisJICAgIH0KKwl9CisKKwkvKiBNYXkgbmVlZCB0byBhZGp1c3Qgd190b3BsaW5lIHRvIHNob3cgdGhlIGN1cnNvci4gKi8KKwl1cGRhdGVfdG9wbGluZSgpOworCisJZGlkX2JhY2tzcGFjZSA9IEZBTFNFOworCisJdmFsaWRhdGVfY3Vyc29yKCk7CQkvKiBtYXkgc2V0IG11c3RfcmVkcmF3ICovCisKKwkvKgorCSAqIFJlZHJhdyB0aGUgZGlzcGxheSB3aGVuIG5vIGNoYXJhY3RlcnMgYXJlIHdhaXRpbmcuCisJICogQWxzbyBzaG93cyBtb2RlLCBydWxlciBhbmQgcG9zaXRpb25zIGN1cnNvci4KKwkgKi8KKwlpbnNfcmVkcmF3KCk7CisKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwlpZiAoY3Vyd2luLT53X3Bfc2NiKQorCSAgICBkb19jaGVja19zY3JvbGxiaW5kKFRSVUUpOworI2VuZGlmCisKKwl1cGRhdGVfY3Vyc3dhbnQoKTsKKwlvbGRfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorCW9sZF90b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CisjZW5kaWYKKworI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisJZG9udF9zY3JvbGwgPSBGQUxTRTsJCS8qIGFsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKworCS8qCisJICogR2V0IGEgY2hhcmFjdGVyIGZvciBJbnNlcnQgbW9kZS4KKwkgKi8KKwlsYXN0YyA9IGM7CQkJLyogcmVtZW1iZXIgcHJldmlvdXMgY2hhciBmb3IgQ1RSTC1EICovCisJYyA9IHNhZmVfdmdldGMoKTsKKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJaWYgKHBfaGttYXAgJiYgS2V5VHlwZWQpCisJICAgIGMgPSBoa21hcChjKTsJCS8qIEhlYnJldyBtb2RlIG1hcHBpbmcgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfRktNQVAKKwlpZiAocF9ma21hcCAmJiBLZXlUeXBlZCkKKwkgICAgYyA9IGZrbWFwKGMpOwkJLyogRmFyc2kgbW9kZSBtYXBwaW5nICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCS8qIFByZXBhcmUgZm9yIG9yIHN0b3AgQ1RSTC1YIG1vZGUuICBUaGlzIGRvZXNuJ3QgZG8gY29tcGxldGlvbiwgYnV0CisJICogaXQgZG9lcyBmaXggdXAgdGhlIHRleHQgd2hlbiBmaW5pc2hpbmcgY29tcGxldGlvbi4gKi8KKwlpbnNfY29tcGxfcHJlcChjKTsKKyNlbmRpZgorCisJLyogQ1RSTC1cIENUUkwtTiBnb2VzIHRvIE5vcm1hbCBtb2RlLCBDVFJMLVwgQ1RSTC1HIGdvZXMgdG8gbW9kZQorCSAqIHNlbGVjdGVkIHdpdGggJ2luc2VydG1vZGUnLiAgKi8KKwlpZiAoYyA9PSBDdHJsX0JTTCkKKwl7CisJICAgIC8qIG1heSBuZWVkIHRvIHJlZHJhdyB3aGVuIG5vIG1vcmUgY2hhcnMgYXZhaWxhYmxlIG5vdyAqLworCSAgICBpbnNfcmVkcmF3KCk7CisJICAgICsrbm9fbWFwcGluZzsKKwkgICAgKythbGxvd19rZXlzOworCSAgICBjID0gc2FmZV92Z2V0YygpOworCSAgICAtLW5vX21hcHBpbmc7CisJICAgIC0tYWxsb3dfa2V5czsKKwkgICAgaWYgKGMgIT0gQ3RybF9OICYmIGMgIT0gQ3RybF9HKQkvKiBpdCdzIHNvbWV0aGluZyBlbHNlICovCisJICAgIHsKKwkJdnVuZ2V0YyhjKTsKKwkJYyA9IEN0cmxfQlNMOworCSAgICB9CisJICAgIGVsc2UgaWYgKGMgPT0gQ3RybF9HICYmIHBfaW0pCisJCWNvbnRpbnVlOworCSAgICBlbHNlCisJICAgIHsKKwkJY291bnQgPSAwOworCQlnb3RvIGRvRVNDa2V5OworCSAgICB9CisJfQorCisjaWZkZWYgRkVBVF9ESUdSQVBIUworCWMgPSBkb19kaWdyYXBoKGMpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwlpZiAoKGMgPT0gQ3RybF9WIHx8IGMgPT0gQ3RybF9RKSAmJiBjdHJsX3hfbW9kZSA9PSBDVFJMX1hfQ01ETElORSkKKwkgICAgZ290byBkb2NvbXBsZXRlOworI2VuZGlmCisJaWYgKGMgPT0gQ3RybF9WIHx8IGMgPT0gQ3RybF9RKQorCXsKKwkgICAgaW5zX2N0cmxfdigpOworCSAgICBjID0gQ3RybF9WOwkvKiBwcmV0ZW5kIENUUkwtViBpcyBsYXN0IHR5cGVkIGNoYXJhY3RlciAqLworCSAgICBjb250aW51ZTsKKwl9CisKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwlpZiAoY2luZGVudF9vbigpCisjIGlmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkmJiBjdHJsX3hfbW9kZSA9PSAwCisjIGVuZGlmCisJICAgKQorCXsKKwkgICAgLyogQSBrZXkgbmFtZSBwcmVjZWRlZCBieSBhIGJhbmcgbWVhbnMgdGhpcyBrZXkgaXMgbm90IHRvIGJlCisJICAgICAqIGluc2VydGVkLiAgU2tpcCBhaGVhZCB0byB0aGUgcmUtaW5kZW50aW5nIGJlbG93LgorCSAgICAgKiBBIGtleSBuYW1lIHByZWNlZGVkIGJ5IGEgc3RhciBtZWFucyB0aGF0IGluZGVudGluZyBoYXMgdG8gYmUKKwkgICAgICogZG9uZSBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBrZXkuICovCisJICAgIGxpbmVfaXNfd2hpdGUgPSBpbmluZGVudCgwKTsKKwkgICAgaWYgKGluX2NpbmtleXMoYywgJyEnLCBsaW5lX2lzX3doaXRlKSkKKwkJZ290byBmb3JjZV9jaW5kZW50OworCSAgICBpZiAoY2FuX2NpbmRlbnQgJiYgaW5fY2lua2V5cyhjLCAnKicsIGxpbmVfaXNfd2hpdGUpCisJCQkJCQkJJiYgc3RvcF9hcnJvdygpID09IE9LKQorCQlkb19jX2V4cHJfaW5kZW50KCk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCWlmIChjdXJ3aW4tPndfcF9ybCkKKwkgICAgc3dpdGNoIChjKQorCSAgICB7CisJCWNhc2UgS19MRUZUOgljID0gS19SSUdIVDsgYnJlYWs7CisJCWNhc2UgS19TX0xFRlQ6CWMgPSBLX1NfUklHSFQ7IGJyZWFrOworCQljYXNlIEtfQ19MRUZUOgljID0gS19DX1JJR0hUOyBicmVhazsKKwkJY2FzZSBLX1JJR0hUOgljID0gS19MRUZUOyBicmVhazsKKwkJY2FzZSBLX1NfUklHSFQ6IGMgPSBLX1NfTEVGVDsgYnJlYWs7CisJCWNhc2UgS19DX1JJR0hUOiBjID0gS19DX0xFRlQ7IGJyZWFrOworCSAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklTVUFMCisJLyoKKwkgKiBJZiAna2V5bW9kZWwnIGNvbnRhaW5zICJzdGFydHNlbCIsIG1heSBzdGFydCBzZWxlY3Rpb24uICBJZiBpdAorCSAqIGRvZXMsIGEgQ1RSTC1PIGFuZCBjIHdpbGwgYmUgc3R1ZmZlZCwgd2UgbmVlZCB0byBnZXQgdGhlc2UKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWlmIChpbnNfc3RhcnRfc2VsZWN0KGMpKQorCSAgICBjb250aW51ZTsKKyNlbmRpZgorCisJLyoKKwkgKiBUaGUgYmlnIHN3aXRjaCB0byBoYW5kbGUgYSBjaGFyYWN0ZXIgaW4gaW5zZXJ0IG1vZGUuCisJICovCisJc3dpdGNoIChjKQorCXsKKwkvKiB0b2dnbGUgaW5zZXJ0L3JlcGxhY2UgbW9kZSAqLworCWNhc2UgS19JTlM6CisJY2FzZSBLX0tJTlM6CisjaWZkZWYgRkVBVF9GS01BUAorCSAgICBpZiAocF9ma21hcCAmJiBwX3JpKQorCSAgICB7CisJCWJlZXBfZmx1c2goKTsKKwkJRU1TRyhmYXJzaV90ZXh0XzMpOwkvKiBlbmNvZGVkIGluIEZhcnNpICovCisJCWJyZWFrOworCSAgICB9CisjZW5kaWYKKwkgICAgaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCQlTdGF0ZSA9IElOU0VSVCB8IChTdGF0ZSAmIExBTkdNQVApOworCSAgICBlbHNlCisJCVN0YXRlID0gcmVwbGFjZVN0YXRlIHwgKFN0YXRlICYgTEFOR01BUCk7CisJICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKEtfSU5TKTsKKwkgICAgc2hvd21vZGUoKTsKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKwkgICAgdWlfY3Vyc29yX3NoYXBlKCk7CQkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjZW5kaWYKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkvKiBFbnRlciBDVFJMLVggbW9kZSAqLworCWNhc2UgQ3RybF9YOgorCSAgICAvKiBDVFJMLVggYWZ0ZXIgQ1RSTC1WIENUUkwtWCBkb2Vzbid0IGRvIGFueXRoaW5nLCBzbyB0aGF0IENUUkwtWAorCSAgICAgKiBDVFJMLVYgd29ya3MgbGlrZSBDVFJMLU4gKi8KKwkgICAgaWYgKGN0cmxfeF9tb2RlICE9IENUUkxfWF9DTURMSU5FKQorCSAgICB7CisJCS8qIGlmIHRoZSBuZXh0IF5YPD4gd29uJ3QgQUREIG5vdGhpbmcsIHRoZW4gcmVzZXQKKwkJICogY29udGludWVfc3RhdHVzICovCisJCWlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX05fQUREUykKKwkJICAgIGNvbnRpbnVlX3N0YXR1cyA9IChjb250aW51ZV9zdGF0dXMgfCBDT05UX0lOVFJQVCk7CisJCWVsc2UKKwkJICAgIGNvbnRpbnVlX3N0YXR1cyA9IDA7CisJCS8qIFdlJ3JlIG5vdCBzdXJlIHdoaWNoIENUUkwtWCBtb2RlIGl0IHdpbGwgYmUgeWV0ICovCisJCWN0cmxfeF9tb2RlID0gQ1RSTF9YX05PVF9ERUZJTkVEX1lFVDsKKwkJZWRpdF9zdWJtb2RlID0gKGNoYXJfdSAqKV8oQ1RSTF9YX01TRyhjdHJsX3hfbW9kZSkpOworCQllZGl0X3N1Ym1vZGVfcHJlID0gTlVMTDsKKwkJc2hvd21vZGUoKTsKKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZgorCisJLyogZW5kIG9mIFNlbGVjdCBtb2RlIG1hcHBpbmcgLSBpZ25vcmUgKi8KKwljYXNlIEtfU0VMRUNUOgorCSAgICBicmVhazsKKworCS8qIHN1c3BlbmQgd2hlbiAnaW5zZXJ0bW9kZScgc2V0ICovCisJY2FzZSBDdHJsX1o6CisJICAgIGlmICghcF9pbSkKKwkJZ290byBub3JtYWxjaGFyOwkvKiBpbnNlcnQgQ1RSTC1aIGFzIG5vcm1hbCBjaGFyICovCisJICAgIHN0dWZmUmVhZGJ1ZmYoKGNoYXJfdSAqKSI6c3RcciIpOworCSAgICBjID0gQ3RybF9POworCSAgICAvKkZBTExUSFJPVUdIKi8KKworCS8qIGV4ZWN1dGUgb25lIGNvbW1hbmQgKi8KKwljYXNlIEN0cmxfTzoKKwkgICAgaWYgKGVjaGVja19hYmJyKEN0cmxfTyArIEFCQlJfT0ZGKSkKKwkJYnJlYWs7CisJICAgIGNvdW50ID0gMDsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJCXJlc3RhcnRfZWRpdCA9ICdWJzsKKwkgICAgZWxzZQorI2VuZGlmCisJCWlmIChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKwkJcmVzdGFydF9lZGl0ID0gJ1InOworCSAgICBlbHNlCisJCXJlc3RhcnRfZWRpdCA9ICdJJzsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJICAgIGlmICh2aXJ0dWFsX2FjdGl2ZSgpKQorCQlvX2VvbCA9IEZBTFNFOwkgICAgLyogY3Vyc29yIGFsd2F5cyBrZWVwcyBpdHMgY29sdW1uICovCisJICAgIGVsc2UKKyNlbmRpZgorCQlvX2VvbCA9IChnY2hhcl9jdXJzb3IoKSA9PSBOVUwpOworCSAgICBnb3RvIGRvRVNDa2V5OworCisjaWZkZWYgRkVBVF9TTklGRgorCWNhc2UgS19TTklGRjoKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoS19TTklGRik7CisJICAgIGdvdG8gZG9FU0NrZXk7CisjZW5kaWYKKworCS8qIEhpdHRpbmcgdGhlIGhlbHAga2V5IGluIGluc2VydCBtb2RlIGlzIGxpa2UgPEVTQz4gPEhlbHA+ICovCisJY2FzZSBLX0hFTFA6CisJY2FzZSBLX0YxOgorCWNhc2UgS19YRjE6CisJICAgIHN0dWZmY2hhclJlYWRidWZmKEtfSEVMUCk7CisJICAgIGlmIChwX2ltKQorCQluZWVkX3N0YXJ0X2luc2VydG1vZGUgPSBUUlVFOworCSAgICBnb3RvIGRvRVNDa2V5OworCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJY2FzZSBLX0YyMToKKwkgICAgKytub19tYXBwaW5nOwkJLyogZG9uJ3QgbWFwIHRoZSBuZXh0IGtleSBoaXRzICovCisJICAgIGkgPSBzYWZlX3ZnZXRjKCk7CisJICAgIC0tbm9fbWFwcGluZzsKKwkgICAgbmV0YmVhbnNfa2V5Y29tbWFuZChpKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCS8qIGFuIGVzY2FwZSBlbmRzIGlucHV0IG1vZGUgKi8KKwljYXNlIEVTQzoKKwkgICAgaWYgKGVjaGVja19hYmJyKEVTQyArIEFCQlJfT0ZGKSkKKwkJYnJlYWs7CisJICAgIC8qRkFMTFRIUk9VR0gqLworCisJY2FzZSBDdHJsX0M6CisjaWZkZWYgRkVBVF9DTURXSU4KKwkgICAgaWYgKGMgPT0gQ3RybF9DICYmIGNtZHdpbl90eXBlICE9IDApCisJICAgIHsKKwkJLyogQ2xvc2UgdGhlIGNtZGxpbmUgd2luZG93LiAqLworCQljbWR3aW5fcmVzdWx0ID0gS19JR05PUkU7CisJCWdvdF9pbnQgPSBGQUxTRTsgLyogZG9uJ3Qgc3RvcCBleGVjdXRpbmcgYXV0b2NvbW1hbmRzIGV0IGFsLiAqLworCQlnb3RvIGRvRVNDa2V5OworCSAgICB9CisjZW5kaWYKKworI2lmZGVmIFVOSVgKK2RvX2ludHI6CisjZW5kaWYKKwkgICAgLyogd2hlbiAnaW5zZXJ0bW9kZScgc2V0LCBhbmQgbm90IGhhbGZ3YXkgYSBtYXBwaW5nLCBkb24ndCBsZWF2ZQorCSAgICAgKiBJbnNlcnQgbW9kZSAqLworCSAgICBpZiAoZ290b19pbSgpKQorCSAgICB7CisJCWlmIChnb3RfaW50KQorCQl7CisJCSAgICAodm9pZCl2Z2V0YygpOwkJLyogZmx1c2ggYWxsIGJ1ZmZlcnMgKi8KKwkJICAgIGdvdF9pbnQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCSAgICB2aW1fYmVlcCgpOworCQlicmVhazsKKwkgICAgfQorZG9FU0NrZXk6CisJICAgIC8qCisJICAgICAqIFRoaXMgaXMgdGhlIE9OTFkgcmV0dXJuIGZyb20gZWRpdCgpIQorCSAgICAgKi8KKwkgICAgLyogQWx3YXlzIHVwZGF0ZSBvX2xudW0sIHNvIHRoYXQgYSAiQ1RSTC1PIC4iIHRoYXQgYWRkcyBhIGxpbmUKKwkgICAgICogc3RpbGwgcHV0cyB0aGUgY3Vyc29yIGJhY2sgYWZ0ZXIgdGhlIGluc2VydGVkIHRleHQuICovCisJICAgIGlmIChvX2VvbCAmJiBnY2hhcl9jdXJzb3IoKSA9PSBOVUwpCisJCW9fbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKworCSAgICBpZiAoaW5zX2VzYygmY291bnQsIGNtZGNoYXIpKQorCQlyZXR1cm4gKGMgPT0gQ3RybF9PKTsKKwkgICAgY29udGludWU7CisKKwkvKgorCSAqIEluc2VydCB0aGUgcHJldmlvdXNseSBpbnNlcnRlZCB0ZXh0LgorCSAqIEZvciBeQCB0aGUgdHJhaWxpbmcgRVNDIHdpbGwgZW5kIHRoZSBpbnNlcnQsIHVubGVzcyB0aGVyZSBpcyBhbgorCSAqIGVycm9yLgorCSAqLworCWNhc2UgS19aRVJPOgorCWNhc2UgTlVMOgorCWNhc2UgQ3RybF9BOgorCSAgICBpZiAoc3R1ZmZfaW5zZXJ0ZWQoTlVMLCAxTCwgKGMgPT0gQ3RybF9BKSkgPT0gRkFJTAorCQkJCQkJICAgJiYgYyAhPSBDdHJsX0EgJiYgIXBfaW0pCisJCWdvdG8gZG9FU0NrZXk7CQkvKiBxdWl0IGluc2VydCBtb2RlICovCisJICAgIGluc2VydGVkX3NwYWNlID0gRkFMU0U7CisJICAgIGJyZWFrOworCisJLyogaW5zZXJ0IHRoZSBjb250ZW50cyBvZiBhIHJlZ2lzdGVyICovCisJY2FzZSBDdHJsX1I6CisJICAgIGluc19yZWcoKTsKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCSAgICBpbnNlcnRlZF9zcGFjZSA9IEZBTFNFOworCSAgICBicmVhazsKKworCWNhc2UgQ3RybF9HOgorCSAgICBpbnNfY3RybF9nKCk7CisJICAgIGJyZWFrOworCisJY2FzZSBDdHJsX0hBVDoKKwkgICAgaWYgKG1hcF90b19leGlzdHNfbW9kZSgoY2hhcl91ICopIiIsIExBTkdNQVApKQorCSAgICB7CisJCS8qICI6bG1hcCIgbWFwcGluZ3MgZXhpc3RzLCBUb2dnbGUgdXNlIG9mICI6bG1hcCIgbWFwcGluZ3MuICovCisJCWlmIChTdGF0ZSAmIExBTkdNQVApCisJCXsKKwkJICAgIGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0ID0gQl9JTU9ERV9OT05FOworCQkgICAgU3RhdGUgJj0gfkxBTkdNQVA7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjdXJidWYtPmJfcF9pbWluc2VydCA9IEJfSU1PREVfTE1BUDsKKwkJICAgIFN0YXRlIHw9IExBTkdNQVA7CisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKwkJICAgIGltX3NldF9hY3RpdmUoRkFMU0UpOworI2VuZGlmCisJCX0KKwkgICAgfQorI2lmZGVmIFVTRV9JTV9DT05UUk9MCisJICAgIGVsc2UKKwkgICAgeworCQkvKiBUaGVyZSBhcmUgbm8gIjpsbWFwIiBtYXBwaW5ncywgdG9nZ2xlIElNICovCisJCWlmIChpbV9nZXRfc3RhdHVzKCkpCisJCXsKKwkJICAgIGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0ID0gQl9JTU9ERV9OT05FOworCQkgICAgaW1fc2V0X2FjdGl2ZShGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjdXJidWYtPmJfcF9pbWluc2VydCA9IEJfSU1PREVfSU07CisJCSAgICBTdGF0ZSAmPSB+TEFOR01BUDsKKwkJICAgIGltX3NldF9hY3RpdmUoVFJVRSk7CisJCX0KKwkgICAgfQorI2VuZGlmCisJICAgIHNldF9pbWluc2VydF9nbG9iYWwoKTsKKwkgICAgc2hvd21vZGUoKTsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICAvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlIG9yIGNvbG9yICovCisJICAgIGlmIChndWkuaW5fdXNlKQorCQlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX0tFWU1BUCkKKwkgICAgLyogU2hvdy91bnNob3cgdmFsdWUgb2YgJ2tleW1hcCcgaW4gc3RhdHVzIGxpbmVzLiAqLworCSAgICBzdGF0dXNfcmVkcmF3X2N1cmJ1ZigpOworI2VuZGlmCisJICAgIGJyZWFrOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwljYXNlIEN0cmxfXzoKKwkgICAgaWYgKCFwX2FyaSkKKwkJZ290byBub3JtYWxjaGFyOworCSAgICBpbnNfY3RybF8oKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCS8qIE1ha2UgaW5kZW50IG9uZSBzaGlmdHdpZHRoIHNtYWxsZXIuICovCisJY2FzZSBDdHJsX0Q6CisjaWYgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpICYmIGRlZmluZWQoRkVBVF9GSU5EX0lEKQorCSAgICBpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX1BBVEhfREVGSU5FUykKKwkJZ290byBkb2NvbXBsZXRlOworI2VuZGlmCisJICAgIC8qIEZBTExUSFJPVUdIICovCisKKwkvKiBNYWtlIGluZGVudCBvbmUgc2hpZnR3aWR0aCBncmVhdGVyLiAqLworCWNhc2UgQ3RybF9UOgorIyBpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkgICAgaWYgKGMgPT0gQ3RybF9UICYmIGN0cmxfeF9tb2RlID09IENUUkxfWF9USEVTQVVSVVMpCisJICAgIHsKKwkJaWYgKCpjdXJidWYtPmJfcF90c3IgPT0gTlVMICYmICpwX3RzciA9PSBOVUwpCisJCXsKKwkJICAgIGN0cmxfeF9tb2RlID0gMDsKKwkJICAgIG1zZ19hdHRyKChjaGFyX3UgKilfKCIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiKSwKKwkJCSAgICAgaGxfYXR0cihITEZfRSkpOworCQkgICAgaWYgKGVtc2dfc2lsZW50ID09IDApCisJCSAgICB7CisJCQl2aW1fYmVlcCgpOworCQkJc2V0Y3Vyc29yKCk7CisJCQlvdXRfZmx1c2goKTsKKwkJCXVpX2RlbGF5KDIwMDBMLCBGQUxTRSk7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQlnb3RvIGRvY29tcGxldGU7CisJICAgIH0KKyMgZW5kaWYKKwkgICAgaW5zX3NoaWZ0KGMsIGxhc3RjKTsKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCSAgICBpbnNlcnRlZF9zcGFjZSA9IEZBTFNFOworCSAgICBicmVhazsKKworCS8qIGRlbGV0ZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciAqLworCWNhc2UgS19ERUw6CisJY2FzZSBLX0tERUw6CisJICAgIGluc19kZWwoKTsKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCSAgICBicmVhazsKKworCS8qIGRlbGV0ZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjdXJzb3IgKi8KKwljYXNlIEtfQlM6CisJY2FzZSBDdHJsX0g6CisJICAgIGRpZF9iYWNrc3BhY2UgPSBpbnNfYnMoYywgQkFDS1NQQUNFX0NIQVIsICZpbnNlcnRlZF9zcGFjZSk7CisJICAgIGF1dG9fZm9ybWF0KEZBTFNFLCBUUlVFKTsKKwkgICAgYnJlYWs7CisKKwkvKiBkZWxldGUgd29yZCBiZWZvcmUgdGhlIGN1cnNvciAqLworCWNhc2UgQ3RybF9XOgorCSAgICBkaWRfYmFja3NwYWNlID0gaW5zX2JzKGMsIEJBQ0tTUEFDRV9XT1JELCAmaW5zZXJ0ZWRfc3BhY2UpOworCSAgICBhdXRvX2Zvcm1hdChGQUxTRSwgVFJVRSk7CisJICAgIGJyZWFrOworCisJLyogZGVsZXRlIGFsbCBpbnNlcnRlZCB0ZXh0IGluIGN1cnJlbnQgbGluZSAqLworCWNhc2UgQ3RybF9VOgorCSAgICBkaWRfYmFja3NwYWNlID0gaW5zX2JzKGMsIEJBQ0tTUEFDRV9MSU5FLCAmaW5zZXJ0ZWRfc3BhY2UpOworCSAgICBhdXRvX2Zvcm1hdChGQUxTRSwgVFJVRSk7CisJICAgIGluc2VydGVkX3NwYWNlID0gRkFMU0U7CisJICAgIGJyZWFrOworCisjaWZkZWYgRkVBVF9NT1VTRQorCWNhc2UgS19MRUZUTU9VU0U6CisJY2FzZSBLX0xFRlRNT1VTRV9OTToKKwljYXNlIEtfTEVGVERSQUc6CisJY2FzZSBLX0xFRlRSRUxFQVNFOgorCWNhc2UgS19MRUZUUkVMRUFTRV9OTToKKwljYXNlIEtfTUlERExFTU9VU0U6CisJY2FzZSBLX01JRERMRURSQUc6CisJY2FzZSBLX01JRERMRVJFTEVBU0U6CisJY2FzZSBLX1JJR0hUTU9VU0U6CisJY2FzZSBLX1JJR0hURFJBRzoKKwljYXNlIEtfUklHSFRSRUxFQVNFOgorCWNhc2UgS19YMU1PVVNFOgorCWNhc2UgS19YMURSQUc6CisJY2FzZSBLX1gxUkVMRUFTRToKKwljYXNlIEtfWDJNT1VTRToKKwljYXNlIEtfWDJEUkFHOgorCWNhc2UgS19YMlJFTEVBU0U6CisJICAgIGluc19tb3VzZShjKTsKKwkgICAgYnJlYWs7CisKKwkvKiBEZWZhdWx0IGFjdGlvbiBmb3Igc2Nyb2xsIHdoZWVsIHVwOiBzY3JvbGwgdXAgKi8KKwljYXNlIEtfTU9VU0VET1dOOgorCSAgICBpbnNfbW91c2VzY3JvbGwoRkFMU0UpOworCSAgICBicmVhazsKKworCS8qIERlZmF1bHQgYWN0aW9uIGZvciBzY3JvbGwgd2hlZWwgZG93bjogc2Nyb2xsIGRvd24gKi8KKwljYXNlIEtfTU9VU0VVUDoKKwkgICAgaW5zX21vdXNlc2Nyb2xsKFRSVUUpOworCSAgICBicmVhazsKKyNlbmRpZgorCisJY2FzZSBLX0lHTk9SRToKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUX0dVSQorCWNhc2UgS19WRVJfU0NST0xMQkFSOgorCSAgICBpbnNfc2Nyb2xsKCk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX0hPUl9TQ1JPTExCQVI6CisJICAgIGluc19ob3JzY3JvbGwoKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgS19IT01FOgorCWNhc2UgS19LSE9NRToKKwljYXNlIEtfWEhPTUU6CisJY2FzZSBLX1NfSE9NRToKKwljYXNlIEtfQ19IT01FOgorCSAgICBpbnNfaG9tZShjKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtfRU5EOgorCWNhc2UgS19LRU5EOgorCWNhc2UgS19YRU5EOgorCWNhc2UgS19TX0VORDoKKwljYXNlIEtfQ19FTkQ6CisJICAgIGluc19lbmQoYyk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX0xFRlQ6CisJICAgIGluc19sZWZ0KCk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX1NfTEVGVDoKKwljYXNlIEtfQ19MRUZUOgorCSAgICBpbnNfc19sZWZ0KCk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX1JJR0hUOgorCSAgICBpbnNfcmlnaHQoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtfU19SSUdIVDoKKwljYXNlIEtfQ19SSUdIVDoKKwkgICAgaW5zX3NfcmlnaHQoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtfVVA6CisJICAgIGluc191cChGQUxTRSk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX1NfVVA6CisJY2FzZSBLX1BBR0VVUDoKKwljYXNlIEtfS1BBR0VVUDoKKwkgICAgaW5zX3BhZ2V1cCgpOworCSAgICBicmVhazsKKworCWNhc2UgS19ET1dOOgorCSAgICBpbnNfZG93bihGQUxTRSk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX1NfRE9XTjoKKwljYXNlIEtfUEFHRURPV046CisJY2FzZSBLX0tQQUdFRE9XTjoKKwkgICAgaW5zX3BhZ2Vkb3duKCk7CisJICAgIGJyZWFrOworCisjaWZkZWYgRkVBVF9ETkQKKwljYXNlIEtfRFJPUDoKKwkgICAgaW5zX2Ryb3AoKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCS8qIFdoZW4gPFMtVGFiPiBpc24ndCBtYXBwZWQsIHVzZSBpdCBsaWtlIGEgbm9ybWFsIFRBQiAqLworCWNhc2UgS19TX1RBQjoKKwkgICAgYyA9IFRBQjsKKwkgICAgLyogRkFMTFRIUk9VR0ggKi8KKworCS8qIFRBQiBvciBDb21wbGV0ZSBwYXR0ZXJucyBhbG9uZyBwYXRoICovCisJY2FzZSBUQUI6CisjaWYgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpICYmIGRlZmluZWQoRkVBVF9GSU5EX0lEKQorCSAgICBpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX1BBVEhfUEFUVEVSTlMpCisJCWdvdG8gZG9jb21wbGV0ZTsKKyNlbmRpZgorCSAgICBpbnNlcnRlZF9zcGFjZSA9IEZBTFNFOworCSAgICBpZiAoaW5zX3RhYigpKQorCQlnb3RvIG5vcm1hbGNoYXI7CS8qIGluc2VydCBUQUIgYXMgYSBub3JtYWwgY2hhciAqLworCSAgICBhdXRvX2Zvcm1hdChGQUxTRSwgVFJVRSk7CisJICAgIGJyZWFrOworCisJY2FzZSBLX0tFTlRFUjoKKwkgICAgYyA9IENBUjsKKwkgICAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIENBUjoKKwljYXNlIE5MOgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJICAgIC8qIEluIGEgcXVpY2tmaXggd2luZG93IGEgPENSPiBqdW1wcyB0byB0aGUgZXJyb3IgdW5kZXIgdGhlCisJICAgICAqIGN1cnNvci4gKi8KKwkgICAgaWYgKGJ0X3F1aWNrZml4KGN1cmJ1ZikgJiYgYyA9PSBDQVIpCisJICAgIHsKKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSIuY2MiKTsKKwkJYnJlYWs7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfQ01EV0lOCisJICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorCSAgICB7CisJCS8qIEV4ZWN1dGUgdGhlIGNvbW1hbmQgaW4gdGhlIGNtZGxpbmUgd2luZG93LiAqLworCQljbWR3aW5fcmVzdWx0ID0gQ0FSOworCQlnb3RvIGRvRVNDa2V5OworCSAgICB9CisjZW5kaWYKKwkgICAgaWYgKGluc19lb2woYykgJiYgIXBfaW0pCisJCWdvdG8gZG9FU0NrZXk7CSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJICAgIGF1dG9fZm9ybWF0KEZBTFNFLCBGQUxTRSk7CisJICAgIGluc2VydGVkX3NwYWNlID0gRkFMU0U7CisJICAgIGJyZWFrOworCisjaWYgZGVmaW5lZChGRUFUX0RJR1JBUEhTKSB8fCBkZWZpbmVkIChGRUFUX0lOU19FWFBBTkQpCisJY2FzZSBDdHJsX0s6CisjIGlmZGVmIEZFQVRfSU5TX0VYUEFORAorCSAgICBpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX0RJQ1RJT05BUlkpCisJICAgIHsKKwkJaWYgKCpjdXJidWYtPmJfcF9kaWN0ID09IE5VTCAmJiAqcF9kaWN0ID09IE5VTCkKKwkJeworCQkgICAgY3RybF94X21vZGUgPSAwOworCQkgICAgbXNnX2F0dHIoKGNoYXJfdSAqKV8oIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiKSwKKwkJCSAgICAgaGxfYXR0cihITEZfRSkpOworCQkgICAgaWYgKGVtc2dfc2lsZW50ID09IDApCisJCSAgICB7CisJCQl2aW1fYmVlcCgpOworCQkJc2V0Y3Vyc29yKCk7CisJCQlvdXRfZmx1c2goKTsKKwkJCXVpX2RlbGF5KDIwMDBMLCBGQUxTRSk7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQlnb3RvIGRvY29tcGxldGU7CisJICAgIH0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9ESUdSQVBIUworCSAgICBjID0gaW5zX2RpZ3JhcGgoKTsKKwkgICAgaWYgKGMgPT0gTlVMKQorCQlicmVhazsKKyMgZW5kaWYKKwkgICAgZ290byBub3JtYWxjaGFyOworI2VuZGlmIC8qIEZFQVRfRElHUkFQSFMgfHwgRkVBVF9JTlNfRVhQQU5EICovCisKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwljYXNlIEN0cmxfUlNCOgkJLyogVGFnIG5hbWUgY29tcGxldGlvbiBhZnRlciBeWCAqLworCSAgICBpZiAoY3RybF94X21vZGUgIT0gQ1RSTF9YX1RBR1MpCisJCWdvdG8gbm9ybWFsY2hhcjsKKwkgICAgZ290byBkb2NvbXBsZXRlOworCisJY2FzZSBDdHJsX0Y6CQkvKiBGaWxlIG5hbWUgY29tcGxldGlvbiBhZnRlciBeWCAqLworCSAgICBpZiAoY3RybF94X21vZGUgIT0gQ1RSTF9YX0ZJTEVTKQorCQlnb3RvIG5vcm1hbGNoYXI7CisJICAgIGdvdG8gZG9jb21wbGV0ZTsKKyNlbmRpZgorCisJY2FzZSBDdHJsX0w6CQkvKiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gYWZ0ZXIgXlggKi8KKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkgICAgaWYgKGN0cmxfeF9tb2RlICE9IENUUkxfWF9XSE9MRV9MSU5FKQorI2VuZGlmCisJICAgIHsKKwkJLyogQ1RSTC1MIHdpdGggJ2luc2VydG1vZGUnIHNldDogTGVhdmUgSW5zZXJ0IG1vZGUgKi8KKwkJaWYgKHBfaW0pCisJCXsKKwkJICAgIGlmIChlY2hlY2tfYWJicihDdHJsX0wgKyBBQkJSX09GRikpCisJCQlicmVhazsKKwkJICAgIGdvdG8gZG9FU0NrZXk7CisJCX0KKwkJZ290byBub3JtYWxjaGFyOworCSAgICB9CisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIC8qIEZBTExUSFJPVUdIICovCisKKwkvKiBEbyBwcmV2aW91cy9uZXh0IHBhdHRlcm4gY29tcGxldGlvbiAqLworCWNhc2UgQ3RybF9QOgorCWNhc2UgQ3RybF9OOgorCSAgICAvKiBpZiAnY29tcGxldGUnIGlzIGVtcHR5IHRoZW4gcGxhaW4gXlAgaXMgbm8gbG9uZ2VyIHNwZWNpYWwsCisJICAgICAqIGJ1dCBpdCBpcyB1bmRlciBvdGhlciBeWCBtb2RlcyAqLworCSAgICBpZiAoKmN1cmJ1Zi0+Yl9wX2NwdCA9PSBOVUwKKwkJICAgICYmIGN0cmxfeF9tb2RlICE9IDAKKwkJICAgICYmICEoY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkpCisJCWdvdG8gbm9ybWFsY2hhcjsKKworZG9jb21wbGV0ZToKKwkgICAgaWYgKGluc19jb21wbGV0ZShjKSA9PSBGQUlMKQorCQljb250aW51ZV9zdGF0dXMgPSAwOworCSAgICBicmVhazsKKyNlbmRpZiAvKiBGRUFUX0lOU19FWFBBTkQgKi8KKworCWNhc2UgQ3RybF9ZOgkJLyogY29weSBmcm9tIHByZXZpb3VzIGxpbmUgb3Igc2Nyb2xsIGRvd24gKi8KKwljYXNlIEN0cmxfRToJCS8qIGNvcHkgZnJvbSBuZXh0IGxpbmUJICAgb3Igc2Nyb2xsIHVwICovCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIGlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfU0NST0xMKQorCSAgICB7CisJCWlmIChjID09IEN0cmxfWSkKKwkJICAgIHNjcm9sbGRvd25fY2xhbXAoKTsKKwkJZWxzZQorCQkgICAgc2Nyb2xsdXBfY2xhbXAoKTsKKwkJcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQljID0gaW5zX2NvcHljaGFyKGN1cndpbi0+d19jdXJzb3IubG51bQorCQkJCQkJICsgKGMgPT0gQ3RybF9ZID8gLTEgOiAxKSk7CisJCWlmIChjICE9IE5VTCkKKwkJeworCQkgICAgbG9uZwl0d19zYXZlOworCisJCSAgICAvKiBUaGUgY2hhcmFjdGVyIG11c3QgYmUgdGFrZW4gbGl0ZXJhbGx5LCBpbnNlcnQgbGlrZSBpdAorCQkgICAgICogd2FzIHR5cGVkIGFmdGVyIGEgQ1RSTC1WLCBhbmQgcHJldGVuZCAndGV4dHdpZHRoJworCQkgICAgICogd2Fzbid0IHNldC4gIERpZ2l0cywgJ28nIGFuZCAneCcgYXJlIHNwZWNpYWwgYWZ0ZXIgYQorCQkgICAgICogQ1RSTC1WLCBkb24ndCB1c2UgaXQgZm9yIHRoZXNlLiAqLworCQkgICAgaWYgKGMgPCAyNTYgJiYgIWlzYWxudW0oYykpCisJCQlBcHBlbmRUb1JlZG9idWZmKChjaGFyX3UgKilDVFJMX1ZfU1RSKTsJLyogQ1RSTC1WICovCisJCSAgICB0d19zYXZlID0gY3VyYnVmLT5iX3BfdHc7CisJCSAgICBjdXJidWYtPmJfcF90dyA9IC0xOworCQkgICAgaW5zZXJ0X3NwZWNpYWwoYywgVFJVRSwgRkFMU0UpOworCQkgICAgY3VyYnVmLT5iX3BfdHcgPSB0d19zYXZlOworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCSAgICByZXZpbnNfY2hhcnMrKzsKKwkJICAgIHJldmluc19sZWdhbCsrOworI2VuZGlmCisJCSAgICBjID0gQ3RybF9WOwkvKiBwcmV0ZW5kIENUUkwtViBpcyBsYXN0IGNoYXJhY3RlciAqLworCQkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisjaWZkZWYgVU5JWAorCSAgICBpZiAoYyA9PSBpbnRyX2NoYXIpCQkvKiBzcGVjaWFsIGludGVycnVwdCBjaGFyICovCisJCWdvdG8gZG9faW50cjsKKyNlbmRpZgorCisJICAgIC8qCisJICAgICAqIEluc2VydCBhIG5vbWFsIGNoYXJhY3Rlci4KKwkgICAgICovCitub3JtYWxjaGFyOgorI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkgICAgLyogVHJ5IHRvIHBlcmZvcm0gc21hcnQtaW5kZW50aW5nLiAqLworCSAgICBpbnNfdHJ5X3NpKGMpOworI2VuZGlmCisKKwkgICAgaWYgKGMgPT0gJyAnKQorCSAgICB7CisJCWluc2VydGVkX3NwYWNlID0gVFJVRTsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwkJaWYgKGluaW5kZW50KDApKQorCQkgICAgY2FuX2NpbmRlbnQgPSBGQUxTRTsKKyNlbmRpZgorCQlpZiAoSW5zc3RhcnRfYmxhbmtfdmNvbCA9PSBNQVhDT0wKKwkJCSYmIGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBJbnNzdGFydC5sbnVtKQorCQkgICAgSW5zc3RhcnRfYmxhbmtfdmNvbCA9IGdldF9ub2xpc3RfdmlydGNvbCgpOworCSAgICB9CisKKwkgICAgaWYgKHZpbV9pc3dvcmRjKGMpIHx8ICFlY2hlY2tfYWJicigKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkvKiBBZGQgQUJCUl9PRkYgZm9yIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAsIHRoaXMgaXMKKwkJCSAqIHdoYXQgY2hlY2tfYWJicigpIGV4cGVjdHMuICovCisJCQkoaGFzX21ieXRlICYmIGMgPj0gMHgxMDApID8gKGMgKyBBQkJSX09GRikgOgorI2VuZGlmCisJCQljKSkKKwkgICAgeworCQlpbnNlcnRfc3BlY2lhbChjLCBGQUxTRSwgRkFMU0UpOworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCXJldmluc19sZWdhbCsrOworCQlyZXZpbnNfY2hhcnMrKzsKKyNlbmRpZgorCSAgICB9CisKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIC8qIFdoZW4gaW5zZXJ0aW5nIGEgY2hhcmFjdGVyIHRoZSBjdXJzb3IgbGluZSBtdXN0IG5ldmVyIGJlIGluIGEKKwkgICAgICogY2xvc2VkIGZvbGQuICovCisJICAgIGZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJfSAgIC8qIGVuZCBvZiBzd2l0Y2ggKGMpICovCisKKwkvKiBJZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZCB3ZSBkaWRuJ3QganVzdCBpbnNlcnQgYSBzcGFjZSAqLworCWlmIChhcnJvd191c2VkKQorCSAgICBpbnNlcnRlZF9zcGFjZSA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9DSU5ERU5UCisJaWYgKGNhbl9jaW5kZW50ICYmIGNpbmRlbnRfb24oKQorIyBpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkJJiYgY3RybF94X21vZGUgPT0gMAorIyBlbmRpZgorCSAgICkKKwl7Citmb3JjZV9jaW5kZW50OgorCSAgICAvKgorCSAgICAgKiBJbmRlbnQgbm93IGlmIGEga2V5IHdhcyB0eXBlZCB0aGF0IGlzIGluICdjaW5rZXlzJy4KKwkgICAgICovCisJICAgIGlmIChpbl9jaW5rZXlzKGMsICcgJywgbGluZV9pc193aGl0ZSkpCisJICAgIHsKKwkJaWYgKHN0b3BfYXJyb3coKSA9PSBPSykKKwkJICAgIC8qIHJlLWluZGVudCB0aGUgY3VycmVudCBsaW5lICovCisJCSAgICBkb19jX2V4cHJfaW5kZW50KCk7CisJICAgIH0KKwl9CisjZW5kaWYgLyogRkVBVF9DSU5ERU5UICovCisKKyAgICB9CS8qIGZvciAoOzspICovCisgICAgLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogUmVkcmF3IGZvciBJbnNlcnQgbW9kZS4KKyAqIFRoaXMgaXMgcG9zdHBvbmVkIHVudGlsIGdldHRpbmcgdGhlIG5leHQgY2hhcmFjdGVyIHRvIG1ha2UgJyQnIGluIHRoZSAnY3BvJworICogb3B0aW9uIHdvcmsgY29ycmVjdGx5LgorICogT25seSByZWRyYXcgd2hlbiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyBhdmFpbGFibGUuICBUaGlzIHNwZWVkcyB1cAorICogaW5zZXJ0aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIChlLmcuLCBmb3IgQ1RSTC1SKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfcmVkcmF3KCkKK3sKKyAgICBpZiAoIWNoYXJfYXZhaWwoKSkKKyAgICB7CisJaWYgKG11c3RfcmVkcmF3KQorCSAgICB1cGRhdGVfc2NyZWVuKDApOworCWVsc2UgaWYgKGNsZWFyX2NtZGxpbmUgfHwgcmVkcmF3X2NtZGxpbmUpCisJICAgIHNob3dtb2RlKCk7CQkvKiBjbGVhciBjbWRsaW5lIGFuZCBzaG93IG1vZGUgKi8KKwlzaG93cnVsZXIoRkFMU0UpOworCXNldGN1cnNvcigpOworCWVtc2dfb25fZGlzcGxheSA9IEZBTFNFOwkvKiBtYXkgcmVtb3ZlIGVycm9yIG1lc3NhZ2Ugbm93ICovCisgICAgfQorfQorCisvKgorICogSGFuZGxlIGEgQ1RSTC1WIG9yIENUUkwtUSB0eXBlZCBpbiBJbnNlcnQgbW9kZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfY3RybF92KCkKK3sKKyAgICBpbnQJCWM7CisKKyAgICAvKiBtYXkgbmVlZCB0byByZWRyYXcgd2hlbiBubyBtb3JlIGNoYXJzIGF2YWlsYWJsZSBub3cgKi8KKyAgICBpbnNfcmVkcmF3KCk7CisKKyAgICBpZiAocmVkcmF3aW5nKCkgJiYgIWNoYXJfYXZhaWwoKSkKKwllZGl0X3B1dGNoYXIoJ14nLCBUUlVFKTsKKyAgICBBcHBlbmRUb1JlZG9idWZmKChjaGFyX3UgKilDVFJMX1ZfU1RSKTsJLyogQ1RSTC1WICovCisKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworICAgIGFkZF90b19zaG93Y21kX2MoQ3RybF9WKTsKKyNlbmRpZgorCisgICAgYyA9IGdldF9saXRlcmFsKCk7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBjbGVhcl9zaG93Y21kKCk7CisjZW5kaWYKKyAgICBpbnNlcnRfc3BlY2lhbChjLCBGQUxTRSwgVFJVRSk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICByZXZpbnNfY2hhcnMrKzsKKyAgICByZXZpbnNfbGVnYWwrKzsKKyNlbmRpZgorfQorCisvKgorICogUHV0IGEgY2hhcmFjdGVyIGRpcmVjdGx5IG9udG8gdGhlIHNjcmVlbi4gIEl0J3Mgbm90IHN0b3JlZCBpbiBhIGJ1ZmZlci4KKyAqIFVzZWQgd2hpbGUgaGFuZGxpbmcgQ1RSTC1LLCBDVFJMLVYsIGV0Yy4gaW4gSW5zZXJ0IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgIHBjX3N0YXR1czsKKyNkZWZpbmUgUENfU1RBVFVTX1VOU0VUCTAJLyogcGNfYnl0ZXMgd2FzIG5vdCBzZXQgKi8KKyNkZWZpbmUgUENfU1RBVFVTX1JJR0hUCTEJLyogcmlnaHQgaGFsdmUgb2YgZG91YmxlLXdpZGUgY2hhciAqLworI2RlZmluZSBQQ19TVEFUVVNfTEVGVAkyCS8qIGxlZnQgaGFsdmUgb2YgZG91YmxlLXdpZGUgY2hhciAqLworI2RlZmluZSBQQ19TVEFUVVNfU0VUCTMJLyogcGNfYnl0ZXMgd2FzIGZpbGxlZCAqLworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBjaGFyX3UgcGNfYnl0ZXNbTUJfTUFYQllURVMgKyAxXTsgLyogc2F2ZWQgYnl0ZXMgKi8KKyNlbHNlCitzdGF0aWMgY2hhcl91IHBjX2J5dGVzWzJdOwkJLyogc2F2ZWQgYnl0ZXMgKi8KKyNlbmRpZgorc3RhdGljIGludCAgcGNfYXR0cjsKK3N0YXRpYyBpbnQgIHBjX3JvdzsKK3N0YXRpYyBpbnQgIHBjX2NvbDsKKworICAgIHZvaWQKK2VkaXRfcHV0Y2hhcihjLCBoaWdobGlnaHQpCisgICAgaW50CSAgICBjOworICAgIGludAkgICAgaGlnaGxpZ2h0OworeworICAgIGludAkgICAgYXR0cjsKKworICAgIGlmIChTY3JlZW5MaW5lcyAhPSBOVUxMKQorICAgIHsKKwl1cGRhdGVfdG9wbGluZSgpOwkvKiBqdXN0IGluIGNhc2Ugd190b3BsaW5lIGlzbid0IHZhbGlkICovCisJdmFsaWRhdGVfY3Vyc29yKCk7CisJaWYgKGhpZ2hsaWdodCkKKwkgICAgYXR0ciA9IGhsX2F0dHIoSExGXzgpOworCWVsc2UKKwkgICAgYXR0ciA9IDA7CisJcGNfcm93ID0gV19XSU5ST1coY3Vyd2luKSArIGN1cndpbi0+d193cm93OworCXBjX2NvbCA9IFdfV0lOQ09MKGN1cndpbik7CisjaWYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkgfHwgZGVmaW5lZChGRUFUX01CWVRFKQorCXBjX3N0YXR1cyA9IFBDX1NUQVRVU19VTlNFVDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJaWYgKGN1cndpbi0+d19wX3JsKQorCXsKKwkgICAgcGNfY29sICs9IFdfV0lEVEgoY3Vyd2luKSAtIDEgLSBjdXJ3aW4tPndfd2NvbDsKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCWludCBmaXhfY29sID0gbWJfZml4X2NvbChwY19jb2wsIHBjX3Jvdyk7CisKKwkJaWYgKGZpeF9jb2wgIT0gcGNfY29sKQorCQl7CisJCSAgICBzY3JlZW5fcHV0Y2hhcignICcsIHBjX3JvdywgZml4X2NvbCwgYXR0cik7CisJCSAgICAtLWN1cndpbi0+d193Y29sOworCQkgICAgcGNfc3RhdHVzID0gUENfU1RBVFVTX1JJR0hUOworCQl9CisJICAgIH0KKyMgZW5kaWYKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBwY19jb2wgKz0gY3Vyd2luLT53X3djb2w7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAobWJfbGVmdGhhbHZlKHBjX3JvdywgcGNfY29sKSkKKwkJcGNfc3RhdHVzID0gUENfU1RBVFVTX0xFRlQ7CisjZW5kaWYKKwl9CisKKwkvKiBzYXZlIHRoZSBjaGFyYWN0ZXIgdG8gYmUgYWJsZSB0byBwdXQgaXQgYmFjayAqLworI2lmIGRlZmluZWQoRkVBVF9SSUdIVExFRlQpIHx8IGRlZmluZWQoRkVBVF9NQllURSkKKwlpZiAocGNfc3RhdHVzID09IFBDX1NUQVRVU19VTlNFVCkKKyNlbmRpZgorCXsKKwkgICAgc2NyZWVuX2dldGJ5dGVzKHBjX3JvdywgcGNfY29sLCBwY19ieXRlcywgJnBjX2F0dHIpOworCSAgICBwY19zdGF0dXMgPSBQQ19TVEFUVVNfU0VUOworCX0KKwlzY3JlZW5fcHV0Y2hhcihjLCBwY19yb3csIHBjX2NvbCwgYXR0cik7CisgICAgfQorfQorCisvKgorICogVW5kbyB0aGUgcHJldmlvdXMgZWRpdF9wdXRjaGFyKCkuCisgKi8KKyAgICB2b2lkCitlZGl0X3VucHV0Y2hhcigpCit7CisgICAgaWYgKHBjX3N0YXR1cyAhPSBQQ19TVEFUVVNfVU5TRVQgJiYgcGNfcm93ID49IG1zZ19zY3JvbGxlZCkKKyAgICB7CisjaWYgZGVmaW5lZChGRUFUX01CWVRFKQorCWlmIChwY19zdGF0dXMgPT0gUENfU1RBVFVTX1JJR0hUKQorCSAgICArK2N1cndpbi0+d193Y29sOworCWlmIChwY19zdGF0dXMgPT0gUENfU1RBVFVTX1JJR0hUIHx8IHBjX3N0YXR1cyA9PSBQQ19TVEFUVVNfTEVGVCkKKwkgICAgcmVkcmF3V2lubGluZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIEZBTFNFKTsKKwllbHNlCisjZW5kaWYKKwkgICAgc2NyZWVuX3B1dHMocGNfYnl0ZXMsIHBjX3JvdyAtIG1zZ19zY3JvbGxlZCwgcGNfY29sLCBwY19hdHRyKTsKKyAgICB9Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBwX2RvbGxhciBpcyBzZXQ6IGRpc3BsYXkgYSAnJCcgYXQgdGhlIGVuZCBvZiB0aGUgY2hhbmdlZCB0ZXh0CisgKiBPbmx5IHdvcmtzIHdoZW4gY3Vyc29yIGlzIGluIHRoZSBsaW5lIHRoYXQgY2hhbmdlcy4KKyAqLworICAgIHZvaWQKK2Rpc3BsYXlfZG9sbGFyKGNvbCkKKyAgICBjb2xucl9UCWNvbDsKK3sKKyAgICBjb2xucl9UIHNhdmVfY29sOworCisgICAgaWYgKCFyZWRyYXdpbmcoKSkKKwlyZXR1cm47CisKKyAgICBjdXJzb3Jfb2ZmKCk7CisgICAgc2F2ZV9jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSkKKyAgICB7CisJY2hhcl91ICpwOworCisJLyogSWYgb24gdGhlIGxhc3QgYnl0ZSBvZiBhIG11bHRpLWJ5dGUgbW92ZSB0byB0aGUgZmlyc3QgYnl0ZS4gKi8KKwlwID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCAtPSAoKm1iX2hlYWRfb2ZmKShwLCBwICsgY29sKTsKKyAgICB9CisjZW5kaWYKKyAgICBjdXJzX2NvbHVtbnMoRkFMU0UpOwkgICAgLyogcmVjb21wdXRlIHdfd3JvdyBhbmQgd193Y29sICovCisgICAgaWYgKGN1cndpbi0+d193Y29sIDwgV19XSURUSChjdXJ3aW4pKQorICAgIHsKKwllZGl0X3B1dGNoYXIoJyQnLCBGQUxTRSk7CisJZG9sbGFyX3Zjb2wgPSBjdXJ3aW4tPndfdmlydGNvbDsKKyAgICB9CisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBzYXZlX2NvbDsKK30KKworLyoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgbW92aW5nIHRoZSBjdXJzb3IgZnJvbSB0aGUgbm9ybWFsIGluc2VydCBwb3NpdGlvbgorICogaW4gaW5zZXJ0IG1vZGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordW5kaXNwbGF5X2RvbGxhcigpCit7CisgICAgaWYgKGRvbGxhcl92Y29sKQorICAgIHsKKwlkb2xsYXJfdmNvbCA9IDA7CisJcmVkcmF3V2lubGluZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIEZBTFNFKTsKKyAgICB9Cit9CisKKy8qCisgKiBJbnNlcnQgYW4gaW5kZW50IChmb3IgPFRhYj4gb3IgQ1RSTC1UKSBvciBkZWxldGUgYW4gaW5kZW50IChmb3IgQ1RSTC1EKS4KKyAqIEtlZXAgdGhlIGN1cnNvciBvbiB0aGUgc2FtZSBjaGFyYWN0ZXIuCisgKiB0eXBlID09IElOREVOVF9JTkMJaW5jcmVhc2UgaW5kZW50IChmb3IgQ1RSTC1UIG9yIDxUYWI+KQorICogdHlwZSA9PSBJTkRFTlRfREVDCWRlY3JlYXNlIGluZGVudCAoZm9yIENUUkwtRCkKKyAqIHR5cGUgPT0gSU5ERU5UX1NFVAlzZXQgaW5kZW50IHRvICJhbW91bnQiCisgKiBpZiByb3VuZCBpcyBUUlVFLCByb3VuZCB0aGUgaW5kZW50IHRvICdzaGlmdHdpZHRoJyAob25seSB3aXRoIF9JTkMgYW5kIF9EZWMpLgorICovCisgICAgdm9pZAorY2hhbmdlX2luZGVudCh0eXBlLCBhbW91bnQsIHJvdW5kLCByZXBsYWNlZCkKKyAgICBpbnQJCXR5cGU7CisgICAgaW50CQlhbW91bnQ7CisgICAgaW50CQlyb3VuZDsKKyAgICBpbnQJCXJlcGxhY2VkOwkvKiByZXBsYWNlZCBjaGFyYWN0ZXIsIHB1dCBvbiByZXBsYWNlIHN0YWNrICovCit7CisgICAgaW50CQl2Y29sOworICAgIGludAkJbGFzdF92Y29sOworICAgIGludAkJaW5zc3RhcnRfbGVzczsJCS8qIHJlZHVjdGlvbiBmb3IgSW5zc3RhcnQuY29sICovCisgICAgaW50CQluZXdfY3Vyc29yX2NvbDsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQlzYXZlX3BfbGlzdDsKKyAgICBpbnQJCXN0YXJ0X2NvbDsKKyAgICBjb2xucl9UCXZjOworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyAgICBjb2xucl9UCW9yaWdfY29sID0gMDsJCS8qIGluaXQgZm9yIEdDQyAqLworICAgIGNoYXJfdQkqbmV3X2xpbmUsICpvcmlnX2xpbmUgPSBOVUxMOwkvKiBpbml0IGZvciBHQ0MgKi8KKworICAgIC8qIFZSRVBMQUNFIG1vZGUgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBsaW5lIHdhcyBsaWtlIGJlZm9yZSBjaGFuZ2luZyAqLworICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisgICAgeworCW9yaWdfbGluZSA9IHZpbV9zdHJzYXZlKG1sX2dldF9jdXJsaW5lKCkpOyAgLyogRGVhbCB3aXRoIE5VTEwgYmVsb3cgKi8KKwlvcmlnX2NvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIH0KKyNlbmRpZgorCisgICAgLyogZm9yIHRoZSBmb2xsb3dpbmcgdHJpY2tzIHdlIGRvbid0IHdhbnQgbGlzdCBtb2RlICovCisgICAgc2F2ZV9wX2xpc3QgPSBjdXJ3aW4tPndfcF9saXN0OworICAgIGN1cndpbi0+d19wX2xpc3QgPSBGQUxTRTsKKyAgICB2YyA9IGdldHZjb2xfbm9saXN0KCZjdXJ3aW4tPndfY3Vyc29yKTsKKyAgICB2Y29sID0gdmM7CisKKyAgICAvKgorICAgICAqIEZvciBSZXBsYWNlIG1vZGUgd2UgbmVlZCB0byBmaXggdGhlIHJlcGxhY2Ugc3RhY2sgbGF0ZXIsIHdoaWNoIGlzIG9ubHkKKyAgICAgKiBwb3NzaWJsZSB3aGVuIHRoZSBjdXJzb3IgaXMgaW4gdGhlIGluZGVudC4gIFJlbWVtYmVyIHRoZSBudW1iZXIgb2YKKyAgICAgKiBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIGlmIGl0J3MgcG9zc2libGUuCisgICAgICovCisgICAgc3RhcnRfY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisKKyAgICAvKiBkZXRlcm1pbmUgb2Zmc2V0IGZyb20gZmlyc3Qgbm9uLWJsYW5rICovCisgICAgbmV3X2N1cnNvcl9jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICBiZWdpbmxpbmUoQkxfV0hJVEUpOworICAgIG5ld19jdXJzb3JfY29sIC09IGN1cndpbi0+d19jdXJzb3IuY29sOworCisgICAgaW5zc3RhcnRfbGVzcyA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIGluIHRoZSBpbmRlbnQsIGNvbXB1dGUgaG93IG1hbnkgc2NyZWVuIGNvbHVtbnMgdGhlCisgICAgICogY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24tYmxhbmsuCisgICAgICovCisgICAgaWYgKG5ld19jdXJzb3JfY29sIDwgMCkKKwl2Y29sID0gZ2V0X2luZGVudCgpIC0gdmNvbDsKKworICAgIGlmIChuZXdfY3Vyc29yX2NvbCA+IDApCSAgICAvKiBjYW4ndCBmaXggcmVwbGFjZSBzdGFjayAqLworCXN0YXJ0X2NvbCA9IC0xOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIG5ldyBpbmRlbnQuICBUaGUgY3Vyc29yIHdpbGwgYmUgcHV0IG9uIHRoZSBmaXJzdCBub24tYmxhbmsuCisgICAgICovCisgICAgaWYgKHR5cGUgPT0gSU5ERU5UX1NFVCkKKwkodm9pZClzZXRfaW5kZW50KGFtb3VudCwgU0lOX0NIQU5HRUQpOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCWludAlzYXZlX1N0YXRlID0gU3RhdGU7CisKKwkvKiBBdm9pZCBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHkuICovCisJaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwkgICAgU3RhdGUgPSBJTlNFUlQ7CisjZW5kaWYKKwlzaGlmdF9saW5lKHR5cGUgPT0gSU5ERU5UX0RFQywgcm91bmQsIDEpOworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwlTdGF0ZSA9IHNhdmVfU3RhdGU7CisjZW5kaWYKKyAgICB9CisgICAgaW5zc3RhcnRfbGVzcyAtPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworICAgIC8qCisgICAgICogVHJ5IHRvIHB1dCBjdXJzb3Igb24gc2FtZSBjaGFyYWN0ZXIuCisgICAgICogSWYgdGhlIGN1cnNvciBpcyBhdCBvciBhZnRlciB0aGUgZmlyc3Qgbm9uLWJsYW5rIGluIHRoZSBsaW5lLAorICAgICAqIGNvbXB1dGUgdGhlIGN1cnNvciBjb2x1bW4gcmVsYXRpdmUgdG8gdGhlIGNvbHVtbiBvZiB0aGUgZmlyc3QKKyAgICAgKiBub24tYmxhbmsgY2hhcmFjdGVyLgorICAgICAqIElmIHdlIGFyZSBub3QgaW4gaW5zZXJ0IG1vZGUsIGxlYXZlIHRoZSBjdXJzb3Igb24gdGhlIGZpcnN0IG5vbi1ibGFuay4KKyAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3Qgbm9uLWJsYW5rLCBwb3NpdGlvbiBpdCByZWxhdGl2ZQorICAgICAqIHRvIHRoZSBmaXJzdCBub24tYmxhbmssIGNvdW50ZWQgaW4gc2NyZWVuIGNvbHVtbnMuCisgICAgICovCisgICAgaWYgKG5ld19jdXJzb3JfY29sID49IDApCisgICAgeworCS8qCisJICogV2hlbiBjaGFuZ2luZyB0aGUgaW5kZW50IHdoaWxlIHRoZSBjdXJzb3IgaXMgdG91Y2hpbmcgaXQsIHJlc2V0CisJICogSW5zc3RhcnRfY29sIHRvIDAuCisJICovCisJaWYgKG5ld19jdXJzb3JfY29sID09IDApCisJICAgIGluc3N0YXJ0X2xlc3MgPSBNQVhDT0w7CisJbmV3X2N1cnNvcl9jb2wgKz0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgfQorICAgIGVsc2UgaWYgKCEoU3RhdGUgJiBJTlNFUlQpKQorCW5ld19jdXJzb3JfY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIENvbXB1dGUgdGhlIHNjcmVlbiBjb2x1bW4gd2hlcmUgdGhlIGN1cnNvciBzaG91bGQgYmUuCisJICovCisJdmNvbCA9IGdldF9pbmRlbnQoKSAtIHZjb2w7CisJY3Vyd2luLT53X3ZpcnRjb2wgPSAodmNvbCA8IDApID8gMCA6IHZjb2w7CisKKwkvKgorCSAqIEFkdmFuY2UgdGhlIGN1cnNvciB1bnRpbCB3ZSByZWFjaCB0aGUgcmlnaHQgc2NyZWVuIGNvbHVtbi4KKwkgKi8KKwl2Y29sID0gbGFzdF92Y29sID0gMDsKKwluZXdfY3Vyc29yX2NvbCA9IC0xOworCXB0ciA9IG1sX2dldF9jdXJsaW5lKCk7CisJd2hpbGUgKHZjb2wgPD0gKGludCljdXJ3aW4tPndfdmlydGNvbCkKKwl7CisJICAgIGxhc3RfdmNvbCA9IHZjb2w7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlICYmIG5ld19jdXJzb3JfY29sID49IDApCisJCW5ld19jdXJzb3JfY29sICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyICsgbmV3X2N1cnNvcl9jb2wpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKytuZXdfY3Vyc29yX2NvbDsKKwkgICAgdmNvbCArPSBsYnJfY2hhcnRhYnNpemUocHRyICsgbmV3X2N1cnNvcl9jb2wsIChjb2xucl9UKXZjb2wpOworCX0KKwl2Y29sID0gbGFzdF92Y29sOworCisJLyoKKwkgKiBNYXkgbmVlZCB0byBpbnNlcnQgc3BhY2VzIHRvIGJlIGFibGUgdG8gcG9zaXRpb24gdGhlIGN1cnNvciBvbgorCSAqIHRoZSByaWdodCBzY3JlZW4gY29sdW1uLgorCSAqLworCWlmICh2Y29sICE9IChpbnQpY3Vyd2luLT53X3ZpcnRjb2wpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IG5ld19jdXJzb3JfY29sOworCSAgICBpID0gKGludCljdXJ3aW4tPndfdmlydGNvbCAtIHZjb2w7CisJICAgIHB0ciA9IGFsbG9jKGkgKyAxKTsKKwkgICAgaWYgKHB0ciAhPSBOVUxMKQorCSAgICB7CisJCW5ld19jdXJzb3JfY29sICs9IGk7CisJCXB0cltpXSA9IE5VTDsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkgICAgcHRyW2ldID0gJyAnOworCQlpbnNfc3RyKHB0cik7CisJCXZpbV9mcmVlKHB0cik7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIFdoZW4gY2hhbmdpbmcgdGhlIGluZGVudCB3aGlsZSB0aGUgY3Vyc29yIGlzIGluIGl0LCByZXNldAorCSAqIEluc3N0YXJ0X2NvbCB0byAwLgorCSAqLworCWluc3N0YXJ0X2xlc3MgPSBNQVhDT0w7CisgICAgfQorCisgICAgY3Vyd2luLT53X3BfbGlzdCA9IHNhdmVfcF9saXN0OworCisgICAgaWYgKG5ld19jdXJzb3JfY29sIDw9IDApCisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIGVsc2UKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IG5ld19jdXJzb3JfY29sOworICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworICAgIGNoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKTsKKworICAgIC8qCisgICAgICogTWF5IGhhdmUgdG8gYWRqdXN0IHRoZSBzdGFydCBvZiB0aGUgaW5zZXJ0LgorICAgICAqLworICAgIGlmIChTdGF0ZSAmIElOU0VSVCkKKyAgICB7CisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBJbnNzdGFydC5sbnVtICYmIEluc3N0YXJ0LmNvbCAhPSAwKQorCXsKKwkgICAgaWYgKChpbnQpSW5zc3RhcnQuY29sIDw9IGluc3N0YXJ0X2xlc3MpCisJCUluc3N0YXJ0LmNvbCA9IDA7CisJICAgIGVsc2UKKwkJSW5zc3RhcnQuY29sIC09IGluc3N0YXJ0X2xlc3M7CisJfQorCWlmICgoaW50KWFpX2NvbCA8PSBpbnNzdGFydF9sZXNzKQorCSAgICBhaV9jb2wgPSAwOworCWVsc2UKKwkgICAgYWlfY29sIC09IGluc3N0YXJ0X2xlc3M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgUkVQTEFDRSBtb2RlLCBtYXkgaGF2ZSB0byBmaXggdGhlIHJlcGxhY2Ugc3RhY2ssIGlmIGl0J3MgcG9zc2libGUuCisgICAgICogSWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIGRlY3JlYXNlZCwgbmVlZCB0byBwb3AgYQorICAgICAqIGZldyBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlcGxhY2Ugc3RhY2suCisgICAgICogSWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIGluY3JlYXNlZCwgbmVlZCB0byBwdXNoIGEKKyAgICAgKiBmZXcgTlVMcyBvbnRvIHRoZSByZXBsYWNlIHN0YWNrLgorICAgICAqLworICAgIGlmIChSRVBMQUNFX05PUk1BTChTdGF0ZSkgJiYgc3RhcnRfY29sID49IDApCisgICAgeworCXdoaWxlIChzdGFydF9jb2wgPiAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sKQorCXsKKwkgICAgcmVwbGFjZV9qb2luKDApOwkgICAgLyogcmVtb3ZlIGEgTlVMIGZyb20gdGhlIHJlcGxhY2Ugc3RhY2sgKi8KKwkgICAgLS1zdGFydF9jb2w7CisJfQorCXdoaWxlIChzdGFydF9jb2wgPCAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sIHx8IHJlcGxhY2VkKQorCXsKKwkgICAgcmVwbGFjZV9wdXNoKE5VTCk7CisJICAgIGlmIChyZXBsYWNlZCkKKwkgICAgeworCQlyZXBsYWNlX3B1c2gocmVwbGFjZWQpOworCQlyZXBsYWNlZCA9IE5VTDsKKwkgICAgfQorCSAgICArK3N0YXJ0X2NvbDsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorICAgIC8qCisgICAgICogRm9yIFZSRVBMQUNFIG1vZGUsIHdlIGFsc28gaGF2ZSB0byBmaXggdGhlIHJlcGxhY2Ugc3RhY2suICBJbiB0aGlzIGNhc2UKKyAgICAgKiBpdCBpcyBhbHdheXMgcG9zc2libGUgYmVjYXVzZSB3ZSBiYWNrc3BhY2Ugb3ZlciB0aGUgd2hvbGUgbGluZSBhbmQgdGhlbgorICAgICAqIHB1dCBpdCBiYWNrIGFnYWluIHRoZSB3YXkgd2Ugd2FudGVkIGl0LgorICAgICAqLworICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisgICAgeworCS8qIElmIG9yaWdfbGluZSBkaWRuJ3QgYWxsb2NhdGUsIGp1c3QgcmV0dXJuLiAgQXQgbGVhc3Qgd2UgZGlkIHRoZSBqb2IsCisJICogZXZlbiBpZiB5b3UgY2FuJ3QgYmFja3NwYWNlLiAqLworCWlmIChvcmlnX2xpbmUgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJLyogU2F2ZSBuZXcgbGluZSAqLworCW5ld19saW5lID0gdmltX3N0cnNhdmUobWxfZ2V0X2N1cmxpbmUoKSk7CisJaWYgKG5ld19saW5lID09IE5VTEwpCisJICAgIHJldHVybjsKKworCS8qIFdlIG9ubHkgcHV0IGJhY2sgdGhlIG5ldyBsaW5lIHVwIHRvIHRoZSBjdXJzb3IgKi8KKwluZXdfbGluZVtjdXJ3aW4tPndfY3Vyc29yLmNvbF0gPSBOVUw7CisKKwkvKiBQdXQgYmFjayBvcmlnaW5hbCBsaW5lICovCisJbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG9yaWdfbGluZSwgRkFMU0UpOworCWN1cndpbi0+d19jdXJzb3IuY29sID0gb3JpZ19jb2w7CisKKwkvKiBCYWNrc3BhY2UgZnJvbSBjdXJzb3IgdG8gc3RhcnQgb2YgbGluZSAqLworCWJhY2tzcGFjZV91bnRpbF9jb2x1bW4oMCk7CisKKwkvKiBJbnNlcnQgbmV3IHN0dWZmIGludG8gbGluZSBhZ2FpbiAqLworCWluc19ieXRlcyhuZXdfbGluZSk7CisKKwl2aW1fZnJlZShuZXdfbGluZSk7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBUcnVuY2F0ZSB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUuICBUaGlzIGlzIHRvIGJlIHVzZWQgb25seSBpbiBhbgorICogaW5zZXJ0IG1vZGUuICBJdCBoYW5kbGVzIGZpeGluZyB0aGUgcmVwbGFjZSBzdGFjayBmb3IgUkVQTEFDRSBhbmQgVlJFUExBQ0UKKyAqIG1vZGVzLgorICovCisgICAgdm9pZAordHJ1bmNhdGVfc3BhY2VzKGxpbmUpCisgICAgY2hhcl91ICAqbGluZTsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICAvKiBmaW5kIHN0YXJ0IG9mIHRyYWlsaW5nIHdoaXRlIHNwYWNlICovCisgICAgZm9yIChpID0gKGludClTVFJMRU4obGluZSkgLSAxOyBpID49IDAgJiYgdmltX2lzd2hpdGUobGluZVtpXSk7IGktLSkKKyAgICB7CisJaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCSAgICByZXBsYWNlX2pvaW4oMCk7CSAgICAvKiByZW1vdmUgYSBOVUwgZnJvbSB0aGUgcmVwbGFjZSBzdGFjayAqLworICAgIH0KKyAgICBsaW5lW2kgKyAxXSA9IE5VTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9WUkVQTEFDRSkgfHwgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpIFwKKwl8fCBkZWZpbmVkKEZFQVRfQ09NTUVOVFMpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQmFja3NwYWNlIHRoZSBjdXJzb3IgdW50aWwgdGhlIGdpdmVuIGNvbHVtbi4gIEhhbmRsZXMgUkVQTEFDRSBhbmQgVlJFUExBQ0UKKyAqIG1vZGVzIGNvcnJlY3RseS4gIE1heSBhbHNvIGJlIHVzZWQgd2hlbiBub3QgaW4gaW5zZXJ0IG1vZGUgYXQgYWxsLgorICovCisgICAgdm9pZAorYmFja3NwYWNlX3VudGlsX2NvbHVtbihjb2wpCisgICAgaW50CSAgICBjb2w7Cit7CisgICAgd2hpbGUgKChpbnQpY3Vyd2luLT53X2N1cnNvci5jb2wgPiBjb2wpCisgICAgeworCWN1cndpbi0+d19jdXJzb3IuY29sLS07CisJaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCSAgICByZXBsYWNlX2RvX2JzKCk7CisJZWxzZQorCSAgICAodm9pZClkZWxfY2hhcihGQUxTRSk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfSU5TX0VYUEFORCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBJcyB0aGUgY2hhcmFjdGVyICdjJyBhIHZhbGlkIGtleSB0byBnbyB0byBvciBrZWVwIHVzIGluIENUUkwtWCBtb2RlPworICogVGhpcyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IG1vZGUuCisgKi8KKyAgICBpbnQKK3ZpbV9pc19jdHJsX3hfa2V5KGMpCisgICAgaW50CSAgICBjOworeworICAgIC8qIEFsd2F5cyBhbGxvdyBeUiAtIGxldCBpdCdzIHJlc3VsdHMgdGhlbiBiZSBjaGVja2VkICovCisgICAgaWYgKGMgPT0gQ3RybF9SKQorCXJldHVybiBUUlVFOworCisgICAgc3dpdGNoIChjdHJsX3hfbW9kZSkKKyAgICB7CisJY2FzZSAwOgkJICAgIC8qIE5vdCBpbiBhbnkgQ1RSTC1YIG1vZGUgKi8KKwkgICAgcmV0dXJuIChjID09IEN0cmxfTiB8fCBjID09IEN0cmxfUCB8fCBjID09IEN0cmxfWCk7CisJY2FzZSBDVFJMX1hfTk9UX0RFRklORURfWUVUOgorCSAgICByZXR1cm4gKCAgICAgICBjID09IEN0cmxfWCB8fCBjID09IEN0cmxfWSB8fCBjID09IEN0cmxfRQorCQkgICAgfHwgYyA9PSBDdHJsX0wgfHwgYyA9PSBDdHJsX0YgfHwgYyA9PSBDdHJsX1JTQgorCQkgICAgfHwgYyA9PSBDdHJsX0kgfHwgYyA9PSBDdHJsX0QgfHwgYyA9PSBDdHJsX1AKKwkJICAgIHx8IGMgPT0gQ3RybF9OIHx8IGMgPT0gQ3RybF9UIHx8IGMgPT0gQ3RybF9WCisJCSAgICB8fCBjID09IEN0cmxfUSk7CisJY2FzZSBDVFJMX1hfU0NST0xMOgorCSAgICByZXR1cm4gKGMgPT0gQ3RybF9ZIHx8IGMgPT0gQ3RybF9FKTsKKwljYXNlIENUUkxfWF9XSE9MRV9MSU5FOgorCSAgICByZXR1cm4gKGMgPT0gQ3RybF9MIHx8IGMgPT0gQ3RybF9QIHx8IGMgPT0gQ3RybF9OKTsKKwljYXNlIENUUkxfWF9GSUxFUzoKKwkgICAgcmV0dXJuIChjID09IEN0cmxfRiB8fCBjID09IEN0cmxfUCB8fCBjID09IEN0cmxfTik7CisJY2FzZSBDVFJMX1hfRElDVElPTkFSWToKKwkgICAgcmV0dXJuIChjID09IEN0cmxfSyB8fCBjID09IEN0cmxfUCB8fCBjID09IEN0cmxfTik7CisJY2FzZSBDVFJMX1hfVEhFU0FVUlVTOgorCSAgICByZXR1cm4gKGMgPT0gQ3RybF9UIHx8IGMgPT0gQ3RybF9QIHx8IGMgPT0gQ3RybF9OKTsKKwljYXNlIENUUkxfWF9UQUdTOgorCSAgICByZXR1cm4gKGMgPT0gQ3RybF9SU0IgfHwgYyA9PSBDdHJsX1AgfHwgYyA9PSBDdHJsX04pOworI2lmZGVmIEZFQVRfRklORF9JRAorCWNhc2UgQ1RSTF9YX1BBVEhfUEFUVEVSTlM6CisJICAgIHJldHVybiAoYyA9PSBDdHJsX1AgfHwgYyA9PSBDdHJsX04pOworCWNhc2UgQ1RSTF9YX1BBVEhfREVGSU5FUzoKKwkgICAgcmV0dXJuIChjID09IEN0cmxfRCB8fCBjID09IEN0cmxfUCB8fCBjID09IEN0cmxfTik7CisjZW5kaWYKKwljYXNlIENUUkxfWF9DTURMSU5FOgorCSAgICByZXR1cm4gKGMgPT0gQ3RybF9WIHx8IGMgPT0gQ3RybF9RIHx8IGMgPT0gQ3RybF9QIHx8IGMgPT0gQ3RybF9OCisJCSAgICB8fCBjID09IEN0cmxfWCk7CisgICAgfQorICAgIEVNU0coXyhlX2ludGVybmFsKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogVGhpcyBpcyBsaWtlIGluc19jb21wbF9hZGQoKSwgYnV0IGlmIGljIGFuZCBpbmYgYXJlIHNldCwgdGhlbiB0aGUKKyAqIGNhc2Ugb2YgdGhlIG9yaWdpbmFsbHkgdHlwZWQgdGV4dCBpcyB1c2VkLCBhbmQgdGhlIGNhc2Ugb2YgdGhlIGNvbXBsZXRlZAorICogdGV4dCBpcyBpbmZlcmVkLCBpZSB0aGlzIHRyaWVzIHRvIHdvcmsgb3V0IHdoYXQgY2FzZSB5b3UgcHJvYmFibHkgd2FudGVkCisgKiB0aGUgcmVzdCBvZiB0aGUgd29yZCB0byBiZSBpbiAtLSB3ZWJiCisgKi8KKyAgICBpbnQKK2luc19jb21wbF9hZGRfaW5mZXJjYXNlKHN0ciwgbGVuLCBmbmFtZSwgZGlyLCByZXVzZSkKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJZGlyOworICAgIGludAkJcmV1c2U7Cit7CisgICAgaW50CQloYXNfbG93ZXIgPSBGQUxTRTsKKyAgICBpbnQJCXdhc19sZXR0ZXIgPSBGQUxTRTsKKyAgICBpbnQJCWlkeDsKKworICAgIGlmIChwX2ljICYmIGN1cmJ1Zi0+Yl9wX2luZiAmJiBsZW4gPCBJT1NJWkUpCisgICAgeworCS8qIEluZmVyIGNhc2Ugb2YgY29tcGxldGVkIHBhcnQgLS0gd2ViYiAqLworCS8qIFVzZSBJT2J1ZmYsIHN0ciB3b3VsZCBjaGFuZ2UgdGV4dCBpbiBidWZmZXIhICovCisJU1RSTkNQWShJT2J1ZmYsIHN0ciwgbGVuKTsKKwlJT2J1ZmZbbGVuXSA9IE5VTDsKKworCS8qIFJ1bGUgMTogV2VyZSBhbnkgY2hhcnMgY29udmVydGVkIHRvIGxvd2VyPyAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgY29tcGxldGlvbl9sZW5ndGg7ICsraWR4KQorCXsKKwkgICAgaWYgKGlzbG93ZXIob3JpZ2luYWxfdGV4dFtpZHhdKSkKKwkgICAgeworCQloYXNfbG93ZXIgPSBUUlVFOworCQlpZiAoaXN1cHBlcihJT2J1ZmZbaWR4XSkpCisJCXsKKwkJICAgIC8qIFJ1bGUgMSBpcyBzYXRpc2ZpZWQgKi8KKwkJICAgIGZvciAoaWR4ID0gY29tcGxldGlvbl9sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpCisJCQlJT2J1ZmZbaWR4XSA9IFRPTE9XRVJfTE9DKElPYnVmZltpZHhdKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKwkvKgorCSAqIFJ1bGUgMjogTm8gbG93ZXIgY2FzZSwgMm5kIGNvbnNlY3V0aXZlIGxldHRlciBjb252ZXJ0ZWQgdG8KKwkgKiB1cHBlciBjYXNlLgorCSAqLworCWlmICghaGFzX2xvd2VyKQorCXsKKwkgICAgZm9yIChpZHggPSAwOyBpZHggPCBjb21wbGV0aW9uX2xlbmd0aDsgKytpZHgpCisJICAgIHsKKwkJaWYgKHdhc19sZXR0ZXIgJiYgaXN1cHBlcihvcmlnaW5hbF90ZXh0W2lkeF0pCisJCQkJCQkgICAgICAmJiBpc2xvd2VyKElPYnVmZltpZHhdKSkKKwkJeworCQkgICAgLyogUnVsZSAyIGlzIHNhdGlzZmllZCAqLworCQkgICAgZm9yIChpZHggPSBjb21wbGV0aW9uX2xlbmd0aDsgaWR4IDwgbGVuOyArK2lkeCkKKwkJCUlPYnVmZltpZHhdID0gVE9VUFBFUl9MT0MoSU9idWZmW2lkeF0pOworCQkgICAgYnJlYWs7CisJCX0KKwkJd2FzX2xldHRlciA9IGlzYWxwaGEob3JpZ2luYWxfdGV4dFtpZHhdKTsKKwkgICAgfQorCX0KKworCS8qIENvcHkgdGhlIG9yaWdpbmFsIGNhc2Ugb2YgdGhlIHBhcnQgd2UgdHlwZWQgKi8KKwlTVFJOQ1BZKElPYnVmZiwgb3JpZ2luYWxfdGV4dCwgY29tcGxldGlvbl9sZW5ndGgpOworCisJcmV0dXJuIGluc19jb21wbF9hZGQoSU9idWZmLCBsZW4sIGZuYW1lLCBkaXIsIHJldXNlKTsKKyAgICB9CisgICAgcmV0dXJuIGluc19jb21wbF9hZGQoc3RyLCBsZW4sIGZuYW1lLCBkaXIsIHJldXNlKTsKK30KKworLyoKKyAqIEFkZCBhIG1hdGNoIHRvIHRoZSBsaXN0IG9mIG1hdGNoZXMuCisgKiBJZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGFscmVhZHkgaW4gdGhlIGxpc3Qgb2YgY29tcGxldGlvbnMsIHRoZW4gcmV0dXJuCisgKiBGQUlMLCBvdGhlcndpc2UgYWRkIGl0IHRvIHRoZSBsaXN0IGFuZCByZXR1cm4gT0suICBJZiB0aGVyZSBpcyBhbiBlcnJvciwKKyAqIG1heWJlIGJlY2F1c2UgYWxsb2MgcmV0dXJucyBOVUxMLCB0aGVuIFJFVF9FUlJPUiBpcyByZXR1cm5lZCAtLSB3ZWJiLgorICovCisgICAgc3RhdGljIGludAoraW5zX2NvbXBsX2FkZChzdHIsIGxlbiwgZm5hbWUsIGRpciwgcmV1c2UpCisgICAgY2hhcl91CSpzdHI7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCXJldXNlOworeworICAgIHN0cnVjdCBDb21wbGV0aW9uICptYXRjaDsKKworICAgIHVpX2JyZWFrY2hlY2soKTsKKyAgICBpZiAoZ290X2ludCkKKwlyZXR1cm4gUkVUX0VSUk9SOworICAgIGlmIChsZW4gPCAwKQorCWxlbiA9IChpbnQpU1RSTEVOKHN0cik7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1lIG1hdGNoIGlzIGFscmVhZHkgcHJlc2VudCwgZG9uJ3QgYWRkIGl0LgorICAgICAqLworICAgIGlmIChmaXJzdF9tYXRjaCAhPSBOVUxMKQorICAgIHsKKwltYXRjaCA9IGZpcnN0X21hdGNoOworCWRvCisJeworCSAgICBpZiAoICAgICEobWF0Y2gtPm9yaWdpbmFsICYgT1JJR0lOQUxfVEVYVCkKKwkJICAgICYmIFNUUk5DTVAobWF0Y2gtPnN0ciwgc3RyLCAoc2l6ZV90KWxlbikgPT0gMAorCQkgICAgJiYgbWF0Y2gtPnN0cltsZW5dID09IE5VTCkKKwkJcmV0dXJuIEZBSUw7CisJICAgIG1hdGNoID0gbWF0Y2gtPm5leHQ7CisJfSB3aGlsZSAobWF0Y2ggIT0gTlVMTCAmJiBtYXRjaCAhPSBmaXJzdF9tYXRjaCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBtYXRjaCBzdHJ1Y3R1cmUuCisgICAgICogQ29weSB0aGUgdmFsdWVzIHRvIHRoZSBuZXcgbWF0Y2ggc3RydWN0dXJlLgorICAgICAqLworICAgIG1hdGNoID0gKHN0cnVjdCBDb21wbGV0aW9uICopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihzdHJ1Y3QgQ29tcGxldGlvbikpOworICAgIGlmIChtYXRjaCA9PSBOVUxMKQorCXJldHVybiBSRVRfRVJST1I7CisgICAgbWF0Y2gtPm51bWJlciA9IC0xOworICAgIGlmIChyZXVzZSAmIE9SSUdJTkFMX1RFWFQpCisgICAgeworCW1hdGNoLT5udW1iZXIgPSAwOworCW1hdGNoLT5zdHIgPSBvcmlnaW5hbF90ZXh0OworICAgIH0KKyAgICBlbHNlIGlmICgobWF0Y2gtPnN0ciA9IHZpbV9zdHJuc2F2ZShzdHIsIGxlbikpID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKG1hdGNoKTsKKwlyZXR1cm4gUkVUX0VSUk9SOworICAgIH0KKyAgICAvKiBtYXRjaC1mbmFtZSBpczoKKyAgICAgKiAtIGN1cnJfbWF0Y2gtPmZuYW1lIGlmIGl0IGlzIGEgc3RyaW5nIGVxdWFsIHRvIGZuYW1lLgorICAgICAqIC0gYSBjb3B5IG9mIGZuYW1lLCBGUkVFX0ZOQU1FIGlzIHNldCB0byBmcmVlIGxhdGVyIFRIRSBhbGxvY2F0ZWQgbWVtLgorICAgICAqIC0gTlVMTCBvdGhlcndpc2UuCS0tQWNldmVkbyAqLworICAgIGlmIChmbmFtZSAmJiBjdXJyX21hdGNoICYmIGN1cnJfbWF0Y2gtPmZuYW1lCisJICAgICAgJiYgU1RSQ01QKGZuYW1lLCBjdXJyX21hdGNoLT5mbmFtZSkgPT0gMCkKKwltYXRjaC0+Zm5hbWUgPSBjdXJyX21hdGNoLT5mbmFtZTsKKyAgICBlbHNlIGlmIChmbmFtZSAmJiAobWF0Y2gtPmZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpKSAhPSBOVUxMKQorCXJldXNlIHw9IEZSRUVfRk5BTUU7CisgICAgZWxzZQorCW1hdGNoLT5mbmFtZSA9IE5VTEw7CisgICAgbWF0Y2gtPm9yaWdpbmFsID0gcmV1c2U7CisKKyAgICAvKgorICAgICAqIExpbmsgdGhlIG5ldyBtYXRjaCBzdHJ1Y3R1cmUgaW4gdGhlIGxpc3Qgb2YgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBpZiAoZmlyc3RfbWF0Y2ggPT0gTlVMTCkKKwltYXRjaC0+bmV4dCA9IG1hdGNoLT5wcmV2ID0gTlVMTDsKKyAgICBlbHNlIGlmIChkaXIgPT0gRk9SV0FSRCkKKyAgICB7CisJbWF0Y2gtPm5leHQgPSBjdXJyX21hdGNoLT5uZXh0OworCW1hdGNoLT5wcmV2ID0gY3Vycl9tYXRjaDsKKyAgICB9CisgICAgZWxzZQkvKiBCQUNLV0FSRCAqLworICAgIHsKKwltYXRjaC0+bmV4dCA9IGN1cnJfbWF0Y2g7CisJbWF0Y2gtPnByZXYgPSBjdXJyX21hdGNoLT5wcmV2OworICAgIH0KKyAgICBpZiAobWF0Y2gtPm5leHQpCisJbWF0Y2gtPm5leHQtPnByZXYgPSBtYXRjaDsKKyAgICBpZiAobWF0Y2gtPnByZXYpCisJbWF0Y2gtPnByZXYtPm5leHQgPSBtYXRjaDsKKyAgICBlbHNlCS8qIGlmIHRoZXJlJ3Mgbm90aGluZyBiZWZvcmUsIGl0IGlzIHRoZSBmaXJzdCBtYXRjaCAqLworCWZpcnN0X21hdGNoID0gbWF0Y2g7CisgICAgY3Vycl9tYXRjaCA9IG1hdGNoOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogQWRkIGFuIGFycmF5IG9mIG1hdGNoZXMgdG8gdGhlIGxpc3Qgb2YgbWF0Y2hlcy4KKyAqIEZyZWVzIG1hdGNoZXNbXS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfY29tcGxfYWRkX21hdGNoZXMobnVtX21hdGNoZXMsIG1hdGNoZXMsIGRpcikKKyAgICBpbnQJCW51bV9tYXRjaGVzOworICAgIGNoYXJfdQkqKm1hdGNoZXM7CisgICAgaW50CQlkaXI7Cit7CisgICAgaW50CQlpOworICAgIGludAkJYWRkX3IgPSBPSzsKKyAgICBpbnQJCWxkaXIgPSBkaXI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXMgJiYgYWRkX3IgIT0gUkVUX0VSUk9SOyBpKyspCisJaWYgKChhZGRfciA9IGluc19jb21wbF9hZGQobWF0Y2hlc1tpXSwgLTEsIE5VTEwsIGxkaXIsIDApKSA9PSBPSykKKwkgICAgLyogaWYgZGlyIHdhcyBCQUNLV0FSRCB0aGVuIGhvbm9yIGl0IGp1c3Qgb25jZSAqLworCSAgICBsZGlyID0gRk9SV0FSRDsKKyAgICBGcmVlV2lsZChudW1fbWF0Y2hlcywgbWF0Y2hlcyk7Cit9CisKKy8qIE1ha2UgdGhlIGNvbXBsZXRpb24gbGlzdCBjeWNsaWMuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtYXRjaGVzIChleGNsdWRpbmcgdGhlIG9yaWdpbmFsKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19jb21wbF9tYWtlX2N5Y2xpYygpCit7CisgICAgc3RydWN0IENvbXBsZXRpb24gKm1hdGNoOworICAgIGludAkgICAgY291bnQgPSAwOworCisgICAgaWYgKGZpcnN0X21hdGNoICE9IE5VTEwpCisgICAgeworCS8qCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqLworCW1hdGNoID0gZmlyc3RfbWF0Y2g7CisJLyogdGhlcmUncyBhbHdheXMgYW4gZW50cnkgZm9yIHRoZSBvcmlnaW5hbF90ZXh0LCBpdCBkb2Vzbid0IGNvdW50LiAqLworCXdoaWxlIChtYXRjaC0+bmV4dCAhPSBOVUxMICYmIG1hdGNoLT5uZXh0ICE9IGZpcnN0X21hdGNoKQorCXsKKwkgICAgbWF0Y2ggPSBtYXRjaC0+bmV4dDsKKwkgICAgKytjb3VudDsKKwl9CisJbWF0Y2gtPm5leHQgPSBmaXJzdF9tYXRjaDsKKwlmaXJzdF9tYXRjaC0+cHJldiA9IG1hdGNoOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgRElDVF9GSVJTVAkoMSkJLyogdXNlIGp1c3QgZmlyc3QgZWxlbWVudCBpbiAiZGljdCIgKi8KKyNkZWZpbmUgRElDVF9FWEFDVAkoMikJLyogImRpY3QiIGlzIHRoZSBleGFjdCBuYW1lIG9mIGEgZmlsZSAqLworLyoKKyAqIEFkZCBhbnkgaWRlbnRpZmllcnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybiB0byB0aGUgbGlzdCBvZgorICogY29tcGxldGlvbnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zX2NvbXBsX2RpY3Rpb25hcmllcyhkaWN0LCBwYXQsIGRpciwgZmxhZ3MsIHRoZXNhdXJ1cykKKyAgICBjaGFyX3UJKmRpY3Q7CisgICAgY2hhcl91CSpwYXQ7CisgICAgaW50CQlkaXI7CisgICAgaW50CQlmbGFnczsKKyAgICBpbnQJCXRoZXNhdXJ1czsKK3sKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBGSUxFCSpmcDsKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworICAgIGludAkJYWRkX3I7CisgICAgY2hhcl91CSoqZmlsZXM7CisgICAgaW50CQljb3VudDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlzYXZlX3Bfc2NzOworCisgICAgYnVmID0gYWxsb2MoTFNJWkUpOworICAgIC8qIElmICdpbmZlcmNhc2UnIGlzIHNldCwgZG9uJ3QgdXNlICdzbWFydGNhc2UnIGhlcmUgKi8KKyAgICBzYXZlX3Bfc2NzID0gcF9zY3M7CisgICAgaWYgKGN1cmJ1Zi0+Yl9wX2luZikKKwlwX3NjcyA9IEZBTFNFOworICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworICAgIC8qIGlnbm9yZSBjYXNlIGRlcGVuZHMgb24gJ2lnbm9yZWNhc2UnLCAnc21hcnRjYXNlJyBhbmQgInBhdCIgKi8KKyAgICByZWdtYXRjaC5ybV9pYyA9IGlnbm9yZWNhc2UocGF0KTsKKyAgICB3aGlsZSAoYnVmICE9IE5VTEwgJiYgcmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMICYmICpkaWN0ICE9IE5VTAorCQkgICAgICAgJiYgIWdvdF9pbnQgJiYgIWNvbXBsZXRpb25faW50ZXJydXB0ZWQpCisgICAgeworCS8qIGNvcHkgb25lIGRpY3Rpb25hcnkgZmlsZSBuYW1lIGludG8gYnVmICovCisJaWYgKGZsYWdzID09IERJQ1RfRVhBQ1QpCisJeworCSAgICBjb3VudCA9IDE7CisJICAgIGZpbGVzID0gJmRpY3Q7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEV4cGFuZCB3aWxkY2FyZHMgaW4gdGhlIGRpY3Rpb25hcnkgbmFtZSwgYnV0IGRvIG5vdCBhbGxvdworCSAgICAgKiBiYWNrdGlja3MgKGZvciBzZWN1cml0eSwgdGhlICdkaWN0JyBvcHRpb24gbWF5IGhhdmUgYmVlbiBzZXQgaW4KKwkgICAgICogYSBtb2RlbGluZSkuICovCisJICAgIGNvcHlfb3B0aW9uX3BhcnQoJmRpY3QsIGJ1ZiwgTFNJWkUsICIsIik7CisJICAgIGlmICh2aW1fc3RyY2hyKGJ1ZiwgJ2AnKSAhPSBOVUxMCisJCSAgICB8fCBleHBhbmRfd2lsZGNhcmRzKDEsICZidWYsICZjb3VudCwgJmZpbGVzLAorCQkJCQkJICAgICBFV19GSUxFfEVXX1NJTEVOVCkgIT0gT0spCisJCWNvdW50ID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgIWdvdF9pbnQgJiYgIWNvbXBsZXRpb25faW50ZXJydXB0ZWQ7IGkrKykKKwl7CisJICAgIGZwID0gbWNoX2ZvcGVuKChjaGFyICopZmlsZXNbaV0sICJyIik7ICAvKiBvcGVuIGRpY3Rpb25hcnkgZmlsZSAqLworCSAgICBpZiAoZmxhZ3MgIT0gRElDVF9FWEFDVCkKKwkgICAgeworCQlzcHJpbnRmKChjaGFyKilJT2J1ZmYsIF8oIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIiksCisJCQkJCQkJICAgIChjaGFyICopZmlsZXNbaV0pOworCQltc2dfdHJ1bmNfYXR0cihJT2J1ZmYsIFRSVUUsIGhsX2F0dHIoSExGX1IpKTsKKwkgICAgfQorCisJICAgIGlmIChmcCAhPSBOVUxMKQorCSAgICB7CisJCS8qCisJCSAqIFJlYWQgZGljdGlvbmFyeSBmaWxlIGxpbmUgYnkgbGluZS4KKwkJICogQ2hlY2sgZWFjaCBsaW5lIGZvciBhIG1hdGNoLgorCQkgKi8KKwkJd2hpbGUgKCFnb3RfaW50ICYmICFjb21wbGV0aW9uX2ludGVycnVwdGVkCisJCQkJJiYgIXZpbV9mZ2V0cyhidWYsIExTSVpFLCBmcCkpCisJCXsKKwkJICAgIHB0ciA9IGJ1ZjsKKwkJICAgIHdoaWxlICh2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIGJ1ZiwgKGNvbG5yX1QpKHB0ciAtIGJ1ZikpKQorCQkgICAgeworCQkJcHRyID0gcmVnbWF0Y2guc3RhcnRwWzBdOworCQkJcHRyID0gZmluZF93b3JkX2VuZChwdHIpOworCQkJYWRkX3IgPSBpbnNfY29tcGxfYWRkX2luZmVyY2FzZShyZWdtYXRjaC5zdGFydHBbMF0sCisJCQkJCSAgICAgIChpbnQpKHB0ciAtIHJlZ21hdGNoLnN0YXJ0cFswXSksCisJCQkJCQkJICAgIGZpbGVzW2ldLCBkaXIsIDApOworCQkJaWYgKHRoZXNhdXJ1cykKKwkJCXsKKwkJCSAgICBjaGFyX3UgKndzdGFydDsKKworCQkJICAgIC8qCisJCQkgICAgICogQWRkIHRoZSBvdGhlciBtYXRjaGVzIG9uIHRoZSBsaW5lCisJCQkgICAgICovCisJCQkgICAgd2hpbGUgKCFnb3RfaW50KQorCQkJICAgIHsKKwkJCQkvKiBGaW5kIHN0YXJ0IG9mIHRoZSBuZXh0IHdvcmQuICBTa2lwIHdoaXRlCisJCQkJICogc3BhY2UgYW5kIHB1bmN0dWF0aW9uLiAqLworCQkJCXB0ciA9IGZpbmRfd29yZF9zdGFydChwdHIpOworCQkJCWlmICgqcHRyID09IE5VTCB8fCAqcHRyID09IE5MKQorCQkJCSAgICBicmVhazsKKwkJCQl3c3RhcnQgPSBwdHI7CisKKwkJCQkvKiBGaW5kIGVuZCBvZiB0aGUgd29yZCBhbmQgYWRkIGl0LiAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCQlpZiAoaGFzX21ieXRlKQorCQkJCSAgICAvKiBKYXBhbmVzZSB3b3JkcyBtYXkgaGF2ZSBjaGFyYWN0ZXJzIGluCisJCQkJICAgICAqIGRpZmZlcmVudCBjbGFzc2VzLCBvbmx5IHNlcGFyYXRlIHdvcmRzCisJCQkJICAgICAqIHdpdGggc2luZ2xlLWJ5dGUgbm9uLXdvcmQgY2hhcmFjdGVycy4gKi8KKwkJCQkgICAgd2hpbGUgKCpwdHIgIT0gTlVMKQorCQkJCSAgICB7CisJCQkJCWludCBsID0gKCptYl9wdHIybGVuX2NoZWNrKShwdHIpOworCisJCQkJCWlmIChsIDwgMiAmJiAhdmltX2lzd29yZGMoKnB0cikpCisJCQkJCSAgICBicmVhazsKKwkJCQkJcHRyICs9IGw7CisJCQkJICAgIH0KKwkJCQllbHNlCisjZW5kaWYKKwkJCQkgICAgcHRyID0gZmluZF93b3JkX2VuZChwdHIpOworCQkJCWFkZF9yID0gaW5zX2NvbXBsX2FkZF9pbmZlcmNhc2Uod3N0YXJ0LAorCQkJCQkoaW50KShwdHIgLSB3c3RhcnQpLCBmaWxlc1tpXSwgZGlyLCAwKTsKKwkJCSAgICB9CisJCQl9CisJCQlpZiAoYWRkX3IgPT0gT0spCisJCQkgICAgLyogaWYgZGlyIHdhcyBCQUNLV0FSRCB0aGVuIGhvbm9yIGl0IGp1c3Qgb25jZSAqLworCQkJICAgIGRpciA9IEZPUldBUkQ7CisJCQllbHNlIGlmIChhZGRfciA9PSBSRVRfRVJST1IpCisJCQkgICAgYnJlYWs7CisJCQkvKiBhdm9pZCBleHBlbnNpdmUgY2FsbCB0byB2aW1fcmVnZXhlYygpIHdoZW4gYXQgZW5kCisJCQkgKiBvZiBsaW5lICovCisJCQlpZiAoKnB0ciA9PSAnXG4nIHx8IGdvdF9pbnQpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCSAgICBsaW5lX2JyZWFrY2hlY2soKTsKKwkJICAgIGluc19jb21wbF9jaGVja19rZXlzKCk7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwkgICAgfQorCX0KKwlpZiAoZmxhZ3MgIT0gRElDVF9FWEFDVCkKKwkgICAgRnJlZVdpbGQoY291bnQsIGZpbGVzKTsKKwlpZiAoZmxhZ3MpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBwX3NjcyA9IHNhdmVfcF9zY3M7CisgICAgdmltX2ZyZWUocmVnbWF0Y2gucmVncHJvZyk7CisgICAgdmltX2ZyZWUoYnVmKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHdvcmQuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhciBvZiB0aGUgd29yZC4gIEFsc28gc3RvcHMgYXQgYSBOVUwuCisgKi8KKyAgICBjaGFyX3UgKgorZmluZF93b3JkX3N0YXJ0KHB0cikKKyAgICBjaGFyX3UJKnB0cjsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSkKKwl3aGlsZSAoKnB0ciAhPSBOVUwgJiYgKnB0ciAhPSAnXG4nICYmIG1iX2dldF9jbGFzcyhwdHIpIDw9IDEpCisJICAgIHB0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cik7CisgICAgZWxzZQorI2VuZGlmCisJd2hpbGUgKCpwdHIgIT0gTlVMICYmICpwdHIgIT0gJ1xuJyAmJiAhdmltX2lzd29yZGMoKnB0cikpCisJICAgICsrcHRyOworICAgIHJldHVybiBwdHI7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHdvcmQuICBBc3N1bWVzIGl0IHN0YXJ0cyBpbnNpZGUgYSB3b3JkLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8ganVzdCBhZnRlciB0aGUgd29yZC4KKyAqLworICAgIGNoYXJfdSAqCitmaW5kX3dvcmRfZW5kKHB0cikKKyAgICBjaGFyX3UJKnB0cjsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlzdGFydF9jbGFzczsKKworICAgIGlmIChoYXNfbWJ5dGUpCisgICAgeworCXN0YXJ0X2NsYXNzID0gbWJfZ2V0X2NsYXNzKHB0cik7CisJaWYgKHN0YXJ0X2NsYXNzID4gMSkKKwkgICAgd2hpbGUgKCpwdHIgIT0gTlVMKQorCSAgICB7CisJCXB0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cik7CisJCWlmIChtYl9nZXRfY2xhc3MocHRyKSAhPSBzdGFydF9jbGFzcykKKwkJICAgIGJyZWFrOworCSAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCXdoaWxlICh2aW1faXN3b3JkYygqcHRyKSkKKwkgICAgKytwdHI7CisgICAgcmV0dXJuIHB0cjsKK30KKworLyoKKyAqIEZyZWUgdGhlIGxpc3Qgb2YgY29tcGxldGlvbnMKKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfY29tcGxfZnJlZSgpCit7CisgICAgc3RydWN0IENvbXBsZXRpb24gKm1hdGNoOworCisgICAgdmltX2ZyZWUoY29tcGxldGVfcGF0KTsKKyAgICBjb21wbGV0ZV9wYXQgPSBOVUxMOworCisgICAgaWYgKGZpcnN0X21hdGNoID09IE5VTEwpCisJcmV0dXJuOworICAgIGN1cnJfbWF0Y2ggPSBmaXJzdF9tYXRjaDsKKyAgICBkbworICAgIHsKKwltYXRjaCA9IGN1cnJfbWF0Y2g7CisJY3Vycl9tYXRjaCA9IGN1cnJfbWF0Y2gtPm5leHQ7CisJdmltX2ZyZWUobWF0Y2gtPnN0cik7CisJLyogc2V2ZXJhbCBlbnRyaWVzIG1heSB1c2UgdGhlIHNhbWUgZm5hbWUsIGZyZWUgaXQganVzdCBvbmNlLiAqLworCWlmIChtYXRjaC0+b3JpZ2luYWwgJiBGUkVFX0ZOQU1FKQorCSAgICB2aW1fZnJlZShtYXRjaC0+Zm5hbWUpOworCXZpbV9mcmVlKG1hdGNoKTsKKyAgICB9IHdoaWxlIChjdXJyX21hdGNoICE9IE5VTEwgJiYgY3Vycl9tYXRjaCAhPSBmaXJzdF9tYXRjaCk7CisgICAgZmlyc3RfbWF0Y2ggPSBjdXJyX21hdGNoID0gTlVMTDsKK30KKworICAgIHN0YXRpYyB2b2lkCitpbnNfY29tcGxfY2xlYXIoKQoreworICAgIGNvbnRpbnVlX3N0YXR1cyA9IDA7CisgICAgc3RhcnRlZF9jb21wbGV0aW9uID0gRkFMU0U7CisgICAgY29tcGxldGlvbl9tYXRjaGVzID0gMDsKKyAgICB2aW1fZnJlZShjb21wbGV0ZV9wYXQpOworICAgIGNvbXBsZXRlX3BhdCA9IE5VTEw7CisgICAgc2F2ZV9zbSA9IC0xOworICAgIGVkaXRfc3VibW9kZV9leHRyYSA9IE5VTEw7Cit9CisKKy8qCisgKiBQcmVwYXJlIGZvciBJbnNlcnQgbW9kZSBjb21wbGV0aW9uLCBvciBzdG9wIGl0LgorICovCisgICAgc3RhdGljIHZvaWQKK2luc19jb21wbF9wcmVwKGMpCisgICAgaW50CSAgICBjOworeworICAgIGNoYXJfdQkqcHRyOworICAgIGNoYXJfdQkqdG1wX3B0cjsKKyAgICBpbnQJCXRlbXA7CisgICAgaW50CQl3YW50X2NpbmRlbnQ7CisKKyAgICAvKiBGb3JnZXQgYW55IHByZXZpb3VzICdzcGVjaWFsJyBtZXNzYWdlcyBpZiB0aGlzIGlzIGFjdHVhbGx5CisgICAgICogYSBeWCBtb2RlIGtleSAtIGJhciBeUiwgaW4gd2hpY2ggY2FzZSB3ZSB3YWl0IHRvIHNlZSB3aGF0IGl0IGdpdmVzIHVzLgorICAgICAqLworICAgIGlmIChjICE9IEN0cmxfUiAmJiB2aW1faXNfY3RybF94X2tleShjKSkKKwllZGl0X3N1Ym1vZGVfZXh0cmEgPSBOVUxMOworCisgICAgLyogSWdub3JlIGVuZCBvZiBTZWxlY3QgbW9kZSBtYXBwaW5nICovCisgICAgaWYgKGMgPT0gS19TRUxFQ1QpCisJcmV0dXJuOworCisgICAgaWYgKGN0cmxfeF9tb2RlID09IENUUkxfWF9OT1RfREVGSU5FRF9ZRVQpCisgICAgeworCS8qCisJICogV2UgaGF2ZSBqdXN0IHR5cGVkIENUUkwtWCBhbmQgYXJlbid0IHF1aXRlIHN1cmUgd2hpY2ggQ1RSTC1YIG1vZGUKKwkgKiBpdCB3aWxsIGJlIHlldC4gIE5vdyB3ZSBkZWNpZGUuCisJICovCisJc3dpdGNoIChjKQorCXsKKwkgICAgY2FzZSBDdHJsX0U6CisJICAgIGNhc2UgQ3RybF9ZOgorCQljdHJsX3hfbW9kZSA9IENUUkxfWF9TQ1JPTEw7CisJCWlmICghKFN0YXRlICYgUkVQTEFDRV9GTEFHKSkKKwkJICAgIGVkaXRfc3VibW9kZSA9IChjaGFyX3UgKilfKCIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiKTsKKwkJZWxzZQorCQkgICAgZWRpdF9zdWJtb2RlID0gKGNoYXJfdSAqKV8oIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiKTsKKwkJZWRpdF9zdWJtb2RlX3ByZSA9IE5VTEw7CisJCXNob3dtb2RlKCk7CisJCWJyZWFrOworCSAgICBjYXNlIEN0cmxfTDoKKwkJY3RybF94X21vZGUgPSBDVFJMX1hfV0hPTEVfTElORTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ3RybF9GOgorCQljdHJsX3hfbW9kZSA9IENUUkxfWF9GSUxFUzsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ3RybF9LOgorCQljdHJsX3hfbW9kZSA9IENUUkxfWF9ESUNUSU9OQVJZOworCQlicmVhazsKKwkgICAgY2FzZSBDdHJsX1I6CisJCS8qIFNpbXBseSBhbGxvdyBeUiB0byBoYXBwZW4gd2l0aG91dCBhZmZlY3RpbmcgXlggbW9kZSAqLworCQlicmVhazsKKwkgICAgY2FzZSBDdHJsX1Q6CisJCWN0cmxfeF9tb2RlID0gQ1RSTF9YX1RIRVNBVVJVUzsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ3RybF9SU0I6CisJCWN0cmxfeF9tb2RlID0gQ1RSTF9YX1RBR1M7CisJCWJyZWFrOworI2lmZGVmIEZFQVRfRklORF9JRAorCSAgICBjYXNlIEN0cmxfSToKKwkgICAgY2FzZSBLX1NfVEFCOgorCQljdHJsX3hfbW9kZSA9IENUUkxfWF9QQVRIX1BBVFRFUk5TOworCQlicmVhazsKKwkgICAgY2FzZSBDdHJsX0Q6CisJCWN0cmxfeF9tb2RlID0gQ1RSTF9YX1BBVEhfREVGSU5FUzsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBDdHJsX1Y6CisJICAgIGNhc2UgQ3RybF9ROgorCQljdHJsX3hfbW9kZSA9IENUUkxfWF9DTURMSU5FOworCQlicmVhazsKKwkgICAgY2FzZSBDdHJsX1A6CisJICAgIGNhc2UgQ3RybF9OOgorCQkvKiBeWF5QIG1lYW5zIExPQ0FMIGV4cGFuc2lvbiBpZiBub3RoaW5nIGludGVycnVwdGVkIChlZyB3ZQorCQkgKiBqdXN0IHN0YXJ0ZWQgXlggbW9kZSwgb3IgdGhlcmUgd2VyZSBlbm91Z2ggXlgncyB0byBjYW5jZWwKKwkJICogdGhlIHByZXZpb3VzIG1vZGUsIHNheSBeWF5GXlheWF5QIG9yIF5QXlheWF5YXlAsIHNlZSBiZWxvdykKKwkJICogZG8gbm9ybWFsIGV4cGFuc2lvbiB3aGVuIGludGVycnVwdGluZyBhIGRpZmZlcmVudCBtb2RlIChzYXkKKwkJICogXlheRl5YXlAgb3IgXlBeWF5YXlAsIHNlZSBiZWxvdykKKwkJICogbm90aGluZyBjaGFuZ2VzIGlmIGludGVycnVwdGluZyBtb2RlIDAsIChlZywgdGhlIGZsYWcKKwkJICogZG9lc24ndCBjaGFuZ2Ugd2hlbiBnb2luZyB0byBBRERJTkcgbW9kZSAgLS0gQWNldmVkbyAqLworCQlpZiAoIShjb250aW51ZV9zdGF0dXMgJiBDT05UX0lOVFJQVCkpCisJCSAgICBjb250aW51ZV9zdGF0dXMgfD0gQ09OVF9MT0NBTDsKKwkJZWxzZSBpZiAoY29udGludWVfbW9kZSAhPSAwKQorCQkgICAgY29udGludWVfc3RhdHVzICY9IH5DT05UX0xPQ0FMOworCQkvKiBGQUxMVEhST1VHSCAqLworCSAgICBkZWZhdWx0OgorCQkvKiBpZiB3ZSBoYXZlIHR5cGVkIGF0IGxlYXN0IDIgXlgncy4uLiBmb3IgbW9kZXMgIT0gMCwgd2Ugc2V0CisJCSAqIGNvbnRpbnVlX3N0YXR1cyA9IDAgKGVnLCBhcyBpZiB3ZSBoYWQganVzdCBzdGFydGVkIF5YIG1vZGUpCisJCSAqIGZvciBtb2RlIDAsIHdlIHNldCBjb250aW51ZV9tb2RlIHRvIGFuIGltcG9zc2libGUgdmFsdWUsIGluCisJCSAqIGJvdGggY2FzZXMgXlheWCBjYW4gYmUgdXNlZCB0byByZXN0YXJ0IHRoZSBzYW1lIG1vZGUKKwkJICogKGF2b2lkaW5nIEFERElORyBtb2RlKS4gICBVbmRvY3VtZW50ZWQgZmVhdHVyZToKKwkJICogSW4gYSBtb2RlICE9IDAgXlheUCBhbmQgXlheWF5QIHN0YXJ0ICdjb21wbGV0ZScgYW5kIGxvY2FsCisJCSAqIF5QIGV4cGFuc2lvbnMgcmVzcGVjdGl2ZWx5LglJbiBtb2RlIDAgYW4gZXh0cmEgXlggaXMKKwkJICogbmVlZGVkIHNpbmNlIF5YXlAgZ29lcyB0byBBRERJTkcgbW9kZSAgLS0gQWNldmVkbyAqLworCQlpZiAoYyA9PSBDdHJsX1gpCisJCXsKKwkJICAgIGlmIChjb250aW51ZV9tb2RlICE9IDApCisJCQljb250aW51ZV9zdGF0dXMgPSAwOworCQkgICAgZWxzZQorCQkJY29udGludWVfbW9kZSA9IENUUkxfWF9OT1RfREVGSU5FRF9ZRVQ7CisJCX0KKwkJY3RybF94X21vZGUgPSAwOworCQllZGl0X3N1Ym1vZGUgPSBOVUxMOworCQlzaG93bW9kZSgpOworCQlicmVhazsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKGN0cmxfeF9tb2RlICE9IDApCisgICAgeworCS8qIFdlJ3JlIGFscmVhZHkgaW4gQ1RSTC1YIG1vZGUsIGRvIHdlIHN0YXkgaW4gaXQ/ICovCisJaWYgKCF2aW1faXNfY3RybF94X2tleShjKSkKKwl7CisJICAgIGlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfU0NST0xMKQorCQljdHJsX3hfbW9kZSA9IDA7CisJICAgIGVsc2UKKwkJY3RybF94X21vZGUgPSBDVFJMX1hfRklOSVNIRUQ7CisJICAgIGVkaXRfc3VibW9kZSA9IE5VTEw7CisJfQorCXNob3dtb2RlKCk7CisgICAgfQorCisgICAgaWYgKHN0YXJ0ZWRfY29tcGxldGlvbiB8fCBjdHJsX3hfbW9kZSA9PSBDVFJMX1hfRklOSVNIRUQpCisgICAgeworCS8qIFNob3cgZXJyb3IgbWVzc2FnZSBmcm9tIGF0dGVtcHRlZCBrZXl3b3JkIGNvbXBsZXRpb24gKHByb2JhYmx5CisJICogJ1BhdHRlcm4gbm90IGZvdW5kJykgdW50aWwgYW5vdGhlciBrZXkgaXMgaGl0LCB0aGVuIGdvIGJhY2sgdG8KKwkgKiBzaG93aW5nIHdoYXQgbW9kZSB3ZSBhcmUgaW4uCisJICovCisJc2hvd21vZGUoKTsKKwlpZiAoKGN0cmxfeF9tb2RlID09IDAgJiYgYyAhPSBDdHJsX04gJiYgYyAhPSBDdHJsX1AgJiYgYyAhPSBDdHJsX1IpCisJCXx8IGN0cmxfeF9tb2RlID09IENUUkxfWF9GSU5JU0hFRCkKKwl7CisJICAgIC8qIEdldCBoZXJlIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCB0eXBpbmcgYSBzZXF1ZW5jZSBvZiBeTiBhbmQKKwkgICAgICogXlAgb3Igb3RoZXIgY29tcGxldGlvbiBjaGFyYWN0ZXJzIGluIENUUkwtWCBtb2RlLiAgRnJlZSB1cAorCSAgICAgKiBtZW1vcnkgdGhhdCB3YXMgdXNlZCwgYW5kIG1ha2Ugc3VyZSB3ZSBjYW4gcmVkbyB0aGUgaW5zZXJ0LgorCSAgICAgKi8KKwkgICAgaWYgKGN1cnJfbWF0Y2ggIT0gTlVMTCkKKwkgICAgeworCQkvKgorCQkgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHR5cGVkIHRleHQgaGFzIGJlZW4gY2hhbmdlZCwKKwkJICogZWcgd2hlbiBpZ25vcmVjYXNlIGlzIHNldCwgd2UgbXVzdCBhZGQgYmFjay1zcGFjZXMgdG8KKwkJICogdGhlIHJlZG8gYnVmZmVyLiAgV2UgYWRkIGFzIGZldyBhcyBuZWNlc3NhcnkgdG8gZGVsZXRlCisJCSAqIGp1c3QgdGhlIHBhcnQgb2YgdGhlIG9yaWdpbmFsIHRleHQgdGhhdCBoYXMgY2hhbmdlZC4KKwkJICovCisJCXB0ciA9IGN1cnJfbWF0Y2gtPnN0cjsKKwkJdG1wX3B0ciA9IG9yaWdpbmFsX3RleHQ7CisJCXdoaWxlICgqdG1wX3B0ciAmJiAqdG1wX3B0ciA9PSAqcHRyKQorCQl7CisJCSAgICArK3RtcF9wdHI7CisJCSAgICArK3B0cjsKKwkJfQorCQlmb3IgKHRlbXAgPSAwOyB0bXBfcHRyW3RlbXBdOyArK3RlbXApCisJCSAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZihLX0JTKTsKKwkJQXBwZW5kVG9SZWRvYnVmZkxpdChwdHIpOworCSAgICB9CisKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwkgICAgd2FudF9jaW5kZW50ID0gKGNhbl9jaW5kZW50ICYmIGNpbmRlbnRfb24oKSk7CisjZW5kaWYKKwkgICAgLyoKKwkgICAgICogV2hlbiBjb21wbGV0aW5nIHdob2xlIGxpbmVzOiBmaXggaW5kZW50IGZvciAnY2luZGVudCcuCisJICAgICAqIE90aGVyd2lzZSwgYnJlYWsgbGluZSBpZiBpdCdzIHRvbyBsb25nLgorCSAgICAgKi8KKwkgICAgaWYgKGNvbnRpbnVlX21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJICAgIHsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwkJLyogcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUgKi8KKwkJaWYgKHdhbnRfY2luZGVudCkKKwkJeworCQkgICAgZG9fY19leHByX2luZGVudCgpOworCQkgICAgd2FudF9jaW5kZW50ID0gRkFMU0U7CS8qIGRvbid0IGRvIGl0IGFnYWluICovCisJCX0KKyNlbmRpZgorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBwdXQgdGhlIGN1cnNvciBvbiB0aGUgbGFzdCBjaGFyLCBmb3IgJ3R3JyBmb3JtYXR0aW5nICovCisJCWN1cndpbi0+d19jdXJzb3IuY29sLS07CisJCWlmIChzdG9wX2Fycm93KCkgPT0gT0spCisJCSAgICBpbnNlcnRjaGFyKE5VTCwgMCwgLTEpOworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCsrOworCSAgICB9CisKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCisJICAgIGluc19jb21wbF9mcmVlKCk7CisJICAgIHN0YXJ0ZWRfY29tcGxldGlvbiA9IEZBTFNFOworCSAgICBjb21wbGV0aW9uX21hdGNoZXMgPSAwOworCSAgICBtc2dfY2xyX2NtZGxpbmUoKTsJCS8qIG5lY2Vzc2FyeSBmb3IgIm5vc2hvd21vZGUiICovCisJICAgIGN0cmxfeF9tb2RlID0gMDsKKwkgICAgcF9zbSA9IHNhdmVfc207CisJICAgIGlmIChlZGl0X3N1Ym1vZGUgIT0gTlVMTCkKKwkgICAgeworCQllZGl0X3N1Ym1vZGUgPSBOVUxMOworCQlzaG93bW9kZSgpOworCSAgICB9CisKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwkgICAgLyoKKwkgICAgICogSW5kZW50IG5vdyBpZiBhIGtleSB3YXMgdHlwZWQgdGhhdCBpcyBpbiAnY2lua2V5cycuCisJICAgICAqLworCSAgICBpZiAod2FudF9jaW5kZW50ICYmIGluX2NpbmtleXMoS0VZX0NPTVBMRVRFLCAnICcsIGluaW5kZW50KDApKSkKKwkJZG9fY19leHByX2luZGVudCgpOworI2VuZGlmCisJfQorICAgIH0KKworICAgIC8qIHJlc2V0IGNvbnRpbnVlXyogaWYgd2UgbGVmdCBleHBhbnNpb24tbW9kZSwgaWYgd2Ugc3RheSB0aGV5J2xsIGJlCisgICAgICogKHJlKXNldCBwcm9wZXJseSBpbiBpbnNfY29tcGxldGUoKSAqLworICAgIGlmICghdmltX2lzX2N0cmxfeF9rZXkoYykpCisgICAgeworCWNvbnRpbnVlX3N0YXR1cyA9IDA7CisJY29udGludWVfbW9kZSA9IDA7CisgICAgfQorfQorCisvKgorICogTG9vcHMgdGhyb3VnaCB0aGUgbGlzdCBvZiB3aW5kb3dzLCBsb2FkZWQtYnVmZmVycyBvciBub24tbG9hZGVkLWJ1ZmZlcnMKKyAqIChkZXBlbmRpbmcgb24gZmxhZykgc3RhcnRpbmcgZnJvbSBidWYgYW5kIGxvb2tpbmcgZm9yIGEgbm9uLXNjYW5uZWQKKyAqIGJ1ZmZlciAob3RoZXIgdGhhbiBjdXJidWYpLgljdXJidWYgaXMgc3BlY2lhbCwgaWYgaXQgaXMgY2FsbGVkIHdpdGgKKyAqIGJ1Zj1jdXJidWYgdGhlbiBpdCBoYXMgdG8gYmUgdGhlIGZpcnN0IGNhbGwgZm9yIGEgZ2l2ZW4gZmxhZy9leHBhbnNpb24uCisgKgorICogUmV0dXJucyB0aGUgYnVmZmVyIHRvIHNjYW4sIGlmIGFueSwgb3RoZXJ3aXNlIHJldHVybnMgY3VyYnVmIC0tIEFjZXZlZG8KKyAqLworICAgIHN0YXRpYyBidWZfVCAqCitpbnNfY29tcGxfbmV4dF9idWYoYnVmLCBmbGFnKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmbGFnOworeworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHN0YXRpYyB3aW5fVCAqd3A7CisjZW5kaWYKKworICAgIGlmIChmbGFnID09ICd3JykJCS8qIGp1c3Qgd2luZG93cyAqLworICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAoYnVmID09IGN1cmJ1ZikJLyogZmlyc3QgY2FsbCBmb3IgdGhpcyBmbGFnL2V4cGFuc2lvbiAqLworCSAgICB3cCA9IGN1cndpbjsKKwl3aGlsZSAoKHdwID0gd3AtPndfbmV4dCAhPSBOVUxMID8gd3AtPndfbmV4dCA6IGZpcnN0d2luKSAhPSBjdXJ3aW4KKwkJJiYgd3AtPndfYnVmZmVyLT5iX3NjYW5uZWQpCisJICAgIDsKKwlidWYgPSB3cC0+d19idWZmZXI7CisjZWxzZQorCWJ1ZiA9IGN1cmJ1ZjsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisJLyogJ2InIChqdXN0IGxvYWRlZCBidWZmZXJzKSwgJ3UnIChqdXN0IG5vbi1sb2FkZWQgYnVmZmVycykgb3IgJ1UnCisJICogKHVubGlzdGVkIGJ1ZmZlcnMpCisJICogV2hlbiBjb21wbGV0aW5nIHdob2xlIGxpbmVzIHNraXAgdW5sb2FkZWQgYnVmZmVycy4gKi8KKwl3aGlsZSAoKGJ1ZiA9IGJ1Zi0+Yl9uZXh0ICE9IE5VTEwgPyBidWYtPmJfbmV4dCA6IGZpcnN0YnVmKSAhPSBjdXJidWYKKwkJJiYgKChmbGFnID09ICdVJworCQkJPyBidWYtPmJfcF9ibAorCQkJOiAoIWJ1Zi0+Yl9wX2JsCisJCQkgICAgfHwgKGJ1Zi0+Yl9tbC5tbF9tZnAgPT0gTlVMTCkgIT0gKGZsYWcgPT0gJ3UnKSkpCisJCSAgICB8fCBidWYtPmJfc2Nhbm5lZAorCQkgICAgfHwgKGJ1Zi0+Yl9tbC5tbF9tZnAgPT0gTlVMTAorCQkJJiYgY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpKSkKKwkgICAgOworICAgIHJldHVybiBidWY7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5leHQgZXhwYW5zaW9uKHMpIGZvciB0aGUgdGV4dCBzdGFydGluZyBhdCB0aGUgaW5pdGlhbCBjdXJidWYKKyAqIHBvc2l0aW9uICJpbmkiIGFuZCBpbiB0aGUgZGlyZWN0aW9uIGRpci4KKyAqIFJldHVybiB0aGUgdG90YWwgb2YgbWF0Y2hlcyBvciAtMSBpZiBzdGlsbCB1bmtub3duIC0tIEFjZXZlZG8KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19jb21wbF9nZXRfZXhwKGluaSwgZGlyKQorICAgIHBvc19UCSppbmk7CisgICAgaW50CQlkaXI7Cit7CisgICAgc3RhdGljIHBvc19UCWZpcnN0X21hdGNoX3BvczsKKyAgICBzdGF0aWMgcG9zX1QJbGFzdF9tYXRjaF9wb3M7CisgICAgc3RhdGljIGNoYXJfdQkqZV9jcHQgPSAoY2hhcl91ICopIiI7CS8qIGN1cnIuIGVudHJ5IGluICdjb21wbGV0ZScgKi8KKyAgICBzdGF0aWMgaW50CQlmb3VuZF9hbGwgPSBGQUxTRTsJLyogRm91bmQgYWxsIG1hdGNoZXMuICovCisgICAgc3RhdGljIGJ1Zl9UCSppbnNfYnVmID0gTlVMTDsKKworICAgIHBvc19UCQkqcG9zOworICAgIGNoYXJfdQkJKiptYXRjaGVzOworICAgIGludAkJCXNhdmVfcF9zY3M7CisgICAgaW50CQkJc2F2ZV9wX3dzOworICAgIGludAkJCXNhdmVfcF9pYzsKKyAgICBpbnQJCQlpOworICAgIGludAkJCW51bV9tYXRjaGVzOworICAgIGludAkJCWxlbjsKKyAgICBpbnQJCQlmb3VuZF9uZXdfbWF0Y2g7CisgICAgaW50CQkJdHlwZSA9IGN0cmxfeF9tb2RlOworICAgIGNoYXJfdQkJKnB0cjsKKyAgICBjaGFyX3UJCSp0bXBfcHRyOworICAgIGNoYXJfdQkJKmRpY3QgPSBOVUxMOworICAgIGludAkJCWRpY3RfZiA9IDA7CisgICAgc3RydWN0IENvbXBsZXRpb24JKm9sZF9tYXRjaDsKKworICAgIGlmICghc3RhcnRlZF9jb21wbGV0aW9uKQorICAgIHsKKwlmb3IgKGluc19idWYgPSBmaXJzdGJ1ZjsgaW5zX2J1ZiAhPSBOVUxMOyBpbnNfYnVmID0gaW5zX2J1Zi0+Yl9uZXh0KQorCSAgICBpbnNfYnVmLT5iX3NjYW5uZWQgPSAwOworCWZvdW5kX2FsbCA9IEZBTFNFOworCWluc19idWYgPSBjdXJidWY7CisJZV9jcHQgPSBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMID8gKGNoYXJfdSAqKSIuIiA6IGN1cmJ1Zi0+Yl9wX2NwdDsKKwlsYXN0X21hdGNoX3BvcyA9IGZpcnN0X21hdGNoX3BvcyA9ICppbmk7CisgICAgfQorCisgICAgb2xkX21hdGNoID0gY3Vycl9tYXRjaDsJCS8qIHJlbWVtYmVyIHRoZSBsYXN0IGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBwb3MgPSAoZGlyID09IEZPUldBUkQpID8gJmxhc3RfbWF0Y2hfcG9zIDogJmZpcnN0X21hdGNoX3BvczsKKyAgICAvKiBGb3IgXk4vXlAgbG9vcCBvdmVyIGFsbCB0aGUgZmxhZ3Mvd2luZG93cy9idWZmZXJzIGluICdjb21wbGV0ZScgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwlmb3VuZF9uZXdfbWF0Y2ggPSBGQUlMOworCisJLyogRm9yIF5OL15QIHBpY2sgYSBuZXcgZW50cnkgZnJvbSBlX2NwdCBpZiBzdGFydGVkX2NvbXBsZXRpb24gaXMgb2ZmLAorCSAqIG9yIGlmIGZvdW5kX2FsbCBzYXlzIHRoaXMgZW50cnkgaXMgZG9uZS4gIEZvciBeWF5MIG9ubHkgdXNlIHRoZQorCSAqIGVudHJpZXMgZnJvbSAnY29tcGxldGUnIHRoYXQgbG9vayBpbiBsb2FkZWQgYnVmZmVycy4gKi8KKwlpZiAoKGN0cmxfeF9tb2RlID09IDAgfHwgY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJCSYmICghc3RhcnRlZF9jb21wbGV0aW9uIHx8IGZvdW5kX2FsbCkpCisJeworCSAgICBmb3VuZF9hbGwgPSBGQUxTRTsKKwkgICAgd2hpbGUgKCplX2NwdCA9PSAnLCcgfHwgKmVfY3B0ID09ICcgJykKKwkJZV9jcHQrKzsKKwkgICAgaWYgKCplX2NwdCA9PSAnLicgJiYgIWN1cmJ1Zi0+Yl9zY2FubmVkKQorCSAgICB7CisJCWluc19idWYgPSBjdXJidWY7CisJCWZpcnN0X21hdGNoX3BvcyA9ICppbmk7CisJCS8qIFNvIHRoYXQgXk4gY2FuIG1hdGNoIHdvcmQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3Vyc29yICovCisJCWlmIChjdHJsX3hfbW9kZSA9PSAwKQorCQkgICAgZGVjKCZmaXJzdF9tYXRjaF9wb3MpOworCQlsYXN0X21hdGNoX3BvcyA9IGZpcnN0X21hdGNoX3BvczsKKwkJdHlwZSA9IDA7CisJICAgIH0KKwkgICAgZWxzZSBpZiAodmltX3N0cmNocigoY2hhcl91ICopImJ1d1UiLCAqZV9jcHQpICE9IE5VTEwKKwkJICYmIChpbnNfYnVmID0gaW5zX2NvbXBsX25leHRfYnVmKGluc19idWYsICplX2NwdCkpICE9IGN1cmJ1ZikKKwkgICAgeworCQkvKiBTY2FuIGEgYnVmZmVyLCBidXQgbm90IHRoZSBjdXJyZW50IG9uZS4gKi8KKwkJaWYgKGluc19idWYtPmJfbWwubWxfbWZwICE9IE5VTEwpICAgLyogbG9hZGVkIGJ1ZmZlciAqLworCQl7CisJCSAgICBzdGFydGVkX2NvbXBsZXRpb24gPSBUUlVFOworCQkgICAgZmlyc3RfbWF0Y2hfcG9zLmNvbCA9IGxhc3RfbWF0Y2hfcG9zLmNvbCA9IDA7CisJCSAgICBmaXJzdF9tYXRjaF9wb3MubG51bSA9IGluc19idWYtPmJfbWwubWxfbGluZV9jb3VudCArIDE7CisJCSAgICBsYXN0X21hdGNoX3Bvcy5sbnVtID0gMDsKKwkJICAgIHR5cGUgPSAwOworCQl9CisJCWVsc2UJLyogdW5sb2FkZWQgYnVmZmVyLCBzY2FuIGxpa2UgZGljdGlvbmFyeSAqLworCQl7CisJCSAgICBmb3VuZF9hbGwgPSBUUlVFOworCQkgICAgaWYgKGluc19idWYtPmJfZm5hbWUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkgICAgdHlwZSA9IENUUkxfWF9ESUNUSU9OQVJZOworCQkgICAgZGljdCA9IGluc19idWYtPmJfZm5hbWU7CisJCSAgICBkaWN0X2YgPSBESUNUX0VYQUNUOworCQl9CisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIlNjYW5uaW5nOiAlcyIpLAorCQkJaW5zX2J1Zi0+Yl9mbmFtZSA9PSBOVUxMCisJCQkgICAgPyBidWZfc3BuYW1lKGluc19idWYpCisJCQkgICAgOiBpbnNfYnVmLT5iX3NmbmFtZSA9PSBOVUxMCisJCQkJPyAoY2hhciAqKWluc19idWYtPmJfZm5hbWUKKwkJCQk6IChjaGFyICopaW5zX2J1Zi0+Yl9zZm5hbWUpOworCQltc2dfdHJ1bmNfYXR0cihJT2J1ZmYsIFRSVUUsIGhsX2F0dHIoSExGX1IpKTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqZV9jcHQgPT0gTlVMKQorCQlicmVhazsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfV0hPTEVfTElORSkKKwkJICAgIHR5cGUgPSAtMTsKKwkJZWxzZSBpZiAoKmVfY3B0ID09ICdrJyB8fCAqZV9jcHQgPT0gJ3MnKQorCQl7CisJCSAgICBpZiAoKmVfY3B0ID09ICdrJykKKwkJCXR5cGUgPSBDVFJMX1hfRElDVElPTkFSWTsKKwkJICAgIGVsc2UKKwkJCXR5cGUgPSBDVFJMX1hfVEhFU0FVUlVTOworCQkgICAgaWYgKCorK2VfY3B0ICE9ICcsJyAmJiAqZV9jcHQgIT0gTlVMKQorCQkgICAgeworCQkJZGljdCA9IGVfY3B0OworCQkJZGljdF9mID0gRElDVF9GSVJTVDsKKwkJICAgIH0KKwkJfQorI2lmZGVmIEZFQVRfRklORF9JRAorCQllbHNlIGlmICgqZV9jcHQgPT0gJ2knKQorCQkgICAgdHlwZSA9IENUUkxfWF9QQVRIX1BBVFRFUk5TOworCQllbHNlIGlmICgqZV9jcHQgPT0gJ2QnKQorCQkgICAgdHlwZSA9IENUUkxfWF9QQVRIX0RFRklORVM7CisjZW5kaWYKKwkJZWxzZSBpZiAoKmVfY3B0ID09ICddJyB8fCAqZV9jcHQgPT0gJ3QnKQorCQl7CisJCSAgICB0eXBlID0gQ1RSTF9YX1RBR1M7CisJCSAgICBzcHJpbnRmKChjaGFyKilJT2J1ZmYsIF8oIlNjYW5uaW5nIHRhZ3MuIikpOworCQkgICAgbXNnX3RydW5jX2F0dHIoSU9idWZmLCBUUlVFLCBobF9hdHRyKEhMRl9SKSk7CisJCX0KKwkJZWxzZQorCQkgICAgdHlwZSA9IC0xOworCisJCS8qIGluIGFueSBjYXNlIGVfY3B0IGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGVudHJ5ICovCisJCSh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJmVfY3B0LCBJT2J1ZmYsIElPU0laRSwgIiwiKTsKKworCQlmb3VuZF9hbGwgPSBUUlVFOworCQlpZiAodHlwZSA9PSAtMSkKKwkJICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorCisJc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIC0xOgorCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKwljYXNlIENUUkxfWF9QQVRIX1BBVFRFUk5TOgorCWNhc2UgQ1RSTF9YX1BBVEhfREVGSU5FUzoKKwkgICAgZmluZF9wYXR0ZXJuX2luX3BhdGgoY29tcGxldGVfcGF0LCBkaXIsCisJCQkJIChpbnQpU1RSTEVOKGNvbXBsZXRlX3BhdCksIEZBTFNFLCBGQUxTRSwKKwkJCQkgKHR5cGUgPT0gQ1RSTF9YX1BBVEhfREVGSU5FUworCQkJCSAgJiYgIShjb250aW51ZV9zdGF0dXMgJiBDT05UX1NPTCkpCisJCQkJID8gRklORF9ERUZJTkUgOiBGSU5EX0FOWSwgMUwsIEFDVElPTl9FWFBBTkQsCisJCQkJIChsaW5lbnJfVCkxLCAobGluZW5yX1QpTUFYTE5VTSk7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIENUUkxfWF9ESUNUSU9OQVJZOgorCWNhc2UgQ1RSTF9YX1RIRVNBVVJVUzoKKwkgICAgaW5zX2NvbXBsX2RpY3Rpb25hcmllcygKKwkJICAgIGRpY3QgPyBkaWN0CisJCQkgOiAodHlwZSA9PSBDVFJMX1hfVEhFU0FVUlVTCisJCQkgICAgID8gKCpjdXJidWYtPmJfcF90c3IgPT0gTlVMCisJCQkJID8gcF90c3IKKwkJCQkgOiBjdXJidWYtPmJfcF90c3IpCisJCQkgICAgIDogKCpjdXJidWYtPmJfcF9kaWN0ID09IE5VTAorCQkJCSA/IHBfZGljdAorCQkJCSA6IGN1cmJ1Zi0+Yl9wX2RpY3QpKSwKKwkJCSAgICBjb21wbGV0ZV9wYXQsIGRpciwKKwkJCQkgZGljdCA/IGRpY3RfZiA6IDAsIHR5cGUgPT0gQ1RSTF9YX1RIRVNBVVJVUyk7CisJICAgIGRpY3QgPSBOVUxMOworCSAgICBicmVhazsKKworCWNhc2UgQ1RSTF9YX1RBR1M6CisJICAgIC8qIHNldCBwX2ljIGFjY29yZGluZyB0byBwX2ljLCBwX3NjcyBhbmQgcGF0IGZvciBmaW5kX3RhZ3MoKS4gKi8KKwkgICAgc2F2ZV9wX2ljID0gcF9pYzsKKwkgICAgcF9pYyA9IGlnbm9yZWNhc2UoY29tcGxldGVfcGF0KTsKKworCSAgICAvKiBGaW5kIHVwIHRvIFRBR19NQU5ZIG1hdGNoZXMuICBBdm9pZHMgdGhhdCBhbiBlbm91cm1vdXMgbnVtYmVyCisJICAgICAqIG9mIG1hdGNoZXMgaXMgZm91bmQgd2hlbiBjb21wbGV0ZV9wYXQgaXMgZW1wdHkgKi8KKwkgICAgaWYgKGZpbmRfdGFncyhjb21wbGV0ZV9wYXQsICZudW1fbWF0Y2hlcywgJm1hdGNoZXMsCisJCSAgICBUQUdfUkVHRVhQIHwgVEFHX05BTUVTIHwgVEFHX05PSUMgfAorCQkgICAgVEFHX0lOU19DT01QIHwgKGN0cmxfeF9tb2RlID8gVEFHX1ZFUkJPU0UgOiAwKSwKKwkJICAgIFRBR19NQU5ZLCBjdXJidWYtPmJfZmZuYW1lKSA9PSBPSyAmJiBudW1fbWF0Y2hlcyA+IDApCisJICAgIHsKKwkJaW5zX2NvbXBsX2FkZF9tYXRjaGVzKG51bV9tYXRjaGVzLCBtYXRjaGVzLCBkaXIpOworCSAgICB9CisJICAgIHBfaWMgPSBzYXZlX3BfaWM7CisJICAgIGJyZWFrOworCisJY2FzZSBDVFJMX1hfRklMRVM6CisJICAgIGlmIChleHBhbmRfd2lsZGNhcmRzKDEsICZjb21wbGV0ZV9wYXQsICZudW1fbWF0Y2hlcywgJm1hdGNoZXMsCisJCQkJICBFV19GSUxFfEVXX0RJUnxFV19BRERTTEFTSHxFV19TSUxFTlQpID09IE9LKQorCSAgICB7CisKKwkJLyogTWF5IGNoYW5nZSBob21lIGRpcmVjdG9yeSBiYWNrIHRvICJ+Ii4gKi8KKwkJdGlsZGVfcmVwbGFjZShjb21wbGV0ZV9wYXQsIG51bV9tYXRjaGVzLCBtYXRjaGVzKTsKKwkJaW5zX2NvbXBsX2FkZF9tYXRjaGVzKG51bV9tYXRjaGVzLCBtYXRjaGVzLCBkaXIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBDVFJMX1hfQ01ETElORToKKwkgICAgaWYgKGV4cGFuZF9jbWRsaW5lKCZjb21wbGV0ZV94cCwgY29tcGxldGVfcGF0LAorCQkJKGludClTVFJMRU4oY29tcGxldGVfcGF0KSwKKwkJCQkJICZudW1fbWF0Y2hlcywgJm1hdGNoZXMpID09IEVYUEFORF9PSykKKwkJaW5zX2NvbXBsX2FkZF9tYXRjaGVzKG51bV9tYXRjaGVzLCBtYXRjaGVzLCBkaXIpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CS8qIG5vcm1hbCBeUC9eTiBhbmQgXlheTCAqLworCSAgICAvKgorCSAgICAgKiBJZiAnaW5mZXJjYXNlJyBpcyBzZXQsIGRvbid0IHVzZSAnc21hcnRjYXNlJyBoZXJlCisJICAgICAqLworCSAgICBzYXZlX3Bfc2NzID0gcF9zY3M7CisJICAgIGlmIChpbnNfYnVmLT5iX3BfaW5mKQorCQlwX3NjcyA9IEZBTFNFOworCSAgICAvKglidWZmZXJzIG90aGVyIHRoYW4gY3VyYnVmIGFyZSBzY2FubmVkIGZyb20gdGhlIGJlZ2lubmluZyBvciB0aGUKKwkgICAgICoJZW5kIGJ1dCBuZXZlciBmcm9tIHRoZSBtaWRkbGUsIHRodXMgc2V0dGluZyBub3dyYXBzY2FuIGluIHRoaXMKKwkgICAgICoJYnVmZmVycyBpcyBhIGdvb2QgaWRlYSwgb24gdGhlIG90aGVyIGhhbmQsIHdlIGFsd2F5cyBzZXQKKwkgICAgICoJd3JhcHNjYW4gZm9yIGN1cmJ1ZiB0byBhdm9pZCBtaXNzaW5nIG1hdGNoZXMgLS0gQWNldmVkbyxXZWJiICovCisJICAgIHNhdmVfcF93cyA9IHBfd3M7CisJICAgIGlmIChpbnNfYnVmICE9IGN1cmJ1ZikKKwkJcF93cyA9IEZBTFNFOworCSAgICBlbHNlIGlmICgqZV9jcHQgPT0gJy4nKQorCQlwX3dzID0gVFJVRTsKKwkgICAgZm9yICg7OykKKwkgICAgeworCQlpbnQJcmV1c2UgPSAwOworCisJCS8qIGN0cmxfeF9tb2RlID09IENUUkxfWF9XSE9MRV9MSU5FIHx8IHdvcmQtd2lzZSBzZWFyY2ggdGhhdCBoYXMKKwkJICogYWRkZWQgYSB3b3JkIHRoYXQgd2FzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKwkJaWYgKAljdHJsX3hfbW9kZSA9PSBDVFJMX1hfV0hPTEVfTElORQorCQkJfHwgKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU09MKSkKKwkJICAgIGZvdW5kX25ld19tYXRjaCA9IHNlYXJjaF9mb3JfZXhhY3RfbGluZShpbnNfYnVmLCBwb3MsCisJCQkJCQkJICAgIGRpciwgY29tcGxldGVfcGF0KTsKKwkJZWxzZQorCQkgICAgZm91bmRfbmV3X21hdGNoID0gc2VhcmNoaXQoTlVMTCwgaW5zX2J1ZiwgcG9zLCBkaXIsCisJCQkJIGNvbXBsZXRlX3BhdCwgMUwsIFNFQVJDSF9LRUVQICsgU0VBUkNIX05GTVNHLAorCQkJCQkJCQkgICAgIFJFX0xBU1QpOworCQlpZiAoIXN0YXJ0ZWRfY29tcGxldGlvbikKKwkJeworCQkgICAgLyogc2V0IHN0YXJ0ZWRfY29tcGxldGlvbiBldmVuIG9uIGZhaWwgKi8KKwkJICAgIHN0YXJ0ZWRfY29tcGxldGlvbiA9IFRSVUU7CisJCSAgICBmaXJzdF9tYXRjaF9wb3MgPSAqcG9zOworCQkgICAgbGFzdF9tYXRjaF9wb3MgPSAqcG9zOworCQl9CisJCWVsc2UgaWYgKGZpcnN0X21hdGNoX3Bvcy5sbnVtID09IGxhc3RfbWF0Y2hfcG9zLmxudW0KKwkJCSAmJiBmaXJzdF9tYXRjaF9wb3MuY29sID09IGxhc3RfbWF0Y2hfcG9zLmNvbCkKKwkJICAgIGZvdW5kX25ld19tYXRjaCA9IEZBSUw7CisJCWlmIChmb3VuZF9uZXdfbWF0Y2ggPT0gRkFJTCkKKwkJeworCQkgICAgaWYgKGluc19idWYgPT0gY3VyYnVmKQorCQkJZm91bmRfYWxsID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisKKwkJLyogd2hlbiBBRERJTkcsIHRoZSB0ZXh0IGJlZm9yZSB0aGUgY3Vyc29yIG1hdGNoZXMsIHNraXAgaXQgKi8KKwkJaWYgKAkoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpICYmIGluc19idWYgPT0gY3VyYnVmCisJCQkmJiBpbmktPmxudW0gPT0gcG9zLT5sbnVtCisJCQkmJiBpbmktPmNvbCAgPT0gcG9zLT5jb2wpCisJCSAgICBjb250aW51ZTsKKwkJcHRyID0gbWxfZ2V0X2J1ZihpbnNfYnVmLCBwb3MtPmxudW0sIEZBTFNFKSArIHBvcy0+Y29sOworCQlpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJCXsKKwkJICAgIGlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORykKKwkJICAgIHsKKwkJCWlmIChwb3MtPmxudW0gPj0gaW5zX2J1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkJICAgIGNvbnRpbnVlOworCQkJcHRyID0gbWxfZ2V0X2J1ZihpbnNfYnVmLCBwb3MtPmxudW0gKyAxLCBGQUxTRSk7CisJCQlpZiAoIXBfcGFzdGUpCisJCQkgICAgcHRyID0gc2tpcHdoaXRlKHB0cik7CisJCSAgICB9CisJCSAgICBsZW4gPSAoaW50KVNUUkxFTihwdHIpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgdG1wX3B0ciA9IHB0cjsKKwkJICAgIGlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORykKKwkJICAgIHsKKwkJCXRtcF9wdHIgKz0gY29tcGxldGlvbl9sZW5ndGg7CisJCQkvKiBTa2lwIGlmIGFscmVhZHkgaW5zaWRlIGEgd29yZC4gKi8KKwkJCWlmICh2aW1faXN3b3JkcCh0bXBfcHRyKSkKKwkJCSAgICBjb250aW51ZTsKKwkJCS8qIEZpbmQgc3RhcnQgb2YgbmV4dCB3b3JkLiAqLworCQkJdG1wX3B0ciA9IGZpbmRfd29yZF9zdGFydCh0bXBfcHRyKTsKKwkJICAgIH0KKwkJICAgIC8qIEZpbmQgZW5kIG9mIHRoaXMgd29yZC4gKi8KKwkJICAgIHRtcF9wdHIgPSBmaW5kX3dvcmRfZW5kKHRtcF9wdHIpOworCQkgICAgbGVuID0gKGludCkodG1wX3B0ciAtIHB0cik7CisKKwkJICAgIGlmICgoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpCisJCQkJCQkgICYmIGxlbiA9PSBjb21wbGV0aW9uX2xlbmd0aCkKKwkJICAgIHsKKwkJCWlmIChwb3MtPmxudW0gPCBpbnNfYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCQl7CisJCQkgICAgLyogVHJ5IG5leHQgbGluZSwgaWYgYW55LiB0aGUgbmV3IHdvcmQgd2lsbCBiZQorCQkJICAgICAqICJqb2luIiBhcyBpZiB0aGUgbm9ybWFsIGNvbW1hbmQgIkoiIHdhcyB1c2VkLgorCQkJICAgICAqIElPU0laRSBpcyBhbHdheXMgZ3JlYXRlciB0aGFuCisJCQkgICAgICogY29tcGxldGlvbl9sZW5ndGgsIHNvIHRoZSBuZXh0IFNUUk5DUFkgYWx3YXlzCisJCQkgICAgICogd29ya3MgLS0gQWNldmVkbyAqLworCQkJICAgIFNUUk5DUFkoSU9idWZmLCBwdHIsIGxlbik7CisJCQkgICAgcHRyID0gbWxfZ2V0X2J1ZihpbnNfYnVmLCBwb3MtPmxudW0gKyAxLCBGQUxTRSk7CisJCQkgICAgdG1wX3B0ciA9IHB0ciA9IHNraXB3aGl0ZShwdHIpOworCQkJICAgIC8qIEZpbmQgc3RhcnQgb2YgbmV4dCB3b3JkLiAqLworCQkJICAgIHRtcF9wdHIgPSBmaW5kX3dvcmRfc3RhcnQodG1wX3B0cik7CisJCQkgICAgLyogRmluZCBlbmQgb2YgbmV4dCB3b3JkLiAqLworCQkJICAgIHRtcF9wdHIgPSBmaW5kX3dvcmRfZW5kKHRtcF9wdHIpOworCQkJICAgIGlmICh0bXBfcHRyID4gcHRyKQorCQkJICAgIHsKKwkJCQlpZiAoKnB0ciAhPSAnKScgJiYgSU9idWZmW2xlbi0xXSAhPSBUQUIpCisJCQkJeworCQkJCSAgICBpZiAoSU9idWZmW2xlbi0xXSAhPSAnICcpCisJCQkJCUlPYnVmZltsZW4rK10gPSAnICc7CisJCQkJICAgIC8qIElPYnVmID1+ICJcay4qICIsIHRodXMgbGVuID49IDIgKi8KKwkJCQkgICAgaWYgKHBfanMKKwkJCQkJJiYgKElPYnVmZltsZW4tMl0gPT0gJy4nCisJCQkJCSAgICB8fCAodmltX3N0cmNocihwX2NwbywgQ1BPX0pPSU5TUCkKKwkJCQkJCQkJICAgICAgID09IE5VTEwKKwkJCQkJCSYmIChJT2J1ZmZbbGVuLTJdID09ICc/JworCQkJCQkJICAgIHx8IElPYnVmZltsZW4tMl0gPT0gJyEnKSkpKQorCQkJCQlJT2J1ZmZbbGVuKytdID0gJyAnOworCQkJCX0KKwkJCQkvKiBjb3B5IGFzIG11Y2ggYXMgcG9zaWJsZSBvZiB0aGUgbmV3IHdvcmQgKi8KKwkJCQlpZiAodG1wX3B0ciAtIHB0ciA+PSBJT1NJWkUgLSBsZW4pCisJCQkJICAgIHRtcF9wdHIgPSBwdHIgKyBJT1NJWkUgLSBsZW4gLSAxOworCQkJCVNUUk5DUFkoSU9idWZmICsgbGVuLCBwdHIsIHRtcF9wdHIgLSBwdHIpOworCQkJCWxlbiArPSAoaW50KSh0bXBfcHRyIC0gcHRyKTsKKwkJCQlyZXVzZSB8PSBDT05UX1NfSVBPUzsKKwkJCSAgICB9CisJCQkgICAgSU9idWZmW2xlbl0gPSBOVUw7CisJCQkgICAgcHRyID0gSU9idWZmOworCQkJfQorCQkJaWYgKGxlbiA9PSBjb21wbGV0aW9uX2xlbmd0aCkKKwkJCSAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJfQorCQlpZiAoaW5zX2NvbXBsX2FkZF9pbmZlcmNhc2UocHRyLCBsZW4sCisJCQkgICAgaW5zX2J1ZiA9PSBjdXJidWYgPyAgTlVMTCA6IGluc19idWYtPmJfc2ZuYW1lLAorCQkJCQkJCSAgZGlyLCByZXVzZSkgIT0gRkFJTCkKKwkJeworCQkgICAgZm91bmRfbmV3X21hdGNoID0gT0s7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIHBfc2NzID0gc2F2ZV9wX3NjczsKKwkgICAgcF93cyA9IHNhdmVfcF93czsKKwl9CisJLyogY2hlY2sgaWYgY3Vycl9tYXRjaCBoYXMgY2hhbmdlZCwgKGUuZy4gb3RoZXIgdHlwZSBvZiBleHBhbnNpb24KKwkgKiBhZGRlZCBzb21lbnRoaW5nKSAqLworCWlmIChjdXJyX21hdGNoICE9IG9sZF9tYXRjaCkKKwkgICAgZm91bmRfbmV3X21hdGNoID0gT0s7CisKKwkvKiBicmVhayB0aGUgbG9vcCBmb3Igc3BlY2lhbGl6ZWQgbW9kZXMgKHVzZSAnY29tcGxldGUnIGp1c3QgZm9yIHRoZQorCSAqIGdlbmVyaWMgY3RybF94X21vZGUgPT0gMCkgb3Igd2hlbiB3ZSd2ZSBmb3VuZCBhIG5ldyBtYXRjaCAqLworCWlmICgoY3RybF94X21vZGUgIT0gMCAmJiBjdHJsX3hfbW9kZSAhPSBDVFJMX1hfV0hPTEVfTElORSkKKwkJfHwgZm91bmRfbmV3X21hdGNoICE9IEZBSUwpCisJICAgIGJyZWFrOworCisJLyogTWFyayBhIGJ1ZmZlciBzY2FubmVkIHdoZW4gaXQgaGFzIGJlZW4gc2Nhbm5lZCBjb21wbGV0ZWx5ICovCisJaWYgKHR5cGUgPT0gMCB8fCB0eXBlID09IENUUkxfWF9QQVRIX1BBVFRFUk5TKQorCSAgICBpbnNfYnVmLT5iX3NjYW5uZWQgPSBUUlVFOworCisJc3RhcnRlZF9jb21wbGV0aW9uID0gRkFMU0U7CisgICAgfQorICAgIHN0YXJ0ZWRfY29tcGxldGlvbiA9IFRSVUU7CisKKyAgICBpZiAoKGN0cmxfeF9tb2RlID09IDAgfHwgY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJICAgICYmICplX2NwdCA9PSBOVUwpCQkvKiBHb3QgdG8gZW5kIG9mICdjb21wbGV0ZScgKi8KKwlmb3VuZF9uZXdfbWF0Y2ggPSBGQUlMOworCisgICAgaSA9IC0xOwkJLyogdG90YWwgb2YgbWF0Y2hlcywgdW5rbm93biAqLworICAgIGlmIChmb3VuZF9uZXdfbWF0Y2ggPT0gRkFJTAorCSAgICB8fCAoY3RybF94X21vZGUgIT0gMCAmJiBjdHJsX3hfbW9kZSAhPSBDVFJMX1hfV0hPTEVfTElORSkpCisJaSA9IGluc19jb21wbF9tYWtlX2N5Y2xpYygpOworCisgICAgLyogSWYgc2V2ZXJhbCBtYXRjaGVzIHdlcmUgYWRkZWQgKEZPUldBUkQpIG9yIHRoZSBzZWFyY2ggZmFpbGVkIGFuZCBoYXMKKyAgICAgKiBqdXN0IGJlZW4gbWFkZSBjeWNsaWMgdGhlbiB3ZSBoYXZlIHRvIG1vdmUgY3Vycl9tYXRjaCB0byB0aGUgbmV4dCBvcgorICAgICAqIHByZXZpb3VzIGVudHJ5IChpZiBhbnkpIC0tIEFjZXZlZG8gKi8KKyAgICBjdXJyX21hdGNoID0gZGlyID09IEZPUldBUkQgPyBvbGRfbWF0Y2gtPm5leHQgOiBvbGRfbWF0Y2gtPnByZXY7CisgICAgaWYgKGN1cnJfbWF0Y2ggPT0gTlVMTCkKKwljdXJyX21hdGNoID0gb2xkX21hdGNoOworICAgIHJldHVybiBpOworfQorCisvKiBEZWxldGUgdGhlIG9sZCB0ZXh0IGJlaW5nIGNvbXBsZXRlZC4gKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zX2NvbXBsX2RlbGV0ZSgpCit7CisgICAgaW50CSAgICBpOworCisgICAgLyoKKyAgICAgKiBJbiBpbnNlcnQgbW9kZTogRGVsZXRlIHRoZSB0eXBlZCBwYXJ0LgorICAgICAqIEluIHJlcGxhY2UgbW9kZTogUHV0IHRoZSBvbGQgY2hhcmFjdGVycyBiYWNrLCBpZiBhbnkuCisgICAgICovCisgICAgaSA9IGNvbXBsZXRlX2NvbCArIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORyA/IGNvbXBsZXRpb25fbGVuZ3RoIDogMCk7CisgICAgYmFja3NwYWNlX3VudGlsX2NvbHVtbihpKTsKKyAgICBjaGFuZ2VkX2NsaW5lX2JlZl9jdXJzKCk7Cit9CisKKy8qIEluc2VydCB0aGUgbmV3IHRleHQgYmVpbmcgY29tcGxldGVkLiAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfY29tcGxfaW5zZXJ0KCkKK3sKKyAgICBpbnNfYnl0ZXMoc2hvd25fbWF0Y2gtPnN0ciArIGN1cndpbi0+d19jdXJzb3IuY29sIC0gY29tcGxldGVfY29sKTsKK30KKworLyoKKyAqIEZpbGwgaW4gdGhlIG5leHQgY29tcGxldGlvbiBpbiB0aGUgY3VycmVudCBkaXJlY3Rpb24uCisgKiBJZiBhbGxvd19nZXRfZXhwYW5zaW9uIGlzIFRSVUUsIHRoZW4gd2UgbWF5IGNhbGwgaW5zX2NvbXBsX2dldF9leHAoKSB0byBnZXQKKyAqIG1vcmUgY29tcGxldGlvbnMuICBJZiBpdCBpcyBGQUxTRSwgdGhlbiB3ZSBqdXN0IGRvIG5vdGhpbmcgd2hlbiB0aGVyZSBhcmUKKyAqIG5vIG1vcmUgY29tcGxldGlvbnMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uICBUaGUgbGF0dGVyIGNhc2UgaXMgdXNlZCB3aGVuIHdlCisgKiBhcmUgc3RpbGwgaW4gdGhlIG1pZGRsZSBvZiBmaW5kaW5nIGNvbXBsZXRpb25zLCB0byBhbGxvdyBicm93c2luZyB0aHJvdWdoCisgKiB0aGUgb25lcyBmb3VuZCBzbyBmYXIuCisgKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzLCBvciAtMSBpZiBzdGlsbCB1bmtub3duIC0tIHdlYmIuCisgKgorICogY3Vycl9tYXRjaCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBieSBpbnNfY29tcGxfZ2V0X2V4cCgpLCBzbyB3ZSB1c2UKKyAqIHNob3duX21hdGNoIGhlcmUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCByZWN1cnNpdmVseSBvbmNlIG9ubHkuICBGaXJzdCB3aXRoCisgKiBhbGxvd19nZXRfZXhwYW5zaW9uIFRSVUUsIHdoaWNoIGNhbGxzIGluc19jb21wbF9nZXRfZXhwKCksIHdoaWNoIGluIHR1cm4KKyAqIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aCBhbGxvd19nZXRfZXhwYW5zaW9uIEZBTFNFLgorICovCisgICAgc3RhdGljIGludAoraW5zX2NvbXBsX25leHQoYWxsb3dfZ2V0X2V4cGFuc2lvbikKKyAgICBpbnQJICAgIGFsbG93X2dldF9leHBhbnNpb247Cit7CisgICAgaW50CSAgICBudW1fbWF0Y2hlcyA9IC0xOworICAgIGludAkgICAgaTsKKworICAgIGlmIChhbGxvd19nZXRfZXhwYW5zaW9uKQorICAgIHsKKwkvKiBEZWxldGUgb2xkIHRleHQgdG8gYmUgcmVwbGFjZWQgKi8KKwlpbnNfY29tcGxfZGVsZXRlKCk7CisgICAgfQorICAgIGNvbXBsZXRpb25fcGVuZGluZyA9IEZBTFNFOworICAgIGlmIChzaG93bl9kaXJlY3Rpb24gPT0gRk9SV0FSRCAmJiBzaG93bl9tYXRjaC0+bmV4dCAhPSBOVUxMKQorCXNob3duX21hdGNoID0gc2hvd25fbWF0Y2gtPm5leHQ7CisgICAgZWxzZSBpZiAoc2hvd25fZGlyZWN0aW9uID09IEJBQ0tXQVJEICYmIHNob3duX21hdGNoLT5wcmV2ICE9IE5VTEwpCisJc2hvd25fbWF0Y2ggPSBzaG93bl9tYXRjaC0+cHJldjsKKyAgICBlbHNlCisgICAgeworCWNvbXBsZXRpb25fcGVuZGluZyA9IFRSVUU7CisJaWYgKGFsbG93X2dldF9leHBhbnNpb24pCisJeworCSAgICBudW1fbWF0Y2hlcyA9IGluc19jb21wbF9nZXRfZXhwKCZpbml0aWFsX3BvcywgY29tcGxldGVfZGlyZWN0aW9uKTsKKwkgICAgaWYgKGNvbXBsZXRpb25fcGVuZGluZykKKwkgICAgeworCQlpZiAoY29tcGxldGVfZGlyZWN0aW9uID09IHNob3duX2RpcmVjdGlvbikKKwkJICAgIHNob3duX21hdGNoID0gY3Vycl9tYXRjaDsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBJbnNlcnQgdGhlIHRleHQgb2YgdGhlIG5ldyBjb21wbGV0aW9uICovCisgICAgaW5zX2NvbXBsX2luc2VydCgpOworCisgICAgaWYgKCFhbGxvd19nZXRfZXhwYW5zaW9uKQorICAgIHsKKwkvKiBEaXNwbGF5IHRoZSBjdXJyZW50IG1hdGNoLiAqLworCXVwZGF0ZV9zY3JlZW4oMCk7CisKKwkvKiBEZWxldGUgb2xkIHRleHQgdG8gYmUgcmVwbGFjZWQsIHNpbmNlIHdlJ3JlIHN0aWxsIHNlYXJjaGluZyBhbmQKKwkgKiBkb24ndCB3YW50IHRvIG1hdGNoIG91cnNlbHZlcyEgICovCisJaW5zX2NvbXBsX2RlbGV0ZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogU2hvdyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgbWF0Y2ggKGlmIGFueSkKKyAgICAgKiBUcnVuY2F0ZSB0aGUgZmlsZSBuYW1lIHRvIGF2b2lkIGEgd2FpdCBmb3IgcmV0dXJuLgorICAgICAqLworICAgIGlmIChzaG93bl9tYXRjaC0+Zm5hbWUgIT0gTlVMTCkKKyAgICB7CisJU1RSQ1BZKElPYnVmZiwgIm1hdGNoIGluIGZpbGUgIik7CisJaSA9ICh2aW1fc3Ryc2l6ZShzaG93bl9tYXRjaC0+Zm5hbWUpICsgMTYpIC0gc2NfY29sOworCWlmIChpIDw9IDApCisJICAgIGkgPSAwOworCWVsc2UKKwkgICAgU1RSQ0FUKElPYnVmZiwgIjwiKTsKKwlTVFJDQVQoSU9idWZmLCBzaG93bl9tYXRjaC0+Zm5hbWUgKyBpKTsKKwltc2coSU9idWZmKTsKKwlyZWRyYXdfY21kbGluZSA9IEZBTFNFOwkgICAgLyogZG9uJ3Qgb3ZlcndyaXRlISAqLworICAgIH0KKworICAgIHJldHVybiBudW1fbWF0Y2hlczsKK30KKworLyoKKyAqIENhbGwgdGhpcyB3aGlsZSBmaW5kaW5nIGNvbXBsZXRpb25zLCB0byBjaGVjayB3aGV0aGVyIHRoZSB1c2VyIGhhcyBoaXQgYSBrZXkKKyAqIHRoYXQgc2hvdWxkIGNoYW5nZSB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjb21wbGV0aW9uLCBvciBleGl0IGNvbXBsZXRpb24KKyAqIG1vZGUuICBBbHNvLCB3aGVuIGNvbXBsZXRpb25fcGVuZGluZyBpcyBUUlVFLCBzaG93IGEgY29tcGxldGlvbiBhcyBzb29uIGFzCisgKiBwb3NzaWJsZS4gLS0gd2ViYgorICovCisgICAgdm9pZAoraW5zX2NvbXBsX2NoZWNrX2tleXMoKQoreworICAgIHN0YXRpYyBpbnQJY291bnQgPSAwOworCisgICAgaW50CSAgICBjOworCisgICAgLyogRG9uJ3QgY2hlY2sgd2hlbiByZWFkaW5nIGtleXMgZnJvbSBhIHNjcmlwdC4gIFRoYXQgd291bGQgYnJlYWsgdGhlIHRlc3QKKyAgICAgKiBzY3JpcHRzICovCisgICAgaWYgKHVzaW5nX3NjcmlwdCgpKQorCXJldHVybjsKKworICAgIC8qIE9ubHkgZG8gdGhpcyBhdCByZWd1bGFyIGludGVydmFscyAqLworICAgIGlmICgrK2NvdW50IDwgQ0hFQ0tfS0VZU19USU1FKQorCXJldHVybjsKKyAgICBjb3VudCA9IDA7CisKKyAgICArK25vX21hcHBpbmc7CisgICAgYyA9IHZwZWVrY19hbnkoKTsKKyAgICAtLW5vX21hcHBpbmc7CisgICAgaWYgKGMgIT0gTlVMKQorICAgIHsKKwlpZiAodmltX2lzX2N0cmxfeF9rZXkoYykgJiYgYyAhPSBDdHJsX1ggJiYgYyAhPSBDdHJsX1IpCisJeworCSAgICBjID0gc2FmZV92Z2V0YygpOwkvKiBFYXQgdGhlIGNoYXJhY3RlciAqLworCSAgICBpZiAoYyA9PSBDdHJsX1AgfHwgYyA9PSBDdHJsX0wpCisJCXNob3duX2RpcmVjdGlvbiA9IEJBQ0tXQVJEOworCSAgICBlbHNlCisJCXNob3duX2RpcmVjdGlvbiA9IEZPUldBUkQ7CisJICAgICh2b2lkKWluc19jb21wbF9uZXh0KEZBTFNFKTsKKwl9CisJZWxzZSBpZiAoYyAhPSBDdHJsX1IpCisJICAgIGNvbXBsZXRpb25faW50ZXJydXB0ZWQgPSBUUlVFOworICAgIH0KKyAgICBpZiAoY29tcGxldGlvbl9wZW5kaW5nICYmICFnb3RfaW50KQorCSh2b2lkKWluc19jb21wbF9uZXh0KEZBTFNFKTsKK30KKworLyoKKyAqIERvIEluc2VydCBtb2RlIGNvbXBsZXRpb24uCisgKiBDYWxsZWQgd2hlbiBjaGFyYWN0ZXIgImMiIHdhcyB0eXBlZCwgd2hpY2ggaGFzIGEgbWVhbmluZyBmb3IgY29tcGxldGlvbi4KKyAqIFJldHVybnMgT0sgaWYgY29tcGxldGlvbiB3YXMgZG9uZSwgRkFJTCBpZiBzb21ldGhpbmcgZmFpbGVkIChvdXQgb2YgbWVtKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19jb21wbGV0ZShjKQorICAgIGludAkJICAgIGM7Cit7CisgICAgY2hhcl91CSAgICAqbGluZTsKKyAgICBjaGFyX3UJICAgICp0bXBfcHRyID0gTlVMTDsJCS8qIGluaXQgZm9yIGdjYyAqLworICAgIGludAkJICAgIHRlbXAgPSAwOworCisgICAgaWYgKGMgPT0gQ3RybF9QIHx8IGMgPT0gQ3RybF9MKQorCWNvbXBsZXRlX2RpcmVjdGlvbiA9IEJBQ0tXQVJEOworICAgIGVsc2UKKwljb21wbGV0ZV9kaXJlY3Rpb24gPSBGT1JXQVJEOworICAgIGlmICghc3RhcnRlZF9jb21wbGV0aW9uKQorICAgIHsKKwkvKiBGaXJzdCB0aW1lIHdlIGhpdCBeTiBvciBeUCAoaW4gYSByb3csIEkgbWVhbikgKi8KKworCS8qIFR1cm4gb2ZmICdzbScgc28gd2UgZG9uJ3Qgc2hvdyBtYXRjaGVzIHdpdGggXlheTCAqLworCXNhdmVfc20gPSBwX3NtOworCXBfc20gPSBGQUxTRTsKKworCWRpZF9haSA9IEZBTFNFOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwlkaWRfc2kgPSBGQUxTRTsKKwljYW5fc2kgPSBGQUxTRTsKKwljYW5fc2lfYmFjayA9IEZBTFNFOworI2VuZGlmCisJaWYgKHN0b3BfYXJyb3coKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKworCWxpbmUgPSBtbF9nZXQoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwljb21wbGV0ZV9jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworCS8qIGlmIHRoaXMgc2FtZSBjdHJsX3hfbW9kZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB1c2UgdGhlIHRleHQgZnJvbQorCSAqICJpbml0aWFsX3BvcyIgdG8gdGhlIGN1cnNvciBhcyBhIHBhdHRlcm4gdG8gYWRkIGEgbmV3IHdvcmQgaW5zdGVhZAorCSAqIG9mIGV4cGFuZCB0aGUgb25lIGJlZm9yZSB0aGUgY3Vyc29yLCBpbiB3b3JkLXdpc2UgaWYgImluaXRpYWxfcG9zIgorCSAqIGlzIG5vdCBpbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjdXJzb3IgdGhlbiBmaXggaXQgKHRoZSBsaW5lIGhhcworCSAqIGJlZW4gc3BsaXQgYmVjYXVzZSBpdCB3YXMgbG9uZ2VyIHRoYW4gJ3R3JykuICBpZiBTT0wgaXMgc2V0IHRoZW4KKwkgKiBza2lwIHRoZSBwcmV2aW91cyBwYXR0ZXJuLCBhIHdvcmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBoYXMKKwkgKiBiZWVuIGluc2VydGVkLCB3ZSdsbCBsb29rIGZvciB0aGF0ICAtLSBBY2V2ZWRvLiAqLworCWlmICgoY29udGludWVfc3RhdHVzICYgQ09OVF9JTlRSUFQpICYmIGNvbnRpbnVlX21vZGUgPT0gY3RybF94X21vZGUpCisJeworCSAgICAvKgorCSAgICAgKiBpdCBpcyBhIGNvbnRpbnVlZCBzZWFyY2gKKwkgICAgICovCisJICAgIGNvbnRpbnVlX3N0YXR1cyAmPSB+Q09OVF9JTlRSUFQ7CS8qIHJlbW92ZSBJTlRSUFQgKi8KKwkgICAgaWYgKGN0cmxfeF9tb2RlID09IDAgfHwgY3RybF94X21vZGUgPT0gQ1RSTF9YX1BBVEhfUEFUVEVSTlMKKwkJCQkJfHwgY3RybF94X21vZGUgPT0gQ1RSTF9YX1BBVEhfREVGSU5FUykKKwkgICAgeworCQlpZiAoaW5pdGlhbF9wb3MubG51bSAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJCXsKKwkJICAgIC8qIGxpbmUgKHByb2JhYmx5KSB3cmFwcGVkLCBzZXQgaW5pdGlhbF9wb3MgdG8gdGhlIGZpcnN0CisJCSAgICAgKiBub25fYmxhbmsgaW4gdGhlIGxpbmUsIGlmIGl0IGlzIG5vdCBhIHdvcmRjaGFyIGluY2x1ZGUKKwkJICAgICAqIGl0IHRvIGdldCBhIGJldHRlciBwYXR0ZXJuLCBidXQgdGhlbiB3ZSBkb24ndCB3YW50IHRoZQorCQkgICAgICogIlxcPCIgcHJlZml4LCBjaGVjayBpdCBiZWxsb3cgKi8KKwkJICAgIHRtcF9wdHIgPSBza2lwd2hpdGUobGluZSk7CisJCSAgICBpbml0aWFsX3Bvcy5jb2wgPSAoY29sbnJfVCkgKHRtcF9wdHIgLSBsaW5lKTsKKwkJICAgIGluaXRpYWxfcG9zLmxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCSAgICBjb250aW51ZV9zdGF0dXMgJj0gfkNPTlRfU09MOyAgICAvKiBjbGVhciBTT0wgaWYgcHJlc2VudCAqLworCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogU19JUE9TIHdhcyBzZXQgd2hlbiB3ZSBpbnNlcnRlZCBhIHdvcmQgdGhhdCB3YXMgYXQgdGhlCisJCSAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsIHdoaWNoIG1lYW5zIHRoYXQgd2UnbGwgZ28gdG8gU09MCisJCSAgICAgKiBtb2RlIGJ1dCBmaXJzdCB3ZSBuZWVkIHRvIHJlZGVmaW5lIGluaXRpYWxfcG9zICovCisJCSAgICBpZiAoY29udGludWVfc3RhdHVzICYgQ09OVF9TX0lQT1MpCisJCSAgICB7CisJCQljb250aW51ZV9zdGF0dXMgfD0gQ09OVF9TT0w7CisJCQlpbml0aWFsX3Bvcy5jb2wgPSAoY29sbnJfVCkgKHNraXB3aGl0ZShsaW5lICsgY29tcGxldGlvbl9sZW5ndGggKworCQkJCQkJICAgIGluaXRpYWxfcG9zLmNvbCkgLSBsaW5lKTsKKwkJICAgIH0KKwkJICAgIHRtcF9wdHIgPSBsaW5lICsgaW5pdGlhbF9wb3MuY29sOworCQl9CisJCXRlbXAgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIChpbnQpKHRtcF9wdHIgLSBsaW5lKTsKKwkJLyogSU9idWYgaXMgdXNlZCB0byBhZGQgYSAid29yZCBmcm9tIHRoZSBuZXh0IGxpbmUiIHdvdWxkIHdlCisJCSAqIGhhdmUgZW5vdWdoIHNwYWNlPyAganVzdCBiZWluZyBwYXJhbm9pYyAqLworI2RlZmluZQlNSU5fU1BBQ0UgNzUKKwkJaWYgKHRlbXAgPiAoSU9TSVpFIC0gTUlOX1NQQUNFKSkKKwkJeworCQkgICAgY29udGludWVfc3RhdHVzICY9IH5DT05UX1NPTDsKKwkJICAgIHRlbXAgPSAoSU9TSVpFIC0gTUlOX1NQQUNFKTsKKwkJICAgIHRtcF9wdHIgPSBsaW5lICsgY3Vyd2luLT53X2N1cnNvci5jb2wgLSB0ZW1wOworCQl9CisJCWNvbnRpbnVlX3N0YXR1cyB8PSBDT05UX0FERElORyB8IENPTlRfTl9BRERTOworCQlpZiAodGVtcCA8IDEpCisJCSAgICBjb250aW51ZV9zdGF0dXMgJj0gQ09OVF9MT0NBTDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfV0hPTEVfTElORSkKKwkJY29udGludWVfc3RhdHVzID0gQ09OVF9BRERJTkcgfCBDT05UX05fQUREUzsKKwkgICAgZWxzZQorCQljb250aW51ZV9zdGF0dXMgPSAwOworCX0KKwllbHNlCisJICAgIGNvbnRpbnVlX3N0YXR1cyAmPSBDT05UX0xPQ0FMOworCisJaWYgKCEoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpKQkvKiBub3JtYWwgZXhwYW5zaW9uICovCisJeworCSAgICBjb250aW51ZV9tb2RlID0gY3RybF94X21vZGU7CisJICAgIGlmIChjdHJsX3hfbW9kZSAhPSAwKQkvKiBSZW1vdmUgTE9DQUwgaWYgY3RybF94X21vZGUgIT0gMCAqLworCQljb250aW51ZV9zdGF0dXMgPSAwOworCSAgICBjb250aW51ZV9zdGF0dXMgfD0gQ09OVF9OX0FERFM7CisJICAgIGluaXRpYWxfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgdGVtcCA9IChpbnQpY29tcGxldGVfY29sOworCSAgICB0bXBfcHRyID0gbGluZTsKKwl9CisKKwkvKiBXb3JrIG91dCBjb21wbGV0aW9uIHBhdHRlcm4gYW5kIG9yaWdpbmFsIHRleHQgLS0gd2ViYiAqLworCWlmIChjdHJsX3hfbW9kZSA9PSAwIHx8IChjdHJsX3hfbW9kZSAmIENUUkxfWF9XQU5UX0lERU5UKSkKKwl7CisJICAgIGlmICggICAgICAgKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU09MKQorCQkgICAgfHwgY3RybF94X21vZGUgPT0gQ1RSTF9YX1BBVEhfREVGSU5FUykKKwkgICAgeworCQlpZiAoIShjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORykpCisJCXsKKwkJICAgIHdoaWxlICgtLXRlbXAgPj0gMCAmJiB2aW1faXNJRGMobGluZVt0ZW1wXSkpCisJCQk7CisJCSAgICB0bXBfcHRyICs9ICsrdGVtcDsKKwkJICAgIHRlbXAgPSBjb21wbGV0ZV9jb2wgLSB0ZW1wOworCQl9CisJCWlmIChwX2ljKQorCQkgICAgY29tcGxldGVfcGF0ID0gc3RyX2ZvbGRjYXNlKHRtcF9wdHIsIHRlbXApOworCQllbHNlCisJCSAgICBjb21wbGV0ZV9wYXQgPSB2aW1fc3RybnNhdmUodG1wX3B0ciwgdGVtcCk7CisJCWlmIChjb21wbGV0ZV9wYXQgPT0gTlVMTCkKKwkJICAgIHJldHVybiBGQUlMOworCSAgICB9CisJICAgIGVsc2UgaWYgKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfQURESU5HKQorCSAgICB7CisJCWNoYXJfdQkgICAgKnByZWZpeCA9IChjaGFyX3UgKikiXFw8IjsKKworCQkvKiB3ZSBuZWVkIDMgZXh0cmEgY2hhcnMsIDEgZm9yIHRoZSBOVUwgYW5kCisJCSAqIDIgPj0gc3RybGVuKHByZWZpeCkJLS0gQWNldmVkbyAqLworCQljb21wbGV0ZV9wYXQgPSBhbGxvYyhxdW90ZV9tZXRhKE5VTEwsIHRtcF9wdHIsIHRlbXApICsgMyk7CisJCWlmIChjb21wbGV0ZV9wYXQgPT0gTlVMTCkKKwkJICAgIHJldHVybiBGQUlMOworCQlpZiAoIXZpbV9pc3dvcmRwKHRtcF9wdHIpCisJCQl8fCAodG1wX3B0ciA+IGxpbmUKKwkJCSAgICAmJiAoCisjaWZkZWYgRkVBVF9NQllURQorCQkJCXZpbV9pc3dvcmRwKG1iX3ByZXZwdHIobGluZSwgdG1wX3B0cikpCisjZWxzZQorCQkJCXZpbV9pc3dvcmRjKCoodG1wX3B0ciAtIDEpKQorI2VuZGlmCisJCQkJKSkpCisJCSAgICBwcmVmaXggPSAoY2hhcl91ICopIiI7CisJCVNUUkNQWSgoY2hhciAqKWNvbXBsZXRlX3BhdCwgcHJlZml4KTsKKwkJKHZvaWQpcXVvdGVfbWV0YShjb21wbGV0ZV9wYXQgKyBTVFJMRU4ocHJlZml4KSwgdG1wX3B0ciwgdGVtcCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoCisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgLS10ZW1wIDwgMCB8fCAhdmltX2lzd29yZHAobWJfcHJldnB0cihsaW5lLAorCQkJCQkJCSAgICAgbGluZSArIHRlbXAgKyAxKSkKKyNlbHNlCisJCSAgICAtLXRlbXAgPCAwIHx8ICF2aW1faXN3b3JkYyhsaW5lW3RlbXBdKQorI2VuZGlmCisJCSAgICApCisJICAgIHsKKwkJLyogTWF0Y2ggYW55IHdvcmQgb2YgYXQgbGVhc3QgdHdvIGNoYXJzICovCisJCWNvbXBsZXRlX3BhdCA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikiXFw8XFxrXFxrIik7CisJCWlmIChjb21wbGV0ZV9wYXQgPT0gTlVMTCkKKwkJICAgIHJldHVybiBGQUlMOworCQl0bXBfcHRyICs9IGNvbXBsZXRlX2NvbDsKKwkJdGVtcCA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQkvKiBTZWFyY2ggdGhlIHBvaW50IG9mIGNoYW5nZSBjbGFzcyBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVyCisJCSAqIG9yIG5vdCBhIHdvcmQgc2luZ2xlIGJ5dGUgY2hhcmFjdGVyIGJhY2t3YXJkLiAgKi8KKwkJaWYgKGhhc19tYnl0ZSkKKwkJeworCQkgICAgaW50IGJhc2VfY2xhc3M7CisJCSAgICBpbnQgaGVhZF9vZmY7CisKKwkJICAgIHRlbXAgLT0gKCptYl9oZWFkX29mZikobGluZSwgbGluZSArIHRlbXApOworCQkgICAgYmFzZV9jbGFzcyA9IG1iX2dldF9jbGFzcyhsaW5lICsgdGVtcCk7CisJCSAgICB3aGlsZSAoLS10ZW1wID49IDApCisJCSAgICB7CisJCQloZWFkX29mZiA9ICgqbWJfaGVhZF9vZmYpKGxpbmUsIGxpbmUgKyB0ZW1wKTsKKwkJCWlmIChiYXNlX2NsYXNzICE9IG1iX2dldF9jbGFzcyhsaW5lICsgdGVtcCAtIGhlYWRfb2ZmKSkKKwkJCSAgICBicmVhazsKKwkJCXRlbXAgLT0gaGVhZF9vZmY7CisJCSAgICB9CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCSAgICB3aGlsZSAoLS10ZW1wID49IDAgJiYgdmltX2lzd29yZGMobGluZVt0ZW1wXSkpCisJCQk7CisJCXRtcF9wdHIgKz0gKyt0ZW1wOworCQlpZiAoKHRlbXAgPSAoaW50KWNvbXBsZXRlX2NvbCAtIHRlbXApID09IDEpCisJCXsKKwkJICAgIC8qIE9ubHkgbWF0Y2ggd29yZCB3aXRoIGF0IGxlYXN0IHR3byBjaGFycyAtLSB3ZWJiCisJCSAgICAgKiB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbCBxdW90ZV9tZXRhLAorCQkgICAgICogYWxsb2MoNykgaXMgZW5vdWdoICAtLSBBY2V2ZWRvCisJCSAgICAgKi8KKwkJICAgIGNvbXBsZXRlX3BhdCA9IGFsbG9jKDcpOworCQkgICAgaWYgKGNvbXBsZXRlX3BhdCA9PSBOVUxMKQorCQkJcmV0dXJuIEZBSUw7CisJCSAgICBTVFJDUFkoKGNoYXIgKiljb21wbGV0ZV9wYXQsICJcXDwiKTsKKwkJICAgICh2b2lkKXF1b3RlX21ldGEoY29tcGxldGVfcGF0ICsgMiwgdG1wX3B0ciwgMSk7CisJCSAgICBTVFJDQVQoKGNoYXIgKiljb21wbGV0ZV9wYXQsICJcXGsiKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGNvbXBsZXRlX3BhdCA9IGFsbG9jKHF1b3RlX21ldGEoTlVMTCwgdG1wX3B0ciwgdGVtcCkgKyAzKTsKKwkJICAgIGlmIChjb21wbGV0ZV9wYXQgPT0gTlVMTCkKKwkJCXJldHVybiBGQUlMOworCQkgICAgU1RSQ1BZKChjaGFyICopY29tcGxldGVfcGF0LCAiXFw8Iik7CisJCSAgICAodm9pZClxdW90ZV9tZXRhKGNvbXBsZXRlX3BhdCArIDIsIHRtcF9wdHIsIHRlbXApOworCQl9CisJICAgIH0KKwl9CisJZWxzZSBpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJeworCSAgICB0bXBfcHRyID0gc2tpcHdoaXRlKGxpbmUpOworCSAgICB0ZW1wID0gKGludCljb21wbGV0ZV9jb2wgLSAoaW50KSh0bXBfcHRyIC0gbGluZSk7CisJICAgIGlmICh0ZW1wIDwgMCkJLyogY3Vyc29yIGluIGluZGVudDogZW1wdHkgcGF0dGVybiAqLworCQl0ZW1wID0gMDsKKwkgICAgaWYgKHBfaWMpCisJCWNvbXBsZXRlX3BhdCA9IHN0cl9mb2xkY2FzZSh0bXBfcHRyLCB0ZW1wKTsKKwkgICAgZWxzZQorCQljb21wbGV0ZV9wYXQgPSB2aW1fc3RybnNhdmUodG1wX3B0ciwgdGVtcCk7CisJICAgIGlmIChjb21wbGV0ZV9wYXQgPT0gTlVMTCkKKwkJcmV0dXJuIEZBSUw7CisJfQorCWVsc2UgaWYgKGN0cmxfeF9tb2RlID09IENUUkxfWF9GSUxFUykKKwl7CisJICAgIHdoaWxlICgtLXRlbXAgPj0gMCAmJiB2aW1faXNmaWxlYyhsaW5lW3RlbXBdKSkKKwkJOworCSAgICB0bXBfcHRyICs9ICsrdGVtcDsKKwkgICAgdGVtcCA9IChpbnQpY29tcGxldGVfY29sIC0gdGVtcDsKKwkgICAgY29tcGxldGVfcGF0ID0gYWRkc3Rhcih0bXBfcHRyLCB0ZW1wLCBFWFBBTkRfRklMRVMpOworCSAgICBpZiAoY29tcGxldGVfcGF0ID09IE5VTEwpCisJCXJldHVybiBGQUlMOworCX0KKwllbHNlIGlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfQ01ETElORSkKKwl7CisJICAgIGNvbXBsZXRlX3BhdCA9IHZpbV9zdHJuc2F2ZShsaW5lLCBjb21wbGV0ZV9jb2wpOworCSAgICBpZiAoY29tcGxldGVfcGF0ID09IE5VTEwpCisJCXJldHVybiBGQUlMOworCSAgICBzZXRfY21kX2NvbnRleHQoJmNvbXBsZXRlX3hwLCBjb21wbGV0ZV9wYXQsCisJCQkJICAgICAoaW50KVNUUkxFTihjb21wbGV0ZV9wYXQpLCBjb21wbGV0ZV9jb2wpOworCSAgICBpZiAoY29tcGxldGVfeHAueHBfY29udGV4dCA9PSBFWFBBTkRfVU5TVUNDRVNTRlVMCisJCSAgICB8fCBjb21wbGV0ZV94cC54cF9jb250ZXh0ID09IEVYUEFORF9OT1RISU5HKQorCQlyZXR1cm4gRkFJTDsKKwkgICAgdGVtcCA9IChpbnQpKGNvbXBsZXRlX3hwLnhwX3BhdHRlcm4gLSBjb21wbGV0ZV9wYXQpOworCSAgICB0bXBfcHRyID0gbGluZSArIHRlbXA7CisJICAgIHRlbXAgPSBjb21wbGV0ZV9jb2wgLSB0ZW1wOworCX0KKwljb21wbGV0ZV9jb2wgPSAoY29sbnJfVCkgKHRtcF9wdHIgLSBsaW5lKTsKKworCWlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORykKKwl7CisJICAgIGVkaXRfc3VibW9kZV9wcmUgPSAoY2hhcl91ICopXygiIEFkZGluZyIpOworCSAgICBpZiAoY3RybF94X21vZGUgPT0gQ1RSTF9YX1dIT0xFX0xJTkUpCisJICAgIHsKKwkJLyogSW5zZXJ0IGEgbmV3IGxpbmUsIGtlZXAgaW5kZW50YXRpb24gYnV0IGlnbm9yZSAnY29tbWVudHMnICovCisjaWZkZWYgRkVBVF9DT01NRU5UUworCQljaGFyX3UgKm9sZCA9IGN1cmJ1Zi0+Yl9wX2NvbTsKKworCQljdXJidWYtPmJfcF9jb20gPSAoY2hhcl91ICopIiI7CisjZW5kaWYKKwkJaW5pdGlhbF9wb3MubG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJaW5pdGlhbF9wb3MuY29sID0gY29tcGxldGVfY29sOworCQlpbnNfZW9sKCdccicpOworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkJY3VyYnVmLT5iX3BfY29tID0gb2xkOworI2VuZGlmCisJCXRtcF9wdHIgPSAoY2hhcl91ICopIiI7CisJCXRlbXAgPSAwOworCQljb21wbGV0ZV9jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBlZGl0X3N1Ym1vZGVfcHJlID0gTlVMTDsKKwkgICAgaW5pdGlhbF9wb3MuY29sID0gY29tcGxldGVfY29sOworCX0KKworCWlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKQorCSAgICBlZGl0X3N1Ym1vZGUgPSAoY2hhcl91ICopXyhjdHJsX3hfbXNnc1syXSk7CisJZWxzZQorCSAgICBlZGl0X3N1Ym1vZGUgPSAoY2hhcl91ICopXyhDVFJMX1hfTVNHKGN0cmxfeF9tb2RlKSk7CisKKwljb21wbGV0aW9uX2xlbmd0aCA9IHRlbXA7CisKKwkvKiBBbHdheXMgYWRkIGNvbXBsZXRpb24gZm9yIHRoZSBvcmlnaW5hbCB0ZXh0LiAgTm90ZSB0aGF0CisJICogIm9yaWdpbmFsX3RleHQiIGl0c2VsZiAobm90IGEgY29weSkgaXMgYWRkZWQsIGl0IHdpbGwgYmUgZnJlZWQgd2hlbgorCSAqIHRoZSBsaXN0IG9mIG1hdGNoZXMgaXMgZnJlZWQuICovCisJaWYgKChvcmlnaW5hbF90ZXh0ID0gdmltX3N0cm5zYXZlKHRtcF9wdHIsIHRlbXApKSA9PSBOVUxMCisJICAgIHx8IGluc19jb21wbF9hZGQob3JpZ2luYWxfdGV4dCwgLTEsIE5VTEwsIDAsIE9SSUdJTkFMX1RFWFQpICE9IE9LKQorCXsKKwkgICAgdmltX2ZyZWUoY29tcGxldGVfcGF0KTsKKwkgICAgY29tcGxldGVfcGF0ID0gTlVMTDsKKwkgICAgdmltX2ZyZWUob3JpZ2luYWxfdGV4dCk7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCS8qIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisJICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisJICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisJICovCisJZWRpdF9zdWJtb2RlX2V4dHJhID0gKGNoYXJfdSAqKV8oIi0tIFNlYXJjaGluZy4uLiIpOworCWVkaXRfc3VibW9kZV9oaWdobCA9IEhMRl9DT1VOVDsKKwlzaG93bW9kZSgpOworCWVkaXRfc3VibW9kZV9leHRyYSA9IE5VTEw7CisJb3V0X2ZsdXNoKCk7CisgICAgfQorCisgICAgc2hvd25fbWF0Y2ggPSBjdXJyX21hdGNoOworICAgIHNob3duX2RpcmVjdGlvbiA9IGNvbXBsZXRlX2RpcmVjdGlvbjsKKworICAgIC8qCisgICAgICogRmluZCBuZXh0IG1hdGNoLgorICAgICAqLworICAgIHRlbXAgPSBpbnNfY29tcGxfbmV4dChUUlVFKTsKKworICAgIGlmICh0ZW1wID4gMSkJLyogYWxsIG1hdGNoZXMgaGF2ZSBiZWVuIGZvdW5kICovCisJY29tcGxldGlvbl9tYXRjaGVzID0gdGVtcDsKKyAgICBjdXJyX21hdGNoID0gc2hvd25fbWF0Y2g7CisgICAgY29tcGxldGVfZGlyZWN0aW9uID0gc2hvd25fZGlyZWN0aW9uOworICAgIGNvbXBsZXRpb25faW50ZXJydXB0ZWQgPSBGQUxTRTsKKworICAgIC8qIGVhdCB0aGUgRVNDIHRvIGF2b2lkIGxlYXZpbmcgaW5zZXJ0IG1vZGUgKi8KKyAgICBpZiAoZ290X2ludCAmJiAhZ2xvYmFsX2J1c3kpCisgICAgeworCSh2b2lkKXZnZXRjKCk7CisJZ290X2ludCA9IEZBTFNFOworICAgIH0KKworICAgIC8qIHdlIGZvdW5kIG5vIG1hdGNoIGlmIHRoZSBsaXN0IGhhcyBvbmx5IHRoZSBvcmlnaW5hbF90ZXh0LWVudHJ5ICovCisgICAgaWYgKGZpcnN0X21hdGNoID09IGZpcnN0X21hdGNoLT5uZXh0KQorICAgIHsKKwllZGl0X3N1Ym1vZGVfZXh0cmEgPSAoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpCisJCQkmJiBjb21wbGV0aW9uX2xlbmd0aCA+IDEKKwkJCSAgICAgPyAoY2hhcl91ICopXyhlX2hpdGVuZCkgOiAoY2hhcl91ICopXyhlX3BhdG5vdGYpOworCWVkaXRfc3VibW9kZV9oaWdobCA9IEhMRl9FOworCS8qIHJlbW92ZSBOX0FERFMgZmxhZywgc28gbmV4dCBeWDw+IHdvbid0IHRyeSB0byBnbyB0byBBRERJTkcgbW9kZSwKKwkgKiBiZWNhdXNlIHdlIGNvdWxkbid0IGV4cGFuZCBhbnl0aGluZyBhdCBmaXJzdCBwbGFjZSwgYnV0IGlmIHdlIHVzZWQKKwkgKiBeUCwgXk4sIF5YXkkgb3IgXlheRCB3ZSBtaWdodCB3YW50IHRvIGFkZC1leHBhbmQgYSBzaW5nbGUtY2hhci13b3JkCisJICogKHN1Y2ggYXMgTSBpbiBNJ2V4aWNvKSBpZiBub3QgdHJpZWQgYWxyZWFkeS4gIC0tIEFjZXZlZG8gKi8KKwlpZiAoCSAgIGNvbXBsZXRpb25fbGVuZ3RoID4gMQorCQl8fCAoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpCisJCXx8IChjdHJsX3hfbW9kZSAhPSAwCisJCSAgICAmJiBjdHJsX3hfbW9kZSAhPSBDVFJMX1hfUEFUSF9QQVRURVJOUworCQkgICAgJiYgY3RybF94X21vZGUgIT0gQ1RSTF9YX1BBVEhfREVGSU5FUykpCisJICAgIGNvbnRpbnVlX3N0YXR1cyAmPSB+Q09OVF9OX0FERFM7CisgICAgfQorCisgICAgaWYgKGN1cnJfbWF0Y2gtPm9yaWdpbmFsICYgQ09OVF9TX0lQT1MpCisJY29udGludWVfc3RhdHVzIHw9IENPTlRfU19JUE9TOworICAgIGVsc2UKKwljb250aW51ZV9zdGF0dXMgJj0gfkNPTlRfU19JUE9TOworCisgICAgaWYgKGVkaXRfc3VibW9kZV9leHRyYSA9PSBOVUxMKQorICAgIHsKKwlpZiAoY3Vycl9tYXRjaC0+b3JpZ2luYWwgJiBPUklHSU5BTF9URVhUKQorCXsKKwkgICAgZWRpdF9zdWJtb2RlX2V4dHJhID0gKGNoYXJfdSAqKV8oIkJhY2sgYXQgb3JpZ2luYWwiKTsKKwkgICAgZWRpdF9zdWJtb2RlX2hpZ2hsID0gSExGX1c7CisJfQorCWVsc2UgaWYgKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU19JUE9TKQorCXsKKwkgICAgZWRpdF9zdWJtb2RlX2V4dHJhID0gKGNoYXJfdSAqKV8oIldvcmQgZnJvbSBvdGhlciBsaW5lIik7CisJICAgIGVkaXRfc3VibW9kZV9oaWdobCA9IEhMRl9DT1VOVDsKKwl9CisJZWxzZSBpZiAoY3Vycl9tYXRjaC0+bmV4dCA9PSBjdXJyX21hdGNoLT5wcmV2KQorCXsKKwkgICAgZWRpdF9zdWJtb2RlX2V4dHJhID0gKGNoYXJfdSAqKV8oIlRoZSBvbmx5IG1hdGNoIik7CisJICAgIGVkaXRfc3VibW9kZV9oaWdobCA9IEhMRl9DT1VOVDsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogVXBkYXRlIGNvbXBsZXRpb24gc2VxdWVuY2UgbnVtYmVyIHdoZW4gbmVlZGVkLiAqLworCSAgICBpZiAoY3Vycl9tYXRjaC0+bnVtYmVyID09IC0xKQorCSAgICB7CisJCWludAkJICAgIG51bWJlciA9IDA7CisJCXN0cnVjdCBDb21wbGV0aW9uICAgKm1hdGNoOworCisJCWlmIChjb21wbGV0ZV9kaXJlY3Rpb24gPT0gRk9SV0FSRCkKKwkJeworCQkgICAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGZpcnN0IHZhbGlkICghPSAtMSkgbnVtYmVyLgorCQkgICAgICogVGhpcyBzaG91bGQgbm9ybWFsbHkgc3VjY2VlZCBhbHJlYWR5IGF0IHRoZSBmaXJzdCBsb29wCisJCSAgICAgKiBjeWNsZSwgc28gaXQncyBmYXN0ISAqLworCQkgICAgZm9yIChtYXRjaCA9IGN1cnJfbWF0Y2gtPnByZXY7IG1hdGNoICE9IE5VTEwKKwkJCQkgJiYgbWF0Y2ggIT0gZmlyc3RfbWF0Y2g7IG1hdGNoID0gbWF0Y2gtPnByZXYpCisJCQlpZiAobWF0Y2gtPm51bWJlciAhPSAtMSkKKwkJCXsKKwkJCSAgICBudW1iZXIgPSBtYXRjaC0+bnVtYmVyOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgaWYgKG1hdGNoICE9IE5VTEwpCisJCQkvKiBnbyB1cCBhbmQgYXNzaWduIGFsbCBudW1iZXJzIHdoaWNoIGFyZSBub3QgYXNzaWduZWQKKwkJCSAqIHlldCAqLworCQkJZm9yIChtYXRjaCA9IG1hdGNoLT5uZXh0OyBtYXRjaAorCQkJCSAgJiYgbWF0Y2gtPm51bWJlciA9PSAtMTsgbWF0Y2ggPSBtYXRjaC0+bmV4dCkKKwkJCSAgICBtYXRjaC0+bnVtYmVyID0gKytudW1iZXI7CisJCX0KKwkJZWxzZSAvKiBCQUNLV0FSRCAqLworCQl7CisJCSAgICAvKiBzZWFyY2ggZm9yd2FyZHMgKHVwd2FyZHMpIGZvciB0aGUgZmlyc3QgdmFsaWQgKCE9IC0xKQorCQkgICAgICogbnVtYmVyLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgc3VjY2VlZCBhbHJlYWR5IGF0IHRoZQorCQkgICAgICogZmlyc3QgbG9vcCBjeWNsZSwgc28gaXQncyBmYXN0ISAqLworCQkgICAgZm9yIChtYXRjaCA9IGN1cnJfbWF0Y2gtPm5leHQ7IG1hdGNoICE9IE5VTEwKKwkJCQkgJiYgbWF0Y2ggIT0gZmlyc3RfbWF0Y2g7IG1hdGNoID0gbWF0Y2gtPm5leHQpCisJCQlpZiAobWF0Y2gtPm51bWJlciAhPSAtMSkKKwkJCXsKKwkJCSAgICBudW1iZXIgPSBtYXRjaC0+bnVtYmVyOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgaWYgKG1hdGNoICE9IE5VTEwpCisJCQkvKiBnbyBkb3duIGFuZCBhc3NpZ24gYWxsIG51bWJlcnMgd2hpY2ggYXJlIG5vdAorCQkJICogYXNzaWduZWQgeWV0ICovCisJCQlmb3IgKG1hdGNoID0gbWF0Y2gtPnByZXY7IG1hdGNoCisJCQkJICAmJiBtYXRjaC0+bnVtYmVyID09IC0xOyBtYXRjaCA9IG1hdGNoLT5wcmV2KQorCQkJICAgIG1hdGNoLT5udW1iZXIgPSArK251bWJlcjsKKwkJfQorCSAgICB9CisKKwkgICAgLyogVGhlIG1hdGNoIHNob3VsZCBhbHdheXMgaGF2ZSBhIHNlcXVuY2UgbnVtYmVyIG5vdywgdGhpcyBpcyBqdXN0CisJICAgICAqIGEgc2FmZXR5IGNoZWNrLiAqLworCSAgICBpZiAoY3Vycl9tYXRjaC0+bnVtYmVyICE9IC0xKQorCSAgICB7CisJCS8qIFNwYWNlIGZvciAxMCB0ZXh0IGNoYXJzLiArIDJ4MTAtZGlnaXQgbm8ucyAqLworCQlzdGF0aWMgY2hhcl91IG1hdGNoX3JlZlszMV07CisKKwkJaWYgKGNvbXBsZXRpb25fbWF0Y2hlcyA+IDApCisJCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJtYXRjaCAlZCBvZiAlZCIpLAorCQkJCSAgICAgIGN1cnJfbWF0Y2gtPm51bWJlciwgY29tcGxldGlvbl9tYXRjaGVzKTsKKwkJZWxzZQorCQkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygibWF0Y2ggJWQiKSwgY3Vycl9tYXRjaC0+bnVtYmVyKTsKKwkJU1RSTkNQWShtYXRjaF9yZWYsIElPYnVmZiwgMzAgKTsKKwkJbWF0Y2hfcmVmWzMwXSA9ICdcMCc7CisJCWVkaXRfc3VibW9kZV9leHRyYSA9IG1hdGNoX3JlZjsKKwkJZWRpdF9zdWJtb2RlX2hpZ2hsID0gSExGX1I7CisJCWlmIChkb2xsYXJfdmNvbCkKKwkJICAgIGN1cnNfY29sdW1ucyhGQUxTRSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogU2hvdyBhIG1lc3NhZ2UgYWJvdXQgd2hhdCAoY29tcGxldGlvbikgbW9kZSB3ZSdyZSBpbi4gKi8KKyAgICBzaG93bW9kZSgpOworICAgIGlmIChlZGl0X3N1Ym1vZGVfZXh0cmEgIT0gTlVMTCkKKyAgICB7CisJaWYgKCFwX3NtZCkKKwkgICAgbXNnX2F0dHIoZWRpdF9zdWJtb2RlX2V4dHJhLAorCQkgICAgZWRpdF9zdWJtb2RlX2hpZ2hsIDwgSExGX0NPVU5UCisJCSAgICA/IGhsX2F0dHIoZWRpdF9zdWJtb2RlX2hpZ2hsKSA6IDApOworICAgIH0KKyAgICBlbHNlCisJbXNnX2Nscl9jbWRsaW5lKCk7CS8qIG5lY2Vzc2FyeSBmb3IgIm5vc2hvd21vZGUiICovCisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBMb29rcyBpbiB0aGUgZmlyc3QgImxlbiIgY2hhcnMuIG9mICJzcmMiIGZvciBzZWFyY2gtbWV0YWNoYXJzLgorICogSWYgZGVzdCBpcyBub3QgTlVMTCB0aGUgY2hhcnMuIGFyZSBjb3BpZWQgdGhlcmUgcXVvdGluZyAod2l0aAorICogYSBiYWNrc2xhc2gpIHRoZSBtZXRhY2hhcnMsIGFuZCBkZXN0IHdvdWxkIGJlIE5VTCB0ZXJtaW5hdGVkLgorICogUmV0dXJucyB0aGUgbGVuZ3RoIChuZWVkZWQpIG9mIGRlc3QKKyAqLworICAgIHN0YXRpYyBpbnQKK3F1b3RlX21ldGEoZGVzdCwgc3JjLCBsZW4pCisgICAgY2hhcl91CSpkZXN0OworICAgIGNoYXJfdQkqc3JjOworICAgIGludAkJbGVuOworeworICAgIGludAltOworCisgICAgZm9yIChtID0gbGVuOyAtLWxlbiA+PSAwOyBzcmMrKykKKyAgICB7CisJc3dpdGNoICgqc3JjKQorCXsKKwkgICAgY2FzZSAnLic6CisJICAgIGNhc2UgJyonOgorCSAgICBjYXNlICdbJzoKKwkJaWYgKGN0cmxfeF9tb2RlID09IENUUkxfWF9ESUNUSU9OQVJZCisJCQkJCSAgIHx8IGN0cmxfeF9tb2RlID09IENUUkxfWF9USEVTQVVSVVMpCisJCSAgICBicmVhazsKKwkgICAgY2FzZSAnfic6CisJCWlmICghcF9tYWdpYykJLyogcXVvdGUgdGhlc2Ugb25seSBpZiBtYWdpYyBpcyBzZXQgKi8KKwkJICAgIGJyZWFrOworCSAgICBjYXNlICdcXCc6CisJCWlmIChjdHJsX3hfbW9kZSA9PSBDVFJMX1hfRElDVElPTkFSWQorCQkJCQkgICB8fCBjdHJsX3hfbW9kZSA9PSBDVFJMX1hfVEhFU0FVUlVTKQorCQkgICAgYnJlYWs7CisJICAgIGNhc2UgJ14nOgkJLyogY3VycmVudGx5IGl0J3Mgbm90IG5lZWRlZC4gKi8KKwkgICAgY2FzZSAnJCc6CisJCW0rKzsKKwkJaWYgKGRlc3QgIT0gTlVMTCkKKwkJICAgICpkZXN0KysgPSAnXFwnOworCQlicmVhazsKKwl9CisJaWYgKGRlc3QgIT0gTlVMTCkKKwkgICAgKmRlc3QrKyA9ICpzcmM7CisjaWZkZWYgRkVBVF9NQllURQorCS8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIG9mIGEgbXVsdGlieXRlIGNoYXJhY3Rlci4gKi8KKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50IGksIG1iX2xlbjsKKworCSAgICBtYl9sZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKHNyYykgLSAxOworCSAgICBpZiAobWJfbGVuID4gMCAmJiBsZW4gPj0gbWJfbGVuKQorCQlmb3IgKGkgPSAwOyBpIDwgbWJfbGVuOyArK2kpCisJCXsKKwkJICAgIC0tbGVuOworCQkgICAgKytzcmM7CisJCSAgICBpZiAoZGVzdCAhPSBOVUxMKQorCQkJKmRlc3QrKyA9ICpzcmM7CisJCX0KKwl9CisjZW5kaWYKKyAgICB9CisgICAgaWYgKGRlc3QgIT0gTlVMTCkKKwkqZGVzdCA9IE5VTDsKKworICAgIHJldHVybiBtOworfQorI2VuZGlmIC8qIEZFQVRfSU5TX0VYUEFORCAqLworCisvKgorICogTmV4dCBjaGFyYWN0ZXIgaXMgaW50ZXJwcmV0ZWQgbGl0ZXJhbGx5LgorICogQSBvbmUsIHR3byBvciB0aHJlZSBkaWdpdCBkZWNpbWFsIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyBpdHMgYnl0ZSB2YWx1ZS4KKyAqIElmIG9uZSBvciB0d28gZGlnaXRzIGFyZSBlbnRlcmVkLCB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgZ2l2ZW4gdG8gdnVuZ2V0YygpLgorICogRm9yIFVuaWNvZGUgYSBjaGFyYWN0ZXIgPiAyNTUgbWF5IGJlIHJldHVybmVkLgorICovCisgICAgaW50CitnZXRfbGl0ZXJhbCgpCit7CisgICAgaW50CQljYzsKKyAgICBpbnQJCW5jOworICAgIGludAkJaTsKKyAgICBpbnQJCWhleCA9IEZBTFNFOworICAgIGludAkJb2N0YWwgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQl1bmljb2RlID0gMDsKKyNlbmRpZgorCisgICAgaWYgKGdvdF9pbnQpCisJcmV0dXJuIEN0cmxfQzsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyoKKyAgICAgKiBJbiBHVUkgdGhlcmUgaXMgbm8gcG9pbnQgaW5zZXJ0aW5nIHRoZSBpbnRlcm5hbCBjb2RlIGZvciBhIHNwZWNpYWwga2V5LgorICAgICAqIEl0IGlzIG1vcmUgdXNlZnVsIHRvIGluc2VydCB0aGUgc3RyaW5nICI8S0VZPiIgaW5zdGVhZC4JVGhpcyB3b3VsZAorICAgICAqIHByb2JhYmx5IGJlIHVzZWZ1bCBpbiBhIHRleHQgd2luZG93IHRvbywgYnV0IGl0IHdvdWxkIG5vdCBiZQorICAgICAqIHZpLWNvbXBhdGlibGUgKG1heWJlIHRoZXJlIHNob3VsZCBiZSBhbiBvcHRpb24gZm9yIGl0PykgLS0gd2ViYgorICAgICAqLworICAgIGlmIChndWkuaW5fdXNlKQorCSsrYWxsb3dfa2V5czsKKyNlbmRpZgorI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisgICAgZG9udF9zY3JvbGwgPSBUUlVFOwkJLyogZGlzYWxsb3cgc2Nyb2xsaW5nIGhlcmUgKi8KKyNlbmRpZgorICAgICsrbm9fbWFwcGluZzsJCS8qIGRvbid0IG1hcCB0aGUgbmV4dCBrZXkgaGl0cyAqLworICAgIGNjID0gMDsKKyAgICBpID0gMDsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlkbworCSAgICBuYyA9IHNhZmVfdmdldGMoKTsKKwl3aGlsZSAobmMgPT0gS19JR05PUkUgfHwgbmMgPT0gS19WRVJfU0NST0xMQkFSCisJCQkJCQkgICAgfHwgbmMgPT0gS19IT1JfU0NST0xMQkFSKTsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCWlmICghKFN0YXRlICYgQ01ETElORSkKKyMgaWZkZWYgRkVBVF9NQllURQorCQkmJiBNQl9CWVRFMkxFTl9DSEVDSyhuYykgPT0gMQorIyBlbmRpZgorCSAgICkKKwkgICAgYWRkX3RvX3Nob3djbWQobmMpOworI2VuZGlmCisJaWYgKG5jID09ICd4JyB8fCBuYyA9PSAnWCcpCisJICAgIGhleCA9IFRSVUU7CisJZWxzZSBpZiAobmMgPT0gJ28nIHx8IG5jID09ICdPJykKKwkgICAgb2N0YWwgPSBUUlVFOworI2lmZGVmIEZFQVRfTUJZVEUKKwllbHNlIGlmIChuYyA9PSAndScgfHwgbmMgPT0gJ1UnKQorCSAgICB1bmljb2RlID0gbmM7CisjZW5kaWYKKwllbHNlCisJeworCSAgICBpZiAoaGV4CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgfHwgdW5pY29kZSAhPSAwCisjZW5kaWYKKwkJICAgICkKKwkgICAgeworCQlpZiAoIXZpbV9pc3hkaWdpdChuYykpCisJCSAgICBicmVhazsKKwkJY2MgPSBjYyAqIDE2ICsgaGV4Mm5yKG5jKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChvY3RhbCkKKwkgICAgeworCQlpZiAobmMgPCAnMCcgfHwgbmMgPiAnNycpCisJCSAgICBicmVhazsKKwkJY2MgPSBjYyAqIDggKyBuYyAtICcwJzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKCFWSU1fSVNESUdJVChuYykpCisJCSAgICBicmVhazsKKwkJY2MgPSBjYyAqIDEwICsgbmMgLSAnMCc7CisJICAgIH0KKworCSAgICArK2k7CisJfQorCisJaWYgKGNjID4gMjU1CisjaWZkZWYgRkVBVF9NQllURQorCQkmJiB1bmljb2RlID09IDAKKyNlbmRpZgorCQkpCisJICAgIGNjID0gMjU1OwkJLyogbGltaXQgcmFuZ2UgdG8gMC0yNTUgKi8KKwluYyA9IDA7CisKKwlpZiAoaGV4KQkJLyogaGV4OiB1cCB0byB0d28gY2hhcnMgKi8KKwl7CisJICAgIGlmIChpID49IDIpCisJCWJyZWFrOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJZWxzZSBpZiAodW5pY29kZSkJLyogVW5pY29kZTogdXAgdG8gZm91ciBvciBlaWdodCBjaGFycyAqLworCXsKKwkgICAgaWYgKCh1bmljb2RlID09ICd1JyAmJiBpID49IDQpIHx8ICh1bmljb2RlID09ICdVJyAmJiBpID49IDgpKQorCQlicmVhazsKKwl9CisjZW5kaWYKKwllbHNlIGlmIChpID49IDMpCS8qIGRlY2ltYWwgb3Igb2N0YWw6IHVwIHRvIHRocmVlIGNoYXJzICovCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSAwKQkgICAgLyogbm8gbnVtYmVyIGVudGVyZWQgKi8KKyAgICB7CisJaWYgKG5jID09IEtfWkVSTykgICAvKiBOVUwgaXMgc3RvcmVkIGFzIE5MICovCisJeworCSAgICBjYyA9ICdcbic7CisJICAgIG5jID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgY2MgPSBuYzsKKwkgICAgbmMgPSAwOworCX0KKyAgICB9CisKKyAgICBpZiAoY2MgPT0gMCkJLyogTlVMIGlzIHN0b3JlZCBhcyBOTCAqLworCWNjID0gJ1xuJzsKKworICAgIC0tbm9fbWFwcGluZzsKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCS0tYWxsb3dfa2V5czsKKyNlbmRpZgorICAgIGlmIChuYykKKwl2dW5nZXRjKG5jKTsKKyAgICBnb3RfaW50ID0gRkFMU0U7CSAgICAvKiBDVFJMLUMgdHlwZWQgYWZ0ZXIgQ1RSTC1WIGlzIG5vdCBhbiBpbnRlcnJ1cHQgKi8KKyAgICByZXR1cm4gY2M7Cit9CisKKy8qCisgKiBJbnNlcnQgY2hhcmFjdGVyLCB0YWtpbmcgY2FyZSBvZiBzcGVjaWFsIGtleXMgYW5kIG1vZF9tYXNrCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zZXJ0X3NwZWNpYWwoYywgYWxsb3dfbW9kbWFzaywgY3RybHYpCisgICAgaW50CSAgICBjOworICAgIGludAkgICAgYWxsb3dfbW9kbWFzazsKKyAgICBpbnQJICAgIGN0cmx2OwkgICAgLyogYyB3YXMgdHlwZWQgYWZ0ZXIgQ1RSTC1WICovCit7CisgICAgY2hhcl91ICAqcDsKKyAgICBpbnQJICAgIGxlbjsKKworICAgIC8qCisgICAgICogU3BlY2lhbCBmdW5jdGlvbiBrZXksIHRyYW5zbGF0ZSBpbnRvICI8S2V5PiIuIFVwIHRvIHRoZSBsYXN0ICc+JyBpcworICAgICAqIGluc2VydGVkIHdpdGggaW5zX3N0cigpLCBzbyBhcyBub3QgdG8gcmVwbGFjZSBjaGFyYWN0ZXJzIGluIHJlcGxhY2UKKyAgICAgKiBtb2RlLgorICAgICAqIE9ubHkgdXNlIG1vZF9tYXNrIGZvciBzcGVjaWFsIGtleXMsIHRvIGF2b2lkIHRoaW5ncyBsaWtlIDxTLVNwYWNlPiwKKyAgICAgKiB1bmxlc3MgJ2FsbG93X21vZG1hc2snIGlzIFRSVUUuCisgICAgICovCisjaWZkZWYgTUFDT1MKKyAgICAvKiBDb21tYW5kLWtleSBuZXZlciBwcm9kdWNlcyBhIG5vcm1hbCBrZXkgKi8KKyAgICBpZiAobW9kX21hc2sgJiBNT0RfTUFTS19DTUQpCisJYWxsb3dfbW9kbWFzayA9IFRSVUU7CisjZW5kaWYKKyAgICBpZiAoSVNfU1BFQ0lBTChjKSB8fCAobW9kX21hc2sgJiYgYWxsb3dfbW9kbWFzaykpCisgICAgeworCXAgPSBnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RfbWFzayk7CisJbGVuID0gKGludClTVFJMRU4ocCk7CisJYyA9IHBbbGVuIC0gMV07CisJaWYgKGxlbiA+IDIpCisJeworCSAgICBpZiAoc3RvcF9hcnJvdygpID09IEZBSUwpCisJCXJldHVybjsKKwkgICAgcFtsZW4gLSAxXSA9IE5VTDsKKwkgICAgaW5zX3N0cihwKTsKKwkgICAgQXBwZW5kVG9SZWRvYnVmZkxpdChwKTsKKwkgICAgY3RybHYgPSBGQUxTRTsKKwl9CisgICAgfQorICAgIGlmIChzdG9wX2Fycm93KCkgPT0gT0spCisJaW5zZXJ0Y2hhcihjLCBjdHJsdiA/IElOU0NIQVJfQ1RSTFYgOiAwLCAtMSk7Cit9CisKKy8qCisgKiBTcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhpcyBjb250ZXh0IGFyZSB0aG9zZSB0aGF0IG5lZWQgcHJvY2Vzc2luZyBvdGhlcgorICogdGhhbiB0aGUgc2ltcGxlIGluc2VydGlvbiB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgaGVyZS4gVGhpcyBpbmNsdWRlcyBFU0MKKyAqIHdoaWNoIHRlcm1pbmF0ZXMgdGhlIGluc2VydCwgYW5kIENSL05MIHdoaWNoIG5lZWQgc3BlY2lhbCBwcm9jZXNzaW5nIHRvCisgKiBvcGVuIHVwIGEgbmV3IGxpbmUuIFRoaXMgcm91dGluZSB0cmllcyB0byBvcHRpbWl6ZSBpbnNlcnRpb25zIHBlcmZvcm1lZCBieQorICogdGhlICJyZWRvIiwgInVuZG8iIG9yICJwdXQiIGNvbW1hbmRzLCBzbyBpdCBuZWVkcyB0byBrbm93IHdoZW4gaXQgc2hvdWxkCisgKiBzdG9wIGFuZCBkZWZlciBwcm9jZXNzaW5nIHRvIHRoZSAibm9ybWFsIiBtZWNoYW5pc20uCisgKiAnMCcgYW5kICdeJyBhcmUgc3BlY2lhbCwgYmVjYXVzZSB0aGV5IGNhbiBiZSBmb2xsb3dlZCBieSBDVFJMLUQuCisgKi8KKyNpZmRlZiBFQkNESUMKKyMgZGVmaW5lIElTU1BFQ0lBTChjKQkoKGMpIDwgJyAnIHx8IChjKSA9PSAnMCcgfHwgKGMpID09ICdeJykKKyNlbHNlCisjIGRlZmluZSBJU1NQRUNJQUwoYykJKChjKSA8ICcgJyB8fCAoYykgPj0gREVMIHx8IChjKSA9PSAnMCcgfHwgKGMpID09ICdeJykKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorIyBkZWZpbmUgV0hJVEVDSEFSKGNjKSAodmltX2lzd2hpdGUoY2MpICYmICghZW5jX3V0ZjggfHwgIXV0Zl9pc2NvbXBvc2luZyh1dGZfcHRyMmNoYXIobWxfZ2V0X2N1cnNvcigpICsgMSkpKSkKKyNlbHNlCisjIGRlZmluZSBXSElURUNIQVIoY2MpIHZpbV9pc3doaXRlKGNjKQorI2VuZGlmCisKKyAgICB2b2lkCitpbnNlcnRjaGFyKGMsIGZsYWdzLCBzZWNvbmRfaW5kZW50KQorICAgIGludAkJYzsJCQkvKiBjaGFyYWN0ZXIgdG8gaW5zZXJ0IG9yIE5VTCAqLworICAgIGludAkJZmxhZ3M7CQkJLyogSU5TQ0hBUl9GT1JNQVQsIGV0Yy4gKi8KKyAgICBpbnQJCXNlY29uZF9pbmRlbnQ7CQkvKiBpbmRlbnQgZm9yIHNlY29uZCBsaW5lIGlmID49IDAgKi8KK3sKKyAgICBpbnQJCWhhdmV0b19yZWRyYXcgPSBGQUxTRTsKKyAgICBpbnQJCXRleHR3aWR0aDsKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgY29sbnJfVAlsZWFkZXJfbGVuOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCW5vX2xlYWRlciA9IEZBTFNFOworICAgIGludAkJZG9fY29tbWVudHMgPSAoZmxhZ3MgJiBJTlNDSEFSX0RPX0NPTSk7CisjZW5kaWYKKyAgICBpbnQJCWZvX3doaXRlX3BhcjsKKyAgICBpbnQJCWZpcnN0X2xpbmUgPSBUUlVFOworICAgIGludAkJZm9faW5zX2JsYW5rOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWZvX211bHRpYnl0ZTsKKyNlbmRpZgorICAgIGludAkJc2F2ZV9jaGFyID0gTlVMOworICAgIGludAkJY2M7CisKKyAgICB0ZXh0d2lkdGggPSBjb21wX3RleHR3aWR0aChmbGFncyAmIElOU0NIQVJfRk9STUFUKTsKKyAgICBmb19pbnNfYmxhbmsgPSBoYXNfZm9ybWF0X29wdGlvbihGT19JTlNfQkxBTkspOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBmb19tdWx0aWJ5dGUgPSBoYXNfZm9ybWF0X29wdGlvbihGT19NQllURV9CUkVBSyk7CisjZW5kaWYKKyAgICBmb193aGl0ZV9wYXIgPSBoYXNfZm9ybWF0X29wdGlvbihGT19XSElURV9QQVIpOworCisgICAgLyoKKyAgICAgKiBUcnkgdG8gYnJlYWsgdGhlIGxpbmUgaW4gdHdvIG9yIG1vcmUgcGllY2VzIHdoZW46CisgICAgICogLSBBbHdheXMgZG8gdGhpcyBpZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIHRvIGRvIGZvcm1hdHRpbmcgb25seS4KKyAgICAgKiAtIEFsd2F5cyBkbyB0aGlzIHdoZW4gJ2Zvcm1hdG9wdGlvbnMnIGhhcyB0aGUgJ2EnIGZsYWcgYW5kIHRoZSBsaW5lCisgICAgICogICBlbmRzIGluIHdoaXRlIHNwYWNlLgorICAgICAqIC0gT3RoZXJ3aXNlOgorICAgICAqCSAtIERvbid0IGRvIHRoaXMgaWYgaW5zZXJ0aW5nIGEgYmxhbmsKKyAgICAgKgkgLSBEb24ndCBkbyB0aGlzIGlmIGFuIGV4aXN0aW5nIGNoYXJhY3RlciBpcyBiZWluZyByZXBsYWNlZCwgdW5sZXNzCisgICAgICoJICAgd2UncmUgaW4gVlJFUExBQ0UgbW9kZS4KKyAgICAgKgkgLSBEbyB0aGlzIGlmIHRoZSBjdXJzb3IgaXMgbm90IG9uIHRoZSBsaW5lIHdoZXJlIGluc2VydCBzdGFydGVkCisgICAgICoJIG9yIC0gJ2Zvcm1hdG9wdGlvbnMnIGRvZXNuJ3QgaGF2ZSAnbCcgb3IgdGhlIGxpbmUgd2FzIG5vdCB0b28gbG9uZworICAgICAqCSAgICAgICBiZWZvcmUgdGhlIGluc2VydC4KKyAgICAgKgkgICAgLSAnZm9ybWF0b3B0aW9ucycgZG9lc24ndCBoYXZlICdiJyBvciBhIGJsYW5rIHdhcyBpbnNlcnRlZCBhdCBvcgorICAgICAqCSAgICAgIGJlZm9yZSAndGV4dHdpZHRoJworICAgICAqLworICAgIGlmICh0ZXh0d2lkdGgKKwkgICAgJiYgKChmbGFncyAmIElOU0NIQVJfRk9STUFUKQorCQl8fCAoIXZpbV9pc3doaXRlKGMpCisJCSAgICAmJiAhKChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJCQkmJiAhKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKyNlbmRpZgorCQkJJiYgKm1sX2dldF9jdXJzb3IoKSAhPSBOVUwpCisJCSAgICAmJiAoY3Vyd2luLT53X2N1cnNvci5sbnVtICE9IEluc3N0YXJ0LmxudW0KKwkJCXx8ICgoIWhhc19mb3JtYXRfb3B0aW9uKEZPX0lOU19MT05HKQorCQkJCXx8IEluc3N0YXJ0X3RleHRsZW4gPD0gKGNvbG5yX1QpdGV4dHdpZHRoKQorCQkJICAgICYmICghZm9faW5zX2JsYW5rCisJCQkJfHwgSW5zc3RhcnRfYmxhbmtfdmNvbCA8PSAoY29sbnJfVCl0ZXh0d2lkdGgKKwkJCSAgICApKSkpKSkKKyAgICB7CisJLyoKKwkgKiBXaGVuICdhaScgaXMgb2ZmIHdlIGRvbid0IHdhbnQgYSBzcGFjZSB1bmRlciB0aGUgY3Vyc29yIHRvIGJlCisJICogZGVsZXRlZC4gIFJlcGxhY2UgaXQgd2l0aCBhbiAneCcgdGVtcG9yYXJpbHkuCisJICovCisJaWYgKCFjdXJidWYtPmJfcF9haSkKKwl7CisJICAgIGNjID0gZ2NoYXJfY3Vyc29yKCk7CisJICAgIGlmICh2aW1faXN3aGl0ZShjYykpCisJICAgIHsKKwkJc2F2ZV9jaGFyID0gY2M7CisJCXBjaGFyX2N1cnNvcigneCcpOworCSAgICB9CisJfQorCisJLyoKKwkgKiBSZXBlYXQgYnJlYWtpbmcgbGluZXMsIHVudGlsIHRoZSBjdXJyZW50IGxpbmUgaXMgbm90IHRvbyBsb25nLgorCSAqLworCXdoaWxlICghZ290X2ludCkKKwl7CisJICAgIGludAkJc3RhcnRjb2w7CQkvKiBDdXJzb3IgY29sdW1uIGF0IGVudHJ5ICovCisJICAgIGludAkJd2FudGNvbDsJCS8qIGNvbHVtbiBhdCB0ZXh0d2lkdGggYm9yZGVyICovCisJICAgIGludAkJZm91bmRjb2w7CQkvKiBjb2x1bW4gZm9yIHN0YXJ0IG9mIHNwYWNlcyAqLworCSAgICBpbnQJCWVuZF9mb3VuZGNvbCA9IDA7CS8qIGNvbHVtbiBmb3Igc3RhcnQgb2Ygd29yZCAqLworCSAgICBjb2xucl9UCWxlbjsKKwkgICAgY29sbnJfVAl2aXJ0Y29sOworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwkgICAgaW50CQlvcmlnX2NvbCA9IDA7CisJICAgIGNoYXJfdQkqc2F2ZWRfdGV4dCA9IE5VTEw7CisjZW5kaWYKKwkgICAgY29sbnJfVAljb2w7CisKKwkgICAgdmlydGNvbCA9IGdldF9ub2xpc3RfdmlydGNvbCgpOworCSAgICBpZiAodmlydGNvbCA8IChjb2xucl9UKXRleHR3aWR0aCkKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJICAgIGlmIChub19sZWFkZXIpCisJCWRvX2NvbW1lbnRzID0gRkFMU0U7CisJICAgIGVsc2UgaWYgKCEoZmxhZ3MgJiBJTlNDSEFSX0ZPUk1BVCkKKwkJCQkJICAgJiYgaGFzX2Zvcm1hdF9vcHRpb24oRk9fV1JBUF9DT01TKSkKKwkJZG9fY29tbWVudHMgPSBUUlVFOworCisJICAgIC8qIERvbid0IGJyZWFrIHVudGlsIGFmdGVyIHRoZSBjb21tZW50IGxlYWRlciAqLworCSAgICBpZiAoZG9fY29tbWVudHMpCisJCWxlYWRlcl9sZW4gPSBnZXRfbGVhZGVyX2xlbihtbF9nZXRfY3VybGluZSgpLCBOVUxMLCBGQUxTRSk7CisJICAgIGVsc2UKKwkJbGVhZGVyX2xlbiA9IDA7CisKKwkgICAgLyogSWYgdGhlIGxpbmUgZG9lc24ndCBzdGFydCB3aXRoIGEgY29tbWVudCBsZWFkZXIsIHRoZW4gZG9uJ3QKKwkgICAgICogc3RhcnQgb25lIGluIGEgZm9sbG93aW5nIGJyb2tlbiBsaW5lLiAgQXZvaWRzIHRoYXQgYSAld29yZAorCSAgICAgKiBtb3ZlZCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZSBjYXVzZXMgYWxsIGZvbGxvd2luZyBsaW5lcworCSAgICAgKiB0byBzdGFydCB3aXRoICUuICovCisJICAgIGlmIChsZWFkZXJfbGVuID09IDApCisJCW5vX2xlYWRlciA9IFRSVUU7CisjZW5kaWYKKwkgICAgaWYgKCEoZmxhZ3MgJiBJTlNDSEFSX0ZPUk1BVCkKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCSAgICAmJiBsZWFkZXJfbGVuID09IDAKKyNlbmRpZgorCQkgICAgJiYgIWhhc19mb3JtYXRfb3B0aW9uKEZPX1dSQVApKQorCisJICAgIHsKKwkJdGV4dHdpZHRoID0gMDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKChzdGFydGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sKSA9PSAwKQorCQlicmVhazsKKworCSAgICAvKiBmaW5kIGNvbHVtbiBvZiB0ZXh0d2lkdGggYm9yZGVyICovCisJICAgIGNvbGFkdmFuY2UoKGNvbG5yX1QpdGV4dHdpZHRoKTsKKwkgICAgd2FudGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gc3RhcnRjb2wgLSAxOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgLyogQ29ycmVjdCBjdXJzb3IgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLworCSAgICBpZiAoaGFzX21ieXRlKQorCQltYl9hZGp1c3RfY3Vyc29yKCk7CisjZW5kaWYKKwkgICAgZm91bmRjb2wgPSAwOworCisJICAgIC8qCisJICAgICAqIEZpbmQgcG9zaXRpb24gdG8gYnJlYWsgYXQuCisJICAgICAqIFN0b3AgYXQgZmlyc3QgZW50ZXJlZCB3aGl0ZSB3aGVuICdmb3JtYXRvcHRpb25zJyBoYXMgJ3YnCisJICAgICAqLworCSAgICB3aGlsZSAoKCFmb19pbnNfYmxhbmsgJiYgIWhhc19mb3JtYXRfb3B0aW9uKEZPX0lOU19WSSkpCisJCQl8fCBjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gSW5zc3RhcnQubG51bQorCQkJfHwgY3Vyd2luLT53X2N1cnNvci5jb2wgPj0gSW5zc3RhcnQuY29sKQorCSAgICB7CisJCWNjID0gZ2NoYXJfY3Vyc29yKCk7CisJCWlmIChXSElURUNIQVIoY2MpKQorCQl7CisJCSAgICAvKiByZW1lbWJlciBwb3NpdGlvbiBvZiBibGFuayBqdXN0IGJlZm9yZSB0ZXh0ICovCisJCSAgICBlbmRfZm91bmRjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworCQkgICAgLyogZmluZCBzdGFydCBvZiBzZXF1ZW5jZSBvZiBibGFua3MgKi8KKwkJICAgIHdoaWxlIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAgJiYgV0hJVEVDSEFSKGNjKSkKKwkJICAgIHsKKwkJCWRlY19jdXJzb3IoKTsKKwkJCWNjID0gZ2NoYXJfY3Vyc29yKCk7CisJCSAgICB9CisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCAmJiBXSElURUNIQVIoY2MpKQorCQkJYnJlYWs7CQkvKiBvbmx5IHNwYWNlcyBpbiBmcm9udCBvZiB0ZXh0ICovCisjaWZkZWYgRkVBVF9DT01NRU5UUworCQkgICAgLyogRG9uJ3QgYnJlYWsgdW50aWwgYWZ0ZXIgdGhlIGNvbW1lbnQgbGVhZGVyICovCisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPCBsZWFkZXJfbGVuKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJICAgIGlmIChoYXNfZm9ybWF0X29wdGlvbihGT19PTkVfTEVUVEVSKSkKKwkJICAgIHsKKwkJCS8qIGRvIG5vdCBicmVhayBhZnRlciBvbmUtbGV0dGVyIHdvcmRzICovCisJCQlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCkKKwkJCSAgICBicmVhazsJLyogb25lLWxldHRlciB3b3JkIGF0IGJlZ2luICovCisKKwkJCWNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCQkJZGVjX2N1cnNvcigpOworCQkJY2MgPSBnY2hhcl9jdXJzb3IoKTsKKworCQkJaWYgKFdISVRFQ0hBUihjYykpCisJCQkgICAgY29udGludWU7CS8qIG9uZS1sZXR0ZXIsIGNvbnRpbnVlICovCisJCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbDsKKwkJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJZm91bmRjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbAorCQkJCSAgICAgICArICgqbWJfcHRyMmxlbl9jaGVjaykobWxfZ2V0X2N1cnNvcigpKTsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJZm91bmRjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCArIDE7CisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPCAoY29sbnJfVCl3YW50Y29sKQorCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJCWVsc2UgaWYgKGNjID49IDB4MTAwICYmIGZvX211bHRpYnl0ZQorCQkJCSAgJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPD0gKGNvbG5yX1Qpd2FudGNvbCkKKwkJeworCQkgICAgLyogQnJlYWsgYWZ0ZXIgb3IgYmVmb3JlIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICovCisJCSAgICBmb3VuZGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCQkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sIDwgKGNvbG5yX1Qpd2FudGNvbCkKKwkJCWZvdW5kY29sICs9ICgqbWJfY2hhcjJsZW4pKGNjKTsKKwkJICAgIGVuZF9mb3VuZGNvbCA9IGZvdW5kY29sOworCQkgICAgYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCkKKwkJICAgIGJyZWFrOworCQlkZWNfY3Vyc29yKCk7CisJICAgIH0KKworCSAgICBpZiAoZm91bmRjb2wgPT0gMCkJCS8qIG5vIHNwYWNlcywgY2Fubm90IGJyZWFrIGxpbmUgKi8KKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHN0YXJ0Y29sOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIEdvaW5nIHRvIGJyZWFrIHRoZSBsaW5lLCByZW1vdmUgYW55ICIkIiBub3cuICovCisJICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKworCSAgICAvKgorCSAgICAgKiBPZmZzZXQgYmV0d2VlbiBjdXJzb3IgcG9zaXRpb24gYW5kIGxpbmUgYnJlYWsgaXMgdXNlZCBieSByZXBsYWNlCisJICAgICAqIHN0YWNrIGZ1bmN0aW9ucy4gIFZSRVBMQUNFIGRvZXMgbm90IHVzZSB0aGlzLCBhbmQgYmFja3NwYWNlcworCSAgICAgKiBvdmVyIHRoZSB0ZXh0IGluc3RlYWQuCisJICAgICAqLworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwkgICAgaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwkJb3JpZ19jb2wgPSBzdGFydGNvbDsJLyogV2lsbCBzdGFydCBiYWNrc3BhY2luZyBmcm9tIGhlcmUgKi8KKwkgICAgZWxzZQorI2VuZGlmCisJCXJlcGxhY2Vfb2Zmc2V0ID0gc3RhcnRjb2wgLSBlbmRfZm91bmRjb2wgLSAxOworCisJICAgIC8qCisJICAgICAqIGFkanVzdCBzdGFydGNvbCBmb3Igc3BhY2VzIHRoYXQgd2lsbCBiZSBkZWxldGVkIGFuZAorCSAgICAgKiBjaGFyYWN0ZXJzIHRoYXQgd2lsbCByZW1haW4gb24gdG9wIGxpbmUKKwkgICAgICovCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gZm91bmRjb2w7CisJICAgIHdoaWxlIChjYyA9IGdjaGFyX2N1cnNvcigpLCBXSElURUNIQVIoY2MpKQorCQlpbmNfY3Vyc29yKCk7CisJICAgIHN0YXJ0Y29sIC09IGN1cndpbi0+d19jdXJzb3IuY29sOworCSAgICBpZiAoc3RhcnRjb2wgPCAwKQorCQlzdGFydGNvbCA9IDA7CisKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJICAgIHsKKwkJLyoKKwkJICogSW4gVlJFUExBQ0UgbW9kZSwgd2Ugd2lsbCBiYWNrc3BhY2Ugb3ZlciB0aGUgdGV4dCB0byBiZQorCQkgKiB3cmFwcGVkLCBzbyBzYXZlIGEgY29weSBub3cgdG8gcHV0IG9uIHRoZSBuZXh0IGxpbmUuCisJCSAqLworCQlzYXZlZF90ZXh0ID0gdmltX3N0cnNhdmUobWxfZ2V0X2N1cnNvcigpKTsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBvcmlnX2NvbDsKKwkJaWYgKHNhdmVkX3RleHQgPT0gTlVMTCkKKwkJICAgIGJyZWFrOwkvKiBDYW4ndCBkbyBpdCwgb3V0IG9mIG1lbW9yeSAqLworCQlzYXZlZF90ZXh0W3N0YXJ0Y29sXSA9IE5VTDsKKworCQkvKiBCYWNrc3BhY2Ugb3ZlciBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKwkJaWYgKCFmb193aGl0ZV9wYXIpCisJCSAgICBiYWNrc3BhY2VfdW50aWxfY29sdW1uKGZvdW5kY29sKTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQkvKiBwdXQgY3Vyc29yIGFmdGVyIHBvcy4gdG8gYnJlYWsgbGluZSAqLworCQlpZiAoIWZvX3doaXRlX3BhcikKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gZm91bmRjb2w7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBTcGxpdCB0aGUgbGluZSBqdXN0IGJlZm9yZSB0aGUgbWFyZ2luLgorCSAgICAgKiBPbmx5IGluc2VydC9kZWxldGUgbGluZXMsIGJ1dCBkb24ndCByZWFsbHkgcmVkcmF3IHRoZSB3aW5kb3cuCisJICAgICAqLworCSAgICBvcGVuX2xpbmUoRk9SV0FSRCwgT1BFTkxJTkVfREVMU1BBQ0VTICsgT1BFTkxJTkVfTUFSS0ZJWAorCQkgICAgKyAoZm9fd2hpdGVfcGFyID8gT1BFTkxJTkVfS0VFUFRSQUlMIDogMCkKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCSAgICArIChkb19jb21tZW50cyA/IE9QRU5MSU5FX0RPX0NPTSA6IDApCisjZW5kaWYKKwkJICAgICwgb2xkX2luZGVudCk7CisJICAgIG9sZF9pbmRlbnQgPSAwOworCisJICAgIHJlcGxhY2Vfb2Zmc2V0ID0gMDsKKwkgICAgaWYgKGZpcnN0X2xpbmUpCisJICAgIHsKKwkJaWYgKHNlY29uZF9pbmRlbnQgPCAwICYmIGhhc19mb3JtYXRfb3B0aW9uKEZPX1FfTlVNQkVSKSkKKwkJICAgIHNlY29uZF9pbmRlbnQgPSBnZXRfbnVtYmVyX2luZGVudChjdXJ3aW4tPndfY3Vyc29yLmxudW0gLTEpOworCQlpZiAoc2Vjb25kX2luZGVudCA+PSAwKQorCQl7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCQkgICAgaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwkJCWNoYW5nZV9pbmRlbnQoSU5ERU5UX1NFVCwgc2Vjb25kX2luZGVudCwgRkFMU0UsIE5VTCk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSh2b2lkKXNldF9pbmRlbnQoc2Vjb25kX2luZGVudCwgU0lOX0NIQU5HRUQpOworCQl9CisJCWZpcnN0X2xpbmUgPSBGQUxTRTsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCSAgICB7CisJCS8qCisJCSAqIEluIFZSRVBMQUNFIG1vZGUgd2UgaGF2ZSBiYWNrc3BhY2VkIG92ZXIgdGhlIHRleHQgdG8gYmUKKwkJICogbW92ZWQsIG5vdyB3ZSByZS1pbnNlcnQgaXQgaW50byB0aGUgbmV3IGxpbmUuCisJCSAqLworCQlpbnNfYnl0ZXMoc2F2ZWRfdGV4dCk7CisJCXZpbV9mcmVlKHNhdmVkX3RleHQpOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCS8qCisJCSAqIENoZWNrIGlmIGN1cnNvciBpcyBub3QgcGFzdCB0aGUgTlVMIG9mZiB0aGUgbGluZSwgY2luZGVudAorCQkgKiBtYXkgaGF2ZSBhZGRlZCBvciByZW1vdmVkIGluZGVudC4KKwkJICovCisJCWN1cndpbi0+d19jdXJzb3IuY29sICs9IHN0YXJ0Y29sOworCQlsZW4gPSAoY29sbnJfVClTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSk7CisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IGxlbikKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gbGVuOworCSAgICB9CisKKwkgICAgaGF2ZXRvX3JlZHJhdyA9IFRSVUU7CisjaWZkZWYgRkVBVF9DSU5ERU5UCisJICAgIGNhbl9jaW5kZW50ID0gVFJVRTsKKyNlbmRpZgorCSAgICAvKiBtb3ZlZCB0aGUgY3Vyc29yLCBkb24ndCBhdXRvaW5kZW50IG9yIGNpbmRlbnQgbm93ICovCisJICAgIGRpZF9haSA9IEZBTFNFOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkgICAgZGlkX3NpID0gRkFMU0U7CisJICAgIGNhbl9zaSA9IEZBTFNFOworCSAgICBjYW5fc2lfYmFjayA9IEZBTFNFOworI2VuZGlmCisJICAgIGxpbmVfYnJlYWtjaGVjaygpOworCX0KKworCWlmIChzYXZlX2NoYXIpCQkJLyogcHV0IGJhY2sgc3BhY2UgYWZ0ZXIgY3Vyc29yICovCisJICAgIHBjaGFyX2N1cnNvcihzYXZlX2NoYXIpOworCisJaWYgKGMgPT0gTlVMKQkJCS8qIGZvcm1hdHRpbmcgb25seSAqLworCSAgICByZXR1cm47CisJaWYgKGhhdmV0b19yZWRyYXcpCisJeworCSAgICB1cGRhdGVfdG9wbGluZSgpOworCSAgICByZWRyYXdfY3VyYnVmX2xhdGVyKFZBTElEKTsKKwl9CisgICAgfQorICAgIGlmIChjID09IE5VTCkJICAgIC8qIG9ubHkgZm9ybWF0dGluZyB3YXMgd2FudGVkICovCisJcmV0dXJuOworCisjaWZkZWYgRkVBVF9DT01NRU5UUworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBjaGFyYWN0ZXIgc2hvdWxkIGVuZCBhIGNvbW1lbnQuICovCisgICAgaWYgKGRpZF9haSAmJiAoaW50KWMgPT0gZW5kX2NvbW1lbnRfcGVuZGluZykKKyAgICB7CisJY2hhcl91ICAqbGluZTsKKwljaGFyX3UJbGVhZF9lbmRbQ09NX01BWF9MRU5dOwkgICAgLyogZW5kLWNvbW1lbnQgc3RyaW5nICovCisJaW50CW1pZGRsZV9sZW4sIGVuZF9sZW47CisJaW50CWk7CisKKwkvKgorCSAqIE5lZWQgdG8gcmVtb3ZlIGV4aXN0aW5nIChtaWRkbGUpIGNvbW1lbnQgbGVhZGVyIGFuZCBpbnNlcnQgZW5kCisJICogY29tbWVudCBsZWFkZXIuICBGaXJzdCwgY2hlY2sgd2hhdCBjb21tZW50IGxlYWRlciB3ZSBjYW4gZmluZC4KKwkgKi8KKwlpID0gZ2V0X2xlYWRlcl9sZW4obGluZSA9IG1sX2dldF9jdXJsaW5lKCksICZwLCBGQUxTRSk7CisJaWYgKGkgPiAwICYmIHZpbV9zdHJjaHIocCwgQ09NX01JRERMRSkgIT0gTlVMTCkJLyogSnVzdCBjaGVja2luZyAqLworCXsKKwkgICAgLyogU2tpcCBtaWRkbGUtY29tbWVudCBzdHJpbmcgKi8KKwkgICAgd2hpbGUgKCpwICYmIHBbLTFdICE9ICc6JykJLyogZmluZCBlbmQgb2YgbWlkZGxlIGZsYWdzICovCisJCSsrcDsKKwkgICAgbWlkZGxlX2xlbiA9IGNvcHlfb3B0aW9uX3BhcnQoJnAsIGxlYWRfZW5kLCBDT01fTUFYX0xFTiwgIiwiKTsKKwkgICAgLyogRG9uJ3QgY291bnQgdHJhaWxpbmcgd2hpdGUgc3BhY2UgZm9yIG1pZGRsZV9sZW4gKi8KKwkgICAgd2hpbGUgKG1pZGRsZV9sZW4gPiAwICYmIHZpbV9pc3doaXRlKGxlYWRfZW5kW21pZGRsZV9sZW4gLSAxXSkpCisJCS0tbWlkZGxlX2xlbjsKKworCSAgICAvKiBGaW5kIHRoZSBlbmQtY29tbWVudCBzdHJpbmcgKi8KKwkgICAgd2hpbGUgKCpwICYmIHBbLTFdICE9ICc6JykJLyogZmluZCBlbmQgb2YgZW5kIGZsYWdzICovCisJCSsrcDsKKwkgICAgZW5kX2xlbiA9IGNvcHlfb3B0aW9uX3BhcnQoJnAsIGxlYWRfZW5kLCBDT01fTUFYX0xFTiwgIiwiKTsKKworCSAgICAvKiBTa2lwIHdoaXRlIHNwYWNlIGJlZm9yZSB0aGUgY3Vyc29yICovCisJICAgIGkgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgd2hpbGUgKC0taSA+PSAwICYmIHZpbV9pc3doaXRlKGxpbmVbaV0pKQorCQk7CisJICAgIGkrKzsKKworCSAgICAvKiBTa2lwIHRvIGJlZm9yZSB0aGUgbWlkZGxlIGxlYWRlciAqLworCSAgICBpIC09IG1pZGRsZV9sZW47CisKKwkgICAgLyogQ2hlY2sgc29tZSBleHBlY3RlZCB0aGluZ3MgYmVmb3JlIHdlIGdvIG9uICovCisJICAgIGlmIChpID49IDAgJiYgbGVhZF9lbmRbZW5kX2xlbiAtIDFdID09IGVuZF9jb21tZW50X3BlbmRpbmcpCisJICAgIHsKKwkJLyogQmFja3NwYWNlIG92ZXIgYWxsIHRoZSBzdHVmZiB3ZSB3YW50IHRvIHJlcGxhY2UgKi8KKwkJYmFja3NwYWNlX3VudGlsX2NvbHVtbihpKTsKKworCQkvKgorCQkgKiBJbnNlcnQgdGhlIGVuZC1jb21tZW50IHN0cmluZywgZXhjZXB0IGZvciB0aGUgbGFzdAorCQkgKiBjaGFyYWN0ZXIsIHdoaWNoIHdpbGwgZ2V0IGluc2VydGVkIGFzIG5vcm1hbCBsYXRlci4KKwkJICovCisJCWluc19ieXRlc19sZW4obGVhZF9lbmQsIGVuZF9sZW4gLSAxKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZW5kX2NvbW1lbnRfcGVuZGluZyA9IE5VTDsKKyNlbmRpZgorCisgICAgZGlkX2FpID0gRkFMU0U7CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorICAgIGRpZF9zaSA9IEZBTFNFOworICAgIGNhbl9zaSA9IEZBTFNFOworICAgIGNhbl9zaV9iYWNrID0gRkFMU0U7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgdGhlcmUncyBhbnkgcGVuZGluZyBpbnB1dCwgZ3JhYiB1cCB0byBJTlBVVF9CVUZMRU4gYXQgb25jZS4KKyAgICAgKiBUaGlzIHNwZWVkcyB1cCBub3JtYWwgdGV4dCBpbnB1dCBjb25zaWRlcmFibHkuCisgICAgICogRG9uJ3QgZG8gdGhpcyB3aGVuICdjaW5kZW50JyBvciAnaW5kZW50ZXhwcicgaXMgc2V0LCBiZWNhdXNlIHdlIG1pZ2h0CisgICAgICogbmVlZCB0byByZS1pbmRlbnQgYXQgYSAnOicsIG9yIGFueSBvdGhlciBjaGFyYWN0ZXIgKGJ1dCBub3Qgd2hhdAorICAgICAqICdwYXN0ZScgaXMgc2V0KS4uCisgICAgICovCisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKyAgICBkb250X3Njcm9sbCA9IEZBTFNFOwkJLyogYWxsb3cgc2Nyb2xsaW5nIGhlcmUgKi8KKyNlbmRpZgorCisgICAgaWYgKCAgICAgICAhSVNTUEVDSUFMKGMpCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAmJiAoIWhhc19tYnl0ZSB8fCAoKm1iX2NoYXIybGVuKShjKSA9PSAxKQorI2VuZGlmCisJICAgICYmIHZwZWVrYygpICE9IE5VTAorCSAgICAmJiAhKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorI2lmZGVmIEZFQVRfQ0lOREVOVAorCSAgICAmJiAhY2luZGVudF9vbigpCisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICAmJiAhcF9yaQorI2VuZGlmCisJICAgICAgICkKKyAgICB7CisjZGVmaW5lIElOUFVUX0JVRkxFTiAxMDAKKwljaGFyX3UJCWJ1ZltJTlBVVF9CVUZMRU4gKyAxXTsKKwlpbnQJCWk7CisJY29sbnJfVAkJdmlydGNvbCA9IDA7CisKKwlidWZbMF0gPSBjOworCWkgPSAxOworCWlmICh0ZXh0d2lkdGgpCisJICAgIHZpcnRjb2wgPSBnZXRfbm9saXN0X3ZpcnRjb2woKTsKKwkvKgorCSAqIFN0b3AgdGhlIHN0cmluZyB3aGVuOgorCSAqIC0gbm8gbW9yZSBjaGFycyBhdmFpbGFibGUKKwkgKiAtIGZpbmRpbmcgYSBzcGVjaWFsIGNoYXJhY3RlciAoY29tbWFuZCBrZXkpCisJICogLSBidWZmZXIgaXMgZnVsbAorCSAqIC0gcnVubmluZyBpbnRvIHRoZSAndGV4dHdpZHRoJyBib3VuZGFyeQorCSAqIC0gbmVlZCB0byBjaGVjayBmb3IgYWJicmV2aWF0aW9uOiBBIG5vbi13b3JkIGNoYXIgYWZ0ZXIgYSB3b3JkLWNoYXIKKwkgKi8KKwl3aGlsZSAoCSAgIChjID0gdnBlZWtjKCkpICE9IE5VTAorCQkmJiAhSVNTUEVDSUFMKGMpCisjaWZkZWYgRkVBVF9NQllURQorCQkmJiAoIWhhc19tYnl0ZSB8fCBNQl9CWVRFMkxFTl9DSEVDSyhjKSA9PSAxKQorI2VuZGlmCisJCSYmIGkgPCBJTlBVVF9CVUZMRU4KKwkJJiYgKHRleHR3aWR0aCA9PSAwCisJCSAgICB8fCAodmlydGNvbCArPSBieXRlMmNlbGxzKGJ1ZltpIC0gMV0pKSA8IChjb2xucl9UKXRleHR3aWR0aCkKKwkJJiYgISghbm9fYWJiciAmJiAhdmltX2lzd29yZGMoYykgJiYgdmltX2lzd29yZGMoYnVmW2kgLSAxXSkpKQorCXsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICBjID0gdmdldGMoKTsKKwkgICAgaWYgKHBfaGttYXAgJiYgS2V5VHlwZWQpCisJCWMgPSBoa21hcChjKTsJCSAgICAvKiBIZWJyZXcgbW9kZSBtYXBwaW5nICovCisjIGlmZGVmIEZFQVRfRktNQVAKKwkgICAgaWYgKHBfZmttYXAgJiYgS2V5VHlwZWQpCisJCWMgPSBma21hcChjKTsJCSAgICAvKiBGYXJzaSBtb2RlIG1hcHBpbmcgKi8KKyMgZW5kaWYKKwkgICAgYnVmW2krK10gPSBjOworI2Vsc2UKKwkgICAgYnVmW2krK10gPSB2Z2V0YygpOworI2VuZGlmCisJfQorCisjaWZkZWYgRkVBVF9ESUdSQVBIUworCWRvX2RpZ3JhcGgoLTEpOwkJCS8qIGNsZWFyIGRpZ3JhcGhzICovCisJZG9fZGlncmFwaChidWZbaS0xXSk7CQkvKiBtYXkgYmUgdGhlIHN0YXJ0IG9mIGEgZGlncmFwaCAqLworI2VuZGlmCisJYnVmW2ldID0gTlVMOworCWluc19zdHIoYnVmKTsKKwlpZiAoZmxhZ3MgJiBJTlNDSEFSX0NUUkxWKQorCXsKKwkgICAgcmVkb19saXRlcmFsKCpidWYpOworCSAgICBpID0gMTsKKwl9CisJZWxzZQorCSAgICBpID0gMDsKKwlpZiAoYnVmW2ldICE9IE5VTCkKKwkgICAgQXBwZW5kVG9SZWRvYnVmZkxpdChidWYgKyBpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSAmJiAoY2MgPSAoKm1iX2NoYXIybGVuKShjKSkgPiAxKQorCXsKKwkgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOworCisJICAgICgqbWJfY2hhcjJieXRlcykoYywgYnVmKTsKKwkgICAgYnVmW2NjXSA9IE5VTDsKKwkgICAgaW5zX2NoYXJfYnl0ZXMoYnVmLCBjYyk7CisJICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKGMpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGluc19jaGFyKGMpOworCSAgICBpZiAoZmxhZ3MgJiBJTlNDSEFSX0NUUkxWKQorCQlyZWRvX2xpdGVyYWwoYyk7CisJICAgIGVsc2UKKwkJQXBwZW5kQ2hhclRvUmVkb2J1ZmYoYyk7CisJfQorICAgIH0KK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBpbnNlcnRpbmcgb3IgZGVsZXRpbmcgdGV4dDogV2hlbiAnZm9ybWF0b3B0aW9ucycgaW5jbHVkZXMgdGhlCisgKiAnYScgZmxhZyBmb3JtYXQgZnJvbSB0aGUgY3VycmVudCBsaW5lIHVudGlsIHRoZSBlbmQgb2YgdGhlIHBhcmFncmFwaC4KKyAqIEtlZXAgdGhlIGN1cnNvciBhdCB0aGUgc2FtZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdGV4dC4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHNhdmVkIHRoZSBjdXJzb3IgbGluZSBmb3IgdW5kbywgZm9sbG93aW5nIG9uZXMgd2lsbCBiZQorICogc2F2ZWQgaGVyZS4KKyAqLworICAgIHZvaWQKK2F1dG9fZm9ybWF0KHRyYWlsYmxhbmssIHByZXZfbGluZSkKKyAgICBpbnQJCXRyYWlsYmxhbms7CS8qIHdoZW4gVFJVRSBhbHNvIGZvcm1hdCB3aXRoIHRyYWlsaW5nIGJsYW5rICovCisgICAgaW50CQlwcmV2X2xpbmU7CS8qIG1heSBzdGFydCBpbiBwcmV2aW91cyBsaW5lICovCit7CisgICAgcG9zX1QJcG9zOworICAgIGNvbG5yX1QJbGVuOworICAgIGNoYXJfdQkqb2xkOworICAgIGNoYXJfdQkqbmV3LCAqcG5ldzsKKyAgICBpbnQJCXdhc2F0ZW5kOworCisgICAgaWYgKCFoYXNfZm9ybWF0X29wdGlvbihGT19BVVRPKSkKKwlyZXR1cm47CisKKyAgICBwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIG9sZCA9IG1sX2dldF9jdXJsaW5lKCk7CisKKyAgICAvKiBtYXkgcmVtb3ZlIGFkZGVkIHNwYWNlICovCisgICAgY2hlY2tfYXV0b19mb3JtYXQoRkFMU0UpOworCisgICAgLyogRG9uJ3QgZm9ybWF0IGluIEluc2VydCBtb2RlIHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIHRyYWlsaW5nIGJsYW5rLCB0aGUKKyAgICAgKiB1c2VyIG1pZ2h0IGluc2VydCBub3JtYWwgdGV4dCBuZXh0LiAgQWxzbyBza2lwIGZvcm1hdHRpbmcgd2hlbiAiMSIgaXMKKyAgICAgKiBpbiAnZm9ybWF0b3B0aW9ucycgYW5kIHRoZXJlIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGN1cnNvci4KKyAgICAgKiBPdGhlcndpc2UgdGhlIGxpbmUgd291bGQgYmUgYnJva2VuIGFuZCB3aGVuIHR5cGluZyBhbm90aGVyIG5vbi13aGl0ZQorICAgICAqIG5leHQgdGhleSBhcmUgbm90IGpvaW5lZCBiYWNrIHRvZ2V0aGVyLiAqLworICAgIHdhc2F0ZW5kID0gKHBvcy5jb2wgPT0gU1RSTEVOKG9sZCkpOworICAgIGlmICgqb2xkICE9IE5VTCAmJiAhdHJhaWxibGFuayAmJiB3YXNhdGVuZCkKKyAgICB7CisJZGVjX2N1cnNvcigpOworCWlmICghV0hJVEVDSEFSKGdjaGFyX2N1cnNvcigpKQorCQkmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAKKwkJJiYgaGFzX2Zvcm1hdF9vcHRpb24oRk9fT05FX0xFVFRFUikpCisJICAgIGRlY19jdXJzb3IoKTsKKwlpZiAoV0hJVEVDSEFSKGdjaGFyX2N1cnNvcigpKSkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisJICAgIHJldHVybjsKKwl9CisJY3Vyd2luLT53X2N1cnNvciA9IHBvczsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgLyogV2l0aCB0aGUgJ2MnIGZsYWcgaW4gJ2Zvcm1hdG9wdGlvbnMnIGFuZCAndCcgbWlzc2luZzogb25seSBmb3JtYXQKKyAgICAgKiBjb21tZW50cy4gKi8KKyAgICBpZiAoaGFzX2Zvcm1hdF9vcHRpb24oRk9fV1JBUF9DT01TKSAmJiAhaGFzX2Zvcm1hdF9vcHRpb24oRk9fV1JBUCkKKwkJCQkgICAgICYmIGdldF9sZWFkZXJfbGVuKG9sZCwgTlVMTCwgRkFMU0UpID09IDApCisJcmV0dXJuOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIE1heSBzdGFydCBmb3JtYXR0aW5nIGluIGEgcHJldmlvdXMgbGluZSwgc28gdGhhdCBhZnRlciAieCIgYSB3b3JkIGlzCisgICAgICogbW92ZWQgdG8gdGhlIHByZXZpb3VzIGxpbmUgaWYgaXQgZml0cyB0aGVyZSBub3cuICBPbmx5IHdoZW4gdGhpcyBpcyBub3QKKyAgICAgKiB0aGUgc3RhcnQgb2YgYSBwYXJhZ3JhcGguCisgICAgICovCisgICAgaWYgKHByZXZfbGluZSAmJiAhcGFyYWdyYXBoX3N0YXJ0KGN1cndpbi0+d19jdXJzb3IubG51bSkpCisgICAgeworCS0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogRG8gdGhlIGZvcm1hdHRpbmcgYW5kIHJlc3RvcmUgdGhlIGN1cnNvciBwb3NpdGlvbi4gICJzYXZlZF9jdXJzb3IiIHdpbGwKKyAgICAgKiBiZSBhZGp1c3RlZCBmb3IgdGhlIHRleHQgZm9ybWF0dGluZy4KKyAgICAgKi8KKyAgICBzYXZlZF9jdXJzb3IgPSBwb3M7CisgICAgZm9ybWF0X2xpbmVzKChsaW5lbnJfVCktMSk7CisgICAgY3Vyd2luLT53X2N1cnNvciA9IHNhdmVkX2N1cnNvcjsKKyAgICBzYXZlZF9jdXJzb3IubG51bSA9IDA7CisKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCS8qICJjYW5ub3QgaGFwcGVuIiAqLworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWNvbGFkdmFuY2UoKGNvbG5yX1QpTUFYQ09MKTsKKyAgICB9CisgICAgZWxzZQorCWNoZWNrX2N1cnNvcl9jb2woKTsKKworICAgIC8qIEluc2VydCBtb2RlOiBJZiB0aGUgY3Vyc29yIGlzIG5vdyBhZnRlciB0aGUgZW5kIG9mIHRoZSBsaW5lIHdoaWxlIGl0CisgICAgICogcHJldmlvdXNseSB3YXNuJ3QsIHRoZSBsaW5lIHdhcyBicm9rZW4uICBCZWNhdXNlIG9mIHRoZSBydWxlIGFib3ZlIHdlCisgICAgICogbmVlZCB0byBhZGQgYSBzcGFjZSB3aGVuICd3JyBpcyBpbiAnZm9ybWF0b3B0aW9ucycgdG8ga2VlcCBhIHBhcmFncmFwaAorICAgICAqIGZvcm1hdHRlZC4gKi8KKyAgICBpZiAoIXdhc2F0ZW5kICYmIGhhc19mb3JtYXRfb3B0aW9uKEZPX1dISVRFX1BBUikpCisgICAgeworCW5ldyA9IG1sX2dldF9jdXJsaW5lKCk7CisJbGVuID0gU1RSTEVOKG5ldyk7CisJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID09IGxlbikKKwl7CisJICAgIHBuZXcgPSB2aW1fc3RybnNhdmUobmV3LCBsZW4gKyAyKTsKKwkgICAgcG5ld1tsZW5dID0gJyAnOworCSAgICBwbmV3W2xlbiArIDFdID0gTlVMOworCSAgICBtbF9yZXBsYWNlKGN1cndpbi0+d19jdXJzb3IubG51bSwgcG5ldywgRkFMU0UpOworCSAgICAvKiByZW1vdmUgdGhlIHNwYWNlIGxhdGVyICovCisJICAgIGRpZF9hZGRfc3BhY2UgPSBUUlVFOworCX0KKwllbHNlCisJICAgIC8qIG1heSByZW1vdmUgYWRkZWQgc3BhY2UgKi8KKwkgICAgY2hlY2tfYXV0b19mb3JtYXQoRkFMU0UpOworICAgIH0KKworICAgIGNoZWNrX2N1cnNvcigpOworfQorCisvKgorICogV2hlbiBhbiBleHRyYSBzcGFjZSB3YXMgYWRkZWQgdG8gY29udGludWUgYSBwYXJhZ3JhcGggZm9yIGF1dG8tZm9ybWF0dGluZywKKyAqIGRlbGV0ZSBpdCBub3cuICBUaGUgc3BhY2UgbXVzdCBiZSB1bmRlciB0aGUgY3Vyc29yLCBqdXN0IGFmdGVyIHRoZSBpbnNlcnQKKyAqIHBvc2l0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK2NoZWNrX2F1dG9fZm9ybWF0KGVuZF9pbnNlcnQpCisgICAgaW50CQllbmRfaW5zZXJ0OwkgICAgLyogVFJVRSB3aGVuIGVuZGluZyBJbnNlcnQgbW9kZSAqLworeworICAgIGludAkJYyA9ICcgJzsKKworICAgIGlmIChkaWRfYWRkX3NwYWNlKQorICAgIHsKKwlpZiAoIVdISVRFQ0hBUihnY2hhcl9jdXJzb3IoKSkpCisJICAgIC8qIFNvbWVob3cgdGhlIHNwYWNlIHdhcyByZW1vdmVkIGFscmVhZHkuICovCisJICAgIGRpZF9hZGRfc3BhY2UgPSBGQUxTRTsKKwllbHNlCisJeworCSAgICBpZiAoIWVuZF9pbnNlcnQpCisJICAgIHsKKwkJaW5jX2N1cnNvcigpOworCQljID0gZ2NoYXJfY3Vyc29yKCk7CisJCWRlY19jdXJzb3IoKTsKKwkgICAgfQorCSAgICBpZiAoYyAhPSBOVUwpCisJICAgIHsKKwkJLyogVGhlIHNwYWNlIGlzIG5vIGxvbmdlciBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCBkZWxldGUgaXQuICovCisJCWRlbF9jaGFyKEZBTFNFKTsKKwkJZGlkX2FkZF9zcGFjZSA9IEZBTFNFOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIEZpbmQgb3V0IHRleHR3aWR0aCB0byBiZSB1c2VkIGZvciBmb3JtYXR0aW5nOgorICoJaWYgJ3RleHR3aWR0aCcgb3B0aW9uIGlzIHNldCwgdXNlIGl0CisgKgllbHNlIGlmICd3cmFwbWFyZ2luJyBvcHRpb24gaXMgc2V0LCB1c2UgV19XSURUSChjdXJ3aW4pIC0gJ3dyYXBtYXJnaW4nCisgKglpZiBpbnZhbGlkIHZhbHVlLCB1c2UgMC4KKyAqCVNldCBkZWZhdWx0IHRvIHdpbmRvdyB3aWR0aCAobWF4aW11bSA3OSkgZm9yICJncSIgb3BlcmF0b3IuCisgKi8KKyAgICBpbnQKK2NvbXBfdGV4dHdpZHRoKGZmKQorICAgIGludAkJZmY7CS8qIGZvcmNlIGZvcm1hdHRpbmcgKGZvciAiUSIgY29tbWFuZCkgKi8KK3sKKyAgICBpbnQJCXRleHR3aWR0aDsKKworICAgIHRleHR3aWR0aCA9IGN1cmJ1Zi0+Yl9wX3R3OworICAgIGlmICh0ZXh0d2lkdGggPT0gMCAmJiBjdXJidWYtPmJfcF93bSkKKyAgICB7CisJLyogVGhlIHdpZHRoIGlzIHRoZSB3aW5kb3cgd2lkdGggbWludXMgJ3dyYXBtYXJnaW4nIG1pbnVzIGFsbCB0aGUKKwkgKiB0aGluZ3MgdGhhdCBhZGQgdG8gdGhlIG1hcmdpbi4gKi8KKwl0ZXh0d2lkdGggPSBXX1dJRFRIKGN1cndpbikgLSBjdXJidWYtPmJfcF93bTsKKyNpZmRlZiBGRUFUX0NNRFdJTgorCWlmIChjbWR3aW5fdHlwZSAhPSAwKQorCSAgICB0ZXh0d2lkdGggLT0gMTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCXRleHR3aWR0aCAtPSBjdXJ3aW4tPndfcF9mZGM7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NJR05TCisJaWYgKGN1cndpbi0+d19idWZmZXItPmJfc2lnbmxpc3QgIT0gTlVMTAorIyBpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkJCSAgICB8fCB1c2luZ05ldGJlYW5zCisjIGVuZGlmCisJCSAgICApCisJICAgIHRleHR3aWR0aCAtPSAxOworI2VuZGlmCisJaWYgKGN1cndpbi0+d19wX251KQorCSAgICB0ZXh0d2lkdGggLT0gODsKKyAgICB9CisgICAgaWYgKHRleHR3aWR0aCA8IDApCisJdGV4dHdpZHRoID0gMDsKKyAgICBpZiAoZmYgJiYgdGV4dHdpZHRoID09IDApCisgICAgeworCXRleHR3aWR0aCA9IFdfV0lEVEgoY3Vyd2luKSAtIDE7CisJaWYgKHRleHR3aWR0aCA+IDc5KQorCSAgICB0ZXh0d2lkdGggPSA3OTsKKyAgICB9CisgICAgcmV0dXJuIHRleHR3aWR0aDsKK30KKworLyoKKyAqIFB1dCBhIGNoYXJhY3RlciBpbiB0aGUgcmVkbyBidWZmZXIsIGZvciB3aGVuIGp1c3QgYWZ0ZXIgYSBDVFJMLVYuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVkb19saXRlcmFsKGMpCisgICAgaW50CSAgICBjOworeworICAgIGNoYXJfdQlidWZbMTBdOworCisgICAgLyogT25seSBkaWdpdHMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudC4gIFRyYW5zbGF0ZSB0aGVtIGludG8gYSBzdHJpbmcgb2YKKyAgICAgKiB0aHJlZSBkaWdpdHMuICovCisgICAgaWYgKFZJTV9JU0RJR0lUKGMpKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopYnVmLCAiJTAzZCIsIGMpOworCUFwcGVuZFRvUmVkb2J1ZmYoYnVmKTsKKyAgICB9CisgICAgZWxzZQorCUFwcGVuZENoYXJUb1JlZG9idWZmKGMpOworfQorCisvKgorICogc3RhcnRfYXJyb3coKSBpcyBjYWxsZWQgd2hlbiBhbiBhcnJvdyBrZXkgaXMgdXNlZCBpbiBpbnNlcnQgbW9kZS4KKyAqIEl0IHJlc2VtYmxlcyBoaXR0aW5nIHRoZSA8RVNDPiBrZXkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3RhcnRfYXJyb3coZW5kX2luc2VydF9wb3MpCisgICAgcG9zX1QgICAgKmVuZF9pbnNlcnRfcG9zOworeworICAgIGlmICghYXJyb3dfdXNlZCkJICAgIC8qIHNvbWV0aGluZyBoYXMgYmVlbiBpbnNlcnRlZCAqLworICAgIHsKKwlBcHBlbmRUb1JlZG9idWZmKEVTQ19TVFIpOworCXN0b3BfaW5zZXJ0KGVuZF9pbnNlcnRfcG9zLCBGQUxTRSk7CisJYXJyb3dfdXNlZCA9IFRSVUU7CS8qIHRoaXMgbWVhbnMgd2Ugc3RvcHBlZCB0aGUgY3VycmVudCBpbnNlcnQgKi8KKyAgICB9Cit9CisKKy8qCisgKiBzdG9wX2Fycm93KCkgaXMgY2FsbGVkIGJlZm9yZSBhIGNoYW5nZSBpcyBtYWRlIGluIGluc2VydCBtb2RlLgorICogSWYgYW4gYXJyb3cga2V5IGhhcyBiZWVuIHVzZWQsIHN0YXJ0IGEgbmV3IGluc2VydGlvbi4KKyAqIFJldHVybnMgRkFJTCBpZiB1bmRvIGlzIGltcG9zc2libGUsIHNob3VsZG4ndCBpbnNlcnQgdGhlbi4KKyAqLworICAgIGludAorc3RvcF9hcnJvdygpCit7CisgICAgaWYgKGFycm93X3VzZWQpCisgICAgeworCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gT0spCisJeworCSAgICBhcnJvd191c2VkID0gRkFMU0U7CisJICAgIGluc19uZWVkX3VuZG8gPSBGQUxTRTsKKwl9CisJSW5zc3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiBuZXcgaW5zZXJ0aW9uIHN0YXJ0cyBoZXJlICovCisJSW5zc3RhcnRfdGV4dGxlbiA9IGxpbmV0YWJzaXplKG1sX2dldF9jdXJsaW5lKCkpOworCWFpX2NvbCA9IDA7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCWlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJeworCSAgICBvcmlnX2xpbmVfY291bnQgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgdnJfbGluZXNfY2hhbmdlZCA9IDE7CisJfQorI2VuZGlmCisJUmVzZXRSZWRvYnVmZigpOworCUFwcGVuZFRvUmVkb2J1ZmYoKGNoYXJfdSAqKSIxaSIpOyAgIC8qIHByZXRlbmQgd2Ugc3RhcnQgYW4gaW5zZXJ0aW9uICovCisgICAgfQorICAgIGVsc2UgaWYgKGluc19uZWVkX3VuZG8pCisgICAgeworCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gT0spCisJICAgIGluc19uZWVkX3VuZG8gPSBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKiBBbHdheXMgb3BlbiBmb2xkIGF0IHRoZSBjdXJzb3IgbGluZSB3aGVuIGluc2VydGluZyBzb21ldGhpbmcuICovCisgICAgZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIChhcnJvd191c2VkIHx8IGluc19uZWVkX3VuZG8gPyBGQUlMIDogT0spOworfQorCisvKgorICogZG8gYSBmZXcgdGhpbmdzIHRvIHN0b3AgaW5zZXJ0aW5nCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3RvcF9pbnNlcnQoZW5kX2luc2VydF9wb3MsIGVzYykKKyAgICBwb3NfVCAgICAqZW5kX2luc2VydF9wb3M7CS8qIHdoZXJlIGluc2VydCBlbmRlZCAqLworICAgIGludAkgICAgZXNjOwkJLyogY2FsbGVkIGJ5IGluc19lc2MoKSAqLworeworICAgIGludAkgICAgY2M7CisKKyAgICBzdG9wX3JlZG9faW5zKCk7CisgICAgcmVwbGFjZV9mbHVzaCgpOwkJLyogYWJhbmRvbiByZXBsYWNlIHN0YWNrICovCisKKyAgICAvKgorICAgICAqIHNhdmUgdGhlIGluc2VydGVkIHRleHQgZm9yIGxhdGVyIHJlZG8gd2l0aCBeQAorICAgICAqLworICAgIHZpbV9mcmVlKGxhc3RfaW5zZXJ0KTsKKyAgICBsYXN0X2luc2VydCA9IGdldF9pbnNlcnRlZCgpOworICAgIGxhc3RfaW5zZXJ0X3NraXAgPSBuZXdfaW5zZXJ0X3NraXA7CisKKyAgICBpZiAoIWFycm93X3VzZWQpCisgICAgeworCS8qIEF1dG8tZm9ybWF0IG5vdy4gIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gZG8gdGhpcyB3aGVuIHN0b3BwaW5nIGFuCisJICogaW5zZXJ0aW9uIChvciBtb3ZpbmcgdGhlIGN1cnNvciksIGJ1dCBpdCdzIHJlcXVpcmVkIHdoZW4gYXBwZW5kaW5nCisJICogYSBsaW5lIGFuZCBoYXZpbmcgaXQgZW5kIGluIGEgc3BhY2UuICBCdXQgb25seSBkbyBpdCB3aGVuIHNvbWV0aGluZworCSAqIHdhcyBhY3R1YWxseSBpbnNlcnRlZCwgb3RoZXJ3aXNlIHVuZG8gd29uJ3Qgd29yay4gKi8KKwlpZiAoIWluc19uZWVkX3VuZG8pCisJeworCSAgICAvKiBXaGVuIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhZnRlciBhIHNwYWNlIHRoZQorCSAgICAgKiBmb3JtYXR0aW5nIHdpbGwgbW92ZSBpdCB0byB0aGUgZm9sbG93aW5nIHdvcmQuICBBdm9pZCB0aGF0IGJ5CisJICAgICAqIG1vdmluZyB0aGUgY3Vyc29yIG9udG8gdGhlIHNwYWNlLiAqLworCSAgICBjYyA9ICd4JzsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID4gMCAmJiBnY2hhcl9jdXJzb3IoKSA9PSBOVUwpCisJICAgIHsKKwkJZGVjX2N1cnNvcigpOworCQljYyA9IGdjaGFyX2N1cnNvcigpOworCQlpZiAoIXZpbV9pc3doaXRlKGNjKSkKKwkJICAgIGluY19jdXJzb3IoKTsKKwkgICAgfQorCisJICAgIGF1dG9fZm9ybWF0KFRSVUUsIEZBTFNFKTsKKworCSAgICBpZiAodmltX2lzd2hpdGUoY2MpICYmIGdjaGFyX2N1cnNvcigpICE9IE5VTCkKKwkJaW5jX2N1cnNvcigpOworCX0KKworCS8qIElmIGEgc3BhY2Ugd2FzIGluc2VydGVkIGZvciBhdXRvLWZvcm1hdHRpbmcsIHJlbW92ZSBpdCBub3cuICovCisJY2hlY2tfYXV0b19mb3JtYXQoVFJVRSk7CisKKwkvKiBJZiB3ZSBqdXN0IGRpZCBhbiBhdXRvLWluZGVudCwgcmVtb3ZlIHRoZSB3aGl0ZSBzcGFjZSBmcm9tIHRoZSBlbmQKKwkgKiBvZiB0aGUgbGluZSwgYW5kIHB1dCB0aGUgY3Vyc29yIGJhY2suICAqLworCWlmIChkaWRfYWkgJiYgZXNjKQorCXsKKwkgICAgaWYgKGdjaGFyX2N1cnNvcigpID09IE5VTCAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDApCisJCS0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIHdoaWxlIChjYyA9IGdjaGFyX2N1cnNvcigpLCB2aW1faXN3aGl0ZShjYykpCisJCSh2b2lkKWRlbF9jaGFyKFRSVUUpOworCSAgICBpZiAoY2MgIT0gTlVMKQorCQkrK2N1cndpbi0+d19jdXJzb3IuY29sOwkvKiBwdXQgY3Vyc29yIGJhY2sgb24gdGhlIE5VTCAqLworCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgLyogPEMtUy1SaWdodD4gbWF5IGhhdmUgc3RhcnRlZCBWaXN1YWwgbW9kZSwgYWRqdXN0IHRoZSBwb3NpdGlvbiBmb3IKKwkgICAgICogZGVsZXRlZCBjaGFyYWN0ZXJzLiAqLworCSAgICBpZiAoVklzdWFsX2FjdGl2ZSAmJiBWSXN1YWwubG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIHsKKwkJY2MgPSBTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSk7CisJCWlmIChWSXN1YWwuY29sID4gKGNvbG5yX1QpY2MpCisJCXsKKwkJICAgIFZJc3VhbC5jb2wgPSBjYzsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkgICAgVklzdWFsLmNvbGFkZCA9IDA7CisjIGVuZGlmCisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KKyAgICBkaWRfYWkgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisgICAgZGlkX3NpID0gRkFMU0U7CisgICAgY2FuX3NpID0gRkFMU0U7CisgICAgY2FuX3NpX2JhY2sgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyogc2V0ICdbIGFuZCAnXSB0byB0aGUgaW5zZXJ0ZWQgdGV4dCAqLworICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydCA9IEluc3N0YXJ0OworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQgPSAqZW5kX2luc2VydF9wb3M7Cit9CisKKy8qCisgKiBTZXQgdGhlIGxhc3QgaW5zZXJ0ZWQgdGV4dCB0byBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgKiBVc2VkIGZvciB0aGUgcmVwbGFjZSBjb21tYW5kLgorICovCisgICAgdm9pZAorc2V0X2xhc3RfaW5zZXJ0KGMpCisgICAgaW50CQljOworeworICAgIGNoYXJfdQkqczsKKworICAgIHZpbV9mcmVlKGxhc3RfaW5zZXJ0KTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgbGFzdF9pbnNlcnQgPSBhbGxvYyhNQl9NQVhCWVRFUyAqIDMgKyA1KTsKKyNlbHNlCisgICAgbGFzdF9pbnNlcnQgPSBhbGxvYyg2KTsKKyNlbmRpZgorICAgIGlmIChsYXN0X2luc2VydCAhPSBOVUxMKQorICAgIHsKKwlzID0gbGFzdF9pbnNlcnQ7CisJLyogVXNlIHRoZSBDVFJMLVYgb25seSB3aGVuIGVudGVyaW5nIGEgc3BlY2lhbCBjaGFyICovCisJaWYgKGMgPCAnICcgfHwgYyA9PSBERUwpCisJICAgICpzKysgPSBDdHJsX1Y7CisJcyA9IGFkZF9jaGFyMmJ1ZihjLCBzKTsKKwkqcysrID0gRVNDOworCSpzKysgPSBOVUw7CisJbGFzdF9pbnNlcnRfc2tpcCA9IDA7CisgICAgfQorfQorCisvKgorICogQWRkIGNoYXJhY3RlciAiYyIgdG8gYnVmZmVyICJzIi4gIEVzY2FwZSB0aGUgc3BlY2lhbCBtZWFuaW5nIG9mIEtfU1BFQ0lBTAorICogYW5kIENTSS4gIEhhbmRsZSBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhZnRlciB0aGUgYWRkZWQgYnl0ZXMuCisgKi8KKyAgICBjaGFyX3UgKgorYWRkX2NoYXIyYnVmKGMsIHMpCisgICAgaW50CQljOworICAgIGNoYXJfdQkqczsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CXRlbXBbTUJfTUFYQllURVNdOworICAgIGludAkJaTsKKyAgICBpbnQJCWxlbjsKKworICAgIGxlbiA9ICgqbWJfY2hhcjJieXRlcykoYywgdGVtcCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHsKKwljID0gdGVtcFtpXTsKKyNlbmRpZgorCS8qIE5lZWQgdG8gZXNjYXBlIEtfU1BFQ0lBTCBhbmQgQ1NJIGxpa2UgaW4gdGhlIHR5cGVhaGVhZCBidWZmZXIuICovCisJaWYgKGMgPT0gS19TUEVDSUFMKQorCXsKKwkgICAgKnMrKyA9IEtfU1BFQ0lBTDsKKwkgICAgKnMrKyA9IEtTX1NQRUNJQUw7CisJICAgICpzKysgPSBLRV9GSUxMRVI7CisJfQorI2lmZGVmIEZFQVRfR1VJCisJZWxzZSBpZiAoYyA9PSBDU0kpCisJeworCSAgICAqcysrID0gQ1NJOworCSAgICAqcysrID0gS1NfRVhUUkE7CisJICAgICpzKysgPSAoaW50KUtFX0NTSTsKKwl9CisjZW5kaWYKKwllbHNlCisJICAgICpzKysgPSBjOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gczsKK30KKworLyoKKyAqIG1vdmUgY3Vyc29yIHRvIHN0YXJ0IG9mIGxpbmUKKyAqIGlmIGZsYWdzICYgQkxfV0hJVEUJbW92ZSB0byBmaXJzdCBub24td2hpdGUKKyAqIGlmIGZsYWdzICYgQkxfU09MCW1vdmUgdG8gZmlyc3Qgbm9uLXdoaXRlIGlmIHN0YXJ0b2ZsaW5lIGlzIHNldCwKKyAqCQkJICAgIG90aGVyd2lzZSBrZWVwICJjdXJzd2FudCIgY29sdW1uCisgKiBpZiBmbGFncyAmIEJMX0ZJWAlkb24ndCBsZWF2ZSB0aGUgY3Vyc29yIG9uIGEgTlVMLgorICovCisgICAgdm9pZAorYmVnaW5saW5lKGZsYWdzKQorICAgIGludAkJZmxhZ3M7Cit7CisgICAgaWYgKChmbGFncyAmIEJMX1NPTCkgJiYgIXBfc29sKQorCWNvbGFkdmFuY2UoY3Vyd2luLT53X2N1cnN3YW50KTsKKyAgICBlbHNlCisgICAgeworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisKKwlpZiAoZmxhZ3MgJiAoQkxfV0hJVEUgfCBCTF9TT0wpKQorCXsKKwkgICAgY2hhcl91ICAqcHRyOworCisJICAgIGZvciAocHRyID0gbWxfZ2V0X2N1cmxpbmUoKTsgdmltX2lzd2hpdGUoKnB0cikKKwkJCSAgICAgICAmJiAhKChmbGFncyAmIEJMX0ZJWCkgJiYgcHRyWzFdID09IE5VTCk7ICsrcHRyKQorCQkrK2N1cndpbi0+d19jdXJzb3IuY29sOworCX0KKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBvbmVyaWdodCBvbmVsZWZ0IGN1cnNvcl9kb3duIGN1cnNvcl91cAorICoKKyAqIE1vdmUgb25lIGNoYXIge3JpZ2h0LGxlZnQsZG93bix1cH0uCisgKiBEb2Vzbid0IG1vdmUgb250byB0aGUgTlVMIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAqIFJldHVybiBPSyB3aGVuIHN1Y2Nlc3NmdWwsIEZBSUwgd2hlbiB3ZSBoaXQgYSBsaW5lIG9mIGZpbGUgYm91bmRhcnkuCisgKi8KKworICAgIGludAorb25lcmlnaHQoKQoreworICAgIGNoYXJfdQkqcHRyOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWw7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBpZiAodmlydHVhbF9hY3RpdmUoKSkKKyAgICB7CisJcG9zX1QJcHJldnBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisKKwkvKiBBZGp1c3QgZm9yIG11bHRpLXdpZGUgY2hhciAoZXhjbHVkaW5nIFRBQikgKi8KKwlwdHIgPSBtbF9nZXRfY3Vyc29yKCk7CisJY29sYWR2YW5jZShnZXR2aXNjb2woKSArICgoKnB0ciAhPSBUQUIgJiYgdmltX2lzcHJpbnRjKAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAoKm1iX3B0cjJjaGFyKShwdHIpCisjZWxzZQorCQkJICAgICpwdHIKKyNlbmRpZgorCQkJICAgICkpCisJCSAgICA/IHB0cjJjZWxscyhwdHIpIDogMSkpOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCS8qIFJldHVybiBPSyBpZiB0aGUgY3Vyc29yIG1vdmVkLCBGQUlMIG90aGVyd2lzZSAoYXQgd2luZG93IGVkZ2UpLiAqLworCXJldHVybiAocHJldnBvcy5jb2wgIT0gY3Vyd2luLT53X2N1cnNvci5jb2wKKwkJICAgIHx8IHByZXZwb3MuY29sYWRkICE9IGN1cndpbi0+d19jdXJzb3IuY29sYWRkKSA/IE9LIDogRkFJTDsKKyAgICB9CisjZW5kaWYKKworICAgIHB0ciA9IG1sX2dldF9jdXJzb3IoKTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSAmJiAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyKSkgPiAxKQorICAgIHsKKwkvKiBUaGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IgaXMgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciwgbW92ZQorCSAqIHNldmVyYWwgYnl0ZXMgcmlnaHQsIGJ1dCBkb24ndCBlbmQgdXAgb24gdGhlIE5VTC4gKi8KKwlpZiAocHRyW2xdID09IE5VTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gbDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWlmICgqcHRyKysgPT0gTlVMIHx8ICpwdHIgPT0gTlVMKQorCSAgICByZXR1cm4gRkFJTDsKKwkrK2N1cndpbi0+d19jdXJzb3IuY29sOworICAgIH0KKworICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworICAgIHJldHVybiBPSzsKK30KKworICAgIGludAorb25lbGVmdCgpCit7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGlmICh2aXJ0dWFsX2FjdGl2ZSgpKQorICAgIHsKKwlpbnQgd2lkdGg7CisJaW50IHYgPSBnZXR2aXNjb2woKTsKKworCWlmICh2ID09IDApCisJICAgIHJldHVybiBGQUlMOworCisjIGlmZGVmIEZFQVRfTElORUJSRUFLCisJLyogV2UgbWlnaHQgZ2V0IHN0dWNrIG9uICdzaG93YnJlYWsnLCBza2lwIG92ZXIgaXQuICovCisJd2lkdGggPSAxOworCWZvciAoOzspCisJeworCSAgICBjb2xhZHZhbmNlKHYgLSB3aWR0aCk7CisJICAgIC8qIGdldHZpc2NvbCgpIGlzIHNsb3csIHNraXAgaXQgd2hlbiAnc2hvd2JyZWFrJyBpcyBlbXB0eSBhbmQKKwkgICAgICogdGhlcmUgYXJlIG5vIG11bHRpLWJ5dGUgY2hhcmFjdGVycyAqLworCSAgICBpZiAoKCpwX3NiciA9PSBOVUwKKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJCSYmICFoYXNfbWJ5dGUKKyMgIGVuZGlmCisJCQkpIHx8IGdldHZpc2NvbCgpIDwgdikKKwkJYnJlYWs7CisJICAgICsrd2lkdGg7CisJfQorIyBlbHNlCisJY29sYWR2YW5jZSh2IC0gMSk7CisjIGVuZGlmCisKKwlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPT0gMSkKKwl7CisJICAgIGNoYXJfdSAqcHRyOworCisJICAgIC8qIEFkanVzdCBmb3IgbXVsdGktd2lkZSBjaGFyIChub3QgYSBUQUIpICovCisJICAgIHB0ciA9IG1sX2dldF9jdXJzb3IoKTsKKwkgICAgaWYgKCpwdHIgIT0gVEFCICYmIHZpbV9pc3ByaW50YygKKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAoKm1iX3B0cjJjaGFyKShwdHIpCisjICBlbHNlCisJCQkgICAgKnB0cgorIyAgZW5kaWYKKwkJCSAgICApICYmIHB0cjJjZWxscyhwdHIpID4gMSkKKwkJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworCX0KKworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCXJldHVybiBPSzsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA9PSAwKQorCXJldHVybiBGQUlMOworCisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBpZiB0aGUgY2hhcmFjdGVyIG9uIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGN1cnNvciBpcyBhIG11bHRpLWJ5dGUKKyAgICAgKiBjaGFyYWN0ZXIsIG1vdmUgdG8gaXRzIGZpcnN0IGJ5dGUgKi8KKyAgICBpZiAoaGFzX21ieXRlKQorCW1iX2FkanVzdF9jdXJzb3IoKTsKKyNlbmRpZgorICAgIHJldHVybiBPSzsKK30KKworICAgIGludAorY3Vyc29yX3VwKG4sIHVwZF90b3BsaW5lKQorICAgIGxvbmcJbjsKKyAgICBpbnQJCXVwZF90b3BsaW5lOwkgICAgLyogV2hlbiBUUlVFOiB1cGRhdGUgdG9wbGluZSAqLworeworICAgIGxpbmVucl9UCWxudW07CisKKyAgICBpZiAobiA+IDApCisgICAgeworCWxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJaWYgKGxudW0gPD0gMSkKKwkgICAgcmV0dXJuIEZBSUw7CisJaWYgKG4gPj0gbG51bSkKKwkgICAgbG51bSA9IDE7CisJZWxzZQorI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoaGFzQW55Rm9sZGluZyhjdXJ3aW4pKQorCXsKKwkgICAgLyoKKwkgICAgICogQ291bnQgZWFjaCBzZXF1ZW5jZSBvZiBmb2xkZWQgbGluZXMgYXMgb25lIGxvZ2ljYWwgbGluZS4KKwkgICAgICovCisJICAgIC8qIGdvIHRvIHRoZSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZm9sZCAqLworCSAgICAodm9pZCloYXNGb2xkaW5nKGxudW0sICZsbnVtLCBOVUxMKTsKKworCSAgICB3aGlsZSAobi0tKQorCSAgICB7CisJCS8qIG1vdmUgdXAgb25lIGxpbmUgKi8KKwkJLS1sbnVtOworCQlpZiAobG51bSA8PSAxKQorCQkgICAgYnJlYWs7CisJCS8qIElmIHdlIGVudGVyZWQgYSBmb2xkLCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcsIHVubGVzcyBpbgorCQkgKiBJbnNlcnQgbW9kZSBvciB3aGVuICdmb2xkb3BlbicgY29udGFpbnMgImFsbCI6IGl0IHdpbGwgb3BlbgorCQkgKiBpbiBhIG1vbWVudC4gKi8KKwkJaWYgKG4gPiAwIHx8ICEoKFN0YXRlICYgSU5TRVJUKSB8fCAoZmRvX2ZsYWdzICYgRkRPX0FMTCkpKQorCQkgICAgKHZvaWQpaGFzRm9sZGluZyhsbnVtLCAmbG51bSwgTlVMTCk7CisJICAgIH0KKwkgICAgaWYgKGxudW0gPCAxKQorCQlsbnVtID0gMTsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGxudW0gLT0gbjsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworICAgIH0KKworICAgIC8qIHRyeSB0byBhZHZhbmNlIHRvIHRoZSBjb2x1bW4gd2Ugd2FudCB0byBiZSBhdCAqLworICAgIGNvbGFkdmFuY2UoY3Vyd2luLT53X2N1cnN3YW50KTsKKworICAgIGlmICh1cGRfdG9wbGluZSkKKwl1cGRhdGVfdG9wbGluZSgpOwkvKiBtYWtlIHN1cmUgY3Vyd2luLT53X3RvcGxpbmUgaXMgdmFsaWQgKi8KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEN1cnNvciBkb3duIGEgbnVtYmVyIG9mIGxvZ2ljYWwgbGluZXMuCisgKi8KKyAgICBpbnQKK2N1cnNvcl9kb3duKG4sIHVwZF90b3BsaW5lKQorICAgIGxvbmcJbjsKKyAgICBpbnQJCXVwZF90b3BsaW5lOwkgICAgLyogV2hlbiBUUlVFOiB1cGRhdGUgdG9wbGluZSAqLworeworICAgIGxpbmVucl9UCWxudW07CisKKyAgICBpZiAobiA+IDApCisgICAgeworCWxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisjaWZkZWYgRkVBVF9GT0xESU5HCisJLyogTW92ZSB0byBsYXN0IGxpbmUgb2YgZm9sZCwgd2lsbCBmYWlsIGlmIGl0J3MgdGhlIGVuZC1vZi1maWxlLiAqLworCSh2b2lkKWhhc0ZvbGRpbmcobG51bSwgTlVMTCwgJmxudW0pOworI2VuZGlmCisJaWYgKGxudW0gPj0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHJldHVybiBGQUlMOworCWlmIChsbnVtICsgbiA+PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWVsc2UKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoaGFzQW55Rm9sZGluZyhjdXJ3aW4pKQorCXsKKwkgICAgbGluZW5yX1QJbGFzdDsKKworCSAgICAvKiBjb3VudCBlYWNoIHNlcXVlbmNlIG9mIGZvbGRlZCBsaW5lcyBhcyBvbmUgbG9naWNhbCBsaW5lICovCisJICAgIHdoaWxlIChuLS0pCisJICAgIHsKKwkJaWYgKGhhc0ZvbGRpbmcobG51bSwgTlVMTCwgJmxhc3QpKQorCQkgICAgbG51bSA9IGxhc3QgKyAxOworCQllbHNlCisJCSAgICArK2xudW07CisJCWlmIChsbnVtID49IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgbG51bSArPSBuOworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisgICAgfQorCisgICAgLyogdHJ5IHRvIGFkdmFuY2UgdG8gdGhlIGNvbHVtbiB3ZSB3YW50IHRvIGJlIGF0ICovCisgICAgY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworCisgICAgaWYgKHVwZF90b3BsaW5lKQorCXVwZGF0ZV90b3BsaW5lKCk7CS8qIG1ha2Ugc3VyZSBjdXJ3aW4tPndfdG9wbGluZSBpcyB2YWxpZCAqLworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU3R1ZmYgdGhlIGxhc3QgaW5zZXJ0ZWQgdGV4dCBpbiB0aGUgcmVhZCBidWZmZXIuCisgKiBMYXN0X2luc2VydCBhY3R1YWxseSBpcyBhIGNvcHkgb2YgdGhlIHJlZG8gYnVmZmVyLCBzbyB3ZQorICogZmlyc3QgaGF2ZSB0byByZW1vdmUgdGhlIGNvbW1hbmQuCisgKi8KKyAgICBpbnQKK3N0dWZmX2luc2VydGVkKGMsIGNvdW50LCBub19lc2MpCisgICAgaW50CSAgICBjOwkJLyogQ29tbWFuZCBjaGFyYWN0ZXIgdG8gYmUgaW5zZXJ0ZWQgKi8KKyAgICBsb25nICAgIGNvdW50OwkvKiBSZXBlYXQgdGhpcyBtYW55IHRpbWVzICovCisgICAgaW50CSAgICBub19lc2M7CS8qIERvbid0IGFkZCBhbiBFU0MgYXQgdGhlIGVuZCAqLworeworICAgIGNoYXJfdQkqZXNjX3B0cjsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBjaGFyX3UJKmxhc3RfcHRyOworICAgIGNoYXJfdQlsYXN0ID0gTlVMOworCisgICAgcHRyID0gZ2V0X2xhc3RfaW5zZXJ0KCk7CisgICAgaWYgKHB0ciA9PSBOVUxMKQorICAgIHsKKwlFTVNHKF8oZV9ub2luc3RleHQpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBtYXkgd2FudCB0byBzdHVmZiB0aGUgY29tbWFuZCBjaGFyYWN0ZXIsIHRvIHN0YXJ0IEluc2VydCBtb2RlICovCisgICAgaWYgKGMgIT0gTlVMKQorCXN0dWZmY2hhclJlYWRidWZmKGMpOworICAgIGlmICgoZXNjX3B0ciA9IChjaGFyX3UgKil2aW1fc3RycmNocihwdHIsIEVTQykpICE9IE5VTEwpCisJKmVzY19wdHIgPSBOVUw7CSAgICAvKiByZW1vdmUgdGhlIEVTQyAqLworCisgICAgLyogd2hlbiB0aGUgbGFzdCBjaGFyIGlzIGVpdGhlciAiMCIgb3IgIl4iIGl0IHdpbGwgYmUgcXVvdGVkIGlmIG5vIEVTQworICAgICAqIGNvbWVzIGFmdGVyIGl0IE9SIGlmIGl0IHdpbGwgaW5zZXJ0ZWQgbW9yZSB0aGFuIG9uY2UgYW5kICJwdHIiCisgICAgICogc3RhcnRzIHdpdGggXkQuCS0tIEFjZXZlZG8KKyAgICAgKi8KKyAgICBsYXN0X3B0ciA9IChlc2NfcHRyID8gZXNjX3B0ciA6IHB0ciArIFNUUkxFTihwdHIpKSAtIDE7CisgICAgaWYgKGxhc3RfcHRyID49IHB0ciAmJiAoKmxhc3RfcHRyID09ICcwJyB8fCAqbGFzdF9wdHIgPT0gJ14nKQorCSAgICAmJiAobm9fZXNjIHx8ICgqcHRyID09IEN0cmxfRCAmJiBjb3VudCA+IDEpKSkKKyAgICB7CisJbGFzdCA9ICpsYXN0X3B0cjsKKwkqbGFzdF9wdHIgPSBOVUw7CisgICAgfQorCisgICAgZG8KKyAgICB7CisJc3R1ZmZSZWFkYnVmZihwdHIpOworCS8qIGEgdHJhaWxpbmcgIjAiIGlzIGluc2VydGVkIGFzICI8Qy1WPjA0OCIsICJeIiBhcyAiPEMtVj5eIiAqLworCWlmIChsYXN0KQorCSAgICBzdHVmZlJlYWRidWZmKChjaGFyX3UgKikobGFzdCA9PSAnMCcKKwkJCT8gSUZfRUIoIlwwMjZcMDYwXDA2NFwwNzAiLCBDVFJMX1ZfU1RSICJ4ZjAiKQorCQkJOiBJRl9FQigiXDAyNl4iLCBDVFJMX1ZfU1RSICJeIikpKTsKKyAgICB9CisgICAgd2hpbGUgKC0tY291bnQgPiAwKTsKKworICAgIGlmIChsYXN0KQorCSpsYXN0X3B0ciA9IGxhc3Q7CisKKyAgICBpZiAoZXNjX3B0ciAhPSBOVUxMKQorCSplc2NfcHRyID0gRVNDOwkgICAgLyogcHV0IHRoZSBFU0MgYmFjayAqLworCisgICAgLyogbWF5IHdhbnQgdG8gc3R1ZmYgYSB0cmFpbGluZyBFU0MsIHRvIGdldCBvdXQgb2YgSW5zZXJ0IG1vZGUgKi8KKyAgICBpZiAoIW5vX2VzYykKKwlzdHVmZmNoYXJSZWFkYnVmZihFU0MpOworCisgICAgcmV0dXJuIE9LOworfQorCisgICAgY2hhcl91ICoKK2dldF9sYXN0X2luc2VydCgpCit7CisgICAgaWYgKGxhc3RfaW5zZXJ0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGxhc3RfaW5zZXJ0ICsgbGFzdF9pbnNlcnRfc2tpcDsKK30KKworLyoKKyAqIEdldCBsYXN0IGluc2VydGVkIHN0cmluZywgYW5kIHJlbW92ZSB0cmFpbGluZyA8RXNjPi4KKyAqIFJldHVybnMgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IChtdXN0IGJlIGZyZWVkKSBvciBOVUxMLgorICovCisgICAgY2hhcl91ICoKK2dldF9sYXN0X2luc2VydF9zYXZlKCkKK3sKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsZW47CisKKyAgICBpZiAobGFzdF9pbnNlcnQgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBzID0gdmltX3N0cnNhdmUobGFzdF9pbnNlcnQgKyBsYXN0X2luc2VydF9za2lwKTsKKyAgICBpZiAocyAhPSBOVUxMKQorICAgIHsKKwlsZW4gPSAoaW50KVNUUkxFTihzKTsKKwlpZiAobGVuID4gMCAmJiBzW2xlbiAtIDFdID09IEVTQykJLyogcmVtb3ZlIHRyYWlsaW5nIEVTQyAqLworCSAgICBzW2xlbiAtIDFdID0gTlVMOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyoKKyAqIENoZWNrIHRoZSB3b3JkIGluIGZyb250IG9mIHRoZSBjdXJzb3IgZm9yIGFuIGFiYnJldmlhdGlvbi4KKyAqIENhbGxlZCB3aGVuIHRoZSBub24taWQgY2hhcmFjdGVyICJjIiBoYXMgYmVlbiBlbnRlcmVkLgorICogV2hlbiBhbiBhYmJyZXZpYXRpb24gaXMgcmVjb2duaXplZCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIHRleHQgYW5kCisgKiB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGlzIGluc2VydGVkIGluIHR5cGVidWYudGJfYnVmW10sIGZvbGxvd2VkIGJ5ICJjIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2VjaGVja19hYmJyKGMpCisgICAgaW50IGM7Cit7CisgICAgLyogRG9uJ3QgY2hlY2sgZm9yIGFiYnJldmlhdGlvbiBpbiBwYXN0ZSBtb2RlLCB3aGVuIGRpc2FibGVkIGFuZCBqdXN0CisgICAgICogYWZ0ZXIgbW92aW5nIGFyb3VuZCB3aXRoIGN1cnNvciBrZXlzLiAqLworICAgIGlmIChwX3Bhc3RlIHx8IG5vX2FiYnIgfHwgYXJyb3dfdXNlZCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gY2hlY2tfYWJicihjLCBtbF9nZXRfY3VybGluZSgpLCBjdXJ3aW4tPndfY3Vyc29yLmNvbCwKKwkJY3Vyd2luLT53X2N1cnNvci5sbnVtID09IEluc3N0YXJ0LmxudW0gPyBJbnNzdGFydC5jb2wgOiAwKTsKK30KKworLyoKKyAqIHJlcGxhY2Utc3RhY2sgZnVuY3Rpb25zCisgKgorICogV2hlbiByZXBsYWNpbmcgY2hhcmFjdGVycywgdGhlIHJlcGxhY2VkIGNoYXJhY3RlcnMgYXJlIHJlbWVtYmVyZWQgZm9yIGVhY2gKKyAqIG5ldyBjaGFyYWN0ZXIuICBUaGlzIGlzIHVzZWQgdG8gcmUtaW5zZXJ0IHRoZSBvbGQgdGV4dCB3aGVuIGJhY2tzcGFjaW5nLgorICoKKyAqIFRoZXJlIGlzIGEgTlVMIGhlYWRlZCBsaXN0IG9mIGNoYXJhY3RlcnMgZm9yIGVhY2ggY2hhcmFjdGVyIHRoYXQgaXMKKyAqIGN1cnJlbnRseSBpbiB0aGUgZmlsZSBhZnRlciB0aGUgaW5zZXJ0aW9uIHBvaW50LiAgV2hlbiBCUyBpcyB1c2VkLCBvbmUgTlVMCisgKiBoZWFkZWQgbGlzdCBpcyBwdXQgYmFjayBmb3IgdGhlIGRlbGV0ZWQgY2hhcmFjdGVyLgorICoKKyAqIEZvciBhIG5ld2xpbmUsIHRoZXJlIGFyZSB0d28gTlVMIGhlYWRlZCBsaXN0cy4gIE9uZSBjb250YWlucyB0aGUgY2hhcmFjdGVycworICogdGhhdCB0aGUgTkwgcmVwbGFjZWQuICBUaGUgZXh0cmEgb25lIHN0b3JlcyB0aGUgY2hhcmFjdGVycyBhZnRlciB0aGUgY3Vyc29yCisgKiB0aGF0IHdlcmUgZGVsZXRlZCAoYWx3YXlzIHdoaXRlIHNwYWNlKS4KKyAqCisgKiBSZXBsYWNlX29mZnNldCBpcyBub3JtYWxseSAwLCBpbiB3aGljaCBjYXNlIHJlcGxhY2VfcHVzaCB3aWxsIGFkZCBhIG5ldworICogY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlIHN0YWNrLiAgSWYgcmVwbGFjZV9vZmZzZXQgaXMgbm90IDAsIHRoYXQgbWFueQorICogY2hhcmFjdGVycyB3aWxsIGJlIGxlZnQgb24gdGhlIHN0YWNrIGFib3ZlIHRoZSBuZXdseSBpbnNlcnRlZCBjaGFyYWN0ZXIuCisgKi8KKworY2hhcl91CSpyZXBsYWNlX3N0YWNrID0gTlVMTDsKK2xvbmcJcmVwbGFjZV9zdGFja19uciA9IDA7CSAgICAvKiBuZXh0IGVudHJ5IGluIHJlcGxhY2Ugc3RhY2sgKi8KK2xvbmcJcmVwbGFjZV9zdGFja19sZW4gPSAwOwkgICAgLyogbWF4LiBudW1iZXIgb2YgZW50cmllcyAqLworCisgICAgdm9pZAorcmVwbGFjZV9wdXNoKGMpCisgICAgaW50CSAgICBjOwkgICAgLyogY2hhcmFjdGVyIHRoYXQgaXMgcmVwbGFjZWQgKE5VTCBpcyBub25lKSAqLworeworICAgIGNoYXJfdSAgKnA7CisKKyAgICBpZiAocmVwbGFjZV9zdGFja19uciA8IHJlcGxhY2Vfb2Zmc2V0KQkvKiBub3RoaW5nIHRvIGRvICovCisJcmV0dXJuOworICAgIGlmIChyZXBsYWNlX3N0YWNrX2xlbiA8PSByZXBsYWNlX3N0YWNrX25yKQorICAgIHsKKwlyZXBsYWNlX3N0YWNrX2xlbiArPSA1MDsKKwlwID0gbGFsbG9jKHNpemVvZihjaGFyX3UpICogcmVwbGFjZV9zdGFja19sZW4sIFRSVUUpOworCWlmIChwID09IE5VTEwpCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJeworCSAgICByZXBsYWNlX3N0YWNrX2xlbiAtPSA1MDsKKwkgICAgcmV0dXJuOworCX0KKwlpZiAocmVwbGFjZV9zdGFjayAhPSBOVUxMKQorCXsKKwkgICAgbWNoX21lbW1vdmUocCwgcmVwbGFjZV9zdGFjaywKKwkJCQkgKHNpemVfdCkocmVwbGFjZV9zdGFja19uciAqIHNpemVvZihjaGFyX3UpKSk7CisJICAgIHZpbV9mcmVlKHJlcGxhY2Vfc3RhY2spOworCX0KKwlyZXBsYWNlX3N0YWNrID0gcDsKKyAgICB9CisgICAgcCA9IHJlcGxhY2Vfc3RhY2sgKyByZXBsYWNlX3N0YWNrX25yIC0gcmVwbGFjZV9vZmZzZXQ7CisgICAgaWYgKHJlcGxhY2Vfb2Zmc2V0KQorCW1jaF9tZW1tb3ZlKHAgKyAxLCBwLCAoc2l6ZV90KShyZXBsYWNlX29mZnNldCAqIHNpemVvZihjaGFyX3UpKSk7CisgICAgKnAgPSBjOworICAgICsrcmVwbGFjZV9zdGFja19ucjsKK30KKworLyoKKyAqIGNhbGwgcmVwbGFjZV9wdXNoKGMpIHdpdGggcmVwbGFjZV9vZmZzZXQgc2V0IHRvIHRoZSBmaXJzdCBOVUwuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVwbGFjZV9wdXNoX29mZihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBwID0gcmVwbGFjZV9zdGFjayArIHJlcGxhY2Vfc3RhY2tfbnI7CisgICAgZm9yIChyZXBsYWNlX29mZnNldCA9IDE7IHJlcGxhY2Vfb2Zmc2V0IDwgcmVwbGFjZV9zdGFja19ucjsKKwkJCQkJCQkgICAgICsrcmVwbGFjZV9vZmZzZXQpCisJaWYgKCotLXAgPT0gTlVMKQorCSAgICBicmVhazsKKyAgICByZXBsYWNlX3B1c2goYyk7CisgICAgcmVwbGFjZV9vZmZzZXQgPSAwOworfQorCisvKgorICogUG9wIG9uZSBpdGVtIGZyb20gdGhlIHJlcGxhY2Ugc3RhY2suCisgKiByZXR1cm4gLTEgaWYgc3RhY2sgZW1wdHkKKyAqIHJldHVybiByZXBsYWNlZCBjaGFyYWN0ZXIgb3IgTlVMIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorcmVwbGFjZV9wb3AoKQoreworICAgIGlmIChyZXBsYWNlX3N0YWNrX25yID09IDApCisJcmV0dXJuIC0xOworICAgIHJldHVybiAoaW50KXJlcGxhY2Vfc3RhY2tbLS1yZXBsYWNlX3N0YWNrX25yXTsKK30KKworLyoKKyAqIEpvaW4gdGhlIHRvcCB0d28gaXRlbXMgb24gdGhlIHJlcGxhY2Ugc3RhY2suICBUaGlzIHJlbW92ZXMgdG8gIm9mZiIndGggTlVMCisgKiBlbmNvdW50ZXJlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZXBsYWNlX2pvaW4ob2ZmKQorICAgIGludAkgICAgb2ZmOwkvKiBvZmZzZXQgZm9yIHdoaWNoIE5VTCB0byByZW1vdmUgKi8KK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSByZXBsYWNlX3N0YWNrX25yOyAtLWkgPj0gMDsgKQorCWlmIChyZXBsYWNlX3N0YWNrW2ldID09IE5VTCAmJiBvZmYtLSA8PSAwKQorCXsKKwkgICAgLS1yZXBsYWNlX3N0YWNrX25yOworCSAgICBtY2hfbWVtbW92ZShyZXBsYWNlX3N0YWNrICsgaSwgcmVwbGFjZV9zdGFjayArIGkgKyAxLAorCQkJCQkgICAgICAoc2l6ZV90KShyZXBsYWNlX3N0YWNrX25yIC0gaSkpOworCSAgICByZXR1cm47CisJfQorfQorCisvKgorICogUG9wIGJ5dGVzIGZyb20gdGhlIHJlcGxhY2Ugc3RhY2sgdW50aWwgYSBOVUwgaXMgZm91bmQsIGFuZCBpbnNlcnQgdGhlbQorICogYmVmb3JlIHRoZSBjdXJzb3IuICBDYW4gb25seSBiZSB1c2VkIGluIFJFUExBQ0Ugb3IgVlJFUExBQ0UgbW9kZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZXBsYWNlX3BvcF9pbnMoKQoreworICAgIGludAkgICAgY2M7CisgICAgaW50CSAgICBvbGRTdGF0ZSA9IFN0YXRlOworCisgICAgU3RhdGUgPSBOT1JNQUw7CQkJLyogZG9uJ3Qgd2FudCBSRVBMQUNFIGhlcmUgKi8KKyAgICB3aGlsZSAoKGNjID0gcmVwbGFjZV9wb3AoKSkgPiAwKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJbWJfcmVwbGFjZV9wb3BfaW5zKGNjKTsKKyNlbHNlCisJaW5zX2NoYXIoY2MpOworI2VuZGlmCisJZGVjX2N1cnNvcigpOworICAgIH0KKyAgICBTdGF0ZSA9IG9sZFN0YXRlOworfQorCisjaWZkZWYgRkVBVF9NQllURQorLyoKKyAqIEluc2VydCBieXRlcyBwb3BwZWQgZnJvbSB0aGUgcmVwbGFjZSBzdGFjay4gImNjIiBpcyB0aGUgZmlyc3QgYnl0ZS4gIElmIGl0CisgKiBpbmRpY2F0ZXMgYSBtdWx0aS1ieXRlIGNoYXIsIHBvcCB0aGUgb3RoZXIgYnl0ZXMgdG9vLgorICovCisgICAgc3RhdGljIHZvaWQKK21iX3JlcGxhY2VfcG9wX2lucyhjYykKKyAgICBpbnQJCWNjOworeworICAgIGludAkJbjsKKyAgICBjaGFyX3UJYnVmW01CX01BWEJZVEVTXTsKKyAgICBpbnQJCWk7CisgICAgaW50CQljOworCisgICAgaWYgKGhhc19tYnl0ZSAmJiAobiA9IE1CX0JZVEUyTEVOKGNjKSkgPiAxKQorICAgIHsKKwlidWZbMF0gPSBjYzsKKwlmb3IgKGkgPSAxOyBpIDwgbjsgKytpKQorCSAgICBidWZbaV0gPSByZXBsYWNlX3BvcCgpOworCWluc19ieXRlc19sZW4oYnVmLCBuKTsKKyAgICB9CisgICAgZWxzZQorCWluc19jaGFyKGNjKTsKKworICAgIGlmIChlbmNfdXRmOCkKKwkvKiBIYW5kbGUgY29tcG9zaW5nIGNoYXJzLiAqLworCWZvciAoOzspCisJeworCSAgICBjID0gcmVwbGFjZV9wb3AoKTsKKwkgICAgaWYgKGMgPT0gLTEpCSAgICAvKiBzdGFjayBlbXB0eSAqLworCQlicmVhazsKKwkgICAgaWYgKChuID0gTUJfQllURTJMRU4oYykpID09IDEpCisJICAgIHsKKwkJLyogTm90IGEgbXVsdGktYnl0ZSBjaGFyLCBwdXQgaXQgYmFjay4gKi8KKwkJcmVwbGFjZV9wdXNoKGMpOworCQlicmVhazsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJYnVmWzBdID0gYzsKKwkJZm9yIChpID0gMTsgaSA8IG47ICsraSkKKwkJICAgIGJ1ZltpXSA9IHJlcGxhY2VfcG9wKCk7CisJCWlmICh1dGZfaXNjb21wb3NpbmcodXRmX3B0cjJjaGFyKGJ1ZikpKQorCQkgICAgaW5zX2J5dGVzX2xlbihidWYsIG4pOworCQllbHNlCisJCXsKKwkJICAgIC8qIE5vdCBhIGNvbXBvc2luZyBjaGFyLCBwdXQgaXQgYmFjay4gKi8KKwkJICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkKKwkJCXJlcGxhY2VfcHVzaChidWZbaV0pOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KK30KKyNlbmRpZgorCisvKgorICogbWFrZSB0aGUgcmVwbGFjZSBzdGFjayBlbXB0eQorICogKGNhbGxlZCB3aGVuIGV4aXRpbmcgcmVwbGFjZSBtb2RlKQorICovCisgICAgc3RhdGljIHZvaWQKK3JlcGxhY2VfZmx1c2goKQoreworICAgIHZpbV9mcmVlKHJlcGxhY2Vfc3RhY2spOworICAgIHJlcGxhY2Vfc3RhY2sgPSBOVUxMOworICAgIHJlcGxhY2Vfc3RhY2tfbGVuID0gMDsKKyAgICByZXBsYWNlX3N0YWNrX25yID0gMDsKK30KKworLyoKKyAqIEhhbmRsZSBkb2luZyBhIEJTIGZvciBvbmUgY2hhcmFjdGVyLgorICogY2MgPCAwOiByZXBsYWNlIHN0YWNrIGVtcHR5LCBqdXN0IG1vdmUgY3Vyc29yCisgKiBjYyA9PSAwOiBjaGFyYWN0ZXIgd2FzIGluc2VydGVkLCBkZWxldGUgaXQKKyAqIGNjID4gMDogY2hhcmFjdGVyIHdhcyByZXBsYWNlZCwgcHV0IGNjIChmaXJzdCBieXRlIG9mIG9yaWdpbmFsIGNoYXIpIGJhY2sKKyAqIGFuZCBjaGVjayBmb3IgbW9yZSBjaGFyYWN0ZXJzIHRvIGJlIHB1dCBiYWNrCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVwbGFjZV9kb19icygpCit7CisgICAgaW50CQljYzsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisgICAgaW50CQlvcmlnX2xlbiA9IDA7CisgICAgaW50CQlpbnNfbGVuOworICAgIGludAkJb3JpZ192Y29scyA9IDA7CisgICAgY29sbnJfVAlzdGFydF92Y29sOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisgICAgaW50CQl2Y29sOworI2VuZGlmCisKKyAgICBjYyA9IHJlcGxhY2VfcG9wKCk7CisgICAgaWYgKGNjID4gMCkKKyAgICB7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCWlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJeworCSAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzY3JlZW4gY2VsbHMgdXNlZCBieSB0aGUgY2hhcmFjdGVyIHdlIGFyZQorCSAgICAgKiBnb2luZyB0byBkZWxldGUuICovCisJICAgIGdldHZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgTlVMTCwgJnN0YXJ0X3Zjb2wsIE5VTEwpOworCSAgICBvcmlnX3Zjb2xzID0gY2hhcnRhYnNpemUobWxfZ2V0X2N1cnNvcigpLCBzdGFydF92Y29sKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGRlbF9jaGFyKEZBTFNFKTsKKyMgaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCQlvcmlnX2xlbiA9IFNUUkxFTihtbF9nZXRfY3Vyc29yKCkpOworIyBlbmRpZgorCSAgICByZXBsYWNlX3B1c2goY2MpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIHBjaGFyX2N1cnNvcihjYyk7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCQlvcmlnX2xlbiA9IFNUUkxFTihtbF9nZXRfY3Vyc29yKCkpIC0gMTsKKyNlbmRpZgorCX0KKwlyZXBsYWNlX3BvcF9pbnMoKTsKKworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwlpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCXsKKwkgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2NyZWVuIGNlbGxzIHVzZWQgYnkgdGhlIGluc2VydGVkIGNoYXJhY3RlcnMgKi8KKwkgICAgcCA9IG1sX2dldF9jdXJzb3IoKTsKKwkgICAgaW5zX2xlbiA9IFNUUkxFTihwKSAtIG9yaWdfbGVuOworCSAgICB2Y29sID0gc3RhcnRfdmNvbDsKKwkgICAgZm9yIChpID0gMDsgaSA8IGluc19sZW47ICsraSkKKwkgICAgeworCQl2Y29sICs9IGNoYXJ0YWJzaXplKHAgKyBpLCB2Y29sKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWkgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7CisjZW5kaWYKKwkgICAgfQorCSAgICB2Y29sIC09IHN0YXJ0X3Zjb2w7CisKKwkgICAgLyogRGVsZXRlIHNwYWNlcyB0aGF0IHdlcmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGN1cnNvciB0byBrZWVwIHRoZQorCSAgICAgKiB0ZXh0IGFsaWduZWQuICovCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sICs9IGluc19sZW47CisJICAgIHdoaWxlICh2Y29sID4gb3JpZ192Y29scyAmJiBnY2hhcl9jdXJzb3IoKSA9PSAnICcpCisJICAgIHsKKwkJZGVsX2NoYXIoRkFMU0UpOworCQkrK29yaWdfdmNvbHM7CisJICAgIH0KKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgLT0gaW5zX2xlbjsKKwl9CisjZW5kaWYKKworCS8qIG1hcmsgdGhlIGJ1ZmZlciBhcyBjaGFuZ2VkIGFuZCBwcmVwYXJlIGZvciBkaXNwbGF5aW5nICovCisJY2hhbmdlZF9ieXRlcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cndpbi0+d19jdXJzb3IuY29sKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2MgPT0gMCkKKwkodm9pZClkZWxfY2hhcihGQUxTRSk7Cit9CisKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBDLWluZGVudGluZyBpcyBvbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NpbmRlbnRfb24oKQoreworICAgIHJldHVybiAoIXBfcGFzdGUgJiYgKGN1cmJ1Zi0+Yl9wX2NpbgorIyBpZmRlZiBGRUFUX0VWQUwKKwkJICAgIHx8ICpjdXJidWYtPmJfcF9pbmRlICE9IE5VTAorIyBlbmRpZgorCQkgICAgKSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9MSVNQKSB8fCBkZWZpbmVkKEZFQVRfQ0lOREVOVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZS1pbmRlbnQgdGhlIGN1cnJlbnQgbGluZSwgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgaXQgYW5kIHRoZQorICogc3Vycm91bmRpbmcgbGluZXMuIEZpeGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uIHNlZW1zIHJlYWxseSBlYXN5IC0tIEknbSB2ZXJ5CisgKiBjb25mdXNlZCB3aGF0IGFsbCB0aGUgcGFydCB0aGF0IGhhbmRsZXMgQ29udHJvbC1UIGlzIGRvaW5nIHRoYXQgSSdtIG5vdC4KKyAqICJnZXRfdGhlX2luZGVudCIgc2hvdWxkIGJlIGdldF9jX2luZGVudCwgZ2V0X2V4cHJfaW5kZW50IG9yIGdldF9saXNwX2luZGVudC4KKyAqLworCisgICAgdm9pZAorZml4dGhpc2xpbmUoZ2V0X3RoZV9pbmRlbnQpCisgICAgaW50ICgqZ2V0X3RoZV9pbmRlbnQpIF9fQVJHUygodm9pZCkpOworeworICAgIGNoYW5nZV9pbmRlbnQoSU5ERU5UX1NFVCwgZ2V0X3RoZV9pbmRlbnQoKSwgRkFMU0UsIDApOworICAgIGlmIChsaW5ld2hpdGUoY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwlkaWRfYWkgPSBUUlVFOwkgICAgLyogZGVsZXRlIHRoZSBpbmRlbnQgaWYgdGhlIGxpbmUgc3RheXMgZW1wdHkgKi8KK30KKworICAgIHZvaWQKK2ZpeF9pbmRlbnQoKQoreworICAgIGlmIChwX3Bhc3RlKQorCXJldHVybjsKKyMgaWZkZWYgRkVBVF9MSVNQCisgICAgaWYgKGN1cmJ1Zi0+Yl9wX2xpc3AgJiYgY3VyYnVmLT5iX3BfYWkpCisJZml4dGhpc2xpbmUoZ2V0X2xpc3BfaW5kZW50KTsKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0xJU1ApICYmIGRlZmluZWQoRkVBVF9DSU5ERU5UKQorICAgIGVsc2UKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9DSU5ERU5UCisJaWYgKGNpbmRlbnRfb24oKSkKKwkgICAgZG9fY19leHByX2luZGVudCgpOworIyBlbmRpZgorfQorCisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0lOREVOVAorLyoKKyAqIHJldHVybiBUUlVFIGlmICdjaW5rZXlzJyBjb250YWlucyB0aGUga2V5ICJrZXl0eXBlZCIsCisgKiB3aGVuID09ICcqJzoJICAgIE9ubHkgaWYga2V5IGlzIHByZWNlZGVkIHdpdGggJyonCShpbmRlbnQgYmVmb3JlIGluc2VydCkKKyAqIHdoZW4gPT0gJyEnOgkgICAgT25seSBpZiBrZXkgaXMgcHJlZGVkZWQgd2l0aCAnIScJKGRvbid0IGluc2VydCkKKyAqIHdoZW4gPT0gJyAnOgkgICAgT25seSBpZiBrZXkgaXMgbm90IHByZWNlZGVkIHdpdGggJyonKGluZGVudCBhZnRlcndhcmRzKQorICoKKyAqICJrZXl0eXBlZCIgY2FuIGhhdmUgYSBmZXcgc3BlY2lhbCB2YWx1ZXM6CisgKiBLRVlfT1BFTl9GT1JXCisgKiBLRVlfT1BFTl9CQUNLCisgKiBLRVlfQ09NUExFVEUJICAgIGp1c3QgZmluaXNoZWQgY29tcGxldGlvbi4KKyAqCisgKiBJZiBsaW5lX2lzX2VtcHR5IGlzIFRSVUUgYWNjZXB0IGtleXMgd2l0aCAnMCcgYmVmb3JlIHRoZW0uCisgKi8KKyAgICBpbnQKK2luX2NpbmtleXMoa2V5dHlwZWQsIHdoZW4sIGxpbmVfaXNfZW1wdHkpCisgICAgaW50CQlrZXl0eXBlZDsKKyAgICBpbnQJCXdoZW47CisgICAgaW50CQlsaW5lX2lzX2VtcHR5OworeworICAgIGNoYXJfdQkqbG9vazsKKyAgICBpbnQJCXRyeV9tYXRjaDsKKyAgICBpbnQJCXRyeV9tYXRjaF93b3JkOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgaW50CQlpY2FzZTsKKyAgICBpbnQJCWk7CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoKmN1cmJ1Zi0+Yl9wX2luZGUgIT0gTlVMKQorCWxvb2sgPSBjdXJidWYtPmJfcF9pbmRrOwkvKiAnaW5kZW50ZXhwcicgc2V0OiB1c2UgJ2luZGVudGtleXMnICovCisgICAgZWxzZQorI2VuZGlmCisJbG9vayA9IGN1cmJ1Zi0+Yl9wX2Npbms7CS8qICdpbmRlbnRleHByJyBlbXB0eTogdXNlICdjaW5rZXlzJyAqLworICAgIHdoaWxlICgqbG9vaykKKyAgICB7CisJLyoKKwkgKiBGaW5kIG91dCBpZiB3ZSB3YW50IHRvIHRyeSBhIG1hdGNoIHdpdGggdGhpcyBrZXksIGRlcGVuZGluZyBvbgorCSAqICd3aGVuJyBhbmQgYSAnKicgb3IgJyEnIGJlZm9yZSB0aGUga2V5LgorCSAqLworCXN3aXRjaCAod2hlbikKKwl7CisJICAgIGNhc2UgJyonOiB0cnlfbWF0Y2ggPSAoKmxvb2sgPT0gJyonKTsgYnJlYWs7CisJICAgIGNhc2UgJyEnOiB0cnlfbWF0Y2ggPSAoKmxvb2sgPT0gJyEnKTsgYnJlYWs7CisJICAgICBkZWZhdWx0OiB0cnlfbWF0Y2ggPSAoKmxvb2sgIT0gJyonKTsgYnJlYWs7CisJfQorCWlmICgqbG9vayA9PSAnKicgfHwgKmxvb2sgPT0gJyEnKQorCSAgICArK2xvb2s7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgJzAnLCBvbmx5IGFjY2VwdCBhIG1hdGNoIGlmIHRoZSBsaW5lIGlzIGVtcHR5LgorCSAqIEJ1dCBtYXkgc3RpbGwgbWF0Y2ggd2hlbiB0eXBpbmcgbGFzdCBjaGFyIG9mIGEgd29yZC4KKwkgKi8KKwlpZiAoKmxvb2sgPT0gJzAnKQorCXsKKwkgICAgdHJ5X21hdGNoX3dvcmQgPSB0cnlfbWF0Y2g7CisJICAgIGlmICghbGluZV9pc19lbXB0eSkKKwkJdHJ5X21hdGNoID0gRkFMU0U7CisJICAgICsrbG9vazsKKwl9CisJZWxzZQorCSAgICB0cnlfbWF0Y2hfd29yZCA9IEZBTFNFOworCisJLyoKKwkgKiBkb2VzIGl0IGxvb2sgbGlrZSBhIGNvbnRyb2wgY2hhcmFjdGVyPworCSAqLworCWlmICgqbG9vayA9PSAnXicKKyNpZmRlZiBFQkNESUMKKwkJJiYgKEN0cmxfY2hyKGxvb2tbMV0pICE9IDApCisjZWxzZQorCQkmJiBsb29rWzFdID49ICc/JyAmJiBsb29rWzFdIDw9ICdfJworI2VuZGlmCisJCSkKKwl7CisJICAgIGlmICh0cnlfbWF0Y2ggJiYga2V5dHlwZWQgPT0gQ3RybF9jaHIobG9va1sxXSkpCisJCXJldHVybiBUUlVFOworCSAgICBsb29rICs9IDI7CisJfQorCS8qCisJICogJ28nIG1lYW5zICJvIiBjb21tYW5kLCBvcGVuIGZvcndhcmQuCisJICogJ08nIG1lYW5zICJPIiBjb21tYW5kLCBvcGVuIGJhY2t3YXJkLgorCSAqLworCWVsc2UgaWYgKCpsb29rID09ICdvJykKKwl7CisJICAgIGlmICh0cnlfbWF0Y2ggJiYga2V5dHlwZWQgPT0gS0VZX09QRU5fRk9SVykKKwkJcmV0dXJuIFRSVUU7CisJICAgICsrbG9vazsKKwl9CisJZWxzZSBpZiAoKmxvb2sgPT0gJ08nKQorCXsKKwkgICAgaWYgKHRyeV9tYXRjaCAmJiBrZXl0eXBlZCA9PSBLRVlfT1BFTl9CQUNLKQorCQlyZXR1cm4gVFJVRTsKKwkgICAgKytsb29rOworCX0KKworCS8qCisJICogJ2UnIG1lYW5zIHRvIGNoZWNrIGZvciAiZWxzZSIgYXQgc3RhcnQgb2YgbGluZSBhbmQganVzdCBiZWZvcmUgdGhlCisJICogY3Vyc29yLgorCSAqLworCWVsc2UgaWYgKCpsb29rID09ICdlJykKKwl7CisJICAgIGlmICh0cnlfbWF0Y2ggJiYga2V5dHlwZWQgPT0gJ2UnICYmIGN1cndpbi0+d19jdXJzb3IuY29sID49IDQpCisJICAgIHsKKwkJcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJCWlmIChza2lwd2hpdGUocCkgPT0gcCArIGN1cndpbi0+d19jdXJzb3IuY29sIC0gNCAmJgorCQkJU1RSTkNNUChwICsgY3Vyd2luLT53X2N1cnNvci5jb2wgLSA0LCAiZWxzZSIsIDQpID09IDApCisJCSAgICByZXR1cm4gVFJVRTsKKwkgICAgfQorCSAgICArK2xvb2s7CisJfQorCisJLyoKKwkgKiAnOicgb25seSBjYXVzZXMgYW4gaW5kZW50IGlmIGl0IGlzIGF0IHRoZSBlbmQgb2YgYSBsYWJlbCBvciBjYXNlCisJICogc3RhdGVtZW50LCBvciB3aGVuIGl0IHdhcyBiZWZvcmUgdHlwaW5nIHRoZSAnOicgKHRvIGZpeAorCSAqIGNsYXNzOjptZXRob2QgZm9yIEMrKykuCisJICovCisJZWxzZSBpZiAoKmxvb2sgPT0gJzonKQorCXsKKwkgICAgaWYgKHRyeV9tYXRjaCAmJiBrZXl0eXBlZCA9PSAnOicpCisJICAgIHsKKwkJcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJCWlmIChjaW5faXNjYXNlKHApIHx8IGNpbl9pc3Njb3BlZGVjbChwKSB8fCBjaW5faXNsYWJlbCgzMCkpCisJCSAgICByZXR1cm4gVFJVRTsKKwkJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID4gMgorCQkJJiYgcFtjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDFdID09ICc6JworCQkJJiYgcFtjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDJdID09ICc6JykKKwkJeworCQkgICAgcFtjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDFdID0gJyAnOworCQkgICAgaSA9IChjaW5faXNjYXNlKHApIHx8IGNpbl9pc3Njb3BlZGVjbChwKQorCQkJCQkJCSAgfHwgY2luX2lzbGFiZWwoMzApKTsKKwkJICAgIHAgPSBtbF9nZXRfY3VybGluZSgpOworCQkgICAgcFtjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDFdID0gJzonOworCQkgICAgaWYgKGkpCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCSAgICB9CisJICAgICsrbG9vazsKKwl9CisKKworCS8qCisJICogSXMgaXQgYSBrZXkgaW4gPD4sIG1heWJlPworCSAqLworCWVsc2UgaWYgKCpsb29rID09ICc8JykKKwl7CisJICAgIGlmICh0cnlfbWF0Y2gpCisJICAgIHsKKwkJLyoKKwkJICogbWFrZSB1cCBzb21lIG5hbWVkIGtleXMgPG8+LCA8Tz4sIDxlPiwgPDA+LCA8Pj4sIDw8PiwgPCo+LAorCQkgKiA8Oj4gYW5kIDwhPiBzbyB0aGF0IHBlb3BsZSBjYW4gcmUtaW5kZW50IG9uIG8sIE8sIGUsIDAsIDwsCisJCSAqID4sICosIDogYW5kICEga2V5cyBpZiB0aGV5IHJlYWxseSByZWFsbHkgd2FudCB0by4KKwkJICovCisJCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiPD4hKm9PZTA6IiwgbG9va1sxXSkgIT0gTlVMTAorCQkJCQkJICAgICAgICYmIGtleXR5cGVkID09IGxvb2tbMV0pCisJCSAgICByZXR1cm4gVFJVRTsKKworCQlpZiAoa2V5dHlwZWQgPT0gZ2V0X3NwZWNpYWxfa2V5X2NvZGUobG9vayArIDEpKQorCQkgICAgcmV0dXJuIFRSVUU7CisJICAgIH0KKwkgICAgd2hpbGUgKCpsb29rICYmICpsb29rICE9ICc+JykKKwkJbG9vaysrOworCSAgICB3aGlsZSAoKmxvb2sgPT0gJz4nKQorCQlsb29rKys7CisJfQorCisJLyoKKwkgKiBJcyBpdCBhIHdvcmQ6ICI9d29yZCI/CisJICovCisJZWxzZSBpZiAoKmxvb2sgPT0gJz0nICYmIGxvb2tbMV0gIT0gJywnICYmIGxvb2tbMV0gIT0gTlVMKQorCXsKKwkgICAgKytsb29rOworCSAgICBpZiAoKmxvb2sgPT0gJ34nKQorCSAgICB7CisJCWljYXNlID0gVFJVRTsKKwkJKytsb29rOworCSAgICB9CisJICAgIGVsc2UKKwkJaWNhc2UgPSBGQUxTRTsKKwkgICAgcCA9IHZpbV9zdHJjaHIobG9vaywgJywnKTsKKwkgICAgaWYgKHAgPT0gTlVMTCkKKwkJcCA9IGxvb2sgKyBTVFJMRU4obG9vayk7CisJICAgIGlmICgodHJ5X21hdGNoIHx8IHRyeV9tYXRjaF93b3JkKQorCQkgICAgJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPj0gKGNvbG5yX1QpKHAgLSBsb29rKSkKKwkgICAgeworCQlpbnQJCW1hdGNoID0gRkFMU0U7CisKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkJaWYgKGtleXR5cGVkID09IEtFWV9DT01QTEVURSkKKwkJeworCQkgICAgY2hhcl91CSpzOworCisJCSAgICAvKiBKdXN0IGNvbXBsZXRlZCBhIHdvcmQsIGNoZWNrIGlmIGl0IHN0YXJ0cyB3aXRoICJsb29rIi4KKwkJICAgICAqIHNlYXJjaCBiYWNrIGZvciB0aGUgc3RhcnQgb2YgYSB3b3JkLiAqLworCQkgICAgbGluZSA9IG1sX2dldF9jdXJsaW5lKCk7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCSAgICB7CisJCQljaGFyX3UJKm47CisKKwkJCWZvciAocyA9IGxpbmUgKyBjdXJ3aW4tPndfY3Vyc29yLmNvbDsgcyA+IGxpbmU7IHMgPSBuKQorCQkJeworCQkJICAgIG4gPSBtYl9wcmV2cHRyKGxpbmUsIHMpOworCQkJICAgIGlmICghdmltX2lzd29yZHAobikpCisJCQkJYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlCisjIGVuZGlmCisJCQlmb3IgKHMgPSBsaW5lICsgY3Vyd2luLT53X2N1cnNvci5jb2w7IHMgPiBsaW5lOyAtLXMpCisJCQkgICAgaWYgKCF2aW1faXN3b3JkYyhzWy0xXSkpCisJCQkJYnJlYWs7CisJCSAgICBpZiAocyArIChwIC0gbG9vaykgPD0gbGluZSArIGN1cndpbi0+d19jdXJzb3IuY29sCisJCQkgICAgJiYgKGljYXNlCisJCQkJPyBNQl9TVFJOSUNNUChzLCBsb29rLCBwIC0gbG9vaykKKwkJCQk6IFNUUk5DTVAocywgbG9vaywgcCAtIGxvb2spKSA9PSAwKQorCQkJbWF0Y2ggPSBUUlVFOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQkgICAgLyogVE9ETzogbXVsdGktYnl0ZSAqLworCQkgICAgaWYgKGtleXR5cGVkID09IChpbnQpcFstMV0gfHwgKGljYXNlICYmIGtleXR5cGVkIDwgMjU2CisJCQkgJiYgVE9MT1dFUl9MT0Moa2V5dHlwZWQpID09IFRPTE9XRVJfTE9DKChpbnQpcFstMV0pKSkKKwkJeworCQkgICAgbGluZSA9IG1sX2dldF9jdXJzb3IoKTsKKwkJICAgIGlmICgoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gKGNvbG5yX1QpKHAgLSBsb29rKQorCQkJCXx8ICF2aW1faXN3b3JkYyhsaW5lWy0ocCAtIGxvb2spIC0gMV0pKQorCQkJICAgICYmIChpY2FzZQorCQkJCT8gTUJfU1RSTklDTVAobGluZSAtIChwIC0gbG9vayksIGxvb2ssIHAgLSBsb29rKQorCQkJCTogU1RSTkNNUChsaW5lIC0gKHAgLSBsb29rKSwgbG9vaywgcCAtIGxvb2spKQorCQkJCQkJCQkJID09IDApCisJCQltYXRjaCA9IFRSVUU7CisJCX0KKwkJaWYgKG1hdGNoICYmIHRyeV9tYXRjaF93b3JkICYmICF0cnlfbWF0Y2gpCisJCXsKKwkJICAgIC8qICIwPXdvcmQiOiBDaGVjayBpZiB0aGVyZSBhcmUgb25seSBibGFua3MgYmVmb3JlIHRoZQorCQkgICAgICogd29yZC4gKi8KKwkJICAgIGxpbmUgPSBtbF9nZXRfY3VybGluZSgpOworCQkgICAgaWYgKChpbnQpKHNraXB3aGl0ZShsaW5lKSAtIGxpbmUpICE9CisJCQkJICAgICAoaW50KShjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIChwIC0gbG9vaykpKQorCQkJbWF0Y2ggPSBGQUxTRTsKKwkJfQorCQlpZiAobWF0Y2gpCisJCSAgICByZXR1cm4gVFJVRTsKKwkgICAgfQorCSAgICBsb29rID0gcDsKKwl9CisKKwkvKgorCSAqIG9rLCBpdCdzIGEgYm9yaW5nIGdlbmVyaWMgY2hhcmFjdGVyLgorCSAqLworCWVsc2UKKwl7CisJICAgIGlmICh0cnlfbWF0Y2ggJiYgKmxvb2sgPT0ga2V5dHlwZWQpCisJCXJldHVybiBUUlVFOworCSAgICArK2xvb2s7CisJfQorCisJLyoKKwkgKiBTa2lwIG92ZXIgIiwgIi4KKwkgKi8KKwlsb29rID0gc2tpcF90b19vcHRpb25fcGFydChsb29rKTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmIC8qIEZFQVRfQ0lOREVOVCAqLworCisjaWYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBNYXAgSGVicmV3IGtleWJvYXJkIHdoZW4gaW4gaGttYXAgbW9kZS4KKyAqLworICAgIGludAoraGttYXAoYykKKyAgICBpbnQgYzsKK3sKKyAgICBpZiAocF9oa21hcHApICAgLyogcGhvbmV0aWMgbWFwcGluZywgYnkgSWx5YSBEb2dvbGF6a3kgKi8KKyAgICB7CisJZW51bSB7aEFMRUY9MCwgQkVULCBHSU1FTCwgREFMRVQsIEhFSSwgVkFWLCBaQUlOLCBIRVQsIFRFVCwgSVVELAorCSAgICBLQUZzb2ZpdCwgaEtBRiwgTEFNRUQsIE1FTXNvZml0LCBNRU0sIE5VTnNvZml0LCBOVU4sIFNBTUVILCBBSU4sCisJICAgIFBFSXNvZml0LCBQRUksIFpBRElzb2ZpdCwgWkFESSwgS09GLCBSRVNILCBoU0hJTiwgVEFWfTsKKwlzdGF0aWMgY2hhcl91IG1hcFsyNl0gPQorCSAgICB7KGNoYXJfdSloQUxFRi8qYSovLCAoY2hhcl91KUJFVCAgLypiKi8sIChjaGFyX3UpaEtBRiAgICAvKmMqLywKKwkgICAgIChjaGFyX3UpREFMRVQvKmQqLywgKGNoYXJfdSktMSAgIC8qZSovLCAoY2hhcl91KVBFSXNvZml0LypmKi8sCisJICAgICAoY2hhcl91KUdJTUVMLypnKi8sIChjaGFyX3UpSEVJICAvKmgqLywgKGNoYXJfdSlJVUQgICAgIC8qaSovLAorCSAgICAgKGNoYXJfdSlIRVQgIC8qaiovLCAoY2hhcl91KUtPRiAgLyprKi8sIChjaGFyX3UpTEFNRUQgICAvKmwqLywKKwkgICAgIChjaGFyX3UpTUVNICAvKm0qLywgKGNoYXJfdSlOVU4gIC8qbiovLCAoY2hhcl91KVNBTUVIICAgLypvKi8sCisJICAgICAoY2hhcl91KVBFSSAgLypwKi8sIChjaGFyX3UpLTEgICAvKnEqLywgKGNoYXJfdSlSRVNIICAgIC8qciovLAorCSAgICAgKGNoYXJfdSlaQUlOIC8qcyovLCAoY2hhcl91KVRBViAgLyp0Ki8sIChjaGFyX3UpVEVUICAgICAvKnUqLywKKwkgICAgIChjaGFyX3UpVkFWICAvKnYqLywgKGNoYXJfdSloU0hJTi8qdyovLCAoY2hhcl91KS0xICAgICAgLyp4Ki8sCisJICAgICAoY2hhcl91KUFJTiAgLyp5Ki8sIChjaGFyX3UpWkFESSAvKnoqL307CisKKwlpZiAoYyA9PSAnTicgfHwgYyA9PSAnTScgfHwgYyA9PSAnUCcgfHwgYyA9PSAnQycgfHwgYyA9PSAnWicpCisJICAgIHJldHVybiAoaW50KShtYXBbQ2hhck9yZChjKV0gLSAxICsgcF9hbGVwaCk7CisJCQkJCQkJICAgIC8qICctMSc9J3NvZml0JyAqLworCWVsc2UgaWYgKGMgPT0gJ3gnKQorCSAgICByZXR1cm4gJ1gnOworCWVsc2UgaWYgKGMgPT0gJ3EnKQorCSAgICByZXR1cm4gJ1wnJzsgLyoge2dlcmVzaH09eyd9ICovCisJZWxzZSBpZiAoYyA9PSAyNDYpCisJICAgIHJldHVybiAnICc7ICAvKiBcIm8gLS0+ICcgJyBmb3IgYSBnZXJtYW4ga2V5Ym9hcmQgKi8KKwllbHNlIGlmIChjID09IDIyOCkKKwkgICAgcmV0dXJuICcgJzsgIC8qIFwiYSAtLT4gJyAnICAgICAgLS0gLyAtLQkgICAgICAgKi8KKwllbHNlIGlmIChjID09IDI1MikKKwkgICAgcmV0dXJuICcgJzsgIC8qIFwidSAtLT4gJyAnICAgICAgLS0gLyAtLQkgICAgICAgKi8KKyNpZmRlZiBFQkNESUMKKwllbHNlIGlmIChpc2xvd2VyKGMpKQorI2Vsc2UKKwkvKiBOT1RFOiBpc2xvd2VyKCkgZG9lcyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB1cyBvbiBMaW51eCBzbyB3ZQorCSAqIGRvIHRoaXMgdGhlIHNhbWUgd2FzIGFzIDUuNyBhbmQgcHJldmlvdXMsIHNvIGl0IHdvcmtzIGNvcnJlY3RseSBvbgorCSAqIGFsbCBzeXN0ZW1zLiAgU3BlY2lmaWNhbGx5LCB0aGUgZS5nLiBEZWxldGUgYW5kIEFycm93IGtleXMgYXJlCisJICogbXVuZ2VkIGFuZCB3b24ndCB3b3JrIGlmIGUuZy4gc2VhcmNoaW5nIGZvciBIZWJyZXcgdGV4dC4KKwkgKi8KKwllbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKyNlbmRpZgorCSAgICByZXR1cm4gKGludCkobWFwW0NoYXJPcmRMb3coYyldICsgcF9hbGVwaCk7CisJZWxzZQorCSAgICByZXR1cm4gYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzd2l0Y2ggKGMpCisJeworCSAgICBjYXNlICdgJzoJcmV0dXJuICc7JzsKKwkgICAgY2FzZSAnLyc6CXJldHVybiAnLic7CisJICAgIGNhc2UgJ1wnJzoJcmV0dXJuICcsJzsKKwkgICAgY2FzZSAncSc6CXJldHVybiAnLyc7CisJICAgIGNhc2UgJ3cnOglyZXR1cm4gJ1wnJzsKKworCQkJLyogSGVicmV3IGxldHRlcnMgLSBzZXQgb2Zmc2V0IGZyb20gJ2EnICovCisJICAgIGNhc2UgJywnOgljID0gJ3snOyBicmVhazsKKwkgICAgY2FzZSAnLic6CWMgPSAndic7IGJyZWFrOworCSAgICBjYXNlICc7JzoJYyA9ICd0JzsgYnJlYWs7CisJICAgIGRlZmF1bHQ6IHsKKwkJCSBzdGF0aWMgY2hhciBzdHJbXSA9ICJ6cWJjeGxzanBobWt3b251IHlkYWZlIHJpZyI7CisKKyNpZmRlZiBFQkNESUMKKwkJCSAvKiBzZWUgbm90ZSBhYm91dCBpc2xvd2VyKCkgYWJvdmUgKi8KKwkJCSBpZiAoIWlzbG93ZXIoYykpCisjZWxzZQorCQkJIGlmIChjIDwgJ2EnIHx8IGMgPiAneicpCisjZW5kaWYKKwkJCSAgICAgcmV0dXJuIGM7CisJCQkgYyA9IHN0cltDaGFyT3JkTG93KGMpXTsKKwkJCSBicmVhazsKKwkJICAgICB9CisJfQorCisJcmV0dXJuIChpbnQpKENoYXJPcmRMb3coYykgKyBwX2FsZXBoKTsKKyAgICB9Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCitpbnNfcmVnKCkKK3sKKyAgICBpbnQJCW5lZWRfcmVkcmF3ID0gRkFMU0U7CisgICAgaW50CQlyZWduYW1lOworICAgIGludAkJbGl0ZXJhbGx5ID0gMDsKKworICAgIC8qCisgICAgICogSWYgd2UgYXJlIGdvaW5nIHRvIHdhaXQgZm9yIGEgY2hhcmFjdGVyLCBzaG93IGEgJyInLgorICAgICAqLworICAgIHBjX3N0YXR1cyA9IFBDX1NUQVRVU19VTlNFVDsKKyAgICBpZiAocmVkcmF3aW5nKCkgJiYgIWNoYXJfYXZhaWwoKSkKKyAgICB7CisJLyogbWF5IG5lZWQgdG8gcmVkcmF3IHdoZW4gbm8gbW9yZSBjaGFycyBhdmFpbGFibGUgbm93ICovCisJaW5zX3JlZHJhdygpOworCisJZWRpdF9wdXRjaGFyKCciJywgVFJVRSk7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwlhZGRfdG9fc2hvd2NtZF9jKEN0cmxfUik7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorICAgIGRvbnRfc2Nyb2xsID0gVFJVRTsJCS8qIGRpc2FsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogRG9uJ3QgbWFwIHRoZSByZWdpc3RlciBuYW1lLiBUaGlzIGFsc28gcHJldmVudHMgdGhlIG1vZGUgbWVzc2FnZSB0byBiZQorICAgICAqIGRlbGV0ZWQgd2hlbiBFU0MgaXMgaGl0LgorICAgICAqLworICAgICsrbm9fbWFwcGluZzsKKyAgICByZWduYW1lID0gc2FmZV92Z2V0YygpOworI2lmZGVmIEZFQVRfTEFOR01BUAorICAgIExBTkdNQVBfQURKVVNUKHJlZ25hbWUsIFRSVUUpOworI2VuZGlmCisgICAgaWYgKHJlZ25hbWUgPT0gQ3RybF9SIHx8IHJlZ25hbWUgPT0gQ3RybF9PIHx8IHJlZ25hbWUgPT0gQ3RybF9QKQorICAgIHsKKwkvKiBHZXQgYSB0aGlyZCBrZXkgZm9yIGxpdGVyYWwgcmVnaXN0ZXIgaW5zZXJ0aW9uICovCisJbGl0ZXJhbGx5ID0gcmVnbmFtZTsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCWFkZF90b19zaG93Y21kX2MobGl0ZXJhbGx5KTsKKyNlbmRpZgorCXJlZ25hbWUgPSBzYWZlX3ZnZXRjKCk7CisjaWZkZWYgRkVBVF9MQU5HTUFQCisJTEFOR01BUF9BREpVU1QocmVnbmFtZSwgVFJVRSk7CisjZW5kaWYKKyAgICB9CisgICAgLS1ub19tYXBwaW5nOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyoKKyAgICAgKiBEb24ndCBjYWxsIHVfc3luYygpIHdoaWxlIGdldHRpbmcgdGhlIGV4cHJlc3Npb24sCisgICAgICogZXZhbHVhdGluZyBpdCBvciBnaXZpbmcgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaXQhCisgICAgICovCisgICAgKytub191X3N5bmM7CisgICAgaWYgKHJlZ25hbWUgPT0gJz0nKQorICAgIHsKKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorCWludAlpbV9vbiA9IGltX2dldF9zdGF0dXMoKTsKKyNlbmRpZgorCXJlZ25hbWUgPSBnZXRfZXhwcl9yZWdpc3RlcigpOworI2lmZGVmIFVTRV9JTV9DT05UUk9MCisJLyogUmVzdG9yZSB0aGUgSW5wdXQgTWV0aG9kLiAqLworCWlmIChpbV9vbikKKwkgICAgaW1fc2V0X2FjdGl2ZShUUlVFKTsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAocmVnbmFtZSA9PSBOVUwpCisJbmVlZF9yZWRyYXcgPSBUUlVFOwkvKiByZW1vdmUgdGhlICciJyAqLworICAgIGVsc2UKKyAgICB7CisjZW5kaWYKKwlpZiAobGl0ZXJhbGx5ID09IEN0cmxfTyB8fCBsaXRlcmFsbHkgPT0gQ3RybF9QKQorCXsKKwkgICAgLyogQXBwZW5kIHRoZSBjb21tYW5kIHRvIHRoZSByZWRvIGJ1ZmZlci4gKi8KKwkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoQ3RybF9SKTsKKwkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYobGl0ZXJhbGx5KTsKKwkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYocmVnbmFtZSk7CisKKwkgICAgZG9fcHV0KHJlZ25hbWUsIEJBQ0tXQVJELCAxTCwKKwkJIChsaXRlcmFsbHkgPT0gQ3RybF9QID8gUFVUX0ZJWElOREVOVCA6IDApIHwgUFVUX0NVUlNFTkQpOworCX0KKwllbHNlIGlmIChpbnNlcnRfcmVnKHJlZ25hbWUsIGxpdGVyYWxseSkgPT0gRkFJTCkKKwl7CisJICAgIHZpbV9iZWVwKCk7CisJICAgIG5lZWRfcmVkcmF3ID0gVFJVRTsJLyogcmVtb3ZlIHRoZSAnIicgKi8KKwl9CisjaWZkZWYgRkVBVF9FVkFMCisgICAgfQorICAgIC0tbm9fdV9zeW5jOworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBjbGVhcl9zaG93Y21kKCk7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBpbnNlcnRlZCByZWdpc3RlciBpcyBlbXB0eSwgd2UgbmVlZCB0byByZW1vdmUgdGhlICciJyAqLworICAgIGlmIChuZWVkX3JlZHJhdyB8fCBzdHVmZl9lbXB0eSgpKQorCWVkaXRfdW5wdXRjaGFyKCk7Cit9CisKKy8qCisgKiBDVFJMLUcgY29tbWFuZHMgaW4gSW5zZXJ0IG1vZGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zX2N0cmxfZygpCit7CisgICAgaW50CQljOworCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisgICAgLyogUmlnaHQgYWZ0ZXIgQ1RSTC1YIHRoZSBjdXJzb3Igd2lsbCBiZSBhZnRlciB0aGUgcnVsZXIuICovCisgICAgc2V0Y3Vyc29yKCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogRG9uJ3QgbWFwIHRoZSBzZWNvbmQga2V5LiBUaGlzIGFsc28gcHJldmVudHMgdGhlIG1vZGUgbWVzc2FnZSB0byBiZQorICAgICAqIGRlbGV0ZWQgd2hlbiBFU0MgaXMgaGl0LgorICAgICAqLworICAgICsrbm9fbWFwcGluZzsKKyAgICBjID0gc2FmZV92Z2V0YygpOworICAgIC0tbm9fbWFwcGluZzsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCS8qIENUUkwtRyBrIGFuZCBDVFJMLUcgPFVwPjogY3Vyc29yIHVwIHRvIEluc3N0YXJ0LmNvbCAqLworCWNhc2UgS19VUDoKKwljYXNlIEN0cmxfSzoKKwljYXNlICdrJzogaW5zX3VwKFRSVUUpOworCQkgIGJyZWFrOworCisJLyogQ1RSTC1HIGogYW5kIENUUkwtRyA8RG93bj46IGN1cnNvciBkb3duIHRvIEluc3N0YXJ0LmNvbCAqLworCWNhc2UgS19ET1dOOgorCWNhc2UgQ3RybF9KOgorCWNhc2UgJ2onOiBpbnNfZG93bihUUlVFKTsKKwkJICBicmVhazsKKworCS8qIENUUkwtRyB1OiBzdGFydCBuZXcgdW5kb2FibGUgZWRpdCAqLworCWNhc2UgJ3UnOiB1X3N5bmMoKTsKKwkJICBpbnNfbmVlZF91bmRvID0gVFJVRTsKKwkJICBicmVhazsKKworCS8qIFVua25vd24gQ1RSTC1HIGNvbW1hbmQsIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLiAqLworCWRlZmF1bHQ6ICB2aW1fYmVlcCgpOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSBFU0MgaW4gaW5zZXJ0IG1vZGUuCisgKiBSZXR1cm5zIFRSVUUgd2hlbiBsZWF2aW5nIGluc2VydCBtb2RlLCBGQUxTRSB3aGVuIGdvaW5nIHRvIHJlcGVhdCB0aGUKKyAqIGluc2VydC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19lc2MoY291bnQsIGNtZGNoYXIpCisgICAgbG9uZwkqY291bnQ7CisgICAgaW50CQljbWRjaGFyOworeworICAgIGludAkJdGVtcDsKKyAgICBzdGF0aWMgaW50CWRpc2FibGVkX3JlZHJhdyA9IEZBTFNFOworCisjaWYgZGVmaW5lZChGRUFUX0hBTkdVTElOKQorIyBpZiBkZWZpbmVkKEVTQ19DSEdfVE9fRU5HX01PREUpCisgICAgaGFuZ3VsX2lucHV0X3N0YXRlX3NldCgwKTsKKyMgZW5kaWYKKyAgICBpZiAoY29tcG9zaW5nX2hhbmd1bCkKKyAgICB7CisJcHVzaF9yYXdfa2V5KGNvbXBvc2luZ19oYW5ndWxfYnVmZmVyLCAyKTsKKwljb21wb3NpbmdfaGFuZ3VsID0gMDsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyAgICBwcmV2aW91c19zY3JpcHQgPSBHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LZXlTY3JpcHQpOworICAgIEtleVNjcmlwdChzbUtleVJvbWFuKTsgLyogb3Igc21LZXlTeXNTY3JpcHQgKi8KKyNlbmRpZgorCisgICAgdGVtcCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIGlmIChkaXNhYmxlZF9yZWRyYXcpCisgICAgeworCS0tUmVkcmF3aW5nRGlzYWJsZWQ7CisJZGlzYWJsZWRfcmVkcmF3ID0gRkFMU0U7CisgICAgfQorICAgIGlmICghYXJyb3dfdXNlZCkKKyAgICB7CisJLyoKKwkgKiBEb24ndCBhcHBlbmQgdGhlIEVTQyBmb3IgInI8Q1I+IiBhbmQgImdyeCIuCisJICovCisJaWYgKGNtZGNoYXIgIT0gJ3InICYmIGNtZGNoYXIgIT0gJ3YnKQorCSAgICBBcHBlbmRUb1JlZG9idWZmKEVTQ19TVFIpOworCisJLyoKKwkgKiBSZXBlYXRpbmcgaW5zZXJ0IG1heSB0YWtlIGEgbG9uZyB0aW1lLiAgQ2hlY2sgZm9yCisJICogaW50ZXJydXB0IG5vdyBhbmQgdGhlbi4KKwkgKi8KKwlpZiAoKmNvdW50ID4gMCkKKwl7CisJICAgIGxpbmVfYnJlYWtjaGVjaygpOworCSAgICBpZiAoZ290X2ludCkKKwkJKmNvdW50ID0gMDsKKwl9CisKKwlpZiAoLS0qY291bnQgPiAwKQkvKiByZXBlYXQgd2hhdCB3YXMgdHlwZWQgKi8KKwl7CisJICAgICh2b2lkKXN0YXJ0X3JlZG9faW5zKCk7CisJICAgIGlmIChjbWRjaGFyID09ICdyJyB8fCBjbWRjaGFyID09ICd2JykKKwkJc3R1ZmZSZWFkYnVmZihFU0NfU1RSKTsJLyogbm8gRVNDIGluIHJlZG8gYnVmZmVyICovCisJICAgICsrUmVkcmF3aW5nRGlzYWJsZWQ7CisJICAgIGRpc2FibGVkX3JlZHJhdyA9IFRSVUU7CisJICAgIHJldHVybiBGQUxTRTsJLyogcmVwZWF0IHRoZSBpbnNlcnQgKi8KKwl9CisJc3RvcF9pbnNlcnQoJmN1cndpbi0+d19jdXJzb3IsIFRSVUUpOworCXVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICB9CisKKyAgICAvKiBXaGVuIGFuIGF1dG9pbmRlbnQgd2FzIHJlbW92ZWQsIGN1cnN3YW50IHN0YXlzIGFmdGVyIHRoZQorICAgICAqIGluZGVudCAqLworICAgIGlmIChyZXN0YXJ0X2VkaXQgPT0gTlVMICYmIChjb2xucl9UKXRlbXAgPT0gY3Vyd2luLT53X2N1cnNvci5jb2wpCisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKKyAgICAvKiBSZW1lbWJlciB0aGUgbGFzdCBJbnNlcnQgcG9zaXRpb24gaW4gdGhlICdeIG1hcmsuICovCisgICAgaWYgKCFjbWRtb2Qua2VlcGp1bXBzKQorCWN1cmJ1Zi0+Yl9sYXN0X2luc2VydCA9IGN1cndpbi0+d19jdXJzb3I7CisKKyAgICAvKgorICAgICAqIFRoZSBjdXJzb3Igc2hvdWxkIGVuZCB1cCBvbiB0aGUgbGFzdCBpbnNlcnRlZCBjaGFyYWN0ZXIuCisgICAgICovCisgICAgaWYgKChjdXJ3aW4tPndfY3Vyc29yLmNvbCAhPSAwCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQl8fCBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDAKKyNlbmRpZgorCSkgJiYgKHJlc3RhcnRfZWRpdCA9PSBOVUwKKwkJfHwgKGdjaGFyX2N1cnNvcigpID09IE5VTAorI2lmZGVmIEZFQVRfVklTVUFMCisJCSAgICAmJiAhVklzdWFsX2FjdGl2ZQorI2VuZGlmCisJCSAgICApKQorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJICAgICYmICFyZXZpbnNfb24KKyNlbmRpZgorCQkJCSAgICAgICkKKyAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDAgfHwgdmVfZmxhZ3MgPT0gVkVfQUxMKQorCXsKKwkgICAgb25lbGVmdCgpOworCSAgICBpZiAocmVzdGFydF9lZGl0ICE9IE5VTCkKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZDsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICAtLWN1cndpbi0+d19jdXJzb3IuY29sOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgLyogQ29ycmVjdCBjdXJzb3IgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLworCSAgICBpZiAoaGFzX21ieXRlKQorCQltYl9hZGp1c3RfY3Vyc29yKCk7CisjZW5kaWYKKwl9CisgICAgfQorCisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKyAgICAvKiBEaXNhYmxlIElNIHRvIGFsbG93IHR5cGluZyBFbmdsaXNoIGRpcmVjdGx5IGZvciBOb3JtYWwgbW9kZSBjb21tYW5kcy4KKyAgICAgKiBXaGVuICI6bG1hcCIgaXMgZW5hYmxlZCBkb24ndCBjaGFuZ2UgJ2ltaW5zZXJ0JyAoSU0gY2FuIGJlIGVuYWJsZWQgYXMKKyAgICAgKiB3ZWxsKS4gKi8KKyAgICBpZiAoIShTdGF0ZSAmIExBTkdNQVApKQorCWltX3NhdmVfc3RhdHVzKCZjdXJidWYtPmJfcF9pbWluc2VydCk7CisgICAgaW1fc2V0X2FjdGl2ZShGQUxTRSk7CisjZW5kaWYKKworICAgIFN0YXRlID0gTk9STUFMOworICAgIC8qIG5lZWQgdG8gcG9zaXRpb24gY3Vyc29yIGFnYWluIChlLmcuIHdoZW4gb24gYSBUQUIgKSAqLworICAgIGNoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKTsKKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzZXRtb3VzZSgpOworI2VuZGlmCisjaWZkZWYgQ1VSU09SX1NIQVBFCisgICAgdWlfY3Vyc29yX3NoYXBlKCk7CQkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogV2hlbiByZWNvcmRpbmcgb3IgZm9yIENUUkwtTywgbmVlZCB0byBkaXNwbGF5IHRoZSBuZXcgbW9kZS4KKyAgICAgKiBPdGhlcndpc2UgcmVtb3ZlIHRoZSBtb2RlIG1lc3NhZ2UuCisgICAgICovCisgICAgaWYgKFJlY29yZGluZyB8fCByZXN0YXJ0X2VkaXQgIT0gTlVMKQorCXNob3dtb2RlKCk7CisgICAgZWxzZSBpZiAocF9zbWQpCisJTVNHKCIiKTsKKworICAgIHJldHVybiBUUlVFOwkgICAgLyogZXhpdCBJbnNlcnQgbW9kZSAqLworfQorCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKy8qCisgKiBUb2dnbGUgbGFuZ3VhZ2U6IGhrbWFwIGFuZCByZXZpbnNfb24uCisgKiBNb3ZlIHRvIGVuZCBvZiByZXZlcnNlIGluc2VydGVkIHRleHQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5zX2N0cmxfKCkKK3sKKyAgICBpZiAocmV2aW5zX29uICYmIHJldmluc19jaGFycyAmJiByZXZpbnNfc2NvbCA+PSAwKQorICAgIHsKKwl3aGlsZSAoZ2NoYXJfY3Vyc29yKCkgIT0gTlVMICYmIHJldmluc19jaGFycy0tKQorCSAgICArK2N1cndpbi0+d19jdXJzb3IuY29sOworICAgIH0KKyAgICBwX3JpID0gIXBfcmk7CisgICAgcmV2aW5zX29uID0gKFN0YXRlID09IElOU0VSVCAmJiBwX3JpKTsKKyAgICBpZiAocmV2aW5zX29uKQorICAgIHsKKwlyZXZpbnNfc2NvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCXJldmluc19sZWdhbCsrOworCXJldmluc19jaGFycyA9IDA7CisJdW5kaXNwbGF5X2RvbGxhcigpOworICAgIH0KKyAgICBlbHNlCisJcmV2aW5zX3Njb2wgPSAtMTsKKyNpZmRlZiBGRUFUX0ZLTUFQCisgICAgaWYgKHBfYWx0a2V5bWFwKQorICAgIHsKKwkvKgorCSAqIHRvIGJlIGNvbnNpc3RlbnQgYWxzbyBmb3IgcmVkbyBjb21tYW5kLCB1c2luZyAnLicKKwkgKiBzZXQgYXJyb3dfdXNlZCB0byB0cnVlIGFuZCBzdG9wIGl0IC0gY2F1c2luZyB0byByZWRvCisJICogY2hhcmFjdGVycyBlbnRlcmVkIGluIG9uZSBtb2RlIChub3JtYWwvcmV2ZXJzZSBpbnNlcnQpLgorCSAqLworCWFycm93X3VzZWQgPSBUUlVFOworCSh2b2lkKXN0b3BfYXJyb3coKTsKKwlwX2ZrbWFwID0gY3Vyd2luLT53X3BfcmwgXiBwX3JpOworCWlmIChwX2ZrbWFwICYmIHBfcmkpCisJICAgIFN0YXRlID0gSU5TRVJUOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlwX2hrbWFwID0gY3Vyd2luLT53X3BfcmwgXiBwX3JpOyAgICAvKiBiZSBjb25zaXN0ZW50ISAqLworICAgIHNob3dtb2RlKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklTVUFMCisvKgorICogSWYgJ2tleW1vZGVsJyBjb250YWlucyAic3RhcnRzZWwiLCBtYXkgc3RhcnQgc2VsZWN0aW9uLgorICogUmV0dXJucyBUUlVFIHdoZW4gYSBDVFJMLU8gYW5kIG90aGVyIGtleXMgc3R1ZmZlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19zdGFydF9zZWxlY3QoYykKKyAgICBpbnQJCWM7Cit7CisgICAgaWYgKGttX3N0YXJ0c2VsKQorCXN3aXRjaCAoYykKKwl7CisJICAgIGNhc2UgS19LSE9NRToKKwkgICAgY2FzZSBLX1hIT01FOgorCSAgICBjYXNlIEtfS0VORDoKKwkgICAgY2FzZSBLX1hFTkQ6CisJICAgIGNhc2UgS19QQUdFVVA6CisJICAgIGNhc2UgS19LUEFHRVVQOgorCSAgICBjYXNlIEtfUEFHRURPV046CisJICAgIGNhc2UgS19LUEFHRURPV046CisjIGlmZGVmIE1BQ09TCisJICAgIGNhc2UgS19MRUZUOgorCSAgICBjYXNlIEtfUklHSFQ6CisJICAgIGNhc2UgS19VUDoKKwkgICAgY2FzZSBLX0RPV046CisJICAgIGNhc2UgS19FTkQ6CisJICAgIGNhc2UgS19IT01FOgorIyBlbmRpZgorCQlpZiAoIShtb2RfbWFzayAmIE1PRF9NQVNLX1NISUZUKSkKKwkJICAgIGJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLworCSAgICBjYXNlIEtfU19MRUZUOgorCSAgICBjYXNlIEtfU19SSUdIVDoKKwkgICAgY2FzZSBLX1NfVVA6CisJICAgIGNhc2UgS19TX0RPV046CisJICAgIGNhc2UgS19TX0VORDoKKwkgICAgY2FzZSBLX1NfSE9NRToKKwkJLyogU3RhcnQgc2VsZWN0aW9uIHJpZ2h0IGF3YXksIHRoZSBjdXJzb3IgY2FuIG1vdmUgd2l0aAorCQkgKiBDVFJMLU8gd2hlbiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJc3RhcnRfc2VsZWN0aW9uKCk7CisKKwkJLyogRXhlY3V0ZSB0aGUga2V5IGluIChpbnNlcnQpIFNlbGVjdCBtb2RlLiAqLworCQlzdHVmZmNoYXJSZWFkYnVmZihDdHJsX08pOworCQlpZiAobW9kX21hc2spCisJCXsKKwkJICAgIGNoYXJfdQkgICAgYnVmWzRdOworCisJCSAgICBidWZbMF0gPSBLX1NQRUNJQUw7CisJCSAgICBidWZbMV0gPSBLU19NT0RJRklFUjsKKwkJICAgIGJ1ZlsyXSA9IG1vZF9tYXNrOworCQkgICAgYnVmWzNdID0gTlVMOworCQkgICAgc3R1ZmZSZWFkYnVmZihidWYpOworCQl9CisJCXN0dWZmY2hhclJlYWRidWZmKGMpOworCQlyZXR1cm4gVFJVRTsKKwl9CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCisKKy8qCisgKiBJZiB0aGUgY3Vyc29yIGlzIG9uIGFuIGluZGVudCwgXlQvXkQgaW5zZXJ0L2RlbGV0ZSBvbmUKKyAqIHNoaWZ0d2lkdGguCU90aGVyd2lzZSBeVC9eRCBiZWhhdmUgbGlrZSBhICI8PCIgb3IgIj4+Ii4KKyAqIEFsd2F5cyByb3VuZCB0aGUgaW5kZW50IHRvICdzaGlmdHdpdGgnLCB0aGlzIGlzIGNvbXBhdGlibGUKKyAqIHdpdGggdmkuICBCdXQgdmkgb25seSBzdXBwb3J0cyBeVCBhbmQgXkQgYWZ0ZXIgYW4KKyAqIGF1dG9pbmRlbnQsIHdlIHN1cHBvcnQgaXQgZXZlcnl3aGVyZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNfc2hpZnQoYywgbGFzdGMpCisgICAgaW50CSAgICBjOworICAgIGludAkgICAgbGFzdGM7Cit7CisgICAgaWYgKHN0b3BfYXJyb3coKSA9PSBGQUlMKQorCXJldHVybjsKKyAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZihjKTsKKworICAgIC8qCisgICAgICogMF5EIGFuZCBeXkQ6IHJlbW92ZSBhbGwgaW5kZW50LgorICAgICAqLworICAgIGlmICgobGFzdGMgPT0gJzAnIHx8IGxhc3RjID09ICdeJykgJiYgY3Vyd2luLT53X2N1cnNvci5jb2wpCisgICAgeworCS0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisJKHZvaWQpZGVsX2NoYXIoRkFMU0UpOwkJLyogZGVsZXRlIHRoZSAnXicgb3IgJzAnICovCisJLyogSW4gUmVwbGFjZSBtb2RlLCByZXN0b3JlIHRoZSBjaGFyYWN0ZXJzIHRoYXQgJ14nIG9yICcwJyByZXBsYWNlZC4gKi8KKwlpZiAoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCisJICAgIHJlcGxhY2VfcG9wX2lucygpOworCWlmIChsYXN0YyA9PSAnXicpCisJICAgIG9sZF9pbmRlbnQgPSBnZXRfaW5kZW50KCk7CS8qIHJlbWVtYmVyIGN1cnIuIGluZGVudCAqLworCWNoYW5nZV9pbmRlbnQoSU5ERU5UX1NFVCwgMCwgVFJVRSwgMCk7CisgICAgfQorICAgIGVsc2UKKwljaGFuZ2VfaW5kZW50KGMgPT0gQ3RybF9EID8gSU5ERU5UX0RFQyA6IElOREVOVF9JTkMsIDAsIFRSVUUsIDApOworCisgICAgaWYgKGRpZF9haSAmJiAqc2tpcHdoaXRlKG1sX2dldF9jdXJsaW5lKCkpICE9IE5VTCkKKwlkaWRfYWkgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisgICAgZGlkX3NpID0gRkFMU0U7CisgICAgY2FuX3NpID0gRkFMU0U7CisgICAgY2FuX3NpX2JhY2sgPSBGQUxTRTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0lOREVOVAorICAgIGNhbl9jaW5kZW50ID0gRkFMU0U7CS8qIG5vIGNpbmRlbnRpbmcgYWZ0ZXIgXkQgb3IgXlQgKi8KKyNlbmRpZgorfQorCisgICAgc3RhdGljIHZvaWQKK2luc19kZWwoKQoreworICAgIGludAkgICAgdGVtcDsKKworICAgIGlmIChzdG9wX2Fycm93KCkgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgaWYgKGdjaGFyX2N1cnNvcigpID09IE5VTCkJCS8qIGRlbGV0ZSBuZXdsaW5lICovCisgICAgeworCXRlbXAgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwlpZiAoIWNhbl9icyhCU19FT0wpCQkvKiBvbmx5IGlmICJlb2wiIGluY2x1ZGVkICovCisJCXx8IHVfc2F2ZSgobGluZW5yX1QpKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpLAorCQkgICAgKGxpbmVucl9UKShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyAyKSkgPT0gRkFJTAorCQl8fCBkb19qb2luKEZBTFNFKSA9PSBGQUlMKQorCSAgICB2aW1fYmVlcCgpOworCWVsc2UKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSB0ZW1wOworICAgIH0KKyAgICBlbHNlIGlmIChkZWxfY2hhcihGQUxTRSkgPT0gRkFJTCkJLyogZGVsZXRlIGNoYXIgdW5kZXIgY3Vyc29yICovCisJdmltX2JlZXAoKTsKKyAgICBkaWRfYWkgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisgICAgZGlkX3NpID0gRkFMU0U7CisgICAgY2FuX3NpID0gRkFMU0U7CisgICAgY2FuX3NpX2JhY2sgPSBGQUxTRTsKKyNlbmRpZgorICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKEtfREVMKTsKK30KKworLyoKKyAqIEhhbmRsZSBCYWNrc3BhY2UsIGRlbGV0ZS13b3JkIGFuZCBkZWxldGUtbGluZSBpbiBJbnNlcnQgbW9kZS4KKyAqIFJldHVybiBUUlVFIHdoZW4gYmFja3NwYWNlIHdhcyBhY3R1YWxseSB1c2VkLgorICovCisgICAgc3RhdGljIGludAoraW5zX2JzKGMsIG1vZGUsIGluc2VydGVkX3NwYWNlX3ApCisgICAgaW50CQljOworICAgIGludAkJbW9kZTsKKyAgICBpbnQJCSppbnNlcnRlZF9zcGFjZV9wOworeworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQljYzsKKyAgICBpbnQJCXRlbXAgPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisgICAgY29sbnJfVAltaW5jb2w7CisgICAgaW50CQlkaWRfYmFja3NwYWNlID0gRkFMU0U7CisgICAgaW50CQlpbl9pbmRlbnQ7CisgICAgaW50CQlvbGRTdGF0ZTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlwMSwgcDI7CisjZW5kaWYKKworICAgIC8qCisgICAgICogY2FuJ3QgZGVsZXRlIGFueXRoaW5nIGluIGFuIGVtcHR5IGZpbGUKKyAgICAgKiBjYW4ndCBiYWNrdXAgcGFzdCBmaXJzdCBjaGFyYWN0ZXIgaW4gYnVmZmVyCisgICAgICogY2FuJ3QgYmFja3VwIHBhc3Qgc3RhcnRpbmcgcG9pbnQgdW5sZXNzICdiYWNrc3BhY2UnID4gMQorICAgICAqIGNhbiBiYWNrdXAgdG8gYSBwcmV2aW91cyBsaW5lIGlmICdiYWNrc3BhY2UnID09IDAKKyAgICAgKi8KKyAgICBpZiAoICAgICAgIGJ1ZmVtcHR5KCkKKwkgICAgfHwgKAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCSFyZXZpbnNfb24gJiYKKyNlbmRpZgorCQkoKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSAxICYmIGN1cndpbi0+d19jdXJzb3IuY29sID09IDApCisJCSAgICB8fCAoIWNhbl9icyhCU19TVEFSVCkKKwkJCSYmIChhcnJvd191c2VkCisJCQkgICAgfHwgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBJbnNzdGFydC5sbnVtCisJCQkJJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPD0gSW5zc3RhcnQuY29sKSkpCisJCSAgICB8fCAoIWNhbl9icyhCU19JTkRFTlQpICYmICFhcnJvd191c2VkICYmIGFpX2NvbCA+IDAKKwkJCQkJICYmIGN1cndpbi0+d19jdXJzb3IuY29sIDw9IGFpX2NvbCkKKwkJICAgIHx8ICghY2FuX2JzKEJTX0VPTCkgJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCkpKSkKKyAgICB7CisJdmltX2JlZXAoKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0b3BfYXJyb3coKSA9PSBGQUlMKQorCXJldHVybiBGQUxTRTsKKyAgICBpbl9pbmRlbnQgPSBpbmluZGVudCgwKTsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKyAgICBpZiAoaW5faW5kZW50KQorCWNhbl9jaW5kZW50ID0gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgZW5kX2NvbW1lbnRfcGVuZGluZyA9IE5VTDsJLyogQWZ0ZXIgQlMsIGRvbid0IGF1dG8tZW5kIGNvbW1lbnQgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgaWYgKHJldmluc19vbikJICAgIC8qIHB1dCBjdXJzb3IgYWZ0ZXIgbGFzdCBpbnNlcnRlZCBjaGFyICovCisJaW5jX2N1cnNvcigpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgLyogVmlydHVhbGVkaXQ6CisgICAgICoJQkFDS1NQQUNFX0NIQVIgZWF0cyBhIHZpcnR1YWwgc3BhY2UKKyAgICAgKglCQUNLU1BBQ0VfV09SRCBlYXRzIGFsbCBjb2xhZGQKKyAgICAgKglCQUNLU1BBQ0VfTElORSBlYXRzIGFsbCBjb2xhZGQgYW5kIGtlZXBzIGdvaW5nCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sYWRkID4gMCkKKyAgICB7CisJaWYgKG1vZGUgPT0gQkFDS1NQQUNFX0NIQVIpCisJeworCSAgICAtLWN1cndpbi0+d19jdXJzb3IuY29sYWRkOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJaWYgKG1vZGUgPT0gQkFDS1NQQUNFX1dPUkQpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisJICAgIHJldHVybiBUUlVFOworCX0KKwljdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIGRlbGV0ZSBuZXdsaW5lIQorICAgICAqLworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA9PSAwKQorICAgIHsKKwlsbnVtID0gSW5zc3RhcnQubG51bTsKKwlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID09IEluc3N0YXJ0LmxudW0KKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJfHwgcmV2aW5zX29uCisjZW5kaWYKKwkJCQkgICAgKQorCXsKKwkgICAgaWYgKHVfc2F2ZSgobGluZW5yX1QpKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDIpLAorCQkJICAgICAgIChsaW5lbnJfVCkoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSkpID09IEZBSUwpCisJCXJldHVybiBGQUxTRTsKKwkgICAgLS1JbnNzdGFydC5sbnVtOworCSAgICBJbnNzdGFydC5jb2wgPSBNQVhDT0w7CisJfQorCS8qCisJICogSW4gcmVwbGFjZSBtb2RlOgorCSAqIGNjIDwgMDogTkwgd2FzIGluc2VydGVkLCBkZWxldGUgaXQKKwkgKiBjYyA+PSAwOiBOTCB3YXMgcmVwbGFjZWQsIHB1dCBvcmlnaW5hbCBjaGFyYWN0ZXJzIGJhY2sKKwkgKi8KKwljYyA9IC0xOworCWlmIChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKwkgICAgY2MgPSByZXBsYWNlX3BvcCgpOwkgICAgLyogcmV0dXJucyAtMSBpZiBOTCB3YXMgaW5zZXJ0ZWQgKi8KKwkvKgorCSAqIEluIHJlcGxhY2UgbW9kZSwgaW4gdGhlIGxpbmUgd2Ugc3RhcnRlZCByZXBsYWNpbmcsIHdlIG9ubHkgbW92ZSB0aGUKKwkgKiBjdXJzb3IuCisJICovCisJaWYgKChTdGF0ZSAmIFJFUExBQ0VfRkxBRykgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtIDw9IGxudW0pCisJeworCSAgICBkZWNfY3Vyc29yKCk7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBpZiAoIShTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJCQkJICAgfHwgY3Vyd2luLT53X2N1cnNvci5sbnVtID4gb3JpZ19saW5lX2NvdW50KQorI2VuZGlmCisJICAgIHsKKwkJdGVtcCA9IGdjaGFyX2N1cnNvcigpOwkvKiByZW1lbWJlciBjdXJyZW50IGNoYXIgKi8KKwkJLS1jdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCSh2b2lkKWRvX2pvaW4oRkFMU0UpOworCQlpZiAodGVtcCA9PSBOVUwgJiYgZ2NoYXJfY3Vyc29yKCkgIT0gTlVMKQorCQkgICAgaW5jX2N1cnNvcigpOworCSAgICB9CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBlbHNlCisJCWRlY19jdXJzb3IoKTsKKyNlbmRpZgorCisJICAgIC8qCisJICAgICAqIEluIFJFUExBQ0UgbW9kZSB3ZSBoYXZlIHRvIHB1dCBiYWNrIHRoZSB0ZXh0IHRoYXQgd2FzIHJlcGxhY2VkCisJICAgICAqIGJ5IHRoZSBOTC4gT24gdGhlIHJlcGxhY2Ugc3RhY2sgaXMgZmlyc3QgYSBOVUwtdGVybWluYXRlZAorCSAgICAgKiBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBkZWxldGVkIGFuZCB0aGVuIHRoZQorCSAgICAgKiBjaGFyYWN0ZXJzIHRoYXQgTkwgcmVwbGFjZWQuCisJICAgICAqLworCSAgICBpZiAoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCisJICAgIHsKKwkJLyoKKwkJICogRG8gdGhlIG5leHQgaW5zX2NoYXIoKSBpbiBOT1JNQUwgc3RhdGUsIHRvCisJCSAqIHByZXZlbnQgaW5zX2NoYXIoKSBmcm9tIHJlcGxhY2luZyBjaGFyYWN0ZXJzIGFuZAorCQkgKiBhdm9pZGluZyBzaG93bWF0Y2goKS4KKwkJICovCisJCW9sZFN0YXRlID0gU3RhdGU7CisJCVN0YXRlID0gTk9STUFMOworCQkvKgorCQkgKiByZXN0b3JlIGNoYXJhY3RlcnMgKGJsYW5rcykgZGVsZXRlZCBhZnRlciBjdXJzb3IKKwkJICovCisJCXdoaWxlIChjYyA+IDApCisJCXsKKwkJICAgIHRlbXAgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBtYl9yZXBsYWNlX3BvcF9pbnMoY2MpOworI2Vsc2UKKwkJICAgIGluc19jaGFyKGNjKTsKKyNlbmRpZgorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSB0ZW1wOworCQkgICAgY2MgPSByZXBsYWNlX3BvcCgpOworCQl9CisJCS8qIHJlc3RvcmUgdGhlIGNoYXJhY3RlcnMgdGhhdCBOTCByZXBsYWNlZCAqLworCQlyZXBsYWNlX3BvcF9pbnMoKTsKKwkJU3RhdGUgPSBvbGRTdGF0ZTsKKwkgICAgfQorCX0KKwlkaWRfYWkgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIERlbGV0ZSBjaGFyYWN0ZXIocykgYmVmb3JlIHRoZSBjdXJzb3IuCisJICovCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwlpZiAocmV2aW5zX29uKQkJLyogcHV0IGN1cnNvciBvbiBsYXN0IGluc2VydGVkIGNoYXIgKi8KKwkgICAgZGVjX2N1cnNvcigpOworI2VuZGlmCisJbWluY29sID0gMDsKKwkJCQkJCS8qIGtlZXAgaW5kZW50ICovCisJaWYgKG1vZGUgPT0gQkFDS1NQQUNFX0xJTkUgJiYgY3VyYnVmLT5iX3BfYWkKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkmJiAhcmV2aW5zX29uCisjZW5kaWYKKwkJCSAgICApCisJeworCSAgICB0ZW1wID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIGJlZ2lubGluZShCTF9XSElURSk7CisJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA8IChjb2xucl9UKXRlbXApCisJCW1pbmNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHRlbXA7CisJfQorCisJLyoKKwkgKiBIYW5kbGUgZGVsZXRpbmcgb25lICdzaGlmdHdpZHRoJyBvciAnc29mdHRhYnN0b3AnLgorCSAqLworCWlmICgJICAgbW9kZSA9PSBCQUNLU1BBQ0VfQ0hBUgorCQkmJiAoKHBfc3RhICYmIGluX2luZGVudCkKKwkJICAgIHx8IChjdXJidWYtPmJfcF9zdHMKKwkJCSYmICgqKG1sX2dldF9jdXJzb3IoKSAtIDEpID09IFRBQgorCQkJICAgIHx8ICgqKG1sX2dldF9jdXJzb3IoKSAtIDEpID09ICcgJworCQkJCSYmICghKmluc2VydGVkX3NwYWNlX3AKKwkJCQkgICAgfHwgYXJyb3dfdXNlZCkpKSkpKQorCXsKKwkgICAgaW50CQl0czsKKwkgICAgY29sbnJfVAl2Y29sOworCSAgICBjb2xucl9UCXdhbnRfdmNvbDsKKwkgICAgaW50CQlleHRyYSA9IDA7CisKKwkgICAgKmluc2VydGVkX3NwYWNlX3AgPSBGQUxTRTsKKwkgICAgaWYgKHBfc3RhKQorCQl0cyA9IGN1cmJ1Zi0+Yl9wX3N3OworCSAgICBlbHNlCisJCXRzID0gY3VyYnVmLT5iX3Bfc3RzOworCSAgICAvKiBDb21wdXRlIHRoZSB2aXJ0dWFsIGNvbHVtbiB3aGVyZSB3ZSB3YW50IHRvIGJlLiAgU2luY2UKKwkgICAgICogJ3Nob3dicmVhaycgbWF5IGdldCBpbiB0aGUgd2F5LCBuZWVkIHRvIGdldCB0aGUgbGFzdCBjb2x1bW4gb2YKKwkgICAgICogdGhlIHByZXZpb3VzIGNoYXJhY3Rlci4gKi8KKwkgICAgZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmdmNvbCwgTlVMTCwgTlVMTCk7CisJICAgIGRlY19jdXJzb3IoKTsKKwkgICAgZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCBOVUxMLCBOVUxMLCAmd2FudF92Y29sKTsKKwkgICAgaW5jX2N1cnNvcigpOworCSAgICB3YW50X3Zjb2wgPSAod2FudF92Y29sIC8gdHMpICogdHM7CisKKwkgICAgLyogZGVsZXRlIGNoYXJhY3RlcnMgdW50aWwgd2UgYXJlIGF0IG9yIGJlZm9yZSB3YW50X3Zjb2wgKi8KKwkgICAgd2hpbGUgKHZjb2wgPiB3YW50X3Zjb2wKKwkJICAgICYmIChjYyA9ICoobWxfZ2V0X2N1cnNvcigpIC0gMSksIHZpbV9pc3doaXRlKGNjKSkpCisJICAgIHsKKwkJZGVjX2N1cnNvcigpOworCQlnZXR2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZ2Y29sLCBOVUxMLCBOVUxMKTsKKwkJaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCQl7CisJCSAgICAvKiBEb24ndCBkZWxldGUgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGluc2VydCBwb2ludCB3aGVuIGluCisJCSAgICAgKiBSZXBsYWNlIG1vZGUgKi8KKwkJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gSW5zc3RhcnQubG51bQorCQkJICAgIHx8IGN1cndpbi0+d19jdXJzb3IuY29sID49IEluc3N0YXJ0LmNvbCkKKwkJICAgIHsKKyNpZiAwCS8qIHdoYXQgd2FzIHRoaXMgZm9yPyAgSXQgY2F1c2VzIHByb2JsZW1zIHdoZW4gc3cgIT0gdHMuICovCisJCQlpZiAoU3RhdGUgPT0gUkVQTEFDRSAmJiAoaW50KXZjb2wgPCB3YW50X3Zjb2wpCisJCQl7CisJCQkgICAgKHZvaWQpZGVsX2NoYXIoRkFMU0UpOworCQkJICAgIGV4dHJhID0gMjsJLyogZG9uJ3QgcG9wIHRvbyBtdWNoICovCisJCQl9CisJCQllbHNlCisjZW5kaWYKKwkJCSAgICByZXBsYWNlX2RvX2JzKCk7CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQkgICAgKHZvaWQpZGVsX2NoYXIoRkFMU0UpOworCSAgICB9CisKKwkgICAgLyogaW5zZXJ0IGV4dHJhIHNwYWNlcyB1bnRpbCB3ZSBhcmUgYXQgd2FudF92Y29sICovCisJICAgIHdoaWxlICh2Y29sIDwgd2FudF92Y29sKQorCSAgICB7CisJCS8qIFJlbWVtYmVyIHRoZSBmaXJzdCBjaGFyIHdlIGluc2VydGVkICovCisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gSW5zc3RhcnQubG51bQorCQkJCSAgICYmIGN1cndpbi0+d19jdXJzb3IuY29sIDwgSW5zc3RhcnQuY29sKQorCQkgICAgSW5zc3RhcnQuY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJCWlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJCSAgICBpbnNfY2hhcignICcpOworCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgaW5zX3N0cigoY2hhcl91ICopIiAiKTsKKwkJICAgIGlmICgoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpICYmIGV4dHJhIDw9IDEpCisJCSAgICB7CisJCQlpZiAoZXh0cmEpCisJCQkgICAgcmVwbGFjZV9wdXNoX29mZihOVUwpOworCQkJZWxzZQorCQkJICAgIHJlcGxhY2VfcHVzaChOVUwpOworCQkgICAgfQorCQkgICAgaWYgKGV4dHJhID09IDIpCisJCQlleHRyYSA9IDE7CisJCX0KKwkJZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmdmNvbCwgTlVMTCwgTlVMTCk7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIERlbGV0ZSB1cHRvIHN0YXJ0aW5nIHBvaW50LCBzdGFydCBvZiBsaW5lIG9yIHByZXZpb3VzIHdvcmQuCisJICovCisJZWxzZSBkbworCXsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICBpZiAoIXJldmluc19vbikgLyogcHV0IGN1cnNvciBvbiBjaGFyIHRvIGJlIGRlbGV0ZWQgKi8KKyNlbmRpZgorCQlkZWNfY3Vyc29yKCk7CisKKwkgICAgLyogc3RhcnQgb2Ygd29yZD8gKi8KKwkgICAgaWYgKG1vZGUgPT0gQkFDS1NQQUNFX1dPUkQgJiYgIXZpbV9pc3NwYWNlKGdjaGFyX2N1cnNvcigpKSkKKwkgICAgeworCQltb2RlID0gQkFDS1NQQUNFX1dPUkRfTk9UX1NQQUNFOworCQl0ZW1wID0gdmltX2lzd29yZGMoZ2NoYXJfY3Vyc29yKCkpOworCSAgICB9CisJICAgIC8qIGVuZCBvZiB3b3JkPyAqLworCSAgICBlbHNlIGlmIChtb2RlID09IEJBQ0tTUEFDRV9XT1JEX05PVF9TUEFDRQorCQkgICAgJiYgKHZpbV9pc3NwYWNlKGNjID0gZ2NoYXJfY3Vyc29yKCkpCisJCQkgICAgfHwgdmltX2lzd29yZGMoY2MpICE9IHRlbXApKQorCSAgICB7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJaWYgKCFyZXZpbnNfb24pCisjZW5kaWYKKwkJICAgIGluY19jdXJzb3IoKTsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQllbHNlIGlmIChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKwkJICAgIGRlY19jdXJzb3IoKTsKKyNlbmRpZgorCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCisJCXJlcGxhY2VfZG9fYnMoKTsKKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoZW5jX3V0ZjggJiYgcF9kZWNvKQorCQkgICAgKHZvaWQpdXRmY19wdHIyY2hhcihtbF9nZXRfY3Vyc29yKCksICZwMSwgJnAyKTsKKyNlbmRpZgorCQkodm9pZClkZWxfY2hhcihGQUxTRSk7CisjaWZkZWYgRkVBVF9NQllURQorCQkvKgorCQkgKiBJZiBwMSBvciBwMiBpcyBub24temVybywgdGhlcmUgYXJlIGNvbWJpbmluZyBjaGFyYWN0ZXJzIHdlCisJCSAqIG5lZWQgdG8gdGFrZSBhY2NvdW50IG9mLiAgRG9uJ3QgYmFjayB1cCBiZWZvcmUgdGhlIGJhc2UKKwkJICogY2hhcmFjdGVyLgorCQkgKi8KKwkJaWYgKGVuY191dGY4ICYmIHBfZGVjbyAmJiAocDEgIT0gTlVMIHx8IHAyICE9IE5VTCkpCisJCSAgICBpbmNfY3Vyc29yKCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlpZiAocmV2aW5zX2NoYXJzKQorCQl7CisJCSAgICByZXZpbnNfY2hhcnMtLTsKKwkJICAgIHJldmluc19sZWdhbCsrOworCQl9CisJCWlmIChyZXZpbnNfb24gJiYgZ2NoYXJfY3Vyc29yKCkgPT0gTlVMKQorCQkgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgfQorCSAgICAvKiBKdXN0IGEgc2luZ2xlIGJhY2tzcGFjZT86ICovCisJICAgIGlmIChtb2RlID09IEJBQ0tTUEFDRV9DSEFSKQorCQlicmVhazsKKwl9IHdoaWxlICgKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlyZXZpbnNfb24gfHwKKyNlbmRpZgorCQkoY3Vyd2luLT53X2N1cnNvci5jb2wgPiBtaW5jb2wKKwkJICYmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gSW5zc3RhcnQubG51bQorCQkgICAgIHx8IGN1cndpbi0+d19jdXJzb3IuY29sICE9IEluc3N0YXJ0LmNvbCkpKTsKKwlkaWRfYmFja3NwYWNlID0gVFJVRTsKKyAgICB9CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorICAgIGRpZF9zaSA9IEZBTFNFOworICAgIGNhbl9zaSA9IEZBTFNFOworICAgIGNhbl9zaV9iYWNrID0gRkFMU0U7CisjZW5kaWYKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPD0gMSkKKwlkaWRfYWkgPSBGQUxTRTsKKyAgICAvKgorICAgICAqIEl0J3MgYSBsaXR0bGUgc3RyYW5nZSB0byBwdXQgYmFja3NwYWNlcyBpbnRvIHRoZSByZWRvCisgICAgICogYnVmZmVyLCBidXQgaXQgbWFrZXMgYXV0by1pbmRlbnQgYSBsb3QgZWFzaWVyIHRvIGRlYWwKKyAgICAgKiB3aXRoLgorICAgICAqLworICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKGMpOworCisgICAgLyogSWYgZGVsZXRlZCBiZWZvcmUgdGhlIGluc2VydGlvbiBwb2ludCwgYWRqdXN0IGl0ICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBJbnNzdGFydC5sbnVtCisJCQkJICAgICAgICYmIGN1cndpbi0+d19jdXJzb3IuY29sIDwgSW5zc3RhcnQuY29sKQorCUluc3N0YXJ0LmNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCisgICAgLyogdmkgYmVoYXZpb3VyOiB0aGUgY3Vyc29yIG1vdmVzIGJhY2t3YXJkIGJ1dCB0aGUgY2hhcmFjdGVyIHRoYXQKKyAgICAgKgkJICAgICB3YXMgdGhlcmUgcmVtYWlucyB2aXNpYmxlCisgICAgICogVmltIGJlaGF2aW91cjogdGhlIGN1cnNvciBtb3ZlcyBiYWNrd2FyZCBhbmQgdGhlIGNoYXJhY3RlciB0aGF0CisgICAgICoJCSAgICAgIHdhcyB0aGVyZSBpcyBlcmFzZWQgZnJvbSB0aGUgc2NyZWVuLgorICAgICAqIFdlIGNhbiBlbXVsYXRlIHRoZSB2aSBiZWhhdmlvdXIgYnkgcHJldGVuZGluZyB0aGVyZSBpcyBhIGRvbGxhcgorICAgICAqIGRpc3BsYXllZCBldmVuIHdoZW4gdGhlcmUgaXNuJ3QuCisgICAgICogIC0tcGt2IFN1biBKYW4gMTkgMDE6NTY6NDAgRVNUIDIwMDMgKi8KKyAgICBpZiAodmltX3N0cmNocihwX2NwbywgQ1BPX0JBQ0tTUEFDRSkgIT0gTlVMTCAmJiBkb2xsYXJfdmNvbCA9PSAwKQorCWRvbGxhcl92Y29sID0gY3Vyd2luLT53X3ZpcnRjb2w7CisKKyAgICByZXR1cm4gZGlkX2JhY2tzcGFjZTsKK30KKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzdGF0aWMgdm9pZAoraW5zX21vdXNlKGMpCisgICAgaW50CSAgICBjOworeworICAgIHBvc19UCXRwb3M7CisKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBXaGVuIEdVSSBpcyBhY3RpdmUsIGFsc28gbW92ZS9wYXN0ZSB3aGVuICdtb3VzZScgaXMgZW1wdHkgKi8KKyAgICBpZiAoIWd1aS5pbl91c2UpCisjIGVuZGlmCisJaWYgKCFtb3VzZV9oYXMoTU9VU0VfSU5TRVJUKSkKKwkgICAgcmV0dXJuOworCisgICAgdW5kaXNwbGF5X2RvbGxhcigpOworICAgIHRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGlmIChkb19tb3VzZShOVUxMLCBjLCBCQUNLV0FSRCwgMUwsIDApKQorICAgIHsKKwlzdGFydF9hcnJvdygmdHBvcyk7CisjIGlmZGVmIEZFQVRfQ0lOREVOVAorCWNhbl9jaW5kZW50ID0gVFJVRTsKKyMgZW5kaWYKKyAgICB9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICAvKiByZWRyYXcgc3RhdHVzIGxpbmVzIChpbiBjYXNlIGFub3RoZXIgd2luZG93IGJlY2FtZSBhY3RpdmUpICovCisgICAgcmVkcmF3X3N0YXR1c2xpbmVzKCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyB2b2lkCitpbnNfbW91c2VzY3JvbGwodXApCisgICAgaW50CQl1cDsKK3sKKyAgICBwb3NfVAl0cG9zOworIyBpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykKKyAgICB3aW5fVAkqb2xkX2N1cndpbjsKKyMgZW5kaWYKKworICAgIHRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoRkVBVF9XSU5ET1dTKQorICAgIG9sZF9jdXJ3aW4gPSBjdXJ3aW47CisKKyAgICAvKiBDdXJyZW50bHkgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFyZSBvbmx5IGtub3duIGluIHRoZSBHVUkuICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgbW91c2Vfcm93ID49IDAgJiYgbW91c2VfY29sID49IDApCisgICAgeworCWludCByb3csIGNvbDsKKworCXJvdyA9IG1vdXNlX3JvdzsKKwljb2wgPSBtb3VzZV9jb2w7CisKKwkvKiBmaW5kIHRoZSB3aW5kb3cgYXQgdGhlIHBvaW50ZXIgY29vcmRpbmF0ZXMgKi8KKwljdXJ3aW4gPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKwljdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworICAgIH0KKyAgICBpZiAoY3Vyd2luID09IG9sZF9jdXJ3aW4pCisjIGVuZGlmCisJdW5kaXNwbGF5X2RvbGxhcigpOworCisgICAgaWYgKG1vZF9tYXNrICYgKE1PRF9NQVNLX1NISUZUIHwgTU9EX01BU0tfQ1RSTCkpCisJc2Nyb2xsX3JlZHJhdyh1cCwgKGxvbmcpKGN1cndpbi0+d19ib3RsaW5lIC0gY3Vyd2luLT53X3RvcGxpbmUpKTsKKyAgICBlbHNlCisJc2Nyb2xsX3JlZHJhdyh1cCwgM0wpOworCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoRkVBVF9XSU5ET1dTKQorICAgIGN1cndpbi0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisKKyAgICBjdXJ3aW4gPSBvbGRfY3Vyd2luOworICAgIGN1cmJ1ZiA9IGN1cndpbi0+d19idWZmZXI7CisjIGVuZGlmCisKKyAgICBpZiAoIWVxdWFscG9zKGN1cndpbi0+d19jdXJzb3IsIHRwb3MpKQorICAgIHsKKwlzdGFydF9hcnJvdygmdHBvcyk7CisjIGlmZGVmIEZFQVRfQ0lOREVOVAorCWNhbl9jaW5kZW50ID0gVFJVRTsKKyMgZW5kaWYKKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisgICAgdm9pZAoraW5zX3Njcm9sbCgpCit7CisgICAgcG9zX1QJdHBvczsKKworICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICB0cG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoZ3VpX2RvX3Njcm9sbCgpKQorICAgIHsKKwlzdGFydF9hcnJvdygmdHBvcyk7CisjIGlmZGVmIEZFQVRfQ0lOREVOVAorCWNhbl9jaW5kZW50ID0gVFJVRTsKKyMgZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCitpbnNfaG9yc2Nyb2xsKCkKK3sKKyAgICBwb3NfVAl0cG9zOworCisgICAgdW5kaXNwbGF5X2RvbGxhcigpOworICAgIHRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGlmIChndWlfZG9faG9yaXpfc2Nyb2xsKCkpCisgICAgeworCXN0YXJ0X2Fycm93KCZ0cG9zKTsKKyMgaWZkZWYgRkVBVF9DSU5ERU5UCisJY2FuX2NpbmRlbnQgPSBUUlVFOworIyBlbmRpZgorICAgIH0KK30KKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQKK2luc19sZWZ0KCkKK3sKKyAgICBwb3NfVAl0cG9zOworCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKChmZG9fZmxhZ3MgJiBGRE9fSE9SKSAmJiBLZXlUeXBlZCkKKwlmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisgICAgdW5kaXNwbGF5X2RvbGxhcigpOworICAgIHRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGlmIChvbmVsZWZ0KCkgPT0gT0spCisgICAgeworCXN0YXJ0X2Fycm93KCZ0cG9zKTsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCS8qIElmIGV4aXQgcmV2ZXJzZWQgc3RyaW5nLCBwb3NpdGlvbiBpcyBmaXhlZCAqLworCWlmIChyZXZpbnNfc2NvbCAhPSAtMSAmJiAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sID49IHJldmluc19zY29sKQorCSAgICByZXZpbnNfbGVnYWwrKzsKKwlyZXZpbnNfY2hhcnMrKzsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogaWYgJ3doaWNod3JhcCcgc2V0IGZvciBjdXJzb3IgaW4gaW5zZXJ0IG1vZGUgbWF5IGdvIHRvCisgICAgICogcHJldmlvdXMgbGluZQorICAgICAqLworICAgIGVsc2UgaWYgKHZpbV9zdHJjaHIocF93dywgJ1snKSAhPSBOVUxMICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisgICAgeworCXN0YXJ0X2Fycm93KCZ0cG9zKTsKKwktLShjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCWNvbGFkdmFuY2UoKGNvbG5yX1QpTUFYQ09MKTsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsJLyogc28gd2Ugc3RheSBhdCB0aGUgZW5kICovCisgICAgfQorICAgIGVsc2UKKwl2aW1fYmVlcCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK2luc19ob21lKGMpCisgICAgaW50CQljOworeworICAgIHBvc19UCXRwb3M7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoKGZkb19mbGFncyAmIEZET19IT1IpICYmIEtleVR5cGVkKQorCWZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKyAgICB1bmRpc3BsYXlfZG9sbGFyKCk7CisgICAgdHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKGMgPT0gS19DX0hPTUUpCisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gMTsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorICAgIGN1cndpbi0+d19jdXJzd2FudCA9IDA7CisgICAgc3RhcnRfYXJyb3coJnRwb3MpOworfQorCisgICAgc3RhdGljIHZvaWQKK2luc19lbmQoYykKKyAgICBpbnQJCWM7Cit7CisgICAgcG9zX1QJdHBvczsKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICgoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQpCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICB0cG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoYyA9PSBLX0NfRU5EKQorCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIGNvbGFkdmFuY2UoKGNvbG5yX1QpTUFYQ09MKTsKKyAgICBjdXJ3aW4tPndfY3Vyc3dhbnQgPSBNQVhDT0w7CisKKyAgICBzdGFydF9hcnJvdygmdHBvcyk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW5zX3NfbGVmdCgpCit7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKChmZG9fZmxhZ3MgJiBGRE9fSE9SKSAmJiBLZXlUeXBlZCkKKwlmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisgICAgdW5kaXNwbGF5X2RvbGxhcigpOworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxIHx8IGN1cndpbi0+d19jdXJzb3IuY29sID4gMCkKKyAgICB7CisJc3RhcnRfYXJyb3coJmN1cndpbi0+d19jdXJzb3IpOworCSh2b2lkKWJja193b3JkKDFMLCBGQUxTRSwgRkFMU0UpOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisJdmltX2JlZXAoKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitpbnNfcmlnaHQoKQoreworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICgoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQpCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICBpZiAoZ2NoYXJfY3Vyc29yKCkgIT0gTlVMIHx8IHZpcnR1YWxfYWN0aXZlKCkKKwkgICAgKQorICAgIHsKKwlzdGFydF9hcnJvdygmY3Vyd2luLT53X2N1cnNvcik7CisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmICh2aXJ0dWFsX2FjdGl2ZSgpKQorCSAgICBvbmVyaWdodCgpOworCWVsc2UKKyNlbmRpZgorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWN1cndpbi0+d19jdXJzb3IuY29sICs9ICgqbWJfcHRyMmxlbl9jaGVjaykobWxfZ2V0X2N1cnNvcigpKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCSsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisJfQorCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwlyZXZpbnNfbGVnYWwrKzsKKwlpZiAocmV2aW5zX2NoYXJzKQorCSAgICByZXZpbnNfY2hhcnMtLTsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBpZiAnd2hpY2h3cmFwJyBzZXQgZm9yIGN1cnNvciBpbiBpbnNlcnQgbW9kZSwgbWF5IG1vdmUgdGhlCisgICAgICogY3Vyc29yIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICBlbHNlIGlmICh2aW1fc3RyY2hyKHBfd3csICddJykgIT0gTlVMTAorCSAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJc3RhcnRfYXJyb3coJmN1cndpbi0+d19jdXJzb3IpOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyAgICB9CisgICAgZWxzZQorCXZpbV9iZWVwKCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW5zX3NfcmlnaHQoKQoreworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICgoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQpCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQKKwkgICAgfHwgZ2NoYXJfY3Vyc29yKCkgIT0gTlVMKQorICAgIHsKKwlzdGFydF9hcnJvdygmY3Vyd2luLT53X2N1cnNvcik7CisJKHZvaWQpZndkX3dvcmQoMUwsIEZBTFNFLCAwKTsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorCXZpbV9iZWVwKCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW5zX3VwKHN0YXJ0Y29sKQorICAgIGludAkJc3RhcnRjb2w7CS8qIHdoZW4gVFJVRSBtb3ZlIHRvIEluc3N0YXJ0LmNvbCAqLworeworICAgIHBvc19UCXRwb3M7CisgICAgbGluZW5yX1QJb2xkX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBpbnQJCW9sZF90b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CisjZW5kaWYKKworICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICB0cG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoY3Vyc29yX3VwKDFMLCBUUlVFKSA9PSBPSykKKyAgICB7CisJaWYgKHN0YXJ0Y29sKQorCSAgICBjb2xhZHZhbmNlKGdldHZjb2xfbm9saXN0KCZJbnNzdGFydCkpOworCWlmIChvbGRfdG9wbGluZSAhPSBjdXJ3aW4tPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQl8fCBvbGRfdG9wZmlsbCAhPSBjdXJ3aW4tPndfdG9wZmlsbAorI2VuZGlmCisJCSkKKwkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwlzdGFydF9hcnJvdygmdHBvcyk7CisjaWZkZWYgRkVBVF9DSU5ERU5UCisJY2FuX2NpbmRlbnQgPSBUUlVFOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKwl2aW1fYmVlcCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK2luc19wYWdldXAoKQoreworICAgIHBvc19UCXRwb3M7CisKKyAgICB1bmRpc3BsYXlfZG9sbGFyKCk7CisgICAgdHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKG9uZXBhZ2UoQkFDS1dBUkQsIDFMKSA9PSBPSykKKyAgICB7CisJc3RhcnRfYXJyb3coJnRwb3MpOworI2lmZGVmIEZFQVRfQ0lOREVOVAorCWNhbl9jaW5kZW50ID0gVFJVRTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisJdmltX2JlZXAoKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitpbnNfZG93bihzdGFydGNvbCkKKyAgICBpbnQJCXN0YXJ0Y29sOwkvKiB3aGVuIFRSVUUgbW92ZSB0byBJbnNzdGFydC5jb2wgKi8KK3sKKyAgICBwb3NfVAl0cG9zOworICAgIGxpbmVucl9UCW9sZF90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQlvbGRfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisKKyAgICB1bmRpc3BsYXlfZG9sbGFyKCk7CisgICAgdHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKGN1cnNvcl9kb3duKDFMLCBUUlVFKSA9PSBPSykKKyAgICB7CisJaWYgKHN0YXJ0Y29sKQorCSAgICBjb2xhZHZhbmNlKGdldHZjb2xfbm9saXN0KCZJbnNzdGFydCkpOworCWlmIChvbGRfdG9wbGluZSAhPSBjdXJ3aW4tPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQl8fCBvbGRfdG9wZmlsbCAhPSBjdXJ3aW4tPndfdG9wZmlsbAorI2VuZGlmCisJCSkKKwkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwlzdGFydF9hcnJvdygmdHBvcyk7CisjaWZkZWYgRkVBVF9DSU5ERU5UCisJY2FuX2NpbmRlbnQgPSBUUlVFOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKwl2aW1fYmVlcCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK2luc19wYWdlZG93bigpCit7CisgICAgcG9zX1QJdHBvczsKKworICAgIHVuZGlzcGxheV9kb2xsYXIoKTsKKyAgICB0cG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAob25lcGFnZShGT1JXQVJELCAxTCkgPT0gT0spCisgICAgeworCXN0YXJ0X2Fycm93KCZ0cG9zKTsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwljYW5fY2luZGVudCA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorCXZpbV9iZWVwKCk7Cit9CisKKyNpZmRlZiBGRUFUX0RORAorICAgIHN0YXRpYyB2b2lkCitpbnNfZHJvcCgpCit7CisgICAgZG9fcHV0KCd+JywgQkFDS1dBUkQsIDFMLCBQVVRfQ1VSU0VORCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEhhbmRsZSBUQUIgaW4gSW5zZXJ0IG9yIFJlcGxhY2UgbW9kZS4KKyAqIFJldHVybiBUUlVFIHdoZW4gdGhlIFRBQiBuZWVkcyB0byBiZSBpbnNlcnRlZCBsaWtlIGEgbm9ybWFsIGNoYXJhY3Rlci4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc190YWIoKQoreworICAgIGludAkJaW5kOworICAgIGludAkJaTsKKyAgICBpbnQJCXRlbXA7CisKKyAgICBpZiAoSW5zc3RhcnRfYmxhbmtfdmNvbCA9PSBNQVhDT0wgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtID09IEluc3N0YXJ0LmxudW0pCisJSW5zc3RhcnRfYmxhbmtfdmNvbCA9IGdldF9ub2xpc3RfdmlydGNvbCgpOworICAgIGlmIChlY2hlY2tfYWJicihUQUIgKyBBQkJSX09GRikpCisJcmV0dXJuIEZBTFNFOworCisgICAgaW5kID0gaW5pbmRlbnQoMCk7CisjaWZkZWYgRkVBVF9DSU5ERU5UCisgICAgaWYgKGluZCkKKwljYW5fY2luZGVudCA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFdoZW4gbm90aGluZyBzcGVjaWFsLCBpbnNlcnQgVEFCIGxpa2UgYSBub3JtYWwgY2hhcmFjdGVyCisgICAgICovCisgICAgaWYgKCFjdXJidWYtPmJfcF9ldAorCSAgICAmJiAhKHBfc3RhICYmIGluZCAmJiBjdXJidWYtPmJfcF90cyAhPSBjdXJidWYtPmJfcF9zdykKKwkgICAgJiYgY3VyYnVmLT5iX3Bfc3RzID09IDApCisJcmV0dXJuIFRSVUU7CisKKyAgICBpZiAoc3RvcF9hcnJvdygpID09IEZBSUwpCisJcmV0dXJuIFRSVUU7CisKKyAgICBkaWRfYWkgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisgICAgZGlkX3NpID0gRkFMU0U7CisgICAgY2FuX3NpID0gRkFMU0U7CisgICAgY2FuX3NpX2JhY2sgPSBGQUxTRTsKKyNlbmRpZgorICAgIEFwcGVuZFRvUmVkb2J1ZmYoKGNoYXJfdSAqKSJcdCIpOworCisgICAgaWYgKHBfc3RhICYmIGluZCkJCS8qIGluc2VydCB0YWIgaW4gaW5kZW50LCB1c2UgJ3NoaWZ0d2lkdGgnICovCisJdGVtcCA9IChpbnQpY3VyYnVmLT5iX3Bfc3c7CisgICAgZWxzZSBpZiAoY3VyYnVmLT5iX3Bfc3RzID4gMCkgLyogdXNlICdzb2Z0dGFic3RvcCcgd2hlbiBzZXQgKi8KKwl0ZW1wID0gKGludCljdXJidWYtPmJfcF9zdHM7CisgICAgZWxzZQkJCS8qIG90aGVyd2lzZSB1c2UgJ3RhYnN0b3AnICovCisJdGVtcCA9IChpbnQpY3VyYnVmLT5iX3BfdHM7CisgICAgdGVtcCAtPSBnZXRfbm9saXN0X3ZpcnRjb2woKSAlIHRlbXA7CisKKyAgICAvKgorICAgICAqIEluc2VydCB0aGUgZmlyc3Qgc3BhY2Ugd2l0aCBpbnNfY2hhcigpLglJdCB3aWxsIGRlbGV0ZSBvbmUgY2hhciBpbgorICAgICAqIHJlcGxhY2UgbW9kZS4gIEluc2VydCB0aGUgcmVzdCB3aXRoIGluc19zdHIoKTsgaXQgd2lsbCBub3QgZGVsZXRlIGFueQorICAgICAqIGNoYXJzLiAgRm9yIFZSRVBMQUNFIG1vZGUsIHdlIHVzZSBpbnNfY2hhcigpIGZvciBhbGwgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBpbnNfY2hhcignICcpOworICAgIHdoaWxlICgtLXRlbXAgPiAwKQorICAgIHsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwkgICAgaW5zX2NoYXIoJyAnKTsKKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGluc19zdHIoKGNoYXJfdSAqKSIgIik7CisJICAgIGlmIChTdGF0ZSAmIFJFUExBQ0VfRkxBRykJICAgIC8qIG5vIGNoYXIgcmVwbGFjZWQgKi8KKwkJcmVwbGFjZV9wdXNoKE5VTCk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogV2hlbiAnZXhwYW5kdGFiJyBub3Qgc2V0OiBSZXBsYWNlIHNwYWNlcyBieSBUQUJzIHdoZXJlIHBvc3NpYmxlLgorICAgICAqLworICAgIGlmICghY3VyYnVmLT5iX3BfZXQgJiYgKGN1cmJ1Zi0+Yl9wX3N0cyB8fCAocF9zdGEgJiYgaW5kKSkpCisgICAgeworCWNoYXJfdQkJKnB0cjsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJY2hhcl91CQkqc2F2ZWRfbGluZSA9IE5VTEw7CS8qIGluaXQgZm9yIEdDQyAqLworCXBvc19UCQlwb3M7CisjZW5kaWYKKwlwb3NfVAkJZnBvczsKKwlwb3NfVAkJKmN1cnNvcjsKKwljb2xucl9UCQl3YW50X3Zjb2wsIHZjb2w7CisJaW50CQljaGFuZ2VfY29sID0gLTE7CisJaW50CQlzYXZlX2xpc3QgPSBjdXJ3aW4tPndfcF9saXN0OworCisJLyoKKwkgKiBHZXQgdGhlIGN1cnJlbnQgbGluZS4gIEZvciBWUkVQTEFDRSBtb2RlLCBkb24ndCBtYWtlIHJlYWwgY2hhbmdlcworCSAqIHlldCwganVzdCB3b3JrIG9uIGEgY29weSBvZiB0aGUgbGluZS4KKwkgKi8KKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwl7CisJICAgIHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIGN1cnNvciA9ICZwb3M7CisJICAgIHNhdmVkX2xpbmUgPSB2aW1fc3Ryc2F2ZShtbF9nZXRfY3VybGluZSgpKTsKKwkgICAgaWYgKHNhdmVkX2xpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBwdHIgPSBzYXZlZF9saW5lICsgcG9zLmNvbDsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBwdHIgPSBtbF9nZXRfY3Vyc29yKCk7CisJICAgIGN1cnNvciA9ICZjdXJ3aW4tPndfY3Vyc29yOworCX0KKworCS8qIFdoZW4gJ0wnIGlzIG5vdCBpbiAnY3BvcHRpb25zJyBhIHRhYiBhbHdheXMgdGFrZXMgdXAgJ3RzJyBzcGFjZXMuICovCisJaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19MSVNUV00pID09IE5VTEwpCisJICAgIGN1cndpbi0+d19wX2xpc3QgPSBGQUxTRTsKKworCS8qIEZpbmQgZmlyc3Qgd2hpdGUgYmVmb3JlIHRoZSBjdXJzb3IgKi8KKwlmcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwl3aGlsZSAoZnBvcy5jb2wgPiAwICYmIHZpbV9pc3doaXRlKHB0clstMV0pKQorCXsKKwkgICAgLS1mcG9zLmNvbDsKKwkgICAgLS1wdHI7CisJfQorCisJLyogSW4gUmVwbGFjZSBtb2RlLCBkb24ndCBjaGFuZ2UgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGluc2VydCBwb2ludC4gKi8KKwlpZiAoKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCQkmJiBmcG9zLmxudW0gPT0gSW5zc3RhcnQubG51bQorCQkmJiBmcG9zLmNvbCA8IEluc3N0YXJ0LmNvbCkKKwl7CisJICAgIHB0ciArPSBJbnNzdGFydC5jb2wgLSBmcG9zLmNvbDsKKwkgICAgZnBvcy5jb2wgPSBJbnNzdGFydC5jb2w7CisJfQorCisJLyogY29tcHV0ZSB2aXJ0dWFsIGNvbHVtbiBudW1iZXJzIG9mIGZpcnN0IHdoaXRlIGFuZCBjdXJzb3IgKi8KKwlnZXR2Y29sKGN1cndpbiwgJmZwb3MsICZ2Y29sLCBOVUxMLCBOVUxMKTsKKwlnZXR2Y29sKGN1cndpbiwgY3Vyc29yLCAmd2FudF92Y29sLCBOVUxMLCBOVUxMKTsKKworCS8qIFVzZSBhcyBtYW55IFRBQnMgYXMgcG9zc2libGUuICBCZXdhcmUgb2YgJ3Nob3dicmVhaycgYW5kCisJICogJ2xpbmVicmVhaycgYWRkaW5nIGV4dHJhIHZpcnR1YWwgY29sdW1ucy4gKi8KKwl3aGlsZSAodmltX2lzd2hpdGUoKnB0cikpCisJeworCSAgICBpID0gbGJyX2NoYXJ0YWJzaXplKChjaGFyX3UgKikiXHQiLCB2Y29sKTsKKwkgICAgaWYgKHZjb2wgKyBpID4gd2FudF92Y29sKQorCQlicmVhazsKKwkgICAgaWYgKCpwdHIgIT0gVEFCKQorCSAgICB7CisJCSpwdHIgPSBUQUI7CisJCWlmIChjaGFuZ2VfY29sIDwgMCkKKwkJeworCQkgICAgY2hhbmdlX2NvbCA9IGZwb3MuY29sOyAgLyogQ29sdW1uIG9mIGZpcnN0IGNoYW5nZSAqLworCQkgICAgLyogTWF5IGhhdmUgdG8gYWRqdXN0IEluc3N0YXJ0ICovCisJCSAgICBpZiAoZnBvcy5sbnVtID09IEluc3N0YXJ0LmxudW0gJiYgZnBvcy5jb2wgPCBJbnNzdGFydC5jb2wpCisJCQlJbnNzdGFydC5jb2wgPSBmcG9zLmNvbDsKKwkJfQorCSAgICB9CisJICAgICsrZnBvcy5jb2w7CisJICAgICsrcHRyOworCSAgICB2Y29sICs9IGk7CisJfQorCisJaWYgKGNoYW5nZV9jb2wgPj0gMCkKKwl7CisJICAgIGludCByZXBsX29mZiA9IDA7CisKKwkgICAgLyogU2tpcCBvdmVyIHRoZSBzcGFjZXMgd2UgbmVlZC4gKi8KKwkgICAgd2hpbGUgKHZjb2wgPCB3YW50X3Zjb2wgJiYgKnB0ciA9PSAnICcpCisJICAgIHsKKwkJdmNvbCArPSBsYnJfY2hhcnRhYnNpemUocHRyLCB2Y29sKTsKKwkJKytwdHI7CisJCSsrcmVwbF9vZmY7CisJICAgIH0KKwkgICAgaWYgKHZjb2wgPiB3YW50X3Zjb2wpCisJICAgIHsKKwkJLyogTXVzdCBoYXZlIGEgY2hhciB3aXRoICdzaG93YnJlYWsnIGp1c3QgYmVmb3JlIGl0LiAqLworCQktLXB0cjsKKwkJLS1yZXBsX29mZjsKKwkgICAgfQorCSAgICBmcG9zLmNvbCArPSByZXBsX29mZjsKKworCSAgICAvKiBEZWxldGUgZm9sbG93aW5nIHNwYWNlcy4gKi8KKwkgICAgaSA9IGN1cnNvci0+Y29sIC0gZnBvcy5jb2w7CisJICAgIGlmIChpID4gMCkKKwkgICAgeworCQltY2hfbWVtbW92ZShwdHIsIHB0ciArIGksIFNUUkxFTihwdHIgKyBpKSArIDEpOworCQkvKiBjb3JyZWN0IHJlcGxhY2Ugc3RhY2suICovCisJCWlmICgoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCQkJJiYgIShTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisjZW5kaWYKKwkJCSkKKwkJICAgIGZvciAodGVtcCA9IGk7IC0tdGVtcCA+PSAwOyApCisJCQlyZXBsYWNlX2pvaW4ocmVwbF9vZmYpOworCSAgICB9CisJICAgIGN1cnNvci0+Y29sIC09IGk7CisKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJICAgIC8qCisJICAgICAqIEluIFZSRVBMQUNFIG1vZGUsIHdlIGhhdmVuJ3QgY2hhbmdlZCBhbnl0aGluZyB5ZXQuICBEbyBpdCBub3cgYnkKKwkgICAgICogYmFja3NwYWNpbmcgb3ZlciB0aGUgY2hhbmdlZCBzcGFjaW5nIGFuZCB0aGVuIGluc2VydGluZyB0aGUgbmV3CisJICAgICAqIHNwYWNpbmcuCisJICAgICAqLworCSAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCSAgICB7CisJCS8qIEJhY2tzcGFjZSBmcm9tIHJlYWwgY3Vyc29yIHRvIGNoYW5nZV9jb2wgKi8KKwkJYmFja3NwYWNlX3VudGlsX2NvbHVtbihjaGFuZ2VfY29sKTsKKworCQkvKiBJbnNlcnQgZWFjaCBjaGFyIGluIHNhdmVkX2xpbmUgZnJvbSBjaGFuZ2VkX2NvbCB0bworCQkgKiBwdHItY3Vyc29yICovCisJCWluc19ieXRlc19sZW4oc2F2ZWRfbGluZSArIGNoYW5nZV9jb2wsCisJCQkJCQkgICAgY3Vyc29yLT5jb2wgLSBjaGFuZ2VfY29sKTsKKwkgICAgfQorI2VuZGlmCisJfQorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCWlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJICAgIHZpbV9mcmVlKHNhdmVkX2xpbmUpOworI2VuZGlmCisJY3Vyd2luLT53X3BfbGlzdCA9IHNhdmVfbGlzdDsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBIYW5kbGUgQ1Igb3IgTkwgaW4gaW5zZXJ0IG1vZGUuCisgKiBSZXR1cm4gVFJVRSB3aGVuIG91dCBvZiBtZW1vcnkgb3IgY2FuJ3QgdW5kby4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19lb2woYykKKyAgICBpbnQJCWM7Cit7CisgICAgaW50CSAgICBpOworCisgICAgaWYgKGVjaGVja19hYmJyKGMgKyBBQkJSX09GRikpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChzdG9wX2Fycm93KCkgPT0gRkFJTCkKKwlyZXR1cm4gVFJVRTsKKyAgICB1bmRpc3BsYXlfZG9sbGFyKCk7CisKKyAgICAvKgorICAgICAqIFN0cmFuZ2UgVmkgYmVoYXZpb3VyOiBJbiBSZXBsYWNlIG1vZGUsIHR5cGluZyBhIE5MIHdpbGwgbm90IGRlbGV0ZSB0aGUKKyAgICAgKiBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvci4gIE9ubHkgcHVzaCBhIE5VTCBvbiB0aGUgcmVwbGFjZSBzdGFjaywKKyAgICAgKiBub3RoaW5nIHRvIHB1dCBiYWNrIHdoZW4gdGhlIE5MIGlzIGRlbGV0ZWQuCisgICAgICovCisgICAgaWYgKChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisJICAgICYmICEoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorI2VuZGlmCisJICAgICkKKwlyZXBsYWNlX3B1c2goTlVMKTsKKworICAgIC8qCisgICAgICogSW4gVlJFUExBQ0UgbW9kZSwgYSBOTCByZXBsYWNlcyB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIHN0YXJ0cworICAgICAqIHJlcGxhY2luZyB0aGUgbmV4dCBsaW5lLCBzbyB3ZSBwdXNoIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBsZWZ0IG9uIHRoZQorICAgICAqIGxpbmUgb250byB0aGUgcmVwbGFjZSBzdGFjay4gIFRoaXMgaXMgbm90IGRvbmUgaGVyZSB0aG91Z2gsIGl0IGlzIGRvbmUKKyAgICAgKiBpbiBvcGVuX2xpbmUoKS4KKyAgICAgKi8KKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisjIGlmZGVmIEZFQVRfRktNQVAKKyAgICBpZiAocF9hbHRrZXltYXAgJiYgcF9ma21hcCkKKwlma21hcChOTCk7CisjIGVuZGlmCisgICAgLyogTkwgaW4gcmV2ZXJzZSBpbnNlcnQgd2lsbCBhbHdheXMgc3RhcnQgaW4gdGhlIGVuZCBvZgorICAgICAqIGN1cnJlbnQgbGluZS4gKi8KKyAgICBpZiAocmV2aW5zX29uKQorCWN1cndpbi0+d19jdXJzb3IuY29sICs9IChjb2xucl9UKVNUUkxFTihtbF9nZXRfY3Vyc29yKCkpOworI2VuZGlmCisKKyAgICBBcHBlbmRUb1JlZG9idWZmKE5MX1NUUik7CisgICAgaSA9IG9wZW5fbGluZShGT1JXQVJELAorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkgICAgaGFzX2Zvcm1hdF9vcHRpb24oRk9fUkVUX0NPTVMpID8gT1BFTkxJTkVfRE9fQ09NIDoKKyNlbmRpZgorCSAgICAwLCBvbGRfaW5kZW50KTsKKyAgICBvbGRfaW5kZW50ID0gMDsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKyAgICBjYW5fY2luZGVudCA9IFRSVUU7CisjZW5kaWYKKworICAgIHJldHVybiAoIWkpOworfQorCisjaWZkZWYgRkVBVF9ESUdSQVBIUworLyoKKyAqIEhhbmRsZSBkaWdyYXBoIGluIGluc2VydCBtb2RlLgorICogUmV0dXJucyBjaGFyYWN0ZXIgc3RpbGwgdG8gYmUgaW5zZXJ0ZWQsIG9yIE5VTCB3aGVuIG5vdGhpbmcgcmVtYWluaW5nIHRvIGJlCisgKiBkb25lLgorICovCisgICAgc3RhdGljIGludAoraW5zX2RpZ3JhcGgoKQoreworICAgIGludAkgICAgYzsKKyAgICBpbnQJICAgIGNjOworCisgICAgcGNfc3RhdHVzID0gUENfU1RBVFVTX1VOU0VUOworICAgIGlmIChyZWRyYXdpbmcoKSAmJiAhY2hhcl9hdmFpbCgpKQorICAgIHsKKwkvKiBtYXkgbmVlZCB0byByZWRyYXcgd2hlbiBubyBtb3JlIGNoYXJzIGF2YWlsYWJsZSBub3cgKi8KKwlpbnNfcmVkcmF3KCk7CisKKwllZGl0X3B1dGNoYXIoJz8nLCBUUlVFKTsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCWFkZF90b19zaG93Y21kX2MoQ3RybF9LKTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisgICAgZG9udF9zY3JvbGwgPSBUUlVFOwkJLyogZGlzYWxsb3cgc2Nyb2xsaW5nIGhlcmUgKi8KKyNlbmRpZgorCisgICAgLyogZG9uJ3QgbWFwIHRoZSBkaWdyYXBoIGNoYXJzLiBUaGlzIGFsc28gcHJldmVudHMgdGhlCisgICAgICogbW9kZSBtZXNzYWdlIHRvIGJlIGRlbGV0ZWQgd2hlbiBFU0MgaXMgaGl0ICovCisgICAgKytub19tYXBwaW5nOworICAgICsrYWxsb3dfa2V5czsKKyAgICBjID0gc2FmZV92Z2V0YygpOworICAgIC0tbm9fbWFwcGluZzsKKyAgICAtLWFsbG93X2tleXM7CisgICAgaWYgKElTX1NQRUNJQUwoYykgfHwgbW9kX21hc2spCSAgICAvKiBzcGVjaWFsIGtleSAqLworICAgIHsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCWNsZWFyX3Nob3djbWQoKTsKKyNlbmRpZgorCWluc2VydF9zcGVjaWFsKGMsIFRSVUUsIEZBTFNFKTsKKwlyZXR1cm4gTlVMOworICAgIH0KKyAgICBpZiAoYyAhPSBFU0MpCisgICAgeworCWlmIChyZWRyYXdpbmcoKSAmJiAhY2hhcl9hdmFpbCgpKQorCXsKKwkgICAgLyogbWF5IG5lZWQgdG8gcmVkcmF3IHdoZW4gbm8gbW9yZSBjaGFycyBhdmFpbGFibGUgbm93ICovCisJICAgIGluc19yZWRyYXcoKTsKKworCSAgICBpZiAoY2hhcjJjZWxscyhjKSA9PSAxKQorCSAgICB7CisJCS8qIGZpcnN0IHJlbW92ZSB0aGUgJz8nLCBvdGhlcndpc2UgaXQncyByZXN0b3JlZCB3aGVuIHR5cGluZworCQkgKiBhbiBFU0MgbmV4dCAqLworCQllZGl0X3VucHV0Y2hhcigpOworCQlpbnNfcmVkcmF3KCk7CisJCWVkaXRfcHV0Y2hhcihjLCBUUlVFKTsKKwkgICAgfQorI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJICAgIGFkZF90b19zaG93Y21kX2MoYyk7CisjZW5kaWYKKwl9CisJKytub19tYXBwaW5nOworCSsrYWxsb3dfa2V5czsKKwljYyA9IHNhZmVfdmdldGMoKTsKKwktLW5vX21hcHBpbmc7CisJLS1hbGxvd19rZXlzOworCWlmIChjYyAhPSBFU0MpCisJeworCSAgICBBcHBlbmRUb1JlZG9idWZmKChjaGFyX3UgKilDVFJMX1ZfU1RSKTsKKwkgICAgYyA9IGdldGRpZ3JhcGgoYywgY2MsIFRSVUUpOworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJICAgIGNsZWFyX3Nob3djbWQoKTsKKyNlbmRpZgorCSAgICByZXR1cm4gYzsKKwl9CisgICAgfQorICAgIGVkaXRfdW5wdXRjaGFyKCk7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBjbGVhcl9zaG93Y21kKCk7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMOworfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgQ1RSTC1FIGFuZCBDVFJMLVkgaW4gSW5zZXJ0IG1vZGU6IGNvcHkgY2hhciBmcm9tIG90aGVyIGxpbmUuCisgKiBSZXR1cm5zIHRoZSBjaGFyIHRvIGJlIGluc2VydGVkLCBvciBOVUwgaWYgbm9uZSBmb3VuZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2luc19jb3B5Y2hhcihsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgaW50CSAgICBjOworICAgIGludAkgICAgdGVtcDsKKyAgICBjaGFyX3UgICpwdHIsICpwcmV2X3B0cjsKKworICAgIGlmIChsbnVtIDwgMSB8fCBsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCXZpbV9iZWVwKCk7CisJcmV0dXJuIE5VTDsKKyAgICB9CisKKyAgICAvKiB0cnkgdG8gYWR2YW5jZSB0byB0aGUgY3Vyc29yIGNvbHVtbiAqLworICAgIHRlbXAgPSAwOworICAgIHB0ciA9IG1sX2dldChsbnVtKTsKKyAgICBwcmV2X3B0ciA9IHB0cjsKKyAgICB2YWxpZGF0ZV92aXJ0Y29sKCk7CisgICAgd2hpbGUgKChjb2xucl9UKXRlbXAgPCBjdXJ3aW4tPndfdmlydGNvbCAmJiAqcHRyICE9IE5VTCkKKyAgICB7CisJcHJldl9wdHIgPSBwdHI7CisJdGVtcCArPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZwdHIsIChjb2xucl9UKXRlbXApOworICAgIH0KKyAgICBpZiAoKGNvbG5yX1QpdGVtcCA+IGN1cndpbi0+d192aXJ0Y29sKQorCXB0ciA9IHByZXZfcHRyOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGMgPSAoKm1iX3B0cjJjaGFyKShwdHIpOworI2Vsc2UKKyAgICBjID0gKnB0cjsKKyNlbmRpZgorICAgIGlmIChjID09IE5VTCkKKwl2aW1fYmVlcCgpOworICAgIHJldHVybiBjOworfQorCisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorLyoKKyAqIFRyeSB0byBkbyBzb21lIHZlcnkgc21hcnQgYXV0by1pbmRlbnRpbmcuCisgKiBVc2VkIHdoZW4gaW5zZXJ0aW5nIGEgIm5vcm1hbCIgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIHZvaWQKK2luc190cnlfc2koYykKKyAgICBpbnQJICAgIGM7Cit7CisgICAgcG9zX1QJKnBvcywgb2xkX3BvczsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWk7CisgICAgaW50CQl0ZW1wOworCisgICAgLyoKKyAgICAgKiBkbyBzb21lIHZlcnkgc21hcnQgaW5kZW50aW5nIHdoZW4gZW50ZXJpbmcgJ3snIG9yICd9JworICAgICAqLworICAgIGlmICgoKGRpZF9zaSB8fCBjYW5fc2lfYmFjaykgJiYgYyA9PSAneycpIHx8IChjYW5fc2kgJiYgYyA9PSAnfScpKQorICAgIHsKKwkvKgorCSAqIGZvciAnfScgc2V0IGluZGVudCBlcXVhbCB0byBpbmRlbnQgb2YgbGluZSBjb250YWluaW5nIG1hdGNoaW5nICd7JworCSAqLworCWlmIChjID09ICd9JyAmJiAocG9zID0gZmluZG1hdGNoKE5VTEwsICd7JykpICE9IE5VTEwpCisJeworCSAgICBvbGRfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIG1hdGNoaW5nICd7JyBoYXMgYSAnKScgaW1tZWRpYXRlbHkgYmVmb3JlIGl0IChpZ25vcmluZworCSAgICAgKiB3aGl0ZS1zcGFjZSksIHRoZW4gbGluZSB1cCB3aXRoIHRoZSBzdGFydCBvZiB0aGUgbGluZQorCSAgICAgKiBjb250YWluaW5nIHRoZSBtYXRjaGluZyAnKCcgaWYgdGhlcmUgaXMgb25lLiAgVGhpcyBoYW5kbGVzIHRoZQorCSAgICAgKiBjYXNlIHdoZXJlIGFuICJpZiAoLi5cbi4uKSB7IiBzdGF0ZW1lbnQgY29udGludWVzIG92ZXIgbXVsdGlwbGUKKwkgICAgICogbGluZXMgLS0gd2ViYgorCSAgICAgKi8KKwkgICAgcHRyID0gbWxfZ2V0KHBvcy0+bG51bSk7CisJICAgIGkgPSBwb3MtPmNvbDsKKwkgICAgaWYgKGkgPiAwKQkJLyogc2tpcCBibGFua3MgYmVmb3JlICd7JyAqLworCQl3aGlsZSAoLS1pID4gMCAmJiB2aW1faXN3aGl0ZShwdHJbaV0pKQorCQkgICAgOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBwb3MtPmxudW07CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gaTsKKwkgICAgaWYgKHB0cltpXSA9PSAnKScgJiYgKHBvcyA9IGZpbmRtYXRjaChOVUxMLCAnKCcpKSAhPSBOVUxMKQorCQljdXJ3aW4tPndfY3Vyc29yID0gKnBvczsKKwkgICAgaSA9IGdldF9pbmRlbnQoKTsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IG9sZF9wb3M7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCQljaGFuZ2VfaW5kZW50KElOREVOVF9TRVQsIGksIEZBTFNFLCBOVUwpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKHZvaWQpc2V0X2luZGVudChpLCBTSU5fQ0hBTkdFRCk7CisJfQorCWVsc2UgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID4gMCkKKwl7CisJICAgIC8qCisJICAgICAqIHdoZW4gaW5zZXJ0aW5nICd7JyBhZnRlciAiTyIgcmVkdWNlIGluZGVudCwgYnV0IG5vdAorCSAgICAgKiBtb3JlIHRoYW4gaW5kZW50IG9mIHByZXZpb3VzIGxpbmUKKwkgICAgICovCisJICAgIHRlbXAgPSBUUlVFOworCSAgICBpZiAoYyA9PSAneycgJiYgY2FuX3NpX2JhY2sgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtID4gMSkKKwkgICAgeworCQlvbGRfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkJaSA9IGdldF9pbmRlbnQoKTsKKwkJd2hpbGUgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisJCXsKKwkJICAgIHB0ciA9IHNraXB3aGl0ZShtbF9nZXQoLS0oY3Vyd2luLT53X2N1cnNvci5sbnVtKSkpOworCisJCSAgICAvKiBpZ25vcmUgZW1wdHkgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggJyMnLiAqLworCQkgICAgaWYgKCpwdHIgIT0gJyMnICYmICpwdHIgIT0gTlVMKQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGdldF9pbmRlbnQoKSA+PSBpKQorCQkgICAgdGVtcCA9IEZBTFNFOworCQljdXJ3aW4tPndfY3Vyc29yID0gb2xkX3BvczsKKwkgICAgfQorCSAgICBpZiAodGVtcCkKKwkJc2hpZnRfbGluZShUUlVFLCBGQUxTRSwgMSk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogc2V0IGluZGVudCBvZiAnIycgYWx3YXlzIHRvIDAKKyAgICAgKi8KKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPiAwICYmIGNhbl9zaSAmJiBjID09ICcjJykKKyAgICB7CisJLyogcmVtZW1iZXIgY3VycmVudCBpbmRlbnQgZm9yIG5leHQgbGluZSAqLworCW9sZF9pbmRlbnQgPSBnZXRfaW5kZW50KCk7CisJKHZvaWQpc2V0X2luZGVudCgwLCBTSU5fQ0hBTkdFRCk7CisgICAgfQorCisgICAgLyogQWRqdXN0IGFpX2NvbCwgdGhlIGNoYXIgYXQgdGhpcyBwb3NpdGlvbiBjYW4gYmUgZGVsZXRlZC4gKi8KKyAgICBpZiAoYWlfY29sID4gY3Vyd2luLT53X2N1cnNvci5jb2wpCisJYWlfY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCB0aGUgdmFsdWUgdGhhdCB3X3ZpcnRjb2wgd291bGQgaGF2ZSB3aGVuICdsaXN0JyBpcyBvZmYuCisgKiBVbmxlc3MgJ2NwbycgY29udGFpbnMgdGhlICdMJyBmbGFnLgorICovCisgICAgc3RhdGljIGNvbG5yX1QKK2dldF9ub2xpc3RfdmlydGNvbCgpCit7CisgICAgaWYgKGN1cndpbi0+d19wX2xpc3QgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0xJU1RXTSkgPT0gTlVMTCkKKwlyZXR1cm4gZ2V0dmNvbF9ub2xpc3QoJmN1cndpbi0+d19jdXJzb3IpOworICAgIHZhbGlkYXRlX3ZpcnRjb2woKTsKKyAgICByZXR1cm4gY3Vyd2luLT53X3ZpcnRjb2w7Cit9CmRpZmYgLS1naXQgYS9zcmMvZXZhbC5jIGIvc3JjL2V2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTMzOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V2YWwuYwpAQCAtMCwwICsxLDEwNjgyIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBldmFsLmM6IEV4cHJlc3Npb24gZXZhbHVhdGlvbi4KKyAqLworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjIGluY2x1ZGUgPGlvLmg+CS8qIGZvciBtY2hfb3BlbigpLCBtdXN0IGJlIGJlZm9yZSB2aW0uaCAqLworI2VuZGlmCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEFNSUdBCisjIGluY2x1ZGUgPHRpbWUuaD4JLyogZm9yIHN0cmZ0aW1lKCkgKi8KKyNlbmRpZgorCisjaWZkZWYgTUFDT1MKKyMgaW5jbHVkZSA8dGltZS5oPgkvKiBmb3IgdGltZV90ICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKworI2lmIFNJWkVPRl9JTlQgPD0gMwkJLyogdXNlIGxvbmcgaWYgaW50IGlzIHNtYWxsZXIgdGhhbiAzMiBiaXRzICovCit0eXBlZGVmIGxvbmcJdmFybnVtYmVyX1Q7CisjZWxzZQordHlwZWRlZiBpbnQJdmFybnVtYmVyX1Q7CisjZW5kaWYKKworLyoKKyAqIFN0cnVjdHVyZSB0byBob2xkIGFuIGludGVybmFsIHZhcmlhYmxlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXJfdQkqdmFyX25hbWU7CS8qIG5hbWUgb2YgdmFyaWFibGUgKi8KKyAgICBjaGFyCXZhcl90eXBlOwkvKiBWQVJfTlVNQkVSIG9yIFZBUl9TVFJJTkcgKi8KKyAgICB1bmlvbgorICAgIHsKKwl2YXJudW1iZXJfVAl2YXJfbnVtYmVyOyAgIC8qIG51bWJlciB2YWx1ZSAqLworCWNoYXJfdQkJKnZhcl9zdHJpbmc7ICAvKiBzdHJpbmcgdmFsdWUgKENhcmVmdWw6IGNhbiBiZSBOVUxMISkgKi8KKyAgICB9IHZhcl92YWw7Cit9IHZhcjsKKworI2RlZmluZSBWQVJfVU5LTk9XTiAwCisjZGVmaW5lIFZBUl9OVU1CRVIgIDEKKyNkZWZpbmUgVkFSX1NUUklORyAgMgorCit0eXBlZGVmIHZhciAqCVZBUjsKKworLyoKKyAqIEFsbCB1c2VyLWRlZmluZWQgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgc3RvcmVkIGluICJ2YXJpYWJsZXMiLgorICovCitnYXJyYXlfVAl2YXJpYWJsZXMgPSB7MCwgMCwgc2l6ZW9mKHZhciksIDQsIE5VTEx9OworCisvKgorICogQXJyYXkgdG8gaG9sZCBhbiBhcnJheSB3aXRoIHZhcmlhYmxlcyBsb2NhbCB0byBlYWNoIHNvdXJjZWQgc2NyaXB0LgorICovCitzdGF0aWMgZ2FycmF5X1QJICAgIGdhX3NjcmlwdHMgPSB7MCwgMCwgc2l6ZW9mKGdhcnJheV9UKSwgNCwgTlVMTH07CisjZGVmaW5lIFNDUklQVF9WQVJTKGlkKSAoKChnYXJyYXlfVCAqKWdhX3NjcmlwdHMuZ2FfZGF0YSlbKGlkKSAtIDFdKQorCisKKyNkZWZpbmUgVkFSX0VOVFJZKGlkeCkJKCgoVkFSKSh2YXJpYWJsZXMuZ2FfZGF0YSkpW2lkeF0pCisjZGVmaW5lIFZBUl9HQVBfRU5UUlkoaWR4LCBnYXApCSgoKFZBUikoZ2FwLT5nYV9kYXRhKSlbaWR4XSkKKyNkZWZpbmUgQlZBUl9FTlRSWShpZHgpCSgoKFZBUikoY3VyYnVmLT5iX3ZhcnMuZ2FfZGF0YSkpW2lkeF0pCisjZGVmaW5lIFdWQVJfRU5UUlkoaWR4KQkoKChWQVIpKGN1cndpbi0+d192YXJzLmdhX2RhdGEpKVtpZHhdKQorCitzdGF0aWMgaW50IGVjaG9fYXR0ciA9IDA7ICAgLyogYXR0cmlidXRlcyB1c2VkIGZvciAiOmVjaG8iICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIGZvciBhIHVzZXIgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHVmdW5jIHVmdW5jX1Q7CisKK3N0cnVjdCB1ZnVuYworeworICAgIHVmdW5jX1QJKm5leHQ7CQkvKiBuZXh0IGZ1bmN0aW9uIGluIGxpc3QgKi8KKyAgICBjaGFyX3UJKm5hbWU7CQkvKiBuYW1lIG9mIGZ1bmN0aW9uOyBjYW4gc3RhcnQgd2l0aCA8U05SPjEyM18KKwkJCQkgICAoPFNOUj4gaXMgS19TUEVDSUFMIEtTX0VYVFJBIEtFX1NOUikgKi8KKyAgICBpbnQJCXZhcmFyZ3M7CS8qIHZhcmlhYmxlIG5yIG9mIGFyZ3VtZW50cyAqLworICAgIGludAkJZmxhZ3M7CisgICAgaW50CQljYWxsczsJCS8qIG5yIG9mIGFjdGl2ZSBjYWxscyAqLworICAgIGdhcnJheV9UCWFyZ3M7CQkvKiBhcmd1bWVudHMgKi8KKyAgICBnYXJyYXlfVAlsaW5lczsJCS8qIGZ1bmN0aW9uIGxpbmVzICovCisgICAgc2NpZF9UCXNjcmlwdF9JRDsJLyogSUQgb2Ygc2NyaXB0IHdoZXJlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLAorCQkJCSAgIHVzZWQgZm9yIHM6IHZhcmlhYmxlcyAqLworfTsKKworLyogZnVuY3Rpb24gZmxhZ3MgKi8KKyNkZWZpbmUgRkNfQUJPUlQgICAgMQkJLyogYWJvcnQgZnVuY3Rpb24gb24gZXJyb3IgKi8KKyNkZWZpbmUgRkNfUkFOR0UgICAgMgkJLyogZnVuY3Rpb24gYWNjZXB0cyByYW5nZSAqLworCisvKgorICogQWxsIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIHRoZSBmb3J3YXJkLWxpbmtlZCBmdW5jdGlvbiBsaXN0LgorICogVGhlIGZpcnN0IGZ1bmN0aW9uIGlzIHBvaW50ZWQgYXQgYnkgZmlyc3RmdW5jLgorICovCit1ZnVuY19UCQkqZmlyc3RmdW5jID0gTlVMTDsKKworI2RlZmluZSBGVU5DQVJHKGZwLCBqKQkoKGNoYXJfdSAqKikoZnAtPmFyZ3MuZ2FfZGF0YSkpW2pdCisjZGVmaW5lIEZVTkNMSU5FKGZwLCBqKQkoKGNoYXJfdSAqKikoZnAtPmxpbmVzLmdhX2RhdGEpKVtqXQorCisvKiBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIGZvciBhIGZ1bmN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkLiAqLworc3RydWN0IGZ1bmNjYWxsCit7CisgICAgdWZ1bmNfVAkqZnVuYzsJCS8qIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCAqLworICAgIGludAkJbGluZW5yOwkJLyogbmV4dCBsaW5lIHRvIGJlIGV4ZWN1dGVkICovCisgICAgaW50CQlyZXR1cm5lZDsJLyogIjpyZXR1cm4iIHVzZWQgKi8KKyAgICBpbnQJCWFyZ2NvdW50OwkvKiBuciBvZiBhcmd1bWVudHMgKi8KKyAgICBWQVIJCWFyZ3ZhcnM7CS8qIGFyZ3VtZW50cyAqLworICAgIHZhcgkJYTBfdmFyOwkJLyogImE6MCIgdmFyaWFibGUgKi8KKyAgICB2YXIJCWZpcnN0bGluZTsJLyogImE6Zmlyc3RsaW5lIiB2YXJpYWJsZSAqLworICAgIHZhcgkJbGFzdGxpbmU7CS8qICJhOmxhc3RsaW5lIiB2YXJpYWJsZSAqLworICAgIGdhcnJheV9UCWxfdmFyczsJCS8qIGxvY2FsIGZ1bmN0aW9uIHZhcmlhYmxlcyAqLworICAgIFZBUgkJcmV0dmFyOwkJLyogcmV0dXJuIHZhbHVlIHZhcmlhYmxlICovCisgICAgbGluZW5yX1QJYnJlYWtwb2ludDsJLyogbmV4dCBsaW5lIHdpdGggYnJlYWtwb2ludCBvciB6ZXJvICovCisgICAgaW50CQlkYmdfdGljazsJLyogZGVidWdfdGljayB3aGVuIGJyZWFrcG9pbnQgd2FzIHNldCAqLworICAgIGludAkJbGV2ZWw7CQkvKiB0b3AgbmVzdGluZyBsZXZlbCBvZiBleGVjdXRlZCBmdW5jdGlvbiAqLworfTsKKworLyoKKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0ZWQgZnVuY3Rpb24uCisgKi8KKyAgICBjaGFyX3UgKgorZnVuY19uYW1lKGNvb2tpZSkKKyAgICB2b2lkICpjb29raWU7Cit7CisgICAgcmV0dXJuICgoc3RydWN0IGZ1bmNjYWxsICopY29va2llKS0+ZnVuYy0+bmFtZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYWRkcmVzcyBob2xkaW5nIHRoZSBuZXh0IGJyZWFrcG9pbnQgbGluZSBmb3IgYSBmdW5jY2FsbCBjb29raWUuCisgKi8KKyAgICBsaW5lbnJfVCAqCitmdW5jX2JyZWFrcG9pbnQoY29va2llKQorICAgIHZvaWQgKmNvb2tpZTsKK3sKKyAgICByZXR1cm4gJigoc3RydWN0IGZ1bmNjYWxsICopY29va2llKS0+YnJlYWtwb2ludDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYWRkcmVzcyBob2xkaW5nIHRoZSBkZWJ1ZyB0aWNrIGZvciBhIGZ1bmNjYWxsIGNvb2tpZS4KKyAqLworICAgIGludCAqCitmdW5jX2RiZ190aWNrKGNvb2tpZSkKKyAgICB2b2lkICpjb29raWU7Cit7CisgICAgcmV0dXJuICYoKHN0cnVjdCBmdW5jY2FsbCAqKWNvb2tpZSktPmRiZ190aWNrOworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXN0aW5nIGxldmVsIGZvciBhIGZ1bmNjYWxsIGNvb2tpZS4KKyAqLworICAgIGludAorZnVuY19sZXZlbChjb29raWUpCisgICAgdm9pZCAqY29va2llOworeworICAgIHJldHVybiAoKHN0cnVjdCBmdW5jY2FsbCAqKWNvb2tpZSktPmxldmVsOworfQorCisvKiBwb2ludGVyIHRvIGZ1bmNjYWwgZm9yIGN1cnJlbnRseSBhY3RpdmUgZnVuY3Rpb24gKi8KK3N0cnVjdCBmdW5jY2FsbCAqY3VycmVudF9mdW5jY2FsID0gTlVMTDsKKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gYSBmdW5jdGlvbiB3YXMgZW5kZWQgYnkgYSAiOnJldHVybiIgY29tbWFuZC4KKyAqLworICAgIGludAorY3VycmVudF9mdW5jX3JldHVybmVkKCkKK3sKKyAgICByZXR1cm4gY3VycmVudF9mdW5jY2FsLT5yZXR1cm5lZDsKK30KKworCisvKgorICogQXJyYXkgdG8gaG9sZCB0aGUgdmFsdWUgb2YgdjogdmFyaWFibGVzLgorICovCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKiB2YWx1ZXMgZm9yIGZsYWdzOiAqLworI2RlZmluZSBWVl9DT01QQVQgICAxCSAgICAvKiBjb21wYXRpYmxlLCBhbHNvIHVzZWQgd2l0aG91dCAidjoiICovCisjZGVmaW5lIFZWX1JPCSAgICAyCSAgICAvKiByZWFkLW9ubHkgKi8KKworc3RydWN0IHZpbXZhcgoreworICAgIGNoYXIJKm5hbWU7CQkvKiBuYW1lIG9mIHZhcmlhYmxlLCB3aXRob3V0IHY6ICovCisgICAgaW50CQlsZW47CQkvKiBsZW5ndGggb2YgbmFtZSAqLworICAgIGNoYXJfdQkqdmFsOwkJLyogY3VycmVudCB2YWx1ZSAoY2FuIGFsc28gYmUgYSBudW1iZXIhKSAqLworICAgIGNoYXIJdHlwZTsJCS8qIFZBUl9OVU1CRVIgb3IgVkFSX1NUUklORyAqLworICAgIGNoYXIJZmxhZ3M7CQkvKiBWVl9DT01QQVQgYW5kIFZWX1JPICovCit9IHZpbXZhcnNbVlZfTEVOXSA9Cit7ICAgLyogVGhlIG9yZGVyIGhlcmUgbXVzdCBtYXRjaCB0aGUgVlZfIGRlZmluZXMgaW4gdmltLmghICovCisgICAgeyJjb3VudCIsIHNpemVvZigiY291bnQiKSAtIDEsIE5VTEwsIFZBUl9OVU1CRVIsIFZWX0NPTVBBVCtWVl9ST30sCisgICAgeyJjb3VudDEiLCBzaXplb2YoImNvdW50MSIpIC0gMSwgTlVMTCwgVkFSX05VTUJFUiwgVlZfUk99LAorICAgIHsicHJldmNvdW50Iiwgc2l6ZW9mKCJwcmV2Y291bnQiKSAtIDEsIE5VTEwsIFZBUl9OVU1CRVIsIFZWX1JPfSwKKyAgICB7ImVycm1zZyIsIHNpemVvZigiZXJybXNnIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9DT01QQVR9LAorICAgIHsid2FybmluZ21zZyIsIHNpemVvZigid2FybmluZ21zZyIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgMH0sCisgICAgeyJzdGF0dXNtc2ciLCBzaXplb2YoInN0YXR1c21zZyIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgMH0sCisgICAgeyJzaGVsbF9lcnJvciIsIHNpemVvZigic2hlbGxfZXJyb3IiKSAtIDEsIE5VTEwsIFZBUl9OVU1CRVIsCisJCQkJCQkJICAgICBWVl9DT01QQVQrVlZfUk99LAorICAgIHsidGhpc19zZXNzaW9uIiwgc2l6ZW9mKCJ0aGlzX3Nlc3Npb24iKSAtIDEsIE5VTEwsIFZBUl9TVFJJTkcsIFZWX0NPTVBBVH0sCisgICAgeyJ2ZXJzaW9uIiwgc2l6ZW9mKCJ2ZXJzaW9uIikgLSAxLCAoY2hhcl91ICopVklNX1ZFUlNJT05fMTAwLAorCQkJCQkJIFZBUl9OVU1CRVIsIFZWX0NPTVBBVCtWVl9ST30sCisgICAgeyJsbnVtIiwgc2l6ZW9mKCJsbnVtIikgLSAxLCBOVUxMLCBWQVJfTlVNQkVSLCBWVl9ST30sCisgICAgeyJ0ZXJtcmVzcG9uc2UiLCBzaXplb2YoInRlcm1yZXNwb25zZSIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsiZm5hbWUiLCBzaXplb2YoImZuYW1lIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJsYW5nIiwgc2l6ZW9mKCJsYW5nIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJsY190aW1lIiwgc2l6ZW9mKCJsY190aW1lIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJjdHlwZSIsIHNpemVvZigiY3R5cGUiKSAtIDEsIE5VTEwsIFZBUl9TVFJJTkcsIFZWX1JPfSwKKyAgICB7ImNoYXJjb252ZXJ0X2Zyb20iLCBzaXplb2YoImNoYXJjb252ZXJ0X2Zyb20iKSAtIDEsIE5VTEwsIFZBUl9TVFJJTkcsIFZWX1JPfSwKKyAgICB7ImNoYXJjb252ZXJ0X3RvIiwgc2l6ZW9mKCJjaGFyY29udmVydF90byIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsiZm5hbWVfaW4iLCBzaXplb2YoImZuYW1lX2luIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJmbmFtZV9vdXQiLCBzaXplb2YoImZuYW1lX291dCIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsiZm5hbWVfbmV3Iiwgc2l6ZW9mKCJmbmFtZV9uZXciKSAtIDEsIE5VTEwsIFZBUl9TVFJJTkcsIFZWX1JPfSwKKyAgICB7ImZuYW1lX2RpZmYiLCBzaXplb2YoImZuYW1lX2RpZmYiKSAtIDEsIE5VTEwsIFZBUl9TVFJJTkcsIFZWX1JPfSwKKyAgICB7ImNtZGFyZyIsIHNpemVvZigiY21kYXJnIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJmb2xkc3RhcnQiLCBzaXplb2YoImZvbGRzdGFydCIpIC0gMSwgTlVMTCwgVkFSX05VTUJFUiwgVlZfUk99LAorICAgIHsiZm9sZGVuZCIsIHNpemVvZigiZm9sZGVuZCIpIC0gMSwgTlVMTCwgVkFSX05VTUJFUiwgVlZfUk99LAorICAgIHsiZm9sZGRhc2hlcyIsIHNpemVvZigiZm9sZGRhc2hlcyIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsiZm9sZGxldmVsIiwgc2l6ZW9mKCJmb2xkbGV2ZWwiKSAtIDEsIE5VTEwsIFZBUl9OVU1CRVIsIFZWX1JPfSwKKyAgICB7InByb2duYW1lIiwgc2l6ZW9mKCJwcm9nbmFtZSIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsic2VydmVybmFtZSIsIHNpemVvZigic2VydmVybmFtZSIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsiZHlpbmciLCBzaXplb2YoImR5aW5nIikgLSAxLCBOVUxMLCBWQVJfTlVNQkVSLCBWVl9ST30sCisgICAgeyJleGNlcHRpb24iLCBzaXplb2YoImV4Y2VwdGlvbiIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsidGhyb3dwb2ludCIsIHNpemVvZigidGhyb3dwb2ludCIpIC0gMSwgTlVMTCwgVkFSX1NUUklORywgVlZfUk99LAorICAgIHsicmVnaXN0ZXIiLCBzaXplb2YoInJlZ2lzdGVyIikgLSAxLCBOVUxMLCBWQVJfU1RSSU5HLCBWVl9ST30sCisgICAgeyJjbWRiYW5nIiwgc2l6ZW9mKCJjbWRiYW5nIikgLSAxLCBOVUxMLCBWQVJfTlVNQkVSLCBWVl9ST30sCit9OworCitzdGF0aWMgaW50IGV2YWwwIF9fQVJHUygoY2hhcl91ICphcmcsICBWQVIgcmV0dmFyLCBjaGFyX3UgKipuZXh0Y21kLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgZXZhbDEgX19BUkdTKChjaGFyX3UgKiphcmcsIFZBUiByZXR2YXIsIGludCBldmFsdWF0ZSkpOworc3RhdGljIGludCBldmFsMiBfX0FSR1MoKGNoYXJfdSAqKmFyZywgVkFSIHJldHZhciwgaW50IGV2YWx1YXRlKSk7CitzdGF0aWMgaW50IGV2YWwzIF9fQVJHUygoY2hhcl91ICoqYXJnLCBWQVIgcmV0dmFyLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgZXZhbDQgX19BUkdTKChjaGFyX3UgKiphcmcsIFZBUiByZXR2YXIsIGludCBldmFsdWF0ZSkpOworc3RhdGljIGludCBldmFsNSBfX0FSR1MoKGNoYXJfdSAqKmFyZywgVkFSIHJldHZhciwgaW50IGV2YWx1YXRlKSk7CitzdGF0aWMgaW50IGV2YWw2IF9fQVJHUygoY2hhcl91ICoqYXJnLCBWQVIgcmV0dmFyLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgZXZhbDcgX19BUkdTKChjaGFyX3UgKiphcmcsIFZBUiByZXR2YXIsIGludCBldmFsdWF0ZSkpOworc3RhdGljIGludCBnZXRfb3B0aW9uX3ZhciBfX0FSR1MoKGNoYXJfdSAqKmFyZywgVkFSIHJldHZhciwgaW50IGV2YWx1YXRlKSk7CitzdGF0aWMgaW50IGdldF9zdHJpbmdfdmFyIF9fQVJHUygoY2hhcl91ICoqYXJnLCBWQVIgcmV0dmFyLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgZ2V0X2xpdF9zdHJpbmdfdmFyIF9fQVJHUygoY2hhcl91ICoqYXJnLCBWQVIgcmV0dmFyLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgZ2V0X2Vudl92YXIgX19BUkdTKChjaGFyX3UgKiphcmcsIFZBUiByZXR2YXIsIGludCBldmFsdWF0ZSkpOworc3RhdGljIGludCBmaW5kX2ludGVybmFsX2Z1bmMgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3N0YXRpYyBpbnQgZ2V0X2Z1bmNfdmFyIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgbGVuLCBWQVIgcmV0dmFyLCBjaGFyX3UgKiphcmcsIGxpbmVucl9UIGZpcnN0bGluZSwgbGluZW5yX1QgbGFzdGxpbmUsIGludCAqZG9lc3JhbmdlLCBpbnQgZXZhbHVhdGUpKTsKK3N0YXRpYyBpbnQgY2FsbF9mdW5jIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgbGVuLCBWQVIgcmV0dmFyLCBpbnQgYXJnY291bnQsIFZBUiBhcmd2YXJzLCBsaW5lbnJfVCBmaXJzdGxpbmUsIGxpbmVucl9UIGxhc3RsaW5lLCBpbnQgKmRvZXNyYW5nZSwgaW50IGV2YWx1YXRlKSk7CitzdGF0aWMgdm9pZCBmX2FwcGVuZCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2FyZ2MgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9hcmdpZHggX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9hcmd2IF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfYnJvd3NlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyBidWZfVCAqZmluZF9idWZmZXIgX19BUkdTKChWQVIgYXZhcikpOworc3RhdGljIHZvaWQgZl9idWZleGlzdHMgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9idWZsaXN0ZWQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9idWZsb2FkZWQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIGJ1Zl9UICpnZXRfYnVmX3ZhciBfX0FSR1MoKFZBUiBhdmFyKSk7CitzdGF0aWMgdm9pZCBmX2J1Zm5hbWUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9idWZuciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2J1Zndpbm5yIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfYnl0ZTJsaW5lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfY2hhcjJuciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2NpbmRlbnQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9jb2wgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9jb25maXJtIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfY3Njb3BlX2Nvbm5lY3Rpb24gX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9jdXJzb3IgX19BUkdTKChWQVIgYXJnc3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZGVsZXRlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZGlkX2ZpbGV0eXBlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZXNjYXBlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZXZlbnRoYW5kbGVyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZXhlY3V0YWJsZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2V4aXN0cyBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2V4cGFuZCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2ZpbGVyZWFkYWJsZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2ZpbGV3cml0YWJsZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2ZuYW1lbW9kaWZ5IF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZm9sZGNsb3NlZCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2ZvbGRjbG9zZWRlbmQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZm9sZGNsb3NlZF9ib3RoIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIsIGludCBlbmQpKTsKK3N0YXRpYyB2b2lkIGZfZm9sZGxldmVsIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZm9sZHRleHQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9mb3JlZ3JvdW5kIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0YnVmdmFyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0Y2hhciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2dldGNoYXJtb2QgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nZXRjbWRsaW5lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0Y21kcG9zIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0Y3dkIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0ZnNpemUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nZXRmdGltZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2dldGxpbmUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nZXRyZWcgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nZXRyZWd0eXBlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2V0d2lucG9zeCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2dldHdpbnBvc3kgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nZXR3aW52YXIgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9nbG9iIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfZ2xvYnBhdGggX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9oYXMgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9oYXNtYXB0byBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2hpc3RhZGQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9oaXN0ZGVsIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfaGlzdGdldCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2hpc3RuciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2hsZXhpc3RzIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfaGxJRCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2hvc3RuYW1lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfaWNvbnYgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9pbmRlbnQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9pc2RpcmVjdG9yeSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2lucHV0IF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfaW5wdXRkaWFsb2cgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9pbnB1dHJlc3RvcmUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9pbnB1dHNhdmUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9pbnB1dHNlY3JldCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2xhc3RfYnVmZmVyX25yIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfbGliY2FsbCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2xpYmNhbGxuciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBsaWJjYWxsX2NvbW1vbiBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyLCBpbnQgdHlwZSkpOworc3RhdGljIHZvaWQgZl9saW5lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfbGluZTJieXRlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfbGlzcGluZGVudCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX2xvY2FsdGltZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX21hcGFyZyBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX21hcGNoZWNrIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGdldF9tYXBhcmcgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhciwgaW50IGV4YWN0KSk7CitzdGF0aWMgdm9pZCBmX21hdGNoIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfbWF0Y2hlbmQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9tYXRjaHN0ciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX21vZGUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9uZXh0bm9uYmxhbmsgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9ucjJjaGFyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfcHJldm5vbmJsYW5rIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2V0YnVmdmFyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2V0Y21kcG9zIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2V0d2ludmFyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfcmVuYW1lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfcmVzb2x2ZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3NlYXJjaCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3NlYXJjaHBhaXIgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIGludCBnZXRfc2VhcmNoX2FyZyBfX0FSR1MoKFZBUiB2YXJwLCBpbnQgKmZsYWdzcCkpOworc3RhdGljIHZvaWQgZl9yZW1vdGVfZXhwciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3JlbW90ZV9mb3JlZ3JvdW5kIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfcmVtb3RlX3BlZWsgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9yZW1vdGVfcmVhZCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3JlbW90ZV9zZW5kIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2VydmVyMmNsaWVudCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3NlcnZlcmxpc3QgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9zZXRsaW5lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2V0cmVnIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc2ltcGxpZnkgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZmluZF9zb21lX21hdGNoIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIsIGludCBzdGFydCkpOworc3RhdGljIHZvaWQgZl9zdHJmdGltZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N0cmlkeCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N0cmxlbiBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N0cnBhcnQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9zdHJyaWR4IF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfc3RydHJhbnMgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9zeW5JRCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N5bklEYXR0ciBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N5bklEdHJhbnMgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9zeXN0ZW0gX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl9zdWJtYXRjaCBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3N1YnN0aXR1dGUgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl90ZW1wbmFtZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3RvbG93ZXIgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl90b3VwcGVyIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfdHlwZSBfX0FSR1MoKFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyKSk7CitzdGF0aWMgdm9pZCBmX3ZpcnRjb2wgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl92aXN1YWxtb2RlIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfd2luYnVmbnIgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl93aW5jb2wgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl93aW5oZWlnaHQgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl93aW5saW5lIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfd2lubnIgX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHZvaWQgZl93aW5yZXN0Y21kIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIpKTsKK3N0YXRpYyB2b2lkIGZfd2lud2lkdGggX19BUkdTKChWQVIgYXJndmFycywgVkFSIHJldHZhcikpOworc3RhdGljIHdpbl9UICpmaW5kX3dpbl9ieV9uciBfX0FSR1MoKFZBUiB2cCkpOworc3RhdGljIHBvc19UICp2YXIyZnBvcyBfX0FSR1MoKFZBUiB2YXJwLCBpbnQgbG51bSkpOworc3RhdGljIGludCBnZXRfZW52X2xlbiBfX0FSR1MoKGNoYXJfdSAqKmFyZykpOworc3RhdGljIGludCBnZXRfaWRfbGVuIF9fQVJHUygoY2hhcl91ICoqYXJnKSk7CitzdGF0aWMgaW50IGdldF9mdW5jX2xlbiBfX0FSR1MoKGNoYXJfdSAqKmFyZywgY2hhcl91ICoqYWxpYXMsIGludCBldmFsdWF0ZSkpOworc3RhdGljIGNoYXJfdSAqZmluZF9uYW1lX2VuZCBfX0FSR1MoKGNoYXJfdSAqYXJnLCBjaGFyX3UgKipleHByX3N0YXJ0LCBjaGFyX3UgKipleHByX2VuZCkpOworc3RhdGljIGludCBldmFsX2lzbmFtZWMgX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCBmaW5kX3ZpbV92YXIgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBsZW4pKTsKK3N0YXRpYyBpbnQgZ2V0X3Zhcl92YXIgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBsZW4sIFZBUiByZXR2YXIpKTsKK3N0YXRpYyBWQVIgYWxsb2NfdmFyIF9fQVJHUygodm9pZCkpOworc3RhdGljIFZBUiBhbGxvY19zdHJpbmdfdmFyIF9fQVJHUygoY2hhcl91ICpzdHJpbmcpKTsKK3N0YXRpYyB2b2lkIGZyZWVfdmFyIF9fQVJHUygoVkFSIHZhcnApKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3ZhciBfX0FSR1MoKFZBUiB2YXJwKSk7CitzdGF0aWMgbG9uZyBnZXRfdmFyX251bWJlciBfX0FSR1MoKFZBUiB2YXJwKSk7CitzdGF0aWMgbGluZW5yX1QgZ2V0X3Zhcl9sbnVtIF9fQVJHUygoVkFSIGFyZ3ZhcnMpKTsKK3N0YXRpYyBjaGFyX3UgKmdldF92YXJfc3RyaW5nIF9fQVJHUygoVkFSIHZhcnApKTsKK3N0YXRpYyBjaGFyX3UgKmdldF92YXJfc3RyaW5nX2J1ZiBfX0FSR1MoKFZBUiB2YXJwLCBjaGFyX3UgKmJ1ZikpOworc3RhdGljIFZBUiBmaW5kX3ZhciBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IHdyaXRpbmcpKTsKK3N0YXRpYyBWQVIgZmluZF92YXJfaW5fZ2EgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnZhcm5hbWUpKTsKK3N0YXRpYyBnYXJyYXlfVCAqZmluZF92YXJfZ2EgX19BUkdTKChjaGFyX3UgKm5hbWUsIGNoYXJfdSAqKnZhcm5hbWUpKTsKK3N0YXRpYyB2b2lkIHZhcl9mcmVlX29uZSBfX0FSR1MoKFZBUiB2KSk7CitzdGF0aWMgdm9pZCBsaXN0X29uZV92YXIgX19BUkdTKChWQVIgdiwgY2hhcl91ICpwcmVmaXgpKTsKK3N0YXRpYyB2b2lkIGxpc3RfdmltX3ZhciBfX0FSR1MoKGludCBpKSk7CitzdGF0aWMgdm9pZCBsaXN0X29uZV92YXJfYSBfX0FSR1MoKGNoYXJfdSAqcHJlZml4LCBjaGFyX3UgKm5hbWUsIGludCB0eXBlLCBjaGFyX3UgKnN0cmluZykpOworc3RhdGljIHZvaWQgc2V0X3ZhciBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgVkFSIHZhcnApKTsKK3N0YXRpYyB2b2lkIGNvcHlfdmFyIF9fQVJHUygoVkFSIGZyb20sIFZBUiB0bykpOworc3RhdGljIGNoYXJfdSAqZmluZF9vcHRpb25fZW5kIF9fQVJHUygoY2hhcl91ICoqYXJnLCBpbnQgKm9wdF9mbGFncykpOworc3RhdGljIGNoYXJfdSAqdHJhbnNfZnVuY3Rpb25fbmFtZSBfX0FSR1MoKGNoYXJfdSAqKnBwLCBpbnQgc2tpcCwgaW50IGludGVybmFsKSk7CitzdGF0aWMgaW50IGV2YWxfZm5hbWVfc2NyaXB0IF9fQVJHUygoY2hhcl91ICpwKSk7CitzdGF0aWMgaW50IGV2YWxfZm5hbWVfc2lkIF9fQVJHUygoY2hhcl91ICpwKSk7CitzdGF0aWMgdm9pZCBsaXN0X2Z1bmNfaGVhZCBfX0FSR1MoKHVmdW5jX1QgKmZwLCBpbnQgaW5kZW50KSk7CitzdGF0aWMgdm9pZCBjYXRfZnVuY19uYW1lIF9fQVJHUygoY2hhcl91ICpidWYsIHVmdW5jX1QgKmZwKSk7CitzdGF0aWMgdWZ1bmNfVCAqZmluZF9mdW5jIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgdm9pZCBjYWxsX3VzZXJfZnVuYyBfX0FSR1MoKHVmdW5jX1QgKmZwLCBpbnQgYXJnY291bnQsIFZBUiBhcmd2YXJzLCBWQVIgcmV0dmFyLCBsaW5lbnJfVCBmaXJzdGxpbmUsIGxpbmVucl9UIGxhc3RsaW5lKSk7CisKKy8qIE1hZ2ljIGJyYWNlcyBhcmUgYWx3YXlzIGVuYWJsZWQsIG90aGVyd2lzZSBWaW0gc2NyaXB0cyB3b3VsZCBub3QgYmUKKyAqIHBvcnRhYmxlLiAqLworI2RlZmluZSBGRUFUX01BR0lDX0JSQUNFUworCisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKK3N0YXRpYyBjaGFyX3UgKiBtYWtlX2V4cGFuZGVkX25hbWUgX19BUkdTKChjaGFyX3UgKmluX3N0YXJ0LCAgY2hhcl91ICpleHByX3N0YXJ0LCAgY2hhcl91ICpleHByX2VuZCwgIGNoYXJfdSAqaW5fZW5kKSk7CisjZW5kaWYKKworLyoKKyAqIFNldCBhbiBpbnRlcm5hbCB2YXJpYWJsZSB0byBhIHN0cmluZyB2YWx1ZS4gQ3JlYXRlcyB0aGUgdmFyaWFibGUgaWYgaXQgZG9lcworICogbm90IGFscmVhZHkgZXhpc3QuCisgKi8KKyAgICB2b2lkCitzZXRfaW50ZXJuYWxfc3RyaW5nX3ZhcihuYW1lLCB2YWx1ZSkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSp2YWx1ZTsKK3sKKyAgICBjaGFyX3UgICp2YWw7CisgICAgVkFSCSAgICB2YXJwOworCisgICAgdmFsID0gdmltX3N0cnNhdmUodmFsdWUpOworICAgIGlmICh2YWwgIT0gTlVMTCkKKyAgICB7CisJdmFycCA9IGFsbG9jX3N0cmluZ192YXIodmFsKTsKKwlpZiAodmFycCAhPSBOVUxMKQorCXsKKwkgICAgc2V0X3ZhcihuYW1lLCB2YXJwKTsKKwkgICAgZnJlZV92YXIodmFycCk7CisJfQorICAgIH0KK30KKworIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgaW50CitldmFsX2NoYXJjb252ZXJ0KGVuY19mcm9tLCBlbmNfdG8sIGZuYW1lX2Zyb20sIGZuYW1lX3RvKQorICAgIGNoYXJfdQkqZW5jX2Zyb207CisgICAgY2hhcl91CSplbmNfdG87CisgICAgY2hhcl91CSpmbmFtZV9mcm9tOworICAgIGNoYXJfdQkqZm5hbWVfdG87Cit7CisgICAgaW50CQllcnIgPSBGQUxTRTsKKworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9DQ19GUk9NLCBlbmNfZnJvbSwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9DQ19UTywgZW5jX3RvLCAtMSk7CisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZOQU1FX0lOLCBmbmFtZV9mcm9tLCAtMSk7CisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZOQU1FX09VVCwgZm5hbWVfdG8sIC0xKTsKKyAgICBpZiAoZXZhbF90b19ib29sKHBfY2N2LCAmZXJyLCBOVUxMLCBGQUxTRSkpCisJZXJyID0gVFJVRTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfQ0NfRlJPTSwgTlVMTCwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9DQ19UTywgTlVMTCwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9JTiwgTlVMTCwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9PVVQsIE5VTEwsIC0xKTsKKworICAgIGlmIChlcnIpCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoRkVBVF9QT1NUU0NSSVBUKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGludAorZXZhbF9wcmludGV4cHIoZm5hbWUsIGFyZ3MpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBjaGFyX3UJKmFyZ3M7Cit7CisgICAgaW50CQllcnIgPSBGQUxTRTsKKworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9JTiwgZm5hbWUsIC0xKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfQ01EQVJHLCBhcmdzLCAtMSk7CisgICAgaWYgKGV2YWxfdG9fYm9vbChwX3BleHByLCAmZXJyLCBOVUxMLCBGQUxTRSkpCisJZXJyID0gVFJVRTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUVfSU4sIE5VTEwsIC0xKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfQ01EQVJHLCBOVUxMLCAtMSk7CisKKyAgICBpZiAoZXJyKQorICAgIHsKKwltY2hfcmVtb3ZlKGZuYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoRkVBVF9ESUZGKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK2V2YWxfZGlmZihvcmlnZmlsZSwgbmV3ZmlsZSwgb3V0ZmlsZSkKKyAgICBjaGFyX3UJKm9yaWdmaWxlOworICAgIGNoYXJfdQkqbmV3ZmlsZTsKKyAgICBjaGFyX3UJKm91dGZpbGU7Cit7CisgICAgaW50CQllcnIgPSBGQUxTRTsKKworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9JTiwgb3JpZ2ZpbGUsIC0xKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUVfTkVXLCBuZXdmaWxlLCAtMSk7CisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZOQU1FX09VVCwgb3V0ZmlsZSwgLTEpOworICAgICh2b2lkKWV2YWxfdG9fYm9vbChwX2RleCwgJmVyciwgTlVMTCwgRkFMU0UpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9JTiwgTlVMTCwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9ORVcsIE5VTEwsIC0xKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUVfT1VULCBOVUxMLCAtMSk7Cit9CisKKyAgICB2b2lkCitldmFsX3BhdGNoKG9yaWdmaWxlLCBkaWZmZmlsZSwgb3V0ZmlsZSkKKyAgICBjaGFyX3UJKm9yaWdmaWxlOworICAgIGNoYXJfdQkqZGlmZmZpbGU7CisgICAgY2hhcl91CSpvdXRmaWxlOworeworICAgIGludAkJZXJyOworCisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZOQU1FX0lOLCBvcmlnZmlsZSwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9ESUZGLCBkaWZmZmlsZSwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9PVVQsIG91dGZpbGUsIC0xKTsKKyAgICAodm9pZClldmFsX3RvX2Jvb2wocF9wZXgsICZlcnIsIE5VTEwsIEZBTFNFKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUVfSU4sIE5VTEwsIC0xKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUVfRElGRiwgTlVMTCwgLTEpOworICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9GTkFNRV9PVVQsIE5VTEwsIC0xKTsKK30KKyMgZW5kaWYKKworLyoKKyAqIFRvcCBsZXZlbCBldmFsdWF0aW9uIGZ1bmN0aW9uLCByZXR1cm5pbmcgYSBib29sZWFuLgorICogU2V0cyAiZXJyb3IiIHRvIFRSVUUgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICogUmV0dXJuIFRSVUUgb3IgRkFMU0UuCisgKi8KKyAgICBpbnQKK2V2YWxfdG9fYm9vbChhcmcsIGVycm9yLCBuZXh0Y21kLCBza2lwKQorICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJKmVycm9yOworICAgIGNoYXJfdQkqKm5leHRjbWQ7CisgICAgaW50CQlza2lwOwkgICAgLyogb25seSBwYXJzZSwgZG9uJ3QgZXhlY3V0ZSAqLworeworICAgIHZhcgkJcmV0dmFyOworICAgIGludAkJcmV0dmFsID0gRkFMU0U7CisKKyAgICBpZiAoc2tpcCkKKwkrK2Vtc2dfc2tpcDsKKyAgICBpZiAoZXZhbDAoYXJnLCAmcmV0dmFyLCBuZXh0Y21kLCAhc2tpcCkgPT0gRkFJTCkKKyAgICB7CisJKmVycm9yID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkqZXJyb3IgPSBGQUxTRTsKKwlpZiAoIXNraXApCisJeworCSAgICByZXR2YWwgPSAoZ2V0X3Zhcl9udW1iZXIoJnJldHZhcikgIT0gMCk7CisJICAgIGNsZWFyX3ZhcigmcmV0dmFyKTsKKwl9CisgICAgfQorICAgIGlmIChza2lwKQorCS0tZW1zZ19za2lwOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRvcCBsZXZlbCBldmFsdWF0aW9uIGZ1bmN0aW9uLCByZXR1cm5pbmcgYSBzdHJpbmcuICBJZiAic2tpcCIgaXMgVFJVRSwKKyAqIG9ubHkgcGFyc2luZyB0byAibmV4dGNtZCIgaXMgZG9uZSwgd2l0aG91dCByZXBvcnRpbmcgZXJyb3JzLiAgUmV0dXJuCisgKiBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnksIG9yIE5VTEwgZm9yIGZhaWx1cmUgb3Igd2hlbiAic2tpcCIgaXMgVFJVRS4KKyAqLworICAgIGNoYXJfdSAqCitldmFsX3RvX3N0cmluZ19za2lwKGFyZywgbmV4dGNtZCwgc2tpcCkKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBjaGFyX3UJKipuZXh0Y21kOworICAgIGludAkJc2tpcDsJICAgIC8qIG9ubHkgcGFyc2UsIGRvbid0IGV4ZWN1dGUgKi8KK3sKKyAgICB2YXIJCXJldHZhcjsKKyAgICBjaGFyX3UJKnJldHZhbDsKKworICAgIGlmIChza2lwKQorCSsrZW1zZ19za2lwOworICAgIGlmIChldmFsMChhcmcsICZyZXR2YXIsIG5leHRjbWQsICFza2lwKSA9PSBGQUlMIHx8IHNraXApCisJcmV0dmFsID0gTlVMTDsKKyAgICBlbHNlCisgICAgeworCXJldHZhbCA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKCZyZXR2YXIpKTsKKwljbGVhcl92YXIoJnJldHZhcik7CisgICAgfQorICAgIGlmIChza2lwKQorCS0tZW1zZ19za2lwOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRvcCBsZXZlbCBldmFsdWF0aW9uIGZ1bmN0aW9uLCByZXR1cm5pbmcgYSBzdHJpbmcuCisgKiBSZXR1cm4gcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LCBvciBOVUxMIGZvciBmYWlsdXJlLgorICovCisgICAgY2hhcl91ICoKK2V2YWxfdG9fc3RyaW5nKGFyZywgbmV4dGNtZCkKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBjaGFyX3UJKipuZXh0Y21kOworeworICAgIHZhcgkJcmV0dmFyOworICAgIGNoYXJfdQkqcmV0dmFsOworCisgICAgaWYgKGV2YWwwKGFyZywgJnJldHZhciwgbmV4dGNtZCwgVFJVRSkgPT0gRkFJTCkKKwlyZXR2YWwgPSBOVUxMOworICAgIGVsc2UKKyAgICB7CisJcmV0dmFsID0gdmltX3N0cnNhdmUoZ2V0X3Zhcl9zdHJpbmcoJnJldHZhcikpOworCWNsZWFyX3ZhcigmcmV0dmFyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQ2FsbCBldmFsX3RvX3N0cmluZygpIHdpdGggInNhbmRib3giIHNldCBhbmQgbm90IHVzaW5nIGxvY2FsIHZhcmlhYmxlcy4KKyAqLworICAgIGNoYXJfdSAqCitldmFsX3RvX3N0cmluZ19zYWZlKGFyZywgbmV4dGNtZCkKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBjaGFyX3UJKipuZXh0Y21kOworeworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIHZvaWQJKnNhdmVfZnVuY2NhbHA7CisKKyAgICBzYXZlX2Z1bmNjYWxwID0gc2F2ZV9mdW5jY2FsKCk7CisgICAgKytzYW5kYm94OworICAgIHJldHZhbCA9IGV2YWxfdG9fc3RyaW5nKGFyZywgbmV4dGNtZCk7CisgICAgLS1zYW5kYm94OworICAgIHJlc3RvcmVfZnVuY2NhbChzYXZlX2Z1bmNjYWxwKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgMCAvKiBub3QgdXNlZCAqLworLyoKKyAqIFRvcCBsZXZlbCBldmFsdWF0aW9uIGZ1bmN0aW9uLCByZXR1cm5pbmcgYSBzdHJpbmcuCisgKiBBZHZhbmNlcyAiYXJnIiB0byB0aGUgZmlyc3Qgbm9uLWJsYW5rIGFmdGVyIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi4KKyAqIFJldHVybiBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnksIG9yIE5VTEwgZm9yIGZhaWx1cmUuCisgKiBEb2Vzbid0IGdpdmUgZXJyb3IgbWVzc2FnZXMuCisgKi8KKyAgICBjaGFyX3UgKgorZXZhbF9hcmdfdG9fc3RyaW5nKGFyZykKKyAgICBjaGFyX3UJKiphcmc7Cit7CisgICAgdmFyCQlyZXR2YXI7CisgICAgY2hhcl91CSpyZXR2YWw7CisgICAgaW50CQlyZXQ7CisKKyAgICArK2Vtc2dfb2ZmOworCisgICAgcmV0ID0gZXZhbDEoYXJnLCAmcmV0dmFyLCBUUlVFKTsKKyAgICBpZiAocmV0ID09IEZBSUwpCisJcmV0dmFsID0gTlVMTDsKKyAgICBlbHNlCisgICAgeworCXJldHZhbCA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKCZyZXR2YXIpKTsKKwljbGVhcl92YXIoJnJldHZhcik7CisgICAgfQorCisgICAgLS1lbXNnX29mZjsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyoKKyAqIFRvcCBsZXZlbCBldmFsdWF0aW9uIGZ1bmN0aW9uLCByZXR1cm5pbmcgYSBudW1iZXIuCisgKiBFdmFsdWF0ZXMgImV4cHIiIHNpbGVudGx5LgorICogUmV0dXJucyAtMSBmb3IgYW4gZXJyb3IuCisgKi8KKyAgICBpbnQKK2V2YWxfdG9fbnVtYmVyKGV4cHIpCisgICAgY2hhcl91CSpleHByOworeworICAgIHZhcgkJcmV0dmFyOworICAgIGludAkJcmV0dmFsOworICAgIGNoYXJfdQkqcCA9IGV4cHI7CisKKyAgICArK2Vtc2dfb2ZmOworCisgICAgaWYgKGV2YWwxKCZwLCAmcmV0dmFyLCBUUlVFKSA9PSBGQUlMKQorCXJldHZhbCA9IC0xOworICAgIGVsc2UKKyAgICB7CisJcmV0dmFsID0gZ2V0X3Zhcl9udW1iZXIoJnJldHZhcik7CisJY2xlYXJfdmFyKCZyZXR2YXIpOworICAgIH0KKyAgICAtLWVtc2dfb2ZmOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfVVNSX0NNRFMpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDYWxsIHNvbWUgdmltTCBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBzdHJpbmcKKyAqIFVzZXMgYXJndlthcmdjXSBmb3IgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAqLworICAgIGNoYXJfdSAqCitjYWxsX3ZpbV9mdW5jdGlvbihmdW5jLCBhcmdjLCBhcmd2LCBzYWZlKQorICAgIGNoYXJfdSAgICAgICpmdW5jOworICAgIGludAkJYXJnYzsKKyAgICBjaGFyX3UgICAgICAqKmFyZ3Y7CisgICAgaW50CQlzYWZlOwkJLyogdXNlIHRoZSBzYW5kYm94ICovCit7CisgICAgY2hhcl91CSpyZXR2YWwgPSBOVUxMOworICAgIHZhcgkJcmV0dmFyOworICAgIFZBUgkJYXJndmFyczsKKyAgICBsb25nCW47CisgICAgaW50CQlsZW47CisgICAgaW50CQlpOworICAgIGludAkJZG9lc3JhbmdlOworICAgIHZvaWQJKnNhdmVfZnVuY2NhbHAgPSBOVUxMOworCisgICAgYXJndmFycyA9IChWQVIpYWxsb2MoKHVuc2lnbmVkKShhcmdjICogc2l6ZW9mKHZhcikpKTsKKyAgICBpZiAoYXJndmFycyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisJLyogUmVjb2duaXplIGEgbnVtYmVyIGFyZ3VtZW50LCB0aGUgb3RoZXJzIG11c3QgYmUgc3RyaW5ncy4gKi8KKwl2aW1fc3RyMm5yKGFyZ3ZbaV0sIE5VTEwsICZsZW4sIFRSVUUsIFRSVUUsICZuLCBOVUxMKTsKKwlpZiAobGVuICE9IDAgJiYgbGVuID09IChpbnQpU1RSTEVOKGFyZ3ZbaV0pKQorCXsKKwkgICAgYXJndmFyc1tpXS52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisJICAgIGFyZ3ZhcnNbaV0udmFyX3ZhbC52YXJfbnVtYmVyID0gbjsKKwl9CisJZWxzZQorCXsKKwkgICAgYXJndmFyc1tpXS52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisJICAgIGFyZ3ZhcnNbaV0udmFyX3ZhbC52YXJfc3RyaW5nID0gYXJndltpXTsKKwl9CisgICAgfQorCisgICAgaWYgKHNhZmUpCisgICAgeworCXNhdmVfZnVuY2NhbHAgPSBzYXZlX2Z1bmNjYWwoKTsKKwkrK3NhbmRib3g7CisgICAgfQorCisgICAgcmV0dmFyLnZhcl90eXBlID0gVkFSX1VOS05PV047CS8qIGNsZWFyX3ZhcigpIHVzZXMgdGhpcyAqLworICAgIGlmIChjYWxsX2Z1bmMoZnVuYywgKGludClTVFJMRU4oZnVuYyksICZyZXR2YXIsIGFyZ2MsIGFyZ3ZhcnMsCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJICAgICZkb2VzcmFuZ2UsIFRSVUUpID09IE9LKQorCXJldHZhbCA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKCZyZXR2YXIpKTsKKworICAgIGNsZWFyX3ZhcigmcmV0dmFyKTsKKyAgICB2aW1fZnJlZShhcmd2YXJzKTsKKworICAgIGlmIChzYWZlKQorICAgIHsKKwktLXNhbmRib3g7CisJcmVzdG9yZV9mdW5jY2FsKHNhdmVfZnVuY2NhbHApOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qCisgKiBTYXZlIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgcG9pbnRlciwgYW5kIHNldCBpdCB0byBOVUxMLgorICogVXNlZCB3aGVuIGV4ZWN1dGluZyBhdXRvY29tbWFuZHMgYW5kIGZvciAiOnNvdXJjZSIuCisgKi8KKyAgICB2b2lkICoKK3NhdmVfZnVuY2NhbCgpCit7CisgICAgc3RydWN0IGZ1bmNjYWxsICpmYzsKKworICAgIGZjID0gY3VycmVudF9mdW5jY2FsOworICAgIGN1cnJlbnRfZnVuY2NhbCA9IE5VTEw7CisgICAgcmV0dXJuICh2b2lkICopZmM7Cit9CisKKyAgICB2b2lkCityZXN0b3JlX2Z1bmNjYWwoZmMpCisgICAgdm9pZCAqZmM7Cit7CisgICAgY3VycmVudF9mdW5jY2FsID0gKHN0cnVjdCBmdW5jY2FsbCAqKWZjOworfQorCisjaWZkZWYgRkVBVF9GT0xESU5HCisvKgorICogRXZhbHVhdGUgJ2ZvbGRleHByJy4gIFJldHVybnMgdGhlIGZvbGRsZXZlbCwgYW5kIGFueSBjaGFyYWN0ZXIgcHJlY2VkaW5nCisgKiBpdCBpbiAiKmNwIi4gIERvZXNuJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlcy4KKyAqLworICAgIGludAorZXZhbF9mb2xkZXhwcihhcmcsIGNwKQorICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJKmNwOworeworICAgIHZhcgkJcmV0dmFyOworICAgIGludAkJcmV0dmFsOworICAgIGNoYXJfdQkqczsKKworICAgICsrZW1zZ19vZmY7CisgICAgKytzYW5kYm94OworICAgICpjcCA9IE5VTDsKKyAgICBpZiAoZXZhbDAoYXJnLCAmcmV0dmFyLCBOVUxMLCBUUlVFKSA9PSBGQUlMKQorCXJldHZhbCA9IDA7CisgICAgZWxzZQorICAgIHsKKwkvKiBJZiB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyLiAqLworCWlmIChyZXR2YXIudmFyX3R5cGUgPT0gVkFSX05VTUJFUikKKwkgICAgcmV0dmFsID0gcmV0dmFyLnZhcl92YWwudmFyX251bWJlcjsKKwllbHNlIGlmIChyZXR2YXIudmFyX3R5cGUgPT0gVkFSX1VOS05PV04KKwkJfHwgcmV0dmFyLnZhcl92YWwudmFyX3N0cmluZyA9PSBOVUxMKQorCSAgICByZXR2YWwgPSAwOworCWVsc2UKKwl7CisJICAgIC8qIElmIHRoZSByZXN1bHQgaXMgYSBzdHJpbmcsIGNoZWNrIGlmIHRoZXJlIGlzIGEgbm9uLWRpZ2l0IGJlZm9yZQorCSAgICAgKiB0aGUgbnVtYmVyLiAqLworCSAgICBzID0gcmV0dmFyLnZhcl92YWwudmFyX3N0cmluZzsKKwkgICAgaWYgKCFWSU1fSVNESUdJVCgqcykgJiYgKnMgIT0gJy0nKQorCQkqY3AgPSAqcysrOworCSAgICByZXR2YWwgPSBhdG9sKChjaGFyICopcyk7CisJfQorCWNsZWFyX3ZhcigmcmV0dmFyKTsKKyAgICB9CisgICAgLS1lbXNnX29mZjsKKyAgICAtLXNhbmRib3g7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01BR0lDX0JSQUNFUworLyoKKyAqIEV4cGFuZHMgb3V0IHRoZSAnbWFnaWMnIHt9J3MgaW4gYSB2YXJpYWJsZS9mdW5jdGlvbiBuYW1lLgorICogTm90ZSB0aGF0IHRoaXMgY2FuIGNhbGwgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0byBkZWFsIHdpdGgKKyAqIGNvbnN0cnVjdHMgbGlrZSBmb297YmFyfXtiYXp9e2JhbX0KKyAqIFRoZSBmb3VyIHBvaW50ZXIgYXJndW1lbnRzIHBvaW50IHRvICJmb297ZXhwcmV9c3N7aW9ufWJhciIKKyAqCQkJImluX3N0YXJ0IiAgICAgIF4KKyAqCQkJImV4cHJfc3RhcnQiCSAgIF4KKyAqCQkJImV4cHJfZW5kIgkJIF4KKyAqCQkJImluX2VuZCIJCQkgICAgXgorICoKKyAqIFJldHVybnMgYSBuZXcgYWxsb2NhdGVkIHN0cmluZywgd2hpY2ggdGhlIGNhbGxlciBtdXN0IGZyZWUuCisgKiBSZXR1cm5zIE5VTEwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK21ha2VfZXhwYW5kZWRfbmFtZShpbl9zdGFydCwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGluX2VuZCkKKyAgICBjaGFyX3UJKmluX3N0YXJ0OworICAgIGNoYXJfdQkqZXhwcl9zdGFydDsKKyAgICBjaGFyX3UJKmV4cHJfZW5kOworICAgIGNoYXJfdQkqaW5fZW5kOworeworICAgIGNoYXJfdQljMTsKKyAgICBjaGFyX3UJKnJldHZhbCA9IE5VTEw7CisgICAgY2hhcl91CSp0ZW1wX3Jlc3VsdDsKKyAgICBjaGFyX3UJKm5leHRjbWQgPSBOVUxMOworCisgICAgaWYgKGV4cHJfZW5kID09IE5VTEwgfHwgaW5fZW5kID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgKmV4cHJfc3RhcnQJPSBOVUw7CisgICAgKmV4cHJfZW5kID0gTlVMOworICAgIGMxID0gKmluX2VuZDsKKyAgICAqaW5fZW5kID0gTlVMOworCisgICAgdGVtcF9yZXN1bHQgPSBldmFsX3RvX3N0cmluZyhleHByX3N0YXJ0ICsgMSwgJm5leHRjbWQpOworICAgIGlmICh0ZW1wX3Jlc3VsdCAhPSBOVUxMICYmIG5leHRjbWQgPT0gTlVMTCkKKyAgICB7CisJcmV0dmFsID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4odGVtcF9yZXN1bHQpICsgKGV4cHJfc3RhcnQgLSBpbl9zdGFydCkKKwkJCQkJCSAgICsgKGluX2VuZCAtIGV4cHJfZW5kKSArIDEpKTsKKworCWlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICAgIFNUUkNQWShyZXR2YWwsIGluX3N0YXJ0KTsKKwkgICAgU1RSQ0FUKHJldHZhbCwgdGVtcF9yZXN1bHQpOworCSAgICBTVFJDQVQocmV0dmFsLCBleHByX2VuZCArIDEpOworCX0KKyAgICB9CisgICAgdmltX2ZyZWUodGVtcF9yZXN1bHQpOworCisgICAgKmluX2VuZCA9IGMxOwkJLyogcHV0IGNoYXIgYmFjayBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAqZXhwcl9zdGFydCA9ICd7JzsKKyAgICAqZXhwcl9lbmQgPSAnfSc7CisKKyAgICBpZiAocmV0dmFsICE9IE5VTEwpCisgICAgeworCXRlbXBfcmVzdWx0ID0gZmluZF9uYW1lX2VuZChyZXR2YWwsICZleHByX3N0YXJ0LCAmZXhwcl9lbmQpOworCWlmIChleHByX3N0YXJ0ICE9IE5VTEwpCisJeworCSAgICAvKiBGdXJ0aGVyIGV4cGFuc2lvbiEgKi8KKwkgICAgdGVtcF9yZXN1bHQgPSBtYWtlX2V4cGFuZGVkX25hbWUocmV0dmFsLCBleHByX3N0YXJ0LAorCQkJCQkJICAgICAgIGV4cHJfZW5kLCB0ZW1wX3Jlc3VsdCk7CisJICAgIHZpbV9mcmVlKHJldHZhbCk7CisJICAgIHJldHZhbCA9IHRlbXBfcmVzdWx0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworCit9CisjZW5kaWYgLyogRkVBVF9NQUdJQ19CUkFDRVMgKi8KKworLyoKKyAqICI6bGV0IHZhciA9IGV4cHIiCWFzc2lnbm1lbnQgY29tbWFuZC4KKyAqICI6bGV0IHZhciIJCWxpc3Qgb25lIHZhcmlhYmxlIHZhbHVlCisgKiAiOmxldCIJCWxpc3QgYWxsIHZhcmlhYmxlIHZhbHVlcworICovCisgICAgdm9pZAorZXhfbGV0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKmV4cHI7CisgICAgY2hhcl91CSpuYW1lOworICAgIFZBUgkJdmFycDsKKyAgICB2YXIJCXJldHZhcjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQljMSA9IDAsIGMyOworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKmV4cHJfc3RhcnQ7CisgICAgY2hhcl91CSpleHByX2VuZDsKKyAgICBjaGFyX3UJKm5hbWVfZW5kOworCisgICAgbmFtZV9lbmQgPSBmaW5kX25hbWVfZW5kKGFyZywgJmV4cHJfc3RhcnQsICZleHByX2VuZCk7CisgICAgZXhwciA9IHZpbV9zdHJjaHIobmFtZV9lbmQsICc9Jyk7CisgICAgaWYgKGV4cHIgPT0gTlVMTCkKKyAgICB7CisJaWYgKGVuZHNfZXhjbWQoKmFyZykpCisJeworCSAgICBpZiAoIWVhcC0+c2tpcCkKKwkgICAgeworCQkvKgorCQkgKiBMaXN0IGFsbCB2YXJpYWJsZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgdmFyaWFibGVzLmdhX2xlbiAmJiAhZ290X2ludDsgKytpKQorCQkgICAgaWYgKFZBUl9FTlRSWShpKS52YXJfbmFtZSAhPSBOVUxMKQorCQkJbGlzdF9vbmVfdmFyKCZWQVJfRU5UUlkoaSksIChjaGFyX3UgKikiIik7CisJCWZvciAoaSA9IDA7IGkgPCBjdXJidWYtPmJfdmFycy5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraSkKKwkJICAgIGlmIChCVkFSX0VOVFJZKGkpLnZhcl9uYW1lICE9IE5VTEwpCisJCQlsaXN0X29uZV92YXIoJkJWQVJfRU5UUlkoaSksIChjaGFyX3UgKikiYjoiKTsKKwkJZm9yIChpID0gMDsgaSA8IGN1cndpbi0+d192YXJzLmdhX2xlbiAmJiAhZ290X2ludDsgKytpKQorCQkgICAgaWYgKFdWQVJfRU5UUlkoaSkudmFyX25hbWUgIT0gTlVMTCkKKwkJCWxpc3Rfb25lX3ZhcigmV1ZBUl9FTlRSWShpKSwgKGNoYXJfdSAqKSJ3OiIpOworCQlmb3IgKGkgPSAwOyBpIDwgVlZfTEVOICYmICFnb3RfaW50OyArK2kpCisJCSAgICBpZiAodmltdmFyc1tpXS50eXBlID09IFZBUl9OVU1CRVIgfHwgdmltdmFyc1tpXS52YWwgIT0gTlVMTCkKKwkJCWxpc3RfdmltX3ZhcihpKTsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBpbnQJCWVycm9yID0gRkFMU0U7CisKKwkgICAgLyoKKwkgICAgICogTGlzdCB2YXJpYWJsZXMuCisJICAgICAqLworCSAgICB3aGlsZSAoIWVuZHNfZXhjbWQoKmFyZykgJiYgIWdvdF9pbnQpCisJICAgIHsKKwkJY2hhcl91CSp0ZW1wX3N0cmluZyA9IE5VTEw7CisJCWludAlhcmdfbGVuOworCisJCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgbmFtZS4gKi8KKwkJbmFtZV9lbmQgPSBmaW5kX25hbWVfZW5kKGFyZywgJmV4cHJfc3RhcnQsICZleHByX2VuZCk7CisKKwkJaWYgKCF2aW1faXN3aGl0ZSgqbmFtZV9lbmQpICYmICFlbmRzX2V4Y21kKCpuYW1lX2VuZCkpCisJCXsKKwkJICAgIGVtc2dfc2V2ZXJlID0gVFJVRTsKKwkJICAgIEVNU0coXyhlX3RyYWlsaW5nKSk7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoIWVycm9yICYmICFlYXAtPnNraXApCisJCXsKKyNpZmRlZiBGRUFUX01BR0lDX0JSQUNFUworCQkgICAgaWYgKGV4cHJfc3RhcnQgIT0gTlVMTCkKKwkJICAgIHsKKwkJCXRlbXBfc3RyaW5nID0gbWFrZV9leHBhbmRlZF9uYW1lKGFyZywgZXhwcl9zdGFydCwKKwkJCQkJCQkgZXhwcl9lbmQsIG5hbWVfZW5kKTsKKwkJCWlmICh0ZW1wX3N0cmluZyA9PSBOVUxMKQorCQkJeworCQkJICAgIC8qCisJCQkgICAgICogUmVwb3J0IGFuIGludmFsaWQgZXhwcmVzc2lvbiBpbiBicmFjZXMsIHVubGVzcworCQkJICAgICAqIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZQorCQkJICAgICAqIHRvIGFuIGFib3J0aW5nIGVycm9yLCBhbiBpbnRlcnJ1cHQsIG9yIGFuCisJCQkgICAgICogZXhjZXB0aW9uLgorCQkJICAgICAqLworCQkJICAgIGlmICghYWJvcnRpbmcoKSkKKwkJCSAgICB7CisJCQkJZW1zZ19zZXZlcmUgPSBUUlVFOworCQkJCUVNU0cyKF8oZV9pbnZhcmcyKSwgYXJnKTsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQkgICAgZXJyb3IgPSBUUlVFOworCQkJICAgIGFyZyA9IHNraXB3aGl0ZShuYW1lX2VuZCk7CisJCQkgICAgY29udGludWU7CisJCQl9CisJCQlhcmcgPSB0ZW1wX3N0cmluZzsKKwkJCWFyZ19sZW4gPSBTVFJMRU4odGVtcF9zdHJpbmcpOworCQkgICAgfQorCQkgICAgZWxzZQorI2VuZGlmCisJCSAgICB7CisJCQljMSA9ICpuYW1lX2VuZDsKKwkJCSpuYW1lX2VuZCA9IE5VTDsKKwkJCWFyZ19sZW4gPSAoaW50KShuYW1lX2VuZCAtIGFyZyk7CisJCSAgICB9CisJCSAgICBpID0gZmluZF92aW1fdmFyKGFyZywgYXJnX2xlbik7CisJCSAgICBpZiAoaSA+PSAwKQorCQkJbGlzdF92aW1fdmFyKGkpOworCQkgICAgZWxzZSBpZiAoU1RSQ01QKCJiOmNoYW5nZWR0aWNrIiwgYXJnKSA9PSAwKQorCQkgICAgeworCQkJY2hhcl91CW51bWJ1ZltOVU1CVUZMRU5dOworCisJCQlzcHJpbnRmKChjaGFyICopbnVtYnVmLCAiJWxkIiwKKwkJCQkJCSAobG9uZyljdXJidWYtPmJfY2hhbmdlZHRpY2spOworCQkJbGlzdF9vbmVfdmFyX2EoKGNoYXJfdSAqKSJiOiIsIChjaGFyX3UgKikiY2hhbmdlZHRpY2siLAorCQkJCQkJCSAgVkFSX05VTUJFUiwgbnVtYnVmKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCXZhcnAgPSBmaW5kX3ZhcihhcmcsIEZBTFNFKTsKKwkJCWlmICh2YXJwID09IE5VTEwpCisJCQl7CisJCQkgICAgLyogU2tpcCBmdXJ0aGVyIGFyZ3VtZW50cyBidXQgZG8gY29udGludWUgdG8KKwkJCSAgICAgKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4gKi8KKwkJCSAgICBFTVNHMihfKCJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiKSwgYXJnKTsKKwkJCSAgICBlcnJvciA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgbmFtZSA9IHZpbV9zdHJjaHIoYXJnLCAnOicpOworCQkJICAgIGlmIChuYW1lICE9IE5VTEwpCisJCQkgICAgeworCQkJCS8qICJhOiIgdmFycyBoYXZlIG5vIG5hbWUgc3RvcmVkLCB1c2Ugd2hvbGUKKwkJCQkgKiBhcmcgKi8KKwkJCQlpZiAoYXJnWzBdID09ICdhJyAmJiBhcmdbMV0gPT0gJzonKQorCQkJCSAgICBjMiA9IE5VTDsKKwkJCQllbHNlCisJCQkJeworCQkJCSAgICBjMiA9ICorK25hbWU7CisJCQkJICAgICpuYW1lID0gTlVMOworCQkJCX0KKwkJCQlsaXN0X29uZV92YXIodmFycCwgYXJnKTsKKwkJCQlpZiAoYzIgIT0gTlVMKQorCQkJCSAgICAqbmFtZSA9IGMyOworCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkJbGlzdF9vbmVfdmFyKHZhcnAsIChjaGFyX3UgKikiIik7CisJCQl9CisJCSAgICB9CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKwkJICAgIGlmIChleHByX3N0YXJ0ICE9IE5VTEwpCisJCQl2aW1fZnJlZSh0ZW1wX3N0cmluZyk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSpuYW1lX2VuZCA9IGMxOworCQl9CisJCWFyZyA9IHNraXB3aGl0ZShuYW1lX2VuZCk7CisJICAgIH0KKwl9CisJZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChhcmcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChlYXAtPnNraXApCisJICAgICsrZW1zZ19za2lwOworCWkgPSBldmFsMChleHByICsgMSwgJnJldHZhciwgJmVhcC0+bmV4dGNtZCwgIWVhcC0+c2tpcCk7CisJaWYgKGVhcC0+c2tpcCkKKwl7CisJICAgIGlmIChpICE9IEZBSUwpCisJCWNsZWFyX3ZhcigmcmV0dmFyKTsKKwkgICAgLS1lbXNnX3NraXA7CisJfQorCWVsc2UgaWYgKGkgIT0gRkFJTCkKKwl7CisJICAgIC8qCisJICAgICAqICI6bGV0ICRWQVIgPSBleHByIjogU2V0IGVudmlyb25tZW50IHZhcmlhYmxlLgorCSAgICAgKi8KKwkgICAgaWYgKCphcmcgPT0gJyQnKQorCSAgICB7CisJCWludAlsZW47CisJCWludAljYzsKKworCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIG5hbWUuICovCisJCSsrYXJnOworCQluYW1lID0gYXJnOworCQlsZW4gPSBnZXRfZW52X2xlbigmYXJnKTsKKwkJaWYgKGxlbiA9PSAwKQorCQkgICAgRU1TRzIoXyhlX2ludmFyZzIpLCBuYW1lIC0gMSk7CisJCWVsc2UKKwkJeworCQkgICAgaWYgKCpza2lwd2hpdGUoYXJnKSAhPSAnPScpCisJCQlFTVNHKF8oZV9sZXR1bmV4cCkpOworCQkgICAgZWxzZQorCQkgICAgeworCQkJY2MgPSBuYW1lW2xlbl07CisJCQluYW1lW2xlbl0gPSBOVUw7CisJCQlwID0gZ2V0X3Zhcl9zdHJpbmcoJnJldHZhcik7CisJCQl2aW1fc2V0ZW52KG5hbWUsIHApOworCQkJaWYgKFNUUklDTVAobmFtZSwgIkhPTUUiKSA9PSAwKQorCQkJICAgIGluaXRfaG9tZWRpcigpOworCQkJZWxzZSBpZiAoZGlkc2V0X3ZpbSAmJiBTVFJJQ01QKG5hbWUsICJWSU0iKSA9PSAwKQorCQkJICAgIGRpZHNldF92aW0gPSBGQUxTRTsKKwkJCWVsc2UgaWYgKGRpZHNldF92aW1ydW50aW1lCisJCQkJCSAgJiYgU1RSSUNNUChuYW1lLCAiVklNUlVOVElNRSIpID09IDApCisJCQkgICAgZGlkc2V0X3ZpbXJ1bnRpbWUgPSBGQUxTRTsKKwkJCW5hbWVbbGVuXSA9IGNjOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiAiOmxldCAmb3B0aW9uID0gZXhwciI6IFNldCBvcHRpb24gdmFsdWUuCisJICAgICAqICI6bGV0ICZsOm9wdGlvbiA9IGV4cHIiOiBTZXQgbG9jYWwgb3B0aW9uIHZhbHVlLgorCSAgICAgKiAiOmxldCAmZzpvcHRpb24gPSBleHByIjogU2V0IGdsb2JhbCBvcHRpb24gdmFsdWUuCisJICAgICAqLworCSAgICBlbHNlIGlmICgqYXJnID09ICcmJykKKwkgICAgeworCQlpbnQgb3B0X2ZsYWdzOworCisJCS8qCisJCSAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgbmFtZTsKKwkJICovCisJCXAgPSBmaW5kX29wdGlvbl9lbmQoJmFyZywgJm9wdF9mbGFncyk7CisJCWlmIChwID09IE5VTEwgfHwgKnNraXB3aGl0ZShwKSAhPSAnPScpCisJCSAgICBFTVNHKF8oZV9sZXR1bmV4cCkpOworCQllbHNlCisJCXsKKwkJICAgIGMxID0gKnA7CisJCSAgICAqcCA9IE5VTDsKKwkJICAgIHNldF9vcHRpb25fdmFsdWUoYXJnLCBnZXRfdmFyX251bWJlcigmcmV0dmFyKSwKKwkJCQkJICBnZXRfdmFyX3N0cmluZygmcmV0dmFyKSwgb3B0X2ZsYWdzKTsKKwkJICAgICpwID0gYzE7CQkgICAgLyogcHV0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzICovCisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqICI6bGV0IEByID0gZXhwciI6IFNldCByZWdpc3RlciBjb250ZW50cy4KKwkgICAgICovCisJICAgIGVsc2UgaWYgKCphcmcgPT0gJ0AnKQorCSAgICB7CisJCSsrYXJnOworCQlpZiAoKnNraXB3aGl0ZShhcmcgKyAxKSAhPSAnPScpCisJCSAgICBFTVNHKF8oZV9sZXR1bmV4cCkpOworCQllbHNlCisJCSAgICB3cml0ZV9yZWdfY29udGVudHMoKmFyZyA9PSAnQCcgPyAnIicgOiAqYXJnLAorCQkJCQkgIGdldF92YXJfc3RyaW5nKCZyZXR2YXIpLCAtMSwgRkFMU0UpOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogIjpsZXQgdmFyID0gZXhwciI6IFNldCBpbnRlcm5hbCB2YXJpYWJsZS4KKwkgICAgICovCisJICAgIGVsc2UgaWYgKGV2YWxfaXNuYW1lYygqYXJnKSAmJiAhVklNX0lTRElHSVQoKmFyZykpCisJICAgIHsKKwkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBuYW1lLiAqLworCQlwID0gZmluZF9uYW1lX2VuZChhcmcsICZleHByX3N0YXJ0LCAmZXhwcl9lbmQpOworCisJCWlmICgqc2tpcHdoaXRlKHApICE9ICc9JykKKwkJICAgIEVNU0coXyhlX2xldHVuZXhwKSk7CisJCWVsc2UgaWYgKHAgLSBhcmcgPT0gMTMKKwkJCQkgICAgJiYgU1RSTkNNUChhcmcsICJiOmNoYW5nZWR0aWNrIiwgMTMpID09IDApCisJCSAgICBFTVNHMihfKGVfcmVhZG9ubHl2YXIpLCBhcmcpOworI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisJCWVsc2UgaWYgKGV4cHJfc3RhcnQgIT0gTlVMTCkKKwkJeworCQkgICAgY2hhcl91ICAqdGVtcF9zdHJpbmc7CisKKwkJICAgIHRlbXBfc3RyaW5nID0gbWFrZV9leHBhbmRlZF9uYW1lKGFyZywgZXhwcl9zdGFydCwKKwkJCQkJCQkJIGV4cHJfZW5kLCBwKTsKKwkJICAgIGlmICh0ZW1wX3N0cmluZyA9PSBOVUxMKQorCQkgICAgeworCQkJLyoKKwkJCSAqIFJlcG9ydCBhbiBpbnZhbGlkIGV4cHJlc3Npb24gaW4gYnJhY2VzLCB1bmxlc3MgdGhlCisJCQkgKiBleHByZXNzaW9uIGV2YWx1YXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbgorCQkJICogYWJvcnRpbmcgZXJyb3IsIGFuIGludGVycnVwdCwgb3IgYW4gZXhjZXB0aW9uLgorCQkJICovCisJCQlpZiAoIWFib3J0aW5nKCkpCisJCQkgICAgRU1TRzIoXyhlX2ludmFyZzIpLCBhcmcpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJc2V0X3Zhcih0ZW1wX3N0cmluZywgJnJldHZhcik7CisJCQl2aW1fZnJlZSh0ZW1wX3N0cmluZyk7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCQllbHNlCisJCXsKKwkJICAgIGMxID0gKnA7CisJCSAgICAqcCA9IE5VTDsKKwkJICAgIHNldF92YXIoYXJnLCAmcmV0dmFyKTsKKwkJICAgICpwID0gYzE7CQkvKiBwdXQgY2hhciBiYWNrIGZvciBlcnJvciBtZXNzYWdlcyAqLworCQl9CisJICAgIH0KKworCSAgICBlbHNlCisJICAgIHsKKwkJRU1TRzIoXyhlX2ludmFyZzIpLCBhcmcpOworCSAgICB9CisKKwkgICAgY2xlYXJfdmFyKCZyZXR2YXIpOworCX0KKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKworICAgIHZvaWQKK3NldF9jb250ZXh0X2Zvcl9leHByZXNzaW9uKHhwLCBhcmcsIGNtZGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgY2hhcl91CSphcmc7CisgICAgY21kaWR4X1QJY21kaWR4OworeworICAgIGludAkJZ290X2VxID0gRkFMU0U7CisgICAgaW50CQljOworCisgICAgeHAtPnhwX2NvbnRleHQgPSBjbWRpZHggPT0gQ01EX2xldCA/IEVYUEFORF9VU0VSX1ZBUlMKKwkJCQkgICAgICAgOiBjbWRpZHggPT0gQ01EX2NhbGwgPyBFWFBBTkRfRlVOQ1RJT05TCisJCQkJICAgICAgIDogRVhQQU5EX0VYUFJFU1NJT047CisgICAgd2hpbGUgKCh4cC0+eHBfcGF0dGVybiA9IHZpbV9zdHJwYnJrKGFyZywKKwkJCQkgIChjaGFyX3UgKikiXCInKy0qLyUuPSE/fnwmJChbPD4sIyIpKSAhPSBOVUxMKQorICAgIHsKKwljID0gKnhwLT54cF9wYXR0ZXJuOworCWlmIChjID09ICcmJykKKwl7CisJICAgIGMgPSB4cC0+eHBfcGF0dGVyblsxXTsKKwkgICAgaWYgKGMgPT0gJyYnKQorCSAgICB7CisJCSsreHAtPnhwX3BhdHRlcm47CisJCXhwLT54cF9jb250ZXh0ID0gY21kaWR4ICE9IENNRF9sZXQgfHwgZ290X2VxCisJCQkJCSA/IEVYUEFORF9FWFBSRVNTSU9OIDogRVhQQU5EX05PVEhJTkc7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYyAhPSAnICcpCisJCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX1NFVFRJTkdTOworCX0KKwllbHNlIGlmIChjID09ICckJykKKwl7CisJICAgIC8qIGVudmlyb25tZW50IHZhcmlhYmxlICovCisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0VOVl9WQVJTOworCX0KKwllbHNlIGlmIChjID09ICc9JykKKwl7CisJICAgIGdvdF9lcSA9IFRSVUU7CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0VYUFJFU1NJT047CisJfQorCWVsc2UgaWYgKGMgPT0gJzwnCisJCSYmIHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9GVU5DVElPTlMKKwkJJiYgdmltX3N0cmNocih4cC0+eHBfcGF0dGVybiwgJygnKSA9PSBOVUxMKQorCXsKKwkgICAgLyogRnVuY3Rpb24gbmFtZSBjYW4gc3RhcnQgd2l0aCAiPFNOUj4iICovCisJICAgIGJyZWFrOworCX0KKwllbHNlIGlmIChjbWRpZHggIT0gQ01EX2xldCB8fCBnb3RfZXEpCisJeworCSAgICBpZiAoYyA9PSAnIicpCSAgICAvKiBzdHJpbmcgKi8KKwkgICAgeworCQl3aGlsZSAoKGMgPSAqKyt4cC0+eHBfcGF0dGVybikgIT0gTlVMICYmIGMgIT0gJyInKQorCQkgICAgaWYgKGMgPT0gJ1xcJyAmJiB4cC0+eHBfcGF0dGVyblsxXSAhPSBOVUwpCisJCQkrK3hwLT54cF9wYXR0ZXJuOworCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCSAgICB9CisJICAgIGVsc2UgaWYgKGMgPT0gJ1wnJykJICAgIC8qIGxpdGVyYWwgc3RyaW5nICovCisJICAgIHsKKwkJd2hpbGUgKChjID0gKisreHAtPnhwX3BhdHRlcm4pICE9IE5VTCAmJiBjICE9ICdcJycpCisJCSAgICAvKiBza2lwICovIDsKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwkgICAgfQorCSAgICBlbHNlIGlmIChjID09ICd8JykKKwkgICAgeworCQlpZiAoeHAtPnhwX3BhdHRlcm5bMV0gPT0gJ3wnKQorCQl7CisJCSAgICArK3hwLT54cF9wYXR0ZXJuOworCQkgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfRVhQUkVTU0lPTjsKKwkJfQorCQllbHNlCisJCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9DT01NQU5EUzsKKwkgICAgfQorCSAgICBlbHNlCisJCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0VYUFJFU1NJT047CisJfQorCWVsc2UKKwkgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwlhcmcgPSB4cC0+eHBfcGF0dGVybjsKKwlpZiAoKmFyZyAhPSBOVUwpCisJICAgIHdoaWxlICgoYyA9ICorK2FyZykgIT0gTlVMICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQorCQkvKiBza2lwICovIDsKKyAgICB9CisgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7Cit9CisKKyNlbmRpZiAvKiBGRUFUX0NNRExfQ09NUEwgKi8KKworLyoKKyAqICI6MSwyNWNhbGwgZnVuYyhhcmcxLCBhcmcyKSIJZnVuY3Rpb24gY2FsbC4KKyAqLworICAgIHZvaWQKK2V4X2NhbGwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOworICAgIGNoYXJfdQkqc3RhcnRhcmc7CisgICAgY2hhcl91CSphbGlhczsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgdmFyCQlyZXR2YXI7CisgICAgaW50CQlsZW47CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCWRvZXNyYW5nZTsKKyAgICBpbnQJCWZhaWxlZCA9IEZBTFNFOworCisgICAgbmFtZSA9IGFyZzsKKyAgICBsZW4gPSBnZXRfZnVuY19sZW4oJmFyZywgJmFsaWFzLCAhZWFwLT5za2lwKTsKKyAgICBpZiAobGVuID09IDApCisJZ290byBlbmQ7CisgICAgaWYgKGFsaWFzICE9IE5VTEwpCisJbmFtZSA9IGFsaWFzOworCisgICAgc3RhcnRhcmcgPSBhcmc7CisgICAgcmV0dmFyLnZhcl90eXBlID0gVkFSX1VOS05PV047CS8qIGNsZWFyX3ZhcigpIHVzZXMgdGhpcyAqLworCisgICAgaWYgKCpzdGFydGFyZyAhPSAnKCcpCisgICAgeworCUVNU0cyKF8oIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIpLCBuYW1lKTsKKwlnb3RvIGVuZDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gc2tpcHBpbmcsIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBvbmNlLCB0byBmaW5kIHRoZSBlbmQgb2YgdGhlCisgICAgICogYXJndW1lbnRzLgorICAgICAqIFdoZW4gdGhlIGZ1bmN0aW9uIHRha2VzIGEgcmFuZ2UsIHRoaXMgaXMgZGlzY292ZXJlZCBhZnRlciB0aGUgZmlyc3QKKyAgICAgKiBjYWxsLCBhbmQgdGhlIGxvb3AgaXMgYnJva2VuLgorICAgICAqLworICAgIGlmIChlYXAtPnNraXApCisgICAgeworCSsrZW1zZ19za2lwOworCWxudW0gPSBlYXAtPmxpbmUyOwkvKiBkbyBpdCBvbmNlLCBhbHNvIHdpdGggYW4gaW52YWxpZCByYW5nZSAqLworICAgIH0KKyAgICBlbHNlCisJbG51bSA9IGVhcC0+bGluZTE7CisgICAgZm9yICggOyBsbnVtIDw9IGVhcC0+bGluZTI7ICsrbG51bSkKKyAgICB7CisJaWYgKCFlYXAtPnNraXAgJiYgZWFwLT5hZGRyX2NvdW50ID4gMCkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwl9CisJYXJnID0gc3RhcnRhcmc7CisJaWYgKGdldF9mdW5jX3ZhcihuYW1lLCBsZW4sICZyZXR2YXIsICZhcmcsCisJCSAgICAgIGVhcC0+bGluZTEsIGVhcC0+bGluZTIsICZkb2VzcmFuZ2UsICFlYXAtPnNraXApID09IEZBSUwpCisJeworCSAgICBmYWlsZWQgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisJY2xlYXJfdmFyKCZyZXR2YXIpOworCWlmIChkb2VzcmFuZ2UgfHwgZWFwLT5za2lwKQorCSAgICBicmVhazsKKwkvKiBTdG9wIHdoZW4gaW1tZWRpYXRlbHkgYWJvcnRpbmcgb24gZXJyb3IsIG9yIHdoZW4gYW4gaW50ZXJydXB0CisJICogb2NjdXJyZWQgb3IgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnV0IG5vdCBjYXVnaHQuICBnZXRfZnVuY192YXIoKQorCSAqIHJldHVybmVkIE9LLCBzbyB0aGF0IHRoZSBjaGVjayBmb3IgdHJhaWxpbmcgY2hhcmFjdGVycyBiZWxvdyBpcworCSAqIGV4ZWN1dGVkLiAqLworCWlmIChhYm9ydGluZygpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGVhcC0+c2tpcCkKKwktLWVtc2dfc2tpcDsKKworICAgIGlmICghZmFpbGVkKQorICAgIHsKKwkvKiBDaGVjayBmb3IgdHJhaWxpbmcgaWxsZWdhbCBjaGFyYWN0ZXJzIGFuZCBhIGZvbGxvd2luZyBjb21tYW5kLiAqLworCWlmICghZW5kc19leGNtZCgqYXJnKSkKKwl7CisJICAgIGVtc2dfc2V2ZXJlID0gVFJVRTsKKwkgICAgRU1TRyhfKGVfdHJhaWxpbmcpKTsKKwl9CisJZWxzZQorCSAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGFyZyk7CisgICAgfQorCitlbmQ6CisgICAgaWYgKGFsaWFzICE9IE5VTEwpCisJdmltX2ZyZWUoYWxpYXMpOworfQorCisvKgorICogIjp1bmxldFshXSB2YXIxIC4uLiAiIGNvbW1hbmQuCisgKi8KKyAgICB2b2lkCitleF91bmxldChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSpuYW1lX2VuZDsKKyAgICBjaGFyX3UJY2M7CisgICAgY2hhcl91CSpleHByX3N0YXJ0OworICAgIGNoYXJfdQkqZXhwcl9lbmQ7CisgICAgaW50CQllcnJvciA9IEZBTFNFOworCisgICAgZG8KKyAgICB7CisJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBuYW1lLiAqLworCW5hbWVfZW5kID0gZmluZF9uYW1lX2VuZChhcmcsICZleHByX3N0YXJ0LCAmZXhwcl9lbmQpOworCisJaWYgKCF2aW1faXN3aGl0ZSgqbmFtZV9lbmQpICYmICFlbmRzX2V4Y21kKCpuYW1lX2VuZCkpCisJeworCSAgICBlbXNnX3NldmVyZSA9IFRSVUU7CisJICAgIEVNU0coXyhlX3RyYWlsaW5nKSk7CisJICAgIGJyZWFrOworCX0KKworCWlmICghZXJyb3IgJiYgIWVhcC0+c2tpcCkKKwl7CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKwkgICAgaWYgKGV4cHJfc3RhcnQgIT0gTlVMTCkKKwkgICAgeworCQljaGFyX3UgICp0ZW1wX3N0cmluZzsKKworCQl0ZW1wX3N0cmluZyA9IG1ha2VfZXhwYW5kZWRfbmFtZShhcmcsIGV4cHJfc3RhcnQsCisJCQkJCQkJIGV4cHJfZW5kLCBuYW1lX2VuZCk7CisJCWlmICh0ZW1wX3N0cmluZyA9PSBOVUxMKQorCQl7CisJCSAgICAvKgorCQkgICAgICogUmVwb3J0IGFuIGludmFsaWQgZXhwcmVzc2lvbiBpbiBicmFjZXMsIHVubGVzcyB0aGUKKwkJICAgICAqIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGFuCisJCSAgICAgKiBhYm9ydGluZyBlcnJvciwgYW4gaW50ZXJydXB0LCBvciBhbiBleGNlcHRpb24uCisJCSAgICAgKi8KKwkJICAgIGlmICghYWJvcnRpbmcoKSkKKwkJICAgIHsKKwkJCWVtc2dfc2V2ZXJlID0gVFJVRTsKKwkJCUVNU0cyKF8oZV9pbnZhcmcyKSwgYXJnKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgZXJyb3IgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGRvX3VubGV0KHRlbXBfc3RyaW5nKSA9PSBGQUlMICYmICFlYXAtPmZvcmNlaXQpCisJCSAgICB7CisJCQlFTVNHMihfKCJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiKSwgdGVtcF9zdHJpbmcpOworCQkJZXJyb3IgPSBUUlVFOworCQkgICAgfQorCQkgICAgdmltX2ZyZWUodGVtcF9zdHJpbmcpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJY2MgPSAqbmFtZV9lbmQ7CisJCSpuYW1lX2VuZCA9IE5VTDsKKworCQlpZiAoZG9fdW5sZXQoYXJnKSA9PSBGQUlMICYmICFlYXAtPmZvcmNlaXQpCisJCXsKKwkJICAgIEVNU0cyKF8oIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIpLCBhcmcpOworCQkgICAgZXJyb3IgPSBUUlVFOworCQl9CisKKwkJKm5hbWVfZW5kID0gY2M7CisJICAgIH0KKwl9CisJYXJnID0gc2tpcHdoaXRlKG5hbWVfZW5kKTsKKyAgICB9IHdoaWxlICghZW5kc19leGNtZCgqYXJnKSk7CisKKyAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGFyZyk7Cit9CisKKy8qCisgKiAidW5sZXQiIGEgdmFyaWFibGUuICBSZXR1cm4gT0sgaWYgaXQgZXhpc3RlZCwgRkFJTCBpZiBub3QuCisgKi8KKyAgICBpbnQKK2RvX3VubGV0KG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIFZBUgkJdjsKKworICAgIHYgPSBmaW5kX3ZhcihuYW1lLCBUUlVFKTsKKyAgICBpZiAodiAhPSBOVUxMKQorICAgIHsKKwl2YXJfZnJlZV9vbmUodik7CisJcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRkFJTDsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfTUVOVSkgJiYgZGVmaW5lZChGRUFUX01VTFRJX0xBTkcpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIERlbGV0ZSBhbGwgIm1lbnV0cmFuc18iIHZhcmlhYmxlcy4KKyAqLworICAgIHZvaWQKK2RlbF9tZW51dHJhbnNfdmFycygpCit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgaSA8IHZhcmlhYmxlcy5nYV9sZW47ICsraSkKKwlpZiAoVkFSX0VOVFJZKGkpLnZhcl9uYW1lICE9IE5VTEwKKwkJJiYgU1RSTkNNUChWQVJfRU5UUlkoaSkudmFyX25hbWUsICJtZW51dHJhbnNfIiwgMTApID09IDApCisJICAgIHZhcl9mcmVlX29uZSgmVkFSX0VOVFJZKGkpKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBMb2NhbCBzdHJpbmcgYnVmZmVyIGZvciB0aGUgbmV4dCB0d28gZnVuY3Rpb25zIHRvIHN0b3JlIGEgdmFyaWFibGUgbmFtZQorICogd2l0aCBpdHMgcHJlZml4LiBBbGxvY2F0ZWQgaW4gY2F0X3ByZWZpeF92YXJuYW1lKCksIGZyZWVkIGxhdGVyIGluCisgKiBnZXRfdXNlcl92YXJfbmFtZSgpLgorICovCisKK3N0YXRpYyBjaGFyX3UgKmNhdF9wcmVmaXhfdmFybmFtZSBfX0FSR1MoKGludCBwcmVmaXgsIGNoYXJfdSAqbmFtZSkpOworCitzdGF0aWMgY2hhcl91CSp2YXJuYW1lYnVmID0gTlVMTDsKK3N0YXRpYyBpbnQJdmFybmFtZWJ1ZmxlbiA9IDA7CisKKy8qCisgKiBGdW5jdGlvbiB0byBjb25jYXRlbmF0ZSBhIHByZWZpeCBhbmQgYSB2YXJpYWJsZSBuYW1lLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjYXRfcHJlZml4X3Zhcm5hbWUocHJlZml4LCBuYW1lKQorICAgIGludAkJcHJlZml4OworICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBpbnQJCWxlbjsKKworICAgIGxlbiA9IChpbnQpU1RSTEVOKG5hbWUpICsgMzsKKyAgICBpZiAobGVuID4gdmFybmFtZWJ1ZmxlbikKKyAgICB7CisJdmltX2ZyZWUodmFybmFtZWJ1Zik7CisJbGVuICs9IDEwOwkJCS8qIHNvbWUgYWRkaXRpb25hbCBzcGFjZSAqLworCXZhcm5hbWVidWYgPSBhbGxvYyhsZW4pOworCWlmICh2YXJuYW1lYnVmID09IE5VTEwpCisJeworCSAgICB2YXJuYW1lYnVmbGVuID0gMDsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCXZhcm5hbWVidWZsZW4gPSBsZW47CisgICAgfQorICAgICp2YXJuYW1lYnVmID0gcHJlZml4OworICAgIHZhcm5hbWVidWZbMV0gPSAnOic7CisgICAgU1RSQ1BZKHZhcm5hbWVidWYgKyAyLCBuYW1lKTsKKyAgICByZXR1cm4gdmFybmFtZWJ1ZjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgdXNlciBkZWZpbmVkCisgKiAoZ2xvYmFsL2J1ZmZlci93aW5kb3cvYnVpbHQtaW4pIHZhcmlhYmxlIG5hbWVzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X3VzZXJfdmFyX25hbWUoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgc3RhdGljIGludAlnaWR4OworICAgIHN0YXRpYyBpbnQJYmlkeDsKKyAgICBzdGF0aWMgaW50CXdpZHg7CisgICAgc3RhdGljIGludAl2aWR4OworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIGlmIChpZHggPT0gMCkKKwlnaWR4ID0gYmlkeCA9IHdpZHggPSB2aWR4ID0gMDsKKyAgICBpZiAoZ2lkeCA8IHZhcmlhYmxlcy5nYV9sZW4pCQkJLyogR2xvYmFsIHZhcmlhYmxlcyAqLworICAgIHsKKwl3aGlsZSAoKG5hbWUgPSBWQVJfRU5UUlkoZ2lkeCsrKS52YXJfbmFtZSkgPT0gTlVMTAorCQkmJiBnaWR4IDwgdmFyaWFibGVzLmdhX2xlbikKKwkgICAgLyogc2tpcCAqLzsKKwlpZiAobmFtZSAhPSBOVUxMKQorCXsKKwkgICAgaWYgKFNUUk5DTVAoImc6IiwgeHAtPnhwX3BhdHRlcm4sIDIpID09IDApCisJCXJldHVybiBjYXRfcHJlZml4X3Zhcm5hbWUoJ2cnLCBuYW1lKTsKKwkgICAgZWxzZQorCQlyZXR1cm4gbmFtZTsKKwl9CisgICAgfQorICAgIGlmIChiaWR4IDwgY3VyYnVmLT5iX3ZhcnMuZ2FfbGVuKQkJLyogQ3VycmVudCBidWZmZXIgdmFyaWFibGVzICovCisgICAgeworCXdoaWxlICgobmFtZSA9IEJWQVJfRU5UUlkoYmlkeCsrKS52YXJfbmFtZSkgPT0gTlVMTAorCQkmJiBiaWR4IDwgY3VyYnVmLT5iX3ZhcnMuZ2FfbGVuKQorCSAgICAvKiBza2lwICovOworCWlmIChuYW1lICE9IE5VTEwpCisJICAgIHJldHVybiBjYXRfcHJlZml4X3Zhcm5hbWUoJ2InLCBuYW1lKTsKKyAgICB9CisgICAgaWYgKGJpZHggPT0gY3VyYnVmLT5iX3ZhcnMuZ2FfbGVuKQorICAgIHsKKwkrK2JpZHg7CisJcmV0dXJuIChjaGFyX3UgKikiYjpjaGFuZ2VkdGljayI7CisgICAgfQorICAgIGlmICh3aWR4IDwgY3Vyd2luLT53X3ZhcnMuZ2FfbGVuKQkJLyogQ3VycmVudCB3aW5kb3cgdmFyaWFibGVzICovCisgICAgeworCXdoaWxlICgobmFtZSA9IFdWQVJfRU5UUlkod2lkeCsrKS52YXJfbmFtZSkgPT0gTlVMTAorCQkmJiB3aWR4IDwgY3Vyd2luLT53X3ZhcnMuZ2FfbGVuKQorCSAgICAvKiBza2lwICovOworCWlmIChuYW1lICE9IE5VTEwpCisJICAgIHJldHVybiBjYXRfcHJlZml4X3Zhcm5hbWUoJ3cnLCBuYW1lKTsKKyAgICB9CisgICAgaWYgKHZpZHggPCBWVl9MRU4pCQkJCSAgICAgIC8qIEJ1aWx0LWluIHZhcmlhYmxlcyAqLworCXJldHVybiBjYXRfcHJlZml4X3Zhcm5hbWUoJ3YnLCAoY2hhcl91ICopdmltdmFyc1t2aWR4KytdLm5hbWUpOworCisgICAgdmltX2ZyZWUodmFybmFtZWJ1Zik7CisgICAgdmFybmFtZWJ1ZiA9IE5VTEw7CisgICAgdmFybmFtZWJ1ZmxlbiA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZiAvKiBGRUFUX0NNRExfQ09NUEwgKi8KKworLyoKKyAqIHR5cGVzIGZvciBleHByZXNzaW9ucy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVFlQRV9VTktOT1dOID0gMAorICAgICwgVFlQRV9FUVVBTAkvKiA9PSAqLworICAgICwgVFlQRV9ORVFVQUwJLyogIT0gKi8KKyAgICAsIFRZUEVfR1JFQVRFUgkvKiA+ICAqLworICAgICwgVFlQRV9HRVFVQUwJLyogPj0gKi8KKyAgICAsIFRZUEVfU01BTExFUgkvKiA8ICAqLworICAgICwgVFlQRV9TRVFVQUwJLyogPD0gKi8KKyAgICAsIFRZUEVfTUFUQ0gJLyogPX4gKi8KKyAgICAsIFRZUEVfTk9NQVRDSAkvKiAhfiAqLworfSBleHB0eXBlX1Q7CisKKy8qCisgKiBUaGUgImV2YWx1YXRlIiBhcmd1bWVudDogV2hlbiBGQUxTRSwgdGhlIGFyZ3VtZW50IGlzIG9ubHkgcGFyc2VkIGJ1dCBub3QKKyAqIGV4ZWN1dGVkLiAgVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gT0ssIGJ1dCB0aGUgcmV0dmFyIHdpbGwgYmUgb2YgdHlwZQorICogVkFSX1VOS05PV04uICBUaGUgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyBGQUlMIGZvciBhIHN5bnRheCBlcnJvci4KKyAqLworCisvKgorICogSGFuZGxlIHplcm8gbGV2ZWwgZXhwcmVzc2lvbi4KKyAqIFRoaXMgY2FsbHMgZXZhbDEoKSBhbmQgaGFuZGxlcyBlcnJvciBtZXNzYWdlIGFuZCBuZXh0Y21kLgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50CitldmFsMChhcmcsIHJldHZhciwgbmV4dGNtZCwgZXZhbHVhdGUpCisgICAgY2hhcl91CSphcmc7CisgICAgVkFSCQlyZXR2YXI7CisgICAgY2hhcl91CSoqbmV4dGNtZDsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIGludAkJcmV0OworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBza2lwd2hpdGUoYXJnKTsKKyAgICByZXQgPSBldmFsMSgmcCwgcmV0dmFyLCBldmFsdWF0ZSk7CisgICAgaWYgKHJldCA9PSBGQUlMIHx8ICFlbmRzX2V4Y21kKCpwKSkKKyAgICB7CisJaWYgKHJldCAhPSBGQUlMKQorCSAgICBjbGVhcl92YXIocmV0dmFyKTsKKwkvKgorCSAqIFJlcG9ydCB0aGUgaW52YWxpZCBleHByZXNzaW9uIHVubGVzcyB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGhhcworCSAqIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbiBhYm9ydGluZyBlcnJvciwgYW4gaW50ZXJydXB0LCBvciBhbgorCSAqIGV4Y2VwdGlvbi4KKwkgKi8KKwlpZiAoIWFib3J0aW5nKCkpCisJICAgIEVNU0cyKF8oZV9pbnZleHByMiksIGFyZyk7CisJcmV0ID0gRkFJTDsKKyAgICB9CisgICAgaWYgKG5leHRjbWQgIT0gTlVMTCkKKwkqbmV4dGNtZCA9IGNoZWNrX25leHRjbWQocCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogSGFuZGxlIHRvcCBsZXZlbCBleHByZXNzaW9uOgorICoJZXhwcjEgPyBleHByMCA6IGV4cHIwCisgKgorICogImFyZyIgbXVzdCBwb2ludCB0byB0aGUgZmlyc3Qgbm9uLXdoaXRlIG9mIHRoZSBleHByZXNzaW9uLgorICogImFyZyIgaXMgYWR2YW5jZWQgdG8gdGhlIG5leHQgbm9uLXdoaXRlIGFmdGVyIHRoZSByZWNvZ25pemVkIGV4cHJlc3Npb24uCisgKgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50CitldmFsMShhcmcsIHJldHZhciwgZXZhbHVhdGUpCisgICAgY2hhcl91CSoqYXJnOworICAgIFZBUgkJcmV0dmFyOworICAgIGludAkJZXZhbHVhdGU7Cit7CisgICAgaW50CQlyZXN1bHQ7CisgICAgdmFyCQl2YXIyOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpcnN0IHZhcmlhYmxlLgorICAgICAqLworICAgIGlmIChldmFsMihhcmcsIHJldHZhciwgZXZhbHVhdGUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICBpZiAoKCphcmcpWzBdID09ICc/JykKKyAgICB7CisJcmVzdWx0ID0gRkFMU0U7CisJaWYgKGV2YWx1YXRlKQorCXsKKwkgICAgaWYgKGdldF92YXJfbnVtYmVyKHJldHZhcikgIT0gMCkKKwkJcmVzdWx0ID0gVFJVRTsKKwkgICAgY2xlYXJfdmFyKHJldHZhcik7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIHNlY29uZCB2YXJpYWJsZS4KKwkgKi8KKwkqYXJnID0gc2tpcHdoaXRlKCphcmcgKyAxKTsKKwlpZiAoZXZhbDEoYXJnLCByZXR2YXIsIGV2YWx1YXRlICYmIHJlc3VsdCkgPT0gRkFJTCkgLyogcmVjdXJzaXZlISAqLworCSAgICByZXR1cm4gRkFJTDsKKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSAiOiIuCisJICovCisJaWYgKCgqYXJnKVswXSAhPSAnOicpCisJeworCSAgICBFTVNHKF8oIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIpKTsKKwkgICAgaWYgKGV2YWx1YXRlICYmIHJlc3VsdCkKKwkJY2xlYXJfdmFyKHJldHZhcik7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCS8qCisJICogR2V0IHRoZSB0aGlyZCB2YXJpYWJsZS4KKwkgKi8KKwkqYXJnID0gc2tpcHdoaXRlKCphcmcgKyAxKTsKKwlpZiAoZXZhbDEoYXJnLCAmdmFyMiwgZXZhbHVhdGUgJiYgIXJlc3VsdCkgPT0gRkFJTCkgLyogcmVjdXJzaXZlISAqLworCXsKKwkgICAgaWYgKGV2YWx1YXRlICYmIHJlc3VsdCkKKwkJY2xlYXJfdmFyKHJldHZhcik7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlpZiAoZXZhbHVhdGUgJiYgIXJlc3VsdCkKKwkgICAgKnJldHZhciA9IHZhcjI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogSGFuZGxlIGZpcnN0IGxldmVsIGV4cHJlc3Npb246CisgKglleHByMiB8fCBleHByMiB8fCBleHByMgkgICAgbG9naWNhbCBPUgorICoKKyAqICJhcmciIG11c3QgcG9pbnQgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAqICJhcmciIGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IG5vbi13aGl0ZSBhZnRlciB0aGUgcmVjb2duaXplZCBleHByZXNzaW9uLgorICoKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZXZhbDIoYXJnLCByZXR2YXIsIGV2YWx1YXRlKQorICAgIGNoYXJfdQkqKmFyZzsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIHZhcgkJdmFyMjsKKyAgICBsb25nCXJlc3VsdDsKKyAgICBpbnQJCWZpcnN0OworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpcnN0IHZhcmlhYmxlLgorICAgICAqLworICAgIGlmIChldmFsMyhhcmcsIHJldHZhciwgZXZhbHVhdGUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCB1bnRpbCB0aGVyZSBpcyBubyBmb2xsb3dpbmcgInx8Ii4KKyAgICAgKi8KKyAgICBmaXJzdCA9IFRSVUU7CisgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgd2hpbGUgKCgqYXJnKVswXSA9PSAnfCcgJiYgKCphcmcpWzFdID09ICd8JykKKyAgICB7CisJaWYgKGV2YWx1YXRlICYmIGZpcnN0KQorCXsKKwkgICAgaWYgKGdldF92YXJfbnVtYmVyKHJldHZhcikgIT0gMCkKKwkJcmVzdWx0ID0gVFJVRTsKKwkgICAgY2xlYXJfdmFyKHJldHZhcik7CisJICAgIGZpcnN0ID0gRkFMU0U7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIHNlY29uZCB2YXJpYWJsZS4KKwkgKi8KKwkqYXJnID0gc2tpcHdoaXRlKCphcmcgKyAyKTsKKwlpZiAoZXZhbDMoYXJnLCAmdmFyMiwgZXZhbHVhdGUgJiYgIXJlc3VsdCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIHJlc3VsdC4KKwkgKi8KKwlpZiAoZXZhbHVhdGUgJiYgIXJlc3VsdCkKKwl7CisJICAgIGlmIChnZXRfdmFyX251bWJlcigmdmFyMikgIT0gMCkKKwkJcmVzdWx0ID0gVFJVRTsKKwkgICAgY2xlYXJfdmFyKCZ2YXIyKTsKKwl9CisJaWYgKGV2YWx1YXRlKQorCXsKKwkgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gcmVzdWx0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBIYW5kbGUgc2Vjb25kIGxldmVsIGV4cHJlc3Npb246CisgKglleHByMyAmJiBleHByMyAmJiBleHByMwkgICAgbG9naWNhbCBBTkQKKyAqCisgKiAiYXJnIiBtdXN0IHBvaW50IHRvIHRoZSBmaXJzdCBub24td2hpdGUgb2YgdGhlIGV4cHJlc3Npb24uCisgKiAiYXJnIiBpcyBhZHZhbmNlZCB0byB0aGUgbmV4dCBub24td2hpdGUgYWZ0ZXIgdGhlIHJlY29nbml6ZWQgZXhwcmVzc2lvbi4KKyAqCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2V2YWwzKGFyZywgcmV0dmFyLCBldmFsdWF0ZSkKKyAgICBjaGFyX3UJKiphcmc7CisgICAgVkFSCQlyZXR2YXI7CisgICAgaW50CQlldmFsdWF0ZTsKK3sKKyAgICB2YXIJCXZhcjI7CisgICAgbG9uZwlyZXN1bHQ7CisgICAgaW50CQlmaXJzdDsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaXJzdCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBpZiAoZXZhbDQoYXJnLCByZXR2YXIsIGV2YWx1YXRlKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBSZXBlYXQgdW50aWwgdGhlcmUgaXMgbm8gZm9sbG93aW5nICImJiIuCisgICAgICovCisgICAgZmlyc3QgPSBUUlVFOworICAgIHJlc3VsdCA9IFRSVUU7CisgICAgd2hpbGUgKCgqYXJnKVswXSA9PSAnJicgJiYgKCphcmcpWzFdID09ICcmJykKKyAgICB7CisJaWYgKGV2YWx1YXRlICYmIGZpcnN0KQorCXsKKwkgICAgaWYgKGdldF92YXJfbnVtYmVyKHJldHZhcikgPT0gMCkKKwkJcmVzdWx0ID0gRkFMU0U7CisJICAgIGNsZWFyX3ZhcihyZXR2YXIpOworCSAgICBmaXJzdCA9IEZBTFNFOworCX0KKworCS8qCisJICogR2V0IHRoZSBzZWNvbmQgdmFyaWFibGUuCisJICovCisJKmFyZyA9IHNraXB3aGl0ZSgqYXJnICsgMik7CisJaWYgKGV2YWw0KGFyZywgJnZhcjIsIGV2YWx1YXRlICYmIHJlc3VsdCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIHJlc3VsdC4KKwkgKi8KKwlpZiAoZXZhbHVhdGUgJiYgcmVzdWx0KQorCXsKKwkgICAgaWYgKGdldF92YXJfbnVtYmVyKCZ2YXIyKSA9PSAwKQorCQlyZXN1bHQgPSBGQUxTRTsKKwkgICAgY2xlYXJfdmFyKCZ2YXIyKTsKKwl9CisJaWYgKGV2YWx1YXRlKQorCXsKKwkgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gcmVzdWx0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhpcmQgbGV2ZWwgZXhwcmVzc2lvbjoKKyAqCXZhcjEgPT0gdmFyMgorICoJdmFyMSA9fiB2YXIyCisgKgl2YXIxICE9IHZhcjIKKyAqCXZhcjEgIX4gdmFyMgorICoJdmFyMSA+IHZhcjIKKyAqCXZhcjEgPj0gdmFyMgorICoJdmFyMSA8IHZhcjIKKyAqCXZhcjEgPD0gdmFyMgorICoKKyAqICJhcmciIG11c3QgcG9pbnQgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAqICJhcmciIGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IG5vbi13aGl0ZSBhZnRlciB0aGUgcmVjb2duaXplZCBleHByZXNzaW9uLgorICoKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZXZhbDQoYXJnLCByZXR2YXIsIGV2YWx1YXRlKQorICAgIGNoYXJfdQkqKmFyZzsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIHZhcgkJdmFyMjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworICAgIGV4cHR5cGVfVAl0eXBlID0gVFlQRV9VTktOT1dOOworICAgIGludAkJbGVuID0gMjsKKyAgICBsb25nCW4xLCBuMjsKKyAgICBjaGFyX3UJKnMxLCAqczI7CisgICAgY2hhcl91CWJ1ZjFbTlVNQlVGTEVOXSwgYnVmMltOVU1CVUZMRU5dOworICAgIHJlZ21hdGNoX1QJcmVnbWF0Y2g7CisgICAgaW50CQlpYzsKKyAgICBjaGFyX3UJKnNhdmVfY3BvOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpcnN0IHZhcmlhYmxlLgorICAgICAqLworICAgIGlmIChldmFsNShhcmcsIHJldHZhciwgZXZhbHVhdGUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICBwID0gKmFyZzsKKyAgICBzd2l0Y2ggKHBbMF0pCisgICAgeworCWNhc2UgJz0nOiAgIGlmIChwWzFdID09ICc9JykKKwkJCXR5cGUgPSBUWVBFX0VRVUFMOworCQkgICAgZWxzZSBpZiAocFsxXSA9PSAnficpCisJCQl0eXBlID0gVFlQRV9NQVRDSDsKKwkJICAgIGJyZWFrOworCWNhc2UgJyEnOiAgIGlmIChwWzFdID09ICc9JykKKwkJCXR5cGUgPSBUWVBFX05FUVVBTDsKKwkJICAgIGVsc2UgaWYgKHBbMV0gPT0gJ34nKQorCQkJdHlwZSA9IFRZUEVfTk9NQVRDSDsKKwkJICAgIGJyZWFrOworCWNhc2UgJz4nOiAgIGlmIChwWzFdICE9ICc9JykKKwkJICAgIHsKKwkJCXR5cGUgPSBUWVBFX0dSRUFURVI7CisJCQlsZW4gPSAxOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJdHlwZSA9IFRZUEVfR0VRVUFMOworCQkgICAgYnJlYWs7CisJY2FzZSAnPCc6ICAgaWYgKHBbMV0gIT0gJz0nKQorCQkgICAgeworCQkJdHlwZSA9IFRZUEVfU01BTExFUjsKKwkJCWxlbiA9IDE7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQl0eXBlID0gVFlQRV9TRVFVQUw7CisJCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGlzIGEgY29tcGFyaXRpdmUgb3BlcmF0b3IsIHVzZSBpdC4KKyAgICAgKi8KKyAgICBpZiAodHlwZSAhPSBUWVBFX1VOS05PV04pCisgICAgeworCS8qIGV4dHJhIHF1ZXN0aW9uIG1hcmsgYXBwZW5kZWQ6IGlnbm9yZSBjYXNlICovCisJaWYgKHBbbGVuXSA9PSAnPycpCisJeworCSAgICBpYyA9IFRSVUU7CisJICAgICsrbGVuOworCX0KKwkvKiBleHRyYSAnIycgYXBwZW5kZWQ6IG1hdGNoIGNhc2UgKi8KKwllbHNlIGlmIChwW2xlbl0gPT0gJyMnKQorCXsKKwkgICAgaWMgPSBGQUxTRTsKKwkgICAgKytsZW47CisJfQorCS8qIG5vdGhpbmcgYXBwZW5lZDogdXNlICdpZ25vcmVjYXNlJyAqLworCWVsc2UKKwkgICAgaWMgPSBwX2ljOworCisJLyoKKwkgKiBHZXQgdGhlIHNlY29uZCB2YXJpYWJsZS4KKwkgKi8KKwkqYXJnID0gc2tpcHdoaXRlKHAgKyBsZW4pOworCWlmIChldmFsNShhcmcsICZ2YXIyLCBldmFsdWF0ZSkgPT0gRkFJTCkKKwl7CisJICAgIGNsZWFyX3ZhcihyZXR2YXIpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisKKwlpZiAoZXZhbHVhdGUpCisJeworCSAgICAvKgorCSAgICAgKiBJZiBvbmUgb2YgdGhlIHR3byB2YXJpYWJsZXMgaXMgYSBudW1iZXIsIGNvbXBhcmUgYXMgYSBudW1iZXIuCisJICAgICAqIFdoZW4gdXNpbmcgIj1+IiBvciAiIX4iLCBhbHdheXMgY29tcGFyZSBhcyBzdHJpbmcuCisJICAgICAqLworCSAgICBpZiAoKHJldHZhci0+dmFyX3R5cGUgPT0gVkFSX05VTUJFUiB8fCB2YXIyLnZhcl90eXBlID09IFZBUl9OVU1CRVIpCisJCSAgICAmJiB0eXBlICE9IFRZUEVfTUFUQ0ggJiYgdHlwZSAhPSBUWVBFX05PTUFUQ0gpCisJICAgIHsKKwkJbjEgPSBnZXRfdmFyX251bWJlcihyZXR2YXIpOworCQluMiA9IGdldF92YXJfbnVtYmVyKCZ2YXIyKTsKKwkJc3dpdGNoICh0eXBlKQorCQl7CisJCSAgICBjYXNlIFRZUEVfRVFVQUw6ICAgIG4xID0gKG4xID09IG4yKTsgYnJlYWs7CisJCSAgICBjYXNlIFRZUEVfTkVRVUFMOiAgIG4xID0gKG4xICE9IG4yKTsgYnJlYWs7CisJCSAgICBjYXNlIFRZUEVfR1JFQVRFUjogIG4xID0gKG4xID4gbjIpOyBicmVhazsKKwkJICAgIGNhc2UgVFlQRV9HRVFVQUw6ICAgbjEgPSAobjEgPj0gbjIpOyBicmVhazsKKwkJICAgIGNhc2UgVFlQRV9TTUFMTEVSOiAgbjEgPSAobjEgPCBuMik7IGJyZWFrOworCQkgICAgY2FzZSBUWVBFX1NFUVVBTDogICBuMSA9IChuMSA8PSBuMik7IGJyZWFrOworCQkgICAgY2FzZSBUWVBFX1VOS05PV046CisJCSAgICBjYXNlIFRZUEVfTUFUQ0g6CisJCSAgICBjYXNlIFRZUEVfTk9NQVRDSDogIGJyZWFrOyAgLyogYXZvaWQgZ2NjIHdhcm5pbmcgKi8KKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlzMSA9IGdldF92YXJfc3RyaW5nX2J1ZihyZXR2YXIsIGJ1ZjEpOworCQlzMiA9IGdldF92YXJfc3RyaW5nX2J1ZigmdmFyMiwgYnVmMik7CisJCWlmICh0eXBlICE9IFRZUEVfTUFUQ0ggJiYgdHlwZSAhPSBUWVBFX05PTUFUQ0gpCisJCSAgICBpID0gaWMgPyBNQl9TVFJJQ01QKHMxLCBzMikgOiBTVFJDTVAoczEsIHMyKTsKKwkJZWxzZQorCQkgICAgaSA9IDA7CisJCW4xID0gRkFMU0U7CisJCXN3aXRjaCAodHlwZSkKKwkJeworCQkgICAgY2FzZSBUWVBFX0VRVUFMOiAgICBuMSA9IChpID09IDApOyBicmVhazsKKwkJICAgIGNhc2UgVFlQRV9ORVFVQUw6ICAgbjEgPSAoaSAhPSAwKTsgYnJlYWs7CisJCSAgICBjYXNlIFRZUEVfR1JFQVRFUjogIG4xID0gKGkgPiAwKTsgYnJlYWs7CisJCSAgICBjYXNlIFRZUEVfR0VRVUFMOiAgIG4xID0gKGkgPj0gMCk7IGJyZWFrOworCQkgICAgY2FzZSBUWVBFX1NNQUxMRVI6ICBuMSA9IChpIDwgMCk7IGJyZWFrOworCQkgICAgY2FzZSBUWVBFX1NFUVVBTDogICBuMSA9IChpIDw9IDApOyBicmVhazsKKworCQkgICAgY2FzZSBUWVBFX01BVENIOgorCQkgICAgY2FzZSBUWVBFX05PTUFUQ0g6CisJCQkgICAgLyogYXZvaWQgJ2wnIGZsYWcgaW4gJ2Nwb3B0aW9ucycgKi8KKwkJCSAgICBzYXZlX2NwbyA9IHBfY3BvOworCQkJICAgIHBfY3BvID0gKGNoYXJfdSAqKSIiOworCQkJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChzMiwKKwkJCQkJCQlSRV9NQUdJQyArIFJFX1NUUklORyk7CisJCQkgICAgcmVnbWF0Y2gucm1faWMgPSBpYzsKKwkJCSAgICBpZiAocmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMKQorCQkJICAgIHsKKwkJCQluMSA9IHZpbV9yZWdleGVjX25sKCZyZWdtYXRjaCwgczEsIChjb2xucl9UKTApOworCQkJCXZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworCQkJCWlmICh0eXBlID09IFRZUEVfTk9NQVRDSCkKKwkJCQkgICAgbjEgPSAhbjE7CisJCQkgICAgfQorCQkJICAgIHBfY3BvID0gc2F2ZV9jcG87CisJCQkgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgVFlQRV9VTktOT1dOOiAgYnJlYWs7ICAvKiBhdm9pZCBnY2Mgd2FybmluZyAqLworCQl9CisJICAgIH0KKwkgICAgY2xlYXJfdmFyKHJldHZhcik7CisJICAgIGNsZWFyX3ZhcigmdmFyMik7CisJICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCSAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IG4xOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBIYW5kbGUgZm91cnRoIGxldmVsIGV4cHJlc3Npb246CisgKgkrCW51bWJlciBhZGRpdGlvbgorICoJLQludW1iZXIgc3VidHJhY3Rpb24KKyAqCS4Jc3RyaW5nIGNvbmNhdGVuYXRpb24KKyAqCisgKiAiYXJnIiBtdXN0IHBvaW50IHRvIHRoZSBmaXJzdCBub24td2hpdGUgb2YgdGhlIGV4cHJlc3Npb24uCisgKiAiYXJnIiBpcyBhZHZhbmNlZCB0byB0aGUgbmV4dCBub24td2hpdGUgYWZ0ZXIgdGhlIHJlY29nbml6ZWQgZXhwcmVzc2lvbi4KKyAqCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2V2YWw1KGFyZywgcmV0dmFyLCBldmFsdWF0ZSkKKyAgICBjaGFyX3UJKiphcmc7CisgICAgVkFSCQlyZXR2YXI7CisgICAgaW50CQlldmFsdWF0ZTsKK3sKKyAgICB2YXIJCXZhcjI7CisgICAgaW50CQlvcDsKKyAgICBsb25nCW4xLCBuMjsKKyAgICBjaGFyX3UJKnMxLCAqczI7CisgICAgY2hhcl91CWJ1ZjFbTlVNQlVGTEVOXSwgYnVmMltOVU1CVUZMRU5dOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaXJzdCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBpZiAoZXZhbDYoYXJnLCByZXR2YXIsIGV2YWx1YXRlKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBSZXBlYXQgY29tcHV0aW5nLCB1bnRpbCBubyAnKycsICctJyBvciAnLicgaXMgZm9sbG93aW5nLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCW9wID0gKiphcmc7CisJaWYgKG9wICE9ICcrJyAmJiBvcCAhPSAnLScgJiYgb3AgIT0gJy4nKQorCSAgICBicmVhazsKKworCS8qCisJICogR2V0IHRoZSBzZWNvbmQgdmFyaWFibGUuCisJICovCisJKmFyZyA9IHNraXB3aGl0ZSgqYXJnICsgMSk7CisJaWYgKGV2YWw2KGFyZywgJnZhcjIsIGV2YWx1YXRlKSA9PSBGQUlMKQorCXsKKwkgICAgY2xlYXJfdmFyKHJldHZhcik7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCWlmIChldmFsdWF0ZSkKKwl7CisJICAgIC8qCisJICAgICAqIENvbXB1dGUgdGhlIHJlc3VsdC4KKwkgICAgICovCisJICAgIGlmIChvcCA9PSAnLicpCisJICAgIHsKKwkJczEgPSBnZXRfdmFyX3N0cmluZ19idWYocmV0dmFyLCBidWYxKTsKKwkJczIgPSBnZXRfdmFyX3N0cmluZ19idWYoJnZhcjIsIGJ1ZjIpOworCQlvcCA9IChpbnQpU1RSTEVOKHMxKTsKKwkJcCA9IGFsbG9jKCh1bnNpZ25lZCkob3AgKyBTVFJMRU4oczIpICsgMSkpOworCQlpZiAocCAhPSBOVUxMKQorCQl7CisJCSAgICBTVFJDUFkocCwgczEpOworCQkgICAgU1RSQ1BZKHAgKyBvcCwgczIpOworCQl9CisJCWNsZWFyX3ZhcihyZXR2YXIpOworCQlyZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwkJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQluMSA9IGdldF92YXJfbnVtYmVyKHJldHZhcik7CisJCW4yID0gZ2V0X3Zhcl9udW1iZXIoJnZhcjIpOworCQljbGVhcl92YXIocmV0dmFyKTsKKwkJaWYgKG9wID09ICcrJykKKwkJICAgIG4xID0gbjEgKyBuMjsKKwkJZWxzZQorCQkgICAgbjEgPSBuMSAtIG4yOworCQlyZXR2YXItPnZhcl90eXBlID0gVkFSX05VTUJFUjsKKwkJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBuMTsKKwkgICAgfQorCSAgICBjbGVhcl92YXIoJnZhcjIpOworCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogSGFuZGxlIGZpZnRoIGxldmVsIGV4cHJlc3Npb246CisgKgkqCW51bWJlciBtdWx0aXBsaWNhdGlvbgorICoJLwludW1iZXIgZGl2aXNpb24KKyAqCSUJbnVtYmVyIG1vZHVsbworICoKKyAqICJhcmciIG11c3QgcG9pbnQgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAqICJhcmciIGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IG5vbi13aGl0ZSBhZnRlciB0aGUgcmVjb2duaXplZCBleHByZXNzaW9uLgorICoKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZXZhbDYoYXJnLCByZXR2YXIsIGV2YWx1YXRlKQorICAgIGNoYXJfdQkqKmFyZzsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIHZhcgkJdmFyMjsKKyAgICBpbnQJCW9wOworICAgIGxvbmcJbjEsIG4yOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpcnN0IHZhcmlhYmxlLgorICAgICAqLworICAgIGlmIChldmFsNyhhcmcsIHJldHZhciwgZXZhbHVhdGUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCBjb21wdXRpbmcsIHVudGlsIG5vICcqJywgJy8nIG9yICclJyBpcyBmb2xsb3dpbmcuCisgICAgICovCisgICAgZm9yICg7OykKKyAgICB7CisJb3AgPSAqKmFyZzsKKwlpZiAob3AgIT0gJyonICYmIG9wICE9ICcvJyAmJiBvcCAhPSAnJScpCisJICAgIGJyZWFrOworCisJaWYgKGV2YWx1YXRlKQorCXsKKwkgICAgbjEgPSBnZXRfdmFyX251bWJlcihyZXR2YXIpOworCSAgICBjbGVhcl92YXIocmV0dmFyKTsKKwl9CisJZWxzZQorCSAgICBuMSA9IDA7CisKKwkvKgorCSAqIEdldCB0aGUgc2Vjb25kIHZhcmlhYmxlLgorCSAqLworCSphcmcgPSBza2lwd2hpdGUoKmFyZyArIDEpOworCWlmIChldmFsNyhhcmcsICZ2YXIyLCBldmFsdWF0ZSkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAoZXZhbHVhdGUpCisJeworCSAgICBuMiA9IGdldF92YXJfbnVtYmVyKCZ2YXIyKTsKKwkgICAgY2xlYXJfdmFyKCZ2YXIyKTsKKworCSAgICAvKgorCSAgICAgKiBDb21wdXRlIHRoZSByZXN1bHQuCisJICAgICAqLworCSAgICBpZiAob3AgPT0gJyonKQorCQluMSA9IG4xICogbjI7CisJICAgIGVsc2UgaWYgKG9wID09ICcvJykKKwkgICAgeworCQlpZiAobjIgPT0gMCkJLyogZ2l2ZSBhbiBlcnJvciBtZXNzYWdlPyAqLworCQkgICAgbjEgPSAweDdmZmZmZmZmTDsKKwkJZWxzZQorCQkgICAgbjEgPSBuMSAvIG4yOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAobjIgPT0gMCkJLyogZ2l2ZSBhbiBlcnJvciBtZXNzYWdlPyAqLworCQkgICAgbjEgPSAwOworCQllbHNlCisJCSAgICBuMSA9IG4xICUgbjI7CisJICAgIH0KKwkgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbjE7CisJfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEhhbmRsZSBzaXh0aCBsZXZlbCBleHByZXNzaW9uOgorICogIG51bWJlcgkJbnVtYmVyIGNvbnN0YW50CisgKiAgInN0cmluZyIJCXN0cmluZyBjb250c3RhbnQKKyAqICAnc3RyaW5nJwkJbGl0ZXJhbCBzdHJpbmcgY29udHN0YW50CisgKiAgJm9wdGlvbi1uYW1lCW9wdGlvbiB2YWx1ZQorICogIEByCQkJcmVnaXN0ZXIgY29udGVudHMKKyAqICBpZGVudGlmaWVyCQl2YXJpYWJsZSB2YWx1ZQorICogIGZ1bmN0aW9uKCkJCWZ1bmN0aW9uIGNhbGwKKyAqICAkVkFSCQllbnZpcm9ubWVudCB2YXJpYWJsZQorICogIChleHByZXNzaW9uKQluZXN0ZWQgZXhwcmVzc2lvbgorICoKKyAqICBBbHNvIGhhbmRsZToKKyAqICAhIGluIGZyb250CQlsb2dpY2FsIE5PVAorICogIC0gaW4gZnJvbnQJCXVuYXJ5IG1pbnVzCisgKiAgKyBpbiBmcm9udAkJdW5hcnkgcGx1cyAoaWdub3JlZCkKKyAqICB0cmFpbGluZyBbXQkJc3Vic2NyaXB0IGluIFN0cmluZworICoKKyAqICJhcmciIG11c3QgcG9pbnQgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAqICJhcmciIGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IG5vbi13aGl0ZSBhZnRlciB0aGUgcmVjb2duaXplZCBleHByZXNzaW9uLgorICoKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZXZhbDcoYXJnLCByZXR2YXIsIGV2YWx1YXRlKQorICAgIGNoYXJfdQkqKmFyZzsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIHZhcgkJdmFyMjsKKyAgICBsb25nCW47CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpzOworICAgIGludAkJdmFsOworICAgIGNoYXJfdQkqc3RhcnRfbGVhZGVyLCAqZW5kX2xlYWRlcjsKKyAgICBpbnQJCXJldCA9IE9LOworICAgIGNoYXJfdQkqYWxpYXM7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdmFyaWFibGUgc28gdGhhdCBjbGVhcl92YXIoKSBjYW4ndCBtaXN0YWtlIHRoaXMgZm9yIGEgc3RyaW5nCisgICAgICogYW5kIGZyZWUgYSBzdHJpbmcgdGhhdCBpc24ndCB0aGVyZS4KKyAgICAgKi8KKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1VOS05PV047CisKKyAgICAvKgorICAgICAqIFNraXAgJyEnIGFuZCAnLScgY2hhcmFjdGVycy4gIFRoZXkgYXJlIGhhbmRsZWQgbGF0ZXIuCisgICAgICovCisgICAgc3RhcnRfbGVhZGVyID0gKmFyZzsKKyAgICB3aGlsZSAoKiphcmcgPT0gJyEnIHx8ICoqYXJnID09ICctJyB8fCAqKmFyZyA9PSAnKycpCisJKmFyZyA9IHNraXB3aGl0ZSgqYXJnICsgMSk7CisgICAgZW5kX2xlYWRlciA9ICphcmc7CisKKyAgICBzd2l0Y2ggKCoqYXJnKQorICAgIHsKKyAgICAvKgorICAgICAqIE51bWJlciBjb25zdGFudC4KKyAgICAgKi8KKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKwkJdmltX3N0cjJucigqYXJnLCBOVUxMLCAmbGVuLCBUUlVFLCBUUlVFLCAmbiwgTlVMTCk7CisJCSphcmcgKz0gbGVuOworCQlpZiAoZXZhbHVhdGUpCisJCXsKKwkJICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCQkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBuOworCQl9CisJCWJyZWFrOworCisgICAgLyoKKyAgICAgKiBTdHJpbmcgY29uc3RhbnQ6ICJzdHJpbmciLgorICAgICAqLworICAgIGNhc2UgJyInOglyZXQgPSBnZXRfc3RyaW5nX3ZhcihhcmcsIHJldHZhciwgZXZhbHVhdGUpOworCQlicmVhazsKKworICAgIC8qCisgICAgICogTGl0ZXJhbCBzdHJpbmcgY29uc3RhbnQ6ICdzdHJpbmcnLgorICAgICAqLworICAgIGNhc2UgJ1wnJzoJcmV0ID0gZ2V0X2xpdF9zdHJpbmdfdmFyKGFyZywgcmV0dmFyLCBldmFsdWF0ZSk7CisJCWJyZWFrOworCisgICAgLyoKKyAgICAgKiBPcHRpb24gdmFsdWU6ICZuYW1lCisgICAgICovCisgICAgY2FzZSAnJic6CXJldCA9IGdldF9vcHRpb25fdmFyKGFyZywgcmV0dmFyLCBldmFsdWF0ZSk7CisJCWJyZWFrOworCisgICAgLyoKKyAgICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZTogJFZBUi4KKyAgICAgKi8KKyAgICBjYXNlICckJzoJcmV0ID0gZ2V0X2Vudl92YXIoYXJnLCByZXR2YXIsIGV2YWx1YXRlKTsKKwkJYnJlYWs7CisKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyIGNvbnRlbnRzOiBAci4KKyAgICAgKi8KKyAgICBjYXNlICdAJzoJKysqYXJnOworCQlpZiAoZXZhbHVhdGUpCisJCXsKKwkJICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworCQkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBnZXRfcmVnX2NvbnRlbnRzKCoqYXJnLCBGQUxTRSk7CisJCX0KKwkJaWYgKCoqYXJnICE9IE5VTCkKKwkJICAgICsrKmFyZzsKKwkJYnJlYWs7CisKKyAgICAvKgorICAgICAqIG5lc3RlZCBleHByZXNzaW9uOiAoZXhwcmVzc2lvbikuCisgICAgICovCisgICAgY2FzZSAnKCc6CSphcmcgPSBza2lwd2hpdGUoKmFyZyArIDEpOworCQlyZXQgPSBldmFsMShhcmcsIHJldHZhciwgZXZhbHVhdGUpOwkvKiByZWN1cnNpdmUhICovCisJCWlmICgqKmFyZyA9PSAnKScpCisJCSAgICArKyphcmc7CisJCWVsc2UgaWYgKHJldCA9PSBPSykKKwkJeworCQkgICAgRU1TRyhfKCJFMTEwOiBNaXNzaW5nICcpJyIpKTsKKwkJICAgIGNsZWFyX3ZhcihyZXR2YXIpOworCQkgICAgcmV0ID0gRkFJTDsKKwkJfQorCQlicmVhazsKKworICAgIC8qCisgICAgICogTXVzdCBiZSBhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIG5hbWUgdGhlbi4KKyAgICAgKi8KKyAgICBkZWZhdWx0OglzID0gKmFyZzsKKwkJbGVuID0gZ2V0X2Z1bmNfbGVuKGFyZywgJmFsaWFzLCBldmFsdWF0ZSk7CisJCWlmIChhbGlhcyAhPSBOVUxMKQorCQkgICAgcyA9IGFsaWFzOworCisJCWlmIChsZW4gPT0gMCkKKwkJICAgIHJldCA9IEZBSUw7CisJCWVsc2UKKwkJeworCQkgICAgaWYgKCoqYXJnID09ICcoJykJCS8qIHJlY3Vyc2l2ZSEgKi8KKwkJICAgIHsKKwkJCXJldCA9IGdldF9mdW5jX3ZhcihzLCBsZW4sIHJldHZhciwgYXJnLAorCQkJCSAgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJICAmbGVuLCBldmFsdWF0ZSk7CisJCQkvKiBTdG9wIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gd2hlbiBpbW1lZGlhdGVseQorCQkJICogYWJvcnRpbmcgb24gZXJyb3IsIG9yIHdoZW4gYW4gaW50ZXJydXB0IG9jY3VycmVkIG9yCisJCQkgKiBhbiBleGNlcHRpb24gd2FzIHRocm93biBidXQgbm90IGNhdWdodC4gKi8KKwkJCWlmIChhYm9ydGluZygpKQorCQkJeworCQkJICAgIGlmIChyZXQgPT0gT0spCisJCQkJY2xlYXJfdmFyKHJldHZhcik7CisJCQkgICAgcmV0ID0gRkFJTDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGV2YWx1YXRlKQorCQkJcmV0ID0gZ2V0X3Zhcl92YXIocywgbGVuLCByZXR2YXIpOworCQl9CisKKwkJaWYgKGFsaWFzICE9IE5VTEwpCisJCSAgICB2aW1fZnJlZShhbGlhcyk7CisKKwkJYnJlYWs7CisgICAgfQorICAgICphcmcgPSBza2lwd2hpdGUoKmFyZyk7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSBleHByW2V4cHJdIHN1YnNjcmlwdC4KKyAgICAgKi8KKyAgICBpZiAoKiphcmcgPT0gJ1snICYmIHJldCA9PSBPSykKKyAgICB7CisJLyoKKwkgKiBHZXQgdGhlIHZhcmlhYmxlIGZyb20gaW5zaWRlIHRoZSBbXS4KKwkgKi8KKwkqYXJnID0gc2tpcHdoaXRlKCphcmcgKyAxKTsKKwlpZiAoZXZhbDEoYXJnLCAmdmFyMiwgZXZhbHVhdGUpID09IEZBSUwpCS8qIHJlY3Vyc2l2ZSEgKi8KKwl7CisJICAgIGNsZWFyX3ZhcihyZXR2YXIpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisKKwkvKiBDaGVjayBmb3IgdGhlICddJy4gKi8KKwlpZiAoKiphcmcgIT0gJ10nKQorCXsKKwkgICAgRU1TRyhfKCJFMTExOiBNaXNzaW5nICddJyIpKTsKKwkgICAgY2xlYXJfdmFyKHJldHZhcik7CisJICAgIGNsZWFyX3ZhcigmdmFyMik7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCWlmIChldmFsdWF0ZSkKKwl7CisJICAgIG4gPSBnZXRfdmFyX251bWJlcigmdmFyMik7CisJICAgIGNsZWFyX3ZhcigmdmFyMik7CisKKwkgICAgLyoKKwkgICAgICogVGhlIHJlc3VsdGluZyB2YXJpYWJsZSBpcyBhIHN0cmluZyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuCisJICAgICAqIElmIHRoZSBpbmRleCBpcyB0b28gYmlnIG9yIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIGVtcHR5LgorCSAgICAgKi8KKwkgICAgcyA9IGdldF92YXJfc3RyaW5nKHJldHZhcik7CisJICAgIGlmIChuID49IChsb25nKVNUUkxFTihzKSB8fCBuIDwgMCkKKwkJcyA9IE5VTEw7CisJICAgIGVsc2UKKwkJcyA9IHZpbV9zdHJuc2F2ZShzICsgbiwgMSk7CisJICAgIGNsZWFyX3ZhcihyZXR2YXIpOworCSAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBzOworCX0KKwkqYXJnID0gc2tpcHdoaXRlKCphcmcgKyAxKTsJLyogc2tpcCB0aGUgJ10nICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBBcHBseSBsb2dpY2FsIE5PVCBhbmQgdW5hcnkgJy0nLCBmcm9tIHJpZ2h0IHRvIGxlZnQsIGlnbm9yZSAnKycuCisgICAgICovCisgICAgaWYgKHJldCA9PSBPSyAmJiBldmFsdWF0ZSAmJiBlbmRfbGVhZGVyID4gc3RhcnRfbGVhZGVyKQorICAgIHsKKwl2YWwgPSBnZXRfdmFyX251bWJlcihyZXR2YXIpOworCXdoaWxlIChlbmRfbGVhZGVyID4gc3RhcnRfbGVhZGVyKQorCXsKKwkgICAgLS1lbmRfbGVhZGVyOworCSAgICBpZiAoKmVuZF9sZWFkZXIgPT0gJyEnKQorCQl2YWwgPSAhdmFsOworCSAgICBlbHNlIGlmICgqZW5kX2xlYWRlciA9PSAnLScpCisJCXZhbCA9IC12YWw7CisJfQorCWNsZWFyX3ZhcihyZXR2YXIpOworCXJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gdmFsOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZXQgYW4gb3B0aW9uIHZhbHVlLgorICogImFyZyIgcG9pbnRzIHRvIHRoZSAnJicgb3IgJysnIGJlZm9yZSB0aGUgb3B0aW9uIG5hbWUuCisgKiAiYXJnIiBpcyBhZHZhbmNlZCB0byBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIG9wdGlvbiBuYW1lLgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfb3B0aW9uX3ZhcihhcmcsIHJldHZhciwgZXZhbHVhdGUpCisgICAgY2hhcl91CSoqYXJnOworICAgIFZBUgkJcmV0dmFyOwkJLyogd2hlbiBOVUxMLCBvbmx5IGNoZWNrIGlmIG9wdGlvbiBleGlzdHMgKi8KKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIGNoYXJfdQkqb3B0aW9uX2VuZDsKKyAgICBsb25nCW51bXZhbDsKKyAgICBjaGFyX3UJKnN0cmluZ3ZhbDsKKyAgICBpbnQJCW9wdF90eXBlOworICAgIGludAkJYzsKKyAgICBpbnQJCXdvcmtpbmcgPSAoKiphcmcgPT0gJysnKTsgICAgLyogaGFzKCIrb3B0aW9uIikgKi8KKyAgICBpbnQJCXJldCA9IE9LOworICAgIGludAkJb3B0X2ZsYWdzOworCisgICAgLyoKKyAgICAgKiBJc29sYXRlIHRoZSBvcHRpb24gbmFtZSBhbmQgZmluZCBpdHMgdmFsdWUuCisgICAgICovCisgICAgb3B0aW9uX2VuZCA9IGZpbmRfb3B0aW9uX2VuZChhcmcsICZvcHRfZmxhZ3MpOworICAgIGlmIChvcHRpb25fZW5kID09IE5VTEwpCisgICAgeworCWlmIChyZXR2YXIgIT0gTlVMTCkKKwkgICAgRU1TRzIoXygiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiKSwgKmFyZyk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgaWYgKCFldmFsdWF0ZSkKKyAgICB7CisJKmFyZyA9IG9wdGlvbl9lbmQ7CisJcmV0dXJuIE9LOworICAgIH0KKworICAgIGMgPSAqb3B0aW9uX2VuZDsKKyAgICAqb3B0aW9uX2VuZCA9IE5VTDsKKyAgICBvcHRfdHlwZSA9IGdldF9vcHRpb25fdmFsdWUoKmFyZywgJm51bXZhbCwKKwkJCSAgICAgICByZXR2YXIgPT0gTlVMTCA/IE5VTEwgOiAmc3RyaW5ndmFsLCBvcHRfZmxhZ3MpOworCisgICAgaWYgKG9wdF90eXBlID09IC0zKQkJCS8qIGludmFsaWQgbmFtZSAqLworICAgIHsKKwlpZiAocmV0dmFyICE9IE5VTEwpCisJICAgIEVNU0cyKF8oIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIpLCAqYXJnKTsKKwlyZXQgPSBGQUlMOworICAgIH0KKyAgICBlbHNlIGlmIChyZXR2YXIgIT0gTlVMTCkKKyAgICB7CisJaWYgKG9wdF90eXBlID09IC0yKQkJLyogaGlkZGVuIHN0cmluZyBvcHRpb24gKi8KKwl7CisJICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworCSAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisJfQorCWVsc2UgaWYgKG9wdF90eXBlID09IC0xKQkvKiBoaWRkZW4gbnVtYmVyIG9wdGlvbiAqLworCXsKKwkgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKwl9CisJZWxzZSBpZiAob3B0X3R5cGUgPT0gMSkJCS8qIG51bWJlciBvcHRpb24gKi8KKwl7CisJICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCSAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IG51bXZhbDsKKwl9CisJZWxzZQkJCQkvKiBzdHJpbmcgb3B0aW9uICovCisJeworCSAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBzdHJpbmd2YWw7CisJfQorICAgIH0KKyAgICBlbHNlIGlmICh3b3JraW5nICYmIChvcHRfdHlwZSA9PSAtMiB8fCBvcHRfdHlwZSA9PSAtMSkpCisJcmV0ID0gRkFJTDsKKworICAgICpvcHRpb25fZW5kID0gYzsJCSAgICAvKiBwdXQgYmFjayBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAqYXJnID0gb3B0aW9uX2VuZDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGZvciBhIHN0cmluZyBjb25zdGFudC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZ2V0X3N0cmluZ192YXIoYXJnLCByZXR2YXIsIGV2YWx1YXRlKQorICAgIGNoYXJfdQkqKmFyZzsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlpOworICAgIGludAkJZXh0cmEgPSAwOworCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc2tpcHBpbmcgYmFja3NsYXNoZWQgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBmb3IgKHAgPSAqYXJnICsgMTsgKnAgJiYgKnAgIT0gJyInOyArK3ApCisgICAgeworCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCXsKKwkgICAgKytwOworCSAgICAvKiBBICJcPHg+IiBmb3JtIG9jY3VwaWVzIGF0IGxlYXN0IDQgY2hhcmFjdGVycywgYW5kIHByb2R1Y2VzIHVwCisJICAgICAqIHRvIDYgY2hhcmFjdGVyczogcmVzZXJ2ZSBzcGFjZSBmb3IgMiBleHRyYSAqLworCSAgICBpZiAoKnAgPT0gJzwnKQorCQlleHRyYSArPSAyOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmICgqcCAhPSAnIicpCisgICAgeworCUVNU0cyKF8oIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIiksICphcmcpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIElmIG9ubHkgcGFyc2luZywgc2V0ICphcmcgYW5kIHJldHVybiBoZXJlICovCisgICAgaWYgKCFldmFsdWF0ZSkKKyAgICB7CisJKmFyZyA9IHAgKyAxOworCXJldHVybiBPSzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHN0cmluZyBpbnRvIGFsbG9jYXRlZCBtZW1vcnksIGhhbmRsaW5nIGJhY2tzbGFzaGVkCisgICAgICogY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBuYW1lID0gYWxsb2MoKHVuc2lnbmVkKShwIC0gKmFyZyArIGV4dHJhKSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGkgPSAwOworICAgIGZvciAocCA9ICphcmcgKyAxOyAqcCAmJiAqcCAhPSAnIic7ICsrcCkKKyAgICB7CisJaWYgKCpwID09ICdcXCcpCisJeworCSAgICBzd2l0Y2ggKCorK3ApCisJICAgIHsKKwkJY2FzZSAnYic6IG5hbWVbaSsrXSA9IEJTOyBicmVhazsKKwkJY2FzZSAnZSc6IG5hbWVbaSsrXSA9IEVTQzsgYnJlYWs7CisJCWNhc2UgJ2YnOiBuYW1lW2krK10gPSBGRjsgYnJlYWs7CisJCWNhc2UgJ24nOiBuYW1lW2krK10gPSBOTDsgYnJlYWs7CisJCWNhc2UgJ3InOiBuYW1lW2krK10gPSBDQVI7IGJyZWFrOworCQljYXNlICd0JzogbmFtZVtpKytdID0gVEFCOyBicmVhazsKKworCQljYXNlICdYJzogLyogaGV4OiAiXHgxIiwgIlx4MTIiICovCisJCWNhc2UgJ3gnOgorCQljYXNlICd1JzogLyogVW5pY29kZTogIlx1MDAyMyIgKi8KKwkJY2FzZSAnVSc6CisJCQkgIGlmICh2aW1faXN4ZGlnaXQocFsxXSkpCisJCQkgIHsKKwkJCSAgICAgIGludAluLCBucjsKKwkJCSAgICAgIGludAljID0gdG91cHBlcigqcCk7CisKKwkJCSAgICAgIGlmIChjID09ICdYJykKKwkJCQkgIG4gPSAyOworCQkJICAgICAgZWxzZQorCQkJCSAgbiA9IDQ7CisJCQkgICAgICBuciA9IDA7CisJCQkgICAgICB3aGlsZSAoLS1uID49IDAgJiYgdmltX2lzeGRpZ2l0KHBbMV0pKQorCQkJICAgICAgeworCQkJCSAgKytwOworCQkJCSAgbnIgPSAobnIgPDwgNCkgKyBoZXgybnIoKnApOworCQkJICAgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAgIC8qIEZvciAiXHUiIHN0b3JlIHRoZSBudW1iZXIgYWNjb3JkaW5nIHRvCisJCQkgICAgICAgKiAnZW5jb2RpbmcnLiAqLworCQkJICAgICAgaWYgKGMgIT0gJ1gnKQorCQkJCSAgaSArPSAoKm1iX2NoYXIyYnl0ZXMpKG5yLCBuYW1lICsgaSk7CisJCQkgICAgICBlbHNlCisjZW5kaWYKKwkJCQkgIG5hbWVbaSsrXSA9IG5yOworCQkJICB9CisJCQkgIGVsc2UKKwkJCSAgICAgIG5hbWVbaSsrXSA9ICpwOworCQkJICBicmVhazsKKworCQkJICAvKiBvY3RhbDogIlwxIiwgIlwxMiIsICJcMTIzIiAqLworCQljYXNlICcwJzoKKwkJY2FzZSAnMSc6CisJCWNhc2UgJzInOgorCQljYXNlICczJzoKKwkJY2FzZSAnNCc6CisJCWNhc2UgJzUnOgorCQljYXNlICc2JzoKKwkJY2FzZSAnNyc6IG5hbWVbaV0gPSAqcCAtICcwJzsKKwkJCSAgaWYgKHBbMV0gPj0gJzAnICYmIHBbMV0gPD0gJzcnKQorCQkJICB7CisJCQkgICAgICArK3A7CisJCQkgICAgICBuYW1lW2ldID0gKG5hbWVbaV0gPDwgMykgKyAqcCAtICcwJzsKKwkJCSAgICAgIGlmIChwWzFdID49ICcwJyAmJiBwWzFdIDw9ICc3JykKKwkJCSAgICAgIHsKKwkJCQkgICsrcDsKKwkJCQkgIG5hbWVbaV0gPSAobmFtZVtpXSA8PCAzKSArICpwIC0gJzAnOworCQkJICAgICAgfQorCQkJICB9CisJCQkgICsraTsKKwkJCSAgYnJlYWs7CisKKwkJCSAgICAvKiBTcGVjaWFsIGtleSwgZS5nLjogIlw8Qy1XPiIgKi8KKwkJY2FzZSAnPCc6IGV4dHJhID0gdHJhbnNfc3BlY2lhbCgmcCwgbmFtZSArIGksIFRSVUUpOworCQkJICBpZiAoZXh0cmEgIT0gMCkKKwkJCSAgeworCQkJICAgICAgaSArPSBleHRyYTsKKwkJCSAgICAgIC0tcDsKKwkJCSAgICAgIGJyZWFrOworCQkJICB9CisJCQkgIC8qIEZBTExUSFJPVUdIICovCisKKwkJZGVmYXVsdDogIG5hbWVbaSsrXSA9ICpwOworCQkJICBicmVhazsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIG5hbWVbaSsrXSA9ICpwOworCisjaWZkZWYgRkVBVF9NQllURQorCS8qIEZvciBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGNvcHkgdGhlIGJ5dGVzIGFmdGVyIHRoZSBmaXJzdCBvbmUuICovCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGludAlsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKworCSAgICB3aGlsZSAoLS1sID4gMCkKKwkJbmFtZVtpKytdID0gKisrcDsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgbmFtZVtpXSA9IE5VTDsKKyAgICAqYXJnID0gcCArIDE7CisKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IG5hbWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGZvciBhbiBiYWNrdGljay1zdHJpbmcgY29uc3RhbnQuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9saXRfc3RyaW5nX3ZhcihhcmcsIHJldHZhciwgZXZhbHVhdGUpCisgICAgY2hhcl91CSoqYXJnOworICAgIFZBUgkJcmV0dmFyOworICAgIGludAkJZXZhbHVhdGU7Cit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgICAgICovCisgICAgcCA9IHZpbV9zdHJjaHIoKmFyZyArIDEsICdcJycpOworICAgIGlmIChwID09IE5VTEwpCisgICAgeworCUVNU0cyKF8oIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIiksICphcmcpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIGlmIChldmFsdWF0ZSkKKyAgICB7CisJLyoKKwkgKiBDb3B5IHRoZSBzdHJpbmcgaW50byBhbGxvY2F0ZWQgbWVtb3J5LgorCSAqLworCW5hbWUgPSB2aW1fc3RybnNhdmUoKmFyZyArIDEsIChpbnQpKHAgLSAoKmFyZyArIDEpKSk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlyZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IG5hbWU7CisgICAgfQorCisgICAgKmFyZyA9IHAgKyAxOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAqICJhcmciIGlzIHBvaW50aW5nIHRvIHRoZSAnJCcuICBJdCBpcyBhZHZhbmNlZCB0byBhZnRlciB0aGUgbmFtZS4KKyAqIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgbm90IHNldCwgc2lsZW50bHkgYXNzdW1lIGl0IGlzIGVtcHR5LgorICogQWx3YXlzIHJldHVybiBPSy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9lbnZfdmFyKGFyZywgcmV0dmFyLCBldmFsdWF0ZSkKKyAgICBjaGFyX3UJKiphcmc7CisgICAgVkFSCQlyZXR2YXI7CisgICAgaW50CQlldmFsdWF0ZTsKK3sKKyAgICBjaGFyX3UJKnN0cmluZyA9IE5VTEw7CisgICAgaW50CQlsZW47CisgICAgaW50CQljYzsKKyAgICBjaGFyX3UJKm5hbWU7CisKKyAgICArKyphcmc7CisgICAgbmFtZSA9ICphcmc7CisgICAgbGVuID0gZ2V0X2Vudl9sZW4oYXJnKTsKKyAgICBpZiAoZXZhbHVhdGUpCisgICAgeworCWlmIChsZW4gIT0gMCkKKwl7CisJICAgIGNjID0gbmFtZVtsZW5dOworCSAgICBuYW1lW2xlbl0gPSBOVUw7CisJICAgIC8qIGZpcnN0IHRyeSBtY2hfZ2V0ZW52KCksIGZhc3QgZm9yIG5vcm1hbCBlbnZpcm9ubWVudCB2YXJzICovCisJICAgIHN0cmluZyA9IG1jaF9nZXRlbnYobmFtZSk7CisJICAgIGlmIChzdHJpbmcgIT0gTlVMTCAmJiAqc3RyaW5nICE9IE5VTCkKKwkJc3RyaW5nID0gdmltX3N0cnNhdmUoc3RyaW5nKTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIG5leHQgdHJ5IGV4cGFuZGluZyB0aGluZ3MgbGlrZSAkVklNIGFuZCAke0hPTUV9ICovCisJCXN0cmluZyA9IGV4cGFuZF9lbnZfc2F2ZShuYW1lIC0gMSk7CisJCWlmIChzdHJpbmcgIT0gTlVMTCAmJiAqc3RyaW5nID09ICckJykKKwkJeworCQkgICAgdmltX2ZyZWUoc3RyaW5nKTsKKwkJICAgIHN0cmluZyA9IE5VTEw7CisJCX0KKwkgICAgfQorCSAgICBuYW1lW2xlbl0gPSBjYzsKKwl9CisJcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBzdHJpbmc7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogQXJyYXkgd2l0aCBuYW1lcyBhbmQgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBhbGwgaW50ZXJuYWwgZnVuY3Rpb25zCisgKiBNVVNUIEJFIEtFUFQgU09SVEVEIElOIHN0cmNtcCgpIE9SREVSIEZPUiBCSU5BUlkgU0VBUkNIIQorICovCitzdGF0aWMgc3RydWN0IGZzdAoreworICAgIGNoYXIJKmZfbmFtZTsJLyogZnVuY3Rpb24gbmFtZSAqLworICAgIGNoYXIJZl9taW5fYXJnYzsJLyogbWluaW1hbCBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgY2hhcglmX21heF9hcmdjOwkvKiBtYXhpbWFsIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICB2b2lkCSgqZl9mdW5jKSBfX0FSR1MoKFZBUiBhcmdzLCBWQVIgcnZhcikpOyAvKiBpbXBsLiBmdW5jdGlvbiAqLworfSBmdW5jdGlvbnNbXSA9Cit7CisgICAgeyJhcHBlbmQiLAkJMiwgMiwgZl9hcHBlbmR9LAorICAgIHsiYXJnYyIsCQkwLCAwLCBmX2FyZ2N9LAorICAgIHsiYXJnaWR4IiwJCTAsIDAsIGZfYXJnaWR4fSwKKyAgICB7ImFyZ3YiLAkJMSwgMSwgZl9hcmd2fSwKKyAgICB7ImJyb3dzZSIsCQk0LCA0LCBmX2Jyb3dzZX0sCisgICAgeyJidWZleGlzdHMiLAkxLCAxLCBmX2J1ZmV4aXN0c30sCisgICAgeyJidWZmZXJfZXhpc3RzIiwJMSwgMSwgZl9idWZleGlzdHN9LAkvKiBvYnNvbGV0ZSAqLworICAgIHsiYnVmZmVyX25hbWUiLAkxLCAxLCBmX2J1Zm5hbWV9LAkvKiBvYnNvbGV0ZSAqLworICAgIHsiYnVmZmVyX251bWJlciIsCTEsIDEsIGZfYnVmbnJ9LAkJLyogb2Jzb2xldGUgKi8KKyAgICB7ImJ1Zmxpc3RlZCIsCTEsIDEsIGZfYnVmbGlzdGVkfSwKKyAgICB7ImJ1ZmxvYWRlZCIsCTEsIDEsIGZfYnVmbG9hZGVkfSwKKyAgICB7ImJ1Zm5hbWUiLAkJMSwgMSwgZl9idWZuYW1lfSwKKyAgICB7ImJ1Zm5yIiwJCTEsIDEsIGZfYnVmbnJ9LAorICAgIHsiYnVmd2lubnIiLAkxLCAxLCBmX2J1Zndpbm5yfSwKKyAgICB7ImJ5dGUybGluZSIsCTEsIDEsIGZfYnl0ZTJsaW5lfSwKKyAgICB7ImNoYXIybnIiLAkJMSwgMSwgZl9jaGFyMm5yfSwKKyAgICB7ImNpbmRlbnQiLAkJMSwgMSwgZl9jaW5kZW50fSwKKyAgICB7ImNvbCIsCQkxLCAxLCBmX2NvbH0sCisgICAgeyJjb25maXJtIiwJCTEsIDQsIGZfY29uZmlybX0sCisgICAgeyJjc2NvcGVfY29ubmVjdGlvbiIsMCwzLCBmX2NzY29wZV9jb25uZWN0aW9ufSwKKyAgICB7ImN1cnNvciIsCQkyLCAyLCBmX2N1cnNvcn0sCisgICAgeyJkZWxldGUiLAkJMSwgMSwgZl9kZWxldGV9LAorICAgIHsiZGlkX2ZpbGV0eXBlIiwJMCwgMCwgZl9kaWRfZmlsZXR5cGV9LAorICAgIHsiZXNjYXBlIiwJCTIsIDIsIGZfZXNjYXBlfSwKKyAgICB7ImV2ZW50aGFuZGxlciIsCTAsIDAsIGZfZXZlbnRoYW5kbGVyfSwKKyAgICB7ImV4ZWN1dGFibGUiLAkxLCAxLCBmX2V4ZWN1dGFibGV9LAorICAgIHsiZXhpc3RzIiwJCTEsIDEsIGZfZXhpc3RzfSwKKyAgICB7ImV4cGFuZCIsCQkxLCAyLCBmX2V4cGFuZH0sCisgICAgeyJmaWxlX3JlYWRhYmxlIiwJMSwgMSwgZl9maWxlcmVhZGFibGV9LAkvKiBvYnNvbGV0ZSAqLworICAgIHsiZmlsZXJlYWRhYmxlIiwJMSwgMSwgZl9maWxlcmVhZGFibGV9LAorICAgIHsiZmlsZXdyaXRhYmxlIiwJMSwgMSwgZl9maWxld3JpdGFibGV9LAorICAgIHsiZm5hbWVtb2RpZnkiLAkyLCAyLCBmX2ZuYW1lbW9kaWZ5fSwKKyAgICB7ImZvbGRjbG9zZWQiLAkxLCAxLCBmX2ZvbGRjbG9zZWR9LAorICAgIHsiZm9sZGNsb3NlZGVuZCIsCTEsIDEsIGZfZm9sZGNsb3NlZGVuZH0sCisgICAgeyJmb2xkbGV2ZWwiLAkxLCAxLCBmX2ZvbGRsZXZlbH0sCisgICAgeyJmb2xkdGV4dCIsCTAsIDAsIGZfZm9sZHRleHR9LAorICAgIHsiZm9yZWdyb3VuZCIsCTAsIDAsIGZfZm9yZWdyb3VuZH0sCisgICAgeyJnZXRidWZ2YXIiLAkyLCAyLCBmX2dldGJ1ZnZhcn0sCisgICAgeyJnZXRjaGFyIiwJCTAsIDEsIGZfZ2V0Y2hhcn0sCisgICAgeyJnZXRjaGFybW9kIiwJMCwgMCwgZl9nZXRjaGFybW9kfSwKKyAgICB7ImdldGNtZGxpbmUiLAkwLCAwLCBmX2dldGNtZGxpbmV9LAorICAgIHsiZ2V0Y21kcG9zIiwJMCwgMCwgZl9nZXRjbWRwb3N9LAorICAgIHsiZ2V0Y3dkIiwJCTAsIDAsIGZfZ2V0Y3dkfSwKKyAgICB7ImdldGZzaXplIiwJMSwgMSwgZl9nZXRmc2l6ZX0sCisgICAgeyJnZXRmdGltZSIsCTEsIDEsIGZfZ2V0ZnRpbWV9LAorICAgIHsiZ2V0bGluZSIsCQkxLCAxLCBmX2dldGxpbmV9LAorICAgIHsiZ2V0cmVnIiwJCTAsIDEsIGZfZ2V0cmVnfSwKKyAgICB7ImdldHJlZ3R5cGUiLAkwLCAxLCBmX2dldHJlZ3R5cGV9LAorICAgIHsiZ2V0d2lucG9zeCIsCTAsIDAsIGZfZ2V0d2lucG9zeH0sCisgICAgeyJnZXR3aW5wb3N5IiwJMCwgMCwgZl9nZXR3aW5wb3N5fSwKKyAgICB7ImdldHdpbnZhciIsCTIsIDIsIGZfZ2V0d2ludmFyfSwKKyAgICB7Imdsb2IiLAkJMSwgMSwgZl9nbG9ifSwKKyAgICB7Imdsb2JwYXRoIiwJMiwgMiwgZl9nbG9icGF0aH0sCisgICAgeyJoYXMiLAkJMSwgMSwgZl9oYXN9LAorICAgIHsiaGFzbWFwdG8iLAkxLCAyLCBmX2hhc21hcHRvfSwKKyAgICB7ImhpZ2hsaWdodElEIiwJMSwgMSwgZl9obElEfSwJCS8qIG9ic29sZXRlICovCisgICAgeyJoaWdobGlnaHRfZXhpc3RzIiwxLCAxLCBmX2hsZXhpc3RzfSwJLyogb2Jzb2xldGUgKi8KKyAgICB7Imhpc3RhZGQiLAkJMiwgMiwgZl9oaXN0YWRkfSwKKyAgICB7Imhpc3RkZWwiLAkJMSwgMiwgZl9oaXN0ZGVsfSwKKyAgICB7Imhpc3RnZXQiLAkJMSwgMiwgZl9oaXN0Z2V0fSwKKyAgICB7Imhpc3RuciIsCQkxLCAxLCBmX2hpc3Rucn0sCisgICAgeyJobElEIiwJCTEsIDEsIGZfaGxJRH0sCisgICAgeyJobGV4aXN0cyIsCTEsIDEsIGZfaGxleGlzdHN9LAorICAgIHsiaG9zdG5hbWUiLAkwLCAwLCBmX2hvc3RuYW1lfSwKKyAgICB7Imljb252IiwJCTMsIDMsIGZfaWNvbnZ9LAorICAgIHsiaW5kZW50IiwJCTEsIDEsIGZfaW5kZW50fSwKKyAgICB7ImlucHV0IiwJCTEsIDIsIGZfaW5wdXR9LAorICAgIHsiaW5wdXRkaWFsb2ciLAkxLCAzLCBmX2lucHV0ZGlhbG9nfSwKKyAgICB7ImlucHV0cmVzdG9yZSIsCTAsIDAsIGZfaW5wdXRyZXN0b3JlfSwKKyAgICB7ImlucHV0c2F2ZSIsCTAsIDAsIGZfaW5wdXRzYXZlfSwKKyAgICB7ImlucHV0c2VjcmV0IiwJMSwgMiwgZl9pbnB1dHNlY3JldH0sCisgICAgeyJpc2RpcmVjdG9yeSIsCTEsIDEsIGZfaXNkaXJlY3Rvcnl9LAorICAgIHsibGFzdF9idWZmZXJfbnIiLAkwLCAwLCBmX2xhc3RfYnVmZmVyX25yfSwvKiBvYnNvbGV0ZSAqLworICAgIHsibGliY2FsbCIsCQkzLCAzLCBmX2xpYmNhbGx9LAorICAgIHsibGliY2FsbG5yIiwJMywgMywgZl9saWJjYWxsbnJ9LAorICAgIHsibGluZSIsCQkxLCAxLCBmX2xpbmV9LAorICAgIHsibGluZTJieXRlIiwJMSwgMSwgZl9saW5lMmJ5dGV9LAorICAgIHsibGlzcGluZGVudCIsCTEsIDEsIGZfbGlzcGluZGVudH0sCisgICAgeyJsb2NhbHRpbWUiLAkwLCAwLCBmX2xvY2FsdGltZX0sCisgICAgeyJtYXBhcmciLAkJMSwgMiwgZl9tYXBhcmd9LAorICAgIHsibWFwY2hlY2siLAkxLCAyLCBmX21hcGNoZWNrfSwKKyAgICB7Im1hdGNoIiwJCTIsIDMsIGZfbWF0Y2h9LAorICAgIHsibWF0Y2hlbmQiLAkyLCAzLCBmX21hdGNoZW5kfSwKKyAgICB7Im1hdGNoc3RyIiwJMiwgMywgZl9tYXRjaHN0cn0sCisgICAgeyJtb2RlIiwJCTAsIDAsIGZfbW9kZX0sCisgICAgeyJuZXh0bm9uYmxhbmsiLAkxLCAxLCBmX25leHRub25ibGFua30sCisgICAgeyJucjJjaGFyIiwJCTEsIDEsIGZfbnIyY2hhcn0sCisgICAgeyJwcmV2bm9uYmxhbmsiLAkxLCAxLCBmX3ByZXZub25ibGFua30sCisgICAgeyJyZW1vdGVfZXhwciIsCTIsIDMsIGZfcmVtb3RlX2V4cHJ9LAorICAgIHsicmVtb3RlX2ZvcmVncm91bmQiLCAxLCAxLCBmX3JlbW90ZV9mb3JlZ3JvdW5kfSwKKyAgICB7InJlbW90ZV9wZWVrIiwJMSwgMiwgZl9yZW1vdGVfcGVla30sCisgICAgeyJyZW1vdGVfcmVhZCIsCTEsIDEsIGZfcmVtb3RlX3JlYWR9LAorICAgIHsicmVtb3RlX3NlbmQiLAkyLCAzLCBmX3JlbW90ZV9zZW5kfSwKKyAgICB7InJlbmFtZSIsCQkyLCAyLCBmX3JlbmFtZX0sCisgICAgeyJyZXNvbHZlIiwJCTEsIDEsIGZfcmVzb2x2ZX0sCisgICAgeyJzZWFyY2giLAkJMSwgMiwgZl9zZWFyY2h9LAorICAgIHsic2VhcmNocGFpciIsCTMsIDUsIGZfc2VhcmNocGFpcn0sCisgICAgeyJzZXJ2ZXIyY2xpZW50IiwJMiwgMiwgZl9zZXJ2ZXIyY2xpZW50fSwKKyAgICB7InNlcnZlcmxpc3QiLAkwLCAwLCBmX3NlcnZlcmxpc3R9LAorICAgIHsic2V0YnVmdmFyIiwJMywgMywgZl9zZXRidWZ2YXJ9LAorICAgIHsic2V0Y21kcG9zIiwJMSwgMSwgZl9zZXRjbWRwb3N9LAorICAgIHsic2V0bGluZSIsCQkyLCAyLCBmX3NldGxpbmV9LAorICAgIHsic2V0cmVnIiwJCTIsIDMsIGZfc2V0cmVnfSwKKyAgICB7InNldHdpbnZhciIsCTMsIDMsIGZfc2V0d2ludmFyfSwKKyAgICB7InNpbXBsaWZ5IiwJMSwgMSwgZl9zaW1wbGlmeX0sCisjaWZkZWYgSEFWRV9TVFJGVElNRQorICAgIHsic3RyZnRpbWUiLAkxLCAyLCBmX3N0cmZ0aW1lfSwKKyNlbmRpZgorICAgIHsic3RyaWR4IiwJCTIsIDIsIGZfc3RyaWR4fSwKKyAgICB7InN0cmxlbiIsCQkxLCAxLCBmX3N0cmxlbn0sCisgICAgeyJzdHJwYXJ0IiwJCTIsIDMsIGZfc3RycGFydH0sCisgICAgeyJzdHJyaWR4IiwJCTIsIDIsIGZfc3RycmlkeH0sCisgICAgeyJzdHJ0cmFucyIsCTEsIDEsIGZfc3RydHJhbnN9LAorICAgIHsic3VibWF0Y2giLAkxLCAxLCBmX3N1Ym1hdGNofSwKKyAgICB7InN1YnN0aXR1dGUiLAk0LCA0LCBmX3N1YnN0aXR1dGV9LAorICAgIHsic3luSUQiLAkJMywgMywgZl9zeW5JRH0sCisgICAgeyJzeW5JRGF0dHIiLAkyLCAzLCBmX3N5bklEYXR0cn0sCisgICAgeyJzeW5JRHRyYW5zIiwJMSwgMSwgZl9zeW5JRHRyYW5zfSwKKyAgICB7InN5c3RlbSIsCQkxLCAxLCBmX3N5c3RlbX0sCisgICAgeyJ0ZW1wbmFtZSIsCTAsIDAsIGZfdGVtcG5hbWV9LAorICAgIHsidG9sb3dlciIsCQkxLCAxLCBmX3RvbG93ZXJ9LAorICAgIHsidG91cHBlciIsCQkxLCAxLCBmX3RvdXBwZXJ9LAorICAgIHsidHlwZSIsCQkxLCAxLCBmX3R5cGV9LAorICAgIHsidmlydGNvbCIsCQkxLCAxLCBmX3ZpcnRjb2x9LAorICAgIHsidmlzdWFsbW9kZSIsCTAsIDEsIGZfdmlzdWFsbW9kZX0sCisgICAgeyJ3aW5idWZuciIsCTEsIDEsIGZfd2luYnVmbnJ9LAorICAgIHsid2luY29sIiwJCTAsIDAsIGZfd2luY29sfSwKKyAgICB7IndpbmhlaWdodCIsCTEsIDEsIGZfd2luaGVpZ2h0fSwKKyAgICB7IndpbmxpbmUiLAkJMCwgMCwgZl93aW5saW5lfSwKKyAgICB7Indpbm5yIiwJCTAsIDAsIGZfd2lubnJ9LAorICAgIHsid2lucmVzdGNtZCIsCTAsIDAsIGZfd2lucmVzdGNtZH0sCisgICAgeyJ3aW53aWR0aCIsCTEsIDEsIGZfd2lud2lkdGh9LAorfTsKKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgbGlzdCBvZiBpbnRlcm5hbAorICogb3IgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIG5hbWVzLgorICovCisgICAgY2hhcl91ICoKK2dldF9mdW5jdGlvbl9uYW1lKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIHN0YXRpYyBpbnQJaW50aWR4ID0gLTE7CisgICAgY2hhcl91CSpuYW1lOworCisgICAgaWYgKGlkeCA9PSAwKQorCWludGlkeCA9IC0xOworICAgIGlmIChpbnRpZHggPCAwKQorICAgIHsKKwluYW1lID0gZ2V0X3VzZXJfZnVuY19uYW1lKHhwLCBpZHgpOworCWlmIChuYW1lICE9IE5VTEwpCisJICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICBpZiAoKytpbnRpZHggPCAoaW50KShzaXplb2YoZnVuY3Rpb25zKSAvIHNpemVvZihzdHJ1Y3QgZnN0KSkpCisgICAgeworCVNUUkNQWShJT2J1ZmYsIGZ1bmN0aW9uc1tpbnRpZHhdLmZfbmFtZSk7CisJU1RSQ0FUKElPYnVmZiwgIigiKTsKKwlpZiAoZnVuY3Rpb25zW2ludGlkeF0uZl9tYXhfYXJnYyA9PSAwKQorCSAgICBTVFJDQVQoSU9idWZmLCAiKSIpOworCXJldHVybiBJT2J1ZmY7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXZlbiB0byBFeHBhbmRHZW5lcmljKCkgdG8gb2J0YWluIHRoZSBsaXN0IG9mIGludGVybmFsIG9yCisgKiB1c2VyIGRlZmluZWQgdmFyaWFibGUgb3IgZnVuY3Rpb24gbmFtZXMuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGNoYXJfdSAqCitnZXRfZXhwcl9uYW1lKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIHN0YXRpYyBpbnQJaW50aWR4ID0gLTE7CisgICAgY2hhcl91CSpuYW1lOworCisgICAgaWYgKGlkeCA9PSAwKQorCWludGlkeCA9IC0xOworICAgIGlmIChpbnRpZHggPCAwKQorICAgIHsKKwluYW1lID0gZ2V0X2Z1bmN0aW9uX25hbWUoeHAsIGlkeCk7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwkgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIHJldHVybiBnZXRfdXNlcl92YXJfbmFtZSh4cCwgKytpbnRpZHgpOworfQorCisjZW5kaWYgLyogRkVBVF9DTURMX0NPTVBMICovCisKKy8qCisgKiBGaW5kIGludGVybmFsIGZ1bmN0aW9uIGluIHRhYmxlIGFib3ZlLgorICogUmV0dXJuIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQKKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRfaW50ZXJuYWxfZnVuYyhuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCit7CisgICAgaW50CQlmaXJzdCA9IDA7CisgICAgaW50CQlsYXN0ID0gKGludCkoc2l6ZW9mKGZ1bmN0aW9ucykgLyBzaXplb2Yoc3RydWN0IGZzdCkpIC0gMTsKKyAgICBpbnQJCWNtcDsKKyAgICBpbnQJCXg7CisKKyAgICAvKgorICAgICAqIEZpbmQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIHRhYmxlLiBCaW5hcnkgc2VhcmNoLgorICAgICAqLworICAgIHdoaWxlIChmaXJzdCA8PSBsYXN0KQorICAgIHsKKwl4ID0gZmlyc3QgKyAoKHVuc2lnbmVkKShsYXN0IC0gZmlyc3QpID4+IDEpOworCWNtcCA9IFNUUkNNUChuYW1lLCBmdW5jdGlvbnNbeF0uZl9uYW1lKTsKKwlpZiAoY21wIDwgMCkKKwkgICAgbGFzdCA9IHggLSAxOworCWVsc2UgaWYgKGNtcCA+IDApCisJICAgIGZpcnN0ID0geCArIDE7CisJZWxzZQorCSAgICByZXR1cm4geDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogQWxsb2NhdGUgYSB2YXJpYWJsZSBmb3IgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfZnVuY192YXIobmFtZSwgbGVuLCByZXR2YXIsIGFyZywgZmlyc3RsaW5lLCBsYXN0bGluZSwgZG9lc3JhbmdlLCBldmFsdWF0ZSkKKyAgICBjaGFyX3UJKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBmdW5jdGlvbiAqLworICAgIGludAkJbGVuOwkJLyogbGVuZ3RoIG9mICJuYW1lIiAqLworICAgIFZBUgkJcmV0dmFyOworICAgIGNoYXJfdQkqKmFyZzsJCS8qIGFyZ3VtZW50LCBwb2ludGluZyB0byB0aGUgJygnICovCisgICAgbGluZW5yX1QJZmlyc3RsaW5lOwkvKiBmaXJzdCBsaW5lIG9mIHJhbmdlICovCisgICAgbGluZW5yX1QJbGFzdGxpbmU7CS8qIGxhc3QgbGluZSBvZiByYW5nZSAqLworICAgIGludAkJKmRvZXNyYW5nZTsJLyogcmV0dXJuOiBmdW5jdGlvbiBoYW5kbGVkIHJhbmdlICovCisgICAgaW50CQlldmFsdWF0ZTsKK3sKKyAgICBjaGFyX3UJKmFyZ3A7CisgICAgaW50CQlyZXQgPSBPSzsKKyNkZWZpbmUgTUFYX0ZVTkNfQVJHUwkyMAorICAgIHZhcgkJYXJndmFyc1tNQVhfRlVOQ19BUkdTXTsJLyogdmFycyBmb3IgYXJndW1lbnRzICovCisgICAgaW50CQlhcmdjb3VudCA9IDA7CQkvKiBudW1iZXIgb2YgYXJndW1lbnRzIGZvdW5kICovCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgYXJndW1lbnRzLgorICAgICAqLworICAgIGFyZ3AgPSAqYXJnOworICAgIHdoaWxlIChhcmdjb3VudCA8IE1BWF9GVU5DX0FSR1MpCisgICAgeworCWFyZ3AgPSBza2lwd2hpdGUoYXJncCArIDEpOwkgICAgLyogc2tpcCB0aGUgJygnIG9yICcsJyAqLworCWlmICgqYXJncCA9PSAnKScgfHwgKmFyZ3AgPT0gJywnIHx8ICphcmdwID09IE5VTCkKKwkgICAgYnJlYWs7CisJYXJndmFyc1thcmdjb3VudF0udmFyX25hbWUgPSBOVUxMOyAgLyogdGhlIG5hbWUgaXMgbm90IHN0b3JlZCAqLworCWlmIChldmFsMSgmYXJncCwgJmFyZ3ZhcnNbYXJnY291bnRdLCBldmFsdWF0ZSkgPT0gRkFJTCkKKwl7CisJICAgIHJldCA9IEZBSUw7CisJICAgIGJyZWFrOworCX0KKwkrK2FyZ2NvdW50OworCWlmICgqYXJncCAhPSAnLCcpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmFyZ3AgPT0gJyknKQorCSsrYXJncDsKKyAgICBlbHNlCisJcmV0ID0gRkFJTDsKKworICAgIGlmIChyZXQgPT0gT0spCisJcmV0ID0gY2FsbF9mdW5jKG5hbWUsIGxlbiwgcmV0dmFyLCBhcmdjb3VudCwgYXJndmFycywKKwkJCQkgICAgZmlyc3RsaW5lLCBsYXN0bGluZSwgZG9lc3JhbmdlLCBldmFsdWF0ZSk7CisgICAgZWxzZSBpZiAoIWFib3J0aW5nKCkpCisJRU1TRzIoXygiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIiksIG5hbWUpOworCisgICAgd2hpbGUgKC0tYXJnY291bnQgPj0gMCkKKwljbGVhcl92YXIoJmFyZ3ZhcnNbYXJnY291bnRdKTsKKworICAgICphcmcgPSBza2lwd2hpdGUoYXJncCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogQ2FsbCBhIGZ1bmN0aW9uIHdpdGggaXRzIHJlc29sdmVkIHBhcmFtZXRlcnMKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorY2FsbF9mdW5jKG5hbWUsIGxlbiwgcmV0dmFyLCBhcmdjb3VudCwgYXJndmFycywgZmlyc3RsaW5lLCBsYXN0bGluZSwKKwkJCQkJCQkgIGRvZXNyYW5nZSwgZXZhbHVhdGUpCisgICAgY2hhcl91CSpuYW1lOwkJLyogbmFtZSBvZiB0aGUgZnVuY3Rpb24gKi8KKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiAibmFtZSIgKi8KKyAgICBWQVIJCXJldHZhcjsJCS8qIHJldHVybiB2YWx1ZSBnb2VzIGhlcmUgKi8KKyAgICBpbnQJCWFyZ2NvdW50OwkvKiBudW1iZXIgb2YgImFyZ3ZhcnMiICovCisgICAgVkFSCQlhcmd2YXJzOwkvKiB2YXJzIGZvciBhcmd1bWVudHMgKi8KKyAgICBsaW5lbnJfVAlmaXJzdGxpbmU7CS8qIGZpcnN0IGxpbmUgb2YgcmFuZ2UgKi8KKyAgICBsaW5lbnJfVAlsYXN0bGluZTsJLyogbGFzdCBsaW5lIG9mIHJhbmdlICovCisgICAgaW50CQkqZG9lc3JhbmdlOwkvKiByZXR1cm46IGZ1bmN0aW9uIGhhbmRsZWQgcmFuZ2UgKi8KKyAgICBpbnQJCWV2YWx1YXRlOworeworICAgIGludAkJcmV0ID0gRkFJTDsKKyAgICBzdGF0aWMgY2hhciAqZXJyb3JzW10gPQorCQl7Tl8oIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIiksCisJCSBOXygiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiKSwKKwkJIE5fKCJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIiksCisJCSBOXygiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIiksCisJCX07CisjZGVmaW5lIEVSUk9SX1VOS05PV04JMAorI2RlZmluZSBFUlJPUl9UT09NQU5ZCTEKKyNkZWZpbmUgRVJST1JfVE9PRkVXCTIKKyNkZWZpbmUgRVJST1JfU0NSSVBUCTMKKyNkZWZpbmUgRVJST1JfTk9ORQk0CisjZGVmaW5lIEVSUk9SX09USEVSCTUKKyAgICBpbnQJCWVycm9yID0gRVJST1JfTk9ORTsKKyAgICBpbnQJCWk7CisgICAgaW50CQlsbGVuOworICAgIHVmdW5jX1QJKmZwOworICAgIGludAkJY2M7CisjZGVmaW5lIEZMRU5fRklYRUQgNDAKKyAgICBjaGFyX3UJZm5hbWVfYnVmW0ZMRU5fRklYRUQgKyAxXTsKKyAgICBjaGFyX3UJKmZuYW1lOworCisgICAgLyoKKyAgICAgKiBJbiBhIHNjcmlwdCBjaGFuZ2UgPFNJRD5uYW1lKCkgYW5kIHM6bmFtZSgpIHRvIEtfU05SIDEyM19uYW1lKCkuCisgICAgICogQ2hhbmdlIDxTTlI+MTIzX25hbWUoKSB0byBLX1NOUiAxMjNfbmFtZSgpLgorICAgICAqIFVzZSBmbmFtZV9idWZbXSB3aGVuIGl0IGZpdHMsIG90aGVyd2lzZSBhbGxvY2F0ZSBtZW1vcnkgKHNsb3cpLgorICAgICAqLworICAgIGNjID0gbmFtZVtsZW5dOworICAgIG5hbWVbbGVuXSA9IE5VTDsKKyAgICBsbGVuID0gZXZhbF9mbmFtZV9zY3JpcHQobmFtZSk7CisgICAgaWYgKGxsZW4gPiAwKQorICAgIHsKKwlmbmFtZV9idWZbMF0gPSBLX1NQRUNJQUw7CisJZm5hbWVfYnVmWzFdID0gS1NfRVhUUkE7CisJZm5hbWVfYnVmWzJdID0gKGludClLRV9TTlI7CisJaSA9IDM7CisJaWYgKGV2YWxfZm5hbWVfc2lkKG5hbWUpKQkvKiAiPFNJRD4iIG9yICJzOiIgKi8KKwl7CisJICAgIGlmIChjdXJyZW50X1NJRCA8PSAwKQorCQllcnJvciA9IEVSUk9SX1NDUklQVDsKKwkgICAgZWxzZQorCSAgICB7CisJCXNwcmludGYoKGNoYXIgKilmbmFtZV9idWYgKyAzLCAiJWxkXyIsIChsb25nKWN1cnJlbnRfU0lEKTsKKwkJaSA9IChpbnQpU1RSTEVOKGZuYW1lX2J1Zik7CisJICAgIH0KKwl9CisJaWYgKGkgKyBTVFJMRU4obmFtZSArIGxsZW4pIDwgRkxFTl9GSVhFRCkKKwl7CisJICAgIFNUUkNQWShmbmFtZV9idWYgKyBpLCBuYW1lICsgbGxlbik7CisJICAgIGZuYW1lID0gZm5hbWVfYnVmOworCX0KKwllbHNlCisJeworCSAgICBmbmFtZSA9IGFsbG9jKCh1bnNpZ25lZCkoaSArIFNUUkxFTihuYW1lICsgbGxlbikgKyAxKSk7CisJICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCQllcnJvciA9IEVSUk9SX09USEVSOworCSAgICBlbHNlCisJICAgIHsKKwkJbWNoX21lbW1vdmUoZm5hbWUsIGZuYW1lX2J1ZiwgKHNpemVfdClpKTsKKwkJU1RSQ1BZKGZuYW1lICsgaSwgbmFtZSArIGxsZW4pOworCSAgICB9CisJfQorICAgIH0KKyAgICBlbHNlCisJZm5hbWUgPSBuYW1lOworCisgICAgKmRvZXNyYW5nZSA9IEZBTFNFOworCisKKyAgICAvKiBleGVjdXRlIHRoZSBmdW5jdGlvbiBpZiBubyBlcnJvcnMgZGV0ZWN0ZWQgYW5kIGV4ZWN1dGluZyAqLworICAgIGlmIChldmFsdWF0ZSAmJiBlcnJvciA9PSBFUlJPUl9OT05FKQorICAgIHsKKwlyZXR2YXItPnZhcl90eXBlID0gVkFSX05VTUJFUjsJLyogZGVmYXVsdCBpcyBudW1iZXIgcmV0dmFyICovCisJZXJyb3IgPSBFUlJPUl9VTktOT1dOOworCisJaWYgKCFBU0NJSV9JU0xPV0VSKGZuYW1lWzBdKSkKKwl7CisJICAgIC8qCisJICAgICAqIFVzZXIgZGVmaW5lZCBmdW5jdGlvbi4KKwkgICAgICovCisJICAgIGZwID0gZmluZF9mdW5jKGZuYW1lKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgaWYgKGZwID09IE5VTEwgJiYgYXBwbHlfYXV0b2NtZHMoRVZFTlRfRlVOQ1VOREVGSU5FRCwKKwkJCQkJCSAgICBmbmFtZSwgZm5hbWUsIFRSVUUsIE5VTEwpCisjaWZkZWYgRkVBVF9FVkFMCisJCSAgICAmJiAhYWJvcnRpbmcoKQorI2VuZGlmCisJICAgICAgICkKKwkgICAgeworCQkvKiBleGVjdXRlZCBhbiBhdXRvY29tbWFuZCwgc2VhcmNoIGZvciBmdW5jdGlvbiBhZ2FpbiAqLworCQlmcCA9IGZpbmRfZnVuYyhmbmFtZSk7CisJICAgIH0KKyNlbmRpZgorCSAgICBpZiAoZnAgIT0gTlVMTCkKKwkgICAgeworCQlpZiAoZnAtPmZsYWdzICYgRkNfUkFOR0UpCisJCSAgICAqZG9lc3JhbmdlID0gVFJVRTsKKwkJaWYgKGFyZ2NvdW50IDwgZnAtPmFyZ3MuZ2FfbGVuKQorCQkgICAgZXJyb3IgPSBFUlJPUl9UT09GRVc7CisJCWVsc2UgaWYgKCFmcC0+dmFyYXJncyAmJiBhcmdjb3VudCA+IGZwLT5hcmdzLmdhX2xlbikKKwkJICAgIGVycm9yID0gRVJST1JfVE9PTUFOWTsKKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogQ2FsbCB0aGUgdXNlciBmdW5jdGlvbi4KKwkJICAgICAqIFNhdmUgYW5kIHJlc3RvcmUgc2VhcmNoIHBhdHRlcm5zLCBzY3JpcHQgdmFyaWFibGVzIGFuZAorCQkgICAgICogcmVkbyBidWZmZXIuCisJCSAgICAgKi8KKwkJICAgIHNhdmVfc2VhcmNoX3BhdHRlcm5zKCk7CisJCSAgICBzYXZlUmVkb2J1ZmYoKTsKKwkJICAgICsrZnAtPmNhbGxzOworCQkgICAgY2FsbF91c2VyX2Z1bmMoZnAsIGFyZ2NvdW50LCBhcmd2YXJzLCByZXR2YXIsCisJCQkJCQkJIGZpcnN0bGluZSwgbGFzdGxpbmUpOworCQkgICAgLS1mcC0+Y2FsbHM7CisJCSAgICByZXN0b3JlUmVkb2J1ZmYoKTsKKwkJICAgIHJlc3RvcmVfc2VhcmNoX3BhdHRlcm5zKCk7CisJCSAgICBlcnJvciA9IEVSUk9SX05PTkU7CisJCX0KKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBGaW5kIHRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSB0YWJsZSwgY2FsbCBpdHMgaW1wbGVtZW50YXRpb24uCisJICAgICAqLworCSAgICBpID0gZmluZF9pbnRlcm5hbF9mdW5jKGZuYW1lKTsKKwkgICAgaWYgKGkgPj0gMCkKKwkgICAgeworCQlpZiAoYXJnY291bnQgPCBmdW5jdGlvbnNbaV0uZl9taW5fYXJnYykKKwkJICAgIGVycm9yID0gRVJST1JfVE9PRkVXOworCQllbHNlIGlmIChhcmdjb3VudCA+IGZ1bmN0aW9uc1tpXS5mX21heF9hcmdjKQorCQkgICAgZXJyb3IgPSBFUlJPUl9UT09NQU5ZOworCQllbHNlCisJCXsKKwkJICAgIGFyZ3ZhcnNbYXJnY291bnRdLnZhcl90eXBlID0gVkFSX1VOS05PV047CisJCSAgICBmdW5jdGlvbnNbaV0uZl9mdW5jKGFyZ3ZhcnMsIHJldHZhcik7CisJCSAgICBlcnJvciA9IEVSUk9SX05PTkU7CisJCX0KKwkgICAgfQorCX0KKwkvKgorCSAqIFRoZSBmdW5jdGlvbiBjYWxsIChvciAiRnVuY1VuZGVmaW5lZCIgYXV0b2NvbW1hbmQgc2VxdWVuY2UpIG1pZ2h0CisJICogaGF2ZSBiZWVuIGFib3J0ZWQgYnkgYW4gZXJyb3IsIGFuIGludGVycnVwdCwgb3IgYW4gZXhwbGljaXRseSB0aHJvd24KKwkgKiBleGNlcHRpb24gdGhhdCBoYXMgbm90IGJlZW4gY2F1Z2h0IHNvIGZhci4gIFRoaXMgc2l0dWF0aW9uIGNhbiBiZQorCSAqIHRlc3RlZCBmb3IgYnkgY2FsbGluZyBhYm9ydGluZygpLiAgRm9yIGFuIGVycm9yIGluIGFuIGludGVybmFsCisJICogZnVuY3Rpb24gb3IgZm9yIHRoZSAiRTEzMiIgZXJyb3IgaW4gY2FsbF91c2VyX2Z1bmMoKSwgaG93ZXZlciwgdGhlCisJICogdGhyb3cgcG9pbnQgYXQgd2hpY2ggdGhlICJmb3JjZV9hYm9ydCIgZmxhZyAodGVtcG9yYXJpbHkgcmVzZXQgYnkKKwkgKiBlbXNnKCkpIGlzIG5vcm1hbGx5IHVwZGF0ZWQgaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LiBXZSBuZWVkIHRvCisJICogdXBkYXRlIHRoYXQgZmxhZyBmaXJzdCB0byBtYWtlIGFib3J0aW5nKCkgcmVsaWFibGUuCisJICovCisJdXBkYXRlX2ZvcmNlX2Fib3J0KCk7CisgICAgfQorICAgIGlmIChlcnJvciA9PSBFUlJPUl9OT05FKQorCXJldCA9IE9LOworCisgICAgLyoKKyAgICAgKiBSZXBvcnQgYW4gZXJyb3IgdW5sZXNzIHRoZSBhcmd1bWVudCBldmFsdWF0aW9uIG9yIGZ1bmN0aW9uIGNhbGwgaGFzIGJlZW4KKyAgICAgKiBjYW5jZWxsZWQgZHVlIHRvIGFuIGFib3J0aW5nIGVycm9yLCBhbiBpbnRlcnJ1cHQsIG9yIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoZXJyb3IgPCBFUlJPUl9OT05FICYmICFhYm9ydGluZygpKQorCUVNU0cyKChjaGFyX3UgKilfKGVycm9yc1tlcnJvcl0pLCBuYW1lKTsKKworICAgIG5hbWVbbGVuXSA9IGNjOworICAgIGlmIChmbmFtZSAhPSBuYW1lICYmIGZuYW1lICE9IGZuYW1lX2J1ZikKKwl2aW1fZnJlZShmbmFtZSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zCisgKi8KKworLyoKKyAqICJhcHBlbmQobG51bSwgc3RyaW5nKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2FwcGVuZChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGxvbmcJbG51bTsKKworICAgIGxudW0gPSBnZXRfdmFyX2xudW0oYXJndmFycyk7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAxOyAvKiBEZWZhdWx0OiBGYWlsZWQgKi8KKworICAgIGlmIChsbnVtID49IDAKKwkgICAgJiYgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCSAgICAmJiB1X3NhdmUobG51bSwgbG51bSArIDEpID09IE9LKQorICAgIHsKKwltbF9hcHBlbmQobG51bSwgZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pLCAoY29sbnJfVCkwLCBGQUxTRSk7CisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IGxudW0pCisJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCWFwcGVuZGVkX2xpbmVzX21hcmsobG51bSwgMUwpOworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiAiYXJnYygpIiBmdW5jdGlvbgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitmX2FyZ2MoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IEFSR0NPVU5UOworfQorCisvKgorICogImFyZ2lkeCgpIiBmdW5jdGlvbgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitmX2FyZ2lkeChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gY3Vyd2luLT53X2FyZ19pZHg7Cit9CisKKy8qCisgKiAiYXJndihucikiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9hcmd2KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaW50CQlpZHg7CisKKyAgICBpZHggPSBnZXRfdmFyX251bWJlcigmYXJndmFyc1swXSk7CisgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IEFSR0NPVU5UKQorCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUoYWxpc3RfbmFtZSgmQVJHTElTVFtpZHhdKSk7CisgICAgZWxzZQorCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKK30KKworLyoKKyAqICJicm93c2Uoc2F2ZSwgdGl0bGUsIGluaXRkaXIsIGRlZmF1bHQpIiBmdW5jdGlvbgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitmX2Jyb3dzZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfQlJPV1NFCisgICAgaW50CQlzYXZlOworICAgIGNoYXJfdQkqdGl0bGU7CisgICAgY2hhcl91CSppbml0ZGlyOworICAgIGNoYXJfdQkqZGVmbmFtZTsKKyAgICBjaGFyX3UJYnVmW05VTUJVRkxFTl07CisgICAgY2hhcl91CWJ1ZjJbTlVNQlVGTEVOXTsKKworICAgIHNhdmUgPSBnZXRfdmFyX251bWJlcigmYXJndmFyc1swXSk7CisgICAgdGl0bGUgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1sxXSk7CisgICAgaW5pdGRpciA9IGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1syXSwgYnVmKTsKKyAgICBkZWZuYW1lID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzNdLCBidWYyKTsKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0KKwkJIGRvX2Jyb3dzZShzYXZlLCB0aXRsZSwgZGVmbmFtZSwgTlVMTCwgaW5pdGRpciwgTlVMTCwgY3VyYnVmKTsKKyNlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiBGaW5kIGEgYnVmZmVyIGJ5IG51bWJlciBvciBleGFjdCBuYW1lLgorICovCisgICAgc3RhdGljIGJ1Zl9UICoKK2ZpbmRfYnVmZmVyKGF2YXIpCisgICAgVkFSCQlhdmFyOworeworICAgIGJ1Zl9UCSpidWYgPSBOVUxMOworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIGlmIChhdmFyLT52YXJfdHlwZSA9PSBWQVJfTlVNQkVSKQorCWJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKChpbnQpYXZhci0+dmFyX3ZhbC52YXJfbnVtYmVyKTsKKyAgICBlbHNlIGlmIChhdmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgIT0gTlVMTCkKKyAgICB7CisJLyogRmlyc3QgbWFrZSB0aGUgbmFtZSBpbnRvIGEgZnVsbCBwYXRoIG5hbWUgKi8KKwluYW1lID0gRnVsbE5hbWVfc2F2ZShhdmFyLT52YXJfdmFsLnZhcl9zdHJpbmcsCisjaWZkZWYgVU5JWAorCQlUUlVFCSAgICAvKiBmb3JjZSBleHBhbnNpb24sIGdldCByaWQgb2Ygc3ltYm9saWMgbGlua3MgKi8KKyNlbHNlCisJCUZBTFNFCisjZW5kaWYKKwkJKTsKKwlpZiAobmFtZSAhPSBOVUxMKQorCXsKKwkgICAgYnVmID0gYnVmbGlzdF9maW5kbmFtZShuYW1lKTsKKwkgICAgdmltX2ZyZWUobmFtZSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCisvKgorICogImJ1ZmV4aXN0cyhleHByKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2J1ZmV4aXN0cyhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKGZpbmRfYnVmZmVyKCZhcmd2YXJzWzBdKSAhPSBOVUxMKTsKK30KKworLyoKKyAqICJidWZsaXN0ZWQoZXhwcikiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9idWZsaXN0ZWQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBidWZfVAkqYnVmOworCisgICAgYnVmID0gZmluZF9idWZmZXIoJmFyZ3ZhcnNbMF0pOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKGJ1ZiAhPSBOVUxMICYmIGJ1Zi0+Yl9wX2JsKTsKK30KKworLyoKKyAqICJidWZsb2FkZWQoZXhwcikiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9idWZsb2FkZWQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBidWZfVAkqYnVmOworCisgICAgYnVmID0gZmluZF9idWZmZXIoJmFyZ3ZhcnNbMF0pOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKGJ1ZiAhPSBOVUxMICYmIGJ1Zi0+Yl9tbC5tbF9tZnAgIT0gTlVMTCk7Cit9CisKKy8qCisgKiBHZXQgYnVmZmVyIGJ5IG51bWJlciBvciBwYXR0ZXJuLgorICovCisgICAgc3RhdGljIGJ1Zl9UICoKK2dldF9idWZfdmFyKGF2YXIpCisgICAgVkFSCQlhdmFyOworeworICAgIGNoYXJfdQkqbmFtZSA9IGF2YXItPnZhcl92YWwudmFyX3N0cmluZzsKKyAgICBpbnQJCXNhdmVfbWFnaWM7CisgICAgY2hhcl91CSpzYXZlX2NwbzsKKyAgICBidWZfVAkqYnVmOworCisgICAgaWYgKGF2YXItPnZhcl90eXBlID09IFZBUl9OVU1CRVIpCisJcmV0dXJuIGJ1Zmxpc3RfZmluZG5yKChpbnQpYXZhci0+dmFyX3ZhbC52YXJfbnVtYmVyKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09IE5VTCkKKwlyZXR1cm4gY3VyYnVmOworICAgIGlmIChuYW1lWzBdID09ICckJyAmJiBuYW1lWzFdID09IE5VTCkKKwlyZXR1cm4gbGFzdGJ1ZjsKKworICAgIC8qIElnbm9yZSAnbWFnaWMnIGFuZCAnY3BvcHRpb25zJyBoZXJlIHRvIG1ha2Ugc2NyaXB0cyBwb3J0YWJsZSAqLworICAgIHNhdmVfbWFnaWMgPSBwX21hZ2ljOworICAgIHBfbWFnaWMgPSBUUlVFOworICAgIHNhdmVfY3BvID0gcF9jcG87CisgICAgcF9jcG8gPSAoY2hhcl91ICopIiI7CisKKyAgICBidWYgPSBidWZsaXN0X2ZpbmRucihidWZsaXN0X2ZpbmRwYXQobmFtZSwgbmFtZSArIFNUUkxFTihuYW1lKSwKKwkJCQkJCQkJVFJVRSwgRkFMU0UpKTsKKworICAgIHBfbWFnaWMgPSBzYXZlX21hZ2ljOworICAgIHBfY3BvID0gc2F2ZV9jcG87CisKKyAgICAvKiBJZiBub3QgZm91bmQsIHRyeSBleHBhbmRpbmcgdGhlIG5hbWUsIGxpa2UgZG9uZSBmb3IgYnVmZXhpc3RzKCkuICovCisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCWJ1ZiA9IGZpbmRfYnVmZmVyKGF2YXIpOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqICJidWZuYW1lKGV4cHIpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfYnVmbmFtZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGJ1Zl9UCSpidWY7CisKKyAgICArK2Vtc2dfb2ZmOworICAgIGJ1ZiA9IGdldF9idWZfdmFyKCZhcmd2YXJzWzBdKTsKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmLT5iX2ZuYW1lICE9IE5VTEwpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShidWYtPmJfZm5hbWUpOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisgICAgLS1lbXNnX29mZjsKK30KKworLyoKKyAqICJidWZucihleHByKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2J1Zm5yKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgICsrZW1zZ19vZmY7CisgICAgYnVmID0gZ2V0X2J1Zl92YXIoJmFyZ3ZhcnNbMF0pOworICAgIGlmIChidWYgIT0gTlVMTCkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGJ1Zi0+Yl9mbnVtOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIC0tZW1zZ19vZmY7Cit9CisKKy8qCisgKiAiYnVmd2lubnIobnIpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfYnVmd2lubnIoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl3aW5uciA9IDA7CisjZW5kaWYKKyAgICBidWZfVAkqYnVmOworCisgICAgKytlbXNnX29mZjsKKyAgICBidWYgPSBnZXRfYnVmX3ZhcigmYXJndmFyc1swXSk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cDsgd3AgPSB3cC0+d19uZXh0KQorICAgIHsKKwkrK3dpbm5yOworCWlmICh3cC0+d19idWZmZXIgPT0gYnVmKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAod3AgIT0gTlVMTCA/IHdpbm5yIDogLTEpOworI2Vsc2UKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IChjdXJ3aW4tPndfYnVmZmVyID09IGJ1ZiA/IDEgOiAtMSk7CisjZW5kaWYKKyAgICAtLWVtc2dfb2ZmOworfQorCisvKgorICogImJ5dGUybGluZShieXRlKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfYnl0ZTJsaW5lKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZuZGVmIEZFQVRfQllURU9GRgorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisjZWxzZQorICAgIGxvbmcJYm9mZiA9IDA7CisKKyAgICBib2ZmID0gZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMF0pIC0gMTsKKyAgICBpZiAoYm9mZiA8IDApCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKyAgICBlbHNlCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBtbF9maW5kX2xpbmVfb3Jfb2Zmc2V0KGN1cmJ1ZiwKKwkJCQkJCQkgIChsaW5lbnJfVCkwLCAmYm9mZik7CisjZW5kaWYKK30KKworLyoKKyAqICJjaGFyMm5yKHN0cmluZykiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9jaGFyMm5yKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPQorCQkJCSAgKCptYl9wdHIyY2hhcikoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKVswXTsKK30KKworLyoKKyAqICJjaW5kZW50KGxudW0pIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfY2luZGVudChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfQ0lOREVOVAorICAgIHBvc19UCXBvczsKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBsbnVtID0gZ2V0X3Zhcl9sbnVtKGFyZ3ZhcnMpOworICAgIGlmIChsbnVtID49IDEgJiYgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGdldF9jX2luZGVudCgpOworCWN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7Cit9CisKKy8qCisgKiAiY29sKHN0cmluZykiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9jb2woYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjb2xucl9UCWNvbCA9IDA7CisgICAgcG9zX1QJKmZwOworCisgICAgZnAgPSB2YXIyZnBvcygmYXJndmFyc1swXSwgRkFMU0UpOworICAgIGlmIChmcCAhPSBOVUxMKQorICAgIHsKKwlpZiAoZnAtPmNvbCA9PSBNQVhDT0wpCisJeworCSAgICAvKiAnPiBjYW4gYmUgTUFYQ09MLCBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgbGluZSB0aGVuICovCisJICAgIGlmIChmcC0+bG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJY29sID0gU1RSTEVOKG1sX2dldChmcC0+bG51bSkpICsgMTsKKwkgICAgZWxzZQorCQljb2wgPSBNQVhDT0w7CisJfQorCWVsc2UKKwl7CisJICAgIGNvbCA9IGZwLT5jb2wgKyAxOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgLyogY29sKCIuIikgd2hlbiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgbGluZQorCSAgICAgKiBiZWNhdXNlIG9mICJjb2xhZGQiIGNhbiBiZSBzZWVuIGFzIGFuIGV4dHJhIGNvbHVtbi4gKi8KKwkgICAgaWYgKHZpcnR1YWxfYWN0aXZlKCkgJiYgZnAgPT0gJmN1cndpbi0+d19jdXJzb3IpCisJICAgIHsKKwkJY2hhcl91CSpwID0gbWxfZ2V0X2N1cnNvcigpOworCisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+PSAoY29sbnJfVCljaGFydGFic2l6ZShwLAorCQkJCSBjdXJ3aW4tPndfdmlydGNvbCAtIGN1cndpbi0+d19jdXJzb3IuY29sYWRkKSkKKwkJeworIyBpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpbnQJCWw7CisKKwkJICAgIGlmICgqcCAhPSBOVUwgJiYgcFsobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkpXSA9PSBOVUwpCisJCQljb2wgKz0gbDsKKyMgZWxzZQorCQkgICAgaWYgKCpwICE9IE5VTCAmJiBwWzFdID09IE5VTCkKKwkJCSsrY29sOworIyBlbmRpZgorCQl9CisJICAgIH0KKyNlbmRpZgorCX0KKyAgICB9CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBjb2w7Cit9CisKKy8qCisgKiAiY29uZmlybShtZXNzYWdlLCBidXR0b25zWywgZGVmYXVsdCBbLCB0eXBlXV0pIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9jb25maXJtKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorICAgIGNoYXJfdQkqbWVzc2FnZTsKKyAgICBjaGFyX3UJKmJ1dHRvbnMgPSBOVUxMOworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJYnVmMltOVU1CVUZMRU5dOworICAgIGludAkJZGVmID0gMTsKKyAgICBpbnQJCXR5cGUgPSBWSU1fR0VORVJJQzsKKyAgICBpbnQJCWM7CisKKyAgICBtZXNzYWdlID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorICAgIHsKKwlidXR0b25zID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzFdLCBidWYpOworCWlmIChhcmd2YXJzWzJdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorCXsKKwkgICAgZGVmID0gZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMl0pOworCSAgICBpZiAoYXJndmFyc1szXS52YXJfdHlwZSAhPSBWQVJfVU5LTk9XTikKKwkgICAgeworCQkvKiBhdm9pZCB0aGF0IFRPVVBQRVJfQVNDIGNhbGxzIGdldF92YXJfc3RyaW5nX2J1ZigpIHR3aWNlICovCisJCWMgPSAqZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzNdLCBidWYyKTsKKwkJc3dpdGNoIChUT1VQUEVSX0FTQyhjKSkKKwkJeworCQkgICAgY2FzZSAnRSc6IHR5cGUgPSBWSU1fRVJST1I7IGJyZWFrOworCQkgICAgY2FzZSAnUSc6IHR5cGUgPSBWSU1fUVVFU1RJT047IGJyZWFrOworCQkgICAgY2FzZSAnSSc6IHR5cGUgPSBWSU1fSU5GTzsgYnJlYWs7CisJCSAgICBjYXNlICdXJzogdHlwZSA9IFZJTV9XQVJOSU5HOyBicmVhazsKKwkJICAgIGNhc2UgJ0cnOiB0eXBlID0gVklNX0dFTkVSSUM7IGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGJ1dHRvbnMgPT0gTlVMTCB8fCAqYnV0dG9ucyA9PSBOVUwpCisJYnV0dG9ucyA9IChjaGFyX3UgKilfKCImT2siKTsKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gZG9fZGlhbG9nKHR5cGUsIE5VTEwsIG1lc3NhZ2UsIGJ1dHRvbnMsCisJCQkJCQkJCSAgIGRlZiwgTlVMTCk7CisjZWxzZQorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyNlbmRpZgorfQorCisKKy8qCisgKiAiY3Njb3BlX2Nvbm5lY3Rpb24oW3tudW19ICwge2RicGF0aH0gWywge3ByZXBlbmR9XV0pIiBmdW5jdGlvbgorICoKKyAqIENoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGEgY3Njb3BlIGNvbm5lY3Rpb24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2NzY29wZV9jb25uZWN0aW9uKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9DU0NPUEUKKyAgICBpbnQJCW51bSA9IDA7CisgICAgY2hhcl91CSpkYnBhdGggPSBOVUxMOworICAgIGNoYXJfdQkqcHJlcGVuZCA9IE5VTEw7CisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworCisgICAgaWYgKGFyZ3ZhcnNbMF0udmFyX3R5cGUgIT0gVkFSX1VOS05PV04KKwkgICAgJiYgYXJndmFyc1sxXS52YXJfdHlwZSAhPSBWQVJfVU5LTk9XTikKKyAgICB7CisJbnVtID0gKGludClnZXRfdmFyX251bWJlcigmYXJndmFyc1swXSk7CisJZGJwYXRoID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pOworCWlmIChhcmd2YXJzWzJdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorCSAgICBwcmVwZW5kID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzJdLCBidWYpOworICAgIH0KKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gY3NfY29ubmVjdGlvbihudW0sIGRicGF0aCwgcHJlcGVuZCk7CisjZWxzZQorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyNlbmRpZgorfQorCisvKgorICogImN1cnNvcihsbnVtLCBjb2wpIiBmdW5jdGlvbgorICoKKyAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCBsaW5lIGFuZCBjb2x1bW4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfY3Vyc29yKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgbG9uZwlsaW5lLCBjb2w7CisKKyAgICBsaW5lID0gZ2V0X3Zhcl9sbnVtKGFyZ3ZhcnMpOworICAgIGlmIChsaW5lID4gMCkKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsaW5lOworICAgIGNvbCA9IGdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzFdKTsKKyAgICBpZiAoY29sID4gMCkKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbCAtIDE7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorCisgICAgLyogTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXMgaW4gYSB2YWxpZCBwb3NpdGlvbi4gKi8KKyAgICBjaGVja19jdXJzb3IoKTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogQ29ycmVjdCBjdXJzb3IgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLworICAgIGlmIChoYXNfbWJ5dGUpCisJbWJfYWRqdXN0X2N1cnNvcigpOworI2VuZGlmCit9CisKKy8qCisgKiAibGliY2FsbCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfbGliY2FsbChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGxpYmNhbGxfY29tbW9uKGFyZ3ZhcnMsIHJldHZhciwgVkFSX1NUUklORyk7Cit9CisKKy8qCisgKiAibGliY2FsbG5yKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9saWJjYWxsbnIoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaWJjYWxsX2NvbW1vbihhcmd2YXJzLCByZXR2YXIsIFZBUl9OVU1CRVIpOworfQorCisgICAgc3RhdGljIHZvaWQKK2xpYmNhbGxfY29tbW9uKGFyZ3ZhcnMsIHJldHZhciwgdHlwZSkKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7CisgICAgaW50CQl0eXBlOworeworI2lmZGVmIEZFQVRfTElCQ0FMTAorICAgIGNoYXJfdQkJKnN0cmluZ19pbjsKKyAgICBjaGFyX3UJCSoqc3RyaW5nX3Jlc3VsdDsKKyAgICBpbnQJCQlucl9yZXN1bHQ7CisjZW5kaWYKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSB0eXBlOworICAgIGlmICh0eXBlID09IFZBUl9OVU1CRVIpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisKKyAgICBpZiAoY2hlY2tfcmVzdHJpY3RlZCgpIHx8IGNoZWNrX3NlY3VyZSgpKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfTElCQ0FMTAorICAgIC8qIFRoZSBmaXJzdCB0d28gYXJncyBtdXN0IGJlIHN0cmluZ3MsIG90aGVyd2lzZSBpdHMgbWVhbmluZ2xlc3MgKi8KKyAgICBpZiAoYXJndmFyc1swXS52YXJfdHlwZSA9PSBWQVJfU1RSSU5HICYmIGFyZ3ZhcnNbMV0udmFyX3R5cGUgPT0gVkFSX1NUUklORykKKyAgICB7CisJaWYgKGFyZ3ZhcnNbMl0udmFyX3R5cGUgPT0gVkFSX05VTUJFUikKKwkgICAgc3RyaW5nX2luID0gTlVMTDsKKwllbHNlCisJICAgIHN0cmluZ19pbiA9IGFyZ3ZhcnNbMl0udmFyX3ZhbC52YXJfc3RyaW5nOworCWlmICh0eXBlID09IFZBUl9OVU1CRVIpCisJICAgIHN0cmluZ19yZXN1bHQgPSBOVUxMOworCWVsc2UKKwkgICAgc3RyaW5nX3Jlc3VsdCA9ICZyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZzsKKwlpZiAobWNoX2xpYmNhbGwoYXJndmFyc1swXS52YXJfdmFsLnZhcl9zdHJpbmcsCisJCQkgICAgIGFyZ3ZhcnNbMV0udmFyX3ZhbC52YXJfc3RyaW5nLAorCQkJICAgICBzdHJpbmdfaW4sCisJCQkgICAgIGFyZ3ZhcnNbMl0udmFyX3ZhbC52YXJfbnVtYmVyLAorCQkJICAgICBzdHJpbmdfcmVzdWx0LAorCQkJICAgICAmbnJfcmVzdWx0KSA9PSBPSworCQkmJiB0eXBlID09IFZBUl9OVU1CRVIpCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbnJfcmVzdWx0OworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogImRlbGV0ZSgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZGVsZXRlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaWYgKGNoZWNrX3Jlc3RyaWN0ZWQoKSB8fCBjaGVja19zZWN1cmUoKSkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IG1jaF9yZW1vdmUoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKK30KKworLyoKKyAqICJkaWRfZmlsZXR5cGUoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfZGlkX2ZpbGV0eXBlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBkaWRfZmlsZXR5cGU7CisjZWxzZQorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyNlbmRpZgorfQorCisvKgorICogImVzY2FwZSh7c3RyaW5nfSwge2NoYXJzfSkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9lc2NhcGUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJYnVmW05VTUJVRkxFTl07CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9CisJdmltX3N0cnNhdmVfZXNjYXBlZChnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSksCisJCWdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKSk7CisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiAiZXZlbnRoYW5kbGVyKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2V2ZW50aGFuZGxlcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gdmdldGNfYnVzeTsKK30KKworLyoKKyAqICJleGVjdXRhYmxlKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9leGVjdXRhYmxlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBtY2hfY2FuX2V4ZShnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSkpOworfQorCisvKgorICogImV4aXN0cygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZXhpc3RzKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCW4gPSBGQUxTRTsKKyAgICBpbnQJCWxlbiA9IDA7CisKKyAgICBwID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworICAgIGlmICgqcCA9PSAnJCcpCQkJLyogZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICB7CisJLyogZmlyc3QgdHJ5ICJub3JtYWwiIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZmFzdCkgKi8KKwlpZiAobWNoX2dldGVudihwICsgMSkgIT0gTlVMTCkKKwkgICAgbiA9IFRSVUU7CisJZWxzZQorCXsKKwkgICAgLyogdHJ5IGV4cGFuZGluZyB0aGluZ3MgbGlrZSAkVklNIGFuZCAke0hPTUV9ICovCisJICAgIHAgPSBleHBhbmRfZW52X3NhdmUocCk7CisJICAgIGlmIChwICE9IE5VTEwgJiYgKnAgIT0gJyQnKQorCQluID0gVFJVRTsKKwkgICAgdmltX2ZyZWUocCk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmICgqcCA9PSAnJicgfHwgKnAgPT0gJysnKQkJCS8qIG9wdGlvbiAqLworCW4gPSAoZ2V0X29wdGlvbl92YXIoJnAsIE5VTEwsIFRSVUUpID09IE9LKTsKKyAgICBlbHNlIGlmICgqcCA9PSAnKicpCQkJLyogaW50ZXJuYWwgb3IgdXNlciBkZWZpbmVkIGZ1bmN0aW9uICovCisgICAgeworCSsrcDsKKwlwID0gdHJhbnNfZnVuY3Rpb25fbmFtZSgmcCwgRkFMU0UsIFRSVUUpOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBpZiAoQVNDSUlfSVNVUFBFUigqcCkgfHwgcFswXSA9PSBLX1NQRUNJQUwpCisJCW4gPSAoZmluZF9mdW5jKHApICE9IE5VTEwpOworCSAgICBlbHNlIGlmIChBU0NJSV9JU0xPV0VSKCpwKSkKKwkJbiA9IChmaW5kX2ludGVybmFsX2Z1bmMocCkgPj0gMCk7CisJICAgIHZpbV9mcmVlKHApOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoKnAgPT0gJzonKQorICAgIHsKKwluID0gY21kX2V4aXN0cyhwICsgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCpwID09ICcjJykKKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJbmFtZSA9IHAgKyAxOworCXAgPSB2aW1fc3RyY2hyKG5hbWUsICcjJyk7CisJaWYgKHAgIT0gTlVMTCkKKwkgICAgbiA9IGF1X2V4aXN0cyhuYW1lLCBwLCBwICsgMSk7CisJZWxzZQorCSAgICBuID0gYXVfZXhpc3RzKG5hbWUsIG5hbWUgKyBTVFJMRU4obmFtZSksIE5VTEwpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UJCQkJLyogaW50ZXJuYWwgdmFyaWFibGUgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKwljaGFyX3UJKmV4cHJfc3RhcnQ7CisJY2hhcl91CSpleHByX2VuZDsKKwljaGFyX3UgICp0ZW1wX3N0cmluZyA9IE5VTEw7CisJY2hhcl91CSpzOworI2VuZGlmCisJbmFtZSA9IHA7CisKKyNpZmRlZiBGRUFUX01BR0lDX0JSQUNFUworCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgbmFtZS4gKi8KKwlzID0gZmluZF9uYW1lX2VuZChuYW1lLCAmZXhwcl9zdGFydCwgJmV4cHJfZW5kKTsKKwlpZiAoZXhwcl9zdGFydCAhPSBOVUxMKQorCXsKKwkgICAgdGVtcF9zdHJpbmcgPSBtYWtlX2V4cGFuZGVkX25hbWUobmFtZSwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIHMpOworCSAgICBpZiAodGVtcF9zdHJpbmcgIT0gTlVMTCkKKwkgICAgeworCQlsZW4gPSBTVFJMRU4odGVtcF9zdHJpbmcpOworCQluYW1lID0gdGVtcF9zdHJpbmc7CisJICAgIH0KKwl9CisjZW5kaWYKKwlpZiAobGVuID09IDApCisJICAgIGxlbiA9IGdldF9pZF9sZW4oJnApOworCWlmIChsZW4gIT0gMCkKKwkgICAgbiA9IChnZXRfdmFyX3ZhcihuYW1lLCBsZW4sIE5VTEwpID09IE9LKTsKKworI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisJdmltX2ZyZWUodGVtcF9zdHJpbmcpOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBuOworfQorCisvKgorICogImV4cGFuZCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZXhwYW5kKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworICAgIGNoYXJfdQkqZXJyb3Jtc2c7CisgICAgaW50CQlmbGFncyA9IFdJTERfU0lMRU5UfFdJTERfVVNFX05MfFdJTERfTElTVF9OT1RGT1VORDsKKyAgICBleHBhbmRfVAl4cGM7CisKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICBzID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworICAgIGlmICgqcyA9PSAnJScgfHwgKnMgPT0gJyMnIHx8ICpzID09ICc8JykKKyAgICB7CisJKytlbXNnX29mZjsKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IGV2YWxfdmFycyhzLCAmbGVuLCBOVUxMLCAmZXJyb3Jtc2csIHMpOworCS0tZW1zZ19vZmY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogV2hlbiB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIG5vbi16ZXJvLCBkb24ndCByZW1vdmUgbWF0Y2hlcworCSAqIGZvciAnc3VmZml4ZXMnIGFuZCAnd2lsZGlnbm9yZScgKi8KKwlpZiAoYXJndmFyc1sxXS52YXJfdHlwZSAhPSBWQVJfVU5LTk9XTiAmJiBnZXRfdmFyX251bWJlcigmYXJndmFyc1sxXSkpCisJICAgIGZsYWdzIHw9IFdJTERfS0VFUF9BTEw7CisJRXhwYW5kSW5pdCgmeHBjKTsKKwl4cGMueHBfY29udGV4dCA9IEVYUEFORF9GSUxFUzsKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IEV4cGFuZE9uZSgmeHBjLCBzLCBOVUxMLCBmbGFncywgV0lMRF9BTEwpOworCUV4cGFuZENsZWFudXAoJnhwYyk7CisgICAgfQorfQorCisvKgorICogImZpbGVyZWFkYWJsZSgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZmlsZXJlYWRhYmxlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgRklMRQkqZmQ7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbjsKKworICAgIHAgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgaWYgKCpwICYmICFtY2hfaXNkaXIocCkgJiYgKGZkID0gbWNoX2ZvcGVuKChjaGFyICopcCwgInIiKSkgIT0gTlVMTCkKKyAgICB7CisJbiA9IFRSVUU7CisJZmNsb3NlKGZkKTsKKyAgICB9CisgICAgZWxzZQorCW4gPSBGQUxTRTsKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbjsKK30KKworLyoKKyAqIHJldHVybiAwIGZvciBub3Qgd3JpdGFibGUsIDEgZm9yIHdyaXRhYmxlIGZpbGUsIDIgZm9yIGEgZGlyIHdoaWNoIHdlIGhhdmUKKyAqIHJpZ2h0cyB0byB3cml0ZSBpbnRvLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZmlsZXdyaXRhYmxlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJcmV0dmFsID0gMDsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorICAgIGludAkJcGVybSA9IDA7CisjZW5kaWYKKworICAgIHAgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKyAgICBwZXJtID0gbWNoX2dldHBlcm0ocCk7CisjZW5kaWYKKyNpZm5kZWYgTUFDT1NfQ0xBU1NJQyAvKiBUT0RPOiBnZXQgZWl0aGVyIG1jaF93cml0YWJsZSBvciBtY2hfYWNjZXNzICovCisgICAgaWYgKAorIyBpZmRlZiBXSU4zMjY0CisJICAgIG1jaF93cml0YWJsZShwKSAmJgorIyBlbHNlCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisJICAgIChwZXJtICYgMDIyMikgJiYKKyMgIGVuZGlmCisjIGVuZGlmCisJICAgIG1jaF9hY2Nlc3MoKGNoYXIgKilwLCBXX09LKSA9PSAwCisgICAgICAgKQorI2VuZGlmCisgICAgeworCSsrcmV0dmFsOworCWlmIChtY2hfaXNkaXIocCkpCisJICAgICsrcmV0dmFsOworICAgIH0KKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IHJldHZhbDsKK30KKworLyoKKyAqICJmbmFtZW1vZGlmeSh7Zm5hbWV9LCB7bW9kc30pIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZm5hbWVtb2RpZnkoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGNoYXJfdQkqbW9kczsKKyAgICBpbnQJCXVzZWRsZW4gPSAwOworICAgIGludAkJbGVuOworICAgIGNoYXJfdQkqZmJ1ZiA9IE5VTEw7CisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworCisgICAgZm5hbWUgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgbW9kcyA9IGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKTsKKyAgICBsZW4gPSAoaW50KVNUUkxFTihmbmFtZSk7CisKKyAgICAodm9pZCltb2RpZnlfZm5hbWUobW9kcywgJnVzZWRsZW4sICZmbmFtZSwgJmZidWYsICZsZW4pOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJuc2F2ZShmbmFtZSwgbGVuKTsKKyAgICB2aW1fZnJlZShmYnVmKTsKK30KKworLyoKKyAqICJmb2xkY2xvc2VkKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9mb2xkY2xvc2VkKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgZm9sZGNsb3NlZF9ib3RoKGFyZ3ZhcnMsIHJldHZhciwgRkFMU0UpOworfQorCisvKgorICogImZvbGRjbG9zZWRlbmQoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2ZvbGRjbG9zZWRlbmQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBmb2xkY2xvc2VkX2JvdGgoYXJndmFycywgcmV0dmFyLCBUUlVFKTsKK30KKworLyoKKyAqICJmb2xkY2xvc2VkKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZGNsb3NlZF9ib3RoKGFyZ3ZhcnMsIHJldHZhciwgZW5kKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWVuZDsKK3sKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxpbmVucl9UCWZpcnN0LCBsYXN0OworCisgICAgbG51bSA9IGdldF92YXJfbG51bShhcmd2YXJzKTsKKyAgICBpZiAobG51bSA+PSAxICYmIGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCWlmIChoYXNGb2xkaW5nV2luKGN1cndpbiwgbG51bSwgJmZpcnN0LCAmbGFzdCwgRkFMU0UsIE5VTEwpKQorCXsKKwkgICAgaWYgKGVuZCkKKwkJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAodmFybnVtYmVyX1QpbGFzdDsKKwkgICAgZWxzZQorCQlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9ICh2YXJudW1iZXJfVClmaXJzdDsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisjZW5kaWYKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworfQorCisvKgorICogImZvbGRsZXZlbCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZm9sZGxldmVsKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgbGluZW5yX1QJbG51bTsKKworICAgIGxudW0gPSBnZXRfdmFyX2xudW0oYXJndmFycyk7CisgICAgaWYgKGxudW0gPj0gMSAmJiBsbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gZm9sZExldmVsKGxudW0pOworICAgIGVsc2UKKyNlbmRpZgorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKK30KKworLyoKKyAqICJmb2xkdGV4dCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9mb2xkdGV4dChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGxpbmVucl9UCWxudW07CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqcjsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyCSp0eHQ7CisjZW5kaWYKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoKGxpbmVucl9UKXZpbXZhcnNbVlZfRk9MRFNUQVJUXS52YWwgPiAwCisJICAgICYmIChsaW5lbnJfVCl2aW12YXJzW1ZWX0ZPTERFTkRdLnZhbCA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCSAgICAmJiB2aW12YXJzW1ZWX0ZPTEREQVNIRVNdLnZhbCAhPSBOVUxMKQorICAgIHsKKwkvKiBGaW5kIGZpcnN0IG5vbi1lbXB0eSBsaW5lIGluIHRoZSBmb2xkLiAqLworCWxudW0gPSAobGluZW5yX1QpdmltdmFyc1tWVl9GT0xEU1RBUlRdLnZhbDsKKwl3aGlsZSAobG51bSA8IChsaW5lbnJfVCl2aW12YXJzW1ZWX0ZPTERFTkRdLnZhbCkKKwl7CisJICAgIGlmICghbGluZXdoaXRlKGxudW0pKQorCQlicmVhazsKKwkgICAgKytsbnVtOworCX0KKworCS8qIEZpbmQgaW50ZXJlc3RpbmcgdGV4dCBpbiB0aGlzIGxpbmUuICovCisJcyA9IHNraXB3aGl0ZShtbF9nZXQobG51bSkpOworCS8qIHNraXAgQyBjb21tZW50LXN0YXJ0ICovCisJaWYgKHNbMF0gPT0gJy8nICYmIChzWzFdID09ICcqJyB8fCBzWzFdID09ICcvJykpCisJICAgIHMgPSBza2lwd2hpdGUocyArIDIpOworCXR4dCA9IF8oIistJXMlM2xkIGxpbmVzOiAiKTsKKwlyID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4odHh0KQorCQkgICAgKyBTVFJMRU4odmltdmFyc1tWVl9GT0xEREFTSEVTXS52YWwpICAgIC8qIGZvciAlcyAqLworCQkgICAgKyAyMAkJCQkgICAgLyogZm9yICUzbGQgKi8KKwkJICAgICsgU1RSTEVOKHMpKSk7CQkJICAgIC8qIGNvbmNhdGVuYXRlZCAqLworCWlmIChyICE9IE5VTEwpCisJeworCSAgICBzcHJpbnRmKChjaGFyICopciwgdHh0LCB2aW12YXJzW1ZWX0ZPTEREQVNIRVNdLnZhbCwKKwkJICAgIChsb25nKSgobGluZW5yX1QpdmltdmFyc1tWVl9GT0xERU5EXS52YWwKKwkJCQkgICAtIChsaW5lbnJfVCl2aW12YXJzW1ZWX0ZPTERTVEFSVF0udmFsICsgMSkpOworCSAgICBsZW4gPSAoaW50KVNUUkxFTihyKTsKKwkgICAgU1RSQ0FUKHIsIHMpOworCSAgICAvKiByZW1vdmUgJ2ZvbGRtYXJrZXInIGFuZCAnY29tbWVudHN0cmluZycgKi8KKwkgICAgZm9sZHRleHRfY2xlYW51cChyICsgbGVuKTsKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSByOworCX0KKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqICJmb3JlZ3JvdW5kKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2ZvcmVncm91bmQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7CisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCk7CisjZWxzZQorIyBpZmRlZiBXSU4zMgorICAgIHdpbjMyX3NldF9mb3JlZ3JvdW5kKCk7CisjIGVuZGlmCisjZW5kaWYKK30KKworLyoKKyAqICJnZXRjaGFyKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRjaGFyKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgdmFybnVtYmVyX1QJCW47CisKKyAgICArK25vX21hcHBpbmc7CisgICAgKythbGxvd19rZXlzOworICAgIGlmIChhcmd2YXJzWzBdLnZhcl90eXBlID09IFZBUl9VTktOT1dOKQorCS8qIGdldGNoYXIoKTogYmxvY2tpbmcgd2FpdC4gKi8KKwluID0gc2FmZV92Z2V0YygpOworICAgIGVsc2UgaWYgKGdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzBdKSA9PSAxKQorCS8qIGdldGNoYXIoMSk6IG9ubHkgY2hlY2sgaWYgY2hhciBhdmFpbCAqLworCW4gPSB2cGVla2MoKTsKKyAgICBlbHNlIGlmICh2cGVla2MoKSA9PSBOVUwpCisJLyogZ2V0Y2hhcigwKSBhbmQgbm8gY2hhciBhdmFpbDogcmV0dXJuIHplcm8gKi8KKwluID0gMDsKKyAgICBlbHNlCisJLyogZ2V0Y2hhcigwKSBhbmQgY2hhciBhdmFpbDogcmV0dXJuIGNoYXIgKi8KKwluID0gc2FmZV92Z2V0YygpOworICAgIC0tbm9fbWFwcGluZzsKKyAgICAtLWFsbG93X2tleXM7CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IG47CisgICAgaWYgKElTX1NQRUNJQUwobikgfHwgbW9kX21hc2sgIT0gMCkKKyAgICB7CisJY2hhcl91CQl0ZW1wWzEwXTsgICAvKiBtb2RpZmllcjogMywgbWJ5dGUtY2hhcjogNiwgTlVMOiAxICovCisJaW50CQlpID0gMDsKKworCS8qIFR1cm4gYSBzcGVjaWFsIGtleSBpbnRvIHRocmVlIGJ5dGVzLCBwbHVzIG1vZGlmaWVyLiAqLworCWlmIChtb2RfbWFzayAhPSAwKQorCXsKKwkgICAgdGVtcFtpKytdID0gS19TUEVDSUFMOworCSAgICB0ZW1wW2krK10gPSBLU19NT0RJRklFUjsKKwkgICAgdGVtcFtpKytdID0gbW9kX21hc2s7CisJfQorCWlmIChJU19TUEVDSUFMKG4pKQorCXsKKwkgICAgdGVtcFtpKytdID0gS19TUEVDSUFMOworCSAgICB0ZW1wW2krK10gPSBLX1NFQ09ORChuKTsKKwkgICAgdGVtcFtpKytdID0gS19USElSRChuKTsKKwl9CisjaWZkZWYgRkVBVF9NQllURQorCWVsc2UgaWYgKGhhc19tYnl0ZSkKKwkgICAgaSArPSAoKm1iX2NoYXIyYnl0ZXMpKG4sIHRlbXAgKyBpKTsKKyNlbmRpZgorCWVsc2UKKwkgICAgdGVtcFtpKytdID0gbjsKKwl0ZW1wW2krK10gPSBOVUw7CisJcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZSh0ZW1wKTsKKyAgICB9Cit9CisKKy8qCisgKiAiZ2V0Y2hhcm1vZCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRjaGFybW9kKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBtb2RfbWFzazsKK30KKworLyoKKyAqICJnZXRjbWRsaW5lKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2dldGNtZGxpbmUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IGdldF9jbWRsaW5lX3N0cigpOworfQorCisvKgorICogImdldGNtZHBvcygpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRjbWRwb3MoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGdldF9jbWRsaW5lX3BvcygpICsgMTsKK30KKworLyoKKyAqICJnZXRidWZ2YXIoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2dldGJ1ZnZhcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGJ1Zl9UCSpidWY7CisgICAgYnVmX1QJKnNhdmVfY3VyYnVmOworICAgIGNoYXJfdQkqdmFybmFtZTsKKyAgICBWQVIJCXY7CisKKyAgICArK2Vtc2dfb2ZmOworICAgIGJ1ZiA9IGdldF9idWZfdmFyKCZhcmd2YXJzWzBdKTsKKyAgICB2YXJuYW1lID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworCisgICAgaWYgKGJ1ZiAhPSBOVUxMICYmIHZhcm5hbWUgIT0gTlVMTCkKKyAgICB7CisJaWYgKCp2YXJuYW1lID09ICcmJykJLyogYnVmZmVyLWxvY2FsLW9wdGlvbiAqLworCXsKKwkgICAgLyogc2V0IGN1cmJ1ZiB0byBiZSBvdXIgYnVmLCB0ZW1wb3JhcmlseSAqLworCSAgICBzYXZlX2N1cmJ1ZiA9IGN1cmJ1ZjsKKwkgICAgY3VyYnVmID0gYnVmOworCisJICAgIGdldF9vcHRpb25fdmFyKCZ2YXJuYW1lLCByZXR2YXIsIFRSVUUpOworCisJICAgIC8qIHJlc3RvcmUgcHJldmlvdXMgbm90aW9uIG9mIGN1cmJ1ZiAqLworCSAgICBjdXJidWYgPSBzYXZlX2N1cmJ1ZjsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogbG9vayB1cCB0aGUgdmFyaWFibGUgKi8KKwkgICAgdiA9IGZpbmRfdmFyX2luX2dhKCZidWYtPmJfdmFycywgdmFybmFtZSk7CisJICAgIGlmICh2ICE9IE5VTEwpCisJCWNvcHlfdmFyKHYsIHJldHZhcik7CisJfQorICAgIH0KKworICAgIC0tZW1zZ19vZmY7Cit9CisKKy8qCisgKiAiZ2V0Y3dkKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2dldGN3ZChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQljd2RbTUFYUEFUSExdOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgaWYgKG1jaF9kaXJuYW1lKGN3ZCwgTUFYUEFUSEwpID09IEZBSUwpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworICAgIGVsc2UKKyAgICB7CisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShjd2QpOworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCXNsYXNoX2FkanVzdChyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiAiZ2V0ZnNpemUoe2ZuYW1lfSkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRmc2l6ZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgc3RydWN0IHN0YXQJc3Q7CisKKyAgICBmbmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWUsICZzdCkgPj0gMCkKKyAgICB7CisJaWYgKG1jaF9pc2RpcihmbmFtZSkpCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKwllbHNlCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKHZhcm51bWJlcl9UKXN0LnN0X3NpemU7CisgICAgfQorICAgIGVsc2UKKwkgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7Cit9CisKKy8qCisgKiAiZ2V0ZnRpbWUoe2ZuYW1lfSkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRmdGltZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgc3RydWN0IHN0YXQJc3Q7CisKKyAgICBmbmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKworICAgIGlmIChtY2hfc3RhdCgoY2hhciAqKWZuYW1lLCAmc3QpID49IDApCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAodmFybnVtYmVyX1Qpc3Quc3RfbXRpbWU7CisgICAgZWxzZQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7Cit9CisKKy8qCisgKiAiZ2V0cmVnKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXRyZWcoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKnN0cnJlZ25hbWU7CisgICAgaW50CQlyZWduYW1lOworCisgICAgaWYgKGFyZ3ZhcnNbMF0udmFyX3R5cGUgIT0gVkFSX1VOS05PV04pCisJc3RycmVnbmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBlbHNlCisJc3RycmVnbmFtZSA9IHZpbXZhcnNbVlZfUkVHXS52YWw7CisgICAgcmVnbmFtZSA9IChzdHJyZWduYW1lID09IE5VTEwgPyAnIicgOiAqc3RycmVnbmFtZSk7CisgICAgaWYgKHJlZ25hbWUgPT0gMCkKKwlyZWduYW1lID0gJyInOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBnZXRfcmVnX2NvbnRlbnRzKHJlZ25hbWUsIFRSVUUpOworfQorCisvKgorICogImdldHJlZ3R5cGUoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2dldHJlZ3R5cGUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKnN0cnJlZ25hbWU7CisgICAgaW50CQlyZWduYW1lOworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOICsgMl07CisgICAgbG9uZwlyZWdsZW4gPSAwOworCisgICAgaWYgKGFyZ3ZhcnNbMF0udmFyX3R5cGUgIT0gVkFSX1VOS05PV04pCisJc3RycmVnbmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBlbHNlCisJLyogRGVmYXVsdCB0byB2OnJlZ2lzdGVyICovCisJc3RycmVnbmFtZSA9IHZpbXZhcnNbVlZfUkVHXS52YWw7CisKKyAgICByZWduYW1lID0gKHN0cnJlZ25hbWUgPT0gTlVMTCA/ICciJyA6ICpzdHJyZWduYW1lKTsKKyAgICBpZiAocmVnbmFtZSA9PSAwKQorCXJlZ25hbWUgPSAnIic7CisKKyAgICBidWZbMF0gPSBOVUw7CisgICAgYnVmWzFdID0gTlVMOworICAgIHN3aXRjaCAoZ2V0X3JlZ190eXBlKHJlZ25hbWUsICZyZWdsZW4pKQorICAgIHsKKwljYXNlIE1MSU5FOiBidWZbMF0gPSAnVic7IGJyZWFrOworCWNhc2UgTUNIQVI6IGJ1ZlswXSA9ICd2JzsgYnJlYWs7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwljYXNlIE1CTE9DSzoKKwkJYnVmWzBdID0gQ3RybF9WOworCQlzcHJpbnRmKChjaGFyICopYnVmICsgMSwgIiVsZCIsIHJlZ2xlbiArIDEpOworCQlicmVhazsKKyNlbmRpZgorICAgIH0KKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKGJ1Zik7Cit9CisKKy8qCisgKiAiZ2V0bGluZShsbnVtKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2dldGxpbmUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNoYXJfdQkqcDsKKworICAgIGxudW0gPSBnZXRfdmFyX2xudW0oYXJndmFycyk7CisKKyAgICBpZiAobG51bSA+PSAxICYmIGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJcCA9IG1sX2dldChsbnVtKTsKKyAgICBlbHNlCisJcCA9IChjaGFyX3UgKikiIjsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUocCk7Cit9CisKKy8qCisgKiAiZ2V0d2lucG9zeCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9nZXR3aW5wb3N4KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorICAgIHsKKwlpbnQJICAgIHgsIHk7CisKKwlpZiAoZ3VpX21jaF9nZXRfd2lucG9zKCZ4LCAmeSkgPT0gT0spCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0geDsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqICJnZXR3aW5wb3N5KCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2dldHdpbnBvc3koYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCWludAkgICAgeCwgeTsKKworCWlmIChndWlfbWNoX2dldF93aW5wb3MoJngsICZ5KSA9PSBPSykKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSB5OworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogImdldHdpbnZhcigpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZ2V0d2ludmFyKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgd2luX1QJKndpbiwgKm9sZGN1cndpbjsKKyAgICBjaGFyX3UJKnZhcm5hbWU7CisgICAgVkFSCQl2OworCisgICAgKytlbXNnX29mZjsKKyAgICB3aW4gPSBmaW5kX3dpbl9ieV9ucigmYXJndmFyc1swXSk7CisgICAgdmFybmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzFdKTsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKworICAgIGlmICh3aW4gIT0gTlVMTCAmJiB2YXJuYW1lICE9IE5VTEwpCisgICAgeworCWlmICgqdmFybmFtZSA9PSAnJicpCS8qIHdpbmRvdy1sb2NhbC1vcHRpb24gKi8KKwl7CisJICAgIC8qIHNldCBjdXJ3aW4gdG8gYmUgb3VyIHdpbiwgdGVtcG9yYXJpbHkgKi8KKwkgICAgb2xkY3Vyd2luID0gY3Vyd2luOworCSAgICBjdXJ3aW4gPSB3aW47CisKKwkgICAgZ2V0X29wdGlvbl92YXIoJnZhcm5hbWUsIHJldHZhciAsIDEpOworCisJICAgIC8qIHJlc3RvcmUgcHJldmlvdXMgbm90aW9uIG9mIGN1cndpbiAqLworCSAgICBjdXJ3aW4gPSBvbGRjdXJ3aW47CisJfQorCWVsc2UKKwl7CisJICAgIC8qIGxvb2sgdXAgdGhlIHZhcmlhYmxlICovCisJICAgIHYgPSBmaW5kX3Zhcl9pbl9nYSgmd2luLT53X3ZhcnMsIHZhcm5hbWUpOworCSAgICBpZiAodiAhPSBOVUxMKQorCQljb3B5X3Zhcih2LCByZXR2YXIpOworCX0KKyAgICB9CisKKyAgICAtLWVtc2dfb2ZmOworfQorCisvKgorICogImdsb2IoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2dsb2IoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBleHBhbmRfVAl4cGM7CisKKyAgICBFeHBhbmRJbml0KCZ4cGMpOworICAgIHhwYy54cF9jb250ZXh0ID0gRVhQQU5EX0ZJTEVTOworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gRXhwYW5kT25lKCZ4cGMsIGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSwKKwkJCQkgICAgIE5VTEwsIFdJTERfVVNFX05MfFdJTERfU0lMRU5ULCBXSUxEX0FMTCk7CisgICAgRXhwYW5kQ2xlYW51cCgmeHBjKTsKK30KKworLyoKKyAqICJnbG9icGF0aCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfZ2xvYnBhdGgoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJYnVmMVtOVU1CVUZMRU5dOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBnbG9icGF0aChnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSksCisJCQkJICAgICAgIGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmMSkpOworfQorCisvKgorICogImhhcygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfaGFzKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCW4gPSBGQUxTRTsKKyAgICBzdGF0aWMgY2hhcgkqKGhhc19saXN0W10pID0KKyAgICB7CisjaWZkZWYgQU1JR0EKKwkiYW1pZ2EiLAorIyBpZmRlZiBGRUFUX0FSUAorCSJhcnAiLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19CRU9TX18KKwkiYmVvcyIsCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyBpZmRlZiBESkdQUAorCSJkb3MzMiIsCisjIGVsc2UKKwkiZG9zMTYiLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgTUFDT1MgLyogVE9ETzogU2hvdWxkIHdlIGFkZCBNQUNPU19DTEFTU0lDLCBNQUNPU19YPyAoRGFueSkgKi8KKwkibWFjIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoTUFDT1NfWF9VTklYKQorCSJtYWN1bml4IiwKKyNlbmRpZgorI2lmZGVmIE9TMgorCSJvczIiLAorI2VuZGlmCisjaWZkZWYgX19RTlhfXworCSJxbngiLAorI2VuZGlmCisjaWZkZWYgUklTQ09TCisJInJpc2NvcyIsCisjZW5kaWYKKyNpZmRlZiBVTklYCisJInVuaXgiLAorI2VuZGlmCisjaWZkZWYgVk1TCisJInZtcyIsCisjZW5kaWYKKyNpZmRlZiBXSU4xNgorCSJ3aW4xNiIsCisjZW5kaWYKKyNpZmRlZiBXSU4zMgorCSJ3aW4zMiIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVOSVgpICYmIChkZWZpbmVkKF9fQ1lHV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSkKKwkid2luMzJ1bml4IiwKKyNlbmRpZgorI2lmZGVmIFdJTjY0CisJIndpbjY0IiwKKyNlbmRpZgorI2lmZGVmIEVCQ0RJQworCSJlYmNkaWMiLAorI2VuZGlmCisjaWZuZGVmIENBU0VfSU5TRU5TSVRJVkVfRklMRU5BTUUKKwkiZm5hbWVfY2FzZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0FSQUJJQworCSJhcmFiaWMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJImF1dG9jbWQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9CRVZBTAorCSJiYWxsb29uX2V2YWwiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTT01FX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisJImJ1aWx0aW5fdGVybXMiLAorIyBpZmRlZiBBTExfQlVJTFRJTl9UQ0FQUworCSJhbGxfYnVpbHRpbl90ZXJtcyIsCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0JZVEVPRkYKKwkiYnl0ZV9vZmZzZXQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DSU5ERU5UCisJImNpbmRlbnQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKKwkiY2xpZW50c2VydmVyIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisJImNsaXBib2FyZCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NNRExfQ09NUEwKKwkiY21kbGluZV9jb21wbCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NNREhJU1QKKwkiY21kbGluZV9oaXN0IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkiY29tbWVudHMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DUllQVAorCSJjcnlwdHYiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DU0NPUEUKKwkiY3Njb3BlIiwKKyNlbmRpZgorI2lmZGVmIERFQlVHCisJImRlYnVnIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ09OX0RJQUxPRworCSJkaWFsb2dfY29uIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX0RJQUxPRworCSJkaWFsb2dfZ3VpIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorCSJkaWZmIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElHUkFQSFMKKwkiZGlncmFwaHMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9ETkQKKwkiZG5kIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCSJlbWFjc190YWdzIiwKKyNlbmRpZgorCSJldmFsIiwJICAgIC8qIGFsd2F5cyBwcmVzZW50LCBvZiBjb3Vyc2UhICovCisjaWZkZWYgRkVBVF9FWF9FWFRSQQorCSJleF9leHRyYSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCSJleHRyYV9zZWFyY2giLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GS01BUAorCSJmYXJzaSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKwkiZmlsZV9pbl9wYXRoIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRklORF9JRAorCSJmaW5kX2luX3BhdGgiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJImZvbGRpbmciLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GT09URVIKKwkiZm9vdGVyIiwKKyNlbmRpZgorI2lmICFkZWZpbmVkKFVTRV9TWVNURU0pICYmIGRlZmluZWQoVU5JWCkKKwkiZm9yayIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dFVFRFWFQKKwkiZ2V0dGV4dCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorCSJndWkiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfQVRIRU5BCisjIGlmZGVmIEZFQVRfR1VJX05FWFRBVworCSJndWlfbmVYdGF3IiwKKyMgZWxzZQorCSJndWlfYXRoZW5hIiwKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX0JFT1MKKwkiZ3VpX2Jlb3MiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfR1RLCisJImd1aV9ndGsiLAorIyBpZmRlZiBIQVZFX0dUSzIKKwkiZ3VpX2d0azIiLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfTUFDCisJImd1aV9tYWMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfTU9USUYKKwkiZ3VpX21vdGlmIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1BIT1RPTgorCSJndWlfcGhvdG9uIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1cxNgorCSJndWlfd2luMTYiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfVzMyCisJImd1aV93aW4zMiIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisJImhhbmd1bF9pbnB1dCIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfSUNPTlZfSCkgJiYgZGVmaW5lZChVU0VfSUNPTlYpCisJImljb252IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCSJpbnNlcnRfZXhwYW5kIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfSlVNUExJU1QKKwkianVtcGxpc3QiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9LRVlNQVAKKwkia2V5bWFwIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTEFOR01BUAorCSJsYW5nbWFwIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElCQ0FMTAorCSJsaWJjYWxsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElORUJSRUFLCisJImxpbmVicmVhayIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJU1AKKwkibGlzcGluZGVudCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisJImxpc3RjbWRzIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkibG9jYWxtYXAiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9NRU5VCisJIm1lbnUiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJIm1rc2Vzc2lvbiIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX01PRElGWV9GTkFNRQorCSJtb2RpZnlfZm5hbWUiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9NT1VTRQorCSJtb3VzZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKwkibW91c2VzaGFwZSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorIyBpZmRlZiBGRUFUX01PVVNFX0RFQworCSJtb3VzZV9kZWMiLAorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX0dQTQorCSJtb3VzZV9ncG0iLAorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX0pTQgorCSJtb3VzZV9qc2J0ZXJtIiwKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9ORVQKKwkibW91c2VfbmV0dGVybSIsCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KKwkibW91c2VfcHRlcm0iLAorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX1hURVJNCisJIm1vdXNlX3h0ZXJtIiwKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKwkibXVsdGlfYnl0ZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFX0lNRQorCSJtdWx0aV9ieXRlX2ltZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKwkibXVsdGlfbGFuZyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX09MRQorCSJvbGUiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9PU0ZJTEVUWVBFCisJIm9zZmlsZXR5cGUiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJInBhdGhfZXh0cmEiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9QRVJMCisjaWZuZGVmIERZTkFNSUNfUEVSTAorCSJwZXJsIiwKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9QWVRIT04KKyNpZm5kZWYgRFlOQU1JQ19QWVRIT04KKwkicHl0aG9uIiwKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9QT1NUU0NSSVBUCisJInBvc3RzY3JpcHQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9QUklOVEVSCisJInByaW50ZXIiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCSJxdWlja2ZpeCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSJyaWdodGxlZnQiLAorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1JVQlkpICYmICFkZWZpbmVkKERZTkFNSUNfUlVCWSkKKwkicnVieSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwkic2Nyb2xsYmluZCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCSJzaG93Y21kIiwKKwkiY21kbGluZV9pbmZvIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0lHTlMKKwkic2lnbnMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorCSJzbWFydGluZGVudCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NOSUZGCisJInNuaWZmIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1RMX09QVAorCSJzdGF0dXNsaW5lIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1VOX1dPUktTSE9QCisJInN1bl93b3Jrc2hvcCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkibmV0YmVhbnNfaW50ZyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NZTl9ITAorCSJzeW50YXgiLAorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfU1lTVEVNKSB8fCAhZGVmaW5lZChVTklYKQorCSJzeXN0ZW0iLAorI2VuZGlmCisjaWZkZWYgRkVBVF9UQUdfQklOUworCSJ0YWdfYmluYXJ5IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEFHX09MRFNUQVRJQworCSJ0YWdfb2xkX3N0YXRpYyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RBR19BTllXSElURQorCSJ0YWdfYW55X3doaXRlIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVENMCisjIGlmbmRlZiBEWU5BTUlDX1RDTAorCSJ0Y2wiLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgVEVSTUlORk8KKwkidGVybWluZm8iLAorI2VuZGlmCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwkidGVybXJlc3BvbnNlIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEVYVE9CSgorCSJ0ZXh0b2JqZWN0cyIsCisjZW5kaWYKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwkidGdldGVudCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RJVExFCisJInRpdGxlIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVE9PTEJBUgorCSJ0b29sYmFyIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVVNSX0NNRFMKKwkidXNlci1jb21tYW5kcyIsICAgIC8qIHdhcyBhY2NpZGVudGFsbHkgaW5jbHVkZWQgaW4gNS40ICovCisJInVzZXJfY29tbWFuZHMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WSU1JTkZPCisJInZpbWluZm8iLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkidmVydHNwbGl0IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkidmlydHVhbGVkaXQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkidmlzdWFsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKwkidmlzdWFsZXh0cmEiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCSJ2cmVwbGFjZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTERJR04KKwkid2lsZGlnbm9yZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTERNRU5VCisJIndpbGRtZW51IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfV0lORE9XUworCSJ3aW5kb3dzIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfV0FLCisJIndpbmFsdGtleXMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9XUklURUJBQ0tVUAorCSJ3cml0ZWJhY2t1cCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1hJTQorCSJ4aW0iLAorI2VuZGlmCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCSJ4Zm9udHNldCIsCisjZW5kaWYKKyNpZmRlZiBVU0VfWFNNUAorCSJ4c21wIiwKKyNlbmRpZgorI2lmZGVmIFVTRV9YU01QX0lOVEVSQUNUCisJInhzbXBfaW50ZXJhY3QiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisJInh0ZXJtX2NsaXBib2FyZCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1hURVJNX1NBVkUKKwkieHRlcm1fc2F2ZSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVOSVgpICYmIGRlZmluZWQoRkVBVF9YMTEpCisJIlgxMSIsCisjZW5kaWYKKwlOVUxMCisgICAgfTsKKworICAgIG5hbWUgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgZm9yIChpID0gMDsgaGFzX2xpc3RbaV0gIT0gTlVMTDsgKytpKQorCWlmIChTVFJJQ01QKG5hbWUsIGhhc19saXN0W2ldKSA9PSAwKQorCXsKKwkgICAgbiA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKworICAgIGlmIChuID09IEZBTFNFKQorICAgIHsKKwlpZiAoU1RSTklDTVAobmFtZSwgInBhdGNoIiwgNSkgPT0gMCkKKwkgICAgbiA9IGhhc19wYXRjaChhdG9pKChjaGFyICopbmFtZSArIDUpKTsKKwllbHNlIGlmIChTVFJJQ01QKG5hbWUsICJ2aW1fc3RhcnRpbmciKSA9PSAwKQorCSAgICBuID0gKHN0YXJ0aW5nICE9IDApOworI2lmZGVmIERZTkFNSUNfVENMCisJZWxzZSBpZiAoU1RSSUNNUChuYW1lLCAidGNsIikgPT0gMCkKKwkgICAgbiA9IHRjbF9lbmFibGVkKEZBTFNFKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX0lDT05WKSAmJiBkZWZpbmVkKERZTkFNSUNfSUNPTlYpCisJZWxzZSBpZiAoU1RSSUNNUChuYW1lLCAiaWNvbnYiKSA9PSAwKQorCSAgICBuID0gaWNvbnZfZW5hYmxlZChGQUxTRSk7CisjZW5kaWYKKyNpZmRlZiBEWU5BTUlDX1JVQlkKKwllbHNlIGlmIChTVFJJQ01QKG5hbWUsICJydWJ5IikgPT0gMCkKKwkgICAgbiA9IHJ1YnlfZW5hYmxlZChGQUxTRSk7CisjZW5kaWYKKyNpZmRlZiBEWU5BTUlDX1BZVEhPTgorCWVsc2UgaWYgKFNUUklDTVAobmFtZSwgInB5dGhvbiIpID09IDApCisJICAgIG4gPSBweXRob25fZW5hYmxlZChGQUxTRSk7CisjZW5kaWYKKyNpZmRlZiBEWU5BTUlDX1BFUkwKKwllbHNlIGlmIChTVFJJQ01QKG5hbWUsICJwZXJsIikgPT0gMCkKKwkgICAgbiA9IHBlcmxfZW5hYmxlZChGQUxTRSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorCWVsc2UgaWYgKFNUUklDTVAobmFtZSwgImd1aV9ydW5uaW5nIikgPT0gMCkKKwkgICAgbiA9IChndWkuaW5fdXNlIHx8IGd1aS5zdGFydGluZyk7CisjIGlmZGVmIEZFQVRfR1VJX1czMgorCWVsc2UgaWYgKFNUUklDTVAobmFtZSwgImd1aV93aW4zMnMiKSA9PSAwKQorCSAgICBuID0gZ3VpX2lzX3dpbjMycygpOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0JST1dTRQorCWVsc2UgaWYgKFNUUklDTVAobmFtZSwgImJyb3dzZSIpID09IDApCisJICAgIG4gPSBndWkuaW5fdXNlOwkvKiBndWlfbWNoX2Jyb3dzZSgpIHdvcmtzIHdoZW4gR1VJIGlzIHJ1bm5pbmcgKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1lOX0hMCisJZWxzZSBpZiAoU1RSSUNNUChuYW1lLCAic3ludGF4X2l0ZW1zIikgPT0gMCkKKwkgICAgbiA9IHN5bnRheF9wcmVzZW50KGN1cmJ1Zik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCisJZWxzZSBpZiAoU1RSSUNNUChuYW1lLCAid2luOTUiKSA9PSAwKQorCSAgICBuID0gbWNoX3dpbmRvd3M5NSgpOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBuOworfQorCisvKgorICogImhhc21hcHRvKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9oYXNtYXB0byhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBjaGFyX3UJKm1vZGU7CisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworCisgICAgbmFtZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBpZiAoYXJndmFyc1sxXS52YXJfdHlwZSA9PSBWQVJfVU5LTk9XTikKKwltb2RlID0gKGNoYXJfdSAqKSJudm8iOworICAgIGVsc2UKKwltb2RlID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzFdLCBidWYpOworCisgICAgaWYgKG1hcF90b19leGlzdHMobmFtZSwgbW9kZSkpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBUUlVFOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IEZBTFNFOworfQorCisvKgorICogImhpc3RhZGQoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfaGlzdGFkZChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfQ01ESElTVAorICAgIGludAkJaGlzdHlwZTsKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBjaGFyX3UJYnVmW05VTUJVRkxFTl07CisjZW5kaWYKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gRkFMU0U7CisgICAgaWYgKGNoZWNrX3Jlc3RyaWN0ZWQoKSB8fCBjaGVja19zZWN1cmUoKSkKKwlyZXR1cm47CisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgaGlzdHlwZSA9IGdldF9oaXN0dHlwZShnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSkpOworICAgIGlmIChoaXN0eXBlID49IDApCisgICAgeworCXN0ciA9IGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKTsKKwlpZiAoKnN0ciAhPSBOVUwpCisJeworCSAgICBhZGRfdG9faGlzdG9yeShoaXN0eXBlLCBzdHIsIEZBTFNFLCBOVUwpOworCSAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IFRSVUU7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiAiaGlzdGRlbCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9oaXN0ZGVsKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgaW50CQluOworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlID09IFZBUl9VTktOT1dOKQorCS8qIG9ubHkgb25lIGFyZ3VtZW50OiBjbGVhciBlbnRpcmUgaGlzdG9yeSAqLworCW4gPSBjbHJfaGlzdG9yeShnZXRfaGlzdHR5cGUoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKSk7CisgICAgZWxzZSBpZiAoYXJndmFyc1sxXS52YXJfdHlwZSA9PSBWQVJfTlVNQkVSKQorCS8qIGluZGV4IGdpdmVuOiByZW1vdmUgdGhhdCBlbnRyeSAqLworCW4gPSBkZWxfaGlzdG9yeV9pZHgoZ2V0X2hpc3R0eXBlKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSksCisJCQkJCSAgICAoaW50KWdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzFdKSk7CisgICAgZWxzZQorCS8qIHN0cmluZyBnaXZlbjogcmVtb3ZlIGFsbCBtYXRjaGluZyBlbnRyaWVzICovCisJbiA9IGRlbF9oaXN0b3J5X2VudHJ5KGdldF9oaXN0dHlwZShnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSkpLAorCQkJCQlnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIGJ1ZikpOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbjsKKyNlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworI2VuZGlmCit9CisKKy8qCisgKiAiaGlzdGdldCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9oaXN0Z2V0KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgaW50CQl0eXBlOworICAgIGludAkJaWR4OworCisgICAgdHlwZSA9IGdldF9oaXN0dHlwZShnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSkpOworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlID09IFZBUl9VTktOT1dOKQorCWlkeCA9IGdldF9oaXN0b3J5X2lkeCh0eXBlKTsKKyAgICBlbHNlCisJaWR4ID0gKGludClnZXRfdmFyX251bWJlcigmYXJndmFyc1sxXSk7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShnZXRfaGlzdG9yeV9lbnRyeSh0eXBlLCBpZHgpKTsKKyNlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiAiaGlzdG5yKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2hpc3Rucihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGludAkJaTsKKworI2lmZGVmIEZFQVRfQ01ESElTVAorICAgIGkgPSBnZXRfaGlzdHR5cGUoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKKyAgICBpZiAoaSA+PSBISVNUX0NNRCAmJiBpIDwgSElTVF9DT1VOVCkKKwlpID0gZ2V0X2hpc3RvcnlfaWR4KGkpOworICAgIGVsc2UKKyNlbmRpZgorCWkgPSAtMTsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGk7Cit9CisKKy8qCisgKiAiaGlnaGxpZ2h0X2V4aXN0cygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfaGxleGlzdHMoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGhpZ2hsaWdodF9leGlzdHMoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKK30KKworLyoKKyAqICJoaWdobGlnaHRJRChuYW1lKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2hsSUQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IHN5bl9uYW1lMmlkKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSk7Cit9CisKKy8qCisgKiAiaG9zdG5hbWUoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfaG9zdG5hbWUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UgaG9zdG5hbWVbMjU2XTsKKworICAgIG1jaF9nZXRfaG9zdF9uYW1lKGhvc3RuYW1lLCAyNTYpOworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUoaG9zdG5hbWUpOworfQorCisvKgorICogaWNvbnYoKSBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9pY29udihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJYnVmMVtOVU1CVUZMRU5dOworICAgIGNoYXJfdQlidWYyW05VTUJVRkxFTl07CisgICAgY2hhcl91CSpmcm9tLCAqdG8sICpzdHI7CisgICAgdmltY29udl9UCXZpbWNvbnY7CisjZW5kaWYKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBzdHIgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgZnJvbSA9IGVuY19jYW5vbml6ZShlbmNfc2tpcChnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIGJ1ZjEpKSk7CisgICAgdG8gPSBlbmNfY2Fub25pemUoZW5jX3NraXAoZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzJdLCBidWYyKSkpOworICAgIHZpbWNvbnYudmNfdHlwZSA9IENPTlZfTk9ORTsKKyAgICBjb252ZXJ0X3NldHVwKCZ2aW1jb252LCBmcm9tLCB0byk7CisKKyAgICAvKiBJZiB0aGUgZW5jb2RpbmdzIGFyZSBlcXVhbCwgbm8gY29udmVyc2lvbiBuZWVkZWQuICovCisgICAgaWYgKHZpbWNvbnYudmNfdHlwZSA9PSBDT05WX05PTkUpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShzdHIpOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHN0cmluZ19jb252ZXJ0KCZ2aW1jb252LCBzdHIsIE5VTEwpOworCisgICAgY29udmVydF9zZXR1cCgmdmltY29udiwgTlVMTCwgTlVMTCk7CisgICAgdmltX2ZyZWUoZnJvbSk7CisgICAgdmltX2ZyZWUodG8pOworI2VuZGlmCit9CisKKy8qCisgKiAiaW5kZW50KCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9pbmRlbnQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgbG51bSA9IGdldF92YXJfbG51bShhcmd2YXJzKTsKKyAgICBpZiAobG51bSA+PSAxICYmIGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBnZXRfaW5kZW50X2xudW0obG51bSk7CisgICAgZWxzZQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRzZWNyZXRfZmxhZyA9IDA7CisKKy8qCisgKiAiaW5wdXQoKSIgZnVuY3Rpb24KKyAqICAgICBBbHNvIGhhbmRsZXMgaW5wdXRzZWNyZXQoKSB3aGVuIGlucHV0c2VjcmV0IGlzIHNldC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2lucHV0KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwcm9tcHQgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgY2hhcl91CSpwID0gTlVMTDsKKyAgICBpbnQJCWM7CisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworICAgIGludAkJY21kX3NpbGVudF9zYXZlID0gY21kX3NpbGVudDsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworCisjaWZkZWYgTk9fQ09OU09MRV9JTlBVVAorICAgIC8qIFdoaWxlIHN0YXJ0aW5nIHVwLCB0aGVyZSBpcyBubyBwbGFjZSB0byBlbnRlciB0ZXh0LiAqLworICAgIGlmIChub19jb25zb2xlX2lucHV0KCkpCisgICAgeworCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBjbWRfc2lsZW50ID0gRkFMU0U7CQkvKiBXYW50IHRvIHNlZSB0aGUgcHJvbXB0LiAqLworICAgIGlmIChwcm9tcHQgIT0gTlVMTCkKKyAgICB7CisJLyogT25seSB0aGUgcGFydCBvZiB0aGUgbWVzc2FnZSBhZnRlciB0aGUgbGFzdCBOTCBpcyBjb25zaWRlcmVkIGFzCisJICogcHJvbXB0IGZvciB0aGUgY29tbWFuZCBsaW5lICovCisJcCA9IHZpbV9zdHJyY2hyKHByb21wdCwgJ1xuJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkgICAgcCA9IHByb21wdDsKKwllbHNlCisJeworCSAgICArK3A7CisJICAgIGMgPSAqcDsKKwkgICAgKnAgPSBOVUw7CisJICAgIG1zZ19zdGFydCgpOworCSAgICBtc2dfY2xyX2VvcygpOworCSAgICBtc2dfcHV0c19hdHRyKHByb21wdCwgZWNob19hdHRyKTsKKwkgICAgbXNnX2RpZG91dCA9IEZBTFNFOworCSAgICBtc2dfc3RhcnRoZXJlKCk7CisJICAgICpwID0gYzsKKwl9CisJY21kbGluZV9yb3cgPSBtc2dfcm93OworICAgIH0KKworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorCXN0dWZmUmVhZGJ1ZmZTcGVjKGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKSk7CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9CisJCWdldGNtZGxpbmVfcHJvbXB0KGlucHV0c2VjcmV0X2ZsYWcgPyBOVUwgOiAnQCcsIHAsIGVjaG9fYXR0cik7CisKKyAgICAvKiBzaW5jZSB0aGUgdXNlciB0eXBlZCB0aGlzLCBubyBuZWVkIHRvIHdhaXQgZm9yIHJldHVybiAqLworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CisgICAgY21kX3NpbGVudCA9IGNtZF9zaWxlbnRfc2F2ZTsKK30KKworLyoKKyAqICJpbnB1dGRpYWxvZygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfaW5wdXRkaWFsb2coYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1RFWFRESUFMT0cpCisgICAgLyogVXNlIGEgR1VJIGRpYWxvZyBpZiB0aGUgR1VJIGlzIHJ1bm5pbmcgYW5kICdjJyBpcyBub3QgaW4gJ2d1aW9wdGlvbnMnICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgdmltX3N0cmNocihwX2dvLCBHT19DT05ESUFMT0cpID09IE5VTEwpCisgICAgeworCWNoYXJfdQkqbWVzc2FnZTsKKwljaGFyX3UJYnVmW05VTUJVRkxFTl07CisKKwltZXNzYWdlID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworCWlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorCXsKKwkgICAgU1RSTkNQWShJT2J1ZmYsIGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKSwgSU9TSVpFKTsKKwkgICAgSU9idWZmW0lPU0laRSAtIDFdID0gTlVMOworCX0KKwllbHNlCisJICAgIElPYnVmZlswXSA9IE5VTDsKKwlpZiAoZG9fZGlhbG9nKFZJTV9RVUVTVElPTiwgTlVMTCwgbWVzc2FnZSwgKGNoYXJfdSAqKV8oIiZPS1xuJkNhbmNlbCIpLAorCQkJCQkJCSAgICAgIDEsIElPYnVmZikgPT0gMSkKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShJT2J1ZmYpOworCWVsc2UKKwl7CisJICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOCisJCQkJCSYmIGFyZ3ZhcnNbMl0udmFyX3R5cGUgIT0gVkFSX1VOS05PV04pCisJCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUoCisJCQkJCWdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1syXSwgYnVmKSk7CisJICAgIGVsc2UKKwkJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworCX0KKwlyZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJZl9pbnB1dChhcmd2YXJzLCByZXR2YXIpOworfQorCitzdGF0aWMgZ2FycmF5X1QJICAgIGdhX3VzZXJpbnB1dCA9IHswLCAwLCBzaXplb2YodGFzYXZlX1QpLCA0LCBOVUxMfTsKKworLyoKKyAqICJpbnB1dHJlc3RvcmUoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfaW5wdXRyZXN0b3JlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaWYgKGdhX3VzZXJpbnB1dC5nYV9sZW4gPiAwKQorICAgIHsKKwktLWdhX3VzZXJpbnB1dC5nYV9sZW47CisJKytnYV91c2VyaW5wdXQuZ2Ffcm9vbTsKKwlyZXN0b3JlX3R5cGVhaGVhZCgodGFzYXZlX1QgKikoZ2FfdXNlcmlucHV0LmdhX2RhdGEpCisJCQkJCQkgICAgICAgKyBnYV91c2VyaW5wdXQuZ2FfbGVuKTsKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7IC8qIE9LICovCisgICAgfQorICAgIGVsc2UgaWYgKHBfdmVyYm9zZSA+IDEpCisgICAgeworCW1zZygoY2hhcl91ICopXygiY2FsbGVkIGlucHV0cmVzdG9yZSgpIG1vcmUgb2Z0ZW4gdGhhbiBpbnB1dHNhdmUoKSIpKTsKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDE7IC8qIEZhaWxlZCAqLworICAgIH0KK30KKworLyoKKyAqICJpbnB1dHNhdmUoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfaW5wdXRzYXZlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgLyogQWRkIGFuIGVudHJ5IHRvIHRoZSBzdGFjayBvZiB0eXBlaGVhZCBzdG9yYWdlLiAqLworICAgIGlmIChnYV9ncm93KCZnYV91c2VyaW5wdXQsIDEpID09IE9LKQorICAgIHsKKwlzYXZlX3R5cGVhaGVhZCgodGFzYXZlX1QgKikoZ2FfdXNlcmlucHV0LmdhX2RhdGEpCisJCQkJCQkgICAgICAgKyBnYV91c2VyaW5wdXQuZ2FfbGVuKTsKKwkrK2dhX3VzZXJpbnB1dC5nYV9sZW47CisJLS1nYV91c2VyaW5wdXQuZ2Ffcm9vbTsKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7IC8qIE9LICovCisgICAgfQorICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDE7IC8qIEZhaWxlZCAqLworfQorCisvKgorICogImlucHV0c2VjcmV0KCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9pbnB1dHNlY3JldChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgICsrY21kbGluZV9zdGFyOworICAgICsraW5wdXRzZWNyZXRfZmxhZzsKKyAgICBmX2lucHV0KGFyZ3ZhcnMsIHJldHZhcik7CisgICAgLS1jbWRsaW5lX3N0YXI7CisgICAgLS1pbnB1dHNlY3JldF9mbGFnOworfQorCisvKgorICogImlzZGlyZWN0b3J5KCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9pc2RpcmVjdG9yeShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbWNoX2lzZGlyKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSk7Cit9CisKKy8qCisgKiAibGFzdF9idWZmZXJfbnIoKSIgZnVuY3Rpb24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2xhc3RfYnVmZmVyX25yKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaW50CQluID0gMDsKKyAgICBidWZfVAkqYnVmOworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCWlmIChuIDwgYnVmLT5iX2ZudW0pCisJICAgIG4gPSBidWYtPmJfZm51bTsKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbjsKK30KKworLyoKKyAqICJsaW5lKHN0cmluZykiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9saW5lKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgbGluZW5yX1QJbG51bSA9IDA7CisgICAgcG9zX1QJKmZwOworCisgICAgZnAgPSB2YXIyZnBvcygmYXJndmFyc1swXSwgVFJVRSk7CisgICAgaWYgKGZwICE9IE5VTEwpCisJbG51bSA9IGZwLT5sbnVtOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbG51bTsKK30KKworLyoKKyAqICJsaW5lMmJ5dGUobG51bSkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX2xpbmUyYnl0ZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmbmRlZiBGRUFUX0JZVEVPRkYKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworI2Vsc2UKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgbG51bSA9IGdldF92YXJfbG51bShhcmd2YXJzKTsKKyAgICBpZiAobG51bSA8IDEgfHwgbG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMSkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IG1sX2ZpbmRfbGluZV9vcl9vZmZzZXQoY3VyYnVmLCBsbnVtLCBOVUxMKTsKKyAgICBpZiAocmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPj0gMCkKKwkrK3JldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyOworI2VuZGlmCit9CisKKy8qCisgKiAibGlzcGluZGVudChsbnVtKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX2xpc3BpbmRlbnQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyNpZmRlZiBGRUFUX0xJU1AKKyAgICBwb3NfVAlwb3M7CisgICAgbGluZW5yX1QJbG51bTsKKworICAgIHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgbG51bSA9IGdldF92YXJfbG51bShhcmd2YXJzKTsKKyAgICBpZiAobG51bSA+PSAxICYmIGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBnZXRfbGlzcF9pbmRlbnQoKTsKKwljdXJ3aW4tPndfY3Vyc29yID0gcG9zOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworfQorCisvKgorICogImxvY2FsdGltZSgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9sb2NhbHRpbWUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9ICh2YXJudW1iZXJfVCl0aW1lKE5VTEwpOworfQorCisvKgorICogIm1hcGFyZygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfbWFwYXJnKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgZ2V0X21hcGFyZyhhcmd2YXJzLCByZXR2YXIsIFRSVUUpOworfQorCisvKgorICogIm1hcGNoZWNrKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9tYXBjaGVjayhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGdldF9tYXBhcmcoYXJndmFycywgcmV0dmFyLCBGQUxTRSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ2V0X21hcGFyZyhhcmd2YXJzLCByZXR2YXIsIGV4YWN0KQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKKyAgICBpbnQJCWV4YWN0OworeworICAgIGNoYXJfdQkqa2V5czsKKyAgICBjaGFyX3UJKndoaWNoOworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJKmtleXNfYnVmID0gTlVMTDsKKyAgICBjaGFyX3UJKnJoczsKKyAgICBpbnQJCW1vZGU7CisgICAgZ2FycmF5X1QJZ2E7CisKKyAgICAvKiByZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBmYWlsdXJlICovCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworCisgICAga2V5cyA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBpZiAoKmtleXMgPT0gTlVMKQorCXJldHVybjsKKworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorCXdoaWNoID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzFdLCBidWYpOworICAgIGVsc2UKKwl3aGljaCA9IChjaGFyX3UgKikiIjsKKyAgICBtb2RlID0gZ2V0X21hcF9tb2RlKCZ3aGljaCwgMCk7CisKKyAgICBrZXlzID0gcmVwbGFjZV90ZXJtY29kZXMoa2V5cywgJmtleXNfYnVmLCBUUlVFLCBUUlVFKTsKKyAgICByaHMgPSBjaGVja19tYXAoa2V5cywgbW9kZSwgZXhhY3QpOworICAgIHZpbV9mcmVlKGtleXNfYnVmKTsKKyAgICBpZiAocmhzICE9IE5VTEwpCisgICAgeworCWdhX2luaXQoJmdhKTsKKwlnYS5nYV9pdGVtc2l6ZSA9IDE7CisJZ2EuZ2FfZ3Jvd3NpemUgPSA0MDsKKworCXdoaWxlICgqcmhzICE9IE5VTCkKKwkgICAgZ2FfY29uY2F0KCZnYSwgc3RyMnNwZWNpYWwoJnJocywgRkFMU0UpKTsKKworCWdhX2FwcGVuZCgmZ2EsIE5VTCk7CisJcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSAoY2hhcl91ICopZ2EuZ2FfZGF0YTsKKyAgICB9Cit9CisKKy8qCisgKiAibWF0Y2goKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX21hdGNoKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgZmluZF9zb21lX21hdGNoKGFyZ3ZhcnMsIHJldHZhciwgMSk7Cit9CisKKy8qCisgKiAibWF0Y2hlbmQoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX21hdGNoZW5kKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgZmluZF9zb21lX21hdGNoKGFyZ3ZhcnMsIHJldHZhciwgMCk7Cit9CisKKy8qCisgKiAibWF0Y2hzdHIoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX21hdGNoc3RyKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgZmluZF9zb21lX21hdGNoKGFyZ3ZhcnMsIHJldHZhciwgMik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZmluZF9zb21lX21hdGNoKGFyZ3ZhcnMsIHJldHZhciwgdHlwZSkKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7CisgICAgaW50CQl0eXBlOworeworICAgIGNoYXJfdQkqc3RyOworICAgIGNoYXJfdQkqcGF0OworICAgIHJlZ21hdGNoX1QJcmVnbWF0Y2g7CisgICAgY2hhcl91CXBhdGJ1ZltOVU1CVUZMRU5dOworICAgIGNoYXJfdQkqc2F2ZV9jcG87CisgICAgbG9uZwlzdGFydCA9IDA7CisKKyAgICAvKiBNYWtlICdjcG9wdGlvbnMnIGVtcHR5LCB0aGUgJ2wnIGZsYWcgc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUuICovCisgICAgc2F2ZV9jcG8gPSBwX2NwbzsKKyAgICBwX2NwbyA9IChjaGFyX3UgKikiIjsKKworICAgIHN0ciA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBwYXQgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIHBhdGJ1Zik7CisKKyAgICBpZiAodHlwZSA9PSAyKQorICAgIHsKKwlyZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworCisgICAgaWYgKGFyZ3ZhcnNbMl0udmFyX3R5cGUgIT0gVkFSX1VOS05PV04pCisgICAgeworCXN0YXJ0ID0gZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMl0pOworCWlmIChzdGFydCA8IDApCisJICAgIHN0YXJ0ID0gMDsKKwlpZiAoc3RhcnQgPiAobG9uZylTVFJMRU4oc3RyKSkKKwkgICAgZ290byB0aGVlbmQ7CisJc3RyICs9IHN0YXJ0OworICAgIH0KKworICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIFJFX01BR0lDICsgUkVfU1RSSU5HKTsKKyAgICBpZiAocmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMKQorICAgIHsKKwlyZWdtYXRjaC5ybV9pYyA9IHBfaWM7CisJaWYgKHZpbV9yZWdleGVjX25sKCZyZWdtYXRjaCwgc3RyLCAoY29sbnJfVCkwKSkKKwl7CisJICAgIGlmICh0eXBlID09IDIpCisJCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cm5zYXZlKHJlZ21hdGNoLnN0YXJ0cFswXSwKKwkJCQkoaW50KShyZWdtYXRjaC5lbmRwWzBdIC0gcmVnbWF0Y2guc3RhcnRwWzBdKSk7CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAodHlwZSAhPSAwKQorCQkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPQorCQkJCSAgICAgICh2YXJudW1iZXJfVCkocmVnbWF0Y2guc3RhcnRwWzBdIC0gc3RyKTsKKwkJZWxzZQorCQkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPQorCQkJCQkodmFybnVtYmVyX1QpKHJlZ21hdGNoLmVuZHBbMF0gLSBzdHIpOworCQlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciArPSBzdGFydDsKKwkgICAgfQorCX0KKwl2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKyAgICB9CisKK3RoZWVuZDoKKyAgICBwX2NwbyA9IHNhdmVfY3BvOworfQorCisvKgorICogIm1vZGUoKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZfbW9kZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQlidWZbMl07CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwlpZiAoVklzdWFsX3NlbGVjdCkKKwkgICAgYnVmWzBdID0gVklzdWFsX21vZGUgKyAncycgLSAndic7CisJZWxzZQorCSAgICBidWZbMF0gPSBWSXN1YWxfbW9kZTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IFNFVFdTSVpFKQorCWJ1ZlswXSA9ICdyJzsKKyAgICBlbHNlIGlmIChTdGF0ZSAmIElOU0VSVCkKKyAgICB7CisJaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCSAgICBidWZbMF0gPSAnUic7CisJZWxzZQorCSAgICBidWZbMF0gPSAnaSc7CisgICAgfQorICAgIGVsc2UgaWYgKFN0YXRlICYgQ01ETElORSkKKwlidWZbMF0gPSAnYyc7CisgICAgZWxzZQorCWJ1ZlswXSA9ICduJzsKKworICAgIGJ1ZlsxXSA9IE5VTDsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKGJ1Zik7CisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiAibnIyY2hhcigpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfbnIyY2hhcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorCWJ1ZlsoKm1iX2NoYXIyYnl0ZXMpKChpbnQpZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMF0pLCBidWYpXSA9IE5VTDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJYnVmWzBdID0gKGNoYXJfdSlnZXRfdmFyX251bWJlcigmYXJndmFyc1swXSk7CisJYnVmWzFdID0gTlVMOworICAgIH0KKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKGJ1Zik7Cit9CisKKy8qCisgKiAicmVuYW1lKHtmcm9tfSwge3RvfSkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9yZW5hbWUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJYnVmW05VTUJVRkxFTl07CisKKyAgICBpZiAoY2hlY2tfcmVzdHJpY3RlZCgpIHx8IGNoZWNrX3NlY3VyZSgpKQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisgICAgZWxzZQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gdmltX3JlbmFtZShnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSksCisJCQkJCWdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmKSk7Cit9CisKKy8qCisgKiAicmVzb2x2ZSgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2ZfcmVzb2x2ZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisjaWZkZWYgRkVBVF9TSE9SVENVVAorICAgIHsKKwljaGFyX3UJKnYgPSBOVUxMOworCisJdiA9IG1jaF9yZXNvbHZlX3Nob3J0Y3V0KHApOworCWlmICh2ICE9IE5VTEwpCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdjsKKwllbHNlCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUocCk7CisgICAgfQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9SRUFETElOSworICAgIHsKKwljaGFyX3UJYnVmW01BWFBBVEhMICsgMV07CisJY2hhcl91CSpjcHk7CisJaW50CWxlbjsKKwljaGFyX3UJKnJlbWFpbiA9IE5VTEw7CisJY2hhcl91CSpxOworCWludAlpc19yZWxhdGl2ZV90b19jdXJyZW50ID0gRkFMU0U7CisJaW50CWhhc190cmFpbGluZ19wYXRoc2VwID0gRkFMU0U7CisJaW50CWxpbWl0ID0gMTAwOworCisJcCA9IHZpbV9zdHJzYXZlKHApOworCisJaWYgKHBbMF0gPT0gJy4nICYmICh2aW1faXNwYXRoc2VwKHBbMV0pCisJCQkJICAgfHwgKHBbMV0gPT0gJy4nICYmICh2aW1faXNwYXRoc2VwKHBbMl0pKSkpKQorCSAgICBpc19yZWxhdGl2ZV90b19jdXJyZW50ID0gVFJVRTsKKworCWxlbiA9IFNUUkxFTihwKTsKKwlpZiAobGVuID4gMCAmJiB2aW1faXNwYXRoc2VwKHBbbGVuLTFdKSkKKwkgICAgaGFzX3RyYWlsaW5nX3BhdGhzZXAgPSBUUlVFOworCisJcSA9IGdldG5leHRjb21wKHApOworCWlmICgqcSAhPSBOVUwpCisJeworCSAgICAvKiBTZXBhcmF0ZSB0aGUgZmlyc3QgcGF0aCBjb21wb25lbnQgaW4gInAiLCBhbmQga2VlcCB0aGUKKwkgICAgICogcmVtYWluZGVyIChiZWdpbm5pbmcgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3IpLiAqLworCSAgICByZW1haW4gPSB2aW1fc3Ryc2F2ZShxIC0gMSk7CisJICAgIHFbLTFdID0gTlVMOworCX0KKworCWZvciAoOzspCisJeworCSAgICBmb3IgKDs7KQorCSAgICB7CisJCWxlbiA9IHJlYWRsaW5rKChjaGFyICopcCwgKGNoYXIgKilidWYsIE1BWFBBVEhMKTsKKwkJaWYgKGxlbiA8PSAwKQorCQkgICAgYnJlYWs7CisJCWJ1ZltsZW5dID0gTlVMOworCisJCWlmIChsaW1pdC0tID09IDApCisJCXsKKwkJICAgIHZpbV9mcmVlKHApOworCQkgICAgdmltX2ZyZWUocmVtYWluKTsKKwkJICAgIEVNU0coXygiRTY1NTogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgKGN5Y2xlPykiKSk7CisJCSAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisJCSAgICBnb3RvIGZhaWw7CisJCX0KKworCQkvKiBFbnN1cmUgdGhhdCB0aGUgcmVzdWx0IHdpbGwgaGF2ZSBhIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yCisJCSAqIGlmIHRoZSBhcmd1bWVudCBoYXMgb25lLiAqLworCQlpZiAocmVtYWluID09IE5VTEwgJiYgaGFzX3RyYWlsaW5nX3BhdGhzZXApCisJCSAgICBhZGRfcGF0aHNlcChidWYpOworCisJCS8qIFNlcGFyYXRlIHRoZSBmaXJzdCBwYXRoIGNvbXBvbmVudCBpbiB0aGUgbGluayB2YWx1ZSBhbmQKKwkJICogY29uY2F0ZW5hdGUgdGhlIHJlbWFpbmRlcnMuICovCisJCXEgPSBnZXRuZXh0Y29tcCh2aW1faXNwYXRoc2VwKCpidWYpID8gYnVmICsgMSA6IGJ1Zik7CisJCWlmICgqcSAhPSBOVUwpCisJCXsKKwkJICAgIGlmIChyZW1haW4gPT0gTlVMTCkKKwkJCXJlbWFpbiA9IHZpbV9zdHJzYXZlKHEgLSAxKTsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWNweSA9IHZpbV9zdHJuc2F2ZShxLTEsIFNUUkxFTihxLTEpK1NUUkxFTihyZW1haW4pKTsKKwkJCWlmIChjcHkgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICBTVFJDQVQoY3B5LCByZW1haW4pOworCQkJICAgIHZpbV9mcmVlKHJlbWFpbik7CisJCQkgICAgcmVtYWluID0gY3B5OworCQkJfQorCQkgICAgfQorCQkgICAgcVstMV0gPSBOVUw7CisJCX0KKworCQlxID0gZ2V0dGFpbChwKTsKKwkJaWYgKHEgPiBwICYmICpxID09IE5VTCkKKwkJeworCQkgICAgLyogSWdub3JlIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yLiAqLworCQkgICAgcVstMV0gPSBOVUw7CisJCSAgICBxID0gZ2V0dGFpbChwKTsKKwkJfQorCQlpZiAocSA+IHAgJiYgIW1jaF9pc0Z1bGxOYW1lKGJ1ZikpCisJCXsKKwkJICAgIC8qIHN5bWxpbmsgaXMgcmVsYXRpdmUgdG8gZGlyZWN0b3J5IG9mIGFyZ3VtZW50ICovCisJCSAgICBjcHkgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihwKSArIFNUUkxFTihidWYpICsgMSkpOworCQkgICAgaWYgKGNweSAhPSBOVUxMKQorCQkgICAgeworCQkJU1RSQ1BZKGNweSwgcCk7CisJCQlTVFJDUFkoZ2V0dGFpbChjcHkpLCBidWYpOworCQkJdmltX2ZyZWUocCk7CisJCQlwID0gY3B5OworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgdmltX2ZyZWUocCk7CisJCSAgICBwID0gdmltX3N0cnNhdmUoYnVmKTsKKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHJlbWFpbiA9PSBOVUxMKQorCQlicmVhazsKKworCSAgICAvKiBBcHBlbmQgdGhlIGZpcnN0IHBhdGggY29tcG9uZW50IG9mICJyZW1haW4iIHRvICJwIi4gKi8KKwkgICAgcSA9IGdldG5leHRjb21wKHJlbWFpbiArIDEpOworCSAgICBsZW4gPSBxIC0gcmVtYWluIC0gKCpxICE9IE5VTCk7CisJICAgIGNweSA9IHZpbV9zdHJuc2F2ZShwLCBTVFJMRU4ocCkgKyBsZW4pOworCSAgICBpZiAoY3B5ICE9IE5VTEwpCisJICAgIHsKKwkJU1RSTkNBVChjcHksIHJlbWFpbiwgbGVuKTsKKwkJdmltX2ZyZWUocCk7CisJCXAgPSBjcHk7CisJICAgIH0KKwkgICAgLyogU2hvcnRlbiAicmVtYWluIi4gKi8KKwkgICAgaWYgKCpxICE9IE5VTCkKKwkJU1RSQ1BZKHJlbWFpbiwgcSAtIDEpOworCSAgICBlbHNlCisJICAgIHsKKwkJdmltX2ZyZWUocmVtYWluKTsKKwkJcmVtYWluID0gTlVMTDsKKwkgICAgfQorCX0KKworCS8qIElmIHRoZSByZXN1bHQgaXMgYSByZWxhdGl2ZSBwYXRoIG5hbWUsIG1ha2UgaXQgZXhwbGljaXRseSByZWxhdGl2ZSB0bworCSAqIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaGFkIHRoaXMgZm9ybS4gKi8KKwlpZiAoIXZpbV9pc3BhdGhzZXAoKnApKQorCXsKKwkgICAgaWYgKGlzX3JlbGF0aXZlX3RvX2N1cnJlbnQKKwkJICAgICYmICpwICE9IE5VTAorCQkgICAgJiYgIShwWzBdID09ICcuJworCQkJJiYgKHBbMV0gPT0gTlVMCisJCQkgICAgfHwgdmltX2lzcGF0aHNlcChwWzFdKQorCQkJICAgIHx8IChwWzFdID09ICcuJworCQkJCSYmIChwWzJdID09IE5VTAorCQkJCSAgICB8fCB2aW1faXNwYXRoc2VwKHBbMl0pKSkpKSkKKwkgICAgeworCQkvKiBQcmVwZW5kICIuLyIuICovCisJCWNweSA9IHZpbV9zdHJuc2F2ZSgoY2hhcl91ICopIi4vIiwgMiArIFNUUkxFTihwKSk7CisJCWlmIChjcHkgIT0gTlVMTCkKKwkJeworCQkgICAgU1RSQ0FUKGNweSwgcCk7CisJCSAgICB2aW1fZnJlZShwKTsKKwkJICAgIHAgPSBjcHk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmICghaXNfcmVsYXRpdmVfdG9fY3VycmVudCkKKwkgICAgeworCQkvKiBTdHJpcCBsZWFkaW5nICIuLyIuICovCisJCXEgPSBwOworCQl3aGlsZSAocVswXSA9PSAnLicgJiYgdmltX2lzcGF0aHNlcChxWzFdKSkKKwkJICAgIHEgKz0gMjsKKwkJaWYgKHEgPiBwKQorCQkgICAgbWNoX21lbW1vdmUocCwgcCArIDIsIFNUUkxFTihwICsgMikgKyAoc2l6ZV90KTEpOworCSAgICB9CisJfQorCisJLyogRW5zdXJlIHRoYXQgdGhlIHJlc3VsdCB3aWxsIGhhdmUgbm8gdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IKKwkgKiBpZiB0aGUgYXJndW1lbnQgaGFkIG5vbmUuICBCdXQga2VlcCAiLyIgb3IgIi8vIi4gKi8KKwlpZiAoIWhhc190cmFpbGluZ19wYXRoc2VwKQorCXsKKwkgICAgcSA9IHAgKyBTVFJMRU4ocCk7CisJICAgIHdoaWxlICgocSA+IHAgKyAyIHx8IChxID09IHAgKyAyICYmICF2aW1faXNwYXRoc2VwKCpwKSkpCisJCSAgICYmIHZpbV9pc3BhdGhzZXAocVstMV0pKQorCQktLXE7CisJICAgICpxID0gTlVMOworCX0KKworCXJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gcDsKKyAgICB9CisjIGVsc2UKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKHApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICBzaW1wbGlmeV9maWxlbmFtZShyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyk7CisKKyNpZmRlZiBIQVZFX1JFQURMSU5LCitmYWlsOgorI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiAic2ltcGxpZnkoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3NpbXBsaWZ5KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgcCA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKHApOworICAgIHNpbXBsaWZ5X2ZpbGVuYW1lKHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nKTsJLyogc2ltcGxpZnkgaW4gcGxhY2UgKi8KKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKK30KKworLyoKKyAqICJzZWFyY2goKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3NlYXJjaChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqcGF0OworICAgIHBvc19UCXBvczsKKyAgICBpbnQJCXNhdmVfcF93cyA9IHBfd3M7CisgICAgaW50CQlkaXI7CisKKyAgICBwYXQgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgZGlyID0gZ2V0X3NlYXJjaF9hcmcoJmFyZ3ZhcnNbMV0sIE5VTEwpOwkvKiBtYXkgc2V0IHBfd3MgKi8KKworICAgIHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKHNlYXJjaGl0KGN1cndpbiwgY3VyYnVmLCAmcG9zLCBkaXIsIHBhdCwgMUwsCisJCQkJCSAgICAgIFNFQVJDSF9LRUVQLCBSRV9TRUFSQ0gpICE9IEZBSUwpCisgICAgeworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gcG9zLmxudW07CisJY3Vyd2luLT53X2N1cnNvciA9IHBvczsKKwkvKiAiLyQiIHdpbGwgcHV0IHRoZSBjdXJzb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbGluZSwgbWF5IG5lZWQgdG8KKwkgKiBjb3JyZWN0IHRoYXQgaGVyZSAqLworCWNoZWNrX2N1cnNvcigpOworICAgIH0KKyAgICBlbHNlCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworICAgIHBfd3MgPSBzYXZlX3Bfd3M7Cit9CisKKyNkZWZpbmUgU1BfTk9NT1ZFCTEJLyogZG9uJ3QgbW92ZSBjdXJzb3IgKi8KKyNkZWZpbmUgU1BfUkVQRUFUCTIJLyogcmVwZWF0IHRvIGZpbmQgb3V0ZXIgcGFpciAqLworI2RlZmluZSBTUF9SRVRDT1VOVAk0CS8qIHJldHVybiBtYXRjaGNvdW50ICovCisKKy8qCisgKiAic2VhcmNocGFpcigpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfc2VhcmNocGFpcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqc3BhdCwgKm1wYXQsICplcGF0OworICAgIGNoYXJfdQkqc2tpcDsKKyAgICBjaGFyX3UJKnBhdCwgKnBhdDIsICpwYXQzOworICAgIHBvc19UCXBvczsKKyAgICBwb3NfVAlmaXJzdHBvczsKKyAgICBwb3NfVAlzYXZlX2N1cnNvcjsKKyAgICBwb3NfVAlzYXZlX3BvczsKKyAgICBpbnQJCXNhdmVfcF93cyA9IHBfd3M7CisgICAgY2hhcl91CSpzYXZlX2NwbzsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCWZsYWdzID0gMDsKKyAgICBjaGFyX3UJbmJ1ZjFbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJbmJ1ZjJbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJbmJ1ZjNbTlVNQlVGTEVOXTsKKyAgICBpbnQJCW47CisgICAgaW50CQlyOworICAgIGludAkJbmVzdCA9IDE7CisgICAgaW50CQllcnI7CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7CS8qIGRlZmF1bHQ6IEZBSUwgKi8KKworICAgIC8qIE1ha2UgJ2Nwb3B0aW9ucycgZW1wdHksIHRoZSAnbCcgZmxhZyBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4gKi8KKyAgICBzYXZlX2NwbyA9IHBfY3BvOworICAgIHBfY3BvID0gKGNoYXJfdSAqKSIiOworCisgICAgLyogR2V0IHRoZSB0aHJlZSBwYXR0ZXJuIGFyZ3VtZW50czogc3RhcnQsIG1pZGRsZSwgZW5kLiAqLworICAgIHNwYXQgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgbXBhdCA9IGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgbmJ1ZjEpOworICAgIGVwYXQgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMl0sIG5idWYyKTsKKworICAgIC8qIE1ha2UgdHdvIHNlYXJjaCBwYXR0ZXJuczogc3RhcnQvZW5kIChwYXQyLCBmb3IgaW4gbmVzdGVkIHBhaXJzKSBhbmQKKyAgICAgKiBzdGFydC9taWRkbGUvZW5kIChwYXQzLCBmb3IgdGhlIHRvcCBwYWlyKS4gKi8KKyAgICBwYXQyID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oc3BhdCkgKyBTVFJMRU4oZXBhdCkgKyAxNSkpOworICAgIHBhdDMgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihzcGF0KSArIFNUUkxFTihtcGF0KSArIFNUUkxFTihlcGF0KSArIDIzKSk7CisgICAgaWYgKHBhdDIgPT0gTlVMTCB8fCBwYXQzID09IE5VTEwpCisJZ290byB0aGVlbmQ7CisgICAgc3ByaW50ZigoY2hhciAqKXBhdDIsICJcXCglc1xcbVxcKVxcfFxcKCVzXFxtXFwpIiwgc3BhdCwgZXBhdCk7CisgICAgaWYgKCptcGF0ID09IE5VTCkKKwlTVFJDUFkocGF0MywgcGF0Mik7CisgICAgZWxzZQorCXNwcmludGYoKGNoYXIgKilwYXQzLCAiXFwoJXNcXG1cXClcXHxcXCglc1xcbVxcKVxcfFxcKCVzXFxtXFwpIiwKKwkJCQkJCQkgICAgc3BhdCwgZXBhdCwgbXBhdCk7CisKKyAgICAvKiBIYW5kbGUgdGhlIG9wdGlvbmFsIGZvdXJ0aCBhcmd1bWVudDogZmxhZ3MgKi8KKyAgICBkaXIgPSBnZXRfc2VhcmNoX2FyZygmYXJndmFyc1szXSwgJmZsYWdzKTsgLyogbWF5IHNldCBwX3dzICovCisKKyAgICAvKiBPcHRpb25hbCBmaWZ0aCBhcmd1bWVudDogc2tpcCBleHByZXNpb24gKi8KKyAgICBpZiAoYXJndmFyc1szXS52YXJfdHlwZSA9PSBWQVJfVU5LTk9XTgorCSAgICB8fCBhcmd2YXJzWzRdLnZhcl90eXBlID09IFZBUl9VTktOT1dOKQorCXNraXAgPSAoY2hhcl91ICopIiI7CisgICAgZWxzZQorCXNraXAgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbNF0sIG5idWYzKTsKKworICAgIHNhdmVfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGZpcnN0cG9zLmxudW0gPSAwOworICAgIHBhdCA9IHBhdDM7CisgICAgZm9yICg7OykKKyAgICB7CisJbiA9IHNlYXJjaGl0KGN1cndpbiwgY3VyYnVmLCAmcG9zLCBkaXIsIHBhdCwgMUwsCisJCQkJCQkgICAgICBTRUFSQ0hfS0VFUCwgUkVfU0VBUkNIKTsKKwlpZiAobiA9PSBGQUlMIHx8IChmaXJzdHBvcy5sbnVtICE9IDAgJiYgZXF1YWxwb3MocG9zLCBmaXJzdHBvcykpKQorCSAgICAvKiBkaWRuJ3QgZmluZCBpdCBvciBmb3VuZCB0aGUgZmlyc3QgbWF0Y2ggYWdhaW46IEZBSUwgKi8KKwkgICAgYnJlYWs7CisKKwlpZiAoZmlyc3Rwb3MubG51bSA9PSAwKQorCSAgICBmaXJzdHBvcyA9IHBvczsKKworCS8qIElmIHRoZSBza2lwIHBhdHRlcm4gbWF0Y2hlcywgaWdub3JlIHRoaXMgbWF0Y2guICovCisJaWYgKCpza2lwICE9IE5VTCkKKwl7CisJICAgIHNhdmVfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IHBvczsKKwkgICAgciA9IGV2YWxfdG9fYm9vbChza2lwLCAmZXJyLCBOVUxMLCBGQUxTRSk7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBzYXZlX3BvczsKKwkgICAgaWYgKGVycikKKwkgICAgeworCQkvKiBFdmFsdWF0aW5nIHtza2lwfSBjYXVzZWQgYW4gZXJyb3IsIGJyZWFrIGhlcmUuICovCisJCWN1cndpbi0+d19jdXJzb3IgPSBzYXZlX2N1cnNvcjsKKwkJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHIpCisJCWNvbnRpbnVlOworCX0KKworCWlmICgoZGlyID09IEJBQ0tXQVJEICYmIG4gPT0gMykgfHwgKGRpciA9PSBGT1JXQVJEICYmIG4gPT0gMikpCisJeworCSAgICAvKiBGb3VuZCBlbmQgd2hlbiBzZWFyY2hpbmcgYmFja3dhcmRzIG9yIHN0YXJ0IHdoZW4gc2VhcmNoaW5nCisJICAgICAqIGZvcndhcmQ6IG5lc3RlZCBwYWlyLiAqLworCSAgICArK25lc3Q7CisJICAgIHBhdCA9IHBhdDI7CQkvKiBuZXN0ZWQsIGRvbid0IHNlYXJjaCBmb3IgbWlkZGxlICovCisJfQorCWVsc2UKKwl7CisJICAgIC8qIEZvdW5kIGVuZCB3aGVuIHNlYXJjaGluZyBmb3J3YXJkIG9yIHN0YXJ0IHdoZW4gc2VhcmNoaW5nCisJICAgICAqIGJhY2t3YXJkOiBlbmQgb2YgKG5lc3RlZCkgcGFpcjsgb3IgZm91bmQgbWlkZGxlIGluIG91dGVyIHBhaXIuICovCisJICAgIGlmICgtLW5lc3QgPT0gMSkKKwkJcGF0ID0gcGF0MzsJLyogb3V0ZXIgbGV2ZWwsIHNlYXJjaCBmb3IgbWlkZGxlICovCisJfQorCisJaWYgKG5lc3QgPT0gMCkKKwl7CisJICAgIC8qIEZvdW5kIHRoZSBtYXRjaDogcmV0dXJuIG1hdGNoY291bnQgb3IgbGluZSBudW1iZXIuICovCisJICAgIGlmIChmbGFncyAmIFNQX1JFVENPVU5UKQorCQkrK3JldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyOworCSAgICBlbHNlCisJCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gcG9zLmxudW07CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisJICAgIGlmICghKGZsYWdzICYgU1BfUkVQRUFUKSkKKwkJYnJlYWs7CisJICAgIG5lc3QgPSAxOwkgICAgLyogc2VhcmNoIGZvciBuZXh0IHVubWF0Y2hlZCAqLworCX0KKyAgICB9CisKKyAgICAvKiBJZiAnbicgZmxhZyBpcyB1c2VkIG9yIHNlYXJjaCBmYWlsZWQ6IHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uLiAqLworICAgIGlmICgoZmxhZ3MgJiBTUF9OT01PVkUpIHx8IHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID09IDApCisJY3Vyd2luLT53X2N1cnNvciA9IHNhdmVfY3Vyc29yOworCit0aGVlbmQ6CisgICAgdmltX2ZyZWUocGF0Mik7CisgICAgdmltX2ZyZWUocGF0Myk7CisgICAgcF93cyA9IHNhdmVfcF93czsKKyAgICBwX2NwbyA9IHNhdmVfY3BvOworfQorCisgICAgc3RhdGljIGludAorZ2V0X3NlYXJjaF9hcmcodmFycCwgZmxhZ3NwKQorICAgIFZBUgkJdmFycDsKKyAgICBpbnQJCSpmbGFnc3A7Cit7CisgICAgaW50CQlkaXIgPSBGT1JXQVJEOworICAgIGNoYXJfdQkqZmxhZ3M7CisgICAgY2hhcl91CW5idWZbTlVNQlVGTEVOXTsKKworICAgIGlmICh2YXJwLT52YXJfdHlwZSAhPSBWQVJfVU5LTk9XTikKKyAgICB7CisJZmxhZ3MgPSBnZXRfdmFyX3N0cmluZ19idWYodmFycCwgbmJ1Zik7CisJaWYgKHZpbV9zdHJjaHIoZmxhZ3MsICdiJykgIT0gTlVMTCkKKwkgICAgZGlyID0gQkFDS1dBUkQ7CisJaWYgKHZpbV9zdHJjaHIoZmxhZ3MsICd3JykgIT0gTlVMTCkKKwkgICAgcF93cyA9IFRSVUU7CisJaWYgKHZpbV9zdHJjaHIoZmxhZ3MsICdXJykgIT0gTlVMTCkKKwkgICAgcF93cyA9IEZBTFNFOworCWlmIChmbGFnc3AgIT0gTlVMTCkKKwl7CisJICAgIGlmICh2aW1fc3RyY2hyKGZsYWdzLCAnbicpICE9IE5VTEwpCisJCSpmbGFnc3AgfD0gU1BfTk9NT1ZFOworCSAgICBpZiAodmltX3N0cmNocihmbGFncywgJ3InKSAhPSBOVUxMKQorCQkqZmxhZ3NwIHw9IFNQX1JFUEVBVDsKKwkgICAgaWYgKHZpbV9zdHJjaHIoZmxhZ3MsICdtJykgIT0gTlVMTCkKKwkJKmZsYWdzcCB8PSBTUF9SRVRDT1VOVDsKKwl9CisgICAgfQorICAgIHJldHVybiBkaXI7Cit9CisKKy8qCisgKiAic2V0YnVmdmFyKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX3NldGJ1ZnZhcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGJ1Zl9UCSpidWY7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgYWNvX3NhdmVfVAlhY287CisjZWxzZQorICAgIGJ1Zl9UCSpzYXZlX2N1cmJ1ZjsKKyNlbmRpZgorICAgIGNoYXJfdQkqdmFybmFtZSwgKmJ1ZnZhcm5hbWU7CisgICAgVkFSCQl2YXJwOworICAgIGNoYXJfdQluYnVmW05VTUJVRkxFTl07CisKKyAgICBpZiAoY2hlY2tfcmVzdHJpY3RlZCgpIHx8IGNoZWNrX3NlY3VyZSgpKQorCXJldHVybjsKKyAgICArK2Vtc2dfb2ZmOworICAgIGJ1ZiA9IGdldF9idWZfdmFyKCZhcmd2YXJzWzBdKTsKKyAgICB2YXJuYW1lID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pOworICAgIHZhcnAgPSAmYXJndmFyc1syXTsKKworICAgIGlmIChidWYgIT0gTlVMTCAmJiB2YXJuYW1lICE9IE5VTEwgJiYgdmFycCAhPSBOVUxMKQorICAgIHsKKwkvKiBzZXQgY3VyYnVmIHRvIGJlIG91ciBidWYsIHRlbXBvcmFyaWx5ICovCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJYXVjbWRfcHJlcGJ1ZigmYWNvLCBidWYpOworI2Vsc2UKKwlzYXZlX2N1cmJ1ZiA9IGN1cmJ1ZjsKKwljdXJidWYgPSBidWY7CisjZW5kaWYKKworCWlmICgqdmFybmFtZSA9PSAnJicpCisJeworCSAgICArK3Zhcm5hbWU7CisJICAgIHNldF9vcHRpb25fdmFsdWUodmFybmFtZSwgZ2V0X3Zhcl9udW1iZXIodmFycCksCisJCQkJICAgZ2V0X3Zhcl9zdHJpbmdfYnVmKHZhcnAsIG5idWYpLCBPUFRfTE9DQUwpOworCX0KKwllbHNlCisJeworCSAgICBidWZ2YXJuYW1lID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTih2YXJuYW1lKSArIDMpOworCSAgICBpZiAoYnVmdmFybmFtZSAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNQWShidWZ2YXJuYW1lLCAiYjoiKTsKKwkJU1RSQ1BZKGJ1ZnZhcm5hbWUgKyAyLCB2YXJuYW1lKTsKKwkJc2V0X3ZhcihidWZ2YXJuYW1lLCB2YXJwKTsKKwkJdmltX2ZyZWUoYnVmdmFybmFtZSk7CisJICAgIH0KKwl9CisKKwkvKiByZXNldCBub3Rpb24gb2YgYnVmZmVyICovCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJYXVjbWRfcmVzdGJ1ZigmYWNvKTsKKyNlbHNlCisJY3VyYnVmID0gc2F2ZV9jdXJidWY7CisjZW5kaWYKKyAgICB9CisgICAgLS1lbXNnX29mZjsKK30KKworLyoKKyAqICJzZXRjbWRwb3MoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3NldGNtZHBvcyhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gc2V0X2NtZGxpbmVfcG9zKAorCQkJCQkoaW50KWdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzBdKSAtIDEpOworfQorCisvKgorICogInNldGxpbmUoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3NldGxpbmUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNoYXJfdQkqbGluZTsKKworICAgIGxudW0gPSBnZXRfdmFyX2xudW0oYXJndmFycyk7CisgICAgbGluZSA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzFdKTsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDE7CQkvKiBGQUlMIGlzIGRlZmF1bHQgKi8KKworICAgIGlmIChsbnVtID49IDEKKwkgICAgJiYgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCSAgICAmJiB1X3NhdmVzdWIobG51bSkgPT0gT0sKKwkgICAgJiYgbWxfcmVwbGFjZShsbnVtLCBsaW5lLCBUUlVFKSA9PSBPSykKKyAgICB7CisJY2hhbmdlZF9ieXRlcyhsbnVtLCAwKTsKKwljaGVja19jdXJzb3JfY29sKCk7CisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworICAgIH0KK30KKworLyoKKyAqICJzZXRyZWcoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3NldHJlZyhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGludAkJcmVnbmFtZTsKKyAgICBjaGFyX3UJKnN0cnJlZ25hbWU7CisgICAgY2hhcl91CSpzdHJvcHQ7CisgICAgaW50CQlhcHBlbmQ7CisgICAgY2hhcl91CXlhbmtfdHlwZTsKKyAgICBsb25nCWJsb2NrX2xlbjsKKworICAgIGJsb2NrX2xlbiA9IC0xOworICAgIHlhbmtfdHlwZSA9IE1BVVRPOworICAgIGFwcGVuZCA9IEZBTFNFOworCisgICAgc3RycmVnbmFtZSA9IGdldF92YXJfc3RyaW5nKGFyZ3ZhcnMpOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMTsJCS8qIEZBSUwgaXMgZGVmYXVsdCAqLworCisgICAgcmVnbmFtZSA9IChzdHJyZWduYW1lID09IE5VTEwgPyAnIicgOiAqc3RycmVnbmFtZSk7CisgICAgaWYgKHJlZ25hbWUgPT0gMCB8fCByZWduYW1lID09ICdAJykKKwlyZWduYW1lID0gJyInOworICAgIGVsc2UgaWYgKHJlZ25hbWUgPT0gJz0nKQorCXJldHVybjsKKworICAgIGlmIChhcmd2YXJzWzJdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorICAgIHsKKwlmb3IgKHN0cm9wdCA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzJdKTsgKnN0cm9wdCAhPSBOVUw7ICsrc3Ryb3B0KQorCSAgICBzd2l0Y2ggKCpzdHJvcHQpCisJICAgIHsKKwkJY2FzZSAnYSc6IGNhc2UgJ0EnOgkvKiBhcHBlbmQgKi8KKwkJICAgIGFwcGVuZCA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJY2FzZSAndic6IGNhc2UgJ2MnOgkvKiBjaGFyYWN0ZXItd2lzZSBzZWxlY3Rpb24gKi8KKwkJICAgIHlhbmtfdHlwZSA9IE1DSEFSOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ1YnOiBjYXNlICdsJzoJLyogbGluZS13aXNlIHNlbGVjdGlvbiAqLworCQkgICAgeWFua190eXBlID0gTUxJTkU7CisJCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQljYXNlICdiJzogY2FzZSBDdHJsX1Y6CS8qIGJsb2NrLXdpc2Ugc2VsZWN0aW9uICovCisJCSAgICB5YW5rX3R5cGUgPSBNQkxPQ0s7CisJCSAgICBpZiAoVklNX0lTRElHSVQoc3Ryb3B0WzFdKSkKKwkJICAgIHsKKwkJCSsrc3Ryb3B0OworCQkJYmxvY2tfbGVuID0gZ2V0ZGlnaXRzKCZzdHJvcHQpIC0gMTsKKwkJCS0tc3Ryb3B0OworCQkgICAgfQorCQkgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgfQorICAgIH0KKworICAgIHdyaXRlX3JlZ19jb250ZW50c19leChyZWduYW1lLCBnZXRfdmFyX3N0cmluZygmYXJndmFyc1sxXSksIC0xLAorCQkJCQkJYXBwZW5kLCB5YW5rX3R5cGUsIGJsb2NrX2xlbik7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworfQorCisKKy8qCisgKiAic2V0d2ludmFyKGV4cHIpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9zZXR3aW52YXIoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICB3aW5fVAkqd2luOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSpzYXZlX2N1cndpbjsKKyNlbmRpZgorICAgIGNoYXJfdQkqdmFybmFtZSwgKndpbnZhcm5hbWU7CisgICAgVkFSCQl2YXJwOworICAgIGNoYXJfdQluYnVmW05VTUJVRkxFTl07CisKKyAgICBpZiAoY2hlY2tfcmVzdHJpY3RlZCgpIHx8IGNoZWNrX3NlY3VyZSgpKQorCXJldHVybjsKKyAgICArK2Vtc2dfb2ZmOworICAgIHdpbiA9IGZpbmRfd2luX2J5X25yKCZhcmd2YXJzWzBdKTsKKyAgICB2YXJuYW1lID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pOworICAgIHZhcnAgPSAmYXJndmFyc1syXTsKKworICAgIGlmICh3aW4gIT0gTlVMTCAmJiB2YXJuYW1lICE9IE5VTEwgJiYgdmFycCAhPSBOVUxMKQorICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkvKiBzZXQgY3Vyd2luIHRvIGJlIG91ciB3aW4sIHRlbXBvcmFyaWx5ICovCisJc2F2ZV9jdXJ3aW4gPSBjdXJ3aW47CisJY3Vyd2luID0gd2luOworCWN1cmJ1ZiA9IGN1cndpbi0+d19idWZmZXI7CisjZW5kaWYKKworCWlmICgqdmFybmFtZSA9PSAnJicpCisJeworCSAgICArK3Zhcm5hbWU7CisJICAgIHNldF9vcHRpb25fdmFsdWUodmFybmFtZSwgZ2V0X3Zhcl9udW1iZXIodmFycCksCisJCQkJICAgZ2V0X3Zhcl9zdHJpbmdfYnVmKHZhcnAsIG5idWYpLCBPUFRfTE9DQUwpOworCX0KKwllbHNlCisJeworCSAgICB3aW52YXJuYW1lID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTih2YXJuYW1lKSArIDMpOworCSAgICBpZiAod2ludmFybmFtZSAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNQWSh3aW52YXJuYW1lLCAidzoiKTsKKwkJU1RSQ1BZKHdpbnZhcm5hbWUgKyAyLCB2YXJuYW1lKTsKKwkJc2V0X3Zhcih3aW52YXJuYW1lLCB2YXJwKTsKKwkJdmltX2ZyZWUod2ludmFybmFtZSk7CisJICAgIH0KKwl9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkvKiBSZXN0b3JlIGN1cnJlbnQgd2luZG93LCBpZiBpdCdzIHN0aWxsIHZhbGlkIChhdXRvY29tYW5kcyBjYW4gbWFrZQorCSAqIGl0IGludmFsaWQpLiAqLworCWlmICh3aW5fdmFsaWQoc2F2ZV9jdXJ3aW4pKQorCXsKKwkgICAgY3Vyd2luID0gc2F2ZV9jdXJ3aW47CisJICAgIGN1cmJ1ZiA9IGN1cndpbi0+d19idWZmZXI7CisJfQorI2VuZGlmCisgICAgfQorICAgIC0tZW1zZ19vZmY7Cit9CisKKy8qCisgKiAibmV4dG5vbmJsYW5rKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9uZXh0bm9uYmxhbmsoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgZm9yIChsbnVtID0gZ2V0X3Zhcl9sbnVtKGFyZ3ZhcnMpOyA7ICsrbG51bSkKKyAgICB7CisJaWYgKGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisJICAgIGxudW0gPSAwOworCSAgICBicmVhazsKKwl9CisJaWYgKCpza2lwd2hpdGUobWxfZ2V0KGxudW0pKSAhPSBOVUwpCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGxudW07Cit9CisKKy8qCisgKiAicHJldm5vbmJsYW5rKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9wcmV2bm9uYmxhbmsoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgbG51bSA9IGdldF92YXJfbG51bShhcmd2YXJzKTsKKyAgICBpZiAobG51bSA8IDEgfHwgbG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWxudW0gPSAwOworICAgIGVsc2UKKwl3aGlsZSAobG51bSA+PSAxICYmICpza2lwd2hpdGUobWxfZ2V0KGxudW0pKSA9PSBOVUwpCisJICAgIC0tbG51bTsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGxudW07Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKSAmJiBkZWZpbmVkKEZFQVRfWDExKQorc3RhdGljIHZvaWQgbWFrZV9jb25uZWN0aW9uIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBjaGVja19jb25uZWN0aW9uIF9fQVJHUygodm9pZCkpOworCisgICAgc3RhdGljIHZvaWQKK21ha2VfY29ubmVjdGlvbigpCit7CisgICAgaWYgKFhfRElTUExBWSA9PSBOVUxMCisjIGlmZGVmIEZFQVRfR1VJCisJICAgICYmICFndWkuaW5fdXNlCisjIGVuZGlmCisJICAgICkKKyAgICB7CisJeF9mb3JjZV9jb25uZWN0ID0gVFJVRTsKKwlzZXR1cF90ZXJtX2NsaXAoKTsKKwl4X2ZvcmNlX2Nvbm5lY3QgPSBGQUxTRTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgaW50CitjaGVja19jb25uZWN0aW9uKCkKK3sKKyAgICBtYWtlX2Nvbm5lY3Rpb24oKTsKKyAgICBpZiAoWF9ESVNQTEFZID09IE5VTEwpCisgICAgeworCUVNU0coXygiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIikpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYKKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Zfc2VydmVybGlzdChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqciA9IE5VTEw7CisKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorIyBpZmRlZiBXSU4zMgorICAgIHIgPSBzZXJ2ZXJHZXRWaW1OYW1lcygpOworIyBlbHNlCisgICAgbWFrZV9jb25uZWN0aW9uKCk7CisgICAgaWYgKFhfRElTUExBWSAhPSBOVUxMKQorCXIgPSBzZXJ2ZXJHZXRWaW1OYW1lcyhYX0RJU1BMQVkpOworIyBlbmRpZgorI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSByOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9yZW1vdGVfcGVlayhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisgICAgdmFyCQl2OworICAgIGNoYXJfdQkqcyA9IE5VTEw7CisjIGlmZGVmIFdJTjMyCisgICAgaW50CQluID0gMDsKKyMgZW5kaWYKKworICAgIGlmIChjaGVja19yZXN0cmljdGVkKCkgfHwgY2hlY2tfc2VjdXJlKCkpCisgICAgeworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisJcmV0dXJuOworICAgIH0KKyMgaWZkZWYgV0lOMzIKKyAgICBzc2NhbmYoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pLCAiJXgiLCAmbik7CisgICAgaWYgKG4gPT0gMCkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKyAgICB7CisJcyA9IHNlcnZlckdldFJlcGx5KChIV05EKW4sIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKHMgIT0gTlVMTCk7CisgICAgfQorIyBlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworICAgIGlmIChjaGVja19jb25uZWN0aW9uKCkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IHNlcnZlclBlZWtSZXBseShYX0RJU1BMQVksCisJCQkgICAgIHNlcnZlclN0clRvV2luKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSksICZzKTsKKyMgZW5kaWYKKworICAgIGlmIChhcmd2YXJzWzFdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOICYmIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID4gMCkKKyAgICB7CisJdi52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisJdi52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShzKTsKKwlzZXRfdmFyKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzFdKSwgJnYpOworICAgIH0KKyNlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKyNlbmRpZgorfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9yZW1vdGVfcmVhZChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQkqciA9IE5VTEw7CisKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorICAgIGlmICghY2hlY2tfcmVzdHJpY3RlZCgpICYmICFjaGVja19zZWN1cmUoKSkKKyAgICB7CisjIGlmZGVmIFdJTjMyCisJLyogVGhlIHNlcnZlcidzIEhXTkQgaXMgZW5jb2RlZCBpbiB0aGUgJ2lkJyBwYXJhbWV0ZXIgKi8KKwlpbnQJCW4gPSAwOworCisJc3NjYW5mKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSwgIiV4IiwgJm4pOworCWlmIChuICE9IDApCisJICAgIHIgPSBzZXJ2ZXJHZXRSZXBseSgoSFdORCluLCBGQUxTRSwgVFJVRSwgVFJVRSk7CisJaWYgKHIgPT0gTlVMTCkKKyMgZWxzZQorCWlmIChjaGVja19jb25uZWN0aW9uKCkgPT0gRkFJTCB8fCBzZXJ2ZXJSZWFkUmVwbHkoWF9ESVNQTEFZLAorCQkgIHNlcnZlclN0clRvV2luKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSksICZyLCBGQUxTRSkgPCAwKQorIyBlbmRpZgorCSAgICBFTVNHKF8oIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IikpOworICAgIH0KKyNlbmRpZgorICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gcjsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Zfc2VydmVyMmNsaWVudChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworICAgIGNoYXJfdQkqc2VydmVyID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworICAgIGNoYXJfdQkqcmVwbHkgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIGJ1Zik7CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGlmIChjaGVja19yZXN0cmljdGVkKCkgfHwgY2hlY2tfc2VjdXJlKCkpCisJcmV0dXJuOworIyBpZmRlZiBGRUFUX1gxMQorICAgIGlmIChjaGVja19jb25uZWN0aW9uKCkgPT0gRkFJTCkKKwlyZXR1cm47CisjIGVuZGlmCisKKyAgICBpZiAoc2VydmVyU2VuZFJlcGx5KHNlcnZlciwgcmVwbHkpIDwgMCkKKyAgICB7CisJRU1TRyhfKCJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiKSk7CisJcmV0dXJuOworICAgIH0KKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7CisjZWxzZQorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisjZW5kaWYKK30KKworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCitzdGF0aWMgdm9pZCByZW1vdGVfY29tbW9uIF9fQVJHUygoVkFSIGFyZ3ZhcnMsIFZBUiByZXR2YXIsIGludCBleHByKSk7CisKKyAgICBzdGF0aWMgdm9pZAorcmVtb3RlX2NvbW1vbihhcmd2YXJzLCByZXR2YXIsIGV4cHIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworICAgIGludAkJZXhwcjsKK3sKKyAgICBjaGFyX3UJKnNlcnZlcl9uYW1lOworICAgIGNoYXJfdQkqa2V5czsKKyAgICBjaGFyX3UJKnIgPSBOVUxMOworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKyMgaWZkZWYgV0lOMzIKKyAgICBIV05ECXc7CisjIGVsc2UKKyAgICBXaW5kb3cJdzsKKyMgZW5kaWYKKworICAgIGlmIChjaGVja19yZXN0cmljdGVkKCkgfHwgY2hlY2tfc2VjdXJlKCkpCisJcmV0dXJuOworCisjIGlmZGVmIEZFQVRfWDExCisgICAgaWYgKGNoZWNrX2Nvbm5lY3Rpb24oKSA9PSBGQUlMKQorCXJldHVybjsKKyMgZW5kaWYKKworICAgIHNlcnZlcl9uYW1lID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pOworICAgIGtleXMgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIGJ1Zik7CisjIGlmZGVmIFdJTjMyCisgICAgaWYgKHNlcnZlclNlbmRUb1ZpbShzZXJ2ZXJfbmFtZSwga2V5cywgJnIsICZ3LCBleHByLCBUUlVFKSA8IDApCisjIGVsc2UKKyAgICBpZiAoc2VydmVyU2VuZFRvVmltKFhfRElTUExBWSwgc2VydmVyX25hbWUsIGtleXMsICZyLCAmdywgZXhwciwgMCwgVFJVRSkKKwkJCQkJCQkJCSAgPCAwKQorIyBlbmRpZgorICAgIHsKKwlpZiAociAhPSBOVUxMKQorCSAgICBFTVNHKHIpOwkJLyogc2VuZGluZyB3b3JrZWQgYnV0IGV2YWx1YXRpb24gZmFpbGVkICovCisJZWxzZQorCSAgICBFTVNHMihfKCJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIpLCBzZXJ2ZXJfbmFtZSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gcjsKKworICAgIGlmIChhcmd2YXJzWzJdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorICAgIHsKKwl2YXIJdjsKKwljaGFyX3UJc3RyWzMwXTsKKworCXNwcmludGYoKGNoYXIgKilzdHIsICIweCV4IiwgKHVuc2lnbmVkIGludCl3KTsKKwl2LnZhcl90eXBlID0gVkFSX1NUUklORzsKKwl2LnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKHN0cik7CisJc2V0X3ZhcihnZXRfdmFyX3N0cmluZygmYXJndmFyc1syXSksICZ2KTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqICJyZW1vdGVfZXhwcigpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl9yZW1vdGVfZXhwcihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gTlVMTDsKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorICAgIHJlbW90ZV9jb21tb24oYXJndmFycywgcmV0dmFyLCBUUlVFKTsKKyNlbmRpZgorfQorCisvKgorICogInJlbW90ZV9zZW5kKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX3JlbW90ZV9zZW5kKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisgICAgcmVtb3RlX2NvbW1vbihhcmd2YXJzLCByZXR2YXIsIEZBTFNFKTsKKyNlbmRpZgorfQorCisvKgorICogInJlbW90ZV9mb3JlZ3JvdW5kKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX3JlbW90ZV9mb3JlZ3JvdW5kKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAwOworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisjIGlmZGVmIFdJTjMyCisgICAgLyogT24gV2luMzIgaXQncyBkb25lIGluIHRoaXMgYXBwbGljYXRpb24uICovCisgICAgc2VydmVyRm9yZWdyb3VuZChnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSkpOworIyBlbHNlCisgICAgLyogU2VuZCBhIGZvcmVncm91bmQoKSBleHByZXNzaW9uIHRvIHRoZSBzZXJ2ZXIuICovCisgICAgYXJndmFyc1sxXS52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgYXJndmFyc1sxXS52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopImZvcmVncm91bmQoKSIpOworICAgIGFyZ3ZhcnNbMl0udmFyX3R5cGUgPSBWQVJfVU5LTk9XTjsKKyAgICByZW1vdGVfY29tbW9uKGFyZ3ZhcnMsIHJldHZhciwgVFJVRSk7CisgICAgdmltX2ZyZWUoYXJndmFyc1sxXS52YXJfdmFsLnZhcl9zdHJpbmcpOworIyBlbmRpZgorI2VuZGlmCit9CisKKyNpZmRlZiBIQVZFX1NUUkZUSU1FCisvKgorICogInN0cmZ0aW1lKHtmb3JtYXR9Wywge3RpbWV9XSkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9zdHJmdGltZShhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQlyZXN1bHRfYnVmWzI1Nl07CisgICAgc3RydWN0IHRtCSpjdXJ0aW1lOworICAgIHRpbWVfdAlzZWNvbmRzOworICAgIGNoYXJfdQkqcDsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworCisgICAgcCA9IGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKTsKKyAgICBpZiAoYXJndmFyc1sxXS52YXJfdHlwZSA9PSBWQVJfVU5LTk9XTikKKwlzZWNvbmRzID0gdGltZShOVUxMKTsKKyAgICBlbHNlCisJc2Vjb25kcyA9ICh0aW1lX3QpZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMV0pOworICAgIGN1cnRpbWUgPSBsb2NhbHRpbWUoJnNlY29uZHMpOworICAgIC8qIE1TVkMgcmV0dXJucyBOVUxMIGZvciBhbiBpbnZhbGlkIHZhbHVlIG9mIHNlY29uZHMuICovCisgICAgaWYgKGN1cnRpbWUgPT0gTlVMTCkKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKilfKCIoSW52YWxpZCkiKSk7CisgICAgZWxzZQorICAgIHsKKyMgaWZkZWYgRkVBVF9NQllURQorCXZpbWNvbnZfVCAgIGNvbnY7CisJY2hhcl91CSAgICAqZW5jOworCisJY29udi52Y190eXBlID0gQ09OVl9OT05FOworCWVuYyA9IGVuY19sb2NhbGUoKTsKKwljb252ZXJ0X3NldHVwKCZjb252LCBwX2VuYywgZW5jKTsKKwlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgcCA9IHN0cmluZ19jb252ZXJ0KCZjb252LCBwLCBOVUxMKTsKKyMgZW5kaWYKKwlpZiAocCAhPSBOVUxMKQorCSAgICAodm9pZClzdHJmdGltZSgoY2hhciAqKXJlc3VsdF9idWYsIHNpemVvZihyZXN1bHRfYnVmKSwKKwkJCQkJCQkgIChjaGFyICopcCwgY3VydGltZSk7CisJZWxzZQorCSAgICByZXN1bHRfYnVmWzBdID0gTlVMOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKwlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgdmltX2ZyZWUocCk7CisJY29udmVydF9zZXR1cCgmY29udiwgZW5jLCBwX2VuYyk7CisJaWYgKGNvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0KKwkJCQkgICAgICBzdHJpbmdfY29udmVydCgmY29udiwgcmVzdWx0X2J1ZiwgTlVMTCk7CisJZWxzZQorIyBlbmRpZgorCSAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKHJlc3VsdF9idWYpOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkvKiBSZWxlYXNlIGNvbnZlcnNpb24gZGVzY3JpcHRvcnMgKi8KKwljb252ZXJ0X3NldHVwKCZjb252LCBOVUxMLCBOVUxMKTsKKwl2aW1fZnJlZShlbmMpOworIyBlbmRpZgorICAgIH0KK30KKyNlbmRpZgorCisvKgorICogInN0cmlkeCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfc3RyaWR4KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOworICAgIGNoYXJfdQkqbmVlZGxlOworICAgIGNoYXJfdQkqaGF5c3RhY2s7CisgICAgY2hhcl91CSpwb3M7CisKKyAgICBuZWVkbGUgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1sxXSk7CisgICAgaGF5c3RhY2sgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMF0sIGJ1Zik7CisgICAgcG9zCT0gKGNoYXJfdSAqKXN0cnN0cigoY2hhciAqKWhheXN0YWNrLCAoY2hhciAqKW5lZWRsZSk7CisKKyAgICBpZiAocG9zID09IE5VTEwpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKyAgICBlbHNlCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAodmFybnVtYmVyX1QpIChwb3MgLSBoYXlzdGFjayk7Cit9CisKKy8qCisgKiAic3RycmlkeCgpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfc3RycmlkeChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGNoYXJfdQlidWZbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJKm5lZWRsZTsKKyAgICBjaGFyX3UJKmhheXN0YWNrOworICAgIGNoYXJfdQkqcmVzdDsKKyAgICBjaGFyX3UJKmxhc3RtYXRjaCA9IE5VTEw7CisKKyAgICBuZWVkbGUgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1sxXSk7CisgICAgaGF5c3RhY2sgPSBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMF0sIGJ1Zik7CisgICAgcmVzdCA9IGhheXN0YWNrOworICAgIHdoaWxlICgqaGF5c3RhY2sgIT0gJ1wwJykKKyAgICB7CisJcmVzdCA9IChjaGFyX3UgKilzdHJzdHIoKGNoYXIgKilyZXN0LCAoY2hhciAqKW5lZWRsZSk7CisJaWYgKHJlc3QgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJbGFzdG1hdGNoID0gcmVzdCsrOworICAgIH0KKworICAgIGlmIChsYXN0bWF0Y2ggPT0gTlVMTCkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9ICh2YXJudW1iZXJfVCkgKGxhc3RtYXRjaCAtIGhheXN0YWNrKTsKK30KKworLyoKKyAqICJzdHJsZW4oKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3N0cmxlbihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gKHZhcm51bWJlcl9UKSAoU1RSTEVOKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSkpOworfQorCisvKgorICogInN0cnBhcnQoKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3N0cnBhcnQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQluOworICAgIGludAkJbGVuOworICAgIGludAkJc2xlbjsKKworICAgIHAgPSBnZXRfdmFyX3N0cmluZygmYXJndmFyc1swXSk7CisgICAgc2xlbiA9IChpbnQpU1RSTEVOKHApOworCisgICAgbiA9IGdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzFdKTsKKyAgICBpZiAoYXJndmFyc1syXS52YXJfdHlwZSAhPSBWQVJfVU5LTk9XTikKKwlsZW4gPSBnZXRfdmFyX251bWJlcigmYXJndmFyc1syXSk7CisgICAgZWxzZQorCWxlbiA9IHNsZW4gLSBuOwkgICAgLyogZGVmYXVsdCBsZW46IGFsbCBieXRlcyB0aGF0IGFyZSBhdmFpbGFibGUuICovCisKKyAgICAvKgorICAgICAqIE9ubHkgcmV0dXJuIHRoZSBvdmVybGFwIGJldHdlZW4gdGhlIHNwZWNpZmllZCBwYXJ0IGFuZCB0aGUgYWN0dWFsCisgICAgICogc3RyaW5nLgorICAgICAqLworICAgIGlmIChuIDwgMCkKKyAgICB7CisJbGVuICs9IG47CisJbiA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPiBzbGVuKQorCW4gPSBzbGVuOworICAgIGlmIChsZW4gPCAwKQorCWxlbiA9IDA7CisgICAgZWxzZSBpZiAobiArIGxlbiA+IHNsZW4pCisJbGVuID0gc2xlbiAtIG47CisKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJuc2F2ZShwICsgbiwgbGVuKTsKK30KKworLyoKKyAqICJzdHJ0cmFucygpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfc3RydHJhbnMoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHRyYW5zc3RyKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSk7Cit9CisKKy8qCisgKiAic3luSUQobGluZSwgY29sLCB0cmFucykiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX3N5bklEKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgaW50CQlpZCA9IDA7CisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICBsb25nCWxpbmU7CisgICAgbG9uZwljb2w7CisgICAgaW50CQl0cmFuczsKKworICAgIGxpbmUgPSBnZXRfdmFyX2xudW0oYXJndmFycyk7CisgICAgY29sID0gZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMV0pIC0gMTsKKyAgICB0cmFucyA9IGdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzJdKTsKKworICAgIGlmIChsaW5lID49IDEgJiYgbGluZSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCSAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCAobG9uZylTVFJMRU4obWxfZ2V0KGxpbmUpKSkKKwlpZCA9IHN5bl9nZXRfaWQobGluZSwgY29sLCB0cmFucyk7CisjZW5kaWYKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gaWQ7Cit9CisKKy8qCisgKiAic3luSURhdHRyKGlkLCB3aGF0IFssIG1vZGVdKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Zfc3luSURhdHRyKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwID0gTlVMTDsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGludAkJaWQ7CisgICAgY2hhcl91CSp3aGF0OworICAgIGNoYXJfdQkqbW9kZTsKKyAgICBjaGFyX3UJbW9kZWJ1ZltOVU1CVUZMRU5dOworICAgIGludAkJbW9kZWM7CisKKyAgICBpZCA9IGdldF92YXJfbnVtYmVyKCZhcmd2YXJzWzBdKTsKKyAgICB3aGF0ID0gZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMV0pOworICAgIGlmIChhcmd2YXJzWzJdLnZhcl90eXBlICE9IFZBUl9VTktOT1dOKQorICAgIHsKKwltb2RlID0gZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzJdLCBtb2RlYnVmKTsKKwltb2RlYyA9IFRPTE9XRVJfQVNDKG1vZGVbMF0pOworCWlmIChtb2RlYyAhPSAndCcgJiYgbW9kZWMgIT0gJ2MnCisjaWZkZWYgRkVBVF9HVUkKKwkJJiYgbW9kZWMgIT0gJ2cnCisjZW5kaWYKKwkJKQorCSAgICBtb2RlYyA9IDA7CS8qIHJlcGxhY2UgaW52YWxpZCB3aXRoIGN1cnJlbnQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSQorCWlmIChndWkuaW5fdXNlKQorCSAgICBtb2RlYyA9ICdnJzsKKwllbHNlCisjZW5kaWYKKwkgICAgaWYgKHRfY29sb3JzID4gMSkKKwkgICAgbW9kZWMgPSAnYyc7CisJZWxzZQorCSAgICBtb2RlYyA9ICd0JzsKKyAgICB9CisKKworICAgIHN3aXRjaCAoVE9MT1dFUl9BU0Mod2hhdFswXSkpCisgICAgeworCWNhc2UgJ2InOgorCQlpZiAoVE9MT1dFUl9BU0Mod2hhdFsxXSkgPT0gJ2cnKQkvKiBiZ1sjXSAqLworCQkgICAgcCA9IGhpZ2hsaWdodF9jb2xvcihpZCwgd2hhdCwgbW9kZWMpOworCQllbHNlCQkJCQkvKiBib2xkICovCisJCSAgICBwID0gaGlnaGxpZ2h0X2hhc19hdHRyKGlkLCBITF9CT0xELCBtb2RlYyk7CisJCWJyZWFrOworCisJY2FzZSAnZic6CQkJCQkvKiBmZ1sjXSAqLworCQlwID0gaGlnaGxpZ2h0X2NvbG9yKGlkLCB3aGF0LCBtb2RlYyk7CisJCWJyZWFrOworCisJY2FzZSAnaSc6CisJCWlmIChUT0xPV0VSX0FTQyh3aGF0WzFdKSA9PSAnbicpCS8qIGludmVyc2UgKi8KKwkJICAgIHAgPSBoaWdobGlnaHRfaGFzX2F0dHIoaWQsIEhMX0lOVkVSU0UsIG1vZGVjKTsKKwkJZWxzZQkJCQkJLyogaXRhbGljICovCisJCSAgICBwID0gaGlnaGxpZ2h0X2hhc19hdHRyKGlkLCBITF9JVEFMSUMsIG1vZGVjKTsKKwkJYnJlYWs7CisKKwljYXNlICduJzoJCQkJCS8qIG5hbWUgKi8KKwkJcCA9IGdldF9oaWdobGlnaHRfbmFtZShOVUxMLCBpZCAtIDEpOworCQlicmVhazsKKworCWNhc2UgJ3InOgkJCQkJLyogcmV2ZXJzZSAqLworCQlwID0gaGlnaGxpZ2h0X2hhc19hdHRyKGlkLCBITF9JTlZFUlNFLCBtb2RlYyk7CisJCWJyZWFrOworCisJY2FzZSAncyc6CQkJCQkvKiBzdGFuZG91dCAqLworCQlwID0gaGlnaGxpZ2h0X2hhc19hdHRyKGlkLCBITF9TVEFORE9VVCwgbW9kZWMpOworCQlicmVhazsKKworCWNhc2UgJ3UnOgkJCQkJLyogdW5kZXJsaW5lICovCisJCXAgPSBoaWdobGlnaHRfaGFzX2F0dHIoaWQsIEhMX1VOREVSTElORSwgbW9kZWMpOworCQlicmVhazsKKyAgICB9CisKKyAgICBpZiAocCAhPSBOVUxMKQorCXAgPSB2aW1fc3Ryc2F2ZShwKTsKKyNlbmRpZgorICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gcDsKK30KKworLyoKKyAqICJzeW5JRHRyYW5zKGlkKSIgZnVuY3Rpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Zfc3luSUR0cmFucyhhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGludAkJaWQ7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGlkID0gZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMF0pOworCisgICAgaWYgKGlkID4gMCkKKwlpZCA9IHN5bl9nZXRfZmluYWxfaWQoaWQpOworICAgIGVsc2UKKyNlbmRpZgorCWlkID0gMDsKKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gaWQ7Cit9CisKKy8qCisgKiAic3lzdGVtKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9zeXN0ZW0oYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBwID0gZ2V0X2NtZF9vdXRwdXQoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pLCBTSEVMTF9TSUxFTlQpOworI2lmZGVmIFVTRV9DUgorICAgIC8qIHRyYW5zbGF0ZSA8Q1I+IGludG8gPE5MPiAqLworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCWNoYXJfdQkqczsKKworCWZvciAocyA9IHA7ICpzOyArK3MpCisJeworCSAgICBpZiAoKnMgPT0gQ0FSKQorCQkqcyA9IE5MOworCX0KKyAgICB9CisjZWxzZQorIyBpZmRlZiBVU0VfQ1JOTAorICAgIC8qIHRyYW5zbGF0ZSA8Q1I+PE5MPiBpbnRvIDxOTD4gKi8KKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UJKnMsICpkOworCisJZCA9IHA7CisJZm9yIChzID0gcDsgKnM7ICsrcykKKwl7CisJICAgIGlmIChzWzBdID09IENBUiAmJiBzWzFdID09IE5MKQorCQkrK3M7CisJICAgICpkKysgPSAqczsKKwl9CisJKmQgPSBOVUw7CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBwOworfQorCisvKgorICogInN1Ym1hdGNoKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9zdWJtYXRjaChhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gcmVnX3N1Ym1hdGNoKChpbnQpZ2V0X3Zhcl9udW1iZXIoJmFyZ3ZhcnNbMF0pKTsKK30KKworLyoKKyAqICJzdWJzdGl0dXRlKCkiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl9zdWJzdGl0dXRlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CXBhdGJ1ZltOVU1CVUZMRU5dOworICAgIGNoYXJfdQlzdWJidWZbTlVNQlVGTEVOXTsKKyAgICBjaGFyX3UJZmxhZ3NidWZbTlVNQlVGTEVOXTsKKworICAgIHJldHZhci0+dmFyX3R5cGUgPSBWQVJfU1RSSU5HOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gZG9fc3RyaW5nX3N1YigKKwkgICAgZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pLAorCSAgICBnZXRfdmFyX3N0cmluZ19idWYoJmFyZ3ZhcnNbMV0sIHBhdGJ1ZiksCisJICAgIGdldF92YXJfc3RyaW5nX2J1ZigmYXJndmFyc1syXSwgc3ViYnVmKSwKKwkgICAgZ2V0X3Zhcl9zdHJpbmdfYnVmKCZhcmd2YXJzWzNdLCBmbGFnc2J1ZikpOworfQorCisvKgorICogInRlbXBuYW1lKCkiIGZ1bmN0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmX3RlbXBuYW1lKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgc3RhdGljIGludAl4ID0gJ0EnOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSB2aW1fdGVtcG5hbWUoeCk7CisKKyAgICAvKiBBZHZhbmNlICd4JyB0byB1c2UgQS1aIGFuZCAwLTksIHNvIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IDM0IGRpZmZlcmVudAorICAgICAqIG5hbWVzLiAgU2tpcCAnSScgYW5kICdPJywgdGhleSBhcmUgdXNlZCBmb3Igc2hlbGwgcmVkaXJlY3Rpb24uICovCisgICAgZG8KKyAgICB7CisJaWYgKHggPT0gJ1onKQorCSAgICB4ID0gJzAnOworCWVsc2UgaWYgKHggPT0gJzknKQorCSAgICB4ID0gJ0EnOworCWVsc2UKKwl7CisjaWZkZWYgRUJDRElDCisJICAgIGlmICh4ID09ICdJJykKKwkJeCA9ICdKJzsKKwkgICAgZWxzZSBpZiAoeCA9PSAnUicpCisJCXggPSAnUyc7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3g7CisJfQorICAgIH0gd2hpbGUgKHggPT0gJ0knIHx8IHggPT0gJ08nKTsKK30KKworLyoKKyAqICJ0b2xvd2VyKHN0cmluZykiIGZ1bmN0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZl90b2xvd2VyKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgcCA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKCZhcmd2YXJzWzBdKSk7CisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBwOworCisgICAgaWYgKHAgIT0gTlVMTCkKKwl3aGlsZSAoKnAgIT0gTlVMKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGludAkJbDsKKworCSAgICBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJaW50IGMsIGxjOworCisJCWMgPSB1dGZfcHRyMmNoYXIocCk7CisJCWxjID0gdXRmX3RvbG93ZXIoYyk7CisJCWwgPSB1dGZfcHRyMmxlbl9jaGVjayhwKTsKKwkJLyogVE9ETzogcmVhbGxvY2F0ZSBzdHJpbmcgd2hlbiBieXRlIGNvdW50IGNoYW5nZXMuICovCisJCWlmICh1dGZfY2hhcjJsZW4obGMpID09IGwpCisJCSAgICB1dGZfY2hhcjJieXRlcyhsYywgcCk7CisJCXAgKz0gbDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKSA+IDEpCisJCXAgKz0gbDsJCS8qIHNraXAgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgKi8KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJKnAgPSBUT0xPV0VSX0xPQygqcCk7IC8qIG5vdGUgdGhhdCB0b2xvd2VyKCkgY2FuIGJlIGEgbWFjcm8gKi8KKwkJKytwOworCSAgICB9CisJfQorfQorCisvKgorICogInRvdXBwZXIoc3RyaW5nKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3RvdXBwZXIoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBwID0gdmltX3N0cnNhdmUoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKKyAgICByZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHA7CisKKyAgICBpZiAocCAhPSBOVUxMKQorCXdoaWxlICgqcCAhPSBOVUwpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaW50CQlsOworCisJICAgIGlmIChlbmNfdXRmOCkKKwkgICAgeworCQlpbnQgYywgdWM7CisKKwkJYyA9IHV0Zl9wdHIyY2hhcihwKTsKKwkJdWMgPSB1dGZfdG91cHBlcihjKTsKKwkJbCA9IHV0Zl9wdHIybGVuX2NoZWNrKHApOworCQkvKiBUT0RPOiByZWFsbG9jYXRlIHN0cmluZyB3aGVuIGJ5dGUgY291bnQgY2hhbmdlcy4gKi8KKwkJaWYgKHV0Zl9jaGFyMmxlbih1YykgPT0gbCkKKwkJICAgIHV0Zl9jaGFyMmJ5dGVzKHVjLCBwKTsKKwkJcCArPSBsOworCSAgICB9CisJICAgIGVsc2UgaWYgKGhhc19tYnl0ZSAmJiAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkpID4gMSkKKwkJcCArPSBsOwkJLyogc2tpcCBtdWx0aS1ieXRlIGNoYXJhY3RlciAqLworCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQkqcCA9IFRPVVBQRVJfTE9DKCpwKTsgLyogbm90ZSB0aGF0IHRvdXBwZXIoKSBjYW4gYmUgYSBtYWNybyAqLworCQlwKys7CisJICAgIH0KKwl9Cit9CisKKy8qCisgKiAidHlwZShleHByKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3R5cGUoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBpZiAoYXJndmFyc1swXS52YXJfdHlwZSA9PSBWQVJfTlVNQkVSKQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyAgICBlbHNlCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAxOworfQorCisvKgorICogInZpcnRjb2woc3RyaW5nKSIgZnVuY3Rpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitmX3ZpcnRjb2woYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICBjb2xucl9UCXZjb2wgPSAwOworICAgIHBvc19UCSpmcDsKKworICAgIGZwID0gdmFyMmZwb3MoJmFyZ3ZhcnNbMF0sIEZBTFNFKTsKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBmcC0+bG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJZ2V0dnZjb2woY3Vyd2luLCBmcCwgTlVMTCwgTlVMTCwgJnZjb2wpOworCSsrdmNvbDsKKyAgICB9CisKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IHZjb2w7Cit9CisKKy8qCisgKiAidmlzdWFsbW9kZSgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl92aXN1YWxtb2RlKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBjaGFyX3UJc3RyWzJdOworCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7CisgICAgc3RyWzBdID0gY3VyYnVmLT5iX3Zpc3VhbF9tb2RlX2V2YWw7CisgICAgc3RyWzFdID0gTlVMOworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gdmltX3N0cnNhdmUoc3RyKTsKKworICAgIC8qIEEgbm9uLXplcm8gbnVtYmVyIG9yIG5vbi1lbXB0eSBzdHJpbmcgYXJndW1lbnQ6IHJlc2V0IG1vZGUuICovCisgICAgaWYgKChhcmd2YXJzWzBdLnZhcl90eXBlID09IFZBUl9OVU1CRVIKKwkJJiYgYXJndmFyc1swXS52YXJfdmFsLnZhcl9udW1iZXIgIT0gMCkKKwkgICAgfHwgKGFyZ3ZhcnNbMF0udmFyX3R5cGUgPT0gVkFSX1NUUklORworCQkmJiAqZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbMF0pICE9IE5VTCkpCisJY3VyYnVmLT5iX3Zpc3VhbF9tb2RlX2V2YWwgPSBOVUw7CisjZWxzZQorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsgLyogcmV0dXJuIGFueXRoaW5nLCBpdCB3b24ndCB3b3JrIGFueXdheSAqLworI2VuZGlmCit9CisKKy8qCisgKiAid2luYnVmbnIobnIpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfd2luYnVmbnIoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICB3aW5fVAkqd3A7CisKKyAgICB3cCA9IGZpbmRfd2luX2J5X25yKCZhcmd2YXJzWzBdKTsKKyAgICBpZiAod3AgPT0gTlVMTCkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IHdwLT53X2J1ZmZlci0+Yl9mbnVtOworfQorCisvKgorICogIndpbmNvbCgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl93aW5jb2woYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICB2YWxpZGF0ZV9jdXJzb3IoKTsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IGN1cndpbi0+d193Y29sICsgMTsKK30KKworLyoKKyAqICJ3aW5oZWlnaHQobnIpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfd2luaGVpZ2h0KGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgd2luX1QJKndwOworCisgICAgd3AgPSBmaW5kX3dpbl9ieV9ucigmYXJndmFyc1swXSk7CisgICAgaWYgKHdwID09IE5VTEwpCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSAtMTsKKyAgICBlbHNlCisJcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSB3cC0+d19oZWlnaHQ7Cit9CisKKy8qCisgKiAid2lubGluZSgpIiBmdW5jdGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZl93aW5saW5lKGFyZ3ZhcnMsIHJldHZhcikKKyAgICBWQVIJCWFyZ3ZhcnM7CisgICAgVkFSCQlyZXR2YXI7Cit7CisgICAgdmFsaWRhdGVfY3Vyc29yKCk7CisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9udW1iZXIgPSBjdXJ3aW4tPndfd3JvdyArIDE7Cit9CisKKy8qCisgKiAid2lubnIoKSIgZnVuY3Rpb24KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZl93aW5ucihhcmd2YXJzLCByZXR2YXIpCisgICAgVkFSCQlhcmd2YXJzOworICAgIFZBUgkJcmV0dmFyOworeworICAgIGludAkJbnIgPSAxOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3cDsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gY3Vyd2luOyB3cCA9IHdwLT53X25leHQpCisJKytucjsKKyNlbmRpZgorICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbnI7Cit9CisKKy8qCisgKiAid2lucmVzdGNtZCgpIiBmdW5jdGlvbgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitmX3dpbnJlc3RjbWQoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl3aW5uciA9IDE7CisgICAgZ2FycmF5X1QJZ2E7CisgICAgY2hhcl91CWJ1Zls1MF07CisKKyAgICBnYV9pbml0MigmZ2EsIChpbnQpc2l6ZW9mKGNoYXIpLCA3MCk7CisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisgICAgeworCXNwcmludGYoKGNoYXIgKilidWYsICIlZHJlc2l6ZSAlZHwiLCB3aW5uciwgd3AtPndfaGVpZ2h0KTsKKwlnYV9jb25jYXQoJmdhLCBidWYpOworIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorCXNwcmludGYoKGNoYXIgKilidWYsICJ2ZXJ0ICVkcmVzaXplICVkfCIsIHdpbm5yLCB3cC0+d193aWR0aCk7CisJZ2FfY29uY2F0KCZnYSwgYnVmKTsKKyMgZW5kaWYKKwkrK3dpbm5yOworICAgIH0KKworICAgIHJldHZhci0+dmFyX3ZhbC52YXJfc3RyaW5nID0gZ2EuZ2FfZGF0YTsKKyNlbHNlCisgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBOVUxMOworI2VuZGlmCisgICAgcmV0dmFyLT52YXJfdHlwZSA9IFZBUl9TVFJJTkc7Cit9CisKKy8qCisgKiAid2lud2lkdGgobnIpIiBmdW5jdGlvbgorICovCisgICAgc3RhdGljIHZvaWQKK2Zfd2lud2lkdGgoYXJndmFycywgcmV0dmFyKQorICAgIFZBUgkJYXJndmFyczsKKyAgICBWQVIJCXJldHZhcjsKK3sKKyAgICB3aW5fVAkqd3A7CisKKyAgICB3cCA9IGZpbmRfd2luX2J5X25yKCZhcmd2YXJzWzBdKTsKKyAgICBpZiAod3AgPT0gTlVMTCkKKwlyZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IC0xOworICAgIGVsc2UKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gd3AtPndfd2lkdGg7CisjZWxzZQorCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gQ29sdW1uczsKKyNlbmRpZgorfQorCisgICAgc3RhdGljIHdpbl9UICoKK2ZpbmRfd2luX2J5X25yKHZwKQorICAgIFZBUgkJdnA7Cit7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgd2luX1QJKndwOworI2VuZGlmCisgICAgaW50CQlucjsKKworICAgIG5yID0gZ2V0X3Zhcl9udW1iZXIodnApOworCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKG5yID09IDApCisJcmV0dXJuIGN1cndpbjsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICgtLW5yIDw9IDApCisJICAgIGJyZWFrOworICAgIHJldHVybiB3cDsKKyNlbHNlCisgICAgaWYgKG5yID09IDAgfHwgbnIgPT0gMSkKKwlyZXR1cm4gY3Vyd2luOworICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qCisgKiBUcmFuc2xhdGUgYSBTdHJpbmcgdmFyaWFibGUgaW50byBhIHBvc2l0aW9uLgorICovCisgICAgc3RhdGljIHBvc19UICoKK3ZhcjJmcG9zKHZhcnAsIGxudW0pCisgICAgVkFSCQl2YXJwOworICAgIGludAkJbG51bTsJCS8qIFRSVUUgd2hlbiAkIGlzIGxhc3QgbGluZSAqLworeworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBzdGF0aWMgcG9zX1QJcG9zOworICAgIHBvc19UCSpwcDsKKworICAgIG5hbWUgPSBnZXRfdmFyX3N0cmluZyh2YXJwKTsKKyAgICBpZiAobmFtZVswXSA9PSAnLicpCQkvKiBjdXJzb3IgKi8KKwlyZXR1cm4gJmN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKG5hbWVbMF0gPT0gJ1wnJykJLyogbWFyayAqLworICAgIHsKKwlwcCA9IGdldG1hcmsobmFtZVsxXSwgRkFMU0UpOworCWlmIChwcCA9PSBOVUxMIHx8IHBwID09IChwb3NfVCAqKS0xIHx8IHBwLT5sbnVtIDw9IDApCisJICAgIHJldHVybiBOVUxMOworCXJldHVybiBwcDsKKyAgICB9CisgICAgaWYgKG5hbWVbMF0gPT0gJyQnKQkJLyogbGFzdCBjb2x1bW4gb3IgbGluZSAqLworICAgIHsKKwlpZiAobG51bSkKKwl7CisJICAgIHBvcy5sbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIHBvcy5jb2wgPSAwOworCX0KKwllbHNlCisJeworCSAgICBwb3MubG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkgICAgcG9zLmNvbCA9IChjb2xucl9UKVNUUkxFTihtbF9nZXRfY3VybGluZSgpKTsKKwl9CisJcmV0dXJuICZwb3M7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogR2V0IHRoZSBsZW5ndGggb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS4KKyAqIEFkdmFuY2UgImFyZyIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbmFtZS4KKyAqIFJldHVybiAwIGZvciBlcnJvci4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9lbnZfbGVuKGFyZykKKyAgICBjaGFyX3UJKiphcmc7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuOworCisgICAgZm9yIChwID0gKmFyZzsgdmltX2lzSURjKCpwKTsgKytwKQorCTsKKyAgICBpZiAocCA9PSAqYXJnKQkgICAgLyogbm8gbmFtZSBmb3VuZCAqLworCXJldHVybiAwOworCisgICAgbGVuID0gKGludCkocCAtICphcmcpOworICAgICphcmcgPSBwOworICAgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIG9yIGludGVybmFsIHZhcmlhYmxlLgorICogImFyZyIgaXMgYWR2YW5jZWQgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIG5hbWUuCisgKiBSZXR1cm4gMCBpZiBzb21ldGhpbmcgaXMgd3JvbmcuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfaWRfbGVuKGFyZykKKyAgICBjaGFyX3UJKiphcmc7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuOworCisgICAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBuYW1lLiAqLworICAgIGZvciAocCA9ICphcmc7IGV2YWxfaXNuYW1lYygqcCk7ICsrcCkKKwk7CisgICAgaWYgKHAgPT0gKmFyZykJICAgIC8qIG5vIG5hbWUgZm91bmQgKi8KKwlyZXR1cm4gMDsKKworICAgIGxlbiA9IChpbnQpKHAgLSAqYXJnKTsKKyAgICAqYXJnID0gc2tpcHdoaXRlKHApOworCisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uCisgKiAiYXJnIiBpcyBhZHZhbmNlZCB0byB0aGUgZmlyc3Qgbm9uLXdoaXRlIGNoYXJhY3RlciBhZnRlciB0aGUgbmFtZS4KKyAqIFJldHVybiAwIGlmIHNvbWV0aGluZyBpcyB3cm9uZy4KKyAqIElmIHRoZSBuYW1lIGNvbnRhaW5zICdtYWdpYycge30ncywgZXhwYW5kIHRoZW0gYW5kIHJldHVybiB0aGUKKyAqIGV4cGFuZGVkIG5hbWUgaW4gYW4gYWxsb2NhdGVkIHN0cmluZyB2aWEgJ2FsaWFzJyAtIGNhbGxlciBtdXN0IGZyZWUuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfZnVuY19sZW4oYXJnLCBhbGlhcywgZXZhbHVhdGUpCisgICAgY2hhcl91CSoqYXJnOworICAgIGNoYXJfdQkqKmFsaWFzOworICAgIGludAkJZXZhbHVhdGU7Cit7CisgICAgaW50CQlsZW47CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpleHByX3N0YXJ0OworICAgIGNoYXJfdQkqZXhwcl9lbmQ7CisjZW5kaWYKKworICAgICphbGlhcyA9IE5VTEw7ICAvKiBkZWZhdWx0IHRvIG5vIGFsaWFzICovCisKKyAgICBpZiAoKCphcmcpWzBdID09IEtfU1BFQ0lBTCAmJiAoKmFyZylbMV0gPT0gS1NfRVhUUkEKKwkJCQkJCSAgJiYgKCphcmcpWzJdID09IChpbnQpS0VfU05SKQorICAgIHsKKwkvKiBoYXJkIGNvZGVkIDxTTlI+LCBhbHJlYWR5IHRyYW5zbGF0ZWQgKi8KKwkqYXJnICs9IDM7CisJcmV0dXJuIGdldF9pZF9sZW4oYXJnKSArIDM7CisgICAgfQorICAgIGxlbiA9IGV2YWxfZm5hbWVfc2NyaXB0KCphcmcpOworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKwkvKiBsaXRlcmFsICI8U0lEPiIsICJzOiIgb3IgIjxTTlI+IiAqLworCSphcmcgKz0gbGVuOworICAgIH0KKworI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIG5hbWU7CisgICAgICovCisgICAgcCA9IGZpbmRfbmFtZV9lbmQoKmFyZywgJmV4cHJfc3RhcnQsICZleHByX2VuZCk7CisgICAgLyogY2hlY2sgZm9yIHt9IGNvbnN0cnVjdGlvbiAqLworICAgIGlmIChleHByX3N0YXJ0ICE9IE5VTEwpCisgICAgeworCWNoYXJfdQkqdGVtcF9zdHJpbmc7CisKKwlpZiAoIWV2YWx1YXRlKQorCXsKKwkgICAgbGVuICs9IChpbnQpKHAgLSAqYXJnKTsKKwkgICAgKmFyZyA9IHNraXB3aGl0ZShwKTsKKwkgICAgcmV0dXJuIGxlbjsKKwl9CisKKwkvKgorCSAqIEluY2x1ZGUgYW55IDxTSUQ+IGV0YyBpbiB0aGUgZXhwYW5kZWQgc3RyaW5nOgorCSAqIFRodXMgdGhlIC1sZW4gaGVyZS4KKwkgKi8KKwl0ZW1wX3N0cmluZyA9IG1ha2VfZXhwYW5kZWRfbmFtZSgqYXJnIC0gbGVuLCBleHByX3N0YXJ0LCBleHByX2VuZCwgcCk7CisJaWYgKHRlbXBfc3RyaW5nID09IE5VTEwpCisJICAgIHJldHVybiAwOworCSphbGlhcyA9IHRlbXBfc3RyaW5nOworCSphcmcgPSBza2lwd2hpdGUocCk7CisJcmV0dXJuIChpbnQpU1RSTEVOKHRlbXBfc3RyaW5nKTsKKyAgICB9CisjZW5kaWYKKworICAgIGxlbiArPSBnZXRfaWRfbGVuKGFyZyk7CisgICAgaWYgKGxlbiA9PSAwKQorCUVNU0cyKF8oZV9pbnZleHByMiksICphcmcpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworICAgIHN0YXRpYyBjaGFyX3UgKgorZmluZF9uYW1lX2VuZChhcmcsIGV4cHJfc3RhcnQsIGV4cHJfZW5kKQorICAgIGNoYXJfdQkqYXJnOworICAgIGNoYXJfdQkqKmV4cHJfc3RhcnQ7CisgICAgY2hhcl91CSoqZXhwcl9lbmQ7Cit7CisgICAgaW50CQluZXN0aW5nID0gMDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICAqZXhwcl9zdGFydCA9IE5VTEw7CisgICAgKmV4cHJfZW5kID0gTlVMTDsKKworICAgIGZvciAocCA9IGFyZzsgKCpwICE9IE5VTCAmJiAoZXZhbF9pc25hbWVjKCpwKSB8fCBuZXN0aW5nICE9IDApKTsgKytwKQorICAgIHsKKyNpZmRlZiBGRUFUX01BR0lDX0JSQUNFUworCWlmICgqcCA9PSAneycpCisJeworCSAgICBuZXN0aW5nKys7CisJICAgIGlmICgqZXhwcl9zdGFydCA9PSBOVUxMKQorCQkqZXhwcl9zdGFydCA9IHA7CisJfQorCWVsc2UgaWYgKCpwID09ICd9JykKKwl7CisJICAgIG5lc3RpbmctLTsKKwkgICAgaWYgKG5lc3RpbmcgPT0gMCAmJiAqZXhwcl9lbmQgPT0gTlVMTCkKKwkJKmV4cHJfZW5kID0gcDsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGNoYXJhY3RlciAiYyIgY2FuIGJlIHVzZWQgaW4gYSB2YXJpYWJsZSBvciBmdW5jdGlvbiBuYW1lLgorICovCisgICAgc3RhdGljIGludAorZXZhbF9pc25hbWVjKGMpCisgICAgaW50CSAgICBjOworeworICAgIHJldHVybiAoQVNDSUlfSVNBTE5VTShjKSB8fCBjID09ICdfJyB8fCBjID09ICc6JworI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisJICAgIHx8IGMgPT0gJ3snIHx8IGMgPT0gJ30nCisjZW5kaWYKKwkgICAgKTsKK30KKworLyoKKyAqIEZpbmQgYSB2OiB2YXJpYWJsZS4KKyAqIFJldHVybiBpdCdzIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgaW50CitmaW5kX3ZpbV92YXIobmFtZSwgbGVuKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiAibmFtZSIgKi8KK3sKKyAgICBjaGFyX3UJKnZuYW1lOworICAgIGludAkJdmxlbjsKKyAgICBpbnQJCWk7CisKKyAgICAvKgorICAgICAqIElnbm9yZSAidjoiIGZvciBvbGQgYnVpbHQtaW4gdmFyaWFibGVzLCByZXF1aXJlIGl0IGZvciBuZXcgb25lcy4KKyAgICAgKi8KKyAgICBpZiAobmFtZVswXSA9PSAndicgJiYgbmFtZVsxXSA9PSAnOicpCisgICAgeworCXZuYW1lID0gbmFtZSArIDI7CisJdmxlbiA9IGxlbiAtIDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdm5hbWUgPSBuYW1lOworCXZsZW4gPSBsZW47CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBWVl9MRU47ICsraSkKKwlpZiAodmxlbiA9PSB2aW12YXJzW2ldLmxlbiAmJiBTVFJDTVAodm5hbWUsIHZpbXZhcnNbaV0ubmFtZSkgPT0gMAorCQkJICYmICgodmltdmFyc1tpXS5mbGFncyAmIFZWX0NPTVBBVCkgfHwgdm5hbWUgIT0gbmFtZSkpCisJICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIFNldCBudW1iZXIgdjogdmFyaWFibGUgdG8gInZhbCIuCisgKi8KKyAgICB2b2lkCitzZXRfdmltX3Zhcl9ucihpZHgsIHZhbCkKKyAgICBpbnQJCWlkeDsKKyAgICBsb25nCXZhbDsKK3sKKyAgICB2aW12YXJzW2lkeF0udmFsID0gKGNoYXJfdSAqKXZhbDsKK30KKworLyoKKyAqIEdldCBudW1iZXIgdjogdmFyaWFibGUgdmFsdWU7CisgKi8KKyAgICBsb25nCitnZXRfdmltX3Zhcl9ucihpZHgpCisgICAgaW50CQlpZHg7Cit7CisgICAgcmV0dXJuIChsb25nKXZpbXZhcnNbaWR4XS52YWw7Cit9CisKKy8qCisgKiBTZXQgdjpjb3VudCwgdjpjb3VudDEgYW5kIHY6cHJldmNvdW50LgorICovCisgICAgdm9pZAorc2V0X3Zjb3VudChjb3VudCwgY291bnQxKQorICAgIGxvbmcJY291bnQ7CisgICAgbG9uZwljb3VudDE7Cit7CisgICAgdmltdmFyc1tWVl9QUkVWQ09VTlRdLnZhbCA9IHZpbXZhcnNbVlZfQ09VTlRdLnZhbDsKKyAgICB2aW12YXJzW1ZWX0NPVU5UXS52YWwgPSAoY2hhcl91ICopY291bnQ7CisgICAgdmltdmFyc1tWVl9DT1VOVDFdLnZhbCA9IChjaGFyX3UgKiljb3VudDE7Cit9CisKKy8qCisgKiBTZXQgc3RyaW5nIHY6IHZhcmlhYmxlIHRvIGEgY29weSBvZiAidmFsIi4KKyAqLworICAgIHZvaWQKK3NldF92aW1fdmFyX3N0cmluZyhpZHgsIHZhbCwgbGVuKQorICAgIGludAkJaWR4OworICAgIGNoYXJfdQkqdmFsOworICAgIGludAkJbGVuOwkgICAgLyogbGVuZ3RoIG9mICJ2YWwiIHRvIHVzZSBvciAtMSAod2hvbGUgc3RyaW5nKSAqLworeworICAgIHZpbV9mcmVlKHZpbXZhcnNbaWR4XS52YWwpOworICAgIGlmICh2YWwgPT0gTlVMTCkKKwl2aW12YXJzW2lkeF0udmFsID0gTlVMTDsKKyAgICBlbHNlIGlmIChsZW4gPT0gLTEpCisJdmltdmFyc1tpZHhdLnZhbCA9IHZpbV9zdHJzYXZlKHZhbCk7CisgICAgZWxzZQorCXZpbXZhcnNbaWR4XS52YWwgPSB2aW1fc3RybnNhdmUodmFsLCBsZW4pOworfQorCisvKgorICogU2V0IHY6cmVnaXN0ZXIgaWYgbmVlZGVkLgorICovCisgICAgdm9pZAorc2V0X3JlZ192YXIoYykKKyAgICBpbnQJCWM7Cit7CisgICAgY2hhcl91CXJlZ25hbWU7CisKKyAgICBpZiAoYyA9PSAwIHx8IGMgPT0gJyAnKQorCXJlZ25hbWUgPSAnIic7CisgICAgZWxzZQorCXJlZ25hbWUgPSBjOworICAgIC8qIEF2b2lkIGZyZWUvYWxsb2Mgd2hlbiB0aGUgdmFsdWUgaXMgYWxyZWFkeSByaWdodC4gKi8KKyAgICBpZiAodmltdmFyc1tWVl9SRUddLnZhbCA9PSBOVUxMIHx8IHZpbXZhcnNbVlZfUkVHXS52YWxbMF0gIT0gYykKKwlzZXRfdmltX3Zhcl9zdHJpbmcoVlZfUkVHLCAmcmVnbmFtZSwgMSk7Cit9CisKKy8qCisgKiBHZXQgb3Igc2V0IHY6ZXhjZXB0aW9uLiAgSWYgIm9sZHZhbCIgPT0gTlVMTCwgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgorICogT3RoZXJ3aXNlLCByZXN0b3JlIHRoZSB2YWx1ZSB0byAib2xkdmFsIiBhbmQgcmV0dXJuIE5VTEwuCisgKiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQgaW4gcGFpcnMgdG8gc2F2ZSBhbmQgcmVzdG9yZSB2OmV4Y2VwdGlvbiEgIERvZXMgbm90CisgKiB0YWtlIGNhcmUgb2YgbWVtb3J5IGFsbG9jYXRpb25zLgorICovCisgICAgY2hhcl91ICoKK3ZfZXhjZXB0aW9uKG9sZHZhbCkKKyAgICBjaGFyX3UJKm9sZHZhbDsKK3sKKyAgICBpZiAob2xkdmFsID09IE5VTEwpCisJcmV0dXJuIHZpbXZhcnNbVlZfRVhDRVBUSU9OXS52YWw7CisKKyAgICB2aW12YXJzW1ZWX0VYQ0VQVElPTl0udmFsID0gb2xkdmFsOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogR2V0IG9yIHNldCB2OnRocm93cG9pbnQuICBJZiAib2xkdmFsIiA9PSBOVUxMLCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCisgKiBPdGhlcndpc2UsIHJlc3RvcmUgdGhlIHZhbHVlIHRvICJvbGR2YWwiIGFuZCByZXR1cm4gTlVMTC4KKyAqIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBpbiBwYWlycyB0byBzYXZlIGFuZCByZXN0b3JlIHY6dGhyb3dwb2ludCEgIERvZXMgbm90CisgKiB0YWtlIGNhcmUgb2YgbWVtb3J5IGFsbG9jYXRpb25zLgorICovCisgICAgY2hhcl91ICoKK3ZfdGhyb3dwb2ludChvbGR2YWwpCisgICAgY2hhcl91CSpvbGR2YWw7Cit7CisgICAgaWYgKG9sZHZhbCA9PSBOVUxMKQorCXJldHVybiB2aW12YXJzW1ZWX1RIUk9XUE9JTlRdLnZhbDsKKworICAgIHZpbXZhcnNbVlZfVEhST1dQT0lOVF0udmFsID0gb2xkdmFsOworICAgIHJldHVybiBOVUxMOworfQorCisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2V0IHY6Y21kYXJnLgorICogSWYgImVhcCIgIT0gTlVMTCwgdXNlICJlYXAiIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgKiBJZiAib2xkYXJnIiAhPSBOVUxMLCByZXN0b3JlIHRoZSB2YWx1ZSB0byAib2xkYXJnIiBhbmQgcmV0dXJuIE5VTEwuCisgKiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQgaW4gcGFpcnMhCisgKi8KKyAgICBjaGFyX3UgKgorc2V0X2NtZGFyZyhlYXAsIG9sZGFyZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgY2hhcl91CSpvbGRhcmc7Cit7CisgICAgY2hhcl91CSpvbGR2YWw7CisgICAgY2hhcl91CSpuZXd2YWw7CisgICAgdW5zaWduZWQJbGVuOworCisgICAgb2xkdmFsID0gdmltdmFyc1tWVl9DTURBUkddLnZhbDsKKyAgICBpZiAoZWFwICE9IE5VTEwpCisgICAgeworCWlmIChlYXAtPmZvcmNlX2JpbiA9PSBGT1JDRV9CSU4pCisJICAgIGxlbiA9IDY7CisJZWxzZSBpZiAoZWFwLT5mb3JjZV9iaW4gPT0gRk9SQ0VfTk9CSU4pCisJICAgIGxlbiA9IDg7CisJZWxzZQorCSAgICBsZW4gPSAwOworCWlmIChlYXAtPmZvcmNlX2ZmICE9IDApCisJICAgIGxlbiArPSAodW5zaWduZWQpU1RSTEVOKGVhcC0+Y21kICsgZWFwLT5mb3JjZV9mZikgKyA2OworIyBpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVhcC0+Zm9yY2VfZW5jICE9IDApCisJICAgIGxlbiArPSAodW5zaWduZWQpU1RSTEVOKGVhcC0+Y21kICsgZWFwLT5mb3JjZV9lbmMpICsgNzsKKyMgZW5kaWYKKworCW5ld3ZhbCA9IGFsbG9jKGxlbiArIDEpOworCWlmIChuZXd2YWwgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwlpZiAoZWFwLT5mb3JjZV9iaW4gPT0gRk9SQ0VfQklOKQorCSAgICBzcHJpbnRmKChjaGFyICopbmV3dmFsLCAiICsrYmluIik7CisJZWxzZSBpZiAoZWFwLT5mb3JjZV9iaW4gPT0gRk9SQ0VfTk9CSU4pCisJICAgIHNwcmludGYoKGNoYXIgKiluZXd2YWwsICIgKytub2JpbiIpOworCWVsc2UKKwkgICAgKm5ld3ZhbCA9IE5VTDsKKwlpZiAoZWFwLT5mb3JjZV9mZiAhPSAwKQorCSAgICBzcHJpbnRmKChjaGFyICopbmV3dmFsICsgU1RSTEVOKG5ld3ZhbCksICIgKytmZj0lcyIsCisJCQkJCQkgICAgZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2ZmKTsKKyMgaWZkZWYgRkVBVF9NQllURQorCWlmIChlYXAtPmZvcmNlX2VuYyAhPSAwKQorCSAgICBzcHJpbnRmKChjaGFyICopbmV3dmFsICsgU1RSTEVOKG5ld3ZhbCksICIgKytlbmM9JXMiLAorCQkJCQkJICAgZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2VuYyk7CisjIGVuZGlmCisJdmltdmFyc1tWVl9DTURBUkddLnZhbCA9IG5ld3ZhbDsKKwlyZXR1cm4gb2xkdmFsOworICAgIH0KKworICAgIHZpbV9mcmVlKG9sZHZhbCk7CisgICAgdmltdmFyc1tWVl9DTURBUkddLnZhbCA9IG9sZGFyZzsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogR2V0IHRoZSB2YWx1ZSBvZiBpbnRlcm5hbCB2YXJpYWJsZSAibmFtZSIuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF92YXJfdmFyKG5hbWUsIGxlbiwgcmV0dmFyKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiAibmFtZSIgKi8KKyAgICBWQVIJCXJldHZhcjsJCS8qIE5VTEwgd2hlbiBvbmx5IGNoZWNraW5nIGV4aXN0ZW5jZSAqLworeworICAgIGludAkJcmV0ID0gT0s7CisgICAgaW50CQl0eXBlID0gVkFSX1VOS05PV047CisgICAgbG9uZwludW1iZXIgPSAxOworICAgIGNoYXJfdQkqc3RyaW5nID0gTlVMTDsKKyAgICBWQVIJCXY7CisgICAgaW50CQljYzsKKyAgICBpbnQJCWk7CisKKyAgICAvKiB0cnVuY2F0ZSB0aGUgbmFtZSwgc28gdGhhdCB3ZSBjYW4gdXNlIHN0cmNtcCgpICovCisgICAgY2MgPSBuYW1lW2xlbl07CisgICAgbmFtZVtsZW5dID0gTlVMOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgImI6Y2hhbmdlZHRpY2siLgorICAgICAqLworICAgIGlmIChTVFJDTVAobmFtZSwgImI6Y2hhbmdlZHRpY2siKSA9PSAwKQorICAgIHsKKwl0eXBlID0gVkFSX05VTUJFUjsKKwludW1iZXIgPSBjdXJidWYtPmJfY2hhbmdlZHRpY2s7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYnVpbHQtaW4gdjogdmFyaWFibGVzLgorICAgICAqLworICAgIGVsc2UgaWYgKChpID0gZmluZF92aW1fdmFyKG5hbWUsIGxlbikpID49IDApCisgICAgeworCXR5cGUgPSB2aW12YXJzW2ldLnR5cGU7CisJbnVtYmVyID0gKGxvbmcpdmltdmFyc1tpXS52YWw7CisJc3RyaW5nID0gdmltdmFyc1tpXS52YWw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgdXNlci1kZWZpbmVkIHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBlbHNlCisgICAgeworCXYgPSBmaW5kX3ZhcihuYW1lLCBGQUxTRSk7CisJaWYgKHYgIT0gTlVMTCkKKwl7CisJICAgIHR5cGUgPSB2LT52YXJfdHlwZTsKKwkgICAgbnVtYmVyID0gdi0+dmFyX3ZhbC52YXJfbnVtYmVyOworCSAgICBzdHJpbmcgPSB2LT52YXJfdmFsLnZhcl9zdHJpbmc7CisJfQorICAgIH0KKworICAgIGlmICh0eXBlID09IFZBUl9VTktOT1dOKQorICAgIHsKKwlpZiAocmV0dmFyICE9IE5VTEwpCisJICAgIEVNU0cyKF8oIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiKSwgbmFtZSk7CisJcmV0ID0gRkFJTDsKKyAgICB9CisgICAgZWxzZSBpZiAocmV0dmFyICE9IE5VTEwpCisgICAgeworCXJldHZhci0+dmFyX3R5cGUgPSB0eXBlOworCWlmICh0eXBlID09IFZBUl9OVU1CRVIpCisJICAgIHJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gbnVtYmVyOworCWVsc2UgaWYgKHR5cGUgPT0gVkFSX1NUUklORykKKwl7CisJICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKwkJc3RyaW5nID0gdmltX3N0cnNhdmUoc3RyaW5nKTsKKwkgICAgcmV0dmFyLT52YXJfdmFsLnZhcl9zdHJpbmcgPSBzdHJpbmc7CisJfQorICAgIH0KKworICAgIG5hbWVbbGVuXSA9IGNjOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSB2YXJpYWJsZSwgYW5kIG1ha2UgaXQgZW10cHkgKDAgb3IgTlVMTCB2YWx1ZSkuCisgKi8KKyAgICBzdGF0aWMgVkFSCithbGxvY192YXIoKQoreworICAgIHJldHVybiAoVkFSKWFsbG9jX2NsZWFyKCh1bnNpZ25lZClzaXplb2YodmFyKSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgdmFyaWFibGUsIGFuZCBhc3NpZ24gYSBzdHJpbmcgdG8gaXQuCisgKiBUaGUgc3RyaW5nICJzIiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQsIGl0IGlzIGNvbnN1bWVkLgorICogUmV0dXJuIE5VTEwgZm9yIG91dCBvZiBtZW1vcnksIHRoZSB2YXJpYWJsZSBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgVkFSCithbGxvY19zdHJpbmdfdmFyKHMpCisgICAgY2hhcl91CSpzOworeworICAgIFZBUgkgICAgcmV0dmFyOworCisgICAgcmV0dmFyID0gYWxsb2NfdmFyKCk7CisgICAgaWYgKHJldHZhciAhPSBOVUxMKQorICAgIHsKKwlyZXR2YXItPnZhcl90eXBlID0gVkFSX1NUUklORzsKKwlyZXR2YXItPnZhcl92YWwudmFyX3N0cmluZyA9IHM7CisgICAgfQorICAgIGVsc2UKKwl2aW1fZnJlZShzKTsKKyAgICByZXR1cm4gcmV0dmFyOworfQorCisvKgorICogRnJlZSB0aGUgbWVtb3J5IGZvciBhIHZhcmlhYmxlLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZyZWVfdmFyKHZhcnApCisgICAgVkFSCSAgICB2YXJwOworeworICAgIGlmICh2YXJwICE9IE5VTEwpCisgICAgeworCWlmICh2YXJwLT52YXJfdHlwZSA9PSBWQVJfU1RSSU5HKQorCSAgICB2aW1fZnJlZSh2YXJwLT52YXJfdmFsLnZhcl9zdHJpbmcpOworCXZpbV9mcmVlKHZhcnAtPnZhcl9uYW1lKTsKKwl2aW1fZnJlZSh2YXJwKTsKKyAgICB9Cit9CisKKy8qCisgKiBGcmVlIHRoZSBtZW1vcnkgZm9yIGEgdmFyaWFibGUgdmFsdWUgYW5kIHNldCB0aGUgdmFsdWUgdG8gTlVMTCBvciAwLgorICovCisgICAgc3RhdGljIHZvaWQKK2NsZWFyX3Zhcih2YXJwKQorICAgIFZBUgkgICAgdmFycDsKK3sKKyAgICBpZiAodmFycCAhPSBOVUxMKQorICAgIHsKKwlpZiAodmFycC0+dmFyX3R5cGUgPT0gVkFSX1NUUklORykKKwl7CisJICAgIHZpbV9mcmVlKHZhcnAtPnZhcl92YWwudmFyX3N0cmluZyk7CisJICAgIHZhcnAtPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7CisJfQorCWVsc2UKKwkgICAgdmFycC0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBHZXQgdGhlIG51bWJlciB2YWx1ZSBvZiBhIHZhcmlhYmxlLgorICogSWYgaXQgaXMgYSBTdHJpbmcgdmFyaWFibGUsIHVzZXMgdmltX3N0cjJucigpLgorICovCisgICAgc3RhdGljIGxvbmcKK2dldF92YXJfbnVtYmVyKHZhcnApCisgICAgVkFSCQl2YXJwOworeworICAgIGxvbmcJbjsKKworICAgIGlmICh2YXJwLT52YXJfdHlwZSA9PSBWQVJfTlVNQkVSKQorCXJldHVybiAobG9uZykodmFycC0+dmFyX3ZhbC52YXJfbnVtYmVyKTsKKyAgICBlbHNlIGlmICh2YXJwLT52YXJfdHlwZSA9PSBWQVJfVU5LTk9XTiB8fCB2YXJwLT52YXJfdmFsLnZhcl9zdHJpbmcgPT0gTlVMTCkKKwlyZXR1cm4gMEw7CisgICAgZWxzZQorICAgIHsKKwl2aW1fc3RyMm5yKHZhcnAtPnZhcl92YWwudmFyX3N0cmluZywgTlVMTCwgTlVMTCwgVFJVRSwgVFJVRSwgJm4sIE5VTEwpOworCXJldHVybiBuOworICAgIH0KK30KKworLyoKKyAqIEdldCB0aGUgbG51bSBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudC4gIEFsc28gYWNjZXB0cyAiLiIsICIkIiwgZXRjLgorICovCisgICAgc3RhdGljIGxpbmVucl9UCitnZXRfdmFyX2xudW0oYXJndmFycykKKyAgICBWQVIJCWFyZ3ZhcnM7Cit7CisgICAgdmFyCQlyZXR2YXI7CisgICAgbGluZW5yX1QJbG51bTsKKworICAgIGxudW0gPSBnZXRfdmFyX251bWJlcigmYXJndmFyc1swXSk7CisgICAgaWYgKGxudW0gPT0gMCkgIC8qIG5vIHZhbGlkIG51bWJlciwgdHJ5IHVzaW5nIGxpbmUoKSAqLworICAgIHsKKwlyZXR2YXIudmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCWZfbGluZShhcmd2YXJzLCAmcmV0dmFyKTsKKwlsbnVtID0gcmV0dmFyLnZhcl92YWwudmFyX251bWJlcjsKKwljbGVhcl92YXIoJnJldHZhcik7CisgICAgfQorICAgIHJldHVybiBsbnVtOworfQorCisvKgorICogR2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYSB2YXJpYWJsZS4KKyAqIElmIGl0IGlzIGEgTnVtYmVyIHZhcmlhYmxlLCB0aGUgbnVtYmVyIGlzIGNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nLgorICogZ2V0X3Zhcl9zdHJpbmcoKSB1c2VzIGEgc2luZ2xlLCBzdGF0aWMgYnVmZmVyLiAgWU9VIENBTiBPTkxZIFVTRSBJVCBPTkNFIQorICogZ2V0X3Zhcl9zdHJpbmdfYnVmKCkgdXNlcyBhIGdpdmVuIGJ1ZmZlci4KKyAqIElmIHRoZSBTdHJpbmcgdmFyaWFibGUgaGFzIG5ldmVyIGJlZW4gc2V0LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorICogTmV2ZXIgcmV0dXJucyBOVUxMOworICovCisgICAgc3RhdGljIGNoYXJfdSAqCitnZXRfdmFyX3N0cmluZyh2YXJwKQorICAgIFZBUgkgICAgdmFycDsKK3sKKyAgICBzdGF0aWMgY2hhcl91ICAgbXlidWZbTlVNQlVGTEVOXTsKKworICAgIHJldHVybiBnZXRfdmFyX3N0cmluZ19idWYodmFycCwgbXlidWYpOworfQorCisgICAgc3RhdGljIGNoYXJfdSAqCitnZXRfdmFyX3N0cmluZ19idWYodmFycCwgYnVmKQorICAgIFZBUgkgICAgdmFycDsKKyAgICBjaGFyX3UgICpidWY7Cit7CisgICAgaWYgKHZhcnAtPnZhcl90eXBlID09IFZBUl9OVU1CRVIpCisgICAgeworCXNwcmludGYoKGNoYXIgKilidWYsICIlbGQiLCAobG9uZyl2YXJwLT52YXJfdmFsLnZhcl9udW1iZXIpOworCXJldHVybiBidWY7CisgICAgfQorICAgIGVsc2UgaWYgKHZhcnAtPnZhcl92YWwudmFyX3N0cmluZyA9PSBOVUxMKQorCXJldHVybiAoY2hhcl91ICopIiI7CisgICAgZWxzZQorCXJldHVybiB2YXJwLT52YXJfdmFsLnZhcl9zdHJpbmc7Cit9CisKKy8qCisgKiBGaW5kIHZhcmlhYmxlICJuYW1lIiBpbiB0aGUgbGlzdCBvZiB2YXJpYWJsZXMuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGl0IGlmIGZvdW5kLCBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworICAgIHN0YXRpYyBWQVIKK2ZpbmRfdmFyKG5hbWUsIHdyaXRpbmcpCisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJd3JpdGluZzsKK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSp2YXJuYW1lOworICAgIGdhcnJheV9UCSpnYXA7CisKKyAgICAvKiBDaGVjayBmb3IgZnVuY3Rpb24gYXJndW1lbnRzICJhOiIgKi8KKyAgICBpZiAobmFtZVswXSA9PSAnYScgJiYgbmFtZVsxXSA9PSAnOicpCisgICAgeworCWlmICh3cml0aW5nKQorCXsKKwkgICAgRU1TRzIoXyhlX3JlYWRvbmx5dmFyKSwgbmFtZSk7CisJICAgIHJldHVybiBOVUxMOworCX0KKwluYW1lICs9IDI7CisJaWYgKGN1cnJlbnRfZnVuY2NhbCA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwlpZiAoVklNX0lTRElHSVQoKm5hbWUpKQorCXsKKwkgICAgaSA9IGF0b2woKGNoYXIgKiluYW1lKTsKKwkgICAgaWYgKGkgPT0gMCkJCQkJCS8qIGE6MCAqLworCQlyZXR1cm4gJmN1cnJlbnRfZnVuY2NhbC0+YTBfdmFyOworCSAgICBpICs9IGN1cnJlbnRfZnVuY2NhbC0+ZnVuYy0+YXJncy5nYV9sZW47CisJICAgIGlmIChpID4gY3VycmVudF9mdW5jY2FsLT5hcmdjb3VudCkJCS8qIGE6OTk5ICovCisJCXJldHVybiBOVUxMOworCSAgICByZXR1cm4gJihjdXJyZW50X2Z1bmNjYWwtPmFyZ3ZhcnNbaSAtIDFdKTsJLyogYToxLCBhOjIsIGV0Yy4gKi8KKwl9CisJaWYgKFNUUkNNUChuYW1lLCAiZmlyc3RsaW5lIikgPT0gMCkKKwkgICAgcmV0dXJuICYoY3VycmVudF9mdW5jY2FsLT5maXJzdGxpbmUpOworCWlmIChTVFJDTVAobmFtZSwgImxhc3RsaW5lIikgPT0gMCkKKwkgICAgcmV0dXJuICYoY3VycmVudF9mdW5jY2FsLT5sYXN0bGluZSk7CisJZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZnVuY2NhbC0+ZnVuYy0+YXJncy5nYV9sZW47ICsraSkKKwkgICAgaWYgKFNUUkNNUChuYW1lLCAoKGNoYXJfdSAqKikKKwkJCSAgICAgIChjdXJyZW50X2Z1bmNjYWwtPmZ1bmMtPmFyZ3MuZ2FfZGF0YSkpW2ldKSA9PSAwKQorCSAgICByZXR1cm4gJihjdXJyZW50X2Z1bmNjYWwtPmFyZ3ZhcnNbaV0pOwkvKiBhOm5hbWUgKi8KKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBnYXAgPSBmaW5kX3Zhcl9nYShuYW1lLCAmdmFybmFtZSk7CisgICAgaWYgKGdhcCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBmaW5kX3Zhcl9pbl9nYShnYXAsIHZhcm5hbWUpOworfQorCisgICAgc3RhdGljIFZBUgorZmluZF92YXJfaW5fZ2EoZ2FwLCB2YXJuYW1lKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSp2YXJuYW1lOworeworICAgIGludAlpOworCisgICAgZm9yIChpID0gZ2FwLT5nYV9sZW47IC0taSA+PSAwOyApCisJaWYgKFZBUl9HQVBfRU5UUlkoaSwgZ2FwKS52YXJfbmFtZSAhPSBOVUxMCisJCSYmIFNUUkNNUChWQVJfR0FQX0VOVFJZKGksIGdhcCkudmFyX25hbWUsIHZhcm5hbWUpID09IDApCisJICAgIGJyZWFrOworICAgIGlmIChpIDwgMCkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gJlZBUl9HQVBfRU5UUlkoaSwgZ2FwKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGdyb3dhcnJheSBhbmQgc3RhcnQgb2YgbmFtZSB3aXRob3V0ICc6JyBmb3IgYSB2YXJpYWJsZSBuYW1lLgorICovCisgICAgc3RhdGljIGdhcnJheV9UICoKK2ZpbmRfdmFyX2dhKG5hbWUsIHZhcm5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKKyAgICBjaGFyX3UgICoqdmFybmFtZTsKK3sKKyAgICBpZiAobmFtZVsxXSAhPSAnOicpCisgICAgeworCS8qIElmIG5vdCAieDpuYW1lIiB0aGVyZSBtdXN0IG5vdCBiZSBhbnkgIjoiIGluIHRoZSBuYW1lLiAqLworCWlmICh2aW1fc3RyY2hyKG5hbWUsICc6JykgIT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJKnZhcm5hbWUgPSBuYW1lOworCWlmIChjdXJyZW50X2Z1bmNjYWwgPT0gTlVMTCkKKwkgICAgcmV0dXJuICZ2YXJpYWJsZXM7CQkJLyogZ2xvYmFsIHZhcmlhYmxlICovCisJcmV0dXJuICZjdXJyZW50X2Z1bmNjYWwtPmxfdmFyczsJLyogbG9jYWwgZnVuY3Rpb24gdmFyaWFibGUgKi8KKyAgICB9CisgICAgKnZhcm5hbWUgPSBuYW1lICsgMjsKKyAgICBpZiAoKm5hbWUgPT0gJ2InKQkJCQkvKiBidWZmZXIgdmFyaWFibGUgKi8KKwlyZXR1cm4gJmN1cmJ1Zi0+Yl92YXJzOworICAgIGlmICgqbmFtZSA9PSAndycpCQkJCS8qIHdpbmRvdyB2YXJpYWJsZSAqLworCXJldHVybiAmY3Vyd2luLT53X3ZhcnM7CisgICAgaWYgKCpuYW1lID09ICdnJykJCQkJLyogZ2xvYmFsIHZhcmlhYmxlICovCisJcmV0dXJuICZ2YXJpYWJsZXM7CisgICAgaWYgKCpuYW1lID09ICdsJyAmJiBjdXJyZW50X2Z1bmNjYWwgIT0gTlVMTCkvKiBsb2NhbCBmdW5jdGlvbiB2YXJpYWJsZSAqLworCXJldHVybiAmY3VycmVudF9mdW5jY2FsLT5sX3ZhcnM7CisgICAgaWYgKCpuYW1lID09ICdzJwkJCQkvKiBzY3JpcHQgdmFyaWFibGUgKi8KKwkgICAgJiYgY3VycmVudF9TSUQgPiAwICYmIGN1cnJlbnRfU0lEIDw9IGdhX3NjcmlwdHMuZ2FfbGVuKQorCXJldHVybiAmU0NSSVBUX1ZBUlMoY3VycmVudF9TSUQpOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogR2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYSAoZ2xvYmFsL2xvY2FsKSB2YXJpYWJsZS4KKyAqIFJldHVybnMgTlVMTCB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X3Zhcl92YWx1ZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBWQVIJCXY7CisKKyAgICB2ID0gZmluZF92YXIobmFtZSwgRkFMU0UpOworICAgIGlmICh2ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGdldF92YXJfc3RyaW5nKHYpOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgZ3Jvd2FycnkgZm9yIGEgc291cmNlZCBzY3JpcHQuICBJdCB3aWxsIGJlIHVzZWQgd2hpbGUKKyAqIHNvdXJjaW5nIHRoaXMgc2NyaXB0IGFuZCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2NyaXB0LgorICovCisgICAgdm9pZAorbmV3X3NjcmlwdF92YXJzKGlkKQorICAgIHNjaWRfVCBpZDsKK3sKKyAgICBpZiAoZ2FfZ3JvdygmZ2Ffc2NyaXB0cywgKGludCkoaWQgLSBnYV9zY3JpcHRzLmdhX2xlbikpID09IE9LKQorICAgIHsKKwl3aGlsZSAoZ2Ffc2NyaXB0cy5nYV9sZW4gPCBpZCkKKwl7CisJICAgIHZhcl9pbml0KCZTQ1JJUFRfVkFSUyhnYV9zY3JpcHRzLmdhX2xlbiArIDEpKTsKKwkgICAgKytnYV9zY3JpcHRzLmdhX2xlbjsKKwkgICAgLS1nYV9zY3JpcHRzLmdhX3Jvb207CisJfQorICAgIH0KK30KKworLyoKKyAqIEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciB1c2UuCisgKi8KKyAgICB2b2lkCit2YXJfaW5pdChnYXApCisgICAgZ2FycmF5X1QgKmdhcDsKK3sKKyAgICBnYV9pbml0MihnYXAsIChpbnQpc2l6ZW9mKHZhciksIDQpOworfQorCisvKgorICogQ2xlYW4gdXAgYSBsaXN0IG9mIGludGVybmFsIHZhcmlhYmxlcy4KKyAqLworICAgIHZvaWQKK3Zhcl9jbGVhcihnYXApCisgICAgZ2FycmF5X1QgKmdhcDsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSBnYXAtPmdhX2xlbjsgLS1pID49IDA7ICkKKwl2YXJfZnJlZV9vbmUoJlZBUl9HQVBfRU5UUlkoaSwgZ2FwKSk7CisgICAgZ2FfY2xlYXIoZ2FwKTsKK30KKworICAgIHN0YXRpYyB2b2lkCit2YXJfZnJlZV9vbmUodikKKyAgICBWQVIJICAgIHY7Cit7CisgICAgdmltX2ZyZWUodi0+dmFyX25hbWUpOworICAgIHYtPnZhcl9uYW1lID0gTlVMTDsKKyAgICBpZiAodi0+dmFyX3R5cGUgPT0gVkFSX1NUUklORykKKwl2aW1fZnJlZSh2LT52YXJfdmFsLnZhcl9zdHJpbmcpOworICAgIHYtPnZhcl92YWwudmFyX3N0cmluZyA9IE5VTEw7Cit9CisKKy8qCisgKiBMaXN0IHRoZSB2YWx1ZSBvZiBvbmUgaW50ZXJuYWwgdmFyaWFibGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbGlzdF9vbmVfdmFyKHYsIHByZWZpeCkKKyAgICBWQVIJCXY7CisgICAgY2hhcl91CSpwcmVmaXg7Cit7CisgICAgbGlzdF9vbmVfdmFyX2EocHJlZml4LCB2LT52YXJfbmFtZSwgdi0+dmFyX3R5cGUsIGdldF92YXJfc3RyaW5nKHYpKTsKK30KKworLyoKKyAqIExpc3QgdGhlIHZhbHVlIG9mIG9uZSAidjoiIHZhcmlhYmxlLgorICovCisgICAgc3RhdGljIHZvaWQKK2xpc3RfdmltX3ZhcihpKQorICAgIGludAkJaTsJLyogaW5kZXggaW4gdmltdmFyc1tdICovCit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQludW1idWZbTlVNQlVGTEVOXTsKKworICAgIGlmICh2aW12YXJzW2ldLnR5cGUgPT0gVkFSX05VTUJFUikKKyAgICB7CisJcCA9IG51bWJ1ZjsKKwlzcHJpbnRmKChjaGFyICopcCwgIiVsZCIsIChsb25nKXZpbXZhcnNbaV0udmFsKTsKKyAgICB9CisgICAgZWxzZSBpZiAodmltdmFyc1tpXS52YWwgPT0gTlVMTCkKKwlwID0gKGNoYXJfdSAqKSIiOworICAgIGVsc2UKKwlwID0gdmltdmFyc1tpXS52YWw7CisgICAgbGlzdF9vbmVfdmFyX2EoKGNoYXJfdSAqKSJ2OiIsIChjaGFyX3UgKil2aW12YXJzW2ldLm5hbWUsCisJCQkJCQkJICB2aW12YXJzW2ldLnR5cGUsIHApOworfQorCisgICAgc3RhdGljIHZvaWQKK2xpc3Rfb25lX3Zhcl9hKHByZWZpeCwgbmFtZSwgdHlwZSwgc3RyaW5nKQorICAgIGNoYXJfdQkqcHJlZml4OworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCXR5cGU7CisgICAgY2hhcl91CSpzdHJpbmc7Cit7CisgICAgbXNnX2F0dHIocHJlZml4LCAwKTsgICAgLyogZG9uJ3QgdXNlIG1zZygpLCBpdCBvdmVyd3JpdGVzICJ2OnN0YXR1c21zZyIgKi8KKyAgICBpZiAobmFtZSAhPSBOVUxMKQkvKiAiYToiIHZhcnMgZG9uJ3QgaGF2ZSBhIG5hbWUgc3RvcmVkICovCisJbXNnX3B1dHMobmFtZSk7CisgICAgbXNnX3B1dGNoYXIoJyAnKTsKKyAgICBtc2dfYWR2YW5jZSgyMik7CisgICAgaWYgKHR5cGUgPT0gVkFSX05VTUJFUikKKwltc2dfcHV0Y2hhcignIycpOworICAgIGVsc2UKKwltc2dfcHV0Y2hhcignICcpOworICAgIG1zZ19vdXR0cmFucyhzdHJpbmcpOworfQorCisvKgorICogU2V0IHZhcmlhYmxlICJuYW1lIiB0byB2YWx1ZSBpbiAidmFycCIuCisgKiBJZiB0aGUgdmFyaWFibGUgYWxyZWFkeSBleGlzdHMsIHRoZSB2YWx1ZSBpcyB1cGRhdGVkLgorICogT3RoZXJ3aXNlIHRoZSB2YXJpYWJsZSBpcyBjcmVhdGVkLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF92YXIobmFtZSwgdmFycCkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgVkFSCQl2YXJwOworeworICAgIGludAkJaTsKKyAgICBWQVIJCXY7CisgICAgY2hhcl91CSp2YXJuYW1lOworICAgIGdhcnJheV9UCSpnYXA7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSBzZXR0aW5nIGludGVybmFsIHY6IHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBpID0gZmluZF92aW1fdmFyKG5hbWUsIChpbnQpU1RSTEVOKG5hbWUpKTsKKyAgICBpZiAoaSA+PSAwKQorICAgIHsKKwlpZiAodmltdmFyc1tpXS5mbGFncyAmIFZWX1JPKQorCSAgICBFTVNHMihfKGVfcmVhZG9ubHl2YXIpLCBuYW1lKTsKKwllbHNlCisJeworCSAgICBpZiAodmltdmFyc1tpXS50eXBlID09IFZBUl9TVFJJTkcpCisJICAgIHsKKwkJdmltX2ZyZWUodmltdmFyc1tpXS52YWwpOworCQl2aW12YXJzW2ldLnZhbCA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKHZhcnApKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXZpbXZhcnNbaV0udmFsID0gKGNoYXJfdSAqKShsb25nKXZhcnAtPnZhcl92YWwudmFyX251bWJlcjsKKwl9CisJcmV0dXJuOworICAgIH0KKworICAgIHYgPSBmaW5kX3ZhcihuYW1lLCBUUlVFKTsKKyAgICBpZiAodiAhPSBOVUxMKQkgICAgLyogZXhpc3RpbmcgdmFyaWFibGUsIG9ubHkgbmVlZCB0byBmcmVlIHN0cmluZyAqLworICAgIHsKKwlpZiAodi0+dmFyX3R5cGUgPT0gVkFSX1NUUklORykKKwkgICAgdmltX2ZyZWUodi0+dmFyX3ZhbC52YXJfc3RyaW5nKTsKKyAgICB9CisgICAgZWxzZQkJICAgIC8qIGFkZCBhIG5ldyB2YXJpYWJsZSAqLworICAgIHsKKwlnYXAgPSBmaW5kX3Zhcl9nYShuYW1lLCAmdmFybmFtZSk7CisJaWYgKGdhcCA9PSBOVUxMKSAgICAvKiBpbGxlZ2FsIG5hbWUgKi8KKwl7CisJICAgIEVNU0cyKF8oIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiKSwgbmFtZSk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBUcnkgdG8gdXNlIGFuIGVtcHR5IGVudHJ5ICovCisJZm9yIChpID0gZ2FwLT5nYV9sZW47IC0taSA+PSAwOyApCisJICAgIGlmIChWQVJfR0FQX0VOVFJZKGksIGdhcCkudmFyX25hbWUgPT0gTlVMTCkKKwkJYnJlYWs7CisJaWYgKGkgPCAwKQkgICAgLyogbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHJvb20gKi8KKwl7CisJICAgIGlmIChnYV9ncm93KGdhcCwgMSkgPT0gRkFJTCkKKwkJcmV0dXJuOworCSAgICBpID0gZ2FwLT5nYV9sZW47CisJfQorCXYgPSAmVkFSX0dBUF9FTlRSWShpLCBnYXApOworCWlmICgodi0+dmFyX25hbWUgPSB2aW1fc3Ryc2F2ZSh2YXJuYW1lKSkgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCWlmIChpID09IGdhcC0+Z2FfbGVuKQorCXsKKwkgICAgKytnYXAtPmdhX2xlbjsKKwkgICAgLS1nYXAtPmdhX3Jvb207CisJfQorICAgIH0KKyAgICBjb3B5X3Zhcih2YXJwLCB2KTsKK30KKworICAgIHN0YXRpYyB2b2lkCitjb3B5X3Zhcihmcm9tLCB0bykKKyAgICBWQVIJZnJvbTsKKyAgICBWQVIJdG87Cit7CisgICAgdG8tPnZhcl90eXBlID0gZnJvbS0+dmFyX3R5cGU7CisgICAgaWYgKGZyb20tPnZhcl90eXBlID09IFZBUl9TVFJJTkcpCisJdG8tPnZhcl92YWwudmFyX3N0cmluZyA9IHZpbV9zdHJzYXZlKGdldF92YXJfc3RyaW5nKGZyb20pKTsKKyAgICBlbHNlCisJdG8tPnZhcl92YWwudmFyX251bWJlciA9IGZyb20tPnZhcl92YWwudmFyX251bWJlcjsKK30KKworLyoKKyAqICI6ZWNobyBleHByMSAuLi4iCXByaW50IGVhY2ggYXJndW1lbnQgc2VwYXJhdGVkIHdpdGggYSBzcGFjZSwgYWRkIGEKKyAqCQkJbmV3bGluZSBhdCB0aGUgZW5kLgorICogIjplY2hvbiBleHByMSAuLi4iCXByaW50IGVhY2ggYXJndW1lbnQgcGxhaW4uCisgKi8KKyAgICB2b2lkCitleF9lY2hvKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICB2YXIJCXJldHZhcjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQluZWVkY2xyID0gVFJVRTsKKyAgICBpbnQJCWF0c3RhcnQgPSBUUlVFOworCisgICAgaWYgKGVhcC0+c2tpcCkKKwkrK2Vtc2dfc2tpcDsKKyAgICB3aGlsZSAoKmFyZyAhPSBOVUwgJiYgKmFyZyAhPSAnfCcgJiYgKmFyZyAhPSAnXG4nICYmICFnb3RfaW50KQorICAgIHsKKwlwID0gYXJnOworCWlmIChldmFsMSgmYXJnLCAmcmV0dmFyLCAhZWFwLT5za2lwKSA9PSBGQUlMKQorCXsKKwkgICAgLyoKKwkgICAgICogUmVwb3J0IHRoZSBpbnZhbGlkIGV4cHJlc3Npb24gdW5sZXNzIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24KKwkgICAgICogaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbiBhYm9ydGluZyBlcnJvciwgYW4gaW50ZXJydXB0LCBvciBhbgorCSAgICAgKiBleGNlcHRpb24uCisJICAgICAqLworCSAgICBpZiAoIWFib3J0aW5nKCkpCisJCUVNU0cyKF8oZV9pbnZleHByMiksIHApOworCSAgICBicmVhazsKKwl9CisJaWYgKCFlYXAtPnNraXApCisJeworCSAgICBpZiAoYXRzdGFydCkKKwkgICAgeworCQlhdHN0YXJ0ID0gRkFMU0U7CisJCS8qIENhbGwgbXNnX3N0YXJ0KCkgYWZ0ZXIgZXZhbDEoKSwgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgorCQkgKiBtYXkgY2F1c2UgYSBtZXNzYWdlIHRvIGFwcGVhci4gKi8KKwkJaWYgKGVhcC0+Y21kaWR4ID09IENNRF9lY2hvKQorCQkgICAgbXNnX3N0YXJ0KCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2VjaG8pCisJCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSIgIiwgZWNob19hdHRyKTsKKwkgICAgZm9yIChwID0gZ2V0X3Zhcl9zdHJpbmcoJnJldHZhcik7ICpwICE9IE5VTCAmJiAhZ290X2ludDsgKytwKQorCQlpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8ICpwID09IFRBQikKKwkJeworCQkgICAgaWYgKCpwICE9IFRBQiAmJiBuZWVkY2xyKQorCQkgICAgeworCQkJLyogcmVtb3ZlIGFueSB0ZXh0IHN0aWxsIHRoZXJlIGZyb20gdGhlIGNvbW1hbmQgKi8KKwkJCW1zZ19jbHJfZW9zKCk7CisJCQluZWVkY2xyID0gRkFMU0U7CisJCSAgICB9CisJCSAgICBtc2dfcHV0Y2hhcl9hdHRyKCpwLCBlY2hvX2F0dHIpOworCQl9CisJCWVsc2UKKwkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCSAgICB7CisJCQlpbnQgaSA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisKKwkJCSh2b2lkKW1zZ19vdXR0cmFuc19sZW5fYXR0cihwLCBpLCBlY2hvX2F0dHIpOworCQkJcCArPSBpIC0gMTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJKHZvaWQpbXNnX291dHRyYW5zX2xlbl9hdHRyKHAsIDEsIGVjaG9fYXR0cik7CisJCX0KKwl9CisJY2xlYXJfdmFyKCZyZXR2YXIpOworCWFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIH0KKyAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGFyZyk7CisKKyAgICBpZiAoZWFwLT5za2lwKQorCS0tZW1zZ19za2lwOworICAgIGVsc2UKKyAgICB7CisJLyogcmVtb3ZlIHRleHQgdGhhdCBtYXkgc3RpbGwgYmUgdGhlcmUgZnJvbSB0aGUgY29tbWFuZCAqLworCWlmIChuZWVkY2xyKQorCSAgICBtc2dfY2xyX2VvcygpOworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfZWNobykKKwkgICAgbXNnX2VuZCgpOworICAgIH0KK30KKworLyoKKyAqICI6ZWNob2hsIHtuYW1lfSIuCisgKi8KKyAgICB2b2lkCitleF9lY2hvaGwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWlkOworCisgICAgaWQgPSBzeW5fbmFtZTJpZChlYXAtPmFyZyk7CisgICAgaWYgKGlkID09IDApCisJZWNob19hdHRyID0gMDsKKyAgICBlbHNlCisJZWNob19hdHRyID0gc3luX2lkMmF0dHIoaWQpOworfQorCisvKgorICogIjpleGVjdXRlIGV4cHIxIC4uLiIJZXhlY3V0ZSB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24uCisgKiAiOmVjaG9tc2cgZXhwcjEgLi4uIglQcmludCBhIG1lc3NhZ2UKKyAqICI6ZWNob2VyciBleHByMSAuLi4iCVByaW50IGFuIGVycm9yCisgKiBFYWNoIGdldHMgc3BhY2VzIGFyb3VuZCBlYWNoIGFyZ3VtZW50IGFuZCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBmb3IKKyAqIGVjaG8gY29tbWFuZHMKKyAqLworICAgIHZvaWQKK2V4X2V4ZWN1dGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOworICAgIHZhcgkJcmV0dmFyOworICAgIGludAkJcmV0ID0gT0s7CisgICAgY2hhcl91CSpwOworICAgIGdhcnJheV9UCWdhOworICAgIGludAkJbGVuOworICAgIGludAkJc2F2ZV9kaWRfZW1zZzsKKworICAgIGdhX2luaXQyKCZnYSwgMSwgODApOworCisgICAgaWYgKGVhcC0+c2tpcCkKKwkrK2Vtc2dfc2tpcDsKKyAgICB3aGlsZSAoKmFyZyAhPSBOVUwgJiYgKmFyZyAhPSAnfCcgJiYgKmFyZyAhPSAnXG4nKQorICAgIHsKKwlwID0gYXJnOworCWlmIChldmFsMSgmYXJnLCAmcmV0dmFyLCAhZWFwLT5za2lwKSA9PSBGQUlMKQorCXsKKwkgICAgLyoKKwkgICAgICogUmVwb3J0IHRoZSBpbnZhbGlkIGV4cHJlc3Npb24gdW5sZXNzIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24KKwkgICAgICogaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbiBhYm9ydGluZyBlcnJvciwgYW4gaW50ZXJydXB0LCBvciBhbgorCSAgICAgKiBleGNlcHRpb24uCisJICAgICAqLworCSAgICBpZiAoIWFib3J0aW5nKCkpCisJCUVNU0cyKF8oZV9pbnZleHByMiksIHApOworCSAgICByZXQgPSBGQUlMOworCSAgICBicmVhazsKKwl9CisKKwlpZiAoIWVhcC0+c2tpcCkKKwl7CisJICAgIHAgPSBnZXRfdmFyX3N0cmluZygmcmV0dmFyKTsKKwkgICAgbGVuID0gKGludClTVFJMRU4ocCk7CisJICAgIGlmIChnYV9ncm93KCZnYSwgbGVuICsgMikgPT0gRkFJTCkKKwkgICAgeworCQljbGVhcl92YXIoJnJldHZhcik7CisJCXJldCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChnYS5nYV9sZW4pCisJICAgIHsKKwkJKChjaGFyX3UgKikoZ2EuZ2FfZGF0YSkpW2dhLmdhX2xlbisrXSA9ICcgJzsKKwkJLS1nYS5nYV9yb29tOworCSAgICB9CisJICAgIFNUUkNQWSgoY2hhcl91ICopKGdhLmdhX2RhdGEpICsgZ2EuZ2FfbGVuLCBwKTsKKwkgICAgZ2EuZ2Ffcm9vbSAtPSBsZW47CisJICAgIGdhLmdhX2xlbiArPSBsZW47CisJfQorCisJY2xlYXJfdmFyKCZyZXR2YXIpOworCWFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIH0KKworICAgIGlmIChyZXQgIT0gRkFJTCAmJiBnYS5nYV9kYXRhICE9IE5VTEwpCisgICAgeworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfZWNob21zZykKKwkgICAgTVNHX0FUVFIoZ2EuZ2FfZGF0YSwgZWNob19hdHRyKTsKKwllbHNlIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfZWNob2VycikKKwl7CisJICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gYWJvcnQgZm9sbG93aW5nIGNvbW1hbmRzLCByZXN0b3JlIGRpZF9lbXNnLiAqLworCSAgICBzYXZlX2RpZF9lbXNnID0gZGlkX2Vtc2c7CisJICAgIEVNU0coKGNoYXJfdSAqKWdhLmdhX2RhdGEpOworCSAgICBpZiAoIWZvcmNlX2Fib3J0KQorCQlkaWRfZW1zZyA9IHNhdmVfZGlkX2Vtc2c7CisJfQorCWVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9leGVjdXRlKQorCSAgICBkb19jbWRsaW5lKChjaGFyX3UgKilnYS5nYV9kYXRhLAorCQkgICAgICAgZWFwLT5nZXRsaW5lLCBlYXAtPmNvb2tpZSwgRE9DTURfTk9XQUlUfERPQ01EX1ZFUkJPU0UpOworICAgIH0KKworICAgIGdhX2NsZWFyKCZnYSk7CisKKyAgICBpZiAoZWFwLT5za2lwKQorCS0tZW1zZ19za2lwOworCisgICAgZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChhcmcpOworfQorCisvKgorICogU2tpcCBvdmVyIHRoZSBuYW1lIG9mIGFuIG9wdGlvbjogIiZvcHRpb24iLCAiJmc6b3B0aW9uIiBvciAiJmw6b3B0aW9uIi4KKyAqICJhcmciIHBvaW50cyB0byB0aGUgIiYiIG9yICcrJyB3aGVuIGNhbGxlZCwgdG8gIm9wdGlvbiIgd2hlbiByZXR1cm5pbmcuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBubyBvcHRpb24gbmFtZSBmb3VuZC4gIE90aGVyd2lzZSBwb2ludGVyIHRvIHRoZSBjaGFyCisgKiBhZnRlciB0aGUgb3B0aW9uIG5hbWUuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2ZpbmRfb3B0aW9uX2VuZChhcmcsIG9wdF9mbGFncykKKyAgICBjaGFyX3UJKiphcmc7CisgICAgaW50CQkqb3B0X2ZsYWdzOworeworICAgIGNoYXJfdQkqcCA9ICphcmc7CisKKyAgICArK3A7CisgICAgaWYgKCpwID09ICdnJyAmJiBwWzFdID09ICc6JykKKyAgICB7CisJKm9wdF9mbGFncyA9IE9QVF9HTE9CQUw7CisJcCArPSAyOworICAgIH0KKyAgICBlbHNlIGlmICgqcCA9PSAnbCcgJiYgcFsxXSA9PSAnOicpCisgICAgeworCSpvcHRfZmxhZ3MgPSBPUFRfTE9DQUw7CisJcCArPSAyOworICAgIH0KKyAgICBlbHNlCisJKm9wdF9mbGFncyA9IDA7CisKKyAgICBpZiAoIUFTQ0lJX0lTQUxQSEEoKnApKQorCXJldHVybiBOVUxMOworICAgICphcmcgPSBwOworCisgICAgaWYgKHBbMF0gPT0gJ3QnICYmIHBbMV0gPT0gJ18nICYmIHBbMl0gIT0gTlVMICYmIHBbM10gIT0gTlVMKQorCXAgKz0gNDsJICAgIC8qIHRlcm1jYXAgb3B0aW9uICovCisgICAgZWxzZQorCXdoaWxlIChBU0NJSV9JU0FMUEhBKCpwKSkKKwkgICAgKytwOworICAgIHJldHVybiBwOworfQorCisvKgorICogIjpmdW5jdGlvbiIKKyAqLworICAgIHZvaWQKK2V4X2Z1bmN0aW9uKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSp0aGVsaW5lOworICAgIGludAkJajsKKyAgICBpbnQJCWM7CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKyAgICBpbnQJCXNhdmVkX2RpZF9lbXNnOworI2VuZGlmCisgICAgY2hhcl91CSpuYW1lID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSphcmc7CisgICAgZ2FycmF5X1QJbmV3YXJnczsKKyAgICBnYXJyYXlfVAluZXdsaW5lczsKKyAgICBpbnQJCXZhcmFyZ3MgPSBGQUxTRTsKKyAgICBpbnQJCW11c3RlbmQgPSBGQUxTRTsKKyAgICBpbnQJCWZsYWdzID0gMDsKKyAgICB1ZnVuY19UCSpmcDsKKyAgICBpbnQJCWluZGVudDsKKyAgICBpbnQJCW5lc3Rpbmc7CisgICAgY2hhcl91CSpza2lwX3VudGlsID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhcl91IGVfZnVuY2V4dHNbXSA9IE5fKCJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIpOworCisgICAgLyoKKyAgICAgKiAiOmZ1bmN0aW9uIiB3aXRob3V0IGFyZ3VtZW50OiBsaXN0IGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoZW5kc19leGNtZCgqZWFwLT5hcmcpKQorICAgIHsKKwlpZiAoIWVhcC0+c2tpcCkKKwkgICAgZm9yIChmcCA9IGZpcnN0ZnVuYzsgZnAgIT0gTlVMTCAmJiAhZ290X2ludDsgZnAgPSBmcC0+bmV4dCkKKwkJbGlzdF9mdW5jX2hlYWQoZnAsIEZBTFNFKTsKKwllYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGVhcC0+YXJnKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcCA9IGVhcC0+YXJnOworICAgIG5hbWUgPSB0cmFuc19mdW5jdGlvbl9uYW1lKCZwLCBlYXAtPnNraXAsIEZBTFNFKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMICYmICFlYXAtPnNraXApCisgICAgeworCS8qCisJICogUmV0dXJuIG9uIGFuIGludmFsaWQgZXhwcmVzc2lvbiBpbiBicmFjZXMsIHVubGVzcyB0aGUgZXhwcmVzc2lvbgorCSAqIGV2YWx1YXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbiBhYm9ydGluZyBlcnJvciwgYW4KKwkgKiBpbnRlcnJ1cHQsIG9yIGFuIGV4Y2VwdGlvbi4KKwkgKi8KKwlpZiAoIWFib3J0aW5nKCkpCisJICAgIHJldHVybjsKKwllbHNlCisJICAgIGVhcC0+c2tpcCA9IFRSVUU7CisgICAgfQorI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisgICAgLyogQW4gZXJyb3IgaW4gYSBmdW5jdGlvbiBjYWxsIGR1cmluZyBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gbWFnaWMKKyAgICAgKiBicmFjZXMgc2hvdWxkIG5vdCBjYXVzZSB0aGUgZnVuY3Rpb24gbm90IHRvIGJlIGRlZmluZWQuICovCisgICAgc2F2ZWRfZGlkX2Vtc2cgPSBkaWRfZW1zZzsKKyAgICBkaWRfZW1zZyA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqICI6ZnVuY3Rpb24gZnVuYyIgd2l0aCBvbmx5IGZ1bmN0aW9uIG5hbWU6IGxpc3QgZnVuY3Rpb24uCisgICAgICovCisgICAgaWYgKHZpbV9zdHJjaHIocCwgJygnKSA9PSBOVUxMKQorICAgIHsKKwlpZiAoIWVuZHNfZXhjbWQoKnNraXB3aGl0ZShwKSkpCisJeworCSAgICBFTVNHKF8oZV90cmFpbGluZykpOworCSAgICBnb3RvIGVycmV0X25hbWU7CisJfQorCWVhcC0+bmV4dGNtZCA9IGNoZWNrX25leHRjbWQocCk7CisJaWYgKGVhcC0+bmV4dGNtZCAhPSBOVUxMKQorCSAgICAqcCA9IE5VTDsKKwlpZiAoIWVhcC0+c2tpcCAmJiAhZ290X2ludCkKKwl7CisJICAgIGZwID0gZmluZF9mdW5jKG5hbWUpOworCSAgICBpZiAoZnAgIT0gTlVMTCkKKwkgICAgeworCQlsaXN0X2Z1bmNfaGVhZChmcCwgVFJVRSk7CisJCWZvciAoaiA9IDA7IGogPCBmcC0+bGluZXMuZ2FfbGVuICYmICFnb3RfaW50OyArK2opCisJCXsKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCQkgICAgbXNnX291dG51bSgobG9uZykoaiArIDEpKTsKKwkJICAgIGlmIChqIDwgOSkKKwkJCW1zZ19wdXRjaGFyKCcgJyk7CisJCSAgICBpZiAoaiA8IDk5KQorCQkJbXNnX3B1dGNoYXIoJyAnKTsKKwkJICAgIG1zZ19wcnRfbGluZShGVU5DTElORShmcCwgaikpOworCQkgICAgb3V0X2ZsdXNoKCk7CS8qIHNob3cgYSBsaW5lIGF0IGEgdGltZSAqLworCQkgICAgdWlfYnJlYWtjaGVjaygpOworCQl9CisJCWlmICghZ290X2ludCkKKwkJeworCQkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJCSAgICBtc2dfcHV0cygoY2hhcl91ICopIiAgIGVuZGZ1bmN0aW9uIik7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJCUVNU0cyKF8oIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiKSwgZWFwLT5hcmcpOworCX0KKwlnb3RvIGVycmV0X25hbWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAiOmZ1bmN0aW9uIG5hbWUoYXJnMSwgYXJnMikiIERlZmluZSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwID0gc2tpcHdoaXRlKHApOworICAgIGlmICgqcCAhPSAnKCcpCisgICAgeworCWlmICghZWFwLT5za2lwKQorCXsKKwkgICAgRU1TRzIoXygiRTEyNDogTWlzc2luZyAnKCc6ICVzIiksIGVhcC0+YXJnKTsKKwkgICAgZ290byBlcnJldF9uYW1lOworCX0KKwkvKiBhdHRlbXB0IHRvIGNvbnRpbnVlIGJ5IHNraXBwaW5nIHNvbWUgdGV4dCAqLworCWlmICh2aW1fc3RyY2hyKHAsICcoJykgIT0gTlVMTCkKKwkgICAgcCA9IHZpbV9zdHJjaHIocCwgJygnKTsKKyAgICB9CisgICAgcCA9IHNraXB3aGl0ZShwICsgMSk7CisKKyAgICBnYV9pbml0MigmbmV3YXJncywgKGludClzaXplb2YoY2hhcl91ICopLCAzKTsKKyAgICBnYV9pbml0MigmbmV3bGluZXMsIChpbnQpc2l6ZW9mKGNoYXJfdSAqKSwgMyk7CisKKyAgICAvKgorICAgICAqIElzb2xhdGUgdGhlIGFyZ3VtZW50czogImFyZzEsIGFyZzIsIC4uLikiCisgICAgICovCisgICAgd2hpbGUgKCpwICE9ICcpJykKKyAgICB7CisJaWYgKHBbMF0gPT0gJy4nICYmIHBbMV0gPT0gJy4nICYmIHBbMl0gPT0gJy4nKQorCXsKKwkgICAgdmFyYXJncyA9IFRSVUU7CisJICAgIHAgKz0gMzsKKwkgICAgbXVzdGVuZCA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJICAgIGFyZyA9IHA7CisJICAgIHdoaWxlIChBU0NJSV9JU0FMTlVNKCpwKSB8fCAqcCA9PSAnXycpCisJCSsrcDsKKwkgICAgaWYgKGFyZyA9PSBwIHx8IGlzZGlnaXQoKmFyZykKKwkJICAgIHx8IChwIC0gYXJnID09IDkgJiYgU1RSTkNNUChhcmcsICJmaXJzdGxpbmUiLCA5KSA9PSAwKQorCQkgICAgfHwgKHAgLSBhcmcgPT0gOCAmJiBTVFJOQ01QKGFyZywgImxhc3RsaW5lIiwgOCkgPT0gMCkpCisJICAgIHsKKwkJaWYgKCFlYXAtPnNraXApCisJCSAgICBFTVNHMihfKCJFMTI1OiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIpLCBhcmcpOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoZ2FfZ3JvdygmbmV3YXJncywgMSkgPT0gRkFJTCkKKwkJZ290byBlcnJldDsKKwkgICAgYyA9ICpwOworCSAgICAqcCA9IE5VTDsKKwkgICAgYXJnID0gdmltX3N0cnNhdmUoYXJnKTsKKwkgICAgaWYgKGFyZyA9PSBOVUxMKQorCQlnb3RvIGVycmV0OworCSAgICAoKGNoYXJfdSAqKikobmV3YXJncy5nYV9kYXRhKSlbbmV3YXJncy5nYV9sZW5dID0gYXJnOworCSAgICAqcCA9IGM7CisJICAgIG5ld2FyZ3MuZ2FfbGVuKys7CisJICAgIG5ld2FyZ3MuZ2Ffcm9vbS0tOworCSAgICBpZiAoKnAgPT0gJywnKQorCQkrK3A7CisJICAgIGVsc2UKKwkJbXVzdGVuZCA9IFRSVUU7CisJfQorCXAgPSBza2lwd2hpdGUocCk7CisJaWYgKG11c3RlbmQgJiYgKnAgIT0gJyknKQorCXsKKwkgICAgaWYgKCFlYXAtPnNraXApCisJCUVNU0cyKF8oZV9pbnZhcmcyKSwgZWFwLT5hcmcpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgICsrcDsJLyogc2tpcCB0aGUgJyknICovCisKKyAgICAvKiBmaW5kIGV4dHJhIGFyZ3VtZW50cyAicmFuZ2UiIGFuZCAiYWJvcnQiICovCisgICAgZm9yICg7OykKKyAgICB7CisJcCA9IHNraXB3aGl0ZShwKTsKKwlpZiAoU1RSTkNNUChwLCAicmFuZ2UiLCA1KSA9PSAwKQorCXsKKwkgICAgZmxhZ3MgfD0gRkNfUkFOR0U7CisJICAgIHAgKz0gNTsKKwl9CisJZWxzZSBpZiAoU1RSTkNNUChwLCAiYWJvcnQiLCA1KSA9PSAwKQorCXsKKwkgICAgZmxhZ3MgfD0gRkNfQUJPUlQ7CisJICAgIHAgKz0gNTsKKwl9CisJZWxzZQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKnAgIT0gTlVMICYmICpwICE9ICciJyAmJiAqcCAhPSAnXG4nICYmICFlYXAtPnNraXAgJiYgIWRpZF9lbXNnKQorCUVNU0coXyhlX3RyYWlsaW5nKSk7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCB1bnRpbCAiOmVuZGZ1bmN0aW9uIiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBpZiAoS2V5VHlwZWQpCisgICAgeworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGV4aXN0cywgZG9uJ3QgbGV0IHRoZSB1c2VyIHR5cGUgdGhlCisJICogd2hvbGUgZnVuY3Rpb24gYmVmb3JlIHRlbGxpbmcgaGltIGl0IGRvZXNuJ3Qgd29yayEgIEZvciBhIHNjcmlwdCB3ZQorCSAqIG5lZWQgdG8gc2tpcCB0aGUgYm9keSB0byBiZSBhYmxlIHRvIGZpbmQgd2hhdCBmb2xsb3dzLiAqLworCWlmICghZWFwLT5za2lwICYmICFlYXAtPmZvcmNlaXQgJiYgZmluZF9mdW5jKG5hbWUpICE9IE5VTEwpCisJICAgIEVNU0cyKF8oZV9mdW5jZXh0cyksIG5hbWUpOworCisJbXNnX3B1dGNoYXIoJ1xuJyk7CSAgICAvKiBkb24ndCBvdmVyd3JpdGUgdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKwljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisgICAgfQorCisgICAgaW5kZW50ID0gMjsKKyAgICBuZXN0aW5nID0gMDsKKyAgICBmb3IgKDs7KQorICAgIHsKKwltc2dfc2Nyb2xsID0gVFJVRTsKKwluZWVkX3dhaXRfcmV0dXJuID0gRkFMU0U7CisJaWYgKGVhcC0+Z2V0bGluZSA9PSBOVUxMKQorCSAgICB0aGVsaW5lID0gZ2V0Y21kbGluZSgnOicsIDBMLCBpbmRlbnQpOworCWVsc2UKKwkgICAgdGhlbGluZSA9IGVhcC0+Z2V0bGluZSgnOicsIGVhcC0+Y29va2llLCBpbmRlbnQpOworCWlmIChLZXlUeXBlZCkKKwkgICAgbGluZXNfbGVmdCA9IFJvd3MgLSAxOworCWlmICh0aGVsaW5lID09IE5VTEwpCisJeworCSAgICBFTVNHKF8oIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIikpOworCSAgICBnb3RvIGVycmV0OworCX0KKworCWlmIChza2lwX3VudGlsICE9IE5VTEwpCisJeworCSAgICAvKiBiZXR3ZWVuICI6YXBwZW5kIiBhbmQgIi4iIGFuZCBiZXR3ZWVuICI6cHl0aG9uIDw8RU9GIiBhbmQgIkVPRiIKKwkgICAgICogZG9uJ3QgY2hlY2sgZm9yICI6ZW5kZnVuYyIuICovCisJICAgIGlmIChTVFJDTVAodGhlbGluZSwgc2tpcF91bnRpbCkgPT0gMCkKKwkgICAgeworCQl2aW1fZnJlZShza2lwX3VudGlsKTsKKwkJc2tpcF91bnRpbCA9IE5VTEw7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLyogc2tpcCAnOicgYW5kIGJsYW5rcyovCisJICAgIGZvciAocCA9IHRoZWxpbmU7IHZpbV9pc3doaXRlKCpwKSB8fCAqcCA9PSAnOic7ICsrcCkKKwkJOworCisJICAgIC8qIENoZWNrIGZvciAiZW5kZnVuY3Rpb24iIChzaG91bGQgYmUgbW9yZSBzdHJpY3QuLi4pLiAqLworCSAgICBpZiAoU1RSTkNNUChwLCAiZW5kZiIsIDQpID09IDAgJiYgbmVzdGluZy0tID09IDApCisJICAgIHsKKwkJdmltX2ZyZWUodGhlbGluZSk7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogSW5jcmVhc2UgaW5kZW50IGluc2lkZSAiaWYiLCAid2hpbGUiLCBhbmQgInRyeSIsIGRlY3JlYXNlCisJICAgICAqIGF0ICJlbmQiLiAqLworCSAgICBpZiAoaW5kZW50ID4gMiAmJiBTVFJOQ01QKHAsICJlbmQiLCAzKSA9PSAwKQorCQlpbmRlbnQgLT0gMjsKKwkgICAgZWxzZSBpZiAoU1RSTkNNUChwLCAiaWYiLCAyKSA9PSAwIHx8IFNUUk5DTVAocCwgIndoIiwgMikgPT0gMAorCQkgICAgfHwgU1RSTkNNUChwLCAidHJ5IiwgMykgPT0gMCkKKwkJaW5kZW50ICs9IDI7CisKKwkgICAgLyogQ2hlY2sgZm9yIGRlZmluaW5nIGEgZnVuY3Rpb24gaW5zaWRlIHRoaXMgZnVuY3Rpb24uICovCisJICAgIGlmIChTVFJOQ01QKHAsICJmdSIsIDIpID09IDApCisJICAgIHsKKwkJcCA9IHNraXB3aGl0ZShza2lwdG93aGl0ZShwKSk7CisJCXAgKz0gZXZhbF9mbmFtZV9zY3JpcHQocCk7CisJCWlmIChBU0NJSV9JU0FMUEhBKCpwKSkKKwkJeworCQkgICAgdmltX2ZyZWUodHJhbnNfZnVuY3Rpb25fbmFtZSgmcCwgVFJVRSwgRkFMU0UpKTsKKwkJICAgIGlmICgqc2tpcHdoaXRlKHApID09ICcoJykKKwkJICAgIHsKKwkJCSsrbmVzdGluZzsKKwkJCWluZGVudCArPSAyOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICAvKiBDaGVjayBmb3IgIjphcHBlbmQiIG9yICI6aW5zZXJ0Ii4gKi8KKwkgICAgcCA9IHNraXBfcmFuZ2UocCwgTlVMTCk7CisJICAgIGlmICgocFswXSA9PSAnYScgJiYgKCFBU0NJSV9JU0FMUEhBKHBbMV0pIHx8IHBbMV0gPT0gJ3AnKSkKKwkJICAgIHx8IChwWzBdID09ICdpJworCQkJJiYgKCFBU0NJSV9JU0FMUEhBKHBbMV0pIHx8IChwWzFdID09ICduJworCQkJCSYmICghQVNDSUlfSVNBTFBIQShwWzJdKSB8fCAocFsyXSA9PSAncycpKSkpKSkKKwkJc2tpcF91bnRpbCA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikiLiIpOworCisJICAgIC8qIENoZWNrIGZvciAiOnB5dGhvbiA8PEVPRiIsICI6dGNsIDw8RU9GIiwgZXRjLiAqLworCSAgICBhcmcgPSBza2lwd2hpdGUoc2tpcHRvd2hpdGUocCkpOworCSAgICBpZiAoYXJnWzBdID09ICc8JyAmJiBhcmdbMV0gPT0nPCcKKwkJICAgICYmICgocFswXSA9PSAncCcgJiYgcFsxXSA9PSAneScKKwkJCQkgICAgJiYgKCFBU0NJSV9JU0FMUEhBKHBbMl0pIHx8IHBbMl0gPT0gJ3QnKSkKKwkJCXx8IChwWzBdID09ICdwJyAmJiBwWzFdID09ICdlJworCQkJCSAgICAmJiAoIUFTQ0lJX0lTQUxQSEEocFsyXSkgfHwgcFsyXSA9PSAncicpKQorCQkJfHwgKHBbMF0gPT0gJ3QnICYmIHBbMV0gPT0gJ2MnCisJCQkJICAgICYmICghQVNDSUlfSVNBTFBIQShwWzJdKSB8fCBwWzJdID09ICdsJykpCisJCQl8fCAocFswXSA9PSAncicgJiYgcFsxXSA9PSAndScgJiYgcFsyXSA9PSAnYicKKwkJCQkgICAgJiYgKCFBU0NJSV9JU0FMUEhBKHBbM10pIHx8IHBbM10gPT0gJ3knKSkKKwkJCSkpCisJICAgIHsKKwkJLyogIjpweXRob24gPDwiIGNvbnRpbnVlcyB1bnRpbCBhIGRvdCwgbGlrZSAiOmFwcGVuZCIgKi8KKwkJcCA9IHNraXB3aGl0ZShhcmcgKyAyKTsKKwkJaWYgKCpwID09IE5VTCkKKwkJICAgIHNraXBfdW50aWwgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIi4iKTsKKwkJZWxzZQorCQkgICAgc2tpcF91bnRpbCA9IHZpbV9zdHJzYXZlKHApOworCSAgICB9CisJfQorCisJLyogQWRkIHRoZSBsaW5lIHRvIHRoZSBmdW5jdGlvbi4gKi8KKwlpZiAoZ2FfZ3JvdygmbmV3bGluZXMsIDEpID09IEZBSUwpCisJICAgIGdvdG8gZXJyZXQ7CisJKChjaGFyX3UgKiopKG5ld2xpbmVzLmdhX2RhdGEpKVtuZXdsaW5lcy5nYV9sZW5dID0gdGhlbGluZTsKKwluZXdsaW5lcy5nYV9sZW4rKzsKKwluZXdsaW5lcy5nYV9yb29tLS07CisgICAgfQorCisgICAgLyogRG9uJ3QgZGVmaW5lIHRoZSBmdW5jdGlvbiB3aGVuIHNraXBwaW5nIGNvbW1hbmRzIG9yIHdoZW4gYW4gZXJyb3Igd2FzCisgICAgICogZGV0ZWN0ZWQuICovCisgICAgaWYgKGVhcC0+c2tpcCB8fCBkaWRfZW1zZykKKwlnb3RvIGVycmV0OworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLCBhZGQgdGhlIGZ1bmN0aW9uCisgICAgICovCisgICAgZnAgPSBmaW5kX2Z1bmMobmFtZSk7CisgICAgaWYgKGZwICE9IE5VTEwpCisgICAgeworCWlmICghZWFwLT5mb3JjZWl0KQorCXsKKwkgICAgRU1TRzIoXyhlX2Z1bmNleHRzKSwgbmFtZSk7CisJICAgIGdvdG8gZXJyZXQ7CisJfQorCWlmIChmcC0+Y2FsbHMpCisJeworCSAgICBFTVNHMihfKCJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIpLCBuYW1lKTsKKwkgICAgZ290byBlcnJldDsKKwl9CisJLyogcmVkZWZpbmUgZXhpc3RpbmcgZnVuY3Rpb24gKi8KKwlnYV9jbGVhcl9zdHJpbmdzKCYoZnAtPmFyZ3MpKTsKKwlnYV9jbGVhcl9zdHJpbmdzKCYoZnAtPmxpbmVzKSk7CisJdmltX2ZyZWUobmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZnAgPSAodWZ1bmNfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YodWZ1bmNfVCkpOworCWlmIChmcCA9PSBOVUxMKQorCSAgICBnb3RvIGVycmV0OworCS8qIGluc2VydCB0aGUgbmV3IGZ1bmN0aW9uIGluIHRoZSBmdW5jdGlvbiBsaXN0ICovCisJZnAtPm5leHQgPSBmaXJzdGZ1bmM7CisJZmlyc3RmdW5jID0gZnA7CisJZnAtPm5hbWUgPSBuYW1lOworICAgIH0KKyAgICBmcC0+YXJncyA9IG5ld2FyZ3M7CisgICAgZnAtPmxpbmVzID0gbmV3bGluZXM7CisgICAgZnAtPnZhcmFyZ3MgPSB2YXJhcmdzOworICAgIGZwLT5mbGFncyA9IGZsYWdzOworICAgIGZwLT5jYWxscyA9IDA7CisgICAgZnAtPnNjcmlwdF9JRCA9IGN1cnJlbnRfU0lEOworI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisgICAgZGlkX2Vtc2cgfD0gc2F2ZWRfZGlkX2Vtc2c7CisjZW5kaWYKKyAgICB2aW1fZnJlZShza2lwX3VudGlsKTsKKyAgICByZXR1cm47CisKK2VycmV0OgorICAgIHZpbV9mcmVlKHNraXBfdW50aWwpOworICAgIGdhX2NsZWFyX3N0cmluZ3MoJm5ld2FyZ3MpOworICAgIGdhX2NsZWFyX3N0cmluZ3MoJm5ld2xpbmVzKTsKK2VycmV0X25hbWU6CisgICAgdmltX2ZyZWUobmFtZSk7CisjaWZkZWYgRkVBVF9NQUdJQ19CUkFDRVMKKyAgICBkaWRfZW1zZyB8PSBzYXZlZF9kaWRfZW1zZzsKKyNlbmRpZgorfQorCisvKgorICogR2V0IGEgZnVuY3Rpb24gbmFtZSwgdHJhbnNsYXRpbmcgIjxTSUQ+IiBhbmQgIjxTTlI+Ii4KKyAqIFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgTlVMTCBmb3IgZmFpbHVyZS4KKyAqIEFkdmFuY2VzICJwcCIgdG8ganVzdCBhZnRlciB0aGUgZnVuY3Rpb24gbmFtZSAoaWYgbm8gZXJyb3IpLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCit0cmFuc19mdW5jdGlvbl9uYW1lKHBwLCBza2lwLCBpbnRlcm5hbCkKKyAgICBjaGFyX3UJKipwcDsKKyAgICBpbnQJCXNraXA7CQkvKiBvbmx5IGZpbmQgdGhlIGVuZCwgZG9uJ3QgZXZhbHVhdGUgKi8KKyAgICBpbnQJCWludGVybmFsOwkvKiBUUlVFIGlmIGludGVybmFsIGZ1bmN0aW9uIG5hbWUgT0sgKi8KK3sKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSpzdGFydDsKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBpbnQJCWxlYWQ7CisgICAgY2hhcl91CXNpZF9idWZbMjBdOworICAgIGNoYXJfdQkqdGVtcF9zdHJpbmcgPSBOVUxMOworICAgIGNoYXJfdQkqZXhwcl9zdGFydCwgKmV4cHJfZW5kOworICAgIGludAkJbGVuOworCisgICAgLyogQSBuYW1lIHN0YXJ0aW5nIHdpdGggIjxTSUQ+IiBvciAiPFNOUj4iIGlzIGxvY2FsIHRvIGEgc2NyaXB0LiAqLworICAgIHN0YXJ0ID0gKnBwOworICAgIGxlYWQgPSBldmFsX2ZuYW1lX3NjcmlwdChzdGFydCk7CisgICAgaWYgKGxlYWQgPiAwKQorCXN0YXJ0ICs9IGxlYWQ7CisgICAgZW5kID0gZmluZF9uYW1lX2VuZChzdGFydCwgJmV4cHJfc3RhcnQsICZleHByX2VuZCk7CisgICAgaWYgKGVuZCA9PSBzdGFydCkKKyAgICB7CisJaWYgKCFza2lwKQorCSAgICBFTVNHKF8oIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorI2lmZGVmIEZFQVRfTUFHSUNfQlJBQ0VTCisgICAgaWYgKGV4cHJfc3RhcnQgIT0gTlVMTCAmJiAhc2tpcCkKKyAgICB7CisJLyogZXhwYW5kIG1hZ2ljIGN1cmxpZXMgKi8KKwl0ZW1wX3N0cmluZyA9IG1ha2VfZXhwYW5kZWRfbmFtZShzdGFydCwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGVuZCk7CisJaWYgKHRlbXBfc3RyaW5nID09IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBSZXBvcnQgYW4gaW52YWxpZCBleHByZXNzaW9uIGluIGJyYWNlcywgdW5sZXNzIHRoZSBleHByZXNzaW9uCisJICAgICAqIGV2YWx1YXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBhbiBhYm9ydGluZyBlcnJvciwgYW4KKwkgICAgICogaW50ZXJydXB0LCBvciBhbiBleGNlcHRpb24uCisJICAgICAqLworCSAgICBpZiAoIWFib3J0aW5nKCkpCisJCUVNU0cyKF8oZV9pbnZhcmcyKSwgc3RhcnQpOworCSAgICBlbHNlCisJCSpwcCA9IGVuZDsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCXN0YXJ0ID0gdGVtcF9zdHJpbmc7CisJbGVuID0gKGludClTVFJMRU4odGVtcF9zdHJpbmcpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlsZW4gPSAoaW50KShlbmQgLSBzdGFydCk7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAgICAgKiBBY2NlcHQgPFNJRD5uYW1lKCkgaW5zaWRlIGEgc2NyaXB0LCB0cmFuc2xhdGUgaW50byA8U05SPjEyM19uYW1lKCkuCisgICAgICogQWNjZXB0IDxTTlI+MTIzX25hbWUoKSBvdXRzaWRlIGEgc2NyaXB0LgorICAgICAqLworICAgIGlmIChza2lwKQorCWxlYWQgPSAwOwkvKiBkbyBub3RoaW5nICovCisgICAgZWxzZSBpZiAobGVhZCA+IDApCisgICAgeworCWxlYWQgPSAzOworCWlmIChldmFsX2ZuYW1lX3NpZCgqcHApKQkvKiBJZiBpdCdzICI8U0lEPiIgKi8KKwl7CisJICAgIGlmIChjdXJyZW50X1NJRCA8PSAwKQorCSAgICB7CisJCUVNU0coXyhlX3VzaW5nc2lkKSk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIHNwcmludGYoKGNoYXIgKilzaWRfYnVmLCAiJWxkXyIsIChsb25nKWN1cnJlbnRfU0lEKTsKKwkgICAgbGVhZCArPSAoaW50KVNUUkxFTihzaWRfYnVmKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKCFpbnRlcm5hbCAmJiAhQVNDSUlfSVNVUFBFUigqc3RhcnQpKQorICAgIHsKKwlFTVNHMihfKCJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIiksIHN0YXJ0KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IGFsbG9jKCh1bnNpZ25lZCkobGVuICsgbGVhZCArIDEpKTsKKyAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKwlpZiAobGVhZCA+IDApCisJeworCSAgICBuYW1lWzBdID0gS19TUEVDSUFMOworCSAgICBuYW1lWzFdID0gS1NfRVhUUkE7CisJICAgIG5hbWVbMl0gPSAoaW50KUtFX1NOUjsKKwkgICAgaWYgKGV2YWxfZm5hbWVfc2lkKCpwcCkpCS8qIElmIGl0J3MgIjxTSUQ+IiAqLworCQlTVFJDUFkobmFtZSArIDMsIHNpZF9idWYpOworCX0KKwltY2hfbWVtbW92ZShuYW1lICsgbGVhZCwgc3RhcnQsIChzaXplX3QpbGVuKTsKKwluYW1lW2xlbiArIGxlYWRdID0gTlVMOworICAgIH0KKyAgICAqcHAgPSBlbmQ7CisKKyAgICB2aW1fZnJlZSh0ZW1wX3N0cmluZyk7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8qCisgKiBSZXR1cm4gNSBpZiAicCIgc3RhcnRzIHdpdGggIjxTSUQ+IiBvciAiPFNOUj4iIChpZ25vcmluZyBjYXNlKS4KKyAqIFJldHVybiAyIGlmICJwIiBzdGFydHMgd2l0aCAiczoiLgorICogUmV0dXJuIDAgb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGludAorZXZhbF9mbmFtZV9zY3JpcHQocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaWYgKHBbMF0gPT0gJzwnICYmIChTVFJOSUNNUChwICsgMSwgIlNJRD4iLCA0KSA9PSAwCisJCQkJCSAgfHwgU1RSTklDTVAocCArIDEsICJTTlI+IiwgNCkgPT0gMCkpCisJcmV0dXJuIDU7CisgICAgaWYgKHBbMF0gPT0gJ3MnICYmIHBbMV0gPT0gJzonKQorCXJldHVybiAyOworICAgIHJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgInAiIHN0YXJ0cyB3aXRoICI8U0lEPiIgb3IgInM6Ii4KKyAqIE9ubHkgd29ya3MgaWYgZXZhbF9mbmFtZV9zY3JpcHQoKSByZXR1cm5lZCBub24temVybyBmb3IgInAiIQorICovCisgICAgc3RhdGljIGludAorZXZhbF9mbmFtZV9zaWQocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgcmV0dXJuICgqcCA9PSAncycgfHwgVE9VUFBFUl9BU0MocFsyXSkgPT0gJ0knKTsKK30KKworLyoKKyAqIExpc3QgdGhlIGhlYWQgb2YgdGhlIGZ1bmN0aW9uOiAibmFtZShhcmcxLCBhcmcyKSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbGlzdF9mdW5jX2hlYWQoZnAsIGluZGVudCkKKyAgICB1ZnVuY19UCSpmcDsKKyAgICBpbnQJCWluZGVudDsKK3sKKyAgICBpbnQJCWo7CisKKyAgICBtc2dfc3RhcnQoKTsKKyAgICBpZiAoaW5kZW50KQorCU1TR19QVVRTKCIgICAiKTsKKyAgICBNU0dfUFVUUygiZnVuY3Rpb24gIik7CisgICAgaWYgKGZwLT5uYW1lWzBdID09IEtfU1BFQ0lBTCkKKyAgICB7CisJTVNHX1BVVFNfQVRUUigiPFNOUj4iLCBobF9hdHRyKEhMRl84KSk7CisJbXNnX3B1dHMoZnAtPm5hbWUgKyAzKTsKKyAgICB9CisgICAgZWxzZQorCW1zZ19wdXRzKGZwLT5uYW1lKTsKKyAgICBtc2dfcHV0Y2hhcignKCcpOworICAgIGZvciAoaiA9IDA7IGogPCBmcC0+YXJncy5nYV9sZW47ICsraikKKyAgICB7CisJaWYgKGopCisJICAgIE1TR19QVVRTKCIsICIpOworCW1zZ19wdXRzKEZVTkNBUkcoZnAsIGopKTsKKyAgICB9CisgICAgaWYgKGZwLT52YXJhcmdzKQorICAgIHsKKwlpZiAoaikKKwkgICAgTVNHX1BVVFMoIiwgIik7CisJTVNHX1BVVFMoIi4uLiIpOworICAgIH0KKyAgICBtc2dfcHV0Y2hhcignKScpOworfQorCisvKgorICogRmluZCBhIGZ1bmN0aW9uIGJ5IG5hbWUsIHJldHVybiBwb2ludGVyIHRvIGl0IGluIHVmdW5jcy4KKyAqIFJldHVybiBOVUxMIGZvciB1bmtub3duIGZ1bmN0aW9uLgorICovCisgICAgc3RhdGljIHVmdW5jX1QgKgorZmluZF9mdW5jKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIHVmdW5jX1QJKmZwOworCisgICAgZm9yIChmcCA9IGZpcnN0ZnVuYzsgZnAgIT0gTlVMTDsgZnAgPSBmcC0+bmV4dCkKKwlpZiAoU1RSQ01QKG5hbWUsIGZwLT5uYW1lKSA9PSAwKQorCSAgICBicmVhazsKKyAgICByZXR1cm4gZnA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgdXNlciBkZWZpbmVkCisgKiBmdW5jdGlvbiBuYW1lcy4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfdXNlcl9mdW5jX25hbWUoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgc3RhdGljIHVmdW5jX1QgKmZwID0gTlVMTDsKKworICAgIGlmIChpZHggPT0gMCkKKwlmcCA9IGZpcnN0ZnVuYzsKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICB7CisJaWYgKFNUUkxFTihmcC0+bmFtZSkgKyA0ID49IElPU0laRSkKKwkgICAgcmV0dXJuIGZwLT5uYW1lOwkvKiBwcmV2ZW50cyBvdmVyZmxvdyAqLworCisJY2F0X2Z1bmNfbmFtZShJT2J1ZmYsIGZwKTsKKwlpZiAoeHAtPnhwX2NvbnRleHQgIT0gRVhQQU5EX1VTRVJfRlVOQykKKwl7CisJICAgIFNUUkNBVChJT2J1ZmYsICIoIik7CisJICAgIGlmICghZnAtPnZhcmFyZ3MgJiYgZnAtPmFyZ3MuZ2FfbGVuID09IDApCisJCVNUUkNBVChJT2J1ZmYsICIpIik7CisJfQorCisJZnAgPSBmcC0+bmV4dDsKKwlyZXR1cm4gSU9idWZmOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworI2VuZGlmIC8qIEZFQVRfQ01ETF9DT01QTCAqLworCisvKgorICogQ29weSB0aGUgZnVuY3Rpb24gbmFtZSBvZiAiZnAiIHRvIGJ1ZmZlciAiYnVmIi4KKyAqICJidWYiIG11c3QgYmUgYWJsZSB0byBob2xkIHRoZSBmdW5jdGlvbiBuYW1lIHBsdXMgdGhyZWUgYnl0ZXMuCisgKiBUYWtlcyBjYXJlIG9mIHNjcmlwdC1sb2NhbCBmdW5jdGlvbiBuYW1lcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjYXRfZnVuY19uYW1lKGJ1ZiwgZnApCisgICAgY2hhcl91CSpidWY7CisgICAgdWZ1bmNfVAkqZnA7Cit7CisgICAgaWYgKGZwLT5uYW1lWzBdID09IEtfU1BFQ0lBTCkKKyAgICB7CisJU1RSQ1BZKGJ1ZiwgIjxTTlI+Iik7CisJU1RSQ0FUKGJ1ZiwgZnAtPm5hbWUgKyAzKTsKKyAgICB9CisgICAgZWxzZQorCVNUUkNQWShidWYsIGZwLT5uYW1lKTsKK30KKworLyoKKyAqICI6ZGVsZnVuY3Rpb24ge25hbWV9IgorICovCisgICAgdm9pZAorZXhfZGVsZnVuY3Rpb24oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICB1ZnVuY19UCSpmcCA9IE5VTEwsICpwZnA7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIHAgPSBlYXAtPmFyZzsKKyAgICBuYW1lID0gdHJhbnNfZnVuY3Rpb25fbmFtZSgmcCwgZWFwLT5za2lwLCBGQUxTRSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgaWYgKCFlbmRzX2V4Y21kKCpza2lwd2hpdGUocCkpKQorICAgIHsKKwl2aW1fZnJlZShuYW1lKTsKKwlFTVNHKF8oZV90cmFpbGluZykpOworCXJldHVybjsKKyAgICB9CisgICAgZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChwKTsKKyAgICBpZiAoZWFwLT5uZXh0Y21kICE9IE5VTEwpCisJKnAgPSBOVUw7CisKKyAgICBpZiAoIWVhcC0+c2tpcCkKKwlmcCA9IGZpbmRfZnVuYyhuYW1lKTsKKyAgICB2aW1fZnJlZShuYW1lKTsKKworICAgIGlmICghZWFwLT5za2lwKQorICAgIHsKKwlpZiAoZnAgPT0gTlVMTCkKKwl7CisJICAgIEVNU0cyKF8oIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiKSwgZWFwLT5hcmcpOworCSAgICByZXR1cm47CisJfQorCWlmIChmcC0+Y2FsbHMpCisJeworCSAgICBFTVNHMihfKCJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiKSwgZWFwLT5hcmcpOworCSAgICByZXR1cm47CisJfQorCisJLyogY2xlYXIgdGhpcyBmdW5jdGlvbiAqLworCXZpbV9mcmVlKGZwLT5uYW1lKTsKKwlnYV9jbGVhcl9zdHJpbmdzKCYoZnAtPmFyZ3MpKTsKKwlnYV9jbGVhcl9zdHJpbmdzKCYoZnAtPmxpbmVzKSk7CisKKwkvKiByZW1vdmUgdGhlIGZ1bmN0aW9uIGZyb20gdGhlIGZ1bmN0aW9uIGxpc3QgKi8KKwlpZiAoZmlyc3RmdW5jID09IGZwKQorCSAgICBmaXJzdGZ1bmMgPSBmcC0+bmV4dDsKKwllbHNlCisJeworCSAgICBmb3IgKHBmcCA9IGZpcnN0ZnVuYzsgcGZwICE9IE5VTEw7IHBmcCA9IHBmcC0+bmV4dCkKKwkJaWYgKHBmcC0+bmV4dCA9PSBmcCkKKwkJeworCQkgICAgcGZwLT5uZXh0ID0gZnAtPm5leHQ7CisJCSAgICBicmVhazsKKwkJfQorCX0KKwl2aW1fZnJlZShmcCk7CisgICAgfQorfQorCisvKgorICogQ2FsbCBhIHVzZXIgZnVuY3Rpb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2FsbF91c2VyX2Z1bmMoZnAsIGFyZ2NvdW50LCBhcmd2YXJzLCByZXR2YXIsIGZpcnN0bGluZSwgbGFzdGxpbmUpCisgICAgdWZ1bmNfVAkqZnA7CQkvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICovCisgICAgaW50CQlhcmdjb3VudDsJLyogbnIgb2YgYXJncyAqLworICAgIFZBUgkJYXJndmFyczsJLyogYXJndW1lbnRzICovCisgICAgVkFSCQlyZXR2YXI7CQkvKiByZXR1cm4gdmFsdWUgKi8KKyAgICBsaW5lbnJfVAlmaXJzdGxpbmU7CS8qIGZpcnN0IGxpbmUgb2YgcmFuZ2UgKi8KKyAgICBsaW5lbnJfVAlsYXN0bGluZTsJLyogbGFzdCBsaW5lIG9mIHJhbmdlICovCit7CisgICAgY2hhcl91CQkqc2F2ZV9zb3VyY2luZ19uYW1lOworICAgIGxpbmVucl9UCQlzYXZlX3NvdXJjaW5nX2xudW07CisgICAgc2NpZF9UCQlzYXZlX2N1cnJlbnRfU0lEOworICAgIHN0cnVjdCBmdW5jY2FsbAlmYzsKKyAgICBzdHJ1Y3QgZnVuY2NhbGwJKnNhdmVfZmNwID0gY3VycmVudF9mdW5jY2FsOworICAgIGludAkJCXNhdmVfZGlkX2Vtc2c7CisgICAgc3RhdGljIGludAkJZGVwdGggPSAwOworCisgICAgLyogSWYgZGVwdGggb2YgY2FsbGluZyBpcyBnZXR0aW5nIHRvbyBoaWdoLCBkb24ndCBleGVjdXRlIHRoZSBmdW5jdGlvbiAqLworICAgIGlmIChkZXB0aCA+PSBwX21mZCkKKyAgICB7CisJRU1TRyhfKCJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIikpOworCXJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisJcmV0dXJuOworICAgIH0KKyAgICArK2RlcHRoOworCisgICAgbGluZV9icmVha2NoZWNrKCk7CQkvKiBjaGVjayBmb3IgQ1RSTC1DIGhpdCAqLworCisgICAgLyogc2V0IGxvY2FsIHZhcmlhYmxlcyAqLworICAgIHZhcl9pbml0KCZmYy5sX3ZhcnMpOworICAgIGZjLmZ1bmMgPSBmcDsKKyAgICBmYy5hcmdjb3VudCA9IGFyZ2NvdW50OworICAgIGZjLmFyZ3ZhcnMgPSBhcmd2YXJzOworICAgIGZjLnJldHZhciA9IHJldHZhcjsKKyAgICByZXR2YXItPnZhcl92YWwudmFyX251bWJlciA9IDA7CisgICAgZmMubGluZW5yID0gMDsKKyAgICBmYy5yZXR1cm5lZCA9IEZBTFNFOworICAgIGZjLmxldmVsID0gZXhfbmVzdGluZ19sZXZlbDsKKyAgICBmYy5hMF92YXIudmFyX3R5cGUgPSBWQVJfTlVNQkVSOworICAgIGZjLmEwX3Zhci52YXJfdmFsLnZhcl9udW1iZXIgPSBhcmdjb3VudCAtIGZwLT5hcmdzLmdhX2xlbjsKKyAgICBmYy5hMF92YXIudmFyX25hbWUgPSBOVUxMOworICAgIGN1cnJlbnRfZnVuY2NhbCA9ICZmYzsKKyAgICBmYy5maXJzdGxpbmUudmFyX3R5cGUgPSBWQVJfTlVNQkVSOworICAgIGZjLmZpcnN0bGluZS52YXJfdmFsLnZhcl9udW1iZXIgPSBmaXJzdGxpbmU7CisgICAgZmMuZmlyc3RsaW5lLnZhcl9uYW1lID0gTlVMTDsKKyAgICBmYy5sYXN0bGluZS52YXJfdHlwZSA9IFZBUl9OVU1CRVI7CisgICAgZmMubGFzdGxpbmUudmFyX3ZhbC52YXJfbnVtYmVyID0gbGFzdGxpbmU7CisgICAgZmMubGFzdGxpbmUudmFyX25hbWUgPSBOVUxMOworICAgIC8qIENoZWNrIGlmIHRoaXMgZnVuY3Rpb24gaGFzIGEgYnJlYWtwb2ludC4gKi8KKyAgICBmYy5icmVha3BvaW50ID0gZGJnX2ZpbmRfYnJlYWtwb2ludChGQUxTRSwgZnAtPm5hbWUsIChsaW5lbnJfVCkwKTsKKyAgICBmYy5kYmdfdGljayA9IGRlYnVnX3RpY2s7CisKKyAgICAvKiBEb24ndCByZWRyYXcgd2hpbGUgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbi4gKi8KKyAgICArK1JlZHJhd2luZ0Rpc2FibGVkOworICAgIHNhdmVfc291cmNpbmdfbmFtZSA9IHNvdXJjaW5nX25hbWU7CisgICAgc2F2ZV9zb3VyY2luZ19sbnVtID0gc291cmNpbmdfbG51bTsKKyAgICBzb3VyY2luZ19sbnVtID0gMTsKKyAgICBzb3VyY2luZ19uYW1lID0gYWxsb2MoKHVuc2lnbmVkKSgoc2F2ZV9zb3VyY2luZ19uYW1lID09IE5VTEwgPyAwCisJCTogU1RSTEVOKHNhdmVfc291cmNpbmdfbmFtZSkpICsgU1RSTEVOKGZwLT5uYW1lKSArIDEzKSk7CisgICAgaWYgKHNvdXJjaW5nX25hbWUgIT0gTlVMTCkKKyAgICB7CisJaWYgKHNhdmVfc291cmNpbmdfbmFtZSAhPSBOVUxMCisJCQkgICYmIFNUUk5DTVAoc2F2ZV9zb3VyY2luZ19uYW1lLCAiZnVuY3Rpb24gIiwgOSkgPT0gMCkKKwkgICAgc3ByaW50ZigoY2hhciAqKXNvdXJjaW5nX25hbWUsICIlcy4uIiwgc2F2ZV9zb3VyY2luZ19uYW1lKTsKKwllbHNlCisJICAgIFNUUkNQWShzb3VyY2luZ19uYW1lLCAiZnVuY3Rpb24gIik7CisJY2F0X2Z1bmNfbmFtZShzb3VyY2luZ19uYW1lICsgU1RSTEVOKHNvdXJjaW5nX25hbWUpLCBmcCk7CisKKwlpZiAocF92ZXJib3NlID49IDEyKQorCXsKKwkgICAgKytub193YWl0X3JldHVybjsKKwkgICAgbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwkgICAgbXNnX3N0cigoY2hhcl91ICopXygiY2FsbGluZyAlcyIpLCBzb3VyY2luZ19uYW1lKTsKKwkgICAgaWYgKHBfdmVyYm9zZSA+PSAxNCkKKwkgICAgeworCQlpbnQJaTsKKwkJY2hhcl91CWJ1ZltNU0dfQlVGX0xFTl07CisKKwkJbXNnX3B1dHMoKGNoYXJfdSAqKSIoIik7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKQorCQl7CisJCSAgICBpZiAoaSA+IDApCisJCQltc2dfcHV0cygoY2hhcl91ICopIiwgIik7CisJCSAgICBpZiAoYXJndmFyc1tpXS52YXJfdHlwZSA9PSBWQVJfTlVNQkVSKQorCQkJbXNnX291dG51bSgobG9uZylhcmd2YXJzW2ldLnZhcl92YWwudmFyX251bWJlcik7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQl0cnVuY19zdHJpbmcoZ2V0X3Zhcl9zdHJpbmcoJmFyZ3ZhcnNbaV0pLAorCQkJCQkJCSAgICBidWYsIE1TR19CVUZfTEVOKTsKKwkJCW1zZ19wdXRzKChjaGFyX3UgKikiXCIiKTsKKwkJCW1zZ19wdXRzKGJ1Zik7CisJCQltc2dfcHV0cygoY2hhcl91ICopIlwiIik7CisJCSAgICB9CisJCX0KKwkJbXNnX3B1dHMoKGNoYXJfdSAqKSIpIik7CisJICAgIH0KKwkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOyAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworCSAgICBjbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJICAgIC0tbm9fd2FpdF9yZXR1cm47CisJfQorICAgIH0KKyAgICBzYXZlX2N1cnJlbnRfU0lEID0gY3VycmVudF9TSUQ7CisgICAgY3VycmVudF9TSUQgPSBmcC0+c2NyaXB0X0lEOworICAgIHNhdmVfZGlkX2Vtc2cgPSBkaWRfZW1zZzsKKyAgICBkaWRfZW1zZyA9IEZBTFNFOworCisgICAgLyogY2FsbCBkb19jbWRsaW5lKCkgdG8gZXhlY3V0ZSB0aGUgbGluZXMgKi8KKyAgICBkb19jbWRsaW5lKE5VTEwsIGdldF9mdW5jX2xpbmUsICh2b2lkICopJmZjLAorCQkJCSAgICAgRE9DTURfTk9XQUlUfERPQ01EX1ZFUkJPU0V8RE9DTURfUkVQRUFUKTsKKworICAgIC0tUmVkcmF3aW5nRGlzYWJsZWQ7CisKKyAgICAvKiB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgYWJvcnRlZCBiZWNhdXNlIG9mIGFuIGVycm9yLCByZXR1cm4gLTEgKi8KKyAgICBpZiAoKGRpZF9lbXNnICYmIChmcC0+ZmxhZ3MgJiBGQ19BQk9SVCkpIHx8IHJldHZhci0+dmFyX3R5cGUgPT0gVkFSX1VOS05PV04pCisgICAgeworCWNsZWFyX3ZhcihyZXR2YXIpOworCXJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCXJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gLTE7CisgICAgfQorCisgICAgLyogd2hlbiBiZWluZyB2ZXJib3NlLCBtZW50aW9uIHRoZSByZXR1cm4gdmFsdWUgKi8KKyAgICBpZiAocF92ZXJib3NlID49IDEyKQorICAgIHsKKwljaGFyX3UJKnNuLCAqdmFsOworCisJKytub193YWl0X3JldHVybjsKKwltc2dfc2Nyb2xsID0gVFJVRTsJICAgIC8qIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZSAqLworCisJLyogTWFrZSBzdXJlIHRoZSBvdXRwdXQgZml0cyBpbiBJT2J1ZmYuICovCisJc24gPSBzb3VyY2luZ19uYW1lOworCWlmIChTVFJMRU4oc291cmNpbmdfbmFtZSkgPiBJT1NJWkUgLyAyIC0gNTApCisJICAgIHNuID0gc291cmNpbmdfbmFtZSArIFNUUkxFTihzb3VyY2luZ19uYW1lKSAtIChJT1NJWkUgLyAyIC0gNTApOworCisJaWYgKGFib3J0aW5nKCkpCisJICAgIHNtc2coKGNoYXJfdSAqKV8oIiVzIGFib3J0ZWQiKSwgc24pOworCWVsc2UgaWYgKGZjLnJldHZhci0+dmFyX3R5cGUgPT0gVkFSX05VTUJFUikKKwkgICAgc21zZygoY2hhcl91ICopXygiJXMgcmV0dXJuaW5nICMlbGQiKSwgc24sCisJCQkJICAgICAgIChsb25nKWZjLnJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyKTsKKwllbHNlIGlmIChmYy5yZXR2YXItPnZhcl90eXBlID09IFZBUl9TVFJJTkcpCisJeworCSAgICB2YWwgPSBnZXRfdmFyX3N0cmluZyhmYy5yZXR2YXIpOworCSAgICBpZiAoU1RSTEVOKHZhbCkgPiBJT1NJWkUgLyAyIC0gNTApCisJCXZhbCA9IHZhbCArIFNUUkxFTih2YWwpIC0gKElPU0laRSAvIDIgLSA1MCk7CisJICAgIHNtc2coKGNoYXJfdSAqKV8oIiVzIHJldHVybmluZyBcIiVzXCIiKSwgc24sIHZhbCk7CisJfQorCW1zZ19wdXRzKChjaGFyX3UgKikiXG4iKTsgICAvKiBkb24ndCBvdmVyd3JpdGUgdGhpcyBlaXRoZXIgKi8KKwljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJLS1ub193YWl0X3JldHVybjsKKyAgICB9CisKKyAgICB2aW1fZnJlZShzb3VyY2luZ19uYW1lKTsKKyAgICBzb3VyY2luZ19uYW1lID0gc2F2ZV9zb3VyY2luZ19uYW1lOworICAgIHNvdXJjaW5nX2xudW0gPSBzYXZlX3NvdXJjaW5nX2xudW07CisgICAgY3VycmVudF9TSUQgPSBzYXZlX2N1cnJlbnRfU0lEOworCisgICAgaWYgKHBfdmVyYm9zZSA+PSAxMiAmJiBzb3VyY2luZ19uYW1lICE9IE5VTEwpCisgICAgeworCSsrbm9fd2FpdF9yZXR1cm47CisJbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwltc2dfc3RyKChjaGFyX3UgKilfKCJjb250aW51aW5nIGluICVzIiksIHNvdXJjaW5nX25hbWUpOworCW1zZ19wdXRzKChjaGFyX3UgKikiXG4iKTsgICAvKiBkb24ndCBvdmVyd3JpdGUgdGhpcyBlaXRoZXIgKi8KKwljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJLS1ub193YWl0X3JldHVybjsKKyAgICB9CisKKyAgICBkaWRfZW1zZyB8PSBzYXZlX2RpZF9lbXNnOworICAgIGN1cnJlbnRfZnVuY2NhbCA9IHNhdmVfZmNwOworCisgICAgdmFyX2NsZWFyKCZmYy5sX3ZhcnMpOwkJLyogZnJlZSBhbGwgbG9jYWwgdmFyaWFibGVzICovCisgICAgLS1kZXB0aDsKK30KKworLyoKKyAqICI6cmV0dXJuIFtleHByXSIKKyAqLworICAgIHZvaWQKK2V4X3JldHVybihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgdmFyCQlyZXR2YXI7CisgICAgaW50CQlyZXR1cm5pbmcgPSBGQUxTRTsKKworICAgIGlmIChjdXJyZW50X2Z1bmNjYWwgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKCJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGVhcC0+c2tpcCkKKwkrK2Vtc2dfc2tpcDsKKworICAgIGVhcC0+bmV4dGNtZCA9IE5VTEw7CisgICAgaWYgKCgqYXJnICE9IE5VTCAmJiAqYXJnICE9ICd8JyAmJiAqYXJnICE9ICdcbicpCisJICAgICYmIGV2YWwwKGFyZywgJnJldHZhciwgJmVhcC0+bmV4dGNtZCwgIWVhcC0+c2tpcCkgIT0gRkFJTCkKKyAgICB7CisJaWYgKCFlYXAtPnNraXApCisJICAgIHJldHVybmluZyA9IGRvX3JldHVybihlYXAsIEZBTFNFLCBUUlVFLCAmcmV0dmFyKTsKKwllbHNlCisJICAgIGNsZWFyX3ZhcigmcmV0dmFyKTsKKyAgICB9CisgICAgLyogSXQncyBzYWZlciB0byByZXR1cm4gYWxzbyBvbiBlcnJvci4gKi8KKyAgICBlbHNlIGlmICghZWFwLT5za2lwKQorICAgIHsKKwkvKgorCSAqIFJldHVybiB1bmxlc3MgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGFuCisJICogYWJvcnRpbmcgZXJyb3IsIGFuIGludGVycnVwdCwgb3IgYW4gZXhjZXB0aW9uLgorCSAqLworCWlmICghYWJvcnRpbmcoKSkKKwkgICAgcmV0dXJuaW5nID0gZG9fcmV0dXJuKGVhcCwgRkFMU0UsIFRSVUUsIE5VTEwpOworICAgIH0KKworICAgIC8qIFdoZW4gc2tpcHBpbmcgb3IgdGhlIHJldHVybiBnZXRzIHBlbmRpbmcsIGFkdmFuY2UgdG8gdGhlIG5leHQgY29tbWFuZAorICAgICAqIGluIHRoaXMgbGluZSAoIXJldHVybmluZykuICBPdGhlcndpc2UsIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgbGluZS4KKyAgICAgKiBGb2xsb3dpbmcgbGluZXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGdldF9mdW5jX2xpbmUoKS4gKi8KKyAgICBpZiAocmV0dXJuaW5nKQorCWVhcC0+bmV4dGNtZCA9IE5VTEw7CisgICAgZWxzZSBpZiAoZWFwLT5uZXh0Y21kID09IE5VTEwpCSAgICAvKiBubyBhcmd1bWVudCAqLworCWVhcC0+bmV4dGNtZCA9IGNoZWNrX25leHRjbWQoYXJnKTsKKworICAgIGlmIChlYXAtPnNraXApCisJLS1lbXNnX3NraXA7Cit9CisKKy8qCisgKiBSZXR1cm4gZnJvbSBhIGZ1bmN0aW9uLiAgUG9zc2libHkgbWFrZXMgdGhlIHJldHVybiBwZW5kaW5nLiAgQWxzbyBjYWxsZWQKKyAqIGZvciBhIHBlbmRpbmcgcmV0dXJuIGF0IHRoZSAiOmVuZHRyeSIgb3IgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gYW4gZXh0cmEKKyAqIGRvX2NtZGxpbmUoKS4gICJyZWFuaW1hdGUiIGlzIHVzZWQgaW4gdGhlIGxhdHRlciBjYXNlLiAgImlzX2NtZCIgaXMgc2V0CisgKiB3aGVuIGNhbGxlZCBkdWUgdG8gYSAiOnJldHVybiIgY29tbWFuZC4gICJ2YWx1ZSIgbWF5IHBvaW50IHRvIGEgdmFyaWFibGUKKyAqIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIFJldHVybnMgVFJVRSB3aGVuIHRoZSByZXR1cm4gY2FuIGJlIGNhcnJpZWQgb3V0LAorICogRkFMU0Ugd2hlbiB0aGUgcmV0dXJuIGdldHMgcGVuZGluZy4KKyAqLworICAgIGludAorZG9fcmV0dXJuKGVhcCwgcmVhbmltYXRlLCBpc19jbWQsIHZhbHVlKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXJlYW5pbWF0ZTsKKyAgICBpbnQJCWlzX2NtZDsKKyAgICB2b2lkCSp2YWx1ZTsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBzdHJ1Y3QgY29uZHN0YWNrICpjc3RhY2sgPSBlYXAtPmNzdGFjazsKKworICAgIGlmIChyZWFuaW1hdGUpCisJLyogVW5kbyB0aGUgcmV0dXJuLiAqLworCWN1cnJlbnRfZnVuY2NhbC0+cmV0dXJuZWQgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogQ2xlYW51cCAoYW5kIGluYWN0aXZhdGUpIGNvbmRpdGlvbmFscywgYnV0IHN0b3Agd2hlbiBhIHRyeSBjb25kaXRpb25hbAorICAgICAqIG5vdCBpbiBpdHMgZmluYWxseSBjbGF1c2UgKHdoaWNoIHRoZW4gaXMgdG8gYmUgZXhlY3V0ZWQgbmV4dCkgaXMgZm91bmQuCisgICAgICogSW4gdGhpcyBjYXNlLCBtYWtlIHRoZSAiOnJldHVybiIgcGVuZGluZyBmb3IgZXhlY3V0aW9uIGF0IHRoZSAiOmVuZHRyeSIuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm4gbm9ybWFsbHkuCisgICAgICovCisgICAgaWR4ID0gY2xlYW51cF9jb25kaXRpb25hbHMoZWFwLT5jc3RhY2ssIDAsIFRSVUUpOworICAgIGlmIChpZHggPj0gMCkKKyAgICB7CisJY3N0YWNrLT5jc19wZW5kaW5nW2lkeF0gPSBDU1RQX1JFVFVSTjsKKworCWlmICghaXNfY21kICYmICFyZWFuaW1hdGUpCisJICAgIC8qIEEgcGVuZGluZyByZXR1cm4gYWdhaW4gZ2V0cyBwZW5kaW5nLiAgInZhbHVlIiBwb2ludHMgdG8gYW4KKwkgICAgICogYWxsb2NhdGVkIHZhcmlhYmxlIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCAiOnJldHVybiIncworCSAgICAgKiBhcmd1bWVudCBpZiBwcmVzZW50IG9yIGlzIE5VTEwgZWxzZS4gKi8KKwkgICAgY3N0YWNrLT5jc19yZXR2YXJbaWR4XSA9IHZhbHVlOworCWVsc2UKKwl7CisJICAgIC8qIFdoZW4gdW5kb2luZyBhIHJldHVybiBpbiBvcmRlciB0byBtYWtlIGl0IHBlbmRpbmcsIGdldCB0aGUgc3RvcmVkCisJICAgICAqIHJldHVybiB2YWx1ZS4gKi8KKwkgICAgaWYgKHJlYW5pbWF0ZSkKKwkJdmFsdWUgPSBjdXJyZW50X2Z1bmNjYWwtPnJldHZhcjsKKworCSAgICBpZiAodmFsdWUgIT0gTlVMTCkKKwkgICAgeworCQkvKiBTdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHBlbmRpbmcgcmV0dXJuLiAqLworCQlpZiAoKGNzdGFjay0+Y3NfcmV0dmFyW2lkeF0gPSBhbGxvY192YXIoKSkgIT0gTlVMTCkKKwkJICAgICooVkFSKWNzdGFjay0+Y3NfcmV0dmFyW2lkeF0gPSAqKFZBUil2YWx1ZTsKKwkJZWxzZQorCQkgICAgRU1TRyhfKGVfb3V0b2ZtZW0pKTsKKwkgICAgfQorCSAgICBlbHNlCisJCWNzdGFjay0+Y3NfcmV0dmFyW2lkeF0gPSBOVUxMOworCisJICAgIGlmIChyZWFuaW1hdGUpCisJICAgIHsKKwkJLyogVGhlIHBlbmRpbmcgcmV0dXJuIHZhbHVlIGNvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IGEgIjpyZXR1cm4iCisJCSAqIHdpdGhvdXQgYXJndW1lbnQgaW4gYSBmaW5hbGx5IGNsYXVzZTsgcmVzZXQgdGhlIGRlZmF1bHQKKwkJICogcmV0dXJuIHZhbHVlLiAqLworCQljdXJyZW50X2Z1bmNjYWwtPnJldHZhci0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCQljdXJyZW50X2Z1bmNjYWwtPnJldHZhci0+dmFyX3ZhbC52YXJfbnVtYmVyID0gMDsKKwkgICAgfQorCX0KKwlyZXBvcnRfbWFrZV9wZW5kaW5nKENTVFBfUkVUVVJOLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY3VycmVudF9mdW5jY2FsLT5yZXR1cm5lZCA9IFRSVUU7CisKKwkvKiBJZiB0aGUgcmV0dXJuIGlzIGNhcnJpZWQgb3V0IG5vdywgc3RvcmUgdGhlIHJldHVybiB2YWx1ZS4gIEZvcgorCSAqIGEgcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIHJlYW5pbWF0aW9uLCB0aGUgdmFsdWUgaXMgYWxyZWFkeQorCSAqIHRoZXJlLiAqLworCWlmICghcmVhbmltYXRlICYmIHZhbHVlICE9IE5VTEwpCisJeworCSAgICBjbGVhcl92YXIoY3VycmVudF9mdW5jY2FsLT5yZXR2YXIpOworCSAgICAqY3VycmVudF9mdW5jY2FsLT5yZXR2YXIgPSAqKFZBUil2YWx1ZTsKKwkgICAgaWYgKCFpc19jbWQpCisJCXZpbV9mcmVlKHZhbHVlKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGlkeCA8IDA7Cit9CisKKy8qCisgKiBGcmVlIHRoZSB2YXJpYWJsZSB3aXRoIGEgcGVuZGluZyByZXR1cm4gdmFsdWUuCisgKi8KKyAgICB2b2lkCitkaXNjYXJkX3BlbmRpbmdfcmV0dXJuKHJldHZhcikKKyAgICB2b2lkCSpyZXR2YXI7Cit7CisgICAgLyogVGhlIHZhcmlhYmxlIHdhcyBjb3BpZWQgZnJvbSBvbmUgd2l0aCBhbiB1bmRlZmluZWQgdmFyX25hbWUuICBTbyB3ZSBjYW4ndAorICAgICAqIHVzZSBmcmVlX3ZhcigpIHRvIGNsZWFyIGFuZCBmcmVlIGl0LiAqLworICAgIGNsZWFyX3ZhcigoVkFSKXJldHZhcik7CisgICAgdmltX2ZyZWUocmV0dmFyKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgcmV0dXJuIGNvbW1hbmQgZm9yIHByb2R1Y2luZyB0aGUgdmFsdWUgb2YgInJldHZhciIuICBUaGUgcmVzdWx0CisgKiBpcyBhbiBhbGxvY2F0ZWQgc3RyaW5nLiAgVXNlZCBieSByZXBvcnRfcGVuZGluZygpIGZvciB2ZXJib3NlIG1lc3NhZ2VzLgorICovCisgICAgY2hhcl91ICoKK2dldF9yZXR1cm5fY21kKHJldHZhcikKKyAgICB2b2lkCSpyZXR2YXI7Cit7CisgICAgY2hhcl91CSpzID0gSU9idWZmOworCisgICAgaWYgKHJldHZhciA9PSBOVUxMIHx8ICgoVkFSKXJldHZhciktPnZhcl90eXBlID09IFZBUl9VTktOT1dOKQorCXMgPSAoY2hhcl91ICopIjpyZXR1cm4iOworICAgIGVsc2UgaWYgKCgoVkFSKXJldHZhciktPnZhcl90eXBlID09IFZBUl9TVFJJTkcpCisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgIjpyZXR1cm4gXCIlc1wiIiwKKwkJKChWQVIpcmV0dmFyKS0+dmFyX3ZhbC52YXJfc3RyaW5nKTsKKyAgICBlbHNlCisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgIjpyZXR1cm4gJWxkIiwKKwkJKGxvbmcpKCgoVkFSKXJldHZhciktPnZhcl92YWwudmFyX251bWJlcikpOworICAgIHJldHVybiB2aW1fc3Ryc2F2ZShzKTsKK30KKworLyoKKyAqIEdldCBuZXh0IGZ1bmN0aW9uIGxpbmUuCisgKiBDYWxsZWQgYnkgZG9fY21kbGluZSgpIHRvIGdldCB0aGUgbmV4dCBsaW5lLgorICogUmV0dXJucyBhbGxvY2F0ZWQgc3RyaW5nLCBvciBOVUxMIGZvciBlbmQgb2YgZnVuY3Rpb24uCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgY2hhcl91ICoKK2dldF9mdW5jX2xpbmUoYywgY29va2llLCBpbmRlbnQpCisgICAgaW50CSAgICBjOwkJICAgIC8qIG5vdCB1c2VkICovCisgICAgdm9pZCAgICAqY29va2llOworICAgIGludAkgICAgaW5kZW50OwkgICAgLyogbm90IHVzZWQgKi8KK3sKKyAgICBzdHJ1Y3QgZnVuY2NhbGwJKmZjcCA9IChzdHJ1Y3QgZnVuY2NhbGwgKiljb29raWU7CisgICAgY2hhcl91CQkqcmV0dmFsOworICAgIGdhcnJheV9UCQkqZ2FwOyAgLyogZ3Jvd2FycmF5IHdpdGggZnVuY3Rpb24gbGluZXMgKi8KKworICAgIC8qIElmIGJyZWFrcG9pbnRzIGhhdmUgYmVlbiBhZGRlZC9kZWxldGVkIG5lZWQgdG8gY2hlY2sgZm9yIGl0LiAqLworICAgIGlmIChmY3AtPmRiZ190aWNrICE9IGRlYnVnX3RpY2spCisgICAgeworCWZjcC0+YnJlYWtwb2ludCA9IGRiZ19maW5kX2JyZWFrcG9pbnQoRkFMU0UsIGZjcC0+ZnVuYy0+bmFtZSwKKwkJCQkJCQkgICAgICAgc291cmNpbmdfbG51bSk7CisJZmNwLT5kYmdfdGljayA9IGRlYnVnX3RpY2s7CisgICAgfQorCisgICAgZ2FwID0gJmZjcC0+ZnVuYy0+bGluZXM7CisgICAgaWYgKChmY3AtPmZ1bmMtPmZsYWdzICYgRkNfQUJPUlQpICYmIGRpZF9lbXNnICYmICFhYm9ydGVkX2luX3RyeSgpKQorCXJldHZhbCA9IE5VTEw7CisgICAgZWxzZSBpZiAoZmNwLT5yZXR1cm5lZCB8fCBmY3AtPmxpbmVuciA+PSBnYXAtPmdhX2xlbikKKwlyZXR2YWwgPSBOVUxMOworICAgIGVsc2UKKyAgICB7CisJcmV0dmFsID0gdmltX3N0cnNhdmUoKChjaGFyX3UgKiopKGdhcC0+Z2FfZGF0YSkpW2ZjcC0+bGluZW5yKytdKTsKKwlzb3VyY2luZ19sbnVtID0gZmNwLT5saW5lbnI7CisgICAgfQorCisgICAgLyogRGlkIHdlIGVuY291bnRlciBhIGJyZWFrcG9pbnQ/ICovCisgICAgaWYgKGZjcC0+YnJlYWtwb2ludCAhPSAwICYmIGZjcC0+YnJlYWtwb2ludCA8PSBzb3VyY2luZ19sbnVtKQorICAgIHsKKwlkYmdfYnJlYWtwb2ludChmY3AtPmZ1bmMtPm5hbWUsIHNvdXJjaW5nX2xudW0pOworCS8qIEZpbmQgbmV4dCBicmVha3BvaW50LiAqLworCWZjcC0+YnJlYWtwb2ludCA9IGRiZ19maW5kX2JyZWFrcG9pbnQoRkFMU0UsIGZjcC0+ZnVuYy0+bmFtZSwKKwkJCQkJCQkgICAgICAgc291cmNpbmdfbG51bSk7CisJZmNwLT5kYmdfdGljayA9IGRlYnVnX3RpY2s7CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZ1bmN0aW9uIHNob3VsZCBiZSBlbmRlZCwgYmVjYXVzZSBhCisgKiByZXR1cm4gd2FzIGVuY291bnRlcmVkIG9yIGFuIGVycm9yIG9jY3VyZWQuICBVc2VkIGluc2lkZSBhICI6d2hpbGUiLgorICovCisgICAgaW50CitmdW5jX2hhc19lbmRlZChjb29raWUpCisgICAgdm9pZCAgICAqY29va2llOworeworICAgIHN0cnVjdCBmdW5jY2FsbCAgKmZjcCA9IChzdHJ1Y3QgZnVuY2NhbGwgKiljb29raWU7CisKKyAgICAvKiBJZ25vcmUgdGhlICJhYm9ydCIgZmxhZyBpZiB0aGUgYWJvcnRpb24gYmVoYXZpb3IgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8KKyAgICAgKiBhbiBlcnJvciBpbnNpZGUgYSB0cnkgY29uZGl0aW9uYWwuICovCisgICAgcmV0dXJuICgoKGZjcC0+ZnVuYy0+ZmxhZ3MgJiBGQ19BQk9SVCkgJiYgZGlkX2Vtc2cgJiYgIWFib3J0ZWRfaW5fdHJ5KCkpCisJICAgIHx8IGZjcC0+cmV0dXJuZWQpOworfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgY29va2llIGluZGljYXRlcyBhIGZ1bmN0aW9uIHdoaWNoICJhYm9ydCJzIG9uIGVycm9ycy4KKyAqLworICAgIGludAorZnVuY19oYXNfYWJvcnQoY29va2llKQorICAgIHZvaWQgICAgKmNvb2tpZTsKK3sKKyAgICByZXR1cm4gKChzdHJ1Y3QgZnVuY2NhbGwgKiljb29raWUpLT5mdW5jLT5mbGFncyAmIEZDX0FCT1JUOworfQorCisjaWYgZGVmaW5lZChGRUFUX1ZJTUlORk8pIHx8IGRlZmluZWQoRkVBVF9TRVNTSU9OKQordHlwZWRlZiBlbnVtCit7CisgICAgVkFSX0ZMQVZPVVJfREVGQVVMVCwKKyAgICBWQVJfRkxBVk9VUl9TRVNTSU9OLAorICAgIFZBUl9GTEFWT1VSX1ZJTUlORk8KK30gdmFyX2ZsYXZvdXJfVDsKKworc3RhdGljIHZhcl9mbGF2b3VyX1QgdmFyX2ZsYXZvdXIgX19BUkdTKChjaGFyX3UgKnZhcm5hbWUpKTsKKworICAgIHN0YXRpYyB2YXJfZmxhdm91cl9UCit2YXJfZmxhdm91cih2YXJuYW1lKQorICAgIGNoYXJfdSAqdmFybmFtZTsKK3sKKyAgICBjaGFyX3UgKnAgPSB2YXJuYW1lOworCisgICAgaWYgKEFTQ0lJX0lTVVBQRVIoKnApKQorICAgIHsKKwl3aGlsZSAoKigrK3ApKQorCSAgICBpZiAoQVNDSUlfSVNMT1dFUigqcCkpCisJCXJldHVybiBWQVJfRkxBVk9VUl9TRVNTSU9OOworCXJldHVybiBWQVJfRkxBVk9VUl9WSU1JTkZPOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIFZBUl9GTEFWT1VSX0RFRkFVTFQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9WSU1JTkZPKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlc3RvcmUgZ2xvYmFsIHZhcnMgdGhhdCBzdGFydCB3aXRoIGEgY2FwaXRhbCBmcm9tIHRoZSB2aW1pbmZvIGZpbGUKKyAqLworICAgIGludAorcmVhZF92aW1pbmZvX3Zhcmxpc3QodmlycCwgd3JpdGluZykKKyAgICB2aXJfVAkqdmlycDsKKyAgICBpbnQJCXdyaXRpbmc7Cit7CisgICAgY2hhcl91CSp0YWI7CisgICAgaW50CQlpc19zdHJpbmcgPSBGQUxTRTsKKyAgICBWQVIJCXZhcnAgPSBOVUxMOworICAgIGNoYXJfdQkqdmFsOworCisgICAgaWYgKCF3cml0aW5nICYmIChmaW5kX3ZpbWluZm9fcGFyYW1ldGVyKCchJykgIT0gTlVMTCkpCisgICAgeworCXRhYiA9IHZpbV9zdHJjaHIodmlycC0+dmlyX2xpbmUgKyAxLCAnXHQnKTsKKwlpZiAodGFiICE9IE5VTEwpCisJeworCSAgICAqdGFiKysgPSAnXDAnOwkvKiBpc29sYXRlIHRoZSB2YXJpYWJsZSBuYW1lICovCisJICAgIGlmICgqdGFiID09ICdTJykJLyogc3RyaW5nIHZhciAqLworCQlpc19zdHJpbmcgPSBUUlVFOworCisJICAgIHRhYiA9IHZpbV9zdHJjaHIodGFiLCAnXHQnKTsKKwkgICAgaWYgKHRhYiAhPSBOVUxMKQorCSAgICB7CisJCS8qIGNyZWF0ZSBhIG5hbWVsZXNzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIHZhbHVlICovCisJCWlmIChpc19zdHJpbmcpCisJCXsKKwkJICAgIHZhbCA9IHZpbWluZm9fcmVhZHN0cmluZyh2aXJwLAorCQkJCSAgICAgICAoaW50KSh0YWIgLSB2aXJwLT52aXJfbGluZSArIDEpLCBUUlVFKTsKKwkJICAgIGlmICh2YWwgIT0gTlVMTCkKKwkJCXZhcnAgPSBhbGxvY19zdHJpbmdfdmFyKHZhbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICB2YXJwID0gYWxsb2NfdmFyKCk7CisJCSAgICBpZiAodmFycCAhPSBOVUxMKQorCQkgICAgeworCQkJdmFycC0+dmFyX3R5cGUgPSBWQVJfTlVNQkVSOworCQkJdmFycC0+dmFyX3ZhbC52YXJfbnVtYmVyID0gYXRvbCgoY2hhciAqKXRhYiArIDEpOworCQkgICAgfQorCQl9CisJCS8qIGFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIHZhcmlhYmxlICovCisJCWlmICh2YXJwICE9IE5VTEwpCisJCXsKKwkJICAgIHNldF92YXIodmlycC0+dmlyX2xpbmUgKyAxLCB2YXJwKTsKKwkJICAgIGZyZWVfdmFyKHZhcnApOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIHZpbWluZm9fcmVhZGxpbmUodmlycCk7Cit9CisKKy8qCisgKiBXcml0ZSBnbG9iYWwgdmFycyB0aGF0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIHRvIHRoZSB2aW1pbmZvIGZpbGUKKyAqLworICAgIHZvaWQKK3dyaXRlX3ZpbWluZm9fdmFybGlzdChmcCkKKyAgICBGSUxFICAgICpmcDsKK3sKKyAgICBnYXJyYXlfVAkqZ2FwID0gJnZhcmlhYmxlczsJCS8qIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIFZBUgkJdGhpc192YXI7CisgICAgaW50CQlpOworCisgICAgaWYgKGZpbmRfdmltaW5mb19wYXJhbWV0ZXIoJyEnKSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGZwcmludGYoZnAsIF8oIlxuIyBnbG9iYWwgdmFyaWFibGVzOlxuIikpOworICAgIGZvciAoaSA9IGdhcC0+Z2FfbGVuOyAtLWkgPj0gMDsgKQorICAgIHsKKwl0aGlzX3ZhciA9ICZWQVJfR0FQX0VOVFJZKGksIGdhcCk7CisJaWYgKHRoaXNfdmFyLT52YXJfbmFtZSAhPSBOVUxMCisJCSYmIHZhcl9mbGF2b3VyKHRoaXNfdmFyLT52YXJfbmFtZSkgPT0gVkFSX0ZMQVZPVVJfVklNSU5GTykKKwl7CisJICAgIGZwcmludGYoZnAsICIhJXNcdCVzXHQiLCB0aGlzX3Zhci0+dmFyX25hbWUsCisJCQkgICh0aGlzX3Zhci0+dmFyX3R5cGUgPT0gVkFSX1NUUklORykgPyAiU1RSIiA6ICJOVU0iKTsKKwkgICAgdmltaW5mb193cml0ZXN0cmluZyhmcCwgZ2V0X3Zhcl9zdHJpbmcodGhpc192YXIpKTsKKwl9CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU0VTU0lPTikgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK3N0b3JlX3Nlc3Npb25fZ2xvYmFscyhmZCkKKyAgICBGSUxFCSpmZDsKK3sKKyAgICBnYXJyYXlfVAkqZ2FwID0gJnZhcmlhYmxlczsJCS8qIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIFZBUgkJdGhpc192YXI7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqcCwgKnQ7CisKKyAgICBmb3IgKGkgPSBnYXAtPmdhX2xlbjsgLS1pID49IDA7ICkKKyAgICB7CisJdGhpc192YXIgPSAmVkFSX0dBUF9FTlRSWShpLCBnYXApOworCWlmICh0aGlzX3Zhci0+dmFyX25hbWUgIT0gTlVMTCkKKwl7CisJICAgIGlmICh2YXJfZmxhdm91cih0aGlzX3Zhci0+dmFyX25hbWUpID09IFZBUl9GTEFWT1VSX1NFU1NJT04pCisJICAgIHsKKwkJLyogRXNjYXBzZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0aCBhIGJhY2tzbGFzaC4gIFR1cm4gYSBMRiBhbmQKKwkJICogQ1IgaW50byBcbiBhbmQgXHIuICovCisJCXAgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKGdldF92YXJfc3RyaW5nKHRoaXNfdmFyKSwKKwkJCQkJCQkoY2hhcl91ICopIlxcXCJcblxyIik7CisJCWlmIChwID09IE5VTEwpCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJCSAgICBjb250aW51ZTsKKwkJZm9yICh0ID0gcDsgKnQgIT0gTlVMOyArK3QpCisJCSAgICBpZiAoKnQgPT0gJ1xuJykKKwkJCSp0ID0gJ24nOworCQkgICAgZWxzZSBpZiAoKnQgPT0gJ1xyJykKKwkJCSp0ID0gJ3InOworCQlpZiAoKGZwcmludGYoZmQsICJsZXQgJXMgPSAlYyVzJWMiLAorCQkJICAgIHRoaXNfdmFyLT52YXJfbmFtZSwKKwkJCSAgICAodGhpc192YXItPnZhcl90eXBlID09IFZBUl9TVFJJTkcpID8gJyInIDogJyAnLAorCQkJICAgIHAsCisJCQkgICAgKHRoaXNfdmFyLT52YXJfdHlwZSA9PSBWQVJfU1RSSU5HKSA/ICciJyA6ICcgJykgPCAwKQorCQkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkKKwkJeworCQkgICAgdmltX2ZyZWUocCk7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCQl2aW1fZnJlZShwKTsKKwkgICAgfQorCisJfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfRVZBTCAqLworCisjaWYgZGVmaW5lZChGRUFUX01PRElGWV9GTkFNRSkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisKKworI2lmZGVmIFdJTjMyNjQKKy8qCisgKiBGdW5jdGlvbnMgZm9yICI6OCIgZmlsZW5hbWUgbW9kaWZpZXI6IGdldCA4LjMgdmVyc2lvbiBvZiBhIGZpbGVuYW1lLgorICovCitzdGF0aWMgaW50IGdldF9zaG9ydF9wYXRobmFtZSBfX0FSR1MoKGNoYXJfdSAqKmZuYW1lcCwgY2hhcl91ICoqYnVmcCwgaW50ICpmbmFtZWxlbikpOworc3RhdGljIGludCBzaG9ydHBhdGhfZm9yX2ludmFsaWRfZm5hbWUgX19BUkdTKChjaGFyX3UgKipmbmFtZSwgY2hhcl91ICoqYnVmcCwgaW50ICpmbmFtZWxlbikpOworc3RhdGljIGludCBzaG9ydHBhdGhfZm9yX3BhcnRpYWwgX19BUkdTKChjaGFyX3UgKipmbmFtZXAsIGNoYXJfdSAqKmJ1ZnAsIGludCAqZm5hbWVsZW4pKTsKKworLyoKKyAqIEdldCB0aGUgc2hvcnQgcGF0aG5hbWUgb2YgYSBmaWxlLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuICpmbmFtZWxlbiBpcyAwIGZvciBub25leGlzdGFudCBwYXRoLgorICovCisgICAgc3RhdGljIGludAorZ2V0X3Nob3J0X3BhdGhuYW1lKGZuYW1lcCwgYnVmcCwgZm5hbWVsZW4pCisgICAgY2hhcl91CSoqZm5hbWVwOworICAgIGNoYXJfdQkqKmJ1ZnA7CisgICAgaW50CQkqZm5hbWVsZW47Cit7CisgICAgaW50CQlsLGxlbjsKKyAgICBjaGFyX3UJKm5ld2J1ZjsKKworICAgIGxlbiA9ICpmbmFtZWxlbjsKKworICAgIGwgPSBHZXRTaG9ydFBhdGhOYW1lKCpmbmFtZXAsICpmbmFtZXAsIGxlbik7CisgICAgaWYgKGwgPiBsZW4gLSAxKQorICAgIHsKKwkvKiBJZiB0aGF0IGRvZXNuJ3Qgd29yayAobm90IGVub3VnaCBzcGFjZSksIHRoZW4gc2F2ZSB0aGUgc3RyaW5nCisJICogYW5kIHRyeSBhZ2FpbiB3aXRoIGEgbmV3IGJ1ZmZlciBiaWcgZW5vdWdoCisJICovCisJbmV3YnVmID0gdmltX3N0cm5zYXZlKCpmbmFtZXAsIGwpOworCWlmIChuZXdidWYgPT0gTlVMTCkKKwkgICAgcmV0dXJuIDA7CisKKwl2aW1fZnJlZSgqYnVmcCk7CisJKmZuYW1lcCA9ICpidWZwID0gbmV3YnVmOworCisJbCA9IEdldFNob3J0UGF0aE5hbWUoKmZuYW1lcCwqZm5hbWVwLGwrMSk7CisKKwkvKiBSZWFsbHkgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLCBhcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggKi8KKyAgICB9CisKKyAgICAqZm5hbWVsZW4gPSBsOworICAgIHJldHVybiAxOworfQorCisvKgorICogQ3JlYXRlIGEgc2hvcnQgcGF0aCBuYW1lLiAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXQgbmVlZHMuCisgKiBEb2Vzbid0IGNvcHkgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgcGFzc2VkIGluLgorICovCisgICAgc3RhdGljIGludAorc2hvcnRwYXRoX2Zvcl9pbnZhbGlkX2ZuYW1lKGZuYW1lLCBidWZwLCBmbmFtZWxlbikKKyAgICBjaGFyX3UJKipmbmFtZTsKKyAgICBjaGFyX3UJKipidWZwOworICAgIGludAkJKmZuYW1lbGVuOworeworICAgIGNoYXJfdQkqcywgKnAsICpwYnVmMiwgKnBidWYzOworICAgIGNoYXJfdQljaDsKKyAgICBpbnQJCWwsbGVuLGxlbjIscGxlbixzbGVuOworCisgICAgLyogTWFrZSBhIGNvcHkgKi8KKyAgICBsZW4yID0gKmZuYW1lbGVuOworICAgIHBidWYyID0gdmltX3N0cm5zYXZlKCpmbmFtZSwgbGVuMik7CisgICAgcGJ1ZjMgPSBOVUxMOworCisgICAgcyA9IHBidWYyICsgbGVuMiAtIDE7IC8qIEZpbmQgdGhlIGVuZCAqLworICAgIHNsZW4gPSAxOworICAgIHBsZW4gPSBsZW4yOworCisgICAgbCA9IDA7CisgICAgaWYgKHZpbV9pc3BhdGhzZXAoKnMpKQorICAgIHsKKwktLXM7CisJKytzbGVuOworCS0tcGxlbjsKKyAgICB9CisKKyAgICBkbworICAgIHsKKwkvKiBHbyBiYWNrIG9uZSBwYXRoLXNlcGVyYXRvciAqLworCXdoaWxlIChzID4gcGJ1ZjIgJiYgIXZpbV9pc3BhdGhzZXAoKnMpKQorCXsKKwkgICAgLS1zOworCSAgICArK3NsZW47CisJICAgIC0tcGxlbjsKKwl9CisJaWYgKHMgPD0gcGJ1ZjIpCisJICAgIGJyZWFrOworCisJLyogUmVtZWJlciB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgYWJvdXQgdG8gYmUgYmxhdHRlZCAqLworCWNoID0gKnM7CisJKnMgPSAwOyAvKiBnZXRfc2hvcnRfcGF0aG5hbWUgcmVxdWlyZXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nICovCisKKwkvKiBUcnkgaXQgaW4gc2l0dSAqLworCXAgPSBwYnVmMjsKKwlpZiAoIWdldF9zaG9ydF9wYXRobmFtZSgmcCwgJnBidWYzLCAmcGxlbikpCisJeworCSAgICB2aW1fZnJlZShwYnVmMik7CisJICAgIHJldHVybiAtMTsKKwl9CisJKnMgPSBjaDsgICAgLyogUHJlc2VydmUgdGhlIHN0cmluZyAqLworICAgIH0gd2hpbGUgKHBsZW4gPT0gMCk7CisKKyAgICBpZiAocGxlbiA+IDApCisgICAgeworCS8qIFJlbWViZXIgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IHN0cmluZy4gICovCisJKmZuYW1lbGVuID0gbGVuID0gcGxlbiArIHNsZW47CisJdmltX2ZyZWUoKmJ1ZnApOworCWlmIChsZW4gPiBsZW4yKQorCXsKKwkgICAgLyogSWYgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBjdXJyZW50bHkgYWxsb2NhdGVkIHN0cmluZywKKwkgICAgICogdGhlbiBjb3B5IGl0IHRvIGEgYnVmZmVyIGJpZyBlbm91Z2guCisJICAgICAqLworCSAgICAqZm5hbWU9ICpidWZwID0gdmltX3N0cm5zYXZlKHAsIGxlbik7CisJICAgIGlmICgqZm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJeworCSAgICAvKiBUcmFuc2ZlciBwYnVmMiB0byBiZWluZyB0aGUgbWFpbiBidWZmZXIgIChpdCdzIGJpZyBlbm91Z2gpICovCisJICAgICpmbmFtZSA9ICpidWZwID0gcGJ1ZjI7CisJICAgIGlmIChwICE9IHBidWYyKQorCQlzdHJuY3B5KCpmbmFtZSwgcCwgcGxlbik7CisJICAgIHBidWYyID0gTlVMTDsKKwl9CisJLyogQ29uY2F0IHRoZSBuZXh0IGJpdCAqLworCXN0cm5jcHkoKmZuYW1lICsgcGxlbiwgcywgc2xlbik7CisJKCpmbmFtZSlbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIHZpbV9mcmVlKHBidWYzKTsKKyAgICB2aW1fZnJlZShwYnVmMik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgYSBwYXRobmFtZSBmb3IgYSBwYXJ0aWFsIHBhdGguCisgKi8KKyAgICBzdGF0aWMgaW50CitzaG9ydHBhdGhfZm9yX3BhcnRpYWwoZm5hbWVwLCBidWZwLCBmbmFtZWxlbikKKyAgICBjaGFyX3UJKipmbmFtZXA7CisgICAgY2hhcl91CSoqYnVmcDsKKyAgICBpbnQJCSpmbmFtZWxlbjsKK3sKKyAgICBpbnQJCXNlcGNvdW50LCBsZW4sIHRmbGVuOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnBidWYsICp0Zm5hbWU7CisgICAgaW50CQloYXNUaWxkZTsKKworICAgIC8qIENvdW50IHVwIHRoZSBwYXRoIHNlcGVyYXRvcnMgZnJvbSB0aGUgUkhTLi4gc28gd2Uga25vdyB3aGljaCBwYXJ0CisgICAgICogb2YgdGhlIHBhdGggdG8gcmV0dXJuLgorICAgICAqLworICAgIHNlcGNvdW50ID0gMDsKKyAgICBmb3IgKHAgPSAqZm5hbWVwICsgKmZuYW1lbGVuIC0gMTsgcCA+PSAqZm5hbWVwOyAtLXApCisJaWYgKHZpbV9pc3BhdGhzZXAoKnApKQorCSAgICArK3NlcGNvdW50OworCisgICAgLyogTmVlZCBmdWxsIHBhdGggZmlyc3QgKHVzZSBleHBhbmRfZW52KCkgdG8gcmVtb3ZlIGEgIn4vIikgKi8KKyAgICBoYXNUaWxkZSA9ICgqKmZuYW1lcCA9PSAnficpOworICAgIGlmIChoYXNUaWxkZSkKKwlwYnVmID0gdGZuYW1lID0gZXhwYW5kX2Vudl9zYXZlKCpmbmFtZXApOworICAgIGVsc2UKKwlwYnVmID0gdGZuYW1lID0gRnVsbE5hbWVfc2F2ZSgqZm5hbWVwLCBGQUxTRSk7CisKKyAgICBsZW4gPSB0ZmxlbiA9IFNUUkxFTih0Zm5hbWUpOworCisgICAgaWYgKCFnZXRfc2hvcnRfcGF0aG5hbWUoJnRmbmFtZSwgJnBidWYsICZsZW4pKQorCXJldHVybiAtMTsKKworICAgIGlmIChsZW4gPT0gMCkKKyAgICB7CisJLyogRG9uJ3QgaGF2ZSBhIHZhbGlkIGZpbGVuYW1lLCBzbyBzaG9ydGVuIHRoZSByZXN0IG9mIHRoZQorCSAqIHBhdGggaWYgd2UgY2FuLiBUaGlzIENBTiBnaXZlIHVzIGludmFsaWQgOC4zIGZpbGVuYW1lcywgYnV0CisJICogdGhlcmUncyBub3QgYSBsb3Qgb2YgcG9pbnQgaW4gZ3Vlc3Npbmcgd2hhdCBpdCBtaWdodCBiZS4KKwkgKi8KKwlsZW4gPSB0ZmxlbjsKKwlpZiAoc2hvcnRwYXRoX2Zvcl9pbnZhbGlkX2ZuYW1lKCZ0Zm5hbWUsICZwYnVmLCAmbGVuKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENvdW50IHRoZSBwYXRocyBiYWNrd2FyZCB0byBmaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc2lyZWQgc3RyaW5nLiAqLworICAgIGZvciAocCA9IHRmbmFtZSArIGxlbiAtIDE7IHAgPj0gdGZuYW1lOyAtLXApCisJaWYgKHZpbV9pc3BhdGhzZXAoKnApKQorCXsKKwkgICAgaWYgKHNlcGNvdW50ID09IDAgfHwgKGhhc1RpbGRlICYmIHNlcGNvdW50ID09IDEpKQorCQlicmVhazsKKwkgICAgZWxzZQorCQlzZXBjb3VudCAtLTsKKwl9CisgICAgaWYgKGhhc1RpbGRlKQorICAgIHsKKwktLXA7CisJaWYgKHAgPj0gdGZuYW1lKQorCSAgICAqcCA9ICd+JzsKKwllbHNlCisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorCSsrcDsKKworICAgIC8qIENvcHkgaW4gdGhlIHN0cmluZyAtIHAgaW5kZXhlcyBpbnRvIHRmbmFtZSAtIGFsbG9jYXRlZCBhdCBwYnVmICovCisgICAgdmltX2ZyZWUoKmJ1ZnApOworICAgICpmbmFtZWxlbiA9IChpbnQpU1RSTEVOKHApOworICAgICpidWZwID0gcGJ1ZjsKKyAgICAqZm5hbWVwID0gcDsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFdJTjMyNjQgKi8KKworLyoKKyAqIEFkanVzdCBhIGZpbGVuYW1lLCBhY2NvcmRpbmcgdG8gYSBzdHJpbmcgb2YgbW9kaWZpZXJzLgorICogKmZuYW1lcCBtdXN0IGJlIE5VTCB0ZXJtaW5hdGVkIHdoZW4gY2FsbGVkLiAgV2hlbiByZXR1cm5pbmcsIHRoZSBsZW5ndGggaXMKKyAqIGRldGVybWluZWQgYnkgKmZuYW1lbGVuLgorICogUmV0dXJucyB2YWxpZCBmbGFncy4KKyAqIFdoZW4gdGhlcmUgaXMgYW4gZXJyb3IsICpmbmFtZXAgaXMgc2V0IHRvIE5VTEwuCisgKi8KKyAgICBpbnQKK21vZGlmeV9mbmFtZShzcmMsIHVzZWRsZW4sIGZuYW1lcCwgYnVmcCwgZm5hbWVsZW4pCisgICAgY2hhcl91CSpzcmM7CQkvKiBzdHJpbmcgd2l0aCBtb2RpZmllcnMgKi8KKyAgICBpbnQJCSp1c2VkbGVuOwkvKiBjaGFyYWN0ZXJzIGFmdGVyIHNyYyB0aGF0IGFyZSB1c2VkICovCisgICAgY2hhcl91CSoqZm5hbWVwOwkvKiBmaWxlIG5hbWUgc28gZmFyICovCisgICAgY2hhcl91CSoqYnVmcDsJCS8qIGJ1ZmZlciBmb3IgYWxsb2NhdGVkIGZpbGUgbmFtZSBvciBOVUxMICovCisgICAgaW50CQkqZm5hbWVsZW47CS8qIGxlbmd0aCBvZiBmbmFtZXAgKi8KK3sKKyAgICBpbnQJCXZhbGlkID0gMDsKKyAgICBjaGFyX3UJKnRhaWw7CisgICAgY2hhcl91CSpzLCAqcCwgKnBidWY7CisgICAgY2hhcl91CWRpcm5hbWVbTUFYUEFUSExdOworICAgIGludAkJYzsKKyAgICBpbnQJCWhhc19mdWxsbmFtZSA9IDA7CisjaWZkZWYgV0lOMzI2NAorICAgIGludAkJaGFzX3Nob3J0bmFtZSA9IDA7CisjZW5kaWYKKworcmVwZWF0OgorICAgIC8qICI6cCIgLSBmdWxsIHBhdGgvZmlsZV9uYW1lICovCisgICAgaWYgKHNyY1sqdXNlZGxlbl0gPT0gJzonICYmIHNyY1sqdXNlZGxlbiArIDFdID09ICdwJykKKyAgICB7CisJaGFzX2Z1bGxuYW1lID0gMTsKKworCXZhbGlkIHw9IFZBTElEX1BBVEg7CisJKnVzZWRsZW4gKz0gMjsKKworCS8qIEV4cGFuZCAifi9wYXRoIiBmb3IgYWxsIHN5c3RlbXMgYW5kICJ+dXNlci9wYXRoIiBmb3IgVW5peCBhbmQgVk1TICovCisJaWYgKCgqZm5hbWVwKVswXSA9PSAnficKKyNpZiAhZGVmaW5lZChVTklYKSAmJiAhKGRlZmluZWQoVk1TKSAmJiBkZWZpbmVkKFVTRVJfSE9NRSkpCisJCSYmICgoKmZuYW1lcClbMV0gPT0gJy8nCisjIGlmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCQkgICAgfHwgKCpmbmFtZXApWzFdID09ICdcXCcKKyMgZW5kaWYKKwkJICAgIHx8ICgqZm5hbWVwKVsxXSA9PSBOVUwpCisKKyNlbmRpZgorCSAgICkKKwl7CisJICAgICpmbmFtZXAgPSBleHBhbmRfZW52X3NhdmUoKmZuYW1lcCk7CisJICAgIHZpbV9mcmVlKCpidWZwKTsJLyogZnJlZSBhbnkgYWxsb2NhdGVkIGZpbGUgbmFtZSAqLworCSAgICAqYnVmcCA9ICpmbmFtZXA7CisJICAgIGlmICgqZm5hbWVwID09IE5VTEwpCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBXaGVuICIvLiIgb3IgIi8uLiIgaXMgdXNlZDogZm9yY2UgZXhwYW5zaW9uIHRvIGdldCByaWQgb2YgaXQuICovCisJZm9yIChwID0gKmZuYW1lcDsgKnAgIT0gTlVMOyArK3ApCisJeworCSAgICBpZiAodmltX2lzcGF0aHNlcCgqcCkKKwkJICAgICYmIHBbMV0gPT0gJy4nCisJCSAgICAmJiAocFsyXSA9PSBOVUwKKwkJCXx8IHZpbV9pc3BhdGhzZXAocFsyXSkKKwkJCXx8IChwWzJdID09ICcuJworCQkJICAgICYmIChwWzNdID09IE5VTCB8fCB2aW1faXNwYXRoc2VwKHBbM10pKSkpKQorCQlicmVhazsKKwl9CisKKwkvKiBGdWxsTmFtZV9zYXZlKCkgaXMgc2xvdywgZG9uJ3QgdXNlIGl0IHdoZW4gbm90IG5lZWRlZC4gKi8KKwlpZiAoKnAgIT0gTlVMIHx8ICF2aW1faXNBYnNOYW1lKCpmbmFtZXApKQorCXsKKwkgICAgKmZuYW1lcCA9IEZ1bGxOYW1lX3NhdmUoKmZuYW1lcCwgKnAgIT0gTlVMKTsKKwkgICAgdmltX2ZyZWUoKmJ1ZnApOwkvKiBmcmVlIGFueSBhbGxvY2F0ZWQgZmlsZSBuYW1lICovCisJICAgICpidWZwID0gKmZuYW1lcDsKKwkgICAgaWYgKCpmbmFtZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEFwcGVuZCBhIHBhdGggc2VwYXJhdG9yIHRvIGEgZGlyZWN0b3J5LiAqLworCWlmIChtY2hfaXNkaXIoKmZuYW1lcCkpCisJeworCSAgICAvKiBNYWtlIHJvb20gZm9yIG9uZSBvciB0d28gZXh0cmEgY2hhcmFjdGVycy4gKi8KKwkgICAgKmZuYW1lcCA9IHZpbV9zdHJuc2F2ZSgqZm5hbWVwLCAoaW50KVNUUkxFTigqZm5hbWVwKSArIDIpOworCSAgICB2aW1fZnJlZSgqYnVmcCk7CS8qIGZyZWUgYW55IGFsbG9jYXRlZCBmaWxlIG5hbWUgKi8KKwkgICAgKmJ1ZnAgPSAqZm5hbWVwOworCSAgICBpZiAoKmZuYW1lcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJICAgIGFkZF9wYXRoc2VwKCpmbmFtZXApOworCX0KKyAgICB9CisKKyAgICAvKiAiOi4iIC0gcGF0aCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKyAgICAvKiAiOn4iIC0gcGF0aCByZWxhdGl2ZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkgKi8KKyAgICAvKiAiOjgiIC0gc2hvcnRuYW1lIHBhdGggLSBwb3N0cG9uZWQgdGlsbCBhZnRlciAqLworICAgIHdoaWxlIChzcmNbKnVzZWRsZW5dID09ICc6JworCQkgICYmICgoYyA9IHNyY1sqdXNlZGxlbiArIDFdKSA9PSAnLicgfHwgYyA9PSAnficgfHwgYyA9PSAnOCcpKQorICAgIHsKKwkqdXNlZGxlbiArPSAyOworCWlmIChjID09ICc4JykKKwl7CisjaWZkZWYgV0lOMzI2NAorCSAgICBoYXNfc2hvcnRuYW1lID0gMTsgLyogUG9zdHBvbmUgdGhpcy4gKi8KKyNlbmRpZgorCSAgICBjb250aW51ZTsKKwl9CisJcGJ1ZiA9IE5VTEw7CisJLyogTmVlZCBmdWxsIHBhdGggZmlyc3QgKHVzZSBleHBhbmRfZW52KCkgdG8gcmVtb3ZlIGEgIn4vIikgKi8KKwlpZiAoIWhhc19mdWxsbmFtZSkKKwl7CisJICAgIGlmIChjID09ICcuJyAmJiAqKmZuYW1lcCA9PSAnficpCisJCXAgPSBwYnVmID0gZXhwYW5kX2Vudl9zYXZlKCpmbmFtZXApOworCSAgICBlbHNlCisJCXAgPSBwYnVmID0gRnVsbE5hbWVfc2F2ZSgqZm5hbWVwLCBGQUxTRSk7CisJfQorCWVsc2UKKwkgICAgcCA9ICpmbmFtZXA7CisKKwloYXNfZnVsbG5hbWUgPSAwOworCisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIGlmIChjID09ICcuJykKKwkgICAgeworCQltY2hfZGlybmFtZShkaXJuYW1lLCBNQVhQQVRITCk7CisJCXMgPSBzaG9ydGVuX2ZuYW1lKHAsIGRpcm5hbWUpOworCQlpZiAocyAhPSBOVUxMKQorCQl7CisJCSAgICAqZm5hbWVwID0gczsKKwkJICAgIGlmIChwYnVmICE9IE5VTEwpCisJCSAgICB7CisJCQl2aW1fZnJlZSgqYnVmcCk7ICAgLyogZnJlZSBhbnkgYWxsb2NhdGVkIGZpbGUgbmFtZSAqLworCQkJKmJ1ZnAgPSBwYnVmOworCQkJcGJ1ZiA9IE5VTEw7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaG9tZV9yZXBsYWNlKE5VTEwsIHAsIGRpcm5hbWUsIE1BWFBBVEhMLCBUUlVFKTsKKwkJLyogT25seSByZXBsYWNlIGl0IHdoZW4gaXQgc3RhcnRzIHdpdGggJ34nICovCisJCWlmICgqZGlybmFtZSA9PSAnficpCisJCXsKKwkJICAgIHMgPSB2aW1fc3Ryc2F2ZShkaXJuYW1lKTsKKwkJICAgIGlmIChzICE9IE5VTEwpCisJCSAgICB7CisJCQkqZm5hbWVwID0gczsKKwkJCXZpbV9mcmVlKCpidWZwKTsKKwkJCSpidWZwID0gczsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIHZpbV9mcmVlKHBidWYpOworCX0KKyAgICB9CisKKyAgICB0YWlsID0gZ2V0dGFpbCgqZm5hbWVwKTsKKyAgICAqZm5hbWVsZW4gPSAoaW50KVNUUkxFTigqZm5hbWVwKTsKKworICAgIC8qICI6aCIgLSBoZWFkLCByZW1vdmUgIi9maWxlX25hbWUiLCBjYW4gYmUgcmVwZWF0ZWQgICovCisgICAgLyogRG9uJ3QgcmVtb3ZlIHRoZSBmaXJzdCAiLyIgb3IgImM6XCIgKi8KKyAgICB3aGlsZSAoc3JjWyp1c2VkbGVuXSA9PSAnOicgJiYgc3JjWyp1c2VkbGVuICsgMV0gPT0gJ2gnKQorICAgIHsKKwl2YWxpZCB8PSBWQUxJRF9IRUFEOworCSp1c2VkbGVuICs9IDI7CisJcyA9IGdldF9wYXN0X2hlYWQoKmZuYW1lcCk7CisJd2hpbGUgKHRhaWwgPiBzICYmIHZpbV9pc3BhdGhzZXAodGFpbFstMV0pKQorCSAgICAtLXRhaWw7CisJKmZuYW1lbGVuID0gKGludCkodGFpbCAtICpmbmFtZXApOworI2lmZGVmIFZNUworCWlmICgqZm5hbWVsZW4gPiAwKQorCSAgICAqZm5hbWVsZW4gKz0gMTsgLyogdGhlIHBhdGggc2VwYXJhdG9yIGlzIHBhcnQgb2YgdGhlIHBhdGggKi8KKyNlbmRpZgorCXdoaWxlICh0YWlsID4gcyAmJiAhdmltX2lzcGF0aHNlcCh0YWlsWy0xXSkpCisJICAgIC0tdGFpbDsKKyAgICB9CisKKyAgICAvKiAiOjgiIC0gc2hvcnRuYW1lICAqLworICAgIGlmIChzcmNbKnVzZWRsZW5dID09ICc6JyAmJiBzcmNbKnVzZWRsZW4gKyAxXSA9PSAnOCcpCisgICAgeworCSp1c2VkbGVuICs9IDI7CisjaWZkZWYgV0lOMzI2NAorCWhhc19zaG9ydG5hbWUgPSAxOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgV0lOMzI2NAorICAgIC8qIENoZWNrIHNob3J0bmFtZSBhZnRlciB3ZSBoYXZlIGRvbmUgJ2hlYWRzJyBhbmQgYmVmb3JlIHdlIGRvICd0YWlscycKKyAgICAgKi8KKyAgICBpZiAoaGFzX3Nob3J0bmFtZSkKKyAgICB7CisJcGJ1ZiA9IE5VTEw7CisJLyogQ29weSB0aGUgc3RyaW5nIGlmIGl0IGlzIHNob3J0ZW5lZCBieSA6aCAqLworCWlmICgqZm5hbWVsZW4gPCAoaW50KVNUUkxFTigqZm5hbWVwKSkKKwl7CisJICAgIHAgPSB2aW1fc3RybnNhdmUoKmZuYW1lcCwgKmZuYW1lbGVuKTsKKwkgICAgaWYgKHAgPT0gMCkKKwkJcmV0dXJuIC0xOworCSAgICB2aW1fZnJlZSgqYnVmcCk7CisJICAgICpidWZwID0gKmZuYW1lcCA9IHA7CisJfQorCisJLyogU3BsaXQgaW50byB0d28gaW1wbGVtZW50YXRpb25zIC0gbWFrZXMgaXQgZWFzaWVyLiAgRmlyc3QgaXMgd2hlcmUKKwkgKiB0aGVyZSBpc24ndCBhIGZ1bGwgbmFtZSBhbHJlYWR5LCBzZWNvbmQgaXMgd2hlcmUgdGhlcmUgaXMuCisJICovCisJaWYgKCFoYXNfZnVsbG5hbWUgJiYgIXZpbV9pc0Fic05hbWUoKmZuYW1lcCkpCisJeworCSAgICBpZiAoc2hvcnRwYXRoX2Zvcl9wYXJ0aWFsKGZuYW1lcCwgYnVmcCwgZm5hbWVsZW4pID09IC0xKQorCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisJICAgIGludAkJbDsKKworCSAgICAvKiBTaW1wbGUgY2FzZSwgYWxyZWFkeSBoYXZlIHRoZSBmdWxsLW5hbWUKKwkgICAgICogTmVhcmx5IGFsd2F5cyBzaG9ydGVyLCBzbyB0cnkgZmlyc3QgdGltZS4gKi8KKwkgICAgbCA9ICpmbmFtZWxlbjsKKwkgICAgaWYgKCFnZXRfc2hvcnRfcGF0aG5hbWUoZm5hbWVwLCBidWZwLCAmbCkpCisJCXJldHVybiAtMTsKKworCSAgICBpZiAobCA9PSAwKQorCSAgICB7CisJCS8qIENvdWxkbid0IGZpbmQgdGhlIGZpbGVuYW1lLi4gc2VhcmNoIHRoZSBwYXRocy4KKwkJICovCisJCWwgPSAqZm5hbWVsZW47CisJCWlmIChzaG9ydHBhdGhfZm9yX2ludmFsaWRfZm5hbWUoZm5hbWVwLCBidWZwLCAmbCApID09IC0xKQorCQkgICAgcmV0dXJuIC0xOworCSAgICB9CisJICAgICpmbmFtZWxlbiA9IGw7CisJfQorICAgIH0KKyNlbmRpZiAvKiBXSU4zMjY0ICovCisKKyAgICAvKiAiOnQiIC0gdGFpbCwganVzdCB0aGUgYmFzZW5hbWUgKi8KKyAgICBpZiAoc3JjWyp1c2VkbGVuXSA9PSAnOicgJiYgc3JjWyp1c2VkbGVuICsgMV0gPT0gJ3QnKQorICAgIHsKKwkqdXNlZGxlbiArPSAyOworCSpmbmFtZWxlbiAtPSAoaW50KSh0YWlsIC0gKmZuYW1lcCk7CisJKmZuYW1lcCA9IHRhaWw7CisgICAgfQorCisgICAgLyogIjplIiAtIGV4dGVuc2lvbiwgY2FuIGJlIHJlcGVhdGVkICovCisgICAgLyogIjpyIiAtIHJvb3QsIHdpdGhvdXQgZXh0ZW5zaW9uLCBjYW4gYmUgcmVwZWF0ZWQgKi8KKyAgICB3aGlsZSAoc3JjWyp1c2VkbGVuXSA9PSAnOicKKwkgICAgJiYgKHNyY1sqdXNlZGxlbiArIDFdID09ICdlJyB8fCBzcmNbKnVzZWRsZW4gKyAxXSA9PSAncicpKQorICAgIHsKKwkvKiBmaW5kIGEgJy4nIGluIHRoZSB0YWlsOgorCSAqIC0gZm9yIHNlY29uZCA6ZTogYmVmb3JlIHRoZSBjdXJyZW50IGZuYW1lCisJICogLSBvdGhlcndpc2U6IFRoZSBsYXN0ICcuJworCSAqLworCWlmIChzcmNbKnVzZWRsZW4gKyAxXSA9PSAnZScgJiYgKmZuYW1lcCA+IHRhaWwpCisJICAgIHMgPSAqZm5hbWVwIC0gMjsKKwllbHNlCisJICAgIHMgPSAqZm5hbWVwICsgKmZuYW1lbGVuIC0gMTsKKwlmb3IgKCA7IHMgPiB0YWlsOyAtLXMpCisJICAgIGlmIChzWzBdID09ICcuJykKKwkJYnJlYWs7CisJaWYgKHNyY1sqdXNlZGxlbiArIDFdID09ICdlJykJCS8qIDplICovCisJeworCSAgICBpZiAocyA+IHRhaWwpCisJICAgIHsKKwkJKmZuYW1lbGVuICs9IChpbnQpKCpmbmFtZXAgLSAocyArIDEpKTsKKwkJKmZuYW1lcCA9IHMgKyAxOworI2lmZGVmIFZNUworCQkvKiBjdXQgdmVyc2lvbiBmcm9tIHRoZSBleHRlbnNpb24gKi8KKwkJcyA9ICpmbmFtZXAgKyAqZm5hbWVsZW4gLSAxOworCQlmb3IgKCA7IHMgPiAqZm5hbWVwOyAtLXMpCisJCSAgICBpZiAoc1swXSA9PSAnOycpCisJCQlicmVhazsKKwkJaWYgKHMgPiAqZm5hbWVwKQorCQkgICAgKmZuYW1lbGVuID0gcyAtICpmbmFtZXA7CisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlIGlmICgqZm5hbWVwIDw9IHRhaWwpCisJCSpmbmFtZWxlbiA9IDA7CisJfQorCWVsc2UJCQkJLyogOnIgKi8KKwl7CisJICAgIGlmIChzID4gdGFpbCkJLyogcmVtb3ZlIG9uZSBleHRlbnNpb24gKi8KKwkJKmZuYW1lbGVuID0gKGludCkocyAtICpmbmFtZXApOworCX0KKwkqdXNlZGxlbiArPSAyOworICAgIH0KKworICAgIC8qICI6cz9wYXQ/Zm9vPyIgLSBzdWJzdGl0dXRlICovCisgICAgLyogIjpncz9wYXQ/Zm9vPyIgLSBnbG9iYWwgc3Vic3RpdHV0ZSAqLworICAgIGlmIChzcmNbKnVzZWRsZW5dID09ICc6JworCSAgICAmJiAoc3JjWyp1c2VkbGVuICsgMV0gPT0gJ3MnCisJCXx8IChzcmNbKnVzZWRsZW4gKyAxXSA9PSAnZycgJiYgc3JjWyp1c2VkbGVuICsgMl0gPT0gJ3MnKSkpCisgICAgeworCWNoYXJfdQkgICAgKnN0cjsKKwljaGFyX3UJICAgICpwYXQ7CisJY2hhcl91CSAgICAqc3ViOworCWludAkgICAgc2VwOworCWNoYXJfdQkgICAgKmZsYWdzOworCWludAkgICAgZGlkaXQgPSBGQUxTRTsKKworCWZsYWdzID0gKGNoYXJfdSAqKSIiOworCXMgPSBzcmMgKyAqdXNlZGxlbiArIDI7CisJaWYgKHNyY1sqdXNlZGxlbiArIDFdID09ICdnJykKKwl7CisJICAgIGZsYWdzID0gKGNoYXJfdSAqKSJnIjsKKwkgICAgKytzOworCX0KKworCXNlcCA9ICpzKys7CisJaWYgKHNlcCkKKwl7CisJICAgIC8qIGZpbmQgZW5kIG9mIHBhdHRlcm4gKi8KKwkgICAgcCA9IHZpbV9zdHJjaHIocywgc2VwKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkgICAgeworCQlwYXQgPSB2aW1fc3RybnNhdmUocywgKGludCkocCAtIHMpKTsKKwkJaWYgKHBhdCAhPSBOVUxMKQorCQl7CisJCSAgICBzID0gcCArIDE7CisJCSAgICAvKiBmaW5kIGVuZCBvZiBzdWJzdGl0dXRpb24gKi8KKwkJICAgIHAgPSB2aW1fc3RyY2hyKHMsIHNlcCk7CisJCSAgICBpZiAocCAhPSBOVUxMKQorCQkgICAgeworCQkJc3ViID0gdmltX3N0cm5zYXZlKHMsIChpbnQpKHAgLSBzKSk7CisJCQlzdHIgPSB2aW1fc3RybnNhdmUoKmZuYW1lcCwgKmZuYW1lbGVuKTsKKwkJCWlmIChzdWIgIT0gTlVMTCAmJiBzdHIgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICAqdXNlZGxlbiA9IChpbnQpKHAgKyAxIC0gc3JjKTsKKwkJCSAgICBzID0gZG9fc3RyaW5nX3N1YihzdHIsIHBhdCwgc3ViLCBmbGFncyk7CisJCQkgICAgaWYgKHMgIT0gTlVMTCkKKwkJCSAgICB7CisJCQkJKmZuYW1lcCA9IHM7CisJCQkJKmZuYW1lbGVuID0gKGludClTVFJMRU4ocyk7CisJCQkJdmltX2ZyZWUoKmJ1ZnApOworCQkJCSpidWZwID0gczsKKwkJCQlkaWRpdCA9IFRSVUU7CisJCQkgICAgfQorCQkJfQorCQkJdmltX2ZyZWUoc3ViKTsKKwkJCXZpbV9mcmVlKHN0cik7CisJCSAgICB9CisJCSAgICB2aW1fZnJlZShwYXQpOworCQl9CisJICAgIH0KKwkgICAgLyogYWZ0ZXIgdXNpbmcgIjpzIiwgcmVwZWF0IGFsbCB0aGUgbW9kaWZpZXJzICovCisJICAgIGlmIChkaWRpdCkKKwkJZ290byByZXBlYXQ7CisJfQorICAgIH0KKworICAgIHJldHVybiB2YWxpZDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBzdWJzdGl0dXRpb24gb24gInN0ciIgd2l0aCBwYXR0ZXJuICJwYXQiIGFuZCBzdWJzdGl0dXRlICJzdWIiLgorICogImZsYWdzIiBjYW4gYmUgImciIHRvIGRvIGEgZ2xvYmFsIHN1YnN0aXR1dGUuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcsIE5VTEwgZm9yIGVycm9yLgorICovCisgICAgY2hhcl91ICoKK2RvX3N0cmluZ19zdWIoc3RyLCBwYXQsIHN1YiwgZmxhZ3MpCisgICAgY2hhcl91CSpzdHI7CisgICAgY2hhcl91CSpwYXQ7CisgICAgY2hhcl91CSpzdWI7CisgICAgY2hhcl91CSpmbGFnczsKK3sKKyAgICBpbnQJCXN1YmxlbjsKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworICAgIGludAkJaTsKKyAgICBpbnQJCWRvX2FsbDsKKyAgICBjaGFyX3UJKnRhaWw7CisgICAgZ2FycmF5X1QJZ2E7CisgICAgY2hhcl91CSpyZXQ7CisgICAgY2hhcl91CSpzYXZlX2NwbzsKKworICAgIC8qIE1ha2UgJ2Nwb3B0aW9ucycgZW1wdHksIHNvIHRoYXQgdGhlICdsJyBmbGFnIGRvZXNuJ3Qgd29yayBoZXJlICovCisgICAgc2F2ZV9jcG8gPSBwX2NwbzsKKyAgICBwX2NwbyA9IChjaGFyX3UgKikiIjsKKworICAgIGdhX2luaXQyKCZnYSwgMSwgMjAwKTsKKworICAgIGRvX2FsbCA9IChmbGFnc1swXSA9PSAnZycpOworCisgICAgcmVnbWF0Y2gucm1faWMgPSBwX2ljOworICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIFJFX01BR0lDICsgUkVfU1RSSU5HKTsKKyAgICBpZiAocmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMKQorICAgIHsKKwl0YWlsID0gc3RyOworCXdoaWxlICh2aW1fcmVnZXhlY19ubCgmcmVnbWF0Y2gsIHN0ciwgKGNvbG5yX1QpKHRhaWwgLSBzdHIpKSkKKwl7CisJICAgIC8qCisJICAgICAqIEdldCBzb21lIHNwYWNlIGZvciBhIHRlbXBvcmFyeSBidWZmZXIgdG8gZG8gdGhlIHN1YnN0aXR1dGlvbgorCSAgICAgKiBpbnRvLiAgSXQgd2lsbCBjb250YWluOgorCSAgICAgKiAtIFRoZSB0ZXh0IHVwIHRvIHdoZXJlIHRoZSBtYXRjaCBpcy4KKwkgICAgICogLSBUaGUgc3Vic3RpdHV0ZWQgdGV4dC4KKwkgICAgICogLSBUaGUgdGV4dCBhZnRlciB0aGUgbWF0Y2guCisJICAgICAqLworCSAgICBzdWJsZW4gPSB2aW1fcmVnc3ViKCZyZWdtYXRjaCwgc3ViLCB0YWlsLCBGQUxTRSwgVFJVRSwgRkFMU0UpOworCSAgICBpZiAoZ2FfZ3JvdygmZ2EsIChpbnQpKFNUUkxFTih0YWlsKSArIHN1YmxlbiAtCisJCQkgICAgKHJlZ21hdGNoLmVuZHBbMF0gLSByZWdtYXRjaC5zdGFydHBbMF0pKSkgPT0gRkFJTCkKKwkgICAgeworCQlnYV9jbGVhcigmZ2EpOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIGNvcHkgdGhlIHRleHQgdXAgdG8gd2hlcmUgdGhlIG1hdGNoIGlzICovCisJICAgIGkgPSAoaW50KShyZWdtYXRjaC5zdGFydHBbMF0gLSB0YWlsKTsKKwkgICAgbWNoX21lbW1vdmUoKGNoYXJfdSAqKWdhLmdhX2RhdGEgKyBnYS5nYV9sZW4sIHRhaWwsIChzaXplX3QpaSk7CisJICAgIC8qIGFkZCB0aGUgc3Vic3RpdHV0ZWQgdGV4dCAqLworCSAgICAodm9pZCl2aW1fcmVnc3ViKCZyZWdtYXRjaCwgc3ViLCAoY2hhcl91ICopZ2EuZ2FfZGF0YQorCQkJCQkgICsgZ2EuZ2FfbGVuICsgaSwgVFJVRSwgVFJVRSwgRkFMU0UpOworCSAgICBnYS5nYV9sZW4gKz0gaSArIHN1YmxlbiAtIDE7CisJICAgIGdhLmdhX3Jvb20gLT0gaSArIHN1YmxlbiAtIDE7CisJICAgIC8qIGF2b2lkIGdldHRpbmcgc3R1Y2sgb24gYSBtYXRjaCB3aXRoIGFuIGVtcHR5IHN0cmluZyAqLworCSAgICBpZiAodGFpbCA9PSByZWdtYXRjaC5lbmRwWzBdKQorCSAgICB7CisJCWlmICgqdGFpbCA9PSBOVUwpCisJCSAgICBicmVhazsKKwkJKigoY2hhcl91ICopZ2EuZ2FfZGF0YSArIGdhLmdhX2xlbikgPSAqdGFpbCsrOworCQkrK2dhLmdhX2xlbjsKKwkJLS1nYS5nYV9yb29tOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQl0YWlsID0gcmVnbWF0Y2guZW5kcFswXTsKKwkJaWYgKCp0YWlsID09IE5VTCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmICghZG9fYWxsKQorCQlicmVhazsKKwl9CisKKwlpZiAoZ2EuZ2FfZGF0YSAhPSBOVUxMKQorCSAgICBTVFJDUFkoKGNoYXIgKilnYS5nYV9kYXRhICsgZ2EuZ2FfbGVuLCB0YWlsKTsKKworCXZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworICAgIH0KKworICAgIHJldCA9IHZpbV9zdHJzYXZlKGdhLmdhX2RhdGEgPT0gTlVMTCA/IHN0ciA6IChjaGFyX3UgKilnYS5nYV9kYXRhKTsKKyAgICBnYV9jbGVhcigmZ2EpOworICAgIHBfY3BvID0gc2F2ZV9jcG87CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogZGVmaW5lZChGRUFUX01PRElGWV9GTkFNRSkgfHwgZGVmaW5lZChGRUFUX0VWQUwpICovCmRpZmYgLS1naXQgYS9zcmMvZXhfY21kcy5jIGIvc3JjL2V4X2NtZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAzNmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V4X2NtZHMuYwpAQCAtMCwwICsxLDYxOTggQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIGV4X2NtZHMuYzogc29tZSBmdW5jdGlvbnMgZm9yIGNvbW1hbmQgbGluZSBjb21tYW5kcworICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZmRlZiBGRUFUX0VYX0VYVFJBCitzdGF0aWMgaW50IGxpbmVsZW4gX19BUkdTKChpbnQgKmhhc190YWIpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZG9fZmlsdGVyIF9fQVJHUygobGluZW5yX1QgbGluZTEsIGxpbmVucl9UIGxpbmUyLCBleGFyZ19UICplYXAsIGNoYXJfdSAqY21kLCBpbnQgZG9faW4sIGludCBkb19vdXQpKTsKKyNpZmRlZiBGRUFUX1ZJTUlORk8KK3N0YXRpYyBjaGFyX3UgKnZpbWluZm9fZmlsZW5hbWUgX19BUkdTKChjaGFyX3UJKikpOworc3RhdGljIHZvaWQgZG9fdmltaW5mbyBfX0FSR1MoKEZJTEUgKmZwX2luLCBGSUxFICpmcF9vdXQsIGludCB3YW50X2luZm8sIGludCB3YW50X21hcmtzLCBpbnQgZm9yY2VfcmVhZCkpOworc3RhdGljIGludCB2aW1pbmZvX2VuY29kaW5nIF9fQVJHUygodmlyX1QgKnZpcnApKTsKK3N0YXRpYyBpbnQgcmVhZF92aW1pbmZvX3VwX3RvX21hcmtzIF9fQVJHUygodmlyX1QgKnZpcnAsIGludCBmb3JjZWl0LCBpbnQgd3JpdGluZykpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgY2hlY2tfb3ZlcndyaXRlIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBidWZfVCAqYnVmLCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmZmbmFtZSwgaW50IG90aGVyKSk7CitzdGF0aWMgaW50IGNoZWNrX3JlYWRvbmx5IF9fQVJHUygoaW50ICpmb3JjZWl0LCBidWZfVCAqYnVmKSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECitzdGF0aWMgdm9pZCBkZWxidWZfbXNnIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgZG9fc3ViX21zZyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBfUlRMRU5UUllGCisjZW5kaWYKKwloZWxwX2NvbXBhcmUgX19BUkdTKChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIpKTsKKworLyoKKyAqICI6YXNjaWkiIGFuZCAiZ2EiLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitkb19hc2NpaShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJYzsKKyAgICBjaGFyCWJ1ZjFbMjBdOworICAgIGNoYXIJYnVmMlsyMF07CisgICAgY2hhcl91CWJ1ZjNbN107CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJYzEgPSAwOworICAgIGludAkJYzIgPSAwOworICAgIGludAkJbGVuOworCisgICAgaWYgKGVuY191dGY4KQorCWMgPSB1dGZjX3B0cjJjaGFyKG1sX2dldF9jdXJzb3IoKSwgJmMxLCAmYzIpOworICAgIGVsc2UKKyNlbmRpZgorCWMgPSBnY2hhcl9jdXJzb3IoKTsKKyAgICBpZiAoYyA9PSBOVUwpCisgICAgeworCU1TRygiTlVMIik7CisJcmV0dXJuOworICAgIH0KKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBJT2J1ZmZbMF0gPSBOVUw7CisgICAgaWYgKCFoYXNfbWJ5dGUgfHwgKGVuY19kYmNzICE9IDAgJiYgYyA8IDB4MTAwKSB8fCBjIDwgMHg4MCkKKyNlbmRpZgorICAgIHsKKwlpZiAoYyA9PSBOTCkJICAgIC8qIE5VTCBpcyBzdG9yZWQgYXMgTkwgKi8KKwkgICAgYyA9IE5VTDsKKwlpZiAodmltX2lzcHJpbnRjX3N0cmljdChjKSAmJiAoYyA8ICcgJworI2lmbmRlZiBFQkNESUMKKwkJICAgIHx8IGMgPiAnficKKyNlbmRpZgorCQkJICAgICAgICkpCisJeworCSAgICB0cmFuc2NoYXJfbm9ucHJpbnQoYnVmMywgYyk7CisJICAgIHNwcmludGYoYnVmMSwgIiAgPCVzPiIsIChjaGFyICopYnVmMyk7CisJfQorCWVsc2UKKwkgICAgYnVmMVswXSA9IE5VTDsKKyNpZm5kZWYgRUJDRElDCisJaWYgKGMgPj0gMHg4MCkKKwkgICAgc3ByaW50ZihidWYyLCAiICA8TS0lcz4iLCB0cmFuc2NoYXIoYyAmIDB4N2YpKTsKKwllbHNlCisjZW5kaWYKKwkgICAgYnVmMlswXSA9IE5VTDsKKwlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iKSwKKwkJdHJhbnNjaGFyKGMpLCBidWYxLCBidWYyLCBjLCBjLCBjKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJYyA9IGMxOworCWMxID0gYzI7CisJYzIgPSAwOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIFJlcGVhdCBmb3IgY29tYmluaW5nIGNoYXJhY3RlcnMuICovCisgICAgd2hpbGUgKGhhc19tYnl0ZSAmJiAoYyA+PSAweDEwMCB8fCAoZW5jX3V0ZjggJiYgYyA+PSAweDgwKSkpCisgICAgeworCWxlbiA9IChpbnQpU1RSTEVOKElPYnVmZik7CisJLyogVGhpcyBhc3N1bWVzIGV2ZXJ5IG11bHRpLWJ5dGUgY2hhciBpcyBwcmludGFibGUuLi4gKi8KKwlpZiAobGVuID4gMCkKKwkgICAgSU9idWZmW2xlbisrXSA9ICcgJzsKKwlJT2J1ZmZbbGVuKytdID0gJzwnOworCWlmICh1dGZfaXNjb21wb3NpbmcoYykKKyNpZmRlZiBVU0VfR1VJCisJCSYmICFndWkuaW5fdXNlCisjZW5kaWYKKwkJKQorCSAgICBJT2J1ZmZbbGVuKytdID0gJyAnOyAvKiBkcmF3IGNvbXBvc2luZyBjaGFyIG9uIHRvcCBvZiBhIHNwYWNlICovCisJSU9idWZmW2xlbiArICgqbWJfY2hhcjJieXRlcykoYywgSU9idWZmICsgbGVuKV0gPSBOVUw7CisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiArIFNUUkxFTihJT2J1ZmYpLAorCQkJYyA8IDB4MTAwMDAgPyBfKCI+ICVkLCBIZXggJTA0eCwgT2N0YWwgJW8iKQorCQkJCSAgICA6IF8oIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIpLCBjLCBjLCBjKTsKKwljID0gYzE7CisJYzEgPSBjMjsKKwljMiA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBtc2coSU9idWZmKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FWF9FWFRSQSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiAiOmxlZnQiLCAiOmNlbnRlciIgYW5kICI6cmlnaHQiOiBhbGlnbiB0ZXh0LgorICovCisgICAgdm9pZAorZXhfYWxpZ24oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBwb3NfVAlzYXZlX2N1cnBvczsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWluZGVudCA9IDA7CisgICAgaW50CQluZXdfaW5kZW50OworICAgIGludAkJaGFzX3RhYjsKKyAgICBpbnQJCXdpZHRoOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoY3Vyd2luLT53X3BfcmwpCisgICAgeworCS8qIHN3aXRjaCBsZWZ0IGFuZCByaWdodCBhbGlnbmluZyAqLworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfcmlnaHQpCisJICAgIGVhcC0+Y21kaWR4ID0gQ01EX2xlZnQ7CisJZWxzZSBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2xlZnQpCisJICAgIGVhcC0+Y21kaWR4ID0gQ01EX3JpZ2h0OworICAgIH0KKyNlbmRpZgorCisgICAgd2lkdGggPSBhdG9pKChjaGFyICopZWFwLT5hcmcpOworICAgIHNhdmVfY3VycG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2xlZnQpICAgIC8qIHdpZHRoIGlzIHVzZWQgZm9yIG5ldyBpbmRlbnQgKi8KKyAgICB7CisJaWYgKHdpZHRoID49IDApCisJICAgIGluZGVudCA9IHdpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogaWYgJ3RleHR3aWR0aCcgc2V0LCB1c2UgaXQKKwkgKiBlbHNlIGlmICd3cmFwbWFyZ2luJyBzZXQsIHVzZSBpdAorCSAqIGlmIGludmFsaWQgdmFsdWUsIHVzZSA4MAorCSAqLworCWlmICh3aWR0aCA8PSAwKQorCSAgICB3aWR0aCA9IGN1cmJ1Zi0+Yl9wX3R3OworCWlmICh3aWR0aCA9PSAwICYmIGN1cmJ1Zi0+Yl9wX3dtID4gMCkKKwkgICAgd2lkdGggPSBXX1dJRFRIKGN1cndpbikgLSBjdXJidWYtPmJfcF93bTsKKwlpZiAod2lkdGggPD0gMCkKKwkgICAgd2lkdGggPSA4MDsKKyAgICB9CisKKyAgICBpZiAodV9zYXZlKChsaW5lbnJfVCkoZWFwLT5saW5lMSAtIDEpLCAobGluZW5yX1QpKGVhcC0+bGluZTIgKyAxKSkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICBmb3IgKGN1cndpbi0+d19jdXJzb3IubG51bSA9IGVhcC0+bGluZTE7CisJCSBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPD0gZWFwLT5saW5lMjsgKytjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisgICAgeworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfbGVmdCkJCS8qIGxlZnQgYWxpZ24gKi8KKwkgICAgbmV3X2luZGVudCA9IGluZGVudDsKKwllbHNlCisJeworCSAgICBsZW4gPSBsaW5lbGVuKGVhcC0+Y21kaWR4ID09IENNRF9yaWdodCA/ICZoYXNfdGFiCisJCQkJCQkgICA6IE5VTEwpIC0gZ2V0X2luZGVudCgpOworCisJICAgIGlmIChsZW4gPD0gMCkJCQkvKiBza2lwIGJsYW5rIGxpbmVzICovCisJCWNvbnRpbnVlOworCisJICAgIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfY2VudGVyKQorCQluZXdfaW5kZW50ID0gKHdpZHRoIC0gbGVuKSAvIDI7CisJICAgIGVsc2UKKwkgICAgeworCQluZXdfaW5kZW50ID0gd2lkdGggLSBsZW47CS8qIHJpZ2h0IGFsaWduICovCisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgZW1iZWRkZWQgVEFCcyBkb24ndCBtYWtlIHRoZSB0ZXh0IGdvIHRvbyBmYXIKKwkJICogdG8gdGhlIHJpZ2h0LgorCQkgKi8KKwkJaWYgKGhhc190YWIpCisJCSAgICB3aGlsZSAobmV3X2luZGVudCA+IDApCisJCSAgICB7CisJCQkodm9pZClzZXRfaW5kZW50KG5ld19pbmRlbnQsIDApOworCQkJaWYgKGxpbmVsZW4oTlVMTCkgPD0gd2lkdGgpCisJCQl7CisJCQkgICAgLyoKKwkJCSAgICAgKiBOb3cgdHJ5IHRvIG1vdmUgdGhlIGxpbmUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0bworCQkJICAgICAqIHRoZSByaWdodC4gIFN0b3Agd2hlbiBpdCBtb3ZlcyB0b28gZmFyLgorCQkJICAgICAqLworCQkJICAgIGRvCisJCQkJKHZvaWQpc2V0X2luZGVudCgrK25ld19pbmRlbnQsIDApOworCQkJICAgIHdoaWxlIChsaW5lbGVuKE5VTEwpIDw9IHdpZHRoKTsKKwkJCSAgICAtLW5ld19pbmRlbnQ7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQktLW5ld19pbmRlbnQ7CisJCSAgICB9CisJICAgIH0KKwl9CisJaWYgKG5ld19pbmRlbnQgPCAwKQorCSAgICBuZXdfaW5kZW50ID0gMDsKKwkodm9pZClzZXRfaW5kZW50KG5ld19pbmRlbnQsIDApOwkJLyogc2V0IGluZGVudCAqLworICAgIH0KKyAgICBjaGFuZ2VkX2xpbmVzKGVhcC0+bGluZTEsIDAsIGVhcC0+bGluZTIgKyAxLCAwTCk7CisgICAgY3Vyd2luLT53X2N1cnNvciA9IHNhdmVfY3VycG9zOworICAgIGJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBsaW5lLCBleGNsdWRpbmcgdHJhaWxpbmcgd2hpdGUgc3BhY2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitsaW5lbGVuKGhhc190YWIpCisgICAgaW50CSAgICAqaGFzX3RhYjsKK3sKKyAgICBjaGFyX3UgICpsaW5lOworICAgIGNoYXJfdSAgKmZpcnN0OworICAgIGNoYXJfdSAgKmxhc3Q7CisgICAgaW50CSAgICBzYXZlOworICAgIGludAkgICAgbGVuOworCisgICAgLyogZmluZCB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciAqLworICAgIGxpbmUgPSBtbF9nZXRfY3VybGluZSgpOworICAgIGZpcnN0ID0gc2tpcHdoaXRlKGxpbmUpOworCisgICAgLyogZmluZCB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgKi8KKyAgICBmb3IgKGxhc3QgPSBmaXJzdCArIFNUUkxFTihmaXJzdCk7CisJCQkJbGFzdCA+IGZpcnN0ICYmIHZpbV9pc3doaXRlKGxhc3RbLTFdKTsgLS1sYXN0KQorCTsKKyAgICBzYXZlID0gKmxhc3Q7CisgICAgKmxhc3QgPSBOVUw7CisgICAgbGVuID0gbGluZXRhYnNpemUobGluZSk7CQkvKiBnZXQgbGluZSBsZW5ndGggKi8KKyAgICBpZiAoaGFzX3RhYiAhPSBOVUxMKQkJLyogY2hlY2sgZm9yIGVtYmVkZGVkIFRBQiAqLworCSpoYXNfdGFiID0gKHZpbV9zdHJyY2hyKGZpcnN0LCBUQUIpICE9IE5VTEwpOworICAgICpsYXN0ID0gc2F2ZTsKKworICAgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiAiOnJldGFiIi4KKyAqLworICAgIHZvaWQKK2V4X3JldGFiKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCWdvdF90YWIgPSBGQUxTRTsKKyAgICBsb25nCW51bV9zcGFjZXMgPSAwOworICAgIGxvbmcJbnVtX3RhYnM7CisgICAgbG9uZwlsZW47CisgICAgbG9uZwljb2w7CisgICAgbG9uZwl2Y29sOworICAgIGxvbmcJc3RhcnRfY29sID0gMDsJCS8qIEZvciBzdGFydCBvZiB3aGl0ZS1zcGFjZSBzdHJpbmcgKi8KKyAgICBsb25nCXN0YXJ0X3Zjb2wgPSAwOwkJLyogRm9yIHN0YXJ0IG9mIHdoaXRlLXNwYWNlIHN0cmluZyAqLworICAgIGludAkJdGVtcDsKKyAgICBsb25nCW9sZF9sZW47CisgICAgY2hhcl91CSpwdHI7CisgICAgY2hhcl91CSpuZXdfbGluZSA9IChjaGFyX3UgKikxOyAgICAvKiBpbml0IHRvIG5vbi1OVUxMICovCisgICAgaW50CQlkaWRfdW5kbzsJCS8qIGNhbGxlZCB1X3NhdmUgZm9yIGN1cnJlbnQgbGluZSAqLworICAgIGludAkJbmV3X3RzOworICAgIGludAkJc2F2ZV9saXN0OworICAgIGxpbmVucl9UCWZpcnN0X2xpbmUgPSAwOwkJLyogZmlyc3QgY2hhbmdlZCBsaW5lICovCisgICAgbGluZW5yX1QJbGFzdF9saW5lID0gMDsJCS8qIGxhc3QgY2hhbmdlZCBsaW5lICovCisKKyAgICBzYXZlX2xpc3QgPSBjdXJ3aW4tPndfcF9saXN0OworICAgIGN1cndpbi0+d19wX2xpc3QgPSAwOwkgICAgLyogZG9uJ3Qgd2FudCBsaXN0IG1vZGUgaGVyZSAqLworCisgICAgbmV3X3RzID0gZ2V0ZGlnaXRzKCYoZWFwLT5hcmcpKTsKKyAgICBpZiAobmV3X3RzIDwgMCkKKyAgICB7CisJRU1TRyhfKGVfcG9zaXRpdmUpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChuZXdfdHMgPT0gMCkKKwluZXdfdHMgPSBjdXJidWYtPmJfcF90czsKKyAgICBmb3IgKGxudW0gPSBlYXAtPmxpbmUxOyAhZ290X2ludCAmJiBsbnVtIDw9IGVhcC0+bGluZTI7ICsrbG51bSkKKyAgICB7CisJcHRyID0gbWxfZ2V0KGxudW0pOworCWNvbCA9IDA7CisJdmNvbCA9IDA7CisJZGlkX3VuZG8gPSBGQUxTRTsKKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKHZpbV9pc3doaXRlKHB0cltjb2xdKSkKKwkgICAgeworCQlpZiAoIWdvdF90YWIgJiYgbnVtX3NwYWNlcyA9PSAwKQorCQl7CisJCSAgICAvKiBGaXJzdCBjb25zZWN1dGl2ZSB3aGl0ZS1zcGFjZSAqLworCQkgICAgc3RhcnRfdmNvbCA9IHZjb2w7CisJCSAgICBzdGFydF9jb2wgPSBjb2w7CisJCX0KKwkJaWYgKHB0cltjb2xdID09ICcgJykKKwkJICAgIG51bV9zcGFjZXMrKzsKKwkJZWxzZQorCQkgICAgZ290X3RhYiA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChnb3RfdGFiIHx8IChlYXAtPmZvcmNlaXQgJiYgbnVtX3NwYWNlcyA+IDEpKQorCQl7CisJCSAgICAvKiBSZXRhYnVsYXRlIHRoaXMgc3RyaW5nIG9mIHdoaXRlLXNwYWNlICovCisKKwkJICAgIC8qIGxlbiBpcyB2aXJ0dWFsIGxlbmd0aCBvZiB3aGl0ZSBzdHJpbmcgKi8KKwkJICAgIGxlbiA9IG51bV9zcGFjZXMgPSB2Y29sIC0gc3RhcnRfdmNvbDsKKwkJICAgIG51bV90YWJzID0gMDsKKwkJICAgIGlmICghY3VyYnVmLT5iX3BfZXQpCisJCSAgICB7CisJCQl0ZW1wID0gbmV3X3RzIC0gKHN0YXJ0X3Zjb2wgJSBuZXdfdHMpOworCQkJaWYgKG51bV9zcGFjZXMgPj0gdGVtcCkKKwkJCXsKKwkJCSAgICBudW1fc3BhY2VzIC09IHRlbXA7CisJCQkgICAgbnVtX3RhYnMrKzsKKwkJCX0KKwkJCW51bV90YWJzICs9IG51bV9zcGFjZXMgLyBuZXdfdHM7CisJCQludW1fc3BhY2VzIC09IChudW1fc3BhY2VzIC8gbmV3X3RzKSAqIG5ld190czsKKwkJICAgIH0KKwkJICAgIGlmIChjdXJidWYtPmJfcF9ldCB8fCBnb3RfdGFiIHx8CisJCQkJCShudW1fc3BhY2VzICsgbnVtX3RhYnMgPCBsZW4pKQorCQkgICAgeworCQkJaWYgKGRpZF91bmRvID09IEZBTFNFKQorCQkJeworCQkJICAgIGRpZF91bmRvID0gVFJVRTsKKwkJCSAgICBpZiAodV9zYXZlKChsaW5lbnJfVCkobG51bSAtIDEpLAorCQkJCQkJKGxpbmVucl9UKShsbnVtICsgMSkpID09IEZBSUwpCisJCQkgICAgeworCQkJCW5ld19saW5lID0gTlVMTDsJLyogZmxhZyBvdXQtb2YtbWVtb3J5ICovCisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfQorCisJCQkvKiBsZW4gaXMgYWN0dWFsIG51bWJlciBvZiB3aGl0ZSBjaGFyYWN0ZXJzIHVzZWQgKi8KKwkJCWxlbiA9IG51bV9zcGFjZXMgKyBudW1fdGFiczsKKwkJCW9sZF9sZW4gPSAobG9uZylTVFJMRU4ocHRyKTsKKwkJCW5ld19saW5lID0gbGFsbG9jKG9sZF9sZW4gLSBjb2wgKyBzdGFydF9jb2wgKyBsZW4gKyAxLAorCQkJCQkJCQkJVFJVRSk7CisJCQlpZiAobmV3X2xpbmUgPT0gTlVMTCkKKwkJCSAgICBicmVhazsKKwkJCWlmIChzdGFydF9jb2wgPiAwKQorCQkJICAgIG1jaF9tZW1tb3ZlKG5ld19saW5lLCBwdHIsIChzaXplX3Qpc3RhcnRfY29sKTsKKwkJCW1jaF9tZW1tb3ZlKG5ld19saW5lICsgc3RhcnRfY29sICsgbGVuLAorCQkJCSAgICAgIHB0ciArIGNvbCwgKHNpemVfdCkob2xkX2xlbiAtIGNvbCArIDEpKTsKKwkJCXB0ciA9IG5ld19saW5lICsgc3RhcnRfY29sOworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBsZW47IGNvbCsrKQorCQkJICAgIHB0cltjb2xdID0gKGNvbCA8IG51bV90YWJzKSA/ICdcdCcgOiAnICc7CisJCQltbF9yZXBsYWNlKGxudW0sIG5ld19saW5lLCBGQUxTRSk7CisJCQlpZiAoZmlyc3RfbGluZSA9PSAwKQorCQkJICAgIGZpcnN0X2xpbmUgPSBsbnVtOworCQkJbGFzdF9saW5lID0gbG51bTsKKwkJCXB0ciA9IG5ld19saW5lOworCQkJY29sID0gc3RhcnRfY29sICsgbGVuOworCQkgICAgfQorCQl9CisJCWdvdF90YWIgPSBGQUxTRTsKKwkJbnVtX3NwYWNlcyA9IDA7CisJICAgIH0KKwkgICAgaWYgKHB0cltjb2xdID09IE5VTCkKKwkJYnJlYWs7CisJICAgIHZjb2wgKz0gY2hhcnRhYnNpemUocHRyICsgY29sLCAoY29sbnJfVCl2Y29sKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0ciArIGNvbCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK2NvbDsKKwl9CisJaWYgKG5ld19saW5lID09IE5VTEwpCQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCSAgICBicmVhazsKKwlsaW5lX2JyZWFrY2hlY2soKTsKKyAgICB9CisgICAgaWYgKGdvdF9pbnQpCisJRU1TRyhfKGVfaW50ZXJyKSk7CisKKyAgICBpZiAoY3VyYnVmLT5iX3BfdHMgIT0gbmV3X3RzKQorCXJlZHJhd19jdXJidWZfbGF0ZXIoTk9UX1ZBTElEKTsKKyAgICBpZiAoZmlyc3RfbGluZSAhPSAwKQorCWNoYW5nZWRfbGluZXMoZmlyc3RfbGluZSwgMCwgbGFzdF9saW5lICsgMSwgMEwpOworCisgICAgY3Vyd2luLT53X3BfbGlzdCA9IHNhdmVfbGlzdDsJLyogcmVzdG9yZSAnbGlzdCcgKi8KKworICAgIGN1cmJ1Zi0+Yl9wX3RzID0gbmV3X3RzOworICAgIGNvbGFkdmFuY2UoY3Vyd2luLT53X2N1cnN3YW50KTsKKworICAgIHVfY2xlYXJsaW5lKCk7Cit9CisjZW5kaWYKKworLyoKKyAqIDptb3ZlIGNvbW1hbmQgLSBtb3ZlIGxpbmVzIGxpbmUxLWxpbmUyIHRvIGxpbmUgZGVzdAorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorZG9fbW92ZShsaW5lMSwgbGluZTIsIGRlc3QpCisgICAgbGluZW5yX1QJbGluZTE7CisgICAgbGluZW5yX1QJbGluZTI7CisgICAgbGluZW5yX1QJZGVzdDsKK3sKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBsaW5lbnJfVAlsOworICAgIGxpbmVucl9UCWV4dHJhOwkgICAgLyogTnVtIGxpbmVzIGFkZGVkIGJlZm9yZSBsaW5lMSAqLworICAgIGxpbmVucl9UCW51bV9saW5lczsgIC8qIE51bSBsaW5lcyBtb3ZlZCAqLworICAgIGxpbmVucl9UCWxhc3RfbGluZTsgIC8qIExhc3QgbGluZSBpbiBmaWxlIGFmdGVyIGFkZGluZyBuZXcgdGV4dCAqLworCisgICAgaWYgKGRlc3QgPj0gbGluZTEgJiYgZGVzdCA8IGxpbmUyKQorICAgIHsKKwlFTVNHKF8oIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIikpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIG51bV9saW5lcyA9IGxpbmUyIC0gbGluZTEgKyAxOworCisgICAgLyoKKyAgICAgKiBGaXJzdCB3ZSBjb3B5IHRoZSBvbGQgdGV4dCB0byBpdHMgbmV3IGxvY2F0aW9uIC0tIHdlYmIKKyAgICAgKiBBbHNvIGNvcHkgdGhlIGZsYWcgdGhhdCAiOmdsb2JhbCIgY29tbWFuZCB1c2VzLgorICAgICAqLworICAgIGlmICh1X3NhdmUoZGVzdCwgZGVzdCArIDEpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisgICAgZm9yIChleHRyYSA9IDAsIGwgPSBsaW5lMTsgbCA8PSBsaW5lMjsgbCsrKQorICAgIHsKKwlzdHIgPSB2aW1fc3Ryc2F2ZShtbF9nZXQobCArIGV4dHJhKSk7CisJaWYgKHN0ciAhPSBOVUxMKQorCXsKKwkgICAgbWxfYXBwZW5kKGRlc3QgKyBsIC0gbGluZTEsIHN0ciwgKGNvbG5yX1QpMCwgRkFMU0UpOworCSAgICB2aW1fZnJlZShzdHIpOworCSAgICBpZiAoZGVzdCA8IGxpbmUxKQorCQlleHRyYSsrOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyB3ZSBtdXN0IGJlIGNhcmVmdWwgYWRqdXN0aW5nIG91ciBtYXJrcyBzbyB0aGF0IHdlIGRvbid0IG92ZXJsYXAgb3VyCisgICAgICogbWFya19hZGp1c3QoKSBjYWxscy4KKyAgICAgKgorICAgICAqIFdlIGFkanVzdCB0aGUgbWFya3Mgd2l0aGluIHRoZSBvbGQgdGV4dCBzbyB0aGF0IHRoZXkgcmVmZXIgdG8gdGhlCisgICAgICogbGFzdCBsaW5lcyBvZiB0aGUgZmlsZSAodGVtcG9yYXJpbHkpLCBiZWNhdXNlIHdlIGtub3cgbm8gb3RoZXIgbWFya3MKKyAgICAgKiB3aWxsIGJlIHNldCB0aGVyZSBzaW5jZSB0aGVzZSBsaW5lIG51bWJlcnMgZGlkIG5vdCBleGlzdCB1bnRpbCB3ZSBhZGRlZAorICAgICAqIG91ciBuZXcgbGluZXMuCisgICAgICoKKyAgICAgKiBUaGVuIHdlIGFkanVzdCB0aGUgbWFya3Mgb24gbGluZXMgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgdGV4dCBwb3NpdGlvbnMKKyAgICAgKiAoZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcykuCisgICAgICoKKyAgICAgKiBBbmQgRmluYWxseSB3ZSBhZGp1c3QgdGhlIG1hcmtzIHdlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGJhY2sgdG8KKyAgICAgKiB0aGVpciBmaW5hbCBkZXN0aW5hdGlvbiBhdCB0aGUgbmV3IHRleHQgcG9zaXRpb24gLS0gd2ViYgorICAgICAqLworICAgIGxhc3RfbGluZSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIG1hcmtfYWRqdXN0KGxpbmUxLCBsaW5lMiwgbGFzdF9saW5lIC0gbGluZTIsIDBMKTsKKyAgICBpZiAoZGVzdCA+PSBsaW5lMikKKyAgICB7CisJbWFya19hZGp1c3QobGluZTIgKyAxLCBkZXN0LCAtbnVtX2xpbmVzLCAwTCk7CisJY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSBkZXN0IC0gbnVtX2xpbmVzICsgMTsKKwljdXJidWYtPmJfb3BfZW5kLmxudW0gPSBkZXN0OworICAgIH0KKyAgICBlbHNlCisgICAgeworCW1hcmtfYWRqdXN0KGRlc3QgKyAxLCBsaW5lMSAtIDEsIG51bV9saW5lcywgMEwpOworCWN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gZGVzdCArIDE7CisJY3VyYnVmLT5iX29wX2VuZC5sbnVtID0gZGVzdCArIG51bV9saW5lczsKKyAgICB9CisgICAgY3VyYnVmLT5iX29wX3N0YXJ0LmNvbCA9IGN1cmJ1Zi0+Yl9vcF9lbmQuY29sID0gMDsKKyAgICBtYXJrX2FkanVzdChsYXN0X2xpbmUgLSBudW1fbGluZXMgKyAxLCBsYXN0X2xpbmUsCisJCQkJCSAgICAgLShsYXN0X2xpbmUgLSBkZXN0IC0gZXh0cmEpLCAwTCk7CisKKyAgICAvKgorICAgICAqIE5vdyB3ZSBkZWxldGUgdGhlIG9yaWdpbmFsIHRleHQgLS0gd2ViYgorICAgICAqLworICAgIGlmICh1X3NhdmUobGluZTEgKyBleHRyYSAtIDEsIGxpbmUyICsgZXh0cmEgKyAxKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgZm9yIChsID0gbGluZTE7IGwgPD0gbGluZTI7IGwrKykKKwltbF9kZWxldGUobGluZTEgKyBleHRyYSwgVFJVRSk7CisKKyAgICBpZiAoIWdsb2JhbF9idXN5ICYmIG51bV9saW5lcyA+IHBfcmVwb3J0KQorICAgIHsKKwlpZiAobnVtX2xpbmVzID09IDEpCisJICAgIE1TRyhfKCIxIGxpbmUgbW92ZWQiKSk7CisJZWxzZQorCSAgICBzbXNnKChjaGFyX3UgKilfKCIlbGQgbGluZXMgbW92ZWQiKSwgbnVtX2xpbmVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExlYXZlIHRoZSBjdXJzb3Igb24gdGhlIGxhc3Qgb2YgdGhlIG1vdmVkIGxpbmVzLgorICAgICAqLworICAgIGlmIChkZXN0ID49IGxpbmUxKQorCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGRlc3Q7CisgICAgZWxzZQorCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGRlc3QgKyAobGluZTIgLSBsaW5lMSkgKyAxOworCisgICAgaWYgKGxpbmUxIDwgZGVzdCkKKwljaGFuZ2VkX2xpbmVzKGxpbmUxLCAwLCBkZXN0ICsgbnVtX2xpbmVzICsgMSwgMEwpOworICAgIGVsc2UKKwljaGFuZ2VkX2xpbmVzKGRlc3QgKyAxLCAwLCBsaW5lMSArIG51bV9saW5lcywgMEwpOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogIjpjb3B5IgorICovCisgICAgdm9pZAorZXhfY29weShsaW5lMSwgbGluZTIsIG4pCisgICAgbGluZW5yX1QJbGluZTE7CisgICAgbGluZW5yX1QJbGluZTI7CisgICAgbGluZW5yX1QJbjsKK3sKKyAgICBsaW5lbnJfVAljb3VudDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBjb3VudCA9IGxpbmUyIC0gbGluZTEgKyAxOworICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gbiArIDE7CisgICAgY3VyYnVmLT5iX29wX2VuZC5sbnVtID0gbiArIGNvdW50OworICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydC5jb2wgPSBjdXJidWYtPmJfb3BfZW5kLmNvbCA9IDA7CisKKyAgICAvKgorICAgICAqIHRoZXJlIGFyZSB0aHJlZSBzaXR1YXRpb25zOgorICAgICAqIDEuIGRlc3RpbmF0aW9uIGlzIGFib3ZlIGxpbmUxCisgICAgICogMi4gZGVzdGluYXRpb24gaXMgYmV0d2VlbiBsaW5lMSBhbmQgbGluZTIKKyAgICAgKiAzLiBkZXN0aW5hdGlvbiBpcyBiZWxvdyBsaW5lMgorICAgICAqCisgICAgICogbiA9IGRlc3RpbmF0aW9uICh3aGVuIHN0YXJ0aW5nKQorICAgICAqIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGRlc3RpbmF0aW9uICh3aGlsZSBjb3B5aW5nKQorICAgICAqIGxpbmUxID0gc3RhcnQgb2Ygc291cmNlICh3aGlsZSBjb3B5aW5nKQorICAgICAqIGxpbmUyID0gZW5kIG9mIHNvdXJjZSAod2hpbGUgY29weWluZykKKyAgICAgKi8KKyAgICBpZiAodV9zYXZlKG4sIG4gKyAxKSA9PSBGQUlMKQorCXJldHVybjsKKworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IG47CisgICAgd2hpbGUgKGxpbmUxIDw9IGxpbmUyKQorICAgIHsKKwkvKiBuZWVkIHRvIHVzZSB2aW1fc3Ryc2F2ZSgpIGJlY2F1c2UgdGhlIGxpbmUgd2lsbCBiZSB1bmxvY2tlZCB3aXRoaW4KKwkgKiBtbF9hcHBlbmQoKSAqLworCXAgPSB2aW1fc3Ryc2F2ZShtbF9nZXQobGluZTEpKTsKKwlpZiAocCAhPSBOVUxMKQorCXsKKwkgICAgbWxfYXBwZW5kKGN1cndpbi0+d19jdXJzb3IubG51bSwgcCwgKGNvbG5yX1QpMCwgRkFMU0UpOworCSAgICB2aW1fZnJlZShwKTsKKwl9CisJLyogc2l0dWF0aW9uIDI6IHNraXAgYWxyZWFkeSBjb3BpZWQgbGluZXMgKi8KKwlpZiAobGluZTEgPT0gbikKKwkgICAgbGluZTEgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJKytsaW5lMTsKKwlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgbGluZTEpCisJICAgICsrbGluZTE7CisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA8IGxpbmUyKQorCSAgICArK2xpbmUyOworCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIH0KKworICAgIGFwcGVuZGVkX2xpbmVzX21hcmsobiwgY291bnQpOworCisgICAgbXNnbW9yZSgobG9uZyljb3VudCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlICI6IWNtZCIgY29tbWFuZC4JQWxzbyBmb3IgIjpyICFjbWQiIGFuZCAiOncgIWNtZCIKKyAqIEJhbmdzIGluIHRoZSBhcmd1bWVudCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcHJldmlvdXNseSBlbnRlcmVkIGNvbW1hbmQuCisgKiBSZW1lbWJlciB0aGUgYXJndW1lbnQuCisgKgorICogUklTQ09TOiBCYW5ncyBvbmx5IHJlcGxhY2VkIHdoZW4gZm9sbG93ZWQgYnkgYSBzcGFjZSwgc2luY2UgbWFueQorICogcGF0aG5hbWVzIGNvbnRhaW4gb25lLgorICovCisgICAgdm9pZAorZG9fYmFuZyhhZGRyX2NvdW50LCBlYXAsIGZvcmNlaXQsIGRvX2luLCBkb19vdXQpCisgICAgaW50CQlhZGRyX2NvdW50OworICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCWZvcmNlaXQ7CisgICAgaW50CQlkb19pbiwgZG9fb3V0OworeworICAgIGNoYXJfdQkJKmFyZyA9IGVhcC0+YXJnOwkvKiBjb21tYW5kICovCisgICAgbGluZW5yX1QJCWxpbmUxID0gZWFwLT5saW5lMTsJLyogc3RhcnQgb2YgcmFuZ2UgKi8KKyAgICBsaW5lbnJfVAkJbGluZTIgPSBlYXAtPmxpbmUyOwkvKiBlbmQgb2YgcmFuZ2UgKi8KKyAgICBzdGF0aWMgY2hhcl91CSpwcmV2Y21kID0gTlVMTDsJLyogdGhlIHByZXZpb3VzIGNvbW1hbmQgKi8KKyAgICBjaGFyX3UJCSpuZXdjbWQgPSBOVUxMOwkJLyogdGhlIG5ldyBjb21tYW5kICovCisgICAgaW50CQkJZnJlZV9uZXdjbWQgPSBGQUxTRTsgICAgLyogbmVlZCB0byBmcmVlKCkgbmV3Y21kICovCisgICAgaW50CQkJaW5zX3ByZXZjbWQ7CisgICAgY2hhcl91CQkqdDsKKyAgICBjaGFyX3UJCSpwOworICAgIGNoYXJfdQkJKnRyYWlsYXJnOworICAgIGludAkJCWxlbjsKKyAgICBpbnQJCQlzY3JvbGxfc2F2ZSA9IG1zZ19zY3JvbGw7CisKKyAgICAvKgorICAgICAqIERpc2FsbG93IHNoZWxsIGNvbW1hbmRzIGZvciAicnZpbSIuCisgICAgICogRGlzYWxsb3cgc2hlbGwgY29tbWFuZHMgZnJvbSAuZXhyYyBhbmQgLnZpbXJjIGluIGN1cnJlbnQgZGlyZWN0b3J5IGZvcgorICAgICAqIHNlY3VyaXR5IHJlYXNvbnMuCisgICAgICovCisgICAgaWYgKGNoZWNrX3Jlc3RyaWN0ZWQoKSB8fCBjaGVja19zZWN1cmUoKSkKKwlyZXR1cm47CisKKyAgICBpZiAoYWRkcl9jb3VudCA9PSAwKQkJLyogOiEgKi8KKyAgICB7CisJbXNnX3Njcm9sbCA9IEZBTFNFOwkgICAgLyogZG9uJ3Qgc2Nyb2xsIGhlcmUgKi8KKwlhdXRvd3JpdGVfYWxsKCk7CisJbXNnX3Njcm9sbCA9IHNjcm9sbF9zYXZlOworICAgIH0KKworICAgIC8qCisgICAgICogVHJ5IHRvIGZpbmQgYW4gZW1iZWRkZWQgYmFuZywgbGlrZSBpbiA6ITxjbWQ+ICEgW2FyZ3NdCisgICAgICogKDohISBpcyBpbmRpY2F0ZWQgYnkgdGhlICdmb3JjZWl0JyB2YXJpYWJsZSkKKyAgICAgKi8KKyAgICBpbnNfcHJldmNtZCA9IGZvcmNlaXQ7CisgICAgdHJhaWxhcmcgPSBhcmc7CisgICAgZG8KKyAgICB7CisJbGVuID0gKGludClTVFJMRU4odHJhaWxhcmcpICsgMTsKKwlpZiAobmV3Y21kICE9IE5VTEwpCisJICAgIGxlbiArPSAoaW50KVNUUkxFTihuZXdjbWQpOworCWlmIChpbnNfcHJldmNtZCkKKwl7CisJICAgIGlmIChwcmV2Y21kID09IE5VTEwpCisJICAgIHsKKwkJRU1TRyhfKGVfbm9wcmV2KSk7CisJCXZpbV9mcmVlKG5ld2NtZCk7CisJCXJldHVybjsKKwkgICAgfQorCSAgICBsZW4gKz0gKGludClTVFJMRU4ocHJldmNtZCk7CisJfQorCWlmICgodCA9IGFsbG9jKGxlbikpID09IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShuZXdjbWQpOworCSAgICByZXR1cm47CisJfQorCSp0ID0gTlVMOworCWlmIChuZXdjbWQgIT0gTlVMTCkKKwkgICAgU1RSQ0FUKHQsIG5ld2NtZCk7CisJaWYgKGluc19wcmV2Y21kKQorCSAgICBTVFJDQVQodCwgcHJldmNtZCk7CisJcCA9IHQgKyBTVFJMRU4odCk7CisJU1RSQ0FUKHQsIHRyYWlsYXJnKTsKKwl2aW1fZnJlZShuZXdjbWQpOworCW5ld2NtZCA9IHQ7CisKKwkvKgorCSAqIFNjYW4gdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50IGZvciAnIScsIHdoaWNoIGlzIHJlcGxhY2VkIGJ5IHRoZQorCSAqIHByZXZpb3VzIGNvbW1hbmQuICAiXCEiIGlzIHJlcGxhY2VkIGJ5ICIhIiAodGhpcyBpcyB2aSBjb21wYXRpYmxlKS4KKwkgKi8KKwl0cmFpbGFyZyA9IE5VTEw7CisJd2hpbGUgKCpwKQorCXsKKwkgICAgaWYgKCpwID09ICchJworI2lmZGVmIFJJU0NPUworCQkJJiYgKHBbMV0gPT0gJyAnIHx8IHBbMV0gPT0gTlVMKQorI2VuZGlmCisJCQkJCSkKKwkgICAgeworCQlpZiAocCA+IG5ld2NtZCAmJiBwWy0xXSA9PSAnXFwnKQorCQkgICAgbWNoX21lbW1vdmUocCAtIDEsIHAsIChzaXplX3QpKFNUUkxFTihwKSArIDEpKTsKKwkJZWxzZQorCQl7CisJCSAgICB0cmFpbGFyZyA9IHA7CisJCSAgICAqdHJhaWxhcmcrKyA9IE5VTDsKKwkJICAgIGluc19wcmV2Y21kID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgKytwOworCX0KKyAgICB9IHdoaWxlICh0cmFpbGFyZyAhPSBOVUxMKTsKKworICAgIHZpbV9mcmVlKHByZXZjbWQpOworICAgIHByZXZjbWQgPSBuZXdjbWQ7CisKKyAgICBpZiAoYmFuZ3JlZG8pCSAgICAvKiBwdXQgY21kIGluIHJlZG8gYnVmZmVyIGZvciAhIGNvbW1hbmQgKi8KKyAgICB7CisJQXBwZW5kVG9SZWRvYnVmZkxpdChwcmV2Y21kKTsKKwlBcHBlbmRUb1JlZG9idWZmKChjaGFyX3UgKikiXG4iKTsKKwliYW5ncmVkbyA9IEZBTFNFOworICAgIH0KKyAgICAvKgorICAgICAqIEFkZCBxdW90ZXMgYXJvdW5kIHRoZSBjb21tYW5kLCBmb3Igc2hlbGxzIHRoYXQgbmVlZCB0aGVtLgorICAgICAqLworICAgIGlmICgqcF9zaHEgIT0gTlVMKQorICAgIHsKKwluZXdjbWQgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihwcmV2Y21kKSArIDIgKiBTVFJMRU4ocF9zaHEpICsgMSkpOworCWlmIChuZXdjbWQgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCVNUUkNQWShuZXdjbWQsIHBfc2hxKTsKKwlTVFJDQVQobmV3Y21kLCBwcmV2Y21kKTsKKwlTVFJDQVQobmV3Y21kLCBwX3NocSk7CisJZnJlZV9uZXdjbWQgPSBUUlVFOworICAgIH0KKyAgICBpZiAoYWRkcl9jb3VudCA9PSAwKQkJLyogOiEgKi8KKyAgICB7CisJLyogZWNobyB0aGUgY29tbWFuZCAqLworCW1zZ19zdGFydCgpOworCW1zZ19wdXRjaGFyKCc6Jyk7CisJbXNnX3B1dGNoYXIoJyEnKTsKKwltc2dfb3V0dHJhbnMobmV3Y21kKTsKKwltc2dfY2xyX2VvcygpOworCXdpbmRnb3RvKG1zZ19yb3csIG1zZ19jb2wpOworCisJZG9fc2hlbGwobmV3Y21kLCAwKTsKKyAgICB9CisgICAgZWxzZQkJCQkvKiA6cmFuZ2UhICovCisJLyogQ2FyZWZ1bDogVGhpcyBtYXkgcmVjdXJzaXZlbHkgY2FsbCBkb19iYW5nKCkgYWdhaW4hIChiZWNhdXNlIG9mCisJICogYXV0b2NvbW1hbmRzKSAqLworCWRvX2ZpbHRlcihsaW5lMSwgbGluZTIsIGVhcCwgbmV3Y21kLCBkb19pbiwgZG9fb3V0KTsKKyAgICBpZiAoZnJlZV9uZXdjbWQpCisJdmltX2ZyZWUobmV3Y21kKTsKK30KKworLyoKKyAqIGRvX2ZpbHRlcjogZmlsdGVyIGxpbmVzIHRocm91Z2ggYSBjb21tYW5kIGdpdmVuIGJ5IHRoZSB1c2VyCisgKgorICogV2UgdXNlIHRlbXAgZmlsZXMgYW5kIHRoZSBjYWxsX3NoZWxsKCkgcm91dGluZSBoZXJlLiBUaGlzIHdvdWxkIG5vcm1hbGx5CisgKiBiZSBkb25lIHVzaW5nIHBpcGVzIG9uIGEgVU5JWCBtYWNoaW5lLCBidXQgdGhpcyBpcyBtb3JlIHBvcnRhYmxlIHRvCisgKiBub24tdW5peCBtYWNoaW5lcy4gVGhlIGNhbGxfc2hlbGwoKSByb3V0aW5lIG5lZWRzIHRvIGJlIGFibGUKKyAqIHRvIGRlYWwgd2l0aCByZWRpcmVjdGlvbiBzb21laG93LCBhbmQgc2hvdWxkIGhhbmRsZSB0aGluZ3MgbGlrZSBsb29raW5nCisgKiBhdCB0aGUgUEFUSCBlbnYuIHZhcmlhYmxlLCBhbmQgYWRkaW5nIHJlYXNvbmFibGUgZXh0ZW5zaW9ucyB0byB0aGUKKyAqIGNvbW1hbmQgbmFtZSBnaXZlbiBieSB0aGUgdXNlci4gQWxsIHJlYXNvbmFibGUgdmVyc2lvbnMgb2YgY2FsbF9zaGVsbCgpCisgKiBkbyB0aGlzLgorICogV2UgdXNlIGlucHV0IHJlZGlyZWN0aW9uIGlmIGRvX2luIGlzIFRSVUUuCisgKiBXZSB1c2Ugb3V0cHV0IHJlZGlyZWN0aW9uIGlmIGRvX291dCBpcyBUUlVFLgorICovCisgICAgc3RhdGljIHZvaWQKK2RvX2ZpbHRlcihsaW5lMSwgbGluZTIsIGVhcCwgY21kLCBkb19pbiwgZG9fb3V0KQorICAgIGxpbmVucl9UCWxpbmUxLCBsaW5lMjsKKyAgICBleGFyZ19UCSplYXA7CQkvKiBmb3IgZm9yY2VkICdmZicgYW5kICdmZW5jJyAqLworICAgIGNoYXJfdQkqY21kOworICAgIGludAkJZG9faW4sIGRvX291dDsKK3sKKyAgICBjaGFyX3UJKml0bXAgPSBOVUxMOworICAgIGNoYXJfdQkqb3RtcCA9IE5VTEw7CisgICAgbGluZW5yX1QJbGluZWNvdW50OworICAgIGxpbmVucl9UCXJlYWRfbGluZWNvdW50OworICAgIHBvc19UCWN1cnNvcl9zYXZlOworICAgIGNoYXJfdQkqY21kX2J1ZjsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBidWZfVAkqb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKyNlbmRpZgorCisgICAgaWYgKCpjbWQgPT0gTlVMKQkgICAgLyogbm8gZmlsdGVyIGNvbW1hbmQgKi8KKwlyZXR1cm47CisKKyNpZmRlZiBXSU4zMjY0CisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBjb21tYW5kcyBhcmUgYWxsb3dlZCBub3cuCisgICAgICovCisgICAgaWYgKGNhbl9lbmRfdGVybWNhcF9tb2RlKFRSVUUpID09IEZBTFNFKQorCXJldHVybjsKKyNlbmRpZgorCisgICAgY3Vyc29yX3NhdmUgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGxpbmVjb3VudCA9IGxpbmUyIC0gbGluZTEgKyAxOworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxpbmUxOworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyAgICBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnMoKTsKKyAgICBpbnZhbGlkYXRlX2JvdGxpbmUoKTsKKworICAgIC8qCisgICAgICogMS4gRm9ybSB0ZW1wIGZpbGUgbmFtZXMKKyAgICAgKiAyLiBXcml0ZSB0aGUgbGluZXMgdG8gYSB0ZW1wIGZpbGUKKyAgICAgKiAzLiBSdW4gdGhlIGZpbHRlciBjb21tYW5kIG9uIHRoZSB0ZW1wIGZpbGUKKyAgICAgKiA0LiBSZWFkIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaW50byB0aGUgYnVmZmVyCisgICAgICogNS4gRGVsZXRlIHRoZSBvcmlnaW5hbCBsaW5lcyB0byBiZSBmaWx0ZXJlZAorICAgICAqIDYuIFJlbW92ZSB0aGUgdGVtcCBmaWxlcworICAgICAqLworCisgICAgaWYgKChkb19pbiAmJiAoaXRtcCA9IHZpbV90ZW1wbmFtZSgnaScpKSA9PSBOVUxMKQorCSAgICB8fCAoZG9fb3V0ICYmIChvdG1wID0gdmltX3RlbXBuYW1lKCdvJykpID09IE5VTEwpKQorICAgIHsKKwlFTVNHKF8oZV9ub3RtcCkpOworCWdvdG8gZmlsdGVyZW5kOworICAgIH0KKworLyoKKyAqIFRoZSB3cml0aW5nIGFuZCByZWFkaW5nIG9mIHRlbXAgZmlsZXMgd2lsbCBub3QgYmUgc2hvd24uCisgKiBWaSBhbHNvIGRvZXNuJ3QgZG8gdGhpcyBhbmQgdGhlIG1lc3NhZ2VzIGFyZSBub3QgdmVyeSBpbmZvcm1hdGl2ZS4KKyAqLworICAgICsrbm9fd2FpdF9yZXR1cm47CQkvKiBkb24ndCBjYWxsIHdhaXRfcmV0dXJuKCkgd2hpbGUgYnVzeSAqLworICAgIGlmIChkb19pbiAmJiBidWZfd3JpdGUoY3VyYnVmLCBpdG1wLCBOVUxMLCBsaW5lMSwgbGluZTIsIGVhcCwKKwkJCQkJICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSkgPT0gRkFJTCkKKyAgICB7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CQkvKiBrZWVwIG1lc3NhZ2UgZnJvbSBidWZfd3JpdGUoKSAqLworCS0tbm9fd2FpdF9yZXR1cm47CisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCWlmICghYWJvcnRpbmcoKSkKKyNlbmRpZgorCSAgICAodm9pZClFTVNHMihfKGVfbm90Y3JlYXRlKSwgaXRtcCk7CS8qIHdpbGwgY2FsbCB3YWl0X3JldHVybiAqLworCWdvdG8gZmlsdGVyZW5kOworICAgIH0KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoY3VyYnVmICE9IG9sZF9jdXJidWYpCisJZ290byBmaWx0ZXJlbmQ7CisjZW5kaWYKKworICAgIGlmICghZG9fb3V0KQorCW1zZ19wdXRjaGFyKCdcbicpOworCisgICAgY21kX2J1ZiA9IG1ha2VfZmlsdGVyX2NtZChjbWQsIGl0bXAsIG90bXApOworICAgIGlmIChjbWRfYnVmID09IE5VTEwpCisJZ290byBmaWx0ZXJlbmQ7CisKKyAgICB3aW5kZ290bygoaW50KVJvd3MgLSAxLCAwKTsKKyAgICBjdXJzb3Jfb24oKTsKKworICAgIC8qCisgICAgICogV2hlbiBub3QgcmVkaXJlY3RpbmcgdGhlIG91dHB1dCB0aGUgY29tbWFuZCBjYW4gd3JpdGUgYW55dGhpbmcgdG8gdGhlCisgICAgICogc2NyZWVuLiBJZiAnc2hlbGxyZWRpcicgaXMgZXF1YWwgdG8gIj4iLCBzY3JlZW4gbWF5IGJlIG1lc3NlZCB1cCBieQorICAgICAqIHN0ZGVyciBvdXRwdXQgb2YgZXh0ZXJuYWwgY29tbWFuZC4gQ2xlYXIgdGhlIHNjcmVlbiBsYXRlci4KKyAgICAgKiBJZiBkb19pbiBpcyBGQUxTRSwgdGhpcyBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSAiOnIgIWNhdCIsIHdoaWNoIG1heQorICAgICAqIGFsc28gbWVzcyB1cCB0aGUgc2NyZWVuLCBjbGVhciBpdCBsYXRlci4KKyAgICAgKi8KKyAgICBpZiAoIWRvX291dCB8fCBTVFJDTVAocF9zcnIsICI+IikgPT0gMCB8fCAhZG9faW4pCisJcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisKKyAgICAvKgorICAgICAqIFdoZW4gY2FsbF9zaGVsbCgpIGZhaWxzIHdhaXRfcmV0dXJuKCkgaXMgY2FsbGVkIHRvIGdpdmUgdGhlIHVzZXIgYQorICAgICAqIGNoYW5jZSB0byByZWFkIHRoZSBlcnJvciBtZXNzYWdlcy4gT3RoZXJ3aXNlIGVycm9ycyBhcmUgaWdub3JlZCwgc28geW91CisgICAgICogY2FuIHNlZSB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgY29tbWFuZCB0aGF0IGFwcGVhciBvbiBzdGRvdXQ7IHVzZQorICAgICAqICd1JyB0byBmaXggdGhlIHRleHQKKyAgICAgKiBTd2l0Y2ggdG8gY29va2VkIG1vZGUgd2hlbiBub3QgcmVkaXJlY3Rpbmcgc3RkaW4sIGF2b2lkcyB0aGF0IHNvbWV0aGluZworICAgICAqIGxpa2UgIjpyICFjYXQiIGhhbmdzLgorICAgICAqIFBhc3Mgb24gdGhlIFNIRUxMX0RPT1VUIGZsYWcgd2hlbiB0aGUgb3V0cHV0IGlzIGJlaW5nIHJlZGlyZWN0ZWQuCisgICAgICovCisgICAgaWYgKGNhbGxfc2hlbGwoY21kX2J1ZiwgU0hFTExfRklMVEVSIHwgU0hFTExfQ09PS0VECisJCQkJCQl8IChkb19vdXQgPyBTSEVMTF9ET09VVCA6IDApKSkKKyAgICB7CisJcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisJd2FpdF9yZXR1cm4oRkFMU0UpOworICAgIH0KKyAgICB2aW1fZnJlZShjbWRfYnVmKTsKKworICAgIGRpZF9jaGVja190aW1lc3RhbXBzID0gRkFMU0U7CisgICAgbmVlZF9jaGVja190aW1lc3RhbXBzID0gVFJVRTsKKworICAgIC8qIFdoZW4gaW50ZXJydXB0aW5nIHRoZSBzaGVsbCBjb21tYW5kLCBpdCBtYXkgc3RpbGwgaGF2ZSBwcm9kdWNlZCBzb21lCisgICAgICogdXNlZnVsIG91dHB1dC4gIFJlc2V0IGdvdF9pbnQgaGVyZSwgc28gdGhhdCByZWFkZmlsZSgpIHdvbid0IGNhbmNlbAorICAgICAqIHJlYWRpbmcuICovCisgICAgdWlfYnJlYWtjaGVjaygpOworICAgIGdvdF9pbnQgPSBGQUxTRTsKKworICAgIGlmIChkb19vdXQpCisgICAgeworCWlmICh1X3NhdmUoKGxpbmVucl9UKShsaW5lMiksIChsaW5lbnJfVCkobGluZTIgKyAxKSkgPT0gRkFJTCkKKwkgICAgZ290byBlcnJvcjsKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKFZBTElEKTsKKwlyZWFkX2xpbmVjb3VudCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWlmIChyZWFkZmlsZShvdG1wLCBOVUxMLCBsaW5lMiwgKGxpbmVucl9UKTAsIChsaW5lbnJfVClNQVhMTlVNLCBlYXAsCisJCQkJCQkJIFJFQURfRklMVEVSKSA9PSBGQUlMKQorCXsKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJICAgIGlmICghYWJvcnRpbmcoKSkKKyNlbmRpZgorCSAgICB7CisJCW1zZ19wdXRjaGFyKCdcbicpOworCQlFTVNHMihfKGVfbm90cmVhZCksIG90bXApOworCSAgICB9CisJICAgIGdvdG8gZXJyb3I7CisJfQorI2lmZGVmIEZFQVRfQVVUT0NNRAorCWlmIChjdXJidWYgIT0gb2xkX2N1cmJ1ZikKKwkgICAgZ290byBmaWx0ZXJlbmQ7CisjZW5kaWYKKworCWlmIChkb19pbikKKwl7CisJICAgIGlmIChjbWRtb2Qua2VlcG1hcmtzIHx8IHZpbV9zdHJjaHIocF9jcG8sIENQT19SRU1NQVJLKSA9PSBOVUxMKQorCSAgICB7CisJCXJlYWRfbGluZWNvdW50ID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLSByZWFkX2xpbmVjb3VudDsKKwkJaWYgKHJlYWRfbGluZWNvdW50ID49IGxpbmVjb3VudCkKKwkJICAgIC8qIG1vdmUgYWxsIG1hcmtzIGZyb20gb2xkIGxpbmVzIHRvIG5ldyBsaW5lcyAqLworCQkgICAgbWFya19hZGp1c3QobGluZTEsIGxpbmUyLCBsaW5lY291bnQsIDBMKTsKKwkJZWxzZQorCQl7CisJCSAgICAvKiBtb3ZlIG1hcmtzIGZyb20gb2xkIGxpbmVzIHRvIG5ldyBsaW5lcywgZGVsZXRlIG1hcmtzCisJCSAgICAgKiB0aGF0IGFyZSBpbiBkZWxldGVkIGxpbmVzICovCisJCSAgICBtYXJrX2FkanVzdChsaW5lMSwgbGluZTEgKyByZWFkX2xpbmVjb3VudCAtIDEsCisJCQkJCQkJCWxpbmVjb3VudCwgMEwpOworCQkgICAgbWFya19hZGp1c3QobGluZTEgKyByZWFkX2xpbmVjb3VudCwgbGluZTIsIE1BWExOVU0sIDBMKTsKKwkJfQorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogUHV0IGN1cnNvciBvbiBmaXJzdCBmaWx0ZXJlZCBsaW5lIGZvciAiOnJhbmdlIWNtZCIuCisJICAgICAqIEFkanVzdCAnWyBhbmQgJ10gKHNldCBieSBidWZfd3JpdGUoKSkuCisJICAgICAqLworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsaW5lMTsKKwkgICAgZGVsX2xpbmVzKGxpbmVjb3VudCwgVFJVRSk7CisJICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtIC09IGxpbmVjb3VudDsJLyogYWRqdXN0ICdbICovCisJICAgIGN1cmJ1Zi0+Yl9vcF9lbmQubG51bSAtPSBsaW5lY291bnQ7CQkvKiBhZGp1c3QgJ10gKi8KKwkgICAgd3JpdGVfbG51bV9hZGp1c3QoLWxpbmVjb3VudCk7CQkvKiBhZGp1c3QgbGFzdCBsaW5lCisJCQkJCQkJICAgZm9yIG5leHQgd3JpdGUgKi8KKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogUHV0IGN1cnNvciBvbiBsYXN0IG5ldyBsaW5lIGZvciAiOnIgIWNtZCIuCisJICAgICAqLworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJidWYtPmJfb3BfZW5kLmxudW07CisJICAgIGxpbmVjb3VudCA9IGN1cmJ1Zi0+Yl9vcF9lbmQubG51bSAtIGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtICsgMTsKKwl9CisJYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsJICAgIC8qIGN1cnNvciBvbiBmaXJzdCBub24tYmxhbmsgKi8KKwktLW5vX3dhaXRfcmV0dXJuOworCisJaWYgKGxpbmVjb3VudCA+IHBfcmVwb3J0KQorCXsKKwkgICAgaWYgKGRvX2luKQorCSAgICB7CisJCXNwcmludGYoKGNoYXIgKiltc2dfYnVmLCBfKCIlbGQgbGluZXMgZmlsdGVyZWQiKSwKKwkJCQkJCQkgICAgIChsb25nKWxpbmVjb3VudCk7CisJCWlmIChtc2cobXNnX2J1ZikgJiYgIW1zZ19zY3JvbGwpCisJCXsKKwkJICAgIC8qIHNhdmUgbWVzc2FnZSB0byBkaXNwbGF5IGl0IGFmdGVyIHJlZHJhdyAqLworCQkgICAgc2V0X2tlZXBfbXNnKG1zZ19idWYpOworCQkgICAga2VlcF9tc2dfYXR0ciA9IDA7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJCW1zZ21vcmUoKGxvbmcpbGluZWNvdW50KTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CitlcnJvcjoKKwkvKiBwdXQgY3Vyc29yIGJhY2sgaW4gc2FtZSBwb3NpdGlvbiBmb3IgIjp3ICFjbWQiICovCisJY3Vyd2luLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworCS0tbm9fd2FpdF9yZXR1cm47CisJd2FpdF9yZXR1cm4oRkFMU0UpOworICAgIH0KKworZmlsdGVyZW5kOgorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgaWYgKGN1cmJ1ZiAhPSBvbGRfY3VyYnVmKQorICAgIHsKKwktLW5vX3dhaXRfcmV0dXJuOworCUVNU0coXygiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIpKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoaXRtcCAhPSBOVUxMKQorCW1jaF9yZW1vdmUoaXRtcCk7CisgICAgaWYgKG90bXAgIT0gTlVMTCkKKwltY2hfcmVtb3ZlKG90bXApOworICAgIHZpbV9mcmVlKGl0bXApOworICAgIHZpbV9mcmVlKG90bXApOworfQorCisvKgorICogQ2FsbCBhIHNoZWxsIHRvIGV4ZWN1dGUgYSBjb21tYW5kLgorICogV2hlbiAiY21kIiBpcyBOVUxMIHN0YXJ0IGFuIGludGVyYWN0aXZlIHNoZWxsLgorICovCisgICAgdm9pZAorZG9fc2hlbGwoY21kLCBmbGFncykKKyAgICBjaGFyX3UJKmNtZDsKKyAgICBpbnQJCWZsYWdzOwkvKiBtYXkgYmUgU0hFTExfRE9PVVQgd2hlbiBvdXRwdXQgaXMgcmVkaXJlY3RlZCAqLworeworICAgIGJ1Zl9UCSpidWY7CisjaWZuZGVmIEZFQVRfR1VJX01TV0lOCisgICAgaW50CQlzYXZlX253cjsKKyNlbmRpZgorI2lmZGVmIE1TV0lOCisgICAgaW50CQl3aW5zdGFydCA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIERpc2FsbG93IHNoZWxsIGNvbW1hbmRzIGZvciAicnZpbSIuCisgICAgICogRGlzYWxsb3cgc2hlbGwgY29tbWFuZHMgZnJvbSAuZXhyYyBhbmQgLnZpbXJjIGluIGN1cnJlbnQgZGlyZWN0b3J5IGZvcgorICAgICAqIHNlY3VyaXR5IHJlYXNvbnMuCisgICAgICovCisgICAgaWYgKGNoZWNrX3Jlc3RyaWN0ZWQoKSB8fCBjaGVja19zZWN1cmUoKSkKKyAgICB7CisJbXNnX2VuZCgpOworCXJldHVybjsKKyAgICB9CisKKyNpZmRlZiBNU1dJTgorICAgIC8qCisgICAgICogQ2hlY2sgaWYgZXh0ZXJuYWwgY29tbWFuZHMgYXJlIGFsbG93ZWQgbm93LgorICAgICAqLworICAgIGlmIChjYW5fZW5kX3Rlcm1jYXBfbW9kZShUUlVFKSA9PSBGQUxTRSkKKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmICI6IXN0YXJ0IiBpcyB1c2VkLgorICAgICAqLworICAgIGlmIChjbWQgIT0gTlVMTCkKKwl3aW5zdGFydCA9IChTVFJOSUNNUChjbWQsICJzdGFydCAiLCA2KSA9PSAwKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGb3IgYXV0b2NvbW1hbmRzIHdlIHdhbnQgdG8gZ2V0IHRoZSBvdXRwdXQgb24gdGhlIGN1cnJlbnQgc2NyZWVuLCB0bworICAgICAqIGF2b2lkIGhhdmluZyB0byB0eXBlIHJldHVybiBiZWxvdy4KKyAgICAgKi8KKyAgICBtc2dfcHV0Y2hhcignXHInKTsJCQkvKiBwdXQgY3Vyc29yIGF0IHN0YXJ0IG9mIGxpbmUgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoIWF1dG9jbWRfYnVzeSkKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBNU1dJTgorCWlmICghd2luc3RhcnQpCisjZW5kaWYKKwkgICAgc3RvcHRlcm1jYXAoKTsKKyAgICB9CisjaWZkZWYgTVNXSU4KKyAgICBpZiAoIXdpbnN0YXJ0KQorI2VuZGlmCisJbXNnX3B1dGNoYXIoJ1xuJyk7CQkvKiBtYXkgc2hpZnQgc2NyZWVuIG9uZSBsaW5lIHVwICovCisKKyAgICAvKiB3YXJuaW5nIG1lc3NhZ2UgYmVmb3JlIGNhbGxpbmcgdGhlIHNoZWxsICovCisgICAgaWYgKHBfd2FybgorI2lmZGVmIEZFQVRfQVVUT0NNRAorCQkmJiAhYXV0b2NtZF9idXN5CisjZW5kaWYKKwkJJiYgbXNnX3NpbGVudCA9PSAwKQorCWZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZjsgYnVmID0gYnVmLT5iX25leHQpCisJICAgIGlmIChidWZJc0NoYW5nZWQoYnVmKSkKKwkgICAgeworI2lmZGVmIEZFQVRfR1VJX01TV0lOCisJCWlmICghd2luc3RhcnQpCisJCSAgICBzdGFydHRlcm1jYXAoKTsJLyogZG9uJ3Qgd2FudCBhIG1lc3NhZ2UgYm94IGhlcmUgKi8KKyNlbmRpZgorCQlNU0dfUFVUUyhfKCJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iKSk7CisjaWZkZWYgRkVBVF9HVUlfTVNXSU4KKwkJaWYgKCF3aW5zdGFydCkKKwkJICAgIHN0b3B0ZXJtY2FwKCk7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIH0KKworICAgIC8qIFRoaXMgd2luZGdvdG8gaXMgcmVxdWlyZWQgZm9yIHdoZW4gdGhlICdcbicgcmVzdWx0ZWQgaW4gYSAiZGVsZXRlIGxpbmUKKyAgICAgKiAxIiBjb21tYW5kIHRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBpZiAoIXN3YXBwaW5nX3NjcmVlbigpKQorCXdpbmRnb3RvKG1zZ19yb3csIG1zZ19jb2wpOworICAgIGN1cnNvcl9vbigpOworICAgICh2b2lkKWNhbGxfc2hlbGwoY21kLCBTSEVMTF9DT09LRUQgfCBmbGFncyk7CisgICAgZGlkX2NoZWNrX3RpbWVzdGFtcHMgPSBGQUxTRTsKKyAgICBuZWVkX2NoZWNrX3RpbWVzdGFtcHMgPSBUUlVFOworCisgICAgLyoKKyAgICAgKiBwdXQgdGhlIG1lc3NhZ2UgY3Vyc29yIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmVlbiwgYXZvaWRzIHdhaXRfcmV0dXJuKCkKKyAgICAgKiB0byBvdmVyd3JpdGUgdGhlIHRleHQgdGhhdCB0aGUgZXh0ZXJuYWwgY29tbWFuZCBzaG93ZWQKKyAgICAgKi8KKyAgICBpZiAoIXN3YXBwaW5nX3NjcmVlbigpKQorICAgIHsKKwltc2dfcm93ID0gUm93cyAtIDE7CisJbXNnX2NvbCA9IDA7CisgICAgfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgaWYgKGF1dG9jbWRfYnVzeSkKKyAgICB7CisJaWYgKG1zZ19zaWxlbnQgPT0gMCkKKwkgICAgcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIEZvciAiOnNoIiB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgd2FpdF9yZXR1cm4oKSwganVzdCByZWRyYXcuCisJICogQWxzbyBmb3IgdGhlIFdpbjMyIEdVSSAodGhlIG91dHB1dCBpcyBpbiBhIGNvbnNvbGUgd2luZG93KS4KKwkgKiBPdGhlcndpc2UgdGhlcmUgaXMgcHJvYmFibHkgdGV4dCBvbiB0aGUgc2NyZWVuIHRoYXQgdGhlIHVzZXIgd2FudHMKKwkgKiB0byByZWFkIGJlZm9yZSByZWRyYXdpbmcsIHNvIGNhbGwgd2FpdF9yZXR1cm4oKS4KKwkgKi8KKyNpZm5kZWYgRkVBVF9HVUlfTVNXSU4KKwlpZiAoY21kID09IE5VTEwKKyMgaWZkZWYgV0lOMzI2NAorCQl8fCAod2luc3RhcnQgJiYgIW5lZWRfd2FpdF9yZXR1cm4pCisjIGVuZGlmCisJICAgKQorCXsKKwkgICAgaWYgKG1zZ19zaWxlbnQgPT0gMCkKKwkJcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogSWYgd2Ugc3dpdGNoIHNjcmVlbnMgd2hlbiBzdGFydHRlcm1jYXAoKSBpcyBjYWxsZWQsIHdlIHJlYWxseQorCSAgICAgKiB3YW50IHRvIHdhaXQgZm9yICJoaXQgcmV0dXJuIHRvIGNvbnRpbnVlIi4KKwkgICAgICovCisJICAgIHNhdmVfbndyID0gbm9fd2FpdF9yZXR1cm47CisJICAgIGlmIChzd2FwcGluZ19zY3JlZW4oKSkKKwkJbm9fd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyMgaWZkZWYgQU1JR0EKKwkgICAgd2FpdF9yZXR1cm4odGVybV9jb25zb2xlID8gLTEgOiBtc2dfc2lsZW50ID09IDApOwkvKiBzZWUgYmVsb3cgKi8KKyMgZWxzZQorCSAgICB3YWl0X3JldHVybihtc2dfc2lsZW50ID09IDApOworIyBlbmRpZgorCSAgICBub193YWl0X3JldHVybiA9IHNhdmVfbndyOworCX0KKyNlbmRpZiAvKiBGRUFUX0dVSV9XMzIgKi8KKworI2lmZGVmIE1TV0lOCisJaWYgKCF3aW5zdGFydCkgLyogaWYgd2luc3RhcnQ9PVRSVUUsIG5ldmVyIHN0b3BwZWQgdGVybWNhcCEgKi8KKyNlbmRpZgorCSAgICBzdGFydHRlcm1jYXAoKTsJLyogc3RhcnQgdGVybWNhcCBpZiBub3QgZG9uZSBieSB3YWl0X3JldHVybigpICovCisKKwkvKgorCSAqIEluIGFuIEFtaWdhIHdpbmRvdyByZWRyYXdpbmcgaXMgY2F1c2VkIGJ5IGFza2luZyB0aGUgd2luZG93IHNpemUuCisJICogSWYgd2UgZ290IGFuIGludGVycnVwdCB0aGlzIHdpbGwgbm90IHdvcmsuIFRoZSBjaGFuY2UgdGhhdCB0aGUKKwkgKiB3aW5kb3cgc2l6ZSBpcyB3cm9uZyBpcyB2ZXJ5IHNtYWxsLCBidXQgd2UgbmVlZCB0byByZWRyYXcgdGhlCisJICogc2NyZWVuLiAgRG9uJ3QgZG8gdGhpcyBpZiAnOicgaGl0IGluIHdhaXRfcmV0dXJuKCkuCVRISVMgSVMgVUdMWQorCSAqIGJ1dCBpdCBzYXZlcyBhbiBleHRyYSByZWRyYXcuCisJICovCisjaWZkZWYgQU1JR0EKKwlpZiAoc2tpcF9yZWRyYXcpCQkvKiAnOicgaGl0IGluIHdhaXRfcmV0dXJuKCkgKi8KKwl7CisJICAgIGlmIChtc2dfc2lsZW50ID09IDApCisJCXJlZHJhd19sYXRlcl9jbGVhcigpOworCX0KKwllbHNlIGlmICh0ZXJtX2NvbnNvbGUpCisJeworCSAgICBPVVRfU1RSKElGX0VCKCJcMDMzWzAgcSIsIEVTQ19TVFIgIlswIHEiKSk7CS8qIGdldCB3aW5kb3cgc2l6ZSAqLworCSAgICBpZiAoZ290X2ludCAmJiBtc2dfc2lsZW50ID09IDApCisJCXJlZHJhd19sYXRlcl9jbGVhcigpOwkvKiBpZiBnb3RfaW50IGlzIFRSVUUsIHJlZHJhdyBuZWVkZWQgKi8KKwkgICAgZWxzZQorCQltdXN0X3JlZHJhdyA9IDA7CS8qIG5vIGV4dHJhIHJlZHJhdyBuZWVkZWQgKi8KKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBkaXNwbGF5IGFueSBlcnJvciBtZXNzYWdlcyBub3cgKi8KKyAgICBkaXNwbGF5X2Vycm9ycygpOworfQorCisvKgorICogQ3JlYXRlIGEgc2hlbGwgY29tbWFuZCBmcm9tIGEgY29tbWFuZCBzdHJpbmcsIGlucHV0IHJlZGlyZWN0aW9uIGZpbGUgYW5kCisgKiBvdXRwdXQgcmVkaXJlY3Rpb24gZmlsZS4KKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyB3aXRoIHRoZSBzaGVsbCBjb21tYW5kLCBvciBOVUxMIGZvciBmYWlsdXJlLgorICovCisgICAgY2hhcl91ICoKK21ha2VfZmlsdGVyX2NtZChjbWQsIGl0bXAsIG90bXApCisgICAgY2hhcl91CSpjbWQ7CQkvKiBjb21tYW5kICovCisgICAgY2hhcl91CSppdG1wOwkJLyogTlVMTCBvciBuYW1lIG9mIGlucHV0IGZpbGUgKi8KKyAgICBjaGFyX3UJKm90bXA7CQkvKiBOVUxMIG9yIG5hbWUgb2Ygb3V0cHV0IGZpbGUgKi8KK3sKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBsb25nX3UJbGVuOworCisgICAgbGVuID0gKGxvbmdfdSlTVFJMRU4oY21kKSArIDM7CQkJLyogIigpIiArIE5VTCAqLworICAgIGlmIChpdG1wICE9IE5VTEwpCisJbGVuICs9IChsb25nX3UpU1RSTEVOKGl0bXApICsgOTsJCS8qICIgeyA8ICIgKyAiIH0gIiAqLworICAgIGlmIChvdG1wICE9IE5VTEwpCisJbGVuICs9IChsb25nX3UpU1RSTEVOKG90bXApICsgKGxvbmdfdSlTVFJMRU4ocF9zcnIpICsgMjsgLyogIiAgIiAqLworICAgIGJ1ZiA9IGxhbGxvYyhsZW4sIFRSVUUpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworI2lmIChkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKEFSQ0hJRSkpIHx8IGRlZmluZWQoT1MyKQorICAgIC8qCisgICAgICogcHV0IGJyYWNlcyBhcm91bmQgdGhlIGNvbW1hbmQgKGZvciBjb25jYXRlbmF0ZWQgY29tbWFuZHMpCisgICAgICovCisgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIiglcykiLCAoY2hhciAqKWNtZCk7CisgICAgaWYgKGl0bXAgIT0gTlVMTCkKKyAgICB7CisJU1RSQ0FUKGJ1ZiwgIiA8ICIpOworCVNUUkNBVChidWYsIGl0bXApOworICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBmb3Igc2hlbGxzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBicmFjZXMgYXJvdW5kIGNvbW1hbmRzLCBhdCBsZWFzdCBhbGxvdworICAgICAqIHRoZSB1c2Ugb2YgY29tbWFuZHMgaW4gYSBwaXBlLgorICAgICAqLworICAgIFNUUkNQWShidWYsIGNtZCk7CisgICAgaWYgKGl0bXAgIT0gTlVMTCkKKyAgICB7CisJY2hhcl91CSpwOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBpcGUsIHdlIGhhdmUgdG8gcHV0IHRoZSAnPCcgaW4gZnJvbnQgb2YgaXQuCisJICogRG9uJ3QgZG8gdGhpcyB3aGVuICdzaGVsbHF1b3RlJyBpcyBub3QgZW1wdHksIG90aGVyd2lzZSB0aGUKKwkgKiByZWRpcmVjdGlvbiB3b3VsZCBiZSBpbnNpZGUgdGhlIHF1b3Rlcy4KKwkgKi8KKwlpZiAoKnBfc2hxID09IE5VTCkKKwl7CisJICAgIHAgPSB2aW1fc3RyY2hyKGJ1ZiwgJ3wnKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBOVUw7CisJfQorIyBpZmRlZiBSSVNDT1MKKwlTVFJDQVQoYnVmLCAiIHsgPCAiKTsJLyogVXNlIFJJU0MgT1Mgbm90YXRpb24gZm9yIGlucHV0LiAqLworCVNUUkNBVChidWYsIGl0bXApOworCVNUUkNBVChidWYsICIgfSAiKTsKKyMgZWxzZQorCVNUUkNBVChidWYsICIgPCIpOwkvKiAiIDwgIiBjYXVzZXMgcHJvYmxlbXMgb24gQW1pZ2EgKi8KKwlTVFJDQVQoYnVmLCBpdG1wKTsKKyMgZW5kaWYKKwlpZiAoKnBfc2hxID09IE5VTCkKKwl7CisJICAgIHAgPSB2aW1fc3RyY2hyKGNtZCwgJ3wnKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkgICAgeworCQlTVFJDQVQoYnVmLCAiICIpOyAgIC8qIGluc2VydCBhIHNwYWNlIGJlZm9yZSB0aGUgJ3wnIGZvciBET1MgKi8KKwkJU1RSQ0FUKGJ1ZiwgcCk7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisgICAgaWYgKG90bXAgIT0gTlVMTCkKKwlhcHBlbmRfcmVkaXIoYnVmLCBwX3Nyciwgb3RtcCk7CisKKyAgICByZXR1cm4gYnVmOworfQorCisvKgorICogQXBwZW5kIG91dHB1dCByZWRpcmVjdGlvbiBmb3IgZmlsZSAiZm5hbWUiIHRvIHRoZSBlbmQgb2Ygc3RyaW5nIGJ1ZmZlciAiYnVmIgorICogV29ya3Mgd2l0aCB0aGUgJ3NoZWxscmVkaXInIGFuZCAnc2hlbGxwaXBlJyBvcHRpb25zLgorICogVGhlIGNhbGxlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb206CisgKglTVFJMRU4ob3B0KSArIFNUUkxFTihmbmFtZSkgKyAzCisgKi8KKyAgICB2b2lkCithcHBlbmRfcmVkaXIoYnVmLCBvcHQsIGZuYW1lKQorICAgIGNoYXJfdQkqYnVmOworICAgIGNoYXJfdQkqb3B0OworICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgYnVmICs9IFNUUkxFTihidWYpOworICAgIC8qIGZpbmQgIiVzIiwgc2tpcHBpbmcgIiUlIiAqLworICAgIGZvciAocCA9IG9wdDsgKHAgPSB2aW1fc3RyY2hyKHAsICclJykpICE9IE5VTEw7ICsrcCkKKwlpZiAocFsxXSA9PSAncycpCisJICAgIGJyZWFrOworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCSpidWYgPSAnICc7IC8qIG5vdCByZWFsbHkgbmVlZGVkPyBOb3Qgd2l0aCBzaCwga3NoIG9yIGJhc2ggKi8KKwlzcHJpbnRmKChjaGFyICopYnVmICsgMSwgKGNoYXIgKilvcHQsIChjaGFyICopZm5hbWUpOworICAgIH0KKyAgICBlbHNlCisJc3ByaW50ZigoY2hhciAqKWJ1ZiwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisjIGlmbmRlZiBSSVNDT1MKKwkJb3B0ICE9IHBfc3AgPyAiICVzJXMiIDoKKyMgZW5kaWYKKwkJIiAlcyAlcyIsCisjZWxzZQorIyBpZm5kZWYgUklTQ09TCisJCSIgJXMlcyIsCS8qICIgPiAlcyIgY2F1c2VzIHByb2JsZW1zIG9uIEFtaWdhICovCisjIGVsc2UKKwkJIiAlcyAlcyIsCS8qIEJ1dCBpcyBuZWVkZWQgZm9yICdzaGVsbHBpcGUnIGFuZCBSSVNDIE9TICovCisjIGVuZGlmCisjZW5kaWYKKwkJKGNoYXIgKilvcHQsIChjaGFyICopZm5hbWUpOworfQorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisKK3N0YXRpYyBpbnQgbm9fdmltaW5mbyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgIHZpbWluZm9fZXJyY250OworCisgICAgc3RhdGljIGludAorbm9fdmltaW5mbygpCit7CisgICAgLyogInZpbSAtaSBOT05FIiBkb2VzIG5vdCByZWFkIG9yIHdyaXRlIGEgdmltaW5mbyBmaWxlICovCisgICAgcmV0dXJuICh1c2VfdmltaW5mbyAhPSBOVUxMICYmIFNUUkNNUCh1c2VfdmltaW5mbywgIk5PTkUiKSA9PSAwKTsKK30KKworLyoKKyAqIFJlcG9ydCBhbiBlcnJvciBmb3IgcmVhZGluZyBhIHZpbWluZm8gZmlsZS4KKyAqIENvdW50IHRoZSBudW1iZXIgb2YgZXJyb3JzLglXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTAsIHJldHVybiBUUlVFLgorICovCisgICAgaW50Cit2aW1pbmZvX2Vycm9yKGVycm51bSwgbWVzc2FnZSwgbGluZSkKKyAgICBjaGFyICAgICplcnJudW07CisgICAgY2hhciAgICAqbWVzc2FnZTsKKyAgICBjaGFyX3UgICpsaW5lOworeworICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIiVzdmltaW5mbzogJXMgaW4gbGluZTogIiksIGVycm51bSwgbWVzc2FnZSk7CisgICAgU1RSTkNBVChJT2J1ZmYsIGxpbmUsIElPU0laRSAtIFNUUkxFTihJT2J1ZmYpKTsKKyAgICBlbXNnKElPYnVmZik7CisgICAgaWYgKCsrdmltaW5mb19lcnJjbnQgPj0gMTApCisgICAgeworCUVNU0coXygiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiKSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIHJlYWRfdmltaW5mbygpIC0tIFJlYWQgdGhlIHZpbWluZm8gZmlsZS4gIFJlZ2lzdGVycyBldGMuIHdoaWNoIGFyZSBhbHJlYWR5CisgKiBzZXQgYXJlIG5vdCBvdmVyLXdyaXR0ZW4gdW5sZXNzIGZvcmNlIGlzIFRSVUUuIC0tIHdlYmIKKyAqLworICAgIGludAorcmVhZF92aW1pbmZvKGZpbGUsIHdhbnRfaW5mbywgd2FudF9tYXJrcywgZm9yY2VpdCkKKyAgICBjaGFyX3UJKmZpbGU7CisgICAgaW50CQl3YW50X2luZm87CisgICAgaW50CQl3YW50X21hcmtzOworICAgIGludAkJZm9yY2VpdDsKK3sKKyAgICBGSUxFCSpmcDsKKyAgICBjaGFyX3UJKmZuYW1lOworCisgICAgaWYgKG5vX3ZpbWluZm8oKSkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZuYW1lID0gdmltaW5mb19maWxlbmFtZShmaWxlKTsJICAgIC8qIG1heSBzZXQgdG8gZGVmYXVsdCBpZiBOVUxMICovCisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisgICAgZnAgPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZSwgUkVBREJJTik7CisKKyAgICBpZiAocF92ZXJib3NlID4gMCkKKyAgICB7CisJY2hhcl91CSpzOworCisJcyA9IGZuYW1lOworCWlmIChTVFJMRU4oZm5hbWUpID4gSU9TSVpFIC0gMTAwKQorCSAgICBzID0gZm5hbWUgKyBTVFJMRU4oZm5hbWUpIC0gKElPU0laRSAtIDEwMCk7CisJc21zZygoY2hhcl91ICopXygiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIiksIHMsCisJCSAgICB3YW50X2luZm8gPyBfKCIgaW5mbyIpIDogIiIsCisJCSAgICB3YW50X21hcmtzID8gXygiIG1hcmtzIikgOiAiIiwKKwkJICAgIGZwID09IE5VTEwgPyBfKCIgRkFJTEVEIikgOiAiIik7CisgICAgfQorCisgICAgdmltX2ZyZWUoZm5hbWUpOworICAgIGlmIChmcCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgdmltaW5mb19lcnJjbnQgPSAwOworICAgIGRvX3ZpbWluZm8oZnAsIE5VTEwsIHdhbnRfaW5mbywgd2FudF9tYXJrcywgZm9yY2VpdCk7CisKKyAgICBmY2xvc2UoZnApOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogd3JpdGVfdmltaW5mbygpIC0tIFdyaXRlIHRoZSB2aW1pbmZvIGZpbGUuICBUaGUgb2xkIG9uZSBpcyByZWFkIGluIGZpcnN0IHNvCisgKiB0aGF0IGVmZmVjdGl2ZWx5IGEgbWVyZ2Ugb2YgY3VycmVudCBpbmZvIGFuZCBvbGQgaW5mbyBpcyBkb25lLiAgVGhpcyBhbGxvd3MKKyAqIG11bHRpcGxlIHZpbXMgdG8gcnVuIHNpbXVsdGFuZW91c2x5LCB3aXRob3V0IGxvc2luZyBhbnkgbWFya3MgZXRjLiAgSWYKKyAqIGZvcmNlaXQgaXMgVFJVRSwgdGhlbiB0aGUgb2xkIGZpbGUgaXMgbm90IHJlYWQgaW4sIGFuZCBvbmx5IGludGVybmFsIGluZm8gaXMKKyAqIHdyaXR0ZW4gdG8gdGhlIGZpbGUuIC0tIHdlYmIKKyAqLworICAgIHZvaWQKK3dyaXRlX3ZpbWluZm8oZmlsZSwgZm9yY2VpdCkKKyAgICBjaGFyX3UJKmZpbGU7CisgICAgaW50CQlmb3JjZWl0OworeworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgRklMRQkqZnBfaW4gPSBOVUxMOwkvKiBpbnB1dCB2aW1pbmZvIGZpbGUsIGlmIGFueSAqLworICAgIEZJTEUJKmZwX291dCA9IE5VTEw7CS8qIG91dHB1dCB2aW1pbmZvIGZpbGUgKi8KKyAgICBjaGFyX3UJKnRlbXBuYW1lID0gTlVMTDsJLyogbmFtZSBvZiB0ZW1wIHZpbWluZm8gZmlsZSAqLworICAgIHN0cnVjdCBzdGF0CXN0X25ldzsJCS8qIG1jaF9zdGF0KCkgb2YgcG90ZW50aWFsIG5ldyBmaWxlICovCisgICAgY2hhcl91CSp3cDsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorICAgIG1vZGVfdAl1bWFza19zYXZlOworI2VuZGlmCisjaWZkZWYgVU5JWAorICAgIGludAkJc2hvcnRuYW1lID0gRkFMU0U7CS8qIHVzZSA4LjMgZmlsZSBuYW1lICovCisgICAgc3RydWN0IHN0YXQJc3Rfb2xkOwkJLyogbWNoX3N0YXQoKSBvZiBleGlzdGluZyB2aW1pbmZvIGZpbGUgKi8KKyNlbmRpZgorCisgICAgaWYgKG5vX3ZpbWluZm8oKSkKKwlyZXR1cm47CisKKyAgICBmbmFtZSA9IHZpbWluZm9fZmlsZW5hbWUoZmlsZSk7CS8qIG1heSBzZXQgdG8gZGVmYXVsdCBpZiBOVUxMICovCisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuOworCisgICAgZnBfaW4gPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZSwgUkVBREJJTik7CisgICAgaWYgKGZwX2luID09IE5VTEwpCisgICAgeworCS8qIGlmIGl0IGRvZXMgZXhpc3QsIGJ1dCB3ZSBjYW4ndCByZWFkIGl0LCBkb24ndCB0cnkgd3JpdGluZyAqLworCWlmIChtY2hfc3RhdCgoY2hhciAqKWZuYW1lLCAmc3RfbmV3KSA9PSAwKQorCSAgICBnb3RvIGVuZDsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorCS8qCisJICogRm9yIFVuaXggd2UgY3JlYXRlIHRoZSAudmltaW5mbyBub24tYWNjZXNzaWJsZSBmb3Igb3RoZXJzLAorCSAqIGJlY2F1c2UgaXQgbWF5IGNvbnRhaW4gdGV4dCBmcm9tIG5vbi1hY2Nlc3NpYmxlIGRvY3VtZW50cy4KKwkgKi8KKwl1bWFza19zYXZlID0gdW1hc2soMDc3KTsKKyNlbmRpZgorCWZwX291dCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCBXUklURUJJTik7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKwkodm9pZCl1bWFzayh1bWFza19zYXZlKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogVGhlcmUgaXMgYW4gZXhpc3RpbmcgdmltaW5mbyBmaWxlLiAgQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8KKwkgKiB3cml0ZSB0aGUgbmV3IHZpbWluZm8gaW50bywgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQorCSAqIGV4aXN0aW5nIHZpbWluZm8gZmlsZSwgd2hpY2ggd2lsbCBiZSByZW5hbWVkIGxhdGVyLgorCSAqLworI2lmZGVmIFVOSVgKKwkvKgorCSAqIEZvciBVbml4IHdlIGNoZWNrIHRoZSBvd25lciBvZiB0aGUgZmlsZS4gIEl0J3Mgbm90IHZlcnkgbmljZSB0bworCSAqIG92ZXJ3cml0ZSBhIHVzZXIncyB2aW1pbmZvIGZpbGUgYWZ0ZXIgYSAic3Ugcm9vdCIsIHdpdGggYQorCSAqIHZpbWluZm8gZmlsZSB0aGF0IHRoZSB1c2VyIGNhbid0IHJlYWQuCisJICovCisJc3Rfb2xkLnN0X2RldiA9IHN0X29sZC5zdF9pbm8gPSAwOworCXN0X29sZC5zdF9tb2RlID0gMDYwMDsKKwlpZiAobWNoX3N0YXQoKGNoYXIgKilmbmFtZSwgJnN0X29sZCkgPT0gMCAmJiBnZXR1aWQoKSAmJgorCQkhKHN0X29sZC5zdF91aWQgPT0gZ2V0dWlkKCkKKwkJCT8gKHN0X29sZC5zdF9tb2RlICYgMDIwMCkKKwkJCTogKHN0X29sZC5zdF9naWQgPT0gZ2V0Z2lkKCkKKwkJCQk/IChzdF9vbGQuc3RfbW9kZSAmIDAwMjApCisJCQkJOiAoc3Rfb2xkLnN0X21vZGUgJiAwMDAyKSkpKQorCXsKKwkgICAgaW50CXR0OworCisJICAgIC8qIGF2b2lkIGEgd2FpdF9yZXR1cm4gZm9yIHRoaXMgbWVzc2FnZSwgaXQncyBhbm5veWluZyAqLworCSAgICB0dCA9IG1zZ19kaWRhbnk7CisJICAgIEVNU0cyKF8oIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIiksIGZuYW1lKTsKKwkgICAgbXNnX2RpZGFueSA9IHR0OworCSAgICBnb3RvIGVuZDsKKwl9CisjZW5kaWYKKworCS8qCisJICogTWFrZSB0ZW1wbmFtZS4KKwkgKiBNYXkgdHJ5IHR3aWNlOiBPbmNlIG5vcm1hbCBhbmQgb25jZSB3aXRoIHNob3J0bmFtZSBzZXQsIGp1c3QgaW4KKwkgKiBjYXNlIHNvbWVib2R5IHB1dHMgaGlzIHZpbWluZm8gZmlsZSBpbiBhbiA4LjMgZmlsZXN5c3RlbS4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgdGVtcG5hbWUgPSBidWZfbW9kbmFtZSgKKyNpZmRlZiBVTklYCisJCQkJICAgIHNob3J0bmFtZSwKKyNlbHNlCisjIGlmZGVmIFNIT1JUX0ZOQU1FCisJCQkJICAgIFRSVUUsCisjIGVsc2UKKyMgIGlmZGVmIEZFQVRfR1VJX1czMgorCQkJCSAgICBndWlfaXNfd2luMzJzKCksCisjICBlbHNlCisJCQkJICAgIEZBTFNFLAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCQkJCSAgICBmbmFtZSwKKyNpZmRlZiBWTVMKKwkJCQkgICAgKGNoYXJfdSAqKSItdG1wIiwKKyNlbHNlCisjIGlmZGVmIFJJU0NPUworCQkJCSAgICAoY2hhcl91ICopIi90bXAiLAorIyBlbHNlCisJCQkJICAgIChjaGFyX3UgKikiLnRtcCIsCisjIGVuZGlmCisjZW5kaWYKKwkJCQkgICAgRkFMU0UpOworCSAgICBpZiAodGVtcG5hbWUgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJYnJlYWs7CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgaWYgdGVtcGZpbGUgYWxyZWFkeSBleGlzdHMuICBOZXZlciBvdmVyd3JpdGUgYW4KKwkgICAgICogZXhpc3RpbmcgZmlsZSEKKwkgICAgICovCisJICAgIGlmIChtY2hfc3RhdCgoY2hhciAqKXRlbXBuYW1lLCAmc3RfbmV3KSA9PSAwKQorCSAgICB7CisjaWZkZWYgVU5JWAorCQkvKgorCQkgKiBDaGVjayBpZiB0ZW1wZmlsZSBpcyBzYW1lIGFzIG9yaWdpbmFsIGZpbGUuICBNYXkgaGFwcGVuCisJCSAqIHdoZW4gbW9kbmFtZSgpIGdhdmUgdGhlIHNhbWUgZmlsZSBiYWNrLiAgRS5nLiAgc2lsbHkKKwkJICogbGluaywgb3IgZmlsZSBuYW1lLWxlbmd0aCByZWFjaGVkLiAgVHJ5IGFnYWluIHdpdGgKKwkJICogc2hvcnRuYW1lIHNldC4KKwkJICovCisJCWlmICghc2hvcnRuYW1lICYmIHN0X25ldy5zdF9kZXYgPT0gc3Rfb2xkLnN0X2RldiAmJgorCQkJc3RfbmV3LnN0X2lubyA9PSBzdF9vbGQuc3RfaW5vKQorCQl7CisJCSAgICB2aW1fZnJlZSh0ZW1wbmFtZSk7CisJCSAgICB0ZW1wbmFtZSA9IE5VTEw7CisJCSAgICBzaG9ydG5hbWUgPSBUUlVFOworCQkgICAgY29udGludWU7CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBUcnkgYW5vdGhlciBuYW1lLiAgQ2hhbmdlIG9uZSBjaGFyYWN0ZXIsIGp1c3QgYmVmb3JlCisJCSAqIHRoZSBleHRlbnNpb24uICBUaGlzIHNob3VsZCBhbHNvIHdvcmsgZm9yIGFuIDguMworCQkgKiBmaWxlIG5hbWUsIHdoZW4gYWZ0ZXIgYWRkaW5nIHRoZSBleHRlbnNpb24gaXQgc3RpbGwgaXMKKwkJICogdGhlIHNhbWUgZmlsZSBhcyB0aGUgb3JpZ2luYWwuCisJCSAqLworCQl3cCA9IHRlbXBuYW1lICsgU1RSTEVOKHRlbXBuYW1lKSAtIDU7CisJCWlmICh3cCA8IGdldHRhaWwodGVtcG5hbWUpKQkgICAgLyogZW1wdHkgZmlsZSBuYW1lPyAqLworCQkgICAgd3AgPSBnZXR0YWlsKHRlbXBuYW1lKTsKKwkJZm9yICgqd3AgPSAneic7IG1jaF9zdGF0KChjaGFyICopdGVtcG5hbWUsICZzdF9uZXcpID09IDA7CisJCQkJCQkJCSAgICAtLSp3cCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFRoZXkgYWxsIGV4aXN0PyAgTXVzdCBiZSBzb21ldGhpbmcgd3JvbmchIERvbid0CisJCSAgICAgKiB3cml0ZSB0aGUgdmltaW5mbyBmaWxlIHRoZW4uCisJCSAgICAgKi8KKwkJICAgIGlmICgqd3AgPT0gJ2EnKQorCQkgICAgeworCQkJdmltX2ZyZWUodGVtcG5hbWUpOworCQkJdGVtcG5hbWUgPSBOVUxMOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwlpZiAodGVtcG5hbWUgIT0gTlVMTCkKKwl7CisJICAgIGZwX291dCA9IG1jaF9mb3BlbigoY2hhciAqKXRlbXBuYW1lLCBXUklURUJJTik7CisKKwkgICAgLyoKKwkgICAgICogSWYgd2UgY2FuJ3QgY3JlYXRlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdHJ5IGNyZWF0aW5nIGEKKwkgICAgICogIm5vcm1hbCIgdGVtcCBmaWxlLgorCSAgICAgKi8KKwkgICAgaWYgKGZwX291dCA9PSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHRlbXBuYW1lKTsKKwkJaWYgKCh0ZW1wbmFtZSA9IHZpbV90ZW1wbmFtZSgnbycpKSAhPSBOVUxMKQorCQkgICAgZnBfb3V0ID0gbWNoX2ZvcGVuKChjaGFyICopdGVtcG5hbWUsIFdSSVRFQklOKTsKKwkgICAgfQorI2lmZGVmIFVOSVgKKwkgICAgLyoKKwkgICAgICogU2V0IGZpbGUgcHJvdGVjdGlvbiBzYW1lIGFzIG9yaWdpbmFsIGZpbGUsIGJ1dCBzdHJpcCBzLWJpdAorCSAgICAgKiBhbmQgbWFrZSBzdXJlIHRoZSBvd25lciBjYW4gcmVhZC93cml0ZSBpdC4KKwkgICAgICovCisJICAgIGlmIChmcF9vdXQgIT0gTlVMTCkKKwkgICAgeworCQkodm9pZCltY2hfc2V0cGVybSh0ZW1wbmFtZSwKKwkJCQkgIChsb25nKSgoc3Rfb2xkLnN0X21vZGUgJiAwNzc3KSB8IDA2MDApKTsKKwkJLyogdGhpcyBvbmx5IHdvcmtzIGZvciByb290OiAqLworCQkodm9pZCljaG93bigoY2hhciAqKXRlbXBuYW1lLCBzdF9vbGQuc3RfdWlkLCBzdF9vbGQuc3RfZ2lkKTsKKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG5ldyB2aW1pbmZvIGZpbGUgY2FuIGJlIHdyaXR0ZW4gdG8uCisgICAgICovCisgICAgaWYgKGZwX291dCA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKCJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIiksCisJCSAgICAgICAoZnBfaW4gPT0gTlVMTCB8fCB0ZW1wbmFtZSA9PSBOVUwpID8gZm5hbWUgOiB0ZW1wbmFtZSk7CisJaWYgKGZwX2luICE9IE5VTEwpCisJICAgIGZjbG9zZShmcF9pbik7CisJZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHBfdmVyYm9zZSA+IDApCisJbXNnX3N0cigoY2hhcl91ICopXygiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIiksIGZuYW1lKTsKKworICAgIHZpbWluZm9fZXJyY250ID0gMDsKKyAgICBkb192aW1pbmZvKGZwX2luLCBmcF9vdXQsICFmb3JjZWl0LCAhZm9yY2VpdCwgRkFMU0UpOworCisgICAgZmNsb3NlKGZwX291dCk7CSAgICAvKiBlcnJvcnMgYXJlIGlnbm9yZWQgIT8gKi8KKyAgICBpZiAoZnBfaW4gIT0gTlVMTCkKKyAgICB7CisJZmNsb3NlKGZwX2luKTsKKwkvKgorCSAqIEluIGNhc2Ugb2YgYW4gZXJyb3IsIGRvbid0IG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgdmltaW5mbyBmaWxlLgorCSAqLworCWlmICh2aW1pbmZvX2VycmNudCB8fCB2aW1fcmVuYW1lKHRlbXBuYW1lLCBmbmFtZSkgPT0gLTEpCisJICAgIG1jaF9yZW1vdmUodGVtcG5hbWUpOworICAgIH0KK2VuZDoKKyAgICB2aW1fZnJlZShmbmFtZSk7CisgICAgdmltX2ZyZWUodGVtcG5hbWUpOworfQorCisvKgorICogR2V0IHRoZSB2aW1pbmZvIGZpbGUgbmFtZSB0byB1c2UuCisgKiBJZiAiZmlsZSIgaXMgZ2l2ZW4gYW5kIG5vdCBlbXB0eSwgdXNlIGl0IChoYXMgYWxyZWFkeSBiZWVuIGV4cGFuZGVkIGJ5CisgKiBjbWRsaW5lIGZ1bmN0aW9ucykuCisgKiBPdGhlcndpc2UgdXNlICItaSBmaWxlX25hbWUiLCB2YWx1ZSBmcm9tICd2aW1pbmZvJyBvciB0aGUgZGVmYXVsdCwgYW5kCisgKiBleHBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nLiAgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3ZpbWluZm9fZmlsZW5hbWUoZmlsZSkKKyAgICBjaGFyX3UJKmZpbGU7Cit7CisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCAqZmlsZSA9PSBOVUwpCisgICAgeworCWlmICh1c2VfdmltaW5mbyAhPSBOVUxMKQorCSAgICBmaWxlID0gdXNlX3ZpbWluZm87CisJZWxzZSBpZiAoKGZpbGUgPSBmaW5kX3ZpbWluZm9fcGFyYW1ldGVyKCduJykpID09IE5VTEwgfHwgKmZpbGUgPT0gTlVMKQorCXsKKyNpZmRlZiBWSU1JTkZPX0ZJTEUyCisJICAgIC8qIGRvbid0IHVzZSAkSE9NRSB3aGVuIG5vdCBkZWZpbmVkICh0dXJuZWQgaW50byAiYzovIiEpLiAqLworIyBpZmRlZiBWTVMKKwkgICAgaWYgKG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJTWVMkTE9HSU4iKSA9PSBOVUxMKQorIyBlbHNlCisJICAgIGlmIChtY2hfZ2V0ZW52KChjaGFyX3UgKikiSE9NRSIpID09IE5VTEwpCisjIGVuZGlmCisJICAgIHsKKwkJLyogZG9uJ3QgdXNlICRWSU0gd2hlbiBub3QgYXZhaWxhYmxlLiAqLworCQlleHBhbmRfZW52KChjaGFyX3UgKikiJFZJTSIsIE5hbWVCdWZmLCBNQVhQQVRITCk7CisJCWlmIChTVFJDTVAoIiRWSU0iLCBOYW1lQnVmZikgIT0gMCkgIC8qICRWSU0gd2FzIGV4cGFuZGVkICovCisJCSAgICBmaWxlID0gKGNoYXJfdSAqKVZJTUlORk9fRklMRTI7CisJCWVsc2UKKwkJICAgIGZpbGUgPSAoY2hhcl91ICopVklNSU5GT19GSUxFOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlmaWxlID0gKGNoYXJfdSAqKVZJTUlORk9fRklMRTsKKwl9CisJZXhwYW5kX2VudihmaWxlLCBOYW1lQnVmZiwgTUFYUEFUSEwpOworCWZpbGUgPSBOYW1lQnVmZjsKKyAgICB9CisgICAgcmV0dXJuIHZpbV9zdHJzYXZlKGZpbGUpOworfQorCisvKgorICogZG9fdmltaW5mbygpIC0tIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHJlYWRfdmltaW5mbygpICYgd3JpdGVfdmltaW5mbygpLgorICovCisgICAgc3RhdGljIHZvaWQKK2RvX3ZpbWluZm8oZnBfaW4sIGZwX291dCwgd2FudF9pbmZvLCB3YW50X21hcmtzLCBmb3JjZV9yZWFkKQorICAgIEZJTEUJKmZwX2luOworICAgIEZJTEUJKmZwX291dDsKKyAgICBpbnQJCXdhbnRfaW5mbzsKKyAgICBpbnQJCXdhbnRfbWFya3M7CisgICAgaW50CQlmb3JjZV9yZWFkOworeworICAgIGludAkJY291bnQgPSAwOworICAgIGludAkJZW9mID0gRkFMU0U7CisgICAgdmlyX1QJdmlyOworCisgICAgaWYgKCh2aXIudmlyX2xpbmUgPSBhbGxvYyhMU0laRSkpID09IE5VTEwpCisJcmV0dXJuOworICAgIHZpci52aXJfZmQgPSBmcF9pbjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgdmlyLnZpcl9jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CisjZW5kaWYKKworICAgIGlmIChmcF9pbiAhPSBOVUxMKQorICAgIHsKKwlpZiAod2FudF9pbmZvKQorCSAgICBlb2YgPSByZWFkX3ZpbWluZm9fdXBfdG9fbWFya3MoJnZpciwgZm9yY2VfcmVhZCwgZnBfb3V0ICE9IE5VTEwpOworCWVsc2UKKwkgICAgLyogU2tpcCBpbmZvLCBmaW5kIHN0YXJ0IG9mIG1hcmtzICovCisJICAgIHdoaWxlICghKGVvZiA9IHZpbWluZm9fcmVhZGxpbmUoJnZpcikpCisJCSAgICAmJiB2aXIudmlyX2xpbmVbMF0gIT0gJz4nKQorCQk7CisgICAgfQorICAgIGlmIChmcF9vdXQgIT0gTlVMTCkKKyAgICB7CisJLyogV3JpdGUgdGhlIGluZm86ICovCisJZnByaW50ZihmcF9vdXQsIF8oIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iKSwKKwkJCQkJCQkgIFZJTV9WRVJTSU9OX01FRElVTSk7CisJZnByaW50ZihmcF9vdXQsIF8oIiMgWW91IG1heSBlZGl0IGl0IGlmIHlvdSdyZSBjYXJlZnVsIVxuXG4iKSk7CisjaWZkZWYgRkVBVF9NQllURQorCWZwcmludGYoZnBfb3V0LCBfKCIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIpKTsKKwlmcHJpbnRmKGZwX291dCwgIiplbmNvZGluZz0lc1xuXG4iLCBwX2VuYyk7CisjZW5kaWYKKwl3cml0ZV92aW1pbmZvX3NlYXJjaF9wYXR0ZXJuKGZwX291dCk7CisJd3JpdGVfdmltaW5mb19zdWJfc3RyaW5nKGZwX291dCk7CisjaWZkZWYgRkVBVF9DTURISVNUCisJd3JpdGVfdmltaW5mb19oaXN0b3J5KGZwX291dCk7CisjZW5kaWYKKwl3cml0ZV92aW1pbmZvX3JlZ2lzdGVycyhmcF9vdXQpOworI2lmZGVmIEZFQVRfRVZBTAorCXdyaXRlX3ZpbWluZm9fdmFybGlzdChmcF9vdXQpOworI2VuZGlmCisJd3JpdGVfdmltaW5mb19maWxlbWFya3MoZnBfb3V0KTsKKwl3cml0ZV92aW1pbmZvX2J1ZmZlcmxpc3QoZnBfb3V0KTsKKwljb3VudCA9IHdyaXRlX3ZpbWluZm9fbWFya3MoZnBfb3V0KTsKKyAgICB9CisgICAgaWYgKGZwX2luICE9IE5VTEwgJiYgd2FudF9tYXJrcykKKwljb3B5X3ZpbWluZm9fbWFya3MoJnZpciwgZnBfb3V0LCBjb3VudCwgZW9mKTsKKworICAgIHZpbV9mcmVlKHZpci52aXJfbGluZSk7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmICh2aXIudmlyX2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJY29udmVydF9zZXR1cCgmdmlyLnZpcl9jb252LCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorfQorCisvKgorICogcmVhZF92aW1pbmZvX3VwX3RvX21hcmtzKCkgLS0gT25seSBjYWxsZWQgZnJvbSBkb192aW1pbmZvKCkuICBSZWFkcyBpbiB0aGUKKyAqIGZpcnN0IHBhcnQgb2YgdGhlIHZpbWluZm8gZmlsZSB3aGljaCBjb250YWlucyBldmVyeXRoaW5nIGJ1dCB0aGUgbWFya3MgdGhhdAorICogYXJlIGxvY2FsIHRvIGEgZmlsZS4gIFJldHVybnMgVFJVRSB3aGVuIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuIC0tIHdlYmIKKyAqLworICAgIHN0YXRpYyBpbnQKK3JlYWRfdmltaW5mb191cF90b19tYXJrcyh2aXJwLCBmb3JjZWl0LCB3cml0aW5nKQorICAgIHZpcl9UCSp2aXJwOworICAgIGludAkJZm9yY2VpdDsKKyAgICBpbnQJCXdyaXRpbmc7Cit7CisgICAgaW50CQllb2Y7CisgICAgYnVmX1QJKmJ1ZjsKKworI2lmZGVmIEZFQVRfQ01ESElTVAorICAgIHByZXBhcmVfdmltaW5mb19oaXN0b3J5KGZvcmNlaXQgPyA5OTk5IDogMCk7CisjZW5kaWYKKyAgICBlb2YgPSB2aW1pbmZvX3JlYWRsaW5lKHZpcnApOworICAgIHdoaWxlICghZW9mICYmIHZpcnAtPnZpcl9saW5lWzBdICE9ICc+JykKKyAgICB7CisJc3dpdGNoICh2aXJwLT52aXJfbGluZVswXSkKKwl7CisJCS8qIENoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24sIGlnbm9yZWQgbm93ICovCisJICAgIGNhc2UgJysnOiAvKiAiKzQwIC9wYXRoL2RpciBmaWxlIiwgZm9yIHJ1bm5pbmcgdmltIHdpdGhvdXQgYXJncyAqLworCSAgICBjYXNlICd8JzogLyogdG8gYmUgZGVmaW5lZCAqLworCSAgICBjYXNlICdeJzogLyogdG8gYmUgZGVmaW5lZCAqLworCSAgICBjYXNlICc8JzogLyogbG9uZyBsaW5lIC0gaWdub3JlZCAqLworCQkvKiBBIGNvbW1lbnQgb3IgZW1wdHkgbGluZS4gKi8KKwkgICAgY2FzZSBOVUw6CisJICAgIGNhc2UgJ1xyJzoKKwkgICAgY2FzZSAnXG4nOgorCSAgICBjYXNlICcjJzoKKwkJZW9mID0gdmltaW5mb19yZWFkbGluZSh2aXJwKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJyonOiAvKiAiKmVuY29kaW5nPXZhbHVlIiAqLworCQllb2YgPSB2aW1pbmZvX2VuY29kaW5nKHZpcnApOworCQlicmVhazsKKwkgICAgY2FzZSAnISc6IC8qIGdsb2JhbCB2YXJpYWJsZSAqLworI2lmZGVmIEZFQVRfRVZBTAorCQllb2YgPSByZWFkX3ZpbWluZm9fdmFybGlzdCh2aXJwLCB3cml0aW5nKTsKKyNlbHNlCisJCWVvZiA9IHZpbWluZm9fcmVhZGxpbmUodmlycCk7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIGNhc2UgJyUnOiAvKiBlbnRyeSBmb3IgYnVmZmVyIGxpc3QgKi8KKwkJZW9mID0gcmVhZF92aW1pbmZvX2J1ZmZlcmxpc3QodmlycCwgd3JpdGluZyk7CisJCWJyZWFrOworCSAgICBjYXNlICciJzoKKwkJZW9mID0gcmVhZF92aW1pbmZvX3JlZ2lzdGVyKHZpcnAsIGZvcmNlaXQpOworCQlicmVhazsKKwkgICAgY2FzZSAnLyc6CSAgICAvKiBTZWFyY2ggc3RyaW5nICovCisJICAgIGNhc2UgJyYnOgkgICAgLyogU3Vic3RpdHV0ZSBzZWFyY2ggc3RyaW5nICovCisJICAgIGNhc2UgJ34nOgkgICAgLyogTGFzdCBzZWFyY2ggc3RyaW5nLCBmb2xsb3dlZCBieSAnLycgb3IgJyYnICovCisJCWVvZiA9IHJlYWRfdmltaW5mb19zZWFyY2hfcGF0dGVybih2aXJwLCBmb3JjZWl0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJyQnOgorCQllb2YgPSByZWFkX3ZpbWluZm9fc3ViX3N0cmluZyh2aXJwLCBmb3JjZWl0KTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJzonOgorCSAgICBjYXNlICc/JzoKKwkgICAgY2FzZSAnPSc6CisJICAgIGNhc2UgJ0AnOgorI2lmZGVmIEZFQVRfQ01ESElTVAorCQllb2YgPSByZWFkX3ZpbWluZm9faGlzdG9yeSh2aXJwKTsKKyNlbHNlCisJCWVvZiA9IHZpbWluZm9fcmVhZGxpbmUodmlycCk7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIGNhc2UgJy0nOgorCSAgICBjYXNlICdcJyc6CisJCWVvZiA9IHJlYWRfdmltaW5mb19maWxlbWFyayh2aXJwLCBmb3JjZWl0KTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWlmICh2aW1pbmZvX2Vycm9yKCJFNTc1OiAiLCBfKCJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiKSwKKwkJCSAgICB2aXJwLT52aXJfbGluZSkpCisJCSAgICBlb2YgPSBUUlVFOworCQllbHNlCisJCSAgICBlb2YgPSB2aW1pbmZvX3JlYWRsaW5lKHZpcnApOworCQlicmVhazsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgLyogRmluaXNoIHJlYWRpbmcgaGlzdG9yeSBpdGVtcy4gKi8KKyAgICBmaW5pc2hfdmltaW5mb19oaXN0b3J5KCk7CisjZW5kaWYKKworICAgIC8qIENoYW5nZSBmaWxlIG5hbWVzIHRvIGJ1ZmZlciBudW1iZXJzIGZvciBmbWFya3MuICovCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCWZtYXJrc19jaGVja19uYW1lcyhidWYpOworCisgICAgcmV0dXJuIGVvZjsKK30KKworLyoKKyAqIENvbXBhcmUgdGhlICdlbmNvZGluZycgdmFsdWUgaW4gdGhlIHZpbWluZm8gZmlsZSB3aXRoIHRoZSBjdXJyZW50IHZhbHVlIG9mCisgKiAnZW5jb2RpbmcnLiAgSWYgZGlmZmVyZW50IGFuZCB0aGUgJ2MnIGZsYWcgaXMgaW4gJ3ZpbWluZm8nLCBzZXR1cCBmb3IKKyAqIGNvbnZlcnNpb24gb2YgdGV4dCB3aXRoIGljb252KCkgaW4gdmltaW5mb19yZWFkc3RyaW5nKCkuCisgKi8KKyAgICBzdGF0aWMgaW50Cit2aW1pbmZvX2VuY29kaW5nKHZpcnApCisgICAgdmlyX1QJKnZpcnA7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoZ2V0X3ZpbWluZm9fcGFyYW1ldGVyKCdjJykgIT0gMCkKKyAgICB7CisJcCA9IHZpbV9zdHJjaHIodmlycC0+dmlyX2xpbmUsICc9Jyk7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIC8qIHJlbW92ZSB0cmFpbGluZyBuZXdsaW5lICovCisJICAgICsrcDsKKwkgICAgZm9yIChpID0gMDsgdmltX2lzcHJpbnRjKHBbaV0pOyArK2kpCisJCTsKKwkgICAgcFtpXSA9IE5VTDsKKworCSAgICBjb252ZXJ0X3NldHVwKCZ2aXJwLT52aXJfY29udiwgcCwgcF9lbmMpOworCX0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdmltaW5mb19yZWFkbGluZSh2aXJwKTsKK30KKworLyoKKyAqIFJlYWQgYSBsaW5lIGZyb20gdGhlIHZpbWluZm8gZmlsZS4KKyAqIFJldHVybnMgVFJVRSBmb3IgZW5kLW9mLWZpbGU7CisgKi8KKyAgICBpbnQKK3ZpbWluZm9fcmVhZGxpbmUodmlycCkKKyAgICB2aXJfVAkqdmlycDsKK3sKKyAgICByZXR1cm4gdmltX2ZnZXRzKHZpcnAtPnZpcl9saW5lLCBMU0laRSwgdmlycC0+dmlyX2ZkKTsKK30KKworLyoKKyAqIGNoZWNrIHN0cmluZyByZWFkIGZyb20gdmltaW5mbyBmaWxlCisgKiByZW1vdmUgJ1xuJyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lCisgKiAtIHJlcGxhY2UgQ1RSTC1WIENUUkwtViB3aXRoIENUUkwtVgorICogLSByZXBsYWNlIENUUkwtViAnbicgICAgd2l0aCAnXG4nCisgKgorICogQ2hlY2sgZm9yIGEgbG9uZyBsaW5lIGFzIHdyaXR0ZW4gYnkgdmltaW5mb193cml0ZXN0cmluZygpLgorICoKKyAqIFJldHVybiB0aGUgc3RyaW5nIGluIGFsbG9jYXRlZCBtZW1vcnkgKE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5KS4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK3ZpbWluZm9fcmVhZHN0cmluZyh2aXJwLCBvZmYsIGNvbnZlcnQpCisgICAgdmlyX1QJKnZpcnA7CisgICAgaW50CQlvZmY7CQkgICAgLyogb2Zmc2V0IGZvciB2aXJwLT52aXJfbGluZSAqLworICAgIGludAkJY29udmVydDsJICAgIC8qIGNvbnZlcnQgdGhlIHN0cmluZyAqLworeworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIGNoYXJfdQkqcywgKmQ7CisgICAgbG9uZwlsZW47CisKKyAgICBpZiAodmlycC0+dmlyX2xpbmVbb2ZmXSA9PSBDdHJsX1YgJiYgdmltX2lzZGlnaXQodmlycC0+dmlyX2xpbmVbb2ZmICsgMV0pKQorICAgIHsKKwlsZW4gPSBhdG9sKChjaGFyICopdmlycC0+dmlyX2xpbmUgKyBvZmYgKyAxKTsKKwlyZXR2YWwgPSBsYWxsb2MobGVuLCBUUlVFKTsKKwlpZiAocmV0dmFsID09IE5VTEwpCisJeworCSAgICAvKiBMaW5lIHRvbyBsb25nPyAgRmlsZSBtZXNzZWQgdXA/ICBTa2lwIG5leHQgbGluZS4gKi8KKwkgICAgKHZvaWQpdmltX2ZnZXRzKHZpcnAtPnZpcl9saW5lLCAxMCwgdmlycC0+dmlyX2ZkKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCSh2b2lkKXZpbV9mZ2V0cyhyZXR2YWwsIChpbnQpbGVuLCB2aXJwLT52aXJfZmQpOworCXMgPSByZXR2YWwgKyAxOwkgICAgLyogU2tpcCB0aGUgbGVhZGluZyAnPCcgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXR2YWwgPSB2aW1fc3Ryc2F2ZSh2aXJwLT52aXJfbGluZSArIG9mZik7CisJaWYgKHJldHZhbCA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwlzID0gcmV0dmFsOworICAgIH0KKworICAgIC8qIENoYW5nZSBDVFJMLVYgQ1RSTC1WIHRvIENUUkwtViBhbmQgQ1RSTC1WIG4gdG8gXG4gaW4tcGxhY2UuICovCisgICAgZCA9IHJldHZhbDsKKyAgICB3aGlsZSAoKnMgIT0gTlVMICYmICpzICE9ICdcbicpCisgICAgeworCWlmIChzWzBdID09IEN0cmxfViAmJiBzWzFdICE9IE5VTCkKKwl7CisJICAgIGlmIChzWzFdID09ICduJykKKwkJKmQrKyA9ICdcbic7CisJICAgIGVsc2UKKwkJKmQrKyA9IEN0cmxfVjsKKwkgICAgcyArPSAyOworCX0KKwllbHNlCisJICAgICpkKysgPSAqcysrOworICAgIH0KKyAgICAqZCA9IE5VTDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoY29udmVydCAmJiB2aXJwLT52aXJfY29udi52Y190eXBlICE9IENPTlZfTk9ORSAmJiAqcmV0dmFsICE9IE5VTCkKKyAgICB7CisJZCA9IHN0cmluZ19jb252ZXJ0KCZ2aXJwLT52aXJfY29udiwgcmV0dmFsLCBOVUxMKTsKKwlpZiAoZCAhPSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUocmV0dmFsKTsKKwkgICAgcmV0dmFsID0gZDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogd3JpdGUgc3RyaW5nIHRvIHZpbWluZm8gZmlsZQorICogLSByZXBsYWNlIENUUkwtViB3aXRoIENUUkwtViBDVFJMLVYKKyAqIC0gcmVwbGFjZSAnXG4nICAgd2l0aCBDVFJMLVYgJ24nCisgKiAtIGFkZCBhICdcbicgYXQgdGhlIGVuZAorICoKKyAqIEZvciBhIGxvbmcgbGluZToKKyAqIC0gd3JpdGUgIiBDVFJMLVYgPGxlbmd0aD4gXG4gIiBpbiBmaXJzdCBsaW5lCisgKiAtIHdyaXRlICIgPCA8c3RyaW5nPiBcbiAiCSAgaW4gc2Vjb25kIGxpbmUKKyAqLworICAgIHZvaWQKK3ZpbWluZm9fd3JpdGVzdHJpbmcoZmQsIHApCisgICAgRklMRQkqZmQ7CisgICAgY2hhcl91CSpwOworeworICAgIGludAkJYzsKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsZW4gPSAwOworCisgICAgZm9yIChzID0gcDsgKnMgIT0gTlVMOyArK3MpCisgICAgeworCWlmICgqcyA9PSBDdHJsX1YgfHwgKnMgPT0gJ1xuJykKKwkgICAgKytsZW47CisJKytsZW47CisgICAgfQorCisgICAgLyogSWYgdGhlIHN0cmluZyB3aWxsIGJlIHRvbyBsb25nLCB3cml0ZSBpdHMgbGVuZ3RoIGFuZCBwdXQgaXQgaW4gdGhlIG5leHQKKyAgICAgKiBsaW5lLiAgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBzb21lIHJvb20gaXMgbmVlZGVkIGZvciB3aGF0IGNvbWVzIGJlZm9yZQorICAgICAqIHRoZSBzdHJpbmcgKGUuZy4sIHZhcmlhYmxlIG5hbWUpLiAgQWRkIHNvbWV0aGluZyB0byB0aGUgbGVuZ3RoIGZvciB0aGUKKyAgICAgKiAnPCcsIE5MIGFuZCB0cmFpbGluZyBOVUwuICovCisgICAgaWYgKGxlbiA+IExTSVpFIC8gMikKKwlmcHJpbnRmKGZkLCBJRl9FQigiXDAyNiVkXG48IiwgQ1RSTF9WX1NUUiAiJWRcbjwiKSwgbGVuICsgMyk7CisKKyAgICB3aGlsZSAoKGMgPSAqcCsrKSAhPSBOVUwpCisgICAgeworCWlmIChjID09IEN0cmxfViB8fCBjID09ICdcbicpCisJeworCSAgICBwdXRjKEN0cmxfViwgZmQpOworCSAgICBpZiAoYyA9PSAnXG4nKQorCQljID0gJ24nOworCX0KKwlwdXRjKGMsIGZkKTsKKyAgICB9CisgICAgcHV0YygnXG4nLCBmZCk7Cit9CisjZW5kaWYgLyogRkVBVF9WSU1JTkZPICovCisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiAiOmZpeGRlbCIsIGFsc28gdXNlZCBieSBnZXRfc3R0eSgpLgorICogIDxCUz4gICAgcmVzdWx0aW5nIDxEZWw+CisgKiAgIF4/CQleSAorICogbm90IF4/CV4/CisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2RvX2ZpeGRlbChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdSAgKnA7CisKKyAgICBwID0gZmluZF90ZXJtY29kZSgoY2hhcl91ICopImtiIik7CisgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKikia0QiLCBwICE9IE5VTEwKKwkgICAgJiYgKnAgPT0gREVMID8gKGNoYXJfdSAqKUNUUkxfSF9TVFIgOiBERUxfU1RSLCBGQUxTRSk7Cit9CisKKyAgICB2b2lkCitwcmludF9saW5lX25vX3ByZWZpeChsbnVtLCB1c2VfbnVtYmVyKQorICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQl1c2VfbnVtYmVyOworeworICAgIGNoYXJfdQludW1idWZbMjBdOworCisgICAgaWYgKGN1cndpbi0+d19wX251IHx8IHVzZV9udW1iZXIpCisgICAgeworCXNwcmludGYoKGNoYXIgKiludW1idWYsICIlN2xkICIsIChsb25nKWxudW0pOworCW1zZ19wdXRzX2F0dHIobnVtYnVmLCBobF9hdHRyKEhMRl9OKSk7CS8qIEhpZ2hsaWdodCBsaW5lIG5ycyAqLworICAgIH0KKyAgICBtc2dfcHJ0X2xpbmUobWxfZ2V0KGxudW0pKTsKK30KKworLyoKKyAqIFByaW50IGEgdGV4dCBsaW5lLiAgQWxzbyBpbiBzaWxlbnQgbW9kZSAoImV4IC1zIikuCisgKi8KKyAgICB2b2lkCitwcmludF9saW5lKGxudW0sIHVzZV9udW1iZXIpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXVzZV9udW1iZXI7Cit7CisgICAgaW50CQlzYXZlX3NpbGVudCA9IHNpbGVudF9tb2RlOworCisgICAgc2lsZW50X21vZGUgPSBGQUxTRTsKKyAgICBtc2dfc3RhcnQoKTsKKyAgICBwcmludF9saW5lX25vX3ByZWZpeChsbnVtLCB1c2VfbnVtYmVyKTsKKyAgICBpZiAoc2F2ZV9zaWxlbnQpCisgICAgeworCW1zZ19wdXRjaGFyKCdcbicpOworCWN1cnNvcl9vbigpOwkJLyogbXNnX3N0YXJ0KCkgc3dpdGNoZXMgaXQgb2ZmICovCisJb3V0X2ZsdXNoKCk7CisJc2lsZW50X21vZGUgPSBzYXZlX3NpbGVudDsKKyAgICB9Cit9CisKKy8qCisgKiAiOmZpbGVbIV0gW2ZuYW1lXSIuCisgKi8KKyAgICB2b2lkCitleF9maWxlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSpmbmFtZSwgKnNmbmFtZSwgKnhmbmFtZTsKKyAgICBidWZfVAkqYnVmOworCisgICAgaWYgKCplYXAtPmFyZyAhPSBOVUwpCisgICAgeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWJ1ZiA9IGN1cmJ1ZjsKKwlhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZGSUxFUFJFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwkvKiBidWZmZXIgY2hhbmdlZCwgZG9uJ3QgY2hhbmdlIG5hbWUgbm93ICovCisJaWYgKGJ1ZiAhPSBjdXJidWYpCisJICAgIHJldHVybjsKKyMgaWZkZWYgRkVBVF9FVkFMCisJaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkgICAgcmV0dXJuOworIyBlbmRpZgorI2VuZGlmCisJLyoKKwkgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBidWZmZXIgd2lsbCBiZSBjaGFuZ2VkLgorCSAqIEEgbmV3ICh1bmxpc3RlZCkgYnVmZmVyIGVudHJ5IG5lZWRzIHRvIGJlIG1hZGUgdG8gaG9sZCB0aGUgb2xkIGZpbGUKKwkgKiBuYW1lLCB3aGljaCB3aWxsIGJlY29tZSB0aGUgYWx0ZXJuYXRlIGZpbGUgbmFtZS4KKwkgKi8KKwlmbmFtZSA9IGN1cmJ1Zi0+Yl9mZm5hbWU7CisJc2ZuYW1lID0gY3VyYnVmLT5iX3NmbmFtZTsKKwl4Zm5hbWUgPSBjdXJidWYtPmJfZm5hbWU7CisJY3VyYnVmLT5iX2ZmbmFtZSA9IE5VTEw7CisJY3VyYnVmLT5iX3NmbmFtZSA9IE5VTEw7CisJaWYgKHNldGZuYW1lKGN1cmJ1ZiwgZWFwLT5hcmcsIE5VTEwsIFRSVUUpID09IEZBSUwpCisJeworCSAgICBjdXJidWYtPmJfZmZuYW1lID0gZm5hbWU7CisJICAgIGN1cmJ1Zi0+Yl9zZm5hbWUgPSBzZm5hbWU7CisJICAgIHJldHVybjsKKwl9CisJY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX05PVEVESVRFRDsKKwlidWYgPSBidWZsaXN0X25ldyhmbmFtZSwgeGZuYW1lLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIDApOworCWlmIChidWYgIT0gTlVMTCkKKwkgICAgY3Vyd2luLT53X2FsdF9mbnVtID0gYnVmLT5iX2ZudW07CisJdmltX2ZyZWUoZm5hbWUpOworCXZpbV9mcmVlKHNmbmFtZSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGRklMRVBPU1QsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworI2VuZGlmCisgICAgfQorICAgIC8qIHByaW50IGZ1bGwgZmlsZSBuYW1lIGlmIDpjZCB1c2VkICovCisgICAgZmlsZWluZm8oRkFMU0UsIEZBTFNFLCBlYXAtPmZvcmNlaXQpOworfQorCisvKgorICogIjp1cGRhdGUiLgorICovCisgICAgdm9pZAorZXhfdXBkYXRlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKGN1cmJ1ZklzQ2hhbmdlZCgpKQorCSh2b2lkKWRvX3dyaXRlKGVhcCk7Cit9CisKKy8qCisgKiAiOndyaXRlIiBhbmQgIjpzYXZlYXMiLgorICovCisgICAgdm9pZAorZXhfd3JpdGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoZWFwLT51c2VmaWx0ZXIpCQkvKiBpbnB1dCBsaW5lcyB0byBzaGVsbCBjb21tYW5kICovCisJZG9fYmFuZygxLCBlYXAsIEZBTFNFLCBUUlVFLCBGQUxTRSk7CisgICAgZWxzZQorCSh2b2lkKWRvX3dyaXRlKGVhcCk7Cit9CisKKy8qCisgKiB3cml0ZSBjdXJyZW50IGJ1ZmZlciB0byBmaWxlICdlYXAtPmFyZycKKyAqIGlmICdlYXAtPmFwcGVuZCcgaXMgVFJVRSwgYXBwZW5kIHRvIHRoZSBmaWxlCisgKgorICogaWYgKmVhcC0+YXJnID09IE5VTCB3cml0ZSB0byBjdXJyZW50IGZpbGUKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2RvX3dyaXRlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlvdGhlcjsKKyAgICBjaGFyX3UJKmZuYW1lID0gTlVMTDsJCS8qIGluaXQgdG8gc2h1dCB1cCBnY2MgKi8KKyAgICBjaGFyX3UJKmZmbmFtZTsKKyAgICBpbnQJCXJldHZhbCA9IEZBSUw7CisgICAgY2hhcl91CSpmcmVlX2ZuYW1lID0gTlVMTDsKKyNpZmRlZiBGRUFUX0JST1dTRQorICAgIGNoYXJfdQkqYnJvd3NlX2ZpbGUgPSBOVUxMOworI2VuZGlmCisgICAgYnVmX1QJKmFsdF9idWYgPSBOVUxMOworCisgICAgaWYgKG5vdF93cml0aW5nKCkpCQkvKiBjaGVjayAnd3JpdGUnIG9wdGlvbiAqLworCXJldHVybiBGQUlMOworCisgICAgZmZuYW1lID0gZWFwLT5hcmc7CisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICBpZiAoY21kbW9kLmJyb3dzZSkKKyAgICB7CisJYnJvd3NlX2ZpbGUgPSBkb19icm93c2UoVFJVRSwgKGNoYXJfdSAqKV8oIlNhdmUgQXMiKSwgZmZuYW1lLAorCQkJCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsIGN1cmJ1Zik7CisJaWYgKGJyb3dzZV9maWxlID09IE5VTEwpCisJICAgIGdvdG8gdGhlZW5kOworCWZmbmFtZSA9IGJyb3dzZV9maWxlOworICAgIH0KKyNlbmRpZgorICAgIGlmICgqZmZuYW1lID09IE5VTCkKKyAgICB7CisJaWYgKGVhcC0+Y21kaWR4ID09IENNRF9zYXZlYXMpCisJeworCSAgICBFTVNHKF8oZV9hcmdyZXEpKTsKKwkgICAgZ290byB0aGVlbmQ7CisJfQorCW90aGVyID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZm5hbWUgPSBmZm5hbWU7CisJZnJlZV9mbmFtZSA9IGZpeF9mbmFtZShmZm5hbWUpOworCS8qCisJICogV2hlbiBvdXQtb2YtbWVtb3J5LCBrZWVwIHVuZXhwYW5kZWQgZmlsZSBuYW1lLCBiZWNhdXNlIHdlIE1VU1QgYmUKKwkgKiBhYmxlIHRvIHdyaXRlIHRoZSBmaWxlIGluIHRoaXMgc2l0dWF0aW9uLgorCSAqLworCWlmIChmcmVlX2ZuYW1lICE9IE5VTEwpCisJICAgIGZmbmFtZSA9IGZyZWVfZm5hbWU7CisJb3RoZXIgPSBvdGhlcmZpbGUoZmZuYW1lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlIGhhdmUgYSBuZXcgZmlsZSwgcHV0IGl0cyBuYW1lIGluIHRoZSBsaXN0IG9mIGFsdGVybmF0ZSBmaWxlIG5hbWVzLgorICAgICAqLworICAgIGlmIChvdGhlcikKKyAgICB7CisJaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19BTFRXUklURSkgIT0gTlVMTAorCQkJCQkJIHx8IGVhcC0+Y21kaWR4ID09IENNRF9zYXZlYXMpCisJICAgIGFsdF9idWYgPSBzZXRhbHRmbmFtZShmZm5hbWUsIGZuYW1lLCAobGluZW5yX1QpMSk7CisJZWxzZQorCSAgICBhbHRfYnVmID0gYnVmbGlzdF9maW5kbmFtZShmZm5hbWUpOworCWlmIChhbHRfYnVmICE9IE5VTEwgJiYgYWx0X2J1Zi0+Yl9tbC5tbF9tZnAgIT0gTlVMTCkKKwl7CisJICAgIC8qIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorCSAgICAgKiBnb29kIGlkZWEuICovCisJICAgIEVNU0coXygiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiKSk7CisJICAgIGdvdG8gdGhlZW5kOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFdyaXRpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBpcyBub3QgYWxsb3dlZCBpbiByZWFkb25seSBtb2RlCisgICAgICogYW5kIGEgZmlsZSBuYW1lIGlzIHJlcXVpcmVkLgorICAgICAqICJub2ZpbGUiIGFuZCAibm93cml0ZSIgYnVmZmVycyBjYW5ub3QgYmUgd3JpdHRlbiBpbXBsaWNpdGx5IGVpdGhlci4KKyAgICAgKi8KKyAgICBpZiAoIW90aGVyICYmICgKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCWJ0X2RvbnR3cml0ZV9tc2coY3VyYnVmKSB8fAorI2VuZGlmCisJCWNoZWNrX2ZuYW1lKCkgPT0gRkFJTCB8fCBjaGVja19yZWFkb25seSgmZWFwLT5mb3JjZWl0LCBjdXJidWYpKSkKKwlnb3RvIHRoZWVuZDsKKworICAgIGlmICghb3RoZXIpCisgICAgeworCWZmbmFtZSA9IGN1cmJ1Zi0+Yl9mZm5hbWU7CisJZm5hbWUgPSBjdXJidWYtPmJfZm5hbWU7CisJLyoKKwkgKiBOb3Qgd3JpdGluZyB0aGUgd2hvbGUgZmlsZSBpcyBvbmx5IGFsbG93ZWQgd2l0aCAnIScuCisJICovCisJaWYgKAkgICAoZWFwLT5saW5lMSAhPSAxCisJCSAgICB8fCBlYXAtPmxpbmUyICE9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkmJiAhZWFwLT5mb3JjZWl0CisJCSYmICFlYXAtPmFwcGVuZAorCQkmJiAhcF93YSkKKwl7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCSAgICBpZiAocF9jb25maXJtIHx8IGNtZG1vZC5jb25maXJtKQorCSAgICB7CisJCWlmICh2aW1fZGlhbG9nX3llc25vKFZJTV9RVUVTVElPTiwgTlVMTCwKKwkJCSAgICAgICAoY2hhcl91ICopXygiV3JpdGUgcGFydGlhbCBmaWxlPyIpLCAyKSAhPSBWSU1fWUVTKQorCQkgICAgZ290byB0aGVlbmQ7CisJCWVhcC0+Zm9yY2VpdCA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJRU1TRyhfKCJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIpKTsKKwkJZ290byB0aGVlbmQ7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGNoZWNrX292ZXJ3cml0ZShlYXAsIGN1cmJ1ZiwgZm5hbWUsIGZmbmFtZSwgb3RoZXIpID09IE9LKQorICAgIHsKKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3NhdmVhcyAmJiBhbHRfYnVmICE9IE5VTEwpCisJeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBidWZfVAkqd2FzX2N1cmJ1ZiA9IGN1cmJ1ZjsKKworCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZGSUxFUFJFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKyMgaWZkZWYgRkVBVF9FVkFMCisJICAgIGlmIChjdXJidWYgIT0gd2FzX2N1cmJ1ZiB8fCBhYm9ydGluZygpKQorIyBlbHNlCisJICAgIGlmIChjdXJidWYgIT0gd2FzX2N1cmJ1ZikKKyMgZW5kaWYKKwkgICAgeworCQkvKiBidWZmZXIgY2hhbmdlZCwgZG9uJ3QgY2hhbmdlIG5hbWUgbm93ICovCisJCXJldHZhbCA9IEZBSUw7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisjZW5kaWYKKwkgICAgLyogRXhjaGFuZ2UgdGhlIGZpbGUgbmFtZXMgZm9yIHRoZSBjdXJyZW50IGFuZCB0aGUgYWx0ZXJuYXRlCisJICAgICAqIGJ1ZmZlci4gIFRoaXMgbWFrZXMgaXQgbG9vayBsaWtlIHdlIGFyZSBub3cgZWRpdGluZyB0aGUgYnVmZmVyCisJICAgICAqIHVuZGVyIHRoZSBuZXcgbmFtZS4gIE11c3QgYmUgZG9uZSBiZWZvcmUgYnVmX3dyaXRlKCksIGJlY2F1c2UKKwkgICAgICogaWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lIGFuZCAnY3BvJyBjb250YWlucyAnRicsIGl0IHdpbGwgc2V0CisJICAgICAqIHRoZSBmaWxlIG5hbWUuICovCisJICAgIGZuYW1lID0gYWx0X2J1Zi0+Yl9mbmFtZTsKKwkgICAgYWx0X2J1Zi0+Yl9mbmFtZSA9IGN1cmJ1Zi0+Yl9mbmFtZTsKKwkgICAgY3VyYnVmLT5iX2ZuYW1lID0gZm5hbWU7CisJICAgIGZuYW1lID0gYWx0X2J1Zi0+Yl9mZm5hbWU7CisJICAgIGFsdF9idWYtPmJfZmZuYW1lID0gY3VyYnVmLT5iX2ZmbmFtZTsKKwkgICAgY3VyYnVmLT5iX2ZmbmFtZSA9IGZuYW1lOworCSAgICBmbmFtZSA9IGFsdF9idWYtPmJfc2ZuYW1lOworCSAgICBhbHRfYnVmLT5iX3NmbmFtZSA9IGN1cmJ1Zi0+Yl9zZm5hbWU7CisJICAgIGN1cmJ1Zi0+Yl9zZm5hbWUgPSBmbmFtZTsKKwkgICAgYnVmX25hbWVfY2hhbmdlZChjdXJidWYpOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZGSUxFUE9TVCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisJICAgIGlmICghYWx0X2J1Zi0+Yl9wX2JsKQorCSAgICB7CisJCWFsdF9idWYtPmJfcF9ibCA9IFRSVUU7CisJCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkFERCwgTlVMTCwgTlVMTCwgRkFMU0UsIGFsdF9idWYpOworCSAgICB9CisjIGlmZGVmIEZFQVRfRVZBTAorCSAgICBpZiAoY3VyYnVmICE9IHdhc19jdXJidWYgfHwgYWJvcnRpbmcoKSkKKyMgZWxzZQorCSAgICBpZiAoY3VyYnVmICE9IHdhc19jdXJidWYpCisjIGVuZGlmCisJICAgIHsKKwkJLyogYnVmZmVyIGNoYW5nZWQsIGRvbid0IHdyaXRlIHRoZSBmaWxlICovCisJCXJldHZhbCA9IEZBSUw7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisjZW5kaWYKKwl9CisKKwlyZXR2YWwgPSBidWZfd3JpdGUoY3VyYnVmLCBmZm5hbWUsIGZuYW1lLCBlYXAtPmxpbmUxLCBlYXAtPmxpbmUyLAorCQkJCSBlYXAsIGVhcC0+YXBwZW5kLCBlYXAtPmZvcmNlaXQsIFRSVUUsIEZBTFNFKTsKKyAgICB9CisKK3RoZWVuZDoKKyNpZmRlZiBGRUFUX0JST1dTRQorICAgIHZpbV9mcmVlKGJyb3dzZV9maWxlKTsKKyNlbmRpZgorICAgIHZpbV9mcmVlKGZyZWVfZm5hbWUpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBDaGVjayBpZiBpdCBpcyBhbGxvd2VkIHRvIG92ZXJ3cml0ZSBhIGZpbGUuICBJZiBiX2ZsYWdzIGhhcyBCRl9OT1RFRElURUQsCisgKiBCRl9ORVcgb3IgQkZfUkVBREVSUiwgY2hlY2sgZm9yIG92ZXJ3cml0aW5nIGN1cnJlbnQgZmlsZS4KKyAqIE1heSBzZXQgZWFwLT5mb3JjZWl0IGlmIGEgZGlhbG9nIHNheXMgaXQncyBPSyB0byBvdmVyd3JpdGUuCisgKiBSZXR1cm4gT0sgaWYgaXQncyBPSywgRkFJTCBpZiBpdCBpcyBub3QuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX292ZXJ3cml0ZShlYXAsIGJ1ZiwgZm5hbWUsIGZmbmFtZSwgb3RoZXIpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSpmbmFtZTsJICAgIC8qIGZpbGUgbmFtZSB0byBiZSB1c2VkIChjYW4gZGlmZmVyIGZyb20KKwkJCSAgICAgICBidWYtPmZmbmFtZSkgKi8KKyAgICBjaGFyX3UJKmZmbmFtZTsgICAgLyogZnVsbCBwYXRoIHZlcnNpb24gb2YgZm5hbWUgKi8KKyAgICBpbnQJCW90aGVyOwkgICAgLyogd3JpdGluZyB1bmRlciBvdGhlciBuYW1lICovCit7CisgICAgLyoKKyAgICAgKiB3cml0ZSB0byBvdGhlciBmaWxlIG9yIGJfZmxhZ3Mgc2V0IG9yIG5vdCB3cml0aW5nIHRoZSB3aG9sZSBmaWxlOgorICAgICAqIG92ZXJ3cml0aW5nIG9ubHkgYWxsb3dlZCB3aXRoICchJworICAgICAqLworICAgIGlmICggICAgICAgKG90aGVyCisJCXx8IChidWYtPmJfZmxhZ3MgJiBCRl9OT1RFRElURUQpCisJCXx8ICgoYnVmLT5iX2ZsYWdzICYgQkZfTkVXKQorCQkgICAgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX09WRVJORVcpID09IE5VTEwpCisJCXx8IChidWYtPmJfZmxhZ3MgJiBCRl9SRUFERVJSKSkKKwkgICAgJiYgIWVhcC0+Zm9yY2VpdAorCSAgICAmJiAhZWFwLT5hcHBlbmQKKwkgICAgJiYgIXBfd2EKKwkgICAgJiYgdmltX2ZleGlzdHMoZmZuYW1lKSkKKyAgICB7CisjaWZkZWYgVU5JWAorCSAgICAvKiB3aXRoIFVOSVggaXQgaXMgcG9zc2libGUgdG8gb3BlbiBhIGRpcmVjdG9yeSAqLworCWlmIChtY2hfaXNkaXIoZmZuYW1lKSkKKwl7CisJICAgIEVNU0cyKF8oZV9pc2FkaXIyKSwgZmZuYW1lKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCWlmIChwX2NvbmZpcm0gfHwgY21kbW9kLmNvbmZpcm0pCisJeworCSAgICBjaGFyX3UJYnVmZltJT1NJWkVdOworCisJICAgIGRpYWxvZ19tc2coYnVmZiwgXygiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IiksIGZuYW1lKTsKKwkgICAgaWYgKHZpbV9kaWFsb2dfeWVzbm8oVklNX1FVRVNUSU9OLCBOVUxMLCBidWZmLCAyKSAhPSBWSU1fWUVTKQorCQlyZXR1cm4gRkFJTDsKKwkgICAgZWFwLT5mb3JjZWl0ID0gVFJVRTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBFTVNHKF8oZV9leGlzdHMpKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBIYW5kbGUgIjp3bmV4dCIsICI6d05leHQiIGFuZCAiOndwcmV2aW91cyIgY29tbWFuZHMuCisgKi8KKyAgICB2b2lkCitleF93bmV4dChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaTsKKworICAgIGlmIChlYXAtPmNtZFsxXSA9PSAnbicpCisJaSA9IGN1cndpbi0+d19hcmdfaWR4ICsgKGludCllYXAtPmxpbmUyOworICAgIGVsc2UKKwlpID0gY3Vyd2luLT53X2FyZ19pZHggLSAoaW50KWVhcC0+bGluZTI7CisgICAgZWFwLT5saW5lMSA9IDE7CisgICAgZWFwLT5saW5lMiA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIGlmIChkb193cml0ZShlYXApICE9IEZBSUwpCisJZG9fYXJnZmlsZShlYXAsIGkpOworfQorCisvKgorICogIjp3YWxsIiwgIjp3cWFsbCIgYW5kICI6eGFsbCI6IFdyaXRlIGFsbCBjaGFuZ2VkIGZpbGVzIChhbmQgZXhpdCkuCisgKi8KKyAgICB2b2lkCitkb193cWFsbChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQllcnJvciA9IDA7CisgICAgaW50CQlzYXZlX2ZvcmNlaXQgPSBlYXAtPmZvcmNlaXQ7CisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3hhbGwgfHwgZWFwLT5jbWRpZHggPT0gQ01EX3dxYWxsKQorCWV4aXRpbmcgPSBUUlVFOworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwlpZiAoYnVmSXNDaGFuZ2VkKGJ1ZikpCisJeworCSAgICAvKgorCSAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJlYXNvbiB0aGUgYnVmZmVyIGNhbm5vdCBiZSB3cml0dGVuOgorCSAgICAgKiAxLiBpZiB0aGUgJ3dyaXRlJyBvcHRpb24gaXMgc2V0CisJICAgICAqIDIuIGlmIHRoZXJlIGlzIG5vIGZpbGUgbmFtZSAoZXZlbiBhZnRlciBicm93c2luZykKKwkgICAgICogMy4gaWYgdGhlICdyZWFkb25seScgaXMgc2V0IChldmVuIGFmdGVyIGEgZGlhbG9nKQorCSAgICAgKiA0LiBpZiBvdmVyd3JpdGluZyBpcyBhbGxvd2VkIChldmVuIGFmdGVyIGEgZGlhbG9nKQorCSAgICAgKi8KKwkgICAgaWYgKG5vdF93cml0aW5nKCkpCisJICAgIHsKKwkJKytlcnJvcjsKKwkJYnJlYWs7CisJICAgIH0KKyNpZmRlZiBGRUFUX0JST1dTRQorCSAgICAvKiAiOmJyb3dzZSB3YWxsIjogYXNrIGZvciBmaWxlIG5hbWUgaWYgdGhlcmUgaXNuJ3Qgb25lICovCisJICAgIGlmIChidWYtPmJfZmZuYW1lID09IE5VTEwgJiYgY21kbW9kLmJyb3dzZSkKKwkJYnJvd3NlX3NhdmVfZm5hbWUoYnVmKTsKKyNlbmRpZgorCSAgICBpZiAoYnVmLT5iX2ZmbmFtZSA9PSBOVUxMKQorCSAgICB7CisJCUVNU0dOKF8oIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIpLCAobG9uZylidWYtPmJfZm51bSk7CisJCSsrZXJyb3I7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoY2hlY2tfcmVhZG9ubHkoJmVhcC0+Zm9yY2VpdCwgYnVmKQorCQkgICAgfHwgY2hlY2tfb3ZlcndyaXRlKGVhcCwgYnVmLCBidWYtPmJfZm5hbWUsIGJ1Zi0+Yl9mZm5hbWUsCisJCQkJCQkJICAgICAgIEZBTFNFKSA9PSBGQUlMKQorCSAgICB7CisJCSsrZXJyb3I7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChidWZfd3JpdGVfYWxsKGJ1ZiwgZWFwLT5mb3JjZWl0KSA9PSBGQUlMKQorCQkgICAgKytlcnJvcjsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJLyogYW4gYXV0b2NvbW1hbmQgbWF5IGhhdmUgZGVsZXRlZCB0aGUgYnVmZmVyICovCisJCWlmICghYnVmX3ZhbGlkKGJ1ZikpCisJCSAgICBidWYgPSBmaXJzdGJ1ZjsKKyNlbmRpZgorCSAgICB9CisJICAgIGVhcC0+Zm9yY2VpdCA9IHNhdmVfZm9yY2VpdDsgICAgLyogY2hlY2tfb3ZlcndyaXRlKCkgbWF5IHNldCBpdCAqLworCX0KKyAgICB9CisgICAgaWYgKGV4aXRpbmcpCisgICAgeworCWlmICghZXJyb3IpCisJICAgIGdldG91dCgwKTsJCS8qIGV4aXQgVmltICovCisJbm90X2V4aXRpbmcoKTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayB0aGUgJ3dyaXRlJyBvcHRpb24uCisgKiBSZXR1cm4gVFJVRSBhbmQgZ2l2ZSBhIG1lc3NhZ2Ugd2hlbiBpdCdzIG5vdCBzdC4KKyAqLworICAgIGludAorbm90X3dyaXRpbmcoKQoreworICAgIGlmIChwX3dyaXRlKQorCXJldHVybiBGQUxTRTsKKyAgICBFTVNHKF8oIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhIGJ1ZmZlciBpcyByZWFkLW9ubHkuICBBc2sgZm9yIG92ZXJydWxpbmcgaW4gYSBkaWFsb2cuCisgKiBSZXR1cm4gVFJVRSBhbmQgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIGJ1ZmZlciBpcyByZWFkb25seS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX3JlYWRvbmx5KGZvcmNlaXQsIGJ1ZikKKyAgICBpbnQJCSpmb3JjZWl0OworICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaWYgKCEqZm9yY2VpdCAmJiBidWYtPmJfcF9ybykKKyAgICB7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCWlmICgocF9jb25maXJtIHx8IGNtZG1vZC5jb25maXJtKSAmJiBidWYtPmJfZm5hbWUgIT0gTlVMTCkKKwl7CisJICAgIGNoYXJfdQlidWZmW0lPU0laRV07CisKKwkgICAgZGlhbG9nX21zZyhidWZmLCBfKCIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIpLAorCQkgICAgYnVmLT5iX2ZuYW1lKTsKKworCSAgICBpZiAodmltX2RpYWxvZ195ZXNubyhWSU1fUVVFU1RJT04sIE5VTEwsIGJ1ZmYsIDIpID09IFZJTV9ZRVMpCisJICAgIHsKKwkJLyogU2V0IGZvcmNlaXQsIHRvIGZvcmNlIHRoZSB3cml0aW5nIG9mIGEgcmVhZG9ubHkgZmlsZSAqLworCQkqZm9yY2VpdCA9IFRSVUU7CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICBlbHNlCisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgRU1TRyhfKGVfcmVhZG9ubHkpKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogdHJ5IHRvIGFiYW5kb24gY3VycmVudCBmaWxlIGFuZCBlZGl0IGEgbmV3IG9yIGV4aXN0aW5nIGZpbGUKKyAqICdmbnVtJyBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmaWxlLCBpZiB6ZXJvIHVzZSBmZm5hbWUvc2ZuYW1lCisgKgorICogcmV0dXJuIDEgZm9yICJub3JtYWwiIGVycm9yLCAyIGZvciAibm90IHdyaXR0ZW4iIGVycm9yLCAwIGZvciBzdWNjZXNzCisgKiAtMSBmb3Igc3VjY2VzZnVsbHkgb3BlbmluZyBhbm90aGVyIGZpbGUKKyAqICdsbnVtJyBpcyB0aGUgbGluZSBudW1iZXIgZm9yIHRoZSBjdXJzb3IgaW4gdGhlIG5ldyBmaWxlIChpZiBub24temVybykuCisgKi8KKyAgICBpbnQKK2dldGZpbGUoZm51bSwgZmZuYW1lLCBzZm5hbWUsIHNldHBtLCBsbnVtLCBmb3JjZWl0KQorICAgIGludAkJZm51bTsKKyAgICBjaGFyX3UJKmZmbmFtZTsKKyAgICBjaGFyX3UJKnNmbmFtZTsKKyAgICBpbnQJCXNldHBtOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlmb3JjZWl0OworeworICAgIGludAkJb3RoZXI7CisgICAgaW50CQlyZXR2YWw7CisgICAgY2hhcl91CSpmcmVlX21lID0gTlVMTDsKKworI2lmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDApCisJcmV0dXJuIDE7CisjZW5kaWYKKworICAgIGlmIChmbnVtID09IDApCisgICAgeworCQkJCQkvKiBtYWtlIGZmbmFtZSBmdWxsIHBhdGgsIHNldCBzZm5hbWUgKi8KKwlmbmFtZV9leHBhbmQoY3VyYnVmLCAmZmZuYW1lLCAmc2ZuYW1lKTsKKwlvdGhlciA9IG90aGVyZmlsZShmZm5hbWUpOworCWZyZWVfbWUgPSBmZm5hbWU7CQkvKiBoYXMgYmVlbiBhbGxvY2F0ZWQsIGZyZWUoKSBsYXRlciAqLworICAgIH0KKyAgICBlbHNlCisJb3RoZXIgPSAoZm51bSAhPSBjdXJidWYtPmJfZm51bSk7CisKKyAgICBpZiAob3RoZXIpCisJKytub193YWl0X3JldHVybjsJICAgIC8qIGRvbid0IHdhaXQgZm9yIGF1dG93cml0ZSBtZXNzYWdlICovCisgICAgaWYgKG90aGVyICYmICFmb3JjZWl0ICYmIGN1cmJ1Zi0+Yl9ud2luZG93cyA9PSAxICYmICFQX0hJRChjdXJidWYpCisJCSAgICYmIGN1cmJ1ZklzQ2hhbmdlZCgpICYmIGF1dG93cml0ZShjdXJidWYsIGZvcmNlaXQpID09IEZBSUwpCisgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwlpZiAocF9jb25maXJtICYmIHBfd3JpdGUpCisJICAgIGRpYWxvZ19jaGFuZ2VkKGN1cmJ1ZiwgRkFMU0UpOworCWlmIChjdXJidWZJc0NoYW5nZWQoKSkKKyNlbmRpZgorCXsKKwkgICAgaWYgKG90aGVyKQorCQktLW5vX3dhaXRfcmV0dXJuOworCSAgICBFTVNHKF8oZV9ub3dydG1zZykpOworCSAgICByZXR2YWwgPSAyOwkvKiBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgKi8KKwkgICAgZ290byB0aGVlbmQ7CisJfQorICAgIH0KKyAgICBpZiAob3RoZXIpCisJLS1ub193YWl0X3JldHVybjsKKyAgICBpZiAoc2V0cG0pCisJc2V0cGNtYXJrKCk7CisgICAgaWYgKCFvdGhlcikKKyAgICB7CisJaWYgKGxudW0gIT0gMCkKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwljaGVja19jdXJzb3JfbG51bSgpOworCWJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworCXJldHZhbCA9IDA7CS8qIGl0J3MgaW4gdGhlIHNhbWUgZmlsZSAqLworICAgIH0KKyAgICBlbHNlIGlmIChkb19lY21kKGZudW0sIGZmbmFtZSwgc2ZuYW1lLCBOVUxMLCBsbnVtLAorCQkoUF9ISUQoY3VyYnVmKSA/IEVDTURfSElERSA6IDApICsgKGZvcmNlaXQgPyBFQ01EX0ZPUkNFSVQgOiAwKSkgPT0gT0spCisJcmV0dmFsID0gLTE7CS8qIG9wZW5lZCBhbm90aGVyIGZpbGUgKi8KKyAgICBlbHNlCisJcmV0dmFsID0gMTsJLyogZXJyb3IgZW5jb3VudGVyZWQgKi8KKwordGhlZW5kOgorICAgIHZpbV9mcmVlKGZyZWVfbWUpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBzdGFydCBlZGl0aW5nIGEgbmV3IGZpbGUKKyAqCisgKiAgICAgZm51bTogZmlsZSBudW1iZXI7IGlmIHplcm8gdXNlIGZmbmFtZS9zZm5hbWUKKyAqICAgZmZuYW1lOiB0aGUgZmlsZSBuYW1lCisgKgkJLSBmdWxsIHBhdGggaWYgc2ZuYW1lIHVzZWQsCisgKgkJLSBhbnkgZmlsZSBuYW1lIGlmIHNmbmFtZSBpcyBOVUxMCisgKgkJLSBlbXB0eSBzdHJpbmcgdG8gcmUtZWRpdCB3aXRoIHRoZSBzYW1lIGZpbGUgbmFtZSAoYnV0IG1heSBiZQorICoJCSAgICBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnkpCisgKgkJLSBOVUxMIHRvIHN0YXJ0IGFuIGVtcHR5IGJ1ZmZlcgorICogICBzZm5hbWU6IHRoZSBzaG9ydCBmaWxlIG5hbWUgKG9yIE5VTEwpCisgKgllYXA6IGNvbnRhaW5zIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGxvYWRpbmcgdGhlIGZpbGUgYW5kCisgKgkgICAgIGZvcmNlZCAnZmYnIGFuZCAnZmVuYycKKyAqICBuZXdsbnVtOiBpZiA+IDA6IHB1dCBjdXJzb3Igb24gdGhpcyBsaW5lIG51bWJlciAoaWYgcG9zc2libGUpCisgKgkgICAgIGlmIEVDTURfTEFTVEw6IHVzZSBsYXN0IHBvc2l0aW9uIGluIGxvYWRlZCBmaWxlCisgKgkgICAgIGlmIEVDTURfTEFTVDogdXNlIGxhc3QgcG9zaXRpb24gaW4gYWxsIGZpbGVzCisgKgkgICAgIGlmIEVDTURfT05FOiB1c2UgZmlyc3QgbGluZQorICogICAgZmxhZ3M6CisgKgkgICBFQ01EX0hJREU6IGlmIFRSVUUgZG9uJ3QgZnJlZSB0aGUgY3VycmVudCBidWZmZXIKKyAqICAgICBFQ01EX1NFVF9IRUxQOiBzZXQgYl9oZWxwIGZsYWcgb2YgKG5ldykgYnVmZmVyIGJlZm9yZSBvcGVuaW5nIGZpbGUKKyAqCSBFQ01EX09MREJVRjogdXNlIGV4aXN0aW5nIGJ1ZmZlciBpZiBpdCBleGlzdHMKKyAqCUVDTURfRk9SQ0VJVDogISB1c2VkIGZvciBFeCBjb21tYW5kCisgKgkgRUNNRF9BRERCVUY6IGRvbid0IGVkaXQsIGp1c3QgYWRkIHRvIGJ1ZmZlciBsaXN0CisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50Citkb19lY21kKGZudW0sIGZmbmFtZSwgc2ZuYW1lLCBlYXAsIG5ld2xudW0sIGZsYWdzKQorICAgIGludAkJZm51bTsKKyAgICBjaGFyX3UJKmZmbmFtZTsKKyAgICBjaGFyX3UJKnNmbmFtZTsKKyAgICBleGFyZ19UCSplYXA7CQkJLyogY2FuIGJlIE5VTEwhICovCisgICAgbGluZW5yX1QJbmV3bG51bTsKKyAgICBpbnQJCWZsYWdzOworeworICAgIGludAkJb3RoZXJfZmlsZTsJCS8qIFRSVUUgaWYgZWRpdGluZyBhbm90aGVyIGZpbGUgKi8KKyAgICBpbnQJCW9sZGJ1ZjsJCQkvKiBUUlVFIGlmIHVzaW5nIGV4aXN0aW5nIGJ1ZmZlciAqLworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGludAkJYXV0b19idWYgPSBGQUxTRTsJLyogVFJVRSBpZiBhdXRvY29tbWFuZHMgYnJvdWdodCB1cworCQkJCQkgICBpbnRvIHRoZSBidWZmZXIgdW5leHBlY3RlZGx5ICovCisgICAgY2hhcl91CSpuZXdfbmFtZSA9IE5VTEw7CisjZW5kaWYKKyAgICBidWZfVAkqYnVmOworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisgICAgYnVmX1QJKm9sZF9jdXJidWYgPSBjdXJidWY7CisjZW5kaWYKKyAgICBjaGFyX3UJKmZyZWVfZm5hbWUgPSBOVUxMOworI2lmZGVmIEZFQVRfQlJPV1NFCisgICAgY2hhcl91CSpicm93c2VfZmlsZSA9IE5VTEw7CisjZW5kaWYKKyAgICBpbnQJCXJldHZhbCA9IEZBSUw7CisgICAgbG9uZwluOworICAgIGxpbmVucl9UCWxudW07CisgICAgbGluZW5yX1QJdG9wbGluZSA9IDA7CisgICAgaW50CQluZXdjb2wgPSAtMTsKKyAgICBpbnQJCXNvbGNvbCA9IC0xOworICAgIHBvc19UCSpwb3M7CisjaWZkZWYgRkVBVF9TVU5fV09SS1NIT1AKKyAgICBjaGFyX3UJKmNwOworI2VuZGlmCisgICAgY2hhcl91CSpjb21tYW5kID0gTlVMTDsKKworICAgIGlmIChlYXAgIT0gTlVMTCkKKwljb21tYW5kID0gZWFwLT5kb19lY21kX2NtZDsKKworICAgIGlmIChmbnVtICE9IDApCisgICAgeworCWlmIChmbnVtID09IGN1cmJ1Zi0+Yl9mbnVtKQkvKiBmaWxlIGlzIGFscmVhZHkgYmVpbmcgZWRpdGVkICovCisJICAgIHJldHVybiBPSzsJCQkvKiBub3RoaW5nIHRvIGRvICovCisJb3RoZXJfZmlsZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9CUk9XU0UKKwlpZiAoY21kbW9kLmJyb3dzZSkKKwl7CisJICAgIGJyb3dzZV9maWxlID0gZG9fYnJvd3NlKEZBTFNFLCAoY2hhcl91ICopXygiRWRpdCBGaWxlIiksIGZmbmFtZSwKKwkJCQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBjdXJidWYpOworCSAgICBpZiAoYnJvd3NlX2ZpbGUgPT0gTlVMTCkKKwkJZ290byB0aGVlbmQ7CisJICAgIGZmbmFtZSA9IGJyb3dzZV9maWxlOworCX0KKyNlbmRpZgorCS8qIGlmIG5vIHNob3J0IG5hbWUgZ2l2ZW4sIHVzZSBmZm5hbWUgZm9yIHNob3J0IG5hbWUgKi8KKwlpZiAoc2ZuYW1lID09IE5VTEwpCisJICAgIHNmbmFtZSA9IGZmbmFtZTsKKyNpZmRlZiBVU0VfRk5BTUVfQ0FTRQorIyBpZmRlZiBVU0VfTE9OR19GTkFNRQorCWlmIChVU0VfTE9OR19GTkFNRSkKKyMgZW5kaWYKKwkgICAgZm5hbWVfY2FzZShzZm5hbWUsIDApOyAgIC8qIHNldCBjb3JyZWN0IGNhc2UgZm9yIHNob3J0IGZpbGUgbmFtZSAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisJaWYgKChmbGFncyAmIEVDTURfQUREQlVGKSAmJiAoZmZuYW1lID09IE5VTEwgfHwgKmZmbmFtZSA9PSBOVUwpKQorCSAgICBnb3RvIHRoZWVuZDsKKyNlbmRpZgorCisJaWYgKGZmbmFtZSA9PSBOVUxMKQorCSAgICBvdGhlcl9maWxlID0gVFJVRTsKKwkJCQkJICAgIC8qIHRoZXJlIGlzIG5vIGZpbGUgbmFtZSAqLworCWVsc2UgaWYgKCpmZm5hbWUgPT0gTlVMICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCkKKwkgICAgb3RoZXJfZmlsZSA9IEZBTFNFOworCWVsc2UKKwl7CisJICAgIGlmICgqZmZuYW1lID09IE5VTCkJCSAgICAvKiByZS1lZGl0IHdpdGggc2FtZSBmaWxlIG5hbWUgKi8KKwkgICAgeworCQlmZm5hbWUgPSBjdXJidWYtPmJfZmZuYW1lOworCQlzZm5hbWUgPSBjdXJidWYtPmJfZm5hbWU7CisJICAgIH0KKwkgICAgZnJlZV9mbmFtZSA9IGZpeF9mbmFtZShmZm5hbWUpOyAvKiBtYXkgZXhwYW5kIHRvIGZ1bGwgcGF0aCBuYW1lICovCisJICAgIGlmIChmcmVlX2ZuYW1lICE9IE5VTEwpCisJCWZmbmFtZSA9IGZyZWVfZm5hbWU7CisJICAgIG90aGVyX2ZpbGUgPSBvdGhlcmZpbGUoZmZuYW1lKTsKKyNpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorCSAgICBpZiAodXNpbmdTdW5Xb3JrU2hvcCAmJiBwX2FjZAorCQkJCSAgICYmIChjcCA9IHZpbV9zdHJyY2hyKHNmbmFtZSwgJy8nKSkgIT0gTlVMTCkKKwkJc2ZuYW1lID0gKytjcDsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIGlmIHRoZSBmaWxlIHdhcyBjaGFuZ2VkIHdlIG1heSBub3QgYmUgYWxsb3dlZCB0byBhYmFuZG9uIGl0CisgICAgICogLSBpZiB3ZSBhcmUgZ29pbmcgdG8gcmUtZWRpdCB0aGUgc2FtZSBmaWxlCisgICAgICogLSBvciBpZiB3ZSBhcmUgdGhlIG9ubHkgd2luZG93IG9uIHRoaXMgZmlsZSBhbmQgaWYgRUNNRF9ISURFIGlzIEZBTFNFCisgICAgICovCisgICAgaWYgKCAgKCghb3RoZXJfZmlsZSAmJiAhKGZsYWdzICYgRUNNRF9PTERCVUYpKQorCSAgICB8fCAoY3VyYnVmLT5iX253aW5kb3dzID09IDEKKwkJJiYgIShmbGFncyAmIChFQ01EX0hJREUgfCBFQ01EX0FEREJVRikpKSkKKwkmJiBjaGVja19jaGFuZ2VkKGN1cmJ1ZiwgcF9hd2EsICFvdGhlcl9maWxlLAorCQkJCQkoZmxhZ3MgJiBFQ01EX0ZPUkNFSVQpLCBGQUxTRSkpCisgICAgeworCWlmIChmbnVtID09IDAgJiYgb3RoZXJfZmlsZSAmJiBmZm5hbWUgIT0gTlVMTCkKKwkgICAgKHZvaWQpc2V0YWx0Zm5hbWUoZmZuYW1lLCBzZm5hbWUsIG5ld2xudW0gPCAwID8gMCA6IG5ld2xudW0pOworCWdvdG8gdGhlZW5kOworICAgIH0KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiBFbmQgVmlzdWFsIG1vZGUgYmVmb3JlIHN3aXRjaGluZyB0byBhbm90aGVyIGJ1ZmZlciwgc28gdGhlIHRleHQgY2FuIGJlCisgICAgICogY29waWVkIGludG8gdGhlIEdVSSBzZWxlY3Rpb24gYnVmZmVyLgorICAgICAqLworICAgIHJlc2V0X1ZJc3VhbCgpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIElmIHdlIGFyZSBzdGFydGluZyB0byBlZGl0IGFub3RoZXIgZmlsZSwgb3BlbiBhIChuZXcpIGJ1ZmZlci4KKyAgICAgKiBPdGhlcndpc2Ugd2UgcmUtdXNlIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpZiAob3RoZXJfZmlsZSkKKyAgICB7CisjaWZkZWYgRkVBVF9MSVNUQ01EUworCWlmICghKGZsYWdzICYgRUNNRF9BRERCVUYpKQorI2VuZGlmCisJeworCSAgICBjdXJ3aW4tPndfYWx0X2ZudW0gPSBjdXJidWYtPmJfZm51bTsKKwkgICAgYnVmbGlzdF9hbHRmcG9zKCk7CisJfQorCisJaWYgKGZudW0pCisJICAgIGJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKGZudW0pOworCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9MSVNUQ01EUworCSAgICBpZiAoZmxhZ3MgJiBFQ01EX0FEREJVRikKKwkgICAgeworCQlsaW5lbnJfVAl0bG51bSA9IDFMOworCisJCWlmIChjb21tYW5kICE9IE5VTEwpCisJCXsKKwkJICAgIHRsbnVtID0gYXRvbCgoY2hhciAqKWNvbW1hbmQpOworCQkgICAgaWYgKHRsbnVtIDw9IDApCisJCQl0bG51bSA9IDFMOworCQl9CisJCSh2b2lkKWJ1Zmxpc3RfbmV3KGZmbmFtZSwgc2ZuYW1lLCB0bG51bSwgQkxOX0xJU1RFRCk7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisjZW5kaWYKKwkgICAgYnVmID0gYnVmbGlzdF9uZXcoZmZuYW1lLCBzZm5hbWUsIDBMLAorCQkgICAgQkxOX0NVUkJVRiB8ICgoZmxhZ3MgJiBFQ01EX1NFVF9IRUxQKSA/IDAgOiBCTE5fTElTVEVEKSk7CisJfQorCWlmIChidWYgPT0gTlVMTCkKKwkgICAgZ290byB0aGVlbmQ7CisJaWYgKGJ1Zi0+Yl9tbC5tbF9tZnAgPT0gTlVMTCkJCS8qIG5vIG1lbWZpbGUgeWV0ICovCisJeworCSAgICBvbGRidWYgPSBGQUxTRTsKKwkgICAgYnVmLT5iX253aW5kb3dzID0gMDsKKwl9CisJZWxzZQkJCQkJLyogZXhpc3RpbmcgbWVtZmlsZSAqLworCXsKKwkgICAgb2xkYnVmID0gVFJVRTsKKwkgICAgKHZvaWQpYnVmX2NoZWNrX3RpbWVzdGFtcChidWYsIEZBTFNFKTsKKwkgICAgLyogQ2hlY2sgaWYgYXV0b2NvbW1hbmRzIG1hZGUgYnVmZmVyIGludmFsaWQgb3IgY2hhbmdlZCB0aGUgY3VycmVudAorCSAgICAgKiBidWZmZXIuICovCisJICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJICAgIHx8IGN1cmJ1ZiAhPSBvbGRfY3VyYnVmCisjZW5kaWYKKwkJICAgICkKKwkJZ290byB0aGVlbmQ7CisjaWZkZWYgRkVBVF9FVkFMCisJICAgIGlmIChhYm9ydGluZygpKQkgICAgLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJCWdvdG8gdGhlZW5kOworI2VuZGlmCisJfQorCisJLyogTWF5IGp1bXAgdG8gbGFzdCB1c2VkIGxpbmUgbnVtYmVyIGZvciBhIGxvYWRlZCBidWZmZXIgb3Igd2hlbiBhc2tlZAorCSAqIGZvciBleHBsaWNpdGx5ICovCisJaWYgKChvbGRidWYgJiYgbmV3bG51bSA9PSBFQ01EX0xBU1RMKSB8fCBuZXdsbnVtID09IEVDTURfTEFTVCkKKwl7CisJICAgIHBvcyA9IGJ1Zmxpc3RfZmluZGZwb3MoYnVmKTsKKwkgICAgbmV3bG51bSA9IHBvcy0+bG51bTsKKwkgICAgc29sY29sID0gcG9zLT5jb2w7CisJfQorCisJLyoKKwkgKiBNYWtlIHRoZSAobmV3KSBidWZmZXIgdGhlIG9uZSB1c2VkIGJ5IHRoZSBjdXJyZW50IHdpbmRvdy4KKwkgKiBJZiB0aGUgb2xkIGJ1ZmZlciBiZWNvbWVzIHVudXNlZCwgZnJlZSBpdCBpZiBFQ01EX0hJREUgaXMgRkFMU0UuCisJICogSWYgdGhlIGN1cnJlbnQgYnVmZmVyIHdhcyBlbXB0eSBhbmQgaGFzIG5vIGZpbGUgbmFtZSwgY3VyYnVmCisJICogaXMgcmV0dXJuZWQgYnkgYnVmbGlzdF9uZXcoKS4KKwkgKi8KKwlpZiAoYnVmICE9IGN1cmJ1ZikKKwl7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIC8qCisJICAgICAqIEJlIGNhcmVmdWw6IFRoZSBhdXRvY29tbWFuZHMgbWF5IGRlbGV0ZSBhbnkgYnVmZmVyIGFuZCBjaGFuZ2UKKwkgICAgICogdGhlIGN1cnJlbnQgYnVmZmVyLgorCSAgICAgKiAtIElmIHRoZSBidWZmZXIgd2UgYXJlIGdvaW5nIHRvIGVkaXQgaXMgZGVsZXRlZCwgZ2l2ZSB1cC4KKwkgICAgICogLSBJZiB0aGUgY3VycmVudCBidWZmZXIgaXMgZGVsZXRlZCwgcHJlZmVyIHRvIGxvYWQgdGhlIG5ldworCSAgICAgKiAgIGJ1ZmZlciB3aGVuIGxvYWRpbmcgYSBidWZmZXIgaXMgcmVxdWlyZWQuICBUaGlzIGF2b2lkcworCSAgICAgKiAgIGxvYWRpbmcgYW5vdGhlciBidWZmZXIgd2hpY2ggdGhlbiBtdXN0IGJlIGNsb3NlZCBhZ2Fpbi4KKwkgICAgICogLSBJZiB3ZSBlbmRlZCB1cCBpbiB0aGUgbmV3IGJ1ZmZlciBhbHJlYWR5LCBuZWVkIHRvIHNraXAgYSBmZXcKKwkgICAgICoJIHRoaW5ncywgc2V0IGF1dG9fYnVmLgorCSAgICAgKi8KKwkgICAgaWYgKGJ1Zi0+Yl9mbmFtZSAhPSBOVUxMKQorCQluZXdfbmFtZSA9IHZpbV9zdHJzYXZlKGJ1Zi0+Yl9mbmFtZSk7CisJICAgIGF1X25ld19jdXJidWYgPSBidWY7CisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkxFQVZFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwkgICAgaWYgKCFidWZfdmFsaWQoYnVmKSkJLyogbmV3IGJ1ZmZlciBoYXMgYmVlbiBkZWxldGVkICovCisJICAgIHsKKwkJZGVsYnVmX21zZyhuZXdfbmFtZSk7CS8qIGZyZWVzIG5ld19uYW1lICovCisJCWdvdG8gdGhlZW5kOworCSAgICB9CisjIGlmZGVmIEZFQVRfRVZBTAorCSAgICBpZiAoYWJvcnRpbmcoKSkJICAgIC8qIGF1dG9jbWRzIG1heSBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZyAqLworCSAgICB7CisJCXZpbV9mcmVlKG5ld19uYW1lKTsKKwkJZ290byB0aGVlbmQ7CisJICAgIH0KKyMgZW5kaWYKKwkgICAgaWYgKGJ1ZiA9PSBjdXJidWYpCQkvKiBhbHJlYWR5IGluIG5ldyBidWZmZXIgKi8KKwkJYXV0b19idWYgPSBUUlVFOworCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKGN1cmJ1ZiA9PSBvbGRfY3VyYnVmKQorI2VuZGlmCisJCSAgICBidWZfY29weV9vcHRpb25zKGJ1ZiwgQkNPX0VOVEVSKTsKKworCQkvKiBjbG9zZSB0aGUgbGluayB0byB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJY2xvc2VfYnVmZmVyKGN1cndpbiwgY3VyYnVmLAorCQkJCSAgICAgIChmbGFncyAmIEVDTURfSElERSkgPyAwIDogRE9CVUZfVU5MT0FEKTsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorIyBpZmRlZiBGRUFUX0VWQUwKKwkJaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkJeworCQkgICAgdmltX2ZyZWUobmV3X25hbWUpOworCQkgICAgZ290byB0aGVlbmQ7CisJCX0KKyMgZW5kaWYKKwkJLyogQmUgY2FyZWZ1bCBhZ2FpbiwgbGlrZSBhYm92ZS4gKi8KKwkJaWYgKCFidWZfdmFsaWQoYnVmKSkJLyogbmV3IGJ1ZmZlciBoYXMgYmVlbiBkZWxldGVkICovCisJCXsKKwkJICAgIGRlbGJ1Zl9tc2cobmV3X25hbWUpOwkvKiBmcmVlcyBuZXdfbmFtZSAqLworCQkgICAgZ290byB0aGVlbmQ7CisJCX0KKwkJaWYgKGJ1ZiA9PSBjdXJidWYpCQkvKiBhbHJlYWR5IGluIG5ldyBidWZmZXIgKi8KKwkJICAgIGF1dG9fYnVmID0gVFJVRTsKKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgIGN1cndpbi0+d19idWZmZXIgPSBidWY7CisJCSAgICBjdXJidWYgPSBidWY7CisJCSAgICArK2N1cmJ1Zi0+Yl9ud2luZG93czsKKwkJICAgIC8qIHNldCAnZmlsZWZvcm1hdCcgKi8KKwkJICAgIGlmICgqcF9mZnMgJiYgIW9sZGJ1ZikKKwkJCXNldF9maWxlZm9ybWF0KGRlZmF1bHRfZmlsZWZvcm1hdCgpLCBPUFRfTE9DQUwpOworCQl9CisKKwkJLyogTWF5IGdldCB0aGUgd2luZG93IG9wdGlvbnMgZnJvbSB0aGUgbGFzdCB0aW1lIHRoaXMgYnVmZmVyCisJCSAqIHdhcyBpbiB0aGlzIHdpbmRvdyAob3IgYW5vdGhlciB3aW5kb3cpLiAgSWYgbm90IHVzZWQKKwkJICogYmVmb3JlLCByZXNldCB0aGUgbG9jYWwgd2luZG93IG9wdGlvbnMgdG8gdGhlIGdsb2JhbAorCQkgKiB2YWx1ZXMuICBBbHNvIHJlc3RvcmVzIG9sZCBmb2xkaW5nIHN0dWZmLiAqLworCQlnZXRfd2lub3B0cyhidWYpOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIH0KKwkgICAgdmltX2ZyZWUobmV3X25hbWUpOworCSAgICBhdV9uZXdfY3VyYnVmID0gTlVMTDsKKyNlbmRpZgorCX0KKwllbHNlCisJICAgICsrY3VyYnVmLT5iX253aW5kb3dzOworCisJY3Vyd2luLT53X3BjbWFyay5sbnVtID0gMTsKKwljdXJ3aW4tPndfcGNtYXJrLmNvbCA9IDA7CisgICAgfQorICAgIGVsc2UgLyogIW90aGVyX2ZpbGUgKi8KKyAgICB7CisJaWYgKAorI2lmZGVmIEZFQVRfTElTVENNRFMKKwkJKGZsYWdzICYgRUNNRF9BRERCVUYpIHx8CisjZW5kaWYKKwkJY2hlY2tfZm5hbWUoKSA9PSBGQUlMKQorCSAgICBnb3RvIHRoZWVuZDsKKwlvbGRidWYgPSAoZmxhZ3MgJiBFQ01EX09MREJVRik7CisgICAgfQorCisgICAgaWYgKChmbGFncyAmIEVDTURfU0VUX0hFTFApIHx8IGtlZXBfaGVscF9mbGFnKQorICAgIHsKKwljaGFyX3UJKnA7CisKKwljdXJidWYtPmJfaGVscCA9IFRSVUU7CisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImJ1ZnR5cGUiLCAtMSwKKwkJCQkgICAgICAgKGNoYXJfdSAqKSJoZWxwIiwgT1BUX0ZSRUV8T1BUX0xPQ0FMKTsKKyNlbmRpZgorCisJLyoKKwkgKiBBbHdheXMgc2V0IHRoZXNlIG9wdGlvbnMgYWZ0ZXIganVtcGluZyB0byBhIGhlbHAgdGFnLCBiZWNhdXNlIHRoZQorCSAqIHVzZXIgbWF5IGhhdmUgYW4gYXV0b2NvbW1hbmQgdGhhdCBnZXRzIGluIHRoZSB3YXkuCisJICogQWNjZXB0IGFsbCBBU0NJSSBjaGFycyBmb3Iga2V5d29yZHMsIGV4Y2VwdCAnICcsICcqJywgJyInLCAnfCcsIGFuZAorCSAqIGxhdGluMSB3b3JkIGNoYXJhY3RlcnMgKGZvciB0cmFuc2xhdGVkIGhlbHAgZmlsZXMpLgorCSAqIE9ubHkgc2V0IGl0IHdoZW4gbmVlZGVkLCBidWZfaW5pdF9jaGFydGFiKCkgaXMgc29tZSB3b3JrLgorCSAqLworCXAgPQorI2lmZGVmIEVCQ0RJQworCQkoY2hhcl91ICopIjY1LTI1NSxeKixefCxeXCIiOworI2Vsc2UKKwkJKGNoYXJfdSAqKSIhLX4sXiosXnwsXlwiLDE5Mi0yNTUiOworI2VuZGlmCisJaWYgKFNUUkNNUChjdXJidWYtPmJfcF9pc2ssIHApICE9IDApCisJeworCSAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJpc2siLCAtMSwgcCwKKwkJCQkJCQkgIE9QVF9GUkVFfE9QVF9MT0NBTCk7CisJICAgIGNoZWNrX2J1Zl9vcHRpb25zKGN1cmJ1Zik7CisJICAgICh2b2lkKWJ1Zl9pbml0X2NoYXJ0YWIoY3VyYnVmLCBGQUxTRSk7CisJfQorCisJY3VyYnVmLT5iX3BfdHMgPSA4OwkJLyogJ3RhYnN0b3AnIGlzIDggKi8KKwljdXJ3aW4tPndfcF9saXN0ID0gRkFMU0U7CS8qIG5vIGxpc3QgbW9kZSAqLworCisJY3VyYnVmLT5iX3BfbWEgPSBGQUxTRTsJCS8qIG5vdCBtb2RpZmlhYmxlICovCisJY3VyYnVmLT5iX3BfYmluID0gRkFMU0U7CS8qIHJlc2V0ICdiaW4nIGJlZm9yZSByZWFkaW5nIGZpbGUgKi8KKwljdXJ3aW4tPndfcF9udSA9IDA7CQkvKiBubyBsaW5lIG51bWJlcnMgKi8KKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwljdXJ3aW4tPndfcF9zY2IgPSBGQUxTRTsJLyogbm8gc2Nyb2xsIGJpbmRpbmcgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfQVJBQklDCisJY3Vyd2luLT53X3BfYXJhYiA9IEZBTFNFOwkvKiBubyBhcmFiaWMgbW9kZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwljdXJ3aW4tPndfcF9ybCAgPSBGQUxTRTsJLyogaGVscCB3aW5kb3cgaXMgbGVmdC10by1yaWdodCAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJY3Vyd2luLT53X3BfZmVuID0gRkFMU0U7CS8qIE5vIGZvbGRpbmcgaW4gdGhlIGhlbHAgd2luZG93ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJRkYKKwljdXJ3aW4tPndfcF9kaWZmID0gRkFMU0U7CS8qIE5vICdkaWZmJyAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlidWYgPSBjdXJidWY7CisjZW5kaWYKKwlzZXRfYnVmbGlzdGVkKEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlidWYgPSBjdXJidWY7CisjZW5kaWYKKwkvKiBEb24ndCBtYWtlIGEgYnVmZmVyIGxpc3RlZCBpZiBpdCdzIGEgaGVscCBidWZmZXIuICBVc2VmdWwgd2hlbgorCSAqIHVzaW5nIENUUkwtTyB0byBnbyBiYWNrIHRvIGEgaGVscCBmaWxlLiAqLworCWlmICghY3VyYnVmLT5iX2hlbHApCisJICAgIHNldF9idWZsaXN0ZWQoVFJVRSk7CisgICAgfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogSWYgYXV0b2NvbW1hbmRzIGNoYW5nZSBidWZmZXJzIHVuZGVyIG91ciBmaW5nZXJzLCBmb3JnZXQgYWJvdXQKKyAgICAgKiBlZGl0aW5nIHRoZSBmaWxlLiAqLworICAgIGlmIChidWYgIT0gY3VyYnVmKQorCWdvdG8gdGhlZW5kOworIyBpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoYWJvcnRpbmcoKSkJICAgIC8qIGF1dG9jbWRzIG1heSBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZyAqLworCWdvdG8gdGhlZW5kOworIyBlbmRpZgorCisgICAgLyogU2luY2Ugd2UgYXJlIHN0YXJ0aW5nIHRvIGVkaXQgYSBmaWxlLCBjb25zaWRlciB0aGUgZmlsZXR5cGUgdG8gYmUKKyAgICAgKiB1bnNldC4gIEhlbHBzIGZvciB3aGVuIGFuIGF1dG9jb21tYW5kIGNoYW5nZXMgZmlsZXMgYW5kIGV4cGVjdHMgc3ludGF4CisgICAgICogaGlnaGxpZ2h0aW5nIHRvIHdvcmsgaW4gdGhlIG90aGVyIGZpbGUuICovCisgICAgZGlkX2ZpbGV0eXBlID0gRkFMU0U7CisjZW5kaWYKKworLyoKKyAqIG90aGVyX2ZpbGUJb2xkYnVmCisgKiAgRkFMU0UJRkFMU0UJICAgIHJlLWVkaXQgc2FtZSBmaWxlLCBidWZmZXIgaXMgcmUtdXNlZAorICogIEZBTFNFCVRSVUUJICAgIHJlLWVkaXQgc2FtZSBmaWxlLCBub3RoaW5nIGNoYW5nZXMKKyAqICBUUlVFCUZBTFNFCSAgICBzdGFydCBlZGl0aW5nIG5ldyBmaWxlLCBuZXcgYnVmZmVyCisgKiAgVFJVRQlUUlVFCSAgICBzdGFydCBlZGl0aW5nIGluIGV4aXN0aW5nIGJ1ZmZlciAobm90aGluZyB0byBkbykKKyAqLworICAgIGlmICghb3RoZXJfZmlsZSAmJiAhb2xkYnVmKQkJLyogcmUtdXNlIHRoZSBidWZmZXIgKi8KKyAgICB7CisJc2V0X2xhc3RfY3Vyc29yKGN1cndpbik7CS8qIG1heSBzZXQgYl9sYXN0X2N1cnNvciAqLworCWlmIChuZXdsbnVtID09IEVDTURfTEFTVCB8fCBuZXdsbnVtID09IEVDTURfTEFTVEwpCisJeworCSAgICBuZXdsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCSAgICBzb2xjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwl9CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJYnVmID0gY3VyYnVmOworCWlmIChidWYtPmJfZm5hbWUgIT0gTlVMTCkKKwkgICAgbmV3X25hbWUgPSB2aW1fc3Ryc2F2ZShidWYtPmJfZm5hbWUpOworCWVsc2UKKwkgICAgbmV3X25hbWUgPSBOVUxMOworI2VuZGlmCisJYnVmX2ZyZWVhbGwoY3VyYnVmLCBGQUxTRSwgRkFMU0UpOyAgIC8qIGZyZWUgYWxsIHRoaW5ncyBmb3IgYnVmZmVyICovCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJLyogSWYgYXV0b2NvbW1hbmRzIGRlbGV0ZWQgdGhlIGJ1ZmZlciB3ZSB3ZXJlIGdvaW5nIHRvIHJlLWVkaXQsIGdpdmUKKwkgKiB1cCBhbmQganVtcCB0byB0aGUgZW5kLiAqLworCWlmICghYnVmX3ZhbGlkKGJ1ZikpCisJeworCSAgICBkZWxidWZfbXNnKG5ld19uYW1lKTsJLyogZnJlZXMgbmV3X25hbWUgKi8KKwkgICAgZ290byB0aGVlbmQ7CisJfQorCXZpbV9mcmVlKG5ld19uYW1lKTsKKworCS8qIElmIGF1dG9jb21tYW5kcyBjaGFuZ2UgYnVmZmVycyB1bmRlciBvdXIgZmluZ2VycywgZm9yZ2V0IGFib3V0CisJICogcmUtZWRpdGluZyB0aGUgZmlsZS4gIFNob3VsZCBkbyB0aGUgYnVmX2NsZWFyX2ZpbGUoKSwgYnV0IHBlcmhhcHMKKwkgKiB0aGUgYXV0b2NvbW1hbmRzIGNoYW5nZWQgdGhlIGJ1ZmZlci4uLiAqLworCWlmIChidWYgIT0gY3VyYnVmKQorCSAgICBnb3RvIHRoZWVuZDsKKyMgaWZkZWYgRkVBVF9FVkFMCisJaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkgICAgZ290byB0aGVlbmQ7CisjIGVuZGlmCisjZW5kaWYKKwlidWZfY2xlYXJfZmlsZShjdXJidWYpOworCWN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gMDsJLyogY2xlYXIgJ1sgYW5kICddIG1hcmtzICovCisJY3VyYnVmLT5iX29wX2VuZC5sbnVtID0gMDsKKyAgICB9CisKKy8qCisgKiBJZiB3ZSBnZXQgaGVyZSB3ZSBhcmUgc3VyZSB0byBzdGFydCBlZGl0aW5nCisgKi8KKyAgICAvKiBkb24ndCByZWRyYXcgdW50aWwgdGhlIGN1cnNvciBpcyBpbiB0aGUgcmlnaHQgbGluZSAqLworICAgICsrUmVkcmF3aW5nRGlzYWJsZWQ7CisKKyAgICAvKiBBc3N1bWUgc3VjY2VzcyBub3cgKi8KKyAgICByZXR2YWwgPSBPSzsKKworICAgIC8qCisgICAgICogUmVzZXQgY3Vyc29yIHBvc2l0aW9uLCBjb3VsZCBiZSB1c2VkIGJ5IGF1dG9jb21tYW5kcy4KKyAgICAgKi8KKyAgICBjaGVja19jdXJzb3IoKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgd2UgYXJlIGVkaXRpbmcgdGhlIHdfYXJnX2lkeCBmaWxlIGluIHRoZSBhcmd1bWVudCBsaXN0LgorICAgICAqLworICAgIGNoZWNrX2FyZ19pZHgoY3Vyd2luKTsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGlmICghYXV0b19idWYpCisjZW5kaWYKKyAgICB7CisJLyoKKwkgKiBTZXQgY3Vyc29yIGFuZCBpbml0IHdpbmRvdyBiZWZvcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgZXhlY3V0aW5nCisJICogYXV0b2NvbW1hbmRzLiAgVGhpcyBhbGxvd3MgZm9yIHRoZSBhdXRvY29tbWFuZHMgdG8gcG9zaXRpb24gdGhlCisJICogY3Vyc29yLgorCSAqLworCXdpbl9pbml0KGN1cndpbik7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkvKiBJdCdzIGxpa2UgYWxsIGxpbmVzIGluIHRoZSBidWZmZXIgY2hhbmdlZC4gIE5lZWQgdG8gdXBkYXRlCisJICogYXV0b21hdGljIGZvbGRpbmcuICovCisJZm9sZFVwZGF0ZUFsbChjdXJ3aW4pOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSB8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykKKwlpZiAocF9hY2QgJiYgY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMCisJCQkJICAgICAmJiB2aW1fY2hkaXJmaWxlKGN1cmJ1Zi0+Yl9mZm5hbWUpID09IE9LKQorCSAgICBzaG9ydGVuX2ZuYW1lcyhUUlVFKTsKKyNlbmRpZgorCS8qCisJICogQ2FyZWZ1bDogb3Blbl9idWZmZXIoKSBhbmQgYXBwbHlfYXV0b2NtZHMoKSBtYXkgY2hhbmdlIHRoZSBjdXJyZW50CisJICogYnVmZmVyIGFuZCB3aW5kb3cuCisJICovCisJbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwl0b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisJaWYgKCFvbGRidWYpCQkJICAgIC8qIG5lZWQgdG8gcmVhZCB0aGUgZmlsZSAqLworCXsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJICAgIHN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9ESUFMT0c7CisjZW5kaWYKKwkgICAgY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX0NIRUNLX1JPOyAvKiBzZXQvcmVzZXQgJ3JvJyBmbGFnICovCisKKwkgICAgLyoKKwkgICAgICogT3BlbiB0aGUgYnVmZmVyIGFuZCByZWFkIHRoZSBmaWxlLgorCSAgICAgKi8KKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJICAgIGlmIChzaG91bGRfYWJvcnQob3Blbl9idWZmZXIoRkFMU0UsIGVhcCkpKQorCQlyZXR2YWwgPSBGQUlMOworI2Vsc2UKKwkgICAgKHZvaWQpb3Blbl9idWZmZXIoRkFMU0UsIGVhcCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwkgICAgaWYgKHN3YXBfZXhpc3RzX2FjdGlvbiA9PSBTRUFfUVVJVCkKKwkJcmV0dmFsID0gRkFJTDsKKwkgICAgaGFuZGxlX3N3YXBfZXhpc3RzKG9sZF9jdXJidWYpOworI2VuZGlmCisJfQorI2lmZGVmIEZFQVRfQVVUT0NNRAorCWVsc2UKKwl7CisJICAgIGFwcGx5X2F1dG9jbWRzX3JldHZhbChFVkVOVF9CVUZFTlRFUiwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1ZiwKKwkJCQkJCQkJICAgICZyZXR2YWwpOworCSAgICBhcHBseV9hdXRvY21kc19yZXR2YWwoRVZFTlRfQlVGV0lORU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYsCisJCQkJCQkJCSAgICAmcmV0dmFsKTsKKwl9CisJY2hlY2tfYXJnX2lkeChjdXJ3aW4pOworI2VuZGlmCisKKwkvKgorCSAqIElmIGF1dG9jb21tYW5kcyBjaGFuZ2UgdGhlIGN1cnNvciBwb3NpdGlvbiBvciB0b3BsaW5lLCB3ZSBzaG91bGQKKwkgKiBrZWVwIGl0LgorCSAqLworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gbG51bSkKKwl7CisJICAgIG5ld2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJICAgIG5ld2NvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCX0KKwlpZiAoY3Vyd2luLT53X3RvcGxpbmUgPT0gdG9wbGluZSkKKwkgICAgdG9wbGluZSA9IDA7CisKKwkvKiBFdmVuIHdoZW4gY3Vyc29yIGRpZG4ndCBtb3ZlIHdlIG5lZWQgdG8gcmVjb21wdXRlIHRvcGxpbmUuICovCisJY2hhbmdlZF9saW5lX2Fidl9jdXJzKCk7CisKKyNpZmRlZiBGRUFUX1RJVExFCisJbWFrZXRpdGxlKCk7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKiBUZWxsIHRoZSBkaWZmIHN0dWZmIHRoYXQgdGhpcyBidWZmZXIgaXMgbmV3IGFuZC9vciBuZWVkcyB1cGRhdGluZy4KKyAgICAgKiBBbHNvIG5lZWRlZCB3aGVuIHJlLWVkaXRpbmcgdGhlIHNhbWUgYnVmZmVyLCBiZWNhdXNlIHVubG9hZGluZyB3aWxsCisgICAgICogaGF2ZSByZW1vdmVkIGl0IGFzIGEgZGlmZiBidWZmZXIuICovCisgICAgZGlmZl9uZXdfYnVmZmVyKCk7CisgICAgZGlmZl9pbnZhbGlkYXRlKCk7CisjZW5kaWYKKworICAgIGlmIChjb21tYW5kID09IE5VTEwpCisgICAgeworCWlmIChuZXdjb2wgPj0gMCkJLyogcG9zaXRpb24gc2V0IGJ5IGF1dG9jb21tYW5kcyAqLworCXsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbmV3bG51bTsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBuZXdjb2w7CisJICAgIGNoZWNrX2N1cnNvcigpOworCX0KKwllbHNlIGlmIChuZXdsbnVtID4gMCkJLyogbGluZSBudW1iZXIgZnJvbSBjYWxsZXIgb3Igb2xkIHBvc2l0aW9uICovCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBuZXdsbnVtOworCSAgICBjaGVja19jdXJzb3JfbG51bSgpOworCSAgICBpZiAoc29sY29sID49IDAgJiYgIXBfc29sKQorCSAgICB7CisJCS8qICdzb2wnIGlzIG9mZjogVXNlIGxhc3Qga25vd24gY29sdW1uLiAqLworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHNvbGNvbDsKKwkJY2hlY2tfY3Vyc29yX2NvbCgpOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisJCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UKKwkJYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7CisJfQorCWVsc2UJCQkvKiBubyBsaW5lIG51bWJlciwgZ28gdG8gbGFzdCBsaW5lIGluIEV4IG1vZGUgKi8KKwl7CisJICAgIGlmIChleG1vZGVfYWN0aXZlKQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgLyogQ2hlY2sgaWYgY3Vyc29ycyBpbiBvdGhlciB3aW5kb3dzIG9uIHRoZSBzYW1lIGJ1ZmZlciBhcmUgc3RpbGwgdmFsaWQgKi8KKyAgICBjaGVja19sbnVtcyhGQUxTRSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogRGlkIG5vdCByZWFkIHRoZSBmaWxlLCBuZWVkIHRvIHNob3cgc29tZSBpbmZvIGFib3V0IHRoZSBmaWxlLgorICAgICAqIERvIHRoaXMgYWZ0ZXIgc2V0dGluZyB0aGUgY3Vyc29yLgorICAgICAqLworICAgIGlmIChvbGRidWYKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJJiYgIWF1dG9fYnVmCisjZW5kaWYKKwkJCSAgICApCisgICAgeworCWludAltc2dfc2Nyb2xsX3NhdmUgPSBtc2dfc2Nyb2xsOworCisJLyogT2JleSB0aGUgJ08nIGZsYWcgaW4gJ2Nwb3B0aW9ucyc6IG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgZmlsZQorCSAqIG1lc3NhZ2UuICovCisJaWYgKHNob3J0bWVzcyhTSE1fT1ZFUkFMTCkgJiYgIWV4aXRpbmcgJiYgcF92ZXJib3NlID09IDApCisJICAgIG1zZ19zY3JvbGwgPSBGQUxTRTsKKwlpZiAoIW1zZ19zY3JvbGwpCS8qIHdhaXQgYSBiaXQgd2hlbiBvdmVyd3JpdGluZyBhbiBlcnJvciBtc2cgKi8KKwkgICAgY2hlY2tfZm9yX2RlbGF5KEZBTFNFKTsKKwltc2dfc3RhcnQoKTsKKwltc2dfc2Nyb2xsID0gbXNnX3Njcm9sbF9zYXZlOworCW1zZ19zY3JvbGxlZF9pZ24gPSBUUlVFOworCisJZmlsZWluZm8oRkFMU0UsIFRSVUUsIEZBTFNFKTsKKworCW1zZ19zY3JvbGxlZF9pZ24gPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoY29tbWFuZCAhPSBOVUxMKQorCWRvX2NtZGxpbmUoY29tbWFuZCwgTlVMTCwgTlVMTCwgRE9DTURfVkVSQk9TRSk7CisKKyNpZmRlZiBGRUFUX0tFWU1BUAorICAgIGlmIChjdXJidWYtPmJfa21hcF9zdGF0ZSAmIEtFWU1BUF9JTklUKQorCWtleW1hcF9pbml0KCk7CisjZW5kaWYKKworICAgIC0tUmVkcmF3aW5nRGlzYWJsZWQ7CisgICAgaWYgKCFza2lwX3JlZHJhdykKKyAgICB7CisJbiA9IHBfc287CisJaWYgKHRvcGxpbmUgPT0gMCAmJiBjb21tYW5kID09IE5VTEwpCisJICAgIHBfc28gPSA5OTk7CQkJLyogZm9yY2UgY3Vyc29yIGhhbGZ3YXkgdGhlIHdpbmRvdyAqLworCXVwZGF0ZV90b3BsaW5lKCk7CisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJY3Vyd2luLT53X3NjYmluZF9wb3MgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyNlbmRpZgorCXBfc28gPSBuOworCXJlZHJhd19jdXJidWZfbGF0ZXIoTk9UX1ZBTElEKTsJLyogcmVkcmF3IHRoaXMgYnVmZmVyIGxhdGVyICovCisgICAgfQorCisgICAgaWYgKHBfaW0pCisJbmVlZF9zdGFydF9pbnNlcnRtb2RlID0gVFJVRTsKKworI2lmIGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIHx8IGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKQorICAgIC8qIENoYW5nZSBkaXJlY3RvcmllcyB3aGVuIHRoZSBhY2Qgb3B0aW9uIGlzIHNldCBvbi4gKi8KKyAgICBpZiAocF9hY2QgJiYgY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMCisJCQkJICAgICAmJiB2aW1fY2hkaXJmaWxlKGN1cmJ1Zi0+Yl9mZm5hbWUpID09IE9LKQorCXNob3J0ZW5fZm5hbWVzKFRSVUUpOworCisgICAgaWYgKGd1aS5pbl91c2UgJiYgY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMKQorICAgIHsKKyMgaWZkZWYgRkVBVF9TVU5fV09SS1NIT1AKKwlpZiAodXNpbmdTdW5Xb3JrU2hvcCkKKwkgICAgd29ya3Nob3BfZmlsZV9vcGVuZWQoKGNoYXIgKiljdXJidWYtPmJfZmZuYW1lLCBjdXJidWYtPmJfcF9ybyk7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCWlmICh1c2luZ05ldGJlYW5zKQorCSAgICBuZXRiZWFuc19maWxlX29wZW5lZCgoY2hhciAqKWN1cmJ1Zi0+Yl9mZm5hbWUpOworIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCit0aGVlbmQ6CisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICB2aW1fZnJlZShicm93c2VfZmlsZSk7CisjZW5kaWYKKyAgICB2aW1fZnJlZShmcmVlX2ZuYW1lKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgc3RhdGljIHZvaWQKK2RlbGJ1Zl9tc2cobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgRU1TRzIoXygiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiKSwKKwkgICAgbmFtZSA9PSBOVUxMID8gKGNoYXJfdSAqKSIiIDogbmFtZSk7CisgICAgdmltX2ZyZWUobmFtZSk7CisgICAgYXVfbmV3X2N1cmJ1ZiA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqICI6aW5zZXJ0IiBhbmQgIjphcHBlbmQiLCBhbHNvIHVzZWQgYnkgIjpjaGFuZ2UiCisgKi8KKyAgICB2b2lkCitleF9hcHBlbmQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKnRoZWxpbmU7CisgICAgaW50CQlkaWRfdW5kbyA9IEZBTFNFOworICAgIGxpbmVucl9UCWxudW0gPSBlYXAtPmxpbmUyOworCisgICAgaWYgKGVhcC0+Y21kaWR4ICE9IENNRF9hcHBlbmQpCisJLS1sbnVtOworCisgICAgU3RhdGUgPSBJTlNFUlQ7CQkgICAgLyogYmVoYXZlIGxpa2UgaW4gSW5zZXJ0IG1vZGUgKi8KKyAgICBpZiAoY3VyYnVmLT5iX3BfaW1pbnNlcnQgPT0gQl9JTU9ERV9MTUFQKQorCVN0YXRlIHw9IExBTkdNQVA7CisgICAgd2hpbGUgKDEpCisgICAgeworCW1zZ19zY3JvbGwgPSBUUlVFOworCW5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKwlpZiAoZWFwLT5nZXRsaW5lID09IE5VTEwpCisJICAgIHRoZWxpbmUgPSBnZXRjbWRsaW5lKAorI2lmZGVmIEZFQVRfRVZBTAorCQkgICAgZWFwLT5jc3RhY2stPmNzX3doaWxlbGV2ZWwgPiAwID8gLTEgOgorI2VuZGlmCisJCSAgICBOVUwsIDBMLCAwKTsKKwllbHNlCisJICAgIHRoZWxpbmUgPSBlYXAtPmdldGxpbmUoCisjaWZkZWYgRkVBVF9FVkFMCisJCSAgICBlYXAtPmNzdGFjay0+Y3Nfd2hpbGVsZXZlbCA+IDAgPyAtMSA6CisjZW5kaWYKKwkJICAgIE5VTCwgZWFwLT5jb29raWUsIDApOworCWxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKwlpZiAodGhlbGluZSA9PSBOVUxMIHx8ICh0aGVsaW5lWzBdID09ICcuJyAmJiB0aGVsaW5lWzFdID09IE5VTCkKKwkJfHwgKCFkaWRfdW5kbyAmJiB1X3NhdmUobG51bSwgbG51bSArIDEpID09IEZBSUwpKQorCXsKKwkgICAgdmltX2ZyZWUodGhlbGluZSk7CisJICAgIGJyZWFrOworCX0KKworCWRpZF91bmRvID0gVFJVRTsKKwltbF9hcHBlbmQobG51bSwgdGhlbGluZSwgKGNvbG5yX1QpMCwgRkFMU0UpOworCWFwcGVuZGVkX2xpbmVzX21hcmsobG51bSwgMUwpOworCisJdmltX2ZyZWUodGhlbGluZSk7CisJKytsbnVtOworCW1zZ19kaWRvdXQgPSBUUlVFOwkvKiBhbHNvIHNjcm9sbCBmb3IgZW1wdHkgbGluZSAqLworICAgIH0KKyAgICBTdGF0ZSA9IE5PUk1BTDsKKworICAgIC8qICJzdGFydCIgaXMgc2V0IHRvIGVhcC0+bGluZTIrMSB1bmxlc3MgdGhhdCBwb3NpdGlvbiBpcyBpbnZhbGlkICh3aGVuCisgICAgICogZWFwLT5saW5lMiBwb2ludGVkIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhbmQgbm90aGlnIHdhcyBhcHBlbmRlZCkKKyAgICAgKiAiZW5kIiBpcyBzZXQgdG8gbG51bSB3aGVuIHNvbWV0aGluZyBoYXMgYmVlbiBhcHBlbmRlZCwgb3RoZXJ3aXNlCisgICAgICogaXQgaXMgdGhlIHNhbWUgdGhhbiAic3RhcnQiICAtLSBBY2V2ZWRvICovCisgICAgY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSAoZWFwLT5saW5lMiA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KSA/CisJZWFwLT5saW5lMiArIDEgOiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBpZiAoZWFwLT5jbWRpZHggIT0gQ01EX2FwcGVuZCkKKwktLWN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtOworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQubG51bSA9IChlYXAtPmxpbmUyIDwgbG51bSkKKwkJCQkJICAgICA/IGxudW0gOiBjdXJidWYtPmJfb3Bfc3RhcnQubG51bTsKKyAgICBjdXJidWYtPmJfb3Bfc3RhcnQuY29sID0gY3VyYnVmLT5iX29wX2VuZC5jb2wgPSAwOworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKyAgICBiZWdpbmxpbmUoQkxfU09MIHwgQkxfRklYKTsKKworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsJLyogZG9uJ3QgdXNlIHdhaXRfcmV0dXJuKCkgbm93ICovCisgICAgZXhfbm9fcmVwcmludCA9IFRSVUU7Cit9CisKKy8qCisgKiAiOmNoYW5nZSIKKyAqLworICAgIHZvaWQKK2V4X2NoYW5nZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGxpbmVucl9UCWxudW07CisKKyAgICBpZiAoZWFwLT5saW5lMiA+PSBlYXAtPmxpbmUxCisJICAgICYmIHVfc2F2ZShlYXAtPmxpbmUxIC0gMSwgZWFwLT5saW5lMiArIDEpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgZm9yIChsbnVtID0gZWFwLT5saW5lMjsgbG51bSA+PSBlYXAtPmxpbmUxOyAtLWxudW0pCisgICAgeworCWlmIChjdXJidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkJICAgIC8qIG5vdGhpbmcgdG8gZGVsZXRlICovCisJICAgIGJyZWFrOworCW1sX2RlbGV0ZShlYXAtPmxpbmUxLCBGQUxTRSk7CisgICAgfQorICAgIGRlbGV0ZWRfbGluZXNfbWFyayhlYXAtPmxpbmUxLCAobG9uZykoZWFwLT5saW5lMiAtIGxudW0pKTsKKworICAgIC8qICI6YXBwZW5kIiBvbiB0aGUgbGluZSBhYm92ZSB0aGUgZGVsZXRlZCBsaW5lcy4gKi8KKyAgICBlYXAtPmxpbmUyID0gZWFwLT5saW5lMTsKKyAgICBleF9hcHBlbmQoZWFwKTsKK30KKworICAgIHZvaWQKK2V4X3ooZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKng7CisgICAgaW50CQliaWduZXNzID0gY3Vyd2luLT53X2hlaWdodCAtIDM7CisgICAgY2hhcl91CWtpbmQ7CisgICAgaW50CQludW1iZXJlZCA9IEZBTFNFOworICAgIGludAkJbWludXMgPSAwOworICAgIGxpbmVucl9UCXN0YXJ0LCBlbmQsIGN1cnMsIGk7CisgICAgaW50CQlqOworICAgIGxpbmVucl9UCWxudW0gPSBlYXAtPmxpbmUyOworCisgICAgaWYgKGJpZ25lc3MgPCAxKQorCWJpZ25lc3MgPSAxOworCisgICAgeCA9IGVhcC0+YXJnOworICAgIGlmICgqeCA9PSAnIycpCisgICAgeworCW51bWJlcmVkID0gVFJVRTsKKwkrK3g7CisgICAgfQorCisgICAga2luZCA9ICp4OworICAgIGlmIChraW5kID09ICctJyB8fCBraW5kID09ICcrJyB8fCBraW5kID09ICc9JyB8fCBraW5kID09ICdeJyB8fCBraW5kID09ICcuJykKKwkrK3g7CisKKyAgICBpZiAoKnggIT0gMCkKKyAgICB7CisJaWYgKCFWSU1fSVNESUdJVCgqeCkpCisJeworCSAgICBFTVNHKF8oIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IikpOworCSAgICByZXR1cm47CisJfQorCWVsc2UKKwkgICAgYmlnbmVzcyA9IGF0b2koKGNoYXIgKil4KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGtpbmQpCisgICAgeworCWNhc2UgJy0nOgorCSAgICBzdGFydCA9IGxudW0gLSBiaWduZXNzOworCSAgICBlbmQgPSBsbnVtOworCSAgICBjdXJzID0gbG51bTsKKwkgICAgYnJlYWs7CisKKwljYXNlICc9JzoKKwkgICAgc3RhcnQgPSBsbnVtIC0gYmlnbmVzcyAvIDIgKyAxOworCSAgICBlbmQgPSBsbnVtICsgYmlnbmVzcyAvIDIgLSAxOworCSAgICBjdXJzID0gbG51bTsKKwkgICAgbWludXMgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgJ14nOgorCSAgICBzdGFydCA9IGxudW0gLSBiaWduZXNzICogMjsKKwkgICAgZW5kID0gbG51bSAtIGJpZ25lc3M7CisJICAgIGN1cnMgPSBsbnVtIC0gYmlnbmVzczsKKwkgICAgYnJlYWs7CisKKwljYXNlICcuJzoKKwkgICAgc3RhcnQgPSBsbnVtIC0gYmlnbmVzcyAvIDI7CisJICAgIGVuZCA9IGxudW0gKyBiaWduZXNzIC8gMjsKKwkgICAgY3VycyA9IGVuZDsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OiAgLyogJysnICovCisJICAgIHN0YXJ0ID0gbG51bTsKKwkgICAgZW5kID0gbG51bSArIGJpZ25lc3M7CisJICAgIGN1cnMgPSBlbmQ7CisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzdGFydCA8IDEpCisJc3RhcnQgPSAxOworCisgICAgaWYgKGVuZCA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWVuZCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCisgICAgaWYgKGN1cnMgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwljdXJzID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKKyAgICB7CisJaWYgKG1pbnVzICYmIGkgPT0gbG51bSkKKwl7CisJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCisJICAgIGZvciAoaiA9IDE7IGogPCBDb2x1bW5zOyBqKyspCisJCW1zZ19wdXRjaGFyKCctJyk7CisJfQorCisJcHJpbnRfbGluZShpLCBudW1iZXJlZCk7CisKKwlpZiAobWludXMgJiYgaSA9PSBsbnVtKQorCXsKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisKKwkgICAgZm9yIChqID0gMTsgaiA8IENvbHVtbnM7IGorKykKKwkJbXNnX3B1dGNoYXIoJy0nKTsKKwl9CisgICAgfQorCisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3VyczsKKyAgICBleF9ub19yZXByaW50ID0gVFJVRTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSByZXN0cmljdGVkIGZsYWcgaXMgc2V0LgorICogSWYgc28sIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIFRSVUUuCisgKiBPdGhlcndpc2UsIHJldHVybiBGQUxTRS4KKyAqLworICAgIGludAorY2hlY2tfcmVzdHJpY3RlZCgpCit7CisgICAgaWYgKHJlc3RyaWN0ZWQpCisgICAgeworCUVNU0coXygiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIpKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIHNlY3VyZSBmbGFnIGlzIHNldCAoLmV4cmMgb3IgLnZpbXJjIGluIGN1cnJlbnQgZGlyZWN0b3J5KS4KKyAqIElmIHNvLCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybiBUUlVFLgorICogT3RoZXJ3aXNlLCByZXR1cm4gRkFMU0UuCisgKi8KKyAgICBpbnQKK2NoZWNrX3NlY3VyZSgpCit7CisgICAgaWYgKHNlY3VyZSkKKyAgICB7CisJc2VjdXJlID0gMjsKKwlFTVNHKF8oZV9jdXJkaXIpKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisjaWZkZWYgSEFWRV9TQU5EQk9YCisgICAgLyoKKyAgICAgKiBJbiB0aGUgc2FuZGJveCBtb3JlIHRoaW5ncyBhcmUgbm90IGFsbG93ZWQsIGluY2x1ZGluZyB0aGUgdGhpbmdzCisgICAgICogZGlzYWxsb3dlZCBpbiBzZWN1cmUgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoc2FuZGJveCAhPSAwKQorICAgIHsKKwlFTVNHKF8oZV9zYW5kYm94KSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgY2hhcl91CSpvbGRfc3ViID0gTlVMTDsJLyogcHJldmlvdXMgc3Vic3RpdHV0ZSBwYXR0ZXJuICovCitzdGF0aWMgaW50CWdsb2JhbF9uZWVkX2JlZ2lubGluZTsJLyogY2FsbCBiZWdpbmxpbmUoKSBhZnRlciAiOmciICovCisKKy8qCisgKiBXaGVuICI6Z2xvYmFsIiBpcyB1c2VkIHRvIG51bWJlciBvZiBzdWJzdGl0dXRpb25zIGFuZCBjaGFuZ2VkIGxpbmVzIGlzCisgKiBhY2N1bXVsYXRlZCB1bnRpbCBpdCdzIGZpbmlzaGVkLgorICovCitzdGF0aWMgbG9uZwlzdWJfbnN1YnM7CS8qIHRvdGFsIG51bWJlciBvZiBzdWJzdGl0dXRpb25zICovCitzdGF0aWMgbGluZW5yX1QJc3ViX25saW5lczsJLyogdG90YWwgbnVtYmVyIG9mIGxpbmVzIGNoYW5nZWQgKi8KKworLyogZG9fc3ViKCkKKyAqCisgKiBQZXJmb3JtIGEgc3Vic3RpdHV0aW9uIGZyb20gbGluZSBlYXAtPmxpbmUxIHRvIGxpbmUgZWFwLT5saW5lMiB1c2luZyB0aGUKKyAqIGNvbW1hbmQgcG9pbnRlZCB0byBieSBlYXAtPmFyZyB3aGljaCBzaG91bGQgYmUgb2YgdGhlIGZvcm06CisgKgorICogL3BhdHRlcm4vc3Vic3RpdHV0aW9uL3tmbGFnc30KKyAqCisgKiBUaGUgdXN1YWwgZXNjYXBlcyBhcmUgc3VwcG9ydGVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgcmVnZXhwIGRvY3MuCisgKi8KKyAgICB2b2lkCitkb19zdWIoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJaSA9IDA7CisgICAgcmVnbW1hdGNoX1QgcmVnbWF0Y2g7CisgICAgc3RhdGljIGludAlkb19hbGwgPSBGQUxTRTsJCS8qIGRvIG11bHRpcGxlIHN1YnN0aXR1dGlvbnMgcGVyIGxpbmUgKi8KKyAgICBzdGF0aWMgaW50CWRvX2FzayA9IEZBTFNFOwkJLyogYXNrIGZvciBjb25maXJtYXRpb24gKi8KKyAgICBzdGF0aWMgaW50CWRvX2Vycm9yID0gVFJVRTsJLyogaWYgZmFsc2UsIGlnbm9yZSBlcnJvcnMgKi8KKyAgICBzdGF0aWMgaW50CWRvX3ByaW50ID0gRkFMU0U7CS8qIHByaW50IGxhc3QgbGluZSB3aXRoIHN1YnMuICovCisgICAgc3RhdGljIGludAlkb19pYyA9IDA7CQkvKiBpZ25vcmUgY2FzZSBmbGFnICovCisgICAgY2hhcl91CSpwYXQgPSBOVUxMLCAqc3ViID0gTlVMTDsJLyogaW5pdCBmb3IgR0NDICovCisgICAgaW50CQlkZWxpbWl0ZXI7CisgICAgaW50CQlzdWJsZW47CisgICAgaW50CQlnb3RfcXVpdCA9IEZBTFNFOworICAgIGludAkJZ290X21hdGNoID0gRkFMU0U7CisgICAgaW50CQl0ZW1wOworICAgIGludAkJd2hpY2hfcGF0OworICAgIGNoYXJfdQkqY21kOworICAgIGludAkJc2F2ZV9TdGF0ZTsKKyAgICBsaW5lbnJfVAlmaXJzdF9saW5lID0gMDsJLyogZmlyc3QgY2hhbmdlZCBsaW5lICovCisgICAgbGluZW5yX1QJbGFzdF9saW5lPSAwOwkvKiBiZWxvdyBsYXN0IGNoYW5nZWQgbGluZSBBRlRFUiB0aGUKKwkJCQkJICogY2hhbmdlICovCisgICAgbGluZW5yX1QJb2xkX2xpbmVfY291bnQgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBsaW5lbnJfVAlsaW5lMjsKKyAgICBsb25nCW5tYXRjaDsJCS8qIG51bWJlciBvZiBsaW5lcyBpbiBtYXRjaCAqLworICAgIGxpbmVucl9UCXN1Yl9maXJzdGxudW07CS8qIG5yIG9mIGZpcnN0IHN1YiBsaW5lICovCisgICAgY2hhcl91CSpzdWJfZmlyc3RsaW5lOwkvKiBhbGxvY2F0ZWQgY29weSBvZiBmaXJzdCBzdWIgbGluZSAqLworCisgICAgY21kID0gZWFwLT5hcmc7CisgICAgaWYgKCFnbG9iYWxfYnVzeSkKKyAgICB7CisJc3ViX25zdWJzID0gMDsKKwlzdWJfbmxpbmVzID0gMDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0ZLTUFQCS8qIHJldmVyc2UgdGhlIGZsb3cgb2YgdGhlIEZhcnNpIGNoYXJhY3RlcnMgKi8KKyAgICBpZiAocF9hbHRrZXltYXAgJiYgY3Vyd2luLT53X3BfcmwpCisJbHJGX3N1YihjbWQpOworI2VuZGlmCisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3RpbGRlKQorCXdoaWNoX3BhdCA9IFJFX0xBU1Q7CS8qIHVzZSBsYXN0IHVzZWQgcmVnZXhwICovCisgICAgZWxzZQorCXdoaWNoX3BhdCA9IFJFX1NVQlNUOwkvKiB1c2UgbGFzdCBzdWJzdGl0dXRlIHJlZ2V4cCAqLworCisJCQkJLyogbmV3IHBhdHRlcm4gYW5kIHN1YnN0aXR1dGlvbiAqLworICAgIGlmIChlYXAtPmNtZFswXSA9PSAncycgJiYgKmNtZCAhPSBOVUwgJiYgIXZpbV9pc3doaXRlKCpjbWQpCisJCSYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIwMTIzNDU2Nzg5Y2VncmlJcHxcIiIsICpjbWQpID09IE5VTEwpCisgICAgeworCQkJCS8qIGRvbid0IGFjY2VwdCBhbHBoYW51bWVyaWMgZm9yIHNlcGFyYXRvciAqLworCWlmIChpc2FscGhhKCpjbWQpKQorCXsKKwkgICAgRU1TRyhfKCJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIikpOworCSAgICByZXR1cm47CisJfQorCS8qCisJICogdW5kb2N1bWVudGVkIHZpIGZlYXR1cmU6CisJICogICJcL3N1Yi8iIGFuZCAiXD9zdWI/IiB1c2UgbGFzdCB1c2VkIHNlYXJjaCBwYXR0ZXJuIChhbG1vc3QgbGlrZQorCSAqICAvL3N1Yi9yKS4gICJcJnN1YiYiIHVzZSBsYXN0IHN1YnN0aXR1dGUgcGF0dGVybiAobGlrZSAvL3N1Yi8pLgorCSAqLworCWlmICgqY21kID09ICdcXCcpCisJeworCSAgICArK2NtZDsKKwkgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIvPyYiLCAqY21kKSA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coXyhlX2JhY2tzbGFzaCkpOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgaWYgKCpjbWQgIT0gJyYnKQorCQl3aGljaF9wYXQgPSBSRV9TRUFSQ0g7CSAgICAvKiB1c2UgbGFzdCAnLycgcGF0dGVybiAqLworCSAgICBwYXQgPSAoY2hhcl91ICopIiI7CQkgICAgLyogZW1wdHkgc2VhcmNoIHBhdHRlcm4gKi8KKwkgICAgZGVsaW1pdGVyID0gKmNtZCsrOwkJICAgIC8qIHJlbWVtYmVyIGRlbGltaXRlciBjaGFyYWN0ZXIgKi8KKwl9CisJZWxzZQkJLyogZmluZCB0aGUgZW5kIG9mIHRoZSByZWdleHAgKi8KKwl7CisJICAgIHdoaWNoX3BhdCA9IFJFX0xBU1Q7CSAgICAvKiB1c2UgbGFzdCB1c2VkIHJlZ2V4cCAqLworCSAgICBkZWxpbWl0ZXIgPSAqY21kKys7CQkgICAgLyogcmVtZW1iZXIgZGVsaW1pdGVyIGNoYXJhY3RlciAqLworCSAgICBwYXQgPSBjbWQ7CQkJICAgIC8qIHJlbWVtYmVyIHN0YXJ0IG9mIHNlYXJjaCBwYXQgKi8KKwkgICAgY21kID0gc2tpcF9yZWdleHAoY21kLCBkZWxpbWl0ZXIsIHBfbWFnaWMsICZlYXAtPmFyZyk7CisJICAgIGlmIChjbWRbMF0gPT0gZGVsaW1pdGVyKQkgICAgLyogZW5kIGRlbGltaXRlciBmb3VuZCAqLworCQkqY21kKysgPSBOVUw7CQkgICAgLyogcmVwbGFjZSBpdCB3aXRoIGEgTlVMICovCisJfQorCisJLyoKKwkgKiBTbWFsbCBpbmNvbXBhdGliaWxpdHk6IHZpIHNlZXMgJ1xuJyBhcyBlbmQgb2YgdGhlIGNvbW1hbmQsIGJ1dCBpbgorCSAqIFZpbSB3ZSB3YW50IHRvIHVzZSAnXG4nIHRvIGZpbmQvc3Vic3RpdHV0ZSBhIE5VTC4KKwkgKi8KKwlzdWIgPSBjbWQ7CSAgICAvKiByZW1lbWJlciB0aGUgc3RhcnQgb2YgdGhlIHN1YnN0aXR1dGlvbiAqLworCisJd2hpbGUgKGNtZFswXSkKKwl7CisJICAgIGlmIChjbWRbMF0gPT0gZGVsaW1pdGVyKQkJLyogZW5kIGRlbGltaXRlciBmb3VuZCAqLworCSAgICB7CisJCSpjbWQrKyA9IE5VTDsJCQkvKiByZXBsYWNlIGl0IHdpdGggYSBOVUwgKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGNtZFswXSA9PSAnXFwnICYmIGNtZFsxXSAhPSAwKQkvKiBza2lwIGVzY2FwZWQgY2hhcmFjdGVycyAqLworCQkrK2NtZDsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWNtZCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGNtZCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK2NtZDsKKwl9CisKKwlpZiAoIWVhcC0+c2tpcCkKKwl7CisJICAgIHZpbV9mcmVlKG9sZF9zdWIpOworCSAgICBvbGRfc3ViID0gdmltX3N0cnNhdmUoc3ViKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKCFlYXAtPnNraXApCS8qIHVzZSBwcmV2aW91cyBwYXR0ZXJuIGFuZCBzdWJzdGl0dXRpb24gKi8KKyAgICB7CisJaWYgKG9sZF9zdWIgPT0gTlVMTCkJLyogdGhlcmUgaXMgbm8gcHJldmlvdXMgY29tbWFuZCAqLworCXsKKwkgICAgRU1TRyhfKGVfbm9wcmVzdWIpKTsKKwkgICAgcmV0dXJuOworCX0KKwlwYXQgPSBOVUxMOwkJLyogc2VhcmNoX3JlZ2NvbXAoKSB3aWxsIHVzZSBwcmV2aW91cyBwYXR0ZXJuICovCisJc3ViID0gb2xkX3N1YjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpbmQgdHJhaWxpbmcgb3B0aW9ucy4gIFdoZW4gJyYnIGlzIHVzZWQsIGtlZXAgb2xkIG9wdGlvbnMuCisgICAgICovCisgICAgaWYgKCpjbWQgPT0gJyYnKQorCSsrY21kOworICAgIGVsc2UKKyAgICB7CisJaWYgKCFwX2VkKQorCXsKKwkgICAgaWYgKHBfZ2QpCQkvKiBkZWZhdWx0IGlzIGdsb2JhbCBvbiAqLworCQlkb19hbGwgPSBUUlVFOworCSAgICBlbHNlCisJCWRvX2FsbCA9IEZBTFNFOworCSAgICBkb19hc2sgPSBGQUxTRTsKKwl9CisJZG9fZXJyb3IgPSBUUlVFOworCWRvX3ByaW50ID0gRkFMU0U7CisJZG9faWMgPSAwOworICAgIH0KKyAgICB3aGlsZSAoKmNtZCkKKyAgICB7CisJLyoKKwkgKiBOb3RlIHRoYXQgJ2cnIGFuZCAnYycgYXJlIGFsd2F5cyBpbnZlcnRlZCwgYWxzbyB3aGVuIHBfZWQgaXMgb2ZmLgorCSAqICdyJyBpcyBuZXZlciBpbnZlcnRlZC4KKwkgKi8KKwlpZiAoKmNtZCA9PSAnZycpCisJICAgIGRvX2FsbCA9ICFkb19hbGw7CisJZWxzZSBpZiAoKmNtZCA9PSAnYycpCisJICAgIGRvX2FzayA9ICFkb19hc2s7CisJZWxzZSBpZiAoKmNtZCA9PSAnZScpCisJICAgIGRvX2Vycm9yID0gIWRvX2Vycm9yOworCWVsc2UgaWYgKCpjbWQgPT0gJ3InKQkgICAgLyogdXNlIGxhc3QgdXNlZCByZWdleHAgKi8KKwkgICAgd2hpY2hfcGF0ID0gUkVfTEFTVDsKKwllbHNlIGlmICgqY21kID09ICdwJykKKwkgICAgZG9fcHJpbnQgPSBUUlVFOworCWVsc2UgaWYgKCpjbWQgPT0gJ2knKQkgICAgLyogaWdub3JlIGNhc2UgKi8KKwkgICAgZG9faWMgPSAnaSc7CisJZWxzZSBpZiAoKmNtZCA9PSAnSScpCSAgICAvKiBkb24ndCBpZ25vcmUgY2FzZSAqLworCSAgICBkb19pYyA9ICdJJzsKKwllbHNlCisJICAgIGJyZWFrOworCSsrY21kOworICAgIH0KKworICAgIC8qCisgICAgICogY2hlY2sgZm9yIGEgdHJhaWxpbmcgY291bnQKKyAgICAgKi8KKyAgICBjbWQgPSBza2lwd2hpdGUoY21kKTsKKyAgICBpZiAoVklNX0lTRElHSVQoKmNtZCkpCisgICAgeworCWkgPSBnZXRkaWdpdHMoJmNtZCk7CisJaWYgKGkgPD0gMCAmJiAhZWFwLT5za2lwICYmIGRvX2Vycm9yKQorCXsKKwkgICAgRU1TRyhfKGVfemVyb2NvdW50KSk7CisJICAgIHJldHVybjsKKwl9CisJZWFwLT5saW5lMSA9IGVhcC0+bGluZTI7CisJZWFwLT5saW5lMiArPSBpIC0gMTsKKwlpZiAoZWFwLT5saW5lMiA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICBlYXAtPmxpbmUyID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBjaGVjayBmb3IgdHJhaWxpbmcgY29tbWFuZCBvciBnYXJiYWdlCisgICAgICovCisgICAgY21kID0gc2tpcHdoaXRlKGNtZCk7CisgICAgaWYgKCpjbWQgJiYgKmNtZCAhPSAnIicpCSAgICAvKiBpZiBub3QgZW5kLW9mLWxpbmUgb3IgY29tbWVudCAqLworICAgIHsKKwllYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGNtZCk7CisJaWYgKGVhcC0+bmV4dGNtZCA9PSBOVUxMKQorCXsKKwkgICAgRU1TRyhfKGVfdHJhaWxpbmcpKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBpZiAoZWFwLT5za2lwKQkgICAgLyogbm90IGV4ZWN1dGluZyBjb21tYW5kcywgb25seSBwYXJzaW5nICovCisJcmV0dXJuOworCisgICAgaWYgKHNlYXJjaF9yZWdjb21wKHBhdCwgUkVfU1VCU1QsIHdoaWNoX3BhdCwgU0VBUkNIX0hJUywgJnJlZ21hdGNoKSA9PSBGQUlMKQorICAgIHsKKwlpZiAoZG9fZXJyb3IpCisJICAgIEVNU0coXyhlX2ludmNtZCkpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiB0aGUgJ2knIG9yICdJJyBmbGFnIG92ZXJydWxlcyAnaWdub3JlY2FzZScgYW5kICdzbWFydGNhc2UnICovCisgICAgaWYgKGRvX2ljID09ICdpJykKKwlyZWdtYXRjaC5ybW1faWMgPSBUUlVFOworICAgIGVsc2UgaWYgKGRvX2ljID09ICdJJykKKwlyZWdtYXRjaC5ybW1faWMgPSBGQUxTRTsKKworICAgIHN1Yl9maXJzdGxpbmUgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiB+IGluIHRoZSBzdWJzdGl0dXRlIHBhdHRlcm4gaXMgcmVwbGFjZWQgd2l0aCB0aGUgb2xkIHBhdHRlcm4uCisgICAgICogV2UgZG8gaXQgaGVyZSBvbmNlIHRvIGF2b2lkIGl0IHRvIGJlIHJlcGxhY2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisgICAgICogQnV0IGRvbid0IGRvIGl0IHdoZW4gaXQgc3RhcnRzIHdpdGggIlw9IiwgdGhlbiBpdCdzIGFuIGV4cHJlc3Npb24uCisgICAgICovCisgICAgaWYgKCEoc3ViWzBdID09ICdcXCcgJiYgc3ViWzFdID09ICc9JykpCisJc3ViID0gcmVndGlsZGUoc3ViLCBwX21hZ2ljKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGEgbWF0Y2ggb24gZWFjaCBsaW5lLgorICAgICAqLworICAgIGxpbmUyID0gZWFwLT5saW5lMjsKKyAgICBmb3IgKGxudW0gPSBlYXAtPmxpbmUxOyBsbnVtIDw9IGxpbmUyICYmICEoZ290X3F1aXQKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgJiYgZGVmaW5lZChGRUFUX0FVVE9DTUQpCisJCXx8IGFib3J0aW5nKCkKKyNlbmRpZgorCQkpOyArK2xudW0pCisgICAgeworCXN1Yl9maXJzdGxudW0gPSBsbnVtOworCW5tYXRjaCA9IHZpbV9yZWdleGVjX211bHRpKCZyZWdtYXRjaCwgY3Vyd2luLCBjdXJidWYsIGxudW0sIChjb2xucl9UKTApOworCWlmIChubWF0Y2gpCisJeworCSAgICBjb2xucl9UCWNvcHljb2w7CisJICAgIGNvbG5yX1QJbWF0Y2hjb2w7CisJICAgIGNvbG5yX1QJcHJldl9tYXRjaGNvbCA9IE1BWENPTDsKKwkgICAgY2hhcl91CSpuZXdfZW5kLCAqbmV3X3N0YXJ0ID0gTlVMTDsKKwkgICAgdW5zaWduZWQJbmV3X3N0YXJ0X2xlbiA9IDA7CisJICAgIGNoYXJfdQkqcDE7CisJICAgIGludAkJZGlkX3N1YiA9IEZBTFNFOworCSAgICBpbnQJCWxhc3RvbmU7CisJICAgIHVuc2lnbmVkCWxlbiwgbmVlZGVkX2xlbjsKKwkgICAgbG9uZwlubWF0Y2hfdGwgPSAwOwkvKiBuciBvZiBsaW5lcyBtYXRjaGVkIGJlbG93IGxudW0gKi8KKwkgICAgaW50CQlkb19hZ2FpbjsJLyogZG8gaXQgYWdhaW4gYWZ0ZXIgam9pbmluZyBsaW5lcyAqLworCisJICAgIC8qCisJICAgICAqIFRoZSBuZXcgdGV4dCBpcyBidWlsZCB1cCBzdGVwIGJ5IHN0ZXAsIHRvIGF2b2lkIHRvbyBtdWNoCisJICAgICAqIGNvcHlpbmcuICBUaGVyZSBhcmUgdGhlc2UgcGllY2VzOgorCSAgICAgKiBzdWJfZmlyc3RsaW5lCVRoZSBvbGQgdGV4dCwgdW5tb2RpZmVkLgorCSAgICAgKiBjb3B5Y29sCQlDb2x1bW4gaW4gdGhlIG9sZCB0ZXh0IHdoZXJlIHdlIHN0YXJ0ZWQKKwkgICAgICoJCQlsb29raW5nIGZvciBhIG1hdGNoOyBmcm9tIGhlcmUgb2xkIHRleHQgc3RpbGwKKwkgICAgICoJCQluZWVkcyB0byBiZSBjb3BpZWQgdG8gdGhlIG5ldyB0ZXh0LgorCSAgICAgKiBtYXRjaGNvbAkJQ29sdW1uIG51bWJlciBvZiB0aGUgb2xkIHRleHQgd2hlcmUgdG8gbG9vaworCSAgICAgKgkJCWZvciB0aGUgbmV4dCBtYXRjaC4gIEl0J3MganVzdCBhZnRlciB0aGUKKwkgICAgICoJCQlwcmV2aW91cyBtYXRjaCBvciBvbmUgZnVydGhlci4KKwkgICAgICogcHJldl9tYXRjaGNvbAlDb2x1bW4ganVzdCBhZnRlciB0aGUgcHJldmlvdXMgbWF0Y2ggKGlmIGFueSkuCisJICAgICAqCQkJTW9zdGx5IGVxdWFsIHRvIG1hdGNoY29sLCBleGNlcHQgZm9yIHRoZSBmaXJzdAorCSAgICAgKgkJCW1hdGNoIGFuZCBhZnRlciBza2lwcGluZyBhbiBlbXB0eSBtYXRjaC4KKwkgICAgICogcmVnbWF0Y2guKnBvcwlXaGVyZSB0aGUgcGF0dGVybiBtYXRjaGVkIGluIHRoZSBvbGQgdGV4dC4KKwkgICAgICogbmV3X3N0YXJ0CVRoZSBuZXcgdGV4dCwgYWxsIHRoYXQgaGFzIGJlZW4gcHJvZHVjZWQgc28KKwkgICAgICoJCQlmYXIuCisJICAgICAqIG5ld19lbmQJCVRoZSBuZXcgdGV4dCwgd2hlcmUgdG8gYXBwZW5kIG5ldyB0ZXh0LgorCSAgICAgKgorCSAgICAgKiBsbnVtCQlUaGUgbGluZSBudW1iZXIgd2hlcmUgd2Ugd2VyZSBsb29raW5nIGZvciB0aGUKKwkgICAgICoJCQlmaXJzdCBtYXRjaCBpbiB0aGUgb2xkIGxpbmUuCisJICAgICAqIHN1Yl9maXJzdGxudW0JVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBidWZmZXIgd2hlcmUgdG8gbG9vaworCSAgICAgKgkJCWZvciBhIG1hdGNoLiAgQ2FuIGJlIGRpZmZlcmVudCBmcm9tICJsbnVtIgorCSAgICAgKgkJCXdoZW4gdGhlIHBhdHRlcm4gb3Igc3Vic3RpdHV0ZSBzdHJpbmcgY29udGFpbnMKKwkgICAgICoJCQlsaW5lIGJyZWFrcy4KKwkgICAgICoKKwkgICAgICogU3BlY2lhbCBzaXR1YXRpb25zOgorCSAgICAgKiAtIFdoZW4gdGhlIHN1YnN0aXR1dGUgc3RyaW5nIGNvbnRhaW5zIGEgbGluZSBicmVhaywgdGhlIHBhcnQgdXAKKwkgICAgICogICB0byB0aGUgbGluZSBicmVhayBpcyBpbnNlcnRlZCBpbiB0aGUgdGV4dCwgYnV0IHRoZSBjb3B5IG9mCisJICAgICAqICAgdGhlIG9yaWdpbmFsIGxpbmUgaXMga2VwdC4gICJzdWJfZmlyc3RsbnVtIiBpcyBhZGp1c3RlZCBmb3IKKwkgICAgICogICB0aGUgaW5zZXJ0ZWQgbGluZXMuCisJICAgICAqIC0gV2hlbiB0aGUgbWF0Y2hlZCBwYXR0ZXJuIGNvbnRhaW5zIGEgbGluZSBicmVhaywgdGhlIG9sZCBsaW5lCisJICAgICAqICAgaXMgdGFrZW4gZnJvbSB0aGUgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAgVGhlIGxpbmVzCisJICAgICAqICAgaW4gdGhlIG1hdGNoIGFyZSBkZWxldGVkIGxhdGVyLCAic3ViX2ZpcnN0bG51bSIgaXMgYWRqdXN0ZWQKKwkgICAgICogICBhY2NvcmRpbmdseS4KKwkgICAgICoKKwkgICAgICogVGhlIG5ldyB0ZXh0IGlzIGJ1aWx0IHVwIGluIG5ld19zdGFydFtdLiAgSXQgaGFzIHNvbWUgZXh0cmEKKwkgICAgICogcm9vbSB0byBhdm9pZCB1c2luZyBhbGxvYygpL2ZyZWUoKSB0b28gb2Z0ZW4uICBuZXdfc3RhcnRfbGVuIGlzCisJICAgICAqIHRoZSBsZW5naHQgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYXQgbmV3X3N0YXJ0LgorCSAgICAgKgorCSAgICAgKiBNYWtlIGEgY29weSBvZiB0aGUgb2xkIGxpbmUsIHNvIGl0IHdvbid0IGJlIHRha2VuIGF3YXkgd2hlbgorCSAgICAgKiB1cGRhdGluZyB0aGUgc2NyZWVuIG9yIGhhbmRsaW5nIGEgbXVsdGktbGluZSBtYXRjaC4gIFRoZSAib2xkXyIKKwkgICAgICogcG9pbnRlcnMgcG9pbnQgaW50byB0aGlzIGNvcHkuCisJICAgICAqLworCSAgICBzdWJfZmlyc3RsaW5lID0gdmltX3N0cnNhdmUobWxfZ2V0KHN1Yl9maXJzdGxudW0pKTsKKwkgICAgaWYgKHN1Yl9maXJzdGxpbmUgPT0gTlVMTCkKKwkgICAgeworCQl2aW1fZnJlZShuZXdfc3RhcnQpOworCQlnb3RvIG91dG9mbWVtOworCSAgICB9CisJICAgIGNvcHljb2wgPSAwOworCSAgICBtYXRjaGNvbCA9IDA7CisKKwkgICAgLyogQXQgZmlyc3QgbWF0Y2gsIHJlbWVtYmVyIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAqLworCSAgICBpZiAoIWdvdF9tYXRjaCkKKwkgICAgeworCQlzZXRwY21hcmsoKTsKKwkJZ290X21hdGNoID0gVFJVRTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIExvb3AgdW50aWwgbm90aGluZyBtb3JlIHRvIHJlcGxhY2UgaW4gdGhpcyBsaW5lLgorCSAgICAgKiAxLiBIYW5kbGUgbWF0Y2ggd2l0aCBlbXB0eSBzdHJpbmcuCisJICAgICAqIDIuIElmIGRvX2FzayBpcyBzZXQsIGFzayBmb3IgY29uZmlybWF0aW9uLgorCSAgICAgKiAzLiBzdWJzdGl0dXRlIHRoZSBzdHJpbmcuCisJICAgICAqIDQuIGlmIGRvX2FsbCBpcyBzZXQsIGZpbmQgbmV4dCBtYXRjaAorCSAgICAgKiA1LiBicmVhayBpZiB0aGVyZSBpc24ndCBhbm90aGVyIG1hdGNoIGluIHRoaXMgbGluZQorCSAgICAgKi8KKwkgICAgZm9yICg7OykKKwkgICAgeworCQkvKiBTYXZlIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgbGFzdCBjaGFuZ2UgZm9yIHRoZSBmaW5hbAorCQkgKiBjdXJzb3IgcG9zaXRpb24gKGp1c3QgbGlrZSBWaSkuICovCisJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJCWRvX2FnYWluID0gRkFMU0U7CisKKwkJLyoKKwkJICogMS4gTWF0Y2ggZW1wdHkgc3RyaW5nIGRvZXMgbm90IGNvdW50LCBleGNlcHQgZm9yIGZpcnN0CisJCSAqIG1hdGNoLiAgVGhpcyByZXByb2R1Y2VzIHRoZSBzdHJhbmdlIHZpIGJlaGF2aW91ci4KKwkJICogVGhpcyBhbHNvIGNhdGNoZXMgZW5kbGVzcyBsb29wcy4KKwkJICovCisJCWlmIChtYXRjaGNvbCA9PSBwcmV2X21hdGNoY29sCisJCQkmJiByZWdtYXRjaC5lbmRwb3NbMF0ubG51bSA9PSAwCisJCQkmJiBtYXRjaGNvbCA9PSByZWdtYXRjaC5lbmRwb3NbMF0uY29sKQorCQl7CisJCSAgICArK21hdGNoY29sOyAvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggYXQgbmV4dCBjb2x1bW4gKi8KKwkJICAgIGdvdG8gc2tpcDsKKwkJfQorCisJCS8qIE5vcm1hbGx5IHdlIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYSBtYXRjaCBqdXN0IGFmdGVyIHRoZQorCQkgKiBwcmV2aW91cyBtYXRjaC4gKi8KKwkJbWF0Y2hjb2wgPSByZWdtYXRjaC5lbmRwb3NbMF0uY29sOworCQlwcmV2X21hdGNoY29sID0gbWF0Y2hjb2w7CisKKwkJLyoKKwkJICogMi4gSWYgZG9fYXNrIGlzIHNldCwgYXNrIGZvciBjb25maXJtYXRpb24uCisJCSAqLworCQlpZiAoZG9fYXNrKQorCQl7CisJCSAgICAvKiBjaGFuZ2UgU3RhdGUgdG8gQ09ORklSTSwgc28gdGhhdCB0aGUgbW91c2Ugd29ya3MKKwkJICAgICAqIHByb3Blcmx5ICovCisJCSAgICBzYXZlX1N0YXRlID0gU3RhdGU7CisJCSAgICBTdGF0ZSA9IENPTkZJUk07CisjaWZkZWYgRkVBVF9NT1VTRQorCQkgICAgc2V0bW91c2UoKTsJCS8qIGRpc2FibGUgbW91c2UgaW4geHRlcm0gKi8KKyNlbmRpZgorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSByZWdtYXRjaC5zdGFydHBvc1swXS5jb2w7CisKKwkJICAgIC8qIFdoZW4gJ2Nwb3B0aW9ucycgY29udGFpbnMgInUiIGRvbid0IHN5bmMgdW5kbyB3aGVuCisJCSAgICAgKiBhc2tpbmcgZm9yIGNvbmZpcm1hdGlvbi4gKi8KKwkJICAgIGlmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fVU5ETykgIT0gTlVMTCkKKwkJCSsrbm9fdV9zeW5jOworCisJCSAgICAvKgorCQkgICAgICogTG9vcCB1bnRpbCAneScsICduJywgJ3EnLCBDVFJMLUUgb3IgQ1RSTC1ZIHR5cGVkLgorCQkgICAgICovCisJCSAgICB3aGlsZSAoZG9fYXNrKQorCQkgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCQkJaW50IHNhdmVfcF9mZW4gPSBjdXJ3aW4tPndfcF9mZW47CisKKwkJCWN1cndpbi0+d19wX2ZlbiA9IEZBTFNFOworI2VuZGlmCisJCQkvKiBJbnZlcnQgdGhlIG1hdGNoZWQgc3RyaW5nLgorCQkJICogUmVtb3ZlIHRoZSBpbnZlcnNpb24gYWZ0ZXJ3YXJkcy4gKi8KKwkJCXRlbXAgPSBSZWRyYXdpbmdEaXNhYmxlZDsKKwkJCVJlZHJhd2luZ0Rpc2FibGVkID0gMDsKKworCQkJc2VhcmNoX21hdGNoX2xpbmVzID0gcmVnbWF0Y2guZW5kcG9zWzBdLmxudW07CisJCQlzZWFyY2hfbWF0Y2hfZW5kY29sID0gcmVnbWF0Y2guZW5kcG9zWzBdLmNvbDsKKwkJCWhpZ2hsaWdodF9tYXRjaCA9IFRSVUU7CisKKwkJCXVwZGF0ZV90b3BsaW5lKCk7CisJCQl2YWxpZGF0ZV9jdXJzb3IoKTsKKwkJCXVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKwkJCWhpZ2hsaWdodF9tYXRjaCA9IEZBTFNFOworCQkJcmVkcmF3X2xhdGVyKE5PVF9WQUxJRCk7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJCWN1cndpbi0+d19wX2ZlbiA9IHNhdmVfcF9mZW47CisjZW5kaWYKKwkJCWlmIChtc2dfcm93ID09IFJvd3MgLSAxKQorCQkJICAgIG1zZ19kaWRvdXQgPSBGQUxTRTsJCS8qIGF2b2lkIGEgc2Nyb2xsLXVwICovCisJCQltc2dfc3RhcnRoZXJlKCk7CisJCQlpID0gbXNnX3Njcm9sbDsKKwkJCW1zZ19zY3JvbGwgPSAwOwkJLyogdHJ1bmNhdGUgbXNnIHdoZW4gbmVlZGVkICovCisJCQltc2dfbm9fbW9yZSA9IFRSVUU7CisJCQkvKiB3cml0ZSBtZXNzYWdlIHNhbWUgaGlnaGxpZ2h0aW5nIGFzIGZvciB3YWl0X3JldHVybiAqLworCQkJc21zZ19hdHRyKGhsX2F0dHIoSExGX1IpLAorCQkJICAgIChjaGFyX3UgKilfKCJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IiksCisJCQkJc3ViKTsKKwkJCW1zZ19ub19tb3JlID0gRkFMU0U7CisJCQltc2dfc2Nyb2xsID0gaTsKKwkJCXNob3dydWxlcihUUlVFKTsKKwkJCXdpbmRnb3RvKG1zZ19yb3csIG1zZ19jb2wpOworCQkJUmVkcmF3aW5nRGlzYWJsZWQgPSB0ZW1wOworCisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKwkJCWRvbnRfc2Nyb2xsID0gRkFMU0U7CS8qIGFsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKwkJCSsrbm9fbWFwcGluZzsJCS8qIGRvbid0IG1hcCB0aGlzIGtleSAqLworCQkJKythbGxvd19rZXlzOwkJLyogYWxsb3cgc3BlY2lhbCBrZXlzICovCisJCQlpID0gc2FmZV92Z2V0YygpOworCQkJLS1hbGxvd19rZXlzOworCQkJLS1ub19tYXBwaW5nOworCisJCQkvKiBjbGVhciB0aGUgcXVlc3Rpb24gKi8KKwkJCW1zZ19kaWRvdXQgPSBGQUxTRTsJLyogZG9uJ3Qgc2Nyb2xsIHVwICovCisJCQltc2dfY29sID0gMDsKKwkJCWdvdG9jbWRsaW5lKFRSVUUpOworCQkJbmVlZF93YWl0X3JldHVybiA9IEZBTFNFOyAvKiBubyBoaXQtcmV0dXJuIHByb21wdCAqLworCQkJaWYgKGkgPT0gJ3EnIHx8IGkgPT0gRVNDIHx8IGkgPT0gQ3RybF9DCisjaWZkZWYgVU5JWAorCQkJCXx8IGkgPT0gaW50cl9jaGFyCisjZW5kaWYKKwkJCQkpCisJCQl7CisJCQkgICAgZ290X3F1aXQgPSBUUlVFOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJaWYgKGkgPT0gJ24nKQorCQkJICAgIGJyZWFrOworCQkJaWYgKGkgPT0gJ3knKQorCQkJICAgIGJyZWFrOworCQkJaWYgKGkgPT0gJ2wnKQorCQkJeworCQkJICAgIC8qIGxhc3Q6IHJlcGxhY2UgYW5kIHRoZW4gc3RvcCAqLworCQkJICAgIGRvX2FsbCA9IEZBTFNFOworCQkJICAgIGxpbmUyID0gbG51bTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCWlmIChpID09ICdhJykKKwkJCXsKKwkJCSAgICBkb19hc2sgPSBGQUxTRTsKKwkJCSAgICBicmVhazsKKwkJCX0KKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkJCWlmIChpID09IEN0cmxfRSkKKwkJCSAgICBzY3JvbGx1cF9jbGFtcCgpOworCQkJZWxzZSBpZiAoaSA9PSBDdHJsX1kpCisJCQkgICAgc2Nyb2xsZG93bl9jbGFtcCgpOworI2VuZGlmCisJCSAgICB9CisJCSAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisjaWZkZWYgRkVBVF9NT1VTRQorCQkgICAgc2V0bW91c2UoKTsKKyNlbmRpZgorCQkgICAgaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19VTkRPKSAhPSBOVUxMKQorCQkJLS1ub191X3N5bmM7CisKKwkJICAgIGlmIChpID09ICduJykKKwkJICAgIHsKKwkJCS8qIEZvciBhIG11bHRpLWxpbmUgbWF0Y2gsIHB1dCBtYXRjaGNvbCBhdCB0aGUgTlVMIGF0CisJCQkgKiB0aGUgZW5kIG9mIHRoZSBsaW5lIGFuZCBzZXQgbm1hdGNoIHRvIG9uZSwgc28gdGhhdAorCQkJICogd2UgY29udGludWUgbG9va2luZyBmb3IgYSBtYXRjaCBvbiB0aGUgbmV4dCBsaW5lLgorCQkJICogQXZvaWRzIHRoYXQgIjpzL1xuQlxAPS8vZ2MiIGdldCBzdHVjay4gKi8KKwkJCWlmIChubWF0Y2ggPiAxKQorCQkJeworCQkJICAgIG1hdGNoY29sID0gU1RSTEVOKHN1Yl9maXJzdGxpbmUpOworCQkJICAgIG5tYXRjaCA9IDE7CisJCQl9CisJCQlnb3RvIHNraXA7CisJCSAgICB9CisJCSAgICBpZiAoZ290X3F1aXQpCisJCQlicmVhazsKKwkJfQorCisJCS8qIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoLCBzbyB0aGF0IHdlIGNhbgorCQkgKiB1c2UgIlw9Y29sKCIuIikuICovCisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sOworCisJCS8qCisJCSAqIDMuIHN1YnN0aXR1dGUgdGhlIHN0cmluZy4KKwkJICovCisJCS8qIGdldCBsZW5ndGggb2Ygc3Vic3RpdHV0aW9uIHBhcnQgKi8KKwkJc3VibGVuID0gdmltX3JlZ3N1Yl9tdWx0aSgmcmVnbWF0Y2gsIHN1Yl9maXJzdGxudW0sCisJCQkJICAgIHN1Yiwgc3ViX2ZpcnN0bGluZSwgRkFMU0UsIHBfbWFnaWMsIFRSVUUpOworCisJCS8qIE5lZWQgcm9vbSBmb3I6CisJCSAqIC0gcmVzdWx0IHNvIGZhciBpbiBuZXdfc3RhcnQgKG5vdCBmb3IgZmlyc3Qgc3ViIGluIGxpbmUpCisJCSAqIC0gb3JpZ2luYWwgdGV4dCB1cCB0byBtYXRjaAorCQkgKiAtIGxlbmd0aCBvZiBzdWJzdGl0dXRlZCBwYXJ0CisJCSAqIC0gb3JpZ2luYWwgdGV4dCBhZnRlciBtYXRjaAorCQkgKi8KKwkJaWYgKG5tYXRjaCA9PSAxKQorCQkgICAgcDEgPSBzdWJfZmlyc3RsaW5lOworCQllbHNlCisJCXsKKwkJICAgIHAxID0gbWxfZ2V0KHN1Yl9maXJzdGxudW0gKyBubWF0Y2ggLSAxKTsKKwkJICAgIG5tYXRjaF90bCArPSBubWF0Y2ggLSAxOworCQl9CisJCWkgPSByZWdtYXRjaC5zdGFydHBvc1swXS5jb2wgLSBjb3B5Y29sOworCQluZWVkZWRfbGVuID0gaSArICgodW5zaWduZWQpU1RSTEVOKHAxKSAtIHJlZ21hdGNoLmVuZHBvc1swXS5jb2wpCisJCQkJCQkJCSArIHN1YmxlbiArIDE7CisJCWlmIChuZXdfc3RhcnQgPT0gTlVMTCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIEdldCBzb21lIHNwYWNlIGZvciBhIHRlbXBvcmFyeSBidWZmZXIgdG8gZG8gdGhlCisJCSAgICAgKiBzdWJzdGl0dXRpb24gaW50byAoYW5kIHNvbWUgZXh0cmEgc3BhY2UgdG8gYXZvaWQKKwkJICAgICAqIHRvbyBtYW55IGNhbGxzIHRvIGFsbG9jKCkvZnJlZSgpKS4KKwkJICAgICAqLworCQkgICAgbmV3X3N0YXJ0X2xlbiA9IG5lZWRlZF9sZW4gKyA1MDsKKwkJICAgIGlmICgobmV3X3N0YXJ0ID0gYWxsb2NfY2hlY2sobmV3X3N0YXJ0X2xlbikpID09IE5VTEwpCisJCQlnb3RvIG91dG9mbWVtOworCQkgICAgKm5ld19zdGFydCA9IE5VTDsKKwkJICAgIG5ld19lbmQgPSBuZXdfc3RhcnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogQ2hlY2sgaWYgdGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgbG9uZyBlbm91Z2ggdG8gZG8gdGhlCisJCSAgICAgKiBzdWJzdGl0dXRpb24gaW50by4gIElmIG5vdCwgbWFrZSBpdCBsYXJnZXIgKHdpdGggYSBiaXQKKwkJICAgICAqIGV4dHJhIHRvIGF2b2lkIHRvbyBtYW55IGNhbGxzIHRvIGFsbG9jKCkvZnJlZSgpKS4KKwkJICAgICAqLworCQkgICAgbGVuID0gKHVuc2lnbmVkKVNUUkxFTihuZXdfc3RhcnQpOworCQkgICAgbmVlZGVkX2xlbiArPSBsZW47CisJCSAgICBpZiAobmVlZGVkX2xlbiA+IG5ld19zdGFydF9sZW4pCisJCSAgICB7CisJCQluZXdfc3RhcnRfbGVuID0gbmVlZGVkX2xlbiArIDUwOworCQkJaWYgKChwMSA9IGFsbG9jX2NoZWNrKG5ld19zdGFydF9sZW4pKSA9PSBOVUxMKQorCQkJeworCQkJICAgIHZpbV9mcmVlKG5ld19zdGFydCk7CisJCQkgICAgZ290byBvdXRvZm1lbTsKKwkJCX0KKwkJCW1jaF9tZW1tb3ZlKHAxLCBuZXdfc3RhcnQsIChzaXplX3QpKGxlbiArIDEpKTsKKwkJCXZpbV9mcmVlKG5ld19zdGFydCk7CisJCQluZXdfc3RhcnQgPSBwMTsKKwkJICAgIH0KKwkJICAgIG5ld19lbmQgPSBuZXdfc3RhcnQgKyBsZW47CisJCX0KKworCQkvKgorCQkgKiBjb3B5IHRoZSB0ZXh0IHVwIHRvIHRoZSBwYXJ0IHRoYXQgbWF0Y2hlZAorCQkgKi8KKwkJbWNoX21lbW1vdmUobmV3X2VuZCwgc3ViX2ZpcnN0bGluZSArIGNvcHljb2wsIChzaXplX3QpaSk7CisJCW5ld19lbmQgKz0gaTsKKworCQkodm9pZCl2aW1fcmVnc3ViX211bHRpKCZyZWdtYXRjaCwgc3ViX2ZpcnN0bG51bSwKKwkJCQkJICAgc3ViLCBuZXdfZW5kLCBUUlVFLCBwX21hZ2ljLCBUUlVFKTsKKwkJc3ViX25zdWJzKys7CisJCWRpZF9zdWIgPSBUUlVFOworCisJCS8qIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHRvIGF2b2lkIHRoYXQgaXQKKwkJICogaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxpbmUgYWZ0ZXIgdGhlIHN1YnN0aXR1dGlvbi4gKi8KKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCisJCS8qIEZvciBhIG11bHRpLWxpbmUgbWF0Y2gsIG1ha2UgYSBjb3B5IG9mIHRoZSBsYXN0IG1hdGNoZWQKKwkJICogbGluZSBhbmQgY29udGludWUgaW4gdGhhdCBvbmUuICovCisJCWlmIChubWF0Y2ggPiAxKQorCQl7CisJCSAgICBzdWJfZmlyc3RsbnVtICs9IG5tYXRjaCAtIDE7CisJCSAgICB2aW1fZnJlZShzdWJfZmlyc3RsaW5lKTsKKwkJICAgIHN1Yl9maXJzdGxpbmUgPSB2aW1fc3Ryc2F2ZShtbF9nZXQoc3ViX2ZpcnN0bG51bSkpOworCQkgICAgLyogV2hlbiBnb2luZyBiZXlvbmQgdGhlIGxhc3QgbGluZSwgc3RvcCBzdWJzdGl0dXRpbmcuICovCisJCSAgICBpZiAoc3ViX2ZpcnN0bG51bSA8PSBsaW5lMikKKwkJCWRvX2FnYWluID0gVFJVRTsKKwkJICAgIGVsc2UKKwkJCWRvX2FsbCA9IEZBTFNFOworCQl9CisKKwkJLyogUmVtZW1iZXIgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29waWVkLiAqLworCQljb3B5Y29sID0gcmVnbWF0Y2guZW5kcG9zWzBdLmNvbDsKKworCQkvKgorCQkgKiBOb3cgdGhlIHRyaWNrIGlzIHRvIHJlcGxhY2UgQ1RSTC1NIGNoYXJzIHdpdGggYSByZWFsIGxpbmUKKwkJICogYnJlYWsuICBUaGlzIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBpbnNlcnQgYSBDVFJMLU0gaW4KKwkJICogdGhlIHRleHQuICBUaGUgbGluZSBicmVhayBjYW4gYmUgYXZvaWRlZCBieSBwcmVjZWRpbmcgdGhlCisJCSAqIENUUkwtTSB3aXRoIGEgYmFja3NsYXNoLiAgVG8gYmUgYWJsZSB0byBpbnNlcnQgYSBiYWNrc2xhc2gsCisJCSAqIHRoZXkgbXVzdCBiZSBkb3VibGVkIGluIHRoZSBzdHJpbmcgYW5kIGFyZSBoYWx2ZWQgaGVyZS4KKwkJICogVGhhdCBpcyBWaSBjb21wYXRpYmxlLgorCQkgKi8KKwkJZm9yIChwMSA9IG5ld19lbmQ7ICpwMTsgKytwMSkKKwkJeworCQkgICAgaWYgKHAxWzBdID09ICdcXCcgJiYgcDFbMV0gIT0gTlVMKSAgLyogcmVtb3ZlIGJhY2tzbGFzaCAqLworCQkJbWNoX21lbW1vdmUocDEsIHAxICsgMSwgU1RSTEVOKHAxKSk7CisJCSAgICBlbHNlIGlmICgqcDEgPT0gQ0FSKQorCQkgICAgeworCQkJaWYgKHVfaW5zc3ViKGxudW0pID09IE9LKSAgIC8qIHByZXBhcmUgZm9yIHVuZG8gKi8KKwkJCXsKKwkJCSAgICAqcDEgPSBOVUw7CQkgICAgLyogdHJ1bmNhdGUgdXAgdG8gdGhlIENSICovCisJCQkgICAgbWxfYXBwZW5kKGxudW0gLSAxLCBuZXdfc3RhcnQsCisJCQkJCShjb2xucl9UKShwMSAtIG5ld19zdGFydCArIDEpLCBGQUxTRSk7CisJCQkgICAgbWFya19hZGp1c3QobG51bSArIDEsIChsaW5lbnJfVClNQVhMTlVNLCAxTCwgMEwpOworCQkJICAgIGlmIChkb19hc2spCisJCQkJYXBwZW5kZWRfbGluZXMobG51bSAtIDEsIDFMKTsKKwkJCSAgICBlbHNlCisJCQkgICAgeworCQkJCWlmIChmaXJzdF9saW5lID09IDApCisJCQkJICAgIGZpcnN0X2xpbmUgPSBsbnVtOworCQkJCWxhc3RfbGluZSA9IGxudW0gKyAxOworCQkJICAgIH0KKwkJCSAgICAvKiBBbGwgbGluZSBudW1iZXJzIGluY3JlYXNlLiAqLworCQkJICAgICsrc3ViX2ZpcnN0bG51bTsKKwkJCSAgICArK2xudW07CisJCQkgICAgKytsaW5lMjsKKwkJCSAgICAvKiBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5ldyBsaW5lLCBsaWtlIFZpICovCisJCQkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCQkgICAgU1RSQ1BZKG5ld19zdGFydCwgcDEgKyAxKTsJLyogY29weSB0aGUgcmVzdCAqLworCQkJICAgIHAxID0gbmV3X3N0YXJ0IC0gMTsKKwkJCX0KKwkJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBlbHNlIGlmIChoYXNfbWJ5dGUpCisJCQlwMSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHAxKSAtIDE7CisjZW5kaWYKKwkJfQorCisJCS8qCisJCSAqIDQuIElmIGRvX2FsbCBpcyBzZXQsIGZpbmQgbmV4dCBtYXRjaC4KKwkJICogUHJldmVudCBlbmRsZXNzIGxvb3Agd2l0aCBwYXR0ZXJucyB0aGF0IG1hdGNoIGVtcHR5CisJCSAqIHN0cmluZ3MsIGUuZy4gOnMvJC9wYXQvZyBvciA6cy9bYS16XSogLygmKS9nLgorCQkgKiBCdXQgIjpzL1xuLyMvIiBpcyBPSy4KKwkJICovCitza2lwOgorCQkvKiBXZSBhbHJlYWR5IGtub3cgdGhhdCB3ZSBkaWQgdGhlIGxhc3Qgc3Vic3Qgd2hlbiB3ZSBhcmUgYXQKKwkJICogdGhlIGVuZCBvZiB0aGUgbGluZSwgZXhjZXB0IHRoYXQgYSBwYXR0ZXJuIGxpa2UKKwkJICogImJhclx8XG5mb28iIG1heSBtYXRjaCBhdCB0aGUgTlVMLiAqLworCQlsYXN0b25lID0gKChzdWJfZmlyc3RsaW5lW21hdGNoY29sXSA9PSBOVUwgJiYgbm1hdGNoIDw9IDEKKwkJCQkJICAgJiYgIXJlX211bHRpbGluZShyZWdtYXRjaC5yZWdwcm9nKSkKKwkJCSAgICAgfHwgZ290X2ludCB8fCBnb3RfcXVpdCB8fCAhKGRvX2FsbCB8fCBkb19hZ2FpbikpOworCQlubWF0Y2ggPSAtMTsKKworCQkvKgorCQkgKiBSZXBsYWNlIHRoZSBsaW5lIGluIHRoZSBidWZmZXIgd2hlbiBuZWVkZWQuICBUaGlzIGlzCisJCSAqIHNraXBwZWQgd2hlbiB0aGVyZSBhcmUgbW9yZSBtYXRjaGVzLgorCQkgKiBUaGUgY2hlY2sgZm9yIG5tYXRjaF90bCBpcyBuZWVkZWQgZm9yIHdoZW4gbXVsdGktbGluZQorCQkgKiBtYXRjaGluZyBtdXN0IHJlcGxhY2UgdGhlIGxpbmVzIGJlZm9yZSB0cnlpbmcgdG8gZG8gYW5vdGhlcgorCQkgKiBtYXRjaCwgb3RoZXJ3aXNlICJcQDw9IiB3b24ndCB3b3JrLgorCQkgKiBXaGVuIGFza2luZyB0aGUgdXNlciB3ZSBsaWtlIHRvIHNob3cgdGhlIGFscmVhZHkgcmVwbGFjZWQKKwkJICogdGV4dCwgYnV0IGRvbid0IGRvIGl0IHdoZW4gIlw8QD0iIG9yICJcPEAhIiBpcyB1c2VkLCBpdAorCQkgKiBjaGFuZ2VzIHdoYXQgbWF0Y2hlcy4KKwkJICovCisJCWlmIChsYXN0b25lCisJCQl8fCAoZG9fYXNrICYmICFyZV9sb29rYmVoaW5kKHJlZ21hdGNoLnJlZ3Byb2cpKQorCQkJfHwgbm1hdGNoX3RsID4gMAorCQkJfHwgKG5tYXRjaCA9IHZpbV9yZWdleGVjX211bHRpKCZyZWdtYXRjaCwgY3Vyd2luLAorCQkJCSAgICAgICBjdXJidWYsIHN1Yl9maXJzdGxudW0sIG1hdGNoY29sKSkgPT0gMCkKKwkJeworCQkgICAgaWYgKG5ld19zdGFydCAhPSBOVUxMKQorCQkgICAgeworCQkJLyoKKwkJCSAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIHRoYXQgZGlkbid0IG1hdGNoLgorCQkJICogIm1hdGNoY29sIiBoYXMgdG8gYmUgYWRqdXN0ZWQsIHdlIHVzZSB0aGUgZW5kIG9mCisJCQkgKiB0aGUgbGluZSBhcyByZWZlcmVuY2UsIGJlY2F1c2UgdGhlIHN1YnN0aXR1dGUgbWF5CisJCQkgKiBoYXZlIGNoYW5nZWQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgU2FtZSBmb3IKKwkJCSAqICJwcmV2X21hdGNoY29sIi4KKwkJCSAqLworCQkJU1RSQ0FUKG5ld19zdGFydCwgc3ViX2ZpcnN0bGluZSArIGNvcHljb2wpOworCQkJbWF0Y2hjb2wgPSAoY29sbnJfVClTVFJMRU4oc3ViX2ZpcnN0bGluZSkgLSBtYXRjaGNvbDsKKwkJCXByZXZfbWF0Y2hjb2wgPSAoY29sbnJfVClTVFJMRU4oc3ViX2ZpcnN0bGluZSkKKwkJCQkJCQkgICAgICAtIHByZXZfbWF0Y2hjb2w7CisKKwkJCWlmICh1X3NhdmVzdWIobG51bSkgIT0gT0spCisJCQkgICAgYnJlYWs7CisJCQltbF9yZXBsYWNlKGxudW0sIG5ld19zdGFydCwgVFJVRSk7CisKKwkJCWlmIChubWF0Y2hfdGwgPiAwKQorCQkJeworCQkJICAgIC8qCisJCQkgICAgICogTWF0Y2hlZCBsaW5lcyBoYXZlIG5vdyBiZWVuIHN1YnN0aXR1dGVkIGFuZCBhcmUKKwkJCSAgICAgKiB1c2VsZXNzLCBkZWxldGUgdGhlbS4gIFRoZSBwYXJ0IGFmdGVyIHRoZSBtYXRjaAorCQkJICAgICAqIGhhcyBiZWVuIGFwcGVuZGVkIHRvIG5ld19zdGFydCwgd2UgZG9uJ3QgbmVlZAorCQkJICAgICAqIGl0IGluIHRoZSBidWZmZXIuCisJCQkgICAgICovCisJCQkgICAgKytsbnVtOworCQkJICAgIGlmICh1X3NhdmVkZWwobG51bSwgbm1hdGNoX3RsKSAhPSBPSykKKwkJCQlicmVhazsKKwkJCSAgICBmb3IgKGkgPSAwOyBpIDwgbm1hdGNoX3RsOyArK2kpCisJCQkJbWxfZGVsZXRlKGxudW0sIChpbnQpRkFMU0UpOworCQkJICAgIG1hcmtfYWRqdXN0KGxudW0sIGxudW0gKyBubWF0Y2hfdGwgLSAxLAorCQkJCQkJICAgKGxvbmcpTUFYTE5VTSwgLW5tYXRjaF90bCk7CisJCQkgICAgaWYgKGRvX2FzaykKKwkJCQlkZWxldGVkX2xpbmVzKGxudW0sIG5tYXRjaF90bCk7CisJCQkgICAgLS1sbnVtOworCQkJICAgIGxpbmUyIC09IG5tYXRjaF90bDsgLyogbnIgb2YgbGluZXMgZGVjcmVhc2VzICovCisJCQkgICAgbm1hdGNoX3RsID0gMDsKKwkJCX0KKworCQkJLyogV2hlbiBhc2tpbmcsIHVuZG8gaXMgc2F2ZWQgZWFjaCB0aW1lLCBtdXN0IGFsc28gc2V0CisJCQkgKiBjaGFuZ2VkIGZsYWcgZWFjaCB0aW1lLiAqLworCQkJaWYgKGRvX2FzaykKKwkJCSAgICBjaGFuZ2VkX2J5dGVzKGxudW0sIDApOworCQkJZWxzZQorCQkJeworCQkJICAgIGlmIChmaXJzdF9saW5lID09IDApCisJCQkJZmlyc3RfbGluZSA9IGxudW07CisJCQkgICAgbGFzdF9saW5lID0gbG51bSArIDE7CisJCQl9CisKKwkJCXN1Yl9maXJzdGxudW0gPSBsbnVtOworCQkJdmltX2ZyZWUoc3ViX2ZpcnN0bGluZSk7ICAgIC8qIGZyZWUgdGhlIHRlbXAgYnVmZmVyICovCisJCQlzdWJfZmlyc3RsaW5lID0gbmV3X3N0YXJ0OworCQkJbmV3X3N0YXJ0ID0gTlVMTDsKKwkJCW1hdGNoY29sID0gKGNvbG5yX1QpU1RSTEVOKHN1Yl9maXJzdGxpbmUpIC0gbWF0Y2hjb2w7CisJCQlwcmV2X21hdGNoY29sID0gKGNvbG5yX1QpU1RSTEVOKHN1Yl9maXJzdGxpbmUpCisJCQkJCQkJICAgICAgLSBwcmV2X21hdGNoY29sOworCQkJY29weWNvbCA9IDA7CisJCSAgICB9CisJCSAgICBpZiAobm1hdGNoID09IC0xICYmICFsYXN0b25lKQorCQkJbm1hdGNoID0gdmltX3JlZ2V4ZWNfbXVsdGkoJnJlZ21hdGNoLCBjdXJ3aW4sIGN1cmJ1ZiwKKwkJCQkJCSAgICAgc3ViX2ZpcnN0bG51bSwgbWF0Y2hjb2wpOworCisJCSAgICAvKgorCQkgICAgICogNS4gYnJlYWsgaWYgdGhlcmUgaXNuJ3QgYW5vdGhlciBtYXRjaCBpbiB0aGlzIGxpbmUKKwkJICAgICAqLworCQkgICAgaWYgKG5tYXRjaCA8PSAwKQorCQkJYnJlYWs7CisJCX0KKworCQlsaW5lX2JyZWFrY2hlY2soKTsKKwkgICAgfQorCisJICAgIGlmIChkaWRfc3ViKQorCQkrK3N1Yl9ubGluZXM7CisJICAgIHZpbV9mcmVlKHN1Yl9maXJzdGxpbmUpOwkvKiBmcmVlIHRoZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBsaW5lICovCisJICAgIHN1Yl9maXJzdGxpbmUgPSBOVUxMOworCX0KKworCWxpbmVfYnJlYWtjaGVjaygpOworICAgIH0KKworICAgIGlmIChmaXJzdF9saW5lICE9IDApCisgICAgeworCS8qIE5lZWQgdG8gc3VidHJhY3QgdGhlIG51bWJlciBvZiBhZGRlZCBsaW5lcyBmcm9tICJsYXN0X2xpbmUiIHRvIGdldAorCSAqIHRoZSBsaW5lIG51bWJlciBiZWZvcmUgdGhlIGNoYW5nZSAoc2FtZSBhcyBhZGRpbmcgdGhlIG51bWJlciBvZgorCSAqIGRlbGV0ZWQgbGluZXMpLiAqLworCWkgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCAtIG9sZF9saW5lX2NvdW50OworCWNoYW5nZWRfbGluZXMoZmlyc3RfbGluZSwgMCwgbGFzdF9saW5lIC0gaSwgaSk7CisgICAgfQorCitvdXRvZm1lbToKKyAgICB2aW1fZnJlZShzdWJfZmlyc3RsaW5lKTsgLyogbWF5IGhhdmUgdG8gZnJlZSBhbGxvY2F0ZWQgY29weSBvZiB0aGUgbGluZSAqLworICAgIGlmIChzdWJfbnN1YnMpCisgICAgeworCS8qIFNldCB0aGUgJ1sgYW5kICddIG1hcmtzLiAqLworCWN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gZWFwLT5saW5lMTsKKwljdXJidWYtPmJfb3BfZW5kLmxudW0gPSBsaW5lMjsKKwljdXJidWYtPmJfb3Bfc3RhcnQuY29sID0gY3VyYnVmLT5iX29wX2VuZC5jb2wgPSAwOworCisJaWYgKCFnbG9iYWxfYnVzeSkKKwl7CisJICAgIGJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisJICAgIGlmICghZG9fc3ViX21zZygpICYmIGRvX2FzaykKKwkJTVNHKCIiKTsKKwl9CisJZWxzZQorCSAgICBnbG9iYWxfbmVlZF9iZWdpbmxpbmUgPSBUUlVFOworCWlmIChkb19wcmludCkKKwkgICAgcHJpbnRfbGluZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWdsb2JhbF9idXN5KQorICAgIHsKKwlpZiAoZ290X2ludCkJCS8qIGludGVycnVwdGVkICovCisJICAgIEVNU0coXyhlX2ludGVycikpOworCWVsc2UgaWYgKGdvdF9tYXRjaCkJLyogZGlkIGZpbmQgc29tZXRoaW5nIGJ1dCBub3RoaW5nIHN1YnN0aXR1dGVkICovCisJICAgIE1TRygiIik7CisJZWxzZSBpZiAoZG9fZXJyb3IpCS8qIG5vdGhpbmcgZm91bmQgKi8KKwkgICAgRU1TRzIoXyhlX3BhdG5vdGYyKSwgZ2V0X3NlYXJjaF9wYXQoKSk7CisgICAgfQorCisgICAgdmltX2ZyZWUocmVnbWF0Y2gucmVncHJvZyk7Cit9CisKKy8qCisgKiBHaXZlIG1lc3NhZ2UgZm9yIG51bWJlciBvZiBzdWJzdGl0dXRpb25zLgorICogQ2FuIGFsc28gYmUgdXNlZCBhZnRlciBhICI6Z2xvYmFsIiBjb21tYW5kLgorICogUmV0dXJuIFRSVUUgaWYgYSBtZXNzYWdlIHdhcyBnaXZlbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2RvX3N1Yl9tc2coKQoreworICAgIC8qCisgICAgICogT25seSByZXBvcnQgc3Vic3RpdHV0aW9ucyB3aGVuOgorICAgICAqIC0gbW9yZSB0aGFuICdyZXBvcnQnIHN1YnN0aXR1dGlvbnMKKyAgICAgKiAtIGNvbW1hbmQgd2FzIHR5cGVkIGJ5IHVzZXIsIG9yIG51bWJlciBvZiBjaGFuZ2VkIGxpbmVzID4gJ3JlcG9ydCcKKyAgICAgKiAtIGdpdmluZyBtZXNzYWdlcyBpcyBub3QgZGlzYWJsZWQgYnkgJ2xhenlyZWRyYXcnCisgICAgICovCisgICAgaWYgKHN1Yl9uc3VicyA+IHBfcmVwb3J0CisJICAgICYmIChLZXlUeXBlZCB8fCBzdWJfbmxpbmVzID4gMSB8fCBwX3JlcG9ydCA8IDEpCisJICAgICYmIG1lc3NhZ2luZygpKQorICAgIHsKKwlpZiAoZ290X2ludCkKKwkgICAgU1RSQ1BZKG1zZ19idWYsIF8oIihJbnRlcnJ1cHRlZCkgIikpOworCWVsc2UKKwkgICAgbXNnX2J1ZlswXSA9IE5VTDsKKwlpZiAoc3ViX25zdWJzID09IDEpCisJICAgIFNUUkNBVChtc2dfYnVmLCBfKCIxIHN1YnN0aXR1dGlvbiIpKTsKKwllbHNlCisJICAgIHNwcmludGYoKGNoYXIgKiltc2dfYnVmICsgU1RSTEVOKG1zZ19idWYpLCBfKCIlbGQgc3Vic3RpdHV0aW9ucyIpLAorCQkJCQkJCQkgICBzdWJfbnN1YnMpOworCWlmIChzdWJfbmxpbmVzID09IDEpCisJICAgIFNUUkNBVChtc2dfYnVmLCBfKCIgb24gMSBsaW5lIikpOworCWVsc2UKKwkgICAgc3ByaW50ZigoY2hhciAqKW1zZ19idWYgKyBTVFJMRU4obXNnX2J1ZiksIF8oIiBvbiAlbGQgbGluZXMiKSwKKwkJCQkJCQkgICAgKGxvbmcpc3ViX25saW5lcyk7CisJaWYgKG1zZyhtc2dfYnVmKSkKKwl7CisJICAgIC8qIHNhdmUgbWVzc2FnZSB0byBkaXNwbGF5IGl0IGFmdGVyIHJlZHJhdyAqLworCSAgICBzZXRfa2VlcF9tc2cobXNnX2J1Zik7CisJICAgIGtlZXBfbXNnX2F0dHIgPSAwOworCX0KKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKGdvdF9pbnQpCisgICAgeworCUVNU0coXyhlX2ludGVycikpOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgZ2xvYmFsIGNvbW1hbmQgb2YgdGhlIGZvcm06CisgKgorICogZy9wYXR0ZXJuL1ggOiBleGVjdXRlIFggb24gYWxsIGxpbmVzIHdoZXJlIHBhdHRlcm4gbWF0Y2hlcworICogdi9wYXR0ZXJuL1ggOiBleGVjdXRlIFggb24gYWxsIGxpbmVzIHdoZXJlIHBhdHRlcm4gZG9lcyBub3QgbWF0Y2gKKyAqCisgKiB3aGVyZSAnWCcgaXMgYW4gRVggY29tbWFuZAorICoKKyAqIFRoZSBjb21tYW5kIGNoYXJhY3RlciAoYXMgd2VsbCBhcyB0aGUgdHJhaWxpbmcgc2xhc2gpIGlzIG9wdGlvbmFsLCBhbmQKKyAqIGlzIGFzc3VtZWQgdG8gYmUgJ3AnIGlmIG1pc3NpbmcuCisgKgorICogVGhpcyBpcyBpbXBsZW1lbnRlZCBpbiB0d28gcGFzc2VzOiBmaXJzdCB3ZSBzY2FuIHRoZSBmaWxlIGZvciB0aGUgcGF0dGVybiBhbmQKKyAqIHNldCBhIG1hcmsgZm9yIGVhY2ggbGluZSB0aGF0IChub3QpIG1hdGNoZXMuIHNlY29uZGx5IHdlIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyAqIGZvciBlYWNoIGxpbmUgdGhhdCBoYXMgYSBtYXJrLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgYWZ0ZXIgZGVsZXRpbmcKKyAqIGxpbmVzIHdlIGRvIG5vdCBrbm93IHdoZXJlIHRvIHNlYXJjaCBmb3IgdGhlIG5leHQgbWF0Y2guCisgKi8KKyAgICB2b2lkCitleF9nbG9iYWwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogbGluZSBudW1iZXIgYWNjb3JkaW5nIHRvIG9sZCBzaXR1YXRpb24gKi8KKyAgICBpbnQJCW5kb25lOworICAgIGludAkJdHlwZTsJCS8qIGZpcnN0IGNoYXIgb2YgY21kOiAndicgb3IgJ2cnICovCisgICAgY2hhcl91CSpjbWQ7CQkvKiBjb21tYW5kIGFyZ3VtZW50ICovCisKKyAgICBjaGFyX3UJZGVsaW07CQkvKiBkZWxpbWl0ZXIsIG5vcm1hbGx5ICcvJyAqLworICAgIGNoYXJfdQkqcGF0OworICAgIHJlZ21tYXRjaF9UCXJlZ21hdGNoOworICAgIGludAkJbWF0Y2g7CisgICAgaW50CQl3aGljaF9wYXQ7CisKKyAgICBpZiAoZ2xvYmFsX2J1c3kpCisgICAgeworCUVNU0coXygiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIikpOwkvKiB3aWxsIGluY3JlbWVudCBnbG9iYWxfYnVzeSAqLworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZWFwLT5mb3JjZWl0KQkJICAgIC8qICI6Z2xvYmFsISIgaXMgbGlrZSAiOnZnbG9iYWwiICovCisJdHlwZSA9ICd2JzsKKyAgICBlbHNlCisJdHlwZSA9ICplYXAtPmNtZDsKKyAgICBjbWQgPSBlYXAtPmFyZzsKKyAgICB3aGljaF9wYXQgPSBSRV9MQVNUOwkgICAgLyogZGVmYXVsdDogdXNlIGxhc3QgdXNlZCByZWdleHAgKi8KKyAgICBzdWJfbnN1YnMgPSAwOworICAgIHN1Yl9ubGluZXMgPSAwOworCisgICAgLyoKKyAgICAgKiB1bmRvY3VtZW50ZWQgdmkgZmVhdHVyZToKKyAgICAgKgkiXC8iIGFuZCAiXD8iOiB1c2UgcHJldmlvdXMgc2VhcmNoIHBhdHRlcm4uCisgICAgICoJCSAiXCYiOiB1c2UgcHJldmlvdXMgc3Vic3RpdHV0ZSBwYXR0ZXJuLgorICAgICAqLworICAgIGlmICgqY21kID09ICdcXCcpCisgICAgeworCSsrY21kOworCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiLz8mIiwgKmNtZCkgPT0gTlVMTCkKKwl7CisJICAgIEVNU0coXyhlX2JhY2tzbGFzaCkpOworCSAgICByZXR1cm47CisJfQorCWlmICgqY21kID09ICcmJykKKwkgICAgd2hpY2hfcGF0ID0gUkVfU1VCU1Q7CS8qIHVzZSBwcmV2aW91cyBzdWJzdGl0dXRlIHBhdHRlcm4gKi8KKwllbHNlCisJICAgIHdoaWNoX3BhdCA9IFJFX1NFQVJDSDsJLyogdXNlIHByZXZpb3VzIHNlYXJjaCBwYXR0ZXJuICovCisJKytjbWQ7CisJcGF0ID0gKGNoYXJfdSAqKSIiOworICAgIH0KKyAgICBlbHNlIGlmICgqY21kID09IE5VTCkKKyAgICB7CisJRU1TRyhfKCJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZGVsaW0gPSAqY21kOwkJLyogZ2V0IHRoZSBkZWxpbWl0ZXIgKi8KKwlpZiAoZGVsaW0pCisJICAgICsrY21kOwkJLyogc2tpcCBkZWxpbWl0ZXIgaWYgdGhlcmUgaXMgb25lICovCisJcGF0ID0gY21kOwkJLyogcmVtZW1iZXIgc3RhcnQgb2YgcGF0dGVybiAqLworCWNtZCA9IHNraXBfcmVnZXhwKGNtZCwgZGVsaW0sIHBfbWFnaWMsICZlYXAtPmFyZyk7CisJaWYgKGNtZFswXSA9PSBkZWxpbSkJCSAgICAvKiBlbmQgZGVsaW1pdGVyIGZvdW5kICovCisJICAgICpjbWQrKyA9IE5VTDsJCSAgICAvKiByZXBsYWNlIGl0IHdpdGggYSBOVUwgKi8KKyAgICB9CisKKyNpZmRlZiBGRUFUX0ZLTUFQCS8qIHdoZW4gaW4gRmFyc2kgbW9kZSwgcmV2ZXJzZSB0aGUgY2hhcmFjdGVyIGZsb3cgKi8KKyAgICBpZiAocF9hbHRrZXltYXAgJiYgY3Vyd2luLT53X3BfcmwpCisJbHJGc3dhcChwYXQsMCk7CisjZW5kaWYKKworICAgIGlmIChzZWFyY2hfcmVnY29tcChwYXQsIFJFX0JPVEgsIHdoaWNoX3BhdCwgU0VBUkNIX0hJUywgJnJlZ21hdGNoKSA9PSBGQUlMKQorICAgIHsKKwlFTVNHKF8oZV9pbnZjbWQpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBwYXNzIDE6IHNldCBtYXJrcyBmb3IgZWFjaCAobm90KSBtYXRjaGluZyBsaW5lCisgICAgICovCisgICAgbmRvbmUgPSAwOworICAgIGZvciAobG51bSA9IGVhcC0+bGluZTE7IGxudW0gPD0gZWFwLT5saW5lMiAmJiAhZ290X2ludDsgKytsbnVtKQorICAgIHsKKwkvKiBhIG1hdGNoIG9uIHRoaXMgbGluZT8gKi8KKwltYXRjaCA9IHZpbV9yZWdleGVjX211bHRpKCZyZWdtYXRjaCwgY3Vyd2luLCBjdXJidWYsIGxudW0sIChjb2xucl9UKTApOworCWlmICgodHlwZSA9PSAnZycgJiYgbWF0Y2gpIHx8ICh0eXBlID09ICd2JyAmJiAhbWF0Y2gpKQorCXsKKwkgICAgbWxfc2V0bWFya2VkKGxudW0pOworCSAgICBuZG9uZSsrOworCX0KKwlsaW5lX2JyZWFrY2hlY2soKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHBhc3MgMjogZXhlY3V0ZSB0aGUgY29tbWFuZCBmb3IgZWFjaCBsaW5lIHRoYXQgaGFzIGJlZW4gbWFya2VkCisgICAgICovCisgICAgaWYgKGdvdF9pbnQpCisJTVNHKF8oZV9pbnRlcnIpKTsKKyAgICBlbHNlIGlmIChuZG9uZSA9PSAwKQorICAgIHsKKwlpZiAodHlwZSA9PSAndicpCisJICAgIG1zZ19zdHIoKGNoYXJfdSAqKV8oIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiKSwgcGF0KTsKKwllbHNlCisJICAgIG1zZ19zdHIoKGNoYXJfdSAqKV8oZV9wYXRub3RmMiksIHBhdCk7CisgICAgfQorICAgIGVsc2UKKwlnbG9iYWxfZXhlKGNtZCk7CisKKyAgICBtbF9jbGVhcm1hcmtlZCgpOwkgICAvKiBjbGVhciByZXN0IG9mIHRoZSBtYXJrcyAqLworICAgIHZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworfQorCisvKgorICogRXhlY3V0ZSAiY21kIiBvbiBsaW5lcyBtYXJrZWQgd2l0aCBtbF9zZXRtYXJrZWQoKS4KKyAqLworICAgIHZvaWQKK2dsb2JhbF9leGUoY21kKQorICAgIGNoYXJfdQkqY21kOworeworICAgIGxpbmVucl9UCW9sZF9sY291bnQ7CS8qIGJfbWwubWxfbGluZV9jb3VudCBiZWZvcmUgdGhlIGNvbW1hbmQgKi8KKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogbGluZSBudW1iZXIgYWNjb3JkaW5nIHRvIG9sZCBzaXR1YXRpb24gKi8KKworICAgIC8qCisgICAgICogU2V0IGN1cnJlbnQgcG9zaXRpb24gb25seSBvbmNlIGZvciBhIGdsb2JhbCBjb21tYW5kLgorICAgICAqIElmIGdsb2JhbF9idXN5IGlzIHNldCwgc2V0cGNtYXJrKCkgd2lsbCBub3QgZG8gYW55dGhpbmcuCisgICAgICogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGdsb2JhbF9idXN5IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgICAgICovCisgICAgc2V0cGNtYXJrKCk7CisKKyAgICAvKiBXaGVuIHRoZSBjb21tYW5kIHdyaXRlcyBhIG1lc3NhZ2UsIGRvbid0IG92ZXJ3cml0ZSB0aGUgY29tbWFuZC4gKi8KKyAgICBtc2dfZGlkb3V0ID0gVFJVRTsKKworICAgIGdsb2JhbF9uZWVkX2JlZ2lubGluZSA9IEZBTFNFOworICAgIGdsb2JhbF9idXN5ID0gMTsKKyAgICBvbGRfbGNvdW50ID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisgICAgd2hpbGUgKCFnb3RfaW50ICYmIChsbnVtID0gbWxfZmlyc3RtYXJrZWQoKSkgIT0gMCAmJiBnbG9iYWxfYnVzeSA9PSAxKQorICAgIHsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwlpZiAoKmNtZCA9PSBOVUwgfHwgKmNtZCA9PSAnXG4nKQorCSAgICBkb19jbWRsaW5lKChjaGFyX3UgKikicCIsIE5VTEwsIE5VTEwsIERPQ01EX05PV0FJVCk7CisJZWxzZQorCSAgICBkb19jbWRsaW5lKGNtZCwgTlVMTCwgTlVMTCwgRE9DTURfTk9XQUlUKTsKKwl1aV9icmVha2NoZWNrKCk7CisgICAgfQorCisgICAgZ2xvYmFsX2J1c3kgPSAwOworICAgIGlmIChnbG9iYWxfbmVlZF9iZWdpbmxpbmUpCisJYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKyAgICBlbHNlCisJY2hlY2tfY3Vyc29yKCk7CS8qIGN1cnNvciBtYXkgYmUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKworICAgIC8qIElmIGl0IGxvb2tzIGxpa2Ugbm8gbWVzc2FnZSB3YXMgd3JpdHRlbiwgYWxsb3cgb3ZlcndyaXRpbmcgdGhlCisgICAgICogY29tbWFuZCB3aXRoIHRoZSByZXBvcnQgZm9yIG51bWJlciBvZiBjaGFuZ2VzLiAqLworICAgIGlmIChtc2dfY29sID09IDAgJiYgbXNnX3Njcm9sbGVkID09IDApCisJbXNnX2RpZG91dCA9IEZBTFNFOworCisgICAgLyogSWYgc3Vic2l0dXRlcyBkb25lLCByZXBvcnQgbnVtYmVyIG9mIHN1YnN0aXR1ZXMsIG90aGVyd2lzZSByZXBvcnQKKyAgICAgKiBudW1iZXIgb2YgZXh0cmEgb3IgZGVsZXRlZCBsaW5lcy4gKi8KKyAgICBpZiAoIWRvX3N1Yl9tc2coKSkKKwltc2dtb3JlKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gb2xkX2xjb3VudCk7Cit9CisKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKyAgICBpbnQKK3JlYWRfdmltaW5mb19zdWJfc3RyaW5nKHZpcnAsIGZvcmNlKQorICAgIHZpcl9UCSp2aXJwOworICAgIGludAkJZm9yY2U7Cit7CisgICAgaWYgKG9sZF9zdWIgIT0gTlVMTCAmJiBmb3JjZSkKKwl2aW1fZnJlZShvbGRfc3ViKTsKKyAgICBpZiAoZm9yY2UgfHwgb2xkX3N1YiA9PSBOVUxMKQorCW9sZF9zdWIgPSB2aW1pbmZvX3JlYWRzdHJpbmcodmlycCwgMSwgVFJVRSk7CisgICAgcmV0dXJuIHZpbWluZm9fcmVhZGxpbmUodmlycCk7Cit9CisKKyAgICB2b2lkCit3cml0ZV92aW1pbmZvX3N1Yl9zdHJpbmcoZnApCisgICAgRklMRSAgICAqZnA7Cit7CisgICAgaWYgKGdldF92aW1pbmZvX3BhcmFtZXRlcignLycpICE9IDAgJiYgb2xkX3N1YiAhPSBOVUxMKQorICAgIHsKKwlmcHJpbnRmKGZwLCBfKCJcbiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiQiKSk7CisJdmltaW5mb193cml0ZXN0cmluZyhmcCwgb2xkX3N1Yik7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfVklNSU5GTyAqLworCisjaWYgKGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNldCB1cCBmb3IgYSB0YWdwcmV2aWV3LgorICovCisgICAgdm9pZAorcHJlcGFyZV90YWdwcmV2aWV3KCkKK3sKKyAgICB3aW5fVAkqd3A7CisKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworIyBlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHJldmlldyB3aW5kb3cgb3BlbiwgdXNlIHRoYXQgb25lLgorICAgICAqLworICAgIGlmICghY3Vyd2luLT53X3BfcHZ3KQorICAgIHsKKwlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwkgICAgaWYgKHdwLT53X3BfcHZ3KQorCQlicmVhazsKKwlpZiAod3AgIT0gTlVMTCkKKwkgICAgd2luX2VudGVyKHdwLCBUUlVFKTsKKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyBvcGVuIHlldC4gIENyZWF0ZSBvbmUuCisJICAgICAqLworCSAgICBpZiAod2luX3NwbGl0KGdfZG9fdGFncHJldmlldyA+IDAgPyBnX2RvX3RhZ3ByZXZpZXcgOiAwLCAwKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCQlyZXR1cm47CisJICAgIGN1cndpbi0+d19wX3B2dyA9IFRSVUU7CisJICAgIGN1cndpbi0+d19wX3dmaCA9IFRSVUU7CisjIGlmZGVmIEZFQVRfU0NST0xMQklORAorCSAgICBjdXJ3aW4tPndfcF9zY2IgPSBGQUxTRTsJICAgIC8qIGRvbid0IHRha2Ugb3ZlciAnc2Nyb2xsYmluZCcgKi8KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9ESUZGCisJICAgIGN1cndpbi0+d19wX2RpZmYgPSBGQUxTRTsJICAgIC8qIG5vICdkaWZmJyAqLworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgY3Vyd2luLT53X3BfZmRjID0gMDsJICAgIC8qIG5vICdmb2xkY29sdW1uJyAqLworIyBlbmRpZgorCX0KKyAgICB9Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiAiOmhlbHAiOiBvcGVuIGEgcmVhZC1vbmx5IHdpbmRvdyBvbiBhIGhlbHAgZmlsZQorICovCisgICAgdm9pZAorZXhfaGVscChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnOworICAgIGNoYXJfdQkqdGFnOworICAgIEZJTEUJKmhlbHBmZDsJLyogZmlsZSBkZXNjcmlwdG9yIG9mIGhlbHAgZmlsZSAqLworICAgIGludAkJbjsKKyAgICBpbnQJCWk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgd2luX1QJKndwOworI2VuZGlmCisgICAgaW50CQludW1fbWF0Y2hlczsKKyAgICBjaGFyX3UJKiptYXRjaGVzOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWVtcHR5X2ZudW0gPSAwOworICAgIGludAkJYWx0X2ZudW0gPSAwOworICAgIGJ1Zl9UCSpidWY7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpsYW5nID0gTlVMTDsKKyNlbmRpZgorCisgICAgaWYgKGVhcCAhPSBOVUxMKQorICAgIHsKKwkvKgorCSAqIEEgIjpoZWxwIiBjb21tYW5kIGVuZHMgYXQgdGhlIGZpcnN0IExGLCBvciBhdCBhICd8JyB0aGF0IGlzCisJICogZm9sbG93ZWQgYnkgc29tZSB0ZXh0LiAgU2V0IG5leHRjbWQgdG8gdGhlIGZvbGxvd2luZyBjb21tYW5kLgorCSAqLworCWZvciAoYXJnID0gZWFwLT5hcmc7ICphcmc7ICsrYXJnKQorCXsKKwkgICAgaWYgKCphcmcgPT0gJ1xuJyB8fCAqYXJnID09ICdccicKKwkJICAgIHx8ICgqYXJnID09ICd8JyAmJiBhcmdbMV0gIT0gTlVMICYmIGFyZ1sxXSAhPSAnfCcpKQorCSAgICB7CisJCSphcmcrKyA9IE5VTDsKKwkJZWFwLT5uZXh0Y21kID0gYXJnOworCQlicmVhazsKKwkgICAgfQorCX0KKwlhcmcgPSBlYXAtPmFyZzsKKworCWlmIChlYXAtPmZvcmNlaXQgJiYgKmFyZyA9PSBOVUwpCisJeworCSAgICBFTVNHKF8oIkU0Nzg6IERvbid0IHBhbmljISIpKTsKKwkgICAgcmV0dXJuOworCX0KKworCWlmIChlYXAtPnNraXApCSAgICAvKiBub3QgZXhlY3V0aW5nIGNvbW1hbmRzICovCisJICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorCWFyZyA9IChjaGFyX3UgKikiIjsKKworICAgIC8qIHJlbW92ZSB0cmFpbGluZyBibGFua3MgKi8KKyAgICBwID0gYXJnICsgU1RSTEVOKGFyZykgLSAxOworICAgIHdoaWxlIChwID4gYXJnICYmIHZpbV9pc3doaXRlKCpwKSAmJiBwWy0xXSAhPSAnXFwnKQorCSpwLS0gPSBOVUw7CisKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKyAgICAvKiBDaGVjayBmb3IgYSBzcGVjaWZpZWQgbGFuZ3VhZ2UgKi8KKyAgICBsZW4gPSBTVFJMRU4oYXJnKTsKKyAgICBpZiAobGVuID49IDMgJiYgYXJnW2xlbiAtIDNdID09ICdAJyAmJiBBU0NJSV9JU0FMUEhBKGFyZ1tsZW4gLSAyXSkKKwkJCQkJICAgICAgICYmIEFTQ0lJX0lTQUxQSEEoYXJnW2xlbiAtIDFdKSkKKyAgICB7CisJbGFuZyA9IGFyZyArIGxlbiAtIDI7CisJbGFuZ1stMV0gPSBOVUw7CQkvKiByZW1vdmUgdGhlICdAJyAqLworICAgIH0KKyNlbmRpZgorCisgICAgLyogV2hlbiBubyBhcmd1bWVudCBnaXZlbiBnbyB0byB0aGUgaW5kZXguICovCisgICAgaWYgKCphcmcgPT0gTlVMKQorCWFyZyA9IChjaGFyX3UgKikiaGVscC50eHQiOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoIGZvciB0aGUgYXJndW1lbnQuCisgICAgICovCisgICAgbiA9IGZpbmRfaGVscF90YWdzKGFyZywgJm51bV9tYXRjaGVzLCAmbWF0Y2hlcywKKwkJCQkJCSBlYXAgIT0gTlVMTCAmJiBlYXAtPmZvcmNlaXQpOworCisgICAgaSA9IDA7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgaWYgKG4gIT0gRkFJTCAmJiBsYW5nICE9IE5VTEwpCisJLyogRmluZCBmaXJzdCBpdGVtIHdpdGggdGhlIHJlcXVlc3RlZCBsYW5ndWFnZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7ICsraSkKKwl7CisJICAgIGxlbiA9IFNUUkxFTihtYXRjaGVzW2ldKTsKKwkgICAgaWYgKGxlbiA+IDMgJiYgbWF0Y2hlc1tpXVtsZW4gLSAzXSA9PSAnQCcKKwkJCQkgICYmIFNUUklDTVAobWF0Y2hlc1tpXSArIGxlbiAtIDIsIGxhbmcpID09IDApCisJCWJyZWFrOworCX0KKyNlbmRpZgorICAgIGlmIChpID49IG51bV9tYXRjaGVzIHx8IG4gPT0gRkFJTCkKKyAgICB7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisJaWYgKGxhbmcgIT0gTlVMTCkKKwkgICAgRU1TRzMoXygiRTY2MTogU29ycnksIG5vICclcycgaGVscCBmb3IgJXMiKSwgbGFuZywgYXJnKTsKKwllbHNlCisjZW5kaWYKKwkgICAgRU1TRzIoXygiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIiksIGFyZyk7CisJaWYgKG4gIT0gRkFJTCkKKwkgICAgRnJlZVdpbGQobnVtX21hdGNoZXMsIG1hdGNoZXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBUaGUgZmlyc3QgbWF0Y2ggKGluIHRoZSByZXF1ZXN0ZWQgbGFuZ3VhZ2UpIGlzIHRoZSBiZXN0IG1hdGNoLiAqLworICAgIHRhZyA9IHZpbV9zdHJzYXZlKG1hdGNoZXNbaV0pOworICAgIEZyZWVXaWxkKG51bV9tYXRjaGVzLCBtYXRjaGVzKTsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBSZS11c2UgYW4gZXhpc3RpbmcgaGVscCB3aW5kb3cgb3Igb3BlbiBhIG5ldyBvbmUuCisgICAgICovCisgICAgaWYgKCFjdXJ3aW4tPndfYnVmZmVyLT5iX2hlbHApCisgICAgeworI2lmZGVmIEZFQVRfV0lORE9XUworCWZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCSAgICBpZiAod3AtPndfYnVmZmVyICE9IE5VTEwgJiYgd3AtPndfYnVmZmVyLT5iX2hlbHApCisJCWJyZWFrOworCWlmICh3cCAhPSBOVUxMICYmIHdwLT53X2J1ZmZlci0+Yl9ud2luZG93cyA+IDApCisJICAgIHdpbl9lbnRlcih3cCwgVFJVRSk7CisJZWxzZQorI2VuZGlmCisJeworCSAgICAvKgorCSAgICAgKiBUaGVyZSBpcyBubyBoZWxwIHdpbmRvdyB5ZXQuCisJICAgICAqIFRyeSB0byBvcGVuIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgImhlbHBmaWxlIiBvcHRpb24uCisJICAgICAqLworCSAgICBpZiAoKGhlbHBmZCA9IG1jaF9mb3BlbigoY2hhciAqKXBfaGYsIFJFQURCSU4pKSA9PSBOVUxMKQorCSAgICB7CisJCW1zZ19zdHIoKGNoYXJfdSAqKV8oIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIpLAorCQkJCQkJCQkJcF9oZik7CisJCWdvdG8gZXJyZXQ7CisJICAgIH0KKwkgICAgZmNsb3NlKGhlbHBmZCk7CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkgICAgLyogU3BsaXQgb2ZmIGhlbHAgd2luZG93OyBwdXQgaXQgYXQgZmFyIHRvcCBpZiBubyBwb3NpdGlvbgorCSAgICAgKiBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHdpbmRvdyBpcyB2ZXJ0aWNhbGx5IHNwbGl0IGFuZCBuYXJyb3cuICovCisJICAgIG4gPSBXU1BfSEVMUDsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgaWYgKGNtZG1vZC5zcGxpdCA9PSAwICYmIGN1cndpbi0+d193aWR0aCAhPSBDb2x1bW5zCisJCQkJCQkgICAgICAmJiBjdXJ3aW4tPndfd2lkdGggPCA4MCkKKwkJbiB8PSBXU1BfVE9QOworIyBlbmRpZgorCSAgICBpZiAod2luX3NwbGl0KDAsIG4pID09IEZBSUwpCisjZWxzZQorCSAgICAvKiB1c2UgY3VycmVudCB3aW5kb3cgKi8KKwkgICAgaWYgKCFjYW5fYWJhbmRvbihjdXJidWYsIEZBTFNFKSkKKyNlbmRpZgorCQlnb3RvIGVycmV0OworCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIGlmIChjdXJ3aW4tPndfaGVpZ2h0IDwgcF9oaCkKKwkJd2luX3NldGhlaWdodCgoaW50KXBfaGgpOworI2VuZGlmCisKKwkgICAgLyoKKwkgICAgICogT3BlbiBoZWxwIGZpbGUgKGRvX2VjbWQoKSB3aWxsIHNldCBiX2hlbHAgZmxhZywgcmVhZGZpbGUoKSB3aWxsCisJICAgICAqIHNldCBiX3Bfcm8gZmxhZykuCisJICAgICAqIFNldCB0aGUgYWx0ZXJuYXRlIGZpbGUgdG8gdGhlIHByZXZpb3VzbHkgZWRpdGVkIGZpbGUuCisJICAgICAqLworCSAgICBhbHRfZm51bSA9IGN1cmJ1Zi0+Yl9mbnVtOworCSAgICAodm9pZClkb19lY21kKDAsIE5VTEwsIE5VTEwsIE5VTEwsIEVDTURfTEFTVEwsCisJCQkJCQkgICBFQ01EX0hJREUgKyBFQ01EX1NFVF9IRUxQKTsKKwkgICAgY3Vyd2luLT53X2FsdF9mbnVtID0gYWx0X2ZudW07CisJICAgIGVtcHR5X2ZudW0gPSBjdXJidWYtPmJfZm51bTsKKwl9CisgICAgfQorCisgICAgaWYgKCFwX2ltKQorCXJlc3RhcnRfZWRpdCA9IDA7CSAgICAvKiBkb24ndCB3YW50IGluc2VydCBtb2RlIGluIGhlbHAgZmlsZSAqLworCisgICAgaWYgKHRhZyAhPSBOVUxMKQorCWRvX3RhZyh0YWcsIERUX0hFTFAsIDEsIEZBTFNFLCBUUlVFKTsKKworICAgIC8qIERlbGV0ZSB0aGUgZW1wdHkgYnVmZmVyIGlmIHdlJ3JlIG5vdCB1c2luZyBpdC4gKi8KKyAgICBpZiAoZW1wdHlfZm51bSAhPSAwICYmIGN1cmJ1Zi0+Yl9mbnVtICE9IGVtcHR5X2ZudW0pCisgICAgeworCWJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKGVtcHR5X2ZudW0pOworCWlmIChidWYgIT0gTlVMTCkKKwkgICAgd2lwZV9idWZmZXIoYnVmLCBUUlVFKTsKKyAgICB9CisKKyAgICAvKiBrZWVwIHRoZSBwcmV2aW91cyBhbHRlcm5hdGUgZmlsZSAqLworICAgIGlmIChhbHRfZm51bSAhPSAwICYmIGN1cndpbi0+d19hbHRfZm51bSA9PSBlbXB0eV9mbnVtKQorCWN1cndpbi0+d19hbHRfZm51bSA9IGFsdF9mbnVtOworCitlcnJldDoKKyAgICB2aW1fZnJlZSh0YWcpOworfQorCisKKy8qCisgKiBSZXR1cm4gYSBoZXVyaXN0aWMgaW5kaWNhdGluZyBob3cgd2VsbCB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMuICBUaGUKKyAqIHNtYWxsZXIgdGhlIG51bWJlciwgdGhlIGJldHRlciB0aGUgbWF0Y2guICBUaGlzIGlzIHRoZSBvcmRlciBvZiBwcmlvcml0aWVzLAorICogZnJvbSBiZXN0IG1hdGNoIHRvIHdvcnN0IG1hdGNoOgorICoJLSBNYXRjaCB3aXRoIGxlYXN0IGFscGhhLW51bWVyaWMgY2hhcmFjdGVycyBpcyBiZXR0ZXIuCisgKgktIE1hdGNoIHdpdGggbGVhc3QgdG90YWwgY2hhcmFjdGVycyBpcyBiZXR0ZXIuCisgKgktIE1hdGNoIHRvd2FyZHMgdGhlIHN0YXJ0IGlzIGJldHRlci4KKyAqCS0gTWF0Y2ggc3RhcnRpbmcgd2l0aCAiKyIgaXMgd29yc2UgKGZlYXR1cmUgaW5zdGVhZCBvZiBjb21tYW5kKQorICogQXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQgdGhlIG1hdGNoZWRfc3RyaW5nIHBhc3NlZCBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kIHRvCisgKiBtYXRjaCBzb21lIHN0cmluZyBmb3Igd2hpY2ggaGVscCBpcyByZXF1ZXN0ZWQuICB3ZWJiLgorICovCisgICAgaW50CitoZWxwX2hldXJpc3RpYyhtYXRjaGVkX3N0cmluZywgb2Zmc2V0LCB3cm9uZ19jYXNlKQorICAgIGNoYXJfdQkqbWF0Y2hlZF9zdHJpbmc7CisgICAgaW50CQlvZmZzZXQ7CQkJLyogb2Zmc2V0IGZvciBtYXRjaCAqLworICAgIGludAkJd3JvbmdfY2FzZTsJCS8qIG5vIG1hdGNoaW5nIGNhc2UgKi8KK3sKKyAgICBpbnQJCW51bV9sZXR0ZXJzOworICAgIGNoYXJfdQkqcDsKKworICAgIG51bV9sZXR0ZXJzID0gMDsKKyAgICBmb3IgKHAgPSBtYXRjaGVkX3N0cmluZzsgKnA7IHArKykKKwlpZiAoQVNDSUlfSVNBTE5VTSgqcCkpCisJICAgIG51bV9sZXR0ZXJzKys7CisKKyAgICAvKgorICAgICAqIE11bHRpcGx5IHRoZSBudW1iZXIgb2YgbGV0dGVycyBieSAxMDAgdG8gZ2l2ZSBpdCBhIG11Y2ggYmlnZ2VyCisgICAgICogd2VpZ2h0aW5nIHRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIElmIHRoZXJlIG9ubHkgaXMgYSBtYXRjaCB3aGlsZSBpZ25vcmluZyBjYXNlLCBhZGQgNTAwMC4KKyAgICAgKiBJZiB0aGUgbWF0Y2ggc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkLCBhZGQgMTAwMDAgdG8gcHV0IGl0CisgICAgICogc29tZXdoZXJlIGluIHRoZSBsYXN0IGhhbGYuCisgICAgICogSWYgdGhlIG1hdGNoIGlzIG1vcmUgdGhhbiAyIGNoYXJzIGZyb20gdGhlIHN0YXJ0LCBtdWx0aXBseSBieSAyMDAgdG8KKyAgICAgKiBwdXQgaXQgYWZ0ZXIgbWF0Y2hlcyBhdCB0aGUgc3RhcnQuCisgICAgICovCisgICAgaWYgKEFTQ0lJX0lTQUxOVU0obWF0Y2hlZF9zdHJpbmdbb2Zmc2V0XSkgJiYgb2Zmc2V0ID4gMAorCQkJCSAmJiBBU0NJSV9JU0FMTlVNKG1hdGNoZWRfc3RyaW5nW29mZnNldCAtIDFdKSkKKwlvZmZzZXQgKz0gMTAwMDA7CisgICAgZWxzZSBpZiAob2Zmc2V0ID4gMikKKwlvZmZzZXQgKj0gMjAwOworICAgIGlmICh3cm9uZ19jYXNlKQorCW9mZnNldCArPSA1MDAwOworICAgIC8qIEZlYXR1cmVzIGFyZSBsZXNzIGludGVyZXN0aW5nIHRoYW4gdGhlIHN1YmplY3RzIHRoZW1zZWx2ZXMsIGJ1dCAiKyIKKyAgICAgKiBhbG9uZSBpcyBub3QgYSBmZWF0dXJlLiAqLworICAgIGlmIChtYXRjaGVkX3N0cmluZ1swXSA9PSAnKycgJiYgbWF0Y2hlZF9zdHJpbmdbMV0gIT0gTlVMKQorCW9mZnNldCArPSAxMDA7CisgICAgcmV0dXJuIChpbnQpKDEwMCAqIG51bV9sZXR0ZXJzICsgU1RSTEVOKG1hdGNoZWRfc3RyaW5nKSArIG9mZnNldCk7Cit9CisKKy8qCisgKiBDb21wYXJlIGZ1bmN0aW9ucyBmb3IgcXNvcnQoKSBiZWxvdywgdGhhdCBjaGVja3MgdGhlIGhlbHAgaGV1cmlzdGljcyBudW1iZXIKKyAqIHRoYXQgaGFzIGJlZW4gcHV0IGFmdGVyIHRoZSB0YWduYW1lIGJ5IGZpbmRfdGFncygpLgorICovCisgICAgc3RhdGljIGludAorI2lmZGVmIF9fQk9STEFORENfXworX1JUTEVOVFJZRgorI2VuZGlmCitoZWxwX2NvbXBhcmUoczEsIHMyKQorICAgIGNvbnN0IHZvaWQJKnMxOworICAgIGNvbnN0IHZvaWQJKnMyOworeworICAgIGNoYXIgICAgKnAxOworICAgIGNoYXIgICAgKnAyOworCisgICAgcDEgPSAqKGNoYXIgKiopczEgKyBzdHJsZW4oKihjaGFyICoqKXMxKSArIDE7CisgICAgcDIgPSAqKGNoYXIgKiopczIgKyBzdHJsZW4oKihjaGFyICoqKXMyKSArIDE7CisgICAgcmV0dXJuIHN0cmNtcChwMSwgcDIpOworfQorCisvKgorICogRmluZCBhbGwgaGVscCB0YWdzIG1hdGNoaW5nICJhcmciLCBzb3J0IHRoZW0gYW5kIHJldHVybiBpbiBtYXRjaGVzW10sIHdpdGgKKyAqIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBpbiBudW1fbWF0Y2hlcy4KKyAqIFRoZSBtYXRjaGVzIHdpbGwgYmUgc29ydGVkIHdpdGggYSAiYmVzdCIgbWF0Y2ggYWxnb3JpdGhtLgorICogV2hlbiAia2VlcF9sYW5nIiBpcyBUUlVFIHRyeSBrZWVwaW5nIHRoZSBsYW5ndWFnZSBvZiB0aGUgY3VycmVudCBidWZmZXIuCisgKi8KKyAgICBpbnQKK2ZpbmRfaGVscF90YWdzKGFyZywgbnVtX21hdGNoZXMsIG1hdGNoZXMsIGtlZXBfbGFuZykKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCSpudW1fbWF0Y2hlczsKKyAgICBjaGFyX3UJKioqbWF0Y2hlczsKKyAgICBpbnQJCWtlZXBfbGFuZzsKK3sKKyAgICBjaGFyX3UJKnMsICpkOworICAgIGludAkJaTsKKyAgICBzdGF0aWMgY2hhciAqKG10YWJsZVtdKSA9IHsiKiIsICJnKiIsICJbKiIsICJdKiIsICI6KiIsCisJCQkgICAgICAgIi8qIiwgIi9cXCoiLCAiXCIqIiwgIi9cXChcXCkiLAorCQkJICAgICAgICI/IiwgIjo/IiwgIj88Q1I+IiwgImc/IiwgImc/Zz8iLCAiZz8/IiwKKwkJCSAgICAgICAiL1xcPyIsICIvXFx6KFxcKSIsCisJCQkgICAgICAgIltjb3VudF0iLCAiW3F1b3RleF0iLCAiW3JhbmdlXSIsCisJCQkgICAgICAgIltwYXR0ZXJuXSIsICJcXHwiLCAiXFwlJCJ9OworICAgIHN0YXRpYyBjaGFyICoocnRhYmxlW10pID0geyJzdGFyIiwgImdzdGFyIiwgIltzdGFyIiwgIl1zdGFyIiwgIjpzdGFyIiwKKwkJCSAgICAgICAiL3N0YXIiLCAiL1xcXFxzdGFyIiwgInF1b3Rlc3RhciIsICIvXFxcXChcXFxcKSIsCisJCQkgICAgICAgIj8iLCAiOj8iLCAiPzxDUj4iLCAiZz8iLCAiZz9nPyIsICJnPz8iLAorCQkJICAgICAgICIvXFxcXD8iLCAiL1xcXFx6KFxcXFwpIiwKKwkJCSAgICAgICAiXFxbY291bnRdIiwgIlxcW3F1b3RleF0iLCAiXFxbcmFuZ2VdIiwKKwkJCSAgICAgICAiXFxbcGF0dGVybl0iLCAiXFxcXGJhciIsICIvXFxcXCVcXCQifTsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBkID0gSU9idWZmOwkJICAgIC8qIGFzc3VtZSBJT2J1ZmYgaXMgbG9uZyBlbm91Z2ghICovCisKKyAgICAvKgorICAgICAqIFJlY29nbml6ZSBhIGZldyBleGNlcHRpb25zIHRvIHRoZSBydWxlLglTb21lIHN0cmluZ3MgdGhhdCBjb250YWluICcqJworICAgICAqIHdpdGggInN0YXIiLiAgT3RoZXJ3aXNlICcqJyBpcyByZWNvZ25pemVkIGFzIGEgd2lsZGNhcmQuCisgICAgICovCisgICAgZm9yIChpID0gc2l6ZW9mKG10YWJsZSkgLyBzaXplb2YoY2hhciAqKTsgLS1pID49IDA7ICkKKwlpZiAoU1RSQ01QKGFyZywgbXRhYmxlW2ldKSA9PSAwKQorCXsKKwkgICAgU1RSQ1BZKGQsIHJ0YWJsZVtpXSk7CisJICAgIGJyZWFrOworCX0KKworICAgIGlmIChpIDwgMCkJLyogbm8gbWF0Y2ggaW4gdGFibGUgKi8KKyAgICB7CisJLyogUmVwbGFjZSAiXFMiIHdpdGggIi9cXFMiLCBldGMuICBPdGhlcndpc2UgZXZlcnkgdGFnIGlzIG1hdGNoZWQuCisJICogQWxzbyByZXBsYWNlICJcJV4iIGFuZCAiXCUoIiwgdGhleSBtYXRjaCBldmVyeSB0YWcgdG9vLgorCSAqIEFsc28gIlx6cyIsICJcejEiLCBldGMuCisJICogQWxzbyAiXEA8IiwgIlxAPSIsICJcQDw9IiwgZXRjLgorCSAqIEFuZCBhbHNvICJcXyQiIGFuZCAiXF9eIi4gKi8KKwlpZiAoYXJnWzBdID09ICdcXCcKKwkJJiYgKChhcmdbMV0gIT0gTlVMICYmIGFyZ1syXSA9PSBOVUwpCisJCSAgICB8fCAodmltX3N0cmNocigoY2hhcl91ICopIiVfekAiLCBhcmdbMV0pICE9IE5VTEwKKwkJCQkJCQkgICAmJiBhcmdbMl0gIT0gTlVMKSkpCisJeworCSAgICBTVFJDUFkoZCwgIi9cXFxcIik7CisJICAgIFNUUkNQWShkICsgMywgYXJnICsgMSk7CisJICAgIC8qIENoZWNrIGZvciAiL1xcXyQiLCBzaG91bGQgYmUgIi9cXF9cJCIgKi8KKwkgICAgaWYgKGRbM10gPT0gJ18nICYmIGRbNF0gPT0gJyQnKQorCQlTVFJDUFkoZCArIDQsICJcXCQiKTsKKwl9CisJZWxzZQorCXsKKwkgIC8qIHJlcGxhY2UgIls6Li4uOl0iIHdpdGggIlxbOi4uLjpdIjsgIlsrLi4uXSIgd2l0aCAiXFsrKy4uLl0iICovCisJICAgIGlmIChhcmdbMF0gPT0gJ1snICYmIChhcmdbMV0gPT0gJzonCisJCQkJCSB8fCAoYXJnWzFdID09ICcrJyAmJiBhcmdbMl0gPT0gJysnKSkpCisJICAgICAgKmQrKyA9ICdcXCc7CisKKwkgIGZvciAocyA9IGFyZzsgKnM7ICsrcykKKwkgIHsKKwkgICAgLyoKKwkgICAgICogUmVwbGFjZSAifCIgd2l0aCAiYmFyIiBhbmQgJyInIHdpdGggInF1b3RlIiB0byBtYXRjaCB0aGUgbmFtZSBvZgorCSAgICAgKiB0aGUgdGFncyBmb3IgdGhlc2UgY29tbWFuZHMuCisJICAgICAqIFJlcGxhY2UgIioiIHdpdGggIi4qIiBhbmQgIj8iIHdpdGggIi4iIHRvIG1hdGNoIGNvbW1hbmQgbGluZQorCSAgICAgKiBjb21wbGV0aW9uLgorCSAgICAgKiBJbnNlcnQgYSBiYWNrc2xhc2ggYmVmb3JlICd+JywgJyQnIGFuZCAnLicgdG8gYXZvaWQgdGhlaXIKKwkgICAgICogc3BlY2lhbCBtZWFuaW5nLgorCSAgICAgKi8KKwkgICAgaWYgKGQgLSBJT2J1ZmYgPiBJT1NJWkUgLSAxMCkJLyogZ2V0dGluZyB0b28gbG9uZyE/ICovCisJCWJyZWFrOworCSAgICBzd2l0Y2ggKCpzKQorCSAgICB7CisJCWNhc2UgJ3wnOiAgIFNUUkNQWShkLCAiYmFyIik7CisJCQkgICAgZCArPSAzOworCQkJICAgIGNvbnRpbnVlOworCQljYXNlICciJzogICBTVFJDUFkoZCwgInF1b3RlIik7CisJCQkgICAgZCArPSA1OworCQkJICAgIGNvbnRpbnVlOworCQljYXNlICcqJzogICAqZCsrID0gJy4nOworCQkJICAgIGJyZWFrOworCQljYXNlICc/JzogICAqZCsrID0gJy4nOworCQkJICAgIGNvbnRpbnVlOworCQljYXNlICckJzoKKwkJY2FzZSAnLic6CisJCWNhc2UgJ34nOiAgICpkKysgPSAnXFwnOworCQkJICAgIGJyZWFrOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogUmVwbGFjZSAiXngiIGJ5ICJDVFJMLVgiLiBEb24ndCBkbyB0aGlzIGZvciAiXl8iIHRvIG1ha2UKKwkgICAgICogIjpoZWxwIGlfXl9DVFJMLUQiIHdvcmsuCisJICAgICAqIEluc2VydCAnLScgYmVmb3JlIGFuZCBhZnRlciAiQ1RSTC1YIiB3aGVuIGFwcGxpY2FibGUuCisJICAgICAqLworCSAgICBpZiAoKnMgPCAnICcgfHwgKCpzID09ICdeJyAmJiBzWzFdICYmIChBU0NJSV9JU0FMUEhBKHNbMV0pCisJCQkgICB8fCB2aW1fc3RyY2hyKChjaGFyX3UgKikiP0BbXFxdXiIsIHNbMV0pICE9IE5VTEwpKSkKKwkgICAgeworCQlpZiAoZCA+IElPYnVmZiAmJiBkWy0xXSAhPSAnXycpCisJCSAgICAqZCsrID0gJ18nOwkJLyogcHJlcGVuZCBhICdfJyAqLworCQlTVFJDUFkoZCwgIkNUUkwtIik7CisJCWQgKz0gNTsKKwkJaWYgKCpzIDwgJyAnKQorCQl7CisjaWZkZWYgRUJDRElDCisJCSAgICAqZCsrID0gQ3RybENoYXIoKnMpOworI2Vsc2UKKwkJICAgICpkKysgPSAqcyArICdAJzsKKyNlbmRpZgorCQkgICAgaWYgKGRbLTFdID09ICdcXCcpCisJCQkqZCsrID0gJ1xcJzsJLyogZG91YmxlIGEgYmFja3NsYXNoICovCisJCX0KKwkJZWxzZQorCQkgICAgKmQrKyA9ICorK3M7CisJCWlmIChzWzFdICE9IE5VTCAmJiBzWzFdICE9ICdfJykKKwkJICAgICpkKysgPSAnXyc7CQkvKiBhcHBlbmQgYSAnXycgKi8KKwkJY29udGludWU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnMgPT0gJ14nKQkJLyogIl4iIG9yICJDVFJMLV4iIG9yICJeXyIgKi8KKwkJKmQrKyA9ICdcXCc7CisKKwkgICAgLyoKKwkgICAgICogSW5zZXJ0IGEgYmFja3NsYXNoIGJlZm9yZSBhIGJhY2tzbGFzaCBhZnRlciBhIHNsYXNoLCBmb3Igc2VhcmNoCisJICAgICAqIHBhdHRlcm4gdGFnczogIi9cfCIgLS0+ICIvXFx8Ii4KKwkgICAgICovCisJICAgIGVsc2UgaWYgKHNbMF0gPT0gJ1xcJyAmJiBzWzFdICE9ICdcXCcKKwkJCQkJICAgICAgICYmICphcmcgPT0gJy8nICYmIHMgPT0gYXJnICsgMSkKKwkJKmQrKyA9ICdcXCc7CisKKwkgICAgLyogIkNUUkwtXF8iIC0+ICJDVFJMLVxcXyIgdG8gYXZvaWQgdGhlIHNwZWNpYWwgbWVhbmluZyBvZiAiXF8iIGluCisJICAgICAqICJDVFJMLVxfQ1RSTC1OIiAqLworCSAgICBpZiAoU1RSTklDTVAocywgIkNUUkwtXFxfIiwgNykgPT0gMCkKKwkgICAgeworCQlTVFJDUFkoZCwgIkNUUkwtXFxcXCIpOworCQlkICs9IDc7CisJCXMgKz0gNjsKKwkgICAgfQorCisJICAgICpkKysgPSAqczsKKworCSAgICAvKgorCSAgICAgKiBJZiB0YWcgc3RhcnRzIHdpdGggJywgdG9zcyBldmVyeXRoaW5nIGFmdGVyIGEgc2Vjb25kICcuIEZpeGVzCisJICAgICAqIENUUkwtXSBvbiAnb3B0aW9uJy4gKHdvdWxkIGluY2x1ZGUgdGhlIHRyYWlsaW5nICcuJykuCisJICAgICAqLworCSAgICBpZiAoKnMgPT0gJ1wnJyAmJiBzID4gYXJnICYmICphcmcgPT0gJ1wnJykKKwkJYnJlYWs7CisJICB9CisJICAqZCA9IE5VTDsKKwl9CisgICAgfQorCisgICAgKm1hdGNoZXMgPSAoY2hhcl91ICoqKSIiOworICAgICpudW1fbWF0Y2hlcyA9IDA7CisgICAgZmxhZ3MgPSBUQUdfSEVMUCB8IFRBR19SRUdFWFAgfCBUQUdfTkFNRVMgfCBUQUdfVkVSQk9TRTsKKyAgICBpZiAoa2VlcF9sYW5nKQorCWZsYWdzIHw9IFRBR19LRUVQX0xBTkc7CisgICAgaWYgKGZpbmRfdGFncyhJT2J1ZmYsIG51bV9tYXRjaGVzLCBtYXRjaGVzLCBmbGFncywgKGludClNQVhDT0wsIE5VTEwpID09IE9LCisJICAgICYmICpudW1fbWF0Y2hlcyA+IDApCisJLyogU29ydCB0aGUgbWF0Y2hlcyBmb3VuZCBvbiB0aGUgaGV1cmlzdGljIG51bWJlciB0aGF0IGlzIGFmdGVyIHRoZQorCSAqIHRhZyBuYW1lLiAqLworCXFzb3J0KCh2b2lkICopKm1hdGNoZXMsIChzaXplX3QpKm51bV9tYXRjaGVzLAorCQkJCQkgICAgICBzaXplb2YoY2hhcl91ICopLCBoZWxwX2NvbXBhcmUpOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEFmdGVyIHJlYWRpbmcgYSBoZWxwIGZpbGU6IE1heSBjbGVhbnVwIGEgaGVscCBidWZmZXIgd2hlbiBzeW50YXgKKyAqIGhpZ2hsaWdodGluZyBpcyBub3QgdXNlZC4KKyAqLworICAgIHZvaWQKK2ZpeF9oZWxwX2J1ZmZlcigpCit7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgaW50CQlpbl9leGFtcGxlID0gRkFMU0U7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqcnQ7CisgICAgaW50CQltdXN0ZnJlZTsKKworICAgIC8qIHNldCBmaWxldHlwZSB0byAiaGVscCIuICovCisgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImZ0IiwgMEwsIChjaGFyX3UgKikiaGVscCIsIE9QVF9MT0NBTCk7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGlmICghc3ludGF4X3ByZXNlbnQoY3VyYnVmKSkKKyNlbmRpZgorICAgIHsKKwlmb3IgKGxudW0gPSAxOyBsbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisJeworCSAgICBsaW5lID0gbWxfZ2V0X2J1ZihjdXJidWYsIGxudW0sIEZBTFNFKTsKKwkgICAgbGVuID0gKGludClTVFJMRU4obGluZSk7CisJICAgIGlmIChpbl9leGFtcGxlICYmIGxlbiA+IDAgJiYgIXZpbV9pc3doaXRlKGxpbmVbMF0pKQorCSAgICB7CisJCS8qIEVuZCBvZiBleGFtcGxlOiBub24td2hpdGUgb3IgJzwnIGluIGZpcnN0IGNvbHVtbi4gKi8KKwkJaWYgKGxpbmVbMF0gPT0gJzwnKQorCQl7CisJCSAgICAvKiBibGFuay1vdXQgYSAnPCcgaW4gdGhlIGZpcnN0IGNvbHVtbiAqLworCQkgICAgbGluZSA9IG1sX2dldF9idWYoY3VyYnVmLCBsbnVtLCBUUlVFKTsKKwkJICAgIGxpbmVbMF0gPSAnICc7CisJCX0KKwkJaW5fZXhhbXBsZSA9IEZBTFNFOworCSAgICB9CisJICAgIGlmICghaW5fZXhhbXBsZSAmJiBsZW4gPiAwKQorCSAgICB7CisJCWlmIChsaW5lW2xlbiAtIDFdID09ICc+JyAmJiAobGVuID09IDEgfHwgbGluZVtsZW4gLSAyXSA9PSAnICcpKQorCQl7CisJCSAgICAvKiBibGFuay1vdXQgYSAnPicgaW4gdGhlIGxhc3QgY29sdW1uIChzdGFydCBvZiBleGFtcGxlKSAqLworCQkgICAgbGluZSA9IG1sX2dldF9idWYoY3VyYnVmLCBsbnVtLCBUUlVFKTsKKwkJICAgIGxpbmVbbGVuIC0gMV0gPSAnICc7CisJCSAgICBpbl9leGFtcGxlID0gVFJVRTsKKwkJfQorCQllbHNlIGlmIChsaW5lW2xlbiAtIDFdID09ICd+JykKKwkJeworCQkgICAgLyogYmxhbmstb3V0IGEgJ34nIGF0IHRoZSBlbmQgb2YgbGluZSAoaGVhZGVyIG1hcmtlcikgKi8KKwkJICAgIGxpbmUgPSBtbF9nZXRfYnVmKGN1cmJ1ZiwgbG51bSwgVFJVRSk7CisJCSAgICBsaW5lW2xlbiAtIDFdID0gJyAnOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiB0aGUgImhlbHAudHh0IiBmaWxlLCBhZGQgdGhlIGxvY2FsbHkgYWRkZWQgaGVscCBmaWxlcy4KKyAgICAgKiBUaGlzIHVzZXMgdGhlIHZlcnkgZmlyc3QgbGluZSBpbiB0aGUgaGVscCBmaWxlLgorICAgICAqLworICAgIGlmIChmbmFtZWNtcChnZXR0YWlsKGN1cmJ1Zi0+Yl9mbmFtZSksICJoZWxwLnR4dCIpID09IDApCisgICAgeworCWZvciAobG51bSA9IDE7IGxudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsgKytsbnVtKQorCXsKKwkgICAgbGluZSA9IG1sX2dldF9idWYoY3VyYnVmLCBsbnVtLCBGQUxTRSk7CisJICAgIGlmIChzdHJzdHIoKGNoYXIgKilsaW5lLCAiKmxvY2FsLWFkZGl0aW9ucyoiKSAhPSBOVUxMKQorCSAgICB7CisJCS8qIEdvIHRocm91Z2ggYWxsIGRpcmVjdG9yaWVzIGluICdydW50aW1lcGF0aCcsIHNraXBwaW5nCisJCSAqICRWSU1SVU5USU1FLiAqLworCQlwID0gcF9ydHA7CisJCXdoaWxlICgqcCAhPSBOVUwpCisJCXsKKwkJICAgIGNvcHlfb3B0aW9uX3BhcnQoJnAsIE5hbWVCdWZmLCBNQVhQQVRITCwgIiwiKTsKKwkJICAgIG11c3RmcmVlID0gRkFMU0U7CisJCSAgICBydCA9IHZpbV9nZXRlbnYoKGNoYXJfdSAqKSJWSU1SVU5USU1FIiwgJm11c3RmcmVlKTsKKwkJICAgIGlmIChmdWxscGF0aGNtcChydCwgTmFtZUJ1ZmYsIEZBTFNFKSAhPSBGUENfU0FNRSkKKwkJICAgIHsKKwkJCWludAlmY291bnQ7CisJCQljaGFyX3UJKipmbmFtZXM7CisJCQlGSUxFCSpmZDsKKwkJCWNoYXJfdQkqczsKKwkJCWludAlmaTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCQl2aW1jb252X1QJdmM7CisJCQljaGFyX3UJCSpjcDsKKyNlbmRpZgorCisJCQkvKiBGaW5kIGFsbCAiZG9jLyAqLnR4dCIgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuICovCisJCQlhZGRfcGF0aHNlcChOYW1lQnVmZik7CisJCQlTVFJDQVQoTmFtZUJ1ZmYsICJkb2MvKi50eHQiKTsKKwkJCWlmIChnZW5fZXhwYW5kX3dpbGRjYXJkcygxLCAmTmFtZUJ1ZmYsICZmY291bnQsCisJCQkJCSAgICAgJmZuYW1lcywgRVdfRklMRXxFV19TSUxFTlQpID09IE9LCisJCQkJJiYgZmNvdW50ID4gMCkKKwkJCXsKKwkJCSAgICBmb3IgKGZpID0gMDsgZmkgPCBmY291bnQ7ICsrZmkpCisJCQkgICAgeworCQkJCWZkID0gZm9wZW4oKGNoYXIgKilmbmFtZXNbZmldLCAiciIpOworCQkJCWlmIChmZCAhPSBOVUxMKQorCQkJCXsKKwkJCQkgICAgdmltX2ZnZXRzKElPYnVmZiwgSU9TSVpFLCBmZCk7CisJCQkJICAgIGlmIChJT2J1ZmZbMF0gPT0gJyonCisJCQkJCSAgICAmJiAocyA9IHZpbV9zdHJjaHIoSU9idWZmICsgMSwgJyonKSkKKwkJCQkJCQkJICAgICAgIT0gTlVMTCkKKwkJCQkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCQkJaW50CXRoaXNfdXRmID0gTUFZQkU7CisjZW5kaWYKKwkJCQkJLyogQ2hhbmdlIHRhZyBkZWZpbml0aW9uIHRvIGEKKwkJCQkJICogcmVmZXJlbmNlIGFuZCByZW1vdmUgPENSPi88Tkw+LiAqLworCQkJCQlJT2J1ZmZbMF0gPSAnfCc7CisJCQkJCSpzID0gJ3wnOworCQkJCQl3aGlsZSAoKnMgIT0gTlVMKQorCQkJCQl7CisJCQkJCSAgICBpZiAoKnMgPT0gJ1xyJyB8fCAqcyA9PSAnXG4nKQorCQkJCQkJKnMgPSBOVUw7CisjaWZkZWYgRkVBVF9NQllURQorCQkJCQkgICAgLyogVGhlIHRleHQgaXMgdXRmLTggd2hlbiBhIGJ5dGUKKwkJCQkJICAgICAqIGFib3ZlIDEyNyBpcyBmb3VuZCBhbmQgbm8KKwkJCQkJICAgICAqIGlsbGVnYWwgYnl0ZSBzZXF1ZW5jZSBpcyBmb3VuZC4KKwkJCQkJICAgICAqLworCQkJCQkgICAgaWYgKCpzID49IDB4ODAgJiYgdGhpc191dGYgIT0gRkFMU0UpCisJCQkJCSAgICB7CisJCQkJCQlpbnQJbDsKKworCQkJCQkJdGhpc191dGYgPSBUUlVFOworCQkJCQkJbCA9IHV0Zl9wdHIybGVuX2NoZWNrKHMpOworCQkJCQkJaWYgKGwgPT0gMSkKKwkJCQkJCSAgICB0aGlzX3V0ZiA9IEZBTFNFOworCQkJCQkJcyArPSBsIC0gMTsKKwkJCQkJICAgIH0KKyNlbmRpZgorCQkJCQkgICAgKytzOworCQkJCQl9CisjaWZkZWYgRkVBVF9NQllURQorCQkJCQkvKiBUaGUgaGVscCBmaWxlIGlzIGxhdGluMSBvciB1dGYtODsKKwkJCQkJICogY29udmVyc2lvbiB0byB0aGUgY3VycmVudAorCQkJCQkgKiAnZW5jb2RpbmcnIG1heSBiZSByZXF1aXJlZC4gKi8KKwkJCQkJdmMudmNfdHlwZSA9IENPTlZfTk9ORTsKKwkJCQkJY29udmVydF9zZXR1cCgmdmMsIChjaGFyX3UgKikoCisJCQkJCQkgICAgdGhpc191dGYgPT0gVFJVRSA/ICJ1dGYtOCIKKwkJCQkJCQkgIDogImxhdGluMSIpLCBwX2VuYyk7CisJCQkJCWlmICh2Yy52Y190eXBlID09IENPTlZfTk9ORSkKKwkJCQkJICAgIC8qIE5vIGNvbnZlcnNpb24gbmVlZGVkLiAqLworCQkJCQkgICAgY3AgPSBJT2J1ZmY7CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkgICAgLyogRG8gdGhlIGNvbnZlcnNpb24uICBJZiBpdCBmYWlscworCQkJCQkgICAgICogdXNlIHRoZSB1bmNvbnZlcnRlZCB0ZXh0LiAqLworCQkJCQkgICAgY3AgPSBzdHJpbmdfY29udmVydCgmdmMsIElPYnVmZiwKKwkJCQkJCQkJCU5VTEwpOworCQkJCQkgICAgaWYgKGNwID09IE5VTEwpCisJCQkJCQljcCA9IElPYnVmZjsKKwkJCQkJfQorCQkJCQljb252ZXJ0X3NldHVwKCZ2YywgTlVMTCwgTlVMTCk7CisKKwkJCQkJbWxfYXBwZW5kKGxudW0sIGNwLCAoY29sbnJfVCkwLCBGQUxTRSk7CisJCQkJCWlmIChjcCAhPSBJT2J1ZmYpCisJCQkJCSAgICB2aW1fZnJlZShjcCk7CisjZWxzZQorCQkJCQltbF9hcHBlbmQobG51bSwgSU9idWZmLCAoY29sbnJfVCkwLAorCQkJCQkJCQkgICAgICAgRkFMU0UpOworI2VuZGlmCisJCQkJCSsrbG51bTsKKwkJCQkgICAgfQorCQkJCSAgICBmY2xvc2UoZmQpOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgRnJlZVdpbGQoZmNvdW50LCBmbmFtZXMpOworCQkJfQorCQkgICAgfQorCQkgICAgaWYgKG11c3RmcmVlKQorCQkJdmltX2ZyZWUocnQpOworCQl9CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9FWF9FWFRSQSkgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyB2b2lkIGhlbHB0YWdzX29uZSBfX0FSR1MoKGNoYXJfdSAqZGlyLCBjaGFyX3UgKmV4dCwgY2hhcl91ICpsYW5nKSk7CisKKy8qCisgKiAiOmhlbHB0YWdzIgorICovCisgICAgdm9pZAorZXhfaGVscHRhZ3MoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBnYXJyYXlfVAlnYTsKKyAgICBpbnQJCWksIGo7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CWxhbmdbMl07CisgICAgY2hhcl91CWV4dFs1XTsKKyAgICBjaGFyX3UJZm5hbWVbOF07CisgICAgaW50CQlmaWxlY291bnQ7CisgICAgY2hhcl91CSoqZmlsZXM7CisKKyAgICBpZiAoIW1jaF9pc2RpcihlYXAtPmFyZykpCisgICAgeworCUVNU0cyKF8oIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiKSwgZWFwLT5hcmcpOworCXJldHVybjsKKyAgICB9CisKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKyAgICAvKiBHZXQgYSBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5LiAqLworICAgIFNUUkNQWShOYW1lQnVmZiwgZWFwLT5hcmcpOworICAgIGFkZF9wYXRoc2VwKE5hbWVCdWZmKTsKKyAgICBTVFJDQVQoTmFtZUJ1ZmYsICIqIik7CisgICAgaWYgKGdlbl9leHBhbmRfd2lsZGNhcmRzKDEsICZOYW1lQnVmZiwgJmZpbGVjb3VudCwgJmZpbGVzLAorCQkJCQkJICAgIEVXX0ZJTEV8RVdfU0lMRU5UKSA9PSBGQUlMCisJICAgIHx8IGZpbGVjb3VudCA9PSAwKQorICAgIHsKKwlFTVNHMigiRTE1MTogTm8gbWF0Y2g6ICVzIiwgTmFtZUJ1ZmYpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBHbyBvdmVyIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRvIGZpbmQgb3V0IHdoYXQgbGFuZ3VhZ2VzIGFyZQorICAgICAqIHByZXNlbnQuICovCisgICAgZ2FfaW5pdDIoJmdhLCAxLCAxMCk7CisgICAgZm9yIChpID0gMDsgaSA8IGZpbGVjb3VudDsgKytpKQorICAgIHsKKwlsZW4gPSBTVFJMRU4oZmlsZXNbaV0pOworCWlmIChsZW4gPiA0KQorCXsKKwkgICAgaWYgKFNUUklDTVAoZmlsZXNbaV0gKyBsZW4gLSA0LCAiLnR4dCIpID09IDApCisJICAgIHsKKwkJLyogIi50eHQiIC0+IGxhbmd1YWdlICJlbiIgKi8KKwkJbGFuZ1swXSA9ICdlJzsKKwkJbGFuZ1sxXSA9ICduJzsKKwkgICAgfQorCSAgICBlbHNlIGlmIChmaWxlc1tpXVtsZW4gLSA0XSA9PSAnLicKKwkJICAgICYmIEFTQ0lJX0lTQUxQSEEoZmlsZXNbaV1bbGVuIC0gM10pCisJCSAgICAmJiBBU0NJSV9JU0FMUEhBKGZpbGVzW2ldW2xlbiAtIDJdKQorCQkgICAgJiYgVE9MT1dFUl9BU0MoZmlsZXNbaV1bbGVuIC0gMV0pID09ICd4JykKKwkgICAgeworCQkvKiAiLmFieCIgLT4gbGFuZ3VhZ2UgImFiIiAqLworCQlsYW5nWzBdID0gVE9MT1dFUl9BU0MoZmlsZXNbaV1bbGVuIC0gM10pOworCQlsYW5nWzFdID0gVE9MT1dFUl9BU0MoZmlsZXNbaV1bbGVuIC0gMl0pOworCSAgICB9CisJICAgIGVsc2UKKwkJY29udGludWU7CisKKwkgICAgLyogRGlkIHdlIGZpbmQgdGhpcyBsYW5ndWFnZSBhbHJlYWR5PyAqLworCSAgICBmb3IgKGogPSAwOyBqIDwgZ2EuZ2FfbGVuOyBqICs9IDIpCisJCWlmIChTVFJOQ01QKGxhbmcsICgoY2hhcl91ICopZ2EuZ2FfZGF0YSkgKyBqLCAyKSA9PSAwKQorCQkgICAgYnJlYWs7CisJICAgIGlmIChqID09IGdhLmdhX2xlbikKKwkgICAgeworCQkvKiBOZXcgbGFuZ3VhZ2UsIGFkZCBpdC4gKi8KKwkJaWYgKGdhX2dyb3coJmdhLCAyKSA9PSBGQUlMKQorCQkgICAgYnJlYWs7CisJCSgoY2hhcl91ICopZ2EuZ2FfZGF0YSlbZ2EuZ2FfbGVuKytdID0gbGFuZ1swXTsKKwkJKChjaGFyX3UgKilnYS5nYV9kYXRhKVtnYS5nYV9sZW4rK10gPSBsYW5nWzFdOworCQlnYS5nYV9yb29tIC09IDI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb29wIG92ZXIgdGhlIGZvdW5kIGxhbmd1YWdlcyB0byBnZW5lcmF0ZSBhIHRhZ3MgZmlsZSBmb3IgZWFjaCBvbmUuCisgICAgICovCisgICAgZm9yIChqID0gMDsgaiA8IGdhLmdhX2xlbjsgaiArPSAyKQorICAgIHsKKwlTVFJDUFkoZm5hbWUsICJ0YWdzLXh4Iik7CisJZm5hbWVbNV0gPSAoKGNoYXJfdSAqKWdhLmdhX2RhdGEpW2pdOworCWZuYW1lWzZdID0gKChjaGFyX3UgKilnYS5nYV9kYXRhKVtqICsgMV07CisJaWYgKGZuYW1lWzVdID09ICdlJyAmJiBmbmFtZVs2XSA9PSAnbicpCisJeworCSAgICAvKiBFbmdsaXNoIGlzIGFuIGV4Y2VwdGlvbjogdXNlICIudHh0IiBhbmQgInRhZ3MiLiAqLworCSAgICBmbmFtZVs0XSA9IE5VTDsKKwkgICAgU1RSQ1BZKGV4dCwgIi50eHQiKTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogTGFuZ3VhZ2UgImFiIiB1c2VzICIuYWJ4IiBhbmQgInRhZ3MtYWIiLiAqLworCSAgICBTVFJDUFkoZXh0LCAiLnh4eCIpOworCSAgICBleHRbMV0gPSBmbmFtZVs1XTsKKwkgICAgZXh0WzJdID0gZm5hbWVbNl07CisJfQorCWhlbHB0YWdzX29uZShlYXAtPmFyZywgZXh0LCBmbmFtZSk7CisgICAgfQorCisgICAgZ2FfY2xlYXIoJmdhKTsKKyAgICBGcmVlV2lsZChmaWxlY291bnQsIGZpbGVzKTsKKworI2Vsc2UKKyAgICAvKiBObyBsYW5ndWFnZSBzdXBwb3J0LCBqdXN0IHVzZSAiKi50eHQiIGFuZCAidGFncyIuICovCisgICAgaGVscHRhZ3Nfb25lKGVhcC0+YXJnLCAoY2hhcl91ICopIi50eHQiLCAoY2hhcl91ICopInRhZ3MiKTsKKyNlbmRpZgorfQorCisgICAgc3RhdGljIHZvaWQKK2hlbHB0YWdzX29uZShkaXIsIGV4dCwgdGFnZm5hbWUpCisgICAgY2hhcl91CSpkaXI7CSAgICAvKiBkb2MgZGlyZWN0b3J5ICovCisgICAgY2hhcl91CSpleHQ7CSAgICAvKiBzdWZmaXgsICIudHh0IiwgIi5pdHgiLCAiLmZyeCIsIGV0Yy4gKi8KKyAgICBjaGFyX3UJKnRhZ2ZuYW1lOyAgICAvKiAidGFncyIgZm9yIEVuZ2xpc2gsICJ0YWdzLWl0IiBmb3IgSXRhbGlhbi4gKi8KK3sKKyAgICBGSUxFCSpmZF90YWdzOworICAgIEZJTEUJKmZkOworICAgIGdhcnJheV9UCWdhOworICAgIGludAkJZmlsZWNvdW50OworICAgIGNoYXJfdQkqKmZpbGVzOworICAgIGNoYXJfdQkqcDEsICpwMjsKKyAgICBpbnQJCWZpOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpmbmFtZTsKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJdXRmOCA9IE1BWUJFOworICAgIGludAkJdGhpc191dGY4OworICAgIGludAkJZmlyc3RsaW5lOworICAgIGludAkJbWl4ID0gRkFMU0U7CS8qIGRldGVjdGVkIG1peGVkIGVuY29kaW5ncyAqLworIyBlbmRpZgorCisgICAgLyoKKyAgICAgKiBGaW5kIGFsbCAqLnR4dCBmaWxlcy4KKyAgICAgKi8KKyAgICBTVFJDUFkoTmFtZUJ1ZmYsIGRpcik7CisgICAgYWRkX3BhdGhzZXAoTmFtZUJ1ZmYpOworICAgIFNUUkNBVChOYW1lQnVmZiwgIioiKTsKKyAgICBTVFJDQVQoTmFtZUJ1ZmYsIGV4dCk7CisgICAgaWYgKGdlbl9leHBhbmRfd2lsZGNhcmRzKDEsICZOYW1lQnVmZiwgJmZpbGVjb3VudCwgJmZpbGVzLAorCQkJCQkJICAgIEVXX0ZJTEV8RVdfU0lMRU5UKSA9PSBGQUlMCisJICAgIHx8IGZpbGVjb3VudCA9PSAwKQorICAgIHsKKwlpZiAoIWdvdF9pbnQpCisJICAgIEVNU0cyKCJFMTUxOiBObyBtYXRjaDogJXMiLCBOYW1lQnVmZik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogT3BlbiB0aGUgdGFncyBmaWxlIGZvciB3cml0aW5nLgorICAgICAqIERvIHRoaXMgYmVmb3JlIHNjYW5uaW5nIHRocm91Z2ggYWxsIHRoZSBmaWxlcy4KKyAgICAgKi8KKyAgICBTVFJDUFkoTmFtZUJ1ZmYsIGRpcik7CisgICAgYWRkX3BhdGhzZXAoTmFtZUJ1ZmYpOworICAgIFNUUkNBVChOYW1lQnVmZiwgdGFnZm5hbWUpOworICAgIGZkX3RhZ3MgPSBmb3BlbigoY2hhciAqKU5hbWVCdWZmLCAidyIpOworICAgIGlmIChmZF90YWdzID09IE5VTEwpCisgICAgeworCUVNU0cyKF8oIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIiksIE5hbWVCdWZmKTsKKwlGcmVlV2lsZChmaWxlY291bnQsIGZpbGVzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBnZW5lcmF0aW5nIHRhZ3MgZm9yICIkVklNUlVOVElNRS9kb2MiIGFkZCB0aGUgImhlbHAtdGFncyIgdGFnLgorICAgICAqLworICAgIGdhX2luaXQyKCZnYSwgKGludClzaXplb2YoY2hhcl91ICopLCAxMDApOworICAgIGlmIChmdWxscGF0aGNtcCgoY2hhcl91ICopIiRWSU1SVU5USU1FL2RvYyIsIGRpciwgRkFMU0UpID09IEZQQ19TQU1FKQorICAgIHsKKwlpZiAoZ2FfZ3JvdygmZ2EsIDEpID09IEZBSUwpCisJICAgIGdvdF9pbnQgPSBUUlVFOworCWVsc2UKKwl7CisJICAgIHMgPSBhbGxvYygzMCk7CisJICAgIGlmIChzID09IE5VTEwpCisJCWdvdF9pbnQgPSBUUlVFOworCSAgICBlbHNlCisJICAgIHsKKwkJc3ByaW50ZigoY2hhciAqKXMsICJoZWxwLXRhZ3NcdCVzXHQxXG4iLCB0YWdmbmFtZSk7CisJCSgoY2hhcl91ICoqKWdhLmdhX2RhdGEpW2dhLmdhX2xlbl0gPSBzOworCQkrK2dhLmdhX2xlbjsKKwkJLS1nYS5nYV9yb29tOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogR28gb3ZlciBhbGwgdGhlIGZpbGVzIGFuZCBleHRyYWN0IHRoZSB0YWdzLgorICAgICAqLworICAgIGZvciAoZmkgPSAwOyBmaSA8IGZpbGVjb3VudCAmJiAhZ290X2ludDsgKytmaSkKKyAgICB7CisJZmQgPSBmb3BlbigoY2hhciAqKWZpbGVzW2ZpXSwgInIiKTsKKwlpZiAoZmQgPT0gTlVMTCkKKwl7CisJICAgIEVNU0cyKF8oIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIiksIGZpbGVzW2ZpXSk7CisJICAgIGNvbnRpbnVlOworCX0KKwlmbmFtZSA9IGdldHRhaWwoZmlsZXNbZmldKTsKKworIyBpZmRlZiBGRUFUX01CWVRFCisJZmlyc3RsaW5lID0gVFJVRTsKKyMgZW5kaWYKKwl3aGlsZSAoIXZpbV9mZ2V0cyhJT2J1ZmYsIElPU0laRSwgZmQpICYmICFnb3RfaW50KQorCXsKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoZmlyc3RsaW5lKQorCSAgICB7CisJCS8qIERldGVjdCB1dGYtOCBmaWxlIGJ5IGEgbm9uLUFTQ0lJIGNoYXIgaW4gdGhlIGZpcnN0IGxpbmUuICovCisJCXRoaXNfdXRmOCA9IE1BWUJFOworCQlmb3IgKHMgPSBJT2J1ZmY7ICpzICE9IE5VTDsgKytzKQorCQkgICAgaWYgKCpzID49IDB4ODApCisJCSAgICB7CisJCQlpbnQgbDsKKworCQkJdGhpc191dGY4ID0gVFJVRTsKKwkJCWwgPSB1dGZfcHRyMmxlbl9jaGVjayhzKTsKKwkJCWlmIChsID09IDEpCisJCQl7CisJCQkgICAgLyogSWxsZWdhbCBVVEYtOCBieXRlIHNlcXVlbmNlLiAqLworCQkJICAgIHRoaXNfdXRmOCA9IEZBTFNFOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJcyArPSBsIC0gMTsKKwkJICAgIH0KKwkJaWYgKHRoaXNfdXRmOCA9PSBNQVlCRSkJICAgIC8qIG9ubHkgQVNDSUkgY2hhcmFjdGVycyBmb3VuZCAqLworCQkgICAgdGhpc191dGY4ID0gRkFMU0U7CisJCWlmICh1dGY4ID09IE1BWUJFKQkgICAgLyogZmlyc3QgZmlsZSAqLworCQkgICAgdXRmOCA9IHRoaXNfdXRmODsKKwkJZWxzZSBpZiAodXRmOCAhPSB0aGlzX3V0ZjgpCisJCXsKKwkJICAgIEVNU0cyKF8oIkU2NzA6IE1peCBvZiBoZWxwIGZpbGUgZW5jb2RpbmdzIHdpdGhpbiBhIGxhbmd1YWdlOiAlcyIpLCBmaWxlc1tmaV0pOworCQkgICAgbWl4ID0gIWdvdF9pbnQ7CisJCSAgICBnb3RfaW50ID0gVFJVRTsKKwkJfQorCQlmaXJzdGxpbmUgPSBGQUxTRTsKKwkgICAgfQorIyBlbmRpZgorCSAgICBwMSA9IHZpbV9zdHJjaHIoSU9idWZmLCAnKicpOwkvKiBmaW5kIGZpcnN0ICcqJyAqLworCSAgICB3aGlsZSAocDEgIT0gTlVMTCkKKwkgICAgeworCQlwMiA9IHZpbV9zdHJjaHIocDEgKyAxLCAnKicpOwkvKiBmaW5kIHNlY29uZCAnKicgKi8KKwkJaWYgKHAyICE9IE5VTEwgJiYgcDIgPiBwMSArIDEpCS8qIHNraXAgIioiIGFuZCAiKioiICovCisJCXsKKwkJICAgIGZvciAocyA9IHAxICsgMTsgcyA8IHAyOyArK3MpCisJCQlpZiAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcgfHwgKnMgPT0gJ3wnKQorCQkJICAgIGJyZWFrOworCisJCSAgICAvKgorCQkgICAgICogT25seSBhY2NlcHQgYSAqdGFnKiB3aGVuIGl0IGNvbnNpc3RzIG9mIHZhbGlkCisJCSAgICAgKiBjaGFyYWN0ZXJzLCB0aGVyZSBpcyB3aGl0ZSBzcGFjZSBiZWZvcmUgaXQgYW5kIGlzCisJCSAgICAgKiBmb2xsb3dlZCBieSBhIHdoaXRlIGNoYXJhY3RlciBvciBlbmQtb2YtbGluZS4KKwkJICAgICAqLworCQkgICAgaWYgKHMgPT0gcDIKKwkJCSAgICAmJiAocDEgPT0gSU9idWZmIHx8IHAxWy0xXSA9PSAnICcgfHwgcDFbLTFdID09ICdcdCcpCisJCQkgICAgJiYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIgXHRcblxyIiwgc1sxXSkgIT0gTlVMTAorCQkJCXx8IHNbMV0gPT0gJ1wwJykpCisJCSAgICB7CisJCQkqcDIgPSAnXDAnOworCQkJKytwMTsKKwkJCWlmIChnYV9ncm93KCZnYSwgMSkgPT0gRkFJTCkKKwkJCXsKKwkJCSAgICBnb3RfaW50ID0gVFJVRTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCXMgPSBhbGxvYygodW5zaWduZWQpKHAyIC0gcDEgKyBTVFJMRU4oZm5hbWUpICsgMikpOworCQkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCSAgICBnb3RfaW50ID0gVFJVRTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCSgoY2hhcl91ICoqKWdhLmdhX2RhdGEpW2dhLmdhX2xlbl0gPSBzOworCQkJKytnYS5nYV9sZW47CisJCQktLWdhLmdhX3Jvb207CisJCQlzcHJpbnRmKChjaGFyICopcywgIiVzXHQlcyIsIHAxLCBmbmFtZSk7CisKKwkJCS8qIGZpbmQgbmV4dCAnKicgKi8KKwkJCXAyID0gdmltX3N0cmNocihwMiArIDEsICcqJyk7CisJCSAgICB9CisJCX0KKwkJcDEgPSBwMjsKKwkgICAgfQorCSAgICBsaW5lX2JyZWFrY2hlY2soKTsKKwl9CisKKwlmY2xvc2UoZmQpOworICAgIH0KKworICAgIEZyZWVXaWxkKGZpbGVjb3VudCwgZmlsZXMpOworCisgICAgaWYgKCFnb3RfaW50KQorICAgIHsKKwkvKgorCSAqIFNvcnQgdGhlIHRhZ3MuCisJICovCisJc29ydF9zdHJpbmdzKChjaGFyX3UgKiopZ2EuZ2FfZGF0YSwgZ2EuZ2FfbGVuKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGR1cGxpY2F0ZXMuCisJICovCisJZm9yIChpID0gMTsgaSA8IGdhLmdhX2xlbjsgKytpKQorCXsKKwkgICAgcDEgPSAoKGNoYXJfdSAqKilnYS5nYV9kYXRhKVtpIC0gMV07CisJICAgIHAyID0gKChjaGFyX3UgKiopZ2EuZ2FfZGF0YSlbaV07CisJICAgIHdoaWxlICgqcDEgPT0gKnAyKQorCSAgICB7CisJCWlmICgqcDIgPT0gJ1x0JykKKwkJeworCQkgICAgKnAyID0gTlVMOworCQkgICAgc3ByaW50ZigoY2hhciAqKU5hbWVCdWZmLAorCQkJICAgIF8oIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMvJXMiKSwKKwkJCQkgICAgICgoY2hhcl91ICoqKWdhLmdhX2RhdGEpW2ldLCBkaXIsIHAyICsgMSk7CisJCSAgICBFTVNHKE5hbWVCdWZmKTsKKwkJICAgICpwMiA9ICdcdCc7CisJCSAgICBicmVhazsKKwkJfQorCQkrK3AxOworCQkrK3AyOworCSAgICB9CisJfQorCisjIGlmZGVmIEZFQVRfTUJZVEUKKwlpZiAodXRmOCA9PSBUUlVFKQorCSAgICBmcHJpbnRmKGZkX3RhZ3MsICIhX1RBR19GSUxFX0VOQ09ESU5HXHR1dGYtOFx0Ly9cbiIpOworIyBlbmRpZgorCisJLyoKKwkgKiBXcml0ZSB0aGUgdGFncyBpbnRvIHRoZSBmaWxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBnYS5nYV9sZW47ICsraSkKKwl7CisJICAgIHMgPSAoKGNoYXJfdSAqKilnYS5nYV9kYXRhKVtpXTsKKwkgICAgaWYgKFNUUk5DTVAocywgImhlbHAtdGFncyIsIDkpID09IDApCisJCS8qIGhlbHAtdGFncyBlbnRyeSB3YXMgYWRkZWQgaW4gZm9ybWF0dGVkIGZvcm0gKi8KKwkJZnByaW50ZihmZF90YWdzLCAoY2hhciAqKXMpOworCSAgICBlbHNlCisJICAgIHsKKwkJZnByaW50ZihmZF90YWdzLCAiJXNcdC8qIiwgcyk7CisJCWZvciAocDEgPSBzOyAqcDEgIT0gJ1x0JzsgKytwMSkKKwkJeworCQkgICAgLyogaW5zZXJ0IGJhY2tzbGFzaCBiZWZvcmUgJ1xcJyBhbmQgJy8nICovCisJCSAgICBpZiAoKnAxID09ICdcXCcgfHwgKnAxID09ICcvJykKKwkJCXB1dGMoJ1xcJywgZmRfdGFncyk7CisJCSAgICBwdXRjKCpwMSwgZmRfdGFncyk7CisJCX0KKwkJZnByaW50ZihmZF90YWdzLCAiKlxuIik7CisJICAgIH0KKwl9CisgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAobWl4KQorCWdvdF9pbnQgPSBGQUxTRTsgICAgLyogY29udGludWUgd2l0aCBvdGhlciBsYW5ndWFnZXMgKi8KKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgaSA8IGdhLmdhX2xlbjsgKytpKQorCXZpbV9mcmVlKCgoY2hhcl91ICoqKWdhLmdhX2RhdGEpW2ldKTsKKyAgICBnYV9jbGVhcigmZ2EpOworICAgIGZjbG9zZShmZF90YWdzKTsJICAgIC8qIHRoZXJlIGlzIG5vIGNoZWNrIGZvciBhbiBlcnJvci4uLiAqLworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU0lHTlMpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBTdHJ1Y3QgdG8gaG9sZCB0aGUgc2lnbiBwcm9wZXJ0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBzaWduIHNpZ25fVDsKKworc3RydWN0IHNpZ24KK3sKKyAgICBzaWduX1QJKnNuX25leHQ7CS8qIG5leHQgc2lnbiBpbiBsaXN0ICovCisgICAgaW50CQlzbl90eXBlbnI7CS8qIHR5cGUgbnVtYmVyIG9mIHNpZ24gKG5lZ2F0aXZlIGlmIG5vdCBlcXVhbAorCQkJCSAgIHRvIG5hbWUpICovCisgICAgY2hhcl91CSpzbl9uYW1lOwkvKiBuYW1lIG9mIHNpZ24gKi8KKyAgICBjaGFyX3UJKnNuX2ljb247CS8qIG5hbWUgb2YgcGl4bWFwICovCisjaWZkZWYgRkVBVF9TSUdOX0lDT05TCisgICAgdm9pZAkqc25faW1hZ2U7CS8qIGljb24gaW1hZ2UgKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqc25fdGV4dDsJLyogdGV4dCB1c2VkIGluc3RlYWQgb2YgcGl4bWFwICovCisgICAgaW50CQlzbl9saW5lX2hsOwkvKiBoaWdobGlnaHQgSUQgZm9yIGxpbmUgKi8KKyAgICBpbnQJCXNuX3RleHRfaGw7CS8qIGhpZ2hsaWdodCBJRCBmb3IgdGV4dCAqLworfTsKKworI2RlZmluZSBNQVhfVFlQRU5SIDI1NQkJLyogZGVwZW5kcyBvbiBzYXR0cl9UICovCitzdGF0aWMgc2lnbl9UCSpmaXJzdF9zaWduID0gTlVMTDsKK3N0YXRpYyBpbnQJbGFzdF9zaWduX3R5cGVuciA9IE1BWF9UWVBFTlI7CS8qIGlzIGRlY3JlbWVudGVkICovCisKK3N0YXRpYyB2b2lkIHNpZ25fbGlzdF9kZWZpbmVkIF9fQVJHUygoc2lnbl9UICpzcCkpOworCisvKgorICogIjpzaWduIiBjb21tYW5kCisgKi8KKyAgICB2b2lkCitleF9zaWduKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpZHg7CisgICAgc2lnbl9UCSpzcDsKKyAgICBzaWduX1QJKnNwX3ByZXY7CisgICAgYnVmX1QJKmJ1ZjsKKyAgICBzdGF0aWMgY2hhcgkqY21kc1tdID0geworCQkJImRlZmluZSIsCisjZGVmaW5lIFNJR05DTURfREVGSU5FCTAKKwkJCSJ1bmRlZmluZSIsCisjZGVmaW5lIFNJR05DTURfVU5ERUZJTkUgMQorCQkJImxpc3QiLAorI2RlZmluZSBTSUdOQ01EX0xJU1QJMgorCQkJInBsYWNlIiwKKyNkZWZpbmUgU0lHTkNNRF9QTEFDRQkzCisJCQkidW5wbGFjZSIsCisjZGVmaW5lIFNJR05DTURfVU5QTEFDRQk0CisJCQkianVtcCIsCisjZGVmaW5lIFNJR05DTURfSlVNUAk1CisjZGVmaW5lIFNJR05DTURfTEFTVAk2CisgICAgfTsKKworICAgIC8qIFBhcnNlIHRoZSBzdWJjb21tYW5kLiAqLworICAgIHAgPSBza2lwdG93aGl0ZShhcmcpOworICAgIGlmICgqcCAhPSBOVUwpCisJKnArKyA9IE5VTDsKKyAgICBmb3IgKGlkeCA9IDA7IDsgKytpZHgpCisgICAgeworCWlmIChpZHggPT0gU0lHTkNNRF9MQVNUKQorCXsKKwkgICAgRU1TRzIoXygiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIiksIGFyZyk7CisJICAgIHJldHVybjsKKwl9CisJaWYgKFNUUkNNUChhcmcsIGNtZHNbaWR4XSkgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGFyZyA9IHNraXB3aGl0ZShwKTsKKworICAgIGlmIChpZHggPD0gU0lHTkNNRF9MSVNUKQorICAgIHsKKwkvKgorCSAqIERlZmluZSwgdW5kZWZpbmUgb3IgbGlzdCBzaWducy4KKwkgKi8KKwlpZiAoaWR4ID09IFNJR05DTURfTElTVCAmJiAqYXJnID09IE5VTCkKKwl7CisJICAgIC8qICI6c2lnbiBsaXN0IjogbGlzdCBhbGwgZGVmaW5lZCBzaWducyAqLworCSAgICBmb3IgKHNwID0gZmlyc3Rfc2lnbjsgc3AgIT0gTlVMTDsgc3AgPSBzcC0+c25fbmV4dCkKKwkJc2lnbl9saXN0X2RlZmluZWQoc3ApOworCX0KKwllbHNlIGlmICgqYXJnID09IE5VTCkKKwkgICAgRU1TRyhfKCJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIpKTsKKwllbHNlCisJeworCSAgICBwID0gc2tpcHRvd2hpdGUoYXJnKTsKKwkgICAgaWYgKCpwICE9IE5VTCkKKwkJKnArKyA9IE5VTDsKKwkgICAgc3BfcHJldiA9IE5VTEw7CisJICAgIGZvciAoc3AgPSBmaXJzdF9zaWduOyBzcCAhPSBOVUxMOyBzcCA9IHNwLT5zbl9uZXh0KQorCSAgICB7CisJCWlmIChTVFJDTVAoc3AtPnNuX25hbWUsIGFyZykgPT0gMCkKKwkJICAgIGJyZWFrOworCQlzcF9wcmV2ID0gc3A7CisJICAgIH0KKwkgICAgaWYgKGlkeCA9PSBTSUdOQ01EX0RFRklORSkKKwkgICAgeworCQkvKiAiOnNpZ24gZGVmaW5lIHtuYW1lfSAuLi4iOiBkZWZpbmUgYSBzaWduICovCisJCWlmIChzcCA9PSBOVUxMKQorCQl7CisJCSAgICAvKiBBbGxvY2F0ZSBhIG5ldyBzaWduLiAqLworCQkgICAgc3AgPSAoc2lnbl9UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKXNpemVvZihzaWduX1QpKTsKKwkJICAgIGlmIChzcCA9PSBOVUxMKQorCQkJcmV0dXJuOworCQkgICAgaWYgKHNwX3ByZXYgPT0gTlVMTCkKKwkJCWZpcnN0X3NpZ24gPSBzcDsKKwkJICAgIGVsc2UKKwkJCXNwX3ByZXYtPnNuX25leHQgPSBzcDsKKwkJICAgIHNwLT5zbl9uYW1lID0gdmltX3N0cm5zYXZlKGFyZywgKGludCkocCAtIGFyZykpOworCisJCSAgICAvKiBJZiB0aGUgbmFtZSBpcyBhIG51bWJlciB1c2UgdGhhdCBmb3IgdGhlIHR5cGVuciwKKwkJICAgICAqIG90aGVyd2lzZSB1c2UgYSBuZWdhdGl2ZSBudW1iZXIuICovCisJCSAgICBpZiAoVklNX0lTRElHSVQoKmFyZykpCisJCQlzcC0+c25fdHlwZW5yID0gYXRvaSgoY2hhciAqKWFyZyk7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlzaWduX1QJKmxwOworCQkJaW50CXN0YXJ0ID0gbGFzdF9zaWduX3R5cGVucjsKKworCQkJZm9yIChscCA9IGZpcnN0X3NpZ247IGxwICE9IE5VTEw7IGxwID0gbHAtPnNuX25leHQpCisJCQl7CisJCQkgICAgaWYgKGxwLT5zbl90eXBlbnIgPT0gbGFzdF9zaWduX3R5cGVucikKKwkJCSAgICB7CisJCQkJLS1sYXN0X3NpZ25fdHlwZW5yOworCQkJCWlmIChsYXN0X3NpZ25fdHlwZW5yID09IDApCisJCQkJICAgIGxhc3Rfc2lnbl90eXBlbnIgPSBNQVhfVFlQRU5SOworCQkJCWlmIChsYXN0X3NpZ25fdHlwZW5yID09IHN0YXJ0KQorCQkJCXsKKwkJCQkgICAgRU1TRyhfKCJFNjEyOiBUb28gbWFueSBzaWducyBkZWZpbmVkIikpOworCQkJCSAgICByZXR1cm47CisJCQkJfQorCQkJCWxwID0gZmlyc3Rfc2lnbjsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQl9CisKKwkJCXNwLT5zbl90eXBlbnIgPSBsYXN0X3NpZ25fdHlwZW5yLS07CisJCQlpZiAobGFzdF9zaWduX3R5cGVuciA9PSAwKQorCQkJICAgIGxhc3Rfc2lnbl90eXBlbnIgPSBNQVhfVFlQRU5SOyAvKiB3cmFwIGFyb3VuZCAqLworCQkgICAgfQorCQl9CisKKwkJLyogc2V0IHZhbHVlcyBmb3IgYSBkZWZpbmVkIHNpZ24uICovCisJCWZvciAoOzspCisJCXsKKwkJICAgIGFyZyA9IHNraXB3aGl0ZShwKTsKKwkJICAgIGlmICgqYXJnID09IE5VTCkKKwkJCWJyZWFrOworCQkgICAgcCA9IHNraXB0b3doaXRlX2VzYyhhcmcpOworCQkgICAgaWYgKFNUUk5DTVAoYXJnLCAiaWNvbj0iLCA1KSA9PSAwKQorCQkgICAgeworCQkJYXJnICs9IDU7CisJCQl2aW1fZnJlZShzcC0+c25faWNvbik7CisJCQlzcC0+c25faWNvbiA9IHZpbV9zdHJuc2F2ZShhcmcsIChpbnQpKHAgLSBhcmcpKTsKKwkJCWJhY2tzbGFzaF9oYWx2ZShzcC0+c25faWNvbik7CisjaWZkZWYgRkVBVF9TSUdOX0lDT05TCisJCQlpZiAoZ3VpLmluX3VzZSkKKwkJCXsKKwkJCSAgICBvdXRfZmx1c2goKTsKKwkJCSAgICBpZiAoc3AtPnNuX2ltYWdlICE9IE5VTEwpCisJCQkJZ3VpX21jaF9kZXN0cm95X3NpZ24oc3AtPnNuX2ltYWdlKTsKKwkJCSAgICBzcC0+c25faW1hZ2UgPSBndWlfbWNoX3JlZ2lzdGVyX3NpZ24oc3AtPnNuX2ljb24pOworCQkJfQorI2VuZGlmCisJCSAgICB9CisJCSAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgInRleHQ9IiwgNSkgPT0gMCkKKwkJICAgIHsKKwkJCWNoYXJfdQkqczsKKwkJCWludAljZWxsczsKKwkJCWludAlsZW47CisKKwkJCWFyZyArPSA1OworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCS8qIENvdW50IGNlbGxzIGFuZCBjaGVjayBmb3Igbm9uLXByaW50YWJsZSBjaGFycyAqLworCQkJaWYgKGhhc19tYnl0ZSkKKwkJCXsKKwkJCSAgICBjZWxscyA9IDA7CisJCQkgICAgZm9yIChzID0gYXJnOyBzIDwgcDsgcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpKQorCQkJICAgIHsKKwkJCQlpZiAoIXZpbV9pc3ByaW50YygoKm1iX3B0cjJjaGFyKShzKSkpCisJCQkJICAgIGJyZWFrOworCQkJCWNlbGxzICs9ICgqbWJfcHRyMmNlbGxzKShzKTsKKwkJCSAgICB9CisJCQl9CisJCQllbHNlCisjZW5kaWYKKwkJCXsKKwkJCSAgICBmb3IgKHMgPSBhcmc7IHMgPCBwOyArK3MpCisJCQkJaWYgKCF2aW1faXNwcmludGMoKnMpKQorCQkJCSAgICBicmVhazsKKwkJCSAgICBjZWxscyA9IHMgLSBhcmc7CisJCQl9CisJCQkvKiBDdXJyZW50bHkgbXVzdCBiZSBvbmUgb3IgdHdvIGRpc3BsYXkgY2VsbHMgKi8KKwkJCWlmIChzICE9IHAgfHwgY2VsbHMgPCAxIHx8IGNlbGxzID4gMikKKwkJCXsKKwkJCSAgICAqcCA9IE5VTDsKKwkJCSAgICBFTVNHMihfKCJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiKSwgYXJnKTsKKwkJCSAgICByZXR1cm47CisJCQl9CisKKwkJCXZpbV9mcmVlKHNwLT5zbl90ZXh0KTsKKwkJCS8qIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgaWYgd2UgbmVlZCB0byBwYWQgdXAKKwkJCSAqIHdpdGggYSBzcGFjZS4gKi8KKwkJCWxlbiA9IHAgLSBhcmcgKyAoKGNlbGxzID09IDEpID8gMSA6IDApOworCQkJc3AtPnNuX3RleHQgPSB2aW1fc3RybnNhdmUoYXJnLCBsZW4pOworCisJCQlpZiAoc3AtPnNuX3RleHQgIT0gTlVMTCAmJiBjZWxscyA9PSAxKQorCQkJICAgIFNUUkNQWShzcC0+c25fdGV4dCArIGxlbiAtIDEsICIgIik7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgImxpbmVobD0iLCA3KSA9PSAwKQorCQkgICAgeworCQkJYXJnICs9IDc7CisJCQlzcC0+c25fbGluZV9obCA9IHN5bl9jaGVja19ncm91cChhcmcsIChpbnQpKHAgLSBhcmcpKTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKFNUUk5DTVAoYXJnLCAidGV4dGhsPSIsIDcpID09IDApCisJCSAgICB7CisJCQlhcmcgKz0gNzsKKwkJCXNwLT5zbl90ZXh0X2hsID0gc3luX2NoZWNrX2dyb3VwKGFyZywgKGludCkocCAtIGFyZykpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJRU1TRzIoXyhlX2ludmFyZzIpLCBhcmcpOworCQkJcmV0dXJuOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgZWxzZSBpZiAoc3AgPT0gTlVMTCkKKwkJRU1TRzIoXygiRTE1NTogVW5rbm93biBzaWduOiAlcyIpLCBhcmcpOworCSAgICBlbHNlIGlmIChpZHggPT0gU0lHTkNNRF9MSVNUKQorCQkvKiAiOnNpZ24gbGlzdCB7bmFtZX0iICovCisJCXNpZ25fbGlzdF9kZWZpbmVkKHNwKTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qICI6c2lnbiB1bmRlZmluZSB7bmFtZX0iICovCisJCXZpbV9mcmVlKHNwLT5zbl9uYW1lKTsKKwkJdmltX2ZyZWUoc3AtPnNuX2ljb24pOworI2lmZGVmIEZFQVRfU0lHTl9JQ09OUworCQlpZiAoc3AtPnNuX2ltYWdlICE9IE5VTEwpCisJCXsKKwkJICAgIG91dF9mbHVzaCgpOworCQkgICAgZ3VpX21jaF9kZXN0cm95X3NpZ24oc3AtPnNuX2ltYWdlKTsKKwkJfQorI2VuZGlmCisJCXZpbV9mcmVlKHNwLT5zbl90ZXh0KTsKKwkJaWYgKHNwX3ByZXYgPT0gTlVMTCkKKwkJICAgIGZpcnN0X3NpZ24gPSBzcC0+c25fbmV4dDsKKwkJZWxzZQorCQkgICAgc3BfcHJldi0+c25fbmV4dCA9IHNwLT5zbl9uZXh0OworCQl2aW1fZnJlZShzcCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaW50CQlpZCA9IC0xOworCWxpbmVucl9UCWxudW0gPSAtMTsKKwljaGFyX3UJCSpzaWduX25hbWUgPSBOVUxMOworCWNoYXJfdQkJKmFyZzE7CisKKwlpZiAoKmFyZyA9PSBOVUwpCisJeworCSAgICBpZiAoaWR4ID09IFNJR05DTURfUExBQ0UpCisJICAgIHsKKwkJLyogIjpzaWduIHBsYWNlIjogbGlzdCBwbGFjZWQgc2lnbnMgaW4gYWxsIGJ1ZmZlcnMgKi8KKwkJc2lnbl9saXN0X3BsYWNlZChOVUxMKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpZHggPT0gU0lHTkNNRF9VTlBMQUNFKQorCSAgICB7CisJCS8qICI6c2lnbiB1bnBsYWNlIjogcmVtb3ZlIHBsYWNlZCBzaWduIGF0IGN1cnNvciAqLworCQlpZCA9IGJ1Zl9maW5kc2lnbl9pZChjdXJ3aW4tPndfYnVmZmVyLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCQlpZiAoaWQgPiAwKQorCQl7CisJCSAgICBidWZfZGVsc2lnbihjdXJ3aW4tPndfYnVmZmVyLCBpZCk7CisJCSAgICB1cGRhdGVfZGVidWdfc2lnbihjdXJ3aW4tPndfYnVmZmVyLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCQl9CisJCWVsc2UKKwkJICAgIEVNU0coXygiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIpKTsKKwkgICAgfQorCSAgICBlbHNlCisJCUVNU0coXyhlX2FyZ3JlcSkpOworCSAgICByZXR1cm47CisJfQorCisJaWYgKGlkeCA9PSBTSUdOQ01EX1VOUExBQ0UgJiYgYXJnWzBdID09ICcqJyAmJiBhcmdbMV0gPT0gTlVMKQorCXsKKwkgICAgLyogIjpzaWduIHVucGxhY2UgKiI6IHJlbW92ZSBhbGwgcGxhY2VkIHNpZ25zICovCisJICAgIGJ1Zl9kZWxldGVfYWxsX3NpZ25zKCk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBmaXJzdCBhcmcgY291bGQgYmUgcGxhY2VkIHNpZ24gaWQgKi8KKwlhcmcxID0gYXJnOworCWlmIChWSU1fSVNESUdJVCgqYXJnKSkKKwl7CisJICAgIGlkID0gZ2V0ZGlnaXRzKCZhcmcpOworCSAgICBpZiAoIXZpbV9pc3doaXRlKCphcmcpICYmICphcmcgIT0gTlVMKQorCSAgICB7CisJCWlkID0gLTE7CisJCWFyZyA9IGFyZzE7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWFyZyA9IHNraXB3aGl0ZShhcmcpOworCQlpZiAoaWR4ID09IFNJR05DTURfVU5QTEFDRSAmJiAqYXJnID09IE5VTCkKKwkJeworCQkgICAgLyogIjpzaWduIHVucGxhY2Uge2lkfSI6IHJlbW92ZSBwbGFjZWQgc2lnbiBieSBudW1iZXIgKi8KKwkJICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwkJCWlmICgobG51bSA9IGJ1Zl9kZWxzaWduKGJ1ZiwgaWQpKSAhPSAwKQorCQkJICAgIHVwZGF0ZV9kZWJ1Z19zaWduKGJ1ZiwgbG51bSk7CisJCSAgICByZXR1cm47CisJCX0KKwkgICAgfQorCX0KKworCS8qCisJICogQ2hlY2sgZm9yIGxpbmU9e2xudW19IG5hbWU9e25hbWV9IGFuZCBmaWxlPXtmbmFtZX0gb3IgYnVmZmVyPXtucn0uCisJICogTGVhdmUgImFyZyIgcG9pbnRpbmcgdG8ge2ZuYW1lfS4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKFNUUk5DTVAoYXJnLCAibGluZT0iLCA1KSA9PSAwKQorCSAgICB7CisJCWFyZyArPSA1OworCQlsbnVtID0gYXRvaSgoY2hhciAqKWFyZyk7CisJCWFyZyA9IHNraXB0b3doaXRlKGFyZyk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoU1RSTkNNUChhcmcsICJuYW1lPSIsIDUpID09IDApCisJICAgIHsKKwkJYXJnICs9IDU7CisJCXNpZ25fbmFtZSA9IGFyZzsKKwkJYXJnID0gc2tpcHRvd2hpdGUoYXJnKTsKKwkJaWYgKCphcmcgIT0gTlVMKQorCQkgICAgKmFyZysrID0gTlVMOworCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUk5DTVAoYXJnLCAiZmlsZT0iLCA1KSA9PSAwKQorCSAgICB7CisJCWFyZyArPSA1OworCQlidWYgPSBidWZsaXN0X2ZpbmRuYW1lKGFyZyk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUk5DTVAoYXJnLCAiYnVmZmVyPSIsIDcpID09IDApCisJICAgIHsKKwkJYXJnICs9IDc7CisJCWJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKChpbnQpZ2V0ZGlnaXRzKCZhcmcpKTsKKwkJaWYgKCpza2lwd2hpdGUoYXJnKSAhPSBOVUwpCisJCSAgICBFTVNHKF8oZV90cmFpbGluZykpOworCQlicmVhazsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJRU1TRyhfKGVfaW52YXJnKSk7CisJCXJldHVybjsKKwkgICAgfQorCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnKTsKKwl9CisKKwlpZiAoYnVmID09IE5VTEwpCisJeworCSAgICBFTVNHMihfKCJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIpLCBhcmcpOworCX0KKwllbHNlIGlmIChpZCA8PSAwKQorCXsKKwkgICAgaWYgKGxudW0gPj0gMCB8fCBzaWduX25hbWUgIT0gTlVMTCkKKwkJRU1TRyhfKGVfaW52YXJnKSk7CisJICAgIGVsc2UKKwkJLyogIjpzaWduIHBsYWNlIGZpbGU9e2ZuYW1lfSI6IGxpc3QgcGxhY2VkIHNpZ25zIGluIG9uZSBmaWxlICovCisJCXNpZ25fbGlzdF9wbGFjZWQoYnVmKTsKKwl9CisJZWxzZSBpZiAoaWR4ID09IFNJR05DTURfSlVNUCkKKwl7CisJICAgIC8qICI6c2lnbiBqdW1wIHtpZH0gZmlsZT17Zm5hbWV9IiAqLworCSAgICBpZiAobG51bSA+PSAwIHx8IHNpZ25fbmFtZSAhPSBOVUxMKQorCQlFTVNHKF8oZV9pbnZhcmcpKTsKKwkgICAgZWxzZSBpZiAoKGxudW0gPSBidWZfZmluZHNpZ24oYnVmLCBpZCkpID4gMCkKKwkgICAgewkJCQkvKiBnb3RvIGEgc2lnbiAuLi4gKi8KKwkJaWYgKGJ1Zl9qdW1wX29wZW5fd2luKGJ1ZikgIT0gTlVMTCkKKwkJewkJCS8qIC4uLiBpbiBhIGN1cnJlbnQgd2luZG93ICovCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworCQkgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKwkJICAgIGJlZ2lubGluZShCTF9XSElURSk7CisJCX0KKwkJZWxzZQorCQl7CQkJLyogLi4uIG5vdCBjdXJyZW50bHkgaW4gYSB3aW5kb3cgKi8KKwkJICAgIGNoYXJfdQkqY21kOworCisJCSAgICBjbWQgPSBhbGxvYygodW5zaWduZWQpU1RSTEVOKGJ1Zi0+Yl9mbmFtZSkgKyAyNSk7CisJCSAgICBpZiAoY21kID09IE5VTEwpCisJCQlyZXR1cm47CisJCSAgICBzcHJpbnRmKChjaGFyICopY21kLCAiZSArJWxkICVzIiwgKGxvbmcpbG51bSwgYnVmLT5iX2ZuYW1lKTsKKwkJICAgIGRvX2NtZGxpbmVfY21kKGNtZCk7CisJCSAgICB2aW1fZnJlZShjbWQpOworCQl9CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJCUVNU0dOKF8oIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIiksIGlkKTsKKwl9CisJZWxzZSBpZiAoaWR4ID09IFNJR05DTURfVU5QTEFDRSkKKwl7CisJICAgIC8qICI6c2lnbiB1bnBsYWNlIHtpZH0gZmlsZT17Zm5hbWV9IiAqLworCSAgICBpZiAobG51bSA+PSAwIHx8IHNpZ25fbmFtZSAhPSBOVUxMKQorCQlFTVNHKF8oZV9pbnZhcmcpKTsKKwkgICAgZWxzZQorCSAgICB7CisJCWxudW0gPSBidWZfZGVsc2lnbihidWYsIGlkKTsKKwkJdXBkYXRlX2RlYnVnX3NpZ24oYnVmLCBsbnVtKTsKKwkgICAgfQorCX0KKwkgICAgLyogaWR4ID09IFNJR05DTURfUExBQ0UgKi8KKwllbHNlIGlmIChzaWduX25hbWUgIT0gTlVMTCkKKwl7CisJICAgIGZvciAoc3AgPSBmaXJzdF9zaWduOyBzcCAhPSBOVUxMOyBzcCA9IHNwLT5zbl9uZXh0KQorCQlpZiAoU1RSQ01QKHNwLT5zbl9uYW1lLCBzaWduX25hbWUpID09IDApCisJCSAgICBicmVhazsKKwkgICAgaWYgKHNwID09IE5VTEwpCisJICAgIHsKKwkJRU1TRzIoXygiRTE1NTogVW5rbm93biBzaWduOiAlcyIpLCBzaWduX25hbWUpOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgaWYgKGxudW0gPiAwKQorCQkvKiAiOnNpZ24gcGxhY2Uge2lkfSBsaW5lPXtsbnVtfSBuYW1lPXtuYW1lfSBmaWxlPXtmbmFtZX0iOgorCQkgKiBwbGFjZSBhIHNpZ24gKi8KKwkJYnVmX2FkZHNpZ24oYnVmLCBpZCwgbG51bSwgc3AtPnNuX3R5cGVucik7CisJICAgIGVsc2UKKwkJLyogIjpzaWduIHBsYWNlIHtpZH0gZmlsZT17Zm5hbWV9IjogY2hhbmdlIHNpZ24gdHlwZSAqLworCQlsbnVtID0gYnVmX2NoYW5nZV9zaWduX3R5cGUoYnVmLCBpZCwgc3AtPnNuX3R5cGVucik7CisJICAgIHVwZGF0ZV9kZWJ1Z19zaWduKGJ1ZiwgbG51bSk7CisJfQorCWVsc2UKKwkgICAgRU1TRyhfKGVfaW52YXJnKSk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1NJR05fSUNPTlMpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQWxsb2NhdGUgdGhlIGljb25zLiAgQ2FsbGVkIHdoZW4gdGhlIEdVSSBoYXMgc3RhcnRlZC4gIEFsbG93cyBkZWZpbmluZworICogc2lnbnMgYmVmb3JlIGl0IHN0YXJ0cy4KKyAqLworICAgIHZvaWQKK3NpZ25fZ3VpX3N0YXJ0ZWQoKQoreworICAgIHNpZ25fVAkqc3A7CisKKyAgICBmb3IgKHNwID0gZmlyc3Rfc2lnbjsgc3AgIT0gTlVMTDsgc3AgPSBzcC0+c25fbmV4dCkKKwlpZiAoc3AtPnNuX2ljb24gIT0gTlVMTCkKKwkgICAgc3AtPnNuX2ltYWdlID0gZ3VpX21jaF9yZWdpc3Rlcl9zaWduKHNwLT5zbl9pY29uKTsKK30KKyNlbmRpZgorCisvKgorICogTGlzdCBvbmUgc2lnbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzaWduX2xpc3RfZGVmaW5lZChzcCkKKyAgICBzaWduX1QJKnNwOworeworICAgIGNoYXJfdQkqcDsKKworICAgIHNtc2coKGNoYXJfdSAqKSJzaWduICVzIiwgc3AtPnNuX25hbWUpOworICAgIGlmIChzcC0+c25faWNvbiAhPSBOVUxMKQorICAgIHsKKwlNU0dfUFVUUygiIGljb249Iik7CisJbXNnX291dHRyYW5zKHNwLT5zbl9pY29uKTsKKyNpZmRlZiBGRUFUX1NJR05fSUNPTlMKKwlpZiAoc3AtPnNuX2ltYWdlID09IE5VTEwpCisJICAgIE1TR19QVVRTKF8oIiAoTk9UIEZPVU5EKSIpKTsKKyNlbHNlCisJTVNHX1BVVFMoXygiIChub3Qgc3VwcG9ydGVkKSIpKTsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAoc3AtPnNuX3RleHQgIT0gTlVMTCkKKyAgICB7CisJTVNHX1BVVFMoIiB0ZXh0PSIpOworCW1zZ19vdXR0cmFucyhzcC0+c25fdGV4dCk7CisgICAgfQorICAgIGlmIChzcC0+c25fbGluZV9obCA+IDApCisgICAgeworCU1TR19QVVRTKCIgbGluZWhsPSIpOworCXAgPSBnZXRfaGlnaGxpZ2h0X25hbWUoTlVMTCwgc3AtPnNuX2xpbmVfaGwgLSAxKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICBNU0dfUFVUUygiTk9ORSIpOworCWVsc2UKKwkgICAgbXNnX3B1dHMocCk7CisgICAgfQorICAgIGlmIChzcC0+c25fdGV4dF9obCA+IDApCisgICAgeworCU1TR19QVVRTKCIgdGV4dGhsPSIpOworCXAgPSBnZXRfaGlnaGxpZ2h0X25hbWUoTlVMTCwgc3AtPnNuX3RleHRfaGwgLSAxKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICBNU0dfUFVUUygiTk9ORSIpOworCWVsc2UKKwkgICAgbXNnX3B1dHMocCk7CisgICAgfQorfQorCisvKgorICogR2V0IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGUgZm9yIHNpZ24gInR5cGVuciIuCisgKiBJZiAibGluZSIgaXMgVFJVRTogbGluZSBoaWdobCwgaWYgRkFMU0U6IHRleHQgaGlnaGwuCisgKi8KKyAgICBpbnQKK3NpZ25fZ2V0X2F0dHIodHlwZW5yLCBsaW5lKQorICAgIGludAkJdHlwZW5yOworICAgIGludAkJbGluZTsKK3sKKyAgICBzaWduX1QJKnNwOworCisgICAgZm9yIChzcCA9IGZpcnN0X3NpZ247IHNwICE9IE5VTEw7IHNwID0gc3AtPnNuX25leHQpCisJaWYgKHNwLT5zbl90eXBlbnIgPT0gdHlwZW5yKQorCXsKKwkgICAgaWYgKGxpbmUpCisJICAgIHsKKwkJaWYgKHNwLT5zbl9saW5lX2hsID4gMCkKKwkJICAgIHJldHVybiBzeW5faWQyYXR0cihzcC0+c25fbGluZV9obCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChzcC0+c25fdGV4dF9obCA+IDApCisJCSAgICByZXR1cm4gc3luX2lkMmF0dHIoc3AtPnNuX3RleHRfaGwpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCB0ZXh0IG1hcmsgZm9yIHNpZ24gInR5cGVuciIuCisgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXNuJ3Qgb25lLgorICovCisgICAgY2hhcl91ICoKK3NpZ25fZ2V0X3RleHQodHlwZW5yKQorICAgIGludAkJdHlwZW5yOworeworICAgIHNpZ25fVAkqc3A7CisKKyAgICBmb3IgKHNwID0gZmlyc3Rfc2lnbjsgc3AgIT0gTlVMTDsgc3AgPSBzcC0+c25fbmV4dCkKKwlpZiAoc3AtPnNuX3R5cGVuciA9PSB0eXBlbnIpCisJICAgIHJldHVybiBzcC0+c25fdGV4dDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9TSUdOX0lDT05TKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQgKgorc2lnbl9nZXRfaW1hZ2UodHlwZW5yKQorICAgIGludAkJdHlwZW5yOwkJLyogdGhlIGF0dHJpYnV0ZSB3aGljaCBtYXkgaGF2ZSBhIHNpZ24gKi8KK3sKKyAgICBzaWduX1QJKnNwOworCisgICAgZm9yIChzcCA9IGZpcnN0X3NpZ247IHNwICE9IE5VTEw7IHNwID0gc3AtPnNuX25leHQpCisJaWYgKHNwLT5zbl90eXBlbnIgPT0gdHlwZW5yKQorCSAgICByZXR1cm4gc3AtPnNuX2ltYWdlOworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIG5hbWUgb2YgYSBzaWduIGJ5IGl0cyB0eXBlbnIuCisgKi8KKyAgICBjaGFyX3UgKgorc2lnbl90eXBlbnIybmFtZSh0eXBlbnIpCisgICAgaW50CQl0eXBlbnI7Cit7CisgICAgc2lnbl9UCSpzcDsKKworICAgIGZvciAoc3AgPSBmaXJzdF9zaWduOyBzcCAhPSBOVUxMOyBzcCA9IHNwLT5zbl9uZXh0KQorCWlmIChzcC0+c25fdHlwZW5yID09IHR5cGVucikKKwkgICAgcmV0dXJuIHNwLT5zbl9uYW1lOworICAgIHJldHVybiAoY2hhcl91ICopXygiW0RlbGV0ZWRdIik7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiAiOmRyb3AiCisgKiBPcGVucyB0aGUgZmlyc3QgYXJndW1lbnQgaW4gYSB3aW5kb3cuICBXaGVuIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBhcmd1bWVudHMKKyAqIHRoZSBhcmd1bWVudCBsaXN0IGlzIHJlZGVmaW5lZC4KKyAqLworICAgIHZvaWQKK2V4X2Ryb3AoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCXNwbGl0ID0gRkFMU0U7CisgICAgaW50CQlpbmN1cndpbiA9IEZBTFNFOworICAgIGNoYXJfdQkqYXJnOworICAgIGNoYXJfdQkqZmlyc3QgPSBOVUxMOworICAgIHdpbl9UCSp3cDsKKyAgICBidWZfVAkqYnVmOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWxyZWFkeSBiZWluZyBlZGl0ZWQgaW4gYSB3aW5kb3cuICBJZgorICAgICAqIHNvLCBqdW1wIHRvIHRoYXQgd2luZG93LgorICAgICAqIFdlIHdvdWxkIGFjdHVhbGx5IG5lZWQgdG8gY2hlY2sgYWxsIGFyZ3VtZW50cywgYnV0IHRoYXQncyBjb21wbGljYXRlZAorICAgICAqIGFuZCBtb3N0bHkgb25seSBvbmUgZmlsZSBpcyBkcm9wcGVkLgorICAgICAqIFRoaXMgYWxzbyBpZ25vcmVzIHdpbGRjYXJkcywgc2luY2UgaXQgaXMgdmVyeSB1bmxpa2VseSB0aGUgdXNlciBpcworICAgICAqIGVkaXRpbmcgYSBmaWxlIG5hbWUgd2l0aCBhIHdpbGRjYXJkIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBhcmcgPSB2aW1fc3Ryc2F2ZShlYXAtPmFyZyk7CisgICAgaWYgKGFyZyAhPSBOVUxMKQorICAgIHsKKwkvKiBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50LCByZW1vdmUgcXVvdGVzLCBtYWtlIGl0IGEgZnVsbCBwYXRoLiAqLworCWZpcnN0ID0gZml4X2ZuYW1lKGFyZyk7CisJaWYgKGZpcnN0ICE9IE5VTEwpCisJeworCSAgICBidWYgPSBidWZsaXN0X2ZpbmRuYW1lKGZpcnN0KTsKKwkgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorCSAgICB7CisJCWlmICh3cC0+d19idWZmZXIgPT0gYnVmKQorCQl7CisJCSAgICBpbmN1cndpbiA9IFRSVUU7CisjIGlmZGVmIEZFQVRfV0lORE9XUworCQkgICAgd2luX2VudGVyKHdwLCBUUlVFKTsKKwkJICAgIGJyZWFrOworIyBlbmRpZgorCQl9CisJICAgIH0KKwkgICAgdmltX2ZyZWUoZmlyc3QpOworCisJICAgIGlmIChpbmN1cndpbikKKwkgICAgeworCQkvKiBBbHJlYWR5IGVkaXRpbmcgdGhlIGZpbGUuICBSZWRlZmluZSB0aGUgYXJndW1lbnQgbGlzdC4gKi8KKwkJc2V0X2FyZ2xpc3QoZWFwLT5hcmcpOworCQljdXJ3aW4tPndfYXJnX2lkeCA9IDA7CisJCXZpbV9mcmVlKGFyZyk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKwl2aW1fZnJlZShhcmcpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBidWZmZXIgaXMgY2hhbmdlZC4gSWYgc28sIHdlIHdpbGwgbmVlZAorICAgICAqIHRvIHNwbGl0IHRoZSBjdXJyZW50IHdpbmRvdyBvciBkYXRhIGNvdWxkIGJlIGxvc3QuCisgICAgICogU2tpcCB0aGUgY2hlY2sgaWYgdGhlICdoaWRkZW4nIG9wdGlvbiBpcyBzZXQsIGFzIGluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiBidWZmZXIgd29uJ3QgYmUgbG9zdC4KKyAgICAgKi8KKyAgICBpZiAoIVBfSElEKGN1cmJ1ZikpCisgICAgeworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwkrK2Vtc2dfb2ZmOworIyBlbmRpZgorCXNwbGl0ID0gY2hlY2tfY2hhbmdlZChjdXJidWYsIFRSVUUsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwktLWVtc2dfb2ZmOworIyBlbHNlCisJaWYgKHNwbGl0KQorCSAgICByZXR1cm47CisjIGVuZGlmCisgICAgfQorCisgICAgLyogRmFrZSBhICI6c25leHQiIG9yICI6bmV4dCIgY29tbWFuZCwgcmVkZWZpbmUgdGhlIGFyZ2xpc3QuICovCisgICAgaWYgKHNwbGl0KQorICAgIHsKKwllYXAtPmNtZGlkeCA9IENNRF9zbmV4dDsKKwllYXAtPmNtZFswXSA9ICdzJzsKKyAgICB9CisgICAgZWxzZQorCWVhcC0+Y21kaWR4ID0gQ01EX25leHQ7CisgICAgZXhfbmV4dChlYXApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZXhfY21kcy5oIGIvc3JjL2V4X2NtZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZlYWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V4X2NtZHMuaApAQCAtMCwwICsxLDk2MSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFeCBjb21tYW5kcy4KKyAqIFdoZW4gRE9fREVDTEFSRV9FWENNRCBpcyBkZWZpbmVkLCB0aGUgdGFibGUgd2l0aCBleCBjb21tYW5kIG5hbWVzIGFuZAorICogb3B0aW9ucyByZXN1bHRzLgorICogV2hlbiBET19ERUNMQVJFX0VYQ01EIGlzIE5PVCBkZWZpbmVkLCB0aGUgZW51bSB3aXRoIGFsbCB0aGUgRXggY29tbWFuZHMKKyAqIHJlc3VsdHMuCisgKiBUaGlzIGNsZXZlciB0cmljayB3YXMgaW52ZW50ZWQgYnkgUm9uIEFhcm9uLgorICovCisKKy8qCisgKiBXaGVuIGFkZGluZyBhbiBFeCBjb21tYW5kOgorICogMS4gQWRkIGFuIGVudHJ5IGluIHRoZSB0YWJsZSBiZWxvdy4gIEtlZXAgaXQgc29ydGVkIG9uIHRoZSBzaG9ydGVzdAorICogICAgdmVyc2lvbiBvZiB0aGUgY29tbWFuZCBuYW1lIHRoYXQgd29ya3MuICBJZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYQorICogICAgbG93ZXIgY2FzZSBsZXR0ZXIsIGFkZCBpdCBhdCB0aGUgZW5kLgorICogMi4gQWRkIGEgImNhc2U6IENNRF94eHgiIGluIHRoZSBiaWcgc3dpdGNoIGluIGV4X2RvY21kLmMuCisgKiAzLiBBZGQgYW4gZW50cnkgaW4gdGhlIGluZGV4IGZvciBFeCBjb21tYW5kcyBhdCAiOmhlbHAgZXgtY21kLWluZGV4Ii4KKyAqIDQuIEFkZCBkb2N1bWVudGF0aW9uIGluIC4uL2RvYy94eHgudHh0LiAgQWRkIGEgdGFnIGZvciBib3RoIHRoZSBzaG9ydCBhbmQKKyAqICAgIGxvbmcgbmFtZSBvZiB0aGUgY29tbWFuZC4KKyAqLworCisjaWZkZWYgUkFOR0UKKyMgdW5kZWYgUkFOR0UJCQkvKiBTQVNDIG9uIEFtaWdhIGRlZmluZXMgaXQgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJBTkdFCQkweDAwMQkvKiBhbGxvdyBhIGxpbmVzcGVjcyAqLworI2RlZmluZSBCQU5HCQkweDAwMgkvKiBhbGxvdyBhICEgYWZ0ZXIgdGhlIGNvbW1hbmQgbmFtZSAqLworI2RlZmluZSBFWFRSQQkJMHgwMDQJLyogYWxsb3cgZXh0cmEgYXJncyBhZnRlciBjb21tYW5kIG5hbWUgKi8KKyNkZWZpbmUgWEZJTEUJCTB4MDA4CS8qIGV4cGFuZCB3aWxkY2FyZHMgaW4gZXh0cmEgcGFydCAqLworI2RlZmluZSBOT1NQQwkJMHgwMTAJLyogbm8gc3BhY2VzIGFsbG93ZWQgaW4gdGhlIGV4dHJhIHBhcnQgKi8KKyNkZWZpbmUJREZMQUxMCQkweDAyMAkvKiBkZWZhdWx0IGZpbGUgcmFuZ2UgaXMgMSwkICovCisjZGVmaW5lIFdIT0xFRk9MRAkweDA0MAkvKiBleHRlbmQgcmFuZ2UgdG8gaW5jbHVkZSB3aG9sZSBmb2xkIGFsc28KKwkJCQkgICB3aGVuIGxlc3MgdGhhbiB0d28gbnVtYmVycyBnaXZlbiAqLworI2RlZmluZSBORUVEQVJHCQkweDA4MAkvKiBhcmd1bWVudCByZXF1aXJlZCAqLworI2RlZmluZSBUUkxCQVIJCTB4MTAwCS8qIGNoZWNrIGZvciB0cmFpbGluZyB2ZXJ0aWNhbCBiYXIgKi8KKyNkZWZpbmUgUkVHU1RSCQkweDIwMAkvKiBhbGxvdyAieCBmb3IgcmVnaXN0ZXIgZGVzaWduYXRpb24gKi8KKyNkZWZpbmUgQ09VTlQJCTB4NDAwCS8qIGFsbG93IGNvdW50IGluIGFyZ3VtZW50LCBhZnRlciBjb21tYW5kICovCisjZGVmaW5lIE5PVFJMQ09NCTB4ODAwCS8qIG5vIHRyYWlsaW5nIGNvbW1lbnQgYWxsb3dlZCAqLworI2RlZmluZSBaRVJPUgkgICAgICAgMHgxMDAwCS8qIHplcm8gbGluZSBudW1iZXIgYWxsb3dlZCAqLworI2RlZmluZSBVU0VDVFJMViAgICAgICAweDIwMDAJLyogZG8gbm90IHJlbW92ZSBDVFJMLVYgZnJvbSBhcmd1bWVudCAqLworI2RlZmluZSBOT1RBRFIJICAgICAgIDB4NDAwMAkvKiBudW1iZXIgYmVmb3JlIGNvbW1hbmQgaXMgbm90IGFuIGFkZHJlc3MgKi8KKyNkZWZpbmUgRURJVENNRAkgICAgICAgMHg4MDAwCS8qIGFsbG93ICIrY29tbWFuZCIgYXJndW1lbnQgKi8KKyNkZWZpbmUgQlVGTkFNRQkgICAgICAweDEwMDAwTAkvKiBhY2NlcHRzIGJ1ZmZlciBuYW1lICovCisjZGVmaW5lIEJVRlVOTAkgICAgICAweDIwMDAwTAkvKiBhY2NlcHRzIHVubGlzdGVkIGJ1ZmZlciB0b28gKi8KKyNkZWZpbmUgQVJHT1BUCSAgICAgIDB4NDAwMDBMCS8qIGFsbG93ICIrK29wdD12YWwiIGFyZ3VtZW50ICovCisjZGVmaW5lIFNCT1hPSwkgICAgICAweDgwMDAwTAkvKiBhbGxvd2VkIGluIHRoZSBzYW5kYm94ICovCisjZGVmaW5lIENNRFdJTgkgICAgIDB4MTAwMDAwTAkvKiBhbGxvd2VkIGluIGNtZGxpbmUgd2luZG93ICovCisjZGVmaW5lIE1PRElGWSAgICAgICAweDIwMDAwMEwgIC8qIGZvcmJpZGRlbiBpbiBub24tJ21vZGlmaWFibGUnIGJ1ZmZlciAqLworI2RlZmluZSBGSUxFUwkoWEZJTEUgfCBFWFRSQSkJLyogbXVsdGlwbGUgZXh0cmEgZmlsZXMgYWxsb3dlZCAqLworI2RlZmluZSBXT1JEMQkoRVhUUkEgfCBOT1NQQykJLyogb25lIGV4dHJhIHdvcmQgYWxsb3dlZCAqLworI2RlZmluZSBGSUxFMQkoRklMRVMgfCBOT1NQQykJLyogMSBmaWxlIGFsbG93ZWQsIGRlZmF1bHRzIHRvIGN1cnJlbnQgZmlsZSAqLworCisjaWZuZGVmIERPX0RFQ0xBUkVfRVhDTUQKK3R5cGVkZWYgc3RydWN0IGV4YXJnIGV4YXJnX1Q7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgYXJyYXkgbWFwcyBleCBjb21tYW5kIG5hbWVzIHRvIGNvbW1hbmQgY29kZXMuCisgKiBUaGUgb3JkZXIgaW4gd2hpY2ggY29tbWFuZCBuYW1lcyBhcmUgbGlzdGVkIGJlbG93IGlzIHNpZ25pZmljYW50IC0tCisgKiBhbWJpZ3VvdXMgYWJicmV2aWF0aW9ucyBhcmUgYWx3YXlzIHJlc29sdmVkIHRvIGJlIHRoZSBmaXJzdCBwb3NzaWJsZSBtYXRjaAorICogKGUuZy4gInIiIGlzIHRha2VuIHRvIG1lYW4gInJlYWQiLCBub3QgInJld2luZCIsIGJlY2F1c2UgInJlYWQiIGNvbWVzCisgKiBiZWZvcmUgInJld2luZCIpLgorICogTm90IHN1cHBvcnRlZCBjb21tYW5kcyBhcmUgaW5jbHVkZWQgdG8gYXZvaWQgYW1iaWd1aXRpZXMuCisgKi8KKyNpZmRlZiBFWAorIyB1bmRlZiBFWAkgICAgLyoganVzdCBpbiBjYXNlICovCisjZW5kaWYKKyNpZmRlZiBET19ERUNMQVJFX0VYQ01ECisjIGRlZmluZSBFWChhLCBiLCBjLCBkKSAgeyhjaGFyX3UgKiliLCBjLCBkfQorCit0eXBlZGVmIHZvaWQgKCpleF9mdW5jX1QpIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisKK3N0YXRpYyBzdHJ1Y3QgY21kbmFtZQoreworICAgIGNoYXJfdQkqY21kX25hbWU7CS8qIG5hbWUgb2YgdGhlIGNvbW1hbmQgKi8KKyAgICBleF9mdW5jX1QgICBjbWRfZnVuYzsJLyogZnVuY3Rpb24gZm9yIHRoaXMgY29tbWFuZCAqLworICAgIGxvbmdfdQljbWRfYXJndDsJLyogZmxhZ3MgZGVjbGFyZWQgYWJvdmUgKi8KK30KKyMgaWYgZGVmaW5lZChGRUFUX0dVSV9XMTYpCitfZmFyCisjIGVuZGlmCitjbWRuYW1lc1tdID0KKyNlbHNlCisjIGRlZmluZSBFWChhLCBiLCBjLCBkKSAgYQorZW51bSBDTURfaW5kZXgKKyNlbmRpZgoreworRVgoQ01EX2FwcGVuZCwJCSJhcHBlbmQiLAlleF9hcHBlbmQsCisJCQlCQU5HfFJBTkdFfFpFUk9SfFRSTEJBUnxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9hYmJyZXZpYXRlLAkiYWJicmV2aWF0ZSIsCWV4X2FiYnJldmlhdGUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9hYmNsZWFyLAkJImFiY2xlYXIiLAlleF9hYmNsZWFyLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfYWJvdmVsZWZ0LAkiYWJvdmVsZWZ0IiwJZXhfd3Jvbmdtb2RpZmllciwKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2FsbCwJCSJhbGwiLAkJZXhfYWxsLAorCQkJUkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfYW1lbnUsCQkiYW1lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2Fub3JlbWVudSwJImFub3JlbWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfYXJncywJCSJhcmdzIiwJCWV4X2FyZ3MsCisJCQlCQU5HfEZJTEVTfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfYXJnYWRkLAkJImFyZ2FkZCIsCWV4X2FyZ2FkZCwKKwkJCUJBTkd8TkVFREFSR3xSQU5HRXxOT1RBRFJ8Q09VTlR8RklMRVN8VFJMQkFSKSwKK0VYKENNRF9hcmdkZWxldGUsCSJhcmdkZWxldGUiLAlleF9hcmdkZWxldGUsCisJCQlCQU5HfFJBTkdFfE5PVEFEUnxDT1VOVHxGSUxFU3xUUkxCQVIpLAorRVgoQ01EX2FyZ2RvLAkJImFyZ2RvIiwJZXhfbGlzdGRvLAorCQkJQkFOR3xORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9hcmdlZGl0LAkJImFyZ2VkaXQiLAlleF9hcmdlZGl0LAorCQkJQkFOR3xORUVEQVJHfFJBTkdFfE5PVEFEUnxDT1VOVHxGSUxFMXxFRElUQ01EfFRSTEJBUiksCitFWChDTURfYXJnZ2xvYmFsLAkiYXJnZ2xvYmFsIiwJZXhfYXJncywKKwkJCUJBTkd8RklMRVN8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9hcmdsb2NhbCwJImFyZ2xvY2FsIiwJZXhfYXJncywKKwkJCUJBTkd8RklMRVN8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9hcmd1bWVudCwJImFyZ3VtZW50IiwJZXhfYXJndW1lbnQsCisJCQlCQU5HfFJBTkdFfE5PVEFEUnxDT1VOVHxFWFRSQXxFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX2FzY2lpLAkJImFzY2lpIiwJZG9fYXNjaWksCisJCQlUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfYXV0b2NtZCwJCSJhdXRvY21kIiwJZXhfYXV0b2NtZCwKKwkJCUJBTkd8RVhUUkF8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9hdWdyb3VwLAkJImF1Z3JvdXAiLAlleF9hdXRvY21kLAorCQkJQkFOR3xXT1JEMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9hdW5tZW51LAkJImF1bm1lbnUiLAlleF9tZW51LAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfYnVmZmVyLAkJImJ1ZmZlciIsCWV4X2J1ZmZlciwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfEJVRk5BTUV8QlVGVU5MfENPVU5UfEVYVFJBfFRSTEJBUiksCitFWChDTURfYk5leHQsCQkiYk5leHQiLAlleF9icHJldmlvdXMsCisJCQlCQU5HfFJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX2JhbGwsCQkiYmFsbCIsCQlleF9idWZmZXJfYWxsLAorCQkJUkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfYmFkZCwJCSJiYWRkIiwJCWV4X2VkaXQsCisJCQlORUVEQVJHfEZJTEUxfEVESVRDTUR8VFJMQkFSfENNRFdJTiksCitFWChDTURfYmRlbGV0ZSwJCSJiZGVsZXRlIiwJZXhfYnVubG9hZCwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfEJVRk5BTUV8Q09VTlR8RVhUUkF8VFJMQkFSKSwKK0VYKENNRF9iZWhhdmUsCQkiYmVoYXZlIiwJZXhfYmVoYXZlLAorCQkJTkVFREFSR3xXT1JEMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9iZWxvd3JpZ2h0LAkiYmVsb3dyaWdodCIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9iZmlyc3QsCQkiYmZpcnN0IiwJZXhfYnJld2luZCwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfFRSTEJBUiksCitFWChDTURfYmxhc3QsCQkiYmxhc3QiLAlleF9ibGFzdCwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfFRSTEJBUiksCitFWChDTURfYm1vZGlmaWVkLAkiYm1vZGlmaWVkIiwJZXhfYm1vZGlmaWVkLAorCQkJQkFOR3xSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9ibmV4dCwJCSJibmV4dCIsCWV4X2JuZXh0LAorCQkJQkFOR3xSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9ib3RyaWdodCwJImJvdHJpZ2h0IiwJZXhfd3Jvbmdtb2RpZmllciwKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2JwcmV2aW91cywJImJwcmV2aW91cyIsCWV4X2JwcmV2aW91cywKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfYnJld2luZCwJCSJicmV3aW5kIiwJZXhfYnJld2luZCwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfFRSTEJBUiksCitFWChDTURfYnJlYWssCQkiYnJlYWsiLAlleF9icmVhaywKKwkJCVRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9icmVha2FkZCwJImJyZWFrYWRkIiwJZXhfYnJlYWthZGQsCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9icmVha2RlbCwJImJyZWFrZGVsIiwJZXhfYnJlYWtkZWwsCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9icmVha2xpc3QsCSJicmVha2xpc3QiLAlleF9icmVha2xpc3QsCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9icm93c2UsCQkiYnJvd3NlIiwJZXhfd3Jvbmdtb2RpZmllciwKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT018Q01EV0lOKSwKK0VYKENNRF9idWZmZXJzLAkJImJ1ZmZlcnMiLAlidWZsaXN0X2xpc3QsCisJCQlCQU5HfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2J1ZmRvLAkJImJ1ZmRvIiwJZXhfbGlzdGRvLAorCQkJQkFOR3xORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9idW5sb2FkLAkJImJ1bmxvYWQiLAlleF9idW5sb2FkLAorCQkJQkFOR3xSQU5HRXxOT1RBRFJ8QlVGTkFNRXxDT1VOVHxFWFRSQXxUUkxCQVIpLAorRVgoQ01EX2J3aXBlb3V0LAkiYndpcGVvdXQiLAlleF9idW5sb2FkLAorCQkJQkFOR3xSQU5HRXxOT1RBRFJ8QlVGTkFNRXxCVUZVTkx8Q09VTlR8RVhUUkF8VFJMQkFSKSwKK0VYKENNRF9jaGFuZ2UsCQkiY2hhbmdlIiwJZXhfY2hhbmdlLAorCQkJQkFOR3xXSE9MRUZPTER8UkFOR0V8Q09VTlR8VFJMQkFSfENNRFdJTnxNT0RJRlkpLAorRVgoQ01EX2NOZXh0LAkJImNOZXh0IiwJZXhfY25leHQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSfEJBTkcpLAorRVgoQ01EX2NOZmlsZSwJCSJjTmZpbGUiLAlleF9jbmV4dCwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY2FiYnJldiwJCSJjYWJicmV2IiwJZXhfYWJicmV2aWF0ZSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2NhYmNsZWFyLAkiY2FiY2xlYXIiLAlleF9hYmNsZWFyLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfY2FsbCwJCSJjYWxsIiwJCWV4X2NhbGwsCisJCQlSQU5HRXxORUVEQVJHfEVYVFJBfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2NhdGNoLAkJImNhdGNoIiwJZXhfY2F0Y2gsCisJCQlFWFRSQXxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9jYywJCSJjYyIsCQlleF9jYywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY2Nsb3NlLAkJImNjbG9zZSIsCWV4X2NjbG9zZSwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX2NkLAkJImNkIiwJCWV4X2NkLAorCQkJRklMRTF8VFJMQkFSfENNRFdJTiksCitFWChDTURfY2VudGVyLAkJImNlbnRlciIsCWV4X2FsaWduLAorCQkJVFJMQkFSfFJBTkdFfFdIT0xFRk9MRHxFWFRSQXxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9jZmlsZSwJCSJjZmlsZSIsCWV4X2NmaWxlLAorCQkJVFJMQkFSfEZJTEUxfEJBTkcpLAorRVgoQ01EX2NmaXJzdCwJCSJjZmlyc3QiLAlleF9jYywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY2dldGZpbGUsCSJjZ2V0ZmlsZSIsCWV4X2NmaWxlLAorCQkJVFJMQkFSfEZJTEUxfEJBTkcpLAorRVgoQ01EX2NoZGlyLAkJImNoZGlyIiwJZXhfY2QsCisJCQlGSUxFMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9jaGFuZ2VzLAkJImNoYW5nZXMiLAlleF9jaGFuZ2VzLAorCQkJVFJMQkFSfENNRFdJTiksCitFWChDTURfY2hlY2twYXRoLAkiY2hlY2twYXRoIiwJZXhfY2hlY2twYXRoLAorCQkJVFJMQkFSfEJBTkd8Q01EV0lOKSwKK0VYKENNRF9jaGVja3RpbWUsCSJjaGVja3RpbWUiLAlleF9jaGVja3RpbWUsCisJCQlSQU5HRXxOT1RBRFJ8QlVGTkFNRXxDT1VOVHxFWFRSQXxUUkxCQVIpLAorRVgoQ01EX2NsaXN0LAkJImNsaXN0IiwJcWZfbGlzdCwKKwkJCUJBTkd8RVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfY2xhc3QsCQkiY2xhc3QiLAlleF9jYywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY2xvc2UsCQkiY2xvc2UiLAlleF9jbG9zZSwKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfY21hcCwJCSJjbWFwIiwJCWV4X21hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2NtYXBjbGVhciwJImNtYXBjbGVhciIsCWV4X21hcGNsZWFyLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfY21lbnUsCQkiY21lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2NuZXh0LAkJImNuZXh0IiwJZXhfY25leHQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSfEJBTkcpLAorRVgoQ01EX2NuZXdlciwJCSJjbmV3ZXIiLAlxZl9hZ2UsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9jbmZpbGUsCQkiY25maWxlIiwJZXhfY25leHQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSfEJBTkcpLAorRVgoQ01EX2Nub3JlbWFwLAkiY25vcmVtYXAiLAlleF9tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9jbm9yZWFiYnJldiwJImNub3JlYWJicmV2IiwJZXhfYWJicmV2aWF0ZSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2Nub3JlbWVudSwJImNub3JlbWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfY29weSwJCSJjb3B5IiwJCWV4X2NvcHltb3ZlLAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfFRSTEJBUnxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9jb2xkZXIsCQkiY29sZGVyIiwJcWZfYWdlLAorCQkJUkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfY29sb3JzY2hlbWUsCSJjb2xvcnNjaGVtZSIsCWV4X2NvbG9yc2NoZW1lLAorCQkJTkVFREFSR3xXT1JEMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9jb21tYW5kLAkJImNvbW1hbmQiLAlleF9jb21tYW5kLAorCQkJRVhUUkF8QkFOR3xOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2NvbWNsZWFyLAkiY29tY2xlYXIiLAlleF9jb21jbGVhciwKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2NvbXBpbGVyLAkiY29tcGlsZXIiLAlleF9jb21waWxlciwKKwkJCUJBTkd8VFJMQkFSfFdPUkQxKSwKK0VYKENNRF9jb250aW51ZSwJImNvbnRpbnVlIiwJZXhfY29udGludWUsCisJCQlUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfY29uZmlybSwJCSJjb25maXJtIiwJZXhfd3Jvbmdtb2RpZmllciwKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT018Q01EV0lOKSwKK0VYKENNRF9jb3BlbiwJCSJjb3BlbiIsCWV4X2NvcGVuLAorCQkJUkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfY3ByZXZpb3VzLAkiY3ByZXZpb3VzIiwJZXhfY25leHQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSfEJBTkcpLAorRVgoQ01EX2NwZmlsZSwJCSJjcGZpbGUiLAlleF9jbmV4dCwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY3F1aXQsCQkiY3F1aXQiLAlleF9jcXVpdCwKKwkJCVRSTEJBUnxCQU5HKSwKK0VYKENNRF9jcmV3aW5kLAkJImNyZXdpbmQiLAlleF9jYywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8QkFORyksCitFWChDTURfY3Njb3BlLAkJImNzY29wZSIsCWRvX2NzY29wZSwKKwkJCUVYVFJBfE5PVFJMQ09NfFNCT1hPS3xYRklMRSksCitFWChDTURfY3N0YWcsCQkiY3N0YWciLAlkb19jc3RhZywKKwkJCUJBTkd8VFJMQkFSfFdPUkQxKSwKK0VYKENNRF9jdW5tYXAsCQkiY3VubWFwIiwJZXhfdW5tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9jdW5hYmJyZXYsCSJjdW5hYmJyZXYiLAlleF9hYmJyZXZpYXRlLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfY3VubWVudSwJCSJjdW5tZW51IiwJZXhfbWVudSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2N3aW5kb3csCQkiY3dpbmRvdyIsCWV4X2N3aW5kb3csCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9kZWxldGUsCQkiZGVsZXRlIiwJZXhfb3BlcmF0b3JzLAorCQkJUkFOR0V8V0hPTEVGT0xEfFJFR1NUUnxDT1VOVHxUUkxCQVJ8Q01EV0lOfE1PRElGWSksCitFWChDTURfZGVidWcsCQkiZGVidWciLAlleF9kZWJ1ZywKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT018U0JPWE9LfENNRFdJTiksCitFWChDTURfZGVidWdncmVlZHksCSJkZWJ1Z2dyZWVkeSIsCWV4X2RlYnVnZ3JlZWR5LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2RlbGNvbW1hbmQsCSJkZWxjb21tYW5kIiwJZXhfZGVsY29tbWFuZCwKKwkJCU5FRURBUkd8V09SRDF8VFJMQkFSfENNRFdJTiksCitFWChDTURfZGVsZnVuY3Rpb24sCSJkZWxmdW5jdGlvbiIsCWV4X2RlbGZ1bmN0aW9uLAorCQkJTkVFREFSR3xXT1JEMXxDTURXSU4pLAorRVgoQ01EX2Rpc3BsYXksCQkiZGlzcGxheSIsCWV4X2Rpc3BsYXksCisJCQlFWFRSQXxOT1RSTENPTXxUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfZGlmZnVwZGF0ZSwJImRpZmZ1cGRhdGUiLAlleF9kaWZmdXBkYXRlLAorCQkJVFJMQkFSKSwKK0VYKENNRF9kaWZmZ2V0LAkJImRpZmZnZXQiLAlleF9kaWZmZ2V0cHV0LAorCQkJUkFOR0V8RVhUUkF8VFJMQkFSfE1PRElGWSksCitFWChDTURfZGlmZnBhdGNoLAkiZGlmZnBhdGNoIiwJZXhfZGlmZnBhdGNoLAorCQkJRVhUUkF8RklMRTF8VFJMQkFSfE1PRElGWSksCitFWChDTURfZGlmZnB1dCwJCSJkaWZmcHV0IiwJZXhfZGlmZmdldHB1dCwKKwkJCVJBTkdFfEVYVFJBfFRSTEJBUiksCitFWChDTURfZGlmZnNwbGl0LAkiZGlmZnNwbGl0IiwJZXhfZGlmZnNwbGl0LAorCQkJRVhUUkF8RklMRTF8VFJMQkFSKSwKK0VYKENNRF9kaWZmdGhpcywJImRpZmZ0aGlzIiwJZXhfZGlmZnRoaXMsCisJCQlUUkxCQVIpLAorRVgoQ01EX2RpZ3JhcGhzLAkiZGlncmFwaHMiLAlleF9kaWdyYXBocywKKwkJCUVYVFJBfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2RqdW1wLAkJImRqdW1wIiwJZXhfZmluZHBhdCwKKwkJCUJBTkd8UkFOR0V8REZMQUxMfFdIT0xFRk9MRHxFWFRSQSksCitFWChDTURfZGxpc3QsCQkiZGxpc3QiLAlleF9maW5kcGF0LAorCQkJQkFOR3xSQU5HRXxERkxBTEx8V0hPTEVGT0xEfEVYVFJBfENNRFdJTiksCitFWChDTURfZG9hdXRvY21kLAkiZG9hdXRvY21kIiwJZXhfZG9hdXRvY21kLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfZG9hdXRvYWxsLAkiZG9hdXRvYWxsIiwJZXhfZG9hdXRvYWxsLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfZHJvcCwJCSJkcm9wIiwJCWV4X2Ryb3AsCisJCQlGSUxFU3xFRElUQ01EfE5FRURBUkd8QVJHT1BUfFRSTEJBUiksCitFWChDTURfZHNlYXJjaCwJCSJkc2VhcmNoIiwJZXhfZmluZHBhdCwKKwkJCUJBTkd8UkFOR0V8REZMQUxMfFdIT0xFRk9MRHxFWFRSQXxDTURXSU4pLAorRVgoQ01EX2RzcGxpdCwJCSJkc3BsaXQiLAlleF9maW5kcGF0LAorCQkJQkFOR3xSQU5HRXxERkxBTEx8V0hPTEVGT0xEfEVYVFJBKSwKK0VYKENNRF9lZGl0LAkJImVkaXQiLAkJZXhfZWRpdCwKKwkJCUJBTkd8RklMRTF8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9lY2hvLAkJImVjaG8iLAkJZXhfZWNobywKKwkJCUVYVFJBfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2VjaG9lcnIsCQkiZWNob2VyciIsCWV4X2V4ZWN1dGUsCisJCQlFWFRSQXxOT1RSTENPTXxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9lY2hvaGwsCQkiZWNob2hsIiwJZXhfZWNob2hsLAorCQkJRVhUUkF8VFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2VjaG9tc2csCQkiZWNob21zZyIsCWV4X2V4ZWN1dGUsCisJCQlFWFRSQXxOT1RSTENPTXxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9lY2hvbiwJCSJlY2hvbiIsCWV4X2VjaG8sCisJCQlFWFRSQXxOT1RSTENPTXxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9lbHNlLAkJImVsc2UiLAkJZXhfZWxzZSwKKwkJCVRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9lbHNlaWYsCQkiZWxzZWlmIiwJZXhfZWxzZSwKKwkJCUVYVFJBfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2VtZW51LAkJImVtZW51IiwJZXhfZW1lbnUsCisJCQlORUVEQVJHfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxSQU5HRXxOT1RBRFJ8Q01EV0lOKSwKK0VYKENNRF9lbmRpZiwJCSJlbmRpZiIsCWV4X2VuZGlmLAorCQkJVFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2VuZGZ1bmN0aW9uLAkiZW5kZnVuY3Rpb24iLAlleF9lbmRmdW5jdGlvbiwKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2VuZHRyeSwJCSJlbmR0cnkiLAlleF9lbmR0cnksCisJCQlUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfZW5kd2hpbGUsCSJlbmR3aGlsZSIsCWV4X2VuZHdoaWxlLAorCQkJVFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2VuZXcsCQkiZW5ldyIsCQlleF9lZGl0LAorCQkJQkFOR3xUUkxCQVIpLAorRVgoQ01EX2V4LAkJImV4IiwJCWV4X2VkaXQsCisJCQlCQU5HfEZJTEUxfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfZXhlY3V0ZSwJCSJleGVjdXRlIiwJZXhfZXhlY3V0ZSwKKwkJCUVYVFJBfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2V4aXQsCQkiZXhpdCIsCQlleF9leGl0LAorCQkJUkFOR0V8V0hPTEVGT0xEfEJBTkd8RklMRTF8QVJHT1BUfERGTEFMTHxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9maWxlLAkJImZpbGUiLAkJZXhfZmlsZSwKKwkJCUJBTkd8RklMRTF8VFJMQkFSKSwKK0VYKENNRF9maWxlcywJCSJmaWxlcyIsCWJ1Zmxpc3RfbGlzdCwKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfZmlsZXR5cGUsCSJmaWxldHlwZSIsCWV4X2ZpbGV0eXBlLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfZmluZCwJCSJmaW5kIiwJCWV4X2ZpbmQsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xGSUxFMXxFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX2ZpbmFsbHksCQkiZmluYWxseSIsCWV4X2ZpbmFsbHksCisJCQlUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfZmluaXNoLAkJImZpbmlzaCIsCWV4X2ZpbmlzaCwKKwkJCVRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9maXJzdCwJCSJmaXJzdCIsCWV4X3Jld2luZCwKKwkJCUVYVFJBfEJBTkd8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9maXhkZWwsCQkiZml4ZGVsIiwJZG9fZml4ZGVsLAorCQkJVFJMQkFSfENNRFdJTiksCitFWChDTURfZm9sZCwJCSJmb2xkIiwJCWV4X2ZvbGQsCisJCQlSQU5HRXxXSE9MRUZPTER8VFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2ZvbGRjbG9zZSwJImZvbGRjbG9zZSIsCWV4X2ZvbGRvcGVuLAorCQkJUkFOR0V8QkFOR3xXSE9MRUZPTER8VFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2ZvbGRkb29wZW4sCSJmb2xkZG9vcGVuIiwJZXhfZm9sZGRvLAorCQkJUkFOR0V8REZMQUxMfE5FRURBUkd8RVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2ZvbGRkb2Nsb3NlZCwJImZvbGRkb2Nsb3NlZCIsCWV4X2ZvbGRkbywKKwkJCVJBTkdFfERGTEFMTHxORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9mb2xkb3BlbiwJImZvbGRvcGVuIiwJZXhfZm9sZG9wZW4sCisJCQlSQU5HRXxCQU5HfFdIT0xFRk9MRHxUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfZnVuY3Rpb24sCSJmdW5jdGlvbiIsCWV4X2Z1bmN0aW9uLAorCQkJRVhUUkF8QkFOR3xDTURXSU4pLAorRVgoQ01EX2dsb2JhbCwJCSJnbG9iYWwiLAlleF9nbG9iYWwsCisJCQlSQU5HRXxXSE9MRUZPTER8QkFOR3xFWFRSQXxERkxBTEx8Q01EV0lOKSwKK0VYKENNRF9nb3RvLAkJImdvdG8iLAkJZXhfZ290bywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfZ3JlcCwJCSJncmVwIiwJCWV4X21ha2UsCisJCQlCQU5HfE5FRURBUkd8RVhUUkF8Tk9UUkxDT018VFJMQkFSfFhGSUxFKSwKK0VYKENNRF9ncmVwYWRkLAkJImdyZXBhZGQiLAlleF9tYWtlLAorCQkJQkFOR3xORUVEQVJHfEVYVFJBfE5PVFJMQ09NfFRSTEJBUnxYRklMRSksCitFWChDTURfZ3VpLAkJImd1aSIsCQlleF9ndWksCisJCQlCQU5HfEZJTEVTfEVESVRDTUR8QVJHT1BUfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2d2aW0sCQkiZ3ZpbSIsCQlleF9ndWksCisJCQlCQU5HfEZJTEVTfEVESVRDTUR8QVJHT1BUfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2hlbHAsCQkiaGVscCIsCQlleF9oZWxwLAorCQkJQkFOR3xFWFRSQXxOT1RSTENPTSksCitFWChDTURfaGVscGZpbmQsCSJoZWxwZmluZCIsCWV4X2hlbHBmaW5kLAorCQkJRVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2hlbHBncmVwLAkiaGVscGdyZXAiLAlleF9oZWxwZ3JlcCwKKwkJCUVYVFJBfE5PVFJMQ09NfE5FRURBUkcpLAorRVgoQ01EX2hlbHB0YWdzLAkiaGVscHRhZ3MiLAlleF9oZWxwdGFncywKKwkJCU5FRURBUkd8RklMRTF8VFJMQkFSfENNRFdJTiksCitFWChDTURfaGFyZGNvcHksCSJoYXJkY29weSIsCWV4X2hhcmRjb3B5LAorCQkJUkFOR0V8Q09VTlR8RVhUUkF8VFJMQkFSfERGTEFMTHxCQU5HKSwKK0VYKENNRF9oaWdobGlnaHQsCSJoaWdobGlnaHQiLAlleF9oaWdobGlnaHQsCisJCQlCQU5HfEVYVFJBfFRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9oaWRlLAkJImhpZGUiLAkJZXhfaGlkZSwKKwkJCUJBTkd8RVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2hpc3RvcnksCQkiaGlzdG9yeSIsCWV4X2hpc3RvcnksCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9pbnNlcnQsCQkiaW5zZXJ0IiwJZXhfYXBwZW5kLAorCQkJQkFOR3xSQU5HRXxUUkxCQVJ8Q01EV0lOfE1PRElGWSksCitFWChDTURfaWFiYnJldiwJCSJpYWJicmV2IiwJZXhfYWJicmV2aWF0ZSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2lhYmNsZWFyLAkiaWFiY2xlYXIiLAlleF9hYmNsZWFyLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfaWYsCQkiaWYiLAkJZXhfaWYsCisJCQlFWFRSQXxOT1RSTENPTXxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9panVtcCwJCSJpanVtcCIsCWV4X2ZpbmRwYXQsCisJCQlCQU5HfFJBTkdFfERGTEFMTHxXSE9MRUZPTER8RVhUUkEpLAorRVgoQ01EX2lsaXN0LAkJImlsaXN0IiwJZXhfZmluZHBhdCwKKwkJCUJBTkd8UkFOR0V8REZMQUxMfFdIT0xFRk9MRHxFWFRSQXxDTURXSU4pLAorRVgoQ01EX2ltYXAsCQkiaW1hcCIsCQlleF9tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9pbWFwY2xlYXIsCSJpbWFwY2xlYXIiLAlleF9tYXBjbGVhciwKKwkJCUVYVFJBfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2ltZW51LAkJImltZW51IiwJZXhfbWVudSwKKwkJCVJBTkdFfE5PVEFEUnxaRVJPUnxFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9pbm9yZW1hcCwJImlub3JlbWFwIiwJZXhfbWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfaW5vcmVhYmJyZXYsCSJpbm9yZWFiYnJldiIsCWV4X2FiYnJldmlhdGUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9pbm9yZW1lbnUsCSJpbm9yZW1lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2ludHJvLAkJImludHJvIiwJZXhfaW50cm8sCisJCQlUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9pc2VhcmNoLAkJImlzZWFyY2giLAlleF9maW5kcGF0LAorCQkJQkFOR3xSQU5HRXxERkxBTEx8V0hPTEVGT0xEfEVYVFJBfENNRFdJTiksCitFWChDTURfaXNwbGl0LAkJImlzcGxpdCIsCWV4X2ZpbmRwYXQsCisJCQlCQU5HfFJBTkdFfERGTEFMTHxXSE9MRUZPTER8RVhUUkEpLAorRVgoQ01EX2l1bm1hcCwJCSJpdW5tYXAiLAlleF91bm1hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2l1bmFiYnJldiwJIml1bmFiYnJldiIsCWV4X2FiYnJldmlhdGUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9pdW5tZW51LAkJIml1bm1lbnUiLAlleF9tZW51LAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfam9pbiwJCSJqb2luIiwJCWV4X2pvaW4sCisJCQlCQU5HfFJBTkdFfFdIT0xFRk9MRHxDT1VOVHxUUkxCQVJ8Q01EV0lOfE1PRElGWSksCitFWChDTURfanVtcHMsCQkianVtcHMiLAlleF9qdW1wcywKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2ssCQkiayIsCQlleF9tYXJrLAorCQkJUkFOR0V8V09SRDF8VFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2tlZXBtYXJrcywJImtlZXBtYXJrcyIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9rZWVwanVtcHMsCSJrZWVwanVtcHMiLAlleF93cm9uZ21vZGlmaWVyLAorCQkJTkVFREFSR3xFWFRSQXxOT1RSTENPTSksCitFWChDTURfbGlzdCwJCSJsaXN0IiwJCWV4X3ByaW50LAorCQkJUkFOR0V8V0hPTEVGT0xEfENPVU5UfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2xhc3QsCQkibGFzdCIsCQlleF9sYXN0LAorCQkJRVhUUkF8QkFOR3xFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX2xhbmd1YWdlLAkibGFuZ3VhZ2UiLAlleF9sYW5ndWFnZSwKKwkJCUVYVFJBfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2xjZCwJCSJsY2QiLAkJZXhfY2QsCisJCQlGSUxFMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9sY2hkaXIsCQkibGNoZGlyIiwJZXhfY2QsCisJCQlGSUxFMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9sZWZ0LAkJImxlZnQiLAkJZXhfYWxpZ24sCisJCQlUUkxCQVJ8UkFOR0V8V0hPTEVGT0xEfEVYVFJBfENNRFdJTnxNT0RJRlkpLAorRVgoQ01EX2xlZnRhYm92ZSwJImxlZnRhYm92ZSIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9sZXQsCQkibGV0IiwJCWV4X2xldCwKKwkJCUVYVFJBfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX2xtYXAsCQkibG1hcCIsCQlleF9tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9sbWFwY2xlYXIsCSJsbWFwY2xlYXIiLAlleF9tYXBjbGVhciwKKwkJCUVYVFJBfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2xub3JlbWFwLAkibG5vcmVtYXAiLAlleF9tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9sb2FkdmlldywJImxvYWR2aWV3IiwJZXhfbG9hZHZpZXcsCisJCQlGSUxFMXxUUkxCQVIpLAorRVgoQ01EX2xvYWRrZXltYXAsCSJsb2Fka2V5bWFwIiwJZXhfbG9hZGtleW1hcCwKKwkJCUNNRFdJTiksCitFWChDTURfbG9ja21hcmtzLAkibG9ja21hcmtzIiwJZXhfd3Jvbmdtb2RpZmllciwKKwkJCU5FRURBUkd8RVhUUkF8Tk9UUkxDT00pLAorRVgoQ01EX2x1bm1hcCwJCSJsdW5tYXAiLAlleF91bm1hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX2xzLAkJImxzIiwJCWJ1Zmxpc3RfbGlzdCwKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfbW92ZSwJCSJtb3ZlIiwJCWV4X2NvcHltb3ZlLAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfFRSTEJBUnxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9tYXJrLAkJIm1hcmsiLAkJZXhfbWFyaywKKwkJCVJBTkdFfFdPUkQxfFRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9tYWtlLAkJIm1ha2UiLAkJZXhfbWFrZSwKKwkJCUJBTkd8RVhUUkF8Tk9UUkxDT018VFJMQkFSfFhGSUxFKSwKK0VYKENNRF9tYXAsCQkibWFwIiwJCWV4X21hcCwKKwkJCUJBTkd8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfbWFwY2xlYXIsCSJtYXBjbGVhciIsCWV4X21hcGNsZWFyLAorCQkJRVhUUkF8QkFOR3xUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9tYXJrcywJCSJtYXJrcyIsCWRvX21hcmtzLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfbWF0Y2gsCQkibWF0Y2giLAlleF9tYXRjaCwKKwkJCUVYVFJBfENNRFdJTiksCitFWChDTURfbWVudSwJCSJtZW51IiwJCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8QkFOR3xFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9tZW51dHJhbnNsYXRlLAkibWVudXRyYW5zbGF0ZSIsIGV4X21lbnV0cmFuc2xhdGUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9tZXNzYWdlcywJIm1lc3NhZ2VzIiwJZXhfbWVzc2FnZXMsCisJCQlUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9ta2V4cmMsCQkibWtleHJjIiwJZXhfbWtyYywKKwkJCUJBTkd8RklMRTF8VFJMQkFSfENNRFdJTiksCitFWChDTURfbWtzZXNzaW9uLAkibWtzZXNzaW9uIiwJZXhfbWtyYywKKwkJCUJBTkd8RklMRTF8VFJMQkFSKSwKK0VYKENNRF9ta3ZpbXJjLAkJIm1rdmltcmMiLAlleF9ta3JjLAorCQkJQkFOR3xGSUxFMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9ta3ZpZXcsCQkibWt2aWV3IiwJZXhfbWtyYywKKwkJCUJBTkd8RklMRTF8VFJMQkFSKSwKK0VYKENNRF9tb2RlLAkJIm1vZGUiLAkJZXhfbW9kZSwKKwkJCVdPUkQxfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX25leHQsCQkibmV4dCIsCQlleF9uZXh0LAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8RklMRVN8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9uZXcsCQkibmV3IiwJCWV4X3NwbGl0dmlldywKKwkJCUJBTkd8RklMRTF8UkFOR0V8Tk9UQURSfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfbm1hcCwJCSJubWFwIiwJCWV4X21hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX25tYXBjbGVhciwJIm5tYXBjbGVhciIsCWV4X21hcGNsZWFyLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfbm1lbnUsCQkibm1lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX25ub3JlbWFwLAkibm5vcmVtYXAiLAlleF9tYXAsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF9ubm9yZW1lbnUsCSJubm9yZW1lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX25vcmVtYXAsCQkibm9yZW1hcCIsCWV4X21hcCwKKwkJCUJBTkd8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfbm9obHNlYXJjaCwJIm5vaGxzZWFyY2giLAlleF9ub2hsc2VhcmNoLAorCQkJVFJMQkFSfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX25vcmVhYmJyZXYsCSJub3JlYWJicmV2IiwJZXhfYWJicmV2aWF0ZSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX25vcmVtZW51LAkibm9yZW1lbnUiLAlleF9tZW51LAorCQkJUkFOR0V8Tk9UQURSfFpFUk9SfEJBTkd8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfbm9ybWFsLAkJIm5vcm1hbCIsCWV4X25vcm1hbCwKKwkJCVJBTkdFfEJBTkd8RVhUUkF8TkVFREFSR3xOT1RSTENPTXxVU0VDVFJMVnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9udW1iZXIsCQkibnVtYmVyIiwJZXhfcHJpbnQsCisJCQlSQU5HRXxXSE9MRUZPTER8Q09VTlR8VFJMQkFSfENNRFdJTiksCitFWChDTURfbnVubWFwLAkJIm51bm1hcCIsCWV4X3VubWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfbnVubWVudSwJCSJudW5tZW51IiwJZXhfbWVudSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX29wZW4sCQkib3BlbiIsCQlleF9uaSwKKwkJCVRSTEJBUiksCS8qIG5vdCBzdXBwb3J0ZWQgKi8KK0VYKENNRF9vbWFwLAkJIm9tYXAiLAkJZXhfbWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfb21hcGNsZWFyLAkib21hcGNsZWFyIiwJZXhfbWFwY2xlYXIsCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9vbWVudSwJCSJvbWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfb25seSwJCSJvbmx5IiwJCWV4X29ubHksCisJCQlCQU5HfFRSTEJBUiksCitFWChDTURfb25vcmVtYXAsCSJvbm9yZW1hcCIsCWV4X21hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX29ub3JlbWVudSwJIm9ub3JlbWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfb3B0aW9ucywJCSJvcHRpb25zIiwJZXhfb3B0aW9ucywKKwkJCVRSTEJBUiksCitFWChDTURfb3VubWFwLAkJIm91bm1hcCIsCWV4X3VubWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfb3VubWVudSwJCSJvdW5tZW51IiwJZXhfbWVudSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX3ByaW50LAkJInByaW50IiwJZXhfcHJpbnQsCisJCQlSQU5HRXxXSE9MRUZPTER8Q09VTlR8VFJMQkFSfENNRFdJTiksCitFWChDTURfcGNsb3NlLAkJInBjbG9zZSIsCWV4X3BjbG9zZSwKKwkJCUJBTkd8VFJMQkFSKSwKK0VYKENNRF9wZXJsLAkJInBlcmwiLAkJZXhfcGVybCwKKwkJCVJBTkdFfEVYVFJBfERGTEFMTHxORUVEQVJHfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX3BlcmxkbywJCSJwZXJsZG8iLAlleF9wZXJsZG8sCisJCQlSQU5HRXxFWFRSQXxERkxBTEx8TkVFREFSR3xDTURXSU4pLAorRVgoQ01EX3BlZGl0LAkJInBlZGl0IiwJZXhfcGVkaXQsCisJCQlCQU5HfEZJTEUxfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfcG9wLAkJInBvcCIsCQlleF90YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xDT1VOVHxUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3BvcHVwLAkJInBvcHVwIiwJZXhfcG9wdXAsCisJCQlORUVEQVJHfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxDTURXSU4pLAorRVgoQ01EX3Bwb3AsCQkicHBvcCIsCQlleF9wdGFnLAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8Q09VTlR8VFJMQkFSfFpFUk9SKSwKK0VYKENNRF9wcmVzZXJ2ZSwJInByZXNlcnZlIiwJZXhfcHJlc2VydmUsCisJCQlUUkxCQVIpLAorRVgoQ01EX3ByZXZpb3VzLAkicHJldmlvdXMiLAlleF9wcmV2aW91cywKKwkJCUVYVFJBfFJBTkdFfE5PVEFEUnxDT1VOVHxCQU5HfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfcHJvbXB0ZmluZCwJInByb21wdGZpbmQiLAlndWlfbWNoX2ZpbmRfZGlhbG9nLAorCQkJRVhUUkF8Tk9UUkxDT018Q01EV0lOKSwKK0VYKENNRF9wcm9tcHRyZXBsLAkicHJvbXB0cmVwbCIsCWd1aV9tY2hfcmVwbGFjZV9kaWFsb2csCisJCQlFWFRSQXxOT1RSTENPTXxDTURXSU4pLAorRVgoQ01EX3BzZWFyY2gsCQkicHNlYXJjaCIsCWV4X3BzZWFyY2gsCisJCQlCQU5HfFJBTkdFfFdIT0xFRk9MRHxERkxBTEx8RVhUUkEpLAorRVgoQ01EX3B0YWcsCQkicHRhZyIsCQlleF9wdGFnLAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8V09SRDF8VFJMQkFSfFpFUk9SKSwKK0VYKENNRF9wdE5leHQsCQkicHROZXh0IiwJZXhfcHRhZywKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfFRSTEJBUnxaRVJPUiksCitFWChDTURfcHRmaXJzdCwJCSJwdGZpcnN0IiwJZXhfcHRhZywKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfFRSTEJBUnxaRVJPUiksCitFWChDTURfcHRqdW1wLAkJInB0anVtcCIsCWV4X3B0YWcsCisJCQlCQU5HfFRSTEJBUnxXT1JEMSksCitFWChDTURfcHRsYXN0LAkJInB0bGFzdCIsCWV4X3B0YWcsCisJCQlCQU5HfFRSTEJBUiksCitFWChDTURfcHRuZXh0LAkJInB0bmV4dCIsCWV4X3B0YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3B0cHJldmlvdXMsCSJwdHByZXZpb3VzIiwJZXhfcHRhZywKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfFRSTEJBUnxaRVJPUiksCitFWChDTURfcHRyZXdpbmQsCSJwdHJld2luZCIsCWV4X3B0YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3B0c2VsZWN0LAkicHRzZWxlY3QiLAlleF9wdGFnLAorCQkJQkFOR3xUUkxCQVJ8V09SRDEpLAorRVgoQ01EX3B1dCwJCSJwdXQiLAkJZXhfcHV0LAorCQkJUkFOR0V8V0hPTEVGT0xEfEJBTkd8UkVHU1RSfFRSTEJBUnxaRVJPUnxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9wd2QsCQkicHdkIiwJCWV4X3B3ZCwKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3B5dGhvbiwJCSJweXRob24iLAlleF9weXRob24sCisJCQlSQU5HRXxFWFRSQXxORUVEQVJHfENNRFdJTiksCitFWChDTURfcHlmaWxlLAkJInB5ZmlsZSIsCWV4X3B5ZmlsZSwKKwkJCVJBTkdFfEZJTEUxfE5FRURBUkd8Q01EV0lOKSwKK0VYKENNRF9xdWl0LAkJInF1aXQiLAkJZXhfcXVpdCwKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfcXVpdGFsbCwJCSJxdWl0YWxsIiwJZXhfcXVpdF9hbGwsCisJCQlCQU5HfFRSTEJBUiksCitFWChDTURfcWFsbCwJCSJxYWxsIiwJCWV4X3F1aXRfYWxsLAorCQkJQkFOR3xUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9yZWFkLAkJInJlYWQiLAkJZXhfcmVhZCwKKwkJCUJBTkd8UkFOR0V8V0hPTEVGT0xEfEZJTEUxfEFSR09QVHxUUkxCQVJ8WkVST1J8Q01EV0lOfE1PRElGWSksCitFWChDTURfcmVjb3ZlciwJCSJyZWNvdmVyIiwJZXhfcmVjb3ZlciwKKwkJCUJBTkd8RklMRTF8VFJMQkFSKSwKK0VYKENNRF9yZWRvLAkJInJlZG8iLAkJZXhfcmVkbywKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3JlZGlyLAkJInJlZGlyIiwJZXhfcmVkaXIsCisJCQlCQU5HfEZJTEVTfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3JlZHJhdywJCSJyZWRyYXciLAlleF9yZWRyYXcsCisJCQlCQU5HfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3JlZHJhd3N0YXR1cywJInJlZHJhd3N0YXR1cyIsCWV4X3JlZHJhd3N0YXR1cywKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfcmVnaXN0ZXJzLAkicmVnaXN0ZXJzIiwJZXhfZGlzcGxheSwKKwkJCUVYVFJBfE5PVFJMQ09NfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3Jlc2l6ZSwJCSJyZXNpemUiLAlleF9yZXNpemUsCisJCQlSQU5HRXxOT1RBRFJ8VFJMQkFSfFdPUkQxKSwKK0VYKENNRF9yZXRhYiwJCSJyZXRhYiIsCWV4X3JldGFiLAorCQkJVFJMQkFSfFJBTkdFfFdIT0xFRk9MRHxERkxBTEx8QkFOR3xXT1JEMXxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9yZXR1cm4sCQkicmV0dXJuIiwJZXhfcmV0dXJuLAorCQkJRVhUUkF8Tk9UUkxDT018U0JPWE9LfENNRFdJTiksCitFWChDTURfcmV3aW5kLAkJInJld2luZCIsCWV4X3Jld2luZCwKKwkJCUVYVFJBfEJBTkd8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9yaWdodCwJCSJyaWdodCIsCWV4X2FsaWduLAorCQkJVFJMQkFSfFJBTkdFfFdIT0xFRk9MRHxFWFRSQXxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9yaWdodGJlbG93LAkicmlnaHRiZWxvdyIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF9ydW50aW1lLAkJInJ1bnRpbWUiLAlleF9ydW50aW1lLAorCQkJQkFOR3xORUVEQVJHfEZJTEVTfFRSTEJBUnxTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF9ydWJ5LAkJInJ1YnkiLAkJZXhfcnVieSwKKwkJCVJBTkdFfEVYVFJBfE5FRURBUkd8Q01EV0lOKSwKK0VYKENNRF9ydWJ5ZG8sCQkicnVieWRvIiwJZXhfcnVieWRvLAorCQkJUkFOR0V8REZMQUxMfEVYVFJBfE5FRURBUkd8Q01EV0lOKSwKK0VYKENNRF9ydWJ5ZmlsZSwJInJ1YnlmaWxlIiwJZXhfcnVieWZpbGUsCisJCQlSQU5HRXxGSUxFMXxORUVEQVJHfENNRFdJTiksCitFWChDTURfcnZpbWluZm8sCSJydmltaW5mbyIsCWV4X3ZpbWluZm8sCisJCQlCQU5HfEZJTEUxfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3N1YnN0aXR1dGUsCSJzdWJzdGl0dXRlIiwJZG9fc3ViLAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfENNRFdJTnxNT0RJRlkpLAorRVgoQ01EX3NOZXh0LAkJInNOZXh0IiwJZXhfcHJldmlvdXMsCisJCQlFWFRSQXxSQU5HRXxOT1RBRFJ8Q09VTlR8QkFOR3xFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3Nhcmd1bWVudCwJInNhcmd1bWVudCIsCWV4X2FyZ3VtZW50LAorCQkJQkFOR3xSQU5HRXxOT1RBRFJ8Q09VTlR8RVhUUkF8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9zYWxsLAkJInNhbGwiLAkJZXhfYWxsLAorCQkJUkFOR0V8Tk9UQURSfENPVU5UfFRSTEJBUiksCitFWChDTURfc2F2ZWFzLAkJInNhdmVhcyIsCWV4X3dyaXRlLAorCQkJQkFOR3xERkxBTEx8RklMRTF8QVJHT1BUfENNRFdJTnxUUkxCQVIpLAorRVgoQ01EX3NidWZmZXIsCQkic2J1ZmZlciIsCWV4X2J1ZmZlciwKKwkJCUJBTkd8UkFOR0V8Tk9UQURSfEJVRk5BTUV8QlVGVU5MfENPVU5UfEVYVFJBfFRSTEJBUiksCitFWChDTURfc2JOZXh0LAkJInNiTmV4dCIsCWV4X2JwcmV2aW91cywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX3NiYWxsLAkJInNiYWxsIiwJZXhfYnVmZmVyX2FsbCwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX3NiZmlyc3QsCQkic2JmaXJzdCIsCWV4X2JyZXdpbmQsCisJCQlUUkxCQVIpLAorRVgoQ01EX3NibGFzdCwJCSJzYmxhc3QiLAlleF9ibGFzdCwKKwkJCVRSTEJBUiksCitFWChDTURfc2Jtb2RpZmllZCwJInNibW9kaWZpZWQiLAlleF9ibW9kaWZpZWQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9zYm5leHQsCQkic2JuZXh0IiwJZXhfYm5leHQsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8VFJMQkFSKSwKK0VYKENNRF9zYnByZXZpb3VzLAkic2JwcmV2aW91cyIsCWV4X2JwcmV2aW91cywKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX3NicmV3aW5kLAkic2JyZXdpbmQiLAlleF9icmV3aW5kLAorCQkJVFJMQkFSKSwKK0VYKENNRF9zY3JpcHRuYW1lcywJInNjcmlwdG5hbWVzIiwJZXhfc2NyaXB0bmFtZXMsCisJCQlUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9zY3JpcHRlbmNvZGluZywJInNjcmlwdGVuY29kaW5nIiwgZXhfc2NyaXB0ZW5jb2RpbmcsCisJCQlXT1JEMXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9zY3Njb3BlLAkJInNjc2NvcGUiLAlkb19zY3Njb3BlLAorCQkJRVhUUkF8Tk9UUkxDT018U0JPWE9LKSwKK0VYKENNRF9zZXQsCQkic2V0IiwJCWV4X3NldCwKKwkJCVRSTEJBUnxFWFRSQXxDTURXSU58U0JPWE9LKSwKK0VYKENNRF9zZXRmaWxldHlwZSwJInNldGZpbGV0eXBlIiwJZXhfc2V0ZmlsZXR5cGUsCisJCQlUUkxCQVJ8RVhUUkF8TkVFREFSR3xDTURXSU4pLAorRVgoQ01EX3NldGdsb2JhbCwJInNldGdsb2JhbCIsCWV4X3NldCwKKwkJCVRSTEJBUnxFWFRSQXxDTURXSU4pLAorRVgoQ01EX3NldGxvY2FsLAkic2V0bG9jYWwiLAlleF9zZXQsCisJCQlUUkxCQVJ8RVhUUkF8Q01EV0lOKSwKK0VYKENNRF9zZmluZCwJCSJzZmluZCIsCWV4X3NwbGl0dmlldywKKwkJCUJBTkd8RklMRTF8UkFOR0V8Tk9UQURSfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfc2ZpcnN0LAkJInNmaXJzdCIsCWV4X3Jld2luZCwKKwkJCUVYVFJBfEJBTkd8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9zaGVsbCwJCSJzaGVsbCIsCWV4X3NoZWxsLAorCQkJVFJMQkFSfENNRFdJTiksCitFWChDTURfc2ltYWx0LAkJInNpbWFsdCIsCWV4X3NpbWFsdCwKKwkJCU5FRURBUkd8V09SRDF8VFJMQkFSfENNRFdJTiksCitFWChDTURfc2lnbiwJCSJzaWduIiwJCWV4X3NpZ24sCisJCQlORUVEQVJHfFJBTkdFfE5PVEFEUnxFWFRSQXxDTURXSU4pLAorRVgoQ01EX3NpbGVudCwJCSJzaWxlbnQiLAlleF93cm9uZ21vZGlmaWVyLAorCQkJTkVFREFSR3xFWFRSQXxCQU5HfE5PVFJMQ09NfFNCT1hPS3xDTURXSU4pLAorRVgoQ01EX3NsZWVwLAkJInNsZWVwIiwJZXhfc2xlZXAsCisJCQlSQU5HRXxOT1RBRFJ8Q09VTlR8RVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfc2xhc3QsCQkic2xhc3QiLAlleF9sYXN0LAorCQkJRVhUUkF8QkFOR3xFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3NtYWdpYywJCSJzbWFnaWMiLAlleF9zdWJtYWdpYywKKwkJCVJBTkdFfFdIT0xFRk9MRHxFWFRSQXxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9zbmV4dCwJCSJzbmV4dCIsCWV4X25leHQsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xGSUxFU3xFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3NuaWZmLAkJInNuaWZmIiwJZXhfc25pZmYsCisJCQlFWFRSQXxUUkxCQVIpLAorRVgoQ01EX3Nub21hZ2ljLAkic25vbWFnaWMiLAlleF9zdWJtYWdpYywKKwkJCVJBTkdFfFdIT0xFRk9MRHxFWFRSQXxDTURXSU58TU9ESUZZKSwKK0VYKENNRF9zb3VyY2UsCQkic291cmNlIiwJZXhfc291cmNlLAorCQkJQkFOR3xGSUxFMXxUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfc3BsaXQsCQkic3BsaXQiLAlleF9zcGxpdHZpZXcsCisJCQlCQU5HfEZJTEUxfFJBTkdFfE5PVEFEUnxFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3NwcmV2aW91cywJInNwcmV2aW91cyIsCWV4X3ByZXZpb3VzLAorCQkJRVhUUkF8UkFOR0V8Tk9UQURSfENPVU5UfEJBTkd8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9zcmV3aW5kLAkJInNyZXdpbmQiLAlleF9yZXdpbmQsCisJCQlFWFRSQXxCQU5HfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfc3RvcCwJCSJzdG9wIiwJCWV4X3N0b3AsCisJCQlUUkxCQVJ8QkFOR3xDTURXSU4pLAorRVgoQ01EX3N0YWcsCQkic3RhZyIsCQlleF9zdGFnLAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8V09SRDF8VFJMQkFSfFpFUk9SKSwKK0VYKENNRF9zdGFydGluc2VydCwJInN0YXJ0aW5zZXJ0IiwJZXhfc3RhcnRpbnNlcnQsCisJCQlCQU5HfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3N0b3BpbnNlcnQsCSJzdG9waW5zZXJ0IiwJZXhfc3RvcGluc2VydCwKKwkJCUJBTkd8VFJMQkFSfENNRFdJTiksCitFWChDTURfc3RqdW1wLAkJInN0anVtcCIsCWV4X3N0YWcsCisJCQlCQU5HfFRSTEJBUnxXT1JEMSksCitFWChDTURfc3RzZWxlY3QsCSJzdHNlbGVjdCIsCWV4X3N0YWcsCisJCQlCQU5HfFRSTEJBUnxXT1JEMSksCitFWChDTURfc3VuaGlkZSwJCSJzdW5oaWRlIiwJZXhfYnVmZmVyX2FsbCwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX3N1c3BlbmQsCQkic3VzcGVuZCIsCWV4X3N0b3AsCisJCQlUUkxCQVJ8QkFOR3xDTURXSU4pLAorRVgoQ01EX3N2aWV3LAkJInN2aWV3IiwJZXhfc3BsaXR2aWV3LAorCQkJTkVFREFSR3xSQU5HRXxOT1RBRFJ8QkFOR3xGSUxFMXxFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3N3YXBuYW1lLAkic3dhcG5hbWUiLAlleF9zd2FwbmFtZSwKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3N5bnRheCwJCSJzeW50YXgiLAlleF9zeW50YXgsCisJCQlFWFRSQXxOT1RSTENPTXxDTURXSU4pLAorRVgoQ01EX3N5bmNiaW5kLAkic3luY2JpbmQiLAlleF9zeW5jYmluZCwKKwkJCVRSTEJBUiksCitFWChDTURfdCwJCSJ0IiwJCWV4X2NvcHltb3ZlLAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfFRSTEJBUnxDTURXSU58TU9ESUZZKSwKK0VYKENNRF90TmV4dCwJCSJ0TmV4dCIsCWV4X3RhZywKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfFRSTEJBUnxaRVJPUiksCitFWChDTURfdGFnLAkJInRhZyIsCQlleF90YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xXT1JEMXxUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3RhZ3MsCQkidGFncyIsCQlkb190YWdzLAorCQkJVFJMQkFSfENNRFdJTiksCitFWChDTURfdGNsLAkJInRjbCIsCQlleF90Y2wsCisJCQlSQU5HRXxFWFRSQXxORUVEQVJHfENNRFdJTiksCitFWChDTURfdGNsZG8sCQkidGNsZG8iLAlleF90Y2xkbywKKwkJCVJBTkdFfERGTEFMTHxFWFRSQXxORUVEQVJHfENNRFdJTiksCitFWChDTURfdGNsZmlsZSwJCSJ0Y2xmaWxlIiwJZXhfdGNsZmlsZSwKKwkJCVJBTkdFfEZJTEUxfE5FRURBUkd8Q01EV0lOKSwKK0VYKENNRF90ZWFyb2ZmLAkJInRlYXJvZmYiLAlleF90ZWFyb2ZmLAorCQkJTkVFREFSR3xFWFRSQXxUUkxCQVJ8Tk9UUkxDT018Q01EV0lOKSwKK0VYKENNRF90Zmlyc3QsCQkidGZpcnN0IiwJZXhfdGFnLAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8VFJMQkFSfFpFUk9SKSwKK0VYKENNRF90aHJvdywJCSJ0aHJvdyIsCWV4X3Rocm93LAorCQkJRVhUUkF8TkVFREFSR3xTQk9YT0t8Q01EV0lOKSwKK0VYKENNRF90anVtcCwJCSJ0anVtcCIsCWV4X3RhZywKKwkJCUJBTkd8VFJMQkFSfFdPUkQxKSwKK0VYKENNRF90bGFzdCwJCSJ0bGFzdCIsCWV4X3RhZywKKwkJCUJBTkd8VFJMQkFSKSwKK0VYKENNRF90bWVudSwJCSJ0bWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdG5leHQsCQkidG5leHQiLAlleF90YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3RvcGxlZnQsCQkidG9wbGVmdCIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF90cHJldmlvdXMsCSJ0cHJldmlvdXMiLAlleF90YWcsCisJCQlSQU5HRXxOT1RBRFJ8QkFOR3xUUkxCQVJ8WkVST1IpLAorRVgoQ01EX3RyZXdpbmQsCQkidHJld2luZCIsCWV4X3RhZywKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfFRSTEJBUnxaRVJPUiksCitFWChDTURfdHJ5LAkJInRyeSIsCQlleF90cnksCisJCQlUUkxCQVJ8U0JPWE9LfENNRFdJTiksCitFWChDTURfdHNlbGVjdCwJCSJ0c2VsZWN0IiwJZXhfdGFnLAorCQkJQkFOR3xUUkxCQVJ8V09SRDEpLAorRVgoQ01EX3R1bm1lbnUsCQkidHVubWVudSIsCWV4X21lbnUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF91bmRvLAkJInVuZG8iLAkJZXhfdW5kbywKKwkJCVRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3VuYWJicmV2aWF0ZSwJInVuYWJicmV2aWF0ZSIsCWV4X2FiYnJldmlhdGUsCisJCQlFWFRSQXxUUkxCQVJ8Tk9UUkxDT018VVNFQ1RSTFZ8Q01EV0lOKSwKK0VYKENNRF91bmhpZGUsCQkidW5oaWRlIiwJZXhfYnVmZmVyX2FsbCwKKwkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVIpLAorRVgoQ01EX3VubGV0LAkJInVubGV0IiwJZXhfdW5sZXQsCisJCQlCQU5HfEVYVFJBfE5FRURBUkd8U0JPWE9LfENNRFdJTiksCitFWChDTURfdW5tYXAsCQkidW5tYXAiLAlleF91bm1hcCwKKwkJCUJBTkd8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdW5tZW51LAkJInVubWVudSIsCWV4X21lbnUsCisJCQlCQU5HfEVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX3VwZGF0ZSwJCSJ1cGRhdGUiLAlleF91cGRhdGUsCisJCQlSQU5HRXxXSE9MRUZPTER8QkFOR3xGSUxFMXxBUkdPUFR8REZMQUxMfFRSTEJBUiksCitFWChDTURfdmdsb2JhbCwJCSJ2Z2xvYmFsIiwJZXhfZ2xvYmFsLAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfERGTEFMTHxDTURXSU4pLAorRVgoQ01EX3ZlcnNpb24sCQkidmVyc2lvbiIsCWV4X3ZlcnNpb24sCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF92ZXJib3NlLAkJInZlcmJvc2UiLAlleF93cm9uZ21vZGlmaWVyLAorCQkJTkVFREFSR3xSQU5HRXxOT1RBRFJ8RVhUUkF8Tk9UUkxDT018U0JPWE9LfENNRFdJTiksCitFWChDTURfdmVydGljYWwsCSJ2ZXJ0aWNhbCIsCWV4X3dyb25nbW9kaWZpZXIsCisJCQlORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF92aXN1YWwsCQkidmlzdWFsIiwJZXhfZWRpdCwKKwkJCUJBTkd8RklMRTF8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF92aWV3LAkJInZpZXciLAkJZXhfZWRpdCwKKwkJCUJBTkd8RklMRTF8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF92bWFwLAkJInZtYXAiLAkJZXhfbWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdm1hcGNsZWFyLAkidm1hcGNsZWFyIiwJZXhfbWFwY2xlYXIsCisJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF92bWVudSwJCSJ2bWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdm5vcmVtYXAsCSJ2bm9yZW1hcCIsCWV4X21hcCwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX3ZuZXcsCQkidm5ldyIsCQlleF9zcGxpdHZpZXcsCisJCQlCQU5HfEZJTEUxfFJBTkdFfE5PVEFEUnxFRElUQ01EfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3Zub3JlbWVudSwJInZub3JlbWVudSIsCWV4X21lbnUsCisJCQlSQU5HRXxOT1RBRFJ8WkVST1J8RVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdnNwbGl0LAkJInZzcGxpdCIsCWV4X3NwbGl0dmlldywKKwkJCUJBTkd8RklMRTF8UkFOR0V8Tk9UQURSfEVESVRDTUR8QVJHT1BUfFRSTEJBUiksCitFWChDTURfdnVubWFwLAkJInZ1bm1hcCIsCWV4X3VubWFwLAorCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCitFWChDTURfdnVubWVudSwJCSJ2dW5tZW51IiwJZXhfbWVudSwKKwkJCUVYVFJBfFRSTEJBUnxOT1RSTENPTXxVU0VDVFJMVnxDTURXSU4pLAorRVgoQ01EX3dyaXRlLAkJIndyaXRlIiwJZXhfd3JpdGUsCisJCQlSQU5HRXxXSE9MRUZPTER8QkFOR3xGSUxFMXxBUkdPUFR8REZMQUxMfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX3dOZXh0LAkJIndOZXh0IiwJZXhfd25leHQsCisJCQlSQU5HRXxXSE9MRUZPTER8Tk9UQURSfEJBTkd8RklMRTF8QVJHT1BUfFRSTEJBUiksCitFWChDTURfd2FsbCwJCSJ3YWxsIiwJCWRvX3dxYWxsLAorCQkJQkFOR3xUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF93aGlsZSwJCSJ3aGlsZSIsCWV4X3doaWxlLAorCQkJRVhUUkF8Tk9UUkxDT018U0JPWE9LfENNRFdJTiksCitFWChDTURfd2luc2l6ZSwJCSJ3aW5zaXplIiwJZXhfd2luc2l6ZSwKKwkJCUVYVFJBfE5FRURBUkd8VFJMQkFSKSwKK0VYKENNRF93aW5jbWQsCQkid2luY21kIiwJZXhfd2luY21kLAorCQkJTkVFREFSR3xXT1JEMXxSQU5HRXxOT1RBRFIpLAorRVgoQ01EX3dpbmRvLAkJIndpbmRvIiwJZXhfbGlzdGRvLAorCQkJQkFOR3xORUVEQVJHfEVYVFJBfE5PVFJMQ09NKSwKK0VYKENNRF93aW5wb3MsCQkid2lucG9zIiwJZXhfd2lucG9zLAorCQkJRVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfd25leHQsCQkid25leHQiLAlleF93bmV4dCwKKwkJCVJBTkdFfE5PVEFEUnxCQU5HfEZJTEUxfEFSR09QVHxUUkxCQVIpLAorRVgoQ01EX3dwcmV2aW91cywJIndwcmV2aW91cyIsCWV4X3duZXh0LAorCQkJUkFOR0V8Tk9UQURSfEJBTkd8RklMRTF8QVJHT1BUfFRSTEJBUiksCitFWChDTURfd3EsCQkid3EiLAkJZXhfZXhpdCwKKwkJCVJBTkdFfFdIT0xFRk9MRHxCQU5HfEZJTEUxfEFSR09QVHxERkxBTEx8VFJMQkFSKSwKK0VYKENNRF93cWFsbCwJCSJ3cWFsbCIsCWRvX3dxYWxsLAorCQkJQkFOR3xGSUxFMXxBUkdPUFR8REZMQUxMfFRSTEJBUiksCitFWChDTURfd3N2ZXJiLAkJIndzdmVyYiIsCWV4X3dzdmVyYiwKKwkJCUVYVFJBfE5PVEFEUnxORUVEQVJHKSwKK0VYKENNRF93dmltaW5mbywJInd2aW1pbmZvIiwJZXhfdmltaW5mbywKKwkJCUJBTkd8RklMRTF8VFJMQkFSfENNRFdJTiksCitFWChDTURfeGl0LAkJInhpdCIsCQlleF9leGl0LAorCQkJUkFOR0V8V0hPTEVGT0xEfEJBTkd8RklMRTF8QVJHT1BUfERGTEFMTHxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF94YWxsLAkJInhhbGwiLAkJZG9fd3FhbGwsCisJCQlCQU5HfFRSTEJBUiksCitFWChDTURfeWFuaywJCSJ5YW5rIiwJCWV4X29wZXJhdG9ycywKKwkJCVJBTkdFfFdIT0xFRk9MRHxSRUdTVFJ8Q09VTlR8VFJMQkFSfENNRFdJTiksCitFWChDTURfeiwJCSJ6IiwJCWV4X3osCisJCQlSQU5HRXxXSE9MRUZPTER8RVhUUkF8VFJMQkFSfENNRFdJTiksCisKKy8qIGNvbW1hbmRzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKi8KK0VYKENNRF9iYW5nLAkJIiEiLAkJZXhfYmFuZywKKwkJCVJBTkdFfFdIT0xFRk9MRHxCQU5HfEZJTEVTfENNRFdJTiksCitFWChDTURfcG91bmQsCQkiIyIsCQlleF9wcmludCwKKwkJCVJBTkdFfFdIT0xFRk9MRHxDT1VOVHxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9hbmQsCQkiJiIsCQlkb19zdWIsCisJCQlSQU5HRXxXSE9MRUZPTER8RVhUUkF8Q01EV0lOfE1PRElGWSksCitFWChDTURfc3RhciwJCSIqIiwJCWV4X2F0LAorCQkJUkFOR0V8V0hPTEVGT0xEfEVYVFJBfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX2xzaGlmdCwJCSI8IiwJCWV4X29wZXJhdG9ycywKKwkJCVJBTkdFfFdIT0xFRk9MRHxDT1VOVHxUUkxCQVJ8Q01EV0lOfE1PRElGWSksCitFWChDTURfZXF1YWwsCQkiPSIsCQlleF9lcXVhbCwKKwkJCVJBTkdFfFRSTEJBUnxERkxBTEx8Q01EV0lOKSwKK0VYKENNRF9yc2hpZnQsCQkiPiIsCQlleF9vcGVyYXRvcnMsCisJCQlSQU5HRXxXSE9MRUZPTER8Q09VTlR8VFJMQkFSfENNRFdJTnxNT0RJRlkpLAorRVgoQ01EX2F0LAkJIkAiLAkJZXhfYXQsCisJCQlSQU5HRXxXSE9MRUZPTER8RVhUUkF8VFJMQkFSfENNRFdJTiksCitFWChDTURfTmV4dCwJCSJOZXh0IiwJCWV4X3ByZXZpb3VzLAorCQkJRVhUUkF8UkFOR0V8Tk9UQURSfENPVU5UfEJBTkd8RURJVENNRHxBUkdPUFR8VFJMQkFSKSwKK0VYKENNRF9QcmludCwJCSJQcmludCIsCWV4X3ByaW50LAorCQkJUkFOR0V8V0hPTEVGT0xEfENPVU5UfFRSTEJBUnxDTURXSU4pLAorRVgoQ01EX1gsCQkiWCIsCQlleF9YLAorCQkJVFJMQkFSKSwKK0VYKENNRF90aWxkZSwJCSJ+IiwJCWRvX3N1YiwKKwkJCVJBTkdFfFdIT0xFRk9MRHxFWFRSQXxDTURXSU58TU9ESUZZKSwKKworI2lmbmRlZiBET19ERUNMQVJFX0VYQ01ECisjaWZkZWYgRkVBVF9VU1JfQ01EUworICAgIENNRF9TSVpFLAkJLyogTVVTVCBiZSBhZnRlciBhbGwgcmVhbCBjb21tYW5kcyEgKi8KKyAgICBDTURfVVNFUiA9IC0xLAkvKiBVc2VyLWRlZmluZWQgY29tbWFuZCAqLworICAgIENNRF9VU0VSX0JVRiA9IC0yCS8qIFVzZXItZGVmaW5lZCBjb21tYW5kIGxvY2FsIHRvIGJ1ZmZlciAqLworI2Vsc2UKKyAgICBDTURfU0laRQkvKiBNVVNUIGJlIHRoZSBsYXN0IG9uZSEgKi8KKyNlbmRpZgorI2VuZGlmCit9OworCisjZGVmaW5lIFVTRVJfQ01ESURYKGlkeCkgKChpbnQpKGlkeCkgPCAwKQorCisjaWZuZGVmIERPX0RFQ0xBUkVfRVhDTUQKK3R5cGVkZWYgZW51bSBDTURfaW5kZXggY21kaWR4X1Q7CisKKy8qCisgKiBBcmd1bWVudHMgdXNlZCBmb3IgRXggY29tbWFuZHMuCisgKi8KK3N0cnVjdCBleGFyZworeworICAgIGNoYXJfdQkqYXJnOwkJLyogYXJndW1lbnQgb2YgdGhlIGNvbW1hbmQgKi8KKyAgICBjaGFyX3UJKm5leHRjbWQ7CS8qIG5leHQgY29tbWFuZCAoTlVMTCBpZiBub25lKSAqLworICAgIGNoYXJfdQkqY21kOwkJLyogdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgKGV4Y2VwdCBmb3IgOm1ha2UpICovCisgICAgY2hhcl91CSoqY21kbGluZXA7CS8qIHBvaW50ZXIgdG8gcG9pbnRlciBvZiBhbGxvY2F0ZWQgY21kbGluZSAqLworICAgIGNtZGlkeF9UCWNtZGlkeDsJCS8qIHRoZSBpbmRleCBmb3IgdGhlIGNvbW1hbmQgKi8KKyAgICBsb25nCWFyZ3Q7CQkvKiBmbGFncyBmb3IgdGhlIGNvbW1hbmQgKi8KKyAgICBpbnQJCXNraXA7CQkvKiBkb24ndCBleGVjdXRlIHRoZSBjb21tYW5kLCBvbmx5IHBhcnNlIGl0ICovCisgICAgaW50CQlmb3JjZWl0OwkvKiBUUlVFIGlmICEgcHJlc2VudCAqLworICAgIGludAkJYWRkcl9jb3VudDsJLyogdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgZ2l2ZW4gKi8KKyAgICBsaW5lbnJfVAlsaW5lMTsJCS8qIHRoZSBmaXJzdCBsaW5lIG51bWJlciAqLworICAgIGxpbmVucl9UCWxpbmUyOwkJLyogdGhlIHNlY29uZCBsaW5lIG51bWJlciBvciBjb3VudCAqLworICAgIGNoYXJfdQkqZG9fZWNtZF9jbWQ7CS8qICtjb21tYW5kIGFyZyB0byBiZSB1c2VkIGluIGVkaXRlZCBmaWxlICovCisgICAgbGluZW5yX1QJZG9fZWNtZF9sbnVtOwkvKiB0aGUgbGluZSBudW1iZXIgaW4gYW4gZWRpdGVkIGZpbGUgKi8KKyAgICBpbnQJCWFwcGVuZDsJCS8qIFRSVUUgd2l0aCAiOncgPj5maWxlIiBjb21tYW5kICovCisgICAgaW50CQl1c2VmaWx0ZXI7CS8qIFRSVUUgd2l0aCAiOncgIWNvbW1hbmQiIGFuZCAiOnIhY29tbWFuZCIgKi8KKyAgICBpbnQJCWFtb3VudDsJCS8qIG51bWJlciBvZiAnPicgb3IgJzwnIGZvciBzaGlmdCBjb21tYW5kICovCisgICAgaW50CQlyZWduYW1lOwkvKiByZWdpc3RlciBuYW1lIChOVUwgaWYgbm9uZSkgKi8KKyAgICBpbnQJCWZvcmNlX2JpbjsJLyogMCwgRk9SQ0VfQklOIG9yIEZPUkNFX05PQklOICovCisgICAgaW50CQlmb3JjZV9mZjsJLyogZm9yY2VkICdmaWxlZm9ybWF0JyAoaW5kZXggaW4gY21kW10pICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJZm9yY2VfZW5jOwkvKiBmb3JjZWQgJ2VuY29kaW5nJyAoaW5kZXggaW4gY21kW10pICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1VTUl9DTURTCisgICAgaW50CQl1c2VyaWR4OwkvKiB1c2VyIGNvbW1hbmQgaW5kZXggKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqZXJybXNnOwkvKiByZXR1cm5lZCBlcnJvciBtZXNzYWdlICovCisgICAgY2hhcl91CSooKmdldGxpbmUpIF9fQVJHUygoaW50LCB2b2lkICosIGludCkpOworICAgIHZvaWQJKmNvb2tpZTsJLyogYXJndW1lbnQgZm9yIGdldGxpbmUoKSAqLworI2lmZGVmIEZFQVRfRVZBTAorICAgIHN0cnVjdCBjb25kc3RhY2sgKmNzdGFjazsJLyogY29uZGl0aW9uIHN0YWNrIGZvciAiOmlmIiBldGMuICovCisjZW5kaWYKK307CisKKyNkZWZpbmUgRk9SQ0VfQklOIDEJCS8qICI6ZWRpdCArK2JpbiBmaWxlIiAqLworI2RlZmluZSBGT1JDRV9OT0JJTiAyCQkvKiAiOmVkaXQgKytub2JpbiBmaWxlIiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9leF9jbWRzMi5jIGIvc3JjL2V4X2NtZHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjOGJlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9leF9jbWRzMi5jCkBAIC0wLDAgKzEsNTcxMSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogZXhfY21kczIuYzogc29tZSBtb3JlIGZ1bmN0aW9ucyBmb3IgY29tbWFuZCBsaW5lIGNvbW1hbmRzCisgKi8KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoRkVBVF9DU0NPUEUpCisjIGluY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChGRUFUX0NTQ09QRSkKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCitzdGF0aWMgdm9pZAljbWRfc291cmNlIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgZXhhcmdfVCAqZWFwKSk7CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyBpbnQgZGVidWdfZ3JlZWR5ID0gRkFMU0U7CS8qIGJhdGNoIG1vZGUgZGVidWdnaW5nOiBkb24ndCBzYXZlCisJCQkJCSAgIGFuZCByZXN0b3JlIHR5cGVhaGVhZC4gKi8KKworLyoKKyAqIGRvX2RlYnVnKCk6IERlYnVnIG1vZGUuCisgKiBSZXBlYXRlZGx5IGdldCBFeCBjb21tYW5kcywgdW50aWwgdG9sZCB0byBjb250aW51ZSBub3JtYWwgZXhlY3V0aW9uLgorICovCisgICAgdm9pZAorZG9fZGVidWcoY21kKQorICAgIGNoYXJfdQkqY21kOworeworICAgIGludAkJc2F2ZV9tc2dfc2Nyb2xsID0gbXNnX3Njcm9sbDsKKyAgICBpbnQJCXNhdmVfU3RhdGUgPSBTdGF0ZTsKKyAgICBpbnQJCXNhdmVfZGlkX2Vtc2cgPSBkaWRfZW1zZzsKKyAgICBpbnQJCXNhdmVfY21kX3NpbGVudCA9IGNtZF9zaWxlbnQ7CisgICAgaW50CQlzYXZlX21zZ19zaWxlbnQgPSBtc2dfc2lsZW50OworICAgIGludAkJc2F2ZV9lbXNnX3NpbGVudCA9IGVtc2dfc2lsZW50OworICAgIGludAkJc2F2ZV9yZWRpcl9vZmYgPSByZWRpcl9vZmY7CisgICAgdGFzYXZlX1QJdHlwZWFoZWFkYnVmOworIyBpZmRlZiBGRUFUX0VYX0VYVFJBCisgICAgaW50CQlzYXZlX2V4X25vcm1hbF9idXN5OworIyBlbmRpZgorICAgIGludAkJbjsKKyAgICBjaGFyX3UJKmNtZGxpbmUgPSBOVUxMOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyCSp0YWlsID0gTlVMTDsKKyAgICBzdGF0aWMgaW50CWxhc3RfY21kID0gMDsKKyNkZWZpbmUgQ01EX0NPTlQJMQorI2RlZmluZSBDTURfTkVYVAkyCisjZGVmaW5lIENNRF9TVEVQCTMKKyNkZWZpbmUgQ01EX0ZJTklTSAk0CisjZGVmaW5lIENNRF9RVUlUCTUKKyNkZWZpbmUgQ01EX0lOVEVSUlVQVAk2CisKKyNpZmRlZiBBTFdBWVNfVVNFX0dVSQorICAgIC8qIENhbid0IGRvIHRoaXMgd2hlbiB0aGVyZSBpcyBubyB0ZXJtaW5hbCBmb3IgaW5wdXQvb3V0cHV0LiAqLworICAgIGlmICghZ3VpLmluX3VzZSkKKyAgICB7CisJLyogQnJlYWsgYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KKwlkZWJ1Z19icmVha19sZXZlbCA9IDk5OTk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLyogTWFrZSBzdXJlIHdlIGFyZSBpbiByYXcgbW9kZSBhbmQgc3RhcnQgdGVybWNhcCBtb2RlLiAgTWlnaHQgaGF2ZSBzaWRlCisgICAgICogZWZmZWN0cy4uLiAqLworICAgIHNldHRtb2RlKFRNT0RFX1JBVyk7CisgICAgc3RhcnR0ZXJtY2FwKCk7CisKKyAgICArK1JlZHJhd2luZ0Rpc2FibGVkOwkvKiBkb24ndCByZWRpc3BsYXkgdGhlIHdpbmRvdyAqLworICAgICsrbm9fd2FpdF9yZXR1cm47CQkvKiBkb24ndCB3YWl0IGZvciByZXR1cm4gKi8KKyAgICBkaWRfZW1zZyA9IEZBTFNFOwkJLyogZG9uJ3QgdXNlIGVycm9yIGZyb20gZGVidWdnZWQgc3R1ZmYgKi8KKyAgICBjbWRfc2lsZW50ID0gRkFMU0U7CQkvKiBkaXNwbGF5IGNvbW1hbmRzICovCisgICAgbXNnX3NpbGVudCA9IEZBTFNFOwkJLyogZGlzcGxheSBtZXNzYWdlcyAqLworICAgIGVtc2dfc2lsZW50ID0gRkFMU0U7CS8qIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICByZWRpcl9vZmYgPSBUUlVFOwkJLyogZG9uJ3QgcmVkaXJlY3QgZGVidWcgY29tbWFuZHMgKi8KKworICAgIFN0YXRlID0gTk9STUFMOworI2lmZGVmIEZFQVRfU05JRkYKKyAgICB3YW50X3NuaWZmX3JlcXVlc3QgPSAwOyAgICAvKiBObyBLX1NOSUZGIHdhbnRlZCAqLworI2VuZGlmCisKKyAgICBpZiAoIWRlYnVnX2RpZF9tc2cpCisJTVNHKF8oIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGNvbnRpbnVlLiIpKTsKKyAgICBpZiAoc291cmNpbmdfbmFtZSAhPSBOVUxMKQorCW1zZyhzb3VyY2luZ19uYW1lKTsKKyAgICBpZiAoc291cmNpbmdfbG51bSAhPSAwKQorCXNtc2coKGNoYXJfdSAqKV8oImxpbmUgJWxkOiAlcyIpLCAobG9uZylzb3VyY2luZ19sbnVtLCBjbWQpOworICAgIGVsc2UKKwltc2dfc3RyKChjaGFyX3UgKilfKCJjbWQ6ICVzIiksIGNtZCk7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCBnZXR0aW5nIGEgY29tbWFuZCBhbmQgZXhlY3V0aW5nIGl0LgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCW1zZ19zY3JvbGwgPSBUUlVFOworCW5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NOSUZGCisJUHJvY2Vzc1NuaWZmUmVxdWVzdHMoKTsKKyNlbmRpZgorCS8qIFNhdmUgdGhlIGN1cnJlbnQgdHlwZWFoZWFkIGJ1ZmZlciBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGVtcHR5IG9uZS4KKwkgKiBUaGlzIG1ha2VzIHN1cmUgd2UgZ2V0IGlucHV0IGZyb20gdGhlIHVzZXIgaGVyZSBhbmQgZG9uJ3QgaW50ZXJmZXJlCisJICogd2l0aCB0aGUgY29tbWFuZHMgYmVpbmcgZXhlY3V0ZWQuICBSZXNldCAiZXhfbm9ybWFsX2J1c3kiIHRvIGF2b2lkCisJICogdGhlIHNpZGUgZWZmZWN0cyBvZiB1c2luZyAiOm5vcm1hbCIuIFNhdmUgdGhlIHN0dWZmIGJ1ZmZlciBhbmQgbWFrZQorCSAqIGl0IGVtcHR5LiAqLworIyBpZmRlZiBGRUFUX0VYX0VYVFJBCisJc2F2ZV9leF9ub3JtYWxfYnVzeSA9IGV4X25vcm1hbF9idXN5OworCWV4X25vcm1hbF9idXN5ID0gMDsKKyMgZW5kaWYKKwlpZiAoIWRlYnVnX2dyZWVkeSkKKwkgICAgc2F2ZV90eXBlYWhlYWQoJnR5cGVhaGVhZGJ1Zik7CisKKwljbWRsaW5lID0gZ2V0Y21kbGluZV9wcm9tcHQoJz4nLCBOVUxMLCAwKTsKKworCWlmICghZGVidWdfZ3JlZWR5KQorCSAgICByZXN0b3JlX3R5cGVhaGVhZCgmdHlwZWFoZWFkYnVmKTsKKyMgaWZkZWYgRkVBVF9FWF9FWFRSQQorCWV4X25vcm1hbF9idXN5ID0gc2F2ZV9leF9ub3JtYWxfYnVzeTsKKyMgZW5kaWYKKworCWNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKwlpZiAoY21kbGluZSAhPSBOVUxMKQorCXsKKwkgICAgLyogSWYgdGhpcyBpcyBhIGRlYnVnIGNvbW1hbmQsIHNldCAibGFzdF9jbWQiLgorCSAgICAgKiBJZiBub3QsIHJlc2V0ICJsYXN0X2NtZCIuCisJICAgICAqIEZvciBhIGJsYW5rIGxpbmUgdXNlIHByZXZpb3VzIGNvbW1hbmQuICovCisJICAgIHAgPSBza2lwd2hpdGUoY21kbGluZSk7CisJICAgIGlmICgqcCAhPSBOVUwpCisJICAgIHsKKwkJc3dpdGNoICgqcCkKKwkJeworCQkgICAgY2FzZSAnYyc6IGxhc3RfY21kID0gQ01EX0NPTlQ7CisJCQkgICAgICB0YWlsID0gIm9udCI7CisJCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ24nOiBsYXN0X2NtZCA9IENNRF9ORVhUOworCQkJICAgICAgdGFpbCA9ICJleHQiOworCQkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdzJzogbGFzdF9jbWQgPSBDTURfU1RFUDsKKwkJCSAgICAgIHRhaWwgPSAidGVwIjsKKwkJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnZic6IGxhc3RfY21kID0gQ01EX0ZJTklTSDsKKwkJCSAgICAgIHRhaWwgPSAiaW5pc2giOworCQkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdxJzogbGFzdF9jbWQgPSBDTURfUVVJVDsKKwkJCSAgICAgIHRhaWwgPSAidWl0IjsKKwkJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnaSc6IGxhc3RfY21kID0gQ01EX0lOVEVSUlVQVDsKKwkJCSAgICAgIHRhaWwgPSAibnRlcnJ1cHQiOworCQkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OiBsYXN0X2NtZCA9IDA7CisJCX0KKwkJaWYgKGxhc3RfY21kICE9IDApCisJCXsKKwkJICAgIC8qIENoZWNrIHRoYXQgdGhlIHRhaWwgbWF0Y2hlcy4gKi8KKwkJICAgICsrcDsKKwkJICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnAgPT0gKnRhaWwpCisJCSAgICB7CisJCQkrK3A7CisJCQkrK3RhaWw7CisJCSAgICB9CisJCSAgICBpZiAoQVNDSUlfSVNBTFBIQSgqcCkpCisJCQlsYXN0X2NtZCA9IDA7CisJCX0KKwkgICAgfQorCisJICAgIGlmIChsYXN0X2NtZCAhPSAwKQorCSAgICB7CisJCS8qIEV4ZWN1dGUgZGVidWcgY29tbWFuZDogZGVjaWRlZCB3aGVyZSB0byBicmVhayBuZXh0IGFuZAorCQkgKiByZXR1cm4uICovCisJCXN3aXRjaCAobGFzdF9jbWQpCisJCXsKKwkJICAgIGNhc2UgQ01EX0NPTlQ6CisJCQlkZWJ1Z19icmVha19sZXZlbCA9IC0xOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRF9ORVhUOgorCQkJZGVidWdfYnJlYWtfbGV2ZWwgPSBleF9uZXN0aW5nX2xldmVsOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRF9TVEVQOgorCQkJZGVidWdfYnJlYWtfbGV2ZWwgPSA5OTk5OworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRF9GSU5JU0g6CisJCQlkZWJ1Z19icmVha19sZXZlbCA9IGV4X25lc3RpbmdfbGV2ZWwgLSAxOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRF9RVUlUOgorCQkJZ290X2ludCA9IFRSVUU7CisJCQlkZWJ1Z19icmVha19sZXZlbCA9IC0xOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRF9JTlRFUlJVUFQ6CisJCQlnb3RfaW50ID0gVFJVRTsKKwkJCWRlYnVnX2JyZWFrX2xldmVsID0gOTk5OTsKKwkJCS8qIERvIG5vdCByZXBlYXQgIj5pbnRlcnJ1cHQiIGNtZCwgY29udGludWUgc3RlcHBpbmcuICovCisJCQlsYXN0X2NtZCA9IENNRF9TVEVQOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKiBkb24ndCBkZWJ1ZyB0aGlzIGNvbW1hbmQgKi8KKwkgICAgbiA9IGRlYnVnX2JyZWFrX2xldmVsOworCSAgICBkZWJ1Z19icmVha19sZXZlbCA9IC0xOworCSAgICAodm9pZClkb19jbWRsaW5lKGNtZGxpbmUsIGdldGV4bGluZSwgTlVMTCwKKwkJCQkJCURPQ01EX1ZFUkJPU0V8RE9DTURfRVhDUkVTRVQpOworCSAgICBkZWJ1Z19icmVha19sZXZlbCA9IG47CisKKwkgICAgdmltX2ZyZWUoY21kbGluZSk7CisJfQorCWxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKyAgICB9CisgICAgdmltX2ZyZWUoY21kbGluZSk7CisKKyAgICAtLVJlZHJhd2luZ0Rpc2FibGVkOworICAgIC0tbm9fd2FpdF9yZXR1cm47CisgICAgcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfc2Nyb2xsID0gc2F2ZV9tc2dfc2Nyb2xsOworICAgIGxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKyAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisgICAgZGlkX2Vtc2cgPSBzYXZlX2RpZF9lbXNnOworICAgIGNtZF9zaWxlbnQgPSBzYXZlX2NtZF9zaWxlbnQ7CisgICAgbXNnX3NpbGVudCA9IHNhdmVfbXNnX3NpbGVudDsKKyAgICBlbXNnX3NpbGVudCA9IHNhdmVfZW1zZ19zaWxlbnQ7CisgICAgcmVkaXJfb2ZmID0gc2F2ZV9yZWRpcl9vZmY7CisKKyAgICAvKiBPbmx5IHByaW50IHRoZSBtZXNzYWdlIGFnYWluIHdoZW4gdHlwaW5nIGEgY29tbWFuZCBiZWZvcmUgY29taW5nIGJhY2sKKyAgICAgKiBoZXJlLiAqLworICAgIGRlYnVnX2RpZF9tc2cgPSBUUlVFOworfQorCisvKgorICogIjpkZWJ1ZyIuCisgKi8KKyAgICB2b2lkCitleF9kZWJ1ZyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJZGVidWdfYnJlYWtfbGV2ZWxfc2F2ZSA9IGRlYnVnX2JyZWFrX2xldmVsOworCisgICAgZGVidWdfYnJlYWtfbGV2ZWwgPSA5OTk5OworICAgIGRvX2NtZGxpbmVfY21kKGVhcC0+YXJnKTsKKyAgICBkZWJ1Z19icmVha19sZXZlbCA9IGRlYnVnX2JyZWFrX2xldmVsX3NhdmU7Cit9CisKK3N0YXRpYyBjaGFyX3UJKmRlYnVnX2JyZWFrcG9pbnRfbmFtZSA9IE5VTEw7CitzdGF0aWMgbGluZW5yX1QJZGVidWdfYnJlYWtwb2ludF9sbnVtOworCisvKgorICogV2hlbiBkZWJ1Z2dpbmcgb3IgYSBicmVha3BvaW50IGlzIHNldCBvbiBhIHNraXBwZWQgY29tbWFuZCwgbm8gZGVidWcgcHJvbXB0CisgKiBpcyBzaG93biBieSBkb19vbmVfY21kKCkuICBUaGlzIHNpdHVhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgZGVidWdfc2tpcHBlZCwgYW5kCisgKiBkZWJ1Z19za2lwcGVkX25hbWUgaXMgdGhlbiBzZXQgdG8gdGhlIHNvdXJjZSBuYW1lIGluIHRoZSBicmVha3BvaW50IGNhc2UuICBJZgorICogYSBza2lwcGVkIGNvbW1hbmQgZGVjaWRlcyBpdHNlbGYgdGhhdCBhIGRlYnVnIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLCBpdAorICogY2FuIGRvIHNvIGJ5IGNhbGxpbmcgZGJnX2NoZWNrX3NraXBwZWQoKS4KKyAqLworc3RhdGljIGludAlkZWJ1Z19za2lwcGVkOworc3RhdGljIGNoYXJfdQkqZGVidWdfc2tpcHBlZF9uYW1lOworCisvKgorICogR28gdG8gZGVidWcgbW9kZSB3aGVuIGEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQgb3IgImV4X25lc3RpbmdfbGV2ZWwiIGlzCisgKiBhdCBvciBiZWxvdyB0aGUgYnJlYWsgbGV2ZWwuICBCdXQgb25seSB3aGVuIHRoZSBsaW5lIGlzIGFjdHVhbGx5CisgKiBleGVjdXRlZC4gIFJldHVybiBUUlVFIGFuZCBzZXQgYnJlYWtwb2ludF9uYW1lIGZvciBza2lwcGVkIGNvbW1hbmRzIHRoYXQKKyAqIGRlY2lkZSB0byBleGVjdXRlIHNvbWV0aGluZyB0aGVtc2VsdmVzLgorICogQ2FsbGVkIGZyb20gZG9fb25lX2NtZCgpIGJlZm9yZSBleGVjdXRpbmcgYSBjb21tYW5kLgorICovCisgICAgdm9pZAorZGJnX2NoZWNrX2JyZWFrcG9pbnQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBkZWJ1Z19za2lwcGVkID0gRkFMU0U7CisgICAgaWYgKGRlYnVnX2JyZWFrcG9pbnRfbmFtZSAhPSBOVUxMKQorICAgIHsKKwlpZiAoIWVhcC0+c2tpcCkKKwl7CisJICAgIC8qIHJlcGxhY2UgS19TTlIgd2l0aCAiPFNOUj4iICovCisJICAgIGlmIChkZWJ1Z19icmVha3BvaW50X25hbWVbMF0gPT0gS19TUEVDSUFMCisJCSAgICAmJiBkZWJ1Z19icmVha3BvaW50X25hbWVbMV0gPT0gS1NfRVhUUkEKKwkJICAgICYmIGRlYnVnX2JyZWFrcG9pbnRfbmFtZVsyXSA9PSAoaW50KUtFX1NOUikKKwkJcCA9IChjaGFyX3UgKikiPFNOUj4iOworCSAgICBlbHNlCisJCXAgPSAoY2hhcl91ICopIiI7CisJICAgIHNtc2coKGNoYXJfdSAqKV8oIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiKSwgcCwKKwkJICAgIGRlYnVnX2JyZWFrcG9pbnRfbmFtZSArICgqcCA9PSBOVUwgPyAwIDogMyksCisJCSAgICAobG9uZylkZWJ1Z19icmVha3BvaW50X2xudW0pOworCSAgICBkZWJ1Z19icmVha3BvaW50X25hbWUgPSBOVUxMOworCSAgICBkb19kZWJ1ZyhlYXAtPmNtZCk7CisJfQorCWVsc2UKKwl7CisJICAgIGRlYnVnX3NraXBwZWQgPSBUUlVFOworCSAgICBkZWJ1Z19za2lwcGVkX25hbWUgPSBkZWJ1Z19icmVha3BvaW50X25hbWU7CisJICAgIGRlYnVnX2JyZWFrcG9pbnRfbmFtZSA9IE5VTEw7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChleF9uZXN0aW5nX2xldmVsIDw9IGRlYnVnX2JyZWFrX2xldmVsKQorICAgIHsKKwlpZiAoIWVhcC0+c2tpcCkKKwkgICAgZG9fZGVidWcoZWFwLT5jbWQpOworCWVsc2UKKwl7CisJICAgIGRlYnVnX3NraXBwZWQgPSBUUlVFOworCSAgICBkZWJ1Z19za2lwcGVkX25hbWUgPSBOVUxMOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBHbyB0byBkZWJ1ZyBtb2RlIGlmIHNraXBwZWQgYnkgZGJnX2NoZWNrX2JyZWFrcG9pbnQoKSBiZWNhdXNlIGVhcC0+c2tpcCB3YXMKKyAqIHNldC4gIFJldHVybiBUUlVFIHdoZW4gdGhlIGRlYnVnIG1vZGUgaXMgZW50ZXJlZCB0aGlzIHRpbWUuCisgKi8KKyAgICBpbnQKK2RiZ19jaGVja19za2lwcGVkKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlwcmV2X2dvdF9pbnQ7CisKKyAgICBpZiAoZGVidWdfc2tpcHBlZCkKKyAgICB7CisJLyoKKwkgKiBTYXZlIHRoZSB2YWx1ZSBvZiBnb3RfaW50IGFuZCByZXNldCBpdC4gIFdlIGRvbid0IHdhbnQgYSBwcmV2aW91cworCSAqIGludGVycnVwdGlvbiBjYXVzZSBmbHVzaGluZyB0aGUgaW5wdXQgYnVmZmVyLgorCSAqLworCXByZXZfZ290X2ludCA9IGdvdF9pbnQ7CisJZ290X2ludCA9IEZBTFNFOworCWRlYnVnX2JyZWFrcG9pbnRfbmFtZSA9IGRlYnVnX3NraXBwZWRfbmFtZTsKKwkvKiBlYXAtPnNraXAgaXMgVFJVRSAqLworCWVhcC0+c2tpcCA9IEZBTFNFOworCSh2b2lkKWRiZ19jaGVja19icmVha3BvaW50KGVhcCk7CisJZWFwLT5za2lwID0gVFJVRTsKKwlnb3RfaW50IHw9IHByZXZfZ290X2ludDsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogVGhlIGxpc3Qgb2YgYnJlYWtwb2ludHM6IGRiZ19icmVha3AuCisgKiBUaGlzIGlzIGEgZ3Jvdy1hcnJheSBvZiBzdHJ1Y3RzLgorICovCitzdHJ1Y3QgZGVidWdneQoreworICAgIGludAkJZGJnX25yOwkJLyogYnJlYWtwb2ludCBudW1iZXIgKi8KKyAgICBpbnQJCWRiZ190eXBlOwkvKiBEQkdfRlVOQyBvciBEQkdfRklMRSAqLworICAgIGNoYXJfdQkqZGJnX25hbWU7CS8qIGZ1bmN0aW9uIG9yIGZpbGUgbmFtZSAqLworICAgIHJlZ3Byb2dfVAkqZGJnX3Byb2c7CS8qIHJlZ2V4cCBwcm9ncmFtICovCisgICAgbGluZW5yX1QJZGJnX2xudW07CS8qIGxpbmUgbnVtYmVyIGluIGZ1bmN0aW9uIG9yIGZpbGUgKi8KK307CisKK3N0YXRpYyBnYXJyYXlfVCBkYmdfYnJlYWtwID0gezAsIDAsIHNpemVvZihzdHJ1Y3QgZGVidWdneSksIDQsIE5VTEx9OworI2RlZmluZSBCUkVBS1AoaWR4KQkoKChzdHJ1Y3QgZGVidWdneSAqKWRiZ19icmVha3AuZ2FfZGF0YSlbaWR4XSkKK3N0YXRpYyBpbnQgbGFzdF9icmVha3AgPSAwOwkvKiBuciBvZiBsYXN0IGRlZmluZWQgYnJlYWtwb2ludCAqLworCisjZGVmaW5lIERCR19GVU5DCTEKKyNkZWZpbmUgREJHX0ZJTEUJMgorCitzdGF0aWMgaW50IGRiZ19wYXJzZWFyZyBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CisKKy8qCisgKiBQYXJzZSB0aGUgYXJndW1lbnRzIG9mICI6YnJlYWthZGQiIG9yICI6YnJlYWtkZWwiIGFuZCBwdXQgdGhlbSBpbiB0aGUgZW50cnkKKyAqIGp1c3QgYWZ0ZXIgdGhlIGxhc3Qgb25lIGluIGRiZ19icmVha3AuICBOb3RlIHRoYXQgImRiZ19uYW1lIiBpcyBhbGxvY2F0ZWQuCisgKiBSZXR1cm5zIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBzdGF0aWMgaW50CitkYmdfcGFyc2VhcmcoYXJnKQorICAgIGNoYXJfdQkqYXJnOworeworICAgIGNoYXJfdQkqcCA9IGFyZzsKKyAgICBjaGFyX3UJKnE7CisgICAgc3RydWN0IGRlYnVnZ3kgKmJwOworCisgICAgaWYgKGdhX2dyb3coJmRiZ19icmVha3AsIDEpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisgICAgYnAgPSAmQlJFQUtQKGRiZ19icmVha3AuZ2FfbGVuKTsKKworICAgIC8qIEZpbmQgImZ1bmMiIG9yICJmaWxlIi4gKi8KKyAgICBpZiAoU1RSTkNNUChwLCAiZnVuYyIsIDQpID09IDApCisJYnAtPmRiZ190eXBlID0gREJHX0ZVTkM7CisgICAgZWxzZSBpZiAoU1RSTkNNUChwLCAiZmlsZSIsIDQpID09IDApCisJYnAtPmRiZ190eXBlID0gREJHX0ZJTEU7CisgICAgZWxzZQorICAgIHsKKwlFTVNHMihfKGVfaW52YXJnMiksIHApOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICBwID0gc2tpcHdoaXRlKHAgKyA0KTsKKworICAgIC8qIEZpbmQgb3B0aW9uYWwgbGluZSBudW1iZXIuICovCisgICAgaWYgKFZJTV9JU0RJR0lUKCpwKSkKKyAgICB7CisJYnAtPmRiZ19sbnVtID0gZ2V0ZGlnaXRzKCZwKTsKKwlwID0gc2tpcHdoaXRlKHApOworICAgIH0KKyAgICBlbHNlCisJYnAtPmRiZ19sbnVtID0gMDsKKworICAgIC8qIEZpbmQgdGhlIGZ1bmN0aW9uIG9yIGZpbGUgbmFtZS4gIERvbid0IGFjY2VwdCBhIGZ1bmN0aW9uIG5hbWUgd2l0aCAoKS4gKi8KKyAgICBpZiAoKnAgPT0gTlVMCisJICAgIHx8IChicC0+ZGJnX3R5cGUgPT0gREJHX0ZVTkMgJiYgc3Ryc3RyKChjaGFyICopcCwgIigpIikgIT0gTlVMTCkpCisgICAgeworCUVNU0cyKF8oZV9pbnZhcmcyKSwgYXJnKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICBpZiAoYnAtPmRiZ190eXBlID09IERCR19GVU5DKQorCWJwLT5kYmdfbmFtZSA9IHZpbV9zdHJzYXZlKHApOworICAgIGVsc2UKKyAgICB7CisJLyogRXhwYW5kIHRoZSBmaWxlIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIGRvX3NvdXJjZSgpLiAgVGhpcyBtZWFucworCSAqIGRvaW5nIGl0IHR3aWNlLCBzbyB0aGF0ICRESVIvZmlsZSBnZXRzIGV4cGFuZGVkIHdoZW4gJERJUiBpcworCSAqICJ+L2RpciIuICovCisjaWZkZWYgUklTQ09TCisJcSA9IG1jaF9tdW5nZV9mbmFtZShwKTsKKyNlbHNlCisJcSA9IGV4cGFuZF9lbnZfc2F2ZShwKTsKKyNlbmRpZgorCWlmIChxID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworI2lmZGVmIFJJU0NPUworCXAgPSBtY2hfbXVuZ2VfZm5hbWUocSk7CisjZWxzZQorCXAgPSBleHBhbmRfZW52X3NhdmUocSk7CisjZW5kaWYKKwl2aW1fZnJlZShxKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKwlicC0+ZGJnX25hbWUgPSBmaXhfZm5hbWUocCk7CisJdmltX2ZyZWUocCk7CisjaWZkZWYgTUFDT1NfQ0xBU1NJQworCWlmIChicC0+ZGJnX25hbWUgIT0gTlVMTCkKKwkgICAgc2xhc2hfbl9jb2xvbl9hZGp1c3QoYnAtPmRiZ19uYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChicC0+ZGJnX25hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiAiOmJyZWFrYWRkIi4KKyAqLworICAgIHZvaWQKK2V4X2JyZWFrYWRkKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgc3RydWN0IGRlYnVnZ3kgKmJwOworICAgIGNoYXJfdQkqcGF0OworCisgICAgaWYgKGRiZ19wYXJzZWFyZyhlYXAtPmFyZykgPT0gT0spCisgICAgeworCWJwID0gJkJSRUFLUChkYmdfYnJlYWtwLmdhX2xlbik7CisJcGF0ID0gZmlsZV9wYXRfdG9fcmVnX3BhdChicC0+ZGJnX25hbWUsIE5VTEwsIE5VTEwsIEZBTFNFKTsKKwlpZiAocGF0ICE9IE5VTEwpCisJeworCSAgICBicC0+ZGJnX3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIFJFX01BR0lDICsgUkVfU1RSSU5HKTsKKwkgICAgdmltX2ZyZWUocGF0KTsKKwl9CisJaWYgKHBhdCA9PSBOVUxMIHx8IGJwLT5kYmdfcHJvZyA9PSBOVUxMKQorCSAgICB2aW1fZnJlZShicC0+ZGJnX25hbWUpOworCWVsc2UKKwl7CisJICAgIGlmIChicC0+ZGJnX2xudW0gPT0gMCkJLyogZGVmYXVsdCBsaW5lIG51bWJlciBpcyAxICovCisJCWJwLT5kYmdfbG51bSA9IDE7CisJICAgIEJSRUFLUChkYmdfYnJlYWtwLmdhX2xlbisrKS5kYmdfbnIgPSArK2xhc3RfYnJlYWtwOworCSAgICAtLWRiZ19icmVha3AuZ2Ffcm9vbTsKKwkgICAgKytkZWJ1Z190aWNrOworCX0KKyAgICB9Cit9CisKKy8qCisgKiAiOmRlYnVnZ3JlZWR5Ii4KKyAqLworICAgIHZvaWQKK2V4X2RlYnVnZ3JlZWR5KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKGVhcC0+YWRkcl9jb3VudCA9PSAwIHx8IGVhcC0+bGluZTIgIT0gMCkKKwlkZWJ1Z19ncmVlZHkgPSBUUlVFOworICAgIGVsc2UKKwlkZWJ1Z19ncmVlZHkgPSBGQUxTRTsKK30KKworLyoKKyAqICI6YnJlYWtkZWwiLgorICovCisgICAgdm9pZAorZXhfYnJlYWtkZWwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBzdHJ1Y3QgZGVidWdneSAqYnAsICpicGk7CisgICAgaW50CQlucjsKKyAgICBpbnQJCXRvZGVsID0gLTE7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCWJlc3RfbG51bSA9IDA7CisKKyAgICBpZiAodmltX2lzZGlnaXQoKmVhcC0+YXJnKSkKKyAgICB7CisJLyogIjpicmVha2RlbCB7bnJ9IiAqLworCW5yID0gYXRvbCgoY2hhciAqKWVhcC0+YXJnKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJnX2JyZWFrcC5nYV9sZW47ICsraSkKKwkgICAgaWYgKEJSRUFLUChpKS5kYmdfbnIgPT0gbnIpCisJICAgIHsKKwkJdG9kZWwgPSBpOworCQlicmVhazsKKwkgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qICI6YnJlYWtkZWwge2Z1bmN8ZmlsZX0gW2xudW1dIHtuYW1lfSIgKi8KKwlpZiAoZGJnX3BhcnNlYXJnKGVhcC0+YXJnKSA9PSBGQUlMKQorCSAgICByZXR1cm47CisJYnAgPSAmQlJFQUtQKGRiZ19icmVha3AuZ2FfbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJnX2JyZWFrcC5nYV9sZW47ICsraSkKKwl7CisJICAgIGJwaSA9ICZCUkVBS1AoaSk7CisJICAgIGlmIChicC0+ZGJnX3R5cGUgPT0gYnBpLT5kYmdfdHlwZQorCQkgICAgJiYgU1RSQ01QKGJwLT5kYmdfbmFtZSwgYnBpLT5kYmdfbmFtZSkgPT0gMAorCQkgICAgJiYgKGJwLT5kYmdfbG51bSA9PSBicGktPmRiZ19sbnVtCisJCQl8fCAoYnAtPmRiZ19sbnVtID09IDAKKwkJCSAgICAmJiAoYmVzdF9sbnVtID09IDAKKwkJCQl8fCBicGktPmRiZ19sbnVtIDwgYmVzdF9sbnVtKSkpKQorCSAgICB7CisJCXRvZGVsID0gaTsKKwkJYmVzdF9sbnVtID0gYnBpLT5kYmdfbG51bTsKKwkgICAgfQorCX0KKwl2aW1fZnJlZShicC0+ZGJnX25hbWUpOworICAgIH0KKworICAgIGlmICh0b2RlbCA8IDApCisJRU1TRzIoXygiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIiksIGVhcC0+YXJnKTsKKyAgICBlbHNlCisgICAgeworCXZpbV9mcmVlKEJSRUFLUCh0b2RlbCkuZGJnX25hbWUpOworCXZpbV9mcmVlKEJSRUFLUCh0b2RlbCkuZGJnX3Byb2cpOworCS0tZGJnX2JyZWFrcC5nYV9sZW47CisJKytkYmdfYnJlYWtwLmdhX3Jvb207CisJaWYgKHRvZGVsIDwgZGJnX2JyZWFrcC5nYV9sZW4pCisJICAgIG1jaF9tZW1tb3ZlKCZCUkVBS1AodG9kZWwpLCAmQlJFQUtQKHRvZGVsICsgMSksCisJCSAgICAoZGJnX2JyZWFrcC5nYV9sZW4gLSB0b2RlbCkgKiBzaXplb2Yoc3RydWN0IGRlYnVnZ3kpKTsKKwkrK2RlYnVnX3RpY2s7CisgICAgfQorfQorCisvKgorICogIjpicmVha2xpc3QiLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitleF9icmVha2xpc3QoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBzdHJ1Y3QgZGVidWdneSAqYnA7CisgICAgaW50CQlpOworCisgICAgaWYgKGRiZ19icmVha3AuZ2FfbGVuID09IDApCisJTVNHKF8oIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiKSk7CisgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCBkYmdfYnJlYWtwLmdhX2xlbjsgKytpKQorCXsKKwkgICAgYnAgPSAmQlJFQUtQKGkpOworCSAgICBzbXNnKChjaGFyX3UgKilfKCIlM2QgICVzICVzICBsaW5lICVsZCIpLAorCQkgICAgYnAtPmRiZ19uciwKKwkJICAgIGJwLT5kYmdfdHlwZSA9PSBEQkdfRlVOQyA/ICJmdW5jIiA6ICJmaWxlIiwKKwkJICAgIGJwLT5kYmdfbmFtZSwKKwkJICAgIChsb25nKWJwLT5kYmdfbG51bSk7CisJfQorfQorCisvKgorICogRmluZCBhIGJyZWFrcG9pbnQgZm9yIGEgZnVuY3Rpb24gb3Igc291cmNlZCBmaWxlLgorICogUmV0dXJucyBsaW5lIG51bWJlciBhdCB3aGljaCB0byBicmVhazsgemVybyB3aGVuIG5vIG1hdGNoaW5nIGJyZWFrcG9pbnQuCisgKi8KKyAgICBsaW5lbnJfVAorZGJnX2ZpbmRfYnJlYWtwb2ludChmaWxlLCBmbmFtZSwgYWZ0ZXIpCisgICAgaW50CQlmaWxlOwkgICAgLyogVFJVRSBmb3IgYSBmaWxlLCBGQUxTRSBmb3IgYSBmdW5jdGlvbiAqLworICAgIGNoYXJfdQkqZm5hbWU7CSAgICAvKiBmaWxlIG9yIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBsaW5lbnJfVAlhZnRlcjsJICAgIC8qIGFmdGVyIHRoaXMgbGluZSBudW1iZXIgKi8KK3sKKyAgICBzdHJ1Y3QgZGVidWdneSAqYnA7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCWxudW0gPSAwOworICAgIHJlZ21hdGNoX1QJcmVnbWF0Y2g7CisgICAgY2hhcl91CSpuYW1lID0gZm5hbWU7CisgICAgaW50CQlwcmV2X2dvdF9pbnQ7CisKKyAgICAvKiBSZXBsYWNlIEtfU05SIGluIGZ1bmN0aW9uIG5hbWUgd2l0aCAiPFNOUj4iLiAqLworICAgIGlmICghZmlsZSAmJiBmbmFtZVswXSA9PSBLX1NQRUNJQUwpCisgICAgeworCW5hbWUgPSBhbGxvYygodW5zaWduZWQpU1RSTEVOKGZuYW1lKSArIDMpOworCWlmIChuYW1lID09IE5VTEwpCisJICAgIG5hbWUgPSBmbmFtZTsKKwllbHNlCisJeworCSAgICBTVFJDUFkobmFtZSwgIjxTTlI+Iik7CisJICAgIFNUUkNQWShuYW1lICsgNSwgZm5hbWUgKyAzKTsKKwl9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRiZ19icmVha3AuZ2FfbGVuOyArK2kpCisgICAgeworCS8qIHNraXAgZW50cmllcyB0aGF0IGFyZSBub3QgdXNlZnVsIG9yIGFyZSBmb3IgYSBsaW5lIHRoYXQgaXMgYmV5b25kCisJICogYW4gYWxyZWFkeSBmb3VuZCBicmVha3BvaW50ICovCisJYnAgPSAmQlJFQUtQKGkpOworCWlmICgoYnAtPmRiZ190eXBlID09IERCR19GSUxFKSA9PSBmaWxlCisJCSYmIGJwLT5kYmdfbG51bSA+IGFmdGVyCisJCSYmIChsbnVtID09IDAgfHwgYnAtPmRiZ19sbnVtIDwgbG51bSkpCisJeworCSAgICByZWdtYXRjaC5yZWdwcm9nID0gYnAtPmRiZ19wcm9nOworCSAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOworCSAgICAvKgorCSAgICAgKiBTYXZlIHRoZSB2YWx1ZSBvZiBnb3RfaW50IGFuZCByZXNldCBpdC4gIFdlIGRvbid0IHdhbnQgYSBwcmV2aW91cworCSAgICAgKiBpbnRlcnJ1cHRpb24gY2FuY2VsIG1hdGNoaW5nLCBvbmx5IGhpdHRpbmcgQ1RSTC1DIHdoaWxlIG1hdGNoaW5nCisJICAgICAqIHNob3VsZCBhYm9ydCBpdC4KKwkgICAgICovCisJICAgIHByZXZfZ290X2ludCA9IGdvdF9pbnQ7CisJICAgIGdvdF9pbnQgPSBGQUxTRTsKKwkgICAgaWYgKHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgbmFtZSwgKGNvbG5yX1QpMCkpCisJCWxudW0gPSBicC0+ZGJnX2xudW07CisJICAgIGdvdF9pbnQgfD0gcHJldl9nb3RfaW50OworCX0KKyAgICB9CisgICAgaWYgKG5hbWUgIT0gZm5hbWUpCisJdmltX2ZyZWUobmFtZSk7CisKKyAgICByZXR1cm4gbG51bTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQuCisgKi8KKyAgICB2b2lkCitkYmdfYnJlYWtwb2ludChuYW1lLCBsbnVtKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIC8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBsaW5lIGlzIGFjdHVhbGx5IGV4ZWN1dGVkIGluIGRvX29uZV9jbWQoKSAqLworICAgIGRlYnVnX2JyZWFrcG9pbnRfbmFtZSA9IG5hbWU7CisgICAgZGVidWdfYnJlYWtwb2ludF9sbnVtID0gbG51bTsKK30KKyNlbmRpZgorCisvKgorICogSWYgJ2F1dG93cml0ZScgb3B0aW9uIHNldCwgdHJ5IHRvIHdyaXRlIHRoZSBmaWxlLgorICogQ2FyZWZ1bDogYXV0b2NvbW1hbmRzIG1heSBtYWtlICJidWYiIGludmFsaWQhCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CithdXRvd3JpdGUoYnVmLCBmb3JjZWl0KQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmb3JjZWl0OworeworICAgIGlmICghKHBfYXcgfHwgcF9hd2EpIHx8ICFwX3dyaXRlCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCS8qIG5ldmVyIGF1dG93cml0ZSBhICJub2ZpbGUiIG9yICJub3dyaXRlIiBidWZmZXIgKi8KKwl8fCBidF9kb250d3JpdGUoYnVmKQorI2VuZGlmCisJfHwgKCFmb3JjZWl0ICYmIGJ1Zi0+Yl9wX3JvKSB8fCBidWYtPmJfZmZuYW1lID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIGJ1Zl93cml0ZV9hbGwoYnVmLCBmb3JjZWl0KTsKK30KKworLyoKKyAqIGZsdXNoIGFsbCBidWZmZXJzLCBleGNlcHQgdGhlIG9uZXMgdGhhdCBhcmUgcmVhZG9ubHkKKyAqLworICAgIHZvaWQKK2F1dG93cml0ZV9hbGwoKQoreworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBpZiAoIShwX2F3IHx8IHBfYXdhKSB8fCAhcF93cml0ZSkKKwlyZXR1cm47CisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoYnVmSXNDaGFuZ2VkKGJ1ZikgJiYgIWJ1Zi0+Yl9wX3JvKQorCXsKKwkgICAgKHZvaWQpYnVmX3dyaXRlX2FsbChidWYsIEZBTFNFKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgLyogYW4gYXV0b2NvbW1hbmQgbWF5IGhhdmUgZGVsZXRlZCB0aGUgYnVmZmVyICovCisJICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikpCisJCWJ1ZiA9IGZpcnN0YnVmOworI2VuZGlmCisJfQorfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgYnVmZmVyIHdhcyBjaGFuZ2VkIGFuZCBjYW5ub3QgYmUgYWJhbmRvbmVkLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK2NoZWNrX2NoYW5nZWQoYnVmLCBjaGVja2F3LCBtdWx0X3dpbiwgZm9yY2VpdCwgYWxsYnVmKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQljaGVja2F3OwkvKiBkbyBhdXRvd3JpdGUgaWYgYnVmZmVyIHdhcyBjaGFuZ2VkICovCisgICAgaW50CQltdWx0X3dpbjsJLyogY2hlY2sgYWxzbyB3aGVuIHNldmVyYWwgd2lucyBmb3IgdGhlIGJ1ZiAqLworICAgIGludAkJZm9yY2VpdDsKKyAgICBpbnQJCWFsbGJ1ZjsJCS8qIG1heSB3cml0ZSBhbGwgYnVmZmVycyAqLworeworICAgIGlmICggICAgICAgIWZvcmNlaXQKKwkgICAgJiYgYnVmSXNDaGFuZ2VkKGJ1ZikKKwkgICAgJiYgKG11bHRfd2luIHx8IGJ1Zi0+Yl9ud2luZG93cyA8PSAxKQorCSAgICAmJiAoIWNoZWNrYXcgfHwgYXV0b3dyaXRlKGJ1ZiwgZm9yY2VpdCkgPT0gRkFJTCkpCisgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwlpZiAoKHBfY29uZmlybSB8fCBjbWRtb2QuY29uZmlybSkgJiYgcF93cml0ZSkKKwl7CisJICAgIGJ1Zl9UCSpidWYyOworCSAgICBpbnQJCWNvdW50ID0gMDsKKworCSAgICBpZiAoYWxsYnVmKQorCQlmb3IgKGJ1ZjIgPSBmaXJzdGJ1ZjsgYnVmMiAhPSBOVUxMOyBidWYyID0gYnVmMi0+Yl9uZXh0KQorCQkgICAgaWYgKGJ1ZklzQ2hhbmdlZChidWYyKQorCQkJCSAgICAgJiYgKGJ1ZjItPmJfZmZuYW1lICE9IE5VTEwKKyMgaWZkZWYgRkVBVF9CUk9XU0UKKwkJCQkJIHx8IGNtZG1vZC5icm93c2UKKyMgZW5kaWYKKwkJCQkJKSkKKwkJCSsrY291bnQ7CisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpZiAoIWJ1Zl92YWxpZChidWYpKQorCQkvKiBBdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciwgb29wcyEgIEl0J3Mgbm90IGNoYW5nZWQgbm93LiAqLworCQlyZXR1cm4gRkFMU0U7CisjIGVuZGlmCisJICAgIGRpYWxvZ19jaGFuZ2VkKGJ1ZiwgY291bnQgPiAxKTsKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIGlmICghYnVmX3ZhbGlkKGJ1ZikpCisJCS8qIEF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyLCBvb3BzISAgSXQncyBub3QgY2hhbmdlZCBub3cuICovCisJCXJldHVybiBGQUxTRTsKKyMgZW5kaWYKKwkgICAgcmV0dXJuIGJ1ZklzQ2hhbmdlZChidWYpOworCX0KKyNlbmRpZgorCUVNU0coXyhlX25vd3J0bXNnKSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykgfHwgZGVmaW5lZChQUk9UTykKKworI2lmIGRlZmluZWQoRkVBVF9CUk9XU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogV2hlbiB3YW50aW5nIHRvIHdyaXRlIGEgZmlsZSB3aXRob3V0IGEgZmlsZSBuYW1lLCBhc2sgdGhlIHVzZXIgZm9yIGEgbmFtZS4KKyAqLworICAgIHZvaWQKK2Jyb3dzZV9zYXZlX2ZuYW1lKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIGlmIChidWYtPmJfZm5hbWUgPT0gTlVMTCkKKyAgICB7CisJY2hhcl91ICpmbmFtZTsKKworCWZuYW1lID0gZG9fYnJvd3NlKFRSVUUsIChjaGFyX3UgKilfKCJTYXZlIEFzIiksIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCQkJCSAgIE5VTEwsIGJ1Zik7CisJaWYgKGZuYW1lICE9IE5VTEwpCisJeworCSAgICBpZiAoc2V0Zm5hbWUoYnVmLCBmbmFtZSwgTlVMTCwgVFJVRSkgPT0gT0spCisJCWJ1Zi0+Yl9mbGFncyB8PSBCRl9OT1RFRElURUQ7CisJICAgIHZpbV9mcmVlKGZuYW1lKTsKKwl9CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBBc2sgdGhlIHVzZXIgd2hhdCB0byBkbyB3aGVuIGFib25kb25pbmcgYSBjaGFuZ2VkIGJ1ZmZlci4KKyAqIE11c3QgY2hlY2sgJ3dyaXRlJyBvcHRpb24gZmlyc3QhCisgKi8KKyAgICB2b2lkCitkaWFsb2dfY2hhbmdlZChidWYsIGNoZWNrYWxsKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQljaGVja2FsbDsJLyogbWF5IGFiYW5kb24gYWxsIGNoYW5nZWQgYnVmZmVycyAqLworeworICAgIGNoYXJfdQlidWZmW0lPU0laRV07CisgICAgaW50CQlyZXQ7CisgICAgYnVmX1QJKmJ1ZjI7CisKKyAgICBkaWFsb2dfbXNnKGJ1ZmYsIF8oIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iKSwKKwkJCShidWYtPmJfZm5hbWUgIT0gTlVMTCkgPworCQkJYnVmLT5iX2ZuYW1lIDogKGNoYXJfdSAqKV8oIlVudGl0bGVkIikpOworICAgIGlmIChjaGVja2FsbCkKKwlyZXQgPSB2aW1fZGlhbG9nX3llc25vYWxsY2FuY2VsKFZJTV9RVUVTVElPTiwgTlVMTCwgYnVmZiwgMSk7CisgICAgZWxzZQorCXJldCA9IHZpbV9kaWFsb2dfeWVzbm9jYW5jZWwoVklNX1FVRVNUSU9OLCBOVUxMLCBidWZmLCAxKTsKKworICAgIGlmIChyZXQgPT0gVklNX1lFUykKKyAgICB7CisjaWZkZWYgRkVBVF9CUk9XU0UKKwkvKiBNYXkgZ2V0IGZpbGUgbmFtZSwgd2hlbiB0aGVyZSBpcyBub25lICovCisJYnJvd3NlX3NhdmVfZm5hbWUoYnVmKTsKKyNlbmRpZgorCWlmIChidWYtPmJfZm5hbWUgIT0gTlVMTCkgICAvKiBkaWRuJ3QgaGl0IENhbmNlbCAqLworCSAgICAodm9pZClidWZfd3JpdGVfYWxsKGJ1ZiwgRkFMU0UpOworICAgIH0KKyAgICBlbHNlIGlmIChyZXQgPT0gVklNX05PKQorICAgIHsKKwl1bmNoYW5nZWQoYnVmLCBUUlVFKTsKKyAgICB9CisgICAgZWxzZSBpZiAocmV0ID09IFZJTV9BTEwpCisgICAgeworCS8qCisJICogV3JpdGUgYWxsIG1vZGlmaWVkIGZpbGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4uCisJICogU2tpcCByZWFkb25seSBidWZmZXJzLCB0aGVzZSBuZWVkIHRvIGJlIGNvbmZpcm1lZAorCSAqIGluZGl2aWR1YWxseS4KKwkgKi8KKwlmb3IgKGJ1ZjIgPSBmaXJzdGJ1ZjsgYnVmMiAhPSBOVUxMOyBidWYyID0gYnVmMi0+Yl9uZXh0KQorCXsKKwkgICAgaWYgKGJ1ZklzQ2hhbmdlZChidWYyKQorCQkgICAgJiYgKGJ1ZjItPmJfZmZuYW1lICE9IE5VTEwKKyNpZmRlZiBGRUFUX0JST1dTRQorCQkJfHwgY21kbW9kLmJyb3dzZQorI2VuZGlmCisJCQkpCisJCSAgICAmJiAhYnVmMi0+Yl9wX3JvKQorCSAgICB7CisjaWZkZWYgRkVBVF9CUk9XU0UKKwkJLyogTWF5IGdldCBmaWxlIG5hbWUsIHdoZW4gdGhlcmUgaXMgbm9uZSAqLworCQlicm93c2Vfc2F2ZV9mbmFtZShidWYyKTsKKyNlbmRpZgorCQlpZiAoYnVmMi0+Yl9mbmFtZSAhPSBOVUxMKSAgIC8qIGRpZG4ndCBoaXQgQ2FuY2VsICovCisJCSAgICAodm9pZClidWZfd3JpdGVfYWxsKGJ1ZjIsIEZBTFNFKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJLyogYW4gYXV0b2NvbW1hbmQgbWF5IGhhdmUgZGVsZXRlZCB0aGUgYnVmZmVyICovCisJCWlmICghYnVmX3ZhbGlkKGJ1ZjIpKQorCQkgICAgYnVmMiA9IGZpcnN0YnVmOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UgaWYgKHJldCA9PSBWSU1fRElTQ0FSREFMTCkKKyAgICB7CisJLyoKKwkgKiBtYXJrIGFsbCBidWZmZXJzIGFzIHVuY2hhbmdlZAorCSAqLworCWZvciAoYnVmMiA9IGZpcnN0YnVmOyBidWYyICE9IE5VTEw7IGJ1ZjIgPSBidWYyLT5iX25leHQpCisJICAgIHVuY2hhbmdlZChidWYyLCBUUlVFKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBidWZmZXIgImJ1ZiIgY2FuIGJlIGFiYW5kb25lZCwgZWl0aGVyIGJ5IG1ha2luZyBpdAorICogaGlkZGVuLCBhdXRvd3JpdGluZyBpdCBvciB1bmxvYWRpbmcgaXQuCisgKi8KKyAgICBpbnQKK2Nhbl9hYmFuZG9uKGJ1ZiwgZm9yY2VpdCkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZm9yY2VpdDsKK3sKKyAgICByZXR1cm4gKAkgICBQX0hJRChidWYpCisJCXx8ICFidWZJc0NoYW5nZWQoYnVmKQorCQl8fCBidWYtPmJfbndpbmRvd3MgPiAxCisJCXx8IGF1dG93cml0ZShidWYsIGZvcmNlaXQpID09IE9LCisJCXx8IGZvcmNlaXQpOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgYW55IGJ1ZmZlciB3YXMgY2hhbmdlZCBhbmQgY2Fubm90IGJlIGFiYW5kb25lZC4KKyAqIFRoYXQgY2hhbmdlZCBidWZmZXIgYmVjb21lcyB0aGUgY3VycmVudCBidWZmZXIuCisgKi8KKyAgICBpbnQKK2NoZWNrX2NoYW5nZWRfYW55KGhpZGRlbikKKyAgICBpbnQJCWhpZGRlbjsJCS8qIE9ubHkgY2hlY2sgaGlkZGVuIGJ1ZmZlcnMgKi8KK3sKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJc2F2ZTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3A7CisjZW5kaWYKKworICAgIGZvciAoOzspCisgICAgeworCS8qIGNoZWNrIGN1cmJ1ZiBmaXJzdDogaWYgaXQgd2FzIGNoYW5nZWQgd2UgY2FuJ3QgYWJhbmRvbiBpdCAqLworCWlmICghaGlkZGVuICYmIGN1cmJ1ZklzQ2hhbmdlZCgpKQorCSAgICBidWYgPSBjdXJidWY7CisJZWxzZQorCXsKKwkgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCQlpZiAoKCFoaWRkZW4gfHwgYnVmLT5iX253aW5kb3dzID09IDApICYmIGJ1ZklzQ2hhbmdlZChidWYpKQorCQkgICAgYnJlYWs7CisJfQorCWlmIChidWYgPT0gTlVMTCkgICAgLyogTm8gYnVmZmVycyBjaGFuZ2VkICovCisJICAgIHJldHVybiBGQUxTRTsKKworCWlmIChjaGVja19jaGFuZ2VkKGJ1ZiwgcF9hd2EsIFRSVUUsIEZBTFNFLCBUUlVFKSAmJiBidWZfdmFsaWQoYnVmKSkKKwkgICAgYnJlYWs7CSAgICAvKiBkaWRuJ3Qgc2F2ZSAtIHN0aWxsIGNoYW5nZXMgKi8KKyAgICB9CisKKyAgICBleGl0aW5nID0gRkFMU0U7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorICAgIC8qCisgICAgICogV2hlbiAiOmNvbmZpcm0iIHVzZWQsIGRvbid0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBpZiAoIShwX2NvbmZpcm0gfHwgY21kbW9kLmNvbmZpcm0pKQorI2VuZGlmCisgICAgeworCS8qIFRoZXJlIG11c3QgYmUgYSB3YWl0X3JldHVybiBmb3IgdGhpcyBtZXNzYWdlLCBkb19idWZmZXIoKQorCSAqIG1heSBjYXVzZSBhIHJlZHJhdy4gIEJ1dCB3YWl0X3JldHVybigpIGlzIGEgbm8tb3Agd2hlbiB2Z2V0YygpCisJICogaXMgYnVzeSAoUXVpdCB1c2VkIGZyb20gd2luZG93IG1lbnUpLCB0aGVuIG1ha2Ugc3VyZSB3ZSBkb24ndAorCSAqIGNhdXNlIGEgc2Nyb2xsIHVwLiAqLworCWlmICh2Z2V0Y19idXN5KQorCXsKKwkgICAgbXNnX3JvdyA9IGNtZGxpbmVfcm93OworCSAgICBtc2dfY29sID0gMDsKKwkgICAgbXNnX2RpZG91dCA9IEZBTFNFOworCX0KKwlpZiAoRU1TRzIoXygiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiKSwKKwkJICAgIGJ1Zl9zcG5hbWUoYnVmKSAhPSBOVUxMID8gKGNoYXJfdSAqKWJ1Zl9zcG5hbWUoYnVmKSA6CisJCSAgICBidWYtPmJfZm5hbWUpKQorCXsKKwkgICAgc2F2ZSA9IG5vX3dhaXRfcmV0dXJuOworCSAgICBub193YWl0X3JldHVybiA9IEZBTFNFOworCSAgICB3YWl0X3JldHVybihGQUxTRSk7CisJICAgIG5vX3dhaXRfcmV0dXJuID0gc2F2ZTsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgLyogVHJ5IHRvIGZpbmQgYSB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgYnVmZmVyLiAqLworICAgIGlmIChidWYgIT0gY3VyYnVmKQorCWZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCSAgICBpZiAod3AtPndfYnVmZmVyID09IGJ1ZikKKwkgICAgeworCQl3aW5fZ290byh3cCk7CisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCQkvKiBQYXJhbm9pYTogZGlkIGF1dG9jbXMgd2lwZSBvdXQgdGhlIGJ1ZmZlciB3aXRoIGNoYW5nZXM/ICovCisJCWlmICghYnVmX3ZhbGlkKGJ1ZikpCisJCSAgICByZXR1cm4gVFJVRTsKKyMgZW5kaWYKKwkJYnJlYWs7CisJICAgIH0KKyNlbmRpZgorCisgICAgLyogT3BlbiB0aGUgY2hhbmdlZCBidWZmZXIgaW4gdGhlIGN1cnJlbnQgd2luZG93LiAqLworICAgIGlmIChidWYgIT0gY3VyYnVmKQorCXNldF9jdXJidWYoYnVmLCBET0JVRl9HT1RPKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogcmV0dXJuIEZBSUwgaWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lLCBPSyBpZiB0aGVyZSBpcyBvbmUKKyAqIGdpdmUgZXJyb3IgbWVzc2FnZSBmb3IgRkFJTAorICovCisgICAgaW50CitjaGVja19mbmFtZSgpCit7CisgICAgaWYgKGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfbm9uYW1lKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGZsdXNoIHRoZSBjb250ZW50cyBvZiBhIGJ1ZmZlciwgdW5sZXNzIGl0IGhhcyBubyBmaWxlIG5hbWUKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2J1Zl93cml0ZV9hbGwoYnVmLCBmb3JjZWl0KQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmb3JjZWl0OworeworICAgIGludAkgICAgcmV0dmFsOworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGJ1Zl9UCSpvbGRfY3VyYnVmID0gY3VyYnVmOworI2VuZGlmCisKKyAgICByZXR2YWwgPSAoYnVmX3dyaXRlKGJ1ZiwgYnVmLT5iX2ZmbmFtZSwgYnVmLT5iX2ZuYW1lLAorCQkJCSAgIChsaW5lbnJfVCkxLCBidWYtPmJfbWwubWxfbGluZV9jb3VudCwgTlVMTCwKKwkJCQkJCSAgRkFMU0UsIGZvcmNlaXQsIFRSVUUsIEZBTFNFKSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgaWYgKGN1cmJ1ZiAhPSBvbGRfY3VyYnVmKQorCU1TRyhfKCJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiKSk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQ29kZSB0byBoYW5kbGUgdGhlIGFyZ3VtZW50IGxpc3QuCisgKi8KKworLyoKKyAqIElzb2xhdGUgb25lIGFyZ3VtZW50LCB0YWtpbmcgcXVvdGVzIGFuZCBiYWNrdGlja3MuCisgKiBDaGFuZ2VzIHRoZSBhcmd1bWVudCBpbi1wbGFjZSwgcHV0cyBhIE5VTCBhZnRlciBpdC4KKyAqIFF1b3RlcyBhcmUgcmVtb3ZlZCwgYmFja3RpY2tzIHJlbWFpbi4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGFyZ3VtZW50LgorICovCisgICAgY2hhcl91ICoKK2RvX29uZV9hcmcoc3RyKQorICAgIGNoYXJfdSAqc3RyOworeworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWlucXVvdGU7CisgICAgaW50CQlpbmJhY2t0aWNrOworCisgICAgaW5xdW90ZSA9IEZBTFNFOworICAgIGluYmFja3RpY2sgPSBGQUxTRTsKKyAgICBmb3IgKHAgPSBzdHI7ICpzdHI7ICsrc3RyKQorICAgIHsKKwkvKgorCSAqIGZvciBNU0RPUyBldC5hbC4gYSBiYWNrc2xhc2ggaXMgcGFydCBvZiBhIGZpbGUgbmFtZS4KKwkgKiBPbmx5IHNraXAgIiwgc3BhY2UgYW5kIHRhYi4KKwkgKi8KKwlpZiAocmVtX2JhY2tzbGFzaChzdHIpKQorCXsKKwkgICAgKnArKyA9ICpzdHIrKzsKKwkgICAgKnArKyA9ICpzdHI7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEFuIGl0ZW0gZW5kcyBhdCBhIHNwYWNlIG5vdCBpbiBxdW90ZXMgb3IgYmFja3RpY2tzICovCisJICAgIGlmICghaW5xdW90ZSAmJiAhaW5iYWNrdGljayAmJiB2aW1faXNzcGFjZSgqc3RyKSkKKwkJYnJlYWs7CisJICAgIGlmICghaW5xdW90ZSAmJiAqc3RyID09ICdgJykKKwkJaW5iYWNrdGljayBePSBUUlVFOworCSAgICBpZiAoIWluYmFja3RpY2sgJiYgKnN0ciA9PSAnIicpCisJCWlucXVvdGUgXj0gVFJVRTsKKwkgICAgZWxzZQorCQkqcCsrID0gKnN0cjsKKwl9CisgICAgfQorICAgIHN0ciA9IHNraXB3aGl0ZShzdHIpOworICAgICpwID0gTlVMOworCisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGludCBkb19hcmdsaXN0IF9fQVJHUygoY2hhcl91ICpzdHIsIGludCB3aGF0LCBpbnQgYWZ0ZXIpKTsKK3N0YXRpYyB2b2lkIGFsaXN0X2NoZWNrX2FyZ19pZHggX19BUkdTKCh2b2lkKSk7CisjaWZkZWYgRkVBVF9MSVNUQ01EUworc3RhdGljIGludCBhbGlzdF9hZGRfbGlzdCBfX0FSR1MoKGludCBjb3VudCwgY2hhcl91ICoqZmlsZXMsIGludCBhZnRlcikpOworI2VuZGlmCisjZGVmaW5lIEFMX1NFVAkxCisjZGVmaW5lIEFMX0FERAkyCisjZGVmaW5lIEFMX0RFTAkzCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlZGVmaW5lIHRoZSBhcmd1bWVudCBsaXN0LgorICovCisgICAgdm9pZAorc2V0X2FyZ2xpc3Qoc3RyKQorICAgIGNoYXJfdQkqc3RyOworeworICAgIGRvX2FyZ2xpc3Qoc3RyLCBBTF9TRVQsIDApOworfQorI2VuZGlmCisKKy8qCisgKiAid2hhdCIgPT0gQUxfU0VUOiBSZWRlZmluZSB0aGUgYXJndW1lbnQgbGlzdCB0byAnc3RyJy4KKyAqICJ3aGF0IiA9PSBBTF9BREQ6IGFkZCBmaWxlcyBpbiAnc3RyJyB0byB0aGUgYXJndW1lbnQgbGlzdCBhZnRlciAiYWZ0ZXIiLgorICogIndoYXQiID09IEFMX0RFTDogcmVtb3ZlIGZpbGVzIGluICdzdHInIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QuCisgKgorICogUmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGludAorZG9fYXJnbGlzdChzdHIsIHdoYXQsIGFmdGVyKQorICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJd2hhdDsKKyAgICBpbnQJCWFmdGVyOwkJLyogMCBtZWFucyBiZWZvcmUgZmlyc3Qgb25lICovCit7CisgICAgZ2FycmF5X1QJbmV3X2dhOworICAgIGludAkJZXhwX2NvdW50OworICAgIGNoYXJfdQkqKmV4cF9maWxlczsKKyAgICBpbnQJCWk7CisjaWZkZWYgRkVBVF9MSVNUQ01EUworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCW1hdGNoOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENvbGxlY3QgYWxsIGZpbGUgbmFtZSBhcmd1bWVudHMgaW4gIm5ld19nYSIuCisgICAgICovCisgICAgZ2FfaW5pdDIoJm5ld19nYSwgKGludClzaXplb2YoY2hhcl91ICopLCAyMCk7CisgICAgd2hpbGUgKCpzdHIpCisgICAgeworCWlmIChnYV9ncm93KCZuZXdfZ2EsIDEpID09IEZBSUwpCisJeworCSAgICBnYV9jbGVhcigmbmV3X2dhKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCSgoY2hhcl91ICoqKW5ld19nYS5nYV9kYXRhKVtuZXdfZ2EuZ2FfbGVuKytdID0gc3RyOworCS0tbmV3X2dhLmdhX3Jvb207CisKKwkvKiBJc29sYXRlIG9uZSBhcmd1bWVudCwgY2hhbmdlIGl0IGluLXBsYWNlLCBwdXQgYSBOVUwgYWZ0ZXIgaXQuICovCisJc3RyID0gZG9fb25lX2FyZyhzdHIpOworICAgIH0KKworI2lmZGVmIEZFQVRfTElTVENNRFMKKyAgICBpZiAod2hhdCA9PSBBTF9ERUwpCisgICAgeworCXJlZ21hdGNoX1QJcmVnbWF0Y2g7CisJaW50CQlkaWRvbmU7CisKKwkvKgorCSAqIERlbGV0ZSB0aGUgaXRlbXM6IHVzZSBlYWNoIGl0ZW0gYXMgYSByZWdleHAgYW5kIGZpbmQgYSBtYXRjaCBpbiB0aGUKKwkgKiBhcmd1bWVudCBsaXN0LgorCSAqLworI2lmZGVmIENBU0VfSU5TRU5TSVRJVkVfRklMRU5BTUUKKwlyZWdtYXRjaC5ybV9pYyA9IFRSVUU7CQkvKiBBbHdheXMgaWdub3JlIGNhc2UgKi8KKyNlbHNlCisJcmVnbWF0Y2gucm1faWMgPSBGQUxTRTsJCS8qIE5ldmVyIGlnbm9yZSBjYXNlICovCisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmV3X2dhLmdhX2xlbiAmJiAhZ290X2ludDsgKytpKQorCXsKKwkgICAgcCA9ICgoY2hhcl91ICoqKW5ld19nYS5nYV9kYXRhKVtpXTsKKwkgICAgcCA9IGZpbGVfcGF0X3RvX3JlZ19wYXQocCwgTlVMTCwgTlVMTCwgRkFMU0UpOworCSAgICBpZiAocCA9PSBOVUxMKQorCQlicmVhazsKKwkgICAgcmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKHAsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworCSAgICBpZiAocmVnbWF0Y2gucmVncHJvZyA9PSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHApOworCQlicmVhazsKKwkgICAgfQorCisJICAgIGRpZG9uZSA9IEZBTFNFOworCSAgICBmb3IgKG1hdGNoID0gMDsgbWF0Y2ggPCBBUkdDT1VOVDsgKyttYXRjaCkKKwkJaWYgKHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgYWxpc3RfbmFtZSgmQVJHTElTVFttYXRjaF0pLAorCQkJCQkJCQkgIChjb2xucl9UKTApKQorCQl7CisJCSAgICBkaWRvbmUgPSBUUlVFOworCQkgICAgdmltX2ZyZWUoQVJHTElTVFttYXRjaF0uYWVfZm5hbWUpOworCQkgICAgbWNoX21lbW1vdmUoQVJHTElTVCArIG1hdGNoLCBBUkdMSVNUICsgbWF0Y2ggKyAxLAorCQkJICAgIChBUkdDT1VOVCAtIG1hdGNoIC0gMSkgKiBzaXplb2YoYWVudHJ5X1QpKTsKKwkJICAgIC0tQUxJU1QoY3Vyd2luKS0+YWxfZ2EuZ2FfbGVuOworCQkgICAgKytBTElTVChjdXJ3aW4pLT5hbF9nYS5nYV9yb29tOworCQkgICAgaWYgKGN1cndpbi0+d19hcmdfaWR4ID4gbWF0Y2gpCisJCQktLWN1cndpbi0+d19hcmdfaWR4OworCQkgICAgLS1tYXRjaDsKKwkJfQorCisJICAgIHZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworCSAgICB2aW1fZnJlZShwKTsKKwkgICAgaWYgKCFkaWRvbmUpCisJCUVNU0cyKF8oZV9ub21hdGNoMiksICgoY2hhcl91ICoqKW5ld19nYS5nYV9kYXRhKVtpXSk7CisJfQorCWdhX2NsZWFyKCZuZXdfZ2EpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJaSA9IGV4cGFuZF93aWxkY2FyZHMobmV3X2dhLmdhX2xlbiwgKGNoYXJfdSAqKiluZXdfZ2EuZ2FfZGF0YSwKKwkJJmV4cF9jb3VudCwgJmV4cF9maWxlcywgRVdfRElSfEVXX0ZJTEV8RVdfQUREU0xBU0h8RVdfTk9URk9VTkQpOworCWdhX2NsZWFyKCZuZXdfZ2EpOworCWlmIChpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworCWlmIChleHBfY291bnQgPT0gMCkKKwl7CisJICAgIEVNU0coXyhlX25vbWF0Y2gpKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCisjaWZkZWYgRkVBVF9MSVNUQ01EUworCWlmICh3aGF0ID09IEFMX0FERCkKKwl7CisJICAgICh2b2lkKWFsaXN0X2FkZF9saXN0KGV4cF9jb3VudCwgZXhwX2ZpbGVzLCBhZnRlcik7CisJICAgIHZpbV9mcmVlKGV4cF9maWxlcyk7CisJfQorCWVsc2UgLyogd2hhdCA9PSBBTF9TRVQgKi8KKyNlbmRpZgorCSAgICBhbGlzdF9zZXQoQUxJU1QoY3Vyd2luKSwgZXhwX2NvdW50LCBleHBfZmlsZXMsIEZBTFNFKTsKKyAgICB9CisKKyAgICBhbGlzdF9jaGVja19hcmdfaWR4KCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGFyZ19pZHggZm9yIGVhY2ggb3RoZXIgd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKK2FsaXN0X2NoZWNrX2FyZ19pZHgoKQoreworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3aW47CisKKyAgICBmb3IgKHdpbiA9IGZpcnN0d2luOyB3aW4gIT0gTlVMTDsgd2luID0gd2luLT53X25leHQpCisJaWYgKHdpbi0+d19hbGlzdCA9PSBjdXJ3aW4tPndfYWxpc3QpCisJICAgIGNoZWNrX2FyZ19pZHgod2luKTsKKyNlbHNlCisgICAgY2hlY2tfYXJnX2lkeChjdXJ3aW4pOworI2VuZGlmCit9CisKKy8qCisgKiBDaGVjayBpZiB3aW5kb3cgIndpbiIgaXMgZWRpdGluZyB0aGUgd19hcmdfaWR4IGZpbGUgaW4gaXRzIGFyZ3VtZW50IGxpc3QuCisgKi8KKyAgICB2b2lkCitjaGVja19hcmdfaWR4KHdpbikKKyAgICB3aW5fVAkqd2luOworeworICAgIGlmIChXQVJHQ09VTlQod2luKSA+IDEKKwkgICAgJiYgKHdpbi0+d19hcmdfaWR4ID49IFdBUkdDT1VOVCh3aW4pCisJCXx8ICh3aW4tPndfYnVmZmVyLT5iX2ZudW0KKwkJCQkgICAgICAhPSBXQVJHTElTVCh3aW4pW3dpbi0+d19hcmdfaWR4XS5hZV9mbnVtCisJCSAgICAmJiAod2luLT53X2J1ZmZlci0+Yl9mZm5hbWUgPT0gTlVMTAorCQkJIHx8ICEoZnVsbHBhdGhjbXAoCisJCQkJIGFsaXN0X25hbWUoJldBUkdMSVNUKHdpbilbd2luLT53X2FyZ19pZHhdKSwKKwkJCQl3aW4tPndfYnVmZmVyLT5iX2ZmbmFtZSwgVFJVRSkgJiBGUENfU0FNRSkpKSkpCisgICAgeworCS8qIFdlIGFyZSBub3QgZWRpdGluZyB0aGUgY3VycmVudCBlbnRyeSBpbiB0aGUgYXJndW1lbnQgbGlzdC4KKwkgKiBTZXQgImFyZ19oYWRfbGFzdCIgaWYgd2UgYXJlIGVkaXRpbmcgdGhlIGxhc3Qgb25lLiAqLworCXdpbi0+d19hcmdfaWR4X2ludmFsaWQgPSBUUlVFOworCWlmICh3aW4tPndfYXJnX2lkeCAhPSBXQVJHQ09VTlQod2luKSAtIDEKKwkJJiYgYXJnX2hhZF9sYXN0ID09IEZBTFNFCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCSYmIEFMSVNUKHdpbikgPT0gJmdsb2JhbF9hbGlzdAorI2VuZGlmCisJCSYmIEdBUkdDT1VOVCA+IDAKKwkJJiYgd2luLT53X2FyZ19pZHggPCBHQVJHQ09VTlQKKwkJJiYgKHdpbi0+d19idWZmZXItPmJfZm51bSA9PSBHQVJHTElTVFtHQVJHQ09VTlQgLSAxXS5hZV9mbnVtCisJCSAgICB8fCAod2luLT53X2J1ZmZlci0+Yl9mZm5hbWUgIT0gTlVMTAorCQkJJiYgKGZ1bGxwYXRoY21wKGFsaXN0X25hbWUoJkdBUkdMSVNUW0dBUkdDT1VOVCAtIDFdKSwKKwkJCQl3aW4tPndfYnVmZmVyLT5iX2ZmbmFtZSwgVFJVRSkgJiBGUENfU0FNRSkpKSkKKwkgICAgYXJnX2hhZF9sYXN0ID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBXZSBhcmUgZWRpdGluZyB0aGUgY3VycmVudCBlbnRyeSBpbiB0aGUgYXJndW1lbnQgbGlzdC4KKwkgKiBTZXQgImFyZ19oYWRfbGFzdCIgaWYgaXQncyBhbHNvIHRoZSBsYXN0IG9uZSAqLworCXdpbi0+d19hcmdfaWR4X2ludmFsaWQgPSBGQUxTRTsKKwlpZiAod2luLT53X2FyZ19pZHggPT0gV0FSR0NPVU5UKHdpbikgLSAxCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCSYmIHdpbi0+d19hbGlzdCA9PSAmZ2xvYmFsX2FsaXN0CisjZW5kaWYKKwkJKQorCSAgICBhcmdfaGFkX2xhc3QgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqICI6YXJncyIsICI6YXJnc2xvY2FsIiBhbmQgIjphcmdzZ2xvYmFsIi4KKyAqLworICAgIHZvaWQKK2V4X2FyZ3MoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoZWFwLT5jbWRpZHggIT0gQ01EX2FyZ3MpCisgICAgeworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfTElTVENNRFMpCisJYWxpc3RfdW5saW5rKEFMSVNUKGN1cndpbikpOworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfYXJnZ2xvYmFsKQorCSAgICBBTElTVChjdXJ3aW4pID0gJmdsb2JhbF9hbGlzdDsKKwllbHNlIC8qIGVhcC0+Y21kaWR4ID09IENNRF9hcmdsb2NhbCAqLworCSAgICBhbGlzdF9uZXcoKTsKKyNlbHNlCisJZXhfbmkoZWFwKTsKKwlyZXR1cm47CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIWVuZHNfZXhjbWQoKmVhcC0+YXJnKSkKKyAgICB7CisJLyoKKwkgKiAiOmFyZ3MgZmlsZSAuLiI6IGRlZmluZSBuZXcgYXJndW1lbnQgbGlzdCwgaGFuZGxlIGxpa2UgIjpuZXh0IgorCSAqIEFsc28gZm9yICI6YXJnc2xvY2FsIGZpbGUgLi4iIGFuZCAiOmFyZ3NnbG9iYWwgZmlsZSAuLiIuCisJICovCisJZXhfbmV4dChlYXApOworICAgIH0KKyAgICBlbHNlCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9MSVNUQ01EUykKKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2FyZ3MpCisjZW5kaWYKKyAgICB7CisJLyoKKwkgKiAiOmFyZ3MiOiBsaXN0IGFyZ3VtZW50cy4KKwkgKi8KKwlpZiAoQVJHQ09VTlQgPiAwKQorCXsKKwkgICAgLyogT3ZlcndyaXRlIHRoZSBjb21tYW5kLCBmb3IgYSBzaG9ydCBsaXN0IHRoZXJlIGlzIG5vIHNjcm9sbGluZworCSAgICAgKiByZXF1aXJlZCBhbmQgbm8gd2FpdF9yZXR1cm4oKS4gKi8KKwkgICAgZ290b2NtZGxpbmUoVFJVRSk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBBUkdDT1VOVDsgKytpKQorCSAgICB7CisJCWlmIChpID09IGN1cndpbi0+d19hcmdfaWR4KQorCQkgICAgbXNnX3B1dGNoYXIoJ1snKTsKKwkJbXNnX291dHRyYW5zKGFsaXN0X25hbWUoJkFSR0xJU1RbaV0pKTsKKwkJaWYgKGkgPT0gY3Vyd2luLT53X2FyZ19pZHgpCisJCSAgICBtc2dfcHV0Y2hhcignXScpOworCQltc2dfcHV0Y2hhcignICcpOworCSAgICB9CisJfQorICAgIH0KKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX0xJU1RDTURTKQorICAgIGVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9hcmdsb2NhbCkKKyAgICB7CisJZ2FycmF5X1QJKmdhcCA9ICZjdXJ3aW4tPndfYWxpc3QtPmFsX2dhOworCisJLyoKKwkgKiAiOmFyZ3Nsb2NhbCI6IG1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBnbG9iYWwgYXJndW1lbnQgbGlzdC4KKwkgKi8KKwlpZiAoZ2FfZ3JvdyhnYXAsIEdBUkdDT1VOVCkgPT0gT0spCisJICAgIGZvciAoaSA9IDA7IGkgPCBHQVJHQ09VTlQ7ICsraSkKKwkJaWYgKEdBUkdMSVNUW2ldLmFlX2ZuYW1lICE9IE5VTEwpCisJCXsKKwkJICAgIEFBUkdMSVNUKGN1cndpbi0+d19hbGlzdClbZ2FwLT5nYV9sZW5dLmFlX2ZuYW1lID0KKwkJCQkJICAgIHZpbV9zdHJzYXZlKEdBUkdMSVNUW2ldLmFlX2ZuYW1lKTsKKwkJICAgIEFBUkdMSVNUKGN1cndpbi0+d19hbGlzdClbZ2FwLT5nYV9sZW5dLmFlX2ZudW0gPQorCQkJCQkJCSAgR0FSR0xJU1RbaV0uYWVfZm51bTsKKwkJICAgICsrZ2FwLT5nYV9sZW47CisJCSAgICAtLWdhcC0+Z2Ffcm9vbTsKKwkJfQorICAgIH0KKyNlbmRpZgorfQorCisvKgorICogIjpwcmV2aW91cyIsICI6c3ByZXZpb3VzIiwgIjpOZXh0IiBhbmQgIjpzTmV4dCIuCisgKi8KKyAgICB2b2lkCitleF9wcmV2aW91cyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIC8qIElmIHBhc3QgdGhlIGxhc3Qgb25lIGFscmVhZHksIGdvIHRvIHRoZSBsYXN0IG9uZS4gKi8KKyAgICBpZiAoY3Vyd2luLT53X2FyZ19pZHggLSAoaW50KWVhcC0+bGluZTIgPj0gQVJHQ09VTlQpCisJZG9fYXJnZmlsZShlYXAsIEFSR0NPVU5UIC0gMSk7CisgICAgZWxzZQorCWRvX2FyZ2ZpbGUoZWFwLCBjdXJ3aW4tPndfYXJnX2lkeCAtIChpbnQpZWFwLT5saW5lMik7Cit9CisKKy8qCisgKiAiOnJld2luZCIsICI6Zmlyc3QiLCAiOnNmaXJzdCIgYW5kICI6c3Jld2luZCIuCisgKi8KKyAgICB2b2lkCitleF9yZXdpbmQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBkb19hcmdmaWxlKGVhcCwgMCk7Cit9CisKKy8qCisgKiAiOmxhc3QiIGFuZCAiOnNsYXN0Ii4KKyAqLworICAgIHZvaWQKK2V4X2xhc3QoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBkb19hcmdmaWxlKGVhcCwgQVJHQ09VTlQgLSAxKTsKK30KKworLyoKKyAqICI6YXJndW1lbnQiIGFuZCAiOnNhcmd1bWVudCIuCisgKi8KKyAgICB2b2lkCitleF9hcmd1bWVudChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaTsKKworICAgIGlmIChlYXAtPmFkZHJfY291bnQgPiAwKQorCWkgPSBlYXAtPmxpbmUyIC0gMTsKKyAgICBlbHNlCisJaSA9IGN1cndpbi0+d19hcmdfaWR4OworICAgIGRvX2FyZ2ZpbGUoZWFwLCBpKTsKK30KKworLyoKKyAqIEVkaXQgZmlsZSAiYXJnbiIgb2YgdGhlIGFyZ3VtZW50IGxpc3RzLgorICovCisgICAgdm9pZAorZG9fYXJnZmlsZShlYXAsIGFyZ24pCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJYXJnbjsKK3sKKyAgICBpbnQJCW90aGVyOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChhcmduIDwgMCB8fCBhcmduID49IEFSR0NPVU5UKQorICAgIHsKKwlpZiAoQVJHQ09VTlQgPD0gMSkKKwkgICAgRU1TRyhfKCJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiKSk7CisJZWxzZSBpZiAoYXJnbiA8IDApCisJICAgIEVNU0coXygiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIikpOworCWVsc2UKKwkgICAgRU1TRyhfKCJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzZXRwY21hcmsoKTsKKyNpZmRlZiBGRUFUX0dVSQorCW5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfV0lORE9XUworCWlmICgqZWFwLT5jbWQgPT0gJ3MnKQkgICAgLyogc3BsaXQgd2luZG93IGZpcnN0ICovCisJeworCSAgICBpZiAod2luX3NwbGl0KDAsIDApID09IEZBSUwpCisJCXJldHVybjsKKyMgaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJICAgIGN1cndpbi0+d19wX3NjYiA9IEZBTFNFOworIyBlbmRpZgorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIGlmICdoaWRkZW4nIHNldCwgb25seSBjaGVjayBmb3IgY2hhbmdlZCBmaWxlIHdoZW4gcmUtZWRpdGluZworCSAgICAgKiB0aGUgc2FtZSBidWZmZXIKKwkgICAgICovCisJICAgIG90aGVyID0gVFJVRTsKKwkgICAgaWYgKFBfSElEKGN1cmJ1ZikpCisJICAgIHsKKwkJcCA9IGZpeF9mbmFtZShhbGlzdF9uYW1lKCZBUkdMSVNUW2FyZ25dKSk7CisJCW90aGVyID0gb3RoZXJmaWxlKHApOworCQl2aW1fZnJlZShwKTsKKwkgICAgfQorCSAgICBpZiAoKCFQX0hJRChjdXJidWYpIHx8ICFvdGhlcikKKwkJICAmJiBjaGVja19jaGFuZ2VkKGN1cmJ1ZiwgVFJVRSwgIW90aGVyLCBlYXAtPmZvcmNlaXQsIEZBTFNFKSkKKwkJcmV0dXJuOworCX0KKworCWN1cndpbi0+d19hcmdfaWR4ID0gYXJnbjsKKwlpZiAoYXJnbiA9PSBBUkdDT1VOVCAtIDEKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJJiYgY3Vyd2luLT53X2FsaXN0ID09ICZnbG9iYWxfYWxpc3QKKyNlbmRpZgorCSAgICkKKwkgICAgYXJnX2hhZF9sYXN0ID0gVFJVRTsKKworCS8qIEVkaXQgdGhlIGZpbGU7IGFsd2F5cyB1c2UgdGhlIGxhc3Qga25vd24gbGluZSBudW1iZXIuICovCisJKHZvaWQpZG9fZWNtZCgwLCBhbGlzdF9uYW1lKCZBUkdMSVNUW2N1cndpbi0+d19hcmdfaWR4XSksIE5VTEwsCisJCSAgICAgIGVhcCwgRUNNRF9MQVNULAorCQkgICAgICAoUF9ISUQoY3Vyd2luLT53X2J1ZmZlcikgPyBFQ01EX0hJREUgOiAwKSArCisJCQkJCSAgIChlYXAtPmZvcmNlaXQgPyBFQ01EX0ZPUkNFSVQgOiAwKSk7CisKKwkvKiBsaWtlIFZpOiBzZXQgdGhlIG1hcmsgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgZmlsZS4gKi8KKwlpZiAoZWFwLT5jbWRpZHggIT0gQ01EX2FyZ2RvKQorCSAgICBzZXRtYXJrKCdcJycpOworICAgIH0KK30KKworLyoKKyAqICI6bmV4dCIsIGFuZCBjb21tYW5kcyB0aGF0IGJlaGF2ZSBsaWtlIGl0LgorICovCisgICAgdm9pZAorZXhfbmV4dChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaTsKKworICAgIC8qCisgICAgICogY2hlY2sgZm9yIGNoYW5nZWQgYnVmZmVyIG5vdywgaWYgdGhpcyBmYWlscyB0aGUgYXJndW1lbnQgbGlzdCBpcyBub3QKKyAgICAgKiByZWRlZmluZWQuCisgICAgICovCisgICAgaWYgKCAgICAgICBQX0hJRChjdXJidWYpCisJICAgIHx8IGVhcC0+Y21kaWR4ID09IENNRF9zbmV4dAorCSAgICB8fCAhY2hlY2tfY2hhbmdlZChjdXJidWYsIFRSVUUsIEZBTFNFLCBlYXAtPmZvcmNlaXQsIEZBTFNFKSkKKyAgICB7CisJaWYgKCplYXAtPmFyZyAhPSBOVUwpCQkgICAgLyogcmVkZWZpbmUgZmlsZSBsaXN0ICovCisJeworCSAgICBpZiAoZG9fYXJnbGlzdChlYXAtPmFyZywgQUxfU0VULCAwKSA9PSBGQUlMKQorCQlyZXR1cm47CisJICAgIGkgPSAwOworCX0KKwllbHNlCisJICAgIGkgPSBjdXJ3aW4tPndfYXJnX2lkeCArIChpbnQpZWFwLT5saW5lMjsKKwlkb19hcmdmaWxlKGVhcCwgaSk7CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9MSVNUQ01EUworLyoKKyAqICI6YXJnZWRpdCIKKyAqLworICAgIHZvaWQKK2V4X2FyZ2VkaXQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWZudW07CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqczsKKworICAgIC8qIEFkZCB0aGUgYXJndW1lbnQgdG8gdGhlIGJ1ZmZlciBsaXN0IGFuZCBnZXQgdGhlIGJ1ZmZlciBudW1iZXIuICovCisgICAgZm51bSA9IGJ1Zmxpc3RfYWRkKGVhcC0+YXJnLCBCTE5fTElTVEVEKTsKKworICAgIC8qIENoZWNrIGlmIHRoaXMgYXJndW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgYXJndW1lbnQgbGlzdC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJHQ09VTlQ7ICsraSkKKwlpZiAoQVJHTElTVFtpXS5hZV9mbnVtID09IGZudW0pCisJICAgIGJyZWFrOworICAgIGlmIChpID09IEFSR0NPVU5UKQorICAgIHsKKwkvKiBDYW4ndCBmaW5kIGl0LCBhZGQgaXQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICovCisJcyA9IHZpbV9zdHJzYXZlKGVhcC0+YXJnKTsKKwlpZiAocyA9PSBOVUxMKQorCSAgICByZXR1cm47CisJaSA9IGFsaXN0X2FkZF9saXN0KDEsICZzLAorCSAgICAgICBlYXAtPmFkZHJfY291bnQgPiAwID8gKGludCllYXAtPmxpbmUyIDogY3Vyd2luLT53X2FyZ19pZHggKyAxKTsKKwlpZiAoaSA8IDApCisJICAgIHJldHVybjsKKwljdXJ3aW4tPndfYXJnX2lkeCA9IGk7CisgICAgfQorCisgICAgYWxpc3RfY2hlY2tfYXJnX2lkeCgpOworCisgICAgLyogRWRpdCB0aGUgYXJndW1lbnQuICovCisgICAgZG9fYXJnZmlsZShlYXAsIGkpOworfQorCisvKgorICogIjphcmdhZGQiCisgKi8KKyAgICB2b2lkCitleF9hcmdhZGQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBkb19hcmdsaXN0KGVhcC0+YXJnLCBBTF9BREQsCisJICAgICAgIGVhcC0+YWRkcl9jb3VudCA+IDAgPyAoaW50KWVhcC0+bGluZTIgOiBjdXJ3aW4tPndfYXJnX2lkeCArIDEpOworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBtYWtldGl0bGUoKTsKKyNlbmRpZgorfQorCisvKgorICogIjphcmdkZWxldGUiCisgKi8KKyAgICB2b2lkCitleF9hcmdkZWxldGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQluOworCisgICAgaWYgKGVhcC0+YWRkcl9jb3VudCA+IDApCisgICAgeworCS8qICI6MSw0YXJnZGVsIjogRGVsZXRlIGFsbCBhcmd1bWVudHMgaW4gdGhlIHJhbmdlLiAqLworCWlmIChlYXAtPmxpbmUyID4gQVJHQ09VTlQpCisJICAgIGVhcC0+bGluZTIgPSBBUkdDT1VOVDsKKwluID0gZWFwLT5saW5lMiAtIGVhcC0+bGluZTEgKyAxOworCWlmICgqZWFwLT5hcmcgIT0gTlVMIHx8IG4gPD0gMCkKKwkgICAgRU1TRyhfKGVfaW52YXJnKSk7CisJZWxzZQorCXsKKwkgICAgZm9yIChpID0gZWFwLT5saW5lMTsgaSA8PSBlYXAtPmxpbmUyOyArK2kpCisJCXZpbV9mcmVlKEFSR0xJU1RbaSAtIDFdLmFlX2ZuYW1lKTsKKwkgICAgbWNoX21lbW1vdmUoQVJHTElTVCArIGVhcC0+bGluZTEgLSAxLCBBUkdMSVNUICsgZWFwLT5saW5lMiwKKwkJCShzaXplX3QpKChBUkdDT1VOVCAtIGVhcC0+bGluZTIpICogc2l6ZW9mKGFlbnRyeV9UKSkpOworCSAgICBBTElTVChjdXJ3aW4pLT5hbF9nYS5nYV9sZW4gLT0gbjsKKwkgICAgQUxJU1QoY3Vyd2luKS0+YWxfZ2EuZ2Ffcm9vbSArPSBuOworCSAgICBpZiAoY3Vyd2luLT53X2FyZ19pZHggPj0gZWFwLT5saW5lMikKKwkJY3Vyd2luLT53X2FyZ19pZHggLT0gbjsKKwkgICAgZWxzZSBpZiAoY3Vyd2luLT53X2FyZ19pZHggPiBlYXAtPmxpbmUxKQorCQljdXJ3aW4tPndfYXJnX2lkeCA9IGVhcC0+bGluZTE7CisJfQorICAgIH0KKyAgICBlbHNlIGlmICgqZWFwLT5hcmcgPT0gTlVMKQorCUVNU0coXyhlX2FyZ3JlcSkpOworICAgIGVsc2UKKwlkb19hcmdsaXN0KGVhcC0+YXJnLCBBTF9ERUwsIDApOworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBtYWtldGl0bGUoKTsKKyNlbmRpZgorfQorCisvKgorICogIjphcmdkbyIsICI6d2luZG8iLCAiOmJ1ZmRvIgorICovCisgICAgdm9pZAorZXhfbGlzdGRvKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlpOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3aW47CisjZW5kaWYKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJbmV4dF9mbnVtID0gMDsKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX1NZTl9ITCkKKyAgICBjaGFyX3UJKnNhdmVfZWkgPSBOVUxMOworICAgIGNoYXJfdQkqbmV3X2VpOworI2VuZGlmCisKKyNpZm5kZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF93aW5kbykKKyAgICB7CisJZXhfbmkoZWFwKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX1NZTl9ITCkKKyAgICBpZiAoZWFwLT5jbWRpZHggIT0gQ01EX3dpbmRvKQorICAgIHsKKwkvKiBBZGQgIlN5bnRheCIgdG8gJ2V2ZW50aWdub3JlJyB0byBza2lwIGxvYWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworCSAqIGZvciBldmVyeSBidWZmZXIgbG9hZGVkIGludG8gdGhlIHdpbmRvdy4gIEEgY29uc2lkZXJhYmxlIHNwZWVkCisJICogaW1wcm92ZW1lbnQuICovCisJc2F2ZV9laSA9IHZpbV9zdHJzYXZlKHBfZWkpOworCWlmIChzYXZlX2VpICE9IE5VTEwpCisJeworCSAgICBuZXdfZWkgPSB2aW1fc3RybnNhdmUocF9laSwgKGludClTVFJMRU4ocF9laSkgKyA4KTsKKwkgICAgaWYgKG5ld19laSAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNBVChuZXdfZWksICIsU3ludGF4Iik7CisJCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImVpIiwgLTEsIG5ld19laSwgT1BUX0ZSRUUpOworCQl2aW1fZnJlZShuZXdfZWkpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF93aW5kbworCSAgICB8fCBQX0hJRChjdXJidWYpCisJICAgIHx8ICFjaGVja19jaGFuZ2VkKGN1cmJ1ZiwgVFJVRSwgRkFMU0UsIGVhcC0+Zm9yY2VpdCwgRkFMU0UpKQorICAgIHsKKwkvKiBzdGFydCBhdCB0aGUgZmlyc3QgYXJndW1lbnQvd2luZG93L2J1ZmZlciAqLworCWkgPSAwOworI2lmZGVmIEZFQVRfV0lORE9XUworCXdpbiA9IGZpcnN0d2luOworI2VuZGlmCisJLyogc2V0IHBjbWFyayBub3cgKi8KKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2J1ZmRvKQorCSAgICBnb3RvX2J1ZmZlcihlYXAsIERPQlVGX0ZJUlNULCBGT1JXQVJELCAwKTsKKwllbHNlCisJICAgIHNldHBjbWFyaygpOworCWxpc3RjbWRfYnVzeSA9IFRSVUU7CSAgICAvKiBhdm9pZHMgc2V0dGluZyBwY21hcmsgYmVsb3cgKi8KKworCXdoaWxlICghZ290X2ludCkKKwl7CisJICAgIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfYXJnZG8pCisJICAgIHsKKwkJLyogZ28gdG8gYXJndW1lbnQgImkiICovCisJCWlmIChpID09IEFSR0NPVU5UKQorCQkgICAgYnJlYWs7CisJCS8qIERvbid0IGNhbGwgZG9fYXJnZmlsZSgpIHdoZW4gYWxyZWFkeSB0aGVyZSwgaXQgd2lsbCB0cnkKKwkJICogcmVsb2FkaW5nIHRoZSBmaWxlLiAqLworCQlpZiAoY3Vyd2luLT53X2FyZ19pZHggIT0gaSkKKwkJICAgIGRvX2FyZ2ZpbGUoZWFwLCBpKTsKKwkJaWYgKGN1cndpbi0+d19hcmdfaWR4ICE9IGkpCisJCSAgICBicmVhazsKKwkJKytpOworCSAgICB9CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIGVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF93aW5kbykKKwkgICAgeworCQkvKiBnbyB0byB3aW5kb3cgIndpbiIgKi8KKwkJaWYgKCF3aW5fdmFsaWQod2luKSkKKwkJICAgIGJyZWFrOworCQl3aW5fZ290byh3aW4pOworCQl3aW4gPSB3aW4tPndfbmV4dDsKKwkgICAgfQorI2VuZGlmCisJICAgIGVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9idWZkbykKKwkgICAgeworCQkvKiBSZW1lbWJlciB0aGUgbnVtYmVyIG9mIHRoZSBuZXh0IGxpc3RlZCBidWZmZXIsIGluIGNhc2UKKwkJICogIjpid2lwZSIgaXMgdXNlZCBvciBhdXRvY29tbWFuZHMgZG8gc29tZXRoaW5nIHN0cmFuZ2UuICovCisJCW5leHRfZm51bSA9IC0xOworCQlmb3IgKGJ1ZiA9IGN1cmJ1Zi0+Yl9uZXh0OyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJCSAgICBpZiAoYnVmLT5iX3BfYmwpCisJCSAgICB7CisJCQluZXh0X2ZudW0gPSBidWYtPmJfZm51bTsKKwkJCWJyZWFrOworCQkgICAgfQorCSAgICB9CisKKwkgICAgLyogZXhlY3V0ZSB0aGUgY29tbWFuZCAqLworCSAgICBkb19jbWRsaW5lKGVhcC0+YXJnLCBlYXAtPmdldGxpbmUsIGVhcC0+Y29va2llLAorCQkJCQkJRE9DTURfVkVSQk9TRSArIERPQ01EX05PV0FJVCk7CisKKwkgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9idWZkbykKKwkgICAgeworCQkvKiBEb25lPyAqLworCQlpZiAobmV4dF9mbnVtIDwgMCkKKwkJICAgIGJyZWFrOworCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIHN0aWxsIGV4aXN0cy4gKi8KKwkJZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCQkgICAgaWYgKGJ1Zi0+Yl9mbnVtID09IG5leHRfZm51bSkKKwkJCWJyZWFrOworCQlpZiAoYnVmID09IE5VTEwpCisJCSAgICBicmVhazsKKwkJZ290b19idWZmZXIoZWFwLCBET0JVRl9GSVJTVCwgRk9SV0FSRCwgbmV4dF9mbnVtKTsKKwkJLyogSWYgYXV0b2NvbW1hbmRzIHRvb2sgdXMgZWxzZXdoZXJlLCBxdWl0IGhlcmUgKi8KKwkJaWYgKGN1cmJ1Zi0+Yl9mbnVtICE9IG5leHRfZm51bSkKKwkJICAgIGJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF93aW5kbykKKwkgICAgeworCQl2YWxpZGF0ZV9jdXJzb3IoKTsJLyogY3Vyc29yIG1heSBoYXZlIG1vdmVkICovCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJCS8qIHJlcXVpcmVkIHdoZW4gJ3Njcm9sbGJpbmQnIGhhcyBiZWVuIHNldCAqLworCQlpZiAoY3Vyd2luLT53X3Bfc2NiKQorCQkgICAgZG9fY2hlY2tfc2Nyb2xsYmluZChUUlVFKTsKKyNlbmRpZgorCSAgICB9CisJfQorCWxpc3RjbWRfYnVzeSA9IEZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKSAmJiBkZWZpbmVkKEZFQVRfU1lOX0hMKQorICAgIGlmIChzYXZlX2VpICE9IE5VTEwpCisgICAgeworCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImVpIiwgLTEsIHNhdmVfZWksIE9QVF9GUkVFKTsKKwlhcHBseV9hdXRvY21kcyhFVkVOVF9TWU5UQVgsIGN1cmJ1Zi0+Yl9wX3N5biwKKwkJCQkJICAgICAgIGN1cmJ1Zi0+Yl9mbmFtZSwgVFJVRSwgY3VyYnVmKTsKKwl2aW1fZnJlZShzYXZlX2VpKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEFkZCBmaWxlc1tjb3VudF0gdG8gdGhlIGFyZ2xpc3Qgb2YgdGhlIGN1cnJlbnQgd2luZG93IGFmdGVyIGFyZyAiYWZ0ZXIiLgorICogVGhlIGZpbGUgbmFtZXMgaW4gZmlsZXNbY291bnRdIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgYXJlIHRha2VuIG92ZXIuCisgKiBGaWxlc1tdIGl0c2VsZiBpcyBub3QgdGFrZW4gb3Zlci4KKyAqIFJldHVybnMgaW5kZXggb2YgZmlyc3QgYWRkZWQgYXJndW1lbnQuICBSZXR1cm5zIC0xIHdoZW4gZmFpbGVkIChvdXQgb2YgbWVtKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2FsaXN0X2FkZF9saXN0KGNvdW50LCBmaWxlcywgYWZ0ZXIpCisgICAgaW50CQljb3VudDsKKyAgICBjaGFyX3UJKipmaWxlczsKKyAgICBpbnQJCWFmdGVyOwkgICAgLyogd2hlcmUgdG8gYWRkOiAwID0gYmVmb3JlIGZpcnN0IG9uZSAqLworeworICAgIGludAkJaTsKKworICAgIGlmIChnYV9ncm93KCZBTElTVChjdXJ3aW4pLT5hbF9nYSwgY291bnQpID09IE9LKQorICAgIHsKKwlpZiAoYWZ0ZXIgPCAwKQorCSAgICBhZnRlciA9IDA7CisJaWYgKGFmdGVyID4gQVJHQ09VTlQpCisJICAgIGFmdGVyID0gQVJHQ09VTlQ7CisJaWYgKGFmdGVyIDwgQVJHQ09VTlQpCisJICAgIG1jaF9tZW1tb3ZlKCYoQVJHTElTVFthZnRlciArIGNvdW50XSksICYoQVJHTElTVFthZnRlcl0pLAorCQkJCSAgICAgICAoQVJHQ09VTlQgLSBhZnRlcikgKiBzaXplb2YoYWVudHJ5X1QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwl7CisJICAgIEFSR0xJU1RbYWZ0ZXIgKyBpXS5hZV9mbmFtZSA9IGZpbGVzW2ldOworCSAgICBBUkdMSVNUW2FmdGVyICsgaV0uYWVfZm51bSA9IGJ1Zmxpc3RfYWRkKGZpbGVzW2ldLCBCTE5fTElTVEVEKTsKKwl9CisJQUxJU1QoY3Vyd2luKS0+YWxfZ2EuZ2FfbGVuICs9IGNvdW50OworCUFMSVNUKGN1cndpbiktPmFsX2dhLmdhX3Jvb20gLT0gY291bnQ7CisJaWYgKGN1cndpbi0+d19hcmdfaWR4ID49IGFmdGVyKQorCSAgICArK2N1cndpbi0+d19hcmdfaWR4OworCXJldHVybiBhZnRlcjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwl2aW1fZnJlZShmaWxlc1tpXSk7CisgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogRkVBVF9MSVNUQ01EUyAqLworCisjaWZkZWYgRkVBVF9FVkFMCisvKgorICogIjpjb21waWxlclshXSB7bmFtZX0iCisgKi8KKyAgICB2b2lkCitleF9jb21waWxlcihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYnVmOworICAgIGNoYXJfdQkqb2xkX2N1cl9jb21wID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoKmVhcC0+YXJnID09IE5VTCkKKyAgICB7CisJLyogTGlzdCBhbGwgY29tcGlsZXIgc2NyaXB0cy4gKi8KKwlkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopImVjaG8gZ2xvYnBhdGgoJnJ0cCwgJ2NvbXBpbGVyLyoudmltJykiKTsKKwkJCQkJLyogKSBrZWVwIHRoZSBpbmRlbnRlciBoYXBweS4uLiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworCWJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGVhcC0+YXJnKSArIDE0KSk7CisJaWYgKGJ1ZiAhPSBOVUxMKQorCXsKKwkgICAgaWYgKGVhcC0+Zm9yY2VpdCkKKwkgICAgeworCQkvKiAiOmNvbXBpbGVyISB7bmFtZX0iIHNldHMgZ2xvYmFsIG9wdGlvbnMgKi8KKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKQorCQkJCSAgICJjb21tYW5kIC1uYXJncz0qIENvbXBpbGVyU2V0IHNldCA8YXJncz4iKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogIjpjb21waWxlciEge25hbWV9IiBzZXRzIGxvY2FsIG9wdGlvbnMuCisJCSAqIFRvIHJlbWFpbiBiYWNrd2FyZHMgY29tcGF0aWJsZSAiY3VycmVudF9jb21waWxlciIgaXMgYWx3YXlzCisJCSAqIHVzZWQuICBBIHVzZXIncyBjb21waWxlciBwbHVnaW4gbWF5IHNldCBpdCwgdGhlIGRpc3RyaWJ1dGVkCisJCSAqIHBsdWdpbiB3aWxsIHRoZW4gc2tpcCB0aGUgc2V0dGluZ3MuICBBZnRlcndhcmRzIHNldAorCQkgKiAiYjpjdXJyZW50X2NvbXBpbGVyIiBhbmQgcmVzdG9yZSAiY3VycmVudF9jb21waWxlciIuICovCisJCW9sZF9jdXJfY29tcCA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJjdXJyZW50X2NvbXBpbGVyIik7CisJCWlmIChvbGRfY3VyX2NvbXAgIT0gTlVMTCkKKwkJICAgIG9sZF9jdXJfY29tcCA9IHZpbV9zdHJzYXZlKG9sZF9jdXJfY29tcCk7CisJCWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikKKwkJCSAgICAgICJjb21tYW5kIC1uYXJncz0qIENvbXBpbGVyU2V0IHNldGxvY2FsIDxhcmdzPiIpOworCSAgICB9CisJICAgIGRvX3VubGV0KChjaGFyX3UgKikiY3VycmVudF9jb21waWxlciIpOworCSAgICBkb191bmxldCgoY2hhcl91ICopImI6Y3VycmVudF9jb21waWxlciIpOworCisJICAgIHNwcmludGYoKGNoYXIgKilidWYsICJjb21waWxlci8lcy52aW0iLCBlYXAtPmFyZyk7CisJICAgIGlmIChjbWRfcnVudGltZShidWYsIFRSVUUpID09IEZBSUwpCisJCUVNU0cyKF8oIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIiksIGVhcC0+YXJnKTsKKwkgICAgdmltX2ZyZWUoYnVmKTsKKworCSAgICBkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopIjpkZWxjb21tYW5kIENvbXBpbGVyU2V0Iik7CisKKwkgICAgLyogU2V0ICJiOmN1cnJlbnRfY29tcGlsZXIiIGZyb20gImN1cnJlbnRfY29tcGlsZXIiLiAqLworCSAgICBwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImN1cnJlbnRfY29tcGlsZXIiKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkJc2V0X2ludGVybmFsX3N0cmluZ192YXIoKGNoYXJfdSAqKSJiOmN1cnJlbnRfY29tcGlsZXIiLCBwKTsKKworCSAgICAvKiBSZXN0b3JlICJjdXJyZW50X2NvbXBpbGVyIiBmb3IgIjpjb21waWxlciB7bmFtZX0iLiAqLworCSAgICBpZiAoIWVhcC0+Zm9yY2VpdCkKKwkgICAgeworCQlpZiAob2xkX2N1cl9jb21wICE9IE5VTEwpCisJCXsKKwkJICAgIHNldF9pbnRlcm5hbF9zdHJpbmdfdmFyKChjaGFyX3UgKikiY3VycmVudF9jb21waWxlciIsCisJCQkJCQkJCW9sZF9jdXJfY29tcCk7CisJCSAgICB2aW1fZnJlZShvbGRfY3VyX2NvbXApOworCQl9CisJCWVsc2UKKwkJICAgIGRvX3VubGV0KChjaGFyX3UgKikiY3VycmVudF9jb21waWxlciIpOworCSAgICB9CisJfQorICAgIH0KK30KKyNlbmRpZgorCisvKgorICogIjpydW50aW1lIHtuYW1lfSIKKyAqLworICAgIHZvaWQKK2V4X3J1bnRpbWUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjbWRfcnVudGltZShlYXAtPmFyZywgZWFwLT5mb3JjZWl0KTsKK30KKworc3RhdGljIHZvaWQgc291cmNlX2NhbGxiYWNrIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworCisgICAgc3RhdGljIHZvaWQKK3NvdXJjZV9jYWxsYmFjayhmbmFtZSkKKyAgICBjaGFyX3UJKmZuYW1lOworeworICAgICh2b2lkKWRvX3NvdXJjZShmbmFtZSwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIFNvdXJjZSB0aGUgZmlsZSAibmFtZSIgZnJvbSBhbGwgZGlyZWN0b3JpZXMgaW4gJ3J1bnRpbWVwYXRoJy4KKyAqICJuYW1lIiBjYW4gY29udGFpbiB3aWxkY2FyZHMuCisgKiBXaGVuICJhbGwiIGlzIFRSVUUsIHNvdXJjZSBhbGwgZmlsZXMsIG90aGVyd2lzZSBvbmx5IHRoZSBmaXJzdCBvbmUuCisgKiByZXR1cm4gRkFJTCB3aGVuIG5vIGZpbGUgY291bGQgYmUgc291cmNlZCwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitjbWRfcnVudGltZShuYW1lLCBhbGwpCisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJYWxsOworeworICAgIHJldHVybiBkb19pbl9ydW50aW1lcGF0aChuYW1lLCBhbGwsIHNvdXJjZV9jYWxsYmFjayk7Cit9CisKKy8qCisgKiBGaW5kICJuYW1lIiBpbiAncnVudGltZXBhdGgnLiAgV2hlbiBmb3VuZCwgY2FsbCB0aGUgImNhbGxiYWNrIiBmdW5jdGlvbiBmb3IKKyAqIGl0LgorICogV2hlbiAiYWxsIiBpcyBUUlVFIHJlcGVhdCBmb3IgYWxsIG1hdGNoZXMsIG90aGVyd2lzZSBvbmx5IHRoZSBmaXJzdCBvbmUgaXMKKyAqIHVzZWQuCisgKiBSZXR1cm5zIE9LIHdoZW4gYXQgbGVhc3Qgb25lIG1hdGNoIGZvdW5kLCBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZG9faW5fcnVudGltZXBhdGgobmFtZSwgYWxsLCBjYWxsYmFjaykKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlhbGw7CisgICAgdm9pZAkoKmNhbGxiYWNrKV9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworeworICAgIGNoYXJfdQkqcnRwOworICAgIGNoYXJfdQkqbnA7CisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpydHBfY29weTsKKyAgICBjaGFyX3UJKnRhaWw7CisgICAgaW50CQludW1fZmlsZXM7CisgICAgY2hhcl91CSoqZmlsZXM7CisgICAgaW50CQlpOworICAgIGludAkJZGlkX29uZSA9IEZBTFNFOworI2lmZGVmIEFNSUdBCisgICAgc3RydWN0IFByb2Nlc3MJKnByb2MgPSAoc3RydWN0IFByb2Nlc3MgKilGaW5kVGFzaygwTCk7CisgICAgQVBUUgkJc2F2ZV93aW5wdHIgPSBwcm9jLT5wcl9XaW5kb3dQdHI7CisKKyAgICAvKiBBdm9pZCBhIHJlcXVlc3RlciBoZXJlIGZvciBhIHZvbHVtZSB0aGF0IGRvZXNuJ3QgZXhpc3QuICovCisgICAgcHJvYy0+cHJfV2luZG93UHRyID0gKEFQVFIpLTFMOworI2VuZGlmCisKKyAgICAvKiBNYWtlIGEgY29weSBvZiAncnVudGltZXBhdGgnLiAgSW52b2tpbmcgdGhlIGNhbGxiYWNrIG1heSBjaGFuZ2UgdGhlCisgICAgICogdmFsdWUuICovCisgICAgcnRwX2NvcHkgPSB2aW1fc3Ryc2F2ZShwX3J0cCk7CisgICAgYnVmID0gYWxsb2MoTUFYUEFUSEwpOworICAgIGlmIChidWYgIT0gTlVMTCAmJiBydHBfY29weSAhPSBOVUxMKQorICAgIHsKKwlpZiAocF92ZXJib3NlID4gMSkKKwkgICAgc21zZygoY2hhcl91ICopXygiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIiksCisJCQkJCQkgKGNoYXIgKiluYW1lLCAoY2hhciAqKXBfcnRwKTsKKwkvKiBMb29wIG92ZXIgYWxsIGVudHJpZXMgaW4gJ3J1bnRpbWVwYXRoJy4gKi8KKwlydHAgPSBydHBfY29weTsKKwl3aGlsZSAoKnJ0cCAhPSBOVUwgJiYgKGFsbCB8fCAhZGlkX29uZSkpCisJeworCSAgICAvKiBDb3B5IHRoZSBwYXRoIGZyb20gJ3J1bnRpbWVwYXRoJyB0byBidWZbXS4gKi8KKwkgICAgY29weV9vcHRpb25fcGFydCgmcnRwLCBidWYsIE1BWFBBVEhMLCAiLCIpOworCSAgICBpZiAoU1RSTEVOKGJ1ZikgKyBTVFJMRU4obmFtZSkgKyAyIDwgTUFYUEFUSEwpCisJICAgIHsKKwkJYWRkX3BhdGhzZXAoYnVmKTsKKwkJdGFpbCA9IGJ1ZiArIFNUUkxFTihidWYpOworCisJCS8qIExvb3Agb3ZlciBhbGwgcGF0dGVybnMgaW4gIm5hbWUiICovCisJCW5wID0gbmFtZTsKKwkJd2hpbGUgKCpucCAhPSBOVUwgJiYgKGFsbCB8fCAhZGlkX29uZSkpCisJCXsKKwkJICAgIC8qIEFwcGVuZCB0aGUgcGF0dGVybiBmcm9tICJuYW1lIiB0byBidWZbXS4gKi8KKwkJICAgIGNvcHlfb3B0aW9uX3BhcnQoJm5wLCB0YWlsLCAoaW50KShNQVhQQVRITCAtICh0YWlsIC0gYnVmKSksCisJCQkJCQkJCSAgICAgICAiXHQgIik7CisKKwkJICAgIGlmIChwX3ZlcmJvc2UgPiAyKQorCQkJbXNnX3N0cigoY2hhcl91ICopXygiU2VhcmNoaW5nIGZvciBcIiVzXCIiKSwgYnVmKTsKKworCQkgICAgLyogRXhwYW5kIHdpbGRjYXJkcywgaW52b2tlIHRoZSBjYWxsYmFjayBmb3IgZWFjaCBtYXRjaC4gKi8KKwkJICAgIGlmIChnZW5fZXhwYW5kX3dpbGRjYXJkcygxLCAmYnVmLCAmbnVtX2ZpbGVzLCAmZmlsZXMsCisJCQkJCQkJICAgICAgIEVXX0ZJTEUpID09IE9LKQorCQkgICAgeworCQkJZm9yIChpID0gMDsgaSA8IG51bV9maWxlczsgKytpKQorCQkJeworCQkJICAgICgqY2FsbGJhY2spKGZpbGVzW2ldKTsKKwkJCSAgICBkaWRfb25lID0gVFJVRTsKKwkJCSAgICBpZiAoIWFsbCkKKwkJCQlicmVhazsKKwkJCX0KKwkJCUZyZWVXaWxkKG51bV9maWxlcywgZmlsZXMpOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIHZpbV9mcmVlKGJ1Zik7CisgICAgdmltX2ZyZWUocnRwX2NvcHkpOworICAgIGlmIChwX3ZlcmJvc2UgPiAwICYmICFkaWRfb25lKQorCW1zZ19zdHIoKGNoYXJfdSAqKV8oIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiKSwgbmFtZSk7CisKKyNpZmRlZiBBTUlHQQorICAgIHByb2MtPnByX1dpbmRvd1B0ciA9IHNhdmVfd2lucHRyOworI2VuZGlmCisKKyAgICByZXR1cm4gZGlkX29uZSA/IE9LIDogRkFJTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkKKy8qCisgKiAiOm9wdGlvbnMiCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X29wdGlvbnMoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjbWRfc291cmNlKChjaGFyX3UgKilTWVNfT1BUV0lOX0ZJTEUsIE5VTEwpOworfQorI2VuZGlmCisKKy8qCisgKiAiOnNvdXJjZSB7Zm5hbWV9IgorICovCisgICAgdm9pZAorZXhfc291cmNlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICBpZiAoY21kbW9kLmJyb3dzZSkKKyAgICB7CisJY2hhcl91ICpmbmFtZSA9IE5VTEw7CisKKwlmbmFtZSA9IGRvX2Jyb3dzZShGQUxTRSwgKGNoYXJfdSAqKV8oIlNvdXJjZSBWaW0gc2NyaXB0IiksIGVhcC0+YXJnLAorCQkJCSAgICAgIE5VTEwsIE5VTEwsIEJST1dTRV9GSUxURVJfTUFDUk9TLCBOVUxMKTsKKwlpZiAoZm5hbWUgIT0gTlVMTCkKKwl7CisJICAgIGNtZF9zb3VyY2UoZm5hbWUsIGVhcCk7CisJICAgIHZpbV9mcmVlKGZuYW1lKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWNtZF9zb3VyY2UoZWFwLT5hcmcsIGVhcCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY21kX3NvdXJjZShmbmFtZSwgZWFwKQorICAgIGNoYXJfdQkqZm5hbWU7CisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmICgqZm5hbWUgPT0gTlVMKQorCUVNU0coXyhlX2FyZ3JlcSkpOworCisgICAgLyogIjpzb3VyY2UhIiByZWFkIHZpIGNvbW1hbmRzICovCisgICAgZWxzZSBpZiAoZWFwICE9IE5VTEwgJiYgZWFwLT5mb3JjZWl0KQorCS8qIE5lZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZHMgZGlyZWN0bHkgd2hlbjoKKwkgKiAtICI6ZyIgY29tbWFuZCBidXN5CisJICogLSBhZnRlciAiOmFyZ2RvIiwgIjp3aW5kbyIgb3IgIjpidWZkbyIKKwkgKiAtIGFub3RoZXIgY29tbWFuZCBmb2xsb3dzCisJICogLSBpbnNpZGUgYSBsb29wCisJICovCisJb3BlbnNjcmlwdChmbmFtZSwgZ2xvYmFsX2J1c3kgfHwgbGlzdGNtZF9idXN5IHx8IGVhcC0+bmV4dGNtZCAhPSBOVUxMCisjaWZkZWYgRkVBVF9FVkFMCisJCQkJCQkgfHwgZWFwLT5jc3RhY2stPmNzX2lkeCA+PSAwCisjZW5kaWYKKwkJCQkJCSApOworCisgICAgLyogIjpzb3VyY2UiIHJlYWQgZXggY29tbWFuZHMgKi8KKyAgICBlbHNlIGlmIChkb19zb3VyY2UoZm5hbWUsIEZBTFNFLCBGQUxTRSkgPT0gRkFJTCkKKwlFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKK30KKworLyoKKyAqICI6c291cmNlIiBhbmQgYXNzb2NpYXRlZCBjb21tYW5kcy4KKyAqLworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm8gZm9yIGVhY2ggc291cmNlZCBmaWxlLgorICogSXQgaXMgc2hhcmVkIGJldHdlZW4gZG9fc291cmNlKCkgYW5kIGdldHNvdXJjZWxpbmUoKS4KKyAqIFRoaXMgaXMgcmVxdWlyZWQsIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgaGFuZGVkIHRvIGRvX2NtZGxpbmUoKSBhbmQKKyAqIHNvdXJjaW5nIGNhbiBiZSBkb25lIHJlY3Vyc2l2ZWx5LgorICovCitzdHJ1Y3Qgc291cmNlX2Nvb2tpZQoreworICAgIEZJTEUJKmZwOwkJLyogb3BlbmVkIGZpbGUgZm9yIHNvdXJjaW5nICovCisgICAgY2hhcl91ICAgICAgKm5leHRsaW5lOyAgICAgIC8qIGlmIG5vdCBOVUxMOiBsaW5lIHRoYXQgd2FzIHJlYWQgYWhlYWQgKi8KKyAgICBpbnQJCWZpbmlzaGVkOwkvKiAiOmZpbmlzaCIgdXNlZCAqLworI2lmIGRlZmluZWQgKFVTRV9DUk5MKSB8fCBkZWZpbmVkIChVU0VfQ1IpCisgICAgaW50CQlmaWxlZm9ybWF0OwkvKiBFT0xfVU5LTk9XTiwgRU9MX1VOSVggb3IgRU9MX0RPUyAqLworICAgIGludAkJZXJyb3I7CQkvKiBUUlVFIGlmIExGIGZvdW5kIGFmdGVyIENSLUxGICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBsaW5lbnJfVAlicmVha3BvaW50OwkvKiBuZXh0IGxpbmUgd2l0aCBicmVha3BvaW50IG9yIHplcm8gKi8KKyAgICBjaGFyX3UJKmZuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2VkIGZpbGUgKi8KKyAgICBpbnQJCWRiZ190aWNrOwkvKiBkZWJ1Z190aWNrIHdoZW4gYnJlYWtwb2ludCB3YXMgc2V0ICovCisgICAgaW50CQlsZXZlbDsJCS8qIHRvcCBuZXN0aW5nIGxldmVsIG9mIHNvdXJjZWQgZmlsZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbWNvbnZfVAljb252OwkJLyogdHlwZSBvZiBjb252ZXJzaW9uICovCisjZW5kaWYKK307CisKKyNpZmRlZiBGRUFUX0VWQUwKKy8qCisgKiBSZXR1cm4gdGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgbmV4dCBicmVha3BvaW50IGxpbmUgZm9yIGEgc291cmNlIGNvb2tpZS4KKyAqLworICAgIGxpbmVucl9UICoKK3NvdXJjZV9icmVha3BvaW50KGNvb2tpZSkKKyAgICB2b2lkICpjb29raWU7Cit7CisgICAgcmV0dXJuICYoKHN0cnVjdCBzb3VyY2VfY29va2llICopY29va2llKS0+YnJlYWtwb2ludDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYWRkcmVzcyBob2xkaW5nIHRoZSBkZWJ1ZyB0aWNrIGZvciBhIHNvdXJjZSBjb29raWUuCisgKi8KKyAgICBpbnQgKgorc291cmNlX2RiZ190aWNrKGNvb2tpZSkKKyAgICB2b2lkICpjb29raWU7Cit7CisgICAgcmV0dXJuICYoKHN0cnVjdCBzb3VyY2VfY29va2llICopY29va2llKS0+ZGJnX3RpY2s7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG5lc3RpbmcgbGV2ZWwgZm9yIGEgc291cmNlIGNvb2tpZS4KKyAqLworICAgIGludAorc291cmNlX2xldmVsKGNvb2tpZSkKKyAgICB2b2lkICpjb29raWU7Cit7CisgICAgcmV0dXJuICgoc3RydWN0IHNvdXJjZV9jb29raWUgKiljb29raWUpLT5sZXZlbDsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhcl91ICpnZXRfb25lX3NvdXJjZWxpbmUgX19BUkdTKChzdHJ1Y3Qgc291cmNlX2Nvb2tpZSAqc3ApKTsKKworI2lmZGVmIEZFQVRfRVZBTAorLyogR3Jvd2FycmF5IHRvIHN0b3JlIHRoZSBuYW1lcyBvZiBzb3VyY2VkIHNjcmlwdHMuCisgKiBGb3IgVW5peCBhbHNvIHN0b3JlIHRoZSBkZXYvaW5vLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3RhdCgpIGVhY2gKKyAqIHNjcmlwdCB3aGVuIGdvaW5nIHRocm91Z2ggdGhlIGxpc3QuICovCitzdHJ1Y3Qgc2NyaXB0c3R1ZmYKK3sKKyAgICBjaGFyX3UJKm5hbWU7CisjIGlmZGVmIFVOSVgKKyAgICBpbnQJCWRldjsKKyAgICBpbm9fdAlpbm87CisjIGVuZGlmCit9Oworc3RhdGljIGdhcnJheV9UIHNjcmlwdF9uYW1lcyA9IHswLCAwLCBzaXplb2Yoc3RydWN0IHNjcmlwdHN0dWZmKSwgNCwgTlVMTH07CisjZGVmaW5lIFNDUklQVF9OQU1FKGlkKSAoKChzdHJ1Y3Qgc2NyaXB0c3R1ZmYgKilzY3JpcHRfbmFtZXMuZ2FfZGF0YSlbKGlkKSAtIDFdLm5hbWUpCisjZGVmaW5lIFNDUklQVF9ERVYoaWQpICgoKHN0cnVjdCBzY3JpcHRzdHVmZiAqKXNjcmlwdF9uYW1lcy5nYV9kYXRhKVsoaWQpIC0gMV0uZGV2KQorI2RlZmluZSBTQ1JJUFRfSU5PKGlkKSAoKChzdHJ1Y3Qgc2NyaXB0c3R1ZmYgKilzY3JpcHRfbmFtZXMuZ2FfZGF0YSlbKGlkKSAtIDFdLmlubykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChGRUFUX0NTQ09QRSkKK3N0YXRpYyBGSUxFICpmb3Blbl9ub2luaF9yZWFkYmluIF9fQVJHUygoY2hhciAqZmlsZW5hbWUpKTsKKworLyoKKyAqIFNwZWNpYWwgZnVuY3Rpb24gdG8gb3BlbiBhIGZpbGUgd2l0aG91dCBoYW5kbGUgaW5oZXJpdGFuY2UuCisgKi8KKyAgICBzdGF0aWMgRklMRSAqCitmb3Blbl9ub2luaF9yZWFkYmluKGZpbGVuYW1lKQorICAgIGNoYXIgICAgKmZpbGVuYW1lOworeworICAgIGludAlmZF90bXAgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZIHwgT19OT0lOSEVSSVQpOworCisgICAgaWYgKGZkX3RtcCA9PSAtMSkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZmRvcGVuKGZkX3RtcCwgUkVBREJJTik7Cit9CisjZW5kaWYKKworCisvKgorICogZG9fc291cmNlOiBSZWFkIHRoZSBmaWxlICJmbmFtZSIgYW5kIGV4ZWN1dGUgaXRzIGxpbmVzIGFzIEVYIGNvbW1hbmRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCByZWN1cnNpdmVseSEKKyAqCisgKiByZXR1cm4gRkFJTCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50Citkb19zb3VyY2UoZm5hbWUsIGNoZWNrX290aGVyLCBpc192aW1yYykKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJY2hlY2tfb3RoZXI7CSAgICAvKiBjaGVjayBmb3IgLnZpbXJjIGFuZCBfdmltcmMgKi8KKyAgICBpbnQJCWlzX3ZpbXJjOwkgICAgLyogY2FsbCB2aW1yY19mb3VuZCgpIHdoZW4gZmlsZSBleGlzdHMgKi8KK3sKKyAgICBzdHJ1Y3Qgc291cmNlX2Nvb2tpZSAgICBjb29raWU7CisgICAgY2hhcl91CQkgICAgKnNhdmVfc291cmNpbmdfbmFtZTsKKyAgICBsaW5lbnJfVAkJICAgIHNhdmVfc291cmNpbmdfbG51bTsKKyAgICBjaGFyX3UJCSAgICAqcDsKKyAgICBjaGFyX3UJCSAgICAqZm5hbWVfZXhwOworICAgIGludAkJCSAgICByZXR2YWwgPSBGQUlMOworI2lmZGVmIEZFQVRfRVZBTAorICAgIHNjaWRfVAkJICAgIHNhdmVfY3VycmVudF9TSUQ7CisgICAgc3RhdGljIHNjaWRfVAkgICAgbGFzdF9jdXJyZW50X1NJRCA9IDA7CisgICAgdm9pZAkJICAgICpzYXZlX2Z1bmNjYWxwOworICAgIGludAkJCSAgICBzYXZlX2RlYnVnX2JyZWFrX2xldmVsID0gZGVidWdfYnJlYWtfbGV2ZWw7CisjIGlmZGVmIFVOSVgKKyAgICBzdHJ1Y3Qgc3RhdAkJICAgIHN0OworICAgIGludAkJCSAgICBzdGF0X29rOworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgU1RBUlRVUFRJTUUKKyAgICBzdHJ1Y3QgdGltZXZhbAkgICAgdHZfcmVsOworICAgIHN0cnVjdCB0aW1ldmFsCSAgICB0dl9zdGFydDsKKyNlbmRpZgorCisjaWZkZWYgUklTQ09TCisgICAgcCA9IG1jaF9tdW5nZV9mbmFtZShmbmFtZSk7CisjZWxzZQorICAgIHAgPSBleHBhbmRfZW52X3NhdmUoZm5hbWUpOworI2VuZGlmCisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm4gcmV0dmFsOworICAgIGZuYW1lX2V4cCA9IGZpeF9mbmFtZShwKTsKKyAgICB2aW1fZnJlZShwKTsKKyAgICBpZiAoZm5hbWVfZXhwID09IE5VTEwpCisJcmV0dXJuIHJldHZhbDsKKyNpZmRlZiBNQUNPU19DTEFTU0lDCisgICAgc2xhc2hfbl9jb2xvbl9hZGp1c3QoZm5hbWVfZXhwKTsKKyNlbmRpZgorICAgIGlmIChtY2hfaXNkaXIoZm5hbWVfZXhwKSkKKyAgICB7CisJbXNnX3N0cigoY2hhcl91ICopXygiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIiksIGZuYW1lKTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKEZFQVRfQ1NDT1BFKQorICAgIGNvb2tpZS5mcCA9IGZvcGVuX25vaW5oX3JlYWRiaW4oKGNoYXIgKilmbmFtZV9leHApOworI2Vsc2UKKyAgICBjb29raWUuZnAgPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZV9leHAsIFJFQURCSU4pOworI2VuZGlmCisgICAgaWYgKGNvb2tpZS5mcCA9PSBOVUxMICYmIGNoZWNrX290aGVyKQorICAgIHsKKwkvKgorCSAqIFRyeSBhZ2FpbiwgcmVwbGFjaW5nIGZpbGUgbmFtZSAiLnZpbXJjIiBieSAiX3ZpbXJjIiBvciB2aWNlIHZlcnNhLAorCSAqIGFuZCAiLmV4cmMiIGJ5ICJfZXhyYyIgb3IgdmljZSB2ZXJzYS4KKwkgKi8KKwlwID0gZ2V0dGFpbChmbmFtZV9leHApOworCWlmICgoKnAgPT0gJy4nIHx8ICpwID09ICdfJykKKwkJJiYgKFNUUklDTVAocCArIDEsICJ2aW1yYyIpID09IDAKKwkJICAgIHx8IFNUUklDTVAocCArIDEsICJndmltcmMiKSA9PSAwCisJCSAgICB8fCBTVFJJQ01QKHAgKyAxLCAiZXhyYyIpID09IDApKQorCXsKKwkgICAgaWYgKCpwID09ICdfJykKKwkJKnAgPSAnLic7CisJICAgIGVsc2UKKwkJKnAgPSAnXyc7CisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChGRUFUX0NTQ09QRSkKKwkgICAgY29va2llLmZwID0gZm9wZW5fbm9pbmhfcmVhZGJpbigoY2hhciAqKWZuYW1lX2V4cCk7CisjZWxzZQorCSAgICBjb29raWUuZnAgPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZV9leHAsIFJFQURCSU4pOworI2VuZGlmCisJfQorICAgIH0KKworICAgIGlmIChjb29raWUuZnAgPT0gTlVMTCkKKyAgICB7CisJaWYgKHBfdmVyYm9zZSA+IDApCisJeworCSAgICBpZiAoc291cmNpbmdfbmFtZSA9PSBOVUxMKQorCQltc2dfc3RyKChjaGFyX3UgKilfKCJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIpLCBmbmFtZSk7CisJICAgIGVsc2UKKwkJc21zZygoY2hhcl91ICopXygibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIiksCisJCQlzb3VyY2luZ19sbnVtLCBmbmFtZSk7CisJfQorCWdvdG8gdGhlZW5kOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGZpbGUgZXhpc3RzLgorICAgICAqIC0gSW4gdmVyYm9zZSBtb2RlLCBnaXZlIGEgbWVzc2FnZS4KKyAgICAgKiAtIEZvciBhIHZpbXJjIGZpbGUsIG1heSB3YW50IHRvIHNldCAnY29tcGF0aWJsZScsIGNhbGwgdmltcmNfZm91bmQoKS4KKyAgICAgKi8KKyAgICBpZiAocF92ZXJib3NlID4gMSkKKyAgICB7CisJaWYgKHNvdXJjaW5nX25hbWUgPT0gTlVMTCkKKwkgICAgbXNnX3N0cigoY2hhcl91ICopXygic291cmNpbmcgXCIlc1wiIiksIGZuYW1lKTsKKwllbHNlCisJICAgIHNtc2coKGNoYXJfdSAqKV8oImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiKSwKKwkJICAgIHNvdXJjaW5nX2xudW0sIGZuYW1lKTsKKyAgICB9CisgICAgaWYgKGlzX3ZpbXJjKQorCXZpbXJjX2ZvdW5kKCk7CisKKyNpZmRlZiBVU0VfQ1JOTAorICAgIC8qIElmIG5vIGF1dG9tYXRpYyBmaWxlIGZvcm1hdDogU2V0IGRlZmF1bHQgdG8gQ1ItTkwuICovCisgICAgaWYgKCpwX2ZmcyA9PSBOVUwpCisJY29va2llLmZpbGVmb3JtYXQgPSBFT0xfRE9TOworICAgIGVsc2UKKwljb29raWUuZmlsZWZvcm1hdCA9IEVPTF9VTktOT1dOOworICAgIGNvb2tpZS5lcnJvciA9IEZBTFNFOworI2VuZGlmCisKKyNpZmRlZiBVU0VfQ1IKKyAgICAvKiBJZiBubyBhdXRvbWF0aWMgZmlsZSBmb3JtYXQ6IFNldCBkZWZhdWx0IHRvIENSLiAqLworICAgIGlmICgqcF9mZnMgPT0gTlVMKQorCWNvb2tpZS5maWxlZm9ybWF0ID0gRU9MX01BQzsKKyAgICBlbHNlCisJY29va2llLmZpbGVmb3JtYXQgPSBFT0xfVU5LTk9XTjsKKyAgICBjb29raWUuZXJyb3IgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgY29va2llLm5leHRsaW5lID0gTlVMTDsKKyAgICBjb29raWUuZmluaXNoZWQgPSBGQUxTRTsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBzY3JpcHQgaGFzIGEgYnJlYWtwb2ludC4KKyAgICAgKi8KKyAgICBjb29raWUuYnJlYWtwb2ludCA9IGRiZ19maW5kX2JyZWFrcG9pbnQoVFJVRSwgZm5hbWVfZXhwLCAobGluZW5yX1QpMCk7CisgICAgY29va2llLmZuYW1lID0gZm5hbWVfZXhwOworICAgIGNvb2tpZS5kYmdfdGljayA9IGRlYnVnX3RpY2s7CisKKyAgICBjb29raWUubGV2ZWwgPSBleF9uZXN0aW5nX2xldmVsOworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIGNvb2tpZS5jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CQkvKiBubyBjb252ZXJzaW9uICovCisKKyAgICAvKiBUcnkgcmVhZGluZyB0aGUgZmlyc3QgZmV3IGJ5dGVzIHRvIGNoZWNrIGZvciBhIFVURi04IEJPTS4gKi8KKyAgICB7CisJY2hhcl91CSAgICBidWZbM107CisKKwlpZiAoZnJlYWQoKGNoYXIgKilidWYsIHNpemVvZihjaGFyX3UpLCAoc2l6ZV90KTMsIGNvb2tpZS5mcCkKKwkJCQkJCQkJICA9PSAoc2l6ZV90KTMKKwkJJiYgYnVmWzBdID09IDB4ZWYgJiYgYnVmWzFdID09IDB4YmIgJiYgYnVmWzJdID09IDB4YmYpCisJICAgIC8qIEZvdW5kIEJPTSwgc2V0dXAgY29udmVyc2lvbiBhbmQgc2tpcCBvdmVyIGl0LiAqLworCSAgICBjb252ZXJ0X3NldHVwKCZjb29raWUuY29udiwgKGNoYXJfdSAqKSJ1dGYtOCIsIHBfZW5jKTsKKwllbHNlCisJICAgIC8qIE5vIEJPTSBmb3VuZCwgcmV3aW5kLiAqLworCSAgICBmc2Vlayhjb29raWUuZnAsIDBMLCBTRUVLX1NFVCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEtlZXAgdGhlIHNvdXJjaW5nIG5hbWUvbG51bSwgZm9yIHJlY3Vyc2l2ZSBjYWxscy4KKyAgICAgKi8KKyAgICBzYXZlX3NvdXJjaW5nX25hbWUgPSBzb3VyY2luZ19uYW1lOworICAgIHNvdXJjaW5nX25hbWUgPSBmbmFtZV9leHA7CisgICAgc2F2ZV9zb3VyY2luZ19sbnVtID0gc291cmNpbmdfbG51bTsKKyAgICBzb3VyY2luZ19sbnVtID0gMDsKKworI2lmZGVmIFNUQVJUVVBUSU1FCisgICAgdGltZV9wdXNoKCZ0dl9yZWwsICZ0dl9zdGFydCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBzY3JpcHQgd2FzIHNvdXJjZWQgYmVmb3JlIHRvIGZpbmRzIGl0cyBTSUQuCisgICAgICogSWYgaXQncyBuZXcsIGdlbmVyYXRlIGEgbmV3IFNJRC4KKyAgICAgKi8KKyAgICBzYXZlX2N1cnJlbnRfU0lEID0gY3VycmVudF9TSUQ7CisjIGlmZGVmIFVOSVgKKyAgICBzdGF0X29rID0gKG1jaF9zdGF0KChjaGFyICopZm5hbWVfZXhwLCAmc3QpID49IDApOworIyBlbmRpZgorICAgIGZvciAoY3VycmVudF9TSUQgPSBzY3JpcHRfbmFtZXMuZ2FfbGVuOyBjdXJyZW50X1NJRCA+IDA7IC0tY3VycmVudF9TSUQpCisJaWYgKFNDUklQVF9OQU1FKGN1cnJlbnRfU0lEKSAhPSBOVUxMCisJCSYmICgKKyMgaWZkZWYgVU5JWAorCQkgICAgLyogY29tcGFyZSBkZXYvaW5vIHdoZW4gcG9zc2libGUsIGl0IGNhdGNoZXMgc3ltYm9saWMKKwkJICAgICAqIGxpbmtzICovCisJCSAgICAoc3RhdF9vayAmJiBTQ1JJUFRfREVWKGN1cnJlbnRfU0lEKSAhPSAtMSkKKwkJCT8gKFNDUklQVF9ERVYoY3VycmVudF9TSUQpID09IHN0LnN0X2RldgorCQkJICAgICYmIFNDUklQVF9JTk8oY3VycmVudF9TSUQpID09IHN0LnN0X2lubykgOgorIyBlbmRpZgorCQlmbmFtZWNtcChTQ1JJUFRfTkFNRShjdXJyZW50X1NJRCksIGZuYW1lX2V4cCkgPT0gMCkpCisJICAgIGJyZWFrOworICAgIGlmIChjdXJyZW50X1NJRCA9PSAwKQorICAgIHsKKwljdXJyZW50X1NJRCA9ICsrbGFzdF9jdXJyZW50X1NJRDsKKwlpZiAoZ2FfZ3Jvdygmc2NyaXB0X25hbWVzLCAoaW50KShjdXJyZW50X1NJRCAtIHNjcmlwdF9uYW1lcy5nYV9sZW4pKQorCQkJCQkJCQkJPT0gT0spCisJeworCSAgICB3aGlsZSAoc2NyaXB0X25hbWVzLmdhX2xlbiA8IGN1cnJlbnRfU0lEKQorCSAgICB7CisJCVNDUklQVF9OQU1FKHNjcmlwdF9uYW1lcy5nYV9sZW4gKyAxKSA9IE5VTEw7CisJCSsrc2NyaXB0X25hbWVzLmdhX2xlbjsKKwkJLS1zY3JpcHRfbmFtZXMuZ2Ffcm9vbTsKKwkgICAgfQorCSAgICBTQ1JJUFRfTkFNRShjdXJyZW50X1NJRCkgPSBmbmFtZV9leHA7CisjIGlmZGVmIFVOSVgKKwkgICAgaWYgKHN0YXRfb2spCisJICAgIHsKKwkJU0NSSVBUX0RFVihjdXJyZW50X1NJRCkgPSBzdC5zdF9kZXY7CisJCVNDUklQVF9JTk8oY3VycmVudF9TSUQpID0gc3Quc3RfaW5vOworCSAgICB9CisJICAgIGVsc2UKKwkJU0NSSVBUX0RFVihjdXJyZW50X1NJRCkgPSAtMTsKKyMgZW5kaWYKKwkgICAgZm5hbWVfZXhwID0gTlVMTDsKKwl9CisJLyogQWxsb2NhdGUgdGhlIGxvY2FsIHNjcmlwdCB2YXJpYWJsZXMgdG8gdXNlIGZvciB0aGlzIHNjcmlwdC4gKi8KKwluZXdfc2NyaXB0X3ZhcnMoY3VycmVudF9TSUQpOworICAgIH0KKworICAgIC8qIERvbid0IHVzZSBsb2NhbCBmdW5jdGlvbiB2YXJpYWJsZXMsIGlmIGNhbGxlZCBmcm9tIGEgZnVuY3Rpb24gKi8KKyAgICBzYXZlX2Z1bmNjYWxwID0gc2F2ZV9mdW5jY2FsKCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ2FsbCBkb19jbWRsaW5lLCB3aGljaCB3aWxsIGNhbGwgZ2V0c291cmNlbGluZSgpIHRvIGdldCB0aGUgbGluZXMuCisgICAgICovCisgICAgZG9fY21kbGluZShOVUxMLCBnZXRzb3VyY2VsaW5lLCAodm9pZCAqKSZjb29raWUsCisJCQkJICAgICBET0NNRF9WRVJCT1NFfERPQ01EX05PV0FJVHxET0NNRF9SRVBFQVQpOworCisgICAgcmV0dmFsID0gT0s7CisgICAgZmNsb3NlKGNvb2tpZS5mcCk7CisgICAgdmltX2ZyZWUoY29va2llLm5leHRsaW5lKTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY29udmVydF9zZXR1cCgmY29va2llLmNvbnYsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyAgICBpZiAoZ290X2ludCkKKwlFTVNHKF8oZV9pbnRlcnIpKTsKKyAgICBzb3VyY2luZ19uYW1lID0gc2F2ZV9zb3VyY2luZ19uYW1lOworICAgIHNvdXJjaW5nX2xudW0gPSBzYXZlX3NvdXJjaW5nX2xudW07CisjaWZkZWYgRkVBVF9FVkFMCisgICAgY3VycmVudF9TSUQgPSBzYXZlX2N1cnJlbnRfU0lEOworICAgIHJlc3RvcmVfZnVuY2NhbChzYXZlX2Z1bmNjYWxwKTsKKyNlbmRpZgorICAgIGlmIChwX3ZlcmJvc2UgPiAxKQorICAgIHsKKwltc2dfc3RyKChjaGFyX3UgKilfKCJmaW5pc2hlZCBzb3VyY2luZyAlcyIpLCBmbmFtZSk7CisJaWYgKHNvdXJjaW5nX25hbWUgIT0gTlVMTCkKKwkgICAgbXNnX3N0cigoY2hhcl91ICopXygiY29udGludWluZyBpbiAlcyIpLCBzb3VyY2luZ19uYW1lKTsKKyAgICB9CisjaWZkZWYgU1RBUlRVUFRJTUUKKyMgaWZkZWYgSEFWRV9TTlBSSU5URgorICAgIHNucHJpbnRmKElPYnVmZiwgSU9TSVpFLCAic291cmNpbmcgJXMiLCBmbmFtZSk7CisjIGVsc2UKKyAgICBzcHJpbnRmKElPYnVmZiwgInNvdXJjaW5nICVzIiwgZm5hbWUpOworIyBlbmRpZgorICAgIHRpbWVfbXNnKElPYnVmZiwgJnR2X3N0YXJ0KTsKKyAgICB0aW1lX3BvcCgmdHZfcmVsKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyoKKyAgICAgKiBBZnRlciBhICJmaW5pc2giIGluIGRlYnVnIG1vZGUsIG5lZWQgdG8gYnJlYWsgYXQgZmlyc3QgY29tbWFuZCBvZiBuZXh0CisgICAgICogc291cmNlZCBmaWxlLgorICAgICAqLworICAgIGlmIChzYXZlX2RlYnVnX2JyZWFrX2xldmVsID4gZXhfbmVzdGluZ19sZXZlbAorCSAgICAmJiBkZWJ1Z19icmVha19sZXZlbCA9PSBleF9uZXN0aW5nX2xldmVsKQorCSsrZGVidWdfYnJlYWtfbGV2ZWw7CisjZW5kaWYKKwordGhlZW5kOgorICAgIHZpbV9mcmVlKGZuYW1lX2V4cCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqICI6c2NyaXB0bmFtZXMiCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X3NjcmlwdG5hbWVzKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IHNjcmlwdF9uYW1lcy5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraSkKKwlpZiAoU0NSSVBUX05BTUUoaSkgIT0gTlVMTCkKKwkgICAgc21zZygoY2hhcl91ICopIiUzZDogJXMiLCBpLCBTQ1JJUFRfTkFNRShpKSk7Cit9CisKKyMgaWYgZGVmaW5lZChCQUNLU0xBU0hfSU5fRklMRU5BTUUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRml4IHNsYXNoZXMgaW4gdGhlIGxpc3Qgb2Ygc2NyaXB0IG5hbWVzIGZvciAnc2hlbGxzbGFzaCcuCisgKi8KKyAgICB2b2lkCitzY3JpcHRuYW1lc19zbGFzaF9hZGp1c3QoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMTsgaSA8PSBzY3JpcHRfbmFtZXMuZ2FfbGVuOyArK2kpCisJaWYgKFNDUklQVF9OQU1FKGkpICE9IE5VTEwpCisJICAgIHNsYXNoX2FkanVzdChTQ1JJUFRfTkFNRShpKSk7Cit9CisjIGVuZGlmCisKKy8qCisgKiBHZXQgYSBwb2ludGVyIHRvIGEgc2NyaXB0IG5hbWUuICBVc2VkIGZvciAiOnZlcmJvc2Ugc2V0Ii4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfc2NyaXB0bmFtZShpZCkKKyAgICBzY2lkX1QJaWQ7Cit7CisgICAgaWYgKGlkID09IFNJRF9NT0RFTElORSkKKwlyZXR1cm4gKGNoYXJfdSAqKSJtb2RlbGluZSI7CisgICAgaWYgKGlkID09IFNJRF9DTURBUkcpCisJcmV0dXJuIChjaGFyX3UgKikiLS1jbWQgYXJndW1lbnQiOworICAgIGlmIChpZCA9PSBTSURfQ0FSRykKKwlyZXR1cm4gKGNoYXJfdSAqKSItYyBhcmd1bWVudCI7CisgICAgaWYgKGlkID09IFNJRF9FTlYpCisJcmV0dXJuIChjaGFyX3UgKikiZW52aXJvbm1lbnQgdmFyaWFibGUiOworICAgIHJldHVybiBTQ1JJUFRfTkFNRShpZCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX0NSKSB8fCBkZWZpbmVkKFBST1RPKQorCisjIGlmIGRlZmluZWQoX19NU0xfXykgJiYgKF9fTVNMX18gPj0gMjIpCisvKgorICogTmV3ZXIgdmVyc2lvbiBvZiB0aGUgTWV0cm93ZXJrcyBsaWJyYXJ5IGhhbmRsZSBET1MgYW5kIFVOSVggZmlsZXMKKyAqIHdpdGhvdXQgaGVscC4KKyAqIFRlc3Qgd2l0aCBlYXJsaWVyIHZlcnNpb25zLCBNU0wgMi4yIGlzIHRoZSBsaWJyYXJ5IHN1cHBsaWVkIHdpdGgKKyAqIENvZGV3YXJyaW9yIFBybyAyLgorICovCisgICAgY2hhciAqCitmZ2V0c19jcihzLCBuLCBzdHJlYW0pCisgICAgY2hhcgkqczsKKyAgICBpbnQJCW47CisgICAgRklMRQkqc3RyZWFtOworeworICAgIHJldHVybiBmZ2V0cyhzLCBuLCBzdHJlYW0pOworfQorIyBlbHNlCisvKgorICogVmVyc2lvbiBvZiBmZ2V0cygpIHdoaWNoIGFsc28gd29ya3MgZm9yIGxpbmVzIGVuZGluZyBpbiBhIDxDUj4gb25seQorICogKE1hY2ludG9zaCBmb3JtYXQpLgorICogRm9yIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBNZXRyb3dlcmtzIGxpYnJhcnkuCisgKiBBdCBsZWFzdCBDb2RlV2FycmlvciA5IG5lZWRlZCB0aGlzIGNvZGUuCisgKi8KKyAgICBjaGFyICoKK2ZnZXRzX2NyKHMsIG4sIHN0cmVhbSkKKyAgICBjaGFyCSpzOworICAgIGludAkJbjsKKyAgICBGSUxFCSpzdHJlYW07Cit7CisgICAgaW50CWMgPSAwOworICAgIGludCBjaGFyX3JlYWQgPSAwOworCisgICAgd2hpbGUgKCFmZW9mKHN0cmVhbSkgJiYgYyAhPSAnXHInICYmIGMgIT0gJ1xuJyAmJiBjaGFyX3JlYWQgPCBuIC0gMSkKKyAgICB7CisJYyA9IGZnZXRjKHN0cmVhbSk7CisJc1tjaGFyX3JlYWQrK10gPSBjOworCS8qIElmIHRoZSBmaWxlIGlzIGluIERPUyBmb3JtYXQsIHdlIG5lZWQgdG8gc2tpcCBhIE5MIGFmdGVyIGEgQ1IuICBJCisJICogdGhvdWdodCBpdCB3YXMgdGhlIG90aGVyIHdheSBhcm91bmQsIGJ1dCB0aGlzIGFwcGVhcnMgdG8gd29yay4uLiAqLworCWlmIChjID09ICdcbicpCisJeworCSAgICBjID0gZmdldGMoc3RyZWFtKTsKKwkgICAgaWYgKGMgIT0gJ1xyJykKKwkJdW5nZXRjKGMsIHN0cmVhbSk7CisJfQorICAgIH0KKworICAgIHNbY2hhcl9yZWFkXSA9IDA7CisgICAgaWYgKGNoYXJfcmVhZCA9PSAwKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKGZlb2Yoc3RyZWFtKSAmJiBjaGFyX3JlYWQgPT0gMSkKKwlyZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBzOworfQorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBHZXQgb25lIGZ1bGwgbGluZSBmcm9tIGEgc291cmNlZCBmaWxlLgorICogQ2FsbGVkIGJ5IGRvX2NtZGxpbmUoKSB3aGVuIGl0J3MgY2FsbGVkIGZyb20gZG9fc291cmNlKCkuCisgKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGluZSBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogUmV0dXJuIE5VTEwgZm9yIGVuZC1vZi1maWxlIG9yIHNvbWUgZXJyb3IuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgY2hhcl91ICoKK2dldHNvdXJjZWxpbmUoYywgY29va2llLCBpbmRlbnQpCisgICAgaW50CQljOwkJLyogbm90IHVzZWQgKi8KKyAgICB2b2lkCSpjb29raWU7CisgICAgaW50CQlpbmRlbnQ7CQkvKiBub3QgdXNlZCAqLworeworICAgIHN0cnVjdCBzb3VyY2VfY29va2llICpzcCA9IChzdHJ1Y3Qgc291cmNlX2Nvb2tpZSAqKWNvb2tpZTsKKyAgICBjaGFyX3UJCSpsaW5lOworICAgIGNoYXJfdQkJKnAsICpzOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyogSWYgYnJlYWtwb2ludHMgaGF2ZSBiZWVuIGFkZGVkL2RlbGV0ZWQgbmVlZCB0byBjaGVjayBmb3IgaXQuICovCisgICAgaWYgKHNwLT5kYmdfdGljayA8IGRlYnVnX3RpY2spCisgICAgeworCXNwLT5icmVha3BvaW50ID0gZGJnX2ZpbmRfYnJlYWtwb2ludChUUlVFLCBzcC0+Zm5hbWUsIHNvdXJjaW5nX2xudW0pOworCXNwLT5kYmdfdGljayA9IGRlYnVnX3RpY2s7CisgICAgfQorI2VuZGlmCisgICAgLyoKKyAgICAgKiBHZXQgY3VycmVudCBsaW5lLiAgSWYgdGhlcmUgaXMgYSByZWFkLWFoZWFkIGxpbmUsIHVzZSBpdCwgb3RoZXJ3aXNlIGdldAorICAgICAqIG9uZSBub3cuCisgICAgICovCisgICAgaWYgKHNwLT5maW5pc2hlZCkKKwlsaW5lID0gTlVMTDsKKyAgICBlbHNlIGlmIChzcC0+bmV4dGxpbmUgPT0gTlVMTCkKKwlsaW5lID0gZ2V0X29uZV9zb3VyY2VsaW5lKHNwKTsKKyAgICBlbHNlCisgICAgeworCWxpbmUgPSBzcC0+bmV4dGxpbmU7CisJc3AtPm5leHRsaW5lID0gTlVMTDsKKwkrK3NvdXJjaW5nX2xudW07CisgICAgfQorCisgICAgLyogT25seSBjb25jYXRlbmF0ZSBsaW5lcyBzdGFydGluZyB3aXRoIGEgXCB3aGVuICdjcG9wdGlvbnMnIGRvZXNuJ3QKKyAgICAgKiBjb250YWluIHRoZSAnQycgZmxhZy4gKi8KKyAgICBpZiAobGluZSAhPSBOVUxMICYmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQ09OQ0FUKSA9PSBOVUxMKSkKKyAgICB7CisJLyogY29tcGVuc2F0ZSBmb3IgdGhlIG9uZSBsaW5lIHJlYWQtYWhlYWQgKi8KKwktLXNvdXJjaW5nX2xudW07CisJZm9yICg7OykKKwl7CisJICAgIHNwLT5uZXh0bGluZSA9IGdldF9vbmVfc291cmNlbGluZShzcCk7CisJICAgIGlmIChzcC0+bmV4dGxpbmUgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIHAgPSBza2lwd2hpdGUoc3AtPm5leHRsaW5lKTsKKwkgICAgaWYgKCpwICE9ICdcXCcpCisJCWJyZWFrOworCSAgICBzID0gYWxsb2MoKGludCkoU1RSTEVOKGxpbmUpICsgU1RSTEVOKHApKSk7CisJICAgIGlmIChzID09IE5VTEwpCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJYnJlYWs7CisJICAgIFNUUkNQWShzLCBsaW5lKTsKKwkgICAgU1RSQ0FUKHMsIHAgKyAxKTsKKwkgICAgdmltX2ZyZWUobGluZSk7CisJICAgIGxpbmUgPSBzOworCSAgICB2aW1fZnJlZShzcC0+bmV4dGxpbmUpOworCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGxpbmUgIT0gTlVMTCAmJiBzcC0+Y29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKyAgICB7CisJLyogQ29udmVydCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHNjcmlwdCBsaW5lLiAqLworCXMgPSBzdHJpbmdfY29udmVydCgmc3AtPmNvbnYsIGxpbmUsIE5VTEwpOworCWlmIChzICE9IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShsaW5lKTsKKwkgICAgbGluZSA9IHM7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyogRGlkIHdlIGVuY291bnRlciBhIGJyZWFrcG9pbnQ/ICovCisgICAgaWYgKHNwLT5icmVha3BvaW50ICE9IDAgJiYgc3AtPmJyZWFrcG9pbnQgPD0gc291cmNpbmdfbG51bSkKKyAgICB7CisJZGJnX2JyZWFrcG9pbnQoc3AtPmZuYW1lLCBzb3VyY2luZ19sbnVtKTsKKwkvKiBGaW5kIG5leHQgYnJlYWtwb2ludC4gKi8KKwlzcC0+YnJlYWtwb2ludCA9IGRiZ19maW5kX2JyZWFrcG9pbnQoVFJVRSwgc3AtPmZuYW1lLCBzb3VyY2luZ19sbnVtKTsKKwlzcC0+ZGJnX3RpY2sgPSBkZWJ1Z190aWNrOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGxpbmU7Cit9CisKKyAgICBzdGF0aWMgY2hhcl91ICoKK2dldF9vbmVfc291cmNlbGluZShzcCkKKyAgICBzdHJ1Y3Qgc291cmNlX2Nvb2tpZSAgICAqc3A7Cit7CisgICAgZ2FycmF5X1QJCWdhOworICAgIGludAkJCWxlbjsKKyAgICBpbnQJCQljOworICAgIGNoYXJfdQkJKmJ1ZjsKKyNpZmRlZiBVU0VfQ1JOTAorICAgIGludAkJCWhhc19jcjsJCS8qIENSLUxGIGZvdW5kICovCisjZW5kaWYKKyNpZmRlZiBVU0VfQ1IKKyAgICBjaGFyX3UJCSpzY2FuOworI2VuZGlmCisgICAgaW50CQkJaGF2ZV9yZWFkID0gRkFMU0U7CisKKyAgICAvKiB1c2UgYSBncm93YXJyYXkgdG8gc3RvcmUgdGhlIHNvdXJjZWQgbGluZSAqLworICAgIGdhX2luaXQyKCZnYSwgMSwgMjAwKTsKKworICAgIC8qCisgICAgICogTG9vcCB1bnRpbCB0aGVyZSBpcyBhIGZpbmlzaGVkIGxpbmUgKG9yIGVuZC1vZi1maWxlKS4KKyAgICAgKi8KKyAgICBzb3VyY2luZ19sbnVtKys7CisgICAgZm9yICg7OykKKyAgICB7CisJLyogbWFrZSByb29tIHRvIHJlYWQgYXQgbGVhc3QgODAgKG1vcmUpIGNoYXJhY3RlcnMgKi8KKwlpZiAoZ2FfZ3JvdygmZ2EsIDgwKSA9PSBGQUlMKQorCSAgICBicmVhazsKKwlidWYgPSAoY2hhcl91ICopZ2EuZ2FfZGF0YTsKKworI2lmZGVmIFVTRV9DUgorCWlmIChzcC0+ZmlsZWZvcm1hdCA9PSBFT0xfTUFDKQorCXsKKwkgICAgaWYgKGZnZXRzX2NyKChjaGFyICopYnVmICsgZ2EuZ2FfbGVuLCBnYS5nYV9yb29tLCBzcC0+ZnApID09IE5VTEwpCisJCWJyZWFrOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgaWYgKGZnZXRzKChjaGFyICopYnVmICsgZ2EuZ2FfbGVuLCBnYS5nYV9yb29tLCBzcC0+ZnApID09IE5VTEwpCisJCWJyZWFrOworCWxlbiA9IChpbnQpU1RSTEVOKGJ1Zik7CisjaWZkZWYgVVNFX0NSTkwKKwkvKiBJZ25vcmUgYSB0cmFpbGluZyBDVFJMLVosIHdoZW4gaW4gRG9zIG1vZGUuCU9ubHkgcmVjb2duaXplIHRoZQorCSAqIENUUkwtWiBieSBpdHMgb3duLCBvciBhZnRlciBhIE5MLiAqLworCWlmICgJICAgKGxlbiA9PSAxIHx8IChsZW4gPj0gMiAmJiBidWZbbGVuIC0gMl0gPT0gJ1xuJykpCisJCSYmIHNwLT5maWxlZm9ybWF0ID09IEVPTF9ET1MKKwkJJiYgYnVmW2xlbiAtIDFdID09IEN0cmxfWikKKwl7CisJICAgIGJ1ZltsZW4gLSAxXSA9IE5VTDsKKwkgICAgYnJlYWs7CisJfQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQ1IKKwkvKiBJZiB0aGUgcmVhZCBkb2Vzbid0IHN0b3Agb24gYSBuZXcgbGluZSwgYW5kIHRoZXJlJ3MKKwkgKiBzb21lIENSIHRoZW4gd2UgYXNzdW1lIGEgTWFjIGZvcm1hdCAqLworCWlmIChzcC0+ZmlsZWZvcm1hdCA9PSBFT0xfVU5LTk9XTikKKwl7CisJICAgIGlmIChidWZbbGVuIC0gMV0gIT0gJ1xuJyAmJiB2aW1fc3RyY2hyKGJ1ZiwgJ1xyJykgIT0gTlVMTCkKKwkJc3AtPmZpbGVmb3JtYXQgPSBFT0xfTUFDOworCSAgICBlbHNlCisJCXNwLT5maWxlZm9ybWF0ID0gRU9MX1VOSVg7CisJfQorCisJaWYgKHNwLT5maWxlZm9ybWF0ID09IEVPTF9NQUMpCisJeworCSAgICBzY2FuID0gdmltX3N0cmNocihidWYsICdccicpOworCisJICAgIGlmIChzY2FuICE9IE5VTEwpCisJICAgIHsKKwkJKnNjYW4gPSAnXG4nOworCQlpZiAoKihzY2FuICsgMSkgIT0gMCkKKwkJeworCQkgICAgKihzY2FuICsgMSkgPSAwOworCQkgICAgZnNlZWsoc3AtPmZwLCAobG9uZykoc2NhbiAtIGJ1ZiAtIGxlbiArIDEpLCBTRUVLX0NVUik7CisJCX0KKwkgICAgfQorCSAgICBsZW4gPSBTVFJMRU4oYnVmKTsKKwl9CisjZW5kaWYKKworCWhhdmVfcmVhZCA9IFRSVUU7CisJZ2EuZ2Ffcm9vbSAtPSBsZW4gLSBnYS5nYV9sZW47CisJZ2EuZ2FfbGVuID0gbGVuOworCisJLyogSWYgdGhlIGxpbmUgd2FzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIsIHJlYWQgbW9yZS4gKi8KKwlpZiAoZ2EuZ2Ffcm9vbSA9PSAxICYmIGJ1ZltsZW4gLSAxXSAhPSAnXG4nKQorCSAgICBjb250aW51ZTsKKworCWlmIChsZW4gPj0gMSAmJiBidWZbbGVuIC0gMV0gPT0gJ1xuJykJLyogcmVtb3ZlIHRyYWlsaW5nIE5MICovCisJeworI2lmZGVmIFVTRV9DUk5MCisJICAgIGhhc19jciA9IChsZW4gPj0gMiAmJiBidWZbbGVuIC0gMl0gPT0gJ1xyJyk7CisJICAgIGlmIChzcC0+ZmlsZWZvcm1hdCA9PSBFT0xfVU5LTk9XTikKKwkgICAgeworCQlpZiAoaGFzX2NyKQorCQkgICAgc3AtPmZpbGVmb3JtYXQgPSBFT0xfRE9TOworCQllbHNlCisJCSAgICBzcC0+ZmlsZWZvcm1hdCA9IEVPTF9VTklYOworCSAgICB9CisKKwkgICAgaWYgKHNwLT5maWxlZm9ybWF0ID09IEVPTF9ET1MpCisJICAgIHsKKwkJaWYgKGhhc19jcikJICAgIC8qIHJlcGxhY2UgdHJhaWxpbmcgQ1IgKi8KKwkJeworCQkgICAgYnVmW2xlbiAtIDJdID0gJ1xuJzsKKwkJICAgIC0tbGVuOworCQkgICAgLS1nYS5nYV9sZW47CisJCSAgICArK2dhLmdhX3Jvb207CisJCX0KKwkJZWxzZQkgICAgLyogbGluZXMgbGlrZSAiOm1hcCB4eCB5eV5NIiB3aWxsIGhhdmUgZmFpbGVkICovCisJCXsKKwkJICAgIGlmICghc3AtPmVycm9yKQorCQkJRU1TRyhfKCJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIpKTsKKwkJICAgIHNwLT5lcnJvciA9IFRSVUU7CisJCSAgICBzcC0+ZmlsZWZvcm1hdCA9IEVPTF9VTklYOworCQl9CisJICAgIH0KKyNlbmRpZgorCSAgICAvKiBUaGUgJ1xuJyBpcyBlc2NhcGVkIGlmIHRoZXJlIGlzIGFuIG9kZCBudW1iZXIgb2YgXlYncyBqdXN0CisJICAgICAqIGJlZm9yZSBpdCwgZmlyc3Qgc2V0ICJjIiBqdXN0IGJlZm9yZSB0aGUgJ1YncyBhbmQgdGhlbiBjaGVjaworCSAgICAgKiBsZW4mYyBwYXJpdGllcyAoaXMgZmFzdGVyIHRoYW4gKChsZW4tYyklMiA9PSAwKSkgLS0gQWNldmVkbyAqLworCSAgICBmb3IgKGMgPSBsZW4gLSAyOyBjID49IDAgJiYgYnVmW2NdID09IEN0cmxfVjsgYy0tKQorCQk7CisJICAgIGlmICgobGVuICYgMSkgIT0gKGMgJiAxKSkJLyogZXNjYXBlZCBOTCwgcmVhZCBtb3JlICovCisJICAgIHsKKwkJc291cmNpbmdfbG51bSsrOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIGJ1ZltsZW4gLSAxXSA9IE5VTDsJCS8qIHJlbW92ZSB0aGUgTkwgKi8KKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBeQyBoZXJlIG5vdyBhbmQgdGhlbiwgc28gcmVjdXJzaXZlIDpzbyBjYW4gYmUgYnJva2VuLgorCSAqLworCWxpbmVfYnJlYWtjaGVjaygpOworCWJyZWFrOworICAgIH0KKworICAgIGlmIChoYXZlX3JlYWQpCisJcmV0dXJuIChjaGFyX3UgKilnYS5nYV9kYXRhOworCisgICAgdmltX2ZyZWUoZ2EuZ2FfZGF0YSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAiOnNjcmlwdGVuY29kaW5nIjogU2V0IGVuY29kaW5nIGNvbnZlcnNpb24gZm9yIGEgc291cmNlZCBzY3JpcHQuCisgKiBXaXRob3V0IHRoZSBtdWx0aS1ieXRlIGZlYXR1cmUgaXQncyBzaW1wbHkgaWdub3JlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZXhfc2NyaXB0ZW5jb2RpbmcoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgc3RydWN0IHNvdXJjZV9jb29raWUJKnNwOworICAgIGNoYXJfdQkJCSpuYW1lOworCisgICAgaWYgKCFnZXRsaW5lX2VxdWFsKGVhcC0+Z2V0bGluZSwgZWFwLT5jb29raWUsIGdldHNvdXJjZWxpbmUpKQorICAgIHsKKwlFTVNHKF8oIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICgqZWFwLT5hcmcgIT0gTlVMKQorICAgIHsKKwluYW1lID0gZW5jX2Nhbm9uaXplKGVhcC0+YXJnKTsKKwlpZiAobmFtZSA9PSBOVUxMKQkvKiBvdXQgb2YgbWVtb3J5ICovCisJICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorCW5hbWUgPSBlYXAtPmFyZzsKKworICAgIC8qIFNldHVwIGZvciBjb252ZXJzaW9uIGZyb20gdGhlIHNwZWNpZmllZCBlbmNvZGluZyB0byAnZW5jb2RpbmcnLiAqLworICAgIHNwID0gKHN0cnVjdCBzb3VyY2VfY29va2llICopZ2V0bGluZV9jb29raWUoZWFwLT5nZXRsaW5lLCBlYXAtPmNvb2tpZSk7CisgICAgY29udmVydF9zZXR1cCgmc3AtPmNvbnYsIG5hbWUsIHBfZW5jKTsKKworICAgIGlmIChuYW1lICE9IGVhcC0+YXJnKQorCXZpbV9mcmVlKG5hbWUpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiAiOmZpbmlzaCI6IE1hcmsgYSBzb3VyY2VkIGZpbGUgYXMgZmluaXNoZWQuCisgKi8KKyAgICB2b2lkCitleF9maW5pc2goZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoZ2V0bGluZV9lcXVhbChlYXAtPmdldGxpbmUsIGVhcC0+Y29va2llLCBnZXRzb3VyY2VsaW5lKSkKKwlkb19maW5pc2goZWFwLCBGQUxTRSk7CisgICAgZWxzZQorCUVNU0coXygiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiKSk7Cit9CisKKy8qCisgKiBNYXJrIGEgc291cmNlZCBmaWxlIGFzIGZpbmlzaGVkLiAgUG9zc2libHkgbWFrZXMgdGhlICI6ZmluaXNoIiBwZW5kaW5nLgorICogQWxzbyBjYWxsZWQgZm9yIGEgcGVuZGluZyBmaW5pc2ggYXQgdGhlICI6ZW5kdHJ5IiBvciBhZnRlciByZXR1cm5pbmcgZnJvbQorICogYW4gZXh0cmEgZG9fY21kbGluZSgpLiAgInJlYW5pbWF0ZSIgaXMgdXNlZCBpbiB0aGUgbGF0dGVyIGNhc2UuCisgKi8KKyAgICB2b2lkCitkb19maW5pc2goZWFwLCByZWFuaW1hdGUpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJcmVhbmltYXRlOworeworICAgIGludAkJaWR4OworCisgICAgaWYgKHJlYW5pbWF0ZSkKKwkoKHN0cnVjdCBzb3VyY2VfY29va2llICopZ2V0bGluZV9jb29raWUoZWFwLT5nZXRsaW5lLAorCQkJCQkgICAgICBlYXAtPmNvb2tpZSkpLT5maW5pc2hlZCA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBDbGVhbnVwIChhbmQgaW5hY3RpdmF0ZSkgY29uZGl0aW9uYWxzLCBidXQgc3RvcCB3aGVuIGEgdHJ5IGNvbmRpdGlvbmFsCisgICAgICogbm90IGluIGl0cyBmaW5hbGx5IGNsYXVzZSAod2hpY2ggdGhlbiBpcyB0byBiZSBleGVjdXRlZCBuZXh0KSBpcyBmb3VuZC4KKyAgICAgKiBJbiB0aGlzIGNhc2UsIG1ha2UgdGhlICI6ZmluaXNoIiBwZW5kaW5nIGZvciBleGVjdXRpb24gYXQgdGhlICI6ZW5kdHJ5Ii4KKyAgICAgKiBPdGhlcndpc2UsIGZpbmlzaCBub3JtYWxseS4KKyAgICAgKi8KKyAgICBpZHggPSBjbGVhbnVwX2NvbmRpdGlvbmFscyhlYXAtPmNzdGFjaywgMCwgVFJVRSk7CisgICAgaWYgKGlkeCA+PSAwKQorICAgIHsKKwllYXAtPmNzdGFjay0+Y3NfcGVuZGluZ1tpZHhdID0gQ1NUUF9GSU5JU0g7CisJcmVwb3J0X21ha2VfcGVuZGluZyhDU1RQX0ZJTklTSCwgTlVMTCk7CisgICAgfQorICAgIGVsc2UKKwkoKHN0cnVjdCBzb3VyY2VfY29va2llICopZ2V0bGluZV9jb29raWUoZWFwLT5nZXRsaW5lLAorCQkJCQkgICAgICAgZWFwLT5jb29raWUpKS0+ZmluaXNoZWQgPSBUUlVFOworfQorCisKKy8qCisgKiBSZXR1cm4gVFJVRSB3aGVuIGEgc291cmNlZCBmaWxlIGhhZCB0aGUgIjpmaW5pc2giIGNvbW1hbmQ6IERvbid0IGdpdmUgZXJyb3IKKyAqIG1lc3NhZ2UgZm9yIG1pc3NpbmcgIjplbmRpZiIuCisgKiBSZXR1cm4gRkFMU0Ugd2hlbiBub3Qgc291cmNpbmcgYSBmaWxlLgorICovCisgICAgaW50Citzb3VyY2VfZmluaXNoZWQoZ2V0bGluZSwgY29va2llKQorICAgIGNoYXJfdQkqKCpnZXRsaW5lKSBfX0FSR1MoKGludCwgdm9pZCAqLCBpbnQpKTsKKyAgICB2b2lkCSpjb29raWU7Cit7CisgICAgcmV0dXJuIChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0c291cmNlbGluZSkKKwkgICAgJiYgKChzdHJ1Y3Qgc291cmNlX2Nvb2tpZSAqKWdldGxpbmVfY29va2llKAorCQkJCQkJIGdldGxpbmUsIGNvb2tpZSkpLT5maW5pc2hlZCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9MSVNUQ01EUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiAiOmNoZWNrdGltZSBbYnVmZmVyXSIKKyAqLworICAgIHZvaWQKK2V4X2NoZWNrdGltZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlzYXZlX25vX2NoZWNrX3RpbWVzdGFtcHMgPSBub19jaGVja190aW1lc3RhbXBzOworCisgICAgbm9fY2hlY2tfdGltZXN0YW1wcyA9IDA7CisgICAgaWYgKGVhcC0+YWRkcl9jb3VudCA9PSAwKQkvKiBkZWZhdWx0IGlzIGFsbCBidWZmZXJzICovCisJY2hlY2tfdGltZXN0YW1wcyhGQUxTRSk7CisgICAgZWxzZQorICAgIHsKKwlidWYgPSBidWZsaXN0X2ZpbmRucigoaW50KWVhcC0+bGluZTIpOworCWlmIChidWYgIT0gTlVMTCkJLyogY2Fubm90IGhhcHBlbj8gKi8KKwkgICAgKHZvaWQpYnVmX2NoZWNrX3RpbWVzdGFtcChidWYsIEZBTFNFKTsKKyAgICB9CisgICAgbm9fY2hlY2tfdGltZXN0YW1wcyA9IHNhdmVfbm9fY2hlY2tfdGltZXN0YW1wczsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1BSSU5URVIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUHJpbnRpbmcgY29kZSAoTWFjaGluZS1pbmRlcGVuZGVudC4pCisgKiBUbyBpbXBsZW1lbnQgcHJpbnRpbmcgb24gYSBwbGF0Zm9ybSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCBiZQorICogZGVmaW5lZDoKKyAqCisgKiBpbnQgbWNoX3ByaW50X2luaXQocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncywgY2hhcl91ICpqb2JuYW1lLCBpbnQgZm9yY2VpdCkKKyAqIENhbGxlZCBvbmNlLiAgQ29kZSBzaG91bGQgZGlzcGxheSBwcmludGVyIGRpYWxvZ3VlIChpZiBhcHByb3ByaWF0ZSkgYW5kCisgKiBkZXRlcm1pbmUgcHJpbnRlciBmb250IGFuZCBtYXJnaW4gc2V0dGluZ3MuICBSZXNldCBoYXNfY29sb3IgaWYgdGhlIHByaW50ZXIKKyAqIGRvZXNuJ3Qgc3VwcG9ydCBjb2xvcnMgYXQgYWxsLgorICogUmV0dXJucyBGQUlMIHRvIGFib3J0LgorICoKKyAqIGludCBtY2hfcHJpbnRfYmVnaW4ocHJ0X3NldHRpbmdzX1QgKnNldHRpbmdzKQorICogQ2FsbGVkIHRvIHN0YXJ0IHRoZSBwcmludCBqb2IuCisgKiBSZXR1cm4gRkFMU0UgdG8gYWJvcnQuCisgKgorICogaW50IG1jaF9wcmludF9iZWdpbl9wYWdlKGNoYXJfdSAqbXNnKQorICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHBhZ2UuCisgKiAibXNnIiBpbmRpY2F0ZXMgdGhlIHByb2dyZXNzIG9mIHRoZSBwcmludCBqb2IsIGNhbiBiZSBOVUxMLgorICogUmV0dXJuIEZBTFNFIHRvIGFib3J0LgorICoKKyAqIGludCBtY2hfcHJpbnRfZW5kX3BhZ2UoKQorICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBwYWdlLgorICogUmV0dXJuIEZBTFNFIHRvIGFib3J0LgorICoKKyAqIGludCBtY2hfcHJpbnRfYmxhbmtfcGFnZSgpCisgKiBDYWxsZWQgdG8gZ2VuZXJhdGUgYSBibGFuayBwYWdlIGZvciBjb2xsYXRlZCwgZHVwbGV4LCBtdWx0aXBsZSBjb3B5CisgKiBkb2N1bWVudC4gIFJldHVybiBGQUxTRSB0byBhYm9ydC4KKyAqCisgKiB2b2lkIG1jaF9wcmludF9lbmQocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykKKyAqIENhbGxlZCBhdCBub3JtYWwgZW5kIG9mIHByaW50IGpvYi4KKyAqCisgKiB2b2lkIG1jaF9wcmludF9jbGVhbnVwKCkKKyAqIENhbGxlZCBpZiBwcmludCBqb2IgZW5kcyBub3JtYWxseSBvciBpcyBhYmFuZG9uZWQuIEZyZWUgYW55IG1lbW9yeSwgY2xvc2UKKyAqIGRldmljZXMgYW5kIGhhbmRsZXMuICBBbHNvIGNhbGxlZCB3aGVuIG1jaF9wcmludF9iZWdpbigpIGZhaWxzLCBidXQgbm90CisgKiB3aGVuIG1jaF9wcmludF9pbml0KCkgZmFpbHMuCisgKgorICogdm9pZCBtY2hfcHJpbnRfc2V0X2ZvbnQoaW50IEJvbGQsIGludCBJdGFsaWMsIGludCBVbmRlcmxpbmUpOworICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBmb250IHN0eWxlIGNoYW5nZXMuCisgKgorICogdm9pZCBtY2hfcHJpbnRfc2V0X2JnKGxvbmcgYmdjb2wpOworICogQ2FsbGVkIHRvIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGZvbGxvd2luZyB0ZXh0LiBQYXJhbWV0ZXIgaXMgYW4KKyAqIFJHQiB2YWx1ZS4KKyAqCisgKiB2b2lkIG1jaF9wcmludF9zZXRfZmcobG9uZyBmZ2NvbCk7CisgKiBDYWxsZWQgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGZvciB0aGUgZm9sbG93aW5nIHRleHQuIFBhcmFtZXRlciBpcyBhbgorICogUkdCIHZhbHVlLgorICoKKyAqIG1jaF9wcmludF9zdGFydF9saW5lKGludCBtYXJnaW4sIGludCBwYWdlX2xpbmUpCisgKiBTZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiBsaW5lICJwYWdlX2xpbmUiLgorICogSWYgbWFyZ2luIGlzIFRSVUUgc3RhcnQgaW4gdGhlIGxlZnQgbWFyZ2luIChmb3IgaGVhZGVyIGFuZCBsaW5lIG51bWJlcikuCisgKgorICogaW50IG1jaF9wcmludF90ZXh0X291dChjaGFyX3UgKnAsIGludCBsZW4pOworICogT3V0cHV0IG9uZSBjaGFyYWN0ZXIgb2YgdGV4dCBwW2xlbl0gYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgKiBSZXR1cm4gVFJVRSBpZiB0aGVyZSBpcyBubyByb29tIGZvciBhbm90aGVyIGNoYXJhY3RlciBpbiB0aGUgc2FtZSBsaW5lLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZ2VuZXJpYyBjb2RlIGhhcyBubyBpZGVhIG9mIG1hcmdpbnMuIFRoZSBtYWNoaW5lIGNvZGUgc2hvdWxkCisgKiBzaW1wbHkgbWFrZSB0aGUgcGFnZSBsb29rIHNtYWxsZXIhICBUaGUgaGVhZGVyIGFuZCB0aGUgbGluZSBudW1iZXJzIGFyZQorICogcHJpbnRlZCBpbiB0aGUgbWFyZ2luLgorICovCisKKyNpZmRlZiBGRUFUX1NZTl9ITAorc3RhdGljIGNvbnN0IGxvbmdfdSAgY3Rlcm1fY29sb3JfOFs4XSA9Cit7CisgICAgKGxvbmdfdSkweDAwMDAwMEwsIChsb25nX3UpMHhmZjAwMDBMLCAobG9uZ191KTB4MDBmZjAwTCwgKGxvbmdfdSkweGZmZmYwMEwsCisgICAgKGxvbmdfdSkweDAwMDBmZkwsIChsb25nX3UpMHhmZjAwZmZMLCAobG9uZ191KTB4MDBmZmZmTCwgKGxvbmdfdSkweGZmZmZmZkwKK307CisKK3N0YXRpYyBjb25zdCBsb25nX3UgIGN0ZXJtX2NvbG9yXzE2WzE2XSA9Cit7CisgICAgKGxvbmdfdSkweDAwMDAwMEwsIChsb25nX3UpMHgwMDAwYzBMLCAobG9uZ191KTB4MDA4MDAwTCwgKGxvbmdfdSkweDAwNDA4MEwsCisgICAgKGxvbmdfdSkweGMwMDAwMEwsIChsb25nX3UpMHhjMDAwYzBMLCAobG9uZ191KTB4ODA4MDAwTCwgKGxvbmdfdSkweGMwYzBjMEwsCisgICAgKGxvbmdfdSkweDgwODA4MEwsIChsb25nX3UpMHg2MDYwZmZMLCAobG9uZ191KTB4MDBmZjAwTCwgKGxvbmdfdSkweDAwZmZmZkwsCisgICAgKGxvbmdfdSkweGZmODA4MEwsIChsb25nX3UpMHhmZjQwZmZMLCAobG9uZ191KTB4ZmZmZjAwTCwgKGxvbmdfdSkweGZmZmZmZkwKK307CisKK3N0YXRpYyBpbnQJCWN1cnJlbnRfc3luX2lkOworI2VuZGlmCisKKyNkZWZpbmUgUFJDT0xPUl9CTEFDSwkobG9uZ191KTAKKyNkZWZpbmUgUFJDT0xPUl9XSElURQkobG9uZ191KTB4RkZGRkZGTAorCitzdGF0aWMgaW50CWN1cnJfaXRhbGljOworc3RhdGljIGludAljdXJyX2JvbGQ7CitzdGF0aWMgaW50CWN1cnJfdW5kZXJsaW5lOworc3RhdGljIGxvbmdfdQljdXJyX2JnOworc3RhdGljIGxvbmdfdQljdXJyX2ZnOworc3RhdGljIGludAlwYWdlX2NvdW50OworCisvKgorICogVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUgcHJpbnQgcG9zaXRpb24gb24gYSBwYWdlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkJbGVhZF9zcGFjZXM7CSAgICAvKiByZW1haW5pbmcgc3BhY2VzIGZvciBhIFRBQiAqLworICAgIGludAkJcHJpbnRfcG9zOwkgICAgLyogdmlydHVhbCBjb2x1bW4gZm9yIGNvbXB1dGluZyBUQUJzICovCisgICAgY29sbnJfVAljb2x1bW47CQkgICAgLyogYnl0ZSBjb2x1bW4gKi8KKyAgICBsaW5lbnJfVAlmaWxlX2xpbmU7CSAgICAvKiBsaW5lIG5yIGluIHRoZSBidWZmZXIgKi8KKyAgICBsb25nX3UJYnl0ZXNfcHJpbnRlZDsJICAgIC8qIGJ5dGVzIHByaW50ZWQgc28gZmFyICovCisgICAgaW50CQlmZjsJCSAgICAvKiBzZWVuIGZvcm0gZmVlZCBjaGFyYWN0ZXIgKi8KK30gcHJ0X3Bvc19UOworCisjaWZkZWYgRkVBVF9TWU5fSEwKK3N0YXRpYyBsb25nX3UgZGFya2VuX3JnYiBfX0FSR1MoKGxvbmdfdSByZ2IpKTsKK3N0YXRpYyBsb25nX3UgcHJ0X2dldF90ZXJtX2NvbG9yIF9fQVJHUygoaW50IGNvbG9yaW5kZXgpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcHJ0X3NldF9mZyBfX0FSR1MoKGxvbmdfdSBmZykpOworc3RhdGljIHZvaWQgcHJ0X3NldF9iZyBfX0FSR1MoKGxvbmdfdSBiZykpOworc3RhdGljIHZvaWQgcHJ0X3NldF9mb250IF9fQVJHUygoaW50IGJvbGQsIGludCBpdGFsaWMsIGludCB1bmRlcmxpbmUpKTsKK3N0YXRpYyB2b2lkIHBydF9saW5lX251bWJlciBfX0FSR1MoKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MsIGludCBwYWdlX2xpbmUsIGxpbmVucl9UIGxudW0pKTsKK3N0YXRpYyB2b2lkIHBydF9oZWFkZXIgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBpbnQgcGFnZW51bSwgbGluZW5yX1QgbG51bSkpOworc3RhdGljIHZvaWQgcHJ0X21lc3NhZ2UgX19BUkdTKChjaGFyX3UgKnMpKTsKK3N0YXRpYyBjb2xucl9UIGhhcmRjb3B5X2xpbmUgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBpbnQgcGFnZV9saW5lLCBwcnRfcG9zX1QgKnBwb3MpKTsKK3N0YXRpYyB2b2lkIHBydF9nZXRfYXR0ciBfX0FSR1MoKGludCBobF9pZCwgcHJ0X3RleHRfYXR0cl9UKiBwYXR0ciwgaW50IG1vZGVjKSk7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorLyoKKyAqIElmIHVzaW5nIGEgZGFyayBiYWNrZ3JvdW5kLCB0aGUgY29sb3JzIHdpbGwgcHJvYmFibHkgYmUgdG9vIGJyaWdodCB0byBzaG93CisgKiB1cCB3ZWxsIG9uIHdoaXRlIHBhcGVyLCBzbyByZWR1Y2UgdGhlaXIgYnJpZ2h0bmVzcy4KKyAqLworICAgIHN0YXRpYyBsb25nX3UKK2Rhcmtlbl9yZ2IocmdiKQorICAgIGxvbmdfdQlyZ2I7Cit7CisgICAgcmV0dXJuCSgocmdiID4+IDE3KSA8PCAxNikKKwkgICAgKwkoKChyZ2IgJiAweGZmMDApID4+IDkpIDw8IDgpCisJICAgICsJKChyZ2IgJiAweGZmKSA+PiAxKTsKK30KKworICAgIHN0YXRpYyBsb25nX3UKK3BydF9nZXRfdGVybV9jb2xvcihjb2xvcmluZGV4KQorICAgIGludAkgICAgY29sb3JpbmRleDsKK3sKKyAgICAvKiBUT0RPOiBTaG91bGQgY2hlY2sgZm9yIHh0ZXJtIHdpdGggODggb3IgMjU2IGNvbG9ycy4gKi8KKyAgICBpZiAodF9jb2xvcnMgPiA4KQorCXJldHVybiBjdGVybV9jb2xvcl8xNltjb2xvcmluZGV4ICUgMTZdOworICAgIHJldHVybiBjdGVybV9jb2xvcl84W2NvbG9yaW5kZXggJSA4XTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfZ2V0X2F0dHIoaGxfaWQsIHBhdHRyLCBtb2RlYykKKyAgICBpbnQJCQlobF9pZDsKKyAgICBwcnRfdGV4dF9hdHRyX1QqCXBhdHRyOworICAgIGludAkJCW1vZGVjOworeworICAgIGludCAgICAgY29sb3JpbmRleDsKKyAgICBsb25nX3UgIGZnX2NvbG9yOworICAgIGxvbmdfdSAgYmdfY29sb3I7CisgICAgY2hhciAgICAqY29sb3I7CisKKyAgICBwYXR0ci0+Ym9sZCA9IChoaWdobGlnaHRfaGFzX2F0dHIoaGxfaWQsIEhMX0JPTEQsIG1vZGVjKSAhPSBOVUxMKTsKKyAgICBwYXR0ci0+aXRhbGljID0gKGhpZ2hsaWdodF9oYXNfYXR0cihobF9pZCwgSExfSVRBTElDLCBtb2RlYykgIT0gTlVMTCk7CisgICAgcGF0dHItPnVuZGVybGluZSA9IChoaWdobGlnaHRfaGFzX2F0dHIoaGxfaWQsIEhMX1VOREVSTElORSwgbW9kZWMpICE9IE5VTEwpOworCisjIGlmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCWJnX2NvbG9yID0gaGlnaGxpZ2h0X2d1aV9jb2xvcl9yZ2IoaGxfaWQsIEZBTFNFKTsKKwlpZiAoYmdfY29sb3IgPT0gUFJDT0xPUl9CTEFDSykKKwkgICAgYmdfY29sb3IgPSBQUkNPTE9SX1dISVRFOworCisJZmdfY29sb3IgPSBoaWdobGlnaHRfZ3VpX2NvbG9yX3JnYihobF9pZCwgVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyMgZW5kaWYKKyAgICB7CisJYmdfY29sb3IgPSBQUkNPTE9SX1dISVRFOworCisJY29sb3IgPSAoY2hhciAqKWhpZ2hsaWdodF9jb2xvcihobF9pZCwgKGNoYXJfdSAqKSJmZyIsIG1vZGVjKTsKKwlpZiAoY29sb3IgPT0gTlVMTCkKKwkgICAgY29sb3JpbmRleCA9IDA7CisJZWxzZQorCSAgICBjb2xvcmluZGV4ID0gYXRvaShjb2xvcik7CisKKwlpZiAoY29sb3JpbmRleCA+PSAwICYmIGNvbG9yaW5kZXggPCB0X2NvbG9ycykKKwkgICAgZmdfY29sb3IgPSBwcnRfZ2V0X3Rlcm1fY29sb3IoY29sb3JpbmRleCk7CisJZWxzZQorCSAgICBmZ19jb2xvciA9IFBSQ09MT1JfQkxBQ0s7CisgICAgfQorCisgICAgaWYgKGZnX2NvbG9yID09IFBSQ09MT1JfV0hJVEUpCisJZmdfY29sb3IgPSBQUkNPTE9SX0JMQUNLOworICAgIGVsc2UgaWYgKCpwX2JnID09ICdkJykKKwlmZ19jb2xvciA9IGRhcmtlbl9yZ2IoZmdfY29sb3IpOworCisgICAgcGF0dHItPmZnX2NvbG9yID0gZmdfY29sb3I7CisgICAgcGF0dHItPmJnX2NvbG9yID0gYmdfY29sb3I7Cit9CisjZW5kaWYgLyogRkVBVF9TWU5fSEwgKi8KKworICAgIHN0YXRpYyB2b2lkCitwcnRfc2V0X2ZnKGZnKQorICAgIGxvbmdfdSBmZzsKK3sKKyAgICBpZiAoZmcgIT0gY3Vycl9mZykKKyAgICB7CisJY3Vycl9mZyA9IGZnOworCW1jaF9wcmludF9zZXRfZmcoZmcpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfc2V0X2JnKGJnKQorICAgIGxvbmdfdSBiZzsKK3sKKyAgICBpZiAoYmcgIT0gY3Vycl9iZykKKyAgICB7CisJY3Vycl9iZyA9IGJnOworCW1jaF9wcmludF9zZXRfYmcoYmcpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfc2V0X2ZvbnQoYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUpCisgICAgaW50CQlib2xkOworICAgIGludAkJaXRhbGljOworICAgIGludAkJdW5kZXJsaW5lOworeworICAgIGlmIChjdXJyX2JvbGQgIT0gYm9sZAorCSAgICB8fCBjdXJyX2l0YWxpYyAhPSBpdGFsaWMKKwkgICAgfHwgY3Vycl91bmRlcmxpbmUgIT0gdW5kZXJsaW5lKQorICAgIHsKKwljdXJyX3VuZGVybGluZSA9IHVuZGVybGluZTsKKwljdXJyX2l0YWxpYyA9IGl0YWxpYzsKKwljdXJyX2JvbGQgPSBib2xkOworCW1jaF9wcmludF9zZXRfZm9udChib2xkLCBpdGFsaWMsIHVuZGVybGluZSk7CisgICAgfQorfQorCisvKgorICogUHJpbnQgdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBsZWZ0IG1hcmdpbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwcnRfbGluZV9udW1iZXIocHNldHRpbmdzLCBwYWdlX2xpbmUsIGxudW0pCisgICAgcHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5nczsKKyAgICBpbnQJCXBhZ2VfbGluZTsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJdGJ1ZlsyMF07CisKKyAgICBwcnRfc2V0X2ZnKHBzZXR0aW5ncy0+bnVtYmVyLmZnX2NvbG9yKTsKKyAgICBwcnRfc2V0X2JnKHBzZXR0aW5ncy0+bnVtYmVyLmJnX2NvbG9yKTsKKyAgICBwcnRfc2V0X2ZvbnQocHNldHRpbmdzLT5udW1iZXIuYm9sZCwgcHNldHRpbmdzLT5udW1iZXIuaXRhbGljLCBwc2V0dGluZ3MtPm51bWJlci51bmRlcmxpbmUpOworICAgIG1jaF9wcmludF9zdGFydF9saW5lKFRSVUUsIHBhZ2VfbGluZSk7CisKKyAgICAvKiBMZWF2ZSB0d28gc3BhY2VzIGJldHdlZW4gdGhlIG51bWJlciBhbmQgdGhlIHRleHQ7IGRlcGVuZHMgb24KKyAgICAgKiBQUklOVF9OVU1CRVJfV0lEVEguICovCisgICAgc3ByaW50ZigoY2hhciAqKXRidWYsICIlNmxkIiwgKGxvbmcpbG51bSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkodm9pZCltY2hfcHJpbnRfdGV4dF9vdXQoJnRidWZbaV0sIDEpOworCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICBpZiAocHNldHRpbmdzLT5kb19zeW50YXgpCisJLyogU2V0IGNvbG9ycyBmb3IgbmV4dCBjaGFyYWN0ZXIuICovCisJY3VycmVudF9zeW5faWQgPSAtMTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJLyogU2V0IGNvbG9ycyBhbmQgZm9udCBiYWNrIHRvIG5vcm1hbC4gKi8KKwlwcnRfc2V0X2ZnKFBSQ09MT1JfQkxBQ0spOworCXBydF9zZXRfYmcoUFJDT0xPUl9XSElURSk7CisJcHJ0X3NldF9mb250KEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIH0KK30KKworc3RhdGljIGxpbmVucl9UIHByaW50ZXJfcGFnZV9udW07CisKKyAgICBpbnQKK2dldF9wcmludGVyX3BhZ2VfbnVtKCkKK3sKKyAgICByZXR1cm4gcHJpbnRlcl9wYWdlX251bTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudGx5IGVmZmVjdGl2ZSBoZWFkZXIgaGVpZ2h0LgorICovCisgICAgaW50CitwcnRfaGVhZGVyX2hlaWdodCgpCit7CisgICAgaWYgKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfSEVBREVSSEVJR0hUXS5wcmVzZW50KQorCXJldHVybiBwcmludGVyX29wdHNbT1BUX1BSSU5UX0hFQURFUkhFSUdIVF0ubnVtYmVyOworICAgIHJldHVybiAyOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdXNpbmcgYSBsaW5lIG51bWJlciBmb3IgcHJpbnRpbmcuCisgKi8KKyAgICBpbnQKK3BydF91c2VfbnVtYmVyKCkKK3sKKyAgICByZXR1cm4gKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfTlVNQkVSXS5wcmVzZW50CisJICAgICYmIFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfTlVNQkVSXS5zdHJpbmdbMF0pID09ICd5Jyk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHVuaXQgdXNlZCBpbiBhIG1hcmdpbiBpdGVtIGluICdwcmludG9wdGlvbnMnLgorICogUmV0dXJucyBQUlRfVU5JVF9OT05FIGlmIG5vdCByZWNvZ25pemVkLgorICovCisgICAgaW50CitwcnRfZ2V0X3VuaXQoaWR4KQorICAgIGludAkJaWR4OworeworICAgIGludAkJdSA9IFBSVF9VTklUX05PTkU7CisgICAgaW50CQlpOworICAgIHN0YXRpYyBjaGFyICoodW5pdHNbNF0pID0gUFJUX1VOSVRfTkFNRVM7CisKKyAgICBpZiAocHJpbnRlcl9vcHRzW2lkeF0ucHJlc2VudCkKKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCSAgICBpZiAoU1RSTklDTVAocHJpbnRlcl9vcHRzW2lkeF0uc3RyaW5nLCB1bml0c1tpXSwgMikgPT0gMCkKKwkgICAgeworCQl1ID0gaTsKKwkJYnJlYWs7CisJICAgIH0KKyAgICByZXR1cm4gdTsKK30KKworLyoKKyAqIFByaW50IHRoZSBwYWdlIGhlYWRlci4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3BydF9oZWFkZXIocHNldHRpbmdzLCBwYWdlbnVtLCBsbnVtKQorICAgIHBydF9zZXR0aW5nc19UICAqcHNldHRpbmdzOworICAgIGludAkJcGFnZW51bTsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGludAkJd2lkdGggPSBwc2V0dGluZ3MtPmNoYXJzX3Blcl9saW5lOworICAgIGludAkJcGFnZV9saW5lOworICAgIGNoYXJfdQkqdGJ1ZjsKKyAgICBjaGFyX3UJKnA7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJbDsKKyNlbmRpZgorCisgICAgLyogQWxzbyB1c2UgdGhlIHNwYWNlIGZvciB0aGUgbGluZSBudW1iZXIuICovCisgICAgaWYgKHBydF91c2VfbnVtYmVyKCkpCisJd2lkdGggKz0gUFJJTlRfTlVNQkVSX1dJRFRIOworCisgICAgdGJ1ZiA9IGFsbG9jKHdpZHRoICsgSU9TSVpFKTsKKyAgICBpZiAodGJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfU1RMX09QVAorICAgIGlmICgqcF9oZWFkZXIgIT0gTlVMKQorICAgIHsKKwlsaW5lbnJfVAl0bXBfbG51bSwgdG1wX3RvcGxpbmUsIHRtcF9ib3RsaW5lOworCisJLyoKKwkgKiBOZWVkIHRvICh0ZW1wb3JhcmlseSkgc2V0IGN1cnJlbnQgbGluZSBudW1iZXIgYW5kIGZpcnN0L2xhc3QgbGluZQorCSAqIG51bWJlciBvbiB0aGUgJ3dpbmRvdycuICBTaW5jZSB3ZSBkb24ndCBrbm93IGhvdyBsb25nIHRoZSBwYWdlIGlzLAorCSAqIHNldCB0aGUgZmlyc3QgYW5kIGN1cnJlbnQgbGluZSBudW1iZXIgdG8gdGhlIHRvcCBsaW5lLCBhbmQgZ3Vlc3MKKwkgKiB0aGF0IHRoZSBwYWdlIGxlbmd0aCBpcyA2NC4KKwkgKi8KKwl0bXBfbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwl0bXBfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworCXRtcF9ib3RsaW5lID0gY3Vyd2luLT53X2JvdGxpbmU7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwljdXJ3aW4tPndfdG9wbGluZSA9IGxudW07CisJY3Vyd2luLT53X2JvdGxpbmUgPSBsbnVtICsgNjM7CisJcHJpbnRlcl9wYWdlX251bSA9IHBhZ2VudW07CisKKwlidWlsZF9zdGxfc3RyX2hsKGN1cndpbiwgdGJ1ZiwgKHNpemVfdCkod2lkdGggKyBJT1NJWkUpLAorCQkJCQkJICBwX2hlYWRlciwgJyAnLCB3aWR0aCwgTlVMTCk7CisKKwkvKiBSZXNldCBsaW5lIG51bWJlcnMgKi8KKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0bXBfbG51bTsKKwljdXJ3aW4tPndfdG9wbGluZSA9IHRtcF90b3BsaW5lOworCWN1cndpbi0+d19ib3RsaW5lID0gdG1wX2JvdGxpbmU7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCXNwcmludGYoKGNoYXIgKil0YnVmLCBfKCJQYWdlICVkIiksIHBhZ2VudW0pOworCisgICAgcHJ0X3NldF9mZyhQUkNPTE9SX0JMQUNLKTsKKyAgICBwcnRfc2V0X2JnKFBSQ09MT1JfV0hJVEUpOworICAgIHBydF9zZXRfZm9udChUUlVFLCBGQUxTRSwgRkFMU0UpOworCisgICAgLyogVXNlIGEgbmVnYXRpdmUgbGluZSBudW1iZXIgdG8gaW5kaWNhdGUgcHJpbnRpbmcgaW4gdGhlIHRvcCBtYXJnaW4uICovCisgICAgcGFnZV9saW5lID0gMCAtIHBydF9oZWFkZXJfaGVpZ2h0KCk7CisgICAgbWNoX3ByaW50X3N0YXJ0X2xpbmUoVFJVRSwgcGFnZV9saW5lKTsKKyAgICBmb3IgKHAgPSB0YnVmOyAqcCAhPSBOVUw7ICkKKyAgICB7CisJaWYgKG1jaF9wcmludF90ZXh0X291dChwLAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKQorI2Vsc2UKKwkJMQorI2VuZGlmCisJCSAgICApKQorCXsKKwkgICAgKytwYWdlX2xpbmU7CisJICAgIGlmIChwYWdlX2xpbmUgPj0gMCkgLyogb3V0IG9mIHJvb20gaW4gaGVhZGVyICovCisJCWJyZWFrOworCSAgICBtY2hfcHJpbnRfc3RhcnRfbGluZShUUlVFLCBwYWdlX2xpbmUpOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJcCArPSBsOworI2Vsc2UKKwlwKys7CisjZW5kaWYKKyAgICB9CisKKyAgICB2aW1fZnJlZSh0YnVmKTsKKworI2lmZGVmIEZFQVRfU1lOX0hMCisgICAgaWYgKHBzZXR0aW5ncy0+ZG9fc3ludGF4KQorCS8qIFNldCBjb2xvcnMgZm9yIG5leHQgY2hhcmFjdGVyLiAqLworCWN1cnJlbnRfc3luX2lkID0gLTE7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qIFNldCBjb2xvcnMgYW5kIGZvbnQgYmFjayB0byBub3JtYWwuICovCisJcHJ0X3NldF9mZyhQUkNPTE9SX0JMQUNLKTsKKwlwcnRfc2V0X2JnKFBSQ09MT1JfV0hJVEUpOworCXBydF9zZXRfZm9udChGQUxTRSwgRkFMU0UsIEZBTFNFKTsKKyAgICB9Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgcHJpbnQgc3RhdHVzIG1lc3NhZ2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJ0X21lc3NhZ2UocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgc2NyZWVuX2ZpbGwoKGludClSb3dzIC0gMSwgKGludClSb3dzLCAwLCAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKyAgICBzY3JlZW5fcHV0cyhzLCAoaW50KVJvd3MgLSAxLCAwLCBobF9hdHRyKEhMRl9SKSk7CisgICAgb3V0X2ZsdXNoKCk7Cit9CisKKyAgICB2b2lkCitleF9oYXJkY29weShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGxpbmVucl9UCQlsbnVtOworICAgIGludAkJCWNvbGxhdGVkX2NvcGllcywgdW5jb2xsYXRlZF9jb3BpZXM7CisgICAgcHJ0X3NldHRpbmdzX1QJc2V0dGluZ3M7CisgICAgbG9uZ191CQlieXRlc190b19wcmludCA9IDA7CisgICAgaW50CQkJcGFnZV9saW5lOworICAgIGludAkJCWpvYnNwbGl0OworICAgIGludAkJCWlkOworCisgICAgbWVtc2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKHBydF9zZXR0aW5nc19UKSk7CisgICAgc2V0dGluZ3MuaGFzX2NvbG9yID0gVFJVRTsKKworIyBpZmRlZiBGRUFUX1BPU1RTQ1JJUFQKKyAgICBpZiAoKmVhcC0+YXJnID09ICc+JykKKyAgICB7CisJY2hhcl91CSplcnJvcm1zZyA9IE5VTEw7CisKKwkvKiBFeHBhbmQgdGhpbmdzIGxpa2UgIiUucHMiLiAqLworCWlmIChleHBhbmRfZmlsZW5hbWUoZWFwLCBlYXAtPmNtZGxpbmVwLCAmZXJyb3Jtc2cpID09IEZBSUwpCisJeworCSAgICBpZiAoZXJyb3Jtc2cgIT0gTlVMTCkKKwkJRU1TRyhlcnJvcm1zZyk7CisJICAgIHJldHVybjsKKwl9CisJc2V0dGluZ3Mub3V0ZmlsZSA9IHNraXB3aGl0ZShlYXAtPmFyZyArIDEpOworICAgIH0KKyAgICBlbHNlIGlmICgqZWFwLT5hcmcgIT0gTlVMKQorCXNldHRpbmdzLmFyZ3VtZW50cyA9IGVhcC0+YXJnOworIyBlbmRpZgorCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIGZvciBwcmludGluZy4gIEFzayB0aGUgdXNlciBmb3Igc2V0dGluZ3MsIHVubGVzcyBmb3JjZWl0IGlzCisgICAgICogc2V0LgorICAgICAqIFRoZSBtY2hfcHJpbnRfaW5pdCgpIGNvZGUgc2hvdWxkIHNldCB1cCBtYXJnaW5zIGlmIGFwcGxpY2FibGUuIChJdCBtYXkKKyAgICAgKiBub3QgYmUgYSByZWFsIHByaW50ZXIgLSBmb3IgZXhhbXBsZSB0aGUgZW5naW5lIG1pZ2h0IGdlbmVyYXRlIEhUTUwgb3IKKyAgICAgKiBQUy4pCisgICAgICovCisgICAgaWYgKG1jaF9wcmludF9pbml0KCZzZXR0aW5ncywKKwkJCWN1cmJ1Zi0+Yl9mbmFtZSA9PSBOVUxMCisJCQkgICAgPyAoY2hhcl91ICopYnVmX3NwbmFtZShjdXJidWYpCisJCQkgICAgOiBjdXJidWYtPmJfc2ZuYW1lID09IE5VTEwKKwkJCQk/IGN1cmJ1Zi0+Yl9mbmFtZQorCQkJCTogY3VyYnVmLT5iX3NmbmFtZSwKKwkJCWVhcC0+Zm9yY2VpdCkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorIyBpZmRlZiAgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlzZXR0aW5ncy5tb2RlYyA9ICdnJzsKKyAgICBlbHNlCisjIGVuZGlmCisJaWYgKHRfY29sb3JzID4gMSkKKwkgICAgc2V0dGluZ3MubW9kZWMgPSAnYyc7CisJZWxzZQorCSAgICBzZXR0aW5ncy5tb2RlYyA9ICd0JzsKKworICAgIGlmICghc3ludGF4X3ByZXNlbnQoY3VyYnVmKSkKKwlzZXR0aW5ncy5kb19zeW50YXggPSBGQUxTRTsKKyAgICBlbHNlIGlmIChwcmludGVyX29wdHNbT1BUX1BSSU5UX1NZTlRBWF0ucHJlc2VudAorCSAgICAmJiBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX1NZTlRBWF0uc3RyaW5nWzBdKSAhPSAnYScpCisJc2V0dGluZ3MuZG9fc3ludGF4ID0KKwkgICAgICAgKFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfU1lOVEFYXS5zdHJpbmdbMF0pID09ICd5Jyk7CisgICAgZWxzZQorCXNldHRpbmdzLmRvX3N5bnRheCA9IHNldHRpbmdzLmhhc19jb2xvcjsKKyNlbmRpZgorCisgICAgLyogU2V0IHVwIHByaW50aW5nIGF0dHJpYnV0ZXMgZm9yIGxpbmUgbnVtYmVycyAqLworICAgIHNldHRpbmdzLm51bWJlci5mZ19jb2xvciA9IFBSQ09MT1JfQkxBQ0s7CisgICAgc2V0dGluZ3MubnVtYmVyLmJnX2NvbG9yID0gUFJDT0xPUl9XSElURTsKKyAgICBzZXR0aW5ncy5udW1iZXIuYm9sZCA9IEZBTFNFOworICAgIHNldHRpbmdzLm51bWJlci5pdGFsaWMgPSBUUlVFOworICAgIHNldHRpbmdzLm51bWJlci51bmRlcmxpbmUgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIC8qCisgICAgICogU3ludGF4IGhpZ2hsaWdodGluZyBvZiBsaW5lIG51bWJlcnMuCisgICAgICovCisgICAgaWYgKHBydF91c2VfbnVtYmVyKCkgJiYgc2V0dGluZ3MuZG9fc3ludGF4KQorICAgIHsKKwlpZCA9IHN5bl9uYW1lMmlkKChjaGFyX3UgKikiTGluZU5yIik7CisJaWYgKGlkID4gMCkKKwkgICAgaWQgPSBzeW5fZ2V0X2ZpbmFsX2lkKGlkKTsKKworCXBydF9nZXRfYXR0cihpZCwgJnNldHRpbmdzLm51bWJlciwgc2V0dGluZ3MubW9kZWMpOworICAgIH0KKyNlbmRpZiAvKiBGRUFUX1NZTl9ITCAqLworCisgICAgLyoKKyAgICAgKiBFc3RpbWF0ZSB0aGUgdG90YWwgbGluZXMgdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIGZvciAobG51bSA9IGVhcC0+bGluZTE7IGxudW0gPD0gZWFwLT5saW5lMjsgbG51bSsrKQorCWJ5dGVzX3RvX3ByaW50ICs9IChsb25nX3UpU1RSTEVOKHNraXB3aGl0ZShtbF9nZXQobG51bSkpKTsKKyAgICBpZiAoYnl0ZXNfdG9fcHJpbnQgPT0gMCkKKyAgICB7CisJTVNHKF8oIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIpKTsKKwlnb3RvIHByaW50X2ZhaWxfbm9fYmVnaW47CisgICAgfQorCisgICAgLyogU2V0IGNvbG9ycyBhbmQgZm9udCB0byBub3JtYWwuICovCisgICAgY3Vycl9iZyA9IChsb25nX3UpMHhmZmZmZmZmZkw7CisgICAgY3Vycl9mZyA9IChsb25nX3UpMHhmZmZmZmZmZkw7CisgICAgY3Vycl9pdGFsaWMgPSBNQVlCRTsKKyAgICBjdXJyX2JvbGQgPSBNQVlCRTsKKyAgICBjdXJyX3VuZGVybGluZSA9IE1BWUJFOworCisgICAgcHJ0X3NldF9mZyhQUkNPTE9SX0JMQUNLKTsKKyAgICBwcnRfc2V0X2JnKFBSQ09MT1JfV0hJVEUpOworICAgIHBydF9zZXRfZm9udChGQUxTRSwgRkFMU0UsIEZBTFNFKTsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGN1cnJlbnRfc3luX2lkID0gLTE7CisjZW5kaWYKKworICAgIGpvYnNwbGl0ID0gKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfSk9CU1BMSVRdLnByZXNlbnQKKwkgICAmJiBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX0pPQlNQTElUXS5zdHJpbmdbMF0pID09ICd5Jyk7CisKKyAgICBpZiAoIW1jaF9wcmludF9iZWdpbigmc2V0dGluZ3MpKQorCWdvdG8gcHJpbnRfZmFpbF9ub19iZWdpbjsKKworICAgIC8qCisgICAgICogTG9vcCBvdmVyIGNvbGxhdGVkIGNvcGllczogMSAyIDMsIDEgMiAzLCAuLi4KKyAgICAgKi8KKyAgICBwYWdlX2NvdW50ID0gMDsKKyAgICBmb3IgKGNvbGxhdGVkX2NvcGllcyA9IDA7CisJICAgIGNvbGxhdGVkX2NvcGllcyA8IHNldHRpbmdzLm5fY29sbGF0ZWRfY29waWVzOworCSAgICBjb2xsYXRlZF9jb3BpZXMrKykKKyAgICB7CisJcHJ0X3Bvc19UCXBydHBvczsJCS8qIGN1cnJlbnQgcHJpbnQgcG9zaXRpb24gKi8KKwlwcnRfcG9zX1QJcGFnZV9wcnRwb3M7CS8qIHByaW50IHBvc2l0aW9uIGF0IHBhZ2Ugc3RhcnQgKi8KKwlpbnQJCXNpZGU7CisKKwltZW1zZXQoJnBhZ2VfcHJ0cG9zLCAwLCBzaXplb2YocHJ0X3Bvc19UKSk7CisJcGFnZV9wcnRwb3MuZmlsZV9saW5lID0gZWFwLT5saW5lMTsKKwlwcnRwb3MgPSBwYWdlX3BydHBvczsKKworCWlmIChqb2JzcGxpdCAmJiBjb2xsYXRlZF9jb3BpZXMgPiAwKQorCXsKKwkgICAgLyogU3BsaXR0aW5nIGpvYnM6IFN0b3AgYSBwcmV2aW91cyBqb2IgYW5kIHN0YXJ0IGEgbmV3IG9uZS4gKi8KKwkgICAgbWNoX3ByaW50X2VuZCgmc2V0dGluZ3MpOworCSAgICBpZiAoIW1jaF9wcmludF9iZWdpbigmc2V0dGluZ3MpKQorCQlnb3RvIHByaW50X2ZhaWxfbm9fYmVnaW47CisJfQorCisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIHBhZ2VzIGluIHRoZSBwcmludCBqb2I6IDEgMiAzIC4uLgorCSAqLworCWZvciAocGFnZV9jb3VudCA9IDA7IHBydHBvcy5maWxlX2xpbmUgPD0gZWFwLT5saW5lMjsgKytwYWdlX2NvdW50KQorCXsKKwkgICAgLyoKKwkgICAgICogTG9vcCBvdmVyIHVuY29sbGF0ZWQgY29waWVzOiAxIDEgMSwgMiAyIDIsIDMgMyAzLCAuLi4KKwkgICAgICogRm9yIGR1cGxleDogMTIgMTIgMTIgMzQgMzQgMzQsIC4uLgorCSAgICAgKi8KKwkgICAgZm9yICh1bmNvbGxhdGVkX2NvcGllcyA9IDA7CisJCSAgICB1bmNvbGxhdGVkX2NvcGllcyA8IHNldHRpbmdzLm5fdW5jb2xsYXRlZF9jb3BpZXM7CisJCSAgICB1bmNvbGxhdGVkX2NvcGllcysrKQorCSAgICB7CisJCS8qIFNldCB0aGUgcHJpbnQgcG9zaXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoaXMgcGFnZS4gKi8KKwkJcHJ0cG9zID0gcGFnZV9wcnRwb3M7CisKKwkJLyoKKwkJICogRG8gZnJvbnQgYW5kIHJlYXIgc2lkZSBvZiBhIHBhZ2UuCisJCSAqLworCQlmb3IgKHNpZGUgPSAwOyBzaWRlIDw9IHNldHRpbmdzLmR1cGxleDsgKytzaWRlKQorCQl7CisJCSAgICAvKgorCQkgICAgICogUHJpbnQgb25lIHBhZ2UuCisJCSAgICAgKi8KKworCQkgICAgLyogQ2hlY2sgZm9yIGludGVycnVwdCBjaGFyYWN0ZXIgZXZlcnkgcGFnZS4gKi8KKwkJICAgIHVpX2JyZWFrY2hlY2soKTsKKwkJICAgIGlmIChnb3RfaW50IHx8IHNldHRpbmdzLnVzZXJfYWJvcnQpCisJCQlnb3RvIHByaW50X2ZhaWw7CisKKwkJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIiksCisJCQkgICAgcGFnZV9jb3VudCArIDEgKyBzaWRlLAorCQkJICAgIHBydHBvcy5ieXRlc19wcmludGVkID4gMTAwMDAwMAorCQkJCT8gKGludCkocHJ0cG9zLmJ5dGVzX3ByaW50ZWQgLworCQkJCQkJICAgICAgIChieXRlc190b19wcmludCAvIDEwMCkpCisJCQkJOiAoaW50KSgocHJ0cG9zLmJ5dGVzX3ByaW50ZWQgKiAxMDApCisJCQkJCQkJICAgLyBieXRlc190b19wcmludCkpOworCQkgICAgaWYgKCFtY2hfcHJpbnRfYmVnaW5fcGFnZShJT2J1ZmYpKQorCQkJZ290byBwcmludF9mYWlsOworCisJCSAgICBpZiAoc2V0dGluZ3Mubl9jb2xsYXRlZF9jb3BpZXMgPiAxKQorCQkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiArIFNUUkxFTihJT2J1ZmYpLAorCQkJCV8oIiBDb3B5ICVkIG9mICVkIiksCisJCQkJY29sbGF0ZWRfY29waWVzICsgMSwKKwkJCQlzZXR0aW5ncy5uX2NvbGxhdGVkX2NvcGllcyk7CisJCSAgICBwcnRfbWVzc2FnZShJT2J1ZmYpOworCisJCSAgICAvKgorCQkgICAgICogT3V0cHV0IGhlYWRlciBpZiByZXF1aXJlZAorCQkgICAgICovCisJCSAgICBpZiAocHJ0X2hlYWRlcl9oZWlnaHQoKSA+IDApCisJCQlwcnRfaGVhZGVyKCZzZXR0aW5ncywgcGFnZV9jb3VudCArIDEgKyBzaWRlLAorCQkJCQkJCXBydHBvcy5maWxlX2xpbmUpOworCisJCSAgICBmb3IgKHBhZ2VfbGluZSA9IDA7IHBhZ2VfbGluZSA8IHNldHRpbmdzLmxpbmVzX3Blcl9wYWdlOworCQkJCQkJCQkgICsrcGFnZV9saW5lKQorCQkgICAgeworCQkJcHJ0cG9zLmNvbHVtbiA9IGhhcmRjb3B5X2xpbmUoJnNldHRpbmdzLAorCQkJCQkJCSAgIHBhZ2VfbGluZSwgJnBydHBvcyk7CisJCQlpZiAocHJ0cG9zLmNvbHVtbiA9PSAwKQorCQkJeworCQkJICAgIC8qIGZpbmlzaGVkIGEgZmlsZSBsaW5lICovCisJCQkgICAgcHJ0cG9zLmJ5dGVzX3ByaW50ZWQgKz0KKwkJCQkgIFNUUkxFTihza2lwd2hpdGUobWxfZ2V0KHBydHBvcy5maWxlX2xpbmUpKSk7CisJCQkgICAgaWYgKCsrcHJ0cG9zLmZpbGVfbGluZSA+IGVhcC0+bGluZTIpCisJCQkJYnJlYWs7IC8qIHJlYWNoZWQgdGhlIGVuZCAqLworCQkJfQorCQkJZWxzZSBpZiAocHJ0cG9zLmZmKQorCQkJeworCQkJICAgIC8qIExpbmUgaGFkIGEgZm9ybWZlZWQgaW4gaXQgLSBzdGFydCBuZXcgcGFnZSBidXQKKwkJCSAgICAgKiBzdGF5IG9uIHRoZSBjdXJyZW50IGxpbmUgKi8KKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgaWYgKCFtY2hfcHJpbnRfZW5kX3BhZ2UoKSkKKwkJCWdvdG8gcHJpbnRfZmFpbDsKKwkJICAgIGlmIChwcnRwb3MuZmlsZV9saW5lID4gZWFwLT5saW5lMikKKwkJCWJyZWFrOyAvKiByZWFjaGVkIHRoZSBlbmQgKi8KKwkJfQorCisJCS8qCisJCSAqIEV4dHJhIGJsYW5rIHBhZ2UgZm9yIGR1cGxleGluZyB3aXRoIG9kZCBudW1iZXIgb2YgcGFnZXMgYW5kCisJCSAqIG1vcmUgY29waWVzIHRvIGNvbWUuCisJCSAqLworCQlpZiAocHJ0cG9zLmZpbGVfbGluZSA+IGVhcC0+bGluZTIgJiYgc2V0dGluZ3MuZHVwbGV4CisJCQkJCQkJCSAmJiBzaWRlID09IDAKKwkJICAgICYmIHVuY29sbGF0ZWRfY29waWVzICsgMSA8IHNldHRpbmdzLm5fdW5jb2xsYXRlZF9jb3BpZXMpCisJCXsKKwkJICAgIGlmICghbWNoX3ByaW50X2JsYW5rX3BhZ2UoKSkKKwkJCWdvdG8gcHJpbnRfZmFpbDsKKwkJfQorCSAgICB9CisJICAgIGlmIChzZXR0aW5ncy5kdXBsZXggJiYgcHJ0cG9zLmZpbGVfbGluZSA8PSBlYXAtPmxpbmUyKQorCQkrK3BhZ2VfY291bnQ7CisKKwkgICAgLyogUmVtZW1iZXIgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IHBhZ2Ugc3RhcnRzLiAqLworCSAgICBwYWdlX3BydHBvcyA9IHBydHBvczsKKwl9CisKKwlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJQcmludGVkOiAlcyIpLCBzZXR0aW5ncy5qb2JuYW1lKTsKKwlwcnRfbWVzc2FnZShJT2J1ZmYpOworICAgIH0KKworcHJpbnRfZmFpbDoKKyAgICBpZiAoZ290X2ludCB8fCBzZXR0aW5ncy51c2VyX2Fib3J0KQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJQcmludGluZyBhYm9ydGVkIikpOworCXBydF9tZXNzYWdlKElPYnVmZik7CisgICAgfQorICAgIG1jaF9wcmludF9lbmQoJnNldHRpbmdzKTsKKworcHJpbnRfZmFpbF9ub19iZWdpbjoKKyAgICBtY2hfcHJpbnRfY2xlYW51cCgpOworfQorCisvKgorICogUHJpbnQgb25lIHBhZ2UgbGluZS4KKyAqIFJldHVybiB0aGUgbmV4dCBjb2x1bW4gdG8gcHJpbnQsIG9yIHplcm8gaWYgdGhlIGxpbmUgaXMgZmluaXNoZWQuCisgKi8KKyAgICBzdGF0aWMgY29sbnJfVAoraGFyZGNvcHlfbGluZShwc2V0dGluZ3MsIHBhZ2VfbGluZSwgcHBvcykKKyAgICBwcnRfc2V0dGluZ3NfVAkqcHNldHRpbmdzOworICAgIGludAkJCXBhZ2VfbGluZTsKKyAgICBwcnRfcG9zX1QJCSpwcG9zOworeworICAgIGNvbG5yX1QJY29sOworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCW5lZWRfYnJlYWsgPSBGQUxTRTsKKyAgICBpbnQJCW91dHB1dGxlbjsKKyAgICBpbnQJCXRhYl9zcGFjZXM7CisgICAgbG9uZ191CXByaW50X3BvczsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIHBydF90ZXh0X2F0dHJfVCBhdHRyOworICAgIGludAkJaWQ7CisjZW5kaWYKKworICAgIGlmIChwcG9zLT5jb2x1bW4gPT0gMCB8fCBwcG9zLT5mZikKKyAgICB7CisJcHJpbnRfcG9zID0gMDsKKwl0YWJfc3BhY2VzID0gMDsKKwlpZiAoIXBwb3MtPmZmICYmIHBydF91c2VfbnVtYmVyKCkpCisJICAgIHBydF9saW5lX251bWJlcihwc2V0dGluZ3MsIHBhZ2VfbGluZSwgcHBvcy0+ZmlsZV9saW5lKTsKKwlwcG9zLT5mZiA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIGxlZnQgb3ZlciBmcm9tIHdyYXAgaGFsZndheSBhIHRhYiAqLworCXByaW50X3BvcyA9IHBwb3MtPnByaW50X3BvczsKKwl0YWJfc3BhY2VzID0gcHBvcy0+bGVhZF9zcGFjZXM7CisgICAgfQorCisgICAgbWNoX3ByaW50X3N0YXJ0X2xpbmUoMCwgcGFnZV9saW5lKTsKKyAgICBsaW5lID0gbWxfZ2V0KHBwb3MtPmZpbGVfbGluZSk7CisKKyAgICAvKgorICAgICAqIExvb3Agb3ZlciB0aGUgY29sdW1ucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlIGxpbmUgb3IgcmlnaHQgbWFyZ2luLgorICAgICAqLworICAgIGZvciAoY29sID0gcHBvcy0+Y29sdW1uOyBsaW5lW2NvbF0gIT0gTlVMICYmICFuZWVkX2JyZWFrOyBjb2wgKz0gb3V0cHV0bGVuKQorICAgIHsKKwlvdXRwdXRsZW4gPSAxOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlICYmIChvdXRwdXRsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKGxpbmUgKyBjb2wpKSA8IDEpCisJICAgIG91dHB1dGxlbiA9IDE7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NZTl9ITAorCS8qCisJICogc3ludGF4IGhpZ2hsaWdodGluZyBzdHVmZi4KKwkgKi8KKwlpZiAocHNldHRpbmdzLT5kb19zeW50YXgpCisJeworCSAgICBpZCA9IHN5bl9nZXRfaWQocHBvcy0+ZmlsZV9saW5lLCAobG9uZyljb2wsIDEpOworCSAgICBpZiAoaWQgPiAwKQorCQlpZCA9IHN5bl9nZXRfZmluYWxfaWQoaWQpOworCSAgICBlbHNlCisJCWlkID0gMDsKKwkgICAgLyogR2V0IHRoZSBsaW5lIGFnYWluLCBhIG11bHRpLWxpbmUgcmVnZXhwIG1heSBpbnZhbGlkYXRlIGl0LiAqLworCSAgICBsaW5lID0gbWxfZ2V0KHBwb3MtPmZpbGVfbGluZSk7CisKKwkgICAgaWYgKGlkICE9IGN1cnJlbnRfc3luX2lkKQorCSAgICB7CisJCWN1cnJlbnRfc3luX2lkID0gaWQ7CisJCXBydF9nZXRfYXR0cihpZCwgJmF0dHIsIHBzZXR0aW5ncy0+bW9kZWMpOworCQlwcnRfc2V0X2ZvbnQoYXR0ci5ib2xkLCBhdHRyLml0YWxpYywgYXR0ci51bmRlcmxpbmUpOworCQlwcnRfc2V0X2ZnKGF0dHIuZmdfY29sb3IpOworCQlwcnRfc2V0X2JnKGF0dHIuYmdfY29sb3IpOworCSAgICB9CisJfQorI2VuZGlmIC8qIEZFQVRfU1lOX0hMICovCisKKwkvKgorCSAqIEFwcHJvcHJpYXRlbHkgZXhwYW5kIGFueSB0YWJzIHRvIHNwYWNlcy4KKwkgKi8KKwlpZiAobGluZVtjb2xdID09IFRBQiB8fCB0YWJfc3BhY2VzICE9IDApCisJeworCSAgICBpZiAodGFiX3NwYWNlcyA9PSAwKQorCQl0YWJfc3BhY2VzID0gY3VyYnVmLT5iX3BfdHMgLSAocHJpbnRfcG9zICUgY3VyYnVmLT5iX3BfdHMpOworCisJICAgIHdoaWxlICh0YWJfc3BhY2VzID4gMCkKKwkgICAgeworCQluZWVkX2JyZWFrID0gbWNoX3ByaW50X3RleHRfb3V0KChjaGFyX3UgKikiICIsIDEpOworCQlwcmludF9wb3MrKzsKKwkJdGFiX3NwYWNlcy0tOworCQlpZiAobmVlZF9icmVhaykKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIC8qIEtlZXAgdGhlIFRBQiBpZiB3ZSBkaWRuJ3QgZmluaXNoIGl0LiAqLworCSAgICBpZiAobmVlZF9icmVhayAmJiB0YWJfc3BhY2VzID4gMCkKKwkJYnJlYWs7CisJfQorCWVsc2UgaWYgKGxpbmVbY29sXSA9PSBGRgorCQkmJiBwcmludGVyX29wdHNbT1BUX1BSSU5UX0ZPUk1GRUVEXS5wcmVzZW50CisJCSYmIFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfRk9STUZFRURdLnN0cmluZ1swXSkKKwkJCQkJCQkJICAgICAgID09ICd5JykKKwl7CisJICAgIHBwb3MtPmZmID0gVFJVRTsKKwkgICAgbmVlZF9icmVhayA9IDE7CisJfQorCWVsc2UKKwl7CisJICAgIG5lZWRfYnJlYWsgPSBtY2hfcHJpbnRfdGV4dF9vdXQobGluZSArIGNvbCwgb3V0cHV0bGVuKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXByaW50X3BvcyArPSAoKm1iX3B0cjJjZWxscykobGluZSArIGNvbCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQlwcmludF9wb3MrKzsKKwl9CisgICAgfQorCisgICAgcHBvcy0+bGVhZF9zcGFjZXMgPSB0YWJfc3BhY2VzOworICAgIHBwb3MtPnByaW50X3BvcyA9IHByaW50X3BvczsKKworICAgIC8qCisgICAgICogU3RhcnQgbmV4dCBsaW5lIG9mIGZpbGUgaWYgd2UgY2xpcCBsaW5lcywgb3IgaGF2ZSByZWFjaGVkIGVuZCBvZiB0aGUKKyAgICAgKiBsaW5lLCB1bmxlc3Mgd2UgYXJlIGRvaW5nIGEgZm9ybWZlZWQuCisgICAgICovCisgICAgaWYgKCFwcG9zLT5mZgorCSAgICAmJiAobGluZVtjb2xdID09IE5VTAorCQl8fCAocHJpbnRlcl9vcHRzW09QVF9QUklOVF9XUkFQXS5wcmVzZW50CisJCSAgICAmJiBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX1dSQVBdLnN0cmluZ1swXSkKKwkJCQkJCQkJICAgICA9PSAnbicpKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gY29sOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9QT1NUU0NSSVBUKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogUFMgcHJpbnRlciBzdHVmZi4KKyAqCisgKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uIHRvIGhlbHAgbWFpbnRhaW4gdGhlIFBTIHByaW50aW5nIGNvZGU6CisgKgorICogMS4gUG9zdFNjcmlwdCBMYW5ndWFnZSBSZWZlcmVuY2UsIDNyZCBFZGl0aW9uLAorICogICAgICBBZGRpc29uLVdlc2xleSwgMTk5OSwgSVNCTiAwLTIwMS0zNzkyMi04CisgKiAyLiBQb3N0U2NyaXB0IExhbmd1YWdlIFByb2dyYW0gRGVzaWduLAorICogICAgICBBZGRpc29uLVdlc2xleSwgMTk4OCwgSVNCTiAwLTIwMS0xNDM5Ni04CisgKiAzLiBQb3N0U2NyaXB0IFR1dG9yaWFsIGFuZCBDb29rYm9vaywKKyAqICAgICAgQWRkaXNvbiBXZXNsZXksIDE5ODUsIElTQk4gMC0yMDEtMTAxNzktMworICogNC4gUG9zdFNjcmlwdCBMYW5ndWFnZSBEb2N1bWVudCBTdHJ1Y3R1cmluZyBDb252ZW50aW9ucyBTcGVjaWZpY2F0aW9uLAorICogICAgdmVyc2lvbiAzLjAsCisgKiAgICAgIEFkb2JlIFRlY2hub3RlIDUwMDEsIDI1dGggU2VwdGVtYmVyIDE5OTIKKyAqIDUuIFBvc3RTY3JpcHQgUHJpbnRlciBEZXNjcmlwdGlvbiBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDQuMywKKyAqICAgICAgQWRvYmUgdGVjaG5vdGUgNTAwMywgOXRoIEZlYnJ1YXJ5IDE5OTYKKyAqIDYuIEFkb2JlIEZvbnQgTWV0cmljcyBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDQuMSwKKyAqICAgICAgQWRvYmUgVGVjaG5vdGUgNTAwNywgN3RoIE9jdG9iZXIgMTk5OAorICoKKyAqIFNvbWUgb2YgdGhlc2UgZG9jdW1lbnRzIGNhbiBiZSBmb3VuZCBpbiBQREYgZm9ybSBvbiBBZG9iZSdzIHdlYiBzaXRlIC0KKyAqIGh0dHA6Ly93d3cuYWRvYmUuY29tCisgKi8KKworI2RlZmluZSBQUlRfUFNfREVGQVVMVF9EUEkJICAgICg3MikgICAgLyogRGVmYXVsdCB1c2VyIHNwYWNlIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgUFJUX1BTX0RFRkFVTFRfRk9OVFNJWkUgICAgICgxMCkKKyNkZWZpbmUgUFJUX1BTX0RFRkFVTFRfQlVGRkVSX1NJWkUgICg4MCkKKworc3RydWN0IHBydF9tZWRpYXNpemVfUworeworICAgIGNoYXIJKm5hbWU7CisgICAgZmxvYXQJd2lkdGg7CQkvKiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBvaW50cyBmb3IgcG9ydHJhaXQgKi8KKyAgICBmbG9hdAloZWlnaHQ7Cit9OworCisjZGVmaW5lIFBSVF9NRURJQVNJWkVfTEVOICAoc2l6ZW9mKHBydF9tZWRpYXNpemUpIC8gc2l6ZW9mKHN0cnVjdCBwcnRfbWVkaWFzaXplX1MpKQorCitzdGF0aWMgc3RydWN0IHBydF9tZWRpYXNpemVfUyBwcnRfbWVkaWFzaXplW10gPQoreworICAgIHsiQTQiLAkJNTk1LjAsICA4NDIuMH0sCisgICAgeyJsZXR0ZXIiLAkJNjEyLjAsICA3OTIuMH0sCisgICAgeyIxMHgxNCIsCQk3MjAuMCwgMTAwOC4wfSwKKyAgICB7IkEzIiwJCTg0Mi4wLCAxMTkxLjB9LAorICAgIHsiQTUiLAkJNDIwLjAsICA1OTUuMH0sCisgICAgeyJCNCIsCQk3MjkuMCwgMTAzMi4wfSwKKyAgICB7IkI1IiwJCTUxNi4wLCAgNzI5LjB9LAorICAgIHsiZXhlY3V0aXZlIiwJNTIyLjAsICA3NTYuMH0sCisgICAgeyJmb2xpbyIsCQk1OTUuMCwgIDkzNS4wfSwKKyAgICB7ImxlZGdlciIsCSAgICAgICAxMjI0LjAsICA3OTIuMH0sICAgLyogWWVzLCBpdCBpcyB3aWRlciB0aGFuIHRhbGxlciEgKi8KKyAgICB7ImxlZ2FsIiwJCTYxMi4wLCAxMDA4LjB9LAorICAgIHsicXVhcnRvIiwJCTYxMC4wLCAgNzgwLjB9LAorICAgIHsic3RhdGVtZW50IiwJMzk2LjAsICA2MTIuMH0sCisgICAgeyJ0YWJsb2lkIiwJCTc5Mi4wLCAxMjI0LjB9Cit9OworCisvKiBQUyBmb250IG5hbWVzLCBtdXN0IGJlIGluIFJvbWFuLCBCb2xkLCBJdGFsaWMsIEJvbGQtSXRhbGljIG9yZGVyICovCitzdHJ1Y3QgcHJ0X3BzX2ZvbnRfUworeworICAgIGludAkJd3g7CisgICAgaW50CQl1bGluZV9vZmZzZXQ7CisgICAgaW50CQl1bGluZV93aWR0aDsKKyAgICBpbnQJCWJib3hfbWluX3k7CisgICAgaW50CQliYm94X21heF95OworICAgIGNoYXIJKihwc19mb250bmFtZVs0XSk7Cit9OworCisjZGVmaW5lIFBSVF9QU19GT05UX1JPTUFOCSgwKQorI2RlZmluZSBQUlRfUFNfRk9OVF9CT0xECSgxKQorI2RlZmluZSBQUlRfUFNfRk9OVF9PQkxJUVVFCSgyKQorI2RlZmluZSBQUlRfUFNfRk9OVF9CT0xET0JMSVFVRSAoMykKKworc3RhdGljIHN0cnVjdCBwcnRfcHNfZm9udF9TIHBydF9wc19mb250ID0KK3sKKyAgICA2MDAsCisgICAgLTEwMCwgNTAsCisgICAgLTI1MCwgODA1LAorICAgIHsiQ291cmllciIsICJDb3VyaWVyLUJvbGQiLCAiQ291cmllci1PYmxpcXVlIiwgIkNvdXJpZXItQm9sZE9ibGlxdWUifQorfTsKKworc3RydWN0IHBydF9wc19yZXNvdXJjZV9TCit7CisgICAgY2hhcl91ICBuYW1lWzY0XTsKKyAgICBjaGFyX3UgIGZpbGVuYW1lW01BWFBBVEhMICsgMV07CisgICAgaW50ICAgICB0eXBlOworICAgIGNoYXJfdSAgdGl0bGVbMjU2XTsKKyAgICBjaGFyX3UgIHZlcnNpb25bMjU2XTsKK307CisKKy8qIFR5cGVzIG9mIFBTIHJlc291cmNlIGZpbGUgY3VycmVudGx5IHVzZWQgKi8KKyNkZWZpbmUgUFJUX1JFU09VUkNFX1RZUEVfUFJPQ1NFVCAgICgwKQorI2RlZmluZSBQUlRfUkVTT1VSQ0VfVFlQRV9FTkNPRElORyAgKDEpCisKKy8qIFRoZSBQUyBwcm9sb2cgZmlsZSB2ZXJzaW9uIG51bWJlciBoYXMgdG8gbWF0Y2ggLSBpZiB0aGUgcHJvbG9nIGZpbGUgaXMKKyAqIHVwZGF0ZWQsIGluY3JlbWVudCB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIGFuZCBoZXJlLiAgVmVyc2lvbiBjaGVja2luZyB3YXMKKyAqIGFkZGVkIGFzIG9mIFZJTSA2LjIuCisgKiBUYWJsZSBvZiBWSU0gYW5kIHByb2xvZyB2ZXJzaW9uczoKKyAqCisgKiBWSU0gICAgICBQcm9sb2cKKyAqIDYuMiAgICAgIDEuMworICovCisjZGVmaW5lIFBSVF9QUk9MT0dfVkVSU0lPTiAgKChjaGFyX3UgKikiMS4zIikKKworLyogU3RyaW5nIHZlcnNpb25zIG9mIFBTIHJlc291cmNlIHR5cGVzIC0gaW5kZXhlZCBieSBjb25zdGFudHMgYWJvdmUgc28gZG9uJ3QKKyAqIHJlLW9yZGVyIQorICovCitzdGF0aWMgY2hhciAqcmVzb3VyY2VfdHlwZXNbXSA9Cit7CisgICAgInByb2NzZXQiLAorICAgICJlbmNvZGluZyIKK307CisKKy8qIFN0cmluZ3MgdG8gbG9vayBmb3IgaW4gYSBQUyByZXNvdXJjZSBmaWxlICovCisjZGVmaW5lIFBSVF9SRVNPVVJDRV9IRUFERVIJICAgICIlIVBTLUFkb2JlLSIKKyNkZWZpbmUgUFJUX1JFU09VUkNFX1JFU09VUkNFCSAgICAiUmVzb3VyY2UtIgorI2RlZmluZSBQUlRfUkVTT1VSQ0VfUFJPQ1NFVAkgICAgIlByb2NTZXQiCisjZGVmaW5lIFBSVF9SRVNPVVJDRV9FTkNPRElORwkgICAgIkVuY29kaW5nIgorI2RlZmluZSBQUlRfUkVTT1VSQ0VfVElUTEUJICAgICIlJVRpdGxlOiIKKyNkZWZpbmUgUFJUX1JFU09VUkNFX1ZFUlNJT04JICAgICIlJVZlcnNpb246IgorCitzdGF0aWMgdm9pZCBwcnRfd3JpdGVfZmlsZV9yYXdfbGVuIF9fQVJHUygoY2hhcl91ICpidWZmZXIsIGludCBieXRlcykpOworc3RhdGljIHZvaWQgcHJ0X3dyaXRlX2ZpbGUgX19BUkdTKChjaGFyX3UgKmJ1ZmZlcikpOworc3RhdGljIHZvaWQgcHJ0X3dyaXRlX2ZpbGVfbGVuIF9fQVJHUygoY2hhcl91ICpidWZmZXIsIGludCBieXRlcykpOworc3RhdGljIHZvaWQgcHJ0X3dyaXRlX3N0cmluZyBfX0FSR1MoKGNoYXIgKnMpKTsKK3N0YXRpYyB2b2lkIHBydF93cml0ZV9pbnQgX19BUkdTKChpbnQgaSkpOworc3RhdGljIHZvaWQgcHJ0X3dyaXRlX2Jvb2xlYW4gX19BUkdTKChpbnQgYikpOworc3RhdGljIHZvaWQgcHJ0X2RlZl9mb250IF9fQVJHUygoY2hhciAqbmV3X25hbWUsIGNoYXIgKmVuY29kaW5nLCBpbnQgaGVpZ2h0LCBjaGFyICpmb250KSk7CitzdGF0aWMgdm9pZCBwcnRfcmVhbF9iaXRzIF9fQVJHUygoZG91YmxlIHJlYWwsIGludCBwcmVjaXNpb24sIGludCAqcGludGVnZXIsIGludCAqcGZyYWN0aW9uKSk7CitzdGF0aWMgdm9pZCBwcnRfd3JpdGVfcmVhbCBfX0FSR1MoKGRvdWJsZSB2YWwsIGludCBwcmVjKSk7CitzdGF0aWMgdm9pZCBwcnRfZGVmX3ZhciBfX0FSR1MoKGNoYXIgKm5hbWUsIGRvdWJsZSB2YWx1ZSwgaW50IHByZWMpKTsKK3N0YXRpYyB2b2lkIHBydF9mbHVzaF9idWZmZXIgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwcnRfcmVzb3VyY2VfbmFtZSBfX0FSR1MoKGNoYXJfdSAqZmlsZW5hbWUpKTsKK3N0YXRpYyBpbnQgcHJ0X2ZpbmRfcmVzb3VyY2UgX19BUkdTKChjaGFyICpuYW1lLCBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlKSk7CitzdGF0aWMgaW50IHBydF9vcGVuX3Jlc291cmNlIF9fQVJHUygoc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZSkpOworc3RhdGljIGludCBwcnRfY2hlY2tfcmVzb3VyY2UgX19BUkdTKChzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlLCBjaGFyX3UgKnZlcnNpb24pKTsKK3N0YXRpYyB2b2lkIHBydF9kc2Nfc3RhcnQgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwcnRfZHNjX25vYXJnIF9fQVJHUygoY2hhciAqY29tbWVudCkpOworc3RhdGljIHZvaWQgcHJ0X2RzY190ZXh0bGluZSBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGNoYXIgKnRleHQpKTsKK3N0YXRpYyB2b2lkIHBydF9kc2NfdGV4dCBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGNoYXIgKnRleHQpKTsKK3N0YXRpYyB2b2lkIHBydF9kc2NfaW50cyBfX0FSR1MoKGNoYXIgKmNvbW1lbnQsIGludCBjb3VudCwgaW50ICppbnRzKSk7CitzdGF0aWMgdm9pZCBwcnRfZHNjX3JlcXVpcmVtZW50cyBfX0FSR1MoKGludCBkdXBsZXgsIGludCB0dW1ibGUsIGludCBjb2xsYXRlLCBpbnQgY29sb3IsIGludCBudW1fY29waWVzKSk7CitzdGF0aWMgdm9pZCBwcnRfZHNjX2RvY21lZGlhIF9fQVJHUygoY2hhciAqcGFwZXJfbmFtZSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgd2VpZ2h0LCBjaGFyICpjb2xvdXIsIGNoYXIgKnR5cGUpKTsKK3N0YXRpYyB2b2lkIHBydF9kc2NfcmVzb3VyY2VzIF9fQVJHUygoY2hhciAqY29tbWVudCwgY2hhciAqdHlwZSwgaW50IGNvdW50LCBjaGFyICoqc3RyaW5ncykpOworc3RhdGljIGZsb2F0IHRvX2RldmljZV91bml0cyBfX0FSR1MoKGludCBpZHgsIGRvdWJsZSBwaHlzc2l6ZSwgaW50IGRlZl9udW1iZXIpKTsKK3N0YXRpYyB2b2lkIHBydF9wYWdlX21hcmdpbnMgX19BUkdTKChkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSAqbGVmdCwgZG91YmxlICpyaWdodCwgZG91YmxlICp0b3AsIGRvdWJsZSAqYm90dG9tKSk7CitzdGF0aWMgdm9pZCBwcnRfZm9udF9tZXRyaWNzIF9fQVJHUygoaW50IGZvbnRfc2NhbGUpKTsKK3N0YXRpYyBpbnQgcHJ0X2dldF9jcGwgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IHBydF9nZXRfbHBwIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBwcnRfYWRkX3Jlc291cmNlIF9fQVJHUygoc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZSkpOworCisvKgorICogVmFyaWFibGVzIGZvciB0aGUgb3V0cHV0IFBvc3RTY3JpcHQgZmlsZS4KKyAqLworc3RhdGljIEZJTEUgKnBydF9wc19mZDsKK3N0YXRpYyBpbnQgcHJ0X2ZpbGVfZXJyb3I7CitzdGF0aWMgY2hhcl91ICpwcnRfcHNfZmlsZV9uYW1lID0gTlVMTDsKKworLyoKKyAqIFZhcmlvdXMgb2Zmc2V0cyBhbmQgZGltZW5zaW9ucyBpbiBkZWZhdWx0IFBvc3RTY3JpcHQgdXNlciBzcGFjZSAocG9pbnRzKS4KKyAqIFVzZWQgZm9yIHRleHQgcG9zaXRpb25pbmcgY2FsY3VsYXRpb25zCisgKi8KK3N0YXRpYyBmbG9hdCBwcnRfcGFnZV93aWR0aDsKK3N0YXRpYyBmbG9hdCBwcnRfcGFnZV9oZWlnaHQ7CitzdGF0aWMgZmxvYXQgcHJ0X2xlZnRfbWFyZ2luOworc3RhdGljIGZsb2F0IHBydF9yaWdodF9tYXJnaW47CitzdGF0aWMgZmxvYXQgcHJ0X3RvcF9tYXJnaW47CitzdGF0aWMgZmxvYXQgcHJ0X2JvdHRvbV9tYXJnaW47CitzdGF0aWMgZmxvYXQgcHJ0X2xpbmVfaGVpZ2h0Oworc3RhdGljIGZsb2F0IHBydF9maXJzdF9saW5lX2hlaWdodDsKK3N0YXRpYyBmbG9hdCBwcnRfY2hhcl93aWR0aDsKK3N0YXRpYyBmbG9hdCBwcnRfbnVtYmVyX3dpZHRoOworc3RhdGljIGZsb2F0IHBydF9iZ2NvbF9vZmZzZXQ7CitzdGF0aWMgZmxvYXQgcHJ0X3Bvc194X21vdmV0byA9IDAuMDsKK3N0YXRpYyBmbG9hdCBwcnRfcG9zX3lfbW92ZXRvID0gMC4wOworCisvKgorICogVmFyaW91cyBjb250cm9sIHZhcmlhYmxlcyB1c2VkIHRvIGRlY2lkZSB3aGVuIGFuZCBob3cgdG8gY2hhbmdlIHRoZQorICogUG9zdFNjcmlwdCBncmFwaGljcyBzdGF0ZS4KKyAqLworc3RhdGljIGludCBwcnRfbmVlZF9tb3ZldG87CitzdGF0aWMgaW50IHBydF9kb19tb3ZldG87CitzdGF0aWMgaW50IHBydF9uZWVkX2ZvbnQ7CitzdGF0aWMgaW50IHBydF9mb250Oworc3RhdGljIGludCBwcnRfbmVlZF91bmRlcmxpbmU7CitzdGF0aWMgaW50IHBydF91bmRlcmxpbmU7CitzdGF0aWMgaW50IHBydF9kb191bmRlcmxpbmU7CitzdGF0aWMgaW50IHBydF9uZWVkX2ZnY29sOworc3RhdGljIGludCBwcnRfZmdjb2w7CitzdGF0aWMgaW50IHBydF9uZWVkX2JnY29sOworc3RhdGljIGludCBwcnRfZG9fYmdjb2w7CitzdGF0aWMgaW50IHBydF9iZ2NvbDsKK3N0YXRpYyBpbnQgcHJ0X25ld19iZ2NvbDsKK3N0YXRpYyBpbnQgcHJ0X2F0dHJpYnV0ZV9jaGFuZ2U7CitzdGF0aWMgaW50IHBydF90ZXh0X2NvdW50Oworc3RhdGljIGludCBwcnRfcGFnZV9udW07CisKKy8qCisgKiBWYXJpYWJsZXMgY29udHJvbGxpbmcgcGh5c2ljYWwgcHJpbnRpbmcuCisgKi8KK3N0YXRpYyBpbnQgcHJ0X21lZGlhOworc3RhdGljIGludCBwcnRfcG9ydHJhaXQ7CitzdGF0aWMgaW50IHBydF9udW1fY29waWVzOworc3RhdGljIGludCBwcnRfZHVwbGV4Oworc3RhdGljIGludCBwcnRfdHVtYmxlOworc3RhdGljIGludCBwcnRfY29sbGF0ZTsKKworLyoKKyAqIEJ1ZmZlcnMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgUG9zdFNjcmlwdCBvdXRwdXQKKyAqLworc3RhdGljIGNoYXJfdSBwcnRfbGluZV9idWZmZXJbMjU3XTsKK3N0YXRpYyBnYXJyYXlfVCBwcnRfcHNfYnVmZmVyOworCisjIGlmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBpbnQgcHJ0X2RvX2NvbnY7CitzdGF0aWMgdmltY29udl9UIHBydF9jb252OworIyBlbmRpZgorCisgICAgc3RhdGljIHZvaWQKK3BydF93cml0ZV9maWxlX3Jhd19sZW4oYnVmZmVyLCBieXRlcykKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBpbnQJCWJ5dGVzOworeworICAgIGlmICghcHJ0X2ZpbGVfZXJyb3IKKwkgICAgJiYgZndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGNoYXJfdSksIGJ5dGVzLCBwcnRfcHNfZmQpCisJCQkJCQkJICAgICAhPSAoc2l6ZV90KWJ5dGVzKQorICAgIHsKKwlFTVNHKF8oIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIpKTsKKwlwcnRfZmlsZV9lcnJvciA9IFRSVUU7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3BydF93cml0ZV9maWxlKGJ1ZmZlcikKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKK3sKKyAgICBwcnRfd3JpdGVfZmlsZV9sZW4oYnVmZmVyLCBTVFJMRU4oYnVmZmVyKSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHJ0X3dyaXRlX2ZpbGVfbGVuKGJ1ZmZlciwgYnl0ZXMpCisgICAgY2hhcl91CSpidWZmZXI7CisgICAgaW50CQlieXRlczsKK3sKKyNpZmRlZiBFQkNESUMKKyAgICBlYmNkaWMyYXNjaWkoYnVmZmVyLCBieXRlcyk7CisjZW5kaWYKKyAgICBwcnRfd3JpdGVfZmlsZV9yYXdfbGVuKGJ1ZmZlciwgYnl0ZXMpOworfQorCisvKgorICogV3JpdGUgYSBzdHJpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJ0X3dyaXRlX3N0cmluZyhzKQorICAgIGNoYXIJKnM7Cit7CisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVzIiwgcyk7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKK30KKworLyoKKyAqIFdyaXRlIGFuIGludCBhbmQgYSBzcGFjZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwcnRfd3JpdGVfaW50KGkpCisgICAgaW50CQlpOworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIlZCAiLCBpKTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworfQorCisvKgorICogV3JpdGUgYSBib29sZWFuIGFuZCBhIHNwYWNlLgorICovCisgICAgc3RhdGljIHZvaWQKK3BydF93cml0ZV9ib29sZWFuKGIpCisgICAgaW50CQliOworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIlcyAiLCAoYiA/ICJUIiA6ICJGIikpOworICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Cit9CisKKy8qCisgKiBXcml0ZSBhIGxpbmUgdG8gZGVmaW5lIHRoZSBmb250LgorICovCisgICAgc3RhdGljIHZvaWQKK3BydF9kZWZfZm9udChuZXdfbmFtZSwgZW5jb2RpbmcsIGhlaWdodCwgZm9udCkKKyAgICBjaGFyCSpuZXdfbmFtZTsKKyAgICBjaGFyCSplbmNvZGluZzsKKyAgICBpbnQJCWhlaWdodDsKKyAgICBjaGFyCSpmb250OworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIvXyVzIC9WSU0tJXMgLyVzIHJlZlxuIiwgbmV3X25hbWUsIGVuY29kaW5nLCBmb250KTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIvJXMgJWQgL18lcyBmZnNcbiIsCisJCQkJCQkgICAgbmV3X25hbWUsIGhlaWdodCwgbmV3X25hbWUpOworICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgcmVhbCB2YWx1ZSBpbnRvIGFuIGludGVnZXIgYW5kIGZyYWN0aW9uYWwgcGFydCBhcyBpbnRlZ2Vycywgd2l0aAorICogdGhlIGZyYWN0aW9uYWwgcGFydCBiZWluZyBpbiB0aGUgcmFuZ2UgWzAsMTBecHJlY2lzaW9uKS4gIFRoZSBmcmFjdGlvbmFsIHBhcnQKKyAqIGlzIGFsc28gcm91bmRlZCBiYXNlZCBvbiB0aGUgcHJlY2lzaW9uICsgMSd0aCBmcmFjdGlvbmFsIGRpZ2l0LgorICovCisgICAgc3RhdGljIHZvaWQKK3BydF9yZWFsX2JpdHMocmVhbCwgcHJlY2lzaW9uLCBwaW50ZWdlciwgcGZyYWN0aW9uKQorICAgIGRvdWJsZSAgICAgIHJlYWw7CisgICAgaW50CQlwcmVjaXNpb247CisgICAgaW50CQkqcGludGVnZXI7CisgICAgaW50CQkqcGZyYWN0aW9uOworeworICAgIGludCAgICAgaTsKKyAgICBpbnQgICAgIGludGVnZXI7CisgICAgZmxvYXQgICBmcmFjdGlvbjsKKworICAgIGludGVnZXIgPSAoaW50KXJlYWw7CisgICAgZnJhY3Rpb24gPSAoZmxvYXQpKHJlYWwgLSBpbnRlZ2VyKTsKKyAgICBpZiAocmVhbCA8IChkb3VibGUpaW50ZWdlcikKKwlmcmFjdGlvbiA9IC1mcmFjdGlvbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJlY2lzaW9uOyBpKyspCisJZnJhY3Rpb24gKj0gMTAuMDsKKworICAgICpwaW50ZWdlciA9IGludGVnZXI7CisgICAgKnBmcmFjdGlvbiA9IChpbnQpKGZyYWN0aW9uICsgMC41KTsKK30KKworLyoKKyAqIFdyaXRlIGEgcmVhbCBhbmQgYSBzcGFjZS4gIFNhdmUgYnl0ZXMgaWYgcmVhbCB2YWx1ZSBoYXMgbm8gZnJhY3Rpb25hbCBwYXJ0IQorICogV2UgdXNlIHBydF9yZWFsX2JpdHMoKSBhcyAlZiBpbiBzcHJpbnRmIHVzZXMgdGhlIGxvY2FsZSBzZXR0aW5nIHRvIGRlY2lkZQorICogd2hhdCBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB0byB1c2UsIGJ1dCBQUyBhbHdheXMgcmVxdWlyZXMgYSAnLicuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJ0X3dyaXRlX3JlYWwodmFsLCBwcmVjKQorICAgIGRvdWJsZQl2YWw7CisgICAgaW50CQlwcmVjOworeworICAgIGludCAgICAgaW50ZWdlcjsKKyAgICBpbnQgICAgIGZyYWN0aW9uOworCisgICAgcHJ0X3JlYWxfYml0cyh2YWwsIHByZWMsICZpbnRlZ2VyLCAmZnJhY3Rpb24pOworICAgIC8qIEVtaXQgaW50ZWdlciBwYXJ0ICovCisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVkIiwgaW50ZWdlcik7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKKyAgICAvKiBPbmx5IGVtaXQgZnJhY3Rpb24gaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKGZyYWN0aW9uICE9IDApCisgICAgeworCS8qIFJlbW92ZSBhbnkgdHJhaWxpbmcgemVyb3MgKi8KKwl3aGlsZSAoKGZyYWN0aW9uICUgMTApID09IDApCisJeworCSAgICBwcmVjLS07CisJICAgIGZyYWN0aW9uIC89IDEwOworCX0KKwkvKiBFbWl0IGZyYWN0aW9uIGxlZnQgcGFkZGVkIHdpdGggemVyb3MgKi8KKwlzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiLiUwKmQiLCBwcmVjLCBmcmFjdGlvbik7CisJcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKKyAgICB9CisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiAiKTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworfQorCisvKgorICogV3JpdGUgYSBsaW5lIHRvIGRlZmluZSBhIG51bWVyaWMgdmFyaWFibGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJ0X2RlZl92YXIobmFtZSwgdmFsdWUsIHByZWMpCisgICAgY2hhcgkqbmFtZTsKKyAgICBkb3VibGUJdmFsdWU7CisgICAgaW50CQlwcmVjOworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIvJXMgIiwgbmFtZSk7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKKyAgICBwcnRfd3JpdGVfcmVhbCh2YWx1ZSwgcHJlYyk7CisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgImRcbiIpOworICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7Cit9CisKKy8qIENvbnZlcnQgc2l6ZSBmcm9tIGZvbnQgc3BhY2UgdG8gdXNlciBzcGFjZSBhdCBjdXJyZW50IGZvbnQgc2NhbGUgKi8KKyNkZWZpbmUgUFJUX1BTX0ZPTlRfVE9fVVNFUihzY2FsZSwgc2l6ZSkgICAgKChzaXplKSAqICgoc2NhbGUpLzEwMDAuMCkpCisKKyAgICBzdGF0aWMgdm9pZAorcHJ0X2ZsdXNoX2J1ZmZlcigpCit7CisgICAgaWYgKHBydF9wc19idWZmZXIuZ2FfbGVuID4gMCkKKyAgICB7CisJLyogQW55IGJhY2tncm91bmQgY29sb3IgbXVzdCBiZSBkcmF3biBmaXJzdCAqLworCWlmIChwcnRfZG9fYmdjb2wgJiYgKHBydF9uZXdfYmdjb2wgIT0gUFJDT0xPUl9XSElURSkpCisJeworCSAgICBpbnQgICAgIHIsIGcsIGI7CisKKwkgICAgaWYgKHBydF9kb19tb3ZldG8pCisJICAgIHsKKwkJcHJ0X3dyaXRlX3JlYWwocHJ0X3Bvc194X21vdmV0bywgMik7CisJCXBydF93cml0ZV9yZWFsKHBydF9wb3NfeV9tb3ZldG8sIDIpOworCQlwcnRfd3JpdGVfc3RyaW5nKCJtXG4iKTsKKwkJcHJ0X2RvX21vdmV0byA9IEZBTFNFOworCSAgICB9CisKKwkgICAgLyogU2l6ZSBvZiByZWN0IG9mIGJhY2tncm91bmQgY29sb3Igb24gd2hpY2ggdGV4dCBpcyBwcmludGVkICovCisJICAgIHBydF93cml0ZV9yZWFsKHBydF90ZXh0X2NvdW50ICogcHJ0X2NoYXJfd2lkdGgsIDIpOworCSAgICBwcnRfd3JpdGVfcmVhbChwcnRfbGluZV9oZWlnaHQsIDIpOworCisJICAgIC8qIExhc3RseSBhZGQgdGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kICovCisJICAgIHIgPSAoKHVuc2lnbmVkKXBydF9uZXdfYmdjb2wgJiAweGZmMDAwMCkgPj4gMTY7CisJICAgIGcgPSAoKHVuc2lnbmVkKXBydF9uZXdfYmdjb2wgJiAweGZmMDApID4+IDg7CisJICAgIGIgPSBwcnRfbmV3X2JnY29sICYgMHhmZjsKKwkgICAgcHJ0X3dyaXRlX3JlYWwociAvIDI1NS4wLCAzKTsKKwkgICAgcHJ0X3dyaXRlX3JlYWwoZyAvIDI1NS4wLCAzKTsKKwkgICAgcHJ0X3dyaXRlX3JlYWwoYiAvIDI1NS4wLCAzKTsKKwkgICAgcHJ0X3dyaXRlX3N0cmluZygiYmdcbiIpOworCX0KKwkvKiBEcmF3IHVuZGVybGluZXMgYmVmb3JlIHRoZSB0ZXh0IGFzIGl0IG1ha2VzIGl0IHNsaWdodGx5IGVhc2llciB0bworCSAqIGZpbmQgdGhlIHN0YXJ0aW5nIHBvaW50LgorCSAqLworCWlmIChwcnRfZG9fdW5kZXJsaW5lKQorCXsKKwkgICAgaWYgKHBydF9kb19tb3ZldG8pCisJICAgIHsKKwkJcHJ0X3dyaXRlX3JlYWwocHJ0X3Bvc194X21vdmV0bywgMik7CisJCXBydF93cml0ZV9yZWFsKHBydF9wb3NfeV9tb3ZldG8sIDIpOworCQlwcnRfd3JpdGVfc3RyaW5nKCJtXG4iKTsKKwkJcHJ0X2RvX21vdmV0byA9IEZBTFNFOworCSAgICB9CisKKwkgICAgLyogVW5kZXJsaW5pbmcgaXMgZWFzeSAtIGp1c3QgbmVlZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8KKwkgICAgICogcHJpbnQuICovCisJICAgIHBydF93cml0ZV9yZWFsKHBydF90ZXh0X2NvdW50ICogcHJ0X2NoYXJfd2lkdGgsIDIpOworCSAgICBwcnRfd3JpdGVfc3RyaW5nKCJ1bFxuIik7CisJfQorCS8qIERyYXcgdGhlIHRleHQKKwkgKiBOb3RlOiB3ZSB3cml0ZSB0ZXh0IG91dCByYXcgLSBFQkNESUMgY29udmVyc2lvbiBpcyBoYW5kbGVkIGluIHRoZQorCSAqIFBvc3RTY3JpcHQgd29ybGQgdmlhIHRoZSBmb250IGVuY29kaW5nIHZlY3Rvci4gKi8KKwlwcnRfd3JpdGVfc3RyaW5nKCIoIik7CisJcHJ0X3dyaXRlX2ZpbGVfcmF3X2xlbihwcnRfcHNfYnVmZmVyLmdhX2RhdGEsIHBydF9wc19idWZmZXIuZ2FfbGVuKTsKKwlwcnRfd3JpdGVfc3RyaW5nKCIpIik7CisJLyogQWRkIGEgbW92ZXRvIGlmIG5lZWQgYmUgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hvdyBwcm9jZWR1cmUgKi8KKwlpZiAocHJ0X2RvX21vdmV0bykKKwl7CisJICAgIHBydF93cml0ZV9yZWFsKHBydF9wb3NfeF9tb3ZldG8sIDIpOworCSAgICBwcnRfd3JpdGVfcmVhbChwcnRfcG9zX3lfbW92ZXRvLCAyKTsKKwkgICAgLyogbW92ZXRvIGFuZCBhIHNob3cgKi8KKwkgICAgcHJ0X3dyaXRlX3N0cmluZygibXNcbiIpOworCSAgICBwcnRfZG9fbW92ZXRvID0gRkFMU0U7CisJfQorCWVsc2UgLyogU2ltcGxlIHNob3cgKi8KKwkgICAgcHJ0X3dyaXRlX3N0cmluZygic1xuIik7CisKKwlnYV9jbGVhcigmcHJ0X3BzX2J1ZmZlcik7CisJZ2FfaW5pdDIoJnBydF9wc19idWZmZXIsIChpbnQpc2l6ZW9mKGNoYXIpLCBQUlRfUFNfREVGQVVMVF9CVUZGRVJfU0laRSk7CisgICAgfQorfQorCitzdGF0aWMgY2hhcl91ICpyZXNvdXJjZV9maWxlbmFtZTsKKworICAgIHN0YXRpYyB2b2lkCitwcnRfcmVzb3VyY2VfbmFtZShmaWxlbmFtZSkKKyAgICBjaGFyX3UgICpmaWxlbmFtZTsKK3sKKyAgICBpZiAoU1RSTEVOKGZpbGVuYW1lKSA+PSBNQVhQQVRITCkKKwkqcmVzb3VyY2VfZmlsZW5hbWUgPSBOVUw7CisgICAgZWxzZQorCVNUUkNQWShyZXNvdXJjZV9maWxlbmFtZSwgZmlsZW5hbWUpOworfQorCisgICAgc3RhdGljIGludAorcHJ0X2ZpbmRfcmVzb3VyY2UobmFtZSwgcmVzb3VyY2UpCisgICAgY2hhcgkqbmFtZTsKKyAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlOworeworICAgIGNoYXJfdQlidWZmZXJbTUFYUEFUSEwgKyAxXTsKKworICAgIFNUUkNQWShyZXNvdXJjZS0+bmFtZSwgbmFtZSk7CisgICAgLyogTG9vayBmb3IgbmFtZWQgcmVzb3VyY2UgZmlsZSBpbiBydW50aW1lcGF0aCAqLworICAgIFNUUkNQWShidWZmZXIsICJwcmludCIpOworICAgIGFkZF9wYXRoc2VwKGJ1ZmZlcik7CisgICAgU1RSQ0FUKGJ1ZmZlciwgbmFtZSk7CisgICAgU1RSQ0FUKGJ1ZmZlciwgIi5wcyIpOworICAgIHJlc291cmNlX2ZpbGVuYW1lID0gcmVzb3VyY2UtPmZpbGVuYW1lOworICAgICpyZXNvdXJjZV9maWxlbmFtZSA9IE5VTDsKKyAgICByZXR1cm4gKGRvX2luX3J1bnRpbWVwYXRoKGJ1ZmZlciwgRkFMU0UsIHBydF9yZXNvdXJjZV9uYW1lKQorCSAgICAmJiByZXNvdXJjZS0+ZmlsZW5hbWVbMF0gIT0gTlVMKTsKK30KKworLyogUFMgQ1IgYW5kIExGIGNoYXJhY3RlcnMgaGF2ZSBwbGF0Zm9ybSBpbmRlcGVuZGVudCB2YWx1ZXMgKi8KKyNkZWZpbmUgUFNMRiAgKDB4MGEpCisjZGVmaW5lIFBTQ1IgICgweDBkKQorCisvKiBWZXJ5IHNpbXBsZSBoYW5kIGNyYWZ0ZWQgcGFyc2VyIHRvIGdldCB0aGUgdHlwZSwgdGl0bGUsIGFuZCB2ZXJzaW9uIG51bWJlciBvZgorICogYSBQUyByZXNvdXJjZSBmaWxlIHNvIHRoZSBmaWxlIGRldGFpbHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBEU0MgaGVhZGVyCisgKiBjb21tZW50cy4gKi8KKyAgICBzdGF0aWMgaW50CitwcnRfb3Blbl9yZXNvdXJjZShyZXNvdXJjZSkKKyAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlOworeworICAgIEZJTEUJKmZkX3Jlc291cmNlOworICAgIGNoYXJfdQlidWZmZXJbMTI4XTsKKyAgICBjaGFyX3UJKmNoID0gYnVmZmVyOworICAgIGNoYXJfdQkqY2gyOworCisgICAgZmRfcmVzb3VyY2UgPSBtY2hfZm9wZW4oKGNoYXIgKilyZXNvdXJjZS0+ZmlsZW5hbWUsIFJFQURCSU4pOworICAgIGlmIChmZF9yZXNvdXJjZSA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKCJFNjI0OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIiksIHJlc291cmNlLT5maWxlbmFtZSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB2aW1fbWVtc2V0KGJ1ZmZlciwgTlVMLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICAvKiBQYXJzZSBmaXJzdCBsaW5lIHRvIGVuc3VyZSB2YWxpZCByZXNvdXJjZSBmaWxlICovCisgICAgKHZvaWQpZnJlYWQoKGNoYXIgKilidWZmZXIsIHNpemVvZihjaGFyX3UpLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJCQkJIGZkX3Jlc291cmNlKTsKKyAgICBpZiAoZmVycm9yKGZkX3Jlc291cmNlKSkKKyAgICB7CisJRU1TRzIoXygiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIiksCisJCXJlc291cmNlLT5maWxlbmFtZSk7CisJZmNsb3NlKGZkX3Jlc291cmNlKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKFNUUk5DTVAoY2gsIFBSVF9SRVNPVVJDRV9IRUFERVIsIFNUUkxFTihQUlRfUkVTT1VSQ0VfSEVBREVSKSkgIT0gMCkKKyAgICB7CisJRU1TRzIoXygiRTYxODogZmlsZSBcIiVzXCIgaXMgbm90IGEgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIiksCisJCXJlc291cmNlLT5maWxlbmFtZSk7CisJZmNsb3NlKGZkX3Jlc291cmNlKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogU2tpcCBvdmVyIGFueSB2ZXJzaW9uIG51bWJlcnMgYW5kIGZvbGxvd2luZyB3cyAqLworICAgIGNoICs9IFNUUkxFTihQUlRfUkVTT1VSQ0VfSEVBREVSKTsKKyAgICB3aGlsZSAoIWlzc3BhY2UoKmNoKSkKKwljaCsrOworICAgIHdoaWxlIChpc3NwYWNlKCpjaCkpCisJY2grKzsKKworICAgIGlmIChTVFJOQ01QKGNoLCBQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UsIFNUUkxFTihQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UpKSAhPSAwKQorICAgIHsKKwlFTVNHMihfKCJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIiksCisJCXJlc291cmNlLT5maWxlbmFtZSk7CisJZmNsb3NlKGZkX3Jlc291cmNlKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGNoICs9IFNUUkxFTihQUlRfUkVTT1VSQ0VfUkVTT1VSQ0UpOworCisgICAgLyogRGVjaWRlIHR5cGUgb2YgcmVzb3VyY2UgaW4gdGhlIGZpbGUgKi8KKyAgICBpZiAoU1RSTkNNUChjaCwgUFJUX1JFU09VUkNFX1BST0NTRVQsIFNUUkxFTihQUlRfUkVTT1VSQ0VfUFJPQ1NFVCkpID09IDApCisgICAgeworCXJlc291cmNlLT50eXBlID0gUFJUX1JFU09VUkNFX1RZUEVfUFJPQ1NFVDsKKwljaCArPSBTVFJMRU4oUFJUX1JFU09VUkNFX1BST0NTRVQpOworICAgIH0KKyAgICBlbHNlIGlmIChTVFJOQ01QKGNoLCBQUlRfUkVTT1VSQ0VfRU5DT0RJTkcsIFNUUkxFTihQUlRfUkVTT1VSQ0VfRU5DT0RJTkcpKSA9PSAwKQorICAgIHsKKwlyZXNvdXJjZS0+dHlwZSA9IFBSVF9SRVNPVVJDRV9UWVBFX0VOQ09ESU5HOworCWNoICs9IFNUUkxFTihQUlRfUkVTT1VSQ0VfRU5DT0RJTkcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCUVNU0cyKF8oIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiKSwKKwkJcmVzb3VyY2UtPmZpbGVuYW1lKTsKKwlmY2xvc2UoZmRfcmVzb3VyY2UpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDb25zdW1lIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIENSL0xGL0NSX0xGICovCisgICAgd2hpbGUgKCpjaCAhPSBQU0NSICYmICpjaCAhPSBQU0xGKQorCWNoKys7CisgICAgd2hpbGUgKCpjaCA9PSBQU0NSIHx8ICpjaCA9PSBQU0xGKQorCWNoKys7CisKKyAgICAvKiBNYXRjaCAlJVRpdGxlOiAqLworICAgIGlmIChTVFJOQ01QKGNoLCBQUlRfUkVTT1VSQ0VfVElUTEUsIFNUUkxFTihQUlRfUkVTT1VSQ0VfVElUTEUpKSAhPSAwKQorICAgIHsKKwlFTVNHMihfKCJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIiksCisJCXJlc291cmNlLT5maWxlbmFtZSk7CisJZmNsb3NlKGZkX3Jlc291cmNlKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGNoICs9IFNUUkxFTihQUlRfUkVTT1VSQ0VfVElUTEUpOworCisgICAgLyogU2tpcCB3cyBhZnRlciAlJVRpdGxlOiAqLworICAgIHdoaWxlIChpc3NwYWNlKCpjaCkpCisJY2grKzsKKworICAgIC8qIENvcHkgdXAgdG8gdGhlIENSL0xGL0NSX0xGICovCisgICAgY2gyID0gcmVzb3VyY2UtPnRpdGxlOworICAgIHdoaWxlICgqY2ggIT0gUFNDUiAmJiAqY2ggIT0gUFNMRikKKwkqY2gyKysgPSAqY2grKzsKKyAgICAqY2gyID0gJ1wwJzsKKyAgICB3aGlsZSAoKmNoID09IFBTQ1IgfHwgKmNoID09IFBTTEYpCisJY2grKzsKKworICAgIC8qIE1hdGNoICUlVmVyc2lvbjogKi8KKyAgICBpZiAoU1RSTkNNUChjaCwgUFJUX1JFU09VUkNFX1ZFUlNJT04sIFNUUkxFTihQUlRfUkVTT1VSQ0VfVkVSU0lPTikpICE9IDApCisgICAgeworCUVNU0cyKF8oIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiKSwKKwkJcmVzb3VyY2UtPmZpbGVuYW1lKTsKKwlmY2xvc2UoZmRfcmVzb3VyY2UpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY2ggKz0gU1RSTEVOKFBSVF9SRVNPVVJDRV9WRVJTSU9OKTsKKworICAgIC8qIFNraXAgd3MgYWZ0ZXIgJSVWZXJzaW9uOiAqLworICAgIHdoaWxlIChpc3NwYWNlKCpjaCkpCisJY2grKzsKKworICAgIC8qIENvcHkgdXAgdG8gdGhlIENSL0xGL0NSX0xGICovCisgICAgY2gyID0gcmVzb3VyY2UtPnZlcnNpb247CisgICAgd2hpbGUgKCpjaCAhPSBQU0NSICYmICpjaCAhPSBQU0xGKQorCSpjaDIrKyA9ICpjaCsrOworICAgICpjaDIgPSAnXDAnOworCisgICAgZmNsb3NlKGZkX3Jlc291cmNlKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisgICAgc3RhdGljIGludAorcHJ0X2NoZWNrX3Jlc291cmNlKHJlc291cmNlLCB2ZXJzaW9uKQorICAgIHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2U7CisgICAgY2hhcl91ICAqdmVyc2lvbjsKK3sKKyAgICAvKiBWZXJzaW9uIG51bWJlciBtLm4gc2hvdWxkIG1hdGNoLCB0aGUgcmV2aXNpb24gbnVtYmVyIGRvZXMgbm90IG1hdHRlciAqLworICAgIGlmIChTVFJOQ01QKHJlc291cmNlLT52ZXJzaW9uLCB2ZXJzaW9uLCBTVFJMRU4odmVyc2lvbikpKQorICAgIHsKKwlFTVNHMihfKCJFNjIxOiBcIiVzXCIgcmVzb3VyY2UgZmlsZSBoYXMgd3JvbmcgdmVyc2lvbiIpLAorCQlyZXNvdXJjZS0+bmFtZSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIE90aGVyIGNoZWNrcyB0byBiZSBhZGRlZCBhcyBuZWVkZWQgKi8KKyAgICByZXR1cm4gVFJVRTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfZHNjX3N0YXJ0KCkKK3sKKyAgICBwcnRfd3JpdGVfc3RyaW5nKCIlIVBTLUFkb2JlLTMuMFxuIik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHJ0X2RzY19ub2FyZyhjb21tZW50KQorICAgIGNoYXIJKmNvbW1lbnQ7Cit7CisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiUlJSUlc1xuIiwgY29tbWVudCk7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfZHNjX3RleHRsaW5lKGNvbW1lbnQsIHRleHQpCisgICAgY2hhcgkqY29tbWVudDsKKyAgICBjaGFyCSp0ZXh0OworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIlJSUlJXM6ICVzXG4iLCBjb21tZW50LCB0ZXh0KTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworfQorCisgICAgc3RhdGljIHZvaWQKK3BydF9kc2NfdGV4dChjb21tZW50LCB0ZXh0KQorICAgIGNoYXIJKmNvbW1lbnQ7CisgICAgY2hhcgkqdGV4dDsKK3sKKyAgICAvKiBUT0RPIC0gc2hvdWxkIHNjYW4gJ3RleHQnIGZvciBhbnkgY2hhcnMgbmVlZGluZyBlc2NhcGluZyEgKi8KKyAgICBzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiJSUlJSVzOiAoJXMpXG4iLCBjb21tZW50LCB0ZXh0KTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworfQorCisjZGVmaW5lIHBydF9kc2NfYXRlbmQoYykJcHJ0X2RzY190ZXh0KChjKSwgImF0ZW5kIikKKworICAgIHN0YXRpYyB2b2lkCitwcnRfZHNjX2ludHMoY29tbWVudCwgY291bnQsIGludHMpCisgICAgY2hhcgkqY29tbWVudDsKKyAgICBpbnQJCWNvdW50OworICAgIGludAkJKmludHM7Cit7CisgICAgaW50CQlpOworCisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiUlJSUlczoiLCBjb21tZW50KTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworCXNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIgJWQiLCBpbnRzW2ldKTsKKwlwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworICAgIH0KKworICAgIHBydF93cml0ZV9zdHJpbmcoIlxuIik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHJ0X2RzY19yZXNvdXJjZXMoY29tbWVudCwgdHlwZSwgY291bnQsIHN0cmluZ3MpCisgICAgY2hhcgkqY29tbWVudDsJLyogaWYgTlVMTCBhZGQgdG8gcHJldmlvdXMgKi8KKyAgICBjaGFyCSp0eXBlOworICAgIGludAkJY291bnQ7CisgICAgY2hhcgkqKnN0cmluZ3M7Cit7CisgICAgaW50CQlpOworCisgICAgaWYgKGNvbW1lbnQgIT0gTlVMTCkKKwlzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiJSUlJSVzOiAlcyIsIGNvbW1lbnQsIHR5cGUpOworICAgIGVsc2UKKwlzcHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCAiJSUlJSsgJXMiLCB0eXBlKTsKKyAgICBwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworCXNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIgJXMiLCBzdHJpbmdzW2ldKTsKKwlwcnRfd3JpdGVfZmlsZShwcnRfbGluZV9idWZmZXIpOworICAgIH0KKworICAgIHBydF93cml0ZV9zdHJpbmcoIlxuIik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHJ0X2RzY19yZXF1aXJlbWVudHMoZHVwbGV4LCB0dW1ibGUsIGNvbGxhdGUsIGNvbG9yLCBudW1fY29waWVzKQorICAgIGludAkJZHVwbGV4OworICAgIGludAkJdHVtYmxlOworICAgIGludAkJY29sbGF0ZTsKKyAgICBpbnQJCWNvbG9yOworICAgIGludAkJbnVtX2NvcGllczsKK3sKKyAgICAvKiBPbmx5IG91dHB1dCB0aGUgY29tbWVudCBpZiB3ZSBuZWVkIHRvLgorICAgICAqIE5vdGU6IHR1bWJsZSBpcyBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZHVwbGV4aW5nCisgICAgICovCisgICAgaWYgKCEoZHVwbGV4IHx8IGNvbGxhdGUgfHwgY29sb3IgfHwgKG51bV9jb3BpZXMgPiAxKSkpCisJcmV0dXJuOworCisgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiUlJSVSZXF1aXJlbWVudHM6Iik7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKKworICAgIGlmIChkdXBsZXgpCisgICAgeworCXBydF93cml0ZV9zdHJpbmcoIiBkdXBsZXgiKTsKKwlpZiAodHVtYmxlKQorCSAgICBwcnRfd3JpdGVfc3RyaW5nKCIodHVtYmxlKSIpOworICAgIH0KKyAgICBpZiAoY29sbGF0ZSkKKwlwcnRfd3JpdGVfc3RyaW5nKCIgY29sbGF0ZSIpOworICAgIGlmIChjb2xvcikKKwlwcnRfd3JpdGVfc3RyaW5nKCIgY29sb3IiKTsKKyAgICBpZiAobnVtX2NvcGllcyA+IDEpCisgICAgeworCXBydF93cml0ZV9zdHJpbmcoIiBudW1jb3BpZXMoIik7CisJLyogTm90ZTogbm8gc3BhY2Ugd2FudGVkIHNvIGRvbnQgdXNlIHBydF93cml0ZV9pbnQoKSAqLworCXNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIlZCIsIG51bV9jb3BpZXMpOworCXBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7CisJcHJ0X3dyaXRlX3N0cmluZygiKSIpOworICAgIH0KKyAgICBwcnRfd3JpdGVfc3RyaW5nKCJcbiIpOworfQorCisgICAgc3RhdGljIHZvaWQKK3BydF9kc2NfZG9jbWVkaWEocGFwZXJfbmFtZSwgd2lkdGgsIGhlaWdodCwgd2VpZ2h0LCBjb2xvdXIsIHR5cGUpCisgICAgY2hhcgkqcGFwZXJfbmFtZTsKKyAgICBkb3VibGUJd2lkdGg7CisgICAgZG91YmxlCWhlaWdodDsKKyAgICBkb3VibGUJd2VpZ2h0OworICAgIGNoYXIJKmNvbG91cjsKKyAgICBjaGFyCSp0eXBlOworeworICAgIHNwcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsICIlJSUlRG9jdW1lbnRNZWRpYTogJXMgIiwgcGFwZXJfbmFtZSk7CisgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKKyAgICBwcnRfd3JpdGVfcmVhbCh3aWR0aCwgMik7CisgICAgcHJ0X3dyaXRlX3JlYWwoaGVpZ2h0LCAyKTsKKyAgICBwcnRfd3JpdGVfcmVhbCh3ZWlnaHQsIDIpOworICAgIGlmIChjb2xvdXIgPT0gTlVMTCkKKwlwcnRfd3JpdGVfc3RyaW5nKCIoKSIpOworICAgIGVsc2UKKwlwcnRfd3JpdGVfc3RyaW5nKGNvbG91cik7CisgICAgcHJ0X3dyaXRlX3N0cmluZygiICIpOworICAgIGlmICh0eXBlID09IE5VTEwpCisJcHJ0X3dyaXRlX3N0cmluZygiKCkiKTsKKyAgICBlbHNlCisJcHJ0X3dyaXRlX3N0cmluZyh0eXBlKTsKKyAgICBwcnRfd3JpdGVfc3RyaW5nKCJcbiIpOworfQorCisgICAgdm9pZAorbWNoX3ByaW50X2NsZWFudXAoKQoreworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAocHJ0X2RvX2NvbnYpCisgICAgeworCWNvbnZlcnRfc2V0dXAoJnBydF9jb252LCBOVUxMLCBOVUxMKTsKKwlwcnRfZG9fY29udiA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIGlmIChwcnRfcHNfZmQgIT0gTlVMTCkKKyAgICB7CisJZmNsb3NlKHBydF9wc19mZCk7CisJcHJ0X3BzX2ZkID0gTlVMTDsKKwlwcnRfZmlsZV9lcnJvciA9IEZBTFNFOworICAgIH0KKyAgICBpZiAocHJ0X3BzX2ZpbGVfbmFtZSAhPSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShwcnRfcHNfZmlsZV9uYW1lKTsKKwlwcnRfcHNfZmlsZV9uYW1lID0gTlVMTDsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgZmxvYXQKK3RvX2RldmljZV91bml0cyhpZHgsIHBoeXNzaXplLCBkZWZfbnVtYmVyKQorICAgIGludAkJaWR4OworICAgIGRvdWJsZQlwaHlzc2l6ZTsKKyAgICBpbnQJCWRlZl9udW1iZXI7Cit7CisgICAgZmxvYXQJcmV0OworICAgIGludAkJdTsKKyAgICBpbnQJCW5yOworCisgICAgdSA9IHBydF9nZXRfdW5pdChpZHgpOworICAgIGlmICh1ID09IFBSVF9VTklUX05PTkUpCisgICAgeworCXUgPSBQUlRfVU5JVF9QRVJDOworCW5yID0gZGVmX251bWJlcjsKKyAgICB9CisgICAgZWxzZQorCW5yID0gcHJpbnRlcl9vcHRzW2lkeF0ubnVtYmVyOworCisgICAgc3dpdGNoICh1KQorICAgIHsKKwljYXNlIFBSVF9VTklUX0lOQ0g6CisJICAgIHJldCA9IChmbG9hdCkobnIgKiBQUlRfUFNfREVGQVVMVF9EUEkpOworCSAgICBicmVhazsKKwljYXNlIFBSVF9VTklUX01NOgorCSAgICByZXQgPSAoZmxvYXQpKG5yICogUFJUX1BTX0RFRkFVTFRfRFBJKSAvIChmbG9hdCkyNS40OworCSAgICBicmVhazsKKwljYXNlIFBSVF9VTklUX1BPSU5UOgorCSAgICByZXQgPSAoZmxvYXQpbnI7CisJICAgIGJyZWFrOworCWNhc2UgUFJUX1VOSVRfUEVSQzoKKwlkZWZhdWx0OgorCSAgICByZXQgPSAoZmxvYXQpKHBoeXNzaXplICogbnIpIC8gMTAwOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogQ2FsY3VsYXRlIG1hcmdpbnMgZm9yIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBwcmludG9wdGlvbnMgc2V0dGluZ3MuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJ0X3BhZ2VfbWFyZ2lucyh3aWR0aCwgaGVpZ2h0LCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pCisgICAgZG91YmxlCXdpZHRoOworICAgIGRvdWJsZQloZWlnaHQ7CisgICAgZG91YmxlCSpsZWZ0OworICAgIGRvdWJsZQkqcmlnaHQ7CisgICAgZG91YmxlCSp0b3A7CisgICAgZG91YmxlCSpib3R0b207Cit7CisgICAgKmxlZnQgICA9IHRvX2RldmljZV91bml0cyhPUFRfUFJJTlRfTEVGVCwgd2lkdGgsIDEwKTsKKyAgICAqcmlnaHQgID0gd2lkdGggLSB0b19kZXZpY2VfdW5pdHMoT1BUX1BSSU5UX1JJR0hULCB3aWR0aCwgNSk7CisgICAgKnRvcCAgICA9IGhlaWdodCAtIHRvX2RldmljZV91bml0cyhPUFRfUFJJTlRfVE9QLCBoZWlnaHQsIDUpOworICAgICpib3R0b20gPSB0b19kZXZpY2VfdW5pdHMoT1BUX1BSSU5UX0JPVCwgaGVpZ2h0LCA1KTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwcnRfZm9udF9tZXRyaWNzKGZvbnRfc2NhbGUpCisgICAgaW50CQlmb250X3NjYWxlOworeworICAgIHBydF9saW5lX2hlaWdodCA9IChmbG9hdClmb250X3NjYWxlOworICAgIHBydF9jaGFyX3dpZHRoID0gKGZsb2F0KVBSVF9QU19GT05UX1RPX1VTRVIoZm9udF9zY2FsZSwgcHJ0X3BzX2ZvbnQud3gpOworfQorCisKKyAgICBzdGF0aWMgaW50CitwcnRfZ2V0X2NwbCgpCit7CisgICAgaWYgKHBydF91c2VfbnVtYmVyKCkpCisgICAgeworCXBydF9udW1iZXJfd2lkdGggPSBQUklOVF9OVU1CRVJfV0lEVEggKiBwcnRfY2hhcl93aWR0aDsKKwlwcnRfbGVmdF9tYXJnaW4gKz0gcHJ0X251bWJlcl93aWR0aDsKKyAgICB9CisgICAgZWxzZQorCXBydF9udW1iZXJfd2lkdGggPSAwLjA7CisKKyAgICByZXR1cm4gKGludCkoKHBydF9yaWdodF9tYXJnaW4gLSBwcnRfbGVmdF9tYXJnaW4pIC8gcHJ0X2NoYXJfd2lkdGgpOworfQorCisvKgorICogR2V0IG51bWJlciBvZiBsaW5lcyBvZiB0ZXh0IHRoYXQgZml0IG9uIGEgcGFnZSAoZXhjbHVkaW5nIHRoZSBoZWFkZXIpLgorICovCisgICAgc3RhdGljIGludAorcHJ0X2dldF9scHAoKQoreworICAgIGludCBscHA7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBvZmZzZXQgdG8gbG93ZXIgbGVmdCBjb3JuZXIgb2YgYmFja2dyb3VuZCByZWN0IGJhc2VkIG9uIGFjdHVhbAorICAgICAqIGZvbnQgaGVpZ2h0IChiYXNlZCBvbiBpdHMgYm91bmRpbmcgYm94KSBhbmQgdGhlIGxpbmUgaGVpZ2h0LCBoYW5kbGluZyB0aGUKKyAgICAgKiBjYXNlIHdoZXJlIHRoZSBmb250IGhlaWdodCBjYW4gZXhjZWVkIHRoZSBsaW5lIGhlaWdodC4KKyAgICAgKi8KKyAgICBwcnRfYmdjb2xfb2Zmc2V0ID0gKGZsb2F0KVBSVF9QU19GT05UX1RPX1VTRVIocHJ0X2xpbmVfaGVpZ2h0LAorCQkJCQkgICBwcnRfcHNfZm9udC5iYm94X21pbl95KTsKKyAgICBpZiAoKHBydF9wc19mb250LmJib3hfbWF4X3kgLSBwcnRfcHNfZm9udC5iYm94X21pbl95KSA8IDEwMDAuMCkKKyAgICB7CisJcHJ0X2JnY29sX29mZnNldCAtPSAoZmxvYXQpUFJUX1BTX0ZPTlRfVE9fVVNFUihwcnRfbGluZV9oZWlnaHQsCisJCQkJKDEwMDAuMCAtIChwcnRfcHNfZm9udC5iYm94X21heF95IC0KKwkJCQkJICAgIHBydF9wc19mb250LmJib3hfbWluX3kpKSAvIDIpOworICAgIH0KKworICAgIC8qIEdldCBoZWlnaHQgZm9yIHRvcG1vc3QgbGluZSBiYXNlZCBvbiBiYWNrZ3JvdW5kIHJlY3Qgb2Zmc2V0LiAqLworICAgIHBydF9maXJzdF9saW5lX2hlaWdodCA9IHBydF9saW5lX2hlaWdodCArIHBydF9iZ2NvbF9vZmZzZXQ7CisKKyAgICAvKiBDYWxjdWxhdGUgbHBwICovCisgICAgbHBwID0gKGludCkoKHBydF90b3BfbWFyZ2luIC0gcHJ0X2JvdHRvbV9tYXJnaW4pIC8gcHJ0X2xpbmVfaGVpZ2h0KTsKKworICAgIC8qIEFkanVzdCB0b3AgbWFyZ2luIGlmIHRoZXJlIGlzIGEgaGVhZGVyICovCisgICAgcHJ0X3RvcF9tYXJnaW4gLT0gcHJ0X2xpbmVfaGVpZ2h0ICogcHJ0X2hlYWRlcl9oZWlnaHQoKTsKKworICAgIHJldHVybiBscHAgLSBwcnRfaGVhZGVyX2hlaWdodCgpOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK21jaF9wcmludF9pbml0KHBzZXR0aW5ncywgam9ibmFtZSwgZm9yY2VpdCkKKyAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOworICAgIGNoYXJfdQkqam9ibmFtZTsKKyAgICBpbnQJCWZvcmNlaXQ7Cit7CisgICAgaW50CQlpOworICAgIGNoYXIJKnBhcGVyX25hbWU7CisgICAgaW50CQlwYXBlcl9zdHJsZW47CisgICAgaW50CQlmb250c2l6ZTsKKyAgICBjaGFyX3UJKnA7CisgICAgZG91YmxlICAgICAgbGVmdDsKKyAgICBkb3VibGUgICAgICByaWdodDsKKyAgICBkb3VibGUgICAgICB0b3A7CisgICAgZG91YmxlICAgICAgYm90dG9tOworCisjaWYgMAorICAgIC8qCisgICAgICogVE9ETzoKKyAgICAgKiBJZiAiZm9yY2VpdCIgaXMgZmFsc2U6IHBvcCB1cCBhIGRpYWxvZyB0byBzZWxlY3Q6CisgICAgICoJLSBwcmludGVyIG5hbWUKKyAgICAgKgktIGNvcGllcworICAgICAqCS0gY29sbGF0ZWQvdW5jb2xsYXRlZAorICAgICAqCS0gZHVwbGV4IG9mZi9sb25nIHNpZGUvc2hvcnQgc2lkZQorICAgICAqCS0gcGFwZXIgc2l6ZQorICAgICAqCS0gcG9ydHJhaXQvbGFuZHNjYXBlCisgICAgICoJLSBmb250IHNpemUKKyAgICAgKgorICAgICAqIElmICJmb3JjZWl0IiBpcyB0cnVlOiB1c2UgdGhlIGRlZmF1bHQgcHJpbnRlciBhbmQgc2V0dGluZ3MKKyAgICAgKi8KKyAgICBpZiAoZm9yY2VpdCkKKwlzX3BkLkZsYWdzIHw9IFBEX1JFVFVSTkRFRkFVTFQ7CisjZW5kaWYKKworICAgIC8qCisgICAgICogRmluZCB0aGUgc2l6ZSBvZiB0aGUgcGFwZXIgYW5kIHNldCB0aGUgbWFyZ2lucy4KKyAgICAgKi8KKyAgICBwcnRfcG9ydHJhaXQgPSAoIXByaW50ZXJfb3B0c1tPUFRfUFJJTlRfUE9SVFJBSVRdLnByZXNlbnQKKwkgICB8fCBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX1BPUlRSQUlUXS5zdHJpbmdbMF0pID09ICd5Jyk7CisgICAgaWYgKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfUEFQRVJdLnByZXNlbnQpCisgICAgeworCXBhcGVyX25hbWUgPSAoY2hhciAqKXByaW50ZXJfb3B0c1tPUFRfUFJJTlRfUEFQRVJdLnN0cmluZzsKKwlwYXBlcl9zdHJsZW4gPSBwcmludGVyX29wdHNbT1BUX1BSSU5UX1BBUEVSXS5zdHJsZW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcGFwZXJfbmFtZSA9ICJBNCI7CisJcGFwZXJfc3RybGVuID0gMjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFBSVF9NRURJQVNJWkVfTEVOOyArK2kpCisJaWYgKFNUUkxFTihwcnRfbWVkaWFzaXplW2ldLm5hbWUpID09ICh1bnNpZ25lZClwYXBlcl9zdHJsZW4KKwkJJiYgU1RSTklDTVAocHJ0X21lZGlhc2l6ZVtpXS5uYW1lLCBwYXBlcl9uYW1lLAorCQkJCQkJCSAgIHBhcGVyX3N0cmxlbikgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgaWYgKGkgPT0gUFJUX01FRElBU0laRV9MRU4pCisJaSA9IDA7CisgICAgcHJ0X21lZGlhID0gaTsKKworICAgIC8qCisgICAgICogU2V0IFBTIHBhZ2VzaXplIGJhc2VkIG9uIG1lZGlhIGRpbWVuc2lvbnMgYW5kIHByaW50IG9yaWVudGF0aW9uLgorICAgICAqIE5vdGU6IE1lZGlhIGFuZCBwYWdlIHNpemVzIGhhdmUgZGVmaW5lZCBtZWFuaW5ncyBpbiBQb3N0U2NyaXB0IGFuZCBzaG91bGQKKyAgICAgKiBiZSBrZXB0IGRpc3RpbmN0LiAgTWVkaWEgaXMgdGhlIHBhcGVyIChvciB0cmFuc3BhcmVuY3ksIG9yIC4uLikgdGhhdCBpcworICAgICAqIHByaW50ZWQgb24sIHdoZXJlYXMgdGhlIHBhZ2Ugc2l6ZSBpcyB0aGUgYXJlYSB0aGF0IHRoZSBQb3N0U2NyaXB0CisgICAgICogaW50ZXJwcmV0ZXIgcmVuZGVycyBpbnRvLgorICAgICAqLworICAgIGlmIChwcnRfcG9ydHJhaXQpCisgICAgeworCXBydF9wYWdlX3dpZHRoID0gcHJ0X21lZGlhc2l6ZVtpXS53aWR0aDsKKwlwcnRfcGFnZV9oZWlnaHQgPSBwcnRfbWVkaWFzaXplW2ldLmhlaWdodDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlwcnRfcGFnZV93aWR0aCA9IHBydF9tZWRpYXNpemVbaV0uaGVpZ2h0OworCXBydF9wYWdlX2hlaWdodCA9IHBydF9tZWRpYXNpemVbaV0ud2lkdGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgUFMgcGFnZSBtYXJnaW5zIGJhc2VkIG9uIHRoZSBQUyBwYWdlc2l6ZSwgbm90IHRoZSBtZWRpYXNpemUgLSB0aGlzCisgICAgICogbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlIGNwbCBhbmQgbHBwIGFyZSBjYWxjdWxhdGVkLgorICAgICAqLworICAgIHBydF9wYWdlX21hcmdpbnMocHJ0X3BhZ2Vfd2lkdGgsIHBydF9wYWdlX2hlaWdodCwgJmxlZnQsICZyaWdodCwgJnRvcCwKKwkJCQkJCQkJICAgICZib3R0b20pOworICAgIHBydF9sZWZ0X21hcmdpbiA9IChmbG9hdClsZWZ0OworICAgIHBydF9yaWdodF9tYXJnaW4gPSAoZmxvYXQpcmlnaHQ7CisgICAgcHJ0X3RvcF9tYXJnaW4gPSAoZmxvYXQpdG9wOworICAgIHBydF9ib3R0b21fbWFyZ2luID0gKGZsb2F0KWJvdHRvbTsKKworICAgIC8qCisgICAgICogU2V0IHVwIHRoZSBmb250IHNpemUuCisgICAgICovCisgICAgZm9udHNpemUgPSBQUlRfUFNfREVGQVVMVF9GT05UU0laRTsKKyAgICBmb3IgKHAgPSBwX3BmbjsgKHAgPSB2aW1fc3RyY2hyKHAsICc6JykpICE9IE5VTEw7ICsrcCkKKwlpZiAocFsxXSA9PSAnaCcgJiYgVklNX0lTRElHSVQocFsyXSkpCisJICAgIGZvbnRzaXplID0gYXRvaSgoY2hhciAqKXAgKyAyKTsKKyAgICBwcnRfZm9udF9tZXRyaWNzKGZvbnRzaXplKTsKKworICAgIC8qCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgbGluZSwgYW5kIGxpbmVzIHBlciBwYWdlIGZvciB0aGUKKyAgICAgKiBnZW5lcmljIHByaW50IGNvZGUuCisgICAgICovCisgICAgcHNldHRpbmdzLT5jaGFyc19wZXJfbGluZSA9IHBydF9nZXRfY3BsKCk7CisgICAgcHNldHRpbmdzLT5saW5lc19wZXJfcGFnZSA9IHBydF9nZXRfbHBwKCk7CisKKyAgICAvKiBDYXRjaCBtYXJnaW4gc2V0dGluZ3MgdGhhdCBsZWF2ZSBubyBzcGFjZSBmb3Igb3V0cHV0ISAqLworICAgIGlmIChwc2V0dGluZ3MtPmNoYXJzX3Blcl9saW5lIDw9IDAgfHwgcHNldHRpbmdzLT5saW5lc19wZXJfcGFnZSA8PSAwKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBTb3J0IG91dCB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byBiZSBwcmludGVkLiAgUFMgYnkgZGVmYXVsdCB3aWxsIGRvCisgICAgICogdW5jb2xsYXRlZCBjb3BpZXMgZm9yIHlvdSwgc28gb25jZSB3ZSBrbm93IGhvdyBtYW55IHVuY29sbGF0ZWQgY29waWVzIGFyZQorICAgICAqIHdhbnRlZCBjYWNoZSBpdCBhd2F5IGFuZCBsaWUgdG8gdGhlIGdlbmVyaWMgY29kZSB0aGF0IHdlIG9ubHkgd2FudCBvbmUKKyAgICAgKiB1bmNvbGxhdGVkIGNvcHkuCisgICAgICovCisgICAgcHNldHRpbmdzLT5uX2NvbGxhdGVkX2NvcGllcyA9IDE7CisgICAgcHNldHRpbmdzLT5uX3VuY29sbGF0ZWRfY29waWVzID0gMTsKKyAgICBwcnRfbnVtX2NvcGllcyA9IDE7CisgICAgcHJ0X2NvbGxhdGUgPSAoIXByaW50ZXJfb3B0c1tPUFRfUFJJTlRfQ09MTEFURV0ucHJlc2VudAorCSAgICB8fCBUT0xPV0VSX0FTQyhwcmludGVyX29wdHNbT1BUX1BSSU5UX0NPTExBVEVdLnN0cmluZ1swXSkgPT0gJ3knKTsKKyAgICBpZiAocHJ0X2NvbGxhdGUpCisgICAgeworCS8qIFRPRE86IEdldCBudW1iZXIgb2YgY29sbGF0ZWQgY29waWVzIHdhbnRlZC4gKi8KKwlwc2V0dGluZ3MtPm5fY29sbGF0ZWRfY29waWVzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBUT0RPOiBHZXQgbnVtYmVyIG9mIHVuY29sbGF0ZWQgY29waWVzIHdhbnRlZCBhbmQgdXBkYXRlIHRoZSBjYWNoZWQKKwkgKiBjb3VudC4KKwkgKi8KKwlwcnRfbnVtX2NvcGllcyA9IDE7CisgICAgfQorCisgICAgcHNldHRpbmdzLT5qb2JuYW1lID0gam9ibmFtZTsKKworICAgIC8qCisgICAgICogU2V0IHVwIHByaW50ZXIgZHVwbGV4IGFuZCB0dW1ibGUgYmFzZWQgb24gRHVwbGV4IG9wdGlvbiBzZXR0aW5nIC0gZGVmYXVsdAorICAgICAqIGlzIGxvbmcgc2lkZWQgZHVwbGV4IHByaW50aW5nIChpLmUuIG5vIHR1bWJsZSkuCisgICAgICovCisgICAgcHJ0X2R1cGxleCA9IFRSVUU7CisgICAgcHJ0X3R1bWJsZSA9IEZBTFNFOworICAgIHBzZXR0aW5ncy0+ZHVwbGV4ID0gMTsKKyAgICBpZiAocHJpbnRlcl9vcHRzW09QVF9QUklOVF9EVVBMRVhdLnByZXNlbnQpCisgICAgeworCWlmIChTVFJOSUNNUChwcmludGVyX29wdHNbT1BUX1BSSU5UX0RVUExFWF0uc3RyaW5nLCAib2ZmIiwgMykgPT0gMCkKKwl7CisJICAgIHBydF9kdXBsZXggPSBGQUxTRTsKKwkgICAgcHNldHRpbmdzLT5kdXBsZXggPSAwOworCX0KKwllbHNlIGlmIChTVFJOSUNNUChwcmludGVyX29wdHNbT1BUX1BSSU5UX0RVUExFWF0uc3RyaW5nLCAic2hvcnQiLCA1KQorCQkJCQkJCQkJID09IDApCisJICAgIHBydF90dW1ibGUgPSBUUlVFOworICAgIH0KKworICAgIC8qIEZvciBub3cgdXNlciBhYm9ydCBub3Qgc3VwcG9ydGVkICovCisgICAgcHNldHRpbmdzLT51c2VyX2Fib3J0ID0gMDsKKworICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgZmlsZSBuYW1lLCB1c2UgYSB0ZW1wIGZpbGUuICovCisgICAgaWYgKHBzZXR0aW5ncy0+b3V0ZmlsZSA9PSBOVUxMKQorICAgIHsKKwlwcnRfcHNfZmlsZV9uYW1lID0gdmltX3RlbXBuYW1lKCdwJyk7CisJaWYgKHBydF9wc19maWxlX25hbWUgPT0gTlVMTCkKKwl7CisJICAgIEVNU0coXyhlX25vdG1wKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlwcnRfcHNfZmQgPSBtY2hfZm9wZW4oKGNoYXIgKilwcnRfcHNfZmlsZV9uYW1lLCBXUklURUJJTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcCA9IGV4cGFuZF9lbnZfc2F2ZShwc2V0dGluZ3MtPm91dGZpbGUpOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBwcnRfcHNfZmQgPSBtY2hfZm9wZW4oKGNoYXIgKilwLCBXUklURUJJTik7CisJICAgIHZpbV9mcmVlKHApOworCX0KKyAgICB9CisgICAgaWYgKHBydF9wc19mZCA9PSBOVUxMKQorICAgIHsKKwlFTVNHKF8oIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIpKTsKKwltY2hfcHJpbnRfY2xlYW51cCgpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIGdhX2luaXQyKCZwcnRfcHNfYnVmZmVyLCAoaW50KXNpemVvZihjaGFyKSwgUFJUX1BTX0RFRkFVTFRfQlVGRkVSX1NJWkUpOworCisgICAgcHJ0X3BhZ2VfbnVtID0gMDsKKworICAgIHBydF9hdHRyaWJ1dGVfY2hhbmdlID0gRkFMU0U7CisgICAgcHJ0X25lZWRfbW92ZXRvID0gRkFMU0U7CisgICAgcHJ0X25lZWRfZm9udCA9IEZBTFNFOworICAgIHBydF9uZWVkX2ZnY29sID0gRkFMU0U7CisgICAgcHJ0X25lZWRfYmdjb2wgPSBGQUxTRTsKKyAgICBwcnRfbmVlZF91bmRlcmxpbmUgPSBGQUxTRTsKKworICAgIHBydF9maWxlX2Vycm9yID0gRkFMU0U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICBzdGF0aWMgaW50CitwcnRfYWRkX3Jlc291cmNlKHJlc291cmNlKQorICAgIHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2U7Cit7CisgICAgRklMRSoJZmRfcmVzb3VyY2U7CisgICAgY2hhcl91CXJlc291cmNlX2J1ZmZlcls1MTJdOworICAgIGNoYXIJKnJlc291cmNlX25hbWVbMV07CisgICAgc2l6ZV90CWJ5dGVzX3JlYWQ7CisKKyAgICBmZF9yZXNvdXJjZSA9IG1jaF9mb3BlbigoY2hhciAqKXJlc291cmNlLT5maWxlbmFtZSwgUkVBREJJTik7CisgICAgaWYgKGZkX3Jlc291cmNlID09IE5VTEwpCisgICAgeworCUVNU0cyKF8oIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiKSwgcmVzb3VyY2UtPmZpbGVuYW1lKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJlc291cmNlX25hbWVbMF0gPSAoY2hhciAqKXJlc291cmNlLT50aXRsZTsKKyAgICBwcnRfZHNjX3Jlc291cmNlcygiQmVnaW5SZXNvdXJjZSIsCisJCQkgICAgcmVzb3VyY2VfdHlwZXNbcmVzb3VyY2UtPnR5cGVdLCAxLCByZXNvdXJjZV9uYW1lKTsKKworICAgIHBydF9kc2NfdGV4dGxpbmUoIkJlZ2luRG9jdW1lbnQiLCAoY2hhciAqKXJlc291cmNlLT5maWxlbmFtZSk7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwlieXRlc19yZWFkID0gZnJlYWQoKGNoYXIgKilyZXNvdXJjZV9idWZmZXIsIHNpemVvZihjaGFyX3UpLAorCQkJICAgc2l6ZW9mKHJlc291cmNlX2J1ZmZlciksIGZkX3Jlc291cmNlKTsKKwlpZiAoZmVycm9yKGZkX3Jlc291cmNlKSkKKwl7CisJICAgIEVNU0cyKF8oIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIpLAorCQkJCQkJCSAgICByZXNvdXJjZS0+ZmlsZW5hbWUpOworCSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOworCSAgICByZXR1cm4gRkFMU0U7CisJfQorCWlmIChieXRlc19yZWFkID09IDApCisJICAgIGJyZWFrOworCXBydF93cml0ZV9maWxlX3Jhd19sZW4ocmVzb3VyY2VfYnVmZmVyLCBieXRlc19yZWFkKTsKKwlpZiAocHJ0X2ZpbGVfZXJyb3IpCisJeworCSAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOworCSAgICByZXR1cm4gRkFMU0U7CisJfQorICAgIH0KKyAgICBmY2xvc2UoZmRfcmVzb3VyY2UpOworCisgICAgcHJ0X2RzY19ub2FyZygiRW5kRG9jdW1lbnQiKTsKKworICAgIHBydF9kc2Nfbm9hcmcoIkVuZFJlc291cmNlIik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworICAgIGludAorbWNoX3ByaW50X2JlZ2luKHBzZXR0aW5ncykKKyAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOworeworICAgIHRpbWVfdAlub3c7CisgICAgaW50CQliYm94WzRdOworICAgIGNoYXIJKnBfdGltZTsKKyAgICBjaGFyCSpyZXNvdXJjZVsxXTsKKyAgICBkb3VibGUgICAgICBsZWZ0OworICAgIGRvdWJsZSAgICAgIHJpZ2h0OworICAgIGRvdWJsZSAgICAgIHRvcDsKKyAgICBkb3VibGUgICAgICBib3R0b207CisgICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TIHJlc19wcm9sb2c7CisgICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TIHJlc19lbmNvZGluZzsKKyAgICBjaGFyX3UgICAgICBidWZmZXJbMjU2XTsKKyAgICBjaGFyX3UgICAgICAqcF9lbmNvZGluZzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlwcm9wczsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBQUyBEU0MgSGVhZGVyIGNvbW1lbnRzIC0gbm8gUFMgY29kZSEKKyAgICAgKi8KKyAgICBwcnRfZHNjX3N0YXJ0KCk7CisgICAgcHJ0X2RzY190ZXh0bGluZSgiVGl0bGUiLCAoY2hhciAqKXBzZXR0aW5ncy0+am9ibmFtZSk7CisgICAgLyogVE9ETyAtIHBsYXRmb3JtIGRlcGVuZGVudCB1c2VyIG5hbWUgcmV0cmlldmFsICovCisgICAgcHJ0X2RzY190ZXh0bGluZSgiRm9yIiwgIlVua25vd24iKTsKKyAgICBwcnRfZHNjX3RleHRsaW5lKCJDcmVhdG9yIiwgVklNX1ZFUlNJT05fTE9ORyk7CisgICAgLyogTm90ZTogdG8gZW5zdXJlIENsZWFuOGJpdCBJIGRvbid0IHRoaW5rIHdlIGNhbiB1c2UgTENfVElNRSAqLworICAgIG5vdyA9IHRpbWUoTlVMTCk7CisgICAgcF90aW1lID0gY3RpbWUoJm5vdyk7CisgICAgLyogTm90ZTogY3RpbWUoKSBhZGRzIGEgXG4gc28gd2UgaGF2ZSB0byByZW1vdmUgaXQgOi0oICovCisgICAgKih2aW1fc3RyY2hyKChjaGFyX3UgKilwX3RpbWUsICdcbicpKSA9ICdcMCc7CisgICAgcHJ0X2RzY190ZXh0bGluZSgiQ3JlYXRpb25EYXRlIiwgcF90aW1lKTsKKyAgICBwcnRfZHNjX3RleHRsaW5lKCJEb2N1bWVudERhdGEiLCAiQ2xlYW44Qml0Iik7CisgICAgcHJ0X2RzY190ZXh0bGluZSgiT3JpZW50YXRpb24iLCAiUG9ydHJhaXQiKTsKKyAgICBwcnRfZHNjX2F0ZW5kKCJQYWdlcyIpOworICAgIHBydF9kc2NfdGV4dGxpbmUoIlBhZ2VPcmRlciIsICJBc2NlbmQiKTsKKyAgICAvKiBUaGUgYmJveCBkb2VzIG5vdCBjaGFuZ2Ugd2l0aCBvcmllbnRhdGlvbiAtIGl0IGlzIGFsd2F5cyBpbiB0aGUgZGVmYXVsdAorICAgICAqIHVzZXIgY29vcmRpbmF0ZSBzeXN0ZW0hICBXZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHJpZ2h0IGFuZCBib3R0b20KKyAgICAgKiBjb29yZGluYXRlcyBiYXNlZCBvbiB0aGUgZm9udCBtZXRyaWNzIGZvciB0aGUgYmJveCB0byBiZSBhY2N1cmF0ZS4gKi8KKyAgICBwcnRfcGFnZV9tYXJnaW5zKHBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS53aWR0aCwKKwkJCQkJICAgIHBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS5oZWlnaHQsCisJCQkJCSAgICAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICBiYm94WzBdID0gKGludClsZWZ0OworICAgIGlmIChwcnRfcG9ydHJhaXQpCisgICAgeworCS8qIEluIHBvcnRyYWl0IHByaW50aW5nIHRoZSBmaXhlZCBwb2ludCBpcyB0aGUgdG9wIGxlZnQgY29ybmVyIHNvIHdlCisJICogZGVyaXZlIHRoZSBiYm94IGZyb20gdGhhdCBwb2ludC4gIFdlIGhhdmUgdGhlIGV4cGVjdGVkIGNwbCBjaGFycworCSAqIGFjcm9zcyB0aGUgbWVkaWEgYW5kIGxwcCBsaW5lcyBkb3duIHRoZSBtZWRpYS4KKwkgKi8KKwliYm94WzFdID0gKGludCkodG9wIC0gKHBzZXR0aW5ncy0+bGluZXNfcGVyX3BhZ2UgKyBwcnRfaGVhZGVyX2hlaWdodCgpKQorCQkJCQkJCSAgICAqIHBydF9saW5lX2hlaWdodCk7CisJYmJveFsyXSA9IChpbnQpKGxlZnQgKyBwc2V0dGluZ3MtPmNoYXJzX3Blcl9saW5lICogcHJ0X2NoYXJfd2lkdGgKKwkJCQkJCQkJCSsgMC41KTsKKwliYm94WzNdID0gKGludCkodG9wICsgMC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBJbiBsYW5kc2NhcGUgcHJpbnRpbmcgdGhlIGZpeGVkIHBvaW50IGlzIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgc28gd2UKKwkgKiBkZXJpdmUgdGhlIGJib3ggZnJvbSB0aGF0IHBvaW50LiAgV2UgaGF2ZSBscHAgY2hhcnMgYWNyb3NzIHRoZSBtZWRpYQorCSAqIGFuZCBjcGwgbGluZXMgdXAgdGhlIG1lZGlhLgorCSAqLworCWJib3hbMV0gPSAoaW50KWJvdHRvbTsKKwliYm94WzJdID0gKGludCkobGVmdCArICgocHNldHRpbmdzLT5saW5lc19wZXJfcGFnZQorCQkJICAgICAgKyBwcnRfaGVhZGVyX2hlaWdodCgpKSAqIHBydF9saW5lX2hlaWdodCkgKyAwLjUpOworCWJib3hbM10gPSAoaW50KShib3R0b20gKyBwc2V0dGluZ3MtPmNoYXJzX3Blcl9saW5lICogcHJ0X2NoYXJfd2lkdGgKKwkJCQkJCQkJCSsgMC41KTsKKyAgICB9CisgICAgcHJ0X2RzY19pbnRzKCJCb3VuZGluZ0JveCIsIDQsIGJib3gpOworICAgIC8qIFRoZSBtZWRpYSB3aWR0aCBhbmQgaGVpZ2h0IGRvZXMgbm90IGNoYW5nZSB3aXRoIGxhbmRzY2FwZSBwcmludGluZyEgKi8KKyAgICBwcnRfZHNjX2RvY21lZGlhKHBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS5uYW1lLAorCQkJCXBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS53aWR0aCwKKwkJCQlwcnRfbWVkaWFzaXplW3BydF9tZWRpYV0uaGVpZ2h0LAorCQkJCShkb3VibGUpMCwgTlVMTCwgTlVMTCk7CisgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkRvY3VtZW50TmVlZGVkUmVzb3VyY2VzIiwgImZvbnQiLCA0LAorCQkJCQkJICAgICBwcnRfcHNfZm9udC5wc19mb250bmFtZSk7CisKKyAgICAvKiBTZWFyY2ggZm9yIGV4dGVybmFsIHJlc291cmNlcyB3ZSBzdXBwbHkgKi8KKyAgICBpZiAoIXBydF9maW5kX3Jlc291cmNlKCJwcm9sb2ciLCAmcmVzX3Byb2xvZykpCisgICAgeworCUVNU0coXygiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIpKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghcHJ0X29wZW5fcmVzb3VyY2UoJnJlc19wcm9sb2cpKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAoIXBydF9jaGVja19yZXNvdXJjZSgmcmVzX3Byb2xvZywgUFJUX1BST0xPR19WRVJTSU9OKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgLyogRmluZCBhbiBlbmNvZGluZyB0byB1c2UgZm9yIHByaW50aW5nLgorICAgICAqIENoZWNrICdwcmludGVuY29kaW5nJy4gSWYgbm90IHNldCBvciBub3QgZm91bmQsIHRoZW4gdXNlICdlbmNvZGluZycuIElmCisgICAgICogdGhhdCBjYW5ub3QgYmUgZm91bmQgdGhlbiBkZWZhdWx0IHRvICJsYXRpbjEiLgorICAgICAqIE5vdGU6IFZJTSBzcGVjaWZpYyBlbmNvZGluZyBoZWFkZXIgaXMgYWx3YXlzIHNraXBwZWQuCisgICAgICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIHByb3BzID0gZW5jX2Nhbm9uX3Byb3BzKHBfZW5jKTsKKyNlbmRpZgorICAgIHBfZW5jb2RpbmcgPSBlbmNfc2tpcChwX3BlbmMpOworICAgIGlmICgqcF9lbmNvZGluZyA9PSBOVUwKKwkgICAgfHwgIXBydF9maW5kX3Jlc291cmNlKChjaGFyICopcF9lbmNvZGluZywgJnJlc19lbmNvZGluZykpCisgICAgeworCS8qICdwcmludGVuY29kaW5nJyBub3Qgc2V0IG9yIG5vdCBzdXBwb3J0ZWQgLSBmaW5kIGFsdGVybmF0ZSAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwlwX2VuY29kaW5nID0gZW5jX3NraXAocF9lbmMpOworCWlmICghKHByb3BzICYgRU5DXzhCSVQpCisJCXx8ICFwcnRfZmluZF9yZXNvdXJjZSgoY2hhciAqKXBfZW5jb2RpbmcsICZyZXNfZW5jb2RpbmcpKQorCXsKKwkgICAgLyogOC1iaXQgJ2VuY29kaW5nJyBpcyBub3Qgc3VwcG9ydGVkICovCisjZW5kaWYKKwkgICAgLyogVXNlIGxhdGluMSBhcyBkZWZhdWx0IHByaW50aW5nIGVuY29kaW5nICovCisJICAgIHBfZW5jb2RpbmcgPSAoY2hhcl91ICopImxhdGluMSI7CisJICAgIGlmICghcHJ0X2ZpbmRfcmVzb3VyY2UoKGNoYXIgKilwX2VuY29kaW5nLCAmcmVzX2VuY29kaW5nKSkKKwkgICAgeworCQlFTVNHMihfKCJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiKSwKKwkJCXBfZW5jb2RpbmcpOworCQlyZXR1cm4gRkFMU0U7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJfQorI2VuZGlmCisgICAgfQorICAgIGlmICghcHJ0X29wZW5fcmVzb3VyY2UoJnJlc19lbmNvZGluZykpCisJcmV0dXJuIEZBTFNFOworICAgIC8qIEZvciB0aGUgbW9tZW50IHRoZXJlIGFyZSBubyBjaGVja3Mgb24gZW5jb2RpbmcgcmVzb3VyY2UgZmlsZXMgdG8gcGVyZm9ybSAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBTZXQgdXAgZW5jb2RpbmcgY29udmVyc2lvbiBpZiBzdGFydGluZyBmcm9tIG11bHRpLWJ5dGUgKi8KKyAgICBwcm9wcyA9IGVuY19jYW5vbl9wcm9wcyhwX2VuYyk7CisgICAgaWYgKCEocHJvcHMgJiBFTkNfOEJJVCkpCisgICAgeworCWlmIChGQUlMID09IGNvbnZlcnRfc2V0dXAoJnBydF9jb252LCBwX2VuYywgcF9lbmNvZGluZykpCisJeworCSAgICBFTVNHMihfKCJFNjIwOiBVbmFibGUgdG8gY29udmVydCBmcm9tIG11bHRpLWJ5dGUgdG8gXCIlc1wiIGVuY29kaW5nIiksCisJCSAgICBwX2VuY29kaW5nKTsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlwcnRfZG9fY29udiA9IFRSVUU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBMaXN0IHJlc291cmNlcyBzdXBwbGllZCAqLworICAgIHJlc291cmNlWzBdID0gKGNoYXIgKilidWZmZXI7CisgICAgU1RSQ1BZKGJ1ZmZlciwgcmVzX3Byb2xvZy50aXRsZSk7CisgICAgU1RSQ0FUKGJ1ZmZlciwgIiAiKTsKKyAgICBTVFJDQVQoYnVmZmVyLCByZXNfcHJvbG9nLnZlcnNpb24pOworICAgIHBydF9kc2NfcmVzb3VyY2VzKCJEb2N1bWVudFN1cHBsaWVkUmVzb3VyY2VzIiwgInByb2NzZXQiLCAxLCByZXNvdXJjZSk7CisgICAgU1RSQ1BZKGJ1ZmZlciwgcmVzX2VuY29kaW5nLnRpdGxlKTsKKyAgICBTVFJDQVQoYnVmZmVyLCAiICIpOworICAgIFNUUkNBVChidWZmZXIsIHJlc19lbmNvZGluZy52ZXJzaW9uKTsKKyAgICBwcnRfZHNjX3Jlc291cmNlcyhOVUxMLCAiZW5jb2RpbmciLCAxLCByZXNvdXJjZSk7CisgICAgcHJ0X2RzY19yZXF1aXJlbWVudHMocHJ0X2R1cGxleCwgcHJ0X3R1bWJsZSwgcHJ0X2NvbGxhdGUsCisjaWZkZWYgRkVBVF9TWU5fSEwKKwkJCQkJcHNldHRpbmdzLT5kb19zeW50YXgKKyNlbHNlCisJCQkJCTAKKyNlbmRpZgorCQkJCQksIHBydF9udW1fY29waWVzKTsKKyAgICBwcnRfZHNjX25vYXJnKCJFbmRDb21tZW50cyIpOworCisgICAgLyoKKyAgICAgKiBQUyBEb2N1bWVudCBwYWdlIGRlZmF1bHRzCisgICAgICovCisgICAgcHJ0X2RzY19ub2FyZygiQmVnaW5EZWZhdWx0cyIpOworCisgICAgLyogTGlzdCBmb250IHJlc291cmNlcyBtb3N0IGxpa2VseSBjb21tb24gdG8gYWxsIHBhZ2VzICovCisgICAgcHJ0X2RzY19yZXNvdXJjZXMoIlBhZ2VSZXNvdXJjZXMiLCAiZm9udCIsIDQsIHBydF9wc19mb250LnBzX2ZvbnRuYW1lKTsKKyAgICAvKiBQYXBlciB3aWxsIGJlIHVzZWQgZm9yIGFsbCBwYWdlcyAqLworICAgIHBydF9kc2NfdGV4dGxpbmUoIlBhZ2VNZWRpYSIsIHBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS5uYW1lKTsKKworICAgIHBydF9kc2Nfbm9hcmcoIkVuZERlZmF1bHRzIik7CisKKyAgICAvKgorICAgICAqIFBTIERvY3VtZW50IHByb2xvZyBpbmNsdXNpb24gLSBhbGwgcmVxdWlyZWQgcHJvY3NldHMuCisgICAgICovCisgICAgcHJ0X2RzY19ub2FyZygiQmVnaW5Qcm9sb2ciKTsKKworICAgIC8qIEZvciBub3cgdGhlcmUgaXMganVzdCB0aGUgb25lIHByb2NzZXQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIFBTIGZpbGUuICovCisgICAgaWYgKCFwcnRfYWRkX3Jlc291cmNlKCZyZXNfcHJvbG9nKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBUaGVyZSB3aWxsIGJlIG9ubHkgb25lIGZvbnQgZW5jb2RpbmcgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIFBTIGZpbGUuICovCisgICAgaWYgKCFwcnRfYWRkX3Jlc291cmNlKCZyZXNfZW5jb2RpbmcpKQorCXJldHVybiBGQUxTRTsKKworICAgIHBydF9kc2Nfbm9hcmcoIkVuZFByb2xvZyIpOworCisgICAgLyoKKyAgICAgKiBQUyBEb2N1bWVudCBzZXR1cCAtIG11c3QgYXBwZWFyIGFmdGVyIHRoZSBwcm9sb2cKKyAgICAgKi8KKyAgICBwcnRfZHNjX25vYXJnKCJCZWdpblNldHVwIik7CisKKyAgICAvKiBEZXZpY2Ugc2V0dXAgLSBwYWdlIHNpemUgYW5kIG51bWJlciBvZiB1bmNvbGxhdGVkIGNvcGllcyAqLworICAgIHBydF93cml0ZV9pbnQoKGludClwcnRfbWVkaWFzaXplW3BydF9tZWRpYV0ud2lkdGgpOworICAgIHBydF93cml0ZV9pbnQoKGludClwcnRfbWVkaWFzaXplW3BydF9tZWRpYV0uaGVpZ2h0KTsKKyAgICBwcnRfd3JpdGVfaW50KDApOworICAgIHBydF93cml0ZV9zdHJpbmcoInNwc1xuIik7CisgICAgcHJ0X3dyaXRlX2ludChwcnRfbnVtX2NvcGllcyk7CisgICAgcHJ0X3dyaXRlX3N0cmluZygibmNcbiIpOworICAgIHBydF93cml0ZV9ib29sZWFuKHBydF9kdXBsZXgpOworICAgIHBydF93cml0ZV9ib29sZWFuKHBydF90dW1ibGUpOworICAgIHBydF93cml0ZV9zdHJpbmcoImR0XG4iKTsKKyAgICBwcnRfd3JpdGVfYm9vbGVhbihwcnRfY29sbGF0ZSk7CisgICAgcHJ0X3dyaXRlX3N0cmluZygiY1xuIik7CisKKyAgICAvKiBGb250IHJlc291cmNlIGluY2x1c2lvbiBhbmQgZGVmaW5pdGlvbiAqLworICAgIHBydF9kc2NfcmVzb3VyY2VzKCJJbmNsdWRlUmVzb3VyY2UiLCAiZm9udCIsIDEsCisJCQkJICZwcnRfcHNfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9ST01BTl0pOworICAgIHBydF9kZWZfZm9udCgiRjAiLCAoY2hhciAqKXBfZW5jb2RpbmcsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAorCQkJCSAgcHJ0X3BzX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfUk9NQU5dKTsKKyAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImZvbnQiLCAxLAorCQkJCSAgJnBydF9wc19mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERdKTsKKyAgICBwcnRfZGVmX2ZvbnQoIkYxIiwgKGNoYXIgKilwX2VuY29kaW5nLCAoaW50KXBydF9saW5lX2hlaWdodCwKKwkJCQkgICBwcnRfcHNfZm9udC5wc19mb250bmFtZVtQUlRfUFNfRk9OVF9CT0xEXSk7CisgICAgcHJ0X2RzY19yZXNvdXJjZXMoIkluY2x1ZGVSZXNvdXJjZSIsICJmb250IiwgMSwKKwkJCSAgICAgICAmcHJ0X3BzX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfT0JMSVFVRV0pOworICAgIHBydF9kZWZfZm9udCgiRjIiLCAoY2hhciAqKXBfZW5jb2RpbmcsIChpbnQpcHJ0X2xpbmVfaGVpZ2h0LAorCQkJCXBydF9wc19mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX09CTElRVUVdKTsKKyAgICBwcnRfZHNjX3Jlc291cmNlcygiSW5jbHVkZVJlc291cmNlIiwgImZvbnQiLCAxLAorCQkJICAgJnBydF9wc19mb250LnBzX2ZvbnRuYW1lW1BSVF9QU19GT05UX0JPTERPQkxJUVVFXSk7CisgICAgcHJ0X2RlZl9mb250KCJGMyIsIChjaGFyICopcF9lbmNvZGluZywgKGludClwcnRfbGluZV9oZWlnaHQsCisJCQkgICAgcHJ0X3BzX2ZvbnQucHNfZm9udG5hbWVbUFJUX1BTX0ZPTlRfQk9MRE9CTElRVUVdKTsKKworICAgIC8qIE1pc2MgY29uc3RhbnQgdmFycyB1c2VkIGZvciB1bmRlcmxpbmluZyBhbmQgYmFja2dyb3VuZCByZWN0cyAqLworICAgIHBydF9kZWZfdmFyKCJVTyIsIFBSVF9QU19GT05UX1RPX1VTRVIocHJ0X2xpbmVfaGVpZ2h0LAorCQkJCQkJcHJ0X3BzX2ZvbnQudWxpbmVfb2Zmc2V0KSwgMik7CisgICAgcHJ0X2RlZl92YXIoIlVXIiwgUFJUX1BTX0ZPTlRfVE9fVVNFUihwcnRfbGluZV9oZWlnaHQsCisJCQkJCQkgcHJ0X3BzX2ZvbnQudWxpbmVfd2lkdGgpLCAyKTsKKyAgICBwcnRfZGVmX3ZhcigiQk8iLCBwcnRfYmdjb2xfb2Zmc2V0LCAyKTsKKworICAgIHBydF9kc2Nfbm9hcmcoIkVuZFNldHVwIik7CisKKyAgICAvKiBGYWlsIGlmIGFueSBwcm9ibGVtcyB3cml0aW5nIG91dCB0byB0aGUgUFMgZmlsZSAqLworICAgIHJldHVybiAhcHJ0X2ZpbGVfZXJyb3I7Cit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfZW5kKHBzZXR0aW5ncykKKyAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOworeworICAgIHBydF9kc2Nfbm9hcmcoIlRyYWlsZXIiKTsKKworICAgIC8qCisgICAgICogT3V0cHV0IGFueSBpbmZvIHdlIGRvbid0IGtub3cgaW4gdG90byB1bnRpbCB3ZSBmaW5pc2gKKyAgICAgKi8KKyAgICBwcnRfZHNjX2ludHMoIlBhZ2VzIiwgMSwgJnBydF9wYWdlX251bSk7CisKKyAgICBwcnRfZHNjX25vYXJnKCJFT0YiKTsKKworICAgIGlmICghcHJ0X2ZpbGVfZXJyb3IgJiYgcHNldHRpbmdzLT5vdXRmaWxlID09IE5VTEwKKwkJCQkJJiYgIWdvdF9pbnQgJiYgIXBzZXR0aW5ncy0+dXNlcl9hYm9ydCkKKyAgICB7CisJLyogQ2xvc2UgdGhlIGZpbGUgZmlyc3QuICovCisJaWYgKHBydF9wc19mZCAhPSBOVUxMKQorCXsKKwkgICAgZmNsb3NlKHBydF9wc19mZCk7CisJICAgIHBydF9wc19mZCA9IE5VTEw7CisJfQorCXBydF9tZXNzYWdlKChjaGFyX3UgKilfKCJTZW5kaW5nIHRvIHByaW50ZXIuLi4iKSk7CisKKwkvKiBOb3QgcHJpbnRpbmcgdG8gYSBmaWxlOiB1c2UgJ3ByaW50ZXhwcicgdG8gcHJpbnQgdGhlIGZpbGUuICovCisJaWYgKGV2YWxfcHJpbnRleHByKHBydF9wc19maWxlX25hbWUsIHBzZXR0aW5ncy0+YXJndW1lbnRzKSA9PSBGQUlMKQorCSAgICBFTVNHKF8oIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiKSk7CisJZWxzZQorCSAgICBwcnRfbWVzc2FnZSgoY2hhcl91ICopXygiUHJpbnQgam9iIHNlbnQuIikpOworICAgIH0KKworICAgIG1jaF9wcmludF9jbGVhbnVwKCk7Cit9CisKKyAgICBpbnQKK21jaF9wcmludF9lbmRfcGFnZSgpCit7CisgICAgcHJ0X2ZsdXNoX2J1ZmZlcigpOworCisgICAgcHJ0X3dyaXRlX3N0cmluZygicmUgc3BcbiIpOworCisgICAgcHJ0X2RzY19ub2FyZygiUGFnZVRyYWlsZXIiKTsKKworICAgIHJldHVybiAhcHJ0X2ZpbGVfZXJyb3I7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIGludAorbWNoX3ByaW50X2JlZ2luX3BhZ2Uoc3RyKQorICAgIGNoYXJfdQkqc3RyOworeworICAgIGludAkJcGFnZV9udW1bMl07CisKKyAgICBwcnRfcGFnZV9udW0rKzsKKworICAgIHBhZ2VfbnVtWzBdID0gcGFnZV9udW1bMV0gPSBwcnRfcGFnZV9udW07CisgICAgcHJ0X2RzY19pbnRzKCJQYWdlIiwgMiwgcGFnZV9udW0pOworCisgICAgcHJ0X2RzY19ub2FyZygiQmVnaW5QYWdlU2V0dXAiKTsKKworICAgIHBydF93cml0ZV9zdHJpbmcoInN2XG4wIGdcbkYwIHNmXG4iKTsKKyAgICBwcnRfZmdjb2wgPSBQUkNPTE9SX0JMQUNLOworICAgIHBydF9iZ2NvbCA9IFBSQ09MT1JfV0hJVEU7CisgICAgcHJ0X2ZvbnQgPSBQUlRfUFNfRk9OVF9ST01BTjsKKworICAgIC8qIFNldCB1cCBwYWdlIHRyYW5zZm9ybWF0aW9uIGZvciBsYW5kc2NhcGUgcHJpbnRpbmcuICovCisgICAgaWYgKCFwcnRfcG9ydHJhaXQpCisgICAgeworCXBydF93cml0ZV9pbnQoLSgoaW50KXBydF9tZWRpYXNpemVbcHJ0X21lZGlhXS53aWR0aCkpOworCXBydF93cml0ZV9zdHJpbmcoInNsXG4iKTsKKyAgICB9CisKKyAgICBwcnRfZHNjX25vYXJnKCJFbmRQYWdlU2V0dXAiKTsKKworICAgIC8qIFdlIGhhdmUgcmVzZXQgdGhlIGZvbnQgYXR0cmlidXRlcywgZm9yY2Ugc2V0dGluZyB0aGVtIGFnYWluLiAqLworICAgIGN1cnJfYmcgPSAobG9uZ191KTB4ZmZmZmZmZmY7CisgICAgY3Vycl9mZyA9IChsb25nX3UpMHhmZmZmZmZmZjsKKyAgICBjdXJyX2JvbGQgPSBNQVlCRTsKKworICAgIHJldHVybiAhcHJ0X2ZpbGVfZXJyb3I7Cit9CisKKyAgICBpbnQKK21jaF9wcmludF9ibGFua19wYWdlKCkKK3sKKyAgICByZXR1cm4gKG1jaF9wcmludF9iZWdpbl9wYWdlKE5VTEwpID8gKG1jaF9wcmludF9lbmRfcGFnZSgpKSA6IEZBTFNFKTsKK30KKworc3RhdGljIGZsb2F0IHBydF9wb3NfeCA9IDA7CitzdGF0aWMgZmxvYXQgcHJ0X3Bvc195ID0gMDsKKworICAgIHZvaWQKK21jaF9wcmludF9zdGFydF9saW5lKG1hcmdpbiwgcGFnZV9saW5lKQorICAgIGludAkJbWFyZ2luOworICAgIGludAkJcGFnZV9saW5lOworeworICAgIHBydF9wb3NfeCA9IHBydF9sZWZ0X21hcmdpbjsKKyAgICBpZiAobWFyZ2luKQorCXBydF9wb3NfeCAtPSBwcnRfbnVtYmVyX3dpZHRoOworCisgICAgcHJ0X3Bvc195ID0gcHJ0X3RvcF9tYXJnaW4gLSBwcnRfZmlyc3RfbGluZV9oZWlnaHQgLQorCQkJCQlwYWdlX2xpbmUgKiBwcnRfbGluZV9oZWlnaHQ7CisKKyAgICBwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7CisgICAgcHJ0X25lZWRfbW92ZXRvID0gVFJVRTsKK30KKworLypBUkdTVVNFRCovCisgICAgaW50CittY2hfcHJpbnRfdGV4dF9vdXQocCwgbGVuKQorICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBpbnQJCW5lZWRfYnJlYWs7CisgICAgY2hhcl91CWNoOworICAgIGNoYXJfdSAgICAgIGNoX2J1ZmZbOF07CisKKyAgICAvKiBPdXRwdXQgYW55IHJlcXVpcmVkIGNoYW5nZXMgdG8gdGhlIGdyYXBoaWNzIHN0YXRlLCBhZnRlciBmbHVzaGluZyBhbnkKKyAgICAgKiB0ZXh0IGJ1ZmZlcmVkIHNvIGZhci4KKyAgICAgKi8KKyAgICBpZiAocHJ0X2F0dHJpYnV0ZV9jaGFuZ2UpCisgICAgeworCXBydF9mbHVzaF9idWZmZXIoKTsKKwkvKiBSZXNldCBjb3VudCBvZiBudW1iZXIgb2YgY2hhcnMgdGhhdCB3aWxsIGJlIHByaW50ZWQgKi8KKwlwcnRfdGV4dF9jb3VudCA9IDA7CisKKwlpZiAocHJ0X25lZWRfbW92ZXRvKQorCXsKKwkgICAgcHJ0X3Bvc194X21vdmV0byA9IHBydF9wb3NfeDsKKwkgICAgcHJ0X3Bvc195X21vdmV0byA9IHBydF9wb3NfeTsKKwkgICAgcHJ0X2RvX21vdmV0byA9IFRSVUU7CisKKwkgICAgcHJ0X25lZWRfbW92ZXRvID0gRkFMU0U7CisJfQorCWlmIChwcnRfbmVlZF9mb250KQorCXsKKwkgICAgcHJ0X3dyaXRlX3N0cmluZygiRiIpOworCSAgICBwcnRfd3JpdGVfaW50KHBydF9mb250KTsKKwkgICAgcHJ0X3dyaXRlX3N0cmluZygic2ZcbiIpOworCSAgICBwcnRfbmVlZF9mb250ID0gRkFMU0U7CisJfQorCWlmIChwcnRfbmVlZF9mZ2NvbCkKKwl7CisJICAgIGludCAgICAgciwgZywgYjsKKwkgICAgciA9ICgodW5zaWduZWQpcHJ0X2ZnY29sICYgMHhmZjAwMDApID4+IDE2OworCSAgICBnID0gKCh1bnNpZ25lZClwcnRfZmdjb2wgJiAweGZmMDApID4+IDg7CisJICAgIGIgPSBwcnRfZmdjb2wgJiAweGZmOworCisJICAgIHBydF93cml0ZV9yZWFsKHIgLyAyNTUuMCwgMyk7CisJICAgIGlmIChyID09IGcgJiYgZyA9PSBiKQorCSAgICB7CisJCXBydF93cml0ZV9zdHJpbmcoImdcbiIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlwcnRfd3JpdGVfcmVhbChnIC8gMjU1LjAsIDMpOworCQlwcnRfd3JpdGVfcmVhbChiIC8gMjU1LjAsIDMpOworCQlwcnRfd3JpdGVfc3RyaW5nKCJyXG4iKTsKKwkgICAgfQorCSAgICBwcnRfbmVlZF9mZ2NvbCA9IEZBTFNFOworCX0KKworCWlmIChwcnRfYmdjb2wgIT0gUFJDT0xPUl9XSElURSkKKwl7CisJICAgIHBydF9uZXdfYmdjb2wgPSBwcnRfYmdjb2w7CisJICAgIGlmIChwcnRfbmVlZF9iZ2NvbCkKKwkJcHJ0X2RvX2JnY29sID0gVFJVRTsKKwl9CisJZWxzZQorCSAgICBwcnRfZG9fYmdjb2wgPSBGQUxTRTsKKwlwcnRfbmVlZF9iZ2NvbCA9IEZBTFNFOworCisJaWYgKHBydF9uZWVkX3VuZGVybGluZSkKKwkgICAgcHJ0X2RvX3VuZGVybGluZSA9IHBydF91bmRlcmxpbmU7CisJcHJ0X25lZWRfdW5kZXJsaW5lID0gRkFMU0U7CisKKwlwcnRfYXR0cmlidXRlX2NoYW5nZSA9IEZBTFNFOworICAgIH0KKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAocHJ0X2RvX2NvbnYpCisgICAgeworCS8qIENvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIDgtYml0IGVuY29kaW5nICovCisJcCA9IHN0cmluZ19jb252ZXJ0KCZwcnRfY29udiwgcCwgJmxlbik7CisJaWYgKHAgPT0gTlVMTCkKKwkgICAgcCA9IChjaGFyX3UgKikiIjsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBBZGQgbmV4dCBjaGFyYWN0ZXIgdG8gYnVmZmVyIG9mIGNoYXJhY3RlcnMgdG8gb3V0cHV0LgorICAgICAqIE5vdGU6IE9uZSBwcmludGVkIGNoYXJhY3RlciBtYXkgcmVxdWlyZSBzZXZlcmFsIFBTIGNoYXJhY3RlcnMgdG8KKyAgICAgKiByZXByZXNlbnQgaXQsIGJ1dCB3ZSBvbmx5IGNvdW50IHRoZW0gYXMgb25lIHByaW50ZWQgY2hhcmFjdGVyLgorICAgICAqLworICAgIGNoID0gKnA7CisgICAgaWYgKGNoIDwgMzIgfHwgY2ggPT0gJygnIHx8IGNoID09ICcpJyB8fCBjaCA9PSAnXFwnKQorICAgIHsKKwkvKiBDb252ZXJ0IG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIHRvIGVpdGhlciB0aGVpciBlc2NhcGUgb3Igb2N0YWwKKwkgKiBzZXF1ZW5jZSwgZW5zdXJlcyBQUyBzZW50IG92ZXIgYSBzZXJpYWwgbGluZSBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aAorCSAqIHRoZSBjb21tcyBwcm90b2NvbC4KKwkgKiBOb3RlOiBGb3IgRUJDRElDIHdlIG5lZWQgdG8gd3JpdGUgb3V0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIGFzIEFTQ0lJCisJICogY29kZXMhCisJICogTm90ZSAyOiBDaGFyIGNvZGVzIDwgMzIgYXJlIGlkZW50aWNhbCBpbiBFQkNESUMgYW5kIEFTQ0lJIEFGQUlLIQorCSAqLworCWdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ1xcJywgMDEzNCkpOworCXN3aXRjaCAoY2gpCisJeworCSAgICBjYXNlIEJTOiAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ2InLCAwMTQyKSk7IGJyZWFrOworCSAgICBjYXNlIFRBQjogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ3QnLCAwMTY0KSk7IGJyZWFrOworCSAgICBjYXNlIE5MOiAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ24nLCAwMTU2KSk7IGJyZWFrOworCSAgICBjYXNlIEZGOiAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ2YnLCAwMTQ2KSk7IGJyZWFrOworCSAgICBjYXNlIENBUjogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ3InLCAwMTYyKSk7IGJyZWFrOworCSAgICBjYXNlICcoJzogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJygnLCAwMDUwKSk7IGJyZWFrOworCSAgICBjYXNlICcpJzogIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJyknLCAwMDUxKSk7IGJyZWFrOworCSAgICBjYXNlICdcXCc6IGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgSUZfRUIoJ1xcJywgMDEzNCkpOyBicmVhazsKKworCSAgICBkZWZhdWx0OgorCQkgICAgICAgc3ByaW50ZigoY2hhciAqKWNoX2J1ZmYsICIlMDNvIiwgKHVuc2lnbmVkIGludCljaCk7CisjaWZkZWYgRUJDRElDCisJCSAgICAgICBlYmNkaWMyYXNjaWkoY2hfYnVmZiwgMyk7CisjZW5kaWYKKwkJICAgICAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgY2hfYnVmZlswXSk7CisJCSAgICAgICBnYV9hcHBlbmQoJnBydF9wc19idWZmZXIsIGNoX2J1ZmZbMV0pOworCQkgICAgICAgZ2FfYXBwZW5kKCZwcnRfcHNfYnVmZmVyLCBjaF9idWZmWzJdKTsKKwkJICAgICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIGdhX2FwcGVuZCgmcHJ0X3BzX2J1ZmZlciwgY2gpOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIE5lZWQgdG8gZnJlZSBhbnkgdHJhbnNsYXRlZCBjaGFyYWN0ZXJzICovCisgICAgaWYgKHBydF9kb19jb252ICYmICgqcCAhPSBOVUwpKQorCXZpbV9mcmVlKHApOworI2VuZGlmCisKKyAgICBwcnRfdGV4dF9jb3VudCsrOworICAgIHBydF9wb3NfeCArPSBwcnRfY2hhcl93aWR0aDsKKworICAgIC8qIFRoZSBkb3duc2lkZSBvZiBmcCAtIG5lZWQgYSBsaXR0bGUgdG9sZXJhbmNlIGluIHRoZSByaWdodCBtYXJnaW4gY2hlY2sgKi8KKyAgICBuZWVkX2JyZWFrID0gKHBydF9wb3NfeCArIHBydF9jaGFyX3dpZHRoID4gKHBydF9yaWdodF9tYXJnaW4gKyAwLjAxKSk7CisKKyAgICBpZiAobmVlZF9icmVhaykKKwlwcnRfZmx1c2hfYnVmZmVyKCk7CisKKyAgICByZXR1cm4gbmVlZF9icmVhazsKK30KKworICAgIHZvaWQKK21jaF9wcmludF9zZXRfZm9udChpQm9sZCwgaUl0YWxpYywgaVVuZGVybGluZSkKKyAgICBpbnQJCWlCb2xkOworICAgIGludAkJaUl0YWxpYzsKKyAgICBpbnQJCWlVbmRlcmxpbmU7Cit7CisgICAgaW50CQlmb250ID0gMDsKKworICAgIGlmIChpQm9sZCkKKwlmb250IHw9IDB4MDE7CisgICAgaWYgKGlJdGFsaWMpCisJZm9udCB8PSAweDAyOworCisgICAgaWYgKGZvbnQgIT0gcHJ0X2ZvbnQpCisgICAgeworCXBydF9mb250ID0gZm9udDsKKwlwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7CisJcHJ0X25lZWRfZm9udCA9IFRSVUU7CisgICAgfQorICAgIGlmIChwcnRfdW5kZXJsaW5lICE9IGlVbmRlcmxpbmUpCisgICAgeworCXBydF91bmRlcmxpbmUgPSBpVW5kZXJsaW5lOworCXBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKKwlwcnRfbmVlZF91bmRlcmxpbmUgPSBUUlVFOworICAgIH0KK30KKworICAgIHZvaWQKK21jaF9wcmludF9zZXRfYmcoYmdjb2wpCisgICAgbG9uZ191CWJnY29sOworeworICAgIHBydF9iZ2NvbCA9IGJnY29sOworICAgIHBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKKyAgICBwcnRfbmVlZF9iZ2NvbCA9IFRSVUU7Cit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfc2V0X2ZnKGZnY29sKQorICAgIGxvbmdfdQlmZ2NvbDsKK3sKKyAgICBpZiAoZmdjb2wgIT0gKGxvbmdfdSlwcnRfZmdjb2wpCisgICAgeworCXBydF9mZ2NvbCA9IGZnY29sOworCXBydF9hdHRyaWJ1dGVfY2hhbmdlID0gVFJVRTsKKwlwcnRfbmVlZF9mZ2NvbCA9IFRSVUU7CisgICAgfQorfQorCisjIGVuZGlmIC8qRkVBVF9QT1NUU0NSSVBUKi8KKyNlbmRpZiAvKkZFQVRfUFJJTlRFUiovCisKKyNpZiAoZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKSkgXAorCSYmIChkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX01VTFRJX0xBTkcpKQorc3RhdGljIGNoYXIgKmdldF9sb2NhbGVfdmFsIF9fQVJHUygoaW50IHdoYXQpKTsKKworICAgIHN0YXRpYyBjaGFyICoKK2dldF9sb2NhbGVfdmFsKHdoYXQpCisgICAgaW50CQl3aGF0OworeworICAgIGNoYXIJKmxvYzsKKworICAgIC8qIE9idGFpbiB0aGUgbG9jYWxlIHZhbHVlIGZyb20gdGhlIGxpYnJhcmllcy4gIEZvciBESkdQUCB0aGlzIGlzCisgICAgICogcmVkZWZpbmVkIGFuZCBpdCBkb2Vzbid0IHVzZSB0aGUgYXJndW1lbnRzLiAqLworICAgIGxvYyA9IHNldGxvY2FsZSh3aGF0LCBOVUxMKTsKKworIyBpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgICBpZiAobG9jICE9IE5VTEwpCisgICAgeworCWNoYXJfdQkqcDsKKworCS8qIEJvcmxhbmQgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiTENfQ1RZUEU9PG5hbWU+XG4iCisJICogTGV0J3MgdHJ5IHRvIGZpeCB0aGF0IGJ1ZyBoZXJlLi4uICovCisJcCA9IHZpbV9zdHJjaHIobG9jLCAnPScpOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBsb2MgPSArK3A7CisJICAgIHdoaWxlICgqcCAhPSBOVUwpCS8qIHJlbW92ZSB0cmFpbGluZyBuZXdsaW5lICovCisJICAgIHsKKwkJaWYgKCpwIDwgJyAnKQorCQl7CisJCSAgICAqcCA9IE5VTDsKKwkJICAgIGJyZWFrOworCQl9CisJCSsrcDsKKwkgICAgfQorCX0KKyAgICB9CisjIGVuZGlmCisKKyAgICByZXR1cm4gbG9jOworfQorI2VuZGlmCisKKworI2lmZGVmIFdJTjMyCisvKgorICogT24gTVMtV2luZG93cyBsb2NhbGUgbmFtZXMgYXJlIHN0cmluZ3MgbGlrZSAiR2VybWFuX0dlcm1hbnkuMTI1MiIsIGJ1dAorICogZ2V0dGV4dCBleHBlY3RzICJkZSIuICBUcnkgdG8gdHJhbnNsYXRlIG9uZSBpbnRvIGFub3RoZXIgaGVyZSBmb3IgYSBmZXcKKyAqIHN1cHBvcnRlZCBsYW5ndWFnZXMuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2dldHRleHRfbGFuZyhjaGFyX3UgKm5hbWUpCit7CisgICAgaW50CQlpOworICAgIHN0YXRpYyBjaGFyICoobXRhYmxlW10pID0geworCQkJImFmcmlrYWFucyIsCSJhZiIsCisJCQkiY3plY2giLAkiY3MiLAorCQkJImR1dGNoIiwJIm5sIiwKKwkJCSJnZXJtYW4iLAkiZGUiLAorCQkJImVuZ2xpc2hfdW5pdGVkIGtpbmdkb20iLCAiZW5fR0IiLAorCQkJInNwYW5pc2giLAkiZXMiLAorCQkJImZyZW5jaCIsCSJmciIsCisJCQkiaXRhbGlhbiIsCSJpdCIsCisJCQkiamFwYW5lc2UiLAkiamEiLAorCQkJImtvcmVhbiIsCSJrbyIsCisJCQkibm9yd2VnaWFuIiwJIm5vIiwKKwkJCSJwb2xpc2giLAkicGwiLAorCQkJInJ1c3NpYW4iLAkicnUiLAorCQkJInNsb3ZhayIsCSJzayIsCisJCQkic3dlZGlzaCIsCSJzdiIsCisJCQkidWtyYWluaWFuIiwJInVrIiwKKwkJCSJjaGluZXNlX2NoaW5hIiwgInpoX0NOIiwKKwkJCSJjaGluZXNlX3RhaXdhbiIsICJ6aF9UVyIsCisJCQlOVUxMfTsKKworICAgIGZvciAoaSA9IDA7IG10YWJsZVtpXSAhPSBOVUxMOyBpICs9IDIpCisJaWYgKFNUUk5JQ01QKG10YWJsZVtpXSwgbmFtZSwgU1RSTEVOKG10YWJsZVtpXSkpID09IDApCisJICAgIHJldHVybiBtdGFibGVbaSArIDFdOworICAgIHJldHVybiBuYW1lOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTVVMVElfTEFORykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBPYnRhaW4gdGhlIGN1cnJlbnQgbWVzc2FnZXMgbGFuZ3VhZ2UuICBVc2VkIHRvIHNldCB0aGUgZGVmYXVsdCBmb3IKKyAqICdoZWxwbGFuZycuICBNYXkgcmV0dXJuIE5VTEwgb3IgYW4gZW1wdHkgc3RyaW5nLgorICovCisgICAgY2hhcl91ICoKK2dldF9tZXNzX2xhbmcoKQoreworICAgIGNoYXJfdSAqcDsKKworIyBpZiAoZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKSkKKyMgIGlmIGRlZmluZWQoTENfTUVTU0FHRVMpCisgICAgcCA9IChjaGFyX3UgKilnZXRfbG9jYWxlX3ZhbChMQ19NRVNTQUdFUyk7CisjICBlbHNlCisgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIFdpbjMyLCB3aGVyZSBMQ19NRVNTQUdFUyBpcyBub3QgZGVmaW5lZCBhbmQgJExBTkcKKyAgICAgKiBtYXkgYmUgc2V0IHRvIHRoZSBMQ0lEIG51bWJlci4gKi8KKyAgICBwID0gKGNoYXJfdSAqKWdldF9sb2NhbGVfdmFsKExDX0FMTCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJMQ19BTEwiKTsKKyAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkKKyAgICB7CisJcCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJMQ19NRVNTQUdFUyIpOworCWlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQorCSAgICBwID0gbWNoX2dldGVudigoY2hhcl91ICopIkxBTkciKTsKKyAgICB9CisjIGVuZGlmCisjIGlmZGVmIFdJTjMyCisgICAgcCA9IGdldHRleHRfbGFuZyhwKTsKKyMgZW5kaWYKKyAgICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTENfTUVTU0FHRVMpIFwKKyAgICAmJiAoKChkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpKSBcCisJCSYmIChkZWZpbmVkKEZFQVRfR0VUVEVYVCkgfHwgZGVmaW5lZChGRUFUX01CWVRFKSkpIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX0VWQUwpKQorc3RhdGljIGNoYXJfdSAqZ2V0X21lc3NfZW52IF9fQVJHUygodm9pZCkpOworCisvKgorICogR2V0IHRoZSBsYW5ndWFnZSB1c2VkIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X21lc3NfZW52KCkKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBwID0gbWNoX2dldGVudigoY2hhcl91ICopIkxDX0FMTCIpOworICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQorICAgIHsKKwlwID0gbWNoX2dldGVudigoY2hhcl91ICopIkxDX01FU1NBR0VTIik7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSBOVUwpCisJeworCSAgICBwID0gbWNoX2dldGVudigoY2hhcl91ICopIkxBTkciKTsKKwkgICAgaWYgKHAgIT0gTlVMTCAmJiBWSU1fSVNESUdJVCgqcCkpCisJCXAgPSBOVUxMOwkJLyogaWdub3JlIHNvbWV0aGluZyBsaWtlICIxMDQzIiAqLworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpCisJICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQorCQlwID0gKGNoYXJfdSAqKWdldF9sb2NhbGVfdmFsKExDX0NUWVBFKTsKKyMgZW5kaWYKKwl9CisgICAgfQorICAgIHJldHVybiBwOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIFNldCB0aGUgInY6bGFuZyIgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nLgorICogQWxzbyBkbyAidjpsY190aW1lImFuZCAidjpjdHlwZSIuCisgKi8KKyAgICB2b2lkCitzZXRfbGFuZ192YXIoKQoreworICAgIGNoYXJfdQkqbG9jOworCisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkKKyAgICBsb2MgPSAoY2hhcl91ICopZ2V0X2xvY2FsZV92YWwoTENfQ1RZUEUpOworIyBlbHNlCisgICAgLyogc2V0bG9jYWxlKCkgbm90IHN1cHBvcnRlZDogdXNlIHRoZSBkZWZhdWx0IHZhbHVlICovCisgICAgbG9jID0gKGNoYXJfdSAqKSJDIjsKKyMgZW5kaWYKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfQ1RZUEUsIGxvYywgLTEpOworCisgICAgLyogV2hlbiBMQ19NRVNTQUdFUyBpc24ndCBkZWZpbmVkIHVzZSB0aGUgdmFsdWUgZnJvbSAkTENfTUVTU0FHRVMsIGZhbGwKKyAgICAgKiBiYWNrIHRvIExDX0NUWVBFIGlmIGl0J3MgZW1wdHkuICovCisjIGlmIChkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpKSAmJiBkZWZpbmVkKExDX01FU1NBR0VTKQorICAgIGxvYyA9IChjaGFyX3UgKilnZXRfbG9jYWxlX3ZhbChMQ19NRVNTQUdFUyk7CisjIGVsc2UKKyAgICBsb2MgPSBnZXRfbWVzc19lbnYoKTsKKyMgZW5kaWYKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfTEFORywgbG9jLCAtMSk7CisKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKQorICAgIGxvYyA9IChjaGFyX3UgKilnZXRfbG9jYWxlX3ZhbChMQ19USU1FKTsKKyMgZW5kaWYKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfTENfVElNRSwgbG9jLCAtMSk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpKSBcCisJJiYgKGRlZmluZWQoRkVBVF9HRVRURVhUKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpKQorLyoKKyAqICI6bGFuZ3VhZ2UiOiAgU2V0IHRoZSBsYW5ndWFnZSAobG9jYWxlKS4KKyAqLworICAgIHZvaWQKK2V4X2xhbmd1YWdlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcgkqbG9jOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQl3aGF0ID0gTENfQUxMOworICAgIGNoYXIJKndoYXRzdHIgPSAiIjsKKyNpZmRlZiBMQ19NRVNTQUdFUworIyBkZWZpbmUgVklNX0xDX01FU1NBR0VTIExDX01FU1NBR0VTCisjZWxzZQorIyBkZWZpbmUgVklNX0xDX01FU1NBR0VTIDY3ODkKKyNlbmRpZgorCisgICAgbmFtZSA9IGVhcC0+YXJnOworCisgICAgLyogQ2hlY2sgZm9yICJtZXNzYWdlcyB7bmFtZX0iLCAiY3R5cGUge25hbWV9IiBvciAidGltZSB7bmFtZX0iIGFyZ3VtZW50LgorICAgICAqIEFsbG93IGFiYnJldmlhdGlvbiwgYnV0IHJlcXVpcmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIHRvIGF2b2lkCisgICAgICogY29uZnVzaW9uIHdpdGggYSB0d28gbGV0dGVyIGxhbmd1YWdlIG5hbWUgIm1lIiBvciAiY3QiLiAqLworICAgIHAgPSBza2lwdG93aGl0ZShlYXAtPmFyZyk7CisgICAgaWYgKCgqcCA9PSBOVUwgfHwgdmltX2lzd2hpdGUoKnApKSAmJiBwIC0gZWFwLT5hcmcgPj0gMykKKyAgICB7CisJaWYgKFNUUk5JQ01QKGVhcC0+YXJnLCAibWVzc2FnZXMiLCBwIC0gZWFwLT5hcmcpID09IDApCisJeworCSAgICB3aGF0ID0gVklNX0xDX01FU1NBR0VTOworCSAgICBuYW1lID0gc2tpcHdoaXRlKHApOworCSAgICB3aGF0c3RyID0gIm1lc3NhZ2VzICI7CisJfQorCWVsc2UgaWYgKFNUUk5JQ01QKGVhcC0+YXJnLCAiY3R5cGUiLCBwIC0gZWFwLT5hcmcpID09IDApCisJeworCSAgICB3aGF0ID0gTENfQ1RZUEU7CisJICAgIG5hbWUgPSBza2lwd2hpdGUocCk7CisJICAgIHdoYXRzdHIgPSAiY3R5cGUgIjsKKwl9CisJZWxzZSBpZiAoU1RSTklDTVAoZWFwLT5hcmcsICJ0aW1lIiwgcCAtIGVhcC0+YXJnKSA9PSAwKQorCXsKKwkgICAgd2hhdCA9IExDX1RJTUU7CisJICAgIG5hbWUgPSBza2lwd2hpdGUocCk7CisJICAgIHdoYXRzdHIgPSAidGltZSAiOworCX0KKyAgICB9CisKKyAgICBpZiAoKm5hbWUgPT0gTlVMKQorICAgIHsKKyNpZm5kZWYgTENfTUVTU0FHRVMKKwlpZiAod2hhdCA9PSBWSU1fTENfTUVTU0FHRVMpCisJICAgIHAgPSBnZXRfbWVzc19lbnYoKTsKKwllbHNlCisjZW5kaWYKKwkgICAgcCA9IChjaGFyX3UgKilzZXRsb2NhbGUod2hhdCwgTlVMTCk7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSBOVUwpCisJICAgIHAgPSAoY2hhcl91ICopIlVua25vd24iOworCXNtc2coKGNoYXJfdSAqKV8oIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIiksIHdoYXRzdHIsIHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmbmRlZiBMQ19NRVNTQUdFUworCWlmICh3aGF0ID09IFZJTV9MQ19NRVNTQUdFUykKKwkgICAgbG9jID0gIiI7CisJZWxzZQorI2VuZGlmCisJICAgIGxvYyA9IHNldGxvY2FsZSh3aGF0LCAoY2hhciAqKW5hbWUpOworCWlmIChsb2MgPT0gTlVMTCkKKwkgICAgRU1TRzIoXygiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiKSwgbmFtZSk7CisJZWxzZQorCXsKKyNpZmRlZiBIQVZFX05MX01TR19DQVRfQ05UUgorCSAgICAvKiBOZWVkIHRvIGRvIHRoaXMgZm9yIEdOVSBnZXR0ZXh0LCBvdGhlcndpc2UgY2FjaGVkIHRyYW5zbGF0aW9ucworCSAgICAgKiB3aWxsIGJlIHVzZWQgYWdhaW4uICovCisJICAgIGV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKworCSAgICArK19ubF9tc2dfY2F0X2NudHI7CisjZW5kaWYKKwkgICAgLyogUmVzZXQgJExDX0FMTCwgb3RoZXJ3aXNlIGl0IHdvdWxkIG92ZXJydWxlIGV2ZXJ5dGluZy4gKi8KKwkgICAgdmltX3NldGVudigoY2hhcl91ICopIkxDX0FMTCIsIChjaGFyX3UgKikiIik7CisKKwkgICAgaWYgKHdoYXQgIT0gTENfVElNRSkKKwkgICAgeworCQkvKiBUZWxsIGdldHRleHQoKSB3aGF0IHRvIHRyYW5zbGF0ZSB0by4gIEl0IGFwcGFyZW50bHkgZG9lc24ndAorCQkgKiB1c2UgdGhlIGN1cnJlbnRseSBlZmZlY3RpdmUgbG9jYWxlLiAgQWxzbyBkbyB0aGlzIHdoZW4KKwkJICogRkVBVF9HRVRURVhUIGlzbid0IGRlZmluZWQsIHNvIHRoYXQgc2hlbGwgY29tbWFuZHMgdXNlIHRoaXMKKwkJICogdmFsdWUuICovCisJCWlmICh3aGF0ID09IExDX0FMTCkKKwkJICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJMQU5HIiwgbmFtZSk7CisJCWlmICh3aGF0ICE9IExDX0NUWVBFKQorCQl7CisJCSAgICBjaGFyX3UJKm1uYW1lOworI2lmZGVmIFdJTjMyCisJCSAgICBtbmFtZSA9IGdldHRleHRfbGFuZyhuYW1lKTsKKyNlbHNlCisJCSAgICBtbmFtZSA9IG5hbWU7CisjZW5kaWYKKwkJICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJMQ19NRVNTQUdFUyIsIG1uYW1lKTsKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKwkJICAgIHNldF9oZWxwbGFuZ19kZWZhdWx0KG1uYW1lKTsKKyNlbmRpZgorCQl9CisKKwkJLyogU2V0ICRMQ19DVFlQRSwgYmVjYXVzZSBpdCBvdmVycnVsZXMgJExBTkcsIGFuZAorCQkgKiBndGtfc2V0X2xvY2FsZSgpIGNhbGxzIHNldGxvY2FsZSgpIGFnYWluLiAgZ25vbWVfaW5pdCgpCisJCSAqIHNldHMgJExDX0NUWVBFIHRvICJlbl9VUyIgKHRoYXQncyBhIGJ1ZyEpLiAqLworCQlpZiAod2hhdCAhPSBWSU1fTENfTUVTU0FHRVMpCisJCSAgICB2aW1fc2V0ZW52KChjaGFyX3UgKikiTENfQ1RZUEUiLCBuYW1lKTsKKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisJCS8qIExldCBHVEsga25vdyB3aGF0IGxvY2FsZSB3ZSdyZSB1c2luZy4gIE5vdCBzdXJlIHRoaXMgaXMKKwkJICogcmVhbGx5IG5lZWRlZC4uLiAqLworCQlpZiAoZ3VpLmluX3VzZSkKKwkJICAgICh2b2lkKWd0a19zZXRfbG9jYWxlKCk7CisjIGVuZGlmCisJICAgIH0KKworIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgLyogU2V0IHY6bGFuZywgdjpsY190aW1lIGFuZCB2OmN0eXBlIHRvIHRoZSBmaW5hbCByZXN1bHQuICovCisJICAgIHNldF9sYW5nX3ZhcigpOworIyBlbmRpZgorCX0KKyAgICB9Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgcG9zc2libGUgYXJndW1lbnRzIG9mIHRoZQorICogIjpsYW5ndWFnZSIgY29tbWFuZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK2dldF9sYW5nX2FyZyh4cCwgaWR4KQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBpbnQJCWlkeDsKK3sKKyAgICBpZiAoaWR4ID09IDApCisJcmV0dXJuIChjaGFyX3UgKikibWVzc2FnZXMiOworICAgIGlmIChpZHggPT0gMSkKKwlyZXR1cm4gKGNoYXJfdSAqKSJjdHlwZSI7CisgICAgaWYgKGlkeCA9PSAyKQorCXJldHVybiAoY2hhcl91ICopInRpbWUiOworICAgIHJldHVybiBOVUxMOworfQorIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9leF9kb2NtZC5jIGIvc3JjL2V4X2RvY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMzFlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9leF9kb2NtZC5jCkBAIC0wLDAgKzEsOTcxMSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogZXhfZG9jbWQuYzogZnVuY3Rpb25zIGZvciBleGVjdXRpbmcgYW4gRXggY29tbWFuZCBsaW5lLgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgkgICAgLyogZm9yIGNoZGlyKCkgKi8KKyNlbmRpZgorCitzdGF0aWMgaW50CXF1aXRtb3JlID0gMDsKK3N0YXRpYyBpbnQJZXhfcHJlc3NlZHJldHVybiA9IEZBTFNFOworI2lmbmRlZiBGRUFUX1BSSU5URVIKKyMgZGVmaW5lIGV4X2hhcmRjb3B5CWV4X25pCisjZW5kaWYKKworI2lmZGVmIEZFQVRfVVNSX0NNRFMKK3R5cGVkZWYgc3RydWN0IHVjbWQKK3sKKyAgICBjaGFyX3UJKnVjX25hbWU7CS8qIFRoZSBjb21tYW5kIG5hbWUgKi8KKyAgICBsb25nX3UJdWNfYXJndDsJLyogVGhlIGFyZ3VtZW50IHR5cGUgKi8KKyAgICBjaGFyX3UJKnVjX3JlcDsJLyogVGhlIGNvbW1hbmQncyByZXBsYWNlbWVudCBzdHJpbmcgKi8KKyAgICBsb25nCXVjX2RlZjsJCS8qIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHJhbmdlL2NvdW50ICovCisgICAgc2NpZF9UCXVjX3NjcmlwdElEOwkvKiBTSUQgd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGRlZmluZWQgKi8KKyAgICBpbnQJCXVjX2NvbXBsOwkvKiBjb21wbGV0aW9uIHR5cGUgKi8KKyMgaWYgZGVmaW5lZChGRUFUX0VWQUwpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKQorICAgIGNoYXJfdQkqdWNfY29tcGxfYXJnOwkvKiBjb21wbGV0aW9uIGFyZ3VtZW50IGlmIGFueSAqLworIyBlbmRpZgorfSB1Y21kX1Q7CisKKyNkZWZpbmUgVUNfQlVGRkVSCTEJLyogLWJ1ZmZlcjogbG9jYWwgdG8gY3VycmVudCBidWZmZXIgKi8KKworZ2FycmF5X1QgdWNtZHMgPSB7MCwgMCwgc2l6ZW9mKHVjbWRfVCksIDQsIE5VTEx9OworCisjZGVmaW5lIFVTRVJfQ01EKGkpICgmKCh1Y21kX1QgKikodWNtZHMuZ2FfZGF0YSkpW2ldKQorI2RlZmluZSBVU0VSX0NNRF9HQShnYXAsIGkpICgmKCh1Y21kX1QgKikoKGdhcCktPmdhX2RhdGEpKVtpXSkKKworc3RhdGljIHZvaWQgZG9fdWNtZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQgZXhfY29tbWFuZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQgZXhfY29tY2xlYXIgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkIGV4X2RlbGNvbW1hbmQgX19BUkdTKChleGFyZ19UICplYXApKTsKKyMgaWZkZWYgRkVBVF9DTURMX0NPTVBMCitzdGF0aWMgY2hhcl91ICpnZXRfdXNlcl9jb21tYW5kX25hbWUgX19BUkdTKChpbnQgaWR4KSk7CisjIGVuZGlmCisKKyNlbHNlCisjIGRlZmluZSBleF9jb21tYW5kCWV4X25pCisjIGRlZmluZSBleF9jb21jbGVhcglleF9uaQorIyBkZWZpbmUgZXhfZGVsY29tbWFuZAlleF9uaQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VWQUwKK3N0YXRpYyBjaGFyX3UJKmRvX29uZV9jbWQgX19BUkdTKChjaGFyX3UgKiosIGludCwgc3RydWN0IGNvbmRzdGFjayAqLCBjaGFyX3UgKigqZ2V0bGluZSkoaW50LCB2b2lkICosIGludCksIHZvaWQgKmNvb2tpZSkpOworI2Vsc2UKK3N0YXRpYyBjaGFyX3UJKmRvX29uZV9jbWQgX19BUkdTKChjaGFyX3UgKiosIGludCwgY2hhcl91ICooKmdldGxpbmUpKGludCwgdm9pZCAqLCBpbnQpLCB2b2lkICpjb29raWUpKTsKK3N0YXRpYyBpbnQJaWZfbGV2ZWwgPSAwOwkJLyogZGVwdGggaW4gOmlmICovCisjZW5kaWYKK3N0YXRpYyBpbnQJY2hlY2tmb3JjbWQgX19BUkdTKChjaGFyX3UgKipwcCwgY2hhciAqY21kLCBpbnQgbGVuKSk7CitzdGF0aWMgY2hhcl91CSpmaW5kX2NvbW1hbmQgX19BUkdTKChleGFyZ19UICplYXAsIGludCAqZnVsbCkpOworCitzdGF0aWMgdm9pZAlleF9hYmJyZXZpYXRlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9tYXAgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3VubWFwIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9tYXBjbGVhciBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfYWJjbGVhciBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2lmbmRlZiBGRUFUX01FTlUKKyMgZGVmaW5lIGV4X2VtZW51CQlleF9uaQorIyBkZWZpbmUgZXhfbWVudQkJZXhfbmkKKyMgZGVmaW5lIGV4X21lbnV0cmFuc2xhdGUJZXhfbmkKKyNlbmRpZgorI2lmZGVmIEZFQVRfQVVUT0NNRAorc3RhdGljIHZvaWQJZXhfYXV0b2NtZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfZG9hdXRvY21kIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfYXV0b2NtZAkJZXhfbmkKKyMgZGVmaW5lIGV4X2RvYXV0b2NtZAkJZXhfbmkKKyMgZGVmaW5lIGV4X2RvYXV0b2FsbAkJZXhfbmkKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElTVENNRFMKK3N0YXRpYyB2b2lkCWV4X2J1bmxvYWQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X2J1ZmZlciBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfYm1vZGlmaWVkIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9ibmV4dCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfYnByZXZpb3VzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9icmV3aW5kIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9ibGFzdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2Vsc2UKKyMgZGVmaW5lIGV4X2J1bmxvYWQJCWV4X25pCisjIGRlZmluZSBleF9idWZmZXIJCWV4X25pCisjIGRlZmluZSBleF9ibW9kaWZpZWQJCWV4X25pCisjIGRlZmluZSBleF9ibmV4dAkJZXhfbmkKKyMgZGVmaW5lIGV4X2JwcmV2aW91cwkJZXhfbmkKKyMgZGVmaW5lIGV4X2JyZXdpbmQJCWV4X25pCisjIGRlZmluZSBleF9ibGFzdAkJZXhfbmkKKyMgZGVmaW5lIGJ1Zmxpc3RfbGlzdAkJZXhfbmkKKyMgZGVmaW5lIGV4X2NoZWNrdGltZQkJZXhfbmkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEZFQVRfTElTVENNRFMpIHx8ICFkZWZpbmVkKEZFQVRfV0lORE9XUykKKyMgZGVmaW5lIGV4X2J1ZmZlcl9hbGwJCWV4X25pCisjZW5kaWYKK3N0YXRpYyBjaGFyX3UJKmdldGFyZ2NtZCBfX0FSR1MoKGNoYXJfdSAqKikpOworc3RhdGljIGNoYXJfdQkqc2tpcF9jbWRfYXJnIF9fQVJHUygoY2hhcl91ICpwLCBpbnQgcmVtYnMpKTsKK3N0YXRpYyBpbnQJZ2V0YXJnb3B0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjaWZuZGVmIEZFQVRfUVVJQ0tGSVgKKyMgZGVmaW5lIGV4X21ha2UJCWV4X25pCisjIGRlZmluZSBleF9jYwkJCWV4X25pCisjIGRlZmluZSBleF9jbmV4dAkJZXhfbmkKKyMgZGVmaW5lIGV4X2NmaWxlCQlleF9uaQorIyBkZWZpbmUgcWZfbGlzdAkJZXhfbmkKKyMgZGVmaW5lIHFmX2FnZQkJCWV4X25pCisjIGRlZmluZSBleF9oZWxwZ3JlcAkJZXhfbmkKKyNlbmRpZgorI2lmICFkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpIHx8ICFkZWZpbmVkKEZFQVRfV0lORE9XUykKKyMgZGVmaW5lIGV4X2NjbG9zZQkJZXhfbmkKKyMgZGVmaW5lIGV4X2NvcGVuCQlleF9uaQorIyBkZWZpbmUgZXhfY3dpbmRvdwkJZXhfbmkKKyNlbmRpZgorCitzdGF0aWMgaW50CWNoZWNrX21vcmUgX19BUkdTKChpbnQsIGludCkpOworc3RhdGljIGxpbmVucl9UIGdldF9hZGRyZXNzIF9fQVJHUygoY2hhcl91ICoqLCBpbnQgc2tpcCwgaW50IHRvX290aGVyX2ZpbGUpKTsKKyNpZiAhZGVmaW5lZChGRUFUX1BFUkwpIHx8ICFkZWZpbmVkKEZFQVRfUFlUSE9OKSB8fCAhZGVmaW5lZChGRUFUX1RDTCkgXAorCXx8ICFkZWZpbmVkKEZFQVRfUlVCWSkKK3N0YXRpYyB2b2lkCWV4X3NjcmlwdF9uaSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2VuZGlmCitzdGF0aWMgY2hhcl91CSppbnZhbGlkX3JhbmdlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAljb3JyZWN0X3JhbmdlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgY2hhcl91CSpyZXBsX2NtZGxpbmUgX19BUkdTKChleGFyZ19UICplYXAsIGNoYXJfdSAqc3JjLCBpbnQgc3JjbGVuLCBjaGFyX3UgKnJlcGwsIGNoYXJfdSAqKmNtZGxpbmVwKSk7CitzdGF0aWMgdm9pZAlleF9oaWdobGlnaHQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X2NvbG9yc2NoZW1lIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9xdWl0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9jcXVpdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcXVpdF9hbGwgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKK3N0YXRpYyB2b2lkCWV4X2Nsb3NlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF93aW5fY2xvc2UgX19BUkdTKChleGFyZ19UICplYXAsIHdpbl9UICp3aW4pKTsKK3N0YXRpYyB2b2lkCWV4X29ubHkgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X2FsbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcmVzaXplIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9zdGFnIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfY2xvc2UJCWV4X25pCisjIGRlZmluZSBleF9vbmx5CQlleF9uaQorIyBkZWZpbmUgZXhfYWxsCQkJZXhfbmkKKyMgZGVmaW5lIGV4X3Jlc2l6ZQkJZXhfbmkKKyMgZGVmaW5lIGV4X3NwbGl0dmlldwkJZXhfbmkKKyMgZGVmaW5lIGV4X3N0YWcJCWV4X25pCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorc3RhdGljIHZvaWQJZXhfcGNsb3NlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9wdGFnIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9wZWRpdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2Vsc2UKKyMgZGVmaW5lIGV4X3BjbG9zZQkJZXhfbmkKKyMgZGVmaW5lIGV4X3B0YWcJCWV4X25pCisjIGRlZmluZSBleF9wZWRpdAkJZXhfbmkKKyNlbmRpZgorc3RhdGljIHZvaWQJZXhfaGlkZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfc3RvcCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfZXhpdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcHJpbnQgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNpZmRlZiBGRUFUX0JZVEVPRkYKK3N0YXRpYyB2b2lkCWV4X2dvdG8gX19BUkdTKChleGFyZ19UICplYXApKTsKKyNlbHNlCisjIGRlZmluZSBleF9nb3RvCQlleF9uaQorI2VuZGlmCitzdGF0aWMgdm9pZAlleF9zaGVsbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcHJlc2VydmUgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3JlY292ZXIgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNpZm5kZWYgRkVBVF9MSVNUQ01EUworIyBkZWZpbmUgZXhfYXJnZWRpdAkJZXhfbmkKKyMgZGVmaW5lIGV4X2FyZ2FkZAkJZXhfbmkKKyMgZGVmaW5lIGV4X2FyZ2RlbGV0ZQkJZXhfbmkKKyMgZGVmaW5lIGV4X2xpc3RkbwkJZXhfbmkKKyNlbmRpZgorc3RhdGljIHZvaWQJZXhfbW9kZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfd3Jvbmdtb2RpZmllciBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfZmluZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfZWRpdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2lmICFkZWZpbmVkKEZFQVRfR1VJKSAmJiAhZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikKKyMgZGVmaW5lIGV4X2Ryb3AJCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9HVUkKKyMgZGVmaW5lIGV4X2d1aQkJCWV4X25vZ3VpCitzdGF0aWMgdm9pZAlleF9ub2d1aSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpICYmIGRlZmluZWQoRkVBVF9NRU5VKSAmJiBkZWZpbmVkKEZFQVRfVEVBUk9GRikKK3N0YXRpYyB2b2lkCWV4X3RlYXJvZmYgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNlbHNlCisjIGRlZmluZSBleF90ZWFyb2ZmCQlleF9uaQorI2VuZGlmCisjaWYgKGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSkgJiYgZGVmaW5lZChGRUFUX01FTlUpCitzdGF0aWMgdm9pZAlleF9wb3B1cCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2Vsc2UKKyMgZGVmaW5lIGV4X3BvcHVwCQlleF9uaQorI2VuZGlmCisjaWZuZGVmIEZFQVRfR1VJX01TV0lOCisjIGRlZmluZSBleF9zaW1hbHQJCWV4X25pCisjZW5kaWYKKyNpZiAhZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgJiYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9NT1RJRikKKyMgZGVmaW5lIGd1aV9tY2hfZmluZF9kaWFsb2cJZXhfbmkKKyMgZGVmaW5lIGd1aV9tY2hfcmVwbGFjZV9kaWFsb2cgZXhfbmkKKyNlbmRpZgorI2lmbmRlZiBGRUFUX0dVSV9HVEsKKyMgZGVmaW5lIGV4X2hlbHBmaW5kCQlleF9uaQorI2VuZGlmCisjaWZuZGVmIEZFQVRfQ1NDT1BFCisjIGRlZmluZSBkb19jc2NvcGUJCWV4X25pCisjIGRlZmluZSBkb19zY3Njb3BlCQlleF9uaQorIyBkZWZpbmUgZG9fY3N0YWcJCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9TWU5fSEwKKyMgZGVmaW5lIGV4X3N5bnRheAkJZXhfbmkKKyNlbmRpZgorI2lmbmRlZiBGRUFUX1BFUkwKKyMgZGVmaW5lIGV4X3BlcmwJCWV4X3NjcmlwdF9uaQorIyBkZWZpbmUgZXhfcGVybGRvCQlleF9uaQorI2VuZGlmCisjaWZuZGVmIEZFQVRfUFlUSE9OCisjIGRlZmluZSBleF9weXRob24JCWV4X3NjcmlwdF9uaQorIyBkZWZpbmUgZXhfcHlmaWxlCQlleF9uaQorI2VuZGlmCisjaWZuZGVmIEZFQVRfVENMCisjIGRlZmluZSBleF90Y2wJCQlleF9zY3JpcHRfbmkKKyMgZGVmaW5lIGV4X3RjbGRvCQlleF9uaQorIyBkZWZpbmUgZXhfdGNsZmlsZQkJZXhfbmkKKyNlbmRpZgorI2lmbmRlZiBGRUFUX1JVQlkKKyMgZGVmaW5lIGV4X3J1YnkJCWV4X3NjcmlwdF9uaQorIyBkZWZpbmUgZXhfcnVieWRvCQlleF9uaQorIyBkZWZpbmUgZXhfcnVieWZpbGUJCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9TTklGRgorIyBkZWZpbmUgZXhfc25pZmYJCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9LRVlNQVAKKyMgZGVmaW5lIGV4X2xvYWRrZXltYXAJCWV4X25pCisjZW5kaWYKK3N0YXRpYyB2b2lkCWV4X3N3YXBuYW1lIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9zeW5jYmluZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcmVhZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfY2QgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3B3ZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfZXF1YWwgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3NsZWVwIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlkb19leG1hcCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IGlzYWJicmV2KSk7CitzdGF0aWMgdm9pZAlleF93aW5zaXplIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCitzdGF0aWMgdm9pZAlleF93aW5jbWQgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNlbHNlCisjIGRlZmluZSBleF93aW5jbWQJICAgIGV4X25pCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorc3RhdGljIHZvaWQJZXhfd2lucG9zIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfd2lucG9zCSAgICBleF9uaQorI2VuZGlmCitzdGF0aWMgdm9pZAlleF9vcGVyYXRvcnMgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3B1dCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfY29weW1vdmUgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3N1Ym1hZ2ljIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9qb2luIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9hdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfYmFuZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfdW5kbyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcmVkbyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcmVkaXIgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X3JlZHJhdyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfcmVkcmF3c3RhdHVzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAljbG9zZV9yZWRpciBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCWV4X21rcmMgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X21hcmsgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNpZmRlZiBGRUFUX1VTUl9DTURTCitzdGF0aWMgY2hhcl91CSp1Y19mdW5fY21kIF9fQVJHUygodm9pZCkpOworI2VuZGlmCisjaWZkZWYgRkVBVF9FWF9FWFRSQQorc3RhdGljIHZvaWQJZXhfbm9ybWFsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9zdGFydGluc2VydCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfc3RvcGluc2VydCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2Vsc2UKKyMgZGVmaW5lIGV4X25vcm1hbAkJZXhfbmkKKyMgZGVmaW5lIGV4X2FsaWduCQlleF9uaQorIyBkZWZpbmUgZXhfcmV0YWIJCWV4X25pCisjIGRlZmluZSBleF9zdGFydGluc2VydAkJZXhfbmkKKyMgZGVmaW5lIGV4X3N0b3BpbnNlcnQJCWV4X25pCisjIGRlZmluZSBleF9oZWxwdGFncwkJZXhfbmkKKyNlbmRpZgorI2lmZGVmIEZFQVRfRklORF9JRAorc3RhdGljIHZvaWQJZXhfY2hlY2twYXRoIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9maW5kcGF0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfZmluZHBhdAkJZXhfbmkKKyMgZGVmaW5lIGV4X2NoZWNrcGF0aAkJZXhfbmkKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9GSU5EX0lEKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorc3RhdGljIHZvaWQJZXhfcHNlYXJjaCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworI2Vsc2UKKyMgZGVmaW5lIGV4X3BzZWFyY2gJCWV4X25pCisjZW5kaWYKK3N0YXRpYyB2b2lkCWV4X3RhZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfdGFnX2NtZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgY2hhcl91ICpuYW1lKSk7CisjaWZuZGVmIEZFQVRfRVZBTAorIyBkZWZpbmUgZXhfc2NyaXB0bmFtZXMJCWV4X25pCisjIGRlZmluZSBleF9maW5pc2gJCWV4X25pCisjIGRlZmluZSBleF9lY2hvCQlleF9uaQorIyBkZWZpbmUgZXhfZWNob2hsCQlleF9uaQorIyBkZWZpbmUgZXhfZXhlY3V0ZQkJZXhfbmkKKyMgZGVmaW5lIGV4X2NhbGwJCWV4X25pCisjIGRlZmluZSBleF9pZgkJCWV4X25pCisjIGRlZmluZSBleF9lbmRpZgkJZXhfbmkKKyMgZGVmaW5lIGV4X2Vsc2UJCWV4X25pCisjIGRlZmluZSBleF93aGlsZQkJZXhfbmkKKyMgZGVmaW5lIGV4X2NvbnRpbnVlCQlleF9uaQorIyBkZWZpbmUgZXhfYnJlYWsJCWV4X25pCisjIGRlZmluZSBleF9lbmR3aGlsZQkJZXhfbmkKKyMgZGVmaW5lIGV4X3Rocm93CQlleF9uaQorIyBkZWZpbmUgZXhfdHJ5CQkJZXhfbmkKKyMgZGVmaW5lIGV4X2NhdGNoCQlleF9uaQorIyBkZWZpbmUgZXhfZmluYWxseQkJZXhfbmkKKyMgZGVmaW5lIGV4X2VuZHRyeQkJZXhfbmkKKyMgZGVmaW5lIGV4X2VuZGZ1bmN0aW9uCQlleF9uaQorIyBkZWZpbmUgZXhfbGV0CQkJZXhfbmkKKyMgZGVmaW5lIGV4X3VubGV0CQlleF9uaQorIyBkZWZpbmUgZXhfZnVuY3Rpb24JCWV4X25pCisjIGRlZmluZSBleF9kZWxmdW5jdGlvbgkJZXhfbmkKKyMgZGVmaW5lIGV4X3JldHVybgkJZXhfbmkKKyNlbmRpZgorc3RhdGljIGNoYXJfdQkqYXJnX2FsbCBfX0FSR1MoKHZvaWQpKTsKKyNpZmRlZiBGRUFUX1NFU1NJT04KK3N0YXRpYyBpbnQJbWFrZW9wZW5zIF9fQVJHUygoRklMRSAqZmQsIGNoYXJfdSAqZGlybm93KSk7CitzdGF0aWMgaW50CXB1dF92aWV3IF9fQVJHUygoRklMRSAqZmQsIHdpbl9UICp3cCwgaW50IGFkZF9lZGl0LCB1bnNpZ25lZCAqZmxhZ3ApKTsKK3N0YXRpYyB2b2lkCWV4X2xvYWR2aWV3IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgY2hhcl91CSpnZXRfdmlld19maWxlIF9fQVJHUygoaW50IGMpKTsKKyNlbHNlCisjIGRlZmluZSBleF9sb2FkdmlldwkJZXhfbmkKKyNlbmRpZgorI2lmbmRlZiBGRUFUX0VWQUwKKyMgZGVmaW5lIGV4X2NvbXBpbGVyCQlleF9uaQorI2VuZGlmCisjaWZkZWYgRkVBVF9WSU1JTkZPCitzdGF0aWMgdm9pZAlleF92aW1pbmZvIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfdmltaW5mbwkJZXhfbmkKKyNlbmRpZgorc3RhdGljIHZvaWQJZXhfYmVoYXZlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECitzdGF0aWMgdm9pZAlleF9maWxldHlwZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfc2V0ZmlsZXR5cGUgIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfZmlsZXR5cGUJCWV4X25pCisjIGRlZmluZSBleF9zZXRmaWxldHlwZQkJZXhfbmkKKyNlbmRpZgorI2lmbmRlZiBGRUFUX0RJRkYKKyMgZGVmaW5lIGV4X2RpZmZwYXRjaAkJZXhfbmkKKyMgZGVmaW5lIGV4X2RpZmZnZXRwdXQJCWV4X25pCisjIGRlZmluZSBleF9kaWZmc3BsaXQJCWV4X25pCisjIGRlZmluZSBleF9kaWZmdGhpcwkJZXhfbmkKKyMgZGVmaW5lIGV4X2RpZmZ1cGRhdGUJCWV4X25pCisjZW5kaWYKK3N0YXRpYyB2b2lkCWV4X2RpZ3JhcGhzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9zZXQgX19BUkdTKChleGFyZ19UICplYXApKTsKKyNpZiAhZGVmaW5lZChGRUFUX0VWQUwpIHx8ICFkZWZpbmVkKEZFQVRfQVVUT0NNRCkKKyMgZGVmaW5lIGV4X29wdGlvbnMJCWV4X25pCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorc3RhdGljIHZvaWQJZXhfbm9obHNlYXJjaCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJZXhfbWF0Y2ggX19BUkdTKChleGFyZ19UICplYXApKTsKKyNlbHNlCisjIGRlZmluZSBleF9ub2hsc2VhcmNoCQlleF9uaQorIyBkZWZpbmUgZXhfbWF0Y2gJCWV4X25pCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NSWVBUCitzdGF0aWMgdm9pZAlleF9YIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisjZWxzZQorIyBkZWZpbmUgZXhfWAkJCWV4X25pCisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKK3N0YXRpYyB2b2lkCWV4X2ZvbGQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCWV4X2ZvbGRvcGVuIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZAlleF9mb2xkZG8gX19BUkdTKChleGFyZ19UICplYXApKTsKKyNlbHNlCisjIGRlZmluZSBleF9mb2xkCQlleF9uaQorIyBkZWZpbmUgZXhfZm9sZG9wZW4JCWV4X25pCisjIGRlZmluZSBleF9mb2xkZG8JCWV4X25pCisjZW5kaWYKKyNpZiAhKChkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpKSBcCisJJiYgKGRlZmluZWQoRkVBVF9HRVRURVhUKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpKSkKKyMgZGVmaW5lIGV4X2xhbmd1YWdlCQlleF9uaQorI2VuZGlmCisjaWZuZGVmIEZFQVRfU0lHTlMKKyMgZGVmaW5lIGV4X3NpZ24JCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9TVU5fV09SS1NIT1AKKyMgZGVmaW5lIGV4X3dzdmVyYgkJZXhfbmkKKyNlbmRpZgorCisjaWZuZGVmIEZFQVRfRVZBTAorIyBkZWZpbmUgZXhfZGVidWcJCWV4X25pCisjIGRlZmluZSBleF9icmVha2FkZAkJZXhfbmkKKyMgZGVmaW5lIGV4X2RlYnVnZ3JlZWR5CQlleF9uaQorIyBkZWZpbmUgZXhfYnJlYWtkZWwJCWV4X25pCisjIGRlZmluZSBleF9icmVha2xpc3QJCWV4X25pCisjZW5kaWYKKworI2lmbmRlZiBGRUFUX0NNREhJU1QKKyMgZGVmaW5lIGV4X2hpc3RvcnkJCWV4X25pCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9KVU1QTElTVAorIyBkZWZpbmUgZXhfanVtcHMJCWV4X25pCisjIGRlZmluZSBleF9jaGFuZ2VzCQlleF9uaQorI2VuZGlmCisKKy8qCisgKiBEZWNsYXJlIGNtZG5hbWVzW10uCisgKi8KKyNkZWZpbmUgRE9fREVDTEFSRV9FWENNRAorI2luY2x1ZGUgImV4X2NtZHMuaCIKKworLyoKKyAqIFRhYmxlIHVzZWQgdG8gcXVpY2tseSBzZWFyY2ggZm9yIGEgY29tbWFuZCwgYmFzZWQgb24gaXRzIGZpcnN0IGNoYXJhY3Rlci4KKyAqLworY21kaWR4X1QgY21kaWR4c1syN10gPQoreworCUNNRF9hcHBlbmQsCisJQ01EX2J1ZmZlciwKKwlDTURfY2hhbmdlLAorCUNNRF9kZWxldGUsCisJQ01EX2VkaXQsCisJQ01EX2ZpbGUsCisJQ01EX2dsb2JhbCwKKwlDTURfaGVscCwKKwlDTURfaW5zZXJ0LAorCUNNRF9qb2luLAorCUNNRF9rLAorCUNNRF9saXN0LAorCUNNRF9tb3ZlLAorCUNNRF9uZXh0LAorCUNNRF9vcGVuLAorCUNNRF9wcmludCwKKwlDTURfcXVpdCwKKwlDTURfcmVhZCwKKwlDTURfc3Vic3RpdHV0ZSwKKwlDTURfdCwKKwlDTURfdW5kbywKKwlDTURfdmdsb2JhbCwKKwlDTURfd3JpdGUsCisJQ01EX3hpdCwKKwlDTURfeWFuaywKKwlDTURfeiwKKwlDTURfYmFuZworfTsKKworc3RhdGljIGNoYXJfdSBkb2xsYXJfY29tbWFuZFsyXSA9IHsnJCcsIDB9OworCisKKyNpZmRlZiBGRUFUX0VWQUwKKy8qIFN0cnVjdCBmb3Igc3RvcmluZyBhIGxpbmUgaW5zaWRlIGEgd2hpbGUgbG9vcCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyX3UJKmxpbmU7CQkvKiBjb21tYW5kIGxpbmUgKi8KKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogc291cmNpbmdfbG51bSBvZiB0aGUgbGluZSAqLworfSB3Y21kX1Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvIGZvciBsaW5lIHBvc2l0aW9uIGluIGEgd2hpbGUgbG9vcC4KKyAqIFRoaXMgaXMgcmVxdWlyZWQsIGJlY2F1c2UgZG9fb25lX2NtZCgpIG1heSBpbnZva2UgZXhfZnVuY3Rpb24oKSwgd2hpY2gKKyAqIHJlYWRzIG1vcmUgbGluZXMgdGhhdCBtYXkgY29tZSBmcm9tIHRoZSB3aGlsZSBsb29wLgorICovCitzdHJ1Y3Qgd2hpbGVfY29va2llCit7CisgICAgZ2FycmF5X1QJKmxpbmVzX2dhcDsJCS8qIGdyb3dhcnJheSB3aXRoIGxpbmUgaW5mbyAqLworICAgIGludAkJY3VycmVudF9saW5lOwkJLyogbGFzdCByZWFkIGxpbmUgZnJvbSBncm93YXJyYXkgKi8KKyAgICBpbnQJCXJlcGVhdGluZzsJCS8qIFRSVUUgd2hlbiBsb29waW5nIGEgc2Vjb25kIHRpbWUgKi8KKyAgICAvKiBXaGVuICJyZXBlYXRpbmciIGlzIEZBTFNFIHVzZSAiZ2V0bGluZSIgYW5kICJjb29raWUiIHRvIGdldCBsaW5lcyAqLworICAgIGNoYXJfdQkqKCpnZXRsaW5lKSBfX0FSR1MoKGludCwgdm9pZCAqLCBpbnQpKTsKKyAgICB2b2lkCSpjb29raWU7Cit9OworCitzdGF0aWMgY2hhcl91CSpnZXRfd2hpbGVfbGluZSBfX0FSR1MoKGludCBjLCB2b2lkICpjb29raWUsIGludCBpbmRlbnQpKTsKK3N0YXRpYyBpbnQJc3RvcmVfd2hpbGVfbGluZSBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGNoYXJfdSAqbGluZSkpOworc3RhdGljIHZvaWQJZnJlZV9jbWRsaW5lcyBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKKyNlbmRpZgorCisKKy8qCisgKiBkb19leG1vZGUoKTogUmVwZWF0ZWRseSBnZXQgY29tbWFuZHMgZm9yIHRoZSAiRXgiIG1vZGUsIHVudGlsIHRoZSAiOnZpIgorICogY29tbWFuZCBpcyBnaXZlbi4KKyAqLworICAgIHZvaWQKK2RvX2V4bW9kZShpbXByb3ZlZCkKKyAgICBpbnQJCWltcHJvdmVkOwkgICAgLyogVFJVRSBmb3IgImltcHJvdmVkIEV4IiBtb2RlICovCit7CisgICAgaW50CQlzYXZlX21zZ19zY3JvbGw7CisgICAgaW50CQlwcmV2X21zZ19yb3c7CisgICAgbGluZW5yX1QJcHJldl9saW5lOworCisgICAgc2F2ZV9tc2dfc2Nyb2xsID0gbXNnX3Njcm9sbDsKKyAgICArK1JlZHJhd2luZ0Rpc2FibGVkOwkgICAgLyogZG9uJ3QgcmVkaXNwbGF5IHRoZSB3aW5kb3cgKi8KKyAgICArK25vX3dhaXRfcmV0dXJuOwkJICAgIC8qIGRvbid0IHdhaXQgZm9yIHJldHVybiAqLworICAgIGlmIChpbXByb3ZlZCkKKwlleG1vZGVfYWN0aXZlID0gRVhNT0RFX1ZJTTsKKyAgICBlbHNlCisgICAgeworCXNldHRtb2RlKFRNT0RFX0NPT0spOworCWV4bW9kZV9hY3RpdmUgPSBFWE1PREVfTk9STUFMOworICAgIH0KKworICAgIFN0YXRlID0gTk9STUFMOworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogSWdub3JlIHNjcm9sbGJhciBhbmQgbW91c2UgZXZlbnRzIGluIEV4IG1vZGUgKi8KKyAgICArK2hvbGRfZ3VpX2V2ZW50czsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU05JRkYKKyAgICB3YW50X3NuaWZmX3JlcXVlc3QgPSAwOyAgICAvKiBObyBLX1NOSUZGIHdhbnRlZCAqLworI2VuZGlmCisKKyAgICBNU0coXygiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iKSk7CisgICAgd2hpbGUgKGV4bW9kZV9hY3RpdmUpCisgICAgeworCW1zZ19zY3JvbGwgPSBUUlVFOworCW5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKwlleF9wcmVzc2VkcmV0dXJuID0gRkFMU0U7CisJZXhfbm9fcmVwcmludCA9IEZBTFNFOworCXByZXZfbXNnX3JvdyA9IG1zZ19yb3c7CisJcHJldl9saW5lID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2lmZGVmIEZFQVRfU05JRkYKKwlQcm9jZXNzU25pZmZSZXF1ZXN0cygpOworI2VuZGlmCisJaWYgKGltcHJvdmVkKQorCXsKKwkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93OworCSAgICBkb19jbWRsaW5lKE5VTEwsIGdldGV4bGluZSwgTlVMTCwgMCk7CisJfQorCWVsc2UKKwkgICAgZG9fY21kbGluZShOVUxMLCBnZXRleG1vZGVsaW5lLCBOVUxMLCBET0NNRF9OT1dBSVQpOworCWxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKworCWlmIChwcmV2X2xpbmUgIT0gY3Vyd2luLT53X2N1cnNvci5sbnVtICYmICFleF9ub19yZXByaW50KQorCXsKKwkgICAgaWYgKGV4X3ByZXNzZWRyZXR1cm4pCisJICAgIHsKKwkJLyogZ28gdXAgb25lIGxpbmUsIHRvIG92ZXJ3cml0ZSB0aGUgIjo8Q1I+IiBsaW5lLCBzbyB0aGUKKwkJICogb3V0cHV0IGRvZW5zbid0IGNvbnRhaW4gZW1wdHkgbGluZXMuICovCisJCW1zZ19yb3cgPSBwcmV2X21zZ19yb3c7CisJCWlmIChwcmV2X21zZ19yb3cgPT0gUm93cyAtIDEpCisJCSAgICBtc2dfcm93LS07CisJICAgIH0KKwkgICAgbXNnX2NvbCA9IDA7CisJICAgIHByaW50X2xpbmVfbm9fcHJlZml4KGN1cndpbi0+d19jdXJzb3IubG51bSwgRkFMU0UpOworCSAgICBtc2dfY2xyX2VvcygpOworCX0KKwllbHNlIGlmIChleF9wcmVzc2VkcmV0dXJuKQkvKiBtdXN0IGJlIGF0IEVPRiAqLworCSAgICBFTVNHKF8oIkU1MDE6IEF0IGVuZC1vZi1maWxlIikpOworICAgIH0KKworI2lmZGVmIEZFQVRfR1VJCisgICAgLS1ob2xkX2d1aV9ldmVudHM7CisjZW5kaWYKKyAgICBpZiAoIWltcHJvdmVkKQorCXNldHRtb2RlKFRNT0RFX1JBVyk7CisgICAgLS1SZWRyYXdpbmdEaXNhYmxlZDsKKyAgICAtLW5vX3dhaXRfcmV0dXJuOworICAgIHVwZGF0ZV9zY3JlZW4oQ0xFQVIpOworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfc2Nyb2xsID0gc2F2ZV9tc2dfc2Nyb2xsOworfQorCisvKgorICogRXhlY3V0ZSBhIHNpbXBsZSBjb21tYW5kIGxpbmUuICBVc2VkIGZvciB0cmFuc2xhdGVkIGNvbW1hbmRzIGxpa2UgIioiLgorICovCisgICAgaW50Citkb19jbWRsaW5lX2NtZChjbWQpCisgICAgY2hhcl91CSpjbWQ7Cit7CisgICAgcmV0dXJuIGRvX2NtZGxpbmUoY21kLCBOVUxMLCBOVUxMLAorCQkJCSAgIERPQ01EX1ZFUkJPU0V8RE9DTURfTk9XQUlUfERPQ01EX0tFWVRZUEVEKTsKK30KKworLyoKKyAqIGRvX2NtZGxpbmUoKTogZXhlY3V0ZSBvbmUgRXggY29tbWFuZCBsaW5lCisgKgorICogMS4gRXhlY3V0ZSAiY21kbGluZSIgd2hlbiBpdCBpcyBub3QgTlVMTC4KKyAqICAgIElmICJjbWRsaW5lIiBpcyBOVUxMLCBvciBtb3JlIGxpbmVzIGFyZSBuZWVkZWQsIGdldGxpbmUoKSBpcyB1c2VkLgorICogMi4gU3BsaXQgdXAgaW4gcGFydHMgc2VwYXJhdGVkIHdpdGggJ3wnLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseSEKKyAqCisgKiBmbGFnczoKKyAqIERPQ01EX1ZFUkJPU0UgIC0gVGhlIGNvbW1hbmQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAqIERPQ01EX05PV0FJVCAgIC0gRG9uJ3QgY2FsbCB3YWl0X3JldHVybigpIGFuZCBmcmllbmRzLgorICogRE9DTURfUkVQRUFUICAgLSBSZXBlYXQgZXhlY3V0aW9uIHVudGlsIGdldGxpbmUoKSByZXR1cm5zIE5VTEwuCisgKiBET0NNRF9LRVlUWVBFRCAtIERvbid0IHJlc2V0IEtleVR5cGVkLgorICogRE9DTURfRVhDUkVTRVQgLSBSZXNldCB0aGUgZXhjZXB0aW9uIGVudmlyb25tZW50ICh1c2VkIGZvciBkZWJ1Z2dpbmcpLgorICogRE9DTURfS0VFUExJTkUgLSBTdG9yZSBmaXJzdCB0eXBlZCBsaW5lIChmb3IgcmVwZWF0aW5nIHdpdGggIi4iKS4KKyAqCisgKiByZXR1cm4gRkFJTCBpZiBjbWRsaW5lIGNvdWxkIG5vdCBiZSBleGVjdXRlZCwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2RvX2NtZGxpbmUoY21kbGluZSwgZ2V0bGluZSwgY29va2llLCBmbGFncykKKyAgICBjaGFyX3UJKmNtZGxpbmU7CisgICAgY2hhcl91CSooKmdldGxpbmUpIF9fQVJHUygoaW50LCB2b2lkICosIGludCkpOworICAgIHZvaWQJKmNvb2tpZTsJCS8qIGFyZ3VtZW50IGZvciBnZXRsaW5lKCkgKi8KKyAgICBpbnQJCWZsYWdzOworeworICAgIGNoYXJfdQkqbmV4dF9jbWRsaW5lOwkJLyogbmV4dCBjbWQgdG8gZXhlY3V0ZSAqLworICAgIGNoYXJfdQkqY21kbGluZV9jb3B5ID0gTlVMTDsJLyogY29weSBvZiBjbWQgbGluZSAqLworICAgIGludAkJdXNlZF9nZXRsaW5lID0gRkFMU0U7CS8qIHVzZWQgImdldGxpbmUiIHRvIG9idGFpbiBjb21tYW5kICovCisgICAgc3RhdGljIGludAlyZWN1cnNpdmUgPSAwOwkJLyogcmVjdXJzaXZlIGRlcHRoICovCisgICAgaW50CQltc2dfZGlkb3V0X2JlZm9yZV9zdGFydCA9IDA7CisgICAgaW50CQljb3VudCA9IDA7CQkvKiBsaW5lIG51bWJlciBjb3VudCAqLworICAgIGludAkJZGlkX2luYyA9IEZBTFNFOwkvKiBpbmNyZW1lbnRlZCBSZWRyYXdpbmdEaXNhYmxlZCAqLworICAgIGludAkJcmV0dmFsID0gT0s7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgc3RydWN0IGNvbmRzdGFjayBjc3RhY2s7CQkvKiBjb25kaXRpb25hbCBzdGFjayAqLworICAgIGdhcnJheV9UCWxpbmVzX2dhOwkJLyoga2VlcCBsaW5lcyBmb3IgIjp3aGlsZSIgKi8KKyAgICBpbnQJCWN1cnJlbnRfbGluZSA9IDA7CS8qIGFjdGl2ZSBsaW5lIGluIGxpbmVzX2dhICovCisgICAgY2hhcl91CSpmbmFtZSA9IE5VTEw7CQkvKiBmdW5jdGlvbiBvciBzY3JpcHQgbmFtZSAqLworICAgIGxpbmVucl9UCSpicmVha3BvaW50ID0gTlVMTDsJLyogcHRyIHRvIGJyZWFrcG9pbnQgZmllbGQgaW4gY29va2llICovCisgICAgaW50CQkqZGJnX3RpY2sgPSBOVUxMOwkvKiBwdHIgdG8gZGJnX3RpY2sgZmllbGQgaW4gY29va2llICovCisgICAgaW50CQlzYXZlZF90cnlsZXZlbCA9IDA7CisgICAgaW50CQlzYXZlZF9mb3JjZV9hYm9ydCA9IDA7CisgICAgZXhjZXB0X1QJKnNhdmVkX2NhdWdodF9zdGFjayA9IE5VTEw7CisgICAgY2hhcl91CSpzYXZlZF92dl9leGNlcHRpb24gPSBOVUxMOworICAgIGNoYXJfdQkqc2F2ZWRfdnZfdGhyb3dwb2ludCA9IE5VTEw7CisgICAgaW50CQlzYXZlZF9kaWRfZW1zZyA9IDA7CisgICAgaW50CQlzYXZlZF9nb3RfaW50ID0gMDsKKyAgICBpbnQJCXNhdmVkX2RpZF90aHJvdyA9IDA7CisgICAgaW50CQlzYXZlZF9uZWVkX3JldGhyb3cgPSAwOworICAgIGludAkJc2F2ZWRfY2hlY2tfY3N0YWNrID0gMDsKKyAgICBleGNlcHRfVAkqc2F2ZWRfY3VycmVudF9leGNlcHRpb24gPSBOVUxMOworICAgIGludAkJaW5pdGlhbF90cnlsZXZlbDsKKyAgICBzdHJ1Y3QgbXNnbGlzdAkqKnNhdmVkX21zZ19saXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgbXNnbGlzdAkqcHJpdmF0ZV9tc2dfbGlzdDsKKworICAgIC8qICJnZXRsaW5lIiBhbmQgImNvb2tpZSIgcGFzc2VkIHRvIGRvX29uZV9jbWQoKSAqLworICAgIGNoYXJfdQkqKCpjbWRfZ2V0bGluZSkgX19BUkdTKChpbnQsIHZvaWQgKiwgaW50KSk7CisgICAgdm9pZAkqY21kX2Nvb2tpZTsKKyAgICBzdHJ1Y3Qgd2hpbGVfY29va2llIGNtZF93aGlsZV9jb29raWU7CisgICAgdm9pZAkqcmVhbF9jb29raWU7CisjZWxzZQorIyBkZWZpbmUgY21kX2dldGxpbmUgZ2V0bGluZQorIyBkZWZpbmUgY21kX2Nvb2tpZSBjb29raWUKKyNlbmRpZgorICAgIHN0YXRpYyBpbnQJY2FsbF9kZXB0aCA9IDA7CQkvKiByZWN1cnNpdmVuZXNzICovCisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICAvKiBGb3IgZXZlcnkgcGFpciBvZiBkb19jbWRsaW5lKCkvZG9fb25lX2NtZCgpIGNhbGxzLCB1c2UgYW4gZXh0cmEgbWVtb3J5CisgICAgICogbG9jYXRpb24gZm9yIHN0b3JpbmcgZXJyb3IgbWVzc2FnZXMgdG8gYmUgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbi4KKyAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZG9fZXJydGhyb3coKSBjYWxsIGluIGRvX29uZV9jbWQoKSBkb2VzIG5vdCBjb21iaW5lCisgICAgICogdGhlIG1lc3NhZ2VzIHN0b3JlZCBieSBhbiBlYXJsaWVyIGludm9jYXRpb24gb2YgZG9fb25lX2NtZCgpIHdpdGggdGhlCisgICAgICogY29tbWFuZCBuYW1lIG9mIHRoZSBsYXRlciBvbmUuICBUaGlzIHdvdWxkIGhhcHBlbiB3aGVuIEJ1ZldyaXRlUG9zdAorICAgICAqIGF1dG9jb21tYW5kcyBhcmUgZXhlY3V0ZWQgYWZ0ZXIgYSB3cml0ZSBlcnJvci4gKi8KKyAgICBzYXZlZF9tc2dfbGlzdCA9IG1zZ19saXN0OworICAgIG1zZ19saXN0ID0gJnByaXZhdGVfbXNnX2xpc3Q7CisgICAgcHJpdmF0ZV9tc2dfbGlzdCA9IE5VTEw7CisjZW5kaWYKKworICAgIC8qIEl0J3MgcG9zc2libGUgdG8gY3JlYXRlIGFuIGVuZGxlc3MgbG9vcCB3aXRoICI6ZXhlY3V0ZSIsIGNhdGNoIHRoYXQKKyAgICAgKiBoZXJlLiAgVGhlIHZhbHVlIG9mIDIwMCBhbGxvd3MgbmVzdGVkIGZ1bmN0aW9uIGNhbGxzLCAiOnNvdXJjZSIsIGV0Yy4gKi8KKyAgICBpZiAoY2FsbF9kZXB0aCA9PSAyMDApCisgICAgeworCUVNU0coXygiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIikpOworI2lmZGVmIEZFQVRfRVZBTAorCS8qIFdoZW4gY29udmVydGluZyB0byBhbiBleGNlcHRpb24sIHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBjb21tYW5kIG5hbWUKKwkgKiBzaW5jZSB0aGlzIGlzIG5vdCBhbiBlcnJvciBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZC4gKi8KKwlkb19lcnJ0aHJvdygoc3RydWN0IGNvbmRzdGFjayAqKU5VTEwsIChjaGFyX3UgKilOVUxMKTsKKwltc2dfbGlzdCA9IHNhdmVkX21zZ19saXN0OworI2VuZGlmCisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgICsrY2FsbF9kZXB0aDsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIGNzdGFjay5jc19pZHggPSAtMTsKKyAgICBjc3RhY2suY3Nfd2hpbGVsZXZlbCA9IDA7CisgICAgY3N0YWNrLmNzX3RyeWxldmVsID0gMDsKKyAgICBjc3RhY2suY3NfZW1zZ19zaWxlbnRfbGlzdCA9IE5VTEw7CisgICAgY3N0YWNrLmNzX2hhZF93aGlsZSA9IEZBTFNFOworICAgIGNzdGFjay5jc19oYWRfZW5kd2hpbGUgPSBGQUxTRTsKKyAgICBjc3RhY2suY3NfaGFkX2NvbnRpbnVlID0gRkFMU0U7CisgICAgY3N0YWNrLmNzX2hhZF9maW5hbGx5ID0gRkFMU0U7CisgICAgZ2FfaW5pdDIoJmxpbmVzX2dhLCAoaW50KXNpemVvZih3Y21kX1QpLCAxMCk7CisKKyAgICByZWFsX2Nvb2tpZSA9IGdldGxpbmVfY29va2llKGdldGxpbmUsIGNvb2tpZSk7CisKKyAgICAvKiBJbnNpZGUgYSBmdW5jdGlvbiB1c2UgYSBoaWdoZXIgbmVzdGluZyBsZXZlbC4gKi8KKyAgICBpZiAoZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldF9mdW5jX2xpbmUpCisJCQkgICAgICAgJiYgZXhfbmVzdGluZ19sZXZlbCA9PSBmdW5jX2xldmVsKHJlYWxfY29va2llKSkKKwkrK2V4X25lc3RpbmdfbGV2ZWw7CisKKyAgICAvKiBHZXQgdGhlIGZ1bmN0aW9uIG9yIHNjcmlwdCBuYW1lIGFuZCB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgbmV4dCBicmVha3BvaW50CisgICAgICogbGluZSBhbmQgdGhlIGRlYnVnIHRpY2sgZm9yIGEgZnVuY3Rpb24gb3Igc2NyaXB0IGFyZSBzdG9yZWQuICovCisgICAgaWYgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKSkKKyAgICB7CisJZm5hbWUgPSBmdW5jX25hbWUocmVhbF9jb29raWUpOworCWJyZWFrcG9pbnQgPSBmdW5jX2JyZWFrcG9pbnQocmVhbF9jb29raWUpOworCWRiZ190aWNrID0gZnVuY19kYmdfdGljayhyZWFsX2Nvb2tpZSk7CisgICAgfQorICAgIGVsc2UgaWYgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRzb3VyY2VsaW5lKSkKKyAgICB7CisJZm5hbWUgPSBzb3VyY2luZ19uYW1lOworCWJyZWFrcG9pbnQgPSBzb3VyY2VfYnJlYWtwb2ludChyZWFsX2Nvb2tpZSk7CisJZGJnX3RpY2sgPSBzb3VyY2VfZGJnX3RpY2socmVhbF9jb29raWUpOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSAiZm9yY2VfYWJvcnQiICBhbmQgInN1cHByZXNzX2VycnRocm93IiBhdCB0aGUgdG9wIGxldmVsLgorICAgICAqLworICAgIGlmICghcmVjdXJzaXZlKQorICAgIHsKKwlmb3JjZV9hYm9ydCA9IEZBTFNFOworCXN1cHByZXNzX2VycnRocm93ID0gRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiByZXF1ZXN0ZWQsIHN0b3JlIGFuZCByZXNldCB0aGUgZ2xvYmFsIHZhbHVlcyBjb250cm9sbGluZyB0aGUKKyAgICAgKiBleGNlcHRpb24gaGFuZGxpbmcgKHVzZWQgd2hlbiBkZWJ1Z2dpbmcpLgorICAgICAqLworICAgIGVsc2UgaWYgKGZsYWdzICYgRE9DTURfRVhDUkVTRVQpCisgICAgeworCXNhdmVkX3RyeWxldmVsCQk9IHRyeWxldmVsOwkJdHJ5bGV2ZWwgPSAwOworCXNhdmVkX2ZvcmNlX2Fib3J0CT0gZm9yY2VfYWJvcnQ7CQlmb3JjZV9hYm9ydCA9IEZBTFNFOworCXNhdmVkX2NhdWdodF9zdGFjawk9IGNhdWdodF9zdGFjazsJCWNhdWdodF9zdGFjayA9IE5VTEw7CisJc2F2ZWRfdnZfZXhjZXB0aW9uCT0gdl9leGNlcHRpb24oTlVMTCk7CisJc2F2ZWRfdnZfdGhyb3dwb2ludAk9IHZfdGhyb3dwb2ludChOVUxMKTsKKwkvKiBOZWNlc3NhcnkgZm9yIGRlYnVnZ2luZyBhbiBpbmFjdGl2ZSAiOmNhdGNoIiwgIjpmaW5hbGx5Iiwgb3IKKwkgKiAiOmVuZHRyeSI6ICovCisJc2F2ZWRfZGlkX2Vtc2cJCT0gZGlkX2Vtc2csCQlkaWRfZW1zZyAgICAgPSBGQUxTRTsKKwlzYXZlZF9nb3RfaW50CQk9IGdvdF9pbnQsCQlnb3RfaW50CSAgICAgPSBGQUxTRTsKKwlzYXZlZF9kaWRfdGhyb3cJCT0gZGlkX3Rocm93LAkJZGlkX3Rocm93ICAgID0gRkFMU0U7CisJc2F2ZWRfbmVlZF9yZXRocm93CT0gbmVlZF9yZXRocm93LAkJbmVlZF9yZXRocm93ID0gRkFMU0U7CisJc2F2ZWRfY2hlY2tfY3N0YWNrCT0gY2hlY2tfY3N0YWNrLAkJY2hlY2tfY3N0YWNrID0gRkFMU0U7CisJc2F2ZWRfY3VycmVudF9leGNlcHRpb24gPSBjdXJyZW50X2V4Y2VwdGlvbjsJY3VycmVudF9leGNlcHRpb249TlVMTDsKKyAgICB9CisKKyAgICBpbml0aWFsX3RyeWxldmVsID0gdHJ5bGV2ZWw7CisKKyAgICAvKgorICAgICAqICJkaWRfdGhyb3ciIHdpbGwgYmUgc2V0IHRvIFRSVUUgd2hlbiBhbiBleGNlcHRpb24gaXMgYmVpbmcgdGhyb3duLgorICAgICAqLworICAgIGRpZF90aHJvdyA9IEZBTFNFOworI2VuZGlmCisgICAgLyoKKyAgICAgKiAiZGlkX2Vtc2ciIHdpbGwgYmUgc2V0IHRvIFRSVUUgd2hlbiBlbXNnKCkgaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAqIGNhbmNlbCB0aGUgd2hvbGUgY29tbWFuZCBsaW5lLCBhbmQgYW55IGlmL2VuZGlmIHdoaWxlL2VuZHdoaWxlIGxvb3AuCisgICAgICogSWYgZm9yY2VfYWJvcnQgaXMgc2V0LCB3ZSBjYW5jZWwgZXZlcnl0aGluZy4KKyAgICAgKi8KKyAgICBkaWRfZW1zZyA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBLZXlUeXBlZCBpcyBvbmx5IHNldCB3aGVuIGNhbGxpbmcgdmdldGMoKS4gIFJlc2V0IGl0IGhlcmUgd2hlbiBub3QKKyAgICAgKiBjYWxsaW5nIHZnZXRjKCkgKHNvdXJjZWQgY29tbWFuZCBsaW5lcykuCisgICAgICovCisgICAgaWYgKCEoZmxhZ3MgJiBET0NNRF9LRVlUWVBFRCkgJiYgIWdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRleGxpbmUpKQorCUtleVR5cGVkID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIENvbnRpbnVlIGV4ZWN1dGluZyBjb21tYW5kIGxpbmVzOgorICAgICAqIC0gd2hlbiBpbnNpZGUgYW4gIjppZiIgb3IgIjp3aGlsZSIKKyAgICAgKiAtIGZvciBtdWx0aXBsZSBjb21tYW5kcyBvbiBvbmUgbGluZSwgc2VwYXJhdGVkIHdpdGggJ3wnCisgICAgICogLSB3aGVuIHJlcGVhdGluZyB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBsaW5lcyAoZm9yICI6c291cmNlIikKKyAgICAgKi8KKyAgICBuZXh0X2NtZGxpbmUgPSBjbWRsaW5lOworICAgIGRvCisgICAgeworCS8qIHN0b3Agc2tpcHBpbmcgY21kcyBmb3IgYW4gZXJyb3IgbXNnIGFmdGVyIGFsbCBlbmRpZnMgYW5kIGVuZHdoaWxlcyAqLworCWlmIChuZXh0X2NtZGxpbmUgPT0gTlVMTAorI2lmZGVmIEZFQVRfRVZBTAorCQkmJiAhZm9yY2VfYWJvcnQKKwkJJiYgY3N0YWNrLmNzX2lkeCA8IDAKKwkJJiYgIShnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0X2Z1bmNfbGluZSkKKwkJCQkJICAgICAgICYmIGZ1bmNfaGFzX2Fib3J0KHJlYWxfY29va2llKSkKKyNlbmRpZgorCQkJCQkJCSkKKwkgICAgZGlkX2Vtc2cgPSBGQUxTRTsKKworCS8qCisJICogMS4gSWYgcmVwZWF0aW5nIGEgbGluZSB3aXRoICI6d2hpbGUiLCBnZXQgYSBsaW5lIGZyb20gbGluZXNfZ2EuCisJICogMi4gSWYgbm8gbGluZSBnaXZlbjogR2V0IGFuIGFsbG9jYXRlZCBsaW5lIHdpdGggZ2V0bGluZSgpLgorCSAqIDMuIElmIGEgbGluZSBpcyBnaXZlbjogTWFrZSBhIGNvcHksIHNvIHdlIGNhbiBtZXNzIHdpdGggaXQuCisJICovCisKKyNpZmRlZiBGRUFUX0VWQUwKKwkvKiAxLiBJZiByZXBlYXRpbmcsIGdldCBhIHByZXZpb3VzIGxpbmUgZnJvbSBsaW5lc19nYS4gKi8KKwlpZiAoY3N0YWNrLmNzX3doaWxlbGV2ZWwgJiYgY3VycmVudF9saW5lIDwgbGluZXNfZ2EuZ2FfbGVuKQorCXsKKwkgICAgLyogRWFjaCAnfCcgc2VwYXJhdGVkIGNvbW1hbmQgaXMgc3RvcmVkIHNlcGFyYXRlbHkgaW4gbGluZXNfZ2EsIHRvCisJICAgICAqIGJlIGFibGUgdG8ganVtcCB0byBpdC4gIERvbid0IHVzZSBuZXh0X2NtZGxpbmUgbm93LiAqLworCSAgICB2aW1fZnJlZShjbWRsaW5lX2NvcHkpOworCSAgICBjbWRsaW5lX2NvcHkgPSBOVUxMOworCisJICAgIC8qIENoZWNrIGlmIGEgZnVuY3Rpb24gaGFzIHJldHVybmVkIG9yLCB1bmxlc3MgaXQgaGFzIGFuIHVuY2xvc2VkCisJICAgICAqIHRyeSBjb25kaXRpb25hbCwgYWJvcnRlZC4gKi8KKwkgICAgaWYgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKQorCQkJCQkgICAgICAgJiYgZnVuY19oYXNfZW5kZWQocmVhbF9jb29raWUpKQorCSAgICB7CisJCXJldHZhbCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogQ2hlY2sgaWYgYSBzb3VyY2VkIGZpbGUgaGl0IGEgIjpmaW5pc2giIGNvbW1hbmQuICovCisJICAgIGlmIChzb3VyY2VfZmluaXNoZWQoZ2V0bGluZSwgY29va2llKSkKKwkgICAgeworCQlyZXR2YWwgPSBGQUlMOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIElmIGJyZWFrcG9pbnRzIGhhdmUgYmVlbiBhZGRlZC9kZWxldGVkIG5lZWQgdG8gY2hlY2sgZm9yIGl0LiAqLworCSAgICBpZiAoYnJlYWtwb2ludCAhPSBOVUxMICYmIGRiZ190aWNrICE9IE5VTEwKKwkJCQkJCSAgICYmICpkYmdfdGljayAhPSBkZWJ1Z190aWNrKQorCSAgICB7CisJCSpicmVha3BvaW50ID0gZGJnX2ZpbmRfYnJlYWtwb2ludCgKKwkJCQlnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0c291cmNlbGluZSksCisJCQkJCQkJZm5hbWUsIHNvdXJjaW5nX2xudW0pOworCQkqZGJnX3RpY2sgPSBkZWJ1Z190aWNrOworCSAgICB9CisKKwkgICAgbmV4dF9jbWRsaW5lID0gKCh3Y21kX1QgKikobGluZXNfZ2EuZ2FfZGF0YSkpW2N1cnJlbnRfbGluZV0ubGluZTsKKwkgICAgc291cmNpbmdfbG51bSA9ICgod2NtZF9UICopKGxpbmVzX2dhLmdhX2RhdGEpKVtjdXJyZW50X2xpbmVdLmxudW07CisKKwkgICAgLyogRGlkIHdlIGVuY291bnRlciBhIGJyZWFrcG9pbnQ/ICovCisJICAgIGlmIChicmVha3BvaW50ICE9IE5VTEwgJiYgKmJyZWFrcG9pbnQgIT0gMAorCQkJCQkgICAgICAmJiAqYnJlYWtwb2ludCA8PSBzb3VyY2luZ19sbnVtKQorCSAgICB7CisJCWRiZ19icmVha3BvaW50KGZuYW1lLCBzb3VyY2luZ19sbnVtKTsKKwkJLyogRmluZCBuZXh0IGJyZWFrcG9pbnQuICovCisJCSpicmVha3BvaW50ID0gZGJnX2ZpbmRfYnJlYWtwb2ludCgKKwkJCQlnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0c291cmNlbGluZSksCisJCQkJCQkJZm5hbWUsIHNvdXJjaW5nX2xudW0pOworCQkqZGJnX3RpY2sgPSBkZWJ1Z190aWNrOworCSAgICB9CisJfQorCisJaWYgKGNzdGFjay5jc193aGlsZWxldmVsKQorCXsKKwkgICAgLyogSW5zaWRlIGEgd2hpbGUgbG9vcCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBsaW5lcyBhbmQgdXNlIHRoZW0KKwkgICAgICogYWdhaW4uICBQYXNzIGEgZGlmZmVyZW50ICJnZXRsaW5lIiBmdW5jdGlvbiB0byBkb19vbmVfY21kKCkKKwkgICAgICogYmVsb3csIHNvIHRoYXQgaXQgc3RvcmVzIGxpbmVzIGluIG9yIHJlYWRzIHRoZW0gZnJvbQorCSAgICAgKiAibGluZXNfZ2EiLiAgTWFrZXMgaXQgcG9zc2libGUgdG8gZGVmaW5lIGEgZnVuY3Rpb24gaW5zaWRlIGEKKwkgICAgICogd2hpbGUgbG9vcC4gKi8KKwkgICAgY21kX2dldGxpbmUgPSBnZXRfd2hpbGVfbGluZTsKKwkgICAgY21kX2Nvb2tpZSA9ICh2b2lkICopJmNtZF93aGlsZV9jb29raWU7CisJICAgIGNtZF93aGlsZV9jb29raWUubGluZXNfZ2FwID0gJmxpbmVzX2dhOworCSAgICBjbWRfd2hpbGVfY29va2llLmN1cnJlbnRfbGluZSA9IGN1cnJlbnRfbGluZTsKKwkgICAgY21kX3doaWxlX2Nvb2tpZS5nZXRsaW5lID0gZ2V0bGluZTsKKwkgICAgY21kX3doaWxlX2Nvb2tpZS5jb29raWUgPSBjb29raWU7CisJICAgIGNtZF93aGlsZV9jb29raWUucmVwZWF0aW5nID0gKGN1cnJlbnRfbGluZSA8IGxpbmVzX2dhLmdhX2xlbik7CisJfQorCWVsc2UKKwl7CisJICAgIGNtZF9nZXRsaW5lID0gZ2V0bGluZTsKKwkgICAgY21kX2Nvb2tpZSA9IGNvb2tpZTsKKwl9CisjZW5kaWYKKworCS8qIDIuIElmIG5vIGxpbmUgZ2l2ZW4sIGdldCBhbiBhbGxvY2F0ZWQgbGluZSB3aXRoIGdldGxpbmUoKS4gKi8KKwlpZiAobmV4dF9jbWRsaW5lID09IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBOZWVkIHRvIHNldCBtc2dfZGlkb3V0IGZvciB0aGUgZmlyc3QgbGluZSBhZnRlciBhbiAiOmlmIiwKKwkgICAgICogb3RoZXJ3aXNlIHRoZSAiOmlmIiB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCSAgICAgKi8KKwkgICAgaWYgKGNvdW50ID09IDEgJiYgZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldGV4bGluZSkpCisJCW1zZ19kaWRvdXQgPSBUUlVFOworCSAgICBpZiAoZ2V0bGluZSA9PSBOVUxMIHx8IChuZXh0X2NtZGxpbmUgPSBnZXRsaW5lKCc6JywgY29va2llLAorI2lmZGVmIEZFQVRfRVZBTAorCQkgICAgY3N0YWNrLmNzX2lkeCA8IDAgPyAwIDogKGNzdGFjay5jc19pZHggKyAxKSAqIDIKKyNlbHNlCisJCSAgICAwCisjZW5kaWYKKwkJCSAgICApKSA9PSBOVUxMKQorCSAgICB7CisJCS8qIERvbid0IGNhbGwgd2FpdF9yZXR1cm4gZm9yIGFib3J0ZWQgY29tbWFuZCBsaW5lLiAgVGhlIE5VTEwKKwkJICogcmV0dXJuZWQgZm9yIHRoZSBlbmQgb2YgYSBzb3VyY2VkIGZpbGUgb3IgZXhlY3V0ZWQgZnVuY3Rpb24KKwkJICogZG9lc24ndCBkbyB0aGlzLiAqLworCQlpZiAoS2V5VHlwZWQgJiYgIShmbGFncyAmIERPQ01EX1JFUEVBVCkpCisJCSAgICBuZWVkX3dhaXRfcmV0dXJuID0gRkFMU0U7CisJCXJldHZhbCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisJICAgIHVzZWRfZ2V0bGluZSA9IFRSVUU7CisKKwkgICAgLyoKKwkgICAgICogS2VlcCB0aGUgZmlyc3QgdHlwZWQgbGluZS4gIENsZWFyIGl0IHdoZW4gbW9yZSBsaW5lcyBhcmUgdHlwZWQuCisJICAgICAqLworCSAgICBpZiAoZmxhZ3MgJiBET0NNRF9LRUVQTElORSkKKwkgICAgeworCQl2aW1fZnJlZShyZXBlYXRfY21kbGluZSk7CisJCWlmIChjb3VudCA9PSAwKQorCQkgICAgcmVwZWF0X2NtZGxpbmUgPSB2aW1fc3Ryc2F2ZShuZXh0X2NtZGxpbmUpOworCQllbHNlCisJCSAgICByZXBlYXRfY21kbGluZSA9IE5VTEw7CisJICAgIH0KKwl9CisKKwkvKiAzLiBNYWtlIGEgY29weSBvZiB0aGUgY29tbWFuZCBzbyB3ZSBjYW4gbWVzcyB3aXRoIGl0LiAqLworCWVsc2UgaWYgKGNtZGxpbmVfY29weSA9PSBOVUxMKQorCXsKKwkgICAgbmV4dF9jbWRsaW5lID0gdmltX3N0cnNhdmUobmV4dF9jbWRsaW5lKTsKKwkgICAgaWYgKG5leHRfY21kbGluZSA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coXyhlX291dG9mbWVtKSk7CisJCXJldHZhbCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisJfQorCWNtZGxpbmVfY29weSA9IG5leHRfY21kbGluZTsKKworI2lmZGVmIEZFQVRfRVZBTAorCS8qCisJICogU2F2ZSB0aGUgY3VycmVudCBsaW5lIHdoZW4gaW5zaWRlIGEgIjp3aGlsZSIsIGFuZCB3aGVuIHRoZSBjb21tYW5kCisJICogbG9va3MgbGlrZSBhICI6d2hpbGUiLCBiZWNhdXNlIHdlIG1heSBuZWVkIGl0IGxhdGVyLgorCSAqIFdoZW4gdGhlcmUgaXMgYSAnfCcgYW5kIGFub3RoZXIgY29tbWFuZCwgaXQgaXMgc3RvcmVkIHNlcGFyYXRlbHksCisJICogYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8ganVtcCBiYWNrIHRvIGl0IGZyb20gYW4gOmVuZHdoaWxlLgorCSAqLworCWlmICgJICAgY3VycmVudF9saW5lID09IGxpbmVzX2dhLmdhX2xlbgorCQkmJiAoY3N0YWNrLmNzX3doaWxlbGV2ZWwgfHwgaGFzX3doaWxlX2NtZChuZXh0X2NtZGxpbmUpKSkKKwl7CisJICAgIGlmIChzdG9yZV93aGlsZV9saW5lKCZsaW5lc19nYSwgbmV4dF9jbWRsaW5lKSA9PSBGQUlMKQorCSAgICB7CisJCXJldHZhbCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisJfQorCWRpZF9lbmRpZiA9IEZBTFNFOworI2VuZGlmCisKKwlpZiAoY291bnQrKyA9PSAwKQorCXsKKwkgICAgLyoKKwkgICAgICogQWxsIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kcyBpcyBwdXQgYmVsb3cgZWFjaCBvdGhlciwgd2l0aG91dAorCSAgICAgKiB3YWl0aW5nIGZvciBhIHJldHVybi4gRG9uJ3QgZG8gdGhpcyB3aGVuIGV4ZWN1dGluZyBjb21tYW5kcworCSAgICAgKiBmcm9tIGEgc2NyaXB0IG9yIHdoZW4gYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZSAoZS5nLiBmb3IgIjplCisJICAgICAqICtjb21tYW5kIGZpbGUiKS4KKwkgICAgICovCisJICAgIGlmICghKGZsYWdzICYgRE9DTURfTk9XQUlUKSAmJiAhcmVjdXJzaXZlKQorCSAgICB7CisJCW1zZ19kaWRvdXRfYmVmb3JlX3N0YXJ0ID0gbXNnX2RpZG91dDsKKwkJbXNnX2RpZGFueSA9IEZBTFNFOyAvKiBubyBvdXRwdXQgeWV0ICovCisJCW1zZ19zdGFydCgpOworCQltc2dfc2Nyb2xsID0gVFJVRTsgIC8qIHB1dCBtZXNzYWdlcyBiZWxvdyBlYWNoIG90aGVyICovCisJCSsrbm9fd2FpdF9yZXR1cm47ICAgLyogZG9udCB3YWl0IGZvciByZXR1cm4gdW50aWwgZmluaXNoZWQgKi8KKwkJKytSZWRyYXdpbmdEaXNhYmxlZDsKKwkJZGlkX2luYyA9IFRSVUU7CisJICAgIH0KKwl9CisKKwlpZiAocF92ZXJib3NlID49IDE1ICYmIHNvdXJjaW5nX25hbWUgIT0gTlVMTCkKKwl7CisJICAgIGludAljID0gLTE7CisKKwkgICAgKytub193YWl0X3JldHVybjsKKwkgICAgbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwkgICAgLyogVHJ1bmNhdGUgbG9uZyBsaW5lcywgc21zZygpIGNhbid0IGhhbmRsZSB0aGF0LiAqLworCSAgICBpZiAoU1RSTEVOKGNtZGxpbmVfY29weSkgPiAyMDApCisJICAgIHsKKwkJYyA9IGNtZGxpbmVfY29weVsyMDBdOworCQljbWRsaW5lX2NvcHlbMjAwXSA9IE5VTDsKKwkgICAgfQorCSAgICBzbXNnKChjaGFyX3UgKilfKCJsaW5lICVsZDogJXMiKSwKKwkJCQkJICAgKGxvbmcpc291cmNpbmdfbG51bSwgY21kbGluZV9jb3B5KTsKKwkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOyAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworCSAgICBpZiAoYyA+PSAwKQorCQljbWRsaW5lX2NvcHlbMjAwXSA9IGM7CisJICAgIGNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKwkgICAgLS1ub193YWl0X3JldHVybjsKKwl9CisKKwkvKgorCSAqIDIuIEV4ZWN1dGUgb25lICd8JyBzZXBhcmF0ZWQgY29tbWFuZC4KKwkgKiAgICBkb19vbmVfY21kKCkgd2lsbCByZXR1cm4gTlVMTCBpZiB0aGVyZSBpcyBubyB0cmFpbGluZyAnfCcuCisJICogICAgImNtZGxpbmVfY29weSIgY2FuIGNoYW5nZSwgZS5nLiBmb3IgJyUnIGFuZCAnIycgZXhwYW5zaW9uLgorCSAqLworCSsrcmVjdXJzaXZlOworCW5leHRfY21kbGluZSA9IGRvX29uZV9jbWQoJmNtZGxpbmVfY29weSwgZmxhZ3MgJiBET0NNRF9WRVJCT1NFLAorI2lmZGVmIEZFQVRfRVZBTAorCQkJCSZjc3RhY2ssCisjZW5kaWYKKwkJCQljbWRfZ2V0bGluZSwgY21kX2Nvb2tpZSk7CisJLS1yZWN1cnNpdmU7CisKKyNpZmRlZiBGRUFUX0VWQUwKKwlpZiAoY21kX2Nvb2tpZSA9PSAodm9pZCAqKSZjbWRfd2hpbGVfY29va2llKQorCSAgICAvKiBVc2UgImN1cnJlbnRfbGluZSIgZnJvbSAiY21kX3doaWxlX2Nvb2tpZSIsIGl0IG1heSBoYXZlIGJlZW4KKwkgICAgICogaW5jcmVtZW50ZWQgd2hlbiBkZWZpbmluZyBhIGZ1bmN0aW9uLiAqLworCSAgICBjdXJyZW50X2xpbmUgPSBjbWRfd2hpbGVfY29va2llLmN1cnJlbnRfbGluZTsKKyNlbmRpZgorCisJaWYgKG5leHRfY21kbGluZSA9PSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUoY21kbGluZV9jb3B5KTsKKwkgICAgY21kbGluZV9jb3B5ID0gTlVMTDsKKyNpZmRlZiBGRUFUX0NNREhJU1QKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIGNvbW1hbmQgd2FzIHR5cGVkLCByZW1lbWJlciBpdCBmb3IgdGhlICc6JyByZWdpc3Rlci4KKwkgICAgICogRG8gdGhpcyBBRlRFUiBleGVjdXRpbmcgdGhlIGNvbW1hbmQgdG8gbWFrZSA6QDogd29yay4KKwkgICAgICovCisJICAgIGlmIChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0ZXhsaW5lKQorCQkJCQkJICAmJiBuZXdfbGFzdF9jbWRsaW5lICE9IE5VTEwpCisJICAgIHsKKwkJdmltX2ZyZWUobGFzdF9jbWRsaW5lKTsKKwkJbGFzdF9jbWRsaW5lID0gbmV3X2xhc3RfY21kbGluZTsKKwkJbmV3X2xhc3RfY21kbGluZSA9IE5VTEw7CisJICAgIH0KKyNlbmRpZgorCX0KKwllbHNlCisJeworCSAgICAvKiBuZWVkIHRvIGNvcHkgdGhlIGNvbW1hbmQgYWZ0ZXIgdGhlICd8JyB0byBjbWRsaW5lX2NvcHksIGZvciB0aGUKKwkgICAgICogbmV4dCBkb19vbmVfY21kKCkgKi8KKwkgICAgbWNoX21lbW1vdmUoY21kbGluZV9jb3B5LCBuZXh0X2NtZGxpbmUsIFNUUkxFTihuZXh0X2NtZGxpbmUpICsgMSk7CisJICAgIG5leHRfY21kbGluZSA9IGNtZGxpbmVfY29weTsKKwl9CisKKworI2lmZGVmIEZFQVRfRVZBTAorCS8qIHJlc2V0IGRpZF9lbXNnIGZvciBhIGZ1bmN0aW9uIHRoYXQgaXMgbm90IGFib3J0ZWQgYnkgYW4gZXJyb3IgKi8KKwlpZiAoZGlkX2Vtc2cgJiYgIWZvcmNlX2Fib3J0CisJCSYmIGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKQorCQkJCQkgICAgICAmJiAhZnVuY19oYXNfYWJvcnQocmVhbF9jb29raWUpKQorCSAgICBkaWRfZW1zZyA9IEZBTFNFOworCisJaWYgKGNzdGFjay5jc193aGlsZWxldmVsKQorCXsKKwkgICAgKytjdXJyZW50X2xpbmU7CisKKwkgICAgLyoKKwkgICAgICogQW4gIjplbmR3aGlsZSIgYW5kICI6Y29udGludWUiIGlzIGhhbmRsZWQgaGVyZS4KKwkgICAgICogSWYgd2Ugd2VyZSBleGVjdXRpbmcgY29tbWFuZHMsIGp1bXAgYmFjayB0byB0aGUgIjp3aGlsZSIuCisJICAgICAqIElmIHdlIHdlcmUgbm90IGV4ZWN1dGluZyBjb21tYW5kcywgZGVjcmVtZW50IHdoaWxlbGV2ZWwuCisJICAgICAqLworCSAgICBpZiAoY3N0YWNrLmNzX2hhZF9lbmR3aGlsZSB8fCBjc3RhY2suY3NfaGFkX2NvbnRpbnVlKQorCSAgICB7CisJCWlmIChjc3RhY2suY3NfaGFkX2VuZHdoaWxlKQorCQkgICAgY3N0YWNrLmNzX2hhZF9lbmR3aGlsZSA9IEZBTFNFOworCQllbHNlCisJCSAgICBjc3RhY2suY3NfaGFkX2NvbnRpbnVlID0gRkFMU0U7CisKKwkJLyogSnVtcCBiYWNrIHRvIHRoZSBtYXRjaGluZyAiOndoaWxlIi4gIEJlIGNhcmVmdWwgbm90IHRvIHVzZQorCQkgKiBhIGNzX2xpbmVbXSBmcm9tIGFuIGVudHJ5IHRoYXQgaXNuJ3QgYSAiOndoaWxlIjogSXQgd291bGQKKwkJICogbWFrZSAiY3VycmVudF9saW5lIiBpbnZhbGlkIGFuZCBjYW4gY2F1c2UgYSBjcmFzaC4gKi8KKwkJaWYgKCFkaWRfZW1zZyAmJiAhZ290X2ludCAmJiAhZGlkX3Rocm93CisJCQkmJiBjc3RhY2suY3NfaWR4ID49IDAKKwkJCSYmIChjc3RhY2suY3NfZmxhZ3NbY3N0YWNrLmNzX2lkeF0gJiBDU0ZfV0hJTEUpCisJCQkmJiBjc3RhY2suY3NfbGluZVtjc3RhY2suY3NfaWR4XSA+PSAwCisJCQkmJiAoY3N0YWNrLmNzX2ZsYWdzW2NzdGFjay5jc19pZHhdICYgQ1NGX0FDVElWRSkpCisJCXsKKwkJICAgIGN1cnJlbnRfbGluZSA9IGNzdGFjay5jc19saW5lW2NzdGFjay5jc19pZHhdOworCQkgICAgY3N0YWNrLmNzX2hhZF93aGlsZSA9IFRSVUU7CS8qIG5vdGUgd2UganVtcGVkIHRoZXJlICovCisJCSAgICBsaW5lX2JyZWFrY2hlY2soKTsJCS8qIGNoZWNrIGlmIENUUkwtQyB0eXBlZCAqLworCisJCSAgICAvKiBDaGVjayBmb3IgdGhlIG5leHQgYnJlYWtwb2ludCBhdCBvciBhZnRlciB0aGUgIjp3aGlsZSIuKi8KKwkJICAgIGlmIChicmVha3BvaW50ICE9IE5VTEwpCisJCSAgICB7CisJCQkqYnJlYWtwb2ludCA9IGRiZ19maW5kX2JyZWFrcG9pbnQoCisJCQkJZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldHNvdXJjZWxpbmUpLAorCQkJCQkJCQkJZm5hbWUsCisJCQkgICAoKHdjbWRfVCAqKWxpbmVzX2dhLmdhX2RhdGEpW2N1cnJlbnRfbGluZV0ubG51bS0xKTsKKwkJCSpkYmdfdGljayA9IGRlYnVnX3RpY2s7CisJCSAgICB9CisJCX0KKwkJZWxzZSAvKiBjYW4gb25seSBnZXQgaGVyZSB3aXRoICI6ZW5kd2hpbGUiICovCisJCXsKKwkJICAgIC0tY3N0YWNrLmNzX3doaWxlbGV2ZWw7CisJCSAgICBpZiAoY3N0YWNrLmNzX2lkeCA+PSAwKQorCQkJLS1jc3RhY2suY3NfaWR4OworCQl9CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBGb3IgYSAiOndoaWxlIiB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBsaW5lIG51bWJlci4KKwkgICAgICovCisJICAgIGVsc2UgaWYgKGNzdGFjay5jc19oYWRfd2hpbGUpCisJICAgIHsKKwkJY3N0YWNrLmNzX2hhZF93aGlsZSA9IEZBTFNFOworCQljc3RhY2suY3NfbGluZVtjc3RhY2suY3NfaWR4XSA9IGN1cnJlbnRfbGluZSAtIDE7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIFdoZW4gbm90IGluc2lkZSBhbnkgIjp3aGlsZSIgbG9vcCwgY2xlYXIgcmVtZW1iZXJlZCBsaW5lcy4KKwkgKi8KKwlpZiAoIWNzdGFjay5jc193aGlsZWxldmVsKQorCXsKKwkgICAgaWYgKGxpbmVzX2dhLmdhX2xlbiA+IDApCisJICAgIHsKKwkJc291cmNpbmdfbG51bSA9CisJCSAgICAgICAoKHdjbWRfVCAqKWxpbmVzX2dhLmdhX2RhdGEpW2xpbmVzX2dhLmdhX2xlbiAtIDFdLmxudW07CisJCWZyZWVfY21kbGluZXMoJmxpbmVzX2dhKTsKKwkgICAgfQorCSAgICBjdXJyZW50X2xpbmUgPSAwOworCX0KKworCS8qCisJICogQSAiOmZpbmFsbHkiIG1ha2VzIGRpZF9lbXNnLCBnb3RfaW50LCBhbmQgZGlkX3Rocm93IHBlbmRpbmcgZm9yIGJlaW5nCisJICogcmVzdG9yZWQgYXQgdGhlICI6ZW5kdHJ5Ii4gIFJlc2V0IHRoZW0gaGVyZSBhbmQgc2V0IHRoZSBBQ1RJVkUgYW5kCisJICogRklOQUxMWSBmbGFncywgc28gdGhhdCB0aGUgZmluYWxseSBjbGF1c2UgZ2V0cyBleGVjdXRlZC4gIFRoaXMKKwkgKiBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBhIG1pc3NpbmcgIjplbmRpZiIgb3IgIjplbmR3aGlsZSIgd2FzCisJICogZGV0ZWN0ZWQgYnkgdGhlICI6ZmluYWxseSIgaXRzZWxmLgorCSAqLworCWlmIChjc3RhY2suY3NfaGFkX2ZpbmFsbHkpCisJeworCSAgICBjc3RhY2suY3NfaGFkX2ZpbmFsbHkgPSBGQUxTRTsKKwkgICAgcmVwb3J0X21ha2VfcGVuZGluZyhjc3RhY2suY3NfcGVuZGluZ1tjc3RhY2suY3NfaWR4XSAmCisJCSAgICAoQ1NUUF9FUlJPUiB8IENTVFBfSU5URVJSVVBUIHwgQ1NUUF9USFJPVyksCisJCSAgICBkaWRfdGhyb3cgPyAodm9pZCAqKWN1cnJlbnRfZXhjZXB0aW9uIDogTlVMTCk7CisJICAgIGRpZF9lbXNnID0gZ290X2ludCA9IGRpZF90aHJvdyA9IEZBTFNFOworCSAgICBjc3RhY2suY3NfZmxhZ3NbY3N0YWNrLmNzX2lkeF0gfD0gQ1NGX0FDVElWRSB8IENTRl9GSU5BTExZOworCX0KKworCS8qIFVwZGF0ZSBnbG9iYWwgInRyeWxldmVsIiBmb3IgcmVjdXJzaXZlIGNhbGxzIHRvIGRvX2NtZGxpbmUoKSBmcm9tCisJICogd2l0aGluIHRoaXMgbG9vcC4gKi8KKwl0cnlsZXZlbCA9IGluaXRpYWxfdHJ5bGV2ZWwgKyBjc3RhY2suY3NfdHJ5bGV2ZWw7CisKKwkvKgorCSAqIElmIHRoZSBvdXRlcm1vc3QgdHJ5IGNvbmRpdGlvbmFsIChhY2Nyb3NzIGZ1bmN0aW9uIGNhbGxzIGFuZCBzb3VyY2VkCisJICogZmlsZXMpIGlzIGFib3J0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwgYW4gaW50ZXJydXB0LCBvciBhbiB1bmNhdWdodAorCSAqIGV4Y2VwdGlvbiwgY2FuY2VsIGV2ZXJ5dGhpbmcuICBJZiBpdCBpcyBsZWZ0IG5vcm1hbGx5LCByZXNldAorCSAqIGZvcmNlX2Fib3J0IHRvIGdldCB0aGUgbm9uLUVIIGNvbXBhdGlibGUgYWJvcnRpb24gYmVoYXZpb3IgZm9yCisJICogdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdC4KKwkgKi8KKwlpZiAodHJ5bGV2ZWwgPT0gMCAmJiAhZGlkX2Vtc2cgJiYgIWdvdF9pbnQgJiYgIWRpZF90aHJvdykKKwkgICAgZm9yY2VfYWJvcnQgPSBGQUxTRTsKKworCS8qIENvbnZlcnQgYW4gaW50ZXJydXB0IHRvIGFuIGV4Y2VwdGlvbiBpZiBhcHByb3ByaWF0ZS4gKi8KKwkodm9pZClkb19pbnR0aHJvdygmY3N0YWNrKTsKKyNlbmRpZiAvKiBGRUFUX0VWQUwgKi8KKworICAgIH0KKyAgICAvKgorICAgICAqIENvbnRpbnVlIGV4ZWN1dGluZyBjb21tYW5kIGxpbmVzIHdoZW46CisgICAgICogLSBubyBDVFJMLUMgdHlwZWQsIG5vIGFib3J0aW5nIGVycm9yLCBubyBleGNlcHRpb24gdGhyb3duIG9yIHRyeQorICAgICAqICAgY29uZGl0aW9uYWxzIG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IgZXhlY3V0aW5nIGZpbmFsbHkgY2xhdXNlcyBvcgorICAgICAqICAgY2F0Y2hpbmcgYW4gaW50ZXJydXB0IGV4Y2VwdGlvbgorICAgICAqIC0gZGlkbid0IGdldCBhbiBlcnJvciBtZXNzYWdlIG9yIGxpbmVzIGFyZSBub3QgdHlwZWQKKyAgICAgKiAtIHRoZXJlIGlzIGEgY29tbWFuZCBhZnRlciAnfCcsIGluc2lkZSBhIDppZiwgOndoaWxlLCBvciA6dHJ5LCBvcgorICAgICAqICAgbG9vcGluZyBmb3IgIjpzb3VyY2UiIGNvbW1hbmQgb3IgZnVuY3Rpb24gY2FsbC4KKyAgICAgKi8KKyAgICB3aGlsZSAoISgoZ290X2ludAorI2lmZGVmIEZFQVRfRVZBTAorCQkgICAgfHwgKGRpZF9lbXNnICYmIGZvcmNlX2Fib3J0KSB8fCBkaWRfdGhyb3cKKyNlbmRpZgorCSAgICAgKQorI2lmZGVmIEZFQVRfRVZBTAorCQkmJiBjc3RhY2suY3NfdHJ5bGV2ZWwgPT0gMAorI2VuZGlmCisJICAgICkKKwkgICAgJiYgIShkaWRfZW1zZyAmJiB1c2VkX2dldGxpbmUKKwkJCSAgJiYgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRleG1vZGVsaW5lKQorCQkJCXx8IGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRleGxpbmUpKSkKKwkgICAgJiYgKG5leHRfY21kbGluZSAhPSBOVUxMCisjaWZkZWYgRkVBVF9FVkFMCisJCQl8fCBjc3RhY2suY3NfaWR4ID49IDAKKyNlbmRpZgorCQkJfHwgKGZsYWdzICYgRE9DTURfUkVQRUFUKSkpOworCisgICAgdmltX2ZyZWUoY21kbGluZV9jb3B5KTsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBmcmVlX2NtZGxpbmVzKCZsaW5lc19nYSk7CisgICAgZ2FfY2xlYXIoJmxpbmVzX2dhKTsKKworICAgIGlmIChjc3RhY2suY3NfaWR4ID49IDApCisgICAgeworCS8qCisJICogSWYgYSBzb3VyY2VkIGZpbGUgb3IgZXhlY3V0ZWQgZnVuY3Rpb24gcmFuIHRvIGl0cyBlbmQsIHJlcG9ydCB0aGUKKwkgKiB1bmNsb3NlZCBjb25kaXRpb25hbC4KKwkgKi8KKwlpZiAoIWdvdF9pbnQgJiYgIWRpZF90aHJvdworCQkmJiAoKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRzb3VyY2VsaW5lKQorCQkJJiYgIXNvdXJjZV9maW5pc2hlZChnZXRsaW5lLCBjb29raWUpKQorCQkgICAgfHwgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKQorCQkJCQkgICAgJiYgIWZ1bmNfaGFzX2VuZGVkKHJlYWxfY29va2llKSkpKQorCXsKKwkgICAgaWYgKGNzdGFjay5jc19mbGFnc1tjc3RhY2suY3NfaWR4XSAmIENTRl9UUlkpCisJCUVNU0coXyhlX2VuZHRyeSkpOworCSAgICBlbHNlIGlmIChjc3RhY2suY3NfZmxhZ3NbY3N0YWNrLmNzX2lkeF0gJiBDU0ZfV0hJTEUpCisJCUVNU0coXyhlX2VuZHdoaWxlKSk7CisJICAgIGVsc2UKKwkJRU1TRyhfKGVfZW5kaWYpKTsKKwl9CisKKwkvKgorCSAqIFJlc2V0ICJ0cnlsZXZlbCIgaW4gY2FzZSBvZiBhICI6ZmluaXNoIiBvciAiOnJldHVybiIgb3IgYSBtaXNzaW5nCisJICogIjplbmR0cnkiIGluIGEgc291cmNlZCBmaWxlIG9yIGV4ZWN1dGVkIGZ1bmN0aW9uLiAgSWYgdGhlIHRyeQorCSAqIGNvbmRpdGlvbmFsIGlzIGluIGl0cyBmaW5hbGx5IGNsYXVzZSwgaWdub3JlIGFueXRoaW5nIHBlbmRpbmcuCisJICogSWYgaXQgaXMgaW4gYSBjYXRjaCBjbGF1c2UsIGZpbmlzaCB0aGUgY2F1Z2h0IGV4Y2VwdGlvbi4KKwkgKi8KKwlkbworCSAgICBjc3RhY2suY3NfaWR4ID0gY2xlYW51cF9jb25kaXRpb25hbHMoJmNzdGFjaywgMCwgVFJVRSk7CisJd2hpbGUgKC0tY3N0YWNrLmNzX2lkeCA+PSAwKTsKKwl0cnlsZXZlbCA9IGluaXRpYWxfdHJ5bGV2ZWw7CisgICAgfQorCisgICAgLyogSWYgYSBtaXNzaW5nICI6ZW5kdHJ5IiwgIjplbmR3aGlsZSIsIG9yICI6ZW5kaWYiIG9yIGEgbWVtb3J5IGxhY2sKKyAgICAgKiB3YXMgcmVwb3J0ZWQgYWJvdmUgYW5kIHRoZSBlcnJvciBtZXNzYWdlIGlzIHRvIGJlIGNvbnZlcnRlZCB0byBhbgorICAgICAqIGV4Y2VwdGlvbiwgZG8gdGhpcyBub3cgYWZ0ZXIgcmV3aW5kaW5nIHRoZSBjc3RhY2suICovCisgICAgZG9fZXJydGhyb3coJmNzdGFjaywgZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldF9mdW5jX2xpbmUpCisJCQkJICA/IChjaGFyX3UgKikiZW5kZnVuY3Rpb24iIDogKGNoYXJfdSAqKU5VTEwpOworCisgICAgaWYgKHRyeWxldmVsID09IDApCisgICAgeworCS8qCisJICogV2hlbiBhbiBleGNlcHRpb24gaXMgYmVpbmcgdGhyb3duIG91dCBvZiB0aGUgb3V0ZXJtb3N0IHRyeQorCSAqIGNvbmRpdGlvbmFsLCBkaXNjYXJkIHRoZSB1bmNhdWdodCBleGNlcHRpb24sIGRpc2FibGUgdGhlIGNvbnZlcnNpb24KKwkgKiBvZiBpbnRlcnJ1cHRzIG9yIGVycm9ycyB0byBleGNlcHRpb25zLCBhbmQgZW5zdXJlIHRoYXQgbm8gbW9yZQorCSAqIGNvbW1hbmRzIGFyZSBleGVjdXRlZC4KKwkgKi8KKwlpZiAoZGlkX3Rocm93KQorCXsKKwkgICAgdm9pZAkqcCA9IE5VTEw7CisJICAgIGNoYXJfdQkqc2F2ZWRfc291cmNpbmdfbmFtZTsKKwkgICAgaW50CQlzYXZlZF9zb3VyY2luZ19sbnVtOworCSAgICBzdHJ1Y3QgbXNnbGlzdAkqbWVzc2FnZXMgPSBOVUxMLCAqbmV4dDsKKworCSAgICAvKgorCSAgICAgKiBJZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9uIGlzIGEgdXNlciBleGNlcHRpb24sIHJlcG9ydCBpdCBhcyBhbgorCSAgICAgKiBlcnJvci4gIElmIGl0IGlzIGFuIGVycm9yIGV4Y2VwdGlvbiwgZGlzcGxheSB0aGUgc2F2ZWQgZXJyb3IKKwkgICAgICogbWVzc2FnZSBub3cuICBGb3IgYW4gaW50ZXJydXB0IGV4Y2VwdGlvbiwgZG8gbm90aGluZzsgdGhlCisJICAgICAqIGludGVycnVwdCBtZXNzYWdlIGlzIGdpdmVuIGVsc2V3aGVyZS4KKwkgICAgICovCisJICAgIHN3aXRjaCAoY3VycmVudF9leGNlcHRpb24tPnR5cGUpCisJICAgIHsKKwkJY2FzZSBFVF9VU0VSOgorCQkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIiksCisJCQkgICAgY3VycmVudF9leGNlcHRpb24tPnZhbHVlKTsKKwkJICAgIHAgPSB2aW1fc3Ryc2F2ZShJT2J1ZmYpOworCQkgICAgYnJlYWs7CisJCWNhc2UgRVRfRVJST1I6CisJCSAgICBtZXNzYWdlcyA9IGN1cnJlbnRfZXhjZXB0aW9uLT5tZXNzYWdlczsKKwkJICAgIGN1cnJlbnRfZXhjZXB0aW9uLT5tZXNzYWdlcyA9IE5VTEw7CisJCSAgICBicmVhazsKKwkJY2FzZSBFVF9JTlRFUlJVUFQ6CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHAgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopXyhlX2ludGVybmFsKSk7CisJICAgIH0KKworCSAgICBzYXZlZF9zb3VyY2luZ19uYW1lID0gc291cmNpbmdfbmFtZTsKKwkgICAgc2F2ZWRfc291cmNpbmdfbG51bSA9IHNvdXJjaW5nX2xudW07CisJICAgIHNvdXJjaW5nX25hbWUgPSBjdXJyZW50X2V4Y2VwdGlvbi0+dGhyb3dfbmFtZTsKKwkgICAgc291cmNpbmdfbG51bSA9IGN1cnJlbnRfZXhjZXB0aW9uLT50aHJvd19sbnVtOworCSAgICBjdXJyZW50X2V4Y2VwdGlvbi0+dGhyb3dfbmFtZSA9IE5VTEw7CisKKwkgICAgZGlzY2FyZF9jdXJyZW50X2V4Y2VwdGlvbigpOwkvKiB1c2VzIElPYnVmZiBpZiAndmVyYm9zZScgKi8KKwkgICAgc3VwcHJlc3NfZXJydGhyb3cgPSBUUlVFOworCSAgICBmb3JjZV9hYm9ydCA9IFRSVUU7CisKKwkgICAgaWYgKG1lc3NhZ2VzICE9IE5VTEwpCisJICAgIHsKKwkJZG8KKwkJeworCQkgICAgbmV4dCA9IG1lc3NhZ2VzLT5uZXh0OworCQkgICAgZW1zZyhtZXNzYWdlcy0+bXNnKTsKKwkJICAgIHZpbV9mcmVlKG1lc3NhZ2VzLT5tc2cpOworCQkgICAgdmltX2ZyZWUobWVzc2FnZXMpOworCQkgICAgbWVzc2FnZXMgPSBuZXh0OworCQl9CisJCXdoaWxlIChtZXNzYWdlcyAhPSBOVUxMKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChwICE9IE5VTEwpCisJICAgIHsKKwkJZW1zZyhwKTsKKwkJdmltX2ZyZWUocCk7CisJICAgIH0KKwkgICAgdmltX2ZyZWUoc291cmNpbmdfbmFtZSk7CisJICAgIHNvdXJjaW5nX25hbWUgPSBzYXZlZF9zb3VyY2luZ19uYW1lOworCSAgICBzb3VyY2luZ19sbnVtID0gc2F2ZWRfc291cmNpbmdfbG51bTsKKwl9CisKKwkvKgorCSAqIE9uIGFuIGludGVycnVwdCBvciBhbiBhYm9ydGluZyBlcnJvciBub3QgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbiwKKwkgKiBkaXNhYmxlIHRoZSBjb252ZXJzaW9uIG9mIGVycm9ycyB0byBleGNlcHRpb25zLiAgKEludGVycnVwdHMgYXJlIG5vdAorCSAqIGNvbnZlcnRlZCBhbnkgbW9yZSwgaGVyZS4pIFRoaXMgZW5hYmxlcyBhbHNvIHRoZSBpbnRlcnJ1cHQgbWVzc2FnZQorCSAqIHdoZW4gZm9yY2VfYWJvcnQgaXMgc2V0IGFuZCBkaWRfZW1zZyB1bnNldCBpbiBjYXNlIG9mIGFuIGludGVycnVwdAorCSAqIGZyb20gYSBmaW5hbGx5IGNsYXVzZSBhZnRlciBhbiBlcnJvci4KKwkgKi8KKwllbHNlIGlmIChnb3RfaW50IHx8IChkaWRfZW1zZyAmJiBmb3JjZV9hYm9ydCkpCisJICAgIHN1cHByZXNzX2VycnRocm93ID0gVFJVRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBjdXJyZW50IGNzdGFjayB3aWxsIGJlIGZyZWVkIHdoZW4gZG9fY21kbGluZSgpIHJldHVybnMuICBBbiB1bmNhdWdodAorICAgICAqIGV4Y2VwdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV0aHJvd24gaW4gdGhlIHByZXZpb3VzIGNzdGFjay4gIElmIGEgZnVuY3Rpb24KKyAgICAgKiBoYXMganVzdCByZXR1cm5lZCBvciBhIHNjcmlwdCBmaWxlIHdhcyBqdXN0IGZpbmlzaGVkIGFuZCB0aGUgcHJldmlvdXMKKyAgICAgKiBjc3RhY2sgYmVsb25ncyB0byB0aGUgc2FtZSBmdW5jdGlvbiBvciwgcmVzcGVjdGl2ZWx5LCBzY3JpcHQgZmlsZSwgaXQKKyAgICAgKiB3aWxsIGhhdmUgdG8gYmUgY2hlY2tlZCBmb3IgZmluYWxseSBjbGF1c2VzIHRvIGJlIGV4ZWN1dGVkIGR1ZSB0byB0aGUKKyAgICAgKiAiOnJldHVybiIgb3IgIjpmaW5pc2giLiAgVGhpcyBpcyBkb25lIGluIGRvX29uZV9jbWQoKS4KKyAgICAgKi8KKyAgICBpZiAoZGlkX3Rocm93KQorCW5lZWRfcmV0aHJvdyA9IFRSVUU7CisgICAgaWYgKChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0c291cmNlbGluZSkKKwkJJiYgZXhfbmVzdGluZ19sZXZlbCA+IHNvdXJjZV9sZXZlbChyZWFsX2Nvb2tpZSkpCisJICAgIHx8IChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0X2Z1bmNfbGluZSkKKwkJJiYgZXhfbmVzdGluZ19sZXZlbCA+IGZ1bmNfbGV2ZWwocmVhbF9jb29raWUpICsgMSkpCisgICAgeworCWlmICghZGlkX3Rocm93KQorCSAgICBjaGVja19jc3RhY2sgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIFdoZW4gbGVhdmluZyBhIGZ1bmN0aW9uLCByZWR1Y2UgbmVzdGluZyBsZXZlbC4gKi8KKwlpZiAoZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldF9mdW5jX2xpbmUpKQorCSAgICAtLWV4X25lc3RpbmdfbGV2ZWw7CisJLyoKKwkgKiBHbyB0byBkZWJ1ZyBtb2RlIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbiBpbiB3aGljaCB3ZSBhcmUKKwkgKiBzaW5nbGUtc3RlcHBpbmcuCisJICovCisJaWYgKChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0c291cmNlbGluZSkKKwkJICAgIHx8IGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKSkKKwkJJiYgZXhfbmVzdGluZ19sZXZlbCArIDEgPD0gZGVidWdfYnJlYWtfbGV2ZWwpCisJICAgIGRvX2RlYnVnKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRzb3VyY2VsaW5lKQorCQkgICAgPyAoY2hhcl91ICopXygiRW5kIG9mIHNvdXJjZWQgZmlsZSIpCisJCSAgICA6IChjaGFyX3UgKilfKCJFbmQgb2YgZnVuY3Rpb24iKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIHRoZSBleGNlcHRpb24gZW52aXJvbm1lbnQgKGRvbmUgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlCisgICAgICogZGVidWdnZXIpLgorICAgICAqLworICAgIGlmIChmbGFncyAmIERPQ01EX0VYQ1JFU0VUKQorICAgIHsKKwlzdXBwcmVzc19lcnJ0aHJvdyA9IEZBTFNFOworCXRyeWxldmVsID0gc2F2ZWRfdHJ5bGV2ZWw7CisJZm9yY2VfYWJvcnQgPSBzYXZlZF9mb3JjZV9hYm9ydDsKKwljYXVnaHRfc3RhY2sgPSBzYXZlZF9jYXVnaHRfc3RhY2s7CisJKHZvaWQpdl9leGNlcHRpb24oc2F2ZWRfdnZfZXhjZXB0aW9uKTsKKwkodm9pZCl2X3Rocm93cG9pbnQoc2F2ZWRfdnZfdGhyb3dwb2ludCk7CisJLyogTmVjZXNzYXJ5IGZvciBkZWJ1Z2dpbmcgYW4gaW5hY3RpdmUgIjpjYXRjaCIsICI6ZmluYWxseSIsIG9yCisJICogIjplbmR0cnkiOiAqLworCWRpZF9lbXNnID0gc2F2ZWRfZGlkX2Vtc2c7CisJZ290X2ludCA9IHNhdmVkX2dvdF9pbnQ7CisJZGlkX3Rocm93ID0gc2F2ZWRfZGlkX3Rocm93OworCW5lZWRfcmV0aHJvdyA9IHNhdmVkX25lZWRfcmV0aHJvdzsKKwljaGVja19jc3RhY2sgPSBzYXZlZF9jaGVja19jc3RhY2s7CisJY3VycmVudF9leGNlcHRpb24gPSBzYXZlZF9jdXJyZW50X2V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBtc2dfbGlzdCA9IHNhdmVkX21zZ19saXN0OworI2VuZGlmIC8qIEZFQVRfRVZBTCAqLworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSB3YXMgdG9vIG11Y2ggb3V0cHV0IHRvIGZpdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhc2sgdGhlIHVzZXIgdG8KKyAgICAgKiBoaXQgcmV0dXJuIGJlZm9yZSByZWRyYXdpbmcgdGhlIHNjcmVlbi4gV2l0aCB0aGUgIjpnbG9iYWwiIGNvbW1hbmQgd2UgZG8KKyAgICAgKiB0aGlzIG9ubHkgb25jZSBhZnRlciB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBpZiAoZGlkX2luYykKKyAgICB7CisJLS1SZWRyYXdpbmdEaXNhYmxlZDsKKwktLW5vX3dhaXRfcmV0dXJuOworCW1zZ19zY3JvbGwgPSBGQUxTRTsKKworCS8qCisJICogV2hlbiBqdXN0IGZpbmlzaGVkIGFuICI6aWYiLSI6ZWxzZSIgd2hpY2ggd2FzIHR5cGVkLCBubyBuZWVkIHRvCisJICogd2FpdCBmb3IgaGl0LXJldHVybi4gIEFsc28gZm9yIGFuIGVycm9yIHNpdHVhdGlvbi4KKwkgKi8KKwlpZiAocmV0dmFsID09IEZBSUwKKyNpZmRlZiBGRUFUX0VWQUwKKwkJfHwgKGRpZF9lbmRpZiAmJiBLZXlUeXBlZCAmJiAhZGlkX2Vtc2cpCisjZW5kaWYKKwkJCQkJICAgICkKKwl7CisJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKwkgICAgbXNnX2RpZGFueSA9IEZBTFNFOwkJLyogZG9uJ3Qgd2FpdCB3aGVuIHJlc3RhcnRpbmcgZWRpdCAqLworCX0KKwllbHNlIGlmIChuZWVkX3dhaXRfcmV0dXJuKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhlIG1zZ19zdGFydCgpIGFib3ZlIGNsZWFycyBtc2dfZGlkb3V0LiBUaGUgd2FpdF9yZXR1cm4gd2UgZG8KKwkgICAgICogaGVyZSBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGUgY29tbWFuZCB0aGF0IG1heSBiZSBzaG93biBiZWZvcmUKKwkgICAgICogZG9pbmcgdGhhdC4KKwkgICAgICovCisJICAgIG1zZ19kaWRvdXQgfD0gbXNnX2RpZG91dF9iZWZvcmVfc3RhcnQ7CisJICAgIHdhaXRfcmV0dXJuKEZBTFNFKTsKKwl9CisgICAgfQorCisjaWZuZGVmIEZFQVRfRVZBTAorICAgIC8qCisgICAgICogUmVzZXQgaWZfbGV2ZWwsIGluIGNhc2UgYSBzb3VyY2VkIHNjcmlwdCBmaWxlIGNvbnRhaW5zIG1vcmUgIjppZiIgdGhhbgorICAgICAqICI6ZW5kaWYiIChjb3VsZCBiZSAiOmlmIHggfCBmb28gfCBlbmRpZiIpLgorICAgICAqLworICAgIGlmX2xldmVsID0gMDsKKyNlbmRpZgorCisgICAgLS1jYWxsX2RlcHRoOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBGRUFUX0VWQUwKKy8qCisgKiBPYnRhaW4gYSBsaW5lIHdoZW4gaW5zaWRlIGEgIjp3aGlsZSIgbG9vcC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X3doaWxlX2xpbmUoYywgY29va2llLCBpbmRlbnQpCisgICAgaW50CQljOworICAgIHZvaWQJKmNvb2tpZTsKKyAgICBpbnQJCWluZGVudDsKK3sKKyAgICBzdHJ1Y3Qgd2hpbGVfY29va2llICpjcCA9IChzdHJ1Y3Qgd2hpbGVfY29va2llICopY29va2llOworICAgIHdjbWRfVAkJKndwOworICAgIGNoYXJfdQkJKmxpbmU7CisKKyAgICBpZiAoY3AtPmN1cnJlbnRfbGluZSArIDEgPj0gY3AtPmxpbmVzX2dhcC0+Z2FfbGVuKQorICAgIHsKKwlpZiAoY3AtPnJlcGVhdGluZykKKwkgICAgcmV0dXJuIE5VTEw7CS8qIHRyeWluZyB0byByZWFkIHBhc3QgdGhlICI6ZW5kd2hpbGUiICovCisKKwkvKiBGaXJzdCB0aW1lIGluc2lkZSB0aGUgIjp3aGlsZSI6IGdldCBsaW5lIG5vcm1hbGx5LiAqLworCWlmIChjcC0+Z2V0bGluZSA9PSBOVUxMKQorCSAgICBsaW5lID0gZ2V0Y21kbGluZShjLCAwTCwgaW5kZW50KTsKKwllbHNlCisJICAgIGxpbmUgPSBjcC0+Z2V0bGluZShjLCBjcC0+Y29va2llLCBpbmRlbnQpOworCWlmIChzdG9yZV93aGlsZV9saW5lKGNwLT5saW5lc19nYXAsIGxpbmUpID09IE9LKQorCSAgICArK2NwLT5jdXJyZW50X2xpbmU7CisKKwlyZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBLZXlUeXBlZCA9IEZBTFNFOworICAgICsrY3AtPmN1cnJlbnRfbGluZTsKKyAgICB3cCA9ICh3Y21kX1QgKikoY3AtPmxpbmVzX2dhcC0+Z2FfZGF0YSkgKyBjcC0+Y3VycmVudF9saW5lOworICAgIHNvdXJjaW5nX2xudW0gPSB3cC0+bG51bTsKKyAgICByZXR1cm4gdmltX3N0cnNhdmUod3AtPmxpbmUpOworfQorCisvKgorICogU3RvcmUgYSBsaW5lIGluICJnYXAiIHNvIHRoYXQgYSAiOndoaWxlIiBsb29wIGNhbiBleGVjdXRlIGl0IGFnYWluLgorICovCisgICAgc3RhdGljIGludAorc3RvcmVfd2hpbGVfbGluZShnYXAsIGxpbmUpCisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBjaGFyX3UJKmxpbmU7Cit7CisgICAgaWYgKGdhX2dyb3coZ2FwLCAxKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworICAgICgod2NtZF9UICopKGdhcC0+Z2FfZGF0YSkpW2dhcC0+Z2FfbGVuXS5saW5lID0gdmltX3N0cnNhdmUobGluZSk7CisgICAgKCh3Y21kX1QgKikoZ2FwLT5nYV9kYXRhKSlbZ2FwLT5nYV9sZW5dLmxudW0gPSBzb3VyY2luZ19sbnVtOworICAgICsrZ2FwLT5nYV9sZW47CisgICAgLS1nYXAtPmdhX3Jvb207CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogRnJlZSB0aGUgbGluZXMgc3RvcmVkIGZvciBhICI6d2hpbGUiIGxvb3AuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJlZV9jbWRsaW5lcyhnYXApCisgICAgZ2FycmF5X1QJKmdhcDsKK3sKKyAgICB3aGlsZSAoZ2FwLT5nYV9sZW4gPiAwKQorICAgIHsKKwl2aW1fZnJlZSgoKHdjbWRfVCAqKShnYXAtPmdhX2RhdGEpKVtnYXAtPmdhX2xlbiAtIDFdLmxpbmUpOworCS0tZ2FwLT5nYV9sZW47CisJKytnYXAtPmdhX3Jvb207CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBJZiAiZ2V0bGluZSIgaXMgZ2V0X3doaWxlX2xpbmUoKSwgcmV0dXJuIFRSVUUgaWYgdGhlIGdldGxpbmUgaXQgdXNlcyBlcXVhbHMKKyAqICJmdW5jIi4gICogT3RoZXJ3aXNlIHJldHVybiBUUlVFIHdoZW4gImdldGxpbmUiIGVxdWFscyAiZnVuYyIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGludAorZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGZ1bmMpCisgICAgY2hhcl91CSooKmdldGxpbmUpIF9fQVJHUygoaW50LCB2b2lkICosIGludCkpOworICAgIHZvaWQJKmNvb2tpZTsJCS8qIGFyZ3VtZW50IGZvciBnZXRsaW5lKCkgKi8KKyAgICBjaGFyX3UJKigqZnVuYykgX19BUkdTKChpbnQsIHZvaWQgKiwgaW50KSk7Cit7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgY2hhcl91CQkqKCpncCkgX19BUkdTKChpbnQsIHZvaWQgKiwgaW50KSk7CisgICAgc3RydWN0IHdoaWxlX2Nvb2tpZSAqY3A7CisKKyAgICAvKiBXaGVuICJnZXRsaW5lIiBpcyAiZ2V0X3doaWxlX2xpbmUoKSIgdXNlIHRoZSAiY29va2llIiB0byBmaW5kIHRoZQorICAgICAqIGZ1bmN0aW9uIHRoYXQncyBvcmlnbmFsbHkgdXNlZCB0byBvYnRhaW4gdGhlIGxpbmVzLiAgVGhpcyBtYXkgYmUgbmVzdGVkCisgICAgICogc2V2ZXJhbCBsZXZlbHMuICovCisgICAgZ3AgPSBnZXRsaW5lOworICAgIGNwID0gKHN0cnVjdCB3aGlsZV9jb29raWUgKiljb29raWU7CisgICAgd2hpbGUgKGdwID09IGdldF93aGlsZV9saW5lKQorICAgIHsKKwlncCA9IGNwLT5nZXRsaW5lOworCWNwID0gY3AtPmNvb2tpZTsKKyAgICB9CisgICAgcmV0dXJuIGdwID09IGZ1bmM7CisjZWxzZQorICAgIHJldHVybiBnZXRsaW5lID09IGZ1bmM7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogSWYgImdldGxpbmUiIGlzIGdldF93aGlsZV9saW5lKCksIHJldHVybiB0aGUgY29va2llIHVzZWQgYnkgdGhlIG9yaWdpbmFsCisgKiBnZXRsaW5lIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIHJldHVybiAiY29va2llIi4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZCAqCitnZXRsaW5lX2Nvb2tpZShnZXRsaW5lLCBjb29raWUpCisgICAgY2hhcl91CSooKmdldGxpbmUpIF9fQVJHUygoaW50LCB2b2lkICosIGludCkpOworICAgIHZvaWQJKmNvb2tpZTsJCS8qIGFyZ3VtZW50IGZvciBnZXRsaW5lKCkgKi8KK3sKKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgY2hhcl91CQkqKCpncCkgX19BUkdTKChpbnQsIHZvaWQgKiwgaW50KSk7CisgICAgc3RydWN0IHdoaWxlX2Nvb2tpZSAqY3A7CisKKyAgICAvKiBXaGVuICJnZXRsaW5lIiBpcyAiZ2V0X3doaWxlX2xpbmUoKSIgdXNlIHRoZSAiY29va2llIiB0byBmaW5kIHRoZQorICAgICAqIGNvb2tpZSB0aGF0J3Mgb3JpZ25hbGx5IHVzZWQgdG8gb2J0YWluIHRoZSBsaW5lcy4gIFRoaXMgbWF5IGJlIG5lc3RlZAorICAgICAqIHNldmVyYWwgbGV2ZWxzLiAqLworICAgIGdwID0gZ2V0bGluZTsKKyAgICBjcCA9IChzdHJ1Y3Qgd2hpbGVfY29va2llICopY29va2llOworICAgIHdoaWxlIChncCA9PSBnZXRfd2hpbGVfbGluZSkKKyAgICB7CisJZ3AgPSBjcC0+Z2V0bGluZTsKKwljcCA9IGNwLT5jb29raWU7CisgICAgfQorICAgIHJldHVybiBjcDsKKyMgZWxzZQorICAgIHJldHVybiBjb29raWU7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIEV4ZWN1dGUgb25lIEV4IGNvbW1hbmQuCisgKgorICogSWYgJ3NvdXJjaW5nJyBpcyBUUlVFLCB0aGUgY29tbWFuZCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBlcnJvciBtZXNzYWdlLgorICoKKyAqIDEuIHNraXAgY29tbWVudCBsaW5lcyBhbmQgbGVhZGluZyBzcGFjZQorICogMi4gaGFuZGxlIGNvbW1hbmQgbW9kaWZpZXJzCisgKiAzLiBwYXJzZSByYW5nZQorICogNC4gcGFyc2UgY29tbWFuZAorICogNS4gcGFyc2UgYXJndW1lbnRzCisgKiA2LiBzd2l0Y2ggb24gY29tbWFuZCBuYW1lCisgKgorICogTm90ZTogImdldGxpbmUiIGNhbiBiZSBOVUxMLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCByZWN1cnNpdmVseSEKKyAqLworI2lmIChfTVNDX1ZFUiA9PSAxMjAwKQorLyoKKyAqIE9wdGltaXNhdGlvbiBidWcgaW4gVkMrKyB2ZXJzaW9uIDYuMAorICogVE9ETzogY2hlY2sgdGhpcyBpcyBzdGlsbCBwcmVzZW50IGFmdGVyIGVhY2ggc2VydmljZSBwYWNrCisgKi8KKyMgcHJhZ21hIG9wdGltaXplKCAiZyIsIG9mZiApCisjZW5kaWYKKyAgICBzdGF0aWMgY2hhcl91ICoKK2RvX29uZV9jbWQoY21kbGluZXAsIHNvdXJjaW5nLAorI2lmZGVmIEZFQVRfRVZBTAorCQkJICAgIGNzdGFjaywKKyNlbmRpZgorCQkJCSAgICBnZXRsaW5lLCBjb29raWUpCisgICAgY2hhcl91CQkqKmNtZGxpbmVwOworICAgIGludAkJCXNvdXJjaW5nOworI2lmZGVmIEZFQVRfRVZBTAorICAgIHN0cnVjdCBjb25kc3RhY2sJKmNzdGFjazsKKyNlbmRpZgorICAgIGNoYXJfdQkJKigqZ2V0bGluZSkgX19BUkdTKChpbnQsIHZvaWQgKiwgaW50KSk7CisgICAgdm9pZAkJKmNvb2tpZTsJCS8qIGFyZ3VtZW50IGZvciBnZXRsaW5lKCkgKi8KK3sKKyAgICBjaGFyX3UJCSpwOworICAgIGxpbmVucl9UCQlsbnVtOworICAgIGxvbmcJCW47CisgICAgY2hhcl91CQkqZXJyb3Jtc2cgPSBOVUxMOwkvKiBlcnJvciBtZXNzYWdlICovCisgICAgZXhhcmdfVAkJZWE7CQkJLyogRXggY29tbWFuZCBhcmd1bWVudHMgKi8KKyAgICBsb25nCQl2ZXJib3NlX3NhdmUgPSAtMTsKKyAgICBpbnQJCQlzYXZlX21zZ19zY3JvbGwgPSAwOworICAgIGludAkJCWRpZF9zaWxlbnQgPSAwOworICAgIGludAkJCWRpZF9lc2lsZW50ID0gMDsKKyAgICBjbWRtb2RfVAkJc2F2ZV9jbWRtb2Q7CisgICAgaW50CQkJbmk7CQkJLyogc2V0IHdoZW4gTm90IEltcGxlbWVudGVkICovCisKKyAgICB2aW1fbWVtc2V0KCZlYSwgMCwgc2l6ZW9mKGVhKSk7CisgICAgZWEubGluZTEgPSAxOworICAgIGVhLmxpbmUyID0gMTsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICArK2V4X25lc3RpbmdfbGV2ZWw7CisjZW5kaWYKKworCS8qIHdoZW4gbm90IGVkaXRpbmcgdGhlIGxhc3QgZmlsZSA6cSBoYXMgdG8gYmUgdHlwZWQgdHdpY2UgKi8KKyAgICBpZiAocXVpdG1vcmUKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgLyogYXZvaWQgdGhhdCBhIGZ1bmN0aW9uIGNhbGwgaW4gJ3N0YXR1c2xpbmUnIGRvZXMgdGhpcyAqLworCSAgICAmJiAhZ2V0bGluZV9lcXVhbChnZXRsaW5lLCBjb29raWUsIGdldF9mdW5jX2xpbmUpCisjZW5kaWYKKwkgICAgKQorCS0tcXVpdG1vcmU7CisKKyAgICAvKgorICAgICAqIFJlc2V0IGJyb3dzZSwgY29uZmlybSwgZXRjLi4gIFRoZXkgYXJlIHJlc3RvcmVkIHdoZW4gcmV0dXJuaW5nLCBmb3IKKyAgICAgKiByZWN1cnNpdmUgY2FsbHMuCisgICAgICovCisgICAgc2F2ZV9jbWRtb2QgPSBjbWRtb2Q7CisgICAgdmltX21lbXNldCgmY21kbW9kLCAwLCBzaXplb2YoY21kbW9kKSk7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCB1bnRpbCBubyBtb3JlIGNvbW1hbmQgbW9kaWZpZXJzIGFyZSBmb3VuZC4KKyAgICAgKi8KKyAgICBlYS5jbWQgPSAqY21kbGluZXA7CisgICAgZm9yICg7OykKKyAgICB7CisvKgorICogMS4gc2tpcCBjb21tZW50IGxpbmVzIGFuZCBsZWFkaW5nIHdoaXRlIHNwYWNlIGFuZCBjb2xvbnMKKyAqLworCXdoaWxlICgqZWEuY21kID09ICcgJyB8fCAqZWEuY21kID09ICdcdCcgfHwgKmVhLmNtZCA9PSAnOicpCisJICAgICsrZWEuY21kOworCisJLyogaW4gZXggbW9kZSwgYW4gZW1wdHkgbGluZSB3b3JrcyBsaWtlIDorICovCisJaWYgKCplYS5jbWQgPT0gTlVMICYmIGV4bW9kZV9hY3RpdmUKKwkJCSYmIChnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0ZXhtb2RlbGluZSkKKwkJCSAgICB8fCBnZXRsaW5lX2VxdWFsKGdldGxpbmUsIGNvb2tpZSwgZ2V0ZXhsaW5lKSkpCisJeworCSAgICBlYS5jbWQgPSAoY2hhcl91ICopIisiOworCSAgICBleF9wcmVzc2VkcmV0dXJuID0gVFJVRTsKKwl9CisKKwkvKiBpZ25vcmUgY29tbWVudCBhbmQgZW1wdHkgbGluZXMgKi8KKwlpZiAoKmVhLmNtZCA9PSAnIicgfHwgKmVhLmNtZCA9PSBOVUwpCisJICAgIGdvdG8gZG9lbmQ7CisKKy8qCisgKiAyLiBoYW5kbGUgY29tbWFuZCBtb2RpZmllcnMuCisgKi8KKwlwID0gZWEuY21kOworCWlmIChWSU1fSVNESUdJVCgqZWEuY21kKSkKKwkgICAgcCA9IHNraXB3aGl0ZShza2lwZGlnaXRzKGVhLmNtZCkpOworCXN3aXRjaCAoKnApCisJeworCSAgICAvKiBXaGVuIGFkZGluZyBhbiBlbnRyeSwgYWxzbyBtb2RpZnkgY21kX2V4aXN0cygpLiAqLworCSAgICBjYXNlICdhJzoJaWYgKCFjaGVja2ZvcmNtZCgmZWEuY21kLCAiYWJvdmVsZWZ0IiwgMykpCisJCQkgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCQljbWRtb2Quc3BsaXQgfD0gV1NQX0FCT1ZFOworI2VuZGlmCisJCQljb250aW51ZTsKKworCSAgICBjYXNlICdiJzoJaWYgKGNoZWNrZm9yY21kKCZlYS5jbWQsICJiZWxvd3JpZ2h0IiwgMykpCisJCQl7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCQkgICAgY21kbW9kLnNwbGl0IHw9IFdTUF9CRUxPVzsKKyNlbmRpZgorCQkJICAgIGNvbnRpbnVlOworCQkJfQorCQkJaWYgKGNoZWNrZm9yY21kKCZlYS5jbWQsICJicm93c2UiLCAzKSkKKwkJCXsKKyNpZmRlZiBGRUFUX0JST1dTRQorCQkJICAgIGNtZG1vZC5icm93c2UgPSBUUlVFOworI2VuZGlmCisJCQkgICAgY29udGludWU7CisJCQl9CisJCQlpZiAoIWNoZWNrZm9yY21kKCZlYS5jbWQsICJib3RyaWdodCIsIDIpKQorCQkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfV0lORE9XUworCQkJY21kbW9kLnNwbGl0IHw9IFdTUF9CT1Q7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCisJICAgIGNhc2UgJ2MnOglpZiAoIWNoZWNrZm9yY21kKCZlYS5jbWQsICJjb25maXJtIiwgNCkpCisJCQkgICAgYnJlYWs7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCQkJY21kbW9kLmNvbmZpcm0gPSBUUlVFOworI2VuZGlmCisJCQljb250aW51ZTsKKworCSAgICBjYXNlICdrJzoJaWYgKGNoZWNrZm9yY21kKCZlYS5jbWQsICJrZWVwbWFya3MiLCAzKSkKKwkJCXsKKwkJCSAgICBjbWRtb2Qua2VlcG1hcmtzID0gVFJVRTsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJCWlmICghY2hlY2tmb3JjbWQoJmVhLmNtZCwgImtlZXBqdW1wcyIsIDUpKQorCQkJICAgIGJyZWFrOworCQkJY21kbW9kLmtlZXBqdW1wcyA9IFRSVUU7CisJCQljb250aW51ZTsKKworCQkJLyogIjpoaWRlIiBhbmQgIjpoaWRlIHwgY21kIiBhcmUgbm90IG1vZGlmaWVycyAqLworCSAgICBjYXNlICdoJzoJaWYgKHAgIT0gZWEuY21kIHx8ICFjaGVja2ZvcmNtZCgmcCwgImhpZGUiLCAzKQorCQkJCQkgICAgICAgfHwgKnAgPT0gTlVMIHx8IGVuZHNfZXhjbWQoKnApKQorCQkJICAgIGJyZWFrOworCQkJZWEuY21kID0gcDsKKwkJCWNtZG1vZC5oaWRlID0gVFJVRTsKKwkJCWNvbnRpbnVlOworCisJICAgIGNhc2UgJ2wnOglpZiAoY2hlY2tmb3JjbWQoJmVhLmNtZCwgImxvY2ttYXJrcyIsIDMpKQorCQkJeworCQkJICAgIGNtZG1vZC5sb2NrbWFya3MgPSBUUlVFOworCQkJICAgIGNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWNoZWNrZm9yY21kKCZlYS5jbWQsICJsZWZ0YWJvdmUiLCA1KSkKKwkJCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCWNtZG1vZC5zcGxpdCB8PSBXU1BfQUJPVkU7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCisJICAgIGNhc2UgJ3InOglpZiAoIWNoZWNrZm9yY21kKCZlYS5jbWQsICJyaWdodGJlbG93IiwgNikpCisJCQkgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCQljbWRtb2Quc3BsaXQgfD0gV1NQX0JFTE9XOworI2VuZGlmCisJCQljb250aW51ZTsKKworCSAgICBjYXNlICdzJzoJaWYgKCFjaGVja2ZvcmNtZCgmZWEuY21kLCAic2lsZW50IiwgMykpCisJCQkgICAgYnJlYWs7CisJCQkrK2RpZF9zaWxlbnQ7CisJCQkrK21zZ19zaWxlbnQ7CisJCQlzYXZlX21zZ19zY3JvbGwgPSBtc2dfc2Nyb2xsOworCQkJaWYgKCplYS5jbWQgPT0gJyEnICYmICF2aW1faXN3aGl0ZShlYS5jbWRbLTFdKSkKKwkJCXsKKwkJCSAgICAvKiAiOnNpbGVudCEiLCBidXQgbm90ICJzaWxlbnQgIWNtZCIgKi8KKwkJCSAgICBlYS5jbWQgPSBza2lwd2hpdGUoZWEuY21kICsgMSk7CisJCQkgICAgKytlbXNnX3NpbGVudDsKKwkJCSAgICArK2RpZF9lc2lsZW50OworCQkJfQorCQkJY29udGludWU7CisKKwkgICAgY2FzZSAndCc6CWlmICghY2hlY2tmb3JjbWQoJmVhLmNtZCwgInRvcGxlZnQiLCAyKSkKKwkJCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCWNtZG1vZC5zcGxpdCB8PSBXU1BfVE9QOworI2VuZGlmCisJCQljb250aW51ZTsKKworCSAgICBjYXNlICd2JzoJaWYgKGNoZWNrZm9yY21kKCZlYS5jbWQsICJ2ZXJ0aWNhbCIsIDQpKQorCQkJeworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCQkgICAgY21kbW9kLnNwbGl0IHw9IFdTUF9WRVJUOworI2VuZGlmCisJCQkgICAgY29udGludWU7CisJCQl9CisJCQlpZiAoIWNoZWNrZm9yY21kKCZwLCAidmVyYm9zZSIsIDQpKQorCQkJICAgIGJyZWFrOworCQkJaWYgKHZlcmJvc2Vfc2F2ZSA8IDApCisJCQkgICAgdmVyYm9zZV9zYXZlID0gcF92ZXJib3NlOworCQkJcF92ZXJib3NlID0gYXRvaSgoY2hhciAqKWVhLmNtZCk7CisJCQlpZiAocF92ZXJib3NlID09IDApCisJCQkgICAgcF92ZXJib3NlID0gMTsKKwkJCWVhLmNtZCA9IHA7CisJCQljb250aW51ZTsKKwl9CisJYnJlYWs7CisgICAgfQorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgZWEuc2tpcCA9IGRpZF9lbXNnIHx8IGdvdF9pbnQgfHwgZGlkX3Rocm93IHx8IChjc3RhY2stPmNzX2lkeCA+PSAwCisJCQkgJiYgIShjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9BQ1RJVkUpKTsKKyNlbHNlCisgICAgZWEuc2tpcCA9IChpZl9sZXZlbCA+IDApOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICAvKiBNYXkgZ28gdG8gZGVidWcgbW9kZS4gIElmIHRoaXMgaGFwcGVucyBhbmQgdGhlICI+cXVpdCIgZGVidWcgY29tbWFuZCBpcworICAgICAqIHVzZWQsIHRocm93IGFuIGludGVycnVwdCBleGNlcHRpb24gYW5kIHNraXAgdGhlIG5leHQgY29tbWFuZC4gKi8KKyAgICBkYmdfY2hlY2tfYnJlYWtwb2ludCgmZWEpOworICAgIGlmICghZWEuc2tpcCAmJiBnb3RfaW50KQorICAgIHsKKwllYS5za2lwID0gVFJVRTsKKwkodm9pZClkb19pbnR0aHJvdyhjc3RhY2spOworICAgIH0KKyNlbmRpZgorCisvKgorICogMy4gcGFyc2UgYSByYW5nZSBzcGVjaWZpZXIgb2YgdGhlIGZvcm06IGFkZHIgWyxhZGRyXSBbO2FkZHJdIC4uCisgKgorICogd2hlcmUgJ2FkZHInIGlzOgorICoKKyAqICUJICAgICAgKGVudGlyZSBmaWxlKQorICogJCAgWystTlVNXQorICogJ3ggWystTlVNXSAod2hlcmUgeCBkZW5vdGVzIGEgY3VycmVudGx5IGRlZmluZWQgbWFyaykKKyAqIC4gIFsrLU5VTV0KKyAqIFsrLU5VTV0uLgorICogTlVNCisgKgorICogVGhlIGVhLmNtZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlCisgKiByYW5nZSBzcGVjLiBJZiBhbiBpbml0aWFsIGFkZHJlc3MgaXMgZm91bmQsIGJ1dCBubyBzZWNvbmQsIHRoZSB1cHBlciBib3VuZAorICogaXMgZXF1YWwgdG8gdGhlIGxvd2VyLgorICovCisKKyAgICAvKiByZXBlYXQgZm9yIGFsbCAnLCcgb3IgJzsnIHNlcGFyYXRlZCBhZGRyZXNzZXMgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwllYS5saW5lMSA9IGVhLmxpbmUyOworCWVhLmxpbmUyID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOyAgIC8qIGRlZmF1bHQgaXMgY3VycmVudCBsaW5lIG51bWJlciAqLworCWVhLmNtZCA9IHNraXB3aGl0ZShlYS5jbWQpOworCWxudW0gPSBnZXRfYWRkcmVzcygmZWEuY21kLCBlYS5za2lwLCBlYS5hZGRyX2NvdW50ID09IDApOworCWlmIChlYS5jbWQgPT0gTlVMTCkJCSAgICAvKiBlcnJvciBkZXRlY3RlZCAqLworCSAgICBnb3RvIGRvZW5kOworCWlmIChsbnVtID09IE1BWExOVU0pCisJeworCSAgICBpZiAoKmVhLmNtZCA9PSAnJScpCQkgICAgLyogJyUnIC0gYWxsIGxpbmVzICovCisJICAgIHsKKwkJKytlYS5jbWQ7CisJCWVhLmxpbmUxID0gMTsKKwkJZWEubGluZTIgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkJKytlYS5hZGRyX2NvdW50OworCSAgICB9CisJCQkJCSAgICAvKiAnKicgLSB2aXN1YWwgYXJlYSAqLworCSAgICBlbHNlIGlmICgqZWEuY21kID09ICcqJyAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1RBUikgPT0gTlVMTCkKKwkgICAgeworCQlwb3NfVAkgICAgKmZwOworCisJCSsrZWEuY21kOworCQlpZiAoIWVhLnNraXApCisJCXsKKwkJICAgIGZwID0gZ2V0bWFyaygnPCcsIEZBTFNFKTsKKwkJICAgIGlmIChjaGVja19tYXJrKGZwKSA9PSBGQUlMKQorCQkJZ290byBkb2VuZDsKKwkJICAgIGVhLmxpbmUxID0gZnAtPmxudW07CisJCSAgICBmcCA9IGdldG1hcmsoJz4nLCBGQUxTRSk7CisJCSAgICBpZiAoY2hlY2tfbWFyayhmcCkgPT0gRkFJTCkKKwkJCWdvdG8gZG9lbmQ7CisJCSAgICBlYS5saW5lMiA9IGZwLT5sbnVtOworCQkgICAgKytlYS5hZGRyX2NvdW50OworCQl9CisJICAgIH0KKwl9CisJZWxzZQorCSAgICBlYS5saW5lMiA9IGxudW07CisJZWEuYWRkcl9jb3VudCsrOworCisJaWYgKCplYS5jbWQgPT0gJzsnKQorCXsKKwkgICAgaWYgKCFlYS5za2lwKQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlYS5saW5lMjsKKwl9CisJZWxzZSBpZiAoKmVhLmNtZCAhPSAnLCcpCisJICAgIGJyZWFrOworCSsrZWEuY21kOworICAgIH0KKworICAgIC8qIE9uZSBhZGRyZXNzIGdpdmVuOiBzZXQgc3RhcnQgYW5kIGVuZCBsaW5lcyAqLworICAgIGlmIChlYS5hZGRyX2NvdW50ID09IDEpCisgICAgeworCWVhLmxpbmUxID0gZWEubGluZTI7CisJICAgIC8qIC4uLiBidXQgb25seSBpbXBsaWNpdDogcmVhbGx5IG5vIGFkZHJlc3MgZ2l2ZW4gKi8KKwlpZiAobG51bSA9PSBNQVhMTlVNKQorCSAgICBlYS5hZGRyX2NvdW50ID0gMDsKKyAgICB9CisKKyAgICAvKiBEb24ndCBsZWF2ZSB0aGUgY3Vyc29yIG9uIGFuIGlsbGVnYWwgbGluZSAoY2F1c2VkIGJ5ICc7JykgKi8KKyAgICBjaGVja19jdXJzb3JfbG51bSgpOworCisvKgorICogNC4gcGFyc2UgY29tbWFuZAorICovCisKKyAgICAvKgorICAgICAqIFNraXAgJzonIGFuZCBhbnkgd2hpdGUgc3BhY2UKKyAgICAgKi8KKyAgICBlYS5jbWQgPSBza2lwd2hpdGUoZWEuY21kKTsKKyAgICB3aGlsZSAoKmVhLmNtZCA9PSAnOicpCisJZWEuY21kID0gc2tpcHdoaXRlKGVhLmNtZCArIDEpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBnb3QgYSBsaW5lLCBidXQgbm8gY29tbWFuZCwgdGhlbiBnbyB0byB0aGUgbGluZS4KKyAgICAgKiBJZiB3ZSBmaW5kIGEgJ3wnIG9yICdcbicgd2Ugc2V0IGVhLm5leHRjbWQuCisgICAgICovCisgICAgaWYgKCplYS5jbWQgPT0gTlVMIHx8ICplYS5jbWQgPT0gJyInIHx8CisJCQkgICAgICAgKGVhLm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGVhLmNtZCkpICE9IE5VTEwpCisgICAgeworCS8qCisJICogc3RyYW5nZSB2aSBiZWhhdmlvdXI6CisJICogIjozIgkJanVtcHMgdG8gbGluZSAzCisJICogIjozfC4uLiIJcHJpbnRzIGxpbmUgMworCSAqICI6fCIJCXByaW50cyBjdXJyZW50IGxpbmUKKwkgKi8KKwlpZiAoZWEuc2tpcCkJICAgIC8qIHNraXAgdGhpcyBpZiBpbnNpZGUgOmlmICovCisJICAgIGdvdG8gZG9lbmQ7CisJaWYgKCplYS5jbWQgPT0gJ3wnKQorCXsKKwkgICAgZWEuY21kaWR4ID0gQ01EX3ByaW50OworCSAgICBlYS5hcmd0ID0gUkFOR0UrQ09VTlQrVFJMQkFSOworCSAgICBpZiAoKGVycm9ybXNnID0gaW52YWxpZF9yYW5nZSgmZWEpKSA9PSBOVUxMKQorCSAgICB7CisJCWNvcnJlY3RfcmFuZ2UoJmVhKTsKKwkJZXhfcHJpbnQoJmVhKTsKKwkgICAgfQorCX0KKwllbHNlIGlmIChlYS5hZGRyX2NvdW50ICE9IDApCisJeworCSAgICBpZiAoZWEubGluZTIgPCAwKQorCQllcnJvcm1zZyA9IGludmFsaWRfcmFuZ2UoJmVhKTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChlYS5saW5lMiA9PSAwKQorCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gMTsKKwkJZWxzZSBpZiAoZWEubGluZTIgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCQllbHNlCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlYS5saW5lMjsKKwkJYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7CisJICAgIH0KKwl9CisJZ290byBkb2VuZDsKKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBjb21tYW5kIGFuZCBsZXQgInAiIHBvaW50IHRvIGFmdGVyIGl0LiAqLworICAgIHAgPSBmaW5kX2NvbW1hbmQoJmVhLCBOVUxMKTsKKworI2lmZGVmIEZFQVRfVVNSX0NNRFMKKyAgICBpZiAocCA9PSBOVUxMKQorICAgIHsKKwlpZiAoIWVhLnNraXApCisJICAgIGVycm9ybXNnID0gKGNoYXJfdSAqKV8oIkU0NjQ6IEFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiKTsKKwlnb3RvIGRvZW5kOworICAgIH0KKyAgICAvKiBDaGVjayBmb3Igd3JvbmcgY29tbWFuZHMuICovCisgICAgaWYgKCpwID09ICchJyAmJiBlYS5jbWRbMV0gPT0gMDE1MSAmJiBlYS5jbWRbMF0gPT0gNzgpCisgICAgeworCWVycm9ybXNnID0gdWNfZnVuX2NtZCgpOworCWdvdG8gZG9lbmQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfU0laRSkKKyAgICB7CisJaWYgKCFlYS5za2lwKQorCXsKKwkgICAgU1RSQ1BZKElPYnVmZiwgXygiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIikpOworCSAgICBpZiAoIXNvdXJjaW5nKQorCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsICI6ICIpOworCQlTVFJOQ0FUKElPYnVmZiwgKmNtZGxpbmVwLCA0MCk7CisJICAgIH0KKwkgICAgZXJyb3Jtc2cgPSBJT2J1ZmY7CisJfQorCWdvdG8gZG9lbmQ7CisgICAgfQorCisgICAgbmkgPSAoCisjaWZkZWYgRkVBVF9VU1JfQ01EUworCSAgICAhVVNFUl9DTURJRFgoZWEuY21kaWR4KSAmJgorI2VuZGlmCisJICAgIGNtZG5hbWVzW2VhLmNtZGlkeF0uY21kX2Z1bmMgPT0gZXhfbmkpOworCisjaWZuZGVmIEZFQVRfRVZBTAorICAgIC8qCisgICAgICogV2hlbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGlzIGRpc2FibGVkLCByZWNvZ25pemUgdGhlICI6aWYiIGFuZAorICAgICAqICI6ZW5kaWYiIGNvbW1hbmRzIGFuZCBpZ25vcmUgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIGl0LgorICAgICAqLworICAgIGlmIChlYS5jbWRpZHggPT0gQ01EX2lmKQorCSsraWZfbGV2ZWw7CisgICAgaWYgKGlmX2xldmVsKQorICAgIHsKKwlpZiAoZWEuY21kaWR4ID09IENNRF9lbmRpZikKKwkgICAgLS1pZl9sZXZlbDsKKwlnb3RvIGRvZW5kOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiAoKnAgPT0gJyEnICYmIGVhLmNtZGlkeCAhPSBDTURfc3Vic3RpdHV0ZSkgICAgLyogZm9yY2VkIGNvbW1hbmRzICovCisgICAgeworCSsrcDsKKwllYS5mb3JjZWl0ID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorCWVhLmZvcmNlaXQgPSBGQUxTRTsKKworLyoKKyAqIDUuIHBhcnNlIGFyZ3VtZW50cworICovCisjaWZkZWYgRkVBVF9VU1JfQ01EUworICAgIGlmICghVVNFUl9DTURJRFgoZWEuY21kaWR4KSkKKyNlbmRpZgorCWVhLmFyZ3QgPSBjbWRuYW1lc1soaW50KWVhLmNtZGlkeF0uY21kX2FyZ3Q7CisKKyAgICBpZiAoIWVhLnNraXApCisgICAgeworI2lmZGVmIEhBVkVfU0FOREJPWAorCWlmIChzYW5kYm94ICE9IDAgJiYgIShlYS5hcmd0ICYgU0JPWE9LKSkKKwl7CisJICAgIC8qIENvbW1hbmQgbm90IGFsbG93ZWQgaW4gc2FuZGJveC4gKi8KKwkgICAgZXJyb3Jtc2cgPSAoY2hhcl91ICopXyhlX3NhbmRib3gpOworCSAgICBnb3RvIGRvZW5kOworCX0KKyNlbmRpZgorCWlmICghY3VyYnVmLT5iX3BfbWEgJiYgKGVhLmFyZ3QgJiBNT0RJRlkpKQorCXsKKwkgICAgLyogQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBub24tJ21vZGlmaWFibGUnIGJ1ZmZlciAqLworCSAgICBlcnJvcm1zZyA9IChjaGFyX3UgKilfKGVfbW9kaWZpYWJsZSk7CisJICAgIGdvdG8gZG9lbmQ7CisJfQorI2lmZGVmIEZFQVRfQ01EV0lOCisJaWYgKGNtZHdpbl90eXBlICE9IDAgJiYgIShlYS5hcmd0ICYgQ01EV0lOKQorIyBpZmRlZiBGRUFUX1VTUl9DTURTCisJCSYmICFVU0VSX0NNRElEWChlYS5jbWRpZHgpCisjIGVuZGlmCisJICAgKQorCXsKKwkgICAgLyogQ29tbWFuZCBub3QgYWxsb3dlZCBpbiBjbWRsaW5lIHdpbmRvdy4gKi8KKwkgICAgZXJyb3Jtc2cgPSAoY2hhcl91ICopXyhlX2NtZHdpbik7CisJICAgIGdvdG8gZG9lbmQ7CisJfQorI2VuZGlmCisKKwlpZiAoIW5pICYmICEoZWEuYXJndCAmIFJBTkdFKSAmJiBlYS5hZGRyX2NvdW50ID4gMCkKKwl7CisJICAgIC8qIG5vIHJhbmdlIGFsbG93ZWQgKi8KKwkgICAgZXJyb3Jtc2cgPSAoY2hhcl91ICopXyhlX25vcmFuZ2UpOworCSAgICBnb3RvIGRvZW5kOworCX0KKyAgICB9CisKKyAgICBpZiAoIW5pICYmICEoZWEuYXJndCAmIEJBTkcpICYmIGVhLmZvcmNlaXQpCS8qIG5vIDwhPiBhbGxvd2VkICovCisgICAgeworCWVycm9ybXNnID0gKGNoYXJfdSAqKV8oZV9ub2JhbmcpOworCWdvdG8gZG9lbmQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEb24ndCBjb21wbGFpbiBhYm91dCB0aGUgcmFuZ2UgaWYgaXQgaXMgbm90IHVzZWQKKyAgICAgKiAoY291bGQgaGFwcGVuIGlmIGxpbmVfY291bnQgaXMgYWNjaWRlbnRhbGx5IHNldCB0byAwKS4KKyAgICAgKi8KKyAgICBpZiAoIWVhLnNraXAgJiYgIW5pKQorICAgIHsKKwkvKgorCSAqIElmIHRoZSByYW5nZSBpcyBiYWNrd2FyZHMsIGFzayBmb3IgY29uZmlybWF0aW9uIGFuZCwgaWYgZ2l2ZW4sIHN3YXAKKwkgKiBlYS5saW5lMSAmIGVhLmxpbmUyIHNvIGl0J3MgZm9yd2FyZHMgYWdhaW4uCisJICogV2hlbiBnbG9iYWwgY29tbWFuZCBpcyBidXN5LCBkb24ndCBhc2ssIHdpbGwgZmFpbCBiZWxvdy4KKwkgKi8KKwlpZiAoIWdsb2JhbF9idXN5ICYmIGVhLmxpbmUxID4gZWEubGluZTIpCisJeworCSAgICBpZiAoc291cmNpbmcpCisJICAgIHsKKwkJZXJyb3Jtc2cgPSAoY2hhcl91ICopXygiRTQ5MzogQmFja3dhcmRzIHJhbmdlIGdpdmVuIik7CisJCWdvdG8gZG9lbmQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWludAltc2dfc2lsZW50X3NhdmUgPSBtc2dfc2lsZW50OworCisJCW1zZ19zaWxlbnQgPSAwOworCQlpZiAoYXNrX3llc25vKChjaGFyX3UgKikKKwkJCV8oIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIpLCBGQUxTRSkgIT0gJ3knKQorCQlnb3RvIGRvZW5kOworCQltc2dfc2lsZW50ID0gbXNnX3NpbGVudF9zYXZlOworCSAgICB9CisJICAgIGxudW0gPSBlYS5saW5lMTsKKwkgICAgZWEubGluZTEgPSBlYS5saW5lMjsKKwkgICAgZWEubGluZTIgPSBsbnVtOworCX0KKwlpZiAoKGVycm9ybXNnID0gaW52YWxpZF9yYW5nZSgmZWEpKSAhPSBOVUxMKQorCSAgICBnb3RvIGRvZW5kOworICAgIH0KKworICAgIGlmICgoZWEuYXJndCAmIE5PVEFEUikgJiYgZWEuYWRkcl9jb3VudCA9PSAwKSAvKiBkZWZhdWx0IGlzIDEsIG5vdCBjdXJzb3IgKi8KKwllYS5saW5lMiA9IDE7CisKKyAgICBjb3JyZWN0X3JhbmdlKCZlYSk7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoKChlYS5hcmd0ICYgV0hPTEVGT0xEKSB8fCBlYS5hZGRyX2NvdW50ID49IDIpICYmICFnbG9iYWxfYnVzeSkKKyAgICB7CisJLyogUHV0IHRoZSBmaXJzdCBsaW5lIGF0IHRoZSBzdGFydCBvZiBhIGNsb3NlZCBmb2xkLCBwdXQgdGhlIGxhc3QgbGluZQorCSAqIGF0IHRoZSBlbmQgb2YgYSBjbG9zZWQgZm9sZC4gKi8KKwkodm9pZCloYXNGb2xkaW5nKGVhLmxpbmUxLCAmZWEubGluZTEsIE5VTEwpOworCSh2b2lkKWhhc0ZvbGRpbmcoZWEubGluZTIsIE5VTEwsICZlYS5saW5lMik7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisgICAgLyoKKyAgICAgKiBGb3IgdGhlIDptYWtlIGFuZCA6Z3JlcCBjb21tYW5kcyB3ZSBpbnNlcnQgdGhlICdtYWtlcHJnJy8nZ3JlcHByZycKKyAgICAgKiBvcHRpb24gaGVyZSwgc28gdGhpbmdzIGxpa2UgJSBnZXQgZXhwYW5kZWQuCisgICAgICovCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfbWFrZSB8fCBlYS5jbWRpZHggPT0gQ01EX2dyZXAKKwkJCQkJCSAgfHwgZWEuY21kaWR4ID09IENNRF9ncmVwYWRkKQorICAgIHsKKwljaGFyX3UJCSpuZXdfY21kbGluZTsKKwljaGFyX3UJCSpwcm9ncmFtOworCWNoYXJfdQkJKnBvczsKKwljaGFyX3UJCSpwdHI7CisJaW50CQlsZW47CisJaW50CQlpOworCisJaWYgKGVhLmNtZGlkeCA9PSBDTURfZ3JlcCB8fCBlYS5jbWRpZHggPT0gQ01EX2dyZXBhZGQpCisJeworCSAgICBpZiAoKmN1cmJ1Zi0+Yl9wX2dwID09IE5VTCkKKwkJcHJvZ3JhbSA9IHBfZ3A7CisJICAgIGVsc2UKKwkJcHJvZ3JhbSA9IGN1cmJ1Zi0+Yl9wX2dwOworCX0KKwllbHNlCisJeworCSAgICBpZiAoKmN1cmJ1Zi0+Yl9wX21wID09IE5VTCkKKwkJcHJvZ3JhbSA9IHBfbXA7CisJICAgIGVsc2UKKwkJcHJvZ3JhbSA9IGN1cmJ1Zi0+Yl9wX21wOworCX0KKworCXAgPSBza2lwd2hpdGUocCk7CisKKwlpZiAoKHBvcyA9IChjaGFyX3UgKilzdHJzdHIoKGNoYXIgKilwcm9ncmFtLCAiJCoiKSkgIT0gTlVMTCkKKwl7CQkJCS8qIHJlcGxhY2UgJCogYnkgZ2l2ZW4gYXJndW1lbnRzICovCisJICAgIGkgPSAxOworCSAgICB3aGlsZSAoKHBvcyA9IChjaGFyX3UgKilzdHJzdHIoKGNoYXIgKilwb3MgKyAyLCAiJCoiKSkgIT0gTlVMTCkKKwkJKytpOworCSAgICBsZW4gPSAoaW50KVNUUkxFTihwKTsKKwkgICAgbmV3X2NtZGxpbmUgPSBhbGxvYygoaW50KShTVFJMRU4ocHJvZ3JhbSkgKyBpICogKGxlbiAtIDIpICsgMSkpOworCSAgICBpZiAobmV3X2NtZGxpbmUgPT0gTlVMTCkKKwkJZ290byBkb2VuZDsJCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJICAgIHB0ciA9IG5ld19jbWRsaW5lOworCSAgICB3aGlsZSAoKHBvcyA9IChjaGFyX3UgKilzdHJzdHIoKGNoYXIgKilwcm9ncmFtLCAiJCoiKSkgIT0gTlVMTCkKKwkgICAgeworCQlpID0gKGludCkocG9zIC0gcHJvZ3JhbSk7CisJCVNUUk5DUFkocHRyLCBwcm9ncmFtLCBpKTsKKwkJU1RSQ1BZKHB0ciArPSBpLCBwKTsKKwkJcHRyICs9IGxlbjsKKwkJcHJvZ3JhbSA9IHBvcyArIDI7CisJICAgIH0KKwkgICAgU1RSQ1BZKHB0ciwgcHJvZ3JhbSk7CisJfQorCWVsc2UKKwl7CisJICAgIG5ld19jbWRsaW5lID0gYWxsb2MoKGludCkoU1RSTEVOKHByb2dyYW0pICsgU1RSTEVOKHApICsgMikpOworCSAgICBpZiAobmV3X2NtZGxpbmUgPT0gTlVMTCkKKwkJZ290byBkb2VuZDsJCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJICAgIFNUUkNQWShuZXdfY21kbGluZSwgcHJvZ3JhbSk7CisJICAgIFNUUkNBVChuZXdfY21kbGluZSwgIiAiKTsKKwkgICAgU1RSQ0FUKG5ld19jbWRsaW5lLCBwKTsKKwl9CisJbXNnX21ha2UocCk7CisJLyogJ2VhLmNtZCcgaXMgbm90IHNldCBoZXJlLCBiZWNhdXNlIGl0IGlzIG5vdCB1c2VkIGF0IENNRF9tYWtlICovCisJdmltX2ZyZWUoKmNtZGxpbmVwKTsKKwkqY21kbGluZXAgPSBuZXdfY21kbGluZTsKKwlwID0gbmV3X2NtZGxpbmU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNraXAgdG8gc3RhcnQgb2YgYXJndW1lbnQuCisgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgdGhlICI6ISIgY29tbWFuZCwgYmVjYXVzZSAiOiEhIC1sIiBuZWVkcyB0aGUgc3BhY2UuCisgICAgICovCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfYmFuZykKKwllYS5hcmcgPSBwOworICAgIGVsc2UKKwllYS5hcmcgPSBza2lwd2hpdGUocCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciAiKytvcHQ9dmFsIiBhcmd1bWVudC4KKyAgICAgKiBNdXN0IGJlIGZpcnN0LCBhbGxvdyAiOncgKytlbmM9dXRmOCAhY21kIgorICAgICAqLworICAgIGlmIChlYS5hcmd0ICYgQVJHT1BUKQorCXdoaWxlIChlYS5hcmdbMF0gPT0gJysnICYmIGVhLmFyZ1sxXSA9PSAnKycpCisJICAgIGlmIChnZXRhcmdvcHQoJmVhKSA9PSBGQUlMICYmICFuaSkKKwkgICAgeworCQllcnJvcm1zZyA9IChjaGFyX3UgKilfKGVfaW52YXJnKTsKKwkJZ290byBkb2VuZDsKKwkgICAgfQorCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfd3JpdGUgfHwgZWEuY21kaWR4ID09IENNRF91cGRhdGUpCisgICAgeworCWlmICgqZWEuYXJnID09ICc+JykJCQkvKiBhcHBlbmQgKi8KKwl7CisJICAgIGlmICgqKytlYS5hcmcgIT0gJz4nKQkJLyogdHlwZWQgd3JvbmcgKi8KKwkgICAgeworCQllcnJvcm1zZyA9IChjaGFyX3UgKilfKCJFNDk0OiBVc2UgdyBvciB3Pj4iKTsKKwkJZ290byBkb2VuZDsKKwkgICAgfQorCSAgICBlYS5hcmcgPSBza2lwd2hpdGUoZWEuYXJnICsgMSk7CisJICAgIGVhLmFwcGVuZCA9IFRSVUU7CisJfQorCWVsc2UgaWYgKCplYS5hcmcgPT0gJyEnICYmIGVhLmNtZGlkeCA9PSBDTURfd3JpdGUpICAvKiA6dyAhZmlsdGVyICovCisJeworCSAgICArK2VhLmFyZzsKKwkgICAgZWEudXNlZmlsdGVyID0gVFJVRTsKKwl9CisgICAgfQorCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfcmVhZCkKKyAgICB7CisJaWYgKGVhLmZvcmNlaXQpCisJeworCSAgICBlYS51c2VmaWx0ZXIgPSBUUlVFOwkJLyogOnIhIGZpbHRlciBpZiBlYS5mb3JjZWl0ICovCisJICAgIGVhLmZvcmNlaXQgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAoKmVhLmFyZyA9PSAnIScpCQkvKiA6ciAhZmlsdGVyICovCisJeworCSAgICArK2VhLmFyZzsKKwkgICAgZWEudXNlZmlsdGVyID0gVFJVRTsKKwl9CisgICAgfQorCisgICAgaWYgKGVhLmNtZGlkeCA9PSBDTURfbHNoaWZ0IHx8IGVhLmNtZGlkeCA9PSBDTURfcnNoaWZ0KQorICAgIHsKKwllYS5hbW91bnQgPSAxOworCXdoaWxlICgqZWEuYXJnID09ICplYS5jbWQpCQkvKiBjb3VudCBudW1iZXIgb2YgJz4nIG9yICc8JyAqLworCXsKKwkgICAgKytlYS5hcmc7CisJICAgICsrZWEuYW1vdW50OworCX0KKwllYS5hcmcgPSBza2lwd2hpdGUoZWEuYXJnKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciAiK2NvbW1hbmQiIGFyZ3VtZW50LCBiZWZvcmUgY2hlY2tpbmcgZm9yIG5leHQgY29tbWFuZC4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciAiOnJlYWQgIWNtZCIgYW5kICI6d3JpdGUgIWNtZCIuCisgICAgICovCisgICAgaWYgKChlYS5hcmd0ICYgRURJVENNRCkgJiYgIWVhLnVzZWZpbHRlcikKKwllYS5kb19lY21kX2NtZCA9IGdldGFyZ2NtZCgmZWEuYXJnKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yICd8JyB0byBzZXBhcmF0ZSBjb21tYW5kcyBhbmQgJyInIHRvIHN0YXJ0IGNvbW1lbnRzLgorICAgICAqIERvbid0IGRvIHRoaXMgZm9yICI6cmVhZCAhY21kIiBhbmQgIjp3cml0ZSAhY21kIi4KKyAgICAgKi8KKyAgICBpZiAoKGVhLmFyZ3QgJiBUUkxCQVIpICYmICFlYS51c2VmaWx0ZXIpCisJc2VwYXJhdGVfbmV4dGNtZCgmZWEpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgPG5ld2xpbmU+IHRvIGVuZCBhIHNoZWxsIGNvbW1hbmQuCisgICAgICogQWxzbyBkbyB0aGlzIGZvciAiOnJlYWQgIWNtZCIgYW5kICI6d3JpdGUgIWNtZCIuCisgICAgICovCisgICAgZWxzZSBpZiAoZWEuY21kaWR4ID09IENNRF9iYW5nIHx8IGVhLnVzZWZpbHRlcikKKyAgICB7CisJZm9yIChwID0gZWEuYXJnOyAqcDsgKytwKQorCXsKKwkgICAgLyogUmVtb3ZlIG9uZSBiYWNrc2xhc2ggYmVmb3JlIGEgbmV3bGluZSwgc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvCisJICAgICAqIHBhc3MgYSBuZXdsaW5lIHRvIHRoZSBzaGVsbCBhbmQgYWxzbyBhIG5ld2xpbmUgdGhhdCBpcyBwcmVjZWRlZAorCSAgICAgKiB3aXRoIGEgYmFja3NsYXNoLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGVuZCBhIHNoZWxsCisJICAgICAqIGNvbW1hbmQgaW4gYSBiYWNrc2xhc2gsIGJ1dCB0aGF0IGRvZXNuJ3QgYXBwZWFyIHVzZWZ1bC4KKwkgICAgICogSGFsdmluZyB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzCisJICAgICAqIHZlcnNpb25zLiAqLworCSAgICBpZiAoKnAgPT0gJ1xcJyAmJiBwWzFdID09ICdcbicpCisJCW1jaF9tZW1tb3ZlKHAsIHAgKyAxLCBTVFJMRU4ocCkpOworCSAgICBlbHNlIGlmICgqcCA9PSAnXG4nKQorCSAgICB7CisJCWVhLm5leHRjbWQgPSBwICsgMTsKKwkJKnAgPSBOVUw7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICgoZWEuYXJndCAmIERGTEFMTCkgJiYgZWEuYWRkcl9jb3VudCA9PSAwKQorICAgIHsKKwllYS5saW5lMSA9IDE7CisJZWEubGluZTIgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICB9CisKKyAgICAvKiBhY2NlcHQgbnVtYmVyZWQgcmVnaXN0ZXIgb25seSB3aGVuIG5vIGNvdW50IGFsbG93ZWQgKDpwdXQpICovCisgICAgaWYgKCAgICAgICAoZWEuYXJndCAmIFJFR1NUUikKKwkgICAgJiYgKmVhLmFyZyAhPSBOVUwKKyNpZmRlZiBGRUFUX1VTUl9DTURTCisJICAgICYmIHZhbGlkX3lhbmtfcmVnKCplYS5hcmcsIChlYS5jbWRpZHggIT0gQ01EX3B1dAorCQkJCQkJICAgJiYgVVNFUl9DTURJRFgoZWEuY21kaWR4KSkpCisJICAgIC8qIERvIG5vdCBhbGxvdyByZWdpc3RlciA9IGZvciB1c2VyIGNvbW1hbmRzICovCisJICAgICYmICghVVNFUl9DTURJRFgoZWEuY21kaWR4KSB8fCAqZWEuYXJnICE9ICc9JykKKyNlbHNlCisJICAgICYmIHZhbGlkX3lhbmtfcmVnKCplYS5hcmcsIGVhLmNtZGlkeCAhPSBDTURfcHV0KQorI2VuZGlmCisJICAgICYmICEoKGVhLmFyZ3QgJiBDT1VOVCkgJiYgVklNX0lTRElHSVQoKmVhLmFyZykpKQorICAgIHsKKwllYS5yZWduYW1lID0gKmVhLmFyZysrOworI2lmZGVmIEZFQVRfRVZBTAorCS8qIGZvciAnPScgcmVnaXN0ZXI6IGFjY2VwdCB0aGUgcmVzdCBvZiB0aGUgbGluZSBhcyBhbiBleHByZXNzaW9uICovCisJaWYgKGVhLmFyZ1stMV0gPT0gJz0nICYmIGVhLmFyZ1swXSAhPSBOVUwpCisJeworCSAgICBzZXRfZXhwcl9saW5lKHZpbV9zdHJzYXZlKGVhLmFyZykpOworCSAgICBlYS5hcmcgKz0gU1RSTEVOKGVhLmFyZyk7CisJfQorI2VuZGlmCisJZWEuYXJnID0gc2tpcHdoaXRlKGVhLmFyZyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYSBjb3VudC4gIFdoZW4gYWNjZXB0aW5nIGEgQlVGTkFNRSwgZG9uJ3QgdXNlICIxMjNmb28iIGFzIGEKKyAgICAgKiBjb3VudCwgaXQncyBhIGJ1ZmZlciBuYW1lLgorICAgICAqLworICAgIGlmICgoZWEuYXJndCAmIENPVU5UKSAmJiBWSU1fSVNESUdJVCgqZWEuYXJnKQorCSAgICAmJiAoIShlYS5hcmd0ICYgQlVGTkFNRSkgfHwgKihwID0gc2tpcGRpZ2l0cyhlYS5hcmcpKSA9PSBOVUwKKwkJCQkJCQkgIHx8IHZpbV9pc3doaXRlKCpwKSkpCisgICAgeworCW4gPSBnZXRkaWdpdHMoJmVhLmFyZyk7CisJZWEuYXJnID0gc2tpcHdoaXRlKGVhLmFyZyk7CisJaWYgKG4gPD0gMCAmJiAhbmkpCisJeworCSAgICBlcnJvcm1zZyA9IChjaGFyX3UgKilfKGVfemVyb2NvdW50KTsKKwkgICAgZ290byBkb2VuZDsKKwl9CisJaWYgKGVhLmFyZ3QgJiBOT1RBRFIpCS8qIGUuZy4gOmJ1ZmZlciAyLCA6c2xlZXAgMyAqLworCXsKKwkgICAgZWEubGluZTIgPSBuOworCSAgICBpZiAoZWEuYWRkcl9jb3VudCA9PSAwKQorCQllYS5hZGRyX2NvdW50ID0gMTsKKwl9CisJZWxzZQorCXsKKwkgICAgZWEubGluZTEgPSBlYS5saW5lMjsKKwkgICAgZWEubGluZTIgKz0gbiAtIDE7CisJICAgICsrZWEuYWRkcl9jb3VudDsKKwkgICAgLyoKKwkgICAgICogQmUgdmkgY29tcGF0aWJsZTogbm8gZXJyb3IgbWVzc2FnZSBmb3Igb3V0IG9mIHJhbmdlLgorCSAgICAgKi8KKwkgICAgaWYgKGVhLmxpbmUyID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCWVhLmxpbmUyID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJfQorICAgIH0KKwkJCQkJCS8qIG5vIGFyZ3VtZW50cyBhbGxvd2VkICovCisgICAgaWYgKCFuaSAmJiAhKGVhLmFyZ3QgJiBFWFRSQSkgJiYgKmVhLmFyZyAhPSBOVUwgJiYKKwkJCQkgdmltX3N0cmNocigoY2hhcl91ICopInxcIiIsICplYS5hcmcpID09IE5VTEwpCisgICAgeworCWVycm9ybXNnID0gKGNoYXJfdSAqKV8oZV90cmFpbGluZyk7CisJZ290byBkb2VuZDsKKyAgICB9CisKKyAgICBpZiAoIW5pICYmIChlYS5hcmd0ICYgTkVFREFSRykgJiYgKmVhLmFyZyA9PSBOVUwpCisgICAgeworCWVycm9ybXNnID0gKGNoYXJfdSAqKV8oZV9hcmdyZXEpOworCWdvdG8gZG9lbmQ7CisgICAgfQorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyoKKyAgICAgKiBTa2lwIHRoZSBjb21tYW5kIHdoZW4gaXQncyBub3QgZ29pbmcgdG8gYmUgZXhlY3V0ZWQuCisgICAgICogVGhlIGNvbW1hbmRzIGxpa2UgOmlmLCA6ZW5kaWYsIGV0Yy4gYWx3YXlzIG5lZWQgdG8gYmUgZXhlY3V0ZWQuCisgICAgICogQWxzbyBtYWtlIGFuIGV4Y2VwdGlvbiBmb3IgY29tbWFuZHMgdGhhdCBoYW5kbGUgYSB0cmFpbGluZyBjb21tYW5kCisgICAgICogdGhlbXNlbHZlcy4KKyAgICAgKi8KKyAgICBpZiAoZWEuc2tpcCkKKyAgICB7CisJc3dpdGNoIChlYS5jbWRpZHgpCisJeworCSAgICAvKiBjb21tYW5kcyB0aGF0IG5lZWQgZXZhbHVhdGlvbiAqLworCSAgICBjYXNlIENNRF93aGlsZToKKwkgICAgY2FzZSBDTURfZW5kd2hpbGU6CisJICAgIGNhc2UgQ01EX2lmOgorCSAgICBjYXNlIENNRF9lbHNlaWY6CisJICAgIGNhc2UgQ01EX2Vsc2U6CisJICAgIGNhc2UgQ01EX2VuZGlmOgorCSAgICBjYXNlIENNRF90cnk6CisJICAgIGNhc2UgQ01EX2NhdGNoOgorCSAgICBjYXNlIENNRF9maW5hbGx5OgorCSAgICBjYXNlIENNRF9lbmR0cnk6CisJICAgIGNhc2UgQ01EX2Z1bmN0aW9uOgorCQkJCWJyZWFrOworCisJICAgIC8qIENvbW1hbmRzIHRoYXQgaGFuZGxlICd8JyB0aGVtc2VsdmVzLiAgQ2hlY2s6IEEgY29tbWFuZCBzaG91bGQKKwkgICAgICogZWl0aGVyIGhhdmUgdGhlIFRSTEJBUiBmbGFnLCBhcHBlYXIgaW4gdGhpcyBsaXN0IG9yIGFwcGVhciBpbgorCSAgICAgKiB0aGUgbGlzdCBhdCAiOmhlbHAgOmJhciIuICovCisJICAgIGNhc2UgQ01EX2Fib3ZlbGVmdDoKKwkgICAgY2FzZSBDTURfYW5kOgorCSAgICBjYXNlIENNRF9iZWxvd3JpZ2h0OgorCSAgICBjYXNlIENNRF9ib3RyaWdodDoKKwkgICAgY2FzZSBDTURfYnJvd3NlOgorCSAgICBjYXNlIENNRF9jYWxsOgorCSAgICBjYXNlIENNRF9jb25maXJtOgorCSAgICBjYXNlIENNRF9kZWxmdW5jdGlvbjoKKwkgICAgY2FzZSBDTURfZGp1bXA6CisJICAgIGNhc2UgQ01EX2RsaXN0OgorCSAgICBjYXNlIENNRF9kc2VhcmNoOgorCSAgICBjYXNlIENNRF9kc3BsaXQ6CisJICAgIGNhc2UgQ01EX2VjaG86CisJICAgIGNhc2UgQ01EX2VjaG9lcnI6CisJICAgIGNhc2UgQ01EX2VjaG9tc2c6CisJICAgIGNhc2UgQ01EX2VjaG9uOgorCSAgICBjYXNlIENNRF9leGVjdXRlOgorCSAgICBjYXNlIENNRF9oZWxwOgorCSAgICBjYXNlIENNRF9oaWRlOgorCSAgICBjYXNlIENNRF9panVtcDoKKwkgICAgY2FzZSBDTURfaWxpc3Q6CisJICAgIGNhc2UgQ01EX2lzZWFyY2g6CisJICAgIGNhc2UgQ01EX2lzcGxpdDoKKwkgICAgY2FzZSBDTURfa2VlcGp1bXBzOgorCSAgICBjYXNlIENNRF9rZWVwbWFya3M6CisJICAgIGNhc2UgQ01EX2xlZnRhYm92ZToKKwkgICAgY2FzZSBDTURfbGV0OgorCSAgICBjYXNlIENNRF9sb2NrbWFya3M6CisJICAgIGNhc2UgQ01EX21hdGNoOgorCSAgICBjYXNlIENNRF9wZXJsOgorCSAgICBjYXNlIENNRF9wc2VhcmNoOgorCSAgICBjYXNlIENNRF9weXRob246CisJICAgIGNhc2UgQ01EX3JldHVybjoKKwkgICAgY2FzZSBDTURfcmlnaHRiZWxvdzoKKwkgICAgY2FzZSBDTURfcnVieToKKwkgICAgY2FzZSBDTURfc2lsZW50OgorCSAgICBjYXNlIENNRF9zbWFnaWM6CisJICAgIGNhc2UgQ01EX3Nub21hZ2ljOgorCSAgICBjYXNlIENNRF9zdWJzdGl0dXRlOgorCSAgICBjYXNlIENNRF9zeW50YXg6CisJICAgIGNhc2UgQ01EX3RjbDoKKwkgICAgY2FzZSBDTURfdGhyb3c6CisJICAgIGNhc2UgQ01EX3RpbGRlOgorCSAgICBjYXNlIENNRF90b3BsZWZ0OgorCSAgICBjYXNlIENNRF91bmxldDoKKwkgICAgY2FzZSBDTURfdmVyYm9zZToKKwkgICAgY2FzZSBDTURfdmVydGljYWw6CisJCQkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoJCWdvdG8gZG9lbmQ7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGVhLmFyZ3QgJiBYRklMRSkKKyAgICB7CisJaWYgKGV4cGFuZF9maWxlbmFtZSgmZWEsIGNtZGxpbmVwLCAmZXJyb3Jtc2cpID09IEZBSUwpCisJICAgIGdvdG8gZG9lbmQ7CisgICAgfQorCisjaWZkZWYgRkVBVF9MSVNUQ01EUworICAgIC8qCisgICAgICogQWNjZXB0IGJ1ZmZlciBuYW1lLiAgQ2Fubm90IGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZSB3aXRoIGEgYnVmZmVyCisgICAgICogbnVtYmVyLiAgRG9uJ3QgZG8gdGhpcyBmb3IgYSB1c2VyIGNvbW1hbmQuCisgICAgICovCisgICAgaWYgKChlYS5hcmd0ICYgQlVGTkFNRSkgJiYgKmVhLmFyZyAhPSBOVUwgJiYgZWEuYWRkcl9jb3VudCA9PSAwCisjIGlmZGVmIEZFQVRfVVNSX0NNRFMKKwkgICAgJiYgIVVTRVJfQ01ESURYKGVhLmNtZGlkeCkKKyMgZW5kaWYKKwkgICAgKQorICAgIHsKKwkvKgorCSAqIDpiZGVsZXRlLCA6YndpcGVvdXQgYW5kIDpidW5sb2FkIHRha2Ugc2V2ZXJhbCBhcmd1bWVudHMsIHNlcGFyYXRlZAorCSAqIGJ5IHNwYWNlczogZmluZCBuZXh0IHNwYWNlIChza2lwcGluZyBvdmVyIGVzY2FwZWQgY2hhcmFjdGVycykuCisJICogVGhlIG90aGVycyB0YWtlIG9uZSBhcmd1bWVudDogaWdub3JlIHRyYWlsaW5nIHNwYWNlcy4KKwkgKi8KKwlpZiAoZWEuY21kaWR4ID09IENNRF9iZGVsZXRlIHx8IGVhLmNtZGlkeCA9PSBDTURfYndpcGVvdXQKKwkJCQkJCSAgfHwgZWEuY21kaWR4ID09IENNRF9idW5sb2FkKQorCSAgICBwID0gc2tpcHRvd2hpdGVfZXNjKGVhLmFyZyk7CisJZWxzZQorCXsKKwkgICAgcCA9IGVhLmFyZyArIFNUUkxFTihlYS5hcmcpOworCSAgICB3aGlsZSAocCA+IGVhLmFyZyAmJiB2aW1faXN3aGl0ZShwWy0xXSkpCisJCS0tcDsKKwl9CisJZWEubGluZTIgPSBidWZsaXN0X2ZpbmRwYXQoZWEuYXJnLCBwLCAoZWEuYXJndCAmIEJVRlVOTCkgIT0gMCwgRkFMU0UpOworCWlmIChlYS5saW5lMiA8IDApCSAgICAvKiBmYWlsZWQgKi8KKwkgICAgZ290byBkb2VuZDsKKwllYS5hZGRyX2NvdW50ID0gMTsKKwllYS5hcmcgPSBza2lwd2hpdGUocCk7CisgICAgfQorI2VuZGlmCisKKy8qCisgKiA2LiBzd2l0Y2ggb24gY29tbWFuZCBuYW1lCisgKgorICogVGhlICJlYSIgc3RydWN0dXJlIGhvbGRzIHRoZSBhcmd1bWVudHMgdGhhdCBjYW4gYmUgdXNlZC4KKyAqLworICAgIGVhLmNtZGxpbmVwID0gY21kbGluZXA7CisgICAgZWEuZ2V0bGluZSA9IGdldGxpbmU7CisgICAgZWEuY29va2llID0gY29va2llOworI2lmZGVmIEZFQVRfRVZBTAorICAgIGVhLmNzdGFjayA9IGNzdGFjazsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9VU1JfQ01EUworICAgIGlmIChVU0VSX0NNRElEWChlYS5jbWRpZHgpKQorICAgIHsKKwkvKgorCSAqIEV4ZWN1dGUgYSB1c2VyLWRlZmluZWQgY29tbWFuZC4KKwkgKi8KKwlkb191Y21kKCZlYSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIENhbGwgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuCisJICovCisJZWEuZXJybXNnID0gTlVMTDsKKwkoY21kbmFtZXNbZWEuY21kaWR4XS5jbWRfZnVuYykoJmVhKTsKKwlpZiAoZWEuZXJybXNnICE9IE5VTEwpCisJICAgIGVycm9ybXNnID0gKGNoYXJfdSAqKV8oZWEuZXJybXNnKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICAvKgorICAgICAqIElmIHRoZSBjb21tYW5kIGp1c3QgZXhlY3V0ZWQgY2FsbGVkIGRvX2NtZGxpbmUoKSwgYW55IHRocm93IG9yICI6cmV0dXJuIgorICAgICAqIG9yICI6ZmluaXNoIiBlbmNvdW50ZXJlZCB0aGVyZSBtdXN0IGFsc28gY2hlY2sgdGhlIGNzdGFjayBvZiB0aGUgc3RpbGwKKyAgICAgKiBhY3RpdmUgZG9fY21kbGluZSgpIHRoYXQgY2FsbGVkIHRoaXMgZG9fb25lX2NtZCgpLiAgUmV0aHJvdyBhbiB1bmNhdWdodAorICAgICAqIGV4Y2VwdGlvbiwgb3IgcmVhbmltYXRlIGEgcmV0dXJuZWQgZnVuY3Rpb24gb3IgZmluaXNoZWQgc2NyaXB0IGZpbGUgYW5kCisgICAgICogcmV0dXJuIG9yIGZpbmlzaCBpdCBhZ2Fpbi4KKyAgICAgKi8KKyAgICBpZiAobmVlZF9yZXRocm93KQorCWRvX3Rocm93KGNzdGFjayk7CisgICAgZWxzZSBpZiAoY2hlY2tfY3N0YWNrKQorICAgIHsKKwlpZiAoc291cmNlX2ZpbmlzaGVkKGdldGxpbmUsIGNvb2tpZSkpCisJICAgIGRvX2ZpbmlzaCgmZWEsIFRSVUUpOworCWVsc2UgaWYgKGdldGxpbmVfZXF1YWwoZ2V0bGluZSwgY29va2llLCBnZXRfZnVuY19saW5lKQorCQkJCQkJICAgJiYgY3VycmVudF9mdW5jX3JldHVybmVkKCkpCisJICAgIGRvX3JldHVybigmZWEsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICB9CisgICAgbmVlZF9yZXRocm93ID0gY2hlY2tfY3N0YWNrID0gRkFMU0U7CisjZW5kaWYKKworZG9lbmQ6CisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSAwKQkvKiBjYW4gaGFwcGVuIHdpdGggemVybyBsaW5lIG51bWJlciAqLworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IDE7CisKKyAgICBpZiAoZXJyb3Jtc2cgIT0gTlVMTCAmJiAqZXJyb3Jtc2cgIT0gTlVMICYmICFkaWRfZW1zZykKKyAgICB7CisJaWYgKHNvdXJjaW5nKQorCXsKKwkgICAgaWYgKGVycm9ybXNnICE9IElPYnVmZikKKwkgICAgeworCQlTVFJDUFkoSU9idWZmLCBlcnJvcm1zZyk7CisJCWVycm9ybXNnID0gSU9idWZmOworCSAgICB9CisJICAgIFNUUkNBVChlcnJvcm1zZywgIjogIik7CisJICAgIFNUUk5DQVQoZXJyb3Jtc2csICpjbWRsaW5lcCwgSU9TSVpFIC0gU1RSTEVOKElPYnVmZikpOworCX0KKwllbXNnKGVycm9ybXNnKTsKKyAgICB9CisjaWZkZWYgRkVBVF9FVkFMCisgICAgZG9fZXJydGhyb3coY3N0YWNrLAorCSAgICAoZWEuY21kaWR4ICE9IENNRF9TSVpFCisjIGlmZGVmIEZFQVRfVVNSX0NNRFMKKwkgICAgICYmICFVU0VSX0NNRElEWChlYS5jbWRpZHgpCisjIGVuZGlmCisJICAgICkgPyBjbWRuYW1lc1soaW50KWVhLmNtZGlkeF0uY21kX25hbWUgOiAoY2hhcl91ICopTlVMTCk7CisjZW5kaWYKKworICAgIGlmICh2ZXJib3NlX3NhdmUgPj0gMCkKKwlwX3ZlcmJvc2UgPSB2ZXJib3NlX3NhdmU7CisKKyAgICBjbWRtb2QgPSBzYXZlX2NtZG1vZDsKKworICAgIGlmIChkaWRfc2lsZW50ID4gMCkKKyAgICB7CisJLyogbWVzc2FnZXMgY291bGQgYmUgZW5hYmxlZCBmb3IgYSBzZXJpb3VzIGVycm9yLCBuZWVkIHRvIGNoZWNrIGlmIHRoZQorCSAqIGNvdW50ZXJzIGRvbid0IGJlY29tZSBuZWdhdGl2ZSAqLworCW1zZ19zaWxlbnQgLT0gZGlkX3NpbGVudDsKKwlpZiAobXNnX3NpbGVudCA8IDApCisJICAgIG1zZ19zaWxlbnQgPSAwOworCWVtc2dfc2lsZW50IC09IGRpZF9lc2lsZW50OworCWlmIChlbXNnX3NpbGVudCA8IDApCisJICAgIGVtc2dfc2lsZW50ID0gMDsKKwkvKiBSZXN0b3JlIG1zZ19zY3JvbGwsIGl0J3Mgc2V0IGJ5IGZpbGUgSS9PIGNvbW1hbmRzLCBldmVuIHdoZW4gbm8KKwkgKiBtZXNzYWdlIGlzIGFjdHVhbGx5IGRpc3BsYXllZC4gKi8KKwltc2dfc2Nyb2xsID0gc2F2ZV9tc2dfc2Nyb2xsOworICAgIH0KKworICAgIGlmIChlYS5uZXh0Y21kICYmICplYS5uZXh0Y21kID09IE5VTCkJLyogbm90IHJlYWxseSBhIG5leHQgY29tbWFuZCAqLworCWVhLm5leHRjbWQgPSBOVUxMOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLS1leF9uZXN0aW5nX2xldmVsOworI2VuZGlmCisKKyAgICByZXR1cm4gZWEubmV4dGNtZDsKK30KKyNpZiAoX01TQ19WRVIgPT0gMTIwMCkKKyMgcHJhZ21hIG9wdGltaXplKCAiIiwgb24gKQorI2VuZGlmCisKKy8qCisgKiBDaGVjayBmb3IgYSBjb21tYW5kIG1vZGlmaWVyIGNvbW1hbmQgd2l0aCBvcHRpb25hbCB0YWlsLgorICogSWYgdGhlcmUgaXMgYSBtYXRjaCBhZHZhbmNlICJwcCIgdG8gdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gVFJVRS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrZm9yY21kKHBwLCBjbWQsIGxlbikKKyAgICBjaGFyX3UJKipwcDsJCS8qIHN0YXJ0IG9mIGNvbW1hbmQgbGluZSAqLworICAgIGNoYXIJKmNtZDsJCS8qIG5hbWUgb2YgY29tbWFuZCAqLworICAgIGludAkJbGVuOwkJLyogcmVxdWlyZWQgbGVuZ3RoICovCit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgY21kW2ldICE9IE5VTDsgKytpKQorCWlmIChjbWRbaV0gIT0gKCpwcClbaV0pCisJICAgIGJyZWFrOworICAgIGlmIChpID49IGxlbiAmJiAhaXNhbHBoYSgoKnBwKVtpXSkpCisgICAgeworCSpwcCA9IHNraXB3aGl0ZSgqcHAgKyBpKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogRmluZCBhbiBFeCBjb21tYW5kIGJ5IGl0cyBuYW1lLCBlaXRoZXIgYnVpbHQtaW4gb3IgdXNlci4KKyAqIE5hbWUgY2FuIGJlIGZvdW5kIGF0IGVhcC0+Y21kLgorICogUmV0dXJucyBwb2ludGVyIHRvIGNoYXIgYWZ0ZXIgdGhlIGNvbW1hbmQgbmFtZS4KKyAqIFJldHVybnMgTlVMTCBmb3IgYW4gYW1iaWd1b3VzIHVzZXIgY29tbWFuZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGNoYXJfdSAqCitmaW5kX2NvbW1hbmQoZWFwLCBmdWxsKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCSpmdWxsOworeworICAgIGludAkJbGVuOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qCisgICAgICogSXNvbGF0ZSB0aGUgY29tbWFuZCBhbmQgc2VhcmNoIGZvciBpdCBpbiB0aGUgY29tbWFuZCB0YWJsZS4KKyAgICAgKiBFeGVwdGlvbnM6CisgICAgICogLSB0aGUgJ2snIGNvbW1hbmQgY2FuIGRpcmVjdGx5IGJlIGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIuCisgICAgICogLSB0aGUgJ3MnIGNvbW1hbmQgY2FuIGJlIGZvbGxvd2VkIGRpcmVjdGx5IGJ5ICdjJywgJ2cnLCAnaScsICdJJyBvciAncicKKyAgICAgKgkgICAgYnV0IDpzcmVbd2luZF0gaXMgYW5vdGhlciBjb21tYW5kLCBhcyBhcmUgOnNjcmlwW3RuYW1lc10sCisgICAgICoJICAgIDpzY3NbY29wZV0sIDpzaW1bYWx0XSwgOnNpZ1tuc10gYW5kIDpzaWxbZW50XS4KKyAgICAgKi8KKyAgICBwID0gZWFwLT5jbWQ7CisgICAgaWYgKCpwID09ICdrJykKKyAgICB7CisJZWFwLT5jbWRpZHggPSBDTURfazsKKwkrK3A7CisgICAgfQorICAgIGVsc2UgaWYgKHBbMF0gPT0gJ3MnCisJICAgICYmICgocFsxXSA9PSAnYycgJiYgcFsyXSAhPSAncycgJiYgcFsyXSAhPSAncicgJiYgcFszXSAhPSAnaScgJiYgcFs0XSAhPSAncCcpCisJCXx8IHBbMV0gPT0gJ2cnCisJCXx8IChwWzFdID09ICdpJyAmJiBwWzJdICE9ICdtJyAmJiBwWzJdICE9ICdsJyAmJiBwWzJdICE9ICdnJykKKwkJfHwgcFsxXSA9PSAnSScKKwkJfHwgKHBbMV0gPT0gJ3InICYmIHBbMl0gIT0gJ2UnKSkpCisgICAgeworCWVhcC0+Y21kaWR4ID0gQ01EX3N1YnN0aXR1dGU7CisJKytwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXdoaWxlIChBU0NJSV9JU0FMUEhBKCpwKSkKKwkgICAgKytwOworCS8qIGNoZWNrIGZvciBub24tYWxwaGEgY29tbWFuZCAqLworCWlmIChwID09IGVhcC0+Y21kICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJAKiE9PjwmfiMiLCAqcCkgIT0gTlVMTCkKKwkgICAgKytwOworCWxlbiA9IChpbnQpKHAgLSBlYXAtPmNtZCk7CisKKwlpZiAoQVNDSUlfSVNMT1dFUigqZWFwLT5jbWQpKQorCSAgICBlYXAtPmNtZGlkeCA9IGNtZGlkeHNbQ2hhck9yZExvdygqZWFwLT5jbWQpXTsKKwllbHNlCisJICAgIGVhcC0+Y21kaWR4ID0gY21kaWR4c1syNl07CisKKwlmb3IgKCA7IChpbnQpZWFwLT5jbWRpZHggPCAoaW50KUNNRF9TSVpFOworCQkJICAgICAgIGVhcC0+Y21kaWR4ID0gKGNtZGlkeF9UKSgoaW50KWVhcC0+Y21kaWR4ICsgMSkpCisJICAgIGlmIChTVFJOQ01QKGNtZG5hbWVzWyhpbnQpZWFwLT5jbWRpZHhdLmNtZF9uYW1lLCAoY2hhciAqKWVhcC0+Y21kLAorCQkJCQkJCSAgICAoc2l6ZV90KWxlbikgPT0gMCkKKwkgICAgeworI2lmZGVmIEZFQVRfRVZBTAorCQlpZiAoZnVsbCAhPSBOVUxMCisJCQkgICAmJiBjbWRuYW1lc1soaW50KWVhcC0+Y21kaWR4XS5jbWRfbmFtZVtsZW5dID09IE5VTCkKKwkJICAgICpmdWxsID0gVFJVRTsKKyNlbmRpZgorCQlicmVhazsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9VU1JfQ01EUworCS8qIExvb2sgZm9yIGEgdXNlciBkZWZpbmVkIGNvbW1hbmQgYXMgYSBsYXN0IHJlc29ydCAqLworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfU0laRSAmJiAqZWFwLT5jbWQgPj0gJ0EnICYmICplYXAtPmNtZCA8PSAnWicpCisJeworCSAgICB1Y21kX1QJKmNtZDsKKwkgICAgaW50CQlqLCBrLCBtYXRjaGxlbiA9IDA7CisJICAgIGludAkJZm91bmQgPSBGQUxTRSwgcG9zc2libGUgPSBGQUxTRTsKKwkgICAgY2hhcl91CSpjcCwgKm5wOwkvKiBQb2ludCBpbnRvIHR5cGVkIGNtZCBhbmQgdGVzdCBuYW1lICovCisJICAgIGdhcnJheV9UCSpnYXA7CisJICAgIGludAkJYW1iX2xvY2FsID0gRkFMU0U7IC8qIEZvdW5kIGFtYmlndW91cyBidWZmZXItbG9jYWwKKwkJCQkJICAgICAgY29tbWFuZCwgb25seSBmdWxsIG1hdGNoIGdsb2JhbAorCQkJCQkgICAgICBpcyBhY2NlcHRlZC4gKi8KKworCSAgICAvKiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbWF5IGNvbnRhaW4gbnVtYmVycyAqLworCSAgICB3aGlsZSAoQVNDSUlfSVNBTE5VTSgqcCkpCisJCSsrcDsKKwkgICAgbGVuID0gKGludCkocCAtIGVhcC0+Y21kKTsKKworCSAgICAvKgorCSAgICAgKiBMb29rIGZvciBidWZmZXItbG9jYWwgdXNlciBjb21tYW5kcyBmaXJzdCwgdGhlbiBnbG9iYWwgb25lcy4KKwkgICAgICovCisJICAgIGdhcCA9ICZjdXJidWYtPmJfdWNtZHM7CisJICAgIGZvciAoOzspCisJICAgIHsKKwkJZm9yIChqID0gMDsgaiA8IGdhcC0+Z2FfbGVuOyArK2opCisJCXsKKwkJICAgIGNtZCA9IFVTRVJfQ01EX0dBKGdhcCwgaik7CisJCSAgICBjcCA9IGVhcC0+Y21kOworCQkgICAgbnAgPSBjbWQtPnVjX25hbWU7CisJCSAgICBrID0gMDsKKwkJICAgIHdoaWxlIChrIDwgbGVuICYmICpucCAhPSBOVUwgJiYgKmNwKysgPT0gKm5wKyspCisJCQlrKys7CisJCSAgICBpZiAoayA9PSBsZW4gfHwgKCpucCA9PSBOVUwgJiYgdmltX2lzZGlnaXQoZWFwLT5jbWRba10pKSkKKwkJICAgIHsKKwkJCS8qIElmIGZpbmRpbmcgYSBzZWNvbmQgbWF0Y2gsIHRoZSBjb21tYW5kIGlzCisJCQkgKiBhbWJpZ3VvdXMuICBCdXQgbm90IGlmIGEgYnVmZmVyLWxvY2FsIGNvbW1hbmQKKwkJCSAqIHdhc24ndCBhIGZ1bGwgbWF0Y2ggYW5kIGEgZ2xvYmFsIGNvbW1hbmQgaXMgYSBmdWxsCisJCQkgKiBtYXRjaC4gKi8KKwkJCWlmIChrID09IGxlbiAmJiBmb3VuZCAmJiAqbnAgIT0gTlVMKQorCQkJeworCQkJICAgIGlmIChnYXAgPT0gJnVjbWRzKQorCQkJCXJldHVybiBOVUxMOworCQkJICAgIGFtYl9sb2NhbCA9IFRSVUU7CisJCQl9CisKKwkJCWlmICghZm91bmQgfHwgKGsgPT0gbGVuICYmICpucCA9PSBOVUwpKQorCQkJeworCQkJICAgIC8qIElmIHdlIG1hdGNoZWQgdXAgdG8gYSBkaWdpdCwgdGhlbiB0aGVyZSBjb3VsZAorCQkJICAgICAqIGJlIGFub3RoZXIgY29tbWFuZCBpbmNsdWRpbmcgdGhlIGRpZ2l0IHRoYXQgd2UKKwkJCSAgICAgKiBzaG91bGQgdXNlIGluc3RlYWQuCisJCQkgICAgICovCisJCQkgICAgaWYgKGsgPT0gbGVuKQorCQkJCWZvdW5kID0gVFJVRTsKKwkJCSAgICBlbHNlCisJCQkJcG9zc2libGUgPSBUUlVFOworCisJCQkgICAgaWYgKGdhcCA9PSAmdWNtZHMpCisJCQkJZWFwLT5jbWRpZHggPSBDTURfVVNFUjsKKwkJCSAgICBlbHNlCisJCQkJZWFwLT5jbWRpZHggPSBDTURfVVNFUl9CVUY7CisJCQkgICAgZWFwLT5hcmd0ID0gY21kLT51Y19hcmd0OworCQkJICAgIGVhcC0+dXNlcmlkeCA9IGo7CisKKwkJCSAgICAvKiBEbyBub3Qgc2VhcmNoIGZvciBmdXJ0aGVyIGFiYnJldmlhdGlvbnMKKwkJCSAgICAgKiBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLiAqLworCQkJICAgIG1hdGNobGVuID0gazsKKwkJCSAgICBpZiAoayA9PSBsZW4gJiYgKm5wID09IE5VTCkKKwkJCSAgICB7CisJCQkJaWYgKGZ1bGwgIT0gTlVMTCkKKwkJCQkgICAgKmZ1bGwgPSBUUlVFOworCQkJCWFtYl9sb2NhbCA9IEZBTFNFOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJfQorCisJCS8qIFN0b3AgaWYgd2UgZm91bmQgYSBmdWxsIG1hdGNoIG9yIHNlYXJjaGVkIGFsbC4gKi8KKwkJaWYgKGogPCBnYXAtPmdhX2xlbiB8fCBnYXAgPT0gJnVjbWRzKQorCQkgICAgYnJlYWs7CisJCWdhcCA9ICZ1Y21kczsKKwkgICAgfQorCisJICAgIC8qIE9ubHkgZm91bmQgYW1iaWd1b3VzIG1hdGNoZXMuICovCisJICAgIGlmIChhbWJfbG9jYWwpCisJCXJldHVybiBOVUxMOworCisJICAgIC8qIFRoZSBtYXRjaCB3ZSBmb3VuZCBtYXkgYmUgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYQorCSAgICAgKiBudW1iZXIuICBNb3ZlICpwIGJhY2sgdG8gcG9pbnQgdG8gaXQuCisJICAgICAqLworCSAgICBpZiAoZm91bmQgfHwgcG9zc2libGUpCisJCXAgKz0gbWF0Y2hsZW4gLSBsZW47CisJfQorI2VuZGlmCisKKwlpZiAobGVuID09IDApCisJICAgIGVhcC0+Y21kaWR4ID0gQ01EX1NJWkU7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gPiAwIGlmIGFuIEV4IGNvbW1hbmQgIm5hbWUiIGV4aXN0cy4KKyAqIFJldHVybiAyIGlmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLgorICogUmV0dXJuIDMgaWYgdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLgorICovCisgICAgaW50CitjbWRfZXhpc3RzKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGV4YXJnX1QJZWE7CisgICAgaW50CQlmdWxsID0gRkFMU0U7CisgICAgaW50CQlpOworICAgIGludAkJajsKKyAgICBzdGF0aWMgc3RydWN0IGNtZG1vZAorICAgIHsKKwljaGFyCSpuYW1lOworCWludAltaW5sZW47CisgICAgfSBjbWRtb2RzW10gPSB7CisJeyJhYm92ZWxlZnQiLCAzfSwKKwl7ImJlbG93cmlnaHQiLCAzfSwKKwl7ImJvdHJpZ2h0IiwgMn0sCisJeyJicm93c2UiLCAzfSwKKwl7ImNvbmZpcm0iLCA0fSwKKwl7ImhpZGUiLCAzfSwKKwl7ImtlZXBqdW1wcyIsIDV9LAorCXsia2VlcG1hcmtzIiwgM30sCisJeyJsZWZ0YWJvdmUiLCA1fSwKKwl7ImxvY2ttYXJrcyIsIDN9LAorCXsicmlnaHRiZWxvdyIsIDZ9LAorCXsic2lsZW50IiwgM30sCisJeyJ0b3BsZWZ0IiwgMn0sCisJeyJ2ZXJib3NlIiwgNH0sCisJeyJ2ZXJ0aWNhbCIsIDR9LAorICAgIH07CisKKyAgICAvKiBDaGVjayBjb21tYW5kIG1vZGlmaWVycy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNtZG1vZHMpIC8gc2l6ZW9mKHN0cnVjdCBjbWRtb2QpOyArK2kpCisgICAgeworCWZvciAoaiA9IDA7IG5hbWVbal0gIT0gTlVMOyArK2opCisJICAgIGlmIChuYW1lW2pdICE9IGNtZG1vZHNbaV0ubmFtZVtqXSkKKwkJYnJlYWs7CisJaWYgKG5hbWVbal0gPT0gTlVMICYmIGogPj0gY21kbW9kc1tpXS5taW5sZW4pCisJICAgIHJldHVybiAoY21kbW9kc1tpXS5uYW1lW2pdID09IE5VTCA/IDIgOiAxKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBidWlsdC1pbiBjb21tYW5kcyBhbmQgdXNlciBkZWZpbmVkIGNvbW1hbmRzLiAqLworICAgIGVhLmNtZCA9IG5hbWU7CisgICAgZWEuY21kaWR4ID0gKGNtZGlkeF9UKTA7CisgICAgaWYgKGZpbmRfY29tbWFuZCgmZWEsICZmdWxsKSA9PSBOVUxMKQorCXJldHVybiAzOworICAgIHJldHVybiAoZWEuY21kaWR4ID09IENNRF9TSVpFID8gMCA6IChmdWxsID8gMiA6IDEpKTsKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBpcyBhbGwgcHJldHR5IG11Y2ggY29waWVkIGZyb20gZG9fb25lX2NtZCgpLCB3aXRoIGFsbCB0aGUgZXh0cmEgc3R1ZmYKKyAqIHdlIGRvbid0IG5lZWQvd2FudCBkZWxldGVkLglNYXliZSB0aGlzIGNvdWxkIGJlIGRvbmUgYmV0dGVyIGlmIHdlIGRpZG4ndAorICogcmVwZWF0IGFsbCB0aGlzIHN0dWZmLiAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IHRoZXkgbWF5IG5vdCBzdGF5CisgKiBwZXJmZWN0bHkgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIsIGJ1dCB0aGVuIHRoZSBjb21tYW5kIGxpbmUgc3ludGF4CisgKiBwcm9iYWJseSB3b24ndCBjaGFuZ2UgdGhhdCBtdWNoIC0tIHdlYmIuCisgKi8KKyAgICBjaGFyX3UgKgorc2V0X29uZV9jbWRfY29udGV4dCh4cCwgYnVmZikKKyAgICBleHBhbmRfVAkqeHA7CisgICAgY2hhcl91CSpidWZmOwkgICAgLyogYnVmZmVyIGZvciBjb21tYW5kIHN0cmluZyAqLworeworICAgIGNoYXJfdQkJKnA7CisgICAgY2hhcl91CQkqY21kLCAqYXJnOworICAgIGludAkJCWkgPSAwOworICAgIGNtZGlkeF9UCQljbWRpZHg7CisgICAgbG9uZ191CQlhcmd0ID0gMDsKKyNpZiBkZWZpbmVkKEZFQVRfVVNSX0NNRFMpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKQorICAgIGludAkJCWNvbXBsID0gRVhQQU5EX05PVEhJTkc7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NNRExfQ09NUEwKKyAgICBpbnQJCQlkZWxpbTsKKyNlbmRpZgorICAgIGludAkJCWZvcmNlaXQgPSBGQUxTRTsKKyAgICBpbnQJCQl1c2VmaWx0ZXIgPSBGQUxTRTsgIC8qIGZpbHRlciBpbnN0ZWFkIG9mIGZpbGUgbmFtZSAqLworCisgICAgeHAtPnhwX3BhdHRlcm4gPSBidWZmOworICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0NPTU1BTkRTOwkvKiBEZWZhdWx0IHVudGlsIHdlIGdldCBwYXN0IGNvbW1hbmQgKi8KKyAgICB4cC0+eHBfYmFja3NsYXNoID0gWFBfQlNfTk9ORTsKKyNpZiBkZWZpbmVkKEZFQVRfVVNSX0NNRFMpICYmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkKKyAgICB4cC0+eHBfYXJnID0gTlVMTDsKKyNlbmRpZgorCisvKgorICogMi4gc2tpcCBjb21tZW50IGxpbmVzIGFuZCBsZWFkaW5nIHNwYWNlLCBjb2xvbnMgb3IgYmFycworICovCisgICAgZm9yIChjbWQgPSBidWZmOyB2aW1fc3RyY2hyKChjaGFyX3UgKikiIFx0OnwiLCAqY21kKSAhPSBOVUxMOyBjbWQrKykKKwk7CisgICAgeHAtPnhwX3BhdHRlcm4gPSBjbWQ7CisKKyAgICBpZiAoKmNtZCA9PSBOVUwpCisJcmV0dXJuIE5VTEw7CisgICAgaWYgKCpjbWQgPT0gJyInKQkgICAgLyogaWdub3JlIGNvbW1lbnQgbGluZXMgKi8KKyAgICB7CisJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKy8qCisgKiAzLiBwYXJzZSBhIHJhbmdlIHNwZWNpZmllciBvZiB0aGUgZm9ybTogYWRkciBbLGFkZHJdIFs7YWRkcl0gLi4KKyAqLworICAgIGNtZCA9IHNraXBfcmFuZ2UoY21kLCAmeHAtPnhwX2NvbnRleHQpOworCisvKgorICogNC4gcGFyc2UgY29tbWFuZAorICovCisKKyAgICBjbWQgPSBza2lwd2hpdGUoY21kKTsKKyAgICB4cC0+eHBfcGF0dGVybiA9IGNtZDsKKyAgICBpZiAoKmNtZCA9PSBOVUwpCisJcmV0dXJuIE5VTEw7CisgICAgaWYgKCpjbWQgPT0gJyInKQorICAgIHsKKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgqY21kID09ICd8JyB8fCAqY21kID09ICdcbicpCisJcmV0dXJuIGNtZCArIDE7CQkJLyogVGhlcmUncyBhbm90aGVyIGNvbW1hbmQgKi8KKworICAgIC8qCisgICAgICogSXNvbGF0ZSB0aGUgY29tbWFuZCBhbmQgc2VhcmNoIGZvciBpdCBpbiB0aGUgY29tbWFuZCB0YWJsZS4KKyAgICAgKiBFeGNlcHRpb25zOgorICAgICAqIC0gdGhlICdrJyBjb21tYW5kIGNhbiBkaXJlY3RseSBiZSBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyLCBidXQKKyAgICAgKiAgIGRvIGFjY2VwdCAia2VlcG1hcmtzIiBhbmQgImtlZXBqdW1wcyIuCisgICAgICogLSB0aGUgJ3MnIGNvbW1hbmQgY2FuIGJlIGZvbGxvd2VkIGRpcmVjdGx5IGJ5ICdjJywgJ2cnLCAnaScsICdJJyBvciAncicKKyAgICAgKi8KKyAgICBpZiAoKmNtZCA9PSAnaycgJiYgY21kWzFdICE9ICdlJykKKyAgICB7CisJY21kaWR4ID0gQ01EX2s7CisJcCA9IGNtZCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcCA9IGNtZDsKKwl3aGlsZSAoQVNDSUlfSVNBTFBIQSgqcCkgfHwgKnAgPT0gJyonKSAgICAvKiBBbGxvdyAqIHdpbGQgY2FyZCAqLworCSAgICArK3A7CisJLyogY2hlY2sgZm9yIG5vbi1hbHBoYSBjb21tYW5kICovCisJaWYgKHAgPT0gY21kICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJAKiE9PjwmfiMiLCAqcCkgIT0gTlVMTCkKKwkgICAgKytwOworCWkgPSAoaW50KShwIC0gY21kKTsKKworCWlmIChpID09IDApCisJeworCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9VTlNVQ0NFU1NGVUw7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlmb3IgKGNtZGlkeCA9IChjbWRpZHhfVCkwOyAoaW50KWNtZGlkeCA8IChpbnQpQ01EX1NJWkU7CisJCQkJCSBjbWRpZHggPSAoY21kaWR4X1QpKChpbnQpY21kaWR4ICsgMSkpCisJICAgIGlmIChTVFJOQ01QKGNtZG5hbWVzWyhpbnQpY21kaWR4XS5jbWRfbmFtZSwgY21kLCAoc2l6ZV90KWkpID09IDApCisJCWJyZWFrOworCisjaWZkZWYgRkVBVF9VU1JfQ01EUworCWlmIChjbWRbMF0gPj0gJ0EnICYmIGNtZFswXSA8PSAnWicpCisJeworCSAgICB3aGlsZSAoQVNDSUlfSVNBTE5VTSgqcCkgfHwgKnAgPT0gJyonKQkvKiBBbGxvdyAqIHdpbGQgY2FyZCAqLworCQkrK3A7CisJICAgIGkgPSAoaW50KShwIC0gY21kKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjdXJzb3IgaXMgdG91Y2hpbmcgdGhlIGNvbW1hbmQsIGFuZCBpdCBlbmRzIGluIGFuIGFscGhhLW51bWVyaWMKKyAgICAgKiBjaGFyYWN0ZXIsIGNvbXBsZXRlIHRoZSBjb21tYW5kIG5hbWUuCisgICAgICovCisgICAgaWYgKCpwID09IE5VTCAmJiBBU0NJSV9JU0FMTlVNKHBbLTFdKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChjbWRpZHggPT0gQ01EX1NJWkUpCisgICAgeworCWlmICgqY21kID09ICdzJyAmJiB2aW1fc3RyY2hyKChjaGFyX3UgKikiY2dyaUkiLCBjbWRbMV0pICE9IE5VTEwpCisJeworCSAgICBjbWRpZHggPSBDTURfc3Vic3RpdHV0ZTsKKwkgICAgcCA9IGNtZCArIDE7CisJfQorI2lmZGVmIEZFQVRfVVNSX0NNRFMKKwllbHNlIGlmIChjbWRbMF0gPj0gJ0EnICYmIGNtZFswXSA8PSAnWicpCisJeworCSAgICAvKiBMb29rIGZvciBhIHVzZXIgZGVmaW5lZCBjb21tYW5kIGFzIGEgbGFzdCByZXNvcnQgKi8KKwkgICAgdWNtZF9UCSp1YzsKKwkgICAgaW50CQlqLCBrLCBtYXRjaGxlbiA9IDA7CisJICAgIGludAkJZm91bmQgPSBGQUxTRSwgcG9zc2libGUgPSBGQUxTRTsKKwkgICAgY2hhcl91CSpjcCwgKm5wOwkvKiBQb2ludCBpbnRvIHR5cGVkIGNtZCBhbmQgdGVzdCBuYW1lICovCisJICAgIGdhcnJheV9UCSpnYXA7CisKKwkgICAgZ2FwID0gJmN1cmJ1Zi0+Yl91Y21kczsKKwkgICAgZm9yICg7OykKKwkgICAgeworCQl1YyA9IFVTRVJfQ01EX0dBKGdhcCwgMCk7CisJCWZvciAoaiA9IDA7IGogPCBnYXAtPmdhX2xlbjsgKytqLCArK3VjKQorCQl7CisJCSAgICBjcCA9IGNtZDsKKwkJICAgIG5wID0gdWMtPnVjX25hbWU7CisJCSAgICBrID0gMDsKKwkJICAgIHdoaWxlIChrIDwgaSAmJiAqbnAgIT0gTlVMICYmICpjcCsrID09ICpucCsrKQorCQkJaysrOworCQkgICAgaWYgKGsgPT0gaSB8fCAoKm5wID09IE5VTCAmJiBWSU1fSVNESUdJVChjbWRba10pKSkKKwkJICAgIHsKKwkJCWlmIChrID09IGkgJiYgZm91bmQpCisJCQl7CisJCQkgICAgLyogQW1iaWd1b3VzIGFiYnJldmlhdGlvbiAqLworCQkJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX1VOU1VDQ0VTU0ZVTDsKKwkJCSAgICByZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWlmICghZm91bmQpCisJCQl7CisJCQkgICAgLyogSWYgd2UgbWF0Y2hlZCB1cCB0byBhIGRpZ2l0LCB0aGVuIHRoZXJlIGNvdWxkCisJCQkgICAgICogYmUgYW5vdGhlciBjb21tYW5kIGluY2x1ZGluZyB0aGUgZGlnaXQgdGhhdCB3ZQorCQkJICAgICAqIHNob3VsZCB1c2UgaW5zdGVhZC4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAoayA9PSBpKQorCQkJCWZvdW5kID0gVFJVRTsKKwkJCSAgICBlbHNlCisJCQkJcG9zc2libGUgPSBUUlVFOworCisJCQkgICAgaWYgKGdhcCA9PSAmdWNtZHMpCisJCQkJY21kaWR4ID0gQ01EX1VTRVI7CisJCQkgICAgZWxzZQorCQkJCWNtZGlkeCA9IENNRF9VU0VSX0JVRjsKKwkJCSAgICBhcmd0ID0gdWMtPnVjX2FyZ3Q7CisjaWZkZWYgRkVBVF9DTURMX0NPTVBMCisJCQkgICAgY29tcGwgPSB1Yy0+dWNfY29tcGw7CisjIGlmZGVmIEZFQVRfRVZBTAorCQkJICAgIHhwLT54cF9hcmcgPSB1Yy0+dWNfY29tcGxfYXJnOworCQkJICAgIHhwLT54cF9zY3JpcHRJRCA9IHVjLT51Y19zY3JpcHRJRDsKKyMgZW5kaWYKKyNlbmRpZgorCQkJICAgIC8qIERvIG5vdCBzZWFyY2ggZm9yIGZ1cnRoZXIgYWJicmV2aWF0aW9ucworCQkJICAgICAqIGlmIHRoaXMgaXMgYW4gZXhhY3QgbWF0Y2gKKwkJCSAgICAgKi8KKwkJCSAgICBtYXRjaGxlbiA9IGs7CisJCQkgICAgaWYgKGsgPT0gaSAmJiAqbnAgPT0gTlVMKQorCQkJCWJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJCWlmIChnYXAgPT0gJnVjbWRzIHx8IGogPCBnYXAtPmdhX2xlbikKKwkJICAgIGJyZWFrOworCQlnYXAgPSAmdWNtZHM7CisJICAgIH0KKworCSAgICAvKiBUaGUgbWF0Y2ggd2UgZm91bmQgbWF5IGJlIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IGEKKwkgICAgICogbnVtYmVyLiAgTW92ZSAqcCBiYWNrIHRvIHBvaW50IHRvIGl0LgorCSAgICAgKi8KKwkgICAgaWYgKGZvdW5kIHx8IHBvc3NpYmxlKQorCQlwICs9IG1hdGNobGVuIC0gaTsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgaWYgKGNtZGlkeCA9PSBDTURfU0laRSkKKyAgICB7CisJLyogTm90IHN0aWxsIHRvdWNoaW5nIHRoZSBjb21tYW5kIGFuZCBpdCB3YXMgYW4gaWxsZWdhbCBvbmUgKi8KKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9VTlNVQ0NFU1NGVUw7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsgLyogRGVmYXVsdCBub3cgdGhhdCB3ZSdyZSBwYXN0IGNvbW1hbmQgKi8KKworICAgIGlmICgqcCA9PSAnIScpCQkgICAgLyogZm9yY2VkIGNvbW1hbmRzICovCisgICAgeworCWZvcmNlaXQgPSBUUlVFOworCSsrcDsKKyAgICB9CisKKy8qCisgKiA1LiBwYXJzZSBhcmd1bWVudHMKKyAqLworI2lmZGVmIEZFQVRfVVNSX0NNRFMKKyAgICBpZiAoIVVTRVJfQ01ESURYKGNtZGlkeCkpCisjZW5kaWYKKwlhcmd0ID0gY21kbmFtZXNbKGludCljbWRpZHhdLmNtZF9hcmd0OworCisgICAgYXJnID0gc2tpcHdoaXRlKHApOworCisgICAgaWYgKGNtZGlkeCA9PSBDTURfd3JpdGUgfHwgY21kaWR4ID09IENNRF91cGRhdGUpCisgICAgeworCWlmICgqYXJnID09ICc+JykJCQkvKiBhcHBlbmQgKi8KKwl7CisJICAgIGlmICgqKythcmcgPT0gJz4nKQorCQkrK2FyZzsKKwkgICAgYXJnID0gc2tpcHdoaXRlKGFyZyk7CisJfQorCWVsc2UgaWYgKCphcmcgPT0gJyEnICYmIGNtZGlkeCA9PSBDTURfd3JpdGUpCS8qIDp3ICFmaWx0ZXIgKi8KKwl7CisJICAgICsrYXJnOworCSAgICB1c2VmaWx0ZXIgPSBUUlVFOworCX0KKyAgICB9CisKKyAgICBpZiAoY21kaWR4ID09IENNRF9yZWFkKQorICAgIHsKKwl1c2VmaWx0ZXIgPSBmb3JjZWl0OwkJCS8qIDpyISBmaWx0ZXIgaWYgZm9yY2VkICovCisJaWYgKCphcmcgPT0gJyEnKQkJCS8qIDpyICFmaWx0ZXIgKi8KKwl7CisJICAgICsrYXJnOworCSAgICB1c2VmaWx0ZXIgPSBUUlVFOworCX0KKyAgICB9CisKKyAgICBpZiAoY21kaWR4ID09IENNRF9sc2hpZnQgfHwgY21kaWR4ID09IENNRF9yc2hpZnQpCisgICAgeworCXdoaWxlICgqYXJnID09ICpjbWQpCSAgICAvKiBhbGxvdyBhbnkgbnVtYmVyIG9mICc+JyBvciAnPCcgKi8KKwkgICAgKythcmc7CisJYXJnID0gc2tpcHdoaXRlKGFyZyk7CisgICAgfQorCisgICAgLyogRG9lcyBjb21tYW5kIGFsbG93ICIrY29tbWFuZCI/ICovCisgICAgaWYgKChhcmd0ICYgRURJVENNRCkgJiYgIXVzZWZpbHRlciAmJiAqYXJnID09ICcrJykKKyAgICB7CisJLyogQ2hlY2sgaWYgd2UncmUgaW4gdGhlICtjb21tYW5kICovCisJcCA9IGFyZyArIDE7CisJYXJnID0gc2tpcF9jbWRfYXJnKGFyZywgRkFMU0UpOworCisJLyogU3RpbGwgdG91Y2hpbmcgdGhlIGNvbW1hbmQgYWZ0ZXIgJysnPyAqLworCWlmICgqYXJnID09IE5VTCkKKwkgICAgcmV0dXJuIHA7CisKKwkvKiBTa2lwIHNwYWNlKHMpIGFmdGVyICtjb21tYW5kIHRvIGdldCB0byB0aGUgcmVhbCBhcmd1bWVudCAqLworCWFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yICd8JyB0byBzZXBhcmF0ZSBjb21tYW5kcyBhbmQgJyInIHRvIHN0YXJ0IGNvbW1lbnRzLgorICAgICAqIERvbid0IGRvIHRoaXMgZm9yICI6cmVhZCAhY21kIiBhbmQgIjp3cml0ZSAhY21kIi4KKyAgICAgKi8KKyAgICBpZiAoKGFyZ3QgJiBUUkxCQVIpICYmICF1c2VmaWx0ZXIpCisgICAgeworCXAgPSBhcmc7CisJLyogIjpyZWRpciBAIiBpcyBub3QgdGhlIHN0YXJ0IG9mIGEgY29tbWVudCAqLworCWlmIChjbWRpZHggPT0gQ01EX3JlZGlyICYmIHBbMF0gPT0gJ0AnICYmIHBbMV0gPT0gJyInKQorCSAgICBwICs9IDI7CisJd2hpbGUgKCpwKQorCXsKKwkgICAgaWYgKCpwID09IEN0cmxfVikKKwkgICAgeworCQlpZiAocFsxXSAhPSBOVUwpCisJCSAgICArK3A7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoICgqcCA9PSAnIicgJiYgIShhcmd0ICYgTk9UUkxDT00pKQorCQkgICAgfHwgKnAgPT0gJ3wnIHx8ICpwID09ICdcbicpCisJICAgIHsKKwkJaWYgKCoocCAtIDEpICE9ICdcXCcpCisJCXsKKwkJICAgIGlmICgqcCA9PSAnfCcgfHwgKnAgPT0gJ1xuJykKKwkJCXJldHVybiBwICsgMTsKKwkJICAgIHJldHVybiBOVUxMOyAgICAvKiBJdCdzIGEgY29tbWVudCAqLworCQl9CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCSsrcDsKKwl9CisgICAgfQorCisJCQkJCQkvKiBubyBhcmd1bWVudHMgYWxsb3dlZCAqLworICAgIGlmICghKGFyZ3QgJiBFWFRSQSkgJiYgKmFyZyAhPSBOVUwgJiYKKwkJCQkgICAgdmltX3N0cmNocigoY2hhcl91ICopInxcIiIsICphcmcpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBGaW5kIHN0YXJ0IG9mIGxhc3QgYXJndW1lbnQgKGFyZ3VtZW50IGp1c3QgYmVmb3JlIGN1cnNvcik6ICovCisgICAgcCA9IGJ1ZmYgKyBTVFJMRU4oYnVmZik7CisgICAgd2hpbGUgKHAgIT0gYXJnICYmICpwICE9ICcgJyAmJiAqcCAhPSBUQUIpCisJcC0tOworICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gVEFCKQorCXArKzsKKyAgICB4cC0+eHBfcGF0dGVybiA9IHA7CisKKyAgICBpZiAoYXJndCAmIFhGSUxFKQorICAgIHsKKwlpbnQgaW5fcXVvdGUgPSBGQUxTRTsKKwljaGFyX3UgKmJvdyA9IE5VTEw7CS8qIEJlZ2lubmluZyBvZiB3b3JkICovCisKKwkvKgorCSAqIEFsbG93IHNwYWNlcyB3aXRoaW4gYmFjay1xdW90ZXMgdG8gY291bnQgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQKKwkgKiBiZWluZyBleHBhbmRlZC4KKwkgKi8KKwl4cC0+eHBfcGF0dGVybiA9IHNraXB3aGl0ZShhcmcpOworCWZvciAocCA9IHhwLT54cF9wYXR0ZXJuOyAqcDsgKQorCXsKKwkgICAgaWYgKCpwID09ICdcXCcgJiYgcFsxXSkKKwkJKytwOworI2lmZGVmIFNQQUNFX0lOX0ZJTEVOQU1FCisJICAgIGVsc2UgaWYgKHZpbV9pc3doaXRlKCpwKSAmJiAoIShhcmd0ICYgTk9TUEMpIHx8IHVzZWZpbHRlcikpCisjZWxzZQorCSAgICBlbHNlIGlmICh2aW1faXN3aGl0ZSgqcCkpCisjZW5kaWYKKwkgICAgeworCQlwID0gc2tpcHdoaXRlKHApOworCQlpZiAoaW5fcXVvdGUpCisJCSAgICBib3cgPSBwOworCQllbHNlCisJCSAgICB4cC0+eHBfcGF0dGVybiA9IHA7CisJCS0tcDsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqcCA9PSAnYCcpCisJICAgIHsKKwkJaWYgKCFpbl9xdW90ZSkKKwkJeworCQkgICAgeHAtPnhwX3BhdHRlcm4gPSBwOworCQkgICAgYm93ID0gcCArIDE7CisJCX0KKwkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCSsrcDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSBzdGlsbCBpbnNpZGUgdGhlIHF1b3RlcywgYW5kIHdlIHBhc3NlZCBhIHNwYWNlLCBqdXN0CisJICogZXhwYW5kIGZyb20gdGhlcmUuCisJICovCisJaWYgKGJvdyAhPSBOVUxMICYmIGluX3F1b3RlKQorCSAgICB4cC0+eHBfcGF0dGVybiA9IGJvdzsKKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9GSUxFUzsKKworCS8qIENoZWNrIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCWlmICgqeHAtPnhwX3BhdHRlcm4gPT0gJyQnCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpCisJCXx8ICp4cC0+eHBfcGF0dGVybiA9PSAnJScKKyNlbmRpZgorCQkpCisJeworCSAgICBmb3IgKHAgPSB4cC0+eHBfcGF0dGVybiArIDE7ICpwICE9IE5VTDsgKytwKQorCQlpZiAoIXZpbV9pc0lEYygqcCkpCisJCSAgICBicmVhazsKKwkgICAgaWYgKCpwID09IE5VTCkKKwkgICAgeworCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9FTlZfVkFSUzsKKwkJKyt4cC0+eHBfcGF0dGVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKy8qCisgKiA2LiBzd2l0Y2ggb24gY29tbWFuZCBuYW1lCisgKi8KKyAgICBzd2l0Y2ggKGNtZGlkeCkKKyAgICB7CisJY2FzZSBDTURfY2Q6CisJY2FzZSBDTURfY2hkaXI6CisJY2FzZSBDTURfbGNkOgorCWNhc2UgQ01EX2xjaGRpcjoKKwkgICAgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9GSUxFUykKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfRElSRUNUT1JJRVM7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX2hlbHA6CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0hFTFA7CisJICAgIHhwLT54cF9wYXR0ZXJuID0gYXJnOworCSAgICBicmVhazsKKworCS8qIENvbW1hbmQgbW9kaWZpZXJzOiByZXR1cm4gdGhlIGFyZ3VtZW50LiAqLworCWNhc2UgQ01EX2Fib3ZlbGVmdDoKKwljYXNlIENNRF9iZWxvd3JpZ2h0OgorCWNhc2UgQ01EX2JvdHJpZ2h0OgorCWNhc2UgQ01EX2Jyb3dzZToKKwljYXNlIENNRF9jb25maXJtOgorCWNhc2UgQ01EX2ZvbGRkb2Nsb3NlZDoKKwljYXNlIENNRF9mb2xkZG9vcGVuOgorCWNhc2UgQ01EX2hpZGU6CisJY2FzZSBDTURfa2VlcGp1bXBzOgorCWNhc2UgQ01EX2tlZXBtYXJrczoKKwljYXNlIENNRF9sZWZ0YWJvdmU6CisJY2FzZSBDTURfbG9ja21hcmtzOgorCWNhc2UgQ01EX3JpZ2h0YmVsb3c6CisJY2FzZSBDTURfc2lsZW50OgorCWNhc2UgQ01EX3RvcGxlZnQ6CisJY2FzZSBDTURfdmVyYm9zZToKKwljYXNlIENNRF92ZXJ0aWNhbDoKKwkgICAgcmV0dXJuIGFyZzsKKworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJY2FzZSBDTURfbWF0Y2g6CisJICAgIGlmICgqYXJnID09IE5VTCB8fCAhZW5kc19leGNtZCgqYXJnKSkKKwkgICAgeworCQkvKiBEdW1teSBjYWxsIHRvIGNsZWFyIHZhcmlhYmxlcy4gKi8KKwkJc2V0X2NvbnRleHRfaW5faGlnaGxpZ2h0X2NtZCh4cCwgKGNoYXJfdSAqKSJsaW5rIG4iKTsKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfSElHSExJR0hUOworCQl4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkJYXJnID0gc2tpcHdoaXRlKHNraXB0b3doaXRlKGFyZykpOworCQlpZiAoKmFyZyAhPSBOVUwpCisJCXsKKwkJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX05PVEhJTkc7CisJCSAgICBhcmcgPSBza2lwX3JlZ2V4cChhcmcgKyAxLCAqYXJnLCBwX21hZ2ljLCBOVUxMKTsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBmaW5kX25leHRjbWQoYXJnKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DTURMX0NPTVBMCisvKgorICogQWxsIGNvbXBsZXRpb24gZm9yIHRoZSArY21kbGluZV9jb21wbCBmZWF0dXJlIGdvZXMgaGVyZS4KKyAqLworCisjIGlmZGVmIEZFQVRfVVNSX0NNRFMKKwljYXNlIENNRF9jb21tYW5kOgorCSAgICAvKiBDaGVjayBmb3IgYXR0cmlidXRlcyAqLworCSAgICB3aGlsZSAoKmFyZyA9PSAnLScpCisJICAgIHsKKwkJYXJnKys7CSAgICAvKiBTa2lwICItIiAqLworCQlwID0gc2tpcHRvd2hpdGUoYXJnKTsKKwkJaWYgKCpwID09IE5VTCkKKwkJeworCQkgICAgLyogQ3Vyc29yIGlzIHN0aWxsIGluIHRoZSBhdHRyaWJ1dGUgKi8KKwkJICAgIHAgPSB2aW1fc3RyY2hyKGFyZywgJz0nKTsKKwkJICAgIGlmIChwID09IE5VTEwpCisJCSAgICB7CisJCQkvKiBObyAiPSIsIHNvIGNvbXBsZXRlIGF0dHJpYnV0ZSBuYW1lcyAqLworCQkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfVVNFUl9DTURfRkxBR1M7CisJCQl4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkJCXJldHVybiBOVUxMOworCQkgICAgfQorCisJCSAgICAvKiBGb3IgdGhlIC1jb21wbGV0ZSBhbmQgLW5hcmdzIGF0dHJpYnV0ZXMsIHdlIGNvbXBsZXRlCisJCSAgICAgKiB0aGVpciBhcmd1bWVudHMgYXMgd2VsbC4KKwkJICAgICAqLworCQkgICAgaWYgKFNUUk5JQ01QKGFyZywgImNvbXBsZXRlIiwgcCAtIGFyZykgPT0gMCkKKwkJICAgIHsKKwkJCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX1VTRVJfQ09NUExFVEU7CisJCQl4cC0+eHBfcGF0dGVybiA9IHAgKyAxOworCQkJcmV0dXJuIE5VTEw7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChTVFJOSUNNUChhcmcsICJuYXJncyIsIHAgLSBhcmcpID09IDApCisJCSAgICB7CisJCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9VU0VSX05BUkdTOworCQkJeHAtPnhwX3BhdHRlcm4gPSBwICsgMTsKKwkJCXJldHVybiBOVUxMOworCQkgICAgfQorCQkgICAgcmV0dXJuIE5VTEw7CisJCX0KKwkJYXJnID0gc2tpcHdoaXRlKHApOworCSAgICB9CisKKwkgICAgLyogQWZ0ZXIgdGhlIGF0dHJpYnV0ZXMgY29tZXMgdGhlIG5ldyBjb21tYW5kIG5hbWUgKi8KKwkgICAgcCA9IHNraXB0b3doaXRlKGFyZyk7CisJICAgIGlmICgqcCA9PSBOVUwpCisJICAgIHsKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfVVNFUl9DT01NQU5EUzsKKwkJeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyogQW5kIGZpbmFsbHkgY29tZXMgYSBub3JtYWwgY29tbWFuZCAqLworCSAgICByZXR1cm4gc2tpcHdoaXRlKHApOworCisJY2FzZSBDTURfZGVsY29tbWFuZDoKKwkgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfVVNFUl9DT01NQU5EUzsKKwkgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJICAgIGJyZWFrOworIyBlbmRpZgorCisJY2FzZSBDTURfZ2xvYmFsOgorCWNhc2UgQ01EX3ZnbG9iYWw6CisJICAgIGRlbGltID0gKmFyZzsJICAgIC8qIGdldCB0aGUgZGVsaW1pdGVyICovCisJICAgIGlmIChkZWxpbSkKKwkJKythcmc7CQkgICAgLyogc2tpcCBkZWxpbWl0ZXIgaWYgdGhlcmUgaXMgb25lICovCisKKwkgICAgd2hpbGUgKGFyZ1swXSAhPSBOVUwgJiYgYXJnWzBdICE9IGRlbGltKQorCSAgICB7CisJCWlmIChhcmdbMF0gPT0gJ1xcJyAmJiBhcmdbMV0gIT0gTlVMKQorCQkgICAgKythcmc7CisJCSsrYXJnOworCSAgICB9CisJICAgIGlmIChhcmdbMF0gIT0gTlVMKQorCQlyZXR1cm4gYXJnICsgMTsKKwkgICAgYnJlYWs7CisJY2FzZSBDTURfYW5kOgorCWNhc2UgQ01EX3N1YnN0aXR1dGU6CisJICAgIGRlbGltID0gKmFyZzsKKwkgICAgaWYgKGRlbGltKQorCSAgICB7CisJCS8qIHNraXAgImZyb20iIHBhcnQgKi8KKwkJKythcmc7CisJCWFyZyA9IHNraXBfcmVnZXhwKGFyZywgZGVsaW0sIHBfbWFnaWMsIE5VTEwpOworCSAgICB9CisJICAgIC8qIHNraXAgInRvIiBwYXJ0ICovCisJICAgIHdoaWxlIChhcmdbMF0gIT0gTlVMICYmIGFyZ1swXSAhPSBkZWxpbSkKKwkgICAgeworCQlpZiAoYXJnWzBdID09ICdcXCcgJiYgYXJnWzFdICE9IE5VTCkKKwkJICAgICsrYXJnOworCQkrK2FyZzsKKwkgICAgfQorCSAgICBpZiAoYXJnWzBdICE9IE5VTCkJLyogc2tpcCBkZWxpbWl0ZXIgKi8KKwkJKythcmc7CisJICAgIHdoaWxlIChhcmdbMF0gJiYgdmltX3N0cmNocigoY2hhcl91ICopInxcIiMiLCBhcmdbMF0pID09IE5VTEwpCisJCSsrYXJnOworCSAgICBpZiAoYXJnWzBdICE9IE5VTCkKKwkJcmV0dXJuIGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBDTURfaXNlYXJjaDoKKwljYXNlIENNRF9kc2VhcmNoOgorCWNhc2UgQ01EX2lsaXN0OgorCWNhc2UgQ01EX2RsaXN0OgorCWNhc2UgQ01EX2lqdW1wOgorCWNhc2UgQ01EX3BzZWFyY2g6CisJY2FzZSBDTURfZGp1bXA6CisJY2FzZSBDTURfaXNwbGl0OgorCWNhc2UgQ01EX2RzcGxpdDoKKwkgICAgYXJnID0gc2tpcHdoaXRlKHNraXBkaWdpdHMoYXJnKSk7CSAgICAvKiBza2lwIGNvdW50ICovCisJICAgIGlmICgqYXJnID09ICcvJykJLyogTWF0Y2ggcmVnZXhwLCBub3QganVzdCB3aG9sZSB3b3JkcyAqLworCSAgICB7CisJCWZvciAoKythcmc7ICphcmcgJiYgKmFyZyAhPSAnLyc7IGFyZysrKQorCQkgICAgaWYgKCphcmcgPT0gJ1xcJyAmJiBhcmdbMV0gIT0gTlVMKQorCQkJYXJnKys7CisJCWlmICgqYXJnKQorCQl7CisJCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnICsgMSk7CisKKwkJICAgIC8qIENoZWNrIGZvciB0cmFpbGluZyBpbGxlZ2FsIGNoYXJhY3RlcnMgKi8KKwkJICAgIGlmICgqYXJnICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJ8XCJcbiIsICphcmcpID09IE5VTEwpCisJCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCQkgICAgZWxzZQorCQkJcmV0dXJuIGFyZzsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWNhc2UgQ01EX2F1dG9jbWQ6CisJICAgIHJldHVybiBzZXRfY29udGV4dF9pbl9hdXRvY21kKHhwLCBhcmcsIEZBTFNFKTsKKworCWNhc2UgQ01EX2RvYXV0b2NtZDoKKwkgICAgcmV0dXJuIHNldF9jb250ZXh0X2luX2F1dG9jbWQoeHAsIGFyZywgVFJVRSk7CisjZW5kaWYKKwljYXNlIENNRF9zZXQ6CisJICAgIHNldF9jb250ZXh0X2luX3NldF9jbWQoeHAsIGFyZywgMCk7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX3NldGdsb2JhbDoKKwkgICAgc2V0X2NvbnRleHRfaW5fc2V0X2NtZCh4cCwgYXJnLCBPUFRfR0xPQkFMKTsKKwkgICAgYnJlYWs7CisJY2FzZSBDTURfc2V0bG9jYWw6CisJICAgIHNldF9jb250ZXh0X2luX3NldF9jbWQoeHAsIGFyZywgT1BUX0xPQ0FMKTsKKwkgICAgYnJlYWs7CisJY2FzZSBDTURfdGFnOgorCWNhc2UgQ01EX3N0YWc6CisJY2FzZSBDTURfcHRhZzoKKwljYXNlIENNRF90c2VsZWN0OgorCWNhc2UgQ01EX3N0c2VsZWN0OgorCWNhc2UgQ01EX3B0c2VsZWN0OgorCWNhc2UgQ01EX3RqdW1wOgorCWNhc2UgQ01EX3N0anVtcDoKKwljYXNlIENNRF9wdGp1bXA6CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX1RBR1M7CisJICAgIHhwLT54cF9wYXR0ZXJuID0gYXJnOworCSAgICBicmVhazsKKwljYXNlIENNRF9hdWdyb3VwOgorCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9BVUdST1VQOworCSAgICB4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9TWU5fSEwKKwljYXNlIENNRF9zeW50YXg6CisJICAgIHNldF9jb250ZXh0X2luX3N5bnRheF9jbWQoeHAsIGFyZyk7CisJICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRkVBVF9FVkFMCisJY2FzZSBDTURfbGV0OgorCWNhc2UgQ01EX2lmOgorCWNhc2UgQ01EX2Vsc2VpZjoKKwljYXNlIENNRF93aGlsZToKKwljYXNlIENNRF9lY2hvOgorCWNhc2UgQ01EX2VjaG9uOgorCWNhc2UgQ01EX2V4ZWN1dGU6CisJY2FzZSBDTURfZWNob21zZzoKKwljYXNlIENNRF9lY2hvZXJyOgorCWNhc2UgQ01EX2NhbGw6CisJY2FzZSBDTURfcmV0dXJuOgorCSAgICBzZXRfY29udGV4dF9mb3JfZXhwcmVzc2lvbih4cCwgYXJnLCBjbWRpZHgpOworCSAgICBicmVhazsKKworCWNhc2UgQ01EX3VubGV0OgorCSAgICB3aGlsZSAoKHhwLT54cF9wYXR0ZXJuID0gdmltX3N0cmNocihhcmcsICcgJykpICE9IE5VTEwpCisJCWFyZyA9IHhwLT54cF9wYXR0ZXJuICsgMTsKKwkgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfVVNFUl9WQVJTOworCSAgICB4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIENNRF9mdW5jdGlvbjoKKwljYXNlIENNRF9kZWxmdW5jdGlvbjoKKwkgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfVVNFUl9GVU5DOworCSAgICB4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIENNRF9lY2hvaGw6CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0hJR0hMSUdIVDsKKwkgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJICAgIGJyZWFrOworI2VuZGlmCisJY2FzZSBDTURfaGlnaGxpZ2h0OgorCSAgICBzZXRfY29udGV4dF9pbl9oaWdobGlnaHRfY21kKHhwLCBhcmcpOworCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisJY2FzZSBDTURfYmRlbGV0ZToKKwljYXNlIENNRF9id2lwZW91dDoKKwljYXNlIENNRF9idW5sb2FkOgorCSAgICB3aGlsZSAoKHhwLT54cF9wYXR0ZXJuID0gdmltX3N0cmNocihhcmcsICcgJykpICE9IE5VTEwpCisJCWFyZyA9IHhwLT54cF9wYXR0ZXJuICsgMTsKKwkgICAgLypGQUxMVEhST1VHSCovCisJY2FzZSBDTURfYnVmZmVyOgorCWNhc2UgQ01EX3NidWZmZXI6CisJY2FzZSBDTURfY2hlY2t0aW1lOgorCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9CVUZGRVJTOworCSAgICB4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1VTUl9DTURTCisJY2FzZSBDTURfVVNFUjoKKwljYXNlIENNRF9VU0VSX0JVRjoKKwkgICAgaWYgKGNvbXBsICE9IEVYUEFORF9OT1RISU5HKQorCSAgICB7CisJCS8qIFhGSUxFOiBmaWxlIG5hbWVzIGFyZSBoYW5kbGVkIGFib3ZlICovCisJCWlmICghKGFyZ3QgJiBYRklMRSkpCisJCXsKKyMgaWZkZWYgRkVBVF9NRU5VCisJCSAgICBpZiAoY29tcGwgPT0gRVhQQU5EX01FTlVTKQorCQkJcmV0dXJuIHNldF9jb250ZXh0X2luX21lbnVfY21kKHhwLCBjbWQsIGFyZywgZm9yY2VpdCk7CisjIGVuZGlmCisJCSAgICBpZiAoY29tcGwgPT0gRVhQQU5EX0NPTU1BTkRTKQorCQkJcmV0dXJuIGFyZzsKKwkJICAgIGlmIChjb21wbCA9PSBFWFBBTkRfTUFQUElOR1MpCisJCQlyZXR1cm4gc2V0X2NvbnRleHRfaW5fbWFwX2NtZCh4cCwgKGNoYXJfdSAqKSJtYXAiLAorCQkJCQkgYXJnLCBmb3JjZWl0LCBGQUxTRSwgRkFMU0UsIENNRF9tYXApOworCQkgICAgd2hpbGUgKCh4cC0+eHBfcGF0dGVybiA9IHZpbV9zdHJjaHIoYXJnLCAnICcpKSAhPSBOVUxMKQorCQkJYXJnID0geHAtPnhwX3BhdHRlcm4gKyAxOworCQkgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJCX0KKwkJeHAtPnhwX2NvbnRleHQgPSBjb21wbDsKKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZgorCWNhc2UgQ01EX21hcDoJICAgIGNhc2UgQ01EX25vcmVtYXA6CisJY2FzZSBDTURfbm1hcDoJICAgIGNhc2UgQ01EX25ub3JlbWFwOgorCWNhc2UgQ01EX3ZtYXA6CSAgICBjYXNlIENNRF92bm9yZW1hcDoKKwljYXNlIENNRF9vbWFwOgkgICAgY2FzZSBDTURfb25vcmVtYXA6CisJY2FzZSBDTURfaW1hcDoJICAgIGNhc2UgQ01EX2lub3JlbWFwOgorCWNhc2UgQ01EX2NtYXA6CSAgICBjYXNlIENNRF9jbm9yZW1hcDoKKwkgICAgcmV0dXJuIHNldF9jb250ZXh0X2luX21hcF9jbWQoeHAsIGNtZCwgYXJnLCBmb3JjZWl0LAorCQkJCQkJCUZBTFNFLCBGQUxTRSwgY21kaWR4KTsKKwljYXNlIENNRF91bm1hcDoKKwljYXNlIENNRF9udW5tYXA6CisJY2FzZSBDTURfdnVubWFwOgorCWNhc2UgQ01EX291bm1hcDoKKwljYXNlIENNRF9pdW5tYXA6CisJY2FzZSBDTURfY3VubWFwOgorCSAgICByZXR1cm4gc2V0X2NvbnRleHRfaW5fbWFwX2NtZCh4cCwgY21kLCBhcmcsIGZvcmNlaXQsCisJCQkJCQkJIEZBTFNFLCBUUlVFLCBjbWRpZHgpOworCWNhc2UgQ01EX2FiYnJldmlhdGU6CWNhc2UgQ01EX25vcmVhYmJyZXY6CisJY2FzZSBDTURfY2FiYnJldjoJY2FzZSBDTURfY25vcmVhYmJyZXY6CisJY2FzZSBDTURfaWFiYnJldjoJY2FzZSBDTURfaW5vcmVhYmJyZXY6CisJICAgIHJldHVybiBzZXRfY29udGV4dF9pbl9tYXBfY21kKHhwLCBjbWQsIGFyZywgZm9yY2VpdCwKKwkJCQkJCQkgVFJVRSwgRkFMU0UsIGNtZGlkeCk7CisJY2FzZSBDTURfdW5hYmJyZXZpYXRlOgorCWNhc2UgQ01EX2N1bmFiYnJldjoKKwljYXNlIENNRF9pdW5hYmJyZXY6CisJICAgIHJldHVybiBzZXRfY29udGV4dF9pbl9tYXBfY21kKHhwLCBjbWQsIGFyZywgZm9yY2VpdCwKKwkJCQkJCQkgIFRSVUUsIFRSVUUsIGNtZGlkeCk7CisjaWZkZWYgRkVBVF9NRU5VCisJY2FzZSBDTURfbWVudToJICAgIGNhc2UgQ01EX25vcmVtZW51OgkgICAgY2FzZSBDTURfdW5tZW51OgorCWNhc2UgQ01EX2FtZW51OgkgICAgY2FzZSBDTURfYW5vcmVtZW51OgkgICAgY2FzZSBDTURfYXVubWVudToKKwljYXNlIENNRF9ubWVudToJICAgIGNhc2UgQ01EX25ub3JlbWVudToJICAgIGNhc2UgQ01EX251bm1lbnU6CisJY2FzZSBDTURfdm1lbnU6CSAgICBjYXNlIENNRF92bm9yZW1lbnU6CSAgICBjYXNlIENNRF92dW5tZW51OgorCWNhc2UgQ01EX29tZW51OgkgICAgY2FzZSBDTURfb25vcmVtZW51OgkgICAgY2FzZSBDTURfb3VubWVudToKKwljYXNlIENNRF9pbWVudToJICAgIGNhc2UgQ01EX2lub3JlbWVudToJICAgIGNhc2UgQ01EX2l1bm1lbnU6CisJY2FzZSBDTURfY21lbnU6CSAgICBjYXNlIENNRF9jbm9yZW1lbnU6CSAgICBjYXNlIENNRF9jdW5tZW51OgorCWNhc2UgQ01EX3RtZW51OgkJCQkgICAgY2FzZSBDTURfdHVubWVudToKKwljYXNlIENNRF9wb3B1cDoJICAgIGNhc2UgQ01EX3RlYXJvZmY6CSAgICBjYXNlIENNRF9lbWVudToKKwkgICAgcmV0dXJuIHNldF9jb250ZXh0X2luX21lbnVfY21kKHhwLCBjbWQsIGFyZywgZm9yY2VpdCk7CisjZW5kaWYKKworCWNhc2UgQ01EX2NvbG9yc2NoZW1lOgorCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9DT0xPUlM7CisJICAgIHhwLT54cF9wYXR0ZXJuID0gYXJnOworCSAgICBicmVhazsKKworCWNhc2UgQ01EX2NvbXBpbGVyOgorCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9DT01QSUxFUjsKKwkgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJICAgIGJyZWFrOworCisjaWYgKGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkpIFwKKwkmJiAoZGVmaW5lZChGRUFUX0dFVFRFWFQpIHx8IGRlZmluZWQoRkVBVF9NQllURSkpCisJY2FzZSBDTURfbGFuZ3VhZ2U6CisJICAgIGlmICgqc2tpcHRvd2hpdGUoYXJnKSA9PSBOVUwpCisJICAgIHsKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTEFOR1VBR0U7CisJCXhwLT54cF9wYXR0ZXJuID0gYXJnOworCSAgICB9CisJICAgIGVsc2UKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfQ01ETF9DT01QTCAqLworCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogc2tpcCBhIHJhbmdlIHNwZWNpZmllciBvZiB0aGUgZm9ybTogYWRkciBbLGFkZHJdIFs7YWRkcl0gLi4KKyAqCisgKiBCYWNrc2xhc2hlZCBkZWxpbWl0ZXJzIGFmdGVyIC8gb3IgPyB3aWxsIGJlIHNraXBwZWQsIGFuZCBjb21tYW5kcyB3aWxsCisgKiBub3QgYmUgZXhwYW5kZWQgYmV0d2VlbiAvJ3MgYW5kID8ncyBvciBhZnRlciAiJyIuCisgKgorICogUmV0dXJucyB0aGUgImNtZCIgcG9pbnRlciBhZHZhbmNlZCB0byBiZXlvbmQgdGhlIHJhbmdlLgorICovCisgICAgY2hhcl91ICoKK3NraXBfcmFuZ2UoY21kLCBjdHgpCisgICAgY2hhcl91CSpjbWQ7CisgICAgaW50CQkqY3R4OwkvKiBwb2ludGVyIHRvIHhwX2NvbnRleHQgb3IgTlVMTCAqLworeworICAgIGludAkJZGVsaW07CisKKyAgICB3aGlsZSAoKmNtZCAhPSBOVUwgJiYgKHZpbV9pc3NwYWNlKCpjbWQpIHx8IFZJTV9JU0RJR0lUKCpjbWQpIHx8CisJCQkgICAgdmltX3N0cmNocigoY2hhcl91ICopIi4kJScvPy0rLDsiLCAqY21kKSAhPSBOVUxMKSkKKyAgICB7CisJaWYgKCpjbWQgPT0gJ1wnJykKKwl7CisJICAgIGlmICgqKytjbWQgPT0gTlVMICYmIGN0eCAhPSBOVUxMKQorCQkqY3R4ID0gRVhQQU5EX05PVEhJTkc7CisJfQorCWVsc2UgaWYgKCpjbWQgPT0gJy8nIHx8ICpjbWQgPT0gJz8nKQorCXsKKwkgICAgZGVsaW0gPSAqY21kKys7CisJICAgIHdoaWxlICgqY21kICE9IE5VTCAmJiAqY21kICE9IGRlbGltKQorCQlpZiAoKmNtZCsrID09ICdcXCcgJiYgKmNtZCAhPSBOVUwpCisJCSAgICArK2NtZDsKKwkgICAgaWYgKCpjbWQgPT0gTlVMICYmIGN0eCAhPSBOVUxMKQorCQkqY3R4ID0gRVhQQU5EX05PVEhJTkc7CisJfQorCWlmICgqY21kICE9IE5VTCkKKwkgICAgKytjbWQ7CisgICAgfQorICAgIHJldHVybiBjbWQ7Cit9CisKKy8qCisgKiBnZXQgYSBzaW5nbGUgRVggYWRkcmVzcworICoKKyAqIFNldCBwdHIgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyIHRoZSBwYXJ0IHRoYXQgd2FzIGludGVycHJldGVkLgorICogU2V0IHB0ciB0byBOVUxMIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKgorICogUmV0dXJuIE1BWExOVU0gd2hlbiBubyBFeCBhZGRyZXNzIHdhcyBmb3VuZC4KKyAqLworICAgIHN0YXRpYyBsaW5lbnJfVAorZ2V0X2FkZHJlc3MocHRyLCBza2lwLCB0b19vdGhlcl9maWxlKQorICAgIGNoYXJfdQkqKnB0cjsKKyAgICBpbnQJCXNraXA7CSAgICAvKiBvbmx5IHNraXAgdGhlIGFkZHJlc3MsIGRvbid0IHVzZSBpdCAqLworICAgIGludAkJdG9fb3RoZXJfZmlsZTsgIC8qIGZsYWc6IG1heSBqdW1wIHRvIG90aGVyIGZpbGUgKi8KK3sKKyAgICBpbnQJCWM7CisgICAgaW50CQlpOworICAgIGxvbmcJbjsKKyAgICBjaGFyX3UJKmNtZDsKKyAgICBwb3NfVAlwb3M7CisgICAgcG9zX1QJKmZwOworICAgIGxpbmVucl9UCWxudW07CisKKyAgICBjbWQgPSBza2lwd2hpdGUoKnB0cik7CisgICAgbG51bSA9IE1BWExOVU07CisgICAgZG8KKyAgICB7CisJc3dpdGNoICgqY21kKQorCXsKKwkgICAgY2FzZSAnLic6CQkJICAgIC8qICcuJyAtIEN1cnNvciBwb3NpdGlvbiAqLworCQkJKytjbWQ7CisJCQlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJYnJlYWs7CisKKwkgICAgY2FzZSAnJCc6CQkJICAgIC8qICckJyAtIGxhc3QgbGluZSAqLworCQkJKytjbWQ7CisJCQlsbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCQlicmVhazsKKworCSAgICBjYXNlICdcJyc6CQkJICAgIC8qICcnJyAtIG1hcmsgKi8KKwkJCWlmICgqKytjbWQgPT0gTlVMKQorCQkJeworCQkJICAgIGNtZCA9IE5VTEw7CisJCQkgICAgZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChza2lwKQorCQkJICAgICsrY21kOworCQkJZWxzZQorCQkJeworCQkJICAgIC8qIE9ubHkgYWNjZXB0IGEgbWFyayBpbiBhbm90aGVyIGZpbGUgd2hlbiBpdCBpcworCQkJICAgICAqIHVzZWQgYnkgaXRzZWxmOiAiOidNIi4gKi8KKwkJCSAgICBmcCA9IGdldG1hcmsoKmNtZCwgdG9fb3RoZXJfZmlsZSAmJiBjbWRbMV0gPT0gTlVMKTsKKwkJCSAgICArK2NtZDsKKwkJCSAgICBpZiAoZnAgPT0gKHBvc19UICopLTEpCisJCQkJLyogSnVtcGVkIHRvIGFub3RoZXIgZmlsZS4gKi8KKwkJCQlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJaWYgKGNoZWNrX21hcmsoZnApID09IEZBSUwpCisJCQkJeworCQkJCSAgICBjbWQgPSBOVUxMOworCQkJCSAgICBnb3RvIGVycm9yOworCQkJCX0KKwkJCQlsbnVtID0gZnAtPmxudW07CisJCQkgICAgfQorCQkJfQorCQkJYnJlYWs7CisKKwkgICAgY2FzZSAnLyc6CisJICAgIGNhc2UgJz8nOgkJCS8qICcvJyBvciAnPycgLSBzZWFyY2ggKi8KKwkJCWMgPSAqY21kKys7CisJCQlpZiAoc2tpcCkJLyogc2tpcCAiL3BhdC8iICovCisJCQl7CisJCQkgICAgY21kID0gc2tpcF9yZWdleHAoY21kLCBjLCAoaW50KXBfbWFnaWMsIE5VTEwpOworCQkJICAgIGlmICgqY21kID09IGMpCisJCQkJKytjbWQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgcG9zID0gY3Vyd2luLT53X2N1cnNvcjsgLyogc2F2ZSBjdXJ3aW4tPndfY3Vyc29yICovCisJCQkgICAgLyoKKwkJCSAgICAgKiBXaGVuICcvJyBvciAnPycgZm9sbG93cyBhbm90aGVyIGFkZHJlc3MsIHN0YXJ0CisJCQkgICAgICogZnJvbSB0aGVyZS4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAobG51bSAhPSBNQVhMTlVNKQorCQkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJCQkgICAgLyoKKwkJCSAgICAgKiBTdGFydCBhIGZvcndhcmQgc2VhcmNoIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuCisJCQkgICAgICogU3RhcnQgYSBiYWNrd2FyZCBzZWFyY2ggYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorCQkJICAgICAqIFRoaXMgbWFrZXMgc3VyZSB3ZSBuZXZlciBtYXRjaCBpbiB0aGUgY3VycmVudAorCQkJICAgICAqIGxpbmUsIGFuZCBjYW4gbWF0Y2ggYW55d2hlcmUgaW4gdGhlCisJCQkgICAgICogbmV4dC9wcmV2aW91cyBsaW5lLgorCQkJICAgICAqLworCQkJICAgIGlmIChjID09ICcvJykKKwkJCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IE1BWENPTDsKKwkJCSAgICBlbHNlCisJCQkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCQkJICAgIHNlYXJjaGNtZGxlbiA9IDA7CisJCQkgICAgaWYgKCFkb19zZWFyY2goTlVMTCwgYywgY21kLCAxTCwKKwkJCQkgICAgICBTRUFSQ0hfSElTICsgU0VBUkNIX01TRyArIFNFQVJDSF9TVEFSVCkpCisJCQkgICAgeworCQkJCWN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisJCQkJY21kID0gTlVMTDsKKwkJCQlnb3RvIGVycm9yOworCQkJICAgIH0KKwkJCSAgICBsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJICAgIGN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisJCQkgICAgLyogYWRqdXN0IGNvbW1hbmQgc3RyaW5nIHBvaW50ZXIgKi8KKwkJCSAgICBjbWQgKz0gc2VhcmNoY21kbGVuOworCQkJfQorCQkJYnJlYWs7CisKKwkgICAgY2FzZSAnXFwnOgkJICAgIC8qICJcPyIsICJcLyIgb3IgIlwmIiwgcmVwZWF0IHNlYXJjaCAqLworCQkJKytjbWQ7CisJCQlpZiAoKmNtZCA9PSAnJicpCisJCQkgICAgaSA9IFJFX1NVQlNUOworCQkJZWxzZSBpZiAoKmNtZCA9PSAnPycgfHwgKmNtZCA9PSAnLycpCisJCQkgICAgaSA9IFJFX1NFQVJDSDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBFTVNHKF8oZV9iYWNrc2xhc2gpKTsKKwkJCSAgICBjbWQgPSBOVUxMOworCQkJICAgIGdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmICghc2tpcCkKKwkJCXsKKwkJCSAgICAvKgorCQkJICAgICAqIFdoZW4gc2VhcmNoIGZvbGxvd3MgYW5vdGhlciBhZGRyZXNzLCBzdGFydCBmcm9tCisJCQkgICAgICogdGhlcmUuCisJCQkgICAgICovCisJCQkgICAgaWYgKGxudW0gIT0gTUFYTE5VTSkKKwkJCQlwb3MubG51bSA9IGxudW07CisJCQkgICAgZWxzZQorCQkJCXBvcy5sbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCisJCQkgICAgLyoKKwkJCSAgICAgKiBTdGFydCB0aGUgc2VhcmNoIGp1c3QgbGlrZSBmb3IgdGhlIGFib3ZlCisJCQkgICAgICogZG9fc2VhcmNoKCkuCisJCQkgICAgICovCisJCQkgICAgaWYgKCpjbWQgIT0gJz8nKQorCQkJCXBvcy5jb2wgPSBNQVhDT0w7CisJCQkgICAgZWxzZQorCQkJCXBvcy5jb2wgPSAwOworCQkJICAgIGlmIChzZWFyY2hpdChjdXJ3aW4sIGN1cmJ1ZiwgJnBvcywKKwkJCQkJKmNtZCA9PSAnPycgPyBCQUNLV0FSRCA6IEZPUldBUkQsCisJCQkJCShjaGFyX3UgKikiIiwgMUwsCisJCQkJCVNFQVJDSF9NU0cgKyBTRUFSQ0hfU1RBUlQsIGkpICE9IEZBSUwpCisJCQkJbG51bSA9IHBvcy5sbnVtOworCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJY21kID0gTlVMTDsKKwkJCQlnb3RvIGVycm9yOworCQkJICAgIH0KKwkJCX0KKwkJCSsrY21kOworCQkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJCWlmIChWSU1fSVNESUdJVCgqY21kKSkJLyogYWJzb2x1dGUgbGluZSBudW1iZXIgKi8KKwkJCSAgICBsbnVtID0gZ2V0ZGlnaXRzKCZjbWQpOworCX0KKworCWZvciAoOzspCisJeworCSAgICBjbWQgPSBza2lwd2hpdGUoY21kKTsKKwkgICAgaWYgKCpjbWQgIT0gJy0nICYmICpjbWQgIT0gJysnICYmICFWSU1fSVNESUdJVCgqY21kKSkKKwkJYnJlYWs7CisKKwkgICAgaWYgKGxudW0gPT0gTUFYTE5VTSkKKwkJbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsJLyogIisxIiBpcyBzYW1lIGFzICIuKzEiICovCisJICAgIGlmIChWSU1fSVNESUdJVCgqY21kKSkKKwkJaSA9ICcrJzsJCS8qICJudW1iZXIiIGlzIHNhbWUgYXMgIitudW1iZXIiICovCisJICAgIGVsc2UKKwkJaSA9ICpjbWQrKzsKKwkgICAgaWYgKCFWSU1fSVNESUdJVCgqY21kKSkJLyogJysnIGlzICcrMScsIGJ1dCAnKzAnIGlzIG5vdCAnKzEnICovCisJCW4gPSAxOworCSAgICBlbHNlCisJCW4gPSBnZXRkaWdpdHMoJmNtZCk7CisJICAgIGlmIChpID09ICctJykKKwkJbG51bSAtPSBuOworCSAgICBlbHNlCisJCWxudW0gKz0gbjsKKwl9CisgICAgfSB3aGlsZSAoKmNtZCA9PSAnLycgfHwgKmNtZCA9PSAnPycpOworCitlcnJvcjoKKyAgICAqcHRyID0gY21kOworICAgIHJldHVybiBsbnVtOworfQorCisvKgorICogRnVuY3Rpb24gY2FsbGVkIGZvciBjb21tYW5kIHdoaWNoIGlzIE5vdCBJbXBsZW1lbnRlZC4gIE5JIQorICovCisgICAgdm9pZAorZXhfbmkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoIWVhcC0+c2tpcCkKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIik7Cit9CisKKyNpZiAhZGVmaW5lZChGRUFUX1BFUkwpIHx8ICFkZWZpbmVkKEZFQVRfUFlUSE9OKSB8fCAhZGVmaW5lZChGRUFUX1RDTCkgXAorCXx8ICFkZWZpbmVkKEZFQVRfUlVCWSkKKy8qCisgKiBGdW5jdGlvbiBjYWxsZWQgZm9yIHNjcmlwdCBjb21tYW5kIHdoaWNoIGlzIE5vdCBJbXBsZW1lbnRlZC4gIE5JIQorICogU2tpcHMgb3ZlciAiOnBlcmwgPDxFT0YiIGNvbnN0cnVjdHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfc2NyaXB0X25pKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKCFlYXAtPnNraXApCisJZXhfbmkoZWFwKTsKKyAgICBlbHNlCisJdmltX2ZyZWUoc2NyaXB0X2dldChlYXAsIGVhcC0+YXJnKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIHJhbmdlIGluIEV4IGNvbW1hbmQgZm9yIHZhbGlkaXR5LgorICogUmV0dXJuIE5VTEwgd2hlbiB2YWxpZCwgZXJyb3IgbWVzc2FnZSB3aGVuIGludmFsaWQuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2ludmFsaWRfcmFuZ2UoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoICAgICAgIGVhcC0+bGluZTEgPCAwCisJICAgIHx8IGVhcC0+bGluZTIgPCAwCisJICAgIHx8IGVhcC0+bGluZTEgPiBlYXAtPmxpbmUyCisJICAgIHx8ICgoZWFwLT5hcmd0ICYgUkFOR0UpCisJCSYmICEoZWFwLT5hcmd0ICYgTk9UQURSKQorCQkmJiBlYXAtPmxpbmUyID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCSsgKGVhcC0+Y21kaWR4ID09IENNRF9kaWZmZ2V0KQorI2VuZGlmCisJCSkpCisJcmV0dXJuIChjaGFyX3UgKilfKGVfaW52cmFuZ2UpOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogQ29ycmVjdCB0aGUgcmFuZ2UgZm9yIHplcm8gbGluZSBudW1iZXIsIGlmIHJlcXVpcmVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvcnJlY3RfcmFuZ2UoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoIShlYXAtPmFyZ3QgJiBaRVJPUikpCSAgICAvKiB6ZXJvIGluIHJhbmdlIG5vdCBhbGxvd2VkICovCisgICAgeworCWlmIChlYXAtPmxpbmUxID09IDApCisJICAgIGVhcC0+bGluZTEgPSAxOworCWlmIChlYXAtPmxpbmUyID09IDApCisJICAgIGVhcC0+bGluZTIgPSAxOworICAgIH0KK30KKworLyoKKyAqIEV4cGFuZCBmaWxlIG5hbWUgaW4gRXggY29tbWFuZCBhcmd1bWVudC4KKyAqIFJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2V4cGFuZF9maWxlbmFtZShlYXAsIGNtZGxpbmVwLCBlcnJvcm1zZ3ApCisgICAgZXhhcmdfVAkqZWFwOworICAgIGNoYXJfdQkqKmNtZGxpbmVwOworICAgIGNoYXJfdQkqKmVycm9ybXNncDsKK3sKKyAgICBpbnQJCWhhc193aWxkY2FyZHM7CS8qIG5lZWQgdG8gZXhwYW5kIHdpbGRjYXJkcyAqLworICAgIGNoYXJfdQkqcmVwbDsKKyAgICBpbnQJCXNyY2xlbjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQluOworCisgICAgLyoKKyAgICAgKiBEZWNpZGUgdG8gZXhwYW5kIHdpbGRjYXJkcyAqYmVmb3JlKiByZXBsYWNpbmcgJyUnLCAnIycsIGV0Yy4gIElmCisgICAgICogdGhlIGZpbGUgbmFtZSBjb250YWlucyBhIHdpbGRjYXJkIGl0IHNob3VsZCBub3QgY2F1c2UgZXhwYW5kaW5nLgorICAgICAqIChpdCB3aWxsIGJlIGV4cGFuZGVkIGFueXdheSBpZiB0aGVyZSBpcyBhIHdpbGRjYXJkIGJlZm9yZSByZXBsYWNpbmcpLgorICAgICAqLworICAgIGhhc193aWxkY2FyZHMgPSBtY2hfaGFzX3dpbGRjYXJkKGVhcC0+YXJnKTsKKyAgICBmb3IgKHAgPSBlYXAtPmFyZzsgKnA7ICkKKyAgICB7CisJLyoKKwkgKiBRdWljayBjaGVjayBpZiB0aGlzIGNhbm5vdCBiZSB0aGUgc3RhcnQgb2YgYSBzcGVjaWFsIHN0cmluZy4KKwkgKiBBbHNvIHJlbW92ZXMgYmFja3NsYXNoIGJlZm9yZSAnJScsICcjJyBhbmQgJzwnLgorCSAqLworCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiJSM8IiwgKnApID09IE5VTEwpCisJeworCSAgICArK3A7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qCisJICogVHJ5IHRvIGZpbmQgYSBtYXRjaCBhdCB0aGlzIHBvc2l0aW9uLgorCSAqLworCXJlcGwgPSBldmFsX3ZhcnMocCwgJnNyY2xlbiwgJihlYXAtPmRvX2VjbWRfbG51bSksIGVycm9ybXNncCwgZWFwLT5hcmcpOworCWlmICgqZXJyb3Jtc2dwICE9IE5VTEwpCQkvKiBlcnJvciBkZXRlY3RlZCAqLworCSAgICByZXR1cm4gRkFJTDsKKwlpZiAocmVwbCA9PSBOVUxMKQkJLyogbm8gbWF0Y2ggZm91bmQgKi8KKwl7CisJICAgIHAgKz0gc3JjbGVuOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBOZWVkIHRvIGVzY2FwZSB3aGl0ZSBzcGFjZSBldCBhbC4gd2l0aCBhIGJhY2tzbGFzaC4gIERvbid0IGRvIHRoaXMKKwkgKiBmb3Igc2hlbGwgY29tbWFuZHMgKG1heSBoYXZlIHRvIHVzZSBxdW90ZXMgaW5zdGVhZCkuICBEb24ndCBkbyB0aGlzCisJICogZm9yIG5vbi11bml4IHN5c3RlbXMgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSBhcmd1bWVudCAoc3BhY2VzIGRvbid0CisJICogc2VwYXJhdGUgYXJndW1lbnRzIHRoZW4pLiAqLworCWlmICghZWFwLT51c2VmaWx0ZXIKKwkJJiYgZWFwLT5jbWRpZHggIT0gQ01EX2JhbmcKKwkJJiYgZWFwLT5jbWRpZHggIT0gQ01EX21ha2UKKwkJJiYgZWFwLT5jbWRpZHggIT0gQ01EX2dyZXAKKwkJJiYgZWFwLT5jbWRpZHggIT0gQ01EX2dyZXBhZGQKKyNpZm5kZWYgVU5JWAorCQkmJiAhKGVhcC0+YXJndCAmIE5PU1BDKQorI2VuZGlmCisJCSkKKwl7CisJICAgIGNoYXJfdQkqbDsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkgICAgLyogRG9uJ3QgZXNjYXBlIGEgYmFja3NsYXNoIGhlcmUsIGJlY2F1c2UgcmVtX2JhY2tzbGFzaCgpIGRvZXNuJ3QKKwkgICAgICogcmVtb3ZlIGl0IGxhdGVyLiAqLworCSAgICBzdGF0aWMgY2hhcl91ICpub2JzbGFzaCA9IChjaGFyX3UgKikiIFx0XCJ8IjsKKyMgZGVmaW5lIEVTQ0FQRV9DSEFSUyBub2JzbGFzaAorI2Vsc2UKKyMgZGVmaW5lIEVTQ0FQRV9DSEFSUyBlc2NhcGVfY2hhcnMKKyNlbmRpZgorCisJICAgIGZvciAobCA9IHJlcGw7ICpsOyArK2wpCisJCWlmICh2aW1fc3RyY2hyKEVTQ0FQRV9DSEFSUywgKmwpICE9IE5VTEwpCisJCXsKKwkJICAgIGwgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKHJlcGwsIEVTQ0FQRV9DSEFSUyk7CisJCSAgICBpZiAobCAhPSBOVUxMKQorCQkgICAgeworCQkJdmltX2ZyZWUocmVwbCk7CisJCQlyZXBsID0gbDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQl9CisJfQorCisJLyogRm9yIGEgc2hlbGwgY29tbWFuZCBhICchJyBtdXN0IGJlIGVzY2FwZWQuICovCisJaWYgKChlYXAtPnVzZWZpbHRlciB8fCBlYXAtPmNtZGlkeCA9PSBDTURfYmFuZykKKwkJJiYgdmltX3N0cmNocihyZXBsLCAnIScpICE9IE5VTEwpCisJeworCSAgICBjaGFyX3UJKmw7CisKKwkgICAgbCA9IHZpbV9zdHJzYXZlX2VzY2FwZWQocmVwbCwgKGNoYXJfdSAqKSIhIik7CisJICAgIGlmIChsICE9IE5VTEwpCisJICAgIHsKKwkJdmltX2ZyZWUocmVwbCk7CisJCXJlcGwgPSBsOworCQkvKiBGb3IgYSBzaC1saWtlIHNoZWxsIGVzY2FwZSBpdCBhbm90aGVyIHRpbWUuICovCisJCWlmIChzdHJzdHIoKGNoYXIgKilwX3NoLCAic2giKSAhPSBOVUxMKQorCQl7CisJCSAgICBsID0gdmltX3N0cnNhdmVfZXNjYXBlZChyZXBsLCAoY2hhcl91ICopIiEiKTsKKwkJICAgIGlmIChsICE9IE5VTEwpCisJCSAgICB7CisJCQl2aW1fZnJlZShyZXBsKTsKKwkJCXJlcGwgPSBsOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwlwID0gcmVwbF9jbWRsaW5lKGVhcCwgcCwgc3JjbGVuLCByZXBsLCBjbWRsaW5lcCk7CisJdmltX2ZyZWUocmVwbCk7CisJaWYgKHAgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBPbmUgZmlsZSBhcmd1bWVudDogRXhwYW5kIHdpbGRjYXJkcy4KKyAgICAgKiBEb24ndCBkbyB0aGlzIHdpdGggIjpyICFjb21tYW5kIiBvciAiOncgIWNvbW1hbmQiLgorICAgICAqLworICAgIGlmICgoZWFwLT5hcmd0ICYgTk9TUEMpICYmICFlYXAtPnVzZWZpbHRlcikKKyAgICB7CisJLyoKKwkgKiBNYXkgZG8gdGhpcyB0d2ljZToKKwkgKiAxLiBSZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwkgKiAyLiBSZXBsYWNlIGFueSBvdGhlciB3aWxkY2FyZHMsIHJlbW92ZSBiYWNrc2xhc2hlcy4KKwkgKi8KKwlmb3IgKG4gPSAxOyBuIDw9IDI7ICsrbikKKwl7CisJICAgIGlmIChuID09IDIpCisJICAgIHsKKyNpZmRlZiBVTklYCisJCS8qCisJCSAqIE9ubHkgZm9yIFVuaXggd2UgY2hlY2sgZm9yIG1vcmUgdGhhbiBvbmUgZmlsZSBuYW1lLgorCQkgKiBGb3Igb3RoZXIgc3lzdGVtcyBzcGFjZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcGFydAorCQkgKiBvZiB0aGUgZmlsZSBuYW1lLgorCQkgKiBPbmx5IGNoZWNrIGhlcmUgaWYgdGhlcmUgaXMgbm8gd2lsZGNhcmQsIG90aGVyd2lzZQorCQkgKiBFeHBhbmRPbmUoKSB3aWxsIGNoZWNrIGZvciBlcnJvcnMuIFRoaXMgYWxsb3dzCisJCSAqICI6ZSBgbHMgdmUqLmNgIiBvbiBVbml4LgorCQkgKi8KKwkJaWYgKCFoYXNfd2lsZGNhcmRzKQorCQkgICAgZm9yIChwID0gZWFwLT5hcmc7ICpwOyArK3ApCisJCSAgICB7CisJCQkvKiBza2lwIGVzY2FwZWQgY2hhcmFjdGVycyAqLworCQkJaWYgKHBbMV0gJiYgKCpwID09ICdcXCcgfHwgKnAgPT0gQ3RybF9WKSkKKwkJCSAgICArK3A7CisJCQllbHNlIGlmICh2aW1faXN3aGl0ZSgqcCkpCisJCQl7CisJCQkgICAgKmVycm9ybXNncCA9IChjaGFyX3UgKilfKCJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIpOworCQkJICAgIHJldHVybiBGQUlMOworCQkJfQorCQkgICAgfQorI2VuZGlmCisKKwkJLyoKKwkJICogSGFsdmUgdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyAodGhpcyBpcyBWaSBjb21wYXRpYmxlKS4KKwkJICogRm9yIFVuaXggYW5kIE9TLzIsIHdoZW4gd2lsZGNhcmRzIGFyZSBleHBhbmRlZCwgdGhpcyBpcworCQkgKiBkb25lIGJ5IEV4cGFuZE9uZSgpIGJlbG93LgorCQkgKi8KKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoT1MyKQorCQlpZiAoIWhhc193aWxkY2FyZHMpCisjZW5kaWYKKwkJICAgIGJhY2tzbGFzaF9oYWx2ZShlYXAtPmFyZyk7CisjaWZkZWYgTUFDT1NfQ0xBU1NJQworCQkvKgorCQkgKiB0cmFuc2xhdGUgdW5peC1saWtlIHBhdGggY29tcG9uZW50cworCQkgKi8KKwkJc2xhc2hfbl9jb2xvbl9hZGp1c3QoZWFwLT5hcmcpOworI2VuZGlmCisJICAgIH0KKworCSAgICBpZiAoaGFzX3dpbGRjYXJkcykKKwkgICAgeworCQlpZiAobiA9PSAxKQorCQl7CisJCSAgICAvKgorCQkgICAgICogRmlyc3QgbG9vcDogTWF5IGV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBUaGlzCisJCSAgICAgKiBjYW4gYmUgZG9uZSBtdWNoIGZhc3RlciB3aXRoIGV4cGFuZF9lbnYoKSB0aGFuIHdpdGgKKwkJICAgICAqIHNvbWV0aGluZyBlbHNlIChlLmcuLCBjYWxsaW5nIGEgc2hlbGwpLgorCQkgICAgICogQWZ0ZXIgZXhwYW5kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcywgY2hlY2sgYWdhaW4KKwkJICAgICAqIGlmIHRoZXJlIGFyZSBzdGlsbCB3aWxkY2FyZHMgcHJlc2VudC4KKwkJICAgICAqLworCQkgICAgaWYgKHZpbV9zdHJjaHIoZWFwLT5hcmcsICckJykgIT0gTlVMTAorCQkJICAgIHx8IHZpbV9zdHJjaHIoZWFwLT5hcmcsICd+JykgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWV4cGFuZF9lbnZfZXNjKGVhcC0+YXJnLCBOYW1lQnVmZiwgTUFYUEFUSEwsIFRSVUUpOworCQkJaGFzX3dpbGRjYXJkcyA9IG1jaF9oYXNfd2lsZGNhcmQoTmFtZUJ1ZmYpOworCQkJcCA9IE5hbWVCdWZmOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJcCA9IE5VTEw7CisJCX0KKwkJZWxzZSAvKiBuID09IDIgKi8KKwkJeworCQkgICAgZXhwYW5kX1QJeHBjOworCisJCSAgICBFeHBhbmRJbml0KCZ4cGMpOworCQkgICAgeHBjLnhwX2NvbnRleHQgPSBFWFBBTkRfRklMRVM7CisJCSAgICBwID0gRXhwYW5kT25lKCZ4cGMsIGVhcC0+YXJnLCBOVUxMLAorCQkJCQkgICAgV0lMRF9MSVNUX05PVEZPVU5EfFdJTERfQUREX1NMQVNILAorCQkJCQkJICAgV0lMRF9FWFBBTkRfRlJFRSk7CisJCSAgICBFeHBhbmRDbGVhbnVwKCZ4cGMpOworCQkgICAgaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiBGQUlMOworCQl9CisJCWlmIChwICE9IE5VTEwpCisJCXsKKwkJICAgICh2b2lkKXJlcGxfY21kbGluZShlYXAsIGVhcC0+YXJnLCAoaW50KVNUUkxFTihlYXAtPmFyZyksCisJCQkJCQkJCSBwLCBjbWRsaW5lcCk7CisJCSAgICBpZiAobiA9PSAyKQkvKiBwIGNhbWUgZnJvbSBFeHBhbmRPbmUoKSAqLworCQkJdmltX2ZyZWUocCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogUmVwbGFjZSBwYXJ0IG9mIHRoZSBjb21tYW5kIGxpbmUsIGtlZXBpbmcgZWFwLT5jbWQsIGVhcC0+YXJnIGFuZAorICogZWFwLT5uZXh0Y21kIGNvcnJlY3QuCisgKiAic3JjIiBwb2ludHMgdG8gdGhlIHBhcnQgdGhhdCBpcyB0byBiZSByZXBsYWNlZCwgb2YgbGVuZ3RoICJzcmNsZW4iLgorICogInJlcGwiIGlzIHRoZSByZXBsYWNlbWVudCBzdHJpbmcuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSByZXBsYWNlZCBzdHJpbmcuCisgKiBSZXR1cm5zIE5VTEwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3JlcGxfY21kbGluZShlYXAsIHNyYywgc3JjbGVuLCByZXBsLCBjbWRsaW5lcCkKKyAgICBleGFyZ19UCSplYXA7CisgICAgY2hhcl91CSpzcmM7CisgICAgaW50CQlzcmNsZW47CisgICAgY2hhcl91CSpyZXBsOworICAgIGNoYXJfdQkqKmNtZGxpbmVwOworeworICAgIGludAkJbGVuOworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKm5ld19jbWRsaW5lOworCisgICAgLyoKKyAgICAgKiBUaGUgbmV3IGNvbW1hbmQgbGluZSBpcyBidWlsZCBpbiBuZXdfY21kbGluZVtdLgorICAgICAqIEZpcnN0IGFsbG9jYXRlIGl0LgorICAgICAqIENhcmVmdWw6IGEgIitjbWQiIGFyZ3VtZW50IG1heSBoYXZlIGJlZW4gTlVMIHRlcm1pbmF0ZWQuCisgICAgICovCisgICAgbGVuID0gKGludClTVFJMRU4ocmVwbCk7CisgICAgaSA9IChpbnQpKHNyYyAtICpjbWRsaW5lcCkgKyAoaW50KVNUUkxFTihzcmMgKyBzcmNsZW4pICsgbGVuICsgMzsKKyAgICBpZiAoZWFwLT5uZXh0Y21kKQorCWkgKz0gKGludClTVFJMRU4oZWFwLT5uZXh0Y21kKTsvKiBhZGQgc3BhY2UgZm9yIG5leHQgY29tbWFuZCAqLworICAgIGlmICgobmV3X2NtZGxpbmUgPSBhbGxvYygodW5zaWduZWQpaSkpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CQkJLyogb3V0IG9mIG1lbW9yeSEgKi8KKworICAgIC8qCisgICAgICogQ29weSB0aGUgc3R1ZmYgYmVmb3JlIHRoZSBleHBhbmRlZCBwYXJ0LgorICAgICAqIENvcHkgdGhlIGV4cGFuZGVkIHN0dWZmLgorICAgICAqIENvcHkgd2hhdCBjYW1lIGFmdGVyIHRoZSBleHBhbmRlZCBwYXJ0LgorICAgICAqIENvcHkgdGhlIG5leHQgY29tbWFuZHMsIGlmIHRoZXJlIGFyZSBhbnkuCisgICAgICovCisgICAgaSA9IChpbnQpKHNyYyAtICpjbWRsaW5lcCk7CS8qIGxlbmd0aCBvZiBwYXJ0IGJlZm9yZSBtYXRjaCAqLworICAgIG1jaF9tZW1tb3ZlKG5ld19jbWRsaW5lLCAqY21kbGluZXAsIChzaXplX3QpaSk7CisgICAgbWNoX21lbW1vdmUobmV3X2NtZGxpbmUgKyBpLCByZXBsLCAoc2l6ZV90KWxlbik7CisgICAgaSArPSBsZW47CQkJCS8qIHJlbWVtYmVyIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICAgIFNUUkNQWShuZXdfY21kbGluZSArIGksIHNyYyArIHNyY2xlbik7CisgICAgc3JjID0gbmV3X2NtZGxpbmUgKyBpOwkJLyogcmVtZW1iZXIgd2hlcmUgdG8gY29udGludWUgKi8KKworICAgIGlmIChlYXAtPm5leHRjbWQpCQkJLyogYXBwZW5kIG5leHQgY29tbWFuZCAqLworICAgIHsKKwlpID0gKGludClTVFJMRU4obmV3X2NtZGxpbmUpICsgMTsKKwlTVFJDUFkobmV3X2NtZGxpbmUgKyBpLCBlYXAtPm5leHRjbWQpOworCWVhcC0+bmV4dGNtZCA9IG5ld19jbWRsaW5lICsgaTsKKyAgICB9CisgICAgZWFwLT5jbWQgPSBuZXdfY21kbGluZSArIChlYXAtPmNtZCAtICpjbWRsaW5lcCk7CisgICAgZWFwLT5hcmcgPSBuZXdfY21kbGluZSArIChlYXAtPmFyZyAtICpjbWRsaW5lcCk7CisgICAgaWYgKGVhcC0+ZG9fZWNtZF9jbWQgIT0gTlVMTCAmJiBlYXAtPmRvX2VjbWRfY21kICE9IGRvbGxhcl9jb21tYW5kKQorCWVhcC0+ZG9fZWNtZF9jbWQgPSBuZXdfY21kbGluZSArIChlYXAtPmRvX2VjbWRfY21kIC0gKmNtZGxpbmVwKTsKKyAgICB2aW1fZnJlZSgqY21kbGluZXApOworICAgICpjbWRsaW5lcCA9IG5ld19jbWRsaW5lOworCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoKKyAqIENoZWNrIGZvciAnfCcgdG8gc2VwYXJhdGUgY29tbWFuZHMgYW5kICciJyB0byBzdGFydCBjb21tZW50cy4KKyAqLworICAgIHZvaWQKK3NlcGFyYXRlX25leHRjbWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBmb3IgKHAgPSBlYXAtPmFyZzsgKnA7ICsrcCkKKyAgICB7CisJaWYgKCpwID09IEN0cmxfVikKKwl7CisJICAgIGlmIChlYXAtPmFyZ3QgJiAoVVNFQ1RSTFYgfCBYRklMRSkpCisJCSsrcDsJCS8qIHNraXAgQ1RSTC1WIGFuZCBuZXh0IGNoYXIgKi8KKwkgICAgZWxzZQorCQlTVFJDUFkocCwgcCArIDEpOwkvKiByZW1vdmUgQ1RSTC1WIGFuZCBza2lwIG5leHQgY2hhciAqLworCSAgICBpZiAoKnAgPT0gTlVMKQkJLyogc3RvcCBhdCBOVUwgYWZ0ZXIgQ1RSTC1WICovCisJCWJyZWFrOworCX0KKwkvKiBDaGVjayBmb3IgJyInOiBzdGFydCBvZiBjb21tZW50IG9yICd8JzogbmV4dCBjb21tYW5kICovCisJLyogOkAiIGFuZCA6KiIgZG8gbm90IHN0YXJ0IGEgY29tbWVudCEKKwkgKiA6cmVkaXIgQCIgZG9lc24ndCBlaXRoZXIuICovCisJZWxzZSBpZiAoKCpwID09ICciJyAmJiAhKGVhcC0+YXJndCAmIE5PVFJMQ09NKQorCQkgICAgJiYgKChlYXAtPmNtZGlkeCAhPSBDTURfYXQgJiYgZWFwLT5jbWRpZHggIT0gQ01EX3N0YXIpCisJCQl8fCBwICE9IGVhcC0+YXJnKQorCQkgICAgJiYgKGVhcC0+Y21kaWR4ICE9IENNRF9yZWRpcgorCQkJfHwgcCAhPSBlYXAtPmFyZyArIDEgfHwgcFstMV0gIT0gJ0AnKSkKKwkJfHwgKnAgPT0gJ3wnIHx8ICpwID09ICdcbicpCisJeworCSAgICAvKgorCSAgICAgKiBXZSByZW1vdmUgdGhlICdcJyBiZWZvcmUgdGhlICd8JywgdW5sZXNzIFVTRUNUUkxWIGlzIHVzZWQKKwkgICAgICogQU5EICdiJyBpcyBwcmVzZW50IGluICdjcG9wdGlvbnMnLgorCSAgICAgKi8KKwkgICAgaWYgKCh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQkFSKSA9PSBOVUxMCisJCQkgICAgICB8fCAhKGVhcC0+YXJndCAmIFVTRUNUUkxWKSkgJiYgKihwIC0gMSkgPT0gJ1xcJykKKwkgICAgeworCQltY2hfbWVtbW92ZShwIC0gMSwgcCwgU1RSTEVOKHApICsgMSk7CS8qIHJlbW92ZSB0aGUgJ1wnICovCisJCS0tcDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChwKTsKKwkJKnAgPSBOVUw7CisJCWJyZWFrOworCSAgICB9CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwllbHNlIGlmIChoYXNfbWJ5dGUpCisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7IC8qIHNraXAgYnl0ZXMgb2YgbXVsdGktYnl0ZSBjaGFyICovCisjZW5kaWYKKyAgICB9CisgICAgaWYgKCEoZWFwLT5hcmd0ICYgTk9UUkxDT00pKQkvKiByZW1vdmUgdHJhaWxpbmcgc3BhY2VzICovCisJZGVsX3RyYWlsaW5nX3NwYWNlcyhlYXAtPmFyZyk7Cit9CisKKy8qCisgKiBnZXQgKyBjb21tYW5kIGZyb20gZXggYXJndW1lbnQKKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0YXJnY21kKGFyZ3ApCisgICAgY2hhcl91ICoqYXJncDsKK3sKKyAgICBjaGFyX3UgKmFyZyA9ICphcmdwOworICAgIGNoYXJfdSAqY29tbWFuZCA9IE5VTEw7CisKKyAgICBpZiAoKmFyZyA9PSAnKycpCSAgICAvKiArW2NvbW1hbmRdICovCisgICAgeworCSsrYXJnOworCWlmICh2aW1faXNzcGFjZSgqYXJnKSkKKwkgICAgY29tbWFuZCA9IGRvbGxhcl9jb21tYW5kOworCWVsc2UKKwl7CisJICAgIGNvbW1hbmQgPSBhcmc7CisJICAgIGFyZyA9IHNraXBfY21kX2FyZyhjb21tYW5kLCBUUlVFKTsKKwkgICAgaWYgKCphcmcgIT0gTlVMKQorCQkqYXJnKysgPSBOVUw7CQkvKiB0ZXJtaW5hdGUgY29tbWFuZCB3aXRoIE5VTCAqLworCX0KKworCWFyZyA9IHNraXB3aGl0ZShhcmcpOwkvKiBza2lwIG92ZXIgc3BhY2VzICovCisJKmFyZ3AgPSBhcmc7CisgICAgfQorICAgIHJldHVybiBjb21tYW5kOworfQorCisvKgorICogRmluZCBlbmQgb2YgIitjb21tYW5kIiBhcmd1bWVudC4gIFNraXAgb3ZlciAiXCAiIGFuZCAiXFwiLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitza2lwX2NtZF9hcmcocCwgcmVtYnMpCisgICAgY2hhcl91ICpwOworICAgIGludAkgICByZW1iczsJLyogVFJVRSB0byBoYWx2ZSB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzICovCit7CisgICAgd2hpbGUgKCpwICYmICF2aW1faXNzcGFjZSgqcCkpCisgICAgeworCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCXsKKwkgICAgaWYgKHJlbWJzKQorCQltY2hfbWVtbW92ZShwLCBwICsgMSwgU1RSTEVOKHApKTsKKwkgICAgZWxzZQorCQkrK3A7CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJZWxzZQorI2VuZGlmCisJICAgICsrcDsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBHZXQgIisrb3B0PWFyZyIgYXJndW1lbnQuCisgKiBSZXR1cm4gRkFJTCBvciBPSy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldGFyZ29wdChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmcgKyAyOworICAgIGludAkJKnBwID0gTlVMTDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CSpwOworI2VuZGlmCisKKyAgICAvKiAiOmVkaXQgKytbbm9dYmluW2FyeV0gZmlsZSIgKi8KKyAgICBpZiAoU1RSTkNNUChhcmcsICJiaW4iLCAzKSA9PSAwIHx8IFNUUk5DTVAoYXJnLCAibm9iaW4iLCA1KSA9PSAwKQorICAgIHsKKwlpZiAoKmFyZyA9PSAnbicpCisJeworCSAgICBhcmcgKz0gMjsKKwkgICAgZWFwLT5mb3JjZV9iaW4gPSBGT1JDRV9OT0JJTjsKKwl9CisJZWxzZQorCSAgICBlYXAtPmZvcmNlX2JpbiA9IEZPUkNFX0JJTjsKKwlpZiAoIWNoZWNrZm9yY21kKCZhcmcsICJiaW5hcnkiLCAzKSkKKwkgICAgcmV0dXJuIEZBSUw7CisJZWFwLT5hcmcgPSBza2lwd2hpdGUoYXJnKTsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKFNUUk5DTVAoYXJnLCAiZmYiLCAyKSA9PSAwKQorICAgIHsKKwlhcmcgKz0gMjsKKwlwcCA9ICZlYXAtPmZvcmNlX2ZmOworICAgIH0KKyAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgImZpbGVmb3JtYXQiLCAxMCkgPT0gMCkKKyAgICB7CisJYXJnICs9IDEwOworCXBwID0gJmVhcC0+Zm9yY2VfZmY7CisgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgImVuYyIsIDMpID09IDApCisgICAgeworCWFyZyArPSAzOworCXBwID0gJmVhcC0+Zm9yY2VfZW5jOworICAgIH0KKyAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgImVuY29kaW5nIiwgOCkgPT0gMCkKKyAgICB7CisJYXJnICs9IDg7CisJcHAgPSAmZWFwLT5mb3JjZV9lbmM7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocHAgPT0gTlVMTCB8fCAqYXJnICE9ICc9JykKKwlyZXR1cm4gRkFJTDsKKworICAgICsrYXJnOworICAgICpwcCA9IChpbnQpKGFyZyAtIGVhcC0+Y21kKTsKKyAgICBhcmcgPSBza2lwX2NtZF9hcmcoYXJnLCBGQUxTRSk7CisgICAgZWFwLT5hcmcgPSBza2lwd2hpdGUoYXJnKTsKKyAgICAqYXJnID0gTlVMOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChwcCA9PSAmZWFwLT5mb3JjZV9mZikKKyAgICB7CisjZW5kaWYKKwlpZiAoY2hlY2tfZmZfdmFsdWUoZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2ZmKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogTWFrZSAnZmlsZWVuY29kaW5nJyBsb3dlciBjYXNlLiAqLworCWZvciAocCA9IGVhcC0+Y21kICsgZWFwLT5mb3JjZV9lbmM7ICpwICE9IE5VTDsgKytwKQorCSAgICAqcCA9IFRPTE9XRVJfQVNDKCpwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqICI6YWJicmV2aWF0ZSIgYW5kIGZyaWVuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYWJicmV2aWF0ZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGRvX2V4bWFwKGVhcCwgVFJVRSk7CS8qIGFsbW9zdCB0aGUgc2FtZSBhcyBtYXBwaW5nICovCit9CisKKy8qCisgKiAiOm1hcCIgYW5kIGZyaWVuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbWFwKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgLyoKKyAgICAgKiBJZiB3ZSBhcmUgc291cmNpbmcgLmV4cmMgb3IgLnZpbXJjIGluIGN1cnJlbnQgZGlyZWN0b3J5IHdlCisgICAgICogcHJpbnQgdGhlIG1hcHBpbmdzIGZvciBzZWN1cml0eSByZWFzb25zLgorICAgICAqLworICAgIGlmIChzZWN1cmUpCisgICAgeworCXNlY3VyZSA9IDI7CisJbXNnX291dHRyYW5zKGVhcC0+Y21kKTsKKwltc2dfcHV0Y2hhcignXG4nKTsKKyAgICB9CisgICAgZG9fZXhtYXAoZWFwLCBGQUxTRSk7Cit9CisKKy8qCisgKiAiOnVubWFwIiBhbmQgZnJpZW5kcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF91bm1hcChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGRvX2V4bWFwKGVhcCwgRkFMU0UpOworfQorCisvKgorICogIjptYXBjbGVhciIgYW5kIGZyaWVuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbWFwY2xlYXIoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBtYXBfY2xlYXIoZWFwLT5jbWQsIGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQsIEZBTFNFKTsKK30KKworLyoKKyAqICI6YWJjbGVhciIgYW5kIGZyaWVuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYWJjbGVhcihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIG1hcF9jbGVhcihlYXAtPmNtZCwgZWFwLT5hcmcsIFRSVUUsIFRSVUUpOworfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgc3RhdGljIHZvaWQKK2V4X2F1dG9jbWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICAvKgorICAgICAqIERpc2FsbG93IGF1dG8gY29tbWFuZHMgZnJvbSAuZXhyYyBhbmQgLnZpbXJjIGluIGN1cnJlbnQKKyAgICAgKiBkaXJlY3RvcnkgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCisgICAgICovCisgICAgaWYgKHNlY3VyZSkKKyAgICB7CisJc2VjdXJlID0gMjsKKwllYXAtPmVycm1zZyA9IGVfY3VyZGlyOworICAgIH0KKyAgICBlbHNlIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfYXV0b2NtZCkKKwlkb19hdXRvY21kKGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQpOworICAgIGVsc2UKKwlkb19hdWdyb3VwKGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQpOworfQorCisvKgorICogIjpkb2F1dG9jbWQiOiBBcHBseSB0aGUgYXV0b21hdGljIGNvbW1hbmRzIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9kb2F1dG9jbWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICAodm9pZClkb19kb2F1dG9jbWQoZWFwLT5hcmcsIFRSVUUpOworICAgIGRvX21vZGVsaW5lcygpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisvKgorICogOltOXWJ1bmxvYWRbIV0gW05dIFtidWZuYW1lXSB1bmxvYWQgYnVmZmVyCisgKiA6W05dYmRlbGV0ZVshXSBbTl0gW2J1Zm5hbWVdIGRlbGV0ZSBidWZmZXIgZnJvbSBidWZmZXIgbGlzdAorICogOltOXWJ3aXBlb3V0WyFdIFtOXSBbYnVmbmFtZV0gZGVsZXRlIGJ1ZmZlciByZWFsbHkKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9idW5sb2FkKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZWFwLT5lcnJtc2cgPSBkb19idWZkZWwoCisJICAgIGVhcC0+Y21kaWR4ID09IENNRF9iZGVsZXRlID8gRE9CVUZfREVMCisJCTogZWFwLT5jbWRpZHggPT0gQ01EX2J3aXBlb3V0ID8gRE9CVUZfV0lQRQorCQk6IERPQlVGX1VOTE9BRCwgZWFwLT5hcmcsCisJICAgIGVhcC0+YWRkcl9jb3VudCwgKGludCllYXAtPmxpbmUxLCAoaW50KWVhcC0+bGluZTIsIGVhcC0+Zm9yY2VpdCk7Cit9CisKKy8qCisgKiA6W05dYnVmZmVyIFtOXQl0byBidWZmZXIgTgorICogOltOXXNidWZmZXIgW05dCXRvIGJ1ZmZlciBOCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYnVmZmVyKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKCplYXAtPmFyZykKKwllYXAtPmVycm1zZyA9IGVfdHJhaWxpbmc7CisgICAgZWxzZQorICAgIHsKKwlpZiAoZWFwLT5hZGRyX2NvdW50ID09IDApCS8qIGRlZmF1bHQgaXMgY3VycmVudCBidWZmZXIgKi8KKwkgICAgZ290b19idWZmZXIoZWFwLCBET0JVRl9DVVJSRU5ULCBGT1JXQVJELCAwKTsKKwllbHNlCisJICAgIGdvdG9fYnVmZmVyKGVhcCwgRE9CVUZfRklSU1QsIEZPUldBUkQsIChpbnQpZWFwLT5saW5lMik7CisgICAgfQorfQorCisvKgorICogOltOXWJtb2RpZmllZCBbTl0JdG8gbmV4dCBtb2QuIGJ1ZmZlcgorICogOltOXXNibW9kaWZpZWQgW05dCXRvIG5leHQgbW9kLiBidWZmZXIKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9ibW9kaWZpZWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBnb3RvX2J1ZmZlcihlYXAsIERPQlVGX01PRCwgRk9SV0FSRCwgKGludCllYXAtPmxpbmUyKTsKK30KKworLyoKKyAqIDpbTl1ibmV4dCBbTl0JdG8gbmV4dCBidWZmZXIKKyAqIDpbTl1zYm5leHQgW05dCXNwbGl0IGFuZCB0byBuZXh0IGJ1ZmZlcgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2JuZXh0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZ290b19idWZmZXIoZWFwLCBET0JVRl9DVVJSRU5ULCBGT1JXQVJELCAoaW50KWVhcC0+bGluZTIpOworfQorCisvKgorICogOltOXWJOZXh0IFtOXQl0byBwcmV2aW91cyBidWZmZXIKKyAqIDpbTl1icHJldmlvdXMgW05dCXRvIHByZXZpb3VzIGJ1ZmZlcgorICogOltOXXNiTmV4dCBbTl0Jc3BsaXQgYW5kIHRvIHByZXZpb3VzIGJ1ZmZlcgorICogOltOXXNicHJldmlvdXMgW05dCXNwbGl0IGFuZCB0byBwcmV2aW91cyBidWZmZXIKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9icHJldmlvdXMoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBnb3RvX2J1ZmZlcihlYXAsIERPQlVGX0NVUlJFTlQsIEJBQ0tXQVJELCAoaW50KWVhcC0+bGluZTIpOworfQorCisvKgorICogOmJyZXdpbmQJCXRvIGZpcnN0IGJ1ZmZlcgorICogOmJmaXJzdAkJdG8gZmlyc3QgYnVmZmVyCisgKiA6c2JyZXdpbmQJCXNwbGl0IGFuZCB0byBmaXJzdCBidWZmZXIKKyAqIDpzYmZpcnN0CQlzcGxpdCBhbmQgdG8gZmlyc3QgYnVmZmVyCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYnJld2luZChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGdvdG9fYnVmZmVyKGVhcCwgRE9CVUZfRklSU1QsIEZPUldBUkQsIDApOworfQorCisvKgorICogOmJsYXN0CQl0byBsYXN0IGJ1ZmZlcgorICogOnNibGFzdAkJc3BsaXQgYW5kIHRvIGxhc3QgYnVmZmVyCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYmxhc3QoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBnb3RvX2J1ZmZlcihlYXAsIERPQlVGX0xBU1QsIEJBQ0tXQVJELCAwKTsKK30KKyNlbmRpZgorCisgICAgaW50CitlbmRzX2V4Y21kKGMpCisgICAgaW50CSAgICBjOworeworICAgIHJldHVybiAoYyA9PSBOVUwgfHwgYyA9PSAnfCcgfHwgYyA9PSAnIicgfHwgYyA9PSAnXG4nKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9TWU5fSEwpIHx8IGRlZmluZWQoRkVBVF9TRUFSQ0hfRVhUUkEpIHx8IGRlZmluZWQoRkVBVF9FVkFMKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgY29tbWFuZCwgYWZ0ZXIgdGhlIGZpcnN0ICd8JyBvciAnXG4nLgorICogUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorICovCisgICAgY2hhcl91ICoKK2ZpbmRfbmV4dGNtZChwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICB3aGlsZSAoKnAgIT0gJ3wnICYmICpwICE9ICdcbicpCisgICAgeworCWlmICgqcCA9PSBOVUwpCisJICAgIHJldHVybiBOVUxMOworCSsrcDsKKyAgICB9CisgICAgcmV0dXJuIChwICsgMSk7Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlmICpwIGlzIGEgc2VwYXJhdG9yIGJldHdlZW4gRXggY29tbWFuZHMuCisgKiBSZXR1cm4gTlVMTCBpZiBpdCBpc24ndCwgKHAgKyAxKSBpZiBpdCBpcy4KKyAqLworICAgIGNoYXJfdSAqCitjaGVja19uZXh0Y21kKHApCisgICAgY2hhcl91CSpwOworeworICAgIHAgPSBza2lwd2hpdGUocCk7CisgICAgaWYgKCpwID09ICd8JyB8fCAqcCA9PSAnXG4nKQorCXJldHVybiAocCArIDEpOworICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIC0gaWYgdGhlcmUgYXJlIG1vcmUgZmlsZXMgdG8gZWRpdAorICogLSBhbmQgdGhpcyBpcyB0aGUgbGFzdCB3aW5kb3cKKyAqIC0gYW5kIGZvcmNlaXQgbm90IHVzZWQKKyAqIC0gYW5kIG5vdCByZXBlYXRlZCB0d2ljZSBvbiBhIHJvdworICogICAgcmV0dXJuIEZBSUwgYW5kIGdpdmUgZXJyb3IgbWVzc2FnZSBpZiAnbWVzc2FnZScgVFJVRQorICogcmV0dXJuIE9LIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorY2hlY2tfbW9yZShtZXNzYWdlLCBmb3JjZWl0KQorICAgIGludCBtZXNzYWdlOwkgICAgLyogd2hlbiBGQUxTRSBjaGVjayBvbmx5LCBubyBtZXNzYWdlcyAqLworICAgIGludCBmb3JjZWl0OworeworICAgIGludAkgICAgbiA9IEFSR0NPVU5UIC0gY3Vyd2luLT53X2FyZ19pZHggLSAxOworCisgICAgaWYgKCFmb3JjZWl0ICYmIG9ubHlfb25lX3dpbmRvdygpICYmIEFSR0NPVU5UID4gMSAmJiAhYXJnX2hhZF9sYXN0CisJCQkJCQkgICAmJiBuID49IDAgJiYgcXVpdG1vcmUgPT0gMCkKKyAgICB7CisJaWYgKG1lc3NhZ2UpCisJeworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwkgICAgaWYgKChwX2NvbmZpcm0gfHwgY21kbW9kLmNvbmZpcm0pICYmIGN1cmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMKQorCSAgICB7CisJCWNoYXJfdQlidWZmW0lPU0laRV07CisKKwkJaWYgKG4gPT0gMSkKKwkJICAgIFNUUkNQWShidWZmLCBfKCIxIG1vcmUgZmlsZSB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IikpOworCQllbHNlCisJCSAgICBzcHJpbnRmKChjaGFyICopYnVmZiwKKwkJCSAgICAgIF8oIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIpLCBuKTsKKwkJaWYgKHZpbV9kaWFsb2dfeWVzbm8oVklNX1FVRVNUSU9OLCBOVUxMLCBidWZmLCAxKSA9PSBWSU1fWUVTKQorCQkgICAgcmV0dXJuIE9LOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorI2VuZGlmCisJICAgIGlmIChuID09IDEpCisJCUVNU0coXygiRTE3MzogMSBtb3JlIGZpbGUgdG8gZWRpdCIpKTsKKwkgICAgZWxzZQorCQlFTVNHTihfKCJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IiksIG4pOworCSAgICBxdWl0bW9yZSA9IDI7CSAgICAvKiBuZXh0IHRyeSB0byBxdWl0IGlzIGFsbG93ZWQgKi8KKwl9CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgY29tbWFuZCBuYW1lcy4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK2dldF9jb21tYW5kX25hbWUoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgaWYgKGlkeCA+PSAoaW50KUNNRF9TSVpFKQorIyBpZmRlZiBGRUFUX1VTUl9DTURTCisJcmV0dXJuIGdldF91c2VyX2NvbW1hbmRfbmFtZShpZHgpOworIyBlbHNlCisJcmV0dXJuIE5VTEw7CisjIGVuZGlmCisgICAgcmV0dXJuIGNtZG5hbWVzW2lkeF0uY21kX25hbWU7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9VU1JfQ01EUykgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyBpbnQJdWNfYWRkX2NvbW1hbmQgX19BUkdTKChjaGFyX3UgKm5hbWUsIHNpemVfdCBuYW1lX2xlbiwgY2hhcl91ICpyZXAsIGxvbmcgYXJndCwgbG9uZyBkZWYsIGludCBmbGFncywgaW50IGNvbXBsLCBjaGFyX3UgKmNvbXBsX2FyZywgaW50IGZvcmNlKSk7CitzdGF0aWMgdm9pZAl1Y19saXN0IF9fQVJHUygoY2hhcl91ICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pKTsKK3N0YXRpYyBpbnQJdWNfc2Nhbl9hdHRyIF9fQVJHUygoY2hhcl91ICphdHRyLCBzaXplX3QgbGVuLCBsb25nICphcmd0LCBsb25nICpkZWYsIGludCAqZmxhZ3MsIGludCAqY29tcGwsIGNoYXJfdSAqKmNvbXBsX2FyZykpOworc3RhdGljIGNoYXJfdQkqdWNfc3BsaXRfYXJncyBfX0FSR1MoKGNoYXJfdSAqYXJnLCBzaXplX3QgKmxlbnApKTsKK3N0YXRpYyBzaXplX3QJdWNfY2hlY2tfY29kZSBfX0FSR1MoKGNoYXJfdSAqY29kZSwgc2l6ZV90IGxlbiwgY2hhcl91ICpidWYsIHVjbWRfVCAqY21kLCBleGFyZ19UICplYXAsIGNoYXJfdSAqKnNwbGl0X2J1Ziwgc2l6ZV90ICpzcGxpdF9sZW4pKTsKKworICAgIHN0YXRpYyBpbnQKK3VjX2FkZF9jb21tYW5kKG5hbWUsIG5hbWVfbGVuLCByZXAsIGFyZ3QsIGRlZiwgZmxhZ3MsIGNvbXBsLCBjb21wbF9hcmcsIGZvcmNlKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBzaXplX3QJbmFtZV9sZW47CisgICAgY2hhcl91CSpyZXA7CisgICAgbG9uZwlhcmd0OworICAgIGxvbmcJZGVmOworICAgIGludAkJZmxhZ3M7CisgICAgaW50CQljb21wbDsKKyAgICBjaGFyX3UJKmNvbXBsX2FyZzsKKyAgICBpbnQJCWZvcmNlOworeworICAgIHVjbWRfVAkqY21kID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworICAgIGludAkJY21wID0gMTsKKyAgICBjaGFyX3UJKnJlcF9idWYgPSBOVUxMOworICAgIGdhcnJheV9UCSpnYXA7CisKKyAgICByZXBsYWNlX3Rlcm1jb2RlcyhyZXAsICZyZXBfYnVmLCBGQUxTRSwgRkFMU0UpOworICAgIGlmIChyZXBfYnVmID09IE5VTEwpCisgICAgeworCS8qIENhbid0IHJlcGxhY2UgdGVybWNvZGVzIC0gdHJ5IHVzaW5nIHRoZSBzdHJpbmcgYXMgaXMgKi8KKwlyZXBfYnVmID0gdmltX3N0cnNhdmUocmVwKTsKKworCS8qIEdpdmUgdXAgaWYgb3V0IG9mIG1lbW9yeSAqLworCWlmIChyZXBfYnVmID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIGdldCBhZGRyZXNzIG9mIGdyb3dhcnJheTogZ2xvYmFsIG9yIGluIGN1cmJ1ZiAqLworICAgIGlmIChmbGFncyAmIFVDX0JVRkZFUikKKyAgICB7CisJZ2FwID0gJmN1cmJ1Zi0+Yl91Y21kczsKKwlpZiAoZ2FwLT5nYV9pdGVtc2l6ZSA9PSAwKQorCSAgICBnYV9pbml0MihnYXAsIChpbnQpc2l6ZW9mKHVjbWRfVCksIDQpOworICAgIH0KKyAgICBlbHNlCisJZ2FwID0gJnVjbWRzOworCisgICAgLyogU2VhcmNoIGZvciB0aGUgY29tbWFuZCBpbiB0aGUgYWxyZWFkeSBkZWZpbmVkIGNvbW1hbmRzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbjsgKytpKQorICAgIHsKKwlzaXplX3QgbGVuOworCisJY21kID0gVVNFUl9DTURfR0EoZ2FwLCBpKTsKKwlsZW4gPSBTVFJMRU4oY21kLT51Y19uYW1lKTsKKwljbXAgPSBTVFJOQ01QKG5hbWUsIGNtZC0+dWNfbmFtZSwgbmFtZV9sZW4pOworCWlmIChjbXAgPT0gMCkKKwl7CisJICAgIGlmIChuYW1lX2xlbiA8IGxlbikKKwkJY21wID0gLTE7CisJICAgIGVsc2UgaWYgKG5hbWVfbGVuID4gbGVuKQorCQljbXAgPSAxOworCX0KKworCWlmIChjbXAgPT0gMCkKKwl7CisJICAgIGlmICghZm9yY2UpCisJICAgIHsKKwkJRU1TRyhfKCJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IikpOworCQlnb3RvIGZhaWw7CisJICAgIH0KKworCSAgICB2aW1fZnJlZShjbWQtPnVjX3JlcCk7CisJICAgIGNtZC0+dWNfcmVwID0gMDsKKwkgICAgYnJlYWs7CisJfQorCisJLyogU3RvcCBhcyBzb29uIGFzIHdlIHBhc3MgdGhlIG5hbWUgdG8gYWRkICovCisJaWYgKGNtcCA8IDApCisJICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEV4dGVuZCB0aGUgYXJyYXkgdW5sZXNzIHdlJ3JlIHJlcGxhY2luZyBhbiBleGlzdGluZyBjb21tYW5kICovCisgICAgaWYgKGNtcCAhPSAwKQorICAgIHsKKwlpZiAoZ2FfZ3JvdyhnYXAsIDEpICE9IE9LKQorCSAgICBnb3RvIGZhaWw7CisJaWYgKChwID0gdmltX3N0cm5zYXZlKG5hbWUsIChpbnQpbmFtZV9sZW4pKSA9PSBOVUxMKQorCSAgICBnb3RvIGZhaWw7CisKKwljbWQgPSBVU0VSX0NNRF9HQShnYXAsIGkpOworCW1jaF9tZW1tb3ZlKGNtZCArIDEsIGNtZCwgKGdhcC0+Z2FfbGVuIC0gaSkgKiBzaXplb2YodWNtZF9UKSk7CisKKwkrK2dhcC0+Z2FfbGVuOworCS0tZ2FwLT5nYV9yb29tOworCisJY21kLT51Y19uYW1lID0gcDsKKyAgICB9CisKKyAgICBjbWQtPnVjX3JlcCA9IHJlcF9idWY7CisgICAgY21kLT51Y19hcmd0ID0gYXJndDsKKyAgICBjbWQtPnVjX2RlZiA9IGRlZjsKKyAgICBjbWQtPnVjX2NvbXBsID0gY29tcGw7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgY21kLT51Y19zY3JpcHRJRCA9IGN1cnJlbnRfU0lEOworIyBpZmRlZiBGRUFUX0NNRExfQ09NUEwKKyAgICBjbWQtPnVjX2NvbXBsX2FyZyA9IGNvbXBsX2FyZzsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgcmV0dXJuIE9LOworCitmYWlsOgorICAgIHZpbV9mcmVlKHJlcF9idWYpOworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkKKyAgICB2aW1fZnJlZShjb21wbF9hcmcpOworI2VuZGlmCisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBMaXN0IG9mIG5hbWVzIGZvciBjb21wbGV0aW9uIGZvciAiOmNvbW1hbmQiIHdpdGggdGhlIEVYUEFORF8gZmxhZy4KKyAqIE11c3QgYmUgYWxwaGFiZXRpY2FsIGZvciBjb21wbGV0aW9uLgorICovCitzdGF0aWMgc3RydWN0Cit7CisgICAgaW50CSAgICBleHBhbmQ7CisgICAgY2hhciAgICAqbmFtZTsKK30gY29tbWFuZF9jb21wbGV0ZVtdID0KK3sKKyAgICB7RVhQQU5EX0FVR1JPVVAsICJhdWdyb3VwIn0sCisgICAge0VYUEFORF9CVUZGRVJTLCAiYnVmZmVyIn0sCisgICAge0VYUEFORF9DT01NQU5EUywgImNvbW1hbmQifSwKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgJiYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpCisgICAge0VYUEFORF9VU0VSX0RFRklORUQsICJjdXN0b20ifSwKKyNlbmRpZgorICAgIHtFWFBBTkRfRElSRUNUT1JJRVMsICJkaXIifSwKKyAgICB7RVhQQU5EX0VOVl9WQVJTLCAiZW52aXJvbm1lbnQifSwKKyAgICB7RVhQQU5EX0VWRU5UUywgImV2ZW50In0sCisgICAge0VYUEFORF9FWFBSRVNTSU9OLCAiZXhwcmVzc2lvbiJ9LAorICAgIHtFWFBBTkRfRklMRVMsICJmaWxlIn0sCisgICAge0VYUEFORF9GVU5DVElPTlMsICJmdW5jdGlvbiJ9LAorICAgIHtFWFBBTkRfSEVMUCwgImhlbHAifSwKKyAgICB7RVhQQU5EX0hJR0hMSUdIVCwgImhpZ2hsaWdodCJ9LAorICAgIHtFWFBBTkRfTUFQUElOR1MsICJtYXBwaW5nIn0sCisgICAge0VYUEFORF9NRU5VUywgIm1lbnUifSwKKyAgICB7RVhQQU5EX1NFVFRJTkdTLCAib3B0aW9uIn0sCisgICAge0VYUEFORF9UQUdTLCAidGFnIn0sCisgICAge0VYUEFORF9UQUdTX0xJU1RGSUxFUywgInRhZ19saXN0ZmlsZXMifSwKKyAgICB7RVhQQU5EX1VTRVJfVkFSUywgInZhciJ9LAorICAgIHswLCBOVUxMfQorfTsKKworICAgIHN0YXRpYyB2b2lkCit1Y19saXN0KG5hbWUsIG5hbWVfbGVuKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBzaXplX3QJbmFtZV9sZW47Cit7CisgICAgaW50CQlpLCBqOworICAgIGludAkJZm91bmQgPSBGQUxTRTsKKyAgICB1Y21kX1QJKmNtZDsKKyAgICBpbnQJCWxlbjsKKyAgICBsb25nCWE7CisgICAgZ2FycmF5X1QJKmdhcDsKKworICAgIGdhcCA9ICZjdXJidWYtPmJfdWNtZHM7CisgICAgZm9yICg7OykKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCisJeworCSAgICBjbWQgPSBVU0VSX0NNRF9HQShnYXAsIGkpOworCSAgICBhID0gY21kLT51Y19hcmd0OworCisJICAgIC8qIFNraXAgY29tbWFuZHMgd2hpY2ggZG9uJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBwcmVmaXggKi8KKwkgICAgaWYgKFNUUk5DTVAobmFtZSwgY21kLT51Y19uYW1lLCBuYW1lX2xlbikgIT0gMCkKKwkJY29udGludWU7CisKKwkgICAgLyogUHV0IG91dCB0aGUgdGl0bGUgZmlyc3QgdGltZSAqLworCSAgICBpZiAoIWZvdW5kKQorCQlNU0dfUFVUU19USVRMRShfKCJcbiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIikpOworCSAgICBmb3VuZCA9IFRSVUU7CisJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCSAgICBpZiAoZ290X2ludCkKKwkJYnJlYWs7CisKKwkgICAgLyogU3BlY2lhbCBjYXNlcyAqLworCSAgICBtc2dfcHV0Y2hhcihhICYgQkFORyA/ICchJyA6ICcgJyk7CisJICAgIG1zZ19wdXRjaGFyKGEgJiBSRUdTVFIgPyAnIicgOiAnICcpOworCSAgICBtc2dfcHV0Y2hhcihnYXAgIT0gJnVjbWRzID8gJ2InIDogJyAnKTsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKworCSAgICBtc2dfb3V0dHJhbnNfYXR0cihjbWQtPnVjX25hbWUsIGhsX2F0dHIoSExGX0QpKTsKKwkgICAgbGVuID0gKGludClTVFJMRU4oY21kLT51Y19uYW1lKSArIDQ7CisKKwkgICAgZG8geworCQltc2dfcHV0Y2hhcignICcpOworCQkrK2xlbjsKKwkgICAgfSB3aGlsZSAobGVuIDwgMTYpOworCisJICAgIGxlbiA9IDA7CisKKwkgICAgLyogQXJndW1lbnRzICovCisJICAgIHN3aXRjaCAoKGludCkoYSAmIChFWFRSQXxOT1NQQ3xORUVEQVJHKSkpCisJICAgIHsKKwkgICAgY2FzZSAwOgkJCUlPYnVmZltsZW4rK10gPSAnMCc7IGJyZWFrOworCSAgICBjYXNlIChFWFRSQSk6CQlJT2J1ZmZbbGVuKytdID0gJyonOyBicmVhazsKKwkgICAgY2FzZSAoRVhUUkF8Tk9TUEMpOgkJSU9idWZmW2xlbisrXSA9ICc/JzsgYnJlYWs7CisJICAgIGNhc2UgKEVYVFJBfE5FRURBUkcpOglJT2J1ZmZbbGVuKytdID0gJysnOyBicmVhazsKKwkgICAgY2FzZSAoRVhUUkF8Tk9TUEN8TkVFREFSRyk6IElPYnVmZltsZW4rK10gPSAnMSc7IGJyZWFrOworCSAgICB9CisKKwkgICAgZG8geworCQlJT2J1ZmZbbGVuKytdID0gJyAnOworCSAgICB9IHdoaWxlIChsZW4gPCA1KTsKKworCSAgICAvKiBSYW5nZSAqLworCSAgICBpZiAoYSAmIChSQU5HRXxDT1VOVCkpCisJICAgIHsKKwkJaWYgKGEgJiBDT1VOVCkKKwkJeworCQkgICAgLyogLWNvdW50PU4gKi8KKwkJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYgKyBsZW4sICIlbGRjIiwgY21kLT51Y19kZWYpOworCQkgICAgbGVuICs9IChpbnQpU1RSTEVOKElPYnVmZiArIGxlbik7CisJCX0KKwkJZWxzZSBpZiAoYSAmIERGTEFMTCkKKwkJICAgIElPYnVmZltsZW4rK10gPSAnJSc7CisJCWVsc2UgaWYgKGNtZC0+dWNfZGVmID49IDApCisJCXsKKwkJICAgIC8qIC1yYW5nZT1OICovCisJCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmICsgbGVuLCAiJWxkIiwgY21kLT51Y19kZWYpOworCQkgICAgbGVuICs9IChpbnQpU1RSTEVOKElPYnVmZiArIGxlbik7CisJCX0KKwkJZWxzZQorCQkgICAgSU9idWZmW2xlbisrXSA9ICcuJzsKKwkgICAgfQorCisJICAgIGRvIHsKKwkJSU9idWZmW2xlbisrXSA9ICcgJzsKKwkgICAgfSB3aGlsZSAobGVuIDwgMTEpOworCisJICAgIC8qIENvbXBsZXRpb24gKi8KKwkgICAgZm9yIChqID0gMDsgY29tbWFuZF9jb21wbGV0ZVtqXS5leHBhbmQgIT0gMDsgKytqKQorCQlpZiAoY29tbWFuZF9jb21wbGV0ZVtqXS5leHBhbmQgPT0gY21kLT51Y19jb21wbCkKKwkJeworCQkgICAgU1RSQ1BZKElPYnVmZiArIGxlbiwgY29tbWFuZF9jb21wbGV0ZVtqXS5uYW1lKTsKKwkJICAgIGxlbiArPSAoaW50KVNUUkxFTihJT2J1ZmYgKyBsZW4pOworCQkgICAgYnJlYWs7CisJCX0KKworCSAgICBkbyB7CisJCUlPYnVmZltsZW4rK10gPSAnICc7CisJICAgIH0gd2hpbGUgKGxlbiA8IDIxKTsKKworCSAgICBJT2J1ZmZbbGVuXSA9ICdcMCc7CisJICAgIG1zZ19vdXR0cmFucyhJT2J1ZmYpOworCisJICAgIG1zZ19vdXR0cmFuc19zcGVjaWFsKGNtZC0+dWNfcmVwLCBGQUxTRSk7CisJICAgIG91dF9mbHVzaCgpOworCSAgICB1aV9icmVha2NoZWNrKCk7CisJICAgIGlmIChnb3RfaW50KQorCQlicmVhazsKKwl9CisJaWYgKGdhcCA9PSAmdWNtZHMgfHwgaSA8IGdhcC0+Z2FfbGVuKQorCSAgICBicmVhazsKKwlnYXAgPSAmdWNtZHM7CisgICAgfQorCisgICAgaWYgKCFmb3VuZCkKKwlNU0coXygiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIikpOworfQorCisgICAgc3RhdGljIGNoYXJfdSAqCit1Y19mdW5fY21kKCkKK3sKKyAgICBzdGF0aWMgY2hhcl91IGZjbWRbXSA9IHsweDg0LCAweGFmLCAweDYwLCAweGI5LCAweGFmLCAweGI1LCAweDYwLCAweGE0LAorCQkJICAgIDB4YTUsIDB4YWQsIDB4YTEsIDB4YWUsIDB4YTQsIDB4NjAsIDB4YTEsIDB4NjAsCisJCQkgICAgMHhiMywgMHhhOCwgMHhiMiwgMHhiNSwgMHhhMiwgMHhhMiwgMHhhNSwgMHhiMiwKKwkJCSAgICAweGI5LCAweDdmLCAwfTsKKyAgICBpbnQJCWk7CisKKyAgICBmb3IgKGkgPSAwOyBmY21kW2ldOyArK2kpCisJSU9idWZmW2ldID0gZmNtZFtpXSAtIDB4NDA7CisgICAgSU9idWZmW2ldID0gMDsKKyAgICByZXR1cm4gSU9idWZmOworfQorCisgICAgc3RhdGljIGludAordWNfc2Nhbl9hdHRyKGF0dHIsIGxlbiwgYXJndCwgZGVmLCBmbGFncywgY29tcGwsIGNvbXBsX2FyZykKKyAgICBjaGFyX3UJKmF0dHI7CisgICAgc2l6ZV90CWxlbjsKKyAgICBsb25nCSphcmd0OworICAgIGxvbmcJKmRlZjsKKyAgICBpbnQJCSpmbGFnczsKKyAgICBpbnQJCSpjb21wbDsKKyAgICBjaGFyX3UJKipjb21wbF9hcmc7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgaWYgKGxlbiA9PSAwKQorICAgIHsKKwlFTVNHKF8oIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyogRmlyc3QsIHRyeSB0aGUgc2ltcGxlIGF0dHJpYnV0ZXMgKG5vIGFyZ3VtZW50cykgKi8KKyAgICBpZiAoU1RSTklDTVAoYXR0ciwgImJhbmciLCBsZW4pID09IDApCisJKmFyZ3QgfD0gQkFORzsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChhdHRyLCAiYnVmZmVyIiwgbGVuKSA9PSAwKQorCSpmbGFncyB8PSBVQ19CVUZGRVI7CisgICAgZWxzZSBpZiAoU1RSTklDTVAoYXR0ciwgInJlZ2lzdGVyIiwgbGVuKSA9PSAwKQorCSphcmd0IHw9IFJFR1NUUjsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChhdHRyLCAiYmFyIiwgbGVuKSA9PSAwKQorCSphcmd0IHw9IFRSTEJBUjsKKyAgICBlbHNlCisgICAgeworCWludAlpOworCWNoYXJfdQkqdmFsID0gTlVMTDsKKwlzaXplX3QJdmFsbGVuID0gMDsKKwlzaXplX3QJYXR0cmxlbiA9IGxlbjsKKworCS8qIExvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZSAtIHdoaWNoIGlzIHRoZSBwYXJ0IGJlZm9yZSBhbnkgJz0nICovCisJZm9yIChpID0gMDsgaSA8IChpbnQpbGVuOyArK2kpCisJeworCSAgICBpZiAoYXR0cltpXSA9PSAnPScpCisJICAgIHsKKwkJdmFsID0gJmF0dHJbaSArIDFdOworCQl2YWxsZW4gPSBsZW4gLSBpIC0gMTsKKwkJYXR0cmxlbiA9IGk7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYgKFNUUk5JQ01QKGF0dHIsICJuYXJncyIsIGF0dHJsZW4pID09IDApCisJeworCSAgICBpZiAodmFsbGVuID09IDEpCisJICAgIHsKKwkJaWYgKCp2YWwgPT0gJzAnKQorCQkgICAgLyogRG8gbm90aGluZyAtIHRoaXMgaXMgdGhlIGRlZmF1bHQgKi87CisJCWVsc2UgaWYgKCp2YWwgPT0gJzEnKQorCQkgICAgKmFyZ3QgfD0gKEVYVFJBIHwgTk9TUEMgfCBORUVEQVJHKTsKKwkJZWxzZSBpZiAoKnZhbCA9PSAnKicpCisJCSAgICAqYXJndCB8PSBFWFRSQTsKKwkJZWxzZSBpZiAoKnZhbCA9PSAnPycpCisJCSAgICAqYXJndCB8PSAoRVhUUkEgfCBOT1NQQyk7CisJCWVsc2UgaWYgKCp2YWwgPT0gJysnKQorCQkgICAgKmFyZ3QgfD0gKEVYVFJBIHwgTkVFREFSRyk7CisJCWVsc2UKKwkJICAgIGdvdG8gd3JvbmdfbmFyZ3M7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7Cit3cm9uZ19uYXJnczoKKwkJRU1TRyhfKCJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJfQorCWVsc2UgaWYgKFNUUk5JQ01QKGF0dHIsICJyYW5nZSIsIGF0dHJsZW4pID09IDApCisJeworCSAgICAqYXJndCB8PSBSQU5HRTsKKwkgICAgaWYgKHZhbGxlbiA9PSAxICYmICp2YWwgPT0gJyUnKQorCQkqYXJndCB8PSBERkxBTEw7CisJICAgIGVsc2UgaWYgKHZhbCAhPSBOVUxMKQorCSAgICB7CisJCXAgPSB2YWw7CisJCWlmICgqZGVmID49IDApCisJCXsKK3R3b19jb3VudDoKKwkJICAgIEVNU0coXygiRTE3NzogQ291bnQgY2Fubm90IGJlIHNwZWNpZmllZCB0d2ljZSIpKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisKKwkJKmRlZiA9IGdldGRpZ2l0cygmcCk7CisJCSphcmd0IHw9IChaRVJPUiB8IE5PVEFEUik7CisKKwkJaWYgKHAgIT0gdmFsICsgdmFsbGVuIHx8IHZhbGxlbiA9PSAwKQorCQl7CitpbnZhbGlkX2NvdW50OgorCQkgICAgRU1TRyhfKCJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IikpOworCQkgICAgcmV0dXJuIEZBSUw7CisJCX0KKwkgICAgfQorCX0KKwllbHNlIGlmIChTVFJOSUNNUChhdHRyLCAiY291bnQiLCBhdHRybGVuKSA9PSAwKQorCXsKKwkgICAgKmFyZ3QgfD0gKENPVU5UIHwgWkVST1IgfCBOT1RBRFIpOworCisJICAgIGlmICh2YWwgIT0gTlVMTCkKKwkgICAgeworCQlwID0gdmFsOworCQlpZiAoKmRlZiA+PSAwKQorCQkgICAgZ290byB0d29fY291bnQ7CisKKwkJKmRlZiA9IGdldGRpZ2l0cygmcCk7CisKKwkJaWYgKHAgIT0gdmFsICsgdmFsbGVuKQorCQkgICAgZ290byBpbnZhbGlkX2NvdW50OworCSAgICB9CisKKwkgICAgaWYgKCpkZWYgPCAwKQorCQkqZGVmID0gMDsKKwl9CisJZWxzZSBpZiAoU1RSTklDTVAoYXR0ciwgImNvbXBsZXRlIiwgYXR0cmxlbikgPT0gMCkKKwl7CisJICAgIGNoYXJfdQkqYXJnID0gTlVMTDsKKwkgICAgc2l6ZV90CWFyZ2xlbiA9IDA7CisKKwkgICAgaWYgKHZhbCA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coXygiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIikpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICAvKiBMb29rIGZvciBhbnkgYXJndW1lbnQgcGFydCAtIHdoaWNoIGlzIHRoZSBwYXJ0IGFmdGVyIGFueSAnLCcgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IChpbnQpdmFsbGVuOyArK2kpCisJICAgIHsKKwkJaWYgKHZhbFtpXSA9PSAnLCcpCisJCXsKKwkJICAgIGFyZyA9ICZ2YWxbaSArIDFdOworCQkgICAgYXJnbGVuID0gdmFsbGVuIC0gaSAtIDE7CisJCSAgICB2YWxsZW4gPSBpOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICAgIGZvciAoaSA9IDA7IGNvbW1hbmRfY29tcGxldGVbaV0uZXhwYW5kICE9IDA7ICsraSkKKwkgICAgeworCQlpZiAoU1RSTEVOKGNvbW1hbmRfY29tcGxldGVbaV0ubmFtZSkgPT0gdmFsbGVuCisJCQkmJiBTVFJOQ01QKHZhbCwgY29tbWFuZF9jb21wbGV0ZVtpXS5uYW1lLCB2YWxsZW4pID09IDApCisJCXsKKwkJICAgICpjb21wbCA9IGNvbW1hbmRfY29tcGxldGVbaV0uZXhwYW5kOworCQkgICAgaWYgKGNvbW1hbmRfY29tcGxldGVbaV0uZXhwYW5kID09IEVYUEFORF9CVUZGRVJTKQorCQkJKmFyZ3QgfD0gQlVGTkFNRTsKKwkJICAgIGVsc2UgaWYgKGNvbW1hbmRfY29tcGxldGVbaV0uZXhwYW5kID09IEVYUEFORF9ESVJFQ1RPUklFUworCQkJICAgIHx8IGNvbW1hbmRfY29tcGxldGVbaV0uZXhwYW5kID09IEVYUEFORF9GSUxFUykKKwkJCSphcmd0IHw9IFhGSUxFOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICAgIGlmIChjb21tYW5kX2NvbXBsZXRlW2ldLmV4cGFuZCA9PSAwKQorCSAgICB7CisJCUVNU0cyKF8oIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIiksIHZhbCk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisjaWYgZGVmaW5lZChGRUFUX0VWQUwpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKQorCSAgICBpZiAoKmNvbXBsICE9IEVYUEFORF9VU0VSX0RFRklORUQgJiYgYXJnICE9IE5VTEwpCisjZWxzZQorCSAgICBpZiAoYXJnICE9IE5VTEwpCisjZW5kaWYKKwkgICAgeworCQlFTVNHKF8oIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgJiYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpCisJICAgIGlmICgqY29tcGwgPT0gRVhQQU5EX1VTRVJfREVGSU5FRCAmJiBhcmcgPT0gTlVMTCkKKwkgICAgeworCQlFTVNHKF8oIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiKSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGlmIChhcmcgIT0gTlVMTCkKKwkJKmNvbXBsX2FyZyA9IHZpbV9zdHJuc2F2ZShhcmcsIChpbnQpYXJnbGVuKTsKKyNlbmRpZgorCX0KKwllbHNlCisJeworCSAgICBjaGFyX3UgY2ggPSBhdHRyW2xlbl07CisJICAgIGF0dHJbbGVuXSA9ICdcMCc7CisJICAgIEVNU0cyKF8oIkUxODE6IEludmFsaWQgYXR0cmlidXRlOiAlcyIpLCBhdHRyKTsKKwkgICAgYXR0cltsZW5dID0gY2g7CisJICAgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZXhfY29tbWFuZChlYXApCisgICAgZXhhcmdfVCAgICplYXA7Cit7CisgICAgY2hhcl91ICAqbmFtZTsKKyAgICBjaGFyX3UgICplbmQ7CisgICAgY2hhcl91ICAqcDsKKyAgICBsb25nICAgIGFyZ3QgPSAwOworICAgIGxvbmcgICAgZGVmID0gLTE7CisgICAgaW50CSAgICBmbGFncyA9IDA7CisgICAgaW50CSAgICBjb21wbCA9IEVYUEFORF9OT1RISU5HOworICAgIGNoYXJfdSAgKmNvbXBsX2FyZyA9IE5VTEw7CisgICAgaW50CSAgICBoYXNfYXR0ciA9IChlYXAtPmFyZ1swXSA9PSAnLScpOworCisgICAgcCA9IGVhcC0+YXJnOworCisgICAgLyogQ2hlY2sgZm9yIGF0dHJpYnV0ZXMgKi8KKyAgICB3aGlsZSAoKnAgPT0gJy0nKQorICAgIHsKKwkrK3A7CisJZW5kID0gc2tpcHRvd2hpdGUocCk7CisJaWYgKHVjX3NjYW5fYXR0cihwLCBlbmQgLSBwLCAmYXJndCwgJmRlZiwgJmZsYWdzLCAmY29tcGwsICZjb21wbF9hcmcpCisJCT09IEZBSUwpCisJICAgIHJldHVybjsKKwlwID0gc2tpcHdoaXRlKGVuZCk7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBuYW1lIChpZiBhbnkpIGFuZCBza2lwIHRvIHRoZSBmb2xsb3dpbmcgYXJndW1lbnQgKi8KKyAgICBuYW1lID0gcDsKKyAgICBpZiAoQVNDSUlfSVNBTFBIQSgqcCkpCisJd2hpbGUgKEFTQ0lJX0lTQUxOVU0oKnApKQorCSAgICArK3A7CisgICAgaWYgKCFlbmRzX2V4Y21kKCpwKSAmJiAhdmltX2lzd2hpdGUoKnApKQorICAgIHsKKwlFTVNHKF8oIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIikpOworCXJldHVybjsKKyAgICB9CisgICAgZW5kID0gcDsKKworICAgIC8qIElmIHRoZXJlIGlzIG5vdGhpbmcgYWZ0ZXIgdGhlIG5hbWUsIGFuZCBubyBhdHRyaWJ1dGVzIHdlcmUgc3BlY2lmaWVkLAorICAgICAqIHdlIGFyZSBsaXN0aW5nIGNvbW1hbmRzCisgICAgICovCisgICAgcCA9IHNraXB3aGl0ZShlbmQpOworICAgIGlmICghaGFzX2F0dHIgJiYgZW5kc19leGNtZCgqcCkpCisgICAgeworCXVjX2xpc3QobmFtZSwgZW5kIC0gbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFBU0NJSV9JU1VQUEVSKCpuYW1lKSkKKyAgICB7CisJRU1TRyhfKCJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiKSk7CisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisJdWNfYWRkX2NvbW1hbmQobmFtZSwgZW5kIC0gbmFtZSwgcCwgYXJndCwgZGVmLCBmbGFncywgY29tcGwsIGNvbXBsX2FyZywKKwkJCQkJCQkJZWFwLT5mb3JjZWl0KTsKK30KKworLyoKKyAqICI6Y29tY2xlYXIiCisgKi8KKy8qQVJHU1VTRUQqLworLyoKKyAqIENsZWFyIGFsbCB1c2VyIGNvbW1hbmRzLCBnbG9iYWwgYW5kIGZvciBjdXJyZW50IGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9jb21jbGVhcihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHVjX2NsZWFyKCZ1Y21kcyk7CisgICAgdWNfY2xlYXIoJmN1cmJ1Zi0+Yl91Y21kcyk7Cit9CisKKy8qCisgKiBDbGVhciBhbGwgdXNlciBjb21tYW5kcyBmb3IgImdhcCIuCisgKi8KKyAgICB2b2lkCit1Y19jbGVhcihnYXApCisgICAgZ2FycmF5X1QJKmdhcDsKK3sKKyAgICBpbnQJCWk7CisgICAgdWNtZF9UCSpjbWQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47ICsraSkKKyAgICB7CisJY21kID0gVVNFUl9DTURfR0EoZ2FwLCBpKTsKKwl2aW1fZnJlZShjbWQtPnVjX25hbWUpOworCXZpbV9mcmVlKGNtZC0+dWNfcmVwKTsKKyMgaWYgZGVmaW5lZChGRUFUX0VWQUwpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKQorCXZpbV9mcmVlKGNtZC0+dWNfY29tcGxfYXJnKTsKKyMgZW5kaWYKKyAgICB9CisgICAgZ2FfY2xlYXIoZ2FwKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitleF9kZWxjb21tYW5kKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlpID0gMDsKKyAgICB1Y21kX1QJKmNtZCA9IE5VTEw7CisgICAgaW50CQljbXAgPSAtMTsKKyAgICBnYXJyYXlfVAkqZ2FwOworCisgICAgZ2FwID0gJmN1cmJ1Zi0+Yl91Y21kczsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47ICsraSkKKwl7CisJICAgIGNtZCA9IFVTRVJfQ01EX0dBKGdhcCwgaSk7CisJICAgIGNtcCA9IFNUUkNNUChlYXAtPmFyZywgY21kLT51Y19uYW1lKTsKKwkgICAgaWYgKGNtcCA8PSAwKQorCQlicmVhazsKKwl9CisJaWYgKGdhcCA9PSAmdWNtZHMgfHwgY21wID09IDApCisJICAgIGJyZWFrOworCWdhcCA9ICZ1Y21kczsKKyAgICB9CisKKyAgICBpZiAoY21wICE9IDApCisgICAgeworCUVNU0cyKF8oIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIiksIGVhcC0+YXJnKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgdmltX2ZyZWUoY21kLT51Y19uYW1lKTsKKyAgICB2aW1fZnJlZShjbWQtPnVjX3JlcCk7CisjIGlmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkKKyAgICB2aW1fZnJlZShjbWQtPnVjX2NvbXBsX2FyZyk7CisjIGVuZGlmCisKKyAgICAtLWdhcC0+Z2FfbGVuOworICAgICsrZ2FwLT5nYV9yb29tOworCisgICAgaWYgKGkgPCBnYXAtPmdhX2xlbikKKwltY2hfbWVtbW92ZShjbWQsIGNtZCArIDEsIChnYXAtPmdhX2xlbiAtIGkpICogc2l6ZW9mKHVjbWRfVCkpOworfQorCisgICAgc3RhdGljIGNoYXJfdSAqCit1Y19zcGxpdF9hcmdzKGFyZywgbGVucCkKKyAgICBjaGFyX3UgKmFyZzsKKyAgICBzaXplX3QgKmxlbnA7Cit7CisgICAgY2hhcl91ICpidWY7CisgICAgY2hhcl91ICpwOworICAgIGNoYXJfdSAqcTsKKyAgICBpbnQgbGVuOworCisgICAgLyogUHJlY2FsY3VsYXRlIGxlbmd0aCAqLworICAgIHAgPSBhcmc7CisgICAgbGVuID0gMjsgLyogSW5pdGlhbCBhbmQgZmluYWwgcXVvdGVzICovCisKKyAgICB3aGlsZSAoKnApCisgICAgeworCWlmIChwWzBdID09ICdcXCcgJiYgdmltX2lzd2hpdGUocFsxXSkpCisJeworCSAgICBsZW4gKz0gMTsKKwkgICAgcCArPSAyOworCX0KKwllbHNlIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICciJykKKwl7CisJICAgIGxlbiArPSAyOworCSAgICBwICs9IDE7CisJfQorCWVsc2UgaWYgKHZpbV9pc3doaXRlKCpwKSkKKwl7CisJICAgIHAgPSBza2lwd2hpdGUocCk7CisJICAgIGlmICgqcCA9PSBOVUwpCisJCWJyZWFrOworCSAgICBsZW4gKz0gMzsgLyogIiwiICovCisJfQorCWVsc2UKKwl7CisJICAgICsrbGVuOworCSAgICArK3A7CisJfQorICAgIH0KKworICAgIGJ1ZiA9IGFsbG9jKGxlbiArIDEpOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICB7CisJKmxlbnAgPSAwOworCXJldHVybiBidWY7CisgICAgfQorCisgICAgcCA9IGFyZzsKKyAgICBxID0gYnVmOworICAgICpxKysgPSAnIic7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKwlpZiAocFswXSA9PSAnXFwnICYmIHZpbV9pc3doaXRlKHBbMV0pKQorCXsKKwkgICAgKnErKyA9IHBbMV07CisJICAgIHAgKz0gMjsKKwl9CisJZWxzZSBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnIicpCisJeworCSAgICAqcSsrID0gJ1xcJzsKKwkgICAgKnErKyA9ICpwKys7CisJfQorCWVsc2UgaWYgKHZpbV9pc3doaXRlKCpwKSkKKwl7CisJICAgIHAgPSBza2lwd2hpdGUocCk7CisJICAgIGlmICgqcCA9PSBOVUwpCisJCWJyZWFrOworCSAgICAqcSsrID0gJyInOworCSAgICAqcSsrID0gJywnOworCSAgICAqcSsrID0gJyInOworCX0KKwllbHNlCisJeworCSAgICAqcSsrID0gKnArKzsKKwl9CisgICAgfQorICAgICpxKysgPSAnIic7CisgICAgKnEgPSAwOworCisgICAgKmxlbnAgPSBsZW47CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIDw+IGNvZGUgaW4gYSB1c2VyIGNvbW1hbmQuCisgKiAiY29kZSIgcG9pbnRzIHRvIHRoZSAnPCcuICAibGVuIiB0aGUgbGVuZ3RoIG9mIHRoZSA8PiAoaW5jbHVzaXZlKS4KKyAqICJidWYiIGlzIHdoZXJlIHRoZSByZXN1bHQgaXMgdG8gYmUgYWRkZWQuCisgKiAic3BsaXRfYnVmIiBwb2ludHMgdG8gYSBidWZmZXIgdXNlZCBmb3Igc3BsaXR0aW5nLCBjYWxsZXIgc2hvdWxkIGZyZWUgaXQuCisgKiAic3BsaXRfbGVuIiBpcyB0aGUgbGVuZ3RoIG9mIHdoYXQgInNwbGl0X2J1ZiIgY29udGFpbnMuCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlcGxhY2VtZW50LCB3aGljaCBoYXMgYmVlbiBhZGRlZCB0byAiYnVmIi4KKyAqIFJldHVybnMgLTEgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLCBhbmQgb25seSB0aGUgIjwiIGhhcyBiZWVuIGNvcGllZC4KKyAqLworICAgIHN0YXRpYyBzaXplX3QKK3VjX2NoZWNrX2NvZGUoY29kZSwgbGVuLCBidWYsIGNtZCwgZWFwLCBzcGxpdF9idWYsIHNwbGl0X2xlbikKKyAgICBjaGFyX3UJKmNvZGU7CisgICAgc2l6ZV90CWxlbjsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICB1Y21kX1QJKmNtZDsJCS8qIHRoZSB1c2VyIGNvbW1hbmQgd2UncmUgZXhwYW5kaW5nICovCisgICAgZXhhcmdfVAkqZWFwOwkJLyogZXggYXJndW1lbnRzICovCisgICAgY2hhcl91CSoqc3BsaXRfYnVmOworICAgIHNpemVfdAkqc3BsaXRfbGVuOworeworICAgIHNpemVfdAlyZXN1bHQgPSAwOworICAgIGNoYXJfdQkqcCA9IGNvZGUgKyAxOworICAgIHNpemVfdAlsID0gbGVuIC0gMjsKKyAgICBpbnQJCXF1b3RlID0gMDsKKyAgICBlbnVtIHsgY3RfQVJHUywgY3RfQkFORywgY3RfQ09VTlQsIGN0X0xJTkUxLCBjdF9MSU5FMiwgY3RfUkVHSVNURVIsCisJY3RfTFQsIGN0X05PTkUgfSB0eXBlID0gY3RfTk9ORTsKKworICAgIGlmICgodmltX3N0cmNocigoY2hhcl91ICopInFRZkYiLCAqcCkgIT0gTlVMTCkgJiYgcFsxXSA9PSAnLScpCisgICAgeworCXF1b3RlID0gKCpwID09ICdxJyB8fCAqcCA9PSAnUScpID8gMSA6IDI7CisJcCArPSAyOworCWwgLT0gMjsKKyAgICB9CisKKyAgICBpZiAobCA8IDEpCisJdHlwZSA9IGN0X05PTkU7CisgICAgZWxzZSBpZiAoU1RSTklDTVAocCwgImFyZ3MiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9BUkdTOworICAgIGVsc2UgaWYgKFNUUk5JQ01QKHAsICJiYW5nIiwgbCkgPT0gMCkKKwl0eXBlID0gY3RfQkFORzsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChwLCAiY291bnQiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9DT1VOVDsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChwLCAibGluZTEiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9MSU5FMTsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChwLCAibGluZTIiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9MSU5FMjsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChwLCAibHQiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9MVDsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChwLCAicmVnaXN0ZXIiLCBsKSA9PSAwKQorCXR5cGUgPSBjdF9SRUdJU1RFUjsKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBjdF9BUkdTOgorCS8qIFNpbXBsZSBjYXNlIGZpcnN0ICovCisJaWYgKCplYXAtPmFyZyA9PSBOVUwpCisJeworCSAgICBpZiAocXVvdGUgPT0gMSkKKwkgICAgeworCQlyZXN1bHQgPSAyOworCQlpZiAoYnVmICE9IE5VTEwpCisJCSAgICBTVFJDUFkoYnVmLCAiJyciKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXJlc3VsdCA9IDA7CisJICAgIGJyZWFrOworCX0KKworCS8qIFdoZW4gc3BlY2lmaWVkIHRoZXJlIGlzIGEgc2luZ2xlIGFyZ3VtZW50IGRvbid0IHNwbGl0IGl0LgorCSAqIFdvcmtzIGZvciAiOkNtZCAlIiB3aGVuICUgaXMgImEgYiBjIi4gKi8KKwlpZiAoKGVhcC0+YXJndCAmIE5PU1BDKSAmJiBxdW90ZSA9PSAyKQorCSAgICBxdW90ZSA9IDE7CisKKwlzd2l0Y2ggKHF1b3RlKQorCXsKKwljYXNlIDA6IC8qIE5vIHF1b3RpbmcsIG5vIHNwbGl0dGluZyAqLworCSAgICByZXN1bHQgPSBTVFJMRU4oZWFwLT5hcmcpOworCSAgICBpZiAoYnVmICE9IE5VTEwpCisJCVNUUkNQWShidWYsIGVhcC0+YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOiAvKiBRdW90ZSwgYnV0IGRvbid0IHNwbGl0ICovCisJICAgIHJlc3VsdCA9IFNUUkxFTihlYXAtPmFyZykgKyAyOworCSAgICBmb3IgKHAgPSBlYXAtPmFyZzsgKnA7ICsrcCkKKwkgICAgeworCQlpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnIicpCisJCSAgICArK3Jlc3VsdDsKKwkgICAgfQorCisJICAgIGlmIChidWYgIT0gTlVMTCkKKwkgICAgeworCQkqYnVmKysgPSAnIic7CisJCWZvciAocCA9IGVhcC0+YXJnOyAqcDsgKytwKQorCQl7CisJCSAgICBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnIicpCisJCQkqYnVmKysgPSAnXFwnOworCQkgICAgKmJ1ZisrID0gKnA7CisJCX0KKwkJKmJ1ZiA9ICciJzsKKwkgICAgfQorCisJICAgIGJyZWFrOworCWNhc2UgMjogLyogUXVvdGUgYW5kIHNwbGl0ICovCisJICAgIC8qIFRoaXMgaXMgaGFyZCwgc28gb25seSBkbyBpdCBvbmNlLCBhbmQgY2FjaGUgdGhlIHJlc3VsdCAqLworCSAgICBpZiAoKnNwbGl0X2J1ZiA9PSBOVUxMKQorCQkqc3BsaXRfYnVmID0gdWNfc3BsaXRfYXJncyhlYXAtPmFyZywgc3BsaXRfbGVuKTsKKworCSAgICByZXN1bHQgPSAqc3BsaXRfbGVuOworCSAgICBpZiAoYnVmICE9IE5VTEwgJiYgcmVzdWx0ICE9IDApCisJCVNUUkNQWShidWYsICpzcGxpdF9idWYpOworCisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKworICAgIGNhc2UgY3RfQkFORzoKKwlyZXN1bHQgPSBlYXAtPmZvcmNlaXQgPyAxIDogMDsKKwlpZiAocXVvdGUpCisJICAgIHJlc3VsdCArPSAyOworCWlmIChidWYgIT0gTlVMTCkKKwl7CisJICAgIGlmIChxdW90ZSkKKwkJKmJ1ZisrID0gJyInOworCSAgICBpZiAoZWFwLT5mb3JjZWl0KQorCQkqYnVmKysgPSAnISc7CisJICAgIGlmIChxdW90ZSkKKwkJKmJ1ZiA9ICciJzsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIGN0X0xJTkUxOgorICAgIGNhc2UgY3RfTElORTI6CisgICAgY2FzZSBjdF9DT1VOVDoKKyAgICB7CisJY2hhciBudW1fYnVmWzIwXTsKKwlsb25nIG51bSA9ICh0eXBlID09IGN0X0xJTkUxKSA/IGVhcC0+bGluZTEgOgorCQkgICAodHlwZSA9PSBjdF9MSU5FMikgPyBlYXAtPmxpbmUyIDoKKwkJICAgKGVhcC0+YWRkcl9jb3VudCA+IDApID8gZWFwLT5saW5lMiA6IGNtZC0+dWNfZGVmOworCXNpemVfdCBudW1fbGVuOworCisJc3ByaW50ZihudW1fYnVmLCAiJWxkIiwgbnVtKTsKKwludW1fbGVuID0gU1RSTEVOKG51bV9idWYpOworCXJlc3VsdCA9IG51bV9sZW47CisKKwlpZiAocXVvdGUpCisJICAgIHJlc3VsdCArPSAyOworCisJaWYgKGJ1ZiAhPSBOVUxMKQorCXsKKwkgICAgaWYgKHF1b3RlKQorCQkqYnVmKysgPSAnIic7CisJICAgIFNUUkNQWShidWYsIG51bV9idWYpOworCSAgICBidWYgKz0gbnVtX2xlbjsKKwkgICAgaWYgKHF1b3RlKQorCQkqYnVmID0gJyInOworCX0KKworCWJyZWFrOworICAgIH0KKworICAgIGNhc2UgY3RfUkVHSVNURVI6CisJcmVzdWx0ID0gZWFwLT5yZWduYW1lID8gMSA6IDA7CisJaWYgKHF1b3RlKQorCSAgICByZXN1bHQgKz0gMjsKKwlpZiAoYnVmICE9IE5VTEwpCisJeworCSAgICBpZiAocXVvdGUpCisJCSpidWYrKyA9ICdcJyc7CisJICAgIGlmIChlYXAtPnJlZ25hbWUpCisJCSpidWYrKyA9IGVhcC0+cmVnbmFtZTsKKwkgICAgaWYgKHF1b3RlKQorCQkqYnVmID0gJ1wnJzsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIGN0X0xUOgorCXJlc3VsdCA9IDE7CisJaWYgKGJ1ZiAhPSBOVUxMKQorCSAgICAqYnVmID0gJzwnOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkvKiBOb3QgcmVjb2duaXplZDoganVzdCBjb3B5IHRoZSAnPCcgYW5kIHJldHVybiAtMS4gKi8KKwlyZXN1bHQgPSAoc2l6ZV90KS0xOworCWlmIChidWYgIT0gTlVMTCkKKwkgICAgKmJ1ZiA9ICc8JzsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisgICAgc3RhdGljIHZvaWQKK2RvX3VjbWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpxOworCisgICAgY2hhcl91CSpzdGFydDsKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBzaXplX3QJbGVuLCB0b3RsZW47CisKKyAgICBzaXplX3QJc3BsaXRfbGVuID0gMDsKKyAgICBjaGFyX3UJKnNwbGl0X2J1ZiA9IE5VTEw7CisgICAgdWNtZF9UCSpjbWQ7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgc2NpZF9UCXNhdmVfY3VycmVudF9TSUQgPSBjdXJyZW50X1NJRDsKKyNlbmRpZgorCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9VU0VSKQorCWNtZCA9IFVTRVJfQ01EKGVhcC0+dXNlcmlkeCk7CisgICAgZWxzZQorCWNtZCA9IFVTRVJfQ01EX0dBKCZjdXJidWYtPmJfdWNtZHMsIGVhcC0+dXNlcmlkeCk7CisKKyAgICAvKgorICAgICAqIFJlcGxhY2UgPD4gaW4gdGhlIGNvbW1hbmQgYnkgdGhlIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBidWYgPSBOVUxMOworICAgIGZvciAoOzspCisgICAgeworCXAgPSBjbWQtPnVjX3JlcDsKKwlxID0gYnVmOworCXRvdGxlbiA9IDA7CisJd2hpbGUgKChzdGFydCA9IHZpbV9zdHJjaHIocCwgJzwnKSkgIT0gTlVMTAorCSAgICAgICAmJiAoZW5kID0gdmltX3N0cmNocihzdGFydCArIDEsICc+JykpICE9IE5VTEwpCisJeworCSAgICAvKiBJbmNsdWRlIHRoZSAnPicgKi8KKwkgICAgKytlbmQ7CisKKwkgICAgLyogVGFrZSBldmVyeXRoaW5nIHVwIHRvIHRoZSAnPCcgKi8KKwkgICAgbGVuID0gc3RhcnQgLSBwOworCSAgICBpZiAoYnVmID09IE5VTEwpCisJCXRvdGxlbiArPSBsZW47CisJICAgIGVsc2UKKwkgICAgeworCQltY2hfbWVtbW92ZShxLCBwLCBsZW4pOworCQlxICs9IGxlbjsKKwkgICAgfQorCisJICAgIGxlbiA9IHVjX2NoZWNrX2NvZGUoc3RhcnQsIGVuZCAtIHN0YXJ0LCBxLCBjbWQsIGVhcCwKKwkJCSAgICAgJnNwbGl0X2J1ZiwgJnNwbGl0X2xlbik7CisJICAgIGlmIChsZW4gPT0gKHNpemVfdCktMSkKKwkgICAgeworCQkvKiBubyBtYXRjaCwgY29udGludWUgYWZ0ZXIgJzwnICovCisJCXAgPSBzdGFydCArIDE7CisJCWxlbiA9IDE7CisJICAgIH0KKwkgICAgZWxzZQorCQlwID0gZW5kOworCSAgICBpZiAoYnVmID09IE5VTEwpCisJCXRvdGxlbiArPSBsZW47CisJICAgIGVsc2UKKwkJcSArPSBsZW47CisJfQorCWlmIChidWYgIT0gTlVMTCkJICAgIC8qIHNlY29uZCB0aW1lIGhlcmUsIGZpbmlzaGVkICovCisJeworCSAgICBTVFJDUFkocSwgcCk7CisJICAgIGJyZWFrOworCX0KKworCXRvdGxlbiArPSBTVFJMRU4ocCk7CSAgICAvKiBBZGQgb24gdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMgKi8KKwlidWYgPSBhbGxvYygodW5zaWduZWQpKHRvdGxlbiArIDEpKTsKKwlpZiAoYnVmID09IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShzcGxpdF9idWYpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfRVZBTAorICAgIGN1cnJlbnRfU0lEID0gY21kLT51Y19zY3JpcHRJRDsKKyNlbmRpZgorICAgICh2b2lkKWRvX2NtZGxpbmUoYnVmLCBlYXAtPmdldGxpbmUsIGVhcC0+Y29va2llLAorCQkJCSAgIERPQ01EX1ZFUkJPU0V8RE9DTURfTk9XQUlUfERPQ01EX0tFWVRZUEVEKTsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBjdXJyZW50X1NJRCA9IHNhdmVfY3VycmVudF9TSUQ7CisjZW5kaWYKKyAgICB2aW1fZnJlZShidWYpOworICAgIHZpbV9mcmVlKHNwbGl0X2J1Zik7Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgc3RhdGljIGNoYXJfdSAqCitnZXRfdXNlcl9jb21tYW5kX25hbWUoaWR4KQorICAgIGludAkJaWR4OworeworICAgIHJldHVybiBnZXRfdXNlcl9jb21tYW5kcyhOVUxMLCBpZHggLSAoaW50KUNNRF9TSVpFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgdXNlciBjb21tYW5kIG5hbWVzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X3VzZXJfY29tbWFuZHMoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgaWYgKGlkeCA8IGN1cmJ1Zi0+Yl91Y21kcy5nYV9sZW4pCisJcmV0dXJuIFVTRVJfQ01EX0dBKCZjdXJidWYtPmJfdWNtZHMsIGlkeCktPnVjX25hbWU7CisgICAgaWR4IC09IGN1cmJ1Zi0+Yl91Y21kcy5nYV9sZW47CisgICAgaWYgKGlkeCA8IHVjbWRzLmdhX2xlbikKKwlyZXR1cm4gVVNFUl9DTUQoaWR4KS0+dWNfbmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgdXNlciBjb21tYW5kCisgKiBhdHRyaWJ1dGVzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X3VzZXJfY21kX2ZsYWdzKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIHN0YXRpYyBjaGFyICp1c2VyX2NtZF9mbGFnc1tdID0KKwl7ImJhbmciLCAiYmFyIiwgImJ1ZmZlciIsICJjb21wbGV0ZSIsICJjb3VudCIsCisJICAgICJuYXJncyIsICJyYW5nZSIsICJyZWdpc3RlciJ9OworCisgICAgaWYgKGlkeCA+PSBzaXplb2YodXNlcl9jbWRfZmxhZ3MpIC8gc2l6ZW9mKHVzZXJfY21kX2ZsYWdzWzBdKSkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXJfdSAqKXVzZXJfY21kX2ZsYWdzW2lkeF07Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXZlbiB0byBFeHBhbmRHZW5lcmljKCkgdG8gb2J0YWluIHRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgLW5hcmdzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X3VzZXJfY21kX25hcmdzKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIHN0YXRpYyBjaGFyICp1c2VyX2NtZF9uYXJnc1tdID0geyIwIiwgIjEiLCAiKiIsICI/IiwgIisifTsKKworICAgIGlmIChpZHggPj0gc2l6ZW9mKHVzZXJfY21kX25hcmdzKSAvIHNpemVvZih1c2VyX2NtZF9uYXJnc1swXSkpCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyX3UgKil1c2VyX2NtZF9uYXJnc1tpZHhdOworfQorCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIC1jb21wbGV0ZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK2dldF91c2VyX2NtZF9jb21wbGV0ZSh4cCwgaWR4KQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBpbnQJCWlkeDsKK3sKKyAgICByZXR1cm4gKGNoYXJfdSAqKWNvbW1hbmRfY29tcGxldGVbaWR4XS5uYW1lOworfQorIyBlbmRpZiAvKiBGRUFUX0NNRExfQ09NUEwgKi8KKworI2VuZGlmCS8qIEZFQVRfVVNSX0NNRFMgKi8KKworICAgIHN0YXRpYyB2b2lkCitleF9jb2xvcnNjaGVtZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmIChsb2FkX2NvbG9ycyhlYXAtPmFyZykgPT0gRkFJTCkKKwlFTVNHMihfKCJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiKSwgZWFwLT5hcmcpOworfQorCisgICAgc3RhdGljIHZvaWQKK2V4X2hpZ2hsaWdodChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmICgqZWFwLT5hcmcgPT0gTlVMICYmIGVhcC0+Y21kWzJdID09ICchJykKKwlNU0coXygiR3JlZXRpbmdzLCBWaW0gdXNlciEiKSk7CisgICAgZG9faGlnaGxpZ2h0KGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQsIEZBTFNFKTsKK30KKworCisvKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHdlIHRob3VnaHQgd2Ugd2VyZSBnb2luZyB0byBleGl0LCBidXQgd2Ugd29uJ3QKKyAqIChiZWNhdXNlIG9mIGFuIGVycm9yKS4gIE1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHRlcm1pbmFsIG1vZGUuCisgKi8KKyAgICB2b2lkCitub3RfZXhpdGluZygpCit7CisgICAgZXhpdGluZyA9IEZBTFNFOworICAgIHNldHRtb2RlKFRNT0RFX1JBVyk7Cit9CisKKy8qCisgKiAiOnF1aXQiOiBxdWl0IGN1cnJlbnQgd2luZG93LCBxdWl0IFZpbSBpZiBjbG9zZWQgdGhlIGxhc3Qgd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3F1aXQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyNpZmRlZiBGRUFUX0NNRFdJTgorICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorICAgIHsKKwljbWR3aW5fcmVzdWx0ID0gQ3RybF9DOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIG5ldGJlYW5zRm9yY2VkUXVpdCA9IGVhcC0+Zm9yY2VpdDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbW9yZSBmaWxlcyBvciB3aW5kb3dzIHdlIHdvbid0IGV4aXQuCisgICAgICovCisgICAgaWYgKGNoZWNrX21vcmUoRkFMU0UsIGVhcC0+Zm9yY2VpdCkgPT0gT0sgJiYgb25seV9vbmVfd2luZG93KCkpCisJZXhpdGluZyA9IFRSVUU7CisgICAgaWYgKCghUF9ISUQoY3VyYnVmKQorCQkmJiBjaGVja19jaGFuZ2VkKGN1cmJ1ZiwgcF9hd2EsIEZBTFNFLCBlYXAtPmZvcmNlaXQsIEZBTFNFKSkKKwkgICAgfHwgY2hlY2tfbW9yZShUUlVFLCBlYXAtPmZvcmNlaXQpID09IEZBSUwKKwkgICAgfHwgKG9ubHlfb25lX3dpbmRvdygpICYmIGNoZWNrX2NoYW5nZWRfYW55KGVhcC0+Zm9yY2VpdCkpKQorICAgIHsKKwlub3RfZXhpdGluZygpOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIEZFQVRfV0lORE9XUworCWlmIChvbmx5X29uZV93aW5kb3coKSkJICAgIC8qIHF1aXQgbGFzdCB3aW5kb3cgKi8KKyNlbmRpZgorCSAgICBnZXRvdXQoMCk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisjIGlmZGVmIEZFQVRfR1VJCisJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyMgZW5kaWYKKwkvKiBjbG9zZSB3aW5kb3c7IG1heSBmcmVlIGJ1ZmZlciAqLworCXdpbl9jbG9zZShjdXJ3aW4sICFQX0hJRChjdXJ3aW4tPndfYnVmZmVyKSB8fCBlYXAtPmZvcmNlaXQpOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogIjpjcXVpdCIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitleF9jcXVpdChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGdldG91dCgxKTsJLyogdGhpcyBkb2VzIG5vdCBhbHdheXMgcGFzcyBvbiB0aGUgZXhpdCBjb2RlIHRvIHRoZSBNYW54CisJCSAgIGNvbXBpbGVyLiB3aHk/ICovCit9CisKKy8qCisgKiAiOnFhbGwiOiB0cnkgdG8gcXVpdCBhbGwgd2luZG93cworICovCisgICAgc3RhdGljIHZvaWQKK2V4X3F1aXRfYWxsKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisjIGlmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDApCisgICAgeworCWlmIChlYXAtPmZvcmNlaXQpCisJICAgIGNtZHdpbl9yZXN1bHQgPSBLX1hGMTsJLyogZXhfd2luZG93KCkgdGFrZXMgY2FyZSBvZiB0aGlzICovCisJZWxzZQorCSAgICBjbWR3aW5fcmVzdWx0ID0gS19YRjI7CisJcmV0dXJuOworICAgIH0KKyMgZW5kaWYKKyAgICBleGl0aW5nID0gVFJVRTsKKyAgICBpZiAoZWFwLT5mb3JjZWl0IHx8ICFjaGVja19jaGFuZ2VkX2FueShGQUxTRSkpCisJZ2V0b3V0KDApOworICAgIG5vdF9leGl0aW5nKCk7Cit9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKy8qCisgKiAiOmNsb3NlIjogY2xvc2UgY3VycmVudCB3aW5kb3csIHVubGVzcyBpdCBpcyB0aGUgbGFzdCBvbmUKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9jbG9zZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworIyBpZmRlZiBGRUFUX0NNRFdJTgorICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorCWNtZHdpbl9yZXN1bHQgPSBLX0lHTk9SRTsKKyAgICBlbHNlCisjIGVuZGlmCisJZXhfd2luX2Nsb3NlKGVhcCwgY3Vyd2luKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitleF93aW5fY2xvc2UoZWFwLCB3aW4pCisgICAgZXhhcmdfVAkqZWFwOworICAgIHdpbl9UCSp3aW47Cit7CisgICAgaW50CQluZWVkX2hpZGU7CisgICAgYnVmX1QJKmJ1ZiA9IHdpbi0+d19idWZmZXI7CisKKyAgICBuZWVkX2hpZGUgPSAoYnVmSXNDaGFuZ2VkKGJ1ZikgJiYgYnVmLT5iX253aW5kb3dzIDw9IDEpOworICAgIGlmIChuZWVkX2hpZGUgJiYgIVBfSElEKGJ1ZikgJiYgIWVhcC0+Zm9yY2VpdCkKKyAgICB7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCWlmICgocF9jb25maXJtIHx8IGNtZG1vZC5jb25maXJtKSAmJiBwX3dyaXRlKQorCXsKKwkgICAgZGlhbG9nX2NoYW5nZWQoYnVmLCBGQUxTRSk7CisJICAgIGlmIChidWZfdmFsaWQoYnVmKSAmJiBidWZJc0NoYW5nZWQoYnVmKSkKKwkJcmV0dXJuOworCSAgICBuZWVkX2hpZGUgPSBGQUxTRTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBFTVNHKF8oZV9ub3dydG1zZykpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorICAgIC8qIGZyZWUgYnVmZmVyIHdoZW4gbm90IGhpZGluZyBpdCBvciB3aGVuIGl0J3MgYSBzY3JhdGNoIGJ1ZmZlciAqLworICAgIHdpbl9jbG9zZSh3aW4sICFuZWVkX2hpZGUgJiYgIVBfSElEKGJ1ZikpOworfQorCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorLyoKKyAqICI6cGNsb3NlIjogQ2xvc2UgYW55IHByZXZpZXcgd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3BjbG9zZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHdpbl9UCSp3aW47CisKKyAgICBmb3IgKHdpbiA9IGZpcnN0d2luOyB3aW4gIT0gTlVMTDsgd2luID0gd2luLT53X25leHQpCisJaWYgKHdpbi0+d19wX3B2dykKKwl7CisJICAgIGV4X3dpbl9jbG9zZShlYXAsIHdpbik7CisJICAgIGJyZWFrOworCX0KK30KKyNlbmRpZgorCisvKgorICogIjpvbmx5Ii4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9vbmx5KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisjIGlmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyMgZW5kaWYKKyAgICBjbG9zZV9vdGhlcnMoVFJVRSwgZWFwLT5mb3JjZWl0KTsKK30KKworLyoKKyAqICI6YWxsIiBhbmQgIjpzYWxsIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9hbGwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoZWFwLT5hZGRyX2NvdW50ID09IDApCisJZWFwLT5saW5lMiA9IDk5OTk7CisgICAgZG9fYXJnX2FsbCgoaW50KWVhcC0+bGluZTIsIGVhcC0+Zm9yY2VpdCk7Cit9CisjZW5kaWYgLyogRkVBVF9XSU5ET1dTICovCisKKyAgICBzdGF0aWMgdm9pZAorZXhfaGlkZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmICgqZWFwLT5hcmcgIT0gTlVMICYmIGNoZWNrX25leHRjbWQoZWFwLT5hcmcpID09IE5VTEwpCisJZWFwLT5lcnJtc2cgPSBlX2ludmFyZzsKKyAgICBlbHNlCisgICAgeworCS8qICI6aGlkZSIgb3IgIjpoaWRlIHwgY21kIjogaGlkZSBjdXJyZW50IHdpbmRvdyAqLworCWVhcC0+bmV4dGNtZCA9IGNoZWNrX25leHRjbWQoZWFwLT5hcmcpOworI2lmZGVmIEZFQVRfV0lORE9XUworCWlmICghZWFwLT5za2lwKQorCXsKKyMgaWZkZWYgRkVBVF9HVUkKKwkgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyMgZW5kaWYKKwkgICAgd2luX2Nsb3NlKGN1cndpbiwgRkFMU0UpOwkvKiBkb24ndCBmcmVlIGJ1ZmZlciAqLworCX0KKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqICI6c3RvcCIgYW5kICI6c3VzcGVuZCI6IFN1c3BlbmQgVmltLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3N0b3AoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICAvKgorICAgICAqIERpc2FsbG93IHN1c3BlbmRpbmcgZm9yICJydmltIi4KKyAgICAgKi8KKyAgICBpZiAoIWNoZWNrX3Jlc3RyaWN0ZWQoKQorI2lmZGVmIFdJTjMyNjQKKwkvKgorCSAqIENoZWNrIGlmIGV4dGVybmFsIGNvbW1hbmRzIGFyZSBhbGxvd2VkIG5vdy4KKwkgKi8KKwkmJiBjYW5fZW5kX3Rlcm1jYXBfbW9kZShUUlVFKQorI2VuZGlmCisJCQkJCSkKKyAgICB7CisJaWYgKCFlYXAtPmZvcmNlaXQpCisJICAgIGF1dG93cml0ZV9hbGwoKTsKKwl3aW5kZ290bygoaW50KVJvd3MgLSAxLCAwKTsKKwlvdXRfY2hhcignXG4nKTsKKwlvdXRfZmx1c2goKTsKKwlzdG9wdGVybWNhcCgpOworCW91dF9mbHVzaCgpOwkJLyogbmVlZGVkIGZvciBTVU4gdG8gcmVzdG9yZSB4dGVybSBidWZmZXIgKi8KKyNpZmRlZiBGRUFUX1RJVExFCisJbWNoX3Jlc3RvcmVfdGl0bGUoMyk7CS8qIHJlc3RvcmUgd2luZG93IHRpdGxlcyAqLworI2VuZGlmCisJdWlfc3VzcGVuZCgpOwkJLyogY2FsbCBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uICovCisjaWZkZWYgRkVBVF9USVRMRQorCW1ha2V0aXRsZSgpOworCXJlc2V0dGl0bGUoKTsJCS8qIGZvcmNlIHVwZGF0aW5nIHRoZSB0aXRsZSAqLworI2VuZGlmCisJc3RhcnR0ZXJtY2FwKCk7CisJc2Nyb2xsX3N0YXJ0KCk7CQkvKiBzY3JvbGwgc2NyZWVuIGJlZm9yZSByZWRyYXdpbmcgKi8KKwlyZWRyYXdfbGF0ZXJfY2xlYXIoKTsKKwlzaGVsbF9yZXNpemVkKCk7CS8qIG1heSBoYXZlIHJlc2l6ZWQgd2luZG93ICovCisgICAgfQorfQorCisvKgorICogIjpleGl0IiwgIjp4aXQiIGFuZCAiOndxIjogV3JpdGUgZmlsZSBhbmQgZXhpdCBWaW0uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfZXhpdChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworI2lmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDApCisgICAgeworCWNtZHdpbl9yZXN1bHQgPSBDdHJsX0M7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBpZiBtb3JlIGZpbGVzIG9yIHdpbmRvd3Mgd2Ugd29uJ3QgZXhpdAorICAgICAqLworICAgIGlmIChjaGVja19tb3JlKEZBTFNFLCBlYXAtPmZvcmNlaXQpID09IE9LICYmIG9ubHlfb25lX3dpbmRvdygpKQorCWV4aXRpbmcgPSBUUlVFOworICAgIGlmICggICAgICAgKChlYXAtPmNtZGlkeCA9PSBDTURfd3EKKwkJICAgIHx8IGN1cmJ1ZklzQ2hhbmdlZCgpKQorCQkmJiBkb193cml0ZShlYXApID09IEZBSUwpCisJICAgIHx8IGNoZWNrX21vcmUoVFJVRSwgZWFwLT5mb3JjZWl0KSA9PSBGQUlMCisJICAgIHx8IChvbmx5X29uZV93aW5kb3coKSAmJiBjaGVja19jaGFuZ2VkX2FueShlYXAtPmZvcmNlaXQpKSkKKyAgICB7CisJbm90X2V4aXRpbmcoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAob25seV9vbmVfd2luZG93KCkpCSAgICAvKiBxdWl0IGxhc3Qgd2luZG93LCBleGl0IFZpbSAqLworI2VuZGlmCisJICAgIGdldG91dCgwKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyMgaWZkZWYgRkVBVF9HVUkKKwluZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworIyBlbmRpZgorCS8qIHF1aXQgY3VycmVudCB3aW5kb3csIG1heSBmcmVlIGJ1ZmZlciAqLworCXdpbl9jbG9zZShjdXJ3aW4sICFQX0hJRChjdXJ3aW4tPndfYnVmZmVyKSk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiAiOnByaW50IiwgIjpsaXN0IiwgIjpudW1iZXIiLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3ByaW50KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlzYXZlX2xpc3QgPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2xpc3QpCisgICAgeworCXNhdmVfbGlzdCA9IGN1cndpbi0+d19wX2xpc3Q7CisJY3Vyd2luLT53X3BfbGlzdCA9IDE7CisgICAgfQorCisgICAgZm9yICggOyFnb3RfaW50OyB1aV9icmVha2NoZWNrKCkpCisgICAgeworCXByaW50X2xpbmUoZWFwLT5saW5lMSwKKwkJICAgKGVhcC0+Y21kaWR4ID09IENNRF9udW1iZXIgfHwgZWFwLT5jbWRpZHggPT0gQ01EX3BvdW5kKSk7CisJaWYgKCsrZWFwLT5saW5lMSA+IGVhcC0+bGluZTIpCisJICAgIGJyZWFrOworCW91dF9mbHVzaCgpOwkgICAgLyogc2hvdyBvbmUgbGluZSBhdCBhIHRpbWUgKi8KKyAgICB9CisgICAgc2V0cGNtYXJrKCk7CisgICAgLyogcHV0IGN1cnNvciBhdCBsYXN0IGxpbmUgKi8KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlYXAtPmxpbmUyOworICAgIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworCisgICAgZXhfbm9fcmVwcmludCA9IFRSVUU7CisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2xpc3QpCisJY3Vyd2luLT53X3BfbGlzdCA9IHNhdmVfbGlzdDsKK30KKworI2lmZGVmIEZFQVRfQllURU9GRgorICAgIHN0YXRpYyB2b2lkCitleF9nb3RvKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZ290b19ieXRlKGVhcC0+bGluZTIpOworfQorI2VuZGlmCisKKy8qCisgKiAiOnNoZWxsIi4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2V4X3NoZWxsKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZG9fc2hlbGwoTlVMTCwgMCk7Cit9CisKKyNpZiAoZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoSEFWRV9EUk9QX0ZJTEUpKSBcCisJfHwgKGRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiBkZWZpbmVkKEZFQVRfRE5EKSkgXAorCXx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBIYW5kbGUgYSBmaWxlIGRyb3AuIFRoZSBjb2RlIGlzIGhlcmUgYmVjYXVzZSBhIGRyb3AgaXMgKm5lYXJseSogbGlrZSBhbgorICogOmFyZ3MgY29tbWFuZCwgYnV0IG5vdCBxdWl0ZSAod2UgaGF2ZSBhIGxpc3Qgb2YgZXhhY3QgZmlsZW5hbWVzLCBzbyB3ZQorICogZG9uJ3Qgd2FudCB0byAoYSkgcGFyc2UgYSBjb21tYW5kIGxpbmUsIG9yIChiKSBleHBhbmQgd2lsZGNhcmRzLiBTbyB0aGUKKyAqIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIDphcmdzIGFuZCBoZW5jZSBuZWVkcyBhY2Nlc3MgdG8gYSBsb3Qgb2YgdGhlIHN0YXRpYworICogZnVuY3Rpb25zIGluIHRoaXMgZmlsZS4KKyAqCisgKiBUaGUgbGlzdCBzaG91bGQgYmUgYWxsb2NhdGVkIHVzaW5nIGFsbG9jKCksIGFzIHNob3VsZCBlYWNoIGl0ZW0gaW4gdGhlCisgKiBsaXN0LiBUaGlzIGZ1bmN0aW9uIHRha2VzIG92ZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGhlIGxpc3QuCisgKgorICogWFhYIFRoZSBsaXN0IGlzIG1hZGUgaW50byB0aGUgYXJnZ3VtZW50IGxpc3QuIFRoaXMgaXMgZnJlZWQgdXNpbmcKKyAqIEZyZWVXaWxkKCksIHdoaWNoIGRvZXMgYSBzZXJpZXMgb2YgdmltX2ZyZWUoKSBjYWxscywgdW5sZXNzIHRoZSB0d28gZGVmaW5lcworICogX19FTVhfXyBhbmQgX19BTFdBWVNfSEFTX1RSQUlMSU5HX05VTF9QT0lOVEVSIGFyZSBzZXQuIEluIHRoaXMgY2FzZSwgYQorICogcm91dGluZSBfZm5leHBsb2RlZnJlZSgpIGlzIHVzZWQuIFRoaXMgbWF5IGNhdXNlIHByb2JsZW1zLCBidXQgYXMgdGhlIGRyb3AKKyAqIGZpbGUgZnVuY3Rpb25hbGl0eSBpcyAoY3VycmVudGx5KSBub3QgaW4gRU1YIHRoaXMgaXMgbm90IHByZXNlbnRseSBhCisgKiBwcm9ibGVtLgorICovCisgICAgdm9pZAoraGFuZGxlX2Ryb3AoZmlsZWMsIGZpbGV2LCBzcGxpdCkKKyAgICBpbnQJCWZpbGVjOwkJLyogdGhlIG51bWJlciBvZiBmaWxlcyBkcm9wcGVkICovCisgICAgY2hhcl91CSoqZmlsZXY7CS8qIHRoZSBsaXN0IG9mIGZpbGVzIGRyb3BwZWQgKi8KKyAgICBpbnQJCXNwbGl0OwkJLyogZm9yY2Ugc3BsaXR0aW5nIHRoZSB3aW5kb3cgKi8KK3sKKyAgICBleGFyZ19UCWVhOworICAgIGludAkJc2F2ZV9tc2dfc2Nyb2xsID0gbXNnX3Njcm9sbDsKKworIyBpZmRlZiBGRUFUX0NNRFdJTgorICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorCXJldHVybjsKKyMgZW5kaWYKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGNoYW5nZWQuIElmIHNvLCB3ZSB3aWxsIG5lZWQKKyAgICAgKiB0byBzcGxpdCB0aGUgY3VycmVudCB3aW5kb3cgb3IgZGF0YSBjb3VsZCBiZSBsb3N0LgorICAgICAqIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlICdoaWRkZW4nIG9wdGlvbiBpcyBzZXQsIGFzIGluIHRoaXMKKyAgICAgKiBjYXNlIHRoZSBidWZmZXIgd29uJ3QgYmUgbG9zdC4KKyAgICAgKi8KKyAgICBpZiAoIVBfSElEKGN1cmJ1ZikgJiYgIXNwbGl0KQorICAgIHsKKwkrK2Vtc2dfb2ZmOworCXNwbGl0ID0gY2hlY2tfY2hhbmdlZChjdXJidWYsIFRSVUUsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworCS0tZW1zZ19vZmY7CisgICAgfQorICAgIGlmIChzcGxpdCkKKyAgICB7CisjIGlmZGVmIEZFQVRfV0lORE9XUworCWlmICh3aW5fc3BsaXQoMCwgMCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworIyAgaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CisjICBlbmRpZgorCisJLyogV2hlbiBzcGxpdHRpbmcgdGhlIHdpbmRvdywgY3JlYXRlIGEgbmV3IGFsaXN0LiAgT3RoZXJ3aXNlIHRoZQorCSAqIGV4aXN0aW5nIG9uZSBpcyBvdmVyd3JpdHRlbi4gKi8KKwlhbGlzdF91bmxpbmsoY3Vyd2luLT53X2FsaXN0KTsKKwlhbGlzdF9uZXcoKTsKKyMgZWxzZQorCXJldHVybjsJICAgIC8qIGNhbid0IHNwbGl0LCBhbHdheXMgZmFpbCAqLworIyBlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHVwIHRoZSBuZXcgYXJndW1lbnQgbGlzdC4KKyAgICAgKi8KKyAgICBhbGlzdF9zZXQoQUxJU1QoY3Vyd2luKSwgZmlsZWMsIGZpbGV2LCBGQUxTRSk7CisKKyAgICAvKgorICAgICAqIE1vdmUgdG8gdGhlIGZpcnN0IGZpbGUuCisgICAgICovCisgICAgLyogRmFrZSB1cCBhIG1pbmltYWwgIm5leHQiIGNvbW1hbmQgZm9yIGRvX2FyZ2ZpbGUoKSAqLworICAgIHZpbV9tZW1zZXQoJmVhLCAwLCBzaXplb2YoZWEpKTsKKyAgICBlYS5jbWQgPSAoY2hhcl91ICopIm5leHQiOworICAgIGRvX2FyZ2ZpbGUoJmVhLCAwKTsKKworICAgIC8qIGRvX2VjbWQoKSBtYXkgc2V0IG5lZWRfc3RhcnRfaW5zZXJ0bW9kZSwgYnV0IHNpbmNlIHdlIG5ldmVyIGxlZnQgSW5zZXJ0CisgICAgICogbW9kZSB0aGF0IGlzIG5vdCBuZWVkZWQgaGVyZS4gKi8KKyAgICBuZWVkX3N0YXJ0X2luc2VydG1vZGUgPSBGQUxTRTsKKworICAgIC8qIFJlc3RvcmUgbXNnX3Njcm9sbCwgb3RoZXJ3aXNlIGEgZm9sbG93aW5nIGNvbW1hbmQgbWF5IGNhdXNlIHNjcm9sbGluZworICAgICAqIHVuZXhwZWN0ZWRseS4gIFRoZSBzY3JlZW4gd2lsbCBiZSByZWRyYXduIGJ5IHRoZSBjYWxsZXIsIHRodXMKKyAgICAgKiBtc2dfc2Nyb2xsIGJlaW5nIHNldCBieSBkaXNwbGF5aW5nIGEgbWVzc2FnZSBpcyBpcnJlbGV2YW50LiAqLworICAgIG1zZ19zY3JvbGwgPSBzYXZlX21zZ19zY3JvbGw7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYWxpc3RfY2xlYXIgX19BUkdTKChhbGlzdF9UICphbCkpOworLyoKKyAqIENsZWFyIGFuIGFyZ3VtZW50IGxpc3Q6IGZyZWUgYWxsIGZpbGUgbmFtZXMgYW5kIHJlc2V0IGl0IHRvIHplcm8gZW50cmllcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCithbGlzdF9jbGVhcihhbCkKKyAgICBhbGlzdF9UCSphbDsKK3sKKyAgICB3aGlsZSAoLS1hbC0+YWxfZ2EuZ2FfbGVuID49IDApCisJdmltX2ZyZWUoQUFSR0xJU1QoYWwpW2FsLT5hbF9nYS5nYV9sZW5dLmFlX2ZuYW1lKTsKKyAgICBnYV9jbGVhcigmYWwtPmFsX2dhKTsKK30KKworLyoKKyAqIEluaXQgYW4gYXJndW1lbnQgbGlzdC4KKyAqLworICAgIHZvaWQKK2FsaXN0X2luaXQoYWwpCisgICAgYWxpc3RfVAkqYWw7Cit7CisgICAgZ2FfaW5pdDIoJmFsLT5hbF9nYSwgKGludClzaXplb2YoYWVudHJ5X1QpLCA1KTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogUmVtb3ZlIGEgcmVmZXJlbmNlIGZyb20gYW4gYXJndW1lbnQgbGlzdC4KKyAqIElnbm9yZWQgd2hlbiB0aGUgYXJndW1lbnQgbGlzdCBpcyB0aGUgZ2xvYmFsIG9uZS4KKyAqIElmIHRoZSBhcmd1bWVudCBsaXN0IGlzIG5vIGxvbmdlciB1c2VkIGJ5IGFueSB3aW5kb3csIGZyZWUgaXQuCisgKi8KKyAgICB2b2lkCithbGlzdF91bmxpbmsoYWwpCisgICAgYWxpc3RfVAkqYWw7Cit7CisgICAgaWYgKGFsICE9ICZnbG9iYWxfYWxpc3QgJiYgLS1hbC0+YWxfcmVmY291bnQgPD0gMCkKKyAgICB7CisJYWxpc3RfY2xlYXIoYWwpOworCXZpbV9mcmVlKGFsKTsKKyAgICB9Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX0xJU1RDTURTKSB8fCBkZWZpbmVkKEhBVkVfRFJPUF9GSUxFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENyZWF0ZSBhIG5ldyBhcmd1bWVudCBsaXN0IGFuZCB1c2UgaXQgZm9yIHRoZSBjdXJyZW50IHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2FsaXN0X25ldygpCit7CisgICAgY3Vyd2luLT53X2FsaXN0ID0gKGFsaXN0X1QgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKGFsaXN0X1QpKTsKKyAgICBpZiAoY3Vyd2luLT53X2FsaXN0ID09IE5VTEwpCisgICAgeworCWN1cndpbi0+d19hbGlzdCA9ICZnbG9iYWxfYWxpc3Q7CisJKytnbG9iYWxfYWxpc3QuYWxfcmVmY291bnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY3Vyd2luLT53X2FsaXN0LT5hbF9yZWZjb3VudCA9IDE7CisJYWxpc3RfaW5pdChjdXJ3aW4tPndfYWxpc3QpOworICAgIH0KK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKCFkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKF9fRU1YX18pKSB8fCBkZWZpbmVkKEFSQ0hJRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBFeHBhbmQgdGhlIGZpbGUgbmFtZXMgaW4gdGhlIGdsb2JhbCBhcmd1bWVudCBsaXN0LgorICovCisgICAgdm9pZAorYWxpc3RfZXhwYW5kKCkKK3sKKyAgICBjaGFyX3UJKipvbGRfYXJnX2ZpbGVzOworICAgIGNoYXJfdQkqKm5ld19hcmdfZmlsZXM7CisgICAgaW50CQluZXdfYXJnX2ZpbGVfY291bnQ7CisgICAgY2hhcl91CSpzYXZlX3Bfc3UgPSBwX3N1OworICAgIGludAkJaTsKKworICAgIC8qIERvbid0IHVzZSAnc3VmZml4ZXMnIGhlcmUuICBUaGlzIHNob3VsZCB3b3JrIGxpa2UgdGhlIHNoZWxsIGRpZCB0aGUKKyAgICAgKiBleHBhbnNpb24uICBBbHNvLCB0aGUgdmltcmMgZmlsZSBpc24ndCByZWFkIHlldCwgdGh1cyB0aGUgdXNlcgorICAgICAqIGNhbid0IHNldCB0aGUgb3B0aW9ucy4gKi8KKyAgICBwX3N1ID0gZW1wdHlfb3B0aW9uOworICAgIG9sZF9hcmdfZmlsZXMgPSAoY2hhcl91ICoqKWFsbG9jKCh1bnNpZ25lZCkoc2l6ZW9mKGNoYXJfdSAqKSAqIEdBUkdDT1VOVCkpOworICAgIGlmIChvbGRfYXJnX2ZpbGVzICE9IE5VTEwpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBHQVJHQ09VTlQ7ICsraSkKKwkgICAgb2xkX2FyZ19maWxlc1tpXSA9IEdBUkdMSVNUW2ldLmFlX2ZuYW1lOworCWlmIChleHBhbmRfd2lsZGNhcmRzKEdBUkdDT1VOVCwgb2xkX2FyZ19maWxlcywKKwkJICAgICZuZXdfYXJnX2ZpbGVfY291bnQsICZuZXdfYXJnX2ZpbGVzLAorCQkgICAgRVdfRklMRXxFV19OT1RGT1VORHxFV19BRERTTEFTSCkgPT0gT0sKKwkJJiYgbmV3X2FyZ19maWxlX2NvdW50ID4gMCkKKwl7CisJICAgIGFsaXN0X3NldCgmZ2xvYmFsX2FsaXN0LCBuZXdfYXJnX2ZpbGVfY291bnQsIG5ld19hcmdfZmlsZXMsIFRSVUUpOworCX0KKwl2aW1fZnJlZShvbGRfYXJnX2ZpbGVzKTsKKyAgICB9CisgICAgcF9zdSA9IHNhdmVfcF9zdTsKK30KKyNlbmRpZgorCisvKgorICogU2V0IHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY3VycmVudCB3aW5kb3cuCisgKiBUYWtlcyBvdmVyIHRoZSBhbGxvY2F0ZWQgZmlsZXNbXSBhbmQgdGhlIGFsbG9jYXRlZCBmbmFtZXMgaW4gaXQuCisgKi8KKyAgICB2b2lkCithbGlzdF9zZXQoYWwsIGNvdW50LCBmaWxlcywgdXNlX2N1cmJ1ZikKKyAgICBhbGlzdF9UCSphbDsKKyAgICBpbnQJCWNvdW50OworICAgIGNoYXJfdQkqKmZpbGVzOworICAgIGludAkJdXNlX2N1cmJ1ZjsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBhbGlzdF9jbGVhcihhbCk7CisgICAgaWYgKGdhX2dyb3coJmFsLT5hbF9nYSwgY291bnQpID09IE9LKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkgICAgYWxpc3RfYWRkKGFsLCBmaWxlc1tpXSwgdXNlX2N1cmJ1ZiA/IDIgOiAxKTsKKwl2aW1fZnJlZShmaWxlcyk7CisgICAgfQorICAgIGVsc2UKKwlGcmVlV2lsZChjb3VudCwgZmlsZXMpOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGlmIChhbCA9PSAmZ2xvYmFsX2FsaXN0KQorI2VuZGlmCisJYXJnX2hhZF9sYXN0ID0gRkFMU0U7Cit9CisKKy8qCisgKiBBZGQgZmlsZSAiZm5hbWUiIHRvIGFyZ3VtZW50IGxpc3QgImFsIi4KKyAqICJmbmFtZSIgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCAiYWwiIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIHJvb20uCisgKi8KKyAgICB2b2lkCithbGlzdF9hZGQoYWwsIGZuYW1lLCBzZXRfZm51bSkKKyAgICBhbGlzdF9UCSphbDsKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJc2V0X2ZudW07CS8qIDE6IHNldCBidWZmZXIgbnVtYmVyOyAyOiByZS11c2UgY3VyYnVmICovCit7CisgICAgaWYgKGZuYW1lID09IE5VTEwpCQkvKiBkb24ndCBhZGQgTlVMTCBmaWxlIG5hbWVzICovCisJcmV0dXJuOworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorICAgIHNsYXNoX2FkanVzdChmbmFtZSk7CisjZW5kaWYKKyAgICBBQVJHTElTVChhbClbYWwtPmFsX2dhLmdhX2xlbl0uYWVfZm5hbWUgPSBmbmFtZTsKKyAgICBpZiAoc2V0X2ZudW0gPiAwKQorCUFBUkdMSVNUKGFsKVthbC0+YWxfZ2EuZ2FfbGVuXS5hZV9mbnVtID0KKwkgICAgYnVmbGlzdF9hZGQoZm5hbWUsIEJMTl9MSVNURUQgfCAoc2V0X2ZudW0gPT0gMiA/IEJMTl9DVVJCVUYgOiAwKSk7CisgICAgKythbC0+YWxfZ2EuZ2FfbGVuOworICAgIC0tYWwtPmFsX2dhLmdhX3Jvb207Cit9CisKKyNpZiBkZWZpbmVkKEJBQ0tTTEFTSF9JTl9GSUxFTkFNRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBBZGp1c3Qgc2xhc2hlcyBpbiBmaWxlIG5hbWVzLiAgQ2FsbGVkIGFmdGVyICdzaGVsbHNsYXNoJyB3YXMgc2V0LgorICovCisgICAgdm9pZAorYWxpc3Rfc2xhc2hfYWRqdXN0KCkKK3sKKyAgICBpbnQJCWk7CisjIGlmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3cDsKKyMgZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCBHQVJHQ09VTlQ7ICsraSkKKwlpZiAoR0FSR0xJU1RbaV0uYWVfZm5hbWUgIT0gTlVMTCkKKwkgICAgc2xhc2hfYWRqdXN0KEdBUkdMSVNUW2ldLmFlX2ZuYW1lKTsKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisJaWYgKHdwLT53X2FsaXN0ICE9ICZnbG9iYWxfYWxpc3QpCisJICAgIGZvciAoaSA9IDA7IGkgPCBXQVJHQ09VTlQod3ApOyArK2kpCisJCWlmIChXQVJHTElTVCh3cClbaV0uYWVfZm5hbWUgIT0gTlVMTCkKKwkJICAgIHNsYXNoX2FkanVzdChXQVJHTElTVCh3cClbaV0uYWVfZm5hbWUpOworIyBlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiAiOnByZXNlcnZlIi4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2V4X3ByZXNlcnZlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgbWxfcHJlc2VydmUoY3VyYnVmLCBUUlVFKTsKK30KKworLyoKKyAqICI6cmVjb3ZlciIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcmVjb3ZlcihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIC8qIFNldCByZWNvdmVyeW1vZGUgcmlnaHQgYXdheSB0byBhdm9pZCB0aGUgQVRURU5USU9OIHByb21wdC4gKi8KKyAgICByZWNvdmVyeW1vZGUgPSBUUlVFOworICAgIGlmICghY2hlY2tfY2hhbmdlZChjdXJidWYsIHBfYXdhLCBUUlVFLCBlYXAtPmZvcmNlaXQsIEZBTFNFKQorCSAgICAmJiAoKmVhcC0+YXJnID09IE5VTAorCQkJICAgICB8fCBzZXRmbmFtZShjdXJidWYsIGVhcC0+YXJnLCBOVUxMLCBUUlVFKSA9PSBPSykpCisJbWxfcmVjb3ZlcigpOworICAgIHJlY292ZXJ5bW9kZSA9IEZBTFNFOworfQorCisvKgorICogQ29tbWFuZCBtb2RpZmllciB1c2VkIGluIGEgd3Jvbmcgd2F5LgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3dyb25nbW9kaWZpZXIoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBlYXAtPmVycm1zZyA9IGVfaW52Y21kOworfQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisvKgorICogOnN2aWV3IFsrY29tbWFuZF0gZmlsZQlzcGxpdCB3aW5kb3cgd2l0aCBuZXcgZmlsZSwgcmVhZC1vbmx5CisgKiA6c3BsaXQgW1srY29tbWFuZF0gZmlsZV0Jc3BsaXQgd2luZG93IHdpdGggY3VycmVudCBvciBuZXcgZmlsZQorICogOnZzcGxpdCBbWytjb21tYW5kXSBmaWxlXQlzcGxpdCB3aW5kb3cgdmVydGljYWxseSB3aXRoIGN1cnJlbnQgb3IgbmV3IGZpbGUKKyAqIDpuZXcgW1srY29tbWFuZF0gZmlsZV0Jc3BsaXQgd2luZG93IHdpdGggbm8gb3IgbmV3IGZpbGUKKyAqIDp2bmV3IFtbK2NvbW1hbmRdIGZpbGVdCXNwbGl0IHZlcnRpY2FsbHkgd2luZG93IHdpdGggbm8gb3IgbmV3IGZpbGUKKyAqIDpzZmluZCBbK2NvbW1hbmRdIGZpbGUJc3BsaXQgd2luZG93IHdpdGggZmlsZSBpbiAncGF0aCcKKyAqLworICAgIHZvaWQKK2V4X3NwbGl0dmlldyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHdpbl9UCSpvbGRfY3Vyd2luOworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKSB8fCBkZWZpbmVkKEZFQVRfQlJPV1NFKQorICAgIGNoYXJfdQkqZm5hbWUgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICBpbnQJCWJyb3dzZV9mbGFnID0gY21kbW9kLmJyb3dzZTsKKyNlbmRpZgorCisjaWZuZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF92c3BsaXQgfHwgZWFwLT5jbWRpZHggPT0gQ01EX3ZuZXcpCisgICAgeworCWV4X25pKGVhcCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgb2xkX2N1cndpbiA9IGN1cndpbjsKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKyAgICAvKiBBICI6c3BsaXQiIGluIHRoZSBxdWlja2ZpeCB3aW5kb3cgd29ya3MgbGlrZSAiOm5ldyIuICBEb24ndCB3YW50IHR3bworICAgICAqIHF1aWNrZml4IHdpbmRvd3MuICovCisgICAgaWYgKGJ0X3F1aWNrZml4KGN1cmJ1ZikpCisgICAgeworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfc3BsaXQpCisJICAgIGVhcC0+Y21kaWR4ID0gQ01EX25ldzsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3ZzcGxpdCkKKwkgICAgZWFwLT5jbWRpZHggPSBDTURfdm5ldzsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorICAgIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfc2ZpbmQpCisgICAgeworCWZuYW1lID0gZmluZF9maWxlX2luX3BhdGgoZWFwLT5hcmcsIChpbnQpU1RSTEVOKGVhcC0+YXJnKSwKKwkJCQkJICBGTkFNRV9NRVNTLCBUUlVFLCBjdXJidWYtPmJfZmZuYW1lKTsKKwlpZiAoZm5hbWUgPT0gTlVMTCkKKwkgICAgZ290byB0aGVlbmQ7CisJZWFwLT5hcmcgPSBmbmFtZTsKKyAgICB9CisjIGlmZGVmIEZFQVRfQlJPV1NFCisgICAgZWxzZQorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICBpZiAoY21kbW9kLmJyb3dzZQorIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICAmJiBlYXAtPmNtZGlkeCAhPSBDTURfdm5ldworI2VuZGlmCisJICAgICYmIGVhcC0+Y21kaWR4ICE9IENNRF9uZXcpCisgICAgeworCWZuYW1lID0gZG9fYnJvd3NlKEZBTFNFLCAoY2hhcl91ICopXygiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciKSwKKwkJCQkJICBlYXAtPmFyZywgTlVMTCwgTlVMTCwgTlVMTCwgY3VyYnVmKTsKKwlpZiAoZm5hbWUgPT0gTlVMTCkKKwkgICAgZ290byB0aGVlbmQ7CisJZWFwLT5hcmcgPSBmbmFtZTsKKyAgICB9CisgICAgY21kbW9kLmJyb3dzZSA9IEZBTFNFOwkvKiBEb24ndCBicm93c2UgYWdhaW4gaW4gZG9fZWNtZCgpLiAqLworI2VuZGlmCisKKyAgICBpZiAod2luX3NwbGl0KGVhcC0+YWRkcl9jb3VudCA+IDAgPyAoaW50KWVhcC0+bGluZTIgOiAwLAorCQkJCSAgICAgKmVhcC0+Y21kID09ICd2JyA/IFdTUF9WRVJUIDogMCkgIT0gRkFJTCkKKyAgICB7CisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJLyogUmVzZXQgJ3Njcm9sbGJpbmQnIHdoZW4gZWRpdGluZyBhbm90aGVyIGZpbGUsIGJ1dCBrZWVwIGl0IHdoZW4KKwkgKiBkb2luZyAiOnNwbGl0IiB3aXRob3V0IGFyZ3VtZW50cy4gKi8KKwlpZiAoKmVhcC0+YXJnICE9IE5VTAorI2lmZGVmIEZFQVRfQlJPV1NFCisJCXx8IGNtZG1vZC5icm93c2UKKyNlbmRpZgorCSAgICkKKwkgICAgY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CisJZWxzZQorCSAgICBkb19jaGVja19zY3JvbGxiaW5kKEZBTFNFKTsKKyNlbmRpZgorCWRvX2V4ZWRpdChlYXAsIG9sZF9jdXJ3aW4pOworICAgIH0KKworI2lmZGVmIEZFQVRfQlJPV1NFCisgICAgY21kbW9kLmJyb3dzZSA9IGJyb3dzZV9mbGFnOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIUEFUSCkgfHwgZGVmaW5lZChGRUFUX0JST1dTRSkKK3RoZWVuZDoKKyAgICB2aW1fZnJlZShmbmFtZSk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogIjptb2RlIjogU2V0IHNjcmVlbiBtb2RlLgorICogSWYgbm8gYXJndW1lbnQgZ2l2ZW4sIGp1c3QgZ2V0IHRoZSBzY3JlZW4gc2l6ZSBhbmQgcmVkcmF3LgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X21vZGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoKmVhcC0+YXJnID09IE5VTCkKKwlzaGVsbF9yZXNpemVkKCk7CisgICAgZWxzZQorCW1jaF9zY3JlZW5tb2RlKGVhcC0+YXJnKTsKK30KKworI2lmZGVmIEZFQVRfV0lORE9XUworLyoKKyAqICI6cmVzaXplIi4KKyAqIHNldCwgaW5jcmVtZW50IG9yIGRlY3JlbWVudCBjdXJyZW50IHdpbmRvdyBoZWlnaHQKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9yZXNpemUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCW47CisgICAgd2luX1QJKndwID0gY3Vyd2luOworCisgICAgaWYgKGVhcC0+YWRkcl9jb3VudCA+IDApCisgICAgeworCW4gPSBlYXAtPmxpbmUyOworCWZvciAod3AgPSBmaXJzdHdpbjsgd3AtPndfbmV4dCAhPSBOVUxMICYmIC0tbiA+IDA7IHdwID0gd3AtPndfbmV4dCkKKwkgICAgOworICAgIH0KKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorICAgIG4gPSBhdG9sKChjaGFyICopZWFwLT5hcmcpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGNtZG1vZC5zcGxpdCAmIFdTUF9WRVJUKQorICAgIHsKKwlpZiAoKmVhcC0+YXJnID09ICctJyB8fCAqZWFwLT5hcmcgPT0gJysnKQorCSAgICBuICs9IFdfV0lEVEgoY3Vyd2luKTsKKwllbHNlIGlmIChuID09IDAgJiYgZWFwLT5hcmdbMF0gPT0gTlVMKQkvKiBkZWZhdWx0IGlzIHZlcnkgd2lkZSAqLworCSAgICBuID0gOTk5OTsKKwl3aW5fc2V0d2lkdGhfd2luKChpbnQpbiwgd3ApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJaWYgKCplYXAtPmFyZyA9PSAnLScgfHwgKmVhcC0+YXJnID09ICcrJykKKwkgICAgbiArPSBjdXJ3aW4tPndfaGVpZ2h0OworCWVsc2UgaWYgKG4gPT0gMCAmJiBlYXAtPmFyZ1swXSA9PSBOVUwpCS8qIGRlZmF1bHQgaXMgdmVyeSB3aWRlICovCisJICAgIG4gPSA5OTk5OworCXdpbl9zZXRoZWlnaHRfd2luKChpbnQpbiwgd3ApOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogIjpmaW5kIFsrY29tbWFuZF0gPGZpbGU+IiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2ZpbmQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJY291bnQ7CisKKyAgICBmbmFtZSA9IGZpbmRfZmlsZV9pbl9wYXRoKGVhcC0+YXJnLCAoaW50KVNUUkxFTihlYXAtPmFyZyksIEZOQU1FX01FU1MsCisJCQkJCQkgICAgICBUUlVFLCBjdXJidWYtPmJfZmZuYW1lKTsKKyAgICBpZiAoZWFwLT5hZGRyX2NvdW50ID4gMCkKKyAgICB7CisJLyogUmVwZWF0IGZpbmRpbmcgdGhlIGZpbGUgImNvdW50IiB0aW1lcy4gIFRoaXMgbWF0dGVycyB3aGVuIGl0CisJICogYXBwZWFycyBzZXZlcmFsIHRpbWVzIGluIHRoZSBwYXRoLiAqLworCWNvdW50ID0gZWFwLT5saW5lMjsKKwl3aGlsZSAoZm5hbWUgIT0gTlVMTCAmJiAtLWNvdW50ID4gMCkKKwl7CisJICAgIHZpbV9mcmVlKGZuYW1lKTsKKwkgICAgZm5hbWUgPSBmaW5kX2ZpbGVfaW5fcGF0aChOVUxMLCAwLCBGTkFNRV9NRVNTLAorCQkJCQkJICAgICBGQUxTRSwgY3VyYnVmLT5iX2ZmbmFtZSk7CisJfQorICAgIH0KKworICAgIGlmIChmbmFtZSAhPSBOVUxMKQorICAgIHsKKwllYXAtPmFyZyA9IGZuYW1lOworI2VuZGlmCisJZG9fZXhlZGl0KGVhcCwgTlVMTCk7CisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisJdmltX2ZyZWUoZm5hbWUpOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogIjplZGl0IiwgIjpiYWRkIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9lZGl0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZG9fZXhlZGl0KGVhcCwgTlVMTCk7Cit9CisKKy8qCisgKiAiOmVkaXQgPGZpbGU+IiBjb21tYW5kIGFuZCBhbGlrZXMuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2RvX2V4ZWRpdChlYXAsIG9sZF9jdXJ3aW4pCisgICAgZXhhcmdfVAkqZWFwOworICAgIHdpbl9UCSpvbGRfY3Vyd2luOwkgICAgLyogY3Vyd2luIGJlZm9yZSBkb2luZyBhIHNwbGl0IG9yIE5VTEwgKi8KK3sKKyAgICBpbnQJCW47CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaW50CQluZWVkX2hpZGU7CisjZW5kaWYKKworICAgIC8qCisgICAgICogIjp2aSIgY29tbWFuZCBlbmRzIEV4IG1vZGUuCisgICAgICovCisgICAgaWYgKGV4bW9kZV9hY3RpdmUgJiYgKGVhcC0+Y21kaWR4ID09IENNRF92aXN1YWwKKwkJCQkJCXx8IGVhcC0+Y21kaWR4ID09IENNRF92aWV3KSkKKyAgICB7CisJZXhtb2RlX2FjdGl2ZSA9IEZBTFNFOworCWlmICgqZWFwLT5hcmcgPT0gTlVMKQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKChlYXAtPmNtZGlkeCA9PSBDTURfbmV3CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJfHwgZWFwLT5jbWRpZHggPT0gQ01EX3ZuZXcKKyNlbmRpZgorCQkpICYmICplYXAtPmFyZyA9PSBOVUwpCisgICAgeworCS8qICI6bmV3IiB3aXRob3V0IGFyZ3VtZW50OiBlZGl0IGFuIG5ldyBlbXB0eSBidWZmZXIgKi8KKwlzZXRwY21hcmsoKTsKKwkodm9pZClkb19lY21kKDAsIE5VTEwsIE5VTEwsIGVhcCwgRUNNRF9PTkUsCisJCQkgICAgICAgRUNNRF9ISURFICsgKGVhcC0+Zm9yY2VpdCA/IEVDTURfRk9SQ0VJVCA6IDApKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVhcC0+Y21kaWR4ICE9IENNRF9zcGxpdAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCSYmIGVhcC0+Y21kaWR4ICE9IENNRF92c3BsaXQKKyNlbmRpZgorCQkpCisJICAgIHx8ICplYXAtPmFyZyAhPSBOVUwKKyNpZmRlZiBGRUFUX0JST1dTRQorCSAgICB8fCBjbWRtb2QuYnJvd3NlCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwluID0gcmVhZG9ubHltb2RlOworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfdmlldyB8fCBlYXAtPmNtZGlkeCA9PSBDTURfc3ZpZXcpCisJICAgIHJlYWRvbmx5bW9kZSA9IFRSVUU7CisJZWxzZSBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2VuZXcpCisJICAgIHJlYWRvbmx5bW9kZSA9IEZBTFNFOyAgIC8qICdyZWFkb25seScgZG9lc24ndCBtYWtlIHNlbnNlIGluIGFuCisJCQkJICAgICAgIGVtcHR5IGJ1ZmZlciAqLworCXNldHBjbWFyaygpOworCWlmIChkb19lY21kKDAsIChlYXAtPmNtZGlkeCA9PSBDTURfZW5ldyA/IE5VTEwgOiBlYXAtPmFyZyksCisJCSAgICBOVUxMLCBlYXAsCisJCSAgICAvKiAiOmVkaXQiIGdvZXMgdG8gZmlyc3QgbGluZSBpZiBWaSBjb21wYXRpYmxlICovCisJCSAgICAoKmVhcC0+YXJnID09IE5VTCAmJiBlYXAtPmRvX2VjbWRfbG51bSA9PSAwCisJCQkJICAgICAgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0dPVE8xKSAhPSBOVUxMKQorCQkJCQkgICAgICAgPyBFQ01EX09ORSA6IGVhcC0+ZG9fZWNtZF9sbnVtLAorCQkgICAgKFBfSElEKGN1cmJ1ZikgPyBFQ01EX0hJREUgOiAwKQorCQkgICAgKyAoZWFwLT5mb3JjZWl0ID8gRUNNRF9GT1JDRUlUIDogMCkKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisJCSAgICArIChlYXAtPmNtZGlkeCA9PSBDTURfYmFkZCA/IEVDTURfQUREQlVGIDogMCApCisjZW5kaWYKKwkJICAgICkgPT0gRkFJTCkKKwl7CisJICAgIC8qIEVkaXRpbmcgdGhlIGZpbGUgZmFpbGVkLiAgSWYgdGhlIHdpbmRvdyB3YXMgc3BsaXQsIGNsb3NlIGl0LiAqLworI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICBpZiAob2xkX2N1cndpbiAhPSBOVUxMKQorCSAgICB7CisJCW5lZWRfaGlkZSA9IChjdXJidWZJc0NoYW5nZWQoKSAmJiBjdXJidWYtPmJfbndpbmRvd3MgPD0gMSk7CisJCWlmICghbmVlZF9oaWRlIHx8IFBfSElEKGN1cmJ1ZikpCisJCXsKKyMgaWZkZWYgRkVBVF9HVUkKKwkJICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjIGVuZGlmCisJCSAgICB3aW5fY2xvc2UoY3Vyd2luLCAhbmVlZF9oaWRlICYmICFQX0hJRChjdXJidWYpKTsKKwkJfQorCSAgICB9CisjZW5kaWYKKwl9CisJZWxzZSBpZiAocmVhZG9ubHltb2RlICYmIGN1cmJ1Zi0+Yl9ud2luZG93cyA9PSAxKQorCXsKKwkgICAgLyogV2hlbiBlZGl0aW5nIGFuIGFscmVhZHkgdmlzaXRlZCBidWZmZXIsICdyZWFkb25seScgd29uJ3QgYmUgc2V0CisJICAgICAqIGJ1dCB0aGUgcHJldmlvdXMgdmFsdWUgaXMga2VwdC4gIFdpdGggIjp2aWV3IiBhbmQgIjpzdmlldyIgd2UKKwkgICAgICogd2FudCB0aGUgIGZpbGUgdG8gYmUgcmVhZG9ubHksIGV4Y2VwdCB3aGVuIGFub3RoZXIgd2luZG93IGlzCisJICAgICAqIGVkaXRpbmcgdGhlIHNhbWUgYnVmZmVyLiAqLworCSAgICBjdXJidWYtPmJfcF9ybyA9IFRSVUU7CisJfQorCXJlYWRvbmx5bW9kZSA9IG47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGVhcC0+ZG9fZWNtZF9jbWQgIT0gTlVMTCkKKwkgICAgZG9fY21kbGluZV9jbWQoZWFwLT5kb19lY21kX2NtZCk7CisjaWZkZWYgRkVBVF9USVRMRQorCW4gPSBjdXJ3aW4tPndfYXJnX2lkeF9pbnZhbGlkOworI2VuZGlmCisJY2hlY2tfYXJnX2lkeChjdXJ3aW4pOworI2lmZGVmIEZFQVRfVElUTEUKKwlpZiAobiAhPSBjdXJ3aW4tPndfYXJnX2lkeF9pbnZhbGlkKQorCSAgICBtYWtldGl0bGUoKTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIC8qCisgICAgICogaWYgIjpzcGxpdCBmaWxlIiB3b3JrZWQsIHNldCBhbHRlcm5hdGUgZmlsZSBuYW1lIGluIG9sZCB3aW5kb3cgdG8gbmV3CisgICAgICogZmlsZQorICAgICAqLworICAgIGlmIChvbGRfY3Vyd2luICE9IE5VTEwKKwkgICAgJiYgKmVhcC0+YXJnICE9IE5VTAorCSAgICAmJiBjdXJ3aW4gIT0gb2xkX2N1cndpbgorCSAgICAmJiB3aW5fdmFsaWQob2xkX2N1cndpbikKKwkgICAgJiYgb2xkX2N1cndpbi0+d19idWZmZXIgIT0gY3VyYnVmKQorCW9sZF9jdXJ3aW4tPndfYWx0X2ZudW0gPSBjdXJidWYtPmJfZm51bTsKKyNlbmRpZgorCisgICAgZXhfbm9fcmVwcmludCA9IFRSVUU7Cit9CisKKyNpZm5kZWYgRkVBVF9HVUkKKy8qCisgKiAiOmd1aSIgYW5kICI6Z3ZpbSIgd2hlbiB0aGVyZSBpcyBubyBHVUkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbm9ndWkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBlYXAtPmVycm1zZyA9IGVfbm9ndmltOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgZGVmaW5lZChGRUFUX01FTlUpICYmIGRlZmluZWQoRkVBVF9URUFST0ZGKQorICAgIHN0YXRpYyB2b2lkCitleF90ZWFyb2ZmKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZ3VpX21ha2VfdGVhcm9mZihlYXAtPmFyZyk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykpICYmIGRlZmluZWQoRkVBVF9NRU5VKQorICAgIHN0YXRpYyB2b2lkCitleF9wb3B1cChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGd1aV9tYWtlX3BvcHVwKGVhcC0+YXJnKTsKK30KKyNlbmRpZgorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfc3dhcG5hbWUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMIHx8IGN1cmJ1Zi0+Yl9tbC5tbF9tZnAtPm1mX2ZuYW1lID09IE5VTEwpCisJTVNHKF8oIk5vIHN3YXAgZmlsZSIpKTsKKyAgICBlbHNlCisJbXNnKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAtPm1mX2ZuYW1lKTsKK30KKworLyoKKyAqICI6c3luY2JpbmQiIGZvcmNlcyBhbGwgJ3Njcm9sbGJpbmQnIHdpbmRvd3MgdG8gaGF2ZSB0aGUgc2FtZSByZWxhdGl2ZQorICogb2Zmc2V0LgorICogKDE5OTgtMTEtMDIgMTY6MjE6MDEgIFIuIEVkd2FyZCBSYWxzdG9uIDxlcmFsc3RvbkBjb21wdXRlci5vcmc+KQorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfc3luY2JpbmQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKyAgICB3aW5fVAkqd3A7CisgICAgbG9uZwl0b3BsaW5lOworICAgIGxvbmcJeTsKKyAgICBsaW5lbnJfVAlvbGRfbGluZW5yID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCisgICAgc2V0cGNtYXJrKCk7CisKKyAgICAvKgorICAgICAqIGRldGVybWluZSBtYXggdG9wbGluZQorICAgICAqLworICAgIGlmIChjdXJ3aW4tPndfcF9zY2IpCisgICAgeworCXRvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKwlmb3IgKHdwID0gZmlyc3R3aW47IHdwOyB3cCA9IHdwLT53X25leHQpCisJeworCSAgICBpZiAod3AtPndfcF9zY2IgJiYgd3AtPndfYnVmZmVyKQorCSAgICB7CisJCXkgPSB3cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCAtIHBfc287CisJCWlmICh0b3BsaW5lID4geSkKKwkJICAgIHRvcGxpbmUgPSB5OworCSAgICB9CisJfQorCWlmICh0b3BsaW5lIDwgMSkKKwkgICAgdG9wbGluZSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdG9wbGluZSA9IDE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIHNldCBhbGwgc2Nyb2xsYmluZCB3aW5kb3dzIHRvIHRoZSBzYW1lIHRvcGxpbmUKKyAgICAgKi8KKyAgICB3cCA9IGN1cndpbjsKKyAgICBmb3IgKGN1cndpbiA9IGZpcnN0d2luOyBjdXJ3aW47IGN1cndpbiA9IGN1cndpbi0+d19uZXh0KQorICAgIHsKKwlpZiAoY3Vyd2luLT53X3Bfc2NiKQorCXsKKwkgICAgeSA9IHRvcGxpbmUgLSBjdXJ3aW4tPndfdG9wbGluZTsKKwkgICAgaWYgKHkgPiAwKQorCQlzY3JvbGx1cCh5LCBUUlVFKTsKKwkgICAgZWxzZQorCQlzY3JvbGxkb3duKC15LCBUUlVFKTsKKwkgICAgY3Vyd2luLT53X3NjYmluZF9wb3MgPSB0b3BsaW5lOworCSAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworCSAgICBjdXJzb3JfY29ycmVjdCgpOworI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICBjdXJ3aW4tPndfcmVkcl9zdGF0dXMgPSBUUlVFOworI2VuZGlmCisJfQorICAgIH0KKyAgICBjdXJ3aW4gPSB3cDsKKyAgICBpZiAoY3Vyd2luLT53X3Bfc2NiKQorICAgIHsKKwlkaWRfc3luY2JpbmQgPSBUUlVFOworCWNoZWNrcGNtYXJrKCk7CisJaWYgKG9sZF9saW5lbnIgIT0gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCXsKKwkgICAgY2hhcl91IGN0cmxfb1syXTsKKworCSAgICBjdHJsX29bMF0gPSBDdHJsX087CisJICAgIGN0cmxfb1sxXSA9IDA7CisJICAgIGluc190eXBlYnVmKGN0cmxfbywgUkVNQVBfTk9ORSwgMCwgVFJVRSwgRkFMU0UpOworCX0KKyAgICB9CisjZW5kaWYKK30KKworCisgICAgc3RhdGljIHZvaWQKK2V4X3JlYWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBpZiAoZWFwLT51c2VmaWx0ZXIpCQkJLyogOnIhY21kICovCisJZG9fYmFuZygxLCBlYXAsIEZBTFNFLCBGQUxTRSwgVFJVRSk7CisgICAgZWxzZQorICAgIHsKKwlpZiAodV9zYXZlKGVhcC0+bGluZTIsIChsaW5lbnJfVCkoZWFwLT5saW5lMiArIDEpKSA9PSBGQUlMKQorCSAgICByZXR1cm47CisKKyNpZmRlZiBGRUFUX0JST1dTRQorCWlmIChjbWRtb2QuYnJvd3NlKQorCXsKKwkgICAgY2hhcl91ICpicm93c2VGaWxlOworCisJICAgIGJyb3dzZUZpbGUgPSBkb19icm93c2UoRkFMU0UsIChjaGFyX3UgKilfKCJBcHBlbmQgRmlsZSIpLCBlYXAtPmFyZywKKwkJCQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBjdXJidWYpOworCSAgICBpZiAoYnJvd3NlRmlsZSAhPSBOVUxMKQorCSAgICB7CisJCWkgPSByZWFkZmlsZShicm93c2VGaWxlLCBOVUxMLAorCQkJICBlYXAtPmxpbmUyLCAobGluZW5yX1QpMCwgKGxpbmVucl9UKU1BWExOVU0sIGVhcCwgMCk7CisJCXZpbV9mcmVlKGJyb3dzZUZpbGUpOworCSAgICB9CisJICAgIGVsc2UKKwkJaSA9IE9LOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgIGlmICgqZWFwLT5hcmcgPT0gTlVMKQorCXsKKwkgICAgaWYgKGNoZWNrX2ZuYW1lKCkgPT0gRkFJTCkJLyogY2hlY2sgZm9yIG5vIGZpbGUgbmFtZSAqLworCQlyZXR1cm47CisJICAgIGkgPSByZWFkZmlsZShjdXJidWYtPmJfZmZuYW1lLCBjdXJidWYtPmJfZm5hbWUsCisJCQkgIGVhcC0+bGluZTIsIChsaW5lbnJfVCkwLCAobGluZW5yX1QpTUFYTE5VTSwgZWFwLCAwKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19BTFRSRUFEKSAhPSBOVUxMKQorCQkodm9pZClzZXRhbHRmbmFtZShlYXAtPmFyZywgZWFwLT5hcmcsIChsaW5lbnJfVCkxKTsKKwkgICAgaSA9IHJlYWRmaWxlKGVhcC0+YXJnLCBOVUxMLAorCQkJICBlYXAtPmxpbmUyLCAobGluZW5yX1QpMCwgKGxpbmVucl9UKU1BWExOVU0sIGVhcCwgMCk7CisKKwl9CisJaWYgKGkgPT0gRkFJTCkKKwl7CisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCSAgICBpZiAoIWFib3J0aW5nKCkpCisjZW5kaWYKKwkJRU1TRzIoXyhlX25vdG9wZW4pLCBlYXAtPmFyZyk7CisJfQorCWVsc2UKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihWQUxJRCk7CisgICAgfQorfQorCisvKgorICogIjpjZCIsICI6bGNkIiwgIjpjaGRpciIgYW5kICI6bGNoZGlyIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9jZChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHN0YXRpYyBjaGFyX3UJKnByZXZfZGlyID0gTlVMTDsKKyAgICBjaGFyX3UJCSpuZXdfZGlyOworICAgIGNoYXJfdQkJKnRvZnJlZTsKKworICAgIG5ld19kaXIgPSBlYXAtPmFyZzsKKyNpZiAhZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChWTVMpCisgICAgLyogZm9yIG5vbi1VTklYICI6Y2QiIG1lYW5zOiBwcmludCBjdXJyZW50IGRpcmVjdG9yeSAqLworICAgIGlmICgqbmV3X2RpciA9PSBOVUwpCisJZXhfcHdkKE5VTEwpOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKiAiOmNkIC0iOiBDaGFuZ2UgdG8gcHJldmlvdXMgZGlyZWN0b3J5ICovCisJaWYgKFNUUkNNUChuZXdfZGlyLCAiLSIpID09IDApCisJeworCSAgICBpZiAocHJldl9kaXIgPT0gTlVMTCkKKwkgICAgeworCQlFTVNHKF8oIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIpKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIG5ld19kaXIgPSBwcmV2X2RpcjsKKwl9CisKKwkvKiBTYXZlIGN1cnJlbnQgZGlyZWN0b3J5IGZvciBuZXh0ICI6Y2QgLSIgKi8KKwl0b2ZyZWUgPSBwcmV2X2RpcjsKKwlpZiAobWNoX2Rpcm5hbWUoTmFtZUJ1ZmYsIE1BWFBBVEhMKSA9PSBPSykKKwkgICAgcHJldl9kaXIgPSB2aW1fc3Ryc2F2ZShOYW1lQnVmZik7CisJZWxzZQorCSAgICBwcmV2X2RpciA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorCS8qIGZvciBVTklYICI6Y2QiIG1lYW5zOiBnbyB0byBob21lIGRpcmVjdG9yeSAqLworCWlmICgqbmV3X2RpciA9PSBOVUwpCisJeworCSAgICAvKiB1c2UgTmFtZUJ1ZmYgZm9yIGhvbWUgZGlyZWN0b3J5IG5hbWUgKi8KKyMgaWZkZWYgVk1TCisJICAgIGNoYXJfdQkqcDsKKworCSAgICBwID0gbWNoX2dldGVudigoY2hhcl91ICopIlNZUyRMT0dJTiIpOworCSAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkJLyogZW1wdHkgaXMgdGhlIHNhbWUgYXMgbm90IHNldCAqLworCQlOYW1lQnVmZlswXSA9IE5VTDsKKwkgICAgZWxzZQorCQlTVFJOQ1BZKE5hbWVCdWZmLCBwLCBNQVhQQVRITCk7CisjIGVsc2UKKwkgICAgZXhwYW5kX2VudigoY2hhcl91ICopIiRIT01FIiwgTmFtZUJ1ZmYsIE1BWFBBVEhMKTsKKyMgZW5kaWYKKwkgICAgbmV3X2RpciA9IE5hbWVCdWZmOworCX0KKyNlbmRpZgorCWlmIChuZXdfZGlyID09IE5VTEwgfHwgdmltX2NoZGlyKG5ld19kaXIpKQorCSAgICBFTVNHKF8oZV9mYWlsZWQpKTsKKwllbHNlCisJeworCSAgICB2aW1fZnJlZShjdXJ3aW4tPndfbG9jYWxkaXIpOworCSAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2xjZCB8fCBlYXAtPmNtZGlkeCA9PSBDTURfbGNoZGlyKQorCSAgICB7CisJCS8qIElmIHN0aWxsIGluIGdsb2JhbCBkaXJlY3RvcnksIG5lZWQgdG8gcmVtZW1iZXIgY3VycmVudAorCQkgKiBkaXJlY3RvcnkgYXMgZ2xvYmFsIGRpcmVjdG9yeS4gKi8KKwkJaWYgKGdsb2JhbGRpciA9PSBOVUxMICYmIHByZXZfZGlyICE9IE5VTEwpCisJCSAgICBnbG9iYWxkaXIgPSB2aW1fc3Ryc2F2ZShwcmV2X2Rpcik7CisJCS8qIFJlbWVtYmVyIHRoaXMgbG9jYWwgZGlyZWN0b3J5IGZvciB0aGUgd2luZG93LiAqLworCQlpZiAobWNoX2Rpcm5hbWUoTmFtZUJ1ZmYsIE1BWFBBVEhMKSA9PSBPSykKKwkJICAgIGN1cndpbi0+d19sb2NhbGRpciA9IHZpbV9zdHJzYXZlKE5hbWVCdWZmKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogV2UgYXJlIG5vdyBpbiB0aGUgZ2xvYmFsIGRpcmVjdG9yeSwgbm8gbmVlZCB0byByZW1lbWJlciBpdHMKKwkJICogbmFtZS4gKi8KKwkJdmltX2ZyZWUoZ2xvYmFsZGlyKTsKKwkJZ2xvYmFsZGlyID0gTlVMTDsKKwkJY3Vyd2luLT53X2xvY2FsZGlyID0gTlVMTDsKKwkgICAgfQorCisJICAgIHNob3J0ZW5fZm5hbWVzKFRSVUUpOworCisJICAgIC8qIEVjaG8gdGhlIG5ldyBjdXJyZW50IGRpcmVjdG9yeSBpZiB0aGUgY29tbWFuZCB3YXMgdHlwZWQuICovCisJICAgIGlmIChLZXlUeXBlZCkKKwkJZXhfcHdkKGVhcCk7CisJfQorCXZpbV9mcmVlKHRvZnJlZSk7CisgICAgfQorfQorCisvKgorICogIjpwd2QiLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcHdkKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKG1jaF9kaXJuYW1lKE5hbWVCdWZmLCBNQVhQQVRITCkgPT0gT0spCisgICAgeworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCXNsYXNoX2FkanVzdChOYW1lQnVmZik7CisjZW5kaWYKKwltc2coTmFtZUJ1ZmYpOworICAgIH0KKyAgICBlbHNlCisJRU1TRyhfKCJFMTg3OiBVbmtub3duIikpOworfQorCisvKgorICogIjo9Ii4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9lcXVhbChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHNtc2coKGNoYXJfdSAqKSIlbGQiLCAobG9uZyllYXAtPmxpbmUyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitleF9zbGVlcChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkgICAgbjsKKworICAgIGlmIChjdXJzb3JfdmFsaWQoKSkKKyAgICB7CisJbiA9IFdfV0lOUk9XKGN1cndpbikgKyBjdXJ3aW4tPndfd3JvdyAtIG1zZ19zY3JvbGxlZDsKKwlpZiAobiA+PSAwKQorCSAgICB3aW5kZ290bygoaW50KW4sIGN1cndpbi0+d193Y29sKTsKKyAgICB9CisgICAgZG9fc2xlZXAoZWFwLT5saW5lMiAqICgqZWFwLT5hcmcgPT0gJ20nID8gMUwgOiAxMDAwTCkpOworfQorCisvKgorICogU2xlZXAgZm9yICJtc2VjIiBtaWxsaXNlY29uZHMsIGJ1dCBrZWVwIGNoZWNraW5nIGZvciBhIENUUkwtQyBldmVyeSBzZWNvbmQuCisgKi8KKyAgICB2b2lkCitkb19zbGVlcChtc2VjKQorICAgIGxvbmcJbXNlYzsKK3sKKyAgICBsb25nCWRvbmU7CisKKyAgICBjdXJzb3Jfb24oKTsKKyAgICBvdXRfZmx1c2goKTsKKyAgICBmb3IgKGRvbmUgPSAwOyAhZ290X2ludCAmJiBkb25lIDwgbXNlYzsgZG9uZSArPSAxMDAwTCkKKyAgICB7CisJdWlfZGVsYXkobXNlYyAtIGRvbmUgPiAxMDAwTCA/IDEwMDBMIDogbXNlYyAtIGRvbmUsIFRSVUUpOworCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZG9fZXhtYXAoZWFwLCBpc2FiYnJldikKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlpc2FiYnJldjsKK3sKKyAgICBpbnQJICAgIG1vZGU7CisgICAgY2hhcl91ICAqY21kcDsKKworICAgIGNtZHAgPSBlYXAtPmNtZDsKKyAgICBtb2RlID0gZ2V0X21hcF9tb2RlKCZjbWRwLCBlYXAtPmZvcmNlaXQgfHwgaXNhYmJyZXYpOworCisgICAgc3dpdGNoIChkb19tYXAoKCpjbWRwID09ICduJykgPyAyIDogKCpjbWRwID09ICd1JyksCisJCQkJCQkgICAgZWFwLT5hcmcsIG1vZGUsIGlzYWJicmV2KSkKKyAgICB7CisJY2FzZSAxOiBFTVNHKF8oZV9pbnZhcmcpKTsKKwkJYnJlYWs7CisJY2FzZSAyOiBFTVNHKGlzYWJicmV2ID8gXyhlX25vYWJicikgOiBfKGVfbm9tYXApKTsKKwkJYnJlYWs7CisgICAgfQorfQorCisvKgorICogIjp3aW5zaXplIiBjb21tYW5kIChvYnNvbGV0ZSkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfd2luc2l6ZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJdywgaDsKKyAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOworICAgIGNoYXJfdQkqcDsKKworICAgIHcgPSBnZXRkaWdpdHMoJmFyZyk7CisgICAgYXJnID0gc2tpcHdoaXRlKGFyZyk7CisgICAgcCA9IGFyZzsKKyAgICBoID0gZ2V0ZGlnaXRzKCZhcmcpOworICAgIGlmICgqcCAhPSBOVUwgJiYgKmFyZyA9PSBOVUwpCisJc2V0X3NoZWxsc2l6ZSh3LCBoLCBUUlVFKTsKKyAgICBlbHNlCisJRU1TRyhfKCJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIpKTsKK30KKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHN0YXRpYyB2b2lkCitleF93aW5jbWQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCXhjaGFyID0gTlVMOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmICgqZWFwLT5hcmcgPT0gJ2cnIHx8ICplYXAtPmFyZyA9PSBDdHJsX0cpCisgICAgeworCS8qIENUUkwtVyBnIGFuZCBDVFJMLVcgQ1RSTC1HICBoYXZlIGFuIGV4dHJhIGNvbW1hbmQgY2hhcmFjdGVyICovCisJaWYgKGVhcC0+YXJnWzFdID09IE5VTCkKKwl7CisJICAgIEVNU0coXyhlX2ludmFyZykpOworCSAgICByZXR1cm47CisJfQorCXhjaGFyID0gZWFwLT5hcmdbMV07CisJcCA9IGVhcC0+YXJnICsgMjsKKyAgICB9CisgICAgZWxzZQorCXAgPSBlYXAtPmFyZyArIDE7CisKKyAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKHApOworICAgIHAgPSBza2lwd2hpdGUocCk7CisgICAgaWYgKCpwICE9IE5VTCAmJiAqcCAhPSAnIicgJiYgZWFwLT5uZXh0Y21kID09IE5VTEwpCisJRU1TRyhfKGVfaW52YXJnKSk7CisgICAgZWxzZQorICAgIHsKKwkvKiBQYXNzIGZsYWdzIG9uIGZvciAiOnZlcnRpY2FsIHdpbmNtZCBdIi4gKi8KKwlwb3N0cG9uZWRfc3BsaXRfZmxhZ3MgPSBjbWRtb2Quc3BsaXQ7CisJZG9fd2luZG93KCplYXAtPmFyZywgZWFwLT5hZGRyX2NvdW50ID4gMCA/IGVhcC0+bGluZTIgOiAwTCwgeGNoYXIpOworCXBvc3Rwb25lZF9zcGxpdF9mbGFncyA9IDA7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorLyoKKyAqICI6d2lucG9zIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF93aW5wb3MoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCXgsIHk7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoKmFyZyA9PSBOVUwpCisgICAgeworIyBpZmRlZiBGRUFUX0dVSQorCWlmIChndWkuaW5fdXNlICYmIGd1aV9tY2hfZ2V0X3dpbnBvcygmeCwgJnkpICE9IEZBSUwpCisJeworCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiKSwgeCwgeSk7CisJICAgIG1zZyhJT2J1ZmYpOworCX0KKwllbHNlCisjIGVuZGlmCisJICAgIEVNU0coXygiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJeCA9IGdldGRpZ2l0cygmYXJnKTsKKwlhcmcgPSBza2lwd2hpdGUoYXJnKTsKKwlwID0gYXJnOworCXkgPSBnZXRkaWdpdHMoJmFyZyk7CisJaWYgKCpwID09IE5VTCB8fCAqYXJnICE9IE5VTCkKKwl7CisJICAgIEVNU0coXygiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIpKTsKKwkgICAgcmV0dXJuOworCX0KKyMgaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLmluX3VzZSkKKwkgICAgZ3VpX21jaF9zZXRfd2lucG9zKHgsIHkpOworCWVsc2UgaWYgKGd1aS5zdGFydGluZykKKwl7CisJICAgIC8qIFJlbWVtYmVyIHRoZSBjb29yZGluYXRlcyBmb3Igd2hlbiB0aGUgd2luZG93IGlzIG9wZW5lZC4gKi8KKwkgICAgZ3VpX3dpbl94ID0geDsKKwkgICAgZ3VpX3dpbl95ID0geTsKKwl9CisjICBpZmRlZiBIQVZFX1RHRVRFTlQKKwllbHNlCisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBIQVZFX1RHRVRFTlQKKwlpZiAoKlRfQ1dQKQorCSAgICB0ZXJtX3NldF93aW5wb3MoeCwgeSk7CisjIGVuZGlmCisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgY29tbWFuZCB0aGF0IHdvcmsgbGlrZSBvcGVyYXRvcnM6ICI6ZGVsZXRlIiwgIjp5YW5rIiwgIjo+IiBhbmQgIjo8Ii4KKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9vcGVyYXRvcnMoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBvcGFyZ19UCW9hOworCisgICAgY2xlYXJfb3BhcmcoJm9hKTsKKyAgICBvYS5yZWduYW1lID0gZWFwLT5yZWduYW1lOworICAgIG9hLnN0YXJ0LmxudW0gPSBlYXAtPmxpbmUxOworICAgIG9hLmVuZC5sbnVtID0gZWFwLT5saW5lMjsKKyAgICBvYS5saW5lX2NvdW50ID0gZWFwLT5saW5lMiAtIGVhcC0+bGluZTEgKyAxOworICAgIG9hLm1vdGlvbl90eXBlID0gTUxJTkU7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIHZpcnR1YWxfb3AgPSBGQUxTRTsKKyNlbmRpZgorICAgIGlmIChlYXAtPmNtZGlkeCAhPSBDTURfeWFuaykJLyogcG9zaXRpb24gY3Vyc29yIGZvciB1bmRvICovCisgICAgeworCXNldHBjbWFyaygpOworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGVhcC0+bGluZTE7CisJYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7CisgICAgfQorCisgICAgc3dpdGNoIChlYXAtPmNtZGlkeCkKKyAgICB7CisJY2FzZSBDTURfZGVsZXRlOgorCSAgICBvYS5vcF90eXBlID0gT1BfREVMRVRFOworCSAgICBvcF9kZWxldGUoJm9hKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIENNRF95YW5rOgorCSAgICBvYS5vcF90eXBlID0gT1BfWUFOSzsKKwkgICAgKHZvaWQpb3BfeWFuaygmb2EsIEZBTFNFLCBUUlVFKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OiAgICAvKiBDTURfcnNoaWZ0IG9yIENNRF9sc2hpZnQgKi8KKwkgICAgaWYgKChlYXAtPmNtZGlkeCA9PSBDTURfcnNoaWZ0KQorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCQkJICAgIF4gY3Vyd2luLT53X3BfcmwKKyNlbmRpZgorCQkJCQkJICAgICkKKwkJb2Eub3BfdHlwZSA9IE9QX1JTSElGVDsKKwkgICAgZWxzZQorCQlvYS5vcF90eXBlID0gT1BfTFNISUZUOworCSAgICBvcF9zaGlmdCgmb2EsIEZBTFNFLCBlYXAtPmFtb3VudCk7CisJICAgIGJyZWFrOworICAgIH0KKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgdmlydHVhbF9vcCA9IE1BWUJFOworI2VuZGlmCit9CisKKy8qCisgKiAiOnB1dCIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcHV0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgLyogIjowcHV0IiB3b3JrcyBsaWtlICI6MXB1dCEiLiAqLworICAgIGlmIChlYXAtPmxpbmUyID09IDApCisgICAgeworCWVhcC0+bGluZTIgPSAxOworCWVhcC0+Zm9yY2VpdCA9IFRSVUU7CisgICAgfQorICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGVhcC0+bGluZTI7CisgICAgZG9fcHV0KGVhcC0+cmVnbmFtZSwgZWFwLT5mb3JjZWl0ID8gQkFDS1dBUkQgOiBGT1JXQVJELCAxTCwgUFVUX0xJTkUpOworfQorCisvKgorICogSGFuZGxlICI6Y29weSIgYW5kICI6bW92ZSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfY29weW1vdmUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBsb25nCW47CisKKyAgICBuID0gZ2V0X2FkZHJlc3MoJmVhcC0+YXJnLCBGQUxTRSwgRkFMU0UpOworICAgIGlmIChlYXAtPmFyZyA9PSBOVUxMKQkgICAgLyogZXJyb3IgZGV0ZWN0ZWQgKi8KKyAgICB7CisJZWFwLT5uZXh0Y21kID0gTlVMTDsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBtb3ZlIG9yIGNvcHkgbGluZXMgZnJvbSAnZWFwLT5saW5lMSctJ2VhcC0+bGluZTInIHRvIGJlbG93IGxpbmUgJ24nCisgICAgICovCisgICAgaWYgKG4gPT0gTUFYTE5VTSB8fCBuIDwgMCB8fCBuID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCUVNU0coXyhlX2ludmFkZHIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9tb3ZlKQorICAgIHsKKwlpZiAoZG9fbW92ZShlYXAtPmxpbmUxLCBlYXAtPmxpbmUyLCBuKSA9PSBGQUlMKQorCSAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKwlleF9jb3B5KGVhcC0+bGluZTEsIGVhcC0+bGluZTIsIG4pOworICAgIHVfY2xlYXJsaW5lKCk7CisgICAgYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7Cit9CisKKy8qCisgKiAiOnNtYWdpYyIgYW5kICI6c25vbWFnaWMiLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3N1Ym1hZ2ljKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQltYWdpY19zYXZlID0gcF9tYWdpYzsKKworICAgIHBfbWFnaWMgPSAoZWFwLT5jbWRpZHggPT0gQ01EX3NtYWdpYyk7CisgICAgZG9fc3ViKGVhcCk7CisgICAgcF9tYWdpYyA9IG1hZ2ljX3NhdmU7Cit9CisKKy8qCisgKiAiOmpvaW4iLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2pvaW4oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlYXAtPmxpbmUxOworICAgIGlmIChlYXAtPmxpbmUxID09IGVhcC0+bGluZTIpCisgICAgeworCWlmIChlYXAtPmFkZHJfY291bnQgPj0gMikgICAvKiA6Miwyam9pbiBkb2VzIG5vdGhpbmcgKi8KKwkgICAgcmV0dXJuOworCWlmIChlYXAtPmxpbmUyID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXsKKwkgICAgYmVlcF9mbHVzaCgpOworCSAgICByZXR1cm47CisJfQorCSsrZWFwLT5saW5lMjsKKyAgICB9CisgICAgZG9fZG9fam9pbihlYXAtPmxpbmUyIC0gZWFwLT5saW5lMSArIDEsICFlYXAtPmZvcmNlaXQpOworICAgIGJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7Cit9CisKKy8qCisgKiAiOlthZGRyXUByIiBvciAiOlthZGRyXSpyIjogZXhlY3V0ZSByZWdpc3RlcgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2F0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQljOworCisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gZWFwLT5saW5lMjsKKworI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisgICAgZG9udF9zY3JvbGwgPSBUUlVFOwkJLyogZGlzYWxsb3cgc2Nyb2xsaW5nIGhlcmUgKi8KKyNlbmRpZgorCisgICAgLyogZ2V0IHRoZSByZWdpc3RlciBuYW1lLiAgTm8gbmFtZSBtZWFucyB0byB1c2UgdGhlIHByZXZpb3VzIG9uZSAqLworICAgIGMgPSAqZWFwLT5hcmc7CisgICAgaWYgKGMgPT0gTlVMIHx8IChjID09ICcqJyAmJiAqZWFwLT5jbWQgPT0gJyonKSkKKwljID0gJ0AnOworICAgIC8qIHB1dCB0aGUgcmVnaXN0ZXIgaW4gbWFwYnVmICovCisgICAgaWYgKGRvX2V4ZWNyZWcoYywgVFJVRSwgdmltX3N0cmNocihwX2NwbywgQ1BPX0VYRUNCVUYpICE9IE5VTEwpID09IEZBSUwpCisJYmVlcF9mbHVzaCgpOworICAgIGVsc2UKKyAgICB7CisJaW50CXNhdmVfZWZyID0gZXhlY19mcm9tX3JlZzsKKworCWV4ZWNfZnJvbV9yZWcgPSBUUlVFOworCisJLyoKKwkgKiBFeGVjdXRlIGZyb20gdGhlIHR5cGVhaGVhZCBidWZmZXIuCisJICogT3JpZ2luYWxseSB0aGlzIGRpZG4ndCBjaGVjayBmb3IgdGhlIHR5cGVhaGVhZCBidWZmZXIgdG8gYmUgZW1wdHksCisJICogdGh1cyBjb3VsZCByZWFkIG1vcmUgRXggY29tbWFuZHMgZnJvbSBzdGRpbi4gIEl0J3Mgbm90IGNsZWFyIHdoeSwKKwkgKiBpdCBpcyBjZXJ0YWlubHkgdW5leHBlY3RlZC4KKwkgKi8KKwl3aGlsZSAoKCFzdHVmZl9lbXB0eSgpIHx8IHR5cGVidWYudGJfbGVuID4gMCkgJiYgdnBlZWtjKCkgPT0gJzonKQorCSAgICAodm9pZClkb19jbWRsaW5lKE5VTEwsIGdldGV4bGluZSwgTlVMTCwgRE9DTURfTk9XQUlUfERPQ01EX1ZFUkJPU0UpOworCisJZXhlY19mcm9tX3JlZyA9IHNhdmVfZWZyOworICAgIH0KK30KKworLyoKKyAqICI6ISIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfYmFuZyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGRvX2JhbmcoZWFwLT5hZGRyX2NvdW50LCBlYXAsIGVhcC0+Zm9yY2VpdCwgVFJVRSwgVFJVRSk7Cit9CisKKy8qCisgKiAiOnVuZG8iLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfdW5kbyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHVfdW5kbygxKTsKK30KKworLyoKKyAqICI6cmVkbyIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitleF9yZWRvKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgdV9yZWRvKDEpOworfQorCisvKgorICogIjpyZWRpciI6IHN0YXJ0L3N0b3AgcmVkaXJlY3Rpb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcmVkaXIoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyCSptb2RlOworICAgIGNoYXJfdQkqZm5hbWU7CisKKyAgICBpZiAoU1RSSUNNUChlYXAtPmFyZywgIkVORCIpID09IDApCisJY2xvc2VfcmVkaXIoKTsKKyAgICBlbHNlCisgICAgeworCWlmICgqZWFwLT5hcmcgPT0gJz4nKQorCXsKKwkgICAgKytlYXAtPmFyZzsKKwkgICAgaWYgKCplYXAtPmFyZyA9PSAnPicpCisJICAgIHsKKwkJKytlYXAtPmFyZzsKKwkJbW9kZSA9ICJhIjsKKwkgICAgfQorCSAgICBlbHNlCisJCW1vZGUgPSAidyI7CisJICAgIGVhcC0+YXJnID0gc2tpcHdoaXRlKGVhcC0+YXJnKTsKKworCSAgICBjbG9zZV9yZWRpcigpOworCisJICAgIC8qIEV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kICJ+LyIuICovCisJICAgIGZuYW1lID0gZXhwYW5kX2Vudl9zYXZlKGVhcC0+YXJnKTsKKwkgICAgaWYgKGZuYW1lID09IE5VTEwpCisJCXJldHVybjsKKyNpZmRlZiBGRUFUX0JST1dTRQorCSAgICBpZiAoY21kbW9kLmJyb3dzZSkKKwkgICAgeworCQljaGFyX3UJKmJyb3dzZUZpbGU7CisKKwkJYnJvd3NlRmlsZSA9IGRvX2Jyb3dzZShUUlVFLCAoY2hhcl91ICopXygiU2F2ZSBSZWRpcmVjdGlvbiIpLAorCQkgICAgICAgZm5hbWUsIE5VTEwsIE5VTEwsIEJST1dTRV9GSUxURVJfQUxMX0ZJTEVTLCBjdXJidWYpOworCQlpZiAoYnJvd3NlRmlsZSA9PSBOVUxMKQorCQkgICAgcmV0dXJuOwkJLyogb3BlcmF0aW9uIGNhbmNlbGxlZCAqLworCQl2aW1fZnJlZShmbmFtZSk7CisJCWZuYW1lID0gYnJvd3NlRmlsZTsKKwkJZWFwLT5mb3JjZWl0ID0gVFJVRTsJLyogc2luY2UgZGlhbG9nIGFscmVhZHkgYXNrZWQgKi8KKwkgICAgfQorI2VuZGlmCisKKwkgICAgcmVkaXJfZmQgPSBvcGVuX2V4ZmlsZShmbmFtZSwgZWFwLT5mb3JjZWl0LCBtb2RlKTsKKwkgICAgdmltX2ZyZWUoZm5hbWUpOworCX0KKyNpZmRlZiBGRUFUX0VWQUwKKwllbHNlIGlmICgqZWFwLT5hcmcgPT0gJ0AnKQorCXsKKwkgICAgLyogcmVkaXJlY3QgdG8gYSByZWdpc3RlciBhLXogKHJlc3AuIEEtWiBmb3IgYXBwZW5kaW5nKSAqLworCSAgICBjbG9zZV9yZWRpcigpOworCSAgICArK2VhcC0+YXJnOworCSAgICBpZiAoQVNDSUlfSVNBTFBIQSgqZWFwLT5hcmcpCisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisJCSAgICB8fCAqZWFwLT5hcmcgPT0gJyonCisjIGVuZGlmCisJCSAgICB8fCAqZWFwLT5hcmcgPT0gJyInKQorCSAgICB7CisJCXJlZGlyX3JlZyA9ICplYXAtPmFyZzsKKwkJaWYgKGlzbG93ZXIocmVkaXJfcmVnKQorIyBpZmRlZiBGRUFUX0NMSVBCT0FSRAorCQkJfHwgcmVkaXJfcmVnID09ICcqJworIyBlbmRpZgorCQkJfHwgcmVkaXJfcmVnID09ICciJykKKwkJeworCQkgICAgLyogbWFrZSByZWdpc3RlciBlbXB0eSAqLworCQkgICAgd3JpdGVfcmVnX2NvbnRlbnRzKHJlZGlyX3JlZywgKGNoYXJfdSAqKSIiLCAtMSwgRkFMU0UpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCQlFTVNHKF8oZV9pbnZhcmcpKTsKKwl9CisjZW5kaWYKKworCS8qIFRPRE86IHJlZGlyZWN0IHRvIGEgYnVmZmVyICovCisKKwkvKiBUT0RPOiByZWRpcmVjdCB0byBhbiBpbnRlcm5hbCB2YXJpYWJsZSAqLworCisJZWxzZQorCSAgICBFTVNHKF8oZV9pbnZhcmcpKTsKKyAgICB9Cit9CisKKy8qCisgKiAiOnJlZHJhdyI6IGZvcmNlIHJlZHJhdworICovCisgICAgc3RhdGljIHZvaWQKK2V4X3JlZHJhdyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJciA9IFJlZHJhd2luZ0Rpc2FibGVkOworICAgIGludAkJcCA9IHBfbHo7CisKKyAgICBSZWRyYXdpbmdEaXNhYmxlZCA9IDA7CisgICAgcF9seiA9IEZBTFNFOworICAgIHVwZGF0ZV90b3BsaW5lKCk7CisgICAgdXBkYXRlX3NjcmVlbihlYXAtPmZvcmNlaXQgPyBDTEVBUiA6CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgVklzdWFsX2FjdGl2ZSA/IElOVkVSVEVEIDoKKyNlbmRpZgorCSAgICAwKTsKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgaWYgKG5lZWRfbWFrZXRpdGxlKQorCW1ha2V0aXRsZSgpOworI2VuZGlmCisgICAgUmVkcmF3aW5nRGlzYWJsZWQgPSByOworICAgIHBfbHogPSBwOworCisgICAgLyogUmVzZXQgbXNnX2RpZG91dCwgc28gdGhhdCBhIG1lc3NhZ2UgdGhhdCdzIHRoZXJlIGlzIG92ZXJ3cml0dGVuLiAqLworICAgIG1zZ19kaWRvdXQgPSBGQUxTRTsKKyAgICBtc2dfY29sID0gMDsKKworICAgIG91dF9mbHVzaCgpOworfQorCisvKgorICogIjpyZWRyYXdzdGF0dXMiOiBmb3JjZSByZWRyYXcgb2Ygc3RhdHVzIGxpbmUocykKKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2V4X3JlZHJhd3N0YXR1cyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKQorICAgIGludAkJciA9IFJlZHJhd2luZ0Rpc2FibGVkOworICAgIGludAkJcCA9IHBfbHo7CisKKyAgICBSZWRyYXdpbmdEaXNhYmxlZCA9IDA7CisgICAgcF9seiA9IEZBTFNFOworICAgIGlmIChlYXAtPmZvcmNlaXQpCisJc3RhdHVzX3JlZHJhd19hbGwoKTsKKyAgICBlbHNlCisJc3RhdHVzX3JlZHJhd19jdXJidWYoKTsKKyAgICB1cGRhdGVfc2NyZWVuKAorIyBpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICBWSXN1YWxfYWN0aXZlID8gSU5WRVJURUQgOgorIyBlbmRpZgorCSAgICAwKTsKKyAgICBSZWRyYXdpbmdEaXNhYmxlZCA9IHI7CisgICAgcF9seiA9IHA7CisgICAgb3V0X2ZsdXNoKCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyB2b2lkCitjbG9zZV9yZWRpcigpCit7CisgICAgaWYgKHJlZGlyX2ZkICE9IE5VTEwpCisgICAgeworCWZjbG9zZShyZWRpcl9mZCk7CisJcmVkaXJfZmQgPSBOVUxMOworICAgIH0KKyNpZmRlZiBGRUFUX0VWQUwKKyAgICByZWRpcl9yZWcgPSAwOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfU0VTU0lPTikgJiYgZGVmaW5lZChVU0VfQ1JOTCkKKyMgZGVmaW5lIE1LU0VTU0lPTl9OTAorc3RhdGljIGludCBta3Nlc3Npb25fbmwgPSBGQUxTRTsgICAgLyogdXNlIE5MIG9ubHkgaW4gcHV0X2VvbCgpICovCisjZW5kaWYKKworLyoKKyAqICI6bWtleHJjIiwgIjpta3ZpbXJjIiwgIjpta3ZpZXciIGFuZCAiOm1rc2Vzc2lvbiIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbWtyYyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIEZJTEUJKmZkOworICAgIGludAkJZmFpbGVkID0gRkFMU0U7CisgICAgY2hhcl91CSpmbmFtZTsKKyNpZmRlZiBGRUFUX0JST1dTRQorICAgIGNoYXJfdQkqYnJvd3NlRmlsZSA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFU1NJT04KKyAgICBpbnQJCXZpZXdfc2Vzc2lvbiA9IEZBTFNFOworICAgIGludAkJdXNpbmdfdmRpciA9IEZBTFNFOwkvKiB1c2luZyAndmlld2Rpcic/ICovCisgICAgY2hhcl91CSp2aWV3RmlsZSA9IE5VTEw7CisgICAgdW5zaWduZWQJKmZsYWdwOworI2VuZGlmCisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX21rc2Vzc2lvbiB8fCBlYXAtPmNtZGlkeCA9PSBDTURfbWt2aWV3KQorICAgIHsKKyNpZmRlZiBGRUFUX1NFU1NJT04KKwl2aWV3X3Nlc3Npb24gPSBUUlVFOworI2Vsc2UKKwlleF9uaShlYXApOworCXJldHVybjsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIEZFQVRfU0VTU0lPTgorICAgIC8qICI6bWt2aWV3IiBvciAiOm1rdmlldyA5IjogZ2VuZXJhdGUgZmlsZSBuYW1lIHdpdGggJ3ZpZXdkaXInICovCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9ta3ZpZXcKKwkgICAgJiYgKCplYXAtPmFyZyA9PSBOVUwKKwkJfHwgKHZpbV9pc2RpZ2l0KCplYXAtPmFyZykgJiYgZWFwLT5hcmdbMV0gPT0gTlVMKSkpCisgICAgeworCWVhcC0+Zm9yY2VpdCA9IFRSVUU7CisJZm5hbWUgPSBnZXRfdmlld19maWxlKCplYXAtPmFyZyk7CisJaWYgKGZuYW1lID09IE5VTEwpCisJICAgIHJldHVybjsKKwl2aWV3RmlsZSA9IGZuYW1lOworCXVzaW5nX3ZkaXIgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlpZiAoKmVhcC0+YXJnICE9IE5VTCkKKwlmbmFtZSA9IGVhcC0+YXJnOworICAgIGVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9ta3ZpbXJjKQorCWZuYW1lID0gKGNoYXJfdSAqKVZJTVJDX0ZJTEU7CisjaWZkZWYgRkVBVF9TRVNTSU9OCisgICAgZWxzZSBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX21rc2Vzc2lvbikKKwlmbmFtZSA9IChjaGFyX3UgKilTRVNTSU9OX0ZJTEU7CisjZW5kaWYKKyAgICBlbHNlCisJZm5hbWUgPSAoY2hhcl91ICopRVhSQ19GSUxFOworCisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICBpZiAoY21kbW9kLmJyb3dzZSkKKyAgICB7CisJYnJvd3NlRmlsZSA9IGRvX2Jyb3dzZShUUlVFLAorIyBpZmRlZiBGRUFUX1NFU1NJT04KKwkJZWFwLT5jbWRpZHggPT0gQ01EX21rdmlldyA/IChjaGFyX3UgKilfKCJTYXZlIFZpZXciKSA6CisJCWVhcC0+Y21kaWR4ID09IENNRF9ta3Nlc3Npb24gPyAoY2hhcl91ICopXygiU2F2ZSBTZXNzaW9uIikgOgorIyBlbmRpZgorCQkoY2hhcl91ICopXygiU2F2ZSBTZXR1cCIpLAorCQlmbmFtZSwgKGNoYXJfdSAqKSJ2aW0iLCBOVUxMLCBCUk9XU0VfRklMVEVSX01BQ1JPUywgTlVMTCk7CisJaWYgKGJyb3dzZUZpbGUgPT0gTlVMTCkKKwkgICAgZ290byB0aGVlbmQ7CisJZm5hbWUgPSBicm93c2VGaWxlOworCWVhcC0+Zm9yY2VpdCA9IFRSVUU7CS8qIHNpbmNlIGRpYWxvZyBhbHJlYWR5IGFza2VkICovCisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU0VTU0lPTikgJiYgZGVmaW5lZCh2aW1fbWtkaXIpCisgICAgLyogV2hlbiB1c2luZyAndmlld2RpcicgbWF5IGhhdmUgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkuICovCisgICAgaWYgKHVzaW5nX3ZkaXIgJiYgIW1jaF9pc2RpcihwX3ZkaXIpKQorCXZpbV9ta2RpcihwX3ZkaXIsIDA3NTUpOyAvKiBpZ25vcmUgZXJyb3JzLCBvcGVuX2V4ZmlsZSgpIHdpbGwgZmFpbCAqLworI2VuZGlmCisKKyAgICBmZCA9IG9wZW5fZXhmaWxlKGZuYW1lLCBlYXAtPmZvcmNlaXQsIFdSSVRFQklOKTsKKyAgICBpZiAoZmQgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgRkVBVF9TRVNTSU9OCisJaWYgKGVhcC0+Y21kaWR4ID09IENNRF9ta3ZpZXcpCisJICAgIGZsYWdwID0gJnZvcF9mbGFnczsKKwllbHNlCisJICAgIGZsYWdwID0gJnNzb3BfZmxhZ3M7CisjZW5kaWYKKworI2lmZGVmIE1LU0VTU0lPTl9OTAorCS8qICJ1bml4IiBpbiAnc2Vzc2lvbm9wdGlvbnMnOiB1c2UgTkwgbGluZSBzZXBhcmF0b3IgKi8KKwlpZiAodmlld19zZXNzaW9uICYmICgqZmxhZ3AgJiBTU09QX1VOSVgpKQorCSAgICBta3Nlc3Npb25fbmwgPSBUUlVFOworI2VuZGlmCisKKwkvKiBXcml0ZSB0aGUgdmVyc2lvbiBjb21tYW5kIGZvciA6bWt2aW1yYyAqLworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfbWt2aW1yYykKKwkgICAgKHZvaWQpcHV0X2xpbmUoZmQsICJ2ZXJzaW9uIDYuMCIpOworCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJaWYgKGVhcC0+Y21kaWR4ICE9IENNRF9ta3ZpZXcpCisjZW5kaWYKKwl7CisJICAgIC8qIFdyaXRlIHNldHRpbmcgJ2NvbXBhdGlibGUnIGZpcnN0LCBiZWNhdXNlIGl0IGhhcyBzaWRlIGVmZmVjdHMuCisJICAgICAqIEZvciB0aGF0IHNhbWUgcmVhc29uIG9ubHkgZG8gaXQgd2hlbiBuZWVkZWQuICovCisJICAgIGlmIChwX2NwKQorCQkodm9pZClwdXRfbGluZShmZCwgImlmICEmY3AgfCBzZXQgY3AgfCBlbmRpZiIpOworCSAgICBlbHNlCisJCSh2b2lkKXB1dF9saW5lKGZkLCAiaWYgJmNwIHwgc2V0IG5vY3AgfCBlbmRpZiIpOworCX0KKworI2lmZGVmIEZFQVRfU0VTU0lPTgorCWlmICghdmlld19zZXNzaW9uCisJCXx8IChlYXAtPmNtZGlkeCA9PSBDTURfbWtzZXNzaW9uCisJCSAgICAmJiAoKmZsYWdwICYgU1NPUF9PUFRJT05TKSkpCisjZW5kaWYKKwkgICAgZmFpbGVkIHw9IChtYWtlbWFwKGZkLCBOVUxMKSA9PSBGQUlMCisJCQkJICAgfHwgbWFrZXNldChmZCwgT1BUX0dMT0JBTCwgRkFMU0UpID09IEZBSUwpOworCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJaWYgKCFmYWlsZWQgJiYgdmlld19zZXNzaW9uKQorCXsKKwkgICAgaWYgKHB1dF9saW5lKGZkLCAibGV0IHM6c29fc2F2ZSA9ICZzbyB8IGxldCBzOnNpc29fc2F2ZSA9ICZzaXNvIHwgc2V0IHNvPTAgc2lzbz0wIikgPT0gRkFJTCkKKwkJZmFpbGVkID0gVFJVRTsKKwkgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9ta3Nlc3Npb24pCisJICAgIHsKKwkJY2hhcl91IGRpcm5vd1tNQVhQQVRITF07CS8qIGN1cnJlbnQgZGlyZWN0b3J5ICovCisKKwkJLyoKKwkJICogQ2hhbmdlIHRvIHNlc3Npb24gZmlsZSdzIGRpci4KKwkJICovCisJCWlmIChtY2hfZGlybmFtZShkaXJub3csIE1BWFBBVEhMKSA9PSBGQUlMCisJCQkJCSAgICB8fCBtY2hfY2hkaXIoKGNoYXIgKilkaXJub3cpICE9IDApCisJCSAgICAqZGlybm93ID0gTlVMOworCQlpZiAoKmRpcm5vdyAhPSBOVUwgJiYgKHNzb3BfZmxhZ3MgJiBTU09QX1NFU0RJUikpCisJCXsKKwkJICAgIGlmICh2aW1fY2hkaXJmaWxlKGZuYW1lKSA9PSBPSykKKwkJCXNob3J0ZW5fZm5hbWVzKFRSVUUpOworCQl9CisJCWVsc2UgaWYgKCpkaXJub3cgIT0gTlVMCisJCQkmJiAoc3NvcF9mbGFncyAmIFNTT1BfQ1VSRElSKSAmJiBnbG9iYWxkaXIgIT0gTlVMTCkKKwkJeworCQkgICAgKHZvaWQpbWNoX2NoZGlyKChjaGFyICopZ2xvYmFsZGlyKTsKKwkJICAgIHNob3J0ZW5fZm5hbWVzKFRSVUUpOworCQl9CisKKwkJZmFpbGVkIHw9IChtYWtlb3BlbnMoZmQsIGRpcm5vdykgPT0gRkFJTCk7CisKKwkJLyogcmVzdG9yZSBvcmlnaW5hbCBkaXIgKi8KKwkJaWYgKCpkaXJub3cgIT0gTlVMICYmICgoc3NvcF9mbGFncyAmIFNTT1BfU0VTRElSKQorCQkJfHwgKChzc29wX2ZsYWdzICYgU1NPUF9DVVJESVIpICYmIGdsb2JhbGRpciAhPSBOVUxMKSkpCisJCXsKKwkJICAgIGlmIChtY2hfY2hkaXIoKGNoYXIgKilkaXJub3cpICE9IDApCisJCQlFTVNHKF8oZV9wcmV2X2RpcikpOworCQkgICAgc2hvcnRlbl9mbmFtZXMoVFJVRSk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZmFpbGVkIHw9IChwdXRfdmlldyhmZCwgY3Vyd2luLCAhdXNpbmdfdmRpciwgZmxhZ3ApID09IEZBSUwpOworCSAgICB9CisJICAgIGlmIChwdXRfbGluZShmZCwgImxldCAmc28gPSBzOnNvX3NhdmUgfCBsZXQgJnNpc28gPSBzOnNpc29fc2F2ZSIpCisJCQkJCQkJCSAgICAgID09IEZBSUwpCisJCWZhaWxlZCA9IFRSVUU7CisJfQorI2VuZGlmCisJZmFpbGVkIHw9IGZjbG9zZShmZCk7CisKKwlpZiAoZmFpbGVkKQorCSAgICBFTVNHKF8oZV93cml0ZSkpOworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfU0VTU0lPTikKKwllbHNlIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfbWtzZXNzaW9uKQorCXsKKwkgICAgLyogc3VjY2Vzc2Z1bCBzZXNzaW9uIHdyaXRlIC0gc2V0IHRoaXNfc2Vzc2lvbiB2YXIgKi8KKwkgICAgY2hhcl91CXRidWZbTUFYUEFUSExdOworCisJICAgIGlmICh2aW1fRnVsbE5hbWUoZm5hbWUsIHRidWYsIE1BWFBBVEhMLCBGQUxTRSkgPT0gT0spCisJCXNldF92aW1fdmFyX3N0cmluZyhWVl9USElTX1NFU1NJT04sIHRidWYsIC0xKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBNS1NFU1NJT05fTkwKKwlta3Nlc3Npb25fbmwgPSBGQUxTRTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIEZFQVRfQlJPV1NFCit0aGVlbmQ6CisgICAgdmltX2ZyZWUoYnJvd3NlRmlsZSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFU1NJT04KKyAgICB2aW1fZnJlZSh2aWV3RmlsZSk7CisjZW5kaWYKK30KKworLyoKKyAqIE9wZW4gYSBmaWxlIGZvciB3cml0aW5nIGZvciBhbiBFeCBjb21tYW5kLCB3aXRoIHNvbWUgY2hlY2tzLgorICogUmV0dXJuIGZpbGUgZGVzY3JpcHRvciwgb3IgTlVMTCBvbiBmYWlsdXJlLgorICovCisgICAgRklMRSAqCitvcGVuX2V4ZmlsZShmbmFtZSwgZm9yY2VpdCwgbW9kZSkKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJZm9yY2VpdDsKKyAgICBjaGFyCSptb2RlOwkgICAgLyogInciIGZvciBjcmVhdGUgbmV3IGZpbGUgb3IgImEiIGZvciBhcHBlbmQgKi8KK3sKKyAgICBGSUxFCSpmZDsKKworI2lmZGVmIFVOSVgKKyAgICAvKiB3aXRoIFVuaXggaXQgaXMgcG9zc2libGUgdG8gb3BlbiBhIGRpcmVjdG9yeSAqLworICAgIGlmIChtY2hfaXNkaXIoZm5hbWUpKQorICAgIHsKKwlFTVNHMihfKGVfaXNhZGlyMiksIGZuYW1lKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIWZvcmNlaXQgJiYgKm1vZGUgIT0gJ2EnICYmIHZpbV9mZXhpc3RzKGZuYW1lKSkKKyAgICB7CisJRU1TRzIoXygiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIiksIGZuYW1lKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZkID0gbWNoX2ZvcGVuKChjaGFyICopZm5hbWUsIG1vZGUpKSA9PSBOVUxMKQorCUVNU0cyKF8oIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIpLCBmbmFtZSk7CisKKyAgICByZXR1cm4gZmQ7Cit9CisKKy8qCisgKiAiOm1hcmsiIGFuZCAiOmsiLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X21hcmsoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBwb3NfVAlwb3M7CisKKyAgICBpZiAoKmVhcC0+YXJnID09IE5VTCkJCS8qIE5vIGFyZ3VtZW50PyAqLworCUVNU0coXyhlX2FyZ3JlcSkpOworICAgIGVsc2UgaWYgKGVhcC0+YXJnWzFdICE9IE5VTCkJLyogbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXI/ICovCisJRU1TRyhfKGVfdHJhaWxpbmcpKTsKKyAgICBlbHNlCisgICAgeworCXBvcyA9IGN1cndpbi0+d19jdXJzb3I7CQkvKiBzYXZlIGN1cndpbi0+d19jdXJzb3IgKi8KKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlYXAtPmxpbmUyOworCWJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisJaWYgKHNldG1hcmsoKmVhcC0+YXJnKSA9PSBGQUlMKQkvKiBzZXQgbWFyayAqLworCSAgICBFTVNHKF8oIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIpKTsKKwljdXJ3aW4tPndfY3Vyc29yID0gcG9zOwkJLyogcmVzdG9yZSBjdXJ3aW4tPndfY3Vyc29yICovCisgICAgfQorfQorCisvKgorICogVXBkYXRlIHdfdG9wbGluZSwgd19sZWZ0Y29sIGFuZCB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICovCisgICAgdm9pZAordXBkYXRlX3RvcGxpbmVfY3Vyc29yKCkKK3sKKyAgICBjaGVja19jdXJzb3IoKTsJCS8qIHB1dCBjdXJzb3Igb24gdmFsaWQgbGluZSAqLworICAgIHVwZGF0ZV90b3BsaW5lKCk7CisgICAgaWYgKCFjdXJ3aW4tPndfcF93cmFwKQorCXZhbGlkYXRlX2N1cnNvcigpOworICAgIHVwZGF0ZV9jdXJzd2FudCgpOworfQorCisjaWZkZWYgRkVBVF9FWF9FWFRSQQorLyoKKyAqICI6bm9ybWFsWyFdIHtjb21tYW5kc30iOiBFeGVjdXRlIG5vcm1hbCBtb2RlIGNvbW1hbmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X25vcm1hbChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIG9wYXJnX1QJb2E7CisgICAgaW50CQlzYXZlX21zZ19zY3JvbGwgPSBtc2dfc2Nyb2xsOworICAgIGludAkJc2F2ZV9yZXN0YXJ0X2VkaXQgPSByZXN0YXJ0X2VkaXQ7CisgICAgaW50CQlzYXZlX21zZ19kaWRvdXQgPSBtc2dfZGlkb3V0OworICAgIGludAkJc2F2ZV9TdGF0ZSA9IFN0YXRlOworICAgIHRhc2F2ZV9UCXRhYnVmOworICAgIGludAkJc2F2ZV9pbnNlcnRtb2RlID0gcF9pbTsKKyAgICBpbnQJCXNhdmVfZmluaXNoX29wID0gZmluaXNoX29wOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJKmFyZyA9IE5VTEw7CisgICAgaW50CQlsOworICAgIGNoYXJfdQkqcDsKKyNlbmRpZgorCisgICAgaWYgKGV4X25vcm1hbF9idXN5ID49IHBfbW1kKQorICAgIHsKKwlFTVNHKF8oIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIpKTsKKwlyZXR1cm47CisgICAgfQorICAgICsrZXhfbm9ybWFsX2J1c3k7CisKKyAgICBtc2dfc2Nyb2xsID0gRkFMU0U7CSAgICAvKiBubyBtc2cgc2Nyb2xsaW5nIGluIE5vcm1hbCBtb2RlICovCisgICAgcmVzdGFydF9lZGl0ID0gMDsJICAgIC8qIGRvbid0IGdvIHRvIEluc2VydCBtb2RlICovCisgICAgcF9pbSA9IEZBTFNFOwkgICAgLyogZG9uJ3QgdXNlICdpbnNlcnRtb2RlJyAqLworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qCisgICAgICogdmdldGMoKSBleHBlY3RzIGEgQ1NJIGFuZCBLX1NQRUNJQUwgdG8gaGF2ZSBiZWVuIGVzY2FwZWQuICBEb24ndCBkbworICAgICAqIHRoaXMgZm9yIHRoZSBLX1NQRUNJQUwgbGVhZGluZyBieXRlLCBvdGhlcndpc2Ugc3BlY2lhbCBrZXlzIHdpbGwgbm90CisgICAgICogd29yay4KKyAgICAgKi8KKyAgICBpZiAoaGFzX21ieXRlKQorICAgIHsKKwlpbnQJbGVuID0gMDsKKworCS8qIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlc2NhcGVkLiAqLworCWZvciAocCA9IGVhcC0+YXJnOyAqcCAhPSBOVUw7ICsrcCkKKwl7CisjIGlmZGVmIEZFQVRfR1VJCisJICAgIGlmICgqcCA9PSBDU0kpICAvKiBsZWFkYnl0ZSBDU0kgKi8KKwkJbGVuICs9IDI7CisjIGVuZGlmCisJICAgIGZvciAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOyBsID4gMDsgLS1sKQorCQlpZiAoKisrcCA9PSBLX1NQRUNJQUwJICAvKiB0cmFpbGJ5dGUgS19TUEVDSUFMIG9yIENTSSAqLworIyBpZmRlZiBGRUFUX0dVSQorCQkJfHwgKnAgPT0gQ1NJCisjIGVuZGlmCisJCQkpCisJCSAgICBsZW4gKz0gMjsKKwl9CisJaWYgKGxlbiA+IDApCisJeworCSAgICBhcmcgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihlYXAtPmFyZykgKyBsZW4gKyAxKSk7CisJICAgIGlmIChhcmcgIT0gTlVMTCkKKwkgICAgeworCQlsZW4gPSAwOworCQlmb3IgKHAgPSBlYXAtPmFyZzsgKnAgIT0gTlVMOyArK3ApCisJCXsKKwkJICAgIGFyZ1tsZW4rK10gPSAqcDsKKyMgaWZkZWYgRkVBVF9HVUkKKwkJICAgIGlmICgqcCA9PSBDU0kpCisJCSAgICB7CisJCQlhcmdbbGVuKytdID0gS1NfRVhUUkE7CisJCQlhcmdbbGVuKytdID0gKGludClLRV9DU0k7CisJCSAgICB9CisjIGVuZGlmCisJCSAgICBmb3IgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsgbCA+IDA7IC0tbCkKKwkJICAgIHsKKwkJCWFyZ1tsZW4rK10gPSAqKytwOworCQkJaWYgKCpwID09IEtfU1BFQ0lBTCkKKwkJCXsKKwkJCSAgICBhcmdbbGVuKytdID0gS1NfU1BFQ0lBTDsKKwkJCSAgICBhcmdbbGVuKytdID0gS0VfRklMTEVSOworCQkJfQorIyBpZmRlZiBGRUFUX0dVSQorCQkJZWxzZSBpZiAoKnAgPT0gQ1NJKQorCQkJeworCQkJICAgIGFyZ1tsZW4rK10gPSBLU19FWFRSQTsKKwkJCSAgICBhcmdbbGVuKytdID0gKGludClLRV9DU0k7CisJCQl9CisjIGVuZGlmCisJCSAgICB9CisJCSAgICBhcmdbbGVuXSA9IE5VTDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBjdXJyZW50IHR5cGVhaGVhZC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gYWxsb3cgdXNpbmcgIjpub3JtYWwiCisgICAgICogZnJvbSBhbiBldmVudCBoYW5kbGVyIGFuZCBtYWtlcyBzdXJlIHdlIGRvbid0IGhhbmcgd2hlbiB0aGUgYXJndW1lbnQKKyAgICAgKiBlbmRzIHdpdGggaGFsZiBhIGNvbW1hbmQuCisgICAgICovCisgICAgc2F2ZV90eXBlYWhlYWQoJnRhYnVmKTsKKyAgICBpZiAodGFidWYudHlwZWJ1Zl92YWxpZCkKKyAgICB7CisJLyoKKwkgKiBSZXBlYXQgdGhlIDpub3JtYWwgY29tbWFuZCBmb3IgZWFjaCBsaW5lIGluIHRoZSByYW5nZS4gIFdoZW4gbm8KKwkgKiByYW5nZSBnaXZlbiwgZXhlY3V0ZSBpdCBqdXN0IG9uY2UsIHdpdGhvdXQgcG9zaXRpb25pbmcgdGhlIGN1cnNvcgorCSAqIGZpcnN0LgorCSAqLworCWRvCisJeworCSAgICBjbGVhcl9vcGFyZygmb2EpOworCSAgICBmaW5pc2hfb3AgPSBGQUxTRTsKKwkgICAgaWYgKGVhcC0+YWRkcl9jb3VudCAhPSAwKQorCSAgICB7CisJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGVhcC0+bGluZTErKzsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogU3R1ZmYgdGhlIGFyZ3VtZW50IGludG8gdGhlIHR5cGVhaGVhZCBidWZmZXIuCisJICAgICAqIEV4ZWN1dGUgbm9ybWFsX2NtZCgpIHVudGlsIHRoZXJlIGlzIG5vIHR5cGVhaGVhZCBsZWZ0LgorCSAgICAgKi8KKwkgICAgaW5zX3R5cGVidWYoCisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgYXJnICE9IE5VTEwgPyBhcmcgOgorI2VuZGlmCisJCSAgICBlYXAtPmFyZywgZWFwLT5mb3JjZWl0ID8gUkVNQVBfTk9ORSA6IFJFTUFQX1lFUywgMCwKKwkJCQkJCQkJIFRSVUUsIEZBTFNFKTsKKwkgICAgd2hpbGUgKCghc3R1ZmZfZW1wdHkoKSB8fCAoIXR5cGVidWZfdHlwZWQoKSAmJiB0eXBlYnVmLnRiX2xlbiA+IDApKQorCQkgICAgJiYgIWdvdF9pbnQpCisJICAgIHsKKwkJdXBkYXRlX3RvcGxpbmVfY3Vyc29yKCk7CisJCW5vcm1hbF9jbWQoJm9hLCBGQUxTRSk7CS8qIGV4ZWN1dGUgYSBOb3JtYWwgbW9kZSBjbWQgKi8KKwkgICAgfQorCX0KKwl3aGlsZSAoZWFwLT5hZGRyX2NvdW50ID4gMCAmJiBlYXAtPmxpbmUxIDw9IGVhcC0+bGluZTIgJiYgIWdvdF9pbnQpOworICAgIH0KKworICAgIC8qIE1pZ2h0IG5vdCByZXR1cm4gdG8gdGhlIG1haW4gbG9vcCB3aGVuIGluIGFuIGV2ZW50IGhhbmRsZXIuICovCisgICAgdXBkYXRlX3RvcGxpbmVfY3Vyc29yKCk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyB0eXBlYWhlYWQuICovCisgICAgcmVzdG9yZV90eXBlYWhlYWQoJnRhYnVmKTsKKworICAgIC0tZXhfbm9ybWFsX2J1c3k7CisgICAgbXNnX3Njcm9sbCA9IHNhdmVfbXNnX3Njcm9sbDsKKyAgICByZXN0YXJ0X2VkaXQgPSBzYXZlX3Jlc3RhcnRfZWRpdDsKKyAgICBwX2ltID0gc2F2ZV9pbnNlcnRtb2RlOworICAgIGZpbmlzaF9vcCA9IHNhdmVfZmluaXNoX29wOworICAgIG1zZ19kaWRvdXQgfD0gc2F2ZV9tc2dfZGlkb3V0OwkvKiBkb24ndCByZXNldCBtc2dfZGlkb3V0IG5vdyAqLworCisgICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgKG5lZWRlZCB3aGVuIGNhbGxlZCBmcm9tIGEgZnVuY3Rpb24gZXhlY3V0ZWQgZm9yCisgICAgICogJ2luZGVudGV4cHInKS4gKi8KKyAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbV9mcmVlKGFyZyk7CisjZW5kaWYKK30KKworLyoKKyAqICI6c3RhcnRpbnNlcnQiCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfc3RhcnRpbnNlcnQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoZWFwLT5mb3JjZWl0KQorICAgIHsKKwljb2xhZHZhbmNlKChjb2xucl9UKU1BWENPTCk7CisJY3Vyd2luLT53X2N1cnN3YW50ID0gTUFYQ09MOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBGQUxTRTsKKwlyZXN0YXJ0X2VkaXQgPSAnYSc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmVzdGFydF9lZGl0ID0gJ2knOworCWN1cndpbi0+d19jdXJzd2FudCA9IDA7CSAgICAvKiBhdm9pZCBNQVhDT0wgKi8KKyAgICB9Cit9CisKKy8qCisgKiAiOnN0b3BpbnNlcnQiCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitleF9zdG9waW5zZXJ0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgcmVzdGFydF9lZGl0ID0gMDsKKyAgICBzdG9wX2luc2VydF9tb2RlID0gVFJVRTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GSU5EX0lECisgICAgc3RhdGljIHZvaWQKK2V4X2NoZWNrcGF0aChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGZpbmRfcGF0dGVybl9pbl9wYXRoKE5VTEwsIDAsIDAsIEZBTFNFLCBGQUxTRSwgQ0hFQ0tfUEFUSCwgMUwsCisJCQkJICAgZWFwLT5mb3JjZWl0ID8gQUNUSU9OX1NIT1dfQUxMIDogQUNUSU9OX1NIT1csCisJCQkJCSAgICAgIChsaW5lbnJfVCkxLCAobGluZW5yX1QpTUFYTE5VTSk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorLyoKKyAqICI6cHNlYXJjaCIKKyAqLworICAgIHN0YXRpYyB2b2lkCitleF9wc2VhcmNoKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZ19kb190YWdwcmV2aWV3ID0gcF9wdmg7CisgICAgZXhfZmluZHBhdChlYXApOworICAgIGdfZG9fdGFncHJldmlldyA9IDA7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCitleF9maW5kcGF0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQl3aG9sZSA9IFRSVUU7CisgICAgbG9uZwluOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWFjdGlvbjsKKworICAgIHN3aXRjaCAoY21kbmFtZXNbZWFwLT5jbWRpZHhdLmNtZF9uYW1lWzJdKQorICAgIHsKKwljYXNlICdlJzoJLyogIjpwc2VhcmNoIiwgIjppc2VhcmNoIiBhbmQgIjpkc2VhcmNoIiAqLworCQlpZiAoY21kbmFtZXNbZWFwLT5jbWRpZHhdLmNtZF9uYW1lWzBdID09ICdwJykKKwkJICAgIGFjdGlvbiA9IEFDVElPTl9HT1RPOworCQllbHNlCisJCSAgICBhY3Rpb24gPSBBQ1RJT05fU0hPVzsKKwkJYnJlYWs7CisJY2FzZSAnaSc6CS8qICI6aWxpc3QiIGFuZCAiOmRsaXN0IiAqLworCQlhY3Rpb24gPSBBQ1RJT05fU0hPV19BTEw7CisJCWJyZWFrOworCWNhc2UgJ3UnOgkvKiAiOmlqdW1wIiBhbmQgIjpkanVtcCIgKi8KKwkJYWN0aW9uID0gQUNUSU9OX0dPVE87CisJCWJyZWFrOworCWRlZmF1bHQ6CS8qICI6aXNwbGl0IiBhbmQgIjpkc3BsaXQiICovCisJCWFjdGlvbiA9IEFDVElPTl9TUExJVDsKKwkJYnJlYWs7CisgICAgfQorCisgICAgbiA9IDE7CisgICAgaWYgKHZpbV9pc2RpZ2l0KCplYXAtPmFyZykpCS8qIGdldCBjb3VudCAqLworICAgIHsKKwluID0gZ2V0ZGlnaXRzKCZlYXAtPmFyZyk7CisJZWFwLT5hcmcgPSBza2lwd2hpdGUoZWFwLT5hcmcpOworICAgIH0KKyAgICBpZiAoKmVhcC0+YXJnID09ICcvJykgICAvKiBNYXRjaCByZWdleHAsIG5vdCBqdXN0IHdob2xlIHdvcmRzICovCisgICAgeworCXdob2xlID0gRkFMU0U7CisJKytlYXAtPmFyZzsKKwlwID0gc2tpcF9yZWdleHAoZWFwLT5hcmcsICcvJywgcF9tYWdpYywgTlVMTCk7CisJaWYgKCpwKQorCXsKKwkgICAgKnArKyA9IE5VTDsKKwkgICAgcCA9IHNraXB3aGl0ZShwKTsKKworCSAgICAvKiBDaGVjayBmb3IgdHJhaWxpbmcgaWxsZWdhbCBjaGFyYWN0ZXJzICovCisJICAgIGlmICghZW5kc19leGNtZCgqcCkpCisJCWVhcC0+ZXJybXNnID0gZV90cmFpbGluZzsKKwkgICAgZWxzZQorCQllYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKHApOworCX0KKyAgICB9CisgICAgaWYgKCFlYXAtPnNraXApCisJZmluZF9wYXR0ZXJuX2luX3BhdGgoZWFwLT5hcmcsIDAsIChpbnQpU1RSTEVOKGVhcC0+YXJnKSwKKwkJCSAgICB3aG9sZSwgIWVhcC0+Zm9yY2VpdCwKKwkJCSAgICAqZWFwLT5jbWQgPT0gJ2QnID8JRklORF9ERUZJTkUgOiBGSU5EX0FOWSwKKwkJCSAgICBuLCBhY3Rpb24sIGVhcC0+bGluZTEsIGVhcC0+bGluZTIpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKworIyBpZmRlZiBGRUFUX1FVSUNLRklYCisvKgorICogIjpwdGFnIiwgIjpwdHNlbGVjdCIsICI6cHRqdW1wIiwgIjpwdG5leHQiLCBldGMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcHRhZyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGdfZG9fdGFncHJldmlldyA9IHBfcHZoOworICAgIGV4X3RhZ19jbWQoZWFwLCBjbWRuYW1lc1tlYXAtPmNtZGlkeF0uY21kX25hbWUgKyAxKTsKK30KKworLyoKKyAqICI6cGVkaXQiCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfcGVkaXQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICB3aW5fVAkqY3Vyd2luX3NhdmUgPSBjdXJ3aW47CisKKyAgICBnX2RvX3RhZ3ByZXZpZXcgPSBwX3B2aDsKKyAgICBwcmVwYXJlX3RhZ3ByZXZpZXcoKTsKKyAgICBrZWVwX2hlbHBfZmxhZyA9IGN1cndpbl9zYXZlLT53X2J1ZmZlci0+Yl9oZWxwOworICAgIGRvX2V4ZWRpdChlYXAsIE5VTEwpOworICAgIGtlZXBfaGVscF9mbGFnID0gRkFMU0U7CisgICAgaWYgKGN1cndpbiAhPSBjdXJ3aW5fc2F2ZSAmJiB3aW5fdmFsaWQoY3Vyd2luX3NhdmUpKQorICAgIHsKKwkvKiBSZXR1cm4gY3Vyc29yIHRvIHdoZXJlIHdlIHdlcmUgKi8KKwl2YWxpZGF0ZV9jdXJzb3IoKTsKKwlyZWRyYXdfbGF0ZXIoVkFMSUQpOworCXdpbl9lbnRlcihjdXJ3aW5fc2F2ZSwgVFJVRSk7CisgICAgfQorICAgIGdfZG9fdGFncHJldmlldyA9IDA7Cit9CisjIGVuZGlmCisKKy8qCisgKiAiOnN0YWciLCAiOnN0c2VsZWN0IiBhbmQgIjpzdGp1bXAiLgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3N0YWcoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBwb3N0cG9uZWRfc3BsaXQgPSAtMTsKKyAgICBwb3N0cG9uZWRfc3BsaXRfZmxhZ3MgPSBjbWRtb2Quc3BsaXQ7CisgICAgZXhfdGFnX2NtZChlYXAsIGNtZG5hbWVzW2VhcC0+Y21kaWR4XS5jbWRfbmFtZSArIDEpOworICAgIHBvc3Rwb25lZF9zcGxpdF9mbGFncyA9IDA7Cit9CisjZW5kaWYKKworLyoKKyAqICI6dGFnIiwgIjp0c2VsZWN0IiwgIjp0anVtcCIsICI6dG5leHQiLCBldGMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfdGFnKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZXhfdGFnX2NtZChlYXAsIGNtZG5hbWVzW2VhcC0+Y21kaWR4XS5jbWRfbmFtZSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZXhfdGFnX2NtZChlYXAsIG5hbWUpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBpbnQJCWNtZDsKKworICAgIHN3aXRjaCAobmFtZVsxXSkKKyAgICB7CisJY2FzZSAnaic6IGNtZCA9IERUX0pVTVA7CS8qICI6dGp1bXAiICovCisJCSAgYnJlYWs7CisJY2FzZSAncyc6IGNtZCA9IERUX1NFTEVDVDsJLyogIjp0c2VsZWN0IiAqLworCQkgIGJyZWFrOworCWNhc2UgJ3AnOiBjbWQgPSBEVF9QUkVWOwkvKiAiOnRwcmV2aW91cyIgKi8KKwkJICBicmVhazsKKwljYXNlICdOJzogY21kID0gRFRfUFJFVjsJLyogIjp0TmV4dCIgKi8KKwkJICBicmVhazsKKwljYXNlICduJzogY21kID0gRFRfTkVYVDsJLyogIjp0bmV4dCIgKi8KKwkJICBicmVhazsKKwljYXNlICdvJzogY21kID0gRFRfUE9QOwkJLyogIjpwb3AiICovCisJCSAgYnJlYWs7CisJY2FzZSAnZic6CQkJLyogIjp0Zmlyc3QiICovCisJY2FzZSAncic6IGNtZCA9IERUX0ZJUlNUOwkvKiAiOnRyZXdpbmQiICovCisJCSAgYnJlYWs7CisJY2FzZSAnbCc6IGNtZCA9IERUX0xBU1Q7CS8qICI6dGxhc3QiICovCisJCSAgYnJlYWs7CisJZGVmYXVsdDoJCQkvKiAiOnRhZyIgKi8KKyNpZmRlZiBGRUFUX0NTQ09QRQorCQkgIGlmIChwX2NzdCkKKwkJICB7CisJCSAgICAgIGRvX2NzdGFnKGVhcCk7CisJCSAgICAgIHJldHVybjsKKwkJICB9CisjZW5kaWYKKwkJICBjbWQgPSBEVF9UQUc7CisJCSAgYnJlYWs7CisgICAgfQorCisgICAgZG9fdGFnKGVhcC0+YXJnLCBjbWQsIGVhcC0+YWRkcl9jb3VudCA+IDAgPyAoaW50KWVhcC0+bGluZTIgOiAxLAorCQkJCQkJCSAgZWFwLT5mb3JjZWl0LCBUUlVFKTsKK30KKworLyoKKyAqIEV2YWx1YXRlIGNtZGxpbmUgdmFyaWFibGVzLgorICoKKyAqIGNoYW5nZSAnJScJICAgIHRvIGN1cmJ1Zi0+Yl9mZm5hbWUKKyAqCSAgJyMnCSAgICB0byBjdXJ3aW4tPndfYWx0ZmlsZQorICoJICAnPGN3b3JkPicgdG8gd29yZCB1bmRlciB0aGUgY3Vyc29yCisgKgkgICc8Y1dPUkQ+JyB0byBXT1JEIHVuZGVyIHRoZSBjdXJzb3IKKyAqCSAgJzxjZmlsZT4nIHRvIHBhdGggbmFtZSB1bmRlciB0aGUgY3Vyc29yCisgKgkgICc8c2ZpbGU+JyB0byBzb3VyY2VkIGZpbGUgbmFtZQorICoJICAnPGFmaWxlPicgdG8gZmlsZSBuYW1lIGZvciBhdXRvY29tbWFuZAorICoJICAnPGFidWY+JyAgdG8gYnVmZmVyIG51bWJlciBmb3IgYXV0b2NvbW1hbmQKKyAqCSAgJzxhbWF0Y2g+JyB0byBtYXRjaGluZyBuYW1lIGZvciBhdXRvY29tbWFuZAorICoKKyAqIFdoZW4gYW4gZXJyb3IgaXMgZGV0ZWN0ZWQsICJlcnJvcm1zZyIgaXMgc2V0IHRvIGEgbm9uLU5VTEwgcG9pbnRlciAobWF5IGJlCisgKiAiIiBmb3IgZXJyb3Igd2l0aG91dCBhIG1lc3NhZ2UpIGFuZCBOVUxMIGlzIHJldHVybmVkLgorICogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIGlmIGEgdmFsaWQgbWF0Y2ggd2FzIGZvdW5kLgorICogUmV0dXJucyBOVUxMIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4JInVzZWRsZW4iIHRoZW4gc3RpbGwgY29udGFpbnMgdGhlCisgKiBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLgorICovCisgICAgY2hhcl91ICoKK2V2YWxfdmFycyhzcmMsIHVzZWRsZW4sIGxudW1wLCBlcnJvcm1zZywgc3Jjc3RhcnQpCisgICAgY2hhcl91CSpzcmM7CQkvKiBwb2ludGVyIGludG8gY29tbWFuZGxpbmUgKi8KKyAgICBpbnQJCSp1c2VkbGVuOwkvKiBjaGFyYWN0ZXJzIGFmdGVyIHNyYyB0aGF0IGFyZSB1c2VkICovCisgICAgbGluZW5yX1QJKmxudW1wOwkJLyogbGluZSBudW1iZXIgZm9yIDplIGNvbW1hbmQsIG9yIE5VTEwgKi8KKyAgICBjaGFyX3UJKiplcnJvcm1zZzsJLyogcG9pbnRlciB0byBlcnJvciBtZXNzYWdlICovCisgICAgY2hhcl91CSpzcmNzdGFydDsJLyogYmVnaW5uaW5nIG9mIHZhbGlkIG1lbW9yeSBmb3Igc3JjICovCit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqczsKKyAgICBjaGFyX3UJKnJlc3VsdDsKKyAgICBjaGFyX3UJKnJlc3VsdGJ1ZiA9IE5VTEw7CisgICAgaW50CQlyZXN1bHRsZW47CisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCXZhbGlkID0gVkFMSURfSEVBRCArIFZBTElEX1BBVEg7ICAgIC8qIGFzc3VtZSB2YWxpZCByZXN1bHQgKi8KKyAgICBpbnQJCXNwZWNfaWR4OworI2lmZGVmIEZFQVRfTU9ESUZZX0ZOQU1FCisgICAgaW50CQlza2lwX21vZCA9IEZBTFNFOworI2VuZGlmCisgICAgc3RhdGljIGNoYXIgKihzcGVjX3N0cltdKSA9CisJeworCQkgICAgIiUiLAorI2RlZmluZSBTUEVDX1BFUkMgICAwCisJCSAgICAiIyIsCisjZGVmaW5lIFNQRUNfSEFTSCAgIDEKKwkJICAgICI8Y3dvcmQ+IiwJCS8qIGN1cnNvciB3b3JkICovCisjZGVmaW5lIFNQRUNfQ1dPUkQgIDIKKwkJICAgICI8Y1dPUkQ+IiwJCS8qIGN1cnNvciBXT1JEICovCisjZGVmaW5lIFNQRUNfQ0NXT1JEIDMKKwkJICAgICI8Y2ZpbGU+IiwJCS8qIGN1cnNvciBwYXRoIG5hbWUgKi8KKyNkZWZpbmUgU1BFQ19DRklMRSAgNAorCQkgICAgIjxzZmlsZT4iLAkJLyogIjpzbyIgZmlsZSBuYW1lICovCisjZGVmaW5lIFNQRUNfU0ZJTEUgIDUKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJICAgICI8YWZpbGU+IiwJCS8qIGF1dG9jb21tYW5kIGZpbGUgbmFtZSAqLworIyBkZWZpbmUgU1BFQ19BRklMRSA2CisJCSAgICAiPGFidWY+IiwJCS8qIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgKi8KKyMgZGVmaW5lIFNQRUNfQUJVRiAgNworCQkgICAgIjxhbWF0Y2g+IiwJCS8qIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgKi8KKyMgZGVmaW5lIFNQRUNfQU1BVENIIDgKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisJCSAgICAiPGNsaWVudD4iCisjIGRlZmluZSBTUEVDX0NMSUVOVCA5CisjZW5kaWYKKwkJfTsKKyNkZWZpbmUgU1BFQ19DT1VOVCAgKHNpemVvZihzcGVjX3N0cikgLyBzaXplb2YoY2hhciAqKSkKKworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKSB8fCBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKQorICAgIGNoYXJfdQlzdHJidWZbMzBdOworI2VuZGlmCisKKyAgICAqZXJyb3Jtc2cgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8uCisgICAgICovCisgICAgZm9yIChzcGVjX2lkeCA9IDA7IHNwZWNfaWR4IDwgU1BFQ19DT1VOVDsgKytzcGVjX2lkeCkKKyAgICB7CisJKnVzZWRsZW4gPSAoaW50KVNUUkxFTihzcGVjX3N0cltzcGVjX2lkeF0pOworCWlmIChTVFJOQ01QKHNyYywgc3BlY19zdHJbc3BlY19pZHhdLCAqdXNlZGxlbikgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzcGVjX2lkeCA9PSBTUEVDX0NPVU5UKQkgICAgLyogbm8gbWF0Y2ggKi8KKyAgICB7CisJKnVzZWRsZW4gPSAxOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogU2tpcCB3aGVuIHByZWNlZGVkIHdpdGggYSBiYWNrc2xhc2ggIlwlIiBhbmQgIlwjIi4KKyAgICAgKiBOb3RlOiBJbiAiXFwlIiB0aGUgJSBpcyBhbHNvIG5vdCByZWNvZ25pemVkIQorICAgICAqLworICAgIGlmIChzcmMgPiBzcmNzdGFydCAmJiBzcmNbLTFdID09ICdcXCcpCisgICAgeworCSp1c2VkbGVuID0gMDsKKwlTVFJDUFkoc3JjIC0gMSwgc3JjKTsJCS8qIHJlbW92ZSBiYWNrc2xhc2ggKi8KKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHdvcmQgb3IgV09SRCB1bmRlciBjdXJzb3IKKyAgICAgKi8KKyAgICBpZiAoc3BlY19pZHggPT0gU1BFQ19DV09SRCB8fCBzcGVjX2lkeCA9PSBTUEVDX0NDV09SRCkKKyAgICB7CisJcmVzdWx0bGVuID0gZmluZF9pZGVudF91bmRlcl9jdXJzb3IoJnJlc3VsdCwgc3BlY19pZHggPT0gU1BFQ19DV09SRCA/CisJCQkJICAgICAgKEZJTkRfSURFTlR8RklORF9TVFJJTkcpIDogRklORF9TVFJJTkcpOworCWlmIChyZXN1bHRsZW4gPT0gMCkKKwl7CisJICAgICplcnJvcm1zZyA9IChjaGFyX3UgKikiIjsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogJyMnOiBBbHRlcm5hdGUgZmlsZSBuYW1lCisgICAgICogJyUnOiBDdXJyZW50IGZpbGUgbmFtZQorICAgICAqCSAgICBGaWxlIG5hbWUgdW5kZXIgdGhlIGN1cnNvcgorICAgICAqCSAgICBGaWxlIG5hbWUgZm9yIGF1dG9jb21tYW5kCisgICAgICoJYW5kIGZvbGxvd2luZyBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBlbHNlCisgICAgeworCXN3aXRjaCAoc3BlY19pZHgpCisJeworCWNhc2UgU1BFQ19QRVJDOgkJLyogJyUnOiBjdXJyZW50IGZpbGUgKi8KKwkJaWYgKGN1cmJ1Zi0+Yl9mbmFtZSA9PSBOVUxMKQorCQl7CisJCSAgICByZXN1bHQgPSAoY2hhcl91ICopIiI7CisJCSAgICB2YWxpZCA9IDA7CSAgICAvKiBNdXN0IGhhdmUgIjpwOmgiIHRvIGJlIHZhbGlkICovCisJCX0KKwkJZWxzZQorI2lmZGVmIFJJU0NPUworCQkgICAgLyogQWx3YXlzIHVzZSB0aGUgZnVsbCBwYXRoIGZvciBSSVNDIE9TIGlmIHBvc3NpYmxlLiAqLworCQkgICAgcmVzdWx0ID0gY3VyYnVmLT5iX2ZmbmFtZTsKKwkJICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKwkJCXJlc3VsdCA9IGN1cmJ1Zi0+Yl9mbmFtZTsKKyNlbHNlCisJCSAgICByZXN1bHQgPSBjdXJidWYtPmJfZm5hbWU7CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIFNQRUNfSEFTSDoJCS8qICcjJyBvciAiIzk5IjogYWx0ZXJuYXRlIGZpbGUgKi8KKwkJaWYgKHNyY1sxXSA9PSAnIycpICAvKiAiIyMiOiB0aGUgYXJndW1lbnQgbGlzdCAqLworCQl7CisJCSAgICByZXN1bHQgPSBhcmdfYWxsKCk7CisJCSAgICByZXN1bHRidWYgPSByZXN1bHQ7CisJCSAgICAqdXNlZGxlbiA9IDI7CisjaWZkZWYgRkVBVF9NT0RJRllfRk5BTUUKKwkJICAgIHNraXBfbW9kID0gVFJVRTsKKyNlbmRpZgorCQkgICAgYnJlYWs7CisJCX0KKwkJcyA9IHNyYyArIDE7CisJCWkgPSAoaW50KWdldGRpZ2l0cygmcyk7CisJCSp1c2VkbGVuID0gKGludCkocyAtIHNyYyk7IC8qIGxlbmd0aCBvZiB3aGF0IHdlIGV4cGFuZCAqLworCisJCWJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKGkpOworCQlpZiAoYnVmID09IE5VTEwpCisJCXsKKwkJICAgICplcnJvcm1zZyA9IChjaGFyX3UgKilfKCJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIpOworCQkgICAgcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKGxudW1wICE9IE5VTEwpCisJCSAgICAqbG51bXAgPSBFQ01EX0xBU1Q7CisJCWlmIChidWYtPmJfZm5hbWUgPT0gTlVMTCkKKwkJeworCQkgICAgcmVzdWx0ID0gKGNoYXJfdSAqKSIiOworCQkgICAgdmFsaWQgPSAwOwkgICAgLyogTXVzdCBoYXZlICI6cDpoIiB0byBiZSB2YWxpZCAqLworCQl9CisJCWVsc2UKKwkJICAgIHJlc3VsdCA9IGJ1Zi0+Yl9mbmFtZTsKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKwljYXNlIFNQRUNfQ0ZJTEU6CS8qIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IgKi8KKwkJcmVzdWx0ID0gZmlsZV9uYW1lX2F0X2N1cnNvcihGTkFNRV9NRVNTfEZOQU1FX0hZUCwgMUwpOworCQlpZiAocmVzdWx0ID09IE5VTEwpCisJCXsKKwkJICAgICplcnJvcm1zZyA9IChjaGFyX3UgKikiIjsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCXJlc3VsdGJ1ZiA9IHJlc3VsdDsJICAgIC8qIHJlbWVtYmVyIGFsbG9jYXRlZCBzdHJpbmcgKi8KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWNhc2UgU1BFQ19BRklMRToJLyogZmlsZSBuYW1lIGZvciBhdXRvY29tbWFuZCAqLworCQlyZXN1bHQgPSBhdXRvY21kX2ZuYW1lOworCQlpZiAocmVzdWx0ID09IE5VTEwpCisJCXsKKwkJICAgICplcnJvcm1zZyA9IChjaGFyX3UgKilfKCJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTUEVDX0FCVUY6CQkvKiBidWZmZXIgbnVtYmVyIGZvciBhdXRvY29tbWFuZCAqLworCQlpZiAoYXV0b2NtZF9idWZuciA8PSAwKQorCQl7CisJCSAgICAqZXJyb3Jtc2cgPSAoY2hhcl91ICopXygiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIik7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQorCQlzcHJpbnRmKChjaGFyICopc3RyYnVmLCAiJWQiLCBhdXRvY21kX2J1Zm5yKTsKKwkJcmVzdWx0ID0gc3RyYnVmOworCQlicmVhazsKKworCWNhc2UgU1BFQ19BTUFUQ0g6CS8qIG1hdGNoIG5hbWUgZm9yIGF1dG9jb21tYW5kICovCisJCXJlc3VsdCA9IGF1dG9jbWRfbWF0Y2g7CisJCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJeworCQkgICAgKmVycm9ybXNnID0gKGNoYXJfdSAqKV8oIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIik7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKworI2VuZGlmCisJY2FzZSBTUEVDX1NGSUxFOgkvKiBmaWxlIG5hbWUgZm9yICI6c28iIGNvbW1hbmQgKi8KKwkJcmVzdWx0ID0gc291cmNpbmdfbmFtZTsKKwkJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQl7CisJCSAgICAqZXJyb3Jtc2cgPSAoY2hhcl91ICopXygiRTQ5ODogbm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworI2lmIGRlZmluZWQoRkVBVF9DTElFTlRTRVJWRVIpCisJY2FzZSBTUEVDX0NMSUVOVDoJLyogU291cmNlIG9mIGxhc3Qgc3VibWl0dGVkIGlucHV0ICovCisJCXNwcmludGYoKGNoYXIgKilzdHJidWYsICIweCV4IiwgKHVuc2lnbmVkIGludCljbGllbnRXaW5kb3cpOworCQlyZXN1bHQgPSBzdHJidWY7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJcmVzdWx0bGVuID0gKGludClTVFJMRU4ocmVzdWx0KTsJLyogbGVuZ3RoIG9mIG5ldyBzdHJpbmcgKi8KKwlpZiAoc3JjWyp1c2VkbGVuXSA9PSAnPCcpCS8qIHJlbW92ZSB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiAqLworCXsKKwkgICAgKysqdXNlZGxlbjsKKyNpZmRlZiBSSVNDT1MKKwkgICAgaWYgKChzID0gdmltX3N0cnJjaHIocmVzdWx0LCAnLycpKSAhPSBOVUxMICYmIHMgPj0gZ2V0dGFpbChyZXN1bHQpKQorI2Vsc2UKKwkgICAgaWYgKChzID0gdmltX3N0cnJjaHIocmVzdWx0LCAnLicpKSAhPSBOVUxMICYmIHMgPj0gZ2V0dGFpbChyZXN1bHQpKQorI2VuZGlmCisJCXJlc3VsdGxlbiA9IChpbnQpKHMgLSByZXN1bHQpOworCX0KKyNpZmRlZiBGRUFUX01PRElGWV9GTkFNRQorCWVsc2UgaWYgKCFza2lwX21vZCkKKwl7CisJICAgIHZhbGlkIHw9IG1vZGlmeV9mbmFtZShzcmMsIHVzZWRsZW4sICZyZXN1bHQsICZyZXN1bHRidWYsCisJCQkJCQkJCSAgJnJlc3VsdGxlbik7CisJICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKwkgICAgeworCQkqZXJyb3Jtc2cgPSAoY2hhcl91ICopIiI7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHJlc3VsdGxlbiA9PSAwIHx8IHZhbGlkICE9IFZBTElEX0hFQUQgKyBWQUxJRF9QQVRIKQorICAgIHsKKwlpZiAodmFsaWQgIT0gVkFMSURfSEVBRCArIFZBTElEX1BBVEgpCisJICAgIC8qIHhnZXR0ZXh0Om5vLWMtZm9ybWF0ICovCisJICAgICplcnJvcm1zZyA9IChjaGFyX3UgKilfKCJFNDk5OiBFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIpOworCWVsc2UKKwkgICAgKmVycm9ybXNnID0gKGNoYXJfdSAqKV8oIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciKTsKKwlyZXN1bHQgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisJcmVzdWx0ID0gdmltX3N0cm5zYXZlKHJlc3VsdCwgcmVzdWx0bGVuKTsKKyAgICB2aW1fZnJlZShyZXN1bHRidWYpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBDb25jYXRlbmF0ZSBhbGwgZmlsZXMgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGFuZCByZXR1cm4KKyAqIGl0IGluIG9uZSBhbGxvY2F0ZWQgc3RyaW5nLgorICogU3BhY2VzIGFuZCBiYWNrc2xhc2hlcyBpbiB0aGUgZmlsZSBuYW1lcyBhcmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLgorICogUmV0dXJucyBOVUxMIHdoZW4gb3V0IG9mIG1lbW9yeS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorYXJnX2FsbCgpCit7CisgICAgaW50CQlsZW47CisgICAgaW50CQlpZHg7CisgICAgY2hhcl91CSpyZXR2YWwgPSBOVUxMOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qCisgICAgICogRG8gdGhpcyBsb29wIHR3byB0aW1lczoKKyAgICAgKiBmaXJzdCB0aW1lOiBjb21wdXRlIHRoZSB0b3RhbCBsZW5ndGgKKyAgICAgKiBzZWNvbmQgdGltZTogY29uY2F0ZW5hdGUgdGhlIG5hbWVzCisgICAgICovCisgICAgZm9yICg7OykKKyAgICB7CisJbGVuID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSR0NPVU5UOyArK2lkeCkKKwl7CisJICAgIHAgPSBhbGlzdF9uYW1lKCZBUkdMSVNUW2lkeF0pOworCSAgICBpZiAocCAhPSBOVUxMKQorCSAgICB7CisJCWlmIChsZW4gPiAwKQorCQl7CisJCSAgICAvKiBpbnNlcnQgYSBzcGFjZSBpbiBiZXR3ZWVuIG5hbWVzICovCisJCSAgICBpZiAocmV0dmFsICE9IE5VTEwpCisJCQlyZXR2YWxbbGVuXSA9ICcgJzsKKwkJICAgICsrbGVuOworCQl9CisJCWZvciAoIDsgKnAgIT0gTlVMOyArK3ApCisJCXsKKwkJICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1xcJykKKwkJICAgIHsKKwkJCS8qIGluc2VydCBhIGJhY2tzbGFzaCAqLworCQkJaWYgKHJldHZhbCAhPSBOVUxMKQorCQkJICAgIHJldHZhbFtsZW5dID0gJ1xcJzsKKwkJCSsrbGVuOworCQkgICAgfQorCQkgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCQkJcmV0dmFsW2xlbl0gPSAqcDsKKwkJICAgICsrbGVuOworCQl9CisJICAgIH0KKwl9CisKKwkvKiBzZWNvbmQgdGltZTogYnJlYWsgaGVyZSAqLworCWlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICAgIHJldHZhbFtsZW5dID0gTlVMOworCSAgICBicmVhazsKKwl9CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKwlyZXR2YWwgPSBhbGxvYyhsZW4gKyAxKTsKKwlpZiAocmV0dmFsID09IE5VTEwpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBFeHBhbmQgdGhlIDxzZmlsZT4gc3RyaW5nIGluICJhcmciLgorICoKKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZywgb3IgTlVMTCBmb3IgYW55IGVycm9yLgorICovCisgICAgY2hhcl91ICoKK2V4cGFuZF9zZmlsZShhcmcpCisgICAgY2hhcl91CSphcmc7Cit7CisgICAgY2hhcl91CSplcnJvcm1zZzsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJKnJlc3VsdDsKKyAgICBjaGFyX3UJKm5ld3JlczsKKyAgICBjaGFyX3UJKnJlcGw7CisgICAgaW50CQlzcmNsZW47CisgICAgY2hhcl91CSpwOworCisgICAgcmVzdWx0ID0gdmltX3N0cnNhdmUoYXJnKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKHAgPSByZXN1bHQ7ICpwOyApCisgICAgeworCWlmIChTVFJOQ01QKHAsICI8c2ZpbGU+IiwgNykgIT0gMCkKKwkgICAgKytwOworCWVsc2UKKwl7CisJICAgIC8qIHJlcGxhY2UgIjxzZmlsZT4iIHdpdGggdGhlIHNvdXJjZWQgZmlsZSBuYW1lLCBhbmQgZG8gIjoiIHN0dWZmICovCisJICAgIHJlcGwgPSBldmFsX3ZhcnMocCwgJnNyY2xlbiwgTlVMTCwgJmVycm9ybXNnLCByZXN1bHQpOworCSAgICBpZiAoZXJyb3Jtc2cgIT0gTlVMTCkKKwkgICAgeworCQlpZiAoKmVycm9ybXNnKQorCQkgICAgZW1zZyhlcnJvcm1zZyk7CisJCXZpbV9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIGlmIChyZXBsID09IE5VTEwpCQkvKiBubyBtYXRjaCAoY2Fubm90IGhhcHBlbikgKi8KKwkgICAgeworCQlwICs9IHNyY2xlbjsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgbGVuID0gKGludClTVFJMRU4ocmVzdWx0KSAtIHNyY2xlbiArIChpbnQpU1RSTEVOKHJlcGwpICsgMTsKKwkgICAgbmV3cmVzID0gYWxsb2MobGVuKTsKKwkgICAgaWYgKG5ld3JlcyA9PSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHJlcGwpOworCQl2aW1fZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgICBtY2hfbWVtbW92ZShuZXdyZXMsIHJlc3VsdCwgKHNpemVfdCkocCAtIHJlc3VsdCkpOworCSAgICBTVFJDUFkobmV3cmVzICsgKHAgLSByZXN1bHQpLCByZXBsKTsKKwkgICAgbGVuID0gKGludClTVFJMRU4obmV3cmVzKTsKKwkgICAgU1RSQ0FUKG5ld3JlcywgcCArIHNyY2xlbik7CisJICAgIHZpbV9mcmVlKHJlcGwpOworCSAgICB2aW1fZnJlZShyZXN1bHQpOworCSAgICByZXN1bHQgPSBuZXdyZXM7CisJICAgIHAgPSBuZXdyZXMgKyBsZW47CQkvKiBjb250aW51ZSBhZnRlciB0aGUgbWF0Y2ggKi8KKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9TRVNTSU9OCitzdGF0aWMgaW50IHNlc193aW5zaXplcyBfX0FSR1MoKEZJTEUgKmZkLCBpbnQgcmVzdG9yZV9zaXplKSk7CitzdGF0aWMgaW50IHNlc193aW5fcmVjIF9fQVJHUygoRklMRSAqZmQsIGZyYW1lX1QgKmZyKSk7CitzdGF0aWMgZnJhbWVfVCAqc2VzX3NraXBmcmFtZSBfX0FSR1MoKGZyYW1lX1QgKmZyKSk7CitzdGF0aWMgaW50IHNlc19kb19mcmFtZSBfX0FSR1MoKGZyYW1lX1QgKmZyKSk7CitzdGF0aWMgaW50IHNlc19kb193aW4gX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyBpbnQgc2VzX2FyZ2xpc3QgX19BUkdTKChGSUxFICpmZCwgY2hhciAqY21kLCBnYXJyYXlfVCAqZ2FwLCBpbnQgZnVsbG5hbWUsIHVuc2lnbmVkICpmbGFncCkpOworc3RhdGljIGludCBzZXNfcHV0X2ZuYW1lIF9fQVJHUygoRklMRSAqZmQsIGNoYXJfdSAqbmFtZSwgdW5zaWduZWQgKmZsYWdwKSk7CitzdGF0aWMgaW50IHNlc19mbmFtZSBfX0FSR1MoKEZJTEUgKmZkLCBidWZfVCAqYnVmLCB1bnNpZ25lZCAqZmxhZ3ApKTsKKworLyoKKyAqIFdyaXRlIG9wZW5maWxlIGNvbW1hbmRzIGZvciB0aGUgY3VycmVudCBidWZmZXJzIHRvIGFuIC5leHJjIGZpbGUuCisgKiBSZXR1cm4gRkFJTCBvbiBlcnJvciwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGludAorbWFrZW9wZW5zKGZkLCBkaXJub3cpCisgICAgRklMRQkqZmQ7CisgICAgY2hhcl91CSpkaXJub3c7CS8qIEN1cnJlbnQgZGlyZWN0b3J5IG5hbWUgKi8KK3sKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJb25seV9zYXZlX3dpbmRvd3MgPSBUUlVFOworICAgIGludAkJbnI7CisgICAgaW50CQljbnIgPSAxOworICAgIGludAkJcmVzdG9yZV9zaXplID0gVFJVRTsKKyAgICB3aW5fVAkqd3A7CisgICAgY2hhcl91CSpzbmFtZTsKKyAgICB3aW5fVAkqZWRpdGVkX3dpbiA9IE5VTEw7CisKKyAgICBpZiAoc3NvcF9mbGFncyAmIFNTT1BfQlVGRkVSUykKKwlvbmx5X3NhdmVfd2luZG93cyA9IEZBTFNFOwkJLyogU2F2ZSBBTEwgYnVmZmVycyAqLworCisgICAgLyoKKyAgICAgKiBCZWdpbiBieSBzZXR0aW5nIHRoZSB0aGlzX3Nlc3Npb24gdmFyaWFibGUsIGFuZCB0aGVuIG90aGVyCisgICAgICogc2Vzc2lvbmFibGUgdmFyaWFibGVzLgorICAgICAqLworI2lmZGVmIEZFQVRfRVZBTAorICAgIGlmIChwdXRfbGluZShmZCwgImxldCB2OnRoaXNfc2Vzc2lvbj1leHBhbmQoXCI8c2ZpbGU+OnBcIikiKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworICAgIGlmIChzc29wX2ZsYWdzICYgU1NPUF9HTE9CQUxTKQorCWlmIChzdG9yZV9zZXNzaW9uX2dsb2JhbHMoZmQpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENsb3NlIGFsbCB3aW5kb3dzIGJ1dCBvbmUuCisgICAgICovCisgICAgaWYgKHB1dF9saW5lKGZkLCAic2lsZW50IG9ubHkiKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBOb3cgYSA6Y2QgY29tbWFuZCB0byB0aGUgc2Vzc2lvbiBkaXJlY3Rvcnkgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICovCisgICAgaWYgKHNzb3BfZmxhZ3MgJiBTU09QX1NFU0RJUikKKyAgICB7CisJaWYgKHB1dF9saW5lKGZkLCAiZXhlIFwiY2QgXCIgLiBleHBhbmQoXCI8c2ZpbGU+OnA6aFwiKSIpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKyAgICBlbHNlIGlmIChzc29wX2ZsYWdzICYgU1NPUF9DVVJESVIpCisgICAgeworCXNuYW1lID0gaG9tZV9yZXBsYWNlX3NhdmUoTlVMTCwgZ2xvYmFsZGlyICE9IE5VTEwgPyBnbG9iYWxkaXIgOiBkaXJub3cpOworCWlmIChzbmFtZSA9PSBOVUxMCisJCXx8IGZwcmludGYoZmQsICJjZCAlcyIsIHNuYW1lKSA8IDAgfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJdmltX2ZyZWUoc25hbWUpOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHNhdmUgdGhlIGN1cnJlbnQgZmlsZXMsIGN1cnJlbnQgYnVmZmVyIGZpcnN0LgorICAgICAqLworICAgIGlmIChwdXRfbGluZShmZCwgInNldCBzaG9ydG1lc3M9YW9PIikgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qIE5vdyBwdXQgdGhlIG90aGVyIGJ1ZmZlcnMgaW50byB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisgICAgeworCWlmICghKG9ubHlfc2F2ZV93aW5kb3dzICYmIGJ1Zi0+Yl9ud2luZG93cyA9PSAwKQorCQkmJiAhKGJ1Zi0+Yl9oZWxwICYmICEoc3NvcF9mbGFncyAmIFNTT1BfSEVMUCkpCisJCSYmIGJ1Zi0+Yl9mbmFtZSAhPSBOVUxMCisJCSYmIGJ1Zi0+Yl9wX2JsKQorCXsKKwkgICAgaWYgKGZwcmludGYoZmQsICJiYWRkICslbGQgIiwgYnVmLT5iX3dpbmluZm8gPT0gTlVMTCA/IDFMCisJCQkJCSAgIDogYnVmLT5iX3dpbmluZm8tPndpX2Zwb3MubG51bSkgPCAwCisJCSAgICB8fCBzZXNfZm5hbWUoZmQsIGJ1ZiwgJnNzb3BfZmxhZ3MpID09IEZBSUwpCisJCXJldHVybiBGQUlMOworCX0KKyAgICB9CisKKyAgICAvKiB0aGUgZ2xvYmFsIGFyZ3VtZW50IGxpc3QgKi8KKyAgICBpZiAoc2VzX2FyZ2xpc3QoZmQsICJhcmdzIiwgJmdsb2JhbF9hbGlzdC5hbF9nYSwKKwkJCSAgICAhKHNzb3BfZmxhZ3MgJiBTU09QX0NVUkRJUiksICZzc29wX2ZsYWdzKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgaWYgKHNzb3BfZmxhZ3MgJiBTU09QX1JFU0laRSkKKyAgICB7CisJLyogTm90ZTogYWZ0ZXIgdGhlIHJlc3RvcmUgd2Ugc3RpbGwgY2hlY2sgaXQgd29ya2VkISovCisJaWYgKGZwcmludGYoZmQsICJzZXQgbGluZXM9JWxkIGNvbHVtbnM9JWxkIiAsIFJvd3MsIENvbHVtbnMpIDwgMAorCQl8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlICYmIChzc29wX2ZsYWdzICYgU1NPUF9XSU5QT1MpKQorICAgIHsKKwlpbnQJeCwgeTsKKworCWlmIChndWlfbWNoX2dldF93aW5wb3MoJngsICZ5KSA9PSBPSykKKwl7CisJICAgIC8qIE5vdGU6IGFmdGVyIHRoZSByZXN0b3JlIHdlIHN0aWxsIGNoZWNrIGl0IHdvcmtlZCEqLworCSAgICBpZiAoZnByaW50ZihmZCwgIndpbnBvcyAlZCAlZCIsIHgsIHkpIDwgMCB8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEJlZm9yZSBjcmVhdGluZyB0aGUgd2luZG93IGxheW91dCwgdHJ5IGxvYWRpbmcgb25lIGZpbGUuICBJZiB0aGlzIGlzCisgICAgICogYWJvcnRlZCB3ZSBkb24ndCBlbmQgdXAgd2l0aCBhIG51bWJlciBvZiB1c2VsZXNzIHdpbmRvd3MuCisgICAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMhIChlLmcuLCBjb21wcmVzc2VkIG9yIG5ldHdvcmsgZmlsZSkuCisgICAgICovCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisgICAgeworCWlmIChzZXNfZG9fd2luKHdwKQorCQkmJiB3cC0+d19idWZmZXItPmJfZmZuYW1lICE9IE5VTEwKKwkJJiYgIXdwLT53X2J1ZmZlci0+Yl9oZWxwCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCQkmJiAhYnRfbm9maWxlKHdwLT53X2J1ZmZlcikKKyNlbmRpZgorCQkpCisJeworCSAgICBpZiAoZnB1dHMoImVkaXQgIiwgZmQpIDwgMAorCQkgICAgfHwgc2VzX2ZuYW1lKGZkLCB3cC0+d19idWZmZXIsICZzc29wX2ZsYWdzKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwkgICAgaWYgKCF3cC0+d19hcmdfaWR4X2ludmFsaWQpCisJCWVkaXRlZF93aW4gPSB3cDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBjdXJyZW50IHdpbmRvdyBsYXlvdXQuCisgICAgICovCisgICAgaWYgKHB1dF9saW5lKGZkLCAic2V0IHNwbGl0YmVsb3cgc3BsaXRyaWdodCIpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisgICAgaWYgKHNlc193aW5fcmVjKGZkLCB0b3BmcmFtZSkgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKyAgICBpZiAoIXBfc2IgJiYgcHV0X2xpbmUoZmQsICJzZXQgbm9zcGxpdGJlbG93IikgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKyAgICBpZiAoIXBfc3ByICYmIHB1dF9saW5lKGZkLCAic2V0IG5vc3BsaXRyaWdodCIpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHdpbmRvdyBzaXplcyBjYW4gYmUgcmVzdG9yZWQgKG5vIHdpbmRvd3Mgb21pdHRlZCkuCisgICAgICogUmVtZW1iZXIgdGhlIHdpbmRvdyBudW1iZXIgb2YgdGhlIGN1cnJlbnQgd2luZG93IGFmdGVyIHJlc3RvcmluZy4KKyAgICAgKi8KKyAgICBuciA9IDA7CisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IFdfTkVYVCh3cCkpCisgICAgeworCWlmIChzZXNfZG9fd2luKHdwKSkKKwkgICAgKytucjsKKwllbHNlCisJICAgIHJlc3RvcmVfc2l6ZSA9IEZBTFNFOworCWlmIChjdXJ3aW4gPT0gd3ApCisJICAgIGNuciA9IG5yOworICAgIH0KKworICAgIC8qIEdvIHRvIHRoZSBmaXJzdCB3aW5kb3cuICovCisgICAgaWYgKHB1dF9saW5lKGZkLCAid2luY21kIHQiKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBJZiBtb3JlIHRoYW4gb25lIHdpbmRvdywgc2VlIGlmIHNpemVzIGNhbiBiZSByZXN0b3JlZC4KKyAgICAgKiBGaXJzdCBzZXQgJ3dpbmhlaWdodCcgYW5kICd3aW53aWR0aCcgdG8gMSB0byBhdm9pZCB0aGUgd2luZG93cyBiZWluZworICAgICAqIHJlc2l6ZWQgd2hlbiBtb3ZpbmcgYmV0d2VlbiB3aW5kb3dzLgorICAgICAqIERvIHRoaXMgYmVmb3JlIHJlc3RvcmluZyB0aGUgdmlldywgc28gdGhhdCB0aGUgdG9wbGluZSBhbmQgdGhlIGN1cnNvcgorICAgICAqIGNhbiBiZSBzZXQuICBUaGlzIGlzIGRvbmUgYWdhaW4gYmVsb3cuCisgICAgICovCisgICAgaWYgKHB1dF9saW5lKGZkLCAic2V0IHdpbmhlaWdodD0xIHdpbndpZHRoPTEiKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworICAgIGlmIChuciA+IDEgJiYgc2VzX3dpbnNpemVzKGZkLCByZXN0b3JlX3NpemUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIHZpZXcgb2YgdGhlIHdpbmRvdyAob3B0aW9ucywgZmlsZSwgY3Vyc29yLCBldGMuKS4KKyAgICAgKi8KKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKyAgICB7CisJaWYgKCFzZXNfZG9fd2luKHdwKSkKKwkgICAgY29udGludWU7CisJaWYgKHB1dF92aWV3KGZkLCB3cCwgd3AgIT0gZWRpdGVkX3dpbiwgJnNzb3BfZmxhZ3MpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworCWlmIChuciA+IDEgJiYgcHV0X2xpbmUoZmQsICJ3aW5jbWQgdyIpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzdG9yZSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgd2luZG93IGlmIGl0J3Mgbm90IHRoZSBmaXJzdCBvbmUuCisgICAgICovCisgICAgaWYgKGNuciA+IDEgJiYgKGZwcmludGYoZmQsICIlZHdpbmNtZCB3IiwgY25yKSA8IDAgfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgd2luZG93IHNpemVzIGFnYWluIGFmdGVyIGp1bXBpbmcgYXJvdW5kIGluIHdpbmRvd3MsIGJlY2F1c2UgdGhlCisgICAgICogY3VycmVudCB3aW5kb3cgaGFzIGEgbWluaW11bSBzaXplIHdoaWxlIG90aGVycyBtYXkgbm90LgorICAgICAqLworICAgIGlmIChuciA+IDEgJiYgc2VzX3dpbnNpemVzKGZkLCByZXN0b3JlX3NpemUpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKiBSZS1hcHBseSAnd2luaGVpZ2h0JywgJ3dpbndpZHRoJyBhbmQgJ3Nob3J0bWVzcycuICovCisgICAgaWYgKGZwcmludGYoZmQsICJzZXQgd2luaGVpZ2h0PSVsZCB3aW53aWR0aD0lbGQgc2hvcnRtZXNzPSVzIiwKKwkJCSAgICAgICBwX3doLCBwX3dpdywgcF9zaG0pIDwgMCB8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBMYXN0bHksIGV4ZWN1dGUgdGhlIHgudmltIGZpbGUgaWYgaXQgZXhpc3RzLgorICAgICAqLworICAgIGlmIChwdXRfbGluZShmZCwgImxldCBzOnN4ID0gZXhwYW5kKFwiPHNmaWxlPjpwOnJcIikuXCJ4LnZpbVwiIikgPT0gRkFJTAorCSAgICB8fCBwdXRfbGluZShmZCwgImlmIGZpbGVfcmVhZGFibGUoczpzeCkiKSA9PSBGQUlMCisJICAgIHx8IHB1dF9saW5lKGZkLCAiICBleGUgXCJzb3VyY2UgXCIgLiBzOnN4IikgPT0gRkFJTAorCSAgICB8fCBwdXRfbGluZShmZCwgImVuZGlmIikgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIHJldHVybiBPSzsKK30KKworICAgIHN0YXRpYyBpbnQKK3Nlc193aW5zaXplcyhmZCwgcmVzdG9yZV9zaXplKQorICAgIEZJTEUJKmZkOworICAgIGludAkJcmVzdG9yZV9zaXplOworeworICAgIGludAkJbiA9IDA7CisgICAgd2luX1QJKndwOworCisgICAgaWYgKHJlc3RvcmVfc2l6ZSAmJiAoc3NvcF9mbGFncyAmIFNTT1BfV0lOU0laRSkpCisgICAgeworCWZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCXsKKwkgICAgaWYgKCFzZXNfZG9fd2luKHdwKSkKKwkJY29udGludWU7CisJICAgICsrbjsKKworCSAgICAvKiByZXN0b3JlIGhlaWdodCB3aGVuIG5vdCBmdWxsIGhlaWdodCAqLworCSAgICBpZiAod3AtPndfaGVpZ2h0ICsgd3AtPndfc3RhdHVzX2hlaWdodCA8IHRvcGZyYW1lLT5mcl9oZWlnaHQKKwkJICAgICYmIChmcHJpbnRmKGZkLAorCQkJICAiZXhlICclZHJlc2l6ZSAnIC4gKCgmbGluZXMgKiAlbGQgKyAlbGQpIC8gJWxkKSIsCisJCQkgICAgbiwgKGxvbmcpd3AtPndfaGVpZ2h0LCBSb3dzIC8gMiwgUm93cykgPCAwCisJCQkJCQkgIHx8IHB1dF9lb2woZmQpID09IEZBSUwpKQorCQlyZXR1cm4gRkFJTDsKKworCSAgICAvKiByZXN0b3JlIHdpZHRoIHdoZW4gbm90IGZ1bGwgd2lkdGggKi8KKwkgICAgaWYgKHdwLT53X3dpZHRoIDwgQ29sdW1ucyAmJiAoZnByaW50ZihmZCwKKwkJICAgImV4ZSAndmVydCAlZHJlc2l6ZSAnIC4gKCgmY29sdW1ucyAqICVsZCArICVsZCkgLyAlbGQpIiwKKwkJCSAgICBuLCAobG9uZyl3cC0+d193aWR0aCwgQ29sdW1ucyAvIDIsIENvbHVtbnMpIDwgMAorCQkJCQkJICB8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKSkKKwkJcmV0dXJuIEZBSUw7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIEp1c3QgZXF1YWxpc2Ugd2luZG93IHNpemVzICovCisJaWYgKHB1dF9saW5lKGZkLCAid2luY21kID0iKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogV3JpdGUgY29tbWFuZHMgdG8gImZkIiB0byByZWN1cnNpdmVseSBjcmVhdGUgd2luZG93cyBmb3IgZnJhbWUgImZyIiwKKyAqIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseSBzcGxpdC4KKyAqIEFmdGVyIHRoZSBjb21tYW5kcyB0aGUgbGFzdCB3aW5kb3cgaW4gdGhlIGZyYW1lIGlzIHRoZSBjdXJyZW50IHdpbmRvdy4KKyAqIFJldHVybnMgRkFJTCB3aGVuIHdyaXRpbmcgdGhlIGNvbW1hbmRzIHRvICJmZCIgZmFpbHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitzZXNfd2luX3JlYyhmZCwgZnIpCisgICAgRklMRQkqZmQ7CisgICAgZnJhbWVfVAkqZnI7Cit7CisgICAgZnJhbWVfVAkqZnJjOworICAgIGludAkJY291bnQgPSAwOworCisgICAgaWYgKGZyLT5mcl9sYXlvdXQgIT0gRlJfTEVBRikKKyAgICB7CisJLyogRmluZCBmaXJzdCBmcmFtZSB0aGF0J3Mgbm90IHNraXBwZWQgYW5kIHRoZW4gY3JlYXRlIGEgd2luZG93IGZvcgorCSAqIGVhY2ggZm9sbG93aW5nIG9uZSAoZmlyc3QgZnJhbWUgaXMgYWxyZWFkeSB0aGVyZSkuICovCisJZnJjID0gc2VzX3NraXBmcmFtZShmci0+ZnJfY2hpbGQpOworCWlmIChmcmMgIT0gTlVMTCkKKwkgICAgd2hpbGUgKChmcmMgPSBzZXNfc2tpcGZyYW1lKGZyYy0+ZnJfbmV4dCkpICE9IE5VTEwpCisJICAgIHsKKwkJLyogTWFrZSB3aW5kb3cgYXMgYmlnIGFzIHBvc3NpYmxlIHNvIHRoYXQgd2UgaGF2ZSBsb3RzIG9mIHJvb20KKwkJICogdG8gc3BsaXQuICovCisJCWlmIChwdXRfbGluZShmZCwgIndpbmNtZCBfIHwgd2luY21kIHwiKSA9PSBGQUlMCisJCQl8fCBwdXRfbGluZShmZCwgZnItPmZyX2xheW91dCA9PSBGUl9DT0wKKwkJCQkJCT8gInNwbGl0IiA6ICJ2c3BsaXQiKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJCSsrY291bnQ7CisJICAgIH0KKworCS8qIEdvIGJhY2sgdG8gdGhlIGZpcnN0IHdpbmRvdy4gKi8KKwlpZiAoY291bnQgPiAwICYmIChmcHJpbnRmKGZkLCBmci0+ZnJfbGF5b3V0ID09IEZSX0NPTAorCQkJPyAiJWR3aW5jbWQgayIgOiAiJWR3aW5jbWQgaCIsIGNvdW50KSA8IDAKKwkJCQkJCSAgICAgIHx8IHB1dF9lb2woZmQpID09IEZBSUwpKQorCSAgICByZXR1cm4gRkFJTDsKKworCS8qIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBmcmFtZXMvd2luZG93cyBpbiBlYWNoIHdpbmRvdyBvZiB0aGlzIGNvbHVtbiBvcgorCSAqIHJvdy4gKi8KKwlmcmMgPSBzZXNfc2tpcGZyYW1lKGZyLT5mcl9jaGlsZCk7CisJd2hpbGUgKGZyYyAhPSBOVUxMKQorCXsKKwkgICAgc2VzX3dpbl9yZWMoZmQsIGZyYyk7CisJICAgIGZyYyA9IHNlc19za2lwZnJhbWUoZnJjLT5mcl9uZXh0KTsKKwkgICAgLyogR28gdG8gbmV4dCB3aW5kb3cuICovCisJICAgIGlmIChmcmMgIT0gTlVMTCAmJiBwdXRfbGluZShmZCwgIndpbmNtZCB3IikgPT0gRkFJTCkKKwkJcmV0dXJuIEZBSUw7CisJfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTa2lwIGZyYW1lcyB0aGF0IGRvbid0IGNvbnRhaW4gd2luZG93cyB3ZSB3YW50IHRvIHNhdmUgaW4gdGhlIFNlc3Npb24uCisgKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGVyZSBub25lLgorICovCisgICAgc3RhdGljIGZyYW1lX1QgKgorc2VzX3NraXBmcmFtZShmcikKKyAgICBmcmFtZV9UCSpmcjsKK3sKKyAgICBmcmFtZV9UCSpmcmM7CisKKyAgICBmb3IgKGZyYyA9IGZyOyBmcmMgIT0gTlVMTDsgZnJjID0gZnJjLT5mcl9uZXh0KQorCWlmIChzZXNfZG9fZnJhbWUoZnJjKSkKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGZyYzsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGZyYW1lICJmciIgaGFzIGEgd2luZG93IHNvbWV3aGVyZSB0aGF0IHdlIHdhbnQgdG8gc2F2ZSBpbgorICogdGhlIFNlc3Npb24uCisgKi8KKyAgICBzdGF0aWMgaW50CitzZXNfZG9fZnJhbWUoZnIpCisgICAgZnJhbWVfVAkqZnI7Cit7CisgICAgZnJhbWVfVAkqZnJjOworCisgICAgaWYgKGZyLT5mcl9sYXlvdXQgPT0gRlJfTEVBRikKKwlyZXR1cm4gc2VzX2RvX3dpbihmci0+ZnJfd2luKTsKKyAgICBmb3IgKGZyYyA9IGZyLT5mcl9jaGlsZDsgZnJjICE9IE5VTEw7IGZyYyA9IGZyYy0+ZnJfbmV4dCkKKwlpZiAoc2VzX2RvX2ZyYW1lKGZyYykpCisJICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFJldHVybiBub24temVybyBpZiB3aW5kb3cgIndwIiBpcyB0byBiZSBzdG9yZWQgaW4gdGhlIFNlc3Npb24uCisgKi8KKyAgICBzdGF0aWMgaW50CitzZXNfZG9fd2luKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBpZiAod3AtPndfYnVmZmVyLT5iX2ZuYW1lID09IE5VTEwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJICAgIC8qIFdoZW4gJ2J1ZnR5cGUnIGlzICJub2ZpbGUiIGNhbid0IHJlc3RvcmUgdGhlIHdpbmRvdyBjb250ZW50cy4gKi8KKwkgICAgfHwgYnRfbm9maWxlKHdwLT53X2J1ZmZlcikKKyNlbmRpZgorICAgICAgICkKKwlyZXR1cm4gKHNzb3BfZmxhZ3MgJiBTU09QX0JMQU5LKTsKKyAgICBpZiAod3AtPndfYnVmZmVyLT5iX2hlbHApCisJcmV0dXJuIChzc29wX2ZsYWdzICYgU1NPUF9IRUxQKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFdyaXRlIGNvbW1hbmRzIHRvICJmZCIgdG8gcmVzdG9yZSB0aGUgdmlldyBvZiBhIHdpbmRvdy4KKyAqIENhbGxlciBtdXN0IG1ha2Ugc3VyZSAnc2Nyb2xsb2ZmJyBpcyB6ZXJvLgorICovCisgICAgc3RhdGljIGludAorcHV0X3ZpZXcoZmQsIHdwLCBhZGRfZWRpdCwgZmxhZ3ApCisgICAgRklMRQkqZmQ7CisgICAgd2luX1QJKndwOworICAgIGludAkJYWRkX2VkaXQ7CS8qIGFkZCAiOmVkaXQiIGNvbW1hbmQgdG8gdmlldyAqLworICAgIHVuc2lnbmVkCSpmbGFncDsJCS8qIHZvcF9mbGFncyBvciBzc29wX2ZsYWdzICovCit7CisgICAgd2luX1QJKnNhdmVfY3Vyd2luOworICAgIGludAkJZjsKKyAgICBpbnQJCWRvX2N1cnNvcjsKKworICAgIC8qIEFsd2F5cyByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiBmb3IgIjpta3Nlc3Npb24iLiAgRm9yICI6bWt2aWV3IiBvbmx5CisgICAgICogd2hlbiAndmlld29wdGlvbnMnIGNvbnRhaW5zICJjdXJzb3IiLiAqLworICAgIGRvX2N1cnNvciA9IChmbGFncCA9PSAmc3NvcF9mbGFncyB8fCAqZmxhZ3AgJiBTU09QX0NVUlNPUik7CisKKyAgICAvKgorICAgICAqIExvY2FsIGFyZ3VtZW50IGxpc3QuCisgICAgICovCisgICAgaWYgKHdwLT53X2FsaXN0ID09ICZnbG9iYWxfYWxpc3QpCisgICAgeworCWlmIChwdXRfbGluZShmZCwgImFyZ2dsb2JhbCIpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChzZXNfYXJnbGlzdChmZCwgImFyZ2xvY2FsIiwgJndwLT53X2FsaXN0LT5hbF9nYSwKKwkJCWZsYWdwID09ICZ2b3BfZmxhZ3MKKwkJCXx8ICEoKmZsYWdwICYgU1NPUF9DVVJESVIpCisJCQl8fCB3cC0+d19sb2NhbGRpciAhPSBOVUxMLCBmbGFncCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyogT25seSB3aGVuIHBhcnQgb2YgYSBzZXNzaW9uOiByZXN0b3JlIHRoZSBhcmd1bWVudCBpbmRleC4gKi8KKyAgICBpZiAod3AtPndfYXJnX2lkeCAhPSAwICYmIGZsYWdwID09ICZzc29wX2ZsYWdzKQorICAgIHsKKwlpZiAoZnByaW50ZihmZCwgIiVsZG5leHQiLCAobG9uZyl3cC0+d19hcmdfaWR4KSA8IDAKKwkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyogRWRpdCB0aGUgZmlsZS4gIFNraXAgdGhpcyB3aGVuICI6bmV4dCIgYWxyZWFkeSBkaWQgaXQuICovCisgICAgaWYgKGFkZF9lZGl0ICYmICh3cC0+d19hcmdfaWR4ID09IDAgfHwgZmxhZ3AgIT0gJnNzb3BfZmxhZ3MKKwkJCQkJCSAgICB8fCB3cC0+d19hcmdfaWR4X2ludmFsaWQpKQorICAgIHsKKwkvKgorCSAqIExvYWQgdGhlIGZpbGUuCisJICovCisJaWYgKHdwLT53X2J1ZmZlci0+Yl9mZm5hbWUgIT0gTlVMTAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJJiYgIWJ0X25vZmlsZSh3cC0+d19idWZmZXIpCisjZW5kaWYKKwkJKQorCXsKKwkgICAgLyoKKwkgICAgICogRWRpdGluZyBhIGZpbGUgaW4gdGhpcyBidWZmZXI6IHVzZSAiOmVkaXQgZmlsZSIuCisJICAgICAqIFRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzISAoZS5nLiwgY29tcHJlc3NlZCBvciBuZXR3b3JrIGZpbGUpLgorCSAgICAgKi8KKwkgICAgaWYgKGZwdXRzKCJlZGl0ICIsIGZkKSA8IDAKKwkJICAgIHx8IHNlc19mbmFtZShmZCwgd3AtPndfYnVmZmVyLCBmbGFncCkgPT0gRkFJTCkKKwkJcmV0dXJuIEZBSUw7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIE5vIGZpbGUgaW4gdGhpcyBidWZmZXIsIGp1c3QgbWFrZSBpdCBlbXB0eS4gKi8KKwkgICAgaWYgKHB1dF9saW5lKGZkLCAiZW5ldyIpID09IEZBSUwpCisJCXJldHVybiBGQUlMOworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkgICAgaWYgKHdwLT53X2J1ZmZlci0+Yl9mZm5hbWUgIT0gTlVMTCkKKwkgICAgeworCQkvKiBUaGUgYnVmZmVyIGRvZXMgaGF2ZSBhIG5hbWUsIGJ1dCBpdCdzIG5vdCBhIGZpbGUgbmFtZS4gKi8KKwkJaWYgKGZwdXRzKCJmaWxlICIsIGZkKSA8IDAKKwkJCXx8IHNlc19mbmFtZShmZCwgd3AtPndfYnVmZmVyLCBmbGFncCkgPT0gRkFJTCkKKwkJICAgIHJldHVybiBGQUlMOworCSAgICB9CisjZW5kaWYKKwkgICAgZG9fY3Vyc29yID0gRkFMU0U7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogTG9jYWwgbWFwcGluZ3MgYW5kIGFiYnJldmlhdGlvbnMuCisgICAgICovCisgICAgaWYgKCgqZmxhZ3AgJiAoU1NPUF9PUFRJT05TIHwgU1NPUF9MT0NBTE9QVElPTlMpKQorCQkJCQkgJiYgbWFrZW1hcChmZCwgd3AtPndfYnVmZmVyKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBMb2NhbCBvcHRpb25zLiAgTmVlZCB0byBnbyB0byB0aGUgd2luZG93IHRlbXBvcmFyaWx5LgorICAgICAqIFN0b3JlIG9ubHkgbG9jYWwgdmFsdWVzIHdoZW4gdXNpbmcgIjpta3ZpZXciIGFuZCB3aGVuICI6bWtzZXNzaW9uIiBpcworICAgICAqIHVzZWQgYW5kICdzZXNzaW9ub3B0aW9ucycgZG9lc24ndCBpbmNsdWRlICJvcHRpb25zIi4KKyAgICAgKiBTb21lIGZvbGRpbmcgb3B0aW9ucyBhcmUgYWx3YXlzIHN0b3JlZCB3aGVuICJmb2xkcyIgaXMgaW5jbHVkZWQsCisgICAgICogb3RoZXJ3aXNlIHRoZSBmb2xkcyB3b3VsZCBub3QgYmUgcmVzdG9yZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIHNhdmVfY3Vyd2luID0gY3Vyd2luOworICAgIGN1cndpbiA9IHdwOworICAgIGN1cmJ1ZiA9IGN1cndpbi0+d19idWZmZXI7CisgICAgaWYgKCpmbGFncCAmIChTU09QX09QVElPTlMgfCBTU09QX0xPQ0FMT1BUSU9OUykpCisJZiA9IG1ha2VzZXQoZmQsIE9QVF9MT0NBTCwKKwkJCSAgICAgZmxhZ3AgPT0gJnZvcF9mbGFncyB8fCAhKCpmbGFncCAmIFNTT1BfT1BUSU9OUykpOworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGVsc2UgaWYgKCpmbGFncCAmIFNTT1BfRk9MRFMpCisJZiA9IG1ha2Vmb2xkc2V0KGZkKTsKKyNlbmRpZgorICAgIGVsc2UKKwlmID0gT0s7CisgICAgY3Vyd2luID0gc2F2ZV9jdXJ3aW47CisgICAgY3VyYnVmID0gY3Vyd2luLT53X2J1ZmZlcjsKKyAgICBpZiAoZiA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyoKKyAgICAgKiBTYXZlIEZvbGRzIHdoZW4gJ2J1ZnR5cGUnIGlzIGVtcHR5IGFuZCBmb3IgaGVscCBmaWxlcy4KKyAgICAgKi8KKyAgICBpZiAoKCpmbGFncCAmIFNTT1BfRk9MRFMpCisJICAgICYmIHdwLT53X2J1ZmZlci0+Yl9mZm5hbWUgIT0gTlVMTAorCSAgICAmJiAoKndwLT53X2J1ZmZlci0+Yl9wX2J0ID09IE5VTCB8fCB3cC0+d19idWZmZXItPmJfaGVscCkpCisgICAgeworCWlmIChwdXRfZm9sZHMoZmQsIHdwKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjdXJzb3IgYWZ0ZXIgY3JlYXRpbmcgZm9sZHMsIHNpbmNlIHRoYXQgbW92ZXMgdGhlIGN1cnNvci4KKyAgICAgKi8KKyAgICBpZiAoZG9fY3Vyc29yKQorICAgIHsKKworCS8qIFJlc3RvcmUgdGhlIGN1cnNvciBsaW5lIGluIHRoZSBmaWxlIGFuZCByZWxhdGl2ZWx5IGluIHRoZQorCSAqIHdpbmRvdy4gIERvbid0IHVzZSAiRyIsIGl0IGNoYW5nZXMgdGhlIGp1bXBsaXN0LiAqLworCWlmIChmcHJpbnRmKGZkLCAibGV0IHM6bCA9ICVsZCAtICgoJWxkICogd2luaGVpZ2h0KDApICsgJWxkKSAvICVsZCkiLAorCQkgICAgKGxvbmcpd3AtPndfY3Vyc29yLmxudW0sCisJCSAgICAobG9uZykod3AtPndfY3Vyc29yLmxudW0gLSB3cC0+d190b3BsaW5lKSwKKwkJICAgIChsb25nKXdwLT53X2hlaWdodCAvIDIsIChsb25nKXdwLT53X2hlaWdodCkgPCAwCisJCXx8IHB1dF9lb2woZmQpID09IEZBSUwKKwkJfHwgcHV0X2xpbmUoZmQsICJpZiBzOmwgPCAxIHwgbGV0IHM6bCA9IDEgfCBlbmRpZiIpID09IEZBSUwKKwkJfHwgcHV0X2xpbmUoZmQsICJleGUgczpsIikgPT0gRkFJTAorCQl8fCBwdXRfbGluZShmZCwgIm5vcm1hbCEgenQiKSA9PSBGQUlMCisJCXx8IGZwcmludGYoZmQsICIlbGQiLCAobG9uZyl3cC0+d19jdXJzb3IubG51bSkgPCAwCisJCXx8IHB1dF9lb2woZmQpID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworCS8qIFJlc3RvcmUgdGhlIGN1cnNvciBjb2x1bW4gYW5kIGxlZnQgb2Zmc2V0IHdoZW4gbm90IHdyYXBwaW5nLiAqLworCWlmICh3cC0+d19jdXJzb3IuY29sID09IDApCisJeworCSAgICBpZiAocHV0X2xpbmUoZmQsICJub3JtYWwhIDAiKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKCF3cC0+d19wX3dyYXAgJiYgd3AtPndfbGVmdGNvbCA+IDAgJiYgd3AtPndfd2lkdGggPiAwKQorCSAgICB7CisJCWlmIChmcHJpbnRmKGZkLAorCQkJICAibGV0IHM6YyA9ICVsZCAtICgoJWxkICogd2lud2lkdGgoMCkgKyAlbGQpIC8gJWxkKSIsCisJCQkgICAgKGxvbmcpd3AtPndfY3Vyc29yLmNvbCwKKwkJCSAgICAobG9uZykod3AtPndfY3Vyc29yLmNvbCAtIHdwLT53X2xlZnRjb2wpLAorCQkJICAgIChsb25nKXdwLT53X3dpZHRoIC8gMiwgKGxvbmcpd3AtPndfd2lkdGgpIDwgMAorCQkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTAorCQkJfHwgcHV0X2xpbmUoZmQsICJpZiBzOmMgPiAwIikgPT0gRkFJTAorCQkJfHwgZnByaW50ZihmZCwKKwkJCSAgICAiICBleGUgJ25vcm1hbCEgMCcgLiBzOmMgLiAnbHpzJyAuICglbGQgLSBzOmMpIC4gJ2wnIiwKKwkJCSAgICAobG9uZyl3cC0+d19jdXJzb3IuY29sKSA8IDAKKwkJCXx8IHB1dF9lb2woZmQpID09IEZBSUwKKwkJCXx8IHB1dF9saW5lKGZkLCAiZWxzZSIpID09IEZBSUwKKwkJCXx8IGZwcmludGYoZmQsICIgIG5vcm1hbCEgMCVkbCIsIHdwLT53X2N1cnNvci5jb2wpIDwgMAorCQkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTAorCQkJfHwgcHV0X2xpbmUoZmQsICJlbmRpZiIpID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKGZwcmludGYoZmQsICJub3JtYWwhIDAlZGwiLCB3cC0+d19jdXJzb3IuY29sKSA8IDAKKwkJCXx8IHB1dF9lb2woZmQpID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIExvY2FsIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBpZiAod3AtPndfbG9jYWxkaXIgIT0gTlVMTCkKKyAgICB7CisJaWYgKGZwdXRzKCJsY2QgIiwgZmQpIDwgMAorCQl8fCBzZXNfcHV0X2ZuYW1lKGZkLCB3cC0+d19sb2NhbGRpciwgZmxhZ3ApID09IEZBSUwKKwkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogV3JpdGUgYW4gYXJndW1lbnQgbGlzdCB0byB0aGUgc2Vzc2lvbiBmaWxlLgorICogUmV0dXJucyBGQUlMIGlmIHdyaXRpbmcgZmFpbHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitzZXNfYXJnbGlzdChmZCwgY21kLCBnYXAsIGZ1bGxuYW1lLCBmbGFncCkKKyAgICBGSUxFCSpmZDsKKyAgICBjaGFyCSpjbWQ7CisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBpbnQJCWZ1bGxuYW1lOwkvKiBUUlVFOiB1c2UgZnVsbCBwYXRoIG5hbWUgKi8KKyAgICB1bnNpZ25lZAkqZmxhZ3A7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQlidWZbTUFYUEFUSExdOworICAgIGNoYXJfdQkqczsKKworICAgIGlmIChnYXAtPmdhX2xlbiA9PSAwKQorCXJldHVybiBwdXRfbGluZShmZCwgInNpbGVudCEgYXJnZGVsICoiKTsKKyAgICBpZiAoZnB1dHMoY21kLCBmZCkgPCAwKQorCXJldHVybiBGQUlMOworICAgIGZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbjsgKytpKQorICAgIHsKKwkvKiBOVUxMIGZpbGUgbmFtZXMgYXJlIHNraXBwZWQgKG9ubHkgaGFwcGVucyB3aGVuIG91dCBvZiBtZW1vcnkpLiAqLworCXMgPSBhbGlzdF9uYW1lKCYoKGFlbnRyeV9UICopZ2FwLT5nYV9kYXRhKVtpXSk7CisJaWYgKHMgIT0gTlVMTCkKKwl7CisJICAgIGlmIChmdWxsbmFtZSkKKwkgICAgeworCQkodm9pZCl2aW1fRnVsbE5hbWUocywgYnVmLCBNQVhQQVRITCwgRkFMU0UpOworCQlzID0gYnVmOworCSAgICB9CisJICAgIGlmIChmcHV0cygiICIsIGZkKSA8IDAgfHwgc2VzX3B1dF9mbmFtZShmZCwgcywgZmxhZ3ApID09IEZBSUwpCisJCXJldHVybiBGQUlMOworCX0KKyAgICB9CisgICAgcmV0dXJuIHB1dF9lb2woZmQpOworfQorCisvKgorICogV3JpdGUgYSBidWZmZXIgbmFtZSB0byB0aGUgc2Vzc2lvbiBmaWxlLgorICogQWxzbyBlbmRzIHRoZSBsaW5lLgorICogUmV0dXJucyBGQUlMIGlmIHdyaXRpbmcgZmFpbHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitzZXNfZm5hbWUoZmQsIGJ1ZiwgZmxhZ3ApCisgICAgRklMRQkqZmQ7CisgICAgYnVmX1QJKmJ1ZjsKKyAgICB1bnNpZ25lZAkqZmxhZ3A7Cit7CisgICAgY2hhcl91CSpuYW1lOworCisgICAgLyogVXNlIHRoZSBzaG9ydCBmaWxlIG5hbWUgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGtub3duIGF0IHRoZSB0aW1lCisgICAgICogdGhlIHNlc3Npb24gZmlsZSB3aWxsIGJlIHNvdXJjZWQuICBEb24ndCBkbyB0aGlzIGZvciAiOm1rdmlldyIsIHdlCisgICAgICogZG9uJ3Qga25vdyB0aGUgY3VycmVudCBkaXJlY3RvcnkuICovCisgICAgaWYgKGJ1Zi0+Yl9zZm5hbWUgIT0gTlVMTAorCSAgICAmJiBmbGFncCA9PSAmc3NvcF9mbGFncworCSAgICAmJiAoc3NvcF9mbGFncyAmIChTU09QX0NVUkRJUiB8IFNTT1BfU0VTRElSKSkpCisJbmFtZSA9IGJ1Zi0+Yl9zZm5hbWU7CisgICAgZWxzZQorCW5hbWUgPSBidWYtPmJfZmZuYW1lOworICAgIGlmIChzZXNfcHV0X2ZuYW1lKGZkLCBuYW1lLCBmbGFncCkgPT0gRkFJTCB8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFdyaXRlIGEgZmlsZSBuYW1lIHRvIHRoZSBzZXNzaW9uIGZpbGUuCisgKiBUYWtlcyBjYXJlIG9mIHRoZSAic2xhc2giIG9wdGlvbiBpbiAnc2Vzc2lvbm9wdGlvbnMnIGFuZCBlc2NhcGVzIHNwZWNpYWwKKyAqIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIEZBSUwgaWYgd3JpdGluZyBmYWlscy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3Nlc19wdXRfZm5hbWUoZmQsIG5hbWUsIGZsYWdwKQorICAgIEZJTEUJKmZkOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICB1bnNpZ25lZAkqZmxhZ3A7Cit7CisgICAgY2hhcl91CSpzbmFtZTsKKyAgICBpbnQJCXJldHZhbCA9IE9LOworICAgIGludAkJYzsKKworICAgIHNuYW1lID0gaG9tZV9yZXBsYWNlX3NhdmUoTlVMTCwgbmFtZSk7CisgICAgaWYgKHNuYW1lICE9IE5VTEwpCisJbmFtZSA9IHNuYW1lOworICAgIHdoaWxlICgqbmFtZSAhPSBOVUwpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwl7CisJICAgIGludCBsOworCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKG5hbWUpKSA+IDEpCisJICAgIHsKKwkJLyogY29weSBhIG11bHRpYnl0ZSBjaGFyICovCisJCXdoaWxlICgtLWwgPj0gMCkKKwkJeworCQkgICAgaWYgKHB1dGMoKm5hbWUsIGZkKSAhPSAqbmFtZSkKKwkJCXJldHZhbCA9IEZBSUw7CisJCSAgICArK25hbWU7CisJCX0KKwkJY29udGludWU7CisJICAgIH0KKwl9CisjZW5kaWYKKwljID0gKm5hbWUrKzsKKwlpZiAoYyA9PSAnXFwnICYmICgqZmxhZ3AgJiBTU09QX1NMQVNIKSkKKwkgICAgLyogY2hhbmdlIGEgYmFja3NsYXNoIHRvIGEgZm9yd2FyZCBzbGFzaCAqLworCSAgICBjID0gJy8nOworCWVsc2UgaWYgKCh2aW1fc3RyY2hyKGVzY2FwZV9jaGFycywgYykgIT0gTlVMTAorI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCQkgICAgJiYgYyAhPSAnXFwnCisjZW5kaWYKKwkJICkgfHwgYyA9PSAnIycgfHwgYyA9PSAnJScpCisJeworCSAgICAvKiBlc2NhcGUgYSBzcGVjaWFsIGNoYXJhY3RlciB3aXRoIGEgYmFja3NsYXNoICovCisJICAgIGlmIChwdXRjKCdcXCcsIGZkKSAhPSAnXFwnKQorCQlyZXR2YWwgPSBGQUlMOworCX0KKwlpZiAocHV0YyhjLCBmZCkgIT0gYykKKwkgICAgcmV0dmFsID0gRkFJTDsKKyAgICB9CisgICAgdmltX2ZyZWUoc25hbWUpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiAiOmxvYWR2aWV3IFtucl0iCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbG9hZHZpZXcoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKmZuYW1lOworCisgICAgZm5hbWUgPSBnZXRfdmlld19maWxlKCplYXAtPmFyZyk7CisgICAgaWYgKGZuYW1lICE9IE5VTEwpCisgICAgeworCWRvX3NvdXJjZShmbmFtZSwgRkFMU0UsIEZBTFNFKTsKKwl2aW1fZnJlZShmbmFtZSk7CisgICAgfQorfQorCisvKgorICogR2V0IHRoZSBuYW1lIG9mIHRoZSB2aWV3IGZpbGUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X3ZpZXdfZmlsZShjKQorICAgIGludAkJYzsKK3sKKyAgICBpbnQJCWxlbiA9IDA7CisgICAgY2hhcl91CSpwLCAqczsKKyAgICBjaGFyX3UJKnJldHZhbDsKKyAgICBjaGFyX3UJKnNuYW1lOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfbm9uYW1lKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNuYW1lID0gaG9tZV9yZXBsYWNlX3NhdmUoTlVMTCwgY3VyYnVmLT5iX2ZmbmFtZSk7CisgICAgaWYgKHNuYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIFdlIHdhbnQgYSBmaWxlIG5hbWUgd2l0aG91dCBzZXBhcmF0b3JzLCBiZWNhdXNlIHdlJ3JlIG5vdCBnb2luZyB0byBtYWtlCisgICAgICogYSBkaXJlY3RvcnkuCisgICAgICogIm5vcm1hbCIgcGF0aCBzZXBhcmF0b3IJLT4gIj0rIgorICAgICAqICI9IgkJCS0+ICI9PSIKKyAgICAgKiAiOiIgcGF0aCBzZXBhcmF0b3IJLT4gIj0tIgorICAgICAqLworICAgIGZvciAocCA9IHNuYW1lOyAqcDsgKytwKQorCWlmICgqcCA9PSAnPScgfHwgdmltX2lzcGF0aHNlcCgqcCkpCisJICAgICsrbGVuOworICAgIHJldHZhbCA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKHNuYW1lKSArIGxlbiArIFNUUkxFTihwX3ZkaXIpICsgOSkpOworICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKyAgICB7CisJU1RSQ1BZKHJldHZhbCwgcF92ZGlyKTsKKwlhZGRfcGF0aHNlcChyZXR2YWwpOworCXMgPSByZXR2YWwgKyBTVFJMRU4ocmV0dmFsKTsKKwlmb3IgKHAgPSBzbmFtZTsgKnA7ICsrcCkKKwl7CisJICAgIGlmICgqcCA9PSAnPScpCisJICAgIHsKKwkJKnMrKyA9ICc9JzsKKwkJKnMrKyA9ICc9JzsKKwkgICAgfQorCSAgICBlbHNlIGlmICh2aW1faXNwYXRoc2VwKCpwKSkKKwkgICAgeworCQkqcysrID0gJz0nOworI2lmZGVmIE1BQ09TX0NMQVNTSUMgLyogVE9ETzogSXMgaXQgYWxzbyBuZWVkZWQgZm9yIE1BQ09TX1g/IChEYW55KSAqLworCQkqcysrID0gJysnOworI2Vsc2UKKyMgaWYgZGVmaW5lZChCQUNLU0xBU0hfSU5fRklMRU5BTUUpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoUklTQ09TKSBcCisJfHwgZGVmaW5lZChWTVMpCisJCWlmICgqcCA9PSAnOicpCisJCSAgICAqcysrID0gJy0nOworCQllbHNlCisjIGVuZGlmCisJCSAgICAqcysrID0gJysnOworI2VuZGlmCisJICAgIH0KKwkgICAgZWxzZQorCQkqcysrID0gKnA7CisJfQorCSpzKysgPSAnPSc7CisJKnMrKyA9IGM7CisJU1RSQ1BZKHMsICIudmltIik7CisgICAgfQorCisgICAgdmltX2ZyZWUoc25hbWUpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBGRUFUX1NFU1NJT04gKi8KKworLyoKKyAqIFdyaXRlIGVuZC1vZi1saW5lIGNoYXJhY3RlcihzKSBmb3IgIjpta2V4cmMiLCAiOm1rdmltcmMiIGFuZCAiOm1rc2Vzc2lvbiIuCisgKiBSZXR1cm4gRkFJTCBmb3IgYSB3cml0ZSBlcnJvci4KKyAqLworICAgIGludAorcHV0X2VvbChmZCkKKyAgICBGSUxFCSpmZDsKK3sKKyAgICBpZiAoCisjaWZkZWYgVVNFX0NSTkwKKwkgICAgKAorIyBpZmRlZiBNS1NFU1NJT05fTkwKKwkgICAgICFta3Nlc3Npb25fbmwgJiYKKyMgZW5kaWYKKwkgICAgIChwdXRjKCdccicsIGZkKSA8IDApKSB8fAorI2VuZGlmCisJICAgIChwdXRjKCdcbicsIGZkKSA8IDApKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFdyaXRlIGEgbGluZSB0byAiZmQiLgorICogUmV0dXJuIEZBSUwgZm9yIGEgd3JpdGUgZXJyb3IuCisgKi8KKyAgICBpbnQKK3B1dF9saW5lKGZkLCBzKQorICAgIEZJTEUJKmZkOworICAgIGNoYXIJKnM7Cit7CisgICAgaWYgKGZwdXRzKHMsIGZkKSA8IDAgfHwgcHV0X2VvbChmZCkgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKy8qCisgKiAiOnJ2aW1pbmZvIiBhbmQgIjp3dmltaW5mbyIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfdmltaW5mbyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqc2F2ZV92aW1pbmZvOworCisgICAgc2F2ZV92aW1pbmZvID0gcF92aW1pbmZvOworICAgIGlmICgqcF92aW1pbmZvID09IE5VTCkKKwlwX3ZpbWluZm8gPSAoY2hhcl91ICopIicxMDAiOworICAgIGlmIChlYXAtPmNtZGlkeCA9PSBDTURfcnZpbWluZm8pCisgICAgeworCWlmIChyZWFkX3ZpbWluZm8oZWFwLT5hcmcsIFRSVUUsIFRSVUUsIGVhcC0+Zm9yY2VpdCkgPT0gRkFJTCkKKwkgICAgRU1TRyhfKCJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciKSk7CisgICAgfQorICAgIGVsc2UKKwl3cml0ZV92aW1pbmZvKGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQpOworICAgIHBfdmltaW5mbyA9IHNhdmVfdmltaW5mbzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK2RpYWxvZ19tc2coYnVmZiwgZm9ybWF0LCBmbmFtZSkKKyAgICBjaGFyX3UJKmJ1ZmY7CisgICAgY2hhcgkqZm9ybWF0OworICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgaW50CQlsZW47CisKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwlmbmFtZSA9IChjaGFyX3UgKilfKCJVbnRpdGxlZCIpOworICAgIGxlbiA9IChpbnQpU1RSTEVOKGZvcm1hdCkgKyAoaW50KVNUUkxFTihmbmFtZSk7CisgICAgaWYgKGxlbiA+PSBJT1NJWkUpCisJc3ByaW50ZigoY2hhciAqKWJ1ZmYsIGZvcm1hdCwgKGludCkoSU9TSVpFIC0gU1RSTEVOKGZvcm1hdCkpLCBmbmFtZSk7CisgICAgZWxzZQorCXNwcmludGYoKGNoYXIgKilidWZmLCBmb3JtYXQsIChpbnQpU1RSTEVOKGZuYW1lKSwgZm5hbWUpOworfQorI2VuZGlmCisKKy8qCisgKiAiOmJlaGF2ZSB7bXN3aW4seHRlcm19IgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2JlaGF2ZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmIChTVFJDTVAoZWFwLT5hcmcsICJtc3dpbiIpID09IDApCisgICAgeworCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJzZWxlY3Rpb24iLCAwTCwgKGNoYXJfdSAqKSJleGNsdXNpdmUiLCAwKTsKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikic2VsZWN0bW9kZSIsIDBMLCAoY2hhcl91ICopIm1vdXNlLGtleSIsIDApOworCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJtb3VzZW1vZGVsIiwgMEwsIChjaGFyX3UgKikicG9wdXAiLCAwKTsKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikia2V5bW9kZWwiLCAwTCwKKwkJCQkJICAgICAoY2hhcl91ICopInN0YXJ0c2VsLHN0b3BzZWwiLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RSQ01QKGVhcC0+YXJnLCAieHRlcm0iKSA9PSAwKQorICAgIHsKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikic2VsZWN0aW9uIiwgMEwsIChjaGFyX3UgKikiaW5jbHVzaXZlIiwgMCk7CisJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInNlbGVjdG1vZGUiLCAwTCwgKGNoYXJfdSAqKSIiLCAwKTsKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikibW91c2Vtb2RlbCIsIDBMLCAoY2hhcl91ICopImV4dGVuZCIsIDApOworCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJrZXltb2RlbCIsIDBMLCAoY2hhcl91ICopIiIsIDApOworICAgIH0KKyAgICBlbHNlCisJRU1TRzIoXyhlX2ludmFyZzIpLCBlYXAtPmFyZyk7Cit9CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKK3N0YXRpYyBpbnQgZmlsZXR5cGVfZGV0ZWN0ID0gRkFMU0U7CitzdGF0aWMgaW50IGZpbGV0eXBlX3BsdWdpbiA9IEZBTFNFOworc3RhdGljIGludCBmaWxldHlwZV9pbmRlbnQgPSBGQUxTRTsKKworLyoKKyAqICI6ZmlsZXR5cGUgW3BsdWdpbl0gW2luZGVudF0ge29uLG9mZixkZXRlY3R9IgorICogb246IExvYWQgdGhlIGZpbGV0eXBlLnZpbSBmaWxlIHRvIGluc3RhbGwgYXV0b2NvbW1hbmRzIGZvciBmaWxlIHR5cGVzLgorICogb2ZmOiBMb2FkIHRoZSBmdG9mZi52aW0gZmlsZSB0byByZW1vdmUgYWxsIGF1dG9jb21tYW5kcyBmb3IgZmlsZSB0eXBlcy4KKyAqIHBsdWdpbiBvbjogbG9hZCBmaWxldHlwZS52aW0gYW5kIGZ0cGx1Z2luLnZpbQorICogcGx1Z2luIG9mZjogbG9hZCBmdHBsdWdvZi52aW0KKyAqIGluZGVudCBvbjogbG9hZCBmaWxldHlwZS52aW0gYW5kIGluZGVudC52aW0KKyAqIGluZGVudCBvZmY6IGxvYWQgaW5kb2ZmLnZpbQorICovCisgICAgc3RhdGljIHZvaWQKK2V4X2ZpbGV0eXBlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBpbnQJCXBsdWdpbiA9IEZBTFNFOworICAgIGludAkJaW5kZW50ID0gRkFMU0U7CisKKyAgICBpZiAoKmVhcC0+YXJnID09IE5VTCkKKyAgICB7CisJLyogUHJpbnQgY3VycmVudCBzdGF0dXMuICovCisJc21zZygoY2hhcl91ICopImZpbGV0eXBlIGRldGVjdGlvbjolcyAgcGx1Z2luOiVzICBpbmRlbnQ6JXMiLAorCQlmaWxldHlwZV9kZXRlY3QgPyAiT04iIDogIk9GRiIsCisJCWZpbGV0eXBlX3BsdWdpbiA/IChmaWxldHlwZV9kZXRlY3QgPyAiT04iIDogIihvbikiKSA6ICJPRkYiLAorCQlmaWxldHlwZV9pbmRlbnQgPyAoZmlsZXR5cGVfZGV0ZWN0ID8gIk9OIiA6ICIob24pIikgOiAiT0ZGIik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEFjY2VwdCAicGx1Z2luIiBhbmQgImluZGVudCIgaW4gYW55IG9yZGVyLiAqLworICAgIGZvciAoOzspCisgICAgeworCWlmIChTVFJOQ01QKGFyZywgInBsdWdpbiIsIDYpID09IDApCisJeworCSAgICBwbHVnaW4gPSBUUlVFOworCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnICsgNik7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoU1RSTkNNUChhcmcsICJpbmRlbnQiLCA2KSA9PSAwKQorCXsKKwkgICAgaW5kZW50ID0gVFJVRTsKKwkgICAgYXJnID0gc2tpcHdoaXRlKGFyZyArIDYpOworCSAgICBjb250aW51ZTsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIGlmIChTVFJDTVAoYXJnLCAib24iKSA9PSAwIHx8IFNUUkNNUChhcmcsICJkZXRlY3QiKSA9PSAwKQorICAgIHsKKwlpZiAoKmFyZyA9PSAnbycgfHwgIWZpbGV0eXBlX2RldGVjdCkKKwl7CisJICAgIGNtZF9ydW50aW1lKChjaGFyX3UgKilGSUxFVFlQRV9GSUxFLCBUUlVFKTsKKwkgICAgZmlsZXR5cGVfZGV0ZWN0ID0gVFJVRTsKKwkgICAgaWYgKHBsdWdpbikKKwkgICAgeworCQljbWRfcnVudGltZSgoY2hhcl91ICopRlRQTFVHSU5fRklMRSwgVFJVRSk7CisJCWZpbGV0eXBlX3BsdWdpbiA9IFRSVUU7CisJICAgIH0KKwkgICAgaWYgKGluZGVudCkKKwkgICAgeworCQljbWRfcnVudGltZSgoY2hhcl91ICopSU5ERU5UX0ZJTEUsIFRSVUUpOworCQlmaWxldHlwZV9pbmRlbnQgPSBUUlVFOworCSAgICB9CisJfQorCWlmICgqYXJnID09ICdkJykKKwl7CisJICAgICh2b2lkKWRvX2RvYXV0b2NtZCgoY2hhcl91ICopImZpbGV0eXBlZGV0ZWN0IEJ1ZlJlYWQiLCBUUlVFKTsKKwkgICAgZG9fbW9kZWxpbmVzKCk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChTVFJDTVAoYXJnLCAib2ZmIikgPT0gMCkKKyAgICB7CisJaWYgKHBsdWdpbiB8fCBpbmRlbnQpCisJeworCSAgICBpZiAocGx1Z2luKQorCSAgICB7CisJCWNtZF9ydW50aW1lKChjaGFyX3UgKilGVFBMVUdPRl9GSUxFLCBUUlVFKTsKKwkJZmlsZXR5cGVfcGx1Z2luID0gRkFMU0U7CisJICAgIH0KKwkgICAgaWYgKGluZGVudCkKKwkgICAgeworCQljbWRfcnVudGltZSgoY2hhcl91ICopSU5ET0ZGX0ZJTEUsIFRSVUUpOworCQlmaWxldHlwZV9pbmRlbnQgPSBGQUxTRTsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBjbWRfcnVudGltZSgoY2hhcl91ICopRlRPRkZfRklMRSwgVFJVRSk7CisJICAgIGZpbGV0eXBlX2RldGVjdCA9IEZBTFNFOworCX0KKyAgICB9CisgICAgZWxzZQorCUVNU0cyKF8oZV9pbnZhcmcyKSwgYXJnKTsKK30KKworLyoKKyAqICI6c2V0ZmlsZXR5cGUge25hbWV9IgorICovCisgICAgc3RhdGljIHZvaWQKK2V4X3NldGZpbGV0eXBlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaWYgKCFkaWRfZmlsZXR5cGUpCisJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImZpbGV0eXBlIiwgMEwsIGVhcC0+YXJnLCBPUFRfTE9DQUwpOworfQorI2VuZGlmCisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitleF9kaWdyYXBocyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworI2lmZGVmIEZFQVRfRElHUkFQSFMKKyAgICBpZiAoKmVhcC0+YXJnICE9IE5VTCkKKwlwdXRkaWdyYXBoKGVhcC0+YXJnKTsKKyAgICBlbHNlCisJbGlzdGRpZ3JhcGhzKCk7CisjZWxzZQorICAgIEVNU0coXygiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIikpOworI2VuZGlmCit9CisKKyAgICBzdGF0aWMgdm9pZAorZXhfc2V0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlmbGFncyA9IDA7CisKKyAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX3NldGxvY2FsKQorCWZsYWdzID0gT1BUX0xPQ0FMOworICAgIGVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9zZXRnbG9iYWwpCisJZmxhZ3MgPSBPUFRfR0xPQkFMOworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0JST1dTRSkKKyAgICBpZiAoY21kbW9kLmJyb3dzZSAmJiBmbGFncyA9PSAwKQorCWV4X29wdGlvbnMoZWFwKTsKKyAgICBlbHNlCisjZW5kaWYKKwkodm9pZClkb19zZXQoZWFwLT5hcmcsIGZsYWdzKTsKK30KKworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisvKgorICogIjpub2hsc2VhcmNoIgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbm9obHNlYXJjaChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIG5vX2hsc2VhcmNoID0gVFJVRTsKKyAgICByZWRyYXdfYWxsX2xhdGVyKE5PVF9WQUxJRCk7Cit9CisKKy8qCisgKiAiOm1hdGNoIHtncm91cH0ge3BhdHRlcm59IgorICogU2V0cyBuZXh0Y21kIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21tYW5kLCBpZiBhbnkuICBBbHNvIGNhbGxlZCB3aGVuCisgKiBza2lwcGluZyBjb21tYW5kcyB0byBmaW5kIHRoZSBuZXh0IGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXhfbWF0Y2goZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSplbmQ7CisgICAgaW50CQljOworCisgICAgLyogRmlyc3QgY2xlYXIgYW55IG9sZCBwYXR0ZXJuLiAqLworICAgIGlmICghZWFwLT5za2lwKQorICAgIHsKKwl2aW1fZnJlZShjdXJ3aW4tPndfbWF0Y2gucmVncHJvZyk7CisJY3Vyd2luLT53X21hdGNoLnJlZ3Byb2cgPSBOVUxMOworCXJlZHJhd19sYXRlcihOT1RfVkFMSUQpOwkvKiBhbHdheXMgbmVlZCBhIHJlZHJhdyAqLworICAgIH0KKworICAgIGlmIChlbmRzX2V4Y21kKCplYXAtPmFyZykpCisJZW5kID0gZWFwLT5hcmc7CisgICAgZWxzZSBpZiAoKFNUUk5JQ01QKGVhcC0+YXJnLCAibm9uZSIsIDQpID09IDAKKwkJJiYgKHZpbV9pc3doaXRlKGVhcC0+YXJnWzRdKSB8fCBlbmRzX2V4Y21kKGVhcC0+YXJnWzRdKSkpKQorCWVuZCA9IGVhcC0+YXJnICsgNDsKKyAgICBlbHNlCisgICAgeworCXAgPSBza2lwdG93aGl0ZShlYXAtPmFyZyk7CisJaWYgKCFlYXAtPnNraXApCisJeworCSAgICBjdXJ3aW4tPndfbWF0Y2hfaWQgPSBzeW5fbmFtZW4yaWQoZWFwLT5hcmcsIChpbnQpKHAgLSBlYXAtPmFyZykpOworCSAgICBpZiAoY3Vyd2luLT53X21hdGNoX2lkID09IDApCisJICAgIHsKKwkJRU1TRzIoXyhlX25vZ3JvdXApLCBlYXAtPmFyZyk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKwlwID0gc2tpcHdoaXRlKHApOworCWlmICgqcCA9PSBOVUwpCisJeworCSAgICAvKiBUaGVyZSBtdXN0IGJlIHR3byBhcmd1bWVudHMuICovCisJICAgIEVNU0cyKF8oZV9pbnZhcmcyKSwgZWFwLT5hcmcpOworCSAgICByZXR1cm47CisJfQorCWVuZCA9IHNraXBfcmVnZXhwKHAgKyAxLCAqcCwgVFJVRSwgTlVMTCk7CisJaWYgKCFlYXAtPnNraXApCisJeworCSAgICBpZiAoKmVuZCAhPSBOVUwgJiYgIWVuZHNfZXhjbWQoKnNraXB3aGl0ZShlbmQgKyAxKSkpCisJICAgIHsKKwkJZWFwLT5lcnJtc2cgPSBlX3RyYWlsaW5nOworCQlyZXR1cm47CisJICAgIH0KKworCSAgICBjID0gKmVuZDsKKwkgICAgKmVuZCA9IE5VTDsKKwkgICAgY3Vyd2luLT53X21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwICsgMSwgUkVfTUFHSUMpOworCSAgICAqZW5kID0gYzsKKwkgICAgaWYgKGN1cndpbi0+d19tYXRjaC5yZWdwcm9nID09IE5VTEwpCisJICAgIHsKKwkJRU1TRzIoXyhlX2ludmFyZzIpLCBwKTsKKwkJcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKyAgICBlYXAtPm5leHRjbWQgPSBmaW5kX25leHRjbWQoZW5kKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DUllQVAorLyoKKyAqICI6WCI6IEdldCBjcnlwdCBrZXkKKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2V4X1goZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICAodm9pZClnZXRfY3J5cHRfa2V5KFRSVUUsIFRSVUUpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBzdGF0aWMgdm9pZAorZXhfZm9sZChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmIChmb2xkTWFudWFsQWxsb3dlZChUUlVFKSkKKwlmb2xkQ3JlYXRlKGVhcC0+bGluZTEsIGVhcC0+bGluZTIpOworfQorCisgICAgc3RhdGljIHZvaWQKK2V4X2ZvbGRvcGVuKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgb3BGb2xkUmFuZ2UoZWFwLT5saW5lMSwgZWFwLT5saW5lMiwgZWFwLT5jbWRpZHggPT0gQ01EX2ZvbGRvcGVuLAorCQkJCQkJCSBlYXAtPmZvcmNlaXQsIEZBTFNFKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitleF9mb2xkZG8oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgLyogRmlyc3Qgc2V0IHRoZSBtYXJrcyBmb3IgYWxsIGxpbmVzIGNsb3NlZC9vcGVuLiAqLworICAgIGZvciAobG51bSA9IGVhcC0+bGluZTE7IGxudW0gPD0gZWFwLT5saW5lMjsgKytsbnVtKQorCWlmIChoYXNGb2xkaW5nKGxudW0sIE5VTEwsIE5VTEwpID09IChlYXAtPmNtZGlkeCA9PSBDTURfZm9sZGRvY2xvc2VkKSkKKwkgICAgbWxfc2V0bWFya2VkKGxudW0pOworCisgICAgLyogRXhlY3V0ZSB0aGUgY29tbWFuZCBvbiB0aGUgbWFya2VkIGxpbmVzLiAqLworICAgIGdsb2JhbF9leGUoZWFwLT5hcmcpOworICAgIG1sX2NsZWFybWFya2VkKCk7CSAgIC8qIGNsZWFyIHJlc3Qgb2YgdGhlIG1hcmtzICovCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9leF9ldmFsLmMgYi9zcmMvZXhfZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWQ2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXhfZXZhbC5jCkBAIC0wLDAgKzEsMjAwNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogZXhfZXZhbC5jOiBmdW5jdGlvbnMgZm9yIEV4IGNvbW1hbmQgbGluZSBmb3IgdGhlICtldmFsIGZlYXR1cmUuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisKK3N0YXRpYyB2b2lkCWZyZWVfbXNnbGlzdCBfX0FSR1MoKHN0cnVjdCBtc2dsaXN0ICpsKSk7CitzdGF0aWMgaW50CXRocm93X2V4Y2VwdGlvbiBfX0FSR1MoKHZvaWQgKiwgaW50LCBjaGFyX3UgKikpOworc3RhdGljIHZvaWQJcmV3aW5kX2NvbmRpdGlvbmFscyBfX0FSR1MoKHN0cnVjdCBjb25kc3RhY2sgKiwKKwkJCQkJCQkgICAgaW50LCBpbnQsIGludCAqKSk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxpbmcgdGVybXM6CisgKgorICoJOnRyeQkJIjp0cnkiIGNvbW1hbmQJCVwKKyAqCSAgICAuLi4JCXRyeSBibG9jawkJfAorICoJOmNhdGNoIFJFCSI6Y2F0Y2giIGNvbW1hbmQJfAorICoJICAgIC4uLgkJY2F0Y2ggY2xhdXNlCQl8LSB0cnkgY29uZGl0aW9uYWwKKyAqCTpmaW5hbGx5CSI6ZmluYWxseSIgY29tbWFuZAl8CisgKgkgICAgLi4uCQlmaW5hbGx5IGNsYXVzZQkJfAorICoJOmVuZHRyeQkJIjplbmR0cnkiIGNvbW1hbmQJLworICoKKyAqIFRoZSB0cnkgY29uZGl0aW9uYWwgbWF5IGhhdmUgYW55IG51bWJlciBvZiBjYXRjaCBjbGF1c2VzIGFuZCBhdCBtb3N0IG9uZQorICogZmluYWxseSBjbGF1c2UuICBBICI6dGhyb3ciIGNvbW1hbmQgY2FuIGJlIGluc2lkZSB0aGUgdHJ5IGJsb2NrLCBhIGNhdGNoCisgKiBjbGF1c2UsIHRoZSBmaW5hbGx5IGNsYXVzZSwgb3IgaW4gYSBmdW5jdGlvbiBjYWxsZWQgb3Igc2NyaXB0IHNvdXJjZWQgZnJvbQorICogdGhlcmUgb3IgZXZlbiBvdXRzaWRlIHRoZSB0cnkgY29uZGl0aW9uYWwuICBUcnkgY29uZGl0aW9uYWxzIG1heSBiZSBuZXN0ZWQuCisgKi8KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gd2hldGhlciBhbiBleGNlcHRpb24gaXMgdGhyb3duIG9uIGVycm9yIG9yIGludGVycnVwdC4gIFdoZW4KKyAqIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm9zIGJlbG93IGV2YWx1YXRlIHRvIEZBTFNFLCBhbiBlcnJvciAoZGlkX2Vtc2cpIG9yCisgKiBpbnRlcnJ1cHQgKGdvdF9pbnQpIHVuZGVyIGFuIGFjdGl2ZSB0cnkgY29uZGl0aW9uYWwgdGVybWluYXRlcyB0aGUgc2NyaXB0CisgKiBhZnRlciB0aGUgbm9uLWFjdGl2ZSBmaW5hbGx5IGNsYXVzZXMgb2YgYWxsIGFjdGl2ZSB0cnkgY29uZGl0aW9uYWxzIGhhdmUgYmVlbgorICogZXhlY3V0ZWQuICBPdGhlcndpc2UsIGVycm9ycyBhbmQvb3IgaW50ZXJydXB0cyBhcmUgY29udmVydGVkIGludG8gY2F0Y2hhYmxlCisgKiBleGNlcHRpb25zIChkaWRfdGhyb3cgYWRkaXRpb25hbGx5IHNldCksIHdoaWNoIHRlcm1pbmF0ZSB0aGUgc2NyaXB0IG9ubHkgaWYKKyAqIG5vdCBjYXVnaHQuICBGb3IgdXNlciBleGNlcHRpb25zLCBvbmx5IGRpZF90aHJvdyBpcyBzZXQuICAoTm90ZTogZ290X2ludCBjYW4KKyAqIGJlIHNldCBhc3luY3Jvbm91c2x5IGFmdGVyd2FyZHMgYnkgYSBTSUdJTlQsIHNvIGRpZF90aHJvdyAmJiBnb3RfaW50IGlzIG5vdAorICogYSByZWxpYW50IHRlc3QgdGhhdCB0aGUgZXhjZXB0aW9uIGN1cnJlbnRseSBiZWluZyB0aHJvd24gaXMgYW4gaW50ZXJydXB0CisgKiBleGNlcHRpb24uICBTaW1pbGFybHksIGRpZF9lbXNnIGNhbiBiZSBzZXQgYWZ0ZXJ3YXJkcyBvbiBhbiBlcnJvciBpbiBhbgorICogKHVuc2tpcHBlZCkgY29uZGl0aW9uYWwgY29tbWFuZCBpbnNpZGUgYW4gaW5hY3RpdmUgY29uZGl0aW9uYWwsIHNvIGRpZF90aHJvdworICogJiYgZGlkX2Vtc2cgaXMgbm90IGEgcmVsaWFudCB0ZXN0IHRoYXQgdGhlIGV4Y2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGhyb3duCisgKiBpcyBhbiBlcnJvciBleGNlcHRpb24uKSAgLSAgVGhlIG1hY3JvcyBjYW4gYmUgZGVmaW5lZCBhcyBleHByZXNzaW9ucyBjaGVja2luZworICogZm9yIGEgdmFyaWFibGUgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGNoYW5nZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhIHNjcmlwdC4KKyAqLworI2lmIDAKKy8qIEV4cHJlc3Npb25zIHVzZWQgZm9yIHRlc3RpbmcgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBwaGFzZS4gKi8KKyMgZGVmaW5lIFRIUk9XX09OX0VSUk9SCQkoIWV2YWxfdG9fbnVtYmVyKCIkVklNTk9FUlJUSFJPVyIpKQorIyBkZWZpbmUgVEhST1dfT05fSU5URVJSVVBUCSghZXZhbF90b19udW1iZXIoIiRWSU1OT0lOVFRIUk9XIikpCisjIGRlZmluZSBUSFJPV19URVNUCisjZWxzZQorLyogVmFsdWVzIHVzZWQgZm9yIHRoZSBWaW0gcmVsZWFzZS4gKi8KKyMgZGVmaW5lIFRIUk9XX09OX0VSUk9SCQlUUlVFCisjIGRlZmluZSBUSFJPV19PTl9JTlRFUlJVUFQJVFJVRQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCWNhdGNoX2V4Y2VwdGlvbiBfX0FSR1MoKGV4Y2VwdF9UICpleGNwKSk7CitzdGF0aWMgdm9pZAlmaW5pc2hfZXhjZXB0aW9uIF9fQVJHUygoZXhjZXB0X1QgKmV4Y3ApKTsKK3N0YXRpYyB2b2lkCWRpc2NhcmRfZXhjZXB0aW9uIF9fQVJHUygoZXhjZXB0X1QgKmV4Y3AsIGludCB3YXNfZmluaXNoZWQpKTsKK3N0YXRpYyB2b2lkCXJlcG9ydF9wZW5kaW5nIF9fQVJHUygoaW50IGFjdGlvbiwgaW50IHBlbmRpbmcsIHZvaWQgKnZhbHVlKSk7CisKKy8qCisgKiBXaGVuIHNldmVyYWwgZXJyb3JzIGFwcGVhciBpbiBhIHJvdywgc2V0dGluZyAiZm9yY2VfYWJvcnQiIGlzIGRlbGF5ZWQgdW50aWwKKyAqIHRoZSBmYWlsaW5nIGNvbW1hbmQgcmV0dXJuZWQuICAiY2F1c2VfYWJvcnQiIGlzIHNldCB0byBUUlVFIG1lYW53aGlsZSwgaW4KKyAqIG9yZGVyIHRvIGluZGljYXRlIHRoYXQgc2l0dWF0aW9uLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiAiZm9yY2VfYWJvcnQiIHdhcyBzZXQKKyAqIGR1cmluZyBleGVjdXRpb24gb2YgYSBmdW5jdGlvbiBjYWxsIGZyb20gYW4gZXhwcmVzc2lvbjogdGhlIGFib3J0aW5nIG9mIHRoZQorICogZXhwcmVzc2lvbiBldmFsdWF0aW9uIGlzIGRvbmUgd2l0aG91dCBwcm9kdWNpbmcgYW55IGVycm9yIG1lc3NhZ2VzLCBidXQgYWxsCisgKiBlcnJvciBtZXNzYWdlcyBvbiBwYXJzaW5nIGVycm9ycyBkdXJpbmcgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBhcmUgZ2l2ZW4KKyAqIChldmVuIGlmIGEgdHJ5IGNvbmRpdGlvbmFsIGlzIGFjdGl2ZSkuCisgKi8KK3N0YXRpYyBpbnQgY2F1c2VfYWJvcnQgPSBGQUxTRTsKKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gaW1tZGVkaWF0ZWx5IGFib3J0aW5nIG9uIGVycm9yLCBvciB3aGVuIGFuIGludGVycnVwdAorICogb2NjdXJyZWQgb3IgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnV0IG5vdCBjYXVnaHQuICBVc2UgZm9yICI6e3JhbmdlfWNhbGwiCisgKiB0byBjaGVjayB3aGV0aGVyIGFuIGFib3J0ZWQgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBoYW5kbGUgYSByYW5nZSBpdHNlbGYKKyAqIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gZm9yIHRoZSBuZXh0IGxpbmUgaW4gdGhlIHJhbmdlLiAgQWxzbyB1c2VkIGZvcgorICogY2FuY2VsbGluZyBleHByZXNzaW9uIGV2YWx1YXRpb24gYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsIGNhdXNlZCBhbiBpbW1lZGlhdGUKKyAqIGFib3J0LiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBlbXNnKCkgY2FsbCB0ZW1wb3JhcmlseSByZXNldHMgImZvcmNlX2Fib3J0IgorICogdW50aWwgdGhlIHRocm93IHBvaW50IGZvciBlcnJvciBtZXNzYWdlcyBoYXMgYmVlbiByZWFjaGVkLiAgVGhhdCBpcywgZHVyaW5nCisgKiBjYW5jZWxsYXRpb24gb2YgYW4gZXhwcmVzc2lvbiBldmFsdWF0aW9uIGFmdGVyIGFuIGFib3J0aW5nIGZ1bmN0aW9uIGNhbGwgb3IKKyAqIGR1ZSB0byBhIHBhcnNpbmcgZXJyb3IsIGFib3J0aW5nKCkgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgdmFsdWUuCisgKi8KKyAgICBpbnQKK2Fib3J0aW5nKCkKK3sKKyAgICByZXR1cm4gKGRpZF9lbXNnICYmIGZvcmNlX2Fib3J0KSB8fCBnb3RfaW50IHx8IGRpZF90aHJvdzsKK30KKworLyoKKyAqIFRoZSB2YWx1ZSBvZiAiZm9yY2VfYWJvcnQiIGlzIHRlbXBvcmFyaWx5IHJlc2V0IGJ5IHRoZSBmaXJzdCBlbXNnKCkgY2FsbAorICogZHVyaW5nIGFuIGV4cHJlc3Npb24gZXZhbHVhdGlvbiwgYW5kICJjYXVzZV9hYm9ydCIgaXMgdXNlZCBpbnN0ZWFkLiAgSXQgbWlnaHQKKyAqIGJlIG5lY2Vzc2FyeSB0byByZXN0b3JlICJmb3JjZV9hYm9ydCIgZXZlbiBiZWZvcmUgdGhlIHRocm93IHBvaW50IGZvciB0aGUKKyAqIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gcmVhY2hlZC4gIHVwZGF0ZV9mb3JjZV9hYm9ydCgpIHNob3VsZCBiZSBjYWxsZWQgdGhlbi4KKyAqLworICAgIHZvaWQKK3VwZGF0ZV9mb3JjZV9hYm9ydCgpCit7CisgICAgaWYgKGNhdXNlX2Fib3J0KQorCWZvcmNlX2Fib3J0ID0gVFJVRTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGEgY29tbWFuZCB3aXRoIGEgc3ViY29tbWFuZCByZXN1bHRpbmcgaW4gInJldGNvZGUiIHNob3VsZAorICogYWJvcnQgdGhlIHNjcmlwdCBwcm9jZXNzaW5nLiAgQ2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgYW4gYXV0b2NvbW1hbmQgYWZ0ZXIKKyAqIGV4ZWN1dGlvbiBvZiBhIGZhaWxpbmcgc3ViY29tbWFuZCBhcyBsb25nIGFzIHRoZSBlcnJvciBtZXNzYWdlIGhhcyBub3QgYmVlbgorICogZGlzcGxheWVkIGFuZCBhY3R1YWxseSBjYXVzZWQgdGhlIGFib3J0aW9uLgorICovCisgICAgaW50CitzaG91bGRfYWJvcnQocmV0Y29kZSkKKyAgICBpbnQJCXJldGNvZGU7Cit7CisgICAgcmV0dXJuICgocmV0Y29kZSA9PSBGQUlMICYmIHRyeWxldmVsICE9IDAgJiYgIWVtc2dfc2lsZW50KSB8fCBhYm9ydGluZygpKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGEgZnVuY3Rpb24gd2l0aCB0aGUgImFib3J0IiBmbGFnIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZAorICogZW5kZWQgb24gYW4gZXJyb3IuICBUaGlzIG1lYW5zIHRoYXQgcGFyc2luZyBjb21tYW5kcyBpcyBjb250aW51ZWQgaW4gb3JkZXIKKyAqIHRvIGZpbmQgZmluYWxseSBjbGF1c2VzIHRvIGJlIGV4ZWN1dGVkLCBhbmQgdGhhdCBzb21lIGVycm9ycyBpbiBza2lwcGVkCisgKiBjb21tYW5kcyBhcmUgc3RpbGwgcmVwb3J0ZWQuCisgKi8KKyAgICBpbnQKK2Fib3J0ZWRfaW5fdHJ5KCkKK3sKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFmdGVyIGFuIGVycm9yLiAgSW4gdGhpcyBjYXNlLCAiZm9yY2VfYWJvcnQiCisgICAgICogZGV0ZXJtaW5lcyB3aGV0aGVyIHNlYXJjaGluZyBmb3IgZmluYWxseSBjbGF1c2VzIGlzIG5lY2Vzc2FyeS4gKi8KKyAgICByZXR1cm4gZm9yY2VfYWJvcnQ7Cit9CisKKy8qCisgKiBjYXVzZV9lcnJ0aHJvdygpOiBDYXVzZSBhIHRocm93IG9mIGFuIGVycm9yIGV4Y2VwdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqIFJldHVybiBUUlVFIGlmIHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIGJ5IGVtc2coKS4KKyAqIFNldHMgImlnbm9yZSIsIGlmIHRoZSBlbXNnKCkgY2FsbCBzaG91bGQgYmUgaWdub3JlZCBjb21wbGV0ZWx5LgorICoKKyAqIFdoZW4gc2V2ZXJhbCBtZXNzYWdlcyBhcHBlYXIgaW4gdGhlIHNhbWUgY29tbWFuZCwgdGhlIGZpcnN0IGlzIHVzdWFsbHkgdGhlCisgKiBtb3N0IHNwZWNpZmljIG9uZSBhbmQgdXNlZCBhcyB0aGUgZXhjZXB0aW9uIHZhbHVlLiAgVGhlICJzZXZlcmUiIGZsYWcgY2FuIGJlCisgKiBzZXQgdG8gVFJVRSwgaWYgYSBsYXRlciBidXQgc2V2ZXJlciBtZXNzYWdlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgKi8KKyAgICBpbnQKK2NhdXNlX2VycnRocm93KG1lc2csIHNldmVyZSwgaWdub3JlKQorICAgIGNoYXJfdQkqbWVzZzsKKyAgICBpbnQJCXNldmVyZTsKKyAgICBpbnQJCSppZ25vcmU7Cit7CisgICAgc3RydWN0IG1zZ2xpc3QgKmVsZW07CisgICAgc3RydWN0IG1zZ2xpc3QgKipwbGlzdDsKKworICAgIC8qCisgICAgICogRG8gbm90aGluZyB3aGVuIGRpc3BsYXlpbmcgdGhlIGludGVycnVwdCBtZXNzYWdlIG9yIHJlcG9ydGluZyBhbiB1bmNhdWdodAorICAgICAqIGV4Y2VwdGlvbiAod2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQgdGhlbikgYXQgdGhlIHRvcCBsZXZlbC4gIEFsc28KKyAgICAgKiB3aGVuIG5vIGV4Y2VwdGlvbiBjYW4gYmUgdGhyb3duLiAgVGhlIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgYnkKKyAgICAgKiBlbXNnKCkuCisgICAgICovCisgICAgaWYgKHN1cHByZXNzX2VycnRocm93KQorCXJldHVybiBGQUxTRTsKKworICAgIC8qCisgICAgICogSWYgZW1zZygpIGhhcyBub3QgYmVlbiBjYWxsZWQgcHJldmlvdXNseSwgdGVtcG9yYXJpbHkgcmVzZXQgImZvcmNlX2Fib3J0IgorICAgICAqIHVudGlsIHRoZSB0aHJvdyBwb2ludCBmb3IgZXJyb3IgbWVzc2FnZXMgaGFzIGJlZW4gcmVhY2hlZC4gIFRoaXMgZW5zdXJlcworICAgICAqIHRoYXQgYWJvcnRpbmcoKSByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGZvciBhbGwgZXJyb3JzIHRoYXQgYXBwZWFyIGluIHRoZQorICAgICAqIHNhbWUgY29tbWFuZC4gIFRoaXMgbWVhbnMgcGFydGljdWxhcmx5IHRoYXQgZm9yIHBhcnNpbmcgZXJyb3JzIGR1cmluZworICAgICAqIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBlbXNnKCkgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbHksIGV2ZW4gd2hlbiB0aGUKKyAgICAgKiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBmcm9tIGEgZmluYWxseSBjbGF1c2UgdGhhdCB3YXMgYWN0aXZhdGVkIGR1ZSB0bworICAgICAqIGFuIGFib3J0aW5nIGVycm9yLCBpbnRlcnJ1cHQsIG9yIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoIWRpZF9lbXNnKQorICAgIHsKKwljYXVzZV9hYm9ydCA9IGZvcmNlX2Fib3J0OworCWZvcmNlX2Fib3J0ID0gRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBubyB0cnkgY29uZGl0aW9uYWwgaXMgYWN0aXZlIGFuZCBubyBleGNlcHRpb24gaXMgYmVpbmcgdGhyb3duIGFuZAorICAgICAqIHRoZXJlIGhhcyBub3QgYmVlbiBhbiBlcnJvciBpbiBhIHRyeSBjb25kaXRpb25hbCBvciBhIHRocm93IHNvIGZhciwgZG8KKyAgICAgKiBub3RoaW5nIChmb3IgY29tcGF0aWJpbGl0eSBvZiBub24tRUggc2NyaXB0cykuICBUaGUgbWVzc2FnZSB3aWxsIHRoZW4gYmUKKyAgICAgKiBkaXNwbGF5ZWQgYnkgZW1zZygpLiAgV2hlbiAiOnNpbGVudCEiIHdhcyB1c2VkIGFuZCB3ZSBhcmUgbm90IGN1cnJlbnRseQorICAgICAqIHRocm93aW5nIGFuIGV4Y2VwdGlvbiwgZG8gbm90aGluZy4gIFRoZSBtZXNzYWdlIHRleHQgd2lsbCB0aGVuIGJlIHN0b3JlZAorICAgICAqIHRvIHY6ZXJybXNnIGJ5IGVtc2coKSB3aXRob3V0IGRpc3BsYXlpbmcgaXQuCisgICAgICovCisgICAgaWYgKCgodHJ5bGV2ZWwgPT0gMCAmJiAhY2F1c2VfYWJvcnQpIHx8IGVtc2dfc2lsZW50KSAmJiAhZGlkX3Rocm93KQorCXJldHVybiBGQUxTRTsKKworICAgIC8qCisgICAgICogSWdub3JlIGFuIGludGVycnVwdCBtZXNzYWdlIHdoZW4gaW5zaWRlIGEgdHJ5IGNvbmRpdGlvbmFsIG9yIHdoZW4gYW4KKyAgICAgKiBleGNlcHRpb24gaXMgYmVpbmcgdGhyb3duIG9yIHdoZW4gYW4gZXJyb3IgaW4gYSB0cnkgY29uZGl0aW9uYWwgb3IgdGhyb3cKKyAgICAgKiBoYXMgYmVlbiBkZXRlY3RlZCBwcmV2aW91c2x5LiAgVGhpcyBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdGhhdCBhbgorICAgICAqIGludGVycnVwdCBleGNlcHRpb24gaXMgY2F0Y2hhYmxlIGJ5IHRoZSBpbm5lcm1vc3QgdHJ5IGNvbmRpdGlvbmFsIGFuZAorICAgICAqIG5vdCByZXBsYWNlZCBieSBhbiBpbnRlcnJ1cHQgbWVzc2FnZSBlcnJvciBleGNlcHRpb24uCisgICAgICovCisgICAgaWYgKG1lc2cgPT0gKGNoYXJfdSAqKV8oZV9pbnRlcnIpKQorICAgIHsKKwkqaWdub3JlID0gVFJVRTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVuc3VyZSB0aGF0IGFsbCBjb21tYW5kcyBpbiBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMgYW5kIHNvdXJjZWQgZmlsZXMKKyAgICAgKiBhcmUgYWJvcnRlZCBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBjYXVzZV9hYm9ydCA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIFdoZW4gYW4gZXhjZXB0aW9uIGlzIGJlaW5nIHRocm93biwgc29tZSBjb21tYW5kcyAobGlrZSBjb25kaXRpb25hbHMpIGFyZQorICAgICAqIG5vdCBza2lwcGVkLiAgRXJyb3JzIGluIHRob3NlIGNvbW1hbmRzIG1heSBhZmZlY3Qgd2hhdCBvZiB0aGUgc3Vic2VxdWVudAorICAgICAqIGNvbW1hbmRzIGFyZSByZWdhcmRlZCBwYXJ0IG9mIGNhdGNoIGFuZCBmaW5hbGx5IGNsYXVzZXMuICBDYXRjaGluZyB0aGUKKyAgICAgKiBleGNlcHRpb24gd291bGQgdGhlbiBjYXVzZSBleGVjdXRpb24gb2YgY29tbWFuZHMgbm90IGludGVuZGVkIGJ5IHRoZQorICAgICAqIHVzZXIsIHdobyB3b3VsZG4ndCBldmVuIGdldCBhd2FyZSBvZiB0aGUgcHJvYmxlbS4gIFRoZXJlZm9yLCBkaXNjYXJkIHRoZQorICAgICAqIGV4Y2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGhyb3duIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBjYXVnaHQuICBKdXN0CisgICAgICogZXhlY3V0ZSBmaW5hbGx5IGNsYXVzZXMgYW5kIHRlcm1pbmF0ZS4KKyAgICAgKi8KKyAgICBpZiAoZGlkX3Rocm93KQorICAgIHsKKwkvKiBXaGVuIGRpc2NhcmRpbmcgYW4gaW50ZXJydXB0IGV4Y2VwdGlvbiwgcmVzZXQgZ290X2ludCB0byBwcmV2ZW50IHRoZQorCSAqIHNhbWUgaW50ZXJydXB0IGJlaW5nIGNvbnZlcnRlZCB0byBhbiBleGNlcHRpb24gYWdhaW4gYW5kIGRpc2NhcmRpbmcKKwkgKiB0aGUgZXJyb3IgZXhjZXB0aW9uIHdlIGFyZSBhYm91dCB0byB0aHJvdyBoZXJlLiAqLworCWlmIChjdXJyZW50X2V4Y2VwdGlvbi0+dHlwZSA9PSBFVF9JTlRFUlJVUFQpCisJICAgIGdvdF9pbnQgPSBGQUxTRTsKKwlkaXNjYXJkX2N1cnJlbnRfZXhjZXB0aW9uKCk7CisgICAgfQorCisjaWZkZWYgVEhST1dfVEVTVAorICAgIGlmICghVEhST1dfT05fRVJST1IpCisgICAgeworCS8qCisJICogUHJpbnQgZXJyb3IgbWVzc2FnZSBpbW1lZGlhdGVseSB3aXRob3V0IHNlYXJjaGluZyBmb3IgYSBtYXRjaGluZworCSAqIGNhdGNoIGNsYXVzZTsganVzdCBmaW5hbGx5IGNsYXVzZXMgYXJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgc2NyaXB0CisJICogaXMgdGVybWluYXRlZC4KKwkgKi8KKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIFByZXBhcmUgdGhlIHRocm93IG9mIGFuIGVycm9yIGV4Y2VwdGlvbiwgc28gdGhhdCBldmVyeXRoaW5nIHdpbGwKKwkgKiBiZSBhYm9ydGVkIChleGNlcHQgZm9yIGV4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZXMpLCB1bnRpbCB0aGUgZXJyb3IKKwkgKiBleGNlcHRpb24gaXMgY2F1Z2h0OyBpZiBzdGlsbCB1bmNhdWdodCBhdCB0aGUgdG9wIGxldmVsLCB0aGUgZXJyb3IKKwkgKiBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIGFuZCB0aGUgc2NyaXB0IHByb2Nlc3NpbmcgdGVybWluYXRlZAorCSAqIHRoZW4uICAtICBUaGlzIGZ1bmN0aW9uIGhhcyBubyBhY2Nlc3MgdG8gdGhlIGNvbmRpdGlvbmFsIHN0YWNrLgorCSAqIFRodXMsIHRoZSBhY3R1YWwgdGhyb3cgaXMgbWFkZSBhZnRlciB0aGUgZmFpbGluZyBjb21tYW5kIGhhcworCSAqIHJldHVybmVkLiAgLSAgVGhyb3cgb25seSB0aGUgZmlyc3Qgb2Ygc2V2ZXJhbCBlcnJvcnMgaW4gYSByb3csIGV4Y2VwdAorCSAqIGEgc2V2ZXJlIGVycm9yIGlzIGZvbGxvd2luZy4KKwkgKi8KKwlpZiAobXNnX2xpc3QgIT0gTlVMTCkKKwl7CisJICAgIHBsaXN0ID0gbXNnX2xpc3Q7CisJICAgIHdoaWxlICgqcGxpc3QgIT0gTlVMTCkKKwkJcGxpc3QgPSAmKCpwbGlzdCktPm5leHQ7CisKKwkgICAgZWxlbSA9IChzdHJ1Y3QgbXNnbGlzdCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2Yoc3RydWN0IG1zZ2xpc3QpKTsKKwkgICAgaWYgKGVsZW0gPT0gTlVMTCkKKwkgICAgeworCQlzdXBwcmVzc19lcnJ0aHJvdyA9IFRSVUU7CisJCUVNU0coXyhlX291dG9mbWVtKSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWVsZW0tPm1zZyA9IHZpbV9zdHJzYXZlKG1lc2cpOworCQlpZiAoZWxlbS0+bXNnID09IE5VTEwpCisJCXsKKwkJICAgIHZpbV9mcmVlKGVsZW0pOworCQkgICAgc3VwcHJlc3NfZXJydGhyb3cgPSBUUlVFOworCQkgICAgRU1TRyhfKGVfb3V0b2ZtZW0pKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGVsZW0tPm5leHQgPSBOVUxMOworCQkgICAgZWxlbS0+dGhyb3dfbXNnID0gTlVMTDsKKwkJICAgICpwbGlzdCA9IGVsZW07CisJCSAgICBpZiAocGxpc3QgPT0gbXNnX2xpc3QgfHwgc2V2ZXJlKQorCQkgICAgeworCQkJY2hhcl91CSAgICAqdG1zZzsKKworCQkJLyogU2tpcCB0aGUgZXh0cmEgIlZpbSAiIHByZWZpeCBmb3IgbWVzc2FnZSAiRTQ1OCIuICovCisJCQl0bXNnID0gZWxlbS0+bXNnOworCQkJaWYgKFNUUk5DTVAodG1zZywgIlZpbSBFIiwgNSkgPT0gMAorCQkJCSYmIFZJTV9JU0RJR0lUKHRtc2dbNV0pCisJCQkJJiYgVklNX0lTRElHSVQodG1zZ1s2XSkKKwkJCQkmJiBWSU1fSVNESUdJVCh0bXNnWzddKQorCQkJCSYmIHRtc2dbOF0gPT0gJzonCisJCQkJJiYgdG1zZ1s5XSA9PSAnICcpCisJCQkgICAgKCptc2dfbGlzdCktPnRocm93X21zZyA9ICZ0bXNnWzRdOworCQkJZWxzZQorCQkJICAgICgqbXNnX2xpc3QpLT50aHJvd19tc2cgPSB0bXNnOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKgorICogRnJlZSBhICJtc2dfbGlzdCIgYW5kIHRoZSBtZXNzYWdlcyBpdCBjb250YWlucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmVlX21zZ2xpc3QobCkKKyAgICBzdHJ1Y3QgbXNnbGlzdCAgKmw7Cit7CisgICAgc3RydWN0IG1zZ2xpc3QgICptZXNzYWdlcywgKm5leHQ7CisKKyAgICBtZXNzYWdlcyA9IGw7CisgICAgd2hpbGUgKG1lc3NhZ2VzICE9IE5VTEwpCisgICAgeworCW5leHQgPSBtZXNzYWdlcy0+bmV4dDsKKwl2aW1fZnJlZShtZXNzYWdlcy0+bXNnKTsKKwl2aW1fZnJlZShtZXNzYWdlcyk7CisJbWVzc2FnZXMgPSBuZXh0OworICAgIH0KK30KKworLyoKKyAqIFRocm93IHRoZSBtZXNzYWdlIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byBjYXVzZV9lcnJ0aHJvdygpIGFib3ZlIGFzIGFuCisgKiBlcnJvciBleGNlcHRpb24uICBJZiBjc3RhY2sgaXMgTlVMTCwgcG9zdHBvbmUgdGhlIHRocm93IHVudGlsIGRvX2NtZGxpbmUoKQorICogaGFzIHJldHVybmVkIChzZWUgZG9fb25lX2NtZCgpKS4KKyAqLworICAgIHZvaWQKK2RvX2VycnRocm93KGNzdGFjaywgY21kbmFtZSkKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2s7CisgICAgY2hhcl91CQkqY21kbmFtZTsKK3sKKyAgICAvKgorICAgICAqIEVuc3VyZSB0aGF0IGFsbCBjb21tYW5kcyBpbiBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMgYW5kIHNvdXJjZWQgZmlsZXMKKyAgICAgKiBhcmUgYWJvcnRlZCBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBpZiAoY2F1c2VfYWJvcnQpCisgICAgeworCWNhdXNlX2Fib3J0ID0gRkFMU0U7CisJZm9yY2VfYWJvcnQgPSBUUlVFOworICAgIH0KKworICAgIC8qIElmIG5vIGV4Y2VwdGlvbiBpcyB0byBiZSB0aHJvd24gb3IgdGhlIGNvbnZlcnNpb24gc2hvdWxkIGJlIGRvbmUgYWZ0ZXIKKyAgICAgKiByZXR1cm5pbmcgdG8gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGRvX29uZV9jbWQoKSwgZG8gbm90aGluZy4gKi8KKyAgICBpZiAoKm1zZ19saXN0ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKHRocm93X2V4Y2VwdGlvbigqbXNnX2xpc3QsIEVUX0VSUk9SLCBjbWRuYW1lKSA9PSBGQUlMKQorCWZyZWVfbXNnbGlzdCgqbXNnX2xpc3QpOworICAgIGVsc2UKKyAgICB7CisJaWYgKGNzdGFjayAhPSBOVUxMKQorCSAgICBkb190aHJvdyhjc3RhY2spOworCWVsc2UKKwkgICAgbmVlZF9yZXRocm93ID0gVFJVRTsKKyAgICB9CisgICAgKm1zZ19saXN0ID0gTlVMTDsKK30KKworLyoKKyAqIGRvX2ludHRocm93KCk6IFJlcGxhY2UgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGJ5IGFuIGludGVycnVwdCBvciBpbnRlcnJ1cHQKKyAqIGV4Y2VwdGlvbiBpZiBhcHByb3ByaWF0ZS4gIFJldHVybiBUUlVFIGlmIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQsCisgKiBGQUxTRSBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2RvX2ludHRocm93KGNzdGFjaykKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2s7Cit7CisgICAgLyoKKyAgICAgKiBJZiBubyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm8gdHJ5IGNvbmRpdGlvbmFsIGlzIGFjdGl2ZSBhbmQgbm8gZXhjZXB0aW9uCisgICAgICogaXMgYmVpbmcgdGhyb3duLCBkbyBub3RoaW5nIChmb3IgY29tcGF0aWJpbGl0eSBvZiBub24tRUggc2NyaXB0cykuCisgICAgICovCisgICAgaWYgKCFnb3RfaW50IHx8ICh0cnlsZXZlbCA9PSAwICYmICFkaWRfdGhyb3cpKQorCXJldHVybiBGQUxTRTsKKworI2lmZGVmIFRIUk9XX1RFU1QJLyogYXZvaWQgd2FybmluZyBmb3IgY29uZGl0aW9uIGFsd2F5cyB0cnVlICovCisgICAgaWYgKCFUSFJPV19PTl9JTlRFUlJVUFQpCisgICAgeworCS8qCisJICogVGhlIGludGVycnVwdCBhYm9ydHMgZXZlcnl0aGluZyBleGNlcHQgZm9yIGV4ZWN1dGluZyBmaW5hbGx5IGNsYXVzZXMuCisJICogRGlzY2FyZCBhbnkgdXNlciBvciBlcnJvciBvciBpbnRlcnJ1cHQgZXhjZXB0aW9uIGN1cnJlbnRseSBiZWluZworCSAqIHRocm93bi4KKwkgKi8KKwlpZiAoZGlkX3Rocm93KQorCSAgICBkaXNjYXJkX2N1cnJlbnRfZXhjZXB0aW9uKCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIFRocm93IGFuIGludGVycnVwdCBleGNlcHRpb24sIHNvIHRoYXQgZXZlcnl0aGluZyB3aWxsIGJlIGFib3J0ZWQKKwkgKiAoZXhjZXB0IGZvciBleGVjdXRpbmcgZmluYWxseSBjbGF1c2VzKSwgdW50aWwgdGhlIGludGVycnVwdCBleGNlcHRpb24KKwkgKiBpcyBjYXVnaHQ7IGlmIHN0aWxsIHVuY2F1Z2h0IGF0IHRoZSB0b3AgbGV2ZWwsIHRoZSBzY3JpcHQgcHJvY2Vzc2luZworCSAqIHdpbGwgYmUgdGVybWluYXRlZCB0aGVuLiAgLSAgSWYgYW4gaW50ZXJydXB0IGV4Y2VwdGlvbiBpcyBhbHJlYWR5CisJICogYmVpbmcgdGhyb3duLCBkbyBub3RoaW5nLgorCSAqCisJICovCisJaWYgKGRpZF90aHJvdykKKwl7CisJICAgIGlmIChjdXJyZW50X2V4Y2VwdGlvbi0+dHlwZSA9PSBFVF9JTlRFUlJVUFQpCisJCXJldHVybiBGQUxTRTsKKworCSAgICAvKiBBbiBpbnRlcnJ1cHQgZXhjZXB0aW9uIHJlcGxhY2VzIGFueSB1c2VyIG9yIGVycm9yIGV4Y2VwdGlvbi4gKi8KKwkgICAgZGlzY2FyZF9jdXJyZW50X2V4Y2VwdGlvbigpOworCX0KKwlpZiAodGhyb3dfZXhjZXB0aW9uKCJWaW06SW50ZXJydXB0IiwgRVRfSU5URVJSVVBULCBOVUxMKSAhPSBGQUlMKQorCSAgICBkb190aHJvdyhjc3RhY2spOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBUaHJvdyBhIG5ldyBleGNlcHRpb24uICBSZXR1cm4gRkFJTCB3aGVuIG91dCBvZiBtZW1vcnkgb3IgaXQgd2FzIHRyaWVkIHRvCisgKiB0aHJvdyBhbiBpbGxlZ2FsIHVzZXIgZXhjZXB0aW9uLiAgInZhbHVlIiBpcyB0aGUgZXhjZXB0aW9uIHN0cmluZyBmb3IgYSB1c2VyCisgKiBvciBpbnRlcnJ1cHQgZXhjZXB0aW9uLCBvciBwb2ludHMgdG8gYSBtZXNzYWdlIGxpc3QgaW4gY2FzZSBvZiBhbiBlcnJvcgorICogZXhjZXB0aW9uLgorICovCisgICAgc3RhdGljIGludAordGhyb3dfZXhjZXB0aW9uKHZhbHVlLCB0eXBlLCBjbWRuYW1lKQorICAgIHZvaWQJKnZhbHVlOworICAgIGludAkJdHlwZTsKKyAgICBjaGFyX3UJKmNtZG5hbWU7Cit7CisgICAgZXhjZXB0X1QJKmV4Y3A7CisgICAgY2hhcl91CSpwLCAqbWVzZywgKnZhbDsKKyAgICBpbnQJCWNtZGxlbjsKKworICAgIC8qCisgICAgICogRGlzYWxsb3cgZmFraW5nIEludGVycnVwdCBvciBlcnJvciBleGNlcHRpb25zIGFzIHVzZXIgZXhjZXB0aW9ucy4gIFRoZXkKKyAgICAgKiB3b3VsZCBiZSB0cmVhdGVkIGRpZmZlcmVudGx5IGZyb20gcmVhbCBpbnRlcnJ1cHQgb3IgZXJyb3IgZXhjZXB0aW9ucyB3aGVuCisgICAgICogbm8gYWN0aXZlIHRyeSBibG9jayBpcyBmb3VuZCwgc2VlIGRvX2NtZGxpbmUoKS4KKyAgICAgKi8KKyAgICBpZiAodHlwZSA9PSBFVF9VU0VSKQorICAgIHsKKwlpZiAoU1RSTkNNUCgoY2hhcl91ICopdmFsdWUsICJWaW0iLCAzKSA9PSAwICYmCisJCSgoKGNoYXJfdSAqKXZhbHVlKVszXSA9PSBOVUwgfHwgKChjaGFyX3UgKil2YWx1ZSlbM10gPT0gJzonIHx8CisJCSAoKGNoYXJfdSAqKXZhbHVlKVszXSA9PSAnKCcpKQorCXsKKwkgICAgRU1TRyhfKCJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiKSk7CisJICAgIGdvdG8gZmFpbDsKKwl9CisgICAgfQorCisgICAgZXhjcCA9IChleGNlcHRfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoZXhjZXB0X1QpKTsKKyAgICBpZiAoZXhjcCA9PSBOVUxMKQorCWdvdG8gbm9tZW07CisKKyAgICBpZiAodHlwZSA9PSBFVF9FUlJPUikKKyAgICB7CisJLyogU3RvcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYW5kIHByZWZpeCB0aGUgZXhjZXB0aW9uIHZhbHVlIHdpdGgKKwkgKiAiVmltOiIgb3IsIGlmIGEgY29tbWFuZCBuYW1lIGlzIGdpdmVuLCAiVmltKGNtZG5hbWUpOiIuICovCisJZXhjcC0+bWVzc2FnZXMgPSAoc3RydWN0IG1zZ2xpc3QgKil2YWx1ZTsKKwltZXNnID0gZXhjcC0+bWVzc2FnZXMtPnRocm93X21zZzsKKwlpZiAoY21kbmFtZSAhPSBOVUxMICYmICpjbWRuYW1lICE9IE5VTCkKKwl7CisJICAgIGNtZGxlbiA9IFNUUkxFTihjbWRuYW1lKTsKKwkgICAgZXhjcC0+dmFsdWUgPSB2aW1fc3RybnNhdmUoKGNoYXJfdSAqKSJWaW0oIiwKKwkJCQkJICAgNCArIGNtZGxlbiArIDIgKyAoaW50KVNUUkxFTihtZXNnKSk7CisJICAgIGlmIChleGNwLT52YWx1ZSA9PSBOVUxMKQorCQlnb3RvIG5vbWVtOworCSAgICBTVFJDUFkoJmV4Y3AtPnZhbHVlWzRdLCBjbWRuYW1lKTsKKwkgICAgU1RSQ1BZKCZleGNwLT52YWx1ZVs0ICsgY21kbGVuXSwgIik6Iik7CisJICAgIHZhbCA9IGV4Y3AtPnZhbHVlICsgNCArIGNtZGxlbiArIDI7CisJfQorCWVsc2UKKwl7CisJICAgIGV4Y3AtPnZhbHVlID0gdmltX3N0cm5zYXZlKChjaGFyX3UgKikiVmltOiIsIDQgKyAoaW50KVNUUkxFTihtZXNnKSk7CisJICAgIGlmIChleGNwLT52YWx1ZSA9PSBOVUxMKQorCQlnb3RvIG5vbWVtOworCSAgICB2YWwgPSBleGNwLT52YWx1ZSArIDQ7CisJfQorCisJLyogbXNnX2FkZF9mbmFtZSBtYXkgaGF2ZSBiZWVuIHVzZWQgdG8gcHJlZml4IHRoZSBtZXNzYWdlIHdpdGggYSBmaWxlCisJICogbmFtZSBpbiBxdW90ZXMuICBJbiB0aGUgZXhjZXB0aW9uIHZhbHVlLCBwdXQgdGhlIGZpbGUgbmFtZSBpbgorCSAqIHBhcmVudGhlc2VzIGFuZCBtb3ZlIGl0IHRvIHRoZSBlbmQuICovCisJZm9yIChwID0gbWVzZzsgOyBwKyspCisJeworCSAgICBpZiAoKnAgPT0gTlVMCisJCSAgICB8fCAoKnAgPT0gJ0UnCisJCQkmJiBWSU1fSVNESUdJVChwWzFdKQorCQkJJiYgKHBbMl0gPT0gJzonCisJCQkgICAgfHwgKFZJTV9JU0RJR0lUKHBbMl0pCisJCQkJJiYgKHBbM10gPT0gJzonCisJCQkJICAgIHx8IChWSU1fSVNESUdJVChwWzNdKQorCQkJCQkmJiBwWzRdID09ICc6JykpKSkpKQorCSAgICB7CisJCWlmICgqcCA9PSBOVUwgfHwgcCA9PSBtZXNnKSAgLyogJ0UxMjMnIG1pc3Npbmcgb3IgYXQgYmVnaW5uaW5nICovCisJCSAgICBTVFJDQVQodmFsLCBtZXNnKTsKKwkJZWxzZQorCQl7CisJCSAgICAvKiAnImZpbGVuYW1lIiBFMTIzOiBtZXNzYWdlIHRleHQnICovCisJCSAgICBpZiAobWVzZ1swXSAhPSAnIicgfHwgcC0yIDwgJm1lc2dbMV0gfHwKKwkJCSAgICBwWy0yXSAhPSAnIicgfHwgcFstMV0gIT0gJyAnKQorCQkJLyogIkUxMjM6IiBpcyBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUuICovCisJCQljb250aW51ZTsKKworCQkgICAgU1RSQ0FUKHZhbCwgcCk7CisJCSAgICBwWy0yXSA9IE5VTDsKKwkJICAgIHNwcmludGYoKGNoYXIgKikodmFsICsgU1RSTEVOKHApKSwgIiAoJXMpIiwgJm1lc2dbMV0pOworCQkgICAgcFstMl0gPSAnIic7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKwlleGNwLT52YWx1ZSA9IHZhbHVlOworCisgICAgZXhjcC0+dHlwZSA9IHR5cGU7CisgICAgZXhjcC0+dGhyb3dfbmFtZSA9IHZpbV9zdHJzYXZlKHNvdXJjaW5nX25hbWUgPT0gTlVMTAorCQkJCQkgICAgICA/IChjaGFyX3UgKikiIiA6IHNvdXJjaW5nX25hbWUpOworICAgIGlmIChleGNwLT50aHJvd19uYW1lID09IE5VTEwpCisgICAgeworCWlmICh0eXBlID09IEVUX0VSUk9SKQorCSAgICB2aW1fZnJlZShleGNwLT52YWx1ZSk7CisJZ290byBub21lbTsKKyAgICB9CisgICAgZXhjcC0+dGhyb3dfbG51bSA9IHNvdXJjaW5nX2xudW07CisKKyAgICBpZiAocF92ZXJib3NlID49IDEzIHx8IGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKyAgICB7CisJaW50CXNhdmVfbXNnX3NpbGVudCA9IG1zZ19zaWxlbnQ7CisKKwlpZiAoZGVidWdfYnJlYWtfbGV2ZWwgPiAwKQorCSAgICBtc2dfc2lsZW50ID0gRkFMU0U7CQkvKiBkaXNwbGF5IG1lc3NhZ2VzICovCisJKytub193YWl0X3JldHVybjsKKwltc2dfc2Nyb2xsID0gVFJVRTsJICAgIC8qIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZSAqLworCW1zZ19zdHIoKGNoYXJfdSAqKV8oIkV4Y2VwdGlvbiB0aHJvd246ICVzIiksIGV4Y3AtPnZhbHVlKTsKKwltc2dfcHV0cygoY2hhcl91ICopIlxuIik7ICAgLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgZWl0aGVyICovCisJY21kbGluZV9yb3cgPSBtc2dfcm93OworCS0tbm9fd2FpdF9yZXR1cm47CisJaWYgKGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKwkgICAgbXNnX3NpbGVudCA9IHNhdmVfbXNnX3NpbGVudDsKKyAgICB9CisKKyAgICBjdXJyZW50X2V4Y2VwdGlvbiA9IGV4Y3A7CisgICAgcmV0dXJuIE9LOworCitub21lbToKKyAgICB2aW1fZnJlZShleGNwKTsKKyAgICBzdXBwcmVzc19lcnJ0aHJvdyA9IFRSVUU7CisgICAgRU1TRyhfKGVfb3V0b2ZtZW0pKTsKK2ZhaWw6CisgICAgY3VycmVudF9leGNlcHRpb24gPSBOVUxMOworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogRGlzY2FyZCBhbiBleGNlcHRpb24uICAid2FzX2ZpbmlzaGVkIiBpcyBzZXQgd2hlbiB0aGUgZXhjZXB0aW9uIGhhcyBiZWVuCisgKiBjYXVnaHQgYW5kIHRoZSBjYXRjaCBjbGF1c2UgaGFzIGJlZW4gZW5kZWQgbm9ybWFsbHkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlzY2FyZF9leGNlcHRpb24oZXhjcCwgd2FzX2ZpbmlzaGVkKQorICAgIGV4Y2VwdF9UCQkqZXhjcDsKKyAgICBpbnQJCQl3YXNfZmluaXNoZWQ7Cit7CisgICAgY2hhcl91CQkqc2F2ZWRfSU9idWZmOworCisgICAgaWYgKGV4Y3AgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfaW50ZXJuYWwpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHBfdmVyYm9zZSA+PSAxMyB8fCBkZWJ1Z19icmVha19sZXZlbCA+IDApCisgICAgeworCWludAlzYXZlX21zZ19zaWxlbnQgPSBtc2dfc2lsZW50OworCisJc2F2ZWRfSU9idWZmID0gdmltX3N0cnNhdmUoSU9idWZmKTsKKwlpZiAoZGVidWdfYnJlYWtfbGV2ZWwgPiAwKQorCSAgICBtc2dfc2lsZW50ID0gRkFMU0U7CQkvKiBkaXNwbGF5IG1lc3NhZ2VzICovCisJKytub193YWl0X3JldHVybjsKKwltc2dfc2Nyb2xsID0gVFJVRTsJICAgIC8qIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZSAqLworCW1zZ19zdHIod2FzX2ZpbmlzaGVkCisJCSAgICA/IChjaGFyX3UgKilfKCJFeGNlcHRpb24gZmluaXNoZWQ6ICVzIikKKwkJICAgIDogKGNoYXJfdSAqKV8oIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIiksCisJCWV4Y3AtPnZhbHVlKTsKKwltc2dfcHV0cygoY2hhcl91ICopIlxuIik7ICAgLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgZWl0aGVyICovCisJY21kbGluZV9yb3cgPSBtc2dfcm93OworCS0tbm9fd2FpdF9yZXR1cm47CisJaWYgKGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKwkgICAgbXNnX3NpbGVudCA9IHNhdmVfbXNnX3NpbGVudDsKKwlTVFJDUFkoSU9idWZmLCBzYXZlZF9JT2J1ZmYpOworCXZpbV9mcmVlKHNhdmVkX0lPYnVmZik7CisgICAgfQorICAgIGlmIChleGNwLT50eXBlICE9IEVUX0lOVEVSUlVQVCkKKwl2aW1fZnJlZShleGNwLT52YWx1ZSk7CisgICAgaWYgKGV4Y3AtPnR5cGUgPT0gRVRfRVJST1IpCisJZnJlZV9tc2dsaXN0KGV4Y3AtPm1lc3NhZ2VzKTsKKyAgICB2aW1fZnJlZShleGNwLT50aHJvd19uYW1lKTsKKyAgICB2aW1fZnJlZShleGNwKTsKK30KKworLyoKKyAqIERpc2NhcmQgdGhlIGV4Y2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGhyb3duLgorICovCisgICAgdm9pZAorZGlzY2FyZF9jdXJyZW50X2V4Y2VwdGlvbigpCit7CisgICAgZGlzY2FyZF9leGNlcHRpb24oY3VycmVudF9leGNlcHRpb24sIEZBTFNFKTsKKyAgICBjdXJyZW50X2V4Y2VwdGlvbiA9IE5VTEw7CisgICAgZGlkX3Rocm93ID0gRkFMU0U7CisgICAgbmVlZF9yZXRocm93ID0gRkFMU0U7Cit9CisKKy8qCisgKiBQdXQgYW4gZXhjZXB0aW9uIG9uIHRoZSBjYXVnaHQgc3RhY2suCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2F0Y2hfZXhjZXB0aW9uKGV4Y3ApCisgICAgZXhjZXB0X1QJKmV4Y3A7Cit7CisgICAgZXhjcC0+Y2F1Z2h0ID0gY2F1Z2h0X3N0YWNrOworICAgIGNhdWdodF9zdGFjayA9IGV4Y3A7CisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0VYQ0VQVElPTiwgZXhjcC0+dmFsdWUsIC0xKTsKKyAgICBpZiAoKmV4Y3AtPnRocm93X25hbWUgIT0gTlVMKQorICAgIHsKKwlpZiAoZXhjcC0+dGhyb3dfbG51bSAhPSAwKQorCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCIlcywgbGluZSAlbGQiKSwgZXhjcC0+dGhyb3dfbmFtZSwKKwkJICAgIChsb25nKWV4Y3AtPnRocm93X2xudW0pOworCWVsc2UKKwkgICAgU1RSQ1BZKElPYnVmZiwgZXhjcC0+dGhyb3dfbmFtZSk7CisJc2V0X3ZpbV92YXJfc3RyaW5nKFZWX1RIUk9XUE9JTlQsIElPYnVmZiwgLTEpOworICAgIH0KKyAgICBlbHNlCisJLyogdGhyb3dfbmFtZSBub3Qgc2V0IG9uIGFuIGV4Y2VwdGlvbiBmcm9tIGEgY29tbWFuZCB0aGF0IHdhcyB0eXBlZC4gKi8KKwlzZXRfdmltX3Zhcl9zdHJpbmcoVlZfVEhST1dQT0lOVCwgTlVMTCwgLTEpOworCisgICAgaWYgKHBfdmVyYm9zZSA+PSAxMyB8fCBkZWJ1Z19icmVha19sZXZlbCA+IDApCisgICAgeworCWludAlzYXZlX21zZ19zaWxlbnQgPSBtc2dfc2lsZW50OworCisJaWYgKGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKwkgICAgbXNnX3NpbGVudCA9IEZBTFNFOwkJLyogZGlzcGxheSBtZXNzYWdlcyAqLworCSsrbm9fd2FpdF9yZXR1cm47CisJbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwltc2dfc3RyKChjaGFyX3UgKilfKCJFeGNlcHRpb24gY2F1Z2h0OiAlcyIpLCBleGNwLT52YWx1ZSk7CisJbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOyAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworCWNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKwktLW5vX3dhaXRfcmV0dXJuOworCWlmIChkZWJ1Z19icmVha19sZXZlbCA+IDApCisJICAgIG1zZ19zaWxlbnQgPSBzYXZlX21zZ19zaWxlbnQ7CisgICAgfQorfQorCisvKgorICogUmVtb3ZlIGFuIGV4Y2VwdGlvbiBmcm9tIHRoZSBjYXVnaHQgc3RhY2suCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZmluaXNoX2V4Y2VwdGlvbihleGNwKQorICAgIGV4Y2VwdF9UCSpleGNwOworeworICAgIGlmIChleGNwICE9IGNhdWdodF9zdGFjaykKKwlFTVNHKF8oZV9pbnRlcm5hbCkpOworICAgIGNhdWdodF9zdGFjayA9IGNhdWdodF9zdGFjay0+Y2F1Z2h0OworICAgIGlmIChjYXVnaHRfc3RhY2sgIT0gTlVMTCkKKyAgICB7CisJc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0VYQ0VQVElPTiwgY2F1Z2h0X3N0YWNrLT52YWx1ZSwgLTEpOworCWlmICgqY2F1Z2h0X3N0YWNrLT50aHJvd19uYW1lICE9IE5VTCkKKwl7CisJICAgIGlmIChjYXVnaHRfc3RhY2stPnRocm93X2xudW0gIT0gMCkKKwkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwKKwkJCV8oIiVzLCBsaW5lICVsZCIpLCBjYXVnaHRfc3RhY2stPnRocm93X25hbWUsCisJCQkobG9uZyljYXVnaHRfc3RhY2stPnRocm93X2xudW0pOworCSAgICBlbHNlCisJCVNUUkNQWShJT2J1ZmYsIGNhdWdodF9zdGFjay0+dGhyb3dfbmFtZSk7CisJICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9USFJPV1BPSU5ULCBJT2J1ZmYsIC0xKTsKKwl9CisJZWxzZQorCSAgICAvKiB0aHJvd19uYW1lIG5vdCBzZXQgb24gYW4gZXhjZXB0aW9uIGZyb20gYSBjb21tYW5kIHRoYXQgd2FzCisJICAgICAqIHR5cGVkLiAqLworCSAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfVEhST1dQT0lOVCwgTlVMTCwgLTEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXNldF92aW1fdmFyX3N0cmluZyhWVl9FWENFUFRJT04sIE5VTEwsIC0xKTsKKwlzZXRfdmltX3Zhcl9zdHJpbmcoVlZfVEhST1dQT0lOVCwgTlVMTCwgLTEpOworICAgIH0KKworICAgIC8qIERpc2NhcmQgdGhlIGV4Y2VwdGlvbiwgYnV0IHVzZSB0aGUgZmluaXNoIG1lc3NhZ2UgZm9yICd2ZXJib3NlJy4gKi8KKyAgICBkaXNjYXJkX2V4Y2VwdGlvbihleGNwLCBUUlVFKTsKK30KKworLyoKKyAqIEZsYWdzIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UgZGlzcGxheWVkIGJ5IHJlcG9ydF9wZW5kaW5nLgorICovCisjZGVmaW5lIFJQX01BS0UJCTAKKyNkZWZpbmUgUlBfUkVTVU1FCTEKKyNkZWZpbmUgUlBfRElTQ0FSRAkyCisKKy8qCisgKiBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgc29tZXRoaW5nIHBlbmRpbmcgaW4gYSBmaW5hbGx5IGNsYXVzZSBpZiByZXF1aXJlZCBieQorICogdGhlICd2ZXJib3NlJyBvcHRpb24gb3Igd2hlbiBkZWJ1Z2dpbmcuICAiYWN0aW9uIiB0ZWxscyB3aGV0aGVyIHNvbWV0aGluZyBpcworICogbWFkZSBwZW5kaW5nIG9yIHNvbWV0aGluZyBwZW5kaW5nIGlzIHJlc3VtZWQgb3IgZGlzY2FyZGVkLiAgInBlbmRpbmciIHRlbGxzCisgKiB3aGF0IGlzIHBlbmRpbmcuICAidmFsdWUiIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciBhIHBlbmRpbmcgIjpyZXR1cm4iCisgKiBvciB0aGUgZXhjZXB0aW9uIHZhbHVlIGZvciBhIHBlbmRpbmcgZXhjZXB0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK3JlcG9ydF9wZW5kaW5nKGFjdGlvbiwgcGVuZGluZywgdmFsdWUpCisgICAgaW50CQlhY3Rpb247CisgICAgaW50CQlwZW5kaW5nOworICAgIHZvaWQJKnZhbHVlOworeworICAgIGNoYXJfdQkqbWVzZzsKKyAgICBjaGFyCSpzOworICAgIGludAkJc2F2ZV9tc2dfc2lsZW50OworCisKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisJY2FzZSBSUF9NQUtFOgorCSAgICBtZXNnID0gKGNoYXJfdSAqKV8oIiVzIG1hZGUgcGVuZGluZyIpOworCSAgICBicmVhazsKKwljYXNlIFJQX1JFU1VNRToKKwkgICAgbWVzZyA9IChjaGFyX3UgKilfKCIlcyByZXN1bWVkIik7CisJICAgIGJyZWFrOworCS8qIGNhc2UgUlBfRElTQ0FSRDogKi8KKwlkZWZhdWx0OgorCSAgICBtZXNnID0gKGNoYXJfdSAqKV8oIiVzIGRpc2NhcmRlZCIpOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBlbmRpbmcpCisgICAgeworCWNhc2UgQ1NUUF9OT05FOgorCSAgICByZXR1cm47CisKKwljYXNlIENTVFBfQ09OVElOVUU6CisJICAgIHMgPSAiOmNvbnRpbnVlIjsKKwkgICAgYnJlYWs7CisJY2FzZSBDU1RQX0JSRUFLOgorCSAgICBzID0gIjpicmVhayI7CisJICAgIGJyZWFrOworCWNhc2UgQ1NUUF9GSU5JU0g6CisJICAgIHMgPSAiOmZpbmlzaCI7CisJICAgIGJyZWFrOworCWNhc2UgQ1NUUF9SRVRVUk46CisJICAgIC8qICI6cmV0dXJuIiBjb21tYW5kIHByb2R1Y2luZyB2YWx1ZSwgYWxsb2NhdGVkICovCisJICAgIHMgPSAoY2hhciAqKWdldF9yZXR1cm5fY21kKHZhbHVlKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBpZiAocGVuZGluZyAmIENTVFBfVEhST1cpCisJICAgIHsKKwkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgKGNoYXIgKiltZXNnLCBfKCJFeGNlcHRpb24iKSk7CisJCW1lc2cgPSB2aW1fc3RybnNhdmUoSU9idWZmLCAoaW50KVNUUkxFTihJT2J1ZmYpICsgNCk7CisJCVNUUkNBVChtZXNnLCAiOiAlcyIpOworCQlzID0gKGNoYXIgKikoKGV4Y2VwdF9UICopdmFsdWUpLT52YWx1ZTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgocGVuZGluZyAmIENTVFBfRVJST1IpICYmIChwZW5kaW5nICYgQ1NUUF9JTlRFUlJVUFQpKQorCQlzID0gXygiRXJyb3IgYW5kIGludGVycnVwdCIpOworCSAgICBlbHNlIGlmIChwZW5kaW5nICYgQ1NUUF9FUlJPUikKKwkJcyA9IF8oIkVycm9yIik7CisJICAgIGVsc2UgLyogaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkgKi8KKwkJcyA9IF8oIkludGVycnVwdCIpOworICAgIH0KKworICAgIHNhdmVfbXNnX3NpbGVudCA9IG1zZ19zaWxlbnQ7CisgICAgaWYgKGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKwltc2dfc2lsZW50ID0gRkFMU0U7CS8qIGRpc3BsYXkgbWVzc2FnZXMgKi8KKyAgICArK25vX3dhaXRfcmV0dXJuOworICAgIG1zZ19zY3JvbGwgPSBUUlVFOwkJLyogYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlICovCisgICAgbXNnX3N0cihtZXNnLCAoY2hhcl91ICopcyk7CisgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOyAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworICAgIGNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKyAgICAtLW5vX3dhaXRfcmV0dXJuOworICAgIGlmIChkZWJ1Z19icmVha19sZXZlbCA+IDApCisJbXNnX3NpbGVudCA9IHNhdmVfbXNnX3NpbGVudDsKKworICAgIGlmIChwZW5kaW5nID09IENTVFBfUkVUVVJOKQorCXZpbV9mcmVlKHMpOworICAgIGVsc2UgaWYgKHBlbmRpbmcgJiBDU1RQX1RIUk9XKQorCXZpbV9mcmVlKG1lc2cpOworfQorCisvKgorICogSWYgc29tZXRoaW5nIGlzIG1hZGUgcGVuZGluZyBpbiBhIGZpbmFsbHkgY2xhdXNlLCByZXBvcnQgaXQgaWYgcmVxdWlyZWQgYnkKKyAqIHRoZSAndmVyYm9zZScgb3B0aW9uIG9yIHdoZW4gZGVidWdnaW5nLgorICovCisgICAgdm9pZAorcmVwb3J0X21ha2VfcGVuZGluZyhwZW5kaW5nLCB2YWx1ZSkKKyAgICBpbnQJCXBlbmRpbmc7CisgICAgdm9pZAkqdmFsdWU7Cit7CisgICAgaWYgKHBfdmVyYm9zZSA+PSAxNCB8fCBkZWJ1Z19icmVha19sZXZlbCA+IDApCisJcmVwb3J0X3BlbmRpbmcoUlBfTUFLRSwgcGVuZGluZywgdmFsdWUpOworfQorCisvKgorICogSWYgc29tZXRoaW5nIHBlbmRpbmcgaW4gYSBmaW5hbGx5IGNsYXVzZSBpcyByZXN1bWVkIGF0IHRoZSAiOmVuZHRyeSIsIHJlcG9ydAorICogaXQgaWYgcmVxdWlyZWQgYnkgdGhlICd2ZXJib3NlJyBvcHRpb24gb3Igd2hlbiBkZWJ1Z2dpbmcuCisgKi8KKyAgICB2b2lkCityZXBvcnRfcmVzdW1lX3BlbmRpbmcocGVuZGluZywgdmFsdWUpCisgICAgaW50CQlwZW5kaW5nOworICAgIHZvaWQJKnZhbHVlOworeworICAgIGlmIChwX3ZlcmJvc2UgPj0gMTQgfHwgZGVidWdfYnJlYWtfbGV2ZWwgPiAwKQorCXJlcG9ydF9wZW5kaW5nKFJQX1JFU1VNRSwgcGVuZGluZywgdmFsdWUpOworfQorCisvKgorICogSWYgc29tZXRoaW5nIHBlbmRpbmcgaW4gYSBmaW5hbGx5IGNsYXVzZSBpcyBkaXNjYXJkZWQsIHJlcG9ydCBpdCBpZiByZXF1aXJlZAorICogYnkgdGhlICd2ZXJib3NlJyBvcHRpb24gb3Igd2hlbiBkZWJ1Z2dpbmcuCisgKi8KKyAgICB2b2lkCityZXBvcnRfZGlzY2FyZF9wZW5kaW5nKHBlbmRpbmcsIHZhbHVlKQorICAgIGludAkJcGVuZGluZzsKKyAgICB2b2lkCSp2YWx1ZTsKK3sKKyAgICBpZiAocF92ZXJib3NlID49IDE0IHx8IGRlYnVnX2JyZWFrX2xldmVsID4gMCkKKwlyZXBvcnRfcGVuZGluZyhSUF9ESVNDQVJELCBwZW5kaW5nLCB2YWx1ZSk7Cit9CisKKworLyoKKyAqICI6aWYiLgorICovCisgICAgdm9pZAorZXhfaWYoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWVycm9yOworICAgIGludAkJc2tpcDsKKyAgICBpbnQJCXJlc3VsdDsKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2sgPSBlYXAtPmNzdGFjazsKKworICAgIGlmIChjc3RhY2stPmNzX2lkeCA9PSBDU1RBQ0tfTEVOIC0gMSkKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiKTsKKyAgICBlbHNlCisgICAgeworCSsrY3N0YWNrLT5jc19pZHg7CisJY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gPSAwOworCisJLyoKKwkgKiBEb24ndCBkbyBzb21ldGhpbmcgYWZ0ZXIgYW4gZXJyb3IsIGludGVycnVwdCwgb3IgdGhyb3csIG9yIHdoZW4gdGhlcmUKKwkgKiBpcyBhIHN1cnJvdW5kaW5nIGNvbmRpdGlvbmFsIGFuZCBpdCB3YXMgbm90IGFjdGl2ZS4KKwkgKi8KKwlza2lwID0gZGlkX2Vtc2cgfHwgZ290X2ludCB8fCBkaWRfdGhyb3cgfHwgKGNzdGFjay0+Y3NfaWR4ID4gMAorCQkmJiAhKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHggLSAxXSAmIENTRl9BQ1RJVkUpKTsKKworCXJlc3VsdCA9IGV2YWxfdG9fYm9vbChlYXAtPmFyZywgJmVycm9yLCAmZWFwLT5uZXh0Y21kLCBza2lwKTsKKworCWlmICghc2tpcCAmJiAhZXJyb3IpCisJeworCSAgICBpZiAocmVzdWx0KQorCQljc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSA9IENTRl9BQ1RJVkUgfCBDU0ZfVFJVRTsKKwl9CisJZWxzZQorCSAgICAvKiBzZXQgVFJVRSwgc28gdGhpcyBjb25kaXRpb25hbCB3aWxsIG5ldmVyIGdldCBhY3RpdmUgKi8KKwkgICAgY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gPSBDU0ZfVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiAiOmVuZGlmIi4KKyAqLworICAgIHZvaWQKK2V4X2VuZGlmKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgZGlkX2VuZGlmID0gVFJVRTsKKyAgICBpZiAoZWFwLT5jc3RhY2stPmNzX2lkeCA8IDAKKwkgICAgfHwgKGVhcC0+Y3N0YWNrLT5jc19mbGFnc1tlYXAtPmNzdGFjay0+Y3NfaWR4XSAmCisJCShDU0ZfV0hJTEUgfCBDU0ZfVFJZKSkpCisJZWFwLT5lcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIpOworICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBXaGVuIGRlYnVnZ2luZyBvciBhIGJyZWFrcG9pbnQgd2FzIGVuY291bnRlcmVkLCBkaXNwbGF5IHRoZSBkZWJ1ZworCSAqIHByb21wdCAoaWYgbm90IGFscmVhZHkgZG9uZSkuICBUaGlzIHNob3dzIHRoZSB1c2VyIHRoYXQgYW4gIjplbmRpZiIKKwkgKiBpcyBleGVjdXRlZCB3aGVuIHRoZSAiOmlmIiBvciBhIHByZXZpb3VzICI6ZWxzZWlmIiB3YXMgbm90IFRSVUUuCisJICogSGFuZGxlIGEgIj5xdWl0IiBkZWJ1ZyBjb21tYW5kIGFzIGlmIGFuIGludGVycnVwdCBoYWQgb2NjdXJyZWQgYmVmb3JlCisJICogdGhlICI6ZW5kaWYiLiAgVGhhdCBpcywgdGhyb3cgYW4gaW50ZXJydXB0IGV4Y2VwdGlvbiBpZiBhcHByb3ByaWF0ZS4KKwkgKiBEb2luZyB0aGlzIGhlcmUgcHJldmVudHMgYW4gZXhjZXB0aW9uIGZvciBhIHBhcnNpbmcgZXJyb3IgYmVpbmcKKwkgKiBkaXNjYXJkZWQgYnkgdGhyb3dpbmcgdGhlIGludGVycnVwdCBleGNlcHRpb24gbGF0ZXIgb24uCisJICovCisJaWYgKCEoZWFwLT5jc3RhY2stPmNzX2ZsYWdzW2VhcC0+Y3N0YWNrLT5jc19pZHhdICYgQ1NGX1RSVUUpICYmCisJCWRiZ19jaGVja19za2lwcGVkKGVhcCkpCisJICAgICh2b2lkKWRvX2ludHRocm93KGVhcC0+Y3N0YWNrKTsKKworCS0tZWFwLT5jc3RhY2stPmNzX2lkeDsKKyAgICB9Cit9CisKKy8qCisgKiAiOmVsc2UiIGFuZCAiOmVsc2VpZiIuCisgKi8KKyAgICB2b2lkCitleF9lbHNlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQllcnJvcjsKKyAgICBpbnQJCXNraXA7CisgICAgaW50CQlyZXN1bHQ7CisgICAgc3RydWN0IGNvbmRzdGFjawkqY3N0YWNrID0gZWFwLT5jc3RhY2s7CisKKyAgICAvKgorICAgICAqIERvbid0IGRvIHNvbWV0aGluZyBhZnRlciBhbiBlcnJvciwgaW50ZXJydXB0LCBvciB0aHJvdywgb3Igd2hlbiB0aGVyZSBpcworICAgICAqIGEgc3Vycm91bmRpbmcgY29uZGl0aW9uYWwgYW5kIGl0IHdhcyBub3QgYWN0aXZlLgorICAgICAqLworICAgIHNraXAgPSBkaWRfZW1zZyB8fCBnb3RfaW50IHx8IGRpZF90aHJvdyB8fCAoY3N0YWNrLT5jc19pZHggPiAwCisJICAgICYmICEoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeCAtIDFdICYgQ1NGX0FDVElWRSkpOworCisgICAgaWYgKGNzdGFjay0+Y3NfaWR4IDwgMAorCSAgICB8fCAoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiAoQ1NGX1dISUxFIHwgQ1NGX1RSWSkpKQorICAgIHsKKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2Vsc2UpCisJeworCSAgICBlYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4MTogOmVsc2Ugd2l0aG91dCA6aWYiKTsKKwkgICAgcmV0dXJuOworCX0KKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIpOworCXNraXAgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9FTFNFKQorICAgIHsKKwlpZiAoZWFwLT5jbWRpZHggPT0gQ01EX2Vsc2UpCisJeworCSAgICBlYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4MzogbXVsdGlwbGUgOmVsc2UiKTsKKwkgICAgcmV0dXJuOworCX0KKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIpOworCXNraXAgPSBUUlVFOworICAgIH0KKworICAgIC8qIGlmIHNraXBwaW5nIG9yIHRoZSAiOmlmIiB3YXMgVFJVRSwgcmVzZXQgQUNUSVZFLCBvdGhlcndpc2Ugc2V0IGl0ICovCisgICAgaWYgKHNraXAgfHwgY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfVFJVRSkKKyAgICB7CisJaWYgKGVhcC0+ZXJybXNnID09IE5VTEwpCisJICAgIGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdID0gQ1NGX1RSVUU7CisJc2tpcCA9IFRSVUU7CS8qIGRvbid0IGV2YWx1YXRlIGFuICI6ZWxzZWlmIiAqLworICAgIH0KKyAgICBlbHNlCisJY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gPSBDU0ZfQUNUSVZFOworCisgICAgLyoKKyAgICAgKiBXaGVuIGRlYnVnZ2luZyBvciBhIGJyZWFrcG9pbnQgd2FzIGVuY291bnRlcmVkLCBkaXNwbGF5IHRoZSBkZWJ1ZyBwcm9tcHQKKyAgICAgKiAoaWYgbm90IGFscmVhZHkgZG9uZSkuICBUaGlzIHNob3dzIHRoZSB1c2VyIHRoYXQgYW4gIjplbHNlIiBvciAiOmVsc2VpZiIKKyAgICAgKiBpcyBleGVjdXRlZCB3aGVuIHRoZSAiOmlmIiBvciBwcmV2aW91cyAiOmVsc2VpZiIgd2FzIG5vdCBUUlVFLiAgSGFuZGxlCisgICAgICogYSAiPnF1aXQiIGRlYnVnIGNvbW1hbmQgYXMgaWYgYW4gaW50ZXJydXB0IGhhZCBvY2N1cnJlZCBiZWZvcmUgdGhlCisgICAgICogIjplbHNlIiBvciAiOmVsc2VpZiIuICBUaGF0IGlzLCBzZXQgInNraXAiIGFuZCB0aHJvdyBhbiBpbnRlcnJ1cHQKKyAgICAgKiBleGNlcHRpb24gaWYgYXBwcm9wcmlhdGUuICBEb2luZyB0aGlzIGhlcmUgcHJldmVudHMgdGhhdCBhbiBleGNlcHRpb24KKyAgICAgKiBmb3IgYSBwYXJzaW5nIGVycm9ycyBpcyBkaXNjYXJkZWQgd2hlbiB0aHJvd2luZyB0aGUgaW50ZXJydXB0IGV4Y2VwdGlvbgorICAgICAqIGxhdGVyIG9uLgorICAgICAqLworICAgIGlmICghc2tpcCAmJiBkYmdfY2hlY2tfc2tpcHBlZChlYXApICYmIGdvdF9pbnQpCisgICAgeworCSh2b2lkKWRvX2ludHRocm93KGNzdGFjayk7CisJc2tpcCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9lbHNlaWYpCisgICAgeworCXJlc3VsdCA9IGV2YWxfdG9fYm9vbChlYXAtPmFyZywgJmVycm9yLCAmZWFwLT5uZXh0Y21kLCBza2lwKTsKKwkvKiBXaGVuIHRocm93aW5nIGVycm9yIGV4Y2VwdGlvbnMsIHdlIHdhbnQgdG8gdGhyb3cgYWx3YXlzIHRoZSBmaXJzdAorCSAqIG9mIHNldmVyYWwgZXJyb3JzIGluIGEgcm93LiAgVGhpcyBpcyB3aGF0IGFjdHVhbGx5IGhhcHBlbnMgd2hlbgorCSAqIGEgY29uZGl0aW9uYWwgZXJyb3Igd2FzIGRldGVjdGVkIGFib3ZlIGFuZCB0aGVyZSBpcyBhbm90aGVyIGZhaWx1cmUKKwkgKiB3aGVuIHBhcnNpbmcgdGhlIGV4cHJlc3Npb24uICBTaW5jZSB0aGUgc2tpcCBmbGFnIGlzIHNldCBpbiB0aGlzCisJICogY2FzZSwgdGhlIHBhcnNpbmcgZXJyb3Igd2lsbCBiZSBpZ25vcmVkIGJ5IGVtc2coKS4gKi8KKworCWlmICghc2tpcCAmJiAhZXJyb3IpCisJeworCSAgICBpZiAocmVzdWx0KQorCQljc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSA9IENTRl9BQ1RJVkUgfCBDU0ZfVFJVRTsKKwkgICAgZWxzZQorCQljc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSA9IDA7CisJfQorCWVsc2UgaWYgKGVhcC0+ZXJybXNnID09IE5VTEwpCisJICAgIC8qIHNldCBUUlVFLCBzbyB0aGlzIGNvbmRpdGlvbmFsIHdpbGwgbmV2ZXIgZ2V0IGFjdGl2ZSAqLworCSAgICBjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSA9IENTRl9UUlVFOworICAgIH0KKyAgICBlbHNlCisJY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gfD0gQ1NGX0VMU0U7Cit9CisKKy8qCisgKiBIYW5kbGUgIjp3aGlsZSIuCisgKi8KKyAgICB2b2lkCitleF93aGlsZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJZXJyb3I7CisgICAgaW50CQlza2lwOworICAgIGludAkJcmVzdWx0OworICAgIHN0cnVjdCBjb25kc3RhY2sJKmNzdGFjayA9IGVhcC0+Y3N0YWNrOworCisgICAgaWYgKGNzdGFjay0+Y3NfaWR4ID09IENTVEFDS19MRU4gLSAxKQorCWVhcC0+ZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIpOworICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBjc19oYWRfd2hpbGUgaXMgc2V0IHdoZW4gd2UgaGF2ZSBqdW1wZWQgYmFjayBmcm9tIHRoZSBtYXRjaGluZworCSAqICI6ZW5kd2hpbGUiLiAgV2hlbiBub3Qgc2V0LCBuZWVkIHRvIGluaXRpYWxpc2UgdGhpcyBjc3RhY2sgZW50cnkuCisJICovCisJaWYgKCFjc3RhY2stPmNzX2hhZF93aGlsZSkKKwl7CisJICAgICsrY3N0YWNrLT5jc19pZHg7CisJICAgICsrY3N0YWNrLT5jc193aGlsZWxldmVsOworCSAgICBjc3RhY2stPmNzX2xpbmVbY3N0YWNrLT5jc19pZHhdID0gLTE7CisJfQorCWNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdID0gQ1NGX1dISUxFOworCisJLyoKKwkgKiBEb24ndCBkbyBzb21ldGhpbmcgYWZ0ZXIgYW4gZXJyb3IsIGludGVycnVwdCwgb3IgdGhyb3csIG9yIHdoZW4gdGhlcmUKKwkgKiBpcyBhIHN1cnJvdW5kaW5nIGNvbmRpdGlvbmFsIGFuZCBpdCB3YXMgbm90IGFjdGl2ZS4KKwkgKi8KKwlza2lwID0gZGlkX2Vtc2cgfHwgZ290X2ludCB8fCBkaWRfdGhyb3cgfHwgKGNzdGFjay0+Y3NfaWR4ID4gMAorCQkmJiAhKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHggLSAxXSAmIENTRl9BQ1RJVkUpKTsKKwlyZXN1bHQgPSBldmFsX3RvX2Jvb2woZWFwLT5hcmcsICZlcnJvciwgJmVhcC0+bmV4dGNtZCwgc2tpcCk7CisKKwkvKgorCSAqIElmIHRoaXMgY3N0YWNrIGVudHJ5IHdhcyBqdXN0IGluaXRpYWxpc2VkIGFuZCBpcyBhY3RpdmUsIHNldAorCSAqIGNzX2hhZF93aGlsZSBmbGFnLCBzbyBkb19jbWRsaW5lKCkgd2lsbCBzZXQgdGhlIGxpbmUgbnVtYmVyCisJICogaW4gY3NfbGluZVtdLgorCSAqLworCWlmICghc2tpcCAmJiAhZXJyb3IgJiYgcmVzdWx0KQorCXsKKwkgICAgY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gfD0gQ1NGX0FDVElWRSB8IENTRl9UUlVFOworCSAgICBjc3RhY2stPmNzX2hhZF93aGlsZSA9ICFjc3RhY2stPmNzX2hhZF93aGlsZTsKKwl9CisJZWxzZQorCXsKKwkgICAgY3N0YWNrLT5jc19oYWRfd2hpbGUgPSBGQUxTRTsKKwkgICAgLyogSWYgdGhlICI6d2hpbGUiIGV2YWx1YXRlcyB0byBGQUxTRSwgc2hvdyB0aGUgZGVidWcgcHJvbXB0IGF0IHRoZQorCSAgICAgKiAiOmVuZHdoaWxlIiBhcyBpZiB0aGVyZSB3YXMgYSAiOmJyZWFrIiBpbiBhICI6d2hpbGUiIGV2YWx1YXRpbmcKKwkgICAgICogdG8gVFJVRS4gKi8KKwkgICAgaWYgKCFza2lwICYmICFlcnJvcikKKwkJY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gfD0gQ1NGX1RSVUU7CisJfQorICAgIH0KK30KKworLyoKKyAqICI6Y29udGludWUiCisgKi8KKyAgICB2b2lkCitleF9jb250aW51ZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaWR4OworICAgIHN0cnVjdCBjb25kc3RhY2sJKmNzdGFjayA9IGVhcC0+Y3N0YWNrOworCisgICAgaWYgKGNzdGFjay0+Y3Nfd2hpbGVsZXZlbCA8PSAwIHx8IGNzdGFjay0+Y3NfaWR4IDwgMCkKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4NjogOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIik7CisgICAgZWxzZQorICAgIHsKKwkvKiBUcnkgdG8gZmluZCB0aGUgbWF0Y2hpbmcgIjp3aGlsZSIuICBUaGlzIG1pZ2h0IHN0b3AgYXQgYSB0cnkKKwkgKiBjb25kaXRpb25hbCBub3QgaW4gaXRzIGZpbmFsbHkgY2xhdXNlICh3aGljaCBpcyB0aGVuIHRvIGJlIGV4ZWN1dGVkCisJICogbmV4dCkuICBUaGVyZWZvciwgaW5hY3RpdmF0ZSBhbGwgY29uZGl0aW9uYWxzIGV4Y2VwdCB0aGUgIjp3aGlsZSIKKwkgKiBpdHNlbGYgKGlmIHJlYWNoZWQpLiAqLworCWlkeCA9IGNsZWFudXBfY29uZGl0aW9uYWxzKGNzdGFjaywgQ1NGX1dISUxFLCBGQUxTRSk7CisJaWYgKChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfV0hJTEUpKQorCXsKKwkgICAgaWYgKGNzdGFjay0+Y3NfaWR4ID4gaWR4KQorCQlyZXdpbmRfY29uZGl0aW9uYWxzKGNzdGFjaywgaWR4LCBDU0ZfVFJZLCAmY3N0YWNrLT5jc190cnlsZXZlbCk7CisKKwkgICAgLyoKKwkgICAgICogU2V0IGNzX2hhZF9jb250aW51ZSwgc28gZG9fY21kbGluZSgpIHdpbGwganVtcCBiYWNrIHRvIHRoZQorCSAgICAgKiBtYXRjaGluZyAiOndoaWxlIi4KKwkgICAgICovCisJICAgIGNzdGFjay0+Y3NfaGFkX2NvbnRpbnVlID0gVFJVRTsJLyogbGV0IGRvX2NtZGxpbmUoKSBoYW5kbGUgaXQgKi8KKwl9CisJZWxzZQorCXsKKwkgICAgLyogSWYgYSB0cnkgY29uZGl0aW9uYWwgbm90IGluIGl0cyBmaW5hbGx5IGNsYXVzZSBpcyByZWFjaGVkIGZpcnN0LAorCSAgICAgKiBtYWtlIHRoZSAiOmNvbnRpbnVlIiBwZW5kaW5nIGZvciBleGVjdXRpb24gYXQgdGhlICI6ZW5kdHJ5Ii4gKi8KKwkgICAgY3N0YWNrLT5jc19wZW5kaW5nW2lkeF0gPSBDU1RQX0NPTlRJTlVFOworCSAgICByZXBvcnRfbWFrZV9wZW5kaW5nKENTVFBfQ09OVElOVUUsIE5VTEwpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiAiOmJyZWFrIgorICovCisgICAgdm9pZAorZXhfYnJlYWsoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2sgPSBlYXAtPmNzdGFjazsKKworICAgIGlmIChjc3RhY2stPmNzX3doaWxlbGV2ZWwgPD0gMCB8fCBjc3RhY2stPmNzX2lkeCA8IDApCisJZWFwLT5lcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIpOworICAgIGVsc2UKKyAgICB7CisJLyogSW5hY3RpdmF0ZSBjb25kaXRpb25hbHMgdW50aWwgdGhlIG1hdGNoaW5nICI6d2hpbGUiIG9yIGEgdHJ5CisJICogY29uZGl0aW9uYWwgbm90IGluIGl0cyBmaW5hbGx5IGNsYXVzZSAod2hpY2ggaXMgdGhlbiB0byBiZQorCSAqIGV4ZWN1dGVkIG5leHQpIGlzIGZvdW5kLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBtYWtlIHRoZSAiOmJyZWFrIgorCSAqIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbiBhdCB0aGUgIjplbmR0cnkiLiAqLworCWlkeCA9IGNsZWFudXBfY29uZGl0aW9uYWxzKGNzdGFjaywgQ1NGX1dISUxFLCBUUlVFKTsKKwlpZiAoIShjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfV0hJTEUpKQorCXsKKwkgICAgY3N0YWNrLT5jc19wZW5kaW5nW2lkeF0gPSBDU1RQX0JSRUFLOworCSAgICByZXBvcnRfbWFrZV9wZW5kaW5nKENTVFBfQlJFQUssIE5VTEwpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiAiOmVuZHdoaWxlIgorICovCisgICAgdm9pZAorZXhfZW5kd2hpbGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2sgPSBlYXAtPmNzdGFjazsKKyAgICBpbnQJCWlkeDsKKworICAgIGlmIChjc3RhY2stPmNzX3doaWxlbGV2ZWwgPD0gMCB8fCBjc3RhY2stPmNzX2lkeCA8IDApCisJZWFwLT5lcnJtc2cgPSBlX3doaWxlOworICAgIGVsc2UKKyAgICB7CisJaWYgKCEoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfV0hJTEUpKQorCXsKKwkgICAgLyogVHJ5IHRvIGZpbmQgdGhlIG1hdGNoaW5nICI6d2hpbGUiIGFuZCByZXBvcnQgd2hhdCdzIG1pc3NpbmcuICovCisJICAgIGlmICghKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdICYgQ1NGX1RSWSkpCisJCWVhcC0+ZXJybXNnID0gZV9lbmRpZjsKKwkgICAgZWxzZSBpZiAoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfRklOQUxMWSkKKwkJZWFwLT5lcnJtc2cgPSBlX2VuZHRyeTsKKwkgICAgZm9yIChpZHggPSBjc3RhY2stPmNzX2lkeDsgaWR4ID4gMDsgLS1pZHgpCisJICAgIHsKKwkJaWYgKChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfVFJZKQorCQkJJiYgIShjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfRklOQUxMWSkpCisJCXsKKwkJICAgIC8qIEdpdmUgdXAgYXQgYSB0cnkgY29uZGl0aW9uYWwgbm90IGluIGl0cyBmaW5hbGx5IGNsYXVzZS4KKwkJICAgICAqIElnbm9yZSB0aGUgIjplbmR3aGlsZSIuICovCisJCSAgICBlYXAtPmVycm1zZyA9IGVfd2hpbGU7CisJCSAgICByZXR1cm47CisJCX0KKwkJaWYgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9XSElMRSkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIC8qIENsZWFudXAgYW5kIHJld2luZCBhbGwgY29udGFpbmVkIChhbmQgdW5jbG9zZWQpIGNvbmRpdGlvbmFscy4gKi8KKwkgICAgKHZvaWQpY2xlYW51cF9jb25kaXRpb25hbHMoY3N0YWNrLCBDU0ZfV0hJTEUsIEZBTFNFKTsKKwkgICAgcmV3aW5kX2NvbmRpdGlvbmFscyhjc3RhY2ssIGlkeCwgQ1NGX1RSWSwgJmNzdGFjay0+Y3NfdHJ5bGV2ZWwpOworCX0KKworCS8qCisJICogV2hlbiBkZWJ1Z2dpbmcgb3IgYSBicmVha3BvaW50IHdhcyBlbmNvdW50ZXJlZCwgZGlzcGxheSB0aGUgZGVidWcKKwkgKiBwcm9tcHQgKGlmIG5vdCBhbHJlYWR5IGRvbmUpLiAgVGhpcyBzaG93cyB0aGUgdXNlciB0aGF0IGFuCisJICogIjplbndoaWxlIiBpcyBleGVjdXRlZCB3aGVuIHRoZSAiOndoaWxlIiB3YXMgbm90IFRSVUUgb3IgYWZ0ZXIKKwkgKiBhICI6YnJlYWsiLiAgSGFuZGxlIGEgIj5xdWl0IiBkZWJ1ZyBjb21tYW5kIGFzIGlmIGFuIGludGVycnVwdAorCSAqIGhhZCBvY2N1cnJlZCBiZWZvcmUgdGhlICI6ZW5kd2hpbGUiLiAgVGhhdCBpcywgdGhyb3cgYW4gaW50ZXJydXB0CisJICogZXhjZXB0aW9uIGlmIGFwcHJvcHJpYXRlLiAgRG9pbmcgdGhpcyBoZXJlIHByZXZlbnRzIHRoYXQgYW4KKwkgKiBleGNlcHRpb24gZm9yIGEgcGFyc2luZyBlcnJvciBpcyBkaXNjYXJkZWQgd2hlbiB0aHJvd2luZyB0aGUKKwkgKiBpbnRlcnJ1cHQgZXhjZXB0aW9uIGxhdGVyIG9uLgorCSAqLworCWVsc2UgaWYgKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdICYgQ1NGX1RSVUUKKwkJJiYgIShjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9BQ1RJVkUpCisJCSYmIGRiZ19jaGVja19za2lwcGVkKGVhcCkpCisJICAgICh2b2lkKWRvX2ludHRocm93KGNzdGFjayk7CisKKwkvKgorCSAqIFNldCBjc19oYWRfZW5kd2hpbGUsIHNvIGRvX2NtZGxpbmUoKSB3aWxsIGp1bXAgYmFjayB0byB0aGUgbWF0Y2hpbmcKKwkgKiAiOndoaWxlIi4KKwkgKi8KKwljc3RhY2stPmNzX2hhZF9lbmR3aGlsZSA9IFRSVUU7CisgICAgfQorfQorCisKKy8qCisgKiAiOnRocm93IGV4cHIiCisgKi8KKyAgICB2b2lkCitleF90aHJvdyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSp2YWx1ZTsKKworICAgIGlmICgqYXJnICE9IE5VTCAmJiAqYXJnICE9ICd8JyAmJiAqYXJnICE9ICdcbicpCisJdmFsdWUgPSBldmFsX3RvX3N0cmluZ19za2lwKGFyZywgJmVhcC0+bmV4dGNtZCwgZWFwLT5za2lwKTsKKyAgICBlbHNlCisgICAgeworCUVNU0coXyhlX2FyZ3JlcSkpOworCXZhbHVlID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBPbiBlcnJvciBvciB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGFyZ3VtZW50IGV2YWx1YXRpb24sIGRvCisgICAgICogbm90IHRocm93LiAqLworICAgIGlmICghZWFwLT5za2lwICYmIHZhbHVlICE9IE5VTEwpCisgICAgeworCWlmICh0aHJvd19leGNlcHRpb24odmFsdWUsIEVUX1VTRVIsIE5VTEwpID09IEZBSUwpCisJICAgIHZpbV9mcmVlKHZhbHVlKTsKKwllbHNlCisJICAgIGRvX3Rocm93KGVhcC0+Y3N0YWNrKTsKKyAgICB9Cit9CisKKy8qCisgKiBUaHJvdyB0aGUgY3VycmVudCBleGNlcHRpb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGNzdGFjay4gIENvbW1vbiByb3V0aW5lIGZvcgorICogIjp0aHJvdyIgKHVzZXIgZXhjZXB0aW9uKSBhbmQgZXJyb3IgYW5kIGludGVycnVwdCBleGNlcHRpb25zLiAgQWxzbyB1c2VkIGZvcgorICogcmV0aHJvd2luZyBhbiB1bmNhdWdodCBleGNlcHRpb24uCisgKi8KKyAgICB2b2lkCitkb190aHJvdyhjc3RhY2spCisgICAgc3RydWN0IGNvbmRzdGFjawkqY3N0YWNrOworeworICAgIGludAkJaWR4OworICAgIGludAkJaW5hY3RpdmF0ZV90cnkgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogQ2xlYW51cCBhbmQgaW5hY3RpdmF0ZSB1cCB0byB0aGUgbmV4dCBzdXJyb3VuZGluZyB0cnkgY29uZGl0aW9uYWwgdGhhdAorICAgICAqIGlzIG5vdCBpbiBpdHMgZmluYWxseSBjbGF1c2UuICBOb3JtYWxseSwgZG8gbm90IGluYWN0aXZhdGUgdGhlIHRyeQorICAgICAqIGNvbmRpdGlvbmFsIGl0c2VsZiwgc28gdGhhdCBpdHMgQUNUSVZFIGZsYWcgY2FuIGJlIHRlc3RlZCBiZWxvdy4gIEJ1dAorICAgICAqIGlmIGEgcHJldmlvdXMgZXJyb3Igb3IgaW50ZXJydXB0IGhhcyBub3QgYmVlbiBjb252ZXJ0ZWQgdG8gYW4gZXhjZXB0aW9uLAorICAgICAqIGluYWN0aXZhdGUgdGhlIHRyeSBjb25kaXRpb25hbCwgdG9vLCBhcyBpZiB0aGUgY29udmVyc2lvbiBoYWQgYmVlbiBkb25lLAorICAgICAqIGFuZCByZXNldCB0aGUgZGlkX2Vtc2cgb3IgZ290X2ludCBmbGFnLCBzbyB0aGlzIHdvbid0IGhhcHBlbiBhZ2FpbiBhdCB0aGUKKyAgICAgKiBuZXh0IHN1cnJvdW5kaW5nIHRyeSBjb25kaXRpb25hbC4KKyAgICAgKi8KKyAgICBpZiAoZGlkX2Vtc2cgJiYgIVRIUk9XX09OX0VSUk9SKQorICAgIHsKKwlpbmFjdGl2YXRlX3RyeSA9IFRSVUU7CisJZGlkX2Vtc2cgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKGdvdF9pbnQgJiYgIVRIUk9XX09OX0lOVEVSUlVQVCkKKyAgICB7CisJaW5hY3RpdmF0ZV90cnkgPSBUUlVFOworCWdvdF9pbnQgPSBGQUxTRTsKKyAgICB9CisgICAgaWR4ID0gY2xlYW51cF9jb25kaXRpb25hbHMoY3N0YWNrLCAwLCBpbmFjdGl2YXRlX3RyeSk7CisgICAgaWYgKGlkeCA+PSAwKQorICAgIHsKKwkvKgorCSAqIElmIHRoaXMgdHJ5IGNvbmRpdGlvbmFsIGlzIGFjdGl2ZSBhbmQgd2UgYXJlIGJlZm9yZSBpdHMgZmlyc3QKKwkgKiAiOmNhdGNoIiwgc2V0IFRIUk9XTiBzbyB0aGF0IHRoZSAiOmNhdGNoIiBjb21tYW5kcyB3aWxsIGNoZWNrIHdoZXRoZXIKKwkgKiB0aGUgZXhjZXB0aW9uIG1hdGNoZXMuICBXaGVuIHRoZSBleGNlcHRpb24gY2FtZSBmcm9tIGFueSBvZiB0aGUKKwkgKiBjYXRjaCBjbGF1c2VzLCBpdCB3aWxsIGJlIG1hZGUgcGVuZGluZyBhdCB0aGUgIjpmaW5hbGx5IiAoaWYgcHJlc2VudCkKKwkgKiBhbmQgcmV0aHJvd24gYXQgdGhlICI6ZW5kdHJ5Ii4gIFRoaXMgd2lsbCBhbHNvIGhhcHBlbiBpZiB0aGUgdHJ5CisJICogY29uZGl0aW9uYWwgaXMgaW5hY3RpdmUuICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gd2UgYXJlIHRocm93aW5nIGFuCisJICogZXhjZXB0aW9uIGR1ZSB0byBhbiBlcnJvciBvciBpbnRlcnJ1cHQgb24gdGhlIHdheSBmcm9tIGEgcHJlY2VkaW5nCisJICogIjpjb250aW51ZSIsICI6YnJlYWsiLCAiOnJldHVybiIsICI6ZmluaXNoIiwgZXJyb3Igb3IgaW50ZXJydXB0IChub3QKKwkgKiBjb252ZXJ0ZWQgdG8gYW4gZXhjZXB0aW9uKSB0byB0aGUgZmluYWxseSBjbGF1c2Ugb3IgZnJvbSBhIHByZWNlZGluZworCSAqIHRocm93IG9mIGEgdXNlciBvciBlcnJvciBvciBpbnRlcnJ1cHQgZXhjZXB0aW9uIHRvIHRoZSBtYXRjaGluZyBjYXRjaAorCSAqIGNsYXVzZSBvciB0aGUgZmluYWxseSBjbGF1c2UuCisJICovCisJaWYgKCEoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX0NBVUdIVCkpCisJeworCSAgICBpZiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX0FDVElWRSkKKwkJY3N0YWNrLT5jc19mbGFnc1tpZHhdIHw9IENTRl9USFJPV047CisJICAgIGVsc2UKKwkJLyogVEhST1dOIG1heSBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIGEgY2F0Y2hhYmxlIGV4Y2VwdGlvbgorCQkgKiB0aGF0IGhhcyBiZWVuIGRpc2NhcmRlZC4gIEVuc3VyZSBpdCBpcyByZXNldCBmb3IgdGhlIG5ldworCQkgKiBleGNlcHRpb24uICovCisJCWNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmPSB+Q1NGX1RIUk9XTjsKKwl9CisJY3N0YWNrLT5jc19mbGFnc1tpZHhdICY9IH5DU0ZfQUNUSVZFOworCWNzdGFjay0+Y3NfZXhjZXB0aW9uW2lkeF0gPSBjdXJyZW50X2V4Y2VwdGlvbjsKKyAgICB9CisjaWYgMAorICAgIC8qIFRPRE86IEFkZCBvcHRpbWl6YXRpb24gYmVsb3cuICBOb3QgeWV0IGRvbmUgYmVjYXVzZSBvZiBpbnRlcmZhY2UgcHJvYmxlbXMKKyAgICAgKiB0byBldmFsLmMgYW5kIGV4X2NtZHMyLmMuIChTZXJ2YXRpdXMpICovCisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIFRoZXJlIGFyZSBubyBjYXRjaCBjbGF1c2VzIHRvIGNoZWNrIG9yIGZpbmFsbHkgY2xhdXNlcyB0byBleGVjdXRlLgorCSAqIEVuZCB0aGUgY3VycmVudCBzY3JpcHQgb3IgZnVuY3Rpb24uICBUaGUgZXhjZXB0aW9uIHdpbGwgYmUgcmV0aHJvd24KKwkgKiBpbiB0aGUgY2FsbGVyLgorCSAqLworCWlmIChnZXRsaW5lX2VxdWFsKGVhcC0+Z2V0bGluZSwgZWFwLT5jb29raWUsIGdldF9mdW5jX2xpbmUpKQorCSAgICBjdXJyZW50X2Z1bmNjYWwtPnJldHVybmVkID0gVFJVRTsKKwllbHNlaWYgKGVhcC0+Z2V0X2Z1bmNfbGluZSA9PSBnZXRzb3VyY2VsaW5lKQorCSAgICAoKHN0cnVjdCBzb3VyY2VfY29va2llICopZWFwLT5jb29raWUpLT5maW5pc2hlZCA9IFRSVUU7CisgICAgfQorI2VuZGlmCisKKyAgICBkaWRfdGhyb3cgPSBUUlVFOworfQorCisvKgorICogIjp0cnkiCisgKi8KKyAgICB2b2lkCitleF90cnkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCXNraXA7CisgICAgc3RydWN0IGNvbmRzdGFjawkqY3N0YWNrID0gZWFwLT5jc3RhY2s7CisKKyAgICBpZiAoY3N0YWNrLT5jc19pZHggPT0gQ1NUQUNLX0xFTiAtIDEpCisJZWFwLT5lcnJtc2cgPSAoY2hhcl91ICopTl8oIkU2MDE6IDp0cnkgbmVzdGluZyB0b28gZGVlcCIpOworICAgIGVsc2UKKyAgICB7CisJKytjc3RhY2stPmNzX2lkeDsKKwkrK2NzdGFjay0+Y3NfdHJ5bGV2ZWw7CisJY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gPSBDU0ZfVFJZOworCWNzdGFjay0+Y3NfcGVuZGluZ1tjc3RhY2stPmNzX2lkeF0gPSBDU1RQX05PTkU7CisKKwkvKgorCSAqIERvbid0IGRvIHNvbWV0aGluZyBhZnRlciBhbiBlcnJvciwgaW50ZXJydXB0LCBvciB0aHJvdywgb3Igd2hlbiB0aGVyZQorCSAqIGlzIGEgc3Vycm91bmRpbmcgY29uZGl0aW9uYWwgYW5kIGl0IHdhcyBub3QgYWN0aXZlLgorCSAqLworCXNraXAgPSBkaWRfZW1zZyB8fCBnb3RfaW50IHx8IGRpZF90aHJvdyB8fCAoY3N0YWNrLT5jc19pZHggPiAwCisJCSYmICEoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeCAtIDFdICYgQ1NGX0FDVElWRSkpOworCisJaWYgKCFza2lwKQorCXsKKwkgICAgLyogU2V0IEFDVElWRSBhbmQgVFJVRS4gIFRSVUUgbWVhbnMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAiOmNhdGNoIgorCSAgICAgKiBjb21tYW5kcyBzaG91bGQgY2hlY2sgZm9yIGEgbWF0Y2ggaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQKKwkgICAgICogdGhhdCB0aGUgZmluYWxseSBjbGF1c2UgbmVlZHMgdG8gYmUgZXhlY3V0ZWQuICovCisJICAgIGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdIHw9IENTRl9BQ1RJVkUgfCBDU0ZfVFJVRTsKKworCSAgICAvKgorCSAgICAgKiAiOnNpbGVudCEiLCBldmVuIHdoZW4gdXNlZCBpbiBhIHRyeSBjb25kaXRpb25hbCwgZGlzYWJsZXMKKwkgICAgICogZGlzcGxheWluZyBvZiBlcnJvciBtZXNzYWdlcyBhbmQgY29udmVyc2lvbiBvZiBlcnJvcnMgdG8KKwkgICAgICogZXhjZXB0aW9ucy4gIFdoZW4gdGhlIHNpbGVudCBjb21tYW5kcyBhZ2FpbiBvcGVuIGEgdHJ5CisJICAgICAqIGNvbmRpdGlvbmFsLCBzYXZlICJlbXNnX3NpbGVudCIgYW5kIHJlc2V0IGl0IHNvIHRoYXQgZXJyb3JzIGFyZQorCSAgICAgKiBhZ2FpbiBjb252ZXJ0ZWQgdG8gZXhjZXB0aW9ucy4gIFRoZSB2YWx1ZSBpcyByZXN0b3JlZCB3aGVuIHRoYXQKKwkgICAgICogdHJ5IGNvbmRpdGlvbmFsIGlzIGxlZnQuICBJZiBpdCBpcyBsZWZ0IG5vcm1hbGx5LCB0aGUgY29tbWFuZHMKKwkgICAgICogZm9sbG93aW5nIHRoZSAiOmVuZHRyeSIgYXJlIGFnYWluIHNpbGVudC4gIElmIGl0IGlzIGxlZnQgYnkKKwkgICAgICogYSAiOmNvbnRpbnVlIiwgIjpicmVhayIsICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giLCB0aGUgY29tbWFuZHMKKwkgICAgICogZXhlY3V0ZWQgbmV4dCBhcmUgYWdhaW4gc2lsZW50LiAgSWYgaXQgaXMgbGVmdCBkdWUgdG8gYW4KKwkgICAgICogYWJvcnRpbmcgZXJyb3IsIGFuIGludGVycnVwdCwgb3IgYW4gZXhjZXB0aW9uLCByZXN0b3JpbmcKKwkgICAgICogImVtc2dfc2lsZW50IiBkb2VzIG5vdCBtYXR0ZXIgc2luY2Ugd2UgYXJlIGFscmVhZHkgaW4gdGhlCisJICAgICAqIGFib3J0aW5nIHN0YXRlIGFuZC9vciB0aGUgZXhjZXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gdGhyb3duLgorCSAgICAgKiBUaGUgZWZmZWN0IGlzIHRoZW4ganVzdCBmcmVlaW5nIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkCisJICAgICAqIHRvIHNhdmUgdGhlIHZhbHVlLgorCSAgICAgKi8KKwkgICAgaWYgKGVtc2dfc2lsZW50KQorCSAgICB7CisJCWVzbGlzdF9UCSplbGVtOworCisJCWVsZW0gPSAoZXNsaXN0X1QgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKHN0cnVjdCBlc2xpc3RfZWxlbSkpOworCQlpZiAoZWxlbSA9PSBOVUxMKQorCQkgICAgRU1TRyhfKGVfb3V0b2ZtZW0pKTsKKwkJZWxzZQorCQl7CisJCSAgICBlbGVtLT5zYXZlZF9lbXNnX3NpbGVudCA9IGVtc2dfc2lsZW50OworCQkgICAgZWxlbS0+bmV4dCA9IGNzdGFjay0+Y3NfZW1zZ19zaWxlbnRfbGlzdDsKKwkJICAgIGNzdGFjay0+Y3NfZW1zZ19zaWxlbnRfbGlzdCA9IGVsZW07CisJCSAgICBjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSB8PSBDU0ZfU0lMRU5UOworCQkgICAgZW1zZ19zaWxlbnQgPSAwOworCQl9CisJICAgIH0KKwl9CisKKyAgICB9Cit9CisKKy8qCisgKiAiOmNhdGNoIC97cGF0dGVybn0vIiBhbmQgIjpjYXRjaCIKKyAqLworICAgIHZvaWQKK2V4X2NhdGNoKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlpZHggPSAwOworICAgIGludAkJZ2l2ZV91cCA9IEZBTFNFOworICAgIGludAkJc2tpcCA9IEZBTFNFOworICAgIGludAkJY2F1Z2h0ID0gRkFMU0U7CisgICAgY2hhcl91CSplbmQ7CisgICAgaW50CQlzYXZlX2NoYXIgPSAwOworICAgIGNoYXJfdQkqc2F2ZV9jcG87CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICBpbnQJCXByZXZfZ290X2ludDsKKyAgICBzdHJ1Y3QgY29uZHN0YWNrCSpjc3RhY2sgPSBlYXAtPmNzdGFjazsKKyAgICBjaGFyX3UJKnBhdDsKKworICAgIGlmIChjc3RhY2stPmNzX3RyeWxldmVsIDw9IDAgfHwgY3N0YWNrLT5jc19pZHggPCAwKQorICAgIHsKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIpOworCWdpdmVfdXAgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmICghKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdICYgQ1NGX1RSWSkpCisJeworCSAgICAvKiBSZXBvcnQgd2hhdCdzIG1pc3NpbmcgaWYgdGhlIG1hdGNoaW5nICI6dHJ5IiBpcyBub3QgaW4gaXRzCisJICAgICAqIGZpbmFsbHkgY2xhdXNlLiAqLworCSAgICBpZiAoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfV0hJTEUpCisJCWVhcC0+ZXJybXNnID0gZV9lbmR3aGlsZTsKKwkgICAgZWxzZQorCQllYXAtPmVycm1zZyA9IGVfZW5kaWY7CisJICAgIHNraXAgPSBUUlVFOworCX0KKwlmb3IgKGlkeCA9IGNzdGFjay0+Y3NfaWR4OyBpZHggPiAwOyAtLWlkeCkKKwkgICAgaWYgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9UUlkpCisJCWJyZWFrOworCWlmIChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfRklOQUxMWSkKKwl7CisJICAgIC8qIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorCSAgICAgKiBKdXN0IHBhcnNlLiAqLworCSAgICBlYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5Iik7CisJICAgIGdpdmVfdXAgPSBUUlVFOworCX0KKwllbHNlIGlmIChjc3RhY2stPmNzX2lkeCA+IGlkeCkKKwkgICAgcmV3aW5kX2NvbmRpdGlvbmFscyhjc3RhY2ssIGlkeCwgQ1NGX1dISUxFLCAmY3N0YWNrLT5jc193aGlsZWxldmVsKTsKKyAgICB9CisKKyAgICBpZiAoZW5kc19leGNtZCgqZWFwLT5hcmcpKQkvKiBubyBhcmd1bWVudCwgY2F0Y2ggYWxsIGVycm9ycyAqLworICAgIHsKKwlwYXQgPSAoY2hhcl91ICopIi4qIjsKKwllbmQgPSBOVUxMOworCWVhcC0+bmV4dGNtZCA9IGZpbmRfbmV4dGNtZChlYXAtPmFyZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcGF0ID0gZWFwLT5hcmcgKyAxOworCWVuZCA9IHNraXBfcmVnZXhwKHBhdCwgKmVhcC0+YXJnLCBUUlVFLCBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAoIWdpdmVfdXApCisgICAgeworCS8qCisJICogRG9uJ3QgZG8gc29tZXRoaW5nIHdoZW4gbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBvciB3aGVuIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgdHJ5IGJsb2NrIG5ldmVyIGdvdCBhY3RpdmUgKGJlY2F1c2Ugb2YgYW4gaW5hY3RpdmUKKwkgKiBzdXJyb3VuZGluZyBjb25kaXRpb25hbCBvciBhZnRlciBhbiBlcnJvciBvciBpbnRlcnJ1cHQgb3IgdGhyb3cpLgorCSAqLworCWlmICghZGlkX3Rocm93IHx8ICEoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX1RSVUUpKQorCSAgICBza2lwID0gVFJVRTsKKworCS8qCisJICogQ2hlY2sgZm9yIGEgbWF0Y2ggb25seSBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGJ1dCBub3QgY2F1Z2h0IGJ5CisJICogYSBwcmV2aW91cyAiOmNhdGNoIi4gIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcyByZXBsYWNlZCBhIGRpc2NhcmRlZAorCSAqIGV4Y2VwdGlvbiBpcyBub3QgY2hlY2tlZCAoVEhST1dOIGlzIG5vdCBzZXQgdGhlbikuCisJICovCisJaWYgKCFza2lwICYmIChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfVEhST1dOKQorCQkmJiAhKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9DQVVHSFQpKQorCXsKKwkgICAgaWYgKGVuZCAhPSBOVUxMICYmICplbmQgIT0gTlVMICYmICFlbmRzX2V4Y21kKCpza2lwd2hpdGUoZW5kICsgMSkpKQorCSAgICB7CisJCUVNU0coXyhlX3RyYWlsaW5nKSk7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIC8qIFdoZW4gZGVidWdnaW5nIG9yIGEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQsIGRpc3BsYXkgdGhlCisJICAgICAqIGRlYnVnIHByb21wdCAoaWYgbm90IGFscmVhZHkgZG9uZSkgYmVmb3JlIGNoZWNraW5nIGZvciBhIG1hdGNoLgorCSAgICAgKiBUaGlzIGlzIGEgaGVscGZ1bCBoaW50IGZvciB0aGUgdXNlciB3aGVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKwkgICAgICogbWF0Y2hpbmcgZmFpbHMuICBIYW5kbGUgYSAiPnF1aXQiIGRlYnVnIGNvbW1hbmQgYXMgaWYgYW4KKwkgICAgICogaW50ZXJydXB0IGhhZCBvY2N1cnJlZCBiZWZvcmUgdGhlICI6Y2F0Y2giLiAgVGhhdCBpcywgZGlzY2FyZAorCSAgICAgKiB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLCByZXBsYWNlIGl0IGJ5IGFuIGludGVycnVwdCBleGNlcHRpb24sCisJICAgICAqIGFuZCBkb24ndCBjYXRjaCBpdCBpbiB0aGlzIHRyeSBibG9jay4gKi8KKwkgICAgaWYgKCFkYmdfY2hlY2tfc2tpcHBlZChlYXApIHx8ICFkb19pbnR0aHJvdyhjc3RhY2spKQorCSAgICB7CisJCS8qIFRlcm1pbmF0ZSB0aGUgcGF0dGVybiBhbmQgYXZvaWQgdGhlICdsJyBmbGFnIGluICdjcG9wdGlvbnMnCisJCSAqIHdoaWxlIGNvbXBpbGluZyBpdC4gKi8KKwkJaWYgKGVuZCAhPSBOVUxMKQorCQl7CisJCSAgICBzYXZlX2NoYXIgPSAqZW5kOworCQkgICAgKmVuZCA9IE5VTDsKKwkJfQorCQlzYXZlX2NwbyAgPSBwX2NwbzsKKwkJcF9jcG8gPSAoY2hhcl91ICopIiI7CisJCXJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIFRSVUUpOworCQlyZWdtYXRjaC5ybV9pYyA9IEZBTFNFOworCQlpZiAoZW5kICE9IE5VTEwpCisJCSAgICAqZW5kID0gc2F2ZV9jaGFyOworCQlwX2NwbyA9IHNhdmVfY3BvOworCQlpZiAocmVnbWF0Y2gucmVncHJvZyA9PSBOVUxMKQorCQkgICAgRU1TRzIoXyhlX2ludmFyZzIpLCBwYXQpOworCQllbHNlCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBTYXZlIHRoZSB2YWx1ZSBvZiBnb3RfaW50IGFuZCByZXNldCBpdC4gIFdlIGRvbid0IHdhbnQKKwkJICAgICAqIGEgcHJldmlvdXMgaW50ZXJydXB0aW9uIGNhbmNlbCBtYXRjaGluZywgb25seSBoaXR0aW5nCisJCSAgICAgKiBDVFJMLUMgd2hpbGUgbWF0Y2hpbmcgc2hvdWxkIGFib3J0IGl0LgorCQkgICAgICovCisJCSAgICBwcmV2X2dvdF9pbnQgPSBnb3RfaW50OworCQkgICAgZ290X2ludCA9IEZBTFNFOworCQkgICAgY2F1Z2h0ID0gdmltX3JlZ2V4ZWNfbmwoJnJlZ21hdGNoLCBjdXJyZW50X2V4Y2VwdGlvbi0+dmFsdWUsCisJCQkgICAgKGNvbG5yX1QpMCk7CisJCSAgICBnb3RfaW50IHw9IHByZXZfZ290X2ludDsKKwkJICAgIHZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworCQl9CisJICAgIH0KKwl9CisKKwlpZiAoY2F1Z2h0KQorCXsKKwkgICAgLyogTWFrZSB0aGlzICI6Y2F0Y2giIGNsYXVzZSBhY3RpdmUgYW5kIHJlc2V0IGRpZF9lbXNnLCBnb3RfaW50LAorCSAgICAgKiBhbmQgZGlkX3Rocm93LiAgUHV0IHRoZSBleGNlcHRpb24gb24gdGhlIGNhdWdodCBzdGFjay4gKi8KKwkgICAgY3N0YWNrLT5jc19mbGFnc1tpZHhdIHw9IENTRl9BQ1RJVkUgfCBDU0ZfQ0FVR0hUOworCSAgICBkaWRfZW1zZyA9IGdvdF9pbnQgPSBkaWRfdGhyb3cgPSBGQUxTRTsKKwkgICAgY2F0Y2hfZXhjZXB0aW9uKChleGNlcHRfVCAqKWNzdGFjay0+Y3NfZXhjZXB0aW9uW2lkeF0pOworCSAgICAvKiBJdCdzIG1hbmRhdG9yeSB0aGF0IHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGNzdGFjaworCSAgICAgKiBzbyB0aGF0IGl0IGNhbiBiZSBkaXNjYXJkZWQgYXQgdGhlIG5leHQgIjpjYXRjaCIsICI6ZmluYWxseSIsIG9yCisJICAgICAqICI6ZW5kdHJ5IiBvciB3aGVuIHRoZSBjYXRjaCBjbGF1c2UgaXMgbGVmdCBieSBhICI6Y29udGludWUiLAorCSAgICAgKiAiOmJyZWFrIiwgIjpyZXR1cm4iLCAiOmZpbmlzaCIsIGVycm9yLCBpbnRlcnJ1cHQsIG9yIGFub3RoZXIKKwkgICAgICogZXhjZXB0aW9uLiAqLworCSAgICBpZiAoY3N0YWNrLT5jc19leGNlcHRpb25bY3N0YWNrLT5jc19pZHhdICE9IGN1cnJlbnRfZXhjZXB0aW9uKQorCQlFTVNHKF8oZV9pbnRlcm5hbCkpOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJZiB0aGVyZSBpcyBhIHByZWNlZGluZyBjYXRjaCBjbGF1c2UgYW5kIGl0IGNhdWdodCB0aGUgZXhjZXB0aW9uLAorCSAgICAgKiBmaW5pc2ggdGhlIGV4Y2VwdGlvbiBub3cuICBUaGlzIGhhcHBlbnMgYWxzbyBhZnRlciBlcnJvcnMgZXhjZXB0CisJICAgICAqIHdoZW4gdGhpcyAiOmNhdGNoIiB3YXMgYWZ0ZXIgdGhlICI6ZmluYWxseSIgb3Igbm90IHdpdGhpbgorCSAgICAgKiBhICI6dHJ5Ii4gIE1ha2UgdGhlIHRyeSBjb25kaXRpb25hbCBpbmFjdGl2ZSBzbyB0aGF0IHRoZQorCSAgICAgKiBmb2xsb3dpbmcgY2F0Y2ggY2xhdXNlcyBhcmUgc2tpcHBlZC4gIE9uIGFuIGVycm9yIG9yIGludGVycnVwdAorCSAgICAgKiBhZnRlciB0aGUgcHJlY2VkaW5nIHRyeSBibG9jayBvciBjYXRjaCBjbGF1c2Ugd2FzIGxlZnQgYnkKKwkgICAgICogYSAiOmNvbnRpbnVlIiwgIjpicmVhayIsICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giLCBkaXNjYXJkIHRoZQorCSAgICAgKiBwZW5kaW5nIGFjdGlvbi4KKwkgICAgICovCisJICAgIGNsZWFudXBfY29uZGl0aW9uYWxzKGNzdGFjaywgQ1NGX1RSWSwgVFJVRSk7CisJfQorICAgIH0KKworICAgIGlmIChlbmQgIT0gTlVMTCkKKwllYXAtPm5leHRjbWQgPSBmaW5kX25leHRjbWQoZW5kKTsKK30KKworLyoKKyAqICI6ZmluYWxseSIKKyAqLworICAgIHZvaWQKK2V4X2ZpbmFsbHkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCXNraXAgPSBGQUxTRTsKKyAgICBpbnQJCXBlbmRpbmcgPSBDU1RQX05PTkU7CisgICAgc3RydWN0IGNvbmRzdGFjawkqY3N0YWNrID0gZWFwLT5jc3RhY2s7CisKKyAgICBpZiAoY3N0YWNrLT5jc190cnlsZXZlbCA8PSAwIHx8IGNzdGFjay0+Y3NfaWR4IDwgMCkKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTYwNjogOmZpbmFsbHkgd2l0aG91dCA6dHJ5Iik7CisgICAgZWxzZQorICAgIHsKKwlpZiAoIShjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9UUlkpKQorCXsKKwkgICAgLyogRmluZCB0aGUgbWF0Y2hpbmcgIjp0cnkiIGFuZCByZXBvcnQgd2hhdCdzIG1pc3NpbmcuICovCisJICAgIGlmIChjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9XSElMRSkKKwkJZWFwLT5lcnJtc2cgPSBlX2VuZHdoaWxlOworCSAgICBlbHNlCisJCWVhcC0+ZXJybXNnID0gZV9lbmRpZjsKKwkgICAgZm9yIChpZHggPSBjc3RhY2stPmNzX2lkeCAtIDE7IGlkeCA+IDA7IC0taWR4KQorCQlpZiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX1RSWSkKKwkJICAgIGJyZWFrOworCSAgICAvKiBNYWtlIHRoaXMgZXJyb3IgcGVuZGluZywgc28gdGhhdCB0aGUgY29tbWFuZHMgaW4gdGhlIGZvbGxvd2luZworCSAgICAgKiBmaW5hbGx5IGNsYXVzZSBjYW4gYmUgZXhlY3V0ZWQuICBUaGlzIG92ZXJydWxlcyBhbHNvIGEgcGVuZGluZworCSAgICAgKiAiOmNvbnRpbnVlIiwgIjpicmVhayIsICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giLiAqLworCSAgICBwZW5kaW5nID0gQ1NUUF9FUlJPUjsKKwl9CisJZWxzZQorCSAgICBpZHggPSBjc3RhY2stPmNzX2lkeDsKKworCWlmIChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfRklOQUxMWSkKKwl7CisJICAgIC8qIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LiAqLworCSAgICBlYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiKTsKKwkgICAgcmV0dXJuOworCX0KKwlpZiAoY3N0YWNrLT5jc19pZHggPiBpZHgpCisJICAgIHJld2luZF9jb25kaXRpb25hbHMoY3N0YWNrLCBpZHgsIENTRl9XSElMRSwgJmNzdGFjay0+Y3Nfd2hpbGVsZXZlbCk7CisKKwkvKgorCSAqIERvbid0IGRvIHNvbWV0aGluZyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHRyeSBibG9jayBuZXZlciBnb3QgYWN0aXZlCisJICogKGJlY2F1c2Ugb2YgYW4gaW5hY3RpdmUgc3Vycm91bmRpbmcgY29uZGl0aW9uYWwgb3IgYWZ0ZXIgYW4gZXJyb3Igb3IKKwkgKiBpbnRlcnJ1cHQgb3IgdGhyb3cpIG9yIGZvciBhICI6ZmluYWxseSIgd2l0aG91dCAiOnRyeSIgb3IgYSBtdWx0aXBsZQorCSAqICI6ZmluYWxseSIuICBBZnRlciBldmVyeSBvdGhlciBlcnJvciAoZGlkX2Vtc2cgb3IgdGhlIGNvbmRpdGlvbmFsCisJICogZXJyb3JzIGRldGVjdGVkIGFib3ZlKSBvciBhZnRlciBhbiBpbnRlcnJ1cHQgKGdvdF9pbnQpIG9yIGFuCisJICogZXhjZXB0aW9uIChkaWRfdGhyb3cpLCB0aGUgZmluYWxseSBjbGF1c2UgbXVzdCBiZSBleGVjdXRlZC4KKwkgKi8KKwlza2lwID0gIShjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIENTRl9UUlVFKTsKKworCWlmICghc2tpcCkKKwl7CisJICAgIC8qIFdoZW4gZGVidWdnaW5nIG9yIGEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQsIGRpc3BsYXkgdGhlCisJICAgICAqIGRlYnVnIHByb21wdCAoaWYgbm90IGFscmVhZHkgZG9uZSkuICBUaGUgdXNlciB0aGVuIGtub3dzIHRoYXQgdGhlCisJICAgICAqIGZpbmFsbHkgY2xhdXNlIGlzIGV4ZWN1dGVkLiAqLworCSAgICBpZiAoZGJnX2NoZWNrX3NraXBwZWQoZWFwKSkKKwkgICAgeworCQkvKiBIYW5kbGUgYSAiPnF1aXQiIGRlYnVnIGNvbW1hbmQgYXMgaWYgYW4gaW50ZXJydXB0IGhhZAorCQkgKiBvY2N1cnJlZCBiZWZvcmUgdGhlICI6ZmluYWxseSIuICBUaGF0IGlzLCBkaXNjYXJkIHRoZQorCQkgKiBvcmlnaW5hbCBleGNlcHRpb24gYW5kIHJlcGxhY2UgaXQgYnkgYW4gaW50ZXJydXB0CisJCSAqIGV4Y2VwdGlvbi4gKi8KKwkJKHZvaWQpZG9faW50dGhyb3coY3N0YWNrKTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIHRoZXJlIGlzIGEgcHJlY2VkaW5nIGNhdGNoIGNsYXVzZSBhbmQgaXQgY2F1Z2h0IHRoZSBleGNlcHRpb24sCisJICAgICAqIGZpbmlzaCB0aGUgZXhjZXB0aW9uIG5vdy4gIFRoaXMgaGFwcGVucyBhbHNvIGFmdGVyIGVycm9ycyBleGNlcHQKKwkgICAgICogd2hlbiB0aGlzIGlzIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBvciBvbmUgbm90IHdpdGhpbiBhICI6dHJ5Ii4KKwkgICAgICogQWZ0ZXIgYW4gZXJyb3Igb3IgaW50ZXJydXB0LCB0aGlzIGFsc28gZGlzY2FyZHMgYSBwZW5kaW5nCisJICAgICAqICI6Y29udGludWUiLCAiOmJyZWFrIiwgIjpmaW5pc2giLCBvciAiOnJldHVybiIgZnJvbSB0aGUgcHJlY2VkaW5nCisJICAgICAqIHRyeSBibG9jayBvciBjYXRjaCBjbGF1c2UuCisJICAgICAqLworCSAgICBjbGVhbnVwX2NvbmRpdGlvbmFscyhjc3RhY2ssIENTRl9UUlksIEZBTFNFKTsKKworCSAgICAvKgorCSAgICAgKiBNYWtlIGRpZF9lbXNnLCBnb3RfaW50LCBkaWRfdGhyb3cgcGVuZGluZy4gIElmIHNldCwgdGhleSBvdmVycnVsZQorCSAgICAgKiBhIHBlbmRpbmcgIjpjb250aW51ZSIsICI6YnJlYWsiLCAiOnJldHVybiIsIG9yICI6ZmluaXNoIi4gIFRoZW4KKwkgICAgICogd2UgaGF2ZSBwYXJ0aWN1bGFybHkgdG8gZGlzY2FyZCBhIHBlbmRpbmcgcmV0dXJuIHZhbHVlIChhcyBkb25lCisJICAgICAqIGJ5IHRoZSBjYWxsIHRvIGNsZWFudXBfY29uZGl0aW9uYWxzKCkgYWJvdmUgd2hlbiBkaWRfZW1zZyBvcgorCSAgICAgKiBnb3RfaW50IGlzIHNldCkuICBUaGUgcGVuZGluZyB2YWx1ZXMgYXJlIHJlc3RvcmVkIGJ5IHRoZQorCSAgICAgKiAiOmVuZHRyeSIsIGV4Y2VwdCBpZiB0aGVyZSBpcyBhIG5ldyBlcnJvciwgaW50ZXJydXB0LCBleGNlcHRpb24sCisJICAgICAqICI6Y29udGludWUiLCAiOmJyZWFrIiwgIjpyZXR1cm4iLCBvciAiOmZpbmlzaCIgaW4gdGhlIGZvbGxvd2luZworCSAgICAgKiBmaW5hbGx5IGNsYXVzZS4gIEEgbWlzc2luZyAiOmVuZHdoaWxlIiBvciAiOmVuZGlmIiBkZXRlY3RlZCBoZXJlCisJICAgICAqIGlzIHRyZWF0ZWQgYXMgaWYgZGlkX2Vtc2cgYW5kIGRpZF90aHJvdyBoYWQgYWxyZWFkeSBiZWVuIHNldCwKKwkgICAgICogcmVzcGVjdGl2ZWx5IGluIGNhc2UgdGhhdCB0aGUgZXJyb3IgaXMgbm90IGNvbnZlcnRlZCB0byBhbgorCSAgICAgKiBleGNlcHRpb24sIGRpZF90aHJvdyBoYWQgYWxyZWFkeSBiZWVuIHVuc2V0LiAgV2UgbXVzdCBub3Qgc2V0CisJICAgICAqIGRpZF9lbXNnIGhlcmUgc2luY2UgdGhhdCB3b3VsZCBzdXBwcmVzcyB0aGUgZXJyb3IgbWVzc2FnZS4KKwkgICAgICovCisJICAgIGlmIChwZW5kaW5nID09IENTVFBfRVJST1IgfHwgZGlkX2Vtc2cgfHwgZ290X2ludCB8fCBkaWRfdGhyb3cpCisJICAgIHsKKwkJaWYgKGNzdGFjay0+Y3NfcGVuZGluZ1tjc3RhY2stPmNzX2lkeF0gPT0gQ1NUUF9SRVRVUk4pCisJCXsKKwkJICAgIHJlcG9ydF9kaXNjYXJkX3BlbmRpbmcoQ1NUUF9SRVRVUk4sCisJCQkgICAgY3N0YWNrLT5jc19yZXR2YXJbY3N0YWNrLT5jc19pZHhdKTsKKwkJICAgIGRpc2NhcmRfcGVuZGluZ19yZXR1cm4oY3N0YWNrLT5jc19yZXR2YXJbY3N0YWNrLT5jc19pZHhdKTsKKwkJfQorCQlpZiAocGVuZGluZyA9PSBDU1RQX0VSUk9SICYmICFkaWRfZW1zZykKKwkJICAgIHBlbmRpbmcgfD0gKFRIUk9XX09OX0VSUk9SKSA/IENTVFBfVEhST1cgOiAwOworCQllbHNlCisJCSAgICBwZW5kaW5nIHw9IGRpZF90aHJvdyA/IENTVFBfVEhST1cgOiAwOworCQlwZW5kaW5nIHw9IGRpZF9lbXNnICA/IENTVFBfRVJST1IgICAgIDogMDsKKwkJcGVuZGluZyB8PSBnb3RfaW50ICAgPyBDU1RQX0lOVEVSUlVQVCA6IDA7CisJCWNzdGFjay0+Y3NfcGVuZGluZ1tjc3RhY2stPmNzX2lkeF0gPSBwZW5kaW5nOworCisJCS8qIEl0J3MgbWFuZGF0b3J5IHRoYXQgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGlzIHN0b3JlZCBpbiB0aGUKKwkJICogY3N0YWNrIHNvIHRoYXQgaXQgY2FuIGJlIHJldGhyb3duIGF0IHRoZSAiOmVuZHRyeSIgb3IgYmUKKwkJICogZGlzY2FyZGVkIGlmIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyBsZWZ0IGJ5IGEgIjpjb250aW51ZSIsCisJCSAqICI6YnJlYWsiLCAiOnJldHVybiIsICI6ZmluaXNoIiwgZXJyb3IsIGludGVycnVwdCwgb3IgYW5vdGhlcgorCQkgKiBleGNlcHRpb24uICBXaGVuIGVtc2coKSBpcyBjYWxsZWQgZm9yIGEgbWlzc2luZyAiOmVuZGlmIiBvcgorCQkgKiBhIG1pc3NpbmcgIjplbmR3aGlsZSIgZGV0ZWN0ZWQgaGVyZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlCisJCSAqIGRpc2NhcmRlZC4gKi8KKwkJaWYgKGRpZF90aHJvdyAmJiBjc3RhY2stPmNzX2V4Y2VwdGlvbltjc3RhY2stPmNzX2lkeF0gIT0KKwkJCWN1cnJlbnRfZXhjZXB0aW9uKQorCQkgICAgRU1TRyhfKGVfaW50ZXJuYWwpKTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFNldCBjc19oYWRfZmluYWxseSwgc28gZG9fY21kbGluZSgpIHdpbGwgcmVzZXQgZGlkX2Vtc2csIGdvdF9pbnQsCisJICAgICAqIGFuZCBkaWRfdGhyb3cgYW5kIG1ha2UgdGhlIGZpbmFsbHkgY2xhdXNlIGFjdGl2ZS4gIFRoaXMgd2lsbAorCSAgICAgKiBoYXBwZW4gYWZ0ZXIgZW1zZygpIGhhcyBiZWVuIGNhbGxlZCBmb3IgYSBtaXNzaW5nICI6ZW5kaWYiIG9yCisJICAgICAqIGEgbWlzc2luZyAiOmVuZHdoaWxlIiBkZXRlY3RlZCBoZXJlLCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcKKwkgICAgICogZmluYWxseSBjbGF1c2Ugd2lsbCBiZSBleGVjdXRlZCBldmVuIHRoZW4uCisJICAgICAqLworCSAgICBjc3RhY2stPmNzX2hhZF9maW5hbGx5ID0gVFJVRTsKKwl9CisgICAgfQorfQorCisvKgorICogIjplbmR0cnkiCisgKi8KKyAgICB2b2lkCitleF9lbmR0cnkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCXNraXA7CisgICAgaW50CQlyZXRocm93ID0gRkFMU0U7CisgICAgaW50CQlwZW5kaW5nID0gQ1NUUF9OT05FOworICAgIHZvaWQJKnJldHZhciA9IE5VTEw7CisgICAgc3RydWN0IGNvbmRzdGFjawkqY3N0YWNrID0gZWFwLT5jc3RhY2s7CisKKyAgICBpZiAoY3N0YWNrLT5jc190cnlsZXZlbCA8PSAwIHx8IGNzdGFjay0+Y3NfaWR4IDwgMCkKKwllYXAtPmVycm1zZyA9IChjaGFyX3UgKilOXygiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiKTsKKyAgICBlbHNlCisgICAgeworCS8qCisJICogRG9uJ3QgZG8gc29tZXRoaW5nIGFmdGVyIGFuIGVycm9yLCBpbnRlcnJ1cHQgb3IgdGhyb3cgaW4gdGhlIHRyeQorCSAqIGJsb2NrLCBjYXRjaCBjbGF1c2UsIG9yIGZpbmFsbHkgY2xhdXNlIHByZWNlZGluZyB0aGlzICI6ZW5kdHJ5IiBvcgorCSAqIHdoZW4gYW4gZXJyb3Igb3IgaW50ZXJydXB0IG9jY3VycmVkIGFmdGVyIGEgIjpjb250aW51ZSIsICI6YnJlYWsiLAorCSAqICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giIGluIGEgdHJ5IGJsb2NrIG9yIGNhdGNoIGNsYXVzZSBwcmVjZWRpbmcgdGhpcworCSAqICI6ZW5kdHJ5IiBvciB3aGVuIHRoZSB0cnkgYmxvY2sgbmV2ZXIgZ290IGFjdGl2ZSAoYmVjYXVzZSBvZiBhbgorCSAqIGluYWN0aXZlIHN1cnJvdW5kaW5nIGNvbmRpdGlvbmFsIG9yIGFmdGVyIGFuIGVycm9yIG9yIGludGVycnVwdCBvcgorCSAqIHRocm93KSBvciB3aGVuIHRoZXJlIGlzIGEgc3Vycm91bmRpbmcgY29uZGl0aW9uYWwgYW5kIGl0IGhhcyBiZWVuCisJICogbWFkZSBpbmFjdGl2ZSBieSBhICI6Y29udGludWUiLCAiOmJyZWFrIiwgIjpyZXR1cm4iLCBvciAiOmZpbmlzaCIgaW4KKwkgKiB0aGUgZmluYWxseSBjbGF1c2UuICBUaGUgbGF0dGVyIGNhc2UgbmVlZCBub3QgYmUgdGVzdGVkIHNpbmNlIHRoZW4KKwkgKiBhbnl0aGluZyBwZW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkLiAqLworCXNraXAgPSBkaWRfZW1zZyB8fCBnb3RfaW50IHx8IGRpZF90aHJvdyB8fAorCSAgICAhKGNzdGFjay0+Y3NfZmxhZ3NbY3N0YWNrLT5jc19pZHhdICYgQ1NGX1RSVUUpOworCisJaWYgKCEoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfVFJZKSkKKwl7CisJICAgIC8qIEZpbmQgdGhlIG1hdGNoaW5nICI6dHJ5IiBhbmQgcmVwb3J0IHdoYXQncyBtaXNzaW5nLiAqLworCSAgICBpZiAoY3N0YWNrLT5jc19mbGFnc1tjc3RhY2stPmNzX2lkeF0gJiBDU0ZfV0hJTEUpCisJCWVhcC0+ZXJybXNnID0gZV9lbmR3aGlsZTsKKwkgICAgZWxzZQorCQllYXAtPmVycm1zZyA9IGVfZW5kaWY7CisJICAgIGlkeCA9IGNzdGFjay0+Y3NfaWR4OworCSAgICBkbworCQktLWlkeDsKKwkgICAgd2hpbGUgKGlkeCA+IDAgJiYgIShjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfVFJZKSk7CisJICAgIHJld2luZF9jb25kaXRpb25hbHMoY3N0YWNrLCBpZHgsIENTRl9XSElMRSwgJmNzdGFjay0+Y3Nfd2hpbGVsZXZlbCk7CisJICAgIHNraXAgPSBUUlVFOworCisJICAgIC8qCisJICAgICAqIElmIGFuIGV4Y2VwdGlvbiBpcyBiZWluZyB0aHJvd24sIGRpc2NhcmQgaXQgdG8gcHJldmVudCBpdCBmcm9tCisJICAgICAqIGJlaW5nIHJldGhyb3duIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gIEl0IHdvdWxkIGJlCisJICAgICAqIGRpc2NhcmRlZCBieSB0aGUgZXJyb3IgbWVzc2FnZSwgYW55d2F5LiAgUmVzZXRzIGRpZF90aHJvdy4KKwkgICAgICogVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNjcmlwdCB0ZXJtaW5hdGlvbiBkdWUgdG8gdGhlIGVycm9yCisJICAgICAqIHNpbmNlICJ0cnlsZXZlbCIgaXMgZGVjcmVtZW50ZWQgYWZ0ZXIgZW1zZygpIGhhcyBiZWVuIGNhbGxlZC4KKwkgICAgICovCisJICAgIGlmIChkaWRfdGhyb3cpCisJCWRpc2NhcmRfY3VycmVudF9leGNlcHRpb24oKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWR4ID0gY3N0YWNrLT5jc19pZHg7CisKKwkgICAgLyoKKwkgICAgICogSWYgd2Ugc3RvcHBlZCB3aXRoIHRoZSBleGNlcHRpb24gY3VycmVudGx5IGJlaW5nIHRocm93biBhdCB0aGlzCisJICAgICAqIHRyeSBjb25kaXRpb25hbCBzaW5jZSB3ZSBkaWRuJ3Qga25vdyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorCSAgICAgKiBhIGZpbmFsbHkgY2xhdXNlLCB3ZSBuZWVkIHRvIHJldGhyb3cgaXQgYWZ0ZXIgY2xvc2luZyB0aGUgdHJ5CisJICAgICAqIGNvbmRpdGlvbmFsLgorCSAgICAgKi8KKwkgICAgaWYgKGRpZF90aHJvdyAmJiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX1RSVUUpCisJCSAgICAmJiAhKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9GSU5BTExZKSkKKwkJcmV0aHJvdyA9IFRSVUU7CisJfQorCisJLyogSWYgdGhlcmUgd2FzIG5vIGZpbmFsbHkgY2xhdXNlLCBzaG93IHRoZSB1c2VyIHdoZW4gZGVidWdnaW5nIG9yCisJICogYSBicmVha3BvaW50IHdhcyBlbmNvdW50ZXJlZCB0aGF0IHRoZSBlbmQgb2YgdGhlIHRyeSBjb25kaXRpb25hbCBoYXMKKwkgKiBiZWVuIHJlYWNoZWQ6IGRpc3BsYXkgdGhlIGRlYnVnIHByb21wdCAoaWYgbm90IGFscmVhZHkgZG9uZSkuICBEbworCSAqIHRoaXMgb24gbm9ybWFsIGNvbnRyb2wgZmxvdyBvciB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCBidXQgbm90CisJICogb24gYW4gaW50ZXJydXB0IG9yIGVycm9yIG5vdCBjb252ZXJ0ZWQgdG8gYW4gZXhjZXB0aW9uIG9yIHdoZW4KKwkgKiBhICI6YnJlYWsiLCAiOmNvbnRpbnVlIiwgIjpyZXR1cm4iLCBvciAiOmZpbmlzaCIgaXMgcGVuZGluZy4gIFRoZXNlCisJICogYWN0aW9ucyBhcmUgY2FycmllZCBvdXQgaW1tZWRpYXRlbHkuCisJICovCisJaWYgKChyZXRocm93IHx8ICghc2tpcAorCQkJJiYgIShjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfRklOQUxMWSkKKwkJCSYmICFjc3RhY2stPmNzX3BlbmRpbmdbaWR4XSkpCisJCSYmIGRiZ19jaGVja19za2lwcGVkKGVhcCkpCisJeworCSAgICAvKiBIYW5kbGUgYSAiPnF1aXQiIGRlYnVnIGNvbW1hbmQgYXMgaWYgYW4gaW50ZXJydXB0IGhhZCBvY2N1cnJlZAorCSAgICAgKiBiZWZvcmUgdGhlICI6ZW5kdHJ5Ii4gIFRoYXQgaXMsIHRocm93IGFuIGludGVycnVwdCBleGNlcHRpb24gYW5kCisJICAgICAqIHNldCAic2tpcCIgYW5kICJyZXRocm93Ii4gKi8KKwkgICAgaWYgKGdvdF9pbnQpCisJICAgIHsKKwkJc2tpcCA9IFRSVUU7CisJCSh2b2lkKWRvX2ludHRocm93KGNzdGFjayk7CisJCS8qIFRoZSBkb19pbnR0aHJvdygpIGNhbGwgbWF5IGhhdmUgcmVzZXQgZGlkX3Rocm93IG9yCisJCSAqIGNzdGFjay0+Y3NfcGVuZGluZ1tpZHhdLiovCisJCXJldGhyb3cgPSBGQUxTRTsKKwkJaWYgKGRpZF90aHJvdyAmJiAhKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9GSU5BTExZKSkKKwkJICAgIHJldGhyb3cgPSBUUlVFOworCSAgICB9CisJfQorCisJLyoKKwkgKiBJZiBhICI6cmV0dXJuIiBpcyBwZW5kaW5nLCB3ZSBuZWVkIHRvIHJlc3VtZSBpdCBhZnRlciBjbG9zaW5nIHRoZQorCSAqIHRyeSBjb25kaXRpb25hbDsgcmVtZW1iZXIgdGhlIHJldHVybiB2YWx1ZS4gIElmIHRoZXJlIHdhcyBhIGZpbmFsbHkKKwkgKiBjbGF1c2UgbWFraW5nIGFuIGV4Y2VwdGlvbiBwZW5kaW5nLCB3ZSBuZWVkIHRvIHJldGhyb3cgaXQuICBNYWtlIGl0CisJICogdGhlIGV4Y2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGhyb3duLgorCSAqLworCWlmICghc2tpcCkKKwl7CisJICAgIHBlbmRpbmcgPSBjc3RhY2stPmNzX3BlbmRpbmdbaWR4XTsKKwkgICAgY3N0YWNrLT5jc19wZW5kaW5nW2lkeF0gPSBDU1RQX05PTkU7CisJICAgIGlmIChwZW5kaW5nID09IENTVFBfUkVUVVJOKQorCQlyZXR2YXIgPSBjc3RhY2stPmNzX3JldHZhcltpZHhdOworCSAgICBlbHNlIGlmIChwZW5kaW5nICYgQ1NUUF9USFJPVykKKwkJY3VycmVudF9leGNlcHRpb24gPSBjc3RhY2stPmNzX2V4Y2VwdGlvbltpZHhdOworCX0KKworCS8qCisJICogRGlzY2FyZCBhbnl0aGluZyBwZW5kaW5nIG9uIGFuIGVycm9yLCBpbnRlcnJ1cHQsIG9yIHRocm93IGluIHRoZQorCSAqIGZpbmFsbHkgY2xhdXNlLiAgSWYgdGhlcmUgd2FzIG5vICI6ZmluYWxseSIsIGRpc2NhcmQgYSBwZW5kaW5nCisJICogIjpjb250aW51ZSIsICI6YnJlYWsiLCAiOnJldHVybiIsIG9yICI6ZmluaXNoIiBpZiBhbiBlcnJvciBvcgorCSAqIGludGVycnVwdCBvY2N1cnJlZCBhZnRlcndhcmRzLCBidXQgYmVmb3JlIHRoZSAiOmVuZHRyeSIgd2FzIHJlYWNoZWQuCisJICogSWYgYW4gZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgdGhlIGxhc3Qgb2YgdGhlIGNhdGNoIGNsYXVzZXMgYW5kIHRoZXJlCisJICogd2FzIG5vIGZpbmFsbHkgY2xhdXNlLCBmaW5pc2ggdGhlIGV4Y2VwdGlvbiBub3cuICBUaGlzIGhhcHBlbnMgYWxzbworCSAqIGFmdGVyIGVycm9ycyBleGNlcHQgd2hlbiB0aGlzICI6ZW5kdHJ5IiBpcyBub3Qgd2l0aGluIGEgIjp0cnkiLgorCSAqIFJlc3RvcmUgImVtc2dfc2lsZW50IiBpZiBpdCBoYXMgYmVlbiByZXNldCBieSB0aGlzIHRyeSBjb25kaXRpb25hbC4KKwkgKi8KKwljbGVhbnVwX2NvbmRpdGlvbmFscyhjc3RhY2ssIENTRl9UUlkgfCBDU0ZfU0lMRU5ULCBUUlVFKTsKKworCS0tY3N0YWNrLT5jc19pZHg7CisJLS1jc3RhY2stPmNzX3RyeWxldmVsOworCisJaWYgKCFza2lwKQorCXsKKwkgICAgcmVwb3J0X3Jlc3VtZV9wZW5kaW5nKHBlbmRpbmcsCisJCSAgICAocGVuZGluZyA9PSBDU1RQX1JFVFVSTikgPyByZXR2YXIgOgorCQkgICAgKHBlbmRpbmcgJiBDU1RQX1RIUk9XKSA/ICh2b2lkICopY3VycmVudF9leGNlcHRpb24gOiBOVUxMKTsKKwkgICAgc3dpdGNoIChwZW5kaW5nKQorCSAgICB7CisJCWNhc2UgQ1NUUF9OT05FOgorCQkgICAgYnJlYWs7CisKKwkJLyogUmVhY3RpdmF0ZSBhIHBlbmRpbmcgIjpjb250aW51ZSIsICI6YnJlYWsiLCAiOnJldHVybiIsCisJCSAqICI6ZmluaXNoIiBmcm9tIHRoZSB0cnkgYmxvY2sgb3IgYSBjYXRjaCBjbGF1c2Ugb2YgdGhpcyB0cnkKKwkJICogY29uZGl0aW9uYWwuICBUaGlzIGlzIHNraXBwZWQsIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhbgorCQkgKiAodW5za2lwcGVkKSBjb25kaXRpb25hbCBjb21tYW5kIG9yIGFuIGludGVycnVwdCBhZnRlcndhcmRzCisJCSAqIG9yIGlmIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyBwcmVzZW50IGFuZCBleGVjdXRlZCBhIG5ldyBlcnJvciwKKwkJICogaW50ZXJydXB0LCB0aHJvdywgIjpjb250aW51ZSIsICI6YnJlYWsiLCAiOnJldHVybiIsIG9yCisJCSAqICI6ZmluaXNoIi4gKi8KKwkJY2FzZSBDU1RQX0NPTlRJTlVFOgorCQkgICAgZXhfY29udGludWUoZWFwKTsKKwkJICAgIGJyZWFrOworCQljYXNlIENTVFBfQlJFQUs6CisJCSAgICBleF9icmVhayhlYXApOworCQkgICAgYnJlYWs7CisJCWNhc2UgQ1NUUF9SRVRVUk46CisJCSAgICBkb19yZXR1cm4oZWFwLCBGQUxTRSwgRkFMU0UsIHJldHZhcik7CisJCSAgICBicmVhazsKKwkJY2FzZSBDU1RQX0ZJTklTSDoKKwkJICAgIGRvX2ZpbmlzaChlYXAsIEZBTFNFKTsKKwkJICAgIGJyZWFrOworCisJCS8qIFdoZW4gdGhlIGZpbmFsbHkgY2xhdXNlIHdhcyBlbnRlcmVkIGR1ZSB0byBhbiBlcnJvciwKKwkJICogaW50ZXJydXB0IG9yIHRocm93IChhcyBvcHBvc2VkIHRvIGEgIjpjb250aW51ZSIsICI6YnJlYWsiLAorCQkgKiAiOnJldHVybiIsIG9yICI6ZmluaXNoIiksIHJlc3RvcmUgdGhlIHBlbmRpbmcgdmFsdWVzIG9mCisJCSAqIGRpZF9lbXNnLCBnb3RfaW50LCBhbmQgZGlkX3Rocm93LiAgVGhpcyBpcyBza2lwcGVkLCBpZiB0aGVyZQorCQkgKiB3YXMgYSBuZXcgZXJyb3IsIGludGVycnVwdCwgdGhyb3csICI6Y29udGludWUiLCAiOmJyZWFrIiwKKwkJICogIjpyZXR1cm4iLCBvciAiOmZpbmlzaCIuICBpbiB0aGUgZmluYWxseSBjbGF1c2UuICovCisJCWRlZmF1bHQ6CisJCSAgICBpZiAocGVuZGluZyAmIENTVFBfRVJST1IpCisJCQlkaWRfZW1zZyA9IFRSVUU7CisJCSAgICBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorCQkJZ290X2ludCA9IFRSVUU7CisJCSAgICBpZiAocGVuZGluZyAmIENTVFBfVEhST1cpCisJCQlyZXRocm93ID0gVFJVRTsKKwkJICAgIGJyZWFrOworCSAgICB9CisJfQorCisJaWYgKHJldGhyb3cpCisJICAgIC8qIFJldGhyb3cgdGhlIGN1cnJlbnQgZXhjZXB0aW9uICh3aXRoaW4gdGhpcyBjc3RhY2spLiAqLworCSAgICBkb190aHJvdyhjc3RhY2spOworICAgIH0KK30KKworLyoKKyAqIE1ha2UgY29uZGl0aW9uYWxzIGluYWN0aXZlIGFuZCBkaXNjYXJkIHdoYXQncyBwZW5kaW5nIGluIGZpbmFsbHkgY2xhdXNlcworICogdW50aWwgdGhlIGNvbmRpdGlvbmFsIHR5cGUgc2VhcmNoZWQgZm9yIG9yIGEgdHJ5IGNvbmRpdGlvbmFsIG5vdCBpbiBpdHMKKyAqIGZpbmFsbHkgY2xhdXNlIGlzIHJlYWNoZWQuICBJZiB0aGlzIGlzIGluIGFuIGFjdGl2ZSBjYXRjaCBjbGF1c2UsIGZpbmlzaCB0aGUKKyAqIGNhdWdodCBleGNlcHRpb24uICBSZXR1cm4gdGhlIGNzdGFjayBpbmRleCB3aGVyZSB0aGUgc2VhcmNoIHN0b3BwZWQuICBWYWx1ZXMKKyAqIHVzZWQgZm9yICJzZWFyY2hlZF9jb25kIiBhcmUgQ1NGX1dISUxFIG9yIENTRl9UUlkgb3IgMCwgdGhlIGxhdHRlciBtZWFuaW5nCisgKiB0aGUgaW5uZXJtb3N0IHRyeSBjb25kaXRpb25hbCBub3QgaW4gaXRzIGZpbmFsbHkgY2xhdXNlLiAgImluY2x1c2l2ZSIgdGVsbHMKKyAqIHdoZXRoZXIgdGhlIGNvbmRpdGlvbmFsIHNlYXJjaGVkIGZvciBzaG91bGQgYmUgbWFkZSBpbmFjdGl2ZSBpdHNlbGYgKGEgdHJ5CisgKiBjb25kaXRpb25hbCBub3QgaW4gaXRzIGZpbmFsbHkgY2xhdXNlZCBwb3NzaWJseSBmaW5kIGJlZm9yZSBpcyBhbHdheXMgbWFkZQorICogaW5hY3RpdmUpLiAgSWYgImluY2x1c2l2ZSIgaXMgVFJVRSBhbmQgInNlYXJjaGVkX2NvbmQiIGlzIENTRl9UUll8Q1NGX1NJTEVOVCwKKyAqIHRoZSBzYXZlZCBmb3JtZXIgdmFsdWUgb2YgImVtc2dfc2lsZW50IiwgaWYgcmVzZXQgd2hlbiB0aGUgdHJ5IGNvbmRpdGlvbmFsCisgKiBmaW5hbGx5IHJlYWNoZWQgd2FzIGVudGVyZWQsIGlzIHJlc3RvcmVkICh1bnNlZCBieSBleF9lbmR0cnkoKSkuICBUaGlzIGlzCisgKiBub3JtYWxseSBkb25lIG9ubHkgd2hlbiBzdWNoIGEgdHJ5IGNvbmRpdGlvbmFsIGlzIGxlZnQuCisgKi8KKyAgICBpbnQKK2NsZWFudXBfY29uZGl0aW9uYWxzKGNzdGFjaywgc2VhcmNoZWRfY29uZCwgaW5jbHVzaXZlKQorICAgIHN0cnVjdCBjb25kc3RhY2sgICAqY3N0YWNrOworICAgIGludAkJc2VhcmNoZWRfY29uZDsKKyAgICBpbnQJCWluY2x1c2l2ZTsKK3sKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCXN0b3AgPSBGQUxTRTsKKworICAgIGZvciAoaWR4ID0gY3N0YWNrLT5jc19pZHg7IGlkeCA+PSAwOyAtLWlkeCkKKyAgICB7CisJaWYgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9UUlkpCisJeworCSAgICAvKgorCSAgICAgKiBEaXNjYXJkIGFueXRoaW5nIHBlbmRpbmcgaW4gYSBmaW5hbGx5IGNsYXVzZSBhbmQgY29udGludWUgdGhlCisJICAgICAqIHNlYXJjaC4gIFRoZXJlIG1heSBhbHNvIGJlIGEgcGVuZGluZyAiOmNvbnRpbnVlIiwgIjpicmVhayIsCisJICAgICAqICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giIGJlZm9yZSB0aGUgZmluYWxseSBjbGF1c2UuICBXZSBtdXN0IG5vdAorCSAgICAgKiBkaXNjYXJkIGl0LCB1bmxlc3MgYW4gZXJyb3Igb3IgaW50ZXJydXB0IG9jY3VycmVkIGFmdGVyd2FyZHMuCisJICAgICAqLworCSAgICBpZiAoZGlkX2Vtc2cgfHwgZ290X2ludCB8fAorCQkgICAgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9GSU5BTExZKSkKKwkgICAgeworCQlzd2l0Y2ggKGNzdGFjay0+Y3NfcGVuZGluZ1tpZHhdKQorCQl7CisJCSAgICBjYXNlIENTVFBfTk9ORToKKwkJCWJyZWFrOworCisJCSAgICBjYXNlIENTVFBfQ09OVElOVUU6CisJCSAgICBjYXNlIENTVFBfQlJFQUs6CisJCSAgICBjYXNlIENTVFBfRklOSVNIOgorCQkJcmVwb3J0X2Rpc2NhcmRfcGVuZGluZyhjc3RhY2stPmNzX3BlbmRpbmdbaWR4XSwgTlVMTCk7CisJCQljc3RhY2stPmNzX3BlbmRpbmdbaWR4XSA9IENTVFBfTk9ORTsKKwkJCWJyZWFrOworCisJCSAgICBjYXNlIENTVFBfUkVUVVJOOgorCQkJcmVwb3J0X2Rpc2NhcmRfcGVuZGluZyhDU1RQX1JFVFVSTiwKKwkJCQljc3RhY2stPmNzX3JldHZhcltpZHhdKTsKKwkJCWRpc2NhcmRfcGVuZGluZ19yZXR1cm4oY3N0YWNrLT5jc19yZXR2YXJbaWR4XSk7CisJCQljc3RhY2stPmNzX3BlbmRpbmdbaWR4XSA9IENTVFBfTk9ORTsKKwkJCWJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJaWYgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9GSU5BTExZKQorCQkJeworCQkJICAgIGlmIChjc3RhY2stPmNzX3BlbmRpbmdbaWR4XSAmIENTVFBfVEhST1cpCisJCQkgICAgeworCQkJCS8qIENhbmNlbCB0aGUgcGVuZGluZyBleGNlcHRpb24uICBUaGlzIGlzIGluIHRoZQorCQkJCSAqIGZpbmFsbHkgY2xhdXNlLCBzbyB0aGF0IHRoZSBzdGFjayBvZiB0aGUKKwkJCQkgKiBjYXVnaHQgZXhjZXB0aW9ucyBpcyBub3QgaW52b2x2ZWQuICovCisJCQkJZGlzY2FyZF9leGNlcHRpb24oKGV4Y2VwdF9UICopCisJCQkJCWNzdGFjay0+Y3NfZXhjZXB0aW9uW2lkeF0sCisJCQkJCUZBTFNFKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJCXJlcG9ydF9kaXNjYXJkX3BlbmRpbmcoY3N0YWNrLT5jc19wZW5kaW5nW2lkeF0sCisJCQkJCU5VTEwpOworCQkJICAgIGNzdGFjay0+Y3NfcGVuZGluZ1tpZHhdID0gQ1NUUF9OT05FOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFN0b3AgYXQgYSB0cnkgY29uZGl0aW9uYWwgbm90IGluIGl0cyBmaW5hbGx5IGNsYXVzZS4gIElmIHRoaXMgdHJ5CisJICAgICAqIGNvbmRpdGlvbmFsIGlzIGluIGFuIGFjdGl2ZSBjYXRjaCBjbGF1c2UsIGZpbmlzaCB0aGUgY2F1Z2h0CisJICAgICAqIGV4Y2VwdGlvbi4KKwkgICAgICovCisJICAgIGlmICghKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9GSU5BTExZKSkKKwkgICAgeworCQlpZiAoKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9BQ1RJVkUpCisJCQkmJiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX0NBVUdIVCkpCisJCSAgICBmaW5pc2hfZXhjZXB0aW9uKChleGNlcHRfVCAqKWNzdGFjay0+Y3NfZXhjZXB0aW9uW2lkeF0pOworCQkvKiBTdG9wIGF0IHRoaXMgdHJ5IGNvbmRpdGlvbmFsIC0gZXhjZXB0IHRoZSB0cnkgYmxvY2sgbmV2ZXIKKwkJICogZ290IGFjdGl2ZSAoYmVjYXVzZSBvZiBhbiBpbmFjdGl2ZSBzdXJyb3VuZGluZyBjb25kaXRpb25hbAorCQkgKiBvciB3aGVuIHRoZSAiOnRyeSIgYXBwZWFyZWQgYWZ0ZXIgYW4gZXJyb3Igb3IgaW50ZXJydXB0IG9yCisJCSAqIHRocm93KS4gKi8KKwkJaWYgKGNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmIENTRl9UUlVFKQorCQl7CisJCSAgICBpZiAoc2VhcmNoZWRfY29uZCA9PSAwICYmICFpbmNsdXNpdmUpCisJCQlicmVhazsKKwkJICAgIHN0b3AgPSBUUlVFOworCQl9CisJICAgIH0KKwl9CisKKwkvKiBTdG9wIG9uIHRoZSBzZWFyY2hlZCBjb25kaXRpb25hbCB0eXBlIChldmVuIHdoZW4gdGhlIHN1cnJvdW5kaW5nCisJICogY29uZGl0aW9uYWwgaXMgbm90IGFjdGl2ZSBvciBzb21ldGhpbmcgaGFzIGJlZW4gbWFkZSBwZW5kaW5nKS4KKwkgKiBJZiAiaW5jbHVzaXZlIiBpcyBUUlVFIGFuZCAic2VhcmNoZWRfY29uZCIgaXMgQ1NGX1RSWXxDU0ZfU0lMRU5ULAorCSAqIGNoZWNrIGZpcnN0IHdoZXRoZXIgImVtc2dfc2lsZW50IiBuZWVkcyB0byBiZSByZXN0b3JlZC4gKi8KKwlpZiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgc2VhcmNoZWRfY29uZCkKKwl7CisJICAgIGlmICghaW5jbHVzaXZlKQorCQlicmVhazsKKwkgICAgc3RvcCA9IFRSVUU7CisJfQorCWNzdGFjay0+Y3NfZmxhZ3NbaWR4XSAmPSB+Q1NGX0FDVElWRTsKKwlpZiAoc3RvcCAmJiBzZWFyY2hlZF9jb25kICE9IChDU0ZfVFJZIHwgQ1NGX1NJTEVOVCkpCisJICAgIGJyZWFrOworCisJLyoKKwkgKiBXaGVuIGxlYXZpbmcgYSB0cnkgY29uZGl0aW5hbCB0aGF0IHJlc2V0ICJlbXNnX3NpbGVudCIgb24gaXRzIGVudHJ5CisJICogYWZ0ZXIgc2F2aW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSwgcmVzdG9yZSB0aGF0IHZhbHVlIGhlcmUgYW5kIGZyZWUgdGhlCisJICogbWVtb3J5IHVzZWQgdG8gc3RvcmUgaXQuCisJICovCisJaWYgKChjc3RhY2stPmNzX2ZsYWdzW2lkeF0gJiBDU0ZfVFJZKQorCSAgICAmJiAoY3N0YWNrLT5jc19mbGFnc1tpZHhdICYgQ1NGX1NJTEVOVCkpCisJeworCSAgICBlc2xpc3RfVAkqZWxlbTsKKworCSAgICBlbGVtID0gY3N0YWNrLT5jc19lbXNnX3NpbGVudF9saXN0OworCSAgICBjc3RhY2stPmNzX2Vtc2dfc2lsZW50X2xpc3QgPSBlbGVtLT5uZXh0OworCSAgICBlbXNnX3NpbGVudCA9IGVsZW0tPnNhdmVkX2Vtc2dfc2lsZW50OworCSAgICB2aW1fZnJlZShlbGVtKTsKKwkgICAgY3N0YWNrLT5jc19mbGFnc1tpZHhdICY9IH5DU0ZfU0lMRU5UOworCX0KKwlpZiAoc3RvcCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBpZHg7Cit9CisKKy8qCisgKiBSZXdpbmQgY29uZGl0aW9uYWxzIHVudGlsIGluZGV4ICJpZHgiIGlzIHJlYWNoZWQuICAiY29uZF90eXBlIiBhbmQKKyAqICJjb25kX2xldmVsIiBzcGVjaWZ5IGEgY29uZGl0aW9uYWwgdHlwZSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBsZXZlbCB2YXJpYWJsZQorICogd2hpY2ggaXMgdG8gYmUgZGVjcmVtZW50ZWQgd2l0aCBlYWNoIHNraXBwZWQgY29uZGl0aW9uYWwgb2YgdGhlIHNwZWNpZmllZAorICogdHlwZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZXdpbmRfY29uZGl0aW9uYWxzKGNzdGFjaywgaWR4LCBjb25kX3R5cGUsIGNvbmRfbGV2ZWwpCisgICAgc3RydWN0IGNvbmRzdGFjayAgICpjc3RhY2s7CisgICAgaW50CQlpZHg7CisgICAgaW50CQljb25kX3R5cGU7CisgICAgaW50CQkqY29uZF9sZXZlbDsKK3sKKyAgICB3aGlsZSAoY3N0YWNrLT5jc19pZHggPiBpZHgpCisgICAgeworCWlmIChjc3RhY2stPmNzX2ZsYWdzW2NzdGFjay0+Y3NfaWR4XSAmIGNvbmRfdHlwZSkKKwkgICAgLS0qY29uZF9sZXZlbDsKKwktLWNzdGFjay0+Y3NfaWR4OworICAgIH0KK30KKworLyoKKyAqICI6ZW5kZnVuY3Rpb24iIHdoZW4gbm90IGFmdGVyIGEgIjpmdW5jdGlvbiIKKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZXhfZW5kZnVuY3Rpb24oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBFTVNHKF8oIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgc3RyaW5nICJwIiBsb29rcyBsaWtlIGEgIjp3aGlsZSIgY29tbWFuZC4KKyAqLworICAgIGludAoraGFzX3doaWxlX2NtZChwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBwID0gc2tpcHdoaXRlKHApOworICAgIHdoaWxlICgqcCA9PSAnOicpCisJcCA9IHNraXB3aGl0ZShwICsgMSk7CisgICAgaWYgKHBbMF0gPT0gJ3cnICYmIHBbMV0gPT0gJ2gnKQorCXJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIEZFQVRfRVZBTCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2V4X2dldGxuLmMgYi9zcmMvZXhfZ2V0bG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI0MjgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V4X2dldGxuLmMKQEAgLTAsMCArMSw1MzcxIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBleF9nZXRsbi5jOiBGdW5jdGlvbnMgZm9yIGVudGVyaW5nIGFuZCBlZGl0aW5nIGFuIEV4IGNvbW1hbmQgbGluZS4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKy8qCisgKiBWYXJpYWJsZXMgc2hhcmVkIGJldHdlZW4gZ2V0Y21kbGluZSgpLCByZWRyYXdjbWRsaW5lKCkgYW5kIG90aGVycy4KKyAqIFRoZXNlIG5lZWQgdG8gYmUgc2F2ZWQgd2hlbiB1c2luZyBDVFJMLVIgfCwgdGhhdCdzIHdoeSB0aGV5IGFyZSBpbiBhCisgKiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBjbWRsaW5lX2luZm8KK3sKKyAgICBjaGFyX3UJKmNtZGJ1ZmY7CS8qIHBvaW50ZXIgdG8gY29tbWFuZCBsaW5lIGJ1ZmZlciAqLworICAgIGludAkJY21kYnVmZmxlbjsJLyogbGVuZ3RoIG9mIGNtZGJ1ZmYgKi8KKyAgICBpbnQJCWNtZGxlbjsJCS8qIG51bWJlciBvZiBjaGFycyBpbiBjb21tYW5kIGxpbmUgKi8KKyAgICBpbnQJCWNtZHBvczsJCS8qIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICovCisgICAgaW50CQljbWRzcG9zOwkvKiBjdXJzb3IgY29sdW1uIG9uIHNjcmVlbiAqLworICAgIGludAkJY21kZmlyc3RjOwkvKiAnOicsICcvJywgJz8nLCAnPScgb3IgTlVMICovCisgICAgaW50CQljbWRpbmRlbnQ7CS8qIG51bWJlciBvZiBzcGFjZXMgYmVmb3JlIGNtZGxpbmUgKi8KKyAgICBjaGFyX3UJKmNtZHByb21wdDsJLyogbWVzc2FnZSBpbiBmcm9udCBvZiBjbWRsaW5lICovCisgICAgaW50CQljbWRhdHRyOwkvKiBhdHRyaWJ1dGVzIGZvciBwcm9tcHQgKi8KKyAgICBpbnQJCW92ZXJzdHJpa2U7CS8qIFR5cGluZyBtb2RlIG9uIHRoZSBjb21tYW5kIGxpbmUuICBTaGFyZWQgYnkKKwkJCQkgICBnZXRjbWRsaW5lKCkgYW5kIHB1dF9vbl9jbWRsaW5lKCkuICovCit9OworCitzdGF0aWMgc3RydWN0IGNtZGxpbmVfaW5mbyBjY2xpbmU7CS8qIGN1cnJlbnQgY21kbGluZV9pbmZvICovCisKK3N0YXRpYyBpbnQJY21kX3Nob3d0YWlsOwkJLyogT25seSBzaG93IHBhdGggdGFpbCBpbiBsaXN0cyA/ICovCisKKyNpZmRlZiBGRUFUX0VWQUwKK3N0YXRpYyBpbnQJbmV3X2NtZHBvczsJLyogcG9zaXRpb24gc2V0IGJ5IHNldF9jbWRsaW5lX3BvcygpICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ01ESElTVAordHlwZWRlZiBzdHJ1Y3QgaGlzdF9lbnRyeQoreworICAgIGludAkJaGlzbnVtOwkJLyogaWRlbnRpZnlpbmcgbnVtYmVyICovCisgICAgY2hhcl91CSpoaXNzdHI7CS8qIGFjdHVhbCBlbnRyeSwgc2VwYXJhdG9yIGNoYXIgYWZ0ZXIgdGhlIE5VTCAqLworfSBoaXN0ZW50cnlfVDsKKworc3RhdGljIGhpc3RlbnRyeV9UICooaGlzdG9yeVtISVNUX0NPVU5UXSkgPSB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CitzdGF0aWMgaW50CWhpc2lkeFtISVNUX0NPVU5UXSA9IHstMSwgLTEsIC0xLCAtMSwgLTF9OyAgLyogbGFzdHVzZWQgZW50cnkgKi8KK3N0YXRpYyBpbnQJaGlzbnVtW0hJU1RfQ09VTlRdID0gezAsIDAsIDAsIDAsIDB9OworCQkgICAgLyogaWRlbnRpZnlpbmcgKHVuaXF1ZSkgbnVtYmVyIG9mIG5ld2VzdCBoaXN0b3J5IGVudHJ5ICovCitzdGF0aWMgaW50CWhpc2xlbiA9IDA7CQkvKiBhY3R1YWwgbGVuZ3RoIG9mIGhpc3RvcnkgdGFibGVzICovCisKK3N0YXRpYyBpbnQJaGlzdF9jaGFyMnR5cGUgX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQJaW5pdF9oaXN0b3J5IF9fQVJHUygodm9pZCkpOworCitzdGF0aWMgaW50CWluX2hpc3RvcnkgX19BUkdTKChpbnQsIGNoYXJfdSAqLCBpbnQpKTsKKyMgaWZkZWYgRkVBVF9FVkFMCitzdGF0aWMgaW50CWNhbGNfaGlzdF9pZHggX19BUkdTKChpbnQgaGlzdHlwZSwgaW50IG51bSkpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorc3RhdGljIGludAljbWRfaGttYXAgPSAwOwkvKiBIZWJyZXcgbWFwcGluZyBkdXJpbmcgY29tbWFuZCBsaW5lICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfRktNQVAKK3N0YXRpYyBpbnQJY21kX2ZrbWFwID0gMDsJLyogRmFyc2kgbWFwcGluZyBkdXJpbmcgY29tbWFuZCBsaW5lICovCisjZW5kaWYKKworc3RhdGljIGludAljbWRsaW5lX2NoYXJzaXplIF9fQVJHUygoaW50IGlkeCkpOworc3RhdGljIHZvaWQJc2V0X2NtZHNwb3MgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlzZXRfY21kc3Bvc19jdXJzb3IgX19BUkdTKCh2b2lkKSk7CisjaWZkZWYgRkVBVF9NQllURQorc3RhdGljIHZvaWQJY29ycmVjdF9jbWRzcG9zIF9fQVJHUygoaW50IGlkeCwgaW50IGNlbGxzKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCWFsbG9jX2NtZGJ1ZmYgX19BUkdTKChpbnQgbGVuKSk7CitzdGF0aWMgaW50CXJlYWxsb2NfY21kYnVmZiBfX0FSR1MoKGludCBsZW4pKTsKK3N0YXRpYyB2b2lkCWRyYXdfY21kbGluZSBfX0FSR1MoKGludCBzdGFydCwgaW50IGxlbikpOworI2lmIGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKQorc3RhdGljIHZvaWQJcmVkcmF3Y21kX3ByZWVkaXQgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTERNRU5VCitzdGF0aWMgdm9pZAljbWRsaW5lX2RlbCBfX0FSR1MoKGludCBmcm9tKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCXJlZHJhd2NtZHByb21wdCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCWN1cnNvcmNtZCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQJY2NoZWNrX2FiYnIgX19BUkdTKChpbnQpKTsKK3N0YXRpYyBpbnQJbmV4dHdpbGQgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCB0eXBlLCBpbnQgb3B0aW9ucykpOworc3RhdGljIGludAlzaG93bWF0Y2hlcyBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IHdpbGRtZW51KSk7CitzdGF0aWMgdm9pZAlzZXRfZXhwYW5kX2NvbnRleHQgX19BUkdTKChleHBhbmRfVCAqeHApKTsKK3N0YXRpYyBpbnQJRXhwYW5kRnJvbUNvbnRleHQgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqLCBpbnQgKiwgY2hhcl91ICoqKiwgaW50KSk7CitzdGF0aWMgaW50CWV4cGFuZF9zaG93dGFpbCBfX0FSR1MoKGV4cGFuZF9UICp4cCkpOworI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorc3RhdGljIGludAlFeHBhbmRSVERpciBfX0FSR1MoKGNoYXJfdSAqcGF0LCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSwgY2hhciAqZGlybmFtZSkpOworIyBpZiBkZWZpbmVkKEZFQVRfVVNSX0NNRFMpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorc3RhdGljIGludAlFeHBhbmRVc2VyRGVmaW5lZCBfX0FSR1MoKGV4cGFuZF9UICp4cCwgcmVnbWF0Y2hfVCAqcmVnbWF0Y2gsIGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlKSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ01EV0lOCitzdGF0aWMgaW50CWV4X3dpbmRvdyBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorCisvKgorICogZ2V0Y21kbGluZSgpIC0gYWNjZXB0IGEgY29tbWFuZCBsaW5lIHN0YXJ0aW5nIHdpdGggZmlyc3RjLgorICoKKyAqIGZpcnN0YyA9PSAnOicJICAgIGdldCAiOiIgY29tbWFuZCBsaW5lLgorICogZmlyc3RjID09ICcvJyBvciAnPycJICAgIGdldCBzZWFyY2ggcGF0dGVybgorICogZmlyc3RjID09ICc9JwkgICAgZ2V0IGV4cHJlc3Npb24KKyAqIGZpcnN0YyA9PSAnQCcJICAgIGdldCB0ZXh0IGZvciBpbnB1dCgpIGZ1bmN0aW9uCisgKiBmaXJzdGMgPT0gJz4nCSAgICBnZXQgdGV4dCBmb3IgZGVidWcgbW9kZQorICogZmlyc3RjID09IE5VTAkgICAgZ2V0IHRleHQgZm9yIDppbnNlcnQgY29tbWFuZAorICogZmlyc3RjID09IC0xCQkgICAgbGlrZSBOVUwsIGFuZCBicmVhayBvbiBDVFJMLUMKKyAqCisgKiBUaGUgbGluZSBpcyBjb2xsZWN0ZWQgaW4gY2NsaW5lLmNtZGJ1ZmYsIHdoaWNoIGlzIHJlYWxsb2NhdGVkIHRvIGZpdCB0aGUKKyAqIGNvbW1hbmQgbGluZS4KKyAqCisgKiBDYXJlZnVsOiBnZXRjbWRsaW5lKCkgY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseSEKKyAqCisgKiBSZXR1cm4gcG9pbnRlciB0byBhbGxvY2F0ZWQgc3RyaW5nIGlmIHRoZXJlIGlzIGEgY29tbWFuZGxpbmUsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK2dldGNtZGxpbmUoZmlyc3RjLCBjb3VudCwgaW5kZW50KQorICAgIGludAkJZmlyc3RjOworICAgIGxvbmcJY291bnQ7CQkvKiBvbmx5IHVzZWQgZm9yIGluY3JlbWVudGFsIHNlYXJjaCAqLworICAgIGludAkJaW5kZW50OwkJLyogaW5kZW50IGZvciBpbnNpZGUgY29uZGl0aW9uYWxzICovCit7CisgICAgaW50CQljOworICAgIGludAkJaTsKKyAgICBpbnQJCWo7CisgICAgaW50CQlnb3Rlc2MgPSBGQUxTRTsJCS8qIFRSVUUgd2hlbiA8RVNDPiBqdXN0IHR5cGVkICovCisgICAgaW50CQlkb19hYmJyOwkJLyogd2hlbiBUUlVFIGNoZWNrIGZvciBhYmJyLiAqLworI2lmZGVmIEZFQVRfQ01ESElTVAorICAgIGNoYXJfdQkqbG9va2ZvciA9IE5VTEw7CS8qIHN0cmluZyB0byBtYXRjaCAqLworICAgIGludAkJaGlzY250OwkJCS8qIGN1cnJlbnQgaGlzdG9yeSBsaW5lIGluIHVzZSAqLworICAgIGludAkJaGlzdHlwZTsJCS8qIGhpc3RvcnkgdHlwZSB0byBiZSB1c2VkICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIHBvc19UCW9sZF9jdXJzb3I7CisgICAgY29sbnJfVAlvbGRfY3Vyc3dhbnQ7CisgICAgY29sbnJfVAlvbGRfbGVmdGNvbDsKKyAgICBsaW5lbnJfVAlvbGRfdG9wbGluZTsKKyMgaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQlvbGRfdG9wZmlsbDsKKyMgZW5kaWYKKyAgICBsaW5lbnJfVAlvbGRfYm90bGluZTsKKyAgICBpbnQJCWRpZF9pbmNzZWFyY2ggPSBGQUxTRTsKKyAgICBpbnQJCWluY3NlYXJjaF9wb3N0cG9uZWQgPSBGQUxTRTsKKyNlbmRpZgorICAgIGludAkJZGlkX3dpbGRfbGlzdCA9IEZBTFNFOwkvKiBkaWQgd2lsZF9saXN0KCkgcmVjZW50bHkgKi8KKyAgICBpbnQJCXdpbV9pbmRleCA9IDA7CQkvKiBpbmRleCBpbiB3aW1fZmxhZ3NbXSAqLworICAgIGludAkJcmVzOworICAgIGludAkJc2F2ZV9tc2dfc2Nyb2xsID0gbXNnX3Njcm9sbDsKKyAgICBpbnQJCXNhdmVfU3RhdGUgPSBTdGF0ZTsJLyogcmVtZW1iZXIgU3RhdGUgd2hlbiBjYWxsZWQgKi8KKyAgICBpbnQJCXNvbWVfa2V5X3R5cGVkID0gRkFMU0U7CS8qIG9uZSBvZiB0aGUga2V5cyB3YXMgdHlwZWQgKi8KKyNpZmRlZiBGRUFUX01PVVNFCisgICAgLyogbW91c2UgZHJhZyBhbmQgcmVsZWFzZSBldmVudHMgYXJlIGlnbm9yZWQsIHVubGVzcyB0aGV5IGFyZQorICAgICAqIHByZWNlZGVkIHdpdGggYSBtb3VzZSBkb3duIGV2ZW50ICovCisgICAgaW50CQlpZ25vcmVfZHJhZ19yZWxlYXNlID0gVFJVRTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRVZBTAorICAgIGludAkJYnJlYWtfY3RybF9jID0gRkFMU0U7CisjZW5kaWYKKyAgICBleHBhbmRfVAl4cGM7CisgICAgbG9uZwkqYl9pbV9wdHIgPSBOVUxMOworCisjaWZkZWYgRkVBVF9TTklGRgorICAgIHdhbnRfc25pZmZfcmVxdWVzdCA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoZmlyc3RjID09IC0xKQorICAgIHsKKwlmaXJzdGMgPSBOVUw7CisJYnJlYWtfY3RybF9jID0gVFJVRTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIC8qIHN0YXJ0IHdpdGhvdXQgSGVicmV3IG1hcHBpbmcgZm9yIGEgY29tbWFuZCBsaW5lICovCisgICAgaWYgKGZpcnN0YyA9PSAnOicgfHwgZmlyc3RjID09ICc9JyB8fCBmaXJzdGMgPT0gJz4nKQorCWNtZF9oa21hcCA9IDA7CisjZW5kaWYKKworICAgIGNjbGluZS5vdmVyc3RyaWtlID0gRkFMU0U7CQkgICAgLyogYWx3YXlzIHN0YXJ0IGluIGluc2VydCBtb2RlICovCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBvbGRfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsJICAgIC8qIG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyICovCisgICAgb2xkX2N1cnN3YW50ID0gY3Vyd2luLT53X2N1cnN3YW50OworICAgIG9sZF9sZWZ0Y29sID0gY3Vyd2luLT53X2xlZnRjb2w7CisgICAgb2xkX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyMgaWZkZWYgRkVBVF9ESUZGCisgICAgb2xkX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyMgZW5kaWYKKyAgICBvbGRfYm90bGluZSA9IGN1cndpbi0+d19ib3RsaW5lOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIHNldCBzb21lIHZhcmlhYmxlcyBmb3IgcmVkcmF3Y21kKCkKKyAgICAgKi8KKyAgICBjY2xpbmUuY21kZmlyc3RjID0gKGZpcnN0YyA9PSAnQCcgPyAwIDogZmlyc3RjKTsKKyAgICBjY2xpbmUuY21kaW5kZW50ID0gaW5kZW50OworICAgIGFsbG9jX2NtZGJ1ZmYoZXhtb2RlX2FjdGl2ZSA/IDI1MCA6IDApOyAvKiBhbGxvYyBpbml0aWFsIGNjbGluZS5jbWRidWZmICovCisgICAgaWYgKGNjbGluZS5jbWRidWZmID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CQkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICBjY2xpbmUuY21kbGVuID0gY2NsaW5lLmNtZHBvcyA9IDA7CisgICAgY2NsaW5lLmNtZGJ1ZmZbMF0gPSBOVUw7CisKKyAgICBFeHBhbmRJbml0KCZ4cGMpOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoY3Vyd2luLT53X3BfcmwgJiYgKmN1cndpbi0+d19wX3JsYyA9PSAncycKKwkJCQkJICAmJiAoZmlyc3RjID09ICcvJyB8fCBmaXJzdGMgPT0gJz8nKSkKKwljbWRtc2dfcmwgPSBUUlVFOworICAgIGVsc2UKKwljbWRtc2dfcmwgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgcmVkaXJfb2ZmID0gVFJVRTsJCS8qIGRvbid0IHJlZGlyZWN0IHRoZSB0eXBlZCBjb21tYW5kICovCisgICAgaWYgKCFjbWRfc2lsZW50KQorICAgIHsKKwlpID0gbXNnX3Njcm9sbGVkOworCW1zZ19zY3JvbGxlZCA9IDA7CQkvKiBhdm9pZCB3YWl0X3JldHVybiBtZXNzYWdlICovCisJZ290b2NtZGxpbmUoVFJVRSk7CisJbXNnX3Njcm9sbGVkICs9IGk7CisJcmVkcmF3Y21kcHJvbXB0KCk7CQkvKiBkcmF3IHByb21wdCBvciBpbmRlbnQgKi8KKwlzZXRfY21kc3BvcygpOworICAgIH0KKyAgICB4cGMueHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworICAgIHhwYy54cF9iYWNrc2xhc2ggPSBYUF9CU19OT05FOworCisgICAgLyoKKyAgICAgKiBBdm9pZCBzY3JvbGxpbmcgd2hlbiBjYWxsZWQgYnkgYSByZWN1cnNpdmUgZG9fY21kbGluZSgpLCBlLmcuIHdoZW4KKyAgICAgKiBkb2luZyAiOkAwIiB3aGVuIHJlZ2lzdGVyIDAgZG9lc24ndCBjb250YWluIGEgQ1IuCisgICAgICovCisgICAgbXNnX3Njcm9sbCA9IEZBTFNFOworCisgICAgU3RhdGUgPSBDTURMSU5FOworCisgICAgaWYgKGZpcnN0YyA9PSAnLycgfHwgZmlyc3RjID09ICc/JyB8fCBmaXJzdGMgPT0gJ0AnKQorICAgIHsKKwkvKiBVc2UgIjpsbWFwIiBtYXBwaW5ncyBmb3Igc2VhcmNoIHBhdHRlcm4gYW5kIGlucHV0KCkuICovCisJaWYgKGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoID09IEJfSU1PREVfVVNFX0lOU0VSVCkKKwkgICAgYl9pbV9wdHIgPSAmY3VyYnVmLT5iX3BfaW1pbnNlcnQ7CisJZWxzZQorCSAgICBiX2ltX3B0ciA9ICZjdXJidWYtPmJfcF9pbXNlYXJjaDsKKwlpZiAoKmJfaW1fcHRyID09IEJfSU1PREVfTE1BUCkKKwkgICAgU3RhdGUgfD0gTEFOR01BUDsKKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorCWltX3NldF9hY3RpdmUoKmJfaW1fcHRyID09IEJfSU1PREVfSU0pOworI2VuZGlmCisgICAgfQorI2lmZGVmIFVTRV9JTV9DT05UUk9MCisgICAgZWxzZSBpZiAocF9pbWNtZGxpbmUpCisJaW1fc2V0X2FjdGl2ZShUUlVFKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIHNldG1vdXNlKCk7CisjZW5kaWYKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKyAgICB1aV9jdXJzb3Jfc2hhcGUoKTsJCS8qIG1heSBzaG93IGRpZmZlcmVudCBjdXJzb3Igc2hhcGUgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgaW5pdF9oaXN0b3J5KCk7CisgICAgaGlzY250ID0gaGlzbGVuOwkJLyogc2V0IGhpc2NudCB0byBpbXBvc3NpYmxlIGhpc3RvcnkgdmFsdWUgKi8KKyAgICBoaXN0eXBlID0gaGlzdF9jaGFyMnR5cGUoZmlyc3RjKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9ESUdSQVBIUworICAgIGRvX2RpZ3JhcGgoLTEpOwkJLyogaW5pdCBkaWdyYXBoIHR5cGFoZWFkICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogQ29sbGVjdCB0aGUgY29tbWFuZCBzdHJpbmcsIGhhbmRsaW5nIGVkaXRpbmcga2V5cy4KKyAgICAgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorCWRvbnRfc2Nyb2xsID0gRkFMU0U7CS8qIGFsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKwlxdWl0X21vcmUgPSBGQUxTRTsJLyogcmVzZXQgYWZ0ZXIgQ1RSTC1EIHdoaWNoIGhhZCBhIG1vcmUtcHJvbXB0ICovCisKKwljdXJzb3JjbWQoKTsJCS8qIHNldCB0aGUgY3Vyc29yIG9uIHRoZSByaWdodCBzcG90ICovCisJYyA9IHNhZmVfdmdldGMoKTsKKwlpZiAoS2V5VHlwZWQpCisJeworCSAgICBzb21lX2tleV90eXBlZCA9IFRSVUU7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgaWYgKGNtZF9oa21hcCkKKwkJYyA9IGhrbWFwKGMpOworIyBpZmRlZiBGRUFUX0ZLTUFQCisJICAgIGlmIChjbWRfZmttYXApCisJCWMgPSBjbWRsX2ZrbWFwKGMpOworIyBlbmRpZgorCSAgICBpZiAoY21kbXNnX3JsICYmICFLZXlTdHVmZmVkKQorCSAgICB7CisJCS8qIEludmVydCBob3Jpem9udGFsIG1vdmVtZW50cyBhbmQgb3BlcmF0aW9ucy4gIE9ubHkgd2hlbgorCQkgKiB0eXBlZCBieSB0aGUgdXNlciBkaXJlY3RseSwgbm90IHdoZW4gdGhlIHJlc3VsdCBvZiBhCisJCSAqIG1hcHBpbmcuICovCisJCXN3aXRjaCAoYykKKwkJeworCQkgICAgY2FzZSBLX1JJR0hUOiAgIGMgPSBLX0xFRlQ7IGJyZWFrOworCQkgICAgY2FzZSBLX1NfUklHSFQ6IGMgPSBLX1NfTEVGVDsgYnJlYWs7CisJCSAgICBjYXNlIEtfQ19SSUdIVDogYyA9IEtfQ19MRUZUOyBicmVhazsKKwkJICAgIGNhc2UgS19MRUZUOiAgICBjID0gS19SSUdIVDsgYnJlYWs7CisJCSAgICBjYXNlIEtfU19MRUZUOiAgYyA9IEtfU19SSUdIVDsgYnJlYWs7CisJCSAgICBjYXNlIEtfQ19MRUZUOiAgYyA9IEtfQ19SSUdIVDsgYnJlYWs7CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorCisJLyoKKwkgKiBJZ25vcmUgZ290X2ludCB3aGVuIENUUkwtQyB3YXMgdHlwZWQgaGVyZS4KKwkgKiBEb24ndCBpZ25vcmUgaXQgaW4gOmdsb2JhbCwgd2UgcmVhbGx5IG5lZWQgdG8gYnJlYWsgdGhlbiwgZS5nLiwgZm9yCisJICogIjpnL3BhdC9ub3JtYWwgL3BhdCIgKHdpdGhvdXQgdGhlIDxDUj4pLgorCSAqIERvbid0IGlnbm9yZSBpdCBmb3IgdGhlIGlucHV0KCkgZnVuY3Rpb24uCisJICovCisJaWYgKChjID09IEN0cmxfQworI2lmZGVmIFVOSVgKKwkJfHwgYyA9PSBpbnRyX2NoYXIKKyNlbmRpZgorCQkJCSkKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX0NSWVBUKQorCQkmJiBmaXJzdGMgIT0gJ0AnCisjZW5kaWYKKyNpZmRlZiBGRUFUX0VWQUwKKwkJJiYgIWJyZWFrX2N0cmxfYworI2VuZGlmCisJCSYmICFnbG9iYWxfYnVzeSkKKwkgICAgZ290X2ludCA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9DTURISVNUCisJLyogZnJlZSBvbGQgY29tbWFuZCBsaW5lIHdoZW4gZmluaXNoZWQgbW92aW5nIGFyb3VuZCBpbiB0aGUgaGlzdG9yeQorCSAqIGxpc3QgKi8KKwlpZiAobG9va2ZvciAhPSBOVUxMCisJCSYmIGMgIT0gS19TX0RPV04gJiYgYyAhPSBLX1NfVVAgJiYgYyAhPSBLX0RPV04gJiYgYyAhPSBLX1VQCisJCSYmIGMgIT0gS19QQUdFRE9XTiAmJiBjICE9IEtfUEFHRVVQCisJCSYmIGMgIT0gS19LUEFHRURPV04gJiYgYyAhPSBLX0tQQUdFVVAKKwkJJiYgYyAhPSBLX0xFRlQgJiYgYyAhPSBLX1JJR0hUCisJCSYmICh4cGMueHBfbnVtZmlsZXMgPiAwIHx8IChjICE9IEN0cmxfUCAmJiBjICE9IEN0cmxfTikpKQorCXsKKwkgICAgdmltX2ZyZWUobG9va2Zvcik7CisJICAgIGxvb2tmb3IgPSBOVUxMOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiA8Uy1UYWI+IHdvcmtzIGxpa2UgQ1RSTC1QICh1bmxlc3MgJ3djJyBpcyA8Uy1UYWI+KS4KKwkgKi8KKwlpZiAoYyAhPSBwX3djICYmIGMgPT0gS19TX1RBQiAmJiB4cGMueHBfbnVtZmlsZXMgIT0gLTEpCisJICAgIGMgPSBDdHJsX1A7CisKKyNpZmRlZiBGRUFUX1dJTERNRU5VCisJLyogU3BlY2lhbCB0cmFuc2xhdGlvbnMgZm9yICd3aWxkbWVudScgKi8KKwlpZiAoZGlkX3dpbGRfbGlzdCAmJiBwX3dtbnUpCisJeworCSAgICBpZiAoYyA9PSBLX0xFRlQpCisJCWMgPSBDdHJsX1A7CisJICAgIGVsc2UgaWYgKGMgPT0gS19SSUdIVCkKKwkJYyA9IEN0cmxfTjsKKwl9CisJLyogSGl0dGluZyBDUiBhZnRlciAiZW1lbnUgTmFtZS4iOiBjb21wbGV0ZSBzdWJtZW51ICovCisJaWYgKHhwYy54cF9jb250ZXh0ID09IEVYUEFORF9NRU5VTkFNRVMgJiYgcF93bW51CisJCSYmIGNjbGluZS5jbWRwb3MgPiAxCisJCSYmIGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgLSAxXSA9PSAnLicKKwkJJiYgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvcyAtIDJdICE9ICdcXCcKKwkJJiYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSBLX0tFTlRFUikpCisJICAgIGMgPSBLX0RPV047CisjZW5kaWYKKworCS8qIGZyZWUgZXhwYW5kZWQgbmFtZXMgd2hlbiBmaW5pc2hlZCB3YWxraW5nIHRocm91Z2ggbWF0Y2hlcyAqLworCWlmICh4cGMueHBfbnVtZmlsZXMgIT0gLTEKKwkJJiYgIShjID09IHBfd2MgJiYgS2V5VHlwZWQpICYmIGMgIT0gcF93Y20KKwkJJiYgYyAhPSBDdHJsX04gJiYgYyAhPSBDdHJsX1AgJiYgYyAhPSBDdHJsX0EKKwkJJiYgYyAhPSBDdHJsX0wpCisJeworCSAgICAodm9pZClFeHBhbmRPbmUoJnhwYywgTlVMTCwgTlVMTCwgMCwgV0lMRF9GUkVFKTsKKwkgICAgZGlkX3dpbGRfbGlzdCA9IEZBTFNFOworI2lmZGVmIEZFQVRfV0lMRE1FTlUKKwkgICAgaWYgKCFwX3dtbnUgfHwgKGMgIT0gS19VUCAmJiBjICE9IEtfRE9XTikpCisjZW5kaWYKKwkJeHBjLnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwkgICAgd2ltX2luZGV4ID0gMDsKKyNpZmRlZiBGRUFUX1dJTERNRU5VCisJICAgIGlmIChwX3dtbnUgJiYgd2lsZF9tZW51X3Nob3dpbmcgIT0gMCkKKwkgICAgeworCQlpbnQgc2t0ID0gS2V5VHlwZWQ7CisKKwkJaWYgKHdpbGRfbWVudV9zaG93aW5nID09IFdNX1NDUk9MTEVEKQorCQl7CisJCSAgICAvKiBFbnRlcmVkIGNvbW1hbmQgbGluZSwgbW92ZSBpdCB1cCAqLworCQkgICAgY21kbGluZV9yb3ctLTsKKwkJICAgIHJlZHJhd2NtZCgpOworCQl9CisJCWVsc2UgaWYgKHNhdmVfcF9scyAhPSAtMSkKKwkJeworCQkgICAgLyogcmVzdG9yZSAnbGFzdHN0YXR1cycgYW5kICd3aW5taW5oZWlnaHQnICovCisJCSAgICBwX2xzID0gc2F2ZV9wX2xzOworCQkgICAgcF93bWggPSBzYXZlX3Bfd21oOworCQkgICAgbGFzdF9zdGF0dXMoRkFMU0UpOworCQkgICAgdXBkYXRlX3NjcmVlbihWQUxJRCk7CS8qIHJlZHJhdyB0aGUgc2NyZWVuIE5PVyAqLworCQkgICAgcmVkcmF3Y21kKCk7CisJCSAgICBzYXZlX3BfbHMgPSAtMTsKKwkJfQorCQllbHNlCisJCXsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJICAgIHdpbl9yZWRyYXdfbGFzdF9zdGF0dXModG9wZnJhbWUpOworIyBlbHNlCisJCSAgICBsYXN0d2luLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyMgZW5kaWYKKwkJICAgIHJlZHJhd19zdGF0dXNsaW5lcygpOworCQl9CisJCUtleVR5cGVkID0gc2t0OworCQl3aWxkX21lbnVfc2hvd2luZyA9IDA7CisJICAgIH0KKyNlbmRpZgorCX0KKworI2lmZGVmIEZFQVRfV0lMRE1FTlUKKwkvKiBTcGVjaWFsIHRyYW5zbGF0aW9ucyBmb3IgJ3dpbGRtZW51JyAqLworCWlmICh4cGMueHBfY29udGV4dCA9PSBFWFBBTkRfTUVOVU5BTUVTICYmIHBfd21udSkKKwl7CisJICAgIC8qIEhpdHRpbmcgPERvd24+IGFmdGVyICJlbWVudSBOYW1lLiI6IGNvbXBsZXRlIHN1Ym1lbnUgKi8KKwkgICAgaWYgKGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgLSAxXSA9PSAnLicgJiYgYyA9PSBLX0RPV04pCisJCWMgPSBwX3djOworCSAgICBlbHNlIGlmIChjID09IEtfVVApCisJICAgIHsKKwkJLyogSGl0dGluZyA8VXA+OiBSZW1vdmUgb25lIHN1Ym1lbnUgbmFtZSBpbiBmcm9udCBvZiB0aGUKKwkJICogY3Vyc29yICovCisJCWludCBmb3VuZCA9IEZBTFNFOworCisJCWogPSAoaW50KSh4cGMueHBfcGF0dGVybiAtIGNjbGluZS5jbWRidWZmKTsKKwkJaSA9IDA7CisJCXdoaWxlICgtLWogPiAwKQorCQl7CisJCSAgICAvKiBjaGVjayBmb3Igc3RhcnQgb2YgbWVudSBuYW1lICovCisJCSAgICBpZiAoY2NsaW5lLmNtZGJ1ZmZbal0gPT0gJyAnCisJCQkgICAgJiYgY2NsaW5lLmNtZGJ1ZmZbaiAtIDFdICE9ICdcXCcpCisJCSAgICB7CisJCQlpID0gaiArIDE7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIC8qIGNoZWNrIGZvciBzdGFydCBvZiBzdWJtZW51IG5hbWUgKi8KKwkJICAgIGlmIChjY2xpbmUuY21kYnVmZltqXSA9PSAnLicKKwkJCSAgICAmJiBjY2xpbmUuY21kYnVmZltqIC0gMV0gIT0gJ1xcJykKKwkJICAgIHsKKwkJCWlmIChmb3VuZCkKKwkJCXsKKwkJCSAgICBpID0gaiArIDE7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQkgICAgZm91bmQgPSBUUlVFOworCQkgICAgfQorCQl9CisJCWlmIChpID4gMCkKKwkJICAgIGNtZGxpbmVfZGVsKGkpOworCQljID0gcF93YzsKKwkJeHBjLnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwkgICAgfQorCX0KKwlpZiAoeHBjLnhwX2NvbnRleHQgPT0gRVhQQU5EX0ZJTEVTICYmIHBfd21udSkKKwl7CisJICAgIGNoYXJfdSB1cHNlZ1s1XTsKKworCSAgICB1cHNlZ1swXSA9IFBBVEhTRVA7CisJICAgIHVwc2VnWzFdID0gJy4nOworCSAgICB1cHNlZ1syXSA9ICcuJzsKKwkgICAgdXBzZWdbM10gPSBQQVRIU0VQOworCSAgICB1cHNlZ1s0XSA9IE5VTDsKKworCSAgICBpZiAoY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvcyAtIDFdID09IFBBVEhTRVAKKwkJICAgICYmIGMgPT0gS19ET1dOCisJCSAgICAmJiAoY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvcyAtIDJdICE9ICcuJworCQkJfHwgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvcyAtIDNdICE9ICcuJykpCisJICAgIHsKKwkJLyogZ28gZG93biBhIGRpcmVjdG9yeSAqLworCQljID0gcF93YzsKKwkgICAgfQorCSAgICBlbHNlIGlmIChTVFJOQ01QKHhwYy54cF9wYXR0ZXJuLCB1cHNlZyArIDEsIDMpID09IDAgJiYgYyA9PSBLX0RPV04pCisJICAgIHsKKwkJLyogSWYgaW4gYSBkaXJlY3QgYW5jZXN0b3IsIHN0cmlwIG9mZiBvbmUgLi4vIHRvIGdvIGRvd24gKi8KKwkJaW50IGZvdW5kID0gRkFMU0U7CisKKwkJaiA9IGNjbGluZS5jbWRwb3M7CisJCWkgPSAoaW50KSh4cGMueHBfcGF0dGVybiAtIGNjbGluZS5jbWRidWZmKTsKKwkJd2hpbGUgKC0taiA+IGkpCisJCXsKKwkJICAgIGlmICh2aW1faXNwYXRoc2VwKGNjbGluZS5jbWRidWZmW2pdKSkKKwkJICAgIHsKKwkJCWZvdW5kID0gVFJVRTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWlmIChmb3VuZAorCQkJJiYgY2NsaW5lLmNtZGJ1ZmZbaiAtIDFdID09ICcuJworCQkJJiYgY2NsaW5lLmNtZGJ1ZmZbaiAtIDJdID09ICcuJworCQkJJiYgKHZpbV9pc3BhdGhzZXAoY2NsaW5lLmNtZGJ1ZmZbaiAtIDNdKSB8fCBqID09IGkgKyAyKSkKKwkJeworCQkgICAgY21kbGluZV9kZWwoaiAtIDIpOworCQkgICAgYyA9IHBfd2M7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmIChjID09IEtfVVApCisJICAgIHsKKwkJLyogZ28gdXAgYSBkaXJlY3RvcnkgKi8KKwkJaW50IGZvdW5kID0gRkFMU0U7CisKKwkJaiA9IGNjbGluZS5jbWRwb3MgLSAxOworCQlpID0gKGludCkoeHBjLnhwX3BhdHRlcm4gLSBjY2xpbmUuY21kYnVmZik7CisJCXdoaWxlICgtLWogPiBpKQorCQl7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgaWYgKGhhc19tYnl0ZSkKKwkJCWogLT0gKCptYl9oZWFkX29mZikoY2NsaW5lLmNtZGJ1ZmYsIGNjbGluZS5jbWRidWZmICsgaik7CisjZW5kaWYKKwkJICAgIGlmICh2aW1faXNwYXRoc2VwKGNjbGluZS5jbWRidWZmW2pdKQorI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCQkJICAgICYmIHZpbV9zdHJjaHIoIiAqP1t7YCQlIyIsIGNjbGluZS5jbWRidWZmW2ogKyAxXSkKKwkJCSAgICAgICA9PSBOVUxMCisjZW5kaWYKKwkJICAgICAgICkKKwkJICAgIHsKKwkJCWlmIChmb3VuZCkKKwkJCXsKKwkJCSAgICBpID0gaiArIDE7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQkgICAgZm91bmQgPSBUUlVFOworCQkgICAgfQorCQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJICAgIGogPSBpOworCQllbHNlIGlmIChTVFJOQ01QKGNjbGluZS5jbWRidWZmICsgaiwgdXBzZWcsIDQpID09IDApCisJCSAgICBqICs9IDQ7CisJCWVsc2UgaWYgKFNUUk5DTVAoY2NsaW5lLmNtZGJ1ZmYgKyBqLCB1cHNlZyArIDEsIDMpID09IDAKKwkJCSAgICAgJiYgaiA9PSBpKQorCQkgICAgaiArPSAzOworCQllbHNlCisJCSAgICBqID0gMDsKKwkJaWYgKGogPiAwKQorCQl7CisJCSAgICAvKiBUT0RPIHRoaXMgaXMgb25seSBmb3IgRE9TL1VOSVggc3lzdGVtcyAtIG5lZWQgdG8gcHV0IGluCisJCSAgICAgKiBtYWNoaW5lLXNwZWNpZmljIHN0dWZmIGhlcmUgYW5kIGluIHVwc2VnIGluaXQgKi8KKwkJICAgIGNtZGxpbmVfZGVsKGopOworCQkgICAgcHV0X29uX2NtZGxpbmUodXBzZWcgKyAxLCAzLCBGQUxTRSk7CisJCX0KKwkJZWxzZSBpZiAoY2NsaW5lLmNtZHBvcyA+IGkpCisJCSAgICBjbWRsaW5lX2RlbChpKTsKKwkJYyA9IHBfd2M7CisJICAgIH0KKwl9CisjaWYgMCAvKiBJZiBlbmFibGVkIDxEb3duPiBvbiBhIGZpbGUgdGFrZXMgeW91IF9jb21wbGV0ZWx5XyBvdXQgb2Ygd2lsZG1lbnUgKi8KKwlpZiAocF93bW51CisJCSYmICh4cGMueHBfY29udGV4dCA9PSBFWFBBTkRfRklMRVMKKwkJICAgIHx8IHhwYy54cF9jb250ZXh0ID09IEVYUEFORF9NRU5VTkFNRVMpCisJCSYmIChjID09IEtfVVAgfHwgYyA9PSBLX0RPV04pKQorCSAgICB4cGMueHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworI2VuZGlmCisKKyNlbmRpZgkvKiBGRUFUX1dJTERNRU5VICovCisKKwkvKiBDVFJMLVwgQ1RSTC1OIGdvZXMgdG8gTm9ybWFsIG1vZGUsIENUUkwtXCBDVFJMLUcgZ29lcyB0byBJbnNlcnQKKwkgKiBtb2RlIHdoZW4gJ2luc2VydG1vZGUnIGlzIHNldCwgQ1RSTC1cIGUgcHJvbXB0cyBmb3IgYW4gZXhwcmVzc2lvbi4gKi8KKwlpZiAoYyA9PSBDdHJsX0JTTCkKKwl7CisJICAgICsrbm9fbWFwcGluZzsKKwkgICAgKythbGxvd19rZXlzOworCSAgICBjID0gc2FmZV92Z2V0YygpOworCSAgICAtLW5vX21hcHBpbmc7CisJICAgIC0tYWxsb3dfa2V5czsKKwkgICAgLyogQ1RSTC1cIGUgZG9lc24ndCB3b3JrIHdoZW4gb2J0YWluaW5nIGFuIGV4cHJlc3Npb24uICovCisJICAgIGlmIChjICE9IEN0cmxfTiAmJiBjICE9IEN0cmxfRworCQkJCSAgICAgJiYgKGMgIT0gJ2UnIHx8IGNjbGluZS5jbWRmaXJzdGMgPT0gJz0nKSkKKwkgICAgeworCQl2dW5nZXRjKGMpOworCQljID0gQ3RybF9CU0w7CisJICAgIH0KKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgZWxzZSBpZiAoYyA9PSAnZScpCisJICAgIHsKKwkJc3RydWN0IGNtZGxpbmVfaW5mbwkgICAgc2F2ZV9jY2xpbmU7CisJCWNoYXJfdQkJICAgICpwOworCisJCS8qCisJCSAqIFJlcGxhY2UgdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbi4KKwkJICogTmVlZCB0byBzYXZlIHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZSwgdG8gYmUgYWJsZSB0byBlbnRlcgorCQkgKiBhIG5ldyBvbmUuLi4KKwkJICovCisJCWlmIChjY2xpbmUuY21kcG9zID09IGNjbGluZS5jbWRsZW4pCisJCSAgICBuZXdfY21kcG9zID0gOTk5OTk7CS8qIGtlZXAgaXQgYXQgdGhlIGVuZCAqLworCQllbHNlCisJCSAgICBuZXdfY21kcG9zID0gY2NsaW5lLmNtZHBvczsKKwkJc2F2ZV9jY2xpbmUgPSBjY2xpbmU7CisJCWNjbGluZS5jbWRidWZmID0gTlVMTDsKKwkJY2NsaW5lLmNtZHByb21wdCA9IE5VTEw7CisJCWMgPSBnZXRfZXhwcl9yZWdpc3RlcigpOworCQljY2xpbmUgPSBzYXZlX2NjbGluZTsKKwkJaWYgKGMgPT0gJz0nKQorCQl7CisJCSAgICBwID0gZ2V0X2V4cHJfbGluZSgpOworCQkgICAgaWYgKHAgIT0gTlVMTAorCQkJICAgICAmJiByZWFsbG9jX2NtZGJ1ZmYoKGludClTVFJMRU4ocCkgKyAxKSA9PSBPSykKKwkJICAgIHsKKwkJCWNjbGluZS5jbWRsZW4gPSBTVFJMRU4ocCk7CisJCQlTVFJDUFkoY2NsaW5lLmNtZGJ1ZmYsIHApOworCQkJdmltX2ZyZWUocCk7CisKKwkJCS8qIFJlc3RvcmUgdGhlIGN1cnNvciBvciB1c2UgdGhlIHBvc2l0aW9uIHNldCB3aXRoCisJCQkgKiBzZXRfY21kbGluZV9wb3MoKS4gKi8KKwkJCWlmIChuZXdfY21kcG9zID4gY2NsaW5lLmNtZGxlbikKKwkJCSAgICBjY2xpbmUuY21kcG9zID0gY2NsaW5lLmNtZGxlbjsKKwkJCWVsc2UKKwkJCSAgICBjY2xpbmUuY21kcG9zID0gbmV3X2NtZHBvczsKKworCQkJS2V5VHlwZWQgPSBGQUxTRTsJLyogRG9uJ3QgZG8gcF93YyBjb21wbGV0aW9uLiAqLworCQkJcmVkcmF3Y21kKCk7CisJCQlnb3RvIGNtZGxpbmVfY2hhbmdlZDsKKwkJICAgIH0KKwkJfQorCQliZWVwX2ZsdXNoKCk7CisJCWMgPSBFU0M7CisJICAgIH0KKyNlbmRpZgorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKGMgPT0gQ3RybF9HICYmIHBfaW0gJiYgcmVzdGFydF9lZGl0ID09IDApCisJCSAgICByZXN0YXJ0X2VkaXQgPSAnYSc7CisJCWdvdGVzYyA9IFRSVUU7CS8qIHdpbGwgZnJlZSBjY2xpbmUuY21kYnVmZiBhZnRlciBwdXR0aW5nIGl0CisJCQkJICAgaW4gaGlzdG9yeSAqLworCQlnb3RvIHJldHVybmNtZDsJLyogYmFjayB0byBOb3JtYWwgbW9kZSAqLworCSAgICB9CisJfQorCisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoYyA9PSBjZWRpdF9rZXkgfHwgYyA9PSBLX0NNRFdJTikKKwl7CisJICAgIC8qCisJICAgICAqIE9wZW4gYSB3aW5kb3cgdG8gZWRpdCB0aGUgY29tbWFuZCBsaW5lIChhbmQgaGlzdG9yeSkuCisJICAgICAqLworCSAgICBjID0gZXhfd2luZG93KCk7CisJICAgIHNvbWVfa2V5X3R5cGVkID0gVFJVRTsKKwl9CisjIGlmZGVmIEZFQVRfRElHUkFQSFMKKwllbHNlCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJR1JBUEhTCisJICAgIGMgPSBkb19kaWdyYXBoKGMpOworI2VuZGlmCisKKwlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09IEtfS0VOVEVSIHx8IChjID09IEVTQworCQkJJiYgKCFLZXlUeXBlZCB8fCB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRVNDKSAhPSBOVUxMKSkpCisJeworCSAgICBnb3Rlc2MgPSBGQUxTRTsJLyogTWlnaHQgaGF2ZSB0eXBlZCBFU0MgcHJldmlvdXNseSwgZG9uJ3QKKwkJCQkgICB0cnVuY2F0ZSB0aGUgY21kbGluZSBub3cuICovCisJICAgIGlmIChjY2hlY2tfYWJicihjICsgQUJCUl9PRkYpKQorCQlnb3RvIGNtZGxpbmVfY2hhbmdlZDsKKwkgICAgaWYgKCFjbWRfc2lsZW50KQorCSAgICB7CisJCXdpbmRnb3RvKG1zZ19yb3csIDApOworCQlvdXRfZmx1c2goKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwkvKgorCSAqIENvbXBsZXRpb24gZm9yICd3aWxkY2hhcicgb3IgJ3dpbGRjaGFybScga2V5LgorCSAqIC0gaGl0dGluZyA8RVNDPiB0d2ljZSBtZWFuczogYWJhbmRvbiBjb21tYW5kIGxpbmUuCisJICogLSB3aWxkY2FyZCBleHBhbnNpb24gaXMgb25seSBkb25lIHdoZW4gdGhlICd3aWxkY2hhcicga2V5IGlzIHJlYWxseQorCSAqICAgdHlwZWQsIG5vdCB3aGVuIGl0IGNvbWVzIGZyb20gYSBtYWNybworCSAqLworCWlmICgoYyA9PSBwX3djICYmICFnb3Rlc2MgJiYgS2V5VHlwZWQpIHx8IGMgPT0gcF93Y20pCisJeworCSAgICBpZiAoeHBjLnhwX251bWZpbGVzID4gMCkgICAvKiB0eXBlZCBwX3djIGF0IGxlYXN0IHR3aWNlICovCisJICAgIHsKKwkJLyogaWYgJ3dpbGRtb2RlJyBjb250YWlucyAibGlzdCIgbWF5IHN0aWxsIG5lZWQgdG8gbGlzdCAqLworCQlpZiAoeHBjLnhwX251bWZpbGVzID4gMQorCQkJJiYgIWRpZF93aWxkX2xpc3QKKwkJCSYmICh3aW1fZmxhZ3Nbd2ltX2luZGV4XSAmIFdJTV9MSVNUKSkKKwkJeworCQkgICAgKHZvaWQpc2hvd21hdGNoZXMoJnhwYywgRkFMU0UpOworCQkgICAgcmVkcmF3Y21kKCk7CisJCSAgICBkaWRfd2lsZF9saXN0ID0gVFJVRTsKKwkJfQorCQlpZiAod2ltX2ZsYWdzW3dpbV9pbmRleF0gJiBXSU1fTE9OR0VTVCkKKwkJICAgIHJlcyA9IG5leHR3aWxkKCZ4cGMsIFdJTERfTE9OR0VTVCwgV0lMRF9OT19CRUVQKTsKKwkJZWxzZSBpZiAod2ltX2ZsYWdzW3dpbV9pbmRleF0gJiBXSU1fRlVMTCkKKwkJICAgIHJlcyA9IG5leHR3aWxkKCZ4cGMsIFdJTERfTkVYVCwgV0lMRF9OT19CRUVQKTsKKwkJZWxzZQorCQkgICAgcmVzID0gT0s7CSAgICAvKiBkb24ndCBpbnNlcnQgJ3dpbGRjaGFyJyBub3cgKi8KKwkgICAgfQorCSAgICBlbHNlCQkgICAgLyogdHlwZWQgcF93YyBmaXJzdCB0aW1lICovCisJICAgIHsKKwkJd2ltX2luZGV4ID0gMDsKKwkJaiA9IGNjbGluZS5jbWRwb3M7CisJCS8qIGlmICd3aWxkbW9kZScgZmlyc3QgY29udGFpbnMgImxvbmdlc3QiLCBnZXQgbG9uZ2VzdAorCQkgKiBjb21tb24gcGFydCAqLworCQlpZiAod2ltX2ZsYWdzWzBdICYgV0lNX0xPTkdFU1QpCisJCSAgICByZXMgPSBuZXh0d2lsZCgmeHBjLCBXSUxEX0xPTkdFU1QsIFdJTERfTk9fQkVFUCk7CisJCWVsc2UKKwkJICAgIHJlcyA9IG5leHR3aWxkKCZ4cGMsIFdJTERfRVhQQU5EX0tFRVAsIFdJTERfTk9fQkVFUCk7CisKKwkJLyogaWYgaW50ZXJydXB0ZWQgd2hpbGUgY29tcGxldGluZywgYmVoYXZlIGxpa2UgaXQgZmFpbGVkICovCisJCWlmIChnb3RfaW50KQorCQl7CisJCSAgICAodm9pZCl2cGVla2MoKTsJLyogcmVtb3ZlIDxDLUM+IGZyb20gaW5wdXQgc3RyZWFtICovCisJCSAgICBnb3RfaW50ID0gRkFMU0U7CS8qIGRvbid0IGFiYW5kb24gdGhlIGNvbW1hbmQgbGluZSAqLworCQkgICAgKHZvaWQpRXhwYW5kT25lKCZ4cGMsIE5VTEwsIE5VTEwsIDAsIFdJTERfRlJFRSk7CisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQkgICAgeHBjLnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKyNlbmRpZgorCQkgICAgZ290byBjbWRsaW5lX2NoYW5nZWQ7CisJCX0KKworCQkvKiB3aGVuIG1vcmUgdGhhbiBvbmUgbWF0Y2gsIGFuZCAnd2lsZG1vZGUnIGZpcnN0IGNvbnRhaW5zCisJCSAqICJsaXN0Iiwgb3Igbm8gY2hhbmdlIGFuZCAnd2lsZG1vZGUnIGNvbnRhaW5zICJsb25nZXN0LGxpc3QiLAorCQkgKiBsaXN0IGFsbCBtYXRjaGVzICovCisJCWlmIChyZXMgPT0gT0sgJiYgeHBjLnhwX251bWZpbGVzID4gMSkKKwkJeworCQkgICAgLyogYSAibG9uZ2VzdCIgdGhhdCBkaWRuJ3QgZG8gYW55dGhpbmcgaXMgc2tpcHBlZCAoYnV0IG5vdAorCQkgICAgICogImxpc3Q6bG9uZ2VzdCIpICovCisJCSAgICBpZiAod2ltX2ZsYWdzWzBdID09IFdJTV9MT05HRVNUICYmIGNjbGluZS5jbWRwb3MgPT0gaikKKwkJCXdpbV9pbmRleCA9IDE7CisJCSAgICBpZiAoKHdpbV9mbGFnc1t3aW1faW5kZXhdICYgV0lNX0xJU1QpCisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQkJICAgIHx8IChwX3dtbnUgJiYgKHdpbV9mbGFnc1t3aW1faW5kZXhdICYgV0lNX0ZVTEwpICE9IDApCisjZW5kaWYKKwkJCSAgICApCisJCSAgICB7CisJCQlpZiAoISh3aW1fZmxhZ3NbMF0gJiBXSU1fTE9OR0VTVCkpCisJCQl7CisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQkJICAgIGludCBwX3dtbnVfc2F2ZSA9IHBfd21udTsKKwkJCSAgICBwX3dtbnUgPSAwOworI2VuZGlmCisJCQkgICAgbmV4dHdpbGQoJnhwYywgV0lMRF9QUkVWLCAwKTsgLyogcmVtb3ZlIG1hdGNoICovCisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQkJICAgIHBfd21udSA9IHBfd21udV9zYXZlOworI2VuZGlmCisJCQl9CisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQkJKHZvaWQpc2hvd21hdGNoZXMoJnhwYywgcF93bW51CisJCQkJJiYgKCh3aW1fZmxhZ3Nbd2ltX2luZGV4XSAmIFdJTV9MSVNUKSA9PSAwKSk7CisjZWxzZQorCQkJKHZvaWQpc2hvd21hdGNoZXMoJnhwYywgRkFMU0UpOworI2VuZGlmCisJCQlyZWRyYXdjbWQoKTsKKwkJCWRpZF93aWxkX2xpc3QgPSBUUlVFOworCQkJaWYgKHdpbV9mbGFnc1t3aW1faW5kZXhdICYgV0lNX0xPTkdFU1QpCisJCQkgICAgbmV4dHdpbGQoJnhwYywgV0lMRF9MT05HRVNULCBXSUxEX05PX0JFRVApOworCQkJZWxzZSBpZiAod2ltX2ZsYWdzW3dpbV9pbmRleF0gJiBXSU1fRlVMTCkKKwkJCSAgICBuZXh0d2lsZCgmeHBjLCBXSUxEX05FWFQsIFdJTERfTk9fQkVFUCk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQl2aW1fYmVlcCgpOworCQl9CisjaWZkZWYgRkVBVF9XSUxETUVOVQorCQllbHNlIGlmICh4cGMueHBfbnVtZmlsZXMgPT0gLTEpCisJCSAgICB4cGMueHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworI2VuZGlmCisJICAgIH0KKwkgICAgaWYgKHdpbV9pbmRleCA8IDMpCisJCSsrd2ltX2luZGV4OworCSAgICBpZiAoYyA9PSBFU0MpCisJCWdvdGVzYyA9IFRSVUU7CisJICAgIGlmIChyZXMgPT0gT0spCisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCX0KKworCWdvdGVzYyA9IEZBTFNFOworCisJLyogPFMtVGFiPiBnb2VzIHRvIGxhc3QgbWF0Y2gsIGluIGEgY2x1bXN5IHdheSAqLworCWlmIChjID09IEtfU19UQUIgJiYgS2V5VHlwZWQpCisJeworCSAgICBpZiAobmV4dHdpbGQoJnhwYywgV0lMRF9FWFBBTkRfS0VFUCwgMCkgPT0gT0sKKwkJICAgICYmIG5leHR3aWxkKCZ4cGMsIFdJTERfUFJFViwgMCkgPT0gT0sKKwkJICAgICYmIG5leHR3aWxkKCZ4cGMsIFdJTERfUFJFViwgMCkgPT0gT0spCisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCX0KKworCWlmIChjID09IE5VTCB8fCBjID09IEtfWkVSTykJICAgIC8qIE5VTCBpcyBzdG9yZWQgYXMgTkwgKi8KKwkgICAgYyA9IE5MOworCisJZG9fYWJiciA9IFRSVUU7CQkvKiBkZWZhdWx0OiBjaGVjayBmb3IgYWJicmV2aWF0aW9uICovCisKKwkvKgorCSAqIEJpZyBzd2l0Y2ggZm9yIGEgdHlwZWQgY29tbWFuZCBsaW5lIGNoYXJhY3Rlci4KKwkgKi8KKwlzd2l0Y2ggKGMpCisJeworCWNhc2UgS19CUzoKKwljYXNlIEN0cmxfSDoKKwljYXNlIEtfREVMOgorCWNhc2UgS19LREVMOgorCWNhc2UgQ3RybF9XOgorI2lmZGVmIEZFQVRfRktNQVAKKwkJaWYgKGNtZF9ma21hcCAmJiBjID09IEtfQlMpCisJCSAgICBjID0gS19ERUw7CisjZW5kaWYKKwkJaWYgKGMgPT0gS19LREVMKQorCQkgICAgYyA9IEtfREVMOworCisJCS8qCisJCSAqIGRlbGV0ZSBjdXJyZW50IGNoYXJhY3RlciBpcyB0aGUgc2FtZSBhcyBiYWNrc3BhY2Ugb24gbmV4dAorCQkgKiBjaGFyYWN0ZXIsIGV4Y2VwdCBhdCBlbmQgb2YgbGluZQorCQkgKi8KKwkJaWYgKGMgPT0gS19ERUwgJiYgY2NsaW5lLmNtZHBvcyAhPSBjY2xpbmUuY21kbGVuKQorCQkgICAgKytjY2xpbmUuY21kcG9zOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSAmJiBjID09IEtfREVMKQorCQkgICAgY2NsaW5lLmNtZHBvcyArPSBtYl9vZmZfbmV4dChjY2xpbmUuY21kYnVmZiwKKwkJCQkJICAgICAgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKKyNlbmRpZgorCQlpZiAoY2NsaW5lLmNtZHBvcyA+IDApCisJCXsKKwkJICAgIGNoYXJfdSAqcDsKKworCQkgICAgaiA9IGNjbGluZS5jbWRwb3M7CisJCSAgICBwID0gY2NsaW5lLmNtZGJ1ZmYgKyBqOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCSAgICB7CisJCQlwID0gbWJfcHJldnB0cihjY2xpbmUuY21kYnVmZiwgcCk7CisJCQlpZiAoYyA9PSBDdHJsX1cpCisJCQl7CisJCQkgICAgd2hpbGUgKHAgPiBjY2xpbmUuY21kYnVmZiAmJiB2aW1faXNzcGFjZSgqcCkpCisJCQkJcCA9IG1iX3ByZXZwdHIoY2NsaW5lLmNtZGJ1ZmYsIHApOworCQkJICAgIGkgPSBtYl9nZXRfY2xhc3MocCk7CisJCQkgICAgd2hpbGUgKHAgPiBjY2xpbmUuY21kYnVmZiAmJiBtYl9nZXRfY2xhc3MocCkgPT0gaSkKKwkJCQlwID0gbWJfcHJldnB0cihjY2xpbmUuY21kYnVmZiwgcCk7CisJCQkgICAgaWYgKG1iX2dldF9jbGFzcyhwKSAhPSBpKQorCQkJCXAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJaWYgKGMgPT0gQ3RybF9XKQorCQkgICAgeworCQkJd2hpbGUgKHAgPiBjY2xpbmUuY21kYnVmZiAmJiB2aW1faXNzcGFjZShwWy0xXSkpCisJCQkgICAgLS1wOworCQkJaSA9IHZpbV9pc3dvcmRjKHBbLTFdKTsKKwkJCXdoaWxlIChwID4gY2NsaW5lLmNtZGJ1ZmYgJiYgIXZpbV9pc3NwYWNlKHBbLTFdKQorCQkJCSYmIHZpbV9pc3dvcmRjKHBbLTFdKSA9PSBpKQorCQkJICAgIC0tcDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCS0tcDsKKwkJICAgIGNjbGluZS5jbWRwb3MgPSAoaW50KShwIC0gY2NsaW5lLmNtZGJ1ZmYpOworCQkgICAgY2NsaW5lLmNtZGxlbiAtPSBqIC0gY2NsaW5lLmNtZHBvczsKKwkJICAgIGkgPSBjY2xpbmUuY21kcG9zOworCQkgICAgd2hpbGUgKGkgPCBjY2xpbmUuY21kbGVuKQorCQkJY2NsaW5lLmNtZGJ1ZmZbaSsrXSA9IGNjbGluZS5jbWRidWZmW2orK107CisKKwkJICAgIC8qIFRydW5jYXRlIGF0IHRoZSBlbmQsIHJlcXVpcmVkIGZvciBtdWx0aS1ieXRlIGNoYXJzLiAqLworCQkgICAgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl0gPSBOVUw7CisJCSAgICByZWRyYXdjbWQoKTsKKwkJfQorCQllbHNlIGlmIChjY2xpbmUuY21kbGVuID09IDAgJiYgYyAhPSBDdHJsX1cKKwkJCQkgICAmJiBjY2xpbmUuY21kcHJvbXB0ID09IE5VTEwgJiYgaW5kZW50ID09IDApCisJCXsKKwkJICAgIC8qIEluIGV4IGFuZCBkZWJ1ZyBtb2RlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXR1cm4uICovCisJCSAgICBpZiAoZXhtb2RlX2FjdGl2ZQorI2lmZGVmIEZFQVRfRVZBTAorCQkJICAgIHx8IGNjbGluZS5jbWRmaXJzdGMgPT0gJz4nCisjZW5kaWYKKwkJCSAgICApCisJCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwkJICAgIHZpbV9mcmVlKGNjbGluZS5jbWRidWZmKTsJLyogbm8gY29tbWFuZGxpbmUgdG8gcmV0dXJuICovCisJCSAgICBjY2xpbmUuY21kYnVmZiA9IE5VTEw7CisJCSAgICBpZiAoIWNtZF9zaWxlbnQpCisJCSAgICB7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJCWlmIChjbWRtc2dfcmwpCisJCQkgICAgbXNnX2NvbCA9IENvbHVtbnM7CisJCQllbHNlCisjZW5kaWYKKwkJCSAgICBtc2dfY29sID0gMDsKKwkJCW1zZ19wdXRjaGFyKCcgJyk7CQkvKiBkZWxldGUgJzonICovCisJCSAgICB9CisJCSAgICByZWRyYXdfY21kbGluZSA9IFRSVUU7CisJCSAgICBnb3RvIHJldHVybmNtZDsJCS8qIGJhY2sgdG8gY21kIG1vZGUgKi8KKwkJfQorCQlnb3RvIGNtZGxpbmVfY2hhbmdlZDsKKworCWNhc2UgS19JTlM6CisJY2FzZSBLX0tJTlM6CisjaWZkZWYgRkVBVF9GS01BUAorCQkvKiBpZiBGYXJzaSBtb2RlIHNldCwgd2UgYXJlIGluIHJldmVyc2UgaW5zZXJ0IG1vZGUgLQorCQkgICBEbyBub3QgY2hhbmdlIHRoZSBtb2RlICovCisJCWlmIChjbWRfZmttYXApCisJCSAgICBiZWVwX2ZsdXNoKCk7CisJCWVsc2UKKyNlbmRpZgorCQljY2xpbmUub3ZlcnN0cmlrZSA9ICFjY2xpbmUub3ZlcnN0cmlrZTsKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKwkJdWlfY3Vyc29yX3NoYXBlKCk7CS8qIG1heSBzaG93IGRpZmZlcmVudCBjdXJzb3Igc2hhcGUgKi8KKyNlbmRpZgorCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwljYXNlIEN0cmxfSEFUOgorCQlpZiAobWFwX3RvX2V4aXN0c19tb2RlKChjaGFyX3UgKikiIiwgTEFOR01BUCkpCisJCXsKKwkJICAgIC8qICI6bG1hcCIgbWFwcGluZ3MgZXhpc3RzLCB0b2dnbGUgdXNlIG9mIG1hcHBpbmdzLiAqLworCQkgICAgU3RhdGUgXj0gTEFOR01BUDsKKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorCQkgICAgaW1fc2V0X2FjdGl2ZShGQUxTRSk7CS8qIERpc2FibGUgaW5wdXQgbWV0aG9kICovCisjZW5kaWYKKwkJICAgIGlmIChiX2ltX3B0ciAhPSBOVUxMKQorCQkgICAgeworCQkJaWYgKFN0YXRlICYgTEFOR01BUCkKKwkJCSAgICAqYl9pbV9wdHIgPSBCX0lNT0RFX0xNQVA7CisJCQllbHNlCisJCQkgICAgKmJfaW1fcHRyID0gQl9JTU9ERV9OT05FOworCQkgICAgfQorCQl9CisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKwkJZWxzZQorCQl7CisJCSAgICAvKiBUaGVyZSBhcmUgbm8gIjpsbWFwIiBtYXBwaW5ncywgdG9nZ2xlIElNLiAgV2hlbgorCQkgICAgICogJ2ltZGlzYWJsZScgaXMgc2V0IGRvbid0IHRyeSBnZXR0aW5nIHRoZSBzdGF0dXMsIGl0J3MKKwkJICAgICAqIGFsd2F5cyBvZmYuICovCisJCSAgICBpZiAoKHBfaW1kaXNhYmxlICYmIGJfaW1fcHRyICE9IE5VTEwpCisJCQkgICAgPyAqYl9pbV9wdHIgPT0gQl9JTU9ERV9JTSA6IGltX2dldF9zdGF0dXMoKSkKKwkJICAgIHsKKwkJCWltX3NldF9hY3RpdmUoRkFMU0UpOwkvKiBEaXNhYmxlIGlucHV0IG1ldGhvZCAqLworCQkJaWYgKGJfaW1fcHRyICE9IE5VTEwpCisJCQkgICAgKmJfaW1fcHRyID0gQl9JTU9ERV9OT05FOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJaW1fc2V0X2FjdGl2ZShUUlVFKTsJLyogRW5hYmxlIGlucHV0IG1ldGhvZCAqLworCQkJaWYgKGJfaW1fcHRyICE9IE5VTEwpCisJCQkgICAgKmJfaW1fcHRyID0gQl9JTU9ERV9JTTsKKwkJICAgIH0KKwkJfQorI2VuZGlmCisJCWlmIChiX2ltX3B0ciAhPSBOVUxMKQorCQl7CisJCSAgICBpZiAoYl9pbV9wdHIgPT0gJmN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0KQorCQkJc2V0X2ltaW5zZXJ0X2dsb2JhbCgpOworCQkgICAgZWxzZQorCQkJc2V0X2ltc2VhcmNoX2dsb2JhbCgpOworCQl9CisjaWZkZWYgQ1VSU09SX1NIQVBFCisJCXVpX2N1cnNvcl9zaGFwZSgpOwkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX0tFWU1BUCkKKwkJLyogU2hvdy91bnNob3cgdmFsdWUgb2YgJ2tleW1hcCcgaW4gc3RhdHVzIGxpbmVzIGxhdGVyLiAqLworCQlzdGF0dXNfcmVkcmF3X2N1cmJ1ZigpOworI2VuZGlmCisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKworLyoJY2FzZSAnQCc6ICAgb25seSBpbiB2ZXJ5IG9sZCB2aSAqLworCWNhc2UgQ3RybF9VOgorCQkvKiBkZWxldGUgYWxsIGNoYXJhY3RlcnMgbGVmdCBvZiB0aGUgY3Vyc29yICovCisJCWogPSBjY2xpbmUuY21kcG9zOworCQljY2xpbmUuY21kbGVuIC09IGo7CisJCWkgPSBjY2xpbmUuY21kcG9zID0gMDsKKwkJd2hpbGUgKGkgPCBjY2xpbmUuY21kbGVuKQorCQkgICAgY2NsaW5lLmNtZGJ1ZmZbaSsrXSA9IGNjbGluZS5jbWRidWZmW2orK107CisJCS8qIFRydW5jYXRlIGF0IHRoZSBlbmQsIHJlcXVpcmVkIGZvciBtdWx0aS1ieXRlIGNoYXJzLiAqLworCQljY2xpbmUuY21kYnVmZltjY2xpbmUuY21kbGVuXSA9IE5VTDsKKwkJcmVkcmF3Y21kKCk7CisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwljYXNlIEN0cmxfWToKKwkJLyogQ29weSB0aGUgbW9kZWxlc3Mgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICovCisJCWlmIChjbGlwX3N0YXIuc3RhdGUgIT0gU0VMRUNUX0NMRUFSRUQpCisJCXsKKwkJICAgIGlmIChjbGlwX3N0YXIuc3RhdGUgPT0gU0VMRUNUX0RPTkUpCisJCQljbGlwX2NvcHlfbW9kZWxlc3Nfc2VsZWN0aW9uKFRSVUUpOworCQkgICAgZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIEVTQzoJLyogZ2V0IGhlcmUgaWYgcF93YyAhPSBFU0Mgb3Igd2hlbiBFU0MgdHlwZWQgdHdpY2UgKi8KKwljYXNlIEN0cmxfQzoKKwkJLyogSW4gZXhtb2RlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXR1cm4uICovCisJCWlmIChleG1vZGVfYWN0aXZlKQorCQkgICAgZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCisJCWdvdGVzYyA9IFRSVUU7CQkvKiB3aWxsIGZyZWUgY2NsaW5lLmNtZGJ1ZmYgYWZ0ZXIKKwkJCQkJICAgcHV0dGluZyBpdCBpbiBoaXN0b3J5ICovCisJCWdvdG8gcmV0dXJuY21kOwkJLyogYmFjayB0byBjbWQgbW9kZSAqLworCisJY2FzZSBDdHJsX1I6CQkJLyogaW5zZXJ0IHJlZ2lzdGVyICovCisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKwkJZG9udF9zY3JvbGwgPSBUUlVFOwkvKiBkaXNhbGxvdyBzY3JvbGxpbmcgaGVyZSAqLworI2VuZGlmCisJCXB1dGNtZGxpbmUoJyInLCBUUlVFKTsKKwkJKytub19tYXBwaW5nOworCQlpID0gYyA9IHNhZmVfdmdldGMoKTsJLyogQ1RSTC1SIDxjaGFyPiAqLworCQlpZiAoaSA9PSBDdHJsX08pCisJCSAgICBpID0gQ3RybF9SOwkJLyogQ1RSTC1SIENUUkwtTyA9PSBDVFJMLVIgQ1RSTC1SICovCisJCWlmIChpID09IEN0cmxfUikKKwkJICAgIGMgPSBzYWZlX3ZnZXRjKCk7CS8qIENUUkwtUiBDVFJMLVIgPGNoYXI+ICovCisJCS0tbm9fbWFwcGluZzsKKyNpZmRlZiBGRUFUX0VWQUwKKwkJLyoKKwkJICogSW5zZXJ0IHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbi4KKwkJICogTmVlZCB0byBzYXZlIHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZSwgdG8gYmUgYWJsZSB0byBlbnRlcgorCQkgKiBhIG5ldyBvbmUuLi4KKwkJICovCisJCW5ld19jbWRwb3MgPSAtMTsKKwkJaWYgKGMgPT0gJz0nKQorCQl7CisJCSAgICBzdHJ1Y3QgY21kbGluZV9pbmZvCSAgICBzYXZlX2NjbGluZTsKKworCQkgICAgaWYgKGNjbGluZS5jbWRmaXJzdGMgPT0gJz0nKS8qIGNhbid0IGRvIHRoaXMgcmVjdXJzaXZlbHkgKi8KKwkJICAgIHsKKwkJCWJlZXBfZmx1c2goKTsKKwkJCWMgPSBFU0M7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlzYXZlX2NjbGluZSA9IGNjbGluZTsKKwkJCWNjbGluZS5jbWRidWZmID0gTlVMTDsKKwkJCWNjbGluZS5jbWRwcm9tcHQgPSBOVUxMOworCQkJYyA9IGdldF9leHByX3JlZ2lzdGVyKCk7CisJCQljY2xpbmUgPSBzYXZlX2NjbGluZTsKKwkJICAgIH0KKwkJfQorI2VuZGlmCisJCWlmIChjICE9IEVTQykJICAgIC8qIHVzZSBFU0MgdG8gY2FuY2VsIGluc2VydGluZyByZWdpc3RlciAqLworCQl7CisJCSAgICBjbWRsaW5lX3Bhc3RlKGMsIGkgPT0gQ3RybF9SKTsKKwkJICAgIEtleVR5cGVkID0gRkFMU0U7CS8qIERvbid0IGRvIHBfd2MgY29tcGxldGlvbi4gKi8KKyNpZmRlZiBGRUFUX0VWQUwKKwkJICAgIGlmIChuZXdfY21kcG9zID49IDApCisJCSAgICB7CisJCQkvKiBzZXRfY21kbGluZV9wb3MoKSB3YXMgdXNlZCAqLworCQkJaWYgKG5ld19jbWRwb3MgPiBjY2xpbmUuY21kbGVuKQorCQkJICAgIGNjbGluZS5jbWRwb3MgPSBjY2xpbmUuY21kbGVuOworCQkJZWxzZQorCQkJICAgIGNjbGluZS5jbWRwb3MgPSBuZXdfY21kcG9zOworCQkgICAgfQorI2VuZGlmCisJCX0KKwkJcmVkcmF3Y21kKCk7CisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCisJY2FzZSBDdHJsX0Q6CisJCWlmIChzaG93bWF0Y2hlcygmeHBjLCBGQUxTRSkgPT0gRVhQQU5EX05PVEhJTkcpCisJCSAgICBicmVhazsJLyogVXNlIF5EIGFzIG5vcm1hbCBjaGFyIGluc3RlYWQgKi8KKworCQlyZWRyYXdjbWQoKTsKKwkJY29udGludWU7CS8qIGRvbid0IGRvIGluY3JlbWVudGFsIHNlYXJjaCBub3cgKi8KKworCWNhc2UgS19SSUdIVDoKKwljYXNlIEtfU19SSUdIVDoKKwljYXNlIEtfQ19SSUdIVDoKKwkJZG8KKwkJeworCQkgICAgaWYgKGNjbGluZS5jbWRwb3MgPj0gY2NsaW5lLmNtZGxlbikKKwkJCWJyZWFrOworCQkgICAgaSA9IGNtZGxpbmVfY2hhcnNpemUoY2NsaW5lLmNtZHBvcyk7CisJCSAgICBpZiAoS2V5VHlwZWQgJiYgY2NsaW5lLmNtZHNwb3MgKyBpID49IENvbHVtbnMgKiBSb3dzKQorCQkJYnJlYWs7CisJCSAgICBjY2xpbmUuY21kc3BvcyArPSBpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQljY2xpbmUuY21kcG9zICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYKKwkJCQkJCQkgICAgICsgY2NsaW5lLmNtZHBvcyk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSsrY2NsaW5lLmNtZHBvczsKKwkJfQorCQl3aGlsZSAoKGMgPT0gS19TX1JJR0hUIHx8IGMgPT0gS19DX1JJR0hUKQorCQkJJiYgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvc10gIT0gJyAnKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChoYXNfbWJ5dGUpCisJCSAgICBzZXRfY21kc3Bvc19jdXJzb3IoKTsKKyNlbmRpZgorCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwljYXNlIEtfTEVGVDoKKwljYXNlIEtfU19MRUZUOgorCWNhc2UgS19DX0xFRlQ6CisJCWRvCisJCXsKKwkJICAgIGlmIChjY2xpbmUuY21kcG9zID09IDApCisJCQlicmVhazsKKwkJICAgIC0tY2NsaW5lLmNtZHBvczsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQkvKiBtb3ZlIHRvIGZpcnN0IGJ5dGUgb2YgY2hhciAqLworCQkJY2NsaW5lLmNtZHBvcyAtPSAoKm1iX2hlYWRfb2ZmKShjY2xpbmUuY21kYnVmZiwKKwkJCQkJICAgICAgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKKyNlbmRpZgorCQkgICAgY2NsaW5lLmNtZHNwb3MgLT0gY21kbGluZV9jaGFyc2l6ZShjY2xpbmUuY21kcG9zKTsKKwkJfQorCQl3aGlsZSAoKGMgPT0gS19TX0xFRlQgfHwgYyA9PSBLX0NfTEVGVCkKKwkJCSYmIGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgLSAxXSAhPSAnICcpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJICAgIHNldF9jbWRzcG9zX2N1cnNvcigpOworI2VuZGlmCisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKworCWNhc2UgS19JR05PUkU6CisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsJLyogSWdub3JlIG1vdXNlICovCisKKyNpZmRlZiBGRUFUX01PVVNFCisJY2FzZSBLX01JRERMRURSQUc6CisJY2FzZSBLX01JRERMRVJFTEVBU0U6CisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsJLyogSWdub3JlIG1vdXNlICovCisKKwljYXNlIEtfTUlERExFTU9VU0U6CisjIGlmZGVmIEZFQVRfR1VJCisJCS8qIFdoZW4gR1VJIGlzIGFjdGl2ZSwgYWxzbyBwYXN0ZSB3aGVuICdtb3VzZScgaXMgZW1wdHkgKi8KKwkJaWYgKCFndWkuaW5fdXNlKQorIyBlbmRpZgorCQkgICAgaWYgKCFtb3VzZV9oYXMoTU9VU0VfQ09NTUFORCkpCisJCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7ICAgLyogSWdub3JlIG1vdXNlICovCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkJaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUpCisJCSAgICBjbWRsaW5lX3Bhc3RlKCcqJywgVFJVRSk7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgY21kbGluZV9wYXN0ZSgwLCBUUlVFKTsKKwkJcmVkcmF3Y21kKCk7CisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCisjaWZkZWYgRkVBVF9ETkQKKwljYXNlIEtfRFJPUDoKKwkJY21kbGluZV9wYXN0ZSgnficsIFRSVUUpOworCQlyZWRyYXdjbWQoKTsKKwkJZ290byBjbWRsaW5lX2NoYW5nZWQ7CisjZW5kaWYKKworCWNhc2UgS19MRUZURFJBRzoKKwljYXNlIEtfTEVGVFJFTEVBU0U6CisJY2FzZSBLX1JJR0hURFJBRzoKKwljYXNlIEtfUklHSFRSRUxFQVNFOgorCQkvKiBJZ25vcmUgZHJhZyBhbmQgcmVsZWFzZSBldmVudHMgd2hlbiB0aGUgYnV0dG9uLWRvd24gd2Fzbid0CisJCSAqIHNlZW4gYmVmb3JlLiAqLworCQlpZiAoaWdub3JlX2RyYWdfcmVsZWFzZSkKKwkJICAgIGdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEtfTEVGVE1PVVNFOgorCWNhc2UgS19SSUdIVE1PVVNFOgorCQlpZiAoYyA9PSBLX0xFRlRSRUxFQVNFIHx8IGMgPT0gS19SSUdIVFJFTEVBU0UpCisJCSAgICBpZ25vcmVfZHJhZ19yZWxlYXNlID0gVFJVRTsKKwkJZWxzZQorCQkgICAgaWdub3JlX2RyYWdfcmVsZWFzZSA9IEZBTFNFOworIyBpZmRlZiBGRUFUX0dVSQorCQkvKiBXaGVuIEdVSSBpcyBhY3RpdmUsIGFsc28gbW92ZSB3aGVuICdtb3VzZScgaXMgZW1wdHkgKi8KKwkJaWYgKCFndWkuaW5fdXNlKQorIyBlbmRpZgorCQkgICAgaWYgKCFtb3VzZV9oYXMoTU9VU0VfQ09NTUFORCkpCisJCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7ICAgLyogSWdub3JlIG1vdXNlICovCisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisJCWlmIChtb3VzZV9yb3cgPCBjbWRsaW5lX3JvdyAmJiBjbGlwX3N0YXIuYXZhaWxhYmxlKQorCQl7CisJCSAgICBpbnQJICAgIGJ1dHRvbiwgaXNfY2xpY2ssIGlzX2RyYWc7CisKKwkJICAgIC8qCisJCSAgICAgKiBIYW5kbGUgbW9kZWxlc3Mgc2VsZWN0aW9uLgorCQkgICAgICovCisJCSAgICBidXR0b24gPSBnZXRfbW91c2VfYnV0dG9uKEtFWTJURVJNQ0FQMShjKSwKKwkJCQkJCQkgJmlzX2NsaWNrLCAmaXNfZHJhZyk7CisJCSAgICBpZiAobW91c2VfbW9kZWxfcG9wdXAoKSAmJiBidXR0b24gPT0gTU9VU0VfTEVGVAorCQkJCQkgICAgICAgJiYgKG1vZF9tYXNrICYgTU9EX01BU0tfU0hJRlQpKQorCQkgICAgeworCQkJLyogVHJhbnNsYXRlIHNoaWZ0LWxlZnQgdG8gcmlnaHQgYnV0dG9uLiAqLworCQkJYnV0dG9uID0gTU9VU0VfUklHSFQ7CisJCQltb2RfbWFzayAmPSB+TU9EX01BU0tfU0hJRlQ7CisJCSAgICB9CisJCSAgICBjbGlwX21vZGVsZXNzKGJ1dHRvbiwgaXNfY2xpY2ssIGlzX2RyYWcpOworCQkgICAgZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCQl9CisjIGVuZGlmCisKKwkJc2V0X2NtZHNwb3MoKTsKKwkJZm9yIChjY2xpbmUuY21kcG9zID0gMDsgY2NsaW5lLmNtZHBvcyA8IGNjbGluZS5jbWRsZW47CisJCQkJCQkJICAgICAgKytjY2xpbmUuY21kcG9zKQorCQl7CisJCSAgICBpID0gY21kbGluZV9jaGFyc2l6ZShjY2xpbmUuY21kcG9zKTsKKwkJICAgIGlmIChtb3VzZV9yb3cgPD0gY21kbGluZV9yb3cgKyBjY2xpbmUuY21kc3BvcyAvIENvbHVtbnMKKwkJCQkgICYmIG1vdXNlX2NvbCA8IGNjbGluZS5jbWRzcG9zICUgQ29sdW1ucyArIGkpCisJCQlicmVhazsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkgICAgeworCQkJLyogQ291bnQgIj4iIGZvciBkb3VibGUtd2lkZSBjaGFyIHRoYXQgZG9lc24ndCBmaXQuICovCisJCQljb3JyZWN0X2NtZHNwb3MoY2NsaW5lLmNtZHBvcywgaSk7CisJCQljY2xpbmUuY21kcG9zICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYKKwkJCQkJCQkgKyBjY2xpbmUuY21kcG9zKSAtIDE7CisJCSAgICB9CisjZW5kaWYKKwkJICAgIGNjbGluZS5jbWRzcG9zICs9IGk7CisJCX0KKwkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCisJLyogTW91c2Ugc2Nyb2xsIHdoZWVsOiBpZ25vcmVkIGhlcmUgKi8KKwljYXNlIEtfTU9VU0VET1dOOgorCWNhc2UgS19NT1VTRVVQOgorCS8qIEFsdGVybmF0ZSBidXR0b25zIGlnbm9yZWQgaGVyZSAqLworCWNhc2UgS19YMU1PVVNFOgorCWNhc2UgS19YMURSQUc6CisJY2FzZSBLX1gxUkVMRUFTRToKKwljYXNlIEtfWDJNT1VTRToKKwljYXNlIEtfWDJEUkFHOgorCWNhc2UgS19YMlJFTEVBU0U6CisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKworI2VuZGlmCS8qIEZFQVRfTU9VU0UgKi8KKworI2lmZGVmIEZFQVRfR1VJCisJY2FzZSBLX0xFRlRNT1VTRV9OTToJLyogbW91c2Vmb2N1cyBjbGljaywgaWdub3JlZCAqLworCWNhc2UgS19MRUZUUkVMRUFTRV9OTToKKwkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCisJY2FzZSBLX1ZFUl9TQ1JPTExCQVI6CisJCWlmICghbXNnX3Njcm9sbGVkKQorCQl7CisJCSAgICBndWlfZG9fc2Nyb2xsKCk7CisJCSAgICByZWRyYXdjbWQoKTsKKwkJfQorCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwljYXNlIEtfSE9SX1NDUk9MTEJBUjoKKwkJaWYgKCFtc2dfc2Nyb2xsZWQpCisJCXsKKwkJICAgIGd1aV9kb19ob3Jpel9zY3JvbGwoKTsKKwkJICAgIHJlZHJhd2NtZCgpOworCQl9CisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKyNlbmRpZgorCWNhc2UgS19TRUxFQ1Q6CSAgICAvKiBlbmQgb2YgU2VsZWN0IG1vZGUgbWFwcGluZyAtIGlnbm9yZSAqLworCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwljYXNlIEN0cmxfQjoJICAgIC8qIGJlZ2luIG9mIGNvbW1hbmQgbGluZSAqLworCWNhc2UgS19IT01FOgorCWNhc2UgS19LSE9NRToKKwljYXNlIEtfWEhPTUU6CisJY2FzZSBLX1NfSE9NRToKKwljYXNlIEtfQ19IT01FOgorCQljY2xpbmUuY21kcG9zID0gMDsKKwkJc2V0X2NtZHNwb3MoKTsKKwkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCisJY2FzZSBDdHJsX0U6CSAgICAvKiBlbmQgb2YgY29tbWFuZCBsaW5lICovCisJY2FzZSBLX0VORDoKKwljYXNlIEtfS0VORDoKKwljYXNlIEtfWEVORDoKKwljYXNlIEtfU19FTkQ6CisJY2FzZSBLX0NfRU5EOgorCQljY2xpbmUuY21kcG9zID0gY2NsaW5lLmNtZGxlbjsKKwkJc2V0X2NtZHNwb3NfY3Vyc29yKCk7CisJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKworCWNhc2UgQ3RybF9BOgkgICAgLyogYWxsIG1hdGNoZXMgKi8KKwkJaWYgKG5leHR3aWxkKCZ4cGMsIFdJTERfQUxMLCAwKSA9PSBGQUlMKQorCQkgICAgYnJlYWs7CisJCWdvdG8gY21kbGluZV9jaGFuZ2VkOworCisJY2FzZSBDdHJsX0w6CSAgICAvKiBsb25nZXN0IGNvbW1vbiBwYXJ0ICovCisJCWlmIChuZXh0d2lsZCgmeHBjLCBXSUxEX0xPTkdFU1QsIDApID09IEZBSUwpCisJCSAgICBicmVhazsKKwkJZ290byBjbWRsaW5lX2NoYW5nZWQ7CisKKwljYXNlIEN0cmxfTjoJICAgIC8qIG5leHQgbWF0Y2ggKi8KKwljYXNlIEN0cmxfUDoJICAgIC8qIHByZXZpb3VzIG1hdGNoICovCisJCWlmICh4cGMueHBfbnVtZmlsZXMgPiAwKQorCQl7CisJCSAgICBpZiAobmV4dHdpbGQoJnhwYywgKGMgPT0gQ3RybF9QKSA/IFdJTERfUFJFViA6IFdJTERfTkVYVCwgMCkKKwkJCQkJCQkJICAgICAgPT0gRkFJTCkKKwkJCWJyZWFrOworCQkgICAgZ290byBjbWRsaW5lX2NoYW5nZWQ7CisJCX0KKworI2lmZGVmIEZFQVRfQ01ESElTVAorCWNhc2UgS19VUDoKKwljYXNlIEtfRE9XTjoKKwljYXNlIEtfU19VUDoKKwljYXNlIEtfU19ET1dOOgorCWNhc2UgS19QQUdFVVA6CisJY2FzZSBLX0tQQUdFVVA6CisJY2FzZSBLX1BBR0VET1dOOgorCWNhc2UgS19LUEFHRURPV046CisJCWlmIChoaXNsZW4gPT0gMCB8fCBmaXJzdGMgPT0gTlVMKQkvKiBubyBoaXN0b3J5ICovCisJCSAgICBnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisKKwkJaSA9IGhpc2NudDsKKworCQkvKiBzYXZlIGN1cnJlbnQgY29tbWFuZCBzdHJpbmcgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyICovCisJCWlmIChsb29rZm9yID09IE5VTEwpCisJCXsKKwkJICAgIGlmICgobG9va2ZvciA9IHZpbV9zdHJzYXZlKGNjbGluZS5jbWRidWZmKSkgPT0gTlVMTCkKKwkJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKKwkJICAgIGxvb2tmb3JbY2NsaW5lLmNtZHBvc10gPSBOVUw7CisJCX0KKworCQlqID0gKGludClTVFJMRU4obG9va2Zvcik7CisJCWZvciAoOzspCisJCXsKKwkJICAgIC8qIG9uZSBzdGVwIGJhY2t3YXJkcyAqLworCQkgICAgaWYgKGMgPT0gS19VUCB8fCBjID09IEtfU19VUCB8fCBjID09IEN0cmxfUCB8fAorCQkJICAgIGMgPT0gS19QQUdFVVAgfHwgYyA9PSBLX0tQQUdFVVApCisJCSAgICB7CisJCQlpZiAoaGlzY250ID09IGhpc2xlbikJLyogZmlyc3QgdGltZSAqLworCQkJICAgIGhpc2NudCA9IGhpc2lkeFtoaXN0eXBlXTsKKwkJCWVsc2UgaWYgKGhpc2NudCA9PSAwICYmIGhpc2lkeFtoaXN0eXBlXSAhPSBoaXNsZW4gLSAxKQorCQkJICAgIGhpc2NudCA9IGhpc2xlbiAtIDE7CisJCQllbHNlIGlmIChoaXNjbnQgIT0gaGlzaWR4W2hpc3R5cGVdICsgMSkKKwkJCSAgICAtLWhpc2NudDsKKwkJCWVsc2UJCQkvKiBhdCB0b3Agb2YgbGlzdCAqLworCQkJeworCQkJICAgIGhpc2NudCA9IGk7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlICAgIC8qIG9uZSBzdGVwIGZvcndhcmRzICovCisJCSAgICB7CisJCQkvKiBvbiBsYXN0IGVudHJ5LCBjbGVhciB0aGUgbGluZSAqLworCQkJaWYgKGhpc2NudCA9PSBoaXNpZHhbaGlzdHlwZV0pCisJCQl7CisJCQkgICAgaGlzY250ID0gaGlzbGVuOworCQkJICAgIGJyZWFrOworCQkJfQorCisJCQkvKiBub3Qgb24gYSBoaXN0b3J5IGxpbmUsIG5vdGhpbmcgdG8gZG8gKi8KKwkJCWlmIChoaXNjbnQgPT0gaGlzbGVuKQorCQkJICAgIGJyZWFrOworCQkJaWYgKGhpc2NudCA9PSBoaXNsZW4gLSAxKSAgIC8qIHdyYXAgYXJvdW5kICovCisJCQkgICAgaGlzY250ID0gMDsKKwkJCWVsc2UKKwkJCSAgICArK2hpc2NudDsKKwkJICAgIH0KKwkJICAgIGlmIChoaXNjbnQgPCAwIHx8IGhpc3RvcnlbaGlzdHlwZV1baGlzY250XS5oaXNzdHIgPT0gTlVMTCkKKwkJICAgIHsKKwkJCWhpc2NudCA9IGk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmICgoYyAhPSBLX1VQICYmIGMgIT0gS19ET1dOKSB8fCBoaXNjbnQgPT0gaQorCQkJICAgIHx8IFNUUk5DTVAoaGlzdG9yeVtoaXN0eXBlXVtoaXNjbnRdLmhpc3N0ciwKKwkJCQkJCSAgICBsb29rZm9yLCAoc2l6ZV90KWopID09IDApCisJCQlicmVhazsKKwkJfQorCisJCWlmIChoaXNjbnQgIT0gaSkJLyoganVtcGVkIHRvIG90aGVyIGVudHJ5ICovCisJCXsKKwkJICAgIGNoYXJfdQkqcDsKKwkJICAgIGludAkJbGVuOworCQkgICAgaW50CQlvbGRfZmlyc3RjOworCisJCSAgICB2aW1fZnJlZShjY2xpbmUuY21kYnVmZik7CisJCSAgICBpZiAoaGlzY250ID09IGhpc2xlbikKKwkJCXAgPSBsb29rZm9yOwkvKiBiYWNrIHRvIHRoZSBvbGQgb25lICovCisJCSAgICBlbHNlCisJCQlwID0gaGlzdG9yeVtoaXN0eXBlXVtoaXNjbnRdLmhpc3N0cjsKKworCQkgICAgaWYgKGhpc3R5cGUgPT0gSElTVF9TRUFSQ0gKKwkJCSAgICAmJiBwICE9IGxvb2tmb3IKKwkJCSAgICAmJiAob2xkX2ZpcnN0YyA9IHBbU1RSTEVOKHApICsgMV0pICE9IGZpcnN0YykKKwkJICAgIHsKKwkJCS8qIENvcnJlY3QgZm9yIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHVzZWQgd2hlbgorCQkJICogYWRkaW5nIHRoZSBoaXN0b3J5IGVudHJ5IHZzIHRoZSBvbmUgdXNlZCBub3cuCisJCQkgKiBGaXJzdCBsb29wOiBjb3VudCBsZW5ndGguCisJCQkgKiBTZWNvbmQgbG9vcDogY29weSB0aGUgY2hhcmFjdGVycy4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPD0gMTsgKytpKQorCQkJeworCQkJICAgIGxlbiA9IDA7CisJCQkgICAgZm9yIChqID0gMDsgcFtqXSAhPSBOVUw7ICsraikKKwkJCSAgICB7CisJCQkJLyogUmVwbGFjZSBvbGQgc2VwIHdpdGggbmV3IHNlcCwgdW5sZXNzIGl0IGlzCisJCQkJICogZXNjYXBlZC4gKi8KKwkJCQlpZiAocFtqXSA9PSBvbGRfZmlyc3RjCisJCQkJCSAgICAgICYmIChqID09IDAgfHwgcFtqIC0gMV0gIT0gJ1xcJykpCisJCQkJeworCQkJCSAgICBpZiAoaSA+IDApCisJCQkJCWNjbGluZS5jbWRidWZmW2xlbl0gPSBmaXJzdGM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJICAgIC8qIEVzY2FwZSBuZXcgc2VwLCB1bmxlc3MgaXQgaXMgYWxyZWFkeQorCQkJCSAgICAgKiBlc2NhcGVkLiAqLworCQkJCSAgICBpZiAocFtqXSA9PSBmaXJzdGMKKwkJCQkJICAgICAgJiYgKGogPT0gMCB8fCBwW2ogLSAxXSAhPSAnXFwnKSkKKwkJCQkgICAgeworCQkJCQlpZiAoaSA+IDApCisJCQkJCSAgICBjY2xpbmUuY21kYnVmZltsZW5dID0gJ1xcJzsKKwkJCQkJKytsZW47CisJCQkJICAgIH0KKwkJCQkgICAgaWYgKGkgPiAwKQorCQkJCQljY2xpbmUuY21kYnVmZltsZW5dID0gcFtqXTsKKwkJCQl9CisJCQkJKytsZW47CisJCQkgICAgfQorCQkJICAgIGlmIChpID09IDApCisJCQkgICAgeworCQkJCWFsbG9jX2NtZGJ1ZmYobGVuKTsKKwkJCQlpZiAoY2NsaW5lLmNtZGJ1ZmYgPT0gTlVMTCkKKwkJCQkgICAgZ290byByZXR1cm5jbWQ7CisJCQkgICAgfQorCQkJfQorCQkJY2NsaW5lLmNtZGJ1ZmZbbGVuXSA9IE5VTDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWFsbG9jX2NtZGJ1ZmYoKGludClTVFJMRU4ocCkpOworCQkJaWYgKGNjbGluZS5jbWRidWZmID09IE5VTEwpCisJCQkgICAgZ290byByZXR1cm5jbWQ7CisJCQlTVFJDUFkoY2NsaW5lLmNtZGJ1ZmYsIHApOworCQkgICAgfQorCisJCSAgICBjY2xpbmUuY21kcG9zID0gY2NsaW5lLmNtZGxlbiA9IChpbnQpU1RSTEVOKGNjbGluZS5jbWRidWZmKTsKKwkJICAgIHJlZHJhd2NtZCgpOworCQkgICAgZ290byBjbWRsaW5lX2NoYW5nZWQ7CisJCX0KKwkJYmVlcF9mbHVzaCgpOworCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisjZW5kaWYKKworCWNhc2UgQ3RybF9WOgorCWNhc2UgQ3RybF9ROgorI2lmZGVmIEZFQVRfTU9VU0UKKwkJaWdub3JlX2RyYWdfcmVsZWFzZSA9IFRSVUU7CisjZW5kaWYKKwkJcHV0Y21kbGluZSgnXicsIFRSVUUpOworCQljID0gZ2V0X2xpdGVyYWwoKTsJICAgIC8qIGdldCBuZXh0ICh0d28pIGNoYXJhY3RlcihzKSAqLworCQlkb19hYmJyID0gRkFMU0U7CSAgICAvKiBkb24ndCBkbyBhYmJyZXZpYXRpb24gbm93ICovCisjaWZkZWYgRkVBVF9NQllURQorCQkvKiBtYXkgbmVlZCB0byByZW1vdmUgXiB3aGVuIGNvbXBvc2luZyBjaGFyIHdhcyB0eXBlZCAqLworCQlpZiAoZW5jX3V0ZjggJiYgdXRmX2lzY29tcG9zaW5nKGMpICYmICFjbWRfc2lsZW50KQorCQl7CisJCSAgICBkcmF3X2NtZGxpbmUoY2NsaW5lLmNtZHBvcywgY2NsaW5lLmNtZGxlbiAtIGNjbGluZS5jbWRwb3MpOworCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJICAgIGN1cnNvcmNtZCgpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX0RJR1JBUEhTCisJY2FzZSBDdHJsX0s6CisjaWZkZWYgRkVBVF9NT1VTRQorCQlpZ25vcmVfZHJhZ19yZWxlYXNlID0gVFJVRTsKKyNlbmRpZgorCQlwdXRjbWRsaW5lKCc/JywgVFJVRSk7CisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKwkJZG9udF9zY3JvbGwgPSBUUlVFOwkgICAgLyogZGlzYWxsb3cgc2Nyb2xsaW5nIGhlcmUgKi8KKyNlbmRpZgorCQljID0gZ2V0X2RpZ3JhcGgoVFJVRSk7CisJCWlmIChjICE9IE5VTCkKKwkJICAgIGJyZWFrOworCisJCXJlZHJhd2NtZCgpOworCQlnb3RvIGNtZGxpbmVfbm90X2NoYW5nZWQ7CisjZW5kaWYgLyogRkVBVF9ESUdSQVBIUyAqLworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwljYXNlIEN0cmxfXzoJICAgIC8qIENUUkwtXzogc3dpdGNoIGxhbmd1YWdlIG1vZGUgKi8KKwkJaWYgKCFwX2FyaSkKKwkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfRktNQVAKKwkJaWYgKHBfYWx0a2V5bWFwKQorCQl7CisJCSAgICBjbWRfZmttYXAgPSAhY21kX2ZrbWFwOworCQkgICAgaWYgKGNtZF9ma21hcCkJLyogaW4gRmFyc2kgYWx3YXlzIGluIEluc2VydCBtb2RlICovCisJCQljY2xpbmUub3ZlcnN0cmlrZSA9IEZBTFNFOworCQl9CisJCWVsc2UJCQkgICAgLyogSGVicmV3IGlzIGRlZmF1bHQgKi8KKyNlbmRpZgorCQkgICAgY21kX2hrbWFwID0gIWNtZF9oa21hcDsKKwkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworI2VuZGlmCisKKwlkZWZhdWx0OgorI2lmZGVmIFVOSVgKKwkJaWYgKGMgPT0gaW50cl9jaGFyKQorCQl7CisJCSAgICBnb3Rlc2MgPSBUUlVFOwkvKiB3aWxsIGZyZWUgY2NsaW5lLmNtZGJ1ZmYgYWZ0ZXIKKwkJCQkJICAgcHV0dGluZyBpdCBpbiBoaXN0b3J5ICovCisJCSAgICBnb3RvIHJldHVybmNtZDsJLyogYmFjayB0byBOb3JtYWwgbW9kZSAqLworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogTm9ybWFsIGNoYXJhY3RlciB3aXRoIG5vIHNwZWNpYWwgbWVhbmluZy4gIEp1c3Qgc2V0IG1vZF9tYXNrCisJCSAqIHRvIDB4MCBzbyB0aGF0IHR5cGluZyBTaGlmdC1TcGFjZSBpbiB0aGUgR1VJIGRvZXNuJ3QgZW50ZXIKKwkJICogdGhlIHN0cmluZyA8Uy1TcGFjZT4uICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBhZnRlciBeVi4KKwkJICovCisJCWlmICghSVNfU1BFQ0lBTChjKSkKKwkJICAgIG1vZF9tYXNrID0gMHgwOworCQlicmVhazsKKwl9CisJLyoKKwkgKiBFbmQgb2Ygc3dpdGNoIG9uIGNvbW1hbmQgbGluZSBjaGFyYWN0ZXIuCisJICogV2UgY29tZSBoZXJlIGlmIHdlIGhhdmUgYSBub3JtYWwgY2hhcmFjdGVyLgorCSAqLworCisJaWYgKGRvX2FiYnIgJiYgKElTX1NQRUNJQUwoYykgfHwgIXZpbV9pc3dvcmRjKGMpKSAmJiBjY2hlY2tfYWJicigKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkvKiBBZGQgQUJCUl9PRkYgZm9yIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAsIHRoaXMgaXMKKwkJCSAqIHdoYXQgY2hlY2tfYWJicigpIGV4cGVjdHMuICovCisJCQkoaGFzX21ieXRlICYmIGMgPj0gMHgxMDApID8gKGMgKyBBQkJSX09GRikgOgorI2VuZGlmCisJCQkJCQkJCQljKSkKKwkgICAgZ290byBjbWRsaW5lX2NoYW5nZWQ7CisKKwkvKgorCSAqIHB1dCB0aGUgY2hhcmFjdGVyIGluIHRoZSBjb21tYW5kIGxpbmUKKwkgKi8KKwlpZiAoSVNfU1BFQ0lBTChjKSB8fCBtb2RfbWFzayAhPSAwKQorCSAgICBwdXRfb25fY21kbGluZShnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RfbWFzayksIC0xLCBUUlVFKTsKKwllbHNlCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlqID0gKCptYl9jaGFyMmJ5dGVzKShjLCBJT2J1ZmYpOworCQlJT2J1ZmZbal0gPSBOVUw7CS8qIGV4Y2x1ZGUgY29tcG9zaW5nIGNoYXJzICovCisJCXB1dF9vbl9jbWRsaW5lKElPYnVmZiwgaiwgVFJVRSk7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJSU9idWZmWzBdID0gYzsKKwkJcHV0X29uX2NtZGxpbmUoSU9idWZmLCAxLCBUUlVFKTsKKwkgICAgfQorCX0KKwlnb3RvIGNtZGxpbmVfY2hhbmdlZDsKKworLyoKKyAqIFRoaXMgcGFydCBpbXBsZW1lbnRzIGluY3JlbWVudGFsIHNlYXJjaGVzIGZvciAiLyIgYW5kICI/IgorICogSnVtcCB0byBjbWRsaW5lX25vdF9jaGFuZ2VkIHdoZW4gYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcmVhZCBidXQgdGhlIGNvbW1hbmQKKyAqIGxpbmUgZGlkIG5vdCBjaGFuZ2UuIFRoZW4gd2Ugb25seSBzZWFyY2ggYW5kIHJlZHJhdyBpZiBzb21ldGhpbmcgY2hhbmdlZCBpbgorICogdGhlIHBhc3QuCisgKiBKdW1wIHRvIGNtZGxpbmVfY2hhbmdlZCB3aGVuIHRoZSBjb21tYW5kIGxpbmUgZGlkIGNoYW5nZS4KKyAqIChTb3JyeSBmb3IgdGhlIGdvdG8ncywgSSBrbm93IGl0IGlzIHVnbHkpLgorICovCitjbWRsaW5lX25vdF9jaGFuZ2VkOgorI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJaWYgKCFpbmNzZWFyY2hfcG9zdHBvbmVkKQorCSAgICBjb250aW51ZTsKKyNlbmRpZgorCitjbWRsaW5lX2NoYW5nZWQ6CisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKwkvKgorCSAqICdpbmNzZWFyY2gnIGhpZ2hsaWdodGluZy4KKwkgKi8KKwlpZiAocF9pcyAmJiAhY21kX3NpbGVudCAmJiAoZmlyc3RjID09ICcvJyB8fCBmaXJzdGMgPT0gJz8nKSkKKwl7CisJICAgIC8qIGlmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIHdhaXRpbmcsIHNlYXJjaCBhbmQgcmVkcmF3IGxhdGVyICovCisJICAgIGlmIChjaGFyX2F2YWlsKCkpCisJICAgIHsKKwkJaW5jc2VhcmNoX3Bvc3Rwb25lZCA9IFRSVUU7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGluY3NlYXJjaF9wb3N0cG9uZWQgPSBGQUxTRTsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IG9sZF9jdXJzb3I7ICAvKiBzdGFydCBhdCBvbGQgcG9zaXRpb24gKi8KKworCSAgICAvKiBJZiB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUsIGRvbid0IGRvIGFueXRoaW5nICovCisJICAgIGlmIChjY2xpbmUuY21kbGVuID09IDApCisJCWkgPSAwOworCSAgICBlbHNlCisJICAgIHsKKwkJY3Vyc29yX29mZigpOwkJLyogc28gdGhlIHVzZXIga25vd3Mgd2UncmUgYnVzeSAqLworCQlvdXRfZmx1c2goKTsKKwkJKytlbXNnX29mZjsgICAgLyogU28gaXQgZG9lc24ndCBiZWVwIGlmIGJhZCBleHByICovCisJCWkgPSBkb19zZWFyY2goTlVMTCwgZmlyc3RjLCBjY2xpbmUuY21kYnVmZiwgY291bnQsCisJCQlTRUFSQ0hfS0VFUCArIFNFQVJDSF9PUFQgKyBTRUFSQ0hfTk9PRiArIFNFQVJDSF9QRUVLKTsKKwkJLS1lbXNnX29mZjsKKwkJLyogaWYgaW50ZXJydXB0ZWQgd2hpbGUgc2VhcmNoaW5nLCBiZWhhdmUgbGlrZSBpdCBmYWlsZWQgKi8KKwkJaWYgKGdvdF9pbnQpCisJCXsKKwkJICAgICh2b2lkKXZwZWVrYygpOwkvKiByZW1vdmUgPEMtQz4gZnJvbSBpbnB1dCBzdHJlYW0gKi8KKwkJICAgIGdvdF9pbnQgPSBGQUxTRTsJLyogZG9uJ3QgYWJhbmRvbiB0aGUgY29tbWFuZCBsaW5lICovCisJCSAgICBpID0gMDsKKwkJfQorCQllbHNlIGlmIChjaGFyX2F2YWlsKCkpCisJCSAgICAvKiBjYW5jZWxsZWQgc2VhcmNoaW5nIGJlY2F1c2UgYSBjaGFyIHdhcyB0eXBlZCAqLworCQkgICAgaW5jc2VhcmNoX3Bvc3Rwb25lZCA9IFRSVUU7CisJICAgIH0KKwkgICAgaWYgKGkpCisJCWhpZ2hsaWdodF9tYXRjaCA9IFRSVUU7CQkvKiBoaWdobGlnaHQgcG9zaXRpb24gKi8KKwkgICAgZWxzZQorCQloaWdobGlnaHRfbWF0Y2ggPSBGQUxTRTsJLyogcmVtb3ZlIGhpZ2hsaWdodCAqLworCisJICAgIC8qIGZpcnN0IHJlc3RvcmUgdGhlIG9sZCBjdXJ3aW4gdmFsdWVzLCBzbyB0aGUgc2NyZWVuIGlzCisJICAgICAqIHBvc2l0aW9uZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBhY3R1YWwgc2VhcmNoIGNvbW1hbmQgKi8KKwkgICAgY3Vyd2luLT53X2xlZnRjb2wgPSBvbGRfbGVmdGNvbDsKKwkgICAgY3Vyd2luLT53X3RvcGxpbmUgPSBvbGRfdG9wbGluZTsKKyMgaWZkZWYgRkVBVF9ESUZGCisJICAgIGN1cndpbi0+d190b3BmaWxsID0gb2xkX3RvcGZpbGw7CisjIGVuZGlmCisJICAgIGN1cndpbi0+d19ib3RsaW5lID0gb2xkX2JvdGxpbmU7CisJICAgIGNoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKTsKKwkgICAgdXBkYXRlX3RvcGxpbmUoKTsKKworCSAgICBpZiAoaSAhPSAwKQorCSAgICB7CisJCS8qCisJCSAqIEZpcnN0IG1vdmUgY3Vyc29yIHRvIGVuZCBvZiBtYXRjaCwgdGhlbiB0byBzdGFydC4gIFRoaXMKKwkJICogbW92ZXMgdGhlIHdob2xlIG1hdGNoIG9udG8gdGhlIHNjcmVlbiB3aGVuICdub3dyYXAnIGlzIHNldC4KKwkJICovCisJCWkgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkJY3Vyd2luLT53X2N1cnNvci5sbnVtICs9IHNlYXJjaF9tYXRjaF9saW5lczsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBzZWFyY2hfbWF0Y2hfZW5kY29sOworCQl2YWxpZGF0ZV9jdXJzb3IoKTsKKwkJY3Vyd2luLT53X2N1cnNvci5sbnVtIC09IHNlYXJjaF9tYXRjaF9saW5lczsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBpOworCSAgICB9CisJICAgIHZhbGlkYXRlX2N1cnNvcigpOworCisJICAgIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKwkgICAgbXNnX3N0YXJ0aGVyZSgpOworCSAgICByZWRyYXdjbWRsaW5lKCk7CisJICAgIGRpZF9pbmNzZWFyY2ggPSBUUlVFOworCX0KKyNlbHNlIC8qIEZFQVRfU0VBUkNIX0VYVFJBICovCisJOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCWlmIChjbWRtc2dfcmwKKyMgaWZkZWYgRkVBVF9BUkFCSUMKKwkJfHwgcF9hcnNoYXBlCisjIGVuZGlmCisJCSkKKwkgICAgLyogQWx3YXlzIHJlZHJhdyB0aGUgd2hvbGUgY29tbWFuZCBsaW5lIHRvIGZpeCBzaGFwaW5nIGFuZAorCSAgICAgKiByaWdodC1sZWZ0IHR5cGluZy4gIE5vdCBlZmZpY2llbnQsIGJ1dCBpdCB3b3Jrcy4gKi8KKwkgICAgcmVkcmF3Y21kKCk7CisjZW5kaWYKKyAgICB9CisKK3JldHVybmNtZDoKKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgY21kbXNnX3JsID0gRkFMU0U7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRktNQVAKKyAgICBjbWRfZmttYXAgPSAwOworI2VuZGlmCisKKyAgICBFeHBhbmRDbGVhbnVwKCZ4cGMpOworCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBpZiAoZGlkX2luY3NlYXJjaCkKKyAgICB7CisJY3Vyd2luLT53X2N1cnNvciA9IG9sZF9jdXJzb3I7CisJY3Vyd2luLT53X2N1cnN3YW50ID0gb2xkX2N1cnN3YW50OworCWN1cndpbi0+d19sZWZ0Y29sID0gb2xkX2xlZnRjb2w7CisJY3Vyd2luLT53X3RvcGxpbmUgPSBvbGRfdG9wbGluZTsKKyMgaWZkZWYgRkVBVF9ESUZGCisJY3Vyd2luLT53X3RvcGZpbGwgPSBvbGRfdG9wZmlsbDsKKyMgZW5kaWYKKwljdXJ3aW4tPndfYm90bGluZSA9IG9sZF9ib3RsaW5lOworCWhpZ2hsaWdodF9tYXRjaCA9IEZBTFNFOworCXZhbGlkYXRlX2N1cnNvcigpOwkvKiBuZWVkZWQgZm9yIFRBQiAqLworCXJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNjbGluZS5jbWRidWZmICE9IE5VTEwpCisgICAgeworCS8qCisJICogUHV0IGxpbmUgaW4gaGlzdG9yeSBidWZmZXIgKCI6IiBhbmQgIj0iIG9ubHkgd2hlbiBpdCB3YXMgdHlwZWQpLgorCSAqLworI2lmZGVmIEZFQVRfQ01ESElTVAorCWlmIChjY2xpbmUuY21kbGVuICYmIGZpcnN0YyAhPSBOVUwKKwkJJiYgKHNvbWVfa2V5X3R5cGVkIHx8IGhpc3R5cGUgPT0gSElTVF9TRUFSQ0gpKQorCXsKKwkgICAgYWRkX3RvX2hpc3RvcnkoaGlzdHlwZSwgY2NsaW5lLmNtZGJ1ZmYsIFRSVUUsCisJCQkJICAgICAgIGhpc3R5cGUgPT0gSElTVF9TRUFSQ0ggPyBmaXJzdGMgOiBOVUwpOworCSAgICBpZiAoZmlyc3RjID09ICc6JykKKwkgICAgeworCQl2aW1fZnJlZShuZXdfbGFzdF9jbWRsaW5lKTsKKwkJbmV3X2xhc3RfY21kbGluZSA9IHZpbV9zdHJzYXZlKGNjbGluZS5jbWRidWZmKTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisJaWYgKGdvdGVzYykJICAgIC8qIGFiYW5kb24gY29tbWFuZCBsaW5lICovCisJeworCSAgICB2aW1fZnJlZShjY2xpbmUuY21kYnVmZik7CisJICAgIGNjbGluZS5jbWRidWZmID0gTlVMTDsKKwkgICAgaWYgKG1zZ19zY3JvbGxlZCA9PSAwKQorCQljb21wdXRlX2NtZHJvdygpOworCSAgICBNU0coIiIpOworCSAgICByZWRyYXdfY21kbGluZSA9IFRSVUU7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlIHNjcmVlbiB3YXMgc2hpZnRlZCB1cCwgcmVkcmF3IHRoZSB3aG9sZSBzY3JlZW4gKGxhdGVyKS4KKyAgICAgKiBJZiB0aGUgbGluZSBpcyB0b28gbG9uZywgY2xlYXIgaXQsIHNvIHJ1bGVyIGFuZCBzaG93biBjb21tYW5kIGRvCisgICAgICogbm90IGdldCBwcmludGVkIGluIHRoZSBtaWRkbGUgb2YgaXQuCisgICAgICovCisgICAgbXNnX2NoZWNrKCk7CisgICAgbXNnX3Njcm9sbCA9IHNhdmVfbXNnX3Njcm9sbDsKKyAgICByZWRpcl9vZmYgPSBGQUxTRTsKKworICAgIC8qIFdoZW4gdGhlIGNvbW1hbmQgbGluZSB3YXMgdHlwZWQsIG5vIG5lZWQgZm9yIGEgd2FpdC1yZXR1cm4gcHJvbXB0LiAqLworICAgIGlmIChzb21lX2tleV90eXBlZCkKKwluZWVkX3dhaXRfcmV0dXJuID0gRkFMU0U7CisKKyAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKyAgICBpZiAoYl9pbV9wdHIgIT0gTlVMTCAmJiAqYl9pbV9wdHIgIT0gQl9JTU9ERV9MTUFQKQorCWltX3NhdmVfc3RhdHVzKGJfaW1fcHRyKTsKKyAgICBpbV9zZXRfYWN0aXZlKEZBTFNFKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzZXRtb3VzZSgpOworI2VuZGlmCisjaWZkZWYgQ1VSU09SX1NIQVBFCisgICAgdWlfY3Vyc29yX3NoYXBlKCk7CQkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjZW5kaWYKKworICAgIHJldHVybiBjY2xpbmUuY21kYnVmZjsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfQ1JZUFQpIHx8IGRlZmluZWQoRkVBVF9FVkFMKSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgYSBjb21tYW5kIGxpbmUgd2l0aCBhIHByb21wdC4KKyAqIFRoaXMgaXMgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gZ2V0Y21kbGluZSgpIChlLmcuIGJ5CisgKiBmX2lucHV0KCkgd2hlbiBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24gZnJvbSBDVFJMLVIgPSkuCisgKiBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgaW4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgTlVMTC4KKyAqLworICAgIGNoYXJfdSAqCitnZXRjbWRsaW5lX3Byb21wdChmaXJzdGMsIHByb21wdCwgYXR0cikKKyAgICBpbnQJCWZpcnN0YzsKKyAgICBjaGFyX3UJKnByb21wdDsJLyogY29tbWFuZCBsaW5lIHByb21wdCAqLworICAgIGludAkJYXR0cjsJCS8qIGF0dHJpYnV0ZXMgZm9yIHByb21wdCAqLworeworICAgIGNoYXJfdQkJKnM7CisgICAgc3RydWN0IGNtZGxpbmVfaW5mbwlzYXZlX2NjbGluZTsKKyAgICBpbnQJCQltc2dfY29sX3NhdmUgPSBtc2dfY29sOworCisgICAgc2F2ZV9jY2xpbmUgPSBjY2xpbmU7CisgICAgY2NsaW5lLmNtZGJ1ZmYgPSBOVUxMOworICAgIGNjbGluZS5jbWRwcm9tcHQgPSBwcm9tcHQ7CisgICAgY2NsaW5lLmNtZGF0dHIgPSBhdHRyOworICAgIHMgPSBnZXRjbWRsaW5lKGZpcnN0YywgMUwsIDApOworICAgIGNjbGluZSA9IHNhdmVfY2NsaW5lOworICAgIC8qIFJlc3RvcmUgbXNnX2NvbCwgdGhlIHByb21wdCBmcm9tIGlucHV0KCkgbWF5IGhhdmUgY2hhbmdlZCBpdC4gKi8KKyAgICBtc2dfY29sID0gbXNnX2NvbF9zYXZlOworCisgICAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyBpbnQKK2NtZGxpbmVfY2hhcnNpemUoaWR4KQorICAgIGludAkJaWR4OworeworI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpCisgICAgaWYgKGNtZGxpbmVfc3RhciA+IDApCSAgICAvKiBzaG93aW5nICcqJywgYWx3YXlzIDEgcG9zaXRpb24gKi8KKwlyZXR1cm4gMTsKKyNlbmRpZgorICAgIHJldHVybiBwdHIyY2VsbHMoY2NsaW5lLmNtZGJ1ZmYgKyBpZHgpOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJzb3Igb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIHByb21wdCBhbmQKKyAqIGluZGVudC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfY21kc3BvcygpCit7CisgICAgaWYgKGNjbGluZS5jbWRmaXJzdGMpCisJY2NsaW5lLmNtZHNwb3MgPSAxICsgY2NsaW5lLmNtZGluZGVudDsKKyAgICBlbHNlCisJY2NsaW5lLmNtZHNwb3MgPSAwICsgY2NsaW5lLmNtZGluZGVudDsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHNjcmVlbiBwb3NpdGlvbiBmb3IgdGhlIGN1cnNvciBvbiB0aGUgY29tbWFuZCBsaW5lLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9jbWRzcG9zX2N1cnNvcigpCit7CisgICAgaW50CQlpLCBtLCBjOworCisgICAgc2V0X2NtZHNwb3MoKTsKKyAgICBpZiAoS2V5VHlwZWQpCisJbSA9IENvbHVtbnMgKiBSb3dzOworICAgIGVsc2UKKwltID0gTUFYQ09MOworICAgIGZvciAoaSA9IDA7IGkgPCBjY2xpbmUuY21kbGVuICYmIGkgPCBjY2xpbmUuY21kcG9zOyArK2kpCisgICAgeworCWMgPSBjbWRsaW5lX2NoYXJzaXplKGkpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkvKiBDb3VudCAiPiIgZm9yIGRvdWJsZS13aWRlIG11bHRpLWJ5dGUgY2hhciB0aGF0IGRvZXNuJ3QgZml0LiAqLworCWlmIChoYXNfbWJ5dGUpCisJICAgIGNvcnJlY3RfY21kc3BvcyhpLCBjKTsKKyNlbmRpZgorCS8qIElmIHRoZSBjbWRsaW5lIGRvZXNuJ3QgZml0LCBwdXQgY3Vyc29yIG9uIGxhc3QgdmlzaWJsZSBjaGFyLiAqLworCWlmICgoY2NsaW5lLmNtZHNwb3MgKz0gYykgPj0gbSkKKwl7CisJICAgIGNjbGluZS5jbWRwb3MgPSBpIC0gMTsKKwkgICAgY2NsaW5lLmNtZHNwb3MgLT0gYzsKKwkgICAgYnJlYWs7CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBpICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYgKyBpKSAtIDE7CisjZW5kaWYKKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX01CWVRFCisvKgorICogQ2hlY2sgaWYgdGhlIGNoYXJhY3RlciBhdCAiaWR4Iiwgd2hpY2ggaXMgImNlbGxzIiB3aWRlLCBpcyBhIG11bHRpLWJ5dGUKKyAqIGNoYXJhY3RlciB0aGF0IGRvZXNuJ3QgZml0LCBzbyB0aGF0IGEgIj4iIG11c3QgYmUgZGlzcGxheWVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvcnJlY3RfY21kc3BvcyhpZHgsIGNlbGxzKQorICAgIGludAkJaWR4OworICAgIGludAkJY2VsbHM7Cit7CisgICAgaWYgKCgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYgKyBpZHgpID4gMQorCQkmJiAoKm1iX3B0cjJjZWxscykoY2NsaW5lLmNtZGJ1ZmYgKyBpZHgpID4gMQorCQkmJiBjY2xpbmUuY21kc3BvcyAlIENvbHVtbnMgKyBjZWxscyA+IENvbHVtbnMpCisJY2NsaW5lLmNtZHNwb3MrKzsKK30KKyNlbmRpZgorCisvKgorICogR2V0IGFuIEV4IGNvbW1hbmQgbGluZSBmb3IgdGhlICI6IiBjb21tYW5kLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIGNoYXJfdSAqCitnZXRleGxpbmUoYywgZHVtbXksIGluZGVudCkKKyAgICBpbnQJCWM7CQkvKiBub3JtYWxseSAnOicsIE5VTCBmb3IgIjphcHBlbmQiICovCisgICAgdm9pZAkqZHVtbXk7CQkvKiBjb29raWUgbm90IHVzZWQgKi8KKyAgICBpbnQJCWluZGVudDsJCS8qIGluZGVudCBmb3IgaW5zaWRlIGNvbmRpdGlvbmFscyAqLworeworICAgIC8qIFdoZW4gZXhlY3V0aW5nIGEgcmVnaXN0ZXIsIHJlbW92ZSAnOicgdGhhdCdzIGluIGZyb250IG9mIGVhY2ggbGluZS4gKi8KKyAgICBpZiAoZXhlY19mcm9tX3JlZyAmJiB2cGVla2MoKSA9PSAnOicpCisJKHZvaWQpdmdldGMoKTsKKyAgICByZXR1cm4gZ2V0Y21kbGluZShjLCAxTCwgaW5kZW50KTsKK30KKworLyoKKyAqIEdldCBhbiBFeCBjb21tYW5kIGxpbmUgZm9yIEV4IG1vZGUuCisgKiBJbiBFeCBtb2RlIHdlIG9ubHkgdXNlIHRoZSBPUyBzdXBwbGllZCBsaW5lIGVkaXRpbmcgZmVhdHVyZXMgYW5kIG5vCisgKiBtYXBwaW5ncyBvciBhYmJyZXZpYXRpb25zLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIGNoYXJfdSAqCitnZXRleG1vZGVsaW5lKGMsIGR1bW15LCBpbmRlbnQpCisgICAgaW50CQljOwkJLyogbm9ybWFsbHkgJzonLCBOVUwgZm9yICI6YXBwZW5kIiAqLworICAgIHZvaWQJKmR1bW15OwkJLyogY29va2llIG5vdCB1c2VkICovCisgICAgaW50CQlpbmRlbnQ7CQkvKiBpbmRlbnQgZm9yIGluc2lkZSBjb25kaXRpb25hbHMgKi8KK3sKKyAgICBnYXJyYXlfVAkJbGluZV9nYTsKKyAgICBpbnQJCQlsZW47CisgICAgaW50CQkJb2ZmID0gMDsKKyAgICBjaGFyX3UJCSpwOworICAgIGludAkJCWZpbmlzaGVkID0gRkFMU0U7CisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChOT19DT09LRURfSU5QVVQpCisgICAgaW50CQkJc3RhcnRjb2wgPSAwOworICAgIGludAkJCWMxOworICAgIGludAkJCWVzY2FwZWQgPSBGQUxTRTsJLyogQ1RSTC1WIHR5cGVkICovCisgICAgaW50CQkJdmNvbCA9IDA7CisjZW5kaWYKKworICAgIC8qIFN3aXRjaCBjdXJzb3Igb24gbm93LiAgVGhpcyBhdm9pZHMgdGhhdCBpdCBoYXBwZW5zIGFmdGVyIHRoZSAiXG4iLCB3aGljaAorICAgICAqIGNvbmZ1c2VzIHRoZSBzeXN0ZW0gZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0YWJzdG9wcy4gKi8KKyAgICBjdXJzb3Jfb24oKTsKKworICAgIC8qIGFsd2F5cyBzdGFydCBpbiBjb2x1bW4gMDsgd3JpdGUgYSBuZXdsaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgIGNvbXB1dGVfY21kcm93KCk7CisgICAgaWYgKG1zZ19jb2wpCisJbXNnX3B1dGNoYXIoJ1xuJyk7CisgICAgaWYgKGMgPT0gJzonKQorICAgIHsKKwltc2dfcHV0Y2hhcignOicpOworCXdoaWxlIChpbmRlbnQtLSA+IDApCisJICAgIG1zZ19wdXRjaGFyKCcgJyk7CisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChOT19DT09LRURfSU5QVVQpCisJc3RhcnRjb2wgPSBtc2dfY29sOworI2VuZGlmCisgICAgfQorCisgICAgZ2FfaW5pdDIoJmxpbmVfZ2EsIDEsIDMwKTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBsaW5lLCBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KKyAgICAgKi8KKyAgICBnb3RfaW50ID0gRkFMU0U7CisgICAgd2hpbGUgKCFnb3RfaW50ICYmICFmaW5pc2hlZCkKKyAgICB7CisJaWYgKGdhX2dyb3coJmxpbmVfZ2EsIDQwKSA9PSBGQUlMKQorCSAgICBicmVhazsKKwlwID0gKGNoYXJfdSAqKWxpbmVfZ2EuZ2FfZGF0YSArIGxpbmVfZ2EuZ2FfbGVuOworCisJLyogR2V0IG9uZSBjaGFyYWN0ZXIgKGluY2hhciBnZXRzIGEgdGhpcmQgb2YgbWF4bGVuIGNoYXJhY3RlcnMhKSAqLworCWxlbiA9IGluY2hhcihwICsgb2ZmLCAzLCAtMUwsIDApOworCWlmIChsZW4gPCAwKQorCSAgICBjb250aW51ZTsJICAgIC8qIGVuZCBvZiBpbnB1dCBzY3JpcHQgcmVhY2hlZCAqLworCS8qIGZvciBhIHNwZWNpYWwgY2hhcmFjdGVyLCB3ZSBuZWVkIGF0IGxlYXN0IHRocmVlIGNoYXJhY3RlcnMgKi8KKwlpZiAoKCpwID09IEtfU1BFQ0lBTCB8fCAqcCA9PSBDU0kpICYmIG9mZiArIGxlbiA8IDMpCisJeworCSAgICBvZmYgKz0gbGVuOworCSAgICBjb250aW51ZTsKKwl9CisJbGVuICs9IG9mZjsKKwlvZmYgPSAwOworCisJLyoKKwkgKiBXaGVuIHVzaW5nIHRoZSBHVUksIGFuZCBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgY29va2VkIGlucHV0LAorCSAqIGhhbmRsZSBsaW5lIGVkaXRpbmcgaGVyZS4KKwkgKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKE5PX0NPT0tFRF9JTlBVVCkKKyMgaWZuZGVmIE5PX0NPT0tFRF9JTlBVVAorCWlmIChndWkuaW5fdXNlKQorIyBlbmRpZgorCXsKKwkgICAgaWYgKGdvdF9pbnQpCisJICAgIHsKKwkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgd2hpbGUgKGxlbiA+IDApCisJICAgIHsKKwkJYzEgPSAqcCsrOworCQktLWxlbjsKKwkJaWYgKChjMSA9PSBLX1NQRUNJQUwKKyMgIGlmICFkZWZpbmVkKE5PX0NPT0tFRF9JTlBVVCkgfHwgZGVmaW5lZChGRUFUX0dVSSkKKwkJCSAgICB8fCBjMSA9PSBDU0kKKyMgIGVuZGlmCisJCSAgICApICYmIGxlbiA+PSAyKQorCQl7CisJCSAgICBjMSA9IFRPX1NQRUNJQUwocFswXSwgcFsxXSk7CisJCSAgICBwICs9IDI7CisJCSAgICBsZW4gLT0gMjsKKwkJfQorCisJCWlmICghZXNjYXBlZCkKKwkJeworCQkgICAgLyogQ1IgdHlwZWQgbWVhbnMgImVudGVyIiwgd2hpY2ggaXMgTkwgKi8KKwkJICAgIGlmIChjMSA9PSAnXHInKQorCQkJYzEgPSAnXG4nOworCisJCSAgICBpZiAoYzEgPT0gQlMgfHwgYzEgPT0gS19CUworCQkJCSAgfHwgYzEgPT0gREVMIHx8IGMxID09IEtfREVMIHx8IGMxID09IEtfS0RFTCkKKwkJICAgIHsKKwkJCWlmIChsaW5lX2dhLmdhX2xlbiA+IDApCisJCQl7CisJCQkgICAgaW50CQlpLCB2OworCQkJICAgIGNoYXJfdQkqcTsKKworCQkJICAgIC0tbGluZV9nYS5nYV9sZW47CisJCQkgICAgKytsaW5lX2dhLmdhX3Jvb207CisJCQkgICAgLyogY29tcHV0ZSBjb2x1bW4gdGhhdCBjdXJzb3Igc2hvdWxkIGJlIGluICovCisJCQkgICAgdiA9IDA7CisJCQkgICAgcSA9ICgoY2hhcl91ICopbGluZV9nYS5nYV9kYXRhKTsKKwkJCSAgICBmb3IgKGkgPSAwOyBpIDwgbGluZV9nYS5nYV9sZW47ICsraSkKKwkJCSAgICB7CisJCQkJaWYgKCpxID09IFRBQikKKwkJCQkgICAgdiArPSA4IC0gdiAlIDg7CisJCQkJZWxzZQorCQkJCSAgICB2ICs9IHB0cjJjZWxscyhxKTsKKwkJCQkrK3E7CisJCQkgICAgfQorCQkJICAgIC8qIGVyYXNlIGNoYXJhY3RlcnMgdG8gcG9zaXRpb24gY3Vyc29yICovCisJCQkgICAgd2hpbGUgKHZjb2wgPiB2KQorCQkJICAgIHsKKwkJCQltc2dfcHV0Y2hhcignXGInKTsKKwkJCQltc2dfcHV0Y2hhcignICcpOworCQkJCW1zZ19wdXRjaGFyKCdcYicpOworCQkJCS0tdmNvbDsKKwkJCSAgICB9CisJCQl9CisJCQljb250aW51ZTsKKwkJICAgIH0KKworCQkgICAgaWYgKGMxID09IEN0cmxfVSkKKwkJICAgIHsKKwkJCW1zZ19jb2wgPSBzdGFydGNvbDsKKwkJCW1zZ19jbHJfZW9zKCk7CisJCQlsaW5lX2dhLmdhX3Jvb20gKz0gbGluZV9nYS5nYV9sZW47CisJCQlsaW5lX2dhLmdhX2xlbiA9IDA7CisJCQljb250aW51ZTsKKwkJICAgIH0KKworCQkgICAgaWYgKGMxID09IEN0cmxfVikKKwkJICAgIHsKKwkJCWVzY2FwZWQgPSBUUlVFOworCQkJY29udGludWU7CisJCSAgICB9CisJCX0KKworCQlpZiAoSVNfU1BFQ0lBTChjMSkpCisJCSAgICBjMSA9ICc/JzsKKwkJKChjaGFyX3UgKilsaW5lX2dhLmdhX2RhdGEpW2xpbmVfZ2EuZ2FfbGVuXSA9IGMxOworCQlpZiAoYzEgPT0gJ1xuJykKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCQllbHNlIGlmIChjMSA9PSBUQUIpCisJCXsKKwkJICAgIC8qIERvbid0IHVzZSBjaGFydGFic2l6ZSgpLCAndHMnIGNhbiBiZSBkaWZmZXJlbnQgKi8KKwkJICAgIGRvCisJCSAgICB7CisJCQltc2dfcHV0Y2hhcignICcpOworCQkgICAgfSB3aGlsZSAoKyt2Y29sICUgOCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBtc2dfb3V0dHJhbnNfbGVuKAorCQkJICAgICAoKGNoYXJfdSAqKWxpbmVfZ2EuZ2FfZGF0YSkgKyBsaW5lX2dhLmdhX2xlbiwgMSk7CisJCSAgICB2Y29sICs9IGNoYXIyY2VsbHMoYzEpOworCQl9CisJCSsrbGluZV9nYS5nYV9sZW47CisJCS0tbGluZV9nYS5nYV9yb29tOworCQllc2NhcGVkID0gRkFMU0U7CisJICAgIH0KKwkgICAgd2luZGdvdG8obXNnX3JvdywgbXNnX2NvbCk7CisJfQorIyBpZm5kZWYgTk9fQ09PS0VEX0lOUFVUCisJZWxzZQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIE5PX0NPT0tFRF9JTlBVVAorCXsKKwkgICAgbGluZV9nYS5nYV9sZW4gKz0gbGVuOworCSAgICBsaW5lX2dhLmdhX3Jvb20gLT0gbGVuOworCX0KKyNlbmRpZgorCXAgPSAoY2hhcl91ICopKGxpbmVfZ2EuZ2FfZGF0YSkgKyBsaW5lX2dhLmdhX2xlbjsKKwlpZiAobGluZV9nYS5nYV9sZW4gJiYgcFstMV0gPT0gJ1xuJykKKwl7CisJICAgIGZpbmlzaGVkID0gVFJVRTsKKwkgICAgLS1saW5lX2dhLmdhX2xlbjsKKwkgICAgLS1wOworCSAgICAqcCA9IE5VTDsKKwl9CisgICAgfQorCisgICAgLyogbm90ZSB0aGF0IGN1cnNvciBoYXMgbW92ZWQsIGJlY2F1c2Ugb2YgdGhlIGVjaG9lZCA8Q1I+ICovCisgICAgc2NyZWVuX2Rvd24oKTsKKyAgICAvKiBtYWtlIGZvbGxvd2luZyBtZXNzYWdlcyBnbyB0byB0aGUgbmV4dCBsaW5lICovCisgICAgbXNnX2RpZG91dCA9IEZBTFNFOworICAgIG1zZ19jb2wgPSAwOworICAgIGlmIChtc2dfcm93IDwgUm93cyAtIDEpCisJKyttc2dfcm93OworICAgIGVtc2dfb25fZGlzcGxheSA9IEZBTFNFOwkJLyogZG9uJ3Qgd2FudCB1aV9kZWxheSgpICovCisKKyAgICBpZiAoZ290X2ludCkKKwlnYV9jbGVhcigmbGluZV9nYSk7CisKKyAgICByZXR1cm4gKGNoYXJfdSAqKWxpbmVfZ2EuZ2FfZGF0YTsKK30KKworI2lmZGVmIENVUlNPUl9TSEFQRQorLyoKKyAqIFJldHVybiBUUlVFIGlmIGNjbGluZS5vdmVyc3RyaWtlIGlzIG9uLgorICovCisgICAgaW50CitjbWRsaW5lX292ZXJzdHJpa2UoKQoreworICAgIHJldHVybiBjY2xpbmUub3ZlcnN0cmlrZTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY21kbGluZS4KKyAqLworICAgIGludAorY21kbGluZV9hdF9lbmQoKQoreworICAgIHJldHVybiAoY2NsaW5lLmNtZHBvcyA+PSBjY2xpbmUuY21kbGVuKTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gdGhlIHZpcnR1YWwgY29sdW1uIG51bWJlciBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIElNIGNvZGUgdG8gb2J0YWluIHRoZSBzdGFydCBvZiB0aGUgcHJlZWRpdCBzdHJpbmcuCisgKi8KKyAgICBjb2xucl9UCitjbWRsaW5lX2dldHZjb2xfY3Vyc29yKCkKK3sKKyAgICBpZiAoY2NsaW5lLmNtZGJ1ZmYgPT0gTlVMTCB8fCBjY2xpbmUuY21kcG9zID4gY2NsaW5lLmNtZGxlbikKKwlyZXR1cm4gTUFYQ09MOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorICAgIHsKKwljb2xucl9UCWNvbDsKKwlpbnQJaSA9IDA7CisKKwlmb3IgKGNvbCA9IDA7IGkgPCBjY2xpbmUuY21kcG9zOyArK2NvbCkKKwkgICAgaSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGNjbGluZS5jbWRidWZmICsgaSk7CisKKwlyZXR1cm4gY29sOworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisJcmV0dXJuIGNjbGluZS5jbWRwb3M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKQorLyoKKyAqIElmIHBhcnQgb2YgdGhlIGNvbW1hbmQgbGluZSBpcyBhbiBJTSBwcmVlZGl0IHN0cmluZywgcmVkcmF3IGl0IHdpdGgKKyAqIElNIGZlZWRiYWNrIGF0dHJpYnV0ZXMuICBUaGUgY3Vyc29yIHBvc2l0aW9uIGlzIHJlc3RvcmVkIGFmdGVyIGRyYXdpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVkcmF3Y21kX3ByZWVkaXQoKQoreworICAgIGlmICgoU3RhdGUgJiBDTURMSU5FKQorCSAgICAmJiB4aWMgIT0gTlVMTAorCSAgICAmJiBpbV9nZXRfc3RhdHVzKCkKKwkgICAgJiYgIXBfaW1kaXNhYmxlCisJICAgICYmIGltX2lzX3ByZWVkaXRpbmcoKSkKKyAgICB7CisJaW50CWNtZHBvcyA9IDA7CisJaW50CWNtZHNwb3M7CisJaW50CW9sZF9yb3c7CisJaW50CW9sZF9jb2w7CisJY29sbnJfVAljb2w7CisKKwlvbGRfcm93ID0gbXNnX3JvdzsKKwlvbGRfY29sID0gbXNnX2NvbDsKKwljbWRzcG9zID0gKChjY2xpbmUuY21kZmlyc3RjKSA/IDEgOiAwKSArIGNjbGluZS5jbWRpbmRlbnQ7CisKKyMgaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHByZWVkaXRfc3RhcnRfY29sCisJCQkgICYmIGNtZHBvcyA8IGNjbGluZS5jbWRsZW47ICsrY29sKQorCSAgICB7CisJCWNtZHNwb3MgKz0gKCptYl9wdHIyY2VsbHMpKGNjbGluZS5jbWRidWZmICsgY21kcG9zKTsKKwkJY21kcG9zICArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGNjbGluZS5jbWRidWZmICsgY21kcG9zKTsKKwkgICAgfQorCX0KKwllbHNlCisjIGVuZGlmCisJeworCSAgICBjbWRzcG9zICs9IHByZWVkaXRfc3RhcnRfY29sOworCSAgICBjbWRwb3MgICs9IHByZWVkaXRfc3RhcnRfY29sOworCX0KKworCW1zZ19yb3cgPSBjbWRsaW5lX3JvdyArIChjbWRzcG9zIC8gKGludClDb2x1bW5zKTsKKwltc2dfY29sID0gY21kc3BvcyAlIChpbnQpQ29sdW1uczsKKwlpZiAobXNnX3JvdyA+PSBSb3dzKQorCSAgICBtc2dfcm93ID0gUm93cyAtIDE7CisKKwlmb3IgKGNvbCA9IDA7IGNtZHBvcyA8IGNjbGluZS5jbWRsZW47ICsrY29sKQorCXsKKwkgICAgaW50IGNoYXJfbGVuOworCSAgICBpbnQgY2hhcl9hdHRyOworCisJICAgIGNoYXJfYXR0ciA9IGltX2dldF9mZWVkYmFja19hdHRyKGNvbCk7CisJICAgIGlmIChjaGFyX2F0dHIgPCAwKQorCQlicmVhazsgLyogZW5kIG9mIHByZWVkaXQgc3RyaW5nICovCisKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQljaGFyX2xlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYgKyBjbWRwb3MpOworCSAgICBlbHNlCisjIGVuZGlmCisJCWNoYXJfbGVuID0gMTsKKworCSAgICBtc2dfb3V0dHJhbnNfbGVuX2F0dHIoY2NsaW5lLmNtZGJ1ZmYgKyBjbWRwb3MsIGNoYXJfbGVuLCBjaGFyX2F0dHIpOworCSAgICBjbWRwb3MgKz0gY2hhcl9sZW47CisJfQorCisJbXNnX3JvdyA9IG9sZF9yb3c7CisJbXNnX2NvbCA9IG9sZF9jb2w7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfWElNICYmIEZFQVRfR1VJX0dUSyAqLworCisvKgorICogQWxsb2NhdGUgYSBuZXcgY29tbWFuZCBsaW5lIGJ1ZmZlci4KKyAqIEFzc2lnbnMgdGhlIG5ldyBidWZmZXIgdG8gY2NsaW5lLmNtZGJ1ZmYgYW5kIGNjbGluZS5jbWRidWZmbGVuLgorICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIGNjbGluZS5jbWRidWZmIGFuZCBjY2xpbmUuY21kYnVmZmxlbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCithbGxvY19jbWRidWZmKGxlbikKKyAgICBpbnQJICAgIGxlbjsKK3sKKyAgICAvKgorICAgICAqIGdpdmUgc29tZSBleHRyYSBzcGFjZSB0byBhdm9pZCBoYXZpbmcgdG8gYWxsb2NhdGUgYWxsIHRoZSB0aW1lCisgICAgICovCisgICAgaWYgKGxlbiA8IDgwKQorCWxlbiA9IDEwMDsKKyAgICBlbHNlCisJbGVuICs9IDIwOworCisgICAgY2NsaW5lLmNtZGJ1ZmYgPSBhbGxvYyhsZW4pOyAgICAvKiBjYWxsZXIgc2hvdWxkIGNoZWNrIGZvciBvdXQtb2YtbWVtb3J5ICovCisgICAgY2NsaW5lLmNtZGJ1ZmZsZW4gPSBsZW47Cit9CisKKy8qCisgKiBSZS1hbGxvY2F0ZSB0aGUgY29tbWFuZCBsaW5lIHRvIGxlbmd0aCBsZW4gKyBzb21ldGhpbmcgZXh0cmEuCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBzdGF0aWMgaW50CityZWFsbG9jX2NtZGJ1ZmYobGVuKQorICAgIGludAkgICAgbGVuOworeworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBjY2xpbmUuY21kYnVmZjsKKyAgICBhbGxvY19jbWRidWZmKGxlbik7CQkJLyogd2lsbCBnZXQgc29tZSBtb3JlICovCisgICAgaWYgKGNjbGluZS5jbWRidWZmID09IE5VTEwpCQkvKiBvdXQgb2YgbWVtb3J5ICovCisgICAgeworCWNjbGluZS5jbWRidWZmID0gcDsJCS8qIGtlZXAgdGhlIG9sZCBvbmUgKi8KKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgbWNoX21lbW1vdmUoY2NsaW5lLmNtZGJ1ZmYsIHAsIChzaXplX3QpY2NsaW5lLmNtZGxlbiArIDEpOworICAgIHZpbV9mcmVlKHApOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIERyYXcgcGFydCBvZiB0aGUgY21kbGluZSBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uICBCdXQgZHJhdyBzdGFycworICogd2hlbiBjbWRsaW5lX3N0YXIgaXMgVFJVRS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkcmF3X2NtZGxpbmUoc3RhcnQsIGxlbikKKyAgICBpbnQJCXN0YXJ0OworICAgIGludAkJbGVuOworeworI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpCisgICAgaW50CQlpOworCisgICAgaWYgKGNtZGxpbmVfc3RhciA+IDApCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCXsKKwkgICAgbXNnX3B1dGNoYXIoJyonKTsKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlpICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoY2NsaW5lLmNtZGJ1ZmYgKyBzdGFydCArIGkpIC0gMTsKKyMgZW5kaWYKKwl9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9BUkFCSUMKKwlpZiAocF9hcnNoYXBlICYmICFwX3RiaWRpICYmIGVuY191dGY4ICYmIGxlbiA+IDApCisgICAgeworCXN0YXRpYyBjaGFyX3UJKmJ1ZjsKKwlzdGF0aWMgaW50CWJ1ZmxlbiA9IDA7CisJY2hhcl91CQkqcDsKKwlpbnQJCWo7CisJaW50CQluZXdsZW4gPSAwOworCWludAkJbWJfbDsKKwlpbnQJCXBjLCBwYzE7CisJaW50CQlwcmV2X2MgPSAwOworCWludAkJcHJldl9jMSA9IDA7CisJaW50CQl1OGMsIHU4Y19jMSwgdThjX2MyOworCWludAkJbmMgPSAwOworCWludAkJZHVtbXk7CisKKwkvKgorCSAqIERvIGFyYWJpYyBzaGFwaW5nIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiAgVGhpcyBpcyB2ZXJ5CisJICogaW5lZmZpY2llbnQhCisJICovCisJaWYgKGxlbiAqIDIgPiBidWZsZW4pCisJeworCSAgICAvKiBSZS1hbGxvY2F0ZSB0aGUgYnVmZmVyLiAgV2Uga2VlcCBpdCBhcm91bmQgdG8gYXZvaWQgYSBsb3Qgb2YKKwkgICAgICogYWxsb2MoKS9mcmVlKCkgY2FsbHMuICovCisJICAgIHZpbV9mcmVlKGJ1Zik7CisJICAgIGJ1ZmxlbiA9IGxlbiAqIDI7CisJICAgIGJ1ZiA9IGFsbG9jKGJ1Zmxlbik7CisJICAgIGlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuOwkvKiBvdXQgb2YgbWVtb3J5ICovCisJfQorCisJZm9yIChqID0gc3RhcnQ7IGogPCBzdGFydCArIGxlbjsgaiArPSBtYl9sKQorCXsKKwkgICAgcCA9IGNjbGluZS5jbWRidWZmICsgajsKKwkgICAgdThjID0gdXRmY19wdHIyY2hhcl9sZW4ocCwgJnU4Y19jMSwgJnU4Y19jMiwgc3RhcnQgKyBsZW4gLSBqKTsKKwkgICAgbWJfbCA9IHV0ZmNfcHRyMmxlbl9jaGVja19sZW4ocCwgc3RhcnQgKyBsZW4gLSBqKTsKKwkgICAgaWYgKEFSQUJJQ19DSEFSKHU4YykpCisJICAgIHsKKwkJLyogRG8gQXJhYmljIHNoYXBpbmcuICovCisJCWlmIChjbWRtc2dfcmwpCisJCXsKKwkJICAgIC8qIGRpc3BsYXlpbmcgZnJvbSByaWdodCB0byBsZWZ0ICovCisJCSAgICBwYyA9IHByZXZfYzsKKwkJICAgIHBjMSA9IHByZXZfYzE7CisJCSAgICBwcmV2X2MxID0gdThjX2MxOworCQkgICAgaWYgKGogKyBtYl9sID49IHN0YXJ0ICsgbGVuKQorCQkJbmMgPSBOVUw7CisJCSAgICBlbHNlCisJCQluYyA9IHV0Zl9wdHIyY2hhcihwICsgbWJfbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBkaXNwbGF5aW5nIGZyb20gbGVmdCB0byByaWdodCAqLworCQkgICAgaWYgKGogKyBtYl9sID49IHN0YXJ0ICsgbGVuKQorCQkJcGMgPSBOVUw7CisJCSAgICBlbHNlCisJCQlwYyA9IHV0ZmNfcHRyMmNoYXJfbGVuKHAgKyBtYl9sLCAmcGMxLCAmZHVtbXksCisJCQkJCQkgICAgICBzdGFydCArIGxlbiAtIGogLSBtYl9sKTsKKwkJICAgIG5jID0gcHJldl9jOworCQl9CisJCXByZXZfYyA9IHU4YzsKKworCQl1OGMgPSBhcmFiaWNfc2hhcGUodThjLCBOVUxMLCAmdThjX2MxLCBwYywgcGMxLCBuYyk7CisKKwkJbmV3bGVuICs9ICgqbWJfY2hhcjJieXRlcykodThjLCBidWYgKyBuZXdsZW4pOworCQlpZiAodThjX2MxICE9IDApCisJCXsKKwkJICAgIG5ld2xlbiArPSAoKm1iX2NoYXIyYnl0ZXMpKHU4Y19jMSwgYnVmICsgbmV3bGVuKTsKKwkJICAgIGlmICh1OGNfYzIgIT0gMCkKKwkJCW5ld2xlbiArPSAoKm1iX2NoYXIyYnl0ZXMpKHU4Y19jMiwgYnVmICsgbmV3bGVuKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlwcmV2X2MgPSB1OGM7CisJCW1jaF9tZW1tb3ZlKGJ1ZiArIG5ld2xlbiwgcCwgbWJfbCk7CisJCW5ld2xlbiArPSBtYl9sOworCSAgICB9CisJfQorCisJbXNnX291dHRyYW5zX2xlbihidWYsIG5ld2xlbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCW1zZ19vdXR0cmFuc19sZW4oY2NsaW5lLmNtZGJ1ZmYgKyBzdGFydCwgbGVuKTsKK30KKworLyoKKyAqIFB1dCBhIGNoYXJhY3RlciBvbiB0aGUgY29tbWFuZCBsaW5lLiAgU2hpZnRzIHRoZSBmb2xsb3dpbmcgdGV4dCB0byB0aGUKKyAqIHJpZ2h0IHdoZW4gInNoaWZ0IiBpcyBUUlVFLiAgVXNlZCBmb3IgQ1RSTC1WLCBDVFJMLUssIGV0Yy4KKyAqICJjIiBtdXN0IGJlIHByaW50YWJsZSAoZml0IGluIG9uZSBkaXNwbGF5IGNlbGwpIQorICovCisgICAgdm9pZAorcHV0Y21kbGluZShjLCBzaGlmdCkKKyAgICBpbnQJCWM7CisgICAgaW50CQlzaGlmdDsKK3sKKyAgICBpZiAoY21kX3NpbGVudCkKKwlyZXR1cm47CisgICAgbXNnX25vX21vcmUgPSBUUlVFOworICAgIG1zZ19wdXRjaGFyKGMpOworICAgIGlmIChzaGlmdCkKKwlkcmF3X2NtZGxpbmUoY2NsaW5lLmNtZHBvcywgY2NsaW5lLmNtZGxlbiAtIGNjbGluZS5jbWRwb3MpOworICAgIG1zZ19ub19tb3JlID0gRkFMU0U7CisgICAgY3Vyc29yY21kKCk7Cit9CisKKy8qCisgKiBVbmRvIGEgcHV0Y21kbGluZShjLCBGQUxTRSkuCisgKi8KKyAgICB2b2lkCit1bnB1dGNtZGxpbmUoKQoreworICAgIGlmIChjbWRfc2lsZW50KQorCXJldHVybjsKKyAgICBtc2dfbm9fbW9yZSA9IFRSVUU7CisgICAgaWYgKGNjbGluZS5jbWRsZW4gPT0gY2NsaW5lLmNtZHBvcykKKwltc2dfcHV0Y2hhcignICcpOworICAgIGVsc2UKKwlkcmF3X2NtZGxpbmUoY2NsaW5lLmNtZHBvcywgMSk7CisgICAgbXNnX25vX21vcmUgPSBGQUxTRTsKKyAgICBjdXJzb3JjbWQoKTsKK30KKworLyoKKyAqIFB1dCB0aGUgZ2l2ZW4gc3RyaW5nLCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLCBvbnRvIHRoZSBjb21tYW5kIGxpbmUuCisgKiBJZiBsZW4gaXMgLTEsIHRoZW4gU1RSTEVOKCkgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aC4KKyAqIElmICdyZWRyYXcnIGlzIFRSVUUgdGhlbiB0aGUgbmV3IHBhcnQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZSByZW1haW5pbmcKKyAqIHBhcnQgd2lsbCBiZSByZWRyYXduLCBvdGhlcndpc2UgaXQgd2lsbCBub3QuICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogdHdpY2UgaW4gYSByb3csIHRoZW4gJ3JlZHJhdycgc2hvdWxkIGJlIEZBTFNFIGFuZCByZWRyYXdjbWQoKSBzaG91bGQgYmUKKyAqIGNhbGxlZCBhZnRlcndhcmRzLgorICovCisgICAgaW50CitwdXRfb25fY21kbGluZShzdHIsIGxlbiwgcmVkcmF3KQorICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJbGVuOworICAgIGludAkJcmVkcmF3OworeworICAgIGludAkJcmV0dmFsOworICAgIGludAkJaTsKKyAgICBpbnQJCW07CisgICAgaW50CQljOworCisgICAgaWYgKGxlbiA8IDApCisJbGVuID0gKGludClTVFJMRU4oc3RyKTsKKworICAgIC8qIENoZWNrIGlmIGNjbGluZS5jbWRidWZmIG5lZWRzIHRvIGJlIGxvbmdlciAqLworICAgIGlmIChjY2xpbmUuY21kbGVuICsgbGVuICsgMSA+PSBjY2xpbmUuY21kYnVmZmxlbikKKwlyZXR2YWwgPSByZWFsbG9jX2NtZGJ1ZmYoY2NsaW5lLmNtZGxlbiArIGxlbik7CisgICAgZWxzZQorCXJldHZhbCA9IE9LOworICAgIGlmIChyZXR2YWwgPT0gT0spCisgICAgeworCWlmICghY2NsaW5lLm92ZXJzdHJpa2UpCisJeworCSAgICBtY2hfbWVtbW92ZShjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3MgKyBsZW4sCisJCQkJCSAgICAgICBjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3MsCisJCQkJICAgICAoc2l6ZV90KShjY2xpbmUuY21kbGVuIC0gY2NsaW5lLmNtZHBvcykpOworCSAgICBjY2xpbmUuY21kbGVuICs9IGxlbjsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJLyogQ291bnQgbnIgb2YgY2hhcmFjdGVycyBpbiB0aGUgbmV3IHN0cmluZy4gKi8KKwkJbSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gKCptYl9wdHIybGVuX2NoZWNrKShzdHIgKyBpKSkKKwkJICAgICsrbTsKKwkJLyogQ291bnQgbnIgb2YgYnl0ZXMgaW4gY21kbGluZSB0aGF0IGFyZSBvdmVyd3JpdHRlbiBieSB0aGVzZQorCQkgKiBjaGFyYWN0ZXJzLiAqLworCQlmb3IgKGkgPSBjY2xpbmUuY21kcG9zOyBpIDwgY2NsaW5lLmNtZGxlbiAmJiBtID4gMDsKKwkJCQkgaSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGNjbGluZS5jbWRidWZmICsgaSkpCisJCSAgICAtLW07CisJCWlmIChpIDwgY2NsaW5lLmNtZGxlbikKKwkJeworCQkgICAgbWNoX21lbW1vdmUoY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zICsgbGVuLAorCQkJICAgIGNjbGluZS5jbWRidWZmICsgaSwgKHNpemVfdCkoY2NsaW5lLmNtZGxlbiAtIGkpKTsKKwkJICAgIGNjbGluZS5jbWRsZW4gKz0gY2NsaW5lLmNtZHBvcyArIGxlbiAtIGk7CisJCX0KKwkJZWxzZQorCQkgICAgY2NsaW5lLmNtZGxlbiA9IGNjbGluZS5jbWRwb3MgKyBsZW47CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIGlmIChjY2xpbmUuY21kcG9zICsgbGVuID4gY2NsaW5lLmNtZGxlbikKKwkJY2NsaW5lLmNtZGxlbiA9IGNjbGluZS5jbWRwb3MgKyBsZW47CisJfQorCW1jaF9tZW1tb3ZlKGNjbGluZS5jbWRidWZmICsgY2NsaW5lLmNtZHBvcywgc3RyLCAoc2l6ZV90KWxlbik7CisJY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl0gPSBOVUw7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4KQorCXsKKwkgICAgLyogV2hlbiB0aGUgaW5zZXJ0ZWQgdGV4dCBzdGFydHMgd2l0aCBhIGNvbXBvc2luZyBjaGFyYWN0ZXIsCisJICAgICAqIGJhY2t1cCB0byB0aGUgY2hhcmFjdGVyIGJlZm9yZSBpdC4gIFRoZXJlIGNvdWxkIGJlIHR3byBvZiB0aGVtLgorCSAgICAgKi8KKwkgICAgaSA9IDA7CisJICAgIGMgPSB1dGZfcHRyMmNoYXIoY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKKwkgICAgd2hpbGUgKGNjbGluZS5jbWRwb3MgPiAwICYmIHV0Zl9pc2NvbXBvc2luZyhjKSkKKwkgICAgeworCQlpID0gKCptYl9oZWFkX29mZikoY2NsaW5lLmNtZGJ1ZmYsCisJCQkJICAgICAgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zIC0gMSkgKyAxOworCQljY2xpbmUuY21kcG9zIC09IGk7CisJCWxlbiArPSBpOworCQljID0gdXRmX3B0cjJjaGFyKGNjbGluZS5jbWRidWZmICsgY2NsaW5lLmNtZHBvcyk7CisJICAgIH0KKyMgaWZkZWYgRkVBVF9BUkFCSUMKKwkgICAgaWYgKGkgPT0gMCAmJiBjY2xpbmUuY21kcG9zID4gMCAmJiBhcmFiaWNfbWF5Y29tYmluZShjKSkKKwkgICAgeworCQkvKiBDaGVjayB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZvciBBcmFiaWMgY29tYmluaW5nIHBhaXIuICovCisJCWkgPSAoKm1iX2hlYWRfb2ZmKShjY2xpbmUuY21kYnVmZiwKKwkJCQkgICAgICBjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3MgLSAxKSArIDE7CisJCWlmIChhcmFiaWNfY29tYmluZSh1dGZfcHRyMmNoYXIoY2NsaW5lLmNtZGJ1ZmYKKwkJCQkJCSAgICAgKyBjY2xpbmUuY21kcG9zIC0gaSksIGMpKQorCQl7CisJCSAgICBjY2xpbmUuY21kcG9zIC09IGk7CisJCSAgICBsZW4gKz0gaTsKKwkJfQorCQllbHNlCisJCSAgICBpID0gMDsKKwkgICAgfQorIyBlbmRpZgorCSAgICBpZiAoaSAhPSAwKQorCSAgICB7CisJCS8qIEFsc28gYmFja3VwIHRoZSBjdXJzb3IgcG9zaXRpb24uICovCisJCWkgPSBwdHIyY2VsbHMoY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKKwkJY2NsaW5lLmNtZHNwb3MgLT0gaTsKKwkJbXNnX2NvbCAtPSBpOworCQlpZiAobXNnX2NvbCA8IDApCisJCXsKKwkJICAgIG1zZ19jb2wgKz0gQ29sdW1uczsKKwkJICAgIC0tbXNnX3JvdzsKKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisKKwlpZiAocmVkcmF3ICYmICFjbWRfc2lsZW50KQorCXsKKwkgICAgbXNnX25vX21vcmUgPSBUUlVFOworCSAgICBpID0gY21kbGluZV9yb3c7CisJICAgIGRyYXdfY21kbGluZShjY2xpbmUuY21kcG9zLCBjY2xpbmUuY21kbGVuIC0gY2NsaW5lLmNtZHBvcyk7CisJICAgIC8qIEF2b2lkIGNsZWFyaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5lIHRvbyBvZnRlbi4gKi8KKwkgICAgaWYgKGNtZGxpbmVfcm93ICE9IGkgfHwgY2NsaW5lLm92ZXJzdHJpa2UpCisJCW1zZ19jbHJfZW9zKCk7CisJICAgIG1zZ19ub19tb3JlID0gRkFMU0U7CisJfQorI2lmZGVmIEZFQVRfRktNQVAKKwkvKgorCSAqIElmIHdlIGFyZSBpbiBGYXJzaSBjb21tYW5kIG1vZGUsIHRoZSBjaGFyYWN0ZXIgaW5wdXQgbXVzdCBiZSBpbgorCSAqIEluc2VydCBtb2RlLiBTbyBkbyBub3QgYWR2YW5jZSB0aGUgY21kcG9zLgorCSAqLworCWlmICghY21kX2ZrbWFwKQorI2VuZGlmCisJeworCSAgICBpZiAoS2V5VHlwZWQpCisJCW0gPSBDb2x1bW5zICogUm93czsKKwkgICAgZWxzZQorCQltID0gTUFYQ09MOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJICAgIHsKKwkJYyA9IGNtZGxpbmVfY2hhcnNpemUoY2NsaW5lLmNtZHBvcyk7CisjaWZkZWYgRkVBVF9NQllURQorCQkvKiBjb3VudCAiPiIgZm9yIGEgZG91YmxlLXdpZGUgY2hhciB0aGF0IGRvZXNuJ3QgZml0LiAqLworCQlpZiAoaGFzX21ieXRlKQorCQkgICAgY29ycmVjdF9jbWRzcG9zKGNjbGluZS5jbWRwb3MsIGMpOworI2VuZGlmCisJCS8qIFN0b3AgY3Vyc29yIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmVlbiAqLworCQlpZiAoY2NsaW5lLmNtZHNwb3MgKyBjID49IG0pCisJCSAgICBicmVhazsKKwkJY2NsaW5lLmNtZHNwb3MgKz0gYzsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChoYXNfbWJ5dGUpCisJCXsKKwkJICAgIGMgPSAoKm1iX3B0cjJsZW5fY2hlY2spKGNjbGluZS5jbWRidWZmICsgY2NsaW5lLmNtZHBvcykgLSAxOworCQkgICAgaWYgKGMgPiBsZW4gLSBpIC0gMSkKKwkJCWMgPSBsZW4gLSBpIC0gMTsKKwkJICAgIGNjbGluZS5jbWRwb3MgKz0gYzsKKwkJICAgIGkgKz0gYzsKKwkJfQorI2VuZGlmCisJCSsrY2NsaW5lLmNtZHBvczsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKHJlZHJhdykKKwltc2dfY2hlY2soKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgRkVBVF9XSUxETUVOVQorLyoKKyAqIERlbGV0ZSBjaGFyYWN0ZXJzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGZyb20gImZyb20iIHRvIHRoZSBjdXJyZW50CisgKiBwb3NpdGlvbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjbWRsaW5lX2RlbChmcm9tKQorICAgIGludCBmcm9tOworeworICAgIG1jaF9tZW1tb3ZlKGNjbGluZS5jbWRidWZmICsgZnJvbSwgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zLAorCSAgICAoc2l6ZV90KShjY2xpbmUuY21kbGVuIC0gY2NsaW5lLmNtZHBvcyArIDEpKTsKKyAgICBjY2xpbmUuY21kbGVuIC09IGNjbGluZS5jbWRwb3MgLSBmcm9tOworICAgIGNjbGluZS5jbWRwb3MgPSBmcm9tOworfQorI2VuZGlmCisKKy8qCisgKiB0aGlzIGZ1Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNjcmVlbiBzaXplIGNoYW5nZXMgYW5kIHdpdGggaW5jcmVtZW50YWwKKyAqIHNlYXJjaAorICovCisgICAgdm9pZAorcmVkcmF3Y21kbGluZSgpCit7CisgICAgaWYgKGNtZF9zaWxlbnQpCisJcmV0dXJuOworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBjb21wdXRlX2NtZHJvdygpOworICAgIHJlZHJhd2NtZCgpOworICAgIGN1cnNvcmNtZCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK3JlZHJhd2NtZHByb21wdCgpCit7CisgICAgaW50CQlpOworCisgICAgaWYgKGNtZF9zaWxlbnQpCisJcmV0dXJuOworICAgIGlmIChjY2xpbmUuY21kZmlyc3RjKQorCW1zZ19wdXRjaGFyKGNjbGluZS5jbWRmaXJzdGMpOworICAgIGlmIChjY2xpbmUuY21kcHJvbXB0ICE9IE5VTEwpCisgICAgeworCW1zZ19wdXRzX2F0dHIoY2NsaW5lLmNtZHByb21wdCwgY2NsaW5lLmNtZGF0dHIpOworCWNjbGluZS5jbWRpbmRlbnQgPSBtc2dfY29sICsgKG1zZ19yb3cgLSBjbWRsaW5lX3JvdykgKiBDb2x1bW5zOworCS8qIGRvIHRoZSByZXZlcnNlIG9mIHNldF9jbWRzcG9zKCkgKi8KKwlpZiAoY2NsaW5lLmNtZGZpcnN0YykKKwkgICAgLS1jY2xpbmUuY21kaW5kZW50OworICAgIH0KKyAgICBlbHNlCisJZm9yIChpID0gY2NsaW5lLmNtZGluZGVudDsgaSA+IDA7IC0taSkKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKK30KKworLyoKKyAqIFJlZHJhdyB3aGF0IGlzIGN1cnJlbnRseSBvbiB0aGUgY29tbWFuZCBsaW5lLgorICovCisgICAgdm9pZAorcmVkcmF3Y21kKCkKK3sKKyAgICBpZiAoY21kX3NpbGVudCkKKwlyZXR1cm47CisKKyAgICBtc2dfc3RhcnQoKTsKKyAgICByZWRyYXdjbWRwcm9tcHQoKTsKKworICAgIC8qIERvbid0IHVzZSBtb3JlIHByb21wdCwgdHJ1bmNhdGUgdGhlIGNtZGxpbmUgaWYgaXQgZG9lc24ndCBmaXQuICovCisgICAgbXNnX25vX21vcmUgPSBUUlVFOworICAgIGRyYXdfY21kbGluZSgwLCBjY2xpbmUuY21kbGVuKTsKKyAgICBtc2dfY2xyX2VvcygpOworICAgIG1zZ19ub19tb3JlID0gRkFMU0U7CisKKyAgICBzZXRfY21kc3Bvc19jdXJzb3IoKTsKKworICAgIC8qCisgICAgICogQW4gZW1zZygpIGJlZm9yZSBtYXkgaGF2ZSBzZXQgbXNnX3Njcm9sbC4gVGhpcyBpcyB1c2VkIGluIG5vcm1hbCBtb2RlLAorICAgICAqIGluIGNtZGxpbmUgbW9kZSB3ZSBjYW4gcmVzZXQgdGhlbSBub3cuCisgICAgICovCisgICAgbXNnX3Njcm9sbCA9IEZBTFNFOwkJLyogbmV4dCBtZXNzYWdlIG92ZXJ3cml0ZXMgY21kbGluZSAqLworCisgICAgLyogVHlwaW5nICc6JyBhdCB0aGUgbW9yZSBwcm9tcHQgbWF5IHNldCBza2lwX3JlZHJhdy4gIFdlIGRvbid0IHdhbnQgdGhpcworICAgICAqIGluIGNtZGxpbmUgbW9kZSAqLworICAgIHNraXBfcmVkcmF3ID0gRkFMU0U7Cit9CisKKyAgICB2b2lkCitjb21wdXRlX2NtZHJvdygpCit7CisgICAgaWYgKGV4bW9kZV9hY3RpdmUgfHwgbXNnX3Njcm9sbGVkKQorCWNtZGxpbmVfcm93ID0gUm93cyAtIDE7CisgICAgZWxzZQorCWNtZGxpbmVfcm93ID0gV19XSU5ST1cobGFzdHdpbikgKyBsYXN0d2luLT53X2hlaWdodAorCQkJCQkJICAgKyBXX1NUQVRVU19IRUlHSFQobGFzdHdpbik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY3Vyc29yY21kKCkKK3sKKyAgICBpZiAoY21kX3NpbGVudCkKKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGlmIChjbWRtc2dfcmwpCisgICAgeworCW1zZ19yb3cgPSBjbWRsaW5lX3JvdyAgKyAoY2NsaW5lLmNtZHNwb3MgLyAoaW50KShDb2x1bW5zIC0gMSkpOworCW1zZ19jb2wgPSAoaW50KUNvbHVtbnMgLSAoY2NsaW5lLmNtZHNwb3MgJSAoaW50KShDb2x1bW5zIC0gMSkpIC0gMTsKKwlpZiAobXNnX3JvdyA8PSAwKQorCSAgICBtc2dfcm93ID0gUm93cyAtIDE7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwltc2dfcm93ID0gY21kbGluZV9yb3cgKyAoY2NsaW5lLmNtZHNwb3MgLyAoaW50KUNvbHVtbnMpOworCW1zZ19jb2wgPSBjY2xpbmUuY21kc3BvcyAlIChpbnQpQ29sdW1uczsKKwlpZiAobXNnX3JvdyA+PSBSb3dzKQorCSAgICBtc2dfcm93ID0gUm93cyAtIDE7CisgICAgfQorCisgICAgd2luZGdvdG8obXNnX3JvdywgbXNnX2NvbCk7CisjaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspCisgICAgcmVkcmF3Y21kX3ByZWVkaXQoKTsKKyNlbmRpZgorI2lmZGVmIE1DSF9DVVJTT1JfU0hBUEUKKyAgICBtY2hfdXBkYXRlX2N1cnNvcigpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitnb3RvY21kbGluZShjbHIpCisgICAgaW50CQkgICAgY2xyOworeworICAgIG1zZ19zdGFydCgpOworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgaWYgKGNtZG1zZ19ybCkKKwltc2dfY29sID0gQ29sdW1ucyAtIDE7CisgICAgZWxzZQorI2VuZGlmCisJbXNnX2NvbCA9IDA7CSAgICAvKiBhbHdheXMgc3RhcnQgaW4gY29sdW1uIDAgKi8KKyAgICBpZiAoY2xyKQkJICAgIC8qIGNsZWFyIHRoZSBib3R0b20gbGluZShzKSAqLworCW1zZ19jbHJfZW9zKCk7CSAgICAvKiB3aWxsIHJlc2V0IGNsZWFyX2NtZGxpbmUgKi8KKyAgICB3aW5kZ290byhjbWRsaW5lX3JvdywgMCk7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgd29yZCBpbiBmcm9udCBvZiB0aGUgY3Vyc29yIGZvciBhbiBhYmJyZXZpYXRpb24uCisgKiBDYWxsZWQgd2hlbiB0aGUgbm9uLWlkIGNoYXJhY3RlciAiYyIgaGFzIGJlZW4gZW50ZXJlZC4KKyAqIFdoZW4gYW4gYWJicmV2aWF0aW9uIGlzIHJlY29nbml6ZWQgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZXh0IHdpdGgKKyAqIGJhY2tzcGFjZXMgYW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgaW5zZXJ0ZWQsIGZvbGxvd2VkIGJ5ICJjIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NjaGVja19hYmJyKGMpCisgICAgaW50IGM7Cit7CisgICAgaWYgKHBfcGFzdGUgfHwgbm9fYWJicikJICAgIC8qIG5vIGFiYnJldmlhdGlvbnMgb3IgaW4gcGFzdGUgbW9kZSAqLworCXJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBjaGVja19hYmJyKGMsIGNjbGluZS5jbWRidWZmLCBjY2xpbmUuY21kcG9zLCAwKTsKK30KKworLyoKKyAqIFJldHVybiBGQUlMIGlmIHRoaXMgaXMgbm90IGFuIGFwcHJvcHJpYXRlIGNvbnRleHQgaW4gd2hpY2ggdG8gZG8KKyAqIGNvbXBsZXRpb24gb2YgYW55dGhpbmcsIHJldHVybiBPSyBpZiBpdCBpcyAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcykuCisgKiBGb3IgdGhlIGNhbGxlciwgdGhpcyBtZWFucyB0aGF0IHRoZSBjaGFyYWN0ZXIgaXMganVzdCBwYXNzZWQgdGhyb3VnaCBsaWtlIGEKKyAqIG5vcm1hbCBjaGFyYWN0ZXIgKGluc3RlYWQgb2YgYmVpbmcgZXhwYW5kZWQpLiAgVGhpcyBhbGxvd3MgOnMvXkleRCBldGMuCisgKi8KKyAgICBzdGF0aWMgaW50CituZXh0d2lsZCh4cCwgdHlwZSwgb3B0aW9ucykKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQl0eXBlOworICAgIGludAkJb3B0aW9uczsJLyogZXh0cmEgb3B0aW9ucyBmb3IgRXhwYW5kT25lKCkgKi8KK3sKKyAgICBpbnQJCWksIGo7CisgICAgY2hhcl91CSpwMTsKKyAgICBjaGFyX3UJKnAyOworICAgIGludAkJb2xkbGVuOworICAgIGludAkJZGlmZmxlbjsKKyAgICBpbnQJCXY7CisKKyAgICBpZiAoeHAtPnhwX251bWZpbGVzID09IC0xKQorICAgIHsKKwlzZXRfZXhwYW5kX2NvbnRleHQoeHApOworCWNtZF9zaG93dGFpbCA9IGV4cGFuZF9zaG93dGFpbCh4cCk7CisgICAgfQorCisgICAgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9VTlNVQ0NFU1NGVUwpCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm4gT0s7ICAvKiBTb21ldGhpbmcgaWxsZWdhbCBvbiBjb21tYW5kIGxpbmUgKi8KKyAgICB9CisgICAgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9OT1RISU5HKQorICAgIHsKKwkvKiBDYWxsZXIgY2FuIHVzZSB0aGUgY2hhcmFjdGVyIGFzIGEgbm9ybWFsIGNoYXIgaW5zdGVhZCAqLworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIE1TR19QVVRTKCIuLi4iKTsJICAgIC8qIHNob3cgdGhhdCB3ZSBhcmUgYnVzeSAqLworICAgIG91dF9mbHVzaCgpOworCisgICAgaSA9IChpbnQpKHhwLT54cF9wYXR0ZXJuIC0gY2NsaW5lLmNtZGJ1ZmYpOworICAgIG9sZGxlbiA9IGNjbGluZS5jbWRwb3MgLSBpOworCisgICAgaWYgKHR5cGUgPT0gV0lMRF9ORVhUIHx8IHR5cGUgPT0gV0lMRF9QUkVWKQorICAgIHsKKwkvKgorCSAqIEdldCBuZXh0L3ByZXZpb3VzIG1hdGNoIGZvciBhIHByZXZpb3VzIGV4cGFuZGVkIHBhdHRlcm4uCisJICovCisJcDIgPSBFeHBhbmRPbmUoeHAsIE5VTEwsIE5VTEwsIDAsIHR5cGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogVHJhbnNsYXRlIHN0cmluZyBpbnRvIHBhdHRlcm4gYW5kIGV4cGFuZCBpdC4KKwkgKi8KKwlpZiAoKHAxID0gYWRkc3RhcigmY2NsaW5lLmNtZGJ1ZmZbaV0sIG9sZGxlbiwgeHAtPnhwX2NvbnRleHQpKSA9PSBOVUxMKQorCSAgICBwMiA9IE5VTEw7CisJZWxzZQorCXsKKwkgICAgcDIgPSBFeHBhbmRPbmUoeHAsIHAxLCB2aW1fc3RybnNhdmUoJmNjbGluZS5jbWRidWZmW2ldLCBvbGRsZW4pLAorCQkgICAgV0lMRF9IT01FX1JFUExBQ0V8V0lMRF9BRERfU0xBU0h8V0lMRF9TSUxFTlR8V0lMRF9FU0NBUEUKKwkJCQkJCQkgICAgICB8b3B0aW9ucywgdHlwZSk7CisJICAgIHZpbV9mcmVlKHAxKTsKKwkgICAgLyogbG9uZ2VzdCBtYXRjaDogbWFrZSBzdXJlIGl0IGlzIG5vdCBzaG9ydGVyIChoYXBwZW5zIHdpdGggOmhlbHAgKi8KKwkgICAgaWYgKHAyICE9IE5VTEwgJiYgdHlwZSA9PSBXSUxEX0xPTkdFU1QpCisJICAgIHsKKwkJZm9yIChqID0gMDsgaiA8IG9sZGxlbjsgKytqKQorCQkgICAgIGlmIChjY2xpbmUuY21kYnVmZltpICsgal0gPT0gJyonCisJCQkgICAgIHx8IGNjbGluZS5jbWRidWZmW2kgKyBqXSA9PSAnPycpCisJCQkgYnJlYWs7CisJCWlmICgoaW50KVNUUkxFTihwMikgPCBqKQorCQl7CisJCSAgICB2aW1fZnJlZShwMik7CisJCSAgICBwMiA9IE5VTEw7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAocDIgIT0gTlVMTCAmJiAhZ290X2ludCkKKyAgICB7CisJZGlmZmxlbiA9IChpbnQpU1RSTEVOKHAyKSAtIG9sZGxlbjsKKwlpZiAoY2NsaW5lLmNtZGxlbiArIGRpZmZsZW4gPiBjY2xpbmUuY21kYnVmZmxlbiAtIDQpCisJeworCSAgICB2ID0gcmVhbGxvY19jbWRidWZmKGNjbGluZS5jbWRsZW4gKyBkaWZmbGVuKTsKKwkgICAgeHAtPnhwX3BhdHRlcm4gPSBjY2xpbmUuY21kYnVmZiArIGk7CisJfQorCWVsc2UKKwkgICAgdiA9IE9LOworCWlmICh2ID09IE9LKQorCXsKKwkgICAgdmltX3N0cm5jcHkoJmNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgKyBkaWZmbGVuXSwKKwkJCQkJICAgICAgICZjY2xpbmUuY21kYnVmZltjY2xpbmUuY21kcG9zXSwKKwkJICAgIGNjbGluZS5jbWRsZW4gLSBjY2xpbmUuY21kcG9zICsgMSk7CisJICAgIFNUUk5DUFkoJmNjbGluZS5jbWRidWZmW2ldLCBwMiwgU1RSTEVOKHAyKSk7CisJICAgIGNjbGluZS5jbWRsZW4gKz0gZGlmZmxlbjsKKwkgICAgY2NsaW5lLmNtZHBvcyArPSBkaWZmbGVuOworCX0KKyAgICB9CisgICAgdmltX2ZyZWUocDIpOworCisgICAgcmVkcmF3Y21kKCk7CisKKyAgICAvKiBXaGVuIGV4cGFuZGluZyBhICI6bWFwIiBjb21tYW5kIGFuZCBubyBtYXRjaGVzIGFyZSBmb3VuZCwgYXNzdW1lIHRoYXQKKyAgICAgKiB0aGUga2V5IGlzIHN1cHBvc2VkIHRvIGJlIGluc2VydGVkIGxpdGVyYWxseSAqLworICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfTUFQUElOR1MgJiYgcDIgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGlmICh4cC0+eHBfbnVtZmlsZXMgPD0gMCAmJiBwMiA9PSBOVUxMKQorCWJlZXBfZmx1c2goKTsKKyAgICBlbHNlIGlmICh4cC0+eHBfbnVtZmlsZXMgPT0gMSkKKwkvKiBmcmVlIGV4cGFuZGVkIHBhdHRlcm4gKi8KKwkodm9pZClFeHBhbmRPbmUoeHAsIE5VTEwsIE5VTEwsIDAsIFdJTERfRlJFRSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBEbyB3aWxkY2FyZCBleHBhbnNpb24gb24gdGhlIHN0cmluZyAnc3RyJy4KKyAqIENoYXJzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBhbmRlZCBtdXN0IGJlIHByZWNlZGVkIHdpdGggYSBiYWNrc2xhc2guCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGFsbG9jZWQgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIG5ldyBzdHJpbmcuCisgKiBSZXR1cm4gTlVMTCBmb3IgZmFpbHVyZS4KKyAqCisgKiBSZXN1bHRzIGFyZSBjYWNoZWQgaW4geHAtPnhwX2ZpbGVzIGFuZCB4cC0+eHBfbnVtZmlsZXMuCisgKgorICogbW9kZSA9IFdJTERfRlJFRToJICAgIGp1c3QgZnJlZSBwcmV2aW91c2x5IGV4cGFuZGVkIG1hdGNoZXMKKyAqIG1vZGUgPSBXSUxEX0VYUEFORF9GUkVFOiBub3JtYWwgZXhwYW5zaW9uLCBkbyBub3Qga2VlcCBtYXRjaGVzCisgKiBtb2RlID0gV0lMRF9FWFBBTkRfS0VFUDogbm9ybWFsIGV4cGFuc2lvbiwga2VlcCBtYXRjaGVzCisgKiBtb2RlID0gV0lMRF9ORVhUOgkgICAgdXNlIG5leHQgbWF0Y2ggaW4gbXVsdGlwbGUgbWF0Y2gsIHdyYXAgdG8gZmlyc3QKKyAqIG1vZGUgPSBXSUxEX1BSRVY6CSAgICB1c2UgcHJldmlvdXMgbWF0Y2ggaW4gbXVsdGlwbGUgbWF0Y2gsIHdyYXAgdG8gZmlyc3QKKyAqIG1vZGUgPSBXSUxEX0FMTDoJICAgIHJldHVybiBhbGwgbWF0Y2hlcyBjb25jYXRlbmF0ZWQKKyAqIG1vZGUgPSBXSUxEX0xPTkdFU1Q6CSAgICByZXR1cm4gbG9uZ2VzdCBtYXRjaGVkIHBhcnQKKyAqCisgKiBvcHRpb25zID0gV0lMRF9MSVNUX05PVEZPVU5EOiAgICBsaXN0IGVudHJpZXMgd2l0aG91dCBhIG1hdGNoCisgKiBvcHRpb25zID0gV0lMRF9IT01FX1JFUExBQ0U6CSAgICBkbyBob21lX3JlcGxhY2UoKSBmb3IgYnVmZmVyIG5hbWVzCisgKiBvcHRpb25zID0gV0lMRF9VU0VfTkw6CSAgICBVc2UgJ1xuJyBmb3IgV0lMRF9BTEwKKyAqIG9wdGlvbnMgPSBXSUxEX05PX0JFRVA6CSAgICBEb24ndCBiZWVwIGZvciBtdWx0aXBsZSBtYXRjaGVzCisgKiBvcHRpb25zID0gV0lMRF9BRERfU0xBU0g6CSAgICBhZGQgYSBzbGFzaCBhZnRlciBkaXJlY3RvcnkgbmFtZXMKKyAqIG9wdGlvbnMgPSBXSUxEX0tFRVBfQUxMOgkgICAgZG9uJ3QgcmVtb3ZlICd3aWxkaWdub3JlJyBlbnRyaWVzCisgKiBvcHRpb25zID0gV0lMRF9TSUxFTlQ6CSAgICBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2VzCisgKiBvcHRpb25zID0gV0lMRF9FU0NBUEU6CSAgICBwdXQgYmFja3NsYXNoIGJlZm9yZSBzcGVjaWFsIGNoYXJzCisgKgorICogVGhlIHZhcmlhYmxlcyB4cC0+eHBfY29udGV4dCBhbmQgeHAtPnhwX2JhY2tzbGFzaCBtdXN0IGhhdmUgYmVlbiBzZXQhCisgKi8KKyAgICBjaGFyX3UgKgorRXhwYW5kT25lKHhwLCBzdHIsIG9yaWcsIG9wdGlvbnMsIG1vZGUpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqc3RyOworICAgIGNoYXJfdQkqb3JpZzsJICAgIC8qIGFsbG9jYXRlZCBjb3B5IG9mIG9yaWdpbmFsIG9mIGV4cGFuZGVkIHN0cmluZyAqLworICAgIGludAkJb3B0aW9uczsKKyAgICBpbnQJCW1vZGU7Cit7CisgICAgY2hhcl91CSpzcyA9IE5VTEw7CisgICAgc3RhdGljIGludAlmaW5kZXg7CisgICAgc3RhdGljIGNoYXJfdSAqb3JpZ19zYXZlID0gTlVMTDsJLyoga2VwdCB2YWx1ZSBvZiBvcmlnICovCisgICAgaW50CQlpOworICAgIGxvbmdfdQlsZW47CisgICAgaW50CQlub25fc3VmX21hdGNoOwkJLyogbnVtYmVyIHdpdGhvdXQgbWF0Y2hpbmcgc3VmZml4ICovCisKKyAgICAvKgorICAgICAqIGZpcnN0IGhhbmRsZSB0aGUgY2FzZSBvZiB1c2luZyBhbiBvbGQgbWF0Y2gKKyAgICAgKi8KKyAgICBpZiAobW9kZSA9PSBXSUxEX05FWFQgfHwgbW9kZSA9PSBXSUxEX1BSRVYpCisgICAgeworCWlmICh4cC0+eHBfbnVtZmlsZXMgPiAwKQorCXsKKwkgICAgaWYgKG1vZGUgPT0gV0lMRF9QUkVWKQorCSAgICB7CisJCWlmIChmaW5kZXggPT0gLTEpCisJCSAgICBmaW5kZXggPSB4cC0+eHBfbnVtZmlsZXM7CisJCS0tZmluZGV4OworCSAgICB9CisJICAgIGVsc2UgICAgLyogbW9kZSA9PSBXSUxEX05FWFQgKi8KKwkJKytmaW5kZXg7CisKKwkgICAgLyoKKwkgICAgICogV2hlbiB3cmFwcGluZyBhcm91bmQsIHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nLCBzZXQgZmluZGV4IHRvCisJICAgICAqIC0xLgorCSAgICAgKi8KKwkgICAgaWYgKGZpbmRleCA8IDApCisJICAgIHsKKwkJaWYgKG9yaWdfc2F2ZSA9PSBOVUxMKQorCQkgICAgZmluZGV4ID0geHAtPnhwX251bWZpbGVzIC0gMTsKKwkJZWxzZQorCQkgICAgZmluZGV4ID0gLTE7CisJICAgIH0KKwkgICAgaWYgKGZpbmRleCA+PSB4cC0+eHBfbnVtZmlsZXMpCisJICAgIHsKKwkJaWYgKG9yaWdfc2F2ZSA9PSBOVUxMKQorCQkgICAgZmluZGV4ID0gMDsKKwkJZWxzZQorCQkgICAgZmluZGV4ID0gLTE7CisJICAgIH0KKyNpZmRlZiBGRUFUX1dJTERNRU5VCisJICAgIGlmIChwX3dtbnUpCisJCXdpbl9yZWRyX3N0YXR1c19tYXRjaGVzKHhwLCB4cC0+eHBfbnVtZmlsZXMsIHhwLT54cF9maWxlcywKKwkJCQkJCQlmaW5kZXgsIGNtZF9zaG93dGFpbCk7CisjZW5kaWYKKwkgICAgaWYgKGZpbmRleCA9PSAtMSkKKwkJcmV0dXJuIHZpbV9zdHJzYXZlKG9yaWdfc2F2ZSk7CisJICAgIHJldHVybiB2aW1fc3Ryc2F2ZSh4cC0+eHBfZmlsZXNbZmluZGV4XSk7CisJfQorCWVsc2UKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisvKiBmcmVlIG9sZCBuYW1lcyAqLworICAgIGlmICh4cC0+eHBfbnVtZmlsZXMgIT0gLTEgJiYgbW9kZSAhPSBXSUxEX0FMTCAmJiBtb2RlICE9IFdJTERfTE9OR0VTVCkKKyAgICB7CisJRnJlZVdpbGQoeHAtPnhwX251bWZpbGVzLCB4cC0+eHBfZmlsZXMpOworCXhwLT54cF9udW1maWxlcyA9IC0xOworCXZpbV9mcmVlKG9yaWdfc2F2ZSk7CisJb3JpZ19zYXZlID0gTlVMTDsKKyAgICB9CisgICAgZmluZGV4ID0gMDsKKworICAgIGlmIChtb2RlID09IFdJTERfRlJFRSkJLyogb25seSByZWxlYXNlIGZpbGUgbmFtZSAqLworCXJldHVybiBOVUxMOworCisgICAgaWYgKHhwLT54cF9udW1maWxlcyA9PSAtMSkKKyAgICB7CisJdmltX2ZyZWUob3JpZ19zYXZlKTsKKwlvcmlnX3NhdmUgPSBvcmlnOworCisJLyoKKwkgKiBEbyB0aGUgZXhwYW5zaW9uLgorCSAqLworCWlmIChFeHBhbmRGcm9tQ29udGV4dCh4cCwgc3RyLCAmeHAtPnhwX251bWZpbGVzLCAmeHAtPnhwX2ZpbGVzLAorCQkJCQkJCSAgICAgb3B0aW9ucykgPT0gRkFJTCkKKwl7CisjaWZkZWYgRk5BTUVfSUxMRUdBTAorCSAgICAvKiBJbGxlZ2FsIGZpbGUgbmFtZSBoYXMgYmVlbiBzaWxlbnRseSBza2lwcGVkLiAgQnV0IHdoZW4gdGhlcmUKKwkgICAgICogYXJlIHdpbGRjYXJkcywgdGhlIHJlYWwgcHJvYmxlbSBpcyB0aGF0IHRoZXJlIHdhcyBubyBtYXRjaCwKKwkgICAgICogY2F1c2luZyB0aGUgcGF0dGVybiB0byBiZSBhZGRlZCwgd2hpY2ggaGFzIGlsbGVnYWwgY2hhcmFjdGVycy4KKwkgICAgICovCisJICAgIGlmICghKG9wdGlvbnMgJiBXSUxEX1NJTEVOVCkgJiYgKG9wdGlvbnMgJiBXSUxEX0xJU1RfTk9URk9VTkQpKQorCQlFTVNHMihfKGVfbm9tYXRjaDIpLCBzdHIpOworI2VuZGlmCisJfQorCWVsc2UgaWYgKHhwLT54cF9udW1maWxlcyA9PSAwKQorCXsKKwkgICAgaWYgKCEob3B0aW9ucyAmIFdJTERfU0lMRU5UKSkKKwkJRU1TRzIoXyhlX25vbWF0Y2gyKSwgc3RyKTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogRXNjYXBlIHRoZSBtYXRjaGVzIGZvciB1c2Ugb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KKwkgICAgRXhwYW5kRXNjYXBlKHhwLCBzdHIsIHhwLT54cF9udW1maWxlcywgeHAtPnhwX2ZpbGVzLCBvcHRpb25zKTsKKworCSAgICAvKgorCSAgICAgKiBDaGVjayBmb3IgbWF0Y2hpbmcgc3VmZml4ZXMgaW4gZmlsZSBuYW1lcy4KKwkgICAgICovCisJICAgIGlmIChtb2RlICE9IFdJTERfQUxMICYmIG1vZGUgIT0gV0lMRF9MT05HRVNUKQorCSAgICB7CisJCWlmICh4cC0+eHBfbnVtZmlsZXMpCisJCSAgICBub25fc3VmX21hdGNoID0geHAtPnhwX251bWZpbGVzOworCQllbHNlCisJCSAgICBub25fc3VmX21hdGNoID0gMTsKKwkJaWYgKCh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfRklMRVMKKwkJCSAgICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfRElSRUNUT1JJRVMpCisJCQkmJiB4cC0+eHBfbnVtZmlsZXMgPiAxKQorCQl7CisJCSAgICAvKgorCQkgICAgICogTW9yZSB0aGFuIG9uZSBtYXRjaDsgY2hlY2sgc3VmZml4LgorCQkgICAgICogVGhlIGZpbGVzIHdpbGwgaGF2ZSBiZWVuIHNvcnRlZCBvbiBtYXRjaGluZyBzdWZmaXggaW4KKwkJICAgICAqIGV4cGFuZF93aWxkY2FyZHMsIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgZmlyc3QgdHdvLgorCQkgICAgICovCisJCSAgICBub25fc3VmX21hdGNoID0gMDsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisJCQlpZiAobWF0Y2hfc3VmZml4KHhwLT54cF9maWxlc1tpXSkpCisJCQkgICAgKytub25fc3VmX21hdGNoOworCQl9CisJCWlmIChub25fc3VmX21hdGNoICE9IDEpCisJCXsKKwkJICAgIC8qIENhbiB3ZSBldmVyIGdldCBoZXJlIHVubGVzcyBpdCdzIHdoaWxlIGV4cGFuZGluZworCQkgICAgICogaW50ZXJhY3RpdmVseT8gIElmIG5vdCwgd2UgY2FuIGdldCByaWQgb2YgdGhpcyBhbGwKKwkJICAgICAqIHRvZ2V0aGVyLiBEb24ndCByZWFsbHkgd2FudCB0byB3YWl0IGZvciB0aGlzIG1lc3NhZ2UKKwkJICAgICAqIChhbmQgcG9zc2libHkgaGF2ZSB0byBoaXQgcmV0dXJuIHRvIGNvbnRpbnVlISkuCisJCSAgICAgKi8KKwkJICAgIGlmICghKG9wdGlvbnMgJiBXSUxEX1NJTEVOVCkpCisJCQlFTVNHKF8oZV90b29tYW55KSk7CisJCSAgICBlbHNlIGlmICghKG9wdGlvbnMgJiBXSUxEX05PX0JFRVApKQorCQkJYmVlcF9mbHVzaCgpOworCQl9CisJCWlmICghKG5vbl9zdWZfbWF0Y2ggIT0gMSAmJiBtb2RlID09IFdJTERfRVhQQU5EX0ZSRUUpKQorCQkgICAgc3MgPSB2aW1fc3Ryc2F2ZSh4cC0+eHBfZmlsZXNbMF0pOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIEZpbmQgbG9uZ2VzdCBjb21tb24gcGFydCAqLworICAgIGlmIChtb2RlID09IFdJTERfTE9OR0VTVCAmJiB4cC0+eHBfbnVtZmlsZXMgPiAwKQorICAgIHsKKwlmb3IgKGxlbiA9IDA7IHhwLT54cF9maWxlc1swXVtsZW5dOyArK2xlbikKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCB4cC0+eHBfbnVtZmlsZXM7ICsraSkKKwkgICAgeworI2lmZGVmIENBU0VfSU5TRU5TSVRJVkVfRklMRU5BTUUKKwkJaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9ESVJFQ1RPUklFUworCQkJfHwgeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0ZJTEVTCisJCQl8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQlVGRkVSUykKKwkJeworCQkgICAgaWYgKFRPTE9XRVJfTE9DKHhwLT54cF9maWxlc1tpXVtsZW5dKSAhPQorCQkJCQkgICAgVE9MT1dFUl9MT0MoeHAtPnhwX2ZpbGVzWzBdW2xlbl0pKQorCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCSAgICAgaWYgKHhwLT54cF9maWxlc1tpXVtsZW5dICE9IHhwLT54cF9maWxlc1swXVtsZW5dKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGkgPCB4cC0+eHBfbnVtZmlsZXMpCisJICAgIHsKKwkJaWYgKCEob3B0aW9ucyAmIFdJTERfTk9fQkVFUCkpCisJCSAgICB2aW1fYmVlcCgpOworCQlicmVhazsKKwkgICAgfQorCX0KKwlzcyA9IGFsbG9jKCh1bnNpZ25lZClsZW4gKyAxKTsKKwlpZiAoc3MpCisJeworCSAgICBTVFJOQ1BZKHNzLCB4cC0+eHBfZmlsZXNbMF0sIGxlbik7CisJICAgIHNzW2xlbl0gPSBOVUw7CisJfQorCWZpbmRleCA9IC0xOwkJCSAgICAvKiBuZXh0IHBfd2MgZ2V0cyBmaXJzdCBvbmUgKi8KKyAgICB9CisKKyAgICAvKiBDb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgbmFtZXMgKi8KKyAgICBpZiAobW9kZSA9PSBXSUxEX0FMTCAmJiB4cC0+eHBfbnVtZmlsZXMgPiAwKQorICAgIHsKKwlsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCB4cC0+eHBfbnVtZmlsZXM7ICsraSkKKwkgICAgbGVuICs9IChsb25nX3UpU1RSTEVOKHhwLT54cF9maWxlc1tpXSkgKyAxOworCXNzID0gbGFsbG9jKGxlbiwgVFJVRSk7CisJaWYgKHNzICE9IE5VTEwpCisJeworCSAgICAqc3MgPSBOVUw7CisJICAgIGZvciAoaSA9IDA7IGkgPCB4cC0+eHBfbnVtZmlsZXM7ICsraSkKKwkgICAgeworCQlTVFJDQVQoc3MsIHhwLT54cF9maWxlc1tpXSk7CisJCWlmIChpICE9IHhwLT54cF9udW1maWxlcyAtIDEpCisJCSAgICBTVFJDQVQoc3MsIChvcHRpb25zICYgV0lMRF9VU0VfTkwpID8gIlxuIiA6ICIgIik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0gV0lMRF9FWFBBTkRfRlJFRSB8fCBtb2RlID09IFdJTERfQUxMKQorCUV4cGFuZENsZWFudXAoeHApOworCisgICAgcmV0dXJuIHNzOworfQorCisvKgorICogUHJlcGFyZSBhbiBleHBhbmQgc3RydWN0dXJlIGZvciB1c2UuCisgKi8KKyAgICB2b2lkCitFeHBhbmRJbml0KHhwKQorICAgIGV4cGFuZF9UCSp4cDsKK3sKKyAgICB4cC0+eHBfYmFja3NsYXNoID0gWFBfQlNfTk9ORTsKKyAgICB4cC0+eHBfbnVtZmlsZXMgPSAtMTsKKyAgICB4cC0+eHBfZmlsZXMgPSBOVUxMOworfQorCisvKgorICogQ2xlYW51cCBhbiBleHBhbmQgc3RydWN0dXJlIGFmdGVyIHVzZS4KKyAqLworICAgIHZvaWQKK0V4cGFuZENsZWFudXAoeHApCisgICAgZXhwYW5kX1QJKnhwOworeworICAgIGlmICh4cC0+eHBfbnVtZmlsZXMgPj0gMCkKKyAgICB7CisJRnJlZVdpbGQoeHAtPnhwX251bWZpbGVzLCB4cC0+eHBfZmlsZXMpOworCXhwLT54cF9udW1maWxlcyA9IC0xOworICAgIH0KK30KKworICAgIHZvaWQKK0V4cGFuZEVzY2FwZSh4cCwgc3RyLCBudW1maWxlcywgZmlsZXMsIG9wdGlvbnMpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJbnVtZmlsZXM7CisgICAgY2hhcl91CSoqZmlsZXM7CisgICAgaW50CQlvcHRpb25zOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKgorICAgICAqIE1heSBjaGFuZ2UgaG9tZSBkaXJlY3RvcnkgYmFjayB0byAifiIKKyAgICAgKi8KKyAgICBpZiAob3B0aW9ucyAmIFdJTERfSE9NRV9SRVBMQUNFKQorCXRpbGRlX3JlcGxhY2Uoc3RyLCBudW1maWxlcywgZmlsZXMpOworCisgICAgaWYgKG9wdGlvbnMgJiBXSUxEX0VTQ0FQRSkKKyAgICB7CisJaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9GSUxFUworCQl8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQlVGRkVSUworCQl8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfRElSRUNUT1JJRVMpCisJeworCSAgICAvKgorCSAgICAgKiBJbnNlcnQgYSBiYWNrc2xhc2ggaW50byBhIGZpbGUgbmFtZSBiZWZvcmUgYSBzcGFjZSwgXCwgJSwgIworCSAgICAgKiBhbmQgd2lsZG1hdGNoIGNoYXJhY3RlcnMsIGV4Y2VwdCAnficuCisJICAgICAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtZmlsZXM7ICsraSkKKwkgICAgeworCQkvKiBmb3IgIjpzZXQgcGF0aD0iIHdlIG5lZWQgdG8gZXNjYXBlIHNwYWNlcyB0d2ljZSAqLworCQlpZiAoeHAtPnhwX2JhY2tzbGFzaCA9PSBYUF9CU19USFJFRSkKKwkJeworCQkgICAgcCA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoZmlsZXNbaV0sIChjaGFyX3UgKikiICIpOworCQkgICAgaWYgKHAgIT0gTlVMTCkKKwkJICAgIHsKKwkJCXZpbV9mcmVlKGZpbGVzW2ldKTsKKwkJCWZpbGVzW2ldID0gcDsKKyNpZiBkZWZpbmVkKEJBQ0tTTEFTSF9JTl9GSUxFTkFNRSkgfHwgZGVmaW5lZChDT0xPTl9BU19QQVRIU0VQKQorCQkJcCA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoZmlsZXNbaV0sIChjaGFyX3UgKikiICIpOworCQkJaWYgKHAgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICB2aW1fZnJlZShmaWxlc1tpXSk7CisJCQkgICAgZmlsZXNbaV0gPSBwOworCQkJfQorI2VuZGlmCisJCSAgICB9CisJCX0KKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJeworCQkgICAgY2hhcl91CWJ1ZlsyMF07CisJCSAgICBpbnQJCWogPSAwOworCisJCSAgICAvKiBEb24ndCBlc2NhcGUgJ1snIGFuZCAneycgaWYgdGhleSBhcmUgaW4gJ2lzZm5hbWUnLiAqLworCQkgICAgZm9yIChwID0gUEFUSF9FU0NfQ0hBUlM7ICpwICE9IE5VTDsgKytwKQorCQkJaWYgKCgqcCAhPSAnWycgJiYgKnAgIT0gJ3snKSB8fCAhdmltX2lzZmlsZWMoKnApKQorCQkJICAgIGJ1ZltqKytdID0gKnA7CisJCSAgICBidWZbal0gPSBOVUw7CisJCSAgICBwID0gdmltX3N0cnNhdmVfZXNjYXBlZChmaWxlc1tpXSwgYnVmKTsKKwkJfQorI2Vsc2UKKwkJcCA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoZmlsZXNbaV0sIFBBVEhfRVNDX0NIQVJTKTsKKyNlbmRpZgorCQlpZiAocCAhPSBOVUxMKQorCQl7CisJCSAgICB2aW1fZnJlZShmaWxlc1tpXSk7CisJCSAgICBmaWxlc1tpXSA9IHA7CisJCX0KKworCQkvKiBJZiAnc3RyJyBzdGFydHMgd2l0aCAiXH4iLCByZXBsYWNlICJ+IiBhdCBzdGFydCBvZgorCQkgKiBmaWxlc1tpXSB3aXRoICJcfiIuICovCisJCWlmIChzdHJbMF0gPT0gJ1xcJyAmJiBzdHJbMV0gPT0gJ34nICYmIGZpbGVzW2ldWzBdID09ICd+JykKKwkJeworCQkgICAgcCA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGZpbGVzW2ldKSArIDIpKTsKKwkJICAgIGlmIChwICE9IE5VTEwpCisJCSAgICB7CisJCQlwWzBdID0gJ1xcJzsKKwkJCVNUUkNQWShwICsgMSwgZmlsZXNbaV0pOworCQkJdmltX2ZyZWUoZmlsZXNbaV0pOworCQkJZmlsZXNbaV0gPSBwOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgeHAtPnhwX2JhY2tzbGFzaCA9IFhQX0JTX05PTkU7CisJfQorCWVsc2UgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9UQUdTKQorCXsKKwkgICAgLyoKKwkgICAgICogSW5zZXJ0IGEgYmFja3NsYXNoIGJlZm9yZSBjaGFyYWN0ZXJzIGluIGEgdGFnIG5hbWUgdGhhdAorCSAgICAgKiB3b3VsZCB0ZXJtaW5hdGUgdGhlICI6dGFnIiBjb21tYW5kLgorCSAgICAgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IG51bWZpbGVzOyArK2kpCisJICAgIHsKKwkJcCA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoZmlsZXNbaV0sIChjaGFyX3UgKikiXFx8XCIiKTsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJeworCQkgICAgdmltX2ZyZWUoZmlsZXNbaV0pOworCQkgICAgZmlsZXNbaV0gPSBwOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgorICogRm9yIGVhY2ggZmlsZSBuYW1lIGluIGZpbGVzW251bV9maWxlc106CisgKiBJZiAnb3JpZ19wYXQnIHN0YXJ0cyB3aXRoICJ+LyIsIHJlcGxhY2UgdGhlIGhvbWUgZGlyZWN0b3J5IHdpdGggIn4iLgorICovCisgICAgdm9pZAordGlsZGVfcmVwbGFjZShvcmlnX3BhdCwgbnVtX2ZpbGVzLCBmaWxlcykKKyAgICBjaGFyX3UgICpvcmlnX3BhdDsKKyAgICBpbnQJICAgIG51bV9maWxlczsKKyAgICBjaGFyX3UgICoqZmlsZXM7Cit7CisgICAgaW50CSAgICBpOworICAgIGNoYXJfdSAgKnA7CisKKyAgICBpZiAob3JpZ19wYXRbMF0gPT0gJ34nICYmIHZpbV9pc3BhdGhzZXAob3JpZ19wYXRbMV0pKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpbGVzOyArK2kpCisJeworCSAgICBwID0gaG9tZV9yZXBsYWNlX3NhdmUoTlVMTCwgZmlsZXNbaV0pOworCSAgICBpZiAocCAhPSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKGZpbGVzW2ldKTsKKwkJZmlsZXNbaV0gPSBwOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIFNob3cgYWxsIG1hdGNoZXMgZm9yIGNvbXBsZXRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqIFJldHVybnMgRVhQQU5EX05PVEhJTkcgd2hlbiB0aGUgY2hhcmFjdGVyIHRoYXQgdHJpZ2dlcmVkIGV4cGFuc2lvbiBzaG91bGQKKyAqIGJlIGluc2VydGVkIGxpa2UgYSBub3JtYWwgY2hhcmFjdGVyLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgaW50CitzaG93bWF0Y2hlcyh4cCwgd2lsZG1lbnUpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJd2lsZG1lbnU7Cit7CisjZGVmaW5lIExfU0hPV0ZJTEUobSkgKHNob3d0YWlsID8gc21fZ2V0dGFpbChmaWxlc19mb3VuZFttXSkgOiBmaWxlc19mb3VuZFttXSkKKyAgICBpbnQJCW51bV9maWxlczsKKyAgICBjaGFyX3UJKipmaWxlc19mb3VuZDsKKyAgICBpbnQJCWksIGosIGs7CisgICAgaW50CQltYXhsZW47CisgICAgaW50CQlsaW5lczsKKyAgICBpbnQJCWNvbHVtbnM7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGFzdGxlbjsKKyAgICBpbnQJCWF0dHI7CisgICAgaW50CQlzaG93dGFpbDsKKworICAgIGlmICh4cC0+eHBfbnVtZmlsZXMgPT0gLTEpCisgICAgeworCXNldF9leHBhbmRfY29udGV4dCh4cCk7CisJaSA9IGV4cGFuZF9jbWRsaW5lKHhwLCBjY2xpbmUuY21kYnVmZiwgY2NsaW5lLmNtZHBvcywKKwkJCQkJCSAgICAmbnVtX2ZpbGVzLCAmZmlsZXNfZm91bmQpOworCXNob3d0YWlsID0gZXhwYW5kX3Nob3d0YWlsKHhwKTsKKwlpZiAoaSAhPSBFWFBBTkRfT0spCisJICAgIHJldHVybiBpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbnVtX2ZpbGVzID0geHAtPnhwX251bWZpbGVzOworCWZpbGVzX2ZvdW5kID0geHAtPnhwX2ZpbGVzOworCXNob3d0YWlsID0gY21kX3Nob3d0YWlsOworICAgIH0KKworI2lmZGVmIEZFQVRfV0lMRE1FTlUKKyAgICBpZiAoIXdpbGRtZW51KQorICAgIHsKKyNlbmRpZgorCW1zZ19kaWRhbnkgPSBGQUxTRTsJCS8qIGxpbmVzX2xlZnQgd2lsbCBiZSBzZXQgKi8KKwltc2dfc3RhcnQoKTsJCQkvKiBwcmVwYXJlIGZvciBwYWdpbmcgKi8KKwltc2dfcHV0Y2hhcignXG4nKTsKKwlvdXRfZmx1c2goKTsKKwljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJbXNnX2RpZGFueSA9IEZBTFNFOwkJLyogbGluZXNfbGVmdCB3aWxsIGJlIHNldCBhZ2FpbiAqLworCW1zZ19zdGFydCgpOwkJCS8qIHByZXBhcmUgZm9yIHBhZ2luZyAqLworI2lmZGVmIEZFQVRfV0lMRE1FTlUKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChnb3RfaW50KQorCWdvdF9pbnQgPSBGQUxTRTsJLyogb25seSBpbnQuIHRoZSBjb21wbGV0aW9uLCBub3QgdGhlIGNtZCBsaW5lICovCisjaWZkZWYgRkVBVF9XSUxETUVOVQorICAgIGVsc2UgaWYgKHdpbGRtZW51KQorCXdpbl9yZWRyX3N0YXR1c19tYXRjaGVzKHhwLCBudW1fZmlsZXMsIGZpbGVzX2ZvdW5kLCAwLCBzaG93dGFpbCk7CisjZW5kaWYKKyAgICBlbHNlCisgICAgeworCS8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBmaWxlIG5hbWUgKi8KKwltYXhsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fZmlsZXM7ICsraSkKKwl7CisJICAgIGlmICghc2hvd3RhaWwgJiYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9GSUxFUworCQkJICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQlVGRkVSUykpCisJICAgIHsKKwkJaG9tZV9yZXBsYWNlKE5VTEwsIGZpbGVzX2ZvdW5kW2ldLCBOYW1lQnVmZiwgTUFYUEFUSEwsIFRSVUUpOworCQlqID0gdmltX3N0cnNpemUoTmFtZUJ1ZmYpOworCSAgICB9CisJICAgIGVsc2UKKwkJaiA9IHZpbV9zdHJzaXplKExfU0hPV0ZJTEUoaSkpOworCSAgICBpZiAoaiA+IG1heGxlbikKKwkJbWF4bGVuID0gajsKKwl9CisKKwlpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX1RBR1NfTElTVEZJTEVTKQorCSAgICBsaW5lcyA9IG51bV9maWxlczsKKwllbHNlCisJeworCSAgICAvKiBjb21wdXRlIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgbGluZXMgZm9yIHRoZSBsaXN0aW5nICovCisJICAgIG1heGxlbiArPSAyOyAgICAvKiB0d28gc3BhY2VzIGJldHdlZW4gZmlsZSBuYW1lcyAqLworCSAgICBjb2x1bW5zID0gKChpbnQpQ29sdW1ucyArIDIpIC8gbWF4bGVuOworCSAgICBpZiAoY29sdW1ucyA8IDEpCisJCWNvbHVtbnMgPSAxOworCSAgICBsaW5lcyA9IChudW1fZmlsZXMgKyBjb2x1bW5zIC0gMSkgLyBjb2x1bW5zOworCX0KKworCWF0dHIgPSBobF9hdHRyKEhMRl9EKTsJLyogZmluZCBvdXQgaGlnaGxpZ2h0aW5nIGZvciBkaXJlY3RvcmllcyAqLworCisJaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9UQUdTX0xJU1RGSUxFUykKKwl7CisJICAgIE1TR19QVVRTX0FUVFIoXygidGFnbmFtZSIpLCBobF9hdHRyKEhMRl9UKSk7CisJICAgIG1zZ19jbHJfZW9zKCk7CisJICAgIG1zZ19hZHZhbmNlKG1heGxlbiAtIDMpOworCSAgICBNU0dfUFVUU19BVFRSKF8oIiBraW5kIGZpbGVcbiIpLCBobF9hdHRyKEhMRl9UKSk7CisJfQorCisJLyogbGlzdCB0aGUgZmlsZXMgbGluZSBieSBsaW5lICovCisJZm9yIChpID0gMDsgaSA8IGxpbmVzOyArK2kpCisJeworCSAgICBsYXN0bGVuID0gOTk5OworCSAgICBmb3IgKGsgPSBpOyBrIDwgbnVtX2ZpbGVzOyBrICs9IGxpbmVzKQorCSAgICB7CisJCWlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfVEFHU19MSVNURklMRVMpCisJCXsKKwkJICAgIG1zZ19vdXR0cmFuc19hdHRyKGZpbGVzX2ZvdW5kW2tdLCBobF9hdHRyKEhMRl9EKSk7CisJCSAgICBwID0gZmlsZXNfZm91bmRba10gKyBTVFJMRU4oZmlsZXNfZm91bmRba10pICsgMTsKKwkJICAgIG1zZ19hZHZhbmNlKG1heGxlbiArIDEpOworCQkgICAgbXNnX3B1dHMocCk7CisJCSAgICBtc2dfYWR2YW5jZShtYXhsZW4gKyAzKTsKKwkJICAgIG1zZ19wdXRzX2xvbmdfYXR0cihwICsgMiwgaGxfYXR0cihITEZfRCkpOworCQkgICAgYnJlYWs7CisJCX0KKwkJZm9yIChqID0gbWF4bGVuIC0gbGFzdGxlbjsgLS1qID49IDA7ICkKKwkJICAgIG1zZ19wdXRjaGFyKCcgJyk7CisJCWlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfRklMRVMKKwkJCQkJICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQlVGRkVSUykKKwkJeworCQkJICAgIC8qIGhpZ2hsaWdodCBkaXJlY3RvcmllcyAqLworCQkgICAgaiA9IChtY2hfaXNkaXIoZmlsZXNfZm91bmRba10pKTsKKwkJICAgIGlmIChzaG93dGFpbCkKKwkJCXAgPSBMX1NIT1dGSUxFKGspOworCQkgICAgZWxzZQorCQkgICAgeworCQkJaG9tZV9yZXBsYWNlKE5VTEwsIGZpbGVzX2ZvdW5kW2tdLCBOYW1lQnVmZiwgTUFYUEFUSEwsCisJCQkJCQkJCQlUUlVFKTsKKwkJCXAgPSBOYW1lQnVmZjsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGogPSBGQUxTRTsKKwkJICAgIHAgPSBMX1NIT1dGSUxFKGspOworCQl9CisJCWxhc3RsZW4gPSBtc2dfb3V0dHJhbnNfYXR0cihwLCBqID8gYXR0ciA6IDApOworCSAgICB9CisJICAgIGlmIChtc2dfY29sID4gMCkJLyogd2hlbiBub3Qgd3JhcHBlZCBhcm91bmQgKi8KKwkgICAgeworCQltc2dfY2xyX2VvcygpOworCQltc2dfcHV0Y2hhcignXG4nKTsKKwkgICAgfQorCSAgICBvdXRfZmx1c2goKTsJCSAgICAvKiBzaG93IG9uZSBsaW5lIGF0IGEgdGltZSAqLworCSAgICBpZiAoZ290X2ludCkKKwkgICAgeworCQlnb3RfaW50ID0gRkFMU0U7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJLyoKKwkgKiB3ZSByZWRyYXcgdGhlIGNvbW1hbmQgYmVsb3cgdGhlIGxpbmVzIHRoYXQgd2UgaGF2ZSBqdXN0IGxpc3RlZAorCSAqIFRoaXMgaXMgYSBiaXQgdHJpY2t5LCBidXQgaXQgc2F2ZXMgYSBsb3Qgb2Ygc2NyZWVuIHVwZGF0aW5nLgorCSAqLworCWNtZGxpbmVfcm93ID0gbXNnX3JvdzsJLyogd2lsbCBwdXQgaXQgYmFjayBsYXRlciAqLworICAgIH0KKworICAgIGlmICh4cC0+eHBfbnVtZmlsZXMgPT0gLTEpCisJRnJlZVdpbGQobnVtX2ZpbGVzLCBmaWxlc19mb3VuZCk7CisKKyAgICByZXR1cm4gRVhQQU5EX09LOworfQorCisvKgorICogUHJpdmF0ZSBnZXR0YWlsIGZvciBzaG93bWF0Y2hlcygpIChhbmQgd2luX3JlZHJfc3RhdHVzX21hdGNoZXMoKSk6CisgKiBGaW5kIHRhaWwgb2YgZmlsZSBuYW1lIHBhdGgsIGJ1dCBpZ25vcmUgdHJhaWxpbmcgIi8iLgorICovCisgICAgY2hhcl91ICoKK3NtX2dldHRhaWwocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqdCA9IHM7CisgICAgaW50CQloYWRfc2VwID0gRkFMU0U7CisKKyAgICBmb3IgKHAgPSBzOyAqcCAhPSBOVUw7ICkKKyAgICB7CisJaWYgKHZpbV9pc3BhdGhzZXAoKnApCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJCSYmICFyZW1fYmFja3NsYXNoKHApCisjZW5kaWYKKwkgICApCisJICAgIGhhZF9zZXAgPSBUUlVFOworCWVsc2UgaWYgKGhhZF9zZXApCisJeworCSAgICB0ID0gcDsKKwkgICAgaGFkX3NlcCA9IEZBTFNFOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCWVsc2UKKyNlbmRpZgorCSAgICArK3A7CisgICAgfQorICAgIHJldHVybiB0OworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgd2Ugb25seSBuZWVkIHRvIHNob3cgdGhlIHRhaWwgb2YgY29tcGxldGlvbiBtYXRjaGVzLgorICogV2hlbiBub3QgY29tcGxldGluZyBmaWxlIG5hbWVzIG9yIHRoZXJlIGlzIGEgd2lsZGNhcmQgaW4gdGhlIHBhdGggRkFMU0UgaXMKKyAqIHJldHVybmVkLgorICovCisgICAgc3RhdGljIGludAorZXhwYW5kX3Nob3d0YWlsKHhwKQorICAgIGV4cGFuZF9UCSp4cDsKK3sKKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CSplbmQ7CisKKyAgICAvKiBXaGVuIG5vdCBjb21wbGV0aW5nIGZpbGUgbmFtZXMgYSAiLyIgbWF5IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudC4gKi8KKyAgICBpZiAoeHAtPnhwX2NvbnRleHQgIT0gRVhQQU5EX0ZJTEVTICYmIHhwLT54cF9jb250ZXh0ICE9IEVYUEFORF9ESVJFQ1RPUklFUykKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBlbmQgPSBnZXR0YWlsKHhwLT54cF9wYXR0ZXJuKTsKKyAgICBpZiAoZW5kID09IHhwLT54cF9wYXR0ZXJuKQkJLyogdGhlcmUgaXMgbm8gcGF0aCBzZXBhcmF0b3IgKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKHMgPSB4cC0+eHBfcGF0dGVybjsgcyA8IGVuZDsgcysrKQorICAgIHsKKwkvKiBTa2lwIGVzY2FwZWQgd2lsZGNhcmRzLiAgT25seSB3aGVuIHRoZSBiYWNrc2xhc2ggaXMgbm90IGEgcGF0aAorCSAqIHNlcGFyYXRvciwgb24gRE9TIHRoZSAnKicgInBhdGhcKlxmaWxlIiBtdXN0IG5vdCBiZSBza2lwcGVkLiAqLworCWlmIChyZW1fYmFja3NsYXNoKHMpKQorCSAgICArK3M7CisJZWxzZSBpZiAodmltX3N0cmNocigoY2hhcl91ICopIio/WyIsICpzKSAhPSBOVUxMKQorCSAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogUHJlcGFyZSBhIHN0cmluZyBmb3IgZXhwYW5zaW9uLgorICogV2hlbiBleHBhbmRpbmcgZmlsZSBuYW1lczogVGhlIHN0cmluZyB3aWxsIGJlIHVzZWQgd2l0aCBleHBhbmRfd2lsZGNhcmRzKCkuCisgKiBDb3B5IHRoZSBmaWxlIG5hbWUgaW50byBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBhZGQgYSAnKicgYXQgdGhlIGVuZC4KKyAqIFdoZW4gZXhwYW5kaW5nIG90aGVyIG5hbWVzOiBUaGUgc3RyaW5nIHdpbGwgYmUgdXNlZCB3aXRoIHJlZ2NvbXAoKS4gIENvcHkKKyAqIHRoZSBuYW1lIGludG8gYWxsb2NhdGVkIG1lbW9yeSBhbmQgcHJlcGVuZCAiXiIuCisgKi8KKyAgICBjaGFyX3UgKgorYWRkc3RhcihmbmFtZSwgbGVuLCBjb250ZXh0KQorICAgIGNoYXJfdQkqZm5hbWU7CisgICAgaW50CQlsZW47CisgICAgaW50CQljb250ZXh0OwkvKiBFWFBBTkRfRklMRVMgZXRjLiAqLworeworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIGludAkJaSwgajsKKyAgICBpbnQJCW5ld19sZW47CisgICAgY2hhcl91CSp0YWlsOworCisgICAgaWYgKGNvbnRleHQgIT0gRVhQQU5EX0ZJTEVTICYmIGNvbnRleHQgIT0gRVhQQU5EX0RJUkVDVE9SSUVTKQorICAgIHsKKwkvKgorCSAqIE1hdGNoaW5nIHdpbGwgYmUgZG9uZSBpbnRlcm5hbGx5IChvbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBmaWxlcykuCisJICogU28gd2UgY29udmVydCB0aGUgZmlsZS1tYXRjaGluZy10eXBlIHdpbGRjYXJkcyBpbnRvIG91ciBraW5kIGZvcgorCSAqIHVzZSB3aXRoIHZpbV9yZWdjb21wKCkuICBGaXJzdCB3b3JrIG91dCBob3cgbG9uZyBpdCB3aWxsIGJlOgorCSAqLworCisJLyogRm9yIGhlbHAgdGFncyB0aGUgdHJhbnNsYXRpb24gaXMgZG9uZSBpbiBmaW5kX2hlbHBfdGFncygpLgorCSAqIEZvciBhIHRhZyBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGggIi8iIG5vIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4gKi8KKwlpZiAoY29udGV4dCA9PSBFWFBBTkRfSEVMUAorCQl8fCBjb250ZXh0ID09IEVYUEFORF9DT0xPUlMKKwkJfHwgY29udGV4dCA9PSBFWFBBTkRfQ09NUElMRVIKKwkJfHwgKGNvbnRleHQgPT0gRVhQQU5EX1RBR1MgJiYgZm5hbWVbMF0gPT0gJy8nKSkKKwkgICAgcmV0dmFsID0gdmltX3N0cm5zYXZlKGZuYW1lLCBsZW4pOworCWVsc2UKKwl7CisJICAgIG5ld19sZW4gPSBsZW4gKyAyOwkJLyogKzIgZm9yICdeJyBhdCBzdGFydCwgTlVMIGF0IGVuZCAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIHsKKwkJaWYgKGZuYW1lW2ldID09ICcqJyB8fCBmbmFtZVtpXSA9PSAnficpCisJCSAgICBuZXdfbGVuKys7CQkvKiAnKicgbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgIi4qIgorCQkJCQkgICAnficgbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgIlx+IiAqLworCisJCS8qIEJ1ZmZlciBuYW1lcyBhcmUgbGlrZSBmaWxlIG5hbWVzLiAgIi4iIHNob3VsZCBiZSBsaXRlcmFsICovCisJCWlmIChjb250ZXh0ID09IEVYUEFORF9CVUZGRVJTICYmIGZuYW1lW2ldID09ICcuJykKKwkJICAgIG5ld19sZW4rKzsJCS8qICIuIiBiZWNvbWVzICJcLiIgKi8KKworCQkvKiBDdXN0b20gZXhwYW5zaW9uIHRha2VzIGNhcmUgb2Ygc3BlY2lhbCB0aGluZ3MsIG1hdGNoCisJCSAqIGJhY2tzbGFzaGVzIGxpdGVyYWxseSAocGVyaGFwcyBhbHNvIGZvciBvdGhlciB0eXBlcz8pICovCisJCWlmIChjb250ZXh0ID09IEVYUEFORF9VU0VSX0RFRklORUQgJiYgZm5hbWVbaV0gPT0gJ1xcJykKKwkJICAgIG5ld19sZW4rKzsJCS8qICdcJyBiZWNvbWVzICJcXCIgKi8KKwkgICAgfQorCSAgICByZXR2YWwgPSBhbGxvYyhuZXdfbGVuKTsKKwkgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJCXJldHZhbFswXSA9ICdeJzsKKwkJaiA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgaisrKQorCQl7CisJCSAgICAvKiBTa2lwIGJhY2tzbGFzaC4gIEJ1dCB3aHk/ICBBdCBsZWFzdCBrZWVwIGl0IGZvciBjdXN0b20KKwkJICAgICAqIGV4cGFuc2lvbi4gKi8KKwkJICAgIGlmIChjb250ZXh0ICE9IEVYUEFORF9VU0VSX0RFRklORUQKKwkJCQkJICAgICYmIGZuYW1lW2ldID09ICdcXCcgJiYgKytpID09IGxlbikKKwkJCWJyZWFrOworCisJCSAgICBzd2l0Y2ggKGZuYW1lW2ldKQorCQkgICAgeworCQkJY2FzZSAnKic6ICAgcmV0dmFsW2orK10gPSAnLic7CisJCQkJICAgIGJyZWFrOworCQkJY2FzZSAnfic6ICAgcmV0dmFsW2orK10gPSAnXFwnOworCQkJCSAgICBicmVhazsKKwkJCWNhc2UgJz8nOiAgIHJldHZhbFtqXSA9ICcuJzsKKwkJCQkgICAgY29udGludWU7CisJCQljYXNlICcuJzogICBpZiAoY29udGV4dCA9PSBFWFBBTkRfQlVGRkVSUykKKwkJCQkJcmV0dmFsW2orK10gPSAnXFwnOworCQkJCSAgICBicmVhazsKKwkJCWNhc2UgJ1xcJzogIGlmIChjb250ZXh0ID09IEVYUEFORF9VU0VSX0RFRklORUQpCisJCQkJCXJldHZhbFtqKytdID0gJ1xcJzsKKwkJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCSAgICByZXR2YWxbal0gPSBmbmFtZVtpXTsKKwkJfQorCQlyZXR2YWxbal0gPSBOVUw7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmV0dmFsID0gYWxsb2MobGVuICsgNCk7CisJaWYgKHJldHZhbCAhPSBOVUxMKQorCXsKKwkgICAgU1RSTkNQWShyZXR2YWwsIGZuYW1lLCBsZW4pOworCSAgICByZXR2YWxbbGVuXSA9IE5VTDsKKworCSAgICAvKgorCSAgICAgKiBEb24ndCBhZGQgYSBzdGFyIHRvIH4sIH51c2VyLCAkdmFyIG9yIGBjbWRgLgorCSAgICAgKiB+IHdvdWxkIGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSBuYW1lLCBidXQgbm90IHRoZSB0YWlsLgorCSAgICAgKiAkIGNvdWxkIGJlIGFueXdoZXJlIGluIHRoZSB0YWlsLgorCSAgICAgKiBgIGNvdWxkIGJlIGFueXdoZXJlIGluIHRoZSBmaWxlIG5hbWUuCisJICAgICAqLworCSAgICB0YWlsID0gZ2V0dGFpbChyZXR2YWwpOworCSAgICBpZiAoKCpyZXR2YWwgIT0gJ34nIHx8IHRhaWwgIT0gcmV0dmFsKQorCQkgICAgJiYgdmltX3N0cmNocih0YWlsLCAnJCcpID09IE5VTEwKKwkJICAgICYmIHZpbV9zdHJjaHIocmV0dmFsLCAnYCcpID09IE5VTEwpCisJCXJldHZhbFtsZW4rK10gPSAnKic7CisJICAgIHJldHZhbFtsZW5dID0gTlVMOworCX0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIE11c3QgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBzbyBmYXIgdG8gd29yayBvdXQgd2hhdCBjb250ZXh0IHdlIGFyZSBpbi4KKyAqIENvbXBsZXRpb24gY2FuIHRoZW4gYmUgZG9uZSBiYXNlZCBvbiB0aGF0IGNvbnRleHQuCisgKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFyaWFibGVzOgorICogIHhwLT54cF9wYXR0ZXJuCSAgICBUaGUgc3RhcnQgb2YgdGhlIHBhdHRlcm4gdG8gYmUgZXhwYW5kZWQgd2l0aGluCisgKgkJCQl0aGUgY29tbWFuZCBsaW5lIChlbmRzIGF0IHRoZSBjdXJzb3IpLgorICogIHhwLT54cF9jb250ZXh0CSAgICBUaGUgdHlwZSBvZiB0aGluZyB0byBleHBhbmQuICBXaWxsIGJlIG9uZSBvZjoKKyAqCisgKiAgRVhQQU5EX1VOU1VDQ0VTU0ZVTAkgICAgVXNlZCBzb21ldGltZXMgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgaWxsZWdhbCBvbgorICoJCQkgICAgdGhlIGNvbW1hbmQgbGluZSwgbGlrZSBhbiB1bmtub3duIGNvbW1hbmQuCUNhbGxlcgorICoJCQkgICAgc2hvdWxkIGJlZXAuCisgKiAgRVhQQU5EX05PVEhJTkcJICAgIFVucmVjb2duaXNlZCBjb250ZXh0IGZvciBjb21wbGV0aW9uLCB1c2UgY2hhciBsaWtlCisgKgkJCSAgICBhIG5vcm1hbCBjaGFyLCByYXRoZXIgdGhhbiBmb3IgY29tcGxldGlvbi4JZWcKKyAqCQkJICAgIDpzL15JLworICogIEVYUEFORF9DT01NQU5EUwkgICAgQ3Vyc29yIGlzIHN0aWxsIHRvdWNoaW5nIHRoZSBjb21tYW5kLCBzbyBjb21wbGV0ZQorICoJCQkgICAgaXQuCisgKiAgRVhQQU5EX0JVRkZFUlMJICAgIENvbXBsZXRlIGZpbGUgbmFtZXMgZm9yIDpidWYgYW5kIDpzYnVmIGNvbW1hbmRzLgorICogIEVYUEFORF9GSUxFUwkgICAgQWZ0ZXIgY29tbWFuZCB3aXRoIFhGSUxFIHNldCwgb3IgYWZ0ZXIgc2V0dGluZworICoJCQkgICAgd2l0aCBQX0VYUEFORCBzZXQuCWVnIDplIF5JLCA6dz4+XkkKKyAqICBFWFBBTkRfRElSRUNUT1JJRVMJICAgIEluIHNvbWUgY2FzZXMgdGhpcyBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGxhdHRlcgorICoJCQkgICAgd2hlbiB3ZSBrbm93IG9ubHkgZGlyZWN0b3JpZXMgYXJlIG9mIGludGVyZXN0LiAgZWcKKyAqCQkJICAgIDpzZXQgZGlyPV5JCisgKiAgRVhQQU5EX1NFVFRJTkdTCSAgICBDb21wbGV0ZSB2YXJpYWJsZSBuYW1lcy4gIGVnIDpzZXQgZF5JCisgKiAgRVhQQU5EX0JPT0xfU0VUVElOR1MgICAgQ29tcGxldGUgYm9vbGVhbiB2YXJpYWJsZXMgb25seSwgIGVnIDpzZXQgbm9eSQorICogIEVYUEFORF9UQUdTCQkgICAgQ29tcGxldGUgdGFncyBmcm9tIHRoZSBmaWxlcyBpbiBwX3RhZ3MuICBlZyA6dGEgYV5JCisgKiAgRVhQQU5EX1RBR1NfTElTVEZJTEVTICAgQXMgYWJvdmUsIGJ1dCBsaXN0IGZpbGVuYW1lcyBvbiBeRCwgYWZ0ZXIgOnRzZWxlY3QKKyAqICBFWFBBTkRfSEVMUAkJICAgIENvbXBsZXRlIHRhZ3MgZnJvbSB0aGUgZmlsZSAnaGVscGZpbGUnL3RhZ3MKKyAqICBFWFBBTkRfRVZFTlRTCSAgICBDb21wbGV0ZSBldmVudCBuYW1lcworICogIEVYUEFORF9TWU5UQVgJICAgIENvbXBsZXRlIDpzeW50YXggY29tbWFuZCBhcmd1bWVudHMKKyAqICBFWFBBTkRfSElHSExJR0hUCSAgICBDb21wbGV0ZSBoaWdobGlnaHQgKHN5bnRheCkgZ3JvdXAgbmFtZXMKKyAqICBFWFBBTkRfQVVHUk9VUAkgICAgQ29tcGxldGUgYXV0b2NvbW1hbmQgZ3JvdXAgbmFtZXMKKyAqICBFWFBBTkRfVVNFUl9WQVJTCSAgICBDb21wbGV0ZSB1c2VyIGRlZmluZWQgdmFyaWFibGUgbmFtZXMsIGVnIDp1bmxldCBhXkkKKyAqICBFWFBBTkRfTUFQUElOR1MJICAgIENvbXBsZXRlIG1hcHBpbmcgYW5kIGFiYnJldmlhdGlvbiBuYW1lcywKKyAqCQkJICAgICAgZWcgOnVubWFwIGFeSSAsIDpjdW5hYiB4XkkKKyAqICBFWFBBTkRfRlVOQ1RJT05TCSAgICBDb21wbGV0ZSBpbnRlcm5hbCBvciB1c2VyIGRlZmluZWQgZnVuY3Rpb24gbmFtZXMsCisgKgkJCSAgICAgIGVnIDpjYWxsIHN1Yl5JCisgKiAgRVhQQU5EX1VTRVJfRlVOQwkgICAgQ29tcGxldGUgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIG5hbWVzLCBlZyA6ZGVsZiBGXkkKKyAqICBFWFBBTkRfRVhQUkVTU0lPTgkgICAgQ29tcGxldGUgaW50ZXJuYWwgb3IgdXNlciBkZWZpbmVkIGZ1bmN0aW9uL3ZhcmlhYmxlCisgKgkJCSAgICBuYW1lcyBpbiBleHByZXNzaW9ucywgZWcgOndoaWxlIHNeSQorICogIEVYUEFORF9FTlZfVkFSUwkgICAgQ29tcGxldGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfZXhwYW5kX2NvbnRleHQoeHApCisgICAgZXhwYW5kX1QJKnhwOworeworICAgIC8qIG9ubHkgZXhwYW5zaW9uIGZvciAnOicgYW5kICc+JyBjb21tYW5kcyAqLworICAgIGlmIChjY2xpbmUuY21kZmlyc3RjICE9ICc6JworI2lmZGVmIEZFQVRfRVZBTAorCSAgICAmJiBjY2xpbmUuY21kZmlyc3RjICE9ICc+JworI2VuZGlmCisJICAgICkKKyAgICB7CisJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwlyZXR1cm47CisgICAgfQorICAgIHNldF9jbWRfY29udGV4dCh4cCwgY2NsaW5lLmNtZGJ1ZmYsIGNjbGluZS5jbWRsZW4sIGNjbGluZS5jbWRwb3MpOworfQorCisgICAgdm9pZAorc2V0X2NtZF9jb250ZXh0KHhwLCBzdHIsIGxlbiwgY29sKQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBjaGFyX3UJKnN0cjsJICAgIC8qIHN0YXJ0IG9mIGNvbW1hbmQgbGluZSAqLworICAgIGludAkJbGVuOwkgICAgLyogbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSAoZXhjbC4gTlVMKSAqLworICAgIGludAkJY29sOwkgICAgLyogcG9zaXRpb24gb2YgY3Vyc29yICovCit7CisgICAgaW50CQlvbGRfY2hhciA9IE5VTDsKKyAgICBjaGFyX3UJKm5leHRjb21tOworCisgICAgLyoKKyAgICAgKiBBdm9pZCBhIFVNUiB3YXJuaW5nIGZyb20gUHVyaWZ5LCBvbmx5IHNhdmUgdGhlIGNoYXJhY3RlciBpZiBpdCBoYXMgYmVlbgorICAgICAqIHdyaXR0ZW4gYmVmb3JlLgorICAgICAqLworICAgIGlmIChjb2wgPCBsZW4pCisJb2xkX2NoYXIgPSBzdHJbY29sXTsKKyAgICBzdHJbY29sXSA9IE5VTDsKKyAgICBuZXh0Y29tbSA9IHN0cjsKKyAgICB3aGlsZSAobmV4dGNvbW0gIT0gTlVMTCkKKwluZXh0Y29tbSA9IHNldF9vbmVfY21kX2NvbnRleHQoeHAsIG5leHRjb21tKTsKKyAgICBzdHJbY29sXSA9IG9sZF9jaGFyOworfQorCisvKgorICogRXhwYW5kIHRoZSBjb21tYW5kIGxpbmUgInN0ciIgZnJvbSBjb250ZXh0ICJ4cCIuCisgKiAieHAiIG11c3QgaGF2ZSBiZWVuIHNldCBieSBzZXRfY21kX2NvbnRleHQoKS4KKyAqIHhwLT54cF9wYXR0ZXJuIHBvaW50cyBpbnRvICJzdHIiLCB0byB3aGVyZSB0aGUgdGV4dCB0aGF0IGlzIHRvIGJlIGV4cGFuZGVkCisgKiBzdGFydHMuCisgKiBSZXR1cm5zIEVYUEFORF9VTlNVQ0NFU1NGVUwgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgaWxsZWdhbCBiZWZvcmUgdGhlCisgKiBjdXJzb3IuCisgKiBSZXR1cm5zIEVYUEFORF9OT1RISU5HIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBleHBhbmQsIG1pZ2h0IGluc2VydCB0aGUKKyAqIGtleSB0aGF0IHRyaWdnZXJlZCBleHBhbnNpb24gbGl0ZXJhbGx5LgorICogUmV0dXJucyBFWFBBTkRfT0sgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitleHBhbmRfY21kbGluZSh4cCwgc3RyLCBjb2wsIG1hdGNoY291bnQsIG1hdGNoZXMpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqc3RyOwkJLyogc3RhcnQgb2YgY29tbWFuZCBsaW5lICovCisgICAgaW50CQljb2w7CQkvKiBwb3NpdGlvbiBvZiBjdXJzb3IgKi8KKyAgICBpbnQJCSptYXRjaGNvdW50OwkvKiByZXR1cm46IG5yIG9mIG1hdGNoZXMgKi8KKyAgICBjaGFyX3UJKioqbWF0Y2hlczsJLyogcmV0dXJuOiBhcnJheSBvZiBwb2ludGVycyB0byBtYXRjaGVzICovCit7CisgICAgY2hhcl91CSpmaWxlX3N0ciA9IE5VTEw7CisKKyAgICBpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX1VOU1VDQ0VTU0ZVTCkKKyAgICB7CisJYmVlcF9mbHVzaCgpOworCXJldHVybiBFWFBBTkRfVU5TVUNDRVNTRlVMOyAgLyogU29tZXRoaW5nIGlsbGVnYWwgb24gY29tbWFuZCBsaW5lICovCisgICAgfQorICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfTk9USElORykKKyAgICB7CisJLyogQ2FsbGVyIGNhbiB1c2UgdGhlIGNoYXJhY3RlciBhcyBhIG5vcm1hbCBjaGFyIGluc3RlYWQgKi8KKwlyZXR1cm4gRVhQQU5EX05PVEhJTkc7CisgICAgfQorCisgICAgLyogYWRkIHN0YXIgdG8gZmlsZSBuYW1lLCBvciBjb252ZXJ0IHRvIHJlZ2V4cCBpZiBub3QgZXhwLiBmaWxlcy4gKi8KKyAgICBmaWxlX3N0ciA9IGFkZHN0YXIoeHAtPnhwX3BhdHRlcm4sCisJCQkgICAoaW50KShzdHIgKyBjb2wgLSB4cC0+eHBfcGF0dGVybiksIHhwLT54cF9jb250ZXh0KTsKKyAgICBpZiAoZmlsZV9zdHIgPT0gTlVMTCkKKwlyZXR1cm4gRVhQQU5EX1VOU1VDQ0VTU0ZVTDsKKworICAgIC8qIGZpbmQgYWxsIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGRlc2NyaXB0aW9uICovCisgICAgaWYgKEV4cGFuZEZyb21Db250ZXh0KHhwLCBmaWxlX3N0ciwgbWF0Y2hjb3VudCwgbWF0Y2hlcywKKwkJCQkJICBXSUxEX0FERF9TTEFTSHxXSUxEX1NJTEVOVCkgPT0gRkFJTCkKKyAgICB7CisJKm1hdGNoY291bnQgPSAwOworCSptYXRjaGVzID0gTlVMTDsKKyAgICB9CisgICAgdmltX2ZyZWUoZmlsZV9zdHIpOworCisgICAgcmV0dXJuIEVYUEFORF9PSzsKK30KKworI2lmZGVmIEZFQVRfTVVMVElfTEFORworLyoKKyAqIENsZWFudXAgbWF0Y2hlcyBmb3IgaGVscCB0YWdzOiByZW1vdmUgIkBlbiIgaWYgImVuIiBpcyB0aGUgb25seSBsYW5ndWFnZS4KKyAqLworc3RhdGljIHZvaWQJY2xlYW51cF9oZWxwX3RhZ3MgX19BUkdTKChpbnQgbnVtX2ZpbGUsIGNoYXJfdSAqKmZpbGUpKTsKKworICAgIHN0YXRpYyB2b2lkCitjbGVhbnVwX2hlbHBfdGFncyhudW1fZmlsZSwgZmlsZSkKKyAgICBpbnQJCW51bV9maWxlOworICAgIGNoYXJfdQkqKmZpbGU7Cit7CisgICAgaW50CQlpLCBqOworICAgIGludAkJbGVuOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9maWxlOyArK2kpCisgICAgeworCWxlbiA9IChpbnQpU1RSTEVOKGZpbGVbaV0pIC0gMzsKKwlpZiAobGVuID4gMCAmJiBTVFJDTVAoZmlsZVtpXSArIGxlbiwgIkBlbiIpID09IDApCisJeworCSAgICAvKiBTb3J0aW5nIG9uIHByaW9yaXR5IG1lYW5zIHRoZSBzYW1lIGl0ZW0gaW4gYW5vdGhlciBsYW5ndWFnZSBtYXkKKwkgICAgICogYmUgYW55d2hlcmUuICBTZWFyY2ggYWxsIGl0ZW1zIGZvciBhIG1hdGNoIHVwIHRvIHRoZSAiQGVuIi4gKi8KKwkgICAgZm9yIChqID0gMDsgaiA8IG51bV9maWxlOyArK2opCisJCWlmIChqICE9IGkKKwkJCSYmIChpbnQpU1RSTEVOKGZpbGVbal0pID09IGxlbiArIDMKKwkJCSYmIFNUUk5DTVAoZmlsZVtpXSwgZmlsZVtqXSwgbGVuICsgMSkgPT0gMCkKKwkJICAgIGJyZWFrOworCSAgICBpZiAoaiA9PSBudW1fZmlsZSkKKwkJZmlsZVtpXVtsZW5dID0gTlVMOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIERvIHRoZSBleHBhbnNpb24gYmFzZWQgb24geHAtPnhwX2NvbnRleHQgYW5kICJwYXQiLgorICovCisgICAgc3RhdGljIGludAorRXhwYW5kRnJvbUNvbnRleHQoeHAsIHBhdCwgbnVtX2ZpbGUsIGZpbGUsIG9wdGlvbnMpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJKm51bV9maWxlOworICAgIGNoYXJfdQkqKipmaWxlOworICAgIGludAkJb3B0aW9uczsKK3sKKyNpZmRlZiBGRUFUX0NNRExfQ09NUEwKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworI2VuZGlmCisgICAgaW50CQlyZXQ7CisgICAgaW50CQlmbGFnczsKKworICAgIGZsYWdzID0gRVdfRElSOwkvKiBpbmNsdWRlIGRpcmVjdG9yaWVzICovCisgICAgaWYgKG9wdGlvbnMgJiBXSUxEX0xJU1RfTk9URk9VTkQpCisJZmxhZ3MgfD0gRVdfTk9URk9VTkQ7CisgICAgaWYgKG9wdGlvbnMgJiBXSUxEX0FERF9TTEFTSCkKKwlmbGFncyB8PSBFV19BRERTTEFTSDsKKyAgICBpZiAob3B0aW9ucyAmIFdJTERfS0VFUF9BTEwpCisJZmxhZ3MgfD0gRVdfS0VFUEFMTDsKKyAgICBpZiAob3B0aW9ucyAmIFdJTERfU0lMRU5UKQorCWZsYWdzIHw9IEVXX1NJTEVOVDsKKworICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfRklMRVMgfHwgeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0RJUkVDVE9SSUVTKQorICAgIHsKKwkvKgorCSAqIEV4cGFuZCBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcy4KKwkgKi8KKwlpbnQJZnJlZV9wYXQgPSBGQUxTRTsKKwlpbnQJaTsKKworCS8qIGZvciAiOnNldCBwYXRoPSIgYW5kICI6c2V0IHRhZ3M9IiBoYWx2ZSBiYWNrc2xhc2hlcyBmb3IgZXNjYXBlZAorCSAqIHNwYWNlICovCisJaWYgKHhwLT54cF9iYWNrc2xhc2ggIT0gWFBfQlNfTk9ORSkKKwl7CisJICAgIGZyZWVfcGF0ID0gVFJVRTsKKwkgICAgcGF0ID0gdmltX3N0cnNhdmUocGF0KTsKKwkgICAgZm9yIChpID0gMDsgcGF0W2ldOyArK2kpCisJCWlmIChwYXRbaV0gPT0gJ1xcJykKKwkJeworCQkgICAgaWYgKHhwLT54cF9iYWNrc2xhc2ggPT0gWFBfQlNfVEhSRUUKKwkJCSAgICAmJiBwYXRbaSArIDFdID09ICdcXCcKKwkJCSAgICAmJiBwYXRbaSArIDJdID09ICdcXCcKKwkJCSAgICAmJiBwYXRbaSArIDNdID09ICcgJykKKwkJCVNUUkNQWShwYXQgKyBpLCBwYXQgKyBpICsgMyk7CisJCSAgICBpZiAoeHAtPnhwX2JhY2tzbGFzaCA9PSBYUF9CU19PTkUKKwkJCSAgICAmJiBwYXRbaSArIDFdID09ICcgJykKKwkJCVNUUkNQWShwYXQgKyBpLCBwYXQgKyBpICsgMSk7CisJCX0KKwl9CisKKwlpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0ZJTEVTKQorCSAgICBmbGFncyB8PSBFV19GSUxFOworCWVsc2UKKwkgICAgZmxhZ3MgPSAoZmxhZ3MgfCBFV19ESVIpICYgfkVXX0ZJTEU7CisJcmV0ID0gZXhwYW5kX3dpbGRjYXJkcygxLCAmcGF0LCBudW1fZmlsZSwgZmlsZSwgZmxhZ3MpOworCWlmIChmcmVlX3BhdCkKKwkgICAgdmltX2ZyZWUocGF0KTsKKwlyZXR1cm4gcmV0OworICAgIH0KKworICAgICpmaWxlID0gKGNoYXJfdSAqKikiIjsKKyAgICAqbnVtX2ZpbGUgPSAwOworICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfSEVMUCkKKyAgICB7CisJaWYgKGZpbmRfaGVscF90YWdzKHBhdCwgbnVtX2ZpbGUsIGZpbGUsIEZBTFNFKSA9PSBPSykKKwl7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisJICAgIGNsZWFudXBfaGVscF90YWdzKCpudW1fZmlsZSwgKmZpbGUpOworI2VuZGlmCisJICAgIHJldHVybiBPSzsKKwl9CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisjaWZuZGVmIEZFQVRfQ01ETF9DT01QTAorICAgIHJldHVybiBGQUlMOworI2Vsc2UKKyAgICBpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX09MRF9TRVRUSU5HKQorCXJldHVybiBFeHBhbmRPbGRTZXR0aW5nKG51bV9maWxlLCBmaWxlKTsKKyAgICBpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0JVRkZFUlMpCisJcmV0dXJuIEV4cGFuZEJ1Zm5hbWVzKHBhdCwgbnVtX2ZpbGUsIGZpbGUsIG9wdGlvbnMpOworICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfVEFHUworCSAgICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfVEFHU19MSVNURklMRVMpCisJcmV0dXJuIGV4cGFuZF90YWdzKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9UQUdTLCBwYXQsIG51bV9maWxlLCBmaWxlKTsKKyAgICBpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0NPTE9SUykKKwlyZXR1cm4gRXhwYW5kUlREaXIocGF0LCBudW1fZmlsZSwgZmlsZSwgImNvbG9ycyIpOworICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQ09NUElMRVIpCisJcmV0dXJuIEV4cGFuZFJURGlyKHBhdCwgbnVtX2ZpbGUsIGZpbGUsICJjb21waWxlciIpOworCisgICAgcmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKHBhdCwgcF9tYWdpYyA/IFJFX01BR0lDIDogMCk7CisgICAgaWYgKHJlZ21hdGNoLnJlZ3Byb2cgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qIHNldCBpZ25vcmUtY2FzZSBhY2NvcmRpbmcgdG8gcF9pYywgcF9zY3MgYW5kIHBhdCAqLworICAgIHJlZ21hdGNoLnJtX2ljID0gaWdub3JlY2FzZShwYXQpOworCisgICAgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9TRVRUSU5HUworCSAgICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQk9PTF9TRVRUSU5HUykKKwlyZXQgPSBFeHBhbmRTZXR0aW5ncyh4cCwgJnJlZ21hdGNoLCBudW1fZmlsZSwgZmlsZSk7CisgICAgZWxzZSBpZiAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX01BUFBJTkdTKQorCXJldCA9IEV4cGFuZE1hcHBpbmdzKCZyZWdtYXRjaCwgbnVtX2ZpbGUsIGZpbGUpOworIyBpZiBkZWZpbmVkKEZFQVRfVVNSX0NNRFMpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorICAgIGVsc2UgaWYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9VU0VSX0RFRklORUQpCisJcmV0ID0gRXhwYW5kVXNlckRlZmluZWQoeHAsICZyZWdtYXRjaCwgbnVtX2ZpbGUsIGZpbGUpOworIyBlbmRpZgorICAgIGVsc2UKKyAgICB7CisJc3RhdGljIHN0cnVjdCBleHBnZW4KKwl7CisJICAgIGludAkJY29udGV4dDsKKwkgICAgY2hhcl91CSooKCpmdW5jKV9fQVJHUygoZXhwYW5kX1QgKiwgaW50KSkpOworCSAgICBpbnQJCWljOworCX0gdGFiW10gPQorCXsKKwkgICAge0VYUEFORF9DT01NQU5EUywgZ2V0X2NvbW1hbmRfbmFtZSwgRkFMU0V9LAorI2lmZGVmIEZFQVRfVVNSX0NNRFMKKwkgICAge0VYUEFORF9VU0VSX0NPTU1BTkRTLCBnZXRfdXNlcl9jb21tYW5kcywgRkFMU0V9LAorCSAgICB7RVhQQU5EX1VTRVJfQ01EX0ZMQUdTLCBnZXRfdXNlcl9jbWRfZmxhZ3MsIEZBTFNFfSwKKwkgICAge0VYUEFORF9VU0VSX05BUkdTLCBnZXRfdXNlcl9jbWRfbmFyZ3MsIEZBTFNFfSwKKwkgICAge0VYUEFORF9VU0VSX0NPTVBMRVRFLCBnZXRfdXNlcl9jbWRfY29tcGxldGUsIEZBTFNFfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRVZBTAorCSAgICB7RVhQQU5EX1VTRVJfVkFSUywgZ2V0X3VzZXJfdmFyX25hbWUsIEZBTFNFfSwKKwkgICAge0VYUEFORF9GVU5DVElPTlMsIGdldF9mdW5jdGlvbl9uYW1lLCBGQUxTRX0sCisJICAgIHtFWFBBTkRfVVNFUl9GVU5DLCBnZXRfdXNlcl9mdW5jX25hbWUsIEZBTFNFfSwKKwkgICAge0VYUEFORF9FWFBSRVNTSU9OLCBnZXRfZXhwcl9uYW1lLCBGQUxTRX0sCisjZW5kaWYKKyNpZmRlZiBGRUFUX01FTlUKKwkgICAge0VYUEFORF9NRU5VUywgZ2V0X21lbnVfbmFtZSwgRkFMU0V9LAorCSAgICB7RVhQQU5EX01FTlVOQU1FUywgZ2V0X21lbnVfbmFtZXMsIEZBTFNFfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1lOX0hMCisJICAgIHtFWFBBTkRfU1lOVEFYLCBnZXRfc3ludGF4X25hbWUsIFRSVUV9LAorI2VuZGlmCisJICAgIHtFWFBBTkRfSElHSExJR0hULCBnZXRfaGlnaGxpZ2h0X25hbWUsIFRSVUV9LAorI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICB7RVhQQU5EX0VWRU5UUywgZ2V0X2V2ZW50X25hbWUsIFRSVUV9LAorCSAgICB7RVhQQU5EX0FVR1JPVVAsIGdldF9hdWdyb3VwX25hbWUsIFRSVUV9LAorI2VuZGlmCisjaWYgKGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkpIFwKKwkmJiAoZGVmaW5lZChGRUFUX0dFVFRFWFQpIHx8IGRlZmluZWQoRkVBVF9NQllURSkpCisJICAgIHtFWFBBTkRfTEFOR1VBR0UsIGdldF9sYW5nX2FyZywgVFJVRX0sCisjZW5kaWYKKwkgICAge0VYUEFORF9FTlZfVkFSUywgZ2V0X2Vudl9uYW1lLCBUUlVFfSwKKwl9OworCWludAlpOworCisJLyoKKwkgKiBGaW5kIGEgY29udGV4dCBpbiB0aGUgdGFibGUgYW5kIGNhbGwgdGhlIEV4cGFuZEdlbmVyaWMoKSB3aXRoIHRoZQorCSAqIHJpZ2h0IGZ1bmN0aW9uIHRvIGRvIHRoZSBleHBhbnNpb24uCisJICovCisJcmV0ID0gRkFJTDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRhYikgLyBzaXplb2Yoc3RydWN0IGV4cGdlbik7ICsraSkKKwkgICAgaWYgKHhwLT54cF9jb250ZXh0ID09IHRhYltpXS5jb250ZXh0KQorCSAgICB7CisJCWlmICh0YWJbaV0uaWMpCisJCSAgICByZWdtYXRjaC5ybV9pYyA9IFRSVUU7CisJCXJldCA9IEV4cGFuZEdlbmVyaWMoeHAsICZyZWdtYXRjaCwgbnVtX2ZpbGUsIGZpbGUsIHRhYltpXS5mdW5jKTsKKwkJYnJlYWs7CisJICAgIH0KKyAgICB9CisKKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKworICAgIHJldHVybiByZXQ7CisjZW5kaWYgLyogRkVBVF9DTURMX0NPTVBMICovCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBFeHBhbmQgYSBsaXN0IG9mIG5hbWVzLgorICoKKyAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbW1hbmQgbGluZSBjb21wbGV0aW9uLiAgSXQgY2FsbHMgYSBmdW5jdGlvbiB0bworICogb2J0YWluIHN0cmluZ3MsIG9uZSBieSBvbmUuCVRoZSBzdHJpbmdzIGFyZSBtYXRjaGVkIGFnYWluc3QgYSByZWdleHAKKyAqIHByb2dyYW0uICBNYXRjaGluZyBzdHJpbmdzIGFyZSBjb3BpZWQgaW50byBhbiBhcnJheSwgd2hpY2ggaXMgcmV0dXJuZWQuCisgKgorICogUmV0dXJucyBPSyB3aGVuIG5vIHByb2JsZW1zIGVuY291bnRlcmVkLCBGQUlMIGZvciBlcnJvciAob3V0IG9mIG1lbW9yeSkuCisgKi8KKyAgICBpbnQKK0V4cGFuZEdlbmVyaWMoeHAsIHJlZ21hdGNoLCBudW1fZmlsZSwgZmlsZSwgZnVuYykKKyAgICBleHBhbmRfVAkqeHA7CisgICAgcmVnbWF0Y2hfVAkqcmVnbWF0Y2g7CisgICAgaW50CQkqbnVtX2ZpbGU7CisgICAgY2hhcl91CSoqKmZpbGU7CisgICAgY2hhcl91CSooKCpmdW5jKV9fQVJHUygoZXhwYW5kX1QgKiwgaW50KSkpOworCQkJCQkgIC8qIHJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgbGlzdCAqLworeworICAgIGludAkJaTsKKyAgICBpbnQJCWNvdW50ID0gMDsKKyAgICBpbnQJCWxvb3A7CisgICAgY2hhcl91CSpzdHI7CisKKyAgICAvKiBkbyB0aGlzIGxvb3AgdHdpY2U6CisgICAgICogbG9vcCA9PSAwOiBjb3VudCB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIG5hbWVzCisgICAgICogbG9vcCA9PSAxOiBjb3B5IHRoZSBtYXRjaGluZyBuYW1lcyBpbnRvIGFsbG9jYXRlZCBtZW1vcnkKKyAgICAgKi8KKyAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDw9IDE7ICsrbG9vcCkKKyAgICB7CisJZm9yIChpID0gMDsgOyArK2kpCisJeworCSAgICBzdHIgPSAoKmZ1bmMpKHhwLCBpKTsKKwkgICAgaWYgKHN0ciA9PSBOVUxMKQkgICAgLyogZW5kIG9mIGxpc3QgKi8KKwkJYnJlYWs7CisJICAgIGlmICgqc3RyID09IE5VTCkJICAgIC8qIHNraXAgZW1wdHkgc3RyaW5ncyAqLworCQljb250aW51ZTsKKworCSAgICBpZiAodmltX3JlZ2V4ZWMocmVnbWF0Y2gsIHN0ciwgKGNvbG5yX1QpMCkpCisJICAgIHsKKwkJaWYgKGxvb3ApCisJCXsKKwkJICAgIHN0ciA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoc3RyLCAoY2hhcl91ICopIiBcdFxcLiIpOworCQkgICAgKCpmaWxlKVtjb3VudF0gPSBzdHI7CisjaWZkZWYgRkVBVF9NRU5VCisJCSAgICBpZiAoZnVuYyA9PSBnZXRfbWVudV9uYW1lcyAmJiBzdHIgIT0gTlVMTCkKKwkJICAgIHsKKwkJCS8qIHRlc3QgZm9yIHNlcGFyYXRvciBhZGRlZCBieSBnZXRfbWVudV9uYW1lcygpICovCisJCQlzdHIgKz0gU1RSTEVOKHN0cikgLSAxOworCQkJaWYgKCpzdHIgPT0gJ1wwMDEnKQorCQkJICAgICpzdHIgPSAnLic7CisJCSAgICB9CisjZW5kaWYKKwkJfQorCQkrK2NvdW50OworCSAgICB9CisJfQorCWlmIChsb29wID09IDApCisJeworCSAgICBpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIE9LOworCSAgICAqbnVtX2ZpbGUgPSBjb3VudDsKKwkgICAgKmZpbGUgPSAoY2hhcl91ICoqKWFsbG9jKCh1bnNpZ25lZCkoY291bnQgKiBzaXplb2YoY2hhcl91ICopKSk7CisJICAgIGlmICgqZmlsZSA9PSBOVUxMKQorCSAgICB7CisJCSpmaWxlID0gKGNoYXJfdSAqKikiIjsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgY291bnQgPSAwOworCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9VU1JfQ01EUykgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisvKgorICogRXhwYW5kIG5hbWVzIHdpdGggYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICovCisgICAgc3RhdGljIGludAorRXhwYW5kVXNlckRlZmluZWQoeHAsIHJlZ21hdGNoLCBudW1fZmlsZSwgZmlsZSkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgcmVnbWF0Y2hfVAkqcmVnbWF0Y2g7CisgICAgaW50CQkqbnVtX2ZpbGU7CisgICAgY2hhcl91CSoqKmZpbGU7Cit7CisgICAgY2hhcl91CSphcmdzWzNdOworICAgIGNoYXJfdQkqYWxsOworICAgIGNoYXJfdQkqczsKKyAgICBjaGFyX3UJKmU7CisgICAgY2hhcl91ICAgICAga2VlcDsKKyAgICBjaGFyX3UgICAgICBudW1bNTBdOworICAgIGdhcnJheV9UCWdhOworICAgIGludAkJc2F2ZV9jdXJyZW50X1NJRCA9IGN1cnJlbnRfU0lEOworCisgICAgaWYgKHhwLT54cF9hcmcgPT0gTlVMTCB8fCB4cC0+eHBfYXJnWzBdID09ICdcMCcpCisJcmV0dXJuIEZBSUw7CisgICAgKm51bV9maWxlID0gMDsKKyAgICAqZmlsZSA9IE5VTEw7CisKKyAgICBrZWVwID0gY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl07CisgICAgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl0gPSAwOworICAgIHNwcmludGYoKGNoYXIgKiludW0sICIlZCIsIGNjbGluZS5jbWRwb3MpOworICAgIGFyZ3NbMF0gPSB4cC0+eHBfcGF0dGVybjsKKyAgICBhcmdzWzFdID0gY2NsaW5lLmNtZGJ1ZmY7CisgICAgYXJnc1syXSA9IG51bTsKKworICAgIGN1cnJlbnRfU0lEID0geHAtPnhwX3NjcmlwdElEOworICAgIGFsbCA9IGNhbGxfdmltX2Z1bmN0aW9uKHhwLT54cF9hcmcsIDMsIGFyZ3MsIEZBTFNFKTsKKyAgICBjdXJyZW50X1NJRCA9IHNhdmVfY3VycmVudF9TSUQ7CisgICAgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl0gPSBrZWVwOworICAgIGlmIChhbGwgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGdhX2luaXQyKCZnYSwgKGludClzaXplb2YoY2hhciAqKSwgMyk7CisgICAgZm9yIChzID0gYWxsOyAqcyAhPSBOVUw7IHMgPSBlKQorICAgIHsKKwllID0gdmltX3N0cmNocihzLCAnXG4nKTsKKwlpZiAoZSA9PSBOVUxMKQorCSAgICBlID0gcyArIFNUUkxFTihzKTsKKwlrZWVwID0gKmU7CisJKmUgPSAwOworCisJaWYgKHhwLT54cF9wYXR0ZXJuWzBdICYmIHZpbV9yZWdleGVjKHJlZ21hdGNoLCBzLCAoY29sbnJfVCkwKSA9PSAwKQorCXsKKwkgICAgKmUgPSBrZWVwOworCSAgICBpZiAoKmUgIT0gTlVMKQorCQkrK2U7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChnYV9ncm93KCZnYSwgMSkgPT0gRkFJTCkKKwkgICAgYnJlYWs7CisKKwkoKGNoYXJfdSAqKilnYS5nYV9kYXRhKVtnYS5nYV9sZW5dID0gdmltX3N0cm5zYXZlKHMsIChpbnQpKGUgLSBzKSk7CisJKytnYS5nYV9sZW47CisJLS1nYS5nYV9yb29tOworCisJKmUgPSBrZWVwOworCWlmICgqZSAhPSBOVUwpCisJICAgICsrZTsKKyAgICB9CisgICAgdmltX2ZyZWUoYWxsKTsKKyAgICAqZmlsZSA9IGdhLmdhX2RhdGE7CisgICAgKm51bV9maWxlID0gZ2EuZ2FfbGVuOworICAgIHJldHVybiBPSzsKK30KKyNlbmRpZgorCisvKgorICogRXhwYW5kIGNvbG9yIHNjaGVtZSBuYW1lczogJ3J1bnRpbWVwYXRoJy9jb2xvcnMve3BhdH0udmltCisgKiBvciBjb21waWxlciBuYW1lcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK0V4cGFuZFJURGlyKHBhdCwgbnVtX2ZpbGUsIGZpbGUsIGRpcm5hbWUpCisgICAgY2hhcl91CSpwYXQ7CisgICAgaW50CQkqbnVtX2ZpbGU7CisgICAgY2hhcl91CSoqKmZpbGU7CisgICAgY2hhcgkqZGlybmFtZTsJLyogImNvbG9ycyIgb3IgImNvbXBpbGVyIiAqLworeworICAgIGNoYXJfdQkqYWxsOworICAgIGNoYXJfdQkqczsKKyAgICBjaGFyX3UJKmU7CisgICAgZ2FycmF5X1QJZ2E7CisKKyAgICAqbnVtX2ZpbGUgPSAwOworICAgICpmaWxlID0gTlVMTDsKKyAgICBzID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4ocGF0KSArIFNUUkxFTihkaXJuYW1lKSArIDcpKTsKKyAgICBpZiAocyA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHNwcmludGYoKGNoYXIgKilzLCAiJXMvJXMqLnZpbSIsIGRpcm5hbWUsIHBhdCk7CisgICAgYWxsID0gZ2xvYnBhdGgocF9ydHAsIHMpOworICAgIHZpbV9mcmVlKHMpOworICAgIGlmIChhbGwgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGdhX2luaXQyKCZnYSwgKGludClzaXplb2YoY2hhciAqKSwgMyk7CisgICAgZm9yIChzID0gYWxsOyAqcyAhPSBOVUw7IHMgPSBlKQorICAgIHsKKwllID0gdmltX3N0cmNocihzLCAnXG4nKTsKKwlpZiAoZSA9PSBOVUxMKQorCSAgICBlID0gcyArIFNUUkxFTihzKTsKKwlpZiAoZ2FfZ3JvdygmZ2EsIDEpID09IEZBSUwpCisJICAgIGJyZWFrOworCWlmIChlIC0gNCA+IHMgJiYgU1RSTklDTVAoZSAtIDQsICIudmltIiwgNCkgPT0gMCkKKwl7CisJICAgIGZvciAocyA9IGUgLSA0OyBzID4gYWxsOyAtLXMpCisJCWlmICgqcyA9PSAnXG4nIHx8IHZpbV9pc3BhdGhzZXAoKnMpKQorCQkgICAgYnJlYWs7CisJICAgICsrczsKKwkgICAgKChjaGFyX3UgKiopZ2EuZ2FfZGF0YSlbZ2EuZ2FfbGVuXSA9CisJCQkJCSAgICB2aW1fc3RybnNhdmUocywgKGludCkoZSAtIHMgLSA0KSk7CisJICAgICsrZ2EuZ2FfbGVuOworCSAgICAtLWdhLmdhX3Jvb207CisJfQorCWlmICgqZSAhPSBOVUwpCisJICAgICsrZTsKKyAgICB9CisgICAgdmltX2ZyZWUoYWxsKTsKKyAgICAqZmlsZSA9IGdhLmdhX2RhdGE7CisgICAgKm51bV9maWxlID0gZ2EuZ2FfbGVuOworICAgIHJldHVybiBPSzsKK30KKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRXhwYW5kICJmaWxlIiBmb3IgYWxsIGNvbW1hLXNlcGFyYXRlZCBkaXJlY3RvcmllcyBpbiAicGF0aCIuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgd2l0aCBhbGwgbWF0Y2hlcyBjb25jYXRlbmF0ZWQsIHNlcGFyYXRlZCBieQorICogbmV3bGluZXMuICBSZXR1cm5zIE5VTEwgZm9yIGFuIGVycm9yIG9yIG5vIG1hdGNoZXMuCisgKi8KKyAgICBjaGFyX3UgKgorZ2xvYnBhdGgocGF0aCwgZmlsZSkKKyAgICBjaGFyX3UJKnBhdGg7CisgICAgY2hhcl91CSpmaWxlOworeworICAgIGV4cGFuZF9UCXhwYzsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBnYXJyYXlfVAlnYTsKKyAgICBpbnQJCWk7CisgICAgaW50CQlsZW47CisgICAgaW50CQludW1fcDsKKyAgICBjaGFyX3UJKipwOworICAgIGNoYXJfdQkqY3VyID0gTlVMTDsKKworICAgIGJ1ZiA9IGFsbG9jKE1BWFBBVEhMKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICB4cGMueHBfY29udGV4dCA9IEVYUEFORF9GSUxFUzsKKyAgICB4cGMueHBfYmFja3NsYXNoID0gWFBfQlNfTk9ORTsKKyAgICBnYV9pbml0MigmZ2EsIDEsIDEwMCk7CisKKyAgICAvKiBMb29wIG92ZXIgYWxsIGVudHJpZXMgaW4ge3BhdGh9LiAqLworICAgIHdoaWxlICgqcGF0aCAhPSBOVUwpCisgICAgeworCS8qIENvcHkgb25lIGl0ZW0gb2YgdGhlIHBhdGggdG8gYnVmW10gYW5kIGNvbmNhdGVuYXRlIHRoZSBmaWxlIG5hbWUuICovCisJY29weV9vcHRpb25fcGFydCgmcGF0aCwgYnVmLCBNQVhQQVRITCwgIiwiKTsKKwlpZiAoU1RSTEVOKGJ1ZikgKyBTVFJMRU4oZmlsZSkgKyAyIDwgTUFYUEFUSEwpCisJeworCSAgICBhZGRfcGF0aHNlcChidWYpOworCSAgICBTVFJDQVQoYnVmLCBmaWxlKTsKKwkgICAgaWYgKEV4cGFuZEZyb21Db250ZXh0KCZ4cGMsIGJ1ZiwgJm51bV9wLCAmcCwgV0lMRF9TSUxFTlQpICE9IEZBSUwKKwkJCQkJCQkJICYmIG51bV9wID4gMCkKKwkgICAgeworCQlFeHBhbmRFc2NhcGUoJnhwYywgYnVmLCBudW1fcCwgcCwgV0lMRF9TSUxFTlQpOworCQlmb3IgKGxlbiA9IDAsIGkgPSAwOyBpIDwgbnVtX3A7ICsraSkKKwkJICAgIGxlbiArPSAobG9uZ191KVNUUkxFTihwW2ldKSArIDE7CisKKwkJLyogQ29uY2F0ZW5hdGUgbmV3IHJlc3VsdHMgdG8gcHJldmlvdXMgb25lcy4gKi8KKwkJaWYgKGdhX2dyb3coJmdhLCBsZW4pID09IE9LKQorCQl7CisJCSAgICBjdXIgPSAoY2hhcl91ICopZ2EuZ2FfZGF0YSArIGdhLmdhX2xlbjsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcDsgKytpKQorCQkgICAgeworCQkJU1RSQ1BZKGN1ciwgcFtpXSk7CisJCQljdXIgKz0gU1RSTEVOKHBbaV0pOworCQkJKmN1cisrID0gJ1xuJzsKKwkJICAgIH0KKwkJICAgIGdhLmdhX2xlbiArPSBsZW47CisJCSAgICBnYS5nYV9yb29tIC09IGxlbjsKKwkJfQorCQlGcmVlV2lsZChudW1fcCwgcCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChjdXIgIT0gTlVMTCkKKwkqLS1jdXIgPSAwOyAvKiBSZXBsYWNlIHRyYWlsaW5nIG5ld2xpbmUgd2l0aCBOVUwgKi8KKworICAgIHZpbV9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIChjaGFyX3UgKilnYS5nYV9kYXRhOworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTURISVNUKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29tbWFuZCBsaW5lIGhpc3Rvcnkgc3R1ZmYJICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUcmFuc2xhdGUgYSBoaXN0b3J5IGNoYXJhY3RlciB0byB0aGUgYXNzb2NpYXRlZCB0eXBlIG51bWJlci4KKyAqLworICAgIHN0YXRpYyBpbnQKK2hpc3RfY2hhcjJ0eXBlKGMpCisgICAgaW50CSAgICBjOworeworICAgIGlmIChjID09ICc6JykKKwlyZXR1cm4gSElTVF9DTUQ7CisgICAgaWYgKGMgPT0gJz0nKQorCXJldHVybiBISVNUX0VYUFI7CisgICAgaWYgKGMgPT0gJ0AnKQorCXJldHVybiBISVNUX0lOUFVUOworICAgIGlmIChjID09ICc+JykKKwlyZXR1cm4gSElTVF9ERUJVRzsKKyAgICByZXR1cm4gSElTVF9TRUFSQ0g7CSAgICAvKiBtdXN0IGJlICc/JyBvciAnLycgKi8KK30KKworLyoKKyAqIFRhYmxlIG9mIGhpc3RvcnkgbmFtZXMuCisgKiBUaGVzZSBuYW1lcyBhcmUgdXNlZCBpbiA6aGlzdG9yeSBhbmQgdmFyaW91cyBoaXN0Li4uKCkgZnVuY3Rpb25zLgorICogSXQgaXMgc3VmZmljaWVudCB0byBnaXZlIHRoZSBzaWduaWZpY2FudCBwcmVmaXggb2YgYSBoaXN0b3J5IG5hbWUuCisgKi8KKworc3RhdGljIGNoYXIgKihoaXN0b3J5X25hbWVzW10pID0KK3sKKyAgICAiY21kIiwKKyAgICAic2VhcmNoIiwKKyAgICAiZXhwciIsCisgICAgImlucHV0IiwKKyAgICAiZGVidWciLAorICAgIE5VTEwKK307CisKKy8qCisgKiBpbml0X2hpc3RvcnkoKSAtIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgbGluZSBoaXN0b3J5LgorICogQWxzbyB1c2VkIHRvIHJlLWFsbG9jYXRlIHRoZSBoaXN0b3J5IHdoZW4gdGhlIHNpemUgY2hhbmdlcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X2hpc3RvcnkoKQoreworICAgIGludAkJbmV3bGVuOwkgICAgLyogbmV3IGxlbmd0aCBvZiBoaXN0b3J5IHRhYmxlICovCisgICAgaGlzdGVudHJ5X1QJKnRlbXA7CisgICAgaW50CQlpOworICAgIGludAkJajsKKyAgICBpbnQJCXR5cGU7CisKKyAgICAvKgorICAgICAqIElmIHNpemUgb2YgaGlzdG9yeSB0YWJsZSBjaGFuZ2VkLCByZWFsbG9jYXRlIGl0CisgICAgICovCisgICAgbmV3bGVuID0gKGludClwX2hpOworICAgIGlmIChuZXdsZW4gIT0gaGlzbGVuKQkJCS8qIGhpc3RvcnkgbGVuZ3RoIGNoYW5nZWQgKi8KKyAgICB7CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IEhJU1RfQ09VTlQ7ICsrdHlwZSkgICAvKiBhZGp1c3QgdGhlIHRhYmxlcyAqLworCXsKKwkgICAgaWYgKG5ld2xlbikKKwkgICAgeworCQl0ZW1wID0gKGhpc3RlbnRyeV9UICopbGFsbG9jKAorCQkJCShsb25nX3UpKG5ld2xlbiAqIHNpemVvZihoaXN0ZW50cnlfVCkpLCBUUlVFKTsKKwkJaWYgKHRlbXAgPT0gTlVMTCkgICAvKiBvdXQgb2YgbWVtb3J5ISAqLworCQl7CisJCSAgICBpZiAodHlwZSA9PSAwKSAgLyogZmlyc3Qgb25lOiBqdXN0IGtlZXAgdGhlIG9sZCBsZW5ndGggKi8KKwkJICAgIHsKKwkJCW5ld2xlbiA9IGhpc2xlbjsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgLyogQWxyZWFkeSBjaGFuZ2VkIG9uZSB0YWJsZSwgbm93IHdlIGNhbiBvbmx5IGhhdmUgemVybworCQkgICAgICogbGVuZ3RoIGZvciBhbGwgdGFibGVzLiAqLworCQkgICAgbmV3bGVuID0gMDsKKwkJICAgIHR5cGUgPSAtMTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCQl0ZW1wID0gTlVMTDsKKwkgICAgaWYgKG5ld2xlbiA9PSAwIHx8IHRlbXAgIT0gTlVMTCkKKwkgICAgeworCQlpZiAoaGlzaWR4W3R5cGVdIDwgMCkJCS8qIHRoZXJlIGFyZSBubyBlbnRyaWVzIHlldCAqLworCQl7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbmV3bGVuOyArK2kpCisJCSAgICB7CisJCQl0ZW1wW2ldLmhpc251bSA9IDA7CisJCQl0ZW1wW2ldLmhpc3N0ciA9IE5VTEw7CisJCSAgICB9CisJCX0KKwkJZWxzZSBpZiAobmV3bGVuID4gaGlzbGVuKQkvKiBhcnJheSBiZWNvbWVzIGJpZ2dlciAqLworCQl7CisJCSAgICBmb3IgKGkgPSAwOyBpIDw9IGhpc2lkeFt0eXBlXTsgKytpKQorCQkJdGVtcFtpXSA9IGhpc3RvcnlbdHlwZV1baV07CisJCSAgICBqID0gaTsKKwkJICAgIGZvciAoIDsgaSA8PSBuZXdsZW4gLSAoaGlzbGVuIC0gaGlzaWR4W3R5cGVdKTsgKytpKQorCQkgICAgeworCQkJdGVtcFtpXS5oaXNudW0gPSAwOworCQkJdGVtcFtpXS5oaXNzdHIgPSBOVUxMOworCQkgICAgfQorCQkgICAgZm9yICggOyBqIDwgaGlzbGVuOyArK2ksICsraikKKwkJCXRlbXBbaV0gPSBoaXN0b3J5W3R5cGVdW2pdOworCQl9CisJCWVsc2UJCQkJLyogYXJyYXkgYmVjb21lcyBzbWFsbGVyIG9yIDAgKi8KKwkJeworCQkgICAgaiA9IGhpc2lkeFt0eXBlXTsKKwkJICAgIGZvciAoaSA9IG5ld2xlbiAtIDE7IDsgLS1pKQorCQkgICAgeworCQkJaWYgKGkgPj0gMCkJCS8qIGNvcHkgbmV3ZXN0IGVudHJpZXMgKi8KKwkJCSAgICB0ZW1wW2ldID0gaGlzdG9yeVt0eXBlXVtqXTsKKwkJCWVsc2UJCQkvKiByZW1vdmUgb2xkZXIgZW50cmllcyAqLworCQkJICAgIHZpbV9mcmVlKGhpc3RvcnlbdHlwZV1bal0uaGlzc3RyKTsKKwkJCWlmICgtLWogPCAwKQorCQkJICAgIGogPSBoaXNsZW4gLSAxOworCQkJaWYgKGogPT0gaGlzaWR4W3R5cGVdKQorCQkJICAgIGJyZWFrOworCQkgICAgfQorCQkgICAgaGlzaWR4W3R5cGVdID0gbmV3bGVuIC0gMTsKKwkJfQorCQl2aW1fZnJlZShoaXN0b3J5W3R5cGVdKTsKKwkJaGlzdG9yeVt0eXBlXSA9IHRlbXA7CisJICAgIH0KKwl9CisJaGlzbGVuID0gbmV3bGVuOworICAgIH0KK30KKworLyoKKyAqIENoZWNrIGlmIGNvbW1hbmQgbGluZSAnc3RyJyBpcyBhbHJlYWR5IGluIGhpc3RvcnkuCisgKiBJZiAnbW92ZV90b19mcm9udCcgaXMgVFJVRSwgbWF0Y2hpbmcgZW50cnkgaXMgbW92ZWQgdG8gZW5kIG9mIGhpc3RvcnkuCisgKi8KKyAgICBzdGF0aWMgaW50Citpbl9oaXN0b3J5KHR5cGUsIHN0ciwgbW92ZV90b19mcm9udCkKKyAgICBpbnQJICAgIHR5cGU7CisgICAgY2hhcl91ICAqc3RyOworICAgIGludAkgICAgbW92ZV90b19mcm9udDsJLyogTW92ZSB0aGUgZW50cnkgdG8gdGhlIGZyb250IGlmIGl0IGV4aXN0cyAqLworeworICAgIGludAkgICAgaTsKKyAgICBpbnQJICAgIGxhc3RfaSA9IC0xOworCisgICAgaWYgKGhpc2lkeFt0eXBlXSA8IDApCisJcmV0dXJuIEZBTFNFOworICAgIGkgPSBoaXNpZHhbdHlwZV07CisgICAgZG8KKyAgICB7CisJaWYgKGhpc3RvcnlbdHlwZV1baV0uaGlzc3RyID09IE5VTEwpCisJICAgIHJldHVybiBGQUxTRTsKKwlpZiAoU1RSQ01QKHN0ciwgaGlzdG9yeVt0eXBlXVtpXS5oaXNzdHIpID09IDApCisJeworCSAgICBpZiAoIW1vdmVfdG9fZnJvbnQpCisJCXJldHVybiBUUlVFOworCSAgICBsYXN0X2kgPSBpOworCSAgICBicmVhazsKKwl9CisJaWYgKC0taSA8IDApCisJICAgIGkgPSBoaXNsZW4gLSAxOworICAgIH0gd2hpbGUgKGkgIT0gaGlzaWR4W3R5cGVdKTsKKworICAgIGlmIChsYXN0X2kgPj0gMCkKKyAgICB7CisJc3RyID0gaGlzdG9yeVt0eXBlXVtpXS5oaXNzdHI7CisJd2hpbGUgKGkgIT0gaGlzaWR4W3R5cGVdKQorCXsKKwkgICAgaWYgKCsraSA+PSBoaXNsZW4pCisJCWkgPSAwOworCSAgICBoaXN0b3J5W3R5cGVdW2xhc3RfaV0gPSBoaXN0b3J5W3R5cGVdW2ldOworCSAgICBsYXN0X2kgPSBpOworCX0KKwloaXN0b3J5W3R5cGVdW2ldLmhpc3N0ciA9IHN0cjsKKwloaXN0b3J5W3R5cGVdW2ldLmhpc251bSA9ICsraGlzbnVtW3R5cGVdOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBDb252ZXJ0IGhpc3RvcnkgbmFtZSAoZnJvbSB0YWJsZSBhYm92ZSkgdG8gaXRzIEhJU1RfIGVxdWl2YWxlbnQuCisgKiBXaGVuICJuYW1lIiBpcyBlbXB0eSwgcmV0dXJuICJjbWQiIGhpc3RvcnkuCisgKiBSZXR1cm5zIC0xIGZvciB1bmtub3duIGhpc3RvcnkgbmFtZS4KKyAqLworICAgIGludAorZ2V0X2hpc3R0eXBlKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKyAgICBpbnQJCWxlbiA9IChpbnQpU1RSTEVOKG5hbWUpOworCisgICAgLyogTm8gYXJndW1lbnQ6IHVzZSBjdXJyZW50IGhpc3RvcnkuICovCisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybiBoaXN0X2NoYXIydHlwZShjY2xpbmUuY21kZmlyc3RjKTsKKworICAgIGZvciAoaSA9IDA7IGhpc3RvcnlfbmFtZXNbaV0gIT0gTlVMTDsgKytpKQorCWlmIChTVFJOSUNNUChuYW1lLCBoaXN0b3J5X25hbWVzW2ldLCBsZW4pID09IDApCisJICAgIHJldHVybiBpOworCisgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSI6PUA+Py8iLCBuYW1lWzBdKSAhPSBOVUxMICYmIG5hbWVbMV0gPT0gTlVMKQorCXJldHVybiBoaXN0X2NoYXIydHlwZShuYW1lWzBdKTsKKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAlsYXN0X21hcHRpY2sgPSAtMTsJLyogbGFzdCBzZWVuIG1hcHRpY2sgKi8KKworLyoKKyAqIEFkZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSBnaXZlbiBoaXN0b3J5LiAgSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGluIHRoZQorICogaGlzdG9yeSB0aGVuIGl0IGlzIG1vdmVkIHRvIHRoZSBmcm9udC4gICJoaXN0eXBlIiBtYXkgYmUgb25lIG9mIGhlIEhJU1RfCisgKiB2YWx1ZXMuCisgKi8KKyAgICB2b2lkCithZGRfdG9faGlzdG9yeShoaXN0eXBlLCBuZXdfZW50cnksIGluX21hcCwgc2VwKQorICAgIGludAkJaGlzdHlwZTsKKyAgICBjaGFyX3UJKm5ld19lbnRyeTsKKyAgICBpbnQJCWluX21hcDsJCS8qIGNvbnNpZGVyIG1hcHRpY2sgd2hlbiBpbnNpZGUgYSBtYXBwaW5nICovCisgICAgaW50CQlzZXA7CQkvKiBzZXBhcmF0b3IgY2hhcmFjdGVyIHVzZWQgKHNlYXJjaCBoaXN0KSAqLworeworICAgIGhpc3RlbnRyeV9UCSpoaXNwdHI7CisgICAgaW50CQlsZW47CisKKyAgICBpZiAoaGlzbGVuID09IDApCQkvKiBubyBoaXN0b3J5ICovCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBTZWFyY2hlcyBpbnNpZGUgdGhlIHNhbWUgbWFwcGluZyBvdmVyd3JpdGUgZWFjaCBvdGhlciwgc28gdGhhdCBvbmx5CisgICAgICogdGhlIGxhc3QgbGluZSBpcyBrZXB0LiAgQmUgY2FyZWZ1bCBub3QgdG8gcmVtb3ZlIGEgbGluZSB0aGF0IHdhcyBtb3ZlZAorICAgICAqIGRvd24sIG9ubHkgbGluZXMgdGhhdCB3ZXJlIGFkZGVkLgorICAgICAqLworICAgIGlmIChoaXN0eXBlID09IEhJU1RfU0VBUkNIICYmIGluX21hcCkKKyAgICB7CisJaWYgKG1hcHRpY2sgPT0gbGFzdF9tYXB0aWNrKQorCXsKKwkgICAgLyogQ3VycmVudCBsaW5lIGlzIGZyb20gdGhlIHNhbWUgbWFwcGluZywgcmVtb3ZlIGl0ICovCisJICAgIGhpc3B0ciA9ICZoaXN0b3J5W0hJU1RfU0VBUkNIXVtoaXNpZHhbSElTVF9TRUFSQ0hdXTsKKwkgICAgdmltX2ZyZWUoaGlzcHRyLT5oaXNzdHIpOworCSAgICBoaXNwdHItPmhpc3N0ciA9IE5VTEw7CisJICAgIGhpc3B0ci0+aGlzbnVtID0gMDsKKwkgICAgLS1oaXNudW1baGlzdHlwZV07CisJICAgIGlmICgtLWhpc2lkeFtISVNUX1NFQVJDSF0gPCAwKQorCQloaXNpZHhbSElTVF9TRUFSQ0hdID0gaGlzbGVuIC0gMTsKKwl9CisJbGFzdF9tYXB0aWNrID0gLTE7CisgICAgfQorICAgIGlmICghaW5faGlzdG9yeShoaXN0eXBlLCBuZXdfZW50cnksIFRSVUUpKQorICAgIHsKKwlpZiAoKytoaXNpZHhbaGlzdHlwZV0gPT0gaGlzbGVuKQorCSAgICBoaXNpZHhbaGlzdHlwZV0gPSAwOworCWhpc3B0ciA9ICZoaXN0b3J5W2hpc3R5cGVdW2hpc2lkeFtoaXN0eXBlXV07CisJdmltX2ZyZWUoaGlzcHRyLT5oaXNzdHIpOworCisJLyogU3RvcmUgdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgTlVMIG9mIHRoZSBzdHJpbmcuICovCisJbGVuID0gU1RSTEVOKG5ld19lbnRyeSk7CisJaGlzcHRyLT5oaXNzdHIgPSB2aW1fc3RybnNhdmUobmV3X2VudHJ5LCBsZW4gKyAyKTsKKwlpZiAoaGlzcHRyLT5oaXNzdHIgIT0gTlVMTCkKKwkgICAgaGlzcHRyLT5oaXNzdHJbbGVuICsgMV0gPSBzZXA7CisKKwloaXNwdHItPmhpc251bSA9ICsraGlzbnVtW2hpc3R5cGVdOworCWlmIChoaXN0eXBlID09IEhJU1RfU0VBUkNIICYmIGluX21hcCkKKwkgICAgbGFzdF9tYXB0aWNrID0gbWFwdGljazsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEdldCBpZGVudGlmaWVyIG9mIG5ld2VzdCBoaXN0b3J5IGVudHJ5LgorICogImhpc3R5cGUiIG1heSBiZSBvbmUgb2YgdGhlIEhJU1RfIHZhbHVlcy4KKyAqLworICAgIGludAorZ2V0X2hpc3RvcnlfaWR4KGhpc3R5cGUpCisgICAgaW50CSAgICBoaXN0eXBlOworeworICAgIGlmIChoaXNsZW4gPT0gMCB8fCBoaXN0eXBlIDwgMCB8fCBoaXN0eXBlID49IEhJU1RfQ09VTlQKKwkJICAgIHx8IGhpc2lkeFtoaXN0eXBlXSA8IDApCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGhpc3RvcnlbaGlzdHlwZV1baGlzaWR4W2hpc3R5cGVdXS5oaXNudW07Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIGluIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBPbmx5IHdvcmtzIHdoZW4gdGhlIGNvbW1hbmQgbGluZSBpcyBiZWluZyBlZGl0ZWQuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBzb21ldGhpbmcgaXMgd3JvbmcuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X2NtZGxpbmVfc3RyKCkKK3sKKyAgICBpZiAoY2NsaW5lLmNtZGJ1ZmYgPT0gTlVMTCB8fCAoU3RhdGUgJiBDTURMSU5FKSA9PSAwKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiB2aW1fc3RybnNhdmUoY2NsaW5lLmNtZGJ1ZmYsIGNjbGluZS5jbWRsZW4pOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IGNvbW1hbmQgbGluZSBwb3NpdGlvbiwgY291bnRlZCBpbiBieXRlcy4KKyAqIFplcm8gaXMgdGhlIGZpcnN0IHBvc2l0aW9uLgorICogT25seSB3b3JrcyB3aGVuIHRoZSBjb21tYW5kIGxpbmUgaXMgYmVpbmcgZWRpdGVkLgorICogUmV0dXJucyAtMSB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKyAqLworICAgIGludAorZ2V0X2NtZGxpbmVfcG9zKCkKK3sKKyAgICBpZiAoY2NsaW5lLmNtZGJ1ZmYgPT0gTlVMTCB8fCAoU3RhdGUgJiBDTURMSU5FKSA9PSAwKQorCXJldHVybiAtMTsKKyAgICByZXR1cm4gY2NsaW5lLmNtZHBvczsKK30KKworLyoKKyAqIFNldCB0aGUgY29tbWFuZCBsaW5lIGJ5dGUgcG9zaXRpb24gdG8gInBvcyIuICBaZXJvIGlzIHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAqIE9ubHkgd29ya3Mgd2hlbiB0aGUgY29tbWFuZCBsaW5lIGlzIGJlaW5nIGVkaXRlZC4KKyAqIFJldHVybnMgMSB3aGVuIGZhaWxlZCwgMCB3aGVuIE9LLgorICovCisgICAgaW50CitzZXRfY21kbGluZV9wb3MocG9zKQorICAgIGludAkJcG9zOworeworICAgIGlmIChjY2xpbmUuY21kYnVmZiA9PSBOVUxMIHx8IChTdGF0ZSAmIENNRExJTkUpID09IDApCisJcmV0dXJuIDE7CisKKyAgICAvKiBUaGUgcG9zaXRpb24gaXMgbm90IHNldCBkaXJlY3RseSBidXQgYWZ0ZXIgQ1RSTC1cIGUgb3IgQ1RSTC1SID0gaGFzCisgICAgICogY2hhbmdlZCB0aGUgY29tbWFuZCBsaW5lLiAqLworICAgIGlmIChwb3MgPCAwKQorCW5ld19jbWRwb3MgPSAwOworICAgIGVsc2UKKwluZXdfY21kcG9zID0gcG9zOworICAgIHJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIGhpc3RvcnkgaW5kZXggZnJvbSBhIG51bWJlcjoKKyAqICAgbnVtID4gMDogc2VlbiBhcyBpZGVudGlmeWluZyBudW1iZXIgb2YgYSBoaXN0b3J5IGVudHJ5CisgKiAgIG51bSA8IDA6IHJlbGF0aXZlIHBvc2l0aW9uIGluIGhpc3Rvcnkgd3J0IG5ld2VzdCBlbnRyeQorICogImhpc3R5cGUiIG1heSBiZSBvbmUgb2YgdGhlIEhJU1RfIHZhbHVlcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NhbGNfaGlzdF9pZHgoaGlzdHlwZSwgbnVtKQorICAgIGludAkJaGlzdHlwZTsKKyAgICBpbnQJCW51bTsKK3sKKyAgICBpbnQJCWk7CisgICAgaGlzdGVudHJ5X1QJKmhpc3Q7CisgICAgaW50CQl3cmFwcGVkID0gRkFMU0U7CisKKyAgICBpZiAoaGlzbGVuID09IDAgfHwgaGlzdHlwZSA8IDAgfHwgaGlzdHlwZSA+PSBISVNUX0NPVU5UCisJCSAgICB8fCAoaSA9IGhpc2lkeFtoaXN0eXBlXSkgPCAwIHx8IG51bSA9PSAwKQorCXJldHVybiAtMTsKKworICAgIGhpc3QgPSBoaXN0b3J5W2hpc3R5cGVdOworICAgIGlmIChudW0gPiAwKQorICAgIHsKKwl3aGlsZSAoaGlzdFtpXS5oaXNudW0gPiBudW0pCisJICAgIGlmICgtLWkgPCAwKQorCSAgICB7CisJCWlmICh3cmFwcGVkKQorCQkgICAgYnJlYWs7CisJCWkgKz0gaGlzbGVuOworCQl3cmFwcGVkID0gVFJVRTsKKwkgICAgfQorCWlmIChoaXN0W2ldLmhpc251bSA9PSBudW0gJiYgaGlzdFtpXS5oaXNzdHIgIT0gTlVMTCkKKwkgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGVsc2UgaWYgKC1udW0gPD0gaGlzbGVuKQorICAgIHsKKwlpICs9IG51bSArIDE7CisJaWYgKGkgPCAwKQorCSAgICBpICs9IGhpc2xlbjsKKwlpZiAoaGlzdFtpXS5oaXNzdHIgIT0gTlVMTCkKKwkgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIEdldCBhIGhpc3RvcnkgZW50cnkgYnkgaXRzIGluZGV4LgorICogImhpc3R5cGUiIG1heSBiZSBvbmUgb2YgdGhlIEhJU1RfIHZhbHVlcy4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfaGlzdG9yeV9lbnRyeShoaXN0eXBlLCBpZHgpCisgICAgaW50CSAgICBoaXN0eXBlOworICAgIGludAkgICAgaWR4OworeworICAgIGlkeCA9IGNhbGNfaGlzdF9pZHgoaGlzdHlwZSwgaWR4KTsKKyAgICBpZiAoaWR4ID49IDApCisJcmV0dXJuIGhpc3RvcnlbaGlzdHlwZV1baWR4XS5oaXNzdHI7CisgICAgZWxzZQorCXJldHVybiAoY2hhcl91ICopIiI7Cit9CisKKy8qCisgKiBDbGVhciBhbGwgZW50cmllcyBvZiBhIGhpc3RvcnkuCisgKiAiaGlzdHlwZSIgbWF5IGJlIG9uZSBvZiB0aGUgSElTVF8gdmFsdWVzLgorICovCisgICAgaW50CitjbHJfaGlzdG9yeShoaXN0eXBlKQorICAgIGludAkJaGlzdHlwZTsKK3sKKyAgICBpbnQJCWk7CisgICAgaGlzdGVudHJ5X1QJKmhpc3B0cjsKKworICAgIGlmIChoaXNsZW4gIT0gMCAmJiBoaXN0eXBlID49IDAgJiYgaGlzdHlwZSA8IEhJU1RfQ09VTlQpCisgICAgeworCWhpc3B0ciA9IGhpc3RvcnlbaGlzdHlwZV07CisJZm9yIChpID0gaGlzbGVuOyBpLS07KQorCXsKKwkgICAgdmltX2ZyZWUoaGlzcHRyLT5oaXNzdHIpOworCSAgICBoaXNwdHItPmhpc251bSA9IDA7CisJICAgIGhpc3B0cisrLT5oaXNzdHIgPSBOVUxMOworCX0KKwloaXNpZHhbaGlzdHlwZV0gPSAtMTsJLyogbWFyayBoaXN0b3J5IGFzIGNsZWFyZWQgKi8KKwloaXNudW1baGlzdHlwZV0gPSAwOwkvKiByZXNldCBpZGVudGlmaWVyIGNvdW50ZXIgKi8KKwlyZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogUmVtb3ZlIGFsbCBlbnRyaWVzIG1hdGNoaW5nIHtzdHJ9IGZyb20gYSBoaXN0b3J5LgorICogImhpc3R5cGUiIG1heSBiZSBvbmUgb2YgdGhlIEhJU1RfIHZhbHVlcy4KKyAqLworICAgIGludAorZGVsX2hpc3RvcnlfZW50cnkoaGlzdHlwZSwgc3RyKQorICAgIGludAkJaGlzdHlwZTsKKyAgICBjaGFyX3UJKnN0cjsKK3sKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworICAgIGhpc3RlbnRyeV9UCSpoaXNwdHI7CisgICAgaW50CQlpZHg7CisgICAgaW50CQlpOworICAgIGludAkJbGFzdDsKKyAgICBpbnQJCWZvdW5kID0gRkFMU0U7CisKKyAgICByZWdtYXRjaC5yZWdwcm9nID0gTlVMTDsKKyAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwkvKiBhbHdheXMgbWF0Y2ggY2FzZSAqLworICAgIGlmIChoaXNsZW4gIT0gMAorCSAgICAmJiBoaXN0eXBlID49IDAKKwkgICAgJiYgaGlzdHlwZSA8IEhJU1RfQ09VTlQKKwkgICAgJiYgKnN0ciAhPSBOVUwKKwkgICAgJiYgKGlkeCA9IGhpc2lkeFtoaXN0eXBlXSkgPj0gMAorCSAgICAmJiAocmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKHN0ciwgUkVfTUFHSUMgKyBSRV9TVFJJTkcpKQorCQkJCQkJCQkgICAgICAhPSBOVUxMKQorICAgIHsKKwlpID0gbGFzdCA9IGlkeDsKKwlkbworCXsKKwkgICAgaGlzcHRyID0gJmhpc3RvcnlbaGlzdHlwZV1baV07CisJICAgIGlmIChoaXNwdHItPmhpc3N0ciA9PSBOVUxMKQorCQlicmVhazsKKwkgICAgaWYgKHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgaGlzcHRyLT5oaXNzdHIsIChjb2xucl9UKTApKQorCSAgICB7CisJCWZvdW5kID0gVFJVRTsKKwkJdmltX2ZyZWUoaGlzcHRyLT5oaXNzdHIpOworCQloaXNwdHItPmhpc3N0ciA9IE5VTEw7CisJCWhpc3B0ci0+aGlzbnVtID0gMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKGkgIT0gbGFzdCkKKwkJeworCQkgICAgaGlzdG9yeVtoaXN0eXBlXVtsYXN0XSA9ICpoaXNwdHI7CisJCSAgICBoaXNwdHItPmhpc3N0ciA9IE5VTEw7CisJCSAgICBoaXNwdHItPmhpc251bSA9IDA7CisJCX0KKwkJaWYgKC0tbGFzdCA8IDApCisJCSAgICBsYXN0ICs9IGhpc2xlbjsKKwkgICAgfQorCSAgICBpZiAoLS1pIDwgMCkKKwkJaSArPSBoaXNsZW47CisJfSB3aGlsZSAoaSAhPSBpZHgpOworCWlmIChoaXN0b3J5W2hpc3R5cGVdW2lkeF0uaGlzc3RyID09IE5VTEwpCisJICAgIGhpc2lkeFtoaXN0eXBlXSA9IC0xOworICAgIH0KKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKy8qCisgKiBSZW1vdmUgYW4gaW5kZXhlZCBlbnRyeSBmcm9tIGEgaGlzdG9yeS4KKyAqICJoaXN0eXBlIiBtYXkgYmUgb25lIG9mIHRoZSBISVNUXyB2YWx1ZXMuCisgKi8KKyAgICBpbnQKK2RlbF9oaXN0b3J5X2lkeChoaXN0eXBlLCBpZHgpCisgICAgaW50CSAgICBoaXN0eXBlOworICAgIGludAkgICAgaWR4OworeworICAgIGludAkgICAgaSwgajsKKworICAgIGkgPSBjYWxjX2hpc3RfaWR4KGhpc3R5cGUsIGlkeCk7CisgICAgaWYgKGkgPCAwKQorCXJldHVybiBGQUxTRTsKKyAgICBpZHggPSBoaXNpZHhbaGlzdHlwZV07CisgICAgdmltX2ZyZWUoaGlzdG9yeVtoaXN0eXBlXVtpXS5oaXNzdHIpOworCisgICAgLyogV2hlbiBkZWxldGluZyB0aGUgbGFzdCBhZGRlZCBzZWFyY2ggc3RyaW5nIGluIGEgbWFwcGluZywgcmVzZXQKKyAgICAgKiBsYXN0X21hcHRpY2ssIHNvIHRoYXQgdGhlIGxhc3QgYWRkZWQgc2VhcmNoIHN0cmluZyBpc24ndCBkZWxldGVkIGFnYWluLgorICAgICAqLworICAgIGlmIChoaXN0eXBlID09IEhJU1RfU0VBUkNIICYmIG1hcHRpY2sgPT0gbGFzdF9tYXB0aWNrICYmIGkgPT0gaWR4KQorCWxhc3RfbWFwdGljayA9IC0xOworCisgICAgd2hpbGUgKGkgIT0gaWR4KQorICAgIHsKKwlqID0gKGkgKyAxKSAlIGhpc2xlbjsKKwloaXN0b3J5W2hpc3R5cGVdW2ldID0gaGlzdG9yeVtoaXN0eXBlXVtqXTsKKwlpID0gajsKKyAgICB9CisgICAgaGlzdG9yeVtoaXN0eXBlXVtpXS5oaXNzdHIgPSBOVUxMOworICAgIGhpc3RvcnlbaGlzdHlwZV1baV0uaGlzbnVtID0gMDsKKyAgICBpZiAoLS1pIDwgMCkKKwlpICs9IGhpc2xlbjsKKyAgICBoaXNpZHhbaGlzdHlwZV0gPSBpOworICAgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRkVBVF9FVkFMICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQ1JZUFQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVmVyeSBzcGVjaWZpYyBmdW5jdGlvbiB0byByZW1vdmUgdGhlIHZhbHVlIGluICI6c2V0IGtleT12YWwiIGZyb20gdGhlCisgKiBoaXN0b3J5LgorICovCisgICAgdm9pZAorcmVtb3ZlX2tleV9mcm9tX2hpc3RvcnkoKQoreworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisKKyAgICBpID0gaGlzaWR4W0hJU1RfQ01EXTsKKyAgICBpZiAoaSA8IDApCisJcmV0dXJuOworICAgIHAgPSBoaXN0b3J5W0hJU1RfQ01EXVtpXS5oaXNzdHI7CisgICAgaWYgKHAgIT0gTlVMTCkKKwlmb3IgKCA7ICpwOyArK3ApCisJICAgIGlmIChTVFJOQ01QKHAsICJrZXkiLCAzKSA9PSAwICYmICFpc2FscGhhKHBbM10pKQorCSAgICB7CisJCXAgPSB2aW1fc3RyY2hyKHAgKyAzLCAnPScpOworCQlpZiAocCA9PSBOVUxMKQorCQkgICAgYnJlYWs7CisJCSsrcDsKKwkJZm9yIChpID0gMDsgcFtpXSAmJiAhdmltX2lzd2hpdGUocFtpXSk7ICsraSkKKwkJICAgIGlmIChwW2ldID09ICdcXCcgJiYgcFtpICsgMV0pCisJCQkrK2k7CisJCW1jaF9tZW1tb3ZlKHAsIHAgKyBpLCBTVFJMRU4ocCArIGkpICsgMSk7CisJCS0tcDsKKwkgICAgfQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGRUFUX0NNREhJU1QgKi8KKworI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkgfHwgZGVmaW5lZChGRUFUX0NNREhJU1QpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogR2V0IGluZGljZXMgIm51bTEsbnVtMiIgdGhhdCBzcGVjaWZ5IGEgcmFuZ2Ugd2l0aGluIGEgbGlzdCAobm90IGEgcmFuZ2Ugb2YKKyAqIHRleHQgbGluZXMgaW4gYSBidWZmZXIhKSBmcm9tIGEgc3RyaW5nLiAgVXNlZCBmb3IgIjpoaXN0b3J5IiBhbmQgIjpjbGlzdCIuCisgKiBSZXR1cm5zIE9LIGlmIHBhcnNlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBGQUlMLgorICovCisgICAgaW50CitnZXRfbGlzdF9yYW5nZShzdHIsIG51bTEsIG51bTIpCisgICAgY2hhcl91CSoqc3RyOworICAgIGludAkJKm51bTE7CisgICAgaW50CQkqbnVtMjsKK3sKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWZpcnN0ID0gRkFMU0U7CisgICAgbG9uZwludW07CisKKyAgICAqc3RyID0gc2tpcHdoaXRlKCpzdHIpOworICAgIGlmICgqKnN0ciA9PSAnLScgfHwgdmltX2lzZGlnaXQoKipzdHIpKSAgLyogcGFyc2UgImZyb20iIHBhcnQgb2YgcmFuZ2UgKi8KKyAgICB7CisJdmltX3N0cjJucigqc3RyLCBOVUxMLCAmbGVuLCBGQUxTRSwgRkFMU0UsICZudW0sIE5VTEwpOworCSpzdHIgKz0gbGVuOworCSpudW0xID0gKGludCludW07CisJZmlyc3QgPSBUUlVFOworICAgIH0KKyAgICAqc3RyID0gc2tpcHdoaXRlKCpzdHIpOworICAgIGlmICgqKnN0ciA9PSAnLCcpCQkJLyogcGFyc2UgInRvIiBwYXJ0IG9mIHJhbmdlICovCisgICAgeworCSpzdHIgPSBza2lwd2hpdGUoKnN0ciArIDEpOworCXZpbV9zdHIybnIoKnN0ciwgTlVMTCwgJmxlbiwgRkFMU0UsIEZBTFNFLCAmbnVtLCBOVUxMKTsKKwlpZiAobGVuID4gMCkKKwl7CisJICAgICpudW0yID0gKGludCludW07CisJICAgICpzdHIgPSBza2lwd2hpdGUoKnN0ciArIGxlbik7CisJfQorCWVsc2UgaWYgKCFmaXJzdCkJCS8qIG5vIG51bWJlciBnaXZlbiBhdCBhbGwgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGVsc2UgaWYgKGZpcnN0KQkJCS8qIG9ubHkgb25lIG51bWJlciBnaXZlbiAqLworCSpudW0yID0gKm51bTE7CisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ESElTVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiA6aGlzdG9yeSBjb21tYW5kIC0gcHJpbnQgYSBoaXN0b3J5CisgKi8KKyAgICB2b2lkCitleF9oaXN0b3J5KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaGlzdGVudHJ5X1QJKmhpc3Q7CisgICAgaW50CQloaXN0eXBlMSA9IEhJU1RfQ01EOworICAgIGludAkJaGlzdHlwZTIgPSBISVNUX0NNRDsKKyAgICBpbnQJCWhpc2lkeDEgPSAxOworICAgIGludAkJaGlzaWR4MiA9IC0xOworICAgIGludAkJaWR4OworICAgIGludAkJaSwgaiwgazsKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOworCisgICAgaWYgKGhpc2xlbiA9PSAwKQorICAgIHsKKwlNU0coXygiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIShWSU1fSVNESUdJVCgqYXJnKSB8fCAqYXJnID09ICctJyB8fCAqYXJnID09ICcsJykpCisgICAgeworCWVuZCA9IGFyZzsKKwl3aGlsZSAoQVNDSUlfSVNBTFBIQSgqZW5kKQorCQl8fCB2aW1fc3RyY2hyKChjaGFyX3UgKikiOj1APi8/IiwgKmVuZCkgIT0gTlVMTCkKKwkgICAgZW5kKys7CisJaSA9ICplbmQ7CisJKmVuZCA9IE5VTDsKKwloaXN0eXBlMSA9IGdldF9oaXN0dHlwZShhcmcpOworCWlmIChoaXN0eXBlMSA9PSAtMSkKKwl7CisJICAgIGlmIChTVFJJQ01QKGFyZywgImFsbCIpID09IDApCisJICAgIHsKKwkJaGlzdHlwZTEgPSAwOworCQloaXN0eXBlMiA9IEhJU1RfQ09VTlQtMTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJKmVuZCA9IGk7CisJCUVNU0coXyhlX3RyYWlsaW5nKSk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIGhpc3R5cGUyID0gaGlzdHlwZTE7CisJKmVuZCA9IGk7CisgICAgfQorICAgIGVsc2UKKwllbmQgPSBhcmc7CisgICAgaWYgKCFnZXRfbGlzdF9yYW5nZSgmZW5kLCAmaGlzaWR4MSwgJmhpc2lkeDIpIHx8ICplbmQgIT0gTlVMKQorICAgIHsKKwlFTVNHKF8oZV90cmFpbGluZykpOworCXJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKDsgIWdvdF9pbnQgJiYgaGlzdHlwZTEgPD0gaGlzdHlwZTI7ICsraGlzdHlwZTEpCisgICAgeworCVNUUkNQWShJT2J1ZmYsICJcbiAgICAgICMgICIpOworCVNUUkNBVChTVFJDQVQoSU9idWZmLCBoaXN0b3J5X25hbWVzW2hpc3R5cGUxXSksICIgaGlzdG9yeSIpOworCU1TR19QVVRTX1RJVExFKElPYnVmZik7CisJaWR4ID0gaGlzaWR4W2hpc3R5cGUxXTsKKwloaXN0ID0gaGlzdG9yeVtoaXN0eXBlMV07CisJaiA9IGhpc2lkeDE7CisJayA9IGhpc2lkeDI7CisJaWYgKGogPCAwKQorCSAgICBqID0gKC1qID4gaGlzbGVuKSA/IDAgOiBoaXN0WyhoaXNsZW4raitpZHgrMSkgJSBoaXNsZW5dLmhpc251bTsKKwlpZiAoayA8IDApCisJICAgIGsgPSAoLWsgPiBoaXNsZW4pID8gMCA6IGhpc3RbKGhpc2xlbitrK2lkeCsxKSAlIGhpc2xlbl0uaGlzbnVtOworCWlmIChpZHggPj0gMCAmJiBqIDw9IGspCisJICAgIGZvciAoaSA9IGlkeCArIDE7ICFnb3RfaW50OyArK2kpCisJICAgIHsKKwkJaWYgKGkgPT0gaGlzbGVuKQorCQkgICAgaSA9IDA7CisJCWlmIChoaXN0W2ldLmhpc3N0ciAhPSBOVUxMCisJCQkmJiBoaXN0W2ldLmhpc251bSA+PSBqICYmIGhpc3RbaV0uaGlzbnVtIDw9IGspCisJCXsKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCQkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgIiVjJTZkICAiLCBpID09IGlkeCA/ICc+JyA6ICcgJywKKwkJCQkJCQkgICAgICBoaXN0W2ldLmhpc251bSk7CisJCSAgICBpZiAodmltX3N0cnNpemUoaGlzdFtpXS5oaXNzdHIpID4gKGludClDb2x1bW5zIC0gMTApCisJCQl0cnVuY19zdHJpbmcoaGlzdFtpXS5oaXNzdHIsIElPYnVmZiArIFNUUkxFTihJT2J1ZmYpLAorCQkJCQkJCSAgIChpbnQpQ29sdW1ucyAtIDEwKTsKKwkJICAgIGVsc2UKKwkJCVNUUkNBVChJT2J1ZmYsIGhpc3RbaV0uaGlzc3RyKTsKKwkJICAgIG1zZ19vdXR0cmFucyhJT2J1ZmYpOworCQkgICAgb3V0X2ZsdXNoKCk7CisJCX0KKwkJaWYgKGkgPT0gaWR4KQorCQkgICAgYnJlYWs7CisJICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKEZFQVRfVklNSU5GTykgJiYgZGVmaW5lZChGRUFUX0NNREhJU1QpKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGNoYXJfdSAqKnZpbWluZm9faGlzdG9yeVtISVNUX0NPVU5UXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBpbnQJdmltaW5mb19oaXNpZHhbSElTVF9DT1VOVF0gPSB7MCwgMCwgMCwgMH07CitzdGF0aWMgaW50CXZpbWluZm9faGlzbGVuW0hJU1RfQ09VTlRdID0gezAsIDAsIDAsIDB9Oworc3RhdGljIGludAl2aW1pbmZvX2FkZF9hdF9mcm9udCA9IEZBTFNFOworCitzdGF0aWMgaW50CWhpc3RfdHlwZTJjaGFyIF9fQVJHUygoaW50IHR5cGUsIGludCB1c2VfcXVlc3Rpb24pKTsKKworLyoKKyAqIFRyYW5zbGF0ZSBhIGhpc3RvcnkgdHlwZSBudW1iZXIgdG8gdGhlIGFzc29jaWF0ZWQgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIGludAoraGlzdF90eXBlMmNoYXIodHlwZSwgdXNlX3F1ZXN0aW9uKQorICAgIGludAkgICAgdHlwZTsKKyAgICBpbnQJICAgIHVzZV9xdWVzdGlvbjsJICAgIC8qIHVzZSAnPycgaW5zdGVhZCBvZiAnLycgKi8KK3sKKyAgICBpZiAodHlwZSA9PSBISVNUX0NNRCkKKwlyZXR1cm4gJzonOworICAgIGlmICh0eXBlID09IEhJU1RfU0VBUkNIKQorICAgIHsKKwlpZiAodXNlX3F1ZXN0aW9uKQorCSAgICByZXR1cm4gJz8nOworCWVsc2UKKwkgICAgcmV0dXJuICcvJzsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gSElTVF9FWFBSKQorCXJldHVybiAnPSc7CisgICAgcmV0dXJuICdAJzsKK30KKworLyoKKyAqIFByZXBhcmUgZm9yIHJlYWRpbmcgdGhlIGhpc3RvcnkgZnJvbSB0aGUgdmltaW5mbyBmaWxlLgorICogVGhpcyBhbGxvY2F0ZXMgaGlzdG9yeSBhcnJheXMgdG8gc3RvcmUgdGhlIHJlYWQgaGlzdG9yeSBsaW5lcy4KKyAqLworICAgIHZvaWQKK3ByZXBhcmVfdmltaW5mb19oaXN0b3J5KGFza2xlbikKKyAgICBpbnQJICAgIGFza2xlbjsKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICBudW07CisgICAgaW50CSAgICB0eXBlOworICAgIGludAkgICAgbGVuOworCisgICAgaW5pdF9oaXN0b3J5KCk7CisgICAgdmltaW5mb19hZGRfYXRfZnJvbnQgPSAoYXNrbGVuICE9IDApOworICAgIGlmIChhc2tsZW4gPiBoaXNsZW4pCisJYXNrbGVuID0gaGlzbGVuOworCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IEhJU1RfQ09VTlQ7ICsrdHlwZSkKKyAgICB7CisJLyoKKwkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVtcHR5IHNwYWNlcyBpbiB0aGUgaGlzdG9yeSBsaXN0LiAgSWYgdGhlcmUgYXJlCisJICogbW9yZSBzcGFjZXMgYXZhaWxhYmxlIHRoYW4gd2UgcmVxdWVzdCwgdGhlbiBmaWxsIHRoZW0gdXAuCisJICovCisJZm9yIChpID0gMCwgbnVtID0gMDsgaSA8IGhpc2xlbjsgaSsrKQorCSAgICBpZiAoaGlzdG9yeVt0eXBlXVtpXS5oaXNzdHIgPT0gTlVMTCkKKwkJbnVtKys7CisJbGVuID0gYXNrbGVuOworCWlmIChudW0gPiBsZW4pCisJICAgIGxlbiA9IG51bTsKKwlpZiAobGVuIDw9IDApCisJICAgIHZpbWluZm9faGlzdG9yeVt0eXBlXSA9IE5VTEw7CisJZWxzZQorCSAgICB2aW1pbmZvX2hpc3RvcnlbdHlwZV0gPQorCQkgICAoY2hhcl91ICoqKWxhbGxvYygobG9uZ191KShsZW4gKiBzaXplb2YoY2hhcl91ICopKSwgRkFMU0UpOworCWlmICh2aW1pbmZvX2hpc3RvcnlbdHlwZV0gPT0gTlVMTCkKKwkgICAgbGVuID0gMDsKKwl2aW1pbmZvX2hpc2xlblt0eXBlXSA9IGxlbjsKKwl2aW1pbmZvX2hpc2lkeFt0eXBlXSA9IDA7CisgICAgfQorfQorCisvKgorICogQWNjZXB0IGEgbGluZSBmcm9tIHRoZSB2aW1pbmZvLCBzdG9yZSBpdCBpbiB0aGUgaGlzdG9yeSBhcnJheSB3aGVuIGl0J3MKKyAqIG5ldy4KKyAqLworICAgIGludAorcmVhZF92aW1pbmZvX2hpc3RvcnkodmlycCkKKyAgICB2aXJfVAkqdmlycDsKK3sKKyAgICBpbnQJCXR5cGU7CisgICAgbG9uZ191CWxlbjsKKyAgICBjaGFyX3UJKnZhbDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICB0eXBlID0gaGlzdF9jaGFyMnR5cGUodmlycC0+dmlyX2xpbmVbMF0pOworICAgIGlmICh2aW1pbmZvX2hpc2lkeFt0eXBlXSA8IHZpbWluZm9faGlzbGVuW3R5cGVdKQorICAgIHsKKwl2YWwgPSB2aW1pbmZvX3JlYWRzdHJpbmcodmlycCwgMSwgVFJVRSk7CisJaWYgKHZhbCAhPSBOVUxMICYmICp2YWwgIT0gTlVMKQorCXsKKwkgICAgaWYgKCFpbl9oaXN0b3J5KHR5cGUsIHZhbCArICh0eXBlID09IEhJU1RfU0VBUkNIKSwKKwkJCQkJCQl2aW1pbmZvX2FkZF9hdF9mcm9udCkpCisJICAgIHsKKwkJLyogTmVlZCB0byByZS1hbGxvY2F0ZSB0byBhcHBlbmQgdGhlIHNlcGFyYXRvciBieXRlLiAqLworCQlsZW4gPSBTVFJMRU4odmFsKTsKKwkJcCA9IGxhbGxvYyhsZW4gKyAyLCBUUlVFKTsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJeworCQkgICAgaWYgKHR5cGUgPT0gSElTVF9TRUFSQ0gpCisJCSAgICB7CisJCQkvKiBTZWFyY2ggZW50cnk6IE1vdmUgdGhlIHNlcGFyYXRvciBmcm9tIHRoZSBmaXJzdAorCQkJICogY29sdW1uIHRvIGFmdGVyIHRoZSBOVUwuICovCisJCQltY2hfbWVtbW92ZShwLCB2YWwgKyAxLCAoc2l6ZV90KWxlbik7CisJCQlwW2xlbl0gPSAoKnZhbCA9PSAnICcgPyBOVUwgOiAqdmFsKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIE5vdCBhIHNlYXJjaCBlbnRyeTogTm8gc2VwYXJhdG9yIGluIHRoZSB2aW1pbmZvCisJCQkgKiBmaWxlLCBhZGQgYSBOVUwgc2VwYXJhdG9yLiAqLworCQkJbWNoX21lbW1vdmUocCwgdmFsLCAoc2l6ZV90KWxlbiArIDEpOworCQkJcFtsZW4gKyAxXSA9IE5VTDsKKwkJICAgIH0KKwkJICAgIHZpbWluZm9faGlzdG9yeVt0eXBlXVt2aW1pbmZvX2hpc2lkeFt0eXBlXSsrXSA9IHA7CisJCX0KKwkgICAgfQorCX0KKwl2aW1fZnJlZSh2YWwpOworICAgIH0KKyAgICByZXR1cm4gdmltaW5mb19yZWFkbGluZSh2aXJwKTsKK30KKworICAgIHZvaWQKK2ZpbmlzaF92aW1pbmZvX2hpc3RvcnkoKQoreworICAgIGludCBpZHg7CisgICAgaW50IGk7CisgICAgaW50CXR5cGU7CisKKyAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgSElTVF9DT1VOVDsgKyt0eXBlKQorICAgIHsKKwlpZiAoaGlzdG9yeVt0eXBlXSA9PSBOVUxMKQorCSAgICByZXR1cm47CisJaWR4ID0gaGlzaWR4W3R5cGVdICsgdmltaW5mb19oaXNpZHhbdHlwZV07CisJaWYgKGlkeCA+PSBoaXNsZW4pCisJICAgIGlkeCAtPSBoaXNsZW47CisJZWxzZSBpZiAoaWR4IDwgMCkKKwkgICAgaWR4ID0gaGlzbGVuIC0gMTsKKwlpZiAodmltaW5mb19hZGRfYXRfZnJvbnQpCisJICAgIGhpc2lkeFt0eXBlXSA9IGlkeDsKKwllbHNlCisJeworCSAgICBpZiAoaGlzaWR4W3R5cGVdID09IC0xKQorCQloaXNpZHhbdHlwZV0gPSBoaXNsZW4gLSAxOworCSAgICBkbworCSAgICB7CisJCWlmIChoaXN0b3J5W3R5cGVdW2lkeF0uaGlzc3RyICE9IE5VTEwpCisJCSAgICBicmVhazsKKwkJaWYgKCsraWR4ID09IGhpc2xlbikKKwkJICAgIGlkeCA9IDA7CisJICAgIH0gd2hpbGUgKGlkeCAhPSBoaXNpZHhbdHlwZV0pOworCSAgICBpZiAoaWR4ICE9IGhpc2lkeFt0eXBlXSAmJiAtLWlkeCA8IDApCisJCWlkeCA9IGhpc2xlbiAtIDE7CisJfQorCWZvciAoaSA9IDA7IGkgPCB2aW1pbmZvX2hpc2lkeFt0eXBlXTsgaSsrKQorCXsKKwkgICAgdmltX2ZyZWUoaGlzdG9yeVt0eXBlXVtpZHhdLmhpc3N0cik7CisJICAgIGhpc3RvcnlbdHlwZV1baWR4XS5oaXNzdHIgPSB2aW1pbmZvX2hpc3RvcnlbdHlwZV1baV07CisJICAgIGlmICgtLWlkeCA8IDApCisJCWlkeCA9IGhpc2xlbiAtIDE7CisJfQorCWlkeCArPSAxOworCWlkeCAlPSBoaXNsZW47CisJZm9yIChpID0gMDsgaSA8IHZpbWluZm9faGlzaWR4W3R5cGVdOyBpKyspCisJeworCSAgICBoaXN0b3J5W3R5cGVdW2lkeCsrXS5oaXNudW0gPSArK2hpc251bVt0eXBlXTsKKwkgICAgaWR4ICU9IGhpc2xlbjsKKwl9CisJdmltX2ZyZWUodmltaW5mb19oaXN0b3J5W3R5cGVdKTsKKwl2aW1pbmZvX2hpc3RvcnlbdHlwZV0gPSBOVUxMOworICAgIH0KK30KKworICAgIHZvaWQKK3dyaXRlX3ZpbWluZm9faGlzdG9yeShmcCkKKyAgICBGSUxFICAgICpmcDsKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICB0eXBlOworICAgIGludAkgICAgbnVtX3NhdmVkOworICAgIGNoYXJfdSAgKnA7CisgICAgaW50CSAgICBjOworCisgICAgaW5pdF9oaXN0b3J5KCk7CisgICAgaWYgKGhpc2xlbiA9PSAwKQorCXJldHVybjsKKyAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgSElTVF9DT1VOVDsgKyt0eXBlKQorICAgIHsKKwludW1fc2F2ZWQgPSBnZXRfdmltaW5mb19wYXJhbWV0ZXIoaGlzdF90eXBlMmNoYXIodHlwZSwgRkFMU0UpKTsKKwlpZiAobnVtX3NhdmVkID09IDApCisJICAgIGNvbnRpbnVlOworCWlmIChudW1fc2F2ZWQgPCAwKSAgLyogVXNlIGRlZmF1bHQgKi8KKwkgICAgbnVtX3NhdmVkID0gaGlzbGVuOworCWZwcmludGYoZnAsIF8oIlxuIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIpLAorCQkJICAgIHR5cGUgPT0gSElTVF9DTUQgPyBfKCJDb21tYW5kIExpbmUiKSA6CisJCQkgICAgdHlwZSA9PSBISVNUX1NFQVJDSCA/IF8oIlNlYXJjaCBTdHJpbmciKSA6CisJCQkgICAgdHlwZSA9PSBISVNUX0VYUFIgPyAgXygiRXhwcmVzc2lvbiIpIDoKKwkJCQkJXygiSW5wdXQgTGluZSIpKTsKKwlpZiAobnVtX3NhdmVkID4gaGlzbGVuKQorCSAgICBudW1fc2F2ZWQgPSBoaXNsZW47CisJaSA9IGhpc2lkeFt0eXBlXTsKKwlpZiAoaSA+PSAwKQorCSAgICB3aGlsZSAobnVtX3NhdmVkLS0pCisJICAgIHsKKwkJcCA9IGhpc3RvcnlbdHlwZV1baV0uaGlzc3RyOworCQlpZiAocCAhPSBOVUxMKQorCQl7CisJCSAgICBwdXRjKGhpc3RfdHlwZTJjaGFyKHR5cGUsIFRSVUUpLCBmcCk7CisJCSAgICAvKiBGb3IgdGhlIHNlYXJjaCBoaXN0b3J5OiBwdXQgdGhlIHNlcGFyYXRvciBpbiB0aGUgc2Vjb25kCisJCSAgICAgKiBjb2x1bW47IHVzZSBhIHNwYWNlIGlmIHRoZXJlIGlzbid0IG9uZS4gKi8KKwkJICAgIGlmICh0eXBlID09IEhJU1RfU0VBUkNIKQorCQkgICAgeworCQkJYyA9IHBbU1RSTEVOKHApICsgMV07CisJCQlwdXRjKGMgPT0gTlVMID8gJyAnIDogYywgZnApOworCQkgICAgfQorCQkgICAgdmltaW5mb193cml0ZXN0cmluZyhmcCwgcCk7CisJCX0KKwkJaWYgKC0taSA8IDApCisJCSAgICBpID0gaGlzbGVuIC0gMTsKKwkgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBGRUFUX1ZJTUlORk8gKi8KKworI2lmIGRlZmluZWQoRkVBVF9GS01BUCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBXcml0ZSBhIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBjdXJzb3Irb2Zmc2V0IHBvc2l0aW9uLgorICogSXQgaXMgZGlyZWN0bHkgd3JpdHRlbiBpbnRvIHRoZSBjb21tYW5kIGJ1ZmZlciBibG9jay4KKyAqLworICAgIHZvaWQKK2NtZF9wY2hhcihjLCBvZmZzZXQpCisgICAgaW50CSAgICBjLCBvZmZzZXQ7Cit7CisgICAgaWYgKGNjbGluZS5jbWRwb3MgKyBvZmZzZXQgPj0gY2NsaW5lLmNtZGxlbiB8fCBjY2xpbmUuY21kcG9zICsgb2Zmc2V0IDwgMCkKKyAgICB7CisJRU1TRyhfKCJFMTk4OiBjbWRfcGNoYXIgYmV5b25kIHRoZSBjb21tYW5kIGxlbmd0aCIpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgKyBvZmZzZXRdID0gKGNoYXJfdSljOworICAgIGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRsZW5dID0gTlVMOworfQorCisgICAgaW50CitjbWRfZ2NoYXIob2Zmc2V0KQorICAgIGludAkgICAgb2Zmc2V0OworeworICAgIGlmIChjY2xpbmUuY21kcG9zICsgb2Zmc2V0ID49IGNjbGluZS5jbWRsZW4gfHwgY2NsaW5lLmNtZHBvcyArIG9mZnNldCA8IDApCisgICAgeworCS8qICBFTVNHKF8oImNtZF9nY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIikpOyAqLworCXJldHVybiBOVUw7CisgICAgfQorICAgIHJldHVybiAoaW50KWNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3MgKyBvZmZzZXRdOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01EV0lOKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIE9wZW4gYSB3aW5kb3cgb24gdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIGFuZCBoaXN0b3J5LiAgQWxsb3cgZWRpdGluZyBpbgorICogdGhlIHdpbmRvdy4gIFJldHVybnMgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KKyAqIFJldHVybnM6CisgKglDUgkgaWYgdGhlIGNvbW1hbmQgaXMgdG8gYmUgZXhlY3V0ZWQKKyAqCUN0cmxfQwkgaWYgaXQgaXMgdG8gYmUgYWJhbmRvbmVkCisgKglLX0lHTk9SRSBpZiBlZGl0aW5nIGNvbnRpbnVlcworICovCisgICAgc3RhdGljIGludAorZXhfd2luZG93KCkKK3sKKyAgICBzdHJ1Y3QgY21kbGluZV9pbmZvCXNhdmVfY2NsaW5lOworICAgIGJ1Zl9UCQkqb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKyAgICB3aW5fVAkJKm9sZF9jdXJ3aW4gPSBjdXJ3aW47CisgICAgYnVmX1QJCSpicDsKKyAgICB3aW5fVAkJKndwOworICAgIGludAkJCWk7CisgICAgbGluZW5yX1QJCWxudW07CisgICAgaW50CQkJaGlzdHR5cGU7CisgICAgZ2FycmF5X1QJCXdpbnNpemVzOworICAgIGNoYXJfdQkJdHlwZXN0clsyXTsKKyAgICBpbnQJCQlzYXZlX3Jlc3RhcnRfZWRpdCA9IHJlc3RhcnRfZWRpdDsKKyAgICBpbnQJCQlzYXZlX1N0YXRlID0gU3RhdGU7CisgICAgaW50CQkJc2F2ZV9leG1vZGUgPSBleG1vZGVfYWN0aXZlOworCisgICAgLyogQ2FuJ3QgZG8gdGhpcyByZWN1cnNpdmVseS4gIENhbid0IGRvIGl0IHdoZW4gdHlwaW5nIGEgcGFzc3dvcmQuICovCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDAKKyMgaWYgZGVmaW5lZChGRUFUX0NSWVBUKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkKKwkgICAgfHwgY21kbGluZV9zdGFyID4gMAorIyBlbmRpZgorCSAgICApCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm4gS19JR05PUkU7CisgICAgfQorCisgICAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBzaXplcy4gKi8KKyAgICB3aW5fc2l6ZV9zYXZlKCZ3aW5zaXplcyk7CisKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogRG9uJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgd2hpbGUgY3JlYXRpbmcgdGhlIHdpbmRvdy4gKi8KKyAgICArK2F1dG9jbWRfYmxvY2s7CisjIGVuZGlmCisgICAgLyogQ3JlYXRlIGEgd2luZG93IGZvciB0aGUgY29tbWFuZC1saW5lIGJ1ZmZlci4gKi8KKyAgICBpZiAod2luX3NwbGl0KChpbnQpcF9jd2gsIFdTUF9CT1QpID09IEZBSUwpCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm4gS19JR05PUkU7CisgICAgfQorICAgIGNtZHdpbl90eXBlID0gY2NsaW5lLmNtZGZpcnN0YzsKKyAgICBpZiAoY21kd2luX3R5cGUgPT0gTlVMKQorCWNtZHdpbl90eXBlID0gJy0nOworCisgICAgLyogQ3JlYXRlIHRoZSBjb21tYW5kLWxpbmUgYnVmZmVyIGVtcHR5LiAqLworICAgICh2b2lkKWRvX2VjbWQoMCwgTlVMTCwgTlVMTCwgTlVMTCwgRUNNRF9PTkUsIEVDTURfSElERSk7CisgICAgKHZvaWQpc2V0Zm5hbWUoY3VyYnVmLCAoY2hhcl91ICopImNvbW1hbmQtbGluZSIsIE5VTEwsIFRSVUUpOworICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJidCIsIDBMLCAoY2hhcl91ICopIm5vZmlsZSIsIE9QVF9MT0NBTCk7CisgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInN3ZiIsIDBMLCBOVUxMLCBPUFRfTE9DQUwpOworICAgIGN1cmJ1Zi0+Yl9wX21hID0gVFJVRTsKKyMgaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBjdXJ3aW4tPndfcF9ybCA9IEZBTFNFOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKyAgICBjdXJ3aW4tPndfcF9zY2IgPSBGQUxTRTsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiBEbyBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3Igc2V0dGluZyB0aGUgZmlsZXR5cGUgKGxvYWQgc3ludGF4KS4gKi8KKyAgICAtLWF1dG9jbWRfYmxvY2s7CisjIGVuZGlmCisKKyAgICBoaXN0dHlwZSA9IGhpc3RfY2hhcjJ0eXBlKGNjbGluZS5jbWRmaXJzdGMpOworICAgIGlmIChoaXN0dHlwZSA9PSBISVNUX0NNRCB8fCBoaXN0dHlwZSA9PSBISVNUX0RFQlVHKQorICAgIHsKKwlpZiAocF93YyA9PSBUQUIpCisJeworCSAgICBhZGRfbWFwKChjaGFyX3UgKikiPGJ1ZmZlcj4gPFRhYj4gPEMtWD48Qy1WPiIsIElOU0VSVCk7CisJICAgIGFkZF9tYXAoKGNoYXJfdSAqKSI8YnVmZmVyPiA8VGFiPiBhPEMtWD48Qy1WPiIsIE5PUk1BTCk7CisJfQorCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJmdCIsIDBMLCAoY2hhcl91ICopInZpbSIsIE9QVF9MT0NBTCk7CisgICAgfQorCisgICAgLyogRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGhpc3RvcnkuICovCisgICAgaW5pdF9oaXN0b3J5KCk7CisgICAgaWYgKGhpc2xlbiA+IDApCisgICAgeworCWkgPSBoaXNpZHhbaGlzdHR5cGVdOworCWlmIChpID49IDApCisJeworCSAgICBsbnVtID0gMDsKKwkgICAgZG8KKwkgICAgeworCQlpZiAoKytpID09IGhpc2xlbikKKwkJICAgIGkgPSAwOworCQlpZiAoaGlzdG9yeVtoaXN0dHlwZV1baV0uaGlzc3RyICE9IE5VTEwpCisJCSAgICBtbF9hcHBlbmQobG51bSsrLCBoaXN0b3J5W2hpc3R0eXBlXVtpXS5oaXNzdHIsCisJCQkJCQkJICAgKGNvbG5yX1QpMCwgRkFMU0UpOworCSAgICB9CisJICAgIHdoaWxlIChpICE9IGhpc2lkeFtoaXN0dHlwZV0pOworCX0KKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIHRoZSBlbXB0eSBsYXN0IGxpbmUgd2l0aCB0aGUgY3VycmVudCBjb21tYW5kLWxpbmUgYW5kIHB1dCB0aGUKKyAgICAgKiBjdXJzb3IgdGhlcmUuICovCisgICAgbWxfcmVwbGFjZShjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwgY2NsaW5lLmNtZGJ1ZmYsIFRSVUUpOworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gY2NsaW5lLmNtZHBvczsKKyAgICByZWRyYXdfbGF0ZXIoTk9UX1ZBTElEKTsKKworICAgIC8qIFNhdmUgdGhlIGNvbW1hbmQgbGluZSBpbmZvLCBjYW4gYmUgdXNlZCByZWN1cnNpdmVseS4gKi8KKyAgICBzYXZlX2NjbGluZSA9IGNjbGluZTsKKyAgICBjY2xpbmUuY21kYnVmZiA9IE5VTEw7CisgICAgY2NsaW5lLmNtZHByb21wdCA9IE5VTEw7CisKKyAgICAvKiBObyBFeCBtb2RlIGhlcmUhICovCisgICAgZXhtb2RlX2FjdGl2ZSA9IDA7CisKKyAgICBTdGF0ZSA9IE5PUk1BTDsKKyMgaWZkZWYgRkVBVF9NT1VTRQorICAgIHNldG1vdXNlKCk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyogVHJpZ2dlciBDbWR3aW5FbnRlciBhdXRvY29tbWFuZHMuICovCisgICAgdHlwZXN0clswXSA9IGNtZHdpbl90eXBlOworICAgIHR5cGVzdHJbMV0gPSBOVUw7CisgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfQ01EV0lORU5URVIsIHR5cGVzdHIsIHR5cGVzdHIsIEZBTFNFLCBjdXJidWYpOworIyBlbmRpZgorCisgICAgaSA9IFJlZHJhd2luZ0Rpc2FibGVkOworICAgIFJlZHJhd2luZ0Rpc2FibGVkID0gMDsKKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgbWFpbiBsb29wIHVudGlsIDxDUj4gb3IgQ1RSTC1DIGlzIHR5cGVkLgorICAgICAqLworICAgIGNtZHdpbl9yZXN1bHQgPSAwOworICAgIG1haW5fbG9vcChUUlVFKTsKKworICAgIFJlZHJhd2luZ0Rpc2FibGVkID0gaTsKKworIyBpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiBUcmlnZ2VyIENtZHdpbkxlYXZlIGF1dG9jb21tYW5kcy4gKi8KKyAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9DTURXSU5MRUFWRSwgdHlwZXN0ciwgdHlwZXN0ciwgRkFMU0UsIGN1cmJ1Zik7CisjIGVuZGlmCisKKyAgICAvKiBSZXN0b3JlIHRoZSBjb21hbmQgbGluZSBpbmZvLiAqLworICAgIGNjbGluZSA9IHNhdmVfY2NsaW5lOworICAgIGNtZHdpbl90eXBlID0gMDsKKworICAgIGV4bW9kZV9hY3RpdmUgPSBzYXZlX2V4bW9kZTsKKworICAgIC8qIFNhZmV0eSBjaGVjazogVGhlIG9sZCB3aW5kb3cgb3IgYnVmZmVyIHdhcyBkZWxldGVkOiBJdCdzIGEgYSBidWcgd2hlbgorICAgICAqIHRoaXMgaGFwcGVucyEgKi8KKyAgICBpZiAoIXdpbl92YWxpZChvbGRfY3Vyd2luKSB8fCAhYnVmX3ZhbGlkKG9sZF9jdXJidWYpKQorICAgIHsKKwljbWR3aW5fcmVzdWx0ID0gQ3RybF9DOworCUVNU0coXygiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyMgaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCS8qIGF1dG9jbWRzIG1heSBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZyAqLworCWlmIChhYm9ydGluZygpICYmIGNtZHdpbl9yZXN1bHQgIT0gS19JR05PUkUpCisJICAgIGNtZHdpbl9yZXN1bHQgPSBDdHJsX0M7CisjIGVuZGlmCisJLyogU2V0IHRoZSBuZXcgY29tbWFuZCBsaW5lIGZyb20gdGhlIGNtZGxpbmUgYnVmZmVyLiAqLworCXZpbV9mcmVlKGNjbGluZS5jbWRidWZmKTsKKwlpZiAoY21kd2luX3Jlc3VsdCA9PSBLX1hGMSkJCS8qIDpxYSEgdHlwZWQgKi8KKwl7CisJICAgIGNjbGluZS5jbWRidWZmID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSJxYSEiKTsKKwkgICAgY21kd2luX3Jlc3VsdCA9IENBUjsKKwl9CisJZWxzZSBpZiAoY21kd2luX3Jlc3VsdCA9PSBLX1hGMikJLyogOnFhIHR5cGVkICovCisJeworCSAgICBjY2xpbmUuY21kYnVmZiA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikicWEiKTsKKwkgICAgY21kd2luX3Jlc3VsdCA9IENBUjsKKwl9CisJZWxzZQorCSAgICBjY2xpbmUuY21kYnVmZiA9IHZpbV9zdHJzYXZlKG1sX2dldF9jdXJsaW5lKCkpOworCWlmIChjY2xpbmUuY21kYnVmZiA9PSBOVUxMKQorCSAgICBjbWR3aW5fcmVzdWx0ID0gQ3RybF9DOworCWVsc2UKKwl7CisJICAgIGNjbGluZS5jbWRsZW4gPSAoaW50KVNUUkxFTihjY2xpbmUuY21kYnVmZik7CisJICAgIGNjbGluZS5jbWRidWZmbGVuID0gY2NsaW5lLmNtZGxlbiArIDE7CisJICAgIGNjbGluZS5jbWRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgaWYgKGNjbGluZS5jbWRwb3MgPiBjY2xpbmUuY21kbGVuKQorCQljY2xpbmUuY21kcG9zID0gY2NsaW5lLmNtZGxlbjsKKwkgICAgaWYgKGNtZHdpbl9yZXN1bHQgPT0gS19JR05PUkUpCisJICAgIHsKKwkJc2V0X2NtZHNwb3NfY3Vyc29yKCk7CisJCXJlZHJhd2NtZCgpOworCSAgICB9CisJfQorCisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCS8qIERvbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIHdoaWxlIGRlbGV0aW5nIHRoZSB3aW5kb3cuICovCisJKythdXRvY21kX2Jsb2NrOworIyBlbmRpZgorCXdwID0gY3Vyd2luOworCWJwID0gY3VyYnVmOworCXdpbl9nb3RvKG9sZF9jdXJ3aW4pOworCXdpbl9jbG9zZSh3cCwgVFJVRSk7CisJY2xvc2VfYnVmZmVyKE5VTEwsIGJwLCBET0JVRl9XSVBFKTsKKworCS8qIFJlc3RvcmUgd2luZG93IHNpemVzLiAqLworCXdpbl9zaXplX3Jlc3RvcmUoJndpbnNpemVzKTsKKworIyBpZmRlZiBGRUFUX0FVVE9DTUQKKwktLWF1dG9jbWRfYmxvY2s7CisjIGVuZGlmCisgICAgfQorCisgICAgZ2FfY2xlYXIoJndpbnNpemVzKTsKKyAgICByZXN0YXJ0X2VkaXQgPSBzYXZlX3Jlc3RhcnRfZWRpdDsKKworICAgIFN0YXRlID0gc2F2ZV9TdGF0ZTsKKyMgaWZkZWYgRkVBVF9NT1VTRQorICAgIHNldG1vdXNlKCk7CisjIGVuZGlmCisKKyAgICByZXR1cm4gY21kd2luX3Jlc3VsdDsKK30KKyNlbmRpZiAvKiBGRUFUX0NNRFdJTiAqLworCisvKgorICogVXNlZCBmb3IgY29tbWFuZHMgdGhhdCBlaXRoZXIgdGFrZSBhIHNpbXBsZSBjb21tYW5kIHN0cmluZyBhcmd1bWVudCwgb3I6CisgKgljbWQgPDwgZW5kbWFya2VyCisgKgkgIHtzY3JpcHR9CisgKgllbmRtYXJrZXIKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCB7c2NyaXB0fSBvciBOVUxMLgorICovCisgICAgY2hhcl91ICoKK3NjcmlwdF9nZXQoZWFwLCBjbWQpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGNoYXJfdQkqY21kOworeworICAgIGNoYXJfdQkqdGhlbGluZTsKKyAgICBjaGFyCSplbmRfcGF0dGVybiA9IE5VTEw7CisgICAgY2hhcglkb3RbXSA9ICIuIjsKKyAgICBnYXJyYXlfVAlnYTsKKworICAgIGlmIChjbWRbMF0gIT0gJzwnIHx8IGNtZFsxXSAhPSAnPCcgfHwgZWFwLT5nZXRsaW5lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBnYV9pbml0MigmZ2EsIDEsIDB4NDAwKTsKKworICAgIGlmIChjbWRbMl0gIT0gTlVMKQorCWVuZF9wYXR0ZXJuID0gKGNoYXIgKilza2lwd2hpdGUoY21kICsgMik7CisgICAgZWxzZQorCWVuZF9wYXR0ZXJuID0gZG90OworCisgICAgZm9yICg7OykKKyAgICB7CisJdGhlbGluZSA9IGVhcC0+Z2V0bGluZSgKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgZWFwLT5jc3RhY2stPmNzX3doaWxlbGV2ZWwgPiAwID8gLTEgOgorI2VuZGlmCisJICAgIE5VTCwgZWFwLT5jb29raWUsIDApOworCisJaWYgKHRoZWxpbmUgPT0gTlVMTCB8fCBTVFJDTVAoZW5kX3BhdHRlcm4sIHRoZWxpbmUpID09IDApCisJICAgIGJyZWFrOworCisJZ2FfY29uY2F0KCZnYSwgdGhlbGluZSk7CisJZ2FfYXBwZW5kKCZnYSwgJ1xuJyk7CisJdmltX2ZyZWUodGhlbGluZSk7CisgICAgfQorCisgICAgcmV0dXJuIChjaGFyX3UgKilnYS5nYV9kYXRhOworfQpkaWZmIC0tZ2l0IGEvc3JjL2ZhcnNpLmMgYi9zcmMvZmFyc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ0NDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ZhcnNpLmMKQEAgLTAsMCArMSwyMzEyIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBmYXJzaS5jOiBmdW5jdGlvbnMgZm9yIEZhcnNpIGxhbmd1YWdlCisgKgorICogSW5jbHVkZWQgYnkgbWFpbi5jLCB3aGVuIEZFQVRfRktNQVAgaXMgZGVmaW5lZC4KKyAqLworCitzdGF0aWMgaW50IHRvRl9Yb3JfWF8gX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCBGX2lzX1R5RSBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50IEZfaXNfVHlDX1R5RCBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50IEZfaXNfVHlCX1R5Q19UeUQgX19BUkdTKChpbnQgc3JjLCBpbnQgb2Zmc2V0KSk7CitzdGF0aWMgaW50IHRvRl9UeUIgX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQgcHV0X2N1cnJfYW5kX2xfdG9fWCBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgdm9pZCBwdXRfYW5kX3JlZG8gX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQgY2hnX2NfdG9YX29yWCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNoZ19jX3RvX1hfb3JYXyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNoZ19jX3RvX1hfb3JfWCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNoZ19sX3RvX1hfb3JYXyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNoZ19sX3RvWG9yX1ggX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBjaGdfcl90b19Yb3JfWF8gX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IHRvRl9sZWFkaW5nIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgdG9GX1Jqb2luIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgY2FuRl9Mam9pbiBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50IGNhbkZfUmpvaW4gX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCBGX2lzdGVybSBfX0FSR1MoKGludCBjKSk7CitzdGF0aWMgaW50IHRvRl9lbmRpbmcgX19BUkdTKChpbnQgYykpOworc3RhdGljIHZvaWQgbHJzd2FwYnVmIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4pKTsKKworLyoKKyoqIENvbnZlcnQgdGhlIGdpdmVuIEZhcnNpIGNoYXJhY3RlciBpbnRvIGEgX1ggb3IgX1hfIHR5cGUKKyovCisgICAgc3RhdGljIGludAordG9GX1hvcl9YXyhjKQorICAgIGludAljOworeworICAgIGludCB0ZW1wYzsKKworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBCRToKKwkJcmV0dXJuIF9CRTsKKwljYXNlIFBFOgorCQlyZXR1cm4gX1BFOworCWNhc2UgVEU6CisJCXJldHVybiBfVEU7CisJY2FzZSBTRToKKwkJcmV0dXJuIF9TRTsKKwljYXNlIEpJTToKKwkJcmV0dXJuIF9KSU07CisJY2FzZSBDSEU6CisJCXJldHVybiBfQ0hFOworCWNhc2UgSEVfSjoKKwkJcmV0dXJuIF9IRV9KOworCWNhc2UgWEU6CisJCXJldHVybiBfWEU7CisJY2FzZSBTSU46CisJCXJldHVybiBfU0lOOworCWNhc2UgU0hJTjoKKwkJcmV0dXJuIF9TSElOOworCWNhc2UgU0FEOgorCQlyZXR1cm4gX1NBRDsKKwljYXNlIFpBRDoKKwkJcmV0dXJuIF9aQUQ7CisJY2FzZSBBWU46CisJCXJldHVybiBfQVlOOworCWNhc2UgQVlOXzoKKwkJcmV0dXJuIF9BWU5fOworCWNhc2UgR0hBWU46CisJCXJldHVybiBfR0hBWU47CisJY2FzZSBHSEFZTl86CisJCXJldHVybiBfR0hBWU5fOworCWNhc2UgRkU6CisJCXJldHVybiBfRkU7CisJY2FzZSBHSEFGOgorCQlyZXR1cm4gX0dIQUY7CisJY2FzZSBLQUY6CisJCXJldHVybiBfS0FGOworCWNhc2UgR0FGOgorCQlyZXR1cm4gX0dBRjsKKwljYXNlIExBTToKKwkJcmV0dXJuIF9MQU07CisJY2FzZSBNSU06CisJCXJldHVybiBfTUlNOworCWNhc2UgTk9PTjoKKwkJcmV0dXJuIF9OT09OOworCWNhc2UgWUU6CisJY2FzZSBZRV86CisJCXJldHVybiBfWUU7CisJY2FzZSBZRUU6CisJY2FzZSBZRUVfOgorCQlyZXR1cm4gX1lFRTsKKwljYXNlIElFOgorCWNhc2UgSUVfOgorCQlyZXR1cm4gX0lFOworCWNhc2UgRl9IRToKKwkJdGVtcGMgPSBfSEU7CisKKwkJaWYgKHBfcmkgJiYgKGN1cndpbi0+d19jdXJzb3IuY29sKzEgPCBTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSkpKQorCQl7CisJCSAgICBpbmNfY3Vyc29yKCk7CisKKwkJICAgIGlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCQl0ZW1wYyA9IF9IRV87CisKKwkJICAgIGRlY19jdXJzb3IoKTsKKwkJfQorCQlpZiAoIXBfcmkgJiYgU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKQorCQl7CisJCSAgICBkZWNfY3Vyc29yKCk7CisKKwkJICAgIGlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCQl0ZW1wYyA9IF9IRV87CisKKwkJICAgIGluY19jdXJzb3IoKTsKKwkJfQorCisJCXJldHVybiB0ZW1wYzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiBDb252ZXJ0IHRoZSBnaXZlbiBGYXJzaSBjaGFyYWN0ZXIgaW50byBGYXJzaSBjYXBpdGFsIGNoYXJhY3RlciAuCisqLworICAgIGludAordG9GX1R5QShjKQorICAgIGludAljIDsKK3sKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCWNhc2UgQUxFRl86CisJCXJldHVybiBBTEVGOworCWNhc2UgQUxFRl9VX0hfOgorCQlyZXR1cm4gQUxFRl9VX0g7CisJY2FzZSBfQkU6CisJCXJldHVybiBCRTsKKwljYXNlIF9QRToKKwkJcmV0dXJuIFBFOworCWNhc2UgX1RFOgorCQlyZXR1cm4gVEU7CisJY2FzZSBfU0U6CisJCXJldHVybiBTRTsKKwljYXNlIF9KSU06CisJCXJldHVybiBKSU07CisJY2FzZSBfQ0hFOgorCQlyZXR1cm4gQ0hFOworCWNhc2UgX0hFX0o6CisJCXJldHVybiBIRV9KOworCWNhc2UgX1hFOgorCQlyZXR1cm4gWEU7CisJY2FzZSBfU0lOOgorCQlyZXR1cm4gU0lOOworCWNhc2UgX1NISU46CisJCXJldHVybiBTSElOOworCWNhc2UgX1NBRDoKKwkJcmV0dXJuIFNBRDsKKwljYXNlIF9aQUQ6CisJCXJldHVybiBaQUQ7CisJY2FzZSBfQVlOOgorCWNhc2UgQVlOXzoKKwljYXNlIF9BWU5fOgorCQlyZXR1cm4gQVlOOworCWNhc2UgX0dIQVlOOgorCWNhc2UgR0hBWU5fOgorCWNhc2UgX0dIQVlOXzoKKwkJcmV0dXJuIEdIQVlOOworCWNhc2UgX0ZFOgorCQlyZXR1cm4gRkU7CisJY2FzZSBfR0hBRjoKKwkJcmV0dXJuIEdIQUY7CisvKiBJIGFtIG5vdCBzdXJlIHdoYXQgaXQgaXMgISEhCSAgICBjYXNlIF9LQUZfSDogKi8KKwljYXNlIF9LQUY6CisJCXJldHVybiBLQUY7CisJY2FzZSBfR0FGOgorCQlyZXR1cm4gR0FGOworCWNhc2UgX0xBTToKKwkJcmV0dXJuIExBTTsKKwljYXNlIF9NSU06CisJCXJldHVybiBNSU07CisJY2FzZSBfTk9PTjoKKwkJcmV0dXJuIE5PT047CisJY2FzZSBfWUU6CisJY2FzZSBZRV86CisJCXJldHVybiBZRTsKKwljYXNlIF9ZRUU6CisJY2FzZSBZRUVfOgorCQlyZXR1cm4gWUVFOworCWNhc2UgVEVFXzoKKwkJcmV0dXJuIFRFRTsKKwljYXNlIF9JRToKKwljYXNlIElFXzoKKwkJcmV0dXJuIElFOworCWNhc2UgX0hFOgorCWNhc2UgX0hFXzoKKwkJcmV0dXJuIEZfSEU7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorKiogSXMgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yK29mZnNldCBpbiB0aGUgZ2l2ZW4gYnVmZmVyIGEgam9pbiB0eXBlLgorKiogVGhhdCBpcyBhIGNoYXJhY3RlciB0aGF0IGlzIGNvbWJpbmVkIHdpdGggdGhlIG90aGVycy4KKyoqIE5vdGU6IHRoZSBvZmZzZXQgaXMgdXNlZCBvbmx5IGZvciBjb21tYW5kIGxpbmUgYnVmZmVyLgorKi8KKyAgICBzdGF0aWMgaW50CitGX2lzX1R5Ql9UeUNfVHlEKHNyYywgb2Zmc2V0KQorICAgIGludAkJc3JjLCBvZmZzZXQ7Cit7CisgICAgaW50CQljOworCisgICAgaWYgKHNyYyA9PSBTUkNfRURUKQorCWMgPSBnY2hhcl9jdXJzb3IoKTsKKyAgICBlbHNlCisJYyA9IGNtZF9nY2hhcihBVF9DVVJTT1Irb2Zmc2V0KTsKKworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBfTEFNOgorCWNhc2UgX0JFOgorCWNhc2UgX1BFOgorCWNhc2UgX1RFOgorCWNhc2UgX1NFOgorCWNhc2UgX0pJTToKKwljYXNlIF9DSEU6CisJY2FzZSBfSEVfSjoKKwljYXNlIF9YRToKKwljYXNlIF9TSU46CisJY2FzZSBfU0hJTjoKKwljYXNlIF9TQUQ6CisJY2FzZSBfWkFEOgorCWNhc2UgX1RBOgorCWNhc2UgX1pBOgorCWNhc2UgX0FZTjoKKwljYXNlIF9BWU5fOgorCWNhc2UgX0dIQVlOOgorCWNhc2UgX0dIQVlOXzoKKwljYXNlIF9GRToKKwljYXNlIF9HSEFGOgorCWNhc2UgX0tBRjoKKwljYXNlIF9LQUZfSDoKKwljYXNlIF9HQUY6CisJY2FzZSBfTUlNOgorCWNhc2UgX05PT046CisJY2FzZSBfWUU6CisJY2FzZSBfWUVFOgorCWNhc2UgX0lFOgorCWNhc2UgX0hFXzoKKwljYXNlIF9IRToKKwkJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyoqIElzIHRoZSBGYXJzaSBjaGFyYWN0ZXIgb25lIG9mIHRoZSB0ZXJtaW5hdGluZyBvbmx5IHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK0ZfaXNfVHlFKGMpCisgICAgaW50CSAgICBjOworeworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBBTEVGX0E6CisJY2FzZSBBTEVGX0RfSDoKKwljYXNlIERBTDoKKwljYXNlIFpBTDoKKwljYXNlIFJFOgorCWNhc2UgWkU6CisJY2FzZSBKRToKKwljYXNlIFdBVzoKKwljYXNlIFdBV19IOgorCWNhc2UgSEFNWkU6CisJCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisqKiBJcyB0aGUgRmFyc2kgY2hhcmFjdGVyIG9uZSBvZiB0aGUgbm9uZSBsZWFkaW5nIHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK0ZfaXNfVHlDX1R5RChjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCWNhc2UgQUxFRl86CisJY2FzZSBBTEVGX1VfSF86CisJY2FzZSBfQVlOXzoKKwljYXNlIEFZTl86CisJY2FzZSBfR0hBWU5fOgorCWNhc2UgR0hBWU5fOgorCWNhc2UgX0hFXzoKKwljYXNlIFlFXzoKKwljYXNlIElFXzoKKwljYXNlIFRFRV86CisJY2FzZSBZRUVfOgorCQlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorKiogQ29udmVydCBhIG5vbmUgbGVhZGluZyBGYXJzaSBjaGFyIGludG8gYSBsZWFkaW5nIHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK3RvRl9UeUIoYykKKyAgICBpbnQJICAgIGM7Cit7CisgICAgc3dpdGNoIChjKQorICAgIHsKKwljYXNlIEFMRUZfOglyZXR1cm4gQUxFRjsKKwljYXNlIEFMRUZfVV9IXzoJICAgIHJldHVybiBBTEVGX1VfSDsKKwljYXNlIF9BWU5fOglyZXR1cm4gX0FZTjsKKwljYXNlIEFZTl86CXJldHVybiBBWU47CS8qIGV4Y2VwdGlvbiAtIHRoZXJlIGFyZSBtYW55IG9mIHRoZW0gKi8KKwljYXNlIF9HSEFZTl86CXJldHVybiBfR0hBWU47CisJY2FzZSBHSEFZTl86CXJldHVybiBHSEFZTjsJLyogZXhjZXB0aW9uIC0gdGhlcmUgYXJlIG1hbnkgb2YgdGhlbSAqLworCWNhc2UgX0hFXzoJcmV0dXJuIF9IRTsKKwljYXNlIFlFXzoJcmV0dXJuIFlFOworCWNhc2UgSUVfOglyZXR1cm4gSUU7CisJY2FzZSBURUVfOglyZXR1cm4gVEVFOworCWNhc2UgWUVFXzoJcmV0dXJuIFlFRTsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKKy8qCisqKiBPdmVyd3JpdGUgdGhlIGN1cnJlbnQgcmVkbyBhbmQgY3Vyc29yIGNoYXJhY3RlcnMgKyBsZWZ0IGFkanVzdAorKi8KKyAgICBzdGF0aWMgdm9pZAorcHV0X2N1cnJfYW5kX2xfdG9fWChjKQorICAgIGludAkJICBjOworeworICAgIGludAl0ZW1wYzsKKworICAgIGlmIChjdXJ3aW4tPndfcF9ybCAmJiBwX3JpKQorCXJldHVybjsKKworICAgIGlmICggKGN1cndpbi0+d19jdXJzb3IuY29sIDwgU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKSkKKyAgICB7CisJaWYgKChwX3JpICYmIGN1cndpbi0+d19jdXJzb3IuY29sKSB8fCAhcF9yaSkKKwl7CisJICAgIGlmIChwX3JpKQorCQlkZWNfY3Vyc29yKCk7CisJICAgIGVsc2UKKwkJaW5jX2N1cnNvcigpOworCisJICAgIGlmIChGX2lzX1R5Q19UeUQoKHRlbXBjID0gZ2NoYXJfY3Vyc29yKCkpKSkKKwkgICAgeworCQlwY2hhcl9jdXJzb3IodG9GX1R5Qih0ZW1wYykpOworCQlBcHBlbmRDaGFyVG9SZWRvYnVmZihLX0JTKTsKKwkJQXBwZW5kQ2hhclRvUmVkb2J1ZmYodGVtcGMpOworCSAgICB9CisKKwkgICAgaWYgKHBfcmkpCisJCWluY19jdXJzb3IoKTsKKwkgICAgZWxzZQorCQlkZWNfY3Vyc29yKCk7CisJfQorICAgIH0KKworICAgIHB1dF9hbmRfcmVkbyhjKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwdXRfYW5kX3JlZG8oYykKKyAgICBpbnQgYzsKK3sKKyAgICBwY2hhcl9jdXJzb3IoYyk7CisgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoS19CUyk7CisgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoYyk7Cit9CisKKy8qCisqKiBDaGFuZ2UgdGhlIGNoYXIuIHVuZGVyIHRoZSBjdXJzb3IgdG8gYSBYXyBvciBYIHR5cGUKKyovCisgICAgc3RhdGljIHZvaWQKK2NoZ19jX3RvWF9vclgoKQoreworICAgIGludAl0ZW1wYywgY3VyYzsKKworICAgIHN3aXRjaCAoKGN1cmMgPSBnY2hhcl9jdXJzb3IoKSkpCisgICAgeworCWNhc2UgX0JFOgorCQl0ZW1wYyA9IEJFOworCQlicmVhazsKKwljYXNlIF9QRToKKwkJdGVtcGMgPSBQRTsKKwkJYnJlYWs7CisJY2FzZSBfVEU6CisJCXRlbXBjID0gVEU7CisJCWJyZWFrOworCWNhc2UgX1NFOgorCQl0ZW1wYyA9IFNFOworCQlicmVhazsKKwljYXNlIF9KSU06CisJCXRlbXBjID0gSklNOworCQlicmVhazsKKwljYXNlIF9DSEU6CisJCXRlbXBjID0gQ0hFOworCQlicmVhazsKKwljYXNlIF9IRV9KOgorCQl0ZW1wYyA9IEhFX0o7CisJCWJyZWFrOworCWNhc2UgX1hFOgorCQl0ZW1wYyA9IFhFOworCQlicmVhazsKKwljYXNlIF9TSU46CisJCXRlbXBjID0gU0lOOworCQlicmVhazsKKwljYXNlIF9TSElOOgorCQl0ZW1wYyA9IFNISU47CisJCWJyZWFrOworCWNhc2UgX1NBRDoKKwkJdGVtcGMgPSBTQUQ7CisJCWJyZWFrOworCWNhc2UgX1pBRDoKKwkJdGVtcGMgPSBaQUQ7CisJCWJyZWFrOworCWNhc2UgX0ZFOgorCQl0ZW1wYyA9IEZFOworCQlicmVhazsKKwljYXNlIF9HSEFGOgorCQl0ZW1wYyA9IEdIQUY7CisJCWJyZWFrOworCWNhc2UgX0tBRl9IOgorCWNhc2UgX0tBRjoKKwkJdGVtcGMgPSBLQUY7CisJCWJyZWFrOworCWNhc2UgX0dBRjoKKwkJdGVtcGMgPSBHQUY7CisJCWJyZWFrOworCWNhc2UgX0FZTjoKKwkJdGVtcGMgPSBBWU47CisJCWJyZWFrOworCWNhc2UgX0FZTl86CisJCXRlbXBjID0gQVlOXzsKKwkJYnJlYWs7CisJY2FzZSBfR0hBWU46CisJCXRlbXBjID0gR0hBWU47CisJCWJyZWFrOworCWNhc2UgX0dIQVlOXzoKKwkJdGVtcGMgPSBHSEFZTl87CisJCWJyZWFrOworCWNhc2UgX0xBTToKKwkJdGVtcGMgPSBMQU07CisJCWJyZWFrOworCWNhc2UgX01JTToKKwkJdGVtcGMgPSBNSU07CisJCWJyZWFrOworCWNhc2UgX05PT046CisJCXRlbXBjID0gTk9PTjsKKwkJYnJlYWs7CisJY2FzZSBfSEU6CisJY2FzZSBfSEVfOgorCQl0ZW1wYyA9IEZfSEU7CisJCWJyZWFrOworCWNhc2UgX1lFOgorCWNhc2UgX0lFOgorCWNhc2UgX1lFRToKKwkJaWYgKHBfcmkpCisJCXsKKwkJICAgIGluY19jdXJzb3IoKTsKKwkJICAgIGlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCQkgICAgdGVtcGMgPSAoY3VyYyA9PSBfWUUgPyBZRV8gOgorCQkJICAgIChjdXJjID09IF9JRSA/IElFXyA6IFlFRV8pKTsKKwkJICAgIGVsc2UKKwkJCSAgICB0ZW1wYyA9IChjdXJjID09IF9ZRSA/IFlFIDoKKwkJCSAgICAoY3VyYyA9PSBfSUUgPyBJRSA6IFlFRSkpOworCQkgICAgZGVjX2N1cnNvcigpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sKQorCQkgICAgeworCQkJZGVjX2N1cnNvcigpOworCQkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0VEVCwgQVRfQ1VSU09SKSkKKwkJCQl0ZW1wYyA9IChjdXJjID09IF9ZRSA/IFlFXyA6CisJCQkJKGN1cmMgPT0gX0lFID8gSUVfIDogWUVFXykpOworCQkJZWxzZQorCQkJCXRlbXBjID0gKGN1cmMgPT0gX1lFID8gWUUgOgorCQkJCShjdXJjID09IF9JRSA/IElFIDogWUVFKSk7CisJCQlpbmNfY3Vyc29yKCk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQkgICAgdGVtcGMgPSAoY3VyYyA9PSBfWUUgPyBZRSA6CisJCQkgICAgKGN1cmMgPT0gX0lFID8gSUUgOiBZRUUpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQl0ZW1wYyA9IDA7CisgICAgfQorCisgICAgaWYgKHRlbXBjKQorCXB1dF9hbmRfcmVkbyh0ZW1wYyk7Cit9CisKKy8qCisqKiBDaGFuZ2UgdGhlIGNoYXIuIHVuZGVyIHRoZSBjdXJzb3IgdG8gYSBfWF8gb3IgWF8gdHlwZQorKi8KKworICAgIHN0YXRpYyB2b2lkCitjaGdfY190b19YX29yWF8oKQoreworICAgIGludAl0ZW1wYzsKKworICAgIHN3aXRjaCAoZ2NoYXJfY3Vyc29yKCkpCisgICAgeworCWNhc2UgQUxFRjoKKwkJdGVtcGMgPSBBTEVGXzsKKwkJYnJlYWs7CisJY2FzZSBBTEVGX1VfSDoKKwkJdGVtcGMgPSBBTEVGX1VfSF87CisJCWJyZWFrOworCWNhc2UgX0FZTjoKKwkJdGVtcGMgPSBfQVlOXzsKKwkJYnJlYWs7CisJY2FzZSBBWU46CisJCXRlbXBjID0gQVlOXzsKKwkJYnJlYWs7CisJY2FzZSBfR0hBWU46CisJCXRlbXBjID0gX0dIQVlOXzsKKwkJYnJlYWs7CisJY2FzZSBHSEFZTjoKKwkJdGVtcGMgPSBHSEFZTl87CisJCWJyZWFrOworCWNhc2UgX0hFOgorCQl0ZW1wYyA9IF9IRV87CisJCWJyZWFrOworCWNhc2UgWUU6CisJCXRlbXBjID0gWUVfOworCQlicmVhazsKKwljYXNlIElFOgorCQl0ZW1wYyA9IElFXzsKKwkJYnJlYWs7CisJY2FzZSBURUU6CisJCXRlbXBjID0gVEVFXzsKKwkJYnJlYWs7CisJY2FzZSBZRUU6CisJCXRlbXBjID0gWUVFXzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGVtcGMgPSAwOworICAgIH0KKworICAgIGlmICh0ZW1wYykKKwlwdXRfYW5kX3JlZG8odGVtcGMpOworfQorCisvKgorKiogQ2hhbmdlIHRoZSBjaGFyLiB1bmRlciB0aGUgY3Vyc29yIHRvIGEgX1hfIG9yIF9YIHR5cGUKKyovCisgICAgc3RhdGljIHZvaWQKK2NoZ19jX3RvX1hfb3JfWCAoKQoreworICAgIGludAl0ZW1wYzsKKworICAgIHRlbXBjID0gZ2NoYXJfY3Vyc29yKCk7CisKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wrMSA8IFNUUkxFTihtbF9nZXRfY3VybGluZSgpKSkKKyAgICB7CisJaW5jX2N1cnNvcigpOworCisJaWYgKCh0ZW1wYyA9PSBGX0hFKSAmJiAoRl9pc19UeUJfVHlDX1R5RChTUkNfRURULCBBVF9DVVJTT1IpKSkKKwl7CisJICAgIHRlbXBjID0gX0hFXzsKKworCSAgICBkZWNfY3Vyc29yKCk7CisKKwkgICAgcHV0X2FuZF9yZWRvKHRlbXBjKTsKKwkgICAgcmV0dXJuOworCX0KKworCWRlY19jdXJzb3IoKTsKKyAgICB9CisKKyAgICBpZiAoKHRlbXBjID0gdG9GX1hvcl9YXyh0ZW1wYykpICE9IDApCisJcHV0X2FuZF9yZWRvKHRlbXBjKTsKK30KKworLyoKKyoqIENoYW5nZSB0aGUgY2hhcmFjdGVyIGxlZnQgdG8gdGhlIGN1cnNvciB0byBhIF9YXyBvciBYXyB0eXBlCisqLworICAgIHN0YXRpYyB2b2lkCitjaGdfbF90b19YX29yWF8gKCkKK3sKKyAgICBpbnQJdGVtcGM7CisKKyAgICBpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sICYmCisJKGN1cndpbi0+d19jdXJzb3IuY29sKzEgPT0gU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKSkKKwlyZXR1cm47CisKKyAgICBpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sICYmIHBfcmkpCisJcmV0dXJuOworCisgICAgaWYgKHBfcmkpCisJZGVjX2N1cnNvcigpOworICAgIGVsc2UKKwlpbmNfY3Vyc29yKCk7CisKKyAgICBzd2l0Y2ggKGdjaGFyX2N1cnNvcigpKQorICAgIHsKKwljYXNlIEFMRUY6CisJCXRlbXBjID0gQUxFRl87CisJCWJyZWFrOworCWNhc2UgQUxFRl9VX0g6CisJCXRlbXBjID0gQUxFRl9VX0hfOworCQlicmVhazsKKwljYXNlIF9BWU46CisJCXRlbXBjID0gX0FZTl87CisJCWJyZWFrOworCWNhc2UgQVlOOgorCQl0ZW1wYyA9IEFZTl87CisJCWJyZWFrOworCWNhc2UgX0dIQVlOOgorCQl0ZW1wYyA9IF9HSEFZTl87CisJCWJyZWFrOworCWNhc2UgR0hBWU46CisJCXRlbXBjID0gR0hBWU5fOworCQlicmVhazsKKwljYXNlIF9IRToKKwkJdGVtcGMgPSBfSEVfOworCQlicmVhazsKKwljYXNlIFlFOgorCQl0ZW1wYyA9IFlFXzsKKwkJYnJlYWs7CisJY2FzZSBJRToKKwkJdGVtcGMgPSBJRV87CisJCWJyZWFrOworCWNhc2UgVEVFOgorCQl0ZW1wYyA9IFRFRV87CisJCWJyZWFrOworCWNhc2UgWUVFOgorCQl0ZW1wYyA9IFlFRV87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRlbXBjID0gMDsKKyAgICB9CisKKyAgICBpZiAodGVtcGMpCisJcHV0X2FuZF9yZWRvKHRlbXBjKTsKKworICAgIGlmIChwX3JpKQorCWluY19jdXJzb3IoKTsKKyAgICBlbHNlCisJZGVjX2N1cnNvcigpOworfQorCisvKgorKiogQ2hhbmdlIHRoZSBjaGFyY3RlciBsZWZ0IHRvIHRoZSBjdXJzb3IgdG8gYSBYIG9yIF9YIHR5cGUKKyovCisKKyAgICBzdGF0aWMgdm9pZAorY2hnX2xfdG9Yb3JfWCAoKQoreworICAgIGludAl0ZW1wYzsKKworICAgIGlmICghY3Vyd2luLT53X2N1cnNvci5jb2wgJiYKKwkoY3Vyd2luLT53X2N1cnNvci5jb2wrMSA9PSBTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSkpKQorCXJldHVybjsKKworICAgIGlmICghY3Vyd2luLT53X2N1cnNvci5jb2wgJiYgcF9yaSkKKwlyZXR1cm47CisKKyAgICBpZiAocF9yaSkKKwlkZWNfY3Vyc29yKCk7CisgICAgZWxzZQorCWluY19jdXJzb3IoKTsKKworICAgIHN3aXRjaCAoZ2NoYXJfY3Vyc29yKCkpCisgICAgeworCWNhc2UgQUxFRl86CisJCXRlbXBjID0gQUxFRjsKKwkJYnJlYWs7CisJY2FzZSBBTEVGX1VfSF86CisJCXRlbXBjID0gQUxFRl9VX0g7CisJCWJyZWFrOworCWNhc2UgX0FZTl86CisJCXRlbXBjID0gX0FZTjsKKwkJYnJlYWs7CisJY2FzZSBBWU5fOgorCQl0ZW1wYyA9IEFZTjsKKwkJYnJlYWs7CisJY2FzZSBfR0hBWU5fOgorCQl0ZW1wYyA9IF9HSEFZTjsKKwkJYnJlYWs7CisJY2FzZSBHSEFZTl86CisJCXRlbXBjID0gR0hBWU47CisJCWJyZWFrOworCWNhc2UgX0hFXzoKKwkJdGVtcGMgPSBfSEU7CisJCWJyZWFrOworCWNhc2UgWUVfOgorCQl0ZW1wYyA9IFlFOworCQlicmVhazsKKwljYXNlIElFXzoKKwkJdGVtcGMgPSBJRTsKKwkJYnJlYWs7CisJY2FzZSBURUVfOgorCQl0ZW1wYyA9IFRFRTsKKwkJYnJlYWs7CisJY2FzZSBZRUVfOgorCQl0ZW1wYyA9IFlFRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGVtcGMgPSAwOworICAgIH0KKworICAgIGlmICh0ZW1wYykKKwlwdXRfYW5kX3JlZG8odGVtcGMpOworCisgICAgaWYgKHBfcmkpCisJaW5jX2N1cnNvcigpOworICAgIGVsc2UKKwlkZWNfY3Vyc29yKCk7Cit9CisKKy8qCisqKiBDaGFuZ2UgdGhlIGNoYXJjdGVyIHJpZ2h0IHRvIHRoZSBjdXJzb3IgdG8gYSBfWCBvciBfWF8gdHlwZQorKi8KKworICAgIHN0YXRpYyB2b2lkCitjaGdfcl90b19Yb3JfWF8oKQoreworICAgIGludCB0ZW1wYywgYzsKKworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKyAgICB7CisJaWYgKCFwX3JpKQorCSAgICBkZWNfY3Vyc29yKCk7CisKKwl0ZW1wYyA9IGdjaGFyX2N1cnNvcigpOworCisJaWYgKChjID0gdG9GX1hvcl9YXyh0ZW1wYykpICE9IDApCisJICAgIHB1dF9hbmRfcmVkbyhjKTsKKworCWlmICghcF9yaSkKKwkgICAgaW5jX2N1cnNvcigpOworCisgICAgfQorfQorCisvKgorKiogTWFwIEZhcnNpIGtleWJvYXJkIHdoZW4gaW4gZmttYXAgbW9kZS4KKyovCisKKyAgICBpbnQKK2ZrbWFwKGMpCisgICAgaW50IGM7Cit7CisgICAgaW50CQl0ZW1wYzsKKyAgICBzdGF0aWMgaW50CXJldmluczsKKworICAgIGlmIChJU19TUEVDSUFMKGMpKQorCXJldHVybiBjOworCisgICAgaWYgKFZJTV9JU0RJR0lUKGMpIHx8ICgoYyA9PSAnLicgfHwgYyA9PSAnKycgfHwgYyA9PSAnLScgfHwKKwljID09ICdeJyB8fCBjID09ICclJyB8fCBjID09ICcjJyB8fCBjID09ICc9JykgICYmIHJldmlucykpCisgICAgeworCWlmICghcmV2aW5zKQorCXsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sKQorCSAgICB7CisJCWlmICghcF9yaSkKKwkJICAgIGRlY19jdXJzb3IoKTsKKworCQkgICAgY2hnX2NfdG9YX29yWCAoKTsKKwkJICAgIGNoZ19sX3RvWG9yX1ggKCk7CisKKwkJaWYgKCFwX3JpKQorCQkgICAgaW5jX2N1cnNvcigpOworCSAgICB9CisJfQorCisJYXJyb3dfdXNlZCA9IFRSVUU7CisJKHZvaWQpc3RvcF9hcnJvdygpOworCisJaWYgKCFjdXJ3aW4tPndfcF9ybCAmJiByZXZpbnMpCisJICAgIGluY19jdXJzb3IoKTsKKworCSsrcmV2aW5zOworCXBfcmk9MTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAocmV2aW5zKQorCXsKKwkgICAgYXJyb3dfdXNlZCA9IFRSVUU7CisJICAgICh2b2lkKXN0b3BfYXJyb3coKTsKKworCSAgICByZXZpbnMgPSAwOworCSAgICBpZiAoY3Vyd2luLT53X3BfcmwpCisJICAgIHsKKwkJd2hpbGUgKChGX2lzZGlnaXQoZ2NoYXJfY3Vyc29yKCkpCisJCQkgICAgfHwgKGdjaGFyX2N1cnNvcigpID09IEZfUEVSSU9ECisJCQkJfHwgZ2NoYXJfY3Vyc29yKCkgPT0gRl9QTFVTCisJCQkJfHwgZ2NoYXJfY3Vyc29yKCkgPT0gRl9NSU5VUworCQkJCXx8IGdjaGFyX2N1cnNvcigpID09IEZfTVVMCisJCQkJfHwgZ2NoYXJfY3Vyc29yKCkgPT0gRl9ESVZJREUKKwkJCQl8fCBnY2hhcl9jdXJzb3IoKSA9PSBGX1BFUkNFTlQKKwkJCQl8fCBnY2hhcl9jdXJzb3IoKSA9PSBGX0VRVUFMUykpCisJCQkmJiBnY2hhcl9jdXJzb3IoKSAhPSBOVUwpCisJCSAgICArK2N1cndpbi0+d19jdXJzb3IuY29sOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wpCisJCSAgICB3aGlsZSAoKEZfaXNkaWdpdChnY2hhcl9jdXJzb3IoKSkKKwkJCSAgICB8fCAoZ2NoYXJfY3Vyc29yKCkgPT0gRl9QRVJJT0QKKwkJCQl8fCBnY2hhcl9jdXJzb3IoKSA9PSBGX1BMVVMKKwkJCQl8fCBnY2hhcl9jdXJzb3IoKSA9PSBGX01JTlVTCisJCQkJfHwgZ2NoYXJfY3Vyc29yKCkgPT0gRl9NVUwKKwkJCQl8fCBnY2hhcl9jdXJzb3IoKSA9PSBGX0RJVklERQorCQkJCXx8IGdjaGFyX2N1cnNvcigpID09IEZfUEVSQ0VOVAorCQkJCXx8IGdjaGFyX2N1cnNvcigpID09IEZfRVFVQUxTKSkKKwkJCSAgICAmJiAtLWN1cndpbi0+d19jdXJzb3IuY29sKQorCQkJOworCisJCWlmICghRl9pc2RpZ2l0KGdjaGFyX2N1cnNvcigpKSkKKwkJICAgICsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKCFyZXZpbnMpCisgICAgeworCWlmIChjdXJ3aW4tPndfcF9ybCkKKwkgICAgcF9yaT0wOworCWlmICghY3Vyd2luLT53X3BfcmwpCisJICAgIHBfcmk9MTsKKyAgICB9CisKKyAgICBpZiAoKGMgPCAweDEwMCkgJiYgKGlzYWxwaGEoYykgfHwgYyA9PSAnJicgfHwgICBjID09ICdeJyB8fAljID09ICc7JyB8fAorCQkJICAgIGMgPT0gJ1wnJ3x8CWMgPT0gJywnIHx8IGMgPT0gJ1snIHx8CisJCQkgICAgYyA9PSAnXScgfHwJYyA9PSAneycgfHwgYyA9PSAnfScJKSkKKwljaGdfcl90b19Yb3JfWF8oKTsKKworICAgIHRlbXBjID0gMDsKKworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSAnYCc6CisJY2FzZSAnICc6CisJY2FzZSAnLic6CisJY2FzZSAnISc6CisJY2FzZSAnIic6CisJY2FzZSAnJCc6CisJY2FzZSAnJSc6CisJY2FzZSAnXic6CisJY2FzZSAnJic6CisJY2FzZSAnLyc6CisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJY2FzZSAnPSc6CisJY2FzZSAnXFwnOgorCWNhc2UgJz8nOgorCWNhc2UgJysnOgorCWNhc2UgJy0nOgorCWNhc2UgJ18nOgorCWNhc2UgJyonOgorCWNhc2UgJzonOgorCWNhc2UgJyMnOgorCWNhc2UgJ34nOgorCWNhc2UgJ0AnOgorCWNhc2UgJzwnOgorCWNhc2UgJz4nOgorCWNhc2UgJ3snOgorCWNhc2UgJ30nOgorCWNhc2UgJ3wnOgorCWNhc2UgJzAnOgorCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCWNhc2UgJzcnOgorCWNhc2UgJzgnOgorCWNhc2UgJzknOgorCWNhc2UgJ0InOgorCWNhc2UgJ0UnOgorCWNhc2UgJ0YnOgorCWNhc2UgJ0gnOgorCWNhc2UgJ0knOgorCWNhc2UgJ0snOgorCWNhc2UgJ0wnOgorCWNhc2UgJ00nOgorCWNhc2UgJ08nOgorCWNhc2UgJ1AnOgorCWNhc2UgJ1EnOgorCWNhc2UgJ1InOgorCWNhc2UgJ1QnOgorCWNhc2UgJ1UnOgorCWNhc2UgJ1cnOgorCWNhc2UgJ1knOgorCWNhc2UgIE5MOgorCWNhc2UgIFRBQjoKKworCSAgICBpZiAocF9yaSAmJiBjID09IE5MICYmIGN1cndpbi0+d19jdXJzb3IuY29sKQorCSAgICB7CisJCS8qCisJCSoqIElmIHRoZSBjaGFyIGJlZm9yZSB0aGUgY3Vyc29yIGlzIF9YXyBvciBYXyBkbyBub3QgY2hhbmdlCisJCSoqIHRoZSBvbmUgdW5kZXIgdGhlIGN1cnNvciB3aXRoIFggdHlwZS4KKwkJKi8KKworCQlkZWNfY3Vyc29yKCk7CisKKwkJaWYgKEZfaXNhbHBoYShnY2hhcl9jdXJzb3IoKSkpCisJCXsKKwkJICAgIGluY19jdXJzb3IoKTsKKwkJICAgIHJldHVybiBOTDsKKwkJfQorCisJCWluY19jdXJzb3IoKTsKKwkgICAgfQorCisJICAgIGlmICghcF9yaSkKKwkgICAgaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkgICAgeworCQlzd2l0Y2ggKGMpCisJCXsKKwkJICAgIGNhc2UgJzAnOglyZXR1cm4gRkFSU0lfMDsKKwkJICAgIGNhc2UgJzEnOglyZXR1cm4gRkFSU0lfMTsKKwkJICAgIGNhc2UgJzInOglyZXR1cm4gRkFSU0lfMjsKKwkJICAgIGNhc2UgJzMnOglyZXR1cm4gRkFSU0lfMzsKKwkJICAgIGNhc2UgJzQnOglyZXR1cm4gRkFSU0lfNDsKKwkJICAgIGNhc2UgJzUnOglyZXR1cm4gRkFSU0lfNTsKKwkJICAgIGNhc2UgJzYnOglyZXR1cm4gRkFSU0lfNjsKKwkJICAgIGNhc2UgJzcnOglyZXR1cm4gRkFSU0lfNzsKKwkJICAgIGNhc2UgJzgnOglyZXR1cm4gRkFSU0lfODsKKwkJICAgIGNhc2UgJzknOglyZXR1cm4gRkFSU0lfOTsKKwkJICAgIGNhc2UgJ0InOglyZXR1cm4gRl9QU1A7CisJCSAgICBjYXNlICdFJzoJcmV0dXJuIEpBWlJfTjsKKwkJICAgIGNhc2UgJ0YnOglyZXR1cm4gQUxFRl9EX0g7CisJCSAgICBjYXNlICdIJzoJcmV0dXJuIEFMRUZfQTsKKwkJICAgIGNhc2UgJ0knOglyZXR1cm4gVEFTSDsKKwkJICAgIGNhc2UgJ0snOglyZXR1cm4gRl9MUVVPVDsKKwkJICAgIGNhc2UgJ0wnOglyZXR1cm4gRl9SUVVPVDsKKwkJICAgIGNhc2UgJ00nOglyZXR1cm4gSEFNWkU7CisJCSAgICBjYXNlICdPJzoJcmV0dXJuICdbJzsKKwkJICAgIGNhc2UgJ1AnOglyZXR1cm4gJ10nOworCQkgICAgY2FzZSAnUSc6CXJldHVybiBPTzsKKwkJICAgIGNhc2UgJ1InOglyZXR1cm4gTUFEX047CisJCSAgICBjYXNlICdUJzoJcmV0dXJuIE9XOworCQkgICAgY2FzZSAnVSc6CXJldHVybiBNQUQ7CisJCSAgICBjYXNlICdXJzoJcmV0dXJuIE9XX09XOworCQkgICAgY2FzZSAnWSc6CXJldHVybiBKQVpSOworCQkgICAgY2FzZSAnYCc6CXJldHVybiBGX1BDTjsKKwkJICAgIGNhc2UgJyEnOglyZXR1cm4gRl9FWENMOworCQkgICAgY2FzZSAnQCc6CXJldHVybiBGX0NPTU1BOworCQkgICAgY2FzZSAnIyc6CXJldHVybiBGX0RJVklERTsKKwkJICAgIGNhc2UgJyQnOglyZXR1cm4gRl9DVVJSRU5DWTsKKwkJICAgIGNhc2UgJyUnOglyZXR1cm4gRl9QRVJDRU5UOworCQkgICAgY2FzZSAnXic6CXJldHVybiBGX01VTDsKKwkJICAgIGNhc2UgJyYnOglyZXR1cm4gRl9CQ09NTUE7CisJCSAgICBjYXNlICcqJzoJcmV0dXJuIEZfU1RBUjsKKwkJICAgIGNhc2UgJygnOglyZXR1cm4gRl9MUEFSRU5UOworCQkgICAgY2FzZSAnKSc6CXJldHVybiBGX1JQQVJFTlQ7CisJCSAgICBjYXNlICctJzoJcmV0dXJuIEZfTUlOVVM7CisJCSAgICBjYXNlICdfJzoJcmV0dXJuIEZfVU5ERVJMSU5FOworCQkgICAgY2FzZSAnPSc6CXJldHVybiBGX0VRVUFMUzsKKwkJICAgIGNhc2UgJysnOglyZXR1cm4gRl9QTFVTOworCQkgICAgY2FzZSAnXFwnOglyZXR1cm4gRl9CU0xBU0g7CisJCSAgICBjYXNlICd8JzoJcmV0dXJuIEZfUElQRTsKKwkJICAgIGNhc2UgJzonOglyZXR1cm4gRl9EQ09MT047CisJCSAgICBjYXNlICciJzoJcmV0dXJuIEZfU0VNSUNPTE9OOworCQkgICAgY2FzZSAnLic6CXJldHVybiBGX1BFUklPRDsKKwkJICAgIGNhc2UgJy8nOglyZXR1cm4gRl9TTEFTSDsKKwkJICAgIGNhc2UgJzwnOglyZXR1cm4gRl9MRVNTOworCQkgICAgY2FzZSAnPic6CXJldHVybiBGX0dSRUFURVI7CisJCSAgICBjYXNlICc/JzoJcmV0dXJuIEZfUVVFU1RJT047CisJCSAgICBjYXNlICcgJzoJcmV0dXJuIEZfQkxBTks7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCFwX3JpKQorCQlkZWNfY3Vyc29yKCk7CisKKwkgICAgc3dpdGNoICgodGVtcGMgPSBnY2hhcl9jdXJzb3IoKSkpCisJICAgIHsKKwkJY2FzZSBfQkU6CisJCWNhc2UgX1BFOgorCQljYXNlIF9URToKKwkJY2FzZSBfU0U6CisJCWNhc2UgX0pJTToKKwkJY2FzZSBfQ0hFOgorCQljYXNlIF9IRV9KOgorCQljYXNlIF9YRToKKwkJY2FzZSBfU0lOOgorCQljYXNlIF9TSElOOgorCQljYXNlIF9TQUQ6CisJCWNhc2UgX1pBRDoKKwkJY2FzZSBfRkU6CisJCWNhc2UgX0dIQUY6CisJCWNhc2UgX0tBRjoKKwkJY2FzZSBfS0FGX0g6CisJCWNhc2UgX0dBRjoKKwkJY2FzZSBfTEFNOgorCQljYXNlIF9NSU06CisJCWNhc2UgX05PT046CisJCWNhc2UgX0hFOgorCQljYXNlIF9IRV86CisJCWNhc2UgX1RBOgorCQljYXNlIF9aQToKKwkJCXB1dF9jdXJyX2FuZF9sX3RvX1godG9GX1R5QSh0ZW1wYykpOworCQkJYnJlYWs7CisJCWNhc2UgX0FZTjoKKwkJY2FzZSBfQVlOXzoKKworCQkJaWYgKCFwX3JpKQorCQkJICAgIGlmICghY3Vyd2luLT53X2N1cnNvci5jb2wpCisJCQkgICAgeworCQkJCXB1dF9jdXJyX2FuZF9sX3RvX1goQVlOKTsKKwkJCQlicmVhazsKKwkJCSAgICB9CisKKwkJCWlmIChwX3JpKQorCQkJICAgIGluY19jdXJzb3IoKTsKKwkJCWVsc2UKKwkJCSAgICBkZWNfY3Vyc29yKCk7CisKKwkJCWlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCQkgICAgdGVtcGMgPSBBWU5fOworCQkJZWxzZQorCQkJICAgIHRlbXBjID0gQVlOOworCisJCQlpZiAocF9yaSkKKwkJCSAgICBkZWNfY3Vyc29yKCk7CisJCQllbHNlCisJCQkgICAgaW5jX2N1cnNvcigpOworCisJCQlwdXRfY3Vycl9hbmRfbF90b19YKHRlbXBjKTsKKworCQkJYnJlYWs7CisJCWNhc2UgX0dIQVlOOgorCQljYXNlIF9HSEFZTl86CisKKwkJCWlmICghcF9yaSkKKwkJCSAgICBpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sKQorCQkJICAgIHsKKwkJCQlwdXRfY3Vycl9hbmRfbF90b19YKEdIQVlOKTsKKwkJCQlicmVhazsKKwkJCSAgICB9CisKKwkJCWlmIChwX3JpKQorCQkJICAgIGluY19jdXJzb3IoKTsKKwkJCWVsc2UKKwkJCSAgICBkZWNfY3Vyc29yKCk7CisKKwkJCWlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCQkgICAgdGVtcGMgPSBHSEFZTl87CisJCQllbHNlCisJCQkgICAgdGVtcGMgPSBHSEFZTjsKKworCQkJaWYgKHBfcmkpCisJCQkgICAgZGVjX2N1cnNvcigpOworCQkJZWxzZQorCQkJICAgIGluY19jdXJzb3IoKTsKKworCQkJcHV0X2N1cnJfYW5kX2xfdG9fWCh0ZW1wYyk7CisJCQlicmVhazsKKwkJY2FzZSBfWUU6CisJCWNhc2UgX0lFOgorCQljYXNlIF9ZRUU6CisJCQlpZiAoIXBfcmkpCisJCQkgICAgaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkJCSAgICB7CisJCQkJcHV0X2N1cnJfYW5kX2xfdG9fWCgodGVtcGMgPT0gX1lFID8gWUUgOgorCQkJCQkgICAgKHRlbXBjID09IF9JRSA/IElFIDogWUVFKSkpOworCQkJCWJyZWFrOworCQkJICAgIH0KKworCQkJaWYgKHBfcmkpCisJCQkgICAgaW5jX2N1cnNvcigpOworCQkJZWxzZQorCQkJICAgIGRlY19jdXJzb3IoKTsKKworCQkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0VEVCwgQVRfQ1VSU09SKSkKKwkJCQl0ZW1wYyA9ICh0ZW1wYyA9PSBfWUUgPyBZRV8gOgorCQkJCSAgICAodGVtcGMgPT0gX0lFID8gSUVfIDogWUVFXykpOworCQkJZWxzZQorCQkJCXRlbXBjID0gKHRlbXBjID09IF9ZRSA/IFlFIDoKKwkJCQkgICAgKHRlbXBjID09IF9JRSA/IElFIDogWUVFKSk7CisKKwkJCWlmIChwX3JpKQorCQkJICAgIGRlY19jdXJzb3IoKTsKKwkJCWVsc2UKKwkJCSAgICBpbmNfY3Vyc29yKCk7CisKKwkJCXB1dF9jdXJyX2FuZF9sX3RvX1godGVtcGMpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXBfcmkpCisJCSAgICBpbmNfY3Vyc29yKCk7CisKKwkJdGVtcGMgPSAwOworCisJCXN3aXRjaCAoYykKKwkJeworCQkgICAgY2FzZSAnMCc6CXJldHVybiBGQVJTSV8wOworCQkgICAgY2FzZSAnMSc6CXJldHVybiBGQVJTSV8xOworCQkgICAgY2FzZSAnMic6CXJldHVybiBGQVJTSV8yOworCQkgICAgY2FzZSAnMyc6CXJldHVybiBGQVJTSV8zOworCQkgICAgY2FzZSAnNCc6CXJldHVybiBGQVJTSV80OworCQkgICAgY2FzZSAnNSc6CXJldHVybiBGQVJTSV81OworCQkgICAgY2FzZSAnNic6CXJldHVybiBGQVJTSV82OworCQkgICAgY2FzZSAnNyc6CXJldHVybiBGQVJTSV83OworCQkgICAgY2FzZSAnOCc6CXJldHVybiBGQVJTSV84OworCQkgICAgY2FzZSAnOSc6CXJldHVybiBGQVJTSV85OworCQkgICAgY2FzZSAnQic6CXJldHVybiBGX1BTUDsKKwkJICAgIGNhc2UgJ0UnOglyZXR1cm4gSkFaUl9OOworCQkgICAgY2FzZSAnRic6CXJldHVybiBBTEVGX0RfSDsKKwkJICAgIGNhc2UgJ0gnOglyZXR1cm4gQUxFRl9BOworCQkgICAgY2FzZSAnSSc6CXJldHVybiBUQVNIOworCQkgICAgY2FzZSAnSyc6CXJldHVybiBGX0xRVU9UOworCQkgICAgY2FzZSAnTCc6CXJldHVybiBGX1JRVU9UOworCQkgICAgY2FzZSAnTSc6CXJldHVybiBIQU1aRTsKKwkJICAgIGNhc2UgJ08nOglyZXR1cm4gJ1snOworCQkgICAgY2FzZSAnUCc6CXJldHVybiAnXSc7CisJCSAgICBjYXNlICdRJzoJcmV0dXJuIE9POworCQkgICAgY2FzZSAnUic6CXJldHVybiBNQURfTjsKKwkJICAgIGNhc2UgJ1QnOglyZXR1cm4gT1c7CisJCSAgICBjYXNlICdVJzoJcmV0dXJuIE1BRDsKKwkJICAgIGNhc2UgJ1cnOglyZXR1cm4gT1dfT1c7CisJCSAgICBjYXNlICdZJzoJcmV0dXJuIEpBWlI7CisJCSAgICBjYXNlICdgJzoJcmV0dXJuIEZfUENOOworCQkgICAgY2FzZSAnISc6CXJldHVybiBGX0VYQ0w7CisJCSAgICBjYXNlICdAJzoJcmV0dXJuIEZfQ09NTUE7CisJCSAgICBjYXNlICcjJzoJcmV0dXJuIEZfRElWSURFOworCQkgICAgY2FzZSAnJCc6CXJldHVybiBGX0NVUlJFTkNZOworCQkgICAgY2FzZSAnJSc6CXJldHVybiBGX1BFUkNFTlQ7CisJCSAgICBjYXNlICdeJzoJcmV0dXJuIEZfTVVMOworCQkgICAgY2FzZSAnJic6CXJldHVybiBGX0JDT01NQTsKKwkJICAgIGNhc2UgJyonOglyZXR1cm4gRl9TVEFSOworCQkgICAgY2FzZSAnKCc6CXJldHVybiBGX0xQQVJFTlQ7CisJCSAgICBjYXNlICcpJzoJcmV0dXJuIEZfUlBBUkVOVDsKKwkJICAgIGNhc2UgJy0nOglyZXR1cm4gRl9NSU5VUzsKKwkJICAgIGNhc2UgJ18nOglyZXR1cm4gRl9VTkRFUkxJTkU7CisJCSAgICBjYXNlICc9JzoJcmV0dXJuIEZfRVFVQUxTOworCQkgICAgY2FzZSAnKyc6CXJldHVybiBGX1BMVVM7CisJCSAgICBjYXNlICdcXCc6CXJldHVybiBGX0JTTEFTSDsKKwkJICAgIGNhc2UgJ3wnOglyZXR1cm4gRl9QSVBFOworCQkgICAgY2FzZSAnOic6CXJldHVybiBGX0RDT0xPTjsKKwkJICAgIGNhc2UgJyInOglyZXR1cm4gRl9TRU1JQ09MT047CisJCSAgICBjYXNlICcuJzoJcmV0dXJuIEZfUEVSSU9EOworCQkgICAgY2FzZSAnLyc6CXJldHVybiBGX1NMQVNIOworCQkgICAgY2FzZSAnPCc6CXJldHVybiBGX0xFU1M7CisJCSAgICBjYXNlICc+JzoJcmV0dXJuIEZfR1JFQVRFUjsKKwkJICAgIGNhc2UgJz8nOglyZXR1cm4gRl9RVUVTVElPTjsKKwkJICAgIGNhc2UgJyAnOglyZXR1cm4gRl9CTEFOSzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgJ2EnOgorCQl0ZW1wYyA9IF9TSElOOworCSAgICBicmVhazsKKwljYXNlICdBJzoKKwkJdGVtcGMgPSBXQVdfSDsKKwkgICAgYnJlYWs7CisJY2FzZSAnYic6CisJCXRlbXBjID0gWkFMOworCSAgICBicmVhazsKKwljYXNlICdjJzoKKwkJdGVtcGMgPSBaRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnQyc6CisJCXRlbXBjID0gSkU7CisJICAgIGJyZWFrOworCWNhc2UgJ2QnOgorCQl0ZW1wYyA9IF9ZRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnRCc6CisJCXRlbXBjID0gX1lFRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnZSc6CisJCXRlbXBjID0gX1NFOworCSAgICBicmVhazsKKwljYXNlICdmJzoKKwkJdGVtcGMgPSBfQkU7CisJICAgIGJyZWFrOworCWNhc2UgJ2cnOgorCQl0ZW1wYyA9IF9MQU07CisJICAgIGJyZWFrOworCWNhc2UgJ0cnOgorCSAgICBpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sICAmJiAgU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKQorCQl7CisKKwkJaWYgKGdjaGFyX2N1cnNvcigpID09IF9MQU0pCisJCSAgICBjaGdfY190b1hfb3JYICgpOworCQllbHNlCisJCSAgICBpZiAocF9yaSkKKwkJCWNoZ19jX3RvX1hfb3JfWCAoKTsKKwkgICAgfQorCisJICAgIGlmICghcF9yaSkKKwkJaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkJICAgIHJldHVybiBBTEVGX1VfSDsKKworCSAgICBpZiAoIXBfcmkpCisJCWRlY19jdXJzb3IoKTsKKworCSAgICBpZiAoZ2NoYXJfY3Vyc29yKCkgPT0gX0xBTSkKKwkgICAgeworCQljaGdfY190b1hfb3JYICgpOworCQljaGdfbF90b1hvcl9YICgpOworCQkgICAgdGVtcGMgPSBBTEVGX1VfSDsKKwkgICAgfQorCSAgICBlbHNlCisJCWlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCXsKKwkJCXRlbXBjID0gQUxFRl9VX0hfOworCQkgICAgY2hnX2xfdG9Yb3JfWCAoKTsKKwkJfQorCQllbHNlCisJCQl0ZW1wYyA9IEFMRUZfVV9IOworCisJICAgIGlmICghcF9yaSkKKwkJaW5jX2N1cnNvcigpOworCisJICAgIHJldHVybiB0ZW1wYzsKKwljYXNlICdoJzoKKwkgICAgaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCAgJiYgIFNUUkxFTihtbF9nZXRfY3VybGluZSgpKSkKKwkJeworCQlpZiAocF9yaSkKKwkJICAgIGNoZ19jX3RvX1hfb3JfWCAoKTsKKworCSAgICB9CisKKwkgICAgaWYgKCFwX3JpKQorCQlpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sKQorCQkgICAgcmV0dXJuIEFMRUY7CisKKwkgICAgaWYgKCFwX3JpKQorCQlkZWNfY3Vyc29yKCk7CisKKwkgICAgaWYgKGdjaGFyX2N1cnNvcigpID09IF9MQU0pCisJICAgIHsKKwkJY2hnX2xfdG9Yb3JfWCgpOworCQlkZWxfY2hhcihGQUxTRSk7CisJCUFwcGVuZENoYXJUb1JlZG9idWZmKEtfQlMpOworCisJCWlmICghcF9yaSkKKwkJICAgIGRlY19jdXJzb3IoKTsKKworCQkgICAgdGVtcGMgPSBMQTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0VEVCwgQVRfQ1VSU09SKSkKKwkJeworCQkJdGVtcGMgPSBBTEVGXzsKKwkJICAgIGNoZ19sX3RvWG9yX1ggKCk7CisJCX0KKwkJZWxzZQorCQkJdGVtcGMgPSBBTEVGOworCSAgICB9CisKKwkgICAgaWYgKCFwX3JpKQorCQlpbmNfY3Vyc29yKCk7CisKKwkgICAgcmV0dXJuIHRlbXBjOworCWNhc2UgJ2knOgorCSAgICBpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sICAmJiAgU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKQorCQl7CisJCWlmICghcF9yaSAmJiAhRl9pc19UeUUodGVtcGMpKQorCQkgICAgY2hnX2NfdG9fWF9vclhfICgpOworCQlpZiAocF9yaSkKKwkJICAgIGNoZ19jX3RvX1hfb3JfWCAoKTsKKworCSAgICB9CisKKwkgICAgaWYgKCFwX3JpICYmICFjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkJcmV0dXJuIF9IRTsKKworCSAgICBpZiAoIXBfcmkpCisJCWRlY19jdXJzb3IoKTsKKworCSAgICBpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfRURULCBBVF9DVVJTT1IpKQorCQkgICAgdGVtcGMgPSBfSEVfOworCSAgICBlbHNlCisJCSAgICB0ZW1wYyA9IF9IRTsKKworCSAgICBpZiAoIXBfcmkpCisJCWluY19jdXJzb3IoKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnaic6CisJCXRlbXBjID0gX1RFOworCSAgICBicmVhazsKKwljYXNlICdKJzoKKwkgICAgaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCAgJiYgIFNUUkxFTihtbF9nZXRfY3VybGluZSgpKSkKKwkJeworCQlpZiAocF9yaSkKKwkJICAgIGNoZ19jX3RvX1hfb3JfWCAoKTsKKworCSAgICB9CisKKwkgICAgaWYgKCFwX3JpKQorCQlpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sKQorCQkgICAgcmV0dXJuIFRFRTsKKworCSAgICBpZiAoIXBfcmkpCisJCWRlY19jdXJzb3IoKTsKKworCSAgICBpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfRURULCBBVF9DVVJTT1IpKQorCSAgICB7CisJCSAgICB0ZW1wYyA9IFRFRV87CisJCWNoZ19sX3RvWG9yX1ggKCk7CisJICAgIH0KKwkgICAgZWxzZQorCQkJdGVtcGMgPSBURUU7CisKKwkgICAgaWYgKCFwX3JpKQorCQlpbmNfY3Vyc29yKCk7CisKKwkgICAgcmV0dXJuIHRlbXBjOworCWNhc2UgJ2snOgorCQl0ZW1wYyA9IF9OT09OOworCSAgICBicmVhazsKKwljYXNlICdsJzoKKwkJdGVtcGMgPSBfTUlNOworCSAgICBicmVhazsKKwljYXNlICdtJzoKKwkJdGVtcGMgPSBfUEU7CisJICAgIGJyZWFrOworCWNhc2UgJ24nOgorCWNhc2UgJ04nOgorCQl0ZW1wYyA9IERBTDsKKwkgICAgYnJlYWs7CisJY2FzZSAnbyc6CisJCXRlbXBjID0gX1hFOworCSAgICBicmVhazsKKwljYXNlICdwJzoKKwkJdGVtcGMgPSBfSEVfSjsKKwkgICAgYnJlYWs7CisJY2FzZSAncSc6CisJCXRlbXBjID0gX1pBRDsKKwkgICAgYnJlYWs7CisJY2FzZSAncic6CisJCXRlbXBjID0gX0dIQUY7CisJICAgIGJyZWFrOworCWNhc2UgJ3MnOgorCQl0ZW1wYyA9IF9TSU47CisJICAgIGJyZWFrOworCWNhc2UgJ1MnOgorCQl0ZW1wYyA9IF9JRTsKKwkgICAgYnJlYWs7CisJY2FzZSAndCc6CisJCXRlbXBjID0gX0ZFOworCSAgICBicmVhazsKKwljYXNlICd1JzoKKwkJaWYgKCFjdXJ3aW4tPndfY3Vyc29yLmNvbCAgJiYgIFNUUkxFTihtbF9nZXRfY3VybGluZSgpKSkKKwkJeworCQkgICAgaWYgKCFwX3JpICYmICFGX2lzX1R5RSh0ZW1wYykpCisJCQljaGdfY190b19YX29yWF8gKCk7CisJCSAgICBpZiAocF9yaSkKKwkJCWNoZ19jX3RvX1hfb3JfWCAoKTsKKworCQl9CisKKwkJaWYgKCFwX3JpICYmICFjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkJICAgIHJldHVybiBfQVlOOworCisJCWlmICghcF9yaSkKKwkJICAgIGRlY19jdXJzb3IoKTsKKworCQlpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfRURULCBBVF9DVVJTT1IpKQorCQkgICAgdGVtcGMgPSBfQVlOXzsKKwkJZWxzZQorCQkgICAgdGVtcGMgPSBfQVlOOworCisJCWlmICghcF9yaSkKKwkJICAgIGluY19jdXJzb3IoKTsKKwkgICAgYnJlYWs7CisJY2FzZSAndic6CisJY2FzZSAnVic6CisJCXRlbXBjID0gUkU7CisJICAgIGJyZWFrOworCWNhc2UgJ3cnOgorCQl0ZW1wYyA9IF9TQUQ7CisJICAgIGJyZWFrOworCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCQl0ZW1wYyA9IF9UQTsKKwkgICAgYnJlYWs7CisJY2FzZSAneSc6CisJICAgIGlmICghY3Vyd2luLT53X2N1cnNvci5jb2wgICYmICBTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSkpCisJCXsKKwkJaWYgKCFwX3JpICYmICFGX2lzX1R5RSh0ZW1wYykpCisJCSAgICBjaGdfY190b19YX29yWF8gKCk7CisJCWlmIChwX3JpKQorCQkgICAgY2hnX2NfdG9fWF9vcl9YICgpOworCisJICAgIH0KKworCSAgICBpZiAoIXBfcmkgJiYgIWN1cndpbi0+d19jdXJzb3IuY29sKQorCQlyZXR1cm4gX0dIQVlOOworCisJICAgIGlmICghcF9yaSkKKwkJZGVjX2N1cnNvcigpOworCisJICAgIGlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19FRFQsIEFUX0NVUlNPUikpCisJCXRlbXBjID0gX0dIQVlOXzsKKwkgICAgZWxzZQorCQl0ZW1wYyA9IF9HSEFZTjsKKworCSAgICBpZiAoIXBfcmkpCisJCWluY19jdXJzb3IoKTsKKworCSAgICBicmVhazsKKwljYXNlICd6JzoKKwkJdGVtcGMgPSBfWkE7CisJICAgIGJyZWFrOworCWNhc2UgJ1onOgorCQl0ZW1wYyA9IF9LQUZfSDsKKwkgICAgYnJlYWs7CisJY2FzZSAnOyc6CisJCXRlbXBjID0gX0tBRjsKKwkgICAgYnJlYWs7CisJY2FzZSAnXCcnOgorCQl0ZW1wYyA9IF9HQUY7CisJICAgIGJyZWFrOworCWNhc2UgJywnOgorCQl0ZW1wYyA9IFdBVzsKKwkgICAgYnJlYWs7CisJY2FzZSAnWyc6CisJCXRlbXBjID0gX0pJTTsKKwkgICAgYnJlYWs7CisJY2FzZSAnXSc6CisJCXRlbXBjID0gX0NIRTsKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKChGX2lzYWxwaGEodGVtcGMpIHx8IEZfaXNkaWdpdCh0ZW1wYykpKQorICAgIHsKKwlpZiAoIWN1cndpbi0+d19jdXJzb3IuY29sICAmJiAgU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpKQorCSAgICB7CisJICAgIGlmICghcF9yaSAmJiAhRl9pc19UeUUodGVtcGMpKQorCQljaGdfY190b19YX29yWF8gKCk7CisJICAgIGlmIChwX3JpKQorCQljaGdfY190b19YX29yX1ggKCk7CisJfQorCisJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sKQorCXsKKwkgICAgaWYgKCFwX3JpKQorCQlkZWNfY3Vyc29yKCk7CisKKwkgICAgaWYgKEZfaXNfVHlFKHRlbXBjKSkKKwkJY2hnX2xfdG9Yb3JfWCAoKTsKKwkgICAgZWxzZQorCQljaGdfbF90b19YX29yWF8gKCk7CisKKwkgICAgaWYgKCFwX3JpKQorCQlpbmNfY3Vyc29yKCk7CisJfQorICAgIH0KKyAgICBpZiAodGVtcGMpCisJcmV0dXJuIHRlbXBjOworICAgIHJldHVybiBjOworfQorCisvKgorKiogQ29udmVydCBhIG5vbmUgbGVhZGluZyBGYXJzaSBjaGFyIGludG8gYSBsZWFkaW5nIHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK3RvRl9sZWFkaW5nKGMpCisgICAgaW50CSAgICBjOworeworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBBTEVGXzoJcmV0dXJuIEFMRUY7CisJY2FzZSBBTEVGX1VfSF86CSAgICByZXR1cm4gQUxFRl9VX0g7CisJY2FzZSBCRTogICAgcmV0dXJuIF9CRTsKKwljYXNlIFBFOiAgICByZXR1cm4gX1BFOworCWNhc2UgVEU6ICAgIHJldHVybiBfVEU7CisJY2FzZSBTRTogICAgcmV0dXJuIF9TRTsKKwljYXNlIEpJTTogICByZXR1cm4gX0pJTTsKKwljYXNlIENIRTogICByZXR1cm4gX0NIRTsKKwljYXNlIEhFX0o6ICByZXR1cm4gX0hFX0o7CisJY2FzZSBYRTogICAgcmV0dXJuIF9YRTsKKwljYXNlIFNJTjogICByZXR1cm4gX1NJTjsKKwljYXNlIFNISU46ICByZXR1cm4gX1NISU47CisJY2FzZSBTQUQ6ICAgcmV0dXJuIF9TQUQ7CisJY2FzZSBaQUQ6ICAgcmV0dXJuIF9aQUQ7CisKKwljYXNlIEFZTjoKKwljYXNlIEFZTl86CisJY2FzZSBfQVlOXzogcmV0dXJuIF9BWU47CisKKwljYXNlIEdIQVlOOgorCWNhc2UgR0hBWU5fOgorCWNhc2UgX0dIQVlOXzoJcmV0dXJuIF9HSEFZTjsKKworCWNhc2UgRkU6ICAgIHJldHVybiBfRkU7CisJY2FzZSBHSEFGOiAgcmV0dXJuIF9HSEFGOworCWNhc2UgS0FGOiAgIHJldHVybiBfS0FGOworCWNhc2UgR0FGOiAgIHJldHVybiBfR0FGOworCWNhc2UgTEFNOiAgIHJldHVybiBfTEFNOworCWNhc2UgTUlNOiAgIHJldHVybiBfTUlNOworCWNhc2UgTk9PTjogIHJldHVybiBfTk9PTjsKKworCWNhc2UgX0hFXzoKKwljYXNlIEZfSEU6CXJldHVybiBfSEU7CisKKwljYXNlIFlFOgorCWNhc2UgWUVfOglyZXR1cm4gX1lFOworCisJY2FzZSBJRV86CisJY2FzZSBJRToJcmV0dXJuIF9JRTsKKworCWNhc2UgWUVFOgorCWNhc2UgWUVFXzoJcmV0dXJuIF9ZRUU7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorKiogQ29udmVydCBhIGdpdmVuIEZhcnNpIGNoYXIgaW50byByaWdodCBqb2luaW5nIHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK3RvRl9Sam9pbihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCWNhc2UgQUxFRjogIHJldHVybiBBTEVGXzsKKwljYXNlIEFMRUZfVV9IOglyZXR1cm4gQUxFRl9VX0hfOworCWNhc2UgQkU6ICAgIHJldHVybiBfQkU7CisJY2FzZSBQRTogICAgcmV0dXJuIF9QRTsKKwljYXNlIFRFOiAgICByZXR1cm4gX1RFOworCWNhc2UgU0U6ICAgIHJldHVybiBfU0U7CisJY2FzZSBKSU06ICAgcmV0dXJuIF9KSU07CisJY2FzZSBDSEU6ICAgcmV0dXJuIF9DSEU7CisJY2FzZSBIRV9KOiAgcmV0dXJuIF9IRV9KOworCWNhc2UgWEU6ICAgIHJldHVybiBfWEU7CisJY2FzZSBTSU46ICAgcmV0dXJuIF9TSU47CisJY2FzZSBTSElOOiAgcmV0dXJuIF9TSElOOworCWNhc2UgU0FEOiAgIHJldHVybiBfU0FEOworCWNhc2UgWkFEOiAgIHJldHVybiBfWkFEOworCisJY2FzZSBBWU46CisJY2FzZSBBWU5fOgorCWNhc2UgX0FZTjogIHJldHVybiBfQVlOXzsKKworCWNhc2UgR0hBWU46CisJY2FzZSBHSEFZTl86CisJY2FzZSBfR0hBWU5fOglyZXR1cm4gX0dIQVlOXzsKKworCWNhc2UgRkU6ICAgIHJldHVybiBfRkU7CisJY2FzZSBHSEFGOiAgcmV0dXJuIF9HSEFGOworCWNhc2UgS0FGOiAgIHJldHVybiBfS0FGOworCWNhc2UgR0FGOiAgIHJldHVybiBfR0FGOworCWNhc2UgTEFNOiAgIHJldHVybiBfTEFNOworCWNhc2UgTUlNOiAgIHJldHVybiBfTUlNOworCWNhc2UgTk9PTjogIHJldHVybiBfTk9PTjsKKworCWNhc2UgX0hFOgorCWNhc2UgRl9IRToJcmV0dXJuIF9IRV87CisKKwljYXNlIFlFOgorCWNhc2UgWUVfOglyZXR1cm4gX1lFOworCisJY2FzZSBJRV86CisJY2FzZSBJRToJcmV0dXJuIF9JRTsKKworCWNhc2UgVEVFOglyZXR1cm4gVEVFXzsKKworCWNhc2UgWUVFOgorCWNhc2UgWUVFXzoJcmV0dXJuIF9ZRUU7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorKiogQ2FuIGEgZ2l2ZW4gRmFyc2kgY2hhcmFjdGVyIGpvaW4gdmlhIGl0cyBsZWZ0IGVkai4KKyovCisgICAgc3RhdGljIGludAorY2FuRl9Mam9pbihjKQorICAgIGludAljOworeworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBfQkU6CisJY2FzZSBCRToKKwljYXNlIFBFOgorCWNhc2UgX1BFOgorCWNhc2UgVEU6CisJY2FzZSBfVEU6CisJY2FzZSBTRToKKwljYXNlIF9TRToKKwljYXNlIEpJTToKKwljYXNlIF9KSU06CisJY2FzZSBDSEU6CisJY2FzZSBfQ0hFOgorCWNhc2UgSEVfSjoKKwljYXNlIF9IRV9KOgorCWNhc2UgWEU6CisJY2FzZSBfWEU6CisJY2FzZSBTSU46CisJY2FzZSBfU0lOOgorCWNhc2UgU0hJTjoKKwljYXNlIF9TSElOOgorCWNhc2UgU0FEOgorCWNhc2UgX1NBRDoKKwljYXNlIFpBRDoKKwljYXNlIF9aQUQ6CisJY2FzZSBfVEE6CisJY2FzZSBfWkE6CisJY2FzZSBBWU46CisJY2FzZSBfQVlOOgorCWNhc2UgX0FZTl86CisJY2FzZSBBWU5fOgorCWNhc2UgR0hBWU46CisJY2FzZSBHSEFZTl86CisJY2FzZSBfR0hBWU5fOgorCWNhc2UgX0dIQVlOOgorCWNhc2UgRkU6CisJY2FzZSBfRkU6CisJY2FzZSBHSEFGOgorCWNhc2UgX0dIQUY6CisJY2FzZSBfS0FGX0g6CisJY2FzZSBLQUY6CisJY2FzZSBfS0FGOgorCWNhc2UgR0FGOgorCWNhc2UgX0dBRjoKKwljYXNlIExBTToKKwljYXNlIF9MQU06CisJY2FzZSBNSU06CisJY2FzZSBfTUlNOgorCWNhc2UgTk9PTjoKKwljYXNlIF9OT09OOgorCWNhc2UgSUU6CisJY2FzZSBfSUU6CisJY2FzZSBJRV86CisJY2FzZSBZRToKKwljYXNlIF9ZRToKKwljYXNlIFlFXzoKKwljYXNlIFlFRToKKwljYXNlIF9ZRUU6CisJY2FzZSBZRUVfOgorCWNhc2UgRl9IRToKKwljYXNlIF9IRToKKwljYXNlIF9IRV86CisJICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisqKiBDYW4gYSBnaXZlbiBGYXJzaSBjaGFyYWN0ZXIgam9pbiB2aWEgaXRzIHJpZ2h0IGVkai4KKyovCisgICAgc3RhdGljIGludAorY2FuRl9Sam9pbihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCWNhc2UgQUxFRjoKKwljYXNlIEFMRUZfOgorCWNhc2UgQUxFRl9VX0g6CisJY2FzZSBBTEVGX1VfSF86CisJY2FzZSBEQUw6CisJY2FzZSBaQUw6CisJY2FzZSBSRToKKwljYXNlIEpFOgorCWNhc2UgWkU6CisJY2FzZSBURUU6CisJY2FzZSBURUVfOgorCWNhc2UgV0FXOgorCWNhc2UgV0FXX0g6CisJICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiBjYW5GX0xqb2luKGMpOworCit9CisKKy8qCisqKiBpcyBhIGdpdmVuIEZhcnNpIGNoYXJhY3RlciBhIHRlcm1pbmF0aW5nIHR5cGUuCisqLworICAgIHN0YXRpYyBpbnQKK0ZfaXN0ZXJtKGMpCisgICAgaW50CSAgICBjOworeworICAgIHN3aXRjaCAoYykKKyAgICB7CisJY2FzZSBBTEVGOgorCWNhc2UgQUxFRl86CisJY2FzZSBBTEVGX1VfSDoKKwljYXNlIEFMRUZfVV9IXzoKKwljYXNlIERBTDoKKwljYXNlIFpBTDoKKwljYXNlIFJFOgorCWNhc2UgSkU6CisJY2FzZSBaRToKKwljYXNlIFdBVzoKKwljYXNlIFdBV19IOgorCWNhc2UgVEVFOgorCWNhc2UgVEVFXzoKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorKiogQ29udmVydCB0aGUgZ2l2ZW4gRmFyc2kgY2hhcmFjdGVyIGludG8gYSBlbmRpbmcgdHlwZSAuCisqLworICAgIHN0YXRpYyBpbnQKK3RvRl9lbmRpbmcoYykKKyAgICBpbnQJICAgIGM7Cit7CisKKyAgICBzd2l0Y2ggKGMpCisgICAgeworCWNhc2UgX0JFOgorCQlyZXR1cm4gQkU7CisJY2FzZSBfUEU6CisJCXJldHVybiBQRTsKKwljYXNlIF9URToKKwkJcmV0dXJuIFRFOworCWNhc2UgX1NFOgorCQlyZXR1cm4gU0U7CisJY2FzZSBfSklNOgorCQlyZXR1cm4gSklNOworCWNhc2UgX0NIRToKKwkJcmV0dXJuIENIRTsKKwljYXNlIF9IRV9KOgorCQlyZXR1cm4gSEVfSjsKKwljYXNlIF9YRToKKwkJcmV0dXJuIFhFOworCWNhc2UgX1NJTjoKKwkJcmV0dXJuIFNJTjsKKwljYXNlIF9TSElOOgorCQlyZXR1cm4gU0hJTjsKKwljYXNlIF9TQUQ6CisJCXJldHVybiBTQUQ7CisJY2FzZSBfWkFEOgorCQlyZXR1cm4gWkFEOworCWNhc2UgX0FZTjoKKwkJcmV0dXJuIEFZTjsKKwljYXNlIF9BWU5fOgorCQlyZXR1cm4gQVlOXzsKKwljYXNlIF9HSEFZTjoKKwkJcmV0dXJuIEdIQVlOOworCWNhc2UgX0dIQVlOXzoKKwkJcmV0dXJuIEdIQVlOXzsKKwljYXNlIF9GRToKKwkJcmV0dXJuIEZFOworCWNhc2UgX0dIQUY6CisJCXJldHVybiBHSEFGOworCWNhc2UgX0tBRl9IOgorCWNhc2UgX0tBRjoKKwkJcmV0dXJuIEtBRjsKKwljYXNlIF9HQUY6CisJCXJldHVybiBHQUY7CisJY2FzZSBfTEFNOgorCQlyZXR1cm4gTEFNOworCWNhc2UgX01JTToKKwkJcmV0dXJuIE1JTTsKKwljYXNlIF9OT09OOgorCQlyZXR1cm4gTk9PTjsKKwljYXNlIF9ZRToKKwkJcmV0dXJuIFlFXzsKKwljYXNlIFlFXzoKKwkJcmV0dXJuIFlFOworCWNhc2UgX1lFRToKKwkJcmV0dXJuIFlFRV87CisJY2FzZSBZRUVfOgorCQlyZXR1cm4gWUVFOworCWNhc2UgVEVFOgorCQlyZXR1cm4gVEVFXzsKKwljYXNlIF9JRToKKwkJcmV0dXJuIElFXzsKKwljYXNlIElFXzoKKwkJcmV0dXJuIElFOworCWNhc2UgX0hFOgorCWNhc2UgX0hFXzoKKwkJcmV0dXJuIEZfSEU7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorKiogQ29udmVydCB0aGUgRmFyc2kgMzM0MiBzdGFuZGFyZCBpbnRvIEZhcnNpIFZJTS4KKyovCisgICAgdm9pZAorY29udl90b19wdmltKCkKK3sKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWxudW0sIGxsZW4sIGk7CisKKyAgICBmb3IgKGxudW0gPSAxOyBsbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisgICAgeworCXB0ciA9IG1sX2dldCgobGluZW5yX1QpbG51bSk7CisKKwlsbGVuID0gKGludClTVFJMRU4ocHRyKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGxlbi0xOyBpKyspCisJeworCSAgICBpZiAoY2FuRl9Mam9pbihwdHJbaV0pICYmIGNhbkZfUmpvaW4ocHRyW2krMV0pKQorCSAgICB7CisJCXB0cltpXSA9IHRvRl9sZWFkaW5nKHB0cltpXSk7CisJCSsraTsKKworCQl3aGlsZShjYW5GX1Jqb2luKHB0cltpXSkgJiYgKGkgPCBsbGVuKSkKKwkJeworCQkgICAgcHRyW2ldID0gdG9GX1Jqb2luKHB0cltpXSk7CisJCSAgICBpZiAoRl9pc3Rlcm0ocHRyW2ldKSB8fCAhRl9pc2FscGhhKHB0cltpXSkpCisJCQlicmVhazsKKwkJICAgICsraTsKKwkJfQorCQlpZiAoIUZfaXNhbHBoYShwdHJbaV0pIHx8ICFjYW5GX1Jqb2luKHB0cltpXSkpCisJCSAgICBwdHJbaS0xXSA9IHRvRl9lbmRpbmcocHRyW2ktMV0pOworCSAgICB9CisJICAgIGVsc2UKKwkJcHRyW2ldID0gdG9GX1R5QShwdHJbaV0pOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvbGxvd2luZyBsaW5lcyBjb250YWlucyBGYXJzaSBlbmNvZGVkIGNoYXJhY3Rlci4KKyAgICAgKi8KKworICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiJXMvXDIwMlwyMzEvXDIzMi9nIik7CisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSIlcy9cMjAxXDIzMS9cMzcwXDMzNC9nIik7CisKKyAgICAvKiBBc3N1bWUgdGhlIHNjcmVlbiBoYXMgYmVlbiBtZXNzZWQgdXA6IGNsZWFyIGl0IGFuZCByZWRyYXcuICovCisgICAgcmVkcmF3X2xhdGVyKENMRUFSKTsKKyAgICBNU0dfQVRUUihmYXJzaV90ZXh0XzEsIGhsX2F0dHIoSExGX1MpKTsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlIEZhcnNpIFZJTSBpbnRvIEZhcnNpIDMzNDIgc3RhbmRhZC4KKyAqLworICAgIHZvaWQKK2NvbnZfdG9fcHN0ZCgpCit7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQlsbnVtLCBsbGVuLCBpOworCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgbGluZSBjb250YWlucyBGYXJzaSBlbmNvZGVkIGNoYXJhY3Rlci4KKyAgICAgKi8KKworICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiJXMvXDIzMi9cMjAyXDIzMS9nIik7CisKKyAgICBmb3IgKGxudW0gPSAxOyBsbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisgICAgeworCXB0ciA9IG1sX2dldCgobGluZW5yX1QpbG51bSk7CisKKwlsbGVuID0gKGludClTVFJMRU4ocHRyKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGxlbjsgaSsrKQorCXsKKwkgICAgcHRyW2ldID0gdG9GX1R5QShwdHJbaV0pOworCisJfQorICAgIH0KKworICAgIC8qIEFzc3VtZSB0aGUgc2NyZWVuIGhhcyBiZWVuIG1lc3NlZCB1cDogY2xlYXIgaXQgYW5kIHJlZHJhdy4gKi8KKyAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOworICAgIE1TR19BVFRSKGZhcnNpX3RleHRfMiwgaGxfYXR0cihITEZfUykpOworfQorCisvKgorICogbGVmdC1yaWdodCBzd2FwIHRoZSBjaGFyYWN0ZXJzIGluIGJ1ZltsZW5dLgorICovCisgICAgc3RhdGljIHZvaWQKK2xyc3dhcGJ1ZihidWYsIGxlbikKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBjaGFyX3UJKnMsICplOworICAgIGludAkJYzsKKworICAgIHMgPSBidWY7CisgICAgZSA9IGJ1ZiArIGxlbiAtIDE7CisKKyAgICB3aGlsZSAoZSA+IHMpCisgICAgeworCWMgPSAqczsKKwkqcyA9ICplOworCSplID0gYzsKKwkrK3M7CisJLS1lOworICAgIH0KK30KKworLyoKKyAqIHN3YXAgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHJldmVyc2UgZGlyZWN0aW9uCisgKi8KKyAgICBjaGFyX3UgKgorbHJzd2FwKGlidWYpCisgICAgY2hhcl91CSppYnVmOworeworICAgIGlmIChpYnVmICE9IE5VTEwgJiYgKmlidWYgIT0gTlVMKQorCWxyc3dhcGJ1ZihpYnVmLCAoaW50KVNUUkxFTihpYnVmKSk7CisgICAgcmV0dXJuIGlidWY7Cit9CisKKy8qCisgKiBzd2FwIGFsbCB0aGUgRmFyc2kgY2hhcmFjdGVycyBpbiByZXZlcnNlIGRpcmVjdGlvbgorICovCisgICAgY2hhcl91ICoKK2xyRnN3YXAoY21kYnVmLCBsZW4pCisgICAgY2hhcl91CSpjbWRidWY7CisgICAgaW50CQlsZW47Cit7CisgICAgaW50CQlpLCBjbnQ7CisKKyAgICBpZiAoY21kYnVmID09IE5VTEwpCisJcmV0dXJuIGNtZGJ1ZjsKKworICAgIGlmIChsZW4gPT0gMCAmJiAobGVuID0gKGludClTVFJMRU4oY21kYnVmKSkgPT0gMCkKKwlyZXR1cm4gY21kYnVmOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKwlmb3IgKGNudCA9IDA7IGkgKyBjbnQgPCBsZW4KKwkJCSYmIChGX2lzYWxwaGEoY21kYnVmW2kgKyBjbnRdKQorCQkJICAgIHx8IEZfaXNkaWdpdChjbWRidWZbaSArIGNudF0pCisJCQkgICAgfHwgY21kYnVmW2kgKyBjbnRdID09ICcgJyk7ICsrY250KQorCSAgICA7CisKKwlscnN3YXBidWYoY21kYnVmICsgaSwgY250KTsKKwlpICs9IGNudDsKKyAgICB9CisgICAgcmV0dXJuIGNtZGJ1ZjsKK30KKworLyoKKyAqIFJldmVyc2UgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNlYWNoIHBhdGggYW5kIHN1YnN0aXR1ZGUgc2VjdGlvbiBhY2NvcmRpbmdseQorICovCisgICAgY2hhcl91ICoKK2xyRl9zdWIoaWJ1ZikKKyAgICBjaGFyX3UJKmlidWY7Cit7CisgICAgY2hhcl91CSpwLCAqZXA7CisgICAgaW50CQlpLCBjbnQ7CisKKyAgICBwID0gaWJ1ZjsKKworICAgIC8qIEZpbmQgdGhlIGJvdW5kcnkgb2YgdGhlIHNlYXJjaCBwYXRoICovCisgICAgd2hpbGUgKCgocCA9IHZpbV9zdHJjaHIoKytwLCAnLycpKSAhPSBOVUxMKSAmJiBwWy0xXSA9PSAnXFwnKQorCTsKKworICAgIGlmIChwID09IE5VTEwpCisJcmV0dXJuIGlidWY7CisKKyAgICAvKiBSZXZlcnNlIHRoZSBGYXJzaSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcGF0aC4gKi8KKyAgICBsckZzd2FwKGlidWYsIChpbnQpKHAtaWJ1ZikpOworCisgICAgLyogTm93IGZpbmQgdGhlIGJvdW5kcnkgb2YgdGhlIHN1YnN0aXR1dGUgc2VjdGlvbiAqLworICAgIGlmICgoZXAgPSAoY2hhcl91ICopc3RycmNocigoY2hhciAqKSsrcCwgJy8nKSkgIT0gTlVMTCkKKwljbnQgPSAoaW50KShlcCAtIHApOworICAgIGVsc2UKKwljbnQgPSAoaW50KVNUUkxFTihwKTsKKworICAgIC8qIFJldmVyc2UgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN1YnN0aXR1dGUgc2VjdGlvbiBhbmQgdGFrZSBjYXJlIG9mICdcJyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQtMTsgaSsrKQorCWlmIChwW2ldID09ICdcXCcpCisJeworCSAgICBwW2ldID0gcFtpKzFdIDsKKwkgICAgcFsrK2ldID0gJ1xcJzsKKwl9CisKKyAgICBscnN3YXBidWYocCwgY250KTsKKworICAgIHJldHVybiBpYnVmOworfQorCisvKgorICogTWFwIEZhcnNpIGtleWJvYXJkIHdoZW4gaW4gY21kX2ZrbWFwIG1vZGUuCisgKi8KKyAgICBpbnQKK2NtZGxfZmttYXAoYykKKyAgICBpbnQgYzsKK3sKKyAgICBpbnQJICAgIHRlbXBjOworCisgICAgc3dpdGNoIChjKQorICAgIHsKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwljYXNlICdgJzoKKwljYXNlICcgJzoKKwljYXNlICcuJzoKKwljYXNlICchJzoKKwljYXNlICciJzoKKwljYXNlICckJzoKKwljYXNlICclJzoKKwljYXNlICdeJzoKKwljYXNlICcmJzoKKwljYXNlICcvJzoKKwljYXNlICcoJzoKKwljYXNlICcpJzoKKwljYXNlICc9JzoKKwljYXNlICdcXCc6CisJY2FzZSAnPyc6CisJY2FzZSAnKyc6CisJY2FzZSAnLSc6CisJY2FzZSAnXyc6CisJY2FzZSAnKic6CisJY2FzZSAnOic6CisJY2FzZSAnIyc6CisJY2FzZSAnfic6CisJY2FzZSAnQCc6CisJY2FzZSAnPCc6CisJY2FzZSAnPic6CisJY2FzZSAneyc6CisJY2FzZSAnfSc6CisJY2FzZSAnfCc6CisJY2FzZSAnQic6CisJY2FzZSAnRSc6CisJY2FzZSAnRic6CisJY2FzZSAnSCc6CisJY2FzZSAnSSc6CisJY2FzZSAnSyc6CisJY2FzZSAnTCc6CisJY2FzZSAnTSc6CisJY2FzZSAnTyc6CisJY2FzZSAnUCc6CisJY2FzZSAnUSc6CisJY2FzZSAnUic6CisJY2FzZSAnVCc6CisJY2FzZSAnVSc6CisJY2FzZSAnVyc6CisJY2FzZSAnWSc6CisJY2FzZSAgTkw6CisJY2FzZSAgVEFCOgorCisJICAgICAgIHN3aXRjaCAoKHRlbXBjID0gY21kX2djaGFyKEFUX0NVUlNPUikpKQorCSAgICAgICB7CisJICAgIGNhc2UgX0JFOgorCSAgICBjYXNlIF9QRToKKwkgICAgY2FzZSBfVEU6CisJICAgIGNhc2UgX1NFOgorCSAgICBjYXNlIF9KSU06CisJICAgIGNhc2UgX0NIRToKKwkgICAgY2FzZSBfSEVfSjoKKwkgICAgY2FzZSBfWEU6CisJICAgIGNhc2UgX1NJTjoKKwkgICAgY2FzZSBfU0hJTjoKKwkgICAgY2FzZSBfU0FEOgorCSAgICBjYXNlIF9aQUQ6CisJICAgIGNhc2UgX0FZTjoKKwkgICAgY2FzZSBfR0hBWU46CisJICAgIGNhc2UgX0ZFOgorCSAgICBjYXNlIF9HSEFGOgorCSAgICBjYXNlIF9LQUY6CisJICAgIGNhc2UgX0dBRjoKKwkgICAgY2FzZSBfTEFNOgorCSAgICBjYXNlIF9NSU06CisJICAgIGNhc2UgX05PT046CisJICAgIGNhc2UgX0hFOgorCSAgICBjYXNlIF9IRV86CisJCQljbWRfcGNoYXIodG9GX1R5QSh0ZW1wYyksIEFUX0NVUlNPUik7CisJCWJyZWFrOworCSAgICBjYXNlIF9BWU5fOgorCQkJY21kX3BjaGFyKEFZTl8sIEFUX0NVUlNPUik7CisJCWJyZWFrOworCSAgICBjYXNlIF9HSEFZTl86CisJCQljbWRfcGNoYXIoR0hBWU5fLCBBVF9DVVJTT1IpOworCQlicmVhazsKKwkgICAgY2FzZSBfSUU6CisJCWlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19DTUQsIEFUX0NVUlNPUisxKSkKKwkJCSAgICBjbWRfcGNoYXIoSUVfLCBBVF9DVVJTT1IpOworCQllbHNlCisJCQkgICAgY21kX3BjaGFyKElFLCBBVF9DVVJTT1IpOworCQlicmVhazsKKwkgICAgY2FzZSBfWUVFOgorCQlpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfQ01ELCBBVF9DVVJTT1IrMSkpCisJCQkgICAgY21kX3BjaGFyKFlFRV8sIEFUX0NVUlNPUik7CisJCQllbHNlCisJCQkgICAgY21kX3BjaGFyKFlFRSwgQVRfQ1VSU09SKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgX1lFOgorCQlpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfQ01ELCBBVF9DVVJTT1IrMSkpCisJCQkgICAgY21kX3BjaGFyKFlFXywgQVRfQ1VSU09SKTsKKwkJCWVsc2UKKwkJCSAgICBjbWRfcGNoYXIoWUUsIEFUX0NVUlNPUik7CisJICAgIH0KKworCSAgICBzd2l0Y2ggKGMpCisJICAgIHsKKwkJY2FzZSAnMCc6ICAgcmV0dXJuIEZBUlNJXzA7CisJCWNhc2UgJzEnOiAgIHJldHVybiBGQVJTSV8xOworCQljYXNlICcyJzogICByZXR1cm4gRkFSU0lfMjsKKwkJY2FzZSAnMyc6ICAgcmV0dXJuIEZBUlNJXzM7CisJCWNhc2UgJzQnOiAgIHJldHVybiBGQVJTSV80OworCQljYXNlICc1JzogICByZXR1cm4gRkFSU0lfNTsKKwkJY2FzZSAnNic6ICAgcmV0dXJuIEZBUlNJXzY7CisJCWNhc2UgJzcnOiAgIHJldHVybiBGQVJTSV83OworCQljYXNlICc4JzogICByZXR1cm4gRkFSU0lfODsKKwkJY2FzZSAnOSc6ICAgcmV0dXJuIEZBUlNJXzk7CisJCWNhc2UgJ0InOiAgIHJldHVybiBGX1BTUDsKKwkJY2FzZSAnRSc6ICAgcmV0dXJuIEpBWlJfTjsKKwkJY2FzZSAnRic6ICAgcmV0dXJuIEFMRUZfRF9IOworCQljYXNlICdIJzogICByZXR1cm4gQUxFRl9BOworCQljYXNlICdJJzogICByZXR1cm4gVEFTSDsKKwkJY2FzZSAnSyc6ICAgcmV0dXJuIEZfTFFVT1Q7CisJCWNhc2UgJ0wnOiAgIHJldHVybiBGX1JRVU9UOworCQljYXNlICdNJzogICByZXR1cm4gSEFNWkU7CisJCWNhc2UgJ08nOiAgIHJldHVybiAnWyc7CisJCWNhc2UgJ1AnOiAgIHJldHVybiAnXSc7CisJCWNhc2UgJ1EnOiAgIHJldHVybiBPTzsKKwkJY2FzZSAnUic6ICAgcmV0dXJuIE1BRF9OOworCQljYXNlICdUJzogICByZXR1cm4gT1c7CisJCWNhc2UgJ1UnOiAgIHJldHVybiBNQUQ7CisJCWNhc2UgJ1cnOiAgIHJldHVybiBPV19PVzsKKwkJY2FzZSAnWSc6ICAgcmV0dXJuIEpBWlI7CisJCWNhc2UgJ2AnOiAgIHJldHVybiBGX1BDTjsKKwkJY2FzZSAnISc6ICAgcmV0dXJuIEZfRVhDTDsKKwkJY2FzZSAnQCc6ICAgcmV0dXJuIEZfQ09NTUE7CisJCWNhc2UgJyMnOiAgIHJldHVybiBGX0RJVklERTsKKwkJY2FzZSAnJCc6ICAgcmV0dXJuIEZfQ1VSUkVOQ1k7CisJCWNhc2UgJyUnOiAgIHJldHVybiBGX1BFUkNFTlQ7CisJCWNhc2UgJ14nOiAgIHJldHVybiBGX01VTDsKKwkJY2FzZSAnJic6ICAgcmV0dXJuIEZfQkNPTU1BOworCQljYXNlICcqJzogICByZXR1cm4gRl9TVEFSOworCQljYXNlICcoJzogICByZXR1cm4gRl9MUEFSRU5UOworCQljYXNlICcpJzogICByZXR1cm4gRl9SUEFSRU5UOworCQljYXNlICctJzogICByZXR1cm4gRl9NSU5VUzsKKwkJY2FzZSAnXyc6ICAgcmV0dXJuIEZfVU5ERVJMSU5FOworCQljYXNlICc9JzogICByZXR1cm4gRl9FUVVBTFM7CisJCWNhc2UgJysnOiAgIHJldHVybiBGX1BMVVM7CisJCWNhc2UgJ1xcJzogIHJldHVybiBGX0JTTEFTSDsKKwkJY2FzZSAnfCc6ICAgcmV0dXJuIEZfUElQRTsKKwkJY2FzZSAnOic6ICAgcmV0dXJuIEZfRENPTE9OOworCQljYXNlICciJzogICByZXR1cm4gRl9TRU1JQ09MT047CisJCWNhc2UgJy4nOiAgIHJldHVybiBGX1BFUklPRDsKKwkJY2FzZSAnLyc6ICAgcmV0dXJuIEZfU0xBU0g7CisJCWNhc2UgJzwnOiAgIHJldHVybiBGX0xFU1M7CisJCWNhc2UgJz4nOiAgIHJldHVybiBGX0dSRUFURVI7CisJCWNhc2UgJz8nOiAgIHJldHVybiBGX1FVRVNUSU9OOworCQljYXNlICcgJzogICByZXR1cm4gRl9CTEFOSzsKKwkgICAgfQorCisJICAgIGJyZWFrOworCisJY2FzZSAnYSc6ICAgcmV0dXJuIF9TSElOOworCWNhc2UgJ0EnOiAgIHJldHVybiBXQVdfSDsKKwljYXNlICdiJzogICByZXR1cm4gWkFMOworCWNhc2UgJ2MnOiAgIHJldHVybiBaRTsKKwljYXNlICdDJzogICByZXR1cm4gSkU7CisJY2FzZSAnZCc6ICAgcmV0dXJuIF9ZRTsKKwljYXNlICdEJzogICByZXR1cm4gX1lFRTsKKwljYXNlICdlJzogICByZXR1cm4gX1NFOworCWNhc2UgJ2YnOiAgIHJldHVybiBfQkU7CisJY2FzZSAnZyc6ICAgcmV0dXJuIF9MQU07CisJY2FzZSAnRyc6CisJCSAgICBpZiAoY21kX2djaGFyKEFUX0NVUlNPUikgPT0gX0xBTSApCisJCXsKKwkJICAgIGNtZF9wY2hhcihMQU0sIEFUX0NVUlNPUik7CisJCQkgICAgcmV0dXJuIEFMRUZfVV9IOworCQl9CisKKwkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0NNRCwgQVRfQ1VSU09SKSkKKwkJCXJldHVybiBBTEVGX1VfSF87CisJCWVsc2UKKwkJCXJldHVybiBBTEVGX1VfSDsKKwljYXNlICdoJzoKKwkJICAgIGlmIChjbWRfZ2NoYXIoQVRfQ1VSU09SKSA9PSBfTEFNICkKKwkJeworCQkgICAgY21kX3BjaGFyKExBLCBBVF9DVVJTT1IpOworCQkgICAgcmVkcmF3Y21kbGluZSgpOworCQkgICAgcmV0dXJuIEtfSUdOT1JFOworCQl9CisKKwkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0NNRCwgQVRfQ1VSU09SKSkKKwkJCXJldHVybiBBTEVGXzsKKwkJZWxzZQorCQkJcmV0dXJuIEFMRUY7CisJY2FzZSAnaSc6CisJCWlmIChGX2lzX1R5Ql9UeUNfVHlEKFNSQ19DTUQsIEFUX0NVUlNPUikpCisJCQlyZXR1cm4gX0hFXzsKKwkJZWxzZQorCQkJcmV0dXJuIF9IRTsKKwljYXNlICdqJzogICByZXR1cm4gX1RFOworCWNhc2UgJ0onOgorCQlpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfQ01ELCBBVF9DVVJTT1IpKQorCQkJcmV0dXJuIFRFRV87CisJCWVsc2UKKwkJCXJldHVybiBURUU7CisJY2FzZSAnayc6ICAgcmV0dXJuIF9OT09OOworCWNhc2UgJ2wnOiAgIHJldHVybiBfTUlNOworCWNhc2UgJ20nOiAgIHJldHVybiBfUEU7CisJY2FzZSAnbic6CisJY2FzZSAnTic6ICAgcmV0dXJuIERBTDsKKwljYXNlICdvJzogICByZXR1cm4gX1hFOworCWNhc2UgJ3AnOiAgIHJldHVybiBfSEVfSjsKKwljYXNlICdxJzogICByZXR1cm4gX1pBRDsKKwljYXNlICdyJzogICByZXR1cm4gX0dIQUY7CisJY2FzZSAncyc6ICAgcmV0dXJuIF9TSU47CisJY2FzZSAnUyc6ICAgcmV0dXJuIF9JRTsKKwljYXNlICd0JzogICByZXR1cm4gX0ZFOworCWNhc2UgJ3UnOgorCQlpZiAoRl9pc19UeUJfVHlDX1R5RChTUkNfQ01ELCBBVF9DVVJTT1IpKQorCQkJcmV0dXJuIF9BWU5fOworCQllbHNlCisJCQlyZXR1cm4gX0FZTjsKKwljYXNlICd2JzoKKwljYXNlICdWJzogICByZXR1cm4gUkU7CisJY2FzZSAndyc6ICAgcmV0dXJuIF9TQUQ7CisJY2FzZSAneCc6CisJY2FzZSAnWCc6ICAgcmV0dXJuIF9UQTsKKwljYXNlICd5JzoKKwkJaWYgKEZfaXNfVHlCX1R5Q19UeUQoU1JDX0NNRCwgQVRfQ1VSU09SKSkKKwkJCXJldHVybiBfR0hBWU5fOworCQllbHNlCisJCQlyZXR1cm4gX0dIQVlOOworCWNhc2UgJ3onOgorCWNhc2UgJ1onOiAgIHJldHVybiBfWkE7CisJY2FzZSAnOyc6ICAgcmV0dXJuIF9LQUY7CisJY2FzZSAnXCcnOiAgcmV0dXJuIF9HQUY7CisJY2FzZSAnLCc6ICAgcmV0dXJuIFdBVzsKKwljYXNlICdbJzogICByZXR1cm4gX0pJTTsKKwljYXNlICddJzogICByZXR1cm4gX0NIRTsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIEZfaXNhbHBoYSByZXR1cm5zIFRSVUUgaWYgJ2MnIGlzIGEgRmFyc2kgYWxwaGFiZXQKKyAqLworICAgIGludAorRl9pc2FscGhhKGMpCisgICAgaW50CWM7Cit7CisgICAgcmV0dXJuICgoIGMgPj0gVEVFXyAmJiBjIDw9IF9ZRSkKKwkgICAgfHwgKGMgPj0gQUxFRl9BICYmIGMgPD0gWUUpCisJICAgIHx8IChjID49IF9JRSAmJiBjIDw9IFlFXykpOworfQorCisvKgorICogRl9pc2RpZ2l0IHJldHVybnMgVFJVRSBpZiAnYycgaXMgYSBGYXJzaSBkaWdpdAorICovCisgICAgaW50CitGX2lzZGlnaXQoYykKKyAgICBpbnQJYzsKK3sKKyAgICByZXR1cm4gKGMgPj0gRkFSU0lfMCAmJiBjIDw9IEZBUlNJXzkpOworfQorCisvKgorICogRl9pc2NoYXIgcmV0dXJucyBUUlVFIGlmICdjJyBpcyBhIEZhcnNpIGNoYXJhY3Rlci4KKyAqLworICAgIGludAorRl9pc2NoYXIoYykKKyAgICBpbnQJYzsKK3sKKyAgICByZXR1cm4gKGMgPj0gVEVFXyAmJiBjIDw9IFlFXyk7Cit9CisKKyAgICB2b2lkCitmYXJzaV9ma2V5KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGludAkJYyA9IGNhcC0+Y21kY2hhcjsKKworICAgIGlmIChjID09IEtfRjgpCisgICAgeworCWlmIChwX2FsdGtleW1hcCkKKwl7CisJICAgIGlmIChjdXJ3aW4tPndfZmFyc2kgJiBXX1JfTCkKKwkgICAgeworCQlwX2ZrbWFwID0gMDsKKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJzZXQgbm9ybCIpOworCQlNU0coIiIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlwX2ZrbWFwID0gMTsKKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJzZXQgcmwiKTsKKwkJTVNHKCIiKTsKKwkgICAgfQorCisJICAgIGN1cndpbi0+d19mYXJzaSA9IGN1cndpbi0+d19mYXJzaSBeIFdfUl9MOworCX0KKyAgICB9CisKKyAgICBpZiAoYyA9PSBLX0Y5KQorICAgIHsKKwlpZiAocF9hbHRrZXltYXAgJiYgY3Vyd2luLT53X3BfcmwpCisJeworCSAgICBjdXJ3aW4tPndfZmFyc2kgPSBjdXJ3aW4tPndfZmFyc2kgXiBXX0NPTlY7CisJICAgIGlmIChjdXJ3aW4tPndfZmFyc2kgJiBXX0NPTlYpCisJCWNvbnZfdG9fcHZpbSgpOworCSAgICBlbHNlCisJCWNvbnZfdG9fcHN0ZCgpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvZmFyc2kuaCBiL3NyYy9mYXJzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWE0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmFyc2kuaApAQCAtMCwwICsxLDIzNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIEZhcnNpIGNoYXJhY3RlcnMgYXJlIGNhdGFnb3JpemVkIGludG8gZm9sbG93aW5nIHR5cGVzOgorICoKKyAqIFR5QQkoZm9yIGNhcGl0YWwgbGV0dGVyIHJlcHJlc2VudGF0aW9uKQorICogVHlCCShmb3IgdHlwZXMgdGhhdCBsb29rIGxpa2UgX1ggIGUuZy4gQVlOKQorICogVHlDCShmb3IgdHlwZXMgdGhhdCBsb29rIGxpa2UgWF8gIGUuZy4gWUVfKQorICogVHlECShmb3IgdHlwZXMgdGhhdCBsb29rIGxpa2UgX1hfICBlLmcuIF9BWU5fKQorICogVHlFCShmb3IgdHlwZXMgdGhhdCBsb29rIGxpa2UgWCAgZS5nLiBSRSkKKyAqLworCisvKgorICogRmFyc2kgY2hhcmFjdGVyIHNldCBkZWZpbml0aW9uCisgKi8KKworLyoKKyAqIEJlZ2luIG9mIHRoZSBub24tc3RhbmRhcmQgcGFydAorICovCisKKyNkZWZpbmUgVEVFXwkJMHg4MAorI2RlZmluZSBBTEVGX1VfSF8JMHg4MQorI2RlZmluZSBBTEVGXwkJMHg4MgorI2RlZmluZSBfQkUJCTB4ODMKKyNkZWZpbmUgX1BFCQkweDg0CisjZGVmaW5lIF9URQkJMHg4NQorI2RlZmluZSBfU0UJCTB4ODYKKyNkZWZpbmUgX0pJTQkJMHg4NworI2RlZmluZSBfQ0hFCQkweDg4CisjZGVmaW5lIF9IRV9KCQkweDg5CisjZGVmaW5lIF9YRQkJMHg4YQorI2RlZmluZSBfU0lOCQkweDhiCisjZGVmaW5lIF9TSElOCQkweDhjCisjZGVmaW5lIF9TQUQJCTB4OGQKKyNkZWZpbmUgX1pBRAkJMHg4ZQorI2RlZmluZSBfQVlOCQkweDhmCisjZGVmaW5lIF9BWU5fCQkweDkwCisjZGVmaW5lIEFZTl8JCTB4OTEKKyNkZWZpbmUgX0dIQVlOCQkweDkyCisjZGVmaW5lIF9HSEFZTl8JCTB4OTMKKyNkZWZpbmUgR0hBWU5fCQkweDk0CisjZGVmaW5lIF9GRQkJMHg5NQorI2RlZmluZSBfR0hBRgkJMHg5NgorI2RlZmluZSBfS0FGCQkweDk3CisjZGVmaW5lIF9HQUYJCTB4OTgKKyNkZWZpbmUgX0xBTQkJMHg5OQorI2RlZmluZSBMQQkJMHg5YQorI2RlZmluZSBfTUlNCQkweDliCisjZGVmaW5lIF9OT09OCQkweDljCisjZGVmaW5lIF9IRQkJMHg5ZAorI2RlZmluZSBfSEVfCQkweDllCisjZGVmaW5lIF9ZRQkJMHg5ZgorI2RlZmluZSBfSUUJCTB4ZWMKKyNkZWZpbmUgSUVfCQkweGVkCisjZGVmaW5lIElFCQkweGZiCisjZGVmaW5lIF9ZRUUJCTB4ZWUKKyNkZWZpbmUgWUVFXwkJMHhlZgorI2RlZmluZSBZRV8JCTB4ZmYKKworLyoKKyAqIEVuZCBvZiB0aGUgbm9uLXN0YW5kYXJkIHBhcnQKKyAqLworCisvKgorICogU3RhbmRhcmQgcGFydAorICovCisKKyNkZWZpbmUgRl9CTEFOSwkJMHhhMAkvKiBGYXJzaSAnICcgKFNQKSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9QU1AJCTB4YTEJLyogUFNQIGZvciBjYXBpdGFsaXppbmcgb2YgYSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9QQ04JCTB4YTIJLyogUENOIGZvciByZWRlZmluaW5nIG9mIHRoZSBoYW15ZSBtZWFuaW5nICovCisjZGVmaW5lIEZfRVhDTAkJMHhhMwkvKiBGYXJzaSAhIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0NVUlJFTkNZCTB4YTQJLyogRmFyc2kgUmlhbCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9QRVJDRU5UCTB4YTUJLyogRmFyc2kgJSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9QRVJJT0QJMHhhNgkvKiBGYXJzaSAnLicgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfQ09NTUEJCTB4YTcJLyogRmFyc2kgJywnIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0xQQVJFTlQJMHhhOAkvKiBGYXJzaSAnKCcgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfUlBBUkVOVAkweGE5CS8qIEZhcnNpICcpJyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9NVUwJCTB4YWEJLyogRmFyc2kgJ3gnIGNoYXJhY3RlciAqLworI2RlZmluZSBGX1BMVVMJCTB4YWIJLyogRmFyc2kgJysnIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0JDT01NQQkweGFjCS8qIEZhcnNpIGNvbW1hIGNoYXJhY3RlciAqLworI2RlZmluZSBGX01JTlVTCQkweGFkCS8qIEZhcnNpICctJyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9ESVZJREUJMHhhZQkvKiBGYXJzaSBkaXZpZGUgKC8pIGNoYXJhY3RlciAqLworI2RlZmluZSBGX1NMQVNICQkweGFmCS8qIEZhcnNpICcvJyBjaGFyYWN0ZXIgKi8KKworI2RlZmluZSBGQVJTSV8wCQkweGIwCisjZGVmaW5lIEZBUlNJXzEJCTB4YjEKKyNkZWZpbmUgRkFSU0lfMgkJMHhiMgorI2RlZmluZSBGQVJTSV8zCQkweGIzCisjZGVmaW5lIEZBUlNJXzQJCTB4YjQKKyNkZWZpbmUgRkFSU0lfNQkJMHhiNQorI2RlZmluZSBGQVJTSV82CQkweGI2CisjZGVmaW5lIEZBUlNJXzcJCTB4YjcKKyNkZWZpbmUgRkFSU0lfOAkJMHhiOAorI2RlZmluZSBGQVJTSV85CQkweGI5CisKKyNkZWZpbmUgRl9EQ09MT04JMHhiYQkvKiBGYXJzaSAnOicgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfU0VNSUNPTE9OCTB4YmIJLyogRmFyc2kgJzsnIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0dSRUFURVIJMHhiYwkvKiBGYXJzaSAnPicgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfRVFVQUxTCTB4YmQJLyogRmFyc2kgJz0nIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0xFU1MJCTB4YmUJLyogRmFyc2kgJzwnIGNoYXJhY3RlciAqLworI2RlZmluZSBGX1FVRVNUSU9OCTB4YmYJLyogRmFyc2kgPyBjaGFyYWN0ZXIgKi8KKworI2RlZmluZSBBTEVGX0EJMHhjMAorI2RlZmluZSBBTEVGCTB4YzEKKyNkZWZpbmUgSEFNWkUJMHhjMgorI2RlZmluZSBCRQkweGMzCisjZGVmaW5lIFBFCTB4YzQKKyNkZWZpbmUgVEUJMHhjNQorI2RlZmluZSBTRQkweGM2CisjZGVmaW5lIEpJTQkweGM3CisjZGVmaW5lIENIRQkweGM4CisjZGVmaW5lIEhFX0oJMHhjOQorI2RlZmluZSBYRQkweGNhCisjZGVmaW5lIERBTAkweGNiCisjZGVmaW5lIFpBTAkweGNjCisjZGVmaW5lIFJFCTB4Y2QKKyNkZWZpbmUgWkUJMHhjZQorI2RlZmluZSBKRQkweGNmCisjZGVmaW5lIFNJTgkweGQwCisjZGVmaW5lIFNISU4JMHhkMQorI2RlZmluZSBTQUQJMHhkMgorI2RlZmluZSBaQUQJMHhkMworI2RlZmluZSBfVEEJMHhkNAorI2RlZmluZSBfWkEJMHhkNQorI2RlZmluZSBBWU4JMHhkNgorI2RlZmluZSBHSEFZTgkweGQ3CisjZGVmaW5lIEZFCTB4ZDgKKyNkZWZpbmUgR0hBRgkweGQ5CisjZGVmaW5lIEtBRgkweGRhCisjZGVmaW5lIEdBRgkweGRiCisjZGVmaW5lIExBTQkweGRjCisjZGVmaW5lIE1JTQkweGRkCisjZGVmaW5lIE5PT04JMHhkZQorI2RlZmluZSBXQVcJMHhkZgorI2RlZmluZSBGX0hFCTB4ZTAJCS8qIEZfIGFkZGVkIGZvciBuYW1lIGNsYXNoIHdpdGggUGVybCAqLworI2RlZmluZSBZRQkweGUxCisjZGVmaW5lIFRFRQkweGZjCisjZGVmaW5lIF9LQUZfSAkweGZkCisjZGVmaW5lIFlFRQkweGZlCisKKyNkZWZpbmUgRl9MQlJBQ0sJMHhlMgkvKiBGYXJzaSAnWycgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfUkJSQUNLCTB4ZTMJLyogRmFyc2kgJ10nIGNoYXJhY3RlciAqLworI2RlZmluZSBGX0xCUkFDRQkweGU0CS8qIEZhcnNpICd7JyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9SQlJBQ0UJMHhlNQkvKiBGYXJzaSAnfScgY2hhcmFjdGVyICovCisjZGVmaW5lIEZfTFFVT1QJCTB4ZTYJLyogRmFyc2kgbGVmdCBxdW90YXRpb24gY2hhcmFjdGVyICovCisjZGVmaW5lIEZfUlFVT1QJCTB4ZTcJLyogRmFyc2kgcmlnaHQgcXVvdGF0aW9uIGNoYXJhY3RlciAqLworI2RlZmluZSBGX1NUQVIJCTB4ZTgJLyogRmFyc2kgJyonIGNoYXJhY3RlciAqLworI2RlZmluZSBGX1VOREVSTElORQkweGU5CS8qIEZhcnNpICdfJyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9QSVBFCQkweGVhCS8qIEZhcnNpICd8JyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgRl9CU0xBU0gJMHhlYgkvKiBGYXJzaSAnXCcgY2hhcmFjdGVyICovCisKKyNkZWZpbmUgTUFECQkweGYwCisjZGVmaW5lIEpBWlIJCTB4ZjEKKyNkZWZpbmUgT1cJCTB4ZjIKKyNkZWZpbmUgTUFEX04JCTB4ZjMKKyNkZWZpbmUgSkFaUl9OCQkweGY0CisjZGVmaW5lIE9XX09XCQkweGY1CisjZGVmaW5lIFRBU0gJCTB4ZjYKKyNkZWZpbmUgT08JCTB4ZjcKKyNkZWZpbmUgQUxFRl9VX0gJMHhmOAorI2RlZmluZSBXQVdfSAkJMHhmOQorI2RlZmluZSBBTEVGX0RfSAkweGZhCisKKy8qCisgKiBnbG9iYWwgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PQorICovCisKKyNkZWZpbmUgU1JDX0VEVAkwCisjZGVmaW5lIFNSQ19DTUQgMQorCisjZGVmaW5lIEFUX0NVUlNPUiAwCisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIHdpbmRvdyBkZXBlbmRlbnQgZnVuY3Rpb25zICh3X2ZhcnNpKS4KKyAqLworI2RlZmluZSBXX0NPTlYgMHgxCisjZGVmaW5lIFdfUl9MICAweDIKKworCisvKiBzcGVjaWFsIEZhcnNpIHRleHQgbWVzc2FnZXMgKi8KKworRVhURVJOIGNoYXJfdSBmYXJzaV90ZXh0XzFbXQorI2lmZGVmIERPX0lOSVQKKwkJPSB7IFlFXywgX1NJTiwgUkUsIEFMRUZfLCBfRkUsICcgJywgJ1YnLCAnSScsICdNJywKKwkJICAgICcgJywgRl9IRSwgX0JFLCAnICcsIFNISU4sIFJFLCBfR0FGLCBEQUwsJyAnLCBOT09OLAorCQkgICAgQUxFRl8sIF9ZRSwgQUxFRl8sIF9QRSwgJ1wwJ30KKyNlbmRpZgorCQkgICAgIDsKKworRVhURVJOIGNoYXJfdSBmYXJzaV90ZXh0XzJbXQorI2lmZGVmIERPX0lOSVQKKwkJPSB7IFlFXywgX1NJTiwgUkUsIEFMRUZfLCBfRkUsICcgJywgRkFSU0lfMywgRkFSU0lfMywKKwkJICAgIEZBUlNJXzQsIEZBUlNJXzIsICcgJywgREFMLCBSRSwgQUxFRiwgREFMLCBfTk9PTiwKKwkJICAgIEFMRUZfLCBfVEUsIF9TSU4sIEFMRUYsICcgJywgRl9IRSwgX0JFLCAnICcsIFNISU4sCisJCSAgICBSRSwgIF9HQUYsIERBTCwgJyAnLCBOT09OLCBBTEVGXywgX1lFLCBBTEVGXywgX1BFLCAnXDAnfQorI2VuZGlmCisJCSAgICAgOworCitFWFRFUk4gY2hhcl91IGZhcnNpX3RleHRfM1tdCisjaWZkZWYgRE9fSU5JVAorCQk9IHsgREFMLCBXQVcsIF9TSElOLCBfWUUsIF9NSU0sIF9OT09OLCAnICcsIFlFXywgX05PT04sCisJCSAgICBBTEVGXyxfQkUsIF9ZRSwgX1RFLCBfU0hJTiwgX1BFLCAnICcsICdSJywnRScsJ1AnLCdMJywKKwkJICAgICdBJywnQycsJ0UnLCAnICcsIE5PT04sIEFMRUZfLCBfTUlNLCBSRSwgX0ZFLCBaRSwgQUxFRiwKKwkJICAgICcgJywgJ1InLCAnRScsICdWJywgJ0UnLCAnUicsICdTJywgJ0UnLCAnICcsICdJJywgJ04nLAorCQkgICAgJ1MnLCAnRScsICdSJywgJ1QnLCAnICcsIFNISU4sIFdBVywgUkUsICcgJywgQUxFRl8sIF9CRSwKKwkJICAgICcgJywgWUVfLCBfU0lOLCBSRSwgQUxFRl8sIF9GRSwgJyAnLCBSRSwgREFMLCAnICcsIFJFLAorCQkgICAgQUxFRl8sIF9LQUYsJyAnLCBNSU0sIEFMRUZfLCBfR0FGLCBfTk9PTiwgX0hFLCAnXDAnfQorI2VuZGlmCisJCSAgICA7CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCitFWFRFUk4gY2hhcl91IGZhcnNpX3RleHRfNFtdCisjaWZkZWYgRE9fSU5JVAorCQk9IHsgREFMLCBXQVcsIF9TSElOLCBfWUUsIF9NSU0sIF9OT09OLCAnICcsIFlFXywgX05PT04sCisJCSAgICBBTEVGXywgX0JFLCBfWUUsIF9URSwgX1NISU4sIF9QRSwgJyAnLCAnPCcsICdDJywnVCcsJ1InLAorCQkgICAgJ0wnLCctJywnQicsJz4nLCAnICcsIE5PT04sIEFMRUZfLCBfTUlNLCBSRSwgX0ZFLCBaRSwKKwkJICAgIEFMRUYsICcgJywgWUVfLCBfU0lOLCBSRSwgQUxFRl8sIF9GRSwgJyAnLCBSRSwgREFMLCAnICcsCisJCSAgICBSRSwgQUxFRl8sIF9LQUYsJyAnLCBNSU0sIEFMRUZfLCBfR0FGLCBfTk9PTiwgX0hFLCAnXDAnfQorI2VuZGlmCisJCSAgICA7CisjZW5kaWYKKworRVhURVJOIGNoYXJfdSBmYXJzaV90ZXh0XzVbXQorI2lmZGVmIERPX0lOSVQKKwkJPSB7ICcgJywgWUVfLCBfU0lOLCBSRSwgQUxFRl8sIF9GRSwgJ1wwJ30KKyNlbmRpZgorCQkgICAgOwpkaWZmIC0tZ2l0IGEvc3JjL2ZlYXR1cmUuaCBiL3NyYy9mZWF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1YzA3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mZWF0dXJlLmgKQEAgLTAsMCArMSwxMTg0IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9MCBzdz04OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKy8qCisgKiBmZWF0dXJlLmg6IERlZmluZXMgZm9yIG9wdGlvbmFsIGNvZGUgYW5kIHByZWZlcmVuY2VzCisgKgorICogRWRpdCB0aGlzIGZpbGUgdG8gaW5jbHVkZS9leGNsdWRlIHBhcnRzIG9mIFZpbSwgYmVmb3JlIGNvbXBpbGluZy4KKyAqIFRoZSBvbmx5IG90aGVyIGZpbGUgdGhhdCBtYXkgYmUgZWRpdGVkIGlzIE1ha2VmaWxlLCBpdCBjb250YWlucyBtYWNoaW5lCisgKiBzcGVjaWZpYyBvcHRpb25zLgorICoKKyAqIFRvIGluY2x1ZGUgc3BlY2lmaWMgb3B0aW9ucywgY2hhbmdlIHRoZSAiI2lmKiIgYW5kICIjZW5kaWYiIGludG8gY29tbWVudHMsCisgKiBvciB1bmNvbW1lbnQgdGhlICIjZGVmaW5lIi4KKyAqIFRvIGV4Y2x1ZGUgc3BlY2lmaWMgb3B0aW9ucywgY2hhbmdlIHRoZSAiI2RlZmluZSIgaW50byBhIGNvbW1lbnQuCisgKi8KKworLyoKKyAqIFdoZW4gYWRkaW5nIGEgbmV3IGZlYXR1cmU6CisgKiAtIEFkZCBhICNkZWZpbmUgYmVsb3cuCisgKiAtIEFkZCBhIG1lc3NhZ2UgaW4gdGhlIHRhYmxlIGFib3ZlIGV4X3ZlcnNpb24oKS4KKyAqIC0gQWRkIGEgc3RyaW5nIHRvIGZfaGFzKCkuCisgKiAtIEFkZCBhIGZlYXR1cmUgdG8gIjpoZWxwIGZlYXR1cmUtbGlzdCIgaW4gZG9jL2V2YWwudHh0LgorICogLSBBZGQgZmVhdHVyZSB0byAiOmhlbHAgK2ZlYXR1cmUtbGlzdCIgaW4gZG9jL3ZhcmlvdXMudHh0LgorICogLSBBZGQgY29tbWVudCBmb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgY29tbWFuZHMgdGhhdCB1c2UgdGhlIGZlYXR1cmUuCisgKi8KKworLyoKKyAqIEJhc2ljIGNob2ljZXM6CisgKiA9PT09PT09PT09PT09PQorICoKKyAqICt0aW55CQlhbG1vc3Qgbm8gZmVhdHVyZXMgZW5hYmxlZCwgbm90IGV2ZW4gbXVsdGlwbGUgd2luZG93cworICogK3NtYWxsCQlmZXcgZmVhdHVyZXMgZW5hYmxlZCwgYXMgYmFzaWMgYXMgcG9zc2libGUKKyAqICtub3JtYWwJCUEgZGVmYXVsdCBzZWxlY3Rpb24gb2YgZmVhdHVyZXMgZW5hYmxlZAorICogK2JpZwkJCW1hbnkgZmVhdHVyZXMgZW5hYmxlZCwgYXMgcmljaCBhcyBwb3NzaWJsZS4KKyAqICtodWdlCQlhbGwgcG9zc2libGUgZmVhdHVlcyBlbmFibGVkLgorICoKKyAqIFdoZW4gK3NtYWxsIGlzIHVzZWQsICt0aW55IGlzIGFsc28gaW5jbHVkZWQuICArbm9ybWFsIGltcGxpZXMgK3NtYWxsLCBldGMuCisgKi8KKworLyoKKyAqIFVuY29tbWVudCBvbmUgb2YgdGhlc2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuICBGb3IgdW5peCB1c2UgYSBjb25maWd1cmUKKyAqIGFyZ3VtZW50LCBzZWUgTWFrZWZpbGUuCisgKi8KKyNpZiAhZGVmaW5lZChGRUFUX1RJTlkpICYmICFkZWZpbmVkKEZFQVRfU01BTEwpICYmICFkZWZpbmVkKEZFQVRfTk9STUFMKSBcCisJJiYgIWRlZmluZWQoRkVBVF9CSUcpICYmICFkZWZpbmVkKEZFQVRfSFVHRSkKKy8qICNkZWZpbmUgRkVBVF9USU5ZICovCisvKiAjZGVmaW5lIEZFQVRfU01BTEwgKi8KKy8qICNkZWZpbmUgRkVBVF9OT1JNQUwgKi8KKy8qICNkZWZpbmUgRkVBVF9CSUcgKi8KKy8qICNkZWZpbmUgRkVBVF9IVUdFICovCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGV4ZWN1dGFibGVzIGFyZSBtYWRlIGF2YWlsYWJsZSB3aXRoIHRoZSArYmlnIGZlYXR1cmUsIGJlY2F1c2UgdGhleQorICogYXJlIHN1cHBvc2VkIHRvIGhhdmUgZW5vdWdoIFJBTTogV2luMzIgKGNvbnNvbGUgJiBHVUkpLCBkb3MzMiwgT1MvMiBhbmQgVk1TLgorICogVGhlIGRvczE2IHZlcnNpb24gaGFzIHZlcnkgbGl0dGxlIFJBTSBhdmFpbGFibGUsIHVzZSArc21hbGwuCisgKi8KKyNpZiAhZGVmaW5lZChGRUFUX1RJTlkpICYmICFkZWZpbmVkKEZFQVRfU01BTEwpICYmICFkZWZpbmVkKEZFQVRfTk9STUFMKSBcCisJJiYgIWRlZmluZWQoRkVBVF9CSUcpICYmICFkZWZpbmVkKEZFQVRfSFVHRSkKKyMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKEFNSUdBKQorIyAgZGVmaW5lIEZFQVRfQklHCisjIGVsc2UKKyMgIGlmZGVmIE1TRE9TCisjICAgZGVmaW5lIEZFQVRfU01BTEwKKyMgIGVsc2UKKyMgICBkZWZpbmUgRkVBVF9OT1JNQUwKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIEVhY2ggZmVhdHVyZSBpbXBsaWVzIGluY2x1ZGluZyB0aGUgInNtYWxsZXIiIG9uZXMuCisgKi8KKyNpZmRlZiBGRUFUX0hVR0UKKyMgZGVmaW5lIEZFQVRfQklHCisjZW5kaWYKKyNpZmRlZiBGRUFUX0JJRworIyBkZWZpbmUgRkVBVF9OT1JNQUwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1NNQUxMCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NNQUxMCisjIGRlZmluZSBGRUFUX1RJTlkKKyNlbmRpZgorCisvKgorICogT3B0aW9uYWwgY29kZSAoc2VlICI6aGVscCArZmVhdHVyZS1saXN0IikKKyAqID09PT09PT09PT09PT0KKyAqLworCisvKgorICogK3dpbmRvd3MJCU11bHRpcGxlIHdpbmRvd3MuICBXaXRob3V0IHRoaXMgdGhlcmUgaXMgbm8gaGVscAorICoJCQl3aW5kb3cgYW5kIG5vIHN0YXR1cyBsaW5lcy4KKyAqLworI2lmZGVmIEZFQVRfU01BTEwKKyMgZGVmaW5lIEZFQVRfV0lORE9XUworI2VuZGlmCisKKy8qCisgKiArbGlzdGNtZHMJCVZpbSBjb21tYW5kcyBmb3IgdGhlIGJ1ZmZlciBsaXN0IGFuZCB0aGUgYXJndW1lbnQKKyAqCQkJbGlzdC4gIFdpdGhvdXQgdGhpcyB0aGVyZSBpcyBubyAiOmJ1ZmZlciIgIjpibmV4dCIsCisgKgkJCSI6YmRlbCIsICI6YXJnZGVsZXRlIiwgZXRjLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfTElTVENNRFMKKyNlbmRpZgorCisvKgorICogK3ZlcnRzcGxpdAkJVmVydGljYWxseSBzcGxpdCB3aW5kb3dzLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfVkVSVFNQTElUCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfVkVSVFNQTElUKSAmJiAhZGVmaW5lZChGRUFUX1dJTkRPV1MpCisjIGRlZmluZSBGRUFUX1dJTkRPV1MKKyNlbmRpZgorCisvKgorICogK2NtZGhpc3QJCUNvbW1hbmQgbGluZSBoaXN0b3J5LgorICovCisjaWZkZWYgRkVBVF9TTUFMTAorIyBkZWZpbmUgRkVBVF9DTURISVNUCisjZW5kaWYKKworLyoKKyAqICtqdW1wbGlzdAkJSnVtcGxpc3QsIENUUkwtTyBhbmQgQ1RSTC1JIGNvbW1hbmRzLgorICovCisjaWZkZWYgRkVBVF9TTUFMTAorIyBkZWZpbmUgRkVBVF9KVU1QTElTVAorI2VuZGlmCisKKy8qIHRoZSBjbWRsaW5lLXdpbmRvdyByZXF1aXJlcyBGRUFUX1ZFUlRTUExJVCBhbmQgRkVBVF9DTURISVNUICovCisjaWYgZGVmaW5lZChGRUFUX1ZFUlRTUExJVCkgJiYgZGVmaW5lZChGRUFUX0NNREhJU1QpCisjIGRlZmluZSBGRUFUX0NNRFdJTgorI2VuZGlmCisKKy8qCisgKiArZm9sZGluZwkJRm9sZCBsaW5lcy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0ZPTERJTkcKKyNlbmRpZgorCisvKgorICogK2RpZ3JhcGhzCQlEaWdyYXBocy4KKyAqCQkJSW4gaW5zZXJ0IG1vZGUgYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUgeW91IHdpbGwgYmUKKyAqCQkJYWJsZSB0byB1c2UgZGlncmFwaHMuIFRoZSBDVFJMLUsgY29tbWFuZCB3aWxsIHdvcmsuCisgKgkJCURlZmluZSBPTERfRElHUkFQSFMgdG8gZ2V0IGRpZ3JhcGhzIGNvbXBhdGlibGUgd2l0aAorICoJCQlWaW0gNS54LiAgVGhlIG5ldyBvbmVzIGFyZSBmcm9tIFJGQyAxMzQ1LgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfRElHUkFQSFMKKy8qICNkZWZpbmUgT0xEX0RJR1JBUEhTICovCisjZW5kaWYKKworLyoKKyAqICtsYW5nbWFwCQknbGFuZ21hcCcgb3B0aW9uLiAgT25seSB1c2VmdWwgd2hlbiB5b3UgcHV0IHlvdXIKKyAqCQkJa2V5Ym9hcmQgaW4gYSBzcGVjaWFsIGxhbmd1YWdlIG1vZGUsIGUuZy4gZm9yIHR5cGluZworICoJCQlncmVlay4KKyAqLworI2lmZGVmIEZFQVRfQklHCisjIGRlZmluZSBGRUFUX0xBTkdNQVAKKyNlbmRpZgorCisvKgorICogK2tleW1hcAkJJ2tleW1hcCcgb3B0aW9uLiAgQWxsb3dzIHlvdSB0byBtYXAgdHlwZWQga2V5cyBpbgorICoJCQlJbnNlcnQgbW9kZSBmb3IgYSBzcGVjaWFsIGxhbmd1YWdlLgorICovCisjaWZkZWYgRkVBVF9CSUcKKyMgZGVmaW5lIEZFQVRfS0VZTUFQCisjZW5kaWYKKworLyoKKyAqICtsb2NhbG1hcAkJTWFwcGluZ3MgYW5kIGFiYnJldmlhdGlvbnMgbG9jYWwgdG8gYSBidWZmZXIuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9MT0NBTE1BUAorI2VuZGlmCisKKy8qCisgKiAraW5zZXJ0X2V4cGFuZAlDVFJMLU4vQ1RSTC1QL0NUUkwtWCBpbiBpbnNlcnQgbW9kZS4gVGFrZXMgYWJvdXQKKyAqCQkJNEtieXRlIG9mIGNvZGUuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9JTlNfRVhQQU5ECisjZW5kaWYKKworLyoKKyAqICtjbWRsaW5lX2NvbXBsCWNvbXBsZXRpb24gb2YgbWFwcGluZ3MvYWJicmV2aWF0aW9ucyBpbiBjbWRsaW5lIG1vZGUuCisgKgkJCVRha2VzIGEgZmV3IEtieXRlIG9mIGNvZGUuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9DTURMX0NPTVBMCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBWSU1fQkFDS1RJQ0sJCS8qIGludGVybmFsIGJhY2t0aWNrIGV4cGFuc2lvbiAqLworI2VuZGlmCisKKy8qCisgKiArdGV4dG9iamVjdHMJCVRleHQgb2JqZWN0czogInZhdyIsICJkYXMiLCBldGMuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9URVhUT0JKCisjZW5kaWYKKworLyoKKyAqICt2aXN1YWwJCVZpc3VhbCBtb2RlLgorICogK3Zpc3VhbGV4dHJhCQlFeHRyYSBmZWF0dXJlcyBmb3IgVmlzdWFsIG1vZGUgKG1vc3RseSBibG9jayBvcGVyYXRvcnMpLgorICovCisjaWZkZWYgRkVBVF9TTUFMTAorIyBkZWZpbmUgRkVBVF9WSVNVQUwKKyMgaWZkZWYgRkVBVF9OT1JNQUwKKyMgIGRlZmluZSBGRUFUX1ZJU1VBTEVYVFJBCisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBGRUFUX0NMSVBCT0FSRAorIyAgdW5kZWYgRkVBVF9DTElQQk9BUkQJLyogY2FuJ3QgdXNlIGNsaXBib2FyZCB3aXRob3V0IFZpc3VhbCBtb2RlICovCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqICt2aXJ0dWFsZWRpdAkJJ3ZpcnR1YWxlZGl0JyBvcHRpb24gYW5kIGl0cyBpbXBsZW1lbnRhdGlvbgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfVklSVFVBTEVESVQKKyNlbmRpZgorCisvKgorICogK3ZyZXBsYWNlCQkiZ1IiIGFuZCAiZ3IiIGNvbW1hbmRzLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfVlJFUExBQ0UKKyNlbmRpZgorCisvKgorICogK2NtZGxpbmVfaW5mbwknc2hvd2NtZCcgYW5kICdydWxlcicgb3B0aW9ucy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0NNRExfSU5GTworI2VuZGlmCisKKy8qCisgKiArbGluZWJyZWFrCQknc2hvd2JyZWFrJywgJ2JyZWFrYXQnICBhbmQgJ2xpbmVicmVhaycgb3B0aW9ucy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0xJTkVCUkVBSworI2VuZGlmCisKKy8qCisgKiArZXhfZXh0cmEJCSI6cmV0YWIiLCAiOnJpZ2h0IiwgIjpsZWZ0IiwgIjpjZW50ZXIiLCAiOm5vcm1hbCIuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9FWF9FWFRSQQorI2VuZGlmCisKKy8qCisgKiArZXh0cmFfc2VhcmNoCSdobHNlYXJjaCcgYW5kICdpbmNzZWFyY2gnIG9wdGlvbnMuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9TRUFSQ0hfRVhUUkEKKyNlbmRpZgorCisvKgorICogK3F1aWNrZml4CQlRdWlja2ZpeCBjb21tYW5kcy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1FVSUNLRklYCisjZW5kaWYKKworLyoKKyAqICtmaWxlX2luX3BhdGgJImdmIiBhbmQgIjxjZmlsZT4iIGNvbW1hbmRzLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfU0VBUkNIUEFUSAorI2VuZGlmCisKKy8qCisgKiArZmluZF9pbl9wYXRoCSJbSSIgIjppc2VhcmNoIiAiXldeSSIsICI6Y2hlY2twYXRoIiwgZXRjLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgaWZkZWYgRkVBVF9TRUFSQ0hQQVRICS8qIEZFQVRfU0VBUkNIUEFUSCBpcyByZXF1aXJlZCAqLworIyAgZGVmaW5lIEZFQVRfRklORF9JRAorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiArcGF0aF9leHRyYQkJdXAvZG93bndhcmRzIHNlYXJjaGluZyBpbiAncGF0aCcgYW5kICd0YWdzJy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1BBVEhfRVhUUkEKKyNlbmRpZgorCisvKgorICogK3JpZ2h0bGVmdAkJUmlnaHQtdG8tbGVmdCBlZGl0aW5nL3R5cGluZyBzdXBwb3J0LgorICovCisjaWZkZWYgRkVBVF9CSUcKKyMgZGVmaW5lIEZFQVRfUklHSFRMRUZUCisjZW5kaWYKKworLyoKKyAqICtmYXJzaQkJRmFyc2kgKFBlcnNpYW4gbGFuZ3VhZ2UpIEtleW1hcCBzdXBwb3J0LgorICoJCQlSZXF1aXJlcyBGRUFUX1JJR0hUTEVGVC4KKyAqLworI2lmZGVmIEZFQVRfQklHCisjIGRlZmluZSBGRUFUX0ZLTUFQCisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZLTUFQCisjIGlmbmRlZiBGRUFUX1JJR0hUTEVGVAorIyAgIGRlZmluZSBGRUFUX1JJR0hUTEVGVAorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiArYXJhYmljCQlBcmFiaWMga2V5bWFwIGFuZCBzaGFwaW5nIHN1cHBvcnQuCisgKgkJCVJlcXVpcmVzIEZFQVRfUklHSFRMRUZUIGFuZCBGRUFUX01CWVRFLgorICovCisjaWYgZGVmaW5lZChGRUFUX0JJRykgJiYgIWRlZmluZWQoV0lOMTYpICYmIFNJWkVPRl9JTlQgPj0gNCAmJiAhZGVmaW5lZChFQkNESUMpCisjIGRlZmluZSBGRUFUX0FSQUJJQworI2VuZGlmCisjaWZkZWYgRkVBVF9BUkFCSUMKKyMgaWZuZGVmIEZFQVRfUklHSFRMRUZUCisjICAgZGVmaW5lIEZFQVRfUklHSFRMRUZUCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqICtlbWFjc190YWdzCQlXaGVuIEZFQVRfRU1BQ1NfVEFHUyBkZWZpbmVkOiBJbmNsdWRlIHN1cHBvcnQgZm9yCisgKgkJCWVtYWNzIHN0eWxlIFRBR1MgZmlsZS4KKyAqLworI2lmZGVmIEZFQVRfQklHCisjIGRlZmluZSBGRUFUX0VNQUNTX1RBR1MKKyNlbmRpZgorCisvKgorICogK3RhZ19iaW5hcnkJCUNhbiB1c2UgYSBiaW5hcnkgc2VhcmNoIGZvciB0aGUgdGFncyBmaWxlLgorICoKKyAqIERpc2FibGVkIGZvciBFQkNESUM6CisgKiBPbiBPUy8zOTAgVW5peCB3ZSBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgL2Jpbi9zb3J0IHNvcnRzIEFTQ0lJIGluc3RlYWQgb2YKKyAqIEVCQ0RJQy4gIFdpdGggdGhpcyBiaW5hcnkgc2VhcmNoIGRvZXNuJ3Qgd29yaywgYXMgVklNIGV4cGVjdHMgYSB0YWcgZmlsZQorICogc29ydGVkIGJ5IGNoYXJhY3RlciB2YWx1ZXMuICBJJ20gbm90IHN1cmUgaG93IHRvIGZpeCB0aGlzLiBTaG91bGQgd2UgcmVhbGx5CisgKiBkbyBhIEVCQ0RJQyB0byBBU0NJSSBjb252ZXJzaW9uIGZvciB0aGlzPz8KKyAqLworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmICFkZWZpbmVkKEVCQ0RJQykKKyMgZGVmaW5lIEZFQVRfVEFHX0JJTlMKKyNlbmRpZgorCisvKgorICogK3RhZ19vbGRfc3RhdGljCU9sZCBzdHlsZSBzdGF0aWMgdGFnczogImZpbGU6dGFnICBmaWxlICAuLiIuICBTbG93cworICoJCQlkb3duIHRhZyBzZWFyY2hpbmcgYSBiaXQuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9UQUdfT0xEU1RBVElDCisjZW5kaWYKKworLyoKKyAqICt0YWdfYW55X3doaXRlCUFsbG93IGFueSB3aGl0ZSBzcGFjZSB0byBzZXBhcmF0ZSB0aGUgZmllbGRzIGluIGEgdGFncworICoJCQlmaWxlLiAgV2hlbiBub3QgZGVmaW5lZCwgb25seSBhIFRBQiBpcyBhbGxvd2VkLgorICovCisvKiAjZGVmaW5lIEZFQVRfVEFHX0FOWVdISVRFICovCisKKy8qCisgKiArY3Njb3BlCQlVbml4IG9ubHk6IENzY29wZSBzdXBwb3J0LgorICovCisjaWYgZGVmaW5lZChVTklYKSAmJiBkZWZpbmVkKEZFQVRfQklHKSAmJiAhZGVmaW5lZChGRUFUX0NTQ09QRSkgJiYgIWRlZmluZWQoTUFDT1NfWCkKKyMgZGVmaW5lIEZFQVRfQ1NDT1BFCisjZW5kaWYKKworLyoKKyAqICtldmFsCQlCdWlsdC1pbiBzY3JpcHQgbGFuZ3VhZ2UgYW5kIGV4cHJlc3Npb24gZXZhbHVhdGlvbiwKKyAqCQkJIjpsZXQiLCAiOmlmIiwgZXRjLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfRVZBTAorI2VuZGlmCisKKy8qCisgKiArdXNlcl9jb21tYW5kcwlBbGxvdyB0aGUgdXNlciB0byBkZWZpbmUgaGlzIG93biBjb21tYW5kcy4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1VTUl9DTURTCisjZW5kaWYKKworLyoKKyAqICtwcmludGVyCQkiOmhhcmRjb3B5IiBjb21tYW5kCisgKiArcG9zdHNjcmlwdAkJUHJpbnRpbmcgdXNlcyBQb3N0U2NyaXB0IGZpbGUgb3V0cHV0LgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgKGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9FVkFMKSkgXAorCSYmICFkZWZpbmVkKEFNSUdBKQorIyBkZWZpbmUgRkVBVF9QUklOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfUFJJTlRFUikgJiYgKChkZWZpbmVkKE1TV0lOKSAmJiBkZWZpbmVkKE1TV0lOUFMpKSBcCisJfHwgKCFkZWZpbmVkKE1TV0lOKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkpKQorIyBkZWZpbmUgRkVBVF9QT1NUU0NSSVBUCisjZW5kaWYKKworLyoKKyAqICttb2RpZnlfZm5hbWUJbW9kaWZpZXJzIGZvciBmaWxlIG5hbWUuICBFLmcuLCAiJTpwOmgiLgorICovCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfTU9ESUZZX0ZOQU1FCisjZW5kaWYKKworLyoKKyAqICthdXRvY21kCQkiOmF1dG9jbWQiIGNvbW1hbmQKKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0FVVE9DTUQKKyNlbmRpZgorCisvKgorICogK2RpZmYJCURpc3BsYXlpbmcgZGlmZnMgaW4gYSBuaWNlIHdheS4KKyAqCQkJUmVxdWlyZXMgK3dpbmRvd3MgYW5kICthdXRvY21kLgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9BVVRPQ01EKQorIyBkZWZpbmUgRkVBVF9ESUZGCisjZW5kaWYKKworLyoKKyAqICt0aXRsZQkJJ3RpdGxlJyBhbmQgJ2ljb24nIG9wdGlvbnMKKyAqICtzdGF0dXNsaW5lCQknc3RhdHVzbGluZScsICdydWxlcmZvcm1hdCcgYW5kIHNwZWNpYWwgZm9ybWF0IG9mCisgKgkJCSd0aXRsZXN0cmluZycgYW5kICdpY29uc3RyaW5nJyBvcHRpb25zLgorICogK2J5dGVfb2Zmc2V0CQknJW8nIGluICdzdGF0dXNsaW5lJyBhbmQgYnVpbHRpbiBmdW5jdGlvbnMgbGluZTJieXRlKCkKKyAqCQkJYW5kIGJ5dGUybGluZSgpLgorICoJCQlOb3RlOiBSZXF1aXJlZCBmb3IgTWFjaW50b3NoLgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgIWRlZmluZWQoTVNET1MpCisjIGRlZmluZSBGRUFUX1RJVExFCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1NUTF9PUFQKKyMgaWZuZGVmIEZFQVRfQ01ETF9JTkZPCisjICBkZWZpbmUgRkVBVF9DTURMX0lORk8JLyogJ3J1bGVyJyBpcyByZXF1aXJlZCBmb3IgJ3N0YXR1c2xpbmUnICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0JZVEVPRkYKKyNlbmRpZgorCisvKgorICogK3dpbGRpZ25vcmUJCSd3aWxkaWdub3JlJyBhbmQgJ2JhY2t1cHNraXAnIG9wdGlvbnMKKyAqCQkJTmVlZGVkIGZvciBVbml4IHRvIG1ha2UgImNyb250YWIgLWUiIHdvcmsuCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSB8fCBkZWZpbmVkKFVOSVgpCisjIGRlZmluZSBGRUFUX1dJTERJR04KKyNlbmRpZgorCisvKgorICogK3dpbGRtZW51CQknd2lsZG1lbnUnIG9wdGlvbgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisjIGRlZmluZSBGRUFUX1dJTERNRU5VCisjZW5kaWYKKworLyoKKyAqICtvc2ZpbGV0eXBlCQlmaWxldHlwZSBjaGVja2luZyBpbiBhdXRvY29tbWFuZCBwYXR0ZXJucy4KKyAqCQkJT25seSBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBmaWxldHlwZXMgKFJJU0MgT1MpLgorICovCisjaWYgMAorIyBkZWZpbmUgRkVBVF9PU0ZJTEVUWVBFCisjIGRlZmluZSBERkxUX09GVCAiVGV4dCIKKyNlbmRpZgorCisvKgorICogK3ZpbWluZm8JCXJlYWRpbmcvd3JpdGluZyB0aGUgdmltaW5mbyBmaWxlLiBUYWtlcyBhYm91dCA4S2J5dGUKKyAqCQkJb2YgY29kZS4KKyAqIFZJTUlORk9fRklMRQkJTG9jYXRpb24gb2YgdXNlciAudmltaW5mbyBmaWxlIChzaG91bGQgc3RhcnQgd2l0aCAkKS4KKyAqIFZJTUlORk9fRklMRTIJTG9jYXRpb24gb2YgYWx0ZXJuYXRlIHVzZXIgLnZpbWluZm8gZmlsZS4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX1ZJTUlORk8KKy8qICNkZWZpbmUgVklNSU5GT19GSUxFCSIkSE9NRS9mb28vLnZpbWluZm8iICovCisvKiAjZGVmaW5lIFZJTUlORk9fRklMRTIgIn4vYmFyLy52aW1pbmZvIiAqLworI2VuZGlmCisKKy8qCisgKiArc3ludGF4CQlzeW50YXggaGlnaGxpZ2h0aW5nLiAgV2hlbiB1c2luZyB0aGlzLCBpdCdzIGEgZ29vZAorICoJCQlpZGVhIHRvIGhhdmUgK2F1dG9jbWQgYW5kICtldmFsIHRvby4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpIHx8IGRlZmluZWQoUFJPVE8pCisjIGRlZmluZSBGRUFUX1NZTl9ITAorI2VuZGlmCisKKy8qCisgKiArYnVpbHRpbl90ZXJtcwlDaG9vc2Ugb25lIG91dCBvZiB0aGUgZm9sbG93aW5nIGZvdXI6CisgKgorICogTk9fQlVJTFRJTl9UQ0FQUwlEbyBub3QgaW5jbHVkZSBhbnkgYnVpbHRpbiB0ZXJtY2FwIGVudHJpZXMgKHVzZWQgb25seQorICoJCQl3aXRoIEhBVkVfVEdFVEVOVCBkZWZpbmVkKS4KKyAqCisgKiAobm90aGluZykJCU1hY2hpbmUgc3BlY2lmaWMgdGVybWNhcCBlbnRyaWVzIHdpbGwgYmUgaW5jbHVkZWQuCisgKgkJCVRoaXMgaXMgZGVmYXVsdCBmb3Igd2luMTYgdG8gc2F2ZSBzdGF0aWMgZGF0YS4KKyAqCisgKiBTT01FX0JVSUxUSU5fVENBUFMJSW5jbHVkZSBtb3N0IHVzZWZ1bCBidWlsdGluIHRlcm1jYXAgZW50cmllcyAodXNlZCBvbmx5CisgKgkJCXdpdGggTk9fQlVJTFRJTl9UQ0FQUyBub3QgZGVmaW5lZCkuCisgKgkJCVRoaXMgaXMgdGhlIGRlZmF1bHQuCisgKgorICogQUxMX0JVSUxUSU5fVENBUFMJSW5jbHVkZSBhbGwgYnVpbHRpbiB0ZXJtY2FwIGVudHJpZXMKKyAqCQkJKHVzZWQgb25seSB3aXRoIE5PX0JVSUxUSU5fVENBUFMgbm90IGRlZmluZWQpLgorICovCisjaWZkZWYgSEFWRV9UR0VURU5UCisvKiAjZGVmaW5lIE5PX0JVSUxUSU5fVENBUFMgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTk9fQlVJTFRJTl9UQ0FQUykgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzE2KQorIyBpZmRlZiBGRUFUX0JJRworIyAgZGVmaW5lIEFMTF9CVUlMVElOX1RDQVBTCisjIGVsc2UKKyMgIGRlZmluZSBTT01FX0JVSUxUSU5fVENBUFMJCS8qIGRlZmF1bHQgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogK2xpc3BpbmRlbnQJCWxpc3AgaW5kZW50aW5nIChGcm9tIEVyaWMgRmlzY2hlcikuCisgKiArY2luZGVudAkJQyBjb2RlIGluZGVudGluZyAoRnJvbSBFcmljIEZpc2NoZXIpLgorICogK3NtYXJ0aW5kZW50CQlzbWFydCBDIGNvZGUgaW5kZW50aW5nIHdoZW4gdGhlICdzaScgb3B0aW9uIGlzIHNldC4KKyAqCisgKiBUaGVzZSB0d28gbmVlZCB0byBiZSBkZWZpbmVkIHdoZW4gbWFraW5nIHByb3RvdHlwZXMuCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSB8fCBkZWZpbmVkKFBST1RPKQorIyBkZWZpbmUgRkVBVF9MSVNQCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpIHx8IGRlZmluZWQoUFJPVE8pCisjIGRlZmluZSBGRUFUX0NJTkRFTlQKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9OT1JNQUwKKyMgZGVmaW5lIEZFQVRfU01BUlRJTkRFTlQKKyNlbmRpZgorCisvKgorICogK2NvbW1lbnRzCQknY29tbWVudHMnIG9wdGlvbi4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisjIGRlZmluZSBGRUFUX0NPTU1FTlRTCisjZW5kaWYKKworLyoKKyAqICtjcnlwdHYJCUVuY3J5cHRpb24gKGJ5IE1vaHNpbiBBaG1lZCA8bW9zaEBzYXNpLmNvbT4pLgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgfHwgZGVmaW5lZChQUk9UTykKKyMgZGVmaW5lIEZFQVRfQ1JZUFQKKyNlbmRpZgorCisvKgorICogK21rc2Vzc2lvbgkJIjpta3Nlc3Npb24iIGNvbW1hbmQuCisgKgkJCVJlcXVpcmVzICt3aW5kb3dzIGFuZCArdmVydHNwbGl0LgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9WRVJUU1BMSVQpCisjIGRlZmluZSBGRUFUX1NFU1NJT04KKyNlbmRpZgorCisvKgorICogK211bHRpX2xhbmcJCU11bHRpIGxhbmd1YWdlIHN1cHBvcnQuICI6bWVudXRyYW5zIiwgIjpsYW5ndWFnZSIsIGV0Yy4KKyAqICtnZXR0ZXh0CQlNZXNzYWdlIHRyYW5zbGF0aW9ucyAocmVxdWlyZXMgK211bHRpX2xhbmcpCisgKgkJCShvbmx5IHdoZW4gImxhbmciIGFyY2hpdmUgdW5wYWNrZWQpCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9NVUxUSV9MQU5HCisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfR0VUVEVYVCkgJiYgZGVmaW5lZChGRUFUX01VTFRJX0xBTkcpIFwKKwkmJiAoZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKSkKKyMgZGVmaW5lIEZFQVRfR0VUVEVYVAorI2VuZGlmCisKKy8qCisgKiArbXVsdGlfYnl0ZQkJR2VuZXJpYyBtdWx0aS1ieXRlIGNoYXJhY3RlciBoYW5kbGluZy4gIERvZXNuJ3Qgd29yaworICoJCQl3aXRoIDE2IGJpdCBpbnRzLiAgUmVxdWlyZWQgZm9yIEdUSysgMi4KKyAqCisgKiBEaXNhYmxlZCBmb3IgRUJDRElDOgorICogTXVsdGlieXRlIHN1cHBvcnQgZG9lc24ndCB3b3JrIG9uIE9TMzkwIFVuaXggY3VycmVudGx5LgorICovCisjaWYgKGRlZmluZWQoRkVBVF9CSUcpIHx8IGRlZmluZWQoSEFWRV9HVEsyKSB8fCBkZWZpbmVkKEZFQVRfQVJBQklDKSkgXAorCSYmICFkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKFdJTjE2KSBcCisJJiYgU0laRU9GX0lOVCA+PSA0ICYmICFkZWZpbmVkKEVCQ0RJQykKKyMgZGVmaW5lIEZFQVRfTUJZVEUKKyNlbmRpZgorCisvKgorICogK211bHRpX2J5dGVfaW1lCVdpbjMyIElNRSBpbnB1dCBtZXRob2QuICBSZXF1aXJlcyArbXVsdGlfYnl0ZS4KKyAqCQkJT25seSBmb3IgZmFyLWVhc3QgV2luZG93cywgc28gSU1FIGNhbiBiZSB1c2VkIHRvIGlucHV0CisgKgkJCWNoYXJzLiAgTm90IHRlc3RlZCBtdWNoIQorICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpICYmICFkZWZpbmVkKEZFQVRfTUJZVEVfSU1FKQorLyogI2RlZmluZSBGRUFUX01CWVRFX0lNRSAqLworIyBlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFX0lNRSkgJiYgIWRlZmluZWQoRkVBVF9NQllURSkKKyMgZGVmaW5lIEZFQVRfTUJZVEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBTSVpFT0ZfSU5UIDwgNCAmJiAhZGVmaW5lZChQUk9UTykKKwlFcnJvcjogQ2FuIG9ubHkgaGFuZGxlIG11bHRpLWJ5dGUgZmVhdHVyZSB3aXRoIDMyIGJpdCBpbnQgb3IgbGFyZ2VyCisjZW5kaWYKKworLyogVXNlIGljb252KCkgd2hlbiBpdCdzIGF2YWlsYWJsZS4gKi8KKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICgoZGVmaW5lZChIQVZFX0lDT05WX0gpICYmIGRlZmluZWQoSEFWRV9JQ09OVikpIFwKKwkJfHwgZGVmaW5lZChEWU5BTUlDX0lDT05WKSkKKyMgZGVmaW5lIFVTRV9JQ09OVgorI2VuZGlmCisKKy8qCisgKiAreGltCQkJWCBJbnB1dCBNZXRob2QuICBGb3IgZW50ZXJpbmcgc3BlY2lhbCBsYW5ndWFnZXMgbGlrZQorICoJCQljaGluZXNlIGFuZCBKYXBhbmVzZS4KKyAqICtoYW5ndWxfaW5wdXQJSW50ZXJuYWwgSGFuZ3VsIGlucHV0IG1ldGhvZC4gIE11c3QgYmUgaW5jbHVkZWQKKyAqCQkJdGhyb3VnaCBjb25maWd1cmU6ICItLWVuYWJsZS1oYW5ndWxpbiIKKyAqIEJvdGggYXJlIGZvciBVbml4IGFuZCBWTVMgb25seS4KKyAqLworI2lmbmRlZiBGRUFUX1hJTQorLyogI2RlZmluZSBGRUFUX1hJTSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyMgZGVmaW5lIFVTRV9YSU0gMQkJLyogbmVlZGVkIGZvciBHVEsgaW5jbHVkZSBmaWxlcyAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisjIGRlZmluZSBIQU5HVUxfREVGQVVMVF9LRVlCT0FSRCAyCS8qIDIgb3IgMyBidWxzaWsga2V5Ym9hcmQgKi8KKyMgZGVmaW5lIEVTQ19DSEdfVE9fRU5HX01PREUJCS8qIGlmIGRlZmluZWQsIHdoZW4gRVNDIHByZXNzZWQsCisJCQkJCSAqIHR1cm4gdG8gZW5nbGlzaCBtb2RlCisJCQkJCSAqLworIyBpZiAhZGVmaW5lZChGRUFUX1hGT05UU0VUKSAmJiBkZWZpbmVkKEhBVkVfWDExKQorIyAgZGVmaW5lIEZFQVRfWEZPTlRTRVQJCQkvKiBIYW5ndWwgaW5wdXQgcmVxdWlyZXMgeGZvbnRzZXQgKi8KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgIWRlZmluZWQoTElOVCkKKwlFcnJvcjogWW91IHNob3VsZCBzZWxlY3Qgb25seSBPTkUgb2YgWElNIGFuZCBIQU5HVUwgSU5QVVQKKyMgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9IQU5HVUxJTikgfHwgZGVmaW5lZChGRUFUX1hJTSkKKy8qICMgZGVmaW5lIFhfTE9DQUxFICovCQkJLyogZm9yIE9TIHdpdGggaW5jb21wbGV0ZSBsb2NhbGUKKwkJCQkJICAgc3VwcG9ydCwgbGlrZSBvbGQgbGludXggdmVyc2lvbnMuICovCisvKiAjIGRlZmluZSBTTE9XX1hTRVJWRVIgKi8JCS8qIGZvciBleHRyZW1lbHkgc2xvdyBYIHNlcnZlciAqLworI2VuZGlmCisKKy8qCisgKiAreGZvbnRzZXQJCVggZm9udHNldCBzdXBwb3J0LiAgRm9yIG91dHB1dHRpbmcgd2lkZSBjaGFyYWN0ZXJzLgorICovCisjaWZuZGVmIEZFQVRfWEZPTlRTRVQKKyMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEhBVkVfWDExKSAmJiAhZGVmaW5lZChIQVZFX0dUSzIpCisjICBkZWZpbmUgRkVBVF9YRk9OVFNFVAorIyBlbHNlCisvKiAjICBkZWZpbmUgRkVBVF9YRk9OVFNFVCAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiArbGliY2FsbAkJbGliY2FsbCgpIGZ1bmN0aW9uCisgKi8KKy8qIFVzaW5nIGRsb3BlbigpIGFsc28gcmVxdWlyZXMgZGxzeW0oKSB0byBiZSBhdmFpbGFibGUuICovCisjaWYgZGVmaW5lZChIQVZFX0RMT1BFTikgJiYgZGVmaW5lZChIQVZFX0RMU1lNKQorIyBkZWZpbmUgVVNFX0RMT1BFTgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpICYmIChkZWZpbmVkKFdJTjMyNjQpIHx8ICgoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpIFwKKwkmJiAoZGVmaW5lZChVU0VfRExPUEVOKSB8fCBkZWZpbmVkKEhBVkVfU0hMX0xPQUQpKSkpCisjIGRlZmluZSBGRUFUX0xJQkNBTEwKKyNlbmRpZgorCisvKgorICogK3Njcm9sbGJpbmQJCXN5bmNocm9uaXphdGlvbiBvZiBzcGxpdCB3aW5kb3dzCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykKKyMgZGVmaW5lIEZFQVRfU0NST0xMQklORAorI2VuZGlmCisKKy8qCisgKiArbWVudQkJIjptZW51IiBjb21tYW5kCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBkZWZpbmUgRkVBVF9NRU5VCisjIGlmZGVmIEZFQVRfR1VJX1czMgorIyAgZGVmaW5lIEZFQVRfVEVBUk9GRgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgWFBNLiAqLworI2lmIChkZWZpbmVkKEhBVkVfWE1fWFBNUF9IKSAmJiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSkgXAorCQl8fCBkZWZpbmVkKEhBVkVfWDExX1hQTV9IKQorIyBkZWZpbmUgSEFWRV9YUE0gMQorI2VuZGlmCisKKy8qCisgKiArdG9vbGJhcgkJSW5jbHVkZSBjb2RlIGZvciBhIHRvb2xiYXIgKGZvciB0aGUgV2luMzIgR1VJLCBHVEsKKyAqCQkJYWx3YXlzIGhhcyBpdCkuICBCdXQgb25seSBpZiBtZW51cyBhcmUgZW5hYmxlZC4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoRkVBVF9NRU5VKSBcCisJJiYgKGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisJCXx8IGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIFwKKwkJfHwgKChkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkpIFwKKwkJCSYmIGRlZmluZWQoSEFWRV9YUE0pKSBcCisJCXx8IGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKSkKKyMgZGVmaW5lIEZFQVRfVE9PTEJBUgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfTUVOVSkKKyMgZGVmaW5lIEZFQVRfTUVOVQorI2VuZGlmCisKKy8qCisgKiArYnJvd3NlCQkiOmJyb3dzZSIgY29tbWFuZC4KKyAqCisgKiBCUk9XU0VfQ1VSUkJVRglPcGVuIGZpbGUgYnJvd3NlciBpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50CisgKgkJCWJ1ZmZlciwgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiAoZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgfHwgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikgfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpKQorIyBkZWZpbmUgRkVBVF9CUk9XU0UKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pCisjIGRlZmluZSBCUk9XU0VfQ1VSUkJVRgorI2VuZGlmCisKKy8qCisgKiArZGlhbG9nX2d1aQkJVXNlIEdVSSBkaWFsb2cuCisgKiArZGlhbG9nX2NvbgkJTWF5IHVzZSBDb25zb2xlIGRpYWxvZy4KKyAqCQkJV2hlbiBub25lIG9mIHRoZXNlIGRlZmluZWQgdGhlcmUgaXMgbm8gZGlhbG9nIHN1cHBvcnQuCisgKi8KKyNpZmRlZiBGRUFUX05PUk1BTAorIyBpZiAoKGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSkgXAorCQkmJiBkZWZpbmVkKEhBVkVfWDExX1hQTV9IKSkgXAorCXx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpCisjICBkZWZpbmUgRkVBVF9DT05fRElBTE9HCisjICBkZWZpbmUgRkVBVF9HVUlfRElBTE9HCisjIGVsc2UKKyMgIGRlZmluZSBGRUFUX0NPTl9ESUFMT0cKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgJiYgKGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspKQorLyogbmVlZCBhIGRpYWxvZyB0byBzaG93IGVycm9yIG1lc3NhZ2VzIHdoZW4gc3RhcnRpbmcgZnJvbSB0aGUgZGVza3RvcCAqLworIyBkZWZpbmUgRkVBVF9HVUlfRElBTE9HCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgJiYgXAorCShkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkgXAorCSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgXAorCSB8fCBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikgfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpKQorIyBkZWZpbmUgRkVBVF9HVUlfVEVYVERJQUxPRworI2VuZGlmCisKKy8qIE1hYyBzcGVjaWZpYyB0aGluZzogQ29kZXdhcnJpb3IgaW50ZXJmYWNlLiAqLworI2lmZGVmIEZFQVRfR1VJX01BQworIyBkZWZpbmUgRkVBVF9DV19FRElUT1IKKyNlbmRpZgorCisvKgorICogUHJlZmVyZW5jZXM6CisgKiA9PT09PT09PT09PT0KKyAqLworCisvKgorICogK3dyaXRlYmFja3VwCQknd3JpdGViYWNrdXAnIGlzIGRlZmF1bHQgb246CisgKgkJCVVzZSBhIGJhY2t1cCBmaWxlIHdoaWxlIG92ZXJ3cml0aW5nIGEgZmlsZS4gIEJ1dCBpdCdzCisgKgkJCWRlbGV0ZWQgYWdhaW4gd2hlbiAnYmFja3VwJyBpcyBub3Qgc2V0LiAgQ2hhbmdpbmcgdGhpcworICoJCQlpcyBzdHJvbmdseSBkaXNjb3VyYWdlZDogWW91IGNhbiBsb29zZSBhbGwgeW91cgorICoJCQljaGFuZ2VzIHdoZW4gdGhlIGNvbXB1dGVyIGNyYXNoZXMgd2hpbGUgd3JpdGluZyB0aGUKKyAqCQkJZmlsZS4KKyAqCQkJVk1TIG5vdGU6IEl0IGRvZXMgd29yayBvbiBWTVMgYXMgd2VsbCwgYnV0IGJlY2F1c2Ugb2YKKyAqCQkJdmVyc2lvbiBoYW5kbGluZyBpdCBkb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlLgorICoJCQlPdmVyd3JpdGUgd2lsbCB3cml0ZSB0byB0aGUgbmV3IHZlcnNpb24uCisgKi8KKyNpZm5kZWYgVk1TCisjIGRlZmluZSBGRUFUX1dSSVRFQkFDS1VQCisjZW5kaWYKKworLyoKKyAqICt4dGVybV9zYXZlCQlUaGUgdF90aSBhbmQgdF90ZSBlbnRyaWVzIGZvciB0aGUgYnVpbHRpbiB4dGVybSB3aWxsCisgKgkJCWJlIHNldCB0byBzYXZlIHRoZSBzY3JlZW4gd2hlbiBzdGFydGluZyBWaW0gYW5kCisgKgkJCXJlc3RvcmluZyBpdCB3aGVuIGV4aXRpbmcuCisgKi8KKy8qICNkZWZpbmUgRkVBVF9YVEVSTV9TQVZFICovCisKKy8qCisgKiBERUJVRwkJT3V0cHV0IGEgbG90IG9mIGRlYnVnZ2luZyBnYXJiYWdlLgorICovCisvKiAjZGVmaW5lIERFQlVHICovCisKKy8qCisgKiBTVEFSVFVQVElNRQkJVGltZSB0aGUgc3RhcnR1cCBwcm9jZXNzLiAgV3JpdGVzIGEgInZpbXN0YXJ0dXAiIGZpbGUKKyAqCQkJd2l0aCB0aW1lc3RhbXBzLgorICovCisvKiAjZGVmaW5lIFNUQVJUVVBUSU1FICJ2aW1zdGFydHVwIiAqLworCisvKgorICogTUVNX1BST0ZJTEUJCURlYnVnZ2luZyBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZy4KKyAqLworLyogI2RlZmluZSBNRU1fUFJPRklMRSAqLworCisvKgorICogVklNUkNfRklMRQkJTmFtZSBvZiB0aGUgLnZpbXJjIGZpbGUgaW4gY3VycmVudCBkaXIuCisgKi8KKy8qICNkZWZpbmUgVklNUkNfRklMRQkiLnZpbXJjIiAqLworCisvKgorICogRVhSQ19GSUxFCQlOYW1lIG9mIHRoZSAuZXhyYyBmaWxlIGluIGN1cnJlbnQgZGlyLgorICovCisvKiAjZGVmaW5lIEVYUkNfRklMRQkiLmV4cmMiICovCisKKy8qCisgKiBHVklNUkNfRklMRQkJTmFtZSBvZiB0aGUgLmd2aW1yYyBmaWxlIGluIGN1cnJlbnQgZGlyLgorICovCisvKiAjZGVmaW5lIEdWSU1SQ19GSUxFCSIuZ3ZpbXJjIiAqLworCisvKgorICogVklFV19GSUxFCQlOYW1lIG9mIHRoZSBkZWZhdWx0ICI6bWt2aWV3IiBmaWxlLgorICovCisjZGVmaW5lIFZJRVdfRklMRQkiVmlldy52aW0iCisKKy8qCisgKiBTRVNTSU9OX0ZJTEUJCU5hbWUgb2YgdGhlIGRlZmF1bHQgIjpta3Nlc3Npb24iIGZpbGUuCisgKi8KKyNkZWZpbmUgU0VTU0lPTl9GSUxFCSJTZXNzaW9uLnZpbSIKKworLyoKKyAqIFVTUl9WSU1SQ19GSUxFCU5hbWUgb2YgdGhlIHVzZXIgLnZpbXJjIGZpbGUuCisgKiBVU1JfVklNUkNfRklMRTIJTmFtZSBvZiBhbHRlcm5hdGUgdXNlciAudmltcmMgZmlsZS4KKyAqIFVTUl9WSU1SQ19GSUxFMwlOYW1lIG9mIGFsdGVybmF0ZSB1c2VyIC52aW1yYyBmaWxlLgorICovCisvKiAjZGVmaW5lIFVTUl9WSU1SQ19GSUxFCSJ+L2Zvby8udmltcmMiICovCisvKiAjZGVmaW5lIFVTUl9WSU1SQ19GSUxFMgkifi9iYXIvLnZpbXJjIiAqLworLyogI2RlZmluZSBVU1JfVklNUkNfRklMRTMJIiRWSU0vLnZpbXJjIiAqLworCisvKgorICogRVZJTV9GSUxFCQlOYW1lIG9mIHRoZSBldmltLnZpbSBzY3JpcHQgZmlsZQorICovCisvKiAjZGVmaW5lIEVWSU1fRklMRQkJIiRWSU1SVU5USU1FL2V2aW0udmltIiAqLworCisvKgorICogVVNSX0VYUkNfRklMRQlOYW1lIG9mIHRoZSB1c2VyIC5leHJjIGZpbGUuCisgKiBVU1JfRVhSQ19GSUxFMglOYW1lIG9mIHRoZSBhbHRlcm5hdGUgdXNlciAuZXhyYyBmaWxlLgorICovCisvKiAjZGVmaW5lIFVTUl9FWFJDX0ZJTEUJIn4vZm9vLy5leHJjIiAqLworLyogI2RlZmluZSBVU1JfRVhSQ19GSUxFMgkifi9iYXIvLmV4cmMiICovCisKKy8qCisgKiBVU1JfR1ZJTVJDX0ZJTEUJTmFtZSBvZiB0aGUgdXNlciAuZ3ZpbXJjIGZpbGUuCisgKiBVU1JfR1ZJTVJDX0ZJTEUyCU5hbWUgb2YgdGhlIGFsdGVybmF0ZSB1c2VyIC5ndmltcmMgZmlsZS4KKyAqLworLyogI2RlZmluZSBVU1JfR1ZJTVJDX0ZJTEUJIn4vZm9vLy5ndmltcmMiICovCisvKiAjZGVmaW5lIFVTUl9HVklNUkNfRklMRTIJIn4vYmFyLy5ndmltcmMiICovCisvKiAjZGVmaW5lIFVTUl9HVklNUkNfRklMRTMJIiRWSU0vLmd2aW1yYyIgKi8KKworLyoKKyAqIFNZU19WSU1SQ19GSUxFCU5hbWUgb2YgdGhlIHN5c3RlbS13aWRlIC52aW1yYyBmaWxlLgorICovCisvKiAjZGVmaW5lIFNZU19WSU1SQ19GSUxFCSIvZXRjL3ZpbXJjIiAqLworCisvKgorICogU1lTX0dWSU1SQ19GSUxFCU5hbWUgb2YgdGhlIHN5c3RlbS13aWRlIC5ndmltcmMgZmlsZS4KKyAqLworLyogI2RlZmluZSBTWVNfR1ZJTVJDX0ZJTEUJIi9ldGMvZ3ZpbXJjIiAqLworCisvKgorICogREZMVF9IRUxQRklMRQlOYW1lIG9mIHRoZSBoZWxwIGZpbGUuCisgKi8KKy8qICMgZGVmaW5lIERGTFRfSEVMUEZJTEUJIiRWSU1SVU5USU1FL2RvYy9oZWxwLnR4dC5neiIgKi8KKworLyoKKyAqIEZpbGUgbmFtZXMgZm9yOgorICogRklMRVRZUEVfRklMRQlzd2l0Y2ggb24gZmlsZSB0eXBlIGRldGVjdGlvbgorICogRlRQTFVHSU5fRklMRQlzd2l0Y2ggb24gbG9hZGluZyBmaWxldHlwZSBwbHVnaW4gZmlsZXMKKyAqIElOREVOVF9GSUxFCQlzd2l0Y2ggb24gbG9hZGluZyBpbmRlbnQgZmlsZXMKKyAqIEZUT0ZGX0ZJTEUJCXN3aXRjaCBvZmYgZmlsZSB0eXBlIGRldGVjdGlvbgorICogRlRQTFVHT0ZfRklMRQlzd2l0Y2ggb2ZmIGxvYWRpbmcgc2V0dGluZ3MgZmlsZXMKKyAqIElORE9GRl9GSUxFCQlzd2l0Y2ggb2ZmIGxvYWRpbmcgaW5kZW50IGZpbGVzCisgKi8KKy8qICMgZGVmaW5lIEZJTEVUWVBFX0ZJTEUJImZpbGV0eXBlLnZpbSIgKi8KKy8qICMgZGVmaW5lIEZUUExVR0lOX0ZJTEUJImZ0cGx1Z2luLnZpbSIgKi8KKy8qICMgZGVmaW5lIElOREVOVF9GSUxFCQkiaW5kZW50LnZpbSIgKi8KKy8qICMgZGVmaW5lIEZUT0ZGX0ZJTEUJCSJmdG9mZi52aW0iICovCisvKiAjIGRlZmluZSBGVFBMVUdPRl9GSUxFCSJmdHBsdWdvZi52aW0iICovCisvKiAjIGRlZmluZSBJTkRPRkZfRklMRQkJImluZG9mZi52aW0iICovCisKKy8qCisgKiBTWVNfTUVOVV9GSUxFCU5hbWUgb2YgdGhlIGRlZmF1bHQgbWVudS52aW0gZmlsZS4KKyAqLworLyogIyBkZWZpbmUgU1lTX01FTlVfRklMRQkiJFZJTVJVTlRJTUUvbWVudS52aW0iICovCisKKy8qCisgKiBTWVNfT1BUV0lOX0ZJTEUJTmFtZSBvZiB0aGUgZGVmYXVsdCBvcHR3aW4udmltIGZpbGUuCisgKi8KKyNpZm5kZWYgU1lTX09QVFdJTl9GSUxFCisjIGRlZmluZSBTWVNfT1BUV0lOX0ZJTEUJIiRWSU1SVU5USU1FL29wdHdpbi52aW0iCisjZW5kaWYKKworLyoKKyAqIFNZTlRBWF9GTkFNRQkJTmFtZSBvZiBhIHN5bnRheCBmaWxlLCB3aGVyZSAlcyBpcyB0aGUgc3ludGF4IG5hbWUuCisgKi8KKy8qICNkZWZpbmUgU1lOVEFYX0ZOQU1FCSIvZm9vLyVzLnZpbSIgKi8KKworLyoKKyAqIFJVTlRJTUVfRElSTkFNRQlHZW5lcmljIG5hbWUgZm9yIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHJ1bnRpbWUgZmlsZXMuCisgKi8KKyNpZm5kZWYgUlVOVElNRV9ESVJOQU1FCisjIGRlZmluZSBSVU5USU1FX0RJUk5BTUUgInJ1bnRpbWUiCisjZW5kaWYKKworLyoKKyAqIFJVTlRJTUVfR0xPQkFMCURpcmVjdG9yeSBuYW1lIGZvciBnbG9iYWwgVmltIHJ1bnRpbWUgZGlyZWN0b3J5LgorICoJCQlEb24ndCBkZWZpbmUgdGhpcyBpZiB0aGUgcHJlcHJvY2Vzc29yIGNhbid0IGhhbmRsZQorICoJCQlzdHJpbmcgY29uY2F0ZW5hdGlvbi4KKyAqCQkJQWxzbyBzZXQgYnkgIi0td2l0aC1nbG9iYWwtcnVudGltZSIgY29uZmlndXJlIGFyZ3VtZW50LgorICovCisvKiAjZGVmaW5lIFJVTlRJTUVfR0xPQkFMICIvZXRjL3ZpbSIgKi8KKworLyoKKyAqIE1PRElGSUVEX0JZCQlOYW1lIG9mIHdobyBtb2RpZmllZCBWaW0uICBSZXF1aXJlZCB3aGVuIGRpc3RyaWJ1dGluZworICoJCQlhIG1vZGlmZWQgdmVyc2lvbiBvZiBWaW0uCisgKgkJCUFsc28gZnJvbSB0aGUgIi0td2l0aC1tb2RpZmllZC1ieSIgY29uZmlndXJlIGFyZ3VtZW50LgorICovCisvKiAjZGVmaW5lIE1PRElGSUVEX0JZICJKb2huIERvZSIgKi8KKworLyoKKyAqIE1hY2hpbmUgZGVwZW5kZW50OgorICogPT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqICtmb3JrCQlVbml4IG9ubHk6IGZvcmsoKSBzdXBwb3J0IChkZXRlY3RlZCBieSBjb25maWd1cmUpCisgKiArc3lzdGVtCQlVc2Ugc3lzdGVtKCkgaW5zdGVhZCBvZiBmb3JrL2V4ZWMgZm9yIHN0YXJ0aW5nIGEKKyAqCQkJc2hlbGwuICBEb2Vzbid0IHdvcmsgZm9yIHRoZSBHVUkhCisgKi8KKy8qICNkZWZpbmUgVVNFX1NZU1RFTSAqLworCisvKgorICogK1gxMQkJCVVuaXggb25seS4gIEluY2x1ZGUgY29kZSBmb3IgeHRlcm0gdGl0bGUgc2F2aW5nIGFuZCBYCisgKgkJCWNsaXBib2FyZC4gIE9ubHkgd29ya3MgaWYgSEFWRV9YMTEgaXMgYWxzbyBkZWZpbmVkLgorICovCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgfHwgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpCisjIGRlZmluZSBXQU5UX1gxMQorI2VuZGlmCisKKy8qCisgKiBYU01QIC0gWDExIFNlc3Npb24gTWFuYWdlbWVudCBQcm90b2NvbAorICogSXQgbWF5IGJlIHByZWZlcnJlZCB0byBkaXNhYmxlIHRoaXMgaWYgdGhlIEdVSSBzdXBwb3J0cyBpdCAoZS5nLiwKKyAqIEdOT01FL0tERSkgYW5kIGltcGxlbWVudCBzYXZlLXlvdXJzZWxmIGV0Yy4gdGhyb3VnaCB0aGF0LCBidXQgaXQgbWF5IGFsc28KKyAqIGJlIGNsZWFuZXIgdG8gaGF2ZSBhbGwgU00tYXdhcmUgdmltcyBkbyB0aGUgc2FtZSB0aGluZyAobGliU00gZG9lcyBub3QKKyAqIGRlcGVuZCB1cG9uIFgxMSkuCisgKiBJZiB5b3VyIEdVSSB3YW50cyB0byBzdXBwb3J0IFNNIGl0c2VsZiwgY2hhbmdlIHRoaXMgaWZkZWYuCisgKiBJJ20gYXNzdW1pbmcgdGhhdCBhbnkgWDExIGltcGxlbWVudGF0aW9uIHdpbGwgY29wZSB3aXRoIHRoaXMgZm9yIG5vdy4KKyAqLworI2lmIGRlZmluZWQoSEFWRV9YMTEpICYmIGRlZmluZWQoV0FOVF9YMTEpICYmIGRlZmluZWQoSEFWRV9YMTFfU01fU01MSUJfSCkKKyMgZGVmaW5lIFVTRV9YU01QCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9YU01QX0lOVEVSQUNUKSAmJiAhZGVmaW5lZChVU0VfWFNNUCkKKyMgdW5kZWYgVVNFX1hTTVBfSU5URVJBQ1QKKyNlbmRpZgorCisvKgorICogK21vdXNlX3h0ZXJtCQlVbml4IG9ubHk6IEluY2x1ZGUgY29kZSBmb3IgeHRlcm0gbW91c2UgaGFuZGxpbmcuCisgKiArbW91c2VfZGVjCQlpZGVtLCBmb3IgRGVjIG1vdXNlIGhhbmRsaW5nLgorICogK21vdXNlX2pzYnRlcm0JaWRlbSwgZm9yIEpzYnRlcm0gbW91c2UgaGFuZGxpbmcuCisgKiArbW91c2VfbmV0dGVybQlpZGVtLCBmb3IgTmV0dGVybSBtb3VzZSBoYW5kbGluZy4KKyAqIChub25lKQkJTVMtRE9TIG1vdXNlIHN1cHBvcnQuCisgKiArbW91c2VfZ3BtCQlVbml4IG9ubHk6IEluY2x1ZGUgY29kZSBmb3IgTGludXggY29uc29sZSBtb3VzZQorICoJCQloYW5kbGluZy4KKyAqICttb3VzZV9wdGVybQkJUFRlcm0gbW91c2Ugc3VwcG9ydCBmb3IgUU5YCisgKiArbW91c2UJCUFueSBtb3VzZSBzdXBwb3J0IChhbnkgb2YgdGhlIGFib3ZlIGVuYWJsZWQpLgorICovCisvKiBPUy8yIGFuZCBBbWlnYSBjb25zb2xlIGhhdmUgbm8gbW91c2Ugc3VwcG9ydCAqLworI2lmICghZGVmaW5lZChBTUlHQSkgJiYgIWRlZmluZWQoT1MyKSAmJiAhZGVmaW5lZChNQUNPUykpIHx8IGRlZmluZWQoRkVBVF9HVUlfQU1JR0EpCisjIGlmZGVmIEZFQVRfTk9STUFMCisjICBkZWZpbmUgRkVBVF9NT1VTRV9YVEVSTQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0JJRworIyAgZGVmaW5lIEZFQVRfTU9VU0VfTkVUCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfQklHCisjICBkZWZpbmUgRkVBVF9NT1VTRV9ERUMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkpCisjICBkZWZpbmUgRE9TX01PVVNFCisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoX19RTlhfXykKKyMgIGRlZmluZSBGRUFUX01PVVNFX1BURVJNCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoSEFWRV9HUE0pCisjIGRlZmluZSBGRUFUX01PVVNFX0dQTQorI2VuZGlmCisvKiBEZWZpbmUgRkVBVF9NT1VTRSB3aGVuIGFueSBvZiB0aGUgYWJvdmUgaXMgZGVmaW5lZCBvciBGRUFUX0dVSS4gKi8KKyNpZiAhZGVmaW5lZChGRUFUX01PVVNFX1RUWSkgJiYgKGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgXAorCXx8IGRlZmluZWQoRkVBVF9NT1VTRV9ORVQpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9ERUMpIFwKKwl8fCBkZWZpbmVkKERPU19NT1VTRSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0dQTSkgXAorCXx8IGRlZmluZWQoRkVBVF9NT1VTRV9KU0IpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9QVEVSTSkpCisjIGRlZmluZSBGRUFUX01PVVNFX1RUWQkJLyogaW5jbHVkZSBub24tR1VJIG1vdXNlIHN1cHBvcnQgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZFQVRfTU9VU0UpICYmIChkZWZpbmVkKEZFQVRfTU9VU0VfVFRZKSB8fCBkZWZpbmVkKEZFQVRfR1VJKSkKKyMgZGVmaW5lIEZFQVRfTU9VU0UJCS8qIGluY2x1ZGUgZ2VuZXJpYyBtb3VzZSBzdXBwb3J0ICovCisjZW5kaWYKKworLyoKKyAqICtjbGlwYm9hcmQJCUNsaXBib2FyZCBzdXBwb3J0LiAgQWx3YXlzIHVzZWQgZm9yIHRoZSBHVUkuCisgKiAreHRlcm1fY2xpcGJvYXJkCVVuaXggb25seTogSW5jbHVkZSBjb2RlIGZvciBoYW5kbGluZyB0aGUgY2xpcGJvYXJkCisgKgkJCWluIGFuIHh0ZXJtIGxpa2UgaW4gdGhlIEdVSS4KKyAqLworI2lmZGVmIEZFQVRfR1VJCisjIGlmbmRlZiBGRUFUX0NMSVBCT0FSRAorIyAgZGVmaW5lIEZFQVRfQ0xJUEJPQVJECisjICBpZm5kZWYgRkVBVF9WSVNVQUwKKyMgICBkZWZpbmUgRkVBVF9WSVNVQUwKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoRkVBVF9WSVNVQUwpIFwKKwkmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpIFwKKwkmJiBkZWZpbmVkKFdBTlRfWDExKSAmJiBkZWZpbmVkKEhBVkVfWDExKQorIyBkZWZpbmUgRkVBVF9YQ0xJUEJPQVJECisjIGlmbmRlZiBGRUFUX0NMSVBCT0FSRAorIyAgZGVmaW5lIEZFQVRfQ0xJUEJPQVJECisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqICtkbmQJCURyYWcnbidkcm9wIHN1cHBvcnQuICBBbHdheXMgdXNlZCBmb3IgdGhlIEdUSysgR1VJLgorICovCisjaWYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspCisjIGRlZmluZSBGRUFUX0RORAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSAmJiBkZWZpbmVkKEZFQVRfU01BTEwpCisjIGRlZmluZSBNU1dJTl9GSU5EX1JFUExBQ0UJLyogaW5jbHVkZSBjb2RlIGZvciBmaW5kL3JlcGxhY2UgZGlhbG9nICovCisjIGRlZmluZSBNU1dJTl9GUl9CVUZTSVpFIDI1NgorI2VuZGlmCisKKy8qCisgKiArY2xpZW50c2VydmVyCVJlbW90ZSBjb250cm9sIHZpYSB0aGUgcmVtb3RlX3NlbmQoKSBmdW5jdGlvbgorICoJCQlhbmQgdGhlIC0tcmVtb3RlIGFyZ3VtZW50CisgKi8KKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKKyMgZGVmaW5lIEZFQVRfQ0xJRU5UU0VSVkVSCisjZW5kaWYKKworLyoKKyAqICt0ZXJtcmVzcG9uc2UJc2VuZCB0X1JWIHRvIG9idGFpbiB0ZXJtaW5hbCByZXNwb25zZS4gIFVzZWQgZm9yIHh0ZXJtCisgKgkJCXRvIGNoZWNrIGlmIG1vdXNlIGRyYWdnaW5nIGNhbiBiZSB1c2VkIGFuZCBpZiB0ZXJtCisgKgkJCWNvZGVzIGNhbiBiZSBvYnRhaW5kLgorICovCisjaWYgKGRlZmluZWQoRkVBVF9OT1JNQUwpIHx8IGRlZmluZWQoRkVBVF9NT1VTRSkpICYmIGRlZmluZWQoSEFWRV9UR0VURU5UKQorIyBkZWZpbmUgRkVBVF9URVJNUkVTUE9OU0UKKyNlbmRpZgorCisvKgorICogY3Vyc29yIHNoYXBlCQlBZGp1c3QgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IgdG8gdGhlIG1vZGUuCisgKiBtb3VzZSBzaGFwZQkJQWRqdXN0IHRoZSBzaGFwZSBvZiB0aGUgbW91c2UgcG9pbnRlciB0byB0aGUgbW9kZS4KKyAqLworI2lmZGVmIEZFQVRfTk9STUFMCisvKiBNUy1ET1MgY29uc29sZSBhbmQgV2luMzIgY29uc29sZSBjYW4gY2hhbmdlIGN1cnNvciBzaGFwZSAqLworIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpKQorIyAgZGVmaW5lIE1DSF9DVVJTT1JfU0hBUEUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpIHx8IGRlZmluZWQoRkVBVF9HVUlfVzE2KSB8fCBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisjICBkZWZpbmUgRkVBVF9NT1VTRVNIQVBFCisjIGVuZGlmCisjZW5kaWYKKworLyogR1VJIGFuZCBzb21lIGNvbnNvbGVzIGNhbiBjaGFuZ2UgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IuICBUaGUgY29kZSBpcyBhbHNvCisgKiBuZWVkZWQgZm9yIHRoZSAnbW91c2VzaGFwZScgb3B0aW9uLiAqLworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoTUNIX0NVUlNPUl9TSEFQRSkgfHwgZGVmaW5lZChGRUFUX01PVVNFU0hBUEUpCisjIGRlZmluZSBDVVJTT1JfU0hBUEUKKyNlbmRpZgorCisvKgorICogK0FSUAkJCUFtaWdhIG9ubHkuIFVzZSBhcnAubGlicmFyeSwgRE9TIDIuMCBpcyBub3QgcmVxdWlyZWQuCisgKi8KKyNpZm5kZWYgTk9fQVJQCisjIGRlZmluZSBGRUFUX0FSUAorI2VuZGlmCisKKy8qCisgKiArR1VJX0F0aGVuYQkJVG8gY29tcGlsZSBWaW0gd2l0aCBvciB3aXRob3V0IHRoZSBHVUkgKGd2aW0pIHlvdSBoYXZlCisgKiArR1VJX0JlT1MJCXRvIGVkaXQgdGhlIE1ha2VmaWxlLgorICogK0dVSV9Nb3RpZgorICovCisKKy8qCisgKiArb2xlCQkJV2luMzIgT0xFIGF1dG9tYXRpb246IFVzZSBNYWtlZmlsZS5vdmMuCisgKi8KKworLyoKKyAqIFRoZXNlIGZlYXR1cmVzIGNhbiBvbmx5IGJlIGluY2x1ZGVkIGJ5IHVzaW5nIGEgY29uZmlndXJlIGFyZ3VtZW50LiAgU2VlIHRoZQorICogTWFrZWZpbGUgZm9yIGEgbGluZSB0byB1bmNvbW1lbnQuCisgKiArcGVybAkJUGVybCBpbnRlcmZhY2U6ICItLWVuYWJsZS1wZXJsaW50ZXJwIgorICogK3B5dGhvbgkJUHl0aG9uIGludGVyZmFjZTogIi0tZW5hYmxlLXB5dGhvbmludGVycCIKKyAqICt0Y2wJCQlUQ0wgaW50ZXJmYWNlOiAiLS1lbmFibGUtdGNsaW50ZXJwIgorICogK3NuaWZmCQlTbmlmZiBpbnRlcmZhY2U6ICItLWVuYWJsZS1zbmlmZiIKKyAqICtzdW5fd29ya3Nob3AJU3VuIFdvcmtzaG9wIGludGVnZWdyYXRpb24KKyAqICtuZXRiZWFuc19pbnRnCU5ldGJlYW5zIGludGVncmF0aW9uCisgKi8KKworLyoKKyAqIFRoZXNlIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkOgorICogK3Rlcm1pbmZvCisgKiArdGdldGVudAorICovCisKKy8qCisgKiBUaGUgU3VuIFdvcmtzaG9wIGZlYXR1cmVzIGN1cnJlbnRseSBvbmx5IHdvcmsgd2l0aCBNb3RpZi4KKyAqLworI2lmICFkZWZpbmVkKEZFQVRfR1VJX01PVElGKSAmJiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKQorIyB1bmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorI2VuZGlmCisKKy8qCisgKiBUaGUgTmV0YmVhbnMgZmVhdHVyZXMgY3VycmVudGx5IG9ubHkgd29yayB3aXRoIE1vdGlmIGFuZCBHVEsgYW5kIFdpbjMyLgorICogSXQgYWxzbyByZXF1aXJlcyArbGlzdGNtZHMgYW5kICtldmFsLgorICovCisjaWYgKCghZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgJiYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpKSBcCisJCXx8ICFkZWZpbmVkKEZFQVRfTElTVENNRFMpIHx8ICFkZWZpbmVkKEZFQVRfRVZBTCkpIFwKKwkmJiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykKKyMgdW5kZWYgRkVBVF9ORVRCRUFOU19JTlRHCisjZW5kaWYKKworLyoKKyAqICtzaWducwkJQWxsb3cgc2lnbnMgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSBsZWZ0IG9mIHRleHQgbGluZXMuCisgKgkJCUFkZHMgdGhlICI6c2lnbiIgY29tbWFuZC4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9CSUcpIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpCisjIGRlZmluZSBGRUFUX1NJR05TCisjIGlmICgoZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpKSBcCisJCSYmIGRlZmluZWQoSEFWRV9YMTFfWFBNX0gpKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspIFwKKwl8fCAoZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChGRUFUX0dVSSkpCisjICBkZWZpbmUgRkVBVF9TSUdOX0lDT05TCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqICtiYWxsb29uX2V2YWwJQWxsb3cgYmFsbG9vbiBleHByZXNzaW9uIGV2YWx1YXRpb24uIFVzZWQgd2l0aCBhCisgKgkJCWRlYnVnZ2VyIGFuZCBmb3IgdG9vbHRpcHMuCisgKgkJCU9ubHkgZm9yIEdVSXMgd2hlcmUgaXQgd2FzIGltcGxlbWVudGVkLgorICovCisjaWYgKGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoRkVBVF9HVUlfVzMyKSkgXAorCSYmICggICAoZGVmaW5lZChGRUFUX1RPT0xCQVIpIFwKKwkJJiYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpKSBcCisJICAgIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpKQorIyBkZWZpbmUgRkVBVF9CRVZBTAorIyBpZiAhZGVmaW5lZChGRUFUX1hGT05UU0VUKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9HVEspIFwKKwkmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCisjICBkZWZpbmUgRkVBVF9YRk9OVFNFVAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQkVWQUwpICYmIChkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkpCisjIGRlZmluZSBGRUFUX0JFVkFMX1RJUAkJLyogYmFsbG9vbiBldmFsIHVzZWQgZm9yIHRvb2xiYXIgdG9vbHRpcCAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSB8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSAoY3VycmVudGx5KSBvbmx5IHVzZWQgYnkgU3VuIFZpc3VhbCBXb3JrU2hvcCA2CisgKiBhbmQgTmV0QmVhbnMuIFRoZXNlIGZlYXR1cmVzIGNvdWxkIGJlIHVzZWQgd2l0aCBvdGhlciBpbnRlZ3JhdGlvbnMgd2l0aAorICogZGVidWdnZXJzIHNvIEkndmUgdXNlZCBzZXBhcmF0ZSBmZWF0dXJlIGRlZmluZXMuCisgKi8KKyMgaWYgIWRlZmluZWQoRkVBVF9NRU5VKQorIyAgZGVmaW5lIEZFQVRfTUVOVQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKQorLyoKKyAqCQkJVXNlIGFuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiBYIGlucHV0IGZvciBhIHNlY29uZGFyeQorICoJCQljb21tYW5kIGlucHV0LgorICovCisjIGRlZmluZSBBTFRfWF9JTlBVVAorCisvKgorICogK2Zvb3RlcgkJTW90aWYgb25seTogQWRkIGEgbWVzc2FnZSBhcmVhIGF0IHRoZSBib3R0b20gb2YgdGhlCisgKgkJCW1haW4gd2luZG93IGFyZWEuCisgKi8KKyMgZGVmaW5lIEZFQVRfRk9PVEVSCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2ZpbGVpby5jIGIvc3JjL2ZpbGVpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzM5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZmlsZWlvLmMKQEAgLTAsMCArMSw4NzUwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBmaWxlaW8uYzogcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBhIGZpbGUKKyAqLworCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4xNikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjIGluY2x1ZGUgPGlvLmg+CS8qIGZvciBsc2VlaygpLCBtdXN0IGJlIGJlZm9yZSB2aW0uaCAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fRU1YX18KKyMgaW5jbHVkZSA8aW8uaD4JLyogZm9yIG1rdGVtcCgpLCBDSlcgMTk5Ny0xMi0wMyAqLworI2VuZGlmCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1RBTkRFTQorIyBpbmNsdWRlIDxsaW1pdHMuaD4JCS8qIGZvciBTU0laRV9NQVggKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1VUSU1FKSAmJiBkZWZpbmVkKEhBVkVfVVRJTUVfSCkKKyMgaW5jbHVkZSA8dXRpbWUuaD4JCS8qIGZvciBzdHJ1Y3QgdXRpbWJ1ZiAqLworI2VuZGlmCisKKyNkZWZpbmUgQlVGU0laRQkJODE5MgkvKiBzaXplIG9mIG5vcm1hbCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgU01CVUZTSVpFCTI1NgkvKiBzaXplIG9mIGVtZXJnZW5jeSB3cml0ZSBidWZmZXIgKi8KKworI2lmZGVmIEZFQVRfQ1JZUFQKKyMgZGVmaW5lIENSWVBUX01BR0lDCQkiVmltQ3J5cHR+MDEhIgkvKiAiMDEiIGlzIHRoZSB2ZXJzaW9uIG5yICovCisjIGRlZmluZSBDUllQVF9NQUdJQ19MRU4JMTIJCS8qIG11c3QgYmUgbXVsdGlwbGUgb2YgNCEgKi8KKyNlbmRpZgorCisvKiBJcyB0aGVyZSBhbnkgc3lzdGVtIHRoYXQgZG9lc24ndCBoYXZlIGFjY2VzcygpPyAqLworI2lmbmRlZiBNQUNPU19DTEFTU0lDIC8qIE5vdCBhdmFpbGFibGUgb24gTWFjT1MgOSAqLworIyBkZWZpbmUgVVNFX01DSF9BQ0NFU1MKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorc3RhdGljIGNoYXJfdSAqbmV4dF9mZW5jIF9fQVJHUygoY2hhcl91ICoqcHApKTsKKyMgaWZkZWYgRkVBVF9FVkFMCitzdGF0aWMgY2hhcl91ICpyZWFkZmlsZV9jaGFyY29udmVydCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqZmVuYywgaW50ICpmZHApKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklNSU5GTworc3RhdGljIHZvaWQgY2hlY2tfbWFya3NfcmVhZCBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ1JZUFQKK3N0YXRpYyBjaGFyX3UgKmNoZWNrX2Zvcl9jcnlwdGtleSBfX0FSR1MoKGNoYXJfdSAqY3J5cHRrZXksIGNoYXJfdSAqcHRyLCBsb25nICpzaXplcCwgbG9uZyAqZmlsZXNpemVwLCBpbnQgbmV3ZmlsZSkpOworI2VuZGlmCisjaWZkZWYgVU5JWAorc3RhdGljIHZvaWQgc2V0X2ZpbGVfdGltZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIHRpbWVfdCBhdGltZSwgdGltZV90IG10aW1lKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIG1zZ19hZGRfZm5hbWUgX19BUkdTKChidWZfVCAqLCBjaGFyX3UgKikpOworc3RhdGljIGludCBtc2dfYWRkX2ZpbGVmb3JtYXQgX19BUkdTKChpbnQgZW9sX3R5cGUpKTsKK3N0YXRpYyB2b2lkIG1zZ19hZGRfbGluZXMgX19BUkdTKChpbnQsIGxvbmcsIGxvbmcpKTsKK3N0YXRpYyB2b2lkIG1zZ19hZGRfZW9sIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBjaGVja19tdGltZSBfX0FSR1MoKGJ1Zl9UICpidWYsIHN0cnVjdCBzdGF0ICpzKSk7CitzdGF0aWMgaW50IHRpbWVfZGlmZmVycyBfX0FSR1MoKGxvbmcgdDEsIGxvbmcgdDIpKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKK3N0YXRpYyBpbnQgYXBwbHlfYXV0b2NtZHNfZXhhcmcgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmZuYW1lX2lvLCBpbnQgZm9yY2UsIGJ1Zl9UICpidWYsIGV4YXJnX1QgKmVhcCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ1JZUFQpIHx8IGRlZmluZWQoRkVBVF9NQllURSkKKyMgZGVmaW5lIEhBU19CV19GTEFHUworIyBkZWZpbmUgRklPX0xBVElOMQkweDAxCS8qIGNvbnZlcnQgTGF0aW4xICovCisjIGRlZmluZSBGSU9fVVRGOAkweDAyCS8qIGNvbnZlcnQgVVRGLTggKi8KKyMgZGVmaW5lIEZJT19VQ1MyCTB4MDQJLyogY29udmVydCBVQ1MtMiAqLworIyBkZWZpbmUgRklPX1VDUzQJMHgwOAkvKiBjb252ZXJ0IFVDUy00ICovCisjIGRlZmluZSBGSU9fVVRGMTYJMHgxMAkvKiBjb252ZXJ0IFVURi0xNiAqLworIyBpZmRlZiBXSU4zMjY0CisjICBkZWZpbmUgRklPX0NPREVQQUdFCTB4MjAJLyogY29udmVydCBNUy1XaW5kb3dzIGNvZGVwYWdlICovCisjICBkZWZpbmUgRklPX1BVVF9DUCh4KSAoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCS8qIHB1dCBjb2RlcGFnZSBpbiB0b3Agd29yZCAqLworIyAgZGVmaW5lIEZJT19HRVRfQ1AoeCkJKCgoeCk+PjE2KSAmIDB4ZmZmZikJLyogZ2V0IGNvZGVwYWdlIGZyb20gdG9wIHdvcmQgKi8KKyMgZW5kaWYKKyMgaWZkZWYgTUFDT1NfWAorIyAgZGVmaW5lIEZJT19NQUNST01BTgkweDIwCS8qIGNvbnZlcnQgTWFjUm9tYW4gKi8KKyMgZW5kaWYKKyMgZGVmaW5lIEZJT19FTkRJQU5fTAkweDgwCS8qIGxpdHRsZSBlbmRpYW4gKi8KKyMgZGVmaW5lIEZJT19FTkNSWVBURUQJMHgxMDAwCS8qIGVuY3J5cHQgd3JpdHRlbiBieXRlcyAqLworIyBkZWZpbmUgRklPX05PQ09OVkVSVAkweDIwMDAJLyogc2tpcCBlbmNvZGluZyBjb252ZXJzaW9uICovCisjIGRlZmluZSBGSU9fVUNTQk9NCTB4NDAwMAkvKiBjaGVjayBmb3IgQk9NIGF0IHN0YXJ0IG9mIGZpbGUgKi8KKyMgZGVmaW5lIEZJT19BTEwJLTEJLyogYWxsb3cgYWxsIGZvcm1hdHMgKi8KKyNlbmRpZgorCisvKiBXaGVuIGNvbnZlcnRpbmcsIGEgcmVhZCgpIG9yIHdyaXRlKCkgbWF5IGxlYXZlIHNvbWUgYnl0ZXMgdG8gYmUgY29udmVydGVkCisgKiBmb3IgdGhlIG5leHQgY2FsbC4gIFRoZSB2YWx1ZSBpcyBndWVzc2VkLi4uICovCisjZGVmaW5lIENPTlZfUkVTVExFTiAzMAorCisvKiBXZSBoYXZlIHRvIGd1ZXNzIGhvdyBtdWNoIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgbWF5IGV4cGFuZCB3aGVuIGNvbnZlcnRpbmcKKyAqIHdpdGggaWNvbnYoKSB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGEgYnVmZmVyLiAqLworI2RlZmluZSBJQ09OVl9NVUxUIDgKKworLyoKKyAqIFN0cnVjdHVyZSB0byBwYXNzIGFyZ3VtZW50cyBmcm9tIGJ1Zl93cml0ZSgpIHRvIGJ1Zl93cml0ZV9ieXRlcygpLgorICovCitzdHJ1Y3QgYndfaW5mbworeworICAgIGludAkJYndfZmQ7CQkvKiBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBjaGFyX3UJKmJ3X2J1ZjsJLyogYnVmZmVyIHdpdGggZGF0YSB0byBiZSB3cml0dGVuICovCisgICAgaW50CQlid19sZW47CS8qIGxlbmdodCBvZiBkYXRhICovCisjaWZkZWYgSEFTX0JXX0ZMQUdTCisgICAgaW50CQlid19mbGFnczsJLyogRklPXyBmbGFncyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdQlid19yZXN0W0NPTlZfUkVTVExFTl07IC8qIG5vdCBjb252ZXJ0ZWQgYnl0ZXMgKi8KKyAgICBpbnQJCWJ3X3Jlc3RsZW47CS8qIG5yIG9mIGJ5dGVzIGluIGJ3X3Jlc3RbXSAqLworICAgIGludAkJYndfZmlyc3Q7CS8qIGZpcnN0IHdyaXRlIGNhbGwgKi8KKyAgICBjaGFyX3UJKmJ3X2NvbnZfYnVmOwkvKiBidWZmZXIgZm9yIHdyaXRpbmcgY29udmVydGVkIGNoYXJzICovCisgICAgaW50CQlid19jb252X2J1ZmxlbjsgLyogc2l6ZSBvZiBid19jb252X2J1ZiAqLworICAgIGludAkJYndfY29udl9lcnJvcjsJLyogc2V0IGZvciBjb252ZXJzaW9uIGVycm9yICovCisjIGlmZGVmIFVTRV9JQ09OVgorICAgIGljb252X3QJYndfaWNvbnZfZmQ7CS8qIGRlc2NyaXB0b3IgZm9yIGljb252KCkgb3IgLTEgKi8KKyMgZW5kaWYKKyNlbmRpZgorfTsKKworc3RhdGljIGludCAgYnVmX3dyaXRlX2J5dGVzIF9fQVJHUygoc3RydWN0IGJ3X2luZm8gKmlwKSk7CisKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgaW50IHVjczJieXRlcyBfX0FSR1MoKHVuc2lnbmVkIGMsIGNoYXJfdSAqKnBwLCBpbnQgZmxhZ3MpKTsKK3N0YXRpYyBpbnQgc2FtZV9lbmNvZGluZyBfX0FSR1MoKGNoYXJfdSAqYSwgY2hhcl91ICpiKSk7CitzdGF0aWMgaW50IGdldF9maW9fZmxhZ3MgX19BUkdTKChjaGFyX3UgKnB0cikpOworc3RhdGljIGNoYXJfdSAqY2hlY2tfZm9yX2JvbSBfX0FSR1MoKGNoYXJfdSAqcCwgbG9uZyBzaXplLCBpbnQgKmxlbnAsIGludCBmbGFncykpOworc3RhdGljIGludCBtYWtlX2JvbSBfX0FSR1MoKGNoYXJfdSAqYnVmLCBjaGFyX3UgKm5hbWUpKTsKKyMgaWZkZWYgV0lOMzI2NAorc3RhdGljIGludCBnZXRfd2luX2Zpb19mbGFncyBfX0FSR1MoKGNoYXJfdSAqcHRyKSk7CisjIGVuZGlmCisjIGlmZGVmIE1BQ09TX1gKK3N0YXRpYyBpbnQgZ2V0X21hY19maW9fZmxhZ3MgX19BUkdTKChjaGFyX3UgKnB0cikpOworIyBlbmRpZgorI2VuZGlmCitzdGF0aWMgaW50IG1vdmVfbGluZXMgX19BUkdTKChidWZfVCAqZnJvbWJ1ZiwgYnVmX1QgKnRvYnVmKSk7CisKK3N0YXRpYyBsaW5lbnJfVAl3cml0ZV9ub19lb2xfbG51bSA9IDA7CS8qIG5vbi16ZXJvIGxudW0gd2hlbiBsYXN0IGxpbmUgb2YKKwkJCQkJICAgbmV4dCBiaW5hcnkgd3JpdGUgc2hvdWxkIG5vdCBoYXZlCisJCQkJCSAgIGFuIGVuZC1vZi1saW5lICovCisKKyAgICB2b2lkCitmaWxlbWVzcyhidWYsIG5hbWUsIHMsIGF0dHIpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSpzOworICAgIGludAkJYXR0cjsKK3sKKyAgICBpbnQJCW1zZ19zY3JvbGxfc2F2ZTsKKworICAgIGlmIChtc2dfc2lsZW50ICE9IDApCisJcmV0dXJuOworICAgIG1zZ19hZGRfZm5hbWUoYnVmLCBuYW1lKTsJICAgIC8qIHB1dCBmaWxlIG5hbWUgaW4gSU9idWZmIHdpdGggcXVvdGVzICovCisgICAgLyogSWYgaXQncyBleHRyZW1lbHkgbG9uZywgdHJ1bmNhdGUgaXQuICovCisgICAgaWYgKFNUUkxFTihJT2J1ZmYpID4gSU9TSVpFIC0gODApCisJSU9idWZmW0lPU0laRSAtIDgwXSA9IE5VTDsKKyAgICBTVFJDQVQoSU9idWZmLCBzKTsKKyAgICAvKgorICAgICAqIEZvciB0aGUgZmlyc3QgbWVzc2FnZSBtYXkgaGF2ZSB0byBzdGFydCBhIG5ldyBsaW5lLgorICAgICAqIEZvciBmdXJ0aGVyIG9uZXMgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBvbmUsIHJlc2V0IG1zZ19zY3JvbGwgYmVmb3JlCisgICAgICogY2FsbGluZyBmaWxlbWVzcygpLgorICAgICAqLworICAgIG1zZ19zY3JvbGxfc2F2ZSA9IG1zZ19zY3JvbGw7CisgICAgaWYgKHNob3J0bWVzcyhTSE1fT1ZFUkFMTCkgJiYgIWV4aXRpbmcgJiYgcF92ZXJib3NlID09IDApCisJbXNnX3Njcm9sbCA9IEZBTFNFOworICAgIGlmICghbXNnX3Njcm9sbCkJLyogd2FpdCBhIGJpdCB3aGVuIG92ZXJ3cml0aW5nIGFuIGVycm9yIG1zZyAqLworCWNoZWNrX2Zvcl9kZWxheShGQUxTRSk7CisgICAgbXNnX3N0YXJ0KCk7CisgICAgbXNnX3Njcm9sbCA9IG1zZ19zY3JvbGxfc2F2ZTsKKyAgICBtc2dfc2Nyb2xsZWRfaWduID0gVFJVRTsKKyAgICAvKiBtYXkgdHJ1bmNhdGUgdGhlIG1lc3NhZ2UgdG8gYXZvaWQgYSBoaXQtcmV0dXJuIHByb21wdCAqLworICAgIG1zZ19vdXR0cmFuc19hdHRyKG1zZ19tYXlfdHJ1bmMoRkFMU0UsIElPYnVmZiksIGF0dHIpOworICAgIG1zZ19jbHJfZW9zKCk7CisgICAgb3V0X2ZsdXNoKCk7CisgICAgbXNnX3Njcm9sbGVkX2lnbiA9IEZBTFNFOworfQorCisvKgorICogUmVhZCBsaW5lcyBmcm9tIGZpbGUgImZuYW1lIiBpbnRvIHRoZSBidWZmZXIgYWZ0ZXIgbGluZSAiZnJvbSIuCisgKgorICogMS4gV2UgYWxsb2NhdGUgYmxvY2tzIHdpdGggbGFsbG9jLCBhcyBiaWcgYXMgcG9zc2libGUuCisgKiAyLiBFYWNoIGJsb2NrIGlzIGZpbGxlZCB3aXRoIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmlsZSB3aXRoIGEgc2luZ2xlIHJlYWQoKS4KKyAqIDMuIFRoZSBsaW5lcyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIGJ1ZmZlciB3aXRoIG1sX2FwcGVuZCgpLgorICoKKyAqIChjYWxsZXIgbXVzdCBjaGVjayB0aGF0IGZuYW1lICE9IE5VTEwsIHVubGVzcyBSRUFEX1NURElOIGlzIHVzZWQpCisgKgorICogImxpbmVzX3RvX3NraXAiIGlzIHRoZSBudW1iZXIgb2YgbGluZXMgdGhhdCBtdXN0IGJlIHNraXBwZWQKKyAqICJsaW5lc190b19yZWFkIiBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQgYXJlIGFwcGVuZGVkCisgKiBXaGVuIG5vdCByZWNvdmVyaW5nIGxpbmVzX3RvX3NraXAgaXMgMCBhbmQgbGluZXNfdG9fcmVhZCBNQVhMTlVNLgorICoKKyAqIGZsYWdzOgorICogUkVBRF9ORVcJc3RhcnRpbmcgdG8gZWRpdCBhIG5ldyBidWZmZXIKKyAqIFJFQURfRklMVEVSCXJlYWRpbmcgZmlsdGVyIG91dHB1dAorICogUkVBRF9TVERJTglyZWFkIGZyb20gc3RkaW4gaW5zdGVhZCBvZiBhIGZpbGUKKyAqIFJFQURfQlVGRkVSCXJlYWQgZnJvbSBjdXJidWYgaW5zdGVhZCBvZiBhIGZpbGUgKGNvbnZlcnRpbmcgYWZ0ZXIgcmVhZGluZworICoJCXN0ZGluKQorICogUkVBRF9EVU1NWQlyZWFkIGludG8gYSBkdW1teSBidWZmZXIgKHRvIGNoZWNrIGlmIGZpbGUgY29udGVudHMgY2hhbmdlZCkKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK3JlYWRmaWxlKGZuYW1lLCBzZm5hbWUsIGZyb20sIGxpbmVzX3RvX3NraXAsIGxpbmVzX3RvX3JlYWQsIGVhcCwgZmxhZ3MpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBjaGFyX3UJKnNmbmFtZTsKKyAgICBsaW5lbnJfVAlmcm9tOworICAgIGxpbmVucl9UCWxpbmVzX3RvX3NraXA7CisgICAgbGluZW5yX1QJbGluZXNfdG9fcmVhZDsKKyAgICBleGFyZ19UCSplYXA7CQkJLyogY2FuIGJlIE5VTEwhICovCisgICAgaW50CQlmbGFnczsKK3sKKyAgICBpbnQJCWZkID0gMDsKKyAgICBpbnQJCW5ld2ZpbGUgPSAoZmxhZ3MgJiBSRUFEX05FVyk7CisgICAgaW50CQljaGVja19yZWFkb25seTsKKyAgICBpbnQJCWZpbHRlcmluZyA9IChmbGFncyAmIFJFQURfRklMVEVSKTsKKyAgICBpbnQJCXJlYWRfc3RkaW4gPSAoZmxhZ3MgJiBSRUFEX1NURElOKTsKKyAgICBpbnQJCXJlYWRfYnVmZmVyID0gKGZsYWdzICYgUkVBRF9CVUZGRVIpOworICAgIGxpbmVucl9UCXJlYWRfYnVmX2xudW0gPSAxOwkvKiBuZXh0IGxpbmUgdG8gcmVhZCBmcm9tIGN1cmJ1ZiAqLworICAgIGNvbG5yX1QJcmVhZF9idWZfY29sID0gMDsJLyogbmV4dCBjaGFyIHRvIHJlYWQgZnJvbSB0aGlzIGxpbmUgKi8KKyAgICBjaGFyX3UJYzsKKyAgICBsaW5lbnJfVAlsbnVtID0gZnJvbTsKKyAgICBjaGFyX3UJKnB0ciA9IE5VTEw7CQkvKiBwb2ludGVyIGludG8gcmVhZCBidWZmZXIgKi8KKyAgICBjaGFyX3UJKmJ1ZmZlciA9IE5VTEw7CQkvKiByZWFkIGJ1ZmZlciAqLworICAgIGNoYXJfdQkqbmV3X2J1ZmZlciA9IE5VTEw7CS8qIGluaXQgdG8gc2h1dCB1cCBnY2MgKi8KKyAgICBjaGFyX3UJKmxpbmVfc3RhcnQgPSBOVUxMOwkvKiBpbml0IHRvIHNodXQgdXAgZ2NjICovCisgICAgaW50CQl3YXNlbXB0eTsJCS8qIGJ1ZmZlciB3YXMgZW1wdHkgYmVmb3JlIHJlYWRpbmcgKi8KKyAgICBjb2xucl9UCWxlbjsKKyAgICBsb25nCXNpemUgPSAwOworICAgIGNoYXJfdQkqcDsKKyAgICBsb25nCWZpbGVzaXplID0gMDsKKyAgICBpbnQJCXNraXBfcmVhZCA9IEZBTFNFOworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBjaGFyX3UJKmNyeXB0a2V5ID0gTlVMTDsKKyNlbmRpZgorICAgIGludAkJc3BsaXQgPSAwOwkJLyogbnVtYmVyIG9mIHNwbGl0IGxpbmVzICovCisjZGVmaW5lIFVOS05PV04JIDB4MGZmZmZmZmYJCS8qIGZpbGUgc2l6ZSBpcyB1bmtub3duICovCisgICAgbGluZW5yX1QJbGluZWNudDsKKyAgICBpbnQJCWVycm9yID0gRkFMU0U7CQkvKiBlcnJvcnMgZW5jb3VudGVyZWQgKi8KKyAgICBpbnQJCWZmX2Vycm9yID0gRU9MX1VOS05PV047IC8qIGZpbGUgZm9ybWF0IHdpdGggZXJyb3JzICovCisgICAgbG9uZwlsaW5lcmVzdCA9IDA7CQkvKiByZW1haW5pbmcgY2hhcnMgaW4gbGluZSAqLworI2lmZGVmIFVOSVgKKyAgICBpbnQJCXBlcm0gPSAwOworICAgIGludAkJc3dhcF9tb2RlID0gLTE7CQkvKiBwcm90ZWN0aW9uIGJpdHMgZm9yIHN3YXAgZmlsZSAqLworI2Vsc2UKKyAgICBpbnQJCXBlcm07CisjZW5kaWYKKyAgICBpbnQJCWZpbGVmb3JtYXQgPSAwOwkJLyogZW5kLW9mLWxpbmUgZm9ybWF0ICovCisgICAgaW50CQlrZWVwX2ZpbGVmb3JtYXQgPSBGQUxTRTsKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKyAgICBpbnQJCWZpbGVfcmVhZG9ubHk7CisgICAgbGluZW5yX1QJc2tpcF9jb3VudCA9IDA7CisgICAgbGluZW5yX1QJcmVhZF9jb3VudCA9IDA7CisgICAgaW50CQltc2dfc2F2ZSA9IG1zZ19zY3JvbGw7CisgICAgbGluZW5yX1QJcmVhZF9ub19lb2xfbG51bSA9IDA7ICAgLyogbm9uLXplcm8gbG51bSB3aGVuIGxhc3QgbGluZSBvZgorCQkJCQkgKiBsYXN0IHJlYWQgd2FzIG1pc3NpbmcgdGhlIGVvbCAqLworICAgIGludAkJdHJ5X21hYyA9ICh2aW1fc3RyY2hyKHBfZmZzLCAnbScpICE9IE5VTEwpOworICAgIGludAkJdHJ5X2RvcyA9ICh2aW1fc3RyY2hyKHBfZmZzLCAnZCcpICE9IE5VTEwpOworICAgIGludAkJdHJ5X3VuaXggPSAodmltX3N0cmNocihwX2ZmcywgJ3gnKSAhPSBOVUxMKTsKKyAgICBpbnQJCWZpbGVfcmV3aW5kID0gRkFMU0U7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJY2FuX3JldHJ5OworICAgIGludAkJY29udl9lcnJvciA9IEZBTFNFOwkvKiBjb252ZXJzaW9uIGVycm9yIGRldGVjdGVkICovCisgICAgaW50CQlrZWVwX2Rlc3RfZW5jID0gRkFMU0U7CS8qIGRvbid0IHJldHJ5IHdoZW4gY2hhciBkb2Vzbid0IGZpdAorCQkJCQkgICBpbiBkZXN0aW5hdGlvbiBlbmNvZGluZyAqLworICAgIGxpbmVucl9UCWlsbGVnYWxfYnl0ZSA9IDA7CS8qIGxpbmUgbnIgd2l0aCBpbGxlZ2FsIGJ5dGUgKi8KKyAgICBjaGFyX3UJKnRtcG5hbWUgPSBOVUxMOwkvKiBuYW1lIG9mICdjaGFyY29udmVydCcgb3V0cHV0IGZpbGUgKi8KKyAgICBpbnQJCWZpb19mbGFncyA9IDA7CisgICAgY2hhcl91CSpmZW5jOwkJCS8qIGZpbGVlbmNvZGluZyB0byB1c2UgKi8KKyAgICBpbnQJCWZlbmNfYWxsb2NlZDsJCS8qIGZlbmNfbmV4dCBpcyBpbiBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgY2hhcl91CSpmZW5jX25leHQgPSBOVUxMOwkvKiBuZXh0IGl0ZW0gaW4gJ2ZlbmNzJyBvciBOVUxMICovCisgICAgaW50CQlhZHZhbmNlX2ZlbmMgPSBGQUxTRTsKKyAgICBsb25nCXJlYWxfc2l6ZSA9IDA7CisjIGlmZGVmIFVTRV9JQ09OVgorICAgIGljb252X3QJaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsJLyogZGVzY3JpcHRvciBmb3IgaWNvbnYoKSBvciAtMSAqLworIyAgaWZkZWYgRkVBVF9FVkFMCisgICAgaW50CQlkaWRfaWNvbnYgPSBGQUxTRTsJLyogVFJVRSB3aGVuIGljb252KCkgZmFpbGVkIGFuZCB0cnlpbmcKKwkJCQkJICAgJ2NoYXJjb252ZXJ0JyBuZXh0ICovCisjICBlbmRpZgorIyBlbmRpZgorICAgIGludAkJY29udmVydGVkID0gRkFMU0U7CS8qIFRSVUUgaWYgY29udmVyc2lvbiBkb25lICovCisgICAgaW50CQlub3Rjb252ZXJ0ZWQgPSBGQUxTRTsJLyogVFJVRSBpZiBjb252ZXJzaW9uIHdhbnRlZCBidXQgaXQKKwkJCQkJICAgd2Fzbid0IHBvc3NpYmxlICovCisgICAgY2hhcl91CWNvbnZfcmVzdFtDT05WX1JFU1RMRU5dOworICAgIGludAkJY29udl9yZXN0bGVuID0gMDsJLyogbnIgb2YgYnl0ZXMgaW4gY29udl9yZXN0W10gKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgd3JpdGVfbm9fZW9sX2xudW0gPSAwOwkvKiBpbiBjYXNlIGl0IHdhcyBzZXQgYnkgdGhlIHByZXZpb3VzIHJlYWQgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyBubyBmaWxlIG5hbWUgeWV0LCB1c2UgdGhlIG9uZSBmb3IgdGhlIHJlYWQgZmlsZS4KKyAgICAgKiBCRl9OT1RFRElURUQgaXMgc2V0IHRvIHJlZmxlY3QgdGhpcy4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciBhIHJlYWQgZnJvbSBhIGZpbHRlci4KKyAgICAgKiBPbmx5IGRvIHRoaXMgd2hlbiAnY3BvcHRpb25zJyBjb250YWlucyB0aGUgJ2YnIGZsYWcuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTAorCSAgICAmJiAhZmlsdGVyaW5nCisJICAgICYmIGZuYW1lICE9IE5VTEwKKwkgICAgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0ZOQU1FUikgIT0gTlVMTAorCSAgICAmJiAhKGZsYWdzICYgUkVBRF9EVU1NWSkpCisgICAgeworCWlmIChzZXRmbmFtZShjdXJidWYsIGZuYW1lLCBzZm5hbWUsIEZBTFNFKSA9PSBPSykKKwkgICAgY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX05PVEVESVRFRDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBVbml4OiBVc2UgdGhlIHNob3J0IGZpbGUgbmFtZSB3aGVuZXZlciBwb3NzaWJsZS4KKyAgICAgKiBBdm9pZHMgcHJvYmxlbXMgd2l0aCBuZXR3b3JrcyBhbmQgd2hlbiBkaXJlY3RvcnkgbmFtZXMgYXJlIGNoYW5nZWQuCisgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgTVMtRE9TLCBhICJjZCIgaW4gYSBzdWItc2hlbGwgbWF5IGhhdmUgbW92ZWQgdXMgdG8KKyAgICAgKiBhbm90aGVyIGRpcmVjdG9yeSwgd2hpY2ggd2UgZG9uJ3QgZGV0ZWN0LgorICAgICAqLworICAgIGlmIChzZm5hbWUgPT0gTlVMTCkKKwlzZm5hbWUgPSBmbmFtZTsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykKKyAgICBmbmFtZSA9IHNmbmFtZTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyoKKyAgICAgKiBUaGUgQnVmUmVhZENtZCBhbmQgRmlsZVJlYWRDbWQgZXZlbnRzIGludGVyY2VwdCB0aGUgcmVhZGluZyBwcm9jZXNzIGJ5CisgICAgICogZXhlY3V0aW5nIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmRzIGluc3RlYWQuCisgICAgICovCisgICAgaWYgKCFmaWx0ZXJpbmcgJiYgIXJlYWRfc3RkaW4gJiYgIXJlYWRfYnVmZmVyKQorICAgIHsKKwlwb3NfVAkgICAgcG9zOworCisJcG9zID0gY3VyYnVmLT5iX29wX3N0YXJ0OworCisJLyogU2V0ICdbIG1hcmsgdG8gdGhlIGxpbmUgYWJvdmUgd2hlcmUgdGhlIGxpbmVzIGdvIChsaW5lIDEgaWYgemVybykuICovCisJY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSAoKGZyb20gPT0gMCkgPyAxIDogZnJvbSk7CisJY3VyYnVmLT5iX29wX3N0YXJ0LmNvbCA9IDA7CisKKwlpZiAobmV3ZmlsZSkKKwl7CisJICAgIGlmIChhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9CVUZSRUFEQ01ELCBOVUxMLCBzZm5hbWUsCisJCQkJCQkJICBGQUxTRSwgY3VyYnVmLCBlYXApKQorI2lmZGVmIEZFQVRfRVZBTAorCQlyZXR1cm4gYWJvcnRpbmcoKSA/IEZBSUwgOiBPSzsKKyNlbHNlCisJCXJldHVybiBPSzsKKyNlbmRpZgorCX0KKwllbHNlIGlmIChhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9GSUxFUkVBRENNRCwgc2ZuYW1lLCBzZm5hbWUsCisJCQkJCQkJICAgIEZBTFNFLCBOVUxMLCBlYXApKQorI2lmZGVmIEZFQVRfRVZBTAorCSAgICByZXR1cm4gYWJvcnRpbmcoKSA/IEZBSUwgOiBPSzsKKyNlbHNlCisJICAgIHJldHVybiBPSzsKKyNlbmRpZgorCisJY3VyYnVmLT5iX29wX3N0YXJ0ID0gcG9zOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKChzaG9ydG1lc3MoU0hNX09WRVIpIHx8IGN1cmJ1Zi0+Yl9oZWxwKSAmJiBwX3ZlcmJvc2UgPT0gMCkKKwltc2dfc2Nyb2xsID0gRkFMU0U7CS8qIG92ZXJ3cml0ZSBwcmV2aW91cyBmaWxlIG1lc3NhZ2UgKi8KKyAgICBlbHNlCisJbXNnX3Njcm9sbCA9IFRSVUU7CS8qIGRvbid0IG92ZXJ3cml0ZSBwcmV2aW91cyBmaWxlIG1lc3NhZ2UgKi8KKworICAgIC8qCisgICAgICogSWYgdGhlIG5hbWUgZW5kcyBpbiBhIHBhdGggc2VwYXJhdG9yLCB3ZSBjYW4ndCBvcGVuIGl0LiAgQ2hlY2sgaGVyZSwKKyAgICAgKiBiZWNhdXNlIHJlYWRpbmcgdGhlIGZpbGUgbWF5IGFjdHVhbGx5IHdvcmssIGJ1dCB0aGVuIGNyZWF0aW5nIHRoZSBzd2FwCisgICAgICogZmlsZSBtYXkgZGVzdHJveSBpdCEgIFJlcG9ydGVkIG9uIE1TLURPUyBhbmQgV2luIDk1LgorICAgICAqIElmIHRoZSBuYW1lIGlzIHRvbyBsb25nIHdlIG1pZ2h0IGNyYXNoIGZ1cnRoZXIgb24sIHF1aXQgaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoZm5hbWUgIT0gTlVMTAorCSAgICAmJiAqZm5hbWUgIT0gTlVMCisJICAgICYmICh2aW1faXNwYXRoc2VwKCooZm5hbWUgKyBTVFJMRU4oZm5hbWUpIC0gMSkpCisJCXx8IFNUUkxFTihmbmFtZSkgPj0gTUFYUEFUSEwpKQorICAgIHsKKwlmaWxlbWVzcyhjdXJidWYsIGZuYW1lLCAoY2hhcl91ICopXygiSWxsZWdhbCBmaWxlIG5hbWUiKSwgMCk7CisJbXNnX2VuZCgpOworCW1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBVTklYCisgICAgLyoKKyAgICAgKiBPbiBVbml4IGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgYSBkaXJlY3RvcnksIHNvIHdlIGhhdmUgdG8KKyAgICAgKiBjaGVjayBmb3IgaXQgYmVmb3JlIHRoZSBtY2hfb3BlbigpLgorICAgICAqLworICAgIGlmICghcmVhZF9zdGRpbiAmJiAhcmVhZF9idWZmZXIpCisgICAgeworCXBlcm0gPSBtY2hfZ2V0cGVybShmbmFtZSk7CisJaWYgKHBlcm0gPj0gMCAmJiAhU19JU1JFRyhwZXJtKQkJICAgIC8qIG5vdCBhIHJlZ3VsYXIgZmlsZSAuLi4gKi8KKyMgaWZkZWYgU19JU0ZJRk8KKwkJICAgICAgJiYgIVNfSVNGSUZPKHBlcm0pCSAgICAvKiAuLi4gb3IgZmlmbyAqLworIyBlbmRpZgorIyBpZmRlZiBTX0lTU09DSworCQkgICAgICAmJiAhU19JU1NPQ0socGVybSkJICAgIC8qIC4uLiBvciBzb2NrZXQgKi8KKyMgZW5kaWYKKwkJCQkJCSkKKwl7CisJICAgIGlmIChTX0lTRElSKHBlcm0pKQorCQlmaWxlbWVzcyhjdXJidWYsIGZuYW1lLCAoY2hhcl91ICopXygiaXMgYSBkaXJlY3RvcnkiKSwgMCk7CisJICAgIGVsc2UKKwkJZmlsZW1lc3MoY3VyYnVmLCBmbmFtZSwgKGNoYXJfdSAqKV8oImlzIG5vdCBhIGZpbGUiKSwgMCk7CisJICAgIG1zZ19lbmQoKTsKKwkgICAgbXNnX3Njcm9sbCA9IG1zZ19zYXZlOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBzZXQgZGVmYXVsdCAnZmlsZWZvcm1hdCcgKi8KKyAgICBpZiAobmV3ZmlsZSkKKyAgICB7CisJaWYgKGVhcCAhPSBOVUxMICYmIGVhcC0+Zm9yY2VfZmYgIT0gMCkKKwkgICAgc2V0X2ZpbGVmb3JtYXQoZ2V0X2ZpbGVmb3JtYXRfZm9yY2UoY3VyYnVmLCBlYXApLCBPUFRfTE9DQUwpOworCWVsc2UgaWYgKCpwX2ZmcyAhPSBOVUwpCisJICAgIHNldF9maWxlZm9ybWF0KGRlZmF1bHRfZmlsZWZvcm1hdCgpLCBPUFRfTE9DQUwpOworICAgIH0KKworICAgIC8qIHNldCBvciByZXNldCAnYmluYXJ5JyAqLworICAgIGlmIChlYXAgIT0gTlVMTCAmJiBlYXAtPmZvcmNlX2JpbiAhPSAwKQorICAgIHsKKwlpbnQJb2xkdmFsID0gY3VyYnVmLT5iX3BfYmluOworCisJY3VyYnVmLT5iX3BfYmluID0gKGVhcC0+Zm9yY2VfYmluID09IEZPUkNFX0JJTik7CisJc2V0X29wdGlvbnNfYmluKG9sZHZhbCwgY3VyYnVmLT5iX3BfYmluLCBPUFRfTE9DQUwpOworICAgIH0KKworICAgIC8qCisgICAgICogV2hlbiBvcGVuaW5nIGEgbmV3IGZpbGUgd2UgdGFrZSB0aGUgcmVhZG9ubHkgZmxhZyBmcm9tIHRoZSBmaWxlLgorICAgICAqIERlZmF1bHQgaXMgci93LCBjYW4gYmUgc2V0IHRvIHIvbyBiZWxvdy4KKyAgICAgKiBEb24ndCByZXNldCBpdCB3aGVuIGluIHJlYWRvbmx5IG1vZGUKKyAgICAgKiBPbmx5IHNldC9yZXNldCBiX3Bfcm8gd2hlbiBCRl9DSEVDS19STyBpcyBzZXQuCisgICAgICovCisgICAgY2hlY2tfcmVhZG9ubHkgPSAobmV3ZmlsZSAmJiAoY3VyYnVmLT5iX2ZsYWdzICYgQkZfQ0hFQ0tfUk8pKTsKKyAgICBpZiAoY2hlY2tfcmVhZG9ubHkgJiYgIXJlYWRvbmx5bW9kZSkgICAgLyogZGVmYXVsdDogc2V0IGZpbGUgbm90IHJlYWRvbmx5ICovCisJY3VyYnVmLT5iX3Bfcm8gPSBGQUxTRTsKKworICAgIGlmIChuZXdmaWxlICYmICFyZWFkX3N0ZGluICYmICFyZWFkX2J1ZmZlcikKKyAgICB7CisJLyogUmVtZW1iZXIgdGltZSBvZiBmaWxlLgorCSAqIEZvciBSSVNDT1MsIGFsc28gcmVtZW1iZXIgdGhlIGZpbGV0eXBlLgorCSAqLworCWlmIChtY2hfc3RhdCgoY2hhciAqKWZuYW1lLCAmc3QpID49IDApCisJeworCSAgICBidWZfc3RvcmVfdGltZShjdXJidWYsICZzdCwgZm5hbWUpOworCSAgICBjdXJidWYtPmJfbXRpbWVfcmVhZCA9IGN1cmJ1Zi0+Yl9tdGltZTsKKworI2lmIGRlZmluZWQoUklTQ09TKSAmJiBkZWZpbmVkKEZFQVRfT1NGSUxFVFlQRSkKKwkgICAgLyogUmVhZCB0aGUgZmlsZXR5cGUgaW50byB0aGUgYnVmZmVyIGxvY2FsIGZpbGV0eXBlIG9wdGlvbi4gKi8KKwkgICAgbWNoX3JlYWRfZmlsZXR5cGUoZm5hbWUpOworI2VuZGlmCisjaWZkZWYgVU5JWAorCSAgICAvKgorCSAgICAgKiBVc2UgdGhlIHByb3RlY3Rpb24gYml0cyBvZiB0aGUgb3JpZ2luYWwgZmlsZSBmb3IgdGhlIHN3YXAgZmlsZS4KKwkgICAgICogVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3Igb3RoZXJzIHRvIHJlYWQgdGhlIG5hbWUgb2YgdGhlCisJICAgICAqIGVkaXRlZCBmaWxlIGZyb20gdGhlIHN3YXBmaWxlLCBidXQgb25seSBpZiB0aGV5IGNhbiByZWFkIHRoZQorCSAgICAgKiBlZGl0ZWQgZmlsZS4KKwkgICAgICogUmVtb3ZlIHRoZSAid3JpdGUiIGFuZCAiZXhlY3V0ZSIgYml0cyBmb3IgZ3JvdXAgYW5kIG90aGVycworCSAgICAgKiAodGhleSBtdXN0IG5vdCB3cml0ZSB0aGUgc3dhcGZpbGUpLgorCSAgICAgKiBBZGQgdGhlICJyZWFkIiBhbmQgIndyaXRlIiBiaXRzIGZvciB0aGUgdXNlciwgb3RoZXJ3aXNlIHdlIG1heQorCSAgICAgKiBub3QgYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgZmlsZSBvdXJzZWx2ZXMuCisJICAgICAqIFNldHRpbmcgdGhlIGJpdHMgaXMgZG9uZSBiZWxvdywgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN3YXAgZmlsZS4KKwkgICAgICovCisJICAgIHN3YXBfbW9kZSA9IChzdC5zdF9tb2RlICYgMDY0NCkgfCAwNjAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9DV19FRElUT1IKKwkgICAgLyogR2V0IHRoZSBGU1NwZWMgb24gTWFjT1MKKwkgICAgICogVE9ETzogVXBkYXRlIGl0IHByb3Blcmx5IHdoZW4gdGhlIGJ1ZmZlciBuYW1lIGNoYW5nZXMKKwkgICAgICovCisJICAgICh2b2lkKUdldEZTU3BlY0Zyb21QYXRoKGN1cmJ1Zi0+Yl9mZm5hbWUsICZjdXJidWYtPmJfRlNTcGVjKTsKKyNlbmRpZgorI2lmZGVmIFZNUworCSAgICBjdXJidWYtPmJfZmFiX3JmbSA9IHN0LnN0X2ZhYl9yZm07CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKwkgICAgY3VyYnVmLT5iX210aW1lID0gMDsKKwkgICAgY3VyYnVmLT5iX210aW1lX3JlYWQgPSAwOworCSAgICBjdXJidWYtPmJfb3JpZ19zaXplID0gMDsKKwkgICAgY3VyYnVmLT5iX29yaWdfbW9kZSA9IDA7CisJfQorCisJLyogUmVzZXQgdGhlICJuZXcgZmlsZSIgZmxhZy4gIEl0IHdpbGwgYmUgc2V0IGFnYWluIGJlbG93IHdoZW4gdGhlCisJICogZmlsZSBkb2Vzbid0IGV4aXN0LiAqLworCWN1cmJ1Zi0+Yl9mbGFncyAmPSB+KEJGX05FVyB8IEJGX05FV19XKTsKKyAgICB9CisKKy8qCisgKiBmb3IgVU5JWDogY2hlY2sgcmVhZG9ubHkgd2l0aCBwZXJtIGFuZCBtY2hfYWNjZXNzKCkKKyAqIGZvciBSSVNDT1M6IHNhbWUgYXMgVW5peCwgb3RoZXJ3aXNlIGZpbGUgZ2V0cyByZS1kYXRlc3RhbXBlZCEKKyAqIGZvciBNU0RPUyBhbmQgQW1pZ2E6IGNoZWNrIHJlYWRvbmx5IGJ5IHRyeWluZyB0byBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgKi8KKyAgICBmaWxlX3JlYWRvbmx5ID0gRkFMU0U7CisgICAgaWYgKHJlYWRfc3RkaW4pCisgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKQorCS8qIEZvcmNlIGJpbmFyeSBJL08gb24gc3RkaW4gdG8gYXZvaWQgQ1ItTEYgLT4gTEYgY29udmVyc2lvbi4gKi8KKwlzZXRtb2RlKDAsIE9fQklOQVJZKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICghcmVhZF9idWZmZXIpCisgICAgeworI2lmZGVmIFVTRV9NQ0hfQUNDRVNTCisJaWYgKAorIyBpZmRlZiBVTklYCisJICAgICEocGVybSAmIDAyMjIpIHx8CisjIGVuZGlmCisJCQkJbWNoX2FjY2VzcygoY2hhciAqKWZuYW1lLCBXX09LKSkKKwkgICAgZmlsZV9yZWFkb25seSA9IFRSVUU7CisJZmQgPSBtY2hfb3BlbigoY2hhciAqKWZuYW1lLCBPX1JET05MWSB8IE9fRVhUUkEsIDApOworI2Vsc2UKKwlpZiAoIW5ld2ZpbGUKKwkJfHwgcmVhZG9ubHltb2RlCisJCXx8IChmZCA9IG1jaF9vcGVuKChjaGFyICopZm5hbWUsIE9fUkRXUiB8IE9fRVhUUkEsIDApKSA8IDApCisJeworCSAgICBmaWxlX3JlYWRvbmx5ID0gVFJVRTsKKwkgICAgLyogdHJ5IHRvIG9wZW4gcm8gKi8KKwkgICAgZmQgPSBtY2hfb3BlbigoY2hhciAqKWZuYW1lLCBPX1JET05MWSB8IE9fRVhUUkEsIDApOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIGlmIChmZCA8IDApCQkJICAgIC8qIGNhbm5vdCBvcGVuIGF0IGFsbCAqLworICAgIHsKKyNpZm5kZWYgVU5JWAorCWludAlpc2Rpcl9mOworI2VuZGlmCisJbXNnX3Njcm9sbCA9IG1zZ19zYXZlOworI2lmbmRlZiBVTklYCisJLyoKKwkgKiBPbiBNU0RPUyBhbmQgQW1pZ2Egd2UgY2FuJ3Qgb3BlbiBhIGRpcmVjdG9yeSwgY2hlY2sgaGVyZS4KKwkgKi8KKwlpc2Rpcl9mID0gKG1jaF9pc2RpcihmbmFtZSkpOworCXBlcm0gPSBtY2hfZ2V0cGVybShmbmFtZSk7ICAvKiBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgKi8KKwlpZiAoaXNkaXJfZikKKwl7CisJICAgIGZpbGVtZXNzKGN1cmJ1Ziwgc2ZuYW1lLCAoY2hhcl91ICopXygiaXMgYSBkaXJlY3RvcnkiKSwgMCk7CisJICAgIGN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsJLyogbXVzdCB1c2UgInchIiBub3cgKi8KKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGlmIChuZXdmaWxlKQorCSAgICB7CisJCWlmIChwZXJtIDwgMCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFNldCB0aGUgJ25ldy1maWxlJyBmbGFnLCBzbyB0aGF0IHdoZW4gdGhlIGZpbGUgaGFzCisJCSAgICAgKiBiZWVuIGNyZWF0ZWQgYnkgc29tZW9uZSBlbHNlLCBhICI6dyIgd2lsbCBjb21wbGFpbi4KKwkJICAgICAqLworCQkgICAgY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX05FVzsKKworCQkgICAgLyogQ3JlYXRlIGEgc3dhcCBmaWxlIG5vdywgc28gdGhhdCBvdGhlciBWaW1zIGFyZSB3YXJuZWQKKwkJICAgICAqIHRoYXQgd2UgYXJlIGVkaXRpbmcgdGhpcyBmaWxlLiAgRG9uJ3QgZG8gdGhpcyBmb3IgYQorCQkgICAgICogIm5vZmlsZSIgb3IgIm5vd3JpdGUiIGJ1ZmZlciB0eXBlLiAqLworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJICAgIGlmICghYnRfZG9udHdyaXRlKGN1cmJ1ZikpCisjZW5kaWYKKwkJCWNoZWNrX25lZWRfc3dhcChuZXdmaWxlKTsKKwkJICAgIGZpbGVtZXNzKGN1cmJ1Ziwgc2ZuYW1lLCAoY2hhcl91ICopXygiW05ldyBGaWxlXSIpLCAwKTsKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKwkJICAgIC8qIEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBuZXcgZmlsZSwgaXQgbWlnaHQgaGF2ZSBiZWVuCisJCSAgICAgKiBlZGl0ZWQgYmVmb3JlIGFuZCBkZWxldGVkLiAgR2V0IHRoZSBvbGQgbWFya3MuICovCisJCSAgICBjaGVja19tYXJrc19yZWFkKCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoZWFwICE9IE5VTEwgJiYgZWFwLT5mb3JjZV9lbmMgIT0gMCkKKwkJICAgIHsKKwkJCS8qIHNldCBmb3JjZWQgJ2ZpbGVlbmNvZGluZycgKi8KKwkJCWZlbmMgPSBlbmNfY2Fub25pemUoZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2VuYyk7CisJCQlpZiAoZmVuYyAhPSBOVUxMKQorCQkJICAgIHNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImZlbmMiLCAtMSwKKwkJCQkJCSAgICBmZW5jLCBPUFRfRlJFRXxPUFRfTE9DQUwpOworCQkJdmltX2ZyZWUoZmVuYyk7CisJCSAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0JVRk5FV0ZJTEUsIHNmbmFtZSwgc2ZuYW1lLAorCQkJCQkJCSAgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKKyNlbmRpZgorCQkgICAgLyogcmVtZW1iZXIgdGhlIGN1cnJlbnQgZmlsZWZvcm1hdCAqLworCQkgICAgc2F2ZV9maWxlX2ZmKGN1cmJ1Zik7CisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJCSAgICBpZiAoYWJvcnRpbmcoKSkgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBGQUlMOworI2VuZGlmCisJCSAgICByZXR1cm4gT0s7CSAgICAvKiBhIG5ldyBmaWxlIGlzIG5vdCBhbiBlcnJvciAqLworCQl9CisJCWVsc2UKKwkJeworCQkgICAgZmlsZW1lc3MoY3VyYnVmLCBzZm5hbWUsCisJCQkJICAgICAgIChjaGFyX3UgKilfKCJbUGVybWlzc2lvbiBEZW5pZWRdIiksIDApOworCQkgICAgY3VyYnVmLT5iX3Bfcm8gPSBUUlVFOwkvKiBtdXN0IHVzZSAidyEiIG5vdyAqLworCQl9CisJICAgIH0KKworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qCisgICAgICogT25seSBzZXQgdGhlICdybycgZmxhZyBmb3IgcmVhZG9ubHkgZmlsZXMgdGhlIGZpcnN0IHRpbWUgdGhleSBhcmUKKyAgICAgKiBsb2FkZWQuCUhlbHAgZmlsZXMgYWx3YXlzIGdldCByZWFkb25seSBtb2RlCisgICAgICovCisgICAgaWYgKChjaGVja19yZWFkb25seSAmJiBmaWxlX3JlYWRvbmx5KSB8fCBjdXJidWYtPmJfaGVscCkKKwljdXJidWYtPmJfcF9ybyA9IFRSVUU7CisKKyAgICBpZiAobmV3ZmlsZSkKKyAgICB7CisJY3VyYnVmLT5iX3BfZW9sID0gVFJVRTsKKwljdXJidWYtPmJfc3RhcnRfZW9sID0gVFJVRTsKKyNpZmRlZiBGRUFUX01CWVRFCisJY3VyYnVmLT5iX3BfYm9tYiA9IEZBTFNFOworI2VuZGlmCisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgc3dhcCBmaWxlIG5vdywgc28gdGhhdCBvdGhlciBWaW1zIGFyZSB3YXJuZWQgdGhhdCB3ZSBhcmUKKyAgICAgKiBlZGl0aW5nIHRoaXMgZmlsZS4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciBhICJub2ZpbGUiIG9yICJub3dyaXRlIiBidWZmZXIgdHlwZS4gKi8KKyNpZmRlZiBGRUFUX1FVSUNLRklYCisgICAgaWYgKCFidF9kb250d3JpdGUoY3VyYnVmKSkKKyNlbmRpZgorICAgIHsKKwljaGVja19uZWVkX3N3YXAobmV3ZmlsZSk7CisjaWZkZWYgVU5JWAorCS8qIFNldCBzd2FwIGZpbGUgcHJvdGVjdGlvbiBiaXRzIGFmdGVyIGNyZWF0aW5nIGl0LiAqLworCWlmIChzd2FwX21vZGUgPiAwICYmIGN1cmJ1Zi0+Yl9tbC5tbF9tZnAtPm1mX2ZuYW1lICE9IE5VTEwpCisJICAgICh2b2lkKW1jaF9zZXRwZXJtKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAtPm1mX2ZuYW1lLCAobG9uZylzd2FwX21vZGUpOworI2VuZGlmCisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorICAgIC8qIElmICJRdWl0IiBzZWxlY3RlZCBhdCBBVFRFTlRJT04gZGlhbG9nLCBkb24ndCBsb2FkIHRoZSBmaWxlICovCisgICAgaWYgKHN3YXBfZXhpc3RzX2FjdGlvbiA9PSBTRUFfUVVJVCkKKyAgICB7CisJaWYgKCFyZWFkX2J1ZmZlciAmJiAhcmVhZF9zdGRpbikKKwkgICAgY2xvc2UoZmQpOworCXJldHVybiBGQUlMOworICAgIH0KKyNlbmRpZgorCisgICAgKytub193YWl0X3JldHVybjsJICAgIC8qIGRvbid0IHdhaXQgZm9yIHJldHVybiB5ZXQgKi8KKworICAgIC8qCisgICAgICogU2V0ICdbIG1hcmsgdG8gdGhlIGxpbmUgYWJvdmUgd2hlcmUgdGhlIGxpbmVzIGdvIChsaW5lIDEgaWYgemVybykuCisgICAgICovCisgICAgY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSAoKGZyb20gPT0gMCkgPyAxIDogZnJvbSk7CisgICAgY3VyYnVmLT5iX29wX3N0YXJ0LmNvbCA9IDA7CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoIXJlYWRfYnVmZmVyKQorICAgIHsKKwlpbnQJbSA9IG1zZ19zY3JvbGw7CisJaW50CW4gPSBtc2dfc2Nyb2xsZWQ7CisJYnVmX1QJKm9sZF9jdXJidWYgPSBjdXJidWY7CisKKwkvKgorCSAqIFRoZSBmaWxlIG11c3QgYmUgY2xvc2VkIGFnYWluLCB0aGUgYXV0b2NvbW1hbmRzIG1heSB3YW50IHRvIGNoYW5nZQorCSAqIHRoZSBmaWxlIGJlZm9yZSByZWFkaW5nIGl0LgorCSAqLworCWlmICghcmVhZF9zdGRpbikKKwkgICAgY2xvc2UoZmQpOwkJLyogaWdub3JlIGVycm9ycyAqLworCisJLyoKKwkgKiBUaGUgb3V0cHV0IGZyb20gdGhlIGF1dG9jb21tYW5kcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBhbnl0aGluZyBhbmQKKwkgKiBzaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuOiBTZXQgbXNnX3Njcm9sbCwgcmVzdG9yZSBpdHMgdmFsdWUgaWYgbm8KKwkgKiBvdXRwdXQgd2FzIGRvbmUuCisJICovCisJbXNnX3Njcm9sbCA9IFRSVUU7CisJaWYgKGZpbHRlcmluZykKKwkgICAgYXBwbHlfYXV0b2NtZHNfZXhhcmcoRVZFTlRfRklMVEVSUkVBRFBSRSwgTlVMTCwgc2ZuYW1lLAorCQkJCQkJCSAgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKKwllbHNlIGlmIChyZWFkX3N0ZGluKQorCSAgICBhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9TVERJTlJFQURQUkUsIE5VTEwsIHNmbmFtZSwKKwkJCQkJCQkgIEZBTFNFLCBjdXJidWYsIGVhcCk7CisJZWxzZSBpZiAobmV3ZmlsZSkKKwkgICAgYXBwbHlfYXV0b2NtZHNfZXhhcmcoRVZFTlRfQlVGUkVBRFBSRSwgTlVMTCwgc2ZuYW1lLAorCQkJCQkJCSAgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKKwllbHNlCisJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTEVSRUFEUFJFLCBzZm5hbWUsIHNmbmFtZSwKKwkJCQkJCQkgICAgRkFMU0UsIE5VTEwsIGVhcCk7CisJaWYgKG1zZ19zY3JvbGxlZCA9PSBuKQorCSAgICBtc2dfc2Nyb2xsID0gbTsKKworI2lmZGVmIEZFQVRfRVZBTAorCWlmIChhYm9ydGluZygpKQkgICAgLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJeworCSAgICAtLW5vX3dhaXRfcmV0dXJuOworCSAgICBtc2dfc2Nyb2xsID0gbXNnX3NhdmU7CisJICAgIGN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsJLyogbXVzdCB1c2UgInchIiBub3cgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisJfQorI2VuZGlmCisJLyoKKwkgKiBEb24ndCBhbGxvdyB0aGUgYXV0b2NvbW1hbmRzIHRvIGNoYW5nZSB0aGUgY3VycmVudCBidWZmZXIuCisJICogVHJ5IHRvIHJlLW9wZW4gdGhlIGZpbGUuCisJICovCisJaWYgKCFyZWFkX3N0ZGluICYmIChjdXJidWYgIT0gb2xkX2N1cmJ1ZgorCQl8fCAoZmQgPSBtY2hfb3BlbigoY2hhciAqKWZuYW1lLCBPX1JET05MWSB8IE9fRVhUUkEsIDApKSA8IDApKQorCXsKKwkgICAgLS1ub193YWl0X3JldHVybjsKKwkgICAgbXNnX3Njcm9sbCA9IG1zZ19zYXZlOworCSAgICBpZiAoZmQgPCAwKQorCQlFTVNHKF8oIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiKSk7CisJICAgIGVsc2UKKwkJRU1TRyhfKCJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIikpOworCSAgICBjdXJidWYtPmJfcF9ybyA9IFRSVUU7CS8qIG11c3QgdXNlICJ3ISIgbm93ICovCisJICAgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisjZW5kaWYgLyogRkVBVF9BVVRPQ01EICovCisKKyAgICAvKiBBdXRvY29tbWFuZHMgbWF5IGFkZCBsaW5lcyB0byB0aGUgZmlsZSwgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBlbXB0eSAqLworICAgIHdhc2VtcHR5ID0gKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKTsKKworICAgIGlmICghcmVjb3Zlcnltb2RlICYmICFmaWx0ZXJpbmcgJiYgIShmbGFncyAmIFJFQURfRFVNTVkpKQorICAgIHsKKwkvKgorCSAqIFNob3cgdGhlIHVzZXIgdGhhdCB3ZSBhcmUgYnVzeSByZWFkaW5nIHRoZSBpbnB1dC4gIFNvbWV0aW1lcyB0aGlzCisJICogbWF5IHRha2UgYSB3aGlsZS4gIFdoZW4gcmVhZGluZyBmcm9tIHN0ZGluIGFub3RoZXIgcHJvZ3JhbSBtYXkKKwkgKiBzdGlsbCBiZSBydW5uaW5nLCBkb24ndCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgbGluZSwgdW5sZXNzCisJICogYWx3YXlzIHVzaW5nIHRoZSBHVUkuCisJICovCisJaWYgKHJlYWRfc3RkaW4pCisJeworI2lmbmRlZiBBTFdBWVNfVVNFX0dVSQorCSAgICBtY2hfbXNnKF8oIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorCSAgICAvKiBBbHNvIHdyaXRlIGEgbWVzc2FnZSBpbiB0aGUgR1VJIHdpbmRvdywgaWYgdGhlcmUgaXMgb25lLiAqLworCSAgICBpZiAoZ3VpLmluX3VzZSAmJiAhZ3VpLmR5aW5nICYmICFndWkuc3RhcnRpbmcpCisJICAgIHsKKwkJcCA9IChjaGFyX3UgKilfKCJSZWFkaW5nIGZyb20gc3RkaW4uLi4iKTsKKwkJZ3VpX3dyaXRlKHAsIChpbnQpU1RSTEVOKHApKTsKKwkgICAgfQorI2VuZGlmCisJfQorCWVsc2UgaWYgKCFyZWFkX2J1ZmZlcikKKwkgICAgZmlsZW1lc3MoY3VyYnVmLCBzZm5hbWUsIChjaGFyX3UgKikiIiwgMCk7CisgICAgfQorCisgICAgbXNnX3Njcm9sbCA9IEZBTFNFOwkJCS8qIG92ZXJ3cml0ZSB0aGUgZmlsZSBtZXNzYWdlICovCisKKyAgICAvKgorICAgICAqIFNldCBsaW5lY250IG5vdywgYmVmb3JlIHRoZSAicmV0cnkiIGNhdXNlZCBieSBhIHdyb25nIGd1ZXNzIGZvcgorICAgICAqIGZpbGVmb3JtYXQsIGFuZCBhZnRlciB0aGUgYXV0b2NvbW1hbmRzLCB3aGljaCBtYXkgY2hhbmdlIHRoZW0uCisgICAgICovCisgICAgbGluZWNudCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qCisgICAgICogRGVjaWRlIHdoaWNoICdlbmNvZGluZycgdG8gdXNlIGZpcnN0LgorICAgICAqLworICAgIGlmIChlYXAgIT0gTlVMTCAmJiBlYXAtPmZvcmNlX2VuYyAhPSAwKQorICAgIHsKKwlmZW5jID0gZW5jX2Nhbm9uaXplKGVhcC0+Y21kICsgZWFwLT5mb3JjZV9lbmMpOworCWZlbmNfYWxsb2NlZCA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cmJ1Zi0+Yl9wX2JpbikKKyAgICB7CisJZmVuYyA9IChjaGFyX3UgKikiIjsJCS8qIGJpbmFyeTogZG9uJ3QgY29udmVydCAqLworCWZlbmNfYWxsb2NlZCA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJidWYtPmJfaGVscCkKKyAgICB7CisJY2hhcl91CSAgICBmaXJzdGxpbmVbODBdOworCisJLyogSGVscCBmaWxlcyBhcmUgZWl0aGVyIHV0Zi04IG9yIGxhdGluMS4gIFRyeSB1dGYtOCBmaXJzdCwgaWYgdGhpcworCSAqIGZhaWxzIGl0IG11c3QgYmUgbGF0aW4xLgorCSAqIEFsd2F5cyBkbyB0aGlzIHdoZW4gJ2VuY29kaW5nJyBpcyAidXRmLTgiLiAgT3RoZXJ3aXNlIG9ubHkgZG8KKwkgKiB0aGlzIHdoZW4gbmVlZGVkIHRvIGF2b2lkIFtjb252ZXJ0ZWRdIHJlbWFya3MgYWxsIHRoZSB0aW1lLgorCSAqIEl0IGlzIG5lZWRlZCB3aGVuIHRoZSBmaXJzdCBsaW5lIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorCSAqIFRoYXQgaXMgb25seSBpbiAqLj8/eCBmaWxlcy4gKi8KKwlmZW5jID0gKGNoYXJfdSAqKSJsYXRpbjEiOworCWMgPSBlbmNfdXRmODsKKwlpZiAoIWMgJiYgIXJlYWRfc3RkaW4gJiYgVE9MT1dFUl9BU0MoZm5hbWVbU1RSTEVOKGZuYW1lKSAtIDFdKSA9PSAneCcpCisJeworCSAgICAvKiBSZWFkIHRoZSBmaXJzdCBsaW5lIChhbmQgYSBiaXQgbW9yZSkuICBJbW1lZGlhdGVseSByZXdpbmQgdG8KKwkgICAgICogdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgSWYgdGhlIHJlYWQoKSBmYWlscyAibGVuIiBpcyAtMS4gKi8KKwkgICAgbGVuID0gdmltX3JlYWQoZmQsIGZpcnN0bGluZSwgODApOworCSAgICBsc2VlayhmZCwgKG9mZl90KTBMLCBTRUVLX1NFVCk7CisJICAgIGZvciAocCA9IGZpcnN0bGluZTsgcCA8IGZpcnN0bGluZSArIGxlbjsgKytwKQorCQlpZiAoKnAgPj0gMHg4MCkKKwkJeworCQkgICAgYyA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJfQorCX0KKworCWlmIChjKQorCXsKKwkgICAgZmVuY19uZXh0ID0gZmVuYzsKKwkgICAgZmVuYyA9IChjaGFyX3UgKikidXRmLTgiOworCisJICAgIC8qIFdoZW4gdGhlIGZpbGUgaXMgdXRmLTggYnV0IGEgY2hhcmFjdGVyIGRvZXNuJ3QgZml0IGluCisJICAgICAqICdlbmNvZGluZycgZG9uJ3QgcmV0cnkuICBJbiBoZWxwIHRleHQgZWRpdGluZyB1dGYtOCBieXRlcworCSAgICAgKiBkb2Vzbid0IG1ha2Ugc2Vuc2UuICovCisJICAgIGtlZXBfZGVzdF9lbmMgPSBUUlVFOworCX0KKwlmZW5jX2FsbG9jZWQgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnBfZmVuY3MgPT0gTlVMKQorICAgIHsKKwlmZW5jID0gY3VyYnVmLT5iX3BfZmVuYzsJLyogdXNlIGZvcm1hdCBmcm9tIGJ1ZmZlciAqLworCWZlbmNfYWxsb2NlZCA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWZlbmNfbmV4dCA9IHBfZmVuY3M7CQkvKiB0cnkgaXRlbXMgaW4gJ2ZpbGVlbmNvZGluZ3MnICovCisJZmVuYyA9IG5leHRfZmVuYygmZmVuY19uZXh0KTsKKwlmZW5jX2FsbG9jZWQgPSBUUlVFOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBKdW1wIGJhY2sgaGVyZSB0byByZXRyeSByZWFkaW5nIHRoZSBmaWxlIGluIGRpZmZlcmVudCB3YXlzLgorICAgICAqIFJlYXNvbnMgdG8gcmV0cnk6CisgICAgICogLSBlbmNvZGluZyBjb252ZXJzaW9uIGZhaWxlZDogdHJ5IGFub3RoZXIgb25lIGZyb20gImZlbmNfbmV4dCIKKyAgICAgKiAtIEJPTSBkZXRlY3RlZCBhbmQgZmVuYyB3YXMgc2V0LCBuZWVkIHRvIHNldHVwIGNvbnZlcnNpb24KKyAgICAgKiAtICJmaWxlZm9ybWF0IiBjaGVjayBmYWlsZWQ6IHRyeSBhbm90aGVyCisgICAgICoKKyAgICAgKiBWYXJpYWJsZXMgc2V0IGZvciBzcGVjaWFsIHJldHJ5IGFjdGlvbnM6CisgICAgICogImZpbGVfcmV3aW5kIglSZXdpbmQgdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBpdCBhZ2Fpbi4KKyAgICAgKiAiYWR2YW5jZV9mZW5jIglBZHZhbmNlICJmZW5jIiB1c2luZyAiZmVuY19uZXh0Ii4KKyAgICAgKiAic2tpcF9yZWFkIglSZS11c2UgYWxyZWFkeSByZWFkIGJ5dGVzIChCT00gZGV0ZWN0ZWQpLgorICAgICAqICJkaWRfaWNvbnYiCWljb252KCkgY29udmVyc2lvbiBmYWlsZWQsIHRyeSAnY2hhcmNvbnZlcnQnLgorICAgICAqICJrZWVwX2ZpbGVmb3JtYXQiIERvbid0IHJlc2V0ICJmaWxlZm9ybWF0Ii4KKyAgICAgKgorICAgICAqIE90aGVyIHN0YXR1cyBpbmRpY2F0b3JzOgorICAgICAqICJ0bXBuYW1lIglXaGVuICE9IE5VTEwgZGlkIGNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnLgorICAgICAqCQkJT3V0cHV0IGZpbGUgaGFzIHRvIGJlIGRlbGV0ZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKiAiaWNvbnZfZmQiCVdoZW4gIT0gLTEgZGlkIGNvbnZlcnNpb24gd2l0aCBpY29udigpLgorICAgICAqLworcmV0cnk6CisKKyAgICBpZiAoZmlsZV9yZXdpbmQpCisgICAgeworCWlmIChyZWFkX2J1ZmZlcikKKwl7CisJICAgIHJlYWRfYnVmX2xudW0gPSAxOworCSAgICByZWFkX2J1Zl9jb2wgPSAwOworCX0KKwllbHNlIGlmIChyZWFkX3N0ZGluIHx8IGxzZWVrKGZkLCAob2ZmX3QpMEwsIFNFRUtfU0VUKSAhPSAwKQorCXsKKwkgICAgLyogQ2FuJ3QgcmV3aW5kIHRoZSBmaWxlLCBnaXZlIHVwLiAqLworCSAgICBlcnJvciA9IFRSVUU7CisJICAgIGdvdG8gZmFpbGVkOworCX0KKwkvKiBEZWxldGUgdGhlIHByZXZpb3VzbHkgcmVhZCBsaW5lcy4gKi8KKwl3aGlsZSAobG51bSA+IGZyb20pCisJICAgIG1sX2RlbGV0ZShsbnVtLS0sIEZBTFNFKTsKKwlmaWxlX3Jld2luZCA9IEZBTFNFOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAobmV3ZmlsZSkKKwkgICAgY3VyYnVmLT5iX3BfYm9tYiA9IEZBTFNFOworCWNvbnZfZXJyb3IgPSBGQUxTRTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogV2hlbiByZXRyeWluZyB3aXRoIGFub3RoZXIgImZlbmMiIGFuZCB0aGUgZmlyc3QgdGltZSAiZmlsZWZvcm1hdCIKKyAgICAgKiB3aWxsIGJlIHJlc2V0LgorICAgICAqLworICAgIGlmIChrZWVwX2ZpbGVmb3JtYXQpCisJa2VlcF9maWxlZm9ybWF0ID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKwlpZiAoZWFwICE9IE5VTEwgJiYgZWFwLT5mb3JjZV9mZiAhPSAwKQorCSAgICBmaWxlZm9ybWF0ID0gZ2V0X2ZpbGVmb3JtYXRfZm9yY2UoY3VyYnVmLCBlYXApOworCWVsc2UgaWYgKGN1cmJ1Zi0+Yl9wX2JpbikKKwkgICAgZmlsZWZvcm1hdCA9IEVPTF9VTklYOwkJLyogYmluYXJ5OiB1c2UgVW5peCBmb3JtYXQgKi8KKwllbHNlIGlmICgqcF9mZnMgPT0gTlVMKQorCSAgICBmaWxlZm9ybWF0ID0gZ2V0X2ZpbGVmb3JtYXQoY3VyYnVmKTsvKiB1c2UgZm9ybWF0IGZyb20gYnVmZmVyICovCisJZWxzZQorCSAgICBmaWxlZm9ybWF0ID0gRU9MX1VOS05PV047CQkvKiBkZXRlY3QgZnJvbSBmaWxlICovCisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorIyBpZmRlZiBVU0VfSUNPTlYKKyAgICBpZiAoaWNvbnZfZmQgIT0gKGljb252X3QpLTEpCisgICAgeworCS8qIGFib3J0ZWQgY29udmVyc2lvbiB3aXRoIGljb252KCksIGNsb3NlIHRoZSBkZXNjcmlwdG9yICovCisJaWNvbnZfY2xvc2UoaWNvbnZfZmQpOworCWljb252X2ZkID0gKGljb252X3QpLTE7CisgICAgfQorIyBlbmRpZgorCisgICAgaWYgKGFkdmFuY2VfZmVuYykKKyAgICB7CisJLyoKKwkgKiBUcnkgdGhlIG5leHQgZW50cnkgaW4gJ2ZpbGVlbmNvZGluZ3MnLgorCSAqLworCWFkdmFuY2VfZmVuYyA9IEZBTFNFOworCisJaWYgKGVhcCAhPSBOVUxMICYmIGVhcC0+Zm9yY2VfZW5jICE9IDApCisJeworCSAgICAvKiBDb252ZXJzaW9uIGdpdmVuIHdpdGggIisrY2M9IiB3YXNuJ3QgcG9zc2libGUsIHJlYWQKKwkgICAgICogd2l0aG91dCBjb252ZXJzaW9uLiAqLworCSAgICBub3Rjb252ZXJ0ZWQgPSBUUlVFOworCSAgICBjb252X2Vycm9yID0gRkFMU0U7CisJICAgIGlmIChmZW5jX2FsbG9jZWQpCisJCXZpbV9mcmVlKGZlbmMpOworCSAgICBmZW5jID0gKGNoYXJfdSAqKSIiOworCSAgICBmZW5jX2FsbG9jZWQgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGZlbmNfYWxsb2NlZCkKKwkJdmltX2ZyZWUoZmVuYyk7CisJICAgIGlmIChmZW5jX25leHQgIT0gTlVMTCkKKwkgICAgeworCQlmZW5jID0gbmV4dF9mZW5jKCZmZW5jX25leHQpOworCQlmZW5jX2FsbG9jZWQgPSAoZmVuY19uZXh0ICE9IE5VTEwpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlmZW5jID0gKGNoYXJfdSAqKSIiOworCQlmZW5jX2FsbG9jZWQgPSBGQUxTRTsKKwkgICAgfQorCX0KKwlpZiAodG1wbmFtZSAhPSBOVUxMKQorCXsKKwkgICAgbWNoX3JlbW92ZSh0bXBuYW1lKTsJCS8qIGRlbGV0ZSBjb252ZXJ0ZWQgZmlsZSAqLworCSAgICB2aW1fZnJlZSh0bXBuYW1lKTsKKwkgICAgdG1wbmFtZSA9IE5VTEw7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogQ29udmVyc2lvbiBpcyByZXF1aXJlZCB3aGVuIHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBpcyBkaWZmZXJlbnQKKyAgICAgKiBmcm9tICdlbmNvZGluZycgb3IgJ2VuY29kaW5nJyBpcyBVVEYtMTYsIFVDUy0yIG9yIFVDUy00IChyZXF1aXJlcworICAgICAqIGNvbnZlcnNpb24gdG8gVVRGLTgpLgorICAgICAqLworICAgIGZpb19mbGFncyA9IDA7CisgICAgY29udmVydGVkID0gKCpmZW5jICE9IE5VTCAmJiAhc2FtZV9lbmNvZGluZyhwX2VuYywgZmVuYykpOworICAgIGlmIChjb252ZXJ0ZWQgfHwgZW5jX3VuaWNvZGUgIT0gMCkKKyAgICB7CisKKwkvKiAidWNzLWJvbSIgbWVhbnMgd2UgbmVlZCB0byBjaGVjayB0aGUgZmlyc3QgYnl0ZXMgb2YgdGhlIGZpbGUKKwkgKiBmb3IgYSBCT00uICovCisJaWYgKFNUUkNNUChmZW5jLCBFTkNfVUNTQk9NKSA9PSAwKQorCSAgICBmaW9fZmxhZ3MgPSBGSU9fVUNTQk9NOworCisJLyoKKwkgKiBDaGVjayBpZiBVQ1MtMi80IG9yIExhdGluMSB0byBVVEYtOCBjb252ZXJzaW9uIG5lZWRzIHRvIGJlCisJICogZG9uZS4gIFRoaXMgaXMgaGFuZGxlZCBiZWxvdyBhZnRlciByZWFkKCkuICBQcmVwYXJlIHRoZQorCSAqIGZpb19mbGFncyB0byBhdm9pZCBoYXZpbmcgdG8gcGFyc2UgdGhlIHN0cmluZyBlYWNoIHRpbWUuCisJICogQWxzbyBjaGVjayBmb3IgVW5pY29kZSB0byBMYXRpbjEgY29udmVyc2lvbiwgYmVjYXVzZSBpY29udigpCisJICogYXBwZWFycyBub3QgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5LiAgVGhpcyB3b3JrcyBqdXN0IGxpa2UKKwkgKiBjb252ZXJzaW9uIHRvIFVURi04IGV4Y2VwdCBob3cgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIgaXMgcHV0IGluCisJICogdGhlIGJ1ZmZlci4KKwkgKi8KKwllbHNlIGlmIChlbmNfdXRmOCB8fCBTVFJDTVAocF9lbmMsICJsYXRpbjEiKSA9PSAwKQorCSAgICBmaW9fZmxhZ3MgPSBnZXRfZmlvX2ZsYWdzKGZlbmMpOworCisjIGlmZGVmIFdJTjMyNjQKKwkvKgorCSAqIENvbnZlcnNpb24gZnJvbSBhbiBNUy1XaW5kb3dzIGNvZGVwYWdlIHRvIFVURi04IG9yIGFub3RoZXIgY29kZXBhZ2UKKwkgKiBpcyBoYW5kbGVkIHdpdGggTXVsdGlCeXRlVG9XaWRlQ2hhcigpLgorCSAqLworCWlmIChmaW9fZmxhZ3MgPT0gMCkKKwkgICAgZmlvX2ZsYWdzID0gZ2V0X3dpbl9maW9fZmxhZ3MoZmVuYyk7CisjIGVuZGlmCisKKyMgaWZkZWYgTUFDT1NfWAorCS8qIENvbnZlcnNpb24gZnJvbSBBcHBsZSBNYWNSb21hbiB0byBsYXRpbjEgb3IgVVRGLTggKi8KKwlpZiAoZmlvX2ZsYWdzID09IDApCisJICAgIGZpb19mbGFncyA9IGdldF9tYWNfZmlvX2ZsYWdzKGZlbmMpOworIyBlbmRpZgorCisjIGlmZGVmIFVTRV9JQ09OVgorCS8qCisJICogVHJ5IHVzaW5nIGljb252KCkgaWYgd2UgY2FuJ3QgY29udmVydCBpbnRlcm5hbGx5LgorCSAqLworCWlmIChmaW9fZmxhZ3MgPT0gMAorIyAgaWZkZWYgRkVBVF9FVkFMCisJCSYmICFkaWRfaWNvbnYKKyMgIGVuZGlmCisJCSkKKwkgICAgaWNvbnZfZmQgPSAoaWNvbnZfdClteV9pY29udl9vcGVuKAorCQkJCSAgZW5jX3V0ZjggPyAoY2hhcl91ICopInV0Zi04IiA6IHBfZW5jLCBmZW5jKTsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX0VWQUwKKwkvKgorCSAqIFVzZSB0aGUgJ2NoYXJjb252ZXJ0JyBleHByZXNzaW9uIHdoZW4gY29udmVyc2lvbiBpcyByZXF1aXJlZAorCSAqIGFuZCB3ZSBjYW4ndCBkbyBpdCBpbnRlcm5hbGx5IG9yIHdpdGggaWNvbnYoKS4KKwkgKi8KKwlpZiAoZmlvX2ZsYWdzID09IDAgJiYgIXJlYWRfc3RkaW4gJiYgIXJlYWRfYnVmZmVyICYmICpwX2NjdiAhPSBOVUwKKyMgIGlmZGVmIFVTRV9JQ09OVgorCQkJCQkJICAgICYmIGljb252X2ZkID09IChpY29udl90KS0xCisjICBlbmRpZgorCQkpCisJeworIyAgaWZkZWYgVVNFX0lDT05WCisJICAgIGRpZF9pY29udiA9IEZBTFNFOworIyAgZW5kaWYKKwkgICAgLyogU2tpcCBjb252ZXJzaW9uIHdoZW4gaXQncyBhbHJlYWR5IGRvbmUgKHJldHJ5IGZvciB3cm9uZworCSAgICAgKiAiZmlsZWZvcm1hdCIpLiAqLworCSAgICBpZiAodG1wbmFtZSA9PSBOVUxMKQorCSAgICB7CisJCXRtcG5hbWUgPSByZWFkZmlsZV9jaGFyY29udmVydChmbmFtZSwgZmVuYywgJmZkKTsKKwkJaWYgKHRtcG5hbWUgPT0gTlVMTCkKKwkJeworCQkgICAgLyogQ29udmVyc2lvbiBmYWlsZWQuICBUcnkgYW5vdGhlciBvbmUuICovCisJCSAgICBhZHZhbmNlX2ZlbmMgPSBUUlVFOworCQkgICAgaWYgKGZkIDwgMCkKKwkJICAgIHsKKwkJCS8qIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkISAqLworCQkJRU1TRyhfKCJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIpKTsKKwkJCWVycm9yID0gVFJVRTsKKwkJCWdvdG8gZmFpbGVkOworCQkgICAgfQorCQkgICAgZ290byByZXRyeTsKKwkJfQorCSAgICB9CisJfQorCWVsc2UKKyMgZW5kaWYKKwl7CisJICAgIGlmIChmaW9fZmxhZ3MgPT0gMAorIyBpZmRlZiBVU0VfSUNPTlYKKwkJICAgICYmIGljb252X2ZkID09IChpY29udl90KS0xCisjIGVuZGlmCisJICAgICAgICkKKwkgICAgeworCQkvKiBDb252ZXJzaW9uIHdhbnRlZCBidXQgd2UgY2FuJ3QuCisJCSAqIFRyeSB0aGUgbmV4dCBjb252ZXJzaW9uIGluICdmaWxlZW5jb2RpbmdzJyAqLworCQlhZHZhbmNlX2ZlbmMgPSBUUlVFOworCQlnb3RvIHJldHJ5OworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIFNldCBjYW5fcmV0cnkgd2hlbiBpdCdzIHBvc3NpYmxlIHRvIHJld2luZCB0aGUgZmlsZSBhbmQgdHJ5IHdpdGgKKyAgICAgKiBhbm90aGVyICJmZW5jIiB2YWx1ZS4gIEl0J3MgRkFMU0Ugd2hlbiBubyBvdGhlciAiZmVuYyIgdG8gdHJ5LCByZWFkaW5nCisgICAgICogc3RkaW4gb3IgImZlbmMiIHdhcyBzcGVjaWZpZWQgd2l0aCAiKytlbmM9Ii4gKi8KKyAgICBjYW5fcmV0cnkgPSAoKmZlbmMgIT0gTlVMICYmICFyZWFkX3N0ZGluCisJCQkJICAgICAmJiAoZWFwID09IE5VTEwgfHwgZWFwLT5mb3JjZV9lbmMgPT0gMCkpOworI2VuZGlmCisKKyAgICBpZiAoIXNraXBfcmVhZCkKKyAgICB7CisJbGluZXJlc3QgPSAwOworCWZpbGVzaXplID0gMDsKKwlza2lwX2NvdW50ID0gbGluZXNfdG9fc2tpcDsKKwlyZWFkX2NvdW50ID0gbGluZXNfdG9fcmVhZDsKKyNpZmRlZiBGRUFUX01CWVRFCisJY29udl9yZXN0bGVuID0gMDsKKyNlbmRpZgorICAgIH0KKworICAgIHdoaWxlICghZXJyb3IgJiYgIWdvdF9pbnQpCisgICAgeworCS8qCisJICogV2UgYWxsb2NhdGUgYXMgbXVjaCBzcGFjZSBmb3IgdGhlIGZpbGUgYXMgd2UgY2FuIGdldCwgcGx1cworCSAqIHNwYWNlIGZvciB0aGUgb2xkIGxpbmUgcGx1cyByb29tIGZvciBvbmUgdGVybWluYXRpbmcgTlVMLgorCSAqIFRoZSBhbW91bnQgaXMgbGltaXRlZCBieSB0aGUgZmFjdCB0aGF0IHJlYWQoKSBvbmx5IGNhbiByZWFkCisJICogdXB0byBtYXhfdW5zaWduZWQgY2hhcmFjdGVycyAoYW5kIG90aGVyIHRoaW5ncykuCisJICovCisjaWYgU0laRU9GX0lOVCA8PSAyCisJaWYgKGxpbmVyZXN0ID49IDB4N2ZmMCkKKwl7CisJICAgICsrc3BsaXQ7CisJICAgICpwdHIgPSBOTDsJCSAgICAvKiBzcGxpdCBsaW5lIGJ5IGluc2VydGluZyBhIE5MICovCisJICAgIHNpemUgPSAxOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGlmICghc2tpcF9yZWFkKQorCSAgICB7CisjaWYgU0laRU9GX0lOVCA+IDIKKyMgaWZkZWYgX19UQU5ERU0KKwkJc2l6ZSA9IFNTSVpFX01BWDsJCSAgICAvKiB1c2UgbWF4IEkvTyBzaXplLCA1MksgKi8KKyMgZWxzZQorCQlzaXplID0gMHgxMDAwMEw7CQkgICAgLyogdXNlIGJ1ZmZlciA+PSA2NEsgKi8KKyMgZW5kaWYKKyNlbHNlCisJCXNpemUgPSAweDdmZjBMIC0gbGluZXJlc3Q7CSAgICAvKiBsaW1pdCBidWZmZXIgdG8gMzJLICovCisjZW5kaWYKKworCQlmb3IgKCA7IHNpemUgPj0gMTA7IHNpemUgPSAobG9uZ191KXNpemUgPj4gMSkKKwkJeworCQkgICAgaWYgKChuZXdfYnVmZmVyID0gbGFsbG9jKChsb25nX3UpKHNpemUgKyBsaW5lcmVzdCArIDEpLAorCQkJCQkJCSAgICAgIEZBTFNFKSkgIT0gTlVMTCkKKwkJCWJyZWFrOworCQl9CisJCWlmIChuZXdfYnVmZmVyID09IE5VTEwpCisJCXsKKwkJICAgIGRvX291dG9mbWVtX21zZygobG9uZ191KShzaXplICogMiArIGxpbmVyZXN0ICsgMSkpOworCQkgICAgZXJyb3IgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKGxpbmVyZXN0KQkvKiBjb3B5IGNoYXJhY3RlcnMgZnJvbSB0aGUgcHJldmlvdXMgYnVmZmVyICovCisJCSAgICBtY2hfbWVtbW92ZShuZXdfYnVmZmVyLCBwdHIgLSBsaW5lcmVzdCwgKHNpemVfdClsaW5lcmVzdCk7CisJCXZpbV9mcmVlKGJ1ZmZlcik7CisJCWJ1ZmZlciA9IG5ld19idWZmZXI7CisJCXB0ciA9IGJ1ZmZlciArIGxpbmVyZXN0OworCQlsaW5lX3N0YXJ0ID0gYnVmZmVyOworCisjaWZkZWYgRkVBVF9NQllURQorCQkvKiBNYXkgbmVlZCByb29tIHRvIHRyYW5zbGF0ZSBpbnRvLgorCQkgKiBGb3IgaWNvbnYoKSB3ZSBkb24ndCByZWFsbHkga25vdyB0aGUgcmVxdWlyZWQgc3BhY2UsIHVzZSBhCisJCSAqIGZhY3RvciBJQ09OVl9NVUxULgorCQkgKiBsYXRpbjEgdG8gdXRmLTg6IDEgYnl0ZSBiZWNvbWVzIHVwIHRvIDIgYnl0ZXMKKwkJICogdXRmLTE2IHRvIHV0Zi04OiAyIGJ5dGVzIGJlY29tZSB1cCB0byAzIGJ5dGVzLCA0IGJ5dGVzCisJCSAqIGJlY29tZSB1cCB0byA0IGJ5dGVzLCBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMgorCQkgKiB1Y3MtMiB0byB1dGYtODogMiBieXRlcyBiZWNvbWUgdXAgdG8gMyBieXRlcywgc2l6ZSBtdXN0IGJlCisJCSAqIG11bHRpcGxlIG9mIDIKKwkJICogdWNzLTQgdG8gdXRmLTg6IDQgYnl0ZXMgYmVjb21lIHVwIHRvIDYgYnl0ZXMsIHNpemUgbXVzdCBiZQorCQkgKiBtdWx0aXBsZSBvZiA0ICovCisJCXJlYWxfc2l6ZSA9IHNpemU7CisjIGlmZGVmIFVTRV9JQ09OVgorCQlpZiAoaWNvbnZfZmQgIT0gKGljb252X3QpLTEpCisJCSAgICBzaXplID0gc2l6ZSAvIElDT05WX01VTFQ7CisJCWVsc2UKKyMgZW5kaWYKKwkJICAgIGlmIChmaW9fZmxhZ3MgJiBGSU9fTEFUSU4xKQorCQkgICAgc2l6ZSA9IHNpemUgLyAyOworCQllbHNlIGlmIChmaW9fZmxhZ3MgJiAoRklPX1VDUzIgfCBGSU9fVVRGMTYpKQorCQkgICAgc2l6ZSA9IChzaXplICogMiAvIDMpICYgfjE7CisJCWVsc2UgaWYgKGZpb19mbGFncyAmIEZJT19VQ1M0KQorCQkgICAgc2l6ZSA9IChzaXplICogMiAvIDMpICYgfjM7CisJCWVsc2UgaWYgKGZpb19mbGFncyA9PSBGSU9fVUNTQk9NKQorCQkgICAgc2l6ZSA9IHNpemUgLyBJQ09OVl9NVUxUOwkvKiB3b3JzdCBjYXNlICovCisjIGlmZGVmIFdJTjMyNjQKKwkJZWxzZSBpZiAoZmlvX2ZsYWdzICYgRklPX0NPREVQQUdFKQorCQkgICAgc2l6ZSA9IHNpemUgLyBJQ09OVl9NVUxUOwkvKiBhbHNvIHdvcnN0IGNhc2UgKi8KKyMgZW5kaWYKKyMgaWZkZWYgTUFDT1NfWAorCQllbHNlIGlmIChmaW9fZmxhZ3MgJiBGSU9fTUFDUk9NQU4pCisJCSAgICBzaXplID0gc2l6ZSAvIElDT05WX01VTFQ7CS8qIGFsc28gd29yc3QgY2FzZSAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChjb252X3Jlc3RsZW4gPiAwKQorCQl7CisJCSAgICAvKiBJbnNlcnQgdW5jb252ZXJ0ZWQgYnl0ZXMgZnJvbSBwcmV2aW91cyBsaW5lLiAqLworCQkgICAgbWNoX21lbW1vdmUocHRyLCBjb252X3Jlc3QsIGNvbnZfcmVzdGxlbik7CisJCSAgICBwdHIgKz0gY29udl9yZXN0bGVuOworCQkgICAgc2l6ZSAtPSBjb252X3Jlc3RsZW47CisJCX0KKyNlbmRpZgorCisJCWlmIChyZWFkX2J1ZmZlcikKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFJlYWQgYnl0ZXMgZnJvbSBjdXJidWYuICBVc2VkIGZvciBjb252ZXJ0aW5nIHRleHQgcmVhZAorCQkgICAgICogZnJvbSBzdGRpbi4KKwkJICAgICAqLworCQkgICAgaWYgKHJlYWRfYnVmX2xudW0gPiBmcm9tKQorCQkJc2l6ZSA9IDA7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpbnQJbiwgbmk7CisJCQlsb25nCXRsZW47CisKKwkJCXRsZW4gPSAwOworCQkJZm9yICg7OykKKwkJCXsKKwkJCSAgICBwID0gbWxfZ2V0KHJlYWRfYnVmX2xudW0pICsgcmVhZF9idWZfY29sOworCQkJICAgIG4gPSAoaW50KVNUUkxFTihwKTsKKwkJCSAgICBpZiAoKGludCl0bGVuICsgbiArIDEgPiBzaXplKQorCQkJICAgIHsKKwkJCQkvKiBGaWxsZWQgdXAgdG8gInNpemUiLCBhcHBlbmQgcGFydGlhbCBsaW5lLgorCQkJCSAqIENoYW5nZSBOTCB0byBOVUwgdG8gcmV2ZXJzZSB0aGUgZWZmZWN0IGRvbmUKKwkJCQkgKiBiZWxvdy4gKi8KKwkJCQluID0gc2l6ZSAtIHRsZW47CisJCQkJZm9yIChuaSA9IDA7IG5pIDwgbjsgKytuaSkKKwkJCQl7CisJCQkJICAgIGlmIChwW25pXSA9PSBOTCkKKwkJCQkJcHRyW3RsZW4rK10gPSBOVUw7CisJCQkJICAgIGVsc2UKKwkJCQkJcHRyW3RsZW4rK10gPSBwW25pXTsKKwkJCQl9CisJCQkJcmVhZF9idWZfY29sICs9IG47CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJLyogQXBwZW5kIHdob2xlIGxpbmUgYW5kIG5ldy1saW5lLiAgQ2hhbmdlIE5MCisJCQkJICogdG8gTlVMIHRvIHJldmVyc2UgdGhlIGVmZmVjdCBkb25lIGJlbG93LiAqLworCQkJCWZvciAobmkgPSAwOyBuaSA8IG47ICsrbmkpCisJCQkJeworCQkJCSAgICBpZiAocFtuaV0gPT0gTkwpCisJCQkJCXB0clt0bGVuKytdID0gTlVMOworCQkJCSAgICBlbHNlCisJCQkJCXB0clt0bGVuKytdID0gcFtuaV07CisJCQkJfQorCQkJCXB0clt0bGVuKytdID0gTkw7CisJCQkJcmVhZF9idWZfY29sID0gMDsKKwkJCQlpZiAoKytyZWFkX2J1Zl9sbnVtID4gZnJvbSkKKwkJCQl7CisJCQkJICAgIC8qIFdoZW4gdGhlIGxhc3QgbGluZSBkaWRuJ3QgaGF2ZSBhbgorCQkJCSAgICAgKiBlbmQtb2YtbGluZSBkb24ndCBhZGQgaXQgbm93IGVpdGhlci4gKi8KKwkJCQkgICAgaWYgKCFjdXJidWYtPmJfcF9lb2wpCisJCQkJCS0tdGxlbjsKKwkJCQkgICAgc2l6ZSA9IHRsZW47CisJCQkJICAgIGJyZWFrOworCQkJCX0KKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogUmVhZCBieXRlcyBmcm9tIHRoZSBmaWxlLgorCQkgICAgICovCisJCSAgICBzaXplID0gdmltX3JlYWQoZmQsIHB0ciwgc2l6ZSk7CisJCX0KKworCQlpZiAoc2l6ZSA8PSAwKQorCQl7CisJCSAgICBpZiAoc2l6ZSA8IDApCQkgICAgLyogcmVhZCBlcnJvciAqLworCQkJZXJyb3IgPSBUUlVFOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGVsc2UgaWYgKGNvbnZfcmVzdGxlbiA+IDApCisJCQkvKiBzb21lIHRyYWlsaW5nIGJ5dGVzIHVuY29udmVydGVkICovCisJCQljb252X2Vycm9yID0gVFJVRTsKKyNlbmRpZgorCQl9CisKKyNpZmRlZiBGRUFUX0NSWVBUCisJCS8qCisJCSAqIEF0IHN0YXJ0IG9mIGZpbGU6IENoZWNrIGZvciBtYWdpYyBudW1iZXIgb2YgZW5jcnlwdGlvbi4KKwkJICovCisJCWlmIChmaWxlc2l6ZSA9PSAwKQorCQkgICAgY3J5cHRrZXkgPSBjaGVja19mb3JfY3J5cHRrZXkoY3J5cHRrZXksIHB0ciwgJnNpemUsCisJCQkJCQkJICAmZmlsZXNpemUsIG5ld2ZpbGUpOworCQkvKgorCQkgKiBEZWNyeXB0IHRoZSByZWFkIGJ5dGVzLgorCQkgKi8KKwkJaWYgKGNyeXB0a2V5ICE9IE5VTEwgJiYgc2l6ZSA+IDApCisJCSAgICBmb3IgKHAgPSBwdHI7IHAgPCBwdHIgKyBzaXplOyArK3ApCisJCQlaREVDT0RFKCpwKTsKKyNlbmRpZgorCSAgICB9CisJICAgIHNraXBfcmVhZCA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAvKgorCSAgICAgKiBBdCBzdGFydCBvZiBmaWxlIChvciBhZnRlciBjcnlwdCBtYWdpYyBudW1iZXIpOiBDaGVjayBmb3IgQk9NLgorCSAgICAgKiBBbHNvIGNoZWNrIGZvciBhIEJPTSBmb3Igb3RoZXIgVW5pY29kZSBlbmNvZGluZ3MsIGJ1dCBub3QgYWZ0ZXIKKwkgICAgICogY29udmVydGluZyB3aXRoICdjaGFyY29udmVydCcgb3Igd2hlbiBhIEJPTSBoYXMgYWxyZWFkeSBiZWVuCisJICAgICAqIGZvdW5kLgorCSAgICAgKi8KKwkgICAgaWYgKChmaWxlc2l6ZSA9PSAwCisjIGlmZGVmIEZFQVRfQ1JZUFQKKwkJCXx8IChmaWxlc2l6ZSA9PSBDUllQVF9NQUdJQ19MRU4gJiYgY3J5cHRrZXkgIT0gTlVMTCkKKyMgZW5kaWYKKwkJICAgICAgICkKKwkJICAgICYmIChmaW9fZmxhZ3MgPT0gRklPX1VDU0JPTQorCQkJfHwgKCFjdXJidWYtPmJfcF9ib21iCisJCQkgICAgJiYgdG1wbmFtZSA9PSBOVUxMCisJCQkgICAgJiYgKCpmZW5jID09ICd1JyB8fCAoKmZlbmMgPT0gTlVMICYmIGVuY191dGY4KSkpKSkKKwkgICAgeworCQljaGFyX3UJKmNjbmFtZTsKKwkJaW50CWJsZW47CisKKwkJLyogbm8gQk9NIGRldGVjdGlvbiBpbiBhIHNob3J0IGZpbGUgb3IgaW4gYmluYXJ5IG1vZGUgKi8KKwkJaWYgKHNpemUgPCAyIHx8IGN1cmJ1Zi0+Yl9wX2JpbikKKwkJICAgIGNjbmFtZSA9IE5VTEw7CisJCWVsc2UKKwkJICAgIGNjbmFtZSA9IGNoZWNrX2Zvcl9ib20ocHRyLCBzaXplLCAmYmxlbiwKKwkJICAgICAgZmlvX2ZsYWdzID09IEZJT19VQ1NCT00gPyBGSU9fQUxMIDogZ2V0X2Zpb19mbGFncyhmZW5jKSk7CisJCWlmIChjY25hbWUgIT0gTlVMTCkKKwkJeworCQkgICAgLyogUmVtb3ZlIEJPTSBmcm9tIHRoZSB0ZXh0ICovCisJCSAgICBmaWxlc2l6ZSArPSBibGVuOworCQkgICAgc2l6ZSAtPSBibGVuOworCQkgICAgbWNoX21lbW1vdmUocHRyLCBwdHIgKyBibGVuLCAoc2l6ZV90KXNpemUpOworCQkgICAgaWYgKG5ld2ZpbGUpCisJCQljdXJidWYtPmJfcF9ib21iID0gVFJVRTsKKwkJfQorCisJCWlmIChmaW9fZmxhZ3MgPT0gRklPX1VDU0JPTSkKKwkJeworCQkgICAgaWYgKGNjbmFtZSA9PSBOVUxMKQorCQkgICAgeworCQkJLyogTm8gQk9NIGRldGVjdGVkOiByZXRyeSB3aXRoIG5leHQgZW5jb2RpbmcuICovCisJCQlhZHZhbmNlX2ZlbmMgPSBUUlVFOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogQk9NIGRldGVjdGVkOiBzZXQgImZlbmMiIGFuZCBqdW1wIGJhY2sgKi8KKwkJCWlmIChmZW5jX2FsbG9jZWQpCisJCQkgICAgdmltX2ZyZWUoZmVuYyk7CisJCQlmZW5jID0gY2NuYW1lOworCQkJZmVuY19hbGxvY2VkID0gRkFMU0U7CisJCSAgICB9CisJCSAgICAvKiByZXRyeSByZWFkaW5nIHdpdGhvdXQgZ2V0dGluZyBuZXcgYnl0ZXMgb3IgcmV3aW5kaW5nICovCisJCSAgICBza2lwX3JlYWQgPSBUUlVFOworCQkgICAgZ290byByZXRyeTsKKwkJfQorCSAgICB9CisjZW5kaWYKKwkgICAgLyoKKwkgICAgICogQnJlYWsgaGVyZSBmb3IgYSByZWFkIGVycm9yIG9yIGVuZC1vZi1maWxlLgorCSAgICAgKi8KKwkgICAgaWYgKHNpemUgPD0gMCkKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX01CWVRFCisKKwkgICAgLyogSW5jbHVkZSBub3QgY29udmVydGVkIGJ5dGVzLiAqLworCSAgICBwdHIgLT0gY29udl9yZXN0bGVuOworCSAgICBzaXplICs9IGNvbnZfcmVzdGxlbjsKKwkgICAgY29udl9yZXN0bGVuID0gMDsKKworIyBpZmRlZiBVU0VfSUNPTlYKKwkgICAgaWYgKGljb252X2ZkICE9IChpY29udl90KS0xKQorCSAgICB7CisJCS8qCisJCSAqIEF0dGVtcHQgY29udmVyc2lvbiBvZiB0aGUgcmVhZCBieXRlcyB0byAnZW5jb2RpbmcnIHVzaW5nCisJCSAqIGljb252KCkuCisJCSAqLworCQljb25zdCBjaGFyCSpmcm9tcDsKKwkJY2hhcgkJKnRvcDsKKwkJc2l6ZV90CQlmcm9tX3NpemU7CisJCXNpemVfdAkJdG9fc2l6ZTsKKworCQlmcm9tcCA9IChjaGFyICopcHRyOworCQlmcm9tX3NpemUgPSBzaXplOworCQlwdHIgKz0gc2l6ZTsKKwkJdG9wID0gKGNoYXIgKilwdHI7CisJCXRvX3NpemUgPSByZWFsX3NpemUgLSBzaXplOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGNvbnZlcnNpb24gZXJyb3Igb3Igbm90IGVub3VnaCByb29tIHRyeSB1c2luZworCQkgKiBhbm90aGVyIGNvbnZlcnNpb24uCisJCSAqLworCQlpZiAoKGljb252KGljb252X2ZkLCAodm9pZCAqKSZmcm9tcCwgJmZyb21fc2l6ZSwgJnRvcCwgJnRvX3NpemUpCisJCQkgICAgPT0gKHNpemVfdCktMSAmJiBJQ09OVl9FUlJOTyAhPSBJQ09OVl9FSU5WQUwpCisJCQkJCQkgIHx8IGZyb21fc2l6ZSA+IENPTlZfUkVTVExFTikKKwkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCisJCWlmIChmcm9tX3NpemUgPiAwKQorCQl7CisJCSAgICAvKiBTb21lIHJlbWFpbmluZyBjaGFyYWN0ZXJzLCBrZWVwIHRoZW0gZm9yIHRoZSBuZXh0CisJCSAgICAgKiByb3VuZC4gKi8KKwkJICAgIG1jaF9tZW1tb3ZlKGNvbnZfcmVzdCwgKGNoYXJfdSAqKWZyb21wLCBmcm9tX3NpemUpOworCQkgICAgY29udl9yZXN0bGVuID0gKGludClmcm9tX3NpemU7CisJCX0KKworCQkvKiBtb3ZlIHRoZSBsaW5lcmVzdCB0byBiZWZvcmUgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzICovCisJCWxpbmVfc3RhcnQgPSBwdHIgLSBsaW5lcmVzdDsKKwkJbWNoX21lbW1vdmUobGluZV9zdGFydCwgYnVmZmVyLCAoc2l6ZV90KWxpbmVyZXN0KTsKKwkJc2l6ZSA9IChsb25nKSgoY2hhcl91ICopdG9wIC0gcHRyKTsKKwkgICAgfQorIyBlbmRpZgorCisjIGlmZGVmIFdJTjMyNjQKKwkgICAgaWYgKGZpb19mbGFncyAmIEZJT19DT0RFUEFHRSkKKwkgICAgeworCQkvKgorCQkgKiBDb252ZXJzaW9uIGZyb20gYW4gTVMtV2luZG93cyBjb2RlcGFnZSBvciBVVEYtOCB0byBVVEYtOCBvcgorCQkgKiBhIGNvZGVwYWdlLCB1c2luZyBzdGFuZGFyZCBNUy1XaW5kb3dzIGZ1bmN0aW9ucy4KKwkJICogMS4gZmluZCBvdXQgaG93IG1hbnkgdWNzLTIgY2hhcmFjdGVycyB0aGVyZSBhcmUuCisJCSAqIDIuIGNvbnZlcnQgZnJvbSAnZmlsZWVuY29kaW5nJyB0byB1Y3MtMgorCQkgKiAzLiBjb252ZXJ0IGZyb20gdWNzLTIgdG8gJ2VuY29kaW5nJworCQkgKi8KKwkJY2hhcl91CSp1Y3NwOworCQlzaXplX3QJZnJvbV9zaXplID0gc2l6ZTsKKwkJaW50CW5lZWRlZDsKKwkJY2hhcl91CSpwOworCQlpbnQJdThjOworCisJCS8qCisJCSAqIDEuIGZpbmQgb3V0IGhvdyBtYW55IHVjcy0yIGNoYXJhY3RlcnMgdGhlcmUgYXJlLgorCQkgKi8KKyMgIGlmZGVmIENQX1VURjgJLyogVkMgNC4xIGRvZXNuJ3QgZGVmaW5lIENQX1VURjggKi8KKwkJaWYgKEZJT19HRVRfQ1AoZmlvX2ZsYWdzKSA9PSBDUF9VVEY4KQorCQl7CisJCSAgICBpbnQJCWwsIGZsZW47CisKKwkJICAgIC8qIEhhbmRsZSBDUF9VVEY4IG91cnNlbHZlcyB0byBiZSBhYmxlIHRvIGhhbmRsZSB0cmFpbGluZworCQkgICAgICogYnl0ZXMgcHJvcGVybHkuICBGaXJzdCBmaW5kIG91dCB0aGUgbnVtYmVyIG9mCisJCSAgICAgKiBjaGFyYWN0ZXJzIGFuZCBjaGVjayBmb3IgdHJhaWxpbmcgYnl0ZXMuICovCisJCSAgICBuZWVkZWQgPSAwOworCQkgICAgcCA9IHB0cjsKKwkJICAgIGZvciAoZmxlbiA9IGZyb21fc2l6ZTsgZmxlbiA+IDA7IGZsZW4gLT0gbCkKKwkJICAgIHsKKwkJCWwgPSB1dGZfcHRyMmxlbl9jaGVja19sZW4ocCwgZmxlbik7CisJCQlpZiAobCA+IGZsZW4pCQkJLyogaW5jb21wbGV0ZSBjaGFyICovCisJCQl7CisJCQkgICAgaWYgKGwgPiBDT05WX1JFU1RMRU4pCisJCQkJLyogd2VpcmQgb3ZlcmxvbmcgYnl0ZSBzZXF1ZW5jZSAqLworCQkJCWdvdG8gcmV3aW5kX3JldHJ5OworCQkJICAgIG1jaF9tZW1tb3ZlKGNvbnZfcmVzdCwgcCwgZmxlbik7CisJCQkgICAgY29udl9yZXN0bGVuID0gZmxlbjsKKwkJCSAgICBmcm9tX3NpemUgLT0gZmxlbjsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCWlmIChsID09IDEgJiYgKnAgPj0gMHg4MCkJLyogaWxsZWdhbCBieXRlICovCisJCQkgICAgZ290byByZXdpbmRfcmV0cnk7CisJCQkrK25lZWRlZDsKKwkJCXAgKz0gbDsKKwkJICAgIH0KKwkJfQorCQllbHNlCisjICBlbmRpZgorCQl7CisJCSAgICAvKiBXZSBjYW4ndCB0ZWxsIGlmIHRoZSBsYXN0IGJ5dGUgb2YgYW4gTUJDUyBzdHJpbmcgaXMKKwkJICAgICAqIHZhbGlkIGFuZCBNdWx0aUJ5dGVUb1dpZGVDaGFyKCkgcmV0dXJucyB6ZXJvIGlmIGl0CisJCSAgICAgKiBpc24ndC4gIFRyeSB0aGUgd2hvbGUgc3RyaW5nLCBhbmQgaWYgdGhhdCBmYWlscywgYnVtcAorCQkgICAgICogdGhlIGxhc3QgYnl0ZSBpbnRvIGNvbnZfcmVzdCBhbmQgdHJ5IGFnYWluLiAqLworCQkgICAgbmVlZGVkID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihGSU9fR0VUX0NQKGZpb19mbGFncyksCisJCQkJIE1CX0VSUl9JTlZBTElEX0NIQVJTLCAoTFBDU1RSKXB0ciwgZnJvbV9zaXplLAorCQkJCQkJCQkgICAgIE5VTEwsIDApOworCQkgICAgaWYgKG5lZWRlZCA9PSAwKQorCQkgICAgeworCQkJY29udl9yZXN0WzBdID0gcHRyW2Zyb21fc2l6ZSAtIDFdOworCQkJY29udl9yZXN0bGVuID0gMTsKKwkJCS0tZnJvbV9zaXplOworCQkJbmVlZGVkID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihGSU9fR0VUX0NQKGZpb19mbGFncyksCisJCQkJIE1CX0VSUl9JTlZBTElEX0NIQVJTLCAoTFBDU1RSKXB0ciwgZnJvbV9zaXplLAorCQkJCQkJCQkgICAgIE5VTEwsIDApOworCQkgICAgfQorCisJCSAgICAvKiBJZiB0aGVyZSByZWFsbHkgaXMgYSBjb252ZXJzaW9uIGVycm9yLCB0cnkgdXNpbmcgYW5vdGhlcgorCQkgICAgICogY29udmVyc2lvbi4gKi8KKwkJICAgIGlmIChuZWVkZWQgPT0gMCkKKwkJCWdvdG8gcmV3aW5kX3JldHJ5OworCQl9CisKKwkJLyoKKwkJICogMi4gY29udmVydCBmcm9tICdmaWxlZW5jb2RpbmcnIHRvIHVjcy0yCisJCSAqCisJCSAqIFB1dCB0aGUgcmVzdWx0IG9mIGNvbnZlcnNpb24gdG8gVUNTLTIgYXQgdGhlIGVuZCBvZiB0aGUKKwkJICogYnVmZmVyLCB0aGVuIGNvbnZlcnQgZnJvbSBVQ1MtMiB0byBVVEYtOCBvciAiZW5jX2NvZGVwYWdlIgorCQkgKiBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZQorCQkgKiBqdXN0IGZhaWwsIHRoZXJlIGlzIHByb2JhYmx5IHNvbWV0aGluZyB3cm9uZy4KKwkJICovCisJCXVjc3AgPSBwdHIgKyByZWFsX3NpemUgLSAobmVlZGVkICogc2l6ZW9mKFdDSEFSKSk7CisJCWlmICh1Y3NwIDwgcHRyICsgc2l6ZSkKKwkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCisjICBpZmRlZiBDUF9VVEY4CS8qIFZDIDQuMSBkb2Vzbid0IGRlZmluZSBDUF9VVEY4ICovCisJCWlmIChGSU9fR0VUX0NQKGZpb19mbGFncykgPT0gQ1BfVVRGOCkKKwkJeworCQkgICAgaW50CQlsLCBmbGVuOworCisJCSAgICAvKiBDb252ZXJ0IGZyb20gdXRmLTggdG8gdWNzLTIuICovCisJCSAgICBuZWVkZWQgPSAwOworCQkgICAgcCA9IHB0cjsKKwkJICAgIGZvciAoZmxlbiA9IGZyb21fc2l6ZTsgZmxlbiA+IDA7IGZsZW4gLT0gbCkKKwkJICAgIHsKKwkJCWwgPSB1dGZfcHRyMmxlbl9jaGVja19sZW4ocCwgZmxlbik7CisJCQl1OGMgPSB1dGZfcHRyMmNoYXIocCk7CisJCQl1Y3NwW25lZWRlZCAqIDJdID0gKHU4YyAmIDB4ZmYpOworCQkJdWNzcFtuZWVkZWQgKiAyICsgMV0gPSAodThjID4+IDgpOworCQkJKytuZWVkZWQ7CisJCQlwICs9IGw7CisJCSAgICB9CisJCX0KKwkJZWxzZQorIyAgZW5kaWYKKwkJICAgIG5lZWRlZCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoRklPX0dFVF9DUChmaW9fZmxhZ3MpLAorCQkJCQkgICAgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIChMUENTVFIpcHRyLAorCQkJCQkgICAgIGZyb21fc2l6ZSwgKExQV1NUUil1Y3NwLCBuZWVkZWQpOworCisJCS8qCisJCSAqIDMuIGNvbnZlcnQgZnJvbSB1Y3MtMiB0byAnZW5jb2RpbmcnCisJCSAqLworCQlpZiAoZW5jX3V0ZjgpCisJCXsKKwkJICAgIC8qIEZyb20gVUNTLTIgdG8gVVRGLTguICBDYW5ub3QgZmFpbC4gKi8KKwkJICAgIHAgPSBwdHI7CisJCSAgICBmb3IgKDsgbmVlZGVkID4gMDsgLS1uZWVkZWQpCisJCSAgICB7CisJCQl1OGMgPSAqdWNzcCsrOworCQkJdThjICs9ICgqdWNzcCsrIDw8IDgpOworCQkJcCArPSB1dGZfY2hhcjJieXRlcyh1OGMsIHApOworCQkgICAgfQorCQkgICAgc2l6ZSA9IHAgLSBwdHI7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBCT09MCWJhZCA9IEZBTFNFOworCisJCSAgICAvKiBGcm9tIFVDUy0yIHRvICJlbmNfY29kZXBhZ2UiLiBJZiB0aGUgY29udmVyc2lvbiB1c2VzCisJCSAgICAgKiB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgIj8iLCB0aGUgZGF0YSBkb2Vzbid0IGZpdCBpbiB0aGlzCisJCSAgICAgKiBlbmNvZGluZywgc28gZmFpbCAodW5sZXNzIGZvcmNlZCkuICovCisJCSAgICBzaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShlbmNfY29kZXBhZ2UsIDAsCisJCQkJCQkJKExQQ1dTVFIpdWNzcCwgbmVlZGVkLAorCQkJCQkgICAgKExQU1RSKXB0ciwgcmVhbF9zaXplLCAiPyIsICZiYWQpOworCQkgICAgaWYgKGJhZCAmJiAha2VlcF9kZXN0X2VuYykKKwkJCWdvdG8gcmV3aW5kX3JldHJ5OworCQl9CisJICAgIH0KKwkgICAgZWxzZQorIyBlbmRpZgorIyBpZmRlZiBNQUNPU19YCisJICAgIGlmIChmaW9fZmxhZ3MgJiBGSU9fTUFDUk9NQU4pCisJICAgIHsKKwkJLyoKKwkJICogQ29udmVyc2lvbiBmcm9tIEFwcGxlIE1hY1JvbWFuIGNoYXIgZW5jb2RpbmcgdG8gVVRGLTggb3IKKwkJICogbGF0aW4xLCB1c2luZyBzdGFuZGFyZCBDYXJib24gZnJhbWV3b3JrLgorCQkgKi8KKwkJQ0ZTdHJpbmdSZWYJY2ZzdHI7CisJCUNGUmFuZ2UJCXI7CisJCUNGSW5kZXgJCWxlbiA9IHNpemU7CisKKwkJLyogTWFjUm9tYW4gaXMgYW4gOC1iaXQgZW5jb2RpbmcsIG5vIG5lZWQgdG8gbW92ZSBieXRlcyB0bworCQkgKiBjb252X3Jlc3RbXS4gKi8KKwkJY2ZzdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyhOVUxMLCBwdHIsIGxlbiwKKwkJCQkJCWtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4sIDApOworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhIGNvbnZlcnNpb24gZXJyb3IsIHRyeSB1c2luZyBhbm90aGVyCisJCSAqIGNvbnZlcnNpb24uCisJCSAqLworCQlpZiAoY2ZzdHIgPT0gTlVMTCkKKwkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCisJCXIubG9jYXRpb24gPSAwOworCQlyLmxlbmd0aCA9IENGU3RyaW5nR2V0TGVuZ3RoKGNmc3RyKTsKKwkJaWYgKHIubGVuZ3RoICE9IENGU3RyaW5nR2V0Qnl0ZXMoY2ZzdHIsIHIsCisJCQkoZW5jX3V0ZjgpID8ga0NGU3RyaW5nRW5jb2RpbmdVVEY4CisJCQkJCQkgOiBrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwKKwkJCTAsIC8qIG5vIGxvc3N5IGNvbnZlcnNpb24gKi8KKwkJCTAsIC8qIG5vdCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiAqLworCQkJcHRyICsgc2l6ZSwgcmVhbF9zaXplIC0gc2l6ZSwgJmxlbikpCisJCXsKKwkJICAgIENGUmVsZWFzZShjZnN0cik7CisJCSAgICBnb3RvIHJld2luZF9yZXRyeTsKKwkJfQorCQlDRlJlbGVhc2UoY2ZzdHIpOworCQltY2hfbWVtbW92ZShwdHIsIHB0ciArIHNpemUsIGxlbik7CisJCXNpemUgPSBsZW47CisJICAgIH0KKwkgICAgZWxzZQorIyBlbmRpZgorCSAgICBpZiAoZmlvX2ZsYWdzICE9IDApCisJICAgIHsKKwkJaW50CXU4YzsKKwkJY2hhcl91CSpkZXN0OworCQljaGFyX3UJKnRhaWwgPSBOVUxMOworCisJCS8qCisJCSAqICJlbmNfdXRmOCIgc2V0OiBDb252ZXJ0IFVuaWNvZGUgb3IgTGF0aW4xIHRvIFVURi04LgorCQkgKiAiZW5jX3V0ZjgiIG5vdCBzZXQ6IENvbnZlcnQgVW5pY29kZSB0byBMYXRpbjEuCisJCSAqIEdvIGZyb20gZW5kIHRvIHN0YXJ0IHRocm91Z2ggdGhlIGJ1ZmZlciwgYmVjYXVzZSB0aGUgbnVtYmVyCisJCSAqIG9mIGJ5dGVzIG1heSBpbmNyZWFzZS4KKwkJICogImRlc3QiIHBvaW50cyB0byBhZnRlciB3aGVyZSB0aGUgVVRGLTggYnl0ZXMgZ28sICJwIiBwb2ludHMKKwkJICogdG8gYWZ0ZXIgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGNvbnZlcnQuCisJCSAqLworCQlkZXN0ID0gcHRyICsgcmVhbF9zaXplOworCQlpZiAoZmlvX2ZsYWdzID09IEZJT19MQVRJTjEgfHwgZmlvX2ZsYWdzID09IEZJT19VVEY4KQorCQl7CisJCSAgICBwID0gcHRyICsgc2l6ZTsKKwkJICAgIGlmIChmaW9fZmxhZ3MgPT0gRklPX1VURjgpCisJCSAgICB7CisJCQkvKiBDaGVjayBmb3IgYSB0cmFpbGluZyBpbmNvbXBsZXRlIFVURi04IHNlcXVlbmNlICovCisJCQl0YWlsID0gcHRyICsgc2l6ZSAtIDE7CisJCQl3aGlsZSAodGFpbCA+IHB0ciAmJiAoKnRhaWwgJiAweGMwKSA9PSAweDgwKQorCQkJICAgIC0tdGFpbDsKKwkJCWlmICh0YWlsICsgdXRmX2J5dGUybGVuKCp0YWlsKSA8PSBwdHIgKyBzaXplKQorCQkJICAgIHRhaWwgPSBOVUxMOworCQkJZWxzZQorCQkJICAgIHAgPSB0YWlsOworCQkgICAgfQorCQl9CisJCWVsc2UgaWYgKGZpb19mbGFncyAmIChGSU9fVUNTMiB8IEZJT19VVEYxNikpCisJCXsKKwkJICAgIC8qIENoZWNrIGZvciBhIHRyYWlsaW5nIGJ5dGUgKi8KKwkJICAgIHAgPSBwdHIgKyAoc2l6ZSAmIH4xKTsKKwkJICAgIGlmIChzaXplICYgMSkKKwkJCXRhaWwgPSBwOworCQkgICAgaWYgKChmaW9fZmxhZ3MgJiBGSU9fVVRGMTYpICYmIHAgPiBwdHIpCisJCSAgICB7CisJCQkvKiBDaGVjayBmb3IgYSB0cmFpbGluZyBsZWFkaW5nIHdvcmQgKi8KKwkJCWlmIChmaW9fZmxhZ3MgJiBGSU9fRU5ESUFOX0wpCisJCQl7CisJCQkgICAgdThjID0gKCotLXAgPDwgOCk7CisJCQkgICAgdThjICs9ICotLXA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgdThjID0gKi0tcDsKKwkJCSAgICB1OGMgKz0gKCotLXAgPDwgOCk7CisJCQl9CisJCQlpZiAodThjID49IDB4ZDgwMCAmJiB1OGMgPD0gMHhkYmZmKQorCQkJICAgIHRhaWwgPSBwOworCQkJZWxzZQorCQkJICAgIHAgKz0gMjsKKwkJICAgIH0KKwkJfQorCQllbHNlIC8qICBGSU9fVUNTNCAqLworCQl7CisJCSAgICAvKiBDaGVjayBmb3IgdHJhaWxpbmcgMSwgMiBvciAzIGJ5dGVzICovCisJCSAgICBwID0gcHRyICsgKHNpemUgJiB+Myk7CisJCSAgICBpZiAoc2l6ZSAmIDMpCisJCQl0YWlsID0gcDsKKwkJfQorCisJCS8qIElmIHRoZXJlIGlzIGEgdHJhaWxpbmcgaW5jb21wbGV0ZSBzZXF1ZW5jZSBtb3ZlIGl0IHRvCisJCSAqIGNvbnZfcmVzdFtdLiAqLworCQlpZiAodGFpbCAhPSBOVUxMKQorCQl7CisJCSAgICBjb252X3Jlc3RsZW4gPSAoaW50KSgocHRyICsgc2l6ZSkgLSB0YWlsKTsKKwkJICAgIG1jaF9tZW1tb3ZlKGNvbnZfcmVzdCwgKGNoYXJfdSAqKXRhaWwsIGNvbnZfcmVzdGxlbik7CisJCSAgICBzaXplIC09IGNvbnZfcmVzdGxlbjsKKwkJfQorCisKKwkJd2hpbGUgKHAgPiBwdHIpCisJCXsKKwkJICAgIGlmIChmaW9fZmxhZ3MgJiBGSU9fTEFUSU4xKQorCQkJdThjID0gKi0tcDsKKwkJICAgIGVsc2UgaWYgKGZpb19mbGFncyAmIChGSU9fVUNTMiB8IEZJT19VVEYxNikpCisJCSAgICB7CisJCQlpZiAoZmlvX2ZsYWdzICYgRklPX0VORElBTl9MKQorCQkJeworCQkJICAgIHU4YyA9ICgqLS1wIDw8IDgpOworCQkJICAgIHU4YyArPSAqLS1wOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIHU4YyA9ICotLXA7CisJCQkgICAgdThjICs9ICgqLS1wIDw8IDgpOworCQkJfQorCQkJaWYgKChmaW9fZmxhZ3MgJiBGSU9fVVRGMTYpCisJCQkJCSAgICAmJiB1OGMgPj0gMHhkYzAwICYmIHU4YyA8PSAweGRmZmYpCisJCQl7CisJCQkgICAgaW50IHUxNmM7CisKKwkJCSAgICBpZiAocCA9PSBwdHIpCisJCQkgICAgeworCQkJCS8qIE1pc3NpbmcgbGVhZGluZyB3b3JkLiAqLworCQkJCWlmIChjYW5fcmV0cnkpCisJCQkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCQkJCWNvbnZfZXJyb3IgPSBUUlVFOworCQkJICAgIH0KKworCQkJICAgIC8qIGZvdW5kIHNlY29uZCB3b3JkIG9mIGRvdWJsZS13b3JkLCBnZXQgdGhlIGZpcnN0CisJCQkgICAgICogd29yZCBhbmQgY29tcHV0ZSB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlciAqLworCQkJICAgIGlmIChmaW9fZmxhZ3MgJiBGSU9fRU5ESUFOX0wpCisJCQkgICAgeworCQkJCXUxNmMgPSAoKi0tcCA8PCA4KTsKKwkJCQl1MTZjICs9ICotLXA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJdTE2YyA9ICotLXA7CisJCQkJdTE2YyArPSAoKi0tcCA8PCA4KTsKKwkJCSAgICB9CisJCQkgICAgLyogQ2hlY2sgaWYgdGhlIHdvcmQgaXMgaW5kZWVkIGEgbGVhZGluZyB3b3JkLiAqLworCQkJICAgIGlmICh1MTZjIDwgMHhkODAwIHx8IHUxNmMgPiAweGRiZmYpCisJCQkgICAgeworCQkJCWlmIChjYW5fcmV0cnkpCisJCQkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCQkJCWNvbnZfZXJyb3IgPSBUUlVFOworCQkJICAgIH0KKwkJCSAgICB1OGMgPSAweDEwMDAwICsgKCh1MTZjICYgMHgzZmYpIDw8IDEwKQorCQkJCQkJCSAgICAgICsgKHU4YyAmIDB4M2ZmKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGZpb19mbGFncyAmIEZJT19VQ1M0KQorCQkgICAgeworCQkJaWYgKGZpb19mbGFncyAmIEZJT19FTkRJQU5fTCkKKwkJCXsKKwkJCSAgICB1OGMgPSAoKi0tcCA8PCAyNCk7CisJCQkgICAgdThjICs9ICgqLS1wIDw8IDE2KTsKKwkJCSAgICB1OGMgKz0gKCotLXAgPDwgOCk7CisJCQkgICAgdThjICs9ICotLXA7CisJCQl9CisJCQllbHNlCS8qIGJpZyBlbmRpYW4gKi8KKwkJCXsKKwkJCSAgICB1OGMgPSAqLS1wOworCQkJICAgIHU4YyArPSAoKi0tcCA8PCA4KTsKKwkJCSAgICB1OGMgKz0gKCotLXAgPDwgMTYpOworCQkJICAgIHU4YyArPSAoKi0tcCA8PCAyNCk7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlICAgIC8qIFVURi04ICovCisJCSAgICB7CisJCQlpZiAoKi0tcCA8IDB4ODApCisJCQkgICAgdThjID0gKnA7CisJCQllbHNlCisJCQl7CisJCQkgICAgbGVuID0gdXRmX2hlYWRfb2ZmKHB0ciwgcCk7CisJCQkgICAgaWYgKGxlbiA9PSAwKQorCQkJICAgIHsKKwkJCQkvKiBOb3QgYSB2YWxpZCBVVEYtOCBjaGFyYWN0ZXIsIHJldHJ5IHdpdGgKKwkJCQkgKiBhbm90aGVyIGZlbmMgd2hlbiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGp1c3QKKwkJCQkgKiByZXBvcnQgdGhlIGVycm9yLiAqLworCQkJCWlmIChjYW5fcmV0cnkpCisJCQkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OworCQkJCWNvbnZfZXJyb3IgPSBUUlVFOworCQkJICAgIH0KKwkJCSAgICBwIC09IGxlbjsKKwkJCSAgICB1OGMgPSB1dGZfcHRyMmNoYXIocCk7CisJCQl9CisJCSAgICB9CisJCSAgICBpZiAoZW5jX3V0ZjgpCS8qIHByb2R1Y2UgVVRGLTggKi8KKwkJICAgIHsKKwkJCWRlc3QgLT0gdXRmX2NoYXIybGVuKHU4Yyk7CisJCQkodm9pZCl1dGZfY2hhcjJieXRlcyh1OGMsIGRlc3QpOworCQkgICAgfQorCQkgICAgZWxzZQkJLyogcHJvZHVjZSBMYXRpbjEgKi8KKwkJICAgIHsKKwkJCS0tZGVzdDsKKwkJCWlmICh1OGMgPj0gMHgxMDApCisJCQl7CisJCQkgICAgLyogY2hhcmFjdGVyIGRvZXNuJ3QgZml0IGluIGxhdGluMSwgcmV0cnkgd2l0aAorCQkJICAgICAqIGFub3RoZXIgZmVuYyB3aGVuIHBvc3NpYmxlLCBvdGhlcndpc2UganVzdAorCQkJICAgICAqIHJlcG9ydCB0aGUgZXJyb3IuICovCisJCQkgICAgaWYgKGNhbl9yZXRyeSAmJiAha2VlcF9kZXN0X2VuYykKKwkJCQlnb3RvIHJld2luZF9yZXRyeTsKKwkJCSAgICAqZGVzdCA9IDB4QkY7CisJCQkgICAgY29udl9lcnJvciA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQkgICAgKmRlc3QgPSB1OGM7CisJCSAgICB9CisJCX0KKworCQkvKiBtb3ZlIHRoZSBsaW5lcmVzdCB0byBiZWZvcmUgdGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXJzICovCisJCWxpbmVfc3RhcnQgPSBkZXN0IC0gbGluZXJlc3Q7CisJCW1jaF9tZW1tb3ZlKGxpbmVfc3RhcnQsIGJ1ZmZlciwgKHNpemVfdClsaW5lcmVzdCk7CisJCXNpemUgPSAobG9uZykoKHB0ciArIHJlYWxfc2l6ZSkgLSBkZXN0KTsKKwkJcHRyID0gZGVzdDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChlbmNfdXRmOCAmJiAhY29udl9lcnJvciAmJiAhY3VyYnVmLT5iX3BfYmluKQorCSAgICB7CisJCS8qIFJlYWRpbmcgVVRGLTg6IENoZWNrIGlmIHRoZSBieXRlcyBhcmUgdmFsaWQgVVRGLTguCisJCSAqIE5lZWQgdG8gc3RhcnQgYmVmb3JlICJwdHIiIHdoZW4gcGFydCBvZiB0aGUgY2hhcmFjdGVyIHdhcworCQkgKiByZWFkIGluIHRoZSBwcmV2aW91cyByZWFkKCkgY2FsbC4gKi8KKwkJZm9yIChwID0gcHRyIC0gdXRmX2hlYWRfb2ZmKGJ1ZmZlciwgcHRyKTsgcCA8IHB0ciArIHNpemU7ICsrcCkKKwkJeworCQkgICAgaWYgKCpwID49IDB4ODApCisJCSAgICB7CisJCQlsZW4gPSB1dGZfcHRyMmxlbl9jaGVjayhwKTsKKwkJCS8qIEEgbGVuZ3RoIG9mIDEgbWVhbnMgaXQncyBhbiBpbGxlZ2FsIGJ5dGUuICBBY2NlcHQKKwkJCSAqIGFuIGluY29tcGxldGUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgdGhvdWdoLCB0aGUgbmV4dAorCQkJICogcmVhZCgpIHdpbGwgZ2V0IHRoZSBuZXh0IGJ5dGVzLCB3ZSdsbCBjaGVjayBpdAorCQkJICogdGhlbi4gKi8KKwkJCWlmIChsZW4gPT0gMSkKKwkJCXsKKwkJCSAgICBwICs9IHV0Zl9ieXRlMmxlbigqcCkgLSAxOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJcCArPSBsZW4gLSAxOworCQkgICAgfQorCQl9CisJCWlmIChwIDwgcHRyICsgc2l6ZSkKKwkJeworCQkgICAgLyogRGV0ZWN0ZWQgYSBVVEYtOCBlcnJvci4gKi8KKwkJICAgIGlmIChjYW5fcmV0cnkpCisJCSAgICB7CityZXdpbmRfcmV0cnk6CisJCQkvKiBSZXRyeSByZWFkaW5nIHdpdGggYW5vdGhlciBjb252ZXJzaW9uLiAqLworIyBpZiBkZWZpbmVkKEZFQVRfRVZBTCkgJiYgZGVmaW5lZChVU0VfSUNPTlYpCisJCQlpZiAoKnBfY2N2ICE9IE5VTCAmJiBpY29udl9mZCAhPSAoaWNvbnZfdCktMSkKKwkJCSAgICAvKiBpY29udigpIGZhaWxlZCwgdHJ5ICdjaGFyY29udmVydCcgKi8KKwkJCSAgICBkaWRfaWNvbnYgPSBUUlVFOworCQkJZWxzZQorIyBlbmRpZgorCQkJICAgIC8qIHVzZSBuZXh0IGl0ZW0gZnJvbSAnZmlsZWVuY29kaW5ncycgKi8KKwkJCSAgICBhZHZhbmNlX2ZlbmMgPSBUUlVFOworCQkJZmlsZV9yZXdpbmQgPSBUUlVFOworCQkJZ290byByZXRyeTsKKwkJICAgIH0KKworCQkgICAgLyogVGhlcmUgaXMgbm8gYWx0ZXJuYXRpdmUgZmVuYywganVzdCByZXBvcnQgdGhlIGVycm9yLiAqLworIyBpZmRlZiBVU0VfSUNPTlYKKwkJICAgIGlmIChpY29udl9mZCAhPSAoaWNvbnZfdCktMSkKKwkJCWNvbnZfZXJyb3IgPSBUUlVFOworCQkgICAgZWxzZQorIyBlbmRpZgorCQkgICAgeworCQkJY2hhcl91CQkqczsKKworCQkJLyogRXN0aW1hdGUgdGhlIGxpbmUgbnVtYmVyLiAqLworCQkJaWxsZWdhbF9ieXRlID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLSBsaW5lY250ICsgMTsKKwkJCWZvciAocyA9IHB0cjsgcyA8IHA7ICsrcykKKwkJCSAgICBpZiAoKnMgPT0gJ1xuJykKKwkJCQkrK2lsbGVnYWxfYnl0ZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYKKworCSAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGFmdGVyIGNvbnZlcnNpb24hKSAqLworCSAgICBmaWxlc2l6ZSArPSBzaXplOworCisJICAgIC8qCisJICAgICAqIHdoZW4gcmVhZGluZyB0aGUgZmlyc3QgcGFydCBvZiBhIGZpbGU6IGd1ZXNzIEVPTCB0eXBlCisJICAgICAqLworCSAgICBpZiAoZmlsZWZvcm1hdCA9PSBFT0xfVU5LTk9XTikKKwkgICAgeworCQkvKiBGaXJzdCB0cnkgZmluZGluZyBhIE5MLCBmb3IgRG9zIGFuZCBVbml4ICovCisJCWlmICh0cnlfZG9zIHx8IHRyeV91bml4KQorCQl7CisJCSAgICBmb3IgKHAgPSBwdHI7IHAgPCBwdHIgKyBzaXplOyArK3ApCisJCSAgICB7CisJCQlpZiAoKnAgPT0gTkwpCisJCQl7CisJCQkgICAgaWYgKCF0cnlfdW5peAorCQkJCSAgICB8fCAodHJ5X2RvcyAmJiBwID4gcHRyICYmIHBbLTFdID09IENBUikpCisJCQkJZmlsZWZvcm1hdCA9IEVPTF9ET1M7CisJCQkgICAgZWxzZQorCQkJCWZpbGVmb3JtYXQgPSBFT0xfVU5JWDsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgLyogRG9uJ3QgZ2l2ZSBpbiB0byBFT0xfVU5JWCBpZiBFT0xfTUFDIGlzIG1vcmUgbGlrZWx5ICovCisJCSAgICBpZiAoZmlsZWZvcm1hdCA9PSBFT0xfVU5JWCAmJiB0cnlfbWFjKQorCQkgICAgeworCQkJLyogTmVlZCB0byByZXNldCB0aGUgY291bnRlcnMgd2hlbiByZXRyeWluZyBmZW5jLiAqLworCQkJdHJ5X21hYyA9IDE7CisJCQl0cnlfdW5peCA9IDE7CisJCQlmb3IgKDsgcCA+PSBwdHIgJiYgKnAgIT0gQ0FSOyBwLS0pCisJCQkgICAgOworCQkJaWYgKHAgPj0gcHRyKQorCQkJeworCQkJICAgIGZvciAocCA9IHB0cjsgcCA8IHB0ciArIHNpemU7ICsrcCkKKwkJCSAgICB7CisJCQkJaWYgKCpwID09IE5MKQorCQkJCSAgICB0cnlfdW5peCsrOworCQkJCWVsc2UgaWYgKCpwID09IENBUikKKwkJCQkgICAgdHJ5X21hYysrOworCQkJICAgIH0KKwkJCSAgICBpZiAodHJ5X21hYyA+IHRyeV91bml4KQorCQkJCWZpbGVmb3JtYXQgPSBFT0xfTUFDOworCQkJfQorCQkgICAgfQorCQl9CisKKwkJLyogTm8gTkwgZm91bmQ6IG1heSB1c2UgTWFjIGZvcm1hdCAqLworCQlpZiAoZmlsZWZvcm1hdCA9PSBFT0xfVU5LTk9XTiAmJiB0cnlfbWFjKQorCQkgICAgZmlsZWZvcm1hdCA9IEVPTF9NQUM7CisKKwkJLyogU3RpbGwgbm90aGluZyBmb3VuZD8gIFVzZSBmaXJzdCBmb3JtYXQgaW4gJ2ZmcycgKi8KKwkJaWYgKGZpbGVmb3JtYXQgPT0gRU9MX1VOS05PV04pCisJCSAgICBmaWxlZm9ybWF0ID0gZGVmYXVsdF9maWxlZm9ybWF0KCk7CisKKwkJLyogaWYgZWRpdGluZyBhIG5ldyBmaWxlOiBtYXkgc2V0IHBfdHggYW5kIHBfZmYgKi8KKwkJaWYgKG5ld2ZpbGUpCisJCSAgICBzZXRfZmlsZWZvcm1hdChmaWxlZm9ybWF0LCBPUFRfTE9DQUwpOworCSAgICB9CisJfQorCisJLyoKKwkgKiBUaGlzIGxvb3AgaXMgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgY2hhcmFjdGVyIHJlYWQuCisJICogS2VlcCBpdCBmYXN0IQorCSAqLworCWlmIChmaWxlZm9ybWF0ID09IEVPTF9NQUMpCisJeworCSAgICAtLXB0cjsKKwkgICAgd2hpbGUgKCsrcHRyLCAtLXNpemUgPj0gMCkKKwkgICAgeworCQkvKiBjYXRjaCBtb3N0IGNvbW1vbiBjYXNlIGZpcnN0ICovCisJCWlmICgoYyA9ICpwdHIpICE9IE5VTCAmJiBjICE9IENBUiAmJiBjICE9IE5MKQorCQkgICAgY29udGludWU7CisJCWlmIChjID09IE5VTCkKKwkJICAgICpwdHIgPSBOTDsJLyogTlVMcyBhcmUgcmVwbGFjZWQgYnkgbmV3bGluZXMhICovCisJCWVsc2UgaWYgKGMgPT0gTkwpCisJCSAgICAqcHRyID0gQ0FSOwkvKiBOTHMgYXJlIHJlcGxhY2VkIGJ5IENScyEgKi8KKwkJZWxzZQorCQl7CisJCSAgICBpZiAoc2tpcF9jb3VudCA9PSAwKQorCQkgICAgeworCQkJKnB0ciA9IE5VTDsJICAgIC8qIGVuZCBvZiBsaW5lICovCisJCQlsZW4gPSAoY29sbnJfVCkgKHB0ciAtIGxpbmVfc3RhcnQgKyAxKTsKKwkJCWlmIChtbF9hcHBlbmQobG51bSwgbGluZV9zdGFydCwgbGVuLCBuZXdmaWxlKSA9PSBGQUlMKQorCQkJeworCQkJICAgIGVycm9yID0gVFJVRTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCSsrbG51bTsKKwkJCWlmICgtLXJlYWRfY291bnQgPT0gMCkKKwkJCXsKKwkJCSAgICBlcnJvciA9IFRSVUU7CS8qIGJyZWFrIGxvb3AgKi8KKwkJCSAgICBsaW5lX3N0YXJ0ID0gcHRyOwkvKiBub3RoaW5nIGxlZnQgdG8gd3JpdGUgKi8KKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCS0tc2tpcF9jb3VudDsKKwkJICAgIGxpbmVfc3RhcnQgPSBwdHIgKyAxOworCQl9CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLS1wdHI7CisJICAgIHdoaWxlICgrK3B0ciwgLS1zaXplID49IDApCisJICAgIHsKKwkJaWYgKChjID0gKnB0cikgIT0gTlVMICYmIGMgIT0gTkwpICAvKiBjYXRjaCBtb3N0IGNvbW1vbiBjYXNlICovCisJCSAgICBjb250aW51ZTsKKwkJaWYgKGMgPT0gTlVMKQorCQkgICAgKnB0ciA9IE5MOwkvKiBOVUxzIGFyZSByZXBsYWNlZCBieSBuZXdsaW5lcyEgKi8KKwkJZWxzZQorCQl7CisJCSAgICBpZiAoc2tpcF9jb3VudCA9PSAwKQorCQkgICAgeworCQkJKnB0ciA9IE5VTDsJCS8qIGVuZCBvZiBsaW5lICovCisJCQlsZW4gPSAoY29sbnJfVCkocHRyIC0gbGluZV9zdGFydCArIDEpOworCQkJaWYgKGZpbGVmb3JtYXQgPT0gRU9MX0RPUykKKwkJCXsKKwkJCSAgICBpZiAocHRyWy0xXSA9PSBDQVIpCS8qIHJlbW92ZSBDUiAqLworCQkJICAgIHsKKwkJCQlwdHJbLTFdID0gTlVMOworCQkJCS0tbGVuOworCQkJICAgIH0KKwkJCSAgICAvKgorCQkJICAgICAqIFJlYWRpbmcgaW4gRG9zIGZvcm1hdCwgYnV0IG5vIENSLUxGIGZvdW5kIQorCQkJICAgICAqIFdoZW4gJ2ZpbGVmb3JtYXRzJyBpbmNsdWRlcyAidW5peCIsIGRlbGV0ZSBhbGwKKwkJCSAgICAgKiB0aGUgbGluZXMgcmVhZCBzbyBmYXIgYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgorCQkJICAgICAqIE90aGVyd2lzZSBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgbGF0ZXIuCisJCQkgICAgICovCisJCQkgICAgZWxzZSBpZiAoZmZfZXJyb3IgIT0gRU9MX0RPUykKKwkJCSAgICB7CisJCQkJaWYgKCAgIHRyeV91bml4CisJCQkJICAgICYmICFyZWFkX3N0ZGluCisJCQkJICAgICYmIChyZWFkX2J1ZmZlcgorCQkJCQl8fCBsc2VlayhmZCwgKG9mZl90KTBMLCBTRUVLX1NFVCkgPT0gMCkpCisJCQkJeworCQkJCSAgICBmaWxlZm9ybWF0ID0gRU9MX1VOSVg7CisJCQkJICAgIGlmIChuZXdmaWxlKQorCQkJCQlzZXRfZmlsZWZvcm1hdChFT0xfVU5JWCwgT1BUX0xPQ0FMKTsKKwkJCQkgICAgZmlsZV9yZXdpbmQgPSBUUlVFOworCQkJCSAgICBrZWVwX2ZpbGVmb3JtYXQgPSBUUlVFOworCQkJCSAgICBnb3RvIHJldHJ5OworCQkJCX0KKwkJCQlmZl9lcnJvciA9IEVPTF9ET1M7CisJCQkgICAgfQorCQkJfQorCQkJaWYgKG1sX2FwcGVuZChsbnVtLCBsaW5lX3N0YXJ0LCBsZW4sIG5ld2ZpbGUpID09IEZBSUwpCisJCQl7CisJCQkgICAgZXJyb3IgPSBUUlVFOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJKytsbnVtOworCQkJaWYgKC0tcmVhZF9jb3VudCA9PSAwKQorCQkJeworCQkJICAgIGVycm9yID0gVFJVRTsJICAgIC8qIGJyZWFrIGxvb3AgKi8KKwkJCSAgICBsaW5lX3N0YXJ0ID0gcHRyOwkvKiBub3RoaW5nIGxlZnQgdG8gd3JpdGUgKi8KKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCS0tc2tpcF9jb3VudDsKKwkJICAgIGxpbmVfc3RhcnQgPSBwdHIgKyAxOworCQl9CisJICAgIH0KKwl9CisJbGluZXJlc3QgPSAobG9uZykocHRyIC0gbGluZV9zdGFydCk7CisJdWlfYnJlYWtjaGVjaygpOworICAgIH0KKworZmFpbGVkOgorICAgIC8qIG5vdCBhbiBlcnJvciwgbWF4LiBudW1iZXIgb2YgbGluZXMgcmVhY2hlZCAqLworICAgIGlmIChlcnJvciAmJiByZWFkX2NvdW50ID09IDApCisJZXJyb3IgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogSWYgd2UgZ2V0IEVPRiBpbiB0aGUgbWlkZGxlIG9mIGEgbGluZSwgbm90ZSB0aGUgZmFjdCBhbmQKKyAgICAgKiBjb21wbGV0ZSB0aGUgbGluZSBvdXJzZWx2ZXMuCisgICAgICogSW4gRG9zIGZvcm1hdCBpZ25vcmUgYSB0cmFpbGluZyBDVFJMLVosIHVubGVzcyAnYmluYXJ5JyBzZXQuCisgICAgICovCisgICAgaWYgKCFlcnJvcgorCSAgICAmJiAhZ290X2ludAorCSAgICAmJiBsaW5lcmVzdCAhPSAwCisJICAgICYmICEoIWN1cmJ1Zi0+Yl9wX2JpbgorCQkmJiBmaWxlZm9ybWF0ID09IEVPTF9ET1MKKwkJJiYgKmxpbmVfc3RhcnQgPT0gQ3RybF9aCisJCSYmIHB0ciA9PSBsaW5lX3N0YXJ0ICsgMSkpCisgICAgeworCWlmIChuZXdmaWxlKQkJCS8qIHJlbWVtYmVyIGZvciB3aGVuIHdyaXRpbmcgKi8KKwkgICAgY3VyYnVmLT5iX3BfZW9sID0gRkFMU0U7CisJKnB0ciA9IE5VTDsKKwlpZiAobWxfYXBwZW5kKGxudW0sIGxpbmVfc3RhcnQsCisJCQkoY29sbnJfVCkocHRyIC0gbGluZV9zdGFydCArIDEpLCBuZXdmaWxlKSA9PSBGQUlMKQorCSAgICBlcnJvciA9IFRSVUU7CisJZWxzZQorCSAgICByZWFkX25vX2VvbF9sbnVtID0gKytsbnVtOworICAgIH0KKworICAgIGlmIChuZXdmaWxlKQorCXNhdmVfZmlsZV9mZihjdXJidWYpOwkJLyogcmVtZW1iZXIgdGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgKi8KKworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBpZiAoY3J5cHRrZXkgIT0gY3VyYnVmLT5iX3Bfa2V5KQorCXZpbV9mcmVlKGNyeXB0a2V5KTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIElmIGVkaXRpbmcgYSBuZXcgZmlsZTogc2V0ICdmZW5jJyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLiAqLworICAgIGlmIChuZXdmaWxlKQorCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImZlbmMiLCAtMSwgZmVuYywKKwkJCQkJCQkgIE9QVF9GUkVFfE9QVF9MT0NBTCk7CisgICAgaWYgKGZlbmNfYWxsb2NlZCkKKwl2aW1fZnJlZShmZW5jKTsKKyMgaWZkZWYgVVNFX0lDT05WCisgICAgaWYgKGljb252X2ZkICE9IChpY29udl90KS0xKQorICAgIHsKKwlpY29udl9jbG9zZShpY29udl9mZCk7CisJaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsKKyAgICB9CisjIGVuZGlmCisjZW5kaWYKKworICAgIGlmICghcmVhZF9idWZmZXIgJiYgIXJlYWRfc3RkaW4pCisJY2xvc2UoZmQpOwkJCQkvKiBlcnJvcnMgYXJlIGlnbm9yZWQgKi8KKyAgICB2aW1fZnJlZShidWZmZXIpOworCisjaWZkZWYgSEFWRV9EVVAKKyAgICBpZiAocmVhZF9zdGRpbikKKyAgICB7CisJLyogVXNlIHN0ZGVyciBmb3Igc3RkaW4sIG1ha2VzIHNoZWxsIGNvbW1hbmRzIHdvcmsuICovCisJY2xvc2UoMCk7CisJZHVwKDIpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmICh0bXBuYW1lICE9IE5VTEwpCisgICAgeworCW1jaF9yZW1vdmUodG1wbmFtZSk7CQkvKiBkZWxldGUgY29udmVydGVkIGZpbGUgKi8KKwl2aW1fZnJlZSh0bXBuYW1lKTsKKyAgICB9CisjZW5kaWYKKyAgICAtLW5vX3dhaXRfcmV0dXJuOwkJCS8qIG1heSB3YWl0IGZvciByZXR1cm4gbm93ICovCisKKyAgICAvKgorICAgICAqIEluIHJlY292ZXJ5IG1vZGUgZXZlcnl0aGluZyBidXQgYXV0b2NvbW1hbmRzIGlzIHNraXBwZWQuCisgICAgICovCisgICAgaWYgKCFyZWNvdmVyeW1vZGUpCisgICAgeworCS8qIG5lZWQgdG8gZGVsZXRlIHRoZSBsYXN0IGxpbmUsIHdoaWNoIGNvbWVzIGZyb20gdGhlIGVtcHR5IGJ1ZmZlciAqLworCWlmIChuZXdmaWxlICYmIHdhc2VtcHR5ICYmICEoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpKQorCXsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkgICAgbmV0YmVhbnNGaXJlQ2hhbmdlcyA9IDA7CisjZW5kaWYKKwkgICAgbWxfZGVsZXRlKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LCBGQUxTRSk7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJICAgIG5ldGJlYW5zRmlyZUNoYW5nZXMgPSAxOworI2VuZGlmCisJICAgIC0tbGluZWNudDsKKwl9CisJbGluZWNudCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gbGluZWNudDsKKwlpZiAoZmlsZXNpemUgPT0gMCkKKwkgICAgbGluZWNudCA9IDA7CisJaWYgKG5ld2ZpbGUgfHwgcmVhZF9idWZmZXIpCisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoTk9UX1ZBTElEKTsKKwllbHNlIGlmIChsaW5lY250KQkJLyogYXBwZW5kZWQgYXQgbGVhc3Qgb25lIGxpbmUgKi8KKwkgICAgYXBwZW5kZWRfbGluZXNfbWFyayhmcm9tLCBsaW5lY250KTsKKworI2lmZGVmIEZFQVRfRElGRgorCS8qIEFmdGVyIHJlYWRpbmcgdGhlIHRleHQgaW50byB0aGUgYnVmZmVyIHRoZSBkaWZmIGluZm8gbmVlZHMgdG8gYmUKKwkgKiB1cGRhdGVkLiAqLworCWlmICgobmV3ZmlsZSB8fCByZWFkX2J1ZmZlcikpCisJICAgIGRpZmZfaW52YWxpZGF0ZSgpOworI2VuZGlmCisjaWZuZGVmIEFMV0FZU19VU0VfR1VJCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgZnJvbSB0aGUgc2FtZSB0ZXJtaW5hbCBhcyB3aGVyZSBtZXNzYWdlcyBnbywKKwkgKiB0aGUgc2NyZWVuIHdpbGwgaGF2ZSBiZWVuIG1lc3NlZCB1cC4KKwkgKiBTd2l0Y2ggb24gcmF3IG1vZGUgbm93IGFuZCBjbGVhciB0aGUgc2NyZWVuLgorCSAqLworCWlmIChyZWFkX3N0ZGluKQorCXsKKwkgICAgc2V0dG1vZGUoVE1PREVfUkFXKTsJLyogc2V0IHRvIHJhdyBtb2RlICovCisJICAgIHN0YXJ0dGVybWNhcCgpOworCSAgICBzY3JlZW5jbGVhcigpOworCX0KKyNlbmRpZgorCisJaWYgKGdvdF9pbnQpCisJeworCSAgICBpZiAoIShmbGFncyAmIFJFQURfRFVNTVkpKQorCSAgICB7CisJCWZpbGVtZXNzKGN1cmJ1Ziwgc2ZuYW1lLCAoY2hhcl91ICopXyhlX2ludGVyciksIDApOworCQlpZiAobmV3ZmlsZSkKKwkJICAgIGN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsJLyogbXVzdCB1c2UgInchIiBub3cgKi8KKwkgICAgfQorCSAgICBtc2dfc2Nyb2xsID0gbXNnX3NhdmU7CisjaWZkZWYgRkVBVF9WSU1JTkZPCisJICAgIGNoZWNrX21hcmtzX3JlYWQoKTsKKyNlbmRpZgorCSAgICByZXR1cm4gT0s7CQkvKiBhbiBpbnRlcnJ1cHQgaXNuJ3QgcmVhbGx5IGFuIGVycm9yICovCisJfQorCisJaWYgKCFmaWx0ZXJpbmcgJiYgIShmbGFncyAmIFJFQURfRFVNTVkpKQorCXsKKwkgICAgbXNnX2FkZF9mbmFtZShjdXJidWYsIHNmbmFtZSk7ICAgLyogZm5hbWUgaW4gSU9idWZmIHdpdGggcXVvdGVzICovCisJICAgIGMgPSBGQUxTRTsKKworI2lmZGVmIFVOSVgKKyMgaWZkZWYgU19JU0ZJRk8KKwkgICAgaWYgKFNfSVNGSUZPKHBlcm0pKQkJCSAgICAvKiBmaWZvIG9yIHNvY2tldCAqLworCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltmaWZvL3NvY2tldF0iKSk7CisJCWMgPSBUUlVFOworCSAgICB9CisjIGVsc2UKKyMgIGlmZGVmIFNfSUZJRk8KKwkgICAgaWYgKChwZXJtICYgU19JRk1UKSA9PSBTX0lGSUZPKQkgICAgLyogZmlmbyAqLworCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltmaWZvXSIpKTsKKwkJYyA9IFRSVUU7CisJICAgIH0KKyMgIGVuZGlmCisjICBpZmRlZiBTX0lGU09DSworCSAgICBpZiAoKHBlcm0gJiBTX0lGTVQpID09IFNfSUZTT0NLKQkgICAgLyogb3Igc29ja2V0ICovCisJICAgIHsKKwkJU1RSQ0FUKElPYnVmZiwgXygiW3NvY2tldF0iKSk7CisJCWMgPSBUUlVFOworCSAgICB9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisJICAgIGlmIChjdXJidWYtPmJfcF9ybykKKwkgICAgeworCQlTVFJDQVQoSU9idWZmLCBzaG9ydG1lc3MoU0hNX1JPKSA/IF8oIltST10iKSA6IF8oIltyZWFkb25seV0iKSk7CisJCWMgPSBUUlVFOworCSAgICB9CisJICAgIGlmIChyZWFkX25vX2VvbF9sbnVtKQorCSAgICB7CisJCW1zZ19hZGRfZW9sKCk7CisJCWMgPSBUUlVFOworCSAgICB9CisJICAgIGlmIChmZl9lcnJvciA9PSBFT0xfRE9TKQorCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltDUiBtaXNzaW5nXSIpKTsKKwkJYyA9IFRSVUU7CisJICAgIH0KKwkgICAgaWYgKGZmX2Vycm9yID09IEVPTF9NQUMpCisJICAgIHsKKwkJU1RSQ0FUKElPYnVmZiwgXygiW05MIGZvdW5kXSIpKTsKKwkJYyA9IFRSVUU7CisJICAgIH0KKwkgICAgaWYgKHNwbGl0KQorCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltsb25nIGxpbmVzIHNwbGl0XSIpKTsKKwkJYyA9IFRSVUU7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChub3Rjb252ZXJ0ZWQpCisJICAgIHsKKwkJU1RSQ0FUKElPYnVmZiwgXygiW05PVCBjb252ZXJ0ZWRdIikpOworCQljID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChjb252ZXJ0ZWQpCisJICAgIHsKKwkJU1RSQ0FUKElPYnVmZiwgXygiW2NvbnZlcnRlZF0iKSk7CisJCWMgPSBUUlVFOworCSAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NSWVBUCisJICAgIGlmIChjcnlwdGtleSAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltjcnlwdGVkXSIpKTsKKwkJYyA9IFRSVUU7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGNvbnZfZXJyb3IpCisJICAgIHsKKwkJU1RSQ0FUKElPYnVmZiwgXygiW0NPTlZFUlNJT04gRVJST1JdIikpOworCQljID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpbGxlZ2FsX2J5dGUgPiAwKQorCSAgICB7CisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYgKyBTVFJMRU4oSU9idWZmKSwKKwkJCSBfKCJbSUxMRUdBTCBCWVRFIGluIGxpbmUgJWxkXSIpLCAobG9uZylpbGxlZ2FsX2J5dGUpOworCQljID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJaWYgKGVycm9yKQorCSAgICB7CisJCVNUUkNBVChJT2J1ZmYsIF8oIltSRUFEIEVSUk9SU10iKSk7CisJCWMgPSBUUlVFOworCSAgICB9CisJICAgIGlmIChtc2dfYWRkX2ZpbGVmb3JtYXQoZmlsZWZvcm1hdCkpCisJCWMgPSBUUlVFOworI2lmZGVmIEZFQVRfQ1JZUFQKKwkgICAgaWYgKGNyeXB0a2V5ICE9IE5VTEwpCisJCW1zZ19hZGRfbGluZXMoYywgKGxvbmcpbGluZWNudCwgZmlsZXNpemUgLSBDUllQVF9NQUdJQ19MRU4pOworCSAgICBlbHNlCisjZW5kaWYKKwkJbXNnX2FkZF9saW5lcyhjLCAobG9uZylsaW5lY250LCBmaWxlc2l6ZSk7CisKKwkgICAgdmltX2ZyZWUoa2VlcF9tc2cpOworCSAgICBrZWVwX21zZyA9IE5VTEw7CisJICAgIG1zZ19zY3JvbGxlZF9pZ24gPSBUUlVFOworI2lmZGVmIEFMV0FZU19VU0VfR1VJCisJICAgIC8qIERvbid0IHNob3cgdGhlIG1lc3NhZ2Ugd2hlbiByZWFkaW5nIHN0ZGluLCBpdCB3b3VsZCBlbmQgdXAgaW4gYQorCSAgICAgKiBtZXNzYWdlIGJveCAod2hpY2ggbWlnaHQgYmUgc2hvd24gd2hlbiBleGl0aW5nISkgKi8KKwkgICAgaWYgKHJlYWRfc3RkaW4gfHwgcmVhZF9idWZmZXIpCisJCXAgPSBtc2dfbWF5X3RydW5jKEZBTFNFLCBJT2J1ZmYpOworCSAgICBlbHNlCisjZW5kaWYKKwkJcCA9IG1zZ190cnVuY19hdHRyKElPYnVmZiwgRkFMU0UsIDApOworCSAgICBpZiAocmVhZF9zdGRpbiB8fCByZWFkX2J1ZmZlciB8fCByZXN0YXJ0X2VkaXQgIT0gMAorCQkgICAgfHwgKG1zZ19zY3JvbGxlZCAmJiAhbmVlZF93YWl0X3JldHVybikpCisJICAgIHsKKwkJLyogTmVlZCB0byByZXBlYXQgdGhlIG1lc3NhZ2UgYWZ0ZXIgcmVkcmF3aW5nIHdoZW46CisJCSAqIC0gV2hlbiByZWFkaW5nIGZyb20gc3RkaW4gKHRoZSBzY3JlZW4gd2lsbCBiZSBjbGVhcmVkIG5leHQpLgorCQkgKiAtIFdoZW4gcmVzdGFydF9lZGl0IGlzIHNldCAob3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYSBkZWxheQorCQkgKiAgIGJlZm9yZSByZWRyYXdpbmcpLgorCQkgKiAtIFdoZW4gdGhlIHNjcmVlbiB3YXMgc2Nyb2xsZWQgYnV0IHRoZXJlIGlzIG5vIHdhaXQtcmV0dXJuCisJCSAqICAgcHJvbXB0LiAqLworCQlzZXRfa2VlcF9tc2cocCk7CisJCWtlZXBfbXNnX2F0dHIgPSAwOworCSAgICB9CisJICAgIG1zZ19zY3JvbGxlZF9pZ24gPSBGQUxTRTsKKwl9CisKKwkvKiB3aXRoIGVycm9ycyB3cml0aW5nIHRoZSBmaWxlIHJlcXVpcmVzICI6dyEiICovCisJaWYgKG5ld2ZpbGUgJiYgKGVycm9yCisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgfHwgY29udl9lcnJvcgorI2VuZGlmCisJCSAgICApKQorCSAgICBjdXJidWYtPmJfcF9ybyA9IFRSVUU7CisKKwl1X2NsZWFybGluZSgpOwkgICAgLyogY2Fubm90IHVzZSAiVSIgY29tbWFuZCBhZnRlciBhZGRpbmcgbGluZXMgKi8KKworCS8qCisJICogSW4gRXggbW9kZTogY3Vyc29yIGF0IGxhc3QgbmV3IGxpbmUuCisJICogT3RoZXJ3aXNlOiBjdXJzb3IgYXQgZmlyc3QgbmV3IGxpbmUuCisJICovCisJaWYgKGV4bW9kZV9hY3RpdmUpCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGZyb20gKyBsaW5lY250OworCWVsc2UKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gZnJvbSArIDE7CisJY2hlY2tfY3Vyc29yX2xudW0oKTsKKwliZWdpbmxpbmUoQkxfV0hJVEUgfCBCTF9GSVgpOwkgICAgLyogb24gZmlyc3Qgbm9uLWJsYW5rICovCisKKwkvKgorCSAqIFNldCAnWyBhbmQgJ10gbWFya3MgdG8gdGhlIG5ld2x5IHJlYWQgbGluZXMuCisJICovCisJY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSBmcm9tICsgMTsKKwljdXJidWYtPmJfb3Bfc3RhcnQuY29sID0gMDsKKwljdXJidWYtPmJfb3BfZW5kLmxudW0gPSBmcm9tICsgbGluZWNudDsKKwljdXJidWYtPmJfb3BfZW5kLmNvbCA9IDA7CisgICAgfQorICAgIG1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKKworI2lmZGVmIEZFQVRfVklNSU5GTworICAgIC8qCisgICAgICogR2V0IHRoZSBtYXJrcyBiZWZvcmUgZXhlY3V0aW5nIGF1dG9jb21tYW5kcywgc28gdGhleSBjYW4gYmUgdXNlZCB0aGVyZS4KKyAgICAgKi8KKyAgICBjaGVja19tYXJrc19yZWFkKCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qCisgICAgICogVHJpY2s6IFdlIHJlbWVtYmVyIGlmIHRoZSBsYXN0IGxpbmUgb2YgdGhlIHJlYWQgZGlkbid0IGhhdmUKKyAgICAgKiBhbiBlb2wgZm9yIHdoZW4gd3JpdGluZyBpdCBhZ2Fpbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yCisgICAgICogIjphdXRvY21kIEZpbGVSZWFkUG9zdCAqLmd6IHNldCBiaW58J1ssJ10hZ3VuemlwIiB0byB3b3JrLgorICAgICAqLworICAgIHdyaXRlX25vX2VvbF9sbnVtID0gcmVhZF9ub19lb2xfbG51bTsKKworICAgIGlmICghcmVhZF9zdGRpbiAmJiAhcmVhZF9idWZmZXIpCisgICAgeworCWludCBtID0gbXNnX3Njcm9sbDsKKwlpbnQgbiA9IG1zZ19zY3JvbGxlZDsKKworCS8qIFNhdmUgdGhlIGZpbGVmb3JtYXQgbm93LCBvdGhlcndpc2UgdGhlIGJ1ZmZlciB3aWxsIGJlIGNvbnNpZGVyZWQKKwkgKiBtb2RpZmllZCBpZiB0aGUgZm9ybWF0L2VuY29kaW5nIHdhcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiAqLworCWlmIChuZXdmaWxlKQorCSAgICBzYXZlX2ZpbGVfZmYoY3VyYnVmKTsKKworCS8qCisJICogVGhlIG91dHB1dCBmcm9tIHRoZSBhdXRvY29tbWFuZHMgc2hvdWxkIG5vdCBvdmVyd3JpdGUgYW55dGhpbmcgYW5kCisJICogc2hvdWxkIG5vdCBiZSBvdmVyd3JpdHRlbjogU2V0IG1zZ19zY3JvbGwsIHJlc3RvcmUgaXRzIHZhbHVlIGlmIG5vCisJICogb3V0cHV0IHdhcyBkb25lLgorCSAqLworCW1zZ19zY3JvbGwgPSBUUlVFOworCWlmIChmaWx0ZXJpbmcpCisJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTFRFUlJFQURQT1NULCBOVUxMLCBzZm5hbWUsCisJCQkJCQkJICBGQUxTRSwgY3VyYnVmLCBlYXApOworCWVsc2UgaWYgKG5ld2ZpbGUpCisJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0JVRlJFQURQT1NULCBOVUxMLCBzZm5hbWUsCisJCQkJCQkJICBGQUxTRSwgY3VyYnVmLCBlYXApOworCWVsc2UKKwkgICAgYXBwbHlfYXV0b2NtZHNfZXhhcmcoRVZFTlRfRklMRVJFQURQT1NULCBzZm5hbWUsIHNmbmFtZSwKKwkJCQkJCQkgICAgRkFMU0UsIE5VTEwsIGVhcCk7CisJaWYgKG1zZ19zY3JvbGxlZCA9PSBuKQorCSAgICBtc2dfc2Nyb2xsID0gbTsKKyNpZmRlZiBGRUFUX0VWQUwKKwlpZiAoYWJvcnRpbmcoKSkJICAgIC8qIGF1dG9jbWRzIG1heSBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZyAqLworCSAgICByZXR1cm4gRkFJTDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHJlY292ZXJ5bW9kZSAmJiBlcnJvcikKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBGaWxsICIqZWFwIiB0byBmb3JjZSB0aGUgJ2ZpbGVlbmNvZGluZycgYW5kICdmaWxlZm9ybWF0JyB0byBiZSBlcXVhbCB0byB0aGUKKyAqIGJ1ZmZlciAiYnVmIi4gIFVzZWQgZm9yIGNhbGxpbmcgcmVhZGZpbGUoKS4KKyAqIFJldHVybnMgT0sgb3IgRkFJTC4KKyAqLworICAgIGludAorcHJlcF9leGFyZyhlYXAsIGJ1ZikKKyAgICBleGFyZ19UCSplYXA7CisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBlYXAtPmNtZCA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGJ1Zi0+Yl9wX2ZmKQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJKyBTVFJMRU4oYnVmLT5iX3BfZmVuYykKKyNlbmRpZgorCQkJCQkJICsgMTUpKTsKKyAgICBpZiAoZWFwLT5jbWQgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBzcHJpbnRmKChjaGFyICopZWFwLT5jbWQsICJlICsrZmY9JXMgKytlbmM9JXMiLCBidWYtPmJfcF9mZiwgYnVmLT5iX3BfZmVuYyk7CisgICAgZWFwLT5mb3JjZV9lbmMgPSAxNCArIChpbnQpU1RSTEVOKGJ1Zi0+Yl9wX2ZmKTsKKyNlbHNlCisgICAgc3ByaW50ZigoY2hhciAqKWVhcC0+Y21kLCAiZSArK2ZmPSVzIiwgYnVmLT5iX3BfZmYpOworI2VuZGlmCisgICAgZWFwLT5mb3JjZV9mZiA9IDc7CisgICAgcmV0dXJuIE9LOworfQorCisjaWZkZWYgRkVBVF9NQllURQorLyoKKyAqIEZpbmQgbmV4dCBmaWxlZW5jb2RpbmcgdG8gdXNlIGZyb20gJ2ZpbGVlbmNvZGluZ3MnLgorICogInBwIiBwb2ludHMgdG8gZmVuY19uZXh0LiAgSXQncyBhZHZhbmNlZCB0byB0aGUgbmV4dCBpdGVtLgorICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCAqcHAgaXMgc2V0IHRvCisgKiBOVUxMLgorICogV2hlbiAqcHAgaXMgbm90IHNldCB0byBOVUxMLCB0aGUgcmVzdWx0IGlzIGluIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK25leHRfZmVuYyhwcCkKKyAgICBjaGFyX3UJKipwcDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpyOworCisgICAgaWYgKCoqcHAgPT0gTlVMKQorICAgIHsKKwkqcHAgPSBOVUxMOworCXJldHVybiAoY2hhcl91ICopIiI7CisgICAgfQorICAgIHAgPSB2aW1fc3RyY2hyKCpwcCwgJywnKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgIHsKKwlyID0gZW5jX2Nhbm9uaXplKCpwcCk7CisJKnBwICs9IFNUUkxFTigqcHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXIgPSB2aW1fc3RybnNhdmUoKnBwLCAoaW50KShwIC0gKnBwKSk7CisJKnBwID0gcCArIDE7CisJaWYgKHIgIT0gTlVMTCkKKwl7CisJICAgIHAgPSBlbmNfY2Fub25pemUocik7CisJICAgIHZpbV9mcmVlKHIpOworCSAgICByID0gcDsKKwl9CisgICAgfQorICAgIGlmIChyID09IE5VTEwpCS8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICB7CisJciA9IChjaGFyX3UgKikiIjsKKwkqcHAgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworIyBpZmRlZiBGRUFUX0VWQUwKKy8qCisgKiBDb252ZXJ0IGEgZmlsZSB3aXRoIHRoZSAnY2hhcmNvbnZlcnQnIGV4cHJlc3Npb24uCisgKiBUaGlzIGNsb3NlcyB0aGUgZmlsZSB3aGljaCBpcyB0byBiZSByZWFkLCBjb252ZXJ0cyBpdCBhbmQgb3BlbnMgdGhlCisgKiByZXN1bHRpbmcgZmlsZSBmb3IgcmVhZGluZy4KKyAqIFJldHVybnMgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIGNvbnZlcnRlZCBmaWxlICh0aGUgY2FsbGVyIHNob3VsZCBkZWxldGUgaXQKKyAqIGFmdGVyIHJlYWRpbmcgaXQpLgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxlZCAoIipmZHAiIGlzIG5vdCBzZXQpIC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcmVhZGZpbGVfY2hhcmNvbnZlcnQoZm5hbWUsIGZlbmMsIGZkcCkKKyAgICBjaGFyX3UJKmZuYW1lOwkJLyogbmFtZSBvZiBpbnB1dCBmaWxlICovCisgICAgY2hhcl91CSpmZW5jOwkJLyogY29udmVydGVkIGZyb20gKi8KKyAgICBpbnQJCSpmZHA7CQkvKiBpbi9vdXQ6IGZpbGUgZGVzY3JpcHRvciBvZiBmaWxlICovCit7CisgICAgY2hhcl91CSp0bXBuYW1lOworICAgIGNoYXJfdQkqZXJybXNnID0gTlVMTDsKKworICAgIHRtcG5hbWUgPSB2aW1fdGVtcG5hbWUoJ3InKTsKKyAgICBpZiAodG1wbmFtZSA9PSBOVUxMKQorCWVycm1zZyA9IChjaGFyX3UgKilfKCJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIpOworICAgIGVsc2UKKyAgICB7CisJY2xvc2UoKmZkcCk7CQkvKiBjbG9zZSB0aGUgaW5wdXQgZmlsZSwgaWdub3JlIGVycm9ycyAqLworCSpmZHAgPSAtMTsKKwlpZiAoZXZhbF9jaGFyY29udmVydChmZW5jLCBlbmNfdXRmOCA/IChjaGFyX3UgKikidXRmLTgiIDogcF9lbmMsCisJCQkJCQkgICAgICBmbmFtZSwgdG1wbmFtZSkgPT0gRkFJTCkKKwkgICAgZXJybXNnID0gKGNoYXJfdSAqKV8oIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIpOworCWlmIChlcnJtc2cgPT0gTlVMTCAmJiAoKmZkcCA9IG1jaF9vcGVuKChjaGFyICopdG1wbmFtZSwKKwkJCQkJCSAgT19SRE9OTFkgfCBPX0VYVFJBLCAwKSkgPCAwKQorCSAgICBlcnJtc2cgPSAoY2hhcl91ICopXygiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIpOworICAgIH0KKworICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKKyAgICB7CisJLyogRG9uJ3QgdXNlIGVtc2coKSwgaXQgYnJlYWtzIG1hcHBpbmdzLCB0aGUgcmV0cnkgd2l0aAorCSAqIGFub3RoZXIgdHlwZSBvZiBjb252ZXJzaW9uIG1pZ2h0IHN0aWxsIHdvcmsuICovCisJTVNHKGVycm1zZyk7CisJaWYgKHRtcG5hbWUgIT0gTlVMTCkKKwl7CisJICAgIG1jaF9yZW1vdmUodG1wbmFtZSk7CS8qIGRlbGV0ZSBjb252ZXJ0ZWQgZmlsZSAqLworCSAgICB2aW1fZnJlZSh0bXBuYW1lKTsKKwkgICAgdG1wbmFtZSA9IE5VTEw7CisJfQorICAgIH0KKworICAgIC8qIElmIHRoZSBpbnB1dCBmaWxlIGlzIGNsb3NlZCwgb3BlbiBpdCAoY2FsbGVyIHNob3VsZCBjaGVjayBmb3IgZXJyb3IpLiAqLworICAgIGlmICgqZmRwIDwgMCkKKwkqZmRwID0gbWNoX29wZW4oKGNoYXIgKilmbmFtZSwgT19SRE9OTFkgfCBPX0VYVFJBLCAwKTsKKworICAgIHJldHVybiB0bXBuYW1lOworfQorIyBlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklNSU5GTworLyoKKyAqIFJlYWQgbWFya3MgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBmcm9tIHRoZSB2aW1pbmZvIGZpbGUsIHdoZW4gd2Ugc3VwcG9ydAorICogYnVmZmVyIG1hcmtzIGFuZCB0aGUgYnVmZmVyIGhhcyBhIG5hbWUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfbWFya3NfcmVhZCgpCit7CisgICAgaWYgKCFjdXJidWYtPmJfbWFya3NfcmVhZCAmJiBnZXRfdmltaW5mb19wYXJhbWV0ZXIoJ1wnJykgPiAwCisJCQkJCQkgICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTCkKKwlyZWFkX3ZpbWluZm8oTlVMTCwgRkFMU0UsIFRSVUUsIEZBTFNFKTsKKworICAgIC8qIEFsd2F5cyBzZXQgYl9tYXJrc19yZWFkOyBuZWVkZWQgd2hlbiAndmltaW5mbycgaXMgY2hhbmdlZCB0byBpbmNsdWRlCisgICAgICogdGhlICcgcGFyYW1ldGVyIGFmdGVyIG9wZW5pbmcgYSBidWZmZXIuICovCisgICAgY3VyYnVmLT5iX21hcmtzX3JlYWQgPSBUUlVFOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0NSWVBUCisvKgorICogQ2hlY2sgZm9yIG1hZ2ljIG51bWJlciB1c2VkIGZvciBlbmNyeXB0aW9uLgorICogSWYgZm91bmQsIHRoZSBtYWdpYyBudW1iZXIgaXMgcmVtb3ZlZCBmcm9tIHB0clsqc2l6ZXBdIGFuZCAqc2l6ZXAgYW5kCisgKiAqZmlsZXNpemVwIGFyZSB1cGRhdGVkLgorICogUmV0dXJuIHRoZSAobmV3KSBlbmNyeXB0aW9uIGtleSwgTlVMTCBmb3Igbm8gZW5jcnlwdGlvbi4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorY2hlY2tfZm9yX2NyeXB0a2V5KGNyeXB0a2V5LCBwdHIsIHNpemVwLCBmaWxlc2l6ZXAsIG5ld2ZpbGUpCisgICAgY2hhcl91CSpjcnlwdGtleTsJLyogcHJldmlvdXMgZW5jcnlwdGlvbiBrZXkgb3IgTlVMTCAqLworICAgIGNoYXJfdQkqcHRyOwkJLyogcG9pbnRlciB0byByZWFkIGJ5dGVzICovCisgICAgbG9uZwkqc2l6ZXA7CQkvKiBsZW5ndGggb2YgcmVhZCBieXRlcyAqLworICAgIGxvbmcJKmZpbGVzaXplcDsJLyogbnIgb2YgYnl0ZXMgdXNlZCBmcm9tIGZpbGUgKi8KKyAgICBpbnQJCW5ld2ZpbGU7CS8qIGVkaXRpbmcgYSBuZXcgYnVmZmVyICovCit7CisgICAgaWYgKCpzaXplcCA+PSBDUllQVF9NQUdJQ19MRU4KKwkgICAgJiYgU1RSTkNNUChwdHIsIENSWVBUX01BR0lDLCBDUllQVF9NQUdJQ19MRU4pID09IDApCisgICAgeworCWlmIChjcnlwdGtleSA9PSBOVUxMKQorCXsKKwkgICAgaWYgKCpjdXJidWYtPmJfcF9rZXkpCisJCWNyeXB0a2V5ID0gY3VyYnVmLT5iX3Bfa2V5OworCSAgICBlbHNlCisJICAgIHsKKwkJLyogV2hlbiBuZXdmaWxlIGlzIFRSVUUsIHN0b3JlIHRoZSB0eXBlZCBrZXkKKwkJICogaW4gdGhlICdrZXknIG9wdGlvbiBhbmQgZG9uJ3QgZnJlZSBpdC4gKi8KKwkJY3J5cHRrZXkgPSBnZXRfY3J5cHRfa2V5KG5ld2ZpbGUsIEZBTFNFKTsKKwkJLyogY2hlY2sgaWYgZW1wdHkga2V5IGVudGVyZWQgKi8KKwkJaWYgKGNyeXB0a2V5ICE9IE5VTEwgJiYgKmNyeXB0a2V5ID09IE5VTCkKKwkJeworCQkgICAgaWYgKGNyeXB0a2V5ICE9IGN1cmJ1Zi0+Yl9wX2tleSkKKwkJCXZpbV9mcmVlKGNyeXB0a2V5KTsKKwkJICAgIGNyeXB0a2V5ID0gTlVMTDsKKwkJfQorCSAgICB9CisJfQorCisJaWYgKGNyeXB0a2V5ICE9IE5VTEwpCisJeworCSAgICBjcnlwdF9pbml0X2tleXMoY3J5cHRrZXkpOworCisJICAgIC8qIFJlbW92ZSBtYWdpYyBudW1iZXIgZnJvbSB0aGUgdGV4dCAqLworCSAgICAqZmlsZXNpemVwICs9IENSWVBUX01BR0lDX0xFTjsKKwkgICAgKnNpemVwIC09IENSWVBUX01BR0lDX0xFTjsKKwkgICAgbWNoX21lbW1vdmUocHRyLCBwdHIgKyBDUllQVF9NQUdJQ19MRU4sIChzaXplX3QpKnNpemVwKTsKKwl9CisgICAgfQorICAgIC8qIFdoZW4gc3RhcnRpbmcgdG8gZWRpdCBhIG5ldyBmaWxlIHdoaWNoIGRvZXMgbm90IGhhdmUKKyAgICAgKiBlbmNyeXB0aW9uLCBjbGVhciB0aGUgJ2tleScgb3B0aW9uLCBleGNlcHQgd2hlbgorICAgICAqIHN0YXJ0aW5nIHVwIChjYWxsZWQgd2l0aCAteCBhcmd1bWVudCkgKi8KKyAgICBlbHNlIGlmIChuZXdmaWxlICYmICpjdXJidWYtPmJfcF9rZXkgJiYgIXN0YXJ0aW5nKQorCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJrZXkiLCAwTCwgKGNoYXJfdSAqKSIiLCBPUFRfTE9DQUwpOworCisgICAgcmV0dXJuIGNyeXB0a2V5OworfQorI2VuZGlmCisKKyNpZmRlZiBVTklYCisgICAgc3RhdGljIHZvaWQKK3NldF9maWxlX3RpbWUoZm5hbWUsIGF0aW1lLCBtdGltZSkKKyAgICBjaGFyX3UgICpmbmFtZTsKKyAgICB0aW1lX3QgIGF0aW1lOwkgICAgLyogYWNjZXNzIHRpbWUgKi8KKyAgICB0aW1lX3QgIG10aW1lOwkgICAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KK3sKKyMgaWYgZGVmaW5lZChIQVZFX1VUSU1FKSAmJiBkZWZpbmVkKEhBVkVfVVRJTUVfSCkKKyAgICBzdHJ1Y3QgdXRpbWJ1ZiAgYnVmOworCisgICAgYnVmLmFjdGltZQk9IGF0aW1lOworICAgIGJ1Zi5tb2R0aW1lCT0gbXRpbWU7CisgICAgKHZvaWQpdXRpbWUoKGNoYXIgKilmbmFtZSwgJmJ1Zik7CisjIGVsc2UKKyMgIGlmIGRlZmluZWQoSEFWRV9VVElNRVMpCisgICAgc3RydWN0IHRpbWV2YWwgIHR2cFsyXTsKKworICAgIHR2cFswXS50dl9zZWMgICA9IGF0aW1lOworICAgIHR2cFswXS50dl91c2VjICA9IDA7CisgICAgdHZwWzFdLnR2X3NlYyAgID0gbXRpbWU7CisgICAgdHZwWzFdLnR2X3VzZWMgID0gMDsKKyMgICBpZmRlZiBOZVhUCisgICAgKHZvaWQpdXRpbWVzKChjaGFyICopZm5hbWUsIHR2cCk7CisjICAgZWxzZQorICAgICh2b2lkKXV0aW1lcygoY2hhciAqKWZuYW1lLCAoY29uc3Qgc3RydWN0IHRpbWV2YWwgKikmdHZwKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKK30KKyNlbmRpZiAvKiBVTklYICovCisKKy8qCisgKiBidWZfd3JpdGUoKSAtIHdyaXRlIHRvIGZpbGUgJ2ZuYW1lJyBsaW5lcyAnc3RhcnQnIHRocm91Z2ggJ2VuZCcKKyAqCisgKiBXZSBkbyBvdXIgb3duIGJ1ZmZlcmluZyBoZXJlIGJlY2F1c2UgZndyaXRlKCkgaXMgc28gc2xvdy4KKyAqCisgKiBJZiBmb3JjZWl0IGlzIHRydWUsIHdlIGRvbid0IGNhcmUgZm9yIGVycm9ycyB3aGVuIGF0dGVtcHRpbmcgYmFja3VwcyAoancpLgorICogSW4gY2FzZSBvZiBhbiBlcnJvciBldmVyeXRoaW5nIHBvc3NpYmxlIGlzIGRvbmUgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZS4KKyAqIEJ1dCB3aGVuIGZvcmNlaXQgaXMgVFJVRSwgd2UgcmlzayBsb29zaW5nIGl0LgorICogV2hlbiByZXNldF9jaGFuZ2VkIGlzIFRSVUUgYW5kIHN0YXJ0ID09IDEgYW5kIGVuZCA9PQorICogY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQsIHJlc2V0IGN1cmJ1Zi0+Yl9jaGFuZ2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBOT1QgdXNlIE5hbWVCdWZmIChiZWNhdXNlIGl0J3MgY2FsbGVkIGJ5IGF1dG93cml0ZSgpKS4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2J1Zl93cml0ZShidWYsIGZuYW1lLCBzZm5hbWUsIHN0YXJ0LCBlbmQsIGVhcCwgYXBwZW5kLCBmb3JjZWl0LAorCQkJCQkJICAgICAgcmVzZXRfY2hhbmdlZCwgZmlsdGVyaW5nKQorICAgIGJ1Zl9UCSAgICAqYnVmOworICAgIGNoYXJfdQkgICAgKmZuYW1lOworICAgIGNoYXJfdQkgICAgKnNmbmFtZTsKKyAgICBsaW5lbnJfVAkgICAgc3RhcnQsIGVuZDsKKyAgICBleGFyZ19UCSAgICAqZWFwOwkJLyogZm9yIGZvcmNlZCAnZmYnIGFuZCAnZmVuYycsIGNhbiBiZQorCQkJCQkgICBOVUxMISAqLworICAgIGludAkJICAgIGFwcGVuZDsKKyAgICBpbnQJCSAgICBmb3JjZWl0OworICAgIGludAkJICAgIHJlc2V0X2NoYW5nZWQ7CisgICAgaW50CQkgICAgZmlsdGVyaW5nOworeworICAgIGludAkJICAgIGZkOworICAgIGNoYXJfdQkgICAgKmJhY2t1cCA9IE5VTEw7CisgICAgaW50CQkgICAgYmFja3VwX2NvcHkgPSBGQUxTRTsgLyogY29weSB0aGUgb3JpZ2luYWwgZmlsZT8gKi8KKyAgICBpbnQJCSAgICBkb2JhY2t1cDsKKyAgICBjaGFyX3UJICAgICpmZm5hbWU7CisgICAgY2hhcl91CSAgICAqd2ZuYW1lID0gTlVMTDsJLyogbmFtZSBvZiBmaWxlIHRvIHdyaXRlIHRvICovCisgICAgY2hhcl91CSAgICAqczsKKyAgICBjaGFyX3UJICAgICpwdHI7CisgICAgY2hhcl91CSAgICBjOworICAgIGludAkJICAgIGxlbjsKKyAgICBsaW5lbnJfVAkgICAgbG51bTsKKyAgICBsb25nCSAgICBuY2hhcnM7CisgICAgY2hhcl91CSAgICAqZXJybXNnID0gTlVMTDsKKyAgICBjaGFyX3UJICAgICplcnJudW0gPSBOVUxMOworICAgIGNoYXJfdQkgICAgKmJ1ZmZlcjsKKyAgICBjaGFyX3UJICAgIHNtYWxsYnVmW1NNQlVGU0laRV07CisgICAgY2hhcl91CSAgICAqYmFja3VwX2V4dDsKKyAgICBpbnQJCSAgICBidWZzaXplOworICAgIGxvbmcJICAgIHBlcm07CQkgICAgLyogZmlsZSBwZXJtaXNzaW9ucyAqLworICAgIGludAkJICAgIHJldHZhbCA9IE9LOworICAgIGludAkJICAgIG5ld2ZpbGUgPSBGQUxTRTsJICAgIC8qIFRSVUUgaWYgZmlsZSBkb2Vzbid0IGV4aXN0IHlldCAqLworICAgIGludAkJICAgIG1zZ19zYXZlID0gbXNnX3Njcm9sbDsKKyAgICBpbnQJCSAgICBvdmVyd3JpdGluZzsJICAgIC8qIFRSVUUgaWYgd3JpdGluZyBvdmVyIG9yaWdpbmFsICovCisgICAgaW50CQkgICAgbm9fZW9sID0gRkFMU0U7CSAgICAvKiBubyBlbmQtb2YtbGluZSB3cml0dGVuICovCisgICAgaW50CQkgICAgZGV2aWNlID0gRkFMU0U7CSAgICAvKiB3cml0aW5nIHRvIGEgZGV2aWNlICovCisgICAgc3RydWN0IHN0YXQJICAgIHN0X29sZDsKKyAgICBpbnQJCSAgICBwcmV2X2dvdF9pbnQgPSBnb3RfaW50OworICAgIGludAkJICAgIGZpbGVfcmVhZG9ubHkgPSBGQUxTRTsgIC8qIG92ZXJ3cml0dGVuIGZpbGUgaXMgcmVhZC1vbmx5ICovCisgICAgc3RhdGljIGNoYXIJICAgICplcnJfcmVhZG9ubHkgPSAiaXMgcmVhZC1vbmx5IChjYW5ub3Qgb3ZlcnJpZGU6IFwiV1wiIGluICdjcG9wdGlvbnMnKSI7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKF9fRU1YX19YWCkJICAgIC8qWFhYIGZpeCBtZSBzb21ldGltZT8gKi8KKyAgICBpbnQJCSAgICBtYWRlX3dyaXRhYmxlID0gRkFMU0U7ICAvKiAndycgYml0IGhhcyBiZWVuIHNldCAqLworI2VuZGlmCisJCQkJCS8qIHdyaXRpbmcgZXZlcnl0aGluZyAqLworICAgIGludAkJICAgIHdob2xlID0gKHN0YXJ0ID09IDEgJiYgZW5kID09IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBsaW5lbnJfVAkgICAgb2xkX2xpbmVfY291bnQgPSBidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyNlbmRpZgorICAgIGludAkJICAgIGF0dHI7CisgICAgaW50CQkgICAgZmlsZWZvcm1hdDsKKyAgICBpbnQJCSAgICB3cml0ZV9iaW47CisgICAgc3RydWN0IGJ3X2luZm8gIHdyaXRlX2luZm87CQkvKiBpbmZvIGZvciBidWZfd3JpdGVfYnl0ZXMoKSAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCSAgICBjb252ZXJ0ZWQgPSBGQUxTRTsKKyAgICBpbnQJCSAgICBub3Rjb252ZXJ0ZWQgPSBGQUxTRTsKKyAgICBjaGFyX3UJICAgICpmZW5jOwkJLyogZWZmZWN0aXZlICdmaWxlZW5jb2RpbmcnICovCisgICAgY2hhcl91CSAgICAqZmVuY190b2ZyZWUgPSBOVUxMOyAvKiBhbGxvY2F0ZWQgImZlbmMiICovCisjZW5kaWYKKyNpZmRlZiBIQVNfQldfRkxBR1MKKyAgICBpbnQJCSAgICB3Yl9mbGFncyA9IDA7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0FDTAorICAgIHZpbV9hY2xfVAkgICAgYWNsID0gTlVMTDsJCS8qIEFDTCBjb3BpZWQgZnJvbSBvcmlnaW5hbCBmaWxlIHRvCisJCQkJCSAgIGJhY2t1cCBvciBuZXcgZmlsZSAqLworI2VuZGlmCisKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCB8fCAqZm5hbWUgPT0gTlVMKQkvKiBzYWZldHkgY2hlY2sgKi8KKwlyZXR1cm4gRkFJTDsKKworICAgIC8qCisgICAgICogRGlzYWxsb3cgd3JpdGluZyBmcm9tIC5leHJjIGFuZCAudmltcmMgaW4gY3VycmVudCBkaXJlY3RvcnkgZm9yCisgICAgICogc2VjdXJpdHkgcmVhc29ucy4KKyAgICAgKi8KKyAgICBpZiAoY2hlY2tfc2VjdXJlKCkpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKiBBdm9pZCBhIGNyYXNoIGZvciBhIGxvbmcgbmFtZS4gKi8KKyAgICBpZiAoU1RSTEVOKGZuYW1lKSA+PSBNQVhQQVRITCkKKyAgICB7CisJRU1TRyhfKGVfbG9uZ25hbWUpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogbXVzdCBpbml0IGJ3X2NvbnZfYnVmIGFuZCBid19pY29udl9mZCBiZWZvcmUganVtcGluZyB0byAiZmFpbCIgKi8KKyAgICB3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmID0gTlVMTDsKKyAgICB3cml0ZV9pbmZvLmJ3X2NvbnZfZXJyb3IgPSBGQUxTRTsKKyAgICB3cml0ZV9pbmZvLmJ3X3Jlc3RsZW4gPSAwOworIyBpZmRlZiBVU0VfSUNPTlYKKyAgICB3cml0ZV9pbmZvLmJ3X2ljb252X2ZkID0gKGljb252X3QpLTE7CisjIGVuZGlmCisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lIHlldCwgdXNlIHRoZSBvbmUgZm9yIHRoZSB3cml0dGVuIGZpbGUuCisgICAgICogQkZfTk9URURJVEVEIGlzIHNldCB0byByZWZsZWN0IHRoaXMgKGluIGNhc2UgdGhlIHdyaXRlIGZhaWxzKS4KKyAgICAgKiBEb24ndCBkbyB0aGlzIHdoZW4gdGhlIHdyaXRlIGlzIGZvciBhIGZpbHRlciBjb21tYW5kLgorICAgICAqIE9ubHkgZG8gdGhpcyB3aGVuICdjcG9wdGlvbnMnIGNvbnRhaW5zIHRoZSAnZicgZmxhZy4KKyAgICAgKi8KKyAgICBpZiAocmVzZXRfY2hhbmdlZAorCSAgICAmJiB3aG9sZQorCSAgICAmJiBidWYgPT0gY3VyYnVmCisJICAgICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTAorCSAgICAmJiAhZmlsdGVyaW5nCisJICAgICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19GTkFNRVcpICE9IE5VTEwpCisgICAgeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCS8qIEl0J3MgbGlrZSB0aGUgdW5uYW1lZCBidWZmZXIgaXMgZGVsZXRlZC4uLi4gKi8KKwlpZiAoY3VyYnVmLT5iX3BfYmwpCisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkRFTEVURSwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGV0lQRU9VVCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjaWZkZWYgRkVBVF9FVkFMCisJaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisjZW5kaWYKKyNlbmRpZgorCWlmIChzZXRmbmFtZShjdXJidWYsIGZuYW1lLCBzZm5hbWUsIEZBTFNFKSA9PSBPSykKKwkgICAgY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX05PVEVESVRFRDsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkvKiAuLi4uYW5kIGEgbmV3IG5hbWVkIG9uZSBpcyBjcmVhdGVkICovCisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQlVGTkVXLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwlpZiAoY3VyYnVmLT5iX3BfYmwpCisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkFERCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoc2ZuYW1lID09IE5VTEwpCisJc2ZuYW1lID0gZm5hbWU7CisgICAgLyoKKyAgICAgKiBGb3IgVW5peDogVXNlIHRoZSBzaG9ydCBmaWxlIG5hbWUgd2hlbmV2ZXIgcG9zc2libGUuCisgICAgICogQXZvaWRzIHByb2JsZW1zIHdpdGggbmV0d29ya3MgYW5kIHdoZW4gZGlyZWN0b3J5IG5hbWVzIGFyZSBjaGFuZ2VkLgorICAgICAqIERvbid0IGRvIHRoaXMgZm9yIE1TLURPUywgYSAiY2QiIGluIGEgc3ViLXNoZWxsIG1heSBoYXZlIG1vdmVkIHVzIHRvCisgICAgICogYW5vdGhlciBkaXJlY3RvcnksIHdoaWNoIHdlIGRvbid0IGRldGVjdAorICAgICAqLworICAgIGZmbmFtZSA9IGZuYW1lOwkJCSAgICAvKiByZW1lbWJlciBmdWxsIGZuYW1lICovCisjaWZkZWYgVU5JWAorICAgIGZuYW1lID0gc2ZuYW1lOworI2VuZGlmCisKKyAgICBpZiAoYnVmLT5iX2ZmbmFtZSAhPSBOVUxMICYmIGZuYW1lY21wKGZmbmFtZSwgYnVmLT5iX2ZmbmFtZSkgPT0gMCkKKwlvdmVyd3JpdGluZyA9IFRSVUU7CisgICAgZWxzZQorCW92ZXJ3cml0aW5nID0gRkFMU0U7CisKKyAgICBpZiAoZXhpdGluZykKKwlzZXR0bW9kZShUTU9ERV9DT09LKTsJICAgIC8qIHdoZW4gZXhpdGluZyBhbGxvdyB0eXBhaGVhZCBub3cgKi8KKworICAgICsrbm9fd2FpdF9yZXR1cm47CQkgICAgLyogZG9uJ3Qgd2FpdCBmb3IgcmV0dXJuIHlldCAqLworCisgICAgLyoKKyAgICAgKiBTZXQgJ1sgYW5kICddIG1hcmtzIHRvIHRoZSBsaW5lcyB0byBiZSB3cml0dGVuLgorICAgICAqLworICAgIGJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gc3RhcnQ7CisgICAgYnVmLT5iX29wX3N0YXJ0LmNvbCA9IDA7CisgICAgYnVmLT5iX29wX2VuZC5sbnVtID0gZW5kOworICAgIGJ1Zi0+Yl9vcF9lbmQuY29sID0gMDsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIHsKKwlhY29fc2F2ZV9UCWFjbzsKKwlpbnQJCWJ1Zl9mZm5hbWUgPSBGQUxTRTsKKwlpbnQJCWJ1Zl9zZm5hbWUgPSBGQUxTRTsKKwlpbnQJCWJ1Zl9mbmFtZV9mID0gRkFMU0U7CisJaW50CQlidWZfZm5hbWVfcyA9IEZBTFNFOworCWludAkJZGlkX2NtZCA9IEZBTFNFOworCisJLyoKKwkgKiBBcHBseSBQUkUgYXVjb2NvbW1hbmRzLgorCSAqIFNldCBjdXJidWYgdG8gdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuLgorCSAqIENhcmVmdWw6IFRoZSBhdXRvY29tbWFuZHMgbWF5IGNhbGwgYnVmX3dyaXRlKCkgcmVjdXJzaXZlbHkhCisJICovCisJaWYgKGZmbmFtZSA9PSBidWYtPmJfZmZuYW1lKQorCSAgICBidWZfZmZuYW1lID0gVFJVRTsKKwlpZiAoc2ZuYW1lID09IGJ1Zi0+Yl9zZm5hbWUpCisJICAgIGJ1Zl9zZm5hbWUgPSBUUlVFOworCWlmIChmbmFtZSA9PSBidWYtPmJfZmZuYW1lKQorCSAgICBidWZfZm5hbWVfZiA9IFRSVUU7CisJaWYgKGZuYW1lID09IGJ1Zi0+Yl9zZm5hbWUpCisJICAgIGJ1Zl9mbmFtZV9zID0gVFJVRTsKKworCS8qIHNldCBjdXJ3aW4vY3VyYnVmIHRvIGJ1ZiBhbmQgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKwlhdWNtZF9wcmVwYnVmKCZhY28sIGJ1Zik7CisKKwlpZiAoYXBwZW5kKQorCXsKKwkgICAgaWYgKCEoZGlkX2NtZCA9IGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTEVBUFBFTkRDTUQsCisJCQkJCSBzZm5hbWUsIHNmbmFtZSwgRkFMU0UsIGN1cmJ1ZiwgZWFwKSkpCisJCWFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTEVBUFBFTkRQUkUsCisJCQkJCSAgc2ZuYW1lLCBzZm5hbWUsIEZBTFNFLCBjdXJidWYsIGVhcCk7CisJfQorCWVsc2UgaWYgKGZpbHRlcmluZykKKwl7CisJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTFRFUldSSVRFUFJFLAorCQkJCQkgICAgTlVMTCwgc2ZuYW1lLCBGQUxTRSwgY3VyYnVmLCBlYXApOworCX0KKwllbHNlIGlmIChyZXNldF9jaGFuZ2VkICYmIHdob2xlKQorCXsKKwkgICAgaWYgKCEoZGlkX2NtZCA9IGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0JVRldSSVRFQ01ELAorCQkJCQkgc2ZuYW1lLCBzZm5hbWUsIEZBTFNFLCBjdXJidWYsIGVhcCkpKQorCQlhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9CVUZXUklURVBSRSwKKwkJCQkJICBzZm5hbWUsIHNmbmFtZSwgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKCEoZGlkX2NtZCA9IGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0ZJTEVXUklURUNNRCwKKwkJCQkJIHNmbmFtZSwgc2ZuYW1lLCBGQUxTRSwgY3VyYnVmLCBlYXApKSkKKwkJYXBwbHlfYXV0b2NtZHNfZXhhcmcoRVZFTlRfRklMRVdSSVRFUFJFLAorCQkJCQkgIHNmbmFtZSwgc2ZuYW1lLCBGQUxTRSwgY3VyYnVmLCBlYXApOworCX0KKworCS8qIHJlc3RvcmUgY3Vyd2luL2N1cmJ1ZiBhbmQgYSBmZXcgb3RoZXIgdGhpbmdzICovCisJYXVjbWRfcmVzdGJ1ZigmYWNvKTsKKworCS8qCisJICogSW4gdGhyZWUgc2l0dWF0aW9ucyB3ZSByZXR1cm4gaGVyZSBhbmQgZG9uJ3Qgd3JpdGUgdGhlIGZpbGU6CisJICogMS4gdGhlIGF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIHRoZSBidWZmZXIuCisJICogMi4gVGhlIGF1dG9jb21tYW5kcyBhYm9ydCBzY3JpcHQgcHJvY2Vzc2luZy4KKwkgKiAzLiBJZiBvbmUgb2YgdGhlICJDbWQiIGF1dG9jb21tYW5kcyB3YXMgZXhlY3V0ZWQuCisJICovCisJaWYgKCFidWZfdmFsaWQoYnVmKSkKKwkgICAgYnVmID0gTlVMTDsKKwlpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMIHx8IGRpZF9jbWQgfHwgYWJvcnRpbmcoKSkKKwl7CisJICAgIC0tbm9fd2FpdF9yZXR1cm47CisJICAgIG1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKKwkgICAgaWYgKGFib3J0aW5nKCkpCisJCS8qIEFuIGFib3J0aW5nIGVycm9yLCBpbnRlcnJ1cHQgb3IgZXhjZXB0aW9uIGluIHRoZQorCQkgKiBhdXRvY29tbWFuZHMuICovCisJCXJldHVybiBGQUlMOworCSAgICBpZiAoZGlkX2NtZCkKKwkgICAgeworCQlpZiAoYnVmID09IE5VTEwpCisJCSAgICAvKiBUaGUgYnVmZmVyIHdhcyBkZWxldGVkLiAgV2UgYXNzdW1lIGl0IHdhcyB3cml0dGVuCisJCSAgICAgKiAoY2FuJ3QgcmV0cnkgYW55d2F5KS4gKi8KKwkJICAgIHJldHVybiBPSzsKKwkJaWYgKG92ZXJ3cml0aW5nKQorCQl7CisJCSAgICAvKiBBc3N1bWUgdGhlIGJ1ZmZlciB3YXMgd3JpdHRlbiwgdXBkYXRlIHRoZSB0aW1lc3RhbXAuICovCisJCSAgICBtbF90aW1lc3RhbXAoYnVmKTsKKwkJICAgIGJ1Zi0+Yl9mbGFncyAmPSB+QkZfV1JJVEVfTUFTSzsKKwkJfQorCQlpZiAocmVzZXRfY2hhbmdlZCAmJiBidWYtPmJfY2hhbmdlZCkKKwkJICAgIC8qIEJ1ZmZlciBzdGlsbCBjaGFuZ2VkLCB0aGUgYXV0b2NvbW1hbmRzIGRpZG4ndCB3b3JrCisJCSAgICAgKiBwcm9wZXJseS4gKi8KKwkJICAgIHJldHVybiBGQUlMOworCQlyZXR1cm4gT0s7CisJICAgIH0KKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgaWYgKCFhYm9ydGluZygpKQorI2VuZGlmCisJCUVNU0coXygiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKworCS8qCisJICogVGhlIGF1dG9jb21tYW5kcyBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGUuCisJICogV2hlbiB3cml0aW5nIHRoZSB3aG9sZSBmaWxlLCBhZGp1c3QgdGhlIGVuZC4KKwkgKiBXaGVuIHdyaXRpbmcgcGFydCBvZiB0aGUgZmlsZSwgYXNzdW1lIHRoYXQgdGhlIGF1dG9jb21tYW5kcyBvbmx5CisJICogY2hhbmdlZCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQgYXJlIHRvIGJlIHdyaXR0ZW4gKHRyaWNreSEpLgorCSAqLworCWlmIChidWYtPmJfbWwubWxfbGluZV9jb3VudCAhPSBvbGRfbGluZV9jb3VudCkKKwl7CisJICAgIGlmICh3aG9sZSkJCQkJCQkvKiB3cml0ZSBhbGwgKi8KKwkJZW5kID0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIGVsc2UgaWYgKGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID4gb2xkX2xpbmVfY291bnQpCS8qIG1vcmUgbGluZXMgKi8KKwkJZW5kICs9IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gb2xkX2xpbmVfY291bnQ7CisJICAgIGVsc2UJCQkJCQkvKiBsZXNzIGxpbmVzICovCisJICAgIHsKKwkJZW5kIC09IG9sZF9saW5lX2NvdW50IC0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCWlmIChlbmQgPCBzdGFydCkKKwkJeworCQkgICAgLS1ub193YWl0X3JldHVybjsKKwkJICAgIG1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKKwkJICAgIEVNU0coXygiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiKSk7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCSAgICB9CisJfQorCisJLyoKKwkgKiBUaGUgYXV0b2NvbW1hbmRzIG1heSBoYXZlIGNoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGJ1ZmZlciwgd2hpY2ggbWF5CisJICogYmUga2VwdCBpbiBmbmFtZSwgZmZuYW1lIGFuZCBzZm5hbWUuCisJICovCisJaWYgKGJ1Zl9mZm5hbWUpCisJICAgIGZmbmFtZSA9IGJ1Zi0+Yl9mZm5hbWU7CisJaWYgKGJ1Zl9zZm5hbWUpCisJICAgIHNmbmFtZSA9IGJ1Zi0+Yl9zZm5hbWU7CisJaWYgKGJ1Zl9mbmFtZV9mKQorCSAgICBmbmFtZSA9IGJ1Zi0+Yl9mZm5hbWU7CisJaWYgKGJ1Zl9mbmFtZV9zKQorCSAgICBmbmFtZSA9IGJ1Zi0+Yl9zZm5hbWU7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBpZiAodXNpbmdOZXRiZWFucyAmJiBpc05ldGJlYW5zQnVmZmVyKGJ1ZikpCisgICAgeworCWlmICh3aG9sZSkKKwl7CisJICAgIC8qCisJICAgICAqIGJfY2hhbmdlZCBjYW4gYmUgMCBhZnRlciBhbiB1bmRvLCBidXQgd2Ugc3RpbGwgbmVlZCB0byB3cml0ZQorCSAgICAgKiB0aGUgYnVmZmVyIHRvIE5ldEJlYW5zLgorCSAgICAgKi8KKwkgICAgaWYgKGJ1Zi0+Yl9jaGFuZ2VkIHx8IGlzTmV0YmVhbnNNb2RpZmllZChidWYpKQorCSAgICB7CisJCW5ldGJlYW5zX3NhdmVfYnVmZmVyKGJ1Zik7CisJCXJldHVybiByZXR2YWw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWVycm51bSA9IChjaGFyX3UgKikiRTY1NjogIjsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oIk5ldEJlYW5zIGRpc3NhbGxvd3Mgd3JpdGVzIG9mIHVubW9kaWZpZWQgYnVmZmVycyIpOworCQlidWZmZXIgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgZXJybnVtID0gKGNoYXJfdSAqKSJFNjU3OiAiOworCSAgICBlcnJtc2cgPSAoY2hhcl91ICopXygiUGFydGlhbCB3cml0ZXMgZGlzYWxsb3dlZCBmb3IgTmV0QmVhbnMgYnVmZmVycyIpOworCSAgICBidWZmZXIgPSBOVUxMOworCSAgICBnb3RvIGZhaWw7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHNob3J0bWVzcyhTSE1fT1ZFUikgJiYgIWV4aXRpbmcpCisJbXNnX3Njcm9sbCA9IEZBTFNFOwkgICAgLyogb3ZlcndyaXRlIHByZXZpb3VzIGZpbGUgbWVzc2FnZSAqLworICAgIGVsc2UKKwltc2dfc2Nyb2xsID0gVFJVRTsJICAgIC8qIGRvbid0IG92ZXJ3cml0ZSBwcmV2aW91cyBmaWxlIG1lc3NhZ2UgKi8KKyAgICBpZiAoIWZpbHRlcmluZykKKwlmaWxlbWVzcyhidWYsCisjaWZuZGVmIFVOSVgKKwkJc2ZuYW1lLAorI2Vsc2UKKwkJZm5hbWUsCisjZW5kaWYKKwkJICAgIChjaGFyX3UgKikiIiwgMCk7CS8qIHNob3cgdGhhdCB3ZSBhcmUgYnVzeSAqLworICAgIG1zZ19zY3JvbGwgPSBGQUxTRTsJCSAgICAvKiBhbHdheXMgb3ZlcndyaXRlIHRoZSBmaWxlIG1lc3NhZ2Ugbm93ICovCisKKyAgICBidWZmZXIgPSBhbGxvYyhCVUZTSVpFKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCQkgICAgLyogY2FuJ3QgYWxsb2NhdGUgYmlnIGJ1ZmZlciwgdXNlIHNtYWxsCisJCQkJICAgICAqIG9uZSAodG8gYmUgYWJsZSB0byB3cml0ZSB3aGVuIG91dCBvZgorCQkJCSAgICAgKiBtZW1vcnkpICovCisgICAgeworCWJ1ZmZlciA9IHNtYWxsYnVmOworCWJ1ZnNpemUgPSBTTUJVRlNJWkU7CisgICAgfQorICAgIGVsc2UKKwlidWZzaXplID0gQlVGU0laRTsKKworICAgIC8qCisgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IG9yaWdpbmFsIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuCisgICAgICovCisjaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChBUkNISUUpCisgICAgc3Rfb2xkLnN0X2RldiA9IHN0X29sZC5zdF9pbm8gPSAwOworICAgIHBlcm0gPSAtMTsKKyAgICBpZiAobWNoX3N0YXQoKGNoYXIgKilmbmFtZSwgJnN0X29sZCkgPCAwKQorCW5ld2ZpbGUgPSBUUlVFOworICAgIGVsc2UKKyAgICB7CisJcGVybSA9IHN0X29sZC5zdF9tb2RlOworCWlmICghU19JU1JFRyhzdF9vbGQuc3RfbW9kZSkpCQkvKiBub3QgYSBmaWxlICovCisJeworCSAgICBpZiAoU19JU0RJUihzdF9vbGQuc3RfbW9kZSkpCisJICAgIHsKKwkJZXJybnVtID0gKGNoYXJfdSAqKSJFNTAyOiAiOworCQllcnJtc2cgPSAoY2hhcl91ICopXygiaXMgYSBkaXJlY3RvcnkiKTsKKwkJZ290byBmYWlsOworCSAgICB9CisJICAgIGlmIChtY2hfbm9kZXR5cGUoZm5hbWUpICE9IE5PREVfV1JJVEFCTEUpCisJICAgIHsKKwkJZXJybnVtID0gKGNoYXJfdSAqKSJFNTAzOiAiOworCQllcnJtc2cgPSAoY2hhcl91ICopXygiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiKTsKKwkJZ290byBmYWlsOworCSAgICB9CisJICAgIC8qIEl0J3MgYSBkZXZpY2Ugb2Ygc29tZSBraW5kIChvciBhIGZpZm8pIHdoaWNoIHdlIGNhbiB3cml0ZSB0bworCSAgICAgKiBidXQgZm9yIHdoaWNoIHdlIGNhbid0IG1ha2UgYSBiYWNrdXAuICovCisJICAgIGRldmljZSA9IFRSVUU7CisJICAgIG5ld2ZpbGUgPSBUUlVFOworCSAgICBwZXJtID0gLTE7CisJfQorICAgIH0KKyNlbHNlIC8qICFVTklYICovCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYSB3cml0YWJsZSBkZXZpY2UgbmFtZS4KKyAgICAgKi8KKyAgICBjID0gbWNoX25vZGV0eXBlKGZuYW1lKTsKKyAgICBpZiAoYyA9PSBOT0RFX09USEVSKQorICAgIHsKKwllcnJudW0gPSAoY2hhcl91ICopIkU1MDM6ICI7CisJZXJybXNnID0gKGNoYXJfdSAqKV8oImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIik7CisJZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoYyA9PSBOT0RFX1dSSVRBQkxFKQorICAgIHsKKwlkZXZpY2UgPSBUUlVFOworCW5ld2ZpbGUgPSBUUlVFOworCXBlcm0gPSAtMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlwZXJtID0gbWNoX2dldHBlcm0oZm5hbWUpOworCWlmIChwZXJtIDwgMCkKKwkgICAgbmV3ZmlsZSA9IFRSVUU7CisJZWxzZSBpZiAobWNoX2lzZGlyKGZuYW1lKSkKKwl7CisJICAgIGVycm51bSA9IChjaGFyX3UgKikiRTUwMjogIjsKKwkgICAgZXJybXNnID0gKGNoYXJfdSAqKV8oImlzIGEgZGlyZWN0b3J5Iik7CisJICAgIGdvdG8gZmFpbDsKKwl9CisJaWYgKG92ZXJ3cml0aW5nKQorCSAgICAodm9pZCltY2hfc3RhdCgoY2hhciAqKWZuYW1lLCAmc3Rfb2xkKTsKKyAgICB9CisjZW5kaWYgLyogIVVOSVggKi8KKworICAgIGlmICghZGV2aWNlICYmICFuZXdmaWxlKQorICAgIHsKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBmaWxlIGlzIHJlYWxseSB3cml0YWJsZSAod2hlbiByZW5hbWluZyB0aGUgZmlsZSB0bworCSAqIG1ha2UgYSBiYWNrdXAgd2Ugd29uJ3QgZGlzY292ZXIgaXQgbGF0ZXIpLgorCSAqLworCWZpbGVfcmVhZG9ubHkgPSAoCisjIGlmZGVmIFVTRV9NQ0hfQUNDRVNTCisjICBpZmRlZiBVTklYCisJCSAgICAocGVybSAmIDAyMjIpID09IDAgfHwKKyMgIGVuZGlmCisJCSAgICBtY2hfYWNjZXNzKChjaGFyICopZm5hbWUsIFdfT0spCisjIGVsc2UKKwkJICAgIChmZCA9IG1jaF9vcGVuKChjaGFyICopZm5hbWUsIE9fUkRXUiB8IE9fRVhUUkEsIDApKSA8IDAKKwkJCQkJCSAgID8gVFJVRSA6IChjbG9zZShmZCksIEZBTFNFKQorIyBlbmRpZgorCQkgICAgKTsKKwlpZiAoIWZvcmNlaXQgJiYgZmlsZV9yZWFkb25seSkKKwl7CisJICAgIGlmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRldSSVRFKSAhPSBOVUxMKQorCSAgICB7CisJCWVycm51bSA9IChjaGFyX3UgKikiRTUwNDogIjsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oZXJyX3JlYWRvbmx5KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZXJybnVtID0gKGNoYXJfdSAqKSJFNTA1OiAiOworCQllcnJtc2cgPSAoY2hhcl91ICopXygiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiKTsKKwkgICAgfQorCSAgICBnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdGltZXN0YW1wIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgdGhlIGZpbGUuCisJICovCisJaWYgKG92ZXJ3cml0aW5nKQorCXsKKwkgICAgcmV0dmFsID0gY2hlY2tfbXRpbWUoYnVmLCAmc3Rfb2xkKTsKKwkgICAgaWYgKHJldHZhbCA9PSBGQUlMKQorCQlnb3RvIGZhaWw7CisJfQorICAgIH0KKworI2lmZGVmIEhBVkVfQUNMCisgICAgLyoKKyAgICAgKiBGb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgQUNMOiBnZXQgdGhlIEFDTCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAqLworICAgIGlmICghbmV3ZmlsZSkKKwlhY2wgPSBtY2hfZ2V0X2FjbChmbmFtZSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgJ2JhY2t1cHNraXAnIGlzIG5vdCBlbXB0eSwgZG9uJ3QgbWFrZSBhIGJhY2t1cCBmb3Igc29tZSBmaWxlcy4KKyAgICAgKi8KKyAgICBkb2JhY2t1cCA9IChwX3diIHx8IHBfYmsgfHwgKnBfcG0gIT0gTlVMKTsKKyNpZmRlZiBGRUFUX1dJTERJR04KKyAgICBpZiAoZG9iYWNrdXAgJiYgKnBfYnNrICE9IE5VTCAmJiBtYXRjaF9maWxlX2xpc3QocF9ic2ssIHNmbmFtZSwgZmZuYW1lKSkKKwlkb2JhY2t1cCA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIHZhbHVlIG9mIGdvdF9pbnQgYW5kIHJlc2V0IGl0LiAgV2UgZG9uJ3Qgd2FudCBhIHByZXZpb3VzCisgICAgICogaW50ZXJydXB0aW9uIGNhbmNlbCB3cml0aW5nLCBvbmx5IGhpdHRpbmcgQ1RSTC1DIHdoaWxlIHdyaXRpbmcgc2hvdWxkCisgICAgICogYWJvcnQgaXQuCisgICAgICovCisgICAgcHJldl9nb3RfaW50ID0gZ290X2ludDsKKyAgICBnb3RfaW50ID0gRkFMU0U7CisKKyAgICAvKiBNYXJrIHRoZSBidWZmZXIgYXMgJ2JlaW5nIHNhdmVkJyB0byBwcmV2ZW50IGNoYW5nZWQgYnVmZmVyIHdhcm5pbmdzICovCisgICAgYnVmLT5iX3NhdmluZyA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIElmIHdlIGFyZSBub3QgYXBwZW5kaW5nIG9yIGZpbHRlcmluZywgdGhlIGZpbGUgZXhpc3RzLCBhbmQgdGhlCisgICAgICogJ3dyaXRlYmFja3VwJywgJ2JhY2t1cCcgb3IgJ3BhdGNobW9kZScgb3B0aW9uIGlzIHNldCwgbmVlZCBhIGJhY2t1cC4KKyAgICAgKiBXaGVuICdwYXRjaG1vZGUnIGlzIHNldCBhbHNvIG1ha2UgYSBiYWNrdXAgd2hlbiBhcHBlbmRpbmcuCisgICAgICoKKyAgICAgKiBEbyBub3QgbWFrZSBhbnkgYmFja3VwLCBpZiAnd3JpdGViYWNrdXAnIGFuZCAnYmFja3VwJyBhcmUgYm90aCBzd2l0Y2hlZAorICAgICAqIG9mZi4gIFRoaXMgaGVscHMgd2hlbiBlZGl0aW5nIGxhcmdlIGZpbGVzIG9uIGFsbW9zdC1mdWxsIGRpc2tzLgorICAgICAqLworICAgIGlmICghKGFwcGVuZCAmJiAqcF9wbSA9PSBOVUwpICYmICFmaWx0ZXJpbmcgJiYgcGVybSA+PSAwICYmIGRvYmFja3VwKQorICAgIHsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoV0lOMzIpCisJc3RydWN0IHN0YXQgc3Q7CisjZW5kaWYKKworCWlmICgoYmtjX2ZsYWdzICYgQktDX1lFUykgfHwgYXBwZW5kKQkvKiAieWVzIiAqLworCSAgICBiYWNrdXBfY29weSA9IFRSVUU7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFdJTjMyKQorCWVsc2UgaWYgKChia2NfZmxhZ3MgJiBCS0NfQVVUTykpCS8qICJhdXRvIiAqLworCXsKKwkgICAgaW50CQlpOworCisjIGlmZGVmIFVOSVgKKwkgICAgLyoKKwkgICAgICogRG9uJ3QgcmVuYW1lIHRoZSBmaWxlIHdoZW46CisJICAgICAqIC0gaXQncyBhIGhhcmQgbGluaworCSAgICAgKiAtIGl0J3MgYSBzeW1ib2xpYyBsaW5rCisJICAgICAqIC0gd2UgZG9uJ3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIGluIHRoZSBkaXJlY3RvcnkKKwkgICAgICogLSB3ZSBjYW4ndCBzZXQgdGhlIG93bmVyL2dyb3VwIG9mIHRoZSBuZXcgZmlsZQorCSAgICAgKi8KKwkgICAgaWYgKHN0X29sZC5zdF9ubGluayA+IDEKKwkJICAgIHx8IG1jaF9sc3RhdCgoY2hhciAqKWZuYW1lLCAmc3QpIDwgMAorCQkgICAgfHwgc3Quc3RfZGV2ICE9IHN0X29sZC5zdF9kZXYKKwkJICAgIHx8IHN0LnN0X2lubyAhPSBzdF9vbGQuc3RfaW5vKQorCQliYWNrdXBfY29weSA9IFRSVUU7CisJICAgIGVsc2UKKyMgZW5kaWYKKwkgICAgeworCQkvKgorCQkgKiBDaGVjayBpZiB3ZSBjYW4gY3JlYXRlIGEgZmlsZSBhbmQgc2V0IHRoZSBvd25lci9ncm91cCB0bworCQkgKiB0aGUgb25lcyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLgorCQkgKiBGaXJzdCBmaW5kIGEgZmlsZSBuYW1lIHRoYXQgZG9lc24ndCBleGlzdCB5ZXQgKHVzZSBzb21lCisJCSAqIGFyYml0cmFyeSBudW1iZXJzKS4KKwkJICovCisJCVNUUkNQWShJT2J1ZmYsIGZuYW1lKTsKKwkJZm9yIChpID0gNDkxMzsgOyBpICs9IDEyMykKKwkJeworCQkgICAgc3ByaW50ZigoY2hhciAqKWdldHRhaWwoSU9idWZmKSwgIiVkIiwgaSk7CisJCSAgICBpZiAobWNoX3N0YXQoKGNoYXIgKilJT2J1ZmYsICZzdCkgPCAwKQorCQkJYnJlYWs7CisJCX0KKwkJZmQgPSBtY2hfb3BlbigoY2hhciAqKUlPYnVmZiwgT19DUkVBVHxPX1dST05MWXxPX0VYQ0wsIHBlcm0pOworCQljbG9zZShmZCk7CisJCWlmIChmZCA8IDApCS8qIGNhbid0IHdyaXRlIGluIGRpcmVjdG9yeSAqLworCQkgICAgYmFja3VwX2NvcHkgPSBUUlVFOworCQllbHNlCisJCXsKKyMgaWZkZWYgVU5JWAorCQkgICAgY2hvd24oKGNoYXIgKilJT2J1ZmYsIHN0X29sZC5zdF91aWQsIHN0X29sZC5zdF9naWQpOworCQkgICAgKHZvaWQpbWNoX3NldHBlcm0oSU9idWZmLCBwZXJtKTsKKwkJICAgIGlmIChtY2hfc3RhdCgoY2hhciAqKUlPYnVmZiwgJnN0KSA8IDAKKwkJCSAgICB8fCBzdC5zdF91aWQgIT0gc3Rfb2xkLnN0X3VpZAorCQkJICAgIHx8IHN0LnN0X2dpZCAhPSBzdF9vbGQuc3RfZ2lkCisJCQkgICAgfHwgc3Quc3RfbW9kZSAhPSBwZXJtKQorCQkJYmFja3VwX2NvcHkgPSBUUlVFOworIyBlbmRpZgorCQkgICAgbWNoX3JlbW92ZShJT2J1ZmYpOworCQl9CisJICAgIH0KKwl9CisKKyMgaWZkZWYgVU5JWAorCS8qCisJICogQnJlYWsgc3ltbGlua3MgYW5kL29yIGhhcmRsaW5rcyBpZiB3ZSd2ZSBiZWVuIGFza2VkIHRvLgorCSAqLworCWlmICgoYmtjX2ZsYWdzICYgQktDX0JSRUFLU1lNTElOSykgfHwgKGJrY19mbGFncyAmIEJLQ19CUkVBS0hBUkRMSU5LKSkKKwl7CisJICAgIGludAlsc3RhdF9yZXM7CisKKwkgICAgbHN0YXRfcmVzID0gbWNoX2xzdGF0KChjaGFyICopZm5hbWUsICZzdCk7CisKKwkgICAgLyogU3ltbGlua3MuICovCisJICAgIGlmICgoYmtjX2ZsYWdzICYgQktDX0JSRUFLU1lNTElOSykKKwkJICAgICYmIGxzdGF0X3JlcyA9PSAwCisJCSAgICAmJiBzdC5zdF9pbm8gIT0gc3Rfb2xkLnN0X2lubykKKwkJYmFja3VwX2NvcHkgPSBGQUxTRTsKKworCSAgICAvKiBIYXJkbGlua3MuICovCisJICAgIGlmICgoYmtjX2ZsYWdzICYgQktDX0JSRUFLSEFSRExJTkspCisJCSAgICAmJiBzdF9vbGQuc3RfbmxpbmsgPiAxCisJCSAgICAmJiAobHN0YXRfcmVzICE9IDAgfHwgc3Quc3RfaW5vID09IHN0X29sZC5zdF9pbm8pKQorCQliYWNrdXBfY29weSA9IEZBTFNFOworCX0KKyNlbmRpZgorCisjZW5kaWYKKworCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgYmFja3VwIGV4dGVuc2lvbiB0byB1c2UgKi8KKwlpZiAoKnBfYmV4ID09IE5VTCkKKwl7CisjaWZkZWYgUklTQ09TCisJICAgIGJhY2t1cF9leHQgPSAoY2hhcl91ICopIi9iYWsiOworI2Vsc2UKKwkgICAgYmFja3VwX2V4dCA9IChjaGFyX3UgKikiLmJhayI7CisjZW5kaWYKKwl9CisJZWxzZQorCSAgICBiYWNrdXBfZXh0ID0gcF9iZXg7CisKKwlpZiAoYmFja3VwX2NvcHkKKwkJJiYgKGZkID0gbWNoX29wZW4oKGNoYXIgKilmbmFtZSwgT19SRE9OTFkgfCBPX0VYVFJBLCAwKSkgPj0gMCkKKwl7CisJICAgIGludAkJYmZkOworCSAgICBjaGFyX3UJKmNvcHlidWYsICp3cDsKKwkgICAgaW50CQlzb21lX2Vycm9yID0gRkFMU0U7CisJICAgIHN0cnVjdCBzdGF0CXN0X25ldzsKKwkgICAgY2hhcl91CSpkaXJwOworCSAgICBjaGFyX3UJKnJvb3RuYW1lOworI2lmbmRlZiBTSE9SVF9GTkFNRQorCSAgICBpbnQJCWRpZF9zZXRfc2hvcnRuYW1lOworI2VuZGlmCisKKwkgICAgY29weWJ1ZiA9IGFsbG9jKEJVRlNJWkUgKyAxKTsKKwkgICAgaWYgKGNvcHlidWYgPT0gTlVMTCkKKwkgICAgeworCQlzb21lX2Vycm9yID0gVFJVRTsJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwkJZ290byBub2JhY2t1cDsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFRyeSB0byBtYWtlIHRoZSBiYWNrdXAgaW4gZWFjaCBkaXJlY3RvcnkgaW4gdGhlICdiZGlyJyBvcHRpb24uCisJICAgICAqCisJICAgICAqIFVuaXggc2VtYW50aWNzIGhhcyBpdCwgdGhhdCB3ZSBtYXkgaGF2ZSBhIHdyaXRhYmxlIGZpbGUsCisJICAgICAqIHRoYXQgY2Fubm90IGJlIHJlY3JlYXRlZCB3aXRoIGEgc2ltcGxlIG9wZW4oLi4uLCBPX0NSRUFULCApIGUuZzoKKwkgICAgICogIC0gdGhlIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUsCisJICAgICAqICAtIHRoZSBmaWxlIG1heSBiZSBhIHN5bWJvbGljIGxpbmssCisJICAgICAqICAtIHRoZSBmaWxlIG1heSBiZWxvbmcgdG8gYW5vdGhlciB1c2VyL2dyb3VwLCBldGMuCisJICAgICAqCisJICAgICAqIEZvciB0aGVzZSByZWFzb25zLCB0aGUgZXhpc3Rpbmcgd3JpdGFibGUgZmlsZSBtdXN0IGJlIHRydW5jYXRlZAorCSAgICAgKiBhbmQgcmV1c2VkLiBDcmVhdGlvbiBvZiBhIGJhY2t1cCBDT1BZIHdpbGwgYmUgYXR0ZW1wdGVkLgorCSAgICAgKi8KKwkgICAgZGlycCA9IHBfYmRpcjsKKwkgICAgd2hpbGUgKCpkaXJwKQorCSAgICB7CisjaWZkZWYgVU5JWAorCQlzdF9uZXcuc3RfaW5vID0gMDsKKwkJc3RfbmV3LnN0X2RldiA9IDA7CisJCXN0X25ldy5zdF9naWQgPSAwOworI2VuZGlmCisKKwkJLyoKKwkJICogSXNvbGF0ZSBvbmUgZGlyZWN0b3J5IG5hbWUsIHVzaW5nIGFuIGVudHJ5IGluICdiZGlyJy4KKwkJICovCisJCSh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJmRpcnAsIGNvcHlidWYsIEJVRlNJWkUsICIsIik7CisJCXJvb3RuYW1lID0gZ2V0X2ZpbGVfaW5fZGlyKGZuYW1lLCBjb3B5YnVmKTsKKwkJaWYgKHJvb3RuYW1lID09IE5VTEwpCisJCXsKKwkJICAgIHNvbWVfZXJyb3IgPSBUUlVFOwkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCQkgICAgZ290byBub2JhY2t1cDsKKwkJfQorCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisJCWRpZF9zZXRfc2hvcnRuYW1lID0gRkFMU0U7CisjZW5kaWYKKworCQkvKgorCQkgKiBNYXkgdHJ5IHR3aWNlIGlmICdzaG9ydG5hbWUnIG5vdCBzZXQuCisJCSAqLworCQlmb3IgKDs7KQorCQl7CisJCSAgICAvKgorCQkgICAgICogTWFrZSBiYWNrdXAgZmlsZSBuYW1lLgorCQkgICAgICovCisJCSAgICBiYWNrdXAgPSBidWZfbW9kbmFtZSgKKyNpZmRlZiBTSE9SVF9GTkFNRQorCQkJICAgIFRSVUUsCisjZWxzZQorCQkJICAgIChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKKyNlbmRpZgorCQkJCQkJIHJvb3RuYW1lLCBiYWNrdXBfZXh0LCBGQUxTRSk7CisJCSAgICBpZiAoYmFja3VwID09IE5VTEwpCisJCSAgICB7CisJCQl2aW1fZnJlZShyb290bmFtZSk7CisJCQlzb21lX2Vycm9yID0gVFJVRTsJCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJCWdvdG8gbm9iYWNrdXA7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBDaGVjayBpZiBiYWNrdXAgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKwkJICAgICAqLworCQkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopYmFja3VwLCAmc3RfbmV3KSA+PSAwKQorCQkgICAgeworI2lmZGVmIFVOSVgKKwkJCS8qCisJCQkgKiBDaGVjayBpZiBiYWNrdXAgZmlsZSBpcyBzYW1lIGFzIG9yaWdpbmFsIGZpbGUuCisJCQkgKiBNYXkgaGFwcGVuIHdoZW4gbW9kbmFtZSgpIGdhdmUgdGhlIHNhbWUgZmlsZSBiYWNrLgorCQkJICogRS5nLiBzaWxseSBsaW5rLCBvciBmaWxlIG5hbWUtbGVuZ3RoIHJlYWNoZWQuCisJCQkgKiBJZiB3ZSBkb24ndCBjaGVjayBoZXJlLCB3ZSBlaXRoZXIgcnVpbiB0aGUgZmlsZQorCQkJICogd2hlbiBjb3B5aW5nIG9yIGVyYXNlIGl0IGFmdGVyIHdyaXRpbmcuIGp3LgorCQkJICovCisJCQlpZiAoc3RfbmV3LnN0X2RldiA9PSBzdF9vbGQuc3RfZGV2CisJCQkJCSAgICAmJiBzdF9uZXcuc3RfaW5vID09IHN0X29sZC5zdF9pbm8pCisJCQl7CisJCQkgICAgdmltX2ZyZWUoYmFja3VwKTsKKwkJCSAgICBiYWNrdXAgPSBOVUxMOwkvKiBubyBiYWNrdXAgZmlsZSB0byBkZWxldGUgKi8KKyMgaWZuZGVmIFNIT1JUX0ZOQU1FCisJCQkgICAgLyoKKwkJCSAgICAgKiBtYXkgdHJ5IGFnYWluIHdpdGggJ3Nob3J0bmFtZScgc2V0CisJCQkgICAgICovCisJCQkgICAgaWYgKCEoYnVmLT5iX3Nob3J0bmFtZSB8fCBidWYtPmJfcF9zbikpCisJCQkgICAgeworCQkJCWJ1Zi0+Yl9zaG9ydG5hbWUgPSBUUlVFOworCQkJCWRpZF9zZXRfc2hvcnRuYW1lID0gVFJVRTsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQkJLyogc2V0dGluZyBzaG9ydG5hbWUgZGlkbid0IGhlbHAgKi8KKwkJCSAgICBpZiAoZGlkX3NldF9zaG9ydG5hbWUpCisJCQkJYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOworIyBlbmRpZgorCQkJICAgIGJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgbm90IGdvaW5nIHRvIGtlZXAgdGhlIGJhY2t1cCBmaWxlLCBkb24ndAorCQkJICogZGVsZXRlIGFuIGV4aXN0aW5nIG9uZSwgdHJ5IHRvIHVzZSBhbm90aGVyIG5hbWUuCisJCQkgKiBDaGFuZ2Ugb25lIGNoYXJhY3RlciwganVzdCBiZWZvcmUgdGhlIGV4dGVuc2lvbi4KKwkJCSAqLworCQkJaWYgKCFwX2JrKQorCQkJeworCQkJICAgIHdwID0gYmFja3VwICsgU1RSTEVOKGJhY2t1cCkgLSAxCisJCQkJCQkJIC0gU1RSTEVOKGJhY2t1cF9leHQpOworCQkJICAgIGlmICh3cCA8IGJhY2t1cCkJLyogZW1wdHkgZmlsZSBuYW1lID8/PyAqLworCQkJCXdwID0gYmFja3VwOworCQkJICAgICp3cCA9ICd6JzsKKwkJCSAgICB3aGlsZSAoKndwID4gJ2EnCisJCQkJICAgICYmIG1jaF9zdGF0KChjaGFyICopYmFja3VwLCAmc3RfbmV3KSA+PSAwKQorCQkJCS0tKndwOworCQkJICAgIC8qIFRoZXkgYWxsIGV4aXN0Pz8/IE11c3QgYmUgc29tZXRoaW5nIHdyb25nLiAqLworCQkJICAgIGlmICgqd3AgPT0gJ2EnKQorCQkJICAgIHsKKwkJCQl2aW1fZnJlZShiYWNrdXApOworCQkJCWJhY2t1cCA9IE5VTEw7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkJdmltX2ZyZWUocm9vdG5hbWUpOworCisJCS8qCisJCSAqIFRyeSB0byBjcmVhdGUgdGhlIGJhY2t1cCBmaWxlCisJCSAqLworCQlpZiAoYmFja3VwICE9IE5VTEwpCisJCXsKKwkJICAgIC8qIHJlbW92ZSBvbGQgYmFja3VwLCBpZiBwcmVzZW50ICovCisJCSAgICBtY2hfcmVtb3ZlKGJhY2t1cCk7CisJCSAgICAvKiBPcGVuIHdpdGggT19FWENMIHRvIGF2b2lkIHRoZSBmaWxlIGJlaW5nIGNyZWF0ZWQgd2hpbGUKKwkJICAgICAqIHdlIHdlcmUgc2xlZXBpbmcgKHN5bWxpbmsgaGFja2VyIGF0dGFjaz8pICovCisJCSAgICBiZmQgPSBtY2hfb3BlbigoY2hhciAqKWJhY2t1cCwKKwkJCQkgICAgICAgT19XUk9OTFl8T19DUkVBVHxPX0VYVFJBfE9fRVhDTCwgMDY2Nik7CisJCSAgICBpZiAoYmZkIDwgMCkKKwkJICAgIHsKKwkJCXZpbV9mcmVlKGJhY2t1cCk7CisJCQliYWNrdXAgPSBOVUxMOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogc2V0IGZpbGUgcHJvdGVjdGlvbiBzYW1lIGFzIG9yaWdpbmFsIGZpbGUsIGJ1dAorCQkJICogc3RyaXAgcy1iaXQgKi8KKwkJCSh2b2lkKW1jaF9zZXRwZXJtKGJhY2t1cCwgcGVybSAmIDA3NzcpOworCisjaWZkZWYgVU5JWAorCQkJLyoKKwkJCSAqIFRyeSB0byBzZXQgdGhlIGdyb3VwIG9mIHRoZSBiYWNrdXAgc2FtZSBhcyB0aGUKKwkJCSAqIG9yaWdpbmFsIGZpbGUuIElmIHRoaXMgZmFpbHMsIHNldCB0aGUgcHJvdGVjdGlvbgorCQkJICogYml0cyBmb3IgdGhlIGdyb3VwIHNhbWUgYXMgdGhlIHByb3RlY3Rpb24gYml0cyBmb3IKKwkJCSAqIG90aGVycy4KKwkJCSAqLworCQkJaWYgKHN0X25ldy5zdF9naWQgIT0gc3Rfb2xkLnN0X2dpZCAmJgorIyBpZmRlZiBIQVZFX0ZDSE9XTiAgLyogc2VxdWVudC1wdHggbGFja3MgZmNob3duKCkgKi8KKwkJCQkgICAgZmNob3duKGJmZCwgKHVpZF90KS0xLCBzdF9vbGQuc3RfZ2lkKSAhPSAwCisjIGVsc2UKKwkJCSAgY2hvd24oKGNoYXIgKiliYWNrdXAsICh1aWRfdCktMSwgc3Rfb2xkLnN0X2dpZCkgIT0gMAorIyBlbmRpZgorCQkJCQkJKQorCQkJICAgIG1jaF9zZXRwZXJtKGJhY2t1cCwKKwkJCQkJICAocGVybSAmIDA3MDcpIHwgKChwZXJtICYgMDcpIDw8IDMpKTsKKyNlbmRpZgorCisJCQkvKgorCQkJICogY29weSB0aGUgZmlsZS4KKwkJCSAqLworCQkJd3JpdGVfaW5mby5id19mZCA9IGJmZDsKKwkJCXdyaXRlX2luZm8uYndfYnVmID0gY29weWJ1ZjsKKyNpZmRlZiBIQVNfQldfRkxBR1MKKwkJCXdyaXRlX2luZm8uYndfZmxhZ3MgPSBGSU9fTk9DT05WRVJUOworI2VuZGlmCisJCQl3aGlsZSAoKHdyaXRlX2luZm8uYndfbGVuID0gdmltX3JlYWQoZmQsIGNvcHlidWYsCisJCQkJCQkJCUJVRlNJWkUpKSA+IDApCisJCQl7CisJCQkgICAgaWYgKGJ1Zl93cml0ZV9ieXRlcygmd3JpdGVfaW5mbykgPT0gRkFJTCkKKwkJCSAgICB7CisJCQkJZXJybXNnID0gKGNoYXJfdSAqKV8oIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiKTsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQkgICAgdWlfYnJlYWtjaGVjaygpOworCQkJICAgIGlmIChnb3RfaW50KQorCQkJICAgIHsKKwkJCQllcnJtc2cgPSAoY2hhcl91ICopXyhlX2ludGVycik7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfQorCisJCQlpZiAoY2xvc2UoYmZkKSA8IDAgJiYgZXJybXNnID09IE5VTEwpCisJCQkgICAgZXJybXNnID0gKGNoYXJfdSAqKV8oIkU1MDc6IENsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIik7CisJCQlpZiAod3JpdGVfaW5mby5id19sZW4gPCAwKQorCQkJICAgIGVycm1zZyA9IChjaGFyX3UgKilfKCJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIik7CisjaWZkZWYgVU5JWAorCQkJc2V0X2ZpbGVfdGltZShiYWNrdXAsIHN0X29sZC5zdF9hdGltZSwgc3Rfb2xkLnN0X210aW1lKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQUNMCisJCQltY2hfc2V0X2FjbChiYWNrdXAsIGFjbCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKyAgICBub2JhY2t1cDoKKwkgICAgY2xvc2UoZmQpOwkJLyogaWdub3JlIGVycm9ycyBmb3IgY2xvc2luZyByZWFkIGZpbGUgKi8KKwkgICAgdmltX2ZyZWUoY29weWJ1Zik7CisKKwkgICAgaWYgKGJhY2t1cCA9PSBOVUxMICYmIGVycm1zZyA9PSBOVUxMKQorCQllcnJtc2cgPSAoY2hhcl91ICopXygiRTUwOTogQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIik7CisJICAgIC8qIGlnbm9yZSBlcnJvcnMgd2hlbiBmb3JjZWl0IGlzIFRSVUUgKi8KKwkgICAgaWYgKChzb21lX2Vycm9yIHx8IGVycm1zZyAhPSBOVUxMKSAmJiAhZm9yY2VpdCkKKwkgICAgeworCQlyZXR2YWwgPSBGQUlMOworCQlnb3RvIGZhaWw7CisJICAgIH0KKwkgICAgZXJybXNnID0gTlVMTDsKKwl9CisJZWxzZQorCXsKKwkgICAgY2hhcl91CSpkaXJwOworCSAgICBjaGFyX3UJKnA7CisJICAgIGNoYXJfdQkqcm9vdG5hbWU7CisKKwkgICAgLyoKKwkgICAgICogTWFrZSBhIGJhY2t1cCBieSByZW5hbWluZyB0aGUgb3JpZ2luYWwgZmlsZS4KKwkgICAgICovCisJICAgIC8qCisJICAgICAqIElmICdjcG9wdGlvbnMnIGluY2x1ZGVzIHRoZSAiVyIgZmxhZywgd2UgZG9uJ3Qgd2FudCB0bworCSAgICAgKiBvdmVyd3JpdGUgYSByZWFkLW9ubHkgZmlsZS4gIEJ1dCByZW5hbWUgbWF5IGJlIHBvc3NpYmxlCisJICAgICAqIGFueXdheSwgdGh1cyB3ZSBuZWVkIGFuIGV4dHJhIGNoZWNrIGhlcmUuCisJICAgICAqLworCSAgICBpZiAoZmlsZV9yZWFkb25seSAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRldSSVRFKSAhPSBOVUxMKQorCSAgICB7CisJCWVycm51bSA9IChjaGFyX3UgKikiRTUwNDogIjsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oZXJyX3JlYWRvbmx5KTsKKwkJZ290byBmYWlsOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICoKKwkgICAgICogRm9ybSB0aGUgYmFja3VwIGZpbGUgbmFtZSAtIGNoYW5nZSBwYXRoL2ZvLm8uaCB0bworCSAgICAgKiBwYXRoL2ZvLm8uaC5iYWsgVHJ5IGFsbCBkaXJlY3RvcmllcyBpbiAnYmFja3VwZGlyJywgZmlyc3Qgb25lCisJICAgICAqIHRoYXQgd29ya3MgaXMgdXNlZC4KKwkgICAgICovCisJICAgIGRpcnAgPSBwX2JkaXI7CisJICAgIHdoaWxlICgqZGlycCkKKwkgICAgeworCQkvKgorCQkgKiBJc29sYXRlIG9uZSBkaXJlY3RvcnkgbmFtZSBhbmQgbWFrZSB0aGUgYmFja3VwIGZpbGUgbmFtZS4KKwkJICovCisJCSh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJmRpcnAsIElPYnVmZiwgSU9TSVpFLCAiLCIpOworCQlyb290bmFtZSA9IGdldF9maWxlX2luX2RpcihmbmFtZSwgSU9idWZmKTsKKwkJaWYgKHJvb3RuYW1lID09IE5VTEwpCisJCSAgICBiYWNrdXAgPSBOVUxMOworCQllbHNlCisJCXsKKwkJICAgIGJhY2t1cCA9IGJ1Zl9tb2RuYW1lKAorI2lmZGVmIFNIT1JUX0ZOQU1FCisJCQkgICAgVFJVRSwKKyNlbHNlCisJCQkgICAgKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAorI2VuZGlmCisJCQkJCQkgcm9vdG5hbWUsIGJhY2t1cF9leHQsIEZBTFNFKTsKKwkJICAgIHZpbV9mcmVlKHJvb3RuYW1lKTsKKwkJfQorCisJCWlmIChiYWNrdXAgIT0gTlVMTCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIElmIHdlIGFyZSBub3QgZ29pbmcgdG8ga2VlcCB0aGUgYmFja3VwIGZpbGUsIGRvbid0CisJCSAgICAgKiBkZWxldGUgYW4gZXhpc3Rpbmcgb25lLCB0cnkgdG8gdXNlIGFub3RoZXIgbmFtZS4KKwkJICAgICAqIENoYW5nZSBvbmUgY2hhcmFjdGVyLCBqdXN0IGJlZm9yZSB0aGUgZXh0ZW5zaW9uLgorCQkgICAgICovCisJCSAgICBpZiAoIXBfYmsgJiYgbWNoX2dldHBlcm0oYmFja3VwKSA+PSAwKQorCQkgICAgeworCQkJcCA9IGJhY2t1cCArIFNUUkxFTihiYWNrdXApIC0gMSAtIFNUUkxFTihiYWNrdXBfZXh0KTsKKwkJCWlmIChwIDwgYmFja3VwKQkvKiBlbXB0eSBmaWxlIG5hbWUgPz8/ICovCisJCQkgICAgcCA9IGJhY2t1cDsKKwkJCSpwID0gJ3onOworCQkJd2hpbGUgKCpwID4gJ2EnICYmIG1jaF9nZXRwZXJtKGJhY2t1cCkgPj0gMCkKKwkJCSAgICAtLSpwOworCQkJLyogVGhleSBhbGwgZXhpc3Q/Pz8gTXVzdCBiZSBzb21ldGhpbmcgd3JvbmchICovCisJCQlpZiAoKnAgPT0gJ2EnKQorCQkJeworCQkJICAgIHZpbV9mcmVlKGJhY2t1cCk7CisJCQkgICAgYmFja3VwID0gTlVMTDsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlpZiAoYmFja3VwICE9IE5VTEwpCisJCXsKKworCQkgICAgLyoKKwkJICAgICAqIERlbGV0ZSBhbnkgZXhpc3RpbmcgYmFja3VwIGFuZCBtb3ZlIHRoZSBjdXJyZW50IHZlcnNpb24gdG8KKwkJICAgICAqIHRoZSBiYWNrdXAuCUZvciBzYWZldHksIHdlIGRvbid0IHJlbW92ZSB0aGUgYmFja3VwIHVudGlsCisJCSAgICAgKiB0aGUgd3JpdGUgaGFzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4gQW5kIGlmIHRoZSAnYmFja3VwJworCQkgICAgICogb3B0aW9uIGlzIHNldCwgbGVhdmUgaXQgYXJvdW5kLgorCQkgICAgICovCisJCSAgICAvKgorCQkgICAgICogSWYgdGhlIHJlbmFtaW5nIG9mIHRoZSBvcmlnaW5hbCBmaWxlIHRvIHRoZSBiYWNrdXAgZmlsZQorCQkgICAgICogd29ya3MsIHF1aXQgaGVyZS4KKwkJICAgICAqLworCQkgICAgaWYgKHZpbV9yZW5hbWUoZm5hbWUsIGJhY2t1cCkgPT0gMCkKKwkJCWJyZWFrOworCisJCSAgICB2aW1fZnJlZShiYWNrdXApOyAgIC8qIGRvbid0IGRvIHRoZSByZW5hbWUgYmVsb3cgKi8KKwkJICAgIGJhY2t1cCA9IE5VTEw7CisJCX0KKwkgICAgfQorCSAgICBpZiAoYmFja3VwID09IE5VTEwgJiYgIWZvcmNlaXQpCisJICAgIHsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIpOworCQlnb3RvIGZhaWw7CisJICAgIH0KKwl9CisgICAgfQorCisjaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChBUkNISUUpCisgICAgLyogV2hlbiB1c2luZyAiOnchIiBhbmQgdGhlIGZpbGUgd2FzIHJlYWQtb25seTogbWFrZSBpdCB3cml0YWJsZSAqLworICAgIGlmIChmb3JjZWl0ICYmIHBlcm0gPj0gMCAmJiAhKHBlcm0gJiAwMjAwKSAmJiBzdF9vbGQuc3RfdWlkID09IGdldHVpZCgpCisJCQkJICAgICAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRldSSVRFKSA9PSBOVUxMKQorICAgIHsKKwlwZXJtIHw9IDAyMDA7CisJKHZvaWQpbWNoX3NldHBlcm0oZm5hbWUsIHBlcm0pOworCW1hZGVfd3JpdGFibGUgPSBUUlVFOworICAgIH0KKyNlbmRpZgorCisgICAgLyogV2hlbiB1c2luZyAiOnchIiBhbmQgd3JpdGluZyB0byB0aGUgY3VycmVudCBmaWxlLCByZWFkb25seSBtYWtlcyBubworICAgICAqIHNlbnNlLCByZXNldCBpdCAqLworICAgIGlmIChmb3JjZWl0ICYmIG92ZXJ3cml0aW5nKQorICAgIHsKKwlidWYtPmJfcF9ybyA9IEZBTFNFOworI2lmZGVmIEZFQVRfVElUTEUKKwluZWVkX21ha2V0aXRsZSA9IFRSVUU7CSAgICAvKiBzZXQgd2luZG93IHRpdGxlIGxhdGVyICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlzdGF0dXNfcmVkcmF3X2FsbCgpOwkgICAgLyogcmVkcmF3IHN0YXR1cyBsaW5lcyBsYXRlciAqLworI2VuZGlmCisgICAgfQorCisgICAgaWYgKGVuZCA+IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWVuZCA9IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIGlmIChidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkKKwlzdGFydCA9IGVuZCArIDE7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGJlaW5nIG92ZXJ3cml0dGVuLCB0aGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0CisgICAgICogd2UgY3Jhc2ggaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nLiBUaGVyZWZvcmUgdGhlIGZpbGUgaXMgcHJlc2VydmVkIG5vdy4KKyAgICAgKiBUaGlzIG1ha2VzIGFsbCBibG9jayBudW1iZXJzIHBvc2l0aXZlIHNvIHRoYXQgcmVjb3ZlcnkgZG9lcyBub3QgbmVlZAorICAgICAqIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAqIERvbid0IGRvIHRoaXMgaWYgdGhlcmUgaXMgYSBiYWNrdXAgZmlsZSBhbmQgd2UgYXJlIGV4aXRpbmcuCisgICAgICovCisgICAgaWYgKHJlc2V0X2NoYW5nZWQgJiYgIW5ld2ZpbGUgJiYgIW90aGVyZmlsZShmZm5hbWUpCisJCQkJCSAgICAgICYmICEoZXhpdGluZyAmJiBiYWNrdXAgIT0gTlVMTCkpCisgICAgeworCW1sX3ByZXNlcnZlKGJ1ZiwgRkFMU0UpOworCWlmIChnb3RfaW50KQorCXsKKwkgICAgZXJybXNnID0gKGNoYXJfdSAqKV8oZV9pbnRlcnIpOworCSAgICBnb3RvIHJlc3RvcmVfYmFja3VwOworCX0KKyAgICB9CisKKyNpZmRlZiBNQUNPU19DTEFTU0lDIC8qIFRPRE86IElzIGl0IG5lZWQgZm9yIE1BQ09TX1g/IChEYW55KSAqLworICAgIC8qCisgICAgICogQmVmb3JlIHJpc2tpbmcgdG8gbG9zZSB0aGUgb3JpZ2luYWwgZmlsZSB2ZXJpZnkgaWYgdGhlcmUncworICAgICAqIGEgcmVzb3VyY2UgZm9yayB0byBwcmVzZXJ2ZSwgYW5kIGlmIGNhbm5vdCBiZSBkb25lIHdhcm4KKyAgICAgKiB0aGUgdXNlcnMuIFRoaXMgaGFwcGVucyB3aGVuIG92ZXJ3cml0aW5nIHdpdGhvdXQgYmFja3Vwcy4KKyAgICAgKi8KKyAgICBpZiAoYmFja3VwID09IE5VTEwgJiYgb3ZlcndyaXRpbmcgJiYgIWFwcGVuZCkKKwlpZiAobWNoX2hhc19yZXNvdXJjZV9mb3JrKGZuYW1lKSkKKwl7CisJICAgIGVycm1zZyA9IChjaGFyX3UgKilfKCJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiKTsKKwkgICAgZ290byByZXN0b3JlX2JhY2t1cDsKKwl9CisjZW5kaWYKKworI2lmZGVmIFZNUworICAgIHZtc19yZW1vdmVfdmVyc2lvbihmbmFtZSk7IC8qIHJlbW92ZSB2ZXJzaW9uICovCisjZW5kaWYKKyAgICAvKiBEZWZhdWx0OiB3cml0ZSB0aGUgdGhlIGZpbGUgZGlyZWN0bHkuICBNYXkgd3JpdGUgdG8gYSB0ZW1wIGZpbGUgZm9yCisgICAgICogbXVsdGktYnl0ZSBjb252ZXJzaW9uLiAqLworICAgIHdmbmFtZSA9IGZuYW1lOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIENoZWNrIGZvciBmb3JjZWQgJ2ZpbGVlbmNvZGluZycgZnJvbSAiKytvcHQ9dmFsIiBhcmd1bWVudC4gKi8KKyAgICBpZiAoZWFwICE9IE5VTEwgJiYgZWFwLT5mb3JjZV9lbmMgIT0gMCkKKyAgICB7CisJZmVuYyA9IGVhcC0+Y21kICsgZWFwLT5mb3JjZV9lbmM7CisJZmVuYyA9IGVuY19jYW5vbml6ZShmZW5jKTsKKwlmZW5jX3RvZnJlZSA9IGZlbmM7CisgICAgfQorICAgIGVsc2UKKwlmZW5jID0gYnVmLT5iX3BfZmVuYzsKKworICAgIC8qCisgICAgICogVGhlIGZpbGUgbmVlZHMgdG8gYmUgY29udmVydGVkIHdoZW4gJ2ZpbGVlbmNvZGluZycgaXMgc2V0IGFuZAorICAgICAqICdmaWxlZW5jb2RpbmcnIGRpZmZlcnMgZnJvbSAnZW5jb2RpbmcnLgorICAgICAqLworICAgIGNvbnZlcnRlZCA9ICgqZmVuYyAhPSBOVUwgJiYgIXNhbWVfZW5jb2RpbmcocF9lbmMsIGZlbmMpKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgVVRGLTggdG8gVUNTLTIvNCBvciBMYXRpbjEgY29udmVyc2lvbiBuZWVkcyB0byBiZSBkb25lLiAgT3IKKyAgICAgKiBMYXRpbjEgdG8gVW5pY29kZSBjb252ZXJzaW9uLiAgVGhpcyBpcyBoYW5kbGVkIGluIGJ1Zl93cml0ZV9ieXRlcygpLgorICAgICAqIFByZXBhcmUgdGhlIGZsYWdzIGZvciBpdCBhbmQgYWxsb2NhdGUgYndfY29udl9idWYgd2hlbiBuZWVkZWQuCisgICAgICovCisgICAgaWYgKGNvbnZlcnRlZCAmJiAoZW5jX3V0ZjggfHwgU1RSQ01QKHBfZW5jLCAibGF0aW4xIikgPT0gMCkpCisgICAgeworCXdiX2ZsYWdzID0gZ2V0X2Zpb19mbGFncyhmZW5jKTsKKwlpZiAod2JfZmxhZ3MgJiAoRklPX1VDUzIgfCBGSU9fVUNTNCB8IEZJT19VVEYxNiB8IEZJT19VVEY4KSkKKwl7CisJICAgIC8qIE5lZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgdG8gdHJhbnNsYXRlIGludG8uICovCisJICAgIGlmICh3Yl9mbGFncyAmIChGSU9fVUNTMiB8IEZJT19VVEYxNiB8IEZJT19VVEY4KSkKKwkJd3JpdGVfaW5mby5id19jb252X2J1ZmxlbiA9IGJ1ZnNpemUgKiAyOworCSAgICBlbHNlIC8qIEZJT19VQ1M0ICovCisJCXdyaXRlX2luZm8uYndfY29udl9idWZsZW4gPSBidWZzaXplICogNDsKKwkgICAgd3JpdGVfaW5mby5id19jb252X2J1ZgorCQkJICAgPSBsYWxsb2MoKGxvbmdfdSl3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmbGVuLCBUUlVFKTsKKwkgICAgaWYgKHdyaXRlX2luZm8uYndfY29udl9idWYgPT0gTlVMTCkKKwkJZW5kID0gMDsKKwl9CisgICAgfQorCisjIGlmZGVmIFdJTjMyNjQKKyAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDAgJiYgKHdiX2ZsYWdzID0gZ2V0X3dpbl9maW9fZmxhZ3MoZmVuYykpICE9IDApCisgICAgeworCS8qIENvbnZlcnQgVVRGLTggLT4gVUNTLTIgYW5kIFVDUy0yIC0+IERCQ1MuICBXb3JzdC1jYXNlICogNDogKi8KKwl3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmbGVuID0gYnVmc2l6ZSAqIDQ7CisJd3JpdGVfaW5mby5id19jb252X2J1ZgorCQkJICAgID0gbGFsbG9jKChsb25nX3Upd3JpdGVfaW5mby5id19jb252X2J1ZmxlbiwgVFJVRSk7CisJaWYgKHdyaXRlX2luZm8uYndfY29udl9idWYgPT0gTlVMTCkKKwkgICAgZW5kID0gMDsKKyAgICB9CisjIGVuZGlmCisKKyMgaWZkZWYgTUFDT1NfWAorICAgIGlmIChjb252ZXJ0ZWQgJiYgd2JfZmxhZ3MgPT0gMCAmJiAod2JfZmxhZ3MgPSBnZXRfbWFjX2Zpb19mbGFncyhmZW5jKSkgIT0gMCkKKyAgICB7CisJd3JpdGVfaW5mby5id19jb252X2J1ZmxlbiA9IGJ1ZnNpemUgKiAzOworCXdyaXRlX2luZm8uYndfY29udl9idWYKKwkJCSAgICA9IGxhbGxvYygobG9uZ191KXdyaXRlX2luZm8uYndfY29udl9idWZsZW4sIFRSVUUpOworCWlmICh3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmID09IE5VTEwpCisJICAgIGVuZCA9IDA7CisgICAgfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFVTRV9JQ09OVikKKyAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDApCisgICAgeworIyAgaWZkZWYgVVNFX0lDT05WCisJLyoKKwkgKiBVc2UgaWNvbnYoKSBjb252ZXJzaW9uIHdoZW4gY29udmVyc2lvbiBpcyBuZWVkZWQgYW5kIGl0J3Mgbm90IGRvbmUKKwkgKiBpbnRlcm5hbGx5LgorCSAqLworCXdyaXRlX2luZm8uYndfaWNvbnZfZmQgPSAoaWNvbnZfdClteV9pY29udl9vcGVuKGZlbmMsCisJCQkJCWVuY191dGY4ID8gKGNoYXJfdSAqKSJ1dGYtOCIgOiBwX2VuYyk7CisJaWYgKHdyaXRlX2luZm8uYndfaWNvbnZfZmQgIT0gKGljb252X3QpLTEpCisJeworCSAgICAvKiBXZSdyZSBnb2luZyB0byB1c2UgaWNvbnYoKSwgYWxsb2NhdGUgYSBidWZmZXIgdG8gY29udmVydCBpbi4gKi8KKwkgICAgd3JpdGVfaW5mby5id19jb252X2J1ZmxlbiA9IGJ1ZnNpemUgKiBJQ09OVl9NVUxUOworCSAgICB3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmCisJCQkgICA9IGxhbGxvYygobG9uZ191KXdyaXRlX2luZm8uYndfY29udl9idWZsZW4sIFRSVUUpOworCSAgICBpZiAod3JpdGVfaW5mby5id19jb252X2J1ZiA9PSBOVUxMKQorCQllbmQgPSAwOworCSAgICB3cml0ZV9pbmZvLmJ3X2ZpcnN0ID0gVFJVRTsKKwl9CisjICAgaWZkZWYgRkVBVF9FVkFMCisJZWxzZQorIyAgIGVuZGlmCisjICBlbmRpZgorCisjICBpZmRlZiBGRUFUX0VWQUwKKwkgICAgLyoKKwkgICAgICogV2hlbiB0aGUgZmlsZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgd2l0aCAnY2hhcmNvbnZlcnQnIGFmdGVyCisJICAgICAqIHdyaXRpbmcsIHdyaXRlIHRvIGEgdGVtcCBmaWxlIGluc3RlYWQgYW5kIGxldCB0aGUgY29udmVyc2lvbgorCSAgICAgKiBvdmVyd3JpdGUgdGhlIG9yaWdpbmFsIGZpbGUuCisJICAgICAqLworCSAgICBpZiAoKnBfY2N2ICE9IE5VTCkKKwkgICAgeworCQl3Zm5hbWUgPSB2aW1fdGVtcG5hbWUoJ3cnKTsKKwkJaWYgKHdmbmFtZSA9PSBOVUxMKQkvKiBDYW4ndCB3cml0ZSB3aXRob3V0IGEgdGVtcGZpbGUhICovCisJCXsKKwkJICAgIGVycm1zZyA9IChjaGFyX3UgKilfKCJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIpOworCQkgICAgZ290byByZXN0b3JlX2JhY2t1cDsKKwkJfQorCSAgICB9CisjICBlbmRpZgorICAgIH0KKyMgZW5kaWYKKyAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDAKKyMgIGlmZGVmIFVTRV9JQ09OVgorCSAgICAmJiB3cml0ZV9pbmZvLmJ3X2ljb252X2ZkID09IChpY29udl90KS0xCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9FVkFMCisJICAgICYmIHdmbmFtZSA9PSBmbmFtZQorIyAgZW5kaWYKKwkgICAgKQorICAgIHsKKwlpZiAoIWZvcmNlaXQpCisJeworCSAgICBlcnJtc2cgPSAoY2hhcl91ICopXygiRTIxMzogQ2Fubm90IGNvbnZlcnQgKGFkZCAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiKTsKKwkgICAgZ290byByZXN0b3JlX2JhY2t1cDsKKwl9CisJbm90Y29udmVydGVkID0gVFJVRTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogT3BlbiB0aGUgZmlsZSAid2ZuYW1lIiBmb3Igd3JpdGluZy4KKyAgICAgKiBXZSBtYXkgdHJ5IHRvIG9wZW4gdGhlIGZpbGUgdHdpY2U6IElmIHdlIGNhbid0IHdyaXRlIHRvIHRoZQorICAgICAqIGZpbGUgYW5kIGZvcmNlaXQgaXMgVFJVRSB3ZSBkZWxldGUgdGhlIGV4aXN0aW5nIGZpbGUgYW5kIHRyeSB0byBjcmVhdGUKKyAgICAgKiBhIG5ldyBvbmUuIElmIHRoaXMgc3RpbGwgZmFpbHMgd2UgbWF5IGhhdmUgbG9zdCB0aGUgb3JpZ2luYWwgZmlsZSEKKyAgICAgKiAodGhpcyBtYXkgaGFwcGVuIHdoZW4gdGhlIHVzZXIgcmVhY2hlZCBoaXMgcXVvdHVtIGZvciBudW1iZXIgb2YgZmlsZXMpLgorICAgICAqIEFwcGVuZGluZyB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgYW5kIGZvcmNlaXQgaXMgRkFMU0UuCisgICAgICovCisgICAgd2hpbGUgKChmZCA9IG1jaF9vcGVuKChjaGFyICopd2ZuYW1lLCBPX1dST05MWSB8IE9fRVhUUkEgfCAoYXBwZW5kCisJCQk/IChmb3JjZWl0ID8gKE9fQVBQRU5EIHwgT19DUkVBVCkgOiBPX0FQUEVORCkKKwkJCTogKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJCSwgMDY2NikpIDwgMCkKKyAgICB7CisJLyoKKwkgKiBBIGZvcmNlZCB3cml0ZSB3aWxsIHRyeSB0byBjcmVhdGUgYSBuZXcgZmlsZSBpZiB0aGUgb2xkIG9uZSBpcworCSAqIHN0aWxsIHJlYWRvbmx5LiBUaGlzIG1heSBhbHNvIGhhcHBlbiB3aGVuIHRoZSBkaXJlY3RvcnkgaXMKKwkgKiByZWFkLW9ubHkuIEluIHRoYXQgY2FzZSB0aGUgbWNoX3JlbW92ZSgpIHdpbGwgZmFpbC4KKwkgKi8KKwlpZiAoZXJybXNnID09IE5VTEwpCisJeworI2lmZGVmIFVOSVgKKwkgICAgc3RydWN0IHN0YXQJc3Q7CisKKwkgICAgLyogRG9uJ3QgZGVsZXRlIHRoZSBmaWxlIHdoZW4gaXQncyBhIGhhcmQgb3Igc3ltYm9saWMgbGluay4gKi8KKwkgICAgaWYgKCghbmV3ZmlsZSAmJiBzdF9vbGQuc3RfbmxpbmsgPiAxKQorCQkgICAgfHwgKG1jaF9sc3RhdCgoY2hhciAqKWZuYW1lLCAmc3QpID09IDAKKwkJCSYmIChzdC5zdF9kZXYgIT0gc3Rfb2xkLnN0X2RldgorCQkJICAgIHx8IHN0LnN0X2lubyAhPSBzdF9vbGQuc3RfaW5vKSkpCisJCWVycm1zZyA9IChjaGFyX3UgKilfKCJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIik7CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWVycm1zZyA9IChjaGFyX3UgKilfKCJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciKTsKKwkJaWYgKGZvcmNlaXQgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0ZXUklURSkgPT0gTlVMTAorCQkJCQkJCQkgJiYgcGVybSA+PSAwKQorCQl7CisjaWZkZWYgVU5JWAorCQkgICAgLyogd2Ugd3JpdGUgdG8gdGhlIGZpbGUsIHRodXMgaXQgc2hvdWxkIGJlIG1hcmtlZAorCQkgICAgICAgd3JpdGFibGUgYWZ0ZXIgYWxsICovCisJCSAgICBpZiAoIShwZXJtICYgMDIwMCkpCisJCQltYWRlX3dyaXRhYmxlID0gVFJVRTsKKwkJICAgIHBlcm0gfD0gMDIwMDsKKwkJICAgIGlmIChzdF9vbGQuc3RfdWlkICE9IGdldHVpZCgpIHx8IHN0X29sZC5zdF9naWQgIT0gZ2V0Z2lkKCkpCisJCQlwZXJtICY9IDA3Nzc7CisjZW5kaWYKKwkJICAgIGlmICghYXBwZW5kKQkgICAgLyogZG9uJ3QgcmVtb3ZlIHdoZW4gYXBwZW5kaW5nICovCisJCQltY2hfcmVtb3ZlKHdmbmFtZSk7CisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJfQorCityZXN0b3JlX2JhY2t1cDoKKwl7CisJICAgIHN0cnVjdCBzdGF0IHN0OworCisJICAgIC8qCisJICAgICAqIElmIHdlIGZhaWxlZCB0byBvcGVuIHRoZSBmaWxlLCB3ZSBkb24ndCBuZWVkIGEgYmFja3VwLiBUaHJvdyBpdAorCSAgICAgKiBhd2F5LiAgSWYgd2UgbW92ZWQgb3IgcmVtb3ZlZCB0aGUgb3JpZ2luYWwgZmlsZSB0cnkgdG8gcHV0IHRoZQorCSAgICAgKiBiYWNrdXAgaW4gaXRzIHBsYWNlLgorCSAgICAgKi8KKwkgICAgaWYgKGJhY2t1cCAhPSBOVUxMICYmIHdmbmFtZSA9PSBmbmFtZSkKKwkgICAgeworCQlpZiAoYmFja3VwX2NvcHkpCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBUaGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IHdlIHJlbW92ZWQgdGhlIG9yaWdpbmFsLAorCQkgICAgICogdHJ5IHRvIG1vdmUgdGhlIGNvcHkgaW4gaXRzIHBsYWNlLgorCQkgICAgICogVGhpcyBtYXkgbm90IHdvcmsgaWYgdGhlIHZpbV9yZW5hbWUoKSBmYWlscy4KKwkJICAgICAqIEluIHRoYXQgY2FzZSB3ZSBsZWF2ZSB0aGUgY29weSBhcm91bmQuCisJCSAgICAgKi8KKwkJICAgIC8qIElmIGZpbGUgZG9lcyBub3QgZXhpc3QsIHB1dCB0aGUgY29weSBpbiBpdHMgcGxhY2UgKi8KKwkJICAgIGlmIChtY2hfc3RhdCgoY2hhciAqKWZuYW1lLCAmc3QpIDwgMCkKKwkJCXZpbV9yZW5hbWUoYmFja3VwLCBmbmFtZSk7CisJCSAgICAvKiBpZiBvcmlnaW5hbCBmaWxlIGRvZXMgZXhpc3QgdGhyb3cgYXdheSB0aGUgY29weSAqLworCQkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWUsICZzdCkgPj0gMCkKKwkJCW1jaF9yZW1vdmUoYmFja3VwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIHRyeSB0byBwdXQgdGhlIG9yaWdpbmFsIGZpbGUgYmFjayAqLworCQkgICAgdmltX3JlbmFtZShiYWNrdXAsIGZuYW1lKTsKKwkJfQorCSAgICB9CisKKwkgICAgLyogaWYgb3JpZ2luYWwgZmlsZSBubyBsb25nZXIgZXhpc3RzIGdpdmUgYW4gZXh0cmEgd2FybmluZyAqLworCSAgICBpZiAoIW5ld2ZpbGUgJiYgbWNoX3N0YXQoKGNoYXIgKilmbmFtZSwgJnN0KSA8IDApCisJCWVuZCA9IDA7CisJfQorCisjaWZkZWYgRkVBVF9NQllURQorCWlmICh3Zm5hbWUgIT0gZm5hbWUpCisJICAgIHZpbV9mcmVlKHdmbmFtZSk7CisjZW5kaWYKKwlnb3RvIGZhaWw7CisgICAgfQorICAgIGVycm1zZyA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyAgICAvKiBUT0RPOiBJcyBpdCBuZWVkIGZvciBNQUNPU19YPyAoRGFueSkgKi8KKyAgICAvKgorICAgICAqIE9uIG1hY2ludG9zaCBjb3B5IHRoZSBvcmlnaW5hbCBmaWxlcyBhdHRyaWJ1dGVzIChpLmUuIHRoZSBiYWNrdXApCisgICAgICogVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSByZXNzb3VyY2UgZm9yayBhbmQgdGhlCisgICAgICogRmluZGVyIGF0dHJpYnV0ZSAobGFiZWwsIGNvbW1lbnRzLCBjdXN0b20gaWNvbnMsIGZpbGUgY3JlYXRvcmUpCisgICAgICovCisgICAgaWYgKGJhY2t1cCAhPSBOVUxMICYmIG92ZXJ3cml0aW5nICYmICFhcHBlbmQpCisgICAgeworCWlmIChiYWNrdXBfY29weSkKKwkgICAgKHZvaWQpbWNoX2NvcHlfZmlsZV9hdHRyaWJ1dGUod2ZuYW1lLCBiYWNrdXApOworCWVsc2UKKwkgICAgKHZvaWQpbWNoX2NvcHlfZmlsZV9hdHRyaWJ1dGUoYmFja3VwLCB3Zm5hbWUpOworICAgIH0KKworICAgIGlmICghb3ZlcndyaXRpbmcgJiYgIWFwcGVuZCkKKyAgICB7CisJaWYgKGJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTCkKKwkgICAgKHZvaWQpbWNoX2NvcHlfZmlsZV9hdHRyaWJ1dGUoYnVmLT5iX2ZmbmFtZSwgd2ZuYW1lKTsKKwkvKiBTaG91bGQgY29weSByZXNzb3VyY2UgZm9yayAqLworICAgIH0KKyNlbmRpZgorCisgICAgd3JpdGVfaW5mby5id19mZCA9IGZkOworCisjaWZkZWYgRkVBVF9DUllQVAorICAgIGlmICgqYnVmLT5iX3Bfa2V5ICYmICFmaWx0ZXJpbmcpCisgICAgeworCWNyeXB0X2luaXRfa2V5cyhidWYtPmJfcF9rZXkpOworCS8qIFdyaXRlIG1hZ2ljIG51bWJlciwgc28gdGhhdCBWaW0ga25vd3MgdGhhdCB0aGlzIGZpbGUgaXMgZW5jcnlwdGVkCisJICogd2hlbiByZWFkaW5nIGl0IGFnYWluLiAgVGhpcyBhbHNvIHVuZGVyZ29lcyB1dGYtOCB0byB1Y3MtMi80CisJICogY29udmVyc2lvbiB3aGVuIG5lZWRlZC4gKi8KKwl3cml0ZV9pbmZvLmJ3X2J1ZiA9IChjaGFyX3UgKilDUllQVF9NQUdJQzsKKwl3cml0ZV9pbmZvLmJ3X2xlbiA9IENSWVBUX01BR0lDX0xFTjsKKwl3cml0ZV9pbmZvLmJ3X2ZsYWdzID0gRklPX05PQ09OVkVSVDsKKwlpZiAoYnVmX3dyaXRlX2J5dGVzKCZ3cml0ZV9pbmZvKSA9PSBGQUlMKQorCSAgICBlbmQgPSAwOworCXdiX2ZsYWdzIHw9IEZJT19FTkNSWVBURUQ7CisgICAgfQorI2VuZGlmCisKKyAgICB3cml0ZV9pbmZvLmJ3X2J1ZiA9IGJ1ZmZlcjsKKyAgICBuY2hhcnMgPSAwOworCisgICAgLyogdXNlICIrK2JpbiIsICIrK25vYmluIiBvciAnYmluYXJ5JyAqLworICAgIGlmIChlYXAgIT0gTlVMTCAmJiBlYXAtPmZvcmNlX2JpbiAhPSAwKQorCXdyaXRlX2JpbiA9IChlYXAtPmZvcmNlX2JpbiA9PSBGT1JDRV9CSU4pOworICAgIGVsc2UKKwl3cml0ZV9iaW4gPSBidWYtPmJfcF9iaW47CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyoKKyAgICAgKiBUaGUgQk9NIGlzIHdyaXR0ZW4ganVzdCBhZnRlciB0aGUgZW5jcnlwdGlvbiBtYWdpYyBudW1iZXIuCisgICAgICovCisgICAgaWYgKGJ1Zi0+Yl9wX2JvbWIgJiYgIXdyaXRlX2JpbikKKyAgICB7CisJd3JpdGVfaW5mby5id19sZW4gPSBtYWtlX2JvbShidWZmZXIsIGZlbmMpOworCWlmICh3cml0ZV9pbmZvLmJ3X2xlbiA+IDApCisJeworCSAgICAvKiBkb24ndCBjb252ZXJ0LCBkbyBlbmNyeXB0aW9uICovCisJICAgIHdyaXRlX2luZm8uYndfZmxhZ3MgPSBGSU9fTk9DT05WRVJUIHwgd2JfZmxhZ3M7CisJICAgIGlmIChidWZfd3JpdGVfYnl0ZXMoJndyaXRlX2luZm8pID09IEZBSUwpCisJCWVuZCA9IDA7CisJICAgIGVsc2UKKwkJbmNoYXJzICs9IHdyaXRlX2luZm8uYndfbGVuOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIHdyaXRlX2luZm8uYndfbGVuID0gYnVmc2l6ZTsKKyNpZmRlZiBIQVNfQldfRkxBR1MKKyAgICB3cml0ZV9pbmZvLmJ3X2ZsYWdzID0gd2JfZmxhZ3M7CisjZW5kaWYKKyAgICBmaWxlZm9ybWF0ID0gZ2V0X2ZpbGVmb3JtYXRfZm9yY2UoYnVmLCBlYXApOworICAgIHMgPSBidWZmZXI7CisgICAgbGVuID0gMDsKKyAgICBmb3IgKGxudW0gPSBzdGFydDsgbG51bSA8PSBlbmQ7ICsrbG51bSkKKyAgICB7CisJLyoKKwkgKiBUaGUgbmV4dCB3aGlsZSBsb29wIGlzIGRvbmUgb25jZSBmb3IgZWFjaCBjaGFyYWN0ZXIgd3JpdHRlbi4KKwkgKiBLZWVwIGl0IGZhc3QhCisJICovCisJcHRyID0gbWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKSAtIDE7CisJd2hpbGUgKChjID0gKisrcHRyKSAhPSBOVUwpCisJeworCSAgICBpZiAoYyA9PSBOTCkKKwkJKnMgPSBOVUw7CQkvKiByZXBsYWNlIG5ld2xpbmVzIHdpdGggTlVMcyAqLworCSAgICBlbHNlIGlmIChjID09IENBUiAmJiBmaWxlZm9ybWF0ID09IEVPTF9NQUMpCisJCSpzID0gTkw7CQkvKiBNYWM6IHJlcGxhY2UgQ1JzIHdpdGggTkxzICovCisJICAgIGVsc2UKKwkJKnMgPSBjOworCSAgICArK3M7CisJICAgIGlmICgrK2xlbiAhPSBidWZzaXplKQorCQljb250aW51ZTsKKwkgICAgaWYgKGJ1Zl93cml0ZV9ieXRlcygmd3JpdGVfaW5mbykgPT0gRkFJTCkKKwkgICAgeworCQllbmQgPSAwOwkJLyogd3JpdGUgZXJyb3I6IGJyZWFrIGxvb3AgKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbmNoYXJzICs9IGJ1ZnNpemU7CisJICAgIHMgPSBidWZmZXI7CisJICAgIGxlbiA9IDA7CisJfQorCS8qIHdyaXRlIGZhaWxlZCBvciBsYXN0IGxpbmUgaGFzIG5vIEVPTDogc3RvcCBoZXJlICovCisJaWYgKGVuZCA9PSAwCisJCXx8IChsbnVtID09IGVuZAorCQkgICAgJiYgd3JpdGVfYmluCisJCSAgICAmJiAobG51bSA9PSB3cml0ZV9ub19lb2xfbG51bQorCQkJfHwgKGxudW0gPT0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQgJiYgIWJ1Zi0+Yl9wX2VvbCkpKSkKKwl7CisJICAgICsrbG51bTsJCQkvKiB3cml0dGVuIHRoZSBsaW5lLCBjb3VudCBpdCAqLworCSAgICBub19lb2wgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisJaWYgKGZpbGVmb3JtYXQgPT0gRU9MX1VOSVgpCisJICAgICpzKysgPSBOTDsKKwllbHNlCisJeworCSAgICAqcysrID0gQ0FSOwkJCS8qIEVPTF9NQUMgb3IgRU9MX0RPUzogd3JpdGUgQ1IgKi8KKwkgICAgaWYgKGZpbGVmb3JtYXQgPT0gRU9MX0RPUykJLyogd3JpdGUgQ1ItTkwgKi8KKwkgICAgeworCQlpZiAoKytsZW4gPT0gYnVmc2l6ZSkKKwkJeworCQkgICAgaWYgKGJ1Zl93cml0ZV9ieXRlcygmd3JpdGVfaW5mbykgPT0gRkFJTCkKKwkJICAgIHsKKwkJCWVuZCA9IDA7CS8qIHdyaXRlIGVycm9yOiBicmVhayBsb29wICovCisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIG5jaGFycyArPSBidWZzaXplOworCQkgICAgcyA9IGJ1ZmZlcjsKKwkJICAgIGxlbiA9IDA7CisJCX0KKwkJKnMrKyA9IE5MOworCSAgICB9CisJfQorCWlmICgrK2xlbiA9PSBidWZzaXplICYmIGVuZCkKKwl7CisJICAgIGlmIChidWZfd3JpdGVfYnl0ZXMoJndyaXRlX2luZm8pID09IEZBSUwpCisJICAgIHsKKwkJZW5kID0gMDsJCS8qIHdyaXRlIGVycm9yOiBicmVhayBsb29wICovCisJCWJyZWFrOworCSAgICB9CisJICAgIG5jaGFycyArPSBidWZzaXplOworCSAgICBzID0gYnVmZmVyOworCSAgICBsZW4gPSAwOworCisJICAgIHVpX2JyZWFrY2hlY2soKTsKKwkgICAgaWYgKGdvdF9pbnQpCisJICAgIHsKKwkJZW5kID0gMDsJCS8qIEludGVycnVwdGVkLCBicmVhayBsb29wICovCisJCWJyZWFrOworCSAgICB9CisJfQorI2lmZGVmIFZNUworCS8qCisJICogT24gVk1TIHRoZXJlIGlzIGEgcHJvYmxlbTogbmV3bGluZXMgZ2V0IGFkZGVkIHdoZW4gd3JpdGluZyBibG9ja3MKKwkgKiBhdCBhIHRpbWUuIEZpeCBpdCBieSB3cml0aW5nIGEgbGluZSBhdCBhIHRpbWUuCisJICogVGhpcyBpcyBtdWNoIHNsb3dlciEKKwkgKiBFeHBsYW5hdGlvbjogVmltIGNhbiBub3QgaGFuZGxlLCBzbyBmYXIsIHZhcmlhYmxlIHJlY29yZCBmb3JtYXQuCisJICogV2l0aCAkYW5hbGl6ZS9ybXMgZmlsZW5hbWUgeW91IGNhbiBnZXQgdGhlIHJtcyBmaWxlIHN0cnVjdHVyZSwgYW5kCisJICogaWYgdGhlIFJlY29yZCBmb3JtYXQgZmlsZWQgaXMgdmFyaWFibGUsIENSIHdpbGwgYmUgYWRkZWQgYWZ0ZXIKKwkgKiBldmVyeSB3cml0dGVuIGJ1ZmZlci4gIEluIG90aGVyIGNhc2VzIGl0IHdvcmtzIHdpdGhvdXQgdGhpcyBmaXguCisJICogRnJvbSBvdGhlciBzaWRlIHJlYWQgaXMgYWJvdXQgNSB0aW1lcyBzbG93ZXIgZm9yICJ2YXJpYWJsZSByZWNvcmQKKwkgKiBmb3JtYXQiIGZpbGVzLgorCSAqLworCWlmIChidWYtPmJfZmFiX3JmbSA9PSBGQUIkQ19WQVIpCisJeworCSAgICB3cml0ZV9pbmZvLmJ3X2xlbiA9IGxlbjsKKwkgICAgaWYgKGJ1Zl93cml0ZV9ieXRlcygmd3JpdGVfaW5mbykgPT0gRkFJTCkKKwkgICAgeworCQllbmQgPSAwOwkJLyogd3JpdGUgZXJyb3I6IGJyZWFrIGxvb3AgKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgd3JpdGVfaW5mby5id19sZW4gPSBidWZzaXplOworCSAgICBuY2hhcnMgKz0gbGVuOworCSAgICBzID0gYnVmZmVyOworCSAgICBsZW4gPSAwOworCX0KKyNlbmRpZgorICAgIH0KKyAgICBpZiAobGVuID4gMCAmJiBlbmQgPiAwKQorICAgIHsKKwl3cml0ZV9pbmZvLmJ3X2xlbiA9IGxlbjsKKwlpZiAoYnVmX3dyaXRlX2J5dGVzKCZ3cml0ZV9pbmZvKSA9PSBGQUlMKQorCSAgICBlbmQgPSAwOwkJICAgIC8qIHdyaXRlIGVycm9yICovCisJbmNoYXJzICs9IGxlbjsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFVOSVgpICYmIGRlZmluZWQoSEFWRV9GU1lOQykKKyAgICAvKiBPbiBtYW55IGpvdXJuYWxsaW5nIGZpbGUgc3lzdGVtcyB0aGVyZSBpcyBhIGJ1ZyB0aGF0IGNhdXNlcyBib3RoIHRoZQorICAgICAqIG9yaWdpbmFsIGFuZCB0aGUgYmFja3VwIGZpbGUgdG8gYmUgbG9zdCB3aGVuIGhhbHRpbmcgdGhlIHN5c3RlbSByaWdodAorICAgICAqIGFmdGVyIHdyaXRpbmcgdGhlIGZpbGUuICBUaGF0J3MgYmVjYXVzZSBvbmx5IHRoZSBtZXRhLWRhdGEgaXMKKyAgICAgKiBqb3VybmFsbGVkLiAgU3luY2luZyB0aGUgZmlsZSBzbG93cyBkb3duIHRoZSBzeXN0ZW0sIGJ1dCBhc3N1cmVzIGl0IGhhcworICAgICAqIGJlZW4gd3JpdHRlbiB0byBkaXNrIGFuZCB3ZSBkb24ndCBsb3NlIGl0LiAqLworICAgIGlmIChmc3luYyhmZCkgIT0gMCkKKyAgICB7CisJZXJybXNnID0gKGNoYXJfdSAqKV8oIkU2Njc6IEZzeW5jIGZhaWxlZCIpOworCWVuZCA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoY2xvc2UoZmQpICE9IDApCisgICAgeworCWVycm1zZyA9IChjaGFyX3UgKilfKCJFNTEyOiBDbG9zZSBmYWlsZWQiKTsKKwllbmQgPSAwOworICAgIH0KKworI2lmZGVmIFVOSVgKKyAgICBpZiAobWFkZV93cml0YWJsZSkKKwlwZXJtICY9IH4wMjAwOwkJLyogcmVzZXQgJ3cnIGJpdCBmb3Igc2VjdXJpdHkgcmVhc29ucyAqLworI2VuZGlmCisgICAgaWYgKHBlcm0gPj0gMCkJCS8qIHNldCBwZXJtLiBvZiBuZXcgZmlsZSBzYW1lIGFzIG9sZCBmaWxlICovCisJKHZvaWQpbWNoX3NldHBlcm0od2ZuYW1lLCBwZXJtKTsKKyNpZmRlZiBSSVNDT1MKKyAgICBpZiAoIWFwcGVuZCAmJiAhZmlsdGVyaW5nKQorCS8qIFNldCB0aGUgZmlsZXR5cGUgYWZ0ZXIgd3JpdGluZyB0aGUgZmlsZS4gKi8KKwltY2hfc2V0X2ZpbGV0eXBlKHdmbmFtZSwgYnVmLT5iX3Bfb2Z0KTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQUNMCisgICAgLyogUHJvYmFibHkgbmVlZCB0byBzZXQgdGhlIEFDTCBiZWZvcmUgY2hhbmdpbmcgdGhlIHVzZXIgKGNhbid0IHNldCB0aGUKKyAgICAgKiBBQ0wgb24gYSBmaWxlIHRoZSB1c2VyIGRvZXNuJ3Qgb3duKS4gKi8KKyAgICBpZiAoIWJhY2t1cF9jb3B5KQorCW1jaF9zZXRfYWNsKHdmbmFtZSwgYWNsKTsKKyNlbmRpZgorCisjaWZkZWYgVU5JWAorICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBuZXcgZmlsZSwgc2V0IGl0cyBvd25lci9ncm91cCB0byB0aGF0IG9mIHRoZSBvcmlnaW5hbAorICAgICAqIGZpbGUuICBHZXQgdGhlIG5ldyBkZXZpY2UgYW5kIGlub2RlIG51bWJlci4gKi8KKyAgICBpZiAoYmFja3VwICE9IE5VTEwgJiYgIWJhY2t1cF9jb3B5KQorICAgIHsKKwlzdHJ1Y3Qgc3RhdAlzdDsKKworCS8qIGRvbid0IGNoYW5nZSB0aGUgb3duZXIgd2hlbiBpdCdzIGFscmVhZHkgT0ssIHNvbWUgc3lzdGVtcyByZW1vdmUKKwkgKiBwZXJtaXNzaW9uIG9yIEFDTCBzdHVmZiAqLworCWlmIChtY2hfc3RhdCgoY2hhciAqKXdmbmFtZSwgJnN0KSA8IDAKKwkJfHwgc3Quc3RfdWlkICE9IHN0X29sZC5zdF91aWQKKwkJfHwgc3Quc3RfZ2lkICE9IHN0X29sZC5zdF9naWQpCisJeworCSAgICBjaG93bigoY2hhciAqKXdmbmFtZSwgc3Rfb2xkLnN0X3VpZCwgc3Rfb2xkLnN0X2dpZCk7CisJICAgIGlmIChwZXJtID49IDApCS8qIHNldCBwZXJtaXNzaW9uIGFnYWluLCBtYXkgaGF2ZSBjaGFuZ2VkICovCisJCSh2b2lkKW1jaF9zZXRwZXJtKHdmbmFtZSwgcGVybSk7CisJfQorCWJ1Zl9zZXRpbm8oYnVmKTsKKyAgICB9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKKyAgICBpZiAod2ZuYW1lICE9IGZuYW1lKQorICAgIHsKKwkvKgorCSAqIFRoZSBmaWxlIHdhcyB3cml0dGVuIHRvIGEgdGVtcCBmaWxlLCBub3cgaXQgbmVlZHMgdG8gYmUgY29udmVydGVkCisJICogd2l0aCAnY2hhcmNvbnZlcnQnIHRvIChvdmVyd3JpdGUpIHRoZSBvdXRwdXQgZmlsZS4KKwkgKi8KKwlpZiAoZW5kICE9IDApCisJeworCSAgICBpZiAoZXZhbF9jaGFyY29udmVydChlbmNfdXRmOCA/IChjaGFyX3UgKikidXRmLTgiIDogcF9lbmMsIGZlbmMsCisJCQkJCQkgICAgICAgd2ZuYW1lLCBmbmFtZSkgPT0gRkFJTCkKKwkgICAgeworCQl3cml0ZV9pbmZvLmJ3X2NvbnZfZXJyb3IgPSBUUlVFOworCQllbmQgPSAwOworCSAgICB9CisJfQorCW1jaF9yZW1vdmUod2ZuYW1lKTsKKwl2aW1fZnJlZSh3Zm5hbWUpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGVuZCA9PSAwKQorICAgIHsKKwlpZiAoZXJybXNnID09IE5VTEwpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKHdyaXRlX2luZm8uYndfY29udl9lcnJvcikKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIpOworCSAgICBlbHNlCisjZW5kaWYKKwkJaWYgKGdvdF9pbnQpCisJCSAgICBlcnJtc2cgPSAoY2hhcl91ICopXyhlX2ludGVycik7CisJCWVsc2UKKwkJICAgIGVycm1zZyA9IChjaGFyX3UgKilfKCJFNTE0OiB3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIik7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgYmFja3VwIGZpbGUsIHRyeSB0byBwdXQgaXQgaW4gcGxhY2Ugb2YgdGhlIG5ldyBmaWxlLAorCSAqIGJlY2F1c2UgdGhlIG5ldyBmaWxlIGlzIHByb2JhYmx5IGNvcnJ1cHQuICBUaGlzIGF2b2lkcyBsb29zaW5nIHRoZQorCSAqIG9yaWdpbmFsIGZpbGUgd2hlbiB0cnlpbmcgdG8gbWFrZSBhIGJhY2t1cCB3aGVuIHdyaXRpbmcgdGhlIGZpbGUgYQorCSAqIHNlY29uZCB0aW1lLgorCSAqIFdoZW4gImJhY2t1cF9jb3B5IiBpcyBzZXQgd2UgbmVlZCB0byBjb3B5IHRoZSBiYWNrdXAgb3ZlciB0aGUgbmV3CisJICogZmlsZS4gIE90aGVyd2lzZSByZW5hbWUgdGhlIGJhY2t1cCBmaWxlLgorCSAqIElmIHRoaXMgaXMgT0ssIGRvbid0IGdpdmUgdGhlIGV4dHJhIHdhcm5pbmcgbWVzc2FnZS4KKwkgKi8KKwlpZiAoYmFja3VwICE9IE5VTEwpCisJeworCSAgICBpZiAoYmFja3VwX2NvcHkpCisJICAgIHsKKwkJLyogVGhpcyBtYXkgdGFrZSBhIHdoaWxlLCBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIGxldCB0aGUgdXNlcgorCQkgKiBrbm93IHdlIGdvdCB0aGUgbWVzc2FnZS4gKi8KKwkJaWYgKGdvdF9pbnQpCisJCXsKKwkJICAgIE1TRyhfKGVfaW50ZXJyKSk7CisJCSAgICBvdXRfZmx1c2goKTsKKwkJfQorCQlpZiAoKGZkID0gbWNoX29wZW4oKGNoYXIgKiliYWNrdXAsIE9fUkRPTkxZIHwgT19FWFRSQSwgMCkpID49IDApCisJCXsKKwkJICAgIGlmICgod3JpdGVfaW5mby5id19mZCA9IG1jaF9vcGVuKChjaGFyICopZm5hbWUsCisJCQkgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0VYVFJBLCAwNjY2KSkgPj0gMCkKKwkJICAgIHsKKwkJCS8qIGNvcHkgdGhlIGZpbGUuICovCisJCQl3cml0ZV9pbmZvLmJ3X2J1ZiA9IHNtYWxsYnVmOworI2lmZGVmIEhBU19CV19GTEFHUworCQkJd3JpdGVfaW5mby5id19mbGFncyA9IEZJT19OT0NPTlZFUlQ7CisjZW5kaWYKKwkJCXdoaWxlICgod3JpdGVfaW5mby5id19sZW4gPSB2aW1fcmVhZChmZCwgc21hbGxidWYsCisJCQkJCQkgICAgICBTTUJVRlNJWkUpKSA+IDApCisJCQkgICAgaWYgKGJ1Zl93cml0ZV9ieXRlcygmd3JpdGVfaW5mbykgPT0gRkFJTCkKKwkJCQlicmVhazsKKworCQkJaWYgKGNsb3NlKHdyaXRlX2luZm8uYndfZmQpID49IDAKKwkJCQkJCSAgICYmIHdyaXRlX2luZm8uYndfbGVuID09IDApCisJCQkgICAgZW5kID0gMTsJCS8qIHN1Y2Nlc3MgKi8KKwkJICAgIH0KKwkJICAgIGNsb3NlKGZkKTsJLyogaWdub3JlIGVycm9ycyBmb3IgY2xvc2luZyByZWFkIGZpbGUgKi8KKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAodmltX3JlbmFtZShiYWNrdXAsIGZuYW1lKSA9PSAwKQorCQkgICAgZW5kID0gMTsKKwkgICAgfQorCX0KKwlnb3RvIGZhaWw7CisgICAgfQorCisgICAgbG51bSAtPSBzdGFydDsJICAgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIHdyaXR0ZW4gbGluZXMgKi8KKyAgICAtLW5vX3dhaXRfcmV0dXJuOwkgICAgLyogbWF5IHdhaXQgZm9yIHJldHVybiBub3cgKi8KKworI2lmICEoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpCisgICAgZm5hbWUgPSBzZm5hbWU7CSAgICAvKiB1c2Ugc2hvcnRuYW1lIG5vdywgZm9yIHRoZSBtZXNzYWdlcyAqLworI2VuZGlmCisgICAgaWYgKCFmaWx0ZXJpbmcpCisgICAgeworCW1zZ19hZGRfZm5hbWUoYnVmLCBmbmFtZSk7CS8qIHB1dCBmbmFtZSBpbiBJT2J1ZmYgd2l0aCBxdW90ZXMgKi8KKwljID0gRkFMU0U7CisjaWZkZWYgRkVBVF9NQllURQorCWlmICh3cml0ZV9pbmZvLmJ3X2NvbnZfZXJyb3IpCisJeworCSAgICBTVFJDQVQoSU9idWZmLCBfKCIgQ09OVkVSU0lPTiBFUlJPUiIpKTsKKwkgICAgYyA9IFRSVUU7CisJfQorCWVsc2UgaWYgKG5vdGNvbnZlcnRlZCkKKwl7CisJICAgIFNUUkNBVChJT2J1ZmYsIF8oIltOT1QgY29udmVydGVkXSIpKTsKKwkgICAgYyA9IFRSVUU7CisJfQorCWVsc2UgaWYgKGNvbnZlcnRlZCkKKwl7CisJICAgIFNUUkNBVChJT2J1ZmYsIF8oIltjb252ZXJ0ZWRdIikpOworCSAgICBjID0gVFJVRTsKKwl9CisjZW5kaWYKKwlpZiAoZGV2aWNlKQorCXsKKwkgICAgU1RSQ0FUKElPYnVmZiwgXygiW0RldmljZV0iKSk7CisJICAgIGMgPSBUUlVFOworCX0KKwllbHNlIGlmIChuZXdmaWxlKQorCXsKKwkgICAgU1RSQ0FUKElPYnVmZiwgc2hvcnRtZXNzKFNITV9ORVcpID8gXygiW05ld10iKSA6IF8oIltOZXcgRmlsZV0iKSk7CisJICAgIGMgPSBUUlVFOworCX0KKwlpZiAobm9fZW9sKQorCXsKKwkgICAgbXNnX2FkZF9lb2woKTsKKwkgICAgYyA9IFRSVUU7CisJfQorCS8qIG1heSBhZGQgW3VuaXgvZG9zL21hY10gKi8KKwlpZiAobXNnX2FkZF9maWxlZm9ybWF0KGZpbGVmb3JtYXQpKQorCSAgICBjID0gVFJVRTsKKyNpZmRlZiBGRUFUX0NSWVBUCisJaWYgKHdiX2ZsYWdzICYgRklPX0VOQ1JZUFRFRCkKKwl7CisJICAgIFNUUkNBVChJT2J1ZmYsIF8oIltjcnlwdGVkXSIpKTsKKwkgICAgYyA9IFRSVUU7CisJfQorI2VuZGlmCisJbXNnX2FkZF9saW5lcyhjLCAobG9uZylsbnVtLCBuY2hhcnMpOwkvKiBhZGQgbGluZS9jaGFyIGNvdW50ICovCisJaWYgKCFzaG9ydG1lc3MoU0hNX1dSSVRFKSkKKwl7CisJICAgIGlmIChhcHBlbmQpCisJCVNUUkNBVChJT2J1ZmYsIHNob3J0bWVzcyhTSE1fV1JJKSA/IF8oIiBbYV0iKSA6IF8oIiBhcHBlbmRlZCIpKTsKKwkgICAgZWxzZQorCQlTVFJDQVQoSU9idWZmLCBzaG9ydG1lc3MoU0hNX1dSSSkgPyBfKCIgW3ddIikgOiBfKCIgd3JpdHRlbiIpKTsKKwl9CisKKwlzZXRfa2VlcF9tc2cobXNnX3RydW5jX2F0dHIoSU9idWZmLCBGQUxTRSwgMCkpOworCWtlZXBfbXNnX2F0dHIgPSAwOworICAgIH0KKworICAgIGlmIChyZXNldF9jaGFuZ2VkICYmIHdob2xlCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAmJiAhd3JpdGVfaW5mby5id19jb252X2Vycm9yCisjZW5kaWYKKwkgICAgKQkJLyogd2hlbiB3cml0dGVuIGV2ZXJ5dGhpbmcgY29ycmVjdGx5ICovCisgICAgeworCXVuY2hhbmdlZChidWYsIFRSVUUpOworCXVfdW5jaGFuZ2VkKGJ1Zik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB3cml0dGVuIHRvIHRoZSBjdXJyZW50IGZpbGUsIHVwZGF0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBzd2FwIGZpbGUKKyAgICAgKiBhbmQgcmVzZXQgdGhlIEJGX1dSSVRFX01BU0sgZmxhZ3MuIEFsc28gc2V0cyBidWYtPmJfbXRpbWUuCisgICAgICovCisgICAgaWYgKG92ZXJ3cml0aW5nKQorICAgIHsKKwltbF90aW1lc3RhbXAoYnVmKTsKKwlidWYtPmJfZmxhZ3MgJj0gfkJGX1dSSVRFX01BU0s7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB3ZSBrZXB0IGEgYmFja3VwIHVudGlsIG5vdywgYW5kIHdlIGFyZSBpbiBwYXRjaCBtb2RlLCB0aGVuIHdlIG1ha2UKKyAgICAgKiB0aGUgYmFja3VwIGZpbGUgb3VyICdvcmlnaW5hbCcgZmlsZS4KKyAgICAgKi8KKyAgICBpZiAoKnBfcG0gJiYgZG9iYWNrdXApCisgICAgeworCWNoYXIgKm9yZyA9IChjaGFyICopYnVmX21vZG5hbWUoCisjaWZkZWYgU0hPUlRfRk5BTUUKKwkJCQkJVFJVRSwKKyNlbHNlCisJCQkJCShidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKKyNlbmRpZgorCQkJCQkJCSAgZm5hbWUsIHBfcG0sIEZBTFNFKTsKKworCWlmIChiYWNrdXAgIT0gTlVMTCkKKwl7CisJICAgIHN0cnVjdCBzdGF0IHN0OworCisJICAgIC8qCisJICAgICAqIElmIHRoZSBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0IHlldAorCSAgICAgKiB0aGUgY3VycmVudCBiYWNrdXAgZmlsZSBiZWNvbWVzIHRoZSBvcmlnaW5hbCBmaWxlCisJICAgICAqLworCSAgICBpZiAob3JnID09IE5VTEwpCisJCUVNU0coXygiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiKSk7CisJICAgIGVsc2UgaWYgKG1jaF9zdGF0KG9yZywgJnN0KSA8IDApCisJICAgIHsKKwkJdmltX3JlbmFtZShiYWNrdXAsIChjaGFyX3UgKilvcmcpOworCQl2aW1fZnJlZShiYWNrdXApOwkgICAgLyogZG9uJ3QgZGVsZXRlIHRoZSBmaWxlICovCisJCWJhY2t1cCA9IE5VTEw7CisjaWZkZWYgVU5JWAorCQlzZXRfZmlsZV90aW1lKChjaGFyX3UgKilvcmcsIHN0X29sZC5zdF9hdGltZSwgc3Rfb2xkLnN0X210aW1lKTsKKyNlbmRpZgorCSAgICB9CisJfQorCS8qCisJICogSWYgdGhlcmUgaXMgbm8gYmFja3VwIGZpbGUsIHJlbWVtYmVyIHRoYXQgYSAobmV3KSBmaWxlIHdhcworCSAqIGNyZWF0ZWQuCisJICovCisJZWxzZQorCXsKKwkgICAgaW50IGVtcHR5X2ZkOworCisJICAgIGlmIChvcmcgPT0gTlVMTAorCQkgICAgfHwgKGVtcHR5X2ZkID0gbWNoX29wZW4ob3JnLCBPX0NSRUFUIHwgT19FWFRSQSB8IE9fRVhDTCwKKwkJCQkJCQkJICAgMDY2NikpIDwgMCkKKwkgICAgICBFTVNHKF8oIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIpKTsKKwkgICAgZWxzZQorCSAgICAgIGNsb3NlKGVtcHR5X2ZkKTsKKwl9CisJaWYgKG9yZyAhPSBOVUxMKQorCXsKKwkgICAgbWNoX3NldHBlcm0oKGNoYXJfdSAqKW9yZywgbWNoX2dldHBlcm0oZm5hbWUpICYgMDc3Nyk7CisJICAgIHZpbV9mcmVlKG9yZyk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVtb3ZlIHRoZSBiYWNrdXAgdW5sZXNzICdiYWNrdXAnIG9wdGlvbiBpcyBzZXQKKyAgICAgKi8KKyAgICBpZiAoIXBfYmsgJiYgYmFja3VwICE9IE5VTEwgJiYgbWNoX3JlbW92ZShiYWNrdXApICE9IDApCisJRU1TRyhfKCJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiKSk7CisKKyNpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorICAgIGlmICh1c2luZ1N1bldvcmtTaG9wKQorCXdvcmtzaG9wX2ZpbGVfc2F2ZWQoKGNoYXIgKikgZmZuYW1lKTsKKyNlbmRpZgorCisgICAgZ290byBub2ZhaWw7CisKKyAgICAvKgorICAgICAqIEZpbmlzaCB1cC4gIFdlIGdldCBoZXJlIGVpdGhlciBhZnRlciBmYWlsdXJlIG9yIHN1Y2Nlc3MuCisgICAgICovCitmYWlsOgorICAgIC0tbm9fd2FpdF9yZXR1cm47CQkvKiBtYXkgd2FpdCBmb3IgcmV0dXJuIG5vdyAqLworbm9mYWlsOgorCisgICAgLyogRG9uZSBzYXZpbmcsIHdlIGFjY2VwdCBjaGFuZ2VkIGJ1ZmZlciB3YXJuaW5ncyBhZ2FpbiAqLworICAgIGJ1Zi0+Yl9zYXZpbmcgPSBGQUxTRTsKKworICAgIHZpbV9mcmVlKGJhY2t1cCk7CisgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbGJ1ZikKKwl2aW1fZnJlZShidWZmZXIpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1fZnJlZShmZW5jX3RvZnJlZSk7CisgICAgdmltX2ZyZWUod3JpdGVfaW5mby5id19jb252X2J1Zik7CisjIGlmZGVmIFVTRV9JQ09OVgorICAgIGlmICh3cml0ZV9pbmZvLmJ3X2ljb252X2ZkICE9IChpY29udl90KS0xKQorICAgIHsKKwlpY29udl9jbG9zZSh3cml0ZV9pbmZvLmJ3X2ljb252X2ZkKTsKKwl3cml0ZV9pbmZvLmJ3X2ljb252X2ZkID0gKGljb252X3QpLTE7CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9BQ0wKKyAgICBtY2hfZnJlZV9hY2woYWNsKTsKKyNlbmRpZgorCisgICAgaWYgKGVycm1zZyAhPSBOVUxMKQorICAgIHsKKwlpbnQgbnVtbGVuID0gZXJybnVtICE9IE5VTEwgPyBTVFJMRU4oZXJybnVtKSA6IDA7CisKKwlhdHRyID0gaGxfYXR0cihITEZfRSk7CS8qIHNldCBoaWdobGlnaHQgZm9yIGVycm9yIG1lc3NhZ2VzICovCisJbXNnX2FkZF9mbmFtZShidWYsCisjaWZuZGVmIFVOSVgKKwkJc2ZuYW1lCisjZWxzZQorCQlmbmFtZQorI2VuZGlmCisJCSAgICAgKTsJCS8qIHB1dCBmaWxlIG5hbWUgaW4gSU9idWZmIHdpdGggcXVvdGVzICovCisJaWYgKFNUUkxFTihJT2J1ZmYpICsgU1RSTEVOKGVycm1zZykgKyBudW1sZW4gPj0gSU9TSVpFKQorCSAgICBJT2J1ZmZbSU9TSVpFIC0gU1RSTEVOKGVycm1zZykgLSBudW1sZW4gLSAxXSA9IE5VTDsKKwkvKiBJZiB0aGUgZXJyb3IgbWVzc2FnZSBoYXMgdGhlIGZvcm0gImlzIC4uLiIsIHB1dCB0aGUgZXJyb3IgbnVtYmVyIGluCisJICogZnJvbnQgb2YgdGhlIGZpbGUgbmFtZS4gKi8KKwlpZiAoZXJybnVtICE9IE5VTEwpCisJeworCSAgICBtY2hfbWVtbW92ZShJT2J1ZmYgKyBudW1sZW4sIElPYnVmZiwgU1RSTEVOKElPYnVmZikgKyAxKTsKKwkgICAgbWNoX21lbW1vdmUoSU9idWZmLCBlcnJudW0sIChzaXplX3QpbnVtbGVuKTsKKwl9CisJU1RSQ0FUKElPYnVmZiwgZXJybXNnKTsKKwllbXNnKElPYnVmZik7CisKKwlyZXR2YWwgPSBGQUlMOworCWlmIChlbmQgPT0gMCkKKwl7CisJICAgIE1TR19QVVRTX0FUVFIoXygiXG5XQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIpLAorCQkgICAgYXR0ciB8IE1TR19ISVNUKTsKKwkgICAgTVNHX1BVVFNfQVRUUihfKCJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIiksCisJCSAgICBhdHRyIHwgTVNHX0hJU1QpOworCisJICAgIC8qIFVwZGF0ZSB0aGUgdGltZXN0YW1wIHRvIGF2b2lkIGFuICJvdmVyd3JpdGUgY2hhbmdlZCBmaWxlIgorCSAgICAgKiBwcm9tcHQgd2hlbiB3cml0aW5nIGFnYWluLiAqLworCSAgICBpZiAobWNoX3N0YXQoKGNoYXIgKilmbmFtZSwgJnN0X29sZCkgPj0gMCkKKwkgICAgeworCQlidWZfc3RvcmVfdGltZShidWYsICZzdF9vbGQsIGZuYW1lKTsKKwkJYnVmLT5iX210aW1lX3JlYWQgPSBidWYtPmJfbXRpbWU7CisJICAgIH0KKwl9CisgICAgfQorICAgIG1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorI2lmZGVmIEZFQVRfRVZBTAorICAgIGlmICghc2hvdWxkX2Fib3J0KHJldHZhbCkpCisjZWxzZQorICAgIGlmICghZ290X2ludCkKKyNlbmRpZgorICAgIHsKKwlhY29fc2F2ZV9UCWFjbzsKKworCXdyaXRlX25vX2VvbF9sbnVtID0gMDsJLyogaW4gY2FzZSBpdCB3YXMgc2V0IGJ5IHRoZSBwcmV2aW91cyByZWFkICovCisKKwkvKgorCSAqIEFwcGx5IFBPU1QgYXV0b2NvbW1hbmRzLgorCSAqIENhcmVmdWw6IFRoZSBhdXRvY29tbWFuZHMgbWF5IGNhbGwgYnVmX3dyaXRlKCkgcmVjdXJzaXZlbHkhCisJICovCisJYXVjbWRfcHJlcGJ1ZigmYWNvLCBidWYpOworCisJaWYgKGFwcGVuZCkKKwkgICAgYXBwbHlfYXV0b2NtZHNfZXhhcmcoRVZFTlRfRklMRUFQUEVORFBPU1QsIGZuYW1lLCBmbmFtZSwKKwkJCQkJCQkgIEZBTFNFLCBjdXJidWYsIGVhcCk7CisJZWxzZSBpZiAoZmlsdGVyaW5nKQorCSAgICBhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9GSUxURVJXUklURVBPU1QsIE5VTEwsIGZuYW1lLAorCQkJCQkJCSAgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKKwllbHNlIGlmIChyZXNldF9jaGFuZ2VkICYmIHdob2xlKQorCSAgICBhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9CVUZXUklURVBPU1QsIGZuYW1lLCBmbmFtZSwKKwkJCQkJCQkgIEZBTFNFLCBjdXJidWYsIGVhcCk7CisJZWxzZQorCSAgICBhcHBseV9hdXRvY21kc19leGFyZyhFVkVOVF9GSUxFV1JJVEVQT1NULCBmbmFtZSwgZm5hbWUsCisJCQkJCQkJICBGQUxTRSwgY3VyYnVmLCBlYXApOworCisJLyogcmVzdG9yZSBjdXJ3aW4vY3VyYnVmIGFuZCBhIGZldyBvdGhlciB0aGluZ3MgKi8KKwlhdWNtZF9yZXN0YnVmKCZhY28pOworCisjaWZkZWYgRkVBVF9FVkFMCisJaWYgKGFib3J0aW5nKCkpCSAgICAvKiBhdXRvY21kcyBtYXkgYWJvcnQgc2NyaXB0IHByb2Nlc3NpbmcgKi8KKwkgICAgcmV0dmFsID0gRkFMU0U7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIGdvdF9pbnQgfD0gcHJldl9nb3RfaW50OworCisjaWZkZWYgTUFDT1NfQ0xBU1NJQyAvKiBUT0RPOiBJcyBpdCBuZWVkIGZvciBNQUNPU19YPyAoRGFueSkgKi8KKyAgICAvKiBVcGRhdGUgbWFjaGluZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gKi8KKyAgICBtY2hfcG9zdF9idWZmZXJfd3JpdGUoYnVmKTsKKyNlbmRpZgorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBQdXQgZmlsZSBuYW1lIGludG8gSU9idWZmIHdpdGggcXVvdGVzLgorICovCisgICAgc3RhdGljIHZvaWQKK21zZ19hZGRfZm5hbWUoYnVmLCBmbmFtZSkKKyAgICBidWZfVAkqYnVmOworICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJZm5hbWUgPSAoY2hhcl91ICopIi1zdGRpbi0iOworICAgIGhvbWVfcmVwbGFjZShidWYsIGZuYW1lLCBJT2J1ZmYgKyAxLCBJT1NJWkUgLSA0LCBUUlVFKTsKKyAgICBJT2J1ZmZbMF0gPSAnIic7CisgICAgU1RSQ0FUKElPYnVmZiwgIlwiICIpOworfQorCisvKgorICogQXBwZW5kIG1lc3NhZ2UgZm9yIHRleHQgbW9kZSB0byBJT2J1ZmYuCisgKiBSZXR1cm4gVFJVRSBpZiBzb21ldGhpbmcgYXBwZW5kZWQuCisgKi8KKyAgICBzdGF0aWMgaW50Cittc2dfYWRkX2ZpbGVmb3JtYXQoZW9sX3R5cGUpCisgICAgaW50CSAgICBlb2xfdHlwZTsKK3sKKyNpZm5kZWYgVVNFX0NSTkwKKyAgICBpZiAoZW9sX3R5cGUgPT0gRU9MX0RPUykKKyAgICB7CisJU1RSQ0FUKElPYnVmZiwgc2hvcnRtZXNzKFNITV9URVhUKSA/IF8oIltkb3NdIikgOiBfKCJbZG9zIGZvcm1hdF0iKSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmCisjaWZuZGVmIFVTRV9DUgorICAgIGlmIChlb2xfdHlwZSA9PSBFT0xfTUFDKQorICAgIHsKKwlTVFJDQVQoSU9idWZmLCBzaG9ydG1lc3MoU0hNX1RFWFQpID8gXygiW21hY10iKSA6IF8oIlttYWMgZm9ybWF0XSIpKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9DUk5MKSB8fCBkZWZpbmVkKFVTRV9DUikKKyAgICBpZiAoZW9sX3R5cGUgPT0gRU9MX1VOSVgpCisgICAgeworCVNUUkNBVChJT2J1ZmYsIHNob3J0bWVzcyhTSE1fVEVYVCkgPyBfKCJbdW5peF0iKSA6IF8oIlt1bml4IGZvcm1hdF0iKSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQXBwZW5kIGxpbmUgYW5kIGNoYXJhY3RlciBjb3VudCB0byBJT2J1ZmYuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbXNnX2FkZF9saW5lcyhpbnNlcnRfc3BhY2UsIGxudW0sIG5jaGFycykKKyAgICBpbnQJICAgIGluc2VydF9zcGFjZTsKKyAgICBsb25nICAgIGxudW07CisgICAgbG9uZyAgICBuY2hhcnM7Cit7CisgICAgY2hhcl91ICAqcDsKKworICAgIHAgPSBJT2J1ZmYgKyBTVFJMRU4oSU9idWZmKTsKKworICAgIGlmIChpbnNlcnRfc3BhY2UpCisJKnArKyA9ICcgJzsKKyAgICBpZiAoc2hvcnRtZXNzKFNITV9MSU5FUykpCisJc3ByaW50ZigoY2hhciAqKXAsICIlbGRMLCAlbGRDIiwgbG51bSwgbmNoYXJzKTsKKyAgICBlbHNlCisgICAgeworCWlmIChsbnVtID09IDEpCisJICAgIFNUUkNQWShwLCBfKCIxIGxpbmUsICIpKTsKKwllbHNlCisJICAgIHNwcmludGYoKGNoYXIgKilwLCBfKCIlbGQgbGluZXMsICIpLCBsbnVtKTsKKwlwICs9IFNUUkxFTihwKTsKKwlpZiAobmNoYXJzID09IDEpCisJICAgIFNUUkNQWShwLCBfKCIxIGNoYXJhY3RlciIpKTsKKwllbHNlCisJICAgIHNwcmludGYoKGNoYXIgKilwLCBfKCIlbGQgY2hhcmFjdGVycyIpLCBuY2hhcnMpOworICAgIH0KK30KKworLyoKKyAqIEFwcGVuZCBtZXNzYWdlIGZvciBtaXNzaW5nIGxpbmUgc2VwYXJhdG9yIHRvIElPYnVmZi4KKyAqLworICAgIHN0YXRpYyB2b2lkCittc2dfYWRkX2VvbCgpCit7CisgICAgU1RSQ0FUKElPYnVmZiwgc2hvcnRtZXNzKFNITV9MQVNUKSA/IF8oIltub2VvbF0iKSA6IF8oIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iKSk7Cit9CisKKy8qCisgKiBDaGVjayBtb2RpZmljYXRpb24gdGltZSBvZiBmaWxlLCBiZWZvcmUgd3JpdGluZyB0byBpdC4KKyAqIFRoZSBzaXplIGlzbid0IGNoZWNrZWQsIGJlY2F1c2UgdXNpbmcgYSB0b29sIGxpa2UgImd6aXAiIHRha2VzIGNhcmUgb2YKKyAqIHVzaW5nIHRoZSBzYW1lIHRpbWVzdGFtcCBidXQgY2FuJ3Qgc2V0IHRoZSBzaXplLgorICovCisgICAgc3RhdGljIGludAorY2hlY2tfbXRpbWUoYnVmLCBzdCkKKyAgICBidWZfVAkJKmJ1ZjsKKyAgICBzdHJ1Y3Qgc3RhdAkJKnN0OworeworICAgIGlmIChidWYtPmJfbXRpbWVfcmVhZCAhPSAwCisJICAgICYmIHRpbWVfZGlmZmVycygobG9uZylzdC0+c3RfbXRpbWUsIGJ1Zi0+Yl9tdGltZV9yZWFkKSkKKyAgICB7CisJbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZSAqLworCW1zZ19zaWxlbnQgPSAwOwkJICAgIC8qIG11c3QgZ2l2ZSB0aGlzIHByb21wdCAqLworCS8qIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycyAqLworCU1TR19BVFRSKF8oIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIpLAorCQkJCQkJICAgICAgIGhsX2F0dHIoSExGX0UpKTsKKwlpZiAoYXNrX3llc25vKChjaGFyX3UgKilfKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiKSwKKwkJCQkJCQkJIFRSVUUpID09ICduJykKKwkgICAgcmV0dXJuIEZBSUw7CisJbXNnX3Njcm9sbCA9IEZBTFNFOwkgICAgLyogYWx3YXlzIG92ZXJ3cml0ZSB0aGUgZmlsZSBtZXNzYWdlIG5vdyAqLworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICBzdGF0aWMgaW50Cit0aW1lX2RpZmZlcnModDEsIHQyKQorICAgIGxvbmcJdDEsIHQyOworeworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorICAgIC8qIE9uIGEgRkFUIGZpbGVzeXN0ZW0sIGVzcC4gdW5kZXIgTGludXgsIHRoZXJlIGFyZSBvbmx5IDUgYml0cyB0byBzdG9yZQorICAgICAqIHRoZSBzZWNvbmRzLiAgU2luY2UgdGhlIHJvdW5kb2ZmIGlzIGRvbmUgd2hlbiBmbHVzaGluZyB0aGUgaW5vZGUsIHRoZQorICAgICAqIHRpbWUgbWF5IGNoYW5nZSB1bmV4cGVjdGVkbHkgYnkgb25lIHNlY29uZCEhISAqLworICAgIHJldHVybiAodDEgLSB0MiA+IDEgfHwgdDIgLSB0MSA+IDEpOworI2Vsc2UKKyAgICByZXR1cm4gKHQxICE9IHQyKTsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbCB3cml0ZSgpIHRvIHdyaXRlIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSBmaWxlLgorICogQWxzbyBoYW5kbGVzIGVuY3J5cHRpb24gYW5kICdlbmNvZGluZycgY29udmVyc2lvbi4KKyAqCisgKiBSZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGludAorYnVmX3dyaXRlX2J5dGVzKGlwKQorICAgIHN0cnVjdCBid19pbmZvICppcDsKK3sKKyAgICBpbnQJCXdsZW47CisgICAgY2hhcl91CSpidWYgPSBpcC0+YndfYnVmOwkvKiBkYXRhIHRvIHdyaXRlICovCisgICAgaW50CQlsZW4gPSBpcC0+YndfbGVuOwkvKiBsZW5ndGggb2YgZGF0YSAqLworI2lmZGVmIEhBU19CV19GTEFHUworICAgIGludAkJZmxhZ3MgPSBpcC0+YndfZmxhZ3M7CS8qIGV4dHJhIGZsYWdzICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKgorICAgICAqIFNraXAgY29udmVyc2lvbiB3aGVuIHdyaXRpbmcgdGhlIGNyeXB0IG1hZ2ljIG51bWJlciBvciB0aGUgQk9NLgorICAgICAqLworICAgIGlmICghKGZsYWdzICYgRklPX05PQ09OVkVSVCkpCisgICAgeworCWNoYXJfdQkJKnA7CisJdW5zaWduZWQJYzsKKwlpbnQJCW47CisKKwlpZiAoZmxhZ3MgJiBGSU9fVVRGOCkKKwl7CisJICAgIC8qCisJICAgICAqIENvbnZlcnQgbGF0aW4xIGluIHRoZSBidWZmZXIgdG8gVVRGLTggaW4gdGhlIGZpbGUuCisJICAgICAqLworCSAgICBwID0gaXAtPmJ3X2NvbnZfYnVmOwkvKiB0cmFuc2xhdGUgdG8gYnVmZmVyICovCisJICAgIGZvciAod2xlbiA9IDA7IHdsZW4gPCBsZW47ICsrd2xlbikKKwkJcCArPSB1dGZfY2hhcjJieXRlcyhidWZbd2xlbl0sIHApOworCSAgICBidWYgPSBpcC0+YndfY29udl9idWY7CisJICAgIGxlbiA9IChpbnQpKHAgLSBpcC0+YndfY29udl9idWYpOworCX0KKwllbHNlIGlmIChmbGFncyAmIChGSU9fVUNTNCB8IEZJT19VVEYxNiB8IEZJT19VQ1MyIHwgRklPX0xBVElOMSkpCisJeworCSAgICAvKgorCSAgICAgKiBDb252ZXJ0IFVURi04IGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gVUNTLTIsIFVDUy00LCBVVEYtMTYgb3IKKwkgICAgICogTGF0aW4xIGNoYXJzIGluIHRoZSBmaWxlLgorCSAgICAgKi8KKwkgICAgaWYgKGZsYWdzICYgRklPX0xBVElOMSkKKwkJcCA9IGJ1ZjsJLyogdHJhbnNsYXRlIGluLXBsYWNlIChjYW4gb25seSBnZXQgc2hvcnRlcikgKi8KKwkgICAgZWxzZQorCQlwID0gaXAtPmJ3X2NvbnZfYnVmOwkvKiB0cmFuc2xhdGUgdG8gYnVmZmVyICovCisJICAgIGZvciAod2xlbiA9IDA7IHdsZW4gPCBsZW47IHdsZW4gKz0gbikKKwkgICAgeworCQlpZiAod2xlbiA9PSAwICYmIGlwLT5id19yZXN0bGVuICE9IDApCisJCXsKKwkJICAgIGludAkJbDsKKworCQkgICAgLyogVXNlIHJlbWFpbmRlciBvZiBwcmV2aW91cyBjYWxsLiAgQXBwZW5kIHRoZSBzdGFydCBvZgorCQkgICAgICogYnVmW10gdG8gZ2V0IGEgZnVsbCBzZXF1ZW5jZS4gIE1pZ2h0IHN0aWxsIGJlIHRvbworCQkgICAgICogc2hvcnQhICovCisJCSAgICBsID0gQ09OVl9SRVNUTEVOIC0gaXAtPmJ3X3Jlc3RsZW47CisJCSAgICBpZiAobCA+IGxlbikKKwkJCWwgPSBsZW47CisJCSAgICBtY2hfbWVtbW92ZShpcC0+YndfcmVzdCArIGlwLT5id19yZXN0bGVuLCBidWYsIChzaXplX3QpbCk7CisJCSAgICBuID0gdXRmX3B0cjJsZW5fY2hlY2tfbGVuKGlwLT5id19yZXN0LCBpcC0+YndfcmVzdGxlbiArIGwpOworCQkgICAgaWYgKG4gPiBpcC0+YndfcmVzdGxlbiArIGxlbikKKwkJICAgIHsKKwkJCS8qIFdlIGhhdmUgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlIGF0IHRoZSBlbmQgdG8KKwkJCSAqIGJlIHdyaXR0ZW4uICBXZSBjYW4ndCBjb252ZXJ0IGl0IHdpdGhvdXQgdGhlCisJCQkgKiByZW1haW5pbmcgYnl0ZXMuICBLZWVwIHRoZW0gZm9yIHRoZSBuZXh0IGNhbGwuICovCisJCQlpZiAoaXAtPmJ3X3Jlc3RsZW4gKyBsZW4gPiBDT05WX1JFU1RMRU4pCisJCQkgICAgcmV0dXJuIEZBSUw7CisJCQlpcC0+YndfcmVzdGxlbiArPSBsZW47CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmIChuID4gMSkKKwkJCWMgPSB1dGZfcHRyMmNoYXIoaXAtPmJ3X3Jlc3QpOworCQkgICAgZWxzZQorCQkJYyA9IGlwLT5id19yZXN0WzBdOworCQkgICAgaWYgKG4gPj0gaXAtPmJ3X3Jlc3RsZW4pCisJCSAgICB7CisJCQluIC09IGlwLT5id19yZXN0bGVuOworCQkJaXAtPmJ3X3Jlc3RsZW4gPSAwOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJaXAtPmJ3X3Jlc3RsZW4gLT0gbjsKKwkJCW1jaF9tZW1tb3ZlKGlwLT5id19yZXN0LCBpcC0+YndfcmVzdCArIG4sCisJCQkJCQkgICAgICAoc2l6ZV90KWlwLT5id19yZXN0bGVuKTsKKwkJCW4gPSAwOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgbiA9IHV0Zl9wdHIybGVuX2NoZWNrX2xlbihidWYgKyB3bGVuLCBsZW4gLSB3bGVuKTsKKwkJICAgIGlmIChuID4gbGVuIC0gd2xlbikKKwkJICAgIHsKKwkJCS8qIFdlIGhhdmUgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlIGF0IHRoZSBlbmQgdG8KKwkJCSAqIGJlIHdyaXR0ZW4uICBXZSBjYW4ndCBjb252ZXJ0IGl0IHdpdGhvdXQgdGhlCisJCQkgKiByZW1haW5pbmcgYnl0ZXMuICBLZWVwIHRoZW0gZm9yIHRoZSBuZXh0IGNhbGwuICovCisJCQlpZiAobGVuIC0gd2xlbiA+IENPTlZfUkVTVExFTikKKwkJCSAgICByZXR1cm4gRkFJTDsKKwkJCWlwLT5id19yZXN0bGVuID0gbGVuIC0gd2xlbjsKKwkJCW1jaF9tZW1tb3ZlKGlwLT5id19yZXN0LCBidWYgKyB3bGVuLAorCQkJCQkJICAgICAgKHNpemVfdClpcC0+YndfcmVzdGxlbik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmIChuID4gMSkKKwkJCWMgPSB1dGZfcHRyMmNoYXIoYnVmICsgd2xlbik7CisJCSAgICBlbHNlCisJCQljID0gYnVmW3dsZW5dOworCQl9CisKKwkJaXAtPmJ3X2NvbnZfZXJyb3IgfD0gdWNzMmJ5dGVzKGMsICZwLCBmbGFncyk7CisJICAgIH0KKwkgICAgaWYgKGZsYWdzICYgRklPX0xBVElOMSkKKwkJbGVuID0gKGludCkocCAtIGJ1Zik7CisJICAgIGVsc2UKKwkgICAgeworCQlidWYgPSBpcC0+YndfY29udl9idWY7CisJCWxlbiA9IChpbnQpKHAgLSBpcC0+YndfY29udl9idWYpOworCSAgICB9CisJfQorCisjIGlmZGVmIFdJTjMyNjQKKwllbHNlIGlmIChmbGFncyAmIEZJT19DT0RFUEFHRSkKKwl7CisJICAgIC8qCisJICAgICAqIENvbnZlcnQgVVRGLTggb3IgY29kZXBhZ2UgdG8gVUNTLTIgYW5kIHRoZW4gdG8gTVMtV2luZG93cworCSAgICAgKiBjb2RlcGFnZS4KKwkgICAgICovCisJICAgIGNoYXJfdQkqZnJvbTsKKwkgICAgc2l6ZV90CWZyb21sZW47CisJICAgIGNoYXJfdQkqdG87CisJICAgIGludAkJdThjOworCSAgICBCT09MCWJhZCA9IEZBTFNFOworCSAgICBpbnQJCW5lZWRlZDsKKworCSAgICBpZiAoaXAtPmJ3X3Jlc3RsZW4gPiAwKQorCSAgICB7CisJCS8qIE5lZWQgdG8gY29uY2F0ZW5hdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgcHJldmlvdXMgY2FsbCBhbmQKKwkJICogdGhlIGJ5dGVzIG9mIHRoZSBjdXJyZW50IGNhbGwuICBVc2UgdGhlIGVuZCBvZiB0aGUKKwkJICogY29udmVyc2lvbiBidWZmZXIgZm9yIHRoaXMuICovCisJCWZyb21sZW4gPSBsZW4gKyBpcC0+YndfcmVzdGxlbjsKKwkJZnJvbSA9IGlwLT5id19jb252X2J1ZiArIGlwLT5id19jb252X2J1ZmxlbiAtIGZyb21sZW47CisJCW1jaF9tZW1tb3ZlKGZyb20sIGlwLT5id19yZXN0LCAoc2l6ZV90KWlwLT5id19yZXN0bGVuKTsKKwkJbWNoX21lbW1vdmUoZnJvbSArIGlwLT5id19yZXN0bGVuLCBidWYsIChzaXplX3QpbGVuKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZnJvbSA9IGJ1ZjsKKwkJZnJvbWxlbiA9IGxlbjsKKwkgICAgfQorCisJICAgIHRvID0gaXAtPmJ3X2NvbnZfYnVmOworCSAgICBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJLyogQ29udmVydCBmcm9tIFVURi04IHRvIFVDUy0yLCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKwkJICogVGhlIGJ1ZmZlciBoYXMgYmVlbiBhbGxvY2F0ZWQgdG8gYmUgYmlnIGVub3VnaC4gKi8KKwkJd2hpbGUgKGZyb21sZW4gPiAwKQorCQl7CisJCSAgICBuID0gdXRmX3B0cjJsZW5fY2hlY2tfbGVuKGZyb20sIGZyb21sZW4pOworCQkgICAgaWYgKG4gPiAoaW50KWZyb21sZW4pCS8qIGluY29tcGxldGUgYnl0ZSBzZXF1ZW5jZSAqLworCQkJYnJlYWs7CisJCSAgICB1OGMgPSB1dGZfcHRyMmNoYXIoZnJvbSk7CisJCSAgICAqdG8rKyA9ICh1OGMgJiAweGZmKTsKKwkJICAgICp0bysrID0gKHU4YyA+PiA4KTsKKwkJICAgIGZyb21sZW4gLT0gbjsKKwkJICAgIGZyb20gKz0gbjsKKwkJfQorCisJCS8qIENvcHkgcmVtYWluZGVyIHRvIGlwLT5id19yZXN0W10gdG8gYmUgdXNlZCBmb3IgdGhlIG5leHQKKwkJICogY2FsbC4gKi8KKwkJaWYgKGZyb21sZW4gPiBDT05WX1JFU1RMRU4pCisJCXsKKwkJICAgIC8qIHdlaXJkIG92ZXJsb25nIHNlcXVlbmNlICovCisJCSAgICBpcC0+YndfY29udl9lcnJvciA9IFRSVUU7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCQltY2hfbWVtbW92ZShpcC0+YndfcmVzdCwgZnJvbSwgZnJvbWxlbik7CisJCWlwLT5id19yZXN0bGVuID0gZnJvbWxlbjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ29udmVydCBmcm9tIGVuY19jb2RlcGFnZSB0byBVQ1MtMiwgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCQkgKiBidWZmZXIuICBUaGUgYnVmZmVyIGhhcyBiZWVuIGFsbG9jYXRlZCB0byBiZSBiaWcgZW5vdWdoLiAqLworCQlpcC0+YndfcmVzdGxlbiA9IDA7CisJCW5lZWRlZCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoZW5jX2NvZGVwYWdlLAorCQkJCSAgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIChMUENTVFIpZnJvbSwgZnJvbWxlbiwKKwkJCQkJCQkJICAgICBOVUxMLCAwKTsKKwkJaWYgKG5lZWRlZCA9PSAwKQorCQl7CisJCSAgICAvKiBXaGVuIGNvbnZlcnNpb24gZmFpbHMgdGhlcmUgbWF5IGJlIGEgdHJhaWxpbmcgYnl0ZS4gKi8KKwkJICAgIG5lZWRlZCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoZW5jX2NvZGVwYWdlLAorCQkJICAgICAgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIChMUENTVFIpZnJvbSwgZnJvbWxlbiAtIDEsCisJCQkJCQkJCSAgICAgTlVMTCwgMCk7CisJCSAgICBpZiAobmVlZGVkID09IDApCisJCSAgICB7CisJCQkvKiBDb252ZXJzaW9uIGRvZXNuJ3Qgd29yay4gKi8KKwkJCWlwLT5id19jb252X2Vycm9yID0gVFJVRTsKKwkJCXJldHVybiBGQUlMOworCQkgICAgfQorCQkgICAgLyogU2F2ZSB0aGUgdHJhaWxpbmcgYnl0ZSBmb3IgdGhlIG5leHQgY2FsbC4gKi8KKwkJICAgIGlwLT5id19yZXN0WzBdID0gZnJvbVtmcm9tbGVuIC0gMV07CisJCSAgICBpcC0+YndfcmVzdGxlbiA9IDE7CisJCX0KKwkJbmVlZGVkID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihlbmNfY29kZXBhZ2UsIE1CX0VSUl9JTlZBTElEX0NIQVJTLAorCQkJCSAgICAgICAoTFBDU1RSKWZyb20sIGZyb21sZW4gLSBpcC0+YndfcmVzdGxlbiwKKwkJCQkJCQkgIChMUFdTVFIpdG8sIG5lZWRlZCk7CisJCWlmIChuZWVkZWQgPT0gMCkKKwkJeworCQkgICAgLyogU2FmZXR5IGNoZWNrOiBDb252ZXJzaW9uIGRvZXNuJ3Qgd29yay4gKi8KKwkJICAgIGlwLT5id19jb252X2Vycm9yID0gVFJVRTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCXRvICs9IG5lZWRlZCAqIDI7CisJICAgIH0KKworCSAgICBmcm9tbGVuID0gdG8gLSBpcC0+YndfY29udl9idWY7CisJICAgIGJ1ZiA9IHRvOworIyAgaWZkZWYgQ1BfVVRGOAkvKiBWQyA0LjEgZG9lc24ndCBkZWZpbmUgQ1BfVVRGOCAqLworCSAgICBpZiAoRklPX0dFVF9DUChmbGFncykgPT0gQ1BfVVRGOCkKKwkgICAgeworCQkvKiBDb252ZXJ0IGZyb20gVUNTLTIgdG8gVVRGLTgsIHVzaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlCisJCSAqIGNvbnZlcnNpb24gYnVmZmVyLiAgRmFpbHMgd2hlbiBvdXQgb2Ygc3BhY2UuICovCisJCWZvciAoZnJvbSA9IGlwLT5id19jb252X2J1ZjsgZnJvbWxlbiA+IDE7IGZyb21sZW4gLT0gMikKKwkJeworCQkgICAgdThjID0gKmZyb20rKzsKKwkJICAgIHU4YyArPSAoKmZyb20rKyA8PCA4KTsKKwkJICAgIHRvICs9IHV0Zl9jaGFyMmJ5dGVzKHU4YywgdG8pOworCQkgICAgaWYgKHRvICsgNiA+PSBpcC0+YndfY29udl9idWYgKyBpcC0+YndfY29udl9idWZsZW4pCisJCSAgICB7CisJCQlpcC0+YndfY29udl9lcnJvciA9IFRSVUU7CisJCQlyZXR1cm4gRkFJTDsKKwkJICAgIH0KKwkJfQorCQlsZW4gPSB0byAtIGJ1ZjsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQkvKiBDb252ZXJ0IGZyb20gVUNTLTIgdG8gdGhlIGNvZGVwYWdlLCB1c2luZyB0aGUgcmVtYWluZGVyIG9mCisJCSAqIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gIElmIHRoZSBjb252ZXJzaW9uIHVzZXMgdGhlIGRlZmF1bHQKKwkJICogY2hhcmFjdGVyICIwIiwgdGhlIGRhdGEgZG9lc24ndCBmaXQgaW4gdGhpcyBlbmNvZGluZywgc28KKwkJICogZmFpbC4gKi8KKwkJbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShGSU9fR0VUX0NQKGZsYWdzKSwgMCwKKwkJCShMUENXU1RSKWlwLT5id19jb252X2J1ZiwgKGludClmcm9tbGVuIC8gc2l6ZW9mKFdDSEFSKSwKKwkJCShMUFNUUil0bywgaXAtPmJ3X2NvbnZfYnVmbGVuIC0gZnJvbWxlbiwgMCwgJmJhZCk7CisJCWlmIChiYWQpCisJCXsKKwkJICAgIGlwLT5id19jb252X2Vycm9yID0gVFJVRTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJICAgIH0KKwl9CisjIGVuZGlmCisKKyMgaWZkZWYgTUFDT1NfWAorCWVsc2UgaWYgKGZsYWdzICYgRklPX01BQ1JPTUFOKQorCXsKKwkgICAgLyoKKwkgICAgICogQ29udmVydCBVVEYtOCBvciBsYXRpbjEgdG8gQXBwbGUgTWFjUm9tYW4uCisJICAgICAqLworCSAgICBDRlN0cmluZ1JlZgljZnN0cjsKKwkgICAgQ0ZSYW5nZQlyOworCSAgICBDRkluZGV4CWw7CisJICAgIGNoYXJfdQkqZnJvbTsKKwkgICAgc2l6ZV90CWZyb21sZW47CisKKwkgICAgaWYgKGlwLT5id19yZXN0bGVuID4gMCkKKwkgICAgeworCQkvKiBOZWVkIHRvIGNvbmNhdGVuYXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIHByZXZpb3VzIGNhbGwgYW5kCisJCSAqIHRoZSBieXRlcyBvZiB0aGUgY3VycmVudCBjYWxsLiAgVXNlIHRoZSBlbmQgb2YgdGhlCisJCSAqIGNvbnZlcnNpb24gYnVmZmVyIGZvciB0aGlzLiAqLworCQlmcm9tbGVuID0gbGVuICsgaXAtPmJ3X3Jlc3RsZW47CisJCWZyb20gPSBpcC0+YndfY29udl9idWYgKyBpcC0+YndfY29udl9idWZsZW4gLSBmcm9tbGVuOworCQltY2hfbWVtbW92ZShmcm9tLCBpcC0+YndfcmVzdCwgKHNpemVfdClpcC0+YndfcmVzdGxlbik7CisJCW1jaF9tZW1tb3ZlKGZyb20gKyBpcC0+YndfcmVzdGxlbiwgYnVmLCAoc2l6ZV90KWxlbik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWZyb20gPSBidWY7CisJCWZyb21sZW4gPSBsZW47CisJICAgIH0KKworCSAgICBpcC0+YndfcmVzdGxlbiA9IDA7CisJICAgIGNmc3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoTlVMTCwgZnJvbSwgZnJvbWxlbiwKKwkJICAgIChlbmNfdXRmOCkgPworCQkgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4IDoga0NGU3RyaW5nRW5jb2RpbmdJU09MYXRpbjEsCisJCSAgICAwKTsKKwkgICAgd2hpbGUgKGNmc3RyID09IE5VTEwgJiYgaXAtPmJ3X3Jlc3RsZW4gPCAzICYmIGZyb21sZW4gPiAxKQorCSAgICB7CisJCWlwLT5id19yZXN0W2lwLT5id19yZXN0bGVuKytdID0gZnJvbVstLWZyb21sZW5dOworCQljZnN0ciA9IENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKE5VTEwsIGZyb20sIGZyb21sZW4sCisJCSAgICAoZW5jX3V0ZjgpID8KKwkJICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCA6IGtDRlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xLAorCQkgICAgMCk7CisJICAgIH0KKwkgICAgaWYgKGNmc3RyID09IE5VTEwpCisJICAgIHsKKwkJaXAtPmJ3X2NvbnZfZXJyb3IgPSBUUlVFOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCisJICAgIHIubG9jYXRpb24gPSAwOworCSAgICByLmxlbmd0aCA9IENGU3RyaW5nR2V0TGVuZ3RoKGNmc3RyKTsKKwkgICAgaWYgKHIubGVuZ3RoICE9IENGU3RyaW5nR2V0Qnl0ZXMoY2ZzdHIsIHIsCisJCQlrQ0ZTdHJpbmdFbmNvZGluZ01hY1JvbWFuLAorCQkJMCwgLyogbm8gbG9zc3kgY29udmVyc2lvbiAqLworCQkJMCwgLyogbm90IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIChzaW5jZSB2aW0KKwkJCSAgICAqIGhhbmRsZXMgdGhpcyBpbnRlcm5hbGx5ICovCisJCQlpcC0+YndfY29udl9idWYsIGlwLT5id19jb252X2J1ZmxlbiwgJmwpKQorCSAgICB7CisJCUNGUmVsZWFzZShjZnN0cik7CisJCWlwLT5id19jb252X2Vycm9yID0gVFJVRTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgQ0ZSZWxlYXNlKGNmc3RyKTsKKwkgICAgYnVmID0gaXAtPmJ3X2NvbnZfYnVmOworCSAgICBsZW4gPSBsOworCX0KKyMgZW5kaWYKKworIyBpZmRlZiBVU0VfSUNPTlYKKwlpZiAoaXAtPmJ3X2ljb252X2ZkICE9IChpY29udl90KS0xKQorCXsKKwkgICAgY29uc3QgY2hhcgkqZnJvbTsKKwkgICAgc2l6ZV90CWZyb21sZW47CisJICAgIGNoYXIJKnRvOworCSAgICBzaXplX3QJdG9sZW47CisKKwkgICAgLyogQ29udmVydCB3aXRoIGljb252KCkuICovCisJICAgIGlmIChpcC0+YndfcmVzdGxlbiA+IDApCisJICAgIHsKKwkJLyogTmVlZCB0byBjb25jYXRlbmF0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBwcmV2aW91cyBjYWxsIGFuZAorCQkgKiB0aGUgYnl0ZXMgb2YgdGhlIGN1cnJlbnQgY2FsbC4gIFVzZSB0aGUgZW5kIG9mIHRoZQorCQkgKiBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgdGhpcy4gKi8KKwkJZnJvbWxlbiA9IGxlbiArIGlwLT5id19yZXN0bGVuOworCQlmcm9tID0gKGNoYXIgKilpcC0+YndfY29udl9idWYgKyBpcC0+YndfY29udl9idWZsZW4gLSBmcm9tbGVuOworCQltY2hfbWVtbW92ZSgodm9pZCAqKWZyb20sIGlwLT5id19yZXN0LCAoc2l6ZV90KWlwLT5id19yZXN0bGVuKTsKKwkJbWNoX21lbW1vdmUoKHZvaWQgKikoZnJvbSArIGlwLT5id19yZXN0bGVuKSwgYnVmLCAoc2l6ZV90KWxlbik7CisJCXRvbGVuID0gaXAtPmJ3X2NvbnZfYnVmbGVuIC0gZnJvbWxlbjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZnJvbSA9IChjb25zdCBjaGFyICopYnVmOworCQlmcm9tbGVuID0gbGVuOworCQl0b2xlbiA9IGlwLT5id19jb252X2J1ZmxlbjsKKwkgICAgfQorCSAgICB0byA9IChjaGFyICopaXAtPmJ3X2NvbnZfYnVmOworCisJICAgIGlmIChpcC0+YndfZmlyc3QpCisJICAgIHsKKwkJc2l6ZV90CXNhdmVfbGVuID0gdG9sZW47CisKKwkJLyogb3V0cHV0IHRoZSBpbml0aWFsIHNoaWZ0IHN0YXRlIHNlcXVlbmNlICovCisJCSh2b2lkKWljb252KGlwLT5id19pY29udl9mZCwgTlVMTCwgTlVMTCwgJnRvLCAmdG9sZW4pOworCisJCS8qIFRoZXJlIGlzIGEgYnVnIGluIGljb252KCkgb24gTGludXggKHdoaWNoIGFwcGVhcnMgdG8gYmUKKwkJICogd2lkZS1zcHJlYWQpIHdoaWNoIHNldHMgInRvIiB0byBOVUxMIGFuZCBtZXNzZXMgdXAgInRvbGVuIi4KKwkJICovCisJCWlmICh0byA9PSBOVUxMKQorCQl7CisJCSAgICB0byA9IChjaGFyICopaXAtPmJ3X2NvbnZfYnVmOworCQkgICAgdG9sZW4gPSBzYXZlX2xlbjsKKwkJfQorCQlpcC0+YndfZmlyc3QgPSBGQUxTRTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIGljb252KCkgaGFzIGFuIGVycm9yIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSwgZmFpbC4KKwkgICAgICovCisJICAgIGlmICgoaWNvbnYoaXAtPmJ3X2ljb252X2ZkLCAodm9pZCAqKSZmcm9tLCAmZnJvbWxlbiwgJnRvLCAmdG9sZW4pCisJCQk9PSAoc2l6ZV90KS0xICYmIElDT05WX0VSUk5PICE9IElDT05WX0VJTlZBTCkKKwkJCQkJCSAgICB8fCBmcm9tbGVuID4gQ09OVl9SRVNUTEVOKQorCSAgICB7CisJCWlwLT5id19jb252X2Vycm9yID0gVFJVRTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKworCSAgICAvKiBjb3B5IHJlbWFpbmRlciB0byBpcC0+YndfcmVzdFtdIHRvIGJlIHVzZWQgZm9yIHRoZSBuZXh0IGNhbGwuICovCisJICAgIGlmIChmcm9tbGVuID4gMCkKKwkJbWNoX21lbW1vdmUoaXAtPmJ3X3Jlc3QsICh2b2lkICopZnJvbSwgZnJvbWxlbik7CisJICAgIGlwLT5id19yZXN0bGVuID0gKGludClmcm9tbGVuOworCisJICAgIGJ1ZiA9IGlwLT5id19jb252X2J1ZjsKKwkgICAgbGVuID0gKGludCkoKGNoYXJfdSAqKXRvIC0gaXAtPmJ3X2NvbnZfYnVmKTsKKwl9CisjIGVuZGlmCisgICAgfQorI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBpZiAoZmxhZ3MgJiBGSU9fRU5DUllQVEVEKQkJLyogZW5jcnlwdCB0aGUgZGF0YSAqLworICAgIHsKKwlpbnQgenRlbXAsIHQsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgICB6dGVtcCAgPSBidWZbaV07CisJICAgIGJ1ZltpXSA9IFpFTkNPREUoenRlbXAsIHQpOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFJlcGVhdCB0aGUgd3JpdGUoKSwgaXQgbWF5IGJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLiAqLworICAgIHdoaWxlIChsZW4pCisgICAgeworCXdsZW4gPSB2aW1fd3JpdGUoaXAtPmJ3X2ZkLCBidWYsIGxlbik7CisJaWYgKHdsZW4gPD0gMCkJCSAgICAvKiBlcnJvciEgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisJbGVuIC09IHdsZW47CisJYnVmICs9IHdsZW47CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qCisgKiBDb252ZXJ0IGEgVW5pY29kZSBjaGFyYWN0ZXIgdG8gYnl0ZXMuCisgKi8KKyAgICBzdGF0aWMgaW50Cit1Y3MyYnl0ZXMoYywgcHAsIGZsYWdzKQorICAgIHVuc2lnbmVkCWM7CQkvKiBpbjogY2hhcmFjdGVyICovCisgICAgY2hhcl91CSoqcHA7CQkvKiBpbi9vdXQ6IHBvaW50ZXIgdG8gcmVzdWx0ICovCisgICAgaW50CQlmbGFnczsJCS8qIEZJT18gZmxhZ3MgKi8KK3sKKyAgICBjaGFyX3UJKnAgPSAqcHA7CisgICAgaW50CQllcnJvciA9IEZBTFNFOworICAgIGludAkJY2M7CisKKworICAgIGlmIChmbGFncyAmIEZJT19VQ1M0KQorICAgIHsKKwlpZiAoZmxhZ3MgJiBGSU9fRU5ESUFOX0wpCisJeworCSAgICAqcCsrID0gYzsKKwkgICAgKnArKyA9IChjID4+IDgpOworCSAgICAqcCsrID0gKGMgPj4gMTYpOworCSAgICAqcCsrID0gKGMgPj4gMjQpOworCX0KKwllbHNlCisJeworCSAgICAqcCsrID0gKGMgPj4gMjQpOworCSAgICAqcCsrID0gKGMgPj4gMTYpOworCSAgICAqcCsrID0gKGMgPj4gOCk7CisJICAgICpwKysgPSBjOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoZmxhZ3MgJiAoRklPX1VDUzIgfCBGSU9fVVRGMTYpKQorICAgIHsKKwlpZiAoYyA+PSAweDEwMDAwKQorCXsKKwkgICAgaWYgKGZsYWdzICYgRklPX1VURjE2KQorCSAgICB7CisJCS8qIE1ha2UgdHdvIHdvcmRzLCB0ZW4gYml0cyBvZiB0aGUgY2hhcmFjdGVyIGluIGVhY2guICBGaXJzdAorCQkgKiB3b3JkIGlzIDB4ZDgwMCAtIDB4ZGJmZiwgc2Vjb25kIG9uZSAweGRjMDAgLSAweGRmZmYgKi8KKwkJYyAtPSAweDEwMDAwOworCQlpZiAoYyA+PSAweDEwMDAwMCkKKwkJICAgIGVycm9yID0gVFJVRTsKKwkJY2MgPSAoKGMgPj4gMTApICYgMHgzZmYpICsgMHhkODAwOworCQlpZiAoZmxhZ3MgJiBGSU9fRU5ESUFOX0wpCisJCXsKKwkJICAgICpwKysgPSBjYzsKKwkJICAgICpwKysgPSAoKHVuc2lnbmVkKWNjID4+IDgpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgKnArKyA9ICgodW5zaWduZWQpY2MgPj4gOCk7CisJCSAgICAqcCsrID0gY2M7CisJCX0KKwkJYyA9IChjICYgMHgzZmYpICsgMHhkYzAwOworCSAgICB9CisJICAgIGVsc2UKKwkJZXJyb3IgPSBUUlVFOworCX0KKwlpZiAoZmxhZ3MgJiBGSU9fRU5ESUFOX0wpCisJeworCSAgICAqcCsrID0gYzsKKwkgICAgKnArKyA9IChjID4+IDgpOworCX0KKwllbHNlCisJeworCSAgICAqcCsrID0gKGMgPj4gOCk7CisJICAgICpwKysgPSBjOworCX0KKyAgICB9CisgICAgZWxzZSAgICAvKiBMYXRpbjEgKi8KKyAgICB7CisJaWYgKGMgPj0gMHgxMDApCisJeworCSAgICBlcnJvciA9IFRSVUU7CisJICAgICpwKysgPSAweEJGOworCX0KKwllbHNlCisJICAgICpwKysgPSBjOworICAgIH0KKworICAgICpwcCA9IHA7CisgICAgcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgImEiIGFuZCAiYiIgYXJlIHRoZSBzYW1lICdlbmNvZGluZycuCisgKiBJZ25vcmVzIGRpZmZlcmVuY2UgYmV0d2VlbiAiYW5zaSIgYW5kICJsYXRpbjEiLCAidWNzLTQiIGFuZCAidWNzLTRiZSIsIGV0Yy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3NhbWVfZW5jb2RpbmcoYSwgYikKKyAgICBjaGFyX3UJKmE7CisgICAgY2hhcl91CSpiOworeworICAgIGludAkJZjsKKworICAgIGlmIChTVFJDTVAoYSwgYikgPT0gMCkKKwlyZXR1cm4gVFJVRTsKKyAgICBmID0gZ2V0X2Zpb19mbGFncyhhKTsKKyAgICByZXR1cm4gKGYgIT0gMCAmJiBnZXRfZmlvX2ZsYWdzKGIpID09IGYpOworfQorCisvKgorICogQ2hlY2sgInB0ciIgZm9yIGEgdW5pY29kZSBlbmNvZGluZyBhbmQgcmV0dXJuIHRoZSBGSU9fIGZsYWdzIG5lZWRlZCBmb3IgdGhlCisgKiBpbnRlcm5hbCBjb252ZXJzaW9uLgorICogaWYgInB0ciIgaXMgYW4gZW1wdHkgc3RyaW5nLCB1c2UgJ2VuY29kaW5nJy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9maW9fZmxhZ3MocHRyKQorICAgIGNoYXJfdQkqcHRyOworeworICAgIGludAkJcHJvcDsKKworICAgIGlmICgqcHRyID09IE5VTCkKKwlwdHIgPSBwX2VuYzsKKworICAgIHByb3AgPSBlbmNfY2Fub25fcHJvcHMocHRyKTsKKyAgICBpZiAocHJvcCAmIEVOQ19VTklDT0RFKQorICAgIHsKKwlpZiAocHJvcCAmIEVOQ18yQllURSkKKwl7CisJICAgIGlmIChwcm9wICYgRU5DX0VORElBTl9MKQorCQlyZXR1cm4gRklPX1VDUzIgfCBGSU9fRU5ESUFOX0w7CisJICAgIHJldHVybiBGSU9fVUNTMjsKKwl9CisJaWYgKHByb3AgJiBFTkNfNEJZVEUpCisJeworCSAgICBpZiAocHJvcCAmIEVOQ19FTkRJQU5fTCkKKwkJcmV0dXJuIEZJT19VQ1M0IHwgRklPX0VORElBTl9MOworCSAgICByZXR1cm4gRklPX1VDUzQ7CisJfQorCWlmIChwcm9wICYgRU5DXzJXT1JEKQorCXsKKwkgICAgaWYgKHByb3AgJiBFTkNfRU5ESUFOX0wpCisJCXJldHVybiBGSU9fVVRGMTYgfCBGSU9fRU5ESUFOX0w7CisJICAgIHJldHVybiBGSU9fVVRGMTY7CisJfQorCXJldHVybiBGSU9fVVRGODsKKyAgICB9CisgICAgaWYgKHByb3AgJiBFTkNfTEFUSU4xKQorCXJldHVybiBGSU9fTEFUSU4xOworICAgIC8qIG11c3QgYmUgRU5DX0RCQ1MsIHJlcXVpcmVzIGljb252KCkgKi8KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIFdJTjMyNjQKKy8qCisgKiBDaGVjayAicHRyIiBmb3IgYSBNUy1XaW5kb3dzIGNvZGVwYWdlIG5hbWUgYW5kIHJldHVybiB0aGUgRklPXyBmbGFncyBuZWVkZWQKKyAqIGZvciB0aGUgY29udmVyc2lvbiBNUy1XaW5kb3dzIGNhbiBkbyBmb3IgdXMuICBBbHNvIGFjY2VwdCAidXRmLTgiLgorICogVXNlZCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuICdlbmNvZGluZycgYW5kICdmaWxlZW5jb2RpbmcnLgorICovCisgICAgc3RhdGljIGludAorZ2V0X3dpbl9maW9fZmxhZ3MocHRyKQorICAgIGNoYXJfdQkqcHRyOworeworICAgIGludAkJY3A7CisKKyAgICAvKiBDYW5ub3QgZG8gdGhpcyB3aGVuICdlbmNvZGluZycgaXMgbm90IHV0Zi04IGFuZCBub3QgYSBjb2RlcGFnZS4gKi8KKyAgICBpZiAoIWVuY191dGY4ICYmIGVuY19jb2RlcGFnZSA8PSAwKQorCXJldHVybiAwOworCisgICAgY3AgPSBlbmNuYW1lMmNvZGVwYWdlKHB0cik7CisgICAgaWYgKGNwID09IDApCisgICAgeworIyAgaWZkZWYgQ1BfVVRGOAkvKiBWQyA0LjEgZG9lc24ndCBkZWZpbmUgQ1BfVVRGOCAqLworCWlmIChTVFJDTVAocHRyLCAidXRmLTgiKSA9PSAwKQorCSAgICBjcCA9IENQX1VURjg7CisJZWxzZQorIyAgZW5kaWYKKwkgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBGSU9fUFVUX0NQKGNwKSB8IEZJT19DT0RFUEFHRTsKK30KKyNlbmRpZgorCisjaWZkZWYgTUFDT1NfWAorLyoKKyAqIENoZWNrICJwdHIiIGZvciBhIENhcmJvbiBzdXBwb3J0ZWQgZW5jb2RpbmcgYW5kIHJldHVybiB0aGUgRklPXyBmbGFncworICogbmVlZGVkIGZvciB0aGUgaW50ZXJuYWwgY29udmVyc2lvbiB0by9mcm9tIHV0Zi04IG9yIGxhdGluMS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9tYWNfZmlvX2ZsYWdzKHB0cikKKyAgICBjaGFyX3UJKnB0cjsKK3sKKyAgICBpZiAoKGVuY191dGY4IHx8IFNUUkNNUChwX2VuYywgImxhdGluMSIpID09IDApCisJCQkJICAgICAmJiAoZW5jX2Nhbm9uX3Byb3BzKHB0cikgJiBFTkNfTUFDUk9NQU4pKQorCXJldHVybiBGSU9fTUFDUk9NQU47CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGZvciBhIFVuaWNvZGUgQk9NIChCeXRlIE9yZGVyIE1hcmspIGF0IHRoZSBzdGFydCBvZiBwW3NpemVdLgorICogInNpemUiIG11c3QgYmUgYXQgbGVhc3QgMi4KKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgYW5kIHNldCAiKmxlbnAiIHRvIHRoZSBsZW5ndGguCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBubyBCT00gZm91bmQuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2NoZWNrX2Zvcl9ib20ocCwgc2l6ZSwgbGVucCwgZmxhZ3MpCisgICAgY2hhcl91CSpwOworICAgIGxvbmcJc2l6ZTsKKyAgICBpbnQJCSpsZW5wOworICAgIGludAkJZmxhZ3M7Cit7CisgICAgY2hhcgkqbmFtZSA9IE5VTEw7CisgICAgaW50CQlsZW4gPSAyOworCisgICAgaWYgKHBbMF0gPT0gMHhlZiAmJiBwWzFdID09IDB4YmIgJiYgc2l6ZSA+PSAzICYmIHBbMl0gPT0gMHhiZgorCSAgICAmJiAoZmxhZ3MgPT0gRklPX0FMTCB8fCBmbGFncyA9PSAwKSkKKyAgICB7CisJbmFtZSA9ICJ1dGYtOCI7CQkvKiBFRiBCQiBCRiAqLworCWxlbiA9IDM7CisgICAgfQorICAgIGVsc2UgaWYgKHBbMF0gPT0gMHhmZiAmJiBwWzFdID09IDB4ZmUpCisgICAgeworCWlmIChzaXplID49IDQgJiYgcFsyXSA9PSAwICYmIHBbM10gPT0gMAorCSAgICAmJiAoZmxhZ3MgPT0gRklPX0FMTCB8fCBmbGFncyA9PSAoRklPX1VDUzQgfCBGSU9fRU5ESUFOX0wpKSkKKwl7CisJICAgIG5hbWUgPSAidWNzLTRsZSI7CS8qIEZGIEZFIDAwIDAwICovCisJICAgIGxlbiA9IDQ7CisJfQorCWVsc2UgaWYgKGZsYWdzID09IEZJT19BTEwgfHwgZmxhZ3MgPT0gKEZJT19VQ1MyIHwgRklPX0VORElBTl9MKSkKKwkgICAgbmFtZSA9ICJ1Y3MtMmxlIjsJLyogRkYgRkUgKi8KKwllbHNlIGlmIChmbGFncyA9PSAoRklPX1VURjE2IHwgRklPX0VORElBTl9MKSkKKwkgICAgbmFtZSA9ICJ1dGYtMTZsZSI7CS8qIEZGIEZFICovCisgICAgfQorICAgIGVsc2UgaWYgKHBbMF0gPT0gMHhmZSAmJiBwWzFdID09IDB4ZmYKKwkgICAgJiYgKGZsYWdzID09IEZJT19BTEwgfHwgZmxhZ3MgPT0gRklPX1VDUzIgfHwgZmxhZ3MgPT0gRklPX1VURjE2KSkKKyAgICB7CisJaWYgKGZsYWdzID09IEZJT19VVEYxNikKKwkgICAgbmFtZSA9ICJ1dGYtMTYiOwkvKiBGRSBGRiAqLworCWVsc2UKKwkgICAgbmFtZSA9ICJ1Y3MtMiI7CS8qIEZFIEZGICovCisgICAgfQorICAgIGVsc2UgaWYgKHNpemUgPj0gNCAmJiBwWzBdID09IDAgJiYgcFsxXSA9PSAwICYmIHBbMl0gPT0gMHhmZQorCSAgICAmJiBwWzNdID09IDB4ZmYgJiYgKGZsYWdzID09IEZJT19BTEwgfHwgZmxhZ3MgPT0gRklPX1VDUzQpKQorICAgIHsKKwluYW1lID0gInVjcy00IjsJCS8qIDAwIDAwIEZFIEZGICovCisJbGVuID0gNDsKKyAgICB9CisKKyAgICAqbGVucCA9IGxlbjsKKyAgICByZXR1cm4gKGNoYXJfdSAqKW5hbWU7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIEJPTSBpbiAiYnVmWzRdIiBmb3IgZW5jb2RpbmcgIm5hbWUiLgorICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIEJPTSAoemVybyB3aGVuIG5vIEJPTSkuCisgKi8KKyAgICBzdGF0aWMgaW50CittYWtlX2JvbShidWYsIG5hbWUpCisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJZmxhZ3M7CisgICAgY2hhcl91CSpwOworCisgICAgZmxhZ3MgPSBnZXRfZmlvX2ZsYWdzKG5hbWUpOworCisgICAgLyogQ2FuJ3QgcHV0IGEgQk9NIGluIGEgbm9uLVVuaWNvZGUgZmlsZS4gKi8KKyAgICBpZiAoZmxhZ3MgPT0gRklPX0xBVElOMSB8fCBmbGFncyA9PSAwKQorCXJldHVybiAwOworCisgICAgaWYgKGZsYWdzID09IEZJT19VVEY4KQkvKiBVVEYtOCAqLworICAgIHsKKwlidWZbMF0gPSAweGVmOworCWJ1ZlsxXSA9IDB4YmI7CisJYnVmWzJdID0gMHhiZjsKKwlyZXR1cm4gMzsKKyAgICB9CisgICAgcCA9IGJ1ZjsKKyAgICAodm9pZCl1Y3MyYnl0ZXMoMHhmZWZmLCAmcCwgZmxhZ3MpOworICAgIHJldHVybiAoaW50KShwIC0gYnVmKTsKK30KKyNlbmRpZgorCisvKgorICogVHJ5IHRvIGZpbmQgYSBzaG9ydG5hbWUgYnkgY29tcGFyaW5nIHRoZSBmdWxsbmFtZSB3aXRoIHRoZSBjdXJyZW50CisgKiBkaXJlY3RvcnkuCisgKiBSZXR1cm5zIE5VTEwgaWYgbm90IHNob3J0ZXIgbmFtZSBwb3NzaWJsZSwgcG9pbnRlciBpbnRvICJmdWxsX3BhdGgiCisgKiBvdGhlcndpc2UuCisgKi8KKyAgICBjaGFyX3UgKgorc2hvcnRlbl9mbmFtZShmdWxsX3BhdGgsIGRpcl9uYW1lKQorICAgIGNoYXJfdQkqZnVsbF9wYXRoOworICAgIGNoYXJfdQkqZGlyX25hbWU7Cit7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpwOworCisgICAgaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIGxlbiA9IChpbnQpU1RSTEVOKGRpcl9uYW1lKTsKKyAgICBpZiAoZm5hbWVuY21wKGRpcl9uYW1lLCBmdWxsX3BhdGgsIGxlbikgPT0gMCkKKyAgICB7CisJcCA9IGZ1bGxfcGF0aCArIGxlbjsKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE9TMikKKwkvKgorCSAqIE1TRE9TOiB3aGVuIGEgZmlsZSBpcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnksIGRpcl9uYW1lIHdpbGwgZW5kIGluIGEKKwkgKiBzbGFzaCwgc2luY2UgQzogYnkgaXRzZWxmIGRvZXMgbm90IGRlZmluZSBhIHNwZWNpZmljIGRpci4gSW4gdGhpcworCSAqIGNhc2UgcCBtYXkgYWxyZWFkeSBiZSBjb3JyZWN0LiA8bmVncmk+CisJICovCisJaWYgKCEoKGxlbiA+IDIpICYmICgqKHAgLSAyKSA9PSAnOicpKSkKKyNlbmRpZgorCXsKKwkgICAgaWYgKHZpbV9pc3BhdGhzZXAoKnApKQorCQkrK3A7CisjaWZuZGVmIFZNUyAgIC8qIHRoZSBwYXRoIHNlcGFyYXRvciBpcyBhbHdheXMgcGFydCBvZiB0aGUgcGF0aCAqLworCSAgICBlbHNlCisJCXAgPSBOVUxMOworI2VuZGlmCisJfQorICAgIH0KKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE9TMikKKyAgICAvKgorICAgICAqIFdoZW4gdXNpbmcgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRyaXZlLCByZW1vdmUgdGhlIGRyaXZlIG5hbWU6CisgICAgICogIkE6XGRpclxmaWxlIiAtPiAiXGRpclxmaWxlIi4gIFRoaXMgaGVscHMgd2hlbiBtb3ZpbmcgYSBzZXNzaW9uIGZpbGUgb24KKyAgICAgKiBhIGZsb3BweSBmcm9tICJBOlxkaXIiIHRvICJCOlxkaXIiLgorICAgICAqLworICAgIGVsc2UgaWYgKGxlbiA+IDMKKwkgICAgJiYgVE9VUFBFUl9MT0MoZnVsbF9wYXRoWzBdKSA9PSBUT1VQUEVSX0xPQyhkaXJfbmFtZVswXSkKKwkgICAgJiYgZnVsbF9wYXRoWzFdID09ICc6JworCSAgICAmJiB2aW1faXNwYXRoc2VwKGZ1bGxfcGF0aFsyXSkpCisJcCA9IGZ1bGxfcGF0aCArIDI7CisjZW5kaWYKKyAgICBlbHNlCisJcCA9IE5VTEw7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBTaG9ydGVuIGZpbGVuYW1lcyBmb3IgYWxsIGJ1ZmZlcnMuCisgKiBXaGVuICJmb3JjZSIgaXMgVFJVRTogVXNlIGZ1bGwgcGF0aCBmcm9tIG5vdyBvbiBmb3IgZmlsZXMgY3VycmVudGx5IGJlaW5nCisgKiBlZGl0ZWQsIGJvdGggZm9yIGZpbGUgbmFtZSBhbmQgc3dhcCBmaWxlIG5hbWUuICBUcnkgdG8gc2hvcnRlbiB0aGUgZmlsZQorICogbmFtZXMgYSBiaXQsIGlmIHNhZmUgdG8gZG8gc28uCisgKiBXaGVuICJmb3JjZSIgaXMgRkFMU0U6IE9ubHkgdHJ5IHRvIHNob3J0ZW4gYWJzb2x1dGUgZmlsZSBuYW1lcy4KKyAqIEZvciBidWZmZXJzIHRoYXQgaGF2ZSBidWZ0eXBlICJub2ZpbGUiIG9yICJzY3JhdGNoIjogbmV2ZXIgY2hhbmdlIHRoZSBmaWxlCisgKiBuYW1lLgorICovCisgICAgdm9pZAorc2hvcnRlbl9mbmFtZXMoZm9yY2UpCisgICAgaW50CQlmb3JjZTsKK3sKKyAgICBjaGFyX3UJZGlybmFtZVtNQVhQQVRITF07CisgICAgYnVmX1QJKmJ1ZjsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBtY2hfZGlybmFtZShkaXJuYW1lLCBNQVhQQVRITCk7CisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwlpZiAoYnVmLT5iX2ZuYW1lICE9IE5VTEwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCSYmICFidF9ub2ZpbGUoYnVmKQorI2VuZGlmCisJCSYmICFwYXRoX3dpdGhfdXJsKGJ1Zi0+Yl9mbmFtZSkKKwkJJiYgKGZvcmNlCisJCSAgICB8fCBidWYtPmJfc2ZuYW1lID09IE5VTEwKKwkJICAgIHx8IG1jaF9pc0Z1bGxOYW1lKGJ1Zi0+Yl9zZm5hbWUpKSkKKwl7CisJICAgIHZpbV9mcmVlKGJ1Zi0+Yl9zZm5hbWUpOworCSAgICBidWYtPmJfc2ZuYW1lID0gTlVMTDsKKwkgICAgcCA9IHNob3J0ZW5fZm5hbWUoYnVmLT5iX2ZmbmFtZSwgZGlybmFtZSk7CisJICAgIGlmIChwICE9IE5VTEwpCisJICAgIHsKKwkJYnVmLT5iX3NmbmFtZSA9IHZpbV9zdHJzYXZlKHApOworCQlidWYtPmJfZm5hbWUgPSBidWYtPmJfc2ZuYW1lOworCSAgICB9CisJICAgIGlmIChwID09IE5VTEwgfHwgYnVmLT5iX2ZuYW1lID09IE5VTEwpCisJCWJ1Zi0+Yl9mbmFtZSA9IGJ1Zi0+Yl9mZm5hbWU7CisJICAgIG1mX2Z1bGxuYW1lKGJ1Zi0+Yl9tbC5tbF9tZnApOworCX0KKyAgICB9CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgc3RhdHVzX3JlZHJhd19hbGwoKTsKKyNlbmRpZgorfQorCisjaWYgKGRlZmluZWQoRkVBVF9ETkQpICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSkgXAorCXx8IGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2hvcnRlbiBhbGwgZmlsZW5hbWVzIGluICJmbmFtZXNbY291bnRdIiBieSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqLworICAgIHZvaWQKK3Nob3J0ZW5fZmlsZW5hbWVzKGZuYW1lcywgY291bnQpCisgICAgY2hhcl91CSoqZm5hbWVzOworICAgIGludAkJY291bnQ7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQlkaXJuYW1lW01BWFBBVEhMXTsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoZm5hbWVzID09IE5VTEwgfHwgY291bnQgPCAxKQorCXJldHVybjsKKyAgICBtY2hfZGlybmFtZShkaXJuYW1lLCBzaXplb2YoZGlybmFtZSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIHsKKwlpZiAoKHAgPSBzaG9ydGVuX2ZuYW1lKGZuYW1lc1tpXSwgZGlybmFtZSkpICE9IE5VTEwpCisJeworCSAgICAvKiBzaG9ydGVuX2ZuYW1lKCkgcmV0dXJucyBwb2ludGVyIGluIGdpdmVuICJmbmFtZXNbaV0iLiAgSWYgZnJlZQorCSAgICAgKiAiZm5hbWVzW2ldIiBmaXJzdCwgInAiIGJlY29tZXMgaW52YWxpZC4gIFNvIHdlIG5lZWQgdG8gY29weQorCSAgICAgKiAicCIgZmlyc3QgdGhlbiBmcmVlIGZuYW1lc1tpXS4gKi8KKwkgICAgcCA9IHZpbV9zdHJzYXZlKHApOworCSAgICB2aW1fZnJlZShmbmFtZXNbaV0pOworCSAgICBmbmFtZXNbaV0gPSBwOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIGFkZCBleHRlbnRpb24gdG8gZmlsZSBuYW1lIC0gY2hhbmdlIHBhdGgvZm8uby5oIHRvIHBhdGgvZm8uby5oLmV4dCBvcgorICogZm9fb19oLmV4dCBmb3IgTVNET1Mgb3Igd2hlbiBzaG9ydG5hbWUgb3B0aW9uIHNldC4KKyAqCisgKiBBc3N1bWVkIHRoYXQgZm5hbWUgaXMgYSB2YWxpZCBuYW1lIGZvdW5kIGluIHRoZSBmaWxlc3lzdGVtIHdlIGFzc3VyZSB0aGF0CisgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgZGlmZmVyZW50IG5hbWUgYW5kIGVuZHMgaW4gJ2V4dCcuCisgKiAiZXh0IiBNVVNUIGJlIGF0IG1vc3QgNCBjaGFyYWN0ZXJzIGxvbmcgaWYgaXQgc3RhcnRzIHdpdGggYSBkb3QsIDMKKyAqIGNoYXJhY3RlcnMgb3RoZXJ3aXNlLgorICogU3BhY2UgZm9yIHRoZSByZXR1cm5lZCBuYW1lIGlzIGFsbG9jYXRlZCwgbXVzdCBiZSBmcmVlZCBsYXRlci4KKyAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBjaGFyX3UgKgorbW9kbmFtZShmbmFtZSwgZXh0LCBwcmVwZW5kX2RvdCkKKyAgICBjaGFyX3UgKmZuYW1lLCAqZXh0OworICAgIGludAkgICAgcHJlcGVuZF9kb3Q7CS8qIG1heSBwcmVwZW5kIGEgJy4nIHRvIGZpbGUgbmFtZSAqLworeworICAgIHJldHVybiBidWZfbW9kbmFtZSgKKyNpZmRlZiBTSE9SVF9GTkFNRQorCQkJVFJVRSwKKyNlbHNlCisJCQkoY3VyYnVmLT5iX3Bfc24gfHwgY3VyYnVmLT5iX3Nob3J0bmFtZSksCisjZW5kaWYKKwkJCQkJCSAgICAgZm5hbWUsIGV4dCwgcHJlcGVuZF9kb3QpOworfQorCisgICAgY2hhcl91ICoKK2J1Zl9tb2RuYW1lKHNob3J0bmFtZSwgZm5hbWUsIGV4dCwgcHJlcGVuZF9kb3QpCisgICAgaW50CSAgICBzaG9ydG5hbWU7CQkvKiB1c2UgOC4zIGZpbGUgbmFtZSAqLworICAgIGNoYXJfdSAgKmZuYW1lLCAqZXh0OworICAgIGludAkgICAgcHJlcGVuZF9kb3Q7CS8qIG1heSBwcmVwZW5kIGEgJy4nIHRvIGZpbGUgbmFtZSAqLworeworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIGNoYXJfdQkqczsKKyAgICBjaGFyX3UJKmU7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQlmbmFtZWxlbiwgZXh0bGVuOworCisgICAgZXh0bGVuID0gKGludClTVFJMRU4oZXh0KTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lIHdlIG11c3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICAgICAqICh3ZSBuZWVkIHRoZSBmdWxsIHBhdGggaW4gY2FzZSA6Y2QgaXMgdXNlZCkuCisgICAgICovCisgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTCkKKyAgICB7CisJcmV0dmFsID0gYWxsb2MoKHVuc2lnbmVkKShNQVhQQVRITCArIGV4dGxlbiArIDMpKTsKKwlpZiAocmV0dmFsID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCWlmIChtY2hfZGlybmFtZShyZXR2YWwsIE1BWFBBVEhMKSA9PSBGQUlMIHx8CisJCQkJICAgICAoZm5hbWVsZW4gPSAoaW50KVNUUkxFTihyZXR2YWwpKSA9PSAwKQorCXsKKwkgICAgdmltX2ZyZWUocmV0dmFsKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCWlmICghdmltX2lzcGF0aHNlcChyZXR2YWxbZm5hbWVsZW4gLSAxXSkpCisJeworCSAgICByZXR2YWxbZm5hbWVsZW4rK10gPSBQQVRIU0VQOworCSAgICByZXR2YWxbZm5hbWVsZW5dID0gTlVMOworCX0KKyNpZm5kZWYgU0hPUlRfRk5BTUUKKwlwcmVwZW5kX2RvdCA9IEZBTFNFOwkgICAgLyogbm90aGluZyB0byBwcmVwZW5kIGEgZG90IHRvICovCisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmbmFtZWxlbiA9IChpbnQpU1RSTEVOKGZuYW1lKTsKKwlyZXR2YWwgPSBhbGxvYygodW5zaWduZWQpKGZuYW1lbGVuICsgZXh0bGVuICsgMykpOworCWlmIChyZXR2YWwgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJU1RSQ1BZKHJldHZhbCwgZm5hbWUpOworI2lmZGVmIFZNUworCXZtc19yZW1vdmVfdmVyc2lvbihyZXR2YWwpOyAvKiB3ZSBkbyBub3QgbmVlZCB2ZXJzaW9ucyBoZXJlICovCisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIHNlYXJjaCBiYWNrd2FyZHMgdW50aWwgd2UgaGl0IGEgJy8nLCAnXCcgb3IgJzonIHJlcGxhY2luZyBhbGwgJy4nCisgICAgICogYnkgJ18nIGZvciBNU0RPUyBvciB3aGVuIHNob3J0bmFtZSBvcHRpb24gc2V0IGFuZCBleHQgc3RhcnRzIHdpdGggYSBkb3QuCisgICAgICogVGhlbiB0cnVuY2F0ZSB3aGF0IGlzIGFmdGVyIHRoZSAnLycsICdcJyBvciAnOicgdG8gOCBjaGFyYWN0ZXJzIGZvcgorICAgICAqIE1TRE9TIGFuZCAyNiBjaGFyYWN0ZXJzIGZvciBBTUlHQSwgYSBsb3QgbW9yZSBmb3IgVU5JWC4KKyAgICAgKi8KKyAgICBmb3IgKHB0ciA9IHJldHZhbCArIGZuYW1lbGVuOyBwdHIgPj0gcmV0dmFsOyBwdHItLSkKKyAgICB7CisjaWZuZGVmIFJJU0NPUworCWlmICgqZXh0ID09ICcuJworI2lmZGVmIFVTRV9MT05HX0ZOQU1FCisJCSAgICAmJiAoIVVTRV9MT05HX0ZOQU1FIHx8IHNob3J0bmFtZSkKKyNlbHNlCisjIGlmbmRlZiBTSE9SVF9GTkFNRQorCQkgICAgJiYgc2hvcnRuYW1lCisjIGVuZGlmCisjZW5kaWYKKwkJCQkJCQkJKQorCSAgICBpZiAoKnB0ciA9PSAnLicpCS8qIHJlcGxhY2UgJy4nIGJ5ICdfJyAqLworCQkqcHRyID0gJ18nOworI2VuZGlmIC8qIFJJU0NPUyAqLworCWlmICh2aW1faXNwYXRoc2VwKCpwdHIpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcHRyKys7CisKKyAgICAvKiB0aGUgZmlsZSBuYW1lIGhhcyBhdCBtb3N0IEJBU0VOQU1FTEVOIGNoYXJhY3RlcnMuICovCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgaWYgKFNUUkxFTihwdHIpID4gKHVuc2lnbmVkKUJBU0VOQU1FTEVOKQorCXB0cltCQVNFTkFNRUxFTl0gPSAnXDAnOworI2VuZGlmCisKKyAgICBzID0gcHRyICsgU1RSTEVOKHB0cik7CisKKyAgICAvKgorICAgICAqIEZvciA4LjMgZmlsZSBuYW1lcyB3ZSBtYXkgaGF2ZSB0byByZWR1Y2UgdGhlIGxlbmd0aC4KKyAgICAgKi8KKyNpZmRlZiBVU0VfTE9OR19GTkFNRQorICAgIGlmICghVVNFX0xPTkdfRk5BTUUgfHwgc2hvcnRuYW1lKQorI2Vsc2UKKyMgaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgaWYgKHNob3J0bmFtZSkKKyMgZW5kaWYKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vIGZpbGUgbmFtZSwgb3IgdGhlIGZpbGUgbmFtZSBlbmRzIGluICcvJywgYW5kIHRoZQorCSAqIGV4dGVuc2lvbiBzdGFydHMgd2l0aCAnLicsIHB1dCBhICdfJyBiZWZvcmUgdGhlIGRvdCwgYmVjYXVzZSBqdXN0CisJICogIi5leHQiIGlzIGludmFsaWQuCisJICovCisJaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTAorCQkJCSAgIHx8IHZpbV9pc3BhdGhzZXAoZm5hbWVbU1RSTEVOKGZuYW1lKSAtIDFdKSkKKwl7CisjaWZkZWYgUklTQ09TCisJICAgIGlmICgqZXh0ID09ICcvJykKKyNlbHNlCisJICAgIGlmICgqZXh0ID09ICcuJykKKyNlbmRpZgorCQkqcysrID0gJ18nOworCX0KKwkvKgorCSAqIElmIHRoZSBleHRlbnNpb24gc3RhcnRzIHdpdGggJy4nLCB0cnVuY2F0ZSB0aGUgYmFzZSBuYW1lIGF0IDgKKwkgKiBjaGFyYWN0ZXJzCisJICovCisjaWZkZWYgUklTQ09TCisJLyogV2Ugbm9ybWFsbHkgdXNlICcvJywgYnV0IHN3YXAgZmlsZXMgYXJlICdfJyAqLworCWVsc2UgaWYgKCpleHQgPT0gJy8nIHx8ICpleHQgPT0gJ18nKQorI2Vsc2UKKwllbHNlIGlmICgqZXh0ID09ICcuJykKKyNlbmRpZgorCXsKKwkgICAgaWYgKHMgLSBwdHIgPiAoc2l6ZV90KTgpCisJICAgIHsKKwkJcyA9IHB0ciArIDg7CisJCSpzID0gJ1wwJzsKKwkgICAgfQorCX0KKwkvKgorCSAqIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoICcuJywgYW5kIHRoZSBmaWxlIG5hbWUKKwkgKiBkb2Vzbid0IGhhdmUgYW4gZXh0ZW5zaW9uIHlldCwgYXBwZW5kIGEgJy4nCisJICovCisjaWZkZWYgUklTQ09TCisJZWxzZSBpZiAoKGUgPSB2aW1fc3RyY2hyKHB0ciwgJy8nKSkgPT0gTlVMTCkKKwkgICAgKnMrKyA9ICcvJzsKKyNlbHNlCisJZWxzZSBpZiAoKGUgPSB2aW1fc3RyY2hyKHB0ciwgJy4nKSkgPT0gTlVMTCkKKwkgICAgKnMrKyA9ICcuJzsKKyNlbmRpZgorCS8qCisJICogSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggJy4nLCBhbmQgdGhlcmUgYWxyZWFkeSBpcyBhbgorCSAqIGV4dGVuc2lvbiwgaXQgbWF5IG5lZWQgdG8gYmUgdHJ1Y3RhdGVkCisJICovCisJZWxzZSBpZiAoKGludClTVFJMRU4oZSkgKyBleHRsZW4gPiA0KQorCSAgICBzID0gZSArIDQgLSBleHRsZW47CisgICAgfQorI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFVTRV9MT05HX0ZOQU1FKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyBubyBmaWxlIG5hbWUsIGFuZCB0aGUgZXh0ZW5zaW9uIHN0YXJ0cyB3aXRoICcuJywgcHV0IGEKKyAgICAgKiAnXycgYmVmb3JlIHRoZSBkb3QsIGJlY2F1c2UganVzdCAiLmV4dCIgbWF5IGJlIGludmFsaWQgaWYgaXQncyBvbiBhCisgICAgICogRkFUIHBhcnRpdGlvbiwgYW5kIG9uIEhQRlMgaXQgZG9lc24ndCBtYXR0ZXIuCisgICAgICovCisgICAgZWxzZSBpZiAoKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTCkgJiYgKmV4dCA9PSAnLicpCisJKnMrKyA9ICdfJzsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBBcHBlbmQgdGhlIGV4dGVudGlvbi4KKyAgICAgKiBleHQgY2FuIHN0YXJ0IHdpdGggJy4nIGFuZCBjYW5ub3QgZXhjZWVkIDMgbW9yZSBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIFNUUkNQWShzLCBleHQpOworCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgLyoKKyAgICAgKiBQcmVwZW5kIHRoZSBkb3QuCisgICAgICovCisgICAgaWYgKHByZXBlbmRfZG90ICYmICFzaG9ydG5hbWUgJiYgKihlID0gZ2V0dGFpbChyZXR2YWwpKSAhPQorI2lmZGVmIFJJU0NPUworCSAgICAnLycKKyNlbHNlCisJICAgICcuJworI2VuZGlmCisjaWZkZWYgVVNFX0xPTkdfRk5BTUUKKwkgICAgJiYgVVNFX0xPTkdfRk5BTUUKKyNlbmRpZgorCQkJCSkKKyAgICB7CisJbWNoX21lbW1vdmUoZSArIDEsIGUsIFNUUkxFTihlKSArIDEpOworI2lmZGVmIFJJU0NPUworCSplID0gJy8nOworI2Vsc2UKKwkqZSA9ICcuJzsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGF0LCBhZnRlciBhcHBlbmRpbmcgdGhlIGV4dGVuc2lvbiwgdGhlIGZpbGUgbmFtZSBpcyByZWFsbHkKKyAgICAgKiBkaWZmZXJlbnQuCisgICAgICovCisgICAgaWYgKGZuYW1lICE9IE5VTEwgJiYgU1RSQ01QKGZuYW1lLCByZXR2YWwpID09IDApCisgICAgeworCS8qIHdlIHNlYXJjaCBmb3IgYSBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgcmVwbGFjZWQgYnkgJ18nICovCisJd2hpbGUgKC0tcyA+PSBwdHIpCisJeworCSAgICBpZiAoKnMgIT0gJ18nKQorCSAgICB7CisJCSpzID0gJ18nOworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAocyA8IHB0cikJLyogZm5hbWUgd2FzICJfX19fX19fXy48ZXh0PiIsIGhvdyB0cmlja3khICovCisJICAgICpwdHIgPSAndic7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBMaWtlIGZnZXRzKCksIGJ1dCBpZiB0aGUgZmlsZSBsaW5lIGlzIHRvbyBsb25nLCBpdCBpcyB0cnVuY2F0ZWQgYW5kIHRoZQorICogcmVzdCBvZiB0aGUgbGluZSBpcyB0aHJvd24gYXdheS4gIFJldHVybnMgVFJVRSBmb3IgZW5kLW9mLWZpbGUuCisgKi8KKyAgICBpbnQKK3ZpbV9mZ2V0cyhidWYsIHNpemUsIGZwKQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJc2l6ZTsKKyAgICBGSUxFCSpmcDsKK3sKKyAgICBjaGFyCSplb2Y7CisjZGVmaW5lIEZHRVRTX1NJWkUgMjAwCisgICAgY2hhcgl0YnVmW0ZHRVRTX1NJWkVdOworCisgICAgYnVmW3NpemUgLSAyXSA9IE5VTDsKKyNpZmRlZiBVU0VfQ1IKKyAgICBlb2YgPSBmZ2V0c19jcigoY2hhciAqKWJ1Ziwgc2l6ZSwgZnApOworI2Vsc2UKKyAgICBlb2YgPSBmZ2V0cygoY2hhciAqKWJ1Ziwgc2l6ZSwgZnApOworI2VuZGlmCisgICAgaWYgKGJ1ZltzaXplIC0gMl0gIT0gTlVMICYmIGJ1ZltzaXplIC0gMl0gIT0gJ1xuJykKKyAgICB7CisJYnVmW3NpemUgLSAxXSA9IE5VTDsJICAgIC8qIFRydW5jYXRlIHRoZSBsaW5lICovCisKKwkvKiBOb3cgdGhyb3cgYXdheSB0aGUgcmVzdCBvZiB0aGUgbGluZTogKi8KKwlkbworCXsKKwkgICAgdGJ1ZltGR0VUU19TSVpFIC0gMl0gPSBOVUw7CisjaWZkZWYgVVNFX0NSCisJICAgIGZnZXRzX2NyKChjaGFyICopdGJ1ZiwgRkdFVFNfU0laRSwgZnApOworI2Vsc2UKKwkgICAgZmdldHMoKGNoYXIgKil0YnVmLCBGR0VUU19TSVpFLCBmcCk7CisjZW5kaWYKKwl9IHdoaWxlICh0YnVmW0ZHRVRTX1NJWkUgLSAyXSAhPSBOVUwgJiYgdGJ1ZltGR0VUU19TSVpFIC0gMl0gIT0gJ1xuJyk7CisgICAgfQorICAgIHJldHVybiAoZW9mID09IE5VTEwpOworfQorCisjaWYgZGVmaW5lZChVU0VfQ1IpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTGlrZSB2aW1fZmdldHMoKSwgYnV0IGFjY2VwdCBhbnkgbGluZSB0ZXJtaW5hdG9yOiBDUiwgQ1ItTEYgb3IgTEYuCisgKiBSZXR1cm5zIFRSVUUgZm9yIGVuZC1vZi1maWxlLgorICogT25seSB1c2VkIGZvciB0aGUgTWFjLCBiZWNhdXNlIGl0J3MgbXVjaCBzbG93ZXIgdGhhbiB2aW1fZmdldHMoKS4KKyAqLworICAgIGludAordGFnX2ZnZXRzKGJ1Ziwgc2l6ZSwgZnApCisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlzaXplOworICAgIEZJTEUJKmZwOworeworICAgIGludAkJaSA9IDA7CisgICAgaW50CQljOworICAgIGludAkJZW9mID0gRkFMU0U7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwljID0gZmdldGMoZnApOworCWlmIChjID09IEVPRikKKwl7CisJICAgIGVvZiA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKwlpZiAoYyA9PSAnXHInKQorCXsKKwkgICAgLyogQWx3YXlzIHN0b3JlIGEgTkwgZm9yIGVuZC1vZi1saW5lLiAqLworCSAgICBpZiAoaSA8IHNpemUgLSAxKQorCQlidWZbaSsrXSA9ICdcbic7CisJICAgIGMgPSBmZ2V0YyhmcCk7CisJICAgIGlmIChjICE9ICdcbicpCS8qIE1hY2ludG9zaCBmb3JtYXQ6IHNpbmdsZSBDUi4gKi8KKwkJdW5nZXRjKGMsIGZwKTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChpIDwgc2l6ZSAtIDEpCisJICAgIGJ1ZltpKytdID0gYzsKKwlpZiAoYyA9PSAnXG4nKQorCSAgICBicmVhazsKKyAgICB9CisgICAgYnVmW2ldID0gTlVMOworICAgIHJldHVybiBlb2Y7Cit9CisjZW5kaWYKKworLyoKKyAqIHJlbmFtZSgpIG9ubHkgd29ya3MgaWYgYm90aCBmaWxlcyBhcmUgb24gdGhlIHNhbWUgZmlsZSBzeXN0ZW0sIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgKGF0dGVtcHRzIHRvPykgY29weSB0aGUgZmlsZSBhY3Jvc3MgaWYgcmVuYW1lIGZhaWxzIC0tIHdlYmIKKyAqIFJldHVybiAtMSBmb3IgZmFpbHVyZSwgMCBmb3Igc3VjY2Vzcy4KKyAqLworICAgIGludAordmltX3JlbmFtZShmcm9tLCB0bykKKyAgICBjaGFyX3UJKmZyb207CisgICAgY2hhcl91CSp0bzsKK3sKKyAgICBpbnQJCWZkX2luOworICAgIGludAkJZmRfb3V0OworICAgIGludAkJbjsKKyAgICBjaGFyCSplcnJtc2cgPSBOVUxMOworICAgIGNoYXIJKmJ1ZmZlcjsKKyNpZmRlZiBBTUlHQQorICAgIEJQVFIJZmxvY2s7CisjZW5kaWYKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKworICAgIC8qCisgICAgICogV2hlbiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCwgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgICAgKi8KKyAgICBpZiAoZm5hbWVjbXAoZnJvbSwgdG8pID09IDApCisJcmV0dXJuIDA7CisKKyAgICAvKgorICAgICAqIEZhaWwgaWYgdGhlICJmcm9tIiBmaWxlIGRvZXNuJ3QgZXhpc3QuICBBdm9pZHMgdGhhdCAidG8iIGlzIGRlbGV0ZWQuCisgICAgICovCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZnJvbSwgJnN0KSA8IDApCisJcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiBEZWxldGUgdGhlICJ0byIgZmlsZSwgdGhpcyBpcyByZXF1aXJlZCBvbiBzb21lIHN5c3RlbXMgdG8gbWFrZSB0aGUKKyAgICAgKiBtY2hfcmVuYW1lKCkgd29yaywgb24gb3RoZXIgc3lzdGVtcyBpdCBtYWtlcyBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZQorICAgICAqIHR3byBmaWxlcyB3aGVuIHRoZSBtY2hfcmVuYW1lKCkgZmFpbHMuCisgICAgICovCisKKyNpZmRlZiBBTUlHQQorICAgIC8qCisgICAgICogV2l0aCBNU0RPUy1jb21wYXRpYmxlIGZpbGVzeXN0ZW1zIChjcm9zc2RvcywgbWVzc3lkb3MpIGl0IGlzIHBvc3NpYmxlCisgICAgICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgInRvIiBmaWxlIGlzIHRoZSBzYW1lIGFzIHRoZSAiZnJvbSIgZmlsZSwgZXZlbgorICAgICAqIHRob3VnaCB0aGUgbmFtZXMgYXJlIGRpZmZlcmVudC4gVG8gYXZvaWQgdGhlIGNoYW5jZSBvZiBhY2NpZGVudGx5CisgICAgICogZGVsZXRpbmcgdGhlICJmcm9tIiBmaWxlIChob3Jyb3IhKSB3ZSBsb2NrIGl0IGR1cmluZyB0aGUgcmVtb3ZlLgorICAgICAqCisgICAgICogV2hlbiB1c2VkIGZvciBtYWtpbmcgYSBiYWNrdXAgYmVmb3JlIHdyaXRpbmcgdGhlIGZpbGU6IFRoaXMgc2hvdWxkIG5vdAorICAgICAqIGhhcHBlbiB3aXRoICI6dyIsIGJlY2F1c2Ugc3RhcnRzY3JpcHQoKSBzaG91bGQgZGV0ZWN0IHRoaXMgcHJvYmxlbSBhbmQKKyAgICAgKiBzZXQgYnVmLT5iX3Nob3J0bmFtZSwgY2F1c2luZyBtb2RuYW1lKCkgdG8gcmV0dXJuIGEgY29ycmVjdCAiLmJhayIgZmlsZQorICAgICAqIG5hbWUuICBUaGlzIHByb2JsZW0gZG9lcyBleGlzdCB3aXRoICI6dyBmaWxlbmFtZSIsIGJ1dCB0aGVuIHRoZQorICAgICAqIG9yaWdpbmFsIGZpbGUgd2lsbCBiZSBzb21ld2hlcmUgZWxzZSBzbyB0aGUgYmFja3VwIGlzbid0IHJlYWxseQorICAgICAqIGltcG9ydGFudC4gSWYgYXV0b3NjcmlwdGluZyBpcyBvZmYgdGhlIHJlbmFtZSBtYXkgZmFpbC4KKyAgICAgKi8KKyAgICBmbG9jayA9IExvY2soKFVCWVRFICopZnJvbSwgKGxvbmcpQUNDRVNTX1JFQUQpOworI2VuZGlmCisgICAgbWNoX3JlbW92ZSh0byk7CisjaWZkZWYgQU1JR0EKKyAgICBpZiAoZmxvY2spCisJVW5Mb2NrKGZsb2NrKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGaXJzdCB0cnkgYSBub3JtYWwgcmVuYW1lLCByZXR1cm4gaWYgaXQgd29ya3MuCisgICAgICovCisgICAgaWYgKG1jaF9yZW5hbWUoKGNoYXIgKilmcm9tLCAoY2hhciAqKXRvKSA9PSAwKQorCXJldHVybiAwOworCisgICAgLyoKKyAgICAgKiBSZW5hbWUoKSBmYWlsZWQsIHRyeSBjb3B5aW5nIHRoZSBmaWxlLgorICAgICAqLworICAgIGZkX2luID0gbWNoX29wZW4oKGNoYXIgKilmcm9tLCBPX1JET05MWXxPX0VYVFJBLCAwKTsKKyAgICBpZiAoZmRfaW4gPT0gLTEpCisJcmV0dXJuIC0xOworICAgIGZkX291dCA9IG1jaF9vcGVuKChjaGFyICopdG8sIE9fQ1JFQVR8T19FWENMfE9fV1JPTkxZfE9fRVhUUkEsIDA2NjYpOworICAgIGlmIChmZF9vdXQgPT0gLTEpCisgICAgeworCWNsb3NlKGZkX2luKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgYnVmZmVyID0gKGNoYXIgKilhbGxvYyhCVUZTSVpFKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgeworCWNsb3NlKGZkX2luKTsKKwljbG9zZShmZF9vdXQpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoKG4gPSB2aW1fcmVhZChmZF9pbiwgYnVmZmVyLCBCVUZTSVpFKSkgPiAwKQorCWlmICh2aW1fd3JpdGUoZmRfb3V0LCBidWZmZXIsIG4pICE9IG4pCisJeworCSAgICBlcnJtc2cgPSBfKCJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIpOworCSAgICBicmVhazsKKwl9CisKKyAgICB2aW1fZnJlZShidWZmZXIpOworICAgIGNsb3NlKGZkX2luKTsKKyAgICBpZiAoY2xvc2UoZmRfb3V0KSA8IDApCisJZXJybXNnID0gXygiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiKTsKKyAgICBpZiAobiA8IDApCisgICAgeworCWVycm1zZyA9IF8oIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIik7CisJdG8gPSBmcm9tOworICAgIH0KKyAgICBpZiAoZXJybXNnICE9IE5VTEwpCisgICAgeworCUVNU0cyKGVycm1zZywgdG8pOworCXJldHVybiAtMTsKKyAgICB9CisgICAgbWNoX3JlbW92ZShmcm9tKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHJlYWR5X3dhcm5lZCA9IEZBTFNFOworCisvKgorICogQ2hlY2sgaWYgYW55IG5vdCBoaWRkZW4gYnVmZmVyIGhhcyBiZWVuIGNoYW5nZWQuCisgKiBQb3N0cG9uZSB0aGUgY2hlY2sgaWYgdGhlcmUgYXJlIGNoYXJhY3RlcnMgaW4gdGhlIHN0dWZmIGJ1ZmZlciwgYSBnbG9iYWwKKyAqIGNvbW1hbmQgaXMgYmVpbmcgZXhlY3V0ZWQsIGEgbWFwcGluZyBpcyBiZWluZyBleGVjdXRlZCBvciBhbiBhdXRvY29tbWFuZCBpcworICogYnVzeS4KKyAqIFJldHVybnMgVFJVRSBpZiBzb21lIG1lc3NhZ2Ugd2FzIHdyaXR0ZW4gKHNjcmVlbiBzaG91bGQgYmUgcmVkcmF3biBhbmQKKyAqIGN1cnNvciBwb3NpdGlvbmVkKS4KKyAqLworICAgIGludAorY2hlY2tfdGltZXN0YW1wcyhmb2N1cykKKyAgICBpbnQJCWZvY3VzOwkJLyogY2FsbGVkIGZvciBHVUkgZm9jdXMgZXZlbnQgKi8KK3sKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZGlkaXQgPSAwOworICAgIGludAkJbjsKKworICAgIC8qIERvbid0IGNoZWNrIHRpbWVzdGFtcHMgd2hpbGUgc3lzdGVtKCkgb3IgYW5vdGhlciBsb3ctbGV2ZWwgZnVuY3Rpb24gbWF5CisgICAgICogY2F1c2UgdXMgdG8gbG9zZSBhbmQgZ2FpbiBmb2N1cy4gKi8KKyAgICBpZiAobm9fY2hlY2tfdGltZXN0YW1wcyA+IDApCisJcmV0dXJuIEZBTFNFOworCisgICAgLyogQXZvaWQgZG9pbmcgYSBjaGVjayB0d2ljZS4gIFRoZSBPSy9SZWxvYWQgZGlhbG9nIGNhbiBjYXVzZSBhIGZvY3VzCisgICAgICogZXZlbnQgYW5kIHdlIHdvdWxkIGtlZXAgb24gY2hlY2tpbmcgaWYgdGhlIGZpbGUgaXMgc3RlYWRpbHkgZ3Jvd2luZy4KKyAgICAgKiBEbyBjaGVjayBhZ2FpbiBhZnRlciB0eXBpbmcgc29tZXRoaW5nLiAqLworICAgIGlmIChmb2N1cyAmJiBkaWRfY2hlY2tfdGltZXN0YW1wcykKKyAgICB7CisJbmVlZF9jaGVja190aW1lc3RhbXBzID0gVFJVRTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFzdHVmZl9lbXB0eSgpIHx8IGdsb2JhbF9idXN5IHx8ICF0eXBlYnVmX3R5cGVkKCkKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJCXx8IGF1dG9jbWRfYnVzeQorI2VuZGlmCisJCQkJCSkKKwluZWVkX2NoZWNrX3RpbWVzdGFtcHMgPSBUUlVFOwkJLyogY2hlY2sgbGF0ZXIgKi8KKyAgICBlbHNlCisgICAgeworCSsrbm9fd2FpdF9yZXR1cm47CisJZGlkX2NoZWNrX3RpbWVzdGFtcHMgPSBUUlVFOworCWFscmVhZHlfd2FybmVkID0gRkFMU0U7CisJZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7ICkKKwl7CisJICAgIC8qIE9ubHkgY2hlY2sgYnVmZmVycyBpbiBhIHdpbmRvdy4gKi8KKwkgICAgaWYgKGJ1Zi0+Yl9ud2luZG93cyA+IDApCisJICAgIHsKKwkJbiA9IGJ1Zl9jaGVja190aW1lc3RhbXAoYnVmLCBmb2N1cyk7CisJCWlmIChkaWRpdCA8IG4pCisJCSAgICBkaWRpdCA9IG47CisJCWlmIChuID4gMCAmJiAhYnVmX3ZhbGlkKGJ1ZikpCisJCXsKKwkJICAgIC8qIEF1dG9jb21tYW5kcyBoYXZlIHJlbW92ZWQgdGhlIGJ1ZmZlciwgc3RhcnQgYXQgdGhlCisJCSAgICAgKiBmaXJzdCBvbmUgYWdhaW4uICovCisJCSAgICBidWYgPSBmaXJzdGJ1ZjsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgICAgYnVmID0gYnVmLT5iX25leHQ7CisJfQorCS0tbm9fd2FpdF9yZXR1cm47CisJbmVlZF9jaGVja190aW1lc3RhbXBzID0gRkFMU0U7CisJaWYgKG5lZWRfd2FpdF9yZXR1cm4gJiYgZGlkaXQgPT0gMikKKwl7CisJICAgIC8qIG1ha2Ugc3VyZSBtc2cgaXNuJ3Qgb3ZlcndyaXR0ZW4gKi8KKwkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOworCSAgICBvdXRfZmx1c2goKTsKKwl9CisgICAgfQorICAgIHJldHVybiBkaWRpdDsKK30KKworLyoKKyAqIE1vdmUgYWxsIHRoZSBsaW5lcyBmcm9tIGJ1ZmZlciAiZnJvbWJ1ZiIgdG8gYnVmZmVyICJ0b2J1ZiIuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4gIFdoZW4gRkFJTCAidG9idWYiIGlzIGluY29tcGxldGUgYW5kL29yICJmcm9tYnVmIiBpcyBub3QKKyAqIGVtcHR5LgorICovCisgICAgc3RhdGljIGludAorbW92ZV9saW5lcyhmcm9tYnVmLCB0b2J1ZikKKyAgICBidWZfVAkqZnJvbWJ1ZjsKKyAgICBidWZfVAkqdG9idWY7Cit7CisgICAgYnVmX1QJKnRidWYgPSBjdXJidWY7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qIENvcHkgdGhlIGxpbmVzIGluICJmcm9tYnVmIiB0byAidG9idWYiLiAqLworICAgIGN1cmJ1ZiA9IHRvYnVmOworICAgIGZvciAobG51bSA9IDE7IGxudW0gPD0gZnJvbWJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisgICAgeworCXAgPSB2aW1fc3Ryc2F2ZShtbF9nZXRfYnVmKGZyb21idWYsIGxudW0sIEZBTFNFKSk7CisJaWYgKHAgPT0gTlVMTCB8fCBtbF9hcHBlbmQobG51bSAtIDEsIHAsIDAsIEZBTFNFKSA9PSBGQUlMKQorCXsKKwkgICAgdmltX2ZyZWUocCk7CisJICAgIHJldHZhbCA9IEZBSUw7CisJICAgIGJyZWFrOworCX0KKwl2aW1fZnJlZShwKTsKKyAgICB9CisKKyAgICAvKiBEZWxldGUgYWxsIHRoZSBsaW5lcyBpbiAiZnJvbWJ1ZiIuICovCisgICAgaWYgKHJldHZhbCAhPSBGQUlMKQorICAgIHsKKwljdXJidWYgPSBmcm9tYnVmOworCXdoaWxlICghYnVmZW1wdHkoKSkKKwkgICAgaWYgKG1sX2RlbGV0ZShjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwgRkFMU0UpID09IEZBSUwpCisJICAgIHsKKwkJLyogT29wcyEgIFdlIGNvdWxkIHRyeSBwdXR0aW5nIGJhY2sgdGhlIHNhdmVkIGxpbmVzLCBidXQgdGhhdAorCQkgKiBtaWdodCBmYWlsIGFnYWluLi4uICovCisJCXJldHZhbCA9IEZBSUw7CisJCWJyZWFrOworCSAgICB9CisgICAgfQorCisgICAgY3VyYnVmID0gdGJ1ZjsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQ2hlY2sgaWYgYnVmZmVyICJidWYiIGhhcyBiZWVuIGNoYW5nZWQuCisgKiBBbHNvIGNoZWNrIGlmIHRoZSBmaWxlIGZvciBhIG5ldyBidWZmZXIgdW5leHBlY3RlZGx5IGFwcGVhcmVkLgorICogcmV0dXJuIDEgaWYgYSBjaGFuZ2VkIGJ1ZmZlciB3YXMgZm91bmQuCisgKiByZXR1cm4gMiBpZiBhIG1lc3NhZ2UgaGFzIGJlZW4gZGlzcGxheWVkLgorICogcmV0dXJuIDAgb3RoZXJ3aXNlLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK2J1Zl9jaGVja190aW1lc3RhbXAoYnVmLCBmb2N1cykKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZm9jdXM7CQkvKiBjYWxsZWQgZm9yIEdVSSBmb2N1cyBldmVudCAqLworeworICAgIHN0cnVjdCBzdGF0CXN0OworICAgIGludAkJc3RhdF9yZXM7CisgICAgaW50CQlyZXR2YWwgPSAwOworICAgIGNoYXJfdQkqcGF0aDsKKyAgICBjaGFyX3UJKnRidWY7CisgICAgY2hhcgkqbWVzZyA9IE5VTEw7CisgICAgY2hhcgkqbWVzZzI7CisgICAgaW50CQloZWxwbWVzZyA9IEZBTFNFOworICAgIGludAkJcmVsb2FkID0gRkFMU0U7CisjaWYgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKQorICAgIGludAkJY2FuX3JlbG9hZCA9IEZBTFNFOworI2VuZGlmCisgICAgc2l6ZV90CW9yaWdfc2l6ZSA9IGJ1Zi0+Yl9vcmlnX3NpemU7CisgICAgaW50CQlvcmlnX21vZGUgPSBidWYtPmJfb3JpZ19tb2RlOworI2lmZGVmIEZFQVRfR1VJCisgICAgaW50CQlzYXZlX21vdXNlX2NvcnJlY3QgPSBuZWVkX21vdXNlX2NvcnJlY3Q7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBzdGF0aWMgaW50CWJ1c3kgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyogSWYgdGhlcmUgaXMgbm8gZmlsZSBuYW1lLCB0aGUgYnVmZmVyIGlzIG5vdCBsb2FkZWQsICdidWZ0eXBlJyBpcworICAgICAqIHNldCwgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzYXZlIG9yIGJlaW5nIGNhbGxlZCByZWN1cnNpdmVseTogaWdub3JlCisgICAgICogdGhpcyBidWZmZXIuICovCisgICAgaWYgKGJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTAorCSAgICB8fCBidWYtPmJfbWwubWxfbWZwID09IE5VTEwKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJICAgIHx8ICpidWYtPmJfcF9idCAhPSBOVUwKKyNlbmRpZgorCSAgICB8fCBidWYtPmJfc2F2aW5nCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIHx8IGJ1c3kKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIDA7CisKKyAgICBpZiAoICAgICAgICEoYnVmLT5iX2ZsYWdzICYgQkZfTk9URURJVEVEKQorCSAgICAmJiBidWYtPmJfbXRpbWUgIT0gMAorCSAgICAmJiAoKHN0YXRfcmVzID0gbWNoX3N0YXQoKGNoYXIgKilidWYtPmJfZmZuYW1lLCAmc3QpKSA8IDAKKwkJfHwgdGltZV9kaWZmZXJzKChsb25nKXN0LnN0X210aW1lLCBidWYtPmJfbXRpbWUpCisjaWZkZWYgSEFWRV9TVF9NT0RFCisJCXx8IChpbnQpc3Quc3RfbW9kZSAhPSBidWYtPmJfb3JpZ19tb2RlCisjZWxzZQorCQl8fCBtY2hfZ2V0cGVybShidWYtPmJfZmZuYW1lKSAhPSBidWYtPmJfb3JpZ19tb2RlCisjZW5kaWYKKwkJKSkKKyAgICB7CisJcmV0dmFsID0gMTsKKworCS8qIHNldCBiX210aW1lIHRvIHN0b3AgZnVydGhlciB3YXJuaW5ncyAqLworCWlmIChzdGF0X3JlcyA8IDApCisJeworCSAgICBidWYtPmJfbXRpbWUgPSAwOworCSAgICBidWYtPmJfb3JpZ19zaXplID0gMDsKKwkgICAgYnVmLT5iX29yaWdfbW9kZSA9IDA7CisJfQorCWVsc2UKKwkgICAgYnVmX3N0b3JlX3RpbWUoYnVmLCAmc3QsIGJ1Zi0+Yl9mZm5hbWUpOworCisJLyogRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGEgZGlyZWN0b3J5LiAgTWlnaHQgY29udGFpbiB0aGUgZmlsZQorCSAqIGV4cGxvcmVyLiAqLworCWlmIChtY2hfaXNkaXIoYnVmLT5iX2ZuYW1lKSkKKwkgICAgOworCisJLyoKKwkgKiBJZiAnYXV0b3JlYWQnIGlzIHNldCwgdGhlIGJ1ZmZlciBoYXMgbm8gY2hhbmdlcyBhbmQgdGhlIGZpbGUgc3RpbGwKKwkgKiBleGlzdHMsIHJlbG9hZCB0aGUgYnVmZmVyLiAgVXNlIHRoZSBidWZmZXItbG9jYWwgb3B0aW9uIHZhbHVlIGlmIGl0CisJICogd2FzIHNldCwgdGhlIGdsb2JhbCBvcHRpb24gdmFsdWUgb3RoZXJ3aXNlLgorCSAqLworCWVsc2UgaWYgKChidWYtPmJfcF9hciA+PSAwID8gYnVmLT5iX3BfYXIgOiBwX2FyKQorCQkJCSAgICAgICAmJiAhYnVmSXNDaGFuZ2VkKGJ1ZikgJiYgc3RhdF9yZXMgPj0gMCkKKwkgICAgcmVsb2FkID0gVFJVRTsKKwllbHNlCisJeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpbnQgbjsKKworCSAgICAvKgorCSAgICAgKiBPbmx5IGdpdmUgdGhlIHdhcm5pbmcgaWYgdGhlcmUgYXJlIG5vIEZpbGVDaGFuZ2VkU2hlbGwKKwkgICAgICogYXV0b2NvbW1hbmRzLgorCSAgICAgKiBBdm9pZCBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHkgYnkgc2V0dGluZyAiYnVzeSIuCisJICAgICAqLworCSAgICBidXN5ID0gVFJVRTsKKwkgICAgbiA9IGFwcGx5X2F1dG9jbWRzKEVWRU5UX0ZJTEVDSEFOR0VEU0hFTEwsCisJCQkJICAgICAgYnVmLT5iX2ZuYW1lLCBidWYtPmJfZm5hbWUsIEZBTFNFLCBidWYpOworCSAgICBidXN5ID0gRkFMU0U7CisJICAgIGlmIChuKQorCSAgICB7CisJCWlmICghYnVmX3ZhbGlkKGJ1ZikpCisJCSAgICBFTVNHKF8oIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiKSk7CisJCXJldHVybiAyOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWlmIChzdGF0X3JlcyA8IDApCisJCSAgICBtZXNnID0gXygiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOworCQllbHNlCisJCXsKKwkJICAgIGhlbHBtZXNnID0gVFJVRTsKKyNpZiBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpCisJCSAgICBjYW5fcmVsb2FkID0gVFJVRTsKKyNlbmRpZgorCQkgICAgLyoKKwkJICAgICAqIENoZWNrIGlmIHRoZSBmaWxlIGNvbnRlbnRzIHJlYWxseSBjaGFuZ2VkIHRvIGF2b2lkCisJCSAgICAgKiBnaXZpbmcgYSB3YXJuaW5nIHdoZW4gb25seSB0aGUgdGltZXN0YW1wIHdhcyBzZXQgKGUuZy4sCisJCSAgICAgKiBjaGVja2VkIG91dCBvZiBDVlMpLiAgQWx3YXlzIHdhcm4gd2hlbiB0aGUgYnVmZmVyIHdhcworCQkgICAgICogY2hhbmdlZC4KKwkJICAgICAqLworCQkgICAgaWYgKGJ1ZklzQ2hhbmdlZChidWYpKQorCQkJbWVzZyA9IF8oIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzIHdlbGwiKTsKKwkJICAgIGVsc2UgaWYgKG9yaWdfc2l6ZSAhPSBidWYtPmJfb3JpZ19zaXplCisJCQkgICAgfHwgYnVmX2NvbnRlbnRzX2NoYW5nZWQoYnVmKSkKKwkJCW1lc2cgPSBfKCJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIpOworCQkgICAgZWxzZSBpZiAob3JpZ19tb2RlICE9IGJ1Zi0+Yl9vcmlnX21vZGUpCisJCQltZXNnID0gXygiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIpOworCQl9CisJICAgIH0KKwl9CisKKyAgICB9CisgICAgZWxzZSBpZiAoKGJ1Zi0+Yl9mbGFncyAmIEJGX05FVykgJiYgIShidWYtPmJfZmxhZ3MgJiBCRl9ORVdfVykKKwkJCQkJCSYmIHZpbV9mZXhpc3RzKGJ1Zi0+Yl9mZm5hbWUpKQorICAgIHsKKwlyZXR2YWwgPSAxOworCW1lc2cgPSBfKCJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIik7CisJYnVmLT5iX2ZsYWdzIHw9IEJGX05FV19XOworI2lmIGRlZmluZWQoRkVBVF9DT05fRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykKKwljYW5fcmVsb2FkID0gVFJVRTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtZXNnICE9IE5VTEwpCisgICAgeworCXBhdGggPSBob21lX3JlcGxhY2Vfc2F2ZShidWYsIGJ1Zi0+Yl9mbmFtZSk7CisJaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICAgIGlmIChoZWxwbWVzZykKKwkJbWVzZzIgPSBfKCJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIpOworCSAgICBlbHNlCisJCW1lc2cyID0gIiI7CisJICAgIHRidWYgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihwYXRoKSArIFNUUkxFTihtZXNnKQorCQkJCQkJCSsgU1RSTEVOKG1lc2cyKSArIDIpKTsKKwkgICAgc3ByaW50ZigoY2hhciAqKXRidWYsIG1lc2csIHBhdGgpOworI2lmIGRlZmluZWQoRkVBVF9DT05fRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykKKwkgICAgaWYgKGNhbl9yZWxvYWQpCisJICAgIHsKKwkJaWYgKCptZXNnMiAhPSBOVUwpCisJCXsKKwkJICAgIFNUUkNBVCh0YnVmLCAiXG4iKTsKKwkJICAgIFNUUkNBVCh0YnVmLCBtZXNnMik7CisJCX0KKwkJaWYgKGRvX2RpYWxvZyhWSU1fV0FSTklORywgKGNoYXJfdSAqKV8oIldhcm5pbmciKSwgdGJ1ZiwKKwkJCQkoY2hhcl91ICopXygiJk9LXG4mTG9hZCBGaWxlIiksIDEsIE5VTEwpID09IDIpCisJCSAgICByZWxvYWQgPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICBpZiAoU3RhdGUgPiBOT1JNQUxfQlVTWSB8fCAoU3RhdGUgJiBDTURMSU5FKSB8fCBhbHJlYWR5X3dhcm5lZCkKKwkgICAgeworCQlpZiAoKm1lc2cyICE9IE5VTCkKKwkJeworCQkgICAgU1RSQ0FUKHRidWYsICI7ICIpOworCQkgICAgU1RSQ0FUKHRidWYsIG1lc2cyKTsKKwkJfQorCQlFTVNHKHRidWYpOworCQlyZXR2YWwgPSAyOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworIyBpZmRlZiBWSU1CVUREWQorCQlWaW1CdWRkeVRleHQodGJ1ZiArIDksIDIpOworIyBlbHNlCisjICBpZmRlZiBGRUFUX0FVVE9DTUQKKwkJaWYgKCFhdXRvY21kX2J1c3kpCisjICBlbmRpZgorCQl7CisJCSAgICBtc2dfc3RhcnQoKTsKKwkJICAgIG1zZ19wdXRzX2F0dHIodGJ1ZiwgaGxfYXR0cihITEZfRSkgKyBNU0dfSElTVCk7CisJCSAgICBpZiAoKm1lc2cyICE9IE5VTCkKKwkJCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKW1lc2cyLAorCQkJCQkJICAgaGxfYXR0cihITEZfVykgKyBNU0dfSElTVCk7CisJCSAgICBtc2dfY2xyX2VvcygpOworCQkgICAgKHZvaWQpbXNnX2VuZCgpOworCQkgICAgaWYgKGVtc2dfc2lsZW50ID09IDApCisJCSAgICB7CisJCQlvdXRfZmx1c2goKTsKKyMgIGlmZGVmIEZFQVRfR1VJCisJCQlpZiAoIWZvY3VzKQorIyAgZW5kaWYKKwkJCSAgICAvKiBnaXZlIHRoZSB1c2VyIHNvbWUgdGltZSB0byB0aGluayBhYm91dCBpdCAqLworCQkJICAgIHVpX2RlbGF5KDEwMDBMLCBUUlVFKTsKKworCQkJLyogZG9uJ3QgcmVkcmF3IGFuZCBlcmFzZSB0aGUgbWVzc2FnZSAqLworCQkJcmVkcmF3X2NtZGxpbmUgPSBGQUxTRTsKKwkJICAgIH0KKwkJfQorCQlhbHJlYWR5X3dhcm5lZCA9IFRSVUU7CisjIGVuZGlmCisJICAgIH0KKworCSAgICB2aW1fZnJlZShwYXRoKTsKKwkgICAgdmltX2ZyZWUodGJ1Zik7CisJfQorICAgIH0KKworICAgIGlmIChyZWxvYWQpCisgICAgeworCWV4YXJnX1QJCWVhOworCXBvc19UCQlvbGRfY3Vyc29yOworCWxpbmVucl9UCW9sZF90b3BsaW5lOworCWludAkJb2xkX3JvID0gYnVmLT5iX3Bfcm87CisJYnVmX1QJCSpzYXZlYnVmOworCWludAkJc2F2ZWQgPSBPSzsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlhY29fc2F2ZV9UCWFjbzsKKworCS8qIHNldCBjdXJ3aW4vY3VyYnVmIGZvciAiYnVmIiBhbmQgc2F2ZSBzb21lIHRoaW5ncyAqLworCWF1Y21kX3ByZXBidWYoJmFjbywgYnVmKTsKKyNlbHNlCisJYnVmX1QJKnNhdmVfY3VyYnVmID0gY3VyYnVmOworCisJY3VyYnVmID0gYnVmOworCWN1cndpbi0+d19idWZmZXIgPSBidWY7CisjZW5kaWYKKworCS8qIFdlIG9ubHkgd2FudCB0byByZWFkIHRoZSB0ZXh0IGZyb20gdGhlIGZpbGUsIG5vdCByZXNldCB0aGUgc3ludGF4CisJICogaGlnaGxpZ2h0aW5nLCBjbGVhciBtYXJrcywgZGlmZiBzdGF0dXMsIGV0Yy4gIEZvcmNlIHRoZSBmaWxlZm9ybWF0CisJICogYW5kIGVuY29kaW5nIHRvIGJlIHRoZSBzYW1lLiAqLworCWlmIChwcmVwX2V4YXJnKCZlYSwgYnVmKSA9PSBPSykKKwl7CisJICAgIG9sZF9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBvbGRfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworCisJICAgIC8qCisJICAgICAqIFRvIGJlaGF2ZSBsaWtlIHdoZW4gYSBuZXcgZmlsZSBpcyBlZGl0ZWQgKG1hdHRlcnMgZm9yCisJICAgICAqIEJ1ZlJlYWRQb3N0IGF1dG9jb21tYW5kcykgd2UgZmlyc3QgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQKKwkgICAgICogYnVmZmVyIGNvbnRlbnRzLiAgQnV0IGlmIHJlYWRpbmcgdGhlIGZpbGUgZmFpbHMgd2Ugc2hvdWxkIGtlZXAKKwkgICAgICogdGhlIG9sZCBjb250ZW50cy4gIENhbid0IHVzZSBtZW1vcnkgb25seSwgdGhlIGZpbGUgbWlnaHQgYmUKKwkgICAgICogdG9vIGJpZy4gIFVzZSBhIGhpZGRlbiBidWZmZXIgdG8gbW92ZSB0aGUgYnVmZmVyIGNvbnRlbnRzIHRvLgorCSAgICAgKi8KKwkgICAgaWYgKGJ1ZmVtcHR5KCkpCisJCXNhdmVidWYgPSBOVUxMOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogQWxsb2NhdGUgYSBidWZmZXIgd2l0aG91dCBwdXR0aW5nIGl0IGluIHRoZSBidWZmZXIgbGlzdC4gKi8KKwkJc2F2ZWJ1ZiA9IGJ1Zmxpc3RfbmV3KE5VTEwsIE5VTEwsIChsaW5lbnJfVCkxLCBCTE5fRFVNTVkpOworCQlpZiAoc2F2ZWJ1ZiAhPSBOVUxMKQorCQl7CisJCSAgICAvKiBPcGVuIHRoZSBtZW1saW5lLiAqLworCQkgICAgY3VyYnVmID0gc2F2ZWJ1ZjsKKwkJICAgIGN1cndpbi0+d19idWZmZXIgPSBzYXZlYnVmOworCQkgICAgc2F2ZWQgPSBtbF9vcGVuKCk7CisJCSAgICBjdXJidWYgPSBidWY7CisJCSAgICBjdXJ3aW4tPndfYnVmZmVyID0gYnVmOworCQl9CisJCWlmIChzYXZlYnVmID09IE5VTEwgfHwgc2F2ZWQgPT0gRkFJTAorCQkJCQkgIHx8IG1vdmVfbGluZXMoYnVmLCBzYXZlYnVmKSA9PSBGQUlMKQorCQl7CisJCSAgICBFTVNHMihfKCJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIpLAorCQkJCQkJCQlidWYtPmJfZm5hbWUpOworCQkgICAgc2F2ZWQgPSBGQUlMOworCQl9CisJICAgIH0KKworCSAgICBpZiAoc2F2ZWQgPT0gT0spCisJICAgIHsKKwkJY3VyYnVmLT5iX2ZsYWdzIHw9IEJGX0NIRUNLX1JPOwkvKiBjaGVjayBmb3IgUk8gYWdhaW4gKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkJa2VlcF9maWxldHlwZSA9IFRSVUU7CQkvKiBkb24ndCBkZXRlY3QgJ2ZpbGV0eXBlJyAqLworI2VuZGlmCisJCWlmIChyZWFkZmlsZShidWYtPmJfZmZuYW1lLCBidWYtPmJfZm5hbWUsIChsaW5lbnJfVCkwLAorCQkJICAgIChsaW5lbnJfVCkwLAorCQkJICAgIChsaW5lbnJfVClNQVhMTlVNLCAmZWEsIFJFQURfTkVXKSA9PSBGQUlMKQorCQl7CisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCQkgICAgaWYgKCFhYm9ydGluZygpKQorI2VuZGlmCisJCQlFTVNHMihfKCJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIpLCBidWYtPmJfZm5hbWUpOworCQkgICAgaWYgKHNhdmVidWYgIT0gTlVMTCkKKwkJICAgIHsKKwkJCS8qIFB1dCB0aGUgdGV4dCBiYWNrIGZyb20gdGhlIHNhdmUgYnVmZmVyLiAgRmlyc3QKKwkJCSAqIGRlbGV0ZSBhbnkgbGluZXMgdGhhdCByZWFkZmlsZSgpIGFkZGVkLiAqLworCQkJd2hpbGUgKCFidWZlbXB0eSgpKQorCQkJICAgIGlmIChtbF9kZWxldGUoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQsIEZBTFNFKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCQkJCWJyZWFrOworCQkJKHZvaWQpbW92ZV9saW5lcyhzYXZlYnVmLCBidWYpOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogTWFyayB0aGUgYnVmZmVyIGFzIHVubW9kaWZpZWQgYW5kIGZyZWUgdW5kbyBpbmZvLiAqLworCQkgICAgdW5jaGFuZ2VkKGJ1ZiwgVFJVRSk7CisJCSAgICB1X2Jsb2NrZnJlZShidWYpOworCQkgICAgdV9jbGVhcmFsbChidWYpOworCQl9CisJICAgIH0KKwkgICAgdmltX2ZyZWUoZWEuY21kKTsKKworCSAgICBpZiAoc2F2ZWJ1ZiAhPSBOVUxMKQorCQl3aXBlX2J1ZmZlcihzYXZlYnVmLCBGQUxTRSk7CisKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgLyogSW52YWxpZGF0ZSBkaWZmIGluZm8gaWYgbmVjZXNzYXJ5LiAqLworCSAgICBkaWZmX2ludmFsaWRhdGUoKTsKKyNlbmRpZgorCisJICAgIC8qIFJlc3RvcmUgdGhlIHRvcGxpbmUgYW5kIGN1cnNvciBwb3NpdGlvbiBhbmQgY2hlY2sgaXQgKGxpbmVzIG1heQorCSAgICAgKiBoYXZlIGJlZW4gcmVtb3ZlZCkuICovCisJICAgIGlmIChvbGRfdG9wbGluZSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQljdXJ3aW4tPndfdG9wbGluZSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCSAgICBlbHNlCisJCWN1cndpbi0+d190b3BsaW5lID0gb2xkX3RvcGxpbmU7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBvbGRfY3Vyc29yOworCSAgICBjaGVja19jdXJzb3IoKTsKKwkgICAgdXBkYXRlX3RvcGxpbmUoKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAga2VlcF9maWxldHlwZSA9IEZBTFNFOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIHsKKwkJd2luX1QgKndwOworCisJCS8qIFVwZGF0ZSBmb2xkcyB1bmxlc3MgdGhleSBhcmUgZGVmaW5lZCBtYW51YWxseS4gKi8KKwkJRk9SX0FMTF9XSU5ET1dTKHdwKQorCQkgICAgaWYgKHdwLT53X2J1ZmZlciA9PSBjdXJ3aW4tPndfYnVmZmVyCisJCQkgICAgJiYgIWZvbGRtZXRob2RJc01hbnVhbCh3cCkpCisJCQlmb2xkVXBkYXRlQWxsKHdwKTsKKwkgICAgfQorI2VuZGlmCisJICAgIC8qIElmIHRoZSBtb2RlIGRpZG4ndCBjaGFuZ2UgYW5kICdyZWFkb25seScgd2FzIHNldCwga2VlcCB0aGUgb2xkCisJICAgICAqIHZhbHVlOyB0aGUgdXNlciBwcm9iYWJseSB1c2VkIHRoZSAiOnZpZXciIGNvbW1hbmQuICBCdXQgZG9uJ3QKKwkgICAgICogcmVzZXQgaXQsIG1pZ2h0IGhhdmUgaGFkIGEgcmVhZCBlcnJvci4gKi8KKwkgICAgaWYgKG9yaWdfbW9kZSA9PSBjdXJidWYtPmJfb3JpZ19tb2RlKQorCQljdXJidWYtPmJfcF9ybyB8PSBvbGRfcm87CisJfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJLyogcmVzdG9yZSBjdXJ3aW4vY3VyYnVmIGFuZCBhIGZldyBvdGhlciB0aGluZ3MgKi8KKwlhdWNtZF9yZXN0YnVmKCZhY28pOworCS8qIENhcmVmdWw6IGF1dG9jb21tYW5kcyBtYXkgaGF2ZSBtYWRlICJidWYiIGludmFsaWQhICovCisjZWxzZQorCWN1cndpbi0+d19idWZmZXIgPSBzYXZlX2N1cmJ1ZjsKKwljdXJidWYgPSBzYXZlX2N1cmJ1ZjsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogcmVzdG9yZSB0aGlzIGluIGNhc2UgYW4gYXV0b2NvbW1hbmQgaGFzIHNldCBpdDsgaXQgd291bGQgYnJlYWsKKyAgICAgKiAnbW91c2Vmb2N1cycgKi8KKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBzYXZlX21vdXNlX2NvcnJlY3Q7CisjZW5kaWYKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2J1Zl9zdG9yZV90aW1lKGJ1Ziwgc3QsIGZuYW1lKQorICAgIGJ1Zl9UCSpidWY7CisgICAgc3RydWN0IHN0YXQJKnN0OworICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgYnVmLT5iX210aW1lID0gKGxvbmcpc3QtPnN0X210aW1lOworICAgIGJ1Zi0+Yl9vcmlnX3NpemUgPSAoc2l6ZV90KXN0LT5zdF9zaXplOworI2lmZGVmIEhBVkVfU1RfTU9ERQorICAgIGJ1Zi0+Yl9vcmlnX21vZGUgPSAoaW50KXN0LT5zdF9tb2RlOworI2Vsc2UKKyAgICBidWYtPmJfb3JpZ19tb2RlID0gbWNoX2dldHBlcm0oZm5hbWUpOworI2VuZGlmCit9CisKKy8qCisgKiBBZGp1c3QgdGhlIGxpbmUgd2l0aCBtaXNzaW5nIGVvbCwgdXNlZCBmb3IgdGhlIG5leHQgd3JpdGUuCisgKiBVc2VkIGZvciBkb19maWx0ZXIoKSwgd2hlbiB0aGUgaW5wdXQgbGluZXMgZm9yIHRoZSBmaWx0ZXIgYXJlIGRlbGV0ZWQuCisgKi8KKyAgICB2b2lkCit3cml0ZV9sbnVtX2FkanVzdChvZmZzZXQpCisgICAgbGluZW5yX1QJb2Zmc2V0OworeworICAgIGlmICh3cml0ZV9ub19lb2xfbG51bSkJCS8qIG9ubHkgaWYgdGhlcmUgaXMgYSBtaXNzaW5nIGVvbCAqLworCXdyaXRlX25vX2VvbF9sbnVtICs9IG9mZnNldDsKK30KKworI2lmIGRlZmluZWQoVEVNUERJUk5BTUVTKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGxvbmcJdGVtcF9jb3VudCA9IDA7CQkvKiBUZW1wIGZpbGVuYW1lIGNvdW50ZXIuICovCisKKy8qCisgKiBEZWxldGUgdGhlIHRlbXAgZGlyZWN0b3J5IGFuZCBhbGwgZmlsZXMgaXQgY29udGFpbnMuCisgKi8KKyAgICB2b2lkCit2aW1fZGVsdGVtcGRpcigpCit7CisgICAgY2hhcl91CSoqZmlsZXM7CisgICAgaW50CQlmaWxlX2NvdW50OworICAgIGludAkJaTsKKworICAgIGlmICh2aW1fdGVtcGRpciAhPSBOVUxMKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopTmFtZUJ1ZmYsICIlcyoiLCB2aW1fdGVtcGRpcik7CisJaWYgKGdlbl9leHBhbmRfd2lsZGNhcmRzKDEsICZOYW1lQnVmZiwgJmZpbGVfY291bnQsICZmaWxlcywKKwkJCQkJICAgICAgRVdfRElSfEVXX0ZJTEV8RVdfU0lMRU5UKSA9PSBPSykKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlX2NvdW50OyArK2kpCisJCW1jaF9yZW1vdmUoZmlsZXNbaV0pOworCSAgICBGcmVlV2lsZChmaWxlX2NvdW50LCBmaWxlcyk7CisJfQorCWdldHRhaWwoTmFtZUJ1ZmYpWy0xXSA9IE5VTDsKKwkodm9pZCltY2hfcm1kaXIoTmFtZUJ1ZmYpOworCisJdmltX2ZyZWUodmltX3RlbXBkaXIpOworCXZpbV90ZW1wZGlyID0gTlVMTDsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIHZpbV90ZW1wbmFtZSgpOiBSZXR1cm4gYSB1bmlxdWUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBhIHRlbXAgZmlsZS4KKyAqCisgKiBUaGUgdGVtcCBmaWxlIGlzIE5PVCBjcmVhdGVkLgorICoKKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHRvIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBOVUxMIGlmIG5vIHZhbGlkIG5hbWUgd2FzIGZvdW5kLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgICoKK3ZpbV90ZW1wbmFtZShleHRyYV9jaGFyKQorICAgIGludAkgICAgZXh0cmFfY2hhcjsJICAgIC8qIGNoYXJhY3RlciB0byB1c2UgaW4gdGhlIG5hbWUgaW5zdGVhZCBvZiAnPycgKi8KK3sKKyNpZmRlZiBVU0VfVE1QTkFNCisgICAgY2hhcl91CWl0bXBbTF90bXBuYW1dOwkvKiB1c2UgdG1wbmFtKCkgKi8KKyNlbHNlCisgICAgY2hhcl91CWl0bXBbVEVNUE5BTUVMRU5dOworI2VuZGlmCisKKyNpZmRlZiBURU1QRElSTkFNRVMKKyAgICBzdGF0aWMgY2hhcgkqKHRlbXBkaXJzW10pID0ge1RFTVBESVJOQU1FU307CisgICAgaW50CQlpOworICAgIGxvbmcJbnI7CisgICAgbG9uZwlvZmY7CisjIGlmbmRlZiBFRVhJU1QKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKyMgZW5kaWYKKworICAgIC8qCisgICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgcHJpdmF0ZSB1c2UgYnkgdGhpcyBpbnN0YW5jZSBvZiBWaW0uCisgICAgICogVGhpcyBpcyBkb25lIG9uY2UsIGFuZCB0aGUgc2FtZSBkaXJlY3RvcnkgaXMgdXNlZCBmb3IgYWxsIHRlbXAgZmlsZXMuCisgICAgICogVGhpcyBtZXRob2QgYXZvaWRzIHNlY3VyaXR5IHByb2JsZW1zIGJlY2F1c2Ugb2Ygc3ltbGluayBhdHRhY2tzIGV0IGFsLgorICAgICAqIEl0J3MgYWxzbyBhIGJpdCBmYXN0ZXIsIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBhbiBleGlzdGluZworICAgICAqIGZpbGUgd2hlbiBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGFuZCBub3QgZm9yIGVhY2ggdGVtcCBmaWxlLgorICAgICAqLworICAgIGlmICh2aW1fdGVtcGRpciA9PSBOVUxMKQorICAgIHsKKwkvKgorCSAqIFRyeSB0aGUgZW50cmllcyBpbiBURU1QRElSTkFNRVMgdG8gY3JlYXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlbXBkaXJzKSAvIHNpemVvZihjaGFyICopOyArK2kpCisJeworCSAgICAvKiBleHBhbmQgJFRNUCwgbGVhdmUgcm9vbSBmb3IgIi92MTEwMDAwMC85OTk5OTk5OTkiICovCisJICAgIGV4cGFuZF9lbnYoKGNoYXJfdSAqKXRlbXBkaXJzW2ldLCBpdG1wLCBURU1QTkFNRUxFTiAtIDIwKTsKKwkgICAgaWYgKG1jaF9pc2RpcihpdG1wKSkJCS8qIGRpcmVjdG9yeSBleGlzdHMgKi8KKwkgICAgeworIyBpZmRlZiBfX0VNWF9fCisJCS8qIElmICRUTVAgY29udGFpbnMgYSBmb3J3YXJkIHNsYXNoIChwZXJoYXBzIHVzaW5nIGJhc2ggb3IKKwkJICogdGNzaCksIGRvbid0IGFkZCBhIGJhY2tzbGFzaCwgdXNlIGEgZm9yd2FyZCBzbGFzaCEKKwkJICogQWRkaW5nIDIgYmFja3NsYXNoZXMgZGlkbid0IHdvcmsuICovCisJCWlmICh2aW1fc3RyY2hyKGl0bXAsICcvJykgIT0gTlVMTCkKKwkJICAgIFNUUkNBVChpdG1wLCAiLyIpOworCQllbHNlCisjIGVuZGlmCisJCSAgICBhZGRfcGF0aHNlcChpdG1wKTsKKworCQkvKiBHZXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB1cCB0byA2IGRpZ2l0cy4gIFdoZW4gaXQncworCQkgKiB1bmxpa2VseSB0aGF0IGl0IGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgYmUgZmFzdGVyLAorCQkgKiBvdGhlcndpc2UgaXQgZG9lc24ndCBtYXR0ZXIuICBUaGUgdXNlIG9mIG1rZGlyKCkgYXZvaWRzIGFueQorCQkgKiBzZWN1cml0eSBwcm9ibGVtcyBiZWNhdXNlIG9mIHRoZSBwcmVkaWN0YWJsZSBudW1iZXIuICovCisJCW5yID0gKG1jaF9nZXRfcGlkKCkgKyAobG9uZyl0aW1lKE5VTEwpKSAlIDEwMDAwMDBMOworCisJCS8qIFRyeSB1cCB0byAxMDAwMCBkaWZmZXJlbnQgdmFsdWVzIHVudGlsIHdlIGZpbmQgYSBuYW1lIHRoYXQKKwkJICogZG9lc24ndCBleGlzdC4gKi8KKwkJZm9yIChvZmYgPSAwOyBvZmYgPCAxMDAwMEw7ICsrb2ZmKQorCQl7CisJCSAgICBpbnQJCXI7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKwkJICAgIG1vZGVfdAl1bWFza19zYXZlOworI2VuZGlmCisKKwkJICAgIHNwcmludGYoKGNoYXIgKilpdG1wICsgU1RSTEVOKGl0bXApLCAidiVsZCIsIG5yICsgb2ZmKTsKKyMgaWZuZGVmIEVFWElTVAorCQkgICAgLyogSWYgbWtkaXIoKSBkb2VzIG5vdCBzZXQgZXJybm8gdG8gRUVYSVNULCBjaGVjayBmb3IKKwkJICAgICAqIGV4aXN0aW5nIGZpbGUgaGVyZS4gIFRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gdGhlbiwKKwkJICAgICAqIGFsdGhvdWdoIGl0J3MgZmFpbC1zYWZlLiAqLworCQkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopaXRtcCwgJnN0KSA+PSAwKQorCQkJY29udGludWU7CisjIGVuZGlmCisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKwkJICAgIC8qIE1ha2Ugc3VyZSB0aGUgdW1hc2sgZG9lc24ndCByZW1vdmUgdGhlIGV4ZWN1dGFibGUgYml0LgorCQkgICAgICogInJlcGwiIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHVzZSAiMTc3Ii4gKi8KKwkJICAgIHVtYXNrX3NhdmUgPSB1bWFzaygwNzcpOworI2VuZGlmCisJCSAgICByID0gdmltX21rZGlyKGl0bXAsIDA3MDApOworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisJCSAgICAodm9pZCl1bWFzayh1bWFza19zYXZlKTsKKyNlbmRpZgorCQkgICAgaWYgKHIgPT0gMCkKKwkJICAgIHsKKwkJCWNoYXJfdQkqYnVmOworCisJCQkvKiBEaXJlY3Rvcnkgd2FzIGNyZWF0ZWQsIHVzZSB0aGlzIG5hbWUuCisJCQkgKiBFeHBhbmQgdG8gZnVsbCBwYXRoOyBXaGVuIHVzaW5nIHRoZSBjdXJyZW50CisJCQkgKiBkaXJlY3RvcnkgYSAiOmNkIiB3b3VsZCBjb25mdXNlIHVzLiAqLworCQkJYnVmID0gYWxsb2MoKHVuc2lnbmVkKU1BWFBBVEhMICsgMSk7CisJCQlpZiAoYnVmICE9IE5VTEwpCisJCQl7CisJCQkgICAgaWYgKHZpbV9GdWxsTmFtZShpdG1wLCBidWYsIE1BWFBBVEhMLCBGQUxTRSkKKwkJCQkJCQkJICAgICAgPT0gRkFJTCkKKwkJCQlTVFJDUFkoYnVmLCBpdG1wKTsKKyMgaWZkZWYgX19FTVhfXworCQkJICAgIGlmICh2aW1fc3RyY2hyKGJ1ZiwgJy8nKSAhPSBOVUxMKQorCQkJCVNUUkNBVChidWYsICIvIik7CisJCQkgICAgZWxzZQorIyBlbmRpZgorCQkJCWFkZF9wYXRoc2VwKGJ1Zik7CisJCQkgICAgdmltX3RlbXBkaXIgPSB2aW1fc3Ryc2F2ZShidWYpOworCQkJICAgIHZpbV9mcmVlKGJ1Zik7CisJCQl9CisJCQlicmVhazsKKwkJICAgIH0KKyMgaWZkZWYgRUVYSVNUCisJCSAgICAvKiBJZiB0aGUgbWtkaXIoKSBkaWRuJ3QgZmFpbCBiZWNhdXNlIHRoZSBmaWxlL2RpciBleGlzdHMsCisJCSAgICAgKiB3ZSBwcm9iYWJseSBjYW4ndCBjcmVhdGUgYW55IGRpciBoZXJlLCB0cnkgYW5vdGhlcgorCQkgICAgICogcGxhY2UuICovCisJCSAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorIyBlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZpbV90ZW1wZGlyICE9IE5VTEwpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAodmltX3RlbXBkaXIgIT0gTlVMTCkKKyAgICB7CisJLyogVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMsIGJlY2F1c2Ugd2Ugb3duIHRoZQorCSAqIGRpcmVjdG9yeSBhbmQgbm9ib2R5IGVsc2UgY3JlYXRlcyBhIGZpbGUgaW4gaXQuICovCisJc3ByaW50ZigoY2hhciAqKWl0bXAsICIlcyVsZCIsIHZpbV90ZW1wZGlyLCB0ZW1wX2NvdW50KyspOworCXJldHVybiB2aW1fc3Ryc2F2ZShpdG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKKworI2Vsc2UgLyogVEVNUERJUk5BTUVTICovCisKKyMgaWZkZWYgV0lOMzI2NAorICAgIGNoYXIJc3pUZW1wRmlsZVtfTUFYX1BBVEggKyAxXTsKKyAgICBjaGFyCWJ1ZjRbNF07CisgICAgY2hhcl91CSpyZXR2YWw7CisgICAgY2hhcl91CSpwOworCisgICAgU1RSQ1BZKGl0bXAsICIiKTsKKyAgICBpZiAoR2V0VGVtcFBhdGgoX01BWF9QQVRILCBzelRlbXBGaWxlKSA9PSAwKQorCXN6VGVtcEZpbGVbMF0gPSBOVUw7CS8qIEdldFRlbXBQYXRoKCkgZmFpbGVkLCB1c2UgY3VycmVudCBkaXIgKi8KKyAgICBzdHJjcHkoYnVmNCwgIlZJTSIpOworICAgIGJ1ZjRbMl0gPSBleHRyYV9jaGFyOyAgIC8qIG1ha2UgaXQgIlZJYSIsICJWSWIiLCBldGMuICovCisgICAgaWYgKEdldFRlbXBGaWxlTmFtZShzelRlbXBGaWxlLCBidWY0LCAwLCBpdG1wKSA9PSAwKQorCXJldHVybiBOVUxMOworICAgIC8qIEdldFRlbXBGaWxlTmFtZSgpIHdpbGwgY3JlYXRlIHRoZSBmaWxlLCB3ZSBkb24ndCB3YW50IHRoYXQgKi8KKyAgICAodm9pZClEZWxldGVGaWxlKGl0bXApOworCisgICAgLyogQmFja3NsYXNoZXMgaW4gYSB0ZW1wIGZpbGUgbmFtZSBjYXVzZSBwcm9ibGVtcyB3aGVuIGZpbHRlcmluZyB3aXRoCisgICAgICogInNoIi4gIE5PVEU6IFRoaXMgYWxzbyBjaGVja3MgJ3NoZWxsY21kZmxhZycgdG8gaGVscCB0aG9zZSBwZW9wbGUgd2hvCisgICAgICogZGlkbid0IHNldCAnc2hlbGxzbGFzaCcuICovCisgICAgcmV0dmFsID0gdmltX3N0cnNhdmUoaXRtcCk7CisgICAgaWYgKCpwX3NoY2YgPT0gJy0nIHx8IHBfc3NsKQorCWZvciAocCA9IHJldHZhbDsgKnA7ICsrcCkKKwkgICAgaWYgKCpwID09ICdcXCcpCisJCSpwID0gJy8nOworICAgIHJldHVybiByZXR2YWw7CisKKyMgZWxzZSAvKiBXSU4zMjY0ICovCisKKyMgIGlmZGVmIFVTRV9UTVBOQU0KKyAgICAvKiB0bXBuYW0oKSB3aWxsIG1ha2UgaXRzIG93biBuYW1lICovCisgICAgaWYgKCp0bXBuYW0oKGNoYXIgKilpdG1wKSA9PSBOVUwpCisJcmV0dXJuIE5VTEw7CisjICBlbHNlCisgICAgY2hhcl91CSpwOworCisjICAgaWZkZWYgVk1TX1RFTVBOQU0KKyAgICAvKiBta3RlbXAoKSBpcyBub3Qgd29ya2luZyBvbiBWTVMuICBJdCBzZWVtcyB0byBiZQorICAgICAqIGEgZG8tbm90aGluZyBmdW5jdGlvbi4gVGhlcmVmb3JlIHdlIHVzZSB0ZW1wbmFtKCkuCisgICAgICovCisgICAgc3ByaW50ZigoY2hhciAqKWl0bXAsICJWSU0lYyIsIGV4dHJhX2NoYXIpOworICAgIHAgPSAoY2hhcl91ICopdGVtcG5hbSgidG1wOiIsIChjaGFyICopaXRtcCk7CisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJLyogVk1TIHdpbGwgdXNlICcuTE9HJyBpZiB3ZSBkb24ndCBleHBsaWNpdGx5IHNwZWNpZnkgYW4gZXh0ZW5zaW9uLAorCSAqIGFuZCBWSU0gd2lsbCB0aGVuIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBmaWxlIGxhdGVyICovCisJU1RSQ1BZKGl0bXAsIHApOworCVNUUkNBVChpdG1wLCAiLnR4dCIpOworCWZyZWUocCk7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKKyMgICBlbHNlCisgICAgU1RSQ1BZKGl0bXAsIFRFTVBOQU1FKTsKKyAgICBpZiAoKHAgPSB2aW1fc3RyY2hyKGl0bXAsICc/JykpICE9IE5VTEwpCisJKnAgPSBleHRyYV9jaGFyOworICAgIGlmIChta3RlbXAoKGNoYXIgKilpdG1wKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworIyAgIGVuZGlmCisjICBlbmRpZgorCisgICAgcmV0dXJuIHZpbV9zdHJzYXZlKGl0bXApOworIyBlbmRpZiAvKiBXSU4zMjY0ICovCisjZW5kaWYgLyogVEVNUERJUk5BTUVTICovCit9CisKKyNpZiBkZWZpbmVkKEJBQ0tTTEFTSF9JTl9GSUxFTkFNRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDb252ZXJ0IGFsbCBiYWNrc2xhc2hlcyBpbiBmbmFtZSB0byBmb3J3YXJkIHNsYXNoZXMgaW4tcGxhY2UuCisgKi8KKyAgICB2b2lkCitmb3J3YXJkX3NsYXNoKGZuYW1lKQorICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgZm9yIChwID0gZm5hbWU7ICpwICE9IE5VTDsgKytwKQorIyBpZmRlZiAgRkVBVF9NQllURQorCS8qIFRoZSBCaWc1IGVuY29kaW5nIGNhbiBoYXZlICdcJyBpbiB0aGUgdHJhaWwgYnl0ZS4gKi8KKwlpZiAoZW5jX2RiY3MgIT0gMCAmJiAoKm1iX3B0cjJsZW5fY2hlY2spKHApID4gMSkKKwkgICAgKytwOworCWVsc2UKKyMgZW5kaWYKKwlpZiAoKnAgPT0gJ1xcJykKKwkgICAgKnAgPSAnLyc7Cit9CisjZW5kaWYKKworCisvKgorICogQ29kZSBmb3IgYXV0b21hdGljIGNvbW1hbmRzLgorICoKKyAqIE9ubHkgaW5jbHVkZWQgd2hlbiAiRkVBVF9BVVRPQ01EIiBoYXMgYmVlbiBkZWZpbmVkLgorICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIFRoZSBhdXRvY29tbWFuZHMgYXJlIHN0b3JlZCBpbiBhIGxpc3QgZm9yIGVhY2ggZXZlbnQuCisgKiBBdXRvY29tbWFuZHMgZm9yIHRoZSBzYW1lIHBhdHRlcm4sIHRoYXQgYXJlIGNvbnNlY3V0aXZlLCBhcmUgam9pbmVkCisgKiB0b2dldGhlciwgdG8gYXZvaWQgaGF2aW5nIHRvIG1hdGNoIHRoZSBwYXR0ZXJuIHRvbyBvZnRlbi4KKyAqIFRoZSByZXN1bHQgaXMgYW4gYXJyYXkgb2YgQXV0b3BhdCBsaXN0cywgd2hpY2ggcG9pbnQgdG8gQXV0b0NtZCBsaXN0czoKKyAqCisgKiBmaXJzdF9hdXRvcGF0WzBdIC0tPiBBdXRvcGF0Lm5leHQgIC0tPiAgQXV0b3BhdC5uZXh0IC0tPiAgTlVMTAorICoJCQlBdXRvcGF0LmNtZHMJICAgQXV0b3BhdC5jbWRzCisgKgkJCSAgICB8CQkJIHwKKyAqCQkJICAgIFYJCQkgVgorICoJCQlBdXRvQ21kLm5leHQJICAgQXV0b0NtZC5uZXh0CisgKgkJCSAgICB8CQkJIHwKKyAqCQkJICAgIFYJCQkgVgorICoJCQlBdXRvQ21kLm5leHQJCU5VTEwKKyAqCQkJICAgIHwKKyAqCQkJICAgIFYKKyAqCQkJICAgTlVMTAorICoKKyAqIGZpcnN0X2F1dG9wYXRbMV0gLS0+IEF1dG9wYXQubmV4dCAgLS0+ICBOVUxMCisgKgkJCUF1dG9wYXQuY21kcworICoJCQkgICAgfAorICoJCQkgICAgVgorICoJCQlBdXRvQ21kLm5leHQKKyAqCQkJICAgIHwKKyAqCQkJICAgIFYKKyAqCQkJICAgTlVMTAorICogICBldGMuCisgKgorICogICBUaGUgb3JkZXIgb2YgQXV0b0NtZHMgaXMgaW1wb3J0YW50LCB0aGlzIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUKKyAqICAgZGVmaW5lZCBhbmQgd2lsbCBoYXZlIHRvIGJlIGV4ZWN1dGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBBdXRvQ21kCit7CisgICAgY2hhcl91CSAgICAqY21kOwkJLyogVGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgKE5VTEwKKwkJCQkJICAgd2hlbiBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQpICovCisgICAgY2hhcgkgICAgbmVzdGVkOwkJLyogSWYgYXV0b2NvbW1hbmRzIG5lc3QgaGVyZSAqLworICAgIGNoYXIJICAgIGxhc3Q7CQkvKiBsYXN0IGNvbW1hbmQgaW4gbGlzdCAqLworI2lmZGVmIEZFQVRfRVZBTAorICAgIHNjaWRfVAkgICAgc2NyaXB0SUQ7CQkvKiBzY3JpcHQgSUQgd2hlcmUgZGVmaW5lZCAqLworI2VuZGlmCisgICAgc3RydWN0IEF1dG9DbWQgICpuZXh0OwkJLyogTmV4dCBBdXRvQ21kIGluIGxpc3QgKi8KK30gQXV0b0NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgQXV0b1BhdAoreworICAgIGludAkJICAgIGdyb3VwOwkJLyogZ3JvdXAgSUQgKi8KKyAgICBjaGFyX3UJICAgICpwYXQ7CQkvKiBwYXR0ZXJuIGFzIHR5cGVkIChOVUxMIHdoZW4gcGF0dGVybgorCQkJCQkgICBoYXMgYmVlbiByZW1vdmVkKSAqLworICAgIGludAkJICAgIHBhdGxlbjsJCS8qIHN0cmxlbigpIG9mIHBhdCAqLworICAgIGNoYXJfdQkgICAgKnJlZ19wYXQ7CQkvKiBwYXR0ZXJuIGNvbnZlcnRlZCB0byByZWdleHAgKi8KKyAgICBjaGFyCSAgICBhbGxvd19kaXJzOwkJLyogUGF0dGVybiBtYXkgbWF0Y2ggd2hvbGUgcGF0aCAqLworICAgIGNoYXIJICAgIGxhc3Q7CQkvKiBsYXN0IHBhdHRlcm4gZm9yIGFwcGx5X2F1dG9jbWRzKCkgKi8KKyAgICBBdXRvQ21kCSAgICAqY21kczsJCS8qIGxpc3Qgb2YgY29tbWFuZHMgdG8gZG8gKi8KKyAgICBzdHJ1Y3QgQXV0b1BhdCAgKm5leHQ7CQkvKiBuZXh0IEF1dG9QYXQgaW4gQXV0b1BhdCBsaXN0ICovCit9IEF1dG9QYXQ7CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfbmFtZQoreworICAgIGNoYXIJKm5hbWU7CS8qIGV2ZW50IG5hbWUgKi8KKyAgICBFVkVOVF9UCWV2ZW50OwkvKiBldmVudCBudW1iZXIgKi8KK30gZXZlbnRfbmFtZXNbXSA9Cit7CisgICAgeyJCdWZBZGQiLAkJRVZFTlRfQlVGQUREfSwKKyAgICB7IkJ1ZkNyZWF0ZSIsCUVWRU5UX0JVRkFERH0sCisgICAgeyJCdWZEZWxldGUiLAlFVkVOVF9CVUZERUxFVEV9LAorICAgIHsiQnVmRW50ZXIiLAlFVkVOVF9CVUZFTlRFUn0sCisgICAgeyJCdWZGaWxlUG9zdCIsCUVWRU5UX0JVRkZJTEVQT1NUfSwKKyAgICB7IkJ1ZkZpbGVQcmUiLAlFVkVOVF9CVUZGSUxFUFJFfSwKKyAgICB7IkJ1ZkhpZGRlbiIsCUVWRU5UX0JVRkhJRERFTn0sCisgICAgeyJCdWZMZWF2ZSIsCUVWRU5UX0JVRkxFQVZFfSwKKyAgICB7IkJ1Zk5ldyIsCQlFVkVOVF9CVUZORVd9LAorICAgIHsiQnVmTmV3RmlsZSIsCUVWRU5UX0JVRk5FV0ZJTEV9LAorICAgIHsiQnVmUmVhZCIsCQlFVkVOVF9CVUZSRUFEUE9TVH0sCisgICAgeyJCdWZSZWFkQ21kIiwJRVZFTlRfQlVGUkVBRENNRH0sCisgICAgeyJCdWZSZWFkUG9zdCIsCUVWRU5UX0JVRlJFQURQT1NUfSwKKyAgICB7IkJ1ZlJlYWRQcmUiLAlFVkVOVF9CVUZSRUFEUFJFfSwKKyAgICB7IkJ1ZlVubG9hZCIsCUVWRU5UX0JVRlVOTE9BRH0sCisgICAgeyJCdWZXaW5FbnRlciIsCUVWRU5UX0JVRldJTkVOVEVSfSwKKyAgICB7IkJ1ZldpbkxlYXZlIiwJRVZFTlRfQlVGV0lOTEVBVkV9LAorICAgIHsiQnVmV2lwZW91dCIsCUVWRU5UX0JVRldJUEVPVVR9LAorICAgIHsiQnVmV3JpdGUiLAlFVkVOVF9CVUZXUklURVBSRX0sCisgICAgeyJCdWZXcml0ZVBvc3QiLAlFVkVOVF9CVUZXUklURVBPU1R9LAorICAgIHsiQnVmV3JpdGVQcmUiLAlFVkVOVF9CVUZXUklURVBSRX0sCisgICAgeyJCdWZXcml0ZUNtZCIsCUVWRU5UX0JVRldSSVRFQ01EfSwKKyAgICB7IkNtZHdpbkVudGVyIiwJRVZFTlRfQ01EV0lORU5URVJ9LAorICAgIHsiQ21kd2luTGVhdmUiLAlFVkVOVF9DTURXSU5MRUFWRX0sCisgICAgeyJFbmNvZGluZ0NoYW5nZWQiLAlFVkVOVF9FTkNPRElOR0NIQU5HRUR9LAorICAgIHsiRmlsZUVuY29kaW5nIiwJRVZFTlRfRU5DT0RJTkdDSEFOR0VEfSwKKyAgICB7IkN1cnNvckhvbGQiLAlFVkVOVF9DVVJTT1JIT0xEfSwKKyAgICB7IkZpbGVBcHBlbmRQb3N0IiwJRVZFTlRfRklMRUFQUEVORFBPU1R9LAorICAgIHsiRmlsZUFwcGVuZFByZSIsCUVWRU5UX0ZJTEVBUFBFTkRQUkV9LAorICAgIHsiRmlsZUFwcGVuZENtZCIsCUVWRU5UX0ZJTEVBUFBFTkRDTUR9LAorICAgIHsiRmlsZUNoYW5nZWRTaGVsbCIsRVZFTlRfRklMRUNIQU5HRURTSEVMTH0sCisgICAgeyJGaWxlQ2hhbmdlZFJPIiwJRVZFTlRfRklMRUNIQU5HRURST30sCisgICAgeyJGaWxlUmVhZFBvc3QiLAlFVkVOVF9GSUxFUkVBRFBPU1R9LAorICAgIHsiRmlsZVJlYWRQcmUiLAlFVkVOVF9GSUxFUkVBRFBSRX0sCisgICAgeyJGaWxlUmVhZENtZCIsCUVWRU5UX0ZJTEVSRUFEQ01EfSwKKyAgICB7IkZpbGVUeXBlIiwJRVZFTlRfRklMRVRZUEV9LAorICAgIHsiRmlsZVdyaXRlUG9zdCIsCUVWRU5UX0ZJTEVXUklURVBPU1R9LAorICAgIHsiRmlsZVdyaXRlUHJlIiwJRVZFTlRfRklMRVdSSVRFUFJFfSwKKyAgICB7IkZpbGVXcml0ZUNtZCIsCUVWRU5UX0ZJTEVXUklURUNNRH0sCisgICAgeyJGaWx0ZXJSZWFkUG9zdCIsCUVWRU5UX0ZJTFRFUlJFQURQT1NUfSwKKyAgICB7IkZpbHRlclJlYWRQcmUiLAlFVkVOVF9GSUxURVJSRUFEUFJFfSwKKyAgICB7IkZpbHRlcldyaXRlUG9zdCIsCUVWRU5UX0ZJTFRFUldSSVRFUE9TVH0sCisgICAgeyJGaWx0ZXJXcml0ZVByZSIsCUVWRU5UX0ZJTFRFUldSSVRFUFJFfSwKKyAgICB7IkZvY3VzR2FpbmVkIiwJRVZFTlRfRk9DVVNHQUlORUR9LAorICAgIHsiRm9jdXNMb3N0IiwJRVZFTlRfRk9DVVNMT1NUfSwKKyAgICB7IkZ1bmNVbmRlZmluZWQiLAlFVkVOVF9GVU5DVU5ERUZJTkVEfSwKKyAgICB7IkdVSUVudGVyIiwJRVZFTlRfR1VJRU5URVJ9LAorICAgIHsiUmVtb3RlUmVwbHkiLAlFVkVOVF9SRU1PVEVSRVBMWX0sCisgICAgeyJTdGRpblJlYWRQb3N0IiwJRVZFTlRfU1RESU5SRUFEUE9TVH0sCisgICAgeyJTdGRpblJlYWRQcmUiLAlFVkVOVF9TVERJTlJFQURQUkV9LAorICAgIHsiU3ludGF4IiwJCUVWRU5UX1NZTlRBWH0sCisgICAgeyJUZXJtQ2hhbmdlZCIsCUVWRU5UX1RFUk1DSEFOR0VEfSwKKyAgICB7IlRlcm1SZXNwb25zZSIsCUVWRU5UX1RFUk1SRVNQT05TRX0sCisgICAgeyJVc2VyIiwJCUVWRU5UX1VTRVJ9LAorICAgIHsiVmltRW50ZXIiLAlFVkVOVF9WSU1FTlRFUn0sCisgICAgeyJWaW1MZWF2ZSIsCUVWRU5UX1ZJTUxFQVZFfSwKKyAgICB7IlZpbUxlYXZlUHJlIiwJRVZFTlRfVklNTEVBVkVQUkV9LAorICAgIHsiV2luRW50ZXIiLAlFVkVOVF9XSU5FTlRFUn0sCisgICAgeyJXaW5MZWF2ZSIsCUVWRU5UX1dJTkxFQVZFfSwKKyAgICB7TlVMTCwJCShFVkVOVF9UKTB9Cit9OworCitzdGF0aWMgQXV0b1BhdCAqZmlyc3RfYXV0b3BhdFtOVU1fRVZFTlRTXSA9Cit7CisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9OworCisvKgorICogc3RydWN0IHVzZWQgdG8ga2VlcCBzdGF0dXMgd2hpbGUgZXhlY3V0aW5nIGF1dG9jb21tYW5kcyBmb3IgYW4gZXZlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEF1dG9QYXRDbWQKK3sKKyAgICBBdXRvUGF0CSpjdXJwYXQ7CS8qIG5leHQgQXV0b1BhdCB0byBleGFtaW5lICovCisgICAgQXV0b0NtZAkqbmV4dGNtZDsJLyogbmV4dCBBdXRvQ21kIHRvIGV4ZWN1dGUgKi8KKyAgICBpbnQJCWdyb3VwOwkJLyogZ3JvdXAgYmVpbmcgdXNlZCAqLworICAgIGNoYXJfdQkqZm5hbWU7CQkvKiBmbmFtZSB0byBtYXRjaCB3aXRoICovCisgICAgY2hhcl91CSpzZm5hbWU7CS8qIHNmbmFtZSB0byBtYXRjaCB3aXRoICovCisgICAgY2hhcl91CSp0YWlsOwkJLyogdGFpbCBvZiBmbmFtZSAqLworICAgIEVWRU5UX1QJZXZlbnQ7CQkvKiBjdXJyZW50IGV2ZW50ICovCit9IEF1dG9QYXRDbWQ7CisKKy8qCisgKiBhdWdyb3VwcyBzdG9yZXMgYSBsaXN0IG9mIGF1dG9jbWQgZ3JvdXAgbmFtZXMuCisgKi8KK2dhcnJheV9UIGF1Z3JvdXBzID0gezAsIDAsIHNpemVvZihjaGFyX3UgKiksIDEwLCBOVUxMfTsKKyNkZWZpbmUgQVVHUk9VUF9OQU1FKGkpICgoKGNoYXJfdSAqKilhdWdyb3Vwcy5nYV9kYXRhKVtpXSkKKworLyoKKyAqIFRoZSBJRCBvZiB0aGUgY3VycmVudCBncm91cC4gIEdyb3VwIDAgaXMgdGhlIGRlZmF1bHQgb25lLgorICovCisjZGVmaW5lIEFVR1JPVVBfREVGQVVMVAkgICAgLTEJICAgIC8qIGRlZmF1bHQgYXV0b2NtZCBncm91cCAqLworI2RlZmluZSBBVUdST1VQX0VSUk9SCSAgICAtMgkgICAgLyogZXJyb3Jub3VzZSBhdXRvY21kIGdyb3VwICovCisjZGVmaW5lIEFVR1JPVVBfQUxMCSAgICAtMwkgICAgLyogYWxsIGF1dG9jbWQgZ3JvdXBzICovCitzdGF0aWMgaW50IGN1cnJlbnRfYXVncm91cCA9IEFVR1JPVVBfREVGQVVMVDsKKworc3RhdGljIGludCBhdV9uZWVkX2NsZWFuID0gRkFMU0U7ICAgLyogbmVlZCB0byBkZWxldGUgbWFya2VkIHBhdHRlcm5zICovCisKK3N0YXRpYyB2b2lkIHNob3dfYXV0b2NtZCBfX0FSR1MoKEF1dG9QYXQgKmFwLCBFVkVOVF9UIGV2ZW50KSk7CitzdGF0aWMgdm9pZCBhdV9yZW1vdmVfcGF0IF9fQVJHUygoQXV0b1BhdCAqYXApKTsKK3N0YXRpYyB2b2lkIGF1X3JlbW92ZV9jbWRzIF9fQVJHUygoQXV0b1BhdCAqYXApKTsKK3N0YXRpYyB2b2lkIGF1X2NsZWFudXAgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IGF1X25ld19ncm91cCBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworc3RhdGljIHZvaWQgYXVfZGVsX2dyb3VwIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgaW50IGF1X2ZpbmRfZ3JvdXAgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3N0YXRpYyBFVkVOVF9UIGV2ZW50X25hbWUybnIgX19BUkdTKChjaGFyX3UgKnN0YXJ0LCBjaGFyX3UgKiplbmQpKTsKK3N0YXRpYyBjaGFyX3UgKmV2ZW50X25yMm5hbWUgX19BUkdTKChFVkVOVF9UIGV2ZW50KSk7CitzdGF0aWMgY2hhcl91ICpmaW5kX2VuZF9ldmVudCBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgaGF2ZV9ncm91cCkpOworc3RhdGljIGludCBldmVudF9pZ25vcmVkIF9fQVJHUygoRVZFTlRfVCBldmVudCkpOworc3RhdGljIGludCBhdV9nZXRfZ3JvdXBhcmcgX19BUkdTKChjaGFyX3UgKiphcmdwKSk7CitzdGF0aWMgaW50IGRvX2F1dG9jbWRfZXZlbnQgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKnBhdCwgaW50IG5lc3RlZCwgY2hhcl91ICpjbWQsIGludCBmb3JjZWl0LCBpbnQgZ3JvdXApKTsKK3N0YXRpYyBjaGFyX3UgKmdldG5leHRhYyBfX0FSR1MoKGludCBjLCB2b2lkICpjb29raWUsIGludCBpbmRlbnQpKTsKK3N0YXRpYyBpbnQgYXBwbHlfYXV0b2NtZHNfZ3JvdXAgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmZuYW1lX2lvLCBpbnQgZm9yY2UsIGludCBncm91cCwgYnVmX1QgKmJ1ZiwgZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgdm9pZCBhdXRvX25leHRfcGF0IF9fQVJHUygoQXV0b1BhdENtZCAqYXBjLCBpbnQgc3RvcF9hdF9sYXN0KSk7CisKK3N0YXRpYyBFVkVOVF9UCWxhc3RfZXZlbnQ7CitzdGF0aWMgaW50CWxhc3RfZ3JvdXA7CisKKy8qCisgKiBTaG93IHRoZSBhdXRvY29tbWFuZHMgZm9yIG9uZSBBdXRvUGF0LgorICovCisgICAgc3RhdGljIHZvaWQKK3Nob3dfYXV0b2NtZChhcCwgZXZlbnQpCisgICAgQXV0b1BhdAkqYXA7CisgICAgRVZFTlRfVAlldmVudDsKK3sKKyAgICBBdXRvQ21kICphYzsKKworICAgIC8qIENoZWNrIGZvciAiZ290X2ludCIgKGhlcmUgYW5kIGF0IHZhcmlvdXMgcGxhY2VzIGJlbG93KSwgd2hpY2ggaXMgc2V0CisgICAgICogd2hlbiAicSIgaGFzIGJlZW4gaGl0IGZvciB0aGUgIi0tbW9yZS0tIiBwcm9tcHQgKi8KKyAgICBpZiAoZ290X2ludCkKKwlyZXR1cm47CisgICAgaWYgKGFwLT5wYXQgPT0gTlVMTCkJCS8qIHBhdHRlcm4gaGFzIGJlZW4gcmVtb3ZlZCAqLworCXJldHVybjsKKworICAgIG1zZ19wdXRjaGFyKCdcbicpOworICAgIGlmIChnb3RfaW50KQorCXJldHVybjsKKyAgICBpZiAoZXZlbnQgIT0gbGFzdF9ldmVudCB8fCBhcC0+Z3JvdXAgIT0gbGFzdF9ncm91cCkKKyAgICB7CisJaWYgKGFwLT5ncm91cCAhPSBBVUdST1VQX0RFRkFVTFQpCisJeworCSAgICBpZiAoQVVHUk9VUF9OQU1FKGFwLT5ncm91cCkgPT0gTlVMTCkKKwkJbXNnX3B1dHNfYXR0cigoY2hhcl91ICopXygiLS1EZWxldGVkLS0iKSwgaGxfYXR0cihITEZfRSkpOworCSAgICBlbHNlCisJCW1zZ19wdXRzX2F0dHIoQVVHUk9VUF9OQU1FKGFwLT5ncm91cCksIGhsX2F0dHIoSExGX1QpKTsKKwkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSIgICIpOworCX0KKwltc2dfcHV0c19hdHRyKGV2ZW50X25yMm5hbWUoZXZlbnQpLCBobF9hdHRyKEhMRl9UKSk7CisJbGFzdF9ldmVudCA9IGV2ZW50OworCWxhc3RfZ3JvdXAgPSBhcC0+Z3JvdXA7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJaWYgKGdvdF9pbnQpCisJICAgIHJldHVybjsKKyAgICB9CisgICAgbXNnX2NvbCA9IDQ7CisgICAgbXNnX291dHRyYW5zKGFwLT5wYXQpOworCisgICAgZm9yIChhYyA9IGFwLT5jbWRzOyBhYyAhPSBOVUxMOyBhYyA9IGFjLT5uZXh0KQorICAgIHsKKwlpZiAoYWMtPmNtZCAhPSBOVUxMKQkJLyogc2tpcCByZW1vdmVkIGNvbW1hbmRzICovCisJeworCSAgICBpZiAobXNnX2NvbCA+PSAxNCkKKwkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJICAgIG1zZ19jb2wgPSAxNDsKKwkgICAgaWYgKGdvdF9pbnQpCisJCXJldHVybjsKKwkgICAgbXNnX291dHRyYW5zKGFjLT5jbWQpOworCSAgICBpZiAoZ290X2ludCkKKwkJcmV0dXJuOworCSAgICBpZiAoYWMtPm5leHQgIT0gTlVMTCkKKwkgICAgeworCQltc2dfcHV0Y2hhcignXG4nKTsKKwkJaWYgKGdvdF9pbnQpCisJCSAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgorICogTWFyayBhbiBhdXRvY29tbWFuZCBwYXR0ZXJuIGZvciBkZWxldGlvbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCithdV9yZW1vdmVfcGF0KGFwKQorICAgIEF1dG9QYXQgKmFwOworeworICAgIHZpbV9mcmVlKGFwLT5wYXQpOworICAgIGFwLT5wYXQgPSBOVUxMOworICAgIGF1X25lZWRfY2xlYW4gPSBUUlVFOworfQorCisvKgorICogTWFyayBhbGwgY29tbWFuZHMgZm9yIGEgcGF0dGVybiBmb3IgZGVsZXRpb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYXVfcmVtb3ZlX2NtZHMoYXApCisgICAgQXV0b1BhdCAqYXA7Cit7CisgICAgQXV0b0NtZCAqYWM7CisKKyAgICBmb3IgKGFjID0gYXAtPmNtZHM7IGFjICE9IE5VTEw7IGFjID0gYWMtPm5leHQpCisgICAgeworCXZpbV9mcmVlKGFjLT5jbWQpOworCWFjLT5jbWQgPSBOVUxMOworICAgIH0KKyAgICBhdV9uZWVkX2NsZWFuID0gVFJVRTsKK30KKworLyoKKyAqIENsZWFudXAgYXV0b2NvbW1hbmRzIGFuZCBwYXR0ZXJucyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkLgorICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBub3QgZXhlY3V0aW5nIGF1dG9jb21tYW5kcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCithdV9jbGVhbnVwKCkKK3sKKyAgICBBdXRvUGF0CSphcCwgKipwcmV2X2FwOworICAgIEF1dG9DbWQJKmFjLCAqKnByZXZfYWM7CisgICAgRVZFTlRfVAlldmVudDsKKworICAgIGlmIChhdXRvY21kX2J1c3kgfHwgIWF1X25lZWRfY2xlYW4pCisJcmV0dXJuOworCisgICAgLyogbG9vcCBvdmVyIGFsbCBldmVudHMgKi8KKyAgICBmb3IgKGV2ZW50ID0gKEVWRU5UX1QpMDsgKGludClldmVudCA8IChpbnQpTlVNX0VWRU5UUzsKKwkJCQkJICAgIGV2ZW50ID0gKEVWRU5UX1QpKChpbnQpZXZlbnQgKyAxKSkKKyAgICB7CisJLyogbG9vcCBvdmVyIGFsbCBhdXRvY29tbWFuZCBwYXR0ZXJucyAqLworCXByZXZfYXAgPSAmKGZpcnN0X2F1dG9wYXRbKGludClldmVudF0pOworCWZvciAoYXAgPSAqcHJldl9hcDsgYXAgIT0gTlVMTDsgYXAgPSAqcHJldl9hcCkKKwl7CisJICAgIC8qIGxvb3Agb3ZlciBhbGwgY29tbWFuZHMgZm9yIHRoaXMgcGF0dGVybiAqLworCSAgICBwcmV2X2FjID0gJihhcC0+Y21kcyk7CisJICAgIGZvciAoYWMgPSAqcHJldl9hYzsgYWMgIT0gTlVMTDsgYWMgPSAqcHJldl9hYykKKwkgICAgeworCQkvKiByZW1vdmUgdGhlIGNvbW1hbmQgaWYgdGhlIHBhdHRlcm4gaXMgdG8gYmUgZGVsZXRlZCBvciB3aGVuCisJCSAqIHRoZSBjb21tYW5kIGhhcyBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24gKi8KKwkJaWYgKGFwLT5wYXQgPT0gTlVMTCB8fCBhYy0+Y21kID09IE5VTEwpCisJCXsKKwkJICAgICpwcmV2X2FjID0gYWMtPm5leHQ7CisJCSAgICB2aW1fZnJlZShhYy0+Y21kKTsKKwkJICAgIHZpbV9mcmVlKGFjKTsKKwkJfQorCQllbHNlCisJCSAgICBwcmV2X2FjID0gJihhYy0+bmV4dCk7CisJICAgIH0KKworCSAgICAvKiByZW1vdmUgdGhlIHBhdHRlcm4gaWYgaXQgaGFzIGJlZW4gbWFya2VkIGZvciBkZWxldGlvbiAqLworCSAgICBpZiAoYXAtPnBhdCA9PSBOVUxMKQorCSAgICB7CisJCSpwcmV2X2FwID0gYXAtPm5leHQ7CisJCXZpbV9mcmVlKGFwLT5yZWdfcGF0KTsKKwkJdmltX2ZyZWUoYXApOworCSAgICB9CisJICAgIGVsc2UKKwkJcHJldl9hcCA9ICYoYXAtPm5leHQpOworCX0KKyAgICB9CisKKyAgICBhdV9uZWVkX2NsZWFuID0gRkFMU0U7Cit9CisKKy8qCisgKiBBZGQgYW4gYXV0b2NtZCBncm91cCBuYW1lLgorICogUmV0dXJuIGl0J3MgSUQuICBSZXR1cm5zIEFVR1JPVVBfRVJST1IgKDwgMCkgZm9yIGVycm9yLgorICovCisgICAgc3RhdGljIGludAorYXVfbmV3X2dyb3VwKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKworICAgIGkgPSBhdV9maW5kX2dyb3VwKG5hbWUpOworICAgIGlmIChpID09IEFVR1JPVVBfRVJST1IpCS8qIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0IHlldCwgYWRkIGl0ICovCisgICAgeworCS8qIEZpcnN0IHRyeSB1c2luZyBhIGZyZWUgZW50cnkuICovCisJZm9yIChpID0gMDsgaSA8IGF1Z3JvdXBzLmdhX2xlbjsgKytpKQorCSAgICBpZiAoQVVHUk9VUF9OQU1FKGkpID09IE5VTEwpCisJCWJyZWFrOworCWlmIChpID09IGF1Z3JvdXBzLmdhX2xlbiAmJiBnYV9ncm93KCZhdWdyb3VwcywgMSkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEFVR1JPVVBfRVJST1I7CisKKwlBVUdST1VQX05BTUUoaSkgPSB2aW1fc3Ryc2F2ZShuYW1lKTsKKwlpZiAoQVVHUk9VUF9OQU1FKGkpID09IE5VTEwpCisJICAgIHJldHVybiBBVUdST1VQX0VSUk9SOworCWlmIChpID09IGF1Z3JvdXBzLmdhX2xlbikKKwl7CisJICAgICsrYXVncm91cHMuZ2FfbGVuOworCSAgICAtLWF1Z3JvdXBzLmdhX3Jvb207CisJfQorICAgIH0KKworICAgIHJldHVybiBpOworfQorCisgICAgc3RhdGljIHZvaWQKK2F1X2RlbF9ncm91cChuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBpID0gYXVfZmluZF9ncm91cChuYW1lKTsKKyAgICBpZiAoaSA9PSBBVUdST1VQX0VSUk9SKQkvKiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdCAqLworCUVNU0cyKF8oIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIpLCBuYW1lKTsKKyAgICBlbHNlCisgICAgeworCXZpbV9mcmVlKEFVR1JPVVBfTkFNRShpKSk7CisJQVVHUk9VUF9OQU1FKGkpID0gTlVMTDsKKyAgICB9Cit9CisKKy8qCisgKiBGaW5kIHRoZSBJRCBvZiBhbiBhdXRvY21kIGdyb3VwIG5hbWUuCisgKiBSZXR1cm4gaXQncyBJRC4gIFJldHVybnMgQVVHUk9VUF9FUlJPUiAoPCAwKSBmb3IgZXJyb3IuCisgKi8KKyAgICBzdGF0aWMgaW50CithdV9maW5kX2dyb3VwKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdWdyb3Vwcy5nYV9sZW47ICsraSkKKwlpZiAoQVVHUk9VUF9OQU1FKGkpICE9IE5VTEwgJiYgU1RSQ01QKEFVR1JPVVBfTkFNRShpKSwgbmFtZSkgPT0gMCkKKwkgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIEFVR1JPVVBfRVJST1I7Cit9CisKKy8qCisgKiAiOmF1Z3JvdXAge25hbWV9Ii4KKyAqLworICAgIHZvaWQKK2RvX2F1Z3JvdXAoYXJnLCBkZWxfZ3JvdXApCisgICAgY2hhcl91CSphcmc7CisgICAgaW50CQlkZWxfZ3JvdXA7Cit7CisgICAgaW50CSAgICBpOworCisgICAgaWYgKGRlbF9ncm91cCkKKyAgICB7CisJaWYgKCphcmcgPT0gTlVMKQorCSAgICBFTVNHKF8oZV9hcmdyZXEpKTsKKwllbHNlCisJICAgIGF1X2RlbF9ncm91cChhcmcpOworICAgIH0KKyAgICBlbHNlIGlmIChTVFJJQ01QKGFyZywgImVuZCIpID09IDApICAgLyogIjphdWcgZW5kIjogYmFjayB0byBncm91cCAwICovCisJY3VycmVudF9hdWdyb3VwID0gQVVHUk9VUF9ERUZBVUxUOworICAgIGVsc2UgaWYgKCphcmcpCQkgICAgLyogIjphdWcgeHh4Ijogc3dpdGNoIHRvIGdyb3VwIHh4eCAqLworICAgIHsKKwlpID0gYXVfbmV3X2dyb3VwKGFyZyk7CisJaWYgKGkgIT0gQVVHUk9VUF9FUlJPUikKKwkgICAgY3VycmVudF9hdWdyb3VwID0gaTsKKyAgICB9CisgICAgZWxzZQkJCSAgICAvKiAiOmF1ZyI6IGxpc3QgdGhlIGdyb3VwIG5hbWVzICovCisgICAgeworCW1zZ19zdGFydCgpOworCWZvciAoaSA9IDA7IGkgPCBhdWdyb3Vwcy5nYV9sZW47ICsraSkKKwl7CisJICAgIGlmIChBVUdST1VQX05BTUUoaSkgIT0gTlVMTCkKKwkgICAgeworCQltc2dfcHV0cyhBVUdST1VQX05BTUUoaSkpOworCQltc2dfcHV0cygoY2hhcl91ICopIiAgIik7CisJICAgIH0KKwl9CisJbXNnX2Nscl9lb3MoKTsKKwltc2dfZW5kKCk7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIHRoZSBldmVudCBudW1iZXIgZm9yIGV2ZW50IG5hbWUgInN0YXJ0Ii4KKyAqIFJldHVybiBOVU1fRVZFTlRTIGlmIHRoZSBldmVudCBuYW1lIHdhcyBub3QgZm91bmQuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGV2ZW50IG5hbWUgaW4gImVuZCIuCisgKi8KKyAgICBzdGF0aWMgRVZFTlRfVAorZXZlbnRfbmFtZTJucihzdGFydCwgZW5kKQorICAgIGNoYXJfdSAgKnN0YXJ0OworICAgIGNoYXJfdSAgKiplbmQ7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJaTsKKyAgICBpbnQJCWxlbjsKKworICAgIC8qIHRoZSBldmVudCBuYW1lIGVuZHMgd2l0aCBlbmQgb2YgbGluZSwgYSBibGFuayBvciBhIGNvbW1hICovCisgICAgZm9yIChwID0gc3RhcnQ7ICpwICYmICF2aW1faXN3aGl0ZSgqcCkgJiYgKnAgIT0gJywnOyArK3ApCisJOworICAgIGZvciAoaSA9IDA7IGV2ZW50X25hbWVzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgIHsKKwlsZW4gPSAoaW50KVNUUkxFTihldmVudF9uYW1lc1tpXS5uYW1lKTsKKwlpZiAobGVuID09IHAgLSBzdGFydCAmJiBTVFJOSUNNUChldmVudF9uYW1lc1tpXS5uYW1lLCBzdGFydCwgbGVuKSA9PSAwKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCpwID09ICcsJykKKwkrK3A7CisgICAgKmVuZCA9IHA7CisgICAgaWYgKGV2ZW50X25hbWVzW2ldLm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gTlVNX0VWRU5UUzsKKyAgICByZXR1cm4gZXZlbnRfbmFtZXNbaV0uZXZlbnQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIGV2ZW50ICJldmVudCIuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2V2ZW50X25yMm5hbWUoZXZlbnQpCisgICAgRVZFTlRfVAlldmVudDsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBldmVudF9uYW1lc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKKwlpZiAoZXZlbnRfbmFtZXNbaV0uZXZlbnQgPT0gZXZlbnQpCisJICAgIHJldHVybiAoY2hhcl91ICopZXZlbnRfbmFtZXNbaV0ubmFtZTsKKyAgICByZXR1cm4gKGNoYXJfdSAqKSJVbmtub3duIjsKK30KKworLyoKKyAqIFNjYW4gb3ZlciB0aGUgZXZlbnRzLiAgIioiIHN0YW5kcyBmb3IgYWxsIGV2ZW50cy4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZmluZF9lbmRfZXZlbnQoYXJnLCBoYXZlX2dyb3VwKQorICAgIGNoYXJfdSAgKmFyZzsKKyAgICBpbnQJICAgIGhhdmVfZ3JvdXA7CSAgICAvKiBUUlVFIHdoZW4gZ3JvdXAgbmFtZSB3YXMgZm91bmQgKi8KK3sKKyAgICBjaGFyX3UgICpwYXQ7CisgICAgY2hhcl91ICAqcDsKKworICAgIGlmICgqYXJnID09ICcqJykKKyAgICB7CisJaWYgKGFyZ1sxXSAmJiAhdmltX2lzd2hpdGUoYXJnWzFdKSkKKwl7CisJICAgIEVNU0cyKF8oIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIiksIGFyZyk7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlwYXQgPSBhcmcgKyAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWZvciAocGF0ID0gYXJnOyAqcGF0ICYmICF2aW1faXN3aGl0ZSgqcGF0KTsgcGF0ID0gcCkKKwl7CisJICAgIGlmICgoaW50KWV2ZW50X25hbWUybnIocGF0LCAmcCkgPj0gKGludClOVU1fRVZFTlRTKQorCSAgICB7CisJCWlmIChoYXZlX2dyb3VwKQorCQkgICAgRU1TRzIoXygiRTIxNjogTm8gc3VjaCBldmVudDogJXMiKSwgcGF0KTsKKwkJZWxzZQorCQkgICAgRU1TRzIoXygiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiKSwgcGF0KTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiBwYXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiZXZlbnQiIGlzIGluY2x1ZGVkIGluICdldmVudGlnbm9yZScuCisgKi8KKyAgICBzdGF0aWMgaW50CitldmVudF9pZ25vcmVkKGV2ZW50KQorICAgIEVWRU5UX1QJZXZlbnQ7Cit7CisgICAgY2hhcl91CSpwID0gcF9laTsKKworICAgIGlmIChTVFJJQ01QKHBfZWksICJhbGwiKSA9PSAwKQorCXJldHVybiBUUlVFOworCisgICAgd2hpbGUgKCpwKQorCWlmIChldmVudF9uYW1lMm5yKHAsICZwKSA9PSBldmVudCkKKwkgICAgcmV0dXJuIFRSVUU7CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBSZXR1cm4gT0sgd2hlbiB0aGUgY29udGVudHMgb2YgcF9laSBpcyB2YWxpZCwgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2NoZWNrX2VpKCkKK3sKKyAgICBjaGFyX3UJKnAgPSBwX2VpOworCisgICAgaWYgKFNUUklDTVAocF9laSwgImFsbCIpID09IDApCisJcmV0dXJuIE9LOworCisgICAgd2hpbGUgKCpwKQorCWlmIChldmVudF9uYW1lMm5yKHAsICZwKSA9PSBOVU1fRVZFTlRTKQorCSAgICByZXR1cm4gRkFJTDsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGRvX2F1dG9jbWQoKSAtLSBpbXBsZW1lbnRzIHRoZSA6YXV0b2NtZCBjb21tYW5kLiAgQ2FuIGJlIHVzZWQgaW4gdGhlCisgKiAgZm9sbG93aW5nIHdheXM6CisgKgorICogOmF1dG9jbWQgPGV2ZW50PiA8cGF0PiA8Y21kPgkgICAgQWRkIDxjbWQ+IHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRoYXQKKyAqCQkJCSAgICB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZWQgZm9yIDxldmVudD4KKyAqCQkJCSAgICB3aGVuIGVkaXRpbmcgYSBmaWxlIG1hdGNoaW5nIDxwYXQ+LCBpbgorICoJCQkJICAgIHRoZSBjdXJyZW50IGdyb3VwLgorICogOmF1dG9jbWQgPGV2ZW50PiA8cGF0PgkgICAgU2hvdyB0aGUgYXV0by1jb21tYW5kcyBhc3NvY2lhdGVkIHdpdGgKKyAqCQkJCSAgICA8ZXZlbnQ+IGFuZCA8cGF0Pi4KKyAqIDphdXRvY21kIDxldmVudD4JCSAgICBTaG93IHRoZSBhdXRvLWNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aAorICoJCQkJICAgIDxldmVudD4uCisgKiA6YXV0b2NtZAkJCSAgICBTaG93IGFsbCBhdXRvLWNvbW1hbmRzLgorICogOmF1dG9jbWQhIDxldmVudD4gPHBhdD4gPGNtZD4gICAgUmVtb3ZlIGFsbCBhdXRvLWNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aAorICoJCQkJICAgIDxldmVudD4gYW5kIDxwYXQ+LCBhbmQgYWRkIHRoZSBjb21tYW5kCisgKgkJCQkgICAgPGNtZD4sIGZvciB0aGUgY3VycmVudCBncm91cC4KKyAqIDphdXRvY21kISA8ZXZlbnQ+IDxwYXQ+CSAgICBSZW1vdmUgYWxsIGF1dG8tY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoCisgKgkJCQkgICAgPGV2ZW50PiBhbmQgPHBhdD4gZm9yIHRoZSBjdXJyZW50IGdyb3VwLgorICogOmF1dG9jbWQhIDxldmVudD4JCSAgICBSZW1vdmUgYWxsIGF1dG8tY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoCisgKgkJCQkgICAgPGV2ZW50PiBmb3IgdGhlIGN1cnJlbnQgZ3JvdXAuCisgKiA6YXV0b2NtZCEJCQkgICAgUmVtb3ZlIEFMTCBhdXRvLWNvbW1hbmRzIGZvciB0aGUgY3VycmVudAorICoJCQkJICAgIGdyb3VwLgorICoKKyAqICBNdWx0aXBsZSBldmVudHMgYW5kIHBhdHRlcm5zIG1heSBiZSBnaXZlbiBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSGVyZSBhcmUKKyAqICBzb21lIGV4YW1wbGVzOgorICogOmF1dG9jbWQgYnVmcmVhZCxidWZlbnRlciAqLmMsKi5oCXNldCB0dz0wIHNtYXJ0aW5kZW50IG5vaWMKKyAqIDphdXRvY21kIGJ1ZmxlYXZlCSAgICAgKgkJc2V0IHR3PTc5IG5vc21hcnRpbmRlbnQgaWMgaW5mZXJjYXNlCisgKgorICogOmF1dG9jbWQgKiAqLmMJCXNob3cgYWxsIGF1dG9jb21tYW5kcyBmb3IgKi5jIGZpbGVzLgorICovCisgICAgdm9pZAorZG9fYXV0b2NtZChhcmcsIGZvcmNlaXQpCisgICAgY2hhcl91ICAqYXJnOworICAgIGludAkgICAgZm9yY2VpdDsKK3sKKyAgICBjaGFyX3UJKnBhdDsKKyAgICBjaGFyX3UJKmVudnBhdCA9IE5VTEw7CisgICAgY2hhcl91CSpjbWQ7CisgICAgRVZFTlRfVAlldmVudDsKKyAgICBpbnQJCW5lZWRfZnJlZSA9IEZBTFNFOworICAgIGludAkJbmVzdGVkID0gRkFMU0U7CisgICAgaW50CQlncm91cDsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGEgbGVnYWwgZ3JvdXAgbmFtZS4gIElmIG5vdCwgdXNlIEFVR1JPVVBfQUxMLgorICAgICAqLworICAgIGdyb3VwID0gYXVfZ2V0X2dyb3VwYXJnKCZhcmcpOworICAgIGlmIChhcmcgPT0gTlVMTCkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIFNjYW4gb3ZlciB0aGUgZXZlbnRzLgorICAgICAqIElmIHdlIGZpbmQgYW4gaWxsZWdhbCBuYW1lLCByZXR1cm4gaGVyZSwgZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICovCisgICAgcGF0ID0gZmluZF9lbmRfZXZlbnQoYXJnLCBncm91cCAhPSBBVUdST1VQX0FMTCk7CisgICAgaWYgKHBhdCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogU2NhbiBvdmVyIHRoZSBwYXR0ZXJuLiAgUHV0IGEgTlVMIGF0IHRoZSBlbmQuCisgICAgICovCisgICAgcGF0ID0gc2tpcHdoaXRlKHBhdCk7CisgICAgY21kID0gcGF0OworICAgIHdoaWxlICgqY21kICYmICghdmltX2lzd2hpdGUoKmNtZCkgfHwgY21kWy0xXSA9PSAnXFwnKSkKKwljbWQrKzsKKyAgICBpZiAoKmNtZCkKKwkqY21kKysgPSBOVUw7CisKKyAgICAvKiBFeHBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHRoZSBwYXR0ZXJuLiAgU2V0ICdzaGVsbHNsYXNoJywgd2Ugd2FudAorICAgICAqIGZvcndhcmQgc2xhc2hlcyBoZXJlLiAqLworICAgIGlmICh2aW1fc3RyY2hyKHBhdCwgJyQnKSAhPSBOVUxMIHx8IHZpbV9zdHJjaHIocGF0LCAnficpICE9IE5VTEwpCisgICAgeworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCWludAlwX3NzbF9zYXZlID0gcF9zc2w7CisKKwlwX3NzbCA9IFRSVUU7CisjZW5kaWYKKwllbnZwYXQgPSBleHBhbmRfZW52X3NhdmUocGF0KTsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwlwX3NzbCA9IHBfc3NsX3NhdmU7CisjZW5kaWYKKwlpZiAoZW52cGF0ICE9IE5VTEwpCisJICAgIHBhdCA9IGVudnBhdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciAibmVzdGVkIiBmbGFnLgorICAgICAqLworICAgIGNtZCA9IHNraXB3aGl0ZShjbWQpOworICAgIGlmICgqY21kICE9IE5VTCAmJiBTVFJOQ01QKGNtZCwgIm5lc3RlZCIsIDYpID09IDAgJiYgdmltX2lzd2hpdGUoY21kWzZdKSkKKyAgICB7CisJbmVzdGVkID0gVFJVRTsKKwljbWQgPSBza2lwd2hpdGUoY21kICsgNik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBzdGFydCBvZiB0aGUgY29tbWFuZHMuCisgICAgICogRXhwYW5kIDxzZmlsZT4gaW4gaXQuCisgICAgICovCisgICAgaWYgKCpjbWQgIT0gTlVMKQorICAgIHsKKwljbWQgPSBleHBhbmRfc2ZpbGUoY21kKTsKKwlpZiAoY21kID09IE5VTEwpCSAgICAvKiBzb21lIGVycm9yICovCisJICAgIHJldHVybjsKKwluZWVkX2ZyZWUgPSBUUlVFOworICAgIH0KKworICAgIC8qCisgICAgICogUHJpbnQgaGVhZGVyIHdoZW4gc2hvd2luZyBhdXRvY29tbWFuZHMuCisgICAgICovCisgICAgaWYgKCFmb3JjZWl0ICYmICpjbWQgPT0gTlVMKQorICAgIHsKKwkvKiBIaWdobGlnaHQgdGl0bGUgKi8KKwlNU0dfUFVUU19USVRMRShfKCJcbi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExvb3Agb3ZlciB0aGUgZXZlbnRzLgorICAgICAqLworICAgIGxhc3RfZXZlbnQgPSAoRVZFTlRfVCktMTsJCS8qIGZvciBsaXN0aW5nIHRoZSBldmVudCBuYW1lICovCisgICAgbGFzdF9ncm91cCA9IEFVR1JPVVBfRVJST1I7CQkvKiBmb3IgbGlzdGluZyB0aGUgZ3JvdXAgbmFtZSAqLworICAgIGlmICgqYXJnID09ICcqJyB8fCAqYXJnID09IE5VTCkKKyAgICB7CisJZm9yIChldmVudCA9IChFVkVOVF9UKTA7IChpbnQpZXZlbnQgPCAoaW50KU5VTV9FVkVOVFM7CisJCQkJCSAgICBldmVudCA9IChFVkVOVF9UKSgoaW50KWV2ZW50ICsgMSkpCisJICAgIGlmIChkb19hdXRvY21kX2V2ZW50KGV2ZW50LCBwYXQsCisJCQkJCSBuZXN0ZWQsIGNtZCwgZm9yY2VpdCwgZ3JvdXApID09IEZBSUwpCisJCWJyZWFrOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXdoaWxlICgqYXJnICYmICF2aW1faXN3aGl0ZSgqYXJnKSkKKwkgICAgaWYgKGRvX2F1dG9jbWRfZXZlbnQoZXZlbnRfbmFtZTJucihhcmcsICZhcmcpLCBwYXQsCisJCQkJCW5lc3RlZCwJY21kLCBmb3JjZWl0LCBncm91cCkgPT0gRkFJTCkKKwkJYnJlYWs7CisgICAgfQorCisgICAgaWYgKG5lZWRfZnJlZSkKKwl2aW1fZnJlZShjbWQpOworICAgIHZpbV9mcmVlKGVudnBhdCk7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBncm91cCBJRCBpbiBhICI6YXV0b2NtZCIgb3IgIjpkb2F1dG9jbWQiIGFyZ3VtZW50LgorICogVGhlICJhcmdwIiBhcmd1bWVudCBpcyBhZHZhbmNlZCB0byB0aGUgZm9sbG93aW5nIGFyZ3VtZW50LgorICoKKyAqIFJldHVybnMgdGhlIGdyb3VwIElELCBBVUdST1VQX0VSUk9SIGZvciBlcnJvciAob3V0IG9mIG1lbW9yeSkuCisgKi8KKyAgICBzdGF0aWMgaW50CithdV9nZXRfZ3JvdXBhcmcoYXJncCkKKyAgICBjaGFyX3UJKiphcmdwOworeworICAgIGNoYXJfdQkqZ3JvdXBfbmFtZTsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSphcmcgPSAqYXJncDsKKyAgICBpbnQJCWdyb3VwID0gQVVHUk9VUF9BTEw7CisKKyAgICBwID0gc2tpcHRvd2hpdGUoYXJnKTsKKyAgICBpZiAocCA+IGFyZykKKyAgICB7CisJZ3JvdXBfbmFtZSA9IHZpbV9zdHJuc2F2ZShhcmcsIChpbnQpKHAgLSBhcmcpKTsKKwlpZiAoZ3JvdXBfbmFtZSA9PSBOVUxMKQkJLyogb3V0IG9mIG1lbW9yeSAqLworCSAgICByZXR1cm4gQVVHUk9VUF9FUlJPUjsKKwlncm91cCA9IGF1X2ZpbmRfZ3JvdXAoZ3JvdXBfbmFtZSk7CisJaWYgKGdyb3VwID09IEFVR1JPVVBfRVJST1IpCisJICAgIGdyb3VwID0gQVVHUk9VUF9BTEw7CS8qIG5vIG1hdGNoLCB1c2UgYWxsIGdyb3VwcyAqLworCWVsc2UKKwkgICAgKmFyZ3AgPSBza2lwd2hpdGUocCk7CS8qIG1hdGNoLCBza2lwIG92ZXIgZ3JvdXAgbmFtZSAqLworCXZpbV9mcmVlKGdyb3VwX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7Cit9CisKKy8qCisgKiBkb19hdXRvY21kKCkgZm9yIG9uZSBldmVudC4KKyAqIElmICpwYXQgPT0gTlVMIGRvIGZvciBhbGwgcGF0dGVybnMuCisgKiBJZiAqY21kID09IE5VTCBzaG93IGVudHJpZXMuCisgKiBJZiBmb3JjZWl0ID09IFRSVUUgZGVsZXRlIGVudHJpZXMuCisgKiBJZiBncm91cCBpcyBub3QgQVVHUk9VUF9BTEwsIG9ubHkgdXNlIHRoaXMgZ3JvdXAuCisgKi8KKyAgICBzdGF0aWMgaW50Citkb19hdXRvY21kX2V2ZW50KGV2ZW50LCBwYXQsIG5lc3RlZCwgY21kLCBmb3JjZWl0LCBncm91cCkKKyAgICBFVkVOVF9UCWV2ZW50OworICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJbmVzdGVkOworICAgIGNoYXJfdQkqY21kOworICAgIGludAkJZm9yY2VpdDsKKyAgICBpbnQJCWdyb3VwOworeworICAgIEF1dG9QYXQJKmFwOworICAgIEF1dG9QYXQJKipwcmV2X2FwOworICAgIEF1dG9DbWQJKmFjOworICAgIEF1dG9DbWQJKipwcmV2X2FjOworICAgIGludAkJYnJhY2VfbGV2ZWw7CisgICAgY2hhcl91CSplbmRwYXQ7CisgICAgaW50CQlmaW5kZ3JvdXA7CisgICAgaW50CQlhbGxncm91cHM7CisgICAgaW50CQlwYXRsZW47CisKKyAgICBpZiAoZ3JvdXAgPT0gQVVHUk9VUF9BTEwpCisJZmluZGdyb3VwID0gY3VycmVudF9hdWdyb3VwOworICAgIGVsc2UKKwlmaW5kZ3JvdXAgPSBncm91cDsKKyAgICBhbGxncm91cHMgPSAoZ3JvdXAgPT0gQVVHUk9VUF9BTEwgJiYgIWZvcmNlaXQgJiYgKmNtZCA9PSBOVUwpOworCisgICAgLyoKKyAgICAgKiBTaG93IG9yIGRlbGV0ZSBhbGwgcGF0dGVybnMgZm9yIGFuIGV2ZW50LgorICAgICAqLworICAgIGlmICgqcGF0ID09IE5VTCkKKyAgICB7CisJZm9yIChhcCA9IGZpcnN0X2F1dG9wYXRbKGludClldmVudF07IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJeworCSAgICBpZiAoZm9yY2VpdCkgIC8qIGRlbGV0ZSB0aGUgQXV0b1BhdCwgaWYgaXQncyBpbiB0aGUgY3VycmVudCBncm91cCAqLworCSAgICB7CisJCWlmIChhcC0+Z3JvdXAgPT0gZmluZGdyb3VwKQorCQkgICAgYXVfcmVtb3ZlX3BhdChhcCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZ3JvdXAgPT0gQVVHUk9VUF9BTEwgfHwgYXAtPmdyb3VwID09IGdyb3VwKQorCQlzaG93X2F1dG9jbWQoYXAsIGV2ZW50KTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBzcGVjaWZpZWQgcGF0dGVybnMuCisgICAgICovCisgICAgZm9yICggOyAqcGF0OyBwYXQgPSAoKmVuZHBhdCA9PSAnLCcgPyBlbmRwYXQgKyAxIDogZW5kcGF0KSkKKyAgICB7CisJLyoKKwkgKiBGaW5kIGVuZCBvZiB0aGUgcGF0dGVybi4KKwkgKiBXYXRjaCBvdXQgZm9yIGEgY29tbWEgaW4gYnJhY2VzLCBsaWtlICIqLlx7b2JqLG9cfSIuCisJICovCisJYnJhY2VfbGV2ZWwgPSAwOworCWZvciAoZW5kcGF0ID0gcGF0OyAqZW5kcGF0ICYmICgqZW5kcGF0ICE9ICcsJyB8fCBicmFjZV9sZXZlbAorCQkJCQkgICAgIHx8IGVuZHBhdFstMV0gPT0gJ1xcJyk7ICsrZW5kcGF0KQorCXsKKwkgICAgaWYgKCplbmRwYXQgPT0gJ3snKQorCQlicmFjZV9sZXZlbCsrOworCSAgICBlbHNlIGlmICgqZW5kcGF0ID09ICd9JykKKwkJYnJhY2VfbGV2ZWwtLTsKKwl9CisJaWYgKHBhdCA9PSBlbmRwYXQpCQkvKiBpZ25vcmUgc2luZ2xlIGNvbW1hICovCisJICAgIGNvbnRpbnVlOworCXBhdGxlbiA9IChpbnQpKGVuZHBhdCAtIHBhdCk7CisKKwkvKgorCSAqIEZpbmQgQXV0b1BhdCBlbnRyaWVzIHdpdGggdGhpcyBwYXR0ZXJuLgorCSAqLworCXByZXZfYXAgPSAmZmlyc3RfYXV0b3BhdFsoaW50KWV2ZW50XTsKKwl3aGlsZSAoKGFwID0gKnByZXZfYXApICE9IE5VTEwpCisJeworCSAgICBpZiAoYXAtPnBhdCAhPSBOVUxMKQorCSAgICB7CisJCS8qIEFjY2VwdCBhIHBhdHRlcm4gd2hlbjoKKwkJICogLSBhIGdyb3VwIHdhcyBzcGVjaWZpZWQgYW5kIGl0J3MgdGhhdCBncm91cCwgb3IgYSBncm91cCB3YXMKKwkJICogICBub3Qgc3BlY2lmaWVkIGFuZCBpdCdzIHRoZSBjdXJyZW50IGdyb3VwLCBvciBhIGdyb3VwIHdhcworCQkgKiAgIG5vdCBzcGVjaWZpZWQgYW5kIHdlIGFyZSBsaXN0aW5nCisJCSAqIC0gdGhlIGxlbmd0aCBvZiB0aGUgcGF0dGVybiBtYXRjaGVzCisJCSAqIC0gdGhlIHBhdHRlcm4gbWF0Y2hlcworCQkgKi8KKwkJaWYgKChhbGxncm91cHMgfHwgYXAtPmdyb3VwID09IGZpbmRncm91cCkKKwkJCSYmIGFwLT5wYXRsZW4gPT0gcGF0bGVuCisJCQkmJiBTVFJOQ01QKHBhdCwgYXAtPnBhdCwgcGF0bGVuKSA9PSAwKQorCQl7CisJCSAgICAvKgorCQkgICAgICogUmVtb3ZlIGV4aXN0aW5nIGF1dG9jb21tYW5kcy4KKwkJICAgICAqIElmIGFkZGluZyBhbnkgbmV3IGF1dG9jbWQncyBmb3IgdGhpcyBBdXRvUGF0LCBkb24ndAorCQkgICAgICogZGVsZXRlIHRoZSBwYXR0ZXJuIGZyb20gdGhlIGF1dG9wYXQgbGlzdCwgYXBwZW5kIHRvCisJCSAgICAgKiB0aGlzIGxpc3QuCisJCSAgICAgKi8KKwkJICAgIGlmIChmb3JjZWl0KQorCQkgICAgeworCQkJaWYgKCpjbWQgIT0gTlVMICYmIGFwLT5uZXh0ID09IE5VTEwpCisJCQl7CisJCQkgICAgYXVfcmVtb3ZlX2NtZHMoYXApOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJYXVfcmVtb3ZlX3BhdChhcCk7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBTaG93IGF1dG9jbWQncyBmb3IgdGhpcyBhdXRvcGF0CisJCSAgICAgKi8KKwkJICAgIGVsc2UgaWYgKCpjbWQgPT0gTlVMKQorCQkJc2hvd19hdXRvY21kKGFwLCBldmVudCk7CisKKwkJICAgIC8qCisJCSAgICAgKiBBZGQgYXV0b2NtZCB0byB0aGlzIGF1dG9wYXQsIGlmIGl0J3MgdGhlIGxhc3Qgb25lLgorCQkgICAgICovCisJCSAgICBlbHNlIGlmIChhcC0+bmV4dCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBwcmV2X2FwID0gJmFwLT5uZXh0OworCX0KKworCS8qCisJICogQWRkIGEgbmV3IGNvbW1hbmQuCisJICovCisJaWYgKCpjbWQgIT0gTlVMKQorCXsKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIHBhdHRlcm4gd2Ugd2FudCB0byBhZGQgYSBjb21tYW5kIHRvIGRvZXMgYXBwZWFyIGF0IHRoZQorCSAgICAgKiBlbmQgb2YgdGhlIGxpc3QgKG9yIG5vdCBpcyBub3QgaW4gdGhlIGxpc3QgYXQgYWxsKSwgYWRkIHRoZQorCSAgICAgKiBwYXR0ZXJuIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisJICAgICAqLworCSAgICBpZiAoYXAgPT0gTlVMTCkKKwkgICAgeworCQlhcCA9IChBdXRvUGF0ICopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihBdXRvUGF0KSk7CisJCWlmIChhcCA9PSBOVUxMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJCWFwLT5wYXQgPSB2aW1fc3RybnNhdmUocGF0LCBwYXRsZW4pOworCQlhcC0+cGF0bGVuID0gcGF0bGVuOworCQlpZiAoYXAtPnBhdCA9PSBOVUxMKQorCQl7CisJCSAgICB2aW1fZnJlZShhcCk7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCQlhcC0+cmVnX3BhdCA9IGZpbGVfcGF0X3RvX3JlZ19wYXQocGF0LCBlbmRwYXQsCisJCQkJCQkgICAgICAgJmFwLT5hbGxvd19kaXJzLCBUUlVFKTsKKwkJaWYgKGFwLT5yZWdfcGF0ID09IE5VTEwpCisJCXsKKwkJICAgIHZpbV9mcmVlKGFwLT5wYXQpOworCQkgICAgdmltX2ZyZWUoYXApOworCQkgICAgcmV0dXJuIEZBSUw7CisJCX0KKwkJYXAtPmNtZHMgPSBOVUxMOworCQkqcHJldl9hcCA9IGFwOworCQlhcC0+bmV4dCA9IE5VTEw7CisJCWlmIChncm91cCA9PSBBVUdST1VQX0FMTCkKKwkJICAgIGFwLT5ncm91cCA9IGN1cnJlbnRfYXVncm91cDsKKwkJZWxzZQorCQkgICAgYXAtPmdyb3VwID0gZ3JvdXA7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBBZGQgdGhlIGF1dG9jbWQgYXQgdGhlIGVuZCBvZiB0aGUgQXV0b0NtZCBsaXN0LgorCSAgICAgKi8KKwkgICAgcHJldl9hYyA9ICYoYXAtPmNtZHMpOworCSAgICB3aGlsZSAoKGFjID0gKnByZXZfYWMpICE9IE5VTEwpCisJCXByZXZfYWMgPSAmYWMtPm5leHQ7CisJICAgIGFjID0gKEF1dG9DbWQgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKEF1dG9DbWQpKTsKKwkgICAgaWYgKGFjID09IE5VTEwpCisJCXJldHVybiBGQUlMOworCSAgICBhYy0+Y21kID0gdmltX3N0cnNhdmUoY21kKTsKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgYWMtPnNjcmlwdElEID0gY3VycmVudF9TSUQ7CisjZW5kaWYKKwkgICAgaWYgKGFjLT5jbWQgPT0gTlVMTCkKKwkgICAgeworCQl2aW1fZnJlZShhYyk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGFjLT5uZXh0ID0gTlVMTDsKKwkgICAgKnByZXZfYWMgPSBhYzsKKwkgICAgYWMtPm5lc3RlZCA9IG5lc3RlZDsKKwl9CisgICAgfQorCisgICAgYXVfY2xlYW51cCgpOwkvKiBtYXkgcmVhbGx5IGRlbGV0ZSByZW1vdmVkIHBhdHRlcm5zL2NvbW1hbmRzIG5vdyAqLworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mICI6ZG9hdXRvY21kIFtncm91cF0gZXZlbnQgW2ZuYW1lXSIuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmU7CisgKi8KKyAgICBpbnQKK2RvX2RvYXV0b2NtZChhcmcsIGRvX21zZykKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCWRvX21zZzsJICAgIC8qIGdpdmUgbWVzc2FnZSBmb3Igbm8gbWF0Y2hpbmcgYXV0b2NtZHM/ICovCit7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCW5vdGhpbmdfZG9uZSA9IFRSVUU7CisgICAgaW50CQlncm91cDsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGEgbGVnYWwgZ3JvdXAgbmFtZS4gIElmIG5vdCwgdXNlIEFVR1JPVVBfQUxMLgorICAgICAqLworICAgIGdyb3VwID0gYXVfZ2V0X2dyb3VwYXJnKCZhcmcpOworICAgIGlmIChhcmcgPT0gTlVMTCkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwlyZXR1cm4gRkFJTDsKKworICAgIGlmICgqYXJnID09ICcqJykKKyAgICB7CisJRU1TRyhfKCJFMjE3OiBDYW4ndCBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgQUxMIGV2ZW50cyIpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNjYW4gb3ZlciB0aGUgZXZlbnRzLgorICAgICAqIElmIHdlIGZpbmQgYW4gaWxsZWdhbCBuYW1lLCByZXR1cm4gaGVyZSwgZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICovCisgICAgZm5hbWUgPSBmaW5kX2VuZF9ldmVudChhcmcsIGdyb3VwICE9IEFVR1JPVVBfQUxMKTsKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZuYW1lID0gc2tpcHdoaXRlKGZuYW1lKTsKKworICAgIC8qCisgICAgICogTG9vcCBvdmVyIHRoZSBldmVudHMuCisgICAgICovCisgICAgd2hpbGUgKCphcmcgJiYgIXZpbV9pc3doaXRlKCphcmcpKQorCWlmIChhcHBseV9hdXRvY21kc19ncm91cChldmVudF9uYW1lMm5yKGFyZywgJmFyZyksCisJCQkJICAgICAgZm5hbWUsIE5VTEwsIFRSVUUsIGdyb3VwLCBjdXJidWYsIE5VTEwpKQorCSAgICBub3RoaW5nX2RvbmUgPSBGQUxTRTsKKworICAgIGlmIChub3RoaW5nX2RvbmUgJiYgZG9fbXNnKQorCU1TRyhfKCJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiKSk7CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICByZXR1cm4gYWJvcnRpbmcoKSA/IEZBSUwgOiBPSzsKKyNlbHNlCisgICAgcmV0dXJuIE9LOworI2VuZGlmCit9CisKKy8qCisgKiAiOmRvYXV0b2FsbCI6IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBlYWNoIGxvYWRlZCBidWZmZXIuCisgKi8KKyAgICB2b2lkCitleF9kb2F1dG9hbGwoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCXJldHZhbDsKKyAgICBhY29fc2F2ZV9UCWFjbzsKKyAgICBidWZfVAkqYnVmOworCisgICAgLyoKKyAgICAgKiBUaGlzIGlzIGEgYml0IHRyaWNreTogRm9yIHNvbWUgY29tbWFuZHMgY3Vyd2luLT53X2J1ZmZlciBuZWVkcyB0byBiZQorICAgICAqIGVxdWFsIHRvIGN1cmJ1ZiwgYnV0IGZvciBzb21lIGJ1ZmZlcnMgdGhlcmUgbWF5IG5vdCBiZSBhIHdpbmRvdy4KKyAgICAgKiBTbyB3ZSBjaGFuZ2UgdGhlIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgd2luZG93IGZvciBhIG1vbWVudC4gIFRoaXMKKyAgICAgKiBnaXZlcyBwcm9ibGVtcyB3aGVuIHRoZSBhdXRvY29tbWFuZHMgbWFrZSBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mCisgICAgICogYnVmZmVycyBvciB3aW5kb3dzLi4uCisgICAgICovCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwlpZiAoY3VyYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCXsKKwkgICAgLyogZmluZCBhIHdpbmRvdyBmb3IgdGhpcyBidWZmZXIgYW5kIHNhdmUgc29tZSB2YWx1ZXMgKi8KKwkgICAgYXVjbWRfcHJlcGJ1ZigmYWNvLCBidWYpOworCisJICAgIC8qIGV4ZWN1dGUgdGhlIGF1dG9jb21tYW5kcyBmb3IgdGhpcyBidWZmZXIgKi8KKwkgICAgcmV0dmFsID0gZG9fZG9hdXRvY21kKGVhcC0+YXJnLCBGQUxTRSk7CisJICAgIGRvX21vZGVsaW5lcygpOworCisJICAgIC8qIHJlc3RvcmUgdGhlIGN1cnJlbnQgd2luZG93ICovCisJICAgIGF1Y21kX3Jlc3RidWYoJmFjbyk7CisKKwkgICAgLyogc3RvcCBpZiB0aGVyZSBpcyBzb21lIGVycm9yIG9yIGJ1ZmZlciB3YXMgZGVsZXRlZCAqLworCSAgICBpZiAocmV0dmFsID09IEZBSUwgfHwgIWJ1Zl92YWxpZChidWYpKQorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgY2hlY2tfY3Vyc29yKCk7CSAgICAvKiBqdXN0IGluIGNhc2UgbGluZXMgZ290IGRlbGV0ZWQgKi8KK30KKworLyoKKyAqIFByZXBhcmUgZm9yIGV4ZWN1dGluZyBhdXRvY29tbWFuZHMgZm9yIChoaWRkZW4pIGJ1ZmZlciAiYnVmIi4KKyAqIFNlYXJjaCBhIHdpbmRvdyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLiAgU2F2ZSB0aGUgY3Vyc29yIHBvc2l0aW9uIGFuZAorICogc2NyZWVuIG9mZnNldC4KKyAqIFNldCAiY3VyYnVmIiBhbmQgImN1cndpbiIgdG8gbWF0Y2ggImJ1ZiIuCisgKi8KKyAgICB2b2lkCithdWNtZF9wcmVwYnVmKGFjbywgYnVmKQorICAgIGFjb19zYXZlX1QJKmFjbzsJCS8qIHN0cnVjdHVyZSB0byBzYXZlIHZhbHVlcyBpbiAqLworICAgIGJ1Zl9UCSpidWY7CQkvKiBuZXcgY3VyYnVmICovCit7CisgICAgd2luX1QJKndpbjsKKworICAgIGFjby0+bmV3X2N1cmJ1ZiA9IGJ1ZjsKKworICAgIC8qIEZpbmQgYSB3aW5kb3cgdGhhdCBpcyBmb3IgdGhlIG5ldyBidWZmZXIgKi8KKyAgICBpZiAoYnVmID09IGN1cmJ1ZikJCS8qIGJlIHF1aWNrIHdoZW4gYnVmIGlzIGN1cmJ1ZiAqLworCXdpbiA9IGN1cndpbjsKKyAgICBlbHNlCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJZm9yICh3aW4gPSBmaXJzdHdpbjsgd2luICE9IE5VTEw7IHdpbiA9IHdpbi0+d19uZXh0KQorCSAgICBpZiAod2luLT53X2J1ZmZlciA9PSBidWYpCisJCWJyZWFrOworI2Vsc2UKKwl3aW4gPSBOVUxMOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFByZWZlciB0byB1c2UgYW4gZXhpc3Rpbmcgd2luZG93IGZvciB0aGUgYnVmZmVyLCBpdCBoYXMgdGhlIGxlYXN0IHNpZGUKKyAgICAgKiBlZmZlY3RzIChlc3AuIGlmICJidWYiIGlzIGN1cmJ1ZikuCisgICAgICogT3RoZXJ3aXNlLCB1c2UgY3Vyd2luIGZvciAiYnVmIi4gIEl0IG1pZ2h0IG1ha2Ugc29tZSBpdGVtcyBpbiB0aGUKKyAgICAgKiB3aW5kb3cgaW52YWxpZC4gIEF0IGxlYXN0IHNhdmUgdGhlIGN1cnNvciBhbmQgdG9wbGluZS4KKyAgICAgKi8KKyAgICBpZiAod2luICE9IE5VTEwpCisgICAgeworCS8qIHRoZXJlIGlzIGEgd2luZG93IGZvciAiYnVmIiwgbWFrZSBpdCB0aGUgY3Vyd2luICovCisJYWNvLT5zYXZlX2N1cndpbiA9IGN1cndpbjsKKwljdXJ3aW4gPSB3aW47CisJYWNvLT5zYXZlX2J1ZiA9IHdpbi0+d19idWZmZXI7CisJYWNvLT5uZXdfY3Vyd2luID0gd2luOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIHRoZXJlIGlzIG5vIHdpbmRvdyBmb3IgImJ1ZiIsIHVzZSBjdXJ3aW4gKi8KKwlhY28tPnNhdmVfY3Vyd2luID0gTlVMTDsKKwlhY28tPnNhdmVfYnVmID0gY3VyYnVmOworCS0tY3VyYnVmLT5iX253aW5kb3dzOworCWN1cndpbi0+d19idWZmZXIgPSBidWY7CisJKytidWYtPmJfbndpbmRvd3M7CisKKwkvKiBzYXZlIGN1cnNvciBhbmQgdG9wbGluZSwgc2V0IHRoZW0gdG8gc2FmZSB2YWx1ZXMgKi8KKwlhY28tPnNhdmVfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAxOworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwlhY28tPnNhdmVfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworCWN1cndpbi0+d190b3BsaW5lID0gMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwlhY28tPnNhdmVfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworCWN1cndpbi0+d190b3BmaWxsID0gMDsKKyNlbmRpZgorICAgIH0KKworICAgIGN1cmJ1ZiA9IGJ1ZjsKK30KKworLyoKKyAqIENsZWFudXAgYWZ0ZXIgZXhlY3V0aW5nIGF1dG9jb21tYW5kcyBmb3IgYSAoaGlkZGVuKSBidWZmZXIuCisgKiBSZXN0b3JlIHRoZSB3aW5kb3cgYXMgaXQgd2FzIChpZiBwb3NzaWJsZSkuCisgKi8KKyAgICB2b2lkCithdWNtZF9yZXN0YnVmKGFjbykKKyAgICBhY29fc2F2ZV9UCSphY287CQkvKiBzdHJ1Y3R1cmUgaG9sZGluZyBzYXZlZCB2YWx1ZXMgKi8KK3sKKyAgICBpZiAoYWNvLT5zYXZlX2N1cndpbiAhPSBOVUxMKQorICAgIHsKKwkvKiByZXN0b3JlIGN1cndpbiAqLworI2lmZGVmIEZFQVRfV0lORE9XUworCWlmICh3aW5fdmFsaWQoYWNvLT5zYXZlX2N1cndpbikpCisjZW5kaWYKKwl7CisJICAgIC8qIHJlc3RvcmUgdGhlIGJ1ZmZlciB3aGljaCB3YXMgcHJldmlvdXNseSBlZGl0ZWQgYnkgY3Vyd2luLCBpZgorCSAgICAgKiBpdCdzIHN0aWxsIHRoZSBzYW1lIHdpbmRvdyBhbmQgaXQncyB2YWxpZCAqLworCSAgICBpZiAoY3Vyd2luID09IGFjby0+bmV3X2N1cndpbgorCQkgICAgJiYgYnVmX3ZhbGlkKGFjby0+c2F2ZV9idWYpCisJCSAgICAmJiBhY28tPnNhdmVfYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCSAgICB7CisJCS0tY3VyYnVmLT5iX253aW5kb3dzOworCQljdXJidWYgPSBhY28tPnNhdmVfYnVmOworCQljdXJ3aW4tPndfYnVmZmVyID0gY3VyYnVmOworCQkrK2N1cmJ1Zi0+Yl9ud2luZG93czsKKwkgICAgfQorCisJICAgIGN1cndpbiA9IGFjby0+c2F2ZV9jdXJ3aW47CisJICAgIGN1cmJ1ZiA9IGN1cndpbi0+d19idWZmZXI7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIHJlc3RvcmUgYnVmZmVyIGZvciBjdXJ3aW4gaWYgaXQgc3RpbGwgZXhpc3RzIGFuZCBpcyBsb2FkZWQgKi8KKwlpZiAoYnVmX3ZhbGlkKGFjby0+c2F2ZV9idWYpICYmIGFjby0+c2F2ZV9idWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCisJeworCSAgICAtLWN1cmJ1Zi0+Yl9ud2luZG93czsKKwkgICAgY3VyYnVmID0gYWNvLT5zYXZlX2J1ZjsKKwkgICAgY3Vyd2luLT53X2J1ZmZlciA9IGN1cmJ1ZjsKKwkgICAgKytjdXJidWYtPmJfbndpbmRvd3M7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBhY28tPnNhdmVfY3Vyc29yOworCSAgICBjaGVja19jdXJzb3IoKTsKKwkgICAgLyogY2hlY2sgdG9wbGluZSA8IGxpbmVfY291bnQsIGluIGNhc2UgbGluZXMgZ290IGRlbGV0ZWQgKi8KKwkgICAgaWYgKGFjby0+c2F2ZV90b3BsaW5lIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICB7CisJCWN1cndpbi0+d190b3BsaW5lID0gYWNvLT5zYXZlX3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisJCWN1cndpbi0+d190b3BmaWxsID0gYWNvLT5zYXZlX3RvcGZpbGw7CisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJY3Vyd2luLT53X3RvcGxpbmUgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJY3Vyd2luLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50CWF1dG9jbWRfbmVzdGVkID0gRkFMU0U7CisKKy8qCisgKiBFeGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgImV2ZW50IiBhbmQgZmlsZSBuYW1lICJmbmFtZSIuCisgKiBSZXR1cm4gVFJVRSBpZiBzb21lIGNvbW1hbmRzIHdlcmUgZXhlY3V0ZWQuCisgKi8KKyAgICBpbnQKK2FwcGx5X2F1dG9jbWRzKGV2ZW50LCBmbmFtZSwgZm5hbWVfaW8sIGZvcmNlLCBidWYpCisgICAgRVZFTlRfVAlldmVudDsKKyAgICBjaGFyX3UJKmZuYW1lOwkgICAgLyogTlVMTCBvciBlbXB0eSBtZWFucyB1c2UgYWN0dWFsIGZpbGUgbmFtZSAqLworICAgIGNoYXJfdQkqZm5hbWVfaW87ICAvKiBmbmFtZSB0byB1c2UgZm9yIDxhZmlsZT4gb24gY21kbGluZSAqLworICAgIGludAkJZm9yY2U7CSAgICAvKiB3aGVuIFRSVUUsIGlnbm9yZSBhdXRvY21kX2J1c3kgKi8KKyAgICBidWZfVAkqYnVmOwkgICAgLyogYnVmZmVyIGZvciA8YWJ1Zj4gKi8KK3sKKyAgICByZXR1cm4gYXBwbHlfYXV0b2NtZHNfZ3JvdXAoZXZlbnQsIGZuYW1lLCBmbmFtZV9pbywgZm9yY2UsCisJCQkJCQkgICAgICBBVUdST1VQX0FMTCwgYnVmLCBOVUxMKTsKK30KKworLyoKKyAqIExpa2UgYXBwbHlfYXV0b2NtZHMoKSwgYnV0IHdpdGggZXh0cmEgImVhcCIgYXJndW1lbnQuICBUaGlzIHRha2VzIGNhcmUgb2YKKyAqIHNldHRpbmcgdjpmaWxlYXJnLgorICovCisgICAgc3RhdGljIGludAorYXBwbHlfYXV0b2NtZHNfZXhhcmcoZXZlbnQsIGZuYW1lLCBmbmFtZV9pbywgZm9yY2UsIGJ1ZiwgZWFwKQorICAgIEVWRU5UX1QJZXZlbnQ7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBjaGFyX3UJKmZuYW1lX2lvOworICAgIGludAkJZm9yY2U7CisgICAgYnVmX1QJKmJ1ZjsKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgcmV0dXJuIGFwcGx5X2F1dG9jbWRzX2dyb3VwKGV2ZW50LCBmbmFtZSwgZm5hbWVfaW8sIGZvcmNlLAorCQkJCQkJICAgICAgIEFVR1JPVVBfQUxMLCBidWYsIGVhcCk7Cit9CisKKy8qCisgKiBMaWtlIGFwcGx5X2F1dG9jbWRzKCksIGJ1dCBoYW5kbGVzIHRoZSBjYWxsZXIncyByZXR2YWwuICBJZiB0aGUgc2NyaXB0CisgKiBwcm9jZXNzaW5nIGlzIGJlaW5nIGFib3J0ZWQgb3IgaWYgcmV0dmFsIGlzIEZBSUwgd2hlbiBpbnNpZGUgYSB0cnkKKyAqIGNvbmRpdGlvbmFsLCBubyBhdXRvY29tbWFuZHMgYXJlIGV4ZWN1dGVkLiAgSWYgb3RoZXJ3aXNlIHRoZSBhdXRvY29tbWFuZHMKKyAqIGNhdXNlIHRoZSBzY3JpcHQgdG8gYmUgYWJvcnRlZCwgcmV0dmFsIGlzIHNldCB0byBGQUlMLgorICovCisgICAgaW50CithcHBseV9hdXRvY21kc19yZXR2YWwoZXZlbnQsIGZuYW1lLCBmbmFtZV9pbywgZm9yY2UsIGJ1ZiwgcmV0dmFsKQorICAgIEVWRU5UX1QJZXZlbnQ7CisgICAgY2hhcl91CSpmbmFtZTsJICAgIC8qIE5VTEwgb3IgZW1wdHkgbWVhbnMgdXNlIGFjdHVhbCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmZuYW1lX2lvOyAgLyogZm5hbWUgdG8gdXNlIGZvciA8YWZpbGU+IG9uIGNtZGxpbmUgKi8KKyAgICBpbnQJCWZvcmNlOwkgICAgLyogd2hlbiBUUlVFLCBpZ25vcmUgYXV0b2NtZF9idXN5ICovCisgICAgYnVmX1QJKmJ1ZjsJICAgIC8qIGJ1ZmZlciBmb3IgPGFidWY+ICovCisgICAgaW50CQkqcmV0dmFsOyAgICAvKiBwb2ludGVyIHRvIGNhbGxlcidzIHJldHZhbCAqLworeworICAgIGludAkJZGlkX2NtZDsKKworICAgIGlmIChzaG91bGRfYWJvcnQoKnJldHZhbCkpCisJcmV0dXJuIEZBTFNFOworCisgICAgZGlkX2NtZCA9IGFwcGx5X2F1dG9jbWRzX2dyb3VwKGV2ZW50LCBmbmFtZSwgZm5hbWVfaW8sIGZvcmNlLAorCQkJCQkJICAgICAgQVVHUk9VUF9BTEwsIGJ1ZiwgTlVMTCk7CisgICAgaWYgKGRpZF9jbWQgJiYgYWJvcnRpbmcoKSkKKwkqcmV0dmFsID0gRkFJTDsKKyAgICByZXR1cm4gZGlkX2NtZDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGludAoraGFzX2N1cnNvcmhvbGQoKQoreworICAgIHJldHVybiAoZmlyc3RfYXV0b3BhdFsoaW50KUVWRU5UX0NVUlNPUkhPTERdICE9IE5VTEwpOworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgaW50CithcHBseV9hdXRvY21kc19ncm91cChldmVudCwgZm5hbWUsIGZuYW1lX2lvLCBmb3JjZSwgZ3JvdXAsIGJ1ZiwgZWFwKQorICAgIEVWRU5UX1QJZXZlbnQ7CisgICAgY2hhcl91CSpmbmFtZTsJICAgIC8qIE5VTEwgb3IgZW1wdHkgbWVhbnMgdXNlIGFjdHVhbCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmZuYW1lX2lvOyAgLyogZm5hbWUgdG8gdXNlIGZvciA8YWZpbGU+IG9uIGNtZGxpbmUsIE5VTEwgbWVhbnMKKwkJCSAgICAgICB1c2UgZm5hbWUgKi8KKyAgICBpbnQJCWZvcmNlOwkgICAgLyogd2hlbiBUUlVFLCBpZ25vcmUgYXV0b2NtZF9idXN5ICovCisgICAgaW50CQlncm91cDsJICAgIC8qIGdyb3VwIElELCBvciBBVUdST1VQX0FMTCAqLworICAgIGJ1Zl9UCSpidWY7CSAgICAvKiBidWZmZXIgZm9yIDxhYnVmPiAqLworICAgIGV4YXJnX1QJKmVhcDsJICAgIC8qIGNvbW1hbmQgYXJndW1lbnRzICovCit7CisgICAgY2hhcl91CSpzZm5hbWUgPSBOVUxMOwkvKiBzaG9ydCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKnRhaWw7CisgICAgaW50CQlzYXZlX2NoYW5nZWQ7CisgICAgYnVmX1QJKm9sZF9jdXJidWY7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKyAgICBjaGFyX3UJKnNhdmVfc291cmNpbmdfbmFtZTsKKyAgICBsaW5lbnJfVAlzYXZlX3NvdXJjaW5nX2xudW07CisgICAgY2hhcl91CSpzYXZlX2F1dG9jbWRfZm5hbWU7CisgICAgaW50CQlzYXZlX2F1dG9jbWRfYnVmbnI7CisgICAgY2hhcl91CSpzYXZlX2F1dG9jbWRfbWF0Y2g7CisgICAgaW50CQlzYXZlX2F1dG9jbWRfYnVzeTsKKyAgICBpbnQJCXNhdmVfYXV0b2NtZF9uZXN0ZWQ7CisgICAgc3RhdGljIGludAluZXN0aW5nID0gMDsKKyAgICBBdXRvUGF0Q21kCXBhdGNtZDsKKyAgICBBdXRvUGF0CSphcDsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBzY2lkX1QJc2F2ZV9jdXJyZW50X1NJRDsKKyAgICB2b2lkCSpzYXZlX2Z1bmNjYWxwOworICAgIGNoYXJfdQkqc2F2ZV9jbWRhcmc7CisgICAgbG9uZwlzYXZlX2NtZGJhbmc7CisjZW5kaWYKKyAgICBzdGF0aWMgaW50CWZpbGVjaGFuZ2VzaGVsbF9idXN5ID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIFF1aWNrbHkgcmV0dXJuIGlmIHRoZXJlIGFyZSBubyBhdXRvY29tbWFuZHMgZm9yIHRoaXMgZXZlbnQgb3IKKyAgICAgKiBhdXRvY29tbWFuZHMgYXJlIGJsb2NrZWQuCisgICAgICovCisgICAgaWYgKGZpcnN0X2F1dG9wYXRbKGludClldmVudF0gPT0gTlVMTCB8fCBhdXRvY21kX2Jsb2NrID4gMCkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgLyoKKyAgICAgKiBXaGVuIGF1dG9jb21tYW5kcyBhcmUgYnVzeSwgbmV3IGF1dG9jb21tYW5kcyBhcmUgb25seSBleGVjdXRlZCB3aGVuCisgICAgICogZXhwbGljaXRseSBlbmFibGVkIHdpdGggdGhlICJuZXN0ZWQiIGZsYWcuCisgICAgICovCisgICAgaWYgKGF1dG9jbWRfYnVzeSAmJiAhKGZvcmNlIHx8IGF1dG9jbWRfbmVzdGVkKSkKKwlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyoKKyAgICAgKiBRdWlja2x5IHJldHVybiB3aGVuIGltbWRlZGlhdGVseSBhYm9ydGluZyBvbiBlcnJvciwgb3Igd2hlbiBhbiBpbnRlcnJ1cHQKKyAgICAgKiBvY2N1cnJlZCBvciBhbiBleGNlcHRpb24gd2FzIHRocm93biBidXQgbm90IGNhdWdodC4KKyAgICAgKi8KKyAgICBpZiAoYWJvcnRpbmcoKSkKKwlyZXR1cm4gcmV0dmFsOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZpbGVDaGFuZ2VkU2hlbGwgbmV2ZXIgbmVzdHMsIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBhbiBlbmRsZXNzIGxvb3AuCisgICAgICovCisgICAgaWYgKGZpbGVjaGFuZ2VzaGVsbF9idXN5ICYmIGV2ZW50ID09IEVWRU5UX0ZJTEVDSEFOR0VEU0hFTEwpCisJcmV0dXJuIHJldHZhbDsKKworICAgIC8qCisgICAgICogSWdub3JlIGV2ZW50cyBpbiAnZXZlbnRpZ25vcmUnLgorICAgICAqLworICAgIGlmIChldmVudF9pZ25vcmVkKGV2ZW50KSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgLyoKKyAgICAgKiBBbGxvdyBuZXN0aW5nIG9mIGF1dG9jb21tYW5kcywgYnV0IHJlc3RyaWN0IHRoZSBkZXB0aCwgYmVjYXVzZSBpdCdzCisgICAgICogcG9zc2libGUgdG8gY3JlYXRlIGFuIGVuZGxlc3MgbG9vcC4KKyAgICAgKi8KKyAgICBpZiAobmVzdGluZyA9PSAxMCkKKyAgICB7CisJRU1TRyhfKCJFMjE4OiBhdXRvY29tbWFuZCBuZXN0aW5nIHRvbyBkZWVwIikpOworCXJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGVzZSBhdXRvY29tbWFuZHMgYXJlIGRpc2FibGVkLiAgVXNlZCB3aGVuIGRvaW5nICI6YWxsIiBvcgorICAgICAqICI6YmFsbCIuCisgICAgICovCisgICAgaWYgKCAgICAgICAoYXV0b2NtZF9ub19lbnRlcgorCQkmJiAoZXZlbnQgPT0gRVZFTlRfV0lORU5URVIgfHwgZXZlbnQgPT0gRVZFTlRfQlVGRU5URVIpKQorCSAgICB8fCAoYXV0b2NtZF9ub19sZWF2ZQorCQkmJiAoZXZlbnQgPT0gRVZFTlRfV0lOTEVBVkUgfHwgZXZlbnQgPT0gRVZFTlRfQlVGTEVBVkUpKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBhdXRvY21kXyogdmFyaWFibGVzIGFuZCBpbmZvIGFib3V0IHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzYXZlX2F1dG9jbWRfZm5hbWUgPSBhdXRvY21kX2ZuYW1lOworICAgIHNhdmVfYXV0b2NtZF9idWZuciA9IGF1dG9jbWRfYnVmbnI7CisgICAgc2F2ZV9hdXRvY21kX21hdGNoID0gYXV0b2NtZF9tYXRjaDsKKyAgICBzYXZlX2F1dG9jbWRfYnVzeSA9IGF1dG9jbWRfYnVzeTsKKyAgICBzYXZlX2F1dG9jbWRfbmVzdGVkID0gYXV0b2NtZF9uZXN0ZWQ7CisgICAgc2F2ZV9jaGFuZ2VkID0gY3VyYnVmLT5iX2NoYW5nZWQ7CisgICAgb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBmaWxlIG5hbWUgdG8gYmUgdXNlZCBmb3IgPGFmaWxlPi4KKyAgICAgKi8KKyAgICBpZiAoZm5hbWVfaW8gPT0gTlVMTCkKKyAgICB7CisJaWYgKGZuYW1lICE9IE5VTEwgJiYgKmZuYW1lICE9IE5VTCkKKwkgICAgYXV0b2NtZF9mbmFtZSA9IGZuYW1lOworCWVsc2UgaWYgKGJ1ZiAhPSBOVUxMKQorCSAgICBhdXRvY21kX2ZuYW1lID0gYnVmLT5iX2ZuYW1lOworCWVsc2UKKwkgICAgYXV0b2NtZF9mbmFtZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKwlhdXRvY21kX2ZuYW1lID0gZm5hbWVfaW87CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgYnVmZmVyIG51bWJlciB0byBiZSB1c2VkIGZvciA8YWJ1Zj4uCisgICAgICovCisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCWF1dG9jbWRfYnVmbnIgPSAwOworICAgIGVsc2UKKwlhdXRvY21kX2J1Zm5yID0gYnVmLT5iX2ZudW07CisKKyAgICAvKgorICAgICAqIFdoZW4gdGhlIGZpbGUgbmFtZSBpcyBOVUxMIG9yIGVtcHR5LCB1c2UgdGhlIGZpbGUgbmFtZSBvZiBidWZmZXIgImJ1ZiIuCisgICAgICogQWx3YXlzIHVzZSB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlIG5hbWUgdG8gbWF0Y2ggd2l0aCwgaW4gY2FzZQorICAgICAqICJhbGxvd19kaXJzIiBpcyBzZXQuCisgICAgICovCisgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTCkKKyAgICB7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICBmbmFtZSA9IE5VTEw7CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX1NZTl9ITAorCSAgICBpZiAoZXZlbnQgPT0gRVZFTlRfU1lOVEFYKQorCQlmbmFtZSA9IGJ1Zi0+Yl9wX3N5bjsKKwkgICAgZWxzZQorI2VuZGlmCisJCWlmIChldmVudCA9PSBFVkVOVF9GSUxFVFlQRSkKKwkJICAgIGZuYW1lID0gYnVmLT5iX3BfZnQ7CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGJ1Zi0+Yl9zZm5hbWUgIT0gTlVMTCkKKwkJCXNmbmFtZSA9IHZpbV9zdHJzYXZlKGJ1Zi0+Yl9zZm5hbWUpOworCQkgICAgZm5hbWUgPSBidWYtPmJfZmZuYW1lOworCQl9CisJfQorCWlmIChmbmFtZSA9PSBOVUxMKQorCSAgICBmbmFtZSA9IChjaGFyX3UgKikiIjsKKwlmbmFtZSA9IHZpbV9zdHJzYXZlKGZuYW1lKTsJLyogbWFrZSBhIGNvcHksIHNvIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzZm5hbWUgPSB2aW1fc3Ryc2F2ZShmbmFtZSk7CisJLyogRG9uJ3QgdHJ5IGV4cGFuZGluZyBGaWxlVHlwZSwgU3ludGF4IG9yIFdpbmRvd0lELiAqLworCWlmIChldmVudCA9PSBFVkVOVF9GSUxFVFlQRSB8fCBldmVudCA9PSBFVkVOVF9TWU5UQVgKKwkJfHwgZXZlbnQgPT0gRVZFTlRfUkVNT1RFUkVQTFkpCisJICAgIGZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpOworCWVsc2UKKwkgICAgZm5hbWUgPSBGdWxsTmFtZV9zYXZlKGZuYW1lLCBGQUxTRSk7CisgICAgfQorICAgIGlmIChmbmFtZSA9PSBOVUxMKQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworICAgIHsKKwl2aW1fZnJlZShzZm5hbWUpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyAgICAvKgorICAgICAqIFJlcGxhY2UgYWxsIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzLiAgVGhpcyBtYWtlcyB0aGUKKyAgICAgKiBhdXRvY29tbWFuZCBwYXR0ZXJucyBwb3J0YWJsZSBiZXR3ZWVuIFVuaXggYW5kIE1TLURPUy4KKyAgICAgKi8KKyAgICBpZiAoc2ZuYW1lICE9IE5VTEwpCisJZm9yd2FyZF9zbGFzaChzZm5hbWUpOworICAgIGZvcndhcmRfc2xhc2goZm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBWTVMKKyAgICAvKiByZW1vdmUgdmVyc2lvbiBmb3IgY29ycmVjdCBtYXRjaCAqLworICAgIGlmIChzZm5hbWUgIT0gTlVMTCkKKwl2bXNfcmVtb3ZlX3ZlcnNpb24oc2ZuYW1lKTsKKyAgICB2bXNfcmVtb3ZlX3ZlcnNpb24oZm5hbWUpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgbmFtZSB0byBiZSB1c2VkIGZvciA8YW1hdGNoPi4KKyAgICAgKi8KKyAgICBhdXRvY21kX21hdGNoID0gZm5hbWU7CisKKworICAgIC8qIERvbid0IHJlZHJhdyB3aGlsZSBkb2luZyBhdXRvIGNvbW1hbmRzLiAqLworICAgICsrUmVkcmF3aW5nRGlzYWJsZWQ7CisgICAgc2F2ZV9zb3VyY2luZ19uYW1lID0gc291cmNpbmdfbmFtZTsKKyAgICBzb3VyY2luZ19uYW1lID0gTlVMTDsJLyogZG9uJ3QgZnJlZSB0aGlzIG9uZSAqLworICAgIHNhdmVfc291cmNpbmdfbG51bSA9IHNvdXJjaW5nX2xudW07CisgICAgc291cmNpbmdfbG51bSA9IDA7CQkvKiBubyBsaW5lIG51bWJlciBoZXJlICovCisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBzYXZlX2N1cnJlbnRfU0lEID0gY3VycmVudF9TSUQ7CisKKyAgICAvKiBEb24ndCB1c2UgbG9jYWwgZnVuY3Rpb24gdmFyaWFibGVzLCBpZiBjYWxsZWQgZnJvbSBhIGZ1bmN0aW9uICovCisgICAgc2F2ZV9mdW5jY2FscCA9IHNhdmVfZnVuY2NhbCgpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdG8gZXhlY3V0ZSBhdXRvY29tbWFuZHMsIHNhdmUgdGhlIHNlYXJjaCBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBpZiAoIWF1dG9jbWRfYnVzeSkKKyAgICB7CisJc2F2ZV9zZWFyY2hfcGF0dGVybnMoKTsKKwlzYXZlUmVkb2J1ZmYoKTsKKwlkaWRfZmlsZXR5cGUgPSBrZWVwX2ZpbGV0eXBlOworICAgIH0KKworICAgIC8qCisgICAgICogTm90ZSB0aGF0IHdlIGFyZSBhcHBseWluZyBhdXRvY21kcy4gIFNvbWUgY29tbWFuZHMgbmVlZCB0byBrbm93LgorICAgICAqLworICAgIGF1dG9jbWRfYnVzeSA9IFRSVUU7CisgICAgZmlsZWNoYW5nZXNoZWxsX2J1c3kgPSAoZXZlbnQgPT0gRVZFTlRfRklMRUNIQU5HRURTSEVMTCk7CisgICAgKytuZXN0aW5nOwkJLyogc2VlIG1hdGNoaW5nIGRlY3JlbWVudCBiZWxvdyAqLworCisgICAgLyogUmVtZW1iZXIgdGhhdCBGaWxlVHlwZSB3YXMgdHJpZ2dlcmVkLiAgVXNlZCBmb3IgZGlkX2ZpbGV0eXBlKCkuICovCisgICAgaWYgKGV2ZW50ID09IEVWRU5UX0ZJTEVUWVBFKQorCWRpZF9maWxldHlwZSA9IFRSVUU7CisKKyAgICB0YWlsID0gZ2V0dGFpbChmbmFtZSk7CisKKyAgICAvKiBGaW5kIGZpcnN0IGF1dG9jb21tYW5kIHRoYXQgbWF0Y2hlcyAqLworICAgIHBhdGNtZC5jdXJwYXQgPSBmaXJzdF9hdXRvcGF0WyhpbnQpZXZlbnRdOworICAgIHBhdGNtZC5uZXh0Y21kID0gTlVMTDsKKyAgICBwYXRjbWQuZ3JvdXAgPSBncm91cDsKKyAgICBwYXRjbWQuZm5hbWUgPSBmbmFtZTsKKyAgICBwYXRjbWQuc2ZuYW1lID0gc2ZuYW1lOworICAgIHBhdGNtZC50YWlsID0gdGFpbDsKKyAgICBwYXRjbWQuZXZlbnQgPSBldmVudDsKKyAgICBhdXRvX25leHRfcGF0KCZwYXRjbWQsIEZBTFNFKTsKKworICAgIC8qIGZvdW5kIG9uZSwgc3RhcnQgZXhlY3V0aW5nIHRoZSBhdXRvY29tbWFuZHMgKi8KKyAgICBpZiAocGF0Y21kLmN1cnBhdCAhPSBOVUxMKQorICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwkvKiBzZXQgdjpjbWRhcmcgKG9ubHkgd2hlbiB0aGVyZSBpcyBhIG1hdGNoaW5nIHBhdHRlcm4pICovCisJc2F2ZV9jbWRiYW5nID0gZ2V0X3ZpbV92YXJfbnIoVlZfQ01EQkFORyk7CisJaWYgKGVhcCAhPSBOVUxMKQorCXsKKwkgICAgc2F2ZV9jbWRhcmcgPSBzZXRfY21kYXJnKGVhcCwgTlVMTCk7CisJICAgIHNldF92aW1fdmFyX25yKFZWX0NNREJBTkcsIChsb25nKWVhcC0+Zm9yY2VpdCk7CisJfQorCWVsc2UKKwkgICAgc2F2ZV9jbWRhcmcgPSBOVUxMOwkvKiBhdm9pZCBnY2Mgd2FybmluZyAqLworI2VuZGlmCisJcmV0dmFsID0gVFJVRTsKKwkvKiBtYXJrIHRoZSBsYXN0IHBhdHRlcm4sIHRvIGF2b2lkIGFuIGVuZGxlc3MgbG9vcCB3aGVuIG1vcmUgcGF0dGVybnMKKwkgKiBhcmUgYWRkZWQgd2hlbiBleGVjdXRpbmcgYXV0b2NvbW1hbmRzICovCisJZm9yIChhcCA9IHBhdGNtZC5jdXJwYXQ7IGFwLT5uZXh0ICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJICAgIGFwLT5sYXN0ID0gRkFMU0U7CisJYXAtPmxhc3QgPSBUUlVFOworCWNoZWNrX2xudW1zKFRSVUUpOwkvKiBtYWtlIHN1cmUgY3Vyc29yIGFuZCB0b3BsaW5lIGFyZSB2YWxpZCAqLworCWRvX2NtZGxpbmUoTlVMTCwgZ2V0bmV4dGFjLCAodm9pZCAqKSZwYXRjbWQsCisJCQkJICAgICBET0NNRF9OT1dBSVR8RE9DTURfVkVSQk9TRXxET0NNRF9SRVBFQVQpOworI2lmZGVmIEZFQVRfRVZBTAorCWlmIChlYXAgIT0gTlVMTCkKKwl7CisJICAgICh2b2lkKXNldF9jbWRhcmcoTlVMTCwgc2F2ZV9jbWRhcmcpOworCSAgICBzZXRfdmltX3Zhcl9ucihWVl9DTURCQU5HLCBzYXZlX2NtZGJhbmcpOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIC0tUmVkcmF3aW5nRGlzYWJsZWQ7CisgICAgYXV0b2NtZF9idXN5ID0gc2F2ZV9hdXRvY21kX2J1c3k7CisgICAgZmlsZWNoYW5nZXNoZWxsX2J1c3kgPSBGQUxTRTsKKyAgICBhdXRvY21kX25lc3RlZCA9IHNhdmVfYXV0b2NtZF9uZXN0ZWQ7CisgICAgdmltX2ZyZWUoc291cmNpbmdfbmFtZSk7CisgICAgc291cmNpbmdfbmFtZSA9IHNhdmVfc291cmNpbmdfbmFtZTsKKyAgICBzb3VyY2luZ19sbnVtID0gc2F2ZV9zb3VyY2luZ19sbnVtOworICAgIGF1dG9jbWRfZm5hbWUgPSBzYXZlX2F1dG9jbWRfZm5hbWU7CisgICAgYXV0b2NtZF9idWZuciA9IHNhdmVfYXV0b2NtZF9idWZucjsKKyAgICBhdXRvY21kX21hdGNoID0gc2F2ZV9hdXRvY21kX21hdGNoOworI2lmZGVmIEZFQVRfRVZBTAorICAgIGN1cnJlbnRfU0lEID0gc2F2ZV9jdXJyZW50X1NJRDsKKyAgICByZXN0b3JlX2Z1bmNjYWwoc2F2ZV9mdW5jY2FscCk7CisjZW5kaWYKKyAgICB2aW1fZnJlZShmbmFtZSk7CisgICAgdmltX2ZyZWUoc2ZuYW1lKTsKKyAgICAtLW5lc3Rpbmc7CQkvKiBzZWUgbWF0Y2hpbmcgaW5jcmVtZW50IGFib3ZlICovCisKKyAgICAvKgorICAgICAqIFdoZW4gc3RvcHBpbmcgdG8gZXhlY3V0ZSBhdXRvY29tbWFuZHMsIHJlc3RvcmUgdGhlIHNlYXJjaCBwYXR0ZXJucyBhbmQKKyAgICAgKiB0aGUgcmVkbyBidWZmZXIuCisgICAgICovCisgICAgaWYgKCFhdXRvY21kX2J1c3kpCisgICAgeworCXJlc3RvcmVfc2VhcmNoX3BhdHRlcm5zKCk7CisJcmVzdG9yZVJlZG9idWZmKCk7CisJZGlkX2ZpbGV0eXBlID0gRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTb21lIGV2ZW50cyBkb24ndCBzZXQgb3IgcmVzZXQgdGhlIENoYW5nZWQgZmxhZy4KKyAgICAgKiBDaGVjayBpZiBzdGlsbCBpbiB0aGUgc2FtZSBidWZmZXIhCisgICAgICovCisgICAgaWYgKGN1cmJ1ZiA9PSBvbGRfY3VyYnVmCisJICAgICYmIChldmVudCA9PSBFVkVOVF9CVUZSRUFEUE9TVAorCQl8fCBldmVudCA9PSBFVkVOVF9CVUZXUklURVBPU1QKKwkJfHwgZXZlbnQgPT0gRVZFTlRfRklMRUFQUEVORFBPU1QKKwkJfHwgZXZlbnQgPT0gRVZFTlRfVklNTEVBVkUKKwkJfHwgZXZlbnQgPT0gRVZFTlRfVklNTEVBVkVQUkUpKQorICAgIHsKKyNpZmRlZiBGRUFUX1RJVExFCisJaWYgKGN1cmJ1Zi0+Yl9jaGFuZ2VkICE9IHNhdmVfY2hhbmdlZCkKKwkgICAgbmVlZF9tYWtldGl0bGUgPSBUUlVFOworI2VuZGlmCisJY3VyYnVmLT5iX2NoYW5nZWQgPSBzYXZlX2NoYW5nZWQ7CisgICAgfQorCisgICAgYXVfY2xlYW51cCgpOwkvKiBtYXkgcmVhbGx5IGRlbGV0ZSByZW1vdmVkIHBhdHRlcm5zL2NvbW1hbmRzIG5vdyAqLworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGaW5kIG5leHQgYXV0b2NvbW1hbmQgcGF0dGVybiB0aGF0IG1hdGNoZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYXV0b19uZXh0X3BhdChhcGMsIHN0b3BfYXRfbGFzdCkKKyAgICBBdXRvUGF0Q21kCSphcGM7CisgICAgaW50CQlzdG9wX2F0X2xhc3Q7CSAgICAvKiBzdG9wIHdoZW4gJ2xhc3QnIGZsYWcgaXMgc2V0ICovCit7CisgICAgQXV0b1BhdAkqYXA7CisgICAgQXV0b0NtZAkqY3A7CisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXIJKnM7CisKKyAgICB2aW1fZnJlZShzb3VyY2luZ19uYW1lKTsKKyAgICBzb3VyY2luZ19uYW1lID0gTlVMTDsKKworICAgIGZvciAoYXAgPSBhcGMtPmN1cnBhdDsgYXAgIT0gTlVMTCAmJiAhZ290X2ludDsgYXAgPSBhcC0+bmV4dCkKKyAgICB7CisJYXBjLT5jdXJwYXQgPSBOVUxMOworCisJLyogb25seSB1c2UgYSBwYXR0ZXJuIHdoZW4gaXQgaGFzIG5vdCBiZWVuIHJlbW92ZWQsIGhhcyBjb21tYW5kcyBhbmQKKwkgKiB0aGUgZ3JvdXAgbWF0Y2hlcyAqLworCWlmIChhcC0+cGF0ICE9IE5VTEwgJiYgYXAtPmNtZHMgIT0gTlVMTAorCQkmJiAoYXBjLT5ncm91cCA9PSBBVUdST1VQX0FMTCB8fCBhcGMtPmdyb3VwID09IGFwLT5ncm91cCkpCisJeworCSAgICBpZiAobWF0Y2hfZmlsZV9wYXQoYXAtPnJlZ19wYXQsIGFwYy0+Zm5hbWUsIGFwYy0+c2ZuYW1lLCBhcGMtPnRhaWwsCisJCQkJCQkJICAgICAgYXAtPmFsbG93X2RpcnMpKQorCSAgICB7CisJCW5hbWUgPSBldmVudF9ucjJuYW1lKGFwYy0+ZXZlbnQpOworCQlzID0gXygiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIik7CisJCXNvdXJjaW5nX25hbWUgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihzKQorCQkJCQkgICAgKyBTVFJMRU4obmFtZSkgKyBhcC0+cGF0bGVuICsgMSkpOworCQlpZiAoc291cmNpbmdfbmFtZSAhPSBOVUxMKQorCQl7CisJCSAgICBzcHJpbnRmKChjaGFyICopc291cmNpbmdfbmFtZSwgcywKKwkJCQkJICAgICAgIChjaGFyICopbmFtZSwgKGNoYXIgKilhcC0+cGF0KTsKKwkJICAgIGlmIChwX3ZlcmJvc2UgPj0gOCkKKwkJCW1zZ19zdHIoKGNoYXJfdSAqKV8oIkV4ZWN1dGluZyAlcyIpLCBzb3VyY2luZ19uYW1lKTsKKwkJfQorCisJCWFwYy0+Y3VycGF0ID0gYXA7CisJCWFwYy0+bmV4dGNtZCA9IGFwLT5jbWRzOworCQkvKiBtYXJrIGxhc3QgY29tbWFuZCAqLworCQlmb3IgKGNwID0gYXAtPmNtZHM7IGNwLT5uZXh0ICE9IE5VTEw7IGNwID0gY3AtPm5leHQpCisJCSAgICBjcC0+bGFzdCA9IEZBTFNFOworCQljcC0+bGFzdCA9IFRSVUU7CisJICAgIH0KKwkgICAgbGluZV9icmVha2NoZWNrKCk7CisJICAgIGlmIChhcGMtPmN1cnBhdCAhPSBOVUxMKQkgICAgLyogZm91bmQgYSBtYXRjaCAqLworCQlicmVhazsKKwl9CisJaWYgKHN0b3BfYXRfbGFzdCAmJiBhcC0+bGFzdCkKKwkgICAgYnJlYWs7CisgICAgfQorfQorCisvKgorICogR2V0IG5leHQgYXV0b2NvbW1hbmQgY29tbWFuZC4KKyAqIENhbGxlZCBieSBkb19jbWRsaW5lKCkgdG8gZ2V0IHRoZSBuZXh0IGxpbmUgZm9yICI6aWYiLgorICogUmV0dXJucyBhbGxvY2F0ZWQgc3RyaW5nLCBvciBOVUxMIGZvciBlbmQgb2YgYXV0b2NvbW1hbmRzLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0bmV4dGFjKGMsIGNvb2tpZSwgaW5kZW50KQorICAgIGludAkgICAgYzsJCSAgICAvKiBub3QgdXNlZCAqLworICAgIHZvaWQgICAgKmNvb2tpZTsKKyAgICBpbnQJICAgIGluZGVudDsJICAgIC8qIG5vdCB1c2VkICovCit7CisgICAgQXV0b1BhdENtZAkgICAgKmFjcCA9IChBdXRvUGF0Q21kICopY29va2llOworICAgIGNoYXJfdQkgICAgKnJldHZhbDsKKyAgICBBdXRvQ21kCSAgICAqYWM7CisKKyAgICAvKiBDYW4gYmUgY2FsbGVkIGFnYWluIGFmdGVyIHJldHVybmluZyB0aGUgbGFzdCBsaW5lLiAqLworICAgIGlmIChhY3AtPmN1cnBhdCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgLyogcmVwZWF0IHVudGlsIHdlIGZpbmQgYW4gYXV0b2NvbW1hbmQgdG8gZXhlY3V0ZSAqLworICAgIGZvciAoOzspCisgICAgeworCS8qIHNraXAgcmVtb3ZlZCBjb21tYW5kcyAqLworCXdoaWxlIChhY3AtPm5leHRjbWQgIT0gTlVMTCAmJiBhY3AtPm5leHRjbWQtPmNtZCA9PSBOVUxMKQorCSAgICBpZiAoYWNwLT5uZXh0Y21kLT5sYXN0KQorCQlhY3AtPm5leHRjbWQgPSBOVUxMOworCSAgICBlbHNlCisJCWFjcC0+bmV4dGNtZCA9IGFjcC0+bmV4dGNtZC0+bmV4dDsKKworCWlmIChhY3AtPm5leHRjbWQgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisKKwkvKiBhdCBlbmQgb2YgY29tbWFuZHMsIGZpbmQgbmV4dCBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyAqLworCWlmIChhY3AtPmN1cnBhdC0+bGFzdCkKKwkgICAgYWNwLT5jdXJwYXQgPSBOVUxMOworCWVsc2UKKwkgICAgYWNwLT5jdXJwYXQgPSBhY3AtPmN1cnBhdC0+bmV4dDsKKwlpZiAoYWNwLT5jdXJwYXQgIT0gTlVMTCkKKwkgICAgYXV0b19uZXh0X3BhdChhY3AsIFRSVUUpOworCWlmIChhY3AtPmN1cnBhdCA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhYyA9IGFjcC0+bmV4dGNtZDsKKworICAgIGlmIChwX3ZlcmJvc2UgPj0gOSkKKyAgICB7CisJbXNnX3Njcm9sbCA9IFRSVUU7CSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwltc2dfc3RyKChjaGFyX3UgKilfKCJhdXRvY29tbWFuZCAlcyIpLCBhYy0+Y21kKTsKKwltc2dfcHV0cygoY2hhcl91ICopIlxuIik7ICAgLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgZWl0aGVyICovCisJY21kbGluZV9yb3cgPSBtc2dfcm93OworICAgIH0KKyAgICByZXR2YWwgPSB2aW1fc3Ryc2F2ZShhYy0+Y21kKTsKKyAgICBhdXRvY21kX25lc3RlZCA9IGFjLT5uZXN0ZWQ7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgY3VycmVudF9TSUQgPSBhYy0+c2NyaXB0SUQ7CisjZW5kaWYKKyAgICBpZiAoYWMtPmxhc3QpCisJYWNwLT5uZXh0Y21kID0gTlVMTDsKKyAgICBlbHNlCisJYWNwLT5uZXh0Y21kID0gYWMtPm5leHQ7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgYXV0b2NvbW1hbmQgZm9yICJmbmFtZSIuCisgKi8KKyAgICBpbnQKK2hhc19hdXRvY21kKGV2ZW50LCBzZm5hbWUpCisgICAgRVZFTlRfVAlldmVudDsKKyAgICBjaGFyX3UJKnNmbmFtZTsKK3sKKyAgICBBdXRvUGF0CSphcDsKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGNoYXJfdQkqdGFpbCA9IGdldHRhaWwoc2ZuYW1lKTsKKyAgICBpbnQJCXJldHZhbCA9IEZBTFNFOworCisgICAgZm5hbWUgPSBGdWxsTmFtZV9zYXZlKHNmbmFtZSwgRkFMU0UpOworICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorICAgIC8qCisgICAgICogUmVwbGFjZSBhbGwgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMuICBUaGlzIG1ha2VzIHRoZQorICAgICAqIGF1dG9jb21tYW5kIHBhdHRlcm5zIHBvcnRhYmxlIGJldHdlZW4gVW5peCBhbmQgTVMtRE9TLgorICAgICAqLworICAgIHNmbmFtZSA9IHZpbV9zdHJzYXZlKHNmbmFtZSk7CisgICAgaWYgKHNmbmFtZSAhPSBOVUxMKQorCWZvcndhcmRfc2xhc2goc2ZuYW1lKTsKKyAgICBmb3J3YXJkX3NsYXNoKGZuYW1lKTsKKyNlbmRpZgorCisgICAgZm9yIChhcCA9IGZpcnN0X2F1dG9wYXRbKGludClldmVudF07IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJaWYgKGFwLT5wYXQgIT0gTlVMTCAmJiBhcC0+Y21kcyAhPSBOVUxMCisJCSYmIG1hdGNoX2ZpbGVfcGF0KGFwLT5yZWdfcGF0LCBmbmFtZSwgc2ZuYW1lLCB0YWlsLAorCQkJCQkJCSAgICAgIGFwLT5hbGxvd19kaXJzKSkKKwl7CisJICAgIHJldHZhbCA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKworICAgIHZpbV9mcmVlKGZuYW1lKTsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyAgICB2aW1fZnJlZShzZm5hbWUpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgbGlzdCBvZiBhdXRvY29tbWFuZCBncm91cAorICogbmFtZXMuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGNoYXJfdSAqCitnZXRfYXVncm91cF9uYW1lKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIGlmIChpZHggPT0gYXVncm91cHMuZ2FfbGVuKQkJLyogYWRkICJFTkQiIGFkZCB0aGUgZW5kICovCisJcmV0dXJuIChjaGFyX3UgKikiRU5EIjsKKyAgICBpZiAoaWR4ID49IGF1Z3JvdXBzLmdhX2xlbikJCS8qIGVuZCBvZiBsaXN0ICovCisJcmV0dXJuIE5VTEw7CisgICAgaWYgKEFVR1JPVVBfTkFNRShpZHgpID09IE5VTEwpCS8qIHNraXAgZGVsZXRlZCBlbnRyaWVzICovCisJcmV0dXJuIChjaGFyX3UgKikiIjsKKyAgICByZXR1cm4gQVVHUk9VUF9OQU1FKGlkeCk7CQkvKiByZXR1cm4gYSBuYW1lICovCit9CisKK3N0YXRpYyBpbnQgaW5jbHVkZV9ncm91cHMgPSBGQUxTRTsKKworICAgIGNoYXJfdSAgKgorc2V0X2NvbnRleHRfaW5fYXV0b2NtZCh4cCwgYXJnLCBkb2F1dG9jbWQpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJZG9hdXRvY21kOwkvKiBUUlVFIGZvciA6ZG9hdXRvY21kLCBGQUxTRSBmb3IgOmF1dG9jbWQgKi8KK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlncm91cDsKKworICAgIC8qIGNoZWNrIGZvciBhIGdyb3VwIG5hbWUsIHNraXAgaXQgaWYgcHJlc2VudCAqLworICAgIGluY2x1ZGVfZ3JvdXBzID0gRkFMU0U7CisgICAgcCA9IGFyZzsKKyAgICBncm91cCA9IGF1X2dldF9ncm91cGFyZygmYXJnKTsKKyAgICBpZiAoZ3JvdXAgPT0gQVVHUk9VUF9FUlJPUikKKwlyZXR1cm4gTlVMTDsKKyAgICAvKiBJZiB0aGVyZSBvbmx5IGlzIGEgZ3JvdXAgbmFtZSB0aGF0J3Mgd2hhdCB3ZSBleHBhbmQuICovCisgICAgaWYgKCphcmcgPT0gTlVMICYmIGdyb3VwICE9IEFVR1JPVVBfQUxMICYmICF2aW1faXN3aGl0ZShhcmdbLTFdKSkKKyAgICB7CisJYXJnID0gcDsKKwlncm91cCA9IEFVR1JPVVBfQUxMOworICAgIH0KKworICAgIC8qIHNraXAgb3ZlciBldmVudCBuYW1lICovCisgICAgZm9yIChwID0gYXJnOyAqcCAhPSBOVUwgJiYgIXZpbV9pc3doaXRlKCpwKTsgKytwKQorCWlmICgqcCA9PSAnLCcpCisJICAgIGFyZyA9IHAgKyAxOworICAgIGlmICgqcCA9PSBOVUwpCisgICAgeworCWlmIChncm91cCA9PSBBVUdST1VQX0FMTCkKKwkgICAgaW5jbHVkZV9ncm91cHMgPSBUUlVFOworCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0VWRU5UUzsJICAgIC8qIGV4cGFuZCBldmVudCBuYW1lICovCisJeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogc2tpcCBvdmVyIHBhdHRlcm4gKi8KKyAgICBhcmcgPSBza2lwd2hpdGUocCk7CisgICAgd2hpbGUgKCphcmcgJiYgKCF2aW1faXN3aGl0ZSgqYXJnKSB8fCBhcmdbLTFdID09ICdcXCcpKQorCWFyZysrOworICAgIGlmICgqYXJnKQorCXJldHVybiBhcmc7CQkJICAgIC8qIGV4cGFuZCAobmV4dCkgY29tbWFuZCAqLworCisgICAgaWYgKGRvYXV0b2NtZCkKKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9GSUxFUzsJICAgIC8qIGV4cGFuZCBmaWxlIG5hbWVzICovCisgICAgZWxzZQorCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX05PVEhJTkc7ICAgIC8qIHBhdHRlcm4gaXMgbm90IGV4cGFuZGVkICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXZlbiB0byBFeHBhbmRHZW5lcmljKCkgdG8gb2J0YWluIHRoZSBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X2V2ZW50X25hbWUoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgaWYgKGlkeCA8IGF1Z3JvdXBzLmdhX2xlbikJCS8qIEZpcnN0IGxpc3QgZ3JvdXAgbmFtZXMsIGlmIHdhbnRlZCAqLworICAgIHsKKwlpZiAoIWluY2x1ZGVfZ3JvdXBzIHx8IEFVR1JPVVBfTkFNRShpZHgpID09IE5VTEwpCisJICAgIHJldHVybiAoY2hhcl91ICopIiI7CS8qIHNraXAgZGVsZXRlZCBlbnRyaWVzICovCisJcmV0dXJuIEFVR1JPVVBfTkFNRShpZHgpOwkvKiByZXR1cm4gYSBuYW1lICovCisgICAgfQorICAgIHJldHVybiAoY2hhcl91ICopZXZlbnRfbmFtZXNbaWR4IC0gYXVncm91cHMuZ2FfbGVuXS5uYW1lOworfQorCisjZW5kaWYJLyogRkVBVF9DTURMX0NPTVBMICovCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBhbiBhdXRvY29tbWFuZCBpcyBkZWZpbmVkIGZvciAiZXZlbnQiIGFuZCAicGF0dGVybiIuCisgKiAicGF0dGVybiIgY2FuIGJlIE5VTEwgdG8gYWNjZXB0IGFueSBwYXR0ZXJuLgorICovCisgICAgaW50CithdV9leGlzdHMobmFtZSwgbmFtZV9lbmQsIHBhdHRlcm4pCisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqbmFtZV9lbmQ7CisgICAgY2hhcl91CSpwYXR0ZXJuOworeworICAgIGNoYXJfdQkqZXZlbnRfbmFtZTsKKyAgICBjaGFyX3UJKnA7CisgICAgRVZFTlRfVAlldmVudDsKKyAgICBBdXRvUGF0CSphcDsKKworICAgIC8qIGZpbmQgdGhlIGluZGV4IChlbnVtKSBmb3IgdGhlIGV2ZW50IG5hbWUgKi8KKyAgICBldmVudF9uYW1lID0gdmltX3N0cm5zYXZlKG5hbWUsIChpbnQpKG5hbWVfZW5kIC0gbmFtZSkpOworICAgIGlmIChldmVudF9uYW1lID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworICAgIGV2ZW50ID0gZXZlbnRfbmFtZTJucihldmVudF9uYW1lLCAmcCk7CisgICAgdmltX2ZyZWUoZXZlbnRfbmFtZSk7CisKKyAgICAvKiByZXR1cm4gRkFMU0UgaWYgdGhlIGV2ZW50IG5hbWUgaXMgbm90IHJlY29nbml6ZWQgKi8KKyAgICBpZiAoZXZlbnQgPT0gTlVNX0VWRU5UUykJICAgIC8qIHVua25vd24gZXZlbnQgbmFtZSAqLworCXJldHVybiBGQUxTRTsKKworICAgIC8qIEZpbmQgdGhlIGZpcnN0IGF1dG9jb21tYW5kIGZvciB0aGlzIGV2ZW50LgorICAgICAqIElmIHRoZXJlIGlzbid0IGFueSwgcmV0dXJuIEZBTFNFOworICAgICAqIElmIHRoZXJlIGlzIG9uZSBhbmQgbm8gcGF0dGVybiBnaXZlbiwgcmV0dXJuIFRSVUU7ICovCisgICAgYXAgPSBmaXJzdF9hdXRvcGF0WyhpbnQpZXZlbnRdOworICAgIGlmIChhcCA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAocGF0dGVybiA9PSBOVUxMKQorCXJldHVybiBUUlVFOworCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYXV0b2NvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gcGF0dGVybi4gKi8KKyAgICBmb3IgKCA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJLyogb25seSB1c2UgYSBwYXR0ZXJuIHdoZW4gaXQgaGFzIG5vdCBiZWVuIHJlbW92ZWQgYW5kIGhhcyBjb21tYW5kcyAqLworCWlmIChhcC0+cGF0ICE9IE5VTEwgJiYgYXAtPmNtZHMgIT0gTlVMTAorCQkJCQkgICAmJiBmbmFtZWNtcChhcC0+cGF0LCBwYXR0ZXJuKSA9PSAwKQorCSAgICByZXR1cm4gVFJVRTsKKworICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZgkvKiBGRUFUX0FVVE9DTUQgKi8KKworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKSB8fCBkZWZpbmVkKEZFQVRfV0lMRElHTikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUcnkgbWF0Y2hpbmcgYSBmaWxlbmFtZSB3aXRoIGEgcGF0dGVybi4KKyAqIFVzZWQgZm9yIGF1dG9jb21tYW5kcyBhbmQgJ3dpbGRpZ25vcmUnLgorICogUmV0dXJucyBUUlVFIGlmIHRoZXJlIGlzIGEgbWF0Y2gsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIGludAorbWF0Y2hfZmlsZV9wYXQocGF0dGVybiwgZm5hbWUsIHNmbmFtZSwgdGFpbCwgYWxsb3dfZGlycykKKyAgICBjaGFyX3UJKnBhdHRlcm47CQkvKiBwYXR0ZXJuIHRvIG1hdGNoIHdpdGggKi8KKyAgICBjaGFyX3UJKmZuYW1lOwkJCS8qIGZ1bGwgcGF0aCBvZiBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKnNmbmFtZTsJCS8qIHNob3J0IGZpbGUgbmFtZSBvciBOVUxMICovCisgICAgY2hhcl91CSp0YWlsOwkJCS8qIHRhaWwgb2YgcGF0aCAqLworICAgIGludAkJYWxsb3dfZGlyczsJCS8qIGFsbG93IG1hdGNoaW5nIHdpdGggZGlyICovCit7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICBpbnQJCXJlc3VsdCA9IEZBTFNFOworI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorICAgIGludAkJbm9fcGF0dGVybiA9IEZBTFNFOyAvKiBUUlVFIGlmIGNoZWNrIGlzIGZpbGV0eXBlIG9ubHkgKi8KKyAgICBjaGFyX3UJKnR5cGVfc3RhcnQ7CisgICAgY2hhcl91CWM7CisgICAgaW50CQltYXRjaCA9IEZBTFNFOworI2VuZGlmCisKKyNpZmRlZiBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FCisgICAgcmVnbWF0Y2gucm1faWMgPSBUUlVFOwkJLyogQWx3YXlzIGlnbm9yZSBjYXNlICovCisjZWxzZQorICAgIHJlZ21hdGNoLnJtX2ljID0gRkFMU0U7CQkvKiBEb24ndCBldmVyIGlnbm9yZSBjYXNlICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX09TRklMRVRZUEUKKyAgICBpZiAoKnBhdHRlcm4gPT0gJzwnKQorICAgIHsKKwkvKiBUaGVyZSBpcyBhIGZpbGV0eXBlIGNvbmRpdGlvbiBzcGVjaWZpZWQgd2l0aCB0aGlzIHBhdHRlcm4uCisJICogQ2hlY2sgdGhlIGZpbGV0eXBlIG1hdGNoZXMgZmlyc3QuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHdpdGggdGhlCisJICogcGF0dGVybiAoc2V0IHJlZ3Byb2cgdG8gTlVMTCkuCisJICogQWx3YXlzIHVzZSBtYWdpYyBmb3IgdGhlIHJlZ2V4cC4KKwkgKi8KKworCWZvciAodHlwZV9zdGFydCA9IHBhdHRlcm4gKyAxOyAoYyA9ICpwYXR0ZXJuKTsgcGF0dGVybisrKQorCXsKKwkgICAgaWYgKChjID09ICc7JyB8fCBjID09ICc+JykgJiYgbWF0Y2ggPT0gRkFMU0UpCisJICAgIHsKKwkJKnBhdHRlcm4gPSBOVUw7CSAgICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCQltYXRjaCA9IG1jaF9jaGVja19maWxldHlwZShmbmFtZSwgdHlwZV9zdGFydCk7CisJCSpwYXR0ZXJuID0gYzsJICAgIC8qIFJlc3RvcmUgdGhlIHRlcm1pbmF0b3IgKi8KKwkJdHlwZV9zdGFydCA9IHBhdHRlcm4gKyAxOworCSAgICB9CisJICAgIGlmIChjID09ICc+JykKKwkJYnJlYWs7CisJfQorCisJLyogKGMgc2hvdWxkIG5ldmVyIGJlIE5VTCwgYnV0IGNoZWNrIGFueXdheSkgKi8KKwlpZiAobWF0Y2ggPT0gRkFMU0UgfHwgYyA9PSBOVUwpCisJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBOVUxMOwkvKiBEb2Vzbid0IG1hdGNoIC0gZG9uJ3QgY2hlY2sgcGF0LiAqLworCWVsc2UgaWYgKCpwYXR0ZXJuID09IE5VTCkKKwl7CisJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBOVUxMOwkvKiBWaW0gd2lsbCB0cnkgdG8gZnJlZSByZWdwcm9nIGxhdGVyICovCisJICAgIG5vX3BhdHRlcm4gPSBUUlVFOwkvKiBBbHdheXMgbWF0Y2hlcyAtIGRvbid0IGNoZWNrIHBhdC4gKi8KKwl9CisJZWxzZQorCSAgICByZWdtYXRjaC5yZWdwcm9nID0gdmltX3JlZ2NvbXAocGF0dGVybiArIDEsIFJFX01BR0lDKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJcmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKHBhdHRlcm4sIFJFX01BR0lDKTsKKworICAgIC8qCisgICAgICogVHJ5IGZvciBhIG1hdGNoIHdpdGggdGhlIHBhdHRlcm4gd2l0aDoKKyAgICAgKiAxLiB0aGUgZnVsbCBmaWxlIG5hbWUsIHdoZW4gdGhlIHBhdHRlcm4gaGFzIGEgJy8nLgorICAgICAqIDIuIHRoZSBzaG9ydCBmaWxlIG5hbWUsIHdoZW4gdGhlIHBhdHRlcm4gaGFzIGEgJy8nLgorICAgICAqIDMuIHRoZSB0YWlsIG9mIHRoZSBmaWxlIG5hbWUsIHdoZW4gdGhlIHBhdHRlcm4gaGFzIG5vICcvJy4KKyAgICAgKi8KKyAgICBpZiAoCisjaWZkZWYgRkVBVF9PU0ZJTEVUWVBFCisJICAgIC8qIElmIHRoZSBjaGVjayBpcyBmb3IgYSBmaWxldHlwZSBvbmx5IGFuZCB3ZSBkb24ndCBjYXJlCisJICAgICAqIGFib3V0IHRoZSBwYXRoIHRoZW4gc2tpcCBhbGwgdGhlIHJlZ2V4cCBzdHVmZi4KKwkgICAgICovCisJICAgIG5vX3BhdHRlcm4gfHwKKyNlbmRpZgorCSAgICAocmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMCisJICAgICAmJiAoKGFsbG93X2RpcnMKKwkJICAgICAmJiAodmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBmbmFtZSwgKGNvbG5yX1QpMCkKKwkJCSB8fCAoc2ZuYW1lICE9IE5VTEwKKwkJCSAgICAgJiYgdmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBzZm5hbWUsIChjb2xucl9UKTApKSkpCisJCSB8fCAoIWFsbG93X2RpcnMgJiYgdmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCB0YWlsLCAoY29sbnJfVCkwKSkpKSkKKwlyZXN1bHQgPSBUUlVFOworCisgICAgdmltX2ZyZWUocmVnbWF0Y2gucmVncHJvZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1dJTERJR04pIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgaWYgYSBmaWxlIG1hdGNoZXMgd2l0aCBhIHBhdHRlcm4gaW4gImxpc3QiLgorICogImxpc3QiIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMsIGxpa2UgJ3dpbGRpZ25vcmUnLgorICogInNmbmFtZSIgaXMgdGhlIHNob3J0IGZpbGUgbmFtZSBvciBOVUxMLCAiZmZuYW1lIiB0aGUgbG9uZyBmaWxlIG5hbWUuCisgKi8KKyAgICBpbnQKK21hdGNoX2ZpbGVfbGlzdChsaXN0LCBzZm5hbWUsIGZmbmFtZSkKKyAgICBjaGFyX3UJKmxpc3Q7CisgICAgY2hhcl91CSpzZm5hbWU7CisgICAgY2hhcl91CSpmZm5hbWU7Cit7CisgICAgY2hhcl91CWJ1ZlsxMDBdOworICAgIGNoYXJfdQkqdGFpbDsKKyAgICBjaGFyX3UJKnJlZ3BhdDsKKyAgICBjaGFyCWFsbG93X2RpcnM7CisgICAgaW50CQltYXRjaDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICB0YWlsID0gZ2V0dGFpbChzZm5hbWUpOworCisgICAgLyogdHJ5IGFsbCBwYXR0ZXJucyBpbiAnd2lsZGlnbm9yZScgKi8KKyAgICBwID0gbGlzdDsKKyAgICB3aGlsZSAoKnApCisgICAgeworCWNvcHlfb3B0aW9uX3BhcnQoJnAsIGJ1ZiwgMTAwLCAiLCIpOworCXJlZ3BhdCA9IGZpbGVfcGF0X3RvX3JlZ19wYXQoYnVmLCBOVUxMLCAmYWxsb3dfZGlycywgRkFMU0UpOworCWlmIChyZWdwYXQgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJbWF0Y2ggPSBtYXRjaF9maWxlX3BhdChyZWdwYXQsIGZmbmFtZSwgc2ZuYW1lLCB0YWlsLCAoaW50KWFsbG93X2RpcnMpOworCXZpbV9mcmVlKHJlZ3BhdCk7CisJaWYgKG1hdGNoKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IHRoZSBnaXZlbiBwYXR0ZXJuICJwYXQiIHdoaWNoIGhhcyBzaGVsbCBzdHlsZSB3aWxkY2FyZHMgaW4gaXQsIGludG8KKyAqIGEgcmVndWxhciBleHByZXNzaW9uLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4gYWxsb2NhdGVkIG1lbW9yeS4gIElmIHRoZXJlCisgKiBpcyBhIGRpcmVjdG9yeSBwYXRoIHNlcGFyYXRvciB0byBiZSBtYXRjaGVkLCB0aGVuIFRSVUUgaXMgcHV0IGluCisgKiBhbGxvd19kaXJzLCBvdGhlcndpc2UgRkFMU0UgaXMgcHV0IHRoZXJlIC0tIHdlYmIuCisgKiBIYW5kbGUgYmFja3NsYXNoZXMgYmVmb3JlIHNwZWNpYWwgY2hhcmFjdGVycywgbGlrZSAiXCoiIGFuZCAiXCAiLgorICoKKyAqIElmIEZFQVRfT1NGSUxFVFlQRSBkZWZpbmVkIHRoZW4gcGFzcyBpbml0aWFsIDx0eXBlPiB0aHJvdWdoIHVuY2hhbmdlZC4gRWc6CisgKiAnPGh0bWw+bXlmaWxlJyBiZWNvbWVzICc8aHRtbD5ebXlmaWxlJCcgLS0gbGVvbmFyZC4KKyAqCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZmlsZV9wYXRfdG9fcmVnX3BhdChwYXQsIHBhdF9lbmQsIGFsbG93X2RpcnMsIG5vX2JzbGFzaCkKKyAgICBjaGFyX3UJKnBhdDsKKyAgICBjaGFyX3UJKnBhdF9lbmQ7CS8qIGZpcnN0IGNoYXIgYWZ0ZXIgcGF0dGVybiBvciBOVUxMICovCisgICAgY2hhcgkqYWxsb3dfZGlyczsJLyogUmVzdWx0IHBhc3NlZCBiYWNrIG91dCBpbiBoZXJlICovCisgICAgaW50CQlub19ic2xhc2g7CS8qIERvbid0IHVzZSBhIGJhY2t3YXJkIHNsYXNoIGFzIHBhdGhzZXAgKi8KK3sKKyAgICBpbnQJCXNpemU7CisgICAgY2hhcl91CSplbmRwOworICAgIGNoYXJfdQkqcmVnX3BhdDsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworICAgIGludAkJbmVzdGVkID0gMDsKKyAgICBpbnQJCWFkZF9kb2xsYXIgPSBUUlVFOworI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorICAgIGludAkJY2hlY2tfbGVuZ3RoID0gMDsKKyNlbmRpZgorCisgICAgaWYgKGFsbG93X2RpcnMgIT0gTlVMTCkKKwkqYWxsb3dfZGlycyA9IEZBTFNFOworICAgIGlmIChwYXRfZW5kID09IE5VTEwpCisJcGF0X2VuZCA9IHBhdCArIFNUUkxFTihwYXQpOworCisjaWZkZWYgRkVBVF9PU0ZJTEVUWVBFCisgICAgLyogRmluZCBvdXQgaG93IG11Y2ggb2YgdGhlIHN0cmluZyBpcyB0aGUgZmlsZXR5cGUgY2hlY2sgKi8KKyAgICBpZiAoKnBhdCA9PSAnPCcpCisgICAgeworCS8qIENvdW50IGNoYXJzIHVudGlsIHRoZSBuZXh0ICc+JyAqLworCWZvciAocCA9IHBhdCArIDE7IHAgPCBwYXRfZW5kICYmICpwICE9ICc+JzsgcCsrKQorCSAgICA7CisJaWYgKHAgPCBwYXRfZW5kKQorCXsKKwkgICAgLyogUGF0dGVybiBpcyBvZiB0aGUgZm9ybSA8Lio+LiogICovCisJICAgIGNoZWNrX2xlbmd0aCA9IHAgLSBwYXQgKyAxOworCSAgICBpZiAocCArIDEgPj0gcGF0X2VuZCkKKwkgICAgeworCQkvKiBUaGUgJ3BhdHRlcm4nIGlzIGEgZmlsZXR5cGUgY2hlY2sgT05MWSAqLworCQlyZWdfcGF0ID0gKGNoYXJfdSAqKWFsbG9jKGNoZWNrX2xlbmd0aCArIDEpOworCQlpZiAocmVnX3BhdCAhPSBOVUxMKQorCQl7CisJCSAgICBtY2hfbWVtbW92ZShyZWdfcGF0LCBwYXQsIChzaXplX3QpY2hlY2tfbGVuZ3RoKTsKKwkJICAgIHJlZ19wYXRbY2hlY2tfbGVuZ3RoXSA9IE5VTDsKKwkJfQorCQlyZXR1cm4gcmVnX3BhdDsKKwkgICAgfQorCX0KKwkvKiBlbHNlOiB0aGVyZSB3YXMgbm8gY2xvc2luZyAnPicgLSBhc3N1bWUgaXQgd2FzIGEgbm9ybWFsIHBhdHRlcm4gKi8KKworICAgIH0KKyAgICBwYXQgKz0gY2hlY2tfbGVuZ3RoOworICAgIHNpemUgPSAyICsgY2hlY2tfbGVuZ3RoOworI2Vsc2UKKyAgICBzaXplID0gMjsJCS8qICdeJyBhdCBzdGFydCwgJyQnIGF0IGVuZCAqLworI2VuZGlmCisKKyAgICBmb3IgKHAgPSBwYXQ7IHAgPCBwYXRfZW5kOyBwKyspCisgICAgeworCXN3aXRjaCAoKnApCisJeworCSAgICBjYXNlICcqJzoKKwkgICAgY2FzZSAnLic6CisJICAgIGNhc2UgJywnOgorCSAgICBjYXNlICd7JzoKKwkgICAgY2FzZSAnfSc6CisJICAgIGNhc2UgJ34nOgorCQlzaXplICs9IDI7CS8qIGV4dHJhIGJhY2tzbGFzaCAqLworCQlicmVhazsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkgICAgY2FzZSAnXFwnOgorCSAgICBjYXNlICcvJzoKKwkJc2l6ZSArPSA0OwkvKiBjb3VsZCBiZWNvbWUgIltcL10iICovCisJCWJyZWFrOworI2VuZGlmCisJICAgIGRlZmF1bHQ6CisJCXNpemUrKzsKKyMgaWZkZWYgIEZFQVRfTUJZVEUKKwkJaWYgKGVuY19kYmNzICE9IDAgJiYgKCptYl9wdHIybGVuX2NoZWNrKShwKSA+IDEpCisJCXsKKwkJICAgICsrcDsKKwkJICAgICsrc2l6ZTsKKwkJfQorIyBlbmRpZgorCQlicmVhazsKKwl9CisgICAgfQorICAgIHJlZ19wYXQgPSBhbGxvYyhzaXplICsgMSk7CisgICAgaWYgKHJlZ19wYXQgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorICAgIC8qIENvcHkgdGhlIHR5cGUgY2hlY2sgaW4gdG8gdGhlIHN0YXJ0LiAqLworICAgIGlmIChjaGVja19sZW5ndGgpCisJbWNoX21lbW1vdmUocmVnX3BhdCwgcGF0IC0gY2hlY2tfbGVuZ3RoLCAoc2l6ZV90KWNoZWNrX2xlbmd0aCk7CisgICAgaSA9IGNoZWNrX2xlbmd0aDsKKyNlbHNlCisgICAgaSA9IDA7CisjZW5kaWYKKworICAgIGlmIChwYXRbMF0gPT0gJyonKQorCXdoaWxlIChwYXRbMF0gPT0gJyonICYmIHBhdCA8IHBhdF9lbmQgLSAxKQorCSAgICBwYXQrKzsKKyAgICBlbHNlCisJcmVnX3BhdFtpKytdID0gJ14nOworICAgIGVuZHAgPSBwYXRfZW5kIC0gMTsKKyAgICBpZiAoKmVuZHAgPT0gJyonKQorICAgIHsKKwl3aGlsZSAoZW5kcCAtIHBhdCA+IDAgJiYgKmVuZHAgPT0gJyonKQorCSAgICBlbmRwLS07CisJYWRkX2RvbGxhciA9IEZBTFNFOworICAgIH0KKyAgICBmb3IgKHAgPSBwYXQ7ICpwICYmIG5lc3RlZCA+PSAwICYmIHAgPD0gZW5kcDsgcCsrKQorICAgIHsKKwlzd2l0Y2ggKCpwKQorCXsKKwkgICAgY2FzZSAnKic6CisJCXJlZ19wYXRbaSsrXSA9ICcuJzsKKwkJcmVnX3BhdFtpKytdID0gJyonOworCQlicmVhazsKKwkgICAgY2FzZSAnLic6CisjaWZkZWYgUklTQ09TCisJCWlmIChhbGxvd19kaXJzICE9IE5VTEwpCisJCSAgICAgKmFsbG93X2RpcnMgPSBUUlVFOworCQkvKiBGQUxMVEhST1VHSCAqLworI2VuZGlmCisJICAgIGNhc2UgJ34nOgorCQlyZWdfcGF0W2krK10gPSAnXFwnOworCQlyZWdfcGF0W2krK10gPSAqcDsKKwkJYnJlYWs7CisJICAgIGNhc2UgJz8nOgorI2lmZGVmIFJJU0NPUworCSAgICBjYXNlICcjJzoKKyNlbmRpZgorCQlyZWdfcGF0W2krK10gPSAnLic7CisJCWJyZWFrOworCSAgICBjYXNlICdcXCc6CisJCWlmIChwWzFdID09IE5VTCkKKwkJICAgIGJyZWFrOworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCQlpZiAoIW5vX2JzbGFzaCkKKwkJeworCQkgICAgLyogdHJhbnNsYXRlOgorCQkgICAgICogIlx4IiB0byAiXFx4IiAgZS5nLiwgImRpclxmaWxlIgorCQkgICAgICogIlwqIiB0byAiXFwuKiIgZS5nLiwgImRpclwqLmMiCisJCSAgICAgKiAiXD8iIHRvICJcXC4iICBlLmcuLCAiZGlyXD8/LmMiCisJCSAgICAgKiAiXCsiIHRvICJcKyIgICBlLmcuLCAiZmlsZVhcKy5jIgorCQkgICAgICovCisJCSAgICBpZiAoKHZpbV9pc2ZpbGVjKHBbMV0pIHx8IHBbMV0gPT0gJyonIHx8IHBbMV0gPT0gJz8nKQorCQkJICAgICYmIHBbMV0gIT0gJysnKQorCQkgICAgeworCQkJcmVnX3BhdFtpKytdID0gJ1snOworCQkJcmVnX3BhdFtpKytdID0gJ1xcJzsKKwkJCXJlZ19wYXRbaSsrXSA9ICcvJzsKKwkJCXJlZ19wYXRbaSsrXSA9ICddJzsKKwkJCWlmIChhbGxvd19kaXJzICE9IE5VTEwpCisJCQkgICAgKmFsbG93X2RpcnMgPSBUUlVFOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCQlpZiAoKisrcCA9PSAnPycKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJCSYmIG5vX2JzbGFzaAorI2VuZGlmCisJCQkpCisJCSAgICByZWdfcGF0W2krK10gPSAnPyc7CisJCWVsc2UKKwkJICAgIGlmICgqcCA9PSAnLCcpCisJCQlyZWdfcGF0W2krK10gPSAnLCc7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpZiAoYWxsb3dfZGlycyAhPSBOVUxMICYmIHZpbV9pc3BhdGhzZXAoKnApCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJCQkJJiYgKCFub19ic2xhc2ggfHwgKnAgIT0gJ1xcJykKKyNlbmRpZgorCQkJCSkKKwkJCSAgICAqYWxsb3dfZGlycyA9IFRSVUU7CisJCQlyZWdfcGF0W2krK10gPSAnXFwnOworCQkJcmVnX3BhdFtpKytdID0gKnA7CisJCSAgICB9CisJCWJyZWFrOworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCSAgICBjYXNlICcvJzoKKwkJcmVnX3BhdFtpKytdID0gJ1snOworCQlyZWdfcGF0W2krK10gPSAnXFwnOworCQlyZWdfcGF0W2krK10gPSAnLyc7CisJCXJlZ19wYXRbaSsrXSA9ICddJzsKKwkJaWYgKGFsbG93X2RpcnMgIT0gTlVMTCkKKwkJICAgICphbGxvd19kaXJzID0gVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSAneyc6CisJCXJlZ19wYXRbaSsrXSA9ICdcXCc7CisJCXJlZ19wYXRbaSsrXSA9ICcoJzsKKwkJbmVzdGVkKys7CisJCWJyZWFrOworCSAgICBjYXNlICd9JzoKKwkJcmVnX3BhdFtpKytdID0gJ1xcJzsKKwkJcmVnX3BhdFtpKytdID0gJyknOworCQktLW5lc3RlZDsKKwkJYnJlYWs7CisJICAgIGNhc2UgJywnOgorCQlpZiAobmVzdGVkKQorCQl7CisJCSAgICByZWdfcGF0W2krK10gPSAnXFwnOworCQkgICAgcmVnX3BhdFtpKytdID0gJ3wnOworCQl9CisJCWVsc2UKKwkJICAgIHJlZ19wYXRbaSsrXSA9ICcsJzsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisjIGlmZGVmICBGRUFUX01CWVRFCisJCWlmIChlbmNfZGJjcyAhPSAwICYmICgqbWJfcHRyMmxlbl9jaGVjaykocCkgPiAxKQorCQkgICAgcmVnX3BhdFtpKytdID0gKnArKzsKKwkJZWxzZQorIyBlbmRpZgorCQlpZiAoYWxsb3dfZGlycyAhPSBOVUxMICYmIHZpbV9pc3BhdGhzZXAoKnApKQorCQkgICAgKmFsbG93X2RpcnMgPSBUUlVFOworCQlyZWdfcGF0W2krK10gPSAqcDsKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoYWRkX2RvbGxhcikKKwlyZWdfcGF0W2krK10gPSAnJCc7CisgICAgcmVnX3BhdFtpXSA9IE5VTDsKKyAgICBpZiAobmVzdGVkICE9IDApCisgICAgeworCWlmIChuZXN0ZWQgPCAwKQorCSAgICBFTVNHKF8oIkUyMTk6IE1pc3Npbmcgey4iKSk7CisJZWxzZQorCSAgICBFTVNHKF8oIkUyMjA6IE1pc3NpbmcgfS4iKSk7CisJdmltX2ZyZWUocmVnX3BhdCk7CisJcmVnX3BhdCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiByZWdfcGF0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2ZvbGQuYyBiL3NyYy9mb2xkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhYzAwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mb2xkLmMKQEAgLTAsMCArMSwzMjUwIEBACisvKiB2aW06c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqIHZpbTYwMDpmZG09bWFya2VyIGZkbD0xIGZkYz0zOgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBmb2xkLmM6IGNvZGUgZm9yIGZvbGRpbmcKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZiBkZWZpbmVkKEZFQVRfRk9MRElORykgfHwgZGVmaW5lZChQUk9UTykKKworLyogbG9jYWwgZGVjbGFyYXRpb25zLiB7e3sxICovCisvKiB0eXBlZGVmIGZvbGRfVCB7e3syICovCisvKgorICogVGhlIHRvcGxldmVsIGZvbGRzIGZvciBlYWNoIHdpbmRvdyBhcmUgc3RvcmVkIGluIHRoZSB3X2ZvbGRzIGdyb3dhcnJheS4KKyAqIEVhY2ggdG9wbGV2ZWwgZm9sZCBjYW4gY29udGFpbiBhbiBhcnJheSBvZiBzZWNvbmQgbGV2ZWwgZm9sZHMgaW4gdGhlCisgKiBmZF9uZXN0ZWQgZ3Jvd2FycmF5LgorICogVGhlIGluZm8gc3RvcmVkIGluIGJvdGggZ3Jvd2FycmF5cyBpcyB0aGUgc2FtZTogQW4gYXJyYXkgb2YgZm9sZF9ULgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGxpbmVucl9UCWZkX3RvcDsJCS8qIGZpcnN0IGxpbmUgb2YgZm9sZDsgZm9yIG5lc3RlZCBmb2xkCisJCQkJICogcmVsYXRpdmUgdG8gcGFyZW50ICovCisgICAgbGluZW5yX1QJZmRfbGVuOwkJLyogbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmb2xkICovCisgICAgZ2FycmF5X1QJZmRfbmVzdGVkOwkvKiBhcnJheSBvZiBuZXN0ZWQgZm9sZHMgKi8KKyAgICBjaGFyCWZkX2ZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKyAgICBjaGFyCWZkX3NtYWxsOwkvKiBUUlVFLCBGQUxTRSBvciBNQVlCRTogZm9sZCBzbWFsbGVyIHRoYW4KKwkJCQkgICAnZm9sZG1pbmxpbmVzJzsgTUFZQkUgYXBwbGllcyB0byBuZXN0ZWQKKwkJCQkgICBmb2xkcyB0b28gKi8KK30gZm9sZF9UOworCisjZGVmaW5lIEZEX09QRU4JCTAJLyogZm9sZCBpcyBvcGVuIChuZXN0ZWQgb25lcyBjYW4gYmUgY2xvc2VkKSAqLworI2RlZmluZSBGRF9DTE9TRUQJMQkvKiBmb2xkIGlzIGNsb3NlZCAqLworI2RlZmluZSBGRF9MRVZFTAkyCS8qIGRlcGVuZHMgb24gJ2ZvbGRsZXZlbCcgKG5lc3RlZCBmb2xkcyB0b28pICovCisKKyNkZWZpbmUgTUFYX0xFVkVMCTIwCS8qIG1heGltdW0gZm9sZCBkZXB0aCAqLworCisvKiBzdGF0aWMgZnVuY3Rpb25zIHt7ezIgKi8KK3N0YXRpYyB2b2lkIG5ld0ZvbGRMZXZlbFdpbiBfX0FSR1MoKHdpbl9UICp3cCkpOworc3RhdGljIGludCBjaGVja0Nsb3NlUmVjIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgbGluZW5yX1QgbG51bSwgaW50IGxldmVsKSk7CitzdGF0aWMgaW50IGZvbGRGaW5kIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgbGluZW5yX1QgbG51bSwgZm9sZF9UICoqZnBwKSk7CitzdGF0aWMgaW50IGZvbGRMZXZlbFdpbiBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSkpOworc3RhdGljIHZvaWQgY2hlY2t1cGRhdGUgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyB2b2lkIHNldEZvbGRSZXBlYXQgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBsb25nIGNvdW50LCBpbnQgb3BlbikpOworc3RhdGljIGxpbmVucl9UIHNldE1hbnVhbEZvbGQgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBpbnQgb3BlbmluZywgaW50IHJlY3Vyc2UsIGludCAqZG9uZXApKTsKK3N0YXRpYyBsaW5lbnJfVCBzZXRNYW51YWxGb2xkV2luIF9fQVJHUygod2luX1QgKndwLCBsaW5lbnJfVCBsbnVtLCBpbnQgb3BlbmluZywgaW50IHJlY3Vyc2UsIGludCAqZG9uZXApKTsKK3N0YXRpYyB2b2lkIGZvbGRPcGVuTmVzdGVkIF9fQVJHUygoZm9sZF9UICpmcHIpKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZUZvbGRFbnRyeSBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGludCBpZHgsIGludCByZWN1cnNpdmUpKTsKK3N0YXRpYyB2b2lkIGZvbGRNYXJrQWRqdXN0UmVjdXJzZSBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGxpbmVucl9UIGxpbmUxLCBsaW5lbnJfVCBsaW5lMiwgbG9uZyBhbW91bnQsIGxvbmcgYW1vdW50X2FmdGVyKSk7CitzdGF0aWMgaW50IGdldERlZXBlc3ROZXN0aW5nUmVjdXJzZSBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3N0YXRpYyBpbnQgY2hlY2tfY2xvc2VkIF9fQVJHUygod2luX1QgKndpbiwgZm9sZF9UICpmcCwgaW50ICp1c2VfbGV2ZWxwLCBpbnQgbGV2ZWwsIGludCAqbWF5YmVfc21hbGxwLCBsaW5lbnJfVCBsbnVtX29mZikpOworc3RhdGljIHZvaWQgY2hlY2tTbWFsbCBfX0FSR1MoKHdpbl9UICp3cCwgZm9sZF9UICpmcCwgbGluZW5yX1QgbG51bV9vZmYpKTsKK3N0YXRpYyB2b2lkIHNldFNtYWxsTWF5YmUgX19BUkdTKChnYXJyYXlfVCAqZ2FwKSk7CitzdGF0aWMgdm9pZCBmb2xkQ3JlYXRlTWFya2VycyBfX0FSR1MoKGxpbmVucl9UIHN0YXJ0LCBsaW5lbnJfVCBlbmQpKTsKK3N0YXRpYyB2b2lkIGZvbGRBZGRNYXJrZXIgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjaGFyX3UgKm1hcmtlciwgaW50IG1hcmtlcmxlbikpOworc3RhdGljIHZvaWQgZGVsZXRlRm9sZE1hcmtlcnMgX19BUkdTKChmb2xkX1QgKmZwLCBpbnQgcmVjdXJzaXZlLCBsaW5lbnJfVCBsbnVtX29mZikpOworc3RhdGljIHZvaWQgZm9sZERlbE1hcmtlciBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGNoYXJfdSAqbWFya2VyLCBpbnQgbWFya2VybGVuKSk7CitzdGF0aWMgdm9pZCBmb2xkVXBkYXRlSUVNUyBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgdG9wLCBsaW5lbnJfVCBib3QpKTsKK3N0YXRpYyB2b2lkIHBhcnNlTWFya2VyIF9fQVJHUygod2luX1QgKndwKSk7CisKK3N0YXRpYyBjaGFyICplX25vZm9sZCA9IE5fKCJFNDkwOiBObyBmb2xkIGZvdW5kIik7CisKKy8qCisgKiBXaGlsZSB1cGRhdGluZyB0aGUgZm9sZHMgbGluZXMgYmV0d2VlbiBpbnZhbGlkX3RvcCBhbmQgaW52YWxpZF9ib3QgaGF2ZSBhbgorICogdW5kZWZpbmVkIGZvbGQgbGV2ZWwuICBPbmx5IHVzZWQgZm9yIHRoZSB3aW5kb3cgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyBsaW5lbnJfVCBpbnZhbGlkX3RvcCA9IChsaW5lbnJfVCkwOworc3RhdGljIGxpbmVucl9UIGludmFsaWRfYm90ID0gKGxpbmVucl9UKTA7CisKKy8qCisgKiBXaGVuIHVzaW5nICdmb2xkZXhwcicgd2Ugc29tZXRpbWVzIGdldCB0aGUgbGV2ZWwgb2YgdGhlIG5leHQgbGluZSwgd2hpY2gKKyAqIGNhbGxzIGZvbGRsZXZlbCgpIHRvIGdldCB0aGUgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZSwgd2hpY2ggaGFzbid0IGJlZW4KKyAqIHN0b3JlZCB5ZXQuICBUbyBnZXQgYXJvdW5kIHRoaXMgY2hpY2tlbi1lZ2cgcHJvYmxlbSB0aGUgbGV2ZWwgb2YgdGhlCisgKiBwcmV2aW91cyBsaW5lIGlzIHN0b3JlZCBoZXJlIHdoZW4gYXZhaWxhYmxlLiAgcHJldl9sbnVtIGlzIHplcm8gd2hlbiB0aGUKKyAqIGxldmVsIGlzIG5vdCBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBsaW5lbnJfVCBwcmV2X2xudW0gPSAwOworc3RhdGljIGludCBwcmV2X2xudW1fbHZsID0gLTE7CisKKy8qIEZsYWdzIHVzZWQgZm9yICJkb25lIiBhcmd1bWVudCBvZiBzZXRNYW51YWxGb2xkLiAqLworI2RlZmluZSBET05FX05PVEhJTkcJMAorI2RlZmluZSBET05FX0FDVElPTgkxCS8qIGRpZCBjbG9zZSBvciBvcGVuIGEgZm9sZCAqLworI2RlZmluZSBET05FX0ZPTEQJMgkvKiBkaWQgZmluZCBhIGZvbGQgKi8KKworc3RhdGljIGludCBmb2xkc3RhcnRtYXJrZXJsZW47CitzdGF0aWMgY2hhcl91ICpmb2xkZW5kbWFya2VyOworc3RhdGljIGludCBmb2xkZW5kbWFya2VybGVuOworCisvKiBFeHBvcnRlZCBmb2xkaW5nIGZ1bmN0aW9ucy4ge3t7MSAqLworLyogY29weUZvbGRpbmdTdGF0ZSgpIHt7ezIgKi8KKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDb3B5IHRoYXQgZm9sZGluZyBzdGF0ZSBmcm9tIHdpbmRvdyAid3BfZnJvbSIgdG8gd2luZG93ICJ3cF90byIuCisgKi8KKyAgICB2b2lkCitjb3B5Rm9sZGluZ1N0YXRlKHdwX2Zyb20sIHdwX3RvKQorICAgIHdpbl9UCSp3cF9mcm9tOworICAgIHdpbl9UCSp3cF90bzsKK3sKKyAgICB3cF90by0+d19mb2xkX21hbnVhbCA9IHdwX2Zyb20tPndfZm9sZF9tYW51YWw7CisgICAgd3BfdG8tPndfZm9sZGludmFsaWQgPSB3cF9mcm9tLT53X2ZvbGRpbnZhbGlkOworICAgIGNsb25lRm9sZEdyb3dBcnJheSgmd3BfZnJvbS0+d19mb2xkcywgJndwX3RvLT53X2ZvbGRzKTsKK30KKyNlbmRpZgorCisvKiBoYXNBbnlGb2xkaW5nKCkge3t7MiAqLworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZXJlIG1heSBiZSBmb2xkZWQgbGluZXMgaW4gdGhlIGN1cnJlbnQgd2luZG93LgorICovCisgICAgaW50CitoYXNBbnlGb2xkaW5nKHdpbikKKyAgICB3aW5fVAkqd2luOworeworICAgIC8qIHZlcnkgc2ltcGxlIG5vdywgYnV0IGNhbiBiZWNvbWUgbW9yZSBjb21wbGV4IGxhdGVyICovCisgICAgcmV0dXJuICh3aW4tPndfcF9mZW4KKwkgICAgJiYgKCFmb2xkbWV0aG9kSXNNYW51YWwod2luKSB8fCB3aW4tPndfZm9sZHMuZ2FfbGVuID4gMCkpOworfQorCisvKiBoYXNGb2xkaW5nKCkge3t7MiAqLworLyoKKyAqIFJldHVybiBUUlVFIGlmIGxpbmUgImxudW0iIGluIHRoZSBjdXJyZW50IHdpbmRvdyBpcyBwYXJ0IG9mIGEgY2xvc2VkCisgKiBmb2xkLgorICogV2hlbiByZXR1cm5pbmcgVFJVRSwgKmZpcnN0cCBhbmQgKmxhc3RwIGFyZSBzZXQgdG8gdGhlIGZpcnN0IGFuZCBsYXN0CisgKiBsbnVtIG9mIHRoZSBzZXF1ZW5jZSBvZiBmb2xkZWQgbGluZXMgKHNraXBwZWQgd2hlbiBOVUxMKS4KKyAqLworICAgIGludAoraGFzRm9sZGluZyhsbnVtLCBmaXJzdHAsIGxhc3RwKQorICAgIGxpbmVucl9UCWxudW07CisgICAgbGluZW5yX1QJKmZpcnN0cDsKKyAgICBsaW5lbnJfVAkqbGFzdHA7Cit7CisgICAgcmV0dXJuIGhhc0ZvbGRpbmdXaW4oY3Vyd2luLCBsbnVtLCBmaXJzdHAsIGxhc3RwLCBUUlVFLCBOVUxMKTsKK30KKworLyogaGFzRm9sZGluZ1dpbigpIHt7ezIgKi8KKyAgICBpbnQKK2hhc0ZvbGRpbmdXaW4od2luLCBsbnVtLCBmaXJzdHAsIGxhc3RwLCBjYWNoZSwgaW5mb3ApCisgICAgd2luX1QJKndpbjsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxpbmVucl9UCSpmaXJzdHA7CisgICAgbGluZW5yX1QJKmxhc3RwOworICAgIGludAkJY2FjaGU7CQkvKiB3aGVuIFRSVUU6IHVzZSBjYWNoZWQgdmFsdWVzIG9mIHdpbmRvdyAqLworICAgIGZvbGRpbmZvX1QJKmluZm9wOwkJLyogd2hlcmUgdG8gc3RvcmUgZm9sZCBpbmZvICovCit7CisgICAgaW50CQloYWRfZm9sZGVkID0gRkFMU0U7CisgICAgbGluZW5yX1QJZmlyc3QgPSAwOworICAgIGxpbmVucl9UCWxhc3QgPSAwOworICAgIGxpbmVucl9UCWxudW1fcmVsID0gbG51bTsKKyAgICBpbnQJCXg7CisgICAgZm9sZF9UCSpmcDsKKyAgICBpbnQJCWxldmVsID0gMDsKKyAgICBpbnQJCXVzZV9sZXZlbCA9IEZBTFNFOworICAgIGludAkJbWF5YmVfc21hbGwgPSBGQUxTRTsKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGludAkJbG93X2xldmVsID0gMDs7CisKKyAgICBjaGVja3VwZGF0ZSh3aW4pOworICAgIC8qCisgICAgICogUmV0dXJuIHF1aWNrbHkgd2hlbiB0aGVyZSBpcyBubyBmb2xkaW5nIGF0IGFsbCBpbiB0aGlzIHdpbmRvdy4KKyAgICAgKi8KKyAgICBpZiAoIWhhc0FueUZvbGRpbmcod2luKSkKKyAgICB7CisJaWYgKGluZm9wICE9IE5VTEwpCisJICAgIGluZm9wLT5maV9sZXZlbCA9IDA7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChjYWNoZSkKKyAgICB7CisJLyoKKwkgKiBGaXJzdCBsb29rIGluIGNhY2hlZCBpbmZvIGZvciBkaXNwbGF5ZWQgbGluZXMuICBUaGlzIGlzIHByb2JhYmx5CisJICogdGhlIGZhc3Rlc3QsIGJ1dCBpdCBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBlbnRyeSBpcyBzdGlsbCB2YWxpZC4KKwkgKi8KKwl4ID0gZmluZF93bF9lbnRyeSh3aW4sIGxudW0pOworCWlmICh4ID49IDApCisJeworCSAgICBmaXJzdCA9IHdpbi0+d19saW5lc1t4XS53bF9sbnVtOworCSAgICBsYXN0ID0gd2luLT53X2xpbmVzW3hdLndsX2xhc3RsbnVtOworCSAgICBoYWRfZm9sZGVkID0gd2luLT53X2xpbmVzW3hdLndsX2ZvbGRlZDsKKwl9CisgICAgfQorCisgICAgaWYgKGZpcnN0ID09IDApCisgICAgeworCS8qCisJICogUmVjdXJzaXZlbHkgc2VhcmNoIGZvciBhIGZvbGQgdGhhdCBjb250YWlucyAibG51bSIuCisJICovCisJZ2FwID0gJndpbi0+d19mb2xkczsKKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKCFmb2xkRmluZChnYXAsIGxudW1fcmVsLCAmZnApKQorCQlicmVhazsKKworCSAgICAvKiBSZW1lbWJlciBsb3dlc3QgbGV2ZWwgb2YgZm9sZCB0aGF0IHN0YXJ0cyBpbiAibG51bSIuICovCisJICAgIGlmIChsbnVtX3JlbCA9PSBmcC0+ZmRfdG9wICYmIGxvd19sZXZlbCA9PSAwKQorCQlsb3dfbGV2ZWwgPSBsZXZlbCArIDE7CisKKwkgICAgZmlyc3QgKz0gZnAtPmZkX3RvcDsKKwkgICAgbGFzdCArPSBmcC0+ZmRfdG9wOworCisJICAgIC8qIGlzIHRoaXMgZm9sZCBjbG9zZWQ/ICovCisJICAgIGhhZF9mb2xkZWQgPSBjaGVja19jbG9zZWQod2luLCBmcCwgJnVzZV9sZXZlbCwgbGV2ZWwsCisJCQkJCSAgICAgICAmbWF5YmVfc21hbGwsIGxudW0gLSBsbnVtX3JlbCk7CisJICAgIGlmIChoYWRfZm9sZGVkKQorCSAgICB7CisJCS8qIEZvbGQgY2xvc2VkOiBTZXQgbGFzdCBhbmQgcXVpdCBsb29wLiAqLworCQlsYXN0ICs9IGZwLT5mZF9sZW4gLSAxOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIEZvbGQgZm91bmQsIGJ1dCBpdCdzIG9wZW46IENoZWNrIG5lc3RlZCBmb2xkcy4gIExpbmUgbnVtYmVyIGlzCisJICAgICAqIHJlbGF0aXZlIHRvIGNvbnRhaW5pbmcgZm9sZC4gKi8KKwkgICAgZ2FwID0gJmZwLT5mZF9uZXN0ZWQ7CisJICAgIGxudW1fcmVsIC09IGZwLT5mZF90b3A7CisJICAgICsrbGV2ZWw7CisJfQorICAgIH0KKworICAgIGlmICghaGFkX2ZvbGRlZCkKKyAgICB7CisJaWYgKGluZm9wICE9IE5VTEwpCisJeworCSAgICBpbmZvcC0+ZmlfbGV2ZWwgPSBsZXZlbDsKKwkgICAgaW5mb3AtPmZpX2xudW0gPSBsbnVtIC0gbG51bV9yZWw7CisJICAgIGluZm9wLT5maV9sb3dfbGV2ZWwgPSBsb3dfbGV2ZWwgPT0gMCA/IGxldmVsIDogbG93X2xldmVsOworCX0KKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxhc3RwICE9IE5VTEwpCisJKmxhc3RwID0gbGFzdDsKKyAgICBpZiAoZmlyc3RwICE9IE5VTEwpCisJKmZpcnN0cCA9IGZpcnN0OworICAgIGlmIChpbmZvcCAhPSBOVUxMKQorICAgIHsKKwlpbmZvcC0+ZmlfbGV2ZWwgPSBsZXZlbCArIDE7CisJaW5mb3AtPmZpX2xudW0gPSBmaXJzdDsKKwlpbmZvcC0+ZmlfbG93X2xldmVsID0gbG93X2xldmVsID09IDAgPyBsZXZlbCArIDEgOiBsb3dfbGV2ZWw7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKiBmb2xkTGV2ZWwoKSB7e3syICovCisvKgorICogUmV0dXJuIGZvbGQgbGV2ZWwgYXQgbGluZSBudW1iZXIgImxudW0iIGluIHRoZSBjdXJyZW50IHdpbmRvdy4KKyAqLworICAgIGludAorZm9sZExldmVsKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICAvKiBXaGlsZSB1cGRhdGluZyB0aGUgZm9sZHMgbGluZXMgYmV0d2VlbiBpbnZhbGlkX3RvcCBhbmQgaW52YWxpZF9ib3QgaGF2ZQorICAgICAqIGFuIHVuZGVmaW5lZCBmb2xkIGxldmVsLiAgT3RoZXJ3aXNlIHVwZGF0ZSB0aGUgZm9sZHMgZmlyc3QuICovCisgICAgaWYgKGludmFsaWRfdG9wID09IChsaW5lbnJfVCkwKQorCWNoZWNrdXBkYXRlKGN1cndpbik7CisgICAgZWxzZSBpZiAobG51bSA9PSBwcmV2X2xudW0gJiYgcHJldl9sbnVtX2x2bCA+PSAwKQorCXJldHVybiBwcmV2X2xudW1fbHZsOworICAgIGVsc2UgaWYgKGxudW0gPj0gaW52YWxpZF90b3AgJiYgbG51bSA8PSBpbnZhbGlkX2JvdCkKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBSZXR1cm4gcXVpY2tseSB3aGVuIHRoZXJlIGlzIG5vIGZvbGRpbmcgYXQgYWxsIGluIHRoaXMgd2luZG93LiAqLworICAgIGlmICghaGFzQW55Rm9sZGluZyhjdXJ3aW4pKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIGZvbGRMZXZlbFdpbihjdXJ3aW4sIGxudW0pOworfQorCisvKiBsaW5lRm9sZGVkKCkJe3t7MiAqLworLyoKKyAqIExvdyBsZXZlbCBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGxpbmUgaXMgZm9sZGVkLiAgRG9lc24ndCB1c2UgYW55IGNhY2hpbmcuCisgKiBSZXR1cm4gVFJVRSBpZiBsaW5lIGlzIGZvbGRlZC4KKyAqIFJldHVybiBGQUxTRSBpZiBsaW5lIGlzIG5vdCBmb2xkZWQuCisgKiBSZXR1cm4gTUFZQkUgaWYgdGhlIGxpbmUgaXMgZm9sZGVkIHdoZW4gbmV4dCB0byBhIGZvbGRlZCBsaW5lLgorICovCisgICAgaW50CitsaW5lRm9sZGVkKHdpbiwgbG51bSkKKyAgICB3aW5fVAkqd2luOworICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgcmV0dXJuIGZvbGRlZENvdW50KHdpbiwgbG51bSwgTlVMTCkgIT0gMDsKK30KKworLyogZm9sZGVkQ291bnQoKSB7e3syICovCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyB0aGF0IGFyZSBmb2xkZWQgYXQgbGluZSBudW1iZXIgImxudW0iLgorICogTm9ybWFsbHkgImxudW0iIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGEgcG9zc2libGUgZm9sZCwgYW5kIHRoZSByZXR1cm5lZAorICogbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZvbGQuCisgKiBEb2Vzbid0IHVzZSBjYWNoaW5nIGZyb20gdGhlIGRpc3BsYXllZCB3aW5kb3cuCisgKiBSZXR1cm5zIG51bWJlciBvZiBmb2xkZWQgbGluZXMgZnJvbSAibG51bSIsIG9yIDAgaWYgbGluZSBpcyBub3QgZm9sZGVkLgorICogV2hlbiAiaW5mb3AiIGlzIG5vdCBOVUxMLCBmaWxscyAqaW5mb3Agd2l0aCB0aGUgZm9sZCBsZXZlbCBpbmZvLgorICovCisgICAgbG9uZworZm9sZGVkQ291bnQod2luLCBsbnVtLCBpbmZvcCkKKyAgICB3aW5fVAkqd2luOworICAgIGxpbmVucl9UCWxudW07CisgICAgZm9sZGluZm9fVAkqaW5mb3A7Cit7CisgICAgbGluZW5yX1QJbGFzdDsKKworICAgIGlmIChoYXNGb2xkaW5nV2luKHdpbiwgbG51bSwgTlVMTCwgJmxhc3QsIEZBTFNFLCBpbmZvcCkpCisJcmV0dXJuIChsb25nKShsYXN0IC0gbG51bSArIDEpOworICAgIHJldHVybiAwOworfQorCisvKiBmb2xkbWV0aG9kSXNNYW51YWwoKSB7e3syICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgJ2ZvbGRtZXRob2QnIGlzICJtYW51YWwiCisgKi8KKyAgICBpbnQKK2ZvbGRtZXRob2RJc01hbnVhbCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVszXSA9PSAndScpOworfQorCisvKiBmb2xkbWV0aG9kSXNJbmRlbnQoKSB7e3syICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgJ2ZvbGRtZXRob2QnIGlzICJpbmRlbnQiCisgKi8KKyAgICBpbnQKK2ZvbGRtZXRob2RJc0luZGVudCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVswXSA9PSAnaScpOworfQorCisvKiBmb2xkbWV0aG9kSXNFeHByKCkge3t7MiAqLworLyoKKyAqIFJldHVybiBUUlVFIGlmICdmb2xkbWV0aG9kJyBpcyAiZXhwciIKKyAqLworICAgIGludAorZm9sZG1ldGhvZElzRXhwcih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVsxXSA9PSAneCcpOworfQorCisvKiBmb2xkbWV0aG9kSXNNYXJrZXIoKSB7e3syICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgJ2ZvbGRtZXRob2QnIGlzICJtYXJrZXIiCisgKi8KKyAgICBpbnQKK2ZvbGRtZXRob2RJc01hcmtlcih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVsyXSA9PSAncicpOworfQorCisvKiBmb2xkbWV0aG9kSXNTeW50YXgoKSB7e3syICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgJ2ZvbGRtZXRob2QnIGlzICJzeW50YXgiCisgKi8KKyAgICBpbnQKK2ZvbGRtZXRob2RJc1N5bnRheCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVswXSA9PSAncycpOworfQorCisvKiBmb2xkbWV0aG9kSXNEaWZmKCkge3t7MiAqLworLyoKKyAqIFJldHVybiBUUlVFIGlmICdmb2xkbWV0aG9kJyBpcyAiZGlmZiIKKyAqLworICAgIGludAorZm9sZG1ldGhvZElzRGlmZih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19wX2ZkbVswXSA9PSAnZCcpOworfQorCisvKiBjbG9zZUZvbGQoKSB7e3syICovCisvKgorICogQ2xvc2UgZm9sZCBmb3IgY3VycmVudCB3aW5kb3cgYXQgbGluZSAibG51bSIuCisgKiBSZXBlYXQgImNvdW50IiB0aW1lcy4KKyAqLworICAgIHZvaWQKK2Nsb3NlRm9sZChsbnVtLCBjb3VudCkKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJY291bnQ7Cit7CisgICAgc2V0Rm9sZFJlcGVhdChsbnVtLCBjb3VudCwgRkFMU0UpOworfQorCisvKiBjbG9zZUZvbGRSZWN1cnNlKCkge3t7MiAqLworLyoKKyAqIENsb3NlIGZvbGQgZm9yIGN1cnJlbnQgd2luZG93IGF0IGxpbmUgImxudW0iIHJlY3Vyc2l2ZWx5LgorICovCisgICAgdm9pZAorY2xvc2VGb2xkUmVjdXJzZShsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgKHZvaWQpc2V0TWFudWFsRm9sZChsbnVtLCBGQUxTRSwgVFJVRSwgTlVMTCk7Cit9CisKKy8qIG9wRm9sZFJhbmdlKCkge3t7MiAqLworLyoKKyAqIE9wZW4gb3IgQ2xvc2UgZm9sZHMgZm9yIGN1cnJlbnQgd2luZG93IGluIGxpbmVzICJmaXJzdCIgdG8gImxhc3QiLgorICogVXNlZCBmb3IgInpvIiwgInpPIiwgInpjIiBhbmQgInpDIiBpbiBWaXN1YWwgbW9kZS4KKyAqLworICAgIHZvaWQKK29wRm9sZFJhbmdlKGZpcnN0LCBsYXN0LCBvcGVuaW5nLCByZWN1cnNlLCBoYWRfdmlzdWFsKQorICAgIGxpbmVucl9UCWZpcnN0OworICAgIGxpbmVucl9UCWxhc3Q7CisgICAgaW50CQlvcGVuaW5nOwkvKiBUUlVFIHRvIG9wZW4sIEZBTFNFIHRvIGNsb3NlICovCisgICAgaW50CQlyZWN1cnNlOwkvKiBUUlVFIHRvIGRvIGl0IHJlY3Vyc2l2ZWx5ICovCisgICAgaW50CQloYWRfdmlzdWFsOwkvKiBUUlVFIHdoZW4gVmlzdWFsIHNlbGVjdGlvbiB1c2VkICovCit7CisgICAgaW50CQlkb25lID0gRE9ORV9OT1RISU5HOwkvKiBhdm9pZCBlcnJvciBtZXNzYWdlcyAqLworICAgIGxpbmVucl9UCWxudW07CisgICAgbGluZW5yX1QJbG51bV9uZXh0OworCisgICAgZm9yIChsbnVtID0gZmlyc3Q7IGxudW0gPD0gbGFzdDsgbG51bSA9IGxudW1fbmV4dCArIDEpCisgICAgeworCWxudW1fbmV4dCA9IGxudW07CisJLyogT3BlbmluZyBvbmUgbGV2ZWwgb25seTogbmV4dCBmb2xkIHRvIG9wZW4gaXMgYWZ0ZXIgdGhlIG9uZSBnb2luZyB0bworCSAqIGJlIG9wZW5lZC4gKi8KKwlpZiAob3BlbmluZyAmJiAhcmVjdXJzZSkKKwkgICAgKHZvaWQpaGFzRm9sZGluZyhsbnVtLCBOVUxMLCAmbG51bV9uZXh0KTsKKwkodm9pZClzZXRNYW51YWxGb2xkKGxudW0sIG9wZW5pbmcsIHJlY3Vyc2UsICZkb25lKTsKKwkvKiBDbG9zaW5nIG9uZSBsZXZlbCBvbmx5OiBuZXh0IGxpbmUgdG8gY2xvc2UgYSBmb2xkIGlzIGFmdGVyIGp1c3QKKwkgKiBjbG9zZWQgZm9sZC4gKi8KKwlpZiAoIW9wZW5pbmcgJiYgIXJlY3Vyc2UpCisJICAgICh2b2lkKWhhc0ZvbGRpbmcobG51bSwgTlVMTCwgJmxudW1fbmV4dCk7CisgICAgfQorICAgIGlmIChkb25lID09IERPTkVfTk9USElORykKKwlFTVNHKF8oZV9ub2ZvbGQpKTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIEZvcmNlIGEgcmVkcmF3IHRvIHJlbW92ZSB0aGUgVmlzdWFsIGhpZ2hsaWdodGluZy4gKi8KKyAgICBpZiAoaGFkX3Zpc3VhbCkKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsKKyNlbmRpZgorfQorCisvKiBvcGVuRm9sZCgpIHt7ezIgKi8KKy8qCisgKiBPcGVuIGZvbGQgZm9yIGN1cnJlbnQgd2luZG93IGF0IGxpbmUgImxudW0iLgorICogUmVwZWF0ICJjb3VudCIgdGltZXMuCisgKi8KKyAgICB2b2lkCitvcGVuRm9sZChsbnVtLCBjb3VudCkKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJY291bnQ7Cit7CisgICAgc2V0Rm9sZFJlcGVhdChsbnVtLCBjb3VudCwgVFJVRSk7Cit9CisKKy8qIG9wZW5Gb2xkUmVjdXJzZSgpIHt7ezIgKi8KKy8qCisgKiBPcGVuIGZvbGQgZm9yIGN1cnJlbnQgd2luZG93IGF0IGxpbmUgImxudW0iIHJlY3Vyc2l2ZWx5LgorICovCisgICAgdm9pZAorb3BlbkZvbGRSZWN1cnNlKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICAodm9pZClzZXRNYW51YWxGb2xkKGxudW0sIFRSVUUsIFRSVUUsIE5VTEwpOworfQorCisvKiBmb2xkT3BlbkN1cnNvcigpIHt7ezIgKi8KKy8qCisgKiBPcGVuIGZvbGRzIHVudGlsIHRoZSBjdXJzb3IgbGluZSBpcyBub3QgaW4gYSBjbG9zZWQgZm9sZC4KKyAqLworICAgIHZvaWQKK2ZvbGRPcGVuQ3Vyc29yKCkKK3sKKyAgICBpbnQJCWRvbmU7CisKKyAgICBjaGVja3VwZGF0ZShjdXJ3aW4pOworICAgIGlmIChoYXNBbnlGb2xkaW5nKGN1cndpbikpCisJZm9yICg7OykKKwl7CisJICAgIGRvbmUgPSBET05FX05PVEhJTkc7CisJICAgICh2b2lkKXNldE1hbnVhbEZvbGQoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBUUlVFLCBGQUxTRSwgJmRvbmUpOworCSAgICBpZiAoIShkb25lICYgRE9ORV9BQ1RJT04pKQorCQlicmVhazsKKwl9Cit9CisKKy8qIG5ld0ZvbGRMZXZlbCgpIHt7ezIgKi8KKy8qCisgKiBTZXQgbmV3IGZvbGRsZXZlbCBmb3IgY3VycmVudCB3aW5kb3cuCisgKi8KKyAgICB2b2lkCituZXdGb2xkTGV2ZWwoKQoreworICAgIG5ld0ZvbGRMZXZlbFdpbihjdXJ3aW4pOworCisjaWZkZWYgRkVBVF9ESUZGCisgICAgaWYgKGZvbGRtZXRob2RJc0RpZmYoY3Vyd2luKSAmJiBjdXJ3aW4tPndfcF9zY2IpCisgICAgeworCXdpbl9UCSAgICAqd3A7CisKKwkvKgorCSAqIFNldCB0aGUgc2FtZSBmb2xkbGV2ZWwgaW4gb3RoZXIgd2luZG93cyBpbiBkaWZmIG1vZGUuCisJICovCisJRk9SX0FMTF9XSU5ET1dTKHdwKQorCXsKKwkgICAgaWYgKHdwICE9IGN1cndpbiAmJiBmb2xkbWV0aG9kSXNEaWZmKHdwKSAmJiB3cC0+d19wX3NjYikKKwkgICAgeworCQl3cC0+d19wX2ZkbCA9IGN1cndpbi0+d19wX2ZkbDsKKwkJbmV3Rm9sZExldmVsV2luKHdwKTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKK30KKworICAgIHN0YXRpYyB2b2lkCituZXdGb2xkTGV2ZWxXaW4od3ApCisgICAgd2luX1QJKndwOworeworICAgIGZvbGRfVAkqZnA7CisgICAgaW50CQlpOworCisgICAgY2hlY2t1cGRhdGUod3ApOworICAgIGlmICh3cC0+d19mb2xkX21hbnVhbCkKKyAgICB7CisJLyogU2V0IGFsbCBmbGFncyBmb3IgdGhlIGZpcnN0IGxldmVsIG9mIGZvbGRzIHRvIEZEX0xFVkVMLiAgRm9sbG93aW5nCisJICogbWFudWFsIG9wZW4vY2xvc2Ugd2lsbCB0aGVuIGNoYW5nZSB0aGUgZmxhZ3MgdG8gRkRfT1BFTiBvcgorCSAqIEZEX0NMT1NFRCBmb3IgdGhvc2UgZm9sZHMgdGhhdCBkb24ndCB1c2UgJ2ZvbGRsZXZlbCcuICovCisJZnAgPSAoZm9sZF9UICopd3AtPndfZm9sZHMuZ2FfZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgd3AtPndfZm9sZHMuZ2FfbGVuOyArK2kpCisJICAgIGZwW2ldLmZkX2ZsYWdzID0gRkRfTEVWRUw7CisJd3AtPndfZm9sZF9tYW51YWwgPSBGQUxTRTsKKyAgICB9CisgICAgY2hhbmdlZF93aW5kb3dfc2V0dGluZ193aW4od3ApOworfQorCisvKiBmb2xkQ2hlY2tDbG9zZSgpIHt7ezIgKi8KKy8qCisgKiBBcHBseSAnZm9sZGxldmVsJyB0byBhbGwgZm9sZHMgdGhhdCBkb24ndCBjb250YWluIHRoZSBjdXJzb3IuCisgKi8KKyAgICB2b2lkCitmb2xkQ2hlY2tDbG9zZSgpCit7CisgICAgaWYgKCpwX2ZjbCAhPSBOVUwpCS8qIGNhbiBvbmx5IGJlICJhbGwiIHJpZ2h0IG5vdyAqLworICAgIHsKKwljaGVja3VwZGF0ZShjdXJ3aW4pOworCWlmIChjaGVja0Nsb3NlUmVjKCZjdXJ3aW4tPndfZm9sZHMsIGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJCQkJCQkoaW50KWN1cndpbi0+d19wX2ZkbCkpCisJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKyAgICB9Cit9CisKKy8qIGNoZWNrQ2xvc2VSZWMoKSB7e3syICovCisgICAgc3RhdGljIGludAorY2hlY2tDbG9zZVJlYyhnYXAsIGxudW0sIGxldmVsKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCWxldmVsOworeworICAgIGZvbGRfVAkqZnA7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKyAgICBpbnQJCWk7CisKKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCisgICAgeworCS8qIE9ubHkgbWFudWFsbHkgb3BlbmVkIGZvbGRzIG1heSBuZWVkIHRvIGJlIGNsb3NlZC4gKi8KKwlpZiAoZnBbaV0uZmRfZmxhZ3MgPT0gRkRfT1BFTikKKwl7CisJICAgIGlmIChsZXZlbCA8PSAwICYmIChsbnVtIDwgZnBbaV0uZmRfdG9wCisJCQkJICAgICAgfHwgbG51bSA+PSBmcFtpXS5mZF90b3AgKyBmcFtpXS5mZF9sZW4pKQorCSAgICB7CisJCWZwW2ldLmZkX2ZsYWdzID0gRkRfTEVWRUw7CisJCXJldHZhbCA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZQorCQlyZXR2YWwgfD0gY2hlY2tDbG9zZVJlYygmZnBbaV0uZmRfbmVzdGVkLCBsbnVtIC0gZnBbaV0uZmRfdG9wLAorCQkJCQkJCQkgICBsZXZlbCAtIDEpOworCX0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogZm9sZENyZWF0ZUFsbG93ZWQoKSB7e3syICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgaXQncyBhbGxvd2VkIHRvIG1hbnVhbGx5IGNyZWF0ZSBvciBkZWxldGUgYSBmb2xkLgorICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gRkFMU0UgaWYgbm90LgorICovCisgICAgaW50Citmb2xkTWFudWFsQWxsb3dlZChjcmVhdGUpCisgICAgaW50CQljcmVhdGU7Cit7CisgICAgaWYgKGZvbGRtZXRob2RJc01hbnVhbChjdXJ3aW4pIHx8IGZvbGRtZXRob2RJc01hcmtlcihjdXJ3aW4pKQorCXJldHVybiBUUlVFOworICAgIGlmIChjcmVhdGUpCisJRU1TRyhfKCJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIpKTsKKyAgICBlbHNlCisJRU1TRyhfKCJFMzUxOiBDYW5ub3QgZGVsZXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIpKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIGZvbGRDcmVhdGUoKSB7e3syICovCisvKgorICogQ3JlYXRlIGEgZm9sZCBmcm9tIGxpbmUgInN0YXJ0IiB0byBsaW5lICJlbmQiIChpbmNsdXNpdmUpIGluIHRoZSBjdXJyZW50CisgKiB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitmb2xkQ3JlYXRlKHN0YXJ0LCBlbmQpCisgICAgbGluZW5yX1QJc3RhcnQ7CisgICAgbGluZW5yX1QJZW5kOworeworICAgIGZvbGRfVAkqZnA7CisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBnYXJyYXlfVAlmb2xkX2dhOworICAgIGludAkJaSwgajsKKyAgICBpbnQJCWNvbnQ7CisgICAgaW50CQl1c2VfbGV2ZWwgPSBGQUxTRTsKKyAgICBpbnQJCWNsb3NlZCA9IEZBTFNFOworICAgIGludAkJbGV2ZWwgPSAwOworICAgIGxpbmVucl9UCXN0YXJ0X3JlbCA9IHN0YXJ0OworICAgIGxpbmVucl9UCWVuZF9yZWwgPSBlbmQ7CisKKyAgICBpZiAoc3RhcnQgPiBlbmQpCisgICAgeworCS8qIHJldmVyc2UgdGhlIHJhbmdlICovCisJZW5kID0gc3RhcnRfcmVsOworCXN0YXJ0ID0gZW5kX3JlbDsKKwlzdGFydF9yZWwgPSBzdGFydDsKKwllbmRfcmVsID0gZW5kOworICAgIH0KKworICAgIC8qIFdoZW4gJ2ZvbGRtZXRob2QnIGlzICJtYXJrZXIiIGFkZCBtYXJrZXJzLCB3aGljaCBjcmVhdGVzIHRoZSBmb2xkcy4gKi8KKyAgICBpZiAoZm9sZG1ldGhvZElzTWFya2VyKGN1cndpbikpCisgICAgeworCWZvbGRDcmVhdGVNYXJrZXJzKHN0YXJ0LCBlbmQpOworCXJldHVybjsKKyAgICB9CisKKyAgICBjaGVja3VwZGF0ZShjdXJ3aW4pOworCisgICAgLyogRmluZCB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSBuZXcgZm9sZC4gKi8KKyAgICBnYXAgPSAmY3Vyd2luLT53X2ZvbGRzOworICAgIGZvciAoOzspCisgICAgeworCWlmICghZm9sZEZpbmQoZ2FwLCBzdGFydF9yZWwsICZmcCkpCisJICAgIGJyZWFrOworCWlmIChmcC0+ZmRfdG9wICsgZnAtPmZkX2xlbiA+IGVuZF9yZWwpCisJeworCSAgICAvKiBOZXcgZm9sZCBpcyBjb21wbGV0ZWx5IGluc2lkZSB0aGlzIGZvbGQ6IEdvIG9uZSBsZXZlbCBkZWVwZXIuICovCisJICAgIGdhcCA9ICZmcC0+ZmRfbmVzdGVkOworCSAgICBzdGFydF9yZWwgLT0gZnAtPmZkX3RvcDsKKwkgICAgZW5kX3JlbCAtPSBmcC0+ZmRfdG9wOworCSAgICBpZiAodXNlX2xldmVsIHx8IGZwLT5mZF9mbGFncyA9PSBGRF9MRVZFTCkKKwkgICAgeworCQl1c2VfbGV2ZWwgPSBUUlVFOworCQlpZiAobGV2ZWwgPj0gY3Vyd2luLT53X3BfZmRsKQorCQkgICAgY2xvc2VkID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChmcC0+ZmRfZmxhZ3MgPT0gRkRfQ0xPU0VEKQorCQljbG9zZWQgPSBUUlVFOworCSAgICArK2xldmVsOworCX0KKwllbHNlCisJeworCSAgICAvKiBUaGlzIGZvbGQgYW5kIG5ldyBmb2xkIG92ZXJsYXA6IEluc2VydCBoZXJlIGFuZCBtb3ZlIHNvbWUgZm9sZHMKKwkgICAgICogaW5zaWRlIHRoZSBuZXcgZm9sZC4gKi8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGkgPSAoaW50KShmcCAtIChmb2xkX1QgKilnYXAtPmdhX2RhdGEpOworICAgIGlmIChnYV9ncm93KGdhcCwgMSkgPT0gT0spCisgICAgeworCWZwID0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGk7CisJZ2FfaW5pdDIoJmZvbGRfZ2EsIChpbnQpc2l6ZW9mKGZvbGRfVCksIDEwKTsKKworCS8qIENvdW50IG51bWJlciBvZiBmb2xkcyB0aGF0IHdpbGwgYmUgY29udGFpbmVkIGluIHRoZSBuZXcgZm9sZC4gKi8KKwlmb3IgKGNvbnQgPSAwOyBpICsgY29udCA8IGdhcC0+Z2FfbGVuOyArK2NvbnQpCisJICAgIGlmIChmcFtjb250XS5mZF90b3AgPiBlbmRfcmVsKQorCQlicmVhazsKKwlpZiAoY29udCA+IDAgJiYgZ2FfZ3JvdygmZm9sZF9nYSwgY29udCkgPT0gT0spCisJeworCSAgICAvKiBJZiB0aGUgZmlyc3QgZm9sZCBzdGFydHMgYmVmb3JlIHRoZSBuZXcgZm9sZCwgbGV0IHRoZSBuZXcgZm9sZAorCSAgICAgKiBzdGFydCB0aGVyZS4gIE90aGVyd2lzZSB0aGUgZXhpc3RpbmcgZm9sZCB3b3VsZCBjaGFuZ2UuICovCisJICAgIGlmIChzdGFydF9yZWwgPiBmcC0+ZmRfdG9wKQorCQlzdGFydF9yZWwgPSBmcC0+ZmRfdG9wOworCisJICAgIC8qIFdoZW4gbGFzdCBjb250YWluZWQgZm9sZCBpc24ndCBjb21wbGV0ZWx5IGNvbnRhaW5lZCwgYWRqdXN0IGVuZAorCSAgICAgKiBvZiBuZXcgZm9sZC4gKi8KKwkgICAgaWYgKGVuZF9yZWwgPCBmcFtjb250IC0gMV0uZmRfdG9wICsgZnBbY29udCAtIDFdLmZkX2xlbiAtIDEpCisJCWVuZF9yZWwgPSBmcFtjb250IC0gMV0uZmRfdG9wICsgZnBbY29udCAtIDFdLmZkX2xlbiAtIDE7CisJICAgIC8qIE1vdmUgY29udGFpbmVkIGZvbGRzIHRvIGluc2lkZSBuZXcgZm9sZC4gKi8KKwkgICAgbWNoX21lbW1vdmUoZm9sZF9nYS5nYV9kYXRhLCBmcCwgc2l6ZW9mKGZvbGRfVCkgKiBjb250KTsKKwkgICAgZm9sZF9nYS5nYV9sZW4gKz0gY29udDsKKwkgICAgZm9sZF9nYS5nYV9yb29tIC09IGNvbnQ7CisJICAgIGkgKz0gY29udDsKKworCSAgICAvKiBBZGp1c3QgbGluZSBudW1iZXJzIGluIGNvbnRhaW5lZCBmb2xkcyB0byBiZSByZWxhdGl2ZSB0byB0aGUKKwkgICAgICogbmV3IGZvbGQuICovCisJICAgIGZvciAoaiA9IDA7IGogPCBjb250OyArK2opCisJCSgoZm9sZF9UICopZm9sZF9nYS5nYV9kYXRhKVtqXS5mZF90b3AgLT0gc3RhcnRfcmVsOworCX0KKwkvKiBNb3ZlIHJlbWFpbmluZyBlbnRyaWVzIHRvIGFmdGVyIHRoZSBuZXcgZm9sZC4gKi8KKwlpZiAoaSA8IGdhcC0+Z2FfbGVuKQorCSAgICBtY2hfbWVtbW92ZShmcCArIDEsIChmb2xkX1QgKilnYXAtPmdhX2RhdGEgKyBpLAorCQkJCSAgICAgc2l6ZW9mKGZvbGRfVCkgKiAoZ2FwLT5nYV9sZW4gLSBpKSk7CisJZ2FwLT5nYV9sZW4gPSBnYXAtPmdhX2xlbiArIDEgLSBjb250OworCWdhcC0+Z2Ffcm9vbSA9IGdhcC0+Z2Ffcm9vbSAtIDEgKyBjb250OworCisJLyogaW5zZXJ0IG5ldyBmb2xkICovCisJZnAtPmZkX25lc3RlZCA9IGZvbGRfZ2E7CisJZnAtPmZkX3RvcCA9IHN0YXJ0X3JlbDsKKwlmcC0+ZmRfbGVuID0gZW5kX3JlbCAtIHN0YXJ0X3JlbCArIDE7CisKKwkvKiBXZSB3YW50IHRoZSBuZXcgZm9sZCB0byBiZSBjbG9zZWQuICBJZiBpdCB3b3VsZCByZW1haW4gb3BlbiBiZWNhdXNlCisJICogb2YgdXNpbmcgJ2ZvbGRsZXZlbCcsIG5lZWQgdG8gYWRqdXN0IGZkX2ZsYWdzIG9mIGNvbnRhaW5pbmcgZm9sZHMuCisJICovCisJaWYgKHVzZV9sZXZlbCAmJiAhY2xvc2VkICYmIGxldmVsIDwgY3Vyd2luLT53X3BfZmRsKQorCSAgICBjbG9zZUZvbGQoc3RhcnQsIDFMKTsKKwlpZiAoIXVzZV9sZXZlbCkKKwkgICAgY3Vyd2luLT53X2ZvbGRfbWFudWFsID0gVFJVRTsKKwlmcC0+ZmRfZmxhZ3MgPSBGRF9DTE9TRUQ7CisJZnAtPmZkX3NtYWxsID0gTUFZQkU7CisKKwkvKiByZWRyYXcgKi8KKwljaGFuZ2VkX3dpbmRvd19zZXR0aW5nKCk7CisgICAgfQorfQorCisvKiBkZWxldGVGb2xkKCkge3t7MiAqLworLyoKKyAqIERlbGV0ZSBhIGZvbGQgYXQgbGluZSAic3RhcnQiIGluIHRoZSBjdXJyZW50IHdpbmRvdy4KKyAqIFdoZW4gImVuZCIgaXMgbm90IDAsIGRlbGV0ZSBhbGwgZm9sZHMgZnJvbSAic3RhcnQiIHRvICJlbmQiLgorICogV2hlbiAicmVjdXJzaXZlIiBpcyBUUlVFIGRlbGV0ZSByZWN1cnNpdmVseS4KKyAqLworICAgIHZvaWQKK2RlbGV0ZUZvbGQoc3RhcnQsIGVuZCwgcmVjdXJzaXZlLCBoYWRfdmlzdWFsKQorICAgIGxpbmVucl9UCXN0YXJ0OworICAgIGxpbmVucl9UCWVuZDsKKyAgICBpbnQJCXJlY3Vyc2l2ZTsKKyAgICBpbnQJCWhhZF92aXN1YWw7CS8qIFRSVUUgd2hlbiBWaXN1YWwgc2VsZWN0aW9uIHVzZWQgKi8KK3sKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGZvbGRfVAkqZnA7CisgICAgZ2FycmF5X1QJKmZvdW5kX2dhOworICAgIGZvbGRfVAkqZm91bmRfZnAgPSBOVUxMOworICAgIGxpbmVucl9UCWZvdW5kX29mZiA9IDA7CisgICAgaW50CQl1c2VfbGV2ZWwgPSBGQUxTRTsKKyAgICBpbnQJCW1heWJlX3NtYWxsID0gRkFMU0U7CisgICAgaW50CQlsZXZlbCA9IDA7CisgICAgbGluZW5yX1QJbG51bSA9IHN0YXJ0OworICAgIGxpbmVucl9UCWxudW1fb2ZmOworICAgIGludAkJZGlkX29uZSA9IEZBTFNFOworICAgIGxpbmVucl9UCWZpcnN0X2xudW0gPSBNQVhMTlVNOworICAgIGxpbmVucl9UCWxhc3RfbG51bSA9IDA7CisKKyAgICBjaGVja3VwZGF0ZShjdXJ3aW4pOworCisgICAgd2hpbGUgKGxudW0gPD0gZW5kKQorICAgIHsKKwkvKiBGaW5kIHRoZSBkZWVwZXN0IGZvbGQgZm9yICJzdGFydCIuICovCisJZ2FwID0gJmN1cndpbi0+d19mb2xkczsKKwlmb3VuZF9nYSA9IE5VTEw7CisJbG51bV9vZmYgPSAwOworCWZvciAoOzspCisJeworCSAgICBpZiAoIWZvbGRGaW5kKGdhcCwgbG51bSAtIGxudW1fb2ZmLCAmZnApKQorCQlicmVhazsKKwkgICAgLyogbG51bSBpcyBpbnNpZGUgdGhpcyBmb2xkLCByZW1lbWJlciBpbmZvICovCisJICAgIGZvdW5kX2dhID0gZ2FwOworCSAgICBmb3VuZF9mcCA9IGZwOworCSAgICBmb3VuZF9vZmYgPSBsbnVtX29mZjsKKworCSAgICAvKiBpZiAibG51bSIgaXMgZm9sZGVkLCBkb24ndCBjaGVjayBuZXN0aW5nICovCisJICAgIGlmIChjaGVja19jbG9zZWQoY3Vyd2luLCBmcCwgJnVzZV9sZXZlbCwgbGV2ZWwsCisJCQkJCQkgICAgICAmbWF5YmVfc21hbGwsIGxudW1fb2ZmKSkKKwkJYnJlYWs7CisKKwkgICAgLyogY2hlY2sgbmVzdGVkIGZvbGRzICovCisJICAgIGdhcCA9ICZmcC0+ZmRfbmVzdGVkOworCSAgICBsbnVtX29mZiArPSBmcC0+ZmRfdG9wOworCSAgICArK2xldmVsOworCX0KKwlpZiAoZm91bmRfZ2EgPT0gTlVMTCkKKwl7CisJICAgICsrbG51bTsKKwl9CisJZWxzZQorCXsKKwkgICAgbG51bSA9IGZvdW5kX2ZwLT5mZF90b3AgKyBmb3VuZF9mcC0+ZmRfbGVuICsgZm91bmRfb2ZmOworCSAgICBkaWRfb25lID0gVFJVRTsKKworCSAgICBpZiAoZm9sZG1ldGhvZElzTWFudWFsKGN1cndpbikpCisJCWRlbGV0ZUZvbGRFbnRyeShmb3VuZF9nYSwKKwkJICAgIChpbnQpKGZvdW5kX2ZwIC0gKGZvbGRfVCAqKWZvdW5kX2dhLT5nYV9kYXRhKSwgcmVjdXJzaXZlKTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChmb3VuZF9mcC0+ZmRfdG9wICsgZm91bmRfb2ZmIDwgZmlyc3RfbG51bSkKKwkJICAgIGZpcnN0X2xudW0gPSBmb3VuZF9mcC0+ZmRfdG9wOworCQlpZiAobG51bSA+IGxhc3RfbG51bSkKKwkJICAgIGxhc3RfbG51bSA9IGxudW07CisJCXBhcnNlTWFya2VyKGN1cndpbik7CisJCWRlbGV0ZUZvbGRNYXJrZXJzKGZvdW5kX2ZwLCByZWN1cnNpdmUsIGZvdW5kX29mZik7CisJICAgIH0KKworCSAgICAvKiByZWRyYXcgd2luZG93ICovCisJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKwl9CisgICAgfQorICAgIGlmICghZGlkX29uZSkKKyAgICB7CisJRU1TRyhfKGVfbm9mb2xkKSk7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkvKiBGb3JjZSBhIHJlZHJhdyB0byByZW1vdmUgdGhlIFZpc3VhbCBoaWdobGlnaHRpbmcuICovCisJaWYgKGhhZF92aXN1YWwpCisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURUQpOworI2VuZGlmCisgICAgfQorICAgIGlmIChsYXN0X2xudW0gPiAwKQorCWNoYW5nZWRfbGluZXMoZmlyc3RfbG51bSwgKGNvbG5yX1QpMCwgbGFzdF9sbnVtLCAwTCk7Cit9CisKKy8qIGNsZWFyRm9sZGluZygpIHt7ezIgKi8KKy8qCisgKiBSZW1vdmUgYWxsIGZvbGRpbmcgZm9yIHdpbmRvdyAid2luIi4KKyAqLworICAgIHZvaWQKK2NsZWFyRm9sZGluZyh3aW4pCisgICAgd2luX1QJKndpbjsKK3sKKyAgICBkZWxldGVGb2xkUmVjdXJzZSgmd2luLT53X2ZvbGRzKTsKKyAgICB3aW4tPndfZm9sZGludmFsaWQgPSBGQUxTRTsKK30KKworLyogZm9sZFVwZGF0ZSgpIHt7ezIgKi8KKy8qCisgKiBVcGRhdGUgZm9sZHMgZm9yIGNoYW5nZXMgaW4gdGhlIGJ1ZmZlciBvZiBhIHdpbmRvdy4KKyAqIE5vdGUgdGhhdCBpbnNlcnRlZC9kZWxldGVkIGxpbmVzIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZiBieQorICogY2FsbGluZyBmb2xkTWFya0FkanVzdCgpLgorICogVGhlIGNoYW5nZXMgaW4gbGluZXMgZnJvbSB0b3AgdG8gYm90IChpbmNsdXNpdmUpLgorICovCisgICAgdm9pZAorZm9sZFVwZGF0ZSh3cCwgdG9wLCBib3QpCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCXRvcDsKKyAgICBsaW5lbnJfVAlib3Q7Cit7CisgICAgZm9sZF9UCSpmcDsKKworICAgIC8qIE1hcmsgYWxsIGZvbGRzIGZyb20gdG9wIHRvIGJvdCBhcyBtYXliZS1zbWFsbC4gKi8KKyAgICAodm9pZClmb2xkRmluZCgmY3Vyd2luLT53X2ZvbGRzLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sICZmcCk7CisgICAgd2hpbGUgKGZwIDwgKGZvbGRfVCAqKWN1cndpbi0+d19mb2xkcy5nYV9kYXRhICsgY3Vyd2luLT53X2ZvbGRzLmdhX2xlbgorCSAgICAmJiBmcC0+ZmRfdG9wIDwgYm90KQorICAgIHsKKwlmcC0+ZmRfc21hbGwgPSBNQVlCRTsKKwkrK2ZwOworICAgIH0KKworICAgIGlmIChmb2xkbWV0aG9kSXNJbmRlbnQod3ApCisJICAgIHx8IGZvbGRtZXRob2RJc0V4cHIod3ApCisJICAgIHx8IGZvbGRtZXRob2RJc01hcmtlcih3cCkKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgfHwgZm9sZG1ldGhvZElzRGlmZih3cCkKKyNlbmRpZgorCSAgICB8fCBmb2xkbWV0aG9kSXNTeW50YXgod3ApKQorCWZvbGRVcGRhdGVJRU1TKHdwLCB0b3AsIGJvdCk7Cit9CisKKy8qIGZvbGRVcGRhdGVBbGwoKSB7e3syICovCisvKgorICogVXBkYXRlIGFsbCBsaW5lcyBpbiBhIHdpbmRvdyBmb3IgZm9sZGluZy4KKyAqIFVzZWQgd2hlbiBhIGZvbGQgc2V0dGluZyBjaGFuZ2VzIG9yIGFmdGVyIHJlbG9hZGluZyB0aGUgYnVmZmVyLgorICogVGhlIGFjdHVhbCB1cGRhdGluZyBpcyBwb3N0cG9uZWQgdW50aWwgZm9sZCBpbmZvIGlzIHVzZWQsIHRvIGF2b2lkIGRvaW5nCisgKiBldmVyeSB0aW1lIGEgc2V0dGluZyBpcyBjaGFuZ2VkIG9yIGEgc3ludGF4IGl0ZW0gaXMgYWRkZWQuCisgKi8KKyAgICB2b2lkCitmb2xkVXBkYXRlQWxsKHdpbikKKyAgICB3aW5fVAkqd2luOworeworICAgIHdpbi0+d19mb2xkaW52YWxpZCA9IFRSVUU7CisgICAgcmVkcmF3X3dpbl9sYXRlcih3aW4sIE5PVF9WQUxJRCk7Cit9CisKKy8qIGZvbGRNb3ZlVG8oKSB7e3syICovCisvKgorICogSWYgInVwZG93biIgaXMgRkFMU0U6IE1vdmUgdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZm9sZC4KKyAqIElmICJ1cGRvd24iIGlzIFRSVUU6IG1vdmUgdG8gZm9sZCBhdCB0aGUgc2FtZSBsZXZlbC4KKyAqIElmIG5vdCBtb3ZlZCByZXR1cm4gRkFJTC4KKyAqLworICAgIGludAorZm9sZE1vdmVUbyh1cGRvd24sIGRpciwgY291bnQpCisgICAgaW50CQl1cGRvd247CisgICAgaW50CQlkaXI7CSAgICAvKiBGT1JXQVJEIG9yIEJBQ0tXQVJEICovCisgICAgbG9uZwljb3VudDsKK3sKKyAgICBsb25nCW47CisgICAgaW50CQlyZXR2YWwgPSBGQUlMOworICAgIGxpbmVucl9UCWxudW1fb2ZmOworICAgIGxpbmVucl9UCWxudW1fZm91bmQ7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXVzZV9sZXZlbDsKKyAgICBpbnQJCW1heWJlX3NtYWxsOworICAgIGdhcnJheV9UCSpnYXA7CisgICAgZm9sZF9UCSpmcDsKKyAgICBpbnQJCWxldmVsOworICAgIGludAkJbGFzdDsKKworICAgIC8qIFJlcGVhdCAiY291bnQiIHRpbWVzLiAqLworICAgIGZvciAobiA9IDA7IG4gPCBjb3VudDsgKytuKQorICAgIHsKKwkvKiBGaW5kIG5lc3RlZCBmb2xkcy4gIFN0b3Agd2hlbiBhIGZvbGQgaXMgY2xvc2VkLiAgVGhlIGRlZXBlc3QgZm9sZAorCSAqIHRoYXQgbW92ZXMgdGhlIGN1cnNvciBpcyB1c2VkLiAqLworCWxudW1fb2ZmID0gMDsKKwlnYXAgPSAmY3Vyd2luLT53X2ZvbGRzOworCXVzZV9sZXZlbCA9IEZBTFNFOworCW1heWJlX3NtYWxsID0gRkFMU0U7CisJbG51bV9mb3VuZCA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwlsZXZlbCA9IDA7CisJbGFzdCA9IEZBTFNFOworCWZvciAoOzspCisJeworCSAgICBpZiAoIWZvbGRGaW5kKGdhcCwgY3Vyd2luLT53X2N1cnNvci5sbnVtIC0gbG51bV9vZmYsICZmcCkpCisJICAgIHsKKwkJaWYgKCF1cGRvd24pCisJCSAgICBicmVhazsKKworCQkvKiBXaGVuIG1vdmluZyB1cCwgY29uc2lkZXIgYSBmb2xkIGFib3ZlIHRoZSBjdXJzb3I7IHdoZW4KKwkJICogbW92aW5nIGRvd24gY29uc2lkZXIgYSBmb2xkIGJlbG93IHRoZSBjdXJzb3IuICovCisJCWlmIChkaXIgPT0gRk9SV0FSRCkKKwkJeworCQkgICAgaWYgKGZwIC0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSA+PSBnYXAtPmdhX2xlbikKKwkJCWJyZWFrOworCQkgICAgLS1mcDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGlmIChmcCA9PSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKQorCQkJYnJlYWs7CisJCX0KKwkJLyogZG9uJ3QgbG9vayBmb3IgY29udGFpbmVkIGZvbGRzLCB0aGV5IHdpbGwgYWx3YXlzIG1vdmUKKwkJICogdGhlIGN1cnNvciB0b28gZmFyLiAqLworCQlsYXN0ID0gVFJVRTsKKwkgICAgfQorCisJICAgIGlmICghbGFzdCkKKwkgICAgeworCQkvKiBDaGVjayBpZiB0aGlzIGZvbGQgaXMgY2xvc2VkLiAqLworCQlpZiAoY2hlY2tfY2xvc2VkKGN1cndpbiwgZnAsICZ1c2VfbGV2ZWwsIGxldmVsLAorCQkJCQkJICAgICAgJm1heWJlX3NtYWxsLCBsbnVtX29mZikpCisJCSAgICBsYXN0ID0gVFJVRTsKKworCQkvKiAiW3oiIGFuZCAiXXoiIHN0b3AgYXQgY2xvc2VkIGZvbGQgKi8KKwkJaWYgKGxhc3QgJiYgIXVwZG93bikKKwkJICAgIGJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKHVwZG93bikKKwkgICAgeworCQlpZiAoZGlyID09IEZPUldBUkQpCisJCXsKKwkJICAgIC8qIHRvIHN0YXJ0IG9mIG5leHQgZm9sZCBpZiB0aGVyZSBpcyBvbmUgKi8KKwkJICAgIGlmIChmcCArIDEgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhIDwgZ2FwLT5nYV9sZW4pCisJCSAgICB7CisJCQlsbnVtID0gZnBbMV0uZmRfdG9wICsgbG51bV9vZmY7CisJCQlpZiAobG51bSA+IGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkJCSAgICBsbnVtX2ZvdW5kID0gbG51bTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIHRvIGVuZCBvZiBwcmV2aW91cyBmb2xkIGlmIHRoZXJlIGlzIG9uZSAqLworCQkgICAgaWYgKGZwID4gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSkKKwkJICAgIHsKKwkJCWxudW0gPSBmcFstMV0uZmRfdG9wICsgbG51bV9vZmYgKyBmcFstMV0uZmRfbGVuIC0gMTsKKwkJCWlmIChsbnVtIDwgY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQkJICAgIGxudW1fZm91bmQgPSBsbnVtOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIE9wZW4gZm9sZCBmb3VuZCwgc2V0IGN1cnNvciB0byBpdHMgc3RhcnQvZW5kIGFuZCB0aGVuIGNoZWNrCisJCSAqIG5lc3RlZCBmb2xkcy4gKi8KKwkJaWYgKGRpciA9PSBGT1JXQVJEKQorCQl7CisJCSAgICBsbnVtID0gZnAtPmZkX3RvcCArIGxudW1fb2ZmICsgZnAtPmZkX2xlbiAtIDE7CisJCSAgICBpZiAobG51bSA+IGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkJCWxudW1fZm91bmQgPSBsbnVtOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgbG51bSA9IGZwLT5mZF90b3AgKyBsbnVtX29mZjsKKwkJICAgIGlmIChsbnVtIDwgY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQkJbG51bV9mb3VuZCA9IGxudW07CisJCX0KKwkgICAgfQorCisJICAgIGlmIChsYXN0KQorCQlicmVhazsKKworCSAgICAvKiBDaGVjayBuZXN0ZWQgZm9sZHMgKGlmIGFueSkuICovCisJICAgIGdhcCA9ICZmcC0+ZmRfbmVzdGVkOworCSAgICBsbnVtX29mZiArPSBmcC0+ZmRfdG9wOworCSAgICArK2xldmVsOworCX0KKwlpZiAobG51bV9mb3VuZCAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJeworCSAgICBpZiAocmV0dmFsID09IEZBSUwpCisJCXNldHBjbWFyaygpOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtX2ZvdW5kOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisJICAgIHJldHZhbCA9IE9LOworCX0KKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGZvbGRJbml0V2luKCkge3t7MiAqLworLyoKKyAqIEluaXQgdGhlIGZvbGQgaW5mbyBpbiBhIG5ldyB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitmb2xkSW5pdFdpbihuZXd3aW4pCisgICAgd2luX1QJKm5ld3dpbjsKK3sKKyAgICBnYV9pbml0MigmbmV3d2luLT53X2ZvbGRzLCAoaW50KXNpemVvZihmb2xkX1QpLCAxMCk7Cit9CisKKy8qIGZpbmRfd2xfZW50cnkoKSB7e3syICovCisvKgorICogRmluZCBhbiBlbnRyeSBpbiB0aGUgd2luLT53X2xpbmVzW10gYXJyYXkgZm9yIGJ1ZmZlciBsaW5lICJsbnVtIi4KKyAqIE9ubHkgdmFsaWQgZW50cmllcyBhcmUgY29uc2lkZXJlZCAoZm9yIGVudHJpZXMgd2hlcmUgd2xfdmFsaWQgaXMgRkFMU0UgdGhlCisgKiBsaW5lIG51bWJlciBjYW4gYmUgd3JvbmcpLgorICogUmV0dXJucyBpbmRleCBvZiBlbnRyeSBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KKyAgICBpbnQKK2ZpbmRfd2xfZW50cnkod2luLCBsbnVtKQorICAgIHdpbl9UCSp3aW47CisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBpZiAod2luLT53X2xpbmVzX3ZhbGlkID4gMCkKKwlmb3IgKGkgPSAwOyBpIDwgd2luLT53X2xpbmVzX3ZhbGlkOyArK2kpCisJICAgIGlmICh3aW4tPndfbGluZXNbaV0ud2xfdmFsaWQpCisJICAgIHsKKwkJaWYgKGxudW0gPCB3aW4tPndfbGluZXNbaV0ud2xfbG51bSkKKwkJICAgIHJldHVybiAtMTsKKwkJaWYgKGxudW0gPD0gd2luLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtKQorCQkgICAgcmV0dXJuIGk7CisJICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIGZvbGRBZGp1c3RWaXN1YWwoKSB7e3syICovCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiBBZGp1c3QgdGhlIFZpc3VhbCBhcmVhIHRvIGluY2x1ZGUgYW55IGZvbGQgYXQgdGhlIHN0YXJ0IG9yIGVuZCBjb21wbGV0ZWx5LgorICovCisgICAgdm9pZAorZm9sZEFkanVzdFZpc3VhbCgpCit7CisgICAgcG9zX1QJKnN0YXJ0LCAqZW5kOworICAgIGNoYXJfdQkqcHRyOworCisgICAgaWYgKCFWSXN1YWxfYWN0aXZlIHx8ICFoYXNBbnlGb2xkaW5nKGN1cndpbikpCisJcmV0dXJuOworCisgICAgaWYgKGx0b3JlcShWSXN1YWwsIGN1cndpbi0+d19jdXJzb3IpKQorICAgIHsKKwlzdGFydCA9ICZWSXN1YWw7CisJZW5kID0gJmN1cndpbi0+d19jdXJzb3I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RhcnQgPSAmY3Vyd2luLT53X2N1cnNvcjsKKwllbmQgPSAmVklzdWFsOworICAgIH0KKyAgICBpZiAoaGFzRm9sZGluZyhzdGFydC0+bG51bSwgJnN0YXJ0LT5sbnVtLCBOVUxMKSkKKwlzdGFydC0+Y29sID0gMDsKKyAgICBpZiAoaGFzRm9sZGluZyhlbmQtPmxudW0sIE5VTEwsICZlbmQtPmxudW0pKQorICAgIHsKKwlwdHIgPSBtbF9nZXQoZW5kLT5sbnVtKTsKKwllbmQtPmNvbCA9IChjb2xucl9UKVNUUkxFTihwdHIpOworCWlmIChlbmQtPmNvbCA+IDAgJiYgKnBfc2VsID09ICdvJykKKwkgICAgLS1lbmQtPmNvbDsKKyNpZmRlZiBGRUFUX01CWVRFCisJLyogcHJldmVudCBjdXJzb3IgZnJvbSBtb3Zpbmcgb24gdGhlIHRyYWlsIGJ5dGUgKi8KKwlpZiAoaGFzX21ieXRlKQorCSAgICBtYl9hZGp1c3RfY3Vyc29yKCk7CisjZW5kaWYKKyAgICB9Cit9CisjZW5kaWYKKworLyogY3Vyc29yX2ZvbGRzdGFydCgpIHt7ezIgKi8KKy8qCisgKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGxpbmUgb2YgYSBjbG9zZWQgZm9sZC4KKyAqLworICAgIHZvaWQKK2ZvbGRBZGp1c3RDdXJzb3IoKQoreworICAgICh2b2lkKWhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLCAmY3Vyd2luLT53X2N1cnNvci5sbnVtLCBOVUxMKTsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb25zIGZvciAiZm9sZF9UIiB7e3sxICovCisvKiBjbG9uZUZvbGRHcm93QXJyYXkoKSB7e3syICovCisvKgorICogV2lsbCAiY2xvbmUiIChpLmUgZGVlcCBjb3B5KSBhIGdhcnJheV9UIG9mIGZvbGRzLgorICoKKyAqIFJldHVybiBGQUlMIGlmIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCwgb3RoZXJ3aXNlIE9LLgorICovCisgICAgdm9pZAorY2xvbmVGb2xkR3Jvd0FycmF5KGZyb20sIHRvKQorICAgIGdhcnJheV9UCSpmcm9tOworICAgIGdhcnJheV9UCSp0bzsKK3sKKyAgICBpbnQJCWk7CisgICAgZm9sZF9UCSpmcm9tX3A7CisgICAgZm9sZF9UCSp0b19wOworCisgICAgZ2FfaW5pdDIodG8sIGZyb20tPmdhX2l0ZW1zaXplLCBmcm9tLT5nYV9ncm93c2l6ZSk7CisgICAgaWYgKGZyb20tPmdhX2xlbiA9PSAwIHx8IGdhX2dyb3codG8sIGZyb20tPmdhX2xlbikgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICBmcm9tX3AgPSAoZm9sZF9UICopZnJvbS0+Z2FfZGF0YTsKKyAgICB0b19wID0gKGZvbGRfVCAqKXRvLT5nYV9kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyb20tPmdhX2xlbjsgaSsrKQorICAgIHsKKwl0b19wLT5mZF90b3AgPSBmcm9tX3AtPmZkX3RvcDsKKwl0b19wLT5mZF9sZW4gPSBmcm9tX3AtPmZkX2xlbjsKKwl0b19wLT5mZF9mbGFncyA9IGZyb21fcC0+ZmRfZmxhZ3M7CisJdG9fcC0+ZmRfc21hbGwgPSBmcm9tX3AtPmZkX3NtYWxsOworCWNsb25lRm9sZEdyb3dBcnJheSgmZnJvbV9wLT5mZF9uZXN0ZWQsICZ0b19wLT5mZF9uZXN0ZWQpOworCSsrdG8tPmdhX2xlbjsKKwktLXRvLT5nYV9yb29tOworCSsrZnJvbV9wOworCSsrdG9fcDsKKyAgICB9Cit9CisKKy8qIGZvbGRGaW5kKCkge3t7MiAqLworLyoKKyAqIFNlYXJjaCBmb3IgbGluZSAibG51bSIgaW4gZm9sZHMgb2YgZ3Jvd2FycmF5ICJnYXAiLgorICogU2V0ICpmcHAgdG8gdGhlIGZvbGQgc3RydWN0IGZvciB0aGUgZm9sZCB0aGF0IGNvbnRhaW5zICJsbnVtIiBvcgorICogdGhlIGZpcnN0IGZvbGQgYmVsb3cgaXQgKGNhcmVmdWw6IGl0IGNhbiBiZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYXJyYXkhKS4KKyAqIFJldHVybnMgRkFMU0Ugd2hlbiB0aGVyZSBpcyBubyBmb2xkIHRoYXQgY29udGFpbnMgImxudW0iLgorICovCisgICAgc3RhdGljIGludAorZm9sZEZpbmQoZ2FwLCBsbnVtLCBmcHApCisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGZvbGRfVAkqKmZwcDsKK3sKKyAgICBsaW5lbnJfVAlsb3csIGhpZ2g7CisgICAgZm9sZF9UCSpmcDsKKyAgICBpbnQJCWk7CisKKyAgICAvKgorICAgICAqIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoLgorICAgICAqICJsb3ciIGlzIGxvd2VzdCBpbmRleCBvZiBwb3NzaWJsZSBtYXRjaC4KKyAgICAgKiAiaGlnaCIgaXMgaGlnaGVzdCBpbmRleCBvZiBwb3NzaWJsZSBtYXRjaC4KKyAgICAgKi8KKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGE7CisgICAgbG93ID0gMDsKKyAgICBoaWdoID0gZ2FwLT5nYV9sZW4gLSAxOworICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKKyAgICB7CisJaSA9IChsb3cgKyBoaWdoKSAvIDI7CisJaWYgKGZwW2ldLmZkX3RvcCA+IGxudW0pCisJICAgIC8qIGZvbGQgYmVsb3cgbG51bSwgYWRqdXN0IGhpZ2ggKi8KKwkgICAgaGlnaCA9IGkgLSAxOworCWVsc2UgaWYgKGZwW2ldLmZkX3RvcCArIGZwW2ldLmZkX2xlbiA8PSBsbnVtKQorCSAgICAvKiBmb2xkIGFib3ZlIGxudW0sIGFkanVzdCBsb3cgKi8KKwkgICAgbG93ID0gaSArIDE7CisJZWxzZQorCXsKKwkgICAgLyogbG51bSBpcyBpbnNpZGUgdGhpcyBmb2xkICovCisJICAgICpmcHAgPSBmcCArIGk7CisJICAgIHJldHVybiBUUlVFOworCX0KKyAgICB9CisgICAgKmZwcCA9IGZwICsgbG93OworICAgIHJldHVybiBGQUxTRTsKK30KKworLyogZm9sZExldmVsV2luKCkge3t7MiAqLworLyoKKyAqIFJldHVybiBmb2xkIGxldmVsIGF0IGxpbmUgbnVtYmVyICJsbnVtIiBpbiB3aW5kb3cgIndwIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZvbGRMZXZlbFdpbih3cCwgbG51bSkKKyAgICB3aW5fVAkqd3A7CisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBmb2xkX1QJKmZwOworICAgIGxpbmVucl9UCWxudW1fcmVsID0gbG51bTsKKyAgICBpbnQJCWxldmVsID0gIDA7CisgICAgZ2FycmF5X1QJKmdhcDsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IHNlYXJjaCBmb3IgYSBmb2xkIHRoYXQgY29udGFpbnMgImxudW0iLiAqLworICAgIGdhcCA9ICZ3cC0+d19mb2xkczsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoIWZvbGRGaW5kKGdhcCwgbG51bV9yZWwsICZmcCkpCisJICAgIGJyZWFrOworCS8qIENoZWNrIG5lc3RlZCBmb2xkcy4gIExpbmUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIGNvbnRhaW5pbmcgZm9sZC4gKi8KKwlnYXAgPSAmZnAtPmZkX25lc3RlZDsKKwlsbnVtX3JlbCAtPSBmcC0+ZmRfdG9wOworCSsrbGV2ZWw7CisgICAgfQorCisgICAgcmV0dXJuIGxldmVsOworfQorCisvKiBjaGVja3VwZGF0ZSgpIHt7ezIgKi8KKy8qCisgKiBDaGVjayBpZiB0aGUgZm9sZHMgaW4gd2luZG93ICJ3cCIgYXJlIGludmFsaWQgYW5kIHVwZGF0ZSB0aGVtIGlmIG5lZWRlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGVja3VwZGF0ZSh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaWYgKHdwLT53X2ZvbGRpbnZhbGlkKQorICAgIHsKKwlmb2xkVXBkYXRlKHdwLCAobGluZW5yX1QpMSwgKGxpbmVucl9UKU1BWExOVU0pOyAvKiB3aWxsIHVwZGF0ZSBhbGwgKi8KKwl3cC0+d19mb2xkaW52YWxpZCA9IEZBTFNFOworICAgIH0KK30KKworLyogc2V0Rm9sZFJlcGVhdCgpIHt7ezIgKi8KKy8qCisgKiBPcGVuIG9yIGNsb3NlIGZvbGQgZm9yIGN1cnJlbnQgd2luZG93IGF0IGxpbmUgImxudW0iLgorICogUmVwZWF0ICJjb3VudCIgdGltZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0Rm9sZFJlcGVhdChsbnVtLCBjb3VudCwgb3BlbikKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJY291bnQ7CisgICAgaW50CQlvcGVuOworeworICAgIGludAkJZG9uZTsKKyAgICBsb25nCW47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgY291bnQ7ICsrbikKKyAgICB7CisJZG9uZSA9IERPTkVfTk9USElORzsKKwkodm9pZClzZXRNYW51YWxGb2xkKGxudW0sIG9wZW4sIEZBTFNFLCAmZG9uZSk7CisJaWYgKCEoZG9uZSAmIERPTkVfQUNUSU9OKSkKKwl7CisJICAgIC8qIE9ubHkgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gbm8gZm9sZCBjb3VsZCBiZSBvcGVuZWQuICovCisJICAgIGlmIChuID09IDAgJiYgIShkb25lICYgRE9ORV9GT0xEKSkKKwkJRU1TRyhfKGVfbm9mb2xkKSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIHNldE1hbnVhbEZvbGQoKSB7e3syICovCisvKgorICogT3BlbiBvciBjbG9zZSB0aGUgZm9sZCBpbiB0aGUgY3VycmVudCB3aW5kb3cgd2hpY2ggY29udGFpbnMgImxudW0iLgorICogQWxzbyBkb2VzIHRoaXMgZm9yIG90aGVyIHdpbmRvd3MgaW4gZGlmZiBtb2RlIHdoZW4gbmVlZGVkLgorICovCisgICAgc3RhdGljIGxpbmVucl9UCitzZXRNYW51YWxGb2xkKGxudW0sIG9wZW5pbmcsIHJlY3Vyc2UsIGRvbmVwKQorICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlvcGVuaW5nOyAgICAvKiBUUlVFIHdoZW4gb3BlbmluZywgRkFMU0Ugd2hlbiBjbG9zaW5nICovCisgICAgaW50CQlyZWN1cnNlOyAgICAvKiBUUlVFIHdoZW4gY2xvc2luZy9vcGVuaW5nIHJlY3Vyc2l2ZSAqLworICAgIGludAkJKmRvbmVwOworeworI2lmZGVmIEZFQVRfRElGRgorICAgIGlmIChmb2xkbWV0aG9kSXNEaWZmKGN1cndpbikgJiYgY3Vyd2luLT53X3Bfc2NiKQorICAgIHsKKwl3aW5fVAkgICAgKndwOworCWxpbmVucl9UICAgIGRsbnVtOworCisJLyoKKwkgKiBEbyB0aGUgc2FtZSBvcGVyYXRpb24gaW4gb3RoZXIgd2luZG93cyBpbiBkaWZmIG1vZGUuICBDYWxjdWxhdGUgdGhlCisJICogbGluZSBudW1iZXIgZnJvbSB0aGUgZGlmZnMuCisJICovCisJRk9SX0FMTF9XSU5ET1dTKHdwKQorCXsKKwkgICAgaWYgKHdwICE9IGN1cndpbiAmJiBmb2xkbWV0aG9kSXNEaWZmKHdwKSAmJiB3cC0+d19wX3NjYikKKwkgICAgeworCQlkbG51bSA9IGRpZmZfbG51bV93aW4oY3Vyd2luLT53X2N1cnNvci5sbnVtLCB3cCk7CisJCWlmIChkbG51bSAhPSAwKQorCQkgICAgKHZvaWQpc2V0TWFudWFsRm9sZFdpbih3cCwgZGxudW0sIG9wZW5pbmcsIHJlY3Vyc2UsIE5VTEwpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHNldE1hbnVhbEZvbGRXaW4oY3Vyd2luLCBsbnVtLCBvcGVuaW5nLCByZWN1cnNlLCBkb25lcCk7Cit9CisKKy8qIHNldE1hbnVhbEZvbGRXaW4oKSB7e3syICovCisvKgorICogT3BlbiBvciBjbG9zZSB0aGUgZm9sZCBpbiB3aW5kb3cgIndwIiB3aGljaCBjb250YWlucyAibG51bSIuCisgKiAiZG9uZXAiLCB3aGVuIG5vdCBOVUxMLCBwb2ludHMgdG8gZmxhZyB0aGF0IGlzIHNldCB0byBET05FX0ZPTEQgd2hlbiBzb21lCisgKiBmb2xkIHdhcyBmb3VuZCBhbmQgdG8gRE9ORV9BQ1RJT04gd2hlbiBzb21lIGZvbGQgd2FzIG9wZW5lZCBvciBjbG9zZWQuCisgKiBXaGVuICJkb25lcCIgaXMgTlVMTCBnaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBubyBmb2xkIHdhcyBmb3VuZCBmb3IKKyAqICJsbnVtIiwgYnV0IG9ubHkgaWYgIndwIiBpcyAiY3Vyd2luIi4KKyAqIFJldHVybiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIG5leHQgbGluZSB0aGF0IGNvdWxkIGJlIGNsb3NlZC4KKyAqIEl0J3Mgb25seSB2YWxpZCB3aGVuICJvcGVuaW5nIiBpcyBUUlVFIQorICovCisgICAgc3RhdGljIGxpbmVucl9UCitzZXRNYW51YWxGb2xkV2luKHdwLCBsbnVtLCBvcGVuaW5nLCByZWN1cnNlLCBkb25lcCkKKyAgICB3aW5fVAkqd3A7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCW9wZW5pbmc7ICAgIC8qIFRSVUUgd2hlbiBvcGVuaW5nLCBGQUxTRSB3aGVuIGNsb3NpbmcgKi8KKyAgICBpbnQJCXJlY3Vyc2U7ICAgIC8qIFRSVUUgd2hlbiBjbG9zaW5nL29wZW5pbmcgcmVjdXJzaXZlICovCisgICAgaW50CQkqZG9uZXA7Cit7CisgICAgZm9sZF9UCSpmcDsKKyAgICBmb2xkX1QJKmZwMjsKKyAgICBmb2xkX1QJKmZvdW5kID0gTlVMTDsKKyAgICBpbnQJCWo7CisgICAgaW50CQlsZXZlbCA9IDA7CisgICAgaW50CQl1c2VfbGV2ZWwgPSBGQUxTRTsKKyAgICBpbnQJCWZvdW5kX2ZvbGQgPSBGQUxTRTsKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGxpbmVucl9UCW5leHQgPSBNQVhMTlVNOworICAgIGxpbmVucl9UCW9mZiA9IDA7CisgICAgaW50CQlkb25lID0gMDsKKworICAgIGNoZWNrdXBkYXRlKHdwKTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgZm9sZCwgb3BlbiBvciBjbG9zZSBpdC4KKyAgICAgKi8KKyAgICBnYXAgPSAmd3AtPndfZm9sZHM7CisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKCFmb2xkRmluZChnYXAsIGxudW0sICZmcCkpCisJeworCSAgICAvKiBJZiB0aGVyZSBpcyBhIGZvbGxvd2luZyBmb2xkLCBjb250aW51ZSB0aGVyZSBuZXh0IHRpbWUuICovCisJICAgIGlmIChmcCA8IChmb2xkX1QgKilnYXAtPmdhX2RhdGEgKyBnYXAtPmdhX2xlbikKKwkJbmV4dCA9IGZwLT5mZF90b3AgKyBvZmY7CisJICAgIGJyZWFrOworCX0KKworCS8qIGxudW0gaXMgaW5zaWRlIHRoaXMgZm9sZCAqLworCWZvdW5kX2ZvbGQgPSBUUlVFOworCisJLyogSWYgdGhlcmUgaXMgYSBmb2xsb3dpbmcgZm9sZCwgY29udGludWUgdGhlcmUgbmV4dCB0aW1lLiAqLworCWlmIChmcCArIDEgPCAoZm9sZF9UICopZ2FwLT5nYV9kYXRhICsgZ2FwLT5nYV9sZW4pCisJICAgIG5leHQgPSBmcFsxXS5mZF90b3AgKyBvZmY7CisKKwkvKiBDaGFuZ2UgZnJvbSBsZXZlbC1kZXBlbmRlbnQgZm9sZGluZyB0byBtYW51YWwuICovCisJaWYgKHVzZV9sZXZlbCB8fCBmcC0+ZmRfZmxhZ3MgPT0gRkRfTEVWRUwpCisJeworCSAgICB1c2VfbGV2ZWwgPSBUUlVFOworCSAgICBpZiAobGV2ZWwgPj0gd3AtPndfcF9mZGwpCisJCWZwLT5mZF9mbGFncyA9IEZEX0NMT1NFRDsKKwkgICAgZWxzZQorCQlmcC0+ZmRfZmxhZ3MgPSBGRF9PUEVOOworCSAgICBmcDIgPSAoZm9sZF9UICopZnAtPmZkX25lc3RlZC5nYV9kYXRhOworCSAgICBmb3IgKGogPSAwOyBqIDwgZnAtPmZkX25lc3RlZC5nYV9sZW47ICsraikKKwkJZnAyW2pdLmZkX2ZsYWdzID0gRkRfTEVWRUw7CisJfQorCisJLyogU2ltcGxlIGNhc2U6IENsb3NlIHJlY3Vyc2l2ZWx5IG1lYW5zIGNsb3NpbmcgdGhlIGZvbGQuICovCisJaWYgKCFvcGVuaW5nICYmIHJlY3Vyc2UpCisJeworCSAgICBpZiAoZnAtPmZkX2ZsYWdzICE9IEZEX0NMT1NFRCkKKwkgICAgeworCQlkb25lIHw9IERPTkVfQUNUSU9OOworCQlmcC0+ZmRfZmxhZ3MgPSBGRF9DTE9TRUQ7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoZnAtPmZkX2ZsYWdzID09IEZEX0NMT1NFRCkKKwl7CisJICAgIC8qIFdoZW4gb3BlbmluZywgb3BlbiB0b3Btb3N0IGNsb3NlZCBmb2xkLiAqLworCSAgICBpZiAob3BlbmluZykKKwkgICAgeworCQlmcC0+ZmRfZmxhZ3MgPSBGRF9PUEVOOworCQlkb25lIHw9IERPTkVfQUNUSU9OOworCQlpZiAocmVjdXJzZSkKKwkJICAgIGZvbGRPcGVuTmVzdGVkKGZwKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwkvKiBmb2xkIGlzIG9wZW4sIGNoZWNrIG5lc3RlZCBmb2xkcyAqLworCWZvdW5kID0gZnA7CisJZ2FwID0gJmZwLT5mZF9uZXN0ZWQ7CisJbG51bSAtPSBmcC0+ZmRfdG9wOworCW9mZiArPSBmcC0+ZmRfdG9wOworCSsrbGV2ZWw7CisgICAgfQorICAgIGlmIChmb3VuZF9mb2xkKQorICAgIHsKKwkvKiBXaGVuIGNsb3NpbmcgYW5kIG5vdCByZWN1cnNlLCBjbG9zZSBkZWVwZXN0IG9wZW4gZm9sZC4gKi8KKwlpZiAoIW9wZW5pbmcgJiYgZm91bmQgIT0gTlVMTCkKKwl7CisJICAgIGZvdW5kLT5mZF9mbGFncyA9IEZEX0NMT1NFRDsKKwkgICAgZG9uZSB8PSBET05FX0FDVElPTjsKKwl9CisJd3AtPndfZm9sZF9tYW51YWwgPSBUUlVFOworCWlmIChkb25lICYgRE9ORV9BQ1RJT04pCisJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmdfd2luKHdwKTsKKwlkb25lIHw9IERPTkVfRk9MRDsKKyAgICB9CisgICAgZWxzZSBpZiAoZG9uZXAgPT0gTlVMTCAmJiB3cCA9PSBjdXJ3aW4pCisJRU1TRyhfKGVfbm9mb2xkKSk7CisKKyAgICBpZiAoZG9uZXAgIT0gTlVMTCkKKwkqZG9uZXAgfD0gZG9uZTsKKworICAgIHJldHVybiBuZXh0OworfQorCisvKiBmb2xkT3Blbk5lc3RlZCgpIHt7ezIgKi8KKy8qCisgKiBPcGVuIGFsbCBuZXN0ZWQgZm9sZHMgaW4gZm9sZCAiZnByIiByZWN1cnNpdmVseS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkT3Blbk5lc3RlZChmcHIpCisgICAgZm9sZF9UCSpmcHI7Cit7CisgICAgaW50CQlpOworICAgIGZvbGRfVAkqZnA7CisKKyAgICBmcCA9IChmb2xkX1QgKilmcHItPmZkX25lc3RlZC5nYV9kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBmcHItPmZkX25lc3RlZC5nYV9sZW47ICsraSkKKyAgICB7CisJZm9sZE9wZW5OZXN0ZWQoJmZwW2ldKTsKKwlmcFtpXS5mZF9mbGFncyA9IEZEX09QRU47CisgICAgfQorfQorCisvKiBkZWxldGVGb2xkRW50cnkoKSB7e3syICovCisvKgorICogRGVsZXRlIGZvbGQgImlkeCIgZnJvbSBncm93YXJyYXkgImdhcCIuCisgKiBXaGVuICJyZWN1cnNpdmUiIGlzIFRSVUUgYWxzbyBkZWxldGUgYWxsIHRoZSBmb2xkcyBjb250YWluZWQgaW4gaXQuCisgKiBXaGVuICJyZWN1cnNpdmUiIGlzIEZBTFNFIGNvbnRhaW5lZCBmb2xkcyBhcmUgbW92ZWQgb25lIGxldmVsIHVwLgorICovCisgICAgc3RhdGljIHZvaWQKK2RlbGV0ZUZvbGRFbnRyeShnYXAsIGlkeCwgcmVjdXJzaXZlKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgaW50CQlpZHg7CisgICAgaW50CQlyZWN1cnNpdmU7Cit7CisgICAgZm9sZF9UCSpmcDsKKyAgICBpbnQJCWk7CisgICAgbG9uZwltb3ZlZDsKKyAgICBmb2xkX1QJKm5mcDsKKworICAgIGZwID0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGlkeDsKKyAgICBpZiAocmVjdXJzaXZlIHx8IGZwLT5mZF9uZXN0ZWQuZ2FfbGVuID09IDApCisgICAgeworCS8qIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGFpbmVkIGZvbGRzICovCisJZGVsZXRlRm9sZFJlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQpOworCS0tZ2FwLT5nYV9sZW47CisJKytnYXAtPmdhX3Jvb207CisJaWYgKGlkeCA8IGdhcC0+Z2FfbGVuKQorCSAgICBtY2hfbWVtbW92ZShmcCwgZnAgKyAxLCBzaXplb2YoZm9sZF9UKSAqIChnYXAtPmdhX2xlbiAtIGlkeCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIG1vdmUgbmVzdGVkIGZvbGRzIG9uZSBsZXZlbCB1cCwgdG8gb3ZlcndyaXRlIHRoZSBmb2xkIHRoYXQgaXMKKwkgKiBkZWxldGVkLiAqLworCW1vdmVkID0gZnAtPmZkX25lc3RlZC5nYV9sZW47CisJaWYgKGdhX2dyb3coZ2FwLCAoaW50KShtb3ZlZCAtIDEpKSA9PSBPSykKKwl7CisJICAgIC8qIGFkanVzdCBmZF90b3AgYW5kIGZkX2ZsYWdzIGZvciB0aGUgbW92ZWQgZm9sZHMgKi8KKwkgICAgbmZwID0gKGZvbGRfVCAqKWZwLT5mZF9uZXN0ZWQuZ2FfZGF0YTsKKwkgICAgZm9yIChpID0gMDsgaSA8IG1vdmVkOyArK2kpCisJICAgIHsKKwkJbmZwW2ldLmZkX3RvcCArPSBmcC0+ZmRfdG9wOworCQlpZiAoZnAtPmZkX2ZsYWdzID09IEZEX0xFVkVMKQorCQkgICAgbmZwW2ldLmZkX2ZsYWdzID0gRkRfTEVWRUw7CisJCWlmIChmcC0+ZmRfc21hbGwgPT0gTUFZQkUpCisJCSAgICBuZnBbaV0uZmRfc21hbGwgPSBNQVlCRTsKKwkgICAgfQorCisJICAgIC8qIG1vdmUgdGhlIGV4aXN0aW5nIGZvbGRzIGRvd24gdG8gbWFrZSByb29tICovCisJICAgIGlmIChpZHggPCBnYXAtPmdhX2xlbikKKwkJbWNoX21lbW1vdmUoZnAgKyBtb3ZlZCwgZnAgKyAxLAorCQkJCQlzaXplb2YoZm9sZF9UKSAqIChnYXAtPmdhX2xlbiAtIGlkeCkpOworCSAgICAvKiBtb3ZlIHRoZSBjb250YWluZWQgZm9sZHMgb25lIGxldmVsIHVwICovCisJICAgIG1jaF9tZW1tb3ZlKGZwLCBuZnAsIChzaXplX3QpKHNpemVvZihmb2xkX1QpICogbW92ZWQpKTsKKwkgICAgdmltX2ZyZWUobmZwKTsKKwkgICAgZ2FwLT5nYV9sZW4gKz0gbW92ZWQgLSAxOworCSAgICBnYXAtPmdhX3Jvb20gLT0gbW92ZWQgLSAxOworCX0KKyAgICB9Cit9CisKKy8qIGRlbGV0ZUZvbGRSZWN1cnNlKCkge3t7MiAqLworLyoKKyAqIERlbGV0ZSBuZXN0ZWQgZm9sZHMgaW4gYSBmb2xkLgorICovCisgICAgdm9pZAorZGVsZXRlRm9sZFJlY3Vyc2UoZ2FwKQorICAgIGdhcnJheV9UCSpnYXA7Cit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCisJZGVsZXRlRm9sZFJlY3Vyc2UoJigoKGZvbGRfVCAqKShnYXAtPmdhX2RhdGEpKVtpXS5mZF9uZXN0ZWQpKTsKKyAgICBnYV9jbGVhcihnYXApOworfQorCisvKiBmb2xkTWFya0FkanVzdCgpIHt7ezIgKi8KKy8qCisgKiBVcGRhdGUgbGluZSBudW1iZXJzIG9mIGZvbGRzIGZvciBpbnNlcnRlZC9kZWxldGVkIGxpbmVzLgorICovCisgICAgdm9pZAorZm9sZE1hcmtBZGp1c3Qod3AsIGxpbmUxLCBsaW5lMiwgYW1vdW50LCBhbW91bnRfYWZ0ZXIpCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCWxpbmUxOworICAgIGxpbmVucl9UCWxpbmUyOworICAgIGxvbmcJYW1vdW50OworICAgIGxvbmcJYW1vdW50X2FmdGVyOworeworICAgIC8qIElmIGRlbGV0aW5nIG1hcmtzIGZyb20gbGluZTEgdG8gbGluZTIsIGJ1dCBub3QgZGVsZXRpbmcgYWxsIHRob3NlCisgICAgICogbGluZXMsIHNldCBsaW5lMiBzbyB0aGF0IG9ubHkgZGVsZXRlZCBsaW5lcyBoYXZlIHRoZWlyIGZvbGRzIHJlbW92ZWQuICovCisgICAgaWYgKGFtb3VudCA9PSBNQVhMTlVNICYmIGxpbmUyID49IGxpbmUxICYmIGxpbmUyIC0gbGluZTEgPj0gLWFtb3VudF9hZnRlcikKKwlsaW5lMiA9IGxpbmUxIC0gYW1vdW50X2FmdGVyIC0gMTsKKyAgICAvKiBJZiBhcHBlbmRpbmcgYSBsaW5lIGluIEluc2VydCBtb2RlLCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGZvbGQKKyAgICAgKiBqdXN0IGFib3ZlIHRoZSBsaW5lLiAqLworICAgIGlmICgoU3RhdGUgJiBJTlNFUlQpICYmIGFtb3VudCA9PSAobGluZW5yX1QpMSAmJiBsaW5lMiA9PSBNQVhMTlVNKQorCS0tbGluZTE7CisgICAgZm9sZE1hcmtBZGp1c3RSZWN1cnNlKCZ3cC0+d19mb2xkcywgbGluZTEsIGxpbmUyLCBhbW91bnQsIGFtb3VudF9hZnRlcik7Cit9CisKKy8qIGZvbGRNYXJrQWRqdXN0UmVjdXJzZSgpIHt7ezIgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZE1hcmtBZGp1c3RSZWN1cnNlKGdhcCwgbGluZTEsIGxpbmUyLCBhbW91bnQsIGFtb3VudF9hZnRlcikKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGxpbmVucl9UCWxpbmUxOworICAgIGxpbmVucl9UCWxpbmUyOworICAgIGxvbmcJYW1vdW50OworICAgIGxvbmcJYW1vdW50X2FmdGVyOworeworICAgIGZvbGRfVAkqZnA7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCWxhc3Q7CisgICAgbGluZW5yX1QJdG9wOworCisgICAgLyogSW4gSW5zZXJ0IG1vZGUgYW4gaW5zZXJ0ZWQgbGluZSBhdCB0aGUgdG9wIG9mIGEgZm9sZCBpcyBjb25zaWRlcmVkIHBhcnQKKyAgICAgKiBvZiB0aGUgZm9sZCwgb3RoZXJ3aXNlIGl0IGlzbid0LiAqLworICAgIGlmICgoU3RhdGUgJiBJTlNFUlQpICYmIGFtb3VudCA9PSAobGluZW5yX1QpMSAmJiBsaW5lMiA9PSBNQVhMTlVNKQorCXRvcCA9IGxpbmUxICsgMTsKKyAgICBlbHNlCisJdG9wID0gbGluZTE7CisKKyAgICAvKiBGaW5kIHRoZSBmb2xkIGNvbnRhaW5pbmcgb3IganVzdCBiZWxvdyAibGluZTEiLiAqLworICAgICh2b2lkKWZvbGRGaW5kKGdhcCwgbGluZTEsICZmcCk7CisKKyAgICAvKgorICAgICAqIEFkanVzdCBhbGwgZm9sZHMgYmVsb3cgImxpbmUxIiB0aGF0IGFyZSBhZmZlY3RlZC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAoaW50KShmcCAtIChmb2xkX1QgKilnYXAtPmdhX2RhdGEpOyBpIDwgZ2FwLT5nYV9sZW47ICsraSwgKytmcCkKKyAgICB7CisJLyoKKwkgKiBDaGVjayBmb3IgdGhlc2Ugc2l0dWF0aW9uczoKKwkgKgkgIDEgIDIJMworCSAqCSAgMSAgMgkzCisJICogbGluZTEgICAgIDIJMyAgNCAgNQorCSAqCSAgICAgMgkzICA0ICA1CisJICoJICAgICAyCTMgIDQgIDUKKwkgKiBsaW5lMiAgICAgMgkzICA0ICA1CisJICoJCTMgICAgIDUgIDYKKwkgKgkJMyAgICAgNSAgNgorCSAqLworCisJbGFzdCA9IGZwLT5mZF90b3AgKyBmcC0+ZmRfbGVuIC0gMTsgLyogbGFzdCBsaW5lIG9mIGZvbGQgKi8KKworCS8qIDEuIGZvbGQgY29tcGxldGVseSBhYm92ZSBsaW5lMTogbm90aGluZyB0byBkbyAqLworCWlmIChsYXN0IDwgbGluZTEpCisJICAgIGNvbnRpbnVlOworCisJLyogNi4gZm9sZCBiZWxvdyBsaW5lMjogb25seSBhZGp1c3QgZm9yIGFtb3VudF9hZnRlciAqLworCWlmIChmcC0+ZmRfdG9wID4gbGluZTIpCisJeworCSAgICBpZiAoYW1vdW50X2FmdGVyID09IDApCisJCWJyZWFrOworCSAgICBmcC0+ZmRfdG9wICs9IGFtb3VudF9hZnRlcjsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGZwLT5mZF90b3AgPj0gdG9wICYmIGxhc3QgPD0gbGluZTIpCisJICAgIHsKKwkJLyogNC4gZm9sZCBjb21wbGV0ZWx5IGNvbnRhaW5lZCBpbiByYW5nZSAqLworCQlpZiAoYW1vdW50ID09IE1BWExOVU0pCisJCXsKKwkJICAgIC8qIERlbGV0aW5nIGxpbmVzOiBkZWxldGUgdGhlIGZvbGQgY29tcGxldGVseSAqLworCQkgICAgZGVsZXRlRm9sZEVudHJ5KGdhcCwgaSwgVFJVRSk7CisJCSAgICAtLWk7ICAgIC8qIGFkanVzdCBpbmRleCBmb3IgZGVsZXRpb24gKi8KKwkJICAgIC0tZnA7CisJCX0KKwkJZWxzZQorCQkgICAgZnAtPmZkX3RvcCArPSBhbW91bnQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIDIsIDMsIG9yIDU6IG5lZWQgdG8gY29ycmVjdCBuZXN0ZWQgZm9sZHMgdG9vICovCisJCWZvbGRNYXJrQWRqdXN0UmVjdXJzZSgmZnAtPmZkX25lc3RlZCwgbGluZTEgLSBmcC0+ZmRfdG9wLAorCQkJCSAgbGluZTIgLSBmcC0+ZmRfdG9wLCBhbW91bnQsIGFtb3VudF9hZnRlcik7CisJCWlmIChmcC0+ZmRfdG9wIDwgdG9wKQorCQl7CisJCSAgICBpZiAobGFzdCA8PSBsaW5lMikKKwkJICAgIHsKKwkJCS8qIDIuIGZvbGQgY29udGFpbnMgbGluZTEsIGxpbmUyIGlzIGJlbG93IGZvbGQgKi8KKwkJCWlmIChhbW91bnQgPT0gTUFYTE5VTSkKKwkJCSAgICBmcC0+ZmRfbGVuID0gbGluZTEgLSBmcC0+ZmRfdG9wOworCQkJZWxzZQorCQkJICAgIGZwLT5mZF9sZW4gKz0gYW1vdW50OworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogMy4gZm9sZCBjb250YWlucyBsaW5lMSBhbmQgbGluZTIgKi8KKwkJCWZwLT5mZF9sZW4gKz0gYW1vdW50X2FmdGVyOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogNS4gZm9sZCBpcyBiZWxvdyBsaW5lMSBhbmQgY29udGFpbnMgbGluZTIgKi8KKwkJICAgIGlmIChhbW91bnQgPT0gTUFYTE5VTSkKKwkJICAgIHsKKwkJCWZwLT5mZF9sZW4gLT0gbGluZTIgLSBmcC0+ZmRfdG9wICsgMTsKKwkJCWZwLT5mZF90b3AgPSBsaW5lMTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWZwLT5mZF9sZW4gKz0gYW1vdW50X2FmdGVyIC0gYW1vdW50OworCQkJZnAtPmZkX3RvcCArPSBhbW91bnQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIGdldERlZXBlc3ROZXN0aW5nKCkge3t7MiAqLworLyoKKyAqIEdldCB0aGUgbG93ZXN0ICdmb2xkbGV2ZWwnIHZhbHVlIHRoYXQgbWFrZXMgdGhlIGRlZXBlc3QgbmVzdGVkIGZvbGQgaW4gdGhlCisgKiBjdXJyZW50IHdpbmRvdyBvcGVuLgorICovCisgICAgaW50CitnZXREZWVwZXN0TmVzdGluZygpCit7CisgICAgY2hlY2t1cGRhdGUoY3Vyd2luKTsKKyAgICByZXR1cm4gZ2V0RGVlcGVzdE5lc3RpbmdSZWN1cnNlKCZjdXJ3aW4tPndfZm9sZHMpOworfQorCisgICAgc3RhdGljIGludAorZ2V0RGVlcGVzdE5lc3RpbmdSZWN1cnNlKGdhcCkKKyAgICBnYXJyYXlfVAkqZ2FwOworeworICAgIGludAkJaTsKKyAgICBpbnQJCWxldmVsOworICAgIGludAkJbWF4bGV2ZWwgPSAwOworICAgIGZvbGRfVAkqZnA7CisKKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCisgICAgeworCWxldmVsID0gZ2V0RGVlcGVzdE5lc3RpbmdSZWN1cnNlKCZmcFtpXS5mZF9uZXN0ZWQpICsgMTsKKwlpZiAobGV2ZWwgPiBtYXhsZXZlbCkKKwkgICAgbWF4bGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICByZXR1cm4gbWF4bGV2ZWw7Cit9CisKKy8qIGNoZWNrX2Nsb3NlZCgpIHt7ezIgKi8KKy8qCisgKiBDaGVjayBpZiBhIGZvbGQgaXMgY2xvc2VkIGFuZCB1cGRhdGUgdGhlIGluZm8gbmVlZGVkIHRvIGNoZWNrIG5lc3RlZCBmb2xkcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX2Nsb3NlZCh3aW4sIGZwLCB1c2VfbGV2ZWxwLCBsZXZlbCwgbWF5YmVfc21hbGxwLCBsbnVtX29mZikKKyAgICB3aW5fVAkqd2luOworICAgIGZvbGRfVAkqZnA7CisgICAgaW50CQkqdXNlX2xldmVscDsJICAgIC8qIFRSVUU6IG91dGVyIGZvbGQgaGFkIEZEX0xFVkVMICovCisgICAgaW50CQlsZXZlbDsJCSAgICAvKiBmb2xkaW5nIGRlcHRoICovCisgICAgaW50CQkqbWF5YmVfc21hbGxwOwkgICAgLyogVFJVRTogb3V0ZXIgdGhpcyBoYWQgZmRfc21hbGwgPT0gTUFZQkUgKi8KKyAgICBsaW5lbnJfVAlsbnVtX29mZjsJICAgIC8qIGxpbmUgbnVtYmVyIG9mZnNldCBmb3IgZnAtPmZkX3RvcCAqLworeworICAgIGludAkJY2xvc2VkID0gRkFMU0U7CisKKyAgICAvKiBDaGVjayBpZiB0aGlzIGZvbGQgaXMgY2xvc2VkLiAgSWYgdGhlIGZsYWcgaXMgRkRfTEVWRUwgdGhpcworICAgICAqIGZvbGQgYW5kIGFsbCBmb2xkcyBpdCBjb250YWlucyBkZXBlbmQgb24gJ2ZvbGRsZXZlbCcuICovCisgICAgaWYgKCp1c2VfbGV2ZWxwIHx8IGZwLT5mZF9mbGFncyA9PSBGRF9MRVZFTCkKKyAgICB7CisJKnVzZV9sZXZlbHAgPSBUUlVFOworCWlmIChsZXZlbCA+PSB3aW4tPndfcF9mZGwpCisJICAgIGNsb3NlZCA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKGZwLT5mZF9mbGFncyA9PSBGRF9DTE9TRUQpCisJY2xvc2VkID0gVFJVRTsKKworICAgIC8qIFNtYWxsIGZvbGQgaXNuJ3QgY2xvc2VkIGFueXdheS4gKi8KKyAgICBpZiAoZnAtPmZkX3NtYWxsID09IE1BWUJFKQorCSptYXliZV9zbWFsbHAgPSBUUlVFOworICAgIGlmIChjbG9zZWQpCisgICAgeworCWlmICgqbWF5YmVfc21hbGxwKQorCSAgICBmcC0+ZmRfc21hbGwgPSBNQVlCRTsKKwljaGVja1NtYWxsKHdpbiwgZnAsIGxudW1fb2ZmKTsKKwlpZiAoZnAtPmZkX3NtYWxsID09IFRSVUUpCisJICAgIGNsb3NlZCA9IEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gY2xvc2VkOworfQorCisvKiBjaGVja1NtYWxsKCkge3t7MiAqLworLyoKKyAqIFVwZGF0ZSBmZF9zbWFsbCBmaWVsZCBvZiBmb2xkICJmcCIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tTbWFsbCh3cCwgZnAsIGxudW1fb2ZmKQorICAgIHdpbl9UCSp3cDsKKyAgICBmb2xkX1QJKmZwOworICAgIGxpbmVucl9UCWxudW1fb2ZmOwkvKiBvZmZzZXQgZm9yIGZwLT5mZF90b3AgKi8KK3sKKyAgICBpbnQJCWNvdW50OworICAgIGludAkJbjsKKworICAgIGlmIChmcC0+ZmRfc21hbGwgPT0gTUFZQkUpCisgICAgeworCS8qIE1hcmsgYW55IG5lc3RlZCBmb2xkcyB0byBtYXliZS1zbWFsbCAqLworCXNldFNtYWxsTWF5YmUoJmZwLT5mZF9uZXN0ZWQpOworCisJaWYgKGZwLT5mZF9sZW4gPiBjdXJ3aW4tPndfcF9mbWwpCisJICAgIGZwLT5mZF9zbWFsbCA9IEZBTFNFOworCWVsc2UKKwl7CisJICAgIGNvdW50ID0gMDsKKwkgICAgZm9yIChuID0gMDsgbiA8IGZwLT5mZF9sZW47ICsrbikKKwkgICAgeworCQljb3VudCArPSBwbGluZXNfd2luX25vZm9sZCh3cCwgZnAtPmZkX3RvcCArIGxudW1fb2ZmICsgbik7CisJCWlmIChjb3VudCA+IGN1cndpbi0+d19wX2ZtbCkKKwkJeworCQkgICAgZnAtPmZkX3NtYWxsID0gRkFMU0U7CisJCSAgICByZXR1cm47CisJCX0KKwkgICAgfQorCSAgICBmcC0+ZmRfc21hbGwgPSBUUlVFOworCX0KKyAgICB9Cit9CisKKy8qIHNldFNtYWxsTWF5YmUoKSB7e3syICovCisvKgorICogU2V0IHNtYWxsIGZsYWdzIGluICJnYXAiIHRvIE1BWUJFLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldFNtYWxsTWF5YmUoZ2FwKQorICAgIGdhcnJheV9UCSpnYXA7Cit7CisgICAgaW50CQlpOworICAgIGZvbGRfVAkqZnA7CisKKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCisJZnBbaV0uZmRfc21hbGwgPSBNQVlCRTsKK30KKworLyogZm9sZENyZWF0ZU1hcmtlcnMoKSB7e3syICovCisvKgorICogQ3JlYXRlIGEgZm9sZCBmcm9tIGxpbmUgInN0YXJ0IiB0byBsaW5lICJlbmQiIChpbmNsdXNpdmUpIGluIHRoZSBjdXJyZW50CisgKiB3aW5kb3cgYnkgYWRkaW5nIG1hcmtlcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZENyZWF0ZU1hcmtlcnMoc3RhcnQsIGVuZCkKKyAgICBsaW5lbnJfVAlzdGFydDsKKyAgICBsaW5lbnJfVAllbmQ7Cit7CisgICAgaWYgKCFjdXJidWYtPmJfcF9tYSkKKyAgICB7CisJRU1TRyhfKGVfbW9kaWZpYWJsZSkpOworCXJldHVybjsKKyAgICB9CisgICAgcGFyc2VNYXJrZXIoY3Vyd2luKTsKKworICAgIGZvbGRBZGRNYXJrZXIoc3RhcnQsIGN1cndpbi0+d19wX2ZtciwgZm9sZHN0YXJ0bWFya2VybGVuKTsKKyAgICBmb2xkQWRkTWFya2VyKGVuZCwgZm9sZGVuZG1hcmtlciwgZm9sZGVuZG1hcmtlcmxlbik7CisKKyAgICAvKiBVcGRhdGUgYm90aCBjaGFuZ2VzIGhlcmUsIHRvIGF2b2lkIGFsbCBmb2xkcyBhZnRlciB0aGUgc3RhcnQgYXJlCisgICAgICogY2hhbmdlZCB3aGVuIHRoZSBzdGFydCBtYXJrZXIgaXMgaW5zZXJ0ZWQgYW5kIHRoZSBlbmQgaXNuJ3QuICovCisgICAgY2hhbmdlZF9saW5lcyhzdGFydCwgKGNvbG5yX1QpMCwgZW5kLCAwTCk7Cit9CisKKy8qIGZvbGRBZGRNYXJrZXIoKSB7e3syICovCisvKgorICogQWRkICJtYXJrZXJbbWFya2VybGVuXSIgaW4gJ2NvbW1lbnRzdHJpbmcnIHRvIGxpbmUgImxudW0iLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZvbGRBZGRNYXJrZXIobG51bSwgbWFya2VyLCBtYXJrZXJsZW4pCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKm1hcmtlcjsKKyAgICBpbnQJCW1hcmtlcmxlbjsKK3sKKyAgICBjaGFyX3UJKmNtcyA9IGN1cmJ1Zi0+Yl9wX2NtczsKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgaW50CQlsaW5lX2xlbjsKKyAgICBjaGFyX3UJKm5ld2xpbmU7CisgICAgY2hhcl91CSpwID0gKGNoYXJfdSAqKXN0cnN0cigoY2hhciAqKWN1cmJ1Zi0+Yl9wX2NtcywgIiVzIik7CisKKyAgICAvKiBBbGxvY2F0ZSBhIG5ldyBsaW5lOiBvbGQtbGluZSArICdjbXMnLXN0YXJ0ICsgbWFya2VyICsgJ2NtcyctZW5kICovCisgICAgbGluZSA9IG1sX2dldChsbnVtKTsKKyAgICBsaW5lX2xlbiA9IChpbnQpU1RSTEVOKGxpbmUpOworCisgICAgaWYgKHVfc2F2ZShsbnVtIC0gMSwgbG51bSArIDEpID09IE9LKQorICAgIHsKKwluZXdsaW5lID0gYWxsb2MoKHVuc2lnbmVkKShsaW5lX2xlbiArIG1hcmtlcmxlbiArIFNUUkxFTihjbXMpICsgMSkpOworCWlmIChuZXdsaW5lID09IE5VTEwpCisJICAgIHJldHVybjsKKwlTVFJDUFkobmV3bGluZSwgbGluZSk7CisJaWYgKHAgPT0gTlVMTCkKKwl7CisJICAgIFNUUk5DUFkobmV3bGluZSArIGxpbmVfbGVuLCBtYXJrZXIsIG1hcmtlcmxlbik7CisJICAgIG5ld2xpbmVbbGluZV9sZW4gKyBtYXJrZXJsZW5dID0gTlVMOworCX0KKwllbHNlCisJeworCSAgICBTVFJDUFkobmV3bGluZSArIGxpbmVfbGVuLCBjbXMpOworCSAgICBTVFJOQ1BZKG5ld2xpbmUgKyBsaW5lX2xlbiArIChwIC0gY21zKSwgbWFya2VyLCBtYXJrZXJsZW4pOworCSAgICBTVFJDUFkobmV3bGluZSArIGxpbmVfbGVuICsgKHAgLSBjbXMpICsgbWFya2VybGVuLCBwICsgMik7CisJfQorCisJbWxfcmVwbGFjZShsbnVtLCBuZXdsaW5lLCBGQUxTRSk7CisgICAgfQorfQorCisvKiBkZWxldGVGb2xkTWFya2VycygpIHt7ezIgKi8KKy8qCisgKiBEZWxldGUgdGhlIG1hcmtlcnMgZm9yIGEgZm9sZCwgY2F1c2luZyBpdCB0byBiZSBkZWxldGVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2RlbGV0ZUZvbGRNYXJrZXJzKGZwLCByZWN1cnNpdmUsIGxudW1fb2ZmKQorICAgIGZvbGRfVAkqZnA7CisgICAgaW50CQlyZWN1cnNpdmU7CisgICAgbGluZW5yX1QJbG51bV9vZmY7CS8qIG9mZnNldCBmb3IgZnAtPmZkX3RvcCAqLworeworICAgIGludAkJaTsKKworICAgIGlmIChyZWN1cnNpdmUpCisJZm9yIChpID0gMDsgaSA8IGZwLT5mZF9uZXN0ZWQuZ2FfbGVuOyArK2kpCisJICAgIGRlbGV0ZUZvbGRNYXJrZXJzKChmb2xkX1QgKilmcC0+ZmRfbmVzdGVkLmdhX2RhdGEgKyBpLCBUUlVFLAorCQkJCQkJICAgICAgIGxudW1fb2ZmICsgZnAtPmZkX3RvcCk7CisgICAgZm9sZERlbE1hcmtlcihmcC0+ZmRfdG9wICsgbG51bV9vZmYsIGN1cndpbi0+d19wX2ZtciwgZm9sZHN0YXJ0bWFya2VybGVuKTsKKyAgICBmb2xkRGVsTWFya2VyKGZwLT5mZF90b3AgKyBsbnVtX29mZiArIGZwLT5mZF9sZW4gLSAxLAorCQkJCQkgICAgIGZvbGRlbmRtYXJrZXIsIGZvbGRlbmRtYXJrZXJsZW4pOworfQorCisvKiBmb2xkRGVsTWFya2VyKCkge3t7MiAqLworLyoKKyAqIERlbGV0ZSBtYXJrZXIgIm1hcmtlclttYXJrZXJsZW5dIiBhdCB0aGUgZW5kIG9mIGxpbmUgImxudW0iLgorICogRGVsZXRlICdjb21tZW50c3RyaW5nJyBpZiBpdCBtYXRjaGVzLgorICogSWYgdGhlIG1hcmtlciBpcyBub3QgZm91bmQsIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBDb3VsZCBhIG1pc3NpbmcKKyAqIGNsb3NlLW1hcmtlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkRGVsTWFya2VyKGxudW0sIG1hcmtlciwgbWFya2VybGVuKQorICAgIGxpbmVucl9UCWxudW07CisgICAgY2hhcl91CSptYXJrZXI7CisgICAgaW50CQltYXJrZXJsZW47Cit7CisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqbmV3bGluZTsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpjbXMgPSBjdXJidWYtPmJfcF9jbXM7CisgICAgY2hhcl91CSpjbXMyOworCisgICAgbGluZSA9IG1sX2dldChsbnVtKTsKKyAgICBmb3IgKHAgPSBsaW5lOyAqcCAhPSBOVUw7ICsrcCkKKwlpZiAoU1RSTkNNUChwLCBtYXJrZXIsIG1hcmtlcmxlbikgPT0gMCkKKwl7CisJICAgIC8qIEZvdW5kIHRoZSBtYXJrZXIsIGluY2x1ZGUgYSBkaWdpdCBpZiBpdCdzIHRoZXJlLiAqLworCSAgICBsZW4gPSBtYXJrZXJsZW47CisJICAgIGlmIChWSU1fSVNESUdJVChwW2xlbl0pKQorCQkrK2xlbjsKKwkgICAgaWYgKCpjbXMgIT0gTlVMKQorCSAgICB7CisJCS8qIEFsc28gZGVsZXRlICdjb21tZW50c3RyaW5nJyBpZiBpdCBtYXRjaGVzLiAqLworCQljbXMyID0gKGNoYXJfdSAqKXN0cnN0cigoY2hhciAqKWNtcywgIiVzIik7CisJCWlmIChwIC0gbGluZSA+PSBjbXMyIC0gY21zCisJCQkmJiBTVFJOQ01QKHAgLSAoY21zMiAtIGNtcyksIGNtcywgY21zMiAtIGNtcykgPT0gMAorCQkJJiYgU1RSTkNNUChwICsgbGVuLCBjbXMyICsgMiwgU1RSTEVOKGNtczIgKyAyKSkgPT0gMCkKKwkJeworCQkgICAgcCAtPSBjbXMyIC0gY21zOworCQkgICAgbGVuICs9IChpbnQpU1RSTEVOKGNtcykgLSAyOworCQl9CisJICAgIH0KKwkgICAgaWYgKHVfc2F2ZShsbnVtIC0gMSwgbG51bSArIDEpID09IE9LKQorCSAgICB7CisJCS8qIE1ha2UgbmV3IGxpbmU6IHRleHQtYmVmb3JlLW1hcmtlciArIHRleHQtYWZ0ZXItbWFya2VyICovCisJCW5ld2xpbmUgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihsaW5lKSAtIGxlbiArIDEpKTsKKwkJaWYgKG5ld2xpbmUgIT0gTlVMTCkKKwkJeworCQkgICAgU1RSTkNQWShuZXdsaW5lLCBsaW5lLCBwIC0gbGluZSk7CisJCSAgICBTVFJDUFkobmV3bGluZSArIChwIC0gbGluZSksIHAgKyBsZW4pOworCQkgICAgbWxfcmVwbGFjZShsbnVtLCBuZXdsaW5lLCBGQUxTRSk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9Cit9CisKKy8qIGZvbGR0ZXh0X2NsZWFudXAoKSB7e3syICovCisvKgorICogUmVtb3ZlICdmb2xkbWFya2VyJyBhbmQgJ2NvbW1lbnRzdHJpbmcnIGZyb20gInN0ciIgKGluLXBsYWNlKS4KKyAqLworICAgIHZvaWQKK2ZvbGR0ZXh0X2NsZWFudXAoc3RyKQorICAgIGNoYXJfdQkqc3RyOworeworICAgIGNoYXJfdQkqY21zX3N0YXJ0OwkvKiBmaXJzdCBwYXJ0IG9yIHRoZSB3aG9sZSBjb21tZW50ICovCisgICAgaW50CQljbXNfc2xlbiA9IDA7CS8qIGxlbmd0aCBvZiBjbXNfc3RhcnQgKi8KKyAgICBjaGFyX3UJKmNtc19lbmQ7CS8qIGxhc3QgcGFydCBvZiB0aGUgY29tbWVudCBvciBOVUxMICovCisgICAgaW50CQljbXNfZWxlbiA9IDA7CS8qIGxlbmd0aCBvZiBjbXNfZW5kICovCisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworICAgIGludAkJZGlkMSA9IEZBTFNFOworICAgIGludAkJZGlkMiA9IEZBTFNFOworCisgICAgLyogSWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGluICdjb21tZW50c3RyaW5nJy4gKi8KKyAgICBjbXNfc3RhcnQgPSBza2lwd2hpdGUoY3VyYnVmLT5iX3BfY21zKTsKKyAgICBjbXNfc2xlbiA9IFNUUkxFTihjbXNfc3RhcnQpOworICAgIHdoaWxlIChjbXNfc2xlbiA+IDAgJiYgdmltX2lzd2hpdGUoY21zX3N0YXJ0W2Ntc19zbGVuIC0gMV0pKQorCS0tY21zX3NsZW47CisKKyAgICAvKiBsb2NhdGUgIiVzIiBpbiAnY29tbWVudHN0cmluZycsIHVzZSB0aGUgcGFydCBiZWZvcmUgYW5kIGFmdGVyIGl0LiAqLworICAgIGNtc19lbmQgPSAoY2hhcl91ICopc3Ryc3RyKChjaGFyICopY21zX3N0YXJ0LCAiJXMiKTsKKyAgICBpZiAoY21zX2VuZCAhPSBOVUxMKQorICAgIHsKKwljbXNfZWxlbiA9IGNtc19zbGVuIC0gKGNtc19lbmQgLSBjbXNfc3RhcnQpOworCWNtc19zbGVuID0gY21zX2VuZCAtIGNtc19zdGFydDsKKworCS8qIGV4Y2x1ZGUgd2hpdGUgc3BhY2UgYmVmb3JlICIlcyIgKi8KKwl3aGlsZSAoY21zX3NsZW4gPiAwICYmIHZpbV9pc3doaXRlKGNtc19zdGFydFtjbXNfc2xlbiAtIDFdKSkKKwkgICAgLS1jbXNfc2xlbjsKKworCS8qIHNraXAgIiVzIiBhbmQgd2hpdGUgc3BhY2UgYWZ0ZXIgaXQgKi8KKwlzID0gc2tpcHdoaXRlKGNtc19lbmQgKyAyKTsKKwljbXNfZWxlbiAtPSBzIC0gY21zX2VuZDsKKwljbXNfZW5kID0gczsKKyAgICB9CisgICAgcGFyc2VNYXJrZXIoY3Vyd2luKTsKKworICAgIGZvciAocyA9IHN0cjsgKnMgIT0gTlVMOyApCisgICAgeworCWxlbiA9IDA7CisJaWYgKFNUUk5DTVAocywgY3Vyd2luLT53X3BfZm1yLCBmb2xkc3RhcnRtYXJrZXJsZW4pID09IDApCisJeworCSAgICBsZW4gPSBmb2xkc3RhcnRtYXJrZXJsZW47CisJICAgIGlmIChWSU1fSVNESUdJVChzW2xlbl0pKQorCQkrK2xlbjsKKwl9CisJZWxzZSBpZiAoU1RSTkNNUChzLCBmb2xkZW5kbWFya2VyLCBmb2xkZW5kbWFya2VybGVuKSA9PSAwKQorCXsKKwkgICAgbGVuID0gZm9sZGVuZG1hcmtlcmxlbjsKKwkgICAgaWYgKFZJTV9JU0RJR0lUKHNbbGVuXSkpCisJCSsrbGVuOworCX0KKwllbHNlIGlmIChjbXNfZW5kICE9IE5VTEwpCisJeworCSAgICBpZiAoIWRpZDEgJiYgU1RSTkNNUChzLCBjbXNfc3RhcnQsIGNtc19zbGVuKSA9PSAwKQorCSAgICB7CisJCWxlbiA9IGNtc19zbGVuOworCQlkaWQxID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlIGlmICghZGlkMiAmJiBTVFJOQ01QKHMsIGNtc19lbmQsIGNtc19lbGVuKSA9PSAwKQorCSAgICB7CisJCWxlbiA9IGNtc19lbGVuOworCQlkaWQyID0gVFJVRTsKKwkgICAgfQorCX0KKwlpZiAobGVuICE9IDApCisJeworCSAgICB3aGlsZSAodmltX2lzd2hpdGUoc1tsZW5dKSkKKwkJKytsZW47CisJICAgIG1jaF9tZW1tb3ZlKHMsIHMgKyBsZW4sIFNUUkxFTihzICsgbGVuKSArIDEpOworCX0KKwllbHNlCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKytzOworCX0KKyAgICB9Cit9CisKKy8qIEZvbGRpbmcgYnkgaW5kZW50LCBleHByLCBtYXJrZXIgYW5kIHN5bnRheC4ge3t7MSAqLworLyogRGVmaW5lICJmbGluZV9UIiwgcGFzc2VkIHRvIGdldCBmb2xkIGxldmVsIGZvciBhIGxpbmUuIHt7ezIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgd2luX1QJKndwOwkJLyogd2luZG93ICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIGN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyAgICBsaW5lbnJfVAlvZmY7CQkvKiBvZmZzZXQgYmV0d2VlbiBsbnVtIGFuZCByZWFsIGxpbmUgbnVtYmVyICovCisgICAgbGluZW5yX1QJbG51bV9zYXZlOwkvKiBsaW5lIG5yIHVzZWQgYnkgZm9sZFVwZGF0ZUlFTVNSZWN1cnNlKCkgKi8KKyAgICBpbnQJCWx2bDsJCS8qIGN1cnJlbnQgbGV2ZWwgKC0xIGZvciB1bmRlZmluZWQpICovCisgICAgaW50CQlsdmxfbmV4dDsJLyogbGV2ZWwgdXNlZCBmb3IgbmV4dCBsaW5lICovCisgICAgaW50CQlzdGFydDsJCS8qIG51bWJlciBvZiBmb2xkcyB0aGF0IGFyZSBmb3JjZWQgdG8gc3RhcnQgYXQKKwkJCQkgICB0aGlzIGxpbmUuICovCisgICAgaW50CQllbmQ7CQkvKiBsZXZlbCBvZiBmb2xkIHRoYXQgaXMgZm9yY2VkIHRvIGVuZCBiZWxvdworCQkJCSAgIHRoaXMgbGluZSAqLworICAgIGludAkJaGFkX2VuZDsJLyogbGV2ZWwgb2YgZm9sZCB0aGF0IGlzIGZvcmNlZCB0byBlbmQgYWJvdmUKKwkJCQkgICB0aGlzIGxpbmUgKGNvcHkgb2YgImVuZCIgb2YgcHJldi4gbGluZSkgKi8KK30gZmxpbmVfVDsKKworLyogRmxhZyBpcyBzZXQgd2hlbiByZWRyYXdpbmcgaXMgbmVlZGVkLiAqLworc3RhdGljIGludCBmb2xkX2NoYW5nZWQ7CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4ge3t7MiAqLworc3RhdGljIGxpbmVucl9UIGZvbGRVcGRhdGVJRU1TUmVjdXJzZSBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGludCBsZXZlbCwgbGluZW5yX1Qgc3RhcnRsbnVtLCBmbGluZV9UICpmbHAsIHZvaWQgKCpnZXRsZXZlbClfX0FSR1MoKGZsaW5lX1QgKikpLCBsaW5lbnJfVCBib3QsIGludCB0b3BmbGFncykpOworc3RhdGljIGludCBmb2xkSW5zZXJ0IF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgaW50IGkpKTsKK3N0YXRpYyB2b2lkIGZvbGRTcGxpdCBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGludCBpLCBsaW5lbnJfVCB0b3AsIGxpbmVucl9UIGJvdCkpOworc3RhdGljIHZvaWQgZm9sZFJlbW92ZSBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGxpbmVucl9UIHRvcCwgbGluZW5yX1QgYm90KSk7CitzdGF0aWMgdm9pZCBmb2xkTWVyZ2UgX19BUkdTKChmb2xkX1QgKmZwMSwgZ2FycmF5X1QgKmdhcCwgZm9sZF9UICpmcDIpKTsKK3N0YXRpYyB2b2lkIGZvbGRsZXZlbEluZGVudCBfX0FSR1MoKGZsaW5lX1QgKmZscCkpOworI2lmZGVmIEZFQVRfRElGRgorc3RhdGljIHZvaWQgZm9sZGxldmVsRGlmZiBfX0FSR1MoKGZsaW5lX1QgKmZscCkpOworI2VuZGlmCitzdGF0aWMgdm9pZCBmb2xkbGV2ZWxFeHByIF9fQVJHUygoZmxpbmVfVCAqZmxwKSk7CitzdGF0aWMgdm9pZCBmb2xkbGV2ZWxNYXJrZXIgX19BUkdTKChmbGluZV9UICpmbHApKTsKK3N0YXRpYyB2b2lkIGZvbGRsZXZlbFN5bnRheCBfX0FSR1MoKGZsaW5lX1QgKmZscCkpOworCisvKiBmb2xkVXBkYXRlSUVNUygpIHt7ezIgKi8KKy8qCisgKiBVcGRhdGUgdGhlIGZvbGRpbmcgZm9yIHdpbmRvdyAid3AiLCBhdCBsZWFzdCBmcm9tIGxpbmVzICJ0b3AiIHRvICJib3QiLgorICogUmV0dXJuIFRSVUUgaWYgYW55IGZvbGRzIGRpZCBjaGFuZ2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZFVwZGF0ZUlFTVMod3AsIHRvcCwgYm90KQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAl0b3A7CisgICAgbGluZW5yX1QJYm90OworeworICAgIGxpbmVucl9UCXN0YXJ0OworICAgIGxpbmVucl9UCWVuZDsKKyAgICBmbGluZV9UCWZsaW5lOworICAgIHZvaWQJKCpnZXRsZXZlbClfX0FSR1MoKGZsaW5lX1QgKikpOworICAgIGludAkJbGV2ZWw7CisgICAgZm9sZF9UCSpmcDsKKworICAgIC8qIEF2b2lkIHByb2JsZW1zIHdoZW4gYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZWx5LiAqLworICAgIGlmIChpbnZhbGlkX3RvcCAhPSAobGluZW5yX1QpMCkKKwlyZXR1cm47CisKKyAgICBpZiAod3AtPndfZm9sZGludmFsaWQpCisgICAgeworCS8qIE5lZWQgdG8gdXBkYXRlIGFsbCBmb2xkcy4gKi8KKwl0b3AgPSAxOworCWJvdCA9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50OworCXdwLT53X2ZvbGRpbnZhbGlkID0gRkFMU0U7CisKKwkvKiBNYXJrIGFsbCBmb2xkcyBhIG1heWJlLXNtYWxsLiAqLworCXNldFNtYWxsTWF5YmUoJndwLT53X2ZvbGRzKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKiBhZGQgdGhlIGNvbnRleHQgZm9yICJkaWZmIiBmb2xkaW5nICovCisgICAgaWYgKGZvbGRtZXRob2RJc0RpZmYod3ApKQorICAgIHsKKwlpZiAodG9wID4gZGlmZl9jb250ZXh0KQorCSAgICB0b3AgLT0gZGlmZl9jb250ZXh0OworCWVsc2UKKwkgICAgdG9wID0gMTsKKwlib3QgKz0gZGlmZl9jb250ZXh0OworICAgIH0KKyNlbmRpZgorCisgICAgLyogV2hlbiBkZWxldGluZyBsaW5lcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgInRvcCIgY2FuIGJlIHBhc3QgdGhlIGVuZAorICAgICAqIG9mIHRoZSBidWZmZXIuICovCisgICAgaWYgKHRvcCA+IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXRvcCA9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50OworCisgICAgZm9sZF9jaGFuZ2VkID0gRkFMU0U7CisgICAgZmxpbmUud3AgPSB3cDsKKyAgICBmbGluZS5vZmYgPSAwOworICAgIGZsaW5lLmx2bCA9IDA7CisgICAgZmxpbmUubHZsX25leHQgPSAtMTsKKyAgICBmbGluZS5zdGFydCA9IDA7CisgICAgZmxpbmUuZW5kID0gTUFYX0xFVkVMICsgMTsKKyAgICBmbGluZS5oYWRfZW5kID0gTUFYX0xFVkVMICsgMTsKKworICAgIGludmFsaWRfdG9wID0gdG9wOworICAgIGludmFsaWRfYm90ID0gYm90OworCisgICAgaWYgKGZvbGRtZXRob2RJc01hcmtlcih3cCkpCisgICAgeworCWdldGxldmVsID0gZm9sZGxldmVsTWFya2VyOworCisJLyogSW5pdCBtYXJrZXIgdmFyaWFibGVzIHRvIHNwZWVkIHVwIGZvbGRsZXZlbE1hcmtlcigpLiAqLworCXBhcnNlTWFya2VyKHdwKTsKKworCS8qIE5lZWQgdG8gZ2V0IHRoZSBsZXZlbCBvZiB0aGUgbGluZSBhYm92ZSB0b3AsIGl0IGlzIHVzZWQgaWYgdGhlcmUgaXMKKwkgKiBubyBtYXJrZXIgYXQgdGhlIHRvcC4gKi8KKwlpZiAodG9wID4gMSkKKwl7CisJICAgIC8qIEdldCB0aGUgZm9sZCBsZXZlbCBhdCB0b3AgLSAxLiAqLworCSAgICBsZXZlbCA9IGZvbGRMZXZlbFdpbih3cCwgdG9wIC0gMSk7CisKKwkgICAgLyogVGhlIGZvbGQgbWF5IGVuZCBqdXN0IGFib3ZlIHRoZSB0b3AsIGNoZWNrIGZvciB0aGF0LiAqLworCSAgICBmbGluZS5sbnVtID0gdG9wIC0gMTsKKwkgICAgZmxpbmUubHZsID0gbGV2ZWw7CisJICAgIGdldGxldmVsKCZmbGluZSk7CisKKwkgICAgLyogSWYgYSBmb2xkIHN0YXJ0ZWQgaGVyZSwgd2UgYWxyZWFkeSBoYWQgdGhlIGxldmVsLCBpZiBpdCBzdG9wcworCSAgICAgKiBoZXJlLCB3ZSBuZWVkIHRvIHVzZSBsdmxfbmV4dC4gIENvdWxkIGFsc28gc3RhcnQgYW5kIGVuZCBhIGZvbGQKKwkgICAgICogaW4gdGhlIHNhbWUgbGluZS4gKi8KKwkgICAgaWYgKGZsaW5lLmx2bCA+IGxldmVsKQorCQlmbGluZS5sdmwgPSBsZXZlbCAtIChmbGluZS5sdmwgLSBmbGluZS5sdmxfbmV4dCk7CisJICAgIGVsc2UKKwkJZmxpbmUubHZsID0gZmxpbmUubHZsX25leHQ7CisJfQorCWZsaW5lLmxudW0gPSB0b3A7CisJZ2V0bGV2ZWwoJmZsaW5lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmbGluZS5sbnVtID0gdG9wOworCWlmIChmb2xkbWV0aG9kSXNFeHByKHdwKSkKKwl7CisJICAgIGdldGxldmVsID0gZm9sZGxldmVsRXhwcjsKKwkgICAgLyogc3RhcnQgb25lIGxpbmUgYmFjaywgYmVjYXVzZSBhICI8MSIgbWF5IGluZGljYXRlIHRoZSBlbmQgb2YgYQorCSAgICAgKiBmb2xkIGluIHRoZSB0b3BsaW5lICovCisJICAgIGlmICh0b3AgPiAxKQorCQktLWZsaW5lLmxudW07CisJfQorCWVsc2UgaWYgKGZvbGRtZXRob2RJc1N5bnRheCh3cCkpCisJICAgIGdldGxldmVsID0gZm9sZGxldmVsU3ludGF4OworI2lmZGVmIEZFQVRfRElGRgorCWVsc2UgaWYgKGZvbGRtZXRob2RJc0RpZmYod3ApKQorCSAgICBnZXRsZXZlbCA9IGZvbGRsZXZlbERpZmY7CisjZW5kaWYKKwllbHNlCisJICAgIGdldGxldmVsID0gZm9sZGxldmVsSW5kZW50OworCisJLyogQmFja3VwIHRvIGEgbGluZSBmb3Igd2hpY2ggdGhlIGZvbGQgbGV2ZWwgaXMgZGVmaW5lZC4gIFNpbmNlIGl0J3MKKwkgKiBhbHdheXMgZGVmaW5lZCBmb3IgbGluZSBvbmUsIHdlIHdpbGwgc3RvcCB0aGVyZS4gKi8KKwlmbGluZS5sdmwgPSAtMTsKKwlmb3IgKCA7ICFnb3RfaW50OyAtLWZsaW5lLmxudW0pCisJeworCSAgICAvKiBSZXNldCBsdmxfbmV4dCBlYWNoIHRpbWUsIGJlY2F1c2UgaXQgd2lsbCBiZSBzZXQgdG8gYSB2YWx1ZSBmb3IKKwkgICAgICogdGhlIG5leHQgbGluZSwgYnV0IHdlIHNlYXJjaCBiYWNrd2FyZHMgaGVyZS4gKi8KKwkgICAgZmxpbmUubHZsX25leHQgPSAtMTsKKwkgICAgZ2V0bGV2ZWwoJmZsaW5lKTsKKwkgICAgaWYgKGZsaW5lLmx2bCA+PSAwKQorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgc3RhcnQgPSBmbGluZS5sbnVtOworICAgIGVuZCA9IGJvdDsKKyAgICAvKiBEbyBhdCBsZWFzdCBvbmUgbGluZS4gKi8KKyAgICBpZiAoc3RhcnQgPiBlbmQgJiYgZW5kIDwgd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQpCisJZW5kID0gc3RhcnQ7CisgICAgd2hpbGUgKCFnb3RfaW50KQorICAgIHsKKwkvKiBBbHdheXMgc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICgiZW5kIiBjYW4gYmUgcGFzdCB0aGUgZW5kIG9mCisJICogdGhlIGZpbGUpLiAqLworCWlmIChmbGluZS5sbnVtID4gd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIGJyZWFrOworCWlmIChmbGluZS5sbnVtID4gZW5kKQorCXsKKwkgICAgLyogRm9yICJtYXJrZXIiLCAiZXhwciIgIGFuZCAic3ludGF4IiAgbWV0aG9kczogSWYgYSBjaGFuZ2UgY2F1c2VkCisJICAgICAqIGEgZm9sZCB0byBiZSByZW1vdmVkLCB3ZSBuZWVkIHRvIGNvbnRpbnVlIGF0IGxlYXN0IHVudGlsIHdoZXJlCisJICAgICAqIGl0IGVuZGVkLiAqLworCSAgICBpZiAoZ2V0bGV2ZWwgIT0gZm9sZGxldmVsTWFya2VyCisJCSAgICAmJiBnZXRsZXZlbCAhPSBmb2xkbGV2ZWxTeW50YXgKKwkJICAgICYmIGdldGxldmVsICE9IGZvbGRsZXZlbEV4cHIpCisJCWJyZWFrOworCSAgICBpZiAoKHN0YXJ0IDw9IGVuZAorCQkJJiYgZm9sZEZpbmQoJndwLT53X2ZvbGRzLCBlbmQsICZmcCkKKwkJCSYmIGZwLT5mZF90b3AgKyBmcC0+ZmRfbGVuIC0gMSA+IGVuZCkKKwkJICAgIHx8IChmbGluZS5sdmwgPT0gMAorCQkJJiYgZm9sZEZpbmQoJndwLT53X2ZvbGRzLCBmbGluZS5sbnVtLCAmZnApCisJCQkmJiBmcC0+ZmRfdG9wIDwgZmxpbmUubG51bSkpCisJCWVuZCA9IGZwLT5mZF90b3AgKyBmcC0+ZmRfbGVuIC0gMTsKKwkgICAgZWxzZSBpZiAoZ2V0bGV2ZWwgPT0gZm9sZGxldmVsU3ludGF4CisJCSAgICAmJiBmb2xkTGV2ZWxXaW4od3AsIGZsaW5lLmxudW0pICE9IGZsaW5lLmx2bCkKKwkJLyogRm9yICJzeW50YXgiIG1ldGhvZDogQ29tcGFyZSB0aGUgZm9sZGxldmVsIHRoYXQgdGhlIHN5bnRheAorCQkgKiB0ZWxscyB1cyB0byB0aGUgZm9sZGxldmVsIGZyb20gdGhlIGV4aXN0aW5nIGZvbGRzLiAgSWYgdGhleQorCQkgKiBkb24ndCBtYXRjaCBjb250aW51ZSB1cGRhdGluZyBmb2xkcy4gKi8KKwkJZW5kID0gZmxpbmUubG51bTsKKwkgICAgZWxzZQorCQlicmVhazsKKwl9CisKKwkvKiBBIGxldmVsIDEgZm9sZCBzdGFydHMgYXQgYSBsaW5lIHdpdGggZm9sZGxldmVsID4gMC4gKi8KKwlpZiAoZmxpbmUubHZsID4gMCkKKwl7CisJICAgIGludmFsaWRfdG9wID0gZmxpbmUubG51bTsKKwkgICAgaW52YWxpZF9ib3QgPSBlbmQ7CisJICAgIGVuZCA9IGZvbGRVcGRhdGVJRU1TUmVjdXJzZSgmd3AtPndfZm9sZHMsCisJCQkJICAgMSwgc3RhcnQsICZmbGluZSwgZ2V0bGV2ZWwsIGVuZCwgRkRfTEVWRUwpOworCSAgICBzdGFydCA9IGZsaW5lLmxudW07CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChmbGluZS5sbnVtID09IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQlicmVhazsKKwkgICAgKytmbGluZS5sbnVtOworCSAgICBmbGluZS5sdmwgPSBmbGluZS5sdmxfbmV4dDsKKwkgICAgZ2V0bGV2ZWwoJmZsaW5lKTsKKwl9CisgICAgfQorCisgICAgLyogVGhlcmUgY2FuJ3QgYmUgYW55IGZvbGRzIGZyb20gc3RhcnQgdW50aWwgZW5kIG5vdy4gKi8KKyAgICBmb2xkUmVtb3ZlKCZ3cC0+d19mb2xkcywgc3RhcnQsIGVuZCk7CisKKyAgICAvKiBJZiBzb21lIGZvbGQgY2hhbmdlZCwgbmVlZCB0byByZWRyYXcgYW5kIHBvc2l0aW9uIGN1cnNvci4gKi8KKyAgICBpZiAoZm9sZF9jaGFuZ2VkICYmIHdwLT53X3BfZmVuKQorCWNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKworICAgIC8qIElmIHdlIHVwZGF0ZWQgZm9sZHMgcGFzdCAiYm90IiwgbmVlZCB0byByZWRyYXcgbW9yZSBsaW5lcy4gIERvbid0IGRvCisgICAgICogdGhpcyBpbiBvdGhlciBzaXR1YXRpb25zLCB0aGUgY2hhbmdlZCBsaW5lcyB3aWxsIGJlIHJlZHJhd24gYW55d2F5IGFuZAorICAgICAqIHRoaXMgbWV0aG9kIGNhbiBjYXVzZSB0aGUgd2hvbGUgd2luZG93IHRvIGJlIHVwZGF0ZWQuICovCisgICAgaWYgKGVuZCAhPSBib3QpCisgICAgeworCWlmICh3cC0+d19yZWRyYXdfdG9wID09IDAgfHwgd3AtPndfcmVkcmF3X3RvcCA+IHRvcCkKKwkgICAgd3AtPndfcmVkcmF3X3RvcCA9IHRvcDsKKwlpZiAod3AtPndfcmVkcmF3X2JvdCA8IGVuZCkKKwkgICAgd3AtPndfcmVkcmF3X2JvdCA9IGVuZDsKKyAgICB9CisKKyAgICBpbnZhbGlkX3RvcCA9IChsaW5lbnJfVCkwOworfQorCisvKiBmb2xkVXBkYXRlSUVNU1JlY3Vyc2UoKSB7e3syICovCisvKgorICogVXBkYXRlIGEgZm9sZCB0aGF0IHN0YXJ0cyBhdCAiZmxwLT5sbnVtIi4gIEF0IHRoaXMgbGluZSB0aGVyZSBpcyBhbHdheXMgYQorICogdmFsaWQgZm9sZGxldmVsLCBhbmQgaXRzIGxldmVsID49ICJsZXZlbCIuCisgKiAiZmxwIiBpcyB2YWxpZCBmb3IgImZscC0+bG51bSIgd2hlbiBjYWxsZWQgYW5kIGl0J3MgdmFsaWQgd2hlbiByZXR1cm5pbmcuCisgKiAiZmxwLT5sbnVtIiBpcyBzZXQgdG8gdGhlIGxudW0ganVzdCBiZWxvdyB0aGUgZm9sZCwgaWYgaXQgZW5kcyBiZWZvcmUKKyAqICJib3QiLCBpdCdzICJib3QiIHBsdXMgb25lIGlmIHRoZSBmb2xkIGNvbnRpbnVlcyBhbmQgaXQncyBiaWdnZXIgd2hlbiB1c2luZworICogdGhlIG1hcmtlciBtZXRob2QgYW5kIGEgdGV4dCBjaGFuZ2UgbWFkZSBmb2xsb3dpbmcgZm9sZHMgdG8gY2hhbmdlLgorICogV2hlbiByZXR1cm5pbmcsICJmbHAtPmxudW1fc2F2ZSIgaXMgdGhlIGxpbmUgbnVtYmVyIHRoYXQgd2FzIHVzZWQgdG8gZ2V0CisgKiB0aGUgbGV2ZWwgd2hlbiB0aGUgbGV2ZWwgYXQgImZscC0+bG51bSIgaXMgaW52YWxpZC4KKyAqIFJlbW92ZSBhbnkgZm9sZHMgZnJvbSAic3RhcnRsbnVtIiB1cCB0byBoZXJlIGF0IHRoaXMgbGV2ZWwuCisgKiBSZWN1cnNpdmVseSB1cGRhdGUgbmVzdGVkIGZvbGRzLgorICogQmVsb3cgbGluZSAiYm90IiB0aGVyZSBhcmUgbm8gY2hhbmdlcyBpbiB0aGUgdGV4dC4KKyAqICJmbHAtPmxudW0iLCAiZmxwLT5sbnVtX3NhdmUiIGFuZCAiYm90IiBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICogb3V0ZXIgZm9sZC4KKyAqICJmbHAtPm9mZiIgaXMgdGhlIG9mZnNldCB0byB0aGUgcmVhbCBsaW5lIG51bWJlciBpbiB0aGUgYnVmZmVyLgorICoKKyAqIEFsbCB0aGlzIHdvdWxkIGJlIGEgbG90IHNpbXBsZXIgaWYgYWxsIGZvbGRzIGluIHRoZSByYW5nZSB3b3VsZCBiZSBkZWxldGVkCisgKiBhbmQgdGhlbiBjcmVhdGVkIGFnYWluLiAgQnV0IHdlIHdvdWxkIGxvb3NlIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqIGZvbGRzLCBldmVuIHdoZW4gbWFraW5nIGNoYW5nZXMgdGhhdCBkb24ndCBhZmZlY3QgdGhlIGZvbGRpbmcgKGUuZy4gInZqfiIpLgorICoKKyAqIFJldHVybnMgYm90LCB3aGljaCBtYXkgaGF2ZSBiZWVuIGluY3JlYXNlZCBmb3IgbGluZXMgdGhhdCBhbHNvIG5lZWQgdG8gYmUKKyAqIHVwZGF0ZWQgYXMgYSByZXN1bHQgb2YgYSBkZXRlY3RlZCBjaGFuZ2UgaW4gdGhlIGZvbGQuCisgKi8KKyAgICBzdGF0aWMgbGluZW5yX1QKK2ZvbGRVcGRhdGVJRU1TUmVjdXJzZShnYXAsIGxldmVsLCBzdGFydGxudW0sIGZscCwgZ2V0bGV2ZWwsIGJvdCwgdG9wZmxhZ3MpCisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBpbnQJCWxldmVsOworICAgIGxpbmVucl9UCXN0YXJ0bG51bTsKKyAgICBmbGluZV9UCSpmbHA7CisgICAgdm9pZAkoKmdldGxldmVsKV9fQVJHUygoZmxpbmVfVCAqKSk7CisgICAgbGluZW5yX1QJYm90OworICAgIGludAkJdG9wZmxhZ3M7CS8qIGZsYWdzIHVzZWQgYnkgY29udGFpbmluZyBmb2xkICovCit7CisgICAgbGluZW5yX1QJbGw7CisgICAgZm9sZF9UCSpmcCA9IE5VTEw7CisgICAgZm9sZF9UCSpmcDI7CisgICAgaW50CQlsdmwgPSBsZXZlbDsKKyAgICBsaW5lbnJfVAlzdGFydGxudW0yID0gc3RhcnRsbnVtOworICAgIGxpbmVucl9UCWZpcnN0bG51bSA9IGZscC0+bG51bTsJLyogZmlyc3QgbG51bSB3ZSBnb3QgKi8KKyAgICBpbnQJCWk7CisgICAgaW50CQlmaW5pc2ggPSBGQUxTRTsKKyAgICBsaW5lbnJfVAlsaW5lY291bnQgPSBmbHAtPndwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50IC0gZmxwLT5vZmY7CisgICAgaW50CQljb25jYXQ7CisKKyAgICAvKgorICAgICAqIElmIHVzaW5nIHRoZSBtYXJrZXIgbWV0aG9kLCB0aGUgc3RhcnQgbGluZSBpcyBub3QgdGhlIHN0YXJ0IG9mIGEgZm9sZAorICAgICAqIGF0IHRoZSBsZXZlbCB3ZSdyZSBkZWFsaW5nIHdpdGggYW5kIHRoZSBsZXZlbCBpcyBub24temVybywgd2UgbXVzdCB1c2UKKyAgICAgKiB0aGUgcHJldmlvdXMgZm9sZC4gIEJ1dCBpZ25vcmUgYSBmb2xkIHRoYXQgc3RhcnRzIGF0IG9yIGJlbG93CisgICAgICogc3RhcnRsbnVtLCBpdCBtdXN0IGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgaWYgKGdldGxldmVsID09IGZvbGRsZXZlbE1hcmtlciAmJiBmbHAtPnN0YXJ0IDw9IGZscC0+bHZsIC0gbGV2ZWwKKwkJCQkJCQkgICAgICAmJiBmbHAtPmx2bCA+IDApCisgICAgeworCWZvbGRGaW5kKGdhcCwgc3RhcnRsbnVtIC0gMSwgJmZwKTsKKwlpZiAoZnAgPj0gKChmb2xkX1QgKilnYXAtPmdhX2RhdGEpICsgZ2FwLT5nYV9sZW4KKwkJCQkJCSAgIHx8IGZwLT5mZF90b3AgPj0gc3RhcnRsbnVtKQorCSAgICBmcCA9IE5VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb29wIG92ZXIgYWxsIGxpbmVzIGluIHRoaXMgZm9sZCwgb3IgdW50aWwgImJvdCIgaXMgaGl0LgorICAgICAqIEhhbmRsZSBuZXN0ZWQgZm9sZHMgaW5zaWRlIG9mIHRoaXMgZm9sZC4KKyAgICAgKiAiZmxwLT5sbnVtIiBpcyB0aGUgY3VycmVudCBsaW5lLiAgV2hlbiBmaW5kaW5nIHRoZSBlbmQgb2YgdGhlIGZvbGQsIGl0CisgICAgICogaXMganVzdCBiZWxvdyB0aGUgZW5kIG9mIHRoZSBmb2xkLgorICAgICAqICIqZmxwIiBjb250YWlucyB0aGUgbGV2ZWwgb2YgdGhlIGxpbmUgImZscC0+bG51bSIgb3IgYSBmb2xsb3dpbmcgb25lIGlmCisgICAgICogdGhlcmUgYXJlIGxpbmVzIHdpdGggYW4gaW52YWxpZCBmb2xkIGxldmVsLiAgImZscC0+bG51bV9zYXZlIiBpcyB0aGUKKyAgICAgKiBsaW5lIG51bWJlciB0aGF0IHdhcyB1c2VkIHRvIGdldCB0aGUgZm9sZCBsZXZlbCAoYmVsb3cgImZscC0+bG51bSIgd2hlbgorICAgICAqIGl0IGhhcyBhbiBpbnZhbGlkIGZvbGQgbGV2ZWwpLiAgV2hlbiBjYWxsZWQgdGhlIGZvbGQgbGV2ZWwgaXMgYWx3YXlzCisgICAgICogdmFsaWQsIHRodXMgImZscC0+bG51bV9zYXZlIiBpcyBlcXVhbCB0byAiZmxwLT5sbnVtIi4KKyAgICAgKi8KKyAgICBmbHAtPmxudW1fc2F2ZSA9IGZscC0+bG51bTsKKyAgICB3aGlsZSAoIWdvdF9pbnQpCisgICAgeworCS8qIFVwZGF0aW5nIGZvbGRzIGNhbiBiZSBzbG93LCBjaGVjayBmb3IgQ1RSTC1DLiAqLworCWxpbmVfYnJlYWtjaGVjaygpOworCisJLyogU2V0ICJsdmwiIHRvIHRoZSBsZXZlbCBvZiBsaW5lICJmbHAtPmxudW0iLiAgV2hlbiBmbHAtPnN0YXJ0IGlzIHNldAorCSAqIGFuZCBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZm9sZCwgc2V0IHRoZSBsZXZlbCB0byB6ZXJvIHRvCisJICogZm9yY2UgdGhlIGZvbGQgdG8gZW5kLiAgRG8gdGhlIHNhbWUgd2hlbiBoYWRfZW5kIGlzIHNldDogUHJldmlvdXMKKwkgKiBsaW5lIHdhcyBtYXJrZWQgYXMgZW5kIG9mIGEgZm9sZC4gKi8KKwlsdmwgPSBmbHAtPmx2bDsKKwlpZiAobHZsID4gTUFYX0xFVkVMKQorCSAgICBsdmwgPSBNQVhfTEVWRUw7CisJaWYgKGZscC0+bG51bSA+IGZpcnN0bG51bQorCQkmJiAobGV2ZWwgPiBsdmwgLSBmbHAtPnN0YXJ0IHx8IGxldmVsID49IGZscC0+aGFkX2VuZCkpCisJICAgIGx2bCA9IDA7CisKKwlpZiAoZmxwLT5sbnVtID4gYm90ICYmICFmaW5pc2ggJiYgZnAgIT0gTlVMTCkKKwl7CisJICAgIC8qIEZvciAibWFya2VyIiBhbmQgInN5bnRheCIgbWV0aG9kczoKKwkgICAgICogLSBJZiBhIGNoYW5nZSBjYXVzZWQgYSBuZXN0ZWQgZm9sZCB0byBiZSByZW1vdmVkLCB3ZSBuZWVkIHRvCisJICAgICAqICAgZGVsZXRlIGl0IGFuZCBjb250aW51ZSBhdCBsZWFzdCB1bnRpbCB3aGVyZSBpdCBlbmRlZC4KKwkgICAgICogLSBJZiBhIGNoYW5nZSBjYXVzZWQgYSBuZXN0ZWQgZm9sZCB0byBiZSBjcmVhdGVkLCBvciB0aGlzIGZvbGQKKwkgICAgICogICB0byBjb250aW51ZSBiZWxvdyBpdHMgb3JpZ2luYWwgZW5kLCBuZWVkIHRvIGZpbmlzaCB0aGlzIGZvbGQuCisJICAgICAqLworCSAgICBpZiAoZ2V0bGV2ZWwgIT0gZm9sZGxldmVsTWFya2VyCisJCSAgICAmJiBnZXRsZXZlbCAhPSBmb2xkbGV2ZWxFeHByCisJCSAgICAmJiBnZXRsZXZlbCAhPSBmb2xkbGV2ZWxTeW50YXgpCisJCWJyZWFrOworCSAgICBpID0gMDsKKwkgICAgZnAyID0gZnA7CisJICAgIGlmIChsdmwgPj0gbGV2ZWwpCisJICAgIHsKKwkJLyogQ29tcHV0ZSBob3cgZGVlcCB0aGUgZm9sZHMgY3VycmVudGx5IGFyZSwgaWYgaXQncyBkZWVwZXIKKwkJICogdGhhbiAibHZsIiB0aGVuIHNvbWUgbXVzdCBiZSBkZWxldGVkLCBuZWVkIHRvIHVwZGF0ZQorCQkgKiBhdCBsZWFzdCBvbmUgbmVzdGVkIGZvbGQuICovCisJCWxsID0gZmxwLT5sbnVtIC0gZnAtPmZkX3RvcDsKKwkJd2hpbGUgKGZvbGRGaW5kKCZmcDItPmZkX25lc3RlZCwgbGwsICZmcDIpKQorCQl7CisJCSAgICArK2k7CisJCSAgICBsbCAtPSBmcDItPmZkX3RvcDsKKwkJfQorCSAgICB9CisJICAgIGlmIChsdmwgPCBsZXZlbCArIGkpCisJICAgIHsKKwkJZm9sZEZpbmQoJmZwLT5mZF9uZXN0ZWQsIGZscC0+bG51bSAtIGZwLT5mZF90b3AsICZmcDIpOworCQlpZiAoZnAyICE9IE5VTEwpCisJCSAgICBib3QgPSBmcDItPmZkX3RvcCArIGZwMi0+ZmRfbGVuIC0gMSArIGZwLT5mZF90b3A7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZnAtPmZkX3RvcCArIGZwLT5mZF9sZW4gPD0gZmxwLT5sbnVtICYmIGx2bCA+PSBsZXZlbCkKKwkJZmluaXNoID0gVFJVRTsKKwkgICAgZWxzZQorCQlicmVhazsKKwl9CisKKwkvKiBBdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG5lc3RlZCBmb2xkIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CisJICogZm9sZDogY2hlY2sgaWYgZXhpc3RpbmcgZm9sZHMgYXQgdGhpcyBsZXZlbCwgYmVmb3JlIHRoZSBjdXJyZW50CisJICogb25lLCBuZWVkIHRvIGJlIGRlbGV0ZWQgb3IgdHJ1bmNhdGVkLiAqLworCWlmIChmcCA9PSBOVUxMCisJCSYmIChsdmwgIT0gbGV2ZWwKKwkJICAgIHx8IGZscC0+bG51bV9zYXZlID49IGJvdAorCQkgICAgfHwgZmxwLT5zdGFydCAhPSAwCisJCSAgICB8fCBmbHAtPmhhZF9lbmQgPD0gTUFYX0xFVkVMCisJCSAgICB8fCBmbHAtPmxudW0gPT0gbGluZWNvdW50KSkKKwl7CisJICAgIC8qCisJICAgICAqIFJlbW92ZSBvciB1cGRhdGUgZm9sZHMgdGhhdCBoYXZlIGxpbmVzIGJldHdlZW4gc3RhcnRsbnVtIGFuZAorCSAgICAgKiBmaXJzdGxudW0uCisJICAgICAqLworCSAgICB3aGlsZSAoIWdvdF9pbnQpCisJICAgIHsKKwkJLyogc2V0IGNvbmNhdCB0byAxIGlmIGl0J3MgYWxsb3dlZCB0byBjb25jYXRlbmF0ZWQgdGhpcyBmb2xkCisJCSAqIHdpdGggYSBwcmV2aW91cyBvbmUgdGhhdCB0b3VjaGVzIGl0LiAqLworCQlpZiAoZmxwLT5zdGFydCAhPSAwIHx8IGZscC0+aGFkX2VuZCA8PSBNQVhfTEVWRUwpCisJCSAgICBjb25jYXQgPSAwOworCQllbHNlCisJCSAgICBjb25jYXQgPSAxOworCisJCS8qIEZpbmQgYW4gZXhpc3RpbmcgZm9sZCB0byByZS11c2UuICBQcmVmZXJhYmx5IG9uZSB0aGF0CisJCSAqIGluY2x1ZGVzIHN0YXJ0bG51bSwgb3RoZXJ3aXNlIG9uZSB0aGF0IGVuZHMganVzdCBiZWZvcmUKKwkJICogc3RhcnRsbnVtIG9yIHN0YXJ0cyBhZnRlciBpdC4gKi8KKwkJaWYgKGZvbGRGaW5kKGdhcCwgc3RhcnRsbnVtLCAmZnApCisJCQl8fCAoZnAgPCAoKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSkgKyBnYXAtPmdhX2xlbgorCQkJICAgICYmIGZwLT5mZF90b3AgPD0gZmlyc3RsbnVtKQorCQkJfHwgZm9sZEZpbmQoZ2FwLCBmaXJzdGxudW0gLSBjb25jYXQsICZmcCkKKwkJCXx8IChmcCA8ICgoZm9sZF9UICopZ2FwLT5nYV9kYXRhKSArIGdhcC0+Z2FfbGVuCisJCQkgICAgJiYgKChsdmwgPCBsZXZlbCAmJiBmcC0+ZmRfdG9wIDwgZmxwLT5sbnVtKQorCQkJCXx8IChsdmwgPj0gbGV2ZWwKKwkJCQkJICAgJiYgZnAtPmZkX3RvcCA8PSBmbHAtPmxudW1fc2F2ZSkpKSkKKwkJeworCQkgICAgaWYgKGZwLT5mZF90b3AgKyBmcC0+ZmRfbGVuICsgY29uY2F0ID4gZmlyc3RsbnVtKQorCQkgICAgeworCQkJLyogVXNlIGV4aXN0aW5nIGZvbGQgZm9yIHRoZSBuZXcgZm9sZC4gIElmIGl0IHN0YXJ0cworCQkJICogYmVmb3JlIHdoZXJlIHdlIHN0YXJ0ZWQgbG9va2luZywgZXh0ZW5kIGl0LiAgSWYgaXQKKwkJCSAqIHN0YXJ0cyBhdCBhbm90aGVyIGxpbmUsIHVwZGF0ZSBuZXN0ZWQgZm9sZHMgdG8ga2VlcAorCQkJICogdGhlaXIgcG9zaXRpb24sIGNvbXBlbnNhdGluZyBmb3IgdGhlIG5ldyBmZF90b3AuICovCisJCQlpZiAoZnAtPmZkX3RvcCA+PSBzdGFydGxudW0gJiYgZnAtPmZkX3RvcCAhPSBmaXJzdGxudW0pCisJCQl7CisJCQkgICAgaWYgKGZwLT5mZF90b3AgPiBmaXJzdGxudW0pCisJCQkJLyogbGlrZSBsaW5lcyBhcmUgaW5zZXJ0ZWQgKi8KKwkJCQlmb2xkTWFya0FkanVzdFJlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQsCisJCQkJCShsaW5lbnJfVCkwLCAobGluZW5yX1QpTUFYTE5VTSwKKwkJCQkJKGxvbmcpKGZwLT5mZF90b3AgLSBmaXJzdGxudW0pLCAwTCk7CisJCQkgICAgZWxzZQorCQkJCS8qIGxpa2UgbGluZXMgYXJlIGRlbGV0ZWQgKi8KKwkJCQlmb2xkTWFya0FkanVzdFJlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQsCisJCQkJCShsaW5lbnJfVCkwLAorCQkJCQkobG9uZykoZmlyc3RsbnVtIC0gZnAtPmZkX3RvcCAtIDEpLAorCQkJCQkobGluZW5yX1QpTUFYTE5VTSwKKwkJCQkJKGxvbmcpKGZwLT5mZF90b3AgLSBmaXJzdGxudW0pKTsKKwkJCSAgICBmcC0+ZmRfbGVuICs9IGZwLT5mZF90b3AgLSBmaXJzdGxudW07CisJCQkgICAgZnAtPmZkX3RvcCA9IGZpcnN0bG51bTsKKwkJCSAgICBmb2xkX2NoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJZWxzZSBpZiAoZmxwLT5zdGFydCAhPSAwICYmIGx2bCA9PSBsZXZlbAorCQkJCQkJICAgJiYgZnAtPmZkX3RvcCAhPSBmaXJzdGxudW0pCisJCQl7CisJCQkgICAgLyogRXhpc3RpbmcgZm9sZCB0aGF0IGluY2x1ZGVzIHN0YXJ0bG51bSBtdXN0IHN0b3AKKwkJCSAgICAgKiBpZiB3ZSBmaW5kIHRoZSBzdGFydCBvZiBhIG5ldyBmb2xkIGF0IHRoZSBzYW1lCisJCQkgICAgICogbGV2ZWwuICBTcGxpdCBpdC4gIERlbGV0ZSBjb250YWluZWQgZm9sZHMgYXQKKwkJCSAgICAgKiB0aGlzIHBvaW50IHRvIHNwbGl0IHRoZW0gdG9vLiAqLworCQkJICAgIGZvbGRSZW1vdmUoJmZwLT5mZF9uZXN0ZWQsIGZscC0+bG51bSAtIGZwLT5mZF90b3AsCisJCQkJCQkgICAgICBmbHAtPmxudW0gLSBmcC0+ZmRfdG9wKTsKKwkJCSAgICBpID0gKGludCkoZnAgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKTsKKwkJCSAgICBmb2xkU3BsaXQoZ2FwLCBpLCBmbHAtPmxudW0sIGZscC0+bG51bSAtIDEpOworCQkJICAgIGZwID0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGkgKyAxOworCQkJICAgIC8qIElmIHVzaW5nIHRoZSAibWFya2VyIiBvciAic3ludGF4IiBtZXRob2QsIHdlCisJCQkgICAgICogbmVlZCB0byBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmb2xkIGlzCisJCQkgICAgICogZm91bmQuICovCisJCQkgICAgaWYgKGdldGxldmVsID09IGZvbGRsZXZlbE1hcmtlcgorCQkJCSAgICB8fCBnZXRsZXZlbCA9PSBmb2xkbGV2ZWxFeHByCisJCQkJICAgIHx8IGdldGxldmVsID09IGZvbGRsZXZlbFN5bnRheCkKKwkJCQlmaW5pc2ggPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBpZiAoZnAtPmZkX3RvcCA+PSBzdGFydGxudW0pCisJCSAgICB7CisJCQkvKiBBIGZvbGQgdGhhdCBzdGFydHMgYXQgb3IgYWZ0ZXIgc3RhcnRsbnVtIGFuZCBzdG9wcworCQkJICogYmVmb3JlIHRoZSBuZXcgZm9sZCBtdXN0IGJlIGRlbGV0ZWQuICBDb250aW51ZQorCQkJICogbG9va2luZyBmb3IgdGhlIG5leHQgb25lLiAqLworCQkJZGVsZXRlRm9sZEVudHJ5KGdhcCwKKwkJCQkgICAgIChpbnQpKGZwIC0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSksIFRSVUUpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogQSBmb2xkIGhhcyBzb21lIGxpbmVzIGFib3ZlIHN0YXJ0bG51bSwgdHJ1bmNhdGUgaXQKKwkJCSAqIHRvIHN0b3AganVzdCBhYm92ZSBzdGFydGxudW0uICAqLworCQkJZnAtPmZkX2xlbiA9IHN0YXJ0bG51bSAtIGZwLT5mZF90b3A7CisJCQlmb2xkTWFya0FkanVzdFJlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQsCisJCQkJKGxpbmVucl9UKWZwLT5mZF9sZW4sIChsaW5lbnJfVClNQVhMTlVNLAorCQkJCQkJICAgICAgIChsaW5lbnJfVClNQVhMTlVNLCAwTCk7CisJCQlmb2xkX2NoYW5nZWQgPSBUUlVFOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogSW5zZXJ0IG5ldyBmb2xkLiAgQ2FyZWZ1bDogZ2FfZGF0YSBtYXkgYmUgTlVMTCBhbmQgaXQKKwkJICAgICAqIG1heSBjaGFuZ2UhICovCisJCSAgICBpID0gKGludCkoZnAgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKTsKKwkJICAgIGlmIChmb2xkSW5zZXJ0KGdhcCwgaSkgIT0gT0spCisJCQlyZXR1cm4gYm90OworCQkgICAgZnAgPSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhICsgaTsKKwkJICAgIC8qIFRoZSBuZXcgZm9sZCBjb250aW51ZXMgdW50aWwgYm90LCB1bmxlc3Mgd2UgZmluZCB0aGUKKwkJICAgICAqIGVuZCBlYXJsaWVyLiAqLworCQkgICAgZnAtPmZkX3RvcCA9IGZpcnN0bG51bTsKKwkJICAgIGZwLT5mZF9sZW4gPSBib3QgLSBmaXJzdGxudW0gKyAxOworCQkgICAgLyogV2hlbiB0aGUgY29udGFpbmluZyBmb2xkIGlzIG9wZW4sIHRoZSBuZXcgZm9sZCBpcyBvcGVuLgorCQkgICAgICogVGhlIG5ldyBmb2xkIGlzIGNsb3NlZCBpZiB0aGUgZm9sZCBhYm92ZSBpdCBpcyBjbG9zZWQuCisJCSAgICAgKiBUaGUgZmlyc3QgZm9sZCBkZXBlbmRzIG9uIHRoZSBjb250YWluaW5nIGZvbGQuICovCisJCSAgICBpZiAodG9wZmxhZ3MgPT0gRkRfT1BFTikKKwkJICAgIHsKKwkJCWZscC0+d3AtPndfZm9sZF9tYW51YWwgPSBUUlVFOworCQkJZnAtPmZkX2ZsYWdzID0gRkRfT1BFTjsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGkgPD0gMCkKKwkJICAgIHsKKwkJCWZwLT5mZF9mbGFncyA9IHRvcGZsYWdzOworCQkJaWYgKHRvcGZsYWdzICE9IEZEX0xFVkVMKQorCQkJICAgIGZscC0+d3AtPndfZm9sZF9tYW51YWwgPSBUUlVFOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJZnAtPmZkX2ZsYWdzID0gKGZwIC0gMSktPmZkX2ZsYWdzOworCQkgICAgZnAtPmZkX3NtYWxsID0gTUFZQkU7CisJCSAgICAvKiBJZiB1c2luZyB0aGUgIm1hcmtlciIsICJleHByIiBvciAic3ludGF4IiBtZXRob2QsIHdlCisJCSAgICAgKiBuZWVkIHRvIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZvbGQgaXMgZm91bmQuICovCisJCSAgICBpZiAoZ2V0bGV2ZWwgPT0gZm9sZGxldmVsTWFya2VyCisJCQkgICAgfHwgZ2V0bGV2ZWwgPT0gZm9sZGxldmVsRXhwcgorCQkJICAgIHx8IGdldGxldmVsID09IGZvbGRsZXZlbFN5bnRheCkKKwkJCWZpbmlzaCA9IFRSVUU7CisJCSAgICBmb2xkX2NoYW5nZWQgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworCWlmIChsdmwgPCBsZXZlbCB8fCBmbHAtPmxudW0gPiBsaW5lY291bnQpCisJeworCSAgICAvKgorCSAgICAgKiBGb3VuZCBhIGxpbmUgd2l0aCBhIGxvd2VyIGZvbGRsZXZlbCwgdGhpcyBmb2xkIGVuZHMganVzdCBhYm92ZQorCSAgICAgKiAiZmxwLT5sbnVtIi4KKwkgICAgICovCisJICAgIGJyZWFrOworCX0KKworCS8qCisJICogVGhlIGZvbGQgaW5jbHVkZXMgdGhlIGxpbmUgImZscC0+bG51bSIgYW5kICJmbHAtPmxudW1fc2F2ZSIuCisJICovCisJaWYgKGx2bCA+IGxldmVsKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhlcmUgaXMgYSBuZXN0ZWQgZm9sZCwgaGFuZGxlIGl0IHJlY3Vyc2l2ZWx5LgorCSAgICAgKi8KKwkgICAgLyogQXQgbGVhc3QgZG8gb25lIGxpbmUgKGNhbiBoYXBwZW4gd2hlbiBmaW5pc2ggaXMgVFJVRSkuICovCisJICAgIGlmIChib3QgPCBmbHAtPmxudW0pCisJCWJvdCA9IGZscC0+bG51bTsKKworCSAgICAvKiBMaW5lIG51bWJlcnMgaW4gdGhlIG5lc3RlZCBmb2xkIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YKKwkgICAgICogdGhpcyBmb2xkLiAqLworCSAgICBmbHAtPmxudW0gPSBmbHAtPmxudW1fc2F2ZSAtIGZwLT5mZF90b3A7CisJICAgIGZscC0+b2ZmICs9IGZwLT5mZF90b3A7CisJICAgIGkgPSAoaW50KShmcCAtIChmb2xkX1QgKilnYXAtPmdhX2RhdGEpOworCSAgICBib3QgPSBmb2xkVXBkYXRlSUVNU1JlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQsIGxldmVsICsgMSwKKwkJCQkgICAgICAgc3RhcnRsbnVtMiAtIGZwLT5mZF90b3AsIGZscCwgZ2V0bGV2ZWwsCisJCQkJCSAgICAgIGJvdCAtIGZwLT5mZF90b3AsIGZwLT5mZF9mbGFncyk7CisJICAgIGZwID0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGk7CisJICAgIGZscC0+bG51bSArPSBmcC0+ZmRfdG9wOworCSAgICBmbHAtPmxudW1fc2F2ZSArPSBmcC0+ZmRfdG9wOworCSAgICBmbHAtPm9mZiAtPSBmcC0+ZmRfdG9wOworCSAgICBib3QgKz0gZnAtPmZkX3RvcDsKKwkgICAgc3RhcnRsbnVtMiA9IGZscC0+bG51bTsKKworCSAgICAvKiBUaGlzIGZvbGQgbWF5IGVuZCBhdCB0aGUgc2FtZSBsaW5lLCBkb24ndCBpbmNyLiBmbHAtPmxudW0uICovCisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIEdldCB0aGUgbGV2ZWwgb2YgdGhlIG5leHQgbGluZSwgdGhlbiBjb250aW51ZSB0aGUgbG9vcCB0byBjaGVjaworCSAgICAgKiBpZiBpdCBlbmRzIHRoZXJlLgorCSAgICAgKiBTa2lwIG92ZXIgdW5kZWZpbmVkIGxpbmVzLCB0byBmaW5kIHRoZSBmb2xkbGV2ZWwgYWZ0ZXIgaXQuCisJICAgICAqIEZvciB0aGUgbGFzdCBsaW5lIGluIHRoZSBmaWxlIHRoZSBmb2xkbGV2ZWwgaXMgYWx3YXlzIHZhbGlkLgorCSAgICAgKi8KKwkgICAgZmxwLT5sbnVtID0gZmxwLT5sbnVtX3NhdmU7CisJICAgIGxsID0gZmxwLT5sbnVtICsgMTsKKwkgICAgd2hpbGUgKCFnb3RfaW50KQorCSAgICB7CisJCS8qIE1ha2UgdGhlIHByZXZpb3VzIGxldmVsIGF2YWlsYWJsZSB0byBmb2xkbGV2ZWwoKS4gKi8KKwkJcHJldl9sbnVtID0gZmxwLT5sbnVtOworCQlwcmV2X2xudW1fbHZsID0gZmxwLT5sdmw7CisKKwkJaWYgKCsrZmxwLT5sbnVtID4gbGluZWNvdW50KQorCQkgICAgYnJlYWs7CisJCWZscC0+bHZsID0gZmxwLT5sdmxfbmV4dDsKKwkJZ2V0bGV2ZWwoZmxwKTsKKwkJaWYgKGZscC0+bHZsID49IDAgfHwgZmxwLT5oYWRfZW5kIDw9IE1BWF9MRVZFTCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIHByZXZfbG51bSA9IDA7CisJICAgIGlmIChmbHAtPmxudW0gPiBsaW5lY291bnQpCisJCWJyZWFrOworCisJICAgIC8qIGxlYXZlIGZscC0+bG51bV9zYXZlIHRvIGxudW0gb2YgdGhlIGxpbmUgdGhhdCB3YXMgdXNlZCB0byBnZXQKKwkgICAgICogdGhlIGxldmVsLCBmbHAtPmxudW0gdG8gdGhlIGxudW0gb2YgdGhlIG5leHQgbGluZS4gKi8KKwkgICAgZmxwLT5sbnVtX3NhdmUgPSBmbHAtPmxudW07CisJICAgIGZscC0+bG51bSA9IGxsOworCX0KKyAgICB9CisKKyAgICBpZiAoZnAgPT0gTlVMTCkJLyogb25seSBoYXBwZW5zIHdoZW4gZ290X2ludCBpcyBzZXQgKi8KKwlyZXR1cm4gYm90OworCisgICAgLyoKKyAgICAgKiBHZXQgaGVyZSB3aGVuOgorICAgICAqIGx2bCA8IGxldmVsOiB0aGUgZm9sZHMgZW5kcyBqdXN0IGFib3ZlICJmbHAtPmxudW0iCisgICAgICogbHZsID49IGxldmVsOiBmb2xkIGNvbnRpbnVlcyBiZWxvdyAiYm90IgorICAgICAqLworCisgICAgLyogQ3VycmVudCBmb2xkIGF0IGxlYXN0IGV4dGVuZHMgdW50aWwgbG51bS4gKi8KKyAgICBpZiAoZnAtPmZkX2xlbiA8IGZscC0+bG51bSAtIGZwLT5mZF90b3ApCisgICAgeworCWZwLT5mZF9sZW4gPSBmbHAtPmxudW0gLSBmcC0+ZmRfdG9wOworCWZvbGRfY2hhbmdlZCA9IFRSVUU7CisgICAgfQorCisgICAgLyogRGVsZXRlIGNvbnRhaW5lZCBmb2xkcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGxhc3Qgb25lIGZvdW5kIHVudGlsIHdoZXJlCisgICAgICogd2Ugc3RvcHBlZCBsb29raW5nLiAqLworICAgIGZvbGRSZW1vdmUoJmZwLT5mZF9uZXN0ZWQsIHN0YXJ0bG51bTIgLSBmcC0+ZmRfdG9wLAorCQkJCQkJICBmbHAtPmxudW0gLSAxIC0gZnAtPmZkX3RvcCk7CisKKyAgICBpZiAobHZsIDwgbGV2ZWwpCisgICAgeworCS8qIEVuZCBvZiBmb2xkIGZvdW5kLCB1cGRhdGUgdGhlIGxlbmd0aCB3aGVuIGl0IGdvdCBzaG9ydGVyLiAqLworCWlmIChmcC0+ZmRfbGVuICE9IGZscC0+bG51bSAtIGZwLT5mZF90b3ApCisJeworCSAgICBpZiAoZnAtPmZkX3RvcCArIGZwLT5mZF9sZW4gPiBib3QgKyAxKQorCSAgICB7CisJCS8qIGZvbGQgY29uaW51ZWQgYmVsb3cgYm90ICovCisJCWlmIChnZXRsZXZlbCA9PSBmb2xkbGV2ZWxNYXJrZXIKKwkJCXx8IGdldGxldmVsID09IGZvbGRsZXZlbEV4cHIKKwkJCXx8IGdldGxldmVsID09IGZvbGRsZXZlbFN5bnRheCkKKwkJeworCQkgICAgLyogbWFya2VyIG1ldGhvZDogdHJ1bmNhdGUgdGhlIGZvbGQgYW5kIG1ha2Ugc3VyZSB0aGUKKwkJICAgICAqIHByZXZpb3VzbHkgaW5jbHVkZWQgbGluZXMgYXJlIHByb2Nlc3NlZCBhZ2FpbiAqLworCQkgICAgYm90ID0gZnAtPmZkX3RvcCArIGZwLT5mZF9sZW4gLSAxOworCQkgICAgZnAtPmZkX2xlbiA9IGZscC0+bG51bSAtIGZwLT5mZF90b3A7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBpbmRlbnQgb3IgZXhwciBtZXRob2Q6IHNwbGl0IGZvbGQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCQkgICAgICogYmVsb3cgYm90ICovCisJCSAgICBpID0gKGludCkoZnAgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKTsKKwkJICAgIGZvbGRTcGxpdChnYXAsIGksIGZscC0+bG51bSwgYm90KTsKKwkJICAgIGZwID0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJCWZwLT5mZF9sZW4gPSBmbHAtPmxudW0gLSBmcC0+ZmRfdG9wOworCSAgICBmb2xkX2NoYW5nZWQgPSBUUlVFOworCX0KKyAgICB9CisKKyAgICAvKiBkZWxldGUgZm9sbG93aW5nIGZvbGRzIHRoYXQgZW5kIGJlZm9yZSB0aGUgY3VycmVudCBsaW5lICovCisgICAgZm9yICg7OykKKyAgICB7CisJZnAyID0gZnAgKyAxOworCWlmIChmcDIgPj0gKGZvbGRfVCAqKWdhcC0+Z2FfZGF0YSArIGdhcC0+Z2FfbGVuCisJCQkJCQkgIHx8IGZwMi0+ZmRfdG9wID4gZmxwLT5sbnVtKQorCSAgICBicmVhazsKKwlpZiAoZnAyLT5mZF90b3AgKyBmcDItPmZkX2xlbiA+IGZscC0+bG51bSkKKwl7CisJICAgIGlmIChmcDItPmZkX3RvcCA8IGZscC0+bG51bSkKKwkgICAgeworCQkvKiBNYWtlIGZvbGQgdGhhdCBpbmNsdWRlcyBsbnVtIHN0YXJ0IGF0IGxudW0uICovCisJCWZvbGRNYXJrQWRqdXN0UmVjdXJzZSgmZnAyLT5mZF9uZXN0ZWQsCisJCQkobGluZW5yX1QpMCwgKGxvbmcpKGZscC0+bG51bSAtIGZwMi0+ZmRfdG9wIC0gMSksCisJCQkobGluZW5yX1QpTUFYTE5VTSwgKGxvbmcpKGZwMi0+ZmRfdG9wIC0gZmxwLT5sbnVtKSk7CisJCWZwMi0+ZmRfbGVuIC09IGZscC0+bG51bSAtIGZwMi0+ZmRfdG9wOworCQlmcDItPmZkX3RvcCA9IGZscC0+bG51bTsKKwkJZm9sZF9jaGFuZ2VkID0gVFJVRTsKKwkgICAgfQorCisJICAgIGlmIChsdmwgPj0gbGV2ZWwpCisJICAgIHsKKwkJLyogbWVyZ2UgbmV3IGZvbGQgd2l0aCBleGlzdGluZyBmb2xkIHRoYXQgZm9sbG93cyAqLworCQlmb2xkTWVyZ2UoZnAsIGdhcCwgZnAyKTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJZm9sZF9jaGFuZ2VkID0gVFJVRTsKKwlkZWxldGVGb2xkRW50cnkoZ2FwLCAoaW50KShmcDIgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKSwgVFJVRSk7CisgICAgfQorCisgICAgLyogTmVlZCB0byByZWRyYXcgdGhlIGxpbmVzIHdlIGluc3BlY3RlZCwgd2hpY2ggbWlnaHQgYmUgZnVydGhlciBkb3duIHRoYW4KKyAgICAgKiB3YXMgYXNrZWQgZm9yLiAqLworICAgIGlmIChib3QgPCBmbHAtPmxudW0gLSAxKQorCWJvdCA9IGZscC0+bG51bSAtIDE7CisKKyAgICByZXR1cm4gYm90OworfQorCisvKiBmb2xkSW5zZXJ0KCkge3t7MiAqLworLyoKKyAqIEluc2VydCBhIG5ldyBmb2xkIGluICJnYXAiIGF0IHBvc2l0aW9uICJpIi4KKyAqIFJldHVybnMgT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBzdGF0aWMgaW50Citmb2xkSW5zZXJ0KGdhcCwgaSkKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGludAkJaTsKK3sKKyAgICBmb2xkX1QJKmZwOworCisgICAgaWYgKGdhX2dyb3coZ2FwLCAxKSAhPSBPSykKKwlyZXR1cm4gRkFJTDsKKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGEgKyBpOworICAgIGlmIChpIDwgZ2FwLT5nYV9sZW4pCisJbWNoX21lbW1vdmUoZnAgKyAxLCBmcCwgc2l6ZW9mKGZvbGRfVCkgKiAoZ2FwLT5nYV9sZW4gLSBpKSk7CisgICAgKytnYXAtPmdhX2xlbjsKKyAgICAtLWdhcC0+Z2Ffcm9vbTsKKyAgICBnYV9pbml0MigmZnAtPmZkX25lc3RlZCwgKGludClzaXplb2YoZm9sZF9UKSwgMTApOworICAgIHJldHVybiBPSzsKK30KKworLyogZm9sZFNwbGl0KCkge3t7MiAqLworLyoKKyAqIFNwbGl0IHRoZSAiaSJ0aCBmb2xkIGluICJnYXAiLCB3aGljaCBzdGFydHMgYmVmb3JlICJ0b3AiIGFuZCBlbmRzIGJlbG93CisgKiAiYm90IiBpbiB0d28gcGllY2VzLCBvbmUgZW5kaW5nIGFib3ZlICJ0b3AiIGFuZCB0aGUgb3RoZXIgc3RhcnRpbmcgYmVsb3cKKyAqICJib3QiLgorICogVGhlIGNhbGxlciBtdXN0IGZpcnN0IGhhdmUgdGFrZW4gY2FyZSBvZiBhbnkgbmVzdGVkIGZvbGRzIGZyb20gInRvcCIgdG8KKyAqICJib3QiIQorICovCisgICAgc3RhdGljIHZvaWQKK2ZvbGRTcGxpdChnYXAsIGksIHRvcCwgYm90KQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCXRvcDsKKyAgICBsaW5lbnJfVAlib3Q7Cit7CisgICAgZm9sZF9UCSpmcDsKKyAgICBmb2xkX1QJKmZwMjsKKyAgICBnYXJyYXlfVAkqZ2FwMTsKKyAgICBnYXJyYXlfVAkqZ2FwMjsKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCWxlbjsKKworICAgIC8qIFRoZSBmb2xkIGNvbnRpbnVlcyBiZWxvdyBib3QsIG5lZWQgdG8gc3BsaXQgaXQuICovCisgICAgaWYgKGZvbGRJbnNlcnQoZ2FwLCBpICsgMSkgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgZnAgPSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhICsgaTsKKyAgICBmcFsxXS5mZF90b3AgPSBib3QgKyAxOworICAgIGZwWzFdLmZkX2xlbiA9IGZwLT5mZF9sZW4gLSAoZnBbMV0uZmRfdG9wIC0gZnAtPmZkX3RvcCk7CisgICAgZnBbMV0uZmRfZmxhZ3MgPSBmcC0+ZmRfZmxhZ3M7CisKKyAgICAvKiBNb3ZlIG5lc3RlZCBmb2xkcyBiZWxvdyBib3QgdG8gbmV3IGZvbGQuICBUaGVyZSBjYW4ndCBiZQorICAgICAqIGFueSBiZXR3ZWVuIHRvcCBhbmQgYm90LCB0aGV5IGhhdmUgYmVlbiByZW1vdmVkIGJ5IHRoZSBjYWxsZXIuICovCisgICAgZ2FwMSA9ICZmcC0+ZmRfbmVzdGVkOworICAgIGdhcDIgPSAmZnBbMV0uZmRfbmVzdGVkOworICAgICh2b2lkKShmb2xkRmluZChnYXAxLCBib3QgKyAxIC0gZnAtPmZkX3RvcCwgJmZwMikpOworICAgIGxlbiA9IChpbnQpKChmb2xkX1QgKilnYXAxLT5nYV9kYXRhICsgZ2FwMS0+Z2FfbGVuIC0gZnAyKTsKKyAgICBpZiAobGVuID4gMCAmJiBnYV9ncm93KGdhcDIsIGxlbikgPT0gT0spCisgICAgeworCWZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyArK2lkeCkKKwl7CisJICAgICgoZm9sZF9UICopZ2FwMi0+Z2FfZGF0YSlbaWR4XSA9IGZwMltpZHhdOworCSAgICAoKGZvbGRfVCAqKWdhcDItPmdhX2RhdGEpW2lkeF0uZmRfdG9wCisJCQkJCQkgLT0gZnBbMV0uZmRfdG9wIC0gZnAtPmZkX3RvcDsKKwl9CisJZ2FwMi0+Z2FfbGVuID0gbGVuOworCWdhcDItPmdhX3Jvb20gLT0gbGVuOworCWdhcDEtPmdhX2xlbiAtPSBsZW47CisJZ2FwMS0+Z2Ffcm9vbSArPSBsZW47CisgICAgfQorICAgIGZwLT5mZF9sZW4gPSB0b3AgLSBmcC0+ZmRfdG9wOworICAgIGZvbGRfY2hhbmdlZCA9IFRSVUU7Cit9CisKKy8qIGZvbGRSZW1vdmUoKSB7e3syICovCisvKgorICogUmVtb3ZlIGZvbGRzIHdpdGhpbiB0aGUgcmFuZ2UgInRvcCIgdG8gYW5kIGluY2x1ZGluZyAiYm90Ii4KKyAqIENoZWNrIGZvciB0aGVzZSBzaXR1YXRpb25zOgorICogICAgICAxICAyICAzCisgKiAgICAgIDEgIDIgIDMKKyAqIHRvcCAgICAgMiAgMyAgNCAgNQorICoJICAgMiAgMyAgNCAgNQorICogYm90CSAgIDIgIDMgIDQgIDUKKyAqCSAgICAgIDMgICAgIDUgIDYKKyAqCSAgICAgIDMgICAgIDUgIDYKKyAqCisgKiAxOiBub3QgY2hhbmdlZAorICogMjogdHJ1bmF0ZSB0byBzdG9wIGFib3ZlICJ0b3AiCisgKiAzOiBzcGxpdCBpbiB0d28gcGFydHMsIG9uZSBzdG9wcyBhYm92ZSAidG9wIiwgb3RoZXIgc3RhcnRzIGJlbG93ICJib3QiLgorICogNDogZGVsZXRlZAorICogNTogbWFkZSB0byBzdGFydCBiZWxvdyAiYm90Ii4KKyAqIDY6IG5vdCBjaGFuZ2VkCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZFJlbW92ZShnYXAsIHRvcCwgYm90KQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgbGluZW5yX1QJdG9wOworICAgIGxpbmVucl9UCWJvdDsKK3sKKyAgICBmb2xkX1QJKmZwID0gTlVMTDsKKworICAgIGlmIChib3QgPCB0b3ApCisJcmV0dXJuOwkJLyogbm90aGluZyB0byBkbyAqLworCisgICAgZm9yICg7OykKKyAgICB7CisJLyogRmluZCBmb2xkIHRoYXQgaW5jbHVkZXMgdG9wIG9yIGEgZm9sbG93aW5nIG9uZS4gKi8KKwlpZiAoZm9sZEZpbmQoZ2FwLCB0b3AsICZmcCkgJiYgZnAtPmZkX3RvcCA8IHRvcCkKKwl7CisJICAgIC8qIDI6IG9yIDM6IG5lZWQgdG8gZGVsZXRlIG5lc3RlZCBmb2xkcyAqLworCSAgICBmb2xkUmVtb3ZlKCZmcC0+ZmRfbmVzdGVkLCB0b3AgLSBmcC0+ZmRfdG9wLCBib3QgLSBmcC0+ZmRfdG9wKTsKKwkgICAgaWYgKGZwLT5mZF90b3AgKyBmcC0+ZmRfbGVuID4gYm90ICsgMSkKKwkgICAgeworCQkvKiAzOiBuZWVkIHRvIHNwbGl0IGl0LiAqLworCQlmb2xkU3BsaXQoZ2FwLCAoaW50KShmcCAtIChmb2xkX1QgKilnYXAtPmdhX2RhdGEpLCB0b3AsIGJvdCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIDI6IHRydW5jYXRlIGZvbGQgYXQgInRvcCIuICovCisJCWZwLT5mZF9sZW4gPSB0b3AgLSBmcC0+ZmRfdG9wOworCSAgICB9CisJICAgIGZvbGRfY2hhbmdlZCA9IFRSVUU7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoZnAgPj0gKGZvbGRfVCAqKShnYXAtPmdhX2RhdGEpICsgZ2FwLT5nYV9sZW4KKwkJfHwgZnAtPmZkX3RvcCA+IGJvdCkKKwl7CisJICAgIC8qIDY6IEZvdW5kIGEgZm9sZCBiZWxvdyBib3QsIGNhbiBzdG9wIGxvb2tpbmcuICovCisJICAgIGJyZWFrOworCX0KKwlpZiAoZnAtPmZkX3RvcCA+PSB0b3ApCisJeworCSAgICAvKiBGb3VuZCBhbiBlbnRyeSBiZWxvdyB0b3AuICovCisJICAgIGZvbGRfY2hhbmdlZCA9IFRSVUU7CisJICAgIGlmIChmcC0+ZmRfdG9wICsgZnAtPmZkX2xlbiA+IGJvdCkKKwkgICAgeworCQkvKiA1OiBNYWtlIGZvbGQgdGhhdCBpbmNsdWRlcyBib3Qgc3RhcnQgYmVsb3cgYm90LiAqLworCQlmb2xkTWFya0FkanVzdFJlY3Vyc2UoJmZwLT5mZF9uZXN0ZWQsCisJCQkobGluZW5yX1QpMCwgKGxvbmcpKGJvdCAtIGZwLT5mZF90b3ApLAorCQkJKGxpbmVucl9UKU1BWExOVU0sIChsb25nKShmcC0+ZmRfdG9wIC0gYm90IC0gMSkpOworCQlmcC0+ZmRfbGVuIC09IGJvdCAtIGZwLT5mZF90b3AgKyAxOworCQlmcC0+ZmRfdG9wID0gYm90ICsgMTsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKiA0OiBEZWxldGUgY29tcGxldGVseSBjb250YWluZWQgZm9sZC4gKi8KKwkgICAgZGVsZXRlRm9sZEVudHJ5KGdhcCwgKGludCkoZnAgLSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhKSwgVFJVRSk7CisJfQorICAgIH0KK30KKworLyogZm9sZE1lcmdlKCkge3t7MiAqLworLyoKKyAqIE1lcmdlIHR3byBhZGplY2VudCBmb2xkcyAoYW5kIHRoZSBuZXN0ZWQgb25lcyBpbiB0aGVtKS4KKyAqIFRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgZm9sZHMgYXJlIHJlYWxseSBhZGplY2VudCEgIFRodXMgImZwMSIKKyAqIG11c3QgZW5kIGp1c3QgYWJvdmUgImZwMiIuCisgKiBUaGUgcmVzdWx0aW5nIGZvbGQgaXMgImZwMSIsIG5lc3RlZCBmb2xkcyBhcmUgbW92ZWQgZnJvbSAiZnAyIiB0byAiZnAxIi4KKyAqIEZvbGQgZW50cnkgImZwMiIgaW4gImdhcCIgaXMgZGVsZXRlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkTWVyZ2UoZnAxLCBnYXAsIGZwMikKKyAgICBmb2xkX1QJKmZwMTsKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGZvbGRfVAkqZnAyOworeworICAgIGZvbGRfVAkqZnAzOworICAgIGZvbGRfVAkqZnA0OworICAgIGludAkJaWR4OworICAgIGdhcnJheV9UCSpnYXAxID0gJmZwMS0+ZmRfbmVzdGVkOworICAgIGdhcnJheV9UCSpnYXAyID0gJmZwMi0+ZmRfbmVzdGVkOworCisgICAgLyogSWYgdGhlIGxhc3QgbmVzdGVkIGZvbGQgaW4gZnAxIHRvdWNoZXMgdGhlIGZpcnN0IG5lc3RlZCBmb2xkIGluIGZwMiwKKyAgICAgKiBtZXJnZSB0aGVtIHJlY3Vyc2l2ZWx5LiAqLworICAgIGlmIChmb2xkRmluZChnYXAxLCBmcDEtPmZkX2xlbiAtIDFMLCAmZnAzKSAmJiBmb2xkRmluZChnYXAyLCAwTCwgJmZwNCkpCisJZm9sZE1lcmdlKGZwMywgZ2FwMiwgZnA0KTsKKworICAgIC8qIE1vdmUgbmVzdGVkIGZvbGRzIGluIGZwMiB0byB0aGUgZW5kIG9mIGZwMS4gKi8KKyAgICBpZiAoZ2FwMi0+Z2FfbGVuID4gMCAmJiBnYV9ncm93KGdhcDEsIGdhcDItPmdhX2xlbikgPT0gT0spCisgICAgeworCWZvciAoaWR4ID0gMDsgaWR4IDwgZ2FwMi0+Z2FfbGVuOyArK2lkeCkKKwl7CisJICAgICgoZm9sZF9UICopZ2FwMS0+Z2FfZGF0YSlbZ2FwMS0+Z2FfbGVuXQorCQkJCQk9ICgoZm9sZF9UICopZ2FwMi0+Z2FfZGF0YSlbaWR4XTsKKwkgICAgKChmb2xkX1QgKilnYXAxLT5nYV9kYXRhKVtnYXAxLT5nYV9sZW5dLmZkX3RvcCArPSBmcDEtPmZkX2xlbjsKKwkgICAgKytnYXAxLT5nYV9sZW47CisJICAgIC0tZ2FwMS0+Z2Ffcm9vbTsKKwl9CisJZ2FwMi0+Z2FfbGVuID0gMDsKKwkvKiBmcDItPmZkX25lc3RlZC5nYV9yb29tIGlzbid0IHVwZGF0ZWQsIHdlIGRlbGV0ZSBpdCBiZWxvdyAqLworICAgIH0KKworICAgIGZwMS0+ZmRfbGVuICs9IGZwMi0+ZmRfbGVuOworICAgIGRlbGV0ZUZvbGRFbnRyeShnYXAsIChpbnQpKGZwMiAtIChmb2xkX1QgKilnYXAtPmdhX2RhdGEpLCBUUlVFKTsKKyAgICBmb2xkX2NoYW5nZWQgPSBUUlVFOworfQorCisvKiBmb2xkbGV2ZWxJbmRlbnQoKSB7e3syICovCisvKgorICogTG93IGxldmVsIGZ1bmN0aW9uIHRvIGdldCB0aGUgZm9sZGxldmVsIGZvciB0aGUgImluZGVudCIgbWV0aG9kLgorICogRG9lc24ndCB1c2UgYW55IGNhY2hpbmcuCisgKiBSZXR1cm5zIGEgbGV2ZWwgb2YgLTEgaWYgdGhlIGZvbGRsZXZlbCBkZXBlbmRzIG9uIHN1cnJvdW5kaW5nIGxpbmVzLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZvbGRsZXZlbEluZGVudChmbHApCisgICAgZmxpbmVfVAkqZmxwOworeworICAgIGNoYXJfdQkqczsKKyAgICBidWZfVAkqYnVmOworICAgIGxpbmVucl9UCWxudW0gPSBmbHAtPmxudW0gKyBmbHAtPm9mZjsKKworICAgIGJ1ZiA9IGZscC0+d3AtPndfYnVmZmVyOworICAgIHMgPSBza2lwd2hpdGUobWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKSk7CisKKyAgICAvKiBlbXB0eSBsaW5lIG9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBjaGFyYWN0ZXIgaW4gJ2ZvbGRpZ25vcmUnOiBsZXZlbAorICAgICAqIGRlcGVuZHMgb24gc3Vycm91bmRpbmcgbGluZXMgKi8KKyAgICBpZiAoKnMgPT0gTlVMIHx8IHZpbV9zdHJjaHIoZmxwLT53cC0+d19wX2ZkaSwgKnMpICE9IE5VTEwpCisgICAgeworCS8qIGZpcnN0IGFuZCBsYXN0IGxpbmUgY2FuJ3QgYmUgdW5kZWZpbmVkLCB1c2UgbGV2ZWwgMCAqLworCWlmIChsbnVtID09IDEgfHwgbG51bSA9PSBidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgZmxwLT5sdmwgPSAwOworCWVsc2UKKwkgICAgZmxwLT5sdmwgPSAtMTsKKyAgICB9CisgICAgZWxzZQorCWZscC0+bHZsID0gZ2V0X2luZGVudF9idWYoYnVmLCBsbnVtKSAvIGJ1Zi0+Yl9wX3N3OworICAgIGlmIChmbHAtPmx2bCA+IGZscC0+d3AtPndfcF9mZG4pCisJZmxwLT5sdmwgPSBmbHAtPndwLT53X3BfZmRuOworfQorCisvKiBmb2xkbGV2ZWxEaWZmKCkge3t7MiAqLworI2lmZGVmIEZFQVRfRElGRgorLyoKKyAqIExvdyBsZXZlbCBmdW5jdGlvbiB0byBnZXQgdGhlIGZvbGRsZXZlbCBmb3IgdGhlICJkaWZmIiBtZXRob2QuCisgKiBEb2Vzbid0IHVzZSBhbnkgY2FjaGluZy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkbGV2ZWxEaWZmKGZscCkKKyAgICBmbGluZV9UCSpmbHA7Cit7CisgICAgaWYgKGRpZmZfaW5mb2xkKGZscC0+d3AsIGZscC0+bG51bSArIGZscC0+b2ZmKSkKKwlmbHAtPmx2bCA9IDE7CisgICAgZWxzZQorCWZscC0+bHZsID0gMDsKK30KKyNlbmRpZgorCisvKiBmb2xkbGV2ZWxFeHByKCkge3t7MiAqLworLyoKKyAqIExvdyBsZXZlbCBmdW5jdGlvbiB0byBnZXQgdGhlIGZvbGRsZXZlbCBmb3IgdGhlICJleHByIiBtZXRob2QuCisgKiBEb2Vzbid0IHVzZSBhbnkgY2FjaGluZy4KKyAqIFJldHVybnMgYSBsZXZlbCBvZiAtMSBpZiB0aGUgZm9sZGxldmVsIGRlcGVuZHMgb24gc3Vycm91bmRpbmcgbGluZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZGxldmVsRXhwcihmbHApCisgICAgZmxpbmVfVAkqZmxwOworeworI2lmbmRlZiBGRUFUX0VWQUwKKyAgICBmbHAtPnN0YXJ0ID0gRkFMU0U7CisgICAgZmxwLT5sdmwgPSAwOworI2Vsc2UKKyAgICB3aW5fVAkqd2luOworICAgIGludAkJbjsKKyAgICBpbnQJCWM7CisgICAgbGluZW5yX1QJbG51bSA9IGZscC0+bG51bSArIGZscC0+b2ZmOworICAgIGludAkJc2F2ZV9rZXl0eXBlZDsKKworICAgIHdpbiA9IGN1cndpbjsKKyAgICBjdXJ3aW4gPSBmbHAtPndwOworICAgIGN1cmJ1ZiA9IGZscC0+d3AtPndfYnVmZmVyOworICAgIHNldF92aW1fdmFyX25yKFZWX0xOVU0sIGxudW0pOworCisgICAgZmxwLT5zdGFydCA9IDA7CisgICAgZmxwLT5oYWRfZW5kID0gZmxwLT5lbmQ7CisgICAgZmxwLT5lbmQgPSBNQVhfTEVWRUwgKyAxOworICAgIGlmIChsbnVtIDw9IDEpCisJZmxwLT5sdmwgPSAwOworCisgICAgLyogS2V5VHlwZWQgbWF5IGJlIHJlc2V0IHRvIDAgd2hlbiBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaW52b2tlcworICAgICAqIGRvX2NtZGxpbmUoKS4gIFRvIG1ha2UgJ2ZvbGRvcGVuJyB3b3JrIGNvcnJlY3RseSByZXN0b3JlIEtleVR5cGVkLiAqLworICAgIHNhdmVfa2V5dHlwZWQgPSBLZXlUeXBlZDsKKyAgICBuID0gZXZhbF9mb2xkZXhwcihmbHAtPndwLT53X3BfZmRlLCAmYyk7CisgICAgS2V5VHlwZWQgPSBzYXZlX2tleXR5cGVkOworCisgICAgc3dpdGNoIChjKQorICAgIHsKKwkvKiAiYTEiLCAiYTIiLCAuLiA6IGFkZCB0byB0aGUgZm9sZCBsZXZlbCAqLworCWNhc2UgJ2EnOiBpZiAoZmxwLT5sdmwgPj0gMCkKKwkJICB7CisJCSAgICAgIGZscC0+bHZsICs9IG47CisJCSAgICAgIGZscC0+bHZsX25leHQgPSBmbHAtPmx2bDsKKwkJICB9CisJCSAgZmxwLT5zdGFydCA9IG47CisJCSAgYnJlYWs7CisKKwkvKiAiczEiLCAiczIiLCAuLiA6IHN1YnRyYWN0IGZyb20gdGhlIGZvbGQgbGV2ZWwgKi8KKwljYXNlICdzJzogaWYgKGZscC0+bHZsID49IDApCisJCSAgeworCQkgICAgICBpZiAobiA+IGZscC0+bHZsKQorCQkJICBmbHAtPmx2bF9uZXh0ID0gMDsKKwkJICAgICAgZWxzZQorCQkJICBmbHAtPmx2bF9uZXh0ID0gZmxwLT5sdmwgLSBuOworCQkgICAgICBmbHAtPmVuZCA9IGZscC0+bHZsX25leHQgKyAxOworCQkgIH0KKwkJICBicmVhazsKKworCS8qICI+MSIsICI+MiIsIC4uIDogc3RhcnQgYSBmb2xkIHdpdGggYSBjZXJ0YWluIGxldmVsICovCisJY2FzZSAnPic6IGZscC0+bHZsID0gbjsKKwkJICBmbHAtPmx2bF9uZXh0ID0gbjsKKwkJICBmbHAtPnN0YXJ0ID0gMTsKKwkJICBicmVhazsKKworCS8qICI8MSIsICI8MiIsIC4uIDogZW5kIGEgZm9sZCB3aXRoIGEgY2VydGFpbiBsZXZlbCAqLworCWNhc2UgJzwnOiBmbHAtPmx2bF9uZXh0ID0gbiAtIDE7CisJCSAgZmxwLT5lbmQgPSBuOworCQkgIGJyZWFrOworCisJLyogIj0iOiBObyBjaGFuZ2UgaW4gbGV2ZWwgKi8KKwljYXNlICc9JzogZmxwLT5sdmxfbmV4dCA9IGZscC0+bHZsOworCQkgIGJyZWFrOworCisJLyogIi0xIiwgIjAiLCAiMSIsIC4uOiBzZXQgZm9sZCBsZXZlbCAqLworCWRlZmF1bHQ6ICBpZiAobiA8IDApCisJCSAgICAgIC8qIFVzZSB0aGUgY3VycmVudCBsZXZlbCBmb3IgdGhlIG5leHQgbGluZSwgc28gdGhhdCAiYTEiCisJCSAgICAgICAqIHdpbGwgd29yayB0aGVyZS4gKi8KKwkJICAgICAgZmxwLT5sdmxfbmV4dCA9IGZscC0+bHZsOworCQkgIGVsc2UKKwkJICAgICAgZmxwLT5sdmxfbmV4dCA9IG47CisJCSAgZmxwLT5sdmwgPSBuOworCQkgIGJyZWFrOworICAgIH0KKworICAgIC8qIElmIHRoZSBsZXZlbCBpcyB1bmtub3duIGZvciB0aGUgZmlyc3Qgb3IgdGhlIGxhc3QgbGluZSBpbiB0aGUgZmlsZSwgdXNlCisgICAgICogbGV2ZWwgMC4gKi8KKyAgICBpZiAoZmxwLT5sdmwgPCAwKQorICAgIHsKKwlpZiAobG51bSA8PSAxKQorCXsKKwkgICAgZmxwLT5sdmwgPSAwOworCSAgICBmbHAtPmx2bF9uZXh0ID0gMDsKKwl9CisJaWYgKGxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIGZscC0+bHZsX25leHQgPSAwOworICAgIH0KKworICAgIGN1cndpbiA9IHdpbjsKKyAgICBjdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworI2VuZGlmCit9CisKKy8qIHBhcnNlTWFya2VyKCkge3t7MiAqLworLyoKKyAqIFBhcnNlICdmb2xkbWFya2VyJyBhbmQgc2V0ICJmb2xkZW5kbWFya2VyIiwgImZvbGRzdGFydG1hcmtlcmxlbiIgYW5kCisgKiAiZm9sZGVuZG1hcmtlcmxlbiIuCisgKiBSZWxpZXMgb24gdGhlIG9wdGlvbiB2YWx1ZSB0byBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgY29ycmVjdG5lc3MgYWxyZWFkeS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwYXJzZU1hcmtlcih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgZm9sZGVuZG1hcmtlciA9IHZpbV9zdHJjaHIod3AtPndfcF9mbXIsICcsJyk7CisgICAgZm9sZHN0YXJ0bWFya2VybGVuID0gKGludCkoZm9sZGVuZG1hcmtlcisrIC0gd3AtPndfcF9mbXIpOworICAgIGZvbGRlbmRtYXJrZXJsZW4gPSAoaW50KVNUUkxFTihmb2xkZW5kbWFya2VyKTsKK30KKworLyogZm9sZGxldmVsTWFya2VyKCkge3t7MiAqLworLyoKKyAqIExvdyBsZXZlbCBmdW5jdGlvbiB0byBnZXQgdGhlIGZvbGRsZXZlbCBmb3IgdGhlICJtYXJrZXIiIG1ldGhvZC4KKyAqICJmb2xkZW5kbWFya2VyIiwgImZvbGRzdGFydG1hcmtlcmxlbiIgYW5kICJmb2xkZW5kbWFya2VybGVuIiBtdXN0IGhhdmUgYmVlbgorICogc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKiBSZXF1aXJlcyB0aGF0IGZscC0+bHZsIGlzIHNldCB0byB0aGUgZm9sZCBsZXZlbCBvZiB0aGUgcHJldmlvdXMgbGluZSEKKyAqIENhcmVmdWw6IFRoaXMgbWVhbnMgeW91IGNhbid0IGNhbGwgdGhpcyBmdW5jdGlvbiB0d2ljZSBvbiB0aGUgc2FtZSBsaW5lLgorICogRG9lc24ndCB1c2UgYW55IGNhY2hpbmcuCisgKiBTZXRzIGZscC0+c3RhcnQgd2hlbiBhIHN0YXJ0IG1hcmtlciB3YXMgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZm9sZGxldmVsTWFya2VyKGZscCkKKyAgICBmbGluZV9UCSpmbHA7Cit7CisgICAgY2hhcl91CSpzdGFydG1hcmtlcjsKKyAgICBpbnQJCWNzdGFydDsKKyAgICBpbnQJCWNlbmQ7CisgICAgaW50CQlzdGFydF9sdmwgPSBmbHAtPmx2bDsKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQluOworCisgICAgLyogY2FjaGUgYSBmZXcgdmFsdWVzIGZvciBzcGVlZCAqLworICAgIHN0YXJ0bWFya2VyID0gZmxwLT53cC0+d19wX2ZtcjsKKyAgICBjc3RhcnQgPSAqc3RhcnRtYXJrZXI7CisgICAgKytzdGFydG1hcmtlcjsKKyAgICBjZW5kID0gKmZvbGRlbmRtYXJrZXI7CisKKyAgICAvKiBEZWZhdWx0OiBubyBzdGFydCBmb3VuZCwgbmV4dCBsZXZlbCBpcyBzYW1lIGFzIGN1cnJlbnQgbGV2ZWwgKi8KKyAgICBmbHAtPnN0YXJ0ID0gMDsKKyAgICBmbHAtPmx2bF9uZXh0ID0gZmxwLT5sdmw7CisKKyAgICBzID0gbWxfZ2V0X2J1ZihmbHAtPndwLT53X2J1ZmZlciwgZmxwLT5sbnVtICsgZmxwLT5vZmYsIEZBTFNFKTsKKyAgICB3aGlsZSAoKnMpCisgICAgeworCWlmICgqcyA9PSBjc3RhcnQKKwkJICAmJiBTVFJOQ01QKHMgKyAxLCBzdGFydG1hcmtlciwgZm9sZHN0YXJ0bWFya2VybGVuIC0gMSkgPT0gMCkKKwl7CisJICAgIC8qIGZvdW5kIHN0YXJ0bWFya2VyOiBzZXQgZmxwLT5sdmwgKi8KKwkgICAgcyArPSBmb2xkc3RhcnRtYXJrZXJsZW47CisJICAgIGlmIChWSU1fSVNESUdJVCgqcykpCisJICAgIHsKKwkJbiA9IGF0b2koKGNoYXIgKilzKTsKKwkJaWYgKG4gPiAwKQorCQl7CisJCSAgICBmbHAtPmx2bCA9IG47CisJCSAgICBmbHAtPmx2bF9uZXh0ID0gbjsKKwkJICAgIGlmIChuIDw9IHN0YXJ0X2x2bCkKKwkJCWZscC0+c3RhcnQgPSAxOworCQkgICAgZWxzZQorCQkJZmxwLT5zdGFydCA9IG4gLSBzdGFydF9sdmw7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJKytmbHAtPmx2bDsKKwkJKytmbHAtPmx2bF9uZXh0OworCQkrK2ZscC0+c3RhcnQ7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoKnMgPT0gY2VuZAorCSAgICAgICYmIFNUUk5DTVAocyArIDEsIGZvbGRlbmRtYXJrZXIgKyAxLCBmb2xkZW5kbWFya2VybGVuIC0gMSkgPT0gMCkKKwl7CisJICAgIC8qIGZvdW5kIGVuZG1hcmtlcjogc2V0IGZscC0+bHZsX25leHQgKi8KKwkgICAgcyArPSBmb2xkZW5kbWFya2VybGVuOworCSAgICBpZiAoVklNX0lTRElHSVQoKnMpKQorCSAgICB7CisJCW4gPSBhdG9pKChjaGFyICopcyk7CisJCWlmIChuID4gMCkKKwkJeworCQkgICAgZmxwLT5sdmwgPSBuOworCQkgICAgZmxwLT5sdmxfbmV4dCA9IG4gLSAxOworCQkgICAgLyogbmV2ZXIgc3RhcnQgYSBmb2xkIHdpdGggYW4gZW5kIG1hcmtlciAqLworCQkgICAgaWYgKGZscC0+bHZsX25leHQgPiBmbHAtPmx2bCkKKwkJCWZscC0+bHZsX25leHQgPSBmbHAtPmx2bDsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJLS1mbHAtPmx2bF9uZXh0OworCX0KKwllbHNlCisJICAgICsrczsKKyAgICB9CisKKyAgICAvKiBUaGUgbGV2ZWwgY2FuJ3QgZ28gbmVnYXRpdmUsIG11c3QgYmUgbWlzc2luZyBhIHN0YXJ0IG1hcmtlci4gKi8KKyAgICBpZiAoZmxwLT5sdmxfbmV4dCA8IDApCisJZmxwLT5sdmxfbmV4dCA9IDA7Cit9CisKKy8qIGZvbGRsZXZlbFN5bnRheCgpIHt7ezIgKi8KKy8qCisgKiBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBmb2xkbGV2ZWwgZm9yIHRoZSAic3ludGF4IiBtZXRob2QuCisgKiBEb2Vzbid0IHVzZSBhbnkgY2FjaGluZy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkbGV2ZWxTeW50YXgoZmxwKQorICAgIGZsaW5lX1QJKmZscDsKK3sKKyNpZm5kZWYgRkVBVF9TWU5fSEwKKyAgICBmbHAtPnN0YXJ0ID0gMDsKKyAgICBmbHAtPmx2bCA9IDA7CisjZWxzZQorICAgIGxpbmVucl9UCWxudW0gPSBmbHAtPmxudW0gKyBmbHAtPm9mZjsKKyAgICBpbnQJCW47CisKKyAgICAvKiBVc2UgdGhlIG1heGltdW0gZm9sZCBsZXZlbCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBsaW5lIGFuZCB0aGUgbmV4dC4gKi8KKyAgICBmbHAtPmx2bCA9IHN5bl9nZXRfZm9sZGxldmVsKGZscC0+d3AsIGxudW0pOworICAgIGZscC0+c3RhcnQgPSAwOworICAgIGlmIChsbnVtIDwgZmxwLT53cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJbiA9IHN5bl9nZXRfZm9sZGxldmVsKGZscC0+d3AsIGxudW0gKyAxKTsKKwlpZiAobiA+IGZscC0+bHZsKQorCXsKKwkgICAgZmxwLT5zdGFydCA9IG4gLSBmbHAtPmx2bDsJLyogZm9sZChzKSBzdGFydCBoZXJlICovCisJICAgIGZscC0+bHZsID0gbjsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qIGZ1bmN0aW9ucyBmb3Igc3RvcmluZyB0aGUgZm9sZCBzdGF0ZSBpbiBhIFZpZXcge3t7MSAqLworLyogcHV0X2ZvbGRzKCkge3t7MiAqLworI2lmIGRlZmluZWQoRkVBVF9TRVNTSU9OKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludCBwdXRfZm9sZHNfcmVjdXJzZSBfX0FSR1MoKEZJTEUgKmZkLCBnYXJyYXlfVCAqZ2FwLCBsaW5lbnJfVCBvZmYpKTsKK3N0YXRpYyBpbnQgcHV0X2ZvbGRvcGVuX3JlY3Vyc2UgX19BUkdTKChGSUxFICpmZCwgZ2FycmF5X1QgKmdhcCwgbGluZW5yX1Qgb2ZmKSk7CisKKy8qCisgKiBXcml0ZSBjb21tYW5kcyB0byAiZmQiIHRvIHJlc3RvcmUgdGhlIG1hbnVhbCBmb2xkcyBpbiB3aW5kb3cgIndwIi4KKyAqIFJldHVybiBGQUlMIGlmIHdyaXRpbmcgZmFpbHMuCisgKi8KKyAgICBpbnQKK3B1dF9mb2xkcyhmZCwgd3ApCisgICAgRklMRQkqZmQ7CisgICAgd2luX1QJKndwOworeworICAgIGlmIChmb2xkbWV0aG9kSXNNYW51YWwod3ApKQorICAgIHsKKwlpZiAocHV0X2xpbmUoZmQsICJzaWxlbnQhIG5vcm1hbCEgekUiKSA9PSBGQUlMCisJCXx8IHB1dF9mb2xkc19yZWN1cnNlKGZkLCAmd3AtPndfZm9sZHMsIChsaW5lbnJfVCkwKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBJZiBzb21lIGZvbGRzIGFyZSBtYW51YWxseSBvcGVuZWQvY2xvc2VkLCBuZWVkIHRvIHJlc3RvcmUgdGhhdC4gKi8KKyAgICBpZiAod3AtPndfZm9sZF9tYW51YWwpCisJcmV0dXJuIHB1dF9mb2xkb3Blbl9yZWN1cnNlKGZkLCAmd3AtPndfZm9sZHMsIChsaW5lbnJfVCkwKTsKKworICAgIHJldHVybiBPSzsKK30KKworLyogcHV0X2ZvbGRzX3JlY3Vyc2UoKSB7e3syICovCisvKgorICogV3JpdGUgY29tbWFuZHMgdG8gImZkIiB0byByZWNyZWF0ZSBtYW51YWxseSBjcmVhdGVkIGZvbGRzLgorICogUmV0dXJucyBGQUlMIHdoZW4gd3JpdGluZyBmYWlsZWQuCisgKi8KKyAgICBzdGF0aWMgaW50CitwdXRfZm9sZHNfcmVjdXJzZShmZCwgZ2FwLCBvZmYpCisgICAgRklMRQkqZmQ7CisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBsaW5lbnJfVAlvZmY7Cit7CisgICAgaW50CQlpOworICAgIGZvbGRfVAkqZnA7CisKKyAgICBmcCA9IChmb2xkX1QgKilnYXAtPmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyBpKyspCisgICAgeworCS8qIERvIG5lc3RlZCBmb2xkcyBmaXJzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQgY2xvc2VkLiAqLworCWlmIChwdXRfZm9sZHNfcmVjdXJzZShmZCwgJmZwLT5mZF9uZXN0ZWQsIG9mZiArIGZwLT5mZF90b3ApID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworCWlmIChmcHJpbnRmKGZkLCAiJWxkLCVsZGZvbGQiLCBmcC0+ZmRfdG9wICsgb2ZmLAorCQkJCQlmcC0+ZmRfdG9wICsgb2ZmICsgZnAtPmZkX2xlbiAtIDEpIDwgMAorCQl8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKwkrK2ZwOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIHB1dF9mb2xkb3Blbl9yZWN1cnNlKCkge3t7MiAqLworLyoKKyAqIFdyaXRlIGNvbW1hbmRzIHRvICJmZCIgdG8gb3BlbiBhbmQgY2xvc2UgbWFudWFsbHkgb3BlbmVkL2Nsb3NlZCBmb2xkcy4KKyAqIFJldHVybnMgRkFJTCB3aGVuIHdyaXRpbmcgZmFpbGVkLgorICovCisgICAgc3RhdGljIGludAorcHV0X2ZvbGRvcGVuX3JlY3Vyc2UoZmQsIGdhcCwgb2ZmKQorICAgIEZJTEUJKmZkOworICAgIGdhcnJheV9UCSpnYXA7CisgICAgbGluZW5yX1QJb2ZmOworeworICAgIGludAkJaTsKKyAgICBmb2xkX1QJKmZwOworCisgICAgZnAgPSAoZm9sZF9UICopZ2FwLT5nYV9kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbjsgaSsrKQorICAgIHsKKwlpZiAoZnAtPmZkX2ZsYWdzICE9IEZEX0xFVkVMKQorCXsKKwkgICAgaWYgKGZwLT5mZF9uZXN0ZWQuZ2FfbGVuID4gMCkKKwkgICAgeworCQkvKiBvcGVuL2Nsb3NlIG5lc3RlZCBmb2xkcyB3aGlsZSB0aGlzIGZvbGQgaXMgb3BlbiAqLworCQlpZiAoZnByaW50ZihmZCwgIiVsZCIsIGZwLT5mZF90b3AgKyBvZmYpIDwgMAorCQkJfHwgcHV0X2VvbChmZCkgPT0gRkFJTAorCQkJfHwgcHV0X2xpbmUoZmQsICJub3JtYWwgem8iKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJCWlmIChwdXRfZm9sZG9wZW5fcmVjdXJzZShmZCwgJmZwLT5mZF9uZXN0ZWQsIG9mZiArIGZwLT5mZF90b3ApCisJCQk9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgaWYgKGZwcmludGYoZmQsICIlbGQiLCBmcC0+ZmRfdG9wICsgb2ZmKSA8IDAKKwkJICAgIHx8IHB1dF9lb2woZmQpID09IEZBSUwKKwkJICAgIHx8IGZwcmludGYoZmQsICJub3JtYWwgeiVjIiwKKwkJCQkgICAgZnAtPmZkX2ZsYWdzID09IEZEX0NMT1NFRCA/ICdjJyA6ICdvJykgPCAwCisJCSAgICB8fCBwdXRfZW9sKGZkKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwl9CisJKytmcDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYgLyogRkVBVF9TRVNTSU9OICovCisKKy8qIH19fTEgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKEZFQVRfRk9MRElORykgfHwgZGVmaW5lZChQUk9UTykgKi8KZGlmZiAtLWdpdCBhL3NyYy9nZXRjaGFyLmMgYi9zcmMvZ2V0Y2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2V0Y2hhci5jCkBAIC0wLDAgKzEsNDYzNiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogZ2V0Y2hhci5jCisgKgorICogZnVuY3Rpb25zIHJlbGF0ZWQgd2l0aCBnZXR0aW5nIGEgY2hhcmFjdGVyIGZyb20gdGhlIHVzZXIvbWFwcGluZy9yZWRvLy4uLgorICoKKyAqIG1hbmlwdWxhdGlvbnMgd2l0aCByZWRvIGJ1ZmZlciBhbmQgc3R1ZmYgYnVmZmVyCisgKiBtYXBwaW5ncyBhbmQgYWJicmV2aWF0aW9ucworICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyoKKyAqIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgZm9yIHN0b3Jpbmc6CisgKiAtIHN0dWZmZWQgY2hhcmFjdGVyczogQSBjb21tYW5kIHRoYXQgaXMgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgY29tbWFuZC4KKyAqIC0gcmVkbyBjaGFyYWN0ZXJzOiB3aWxsIHJlZG8gdGhlIGxhc3QgY2hhbmdlLgorICogLSByZWNvcmRlZCBjaHJhY3RlcnM6IGZvciB0aGUgInEiIGNvbW1hbmQuCisgKgorICogVGhlIGJ5dGVzIGFyZSBzdG9yZWQgbGlrZSBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlcjoKKyAqIC0gS19TUEVDSUFMIGludHJvZHVjZXMgYSBzcGVjaWFsIGtleSAodHdvIG1vcmUgYnl0ZXMgZm9sbG93KS4gIEEgbGl0ZXJhbAorICogICBLX1NQRUNJQUwgaXMgc3RvcmVkIGFzIEtfU1BFQ0lBTCBLU19TUEVDSUFMIEtFX0ZJTExFUi4KKyAqIC0gQ1NJIGludHJvZHVjZXMgYSBHVUkgdGVybWNhcCBjb2RlIChhbHNvIHdoZW4gZ3VpLmluX3VzZSBpcyBGQUxTRSwKKyAqICAgb3RoZXJ3aXNlIHN3aXRjaGluZyB0aGUgR1VJIG9uIHdvdWxkIG1ha2UgbWFwcGluZ3MgaW52YWxpZCkuCisgKiAgIEEgbGl0ZXJhbCBDU0kgaXMgc3RvcmVkIGFzIENTSSBLU19FWFRSQSBLRV9DU0kuCisgKiBUaGVzZSB0cmFuc2xhdGlvbnMgYXJlIGFsc28gZG9uZSBvbiBtdWx0aS1ieXRlIGNoYXJhY3RlcnMhCisgKgorICogRXNjYXBpbmcgQ1NJIGJ5dGVzIGlzIGRvbmUgYnkgdGhlIHN5c3RlbS1zcGVjaWZpYyBpbnB1dCBmdW5jdGlvbnMsIGNhbGxlZAorICogYnkgdWlfaW5jaGFyKCkuCisgKiBFc2NhcGluZyBLX1NQRUNJQUwgaXMgZG9uZSBieSBpbmNoYXIoKS4KKyAqIFVuLWVzY2FwaW5nIGlzIGRvbmUgYnkgdmdldGMoKS4KKyAqLworCisjZGVmaW5lIE1JTklNQUxfU0laRSAyMAkJCS8qIG1pbmltYWwgc2l6ZSBmb3IgYl9zdHIgKi8KKworc3RhdGljIHN0cnVjdCBidWZmaGVhZGVyIHJlZG9idWZmID0ge3tOVUxMLCB7TlVMfX0sIE5VTEwsIDAsIDB9Oworc3RhdGljIHN0cnVjdCBidWZmaGVhZGVyIG9sZF9yZWRvYnVmZiA9IHt7TlVMTCwge05VTH19LCBOVUxMLCAwLCAwfTsKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCitzdGF0aWMgc3RydWN0IGJ1ZmZoZWFkZXIgc2F2ZV9yZWRvYnVmZiA9IHt7TlVMTCwge05VTH19LCBOVUxMLCAwLCAwfTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmhlYWRlciBzYXZlX29sZF9yZWRvYnVmZiA9IHt7TlVMTCwge05VTH19LCBOVUxMLCAwLCAwfTsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBidWZmaGVhZGVyIHJlY29yZGJ1ZmYgPSB7e05VTEwsIHtOVUx9fSwgTlVMTCwgMCwgMH07CisKK3N0YXRpYyBpbnQgdHlwZWFoZWFkX2NoYXIgPSAwOwkJLyogdHlwZWFoZWFkIGNoYXIgdGhhdCdzIG5vdCBmbHVzaGVkICovCisKKy8qCisgKiB3aGVuIGJsb2NrX3JlZG8gaXMgVFJVRSByZWRvIGJ1ZmZlciB3aWxsIG5vdCBiZSBjaGFuZ2VkCisgKiB1c2VkIGJ5IGVkaXQoKSB0byByZXBlYXQgaW5zZXJ0aW9ucyBhbmQgJ1YnIGNvbW1hbmQgZm9yIHJlZG9pbmcKKyAqLworc3RhdGljIGludAlibG9ja19yZWRvID0gRkFMU0U7CisKKy8qCisgKiBNYWtlIGEgaGFzaCB2YWx1ZSBmb3IgYSBtYXBwaW5nLgorICogIm1vZGUiIGlzIHRoZSBsb3dlciA0IGJpdHMgb2YgdGhlIFN0YXRlIGZvciB0aGUgbWFwcGluZy4KKyAqICJjMSIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgImxocyIuCisgKiBSZXR1cm5zIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUsIGluZGV4IGluIG1hcGhhc2guCisgKiBQdXQgTm9ybWFsL1Zpc3VhbCBtb2RlIG1hcHBpbmdzIG1vc3RseSBzZXBhcmF0ZWx5IGZyb20gSW5zZXJ0L0NtZGxpbmUgbW9kZS4KKyAqLworI2RlZmluZSBNQVBfSEFTSChtb2RlLCBjMSkgKCgobW9kZSkgJiAoTk9STUFMICsgVklTVUFMICsgT1BfUEVORElORykpID8gKGMxKSA6ICgoYzEpIF4gMHg4MCkpCisKKy8qCisgKiBFYWNoIG1hcHBpbmcgaXMgcHV0IGluIG9uZSBvZiB0aGUgMjU2IGhhc2ggbGlzdHMsIHRvIHNwZWVkIHVwIGZpbmRpbmcgaXQuCisgKi8KK3N0YXRpYyBtYXBibG9ja19UCSoobWFwaGFzaFsyNTZdKTsKK3N0YXRpYyBpbnQJCW1hcGhhc2hfdmFsaWQgPSBGQUxTRTsKKworLyoKKyAqIExpc3QgdXNlZCBmb3IgYWJicmV2aWF0aW9ucy4KKyAqLworc3RhdGljIG1hcGJsb2NrX1QJKmZpcnN0X2FiYnIgPSBOVUxMOyAvKiBmaXJzdCBlbnRyeSBpbiBhYmJybGlzdCAqLworCitzdGF0aWMgaW50CQlLZXlOb3JlbWFwID0gRkFMU0U7IC8qIHJlbWFwcGluZyBkaXNhYmxlZCAqLworCisvKgorICogdmFyaWFibGVzIHVzZWQgYnkgdmdldG9ycGVlaygpIGFuZCBmbHVzaF9idWZmZXJzKCkKKyAqCisgKiB0eXBlYnVmLnRiX2J1ZltdIGNvbnRhaW5zIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBjb25zdW1lZCB5ZXQuCisgKiB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZl0gaXMgdGhlIGZpcnN0IHZhbGlkIGNoYXJhY3Rlci4KKyAqIHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmICsgdHlwZWJ1Zi50Yl9sZW4gLSAxXSBpcyB0aGUgbGFzdCB2YWxpZCBjaGFyLgorICogdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYgKyB0eXBlYnVmLnRiX2xlbl0gbXVzdCBiZSBOVUwuCisgKiBUaGUgaGVhZCBvZiB0aGUgYnVmZmVyIG1heSBjb250YWluIHRoZSByZXN1bHQgb2YgbWFwcGluZ3MsIGFiYnJldmlhdGlvbnMKKyAqIGFuZCBAYSBjb21tYW5kcy4gIFRoZSBsZW5ndGggb2YgdGhpcyBwYXJ0IGlzIHR5cGVidWYudGJfbWFwbGVuLgorICogdHlwZWJ1Zi50Yl9zaWxlbnQgaXMgdGhlIHBhcnQgd2hlcmUgPHNpbGVudD4gYXBwbGllcy4KKyAqIEFmdGVyIHRoZSBoZWFkIGFyZSBjaGFyYWN0ZXJzIHRoYXQgY29tZSBmcm9tIHRoZSB0ZXJtaW5hbC4KKyAqIHR5cGVidWYudGJfbm9fYWJicl9jbnQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHR5cGVidWYudGJfYnVmIHRoYXQKKyAqIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBmb3IgYWJicmV2aWF0aW9ucy4KKyAqIFNvbWUgcGFydHMgb2YgdHlwZWJ1Zi50Yl9idWYgbWF5IG5vdCBiZSBtYXBwZWQuIFRoZXNlIHBhcnRzIGFyZSByZW1lbWJlcmVkCisgKiBpbiB0eXBlYnVmLnRiX25vcmVtYXBbXSwgd2hpY2ggaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHR5cGVidWYudGJfYnVmIGFuZAorICogY29udGFpbnMgUk1fTk9ORSBmb3IgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHRvIGJlIHJlbWFwcGVkLgorICogdHlwZWJ1Zi50Yl9ub3JlbWFwW3R5cGVidWYudGJfb2ZmXSBpcyB0aGUgZmlyc3QgdmFsaWQgZmxhZy4KKyAqICh0eXBlYnVmIGhhcyBiZWVuIHB1dCBpbiBnbG9iYWxzLmgsIGJlY2F1c2UgY2hlY2tfdGVybWNvZGUoKSBuZWVkcyBpdCkuCisgKi8KKyNkZWZpbmUgUk1fWUVTCQkwCS8qIHRiX25vcmVtYXA6IHJlbWFwICovCisjZGVmaW5lIFJNX05PTkUJCTEJLyogdGJfbm9yZW1hcDogZG9uJ3QgcmVtYXAgKi8KKyNkZWZpbmUgUk1fU0NSSVBUCTIJLyogdGJfbm9yZW1hcDogcmVtYXAgbG9jYWwgc2NyaXB0IG1hcHBpbmdzICovCisKKy8qIHR5cGVidWYudGJfYnVmIGhhcyB0aHJlZSBwYXJ0czogcm9vbSBpbiBmcm9udCAoZm9yIHJlc3VsdCBvZiBtYXBwaW5ncyksIHRoZQorICogbWlkZGxlIGZvciB0eXBlYWhlYWQgYW5kIHJvb20gZm9yIG5ldyBjaGFyYWN0ZXJzICh3aGljaCBuZWVkcyB0byBiZSAzICoKKyAqIE1BWE1BUExFTikgZm9yIHRoZSBBbWlnYSkuCisgKi8KKyNkZWZpbmUgVFlQRUxFTl9JTklUCSg1ICogKE1BWE1BUExFTiArIDMpKQorc3RhdGljIGNoYXJfdQl0eXBlYnVmX2luaXRbVFlQRUxFTl9JTklUXTsJLyogaW5pdGlhbCB0eXBlYnVmLnRiX2J1ZiAqLworc3RhdGljIGNoYXJfdQlub3JlbWFwYnVmX2luaXRbVFlQRUxFTl9JTklUXTsJLyogaW5pdGlhbCB0eXBlYnVmLnRiX25vcmVtYXAgKi8KKworc3RhdGljIGludAlsYXN0X3JlY29yZGVkX2xlbiA9IDA7CS8qIG51bWJlciBvZiBsYXN0IHJlY29yZGVkIGNoYXJzICovCisKK3N0YXRpYyBjaGFyX3UJKmdldF9idWZmY29udCBfX0FSR1MoKHN0cnVjdCBidWZmaGVhZGVyICosIGludCkpOworc3RhdGljIHZvaWQJYWRkX2J1ZmYgX19BUkdTKChzdHJ1Y3QgYnVmZmhlYWRlciAqLCBjaGFyX3UgKiwgbG9uZyBuKSk7CitzdGF0aWMgdm9pZAlhZGRfbnVtX2J1ZmYgX19BUkdTKChzdHJ1Y3QgYnVmZmhlYWRlciAqLCBsb25nKSk7CitzdGF0aWMgdm9pZAlhZGRfY2hhcl9idWZmIF9fQVJHUygoc3RydWN0IGJ1ZmZoZWFkZXIgKiwgaW50KSk7CitzdGF0aWMgaW50CXJlYWRfc3R1ZmYgX19BUkdTKChpbnQgYWR2YW5jZSkpOworc3RhdGljIHZvaWQJc3RhcnRfc3R1ZmYgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50CXJlYWRfcmVkbyBfX0FSR1MoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZAljb3B5X3JlZG8gX19BUkdTKChpbnQpKTsKK3N0YXRpYyB2b2lkCWluaXRfdHlwZWJ1ZiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCWdvdGNoYXJzIF9fQVJHUygoY2hhcl91ICosIGludCkpOworc3RhdGljIHZvaWQJbWF5X3N5bmNfdW5kbyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCWNsb3Nlc2NyaXB0IF9fQVJHUygodm9pZCkpOworc3RhdGljIGludAl2Z2V0b3JwZWVrIF9fQVJHUygoaW50KSk7CitzdGF0aWMgdm9pZAltYXBfZnJlZSBfX0FSR1MoKG1hcGJsb2NrX1QgKiopKTsKK3N0YXRpYyB2b2lkCXZhbGlkYXRlX21hcGhhc2ggX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlzaG93bWFwIF9fQVJHUygobWFwYmxvY2tfVCAqbXAsIGludCBsb2NhbCkpOworCisvKgorICogRnJlZSBhbmQgY2xlYXIgYSBidWZmZXIuCisgKi8KKyAgICB2b2lkCitmcmVlX2J1ZmYoYnVmKQorICAgIHN0cnVjdCBidWZmaGVhZGVyCSpidWY7Cit7CisgICAgc3RydWN0IGJ1ZmZibG9jawkqcCwgKm5wOworCisgICAgZm9yIChwID0gYnVmLT5iaF9maXJzdC5iX25leHQ7IHAgIT0gTlVMTDsgcCA9IG5wKQorICAgIHsKKwlucCA9IHAtPmJfbmV4dDsKKwl2aW1fZnJlZShwKTsKKyAgICB9CisgICAgYnVmLT5iaF9maXJzdC5iX25leHQgPSBOVUxMOworfQorCisvKgorICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiBhIGJ1ZmZlciBhcyBhIHNpbmdsZSBzdHJpbmcuCisgKiBLX1NQRUNJQUwgYW5kIENTSSBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nIGFyZSBlc2NhcGVkLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitnZXRfYnVmZmNvbnQoYnVmZmVyLCBkb3plcm8pCisgICAgc3RydWN0IGJ1ZmZoZWFkZXIJKmJ1ZmZlcjsKKyAgICBpbnQJCQlkb3plcm87CSAgICAvKiBjb3VudCA9PSB6ZXJvIGlzIG5vdCBhbiBlcnJvciAqLworeworICAgIGxvbmdfdQkgICAgY291bnQgPSAwOworICAgIGNoYXJfdQkgICAgKnAgPSBOVUxMOworICAgIGNoYXJfdQkgICAgKnAyOworICAgIGNoYXJfdQkgICAgKnN0cjsKKyAgICBzdHJ1Y3QgYnVmZmJsb2NrICpicDsKKworICAgIC8qIGNvbXB1dGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCisgICAgZm9yIChicCA9IGJ1ZmZlci0+YmhfZmlyc3QuYl9uZXh0OyBicCAhPSBOVUxMOyBicCA9IGJwLT5iX25leHQpCisJY291bnQgKz0gKGxvbmdfdSlTVFJMRU4oYnAtPmJfc3RyKTsKKworICAgIGlmICgoY291bnQgfHwgZG96ZXJvKSAmJiAocCA9IGxhbGxvYyhjb3VudCArIDEsIFRSVUUpKSAhPSBOVUxMKQorICAgIHsKKwlwMiA9IHA7CisJZm9yIChicCA9IGJ1ZmZlci0+YmhfZmlyc3QuYl9uZXh0OyBicCAhPSBOVUxMOyBicCA9IGJwLT5iX25leHQpCisJICAgIGZvciAoc3RyID0gYnAtPmJfc3RyOyAqc3RyOyApCisJCSpwMisrID0gKnN0cisrOworCSpwMiA9IE5VTDsKKyAgICB9CisgICAgcmV0dXJuIChwKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHJlY29yZCBidWZmZXIgYXMgYSBzaW5nbGUgc3RyaW5nCisgKiBhbmQgY2xlYXIgdGhlIHJlY29yZCBidWZmZXIuCisgKiBLX1NQRUNJQUwgYW5kIENTSSBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nIGFyZSBlc2NhcGVkLgorICovCisgICAgY2hhcl91ICoKK2dldF9yZWNvcmRlZCgpCit7CisgICAgY2hhcl91CSpwOworICAgIHNpemVfdAlsZW47CisKKyAgICBwID0gZ2V0X2J1ZmZjb250KCZyZWNvcmRidWZmLCBUUlVFKTsKKyAgICBmcmVlX2J1ZmYoJnJlY29yZGJ1ZmYpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmUgdGhlIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGFkZGVkIHRoZSBsYXN0IHRpbWUsIHRoZXNlIG11c3QgYmUgdGhlCisgICAgICogKHBvc3NpYmx5IG1hcHBlZCkgY2hhcmFjdGVycyB0aGF0IHN0b3BwZWQgdGhlIHJlY29yZGluZy4KKyAgICAgKi8KKyAgICBsZW4gPSBTVFJMRU4ocCk7CisgICAgaWYgKChpbnQpbGVuID49IGxhc3RfcmVjb3JkZWRfbGVuKQorICAgIHsKKwlsZW4gLT0gbGFzdF9yZWNvcmRlZF9sZW47CisJcFtsZW5dID0gTlVMOworICAgIH0KKworICAgIC8qCisgICAgICogV2hlbiBzdG9wcGluZyByZWNvcmRpbmcgZnJvbSBJbnNlcnQgbW9kZSB3aXRoIENUUkwtTyBxLCBhbHNvIHJlbW92ZSB0aGUKKyAgICAgKiBDVFJMLU8uCisgICAgICovCisgICAgaWYgKGxlbiA+IDAgJiYgcmVzdGFydF9lZGl0ICE9IDAgJiYgcFtsZW4gLSAxXSA9PSBDdHJsX08pCisJcFtsZW4gLSAxXSA9IE5VTDsKKworICAgIHJldHVybiAocCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSByZWRvIGJ1ZmZlciBhcyBhIHNpbmdsZSBzdHJpbmcuCisgKiBLX1NQRUNJQUwgYW5kIENTSSBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nIGFyZSBlc2NhcGVkLgorICovCisgICAgY2hhcl91ICoKK2dldF9pbnNlcnRlZCgpCit7CisgICAgcmV0dXJuKGdldF9idWZmY29udCgmcmVkb2J1ZmYsIEZBTFNFKSk7Cit9CisKKy8qCisgKiBhZGQgc3RyaW5nICJzIiBhZnRlciB0aGUgY3VycmVudCBibG9jayBvZiBidWZmZXIgImJ1ZiIKKyAqIEtfU1BFQ0lBTCBhbmQgQ1NJIHNob3VsZCBoYXZlIGJlZW4gZXNjYXBlZCBhbHJlYWR5LgorICovCisgICAgc3RhdGljIHZvaWQKK2FkZF9idWZmKGJ1Ziwgcywgc2xlbikKKyAgICBzdHJ1Y3QgYnVmZmhlYWRlcgkqYnVmOworICAgIGNoYXJfdQkJKnM7CisgICAgbG9uZwkJc2xlbjsJLyogbGVuZ3RoIG9mICJzIiBvciAtMSAqLworeworICAgIHN0cnVjdCBidWZmYmxvY2sgKnA7CisgICAgbG9uZ191CSAgICBsZW47CisKKyAgICBpZiAoc2xlbiA8IDApCisJc2xlbiA9IChsb25nKVNUUkxFTihzKTsKKyAgICBpZiAoc2xlbiA9PSAwKQkJCQkvKiBkb24ndCBhZGQgZW1wdHkgc3RyaW5ncyAqLworCXJldHVybjsKKworICAgIGlmIChidWYtPmJoX2ZpcnN0LmJfbmV4dCA9PSBOVUxMKQkvKiBmaXJzdCBhZGQgdG8gbGlzdCAqLworICAgIHsKKwlidWYtPmJoX3NwYWNlID0gMDsKKwlidWYtPmJoX2N1cnIgPSAmKGJ1Zi0+YmhfZmlyc3QpOworICAgIH0KKyAgICBlbHNlIGlmIChidWYtPmJoX2N1cnIgPT0gTlVMTCkJLyogYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCAqLworICAgIHsKKwlFTVNHKF8oIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGJ1Zi0+YmhfaW5kZXggIT0gMCkKKwlTVFJDUFkoYnVmLT5iaF9maXJzdC5iX25leHQtPmJfc3RyLAorCQkJCSBidWYtPmJoX2ZpcnN0LmJfbmV4dC0+Yl9zdHIgKyBidWYtPmJoX2luZGV4KTsKKyAgICBidWYtPmJoX2luZGV4ID0gMDsKKworICAgIGlmIChidWYtPmJoX3NwYWNlID49IChpbnQpc2xlbikKKyAgICB7CisJbGVuID0gKGxvbmdfdSlTVFJMRU4oYnVmLT5iaF9jdXJyLT5iX3N0cik7CisJU1RSTkNQWShidWYtPmJoX2N1cnItPmJfc3RyICsgbGVuLCBzLCBzbGVuKTsKKwlidWYtPmJoX2N1cnItPmJfc3RyW2xlbiArIHNsZW5dID0gTlVMOworCWJ1Zi0+Ymhfc3BhY2UgLT0gc2xlbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoc2xlbiA8IE1JTklNQUxfU0laRSkKKwkgICAgbGVuID0gTUlOSU1BTF9TSVpFOworCWVsc2UKKwkgICAgbGVuID0gc2xlbjsKKwlwID0gKHN0cnVjdCBidWZmYmxvY2sgKilsYWxsb2MoKGxvbmdfdSkoc2l6ZW9mKHN0cnVjdCBidWZmYmxvY2spICsgbGVuKSwKKwkJCQkJCQkJCVRSVUUpOworCWlmIChwID09IE5VTEwpCisJICAgIHJldHVybjsgLyogbm8gc3BhY2UsIGp1c3QgZm9yZ2V0IGl0ICovCisJYnVmLT5iaF9zcGFjZSA9IGxlbiAtIHNsZW47CisJU1RSTkNQWShwLT5iX3N0ciwgcywgc2xlbik7CisJcC0+Yl9zdHJbc2xlbl0gPSBOVUw7CisKKwlwLT5iX25leHQgPSBidWYtPmJoX2N1cnItPmJfbmV4dDsKKwlidWYtPmJoX2N1cnItPmJfbmV4dCA9IHA7CisJYnVmLT5iaF9jdXJyID0gcDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKgorICogQWRkIG51bWJlciAibiIgdG8gYnVmZmVyICJidWYiLgorICovCisgICAgc3RhdGljIHZvaWQKK2FkZF9udW1fYnVmZihidWYsIG4pCisgICAgc3RydWN0IGJ1ZmZoZWFkZXIgKmJ1ZjsKKyAgICBsb25nCSAgICAgIG47Cit7CisgICAgY2hhcl91CW51bWJlclszMl07CisKKyAgICBzcHJpbnRmKChjaGFyICopbnVtYmVyLCAiJWxkIiwgbik7CisgICAgYWRkX2J1ZmYoYnVmLCBudW1iZXIsIC0xTCk7Cit9CisKKy8qCisgKiBBZGQgY2hhcmFjdGVyICdjJyB0byBidWZmZXIgImJ1ZiIuCisgKiBUcmFuc2xhdGVzIHNwZWNpYWwga2V5cywgTlVMLCBDU0ksIEtfU1BFQ0lBTCBhbmQgbXVsdGlieXRlIGNoYXJhY3RlcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYWRkX2NoYXJfYnVmZihidWYsIGMpCisgICAgc3RydWN0IGJ1ZmZoZWFkZXIJKmJ1ZjsKKyAgICBpbnQJCQljOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJYnl0ZXNbTUJfTUFYQllURVMgKyAxXTsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWk7CisjZW5kaWYKKyAgICBjaGFyX3UJdGVtcFs0XTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoSVNfU1BFQ0lBTChjKSkKKwlsZW4gPSAxOworICAgIGVsc2UKKwlsZW4gPSAoKm1iX2NoYXIyYnl0ZXMpKGMsIGJ5dGVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworCWlmICghSVNfU1BFQ0lBTChjKSkKKwkgICAgYyA9IGJ5dGVzW2ldOworI2VuZGlmCisKKwlpZiAoSVNfU1BFQ0lBTChjKSB8fCBjID09IEtfU1BFQ0lBTCB8fCBjID09IE5VTCkKKwl7CisJICAgIC8qIHRyYW5zbGF0ZSBzcGVjaWFsIGtleSBjb2RlIGludG8gdGhyZWUgYnl0ZSBzZXF1ZW5jZSAqLworCSAgICB0ZW1wWzBdID0gS19TUEVDSUFMOworCSAgICB0ZW1wWzFdID0gS19TRUNPTkQoYyk7CisJICAgIHRlbXBbMl0gPSBLX1RISVJEKGMpOworCSAgICB0ZW1wWzNdID0gTlVMOworCX0KKyNpZmRlZiBGRUFUX0dVSQorCWVsc2UgaWYgKGMgPT0gQ1NJKQorCXsKKwkgICAgLyogVHJhbnNsYXRlIGEgQ1NJIHRvIGEgQ1NJIC0gS1NfRVhUUkEgLSBLRV9DU0kgc2VxdWVuY2UgKi8KKwkgICAgdGVtcFswXSA9IENTSTsKKwkgICAgdGVtcFsxXSA9IEtTX0VYVFJBOworCSAgICB0ZW1wWzJdID0gKGludClLRV9DU0k7CisJICAgIHRlbXBbM10gPSBOVUw7CisJfQorI2VuZGlmCisJZWxzZQorCXsKKwkgICAgdGVtcFswXSA9IGM7CisJICAgIHRlbXBbMV0gPSBOVUw7CisJfQorCWFkZF9idWZmKGJ1ZiwgdGVtcCwgLTFMKTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBHZXQgb25lIGJ5dGUgZnJvbSB0aGUgc3R1ZmYgYnVmZmVyLgorICogSWYgYWR2YW5jZSA9PSBUUlVFIGdvIHRvIHRoZSBuZXh0IGNoYXIuCisgKiBObyB0cmFuc2xhdGlvbiBpcyBkb25lIEtfU1BFQ0lBTCBhbmQgQ1NJIGFyZSBlc2NhcGVkLgorICovCisgICAgc3RhdGljIGludAorcmVhZF9zdHVmZihhZHZhbmNlKQorICAgIGludAkJYWR2YW5jZTsKK3sKKyAgICBjaGFyX3UJCWM7CisgICAgc3RydWN0IGJ1ZmZibG9jawkqY3VycjsKKworICAgIGlmIChzdHVmZmJ1ZmYuYmhfZmlyc3QuYl9uZXh0ID09IE5VTEwpICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KKwlyZXR1cm4gTlVMOworCisgICAgY3VyciA9IHN0dWZmYnVmZi5iaF9maXJzdC5iX25leHQ7CisgICAgYyA9IGN1cnItPmJfc3RyW3N0dWZmYnVmZi5iaF9pbmRleF07CisKKyAgICBpZiAoYWR2YW5jZSkKKyAgICB7CisJaWYgKGN1cnItPmJfc3RyWysrc3R1ZmZidWZmLmJoX2luZGV4XSA9PSBOVUwpCisJeworCSAgICBzdHVmZmJ1ZmYuYmhfZmlyc3QuYl9uZXh0ID0gY3Vyci0+Yl9uZXh0OworCSAgICB2aW1fZnJlZShjdXJyKTsKKwkgICAgc3R1ZmZidWZmLmJoX2luZGV4ID0gMDsKKwl9CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorICogUHJlcGFyZSB0aGUgc3R1ZmYgYnVmZmVyIGZvciByZWFkaW5nIChpZiBpdCBjb250YWlucyBzb21ldGhpbmcpLgorICovCisgICAgc3RhdGljIHZvaWQKK3N0YXJ0X3N0dWZmKCkKK3sKKyAgICBpZiAoc3R1ZmZidWZmLmJoX2ZpcnN0LmJfbmV4dCAhPSBOVUxMKQorICAgIHsKKwlzdHVmZmJ1ZmYuYmhfY3VyciA9ICYoc3R1ZmZidWZmLmJoX2ZpcnN0KTsKKwlzdHVmZmJ1ZmYuYmhfc3BhY2UgPSAwOworICAgIH0KK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBzdHVmZiBidWZmZXIgaXMgZW1wdHkuCisgKi8KKyAgICBpbnQKK3N0dWZmX2VtcHR5KCkKK3sKKyAgICByZXR1cm4gKHN0dWZmYnVmZi5iaF9maXJzdC5iX25leHQgPT0gTlVMTCk7Cit9CisKKy8qCisgKiBTZXQgYSB0eXBlYWhlYWQgY2hhcmFjdGVyIHRoYXQgd29uJ3QgYmUgZmx1c2hlZC4KKyAqLworICAgIHZvaWQKK3R5cGVhaGVhZF9ub2ZsdXNoKGMpCisgICAgaW50CQljOworeworICAgIHR5cGVhaGVhZF9jaGFyID0gYzsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgY29udGVudHMgb2YgdGhlIHN0dWZmIGJ1ZmZlciBhbmQgdGhlIG1hcHBlZCBjaGFyYWN0ZXJzIGluIHRoZQorICogdHlwZWFoZWFkIGJ1ZmZlciAodXNlZCBpbiBjYXNlIG9mIGFuIGVycm9yKS4gIElmICd0eXBlYWhlYWQnIGlzIHRydWUsCisgKiBmbHVzaCBhbGwgdHlwZWFoZWFkIGNoYXJhY3RlcnMgKHVzZWQgd2hlbiBpbnRlcnJ1cHRlZCBieSBhIENUUkwtQykuCisgKi8KKyAgICB2b2lkCitmbHVzaF9idWZmZXJzKHR5cGVhaGVhZCkKKyAgICBpbnQgdHlwZWFoZWFkOworeworICAgIGluaXRfdHlwZWJ1ZigpOworCisgICAgc3RhcnRfc3R1ZmYoKTsKKyAgICB3aGlsZSAocmVhZF9zdHVmZihUUlVFKSAhPSBOVUwpCisJOworCisgICAgaWYgKHR5cGVhaGVhZCkJICAgIC8qIHJlbW92ZSBhbGwgdHlwZWFoZWFkICovCisgICAgeworCS8qCisJICogV2UgaGF2ZSB0byBnZXQgYWxsIGNoYXJhY3RlcnMsIGJlY2F1c2Ugd2UgbWF5IGRlbGV0ZSB0aGUgZmlyc3QgcGFydAorCSAqIG9mIGFuIGVzY2FwZSBzZXF1ZW5jZS4KKwkgKiBJbiBhbiB4dGVybSB3ZSBnZXQgb25lIGNoYXIgYXQgYSB0aW1lIGFuZCB3ZSBoYXZlIHRvIGdldCB0aGVtIGFsbC4KKwkgKi8KKwl3aGlsZSAoaW5jaGFyKHR5cGVidWYudGJfYnVmLCB0eXBlYnVmLnRiX2J1ZmxlbiAtIDEsIDEwTCwKKwkJCQkJCSAgdHlwZWJ1Zi50Yl9jaGFuZ2VfY250KSAhPSAwKQorCSAgICA7CisJdHlwZWJ1Zi50Yl9vZmYgPSBNQVhNQVBMRU47CisJdHlwZWJ1Zi50Yl9sZW4gPSAwOworICAgIH0KKyAgICBlbHNlCQkgICAgLyogcmVtb3ZlIG1hcHBlZCBjaGFyYWN0ZXJzIG9ubHkgKi8KKyAgICB7CisJdHlwZWJ1Zi50Yl9vZmYgKz0gdHlwZWJ1Zi50Yl9tYXBsZW47CisJdHlwZWJ1Zi50Yl9sZW4gLT0gdHlwZWJ1Zi50Yl9tYXBsZW47CisgICAgfQorICAgIHR5cGVidWYudGJfbWFwbGVuID0gMDsKKyAgICB0eXBlYnVmLnRiX3NpbGVudCA9IDA7CisgICAgY21kX3NpbGVudCA9IEZBTFNFOworICAgIHR5cGVidWYudGJfbm9fYWJicl9jbnQgPSAwOworfQorCisvKgorICogVGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIHRoZSByZWRvIGJ1ZmZlciBpcyBrZXB0IGluIG9sZF9yZWRvYnVmZmVyLgorICogVGhpcyBpcyB1c2VkIGZvciB0aGUgQ1RSTC1PIDwuPiBjb21tYW5kIGluIGluc2VydCBtb2RlLgorICovCisgICAgdm9pZAorUmVzZXRSZWRvYnVmZigpCit7CisgICAgaWYgKCFibG9ja19yZWRvKQorICAgIHsKKwlmcmVlX2J1ZmYoJm9sZF9yZWRvYnVmZik7CisJb2xkX3JlZG9idWZmID0gcmVkb2J1ZmY7CisJcmVkb2J1ZmYuYmhfZmlyc3QuYl9uZXh0ID0gTlVMTDsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQVVUT0NNRCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2F2ZSByZWRvYnVmZiBhbmQgb2xkX3JlZG9idWZmIHRvIHNhdmVfcmVkb2J1ZmYgYW5kIHNhdmVfb2xkX3JlZG9idWZmLgorICogVXNlZCBiZWZvcmUgZXhlY3V0aW5nIGF1dG9jb21tYW5kcyBhbmQgdXNlciBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgc2F2ZV9sZXZlbCA9IDA7CisKKyAgICB2b2lkCitzYXZlUmVkb2J1ZmYoKQoreworICAgIGNoYXJfdQkqczsKKworICAgIGlmIChzYXZlX2xldmVsKysgPT0gMCkKKyAgICB7CisJc2F2ZV9yZWRvYnVmZiA9IHJlZG9idWZmOworCXJlZG9idWZmLmJoX2ZpcnN0LmJfbmV4dCA9IE5VTEw7CisJc2F2ZV9vbGRfcmVkb2J1ZmYgPSBvbGRfcmVkb2J1ZmY7CisJb2xkX3JlZG9idWZmLmJoX2ZpcnN0LmJfbmV4dCA9IE5VTEw7CisKKwkvKiBNYWtlIGEgY29weSwgc28gdGhhdCAiOm5vcm1hbCAuIiBpbiBhIGZ1bmN0aW9uIHdvcmtzLiAqLworCXMgPSBnZXRfYnVmZmNvbnQoJnNhdmVfcmVkb2J1ZmYsIEZBTFNFKTsKKwlpZiAocyAhPSBOVUxMKQorCXsKKwkgICAgYWRkX2J1ZmYoJnJlZG9idWZmLCBzLCAtMUwpOworCSAgICB2aW1fZnJlZShzKTsKKwl9CisgICAgfQorfQorCisvKgorICogUmVzdG9yZSByZWRvYnVmZiBhbmQgb2xkX3JlZG9idWZmIGZyb20gc2F2ZV9yZWRvYnVmZiBhbmQgc2F2ZV9vbGRfcmVkb2J1ZmYuCisgKiBVc2VkIGFmdGVyIGV4ZWN1dGluZyBhdXRvY29tbWFuZHMgYW5kIHVzZXIgZnVuY3Rpb25zLgorICovCisgICAgdm9pZAorcmVzdG9yZVJlZG9idWZmKCkKK3sKKyAgICBpZiAoLS1zYXZlX2xldmVsID09IDApCisgICAgeworCWZyZWVfYnVmZigmcmVkb2J1ZmYpOworCXJlZG9idWZmID0gc2F2ZV9yZWRvYnVmZjsKKwlmcmVlX2J1ZmYoJm9sZF9yZWRvYnVmZik7CisJb2xkX3JlZG9idWZmID0gc2F2ZV9vbGRfcmVkb2J1ZmY7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBBcHBlbmQgInMiIHRvIHRoZSByZWRvIGJ1ZmZlci4KKyAqIEtfU1BFQ0lBTCBhbmQgQ1NJIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBlc2NhcGVkLgorICovCisgICAgdm9pZAorQXBwZW5kVG9SZWRvYnVmZihzKQorICAgIGNoYXJfdQkgICAqczsKK3sKKyAgICBpZiAoIWJsb2NrX3JlZG8pCisJYWRkX2J1ZmYoJnJlZG9idWZmLCBzLCAtMUwpOworfQorCisvKgorICogQXBwZW5kIHRvIFJlZG8gYnVmZmVyIGxpdGVyYWxseSwgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGggQ1RSTC1WLgorICogS19TUEVDSUFMIGFuZCBDU0kgYXJlIGVzY2FwZWQgYXMgd2VsbC4KKyAqLworICAgIHZvaWQKK0FwcGVuZFRvUmVkb2J1ZmZMaXQocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgaW50CQljOworICAgIGNoYXJfdQkqc3RhcnQ7CisKKyAgICBpZiAoYmxvY2tfcmVkbykKKwlyZXR1cm47CisKKyAgICB3aGlsZSAoKnMgIT0gTlVMKQorICAgIHsKKwkvKiBQdXQgYSBzdHJpbmcgb2Ygbm9ybWFsIGNoYXJhY3RlcnMgaW4gdGhlIHJlZG8gYnVmZmVyICh0aGF0J3MKKwkgKiBmYXN0ZXIpLiAqLworCXN0YXJ0ID0gczsKKwl3aGlsZSAoKnMgPj0gJyAnCisjaWZuZGVmIEVCQ0RJQworCQkmJiAqcyA8IERFTAkvKiBFQkNESUM6IGFsbCBjaGFycyBhYm92ZSBzcGFjZSBhcmUgbm9ybWFsICovCisjZW5kaWYKKwkJKQorCSAgICArK3M7CisKKwkvKiBEb24ndCBwdXQgJzAnIG9yICdeJyBhcyBsYXN0IGNoYXJhY3RlciwganVzdCBpbiBjYXNlIGEgQ1RSTC1EIGlzCisJICogdHlwZWQgbmV4dC4gKi8KKwlpZiAoKnMgPT0gTlVMICYmIChzWy0xXSA9PSAnMCcgfHwgc1stMV0gPT0gJ14nKSkKKwkgICAgLS1zOworCWlmIChzID4gc3RhcnQpCisJICAgIGFkZF9idWZmKCZyZWRvYnVmZiwgc3RhcnQsIChsb25nKShzIC0gc3RhcnQpKTsKKworCWlmICgqcyAhPSBOVUwpCisJeworCSAgICAvKiBIYW5kbGUgYSBzcGVjaWFsIG9yIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICovCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCWMgPSAoKm1iX3B0cjJjaGFyKShzKTsKKwkJaWYgKGVuY191dGY4KQorCQkgICAgLyogSGFuZGxlIGNvbXBvc2luZyBjaGFycyBhcyB3ZWxsLiAqLworCQkgICAgcyArPSB1dGZfcHRyMmxlbl9jaGVjayhzKTsKKwkJZWxzZQorCQkgICAgcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQljID0gKnMrKzsKKwkgICAgaWYgKGMgPCAnICcgfHwgYyA9PSBERUwgfHwgKCpzID09IE5VTCAmJiAoYyA9PSAnMCcgfHwgYyA9PSAnXicpKSkKKwkJYWRkX2NoYXJfYnVmZigmcmVkb2J1ZmYsIEN0cmxfVik7CisKKwkgICAgLyogQ1RSTC1WICcwJyBtdXN0IGJlIGluc2VydGVkIGFzIENUUkwtViAwNDggKEVCQ0RJQzogeGYwKSAqLworCSAgICBpZiAoKnMgPT0gTlVMICYmIGMgPT0gJzAnKQorI2lmZGVmIEVCQ0RJQworCQlhZGRfYnVmZigmcmVkb2J1ZmYsIChjaGFyX3UgKikieGYwIiwgM0wpOworI2Vsc2UKKwkJYWRkX2J1ZmYoJnJlZG9idWZmLCAoY2hhcl91ICopIjA0OCIsIDNMKTsKKyNlbmRpZgorCSAgICBlbHNlCisJCWFkZF9jaGFyX2J1ZmYoJnJlZG9idWZmLCBjKTsKKwl9CisgICAgfQorfQorCisvKgorICogQXBwZW5kIGEgY2hhcmFjdGVyIHRvIHRoZSByZWRvIGJ1ZmZlci4KKyAqIFRyYW5zbGF0ZXMgc3BlY2lhbCBrZXlzLCBOVUwsIENTSSwgS19TUEVDSUFMIGFuZCBtdWx0aWJ5dGUgY2hhcmFjdGVycy4KKyAqLworICAgIHZvaWQKK0FwcGVuZENoYXJUb1JlZG9idWZmKGMpCisgICAgaW50CQkgICBjOworeworICAgIGlmICghYmxvY2tfcmVkbykKKwlhZGRfY2hhcl9idWZmKCZyZWRvYnVmZiwgYyk7Cit9CisKKy8qCisgKiBBcHBlbmQgYSBudW1iZXIgdG8gdGhlIHJlZG8gYnVmZmVyLgorICovCisgICAgdm9pZAorQXBwZW5kTnVtYmVyVG9SZWRvYnVmZihuKQorICAgIGxvbmcJICAgIG47Cit7CisgICAgaWYgKCFibG9ja19yZWRvKQorCWFkZF9udW1fYnVmZigmcmVkb2J1ZmYsIG4pOworfQorCisvKgorICogQXBwZW5kIHN0cmluZyAicyIgdG8gdGhlIHN0dWZmIGJ1ZmZlci4KKyAqIENTSSBhbmQgS19TUEVDSUFMIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gZXNjYXBlZC4KKyAqLworICAgIHZvaWQKK3N0dWZmUmVhZGJ1ZmYocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgYWRkX2J1ZmYoJnN0dWZmYnVmZiwgcywgLTFMKTsKK30KKworICAgIHZvaWQKK3N0dWZmUmVhZGJ1ZmZMZW4ocywgbGVuKQorICAgIGNoYXJfdQkqczsKKyAgICBsb25nCWxlbjsKK3sKKyAgICBhZGRfYnVmZigmc3R1ZmZidWZmLCBzLCBsZW4pOworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU3R1ZmYgInMiIGludG8gdGhlIHN0dWZmIGJ1ZmZlciwgbGVhdmluZyBzcGVjaWFsIGtleSBjb2RlcyB1bm1vZGlmaWVkIGFuZAorICogZXNjYXBpbmcgb3RoZXIgS19TUEVDSUFMIGFuZCBDU0kgYnl0ZXMuCisgKi8KKyAgICB2b2lkCitzdHVmZlJlYWRidWZmU3BlYyhzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICB3aGlsZSAoKnMgIT0gTlVMKQorICAgIHsKKwlpZiAoKnMgPT0gS19TUEVDSUFMICYmIHNbMV0gIT0gTlVMICYmIHNbMl0gIT0gTlVMKQorCXsKKwkgICAgLyogSW5zZXJ0IHNwZWNpYWwga2V5IGxpdGVyYWxseS4gKi8KKwkgICAgc3R1ZmZSZWFkYnVmZkxlbihzLCAzTCk7CisJICAgIHMgKz0gMzsKKwl9CisJZWxzZQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYobWJfcHRyMmNoYXJfYWR2KCZzKSk7CisjZWxzZQorCSAgICBzdHVmZmNoYXJSZWFkYnVmZigqcysrKTsKKyNlbmRpZgorICAgIH0KK30KKyNlbmRpZgorCisvKgorICogQXBwZW5kIGEgY2hhcmFjdGVyIHRvIHRoZSBzdHVmZiBidWZmZXIuCisgKiBUcmFuc2xhdGVzIHNwZWNpYWwga2V5cywgTlVMLCBDU0ksIEtfU1BFQ0lBTCBhbmQgbXVsdGlieXRlIGNoYXJhY3RlcnMuCisgKi8KKyAgICB2b2lkCitzdHVmZmNoYXJSZWFkYnVmZihjKQorICAgIGludAkJICAgYzsKK3sKKyAgICBhZGRfY2hhcl9idWZmKCZzdHVmZmJ1ZmYsIGMpOworfQorCisvKgorICogQXBwZW5kIGEgbnVtYmVyIHRvIHRoZSBzdHVmZiBidWZmZXIuCisgKi8KKyAgICB2b2lkCitzdHVmZm51bVJlYWRidWZmKG4pCisgICAgbG9uZyAgICBuOworeworICAgIGFkZF9udW1fYnVmZigmc3R1ZmZidWZmLCBuKTsKK30KKworLyoKKyAqIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVkbyBidWZmZXIuICBUcmFuc2xhdGVzIEtfU1BFQ0lBTCwgQ1NJIGFuZAorICogbXVsdGlieXRlIGNoYXJhY3RlcnMuCisgKiBUaGUgcmVkbyBidWZmZXIgaXMgbGVmdCBhcyBpdCBpcy4KKyAqIGlmIGluaXQgaXMgVFJVRSwgcHJlcGFyZSBmb3IgcmVkbywgcmV0dXJuIEZBSUwgaWYgbm90aGluZyB0byByZWRvLCBPSworICogb3RoZXJ3aXNlCisgKiBpZiBvbGQgaXMgVFJVRSwgdXNlIG9sZF9yZWRvYnVmZiBpbnN0ZWFkIG9mIHJlZG9idWZmCisgKi8KKyAgICBzdGF0aWMgaW50CityZWFkX3JlZG8oaW5pdCwgb2xkX3JlZG8pCisgICAgaW50CQlpbml0OworICAgIGludAkJb2xkX3JlZG87Cit7CisgICAgc3RhdGljIHN0cnVjdCBidWZmYmxvY2sJKmJwOworICAgIHN0YXRpYyBjaGFyX3UJCSpwOworICAgIGludAkJCQljOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCQkJbjsKKyAgICBjaGFyX3UJCQlidWZbTUJfTUFYQllURVNdOworICAgIGludAkJCQlpOworI2VuZGlmCisKKyAgICBpZiAoaW5pdCkKKyAgICB7CisJaWYgKG9sZF9yZWRvKQorCSAgICBicCA9IG9sZF9yZWRvYnVmZi5iaF9maXJzdC5iX25leHQ7CisJZWxzZQorCSAgICBicCA9IHJlZG9idWZmLmJoX2ZpcnN0LmJfbmV4dDsKKwlpZiAoYnAgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJcCA9IGJwLT5iX3N0cjsKKwlyZXR1cm4gT0s7CisgICAgfQorICAgIGlmICgoYyA9ICpwKSAhPSBOVUwpCisgICAgeworCS8qIFJldmVyc2UgdGhlIGNvbnZlcnNpb24gZG9uZSBieSBhZGRfY2hhcl9idWZmKCkgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJLyogRm9yIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgZ2V0IGFsbCB0aGUgYnl0ZXMgYW5kIHJldHVybiB0aGUKKwkgKiBjb252ZXJ0ZWQgY2hhcmFjdGVyLiAqLworCWlmIChoYXNfbWJ5dGUgJiYgKGMgIT0gS19TUEVDSUFMIHx8IHBbMV0gPT0gS1NfU1BFQ0lBTCkpCisJICAgIG4gPSBNQl9CWVRFMkxFTl9DSEVDSyhjKTsKKwllbHNlCisJICAgIG4gPSAxOworCWZvciAoaSA9IDA7IDsgKytpKQorI2VuZGlmCisJeworCSAgICBpZiAoYyA9PSBLX1NQRUNJQUwpIC8qIHNwZWNpYWwga2V5IG9yIGVzY2FwZWQgS19TUEVDSUFMICovCisJICAgIHsKKwkJYyA9IFRPX1NQRUNJQUwocFsxXSwgcFsyXSk7CisJCXAgKz0gMjsKKwkgICAgfQorI2lmZGVmIEZFQVRfR1VJCisJICAgIGlmIChjID09IENTSSkJLyogZXNjYXBlZCBDU0kgKi8KKwkJcCArPSAyOworI2VuZGlmCisJICAgIGlmICgqKytwID09IE5VTCAmJiBicC0+Yl9uZXh0ICE9IE5VTEwpCisJICAgIHsKKwkJYnAgPSBicC0+Yl9uZXh0OworCQlwID0gYnAtPmJfc3RyOworCSAgICB9CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBidWZbaV0gPSBjOworCSAgICBpZiAoaSA9PSBuIC0gMSkJLyogbGFzdCBieXRlIG9mIGEgY2hhcmFjdGVyICovCisJICAgIHsKKwkJaWYgKG4gIT0gMSkKKwkJICAgIGMgPSAoKm1iX3B0cjJjaGFyKShidWYpOworCQlicmVhazsKKwkgICAgfQorCSAgICBjID0gKnA7CisJICAgIGlmIChjID09IE5VTCkJLyogY2Fubm90IGhhcHBlbj8gKi8KKwkJYnJlYWs7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGM7Cit9CisKKy8qCisgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSByZWRvIGJ1ZmZlciBpbnRvIHRoZSBzdHVmZiBidWZmZXIgKGluIGEgc2xvdyB3YXkpLgorICogSWYgb2xkX3JlZG8gaXMgVFJVRSwgdXNlIG9sZF9yZWRvYnVmZiBpbnN0ZWFkIG9mIHJlZG9idWZmLgorICogVGhlIGVzY2FwZWQgS19TUEVDSUFMIGFuZCBDU0kgYXJlIGNvcGllZCB3aXRob3V0IHRyYW5zbGF0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvcHlfcmVkbyhvbGRfcmVkbykKKyAgICBpbnQJICAgIG9sZF9yZWRvOworeworICAgIGludAkgICAgYzsKKworICAgIHdoaWxlICgoYyA9IHJlYWRfcmVkbyhGQUxTRSwgb2xkX3JlZG8pKSAhPSBOVUwpCisJc3R1ZmZjaGFyUmVhZGJ1ZmYoYyk7Cit9CisKKy8qCisgKiBTdHVmZiB0aGUgcmVkbyBidWZmZXIgaW50byB0aGUgc3R1ZmZidWZmLgorICogSW5zZXJ0IHRoZSByZWRvIGNvdW50IGludG8gdGhlIGNvbW1hbmQuCisgKiBJZiAib2xkX3JlZG8iIGlzIFRSVUUsIHRoZSBsYXN0IGJ1dCBvbmUgY29tbWFuZCBpcyByZXBlYXRlZAorICogaW5zdGVhZCBvZiB0aGUgbGFzdCBjb21tYW5kIChpbnNlcnRpbmcgdGV4dCkuIFRoaXMgaXMgdXNlZCBmb3IKKyAqIENUUkwtTyA8Lj4gaW4gaW5zZXJ0IG1vZGUKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK3N0YXJ0X3JlZG8oY291bnQsIG9sZF9yZWRvKQorICAgIGxvbmcgICAgY291bnQ7CisgICAgaW50CSAgICBvbGRfcmVkbzsKK3sKKyAgICBpbnQJICAgIGM7CisKKyAgICAvKiBpbml0IHRoZSBwb2ludGVyczsgcmV0dXJuIGlmIG5vdGhpbmcgdG8gcmVkbyAqLworICAgIGlmIChyZWFkX3JlZG8oVFJVRSwgb2xkX3JlZG8pID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICBjID0gcmVhZF9yZWRvKEZBTFNFLCBvbGRfcmVkbyk7CisKKyAgICAvKiBjb3B5IHRoZSBidWZmZXIgbmFtZSwgaWYgcHJlc2VudCAqLworICAgIGlmIChjID09ICciJykKKyAgICB7CisJYWRkX2J1ZmYoJnN0dWZmYnVmZiwgKGNoYXJfdSAqKSJcIiIsIDFMKTsKKwljID0gcmVhZF9yZWRvKEZBTFNFLCBvbGRfcmVkbyk7CisKKwkvKiBpZiBhIG51bWJlcmVkIGJ1ZmZlciBpcyB1c2VkLCBpbmNyZW1lbnQgdGhlIG51bWJlciAqLworCWlmIChjID49ICcxJyAmJiBjIDwgJzknKQorCSAgICArK2M7CisJYWRkX2NoYXJfYnVmZigmc3R1ZmZidWZmLCBjKTsKKwljID0gcmVhZF9yZWRvKEZBTFNFLCBvbGRfcmVkbyk7CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoYyA9PSAndicpICAgLyogcmVkbyBWaXN1YWwgKi8KKyAgICB7CisJVklzdWFsID0gY3Vyd2luLT53X2N1cnNvcjsKKwlWSXN1YWxfYWN0aXZlID0gVFJVRTsKKwlWSXN1YWxfc2VsZWN0ID0gRkFMU0U7CisJVklzdWFsX3Jlc2VsZWN0ID0gVFJVRTsKKwlyZWRvX1ZJc3VhbF9idXN5ID0gVFJVRTsKKwljID0gcmVhZF9yZWRvKEZBTFNFLCBvbGRfcmVkbyk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiB0cnkgdG8gZW50ZXIgdGhlIGNvdW50IChpbiBwbGFjZSBvZiBhIHByZXZpb3VzIGNvdW50KSAqLworICAgIGlmIChjb3VudCkKKyAgICB7CisJd2hpbGUgKFZJTV9JU0RJR0lUKGMpKQkvKiBza2lwICJvbGQiIGNvdW50ICovCisJICAgIGMgPSByZWFkX3JlZG8oRkFMU0UsIG9sZF9yZWRvKTsKKwlhZGRfbnVtX2J1ZmYoJnN0dWZmYnVmZiwgY291bnQpOworICAgIH0KKworICAgIC8qIGNvcHkgZnJvbSB0aGUgcmVkbyBidWZmZXIgaW50byB0aGUgc3R1ZmYgYnVmZmVyICovCisgICAgYWRkX2NoYXJfYnVmZigmc3R1ZmZidWZmLCBjKTsKKyAgICBjb3B5X3JlZG8ob2xkX3JlZG8pOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJlcGVhdCB0aGUgbGFzdCBpbnNlcnQgKFIsIG8sIE8sIGEsIEEsIGkgb3IgSSBjb21tYW5kKSBieSBzdHVmZmluZworICogdGhlIHJlZG8gYnVmZmVyIGludG8gdGhlIHN0dWZmYnVmZi4KKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorc3RhcnRfcmVkb19pbnMoKQoreworICAgIGludAkgICAgYzsKKworICAgIGlmIChyZWFkX3JlZG8oVFJVRSwgRkFMU0UpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisgICAgc3RhcnRfc3R1ZmYoKTsKKworICAgIC8qIHNraXAgdGhlIGNvdW50IGFuZCB0aGUgY29tbWFuZCBjaGFyYWN0ZXIgKi8KKyAgICB3aGlsZSAoKGMgPSByZWFkX3JlZG8oRkFMU0UsIEZBTFNFKSkgIT0gTlVMKQorICAgIHsKKwlpZiAodmltX3N0cmNocigoY2hhcl91ICopIkFhSWlSck9vIiwgYykgIT0gTlVMTCkKKwl7CisJICAgIGlmIChjID09ICdPJyB8fCBjID09ICdvJykKKwkJc3R1ZmZSZWFkYnVmZihOTF9TVFIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyogY29weSB0aGUgdHlwZWQgdGV4dCBmcm9tIHRoZSByZWRvIGJ1ZmZlciBpbnRvIHRoZSBzdHVmZiBidWZmZXIgKi8KKyAgICBjb3B5X3JlZG8oRkFMU0UpOworICAgIGJsb2NrX3JlZG8gPSBUUlVFOworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK3N0b3BfcmVkb19pbnMoKQoreworICAgIGJsb2NrX3JlZG8gPSBGQUxTRTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdHlwZWJ1Zi50Yl9idWYgdG8gcG9pbnQgdG8gdHlwZWJ1Zl9pbml0LgorICogYWxsb2MoKSBjYW5ub3QgYmUgdXNlZCBoZXJlOiBJbiBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaXQgd291bGQKKyAqIGJlIGltcG9zc2libGUgdG8gdHlwZSBhbnl0aGluZy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X3R5cGVidWYoKQoreworICAgIGlmICh0eXBlYnVmLnRiX2J1ZiA9PSBOVUxMKQorICAgIHsKKwl0eXBlYnVmLnRiX2J1ZiA9IHR5cGVidWZfaW5pdDsKKwl0eXBlYnVmLnRiX25vcmVtYXAgPSBub3JlbWFwYnVmX2luaXQ7CisJdHlwZWJ1Zi50Yl9idWZsZW4gPSBUWVBFTEVOX0lOSVQ7CisJdHlwZWJ1Zi50Yl9sZW4gPSAwOworCXR5cGVidWYudGJfb2ZmID0gMDsKKwl0eXBlYnVmLnRiX2NoYW5nZV9jbnQgPSAxOworICAgIH0KK30KKworLyoKKyAqIGluc2VydCBhIHN0cmluZyBpbiBwb3NpdGlvbiAnb2Zmc2V0JyBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlciAoZm9yICJAciIKKyAqIGFuZCAiOm5vcm1hbCIgY29tbWFuZCwgdmdldG9ycGVlaygpIGFuZCBjaGVja190ZXJtY29kZSgpKQorICoKKyAqIElmIG5vcmVtYXAgaXMgUkVNQVBfWUVTLCBuZXcgc3RyaW5nIGNhbiBiZSBtYXBwZWQgYWdhaW4uCisgKiBJZiBub3JlbWFwIGlzIFJFTUFQX05PTkUsIG5ldyBzdHJpbmcgY2Fubm90IGJlIG1hcHBlZCBhZ2Fpbi4KKyAqIElmIG5vcmVtYXAgaXMgUkVNQVBfU0NSSVBULCBuZXcgc3RyaW5nIGNhbm5vdCBiZSBtYXBwZWQgYWdhaW4sIGV4Y2VwdCBmb3IKKyAqCQkJc2NyaXB0LWxvY2FsIG1hcHBpbmdzLgorICogSWYgbm9yZW1hcCBpcyA+IDAsIHRoYXQgbWFueSBjaGFyYWN0ZXJzIG9mIHRoZSBuZXcgc3RyaW5nIGNhbm5vdCBiZSBtYXBwZWQuCisgKgorICogSWYgbm90dHlwZWQgaXMgVFJVRSwgdGhlIHN0cmluZyBkb2VzIG5vdCByZXR1cm4gS2V5VHlwZWQgKGRvbid0IHVzZSB3aGVuCisgKiBvZmZzZXQgaXMgbm9uLXplcm8hKS4KKyAqCisgKiBJZiBzaWxlbnQgaXMgVFJVRSwgY21kX3NpbGVudCBpcyBzZXQgd2hlbiB0aGUgY2hhcmFjdGVycyBhcmUgb2J0YWluZWQuCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CitpbnNfdHlwZWJ1ZihzdHIsIG5vcmVtYXAsIG9mZnNldCwgbm90dHlwZWQsIHNpbGVudCkKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCW5vcmVtYXA7CisgICAgaW50CQlvZmZzZXQ7CisgICAgaW50CQlub3R0eXBlZDsKKyAgICBpbnQJCXNpbGVudDsKK3sKKyAgICBjaGFyX3UJKnMxLCAqczI7CisgICAgaW50CQluZXdsZW47CisgICAgaW50CQlhZGRsZW47CisgICAgaW50CQlpOworICAgIGludAkJbmV3b2ZmOworICAgIGludAkJdmFsOworICAgIGludAkJbnJtOworCisgICAgaW5pdF90eXBlYnVmKCk7CisgICAgaWYgKCsrdHlwZWJ1Zi50Yl9jaGFuZ2VfY250ID09IDApCisJdHlwZWJ1Zi50Yl9jaGFuZ2VfY250ID0gMTsKKworICAgIGFkZGxlbiA9IChpbnQpU1RSTEVOKHN0cik7CisgICAgLyoKKyAgICAgKiBFYXN5IGNhc2U6IHRoZXJlIGlzIHJvb20gaW4gZnJvbnQgb2YgdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmZdCisgICAgICovCisgICAgaWYgKG9mZnNldCA9PSAwICYmIGFkZGxlbiA8PSB0eXBlYnVmLnRiX29mZikKKyAgICB7CisJdHlwZWJ1Zi50Yl9vZmYgLT0gYWRkbGVuOworCW1jaF9tZW1tb3ZlKHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYsIHN0ciwgKHNpemVfdClhZGRsZW4pOworICAgIH0KKyAgICAvKgorICAgICAqIE5lZWQgdG8gYWxsb2NhdGUgbmV3IGJ1ZmZlci4KKyAgICAgKiBJbiB0eXBlYnVmLnRiX2J1ZiB0aGVyZSBtdXN0IGFsd2F5cyBiZSByb29tIGZvciAzICogTUFYTUFQTEVOICsgNAorICAgICAqIGNoYXJhY3RlcnMuICBXZSBhZGQgc29tZSBleHRyYSByb29tIHRvIGF2b2lkIGhhdmluZyB0byBhbGxvY2F0ZSB0b28KKyAgICAgKiBvZnRlbi4KKyAgICAgKi8KKyAgICBlbHNlCisgICAgeworCW5ld29mZiA9IE1BWE1BUExFTiArIDQ7CisJbmV3bGVuID0gdHlwZWJ1Zi50Yl9sZW4gKyBhZGRsZW4gKyBuZXdvZmYgKyA0ICogKE1BWE1BUExFTiArIDQpOworCWlmIChuZXdsZW4gPCAwKQkJICAgIC8qIHN0cmluZyBpcyBnZXR0aW5nIHRvbyBsb25nICovCisJeworCSAgICBFTVNHKF8oZV90b29jb21wbCkpOyAgICAvKiBhbHNvIGNhbGxzIGZsdXNoX2J1ZmZlcnMgKi8KKwkgICAgc2V0Y3Vyc29yKCk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlzMSA9IGFsbG9jKG5ld2xlbik7CisJaWYgKHMxID09IE5VTEwpCQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCSAgICByZXR1cm4gRkFJTDsKKwlzMiA9IGFsbG9jKG5ld2xlbik7CisJaWYgKHMyID09IE5VTEwpCQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCXsKKwkgICAgdmltX2ZyZWUoczEpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisJdHlwZWJ1Zi50Yl9idWZsZW4gPSBuZXdsZW47CisKKwkvKiBjb3B5IHRoZSBvbGQgY2hhcnMsIGJlZm9yZSB0aGUgaW5zZXJ0aW9uIHBvaW50ICovCisJbWNoX21lbW1vdmUoczEgKyBuZXdvZmYsIHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYsCisJCQkJCQkJICAgICAgKHNpemVfdClvZmZzZXQpOworCS8qIGNvcHkgdGhlIG5ldyBjaGFycyAqLworCW1jaF9tZW1tb3ZlKHMxICsgbmV3b2ZmICsgb2Zmc2V0LCBzdHIsIChzaXplX3QpYWRkbGVuKTsKKwkvKiBjb3B5IHRoZSBvbGQgY2hhcnMsIGFmdGVyIHRoZSBpbnNlcnRpb24gcG9pbnQsIGluY2x1ZGluZyB0aGUJTlVMIGF0CisJICogdGhlIGVuZCAqLworCW1jaF9tZW1tb3ZlKHMxICsgbmV3b2ZmICsgb2Zmc2V0ICsgYWRkbGVuLAorCQkJCSAgICAgdHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldCwKKwkJCQkgICAgICAgKHNpemVfdCkodHlwZWJ1Zi50Yl9sZW4gLSBvZmZzZXQgKyAxKSk7CisJaWYgKHR5cGVidWYudGJfYnVmICE9IHR5cGVidWZfaW5pdCkKKwkgICAgdmltX2ZyZWUodHlwZWJ1Zi50Yl9idWYpOworCXR5cGVidWYudGJfYnVmID0gczE7CisKKwltY2hfbWVtbW92ZShzMiArIG5ld29mZiwgdHlwZWJ1Zi50Yl9ub3JlbWFwICsgdHlwZWJ1Zi50Yl9vZmYsCisJCQkJCQkJICAgICAgKHNpemVfdClvZmZzZXQpOworCW1jaF9tZW1tb3ZlKHMyICsgbmV3b2ZmICsgb2Zmc2V0ICsgYWRkbGVuLAorCQkgICB0eXBlYnVmLnRiX25vcmVtYXAgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldCwKKwkJCQkJICAgKHNpemVfdCkodHlwZWJ1Zi50Yl9sZW4gLSBvZmZzZXQpKTsKKwlpZiAodHlwZWJ1Zi50Yl9ub3JlbWFwICE9IG5vcmVtYXBidWZfaW5pdCkKKwkgICAgdmltX2ZyZWUodHlwZWJ1Zi50Yl9ub3JlbWFwKTsKKwl0eXBlYnVmLnRiX25vcmVtYXAgPSBzMjsKKworCXR5cGVidWYudGJfb2ZmID0gbmV3b2ZmOworICAgIH0KKyAgICB0eXBlYnVmLnRiX2xlbiArPSBhZGRsZW47CisKKyAgICAvKiBJZiBub3JlbWFwID09IFJFTUFQX1NDUklQVDogZG8gcmVtYXAgc2NyaXB0LWxvY2FsIG1hcHBpbmdzLiAqLworICAgIGlmIChub3JlbWFwID09IFJFTUFQX1NDUklQVCkKKwl2YWwgPSBSTV9TQ1JJUFQ7CisgICAgZWxzZQorCXZhbCA9IFJNX05PTkU7CisKKyAgICAvKgorICAgICAqIEFkanVzdCB0eXBlYnVmLnRiX25vcmVtYXBbXSBmb3IgdGhlIG5ldyBjaGFyYWN0ZXJzOgorICAgICAqIElmIG5vcmVtYXAgPT0gUkVNQVBfTk9ORSBvciBSRU1BUF9TQ1JJUFQ6IG5ldyBjaGFyYWN0ZXJzIGFyZQorICAgICAqCQkJKHNvbWV0aW1lcykgbm90IHJlbWFwcGFibGUKKyAgICAgKiBJZiBub3JlbWFwID09IFJFTUFQX1lFUzogYWxsIHRoZSBuZXcgY2hhcmFjdGVycyBhcmUgbWFwcGFibGUKKyAgICAgKiBJZiBub3JlbWFwICA+IDA6ICJub3JlbWFwIiBjaGFyYWN0ZXJzIGFyZSBub3QgcmVtYXBwYWJsZSwgdGhlIHJlc3QKKyAgICAgKgkJCW1hcHBhYmxlCisgICAgICovCisgICAgaWYgKG5vcmVtYXAgPCAwKQorCW5ybSA9IGFkZGxlbjsKKyAgICBlbHNlCisJbnJtID0gbm9yZW1hcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWRkbGVuOyArK2kpCisJdHlwZWJ1Zi50Yl9ub3JlbWFwW3R5cGVidWYudGJfb2ZmICsgaSArIG9mZnNldF0gPQorCQkJCQkJICAoLS1ucm0gPj0gMCkgPyB2YWwgOiBSTV9ZRVM7CisKKyAgICAvKiB0Yl9tYXBsZW4gYW5kIHRiX3NpbGVudCBvbmx5IHJlbWVtYmVyIHRoZSBsZW5ndGggb2YgbWFwcGVkIGFuZC9vcgorICAgICAqIHNpbGVudCBtYXBwaW5ncyBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciwgYXNzdW1pbmcgdGhhdCBhIG1hcHBlZAorICAgICAqIHNlcXVlbmNlIGRvZXNuJ3QgcmVzdWx0IGluIHR5cGVkIGNoYXJhY3RlcnMuICovCisgICAgaWYgKG5vdHR5cGVkIHx8IHR5cGVidWYudGJfbWFwbGVuID4gb2Zmc2V0KQorCXR5cGVidWYudGJfbWFwbGVuICs9IGFkZGxlbjsKKyAgICBpZiAoc2lsZW50IHx8IHR5cGVidWYudGJfc2lsZW50ID4gb2Zmc2V0KQorICAgIHsKKwl0eXBlYnVmLnRiX3NpbGVudCArPSBhZGRsZW47CisJY21kX3NpbGVudCA9IFRSVUU7CisgICAgfQorICAgIGlmICh0eXBlYnVmLnRiX25vX2FiYnJfY250ICYmIG9mZnNldCA9PSAwKQkvKiBhbmQgbm90IHVzZWQgZm9yIGFiYnJldi5zICovCisJdHlwZWJ1Zi50Yl9ub19hYmJyX2NudCArPSBhZGRsZW47CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgdHlwZWFoZWFkIGJ1ZmZlciB3YXMgY2hhbmdlZCAod2hpbGUgd2FpdGluZyBmb3IgYQorICogY2hhcmFjdGVyIHRvIGFycml2ZSkuICBIYXBwZW5zIHdoZW4gYSBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tIGEgY2xpZW50LgorICogQnV0IGNoZWNrIGluIGEgbW9yZSBnZW5lcmljIHdheSB0byBhdm9pZCB0cm91YmxlOiBXaGVuICJ0eXBlYnVmLnRiX2J1ZiIKKyAqIGNoYW5nZWQgaXQgd2FzIHJlYWxsb2NhdGVkIGFuZCB0aGUgb2xkIHBvaW50ZXIgY2FuIG5vIGxvbmdlciBiZSB1c2VkLgorICogT3IgInR5cGVidWYudGJfb2ZmIiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgYW5kIHdlIHdvdWxkIG92ZXJ3cml0ZSBjaGFyYWN0ZXJzCisgKiB0aGF0IHdhcyBqdXN0IGFkZGVkLgorICovCisgICAgaW50Cit0eXBlYnVmX2NoYW5nZWQodGJfY2hhbmdlX2NudCkKKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQ7CS8qIG9sZCB2YWx1ZSBvZiB0eXBlYnVmLnRiX2NoYW5nZV9jbnQgKi8KK3sKKyAgICByZXR1cm4gKHRiX2NoYW5nZV9jbnQgIT0gMCAmJiAodHlwZWJ1Zi50Yl9jaGFuZ2VfY250ICE9IHRiX2NoYW5nZV9jbnQKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorCSAgICB8fCByZWNlaXZlZF9mcm9tX2NsaWVudAorI2VuZGlmCisJICAgKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlciB0aGF0IGhhdmUKKyAqIG5vdCBiZWVuIHR5cGVkIChyZXN1bHQgZnJvbSBhIG1hcHBpbmcgb3IgY29tZSBmcm9tICI6bm9ybWFsIikuCisgKi8KKyAgICBpbnQKK3R5cGVidWZfdHlwZWQoKQoreworICAgIHJldHVybiB0eXBlYnVmLnRiX21hcGxlbiA9PSAwOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBtYXBwZWQgKG9yIG5vdCB0eXBlZCkuCisgKi8KKyAgICBpbnQKK3R5cGVidWZfbWFwbGVuKCkKK3sKKyAgICByZXR1cm4gdHlwZWJ1Zi50Yl9tYXBsZW47Cit9CisKKy8qCisgKiByZW1vdmUgImxlbiIgY2hhcmFjdGVycyBmcm9tIHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmICsgb2Zmc2V0XQorICovCisgICAgdm9pZAorZGVsX3R5cGVidWYobGVuLCBvZmZzZXQpCisgICAgaW50CWxlbjsKKyAgICBpbnQJb2Zmc2V0OworeworICAgIGludAkgICAgaTsKKworICAgIGlmIChsZW4gPT0gMCkKKwlyZXR1cm47CQkvKiBub3RoaW5nIHRvIGRvICovCisKKyAgICB0eXBlYnVmLnRiX2xlbiAtPSBsZW47CisKKyAgICAvKgorICAgICAqIEVhc3kgY2FzZTogSnVzdCBpbmNyZWFzZSB0eXBlYnVmLnRiX29mZi4KKyAgICAgKi8KKyAgICBpZiAob2Zmc2V0ID09IDAgJiYgdHlwZWJ1Zi50Yl9idWZsZW4gLSAodHlwZWJ1Zi50Yl9vZmYgKyBsZW4pCisJCQkJCQkJID49IDMgKiBNQVhNQVBMRU4gKyAzKQorCXR5cGVidWYudGJfb2ZmICs9IGxlbjsKKyAgICAvKgorICAgICAqIEhhdmUgdG8gbW92ZSB0aGUgY2hhcmFjdGVycyBpbiB0eXBlYnVmLnRiX2J1ZltdIGFuZCB0eXBlYnVmLnRiX25vcmVtYXBbXQorICAgICAqLworICAgIGVsc2UKKyAgICB7CisJaSA9IHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0OworCS8qCisJICogTGVhdmUgc29tZSBleHRyYSByb29tIGF0IHRoZSBlbmQgdG8gYXZvaWQgcmVhbGxvY2F0aW9uLgorCSAqLworCWlmICh0eXBlYnVmLnRiX29mZiA+IE1BWE1BUExFTikKKwl7CisJICAgIG1jaF9tZW1tb3ZlKHR5cGVidWYudGJfYnVmICsgTUFYTUFQTEVOLAorCQkJICAgICB0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmLCAoc2l6ZV90KW9mZnNldCk7CisJICAgIG1jaF9tZW1tb3ZlKHR5cGVidWYudGJfbm9yZW1hcCArIE1BWE1BUExFTiwKKwkJCSB0eXBlYnVmLnRiX25vcmVtYXAgKyB0eXBlYnVmLnRiX29mZiwgKHNpemVfdClvZmZzZXQpOworCSAgICB0eXBlYnVmLnRiX29mZiA9IE1BWE1BUExFTjsKKwl9CisJLyogYWRqdXN0IHR5cGVidWYudGJfYnVmIChpbmNsdWRlIHRoZSBOVUwgYXQgdGhlIGVuZCkgKi8KKwltY2hfbWVtbW92ZSh0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0LAorCQkJCQkJICAgICB0eXBlYnVmLnRiX2J1ZiArIGkgKyBsZW4sCisJCQkJICAgICAgIChzaXplX3QpKHR5cGVidWYudGJfbGVuIC0gb2Zmc2V0ICsgMSkpOworCS8qIGFkanVzdCB0eXBlYnVmLnRiX25vcmVtYXBbXSAqLworCW1jaF9tZW1tb3ZlKHR5cGVidWYudGJfbm9yZW1hcCArIHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0LAorCQkJCQkJIHR5cGVidWYudGJfbm9yZW1hcCArIGkgKyBsZW4sCisJCQkJCSAgIChzaXplX3QpKHR5cGVidWYudGJfbGVuIC0gb2Zmc2V0KSk7CisgICAgfQorCisgICAgaWYgKHR5cGVidWYudGJfbWFwbGVuID4gb2Zmc2V0KQkJLyogYWRqdXN0IHRiX21hcGxlbiAqLworICAgIHsKKwlpZiAodHlwZWJ1Zi50Yl9tYXBsZW4gPCBvZmZzZXQgKyBsZW4pCisJICAgIHR5cGVidWYudGJfbWFwbGVuID0gb2Zmc2V0OworCWVsc2UKKwkgICAgdHlwZWJ1Zi50Yl9tYXBsZW4gLT0gbGVuOworICAgIH0KKyAgICBpZiAodHlwZWJ1Zi50Yl9zaWxlbnQgPiBvZmZzZXQpCQkvKiBhZGp1c3QgdGJfc2lsZW50ICovCisgICAgeworCWlmICh0eXBlYnVmLnRiX3NpbGVudCA8IG9mZnNldCArIGxlbikKKwkgICAgdHlwZWJ1Zi50Yl9zaWxlbnQgPSBvZmZzZXQ7CisJZWxzZQorCSAgICB0eXBlYnVmLnRiX3NpbGVudCAtPSBsZW47CisgICAgfQorICAgIGlmICh0eXBlYnVmLnRiX25vX2FiYnJfY250ID4gb2Zmc2V0KQkvKiBhZGp1c3QgdGJfbm9fYWJicl9jbnQgKi8KKyAgICB7CisJaWYgKHR5cGVidWYudGJfbm9fYWJicl9jbnQgPCBvZmZzZXQgKyBsZW4pCisJICAgIHR5cGVidWYudGJfbm9fYWJicl9jbnQgPSBvZmZzZXQ7CisJZWxzZQorCSAgICB0eXBlYnVmLnRiX25vX2FiYnJfY250IC09IGxlbjsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorICAgIC8qIFJlc2V0IHRoZSBmbGFnIHRoYXQgdGV4dCByZWNlaXZlZCBmcm9tIGEgY2xpZW50IHdhcyBpbnNlcnRlZCBpbiB0aGUKKyAgICAgKiB0eXBlYWhlYWQgYnVmZmVyLiAqLworICAgIHJlY2VpdmVkX2Zyb21fY2xpZW50ID0gRkFMU0U7CisjZW5kaWYKKyAgICBpZiAoKyt0eXBlYnVmLnRiX2NoYW5nZV9jbnQgPT0gMCkKKwl0eXBlYnVmLnRiX2NoYW5nZV9jbnQgPSAxOworfQorCisvKgorICogV3JpdGUgdHlwZWQgY2hhcmFjdGVycyB0byBzY3JpcHQgZmlsZS4KKyAqIElmIHJlY29yZGluZyBpcyBvbiBwdXQgdGhlIGNoYXJhY3RlciBpbiB0aGUgcmVjb3JkYnVmZmVyLgorICovCisgICAgc3RhdGljIHZvaWQKK2dvdGNoYXJzKHMsIGxlbikKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsZW47Cit7CisgICAgaW50CQljOworICAgIGNoYXJfdQlidWZbMl07CisKKyAgICAvKiByZW1lbWJlciBob3cgbWFueSBjaGFycyB3ZXJlIGxhc3QgcmVjb3JkZWQgKi8KKyAgICBpZiAoUmVjb3JkaW5nKQorCWxhc3RfcmVjb3JkZWRfbGVuICs9IGxlbjsKKworICAgIGJ1ZlsxXSA9IE5VTDsKKyAgICB3aGlsZSAobGVuLS0pCisgICAgeworCS8qIEhhbmRsZSBvbmUgYnl0ZSBhdCBhIHRpbWU7IG5vIHRyYW5zbGF0aW9uIHRvIGJlIGRvbmUuICovCisJYyA9ICpzKys7CisJdXBkYXRlc2NyaXB0KGMpOworCisJaWYgKFJlY29yZGluZykKKwl7CisJICAgIGJ1ZlswXSA9IGM7CisJICAgIGFkZF9idWZmKCZyZWNvcmRidWZmLCBidWYsIDFMKTsKKwl9CisgICAgfQorICAgIG1heV9zeW5jX3VuZG8oKTsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIC8qIG91dHB1dCAiZGVidWcgbW9kZSIgbWVzc2FnZSBuZXh0IHRpbWUgaW4gZGVidWcgbW9kZSAqLworICAgIGRlYnVnX2RpZF9tc2cgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyogU2luY2UgY2hhcmFjdGVycyBoYXZlIGJlZW4gdHlwZWQsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdG8gYmUgaW4KKyAgICAgKiBhbm90aGVyIG1hcHBpbmcuICBTZWFyY2ggc3RyaW5nIHdpbGwgYmUga2VwdCBpbiBoaXN0b3J5LiAqLworICAgICsrbWFwdGljazsKK30KKworLyoKKyAqIFN5bmMgdW5kby4gIENhbGxlZCB3aGVuIHR5cGVkIGNoYXJhY3RlcnMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHR5cGVhaGVhZAorICogYnVmZmVyLCBvciB3aGVuIGEgbWVudSBpcyB1c2VkLgorICogRG8gbm90IHN5bmM6CisgKiAtIEluIEluc2VydCBtb2RlLCB1bmxlc3MgY3Vyc29yIGtleSBoYXMgYmVlbiB1c2VkLgorICogLSBXaGlsZSByZWFkaW5nIGEgc2NyaXB0IGZpbGUuCisgKiAtIFdoZW4gbm9fdV9zeW5jIGlzIG5vbi16ZXJvLgorICovCisgICAgc3RhdGljIHZvaWQKK21heV9zeW5jX3VuZG8oKQoreworICAgIGlmICgoIShTdGF0ZSAmIChJTlNFUlQgKyBDTURMSU5FKSkgfHwgYXJyb3dfdXNlZCkKKwkgICAgJiYgc2NyaXB0aW5bY3Vyc2NyaXB0XSA9PSBOVUxMICYmIG5vX3Vfc3luYyA9PSAwKQorCXVfc3luYygpOworfQorCisvKgorICogTWFrZSAidHlwZWJ1ZiIgZW1wdHkgYW5kIGFsbG9jYXRlIG5ldyBidWZmZXJzLgorICogUmV0dXJucyBGQUlMIHdoZW4gb3V0IG9mIG1lbW9yeS4KKyAqLworICAgIGludAorYWxsb2NfdHlwZWJ1ZigpCit7CisgICAgdHlwZWJ1Zi50Yl9idWYgPSBhbGxvYyhUWVBFTEVOX0lOSVQpOworICAgIHR5cGVidWYudGJfbm9yZW1hcCA9IGFsbG9jKFRZUEVMRU5fSU5JVCk7CisgICAgaWYgKHR5cGVidWYudGJfYnVmID09IE5VTEwgfHwgdHlwZWJ1Zi50Yl9ub3JlbWFwID09IE5VTEwpCisgICAgeworCWZyZWVfdHlwZWJ1ZigpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICB0eXBlYnVmLnRiX2J1ZmxlbiA9IFRZUEVMRU5fSU5JVDsKKyAgICB0eXBlYnVmLnRiX29mZiA9IDA7CisgICAgdHlwZWJ1Zi50Yl9sZW4gPSAwOworICAgIHR5cGVidWYudGJfbWFwbGVuID0gMDsKKyAgICB0eXBlYnVmLnRiX3NpbGVudCA9IDA7CisgICAgdHlwZWJ1Zi50Yl9ub19hYmJyX2NudCA9IDA7CisgICAgaWYgKCsrdHlwZWJ1Zi50Yl9jaGFuZ2VfY250ID09IDApCisJdHlwZWJ1Zi50Yl9jaGFuZ2VfY250ID0gMTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBidWZmZXJzIG9mICJ0eXBlYnVmIi4KKyAqLworICAgIHZvaWQKK2ZyZWVfdHlwZWJ1ZigpCit7CisgICAgdmltX2ZyZWUodHlwZWJ1Zi50Yl9idWYpOworICAgIHZpbV9mcmVlKHR5cGVidWYudGJfbm9yZW1hcCk7Cit9CisKKy8qCisgKiBXaGVuIGRvaW5nICI6c28hIGZpbGUiLCB0aGUgY3VycmVudCB0eXBlYWhlYWQgbmVlZHMgdG8gYmUgc2F2ZWQsIGFuZAorICogcmVzdG9yZWQgd2hlbiAiZmlsZSIgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LgorICovCitzdGF0aWMgdHlwZWJ1Zl9UIHNhdmVkX3R5cGVidWZbTlNDUklQVF07CisKKyAgICBpbnQKK3NhdmVfdHlwZWJ1ZigpCit7CisgICAgaW5pdF90eXBlYnVmKCk7CisgICAgc2F2ZWRfdHlwZWJ1ZltjdXJzY3JpcHRdID0gdHlwZWJ1ZjsKKyAgICAvKiBJZiBvdXQgb2YgbWVtb3J5OiByZXN0b3JlIHR5cGVidWYgYW5kIGNsb3NlIGZpbGUuICovCisgICAgaWYgKGFsbG9jX3R5cGVidWYoKSA9PSBGQUlMKQorICAgIHsKKwljbG9zZXNjcmlwdCgpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX0VYX0VYVFJBKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogU2F2ZSBhbGwgdGhyZWUga2luZHMgb2YgdHlwZWFoZWFkLCBzbyB0aGF0IHRoZSB1c2VyIG11c3QgdHlwZSBhdCBhIHByb21wdC4KKyAqLworICAgIHZvaWQKK3NhdmVfdHlwZWFoZWFkKHRwKQorICAgIHRhc2F2ZV9UCSp0cDsKK3sKKyAgICB0cC0+c2F2ZV90eXBlYnVmID0gdHlwZWJ1ZjsKKyAgICB0cC0+dHlwZWJ1Zl92YWxpZCA9IChhbGxvY190eXBlYnVmKCkgPT0gT0spOworICAgIGlmICghdHAtPnR5cGVidWZfdmFsaWQpCisJdHlwZWJ1ZiA9IHRwLT5zYXZlX3R5cGVidWY7CisKKyAgICB0cC0+c2F2ZV9zdHVmZmJ1ZmYgPSBzdHVmZmJ1ZmY7CisgICAgc3R1ZmZidWZmLmJoX2ZpcnN0LmJfbmV4dCA9IE5VTEw7CisjIGlmZGVmIFVTRV9JTlBVVF9CVUYKKyAgICB0cC0+c2F2ZV9pbnB1dGJ1ZiA9IGdldF9pbnB1dF9idWYoKTsKKyMgZW5kaWYKK30KKworLyoKKyAqIFJlc3RvcmUgdGhlIHR5cGVhaGVhZCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgY2FsbGluZyBzYXZlX3R5cGVhaGVhZCgpLgorICogVGhlIGFsbG9jYXRlZCBtZW1vcnkgaXMgZnJlZWQsIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIQorICovCisgICAgdm9pZAorcmVzdG9yZV90eXBlYWhlYWQodHApCisgICAgdGFzYXZlX1QJKnRwOworeworICAgIGlmICh0cC0+dHlwZWJ1Zl92YWxpZCkKKyAgICB7CisJZnJlZV90eXBlYnVmKCk7CisJdHlwZWJ1ZiA9IHRwLT5zYXZlX3R5cGVidWY7CisgICAgfQorCisgICAgZnJlZV9idWZmKCZzdHVmZmJ1ZmYpOworICAgIHN0dWZmYnVmZiA9IHRwLT5zYXZlX3N0dWZmYnVmZjsKKyMgaWZkZWYgVVNFX0lOUFVUX0JVRgorICAgIHNldF9pbnB1dF9idWYodHAtPnNhdmVfaW5wdXRidWYpOworIyBlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBPcGVuIGEgbmV3IHNjcmlwdCBmaWxlIGZvciB0aGUgIjpzb3VyY2UhIiBjb21tYW5kLgorICovCisgICAgdm9pZAorb3BlbnNjcmlwdChuYW1lLCBkaXJlY3RseSkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlkaXJlY3RseTsJLyogd2hlbiBUUlVFIGV4ZWN1dGUgZGlyZWN0bHkgKi8KK3sKKyAgICBpZiAoY3Vyc2NyaXB0ICsgMSA9PSBOU0NSSVBUKQorICAgIHsKKwlFTVNHKF8oZV9uZXN0aW5nKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChzY3JpcHRpbltjdXJzY3JpcHRdICE9IE5VTEwpCS8qIGFscmVhZHkgcmVhZGluZyBzY3JpcHQgKi8KKwkrK2N1cnNjcmlwdDsKKwkJCQkvKiB1c2UgTmFtZUJ1ZmYgZm9yIGV4cGFuZGVkIG5hbWUgKi8KKyAgICBleHBhbmRfZW52KG5hbWUsIE5hbWVCdWZmLCBNQVhQQVRITCk7CisgICAgaWYgKChzY3JpcHRpbltjdXJzY3JpcHRdID0gbWNoX2ZvcGVuKChjaGFyICopTmFtZUJ1ZmYsIFJFQURCSU4pKSA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKGVfbm90b3BlbiksIG5hbWUpOworCWlmIChjdXJzY3JpcHQpCisJICAgIC0tY3Vyc2NyaXB0OworCXJldHVybjsKKyAgICB9CisgICAgaWYgKHNhdmVfdHlwZWJ1ZigpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBmaWxlIHJpZ2h0IG5vdyB3aGVuIHVzaW5nICI6c291cmNlISIKKyAgICAgKiBhZnRlciAiOmdsb2JhbCIgb3IgIjphcmdkbyIgb3IgaW4gYSBsb29wLiAgQWxzbyB3aGVuIGFub3RoZXIgY29tbWFuZAorICAgICAqIGZvbGxvd3MuICBUaGlzIG1lYW5zIHRoZSBkaXNwbGF5IHdvbid0IGJlIHVwZGF0ZWQuICBEb24ndCBkbyB0aGlzCisgICAgICogYWx3YXlzLCAibWFrZSB0ZXN0IiB3b3VsZCBmYWlsLgorICAgICAqLworICAgIGlmIChkaXJlY3RseSkKKyAgICB7CisJb3BhcmdfVAlvYTsKKwlpbnQJb2xkY3Vyc2NyaXB0OworCWludAlzYXZlX1N0YXRlID0gU3RhdGU7CisJaW50CXNhdmVfcmVzdGFydF9lZGl0ID0gcmVzdGFydF9lZGl0OworCWludAlzYXZlX2luc2VydG1vZGUgPSBwX2ltOworCWludAlzYXZlX2ZpbmlzaF9vcCA9IGZpbmlzaF9vcDsKKwlpbnQJc2F2ZV9tc2dfc2Nyb2xsID0gbXNnX3Njcm9sbDsKKworCVN0YXRlID0gTk9STUFMOworCW1zZ19zY3JvbGwgPSBGQUxTRTsJLyogbm8gbXNnIHNjcm9sbGluZyBpbiBOb3JtYWwgbW9kZSAqLworCXJlc3RhcnRfZWRpdCA9IDA7CS8qIGRvbid0IGdvIHRvIEluc2VydCBtb2RlICovCisJcF9pbSA9IEZBTFNFOwkJLyogZG9uJ3QgdXNlICdpbnNlcnRtb2RlJyAqLworCWNsZWFyX29wYXJnKCZvYSk7CisJZmluaXNoX29wID0gRkFMU0U7CisKKwlvbGRjdXJzY3JpcHQgPSBjdXJzY3JpcHQ7CisJZG8KKwl7CisJICAgIHVwZGF0ZV90b3BsaW5lX2N1cnNvcigpOwkvKiB1cGRhdGUgY3Vyc29yIHBvc2l0aW9uIGFuZCB0b3BsaW5lICovCisJICAgIG5vcm1hbF9jbWQoJm9hLCBGQUxTRSk7CS8qIGV4ZWN1dGUgb25lIGNvbW1hbmQgKi8KKwkgICAgdnBlZWtjKCk7CQkJLyogY2hlY2sgZm9yIGVuZCBvZiBmaWxlICovCisJfQorCXdoaWxlIChzY3JpcHRpbltvbGRjdXJzY3JpcHRdICE9IE5VTEwpOworCisJU3RhdGUgPSBzYXZlX1N0YXRlOworCW1zZ19zY3JvbGwgPSBzYXZlX21zZ19zY3JvbGw7CisJcmVzdGFydF9lZGl0ID0gc2F2ZV9yZXN0YXJ0X2VkaXQ7CisJcF9pbSA9IHNhdmVfaW5zZXJ0bW9kZTsKKwlmaW5pc2hfb3AgPSBzYXZlX2ZpbmlzaF9vcDsKKyAgICB9Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbnB1dCBzY3JpcHQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xvc2VzY3JpcHQoKQoreworICAgIGZyZWVfdHlwZWJ1ZigpOworICAgIHR5cGVidWYgPSBzYXZlZF90eXBlYnVmW2N1cnNjcmlwdF07CisKKyAgICBmY2xvc2Uoc2NyaXB0aW5bY3Vyc2NyaXB0XSk7CisgICAgc2NyaXB0aW5bY3Vyc2NyaXB0XSA9IE5VTEw7CisgICAgaWYgKGN1cnNjcmlwdCA+IDApCisJLS1jdXJzY3JpcHQ7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfSU5TX0VYUEFORCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gVFJVRSB3aGVuIHJlYWRpbmcga2V5cyBmcm9tIGEgc2NyaXB0IGZpbGUuCisgKi8KKyAgICBpbnQKK3VzaW5nX3NjcmlwdCgpCit7CisgICAgcmV0dXJuIHNjcmlwdGluW2N1cnNjcmlwdF0gIT0gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlc2NpcHQoKSBpcyBjYWxsZWQgd2hlbiBhIGNoYXJhY3RlciBjYW4gYmUgd3JpdHRlbiBpbnRvIHRoZSBzY3JpcHQgZmlsZQorICogb3Igd2hlbiB3ZSBoYXZlIHdhaXRlZCBzb21lIHRpbWUgZm9yIGEgY2hhcmFjdGVyIChjID09IDApCisgKgorICogQWxsIHRoZSBjaGFuZ2VkIG1lbWZpbGVzIGFyZSBzeW5jZWQgaWYgYyA9PSAwIG9yIHdoZW4gdGhlIG51bWJlciBvZiB0eXBlZAorICogY2hhcmFjdGVycyByZWFjaGVzICd1cGRhdGVjb3VudCcgYW5kICd1cGRhdGVjb3VudCcgaXMgbm9uLXplcm8uCisgKi8KKyAgICB2b2lkCit1cGRhdGVzY3JpcHQoYykKKyAgICBpbnQgYzsKK3sKKyAgICBzdGF0aWMgaW50CSAgICBjb3VudCA9IDA7CisKKyAgICBpZiAoYyAmJiBzY3JpcHRvdXQpCisJcHV0YyhjLCBzY3JpcHRvdXQpOworICAgIGlmIChjID09IDAgfHwgKHBfdWMgPiAwICYmICsrY291bnQgPj0gcF91YykpCisgICAgeworCW1sX3N5bmNfYWxsKGMgPT0gMCwgVFJVRSk7CisJY291bnQgPSAwOworICAgIH0KK30KKworI2RlZmluZSBLTF9QQVJUX0tFWSAtMQkJLyoga2V5bGVuIHZhbHVlIGZvciBpbmNvbXBsZXRlIGtleS1jb2RlICovCisjZGVmaW5lIEtMX1BBUlRfTUFQIC0yCQkvKiBrZXlsZW4gdmFsdWUgZm9yIGluY29tcGxldGUgbWFwcGluZyAqLworCitzdGF0aWMgaW50IG9sZF9jaGFyID0gLTE7CS8qIGNoYXJhY3RlciBwdXQgYmFjayBieSB2dW5nZXRjKCkgKi8KK3N0YXRpYyBpbnQgb2xkX21vZF9tYXNrOwkvKiBtb2RfbWFzayBmb3IgdW5nb3R0ZW4gY2hhcmFjdGVyICovCisKKy8qCisgKiBHZXQgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgorICogQ2FuIHJldHVybiBhIHNwZWNpYWwga2V5IG9yIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKiBDYW4gcmV0dXJuIE5VTCB3aGVuIGNhbGxlZCByZWN1cnNpdmVseSwgdXNlIHNhZmVfdmdldGMoKSBpZiB0aGF0J3Mgbm90CisgKiB3YW50ZWQuCisgKiBUaGlzIHRyYW5zbGF0ZXMgZXNjYXBlZCBLX1NQRUNJQUwgYW5kIENTSSBieXRlcyB0byBhIEtfU1BFQ0lBTCBvciBDU0kgYnl0ZS4KKyAqIENvbGxlY3RzIHRoZSBieXRlcyBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIgaW50byB0aGUgd2hvbGUgY2hhcmFjdGVyLgorICogUmV0dXJucyB0aGUgbW9kaWZlcnMgaW4gdGhlIGdsb2JhbCAibW9kX21hc2siLgorICovCisgICAgaW50Cit2Z2V0YygpCit7CisgICAgaW50CQljLCBjMjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQluOworICAgIGNoYXJfdQlidWZbTUJfTUFYQllURVNdOworICAgIGludAkJaTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiBhIGNoYXJhY3RlciB3YXMgcHV0IGJhY2sgd2l0aCB2dW5nZXRjLCBpdCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQuCisgICAgICogUmV0dXJuIGl0IGRpcmVjdGx5LgorICAgICAqLworICAgIGlmIChvbGRfY2hhciAhPSAtMSkKKyAgICB7CisJYyA9IG9sZF9jaGFyOworCW9sZF9jaGFyID0gLTE7CisJbW9kX21hc2sgPSBvbGRfbW9kX21hc2s7CisJcmV0dXJuIGM7CisgICAgfQorCisgICAgbW9kX21hc2sgPSAweDA7CisgICAgbGFzdF9yZWNvcmRlZF9sZW4gPSAwOworICAgIGZvciAoOzspCQkJLyogdGhpcyBpcyBkb25lIHR3aWNlIGlmIHRoZXJlIGFyZSBtb2RpZmllcnMgKi8KKyAgICB7CisJaWYgKG1vZF9tYXNrKQkJLyogbm8gbWFwcGluZyBhZnRlciBtb2RpZmllciBoYXMgYmVlbiByZWFkICovCisJeworCSAgICArK25vX21hcHBpbmc7CisJICAgICsrYWxsb3dfa2V5czsKKwl9CisJYyA9IHZnZXRvcnBlZWsoVFJVRSk7CisJaWYgKG1vZF9tYXNrKQorCXsKKwkgICAgLS1ub19tYXBwaW5nOworCSAgICAtLWFsbG93X2tleXM7CisJfQorCisJLyogR2V0IHR3byBleHRyYSBieXRlcyBmb3Igc3BlY2lhbCBrZXlzICovCisJaWYgKGMgPT0gS19TUEVDSUFMCisjaWZkZWYgRkVBVF9HVUkKKwkJfHwgYyA9PSBDU0kKKyNlbmRpZgorCSAgICkKKwl7CisJICAgICsrbm9fbWFwcGluZzsKKwkgICAgYzIgPSB2Z2V0b3JwZWVrKFRSVUUpOwkvKiBubyBtYXBwaW5nIGZvciB0aGVzZSBjaGFycyAqLworCSAgICBjID0gdmdldG9ycGVlayhUUlVFKTsKKwkgICAgLS1ub19tYXBwaW5nOworCSAgICBpZiAoYzIgPT0gS1NfTU9ESUZJRVIpCisJICAgIHsKKwkJbW9kX21hc2sgPSBjOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBjID0gVE9fU1BFQ0lBTChjMiwgYyk7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgZGVmaW5lZChGRUFUX01FTlUpICYmIGRlZmluZWQoRkVBVF9URUFST0ZGKQorCSAgICAvKiBIYW5kbGUgS19URUFST0ZGIGhlcmUsIHRoZSBjYWxsZXIgb2YgdmdldGMoKSBkb2Vzbid0IG5lZWQgdG8KKwkgICAgICoga25vdyB0aGF0IGEgbWVudSB3YXMgdG9ybiBvZmYgKi8KKwkgICAgaWYgKGMgPT0gS19URUFST0ZGKQorCSAgICB7CisJCWNoYXJfdQluYW1lWzIwMF07CisJCWludAlpOworCisJCS8qIGdldCBtZW51IHBhdGgsIGl0IGVuZHMgd2l0aCBhIDxDUj4gKi8KKwkJZm9yIChpID0gMDsgKGMgPSB2Z2V0b3JwZWVrKFRSVUUpKSAhPSAnXHInOyApCisJCXsKKwkJICAgIG5hbWVbaV0gPSBjOworCQkgICAgaWYgKGkgPCAxOTkpCisJCQkrK2k7CisJCX0KKwkJbmFtZVtpXSA9IE5VTDsKKwkJZ3VpX21ha2VfdGVhcm9mZihuYW1lKTsKKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisJICAgIC8qIFRyYW5zbGF0ZSBLX0NTSSB0byBDU0kuICBUaGUgc3BlY2lhbCBrZXkgaXMgb25seSB1c2VkIHRvIGF2b2lkCisJICAgICAqIGl0IGJlaW5nIHJlY29nbml6ZWQgYXMgdGhlIHN0YXJ0IG9mIGEgc3BlY2lhbCBrZXkuICovCisJICAgIGlmIChjID09IEtfQ1NJKQorCQljID0gQ1NJOworI2VuZGlmCisJfQorI2lmZGVmIE1TRE9TCisJLyoKKwkgKiBJZiBLX05VTCB3YXMgdHlwZWQsIGl0IGlzIHJlcGxhY2VkIGJ5IEtfTlVMLCAzIGluIG1jaF9pbmNoYXIoKS4KKwkgKiBEZWxldGUgdGhlIDMgaGVyZS4KKwkgKi8KKwllbHNlIGlmIChjID09IEtfTlVMICYmIHZwZWVrYygpID09IDMpCisJICAgICh2b2lkKXZnZXRvcnBlZWsoVFJVRSk7CisjZW5kaWYKKworCWlmIChjID49IEZJUlNUX0tFWVBBRCAmJiBjIDw9IExBU1RfS0VZUEFEKQorCXsKKwkgICAgLyogYSBrZXlwYWQga2V5IHdhcyBub3QgbWFwcGVkLCB1c2UgaXQgbGlrZSBpdHMgQVNDSUkgZXF1aXZhbGVudCAqLworCSAgICBzd2l0Y2ggKGMpCisJICAgIHsKKwkJY2FzZSBLX0tQTFVTOgkJYyA9ICcrJzsgYnJlYWs7CisJCWNhc2UgS19LTUlOVVM6CQljID0gJy0nOyBicmVhazsKKwkJY2FzZSBLX0tESVZJREU6CQljID0gJy8nOyBicmVhazsKKwkJY2FzZSBLX0tNVUxUSVBMWToJYyA9ICcqJzsgYnJlYWs7CisJCWNhc2UgS19LRU5URVI6CQljID0gQ0FSOyBicmVhazsKKwkJY2FzZSBLX0tQT0lOVDoJCWMgPSAnLic7IGJyZWFrOworCQljYXNlIEtfSzA6CQljID0gJzAnOyBicmVhazsKKwkJY2FzZSBLX0sxOgkJYyA9ICcxJzsgYnJlYWs7CisJCWNhc2UgS19LMjoJCWMgPSAnMic7IGJyZWFrOworCQljYXNlIEtfSzM6CQljID0gJzMnOyBicmVhazsKKwkJY2FzZSBLX0s0OgkJYyA9ICc0JzsgYnJlYWs7CisJCWNhc2UgS19LNToJCWMgPSAnNSc7IGJyZWFrOworCQljYXNlIEtfSzY6CQljID0gJzYnOyBicmVhazsKKwkJY2FzZSBLX0s3OgkJYyA9ICc3JzsgYnJlYWs7CisJCWNhc2UgS19LODoJCWMgPSAnOCc7IGJyZWFrOworCQljYXNlIEtfSzk6CQljID0gJzknOyBicmVhazsKKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfTUJZVEUKKwkvKiBGb3IgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBnZXQgYWxsIHRoZSBieXRlcyBhbmQgcmV0dXJuIHRoZQorCSAqIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisJICogTm90ZTogVGhpcyB3aWxsIGxvb3AgdW50aWwgZW5vdWdoIGJ5dGVzIGFyZSByZWNlaXZlZCEKKwkgKi8KKwlpZiAoaGFzX21ieXRlICYmIChuID0gTUJfQllURTJMRU5fQ0hFQ0soYykpID4gMSkKKwl7CisJICAgICsrbm9fbWFwcGluZzsKKwkgICAgYnVmWzBdID0gYzsKKwkgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkKKwkgICAgeworCQlidWZbaV0gPSB2Z2V0b3JwZWVrKFRSVUUpOworCQlpZiAoYnVmW2ldID09IEtfU1BFQ0lBTAorI2lmZGVmIEZFQVRfR1VJCisJCQl8fCBidWZbaV0gPT0gQ1NJCisjZW5kaWYKKwkJCSkKKwkJeworCQkgICAgLyogTXVzdCBiZSBhIEtfU1BFQ0lBTCAtIEtTX1NQRUNJQUwgLSBLRV9GSUxMRVIgc2VxdWVuY2UsCisJCSAgICAgKiB3aGljaCByZXByZXNlbnRzIGEgS19TUEVDSUFMICgweDgwKSwKKwkJICAgICAqIG9yIGEgQ1NJIC0gS1NfRVhUUkEgLSBLRV9DU0kgc2VxdWVuY2UsIHdoaWNoIHJlcHJlc2VudHMKKwkJICAgICAqIGEgQ1NJICgweDlCKSwKKwkJICAgICAqIG9mIGEgS19TUEVDSUFMIC0gS1NfRVhUUkEgLSBLRV9DU0ksIHdoaWNoIGlzIENTSSB0b28uICovCisJCSAgICBjID0gdmdldG9ycGVlayhUUlVFKTsKKwkJICAgIGlmICh2Z2V0b3JwZWVrKFRSVUUpID09IChpbnQpS0VfQ1NJICYmIGMgPT0gS1NfRVhUUkEpCisJCQlidWZbaV0gPSBDU0k7CisJCX0KKwkgICAgfQorCSAgICAtLW5vX21hcHBpbmc7CisJICAgIGMgPSAoKm1iX3B0cjJjaGFyKShidWYpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGM7CisgICAgfQorfQorCisvKgorICogTGlrZSB2Z2V0YygpLCBidXQgbmV2ZXIgcmV0dXJuIGEgTlVMIHdoZW4gY2FsbGVkIHJlY3Vyc2l2ZWx5LCBnZXQgYSBrZXkKKyAqIGRpcmVjdGx5IGZyb20gdGhlIHVzZXIgKGlnbm9yaW5nIHR5cGVhaGVhZCkuCisgKi8KKyAgICBpbnQKK3NhZmVfdmdldGMoKQoreworICAgIGludAljOworCisgICAgYyA9IHZnZXRjKCk7CisgICAgaWYgKGMgPT0gTlVMKQorCWMgPSBnZXRfa2V5c3Ryb2tlKCk7CisgICAgcmV0dXJuIGM7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIHN1Y2ggdGhhdCB2Z2V0YygpIHdpbGwgbm90IGJsb2NrLgorICogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgb3IgbXVsdGktYnl0ZSwgdGhlIHJldHVybmVkCisgKiBjaGFyYWN0ZXIgaXMgbm90IHZhbGlkIS4KKyAqLworICAgIGludAordnBlZWtjKCkKK3sKKyAgICBpZiAob2xkX2NoYXIgIT0gLTEpCisJcmV0dXJuIG9sZF9jaGFyOworICAgIHJldHVybiB2Z2V0b3JwZWVrKEZBTFNFKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9URVJNUkVTUE9OU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTGlrZSB2cGVla2MoKSwgYnV0IGRvbid0IGFsbG93IG1hcHBpbmcuICBEbyBhbGxvdyBjaGVja2luZyBmb3IgdGVybWluYWwKKyAqIGNvZGVzLgorICovCisgICAgaW50Cit2cGVla2Nfbm9tYXAoKQoreworICAgIGludAkJYzsKKworICAgICsrbm9fbWFwcGluZzsKKyAgICArK2FsbG93X2tleXM7CisgICAgYyA9IHZwZWVrYygpOworICAgIC0tbm9fbWFwcGluZzsKKyAgICAtLWFsbG93X2tleXM7CisgICAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9JTlNfRVhQQU5EKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENoZWNrIGlmIGFueSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlLCBhbHNvIGhhbGYgYW4gZXNjYXBlIHNlcXVlbmNlLgorICogVHJpY2s6IHdoZW4gbm8gdHlwZWFoZWFkIGZvdW5kLCBidXQgdGhlcmUgaXMgc29tZXRoaW5nIGluIHRoZSB0eXBlYWhlYWQKKyAqIGJ1ZmZlciwgaXQgbXVzdCBiZSBhbiBFU0MgdGhhdCBpcyByZWNvZ25pemVkIGFzIHRoZSBzdGFydCBvZiBhIGtleSBjb2RlLgorICovCisgICAgaW50Cit2cGVla2NfYW55KCkKK3sKKyAgICBpbnQJCWM7CisKKyAgICBjID0gdnBlZWtjKCk7CisgICAgaWYgKGMgPT0gTlVMICYmIHR5cGVidWYudGJfbGVuID4gMCkKKwljID0gRVNDOworICAgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qCisgKiBDYWxsIHZwZWVrYygpIHdpdGhvdXQgY2F1c2luZyBhbnl0aGluZyB0byBiZSBtYXBwZWQuCisgKiBSZXR1cm4gVFJVRSBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIGludAorY2hhcl9hdmFpbCgpCit7CisgICAgaW50CSAgICByZXR2YWw7CisKKyAgICArK25vX21hcHBpbmc7CisgICAgcmV0dmFsID0gdnBlZWtjKCk7CisgICAgLS1ub19tYXBwaW5nOworICAgIHJldHVybiAocmV0dmFsICE9IE5VTCk7Cit9CisKKyAgICB2b2lkCit2dW5nZXRjKGMpCS8qIHVuZ2V0IG9uZSBjaGFyYWN0ZXIgKGNhbiBvbmx5IGJlIGRvbmUgb25jZSEpICovCisgICAgaW50CQljOworeworICAgIG9sZF9jaGFyID0gYzsKKyAgICBvbGRfbW9kX21hc2sgPSBtb2RfbWFzazsKK30KKworLyoKKyAqIGdldCBhIGNoYXJhY3RlcjoKKyAqIDEuIGZyb20gdGhlIHN0dWZmYnVmZmVyCisgKglUaGlzIGlzIHVzZWQgZm9yIGFiYnJldmlhdGVkIGNvbW1hbmRzIGxpa2UgIkQiIC0+ICJkJCIuCisgKglBbHNvIHVzZWQgdG8gcmVkbyBhIGNvbW1hbmQgZm9yICIuIi4KKyAqIDIuIGZyb20gdGhlIHR5cGVhaGVhZCBidWZmZXIKKyAqCVN0b3JlcyB0ZXh0IG9idGFpbmVkIHByZXZpb3VzbHkgYnV0IG5vdCB1c2VkIHlldC4KKyAqCUFsc28gc3RvcmVzIHRoZSByZXN1bHQgb2YgbWFwcGluZ3MuCisgKglBbHNvIHVzZWQgZm9yIHRoZSAiOm5vcm1hbCIgY29tbWFuZC4KKyAqIDMuIGZyb20gdGhlIHVzZXIKKyAqCVRoaXMgbWF5IGRvIGEgYmxvY2tpbmcgd2FpdCBpZiAiYWR2YW5jZSIgaXMgVFJVRS4KKyAqCisgKiBpZiAiYWR2YW5jZSIgaXMgVFJVRSAodmdldGMoKSk6CisgKglyZWFsbHkgZ2V0IHRoZSBjaGFyYWN0ZXIuCisgKglLZXlUeXBlZCBpcyBzZXQgdG8gVFJVRSBpbiB0aGUgY2FzZSB0aGUgdXNlciB0eXBlZCB0aGUga2V5LgorICoJS2V5U3R1ZmZlZCBpcyBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgY29tZXMgZnJvbSB0aGUgc3R1ZmYgYnVmZmVyLgorICogaWYgImFkdmFuY2UiIGlzIEZBTFNFICh2cGVla2MoKSk6CisgKglqdXN0IGxvb2sgd2hldGhlciB0aGVyZSBpcyBhIGNoYXJhY3RlciBhdmFpbGFibGUuCisgKgorICogV2hlbiAibm9fbWFwcGluZyIgaXMgemVybywgY2hlY2tzIGZvciBtYXBwaW5ncyBpbiB0aGUgY3VycmVudCBtb2RlLgorICogT25seSByZXR1cm5zIG9uZSBieXRlIChvZiBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyKS4KKyAqIEtfU1BFQ0lBTCBhbmQgQ1NJIG1heSBiZSBlc2NhcGVkLCBuZWVkIHRvIGdldCB0d28gbW9yZSBieXRlcyB0aGVuLgorICovCisgICAgc3RhdGljIGludAordmdldG9ycGVlayhhZHZhbmNlKQorICAgIGludAkgICAgYWR2YW5jZTsKK3sKKyAgICBpbnQJCWMsIGMxOworICAgIGludAkJa2V5bGVuOworICAgIGNoYXJfdQkqczsKKyAgICBtYXBibG9ja19UCSptcDsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisgICAgbWFwYmxvY2tfVAkqbXAyOworI2VuZGlmCisgICAgbWFwYmxvY2tfVAkqbXBfbWF0Y2g7CisgICAgaW50CQltcF9tYXRjaF9sZW4gPSAwOworICAgIGludAkJdGltZWRvdXQgPSBGQUxTRTsJICAgIC8qIHdhaXRlZCBmb3IgbW9yZSB0aGFuIDEgc2Vjb25kCisJCQkJCQlmb3IgbWFwcGluZyB0byBjb21wbGV0ZSAqLworICAgIGludAkJbWFwZGVwdGggPSAwOwkgICAgLyogY2hlY2sgZm9yIHJlY3Vyc2l2ZSBtYXBwaW5nICovCisgICAgaW50CQltb2RlX2RlbGV0ZWQgPSBGQUxTRTsgICAvKiBzZXQgd2hlbiBtb2RlIGhhcyBiZWVuIGRlbGV0ZWQgKi8KKyAgICBpbnQJCWxvY2FsX1N0YXRlOworICAgIGludAkJbWxlbjsKKyAgICBpbnQJCW1heF9tbGVuOworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgaW50CQlpOworICAgIGludAkJbmV3X3djb2wsIG5ld193cm93OworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZkZWYgRkVBVF9NRU5VCisgICAgaW50CQlpZHg7CisjIGVuZGlmCisgICAgaW50CQlzaGFwZV9jaGFuZ2VkID0gRkFMU0U7ICAvKiBhZGp1c3RlZCBjdXJzb3Igc2hhcGUgKi8KKyNlbmRpZgorICAgIGludAkJbjsKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKyAgICBpbnQJCW5vbG1hcGxlbjsKKyNlbmRpZgorICAgIGludAkJb2xkX3djb2wsIG9sZF93cm93OworCisgICAgLyoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgd2hlbiBjYWxsZWQgcmVjdXJzaXZlbHkuICBUaGlzIG1heQorICAgICAqIGhhcHBlbiB0aG91Z2gsIGJlY2F1c2Ugb2Y6CisgICAgICogMS4gVGhlIGNhbGwgdG8gYWRkX3RvX3Nob3djbWQoKS4JY2hhcl9hdmFpbCgpIGlzIHRoZW4gdXNlZCB0byBjaGVjayBpZgorICAgICAqIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGF2YWlsYWJsZSwgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbi4gIEluIHRoYXQKKyAgICAgKiBjYXNlIHdlIG11c3QgcmV0dXJuIE5VTCwgdG8gaW5kaWNhdGUgbm8gY2hhcmFjdGVyIGlzIGF2YWlsYWJsZS4KKyAgICAgKiAyLiBBIEdVSSBjYWxsYmFjayBmdW5jdGlvbiB3cml0ZXMgdG8gdGhlIHNjcmVlbiwgY2F1c2luZyBhCisgICAgICogd2FpdF9yZXR1cm4oKS4KKyAgICAgKiBVc2luZyAiOm5vcm1hbCIgY2FuIGFsc28gZG8gdGhpcywgYnV0IGl0IHNhdmVzIHRoZSB0eXBlYWhlYWQgYnVmZmVyLAorICAgICAqIHRodXMgaXQgc2hvdWxkIGJlIE9LLiAgQnV0IGRvbid0IGdldCBhIGtleSBmcm9tIHRoZSB1c2VyIHRoZW4uCisgICAgICovCisgICAgaWYgKHZnZXRjX2J1c3kKKyNpZmRlZiBGRUFUX0VYX0VYVFJBCisJICAgICYmIGV4X25vcm1hbF9idXN5ID09IDAKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIE5VTDsKKworICAgIGxvY2FsX1N0YXRlID0gZ2V0X3JlYWxfc3RhdGUoKTsKKworICAgIHZnZXRjX2J1c3kgPSBUUlVFOworCisgICAgaWYgKGFkdmFuY2UpCisJS2V5U3R1ZmZlZCA9IEZBTFNFOworCisgICAgaW5pdF90eXBlYnVmKCk7CisgICAgc3RhcnRfc3R1ZmYoKTsKKyAgICBpZiAoYWR2YW5jZSAmJiB0eXBlYnVmLnRiX21hcGxlbiA9PSAwKQorCUV4ZWNfcmVnID0gRkFMU0U7CisgICAgZG8KKyAgICB7CisvKgorICogZ2V0IGEgY2hhcmFjdGVyOiAxLiBmcm9tIHRoZSBzdHVmZmJ1ZmZlcgorICovCisJaWYgKHR5cGVhaGVhZF9jaGFyICE9IDApCisJeworCSAgICBjID0gdHlwZWFoZWFkX2NoYXI7CisJICAgIGlmIChhZHZhbmNlKQorCQl0eXBlYWhlYWRfY2hhciA9IDA7CisJfQorCWVsc2UKKwkgICAgYyA9IHJlYWRfc3R1ZmYoYWR2YW5jZSk7CisJaWYgKGMgIT0gTlVMICYmICFnb3RfaW50KQorCXsKKwkgICAgaWYgKGFkdmFuY2UpCisJICAgIHsKKwkJLyogS2V5VHlwZWQgPSBGQUxTRTsgIFdoZW4gdGhlIGNvbW1hbmQgdGhhdCBzdHVmZmVkIHNvbWV0aGluZworCQkgKiB3YXMgdHlwZWQsIGJlaGF2ZSBsaWtlIHRoZSBzdHVmZmVkIGNvbW1hbmQgd2FzIHR5cGVkLgorCQkgKiBuZWVkZWQgZm9yIENUUkwtVyBDVFJsLV0gdG8gb3BlbiBhIGZvbGQsIGZvciBleGFtcGxlLiAqLworCQlLZXlTdHVmZmVkID0gVFJVRTsKKwkgICAgfQorCSAgICBpZiAodHlwZWJ1Zi50Yl9ub19hYmJyX2NudCA9PSAwKQorCQl0eXBlYnVmLnRiX25vX2FiYnJfY250ID0gMTsJLyogbm8gYWJicmV2aWF0aW9ucyBub3cgKi8KKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogTG9vcCB1bnRpbCB3ZSBlaXRoZXIgZmluZCBhIG1hdGNoaW5nIG1hcHBlZCBrZXksIG9yIHdlCisJICAgICAqIGFyZSBzdXJlIHRoYXQgaXQgaXMgbm90IGEgbWFwcGVkIGtleS4KKwkgICAgICogSWYgYSBtYXBwZWQga2V5IHNlcXVlbmNlIGlzIGZvdW5kIHdlIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IHRvCisJICAgICAqIHRyeSByZS1tYXBwaW5nLgorCSAgICAgKi8KKwkgICAgZm9yICg7OykKKwkgICAgeworCQkvKgorCQkgKiB1aV9icmVha2NoZWNrKCkgaXMgc2xvdywgZG9uJ3QgdXNlIGl0IHRvbyBvZnRlbiB3aGVuCisJCSAqIGluc2lkZSBhIG1hcHBpbmcuICBCdXQgY2FsbCBpdCBlYWNoIHRpbWUgZm9yIHR5cGVkCisJCSAqIGNoYXJhY3RlcnMuCisJCSAqLworCQlpZiAodHlwZWJ1Zi50Yl9tYXBsZW4pCisJCSAgICBsaW5lX2JyZWFrY2hlY2soKTsKKwkJZWxzZQorCQkgICAgdWlfYnJlYWtjaGVjaygpOwkJLyogY2hlY2sgZm9yIENUUkwtQyAqLworCQlrZXlsZW4gPSAwOworCQlpZiAoZ290X2ludCkKKwkJeworCQkgICAgLyogZmx1c2ggYWxsIGlucHV0ICovCisJCSAgICBjID0gaW5jaGFyKHR5cGVidWYudGJfYnVmLCB0eXBlYnVmLnRiX2J1ZmxlbiAtIDEsIDBMLAorCQkJCQkJICAgICAgIHR5cGVidWYudGJfY2hhbmdlX2NudCk7CisJCSAgICAvKgorCQkgICAgICogSWYgaW5jaGFyKCkgcmV0dXJucyBUUlVFIChzY3JpcHQgZmlsZSB3YXMgYWN0aXZlKSBvciB3ZQorCQkgICAgICogYXJlIGluc2lkZSBhIG1hcHBpbmcsIGdldCBvdXQgb2YgaW5zZXJ0IG1vZGUuCisJCSAgICAgKiBPdGhlcndpc2Ugd2UgYmVoYXZlIGxpa2UgaGF2aW5nIGdvdHRlbiBhIENUUkwtQy4KKwkJICAgICAqIEFzIGEgcmVzdWx0IHR5cGluZyBDVFJMLUMgaW4gaW5zZXJ0IG1vZGUgd2lsbAorCQkgICAgICogcmVhbGx5IGluc2VydCBhIENUUkwtQy4KKwkJICAgICAqLworCQkgICAgaWYgKChjIHx8IHR5cGVidWYudGJfbWFwbGVuKQorCQkJCQkgICAgICAmJiAoU3RhdGUgJiAoSU5TRVJUICsgQ01ETElORSkpKQorCQkJYyA9IEVTQzsKKwkJICAgIGVsc2UKKwkJCWMgPSBDdHJsX0M7CisJCSAgICBmbHVzaF9idWZmZXJzKFRSVUUpOwkvKiBmbHVzaCBhbGwgdHlwZWFoZWFkICovCisKKwkJICAgIC8qIEFsc28gcmVjb3JkIHRoaXMgY2hhcmFjdGVyLCBpdCBtaWdodCBiZSBuZWVkZWQgdG8KKwkJICAgICAqIGdldCBvdXQgb2YgSW5zZXJ0IG1vZGUuICovCisJCSAgICAqdHlwZWJ1Zi50Yl9idWYgPSBjOworCQkgICAgZ290Y2hhcnModHlwZWJ1Zi50Yl9idWYsIDEpOworCQkgICAgY21kX3NpbGVudCA9IEZBTFNFOworCisJCSAgICBicmVhazsKKwkJfQorCQllbHNlIGlmICh0eXBlYnVmLnRiX2xlbiA+IDApCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBDaGVjayBmb3IgYSBtYXBwYWJsZSBrZXkgc2VxdWVuY2UuCisJCSAgICAgKiBXYWxrIHRocm91Z2ggb25lIG1hcGhhc2hbXSBsaXN0IHVudGlsIHdlIGZpbmQgYW4KKwkJICAgICAqIGVudHJ5IHRoYXQgbWF0Y2hlcy4KKwkJICAgICAqCisJCSAgICAgKiBEb24ndCBsb29rIGZvciBtYXBwaW5ncyBpZjoKKwkJICAgICAqIC0gbm9fbWFwcGluZyBzZXQ6IG1hcHBpbmcgZGlzYWJsZWQgKGUuZy4gZm9yIENUUkwtVikKKwkJICAgICAqIC0gbWFwaGFzaF92YWxpZCBub3Qgc2V0OiBubyBtYXBwaW5ncyBwcmVzZW50LgorCQkgICAgICogLSB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZl0gc2hvdWxkIG5vdCBiZSByZW1hcHBlZAorCQkgICAgICogLSBpbiBpbnNlcnQgb3IgY21kbGluZSBtb2RlIGFuZCAncGFzdGUnIG9wdGlvbiBzZXQKKwkJICAgICAqIC0gd2FpdGluZyBmb3IgImhpdCByZXR1cm4gdG8gY29udGludWUiIGFuZCBDUiBvciBTUEFDRQorCQkgICAgICoJIHR5cGVkCisJCSAgICAgKiAtIHdhaXRpbmcgZm9yIGEgY2hhciB3aXRoIC0tbW9yZS0tCisJCSAgICAgKiAtIGluIEN0cmwtWCBtb2RlLCBhbmQgd2UgZ2V0IGEgdmFsaWQgY2hhciBmb3IgdGhhdCBtb2RlCisJCSAgICAgKi8KKwkJICAgIG1wID0gTlVMTDsKKwkJICAgIG1heF9tbGVuID0gMDsKKwkJICAgIGMxID0gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmZdOworCQkgICAgaWYgKG5vX21hcHBpbmcgPT0gMCAmJiBtYXBoYXNoX3ZhbGlkCisJCQkgICAgJiYgKG5vX3plcm9fbWFwcGluZyA9PSAwIHx8IGMxICE9ICcwJykKKwkJCSAgICAmJiAodHlwZWJ1Zi50Yl9tYXBsZW4gPT0gMAorCQkJCXx8IChwX3JlbWFwCisJCQkJICAgICYmIHR5cGVidWYudGJfbm9yZW1hcFt0eXBlYnVmLnRiX29mZl0KKwkJCQkJCQkJICAhPSBSTV9OT05FKSkKKwkJCSAgICAmJiAhKHBfcGFzdGUgJiYgKFN0YXRlICYgKElOU0VSVCArIENNRExJTkUpKSkKKwkJCSAgICAmJiAhKFN0YXRlID09IEhJVFJFVFVSTiAmJiAoYzEgPT0gQ0FSIHx8IGMxID09ICcgJykpCisJCQkgICAgJiYgU3RhdGUgIT0gQVNLTU9SRQorCQkJICAgICYmIFN0YXRlICE9IENPTkZJUk0KKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkJCSAgICAmJiAhKChjdHJsX3hfbW9kZSAhPSAwICYmIHZpbV9pc19jdHJsX3hfa2V5KGMxKSkKKwkJCQkgICAgfHwgKChjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKQorCQkJCQkmJiAoYzEgPT0gQ3RybF9OIHx8IGMxID09IEN0cmxfUCkpKQorI2VuZGlmCisJCQkgICAgKQorCQkgICAgeworI2lmZGVmIEZFQVRfTEFOR01BUAorCQkJaWYgKGMxID09IEtfU1BFQ0lBTCkKKwkJCSAgICBub2xtYXBsZW4gPSAyOworCQkJZWxzZQorCQkJeworCQkJICAgIExBTkdNQVBfQURKVVNUKGMxLCBUUlVFKTsKKwkJCSAgICBub2xtYXBsZW4gPSAwOworCQkJfQorI2VuZGlmCisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQkJLyogRmlyc3QgdHJ5IGJ1ZmZlci1sb2NhbCBtYXBwaW5ncy4gKi8KKwkJCW1wID0gY3VyYnVmLT5iX21hcGhhc2hbTUFQX0hBU0gobG9jYWxfU3RhdGUsIGMxKV07CisJCQltcDIgPSBtYXBoYXNoW01BUF9IQVNIKGxvY2FsX1N0YXRlLCBjMSldOworCQkJaWYgKG1wID09IE5VTEwpCisJCQl7CisJCQkgICAgbXAgPSBtcDI7CisJCQkgICAgbXAyID0gTlVMTDsKKwkJCX0KKyNlbHNlCisJCQltcCA9IG1hcGhhc2hbTUFQX0hBU0gobG9jYWxfU3RhdGUsIGMxKV07CisjZW5kaWYKKwkJCS8qCisJCQkgKiBMb29wIHVudGlsIGEgcGFydGx5IG1hdGNoaW5nIG1hcHBpbmcgaXMgZm91bmQgb3IKKwkJCSAqIGFsbCAobG9jYWwpIG1hcHBpbmdzIGhhdmUgYmVlbiBjaGVja2VkLgorCQkJICogVGhlIGxvbmdlc3QgZnVsbCBtYXRjaCBpcyByZW1lbWJlcmVkIGluICJtcF9tYXRjaCIuCisJCQkgKiBBIGZ1bGwgbWF0Y2ggaXMgb25seSBhY2NlcHRlZCBpZiB0aGVyZSBpcyBubyBwYXJ0bHkKKwkJCSAqIG1hdGNoLCBzbyAiYWEiIGFuZCAiYWFhIiBjYW4gYm90aCBiZSBtYXBwZWQuCisJCQkgKi8KKwkJCW1wX21hdGNoID0gTlVMTDsKKwkJCW1wX21hdGNoX2xlbiA9IDA7CisJCQlmb3IgKCA7IG1wICE9IE5VTEw7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQkJCW1wLT5tX25leHQgPT0gTlVMTCA/IChtcCA9IG1wMiwgbXAyID0gTlVMTCkgOgorI2VuZGlmCisJCQkJKG1wID0gbXAtPm1fbmV4dCkpCisJCQl7CisJCQkgICAgLyoKKwkJCSAgICAgKiBPbmx5IGNvbnNpZGVyIGFuIGVudHJ5IGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwkJCSAgICAgKiBtYXRjaGVzIGFuZCBpdCBpcyBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuCisJCQkgICAgICogU2tpcCAiOmxtYXAiIG1hcHBpbmdzIGlmIGtleXMgd2VyZSBtYXBwZWQuCisJCQkgICAgICovCisJCQkgICAgaWYgKG1wLT5tX2tleXNbMF0gPT0gYzEKKwkJCQkgICAgJiYgKG1wLT5tX21vZGUgJiBsb2NhbF9TdGF0ZSkKKwkJCQkgICAgJiYgKChtcC0+bV9tb2RlICYgTEFOR01BUCkgPT0gMAorCQkJCQl8fCB0eXBlYnVmLnRiX21hcGxlbiA9PSAwKSkKKwkJCSAgICB7CisjaWZkZWYgRkVBVF9MQU5HTUFQCisJCQkJaW50CW5vbWFwID0gbm9sbWFwbGVuOworCQkJCWludAljMjsKKyNlbmRpZgorCQkJCS8qIGZpbmQgdGhlIG1hdGNoIGxlbmd0aCBvZiB0aGlzIG1hcHBpbmcgKi8KKwkJCQlmb3IgKG1sZW4gPSAxOyBtbGVuIDwgdHlwZWJ1Zi50Yl9sZW47ICsrbWxlbikKKwkJCQl7CisjaWZkZWYgRkVBVF9MQU5HTUFQCisJCQkJICAgIGMyID0gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYgKyBtbGVuXTsKKwkJCQkgICAgaWYgKG5vbWFwID4gMCkKKwkJCQkJLS1ub21hcDsKKwkJCQkgICAgZWxzZSBpZiAoYzIgPT0gS19TUEVDSUFMKQorCQkJCQlub21hcCA9IDI7CisJCQkJICAgIGVsc2UKKwkJCQkJTEFOR01BUF9BREpVU1QoYzIsIFRSVUUpOworCQkJCSAgICBpZiAobXAtPm1fa2V5c1ttbGVuXSAhPSBjMikKKyNlbHNlCisJCQkJICAgIGlmIChtcC0+bV9rZXlzW21sZW5dICE9CisJCQkJCXR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmICsgbWxlbl0pCisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJfQorCisjaWZkZWYgRkVBVF9NQllURQorCQkJCS8qIERvbid0IGFsbG93IG1hcHBpbmcgdGhlIGZpcnN0IGJ5dGUocykgb2YgYQorCQkJCSAqIG11bHRpLWJ5dGUgY2hhci4gIEhhcHBlbnMgd2hlbiBtYXBwaW5nCisJCQkJICogPE0tYT4gYW5kIHRoZW4gY2hhbmdpbmcgJ2VuY29kaW5nJy4gKi8KKwkJCQlpZiAoaGFzX21ieXRlICYmIE1CX0JZVEUyTEVOKGMxKQorCQkJCQkgICAgPiAoKm1iX3B0cjJsZW5fY2hlY2spKG1wLT5tX2tleXMpKQorCQkJCSAgICBtbGVuID0gMDsKKyNlbmRpZgorCQkJCS8qCisJCQkJICogQ2hlY2sgYW4gZW50cnkgd2hldGhlciBpdCBtYXRjaGVzLgorCQkJCSAqIC0gRnVsbCBtYXRjaDogbWxlbiA9PSBrZXlsZW4KKwkJCQkgKiAtIFBhcnRseSBtYXRjaDogbWxlbiA9PSB0eXBlYnVmLnRiX2xlbgorCQkJCSAqLworCQkJCWtleWxlbiA9IG1wLT5tX2tleWxlbjsKKwkJCQlpZiAobWxlbiA9PSBrZXlsZW4KKwkJCQkgICAgIHx8IChtbGVuID09IHR5cGVidWYudGJfbGVuCisJCQkJCQkgICYmIHR5cGVidWYudGJfbGVuIDwga2V5bGVuKSkKKwkJCQl7CisJCQkJICAgIC8qCisJCQkJICAgICAqIElmIG9ubHkgc2NyaXB0LWxvY2FsIG1hcHBpbmdzIGFyZQorCQkJCSAgICAgKiBhbGxvd2VkLCBjaGVjayBpZiB0aGUgbWFwcGluZyBzdGFydHMKKwkJCQkgICAgICogd2l0aCBLX1NOUi4KKwkJCQkgICAgICovCisJCQkJICAgIHMgPSB0eXBlYnVmLnRiX25vcmVtYXAgKyB0eXBlYnVmLnRiX29mZjsKKwkJCQkgICAgaWYgKCpzID09IFJNX1NDUklQVAorCQkJCQkgICAgJiYgKG1wLT5tX2tleXNbMF0gIT0gS19TUEVDSUFMCisJCQkJCQl8fCBtcC0+bV9rZXlzWzFdICE9IEtTX0VYVFJBCisJCQkJCQl8fCBtcC0+bV9rZXlzWzJdCisJCQkJCQkJICAgICAgIT0gKGludClLRV9TTlIpKQorCQkJCQljb250aW51ZTsKKwkJCQkgICAgLyoKKwkJCQkgICAgICogSWYgb25lIG9mIHRoZSB0eXBlZCBrZXlzIGNhbm5vdCBiZQorCQkJCSAgICAgKiByZW1hcHBlZCwgc2tpcCB0aGUgZW50cnkuCisJCQkJICAgICAqLworCQkJCSAgICBmb3IgKG4gPSBtbGVuOyAtLW4gPj0gMDsgKQorCQkJCQlpZiAoKnMrKyA9PSBSTV9OT05FKQorCQkJCQkgICAgYnJlYWs7CisJCQkJICAgIGlmIChuID49IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJICAgIGlmIChrZXlsZW4gPiB0eXBlYnVmLnRiX2xlbikKKwkJCQkgICAgeworCQkJCQlpZiAoIXRpbWVkb3V0KQorCQkJCQl7CisJCQkJCSAgICAvKiBicmVhayBhdCBhIHBhcnRseSBtYXRjaCAqLworCQkJCQkgICAga2V5bGVuID0gS0xfUEFSVF9NQVA7CisJCQkJCSAgICBicmVhazsKKwkJCQkJfQorCQkJCSAgICB9CisJCQkJICAgIGVsc2UgaWYgKGtleWxlbiA+IG1wX21hdGNoX2xlbikKKwkJCQkgICAgeworCQkJCQkvKiBmb3VuZCBhIGxvbmdlciBtYXRjaCAqLworCQkJCQltcF9tYXRjaCA9IG1wOworCQkJCQltcF9tYXRjaF9sZW4gPSBrZXlsZW47CisJCQkJICAgIH0KKwkJCQl9CisJCQkJZWxzZQorCQkJCSAgICAvKiBObyBtYXRjaDsgbWF5IGhhdmUgdG8gY2hlY2sgZm9yCisJCQkJICAgICAqIHRlcm1jb2RlIGF0IG5leHQgY2hhcmFjdGVyLiAqLworCQkJCSAgICBpZiAobWF4X21sZW4gPCBtbGVuKQorCQkJCQltYXhfbWxlbiA9IG1sZW47CisJCQkgICAgfQorCQkJfQorCisJCQkvKiBJZiBubyBwYXJ0bHkgbWF0Y2ggZm91bmQsIHVzZSB0aGUgbG9uZ2VzdCBmdWxsCisJCQkgKiBtYXRjaC4gKi8KKwkJCWlmIChrZXlsZW4gIT0gS0xfUEFSVF9NQVApCisJCQl7CisJCQkgICAgbXAgPSBtcF9tYXRjaDsKKwkJCSAgICBrZXlsZW4gPSBtcF9tYXRjaF9sZW47CisJCQl9CisJCSAgICB9CisKKwkJICAgIC8qIENoZWNrIGZvciBtYXRjaCB3aXRoICdwYXN0ZXRvZ2dsZScgKi8KKwkJICAgIGlmICgqcF9wdCAhPSBOVUwgJiYgbXAgPT0gTlVMTCAmJiAoU3RhdGUgJiAoSU5TRVJUfE5PUk1BTCkpKQorCQkgICAgeworCQkJZm9yIChtbGVuID0gMDsgbWxlbiA8IHR5cGVidWYudGJfbGVuICYmIHBfcHRbbWxlbl07CisJCQkJCQkJCSAgICAgICArK21sZW4pCisJCQkgICAgaWYgKHBfcHRbbWxlbl0gIT0gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYKKwkJCQkJCQkJICAgICAgKyBtbGVuXSkKKwkJCQkgICAgYnJlYWs7CisJCQlpZiAocF9wdFttbGVuXSA9PSBOVUwpCS8qIG1hdGNoICovCisJCQl7CisJCQkgICAgLyogd3JpdGUgY2hhcnMgdG8gc2NyaXB0IGZpbGUocykgKi8KKwkJCSAgICBpZiAobWxlbiA+IHR5cGVidWYudGJfbWFwbGVuKQorCQkJCWdvdGNoYXJzKHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYKKwkJCQkJCQkgICsgdHlwZWJ1Zi50Yl9tYXBsZW4sCisJCQkJCQkgICAgbWxlbiAtIHR5cGVidWYudGJfbWFwbGVuKTsKKworCQkJICAgIGRlbF90eXBlYnVmKG1sZW4sIDApOyAvKiByZW1vdmUgdGhlIGNoYXJzICovCisJCQkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInBhc3RlIiwKKwkJCQkJCSAgICAgKGxvbmcpIXBfcGFzdGUsIE5VTEwsIDApOworCQkJICAgIGlmICghKFN0YXRlICYgSU5TRVJUKSkKKwkJCSAgICB7CisJCQkJbXNnX2NvbCA9IDA7CisJCQkJbXNnX3JvdyA9IFJvd3MgLSAxOworCQkJCW1zZ19jbHJfZW9zKCk7CQkvKiBjbGVhciBydWxlciAqLworCQkJICAgIH0KKwkJCSAgICBzaG93bW9kZSgpOworCQkJICAgIHNldGN1cnNvcigpOworCQkJICAgIGNvbnRpbnVlOworCQkJfQorCQkJLyogTmVlZCBtb3JlIGNoYXJzIGZvciBwYXJ0bHkgbWF0Y2guICovCisJCQlpZiAobWxlbiA9PSB0eXBlYnVmLnRiX2xlbikKKwkJCSAgICBrZXlsZW4gPSBLTF9QQVJUX01BUDsKKwkJCWVsc2UgaWYgKG1heF9tbGVuIDwgbWxlbikKKwkJCSAgICAvKiBubyBtYXRjaCwgbWF5IGhhdmUgdG8gY2hlY2sgZm9yIHRlcm1jb2RlIGF0CisJCQkgICAgICogbmV4dCBjaGFyYWN0ZXIgKi8KKwkJCSAgICBtYXhfbWxlbiA9IG1sZW4gKyAxOworCQkgICAgfQorCisJCSAgICBpZiAoKG1wID09IE5VTEwgfHwgbWF4X21sZW4gPj0gbXBfbWF0Y2hfbGVuKQorCQkJCQkJICAgICAmJiBrZXlsZW4gIT0gS0xfUEFSVF9NQVApCisJCSAgICB7CisJCQkvKgorCQkJICogV2hlbiBubyBtYXRjaGluZyBtYXBwaW5nIGZvdW5kIG9yIGZvdW5kIGEKKwkJCSAqIG5vbi1tYXRjaGluZyBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBhdCBsZWFzdCB3aGF0IHRoZQorCQkJICogbWF0Y2hpbmcgbWFwcGluZyBtYXRjaGVkOgorCQkJICogQ2hlY2sgaWYgd2UgaGF2ZSBhIHRlcm1pbmFsIGNvZGUsIHdoZW46CisJCQkgKiAgbWFwcGluZyBpcyBhbGxvd2VkLAorCQkJICogIGtleXMgaGF2ZSBub3QgYmVlbiBtYXBwZWQsCisJCQkgKiAgYW5kIG5vdCBhbiBFU0Mgc2VxdWVuY2UsIG5vdCBpbiBpbnNlcnQgbW9kZSBvcgorCQkJICoJcF9layBpcyBvbiwKKwkJCSAqICBhbmQgd2hlbiBub3QgdGltZWQgb3V0LAorCQkJICovCisJCQlpZiAoKG5vX21hcHBpbmcgPT0gMCB8fCBhbGxvd19rZXlzICE9IDApCisJCQkJJiYgKHR5cGVidWYudGJfbWFwbGVuID09IDAKKwkJCQkgICAgfHwgKHBfcmVtYXAgJiYgdHlwZWJ1Zi50Yl9ub3JlbWFwWworCQkJCQkJICAgdHlwZWJ1Zi50Yl9vZmZdID09IFJNX1lFUykpCisJCQkJJiYgIXRpbWVkb3V0KQorCQkJeworCQkJICAgIGtleWxlbiA9IGNoZWNrX3Rlcm1jb2RlKG1heF9tbGVuICsgMSwgTlVMTCwgMCk7CisKKwkJCSAgICAvKgorCQkJICAgICAqIFdoZW4gZ2V0dGluZyBhIHBhcnRpYWwgbWF0Y2gsIGJ1dCB0aGUgbGFzdAorCQkJICAgICAqIGNoYXJhY3RlcnMgd2VyZSBub3QgdHlwZWQsIGRvbid0IHdhaXQgZm9yIGEKKwkJCSAgICAgKiB0eXBlZCBjaGFyYWN0ZXIgdG8gY29tcGxldGUgdGhlIHRlcm1jb2RlLgorCQkJICAgICAqIFRoaXMgaGVscHMgYSBsb3Qgd2hlbiBhICI6bm9ybWFsIiBjb21tYW5kIGVuZHMKKwkJCSAgICAgKiBpbiBhbiBFU0MuCisJCQkgICAgICovCisJCQkgICAgaWYgKGtleWxlbiA8IDAKKwkJCQkgICAgICAgJiYgdHlwZWJ1Zi50Yl9sZW4gPT0gdHlwZWJ1Zi50Yl9tYXBsZW4pCisJCQkJa2V5bGVuID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCSAgICBrZXlsZW4gPSAwOworCQkJaWYgKGtleWxlbiA9PSAwKQkvKiBubyBtYXRjaGluZyB0ZXJtaW5hbCBjb2RlICovCisJCQl7CisjaWZkZWYgQU1JR0EJCQkvKiBjaGVjayBmb3Igd2luZG93IGJvdW5kcyByZXBvcnQgKi8KKwkJCSAgICBpZiAodHlwZWJ1Zi50Yl9tYXBsZW4gPT0gMCAmJiAodHlwZWJ1Zi50Yl9idWZbCisJCQkJCSAgICAgICB0eXBlYnVmLnRiX29mZl0gJiAweGZmKSA9PSBDU0kpCisJCQkgICAgeworCQkJCWZvciAocyA9IHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYgKyAxOworCQkJCQlzIDwgdHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZgorCQkJCQkJCSAgICAgICsgdHlwZWJ1Zi50Yl9sZW4KKwkJCQkgICAmJiAoVklNX0lTRElHSVQoKnMpIHx8ICpzID09ICc7JworCQkJCQkJCQl8fCAqcyA9PSAnICcpOworCQkJCQkrK3MpCisJCQkJICAgIDsKKwkJCQlpZiAoKnMgPT0gJ3InIHx8ICpzID09ICd8JykgLyogZm91bmQgb25lICovCisJCQkJeworCQkJCSAgICBkZWxfdHlwZWJ1ZigoaW50KShzICsgMSAtCisJCQkJICAgICAgICh0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmKSksIDApOworCQkJCSAgICAvKiBnZXQgc2l6ZSBhbmQgcmVkcmF3IHNjcmVlbiAqLworCQkJCSAgICBzaGVsbF9yZXNpemVkKCk7CisJCQkJICAgIGNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoKnMgPT0gTlVMKQkgICAgLyogbmVlZCBtb3JlIGNoYXJhY3RlcnMgKi8KKwkJCQkgICAga2V5bGVuID0gS0xfUEFSVF9LRVk7CisJCQkgICAgfQorCQkJICAgIGlmIChrZXlsZW4gPj0gMCkKKyNlbmRpZgorCQkJICAgICAgLyogV2hlbiB0aGVyZSB3YXMgYSBtYXRjaGluZyBtYXBwaW5nIGFuZCBubworCQkJICAgICAgICogdGVybWNvZGUgY291bGQgYmUgcmVwbGFjZWQgYWZ0ZXIgYW5vdGhlciBvbmUsCisJCQkgICAgICAgKiB1c2UgdGhhdCBtYXBwaW5nLiAqLworCQkJICAgICAgaWYgKG1wID09IE5VTEwpCisJCQkgICAgICB7CisvKgorICogZ2V0IGEgY2hhcmFjdGVyOiAyLiBmcm9tIHRoZSB0eXBlYWhlYWQgYnVmZmVyCisgKi8KKwkJCQljID0gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmZdICYgMjU1OworCQkJCWlmIChhZHZhbmNlKQkvKiByZW1vdmUgY2hhcnMgZnJvbSB0Yl9idWYgKi8KKwkJCQl7CisJCQkJICAgIGNtZF9zaWxlbnQgPSAodHlwZWJ1Zi50Yl9zaWxlbnQgPiAwKTsKKwkJCQkgICAgaWYgKHR5cGVidWYudGJfbWFwbGVuID4gMCkKKwkJCQkJS2V5VHlwZWQgPSBGQUxTRTsKKwkJCQkgICAgZWxzZQorCQkJCSAgICB7CisJCQkJCUtleVR5cGVkID0gVFJVRTsKKwkJCQkJLyogd3JpdGUgY2hhciB0byBzY3JpcHQgZmlsZShzKSAqLworCQkJCQlnb3RjaGFycyh0eXBlYnVmLnRiX2J1ZgorCQkJCQkJCSArIHR5cGVidWYudGJfb2ZmLCAxKTsKKwkJCQkgICAgfQorCQkJCSAgICBLZXlOb3JlbWFwID0gKHR5cGVidWYudGJfbm9yZW1hcFsKKwkJCQkJCXR5cGVidWYudGJfb2ZmXSAhPSBSRU1BUF9ZRVMpOworCQkJCSAgICBkZWxfdHlwZWJ1ZigxLCAwKTsKKwkJCQl9CisJCQkJYnJlYWs7CSAgICAvKiBnb3QgY2hhcmFjdGVyLCBicmVhayBmb3IgbG9vcCAqLworCQkJICAgICAgfQorCQkJfQorCQkJaWYgKGtleWxlbiA+IDApCSAgICAvKiBmdWxsIG1hdGNoaW5nIHRlcm1pbmFsIGNvZGUgKi8KKwkJCXsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkKKwkJCSAgICBpZiAodHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmZdID09IEtfU1BFQ0lBTAorCQkJCQkgJiYgdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYgKyAxXQorCQkJCQkJCQkgICA9PSBLU19NRU5VKQorCQkJICAgIHsKKwkJCQkvKgorCQkJCSAqIFVzaW5nIGEgbWVudSBtYXkgY2F1c2UgYSBicmVhayBpbiB1bmRvIQorCQkJCSAqIEl0J3MgbGlrZSB1c2luZyBnb3RjaGFycygpLCBidXQgd2l0aG91dAorCQkJCSAqIHJlY29yZGluZyBvciB3cml0aW5nIHRvIGEgc2NyaXB0IGZpbGUuCisJCQkJICovCisJCQkJbWF5X3N5bmNfdW5kbygpOworCQkJCWRlbF90eXBlYnVmKDMsIDApOworCQkJCWlkeCA9IGdldF9tZW51X2luZGV4KGN1cnJlbnRfbWVudSwgbG9jYWxfU3RhdGUpOworCQkJCWlmIChpZHggIT0gTUVOVV9JTkRFWF9JTlZBTElEKQorCQkJCXsKKyMgaWZkZWYgRkVBVF9WSVNVQUwKKwkJCQkgICAgLyoKKwkJCQkgICAgICogSW4gU2VsZWN0IG1vZGUsIGEgVmlzdWFsIG1vZGUgbWVudSBpcworCQkJCSAgICAgKiB1c2VkLiAgU3dpdGNoIHRvIFZpc3VhbCBtb2RlCisJCQkJICAgICAqIHRlbXBvcmFyaWx5LiAgQXBwZW5kIEtfU0VMRUNUIHRvIHN3aXRjaAorCQkJCSAgICAgKiBiYWNrIHRvIFNlbGVjdCBtb2RlLgorCQkJCSAgICAgKi8KKwkJCQkgICAgaWYgKFZJc3VhbF9hY3RpdmUgJiYgVklzdWFsX3NlbGVjdCkKKwkJCQkgICAgeworCQkJCQlWSXN1YWxfc2VsZWN0ID0gRkFMU0U7CisJCQkJCSh2b2lkKWluc190eXBlYnVmKEtfU0VMRUNUX1NUUklORywKKwkJCQkJCSAgUkVNQVBfTk9ORSwgMCwgVFJVRSwgRkFMU0UpOworCQkJCSAgICB9CisjIGVuZGlmCisJCQkJICAgIGluc190eXBlYnVmKGN1cnJlbnRfbWVudS0+c3RyaW5nc1tpZHhdLAorCQkJCQkJY3VycmVudF9tZW51LT5ub3JlbWFwW2lkeF0sCisJCQkJCQkwLCBUUlVFLAorCQkJCQkJICAgY3VycmVudF9tZW51LT5zaWxlbnRbaWR4XSk7CisJCQkJfQorCQkJICAgIH0KKyNlbmRpZiAvKiBGRUFUX0dVSSAqLworCQkJICAgIGNvbnRpbnVlOwkvKiB0cnkgbWFwcGluZyBhZ2FpbiAqLworCQkJfQorCisJCQkvKiBQYXJ0aWFsIG1hdGNoOiBnZXQgc29tZSBtb3JlIGNoYXJhY3RlcnMuICBXaGVuIGEKKwkJCSAqIG1hdGNoaW5nIG1hcHBpbmcgd2FzIGZvdW5kIHVzZSB0aGF0IG9uZS4gKi8KKwkJCWlmIChtcCA9PSBOVUxMIHx8IGtleWxlbiA8IDApCisJCQkgICAga2V5bGVuID0gS0xfUEFSVF9LRVk7CisJCQllbHNlCisJCQkgICAga2V5bGVuID0gbXBfbWF0Y2hfbGVuOworCQkgICAgfQorCisJCSAgICAvKiBjb21wbGV0ZSBtYXRjaCAqLworCQkgICAgaWYgKGtleWxlbiA+PSAwICYmIGtleWxlbiA8PSB0eXBlYnVmLnRiX2xlbikKKwkJICAgIHsKKwkJCS8qIHdyaXRlIGNoYXJzIHRvIHNjcmlwdCBmaWxlKHMpICovCisJCQlpZiAoa2V5bGVuID4gdHlwZWJ1Zi50Yl9tYXBsZW4pCisJCQkgICAgZ290Y2hhcnModHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZgorCQkJCQkJCSAgKyB0eXBlYnVmLnRiX21hcGxlbiwKKwkJCQkJCSAga2V5bGVuIC0gdHlwZWJ1Zi50Yl9tYXBsZW4pOworCisJCQljbWRfc2lsZW50ID0gKHR5cGVidWYudGJfc2lsZW50ID4gMCk7CisJCQlkZWxfdHlwZWJ1ZihrZXlsZW4sIDApOwkvKiByZW1vdmUgdGhlIG1hcHBlZCBrZXlzICovCisKKwkJCS8qCisJCQkgKiBQdXQgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpbiBmcm9udCBvZiBtYXBzdHIuCisJCQkgKiBUaGUgZGVwdGggY2hlY2sgY2F0Y2hlcyAiOm1hcCB4IHkiIGFuZCAiOm1hcCB5IHgiLgorCQkJICovCisJCQlpZiAoKyttYXBkZXB0aCA+PSBwX21tZCkKKwkJCXsKKwkJCSAgICBFTVNHKF8oIkUyMjM6IHJlY3Vyc2l2ZSBtYXBwaW5nIikpOworCQkJICAgIGlmIChTdGF0ZSAmIENNRExJTkUpCisJCQkJcmVkcmF3Y21kbGluZSgpOworCQkJICAgIGVsc2UKKwkJCQlzZXRjdXJzb3IoKTsKKwkJCSAgICBmbHVzaF9idWZmZXJzKEZBTFNFKTsKKwkJCSAgICBtYXBkZXB0aCA9IDA7CS8qIGZvciBuZXh0IG9uZSAqLworCQkJICAgIGMgPSAtMTsKKwkJCSAgICBicmVhazsKKwkJCX0KKworI2lmZGVmIEZFQVRfVklTVUFMCisJCQkvKgorCQkJICogSW4gU2VsZWN0IG1vZGUsIGEgVmlzdWFsIG1vZGUgbWFwcGluZyBpcyB1c2VkLgorCQkJICogU3dpdGNoIHRvIFZpc3VhbCBtb2RlIHRlbXBvcmFyaWx5LiAgQXBwZW5kIEtfU0VMRUNUCisJCQkgKiB0byBzd2l0Y2ggYmFjayB0byBTZWxlY3QgbW9kZS4KKwkJCSAqLworCQkJaWYgKFZJc3VhbF9hY3RpdmUgJiYgVklzdWFsX3NlbGVjdCkKKwkJCXsKKwkJCSAgICBWSXN1YWxfc2VsZWN0ID0gRkFMU0U7CisJCQkgICAgKHZvaWQpaW5zX3R5cGVidWYoS19TRUxFQ1RfU1RSSU5HLCBSRU1BUF9OT05FLAorCQkJCQkJCSAgICAgIDAsIFRSVUUsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKgorCQkJICogSW5zZXJ0IHRoZSAndG8nIHBhcnQgaW4gdGhlIHR5cGVidWYudGJfYnVmLgorCQkJICogSWYgJ2Zyb20nIGZpZWxkIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBvZiB0aGUKKwkJCSAqICd0bycgZmllbGQsIGRvbid0IHJlbWFwIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisJCQkgKiBJZiBtX25vcmVtYXAgaXMgc2V0LCBkb24ndCByZW1hcCB0aGUgd2hvbGUgJ3RvJworCQkJICogcGFydC4KKwkJCSAqLworCQkJaWYgKGluc190eXBlYnVmKG1wLT5tX3N0ciwKKwkJCQltcC0+bV9ub3JlbWFwICE9IFJFTUFQX1lFUworCQkJCQkgICAgPyBtcC0+bV9ub3JlbWFwCisJCQkJCSAgICA6IFNUUk5DTVAobXAtPm1fc3RyLCBtcC0+bV9rZXlzLAorCQkJCQkJCSAgICAgICAoc2l6ZV90KWtleWxlbikKKwkJCQkJCQkgICAgICA/IFJFTUFQX1lFUyA6IDEsCisJCQkJMCwgVFJVRSwgY21kX3NpbGVudCB8fCBtcC0+bV9zaWxlbnQpID09IEZBSUwpCisJCQl7CisJCQkgICAgYyA9IC0xOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCSAgICB9CisJCX0KKworLyoKKyAqIGdldCBhIGNoYXJhY3RlcjogMy4gZnJvbSB0aGUgdXNlciAtIGhhbmRsZSA8RXNjPiBpbiBJbnNlcnQgbW9kZQorICovCisJCS8qCisJCSAqIHNwZWNpYWwgY2FzZTogaWYgd2UgZ2V0IGFuIDxFU0M+IGluIGluc2VydCBtb2RlIGFuZCB0aGVyZQorCQkgKiBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzIGF0IG9uY2UsIHdlIHByZXRlbmQgdG8gZ28gb3V0IG9mCisJCSAqIGluc2VydCBtb2RlLiAgVGhpcyBwcmV2ZW50cyB0aGUgb25lIHNlY29uZCBkZWxheSBhZnRlcgorCQkgKiB0eXBpbmcgYW4gPEVTQz4uICBJZiB3ZSBnZXQgc29tZXRoaW5nIGFmdGVyIGFsbCwgd2UgbWF5CisJCSAqIGhhdmUgdG8gcmVkaXNwbGF5IHRoZSBtb2RlLiBUaGF0IHRoZSBjdXJzb3IgaXMgaW4gdGhlIHdyb25nCisJCSAqIHBsYWNlIGRvZXMgbm90IG1hdHRlci4KKwkJICovCisJCWMgPSAwOworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJCW5ld193Y29sID0gY3Vyd2luLT53X3djb2w7CisJCW5ld193cm93ID0gY3Vyd2luLT53X3dyb3c7CisjZW5kaWYKKwkJaWYgKAkgICBhZHZhbmNlCisJCQkmJiB0eXBlYnVmLnRiX2xlbiA9PSAxCisJCQkmJiB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZl0gPT0gRVNDCisJCQkmJiAhbm9fbWFwcGluZworI2lmZGVmIEZFQVRfRVhfRVhUUkEKKwkJCSYmIGV4X25vcm1hbF9idXN5ID09IDAKKyNlbmRpZgorCQkJJiYgdHlwZWJ1Zi50Yl9tYXBsZW4gPT0gMAorCQkJJiYgKFN0YXRlICYgSU5TRVJUKQorCQkJJiYgKHBfdGltZW91dCB8fCAoa2V5bGVuID09IEtMX1BBUlRfS0VZICYmIHBfdHRpbWVvdXQpKQorCQkJJiYgKGMgPSBpbmNoYXIodHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZgorCQkJCQkJICAgICArIHR5cGVidWYudGJfbGVuLCAzLCAyNUwsCisJCQkJCQkgdHlwZWJ1Zi50Yl9jaGFuZ2VfY250KSkgPT0gMCkKKwkJeworCQkgICAgY29sbnJfVAljb2wgPSAwLCB2Y29sOworCQkgICAgY2hhcl91CSpwdHI7CisKKwkJICAgIGlmIChwX3NtZCkKKwkJICAgIHsKKwkJCXVuc2hvd21vZGUoVFJVRSk7CisJCQltb2RlX2RlbGV0ZWQgPSBUUlVFOworCQkgICAgfQorI2lmZGVmIEZFQVRfR1VJCisJCSAgICAvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisJCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkJICAgIHsKKwkJCWludAkgICAgc2F2ZV9TdGF0ZTsKKworCQkJc2F2ZV9TdGF0ZSA9IFN0YXRlOworCQkJU3RhdGUgPSBOT1JNQUw7CisJCQlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisJCQlTdGF0ZSA9IHNhdmVfU3RhdGU7CisJCQlzaGFwZV9jaGFuZ2VkID0gVFJVRTsKKwkJICAgIH0KKyNlbmRpZgorCQkgICAgdmFsaWRhdGVfY3Vyc29yKCk7CisJCSAgICBvbGRfd2NvbCA9IGN1cndpbi0+d193Y29sOworCQkgICAgb2xkX3dyb3cgPSBjdXJ3aW4tPndfd3JvdzsKKworCQkgICAgLyogbW92ZSBjdXJzb3IgbGVmdCwgaWYgcG9zc2libGUgKi8KKwkJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCAhPSAwKQorCQkgICAgeworCQkJaWYgKGN1cndpbi0+d193Y29sID4gMCkKKwkJCXsKKwkJCSAgICBpZiAoZGlkX2FpKQorCQkJICAgIHsKKwkJCQkvKgorCQkJCSAqIFdlIGFyZSBleHBlY3RpbmcgdG8gdHJ1bmNhdGUgdGhlIHRyYWlsaW5nCisJCQkJICogd2hpdGUtc3BhY2UsIHNvIGZpbmQgdGhlIGxhc3Qgbm9uLXdoaXRlCisJCQkJICogY2hhcmFjdGVyIC0tIHdlYmIKKwkJCQkgKi8KKwkJCQljb2wgPSB2Y29sID0gY3Vyd2luLT53X3djb2wgPSAwOworCQkJCXB0ciA9IG1sX2dldF9jdXJsaW5lKCk7CisJCQkJd2hpbGUgKGNvbCA8IGN1cndpbi0+d19jdXJzb3IuY29sKQorCQkJCXsKKwkJCQkgICAgaWYgKCF2aW1faXN3aGl0ZShwdHJbY29sXSkpCisJCQkJCWN1cndpbi0+d193Y29sID0gdmNvbDsKKwkJCQkgICAgdmNvbCArPSBsYnJfY2hhcnRhYnNpemUocHRyICsgY29sLAorCQkJCQkJCSAgICAgICAoY29sbnJfVCl2Y29sKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQkJCWNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0ciArIGNvbCk7CisJCQkJICAgIGVsc2UKKyNlbmRpZgorCQkJCQkrK2NvbDsKKwkJCQl9CisJCQkJY3Vyd2luLT53X3dyb3cgPSBjdXJ3aW4tPndfY2xpbmVfcm93CisJCQkJCSAgICsgY3Vyd2luLT53X3djb2wgLyBXX1dJRFRIKGN1cndpbik7CisJCQkJY3Vyd2luLT53X3djb2wgJT0gV19XSURUSChjdXJ3aW4pOworCQkJCWN1cndpbi0+d193Y29sICs9IGN1cndpbl9jb2xfb2ZmKCk7CisjaWZkZWYgRkVBVF9NQllURQorCQkJCWNvbCA9IDA7CS8qIG5vIGNvcnJlY3Rpb24gbmVlZGVkICovCisjZW5kaWYKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQktLWN1cndpbi0+d193Y29sOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCQljb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDE7CisjZW5kaWYKKwkJCSAgICB9CisJCQl9CisJCQllbHNlIGlmIChjdXJ3aW4tPndfcF93cmFwICYmIGN1cndpbi0+d193cm93KQorCQkJeworCQkJICAgIC0tY3Vyd2luLT53X3dyb3c7CisJCQkgICAgY3Vyd2luLT53X3djb2wgPSBXX1dJRFRIKGN1cndpbikgLSAxOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIDE7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJCQlpZiAoaGFzX21ieXRlICYmIGNvbCA+IDAgJiYgY3Vyd2luLT53X3djb2wgPiAwKQorCQkJeworCQkJICAgIC8qIENvcnJlY3Qgd2hlbiB0aGUgY3Vyc29yIGlzIG9uIHRoZSByaWdodCBoYWx2ZQorCQkJICAgICAqIG9mIGEgZG91YmxlLXdpZGUgY2hhcmFjdGVyLiAqLworCQkJICAgIHB0ciA9IG1sX2dldF9jdXJsaW5lKCk7CisJCQkgICAgY29sIC09ICgqbWJfaGVhZF9vZmYpKHB0ciwgcHRyICsgY29sKTsKKwkJCSAgICBpZiAoKCptYl9wdHIyY2VsbHMpKHB0ciArIGNvbCkgPiAxKQorCQkJCS0tY3Vyd2luLT53X3djb2w7CisJCQl9CisjZW5kaWYKKwkJICAgIH0KKwkJICAgIHNldGN1cnNvcigpOworCQkgICAgb3V0X2ZsdXNoKCk7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkJICAgIG5ld193Y29sID0gY3Vyd2luLT53X3djb2w7CisJCSAgICBuZXdfd3JvdyA9IGN1cndpbi0+d193cm93OworI2VuZGlmCisJCSAgICBjdXJ3aW4tPndfd2NvbCA9IG9sZF93Y29sOworCQkgICAgY3Vyd2luLT53X3dyb3cgPSBvbGRfd3JvdzsKKwkJfQorCQlpZiAoYyA8IDApCisJCSAgICBjb250aW51ZTsJLyogZW5kIG9mIGlucHV0IHNjcmlwdCByZWFjaGVkICovCisJCXR5cGVidWYudGJfbGVuICs9IGM7CisKKwkJLyogYnVmZmVyIGZ1bGwsIGRvbid0IG1hcCAqLworCQlpZiAodHlwZWJ1Zi50Yl9sZW4gPj0gdHlwZWJ1Zi50Yl9tYXBsZW4gKyBNQVhNQVBMRU4pCisJCXsKKwkJICAgIHRpbWVkb3V0ID0gVFJVRTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisKKyNpZmRlZiBGRUFUX0VYX0VYVFJBCisJCWlmIChleF9ub3JtYWxfYnVzeSA+IDApCisJCXsKKyMgaWZkZWYgRkVBVF9DTURXSU4KKwkJICAgIHN0YXRpYyBpbnQgdGMgPSAwOworIyBlbmRpZgorCisJCSAgICAvKiBObyB0eXBlYWhlYWQgbGVmdCBhbmQgaW5zaWRlICI6bm9ybWFsIi4gIE11c3QgcmV0dXJuCisJCSAgICAgKiBzb21ldGhpbmcgdG8gYXZvaWQgZ2V0dGluZyBzdHVjay4gIFdoZW4gYW4gaW5jb21wbGV0ZQorCQkgICAgICogbWFwcGluZyBpcyBwcmVzZW50LCBiZWhhdmUgbGlrZSBpdCB0aW1lZCBvdXQuICovCisJCSAgICBpZiAodHlwZWJ1Zi50Yl9sZW4gPiAwKQorCQkgICAgeworCQkJdGltZWRvdXQgPSBUUlVFOworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICAvKiBXaGVuICdpbnNlcnRtb2RlJyBpcyBzZXQsIEVTQyBqdXN0IGJlZXBzIGluIEluc2VydAorCQkgICAgICogbW9kZS4gIFVzZSBDVFJMLUwgdG8gbWFrZSBlZGl0KCkgcmV0dXJuLgorCQkgICAgICogRm9yIHRoZSBjb21tYW5kIGxpbmUgb25seSBDVFJMLUMgYWx3YXlzIGJyZWFrcyBpdC4KKwkJICAgICAqIEZvciB0aGUgY21kbGluZSB3aW5kb3c6IEFsdGVybmF0ZSBiZXR3ZWVuIEVTQyBhbmQKKwkJICAgICAqIENUUkwtQzogRVNDIGZvciBtb3N0IHNpdHVhdGlvbnMgYW5kIENUUkwtQyB0byBjbG9zZSB0aGUKKwkJICAgICAqIGNtZGxpbmUgd2luZG93LiAqLworCQkgICAgaWYgKHBfaW0gJiYgKFN0YXRlICYgSU5TRVJUKSkKKwkJCWMgPSBDdHJsX0w7CisJCSAgICBlbHNlIGlmICgoU3RhdGUgJiBDTURMSU5FKQorIyBpZmRlZiBGRUFUX0NNRFdJTgorCQkJICAgIHx8IChjbWR3aW5fdHlwZSA+IDAgJiYgdGMgPT0gRVNDKQorIyBlbmRpZgorCQkJICAgICkKKwkJCWMgPSBDdHJsX0M7CisJCSAgICBlbHNlCisJCQljID0gRVNDOworIyBpZmRlZiBGRUFUX0NNRFdJTgorCQkgICAgdGMgPSBjOworIyBlbmRpZgorCQkgICAgYnJlYWs7CisJCX0KKyNlbmRpZgorCisvKgorICogZ2V0IGEgY2hhcmFjdGVyOiAzLiBmcm9tIHRoZSB1c2VyIC0gdXBkYXRlIGRpc3BsYXkKKyAqLworCQkvKiBJbiBpbnNlcnQgbW9kZSBhIHNjcmVlbiB1cGRhdGUgaXMgc2tpcHBlZCB3aGVuIGNoYXJhY3RlcnMKKwkJICogYXJlIHN0aWxsIGF2YWlsYWJsZS4gIEJ1dCB3aGVuIHRob3NlIGF2YWlsYWJsZSBjaGFyYWN0ZXJzCisJCSAqIGFyZSBwYXJ0IG9mIGEgbWFwcGluZywgYW5kIHdlIGFyZSBnb2luZyB0byBkbyBhIGJsb2NraW5nCisJCSAqIHdhaXQgaGVyZS4gIE5lZWQgdG8gdXBkYXRlIHRoZSBzY3JlZW4gdG8gZGlzcGxheSB0aGUKKwkJICogY2hhbmdlZCB0ZXh0IHNvIGZhci4gKi8KKwkJaWYgKChTdGF0ZSAmIElOU0VSVCkgJiYgYWR2YW5jZSAmJiBtdXN0X3JlZHJhdyAhPSAwKQorCQl7CisJCSAgICB1cGRhdGVfc2NyZWVuKDApOworCQkgICAgc2V0Y3Vyc29yKCk7IC8qIHB1dCBjdXJzb3IgYmFjayB3aGVyZSBpdCBiZWxvbmdzICovCisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgcGFydGlhbCBtYXRjaCAoYW5kIGFyZSBnb2luZyB0byB3YWl0IGZvciBtb3JlCisJCSAqIGlucHV0IGZyb20gdGhlIHVzZXIpLCBzaG93IHRoZSBwYXJ0aWFsbHkgbWF0Y2hlZCBjaGFyYWN0ZXJzCisJCSAqIHRvIHRoZSB1c2VyIHdpdGggc2hvd2NtZC4KKwkJICovCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkJaSA9IDA7CisjZW5kaWYKKwkJYzEgPSAwOworCQlpZiAodHlwZWJ1Zi50Yl9sZW4gPiAwICYmIGFkdmFuY2UgJiYgIWV4bW9kZV9hY3RpdmUpCisJCXsKKwkJICAgIGlmICgoKFN0YXRlICYgKE5PUk1BTCB8IElOU0VSVCkpIHx8IFN0YXRlID09IExBTkdNQVApCisJCQkgICAgJiYgU3RhdGUgIT0gSElUUkVUVVJOKQorCQkgICAgeworCQkJLyogdGhpcyBsb29rcyBuaWNlIHdoZW4gdHlwaW5nIGEgZGVhZCBjaGFyYWN0ZXIgbWFwICovCisJCQlpZiAoU3RhdGUgJiBJTlNFUlQKKwkJCSAgICAmJiBwdHIyY2VsbHModHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZgorCQkJCQkJICAgKyB0eXBlYnVmLnRiX2xlbiAtIDEpID09IDEpCisJCQl7CisJCQkgICAgZWRpdF9wdXRjaGFyKHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmCisJCQkJCQkrIHR5cGVidWYudGJfbGVuIC0gMV0sIEZBTFNFKTsKKwkJCSAgICBzZXRjdXJzb3IoKTsgLyogcHV0IGN1cnNvciBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MgKi8KKwkJCSAgICBjMSA9IDE7CisJCQl9CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkJCS8qIG5lZWQgdG8gdXNlIHRoZSBjb2wgYW5kIHJvdyBmcm9tIGFib3ZlIGhlcmUgKi8KKwkJCW9sZF93Y29sID0gY3Vyd2luLT53X3djb2w7CisJCQlvbGRfd3JvdyA9IGN1cndpbi0+d193cm93OworCQkJY3Vyd2luLT53X3djb2wgPSBuZXdfd2NvbDsKKwkJCWN1cndpbi0+d193cm93ID0gbmV3X3dyb3c7CisJCQlwdXNoX3Nob3djbWQoKTsKKwkJCWlmICh0eXBlYnVmLnRiX2xlbiA+IFNIT1dDTURfQ09MUykKKwkJCSAgICBpID0gdHlwZWJ1Zi50Yl9sZW4gLSBTSE9XQ01EX0NPTFM7CisJCQl3aGlsZSAoaSA8IHR5cGVidWYudGJfbGVuKQorCQkJICAgICh2b2lkKWFkZF90b19zaG93Y21kKHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmCisJCQkJCQkJCSAgICAgICsgaSsrXSk7CisJCQljdXJ3aW4tPndfd2NvbCA9IG9sZF93Y29sOworCQkJY3Vyd2luLT53X3dyb3cgPSBvbGRfd3JvdzsKKyNlbmRpZgorCQkgICAgfQorCisJCSAgICAvKiB0aGlzIGxvb2tzIG5pY2Ugd2hlbiB0eXBpbmcgYSBkZWFkIGNoYXJhY3RlciBtYXAgKi8KKwkJICAgIGlmICgoU3RhdGUgJiBDTURMSU5FKQorI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpCisJCQkgICAgJiYgY21kbGluZV9zdGFyID09IDAKKyNlbmRpZgorCQkJICAgICYmIHB0cjJjZWxscyh0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmCisJCQkJCQkgICArIHR5cGVidWYudGJfbGVuIC0gMSkgPT0gMSkKKwkJICAgIHsKKwkJCXB1dGNtZGxpbmUodHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYKKwkJCQkJCSsgdHlwZWJ1Zi50Yl9sZW4gLSAxXSwgRkFMU0UpOworCQkJYzEgPSAxOworCQkgICAgfQorCQl9CisKKy8qCisgKiBnZXQgYSBjaGFyYWN0ZXI6IDMuIGZyb20gdGhlIHVzZXIgLSBnZXQgaXQKKyAqLworCQljID0gaW5jaGFyKHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYgKyB0eXBlYnVmLnRiX2xlbiwKKwkJCXR5cGVidWYudGJfYnVmbGVuIC0gdHlwZWJ1Zi50Yl9vZmYgLSB0eXBlYnVmLnRiX2xlbiAtIDEsCisJCQkhYWR2YW5jZQorCQkJICAgID8gMAorCQkJICAgIDogKCh0eXBlYnVmLnRiX2xlbiA9PSAwCisJCQkJICAgIHx8ICEocF90aW1lb3V0IHx8IChwX3R0aW1lb3V0CisJCQkJCQkgICAmJiBrZXlsZW4gPT0gS0xfUEFSVF9LRVkpKSkKKwkJCQkgICAgPyAtMUwKKwkJCQkgICAgOiAoKGtleWxlbiA9PSBLTF9QQVJUX0tFWSAmJiBwX3R0bSA+PSAwKQorCQkJCQkgICAgPyBwX3R0bQorCQkJCQkgICAgOiBwX3RtKSksIHR5cGVidWYudGJfY2hhbmdlX2NudCk7CisKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCQlpZiAoaSAhPSAwKQorCQkgICAgcG9wX3Nob3djbWQoKTsKKyNlbmRpZgorCQlpZiAoYzEgPT0gMSkKKwkJeworCQkgICAgaWYgKFN0YXRlICYgSU5TRVJUKQorCQkJZWRpdF91bnB1dGNoYXIoKTsKKwkJICAgIGlmIChTdGF0ZSAmIENNRExJTkUpCisJCQl1bnB1dGNtZGxpbmUoKTsKKwkJICAgIHNldGN1cnNvcigpOwkvKiBwdXQgY3Vyc29yIGJhY2sgd2hlcmUgaXQgYmVsb25ncyAqLworCQl9CisKKwkJaWYgKGMgPCAwKQorCQkgICAgY29udGludWU7CQkvKiBlbmQgb2YgaW5wdXQgc2NyaXB0IHJlYWNoZWQgKi8KKwkJaWYgKGMgPT0gTlVMKQkJLyogbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSAqLworCQl7CisJCSAgICBpZiAoIWFkdmFuY2UpCisJCQlicmVhazsKKwkJICAgIGlmICh0eXBlYnVmLnRiX2xlbiA+IDApCS8qIHRpbWVkIG91dCAqLworCQkgICAgeworCQkJdGltZWRvdXQgPSBUUlVFOworCQkJY29udGludWU7CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQl7CSAgICAvKiBhbGxvdyBtYXBwaW5nIGZvciBqdXN0IHR5cGVkIGNoYXJhY3RlcnMgKi8KKwkJICAgIHdoaWxlICh0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZgorCQkJCQkJICAgICArIHR5cGVidWYudGJfbGVuXSAhPSBOVUwpCisJCQl0eXBlYnVmLnRiX25vcmVtYXBbdHlwZWJ1Zi50Yl9vZmYKKwkJCQkJCSArIHR5cGVidWYudGJfbGVuKytdID0gUk1fWUVTOworI2lmZGVmIFVTRV9JTV9DT05UUk9MCisJCSAgICAvKiBHZXQgSU0gc3RhdHVzIHJpZ2h0IGFmdGVyIGdldHRpbmcga2V5cywgbm90IGFmdGVyIHRoZQorCQkgICAgICogdGltZW91dCBmb3IgYSBtYXBwaW5nIChmb2N1cyBtYXkgYmUgbG9zdCBieSB0aGVuKS4gKi8KKwkJICAgIHZnZXRjX2ltX2FjdGl2ZSA9IGltX2dldF9zdGF0dXMoKTsKKyNlbmRpZgorCQl9CisJICAgIH0JICAgIC8qIGZvciAoOzspICovCisJfQkvKiBpZiAoIWNoYXJhY3RlciBmcm9tIHN0dWZmYnVmKSAqLworCisJCQkvKiBpZiBhZHZhbmNlIGlzIEZBTFNFIGRvbid0IGxvb3Agb24gTlVMcyAqLworICAgIH0gd2hpbGUgKGMgPCAwIHx8IChhZHZhbmNlICYmIGMgPT0gTlVMKSk7CisKKyAgICAvKgorICAgICAqIFRoZSAiSU5TRVJUIiBtZXNzYWdlIGlzIHRha2VuIGNhcmUgb2YgaGVyZToKKyAgICAgKgkgaWYgd2UgcmV0dXJuIGFuIEVTQyB0byBleGl0IGluc2VydCBtb2RlLCB0aGUgbWVzc2FnZSBpcyBkZWxldGVkCisgICAgICoJIGlmIHdlIGRvbid0IHJldHVybiBhbiBFU0MgYnV0IGRlbGV0ZWQgdGhlIG1lc3NhZ2UgYmVmb3JlLCByZWRpc3BsYXkgaXQKKyAgICAgKi8KKyAgICBpZiAoYWR2YW5jZSAmJiBwX3NtZCAmJiAoU3RhdGUgJiBJTlNFUlQpKQorICAgIHsKKwlpZiAoYyA9PSBFU0MgJiYgIW1vZGVfZGVsZXRlZCAmJiAhbm9fbWFwcGluZykKKwl7CisJICAgIGlmICh0eXBlYnVmLnRiX2xlbiAmJiAhS2V5VHlwZWQpCisJCXJlZHJhd19jbWRsaW5lID0gVFJVRTsJICAgIC8qIGRlbGV0ZSBtb2RlIGxhdGVyICovCisJICAgIGVsc2UKKwkJdW5zaG93bW9kZShGQUxTRSk7CisJfQorCWVsc2UgaWYgKGMgIT0gRVNDICYmIG1vZGVfZGVsZXRlZCkKKwl7CisJICAgIGlmICh0eXBlYnVmLnRiX2xlbiAmJiAhS2V5VHlwZWQpCisJCXJlZHJhd19jbWRsaW5lID0gVFJVRTsJICAgIC8qIHNob3cgbW9kZSBsYXRlciAqLworCSAgICBlbHNlCisJCXNob3dtb2RlKCk7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qIG1heSB1bnNob3cgZGlmZmVyZW50IGN1cnNvciBzaGFwZSAqLworICAgIGlmIChndWkuaW5fdXNlICYmIHNoYXBlX2NoYW5nZWQpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworI2VuZGlmCisKKyAgICB2Z2V0Y19idXN5ID0gRkFMU0U7CisKKyAgICByZXR1cm4gYzsKK30KKworLyoKKyAqIGluY2hhcigpIC0gZ2V0IG9uZSBjaGFyYWN0ZXIgZnJvbQorICoJMS4gYSBzY3JpcHRmaWxlCisgKgkyLiB0aGUga2V5Ym9hcmQKKyAqCisgKiAgQXMgbXVjaCBjaGFyYWN0ZXJzIGFzIHdlIGNhbiBnZXQgKHVwdG8gJ21heGxlbicpIGFyZSBwdXQgaW4gImJ1ZiIgYW5kCisgKiAgTlVMIHRlcm1pbmF0ZWQgKGJ1ZmZlciBsZW5ndGggbXVzdCBiZSAnbWF4bGVuJyArIDEpLgorICogIE1pbmltdW0gZm9yICJtYXhsZW4iIGlzIDMhISEhCisgKgorICogICJ0Yl9jaGFuZ2VfY250IiBpcyB0aGUgdmFsdWUgb2YgdHlwZWJ1Zi50Yl9jaGFuZ2VfY250IGlmICJidWYiIHBvaW50cyBpbnRvCisgKiAgaXQuICBXaGVuIHR5cGVidWYudGJfY2hhbmdlX2NudCBjaGFuZ2VzIChlLmcuLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZAorICogIGZyb20gYSByZW1vdGUgY2xpZW50KSAiYnVmIiBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICAidGJfY2hhbmdlX2NudCIgaXMgMAorICogIG90aGVyd2lzZS4KKyAqCisgKiAgSWYgd2UgZ290IGFuIGludGVycnVwdCBhbGwgaW5wdXQgaXMgcmVhZCB1bnRpbCBub25lIGlzIGF2YWlsYWJsZS4KKyAqCisgKiAgSWYgd2FpdF90aW1lID09IDAgIHRoZXJlIGlzIG5vIHdhaXRpbmcgZm9yIHRoZSBjaGFyLgorICogIElmIHdhaXRfdGltZSA9PSBuICB3ZSB3YWl0IGZvciBuIG1zZWMgZm9yIGEgY2hhcmFjdGVyIHRvIGFycml2ZS4KKyAqICBJZiB3YWl0X3RpbWUgPT0gLTEgd2Ugd2FpdCBmb3JldmVyIGZvciBhIGNoYXJhY3RlciB0byBhcnJpdmUuCisgKgorICogIFJldHVybiB0aGUgbnVtYmVyIG9mIG9idGFpbmVkIGNoYXJhY3RlcnMuCisgKiAgUmV0dXJuIC0xIHdoZW4gZW5kIG9mIGlucHV0IHNjcmlwdCByZWFjaGVkLgorICovCisgICAgaW50CitpbmNoYXIoYnVmLCBtYXhsZW4sIHdhaXRfdGltZSwgdGJfY2hhbmdlX2NudCkKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCW1heGxlbjsKKyAgICBsb25nCXdhaXRfdGltZTsJICAgIC8qIG1pbGxpIHNlY29uZHMgKi8KKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQ7Cit7CisgICAgaW50CQlsZW4gPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisgICAgaW50CQlyZXRlc2MgPSBGQUxTRTsJICAgIC8qIHJldHVybiBFU0Mgd2l0aCBnb3RpbnQgKi8KKyAgICBpbnQJCXNjcmlwdF9jaGFyOworCisgICAgaWYgKHdhaXRfdGltZSA9PSAtMUwgfHwgd2FpdF90aW1lID4gMTAwTCkgIC8qIGZsdXNoIG91dHB1dCBiZWZvcmUgd2FpdGluZyAqLworICAgIHsKKwljdXJzb3Jfb24oKTsKKwlvdXRfZmx1c2goKTsKKyNpZmRlZiBGRUFUX0dVSQorCWlmIChndWkuaW5fdXNlKQorCXsKKwkgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoRkFMU0UsIEZBTFNFKTsKKyMgaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJICAgIGlmIChwb3N0cG9uZWRfbW91c2VzaGFwZSkKKwkJdXBkYXRlX21vdXNlc2hhcGUoLTEpOworIyBlbmRpZgorCX0KKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogRG9uJ3QgcmVzZXQgdGhlc2Ugd2hlbiBhdCB0aGUgaGl0LXJldHVybiBwcm9tcHQsIG90aGVyd2lzZSBhIGVuZGxlc3MKKyAgICAgKiByZWN1cnNpdmUgbG9vcCBtYXkgcmVzdWx0ICh3cml0ZSBlcnJvciBpbiBzd2FwZmlsZSwgaGl0LXJldHVybiwgdGltZW91dAorICAgICAqIG9uIGNoYXIgd2FpdCwgZmx1c2ggc3dhcGZpbGUsIHdyaXRlIGVycm9yLi4uLikuCisgICAgICovCisgICAgaWYgKFN0YXRlICE9IEhJVFJFVFVSTikKKyAgICB7CisJZGlkX291dG9mbWVtX21zZyA9IEZBTFNFOyAgIC8qIGRpc3BsYXkgb3V0IG9mIG1lbW9yeSBtZXNzYWdlIChhZ2FpbikgKi8KKwlkaWRfc3dhcHdyaXRlX21zZyA9IEZBTFNFOyAgLyogZGlzcGxheSBzd2FwIGZpbGUgd3JpdGUgZXJyb3IgYWdhaW4gKi8KKyAgICB9CisgICAgdW5kb19vZmYgPSBGQUxTRTsJCSAgICAvKiByZXN0YXJ0IHVuZG8gbm93ICovCisKKyAgICAvKgorICAgICAqIGZpcnN0IHRyeSBzY3JpcHQgZmlsZQorICAgICAqCUlmIGludGVycnVwdGVkOiBTdG9wIHJlYWRpbmcgc2NyaXB0IGZpbGVzLgorICAgICAqLworICAgIHNjcmlwdF9jaGFyID0gLTE7CisgICAgd2hpbGUgKHNjcmlwdGluW2N1cnNjcmlwdF0gIT0gTlVMTCAmJiBzY3JpcHRfY2hhciA8IDApCisgICAgeworCWlmIChnb3RfaW50IHx8IChzY3JpcHRfY2hhciA9IGdldGMoc2NyaXB0aW5bY3Vyc2NyaXB0XSkpIDwgMCkKKwl7CisJICAgIC8qIFJlYWNoZWQgRU9GLgorCSAgICAgKiBDYXJlZnVsOiBjbG9zZXNjcmlwdCgpIGZyZWVzIHR5cGVidWYudGJfYnVmW10gYW5kIGJ1ZltdIG1heQorCSAgICAgKiBwb2ludCBpbnNpZGUgdHlwZWJ1Zi50Yl9idWZbXS4gIERvbid0IHVzZSBidWZbXSBhZnRlciB0aGlzISAqLworCSAgICBjbG9zZXNjcmlwdCgpOworCSAgICAvKgorCSAgICAgKiBXaGVuIHJlYWRpbmcgc2NyaXB0IGZpbGUgaXMgaW50ZXJydXB0ZWQsIHJldHVybiBhbiBFU0MgdG8gZ2V0CisJICAgICAqIGJhY2sgdG8gbm9ybWFsIG1vZGUuCisJICAgICAqIE90aGVyd2lzZSByZXR1cm4gLTEsIGJlY2F1c2UgdHlwZWJ1Zi50Yl9idWZbXSBoYXMgY2hhbmdlZC4KKwkgICAgICovCisJICAgIGlmIChnb3RfaW50KQorCQlyZXRlc2MgPSBUUlVFOworCSAgICBlbHNlCisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwkgICAgYnVmWzBdID0gc2NyaXB0X2NoYXI7CisJICAgIGxlbiA9IDE7CisJfQorICAgIH0KKworICAgIGlmIChzY3JpcHRfY2hhciA8IDApCS8qIGRpZCBub3QgZ2V0IGEgY2hhcmFjdGVyIGZyb20gc2NyaXB0ICovCisgICAgeworCS8qCisJICogSWYgd2UgZ290IGFuIGludGVycnVwdCwgc2tpcCBhbGwgcHJldmlvdXNseSB0eXBlZCBjaGFyYWN0ZXJzIGFuZAorCSAqIHJldHVybiBUUlVFIGlmIHF1aXQgcmVhZGluZyBzY3JpcHQgZmlsZS4KKwkgKiBTdG9wIHJlYWRpbmcgdHlwZWFoZWFkIHdoZW4gYSBzaW5nbGUgQ1RSTC1DIHdhcyByZWFkLAorCSAqIGZpbGxfaW5wdXRfYnVmKCkgcmV0dXJucyB0aGlzIHdoZW4gbm90IGFibGUgdG8gcmVhZCBmcm9tIHN0ZGluLgorCSAqIERvbid0IHVzZSBidWZbXSBoZXJlLCBjbG9zZXNjcmlwdCgpIG1heSBoYXZlIGZyZWVkIHR5cGVidWYudGJfYnVmW10KKwkgKiBhbmQgYnVmIG1heSBiZSBwb2ludGluZyBpbnNpZGUgdHlwZWJ1Zi50Yl9idWZbXS4KKwkgKi8KKwlpZiAoZ290X2ludCkKKwl7CisjZGVmaW5lIERVTV9MRU4gTUFYTUFQTEVOICogMyArIDMKKwkgICAgY2hhcl91CWR1bVtEVU1fTEVOICsgMV07CisKKwkgICAgZm9yICg7OykKKwkgICAgeworCQlsZW4gPSB1aV9pbmNoYXIoZHVtLCBEVU1fTEVOLCAwTCwgMCk7CisJCWlmIChsZW4gPT0gMCB8fCAobGVuID09IDEgJiYgZHVtWzBdID09IDMpKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgcmV0dXJuIHJldGVzYzsKKwl9CisKKwkvKgorCSAqIEFsd2F5cyBmbHVzaCB0aGUgb3V0cHV0IGNoYXJhY3RlcnMgd2hlbiBnZXR0aW5nIGlucHV0IGNoYXJhY3RlcnMKKwkgKiBmcm9tIHRoZSB1c2VyLgorCSAqLworCW91dF9mbHVzaCgpOworCisJLyoKKwkgKiBGaWxsIHVwIHRvIGEgdGhpcmQgb2YgdGhlIGJ1ZmZlciwgYmVjYXVzZSBlYWNoIGNoYXJhY3RlciBtYXkgYmUKKwkgKiB0cmlwbGVkIGJlbG93LgorCSAqLworCWxlbiA9IHVpX2luY2hhcihidWYsIG1heGxlbiAvIDMsIHdhaXRfdGltZSwgdGJfY2hhbmdlX2NudCk7CisgICAgfQorCisgICAgaWYgKHR5cGVidWZfY2hhbmdlZCh0Yl9jaGFuZ2VfY250KSkKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiBmaXhfaW5wdXRfYnVmZmVyKGJ1ZiwgbGVuLCBzY3JpcHRfY2hhciA+PSAwKTsKK30KKworLyoKKyAqIEZpeCB0eXBlZCBjaGFyYWN0ZXJzIGZvciB1c2UgYnkgdmdldGMoKSBhbmQgY2hlY2tfdGVybWNvZGUoKS4KKyAqIGJ1ZltdIG11c3QgaGF2ZSByb29tIHRvIHRyaXBsZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIQorICogUmV0dXJucyB0aGUgbmV3IGxlbmd0aC4KKyAqLworICAgIGludAorZml4X2lucHV0X2J1ZmZlcihidWYsIGxlbiwgc2NyaXB0KQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbGVuOworICAgIGludAkJc2NyaXB0OwkJLyogVFJVRSB3aGVuIHJlYWRpbmcgZnJvbSBhIHNjcmlwdCAqLworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnAgPSBidWY7CisKKyAgICAvKgorICAgICAqIFR3byBjaGFyYWN0ZXJzIGFyZSBzcGVjaWFsOiBOVUwgYW5kIEtfU1BFQ0lBTC4KKyAgICAgKiBXaGVuIGNvbXBpbGVkIFdpdGggdGhlIEdVSSBDU0kgaXMgYWxzbyBzcGVjaWFsLgorICAgICAqIFJlcGxhY2UJICAgICBOVUwgYnkgS19TUEVDSUFMIEtTX1pFUk8JIEtFX0ZJTExFUgorICAgICAqIFJlcGxhY2UgS19TUEVDSUFMIGJ5IEtfU1BFQ0lBTCBLU19TUEVDSUFMIEtFX0ZJTExFUgorICAgICAqIFJlcGxhY2UgICAgICAgQ1NJIGJ5IEtfU1BFQ0lBTCBLU19FWFRSQSAgIEtFX0NTSQorICAgICAqIERvbid0IHJlcGxhY2UgS19TUEVDSUFMIHdoZW4gcmVhZGluZyBhIHNjcmlwdCBmaWxlLgorICAgICAqLworICAgIGZvciAoaSA9IGxlbjsgLS1pID49IDA7ICsrcCkKKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwkvKiBXaGVuIHRoZSBHVUkgaXMgdXNlZCBhbnkgY2hhcmFjdGVyIGNhbiBjb21lIGFmdGVyIGEgQ1NJLCBkb24ndAorCSAqIGVzY2FwZSBpdC4gKi8KKwlpZiAoZ3VpLmluX3VzZSAmJiBwWzBdID09IENTSSAmJiBpID49IDIpCisJeworCSAgICBwICs9IDI7CisJICAgIGkgLT0gMjsKKwl9CisJLyogV2hlbiB0aGUgR1VJIGlzIG5vdCB1c2VkIENTSSBuZWVkcyB0byBiZSBlc2NhcGVkLiAqLworCWVsc2UgaWYgKCFndWkuaW5fdXNlICYmIHBbMF0gPT0gQ1NJKQorCXsKKwkgICAgbWNoX21lbW1vdmUocCArIDMsIHAgKyAxLCAoc2l6ZV90KWkpOworCSAgICAqcCsrID0gS19TUEVDSUFMOworCSAgICAqcCsrID0gS1NfRVhUUkE7CisJICAgICpwID0gKGludClLRV9DU0k7CisJICAgIGxlbiArPSAyOworCX0KKwllbHNlCisjZW5kaWYKKwlpZiAocFswXSA9PSBOVUwgfHwgKHBbMF0gPT0gS19TUEVDSUFMICYmICFzY3JpcHQKKyNpZiBkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJKQorCQkgICAgLyogV2luMzIgY29uc29sZSBwYXNzZXMgbW9kaWZpZXJzICovCisJCSAgICAmJiAoaSA8IDIgfHwgcFsxXSAhPSBLU19NT0RJRklFUikKKyNlbmRpZgorCQkgICAgKSkKKwl7CisJICAgIG1jaF9tZW1tb3ZlKHAgKyAzLCBwICsgMSwgKHNpemVfdClpKTsKKwkgICAgcFsyXSA9IEtfVEhJUkQocFswXSk7CisJICAgIHBbMV0gPSBLX1NFQ09ORChwWzBdKTsKKwkgICAgcFswXSA9IEtfU1BFQ0lBTDsKKwkgICAgcCArPSAyOworCSAgICBsZW4gKz0gMjsKKwl9CisgICAgfQorICAgICpwID0gTlVMOwkJLyogYWRkIHRyYWlsaW5nIE5VTCAqLworICAgIHJldHVybiBsZW47Cit9CisKKyNpZiBkZWZpbmVkKFVTRV9JTlBVVF9CVUYpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBieXRlcyBhcmUgaW4gdGhlIGlucHV0IGJ1ZmZlciBvciBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlci4KKyAqIE5vcm1hbGx5IHRoZSBpbnB1dCBidWZmZXIgd291bGQgYmUgc3VmZmljaWVudCwgYnV0IHRoZSBzZXJ2ZXJfdG9faW5wdXRfYnVmKCkKKyAqIG1heSBpbnNlcnQgY2hhcmFjdGVycyBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlciB3aGlsZSB3ZSBhcmUgd2FpdGluZyBmb3IKKyAqIGlucHV0IHRvIGFycml2ZS4KKyAqLworICAgIGludAoraW5wdXRfYXZhaWxhYmxlKCkKK3sKKyAgICByZXR1cm4gKCF2aW1faXNfaW5wdXRfYnVmX2VtcHR5KCkKKyMgaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKKwkgICAgfHwgcmVjZWl2ZWRfZnJvbV9jbGllbnQKKyMgZW5kaWYKKwkgICAgKTsKK30KKyNlbmRpZgorCisvKgorICogbWFwWyFdCQkgICAgOiBzaG93IGFsbCBrZXkgbWFwcGluZ3MKKyAqIG1hcFshXSB7bGhzfQkJICAgIDogc2hvdyBrZXkgbWFwcGluZyBmb3Ige2xoc30KKyAqIG1hcFshXSB7bGhzfSB7cmhzfQkgICAgOiBzZXQga2V5IG1hcHBpbmcgZm9yIHtsaHN9IHRvIHtyaHN9CisgKiBub3JlbWFwWyFdIHtsaHN9IHtyaHN9ICAgOiBzYW1lLCBidXQgbm8gcmVtYXBwaW5nIGZvciB7cmhzfQorICogdW5tYXBbIV0ge2xoc30JICAgIDogcmVtb3ZlIGtleSBtYXBwaW5nIGZvciB7bGhzfQorICogYWJicgkJCSAgICA6IHNob3cgYWxsIGFiYnJldmlhdGlvbnMKKyAqIGFiYnIge2xoc30JCSAgICA6IHNob3cgYWJicmV2aWF0aW9ucyBmb3Ige2xoc30KKyAqIGFiYnIge2xoc30ge3Joc30JICAgIDogc2V0IGFiYnJldmlhdGlvbiBmb3Ige2xoc30gdG8ge3Joc30KKyAqIG5vcmVhYmJyIHtsaHN9IHtyaHN9CSAgICA6IHNhbWUsIGJ1dCBubyByZW1hcHBpbmcgZm9yIHtyaHN9CisgKiB1bmFiYnIge2xoc30JCSAgICA6IHJlbW92ZSBhYmJyZXZpYXRpb24gZm9yIHtsaHN9CisgKgorICogbWFwdHlwZTogMCBmb3IgOm1hcCwgMSBmb3IgOnVubWFwLCAyIGZvciBub3JlbWFwLgorICoKKyAqIGFyZyBpcyBwb2ludGVyIHRvIGFueSBhcmd1bWVudHMuIE5vdGU6IGFyZyBjYW5ub3QgYmUgYSByZWFkLW9ubHkgc3RyaW5nLAorICogaXQgd2lsbCBiZSBtb2RpZmllZC4KKyAqCisgKiBmb3IgOm1hcCAgIG1vZGUgaXMgTk9STUFMICsgVklTVUFMICsgT1BfUEVORElORworICogZm9yIDptYXAhICBtb2RlIGlzIElOU0VSVCArIENNRExJTkUKKyAqIGZvciA6Y21hcCAgbW9kZSBpcyBDTURMSU5FCisgKiBmb3IgOmltYXAgIG1vZGUgaXMgSU5TRVJUCisgKiBmb3IgOmxtYXAgIG1vZGUgaXMgTEFOR01BUAorICogZm9yIDpubWFwICBtb2RlIGlzIE5PUk1BTAorICogZm9yIDp2bWFwICBtb2RlIGlzIFZJU1VBTAorICogZm9yIDpvbWFwICBtb2RlIGlzIE9QX1BFTkRJTkcKKyAqCisgKiBmb3IgOmFiYnIgIG1vZGUgaXMgSU5TRVJUICsgQ01ETElORQorICogZm9yIDppYWJiciBtb2RlIGlzIElOU0VSVAorICogZm9yIDpjYWJiciBtb2RlIGlzIENNRExJTkUKKyAqCisgKiBSZXR1cm4gMCBmb3Igc3VjY2VzcworICoJICAxIGZvciBpbnZhbGlkIGFyZ3VtZW50cworICoJICAyIGZvciBubyBtYXRjaAorICoJICA0IGZvciBvdXQgb2YgbWVtCisgKgkgIDUgZm9yIGVudHJ5IG5vdCB1bmlxdWUKKyAqLworICAgIGludAorZG9fbWFwKG1hcHR5cGUsIGFyZywgbW9kZSwgYWJicmV2KQorICAgIGludAkJbWFwdHlwZTsKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCW1vZGU7CisgICAgaW50CQlhYmJyZXY7CQkvKiBub3QgYSBtYXBwaW5nIGJ1dCBhbiBhYmJyZXZpYXRpb24gKi8KK3sKKyAgICBjaGFyX3UJKmtleXM7CisgICAgbWFwYmxvY2tfVAkqbXAsICoqbXBwOworICAgIGNoYXJfdQkqcmhzOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCW47CisgICAgaW50CQlsZW4gPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBjaGFyX3UJKm5ld3N0cjsKKyAgICBpbnQJCWhhc2FyZzsKKyAgICBpbnQJCWhhc2tleTsKKyAgICBpbnQJCWRpZF9pdCA9IEZBTFNFOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBpbnQJCWRpZF9sb2NhbCA9IEZBTFNFOworI2VuZGlmCisgICAgaW50CQlyb3VuZDsKKyAgICBjaGFyX3UJKmtleXNfYnVmID0gTlVMTDsKKyAgICBjaGFyX3UJKmFyZ19idWYgPSBOVUxMOworICAgIGludAkJcmV0dmFsID0gMDsKKyAgICBpbnQJCWRvX2JhY2tzbGFzaDsKKyAgICBpbnQJCWhhc2g7CisgICAgaW50CQluZXdfaGFzaDsKKyAgICBtYXBibG9ja19UCSoqYWJicl90YWJsZTsKKyAgICBtYXBibG9ja19UCSoqbWFwX3RhYmxlOworICAgIGludAkJdW5pcXVlID0gRkFMU0U7CisgICAgaW50CQlzaWxlbnQgPSBGQUxTRTsKKyAgICBpbnQJCW5vcmVtYXA7CisKKyAgICBrZXlzID0gYXJnOworICAgIG1hcF90YWJsZSA9IG1hcGhhc2g7CisgICAgYWJicl90YWJsZSA9ICZmaXJzdF9hYmJyOworCisgICAgLyogRm9yICI6bm9yZW1hcCIgZG9uJ3QgcmVtYXAsIG90aGVyd2lzZSBkbyByZW1hcC4gKi8KKyAgICBpZiAobWFwdHlwZSA9PSAyKQorCW5vcmVtYXAgPSBSRU1BUF9OT05FOworICAgIGVsc2UKKwlub3JlbWFwID0gUkVNQVBfWUVTOworCisgICAgLyogQWNjZXB0IDxidWZmZXI+LCA8c2lsZW50PiwgPHNjcmlwdD4gYW5kIDx1bmlxdWU+IGluIGFueSBvcmRlci4gKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJLyoKKwkgKiBDaGVjayBmb3IgIjxidWZmZXI+IjogbWFwcGluZyBsb2NhbCB0byBidWZmZXIuCisJICovCisJaWYgKFNUUk5DTVAoa2V5cywgIjxidWZmZXI+IiwgOCkgPT0gMCkKKwl7CisJICAgIGtleXMgPSBza2lwd2hpdGUoa2V5cyArIDgpOworCSAgICBtYXBfdGFibGUgPSBjdXJidWYtPmJfbWFwaGFzaDsKKwkgICAgYWJicl90YWJsZSA9ICZjdXJidWYtPmJfZmlyc3RfYWJicjsKKwkgICAgY29udGludWU7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIENoZWNrIGZvciAiPHNpbGVudD4iOiBkb24ndCBlY2hvIGNvbW1hbmRzLgorCSAqLworCWlmIChTVFJOQ01QKGtleXMsICI8c2lsZW50PiIsIDgpID09IDApCisJeworCSAgICBrZXlzID0gc2tpcHdoaXRlKGtleXMgKyA4KTsKKwkgICAgc2lsZW50ID0gVFJVRTsKKwkgICAgY29udGludWU7CisJfQorCisjaWZkZWYgRkVBVF9FVkFMCisJLyoKKwkgKiBDaGVjayBmb3IgIjxzY3JpcHQ+IjogcmVtYXAgc2NyaXB0LWxvY2FsIG1hcHBpbmdzIG9ubHkKKwkgKi8KKwlpZiAoU1RSTkNNUChrZXlzLCAiPHNjcmlwdD4iLCA4KSA9PSAwKQorCXsKKwkgICAga2V5cyA9IHNraXB3aGl0ZShrZXlzICsgOCk7CisJICAgIG5vcmVtYXAgPSBSRU1BUF9TQ1JJUFQ7CisJICAgIGNvbnRpbnVlOworCX0KKyNlbmRpZgorCS8qCisJICogQ2hlY2sgZm9yICI8dW5pcXVlPiI6IGRvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBtYXBwaW5nLgorCSAqLworCWlmIChTVFJOQ01QKGtleXMsICI8dW5pcXVlPiIsIDgpID09IDApCisJeworCSAgICBrZXlzID0gc2tpcHdoaXRlKGtleXMgKyA4KTsKKwkgICAgdW5pcXVlID0gVFJVRTsKKwkgICAgY29udGludWU7CisJfQorCWJyZWFrOworICAgIH0KKworICAgIHZhbGlkYXRlX21hcGhhc2goKTsKKworICAgIC8qCisgICAgICogZmluZCBlbmQgb2Yga2V5cyBhbmQgc2tpcCBDVFJMLVZzIChhbmQgYmFja3NsYXNoZXMpIGluIGl0CisgICAgICogQWNjZXB0IGJhY2tzbGFzaCBsaWtlIENUUkwtViB3aGVuICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ0InLgorICAgICAqIHdpdGggOnVubWFwIHdoaXRlIHNwYWNlIGlzIGluY2x1ZGVkIGluIHRoZSBrZXlzLCBubyBhcmd1bWVudCBwb3NzaWJsZQorICAgICAqLworICAgIHAgPSBrZXlzOworICAgIGRvX2JhY2tzbGFzaCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlNMQVNIKSA9PSBOVUxMKTsKKyAgICB3aGlsZSAoKnAgJiYgKG1hcHR5cGUgPT0gMSB8fCAhdmltX2lzd2hpdGUoKnApKSkKKyAgICB7CisJaWYgKChwWzBdID09IEN0cmxfViB8fCAoZG9fYmFja3NsYXNoICYmIHBbMF0gPT0gJ1xcJykpICYmCisJCQkJCQkJCSAgcFsxXSAhPSBOVUwpCisJICAgICsrcDsJCS8qIHNraXAgQ1RSTC1WIG9yIGJhY2tzbGFzaCAqLworCSsrcDsKKyAgICB9CisgICAgaWYgKCpwICE9IE5VTCkKKwkqcCsrID0gTlVMOworICAgIHAgPSBza2lwd2hpdGUocCk7CisgICAgcmhzID0gcDsKKyAgICBoYXNhcmcgPSAoKnJocyAhPSBOVUwpOworICAgIGhhc2tleSA9ICgqa2V5cyAhPSBOVUwpOworCisgICAgLyogY2hlY2sgZm9yIDp1bm1hcCB3aXRob3V0IGFyZ3VtZW50ICovCisgICAgaWYgKG1hcHR5cGUgPT0gMSAmJiAhaGFza2V5KQorICAgIHsKKwlyZXR2YWwgPSAxOworCWdvdG8gdGhlZW5kOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgbWFwcGluZyBoYXMgYmVlbiBnaXZlbiBhcyBeVjxDX1VQPiBzYXksIHRoZW4gcmVwbGFjZSB0aGUgdGVybSBjb2RlcworICAgICAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIHR3byBieXRlcy4gSWYgaXQgaXMgYSBzaGlmdGVkIHNwZWNpYWwga2V5LCB1bnNoaWZ0CisgICAgICogaXQgdG9vLCBnaXZpbmcgYW5vdGhlciB0d28gYnl0ZXMuCisgICAgICogcmVwbGFjZV90ZXJtY29kZXMoKSBtYXkgbW92ZSB0aGUgcmVzdWx0IHRvIGFsbG9jYXRlZCBtZW1vcnksIHdoaWNoCisgICAgICogbmVlZHMgdG8gYmUgZnJlZWQgbGF0ZXIgKCprZXlzX2J1ZiBhbmQgKmFyZ19idWYpLgorICAgICAqIHJlcGxhY2VfdGVybWNvZGVzKCkgYWxzbyByZW1vdmVzIENUUkwtVnMgYW5kIHNvbWV0aW1lcyBiYWNrc2xhc2hlcy4KKyAgICAgKi8KKyAgICBpZiAoaGFza2V5KQorCWtleXMgPSByZXBsYWNlX3Rlcm1jb2RlcyhrZXlzLCAma2V5c19idWYsIFRSVUUsIFRSVUUpOworICAgIGlmIChoYXNhcmcpCisgICAgeworCWlmIChTVFJJQ01QKHJocywgIjxub3A+IikgPT0gMCkJICAgIC8qICI8Tm9wPiIgbWVhbnMgbm90aGluZyAqLworCSAgICByaHMgPSAoY2hhcl91ICopIiI7CisJZWxzZQorCSAgICByaHMgPSByZXBsYWNlX3Rlcm1jb2RlcyhyaHMsICZhcmdfYnVmLCBGQUxTRSwgVFJVRSk7CisgICAgfQorCisjaWZkZWYgRkVBVF9GS01BUAorICAgIC8qCisgICAgICogd2hlbiBpbiByaWdodC10by1sZWZ0IG1vZGUgYW5kIGFsdGVybmF0ZSBrZXltYXAgb3B0aW9uIHNldCwKKyAgICAgKiByZXZlcnNlIHRoZSBjaGFyYWN0ZXIgZmxvdyBpbiB0aGUgcmhzIGluIEZhcnNpLgorICAgICAqLworICAgIGlmIChwX2FsdGtleW1hcCAmJiBjdXJ3aW4tPndfcF9ybCkKKwlscnN3YXAocmhzKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBjaGVjayBhcmd1bWVudHMgYW5kIHRyYW5zbGF0ZSBmdW5jdGlvbiBrZXlzCisgICAgICovCisgICAgaWYgKGhhc2tleSkKKyAgICB7CisJbGVuID0gKGludClTVFJMRU4oa2V5cyk7CisJaWYgKGxlbiA+IE1BWE1BUExFTikJCS8qIG1heGltdW0gbGVuZ3RoIG9mIE1BWE1BUExFTiBjaGFycyAqLworCXsKKwkgICAgcmV0dmFsID0gMTsKKwkgICAgZ290byB0aGVlbmQ7CisJfQorCisJaWYgKGFiYnJldiAmJiBtYXB0eXBlICE9IDEpCisJeworCSAgICAvKgorCSAgICAgKiBJZiBhbiBhYmJyZXZpYXRpb24gZW5kcyBpbiBhIGtleXdvcmQgY2hhcmFjdGVyLCB0aGUKKwkgICAgICogcmVzdCBtdXN0IGJlIGFsbCBrZXl3b3JkLWNoYXIgb3IgYWxsIG5vbi1rZXl3b3JkLWNoYXIuCisJICAgICAqIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIGl0IGluIGEKKwkgICAgICogdmktY29tcGF0aWJsZSB3YXkuCisJICAgICAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlpbnQJZmlyc3QsIGxhc3Q7CisJCWludAlzYW1lID0gLTE7CisKKwkJZmlyc3QgPSB2aW1faXN3b3JkcChrZXlzKTsKKwkJbGFzdCA9IGZpcnN0OworCQlwID0ga2V5cyArIG1iX3B0cjJsZW5fY2hlY2soa2V5cyk7CisJCW4gPSAxOworCQl3aGlsZSAocCA8IGtleXMgKyBsZW4pCisJCXsKKwkJICAgICsrbjsJCQkvKiBuciBvZiAobXVsdGktYnl0ZSkgY2hhcnMgKi8KKwkJICAgIGxhc3QgPSB2aW1faXN3b3JkcChwKTsJLyogdHlwZSBvZiBsYXN0IGNoYXIgKi8KKwkJICAgIGlmIChzYW1lID09IC0xICYmIGxhc3QgIT0gZmlyc3QpCisJCQlzYW1lID0gbiAtIDE7CQkvKiBjb3VudCBvZiBzYW1lIGNoYXIgdHlwZSAqLworCQkgICAgcCArPSBtYl9wdHIybGVuX2NoZWNrKHApOworCQl9CisJCWlmIChsYXN0ICYmIG4gPiAyICYmIHNhbWUgPj0gMCAmJiBzYW1lIDwgbiAtIDEpCisJCXsKKwkJICAgIHJldHZhbCA9IDE7CisJCSAgICBnb3RvIHRoZWVuZDsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlpZiAodmltX2lzd29yZGMoa2V5c1tsZW4gLSAxXSkpCS8qIGVuZHMgaW4ga2V5d29yZCBjaGFyICovCisJCSAgICBmb3IgKG4gPSAwOyBuIDwgbGVuIC0gMjsgKytuKQorCQkJaWYgKHZpbV9pc3dvcmRjKGtleXNbbl0pICE9IHZpbV9pc3dvcmRjKGtleXNbbGVuIC0gMl0pKQorCQkJeworCQkJICAgIHJldHZhbCA9IDE7CisJCQkgICAgZ290byB0aGVlbmQ7CisJCQl9CisJICAgIC8qIEFuIGFiYnJldmF0aW9uIGNhbm5vdCBjb250YWluIHdoaXRlIHNwYWNlLiAqLworCSAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyArK24pCisJCWlmICh2aW1faXN3aGl0ZShrZXlzW25dKSkKKwkJeworCQkgICAgcmV0dmFsID0gMTsKKwkJICAgIGdvdG8gdGhlZW5kOworCQl9CisJfQorICAgIH0KKworICAgIGlmIChoYXNrZXkgJiYgaGFzYXJnICYmIGFiYnJldikJLyogaWYgd2Ugd2lsbCBhZGQgYW4gYWJicmV2aWF0aW9uICovCisJbm9fYWJiciA9IEZBTFNFOwkJLyogcmVzZXQgZmxhZyB0aGF0IGluZGljYXRlcyB0aGVyZSBhcmUKKwkJCQkJCQkgICAgbm8gYWJicmV2aWF0aW9ucyAqLworCisgICAgaWYgKCFoYXNrZXkgfHwgKG1hcHR5cGUgIT0gMSAmJiAhaGFzYXJnKSkKKwltc2dfc3RhcnQoKTsKKworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICAvKgorICAgICAqIENoZWNrIGlmIGEgbmV3IGxvY2FsIG1hcHBpbmcgd2Fzbid0IGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS4KKyAgICAgKi8KKyAgICBpZiAobWFwX3RhYmxlID09IGN1cmJ1Zi0+Yl9tYXBoYXNoICYmIGhhc2tleSAmJiBoYXNhcmcgJiYgbWFwdHlwZSAhPSAxKQorICAgIHsKKwkvKiBuZWVkIHRvIGxvb3Agb3ZlciBhbGwgZ2xvYmFsIGhhc2ggbGlzdHMgKi8KKwlmb3IgKGhhc2ggPSAwOyBoYXNoIDwgMjU2ICYmICFnb3RfaW50OyArK2hhc2gpCisJeworCSAgICBpZiAoYWJicmV2KQorCSAgICB7CisJCWlmIChoYXNoICE9IDApCS8qIHRoZXJlIGlzIG9ubHkgb25lIGFiYnJldmlhdGlvbiBsaXN0ICovCisJCSAgICBicmVhazsKKwkJbXAgPSBmaXJzdF9hYmJyOworCSAgICB9CisJICAgIGVsc2UKKwkJbXAgPSBtYXBoYXNoW2hhc2hdOworCSAgICBmb3IgKCA7IG1wICE9IE5VTEwgJiYgIWdvdF9pbnQ7IG1wID0gbXAtPm1fbmV4dCkKKwkgICAgeworCQkvKiBjaGVjayBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW9kZSAqLworCQlpZiAoKG1wLT5tX21vZGUgJiBtb2RlKSAhPSAwCisJCQkmJiBtcC0+bV9rZXlsZW4gPT0gbGVuCisJCQkmJiB1bmlxdWUKKwkJCSYmIFNUUk5DTVAobXAtPm1fa2V5cywga2V5cywgKHNpemVfdClsZW4pID09IDApCisJCXsKKwkJICAgIGlmIChhYmJyZXYpCisJCQlFTVNHMihfKCJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIpLAorCQkJCW1wLT5tX2tleXMpOworCQkgICAgZWxzZQorCQkJRU1TRzIoXygiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIiksCisJCQkJbXAtPm1fa2V5cyk7CisJCSAgICByZXR2YWwgPSA1OworCQkgICAgZ290byB0aGVlbmQ7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gbGlzdGluZyBnbG9iYWwgbWFwcGluZ3MsIGFsc28gbGlzdCBidWZmZXItbG9jYWwgb25lcyBoZXJlLgorICAgICAqLworICAgIGlmIChtYXBfdGFibGUgIT0gY3VyYnVmLT5iX21hcGhhc2ggJiYgIWhhc2FyZyAmJiBtYXB0eXBlICE9IDEpCisgICAgeworCS8qIG5lZWQgdG8gbG9vcCBvdmVyIGFsbCBnbG9iYWwgaGFzaCBsaXN0cyAqLworCWZvciAoaGFzaCA9IDA7IGhhc2ggPCAyNTYgJiYgIWdvdF9pbnQ7ICsraGFzaCkKKwl7CisJICAgIGlmIChhYmJyZXYpCisJICAgIHsKKwkJaWYgKGhhc2ggIT0gMCkJLyogdGhlcmUgaXMgb25seSBvbmUgYWJicmV2aWF0aW9uIGxpc3QgKi8KKwkJICAgIGJyZWFrOworCQltcCA9IGN1cmJ1Zi0+Yl9maXJzdF9hYmJyOworCSAgICB9CisJICAgIGVsc2UKKwkJbXAgPSBjdXJidWYtPmJfbWFwaGFzaFtoYXNoXTsKKwkgICAgZm9yICggOyBtcCAhPSBOVUxMICYmICFnb3RfaW50OyBtcCA9IG1wLT5tX25leHQpCisJICAgIHsKKwkJLyogY2hlY2sgZW50cmllcyB3aXRoIHRoZSBzYW1lIG1vZGUgKi8KKwkJaWYgKChtcC0+bV9tb2RlICYgbW9kZSkgIT0gMCkKKwkJeworCQkgICAgaWYgKCFoYXNrZXkpCQkgICAgLyogc2hvdyBhbGwgZW50cmllcyAqLworCQkgICAgeworCQkJc2hvd21hcChtcCwgVFJVRSk7CisJCQlkaWRfbG9jYWwgPSBUUlVFOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJbiA9IG1wLT5tX2tleWxlbjsKKwkJCWlmIChTVFJOQ01QKG1wLT5tX2tleXMsIGtleXMsCisJCQkJCSAgICAoc2l6ZV90KShuIDwgbGVuID8gbiA6IGxlbikpID09IDApCisJCQl7CisJCQkgICAgc2hvd21hcChtcCwgVFJVRSk7CisJCQkgICAgZGlkX2xvY2FsID0gVFJVRTsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBtYXBoYXNoW10gbGlzdCB0aGF0IG1hdGNoZXMuCisgICAgICogRm9yIDp1bm1hcCB3ZSBtYXkgbG9vcCB0d28gdGltZXM6IG9uY2UgdG8gdHJ5IHRvIHVubWFwIGFuIGVudHJ5IHdpdGggYQorICAgICAqIG1hdGNoaW5nICdmcm9tJyBwYXJ0LCBhIHNlY29uZCB0aW1lLCBpZiB0aGUgZmlyc3QgZmFpbHMsIHRvIHVubWFwIGFuCisgICAgICogZW50cnkgd2l0aCBhIG1hdGNoaW5nICd0bycgcGFydC4gVGhpcyB3YXMgZG9uZSB0byBhbGxvdyAiOmFiIGZvbyBiYXIiCisgICAgICogdG8gYmUgdW5tYXBwZWQgYnkgdHlwaW5nICI6dW5hYiBmb28iLCB3aGVyZSAiZm9vIiB3aWxsIGJlIHJlcGxhY2VkIGJ5CisgICAgICogImJhciIgYmVjYXVzZSBvZiB0aGUgYWJicmV2aWF0aW9uLgorICAgICAqLworICAgIGZvciAocm91bmQgPSAwOyAocm91bmQgPT0gMCB8fCBtYXB0eXBlID09IDEpICYmIHJvdW5kIDw9IDEKKwkJCQkJICAgICAgJiYgIWRpZF9pdCAmJiAhZ290X2ludDsgKytyb3VuZCkKKyAgICB7CisJLyogbmVlZCB0byBsb29wIG92ZXIgYWxsIGhhc2ggbGlzdHMgKi8KKwlmb3IgKGhhc2ggPSAwOyBoYXNoIDwgMjU2ICYmICFnb3RfaW50OyArK2hhc2gpCisJeworCSAgICBpZiAoYWJicmV2KQorCSAgICB7CisJCWlmIChoYXNoICE9IDApCS8qIHRoZXJlIGlzIG9ubHkgb25lIGFiYnJldmlhdGlvbiBsaXN0ICovCisJCSAgICBicmVhazsKKwkJbXBwID0gYWJicl90YWJsZTsKKwkgICAgfQorCSAgICBlbHNlCisJCW1wcCA9ICYobWFwX3RhYmxlW2hhc2hdKTsKKwkgICAgZm9yIChtcCA9ICptcHA7IG1wICE9IE5VTEwgJiYgIWdvdF9pbnQ7IG1wID0gKm1wcCkKKwkgICAgeworCisJCWlmICghKG1wLT5tX21vZGUgJiBtb2RlKSkgICAvKiBza2lwIGVudHJpZXMgd2l0aCB3cm9uZyBtb2RlICovCisJCXsKKwkJICAgIG1wcCA9ICYobXAtPm1fbmV4dCk7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAoIWhhc2tleSkJCSAgICAvKiBzaG93IGFsbCBlbnRyaWVzICovCisJCXsKKwkJICAgIHNob3dtYXAobXAsIG1hcF90YWJsZSAhPSBtYXBoYXNoKTsKKwkJICAgIGRpZF9pdCA9IFRSVUU7CisJCX0KKwkJZWxzZQkJCSAgICAvKiBkbyB3ZSBoYXZlIGEgbWF0Y2g/ICovCisJCXsKKwkJICAgIGlmIChyb3VuZCkJICAgIC8qIHNlY29uZCByb3VuZDogVHJ5IHVubWFwICJyaHMiIHN0cmluZyAqLworCQkgICAgeworCQkJbiA9IChpbnQpU1RSTEVOKG1wLT5tX3N0cik7CisJCQlwID0gbXAtPm1fc3RyOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJbiA9IG1wLT5tX2tleWxlbjsKKwkJCXAgPSBtcC0+bV9rZXlzOworCQkgICAgfQorCQkgICAgaWYgKFNUUk5DTVAocCwga2V5cywgKHNpemVfdCkobiA8IGxlbiA/IG4gOiBsZW4pKSA9PSAwKQorCQkgICAgeworCQkJaWYgKG1hcHR5cGUgPT0gMSkJLyogZGVsZXRlIGVudHJ5ICovCisJCQl7CisJCQkgICAgLyogT25seSBhY2NlcHQgYSBmdWxsIG1hdGNoLiAgRm9yIGFiYnJldmlhdGlvbnMgd2UKKwkJCSAgICAgKiBpZ25vcmUgdHJhaWxpbmcgc3BhY2Ugd2hlbiBtYXRjaGluZyB3aXRoIHRoZQorCQkJICAgICAqICJsaHMiLCBzaW5jZSBhbiBhYmJyZXZpYXRpb24gY2FuJ3QgaGF2ZQorCQkJICAgICAqIHRyYWlsaW5nIHNwYWNlLiAqLworCQkJICAgIGlmIChuICE9IGxlbiAmJiAoIWFiYnJldiB8fCByb3VuZCB8fCBuID4gbGVuCisJCQkJCSAgICAgICB8fCAqc2tpcHdoaXRlKGtleXMgKyBuKSAhPSBOVUwpKQorCQkJICAgIHsKKwkJCQltcHAgPSAmKG1wLT5tX25leHQpOworCQkJCWNvbnRpbnVlOworCQkJICAgIH0KKwkJCSAgICAvKgorCQkJICAgICAqIFdlIHJlc2V0IHRoZSBpbmRpY2F0ZWQgbW9kZSBiaXRzLiBJZiBub3RoaW5nIGlzCisJCQkgICAgICogbGVmdCB0aGUgZW50cnkgaXMgZGVsZXRlZCBiZWxvdy4KKwkJCSAgICAgKi8KKwkJCSAgICBtcC0+bV9tb2RlICY9IH5tb2RlOworCQkJICAgIGRpZF9pdCA9IFRSVUU7CS8qIHJlbWVtYmVyIHdlIGRpZCBzb21ldGhpbmcgKi8KKwkJCX0KKwkJCWVsc2UgaWYgKCFoYXNhcmcpCS8qIHNob3cgbWF0Y2hpbmcgZW50cnkgKi8KKwkJCXsKKwkJCSAgICBzaG93bWFwKG1wLCBtYXBfdGFibGUgIT0gbWFwaGFzaCk7CisJCQkgICAgZGlkX2l0ID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UgaWYgKG4gIT0gbGVuKQkvKiBuZXcgZW50cnkgaXMgYW1iaWdpb3VzICovCisJCQl7CisJCQkgICAgbXBwID0gJihtcC0+bV9uZXh0KTsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKHVuaXF1ZSkKKwkJCXsKKwkJCSAgICBpZiAoYWJicmV2KQorCQkJCUVNU0cyKF8oIkUyMjY6IGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiKSwKKwkJCQkJCQkJCSAgIHApOworCQkJICAgIGVsc2UKKwkJCQlFTVNHMihfKCJFMjI3OiBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIpLCBwKTsKKwkJCSAgICByZXR2YWwgPSA1OworCQkJICAgIGdvdG8gdGhlZW5kOworCQkJfQorCQkJZWxzZQkJCS8qIG5ldyByaHMgZm9yIGV4aXN0aW5nIGVudHJ5ICovCisJCQl7CisJCQkgICAgbXAtPm1fbW9kZSAmPSB+bW9kZTsJLyogcmVtb3ZlIG1vZGUgYml0cyAqLworCQkJICAgIGlmIChtcC0+bV9tb2RlID09IDAgJiYgIWRpZF9pdCkgLyogcmV1c2UgZW50cnkgKi8KKwkJCSAgICB7CisJCQkJbmV3c3RyID0gdmltX3N0cnNhdmUocmhzKTsKKwkJCQlpZiAobmV3c3RyID09IE5VTEwpCisJCQkJeworCQkJCSAgICByZXR2YWwgPSA0OwkJLyogbm8gbWVtICovCisJCQkJICAgIGdvdG8gdGhlZW5kOworCQkJCX0KKwkJCQl2aW1fZnJlZShtcC0+bV9zdHIpOworCQkJCW1wLT5tX3N0ciA9IG5ld3N0cjsKKwkJCQltcC0+bV9ub3JlbWFwID0gbm9yZW1hcDsKKwkJCQltcC0+bV9zaWxlbnQgPSBzaWxlbnQ7CisJCQkJbXAtPm1fbW9kZSA9IG1vZGU7CisJCQkJZGlkX2l0ID0gVFJVRTsKKwkJCSAgICB9CisJCQl9CisJCQlpZiAobXAtPm1fbW9kZSA9PSAwKQkvKiBlbnRyeSBjYW4gYmUgZGVsZXRlZCAqLworCQkJeworCQkJICAgIG1hcF9mcmVlKG1wcCk7CisJCQkgICAgY29udGludWU7CQkvKiBjb250aW51ZSB3aXRoICptcHAgKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIE1heSBuZWVkIHRvIHB1dCB0aGlzIGVudHJ5IGludG8gYW5vdGhlciBoYXNoIGxpc3QuCisJCQkgKi8KKwkJCW5ld19oYXNoID0gTUFQX0hBU0gobXAtPm1fbW9kZSwgbXAtPm1fa2V5c1swXSk7CisJCQlpZiAoIWFiYnJldiAmJiBuZXdfaGFzaCAhPSBoYXNoKQorCQkJeworCQkJICAgICptcHAgPSBtcC0+bV9uZXh0OworCQkJICAgIG1wLT5tX25leHQgPSBtYXBfdGFibGVbbmV3X2hhc2hdOworCQkJICAgIG1hcF90YWJsZVtuZXdfaGFzaF0gPSBtcDsKKworCQkJICAgIGNvbnRpbnVlOwkJLyogY29udGludWUgd2l0aCAqbXBwICovCisJCQl9CisJCSAgICB9CisJCX0KKwkJbXBwID0gJihtcC0+bV9uZXh0KTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAobWFwdHlwZSA9PSAxKQkJCSAgICAvKiBkZWxldGUgZW50cnkgKi8KKyAgICB7CisJaWYgKCFkaWRfaXQpCisJICAgIHJldHZhbCA9IDI7CQkJICAgIC8qIG5vIG1hdGNoICovCisJZ290byB0aGVlbmQ7CisgICAgfQorCisgICAgaWYgKCFoYXNrZXkgfHwgIWhhc2FyZykJCSAgICAvKiBwcmludCBlbnRyaWVzICovCisgICAgeworCWlmICghZGlkX2l0CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQkmJiAhZGlkX2xvY2FsCisjZW5kaWYKKwkJKQorCXsKKwkgICAgaWYgKGFiYnJldikKKwkJTVNHKF8oIk5vIGFiYnJldmlhdGlvbiBmb3VuZCIpKTsKKwkgICAgZWxzZQorCQlNU0coXygiTm8gbWFwcGluZyBmb3VuZCIpKTsKKwl9CisJZ290byB0aGVlbmQ7CQkJICAgIC8qIGxpc3RpbmcgZmluaXNoZWQgKi8KKyAgICB9CisKKyAgICBpZiAoZGlkX2l0KQkJCS8qIGhhdmUgYWRkZWQgdGhlIG5ldyBlbnRyeSBhbHJlYWR5ICovCisJZ290byB0aGVlbmQ7CisKKyAgICAvKgorICAgICAqIEdldCBoZXJlIHdoZW4gYWRkaW5nIGEgbmV3IGVudHJ5IHRvIHRoZSBtYXBoYXNoW10gbGlzdCBvciBhYmJybGlzdC4KKyAgICAgKi8KKyAgICBtcCA9IChtYXBibG9ja19UICopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihtYXBibG9ja19UKSk7CisgICAgaWYgKG1wID09IE5VTEwpCisgICAgeworCXJldHZhbCA9IDQ7CSAgICAvKiBubyBtZW0gKi8KKwlnb3RvIHRoZWVuZDsKKyAgICB9CisKKyAgICAvKiBJZiBDVFJMLUMgaGFzIGJlZW4gbWFwcGVkLCBkb24ndCBhbHdheXMgdXNlIGl0IGZvciBJbnRlcnJ1cHRpbmcgKi8KKyAgICBpZiAoKmtleXMgPT0gQ3RybF9DKQorCW1hcHBlZF9jdHJsX2MgPSBUUlVFOworCisgICAgbXAtPm1fa2V5cyA9IHZpbV9zdHJzYXZlKGtleXMpOworICAgIG1wLT5tX3N0ciA9IHZpbV9zdHJzYXZlKHJocyk7CisgICAgaWYgKG1wLT5tX2tleXMgPT0gTlVMTCB8fCBtcC0+bV9zdHIgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUobXAtPm1fa2V5cyk7CisJdmltX2ZyZWUobXAtPm1fc3RyKTsKKwl2aW1fZnJlZShtcCk7CisJcmV0dmFsID0gNDsJLyogbm8gbWVtICovCisJZ290byB0aGVlbmQ7CisgICAgfQorICAgIG1wLT5tX2tleWxlbiA9IChpbnQpU1RSTEVOKG1wLT5tX2tleXMpOworICAgIG1wLT5tX25vcmVtYXAgPSBub3JlbWFwOworICAgIG1wLT5tX3NpbGVudCA9IHNpbGVudDsKKyAgICBtcC0+bV9tb2RlID0gbW9kZTsKKworICAgIC8qIGFkZCB0aGUgbmV3IGVudHJ5IGluIGZyb250IG9mIHRoZSBhYmJybGlzdCBvciBtYXBoYXNoW10gbGlzdCAqLworICAgIGlmIChhYmJyZXYpCisgICAgeworCW1wLT5tX25leHQgPSAqYWJicl90YWJsZTsKKwkqYWJicl90YWJsZSA9IG1wOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW4gPSBNQVBfSEFTSChtcC0+bV9tb2RlLCBtcC0+bV9rZXlzWzBdKTsKKwltcC0+bV9uZXh0ID0gbWFwX3RhYmxlW25dOworCW1hcF90YWJsZVtuXSA9IG1wOworICAgIH0KKwordGhlZW5kOgorICAgIHZpbV9mcmVlKGtleXNfYnVmKTsKKyAgICB2aW1fZnJlZShhcmdfYnVmKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRGVsZXRlIG9uZSBlbnRyeSBmcm9tIHRoZSBhYmJybGlzdCBvciBtYXBoYXNoW10uCisgKiAibXBwIiBpcyBhIHBvaW50ZXIgdG8gdGhlIG1fbmV4dCBmaWVsZCBvZiB0aGUgUFJFVklPVVMgZW50cnkhCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWFwX2ZyZWUobXBwKQorICAgIG1hcGJsb2NrX1QJKiptcHA7Cit7CisgICAgbWFwYmxvY2tfVAkqbXA7CisKKyAgICBtcCA9ICptcHA7CisgICAgdmltX2ZyZWUobXAtPm1fa2V5cyk7CisgICAgdmltX2ZyZWUobXAtPm1fc3RyKTsKKyAgICAqbXBwID0gbXAtPm1fbmV4dDsKKyAgICB2aW1fZnJlZShtcCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIG1hcGhhc2hbXSBmb3IgZmlyc3QgdXNlLgorICovCisgICAgc3RhdGljIHZvaWQKK3ZhbGlkYXRlX21hcGhhc2goKQoreworICAgIGlmICghbWFwaGFzaF92YWxpZCkKKyAgICB7CisJdmltX21lbXNldChtYXBoYXNoLCAwLCBzaXplb2YobWFwaGFzaCkpOworCW1hcGhhc2hfdmFsaWQgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqIEdldCB0aGUgbWFwcGluZyBtb2RlIGZyb20gdGhlIGNvbW1hbmQgbmFtZS4KKyAqLworICAgIGludAorZ2V0X21hcF9tb2RlKGNtZHAsIGZvcmNlaXQpCisgICAgY2hhcl91CSoqY21kcDsKKyAgICBpbnQJCWZvcmNlaXQ7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbW9kZWM7CisgICAgaW50CQltb2RlOworCisgICAgcCA9ICpjbWRwOworICAgIG1vZGVjID0gKnArKzsKKyAgICBpZiAobW9kZWMgPT0gJ2knKQorCW1vZGUgPSBJTlNFUlQ7CQkJCS8qIDppbWFwICovCisgICAgZWxzZSBpZiAobW9kZWMgPT0gJ2wnKQorCW1vZGUgPSBMQU5HTUFQOwkJCQkvKiA6bG1hcCAqLworICAgIGVsc2UgaWYgKG1vZGVjID09ICdjJykKKwltb2RlID0gQ01ETElORTsJCQkJLyogOmNtYXAgKi8KKyAgICBlbHNlIGlmIChtb2RlYyA9PSAnbicgJiYgKnAgIT0gJ28nKQkJICAgIC8qIGF2b2lkIDpub3JlbWFwICovCisJbW9kZSA9IE5PUk1BTDsJCQkJLyogOm5tYXAgKi8KKyAgICBlbHNlIGlmIChtb2RlYyA9PSAndicpCisJbW9kZSA9IFZJU1VBTDsJCQkJLyogOnZtYXAgKi8KKyAgICBlbHNlIGlmIChtb2RlYyA9PSAnbycpCisJbW9kZSA9IE9QX1BFTkRJTkc7CQkJLyogOm9tYXAgKi8KKyAgICBlbHNlCisgICAgeworCS0tcDsKKwlpZiAoZm9yY2VpdCkKKwkgICAgbW9kZSA9IElOU0VSVCArIENNRExJTkU7CQkvKiA6bWFwICEgKi8KKwllbHNlCisJICAgIG1vZGUgPSBWSVNVQUwgKyBOT1JNQUwgKyBPUF9QRU5ESU5HOy8qIDptYXAgKi8KKyAgICB9CisKKyAgICAqY21kcCA9IHA7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKy8qCisgKiBDbGVhciBhbGwgbWFwcGluZ3Mgb3IgYWJicmV2aWF0aW9ucy4KKyAqICdhYmJyJyBzaG91bGQgYmUgRkFMU0UgZm9yIG1hcHBpbmdzLCBUUlVFIGZvciBhYmJyZXZpYXRpb25zLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCittYXBfY2xlYXIoY21kcCwgYXJnLCBmb3JjZWl0LCBhYmJyKQorICAgIGNoYXJfdQkqY21kcDsKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCWZvcmNlaXQ7CisgICAgaW50CQlhYmJyOworeworICAgIGludAkJbW9kZTsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisgICAgaW50CQlsb2NhbDsKKworICAgIGxvY2FsID0gKFNUUkNNUChhcmcsICI8YnVmZmVyPiIpID09IDApOworICAgIGlmICghbG9jYWwgJiYgKmFyZyAhPSBOVUwpCisgICAgeworCUVNU0coXyhlX2ludmFyZykpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIG1vZGUgPSBnZXRfbWFwX21vZGUoJmNtZHAsIGZvcmNlaXQpOworICAgIG1hcF9jbGVhcl9pbnQoY3VyYnVmLCBtb2RlLAorI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkgICAgbG9jYWwsCisjZWxzZQorCSAgICBGQUxTRSwKKyNlbmRpZgorCSAgICBhYmJyKTsKK30KKworLyoKKyAqIENsZWFyIGFsbCBtYXBwaW5ncyBpbiAibW9kZSIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK21hcF9jbGVhcl9pbnQoYnVmLCBtb2RlLCBsb2NhbCwgYWJicikKKyAgICBidWZfVAkqYnVmOwkgICAgLyogYnVmZmVyIGZvciBsb2NhbCBtYXBwaW5ncyAqLworICAgIGludAkJbW9kZTsJICAgIC8qIG1vZGUgaW4gd2hpY2ggdG8gZGVsZXRlICovCisgICAgaW50CQlsb2NhbDsJICAgIC8qIFRSVUUgZm9yIGJ1ZmZlci1sb2NhbCBtYXBwaW5ncyAqLworICAgIGludAkJYWJicjsJICAgIC8qIFRSVUUgZm9yIGFiYnJldmlhdGlvbnMgKi8KK3sKKyAgICBtYXBibG9ja19UCSptcCwgKiptcHA7CisgICAgaW50CQloYXNoOworICAgIGludAkJbmV3X2hhc2g7CisKKyAgICB2YWxpZGF0ZV9tYXBoYXNoKCk7CisKKyAgICBmb3IgKGhhc2ggPSAwOyBoYXNoIDwgMjU2OyArK2hhc2gpCisgICAgeworCWlmIChhYmJyKQorCXsKKwkgICAgaWYgKGhhc2gpCSAgICAvKiB0aGVyZSBpcyBvbmx5IG9uZSBhYmJybGlzdCAqLworCQlicmVhazsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJICAgIGlmIChsb2NhbCkKKwkJbXBwID0gJmJ1Zi0+Yl9maXJzdF9hYmJyOworCSAgICBlbHNlCisjZW5kaWYKKwkJbXBwID0gJmZpcnN0X2FiYnI7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCSAgICBpZiAobG9jYWwpCisJCW1wcCA9ICZidWYtPmJfbWFwaGFzaFtoYXNoXTsKKwkgICAgZWxzZQorI2VuZGlmCisJCW1wcCA9ICZtYXBoYXNoW2hhc2hdOworCX0KKwl3aGlsZSAoKm1wcCAhPSBOVUxMKQorCXsKKwkgICAgbXAgPSAqbXBwOworCSAgICBpZiAobXAtPm1fbW9kZSAmIG1vZGUpCisJICAgIHsKKwkJbXAtPm1fbW9kZSAmPSB+bW9kZTsKKwkJaWYgKG1wLT5tX21vZGUgPT0gMCkgLyogZW50cnkgY2FuIGJlIGRlbGV0ZWQgKi8KKwkJeworCQkgICAgbWFwX2ZyZWUobXBwKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIE1heSBuZWVkIHRvIHB1dCB0aGlzIGVudHJ5IGludG8gYW5vdGhlciBoYXNoIGxpc3QuCisJCSAqLworCQluZXdfaGFzaCA9IE1BUF9IQVNIKG1wLT5tX21vZGUsIG1wLT5tX2tleXNbMF0pOworCQlpZiAoIWFiYnIgJiYgbmV3X2hhc2ggIT0gaGFzaCkKKwkJeworCQkgICAgKm1wcCA9IG1wLT5tX25leHQ7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQkgICAgaWYgKGxvY2FsKQorCQkgICAgeworCQkJbXAtPm1fbmV4dCA9IGJ1Zi0+Yl9tYXBoYXNoW25ld19oYXNoXTsKKwkJCWJ1Zi0+Yl9tYXBoYXNoW25ld19oYXNoXSA9IG1wOworCQkgICAgfQorCQkgICAgZWxzZQorI2VuZGlmCisJCSAgICB7CisJCQltcC0+bV9uZXh0ID0gbWFwaGFzaFtuZXdfaGFzaF07CisJCQltYXBoYXNoW25ld19oYXNoXSA9IG1wOworCQkgICAgfQorCQkgICAgY29udGludWU7CQkvKiBjb250aW51ZSB3aXRoICptcHAgKi8KKwkJfQorCSAgICB9CisJICAgIG1wcCA9ICYobXAtPm1fbmV4dCk7CisJfQorICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitzaG93bWFwKG1wLCBsb2NhbCkKKyAgICBtYXBibG9ja19UCSptcDsKKyAgICBpbnQJCWxvY2FsOwkgICAgLyogVFJVRSBmb3IgYnVmZmVyLWxvY2FsIG1hcCAqLworeworICAgIGludCBsZW4gPSAxOworCisgICAgaWYgKG1zZ19kaWRvdXQgfHwgbXNnX3NpbGVudCAhPSAwKQorCW1zZ19wdXRjaGFyKCdcbicpOworICAgIGlmICgobXAtPm1fbW9kZSAmIChJTlNFUlQgKyBDTURMSU5FKSkgPT0gSU5TRVJUICsgQ01ETElORSkKKwltc2dfcHV0Y2hhcignIScpOwkJCS8qIDptYXAhICovCisgICAgZWxzZSBpZiAobXAtPm1fbW9kZSAmIElOU0VSVCkKKwltc2dfcHV0Y2hhcignaScpOwkJCS8qIDppbWFwICovCisgICAgZWxzZSBpZiAobXAtPm1fbW9kZSAmIExBTkdNQVApCisJbXNnX3B1dGNoYXIoJ2wnKTsJCQkvKiA6bG1hcCAqLworICAgIGVsc2UgaWYgKG1wLT5tX21vZGUgJiBDTURMSU5FKQorCW1zZ19wdXRjaGFyKCdjJyk7CQkJLyogOmNtYXAgKi8KKyAgICBlbHNlIGlmICgobXAtPm1fbW9kZSAmIChOT1JNQUwgKyBWSVNVQUwgKyBPUF9QRU5ESU5HKSkKKwkJCQkJICAgICAgPT0gTk9STUFMICsgVklTVUFMICsgT1BfUEVORElORykKKwltc2dfcHV0Y2hhcignICcpOwkJCS8qIDptYXAgKi8KKyAgICBlbHNlCisgICAgeworCWxlbiA9IDA7CisJaWYgKG1wLT5tX21vZGUgJiBOT1JNQUwpCisJeworCSAgICBtc2dfcHV0Y2hhcignbicpOwkJLyogOm5tYXAgKi8KKwkgICAgKytsZW47CisJfQorCWlmIChtcC0+bV9tb2RlICYgT1BfUEVORElORykKKwl7CisJICAgIG1zZ19wdXRjaGFyKCdvJyk7CQkvKiA6b21hcCAqLworCSAgICArK2xlbjsKKwl9CisJaWYgKG1wLT5tX21vZGUgJiBWSVNVQUwpCisJeworCSAgICBtc2dfcHV0Y2hhcigndicpOwkJLyogOnZtYXAgKi8KKwkgICAgKytsZW47CisJfQorICAgIH0KKyAgICB3aGlsZSAoKytsZW4gPD0gMykKKwltc2dfcHV0Y2hhcignICcpOworCisgICAgLyogR2V0IGxlbmd0aCBvZiB3aGF0IHdlIHdyaXRlICovCisgICAgbGVuID0gbXNnX291dHRyYW5zX3NwZWNpYWwobXAtPm1fa2V5cywgVFJVRSk7CisgICAgZG8KKyAgICB7CisJbXNnX3B1dGNoYXIoJyAnKTsJCS8qIHBhZGQgd2l0aCBibGFua3MgKi8KKwkrK2xlbjsKKyAgICB9IHdoaWxlIChsZW4gPCAxMik7CisKKyAgICBpZiAobXAtPm1fbm9yZW1hcCA9PSBSRU1BUF9OT05FKQorCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSIqIiwgaGxfYXR0cihITEZfOCkpOworICAgIGVsc2UgaWYgKG1wLT5tX25vcmVtYXAgPT0gUkVNQVBfU0NSSVBUKQorCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSImIiwgaGxfYXR0cihITEZfOCkpOworICAgIGVsc2UKKwltc2dfcHV0Y2hhcignICcpOworCisgICAgaWYgKGxvY2FsKQorCW1zZ19wdXRjaGFyKCdAJyk7CisgICAgZWxzZQorCW1zZ19wdXRjaGFyKCcgJyk7CisKKyAgICAvKiBVc2UgRkFMU0UgYmVsb3cgaWYgd2Ugb25seSB3YW50IHRoaW5ncyBsaWtlIDxVcD4gdG8gc2hvdyB1cCBhcyBzdWNoIG9uCisgICAgICogdGhlIHJocywgYW5kIG5vdCBNLXggZXRjLCBUUlVFIGdldHMgYm90aCAtLSB3ZWJiCisgICAgICovCisgICAgaWYgKCptcC0+bV9zdHIgPT0gTlVMKQorCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSI8Tm9wPiIsIGhsX2F0dHIoSExGXzgpKTsKKyAgICBlbHNlCisJbXNnX291dHRyYW5zX3NwZWNpYWwobXAtPm1fc3RyLCBGQUxTRSk7CisgICAgb3V0X2ZsdXNoKCk7CQkJLyogc2hvdyBvbmUgbGluZSBhdCBhIHRpbWUgKi8KK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiBUUlVFIGlmIGEgbWFwIGV4aXN0cyB0aGF0IGhhcyAic3RyIiBpbiB0aGUgcmhzIGZvciBtb2RlICJtb2RlY2hhcnMiLgorICogUmVjb2duaXplIHRlcm1jYXAgY29kZXMgaW4gInN0ciIuCisgKiBBbHNvIGNoZWNrcyBtYXBwaW5ncyBsb2NhbCB0byB0aGUgY3VycmVudCBidWZmZXIuCisgKi8KKyAgICBpbnQKK21hcF90b19leGlzdHMoc3RyLCBtb2RlY2hhcnMpCisgICAgY2hhcl91CSpzdHI7CisgICAgY2hhcl91CSptb2RlY2hhcnM7Cit7CisgICAgaW50CQltb2RlID0gMDsKKyAgICBjaGFyX3UJKnJoczsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCXJldHZhbDsKKworICAgIHJocyA9IHJlcGxhY2VfdGVybWNvZGVzKHN0ciwgJmJ1ZiwgRkFMU0UsIFRSVUUpOworCisgICAgaWYgKHZpbV9zdHJjaHIobW9kZWNoYXJzLCAnbicpICE9IE5VTEwpCisJbW9kZSB8PSBOT1JNQUw7CisgICAgaWYgKHZpbV9zdHJjaHIobW9kZWNoYXJzLCAndicpICE9IE5VTEwpCisJbW9kZSB8PSBWSVNVQUw7CisgICAgaWYgKHZpbV9zdHJjaHIobW9kZWNoYXJzLCAnbycpICE9IE5VTEwpCisJbW9kZSB8PSBPUF9QRU5ESU5HOworICAgIGlmICh2aW1fc3RyY2hyKG1vZGVjaGFycywgJ2knKSAhPSBOVUxMKQorCW1vZGUgfD0gSU5TRVJUOworICAgIGlmICh2aW1fc3RyY2hyKG1vZGVjaGFycywgJ2wnKSAhPSBOVUxMKQorCW1vZGUgfD0gTEFOR01BUDsKKyAgICBpZiAodmltX3N0cmNocihtb2RlY2hhcnMsICdjJykgIT0gTlVMTCkKKwltb2RlIHw9IENNRExJTkU7CisKKyAgICByZXR2YWwgPSBtYXBfdG9fZXhpc3RzX21vZGUocmhzLCBtb2RlKTsKKyAgICB2aW1fZnJlZShidWYpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgaWYgYSBtYXAgZXhpc3RzIHRoYXQgaGFzICJzdHIiIGluIHRoZSByaHMgZm9yIG1vZGUgIm1vZGUiLgorICogQWxzbyBjaGVja3MgbWFwcGluZ3MgbG9jYWwgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLgorICovCisgICAgaW50CittYXBfdG9fZXhpc3RzX21vZGUocmhzLCBtb2RlKQorICAgIGNoYXJfdQkqcmhzOworICAgIGludAkJbW9kZTsKK3sKKyAgICBtYXBibG9ja19UCSptcDsKKyAgICBpbnQJCWhhc2g7CisjIGlmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBpbnQJCWV4cGFuZF9idWZmZXIgPSBGQUxTRTsKKworICAgIHZhbGlkYXRlX21hcGhhc2goKTsKKworICAgIC8qIERvIGl0IHR3aWNlOiBvbmNlIGZvciBnbG9iYWwgbWFwcyBhbmQgb25jZSBmb3IgbG9jYWwgbWFwcy4gKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKyMgZW5kaWYKKwlmb3IgKGhhc2ggPSAwOyBoYXNoIDwgMjU2OyArK2hhc2gpCisJeworIyBpZmRlZiBGRUFUX0xPQ0FMTUFQCisJICAgIGlmIChleHBhbmRfYnVmZmVyKQorCQltcCA9IGN1cmJ1Zi0+Yl9tYXBoYXNoW2hhc2hdOworCSAgICBlbHNlCisjIGVuZGlmCisJCW1wID0gbWFwaGFzaFtoYXNoXTsKKwkgICAgZm9yICg7IG1wOyBtcCA9IG1wLT5tX25leHQpCisJICAgIHsKKwkJaWYgKChtcC0+bV9tb2RlICYgbW9kZSkKKwkJCSYmIHN0cnN0cigoY2hhciAqKW1wLT5tX3N0ciwgKGNoYXIgKilyaHMpICE9IE5VTEwpCisJCSAgICByZXR1cm4gVFJVRTsKKwkgICAgfQorCX0KKyMgaWZkZWYgRkVBVF9MT0NBTE1BUAorCWlmIChleHBhbmRfYnVmZmVyKQorCSAgICBicmVhazsKKwlleHBhbmRfYnVmZmVyID0gVFJVRTsKKyAgICB9CisjIGVuZGlmCisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBVc2VkIGJlbG93IHdoZW4gZXhwYW5kaW5nIG1hcHBpbmcvYWJicmV2aWF0aW9uIG5hbWVzLgorICovCitzdGF0aWMgaW50CWV4cGFuZF9tYXBtb2RlcyA9IDA7CitzdGF0aWMgaW50CWV4cGFuZF9pc2FiYnJldiA9IDA7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorc3RhdGljIGludAlleHBhbmRfYnVmZmVyID0gRkFMU0U7CisjZW5kaWYKKworLyoKKyAqIFdvcmsgb3V0IHdoYXQgdG8gY29tcGxldGUgd2hlbiBkb2luZyBjb21tYW5kIGxpbmUgY29tcGxldGlvbiBvZiBtYXBwaW5nCisgKiBvciBhYmJyZXZpYXRpb24gbmFtZXMuCisgKi8KKyAgICBjaGFyX3UgKgorc2V0X2NvbnRleHRfaW5fbWFwX2NtZCh4cCwgY21kLCBhcmcsIGZvcmNlaXQsIGlzYWJicmV2LCBpc3VubWFwLCBjbWRpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqY21kOworICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJZm9yY2VpdDsJLyogVFJVRSBpZiAnIScgZ2l2ZW4gKi8KKyAgICBpbnQJCWlzYWJicmV2OwkvKiBUUlVFIGlmIGFiYnJldmlhdGlvbiAqLworICAgIGludAkJaXN1bm1hcDsJLyogVFJVRSBpZiB1bm1hcC91bmFiYnJldiBjb21tYW5kICovCisgICAgY21kaWR4X1QJY21kaWR4OworeworICAgIGlmIChmb3JjZWl0ICYmIGNtZGlkeCAhPSBDTURfbWFwICYmIGNtZGlkeCAhPSBDTURfdW5tYXApCisJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKyAgICBlbHNlCisgICAgeworCWlmIChpc3VubWFwKQorCSAgICBleHBhbmRfbWFwbW9kZXMgPSBnZXRfbWFwX21vZGUoJmNtZCwgZm9yY2VpdCB8fCBpc2FiYnJldik7CisJZWxzZQorCXsKKwkgICAgZXhwYW5kX21hcG1vZGVzID0gSU5TRVJUICsgQ01ETElORTsKKwkgICAgaWYgKCFpc2FiYnJldikKKwkJZXhwYW5kX21hcG1vZGVzICs9IFZJU1VBTCArIE5PUk1BTCArIE9QX1BFTkRJTkc7CisJfQorCWV4cGFuZF9pc2FiYnJldiA9IGlzYWJicmV2OworCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX01BUFBJTkdTOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwlleHBhbmRfYnVmZmVyID0gRkFMU0U7CisjZW5kaWYKKwlmb3IgKDs7KQorCXsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJICAgIGlmIChTVFJOQ01QKGFyZywgIjxidWZmZXI+IiwgOCkgPT0gMCkKKwkgICAgeworCQlleHBhbmRfYnVmZmVyID0gVFJVRTsKKwkJYXJnID0gc2tpcHdoaXRlKGFyZyArIDgpOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisJICAgIGlmIChTVFJOQ01QKGFyZywgIjx1bmlxdWU+IiwgOCkgPT0gMCkKKwkgICAgeworCQlhcmcgPSBza2lwd2hpdGUoYXJnICsgOCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChTVFJOQ01QKGFyZywgIjxzaWxlbnQ+IiwgOCkgPT0gMCkKKwkgICAgeworCQlhcmcgPSBza2lwd2hpdGUoYXJnICsgOCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChTVFJOQ01QKGFyZywgIjxzY3JpcHQ+IiwgOCkgPT0gMCkKKwkgICAgeworCQlhcmcgPSBza2lwd2hpdGUoYXJnICsgOCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwl4cC0+eHBfcGF0dGVybiA9IGFyZzsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZpbmQgYWxsIG1hcHBpbmcvYWJicmV2aWF0aW9uIG5hbWVzIHRoYXQgbWF0Y2ggcmVnZXhwICdwcm9nJy4KKyAqIEZvciBjb21tYW5kIGxpbmUgZXhwYW5zaW9uIG9mICI6W3VuXW1hcCIgYW5kICI6W3VuXWFiYnJldiIgaW4gYWxsIG1vZGVzLgorICogUmV0dXJuIE9LIGlmIG1hdGNoZXMgZm91bmQsIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitFeHBhbmRNYXBwaW5ncyhyZWdtYXRjaCwgbnVtX2ZpbGUsIGZpbGUpCisgICAgcmVnbWF0Y2hfVAkqcmVnbWF0Y2g7CisgICAgaW50CQkqbnVtX2ZpbGU7CisgICAgY2hhcl91CSoqKmZpbGU7Cit7CisgICAgbWFwYmxvY2tfVAkqbXA7CisgICAgaW50CQloYXNoOworICAgIGludAkJY291bnQ7CisgICAgaW50CQlyb3VuZDsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworCisgICAgdmFsaWRhdGVfbWFwaGFzaCgpOworCisgICAgKm51bV9maWxlID0gMDsJCSAgICAvKiByZXR1cm4gdmFsdWVzIGluIGNhc2Ugb2YgRkFJTCAqLworICAgICpmaWxlID0gTlVMTDsKKworICAgIC8qCisgICAgICogcm91bmQgPT0gMTogQ291bnQgdGhlIG1hdGNoZXMuCisgICAgICogcm91bmQgPT0gMjogQnVpbGQgdGhlIGFycmF5IHRvIGtlZXAgdGhlIG1hdGNoZXMuCisgICAgICovCisgICAgZm9yIChyb3VuZCA9IDE7IHJvdW5kIDw9IDI7ICsrcm91bmQpCisgICAgeworCWNvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJeworCSAgICBpZiAoaSA9PSAwKQorCQlwID0gKGNoYXJfdSAqKSI8c2lsZW50PiI7CisJICAgIGVsc2UgaWYgKGkgPT0gMSkKKwkJcCA9IChjaGFyX3UgKikiPHVuaXF1ZT4iOworI2lmZGVmIEZFQVRfRVZBTAorCSAgICBlbHNlIGlmIChpID09IDIpCisJCXAgPSAoY2hhcl91ICopIjxzY3JpcHQ+IjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkgICAgZWxzZSBpZiAoaSA9PSAzICYmICFleHBhbmRfYnVmZmVyKQorCQlwID0gKGNoYXJfdSAqKSI8YnVmZmVyPiI7CisjZW5kaWYKKwkgICAgZWxzZQorCQljb250aW51ZTsKKworCSAgICBpZiAodmltX3JlZ2V4ZWMocmVnbWF0Y2gsIHAsIChjb2xucl9UKTApKQorCSAgICB7CisJCWlmIChyb3VuZCA9PSAxKQorCQkgICAgKytjb3VudDsKKwkJZWxzZQorCQkgICAgKCpmaWxlKVtjb3VudCsrXSA9IHZpbV9zdHJzYXZlKHApOworCSAgICB9CisJfQorCisJZm9yIChoYXNoID0gMDsgaGFzaCA8IDI1NjsgKytoYXNoKQorCXsKKwkgICAgaWYgKGV4cGFuZF9pc2FiYnJldikKKwkgICAgeworCQlpZiAoaGFzaCkJLyogb25seSBvbmUgYWJicmV2IGxpc3QgKi8KKwkJICAgIGJyZWFrOyAvKiBmb3IgKGhhc2gpICovCisJCW1wID0gZmlyc3RfYWJicjsKKwkgICAgfQorI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkgICAgZWxzZSBpZiAoZXhwYW5kX2J1ZmZlcikKKwkJbXAgPSBjdXJidWYtPmJfbWFwaGFzaFtoYXNoXTsKKyNlbmRpZgorCSAgICBlbHNlCisJCW1wID0gbWFwaGFzaFtoYXNoXTsKKwkgICAgZm9yICg7IG1wOyBtcCA9IG1wLT5tX25leHQpCisJICAgIHsKKwkJaWYgKG1wLT5tX21vZGUgJiBleHBhbmRfbWFwbW9kZXMpCisJCXsKKwkJICAgIHAgPSB0cmFuc2xhdGVfbWFwcGluZyhtcC0+bV9rZXlzLCBUUlVFKTsKKwkJICAgIGlmIChwICE9IE5VTEwgJiYgdmltX3JlZ2V4ZWMocmVnbWF0Y2gsIHAsIChjb2xucl9UKTApKQorCQkgICAgeworCQkJaWYgKHJvdW5kID09IDEpCisJCQkgICAgKytjb3VudDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICAoKmZpbGUpW2NvdW50KytdID0gcDsKKwkJCSAgICBwID0gTlVMTDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIHZpbV9mcmVlKHApOworCQl9CisJICAgIH0gLyogZm9yIChtcCkgKi8KKwl9IC8qIGZvciAoaGFzaCkgKi8KKworCWlmIChjb3VudCA9PSAwKQkJCS8qIG5vIG1hdGNoIGZvdW5kICovCisJICAgIGJyZWFrOyAvKiBmb3IgKHJvdW5kKSAqLworCisJaWYgKHJvdW5kID09IDEpCisJeworCSAgICAqZmlsZSA9IChjaGFyX3UgKiopYWxsb2MoKHVuc2lnbmVkKShjb3VudCAqIHNpemVvZihjaGFyX3UgKikpKTsKKwkgICAgaWYgKCpmaWxlID09IE5VTEwpCisJCXJldHVybiBGQUlMOworCX0KKyAgICB9IC8qIGZvciAocm91bmQpICovCisKKyAgICAvKiBTb3J0IHRoZSBtYXRjaGVzICovCisgICAgc29ydF9zdHJpbmdzKCpmaWxlLCBjb3VudCk7CisKKyAgICAvKiBSZW1vdmUgbXVsdGlwbGUgZW50cmllcyAqLworICAgIHsKKwljaGFyX3UJKipwdHIxID0gKmZpbGU7CisJY2hhcl91CSoqcHRyMiA9IHB0cjEgKyAxOworCWNoYXJfdQkqKnB0cjMgPSBwdHIxICsgY291bnQ7CisKKwl3aGlsZSAocHRyMiA8IHB0cjMpCisJeworCSAgICBpZiAoU1RSQ01QKCpwdHIxLCAqcHRyMikpCisJCSorK3B0cjEgPSAqcHRyMisrOworCSAgICBlbHNlCisJICAgIHsKKwkJdmltX2ZyZWUoKnB0cjIrKyk7CisJCWNvdW50LS07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgKm51bV9maWxlID0gY291bnQ7CisgICAgcmV0dXJuIChjb3VudCA9PSAwID8gRkFJTCA6IE9LKTsKK30KKyNlbmRpZiAvKiBGRUFUX0NNRExfQ09NUEwgKi8KKworLyoKKyAqIENoZWNrIGZvciBhbiBhYmJyZXZpYXRpb24uCisgKiBDdXJzb3IgaXMgYXQgcHRyW2NvbF0uIFdoZW4gaW5zZXJ0aW5nLCBtaW5jb2wgaXMgd2hlcmUgaW5zZXJ0IHN0YXJ0ZWQuCisgKiAiYyIgaXMgdGhlIGNoYXJhY3RlciB0eXBlZCBiZWZvcmUgY2hlY2tfYWJiciB3YXMgY2FsbGVkLiAgSXQgbWF5IGhhdmUKKyAqIEFCQlJfT0ZGIGFkZGVkIHRvIGF2b2lkIHByZXBlbmRpbmcgYSBDVFJMLVYgdG8gaXQuCisgKgorICogSGlzdG9yaWMgdmkgcHJhY3RpY2U6IFRoZSBsYXN0IGNoYXJhY3RlciBvZiBhbiBhYmJyZXZpYXRpb24gbXVzdCBiZSBhbiBpZAorICogY2hhcmFjdGVyIChbYS16QS1aMC05X10pLiBUaGUgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdCBtdXN0IGJlIGFsbCBpZAorICogY2hhcmFjdGVycyBvciBhbGwgbm9uLWlkIGNoYXJhY3RlcnMuIFRoaXMgYWxsb3dzIGZvciBhYmJyLiAiI2kiIHRvCisgKiAiI2luY2x1ZGUiLgorICoKKyAqIFZpbSBhZGRpdGlvbjogQWxsb3cgZm9yIGFiYnJldmlhdGlvbnMgdGhhdCBlbmQgaW4gYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuCisgKiBUaGVuIHRoZXJlIG11c3QgYmUgd2hpdGUgc3BhY2UgYmVmb3JlIHRoZSBhYmJyLgorICoKKyAqIHJldHVybiBUUlVFIGlmIHRoZXJlIGlzIGFuIGFiYnJldmlhdGlvbiwgRkFMU0UgaWYgbm90CisgKi8KKyAgICBpbnQKK2NoZWNrX2FiYnIoYywgcHRyLCBjb2wsIG1pbmNvbCkKKyAgICBpbnQJCWM7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQljb2w7CisgICAgaW50CQltaW5jb2w7Cit7CisgICAgaW50CQlsZW47CisgICAgaW50CQlzY29sOwkJLyogc3RhcnRpbmcgY29sdW1uIG9mIHRoZSBhYmJyLiAqLworICAgIGludAkJajsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CXRiW01CX01BWEJZVEVTICsgNF07CisjZWxzZQorICAgIGNoYXJfdQl0Yls0XTsKKyNlbmRpZgorICAgIG1hcGJsb2NrX1QJKm1wOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBtYXBibG9ja19UCSptcDI7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQljbGVuID0gMDsJLyogbGVuZ3RoIGluIGNoYXJhY3RlcnMgKi8KKyNlbmRpZgorICAgIGludAkJaXNfaWQgPSBUUlVFOworICAgIGludAkJdmltX2FiYnI7CisKKyAgICBpZiAodHlwZWJ1Zi50Yl9ub19hYmJyX2NudCkJLyogYWJicmV2LiBhcmUgbm90IHJlY3Vyc2l2ZSAqLworCXJldHVybiBGQUxTRTsKKyAgICBpZiAoS2V5Tm9yZW1hcCkJCS8qIG5vIHJlbWFwcGluZyBpbXBsaWVzIG5vIGFiYnJldmlhdGlvbiAqLworCXJldHVybiBGQUxTRTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIHdvcmQgYmVmb3JlIHRoZSBjdXJzb3I6IElmIGl0IGVuZHMgaW4gYSBrZXl3b3JkIGNoYXIgYWxsCisgICAgICogY2hhcnMgYmVmb3JlIGl0IG11c3QgYmUgYWwga2V5d29yZCBjaGFycyBvciBub24ta2V5d29yZCBjaGFycywgYnV0IG5vdAorICAgICAqIHdoaXRlIHNwYWNlLiBJZiBpdCBlbmRzIGluIGEgbm9uLWtleXdvcmQgY2hhciB3ZSBhY2NlcHQgYW55IGNoYXJhY3RlcnMKKyAgICAgKiBiZWZvcmUgaXQgZXhjZXB0IHdoaXRlIHNwYWNlLgorICAgICAqLworICAgIGlmIChjb2wgPT0gMCkJCQkJLyogY2Fubm90IGJlIGFuIGFiYnIuICovCisJcmV0dXJuIEZBTFNFOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisgICAgeworCWNoYXJfdSAqcDsKKworCXAgPSBtYl9wcmV2cHRyKHB0ciwgcHRyICsgY29sKTsKKwlpZiAoIXZpbV9pc3dvcmRwKHApKQorCSAgICB2aW1fYWJiciA9IFRSVUU7CQkJLyogVmltIGFkZGVkIGFiYnIuICovCisJZWxzZQorCXsKKwkgICAgdmltX2FiYnIgPSBGQUxTRTsJCQkvKiB2aSBjb21wYXRpYmxlIGFiYnIuICovCisJICAgIGlmIChwID4gcHRyKQorCQlpc19pZCA9IHZpbV9pc3dvcmRwKG1iX3ByZXZwdHIocHRyLCBwKSk7CisJfQorCWNsZW4gPSAxOworCXdoaWxlIChwID4gcHRyICsgbWluY29sKQorCXsKKwkgICAgcCA9IG1iX3ByZXZwdHIocHRyLCBwKTsKKwkgICAgaWYgKHZpbV9pc3NwYWNlKCpwKSB8fCAoIXZpbV9hYmJyICYmIGlzX2lkICE9IHZpbV9pc3dvcmRwKHApKSkKKwkgICAgeworCQlwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJCWJyZWFrOworCSAgICB9CisJICAgICsrY2xlbjsKKwl9CisJc2NvbCA9IChpbnQpKHAgLSBwdHIpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJaWYgKCF2aW1faXN3b3JkYyhwdHJbY29sIC0gMV0pKQorCSAgICB2aW1fYWJiciA9IFRSVUU7CQkJLyogVmltIGFkZGVkIGFiYnIuICovCisJZWxzZQorCXsKKwkgICAgdmltX2FiYnIgPSBGQUxTRTsJCQkvKiB2aSBjb21wYXRpYmxlIGFiYnIuICovCisJICAgIGlmIChjb2wgPiAxKQorCQlpc19pZCA9IHZpbV9pc3dvcmRjKHB0cltjb2wgLSAyXSk7CisJfQorCWZvciAoc2NvbCA9IGNvbCAtIDE7IHNjb2wgPiAwICYmICF2aW1faXNzcGFjZShwdHJbc2NvbCAtIDFdKQorCQkmJiAodmltX2FiYnIgfHwgaXNfaWQgPT0gdmltX2lzd29yZGMocHRyW3Njb2wgLSAxXSkpOyAtLXNjb2wpCisJICAgIDsKKyAgICB9CisKKyAgICBpZiAoc2NvbCA8IG1pbmNvbCkKKwlzY29sID0gbWluY29sOworICAgIGlmIChzY29sIDwgY29sKQkJLyogdGhlcmUgaXMgYSB3b3JkIGluIGZyb250IG9mIHRoZSBjdXJzb3IgKi8KKyAgICB7CisJcHRyICs9IHNjb2w7CisJbGVuID0gY29sIC0gc2NvbDsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJbXAgPSBjdXJidWYtPmJfZmlyc3RfYWJicjsKKwltcDIgPSBmaXJzdF9hYmJyOworCWlmIChtcCA9PSBOVUxMKQorCXsKKwkgICAgbXAgPSBtcDI7CisJICAgIG1wMiA9IE5VTEw7CisJfQorI2Vsc2UKKwltcCA9IGZpcnN0X2FiYnI7CisjZW5kaWYKKwlmb3IgKCA7IG1wOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkJbXAtPm1fbmV4dCA9PSBOVUxMID8gKG1wID0gbXAyLCBtcDIgPSBOVUxMKSA6CisjZW5kaWYKKwkJKG1wID0gbXAtPm1fbmV4dCkpCisJeworCSAgICAvKiBmaW5kIGVudHJpZXMgd2l0aCByaWdodCBtb2RlIGFuZCBrZXlzICovCisJICAgIGlmICggICAgICAgKG1wLT5tX21vZGUgJiBTdGF0ZSkKKwkJICAgICYmIG1wLT5tX2tleWxlbiA9PSBsZW4KKwkJICAgICYmICFTVFJOQ01QKG1wLT5tX2tleXMsIHB0ciwgKHNpemVfdClsZW4pKQorCQlicmVhazsKKwl9CisJaWYgKG1wICE9IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBGb3VuZCBhIG1hdGNoOgorCSAgICAgKiBJbnNlcnQgdGhlIHJlc3Qgb2YgdGhlIGFiYnJldmlhdGlvbiBpbiB0eXBlYnVmLnRiX2J1ZltdLgorCSAgICAgKiBUaGlzIGdvZXMgZnJvbSBlbmQgdG8gc3RhcnQuCisJICAgICAqCisJICAgICAqIENoYXJhY3RlcnMgMHgwMDAgLSAweDEwMDogbm9ybWFsIGNoYXJzLCBtYXkgbmVlZCBDVFJMLVYsCisJICAgICAqIGV4Y2VwdCBLX1NQRUNJQUw6IEJlY29tZXMgS19TUEVDSUFMIEtTX1NQRUNJQUwgS0VfRklMTEVSCisJICAgICAqIENoYXJhY3RlcnMgd2hlcmUgSVNfU1BFQ0lBTCgpID09IFRSVUU6IGtleSBjb2RlcywgbmVlZAorCSAgICAgKiBLX1NQRUNJQUwuIE90aGVyIGNoYXJhY3RlcnMgKHdpdGggQUJCUl9PRkYpOiBkb24ndCB1c2UgQ1RSTC1WLgorCSAgICAgKgorCSAgICAgKiBDaGFyYWN0ZXIgQ1RSTC1dIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IC0gaXQgY29tcGxldGVzIHRoZQorCSAgICAgKiBhYmJyZXZpYXRpb24sIGJ1dCBpcyBub3QgaW5zZXJ0ZWQgaW50byB0aGUgaW5wdXQgc3RyZWFtLgorCSAgICAgKi8KKwkgICAgaiA9IDA7CisJCQkJCS8qIHNwZWNpYWwga2V5IGNvZGUsIHNwbGl0IHVwICovCisJICAgIGlmIChjICE9IEN0cmxfUlNCKQorCSAgICB7CisJCWlmIChJU19TUEVDSUFMKGMpIHx8IGMgPT0gS19TUEVDSUFMKQorCQl7CisJCSAgICB0YltqKytdID0gS19TUEVDSUFMOworCQkgICAgdGJbaisrXSA9IEtfU0VDT05EKGMpOworCQkgICAgdGJbaisrXSA9IEtfVEhJUkQoYyk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBpZiAoYyA8IEFCQlJfT0ZGICYmIChjIDwgJyAnIHx8IGMgPiAnficpKQorCQkJdGJbaisrXSA9IEN0cmxfVjsJLyogc3BlY2lhbCBjaGFyIG5lZWRzIENUUkwtViAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCSAgICB7CisJCQkvKiBpZiBBQkJSX09GRiBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlIGl0IGhlcmUgKi8KKwkJCWlmIChjID49IEFCQlJfT0ZGKQorCQkJICAgIGMgLT0gQUJCUl9PRkY7CisJCQlqICs9ICgqbWJfY2hhcjJieXRlcykoYywgdGIgKyBqKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJdGJbaisrXSA9IGM7CisJCX0KKwkJdGJbal0gPSBOVUw7CisJCQkJCS8qIGluc2VydCB0aGUgbGFzdCB0eXBlZCBjaGFyICovCisJCSh2b2lkKWluc190eXBlYnVmKHRiLCAxLCAwLCBUUlVFLCBtcC0+bV9zaWxlbnQpOworCSAgICB9CisJCQkJCS8qIGluc2VydCB0aGUgdG8gc3RyaW5nICovCisJICAgICh2b2lkKWluc190eXBlYnVmKG1wLT5tX3N0ciwgbXAtPm1fbm9yZW1hcCwgMCwgVFJVRSwgbXAtPm1fc2lsZW50KTsKKwkJCQkJLyogbm8gYWJicmV2LiBmb3IgdGhlc2UgY2hhcnMgKi8KKwkgICAgdHlwZWJ1Zi50Yl9ub19hYmJyX2NudCArPSAoaW50KVNUUkxFTihtcC0+bV9zdHIpICsgaiArIDE7CisKKwkgICAgdGJbMF0gPSBDdHJsX0g7CisJICAgIHRiWzFdID0gTlVMOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJbGVuID0gY2xlbjsJLyogRGVsZXRlIGNoYXJhY3RlcnMgaW5zdGVhZCBvZiBieXRlcyAqLworI2VuZGlmCisJICAgIHdoaWxlIChsZW4tLSA+IDApCQkvKiBkZWxldGUgdGhlIGZyb20gc3RyaW5nICovCisJCSh2b2lkKWluc190eXBlYnVmKHRiLCAxLCAwLCBUUlVFLCBtcC0+bV9zaWxlbnQpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFdyaXRlIG1hcCBjb21tYW5kcyBmb3IgdGhlIGN1cnJlbnQgbWFwcGluZ3MgdG8gYW4gLmV4cmMgZmlsZS4KKyAqIFJldHVybiBGQUlMIG9uIGVycm9yLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK21ha2VtYXAoZmQsIGJ1ZikKKyAgICBGSUxFCSpmZDsKKyAgICBidWZfVAkqYnVmOwkgICAgLyogYnVmZmVyIGZvciBsb2NhbCBtYXBwaW5ncyBvciBOVUxMICovCit7CisgICAgbWFwYmxvY2tfVAkqbXA7CisgICAgY2hhcl91CWMxLCBjMjsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcgkqY21kOworICAgIGludAkJYWJicjsKKyAgICBpbnQJCWhhc2g7CisgICAgaW50CQlkaWRfY3BvID0gRkFMU0U7CisgICAgaW50CQlpOworCisgICAgdmFsaWRhdGVfbWFwaGFzaCgpOworCisgICAgLyoKKyAgICAgKiBEbyB0aGUgbG9vcCB0d2ljZTogT25jZSBmb3IgbWFwcGluZ3MsIG9uY2UgZm9yIGFiYnJldmlhdGlvbnMuCisgICAgICogVGhlbiBsb29wIG92ZXIgYWxsIG1hcCBoYXNoIGxpc3RzLgorICAgICAqLworICAgIGZvciAoYWJiciA9IDA7IGFiYnIgPCAyOyArK2FiYnIpCisJZm9yIChoYXNoID0gMDsgaGFzaCA8IDI1NjsgKytoYXNoKQorCXsKKwkgICAgaWYgKGFiYnIpCisJICAgIHsKKwkJaWYgKGhhc2gpCSAgICAvKiB0aGVyZSBpcyBvbmx5IG9uZSBhYmJyIGxpc3QgKi8KKwkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkJaWYgKGJ1ZiAhPSBOVUxMKQorCQkgICAgbXAgPSBidWYtPmJfZmlyc3RfYWJicjsKKwkJZWxzZQorI2VuZGlmCisJCSAgICBtcCA9IGZpcnN0X2FiYnI7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQlpZiAoYnVmICE9IE5VTEwpCisJCSAgICBtcCA9IGJ1Zi0+Yl9tYXBoYXNoW2hhc2hdOworCQllbHNlCisjZW5kaWYKKwkJICAgIG1wID0gbWFwaGFzaFtoYXNoXTsKKwkgICAgfQorCisJICAgIGZvciAoIDsgbXA7IG1wID0gbXAtPm1fbmV4dCkKKwkgICAgeworCQkvKiBza2lwIHNjcmlwdC1sb2NhbCBtYXBwaW5ncyAqLworCQlpZiAobXAtPm1fbm9yZW1hcCA9PSBSRU1BUF9TQ1JJUFQpCisJCSAgICBjb250aW51ZTsKKworCQkvKiBza2lwIG1hcHBpbmdzIHRoYXQgY29udGFpbiBhIDxTTlI+IChzY3JpcHQtbG9jYWwgdGhpbmcpLAorCQkgKiB0aGV5IHByb2JhYmx5IGRvbid0IHdvcmsgd2hlbiBsb2FkZWQgYWdhaW4gKi8KKwkJZm9yIChwID0gbXAtPm1fc3RyOyAqcCAhPSBOVUw7ICsrcCkKKwkJICAgIGlmIChwWzBdID09IEtfU1BFQ0lBTCAmJiBwWzFdID09IEtTX0VYVFJBCisJCQkJCQkgICAgICAgJiYgcFsyXSA9PSAoaW50KUtFX1NOUikKKwkJCWJyZWFrOworCQlpZiAoKnAgIT0gTlVMKQorCQkgICAgY29udGludWU7CisKKwkJYzEgPSBOVUw7CisJCWMyID0gTlVMOworCQlpZiAoYWJicikKKwkJICAgIGNtZCA9ICJhYmJyIjsKKwkJZWxzZQorCQkgICAgY21kID0gIm1hcCI7CisJCXN3aXRjaCAobXAtPm1fbW9kZSkKKwkJeworCQkgICAgY2FzZSBOT1JNQUwgKyBWSVNVQUwgKyBPUF9QRU5ESU5HOgorCQkJYnJlYWs7CisJCSAgICBjYXNlIE5PUk1BTDoKKwkJCWMxID0gJ24nOworCQkJYnJlYWs7CisJCSAgICBjYXNlIFZJU1VBTDoKKwkJCWMxID0gJ3YnOworCQkJYnJlYWs7CisJCSAgICBjYXNlIE9QX1BFTkRJTkc6CisJCQljMSA9ICdvJzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBOT1JNQUwgKyBWSVNVQUw6CisJCQljMSA9ICduJzsKKwkJCWMyID0gJ3YnOworCQkJYnJlYWs7CisJCSAgICBjYXNlIFZJU1VBTCArIE9QX1BFTkRJTkc6CisJCQljMSA9ICd2JzsKKwkJCWMyID0gJ28nOworCQkJYnJlYWs7CisJCSAgICBjYXNlIE5PUk1BTCArIE9QX1BFTkRJTkc6CisJCQljMSA9ICduJzsKKwkJCWMyID0gJ28nOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRExJTkUgKyBJTlNFUlQ6CisJCQlpZiAoIWFiYnIpCisJCQkgICAgY21kID0gIm1hcCEiOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENNRExJTkU6CisJCQljMSA9ICdjJzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBJTlNFUlQ6CisJCQljMSA9ICdpJzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBMQU5HTUFQOgorCQkJYzEgPSAnbCc7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQlFTVNHKF8oIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIpKTsKKwkJCXJldHVybiBGQUlMOworCQl9CisJCWRvCS8qIG1heSBkbyB0aGlzIHR3aWNlIGlmIGMyIGlzIHNldCAqLworCQl7CisJCSAgICAvKiBXaGVuIG91dHB1dHRpbmcgPD4gZm9ybSwgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCAnY3BvJworCQkgICAgICogaXMgc2V0IHRvIHRoZSBWaW0gZGVmYXVsdC4gKi8KKwkJICAgIGlmICghZGlkX2NwbykKKwkJICAgIHsKKwkJCWlmICgqbXAtPm1fc3RyID09IE5VTCkJCS8qIHdpbGwgdXNlIDxOb3A+ICovCisJCQkgICAgZGlkX2NwbyA9IFRSVUU7CisJCQllbHNlCisJCQkgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKKwkJCQlmb3IgKHAgPSAoaSA/IG1wLT5tX3N0ciA6IG1wLT5tX2tleXMpOyAqcDsgKytwKQorCQkJCSAgICBpZiAoKnAgPT0gS19TUEVDSUFMIHx8ICpwID09IE5MKQorCQkJCQlkaWRfY3BvID0gVFJVRTsKKwkJCWlmIChkaWRfY3BvKQorCQkJeworCQkJICAgIGlmIChmcHJpbnRmKGZkLCAibGV0IHM6Y3BvX3NhdmU9JmNwbyIpIDwgMAorCQkJCSAgICB8fCBwdXRfZW9sKGZkKSA8IDAKKwkJCQkgICAgfHwgZnByaW50ZihmZCwgInNldCBjcG8mdmltIikgPCAwCisJCQkJICAgIHx8IHB1dF9lb2woZmQpIDwgMCkKKwkJCQlyZXR1cm4gRkFJTDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGlmIChjMSAmJiBwdXRjKGMxLCBmZCkgPCAwKQorCQkJcmV0dXJuIEZBSUw7CisJCSAgICBpZiAobXAtPm1fbm9yZW1hcCAhPSBSRU1BUF9ZRVMgJiYgZnByaW50ZihmZCwgIm5vcmUiKSA8IDApCisJCQlyZXR1cm4gRkFJTDsKKwkJICAgIGlmIChmcHJpbnRmKGZkLCBjbWQpIDwgMCkKKwkJCXJldHVybiBGQUlMOworCQkgICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGZwdXRzKCIgPGJ1ZmZlcj4iLCBmZCkgPCAwKQorCQkJcmV0dXJuIEZBSUw7CisJCSAgICBpZiAobXAtPm1fc2lsZW50ICYmIGZwdXRzKCIgPHNpbGVudD4iLCBmZCkgPCAwKQorCQkJcmV0dXJuIEZBSUw7CisKKwkJICAgIGlmICggICAgICAgcHV0YygnICcsIGZkKSA8IDAKKwkJCSAgICB8fCBwdXRfZXNjc3RyKGZkLCBtcC0+bV9rZXlzLCAwKSA9PSBGQUlMCisJCQkgICAgfHwgcHV0YygnICcsIGZkKSA8IDAKKwkJCSAgICB8fCBwdXRfZXNjc3RyKGZkLCBtcC0+bV9zdHIsIDEpID09IEZBSUwKKwkJCSAgICB8fCBwdXRfZW9sKGZkKSA8IDApCisJCQlyZXR1cm4gRkFJTDsKKwkJICAgIGMxID0gYzI7CisJCSAgICBjMiA9IE5VTDsKKwkJfQorCQl3aGlsZSAoYzEpOworCSAgICB9CisJfQorCisgICAgaWYgKGRpZF9jcG8pCisJaWYgKGZwcmludGYoZmQsICJsZXQgJmNwbz1zOmNwb19zYXZlIikgPCAwCisJCXx8IHB1dF9lb2woZmQpIDwgMAorCQl8fCBmcHJpbnRmKGZkLCAidW5sZXQgczpjcG9fc2F2ZSIpIDwgMAorCQl8fCBwdXRfZW9sKGZkKSA8IDApCisJICAgIHJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIHdyaXRlIGVzY2FwZSBzdHJpbmcgdG8gZmlsZQorICogIndoYXQiOiAwIGZvciA6bWFwIGxocywgMSBmb3IgOm1hcCByaHMsIDIgZm9yIDpzZXQKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK3B1dF9lc2NzdHIoZmQsIHN0cnN0YXJ0LCB3aGF0KQorICAgIEZJTEUJKmZkOworICAgIGNoYXJfdQkqc3Ryc3RhcnQ7CisgICAgaW50CQl3aGF0OworeworICAgIGNoYXJfdQkqc3RyID0gc3Ryc3RhcnQ7CisgICAgaW50CQljOworICAgIGludAkJbW9kaWZpZXJzOworCisgICAgLyogOm1hcCB4eCA8Tm9wPiAqLworICAgIGlmICgqc3RyID09IE5VTCAmJiB3aGF0ID09IDEpCisgICAgeworCWlmIChmcHJpbnRmKGZkLCAiPE5vcD4iKSA8IDApCisJICAgIHJldHVybiBGQUlMOworCXJldHVybiBPSzsKKyAgICB9CisKKyAgICBmb3IgKCA7ICpzdHIgIT0gTlVMOyArK3N0cikKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWNoYXJfdQkqcDsKKworCS8qIENoZWNrIGZvciBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLCB3aGljaCBtYXkgY29udGFpbiBlc2NhcGVkCisJICogS19TUEVDSUFMIGFuZCBDU0kgYnl0ZXMgKi8KKwlwID0gbWJfdW5lc2NhcGUoJnN0cik7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIHdoaWxlICgqcCAhPSBOVUwpCisJCWlmIChwdXRjKCpwKyssIGZkKSA8IDApCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgLS1zdHI7CisJICAgIGNvbnRpbnVlOworCX0KKyNlbmRpZgorCisJYyA9ICpzdHI7CisJLyoKKwkgKiBTcGVjaWFsIGtleSBjb2RlcyBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgdG8gYmUgYWJsZSB0byBtYWtlIHNlbnNlCisJICogd2hlbiB0aGV5IGFyZSByZWFkIGJhY2suCisJICovCisJaWYgKGMgPT0gS19TUEVDSUFMICYmIHdoYXQgIT0gMikKKwl7CisJICAgIG1vZGlmaWVycyA9IDB4MDsKKwkgICAgaWYgKHN0clsxXSA9PSBLU19NT0RJRklFUikKKwkgICAgeworCQltb2RpZmllcnMgPSBzdHJbMl07CisJCXN0ciArPSAzOworCQljID0gKnN0cjsKKwkgICAgfQorCSAgICBpZiAoYyA9PSBLX1NQRUNJQUwpCisJICAgIHsKKwkJYyA9IFRPX1NQRUNJQUwoc3RyWzFdLCBzdHJbMl0pOworCQlzdHIgKz0gMjsKKwkgICAgfQorCSAgICBpZiAoSVNfU1BFQ0lBTChjKSB8fCBtb2RpZmllcnMpCS8qIHNwZWNpYWwga2V5ICovCisJICAgIHsKKwkJaWYgKGZwcmludGYoZmQsIChjaGFyICopZ2V0X3NwZWNpYWxfa2V5X25hbWUoYywgbW9kaWZpZXJzKSkgPCAwKQorCQkgICAgcmV0dXJuIEZBSUw7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCisJLyoKKwkgKiBBICdcbicgaW4gYSBtYXAgY29tbWFuZCBzaG91bGQgYmUgd3JpdHRlbiBhcyA8Tkw+LgorCSAqIEEgJ1xuJyBpbiBhIHNldCBjb21tYW5kIHNob3VsZCBiZSB3cml0dGVuIGFzIFxeVl5KLgorCSAqLworCWlmIChjID09IE5MKQorCXsKKwkgICAgaWYgKHdoYXQgPT0gMikKKwkgICAgeworCQlpZiAoZnByaW50ZihmZCwgSUZfRUIoIlxcXDAyNlxuIiwgIlxcIiBDVFJMX1ZfU1RSICJcbiIpKSA8IDApCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKGZwcmludGYoZmQsICI8Tkw+IikgPCAwKQorCQkgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCisJLyoKKwkgKiBTb21lIGNoYXJhY3RlcnMgaGF2ZSB0byBiZSBlc2NhcGVkIHdpdGggQ1RSTC1WIHRvCisJICogcHJldmVudCB0aGVtIGZyb20gbWlzaW50ZXJwcmV0ZWQgaW4gRG9PbmVDbWQoKS4KKwkgKiBBIHNwYWNlLCBUYWIgYW5kICciJyBoYXMgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoIHRvCisJICogcHJldmVudCBpdCB0byBiZSBtaXNpbnRlcnByZXRlZCBpbiBkb19zZXQoKS4KKwkgKiBBIHNwYWNlIGhhcyB0byBiZSBlc2NhcGVkIHdpdGggYSBDVFJMLVYgd2hlbiBpdCdzIGF0IHRoZSBzdGFydCBvZiBhCisJICogIjptYXAiIHJocy4KKwkgKiBBICc8JyBoYXMgdG8gYmUgZXNjYXBlZCB3aXRoIGEgQ1RSTC1WIHRvIHByZXZlbnQgaXQgYmVpbmcKKwkgKiBpbnRlcnByZXRlZCBhcyB0aGUgc3RhcnQgb2YgYSBzcGVjaWFsIGtleSBuYW1lLgorCSAqIEEgc3BhY2UgaW4gdGhlIGxocyBvZiBhIDptYXAgbmVlZHMgYSBDVFJMLVYuCisJICovCisJaWYgKHdoYXQgPT0gMiAmJiAodmltX2lzd2hpdGUoYykgfHwgYyA9PSAnIicgfHwgYyA9PSAnXFwnKSkKKwl7CisJICAgIGlmIChwdXRjKCdcXCcsIGZkKSA8IDApCisJCXJldHVybiBGQUlMOworCX0KKwllbHNlIGlmIChjIDwgJyAnIHx8IGMgPiAnficgfHwgYyA9PSAnfCcKKwkJfHwgKHdoYXQgPT0gMCAmJiBjID09ICcgJykKKwkJfHwgKHdoYXQgPT0gMSAmJiBzdHIgPT0gc3Ryc3RhcnQgJiYgYyA9PSAnICcpCisJCXx8ICh3aGF0ICE9IDIgJiYgYyA9PSAnPCcpKQorCXsKKwkgICAgaWYgKHB1dGMoQ3RybF9WLCBmZCkgPCAwKQorCQlyZXR1cm4gRkFJTDsKKwl9CisJaWYgKHB1dGMoYywgZmQpIDwgMCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENoZWNrIGFsbCBtYXBwaW5ncyBmb3IgdGhlIHByZXNlbmNlIG9mIHNwZWNpYWwga2V5IGNvZGVzLgorICogVXNlZCBhZnRlciAiOnNldCB0ZXJtPXh4eCIuCisgKi8KKyAgICB2b2lkCitjaGVja19tYXBfa2V5Y29kZXMoKQoreworICAgIG1hcGJsb2NrX1QJKm1wOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CWJ1ZlszXTsKKyAgICBjaGFyX3UJKnNhdmVfbmFtZTsKKyAgICBpbnQJCWFiYnI7CisgICAgaW50CQloYXNoOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBidWZfVAkqYnA7CisjZW5kaWYKKworICAgIHZhbGlkYXRlX21hcGhhc2goKTsKKyAgICBzYXZlX25hbWUgPSBzb3VyY2luZ19uYW1lOworICAgIHNvdXJjaW5nX25hbWUgPSAoY2hhcl91ICopIm1hcHBpbmdzIjsgLyogYXZvaWRzIGdpdmluZyBlcnJvciBtZXNzYWdlcyAqLworCisjaWZkZWYgRkVBVF9MT0NBTE1BUAorICAgIC8qIFRoaXMgdGhpcyBvbmNlIGZvciBlYWNoIGJ1ZmZlciwgYW5kIHRoZW4gb25jZSBmb3IgZ2xvYmFsCisgICAgICogbWFwcGluZ3MvYWJicmV2aWF0aW9ucyB3aXRoIGJwID09IE5VTEwgKi8KKyAgICBmb3IgKGJwID0gZmlyc3RidWY7IDsgYnAgPSBicC0+Yl9uZXh0KQorICAgIHsKKyNlbmRpZgorCS8qCisJICogRG8gdGhlIGxvb3AgdHdpY2U6IE9uY2UgZm9yIG1hcHBpbmdzLCBvbmNlIGZvciBhYmJyZXZpYXRpb25zLgorCSAqIFRoZW4gbG9vcCBvdmVyIGFsbCBtYXAgaGFzaCBsaXN0cy4KKwkgKi8KKwlmb3IgKGFiYnIgPSAwOyBhYmJyIDw9IDE7ICsrYWJicikKKwkgICAgZm9yIChoYXNoID0gMDsgaGFzaCA8IDI1NjsgKytoYXNoKQorCSAgICB7CisJCWlmIChhYmJyKQorCQl7CisJCSAgICBpZiAoaGFzaCkJICAgIC8qIHRoZXJlIGlzIG9ubHkgb25lIGFiYnIgbGlzdCAqLworCQkJYnJlYWs7CisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCQkgICAgaWYgKGJwICE9IE5VTEwpCisJCQltcCA9IGJwLT5iX2ZpcnN0X2FiYnI7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCW1wID0gZmlyc3RfYWJicjsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJCSAgICBpZiAoYnAgIT0gTlVMTCkKKwkJCW1wID0gYnAtPmJfbWFwaGFzaFtoYXNoXTsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJbXAgPSBtYXBoYXNoW2hhc2hdOworCQl9CisJCWZvciAoIDsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bV9uZXh0KQorCQl7CisJCSAgICBmb3IgKGkgPSAwOyBpIDw9IDE7ICsraSkJLyogZG8gdGhpcyB0d2ljZSAqLworCQkgICAgeworCQkJaWYgKGkgPT0gMCkKKwkJCSAgICBwID0gbXAtPm1fa2V5czsJLyogb25jZSBmb3IgdGhlICJmcm9tIiBwYXJ0ICovCisJCQllbHNlCisJCQkgICAgcCA9IG1wLT5tX3N0cjsJLyogYW5kIG9uY2UgZm9yIHRoZSAidG8iIHBhcnQgKi8KKwkJCXdoaWxlICgqcCkKKwkJCXsKKwkJCSAgICBpZiAoKnAgPT0gS19TUEVDSUFMKQorCQkJICAgIHsKKwkJCQkrK3A7CisJCQkJaWYgKCpwIDwgMTI4KSAgIC8qIGZvciAibm9ybWFsIiB0Y2FwIGVudHJpZXMgKi8KKwkJCQl7CisJCQkJICAgIGJ1ZlswXSA9IHBbMF07CisJCQkJICAgIGJ1ZlsxXSA9IHBbMV07CisJCQkJICAgIGJ1ZlsyXSA9IE5VTDsKKwkJCQkgICAgKHZvaWQpYWRkX3Rlcm1jYXBfZW50cnkoYnVmLCBGQUxTRSk7CisJCQkJfQorCQkJCSsrcDsKKwkJCSAgICB9CisJCQkgICAgKytwOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisJaWYgKGJwID09IE5VTEwpCisJICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIHNvdXJjaW5nX25hbWUgPSBzYXZlX25hbWU7Cit9CisKKyNpZmRlZiBGRUFUX0VWQUwKKy8qCisgKiBDaGVjayB0aGUgc3RyaW5nICJrZXlzIiBhZ2FpbnN0IHRoZSBsaHMgb2YgYWxsIG1hcHBpbmdzCisgKiBSZXR1cm4gcG9pbnRlciB0byByaHMgb2YgbWFwcGluZyAobWFwYmxvY2stPm1fc3RyKQorICogTlVMTCBvdGhlcndpc2UKKyAqLworICAgIGNoYXJfdSAqCitjaGVja19tYXAoa2V5cywgbW9kZSwgZXhhY3QpCisgICAgY2hhcl91CSprZXlzOworICAgIGludAkJbW9kZTsKKyAgICBpbnQJCWV4YWN0OwkJLyogcmVxdWlyZSBleGFjdCBtYXRjaCAqLworeworICAgIGludAkJaGFzaDsKKyAgICBpbnQJCWxlbiwgbWlubGVuOworICAgIG1hcGJsb2NrX1QJKm1wOworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKyAgICBpbnQJCWxvY2FsOworI2VuZGlmCisKKyAgICB2YWxpZGF0ZV9tYXBoYXNoKCk7CisKKyAgICBsZW4gPSAoaW50KVNUUkxFTihrZXlzKTsKKyNpZmRlZiBGRUFUX0xPQ0FMTUFQCisgICAgZm9yIChsb2NhbCA9IDE7IGxvY2FsID49IDA7IC0tbG9jYWwpCisjZW5kaWYKKwkvKiBsb29wIG92ZXIgYWxsIGhhc2ggbGlzdHMgKi8KKwlmb3IgKGhhc2ggPSAwOyBoYXNoIDwgMjU2OyArK2hhc2gpCisJeworI2lmZGVmIEZFQVRfTE9DQUxNQVAKKwkgICAgaWYgKGxvY2FsKQorCQltcCA9IGN1cmJ1Zi0+Yl9tYXBoYXNoW2hhc2hdOworCSAgICBlbHNlCisjZW5kaWYKKwkJbXAgPSBtYXBoYXNoW2hhc2hdOworCSAgICBmb3IgKCA7IG1wICE9IE5VTEw7IG1wID0gbXAtPm1fbmV4dCkKKwkgICAgeworCQkvKiBza2lwIGVudHJpZXMgd2l0aCB3cm9uZyBtb2RlLCB3cm9uZyBsZW5ndGggYW5kIG5vdCBtYXRjaGluZworCQkgKiBvbmVzICovCisJCWlmIChtcC0+bV9rZXlsZW4gPCBsZW4pCisJCSAgICBtaW5sZW4gPSBtcC0+bV9rZXlsZW47CisJCWVsc2UKKwkJICAgIG1pbmxlbiA9IGxlbjsKKwkJaWYgKChtcC0+bV9tb2RlICYgbW9kZSkKKwkJCSYmICghZXhhY3QgfHwgbXAtPm1fa2V5bGVuID09IGxlbikKKwkJCSYmIFNUUk5DTVAobXAtPm1fa2V5cywga2V5cywgbWlubGVuKSA9PSAwKQorCQkgICAgcmV0dXJuIG1wLT5tX3N0cjsKKwkgICAgfQorCX0KKworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qCisgKiBEZWZhdWx0IG1hcHBpbmdzIGZvciBzb21lIG9mdGVuIHVzZWQga2V5cy4KKyAqLworc3RhdGljIHN0cnVjdCBpbml0bWFwCit7CisgICAgY2hhcl91CSphcmc7CisgICAgaW50CQltb2RlOworfSBpbml0bWFwcGluZ3NbXSA9Cit7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpCisJLyogVXNlIHRoZSBXaW5kb3dzIChDVUEpIGtleWJpbmRpbmdzLiAqLworIyBpZmRlZiBGRUFUX0dVSQorCXsoY2hhcl91ICopIjxDLVBhZ2VVcD4gSCIsIE5PUk1BTCtWSVNVQUx9LAorCXsoY2hhcl91ICopIjxDLVBhZ2VVcD4gPEMtTz5IIixJTlNFUlR9LAorCXsoY2hhcl91ICopIjxDLVBhZ2VEb3duPiBMJCIsIE5PUk1BTCtWSVNVQUx9LAorCXsoY2hhcl91ICopIjxDLVBhZ2VEb3duPiA8Qy1PPkw8Qy1PPiQiLCBJTlNFUlR9LAorCisJLyogcGFzdGUsIGNvcHkgYW5kIGN1dCAqLworCXsoY2hhcl91ICopIjxTLUluc2VydD4gXCIqUCIsIE5PUk1BTH0sCisJeyhjaGFyX3UgKikiPFMtSW5zZXJ0PiBcIi1kXCIqUCIsIFZJU1VBTH0sCisJeyhjaGFyX3UgKikiPFMtSW5zZXJ0PiA8Qy1SPjxDLU8+KiIsIElOU0VSVCtDTURMSU5FfSwKKwl7KGNoYXJfdSAqKSI8Qy1JbnNlcnQ+IFwiKnkiLCBWSVNVQUx9LAorCXsoY2hhcl91ICopIjxTLURlbD4gXCIqZCIsIFZJU1VBTH0sCisJeyhjaGFyX3UgKikiPEMtRGVsPiBcIipkIiwgVklTVUFMfSwKKwl7KGNoYXJfdSAqKSI8Qy1YPiBcIipkIiwgVklTVUFMfSwKKwkvKiBNaXNzaW5nOiBDVFJMLUMgKGNhbmNlbCkgYW5kIENUUkwtViAoYmxvY2sgc2VsZWN0aW9uKSAqLworIyBlbHNlCisJeyhjaGFyX3UgKikiXDMxNlwyMDQgSCIsIE5PUk1BTCtWSVNVQUx9LCAgICAvKiBDVFJMLVBhZ2VVcCBpcyAiSCIgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDIwNCBcMDE3SCIsSU5TRVJUfSwJICAgIC8qIENUUkwtUGFnZVVwIGlzICJeT0giKi8KKwl7KGNoYXJfdSAqKSJcMzE2diBMJCIsIE5PUk1BTCtWSVNVQUx9LAkgICAgLyogQ1RSTC1QYWdlRG93biBpcyAiTCQiICovCisJeyhjaGFyX3UgKikiXDMxNnYgXDAxN0xcMDE3JCIsIElOU0VSVH0sCSAgICAvKiBDVFJMLVBhZ2VEb3duID0iXk9MXk8kIiovCisJeyhjaGFyX3UgKikiXDMxNncgPEMtSG9tZT4iLCBOT1JNQUwrVklTVUFMfSwKKwl7KGNoYXJfdSAqKSJcMzE2dyA8Qy1Ib21lPiIsIElOU0VSVCtDTURMSU5FfSwKKwl7KGNoYXJfdSAqKSJcMzE2dSA8Qy1FbmQ+IiwgTk9STUFMK1ZJU1VBTH0sCisJeyhjaGFyX3UgKikiXDMxNnUgPEMtRW5kPiIsIElOU0VSVCtDTURMSU5FfSwKKworCS8qIHBhc3RlLCBjb3B5IGFuZCBjdXQgKi8KKyMgIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisjICAgaWZkZWYgREpHUFAKKwl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcIipQIiwgTk9STUFMfSwJICAgIC8qIFNISUZULUluc2VydCBpcyAiKlAgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcIi1kXCIqUCIsIFZJU1VBTH0sICAgIC8qIFNISUZULUluc2VydCBpcyAiLWQiKlAgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcMDIyXDAxNyoiLCBJTlNFUlR9LCAgLyogU0hJRlQtSW5zZXJ0IGlzIF5SXk8qICovCisJeyhjaGFyX3UgKikiXDMxNlwyMjIgXCIqeSIsIFZJU1VBTH0sCSAgICAvKiBDVFJMLUluc2VydCBpcyAiKnkgKi8KKyMgICAgaWYgMCAvKiBTaGlmdC1EZWwgcHJvZHVjZXMgdGhlIHNhbWUgY29kZSBhcyBEZWwgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDEyMyBcIipkIiwgVklTVUFMfSwJICAgIC8qIFNISUZULURlbCBpcyAiKmQgKi8KKyMgICAgZW5kaWYKKwl7KGNoYXJfdSAqKSJcMzE2XDIyMyBcIipkIiwgVklTVUFMfSwJICAgIC8qIENUUkwtRGVsIGlzICIqZCAqLworCXsoY2hhcl91ICopIlwwMzAgXCItZCIsIFZJU1VBTH0sCSAgICAvKiBDVFJMLVggaXMgIi1kICovCisjICAgZWxzZQorCXsoY2hhcl91ICopIlwzMTZcMzI0IFwiKlAiLCBOT1JNQUx9LAkgICAgLyogU0hJRlQtSW5zZXJ0IGlzICIqUCAqLworCXsoY2hhcl91ICopIlwzMTZcMzI0IFwiLWRcIipQIiwgVklTVUFMfSwgICAgLyogU0hJRlQtSW5zZXJ0IGlzICItZCIqUCAqLworCXsoY2hhcl91ICopIlwzMTZcMzI0IFwwMjJcMDE3KiIsIElOU0VSVH0sICAvKiBTSElGVC1JbnNlcnQgaXMgXlJeTyogKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDMyNSBcIip5IiwgVklTVUFMfSwJICAgIC8qIENUUkwtSW5zZXJ0IGlzICIqeSAqLworCXsoY2hhcl91ICopIlwzMTZcMzI3IFwiKmQiLCBWSVNVQUx9LAkgICAgLyogU0hJRlQtRGVsIGlzICIqZCAqLworCXsoY2hhcl91ICopIlwzMTZcMzMwIFwiKmQiLCBWSVNVQUx9LAkgICAgLyogQ1RSTC1EZWwgaXMgIipkICovCisJeyhjaGFyX3UgKikiXDAzMCBcIi1kIiwgVklTVUFMfSwJICAgIC8qIENUUkwtWCBpcyAiLWQgKi8KKyMgICBlbmRpZgorIyAgZWxzZQorCXsoY2hhcl91ICopIlwzMTZcMzI0IFAiLCBOT1JNQUx9LAkgICAgLyogU0hJRlQtSW5zZXJ0IGlzIFAgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDMyNCBcIi1kUCIsIFZJU1VBTH0sCSAgICAvKiBTSElGVC1JbnNlcnQgaXMgIi1kUCAqLworCXsoY2hhcl91ICopIlwzMTZcMzI0IFwwMjJcMDE3XCIiLCBJTlNFUlR9LCAvKiBTSElGVC1JbnNlcnQgaXMgXlJeTyIgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDMyNSB5IiwgVklTVUFMfSwJICAgIC8qIENUUkwtSW5zZXJ0IGlzIHkgKi8KKwl7KGNoYXJfdSAqKSJcMzE2XDMyNyBkIiwgVklTVUFMfSwJICAgIC8qIFNISUZULURlbCBpcyBkICovCisJeyhjaGFyX3UgKikiXDMxNlwzMzAgZCIsIFZJU1VBTH0sCSAgICAvKiBDVFJMLURlbCBpcyBkICovCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1BQ09TKQorCS8qIFVzZSB0aGUgU3RhbmRhcmQgTWFjT1MgYmluZGluZy4gKi8KKwkvKiBwYXN0ZSwgY29weSBhbmQgY3V0ICovCisJeyhjaGFyX3UgKikiPEQtdj4gXCIqUCIsIE5PUk1BTH0sCisJeyhjaGFyX3UgKikiPEQtdj4gXCItZFwiKlAiLCBWSVNVQUx9LAorCXsoY2hhcl91ICopIjxELXY+IDxDLVI+KiIsIElOU0VSVCtDTURMSU5FfSwKKwl7KGNoYXJfdSAqKSI8RC1jPiBcIip5IiwgVklTVUFMfSwKKwl7KGNoYXJfdSAqKSI8RC14PiBcIipkIiwgVklTVUFMfSwKKwl7KGNoYXJfdSAqKSI8QmFja3NwYWNlPiBcIi1kIiwgVklTVUFMfSwKKyNlbmRpZgorCisJLyogTWFwIGV4dHJhIGtleXMgdG8gdGhlaXIgbm9ybWFsIGVxdWl2YWxlbnRzLiAqLworCXsoY2hhcl91ICopIjx4RjE+IDxGMT4iLCBOT1JNQUwrVklTVUFMK09QX1BFTkRJTkd9LAorCXsoY2hhcl91ICopIjx4RjE+IDxGMT4iLCBJTlNFUlQrQ01ETElORX0sCisJeyhjaGFyX3UgKikiPHhGMj4gPEYyPiIsIE5PUk1BTCtWSVNVQUwrT1BfUEVORElOR30sCisJeyhjaGFyX3UgKikiPHhGMj4gPEYyPiIsIElOU0VSVCtDTURMSU5FfSwKKwl7KGNoYXJfdSAqKSI8eEYzPiA8RjM+IiwgTk9STUFMK1ZJU1VBTCtPUF9QRU5ESU5HfSwKKwl7KGNoYXJfdSAqKSI8eEYzPiA8RjM+IiwgSU5TRVJUK0NNRExJTkV9LAorCXsoY2hhcl91ICopIjx4RjQ+IDxGND4iLCBOT1JNQUwrVklTVUFMK09QX1BFTkRJTkd9LAorCXsoY2hhcl91ICopIjx4RjQ+IDxGND4iLCBJTlNFUlQrQ01ETElORX0sCisJeyhjaGFyX3UgKikiPFMteEYxPiA8Uy1GMT4iLCBOT1JNQUwrVklTVUFMK09QX1BFTkRJTkd9LAorCXsoY2hhcl91ICopIjxTLXhGMT4gPFMtRjE+IiwgSU5TRVJUK0NNRExJTkV9LAorCXsoY2hhcl91ICopIjxTLXhGMj4gPFMtRjI+IiwgTk9STUFMK1ZJU1VBTCtPUF9QRU5ESU5HfSwKKwl7KGNoYXJfdSAqKSI8Uy14RjI+IDxTLUYyPiIsIElOU0VSVCtDTURMSU5FfSwKKwl7KGNoYXJfdSAqKSI8Uy14RjM+IDxTLUYzPiIsIE5PUk1BTCtWSVNVQUwrT1BfUEVORElOR30sCisJeyhjaGFyX3UgKikiPFMteEYzPiA8Uy1GMz4iLCBJTlNFUlQrQ01ETElORX0sCisJeyhjaGFyX3UgKikiPFMteEY0PiA8Uy1GND4iLCBOT1JNQUwrVklTVUFMK09QX1BFTkRJTkd9LAorCXsoY2hhcl91ICopIjxTLXhGND4gPFMtRjQ+IiwgSU5TRVJUK0NNRExJTkV9LAorCXsoY2hhcl91ICopIjx4RU5EPiA8RU5EPiIsIE5PUk1BTCtWSVNVQUwrT1BfUEVORElOR30sCisJeyhjaGFyX3UgKikiPHhFTkQ+IDxFTkQ+IiwgSU5TRVJUK0NNRExJTkV9LAorCXsoY2hhcl91ICopIjx4SE9NRT4gPEhPTUU+IiwgTk9STUFMK1ZJU1VBTCtPUF9QRU5ESU5HfSwKKwl7KGNoYXJfdSAqKSI8eEhPTUU+IDxIT01FPiIsIElOU0VSVCtDTURMSU5FfSwKK307CisKKy8qCisgKiBTZXQgdXAgZGVmYXVsdCBtYXBwaW5ncy4KKyAqLworICAgIHZvaWQKK2luaXRfbWFwcGluZ3MoKQoreworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5pdG1hcHBpbmdzKSAvIHNpemVvZihzdHJ1Y3QgaW5pdG1hcCk7ICsraSkKKwlhZGRfbWFwKGluaXRtYXBwaW5nc1tpXS5hcmcsIGluaXRtYXBwaW5nc1tpXS5tb2RlKTsKK30KKworLyoKKyAqIEFkZCBhIG1hcHBpbmcgIm1hcCIgZm9yIG1vZGUgIm1vZGUiLgorICogTmVlZCB0byBwdXQgc3RyaW5nIGluIGFsbG9jYXRlZCBtZW1vcnksIGJlY2F1c2UgZG9fbWFwKCkgd2lsbCBtb2RpZnkgaXQuCisgKi8KKyAgICB2b2lkCithZGRfbWFwKG1hcCwgbW9kZSkKKyAgICBjaGFyX3UJKm1hcDsKKyAgICBpbnQJCW1vZGU7Cit7CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqY3BvX3NhdmUgPSBwX2NwbzsKKworICAgIHBfY3BvID0gKGNoYXJfdSAqKSIiOwkvKiBBbGxvdyA8PiBub3RhdGlvbiAqLworICAgIHMgPSB2aW1fc3Ryc2F2ZShtYXApOworICAgIGlmIChzICE9IE5VTEwpCisgICAgeworCSh2b2lkKWRvX21hcCgwLCBzLCBtb2RlLCBGQUxTRSk7CisJdmltX2ZyZWUocyk7CisgICAgfQorICAgIHBfY3BvID0gY3BvX3NhdmU7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ2xibF9pbWUuY3BwIGIvc3JjL2dsYmxfaW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDJhMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsYmxfaW1lLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBERVNDUklQVElPTjoKKyAqIFRoaXMgbW9kdWxlIHByb2R1Y2VzIEdsb2JhbCBJTUUgZm9yIFZpbSwgb24gV2luZG93cyB3aXRoIEludGVybmV0CisgKiBFeHBsb3JlciA1LjAxIG9yIGhpZ2hlci4gIFlvdSBuZWVkIHRocmVlIGZpbGVzICJkaW1tLmlkbCIsICJkaW1tLmgiLCBhbmQKKyAqICJkaW1tX2kuYyIgd2hlbiBjb21waWxlIHRoaXMgbW9kdWxlIGF0IHlvdXIgc2VsZi4gICJkaW1tLmgiLCBhbmQKKyAqICJkaW1tX2kuYyIgYXJlIGdlbmVyYXRlZCBmcm9tICJkaW1tLmlkbCIgYnkgdXNpbmcgTUlETC5FWEUgYXMgbGlrZQorICogImlmX29sZS5oIi4gIFlvdSBjYW4gZ2V0ICJkaW1tLmlkbCIgaW4gTVNETiB3ZWIgc2l0ZS4gIEkgZ290IGl0IGJlbG93CisgKiBVUkwuCisgKgorICogV0hBVCBJUyBUSEUgR0xPQkFMIElNRT86CisgKiBHbG9iYWwgSU1FIG1ha2VzIGNhcGFiaWxpdHkgaW5wdXQgQ2hpbmVzZSwgSmFwYW5lc2UsIGFuZCBLb3JlYW4gdGV4dCBpbnRvCisgKiBWaW0gYnVmZmVyIG9uIGFueSBsYW5ndWFnZSB2ZXJzaW9uIG9mIFdpbmRvd3MgOTgsIFdpbmRvd3MgOTUsIGFuZCBXaW5kb3dzCisgKiBOVCA0LjAuICBTZWUgYmVsb3cgVVJMIGZvciBkZXRhaWwgb2YgR2xvYmFsIElNRS4gIFlvdSBjYW4gYWxzbyBmaW5kCisgKiB2YXJpb3VzIGxhZ3VhZ2UgdmVyc2lvbiBvZiBHbG9iYWwgSU1FIGF0IHNhbWUgcGxhY2UuCisgKgorICogUlVOVElNRSBSRVFVSVJFTUVOVFM6CisgKiAtIEludGVybmV0IEV4cHJvbGVyIDUuMDEgb3IgaGlnaGVyLgorICogLSBHbG9iYWwgSU1FICh3aXRoIGxhbmd1YWdlIHBhY2s/KS4KKyAqIC0gT2YgY291cnNlIFZpbSBmb3IgV2luZG93cy4KKyAqCisgKiBVUkxTOgorICogLSBXaGVyZSB5b3UgY2FuIHByb2JhYmx5IGdldCAiZGltbS5pZGwiLgorICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvc2FtcGxlcy9pbnRlcm5ldC9saWJyYXJpZXMvaWU1X2xpYi9zYW1wbGUuYXNwCisgKiAtIEdsb2JhbCBJTUUgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93cy9pZS9mZWF0dXJlcy9pbWUuYXNwCisgKi8KKworI2lmZGVmIEdMT0JBTF9JTUUKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG9iamJhc2UuaD4KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInZpbS5oIgorfQorI2luY2x1ZGUgImRpbW0uaCIKKyNpbmNsdWRlICJnbGJsX2ltZS5oIgorCitzdGF0aWMgSUFjdGl2ZUlNTUFwcCAqcElBcHAgPSBOVUxMOworc3RhdGljIElBY3RpdmVJTU1NZXNzYWdlUHVtcE93bmVyICpwSU1zZyA9IE5VTEw7CitzdGF0aWMgSFdORCBzX2hXbmQgPSBOVUxMOworc3RhdGljIEJPT0wgc19iU3RhdHVzID0gRkFMU0U7IC8qIGZvciBldmFjdWF0ZSAqLworCisvKgorICogSW5pdGlhbGl6ZSBHbG9iYWwgSU1FLgorICogImF0b20iIG11c3QgYmUgcmV0dXJuIHZhbHVlIG9mIFJlZ2lzdGVyQ2xhc3MoRXgpLgorICovCisgICAgdm9pZAorZ2xvYmFsX2ltZV9pbml0KEFUT00gYXRvbSwgSFdORCBoV25kKQoreworICAgIElVbmtub3duICpwSTsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaWYgKHBJQXBwICE9IE5VTEwgfHwgcElNc2cgIT0gTlVMTCkKKwlyZXR1cm47CisgICAgT2xlSW5pdGlhbGl6ZShOVUxMKTsKKworICAgIC8qCisgICAgICogR2V0IGludGVyZmFjZSBJVW5rbm93bgorICAgICAqLworICAgIGhyID0gQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9DQWN0aXZlSU1NLCBOVUxMLCBDTFNDVFhfU0VSVkVSLAorCSAgICBJSURfSVVua25vd24sICh2b2lkKiopJnBJKTsKKyAgICBpZiAoRkFJTEVEKGhyKSB8fCAhcEkpCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBHZXQgaW50ZXJmYWNlIElBY3RpdmVJTU1BcHAKKyAgICAgKi8KKyAgICBociA9IHBJLT5RdWVyeUludGVyZmFjZShJSURfSUFjdGl2ZUlNTUFwcCwgKHZvaWQqKikmcElBcHApOworICAgIGlmIChGQUlMRUQoaHIpKQorCXBJQXBwID0gTlVMTDsKKworICAgIC8qCisgICAgICogR2V0IGludGVyZmFjZSBJQWN0aXZlSU1NTWVzc2FnZVB1bXBPd25lcgorICAgICAqLworICAgIGhyID0gcEktPlF1ZXJ5SW50ZXJmYWNlKElJRF9JQWN0aXZlSU1NTWVzc2FnZVB1bXBPd25lciwgKHZvaWQqKikmcElNc2cpOworICAgIGlmIChGQUlMRUQoaHIpKQorCXBJTXNnID0gTlVMTDsKKworICAgIGlmIChwSUFwcCAhPSBOVUxMKQorICAgIHsKKwlwSUFwcC0+QWN0aXZhdGUoVFJVRSk7CisJcElBcHAtPkZpbHRlckNsaWVudFdpbmRvd3MoJmF0b20sIDEpOworICAgIH0KKyAgICBpZiAocElNc2cgIT0gTlVMTCkKKwlwSU1zZy0+U3RhcnQoKTsKKworICAgIHBJLT5SZWxlYXNlKCk7CisgICAgc19oV25kID0gaFduZDsKK30KKworLyoKKyAqIFJlc2V0IGFuZCBjbGVhciBHbG9iYWwgSU1FLgorICovCisgICAgdm9pZAorZ2xvYmFsX2ltZV9lbmQoKQoreworICAgIGlmIChwSUFwcCAhPSBOVUxMKQorICAgIHsKKwlJQWN0aXZlSU1NQXBwICpwID0gcElBcHA7CisKKwlwSUFwcCA9IE5VTEw7CisJcC0+RmlsdGVyQ2xpZW50V2luZG93cyhOVUxMLCAwKTsKKwlwLT5EZWFjdGl2YXRlKCk7CisJcC0+UmVsZWFzZSgpOworICAgIH0KKyAgICBpZiAocElNc2cgIT0gTlVMTCkKKyAgICB7CisJSUFjdGl2ZUlNTU1lc3NhZ2VQdW1wT3duZXIgKnAgPSBwSU1zZzsKKworCXBJTXNnID0gTlVMTDsKKwlwLT5FbmQoKTsKKwlwLT5SZWxlYXNlKCk7CisgICAgfQorICAgIE9sZVVuaW5pdGlhbGl6ZSgpOworfQorCisvKgorICogUmVwbGFjZW1lbnQgZm9yIERlZldpbmRvd1Byb2MoKS4KKyAqLworICAgIExSRVNVTFQgV0lOQVBJCitnbG9iYWxfaW1lX0RlZldpbmRvd1Byb2MoSFdORCBoV25kLCBVSU5UIE1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUkVTVUxUIGxSZXN1bHQ7CisKKyAgICBpZiAocElBcHAgPT0gTlVMTCB8fCBwSUFwcC0+T25EZWZXaW5kb3dQcm9jKGhXbmQsIE1zZywKKwkJCQkJICAgIHdQYXJhbSwgbFBhcmFtLCAmbFJlc3VsdCkgIT0gU19PSykKKyAgICB7CisjaWYgZGVmaW5lZChXSU4zMjY0KSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCisJaWYgKHdpZGVfV2luZG93UHJvYykKKwkgICAgbFJlc3VsdCA9IERlZldpbmRvd1Byb2NXKGh3bmQsIE1zZywgd1BhcmFtLCBsUGFyYW0pOworCWVsc2UKKyNlbmRpZgorCSAgICBsUmVzdWx0ID0gRGVmV2luZG93UHJvYyhoV25kLCBNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9CisgICAgcmV0dXJuIGxSZXN1bHQ7Cit9CisKKy8qCisgKiBSZXBsYWNlIHdpdGggVHJhbnNsYXRlTWVzc2FnZSgpCisgKi8KKyAgICBCT09MIFdJTkFQSQorZ2xvYmFsX2ltZV9UcmFuc2xhdGVNZXNzYWdlKENPTlNUIE1TRyAqbHBNc2cpCit7CisgICAgaWYgKHBJTXNnID09IE5VTEwgfHwgcElNc2ctPk9uVHJhbnNsYXRlTWVzc2FnZShscE1zZykgPT0gU19GQUxTRSkKKwlyZXR1cm4gVHJhbnNsYXRlTWVzc2FnZShscE1zZyk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBTZXQgcG9zaXRpb24gb2YgSU1FIGNvbXBvdGlzaW9uIHdpbmRvdy4KKyAqCisgKiBZb3UgaGF2ZSB0byBjYWxsIHRoaXMgYmVmb3JlIHN0YXJ0aW5nIGNvbXBvc2l0aW9uLiAgSWYgb25jZSBjb21wb3NpdGlvbgorICogc3RhcnRlZCwgdGhpcyBjYW4gdGFrZSBubyBlZmZlY3QgdW50aWwgdGhhdCBjb21wb3NpdGlvbiBoYXZlIGZpbmlzZWQuICBTbworICogeW91IHNob3VsZCBoYW5kbGUgV01fSU1FX1NUQVJUQ09NUE9TSVRJT04gYW5kIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqLworICAgIHZvaWQgV0lOQVBJCitnbG9iYWxfaW1lX3NldF9wb3NpdGlvbihQT0lOVCAqcFBvaW50KQoreworICAgIEhJTUMgaEltYyA9IE5VTEw7CisKKyAgICBpZiAocElBcHAgPT0gTlVMTCB8fCBwUG9pbnQgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAoU1VDQ0VFREVEKHBJQXBwLT5HZXRDb250ZXh0KHNfaFduZCwgJmhJbWMpKSkKKyAgICB7CisJQ09NUE9TSVRJT05GT1JNIENvbXBGb3JtOworCisJQ29tcEZvcm0uZHdTdHlsZSA9IENGU19QT0lOVDsKKwlDb21wRm9ybS5wdEN1cnJlbnRQb3MgPSAqcFBvaW50OworCXBJQXBwLT5TZXRDb21wb3NpdGlvbldpbmRvdyhoSW1jLCAmQ29tcEZvcm0pOworCXBJQXBwLT5SZWxlYXNlQ29udGV4dChzX2hXbmQsIGhJbWMpOworICAgIH0KK30KKworLyoKKyAqIFNldCBmb250IHRvIEdsb2JhbCBJTUUKKyAqLworLyogR0lNRV9URVNUICovCisgICAgdm9pZCBXSU5BUEkKK2dsb2JhbF9pbWVfc2V0X2ZvbnQoTE9HRk9OVCAqcEZvbnQpCit7CisgICAgSElNQyBoSW1jID0gTlVMTDsKKworICAgIGlmIChwSUFwcCA9PSBOVUxMIHx8IHBGb250ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKFNVQ0NFRURFRChwSUFwcC0+R2V0Q29udGV4dChzX2hXbmQsICZoSW1jKSkpCisgICAgeworCXBJQXBwLT5TZXRDb21wb3NpdGlvbkZvbnRBKGhJbWMsIHBGb250KTsKKwlwSUFwcC0+UmVsZWFzZUNvbnRleHQoc19oV25kLCBoSW1jKTsKKyAgICB9Cit9CisKKy8qCisgKiBmb3IgSU1FIGNvbnRyb2wuICBTYXZlIGN1cnJlbnQgc3RhdHVzIG9mIElNRSwgYW5kIHNldCBmb3JjZSBuZXctc3RhdHVzIHRvCisgKiBFbmdsbGlzaCAodHVybiBvZmYpLgorICovCisgICAgdm9pZCBXSU5BUEkKK2dsb2JhbF9pbWVfc3RhdHVzX2V2YWN1YXRlKCkKK3sKKyAgICBISU1DICAgIGhJbWM7CisKKyAgICBpZiAocElBcHAgIT0gTlVMTCAmJiBTVUNDRUVERUQocElBcHAtPkdldENvbnRleHQoc19oV25kLCAmaEltYykpKQorICAgIHsKKwlzX2JTdGF0dXMgPSAocElBcHAtPkdldE9wZW5TdGF0dXMoaEltYykgPT0gMCkgPyBUUlVFIDogRkFMU0U7CisJcElBcHAtPlNldE9wZW5TdGF0dXMoaEltYywgRkFMU0UpOworCXBJQXBwLT5SZWxlYXNlQ29udGV4dChzX2hXbmQsIGhJbWMpOworICAgIH0KK30KKworLyoKKyAqIGZvciBJTUUgY29udHJvbC4gIENoYW5nZSBJTUUgc3RhdHVzIHRvIGxhc3Qgc2F2ZWQgb25lLgorICovCisgICAgdm9pZCBXSU5BUEkKK2dsb2JhbF9pbWVfc3RhdHVzX3Jlc3RvcmUoKQoreworICAgIEhJTUMgICAgaEltYzsKKworICAgIGlmIChwSUFwcCAhPSBOVUxMICYmIFNVQ0NFRURFRChwSUFwcC0+R2V0Q29udGV4dChzX2hXbmQsICZoSW1jKSkpCisgICAgeworCXBJQXBwLT5TZXRPcGVuU3RhdHVzKGhJbWMsIHNfYlN0YXR1cyk7CisJcElBcHAtPlJlbGVhc2VDb250ZXh0KHNfaFduZCwgaEltYyk7CisgICAgfQorfQorCisgICAgdm9pZCBXSU5BUEkKK2dsb2JhbF9pbWVfc2V0X3N0YXR1cyhpbnQgc3RhdHVzKQoreworICAgIEhJTUMgICAgaEltYzsKKworICAgIGlmIChwSUFwcCAhPSBOVUxMICYmIFNVQ0NFRURFRChwSUFwcC0+R2V0Q29udGV4dChzX2hXbmQsICZoSW1jKSkpCisgICAgeworCXBJQXBwLT5TZXRPcGVuU3RhdHVzKGhJbWMsIHN0YXR1cyA/IFRSVUUgOiBGQUxTRSk7CisJcElBcHAtPlJlbGVhc2VDb250ZXh0KHNfaFduZCwgaEltYyk7CisgICAgfQorfQorCisgICAgaW50IFdJTkFQSQorZ2xvYmFsX2ltZV9nZXRfc3RhdHVzKCkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBISU1DICAgIGhJbWM7CisKKyAgICBpZiAocElBcHAgIT0gTlVMTCAmJiBTVUNDRUVERUQocElBcHAtPkdldENvbnRleHQoc19oV25kLCAmaEltYykpKQorICAgIHsKKwlzdGF0dXMgPSBwSUFwcC0+R2V0T3BlblN0YXR1cyhoSW1jKSA/IDEgOiAwOworCXBJQXBwLT5SZWxlYXNlQ29udGV4dChzX2hXbmQsIGhJbWMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogR0xPQkFMX0lNRSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2dsYmxfaW1lLmggYi9zcmMvZ2xibF9pbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA4ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsYmxfaW1lLmgKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKyNpZmRlZiBHTE9CQUxfSU1FCisjaWZuZGVmIF9JTkNfR0xPQkFMX0lNRQorI2RlZmluZSBfSU5DX0dMT0JBTF9JTUUKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworICAgIHZvaWQgZ2xvYmFsX2ltZV9pbml0KEFUT00sIEhXTkQpOworICAgIHZvaWQgZ2xvYmFsX2ltZV9lbmQoKTsKKyAgICBMUkVTVUxUIFdJTkFQSSBnbG9iYWxfaW1lX0RlZldpbmRvd1Byb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworICAgIEJPT0wgV0lOQVBJIGdsb2JhbF9pbWVfVHJhbnNsYXRlTWVzc2FnZShDT05TVCBNU0cgKik7CisgICAgdm9pZCBXSU5BUEkgZ2xvYmFsX2ltZV9zZXRfcG9zaXRpb24oUE9JTlQqKTsKKyAgICB2b2lkIFdJTkFQSSBnbG9iYWxfaW1lX3NldF9mb250KExPR0ZPTlQqKTsKKyAgICB2b2lkIFdJTkFQSSBnbG9iYWxfaW1lX3N0YXR1c19ldmFjdWF0ZSgpOworICAgIHZvaWQgV0lOQVBJIGdsb2JhbF9pbWVfc3RhdHVzX3Jlc3RvcmUoKTsKKyAgICB2b2lkIFdJTkFQSSBnbG9iYWxfaW1lX3NldF9zdGF0dXMoaW50IHN0YXR1cyk7CisgICAgaW50IFdJTkFQSSBnbG9iYWxfaW1lX2dldF9zdGF0dXMoKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfSU5DX0dMT0JBTF9JTUUgKi8KKyNlbmRpZiAvKiBHTE9CQUxfSU1FICovCmRpZmYgLS1naXQgYS9zcmMvZ2xvYmFscy5oIGIvc3JjL2dsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjUzMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2dsb2JhbHMuaApAQCAtMCwwICsxLDEzODEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBkZWZpbml0aW9uIG9mIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisvKgorICogTnVtYmVyIG9mIFJvd3MgYW5kIENvbHVtbnMgaW4gdGhlIHNjcmVlbi4KKyAqIE11c3QgYmUgbG9uZyB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG9wdGlvbnMgaW4gb3B0aW9uLmMuCisgKiBOb3RlOiBVc2Ugc2NyZWVuX1Jvd3MgYW5kIHNjcmVlbl9Db2x1bW5zIHRvIGFjY2VzcyBpdGVtcyBpbiBTY3JlZW5MaW5lc1tdLgorICogVGhleSBtYXkgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzIHdoZW4gdGhlIHNjcmVlbiB3YXNuJ3QgKHJlKWFsbG9jYXRlZCB5ZXQKKyAqIGFmdGVyIHNldHRpbmcgUm93cyBvciBDb2x1bW5zIChlLmcuLCB3aGVuIHN0YXJ0aW5nIHVwKS4KKyAqLworRVhURVJOIGxvbmcJUm93cwkJCS8qIG5yIG9mIHJvd3MgaW4gdGhlIHNjcmVlbiAqLworI2lmZGVmIERPX0lOSVQKKyMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KSB8fCBkZWZpbmVkKE9TMikKKwkJCSAgICA9IDI1TAorIyBlbHNlCisJCQkgICAgPSAyNEwKKyMgZW5kaWYKKyNlbmRpZgorCQkJICAgIDsKK0VYVEVSTiBsb25nCUNvbHVtbnMgSU5JVCg9IDgwKTsJLyogbnIgb2YgY29sdW1ucyBpbiB0aGUgc2NyZWVuICovCisKKy8qCisgKiBUaGUgY2hhcmFjdGVycyB0aGF0IGFyZSBjdXJyZW50bHkgb24gdGhlIHNjcmVlbiBhcmUga2VwdCBpbiBTY3JlZW5MaW5lc1tdLgorICogSXQgaXMgYSBzaW5nbGUgYmxvY2sgb2YgY2hhcmFjdGVycywgdGhlIHNpemUgb2YgdGhlIHNjcmVlbiBwbHVzIG9uZSBsaW5lLgorICogVGhlIGF0dHJpYnV0ZXMgZm9yIHRob3NlIGNoYXJhY3RlcnMgYXJlIGtlcHQgaW4gU2NyZWVuQXR0cnNbXS4KKyAqCisgKiAiTGluZU9mZnNldFtuXSIgaXMgdGhlIG9mZnNldCBmcm9tIFNjcmVlbkxpbmVzW10gZm9yIHRoZSBzdGFydCBvZiBsaW5lICduJy4KKyAqIFRoZSBzYW1lIHZhbHVlIGlzIHVzZWQgZm9yIFNjcmVlbkxpbmVzVUNbXSBhbmQgU2NyZWVuQXR0cnNbXS4KKyAqLworRVhURVJOIHNjaGFyX1QJKlNjcmVlbkxpbmVzIElOSVQoPSBOVUxMKTsKK0VYVEVSTiBzYXR0cl9UCSpTY3JlZW5BdHRycyBJTklUKD0gTlVMTCk7CitFWFRFUk4gdW5zaWduZWQJKkxpbmVPZmZzZXQgSU5JVCg9IE5VTEwpOworRVhURVJOIGNoYXJfdQkqTGluZVdyYXBzIElOSVQoPSBOVUxMKTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qCisgKiBXaGVuIHVzaW5nIFVuaWNvZGUgY2hhcmFjdGVycyAoaW4gVVRGLTggZW5jb2RpbmcpIHRoZSBjaGFyYWN0ZXIgaW4KKyAqIFNjcmVlbkxpbmVzVUNbXSBjb250YWlucyB0aGUgVW5pY29kZSBmb3IgdGhlIGNoYXJhY3RlciBhdCB0aGlzIHBvc2l0aW9uLCBvcgorICogTlVMIHdoZW4gdGhlIGNoYXJhY3RlciBpbiBTY3JlZW5MaW5lc1tdIGlzIHRvIGJlIHVzZWQgKEFTQ0lJIGNoYXIpLgorICogVGhlIGNvbXBvc2luZyBjaGFyYWN0ZXJzIGFyZSB0byBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIG9yaWdpbmFsIGNoYXJhY3Rlci4KKyAqIE5vdGU6IFRoZXNlIHRocmVlIGFyZSBvbmx5IGFsbG9jYXRlZCB3aGVuIGVuY191dGY4IGlzIHNldCEKKyAqLworRVhURVJOIHU4Y2hhcl9UCSpTY3JlZW5MaW5lc1VDIElOSVQoPSBOVUxMKTsJLyogZGVjb2RlZCBVVEYtOCBjaGFyYWN0ZXJzICovCitFWFRFUk4gdThjaGFyX1QJKlNjcmVlbkxpbmVzQzEgSU5JVCg9IE5VTEwpOwkvKiBmaXJzdCBjb21wb3NpbmcgY2hhciAqLworRVhURVJOIHU4Y2hhcl9UCSpTY3JlZW5MaW5lc0MyIElOSVQoPSBOVUxMKTsJLyogc2Vjb25kIGNvbXBvc2luZyBjaGFyICovCisKKy8qIE9ubHkgdXNlZCBmb3IgZXVjLWpwOiBTZWNvbmQgYnl0ZSBvZiBhIGNoYXJhY3RlciB0aGF0IHN0YXJ0cyB3aXRoIDB4OGUuCisgKiBUaGVzZSBhcmUgc2luZ2xlLXdpZHRoLiAqLworRVhURVJOIHNjaGFyX1QJKlNjcmVlbkxpbmVzMiBJTklUKD0gTlVMTCk7CisjZW5kaWYKKworRVhURVJOIGludAlzY3JlZW5fUm93cyBJTklUKD0gMCk7CSAgICAvKiBhY3R1YWwgc2l6ZSBvZiBTY3JlZW5MaW5lc1tdICovCitFWFRFUk4gaW50CXNjcmVlbl9Db2x1bW5zIElOSVQoPSAwKTsgICAvKiBhY3R1YWwgc2l6ZSBvZiBTY3JlZW5MaW5lc1tdICovCisKKy8qCisgKiBXaGVuIHZnZXRjKCkgaXMgY2FsbGVkLCBpdCBzZXRzIG1vZF9tYXNrIHRvIHRoZSBzZXQgb2YgbW9kaWZpZXJzIHRoYXQgYXJlCisgKiBoZWxkIGRvd24gYmFzZWQgb24gdGhlIEtTTU9EXyogc3ltYm9scyB0aGF0IGFyZSByZWFkIGZpcnN0LgorICovCitFWFRFUk4gaW50CW1vZF9tYXNrIElOSVQoPSAweDApOwkJLyogY3VycmVudCBrZXkgbW9kaWZpZXJzICovCisKKy8qCisgKiBDbWRsaW5lX3JvdyBpcyB0aGUgcm93IHdoZXJlIHRoZSBjb21tYW5kIGxpbmUgc3RhcnRzLCBqdXN0IGJlbG93IHRoZQorICogbGFzdCB3aW5kb3cuCisgKiBXaGVuIHRoZSBjbWRsaW5lIGdldHMgbG9uZ2VyIHRoYW4gdGhlIGF2YWlsYWJsZSBzcGFjZSB0aGUgc2NyZWVuIGdldHMKKyAqIHNjcm9sbGVkIHVwLiBBZnRlciBhIENUUkwtRCAoc2hvdyBtYXRjaGVzKSwgYWZ0ZXIgaGl0dGluZyAnOicgYWZ0ZXIKKyAqICJoaXQgcmV0dXJuIiwgYW5kIGZvciB0aGUgOmdsb2JhbCBjb21tYW5kLCB0aGUgY29tbWFuZCBsaW5lIGlzCisgKiB0ZW1wb3JhcmlseSBtb3ZlZC4gIFRoZSBvbGQgcG9zaXRpb24gaXMgcmVzdG9yZWQgd2l0aCB0aGUgbmV4dCBjYWxsIHRvCisgKiB1cGRhdGVfc2NyZWVuKCkuCisgKi8KK0VYVEVSTiBpbnQJY21kbGluZV9yb3c7CisKK0VYVEVSTiBpbnQJcmVkcmF3X2NtZGxpbmUgSU5JVCg9IEZBTFNFKTsJLyogY21kbGluZSBtdXN0IGJlIHJlZHJhd24gKi8KK0VYVEVSTiBpbnQJY2xlYXJfY21kbGluZSBJTklUKD0gRkFMU0UpOwkvKiBjbWRsaW5lIG11c3QgYmUgY2xlYXJlZCAqLworI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChGRUFUX0VWQUwpCitFWFRFUk4gaW50CWNtZGxpbmVfc3RhciBJTklUKD0gRkFMU0UpOwkvKiBjbWRsaW5lIGlzIGNyeXB0ZWQgKi8KKyNlbmRpZgorRVhURVJOIGludAlleGVjX2Zyb21fcmVnIElOSVQoPSBGQUxTRSk7CS8qIGV4ZWN1dGluZyByZWdpc3RlciAqLworCitFWFRFUk4gaW50CWdsb2JhbF9jaGFuZ2VkdGljayBJTklUKD0gMCk7CS8qIGluY3JlbWVudGVkIGZvciBlYWNoCisJCQkJCQkgICBjaGFuZ2UsIGFsc28gZm9yIHVuZG8gKi8KK0VYVEVSTiBpbnQJc2NyZWVuX2NsZWFyZWQgSU5JVCg9IEZBTFNFKTsJLyogc2NyZWVuIGhhcyBiZWVuIGNsZWFyZWQgKi8KKworLyoKKyAqIFdoZW4gJyQnIGlzIGluY2x1ZGVkIGluICdjcG9wdGlvbnMnIG9wdGlvbiBzZXQ6CisgKiBXaGVuIGEgY2hhbmdlIGNvbW1hbmQgaXMgZ2l2ZW4gdGhhdCBkZWxldGVzIG9ubHkgcGFydCBvZiBhIGxpbmUsIGEgZG9sbGFyCisgKiBpcyBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhbmdlZCB0ZXh0LiBkb2xsYXJfdmNvbCBpcyBzZXQgdG8gdGhlIHZpcnR1YWwKKyAqIGNvbHVtbiBvZiB0aGlzICckJy4KKyAqLworRVhURVJOIGNvbG5yX1QJZG9sbGFyX3Zjb2wgSU5JVCg9IDApOworCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisvKgorICogdXNlZCBmb3IgSW5zZXJ0IG1vZGUgY29tcGxldGlvbgorICovCitFWFRFUk4gaW50CWNvbXBsZXRpb25fbGVuZ3RoIElOSVQoPSAwKTsKK0VYVEVSTiBpbnQJY29udGludWVfc3RhdHVzICAgSU5JVCg9IDApOworRVhURVJOIGludAljb21wbGV0aW9uX2ludGVycnVwdGVkIElOSVQoPSBGQUxTRSk7CisKKy8qIGZsYWdzIGZvciBjb250aW51ZV9zdGF0dXMgKi8KKyNkZWZpbmUgQ09OVF9BRERJTkcJMQkvKiAibm9ybWFsIiBvciAiYWRkaW5nIiBleHBhbnNpb24gKi8KKyNkZWZpbmUgQ09OVF9JTlRSUFQJKDIgKyA0KQkvKiBhIF5YIGludGVycnVwdGVkIHRoZSBjdXJyZW50IGV4cGFuc2lvbiAqLworCQkJCS8qIGl0J3Mgc2V0IG9ubHkgaWZmIE5fQUREUyBpcyBzZXQgKi8KKyNkZWZpbmUgQ09OVF9OX0FERFMJNAkvKiBuZXh0IF5YPD4gd2lsbCBhZGQtbmV3IG9yIGV4cGFuZC1jdXJyZW50ICovCisjZGVmaW5lIENPTlRfU19JUE9TCTgJLyogbmV4dCBeWDw+IHdpbGwgc2V0IGluaXRpYWxfcG9zPworCQkJCSAqIGlmIHNvLCB3b3JkLXdpc2UtZXhwYW5zaW9uIHdpbGwgc2V0IFNPTCAqLworI2RlZmluZSBDT05UX1NPTAkxNgkvKiBwYXR0ZXJuIGluY2x1ZGVzIHN0YXJ0IG9mIGxpbmUsIGp1c3QgZm9yCisJCQkJICogd29yZC13aXNlIGV4cGFuc2lvbiwgbm90IHNldCBmb3IgXlheTCAqLworI2RlZmluZSBDT05UX0xPQ0FMCTMyCS8qIGZvciBjdHJsX3hfbW9kZSAwLCBeWF5QL15YXk4gZG8gYSBsb2NhbAorCQkJCSAqIGV4cGFuc2lvbiwgKGVnIHVzZSBjb21wbGV0ZT0uKSAqLworI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIHB1dHRpbmcgY2hhcmFjdGVycyBpbiB0aGUgY29tbWFuZCBsaW5lLAorICogd2hpbGUga2VlcGluZyBTY3JlZW5MaW5lc1tdIHVwZGF0ZWQuCisgKi8KKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorRVhURVJOIGludAljbWRtc2dfcmwgSU5JVCg9IEZBTFNFKTsgICAgLyogY21kbGluZSBpcyBkcmF3biByaWdodCB0byBsZWZ0ICovCisjZW5kaWYKK0VYVEVSTiBpbnQJbXNnX2NvbDsKK0VYVEVSTiBpbnQJbXNnX3JvdzsKK0VYVEVSTiBpbnQJbXNnX3Njcm9sbGVkOwkvKiBOdW1iZXIgb2Ygc2NyZWVuIGxpbmVzIHRoYXQgd2luZG93cyBoYXZlCisJCQkJICogc2Nyb2xsZWQgYmVjYXVzZSBvZiBwcmludGluZyBtZXNzYWdlcy4gKi8KK0VYVEVSTiBpbnQJbXNnX3Njcm9sbGVkX2lnbiBJTklUKD0gRkFMU0UpOworCQkJCS8qIHdoZW4gVFJVRSBkb24ndCBzZXQgbmVlZF93YWl0X3JldHVybiBpbgorCQkJCSAgIG1zZ19wdXRzX2F0dHIoKSB3aGVuIG1zZ19zY3JvbGxlZCBpcworCQkJCSAgIG5vbi16ZXJvICovCisKK0VYVEVSTiBjaGFyX3UJKmtlZXBfbXNnIElOSVQoPSBOVUxMKTsJICAgIC8qIG1zZyB0byBiZSBzaG93biBhZnRlciByZWRyYXcgKi8KK0VYVEVSTiBpbnQJa2VlcF9tc2dfYXR0ciBJTklUKD0gMCk7ICAgIC8qIGhpZ2hsaWdodCBhdHRyIGZvciBrZWVwX21zZyAqLworRVhURVJOIGludAluZWVkX2ZpbGVpbmZvIElOSVQoPSBGQUxTRSk7LyogZG8gZmlsZWluZm8oKSBhZnRlciByZWRyYXcgKi8KK0VYVEVSTiBpbnQJbXNnX3Njcm9sbCBJTklUKD0gRkFMU0UpOyAgIC8qIG1zZ19zdGFydCgpIHdpbGwgc2Nyb2xsICovCitFWFRFUk4gaW50CW1zZ19kaWRvdXQgSU5JVCg9IEZBTFNFKTsgICAvKiBtc2dfb3V0c3RyKCkgd2FzIHVzZWQgaW4gbGluZSAqLworRVhURVJOIGludAltc2dfZGlkYW55IElOSVQoPSBGQUxTRSk7ICAgLyogbXNnX291dHN0cigpIHdhcyB1c2VkIGF0IGFsbCAqLworRVhURVJOIGludAltc2dfbm93YWl0IElOSVQoPSBGQUxTRSk7ICAgLyogZG9uJ3Qgd2FpdCBmb3IgdGhpcyBtc2cgKi8KK0VYVEVSTiBpbnQJZW1zZ19vZmYgSU5JVCg9IDApOwkgICAgLyogZG9uJ3QgZGlzcGxheSBlcnJvcnMgZm9yIG5vdywKKwkJCQkJICAgICAgIHVubGVzcyAnZGVidWcnIGlzIHNldC4gKi8KK0VYVEVSTiBpbnQJaW5mb19tZXNzYWdlIElOSVQoPSBGQUxTRSk7IC8qIHByaW50aW5nIGluZm9ybWF0aXZlIG1lc3NhZ2UgKi8KKyNpZmRlZiBGRUFUX0VWQUwKK0VYVEVSTiBpbnQJZW1zZ19za2lwIElOSVQoPSAwKTsJICAgIC8qIGRvbid0IGRpc3BsYXkgZXJyb3JzIGZvcgorCQkJCQkgICAgICAgZXhwcmVzc2lvbiB0aGF0IGlzIHNraXBwZWQgKi8KK0VYVEVSTiBpbnQJZW1zZ19zZXZlcmUgSU5JVCg9RkFMU0UpOyAgIC8qIHVzZSBtZXNzYWdlIG9mIG5leHQgb2Ygc2V2ZXJhbAorCQkJCQkgICAgICAgZW1zZygpIGNhbGxzIGZvciB0aHJvdyAqLworRVhURVJOIGludAlkaWRfZW5kaWYgSU5JVCg9IEZBTFNFKTsgICAgLyoganVzdCBoYWQgIjplbmRpZiIgKi8KKyNlbmRpZgorRVhURVJOIGludAlkaWRfZW1zZzsJCSAgICAvKiBzZXQgYnkgZW1zZygpIHdoZW4gdGhlIG1lc3NhZ2UKKwkJCQkJICAgICAgIGlzIGRpc3BsYXllZCBvciB0aHJvd24gKi8KK0VYVEVSTiBpbnQJY2FsbGVkX2Vtc2c7CQkgICAgLyogYWx3YXlzIHNldCBieSBlbXNnKCkgKi8KK0VYVEVSTiBpbnQJZW1zZ19vbl9kaXNwbGF5IElOSVQoPSBGQUxTRSk7CS8qIHRoZXJlIGlzIGFuIGVycm9yIG1lc3NhZ2UgKi8KK0VYVEVSTiBpbnQJcmNfZGlkX2Vtc2cgSU5JVCg9IEZBTFNFKTsgIC8qIHZpbV9yZWdjb21wKCkgY2FsbGVkIGVtc2coKSAqLworCitFWFRFUk4gaW50CW5vX3dhaXRfcmV0dXJuIElOSVQoPSAwKTsgICAvKiBkb24ndCB3YWl0IGZvciByZXR1cm4gZm9yIG5vdyAqLworRVhURVJOIGludAluZWVkX3dhaXRfcmV0dXJuIElOSVQoPSAwKTsgLyogbmVlZCB0byB3YWl0IGZvciByZXR1cm4gbGF0ZXIgKi8KK0VYVEVSTiBpbnQJZGlkX3dhaXRfcmV0dXJuIElOSVQoPSBGQUxTRSk7CS8qIHdhaXRfcmV0dXJuKCkgd2FzIHVzZWQgYW5kCisJCQkJCQkgICBub3RoaW5nIHdyaXR0ZW4gc2luY2UgdGhlbiAqLworI2lmZGVmIEZFQVRfVElUTEUKK0VYVEVSTiBpbnQJbmVlZF9tYWtldGl0bGUgSU5JVCg9IFRSVUUpOyAvKiBjYWxsIG1ha2V0aXRsZSgpIHNvb24gKi8KKyNlbmRpZgorCitFWFRFUk4gaW50CXF1aXRfbW9yZSBJTklUKD0gRkFMU0UpOyAgICAvKiAncScgaGl0IGF0ICItLW1vcmUtLSIgbXNnICovCitFWFRFUk4gaW50CW1vcmVfYmFjayBJTklUKD0gMCk7CSAgICAvKiAnYicgb3IgJ3UnIGF0ICItLW1vcmUtLSIgbXNnICovCitFWFRFUk4gaW50CW1vcmVfYmFja191c2VkIElOSVQoPSBGQUxTRSk7IC8qIHVzaW5nIG1vcmVfYmFjayAqLworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChNQUNPU19YKQorRVhURVJOIGludAluZXdsaW5lX29uX2V4aXQgSU5JVCg9IEZBTFNFKTsJLyogZGlkIG1zZyBpbiBhbHRlcm4uIHNjcmVlbiAqLworRVhURVJOIGludAlpbnRyX2NoYXIgSU5JVCg9IDApOwkgICAgLyogZXh0cmEgaW50ZXJydXB0IGNoYXJhY3RlciAqLworI2VuZGlmCisjaWYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpKSAmJiBkZWZpbmVkKEZFQVRfWDExKQorRVhURVJOIGludAl4X25vX2Nvbm5lY3QgSU5JVCg9IEZBTFNFKTsgLyogZG9uJ3QgY29ubmVjdCB0byBYIHNlcnZlciAqLworIyBpZiBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKQorRVhURVJOIGludAl4X2ZvcmNlX2Nvbm5lY3QgSU5JVCg9IEZBTFNFKTsgLyogRG8gY29ubmVjdCB0byBYIHNlcnZlci4KKwkJCQkJCSAgT3ZlcnJ1bGVzIHhfbm9fY29ubmVjdCBhbmQKKwkJCQkJCSAgImV4Y2x1ZGUiIGluICdjbGlwYm9hcmQnLiAqLworIyBlbmRpZgorI2VuZGlmCitFWFRFUk4gaW50CXZnZXRjX2J1c3kgSU5JVCg9IEZBTFNFKTsgICAvKiBpbnNpZGUgdmdldGMoKSBub3cgKi8KKworRVhURVJOIGludAlkaWRzZXRfdmltIElOSVQoPSBGQUxTRSk7ICAgLyogZGlkIHNldCAkVklNIG91cnNlbHZlcyAqLworRVhURVJOIGludAlkaWRzZXRfdmltcnVudGltZSBJTklUKD0gRkFMU0UpOyAgIC8qIGlkZW0gZm9yICRWSU1SVU5USU1FICovCisKKy8qCisgKiBMaW5lcyBsZWZ0IGJlZm9yZSBhICJtb3JlIiBtZXNzYWdlLglFeCBtb2RlIG5lZWRzIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhpcworICogYWZ0ZXIgeW91IHR5cGUgc29tZXRoaW5nLgorICovCitFWFRFUk4gaW50CWxpbmVzX2xlZnQgSU5JVCg9IC0xKTsJICAgIC8qIGxpbmVzIGxlZnQgZm9yIGxpc3RpbmcgKi8KK0VYVEVSTiBpbnQJbXNnX25vX21vcmUgSU5JVCg9IEZBTFNFKTsgIC8qIGRvbid0IHVzZSBtb3JlIHByb21wdCwgdHJ1bmNhdGUKKwkJCQkJICAgICAgIG1lc3NhZ2VzICovCisKK0VYVEVSTiBjaGFyX3UJKnNvdXJjaW5nX25hbWUgSU5JVCggPSBOVUxMKTsvKiBuYW1lIG9mIGVycm9yIG1lc3NhZ2Ugc291cmNlICovCitFWFRFUk4gbGluZW5yX1QJc291cmNpbmdfbG51bSBJTklUKD0gMCk7ICAgIC8qIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UgZmlsZSAqLworCisjaWZkZWYgRkVBVF9FVkFMCitFWFRFUk4gaW50CWV4X25lc3RpbmdfbGV2ZWwgSU5JVCg9IDApOwkvKiBuZXN0aW5nIGxldmVsICovCitFWFRFUk4gaW50CWRlYnVnX2JyZWFrX2xldmVsIElOSVQoPSAtMSk7CS8qIGJyZWFrIGJlbG93IHRoaXMgbGV2ZWwgKi8KK0VYVEVSTiBpbnQJZGVidWdfZGlkX21zZyBJTklUKD0gRkFMU0UpOwkvKiBkaWQgImRlYnVnIG1vZGUiIG1lc3NhZ2UgKi8KK0VYVEVSTiBpbnQJZGVidWdfdGljayBJTklUKD0gMCk7CQkvKiBicmVha3BvaW50IGNoYW5nZSBjb3VudCAqLworCisvKgorICogVGhlIGV4Y2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGhyb3duLiAgVXNlZCB0byBwYXNzIGFuIGV4Y2VwdGlvbiB0bworICogYSBkaWZmZXJlbnQgY3N0YWNrLiAgQWxzbyB1c2VkIGZvciBkaXNjYXJkaW5nIGFuIGV4Y2VwdGlvbiBiZWZvcmUgaXQgaXMKKyAqIGNhdWdodCBvciBtYWRlIHBlbmRpbmcuICBPbmx5IHZhbGlkIHdoZW4gZGlkX3Rocm93IGlzIFRSVUUuCisgKi8KK0VYVEVSTiBleGNlcHRfVCAqY3VycmVudF9leGNlcHRpb247CisKKy8qCisgKiBkaWRfdGhyb3c6IEFuIGV4Y2VwdGlvbiBpcyBiZWluZyB0aHJvd24uICBSZXNldCB3aGVuIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0CisgKiBvciBhcyBsb25nIGFzIGl0IGlzIHBlbmRpbmcgaW4gYSBmaW5hbGx5IGNsYXVzZS4KKyAqLworRVhURVJOIGludCBkaWRfdGhyb3cgSU5JVCg9IEZBTFNFKTsKKworLyoKKyAqIG5lZWRfcmV0aHJvdzogc2V0IHRvIFRSVUUgd2hlbiBhIHRocm93IHRoYXQgY2Fubm90IGJlIGhhbmRsZWQgaW4gZG9fY21kbGluZSgpCisgKiBtdXN0IGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNzdGFjayBvZiB0aGUgcHJldmlvdXNseSBjYWxsZWQgZG9fY21kbGluZSgpLgorICovCitFWFRFUk4gaW50IG5lZWRfcmV0aHJvdyBJTklUKD0gRkFMU0UpOworCisvKgorICogY2hlY2tfY3N0YWNrOiBzZXQgdG8gVFJVRSB3aGVuIGEgIjpmaW5pc2giIG9yICI6cmV0dXJuIiB0aGF0IGNhbm5vdCBiZQorICogaGFuZGxlZCBpbiBkb19jbWRsaW5lKCkgbXVzdCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjc3RhY2sgb2YgdGhlIHByZXZpb3VzbHkKKyAqIGNhbGxlZCBkb19jbWRsaW5lKCkuCisgKi8KK0VYVEVSTiBpbnQgY2hlY2tfY3N0YWNrIElOSVQoPSBGQUxTRSk7CisKKy8qCisgKiBOdW1iZXIgb2YgbmVzdGVkIHRyeSBjb25kaXRpb25hbHMgKGFjcm9zcyBmdW5jdGlvbiBjYWxscyBhbmQgIjpzb3VyY2UiCisgKiBjb21tYW5kcykuCisgKi8KK0VYVEVSTiBpbnQgdHJ5bGV2ZWwgSU5JVCg9IDApOworCisvKgorICogV2hlbiAiZm9yY2VfYWJvcnQiIGlzIFRSVUUsIGFsd2F5cyBza2lwIGNvbW1hbmRzIGFmdGVyIGFuIGVycm9yIG1lc3NhZ2UsCisgKiBldmVuIGFmdGVyIHRoZSBvdXRlcm1vc3QgIjplbmRpZiIgb3IgIjplbmR3aGlsZSIgb3IgZm9yIGEgZnVuY3Rpb24gd2hpdGhvdXQKKyAqIHRoZSAiYWJvcnQiIGZsYWcuICBJdCBpcyBzZXQgdG8gVFJVRSB3aGVuICJ0cnlsZXZlbCIgaXMgbm9uLXplcm8gKGFuZAorICogIjpzaWxlbnQhIiB3YXMgbm90IHVzZWQpIG9yIGFuIGV4Y2VwdGlvbiBpcyBiZWluZyB0aHJvd24gYXQgdGhlIHRpbWUgYW4KKyAqIGVycm9yIGlzIGRldGVjdGVkLiAgSXQgaXMgc2V0IHRvIEZBTFNFIHdoZW4gInRyeWxldmVsIiBnZXRzIHplcm8gYWdhaW4gYW5kCisgKiB0aGVyZSB3YXMgbm8gZXJyb3Igb3IgaW50ZXJydXB0IG9yIHRocm93LgorICoKKyAqLworRVhURVJOIGludCBmb3JjZV9hYm9ydCBJTklUKD0gRkFMU0UpOworCisvKgorICogIm1zZ19saXN0IiBwb2ludHMgdG8gYSB2YXJpYWJsZSBpbiB0aGUgc3RhY2sgb2YgZG9fY21kbGluZSgpIHdoaWNoIGtlZXBzIHRoZQorICogbGlzdCBvZiBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBlbXNnKCkgY2FsbHMsIG9uZSBvZiB3aGljaCBpcyB0byBiZSBjb252ZXJ0ZWQgdG8KKyAqIGFuIGVycm9yIGV4Y2VwdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmFpbGluZyBjb21tYW5kIHJldHVybnMuICBUaGUKKyAqIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIGV4Y2VwdGlvbiB2YWx1ZSBpcyBwb2ludGVkIHRvIGJ5IHRoZSAidGhyb3dfbXNnIgorICogZmllbGQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpc3QuICBJdCBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIHRoZSAibXNnIgorICogZmllbGQgb2YgdGhhdCBlbGVtZW50LCBidXQgY2FuIGJlIGlkZW50aWNhbCB0byB0aGUgIm1zZyIgZmllbGQgb2YgYSBsYXRlcgorICogbGlzdCBlbGVtZW50LCB3aGVuIHRoZSAiZW1zZ19zZXZlcmUiIGZsYWcgd2FzIHNldCB3aGVuIHRoZSBlbXNnKCkgY2FsbCB3YXMKKyAqIG1hZGUuCisgKi8KK0VYVEVSTiBzdHJ1Y3QgbXNnbGlzdCAqKm1zZ19saXN0IElOSVQoPSBOVUxMKTsKKworLyoKKyAqIHN1cHByZXNzX2VycnRocm93OiBXaGVuIFRSVUUsIGRvbid0IGNvbnZlcnQgYW4gZXJyb3IgdG8gYW4gZXhjZXB0aW9uLiAgVXNlZAorICogd2hlbiBkaXNwbGF5aW5nIHRoZSBpbnRlcnJ1cHQgbWVzc2FnZSBvciByZXBvcnRpbmcgYW4gZXhjZXB0aW9uIHRoYXQgaXMgc3RpbGwKKyAqIHVuY2F1Z2h0IGF0IHRoZSB0b3AgbGV2ZWwgKHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkIHRoZW4pLiAgQWxzbyB1c2VkCisgKiBmb3IgdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiBubyBleGNlcHRpb24gY2FuIGJlIHRocm93bi4KKyAqLworRVhURVJOIGludCBzdXBwcmVzc19lcnJ0aHJvdyBJTklUKD0gRkFMU0UpOworCisvKgorICogVGhlIHN0YWNrIG9mIGFsbCBjYXVnaHQgYW5kIG5vdCBmaW5pc2hlZCBleGNlcHRpb25zLiAgVGhlIGV4Y2VwdGlvbiBvbiB0aGUKKyAqIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIG9uZSBnb3QgYnkgZXZhbHVhdGlvbiBvZiB2OmV4Y2VwdGlvbi4gIFRoZSBjb21wbGV0ZQorICogc3RhY2sgb2YgYWxsIGNhdWdodCBhbmQgcGVuZGluZyBleGNlcHRpb25zIGlzIGVtYmVkZGVkIGluIHRoZSB2YXJpb3VzCisgKiBjc3RhY2tzOyB0aGUgcGVuZGluZyBleGNlcHRpb25zLCBob3dldmVyLCBhcmUgbm90IG9uIHRoZSBjYXVnaHQgc3RhY2suCisgKi8KK0VYVEVSTiBleGNlcHRfVCAqY2F1Z2h0X3N0YWNrIElOSVQoPSBOVUxMKTsKKworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VWQUwKK0VYVEVSTiBzY2lkX1QJY3VycmVudF9TSUQgSU5JVCg9IDApOwkgICAgLyogSUQgb2Ygc2NyaXB0IGJlaW5nIHNvdXJjZWQgb3IKKwkJCQkJICAgICAgIHdhcyBzb3VyY2VkIHRvIGRlZmluZSB0aGUKKwkJCQkJICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICovCisjZW5kaWYKK0VYVEVSTiBpbnQJc2Nyb2xsX3JlZ2lvbiBJTklUKD0gRkFMU0UpOyAvKiB0ZXJtIHN1cHBvcnRzIHNjcm9sbCByZWdpb24gKi8KK0VYVEVSTiBpbnQJdF9jb2xvcnMgSU5JVCg9IDApOwkgICAgLyogaW50IHZhbHVlIG9mIFRfQ0NPICovCisKKy8qCisgKiBXaGVuIGhpZ2hsaWdodF9tYXRjaCBpcyBUUlVFLCBoaWdobGlnaHQgYSBtYXRjaCwgc3RhcnRpbmcgYXQgdGhlIGN1cnNvcgorICogcG9zaXRpb24uICBTZWFyY2hfbWF0Y2hfbGluZXMgaXMgdGhlIG51bWJlciBvZiBsaW5lcyBhZnRlciB0aGUgbWF0Y2ggKDAgZm9yCisgKiBhIG1hdGNoIHdpdGhpbiBvbmUgbGluZSksIHNlYXJjaF9tYXRjaF9lbmRjb2wgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlCisgKiBjaGFyYWN0ZXIganVzdCBhZnRlciB0aGUgbWF0Y2ggaW4gdGhlIGxhc3QgbGluZS4KKyAqLworRVhURVJOIGludAloaWdobGlnaHRfbWF0Y2ggSU5JVCg9IEZBTFNFKTsJLyogc2hvdyBzZWFyY2ggbWF0Y2ggcG9zICovCitFWFRFUk4gbGluZW5yX1QJc2VhcmNoX21hdGNoX2xpbmVzOwkJLyogbGluZXMgb2Ygb2YgbWF0Y2hlZCBzdHJpbmcgKi8KK0VYVEVSTiBjb2xucl9UCXNlYXJjaF9tYXRjaF9lbmRjb2w7CQkvKiBjb2wgbnIgb2YgbWF0Y2ggZW5kICovCisKK0VYVEVSTiBpbnQJbm9fc21hcnRjYXNlIElOSVQoPSBGQUxTRSk7CS8qIGRvbid0IHVzZSAnc21hcnRjYXNlJyBvbmNlICovCisKK0VYVEVSTiBpbnQJbmVlZF9jaGVja190aW1lc3RhbXBzIElOSVQoPSBGQUxTRSk7IC8qIG5lZWQgdG8gY2hlY2sgZmlsZQorCQkJCQkJCXRpbWVzdGFtcHMgYXNhcCAqLworRVhURVJOIGludAlkaWRfY2hlY2tfdGltZXN0YW1wcyBJTklUKD0gRkFMU0UpOyAvKiBkaWQgY2hlY2sgdGltZXN0YW1wcworCQkJCQkJICAgICAgIHJlY2VudGx5ICovCitFWFRFUk4gaW50CW5vX2NoZWNrX3RpbWVzdGFtcHMgSU5JVCg9IDApOwkvKiBEb24ndCBjaGVjayB0aW1lc3RhbXBzICovCisKK0VYVEVSTiBpbnQJaGlnaGxpZ2h0X2F0dHJbSExGX0NPVU5UXTsgIC8qIEhpZ2hsLiBhdHRyIGZvciBlYWNoIGNvbnRleHQuICovCisjaWZkZWYgRkVBVF9TVExfT1BUCisjIGRlZmluZSBVU0VSX0hJR0hMSUdIVAorI2VuZGlmCisjaWZkZWYgVVNFUl9ISUdITElHSFQKK0VYVEVSTiBpbnQJaGlnaGxpZ2h0X3VzZXJbOV07CQkvKiBVc2VyWzEtOV0gYXR0cmlidXRlcyAqLworIyBpZmRlZiBGRUFUX1NUTF9PUFQKK0VYVEVSTiBpbnQJaGlnaGxpZ2h0X3N0bG5jWzldOwkJLyogT24gdG9wIG9mIHVzZXIgKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCitFWFRFUk4gY2hhcl91CSp1c2VfZ3ZpbXJjIElOSVQoPSBOVUxMKTsJLyogIi1VIiBjbWRsaW5lIGFyZ3VtZW50ICovCisjZW5kaWYKK0VYVEVSTiBpbnQJY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yIElOSVQoPSAwKTsKK0VYVEVSTiBpbnQJY3Rlcm1fbm9ybWFsX2ZnX2JvbGQgSU5JVCg9IDApOworRVhURVJOIGludAljdGVybV9ub3JtYWxfYmdfY29sb3IgSU5JVCg9IDApOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECitFWFRFUk4gaW50CWF1dG9jbWRfYnVzeSBJTklUKD0gRkFMU0UpOwkvKiBJcyBhcHBseV9hdXRvY21kcygpIGJ1c3k/ICovCitFWFRFUk4gaW50CWF1dG9jbWRfbm9fZW50ZXIgSU5JVCg9IEZBTFNFKTsgLyogKkVudGVyIGF1dG9jbWRzIGRpc2FibGVkICovCitFWFRFUk4gaW50CWF1dG9jbWRfbm9fbGVhdmUgSU5JVCg9IEZBTFNFKTsgLyogKkxlYXZlIGF1dG9jbWRzIGRpc2FibGVkICovCitFWFRFUk4gaW50CWF1dG9jbWRfYmxvY2sgSU5JVCg9IDApOwkvKiBibG9jayBhbGwgYXV0b2NtZHMgKi8KK0VYVEVSTiBpbnQJbW9kaWZpZWRfd2FzX3NldDsJCS8qIGRpZCAiOnNldCBtb2RpZmllZCIgKi8KK0VYVEVSTiBpbnQJZGlkX2ZpbGV0eXBlIElOSVQoPSBGQUxTRSk7CS8qIEZpbGVUeXBlIGV2ZW50IGZvdW5kICovCitFWFRFUk4gaW50CWtlZXBfZmlsZXR5cGUgSU5JVCg9IEZBTFNFKTsJLyogdmFsdWUgZm9yIGRpZF9maWxldHlwZSB3aGVuCisJCQkJCQkgICBzdGFydGluZyB0byBleGVjdXRlCisJCQkJCQkgICBhdXRvY29tbWFuZHMgKi8KKworLyogV2hlbiBkZWxldGluZyB0aGUgY3VycmVudCBidWZmZXIsIGFub3RoZXIgb25lIG11c3QgYmUgbG9hZGVkLiAgSWYgd2Uga25vdworICogd2hpY2ggb25lIGlzIHByZWZlcnJlZCwgYXVfbmV3X2N1cmJ1ZiBpcyBzZXQgdG8gaXQgKi8KK0VYVEVSTiBidWZfVAkqYXVfbmV3X2N1cmJ1ZiBJTklUKD0gTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTU9VU0UKKy8qCisgKiBNb3VzZSBjb29yZGluYXRlcywgc2V0IGJ5IGNoZWNrX3Rlcm1jb2RlKCkKKyAqLworRVhURVJOIGludAltb3VzZV9yb3c7CitFWFRFUk4gaW50CW1vdXNlX2NvbDsKK0VYVEVSTiBpbnQJbW91c2VfcGFzdF9ib3R0b20gSU5JVCg9IEZBTFNFKTsvKiBtb3VzZSBiZWxvdyBsYXN0IGxpbmUgKi8KK0VYVEVSTiBpbnQJbW91c2VfcGFzdF9lb2wgSU5JVCg9IEZBTFNFKTsJLyogbW91c2UgcmlnaHQgb2YgbGluZSAqLworRVhURVJOIGludAltb3VzZV9kcmFnZ2luZyBJTklUKD0gMCk7CS8qIGV4dGVuZGluZyBWaXN1YWwgYXJlYSB3aXRoCisJCQkJCQkgICBtb3VzZSBkcmFnZ2luZyAqLworIyBpZiBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKQorLyoKKyAqIFdoZW4gdGhlIERFQyBtb3VzZSBoYXMgYmVlbiBwcmVzc2VkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIHdlIGVuYWJsZQorICogYXV0b21hdGljIHF1ZXJ5cyBmb3IgdGhlIG1vdXNlIHBvc2l0aW9uLgorICovCitFWFRFUk4gaW50CVdhbnRRdWVyeU1vdXNlIElOSVQoPSAwKTsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX0dVSQorLyogV2hlbiB0aGUgd2luZG93IGxheW91dCBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLCBuZWVkX21vdXNlX2NvcnJlY3QgaXMgc2V0LAorICogc28gdGhhdCBndWlfbW91c2VfY29ycmVjdCgpIGlzIGNhbGxlZCBhZnRlcndhcmRzLCB0byBjb3JyZWN0IHRoZSBtb3VzZQorICogcG9pbnRlciB3aGVuIGZvY3VzLWZvbGxvdy1tb3VzZSBpcyBiZWluZyB1c2VkLiAqLworRVhURVJOIGludAluZWVkX21vdXNlX2NvcnJlY3QgSU5JVCg9IEZBTFNFKTsKKworLyogV2hlbiBkb3VibGUgY2xpY2tpbmcsIHRvcGxpbmUgbXVzdCBiZSB0aGUgc2FtZSAqLworRVhURVJOIGxpbmVucl9UIGd1aV9wcmV2X3RvcGxpbmUgSU5JVCg9IDApOworIyAgaWZkZWYgRkVBVF9ESUZGCitFWFRFUk4gaW50CWd1aV9wcmV2X3RvcGZpbGwgSU5JVCg9IDApOworIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX01PVVNFU0hBUEUKK0VYVEVSTiBpbnQJZHJhZ19zdGF0dXNfbGluZSBJTklUKD0gRkFMU0UpOwkvKiBkcmFnZ2luZyB0aGUgc3RhdHVzIGxpbmUgKi8KK0VYVEVSTiBpbnQJcG9zdHBvbmVkX21vdXNlc2hhcGUgSU5JVCg9IEZBTFNFKTsgLyogcG9zdHBvbmVkIHVwZGF0aW5nIHRoZQorCQkJCQkJICAgICAgIG1vdXNlIHBvaW50ZXIgc2hhcGUgKi8KKyMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCitFWFRFUk4gaW50CWRyYWdfc2VwX2xpbmUgSU5JVCg9IEZBTFNFKTsJLyogZHJhZ2dpbmcgdmVydCBzZXBhcmF0b3IgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9ESUZGCisvKiBWYWx1ZSBzZXQgZnJvbSAnZGlmZm9wdCcuICovCitFWFRFUk4gaW50CWRpZmZfY29udGV4dCBJTklUKD0gNik7CS8qIGNvbnRleHQgZm9yIGZvbGRzICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUVOVQorLyogVGhlIHJvb3Qgb2YgdGhlIG1lbnUgaGllcmFyY2h5LiAqLworRVhURVJOIHZpbW1lbnVfVAkqcm9vdF9tZW51IElOSVQoPSBOVUxMKTsKKy8qCisgKiBXaGlsZSBkZWZpbmluZyB0aGUgc3lzdGVtIG1lbnUsIHN5c19tZW51IGlzIFRSVUUuICBUaGlzIGF2b2lkcworICogb3ZlcnJ1bGluZyBvZiBtZW51cyB0aGF0IHRoZSB1c2VyIGFscmVhZHkgZGVmaW5lZC4KKyAqLworRVhURVJOIGludAlzeXNfbWVudSBJTklUKD0gRkFMU0UpOworI2VuZGlmCisKKy8qIFdoaWxlIHJlZHJhd2luZyB0aGUgc2NyZWVuIHRoaXMgZmxhZyBpcyBzZXQuICBJdCBtZWFucyB0aGUgc2NyZWVuIHNpemUKKyAqICgnbGluZXMnIGFuZCAncm93cycpIG11c3Qgbm90IGJlIGNoYW5nZWQuICovCitFWFRFUk4gaW50CXVwZGF0aW5nX3NjcmVlbiBJTklUKD0gRkFMU0UpOworCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZkZWYgRkVBVF9NRU5VCisvKiBNZW51IGl0ZW0ganVzdCBzZWxlY3RlZCwgc2V0IGJ5IGNoZWNrX3Rlcm1jb2RlKCkgKi8KK0VYVEVSTiB2aW1tZW51X1QJKmN1cnJlbnRfbWVudTsKKworLyogU2V0IHRvIFRSVUUgYWZ0ZXIgYWRkaW5nL3JlbW92aW5nIG1lbnVzIHRvIGVuc3VyZSB0aGV5IGFyZSB1cGRhdGVkICovCitFWFRFUk4gaW50IGZvcmNlX21lbnVfdXBkYXRlIElOSVQoPSBGQUxTRSk7CisjIGVuZGlmCisKKy8qIFNjcm9sbGJhciBtb3ZlZCBhbmQgbmV3IHZhbHVlLCBzZXQgYnkgY2hlY2tfdGVybWNvZGUoKSAqLworRVhURVJOIGludAljdXJyZW50X3Njcm9sbGJhcjsKK0VYVEVSTiBsb25nX3UJc2Nyb2xsYmFyX3ZhbHVlOworCisvKiBmb3VuZCAiLXJ2IiBvciAiLXJldmVyc2UiIGluIGNvbW1hbmQgbGluZSBhcmdzICovCitFWFRFUk4gaW50CWZvdW5kX3JldmVyc2VfYXJnIElOSVQoPSBGQUxTRSk7CisKKy8qICItZm4iIG9yICItZm9udCIgY29tbWFuZCBsaW5lIGFyZ3VtZW50ICovCitFWFRFUk4gY2hhcgkqZm9udF9hcmd1bWVudCBJTklUKD0gTlVMTCk7CisKKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisvKiAiLWJnIiBvciAiLWJhY2tncm91bmQiIGNvbW1hbmQgbGluZSBhcmd1bWVudCAqLworRVhURVJOIGNoYXIJKmJhY2tncm91bmRfYXJndW1lbnQgSU5JVCg9IE5VTEwpOworCisvKiAiLWZnIiBvciAiLWZvcmVncm91bmQiIGNvbW1hbmQgbGluZSBhcmd1bWVudCAqLworRVhURVJOIGNoYXIJKmZvcmVncm91bmRfYXJndW1lbnQgSU5JVCg9IE5VTEwpOworIyBlbmRpZgorCisvKgorICogV2hpbGUgZXhlY3V0aW5nIGV4dGVybmFsIGNvbW1hbmRzIG9yIGluIEV4IG1vZGUsIHNob3VsZCBub3QgaW5zZXJ0IEdVSQorICogZXZlbnRzIGluIHRoZSBpbnB1dCBidWZmZXI6IFNldCBob2xkX2d1aV9ldmVudHMgdG8gbm9uLXplcm8uCisgKi8KK0VYVEVSTiBpbnQJaG9sZF9ndWlfZXZlbnRzIElOSVQoPSAwKTsKKworLyoKKyAqIFdoZW4gcmVzaXppbmcgdGhlIHNoZWxsIGlzIHBvc3Rwb25lZCwgcmVtZW1iZXIgdGhlIG5ldyBzaXplLCBhbmQgY2FsbAorICogZ3VpX3Jlc2l6ZV9zaGVsbCgpIGxhdGVyLgorICovCitFWFRFUk4gaW50CW5ld19waXhlbF93aWR0aCBJTklUKD0gMCk7CitFWFRFUk4gaW50CW5ld19waXhlbF9oZWlnaHQgSU5JVCg9IDApOworCisvKiBXaW5kb3cgcG9zaXRpb24gZnJvbSAiOndpbnBvcyIsIHRvIGJlIHVzZWQgd2hlbiBvcGVuaW5nIHRoZSBHVUkgd2luZG93LiAqLworRVhURVJOIGludAlndWlfd2luX3ggSU5JVCg9IC0xKTsKK0VYVEVSTiBpbnQJZ3VpX3dpbl95IElOSVQoPSAtMSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECitFWFRFUk4gVmltQ2xpcGJvYXJkIGNsaXBfc3RhcjsJLyogUFJJTUFSWSBzZWxlY3Rpb24gaW4gWDExICovCisjIGlmZGVmIEZFQVRfWDExCitFWFRFUk4gVmltQ2xpcGJvYXJkIGNsaXBfcGx1czsJLyogQ0xJUEJPQVJEIHNlbGVjdGlvbiBpbiBYMTEgKi8KKyMgZWxzZQorIyAgZGVmaW5lIGNsaXBfcGx1cyBjbGlwX3N0YXIJLyogdGhlcmUgaXMgb25seSBvbmUgY2xpcGJvYXJkICovCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIEFsbCB3aW5kb3dzIGFyZSBsaW5rZWQgaW4gYSBsaXN0LiBmaXJzdHdpbiBwb2ludHMgdG8gdGhlIGZpcnN0IGVudHJ5LAorICogbGFzdHdpbiB0byB0aGUgbGFzdCBlbnRyeSAoY2FuIGJlIHRoZSBzYW1lIGFzIGZpcnN0d2luKSBhbmQgY3Vyd2luIHRvIHRoZQorICogY3VycmVudGx5IGFjdGl2ZSB3aW5kb3cuCisgKiBXaXRob3V0IHRoZSBGRUFUX1dJTkRPV1MgdGhleSBhcmUgYWxsIGVxdWFsLgorICovCisjaWZkZWYgRkVBVF9XSU5ET1dTCitFWFRFUk4gd2luX1QJKmZpcnN0d2luOwkJLyogZmlyc3Qgd2luZG93ICovCitFWFRFUk4gd2luX1QJKmxhc3R3aW47CQkvKiBsYXN0IHdpbmRvdyAqLworRVhURVJOIHdpbl9UCSpwcmV2d2luIElOSVQoPSBOVUxMKTsJLyogcHJldmlvdXMgd2luZG93ICovCisjIGRlZmluZSBXX05FWFQod3ApICgod3ApLT53X25leHQpCisjIGRlZmluZSBGT1JfQUxMX1dJTkRPV1Mod3ApIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorI2Vsc2UKKyMgZGVmaW5lIGZpcnN0d2luIGN1cndpbgorIyBkZWZpbmUgbGFzdHdpbiBjdXJ3aW4KKyMgZGVmaW5lIFdfTkVYVCh3cCkgTlVMTAorIyBkZWZpbmUgRk9SX0FMTF9XSU5ET1dTKHdwKSB3cCA9IGN1cndpbjsKKyNlbmRpZgorRVhURVJOIHdpbl9UCSpjdXJ3aW47CS8qIGN1cnJlbnRseSBhY3RpdmUgd2luZG93ICovCisKKy8qCisgKiBUaGUgd2luZG93IGxheW91dCBpcyBrZXB0IGluIGEgdHJlZSBvZiBmcmFtZXMuICB0b3BmcmFtZSBwb2ludHMgdG8gdGhlIHRvcAorICogb2YgdGhlIHRyZWUuCisgKi8KK0VYVEVSTiBmcmFtZV9UCSp0b3BmcmFtZTsJLyogdG9wIG9mIHRoZSB3aW5kb3cgZnJhbWUgdHJlZSAqLworCisvKgorICogQWxsIGJ1ZmZlcnMgYXJlIGxpbmtlZCBpbiBhIGxpc3QuICdmaXJzdGJ1ZicgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbnRyeSwKKyAqICdsYXN0YnVmJyB0byB0aGUgbGFzdCBlbnRyeSBhbmQgJ2N1cmJ1ZicgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgYnVmZmVyLgorICovCitFWFRFUk4gYnVmX1QJKmZpcnN0YnVmIElOSVQoPSBOVUxMKTsJLyogZmlyc3QgYnVmZmVyICovCitFWFRFUk4gYnVmX1QJKmxhc3RidWYgSU5JVCg9IE5VTEwpOwkvKiBsYXN0IGJ1ZmZlciAqLworRVhURVJOIGJ1Zl9UCSpjdXJidWYgSU5JVCg9IE5VTEwpOwkvKiBjdXJyZW50bHkgYWN0aXZlIGJ1ZmZlciAqLworCisvKgorICogTGlzdCBvZiBmaWxlcyBiZWluZyBlZGl0ZWQgKGdsb2JhbCBhcmd1bWVudCBsaXN0KS4gIGN1cndpbi0+d19hbGlzdCBwb2ludHMKKyAqIHRvIHRoaXMgd2hlbiB0aGUgd2luZG93IGlzIHVzaW5nIHRoZSBnbG9iYWwgYXJndW1lbnQgbGlzdC4KKyAqLworRVhURVJOIGFsaXN0X1QJZ2xvYmFsX2FsaXN0OwkvKiBnbG9iYWwgYXJndW1lbnQgbGlzdCAqLworRVhURVJOIGludAlhcmdfaGFkX2xhc3QgSU5JVCg9IEZBTFNFKTsgLyogYWNjZXNzZWQgbGFzdCBmaWxlIGluCisJCQkJCSAgICAgICBnbG9iYWxfYWxpc3QgKi8KKworRVhURVJOIGludAlydV9jb2w7CQkvKiBjb2x1bW4gZm9yIHJ1bGVyICovCisjaWZkZWYgRkVBVF9TVExfT1BUCitFWFRFUk4gaW50CXJ1X3dpZDsJCS8qICdydWxlcmZtdCcgd2lkdGggb2YgcnVsZXIgd2hlbiBub24temVybyAqLworI2VuZGlmCitFWFRFUk4gaW50CXNjX2NvbDsJCS8qIGNvbHVtbiBmb3Igc2hvd24gY29tbWFuZCAqLworCisjaWZkZWYgVEVNUERJUk5BTUVTCitFWFRFUk4gY2hhcl91CSp2aW1fdGVtcGRpciBJTklUKD0gTlVMTCk7IC8qIE5hbWUgb2YgVmltJ3Mgb3duIHRlbXAgZGlyLgorCQkJCQkgICAgICBFbmRzIGluIGEgc2xhc2guICovCisjZW5kaWYKKworLyoKKyAqIFdoZW4gc3RhcnRpbmcgb3IgZXhpdGluZyBzb21lIHRoaW5ncyBhcmUgZG9uZSBkaWZmZXJlbnRseSAoZS5nLiBzY3JlZW4KKyAqIHVwZGF0aW5nKS4KKyAqLworRVhURVJOIGludAlzdGFydGluZyBJTklUKD0gTk9fU0NSRUVOKTsKKwkJCQkvKiBmaXJzdCBOT19TQ1JFRU4sIHRoZW4gTk9fQlVGRkVSUyBhbmQgdGhlbgorCQkJCSAqIHNldCB0byAwIHdoZW4gc3RhcnRpbmcgdXAgZmluaXNoZWQgKi8KK0VYVEVSTiBpbnQJZXhpdGluZyBJTklUKD0gRkFMU0UpOworCQkJCS8qIFRSVUUgd2hlbiBhYmFuZG9uaW5nIFZpbSAqLworRVhURVJOIGludAlmdWxsX3NjcmVlbiBJTklUKD0gRkFMU0UpOworCQkJCS8qIFRSVUUgd2hlbiBkb2luZyBmdWxsLXNjcmVlbiBvdXRwdXQKKwkJCQkgKiBvdGhlcndpc2Ugb25seSB3cml0aW5nIHNvbWUgbWVzc2FnZXMgKi8KKworRVhURVJOIGludAlyZXN0cmljdGVkIElOSVQoPSBGQUxTRSk7CisJCQkJLyogVFJVRSB3aGVuIHN0YXJ0ZWQgYXMgInJ2aW0iICovCitFWFRFUk4gaW50CXNlY3VyZSBJTklUKD0gRkFMU0UpOworCQkJCS8qIG5vbi16ZXJvIHdoZW4gb25seSAic2FmZSIgY29tbWFuZHMgYXJlCisJCQkJICogYWxsb3dlZCwgZS5nLiB3aGVuIHNvdXJjaW5nIC5leHJjIG9yIC52aW1yYworCQkJCSAqIGluIGN1cnJlbnQgZGlyZWN0b3J5ICovCisKKyNpZmRlZiBGRUFUX0VWQUwKKyMgZGVmaW5lIEhBVkVfU0FOREJPWAorRVhURVJOIGludAlzYW5kYm94IElOSVQoPSAwKTsKKwkJCQkvKiBub24temVybyB3aGVuIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiBpbiBhCisJCQkJICogInNhbmRib3giLiAgTm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZQorCQkJCSAqIGJ1ZmZlci4gKi8KKyNlbmRpZgorCitFWFRFUk4gaW50CXNpbGVudF9tb2RlIElOSVQoPSBGQUxTRSk7CisJCQkJLyogc2V0IHRvIFRSVUUgd2hlbiAiLXMiIGNvbW1hbmRsaW5lIGFyZ3VtZW50CisJCQkJICogdXNlZCBmb3IgZXggKi8KKworI2lmZGVmIEZFQVRfVklTVUFMCitFWFRFUk4gcG9zX1QJVklzdWFsOwkJLyogc3RhcnQgcG9zaXRpb24gb2YgYWN0aXZlIFZpc3VhbCBzZWxlY3Rpb24gKi8KK0VYVEVSTiBpbnQJVklzdWFsX2FjdGl2ZSBJTklUKD0gRkFMU0UpOworCQkJCS8qIHdoZXRoZXIgVmlzdWFsIG1vZGUgaXMgYWN0aXZlICovCitFWFRFUk4gaW50CVZJc3VhbF9zZWxlY3QgSU5JVCg9IEZBTFNFKTsKKwkJCQkvKiB3aGV0aGVyIFNlbGVjdCBtb2RlIGlzIGFjdGl2ZSAqLworRVhURVJOIGludAlWSXN1YWxfcmVzZWxlY3Q7CisJCQkJLyogd2hldGhlciB0byByZXN0YXJ0IHRoZSBzZWxlY3Rpb24gYWZ0ZXIgYQorCQkJCSAqIFNlbGVjdCBtb2RlIG1hcHBpbmcgb3IgbWVudSAqLworCitFWFRFUk4gaW50CVZJc3VhbF9tb2RlIElOSVQoPSAndicpOworCQkJCS8qIHR5cGUgb2YgVmlzdWFsIG1vZGUgKi8KKworRVhURVJOIGludAlyZWRvX1ZJc3VhbF9idXN5IElOSVQoPSBGQUxTRSk7CisJCQkJLyogVFJVRSB3aGVuIHJlZG9pbmcgVmlzdWFsICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTU9VU0UKKy8qCisgKiBXaGVuIHBhc3RpbmcgdGV4dCB3aXRoIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uIGluIHZpc3VhbCBtb2RlIHdpdGgKKyAqIHJlc3RhcnRfZWRpdCBzZXQsIHJlbWVtYmVyIHdoZXJlIGl0IHN0YXJ0ZWQgc28gd2UgY2FuIHNldCBJbnNzdGFydC4KKyAqLworRVhURVJOIHBvc19UCXdoZXJlX3Bhc3RlX3N0YXJ0ZWQ7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIG1ha2UgYXV0by1pbmRlbnQgd29yayByaWdodCBvbiBsaW5lcyB3aGVyZSBvbmx5IGEKKyAqIDxSRVRVUk4+IG9yIDxFU0M+IGlzIHR5cGVkLiBJdCBpcyBzZXQgd2hlbiBhbiBhdXRvLWluZGVudCBpcyBkb25lLCBhbmQKKyAqIHJlc2V0IHdoZW4gYW55IG90aGVyIGVkaXRpbmcgaXMgZG9uZSBvbiB0aGUgbGluZS4gSWYgYW4gPEVTQz4gb3IgPFJFVFVSTj4KKyAqIGlzIHJlY2VpdmVkLCBhbmQgZGlkX2FpIGlzIFRSVUUsIHRoZSBsaW5lIGlzIHRydW5jYXRlZC4KKyAqLworRVhURVJOIGludCAgICAgZGlkX2FpIElOSVQoPSBGQUxTRSk7CisKKy8qCisgKiBDb2x1bW4gb2YgZmlyc3QgY2hhciBhZnRlciBhdXRvaW5kZW50LiAgMCB3aGVuIG5vIGF1dG9pbmRlbnQgZG9uZS4gIFVzZWQKKyAqIHdoZW4gJ2JhY2tzcGFjZScgaXMgMCwgdG8gYXZvaWQgYmFja3NwYWNpbmcgb3ZlciBhdXRvaW5kZW50LgorICovCitFWFRFUk4gY29sbnJfVAlhaV9jb2wgSU5JVCg9IDApOworCisjaWZkZWYgRkVBVF9DT01NRU5UUworLyoKKyAqIFRoaXMgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggd2lsbCBlbmQgYSBzdGFydC1taWRkbGUtZW5kIGNvbW1lbnQgd2hlbiB0eXBlZCBhcworICogdGhlIGZpcnN0IGNoYXJhY3RlciBvbiBhIG5ldyBsaW5lLiAgSXQgaXMgdGFrZW4gZnJvbSB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKKyAqIHRoZSAiZW5kIiBjb21tZW50IGxlYWRlciB3aGVuIHRoZSBDT01fQVVUT19FTkQgZmxhZyBpcyBnaXZlbiBmb3IgdGhhdAorICogY29tbWVudCBlbmQgaW4gJ2NvbW1lbnRzJy4gIEl0IGlzIG9ubHkgdmFsaWQgd2hlbiBkaWRfYWkgaXMgVFJVRS4KKyAqLworRVhURVJOIGludCAgICAgZW5kX2NvbW1lbnRfcGVuZGluZyBJTklUKD0gTlVMKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisvKgorICogVGhpcyBmbGFnIGlzIHNldCBhZnRlciBhICI6c3luY2JpbmQiIHRvIGxldCB0aGUgY2hlY2tfc2Nyb2xsYmluZCgpIGZ1bmN0aW9uCisgKiBrbm93IHRoYXQgaXQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHBlcmZvcm0gc2Nyb2xsYmluZGluZyBkdWUgdG8gdGhlIHNjcm9sbAorICogdGhhdCB3YXMgYSByZXN1bHQgb2YgdGhlICI6c3luY2JpbmQuIiAoT3RoZXJ3aXNlLCBjaGVja19zY3JvbGxiaW5kKCkgd2lsbAorICogdW5kbyBzb21lIG9mIHRoZSB3b3JrIGRvbmUgYnkgIjpzeW5jYmluZC4iKSAgLXJhbHN0b24KKyAqLworRVhURVJOIGludCAgICAgZGlkX3N5bmNiaW5kIElOSVQoPSBGQUxTRSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKy8qCisgKiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gYSBzbWFydCBpbmRlbnQgaGFzIGJlZW4gcGVyZm9ybWVkLiBXaGVuIHRoZSBuZXh0IHR5cGVkCisgKiBjaGFyYWN0ZXIgaXMgYSAneycgdGhlIGluc2VydGVkIHRhYiB3aWxsIGJlIGRlbGV0ZWQgYWdhaW4uCisgKi8KK0VYVEVSTiBpbnQJZGlkX3NpIElOSVQoPSBGQUxTRSk7CisKKy8qCisgKiBUaGlzIGZsYWcgaXMgc2V0IGFmdGVyIGFuIGF1dG8gaW5kZW50LiBJZiB0aGUgbmV4dCB0eXBlZCBjaGFyYWN0ZXIgaXMgYSAnfScKKyAqIG9uZSBpbmRlbnQgd2lsbCBiZSByZW1vdmVkLgorICovCitFWFRFUk4gaW50CWNhbl9zaSBJTklUKD0gRkFMU0UpOworCisvKgorICogVGhpcyBmbGFnIGlzIHNldCBhZnRlciBhbiAiTyIgY29tbWFuZC4gSWYgdGhlIG5leHQgdHlwZWQgY2hhcmFjdGVyIGlzIGEgJ3snCisgKiBvbmUgaW5kZW50IHdpbGwgYmUgcmVtb3ZlZC4KKyAqLworRVhURVJOIGludAljYW5fc2lfYmFjayBJTklUKD0gRkFMU0UpOworI2VuZGlmCisKK0VYVEVSTiBwb3NfVAlzYXZlZF9jdXJzb3IJCS8qIHdfY3Vyc29yIGJlZm9yZSBmb3JtYXR0aW5nIHRleHQuICovCisjIGlmZGVmIERPX0lOSVQKKwk9IElOSVRfUE9TX1QKKyMgZW5kaWYKKwk7CisKKy8qCisgKiBTdHVmZiBmb3IgaW5zZXJ0IG1vZGUuCisgKi8KK0VYVEVSTiBwb3NfVAlJbnNzdGFydDsJCS8qIFRoaXMgaXMgd2hlcmUgdGhlIGxhdGVzdAorCQkJCQkgKiBpbnNlcnQvYXBwZW5kIG1vZGUgc3RhcnRlZC4gKi8KKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisvKgorICogU3R1ZmYgZm9yIFZSRVBMQUNFIG1vZGUuCisgKi8KK0VYVEVSTiBpbnQJb3JpZ19saW5lX2NvdW50IElOSVQoPSAwKTsgIC8qIExpbmUgY291bnQgd2hlbiAiZ1IiIHN0YXJ0ZWQgKi8KK0VYVEVSTiBpbnQJdnJfbGluZXNfY2hhbmdlZCBJTklUKD0gMCk7IC8qICNMaW5lcyBjaGFuZ2VkIGJ5ICJnUiIgc28gZmFyICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9YMTEpICYmIGRlZmluZWQoRkVBVF9YQ0xJUEJPQVJEKQorLyogYXJndW1lbnQgdG8gU0VUSk1QKCkgZm9yIGhhbmRsaW5nIFggSU8gZXJyb3JzICovCitFWFRFUk4gSk1QX0JVRiB4X2p1bXBfZW52OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU0VUSk1QX0gpCisvKgorICogU3R1ZmYgZm9yIHNldGptcCgpIGFuZCBsb25nam1wKCkuCisgKiBVc2VkIHRvIHByb3RlY3QgYXJlYXMgd2hlcmUgd2UgY291bGQgY3Jhc2guCisgKi8KK0VYVEVSTiBKTVBfQlVGIGxjX2p1bXBfZW52OwkvKiBhcmd1bWVudCB0byBTRVRKTVAoKSAqLworI2lmZGVmIFNJR0hBU0FSRworRVhURVJOIGludCBsY19zaWduYWw7CQkvKiBjYXRjaGVkIHNpZ25hbCBudW1iZXIsIDAgd2hlbiBubyB3YXMgc2lnbmFsCisJCQkJICAgY2F0Y2hlZDsgdXNlZCBmb3IgbWNoX2xpYmNhbGwoKSAqLworI2VuZGlmCitFWFRFUk4gaW50IGxjX2FjdGl2ZSBJTklUKD0gRkFMU0UpOyAvKiBUUlVFIHdoZW4gbGNfanVtcF9lbnYgaXMgdmFsaWQuICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpCisvKgorICogVGhlc2UgZmxhZ3MgYXJlIHNldCBiYXNlZCB1cG9uICdmaWxlZW5jb2RpbmcnLgorICogTm90ZSB0aGF0ICJlbmNfdXRmOCIgaXMgYWxzbyBzZXQgZm9yICJ1bmljb2RlIiwgYmVjYXVzZSB0aGUgY2hhcmFjdGVycyBhcmUKKyAqIGludGVybmFsbHkgc3RvcmVkIGFzIFVURi04ICh0byBhdm9pZCB0cm91YmxlIHdpdGggTlVMIGJ5dGVzKS4KKyAqLworIyBkZWZpbmUgREJDU19KUE4JOTMyCS8qIGphcGFuICovCisjIGRlZmluZSBEQkNTX0pQTlUJOTkzMgkvKiBldWMtanAgKi8KKyMgZGVmaW5lIERCQ1NfS09SCTk0OQkvKiBrb3JlYSAqLworIyBkZWZpbmUgREJDU19LT1JVCTk5NDkJLyogZXVjLWtyICovCisjIGRlZmluZSBEQkNTX0NIUwk5MzYJLyogY2hpbmVzZSAqLworIyBkZWZpbmUgREJDU19DSFNVCTk5MzYJLyogZXVjLWNuICovCisjIGRlZmluZSBEQkNTX0NIVAk5NTAJLyogdGFpd2FuICovCisjIGRlZmluZSBEQkNTX0NIVFUJOTk1MAkvKiBldWMtdHcgKi8KKyMgZGVmaW5lIERCQ1NfMkJZVEUJMQkvKiAyYnl0ZS0gKi8KKyMgZGVmaW5lIERCQ1NfREVCVUcJLTEKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorRVhURVJOIGludAllbmNfZGJjcyBJTklUKD0gMCk7CQkvKiBPbmUgb2YgREJDU194eHggdmFsdWVzIGlmCisJCQkJCQkgICBEQkNTIGVuY29kaW5nICovCitFWFRFUk4gaW50CWVuY191bmljb2RlIElOSVQoPSAwKTsJLyogMjogVUNTLTIgb3IgVVRGLTE2LCA0OiBVQ1MtNCAqLworRVhURVJOIGludAllbmNfdXRmOCBJTklUKD0gRkFMU0UpOwkJLyogVVRGLTggZW5jb2RlZCBVbmljb2RlICovCisjIGlmZGVmIFdJTjMyNjQKKy8qIENvZGVwYWdlIG5yIG9mICdlbmNvZGluZycuICBOZWdhdGl2ZSBtZWFucyBpdCdzIG5vdCBiZWVuIHNldCB5ZXQsIHplcm8KKyAqIG1lYW5zICdlbmNvZGluZycgaXMgbm90IGEgdmFsaWQgY29kZXBhZ2UuICovCitFWFRFUk4gaW50CWVuY19jb2RlcGFnZSBJTklUKD0gLTEpOworIyBlbmRpZgorRVhURVJOIGludAloYXNfbWJ5dGUgSU5JVCg9IDApOwkJLyogYW55IG11bHRpLWJ5dGUgZW5jb2RpbmcgKi8KKworI2lmIGRlZmluZWQoV0lOMzI2NCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQorRVhURVJOIGludAl3aWRlX1dpbmRvd1Byb2MgSU5JVCg9IEZBTFNFKTsJLyogdXNlIHdpZGUgV2luZG93UHJvYygpICovCisjZW5kaWYKKworLyoKKyAqIFRvIHNwZWVkIHVwIEJZVEVMRU4oKSB3ZSBmaWxsIGEgdGFibGUgd2l0aCB0aGUgYnl0ZSBsZW5ndGhzIHdoZW5ldmVyCisgKiBlbmNfdXRmOCBvciBlbmNfZGJjcyBjaGFuZ2VzLgorICovCitFWFRFUk4gY2hhcgltYl9ieXRlbGVuX3RhYlsyNTZdOworCisvKiBWYXJpYWJsZXMgdGhhdCB0ZWxsIHdoYXQgY29udmVyc2lvbiBpcyB1c2VkIGZvciBrZXlib2FyZCBpbnB1dCBhbmQgZGlzcGxheQorICogb3V0cHV0LiAqLworRVhURVJOIHZpbWNvbnZfVCBpbnB1dF9jb252OwkJCS8qIHR5cGUgb2YgaW5wdXQgY29udmVyc2lvbiAqLworRVhURVJOIHZpbWNvbnZfVCBvdXRwdXRfY29udjsJCQkvKiB0eXBlIG9mIG91dHB1dCBjb252ZXJzaW9uICovCisKKy8qCisgKiBGdW5jdGlvbiBwb2ludGVycywgdXNlZCB0byBxdWlja2x5IGdldCB0byB0aGUgcmlnaHQgZnVuY3Rpb24uICBFYWNoIGhhcworICogdGhyZWUgcG9zc2libGUgdmFsdWVzOiBsYXRpbl8gKDgtYml0KSwgdXRmY18gb3IgdXRmXyAodXRmLTgpIGFuZCBkYmNzXworICogKERCQ1MpLgorICogVGhlIHZhbHVlIGlzIHNldCBpbiBtYl9pbml0KCk7CisgKi8KK0VYVEVSTiBpbnQgKCptYl9wdHIybGVuX2NoZWNrKSBfX0FSR1MoKGNoYXJfdSAqcCkpIElOSVQoPSBsYXRpbl9wdHIybGVuX2NoZWNrKTsKK0VYVEVSTiBpbnQgKCptYl9jaGFyMmxlbikgX19BUkdTKChpbnQgYykpIElOSVQoPSBsYXRpbl9jaGFyMmxlbik7CitFWFRFUk4gaW50ICgqbWJfY2hhcjJieXRlcykgX19BUkdTKChpbnQgYywgY2hhcl91ICpidWYpKSBJTklUKD0gbGF0aW5fY2hhcjJieXRlcyk7CitFWFRFUk4gaW50ICgqbWJfcHRyMmNlbGxzKSBfX0FSR1MoKGNoYXJfdSAqcCkpIElOSVQoPSBsYXRpbl9wdHIyY2VsbHMpOworRVhURVJOIGludCAoKm1iX2NoYXIyY2VsbHMpIF9fQVJHUygoaW50IGMpKSBJTklUKD0gbGF0aW5fY2hhcjJjZWxscyk7CitFWFRFUk4gaW50ICgqbWJfb2ZmMmNlbGxzKSBfX0FSR1MoKHVuc2lnbmVkIG9mZikpIElOSVQoPSBsYXRpbl9vZmYyY2VsbHMpOworRVhURVJOIGludCAoKm1iX3B0cjJjaGFyKSBfX0FSR1MoKGNoYXJfdSAqcCkpIElOSVQoPSBsYXRpbl9wdHIyY2hhcik7CitFWFRFUk4gaW50ICgqbWJfaGVhZF9vZmYpIF9fQVJHUygoY2hhcl91ICpiYXNlLCBjaGFyX3UgKnApKSBJTklUKD0gbGF0aW5faGVhZF9vZmYpOworCisjIGlmIGRlZmluZWQoVVNFX0lDT05WKSAmJiBkZWZpbmVkKERZTkFNSUNfSUNPTlYpCisvKiBQb2ludGVycyB0byBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB0byBiZSBsb2FkZWQgYXQgcnVudGltZSAqLworRVhURVJOIHNpemVfdCAoKmljb252KSAoaWNvbnZfdCBjZCwgY29uc3QgY2hhciAqKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICoqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7CitFWFRFUk4gaWNvbnZfdCAoKmljb252X29wZW4pIChjb25zdCBjaGFyICp0b2NvZGUsIGNvbnN0IGNoYXIgKmZyb21jb2RlKTsKK0VYVEVSTiBpbnQgKCppY29udl9jbG9zZSkgKGljb252X3QgY2QpOworRVhURVJOIGludCAoKmljb252Y3RsKSAoaWNvbnZfdCBjZCwgaW50IHJlcXVlc3QsIHZvaWQgKmFyZ3VtZW50KTsKK0VYVEVSTiBpbnQqICgqaWNvbnZfZXJybm8pICh2b2lkKTsKKyMgZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworI2lmZGVmIEZFQVRfWElNCisjIGlmZGVmIEZFQVRfR1VJX0dUSworIyAgaWZkZWYgSEFWRV9HVEsyCitFWFRFUk4gR3RrSU1Db250ZXh0CSp4aWMgSU5JVCg9IE5VTEwpOworIyAgZWxzZQorRVhURVJOIEdka0lDQXR0cgkqeGljX2F0dHIgSU5JVCg9IE5VTEwpOworRVhURVJOIEdka0lDCQkqeGljIElOSVQoPSBOVUxMKTsKK0VYVEVSTiBjaGFyCQkqZHJhd19mZWVkYmFjayBJTklUKD0gTlVMTCk7CisjICBlbmRpZgorLyoKKyAqIFN0YXJ0IGFuZCBlbmQgY29sdW1uIG9mIHRoZSBwcmVlZGl0IGFyZWEgaW4gdmlydHVhbCBjb2x1bW5zIGZyb20gdGhlIHN0YXJ0CisgKiBvZiB0aGUgdGV4dCBsaW5lLiAgV2hlbiB0aGVyZSBpcyBubyBwcmVlZGl0IGFyZWEgdGhleSBhcmUgc2V0IHRvIE1BWENPTC4KKyAqICJwcmVlZGl0X2VuZF9jb2wiIGlzIG5lZWRlZCBmb3IgY29sb3JpbmcgdGhlIHByZWVkaXRlZCBzdHJpbmcuICBEcmF3aW5nIHRoZQorICogY29sb3IgYmV0d2VlbiAicHJlZWRpdF9zdGFydF9jb2wiIGFuZCBjdXJwb3MgZGlkIG5vdCB3b3JrLCBiZWNhdXNlIHNvbWUgWElNCisgKiBzZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB0byB0aGUgZmlyc3QgY2hhciBvZiB0aGUgc3RyaW5nLgorICovCitFWFRFUk4gY29sbnJfVAkJcHJlZWRpdF9zdGFydF9jb2wgSU5JVCg9IE1BWENPTCk7CitFWFRFUk4gY29sbnJfVAkJcHJlZWRpdF9lbmRfY29sIElOSVQoPSBNQVhDT0wpOworCisvKiAieGltX2NoYW5nZWRfd2hpbGVfcHJlZWRpdGluZyIgaXMgc2V0IHdoZW4gY2hhbmdlZCgpIGNhbiBzZXQgdGhlICdtb2RpZmllZCcKKyAqIGZsYWcgZXZlbiB3aGlsZSBwcmVlZGl0aW5nLiAqLworRVhURVJOIGludAkJeGltX2NoYW5nZWRfd2hpbGVfcHJlZWRpdGluZyBJTklUKD0gRkFMU0UpOworIyBlbHNlCitFWFRFUk4gWElDCQl4aWMgSU5JVCg9IE5VTEwpOworIyBlbmRpZgorRVhURVJOIGd1aWNvbG9yX1QJeGltX2ZnX2NvbG9yIElOSVQoPSBJTlZBTENPTE9SKTsKK0VYVEVSTiBndWljb2xvcl9UCXhpbV9iZ19jb2xvciBJTklUKD0gSU5WQUxDT0xPUik7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfSEFOR1VMSU4KK0VYVEVSTiBpbnQJCWNvbXBvc2luZ19oYW5ndWwgSU5JVCg9IDApOworRVhURVJOIGNoYXJfdQkJY29tcG9zaW5nX2hhbmd1bF9idWZmZXJbNV07CisjZW5kaWYKKworLyoKKyAqICJTdGF0ZSIgaXMgdGhlIG1haW4gc3RhdGUgb2YgVmltLgorICogVGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcyB0aGF0IG1vZGlmeSB0aGUgc3RhdGU6CisgKiAiVmlzdWFsX21vZGUiICAgIFdoZW4gU3RhdGUgaXMgTk9STUFMIG9yIElOU0VSVC4KKyAqICJmaW5pc2hfb3AiCSAgICBXaGVuIFN0YXRlIGlzIE5PUk1BTCwgYWZ0ZXIgdHlwaW5nIHRoZSBvcGVyYXRvciBhbmQgYmVmb3JlCisgKgkJICAgIHR5cGluZyB0aGUgbW90aW9uIGNvbW1hbmQuCisgKi8KK0VYVEVSTiBpbnQJU3RhdGUgSU5JVCg9IE5PUk1BTCk7CS8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisJCQkJCSAqIGNvbW1hbmQgaW50ZXJwcmV0ZXIuICovCisKK0VYVEVSTiBpbnQJZmluaXNoX29wIElOSVQoPSBGQUxTRSk7LyogVFJVRSB3aGlsZSBhbiBvcGVyYXRvciBpcyBwZW5kaW5nICovCisKKy8qCisgKiBleCBtb2RlIChRKSBzdGF0ZQorICovCitFWFRFUk4gaW50IGV4bW9kZV9hY3RpdmUgSU5JVCg9IDApOwkvKiB6ZXJvLCBFWE1PREVfTk9STUFMIG9yIEVYTU9ERV9WSU0gKi8KK0VYVEVSTiBpbnQgZXhfbm9fcmVwcmludCBJTklUKD0gRkFMU0UpOyAvKiBubyBuZWVkIHRvIHByaW50IGFmdGVyIHogb3IgcCAqLworCitFWFRFUk4gaW50CVJlY29yZGluZyBJTklUKD0gRkFMU0UpOy8qIFRSVUUgd2hlbiByZWNvcmRpbmcgaW50byBhIHJlZy4gKi8KK0VYVEVSTiBpbnQJRXhlY19yZWcgSU5JVCg9IEZBTFNFKTsJLyogVFJVRSB3aGVuIGV4ZWN1dGluZyBhIHJlZ2lzdGVyICovCisKK0VYVEVSTiBpbnQJbm9fbWFwcGluZyBJTklUKD0gRkFMU0UpOyAgIC8qIGN1cnJlbnRseSBubyBtYXBwaW5nIGFsbG93ZWQgKi8KK0VYVEVSTiBpbnQJbm9femVyb19tYXBwaW5nIElOSVQoPSAwKTsgIC8qIG1hcHBpbmcgemVybyBub3QgYWxsb3dlZCAqLworRVhURVJOIGludAlhbGxvd19rZXlzIElOSVQoPSBGQUxTRSk7ICAgLyogYWxsb3cga2V5IGNvZGVzIHdoZW4gbm9fbWFwcGluZworCQkJCQkgICAgICogaXMgc2V0ICovCitFWFRFUk4gaW50CW5vX3Vfc3luYyBJTklUKD0gMCk7CS8qIERvbid0IGNhbGwgdV9zeW5jKCkgKi8KKworRVhURVJOIGludAlyZXN0YXJ0X2VkaXQgSU5JVCg9IDApOwkvKiBjYWxsIGVkaXQgd2hlbiBuZXh0IGNtZCBmaW5pc2hlZCAqLworRVhURVJOIGludAlhcnJvd191c2VkOwkJLyogTm9ybWFsbHkgRkFMU0UsIHNldCB0byBUUlVFIGFmdGVyCisJCQkJCSAqIGhpdHRpbmcgY3Vyc29yIGtleSBpbiBpbnNlcnQgbW9kZS4KKwkJCQkJICogVXNlZCBieSB2Z2V0b3JwZWVrKCkgdG8gZGVjaWRlIHdoZW4KKwkJCQkJICogdG8gY2FsbCB1X3N5bmMoKSAqLworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorRVhURVJOIGNoYXJfdQkqZWRpdF9zdWJtb2RlIElOSVQoPSBOVUxMKTsgLyogbXNnIGZvciBDVFJMLVggc3VibW9kZSAqLworRVhURVJOIGNoYXJfdQkqZWRpdF9zdWJtb2RlX3ByZSBJTklUKD0gTlVMTCk7IC8qIHByZXBlbmRlZCB0byBlZGl0X3N1Ym1vZGUgKi8KK0VYVEVSTiBjaGFyX3UJKmVkaXRfc3VibW9kZV9leHRyYSBJTklUKD0gTlVMTCk7LyogYXBwZW5kZWQgdG8gZWRpdF9zdWJtb2RlICovCitFWFRFUk4gZW51bSBobGZfdmFsdWUJZWRpdF9zdWJtb2RlX2hpZ2hsOyAvKiBoaWdobC4gbWV0aG9kIGZvciBleHRyYSBpbmZvICovCitFWFRFUk4gaW50CWN0cmxfeF9tb2RlIElOSVQoPSAwKTsJLyogV2hpY2ggQ3RybC1YIG1vZGUgYXJlIHdlIGluPyAqLworI2VuZGlmCisKK0VYVEVSTiBpbnQJbm9fYWJiciBJTklUKD0gVFJVRSk7CS8qIFRSVUUgd2hlbiBubyBhYmJyZXZpYXRpb25zIGxvYWRlZCAqLworI2lmZGVmIE1TRE9TCitFWFRFUk4gaW50CWJlZXBfY291bnQgSU5JVCg9IDApOwkvKiBuciBvZiBiZWVwcyBzaW5jZSBsYXN0IGNoYXIgdHlwZWQgKi8KKyNlbmRpZgorCisjaWZkZWYgVVNFX0VYRV9OQU1FCitFWFRFUk4gY2hhcl91CSpleGVfbmFtZTsJCS8qIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlICovCisjZW5kaWYKKworI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCitFWFRFUk4gaW50CWRvbnRfc2Nyb2xsIElOSVQoPSBGQUxTRSk7LyogZG9uJ3QgdXNlIHNjcm9sbGJhcnMgd2hlbiBUUlVFICovCisjZW5kaWYKK0VYVEVSTiBpbnQJbWFwcGVkX2N0cmxfYyBJTklUKD0gRkFMU0UpOyAvKiBDVFJMLUMgaXMgbWFwcGVkICovCitFWFRFUk4gaW50CWN0cmxfY19pbnRlcnJ1cHRzIElOSVQoPSBUUlVFKTsJLyogQ1RSTC1DIHNldHMgZ290X2ludCAqLworCitFWFRFUk4gY21kbW9kX1QJY21kbW9kOwkJCS8qIEV4IGNvbW1hbmQgbW9kaWZpZXJzICovCisKK0VYVEVSTiBpbnQJbXNnX3NpbGVudCBJTklUKD0gMCk7CS8qIGRvbid0IHByaW50IG1lc3NhZ2VzICovCitFWFRFUk4gaW50CWVtc2dfc2lsZW50IElOSVQoPSAwKTsJLyogZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgKi8KK0VYVEVSTiBpbnQJY21kX3NpbGVudCBJTklUKD0gRkFMU0UpOyAvKiBkb24ndCBlY2hvIHRoZSBjb21tYW5kIGxpbmUgKi8KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKK0VYVEVSTiBpbnQJc3dhcF9leGlzdHNfYWN0aW9uIElOSVQoPSAwKTsJLyogdXNlIGRpYWxvZyB3aGVuIHN3YXAgZmlsZQorCQkJCQkJICAgYWxyZWFkeSBleGlzdHMgKi8KKyNlbmRpZgorCitFWFRFUk4gY2hhcl91CSpJT2J1ZmY7CQkvKiBzcHJpbnRmJ3MgYXJlIGRvbmUgaW4gdGhpcyBidWZmZXIsCisJCQkJCSAgIHNpemUgaXMgSU9TSVpFICovCitFWFRFUk4gY2hhcl91CSpOYW1lQnVmZjsJCS8qIGZpbGUgbmFtZXMgYXJlIGV4cGFuZGVkIGluIHRoaXMKKwkJCQkJICogYnVmZmVyLCBzaXplIGlzIE1BWFBBVEhMICovCitFWFRFUk4gY2hhcl91CW1zZ19idWZbTVNHX0JVRl9MRU5dOwkvKiBzbWFsbCBidWZmZXIgZm9yIG1lc3NhZ2VzICovCisKKy8qIFdoZW4gbm9uLXplcm8sIHBvc3Rwb25lIHJlZHJhd2luZy4gKi8KK0VYVEVSTiBpbnQJUmVkcmF3aW5nRGlzYWJsZWQgSU5JVCg9IDApOworCitFWFRFUk4gaW50CXJlYWRvbmx5bW9kZSBJTklUKD0gRkFMU0UpOyAvKiBTZXQgdG8gVFJVRSBmb3IgInZpZXciICovCitFWFRFUk4gaW50CXJlY292ZXJ5bW9kZSBJTklUKD0gRkFMU0UpOyAvKiBTZXQgdG8gVFJVRSBmb3IgIi1yIiBvcHRpb24gKi8KKworRVhURVJOIHN0cnVjdCBidWZmaGVhZGVyIHN0dWZmYnVmZgkvKiBzdHVmZiBidWZmZXIgKi8KKyNpZmRlZiBET19JTklUCisJCSAgICA9IHt7TlVMTCwge05VTH19LCBOVUxMLCAwLCAwfQorI2VuZGlmCisJCSAgICA7CitFWFRFUk4gdHlwZWJ1Zl9UIHR5cGVidWYJCS8qIHR5cGVhaGVhZCBidWZmZXIgKi8KKyNpZmRlZiBET19JTklUCisJCSAgICA9IHtOVUxMLCBOVUxMfQorI2VuZGlmCisJCSAgICA7CisjaWZkZWYgRkVBVF9FWF9FWFRSQQorRVhURVJOIGludAlleF9ub3JtYWxfYnVzeSBJTklUKD0gMCk7IC8qIHJlY3Vyc2l2ZW5lcyBvZiBleF9ub3JtYWwoKSAqLworI2VuZGlmCitFWFRFUk4gaW50CXN0b3BfaW5zZXJ0X21vZGU7CS8qIGZvciAiOnN0b3BpbnNlcnQiIGFuZCAnaW5zZXJ0bW9kZScgKi8KKworRVhURVJOIGludAlLZXlUeXBlZDsJCS8qIFRSVUUgaWYgdXNlciB0eXBlZCBjdXJyZW50IGNoYXIgKi8KK0VYVEVSTiBpbnQJS2V5U3R1ZmZlZDsJCS8qIFRSVUUgaWYgY3VycmVudCBjaGFyIGZyb20gc3R1ZmZidWYgKi8KKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorRVhURVJOIGludAl2Z2V0Y19pbV9hY3RpdmU7CS8qIElucHV0IE1ldGhvZCB3YXMgYWN0aXZlIGZvciBsYXN0CisJCQkJCSAgIGNoYXJhY3RlciBvYnRhaW5lZCBmcm9tIHZnZXRjKCkgKi8KKyNlbmRpZgorRVhURVJOIGludAltYXB0aWNrIElOSVQoPSAwKTsJLyogdGljayBmb3IgZWFjaCBub24tbWFwcGVkIGNoYXIgKi8KKworRVhURVJOIGNoYXJfdQljaGFydGFiWzI1Nl07CQkvKiB0YWJsZSB1c2VkIGluIGNoYXJzZXQuYzsgU2VlCisJCQkJCSAgIGluaXRfY2hhcnRhYigpIGZvciBleHBsYW5hdGlvbiAqLworCitFWFRFUk4gaW50CW11c3RfcmVkcmF3IElOSVQoPSAwKTsJICAgIC8qIHR5cGUgb2YgcmVkcmF3IG5lY2Vzc2FyeSAqLworRVhURVJOIGludAlza2lwX3JlZHJhdyBJTklUKD0gRkFMU0UpOyAgLyogc2tpcCByZWRyYXcgb25jZSAqLworRVhURVJOIGludAlkb19yZWRyYXcgSU5JVCg9IEZBTFNFKTsgICAgLyogZXh0cmEgcmVkcmF3IG9uY2UgKi8KKworRVhURVJOIGludAluZWVkX2hpZ2hsaWdodF9jaGFuZ2VkIElOSVQoPSBUUlVFKTsKK0VYVEVSTiBjaGFyX3UJKnVzZV92aW1pbmZvIElOSVQoPSBOVUxMKTsgIC8qIG5hbWUgb2YgdmltaW5mbyBmaWxlIHRvIHVzZSAqLworCisjZGVmaW5lIE5TQ1JJUFQgMTUKK0VYVEVSTiBGSUxFCSpzY3JpcHRpbltOU0NSSVBUXTsJICAgIC8qIHN0cmVhbXMgdG8gcmVhZCBzY3JpcHQgZnJvbSAqLworRVhURVJOIGludAljdXJzY3JpcHQgSU5JVCg9IDApOwkgICAgLyogaW5kZXggaW4gc2NyaXB0aW5bXSAqLworRVhURVJOIEZJTEUJKnNjcmlwdG91dCAgSU5JVCg9IE5VTEwpOyAgIC8qIHN0cmVhbSB0byB3cml0ZSBzY3JpcHQgdG8gKi8KK0VYVEVSTiBpbnQJcmVhZF9jbWRfZmQgSU5JVCg9IDApOwkgICAgLyogZmQgdG8gcmVhZCBjb21tYW5kcyBmcm9tICovCisKK0VYVEVSTiBpbnQJZ290X2ludCBJTklUKD0gRkFMU0UpOwkgICAgLyogc2V0IHRvIFRSVUUgd2hlbiBpbnRlcnJ1cHQKKwkJCQkJCXNpZ25hbCBvY2N1cnJlZCAqLworI2lmZGVmIFVTRV9URVJNX0NPTlNPTEUKK0VYVEVSTiBpbnQJdGVybV9jb25zb2xlIElOSVQoPSBGQUxTRSk7IC8qIHNldCB0byBUUlVFIHdoZW4gY29uc29sZSB1c2VkICovCisjZW5kaWYKK0VYVEVSTiBpbnQJdGVybWNhcF9hY3RpdmUgSU5JVCg9IEZBTFNFKTsJLyogc2V0IGJ5IHN0YXJ0dGVybWNhcCgpICovCitFWFRFUk4gaW50CWN1cl90bW9kZSBJTklUKD0gVE1PREVfQ09PSyk7CS8qIGlucHV0IHRlcm1pbmFsIG1vZGUgKi8KK0VYVEVSTiBpbnQJYmFuZ3JlZG8gSU5JVCg9IEZBTFNFKTsJICAgIC8qIHNldCB0byBUUlVFIHdoaXRoICEgY29tbWFuZCAqLworRVhURVJOIGludAlzZWFyY2hjbWRsZW47CQkgICAgLyogbGVuZ3RoIG9mIHByZXZpb3VzIHNlYXJjaCBjbWQgKi8KK0VYVEVSTiBpbnQJcmVnX3N5biBJTklUKD0gMCk7CSAgICAvKiB2aW1fcmVnZXhlYygpIHVzZWQgZm9yIHN5bnRheCAqLworI2lmZGVmIEZFQVRfU1lOX0hMCitFWFRFUk4gaW50CXJlZ19kb19leHRtYXRjaCBJTklUKD0gMCk7ICAvKiBVc2VkIHdoZW4gY29tcGlsaW5nIHJlZ2V4cDoKKwkJCQkJICAgICAqIFJFWF9TRVQgdG8gYWxsb3cgXHpcKC4uLlwpLAorCQkJCQkgICAgICogUkVYX1VTRSB0byBhbGxvdyBcelwxIGV0IGFsLiAqLworRVhURVJOIHJlZ19leHRtYXRjaF9UICpyZV9leHRtYXRjaF9pbiBJTklUKD0gTlVMTCk7IC8qIFVzZWQgYnkgdmltX3JlZ2V4ZWMoKToKKwkJCQkJICAgICAqIHN0cmluZ3MgZm9yIFx6XDEuLi5celw5ICovCitFWFRFUk4gcmVnX2V4dG1hdGNoX1QgKnJlX2V4dG1hdGNoX291dCBJTklUKD0gTlVMTCk7IC8qIFNldCBieSB2aW1fcmVnZXhlYygpCisJCQkJCSAgICAgKiB0byBzdG9yZSBcelwoLi4uXCkgbWF0Y2hlcyAqLworI2VuZGlmCisKK0VYVEVSTiBpbnQJZGlkX291dG9mbWVtX21zZyBJTklUKD0gRkFMU0UpOworCQkJCQkgICAgLyogc2V0IGFmdGVyIG91dCBvZiBtZW1vcnkgbXNnICovCitFWFRFUk4gaW50CWRpZF9zd2Fwd3JpdGVfbXNnIElOSVQoPSBGQUxTRSk7CisJCQkJCSAgICAvKiBzZXQgYWZ0ZXIgc3dhcCB3cml0ZSBlcnJvciBtc2cgKi8KK0VYVEVSTiBpbnQJdW5kb19vZmYgSU5JVCg9IEZBTFNFKTsJICAgIC8qIHVuZG8gc3dpdGNoZWQgb2ZmIGZvciBub3cgKi8KK0VYVEVSTiBpbnQJZ2xvYmFsX2J1c3kgSU5JVCg9IDApOwkgICAgLyogc2V0IHdoZW4gOmdsb2JhbCBpcyBleGVjdXRpbmcgKi8KK0VYVEVSTiBpbnQJbGlzdGNtZF9idXN5IElOSVQoPSBGQUxTRSk7IC8qIHNldCB3aGVuIDphcmdkbywgOndpbmRvIG9yCisJCQkJCSAgICAgICA6YnVmZG8gaXMgZXhlY3V0aW5nICovCitFWFRFUk4gaW50CW5lZWRfc3RhcnRfaW5zZXJ0bW9kZSBJTklUKD0gRkFMU0UpOworCQkJCQkgICAgLyogc3RhcnQgaW5zZXJ0IG1vZGUgc29vbiAqLworRVhURVJOIGNoYXJfdQkqbGFzdF9jbWRsaW5lIElOSVQoPSBOVUxMKTsgLyogbGFzdCBjb21tYW5kIGxpbmUgKGZvciAiOikgKi8KK0VYVEVSTiBjaGFyX3UJKnJlcGVhdF9jbWRsaW5lIElOSVQoPSBOVUxMKTsgLyogY29tbWFuZCBsaW5lIGZvciAiLiIgKi8KKyNpZmRlZiBGRUFUX0NNREhJU1QKK0VYVEVSTiBjaGFyX3UJKm5ld19sYXN0X2NtZGxpbmUgSU5JVCg9IE5VTEwpOwkvKiBuZXcgdmFsdWUgZm9yIGxhc3RfY21kbGluZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECitFWFRFUk4gY2hhcl91CSphdXRvY21kX2ZuYW1lIElOSVQoPSBOVUxMKTsgLyogZm5hbWUgZm9yIDxhZmlsZT4gb24gY21kbGluZSAqLworRVhURVJOIGludAlhdXRvY21kX2J1Zm5yIElOSVQoPSAwKTsgICAgIC8qIGZudW0gZm9yIDxhYnVmPiBvbiBjbWRsaW5lICovCitFWFRFUk4gY2hhcl91CSphdXRvY21kX21hdGNoIElOSVQoPSBOVUxMKTsgLyogbmFtZSBmb3IgPGFtYXRjaD4gb24gY21kbGluZSAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKK0VYVEVSTiBpbnQJcG9zdHBvbmVkX3NwbGl0IElOSVQoPSAwKTsgIC8qIGZvciBDVFJMLVcgQ1RSTC1dIGNvbW1hbmQgKi8KK0VYVEVSTiBpbnQJcG9zdHBvbmVkX3NwbGl0X2ZsYWdzIElOSVQoPSAwKTsgIC8qIGFyZ3MgZm9yIHdpbl9zcGxpdCgpICovCisjIGlmZGVmIEZFQVRfUVVJQ0tGSVgKK0VYVEVSTiBpbnQJZ19kb190YWdwcmV2aWV3IElOSVQoPSAwKTsgIC8qIGZvciB0YWcgcHJldmlldyBjb21tYW5kczoKKwkJCQkJICAgICAgIGhlaWdodCBvZiBwcmV2aWV3IHdpbmRvdyAqLworIyBlbmRpZgorI2VuZGlmCitFWFRFUk4gaW50CXJlcGxhY2Vfb2Zmc2V0IElOSVQoPSAwKTsgICAvKiBvZmZzZXQgZm9yIHJlcGxhY2VfcHVzaCgpICovCisKK0VYVEVSTiBjaGFyX3UJKmVzY2FwZV9jaGFycyBJTklUKD0gKGNoYXJfdSAqKSIgXHRcXFwifCIpOworCQkJCQkgICAgLyogbmVlZCBiYWNrc2xhc2ggaW4gY21kIGxpbmUgKi8KKworRVhURVJOIGludAlrZWVwX2hlbHBfZmxhZyBJTklUKD0gRkFMU0UpOyAvKiBkb2luZyA6dGEgZnJvbSBoZWxwIGZpbGUgKi8KKworLyoKKyAqIFdoZW4gYSBzdHJpbmcgb3B0aW9uIGlzIE5VTEwgKHdoaWNoIG9ubHkgaGFwcGVucyBpbiBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zKSwgaXQgaXMgc2V0IHRvIGVtcHR5X29wdGlvbiwgdG8gYXZvaWQgaGF2aW5nIHRvIGNoZWNrIGZvciBOVUxMCisgKiBldmVyeXdoZXJlLgorICovCitFWFRFUk4gY2hhcl91CSplbXB0eV9vcHRpb24gSU5JVCg9IChjaGFyX3UgKikiIik7CisKKyNpZmRlZiBERUJVRworRVhURVJOIEZJTEUgKmRlYnVnZnAgSU5JVCg9IE5VTEwpOworI2VuZGlmCisKK0VYVEVSTiBpbnQgIHJlZGlyX29mZiBJTklUKD0gRkFMU0UpOwkvKiBubyByZWRpcmVjdGlvbiBmb3IgYSBtb21lbnQgKi8KK0VYVEVSTiBGSUxFICpyZWRpcl9mZCBJTklUKD0gTlVMTCk7CS8qIG1lc3NhZ2UgcmVkaXJlY3Rpb24gZmlsZSAqLworI2lmZGVmIEZFQVRfRVZBTAorRVhURVJOIGludCAgcmVkaXJfcmVnIElOSVQoPSAwKTsJLyogbWVzc2FnZSByZWRpcmVjdGlvbiByZWdpc3RlciAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0xBTkdNQVAKK0VYVEVSTiBjaGFyX3UJbGFuZ21hcF9tYXBjaGFyWzI1Nl07CS8qIG1hcHBpbmcgZm9yIGxhbmd1YWdlIGtleXMgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9XSUxETUVOVQorRVhURVJOIGludCAgc2F2ZV9wX2xzIElOSVQoPSAtMSk7CS8qIFNhdmUgJ2xhc3RzdGF0dXMnIHNldHRpbmcgKi8KK0VYVEVSTiBpbnQgIHNhdmVfcF93bWggSU5JVCg9IC0xKTsJLyogU2F2ZSAnd2lubWluaGVpZ2h0JyBzZXR0aW5nICovCitFWFRFUk4gaW50ICB3aWxkX21lbnVfc2hvd2luZyBJTklUKD0gMCk7CisjZGVmaW5lIFdNX1NIT1dOCTEJCS8qIHdpbGRtZW51IHNob3dpbmcgKi8KKyNkZWZpbmUgV01fU0NST0xMRUQJMgkJLyogd2lsZG1lbnUgc2hvd2luZyB3aXRoIHNjcm9sbCAqLworI2VuZGlmCisKKyNpZmRlZiBNU1dJTgorRVhURVJOIGNoYXJfdQl0b3VwcGVyX3RhYlsyNTZdOwkvKiB0YWJsZSBmb3IgdG91cHBlcigpICovCitFWFRFUk4gY2hhcl91CXRvbG93ZXJfdGFiWzI1Nl07CS8qIHRhYmxlIGZvciB0b2xvd2VyKCkgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKK0VYVEVSTiBjaGFyCWJyZWFrYXRfZmxhZ3NbMjU2XTsJLyogd2hpY2ggY2hhcmFjdGVycyBhcmUgaW4gJ2JyZWFrYXQnICovCisjZW5kaWYKKworLyogdGhlc2UgYXJlIGluIHZlcnNpb24uYyAqLworZXh0ZXJuIGNoYXIgKlZlcnNpb247CitleHRlcm4gY2hhciAqbWVkaXVtVmVyc2lvbjsKKyNpZiBkZWZpbmVkKEhBVkVfREFURV9USU1FKSAmJiBkZWZpbmVkKFZNUykgJiYgZGVmaW5lZChWQVhDKQorZXh0ZXJuIGNoYXIgbG9uZ1ZlcnNpb25bXTsKKyNlbHNlCitleHRlcm4gY2hhciAqbG9uZ1ZlcnNpb247CisjZW5kaWYKKworLyoKKyAqIFNvbWUgZmlsZSBuYW1lcyBhcmUgc3RvcmVkIGluIHBhdGhkZWYuYywgd2hpY2ggaXMgZ2VuZXJhdGVkIGZyb20gdGhlCisgKiBNYWtlZmlsZSB0byBtYWtlIHRoZWlyIHZhbHVlIGRlcGVuZCBvbiB0aGUgTWFrZWZpbGUuCisgKi8KKyNpZmRlZiBIQVZFX1BBVEhERUYKK2V4dGVybiBjaGFyX3UgKmRlZmF1bHRfdmltX2RpcjsKK2V4dGVybiBjaGFyX3UgKmRlZmF1bHRfdmltcnVudGltZV9kaXI7CitleHRlcm4gY2hhcl91ICphbGxfY2ZsYWdzOworZXh0ZXJuIGNoYXJfdSAqYWxsX2xmbGFnczsKKyMgaWZkZWYgVk1TCitleHRlcm4gY2hhcl91ICpjb21waWxlcl92ZXJzaW9uOworIyBlbmRpZgorZXh0ZXJuIGNoYXJfdSAqY29tcGlsZWRfdXNlcjsKK2V4dGVybiBjaGFyX3UgKmNvbXBpbGVkX3N5czsKKyNlbmRpZgorCisvKiBXaGVuIGEgd2luZG93IGhhcyBhIGxvY2FsIGRpcmVjdG9yeSwgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGdsb2JhbAorICogY3VycmVudCBkaXJlY3RvcnkgaXMgc3RvcmVkIGhlcmUgKGluIGFsbG9jYXRlZCBtZW1vcnkpLiAgSWYgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeSBpcyBub3QgYSBsb2NhbCBkaXJlY3RvcnksIGdsb2JhbGRpciBpcyBOVUxMLiAqLworRVhURVJOIGNoYXJfdQkqZ2xvYmFsZGlyIElOSVQoPSBOVUxMKTsKKworLyogQ2hhcmFjdGVycyBmcm9tICdsaXN0Y2hhcnMnIG9wdGlvbiAqLworRVhURVJOIGludAlsY3NfZW9sIElOSVQoPSAnJCcpOworRVhURVJOIGludAlsY3NfZXh0IElOSVQoPSBOVUwpOworRVhURVJOIGludAlsY3NfcHJlYyBJTklUKD0gTlVMKTsKK0VYVEVSTiBpbnQJbGNzX3RhYjEgSU5JVCg9IE5VTCk7CitFWFRFUk4gaW50CWxjc190YWIyIElOSVQoPSBOVUwpOworRVhURVJOIGludAlsY3NfdHJhaWwgSU5JVCg9IE5VTCk7CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChGRUFUX1dJTERNRU5VKSB8fCBkZWZpbmVkKEZFQVRfU1RMX09QVCkgXAorCXx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorLyogQ2hhcmFjdGVycyBmcm9tICdmaWxsY2hhcnMnIG9wdGlvbiAqLworRVhURVJOIGludAlmaWxsX3N0bCBJTklUKD0gJyAnKTsKK0VYVEVSTiBpbnQJZmlsbF9zdGxuYyBJTklUKD0gJyAnKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKEZFQVRfRk9MRElORykKK0VYVEVSTiBpbnQJZmlsbF92ZXJ0IElOSVQoPSAnICcpOworRVhURVJOIGludAlmaWxsX2ZvbGQgSU5JVCg9ICctJyk7CitFWFRFUk4gaW50CWZpbGxfZGlmZiBJTklUKD0gJy0nKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qIFdoZXRoZXIgJ2tleW1vZGVsJyBjb250YWlucyAic3RvcHNlbCIgYW5kICJzdGFydHNlbCIuICovCitFWFRFUk4gaW50CWttX3N0b3BzZWwgSU5JVCg9IEZBTFNFKTsKK0VYVEVSTiBpbnQJa21fc3RhcnRzZWwgSU5JVCg9IEZBTFNFKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DTURXSU4KK0VYVEVSTiBpbnQJY2VkaXRfa2V5IElOSVQoPSAtMSk7CS8qIGtleSB2YWx1ZSBvZiAnY2VkaXQnIG9wdGlvbiAqLworRVhURVJOIGludAljbWR3aW5fdHlwZSBJTklUKD0gMCk7CS8qIHR5cGUgb2YgY21kbGluZSB3aW5kb3cgb3IgMCAqLworRVhURVJOIGludAljbWR3aW5fcmVzdWx0IElOSVQoPSAwKTsgLyogcmVzdWx0IG9mIGNtZGxpbmUgd2luZG93IG9yIDAgKi8KKyNlbmRpZgorCitFWFRFUk4gY2hhcl91IG5vX2xpbmVzX21zZ1tdCUlOSVQoPSBOXygiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIpKTsKKworLyogdGFibGUgdG8gc3RvcmUgcGFyc2VkICd3aWxkbW9kZScgKi8KK0VYVEVSTiBjaGFyX3UJd2ltX2ZsYWdzWzRdOworCisjaWYgZGVmaW5lZChGRUFUX1RJVExFKSAmJiBkZWZpbmVkKEZFQVRfU1RMX09QVCkKKy8qIHdoZXRoZXIgdGl0bGVzdHJpbmcgYW5kIGljb25zdHJpbmcgY29udGFpbnMgc3RhdHVzbGluZSBzeW50YXggKi8KKyMgZGVmaW5lIFNUTF9JTl9JQ09OCTEKKyMgZGVmaW5lIFNUTF9JTl9USVRMRQkyCitFWFRFUk4gaW50ICAgICAgc3RsX3N5bnRheCBJTklUKD0gMCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisvKiBkb24ndCB1c2UgJ2hsc2VhcmNoJyB0ZW1wb3JhcmlseSAqLworRVhURVJOIGludAlub19obHNlYXJjaCBJTklUKD0gRkFMU0UpOworI2VuZGlmCisKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKy8qIHRoZSB0YWJsZSBpcyBpbiBtaXNjMi5jLCBiZWNhdXNlIG9mIGluaXRpYWxpemF0aW9ucyAqLworZXh0ZXJuIGN1cnNvcmVudHJ5X1Qgc2hhcGVfdGFibGVbU0hBUEVfSURYX0NPVU5UXTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9QUklOVEVSCisjIGRlZmluZSBPUFRfUFJJTlRfVE9QCQkwCisjIGRlZmluZSBPUFRfUFJJTlRfQk9UCQkxCisjIGRlZmluZSBPUFRfUFJJTlRfTEVGVAkJMgorIyBkZWZpbmUgT1BUX1BSSU5UX1JJR0hUCTMKKyMgZGVmaW5lIE9QVF9QUklOVF9IRUFERVJIRUlHSFQJNAorIyBkZWZpbmUgT1BUX1BSSU5UX1NZTlRBWAk1CisjIGRlZmluZSBPUFRfUFJJTlRfTlVNQkVSCTYKKyMgZGVmaW5lIE9QVF9QUklOVF9XUkFQCQk3CisjIGRlZmluZSBPUFRfUFJJTlRfRFVQTEVYCTgKKyMgZGVmaW5lIE9QVF9QUklOVF9QT1JUUkFJVAk5CisjIGRlZmluZSBPUFRfUFJJTlRfUEFQRVIJMTAKKyMgZGVmaW5lIE9QVF9QUklOVF9DT0xMQVRFCTExCisjIGRlZmluZSBPUFRfUFJJTlRfSk9CU1BMSVQJMTIKKyMgZGVmaW5lIE9QVF9QUklOVF9GT1JNRkVFRAkxMworCisjIGRlZmluZSBPUFRfUFJJTlRfTlVNX09QVElPTlMJMTQKKworRVhURVJOIG9wdGlvbl90YWJsZV9UIHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfTlVNX09QVElPTlNdCisjIGlmZGVmIERPX0lOSVQKKyA9Cit7CisgICAgeyJ0b3AiLAlUUlVFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCisgICAgeyJib3R0b20iLAlUUlVFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCisgICAgeyJsZWZ0IiwJVFJVRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorICAgIHsicmlnaHQiLAlUUlVFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCisgICAgeyJoZWFkZXIiLAlUUlVFLCAwLCBOVUxMLCAwLCBGQUxTRX0sCisgICAgeyJzeW50YXgiLAlGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorICAgIHsibnVtYmVyIiwJRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKKyAgICB7IndyYXAiLAlGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorICAgIHsiZHVwbGV4IiwJRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKKyAgICB7InBvcnRyYWl0IiwgRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKKyAgICB7InBhcGVyIiwJRkFMU0UsIDAsIE5VTEwsIDAsIEZBTFNFfSwKKyAgICB7ImNvbGxhdGUiLAlGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorICAgIHsiam9ic3BsaXQiLCBGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorICAgIHsiZm9ybWZlZWQiLCBGQUxTRSwgMCwgTlVMTCwgMCwgRkFMU0V9LAorfQorIyBlbmRpZgorOworCisvKiBGb3IgcHJ0X2dldF91bml0KCkuICovCisjIGRlZmluZSBQUlRfVU5JVF9OT05FCS0xCisjIGRlZmluZSBQUlRfVU5JVF9QRVJDCTAKKyMgZGVmaW5lIFBSVF9VTklUX0lOQ0gJMQorIyBkZWZpbmUgUFJUX1VOSVRfTU0JMgorIyBkZWZpbmUgUFJUX1VOSVRfUE9JTlQJMworIyBkZWZpbmUgUFJUX1VOSVRfTkFNRVMgeyJwYyIsICJpbiIsICJtbSIsICJwdCJ9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfWENMSVBCT0FSRAorRVhURVJOIGNoYXIJKnh0ZXJtX2Rpc3BsYXkgSU5JVCg9IE5VTEwpOwkvKiB4dGVybSBkaXNwbGF5IG5hbWUgKi8KK0VYVEVSTiBEaXNwbGF5CSp4dGVybV9kcHkgSU5JVCg9IE5VTEwpOwkvKiB4dGVybSBkaXNwbGF5IHBvaW50ZXIgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9YQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1gxMSkKK0VYVEVSTiBYdEFwcENvbnRleHQgYXBwX2NvbnRleHQgSU5JVCg9IChYdEFwcENvbnRleHQpTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX0dUSworRVhURVJOIGd1aW50MzIJZ3RrX3NvY2tldF9pZCBJTklUKD0gMCk7CitFWFRFUk4gaW50CWVjaG9fd2lkX2FyZyBJTklUKD0gRkFMU0UpOwkvKiAtLWVjaG8td2lkIGFyZ3VtZW50ICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCitFWFRFUk4gY2hhcl91CSpzZXJ2ZXJOYW1lIElOSVQoPSBOVUxMKTsJLyogbmFtZSBvZiB0aGUgc2VydmVyICovCitFWFRFUk4gaW50CXJlY2VpdmVkX2Zyb21fY2xpZW50IElOSVQoPSBGQUxTRSk7CS8qIHJlY2VpdmVkIHRleHQgZnJvbQorCQkJCQkJCSAgIGNsaWVudCAqLworIyBpZmRlZiBGRUFUX1gxMQorRVhURVJOIFdpbmRvdwljb21tV2luZG93IElOSVQoPSBOb25lKTsKK0VYVEVSTiBXaW5kb3cJY2xpZW50V2luZG93IElOSVQoPSBOb25lKTsKK0VYVEVSTiBBdG9tCWNvbW1Qcm9wZXJ0eSBJTklUKD0gTm9uZSk7CitFWFRFUk4gY2hhcl91CSpzZXJ2ZXJEZWxheWVkU3RhcnROYW1lIElOSVQoPSBOVUxMKTsKKyMgZWxzZQorIyBpZmRlZiBQUk9UTwordHlwZWRlZiBpbnQgSFdORDsKKyMgZW5kaWYKK0VYVEVSTiBIV05ECWNsaWVudFdpbmRvdyBJTklUKD0gMCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCitFWFRFUk4gaW50CXRlcm1faXNfeHRlcm0gSU5JVCg9IEZBTFNFKTsJLyogeHRlcm0tbGlrZSAndGVybScgKi8KKyNlbmRpZgorCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCitFWFRFUk4gY2hhcglwc2VwYyBJTklUKD0gJ1xcJyk7CS8qIG5vcm1hbCBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KK0VYVEVSTiBjaGFyCXBzZXBjTiBJTklUKD0gJy8nKTsJLyogYWJub3JtYWwgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyICovCitFWFRFUk4gY2hhcglwc2Vwc1syXQkJLyogbm9ybWFsIHBhdGggc2VwYXJhdG9yIHN0cmluZyAqLworIyBpZmRlZiBET19JTklUCisJCQk9IHsnXFwnLCAwfQorIyBlbmRpZgorCQkJOworRVhURVJOIGNoYXIJcHNlcHNOWzJdCQkvKiBhYm5vcm1hbCBwYXRoIHNlcGFyYXRvciBzdHJpbmcgKi8KKyMgaWZkZWYgRE9fSU5JVAorCQkJPSB7Jy8nLCAwfQorIyBlbmRpZgorCQkJOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisvKiBTZXQgdG8gVFJVRSB3aGVuIGFuIG9wZXJhdG9yIGlzIGJlaW5nIGV4ZWN1dGVkIHdpdGggdmlydHVhbCBlZGl0aW5nLCBNQVlCRQorICogd2hlbiBubyBvcGVyYXRvciBpcyBiZWluZyBleGVjdXRlZCwgRkFMU0Ugb3RoZXJ3aXNlLiAqLworRVhURVJOIGludAl2aXJ0dWFsX29wIElOSVQoPSBNQVlCRSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU1lOX0hMCisvKiBEaXNwbGF5IHRpY2ssIGluY3JlbWVudGVkIGZvciBlYWNoIGNhbGwgdG8gdXBkYXRlX3NjcmVlbigpICovCitFWFRFUk4gZGlzcHRpY2tfVAlkaXNwbGF5X3RpY2sgSU5JVCg9IDApOworI2VuZGlmCisKKyNpZmRlZiBBTFRfWF9JTlBVVAorLyogd2UgbmVlZCB0byBiZSBhYmxlIHRvIGdvIGludG8gdGhlIGRpc3BsYXRjaCBsb29wIHdoaWxlIHByb2Nlc3NpbmcgYSBjb21tYW5kCisgKiByZWNldmllZCB2aWEgYWx0ZXJuYXRlIGlucHV0LiBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgYW5vdGhlcgorICogY29tbWFuZCB1bnRpbCB0aGUgZmlyc3QgaXMgY29tcGxldGVkLgorICovCitFWFRFUk4gaW50CXN1cHByZXNzX2FsdGVybmF0ZV9pbnB1dCBJTklUKD0gRkFMU0UpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfTUNIX0VSUk1TRworLyogR3JvdyBhcnJheSB0byBjb2xsZWN0IGVycm9yIG1lc3NhZ2VzIGluIHVudGlsIHRoZXkgY2FuIGJlIGRpc3BsYXllZC4gKi8KK0VYVEVSTiBnYXJyYXlfVCBlcnJvcl9nYQorIyBpZmRlZiBET19JTklUCisJPSB7MCwgMCwgMCwgMCwgTlVMTH0KKyMgZW5kaWYKKwk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworRVhURVJOIGNoYXIgKm5ldGJlYW5zQXJnIElOSVQoPSBOVUxMKTsJLyogdGhlIC1uYls6aG9zdDpwb3J0OnBhc3N3ZF0gYXJnICovCitFWFRFUk4gaW50IG5ldGJlYW5zQ2xvc2VGaWxlIElOSVQoPSAwKTsJLyogc2VuZCBraWxsZWQgaWYgIT0gMCAqLworRVhURVJOIGludCBuZXRiZWFuc0ZpcmVDaGFuZ2VzIElOSVQoPSAxKTsgLyogc2VuZCBidWZmZXIgY2hhbmdlcyBpZiAhPSAwICovCitFWFRFUk4gaW50IG5ldGJlYW5zRm9yY2VkUXVpdCBJTklUKD0gMCk7LyogZG9uJ3Qgd3JpdGUgbW9kaWZpZWQgZmlsZXMgKi8KK0VYVEVSTiBpbnQgbmV0YmVhbnNPcGVuRmlsZSBJTklUKD0gMSk7CS8qIHNlbmQgZmlsZU9wZW5lZCBpZiAhPSAwICovCitFWFRFUk4gaW50IG5ldGJlYW5zUmVhZEZpbGUgSU5JVCg9IDEpOwkvKiBPSyB0byByZWFkIGZyb20gZGlzayBpZiAhPSAwICovCitFWFRFUk4gaW50IG5ldGJlYW5zU3VwcHJlc3NOb0xpbmVzIElOSVQoPSAwKTsgLyogc2tpcCAiTm8gbGluZXMgaW4gYnVmZmVyIiAqLworRVhURVJOIGludCB1c2luZ05ldGJlYW5zIElOSVQoPSAwKTsJLyogc2V0IGlmIC1uYiBmbGFnIGlzIHVzZWQgKi8KKyNlbmRpZgorCisvKgorICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyAqLworRVhURVJOIGNoYXJfdSBlX2Fib3J0W10JCUlOSVQoPU5fKCJFNDcwOiBDb21tYW5kIGFib3J0ZWQiKSk7CitFWFRFUk4gY2hhcl91IGVfYXJncmVxW10JSU5JVCg9Tl8oIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIikpOworRVhURVJOIGNoYXJfdSBlX2JhY2tzbGFzaFtdCUlOSVQoPU5fKCJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiKSk7CisjaWZkZWYgRkVBVF9DTURXSU4KK0VYVEVSTiBjaGFyX3UgZV9jbWR3aW5bXQlJTklUKD1OXygiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIpKTsKKyNlbmRpZgorRVhURVJOIGNoYXJfdSBlX2N1cmRpcltdCUlOSVQoPU5fKCJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giKSk7CisjaWZkZWYgRkVBVF9FVkFMCitFWFRFUk4gY2hhcl91IGVfZW5kaWZbXQkJSU5JVCg9Tl8oIkUxNzE6IE1pc3NpbmcgOmVuZGlmIikpOworRVhURVJOIGNoYXJfdSBlX2VuZHRyeVtdCUlOSVQoPU5fKCJFNjAwOiBNaXNzaW5nIDplbmR0cnkiKSk7CitFWFRFUk4gY2hhcl91IGVfZW5kd2hpbGVbXQlJTklUKD1OXygiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiKSk7CitFWFRFUk4gY2hhcl91IGVfd2hpbGVbXQkJSU5JVCg9Tl8oIkU1ODg6IDplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIpKTsKKyNlbmRpZgorRVhURVJOIGNoYXJfdSBlX2V4aXN0c1tdCUlOSVQoPU5fKCJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiKSk7CitFWFRFUk4gY2hhcl91IGVfZmFpbGVkW10JSU5JVCg9Tl8oIkU0NzI6IENvbW1hbmQgZmFpbGVkIikpOworI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoRkVBVF9YRk9OVFNFVCkKK0VYVEVSTiBjaGFyX3UgZV9mb250c2V0W10JSU5JVCg9Tl8oIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoTUFDT1MpIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikgfHwgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikKK0VYVEVSTiBjaGFyX3UgZV9mb250W10JCUlOSVQoPU5fKCJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIikpOworI2VuZGlmCisjaWYgKGRlZmluZWQoRkVBVF9HVUlfWDExKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKK0VYVEVSTiBjaGFyX3UgZV9mb250d2lkdGhbXQlJTklUKD1OXygiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIikpOworI2VuZGlmCitFWFRFUk4gY2hhcl91IGVfaW50ZXJuYWxbXQlJTklUKD1OXygiRTQ3MzogSW50ZXJuYWwgZXJyb3IiKSk7CitFWFRFUk4gY2hhcl91IGVfaW50ZXJyW10JSU5JVCg9Tl8oIkludGVycnVwdGVkIikpOworRVhURVJOIGNoYXJfdSBlX2ludmFkZHJbXQlJTklUKD1OXygiRTE0OiBJbnZhbGlkIGFkZHJlc3MiKSk7CitFWFRFUk4gY2hhcl91IGVfaW52YXJnW10JSU5JVCg9Tl8oIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiKSk7CitFWFRFUk4gY2hhcl91IGVfaW52YXJnMltdCUlOSVQoPU5fKCJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIpKTsKKyNpZmRlZiBGRUFUX0VWQUwKK0VYVEVSTiBjaGFyX3UgZV9pbnZleHByMltdCUlOSVQoPU5fKCJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9pbnZyYW5nZVtdCUlOSVQoPU5fKCJFMTY6IEludmFsaWQgcmFuZ2UiKSk7CitFWFRFUk4gY2hhcl91IGVfaW52Y21kW10JSU5JVCg9Tl8oIkU0NzY6IEludmFsaWQgY29tbWFuZCIpKTsKKyNpZmRlZiBVTklYCitFWFRFUk4gY2hhcl91IGVfaXNhZGlyMltdCUlOSVQoPU5fKCJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRVZBTAorRVhURVJOIGNoYXJfdSBlX2xldHVuZXhwW10JSU5JVCg9Tl8oIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJQkNBTEwKK0VYVEVSTiBjaGFyX3UgZV9saWJjYWxsW10JSU5JVCg9Tl8oIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIikpOworI2VuZGlmCisjaWYgZGVmaW5lZChEWU5BTUlDX1BFUkwpIHx8IGRlZmluZWQoRFlOQU1JQ19QWVRIT04pIHx8IGRlZmluZWQoRFlOQU1JQ19SVUJZKSBcCisJfHwgZGVmaW5lZChEWU5BTUlDX1RDTCkgfHwgZGVmaW5lZChEWU5BTUlDX0lDT05WKSBcCisJfHwgZGVmaW5lZChEWU5BTUlDX0dFVFRFWFQpCitFWFRFUk4gY2hhcl91IGVfbG9hZGxpYltdCUlOSVQoPU5fKCJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIikpOworRVhURVJOIGNoYXJfdSBlX2xvYWRmdW5jW10JSU5JVCg9Tl8oIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9tYXJraW52YWxbXQlJTklUKD1OXygiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIikpOworRVhURVJOIGNoYXJfdSBlX21hcmtub3RzZXRbXQlJTklUKD1OXygiRTIwOiBNYXJrIG5vdCBzZXQiKSk7CitFWFRFUk4gY2hhcl91IGVfbW9kaWZpYWJsZVtdCUlOSVQoPU5fKCJFMjE6IENhbm5vdCBtYWtlIGNoYW5nZXMsICdtb2RpZmlhYmxlJyBpcyBvZmYiKSk7CitFWFRFUk4gY2hhcl91IGVfbmVzdGluZ1tdCUlOSVQoPU5fKCJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIikpOworRVhURVJOIGNoYXJfdSBlX25vYWx0W10JCUlOSVQoPU5fKCJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIikpOworRVhURVJOIGNoYXJfdSBlX25vYWJicltdCUlOSVQoPU5fKCJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIikpOworRVhURVJOIGNoYXJfdSBlX25vYmFuZ1tdCUlOSVQoPU5fKCJFNDc3OiBObyAhIGFsbG93ZWQiKSk7CisjaWZuZGVmIEZFQVRfR1VJCitFWFRFUk4gY2hhcl91IGVfbm9ndmltW10JSU5JVCg9Tl8oIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiKSk7CisjZW5kaWYKKyNpZm5kZWYgRkVBVF9SSUdIVExFRlQKK0VYVEVSTiBjaGFyX3UgZV9ub2hlYnJld1tdCUlOSVQoPU5fKCJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7CisjZW5kaWYKKyNpZm5kZWYgRkVBVF9GS01BUAorRVhURVJOIGNoYXJfdSBlX25vZmFyc2lbXQlJTklUKD1OXygiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7CisjZW5kaWYKKyNpZm5kZWYgRkVBVF9BUkFCSUMKK0VYVEVSTiBjaGFyX3UgZV9ub2FyYWJpY1tdCUlOSVQoPU5fKCJFODAwOiBBcmFiaWMgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1NFQVJDSF9FWFRSQSkgfHwgZGVmaW5lZChGRUFUX1NZTl9ITCkKK0VYVEVSTiBjaGFyX3UgZV9ub2dyb3VwW10JSU5JVCg9Tl8oIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9ub2luc3RleHRbXQlJTklUKD1OXygiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIpKTsKK0VYVEVSTiBjaGFyX3UgZV9ub2xhc3RjbWRbXQlJTklUKD1OXygiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiKSk7CitFWFRFUk4gY2hhcl91IGVfbm9tYXBbXQkJSU5JVCg9Tl8oIkUzMTogTm8gc3VjaCBtYXBwaW5nIikpOworRVhURVJOIGNoYXJfdSBlX25vbWF0Y2hbXQlJTklUKD1OXygiRTQ3OTogTm8gbWF0Y2giKSk7CitFWFRFUk4gY2hhcl91IGVfbm9tYXRjaDJbXQlJTklUKD1OXygiRTQ4MDogTm8gbWF0Y2g6ICVzIikpOworRVhURVJOIGNoYXJfdSBlX25vbmFtZVtdCUlOSVQoPU5fKCJFMzI6IE5vIGZpbGUgbmFtZSIpKTsKK0VYVEVSTiBjaGFyX3UgZV9ub3ByZXN1YltdCUlOSVQoPU5fKCJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIikpOworRVhURVJOIGNoYXJfdSBlX25vcHJldltdCUlOSVQoPU5fKCJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiKSk7CitFWFRFUk4gY2hhcl91IGVfbm9wcmV2cmVbXQlJTklUKD1OXygiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iKSk7CitFWFRFUk4gY2hhcl91IGVfbm9yYW5nZVtdCUlOSVQoPU5fKCJFNDgxOiBObyByYW5nZSBhbGxvd2VkIikpOworI2lmZGVmIEZFQVRfV0lORE9XUworRVhURVJOIGNoYXJfdSBlX25vcm9vbVtdCUlOSVQoPU5fKCJFMzY6IE5vdCBlbm91Z2ggcm9vbSIpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCitFWFRFUk4gY2hhcl91IGVfbm9zZXJ2ZXJbXQlJTklUKD1OXygiRTI0Nzogbm8gcmVnaXN0ZXJlZCBzZXJ2ZXIgbmFtZWQgXCIlc1wiIikpOworI2VuZGlmCitFWFRFUk4gY2hhcl91IGVfbm90Y3JlYXRlW10JSU5JVCg9Tl8oIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIikpOworRVhURVJOIGNoYXJfdSBlX25vdG1wW10JCUlOSVQoPU5fKCJFNDgzOiBDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiKSk7CitFWFRFUk4gY2hhcl91IGVfbm90b3BlbltdCUlOSVQoPU5fKCJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiKSk7CitFWFRFUk4gY2hhcl91IGVfbm90cmVhZFtdCUlOSVQoPU5fKCJFNDg1OiBDYW4ndCByZWFkIGZpbGUgJXMiKSk7CitFWFRFUk4gY2hhcl91IGVfbm93cnRtc2dbXQlJTklUKD1OXygiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIikpOworRVhURVJOIGNoYXJfdSBlX251bGxbXQkJSU5JVCg9Tl8oIkUzODogTnVsbCBhcmd1bWVudCIpKTsKKyNpZmRlZiBGRUFUX0RJR1JBUEhTCitFWFRFUk4gY2hhcl91IGVfbnVtYmVyX2V4cFtdCUlOSVQoPU5fKCJFMzk6IE51bWJlciBleHBlY3RlZCIpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKK0VYVEVSTiBjaGFyX3UgZV9vcGVuZXJyZltdCUlOSVQoPU5fKCJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIikpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoRkVBVF9HVUlfWDExKQorRVhURVJOIGNoYXJfdSBlX29wZW5kaXNwW10JSU5JVCg9Tl8oIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9vdXRvZm1lbVtdCUlOSVQoPU5fKCJFNDE6IE91dCBvZiBtZW1vcnkhIikpOworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorRVhURVJOIGNoYXJfdSBlX3BhdG5vdGZbXQlJTklUKD1OXygiUGF0dGVybiBub3QgZm91bmQiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9wYXRub3RmMltdCUlOSVQoPU5fKCJFNDg2OiBQYXR0ZXJuIG5vdCBmb3VuZDogJXMiKSk7CitFWFRFUk4gY2hhcl91IGVfcG9zaXRpdmVbXQlJTklUKD1OXygiRTQ4NzogQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIpKTsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9TRVNTSU9OKQorRVhURVJOIGNoYXJfdSBlX3ByZXZfZGlyW10JSU5JVCg9Tl8oIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIpKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorRVhURVJOIGNoYXJfdSBlX3F1aWNrZml4W10JSU5JVCg9Tl8oIkU0MjogTm8gRXJyb3JzIikpOworI2VuZGlmCitFWFRFUk4gY2hhcl91IGVfcmVfZGFtZ1tdCUlOSVQoPU5fKCJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIikpOworRVhURVJOIGNoYXJfdSBlX3JlX2NvcnJbXQlJTklUKD1OXygiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iKSk7CitFWFRFUk4gY2hhcl91IGVfcmVhZG9ubHlbXQlJTklUKD1OXygiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIpKTsKKyNpZmRlZiBGRUFUX0VWQUwKK0VYVEVSTiBjaGFyX3UgZV9yZWFkb25seXZhcltdCUlOSVQoPU5fKCJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKK0VYVEVSTiBjaGFyX3UgZV9yZWFkZXJyZltdCUlOSVQoPU5fKCJFNDc6IEVycm9yIHdoaWxlIHJlYWRpbmcgZXJyb3JmaWxlIikpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TQU5EQk9YCitFWFRFUk4gY2hhcl91IGVfc2FuZGJveFtdCUlOSVQoPU5fKCJFNDg6IE5vdCBhbGxvd2VkIGluIHNhbmRib3giKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9zZWN1cmVbXQlJTklUKD1OXygiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIpKTsKKyNpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFJJU0NPUykgXAorCXx8IGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCitFWFRFUk4gY2hhcl91IGVfc2NyZWVubW9kZVtdCUlOSVQoPU5fKCJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiKSk7CisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV9zY3JvbGxbXQlJTklUKD1OXygiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIikpOworRVhURVJOIGNoYXJfdSBlX3NoZWxsZW1wdHlbXQlJTklUKD1OXygiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIpKTsKKyNpZiBkZWZpbmVkKEZFQVRfU0lHTl9JQ09OUykgJiYgIWRlZmluZWQoSEFWRV9HVEsyKQorRVhURVJOIGNoYXJfdSBlX3NpZ25kYXRhW10JSU5JVCg9Tl8oIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIpKTsKKyNlbmRpZgorRVhURVJOIGNoYXJfdSBlX3N3YXBjbG9zZVtdCUlOSVQoPU5fKCJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIpKTsKK0VYVEVSTiBjaGFyX3UgZV90YWdzdGFja1tdCUlOSVQoPU5fKCJFNzM6IHRhZyBzdGFjayBlbXB0eSIpKTsKK0VYVEVSTiBjaGFyX3UgZV90b29jb21wbFtdCUlOSVQoPU5fKCJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiKSk7CitFWFRFUk4gY2hhcl91IGVfbG9uZ25hbWVbXQlJTklUKD1OXygiRTc1OiBOYW1lIHRvbyBsb25nIikpOworRVhURVJOIGNoYXJfdSBlX3Rvb21zYnJhW10JSU5JVCg9Tl8oIkU3NjogVG9vIG1hbnkgWyIpKTsKK0VYVEVSTiBjaGFyX3UgZV90b29tYW55W10JSU5JVCg9Tl8oIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIpKTsKK0VYVEVSTiBjaGFyX3UgZV90cmFpbGluZ1tdCUlOSVQoPU5fKCJFNDg4OiBUcmFpbGluZyBjaGFyYWN0ZXJzIikpOworRVhURVJOIGNoYXJfdSBlX3VtYXJrW10JCUlOSVQoPU5fKCJFNzg6IFVua25vd24gbWFyayIpKTsKK0VYVEVSTiBjaGFyX3UgZV93aWxkZXhwYW5kW10JSU5JVCg9Tl8oIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiKSk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCitFWFRFUk4gY2hhcl91IGVfd2luaGVpZ2h0W10JSU5JVCg9Tl8oIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciKSk7CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCitFWFRFUk4gY2hhcl91IGVfd2lud2lkdGhbXQlJTklUKD1OXygiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciKSk7CisjIGVuZGlmCisjZW5kaWYKK0VYVEVSTiBjaGFyX3UgZV93cml0ZVtdCQlJTklUKD1OXygiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIikpOworRVhURVJOIGNoYXJfdSBlX3plcm9jb3VudFtdCUlOSVQoPU5fKCJaZXJvIGNvdW50IikpOworI2lmZGVmIEZFQVRfRVZBTAorRVhURVJOIGNoYXJfdSBlX3VzaW5nc2lkW10JSU5JVCg9Tl8oIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorRVhURVJOIGNoYXJfdSBlX2ludmV4cHJtc2dbXQlJTklUKD1OXygiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIikpOworI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCitFWFRFUk4gY2hhcl91IGVfZ3VhcmRlZFtdCUlOSVQoPU5fKCJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIpKTsKKyNlbmRpZgorI2lmZGVmIE1BQ09TX1hfVU5JWAorRVhURVJOIHNob3J0IGRpc2FsbG93X2d1aQlJTklUKD0gRkFMU0UpOworI2VuZGlmCisKKy8qCisgKiBDb21tcy4gd2l0aCB0aGUgc2Vzc2lvbiBtYW5hZ2VyIChYU01QKQorICovCisjaWZkZWYgVVNFX1hTTVAKK0VYVEVSTiBpbnQgeHNtcF9pY2VmZCBJTklUKD0gLTEpOyAgIC8qIFRoZSBhY3R1YWwgY29ubmVjdGlvbiAqLworI2VuZGlmCisKKy8qCisgKiBPcHRpb25hbCBGYXJzaSBzdXBwb3J0LiAgSW5jbHVkZSBpdCBoZXJlLCBzbyBFWFRFUk4gYW5kIElOSVQgYXJlIGRlZmluZWQuCisgKi8KKyNpZmRlZiBGRUFUX0ZLTUFQCisjIGluY2x1ZGUgImZhcnNpLmgiCisjZW5kaWYKKworLyoKKyAqIE9wdGlvbmFsIEFyYWJpYyBzdXBwb3J0LiBJbmNsdWRlIGl0IGhlcmUsIHNvIEVYVEVSTiBhbmQgSU5JVCBhcmUgZGVmaW5lZC4KKyAqLworI2lmZGVmIEZFQVRfQVJBQklDCisjIGluY2x1ZGUgImFyYWJpYy5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3VpLmMgYi9zcmMvZ3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmYTIyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWkuYwpAQCAtMCwwICsxLDQ3NDAgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCQlHVUkvTW90aWYgc3VwcG9ydCBieSBSb2JlcnQgV2ViYgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIGFsbCB0aGUgR1VJIGluZm9ybWF0aW9uICovCitndWlfVCBndWk7CisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKK3N0YXRpYyB2b2lkIHNldF9ndWlmb250d2lkZSBfX0FSR1MoKGNoYXJfdSAqZm9udF9uYW1lKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGd1aV9jaGVja19wb3MgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBndWlfcG9zaXRpb25fY29tcG9uZW50cyBfX0FSR1MoKGludCkpOworc3RhdGljIHZvaWQgZ3VpX291dHN0ciBfX0FSR1MoKGNoYXJfdSAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgZ3VpX3NjcmVlbmNoYXIgX19BUkdTKChpbnQgb2ZmLCBpbnQgZmxhZ3MsIGd1aWNvbG9yX1QgZmcsIGd1aWNvbG9yX1QgYmcsIGludCBiYWNrKSk7CisjaWZkZWYgSEFWRV9HVEsyCitzdGF0aWMgaW50IGd1aV9zY3JlZW5zdHIgX19BUkdTKChpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsIGd1aWNvbG9yX1QgZmcsIGd1aWNvbG9yX1QgYmcsIGludCBiYWNrKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGd1aV9kZWxldGVfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgY291bnQpKTsKK3N0YXRpYyB2b2lkIGd1aV9pbnNlcnRfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgY291bnQpKTsKK3N0YXRpYyB2b2lkIGZpbGxfbW91c2VfY29vcmQgX19BUkdTKChjaGFyX3UgKnAsIGludCBjb2wsIGludCByb3cpKTsKK3N0YXRpYyB2b2lkIGd1aV9kb19zY3JvbGxiYXIgX19BUkdTKCh3aW5fVCAqd3AsIGludCB3aGljaCwgaW50IGVuYWJsZSkpOworc3RhdGljIGNvbG5yX1Qgc2Nyb2xsX2xpbmVfbGVuIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworc3RhdGljIHZvaWQgZ3VpX3VwZGF0ZV9ob3Jpel9zY3JvbGxiYXIgX19BUkdTKChpbnQpKTsKK3N0YXRpYyB3aW5fVCAqeHkyd2luIF9fQVJHUygoaW50IHgsIGludCB5KSk7CisKK3N0YXRpYyBpbnQgY2FuX3VwZGF0ZV9jdXJzb3IgPSBUUlVFOyAvKiBjYW4gZGlzcGxheSB0aGUgY3Vyc29yICovCisKKy8qCisgKiBUaGUgQXRoZW5hIHNjcm9sbGJhcnMgY2FuIG1vdmUgdGhlIHRodW1iIHRvIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNjcm9sbGJhciwKKyAqIHRoaXMgbWFrZXMgdGhlIHRodW1iIGluZGljYXRlIHRoZSBwYXJ0IG9mIHRoZSB0ZXh0IHRoYXQgaXMgc2hvd24uICBNb3RpZgorICogY2FuJ3QgZG8gdGhpcy4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykKKyMgZGVmaW5lIFNDUk9MTF9QQVNUX0VORAorI2VuZGlmCisKKy8qCisgKiBndWlfc3RhcnQgLS0gQ2FsbGVkIHdoZW4gdXNlciB3YW50cyB0byBzdGFydCB0aGUgR1VJLgorICoKKyAqIENhcmVmdWw6IFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseSB3aGVuIHRoZXJlIGlzIGEgIjpndWkiCisgKiBjb21tYW5kIGluIHRoZSAuZ3ZpbXJjIGZpbGUuICBPbmx5IHRoZSBmaXJzdCBjYWxsIHNob3VsZCBmb3JrLCBub3QgdGhlCisgKiByZWN1cnNpdmUgY2FsbC4KKyAqLworICAgIHZvaWQKK2d1aV9zdGFydCgpCit7CisgICAgY2hhcl91CSpvbGRfdGVybTsKKyNpZiBkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKF9fQkVPU19fKSAmJiAhZGVmaW5lZChNQUNPU19YKQorIyBkZWZpbmUgTUFZX0ZPUksKKyAgICBpbnQJCWRvZm9yayA9IFRSVUU7CisjZW5kaWYKKyAgICBzdGF0aWMgaW50CXJlY3Vyc2l2ZSA9IDA7CisKKyAgICBvbGRfdGVybSA9IHZpbV9zdHJzYXZlKFRfTkFNRSk7CisKKyAgICAvKgorICAgICAqIFNldF90ZXJtbmFtZSgpIHdpbGwgY2FsbCBndWlfaW5pdCgpIHRvIHN0YXJ0IHRoZSBHVUkuCisgICAgICogU2V0IHRoZSAic3RhcnRpbmciIGZsYWcsIHRvIGluZGljYXRlIHRoYXQgdGhlIEdVSSB3aWxsIHN0YXJ0LgorICAgICAqCisgICAgICogV2UgZG9uJ3Qgd2FudCB0byBvcGVuIHRoZSBHVUkgc2hlbGwgdW50aWwgYWZ0ZXIgd2UndmUgcmVhZCAuZ3ZpbXJjLAorICAgICAqIG90aGVyd2lzZSB3ZSBkb24ndCBrbm93IHdoYXQgZm9udCB3ZSB3aWxsIHVzZSwgYW5kIGhlbmNlIHdlIGRvbid0IGtub3cKKyAgICAgKiB3aGF0IHNpemUgdGhlIHNoZWxsIHNob3VsZCBiZS4gIFNvIGlmIHRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIC5ndmltcmMKKyAgICAgKiBmaWxlLCB0aGV5IHdpbGwgaGF2ZSB0byBnbyB0byB0aGUgdGVybWluYWw6IFNldCBmdWxsX3NjcmVlbiB0byBGQUxTRS4KKyAgICAgKiBmdWxsX3NjcmVlbiB3aWxsIGJlIHNldCB0byBUUlVFIGFnYWluIGJ5IGEgc3VjY2Vzc2Z1bCB0ZXJtY2FwaW5pdCgpLgorICAgICAqLworICAgIHNldHRtb2RlKFRNT0RFX0NPT0spOwkJLyogc3RvcCBSQVcgbW9kZSAqLworICAgIGlmIChmdWxsX3NjcmVlbikKKwljdXJzb3Jfb24oKTsJCQkvKiBuZWVkZWQgZm9yICI6Z3VpIiBpbiAudmltcmMgKi8KKyAgICBndWkuc3RhcnRpbmcgPSBUUlVFOworICAgIGZ1bGxfc2NyZWVuID0gRkFMU0U7CisKKyNpZmRlZiBNQVlfRk9SSworICAgIGlmICghZ3VpLmRvZm9yayB8fCB2aW1fc3RyY2hyKHBfZ28sIEdPX0ZPUkcpIHx8IHJlY3Vyc2l2ZSkKKwlkb2ZvcmsgPSBGQUxTRTsKKyNlbmRpZgorICAgICsrcmVjdXJzaXZlOworCisgICAgdGVybWNhcGluaXQoKGNoYXJfdSAqKSJidWlsdGluX2d1aSIpOworICAgIGd1aS5zdGFydGluZyA9IHJlY3Vyc2l2ZSAtIDE7CisKKyAgICBpZiAoIWd1aS5pbl91c2UpCQkJLyogZmFpbGVkIHRvIHN0YXJ0IEdVSSAqLworICAgIHsKKwl0ZXJtY2FwaW5pdChvbGRfdGVybSk7CQkvKiBiYWNrIHRvIG9sZCB0ZXJtIHNldHRpbmdzICovCisJc2V0dG1vZGUoVE1PREVfUkFXKTsJCS8qIHJlc3RhcnQgUkFXIG1vZGUgKi8KKyNpZmRlZiBGRUFUX1RJVExFCisJc2V0X3RpdGxlX2RlZmF1bHRzKCk7CQkvKiBzZXQgJ3RpdGxlJyBhbmQgJ2ljb24nIGFnYWluICovCisjZW5kaWYKKyAgICB9CisKKyAgICB2aW1fZnJlZShvbGRfdGVybSk7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpCisgICAgaWYgKGd1aS5pbl91c2UpCisJLyogRGlzcGxheSBlcnJvciBtZXNzYWdlcyBpbiBhIGRpYWxvZyBub3cuICovCisJZGlzcGxheV9lcnJvcnMoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNQVlfRk9SSykgJiYgIWRlZmluZWQoX19RTlhOVE9fXykKKyAgICAvKgorICAgICAqIFF1aXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBhbmQgY29udGludWUgaW4gdGhlIGNoaWxkLgorICAgICAqIE1ha2VzICJndmltIGZpbGUiIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc2hlbGwgaXQgd2FzIHN0YXJ0ZWQgaW4uCisgICAgICogRG9uJ3QgZG8gdGhpcyB3aGVuIFZpbSB3YXMgc3RhcnRlZCB3aXRoICItZiIgb3IgdGhlICdmJyBmbGFnIGlzIHByZXNlbnQKKyAgICAgKiBpbiAnZ3Vpb3B0aW9ucycuCisgICAgICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgZG9mb3JrKQorICAgIHsKKwlpbnQJcGlwZWZkWzJdOwkvKiBwaXBlIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCAqLworCWludAlwaXBlX2Vycm9yOworCWNoYXIJZHVtbXk7CisJcGlkX3QJcGlkID0gLTE7CisKKwkvKiBTZXR1cCBhIHBpcGUgYmV0d2VlbiB0aGUgY2hpbGQgYW5kIHRoZSBwYXJlbnQsIHNvIHRoYXQgdGhlIHBhcmVudAorCSAqIGtub3dzIHdoZW4gdGhlIGNoaWxkIGhhcyBkb25lIHRoZSBzZXRzaWQoKSBjYWxsIGFuZCBpcyBhbGxvd2VkIHRvCisJICogZXhpdC4gKi8KKwlwaXBlX2Vycm9yID0gKHBpcGUocGlwZWZkKSA8IDApOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID4gMCkJICAgIC8qIFBhcmVudCAqLworCXsKKwkgICAgLyogR2l2ZSB0aGUgY2hpbGQgc29tZSB0aW1lIHRvIGRvIHRoZSBzZXRzaWQoKSwgb3RoZXJ3aXNlIHRoZQorCSAgICAgKiBleGl0KCkgbWF5IGtpbGwgdGhlIGNoaWxkIHRvbyAod2hlbiBzdGFydGluZyBndmltIGZyb20gaW5zaWRlIGEKKwkgICAgICogZ3ZpbSkuICovCisJICAgIGlmIChwaXBlX2Vycm9yKQorCQl1aV9kZWxheSgzMDBMLCBUUlVFKTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIFRoZSByZWFkIHJldHVybnMgd2hlbiB0aGUgY2hpbGQgY2xvc2VzIHRoZSBwaXBlIChvciB3aGVuCisJCSAqIHRoZSBjaGlsZCBkaWVzIGZvciBzb21lIHJlYXNvbikuICovCisJCWNsb3NlKHBpcGVmZFsxXSk7CisJCSh2b2lkKXJlYWQocGlwZWZkWzBdLCAmZHVtbXksIChzaXplX3QpMSk7CisJCWNsb3NlKHBpcGVmZFswXSk7CisJICAgIH0KKworCSAgICAvKiBXaGVuIHN3YXBwaW5nIHNjcmVlbnMgd2UgbWF5IG5lZWQgdG8gZ28gdG8gdGhlIG5leHQgbGluZSwgZS5nLiwKKwkgICAgICogYWZ0ZXIgYSBoaXQtZW50ZXIgcHJvbXB0IGFuZCB1c2luZyAiOmd1aSIuICovCisJICAgIGlmIChuZXdsaW5lX29uX2V4aXQpCisJCW1jaF9lcnJtc2coIlxyXG4iKTsKKworCSAgICAvKgorCSAgICAgKiBUaGUgcGFyZW50IG11c3Qgc2tpcCB0aGUgbm9ybWFsIGV4aXQoKSBwcm9jZXNzaW5nLCB0aGUgY2hpbGQKKwkgICAgICogd2lsbCBkbyBpdC4gIEZvciBleGFtcGxlLCBHVEsgbWVzc2VzIHVwIHNpZ25hbHMgd2hlbiBleGl0aW5nLgorCSAgICAgKi8KKwkgICAgX2V4aXQoMCk7CisJfQorCisjIGlmIGRlZmluZWQoSEFWRV9TRVRTSUQpIHx8IGRlZmluZWQoSEFWRV9TRVRQR0lEKQorCS8qCisJICogQ2hhbmdlIG91ciBwcm9jZXNzIGdyb3VwLiAgT24gc29tZSBzeXN0ZW1zL3NoZWxscyBhIENUUkwtQyBpbiB0aGUKKwkgKiBzaGVsbCB3aGVyZSBWaW0gd2FzIHN0YXJ0ZWQgd291bGQgb3RoZXJ3aXNlIGtpbGwgZ3ZpbSEKKwkgKi8KKwlpZiAocGlkID09IDApCSAgICAvKiBjaGlsZCAqLworIyAgaWYgZGVmaW5lZChIQVZFX1NFVFNJRCkKKwkgICAgKHZvaWQpc2V0c2lkKCk7CisjICBlbHNlCisJICAgICh2b2lkKXNldHBnaWQoMCwgMCk7CisjICBlbmRpZgorIyBlbmRpZgorCWlmICghcGlwZV9lcnJvcikKKwl7CisJICAgIGNsb3NlKHBpcGVmZFswXSk7CisJICAgIGNsb3NlKHBpcGVmZFsxXSk7CisJfQorCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfR05PTUUpICYmIGRlZmluZWQoRkVBVF9TRVNTSU9OKQorCS8qIFRlbGwgdGhlIHNlc3Npb24gbWFuYWdlciBvdXIgbmV3IFBJRCAqLworCWd1aV9tY2hfZm9ya2VkKCk7CisjIGVuZGlmCisgICAgfQorI2Vsc2UKKyMgaWYgZGVmaW5lZChfX1FOWE5UT19fKQorICAgIGlmIChndWkuaW5fdXNlICYmIGRvZm9yaykKKwlwcm9jbWdyX2RhZW1vbigwLCBQUk9DTUdSX0RBRU1PTl9LRUVQVU1BU0sgfCBQUk9DTUdSX0RBRU1PTl9OT0NIRElSIHwKKwkJUFJPQ01HUl9EQUVNT05fTk9DTE9TRSB8IFBST0NNR1JfREFFTU9OX05PREVWTlVMTCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIElmIHRoZSBHVUkgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHRyaWdnZXIgdGhlIEdVSUVudGVyIGV2ZW50ICovCisgICAgaWYgKGd1aS5pbl91c2UpCisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfR1VJRU5URVIsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworI2VuZGlmCisKKyAgICAtLXJlY3Vyc2l2ZTsKK30KKworLyoKKyAqIENhbGwgdGhpcyB3aGVuIHZpbSBzdGFydHMgdXAsIHdoZXRoZXIgb3Igbm90IHRoZSBHVUkgaXMgc3RhcnRlZAorICovCisgICAgdm9pZAorZ3VpX3ByZXBhcmUoYXJnYywgYXJndikKKyAgICBpbnQJICAgICphcmdjOworICAgIGNoYXIgICAgKiphcmd2OworeworICAgIGd1aS5pbl91c2UgPSBGQUxTRTsJCSAgICAvKiBObyBHVUkgeWV0IChtYXliZSBsYXRlcikgKi8KKyAgICBndWkuc3RhcnRpbmcgPSBGQUxTRTsJICAgIC8qIE5vIEdVSSB5ZXQgKG1heWJlIGxhdGVyKSAqLworICAgIGd1aV9tY2hfcHJlcGFyZShhcmdjLCBhcmd2KTsKK30KKworLyoKKyAqIFRyeSBpbml0aWFsaXppbmcgdGhlIEdVSSBhbmQgY2hlY2sgaWYgaXQgY2FuIGJlIHN0YXJ0ZWQuCisgKiBVc2VkIGZyb20gbWFpbigpIHRvIGNoZWNrIGVhcmx5IGlmICJ2aW0gLWciIGNhbiBzdGFydCB0aGUgR1VJLgorICogVXNlZCBmcm9tIGd1aV9pbml0KCkgdG8gcHJlcGFyZSBmb3Igc3RhcnRpbmcgdGhlIEdVSS4KKyAqIFJldHVybnMgRkFJTCBvciBPSy4KKyAqLworICAgIGludAorZ3VpX2luaXRfY2hlY2soKQoreworICAgIHN0YXRpYyBpbnQgcmVzdWx0ID0gTUFZQkU7CisKKyAgICBpZiAocmVzdWx0ICE9IE1BWUJFKQorICAgIHsKKwlpZiAocmVzdWx0ID09IEZBSUwpCisJICAgIEVNU0coXygiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiKSk7CisJcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBndWkuc2hlbGxfY3JlYXRlZCA9IEZBTFNFOworICAgIGd1aS5keWluZyA9IEZBTFNFOworICAgIGd1aS5pbl9mb2N1cyA9IFRSVUU7CQkvKiBzbyB0aGUgZ3VpY3Vyc29yIHNldHRpbmcgd29ya3MgKi8KKyAgICBndWkuZHJhZ2dlZF9zYiA9IFNCQVJfTk9ORTsKKyAgICBndWkuZHJhZ2dlZF93cCA9IE5VTEw7CisgICAgZ3VpLnBvaW50ZXJfaGlkZGVuID0gRkFMU0U7CisgICAgZ3VpLmNvbCA9IDA7CisgICAgZ3VpLnJvdyA9IDA7CisgICAgZ3VpLm51bV9jb2xzID0gQ29sdW1uczsKKyAgICBndWkubnVtX3Jvd3MgPSBSb3dzOworCisgICAgZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworICAgIGd1aS5zY3JvbGxfcmVnaW9uX3RvcCA9IDA7CisgICAgZ3VpLnNjcm9sbF9yZWdpb25fYm90ID0gUm93cyAtIDE7CisgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCA9IDA7CisgICAgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgPSBDb2x1bW5zIC0gMTsKKyAgICBndWkuaGlnaGxpZ2h0X21hc2sgPSBITF9OT1JNQUw7CisgICAgZ3VpLmNoYXJfd2lkdGggPSAxOworICAgIGd1aS5jaGFyX2hlaWdodCA9IDE7CisgICAgZ3VpLmNoYXJfYXNjZW50ID0gMDsKKyAgICBndWkuYm9yZGVyX3dpZHRoID0gMDsKKworICAgIGd1aS5ub3JtX2ZvbnQgPSBOT0ZPTlQ7CisjaWZuZGVmIEhBVkVfR1RLMgorICAgIGd1aS5ib2xkX2ZvbnQgPSBOT0ZPTlQ7CisgICAgZ3VpLml0YWxfZm9udCA9IE5PRk9OVDsKKyAgICBndWkuYm9sZGl0YWxfZm9udCA9IE5PRk9OVDsKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGd1aS5mb250c2V0ID0gTk9GT05UU0VUOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01FTlUKKyMgaWZuZGVmIEhBVkVfR1RLMgorIyAgaWZkZWYgRk9OVFNFVF9BTFdBWVMKKyAgICBndWkubWVudV9mb250c2V0ID0gTk9GT05UU0VUOworIyAgZWxzZQorICAgIGd1aS5tZW51X2ZvbnQgPSBOT0ZPTlQ7CisjICBlbmRpZgorIyBlbmRpZgorICAgIGd1aS5tZW51X2lzX2FjdGl2ZSA9IFRSVUU7CSAgICAvKiBkZWZhdWx0OiBpbmNsdWRlIG1lbnUgKi8KKyMgaWZuZGVmIEZFQVRfR1VJX0dUSworICAgIGd1aS5tZW51X2hlaWdodCA9IE1FTlVfREVGQVVMVF9IRUlHSFQ7CisgICAgZ3VpLm1lbnVfd2lkdGggPSAwOworIyBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmIChkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkpCisgICAgZ3VpLnRvb2xiYXJfaGVpZ2h0ID0gMDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9GT09URVIpICYmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpCisgICAgZ3VpLmZvb3Rlcl9oZWlnaHQgPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9CRVZBTF9USVAKKyAgICBndWkudG9vbHRpcF9mb250c2V0ID0gTk9GT05UU0VUOworI2VuZGlmCisKKyAgICBndWkuc2Nyb2xsYmFyX3dpZHRoID0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQgPSBTQl9ERUZBVUxUX1dJRFRIOworICAgIGd1aS5wcmV2X3dyYXAgPSAtMTsKKworI2lmZGVmIEFMV0FZU19VU0VfR1VJCisgICAgcmVzdWx0ID0gT0s7CisjZWxzZQorICAgIHJlc3VsdCA9IGd1aV9tY2hfaW5pdF9jaGVjaygpOworI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGwgd2hpY2ggc3RhcnRzIHRoZSBHVUkuCisgKi8KKyAgICB2b2lkCitndWlfaW5pdCgpCit7CisgICAgd2luX1QJKndwOworICAgIHN0YXRpYyBpbnQJcmVjdXJzaXZlID0gMDsKKworICAgIC8qCisgICAgICogSXQncyBwb3NzaWJsZSB0byB1c2UgIjpndWkiIGluIGEgLmd2aW1yYyBmaWxlLiAgVGhlIGZpcnN0IGhhbHZlIG9mIHRoaXMKKyAgICAgKiBmdW5jdGlvbiB3aWxsIHRoZW4gYmUgZXhlY3V0ZWQgYXQgdGhlIGZpcnN0IGNhbGwsIHRoZSByZXN0IGJ5IHRoZQorICAgICAqIHJlY3Vyc2l2ZSBjYWxsLiAgVGhpcyBhbGxvdyB0aGUgc2hlbGwgdG8gYmUgb3BlbmVkIGhhbGZ3YXkgcmVhZGluZyBhCisgICAgICogZ3ZpbXJjIGZpbGUuCisgICAgICovCisgICAgaWYgKCFyZWN1cnNpdmUpCisgICAgeworCSsrcmVjdXJzaXZlOworCisJY2xpcF9pbml0KFRSVUUpOworCisJLyogSWYgY2FuJ3QgaW5pdGlhbGl6ZSwgZG9uJ3QgdHJ5IGRvaW5nIHRoZSByZXN0ICovCisJaWYgKGd1aV9pbml0X2NoZWNrKCkgPT0gRkFJTCkKKwl7CisJICAgIC0tcmVjdXJzaXZlOworCSAgICBjbGlwX2luaXQoRkFMU0UpOworCSAgICByZXR1cm47CisJfQorCisJLyoKKwkgKiBTZXQgdXAgc3lzdGVtLXdpZGUgZGVmYXVsdCBtZW51cy4KKwkgKi8KKyNpZiBkZWZpbmVkKFNZU19NRU5VX0ZJTEUpICYmIGRlZmluZWQoRkVBVF9NRU5VKQorCWlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX05PU1lTTUVOVSkgPT0gTlVMTCkKKwl7CisJICAgIHN5c19tZW51ID0gVFJVRTsKKwkgICAgZG9fc291cmNlKChjaGFyX3UgKilTWVNfTUVOVV9GSUxFLCBGQUxTRSwgRkFMU0UpOworCSAgICBzeXNfbWVudSA9IEZBTFNFOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBTd2l0Y2ggb24gdGhlIG1vdXNlIGJ5IGRlZmF1bHQsIHVubGVzcyB0aGUgdXNlciBjaGFuZ2VkIGl0IGFscmVhZHkuCisJICogVGhpcyBjYW4gdGhlbiBiZSBjaGFuZ2VkIGluIHRoZSAuZ3ZpbXJjLgorCSAqLworCWlmICghb3B0aW9uX3dhc19zZXQoKGNoYXJfdSAqKSJtb3VzZSIpKQorCSAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJtb3VzZSIsIC0xLAorCQkJCQkJICAgICAoY2hhcl91ICopImEiLCBPUFRfRlJFRSk7CisKKwkvKgorCSAqIElmIC1VIG9wdGlvbiBnaXZlbiwgdXNlIG9ubHkgdGhlIGluaXRpYWxpemF0aW9ucyBmcm9tIHRoYXQgZmlsZSBhbmQKKwkgKiBub3RoaW5nIGVsc2UuICBTa2lwIGFsbCBpbml0aWFsaXphdGlvbnMgZm9yICItVSBOT05FIiBvciAiLXUgTk9SQyIuCisJICovCisJaWYgKHVzZV9ndmltcmMgIT0gTlVMTCkKKwl7CisJICAgIGlmIChTVFJDTVAodXNlX2d2aW1yYywgIk5PTkUiKSAhPSAwCisJCSAgICAmJiBTVFJDTVAodXNlX2d2aW1yYywgIk5PUkMiKSAhPSAwCisJCSAgICAmJiBkb19zb3VyY2UodXNlX2d2aW1yYywgRkFMU0UsIEZBTFNFKSAhPSBPSykKKwkJRU1TRzIoXygiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiKSwgdXNlX2d2aW1yYyk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIEdldCBzeXN0ZW0gd2lkZSBkZWZhdWx0cyBmb3IgZ3ZpbSwgb25seSB3aGVuIGZpbGUgbmFtZSBkZWZpbmVkLgorCSAgICAgKi8KKyNpZmRlZiBTWVNfR1ZJTVJDX0ZJTEUKKwkgICAgZG9fc291cmNlKChjaGFyX3UgKilTWVNfR1ZJTVJDX0ZJTEUsIEZBTFNFLCBGQUxTRSk7CisjZW5kaWYKKworCSAgICAvKgorCSAgICAgKiBUcnkgdG8gcmVhZCBHVUkgaW5pdGlhbGl6YXRpb24gY29tbWFuZHMgZnJvbSB0aGUgZm9sbG93aW5nCisJICAgICAqIHBsYWNlczoKKwkgICAgICogLSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHVklNSU5JVAorCSAgICAgKiAtIHRoZSB1c2VyIGd2aW1yYyBmaWxlICh+Ly5ndmltcmMpCisJICAgICAqIC0gdGhlIHNlY29uZCB1c2VyIGd2aW1yYyBmaWxlICgkVklNLy5ndmltcmMgZm9yIERvcykKKwkgICAgICogLSB0aGUgdGhpcmQgdXNlciBndmltcmMgZmlsZSAoJFZJTS8uZ3ZpbXJjIGZvciBBbWlnYSkKKwkgICAgICogVGhlIGZpcnN0IHRoYXQgZXhpc3RzIGlzIHVzZWQsIHRoZSByZXN0IGlzIGlnbm9yZWQuCisJICAgICAqLworCSAgICBpZiAocHJvY2Vzc19lbnYoKGNoYXJfdSAqKSJHVklNSU5JVCIsIEZBTFNFKSA9PSBGQUlMCisJCSAmJiBkb19zb3VyY2UoKGNoYXJfdSAqKVVTUl9HVklNUkNfRklMRSwgVFJVRSwgRkFMU0UpID09IEZBSUwKKyNpZmRlZiBVU1JfR1ZJTVJDX0ZJTEUyCisJCSAmJiBkb19zb3VyY2UoKGNoYXJfdSAqKVVTUl9HVklNUkNfRklMRTIsIFRSVUUsIEZBTFNFKSA9PSBGQUlMCisjZW5kaWYKKwkJCQkpCisJICAgIHsKKyNpZmRlZiBVU1JfR1ZJTVJDX0ZJTEUzCisJCSh2b2lkKWRvX3NvdXJjZSgoY2hhcl91ICopVVNSX0dWSU1SQ19GSUxFMywgVFJVRSwgRkFMU0UpOworI2VuZGlmCisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBSZWFkIGluaXRpYWxpemF0aW9uIGNvbW1hbmRzIGZyb20gIi5ndmltcmMiIGluIGN1cnJlbnQKKwkgICAgICogZGlyZWN0b3J5LiAgVGhpcyBpcyBvbmx5IGRvbmUgaWYgdGhlICdleHJjJyBvcHRpb24gaXMgc2V0LgorCSAgICAgKiBCZWNhdXNlIG9mIHNlY3VyaXR5IHJlYXNvbnMgd2UgZGlzYWxsb3cgc2hlbGwgYW5kIHdyaXRlCisJICAgICAqIGNvbW1hbmRzIG5vdywgZXhjZXB0IGZvciB1bml4IGlmIHRoZSBmaWxlIGlzIG93bmVkIGJ5IHRoZSB1c2VyCisJICAgICAqIG9yICdzZWN1cmUnIG9wdGlvbiBoYXMgYmVlbiByZXNldCBpbiBlbnZpcm9ubWVudCBvZiBnbG9iYWwKKwkgICAgICogIi5ndmltcmMiLgorCSAgICAgKiBPbmx5IGRvIHRoaXMgaWYgR1ZJTVJDX0ZJTEUgaXMgbm90IHRoZSBzYW1lIGFzIFVTUl9HVklNUkNfRklMRSwKKwkgICAgICogVVNSX0dWSU1SQ19GSUxFMiwgVVNSX0dWSU1SQ19GSUxFMyBvciBTWVNfR1ZJTVJDX0ZJTEUuCisJICAgICAqLworCSAgICBpZiAocF9leHJjKQorCSAgICB7CisjaWZkZWYgVU5JWAorCQl7CisJCSAgICBzdHJ1Y3Qgc3RhdCBzOworCisJCSAgICAvKiBpZiAiLmd2aW1yYyIgZmlsZSBpcyBub3Qgb3duZWQgYnkgdXNlciwgc2V0ICdzZWN1cmUnCisJCSAgICAgKiBtb2RlICovCisJCSAgICBpZiAobWNoX3N0YXQoR1ZJTVJDX0ZJTEUsICZzKSB8fCBzLnN0X3VpZCAhPSBnZXR1aWQoKSkKKwkJCXNlY3VyZSA9IHBfc2VjdXJlOworCQl9CisjZWxzZQorCQlzZWN1cmUgPSBwX3NlY3VyZTsKKyNlbmRpZgorCisJCWlmICggICAgICAgZnVsbHBhdGhjbXAoKGNoYXJfdSAqKVVTUl9HVklNUkNfRklMRSwKKwkJCQkgICAgIChjaGFyX3UgKilHVklNUkNfRklMRSwgRkFMU0UpICE9IEZQQ19TQU1FCisjaWZkZWYgU1lTX0dWSU1SQ19GSUxFCisJCQkmJiBmdWxscGF0aGNtcCgoY2hhcl91ICopU1lTX0dWSU1SQ19GSUxFLAorCQkJCSAgICAgKGNoYXJfdSAqKUdWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKKyNlbmRpZgorI2lmZGVmIFVTUl9HVklNUkNfRklMRTIKKwkJCSYmIGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfR1ZJTVJDX0ZJTEUyLAorCQkJCSAgICAgKGNoYXJfdSAqKUdWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKKyNlbmRpZgorI2lmZGVmIFVTUl9HVklNUkNfRklMRTMKKwkJCSYmIGZ1bGxwYXRoY21wKChjaGFyX3UgKilVU1JfR1ZJTVJDX0ZJTEUzLAorCQkJCSAgICAgKGNoYXJfdSAqKUdWSU1SQ19GSUxFLCBGQUxTRSkgIT0gRlBDX1NBTUUKKyNlbmRpZgorCQkJKQorCQkgICAgZG9fc291cmNlKChjaGFyX3UgKilHVklNUkNfRklMRSwgVFJVRSwgRkFMU0UpOworCisJCWlmIChzZWN1cmUgPT0gMikKKwkJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBUUlVFOworCQlzZWN1cmUgPSAwOworCSAgICB9CisJfQorCisJaWYgKG5lZWRfd2FpdF9yZXR1cm4gfHwgbXNnX2RpZGFueSkKKwkgICAgd2FpdF9yZXR1cm4oVFJVRSk7CisKKwktLXJlY3Vyc2l2ZTsKKyAgICB9CisKKyAgICAvKiBJZiByZWN1cnNpdmUgY2FsbCBvcGVuZWQgdGhlIHNoZWxsLCByZXR1cm4gaGVyZSBmcm9tIHRoZSBmaXJzdCBjYWxsICovCisgICAgaWYgKGd1aS5pbl91c2UpCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIEdVSSBzaGVsbC4KKyAgICAgKi8KKyAgICBndWkuaW5fdXNlID0gVFJVRTsJCS8qIE11c3QgYmUgc2V0IGFmdGVyIG1lbnVzIGhhdmUgYmVlbiBzZXQgdXAgKi8KKyAgICBpZiAoZ3VpX21jaF9pbml0KCkgPT0gRkFJTCkKKwlnb3RvIGVycm9yOworCisgICAgLyogQXZvaWQgYSBkZWxheSBmb3IgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHdhcyBwcmludGVkIGluIHRoZSB0ZXJtaW5hbAorICAgICAqIHdoZXJlIFZpbSB3YXMgc3RhcnRlZC4gKi8KKyAgICBlbXNnX29uX2Rpc3BsYXkgPSBGQUxTRTsKKyAgICBtc2dfc2Nyb2xsZWQgPSAwOworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfZGlkYW55ID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkaXR5IG9mIGFueSBnZW5lcmljIHJlc291cmNlcyB0aGF0IG1heSBoYXZlIGJlZW4gbG9hZGVkLgorICAgICAqLworICAgIGlmIChndWkuYm9yZGVyX3dpZHRoIDwgMCkKKwlndWkuYm9yZGVyX3dpZHRoID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHVwIHRoZSBmb250cy4gIEZpcnN0IHVzZSBhIGZvbnQgc3BlY2lmaWVkIHdpdGggIi1mbiIgb3IgIi1mb250Ii4KKyAgICAgKi8KKyAgICBpZiAoZm9udF9hcmd1bWVudCAhPSBOVUxMKQorCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJnZm4iLCAwTCwgKGNoYXJfdSAqKWZvbnRfYXJndW1lbnQsIDApOworICAgIGlmICgKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJICAgICgqcF9ndWlmb250c2V0ID09IE5VTAorCSAgICAgfHwgZ3VpX2luaXRfZm9udChwX2d1aWZvbnRzZXQsIFRSVUUpID09IEZBSUwpICYmCisjZW5kaWYKKwkgICAgZ3VpX2luaXRfZm9udCgqcF9ndWlmb250ID09IE5VTCA/IGhsX2dldF9mb250X25hbWUoKQorCQkJCQkJICA6IHBfZ3VpZm9udCwgRkFMU0UpID09IEZBSUwpCisgICAgeworCUVNU0coXygiRTY2NTogQ2Fubm90IHN0YXJ0IEdVSSwgbm8gdmFsaWQgZm9udCBmb3VuZCIpKTsKKwlnb3RvIGVycm9yMjsKKyAgICB9CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChndWlfZ2V0X3dpZGVfZm9udCgpID09IEZBSUwpCisJRU1TRyhfKCJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiKSk7CisjZW5kaWYKKworICAgIGd1aS5udW1fY29scyA9IENvbHVtbnM7CisgICAgZ3VpLm51bV9yb3dzID0gUm93czsKKyAgICBndWlfcmVzZXRfc2Nyb2xsX3JlZ2lvbigpOworCisgICAgLyogQ3JlYXRlIGluaXRpYWwgc2Nyb2xsYmFycyAqLworICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKyAgICB7CisJZ3VpX2NyZWF0ZV9zY3JvbGxiYXIoJndwLT53X3Njcm9sbGJhcnNbU0JBUl9MRUZUXSwgU0JBUl9MRUZULCB3cCk7CisJZ3VpX2NyZWF0ZV9zY3JvbGxiYXIoJndwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0sIFNCQVJfUklHSFQsIHdwKTsKKyAgICB9CisgICAgZ3VpX2NyZWF0ZV9zY3JvbGxiYXIoJmd1aS5ib3R0b21fc2JhciwgU0JBUl9CT1RUT00sIE5VTEwpOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgZ3VpX2NyZWF0ZV9pbml0aWFsX21lbnVzKHJvb3RfbWVudSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorICAgIGlmICh1c2luZ1N1bldvcmtTaG9wKQorCXdvcmtzaG9wX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0lHTl9JQ09OUworICAgIHNpZ25fZ3VpX3N0YXJ0ZWQoKTsKKyNlbmRpZgorCisgICAgLyogQ29uZmlndXJlIHRoZSBkZXNpcmVkIG1lbnUgYW5kIHNjcm9sbGJhcnMgKi8KKyAgICBndWlfaW5pdF93aGljaF9jb21wb25lbnRzKE5VTEwpOworCisgICAgLyogQWxsIGNvbXBvbmVudHMgb2YgdGhlIEdVSSBoYXZlIGJlZW4gY3JlYXRlZCBub3cgKi8KKyAgICBndWkuc2hlbGxfY3JlYXRlZCA9IFRSVUU7CisKKyNpZm5kZWYgRkVBVF9HVUlfR1RLCisgICAgLyogU2V0IHRoZSBzaGVsbCBzaXplLCBhZGp1c3RlZCBmb3IgdGhlIHNjcmVlbiBzaXplLiAgRm9yIEdUSyB0aGlzIG9ubHkKKyAgICAgKiB3b3JrcyBhZnRlciB0aGUgc2hlbGwgaGFzIGJlZW4gb3BlbmVkLCB0aHVzIGl0IGlzIGZ1cnRoZXIgZG93bi4gKi8KKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgVFJVRSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkKKyAgICAvKiBOZWVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgbWVudWJhciBhZnRlciBhbGwgdGhlIG1lbnVzIGhhdmUgYmVlbgorICAgICAqIGNyZWF0ZWQuICovCisgICAgZ3VpX21jaF9jb21wdXRlX21lbnVfaGVpZ2h0KChXaWRnZXQpMCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogQWN0dWFsbHkgb3BlbiB0aGUgR1VJIHNoZWxsLgorICAgICAqLworICAgIGlmIChndWlfbWNoX29wZW4oKSAhPSBGQUlMKQorICAgIHsKKyNpZmRlZiBGRUFUX1RJVExFCisJbWFrZXRpdGxlKCk7CisJcmVzZXR0aXRsZSgpOworI2VuZGlmCisJaW5pdF9ndWlfb3B0aW9ucygpOworI2lmZGVmIEZFQVRfQVJBQklDCisJLyogT3VyIEdVSSBjYW4ndCBkbyBiaWRpLiAqLworCXBfdGJpZGkgPSBGQUxTRTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX0dUSworCS8qIEdpdmUgR1RLKyBhIGNoYW5jZSB0byBwdXQgYWxsIHdpZGdldCdzIGludG8gcGxhY2UuICovCisJZ3VpX21jaF91cGRhdGUoKTsKKwkvKiBOb3cgbWFrZSBzdXJlIHRoZSBzaGVsbCBmaXRzIG9uIHRoZSBzY3JlZW4uICovCisJZ3VpX3NldF9zaGVsbHNpemUoRkFMU0UsIFRSVUUpOworI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJaWYgKHN0YXJ0aW5nID09IDAgJiYgdXNpbmdOZXRiZWFucykKKwkgICAgLyogVGVsbCB0aGUgY2xpZW50IHRoYXQgaXQgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMuICovCisJICAgIG5ldGJlYW5zX3N0YXJ0dXBfZG9uZSgpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspCisJaWYgKCFpbV94aW1faXN2YWxpZF9pbWFjdGl2YXRlKCkpCisJICAgIEVNU0coXygiRTU5OTogVmFsdWUgb2YgJ2ltYWN0aXZhdGVrZXknIGlzIGludmFsaWQiKSk7CisjZW5kaWYKKworCXJldHVybjsKKyAgICB9CisKK2Vycm9yMjoKKyNpZmRlZiBGRUFUX0dVSV9YMTEKKyAgICAvKiB1bmRvIGd1aV9tY2hfaW5pdCgpICovCisgICAgZ3VpX21jaF91bmluaXQoKTsKKyNlbmRpZgorCitlcnJvcjoKKyAgICBndWkuaW5fdXNlID0gRkFMU0U7CisgICAgY2xpcF9pbml0KEZBTFNFKTsKK30KKworCisgICAgdm9pZAorZ3VpX2V4aXQocmMpCisgICAgaW50CQlyYzsKK3sKKyNpZm5kZWYgX19CRU9TX18KKyAgICAvKiBkb24ndCBmcmVlIHRoZSBmb250cywgaXQgbGVhZHMgdG8gYSBCVVMgZXJyb3IKKyAgICAgKiByaWNoYXJkQHdoaXRlcXVlZW4uY29tIEp1bCA5OSAqLworICAgIGZyZWVfaGlnaGxpZ2h0X2ZvbnRzKCk7CisjZW5kaWYKKyAgICBndWkuaW5fdXNlID0gRkFMU0U7CisgICAgZ3VpX21jaF9leGl0KHJjKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgXAorCXx8IGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgR1VJIHNoZWxsIGlzIGNsb3NlZCBieSB0aGUgdXNlci4gIElmIHRoZXJlIGFyZSBubyBjaGFuZ2VkCisgKiBmaWxlcyBWaW0gZXhpdHMsIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEgZGlhbG9nIHRvIGFzayB0aGUgdXNlciB3aGF0IHRvCisgKiBkby4KKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCBWaW0gc2hvdWxkIE5PVCBleGl0IQorICovCisgICAgdm9pZAorZ3VpX3NoZWxsX2Nsb3NlZCgpCit7CisgICAgY21kbW9kX1QJICAgIHNhdmVfY21kbW9kOworCisgICAgc2F2ZV9jbWRtb2QgPSBjbWRtb2Q7CisKKyAgICAvKiBPbmx5IGV4aXQgd2hlbiB0aGVyZSBhcmUgbm8gY2hhbmdlZCBmaWxlcyAqLworICAgIGV4aXRpbmcgPSBUUlVFOworIyBpZmRlZiBGRUFUX0JST1dTRQorICAgIGNtZG1vZC5icm93c2UgPSBUUlVFOworIyBlbmRpZgorIyBpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisgICAgY21kbW9kLmNvbmZpcm0gPSBUUlVFOworIyBlbmRpZgorICAgIC8qIElmIHRoZXJlIGFyZSBjaGFuZ2VkIGJ1ZmZlcnMsIHByZXNlbnQgdGhlIHVzZXIgd2l0aCBhIGRpYWxvZyBpZgorICAgICAqIHBvc3NpYmxlLCBvdGhlcndpc2UgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLiAqLworICAgIGlmICghY2hlY2tfY2hhbmdlZF9hbnkoRkFMU0UpKQorCWdldG91dCgwKTsKKworICAgIGV4aXRpbmcgPSBGQUxTRTsKKyAgICBjbWRtb2QgPSBzYXZlX2NtZG1vZDsKKyAgICBzZXRjdXJzb3IoKTsJCS8qIHBvc2l0aW9uIGN1cnNvciAqLworICAgIG91dF9mbHVzaCgpOworfQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIGZvbnQuICAiZm9udF9saXN0IiBpcyBhIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZm9udCBuYW1lcy4gIFRoZQorICogZmlyc3QgZm9udCBuYW1lIHRoYXQgd29ya3MgaXMgdXNlZC4gIElmIG5vbmUgaXMgZm91bmQsIHVzZSB0aGUgZGVmYXVsdAorICogZm9udC4KKyAqIElmICJmb250c2V0IiBpcyBUUlVFLCB0aGUgImZvbnRfbGlzdCIgaXMgdXNlZCBhcyBvbmUgbmFtZSBmb3IgdGhlIGZvbnRzZXQuCisgKiBSZXR1cm4gT0sgd2hlbiBhYmxlIHRvIHNldCB0aGUgZm9udC4gIFdoZW4gaXQgZmFpbGVkIEZBSUwgaXMgcmV0dXJuZWQgYW5kCisgKiB0aGUgZm9udHMgYXJlIHVuY2hhbmdlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgaW50CitndWlfaW5pdF9mb250KGZvbnRfbGlzdCwgZm9udHNldCkKKyAgICBjaGFyX3UJKmZvbnRfbGlzdDsKKyAgICBpbnQJCWZvbnRzZXQ7Cit7CisjZGVmaW5lIEZPTlRMRU4gMzIwCisgICAgY2hhcl91CWZvbnRfbmFtZVtGT05UTEVOXTsKKyAgICBpbnQJCWZvbnRfbGlzdF9lbXB0eSA9IEZBTFNFOworICAgIGludAkJcmV0ID0gRkFJTDsKKworICAgIGlmICghZ3VpLmluX3VzZSkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZvbnRfbmFtZVswXSA9IE5VTDsKKyAgICBpZiAoKmZvbnRfbGlzdCA9PSBOVUwpCisJZm9udF9saXN0X2VtcHR5ID0gVFJVRTsKKyAgICBlbHNlCisgICAgeworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKwkvKiBXaGVuIHVzaW5nIGEgZm9udHNldCwgdGhlIHdob2xlIGxpc3Qgb2YgZm9udHMgaXMgb25lIG5hbWUuICovCisJaWYgKGZvbnRzZXQpCisJICAgIHJldCA9IGd1aV9tY2hfaW5pdF9mb250KGZvbnRfbGlzdCwgVFJVRSk7CisJZWxzZQorI2VuZGlmCisJICAgIHdoaWxlICgqZm9udF9saXN0ICE9IE5VTCkKKwkgICAgeworCQkvKiBJc29sYXRlIG9uZSBjb21tYSBzZXBhcmF0ZWQgZm9udCBuYW1lLiAqLworCQkodm9pZCljb3B5X29wdGlvbl9wYXJ0KCZmb250X2xpc3QsIGZvbnRfbmFtZSwgRk9OVExFTiwgIiwiKTsKKworCQkvKiBDYXJlZnVsISEhICBUaGUgV2luMzIgdmVyc2lvbiBvZiBndWlfbWNoX2luaXRfZm9udCgpLCB3aGVuCisJCSAqIGNhbGxlZCB3aXRoICIqIiB3aWxsIGNoYW5nZSBwX2d1aWZvbnQgdG8gdGhlIHNlbGVjdGVkIGZvbnQKKwkJICogbmFtZSwgd2hpY2ggZnJlZXMgdGhlIG9sZCB2YWx1ZS4gIFRoaXMgbWFrZXMgZm9udF9saXN0CisJCSAqIGludmFsaWQuICBUaHVzIHdoZW4gT0sgaXMgcmV0dXJuZWQgaGVyZSwgZm9udF9saXN0IG11c3Qgbm8KKwkJICogbG9uZ2VyIGJlIHVzZWQhICovCisJCWlmIChndWlfbWNoX2luaXRfZm9udChmb250X25hbWUsIEZBTFNFKSA9PSBPSykKKwkJeworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgIWRlZmluZWQoSEFWRV9HVEsyKQorCQkgICAgLyogSWYgaXQncyBhIFVuaWNvZGUgZm9udCwgdHJ5IHNldHRpbmcgJ2d1aWZvbnR3aWRlJyB0byBhCisJCSAgICAgKiBzaW1pbGFyIGRvdWJsZS13aWR0aCBmb250LiAqLworCQkgICAgaWYgKChwX2d1aWZvbnR3aWRlID09IE5VTEwgfHwgKnBfZ3VpZm9udHdpZGUgPT0gTlVMKQorCQkJCSYmIHN0cnN0cigoY2hhciAqKWZvbnRfbmFtZSwgIjEwNjQ2IikgIT0gTlVMTCkKKwkJCXNldF9ndWlmb250d2lkZShmb250X25hbWUpOworI2VuZGlmCisJCSAgICByZXQgPSBPSzsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0ICE9IE9LCisJICAgICYmIFNUUkNNUChmb250X2xpc3QsICIqIikgIT0gMAorCSAgICAmJiAoZm9udF9saXN0X2VtcHR5IHx8IGd1aS5ub3JtX2ZvbnQgPT0gTk9GT05UKSkKKyAgICB7CisJLyoKKwkgKiBDb3VsZG4ndCBsb2FkIGFueSBmb250IGluICdmb250X2xpc3QnLCBrZWVwIHRoZSBjdXJyZW50IGZvbnQgaWYKKwkgKiB0aGVyZSBpcyBvbmUuICBJZiAnZm9udF9saXN0JyBpcyBlbXB0eSwgb3IgaWYgdGhlcmUgaXMgbm8gY3VycmVudAorCSAqIGZvbnQsIHRlbGwgZ3VpX21jaF9pbml0X2ZvbnQoKSB0byB0cnkgdG8gZmluZCBhIGZvbnQgd2UgY2FuIGxvYWQuCisJICovCisJcmV0ID0gZ3VpX21jaF9pbml0X2ZvbnQoTlVMTCwgRkFMU0UpOworICAgIH0KKworICAgIGlmIChyZXQgPT0gT0spCisgICAgeworI2lmbmRlZiBIQVZFX0dUSzIKKwkvKiBTZXQgbm9ybWFsIGZvbnQgYXMgY3VycmVudCBmb250ICovCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlpZiAoZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUKQorCSAgICBndWlfbWNoX3NldF9mb250c2V0KGd1aS5mb250c2V0KTsKKwllbHNlCisjIGVuZGlmCisJICAgIGd1aV9tY2hfc2V0X2ZvbnQoZ3VpLm5vcm1fZm9udCk7CisjZW5kaWYKKwlndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwKKyNpZmRlZiBNU1dJTgorCQlUUlVFCisjZWxzZQorCQlGQUxTRQorI2VuZGlmCisJCSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKKyMgaWZuZGVmIEhBVkVfR1RLMgorLyoKKyAqIFRyeSBzZXR0aW5nICdndWlmb250d2lkZScgdG8gYSBmb250IHR3aWNlIGFzIHdpZGUgYXMgIm5hbWUiLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9ndWlmb250d2lkZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBpbnQJCWkgPSAwOworICAgIGNoYXJfdQl3aWRlX25hbWVbRk9OVExFTiArIDEwXTsgLyogcm9vbSBmb3IgMiAqIHdpZHRoIGFuZCAnKicgKi8KKyAgICBjaGFyX3UJKndwID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisgICAgR3VpRm9udAlmb250OworCisgICAgd3AgPSB3aWRlX25hbWU7CisgICAgZm9yIChwID0gbmFtZTsgKnAgIT0gTlVMOyArK3ApCisgICAgeworCSp3cCsrID0gKnA7CisJaWYgKCpwID09ICctJykKKwl7CisJICAgICsraTsKKwkgICAgaWYgKGkgPT0gNikJCS8qIGZvbnQgdHlwZTogY2hhbmdlICItLSIgdG8gIi0qLSIgKi8KKwkgICAgeworCQlpZiAocFsxXSA9PSAnLScpCisJCSAgICAqd3ArKyA9ICcqJzsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpID09IDEyKQkvKiBmb3VuZCB0aGUgd2lkdGggKi8KKwkgICAgeworCQkrK3A7CisJCWkgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoaSAhPSAwKQorCQl7CisJCSAgICAvKiBEb3VibGUgdGhlIHdpZHRoIHNwZWNpZmljYXRpb24uICovCisJCSAgICBzcHJpbnRmKChjaGFyICopd3AsICIlZCVzIiwgaSAqIDIsIHApOworCQkgICAgZm9udCA9IGd1aV9tY2hfZ2V0X2ZvbnQod2lkZV9uYW1lLCBGQUxTRSk7CisJCSAgICBpZiAoZm9udCAhPSBOT0ZPTlQpCisJCSAgICB7CisJCQlndWkud2lkZV9mb250ID0gZm9udDsKKwkJCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImdmdyIsIC0xLAorCQkJCQkJCSB3aWRlX25hbWUsIE9QVF9GUkVFKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisjIGVuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworLyoKKyAqIEdldCB0aGUgZm9udCBmb3IgJ2d1aWZvbnR3aWRlJy4KKyAqIFJldHVybiBGQUlMIGZvciBhbiBpbnZhbGlkIGZvbnQgbmFtZS4KKyAqLworICAgIGludAorZ3VpX2dldF93aWRlX2ZvbnQoKQoreworICAgIEd1aUZvbnQJZm9udCA9IE5PRk9OVDsKKyAgICBjaGFyX3UJZm9udF9uYW1lW0ZPTlRMRU5dOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmICghZ3VpLmluX3VzZSkJICAgIC8qIENhbid0IGFsbG9jYXRlIGZvbnQgeWV0LCBhc3N1bWUgaXQncyBPSy4gKi8KKwlyZXR1cm4gT0s7CSAgICAvKiBXaWxsIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBsYXRlci4gKi8KKworICAgIGlmIChwX2d1aWZvbnR3aWRlICE9IE5VTEwgJiYgKnBfZ3VpZm9udHdpZGUgIT0gTlVMKQorICAgIHsKKwlmb3IgKHAgPSBwX2d1aWZvbnR3aWRlOyAqcCAhPSBOVUw7ICkKKwl7CisJICAgIC8qIElzb2xhdGUgb25lIGNvbW1hIHNlcGFyYXRlZCBmb250IG5hbWUuICovCisJICAgICh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJnAsIGZvbnRfbmFtZSwgRk9OVExFTiwgIiwiKTsKKwkgICAgZm9udCA9IGd1aV9tY2hfZ2V0X2ZvbnQoZm9udF9uYW1lLCBGQUxTRSk7CisJICAgIGlmIChmb250ICE9IE5PRk9OVCkKKwkJYnJlYWs7CisJfQorCWlmIChmb250ID09IE5PRk9OVCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLndpZGVfZm9udCk7CisjaWZkZWYgSEFWRV9HVEsyCisgICAgLyogQXZvaWQgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQgaWYgJ2d1aWZvbnR3aWRlJyBpcyBlcXVhbCB0byAnZ3VpZm9udCcuICovCisgICAgaWYgKGZvbnQgIT0gTk9GT05UICYmIGd1aS5ub3JtX2ZvbnQgIT0gTk9GT05UCisJCQkgJiYgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9lcXVhbChmb250LCBndWkubm9ybV9mb250KSkKKyAgICB7CisJZ3VpLndpZGVfZm9udCA9IE5PRk9OVDsKKwlndWlfbWNoX2ZyZWVfZm9udChmb250KTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJZ3VpLndpZGVfZm9udCA9IGZvbnQ7CisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyAgICB2b2lkCitndWlfc2V0X2N1cnNvcihyb3csIGNvbCkKKyAgICBpbnQJICAgIHJvdzsKKyAgICBpbnQJICAgIGNvbDsKK3sKKyAgICBndWkucm93ID0gcm93OworICAgIGd1aS5jb2wgPSBjb2w7Cit9CisKKy8qCisgKiBndWlfY2hlY2tfcG9zIC0gY2hlY2sgaWYgdGhlIGN1cnNvciBpcyBvbiB0aGUgc2NyZWVuLgorICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9jaGVja19wb3MoKQoreworICAgIGlmIChndWkucm93ID49IHNjcmVlbl9Sb3dzKQorCWd1aS5yb3cgPSBzY3JlZW5fUm93cyAtIDE7CisgICAgaWYgKGd1aS5jb2wgPj0gc2NyZWVuX0NvbHVtbnMpCisJZ3VpLmNvbCA9IHNjcmVlbl9Db2x1bW5zIC0gMTsKKyAgICBpZiAoZ3VpLmN1cnNvcl9yb3cgPj0gc2NyZWVuX1Jvd3MgfHwgZ3VpLmN1cnNvcl9jb2wgPj0gc2NyZWVuX0NvbHVtbnMpCisJZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworfQorCisvKgorICogUmVkcmF3IHRoZSBjdXJzb3IgaWYgbmVjZXNzYXJ5IG9yIHdoZW4gZm9yY2VkLgorICogQ2FyZWZ1bDogVGhlIGNvbnRlbnRzIG9mIFNjcmVlbkxpbmVzW10gbXVzdCBtYXRjaCB3aGF0IGlzIG9uIHRoZSBzY3JlZW4sCisgKiBvdGhlcndpc2UgdGhpcyBnb2VzIHdyb25nLiAgTWF5IG5lZWQgdG8gY2FsbCBvdXRfZmx1c2goKSBmaXJzdC4KKyAqLworICAgIHZvaWQKK2d1aV91cGRhdGVfY3Vyc29yKGZvcmNlLCBjbGVhcl9zZWxlY3Rpb24pCisgICAgaW50CQlmb3JjZTsJCS8qIHdoZW4gVFJVRSwgdXBkYXRlIGV2ZW4gd2hlbiBub3QgbW92ZWQgKi8KKyAgICBpbnQJCWNsZWFyX3NlbGVjdGlvbjsvKiBjbGVhciBzZWxlY3Rpb24gdW5kZXIgY3Vyc29yICovCit7CisgICAgaW50CQljdXJfd2lkdGggPSAwOworICAgIGludAkJY3VyX2hlaWdodCA9IDA7CisgICAgaW50CQlvbGRfaGxfbWFzazsKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCWlkOworICAgIGd1aWNvbG9yX1QJY2ZnLCBjYmcsIGNjOwkvKiBjdXJzb3IgZm9yZS0vYmFja2dyb3VuZCBjb2xvciAqLworICAgIGludAkJY2F0dHI7CQkvKiBjdXJzb3IgYXR0cmlidXRlcyAqLworICAgIGludAkJYXR0cjsKKyAgICBhdHRyZW50cnlfVCAqYWVwID0gTlVMTDsKKworICAgIC8qIERvbid0IHVwZGF0ZSB0aGUgY3Vyc29yIHdoZW4gaGFsZndheSBidXN5IHNjcm9sbGluZy4KKyAgICAgKiBTY3JlZW5MaW5lc1tdIGlzbid0IHZhbGlkIHRoZW4uICovCisgICAgaWYgKCFjYW5fdXBkYXRlX2N1cnNvcikKKwlyZXR1cm47CisKKyAgICBndWlfY2hlY2tfcG9zKCk7CisgICAgaWYgKCFndWkuY3Vyc29yX2lzX3ZhbGlkIHx8IGZvcmNlCisJCSAgICB8fCBndWkucm93ICE9IGd1aS5jdXJzb3Jfcm93IHx8IGd1aS5jb2wgIT0gZ3VpLmN1cnNvcl9jb2wpCisgICAgeworCWd1aV91bmRyYXdfY3Vyc29yKCk7CisJaWYgKGd1aS5yb3cgPCAwKQorCSAgICByZXR1cm47CisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKwlpZiAoZ3VpLnJvdyAhPSBndWkuY3Vyc29yX3JvdyB8fCBndWkuY29sICE9IGd1aS5jdXJzb3JfY29sKQorCSAgICBpbV9zZXRfcG9zaXRpb24oZ3VpLnJvdywgZ3VpLmNvbCk7CisjZW5kaWYKKwlndWkuY3Vyc29yX3JvdyA9IGd1aS5yb3c7CisJZ3VpLmN1cnNvcl9jb2wgPSBndWkuY29sOworCisJLyogT25seSB3cml0ZSB0byB0aGUgc2NyZWVuIGFmdGVyIFNjcmVlbkxpbmVzW10gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwlpZiAoIXNjcmVlbl9jbGVhcmVkIHx8IFNjcmVlbkxpbmVzID09IE5VTEwpCisJICAgIHJldHVybjsKKworCS8qIENsZWFyIHRoZSBzZWxlY3Rpb24gaWYgd2UgYXJlIGFib3V0IHRvIHdyaXRlIG92ZXIgaXQgKi8KKwlpZiAoY2xlYXJfc2VsZWN0aW9uKQorCSAgICBjbGlwX21heV9jbGVhcl9zZWxlY3Rpb24oZ3VpLnJvdywgZ3VpLnJvdyk7CisJLyogQ2hlY2sgdGhhdCB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUgc2hlbGwgKHJlc2l6aW5nIG1heSBoYXZlIG1hZGUKKwkgKiBpdCBpbnZhbGlkKSAqLworCWlmIChndWkucm93ID49IHNjcmVlbl9Sb3dzIHx8IGd1aS5jb2wgPj0gc2NyZWVuX0NvbHVtbnMpCisJICAgIHJldHVybjsKKworCWd1aS5jdXJzb3JfaXNfdmFsaWQgPSBUUlVFOworCisJLyoKKwkgKiBIb3cgdGhlIGN1cnNvciBpcyBkcmF3biBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IG1vZGUuCisJICovCisJaWR4ID0gZ2V0X3NoYXBlX2lkeChGQUxTRSk7CisJaWYgKFN0YXRlICYgTEFOR01BUCkKKwkgICAgaWQgPSBzaGFwZV90YWJsZVtpZHhdLmlkX2xtOworCWVsc2UKKwkgICAgaWQgPSBzaGFwZV90YWJsZVtpZHhdLmlkOworCisJLyogZ2V0IHRoZSBjb2xvcnMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJzb3IuICBEZWZhdWx0IGlzIGludmVydGVkICovCisJY2ZnID0gSU5WQUxDT0xPUjsKKwljYmcgPSBJTlZBTENPTE9SOworCWNhdHRyID0gSExfSU5WRVJTRTsKKwlndWlfbWNoX3NldF9ibGlua2luZyhzaGFwZV90YWJsZVtpZHhdLmJsaW5rd2FpdCwKKwkJCSAgICAgc2hhcGVfdGFibGVbaWR4XS5ibGlua29uLAorCQkJICAgICBzaGFwZV90YWJsZVtpZHhdLmJsaW5rb2ZmKTsKKwlpZiAoaWQgPiAwKQorCXsKKwkgICAgY2F0dHIgPSBzeW5faWQyY29sb3JzKGlkLCAmY2ZnLCAmY2JnKTsKKyNpZiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKEZFQVRfSEFOR1VMSU4pCisJICAgIHsKKwkJc3RhdGljIGludCBpaWQ7CisJCWd1aWNvbG9yX1QgZmcsIGJnOworCisJCWlmIChpbV9nZXRfc3RhdHVzKCkpCisJCXsKKwkJICAgIGlpZCA9IHN5bl9uYW1lMmlkKChjaGFyX3UgKikiQ3Vyc29ySU0iKTsKKwkJICAgIGlmIChpaWQgPiAwKQorCQkgICAgeworCQkJc3luX2lkMmNvbG9ycyhpaWQsICZmZywgJmJnKTsKKwkJCWlmIChiZyAhPSBJTlZBTENPTE9SKQorCQkJICAgIGNiZyA9IGJnOworCQkJaWYgKGZnICE9IElOVkFMQ09MT1IpCisJCQkgICAgY2ZnID0gZmc7CisJCSAgICB9CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvci4KKwkgKiBXaGVuIG5vIGN1cnNvciBjb2xvciB3YXMgZ2l2ZW4sIHVzZSB0aGUgY2hhcmFjdGVyIGNvbG9yLgorCSAqLworCWF0dHIgPSBTY3JlZW5BdHRyc1tMaW5lT2Zmc2V0W2d1aS5yb3ddICsgZ3VpLmNvbF07CisJaWYgKGF0dHIgPiBITF9BTEwpCisJICAgIGFlcCA9IHN5bl9ndWlfYXR0cjJlbnRyeShhdHRyKTsKKwlpZiAoYWVwICE9IE5VTEwpCisJeworCSAgICBhdHRyID0gYWVwLT5hZV9hdHRyOworCSAgICBpZiAoY2ZnID09IElOVkFMQ09MT1IpCisJCWNmZyA9ICgoYXR0ciAmIEhMX0lOVkVSU0UpICA/IGFlcC0+YWVfdS5ndWkuYmdfY29sb3IKKwkJCQkJICAgIDogYWVwLT5hZV91Lmd1aS5mZ19jb2xvcik7CisJICAgIGlmIChjYmcgPT0gSU5WQUxDT0xPUikKKwkJY2JnID0gKChhdHRyICYgSExfSU5WRVJTRSkgID8gYWVwLT5hZV91Lmd1aS5mZ19jb2xvcgorCQkJCQkgICAgOiBhZXAtPmFlX3UuZ3VpLmJnX2NvbG9yKTsKKwl9CisJaWYgKGNmZyA9PSBJTlZBTENPTE9SKQorCSAgICBjZmcgPSAoYXR0ciAmIEhMX0lOVkVSU0UpID8gZ3VpLmJhY2tfcGl4ZWwgOiBndWkubm9ybV9waXhlbDsKKwlpZiAoY2JnID09IElOVkFMQ09MT1IpCisJICAgIGNiZyA9IChhdHRyICYgSExfSU5WRVJTRSkgPyBndWkubm9ybV9waXhlbCA6IGd1aS5iYWNrX3BpeGVsOworCisjaWZkZWYgRkVBVF9YSU0KKwlpZiAoYWVwICE9IE5VTEwpCisJeworCSAgICB4aW1fYmdfY29sb3IgPSAoKGF0dHIgJiBITF9JTlZFUlNFKSA/IGFlcC0+YWVfdS5ndWkuZmdfY29sb3IKKwkJCQkJCTogYWVwLT5hZV91Lmd1aS5iZ19jb2xvcik7CisJICAgIHhpbV9mZ19jb2xvciA9ICgoYXR0ciAmIEhMX0lOVkVSU0UpID8gYWVwLT5hZV91Lmd1aS5iZ19jb2xvcgorCQkJCQkJOiBhZXAtPmFlX3UuZ3VpLmZnX2NvbG9yKTsKKwkgICAgaWYgKHhpbV9iZ19jb2xvciA9PSBJTlZBTENPTE9SKQorCQl4aW1fYmdfY29sb3IgPSAoYXR0ciAmIEhMX0lOVkVSU0UpID8gZ3VpLm5vcm1fcGl4ZWwKKwkJCQkJCSAgIDogZ3VpLmJhY2tfcGl4ZWw7CisJICAgIGlmICh4aW1fZmdfY29sb3IgPT0gSU5WQUxDT0xPUikKKwkJeGltX2ZnX2NvbG9yID0gKGF0dHIgJiBITF9JTlZFUlNFKSA/IGd1aS5iYWNrX3BpeGVsCisJCQkJCQkgICA6IGd1aS5ub3JtX3BpeGVsOworCX0KKwllbHNlCisJeworCSAgICB4aW1fYmdfY29sb3IgPSAoYXR0ciAmIEhMX0lOVkVSU0UpID8gZ3VpLm5vcm1fcGl4ZWwKKwkJCQkJICAgICAgIDogZ3VpLmJhY2tfcGl4ZWw7CisJICAgIHhpbV9mZ19jb2xvciA9IChhdHRyICYgSExfSU5WRVJTRSkgPyBndWkuYmFja19waXhlbAorCQkJCQkgICAgICAgOiBndWkubm9ybV9waXhlbDsKKwl9CisjZW5kaWYKKworCWF0dHIgJj0gfkhMX0lOVkVSU0U7CisJaWYgKGNhdHRyICYgSExfSU5WRVJTRSkKKwl7CisJICAgIGNjID0gY2JnOworCSAgICBjYmcgPSBjZmc7CisJICAgIGNmZyA9IGNjOworCX0KKwljYXR0ciAmPSB+SExfSU5WRVJTRTsKKworCS8qCisJICogV2hlbiB3ZSBkb24ndCBoYXZlIHdpbmRvdyBmb2N1cywgZHJhdyBhIGhvbGxvdyBjdXJzb3IuCisJICovCisJaWYgKCFndWkuaW5fZm9jdXMpCisJeworCSAgICBndWlfbWNoX2RyYXdfaG9sbG93X2N1cnNvcihjYmcpOworCSAgICByZXR1cm47CisJfQorCisJb2xkX2hsX21hc2sgPSBndWkuaGlnaGxpZ2h0X21hc2s7CisJaWYgKHNoYXBlX3RhYmxlW2lkeF0uc2hhcGUgPT0gU0hBUEVfQkxPQ0sKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisJCXx8IGNvbXBvc2luZ19oYW5ndWwKKyNlbmRpZgorCSAgICkKKwl7CisJICAgIC8qCisJICAgICAqIERyYXcgdGhlIHRleHQgY2hhcmFjdGVyIHdpdGggdGhlIGN1cnNvciBjb2xvcnMuCVVzZSB0aGUKKwkgICAgICogY2hhcmFjdGVyIGF0dHJpYnV0ZXMgcGx1cyB0aGUgY3Vyc29yIGF0dHJpYnV0ZXMuCisJICAgICAqLworCSAgICBndWkuaGlnaGxpZ2h0X21hc2sgPSAoY2F0dHIgfCBhdHRyKTsKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisJICAgIGlmIChjb21wb3NpbmdfaGFuZ3VsKQorCQkodm9pZClndWlfb3V0c3RyX25vd3JhcChjb21wb3NpbmdfaGFuZ3VsX2J1ZmZlciwgMiwKKwkJCUdVSV9NT05fSVNfQ1VSU09SIHwgR1VJX01PTl9OT0NMRUFSLCBjZmcsIGNiZywgMCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkodm9pZClndWlfc2NyZWVuY2hhcihMaW5lT2Zmc2V0W2d1aS5yb3ddICsgZ3VpLmNvbCwKKwkJCUdVSV9NT05fSVNfQ1VSU09SIHwgR1VJX01PTl9OT0NMRUFSLCBjZmcsIGNiZywgMCk7CisJfQorCWVsc2UKKwl7CisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKQorCSAgICBpbnQJICAgIGNvbF9vZmYgPSBGQUxTRTsKKyNlbmRpZgorCSAgICAvKgorCSAgICAgKiBGaXJzdCBkcmF3IHRoZSBwYXJ0aWFsIGN1cnNvciwgdGhlbiBvdmVyd3JpdGUgd2l0aCB0aGUgdGV4dAorCSAgICAgKiBjaGFyYWN0ZXIsIHVzaW5nIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZC4KKwkgICAgICovCisJICAgIGlmIChzaGFwZV90YWJsZVtpZHhdLnNoYXBlID09IFNIQVBFX1ZFUikKKwkgICAgeworCQljdXJfaGVpZ2h0ID0gZ3VpLmNoYXJfaGVpZ2h0OworCQljdXJfd2lkdGggPSAoZ3VpLmNoYXJfd2lkdGggKiBzaGFwZV90YWJsZVtpZHhdLnBlcmNlbnRhZ2UKKwkJCQkJCQkJICArIDk5KSAvIDEwMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJY3VyX2hlaWdodCA9IChndWkuY2hhcl9oZWlnaHQgKiBzaGFwZV90YWJsZVtpZHhdLnBlcmNlbnRhZ2UKKwkJCQkJCQkJICArIDk5KSAvIDEwMDsKKwkJY3VyX3dpZHRoID0gZ3VpLmNoYXJfd2lkdGg7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKCptYl9vZmYyY2VsbHMpKExpbmVPZmZzZXRbZ3VpLnJvd10gKyBndWkuY29sKSA+IDEpCisJICAgIHsKKwkJLyogRG91YmxlIHdpZGUgY2hhcmFjdGVyLiAqLworCQlpZiAoc2hhcGVfdGFibGVbaWR4XS5zaGFwZSAhPSBTSEFQRV9WRVIpCisJCSAgICBjdXJfd2lkdGggKz0gZ3VpLmNoYXJfd2lkdGg7CisjIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCWlmIChDVVJTT1JfQkFSX1JJR0hUKQorCQl7CisJCSAgICAvKiBndWkuY29sIHBvaW50cyB0byB0aGUgbGVmdCBoYWx2ZSBvZiB0aGUgY2hhcmFjdGVyIGJ1dAorCQkgICAgICogdGhlIHZlcnRpY2FsIGxpbmUgbmVlZHMgdG8gYmUgb24gdGhlIHJpZ2h0IGhhbHZlLgorCQkgICAgICogQSBkb3VibGUtd2lkZSBob3Jpem9udGFsIGxpbmUgaXMgYWxzbyBkcmF3biBmcm9tIHRoZQorCQkgICAgICogcmlnaHQgaGFsdmUgaW4gZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKCkuICovCisJCSAgICBjb2xfb2ZmID0gVFJVRTsKKwkJICAgICsrZ3VpLmNvbDsKKwkJfQorIyBlbmRpZgorCSAgICB9CisjZW5kaWYKKwkgICAgZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKGN1cl93aWR0aCwgY3VyX2hlaWdodCwgY2JnKTsKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoRkVBVF9SSUdIVExFRlQpCisJICAgIGlmIChjb2xfb2ZmKQorCQktLWd1aS5jb2w7CisjZW5kaWYKKworI2lmbmRlZiBGRUFUX0dVSV9NU1dJTgkgICAgLyogZG9lc24ndCBzZWVtIHRvIHdvcmsgZm9yIE1TV2luZG93cyAqLworCSAgICBndWkuaGlnaGxpZ2h0X21hc2sgPSBTY3JlZW5BdHRyc1tMaW5lT2Zmc2V0W2d1aS5yb3ddICsgZ3VpLmNvbF07CisJICAgICh2b2lkKWd1aV9zY3JlZW5jaGFyKExpbmVPZmZzZXRbZ3VpLnJvd10gKyBndWkuY29sLAorCQkgICAgR1VJX01PTl9UUlNfQ1VSU09SIHwgR1VJX01PTl9OT0NMRUFSLAorCQkgICAgKGd1aWNvbG9yX1QpMCwgKGd1aWNvbG9yX1QpMCwgMCk7CisjZW5kaWYKKwl9CisJZ3VpLmhpZ2hsaWdodF9tYXNrID0gb2xkX2hsX21hc2s7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX3Bvc2l0aW9uX21lbnUoKQoreworIyBpZiAhZGVmaW5lZChGRUFUX0dVSV9HVEspICYmICFkZWZpbmVkKEZFQVRfR1VJX01PVElGKQorICAgIGlmIChndWkubWVudV9pc19hY3RpdmUgJiYgZ3VpLmluX3VzZSkKKwlndWlfbWNoX3NldF9tZW51X3BvcygwLCAwLCBndWkubWVudV93aWR0aCwgZ3VpLm1lbnVfaGVpZ2h0KTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogUG9zaXRpb24gdGhlIHZhcmlvdXMgR1VJIGNvbXBvbmVudHMgKHRleHQgYXJlYSwgbWVudSkuICBUaGUgdmVydGljYWwKKyAqIHNjcm9sbGJhcnMgYXJlIE5PVCBoYW5kbGVkIGhlcmUuICBTZWUgZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKCkuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitndWlfcG9zaXRpb25fY29tcG9uZW50cyh0b3RhbF93aWR0aCkKKyAgICBpbnQJICAgIHRvdGFsX3dpZHRoOworeworICAgIGludAkgICAgdGV4dF9hcmVhX3g7CisgICAgaW50CSAgICB0ZXh0X2FyZWFfeTsKKyAgICBpbnQJICAgIHRleHRfYXJlYV93aWR0aDsKKyAgICBpbnQJICAgIHRleHRfYXJlYV9oZWlnaHQ7CisKKyAgICAvKiBhdm9pZCB0aGF0IG1vdmluZyBjb21wb25lbnRzIGFyb3VuZCBnZW5lcmF0ZXMgZXZlbnRzICovCisgICAgKytob2xkX2d1aV9ldmVudHM7CisKKyAgICB0ZXh0X2FyZWFfeCA9IDA7CisgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0pCisJdGV4dF9hcmVhX3ggKz0gZ3VpLnNjcm9sbGJhcl93aWR0aDsKKworICAgIHRleHRfYXJlYV95ID0gMDsKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgIShkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pKQorICAgIGd1aS5tZW51X3dpZHRoID0gdG90YWxfd2lkdGg7CisgICAgaWYgKGd1aS5tZW51X2lzX2FjdGl2ZSkKKwl0ZXh0X2FyZWFfeSArPSBndWkubWVudV9oZWlnaHQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKQorCXRleHRfYXJlYV95ID0gVE9PTEJBUl9CVVRUT05fSEVJR0hUICsgVE9PTEJBUl9CT1JERVJfSEVJR0hUOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgKGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSkKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKQorICAgIHsKKyMgaWZkZWYgRkVBVF9HVUlfQVRIRU5BCisJZ3VpX21jaF9zZXRfdG9vbGJhcl9wb3MoMCwgdGV4dF9hcmVhX3ksCisJCQkJZ3VpLm1lbnVfd2lkdGgsIGd1aS50b29sYmFyX2hlaWdodCk7CisjIGVuZGlmCisJdGV4dF9hcmVhX3kgKz0gZ3VpLnRvb2xiYXJfaGVpZ2h0OworICAgIH0KKyNlbmRpZgorCisgICAgdGV4dF9hcmVhX3dpZHRoID0gZ3VpLm51bV9jb2xzICogZ3VpLmNoYXJfd2lkdGggKyBndWkuYm9yZGVyX29mZnNldCAqIDI7CisgICAgdGV4dF9hcmVhX2hlaWdodCA9IGd1aS5udW1fcm93cyAqIGd1aS5jaGFyX2hlaWdodCArIGd1aS5ib3JkZXJfb2Zmc2V0ICogMjsKKworICAgIGd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3ModGV4dF9hcmVhX3gsCisJCQkgICAgICB0ZXh0X2FyZWFfeSwKKwkJCSAgICAgIHRleHRfYXJlYV93aWR0aCwKKwkJCSAgICAgIHRleHRfYXJlYV9oZWlnaHQKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiAhZGVmaW5lZChIQVZFX0dUSzIpCisJCQkJICArIHhpbV9nZXRfc3RhdHVzX2FyZWFfaGVpZ2h0KCkKKyNlbmRpZgorCQkJICAgICAgKTsKKyNpZmRlZiBGRUFUX01FTlUKKyAgICBndWlfcG9zaXRpb25fbWVudSgpOworI2VuZGlmCisgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfQk9UVE9NXSkKKwlndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKCZndWkuYm90dG9tX3NiYXIsCisJCQkJICB0ZXh0X2FyZWFfeCwKKwkJCQkgIHRleHRfYXJlYV95ICsgdGV4dF9hcmVhX2hlaWdodCwKKwkJCQkgIHRleHRfYXJlYV93aWR0aCwKKwkJCQkgIGd1aS5zY3JvbGxiYXJfaGVpZ2h0KTsKKyAgICBndWkubGVmdF9zYmFyX3ggPSAwOworICAgIGd1aS5yaWdodF9zYmFyX3ggPSB0ZXh0X2FyZWFfeCArIHRleHRfYXJlYV93aWR0aDsKKworICAgIC0taG9sZF9ndWlfZXZlbnRzOworfQorCisgICAgaW50CitndWlfZ2V0X2Jhc2Vfd2lkdGgoKQoreworICAgIGludAkgICAgYmFzZV93aWR0aDsKKworICAgIGJhc2Vfd2lkdGggPSAyICogZ3VpLmJvcmRlcl9vZmZzZXQ7CisgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0pCisJYmFzZV93aWR0aCArPSBndWkuc2Nyb2xsYmFyX3dpZHRoOworICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXSkKKwliYXNlX3dpZHRoICs9IGd1aS5zY3JvbGxiYXJfd2lkdGg7CisgICAgcmV0dXJuIGJhc2Vfd2lkdGg7Cit9CisKKyAgICBpbnQKK2d1aV9nZXRfYmFzZV9oZWlnaHQoKQoreworICAgIGludAkgICAgYmFzZV9oZWlnaHQ7CisKKyAgICBiYXNlX2hlaWdodCA9IDIgKiBndWkuYm9yZGVyX29mZnNldDsKKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9CT1RUT01dKQorCWJhc2VfaGVpZ2h0ICs9IGd1aS5zY3JvbGxiYXJfaGVpZ2h0OworI2lmZGVmIEZFQVRfR1VJX0dUSworICAgIC8qIFdlIGNhbid0IHRha2UgdGhlIHNpemVzIHByb3Blcmx5IGludG8gYWNjb3VudCB1bnRpbCBhbnl0aGluZyBpcworICAgICAqIHJlYWxpemVkLiAgVGhlcmVmb3JlIHdlIHJlY2FsY3VsYXRlIGFsbCB0aGUgdmFsdWVzIGhlcmUganVzdCBiZWZvcmUKKyAgICAgKiBzZXR0aW5nIHRoZSBzaXplLiAoLS1tZGNraSkgKi8KKyNlbHNlCisjIGlmZGVmIEZFQVRfTUVOVQorICAgIGlmIChndWkubWVudV9pc19hY3RpdmUpCisJYmFzZV9oZWlnaHQgKz0gZ3VpLm1lbnVfaGVpZ2h0OworIyBlbmRpZgorIyBpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKQorIyAgaWYgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgJiYgZGVmaW5lZChGRUFUX1RPT0xCQVIpCisJYmFzZV9oZWlnaHQgKz0gKFRPT0xCQVJfQlVUVE9OX0hFSUdIVCArIFRPT0xCQVJfQk9SREVSX0hFSUdIVCk7CisjICBlbHNlCisJYmFzZV9oZWlnaHQgKz0gZ3VpLnRvb2xiYXJfaGVpZ2h0OworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9GT09URVIKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19GT09URVIpICE9IE5VTEwpCisJYmFzZV9oZWlnaHQgKz0gZ3VpLmZvb3Rlcl9oZWlnaHQ7CisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpICYmIGRlZmluZWQoRkVBVF9NRU5VKQorICAgIGJhc2VfaGVpZ2h0ICs9IGd1aV9tY2hfdGV4dF9hcmVhX2V4dHJhX2hlaWdodCgpOworIyBlbmRpZgorI2VuZGlmCisgICAgcmV0dXJuIGJhc2VfaGVpZ2h0OworfQorCisvKgorICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgR1VJIHNoZWxsIGhhcyBiZWVuIHJlc2l6ZWQuICBJdHMgYXJndW1lbnRzIGFyZQorICogdGhlIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzaGVsbCBpbiBwaXhlbHMuCisgKi8KKyAgICB2b2lkCitndWlfcmVzaXplX3NoZWxsKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQpCisgICAgaW50CQlwaXhlbF93aWR0aDsKKyAgICBpbnQJCXBpeGVsX2hlaWdodDsKK3sKKyAgICBzdGF0aWMgaW50CWJ1c3kgPSBGQUxTRTsKKworICAgIGlmICghZ3VpLnNoZWxsX2NyZWF0ZWQpCSAgICAvKiBpZ25vcmUgd2hlbiBzdGlsbCBpbml0aWFsaXppbmcgKi8KKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIENhbid0IHJlc2l6ZSB0aGUgc2NyZWVuIHdoaWxlIGl0IGlzIGJlaW5nIHJlZHJhd24uICBSZW1lbWJlciB0aGUgbmV3CisgICAgICogc2l6ZSBhbmQgaGFuZGxlIGl0IGxhdGVyLgorICAgICAqLworICAgIGlmICh1cGRhdGluZ19zY3JlZW4gfHwgYnVzeSkKKyAgICB7CisJbmV3X3BpeGVsX3dpZHRoID0gcGl4ZWxfd2lkdGg7CisJbmV3X3BpeGVsX2hlaWdodCA9IHBpeGVsX2hlaWdodDsKKwlyZXR1cm47CisgICAgfQorCithZ2FpbjoKKyAgICBidXN5ID0gVFJVRTsKKworI2lmZGVmIEZFQVRfR1VJX0JFT1MKKyAgICB2aW1fbG9ja19zY3JlZW4oKTsKKyNlbmRpZgorCisgICAgLyogRmx1c2ggcGVuZGluZyBvdXRwdXQgYmVmb3JlIHJlZHJhd2luZyAqLworICAgIG91dF9mbHVzaCgpOworCisgICAgZ3VpLm51bV9jb2xzID0gKHBpeGVsX3dpZHRoIC0gZ3VpX2dldF9iYXNlX3dpZHRoKCkpIC8gZ3VpLmNoYXJfd2lkdGg7CisgICAgZ3VpLm51bV9yb3dzID0gKHBpeGVsX2hlaWdodCAtIGd1aV9nZXRfYmFzZV9oZWlnaHQoKQorI2lmICFkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikgJiYgIWRlZmluZWQoRkVBVF9HVUlfTVNXSU4pCisJCQkJICAgICsgKGd1aS5jaGFyX2hlaWdodCAvIDIpCisjZW5kaWYKKwkJCQkJKSAvIGd1aS5jaGFyX2hlaWdodDsKKworICAgIGd1aV9wb3NpdGlvbl9jb21wb25lbnRzKHBpeGVsX3dpZHRoKTsKKworICAgIGd1aV9yZXNldF9zY3JvbGxfcmVnaW9uKCk7CisgICAgLyoKKyAgICAgKiBBdCB0aGUgIm1vcmUiIGFuZCAiOmNvbmZpcm0iIHByb21wdCB0aGVyZSBpcyBubyByZWRyYXcsIHB1dCB0aGUgY3Vyc29yCisgICAgICogYXQgdGhlIGxhc3QgbGluZSBoZXJlICh3aHkgZG9lcyBpdCBoYXZlIHRvIGJlIG9uZSByb3cgdG9vIGxvdz8pLgorICAgICAqLworICAgIGlmIChTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IENPTkZJUk0pCisJZ3VpLnJvdyA9IGd1aS5udW1fcm93czsKKworICAgIC8qIE9ubHkgY29tcGFyaW5nIFJvd3MgYW5kIENvbHVtbnMgbWF5IGJlIHN1ZmZpY2llbnQsIGJ1dCBsZXQncyBzdGF5IG9uCisgICAgICogdGhlIHNhZmUgc2lkZS4gKi8KKyAgICBpZiAoZ3VpLm51bV9yb3dzICE9IHNjcmVlbl9Sb3dzIHx8IGd1aS5udW1fY29scyAhPSBzY3JlZW5fQ29sdW1ucworCSAgICB8fCBndWkubnVtX3Jvd3MgIT0gUm93cyB8fCBndWkubnVtX2NvbHMgIT0gQ29sdW1ucykKKwlzaGVsbF9yZXNpemVkKCk7CisKKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgdmltX3VubG9ja19zY3JlZW4oKTsKKyNlbmRpZgorCisgICAgZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKFRSVUUpOworICAgIGd1aV91cGRhdGVfY3Vyc29yKEZBTFNFLCBUUlVFKTsKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiAhZGVmaW5lZChIQVZFX0dUSzIpCisgICAgeGltX3NldF9zdGF0dXNfYXJlYSgpOworI2VuZGlmCisKKyAgICBidXN5ID0gRkFMU0U7CisgICAgLyoKKyAgICAgKiBXZSBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkIGFnYWluIHdoaWxlIHJlZHJhd2luZyB0aGUgc2NyZWVuLgorICAgICAqIE5lZWQgdG8gZG8gaXQgYWxsIGFnYWluIHdpdGggdGhlIGxhdGVzdCBzaXplIHRoZW4uCisgICAgICovCisgICAgaWYgKG5ld19waXhlbF9oZWlnaHQpCisgICAgeworCXBpeGVsX3dpZHRoID0gbmV3X3BpeGVsX3dpZHRoOworCXBpeGVsX2hlaWdodCA9IG5ld19waXhlbF9oZWlnaHQ7CisJbmV3X3BpeGVsX3dpZHRoID0gMDsKKwluZXdfcGl4ZWxfaGVpZ2h0ID0gMDsKKwlnb3RvIGFnYWluOworICAgIH0KK30KKworLyoKKyAqIENoZWNrIGlmIGd1aV9yZXNpemVfc2hlbGwoKSBtdXN0IGJlIGNhbGxlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tYXlfcmVzaXplX3NoZWxsKCkKK3sKKyAgICBpbnQJCWgsIHc7CisKKyAgICBpZiAobmV3X3BpeGVsX2hlaWdodCkKKyAgICB7CisJLyogY2FyZWZ1bDogZ3VpX3Jlc2l6ZV9zaGVsbCgpIG1heSBwb3N0cG9uZSB0aGUgcmVzaXplIGFnYWluIGlmIHdlCisJICogd2VyZSBjYWxsZWQgaW5kaXJlY3RseSBieSBpdCAqLworCXcgPSBuZXdfcGl4ZWxfd2lkdGg7CisJaCA9IG5ld19waXhlbF9oZWlnaHQ7CisJbmV3X3BpeGVsX3dpZHRoID0gMDsKKwluZXdfcGl4ZWxfaGVpZ2h0ID0gMDsKKwlndWlfcmVzaXplX3NoZWxsKHcsIGgpOworICAgIH0KK30KKworICAgIGludAorZ3VpX2dldF9zaGVsbHNpemUoKQoreworICAgIFJvd3MgPSBndWkubnVtX3Jvd3M7CisgICAgQ29sdW1ucyA9IGd1aS5udW1fY29sczsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNpemUgb2YgdGhlIFZpbSBzaGVsbCBhY2NvcmRpbmcgdG8gUm93cyBhbmQgQ29sdW1ucy4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZ3VpX3NldF9zaGVsbHNpemUobXVzdHNldCwgZml0X3RvX2Rpc3BsYXkpCisgICAgaW50CQltdXN0c2V0OwkJLyogc2V0IGJ5IHRoZSB1c2VyICovCisgICAgaW50CQlmaXRfdG9fZGlzcGxheTsKK3sKKyAgICBpbnQJCWJhc2Vfd2lkdGg7CisgICAgaW50CQliYXNlX2hlaWdodDsKKyAgICBpbnQJCXdpZHRoOworICAgIGludAkJaGVpZ2h0OworICAgIGludAkJbWluX3dpZHRoOworICAgIGludAkJbWluX2hlaWdodDsKKyAgICBpbnQJCXNjcmVlbl93OworICAgIGludAkJc2NyZWVuX2g7CisKKyAgICBpZiAoIWd1aS5zaGVsbF9jcmVhdGVkKQorCXJldHVybjsKKworI2lmZGVmIE1TV0lOCisgICAgLyogSWYgbm90IHNldHRpbmcgdG8gYSB1c2VyIHNwZWNpZmllZCBzaXplIGFuZCBtYXhpbWl6ZWQsIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGZpdCBpbiB0aGUgbWF4aW1pemVkIHdpbmRvdy4gKi8KKyAgICBpZiAoIW11c3RzZXQgJiYgZ3VpX21jaF9tYXhpbWl6ZWQoKSkKKyAgICB7CisJZ3VpX21jaF9uZXdmb250KCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgYmFzZV93aWR0aCA9IGd1aV9nZXRfYmFzZV93aWR0aCgpOworICAgIGJhc2VfaGVpZ2h0ID0gZ3VpX2dldF9iYXNlX2hlaWdodCgpOworI2lmZGVmIFVTRV9TVU5fV09SS1NIT1AKKyAgICBpZiAoIW11c3RzZXQgJiYgdXNpbmdTdW5Xb3JrU2hvcAorCQkJCSYmIHdvcmtzaG9wX2dldF93aWR0aF9oZWlnaHQoJndpZHRoLCAmaGVpZ2h0KSkKKyAgICB7CisJQ29sdW1ucyA9ICh3aWR0aCAtIGJhc2Vfd2lkdGggKyBndWkuY2hhcl93aWR0aCAtIDEpIC8gZ3VpLmNoYXJfd2lkdGg7CisJUm93cyA9IChoZWlnaHQgLSBiYXNlX2hlaWdodCArIGd1aS5jaGFyX2hlaWdodCAtIDEpIC8gZ3VpLmNoYXJfaGVpZ2h0OworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJd2lkdGggPSBDb2x1bW5zICogZ3VpLmNoYXJfd2lkdGggKyBiYXNlX3dpZHRoOworCWhlaWdodCA9IFJvd3MgKiBndWkuY2hhcl9oZWlnaHQgKyBiYXNlX2hlaWdodDsKKyAgICB9CisKKyAgICBpZiAoZml0X3RvX2Rpc3BsYXkpCisgICAgeworCWd1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKCZzY3JlZW5fdywgJnNjcmVlbl9oKTsKKwlpZiAod2lkdGggPiBzY3JlZW5fdykKKwl7CisJICAgIENvbHVtbnMgPSAoc2NyZWVuX3cgLSBiYXNlX3dpZHRoKSAvIGd1aS5jaGFyX3dpZHRoOworCSAgICBpZiAoQ29sdW1ucyA8IE1JTl9DT0xVTU5TKQorCQlDb2x1bW5zID0gTUlOX0NPTFVNTlM7CisJICAgIHdpZHRoID0gQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoICsgYmFzZV93aWR0aDsKKwl9CisJaWYgKGhlaWdodCA+IHNjcmVlbl9oKQorCXsKKwkgICAgUm93cyA9IChzY3JlZW5faCAtIGJhc2VfaGVpZ2h0KSAvIGd1aS5jaGFyX2hlaWdodDsKKwkgICAgY2hlY2tfc2hlbGxzaXplKCk7CisJICAgIGhlaWdodCA9IFJvd3MgKiBndWkuY2hhcl9oZWlnaHQgKyBiYXNlX2hlaWdodDsKKwl9CisgICAgfQorICAgIGd1aS5udW1fY29scyA9IENvbHVtbnM7CisgICAgZ3VpLm51bV9yb3dzID0gUm93czsKKworICAgIG1pbl93aWR0aCA9IGJhc2Vfd2lkdGggKyBNSU5fQ09MVU1OUyAqIGd1aS5jaGFyX3dpZHRoOworICAgIG1pbl9oZWlnaHQgPSBiYXNlX2hlaWdodCArIE1JTl9MSU5FUyAqIGd1aS5jaGFyX2hlaWdodDsKKworICAgIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSh3aWR0aCwgaGVpZ2h0LCBtaW5fd2lkdGgsIG1pbl9oZWlnaHQsCisJCQkJCQkgICAgIGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0KTsKKyAgICBpZiAoZml0X3RvX2Rpc3BsYXkpCisgICAgeworCWludAkgICAgeCwgeTsKKworCS8qIFNvbWUgd2luZG93IG1hbmFnZXJzIHB1dCB0aGUgVmltIHdpbmRvdyBsZWZ0IG9mL2Fib3ZlIHRoZSBzY3JlZW4uICovCisJZ3VpX21jaF91cGRhdGUoKTsKKwlpZiAoZ3VpX21jaF9nZXRfd2lucG9zKCZ4LCAmeSkgPT0gT0sgJiYgKHggPCAwIHx8IHkgPCAwKSkKKwkgICAgZ3VpX21jaF9zZXRfd2lucG9zKHggPCAwID8gMCA6IHgsIHkgPCAwID8gMCA6IHkpOworICAgIH0KKworICAgIGd1aV9wb3NpdGlvbl9jb21wb25lbnRzKHdpZHRoKTsKKyAgICBndWlfdXBkYXRlX3Njcm9sbGJhcnMoVFJVRSk7CisgICAgZ3VpX3Jlc2V0X3Njcm9sbF9yZWdpb24oKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIFJvd3MgYW5kL29yIENvbHVtbnMgaGFzIGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitndWlfbmV3X3NoZWxsc2l6ZSgpCit7CisgICAgZ3VpX3Jlc2V0X3Njcm9sbF9yZWdpb24oKTsKK30KKworLyoKKyAqIE1ha2Ugc2Nyb2xsIHJlZ2lvbiBjb3ZlciB3aG9sZSBzY3JlZW4uCisgKi8KKyAgICB2b2lkCitndWlfcmVzZXRfc2Nyb2xsX3JlZ2lvbigpCit7CisgICAgZ3VpLnNjcm9sbF9yZWdpb25fdG9wID0gMDsKKyAgICBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgPSBndWkubnVtX3Jvd3MgLSAxOworICAgIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQgPSAwOworICAgIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ID0gZ3VpLm51bV9jb2xzIC0gMTsKK30KKworICAgIHZvaWQKK2d1aV9zdGFydF9oaWdobGlnaHQobWFzaykKKyAgICBpbnQJICAgIG1hc2s7Cit7CisgICAgaWYgKG1hc2sgPiBITF9BTEwpCQkgICAgLyogaGlnaGxpZ2h0IGNvZGUgKi8KKwlndWkuaGlnaGxpZ2h0X21hc2sgPSBtYXNrOworICAgIGVsc2UJCQkgICAgLyogbWFzayAqLworCWd1aS5oaWdobGlnaHRfbWFzayB8PSBtYXNrOworfQorCisgICAgdm9pZAorZ3VpX3N0b3BfaGlnaGxpZ2h0KG1hc2spCisgICAgaW50CSAgICBtYXNrOworeworICAgIGlmIChtYXNrID4gSExfQUxMKQkJICAgIC8qIGhpZ2hsaWdodCBjb2RlICovCisJZ3VpLmhpZ2hsaWdodF9tYXNrID0gSExfTk9STUFMOworICAgIGVsc2UJCQkgICAgLyogbWFzayAqLworCWd1aS5oaWdobGlnaHRfbWFzayAmPSB+bWFzazsKK30KKworLyoKKyAqIENsZWFyIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRoZSBzY3JlZW4gZnJvbSB0ZXh0IHBvcyAocm93MSwgY29sMSkgdG8KKyAqIChyb3cyLCBjb2wyKSBpbmNsdXNpdmUuCisgKi8KKyAgICB2b2lkCitndWlfY2xlYXJfYmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMikKKyAgICBpbnQJICAgIHJvdzE7CisgICAgaW50CSAgICBjb2wxOworICAgIGludAkgICAgcm93MjsKKyAgICBpbnQJICAgIGNvbDI7Cit7CisgICAgLyogQ2xlYXIgdGhlIHNlbGVjdGlvbiBpZiB3ZSBhcmUgYWJvdXQgdG8gd3JpdGUgb3ZlciBpdCAqLworICAgIGNsaXBfbWF5X2NsZWFyX3NlbGVjdGlvbihyb3cxLCByb3cyKTsKKworICAgIGd1aV9tY2hfY2xlYXJfYmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMik7CisKKyAgICAvKiBJbnZhbGlkYXRlIGN1cnNvciBpZiBpdCB3YXMgaW4gdGhpcyBibG9jayAqLworICAgIGlmICggICAgICAgZ3VpLmN1cnNvcl9yb3cgPj0gcm93MSAmJiBndWkuY3Vyc29yX3JvdyA8PSByb3cyCisJICAgICYmIGd1aS5jdXJzb3JfY29sID49IGNvbDEgJiYgZ3VpLmN1cnNvcl9jb2wgPD0gY29sMikKKwlndWkuY3Vyc29yX2lzX3ZhbGlkID0gRkFMU0U7Cit9CisKKy8qCisgKiBXcml0ZSBjb2RlIHRvIHVwZGF0ZSB0aGUgY3Vyc29yIGxhdGVyLiAgVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gZmx1c2ggdGhlCisgKiBvdXRwdXQgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIGd1aV91cGRhdGVfY3Vyc29yKCkuCisgKi8KKyAgICB2b2lkCitndWlfdXBkYXRlX2N1cnNvcl9sYXRlcigpCit7CisgICAgT1VUX1NUUihJRl9FQigiXDAzM3xzIiwgRVNDX1NUUiAifHMiKSk7Cit9CisKKyAgICB2b2lkCitndWlfd3JpdGUocywgbGVuKQorICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlhcmcxID0gMCwgYXJnMiA9IDA7CisgICAgLyogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UsIGRpc2FibGVkIHVudGlsIHNvbWVvbmUgY2FuIGV4cGxhaW4gd2h5IGl0CisgICAgICogd291bGQgYmUgbmVlZGVkICovCisjaWYgMCAmJiAoZGVmaW5lZChSSVNDT1MpIHx8IGRlZmluZWQoV0lOMTYpKQorICAgIGludAkJZm9yY2VfY3Vyc29yID0gVFJVRTsJLyogSksyMzA3OTgsIHN0b3AgVmltIGJlaW5nIHNtYXJ0IG9yCisJCQkJCSAgIG91ciByZWRyYXcgc3BlZWQgd2lsbCBzdWZmZXIgKi8KKyNlbHNlCisgICAgaW50CQlmb3JjZV9jdXJzb3IgPSBGQUxTRTsJLyogZm9yY2UgY3Vyc29yIHVwZGF0ZSAqLworI2VuZGlmCisgICAgaW50CQlmb3JjZV9zY3JvbGxiYXIgPSBGQUxTRTsKKyAgICBzdGF0aWMgd2luX1QJKm9sZF9jdXJ3aW4gPSBOVUxMOworCisvKiAjZGVmaW5lIERFQlVHX0dVSV9XUklURSAqLworI2lmZGVmIERFQlVHX0dVSV9XUklURQorICAgIHsKKwlpbnQgaTsKKwljaGFyX3UgKnN0cjsKKworCXByaW50ZigiZ3VpX3dyaXRlKCVkKTpcbiAgICAiLCBsZW4pOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkgICAgaWYgKHNbaV0gPT0gRVNDKQorCSAgICB7CisJCWlmIChpICE9IDApCisJCSAgICBwcmludGYoIlxuICAgICIpOworCQlwcmludGYoIjxFU0M+Iik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXN0ciA9IHRyYW5zY2hhcl9ieXRlKHNbaV0pOworCQlpZiAoc3RyWzBdICYmIHN0clsxXSkKKwkJICAgIHByaW50ZigiPCVzPiIsIChjaGFyICopc3RyKTsKKwkJZWxzZQorCQkgICAgcHJpbnRmKCIlcyIsIChjaGFyICopc3RyKTsKKwkgICAgfQorCXByaW50ZigiXG4iKTsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZSAobGVuKQorICAgIHsKKwlpZiAoc1swXSA9PSBFU0MgJiYgc1sxXSA9PSAnfCcpCisJeworCSAgICBwID0gcyArIDI7CisJICAgIGlmIChWSU1fSVNESUdJVCgqcCkpCisJICAgIHsKKwkJYXJnMSA9IGdldGRpZ2l0cygmcCk7CisJCWlmIChwID4gcyArIGxlbikKKwkJICAgIGJyZWFrOworCQlpZiAoKnAgPT0gJzsnKQorCQl7CisJCSAgICArK3A7CisJCSAgICBhcmcyID0gZ2V0ZGlnaXRzKCZwKTsKKwkJICAgIGlmIChwID4gcyArIGxlbikKKwkJCWJyZWFrOworCQl9CisJICAgIH0KKwkgICAgc3dpdGNoICgqcCkKKwkgICAgeworCQljYXNlICdDJzoJLyogQ2xlYXIgc2NyZWVuICovCisJCSAgICBjbGlwX3Njcm9sbF9zZWxlY3Rpb24oOTk5OSk7CisJCSAgICBndWlfbWNoX2NsZWFyX2FsbCgpOworCQkgICAgZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworCQkgICAgZm9yY2Vfc2Nyb2xsYmFyID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQljYXNlICdNJzoJLyogTW92ZSBjdXJzb3IgKi8KKwkJICAgIGd1aV9zZXRfY3Vyc29yKGFyZzEsIGFyZzIpOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ3MnOgkvKiBmb3JjZSBjdXJzb3IgKHNoYXBlKSB1cGRhdGUgKi8KKwkJICAgIGZvcmNlX2N1cnNvciA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJY2FzZSAnUic6CS8qIFNldCBzY3JvbGwgcmVnaW9uICovCisJCSAgICBpZiAoYXJnMSA8IGFyZzIpCisJCSAgICB7CisJCQlndWkuc2Nyb2xsX3JlZ2lvbl90b3AgPSBhcmcxOworCQkJZ3VpLnNjcm9sbF9yZWdpb25fYm90ID0gYXJnMjsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWd1aS5zY3JvbGxfcmVnaW9uX3RvcCA9IGFyZzI7CisJCQlndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgPSBhcmcxOworCQkgICAgfQorCQkgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJY2FzZSAnVic6CS8qIFNldCB2ZXJ0aWNhbCBzY3JvbGwgcmVnaW9uICovCisJCSAgICBpZiAoYXJnMSA8IGFyZzIpCisJCSAgICB7CisJCQlndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0ID0gYXJnMTsKKwkJCWd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ID0gYXJnMjsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWd1aS5zY3JvbGxfcmVnaW9uX2xlZnQgPSBhcmcyOworCQkJZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgPSBhcmcxOworCQkgICAgfQorCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnZCc6CS8qIERlbGV0ZSBsaW5lICovCisJCSAgICBndWlfZGVsZXRlX2xpbmVzKGd1aS5yb3csIDEpOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ0QnOgkvKiBEZWxldGUgbGluZXMgKi8KKwkJICAgIGd1aV9kZWxldGVfbGluZXMoZ3VpLnJvdywgYXJnMSk7CisJCSAgICBicmVhazsKKwkJY2FzZSAnaSc6CS8qIEluc2VydCBsaW5lICovCisJCSAgICBndWlfaW5zZXJ0X2xpbmVzKGd1aS5yb3csIDEpOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ0knOgkvKiBJbnNlcnQgbGluZXMgKi8KKwkJICAgIGd1aV9pbnNlcnRfbGluZXMoZ3VpLnJvdywgYXJnMSk7CisJCSAgICBicmVhazsKKwkJY2FzZSAnJCc6CS8qIENsZWFyIHRvIGVuZC1vZi1saW5lICovCisJCSAgICBndWlfY2xlYXJfYmxvY2soZ3VpLnJvdywgZ3VpLmNvbCwgZ3VpLnJvdywKKwkJCQkJCQkgICAgKGludClDb2x1bW5zIC0gMSk7CisJCSAgICBicmVhazsKKwkJY2FzZSAnaCc6CS8qIFR1cm4gb24gaGlnaGxpZ2h0aW5nICovCisJCSAgICBndWlfc3RhcnRfaGlnaGxpZ2h0KGFyZzEpOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ0gnOgkvKiBUdXJuIG9mZiBoaWdobGlnaHRpbmcgKi8KKwkJICAgIGd1aV9zdG9wX2hpZ2hsaWdodChhcmcxKTsKKwkJICAgIGJyZWFrOworCQljYXNlICdmJzoJLyogZmxhc2ggdGhlIHdpbmRvdyAodmlzdWFsIGJlbGwpICovCisJCSAgICBndWlfbWNoX2ZsYXNoKGFyZzEgPT0gMCA/IDIwIDogYXJnMSk7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHAgPSBzICsgMTsJLyogU2tpcCB0aGUgRVNDICovCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBsZW4gLT0gKGludCkoKytwIC0gcyk7CisJICAgIHMgPSBwOworCX0KKwllbHNlIGlmICgKKyNpZmRlZiBFQkNESUMKKwkJQ3RybENoYXIoc1swXSkgIT0gMAkvKiBDdHJsIGNoYXJhY3RlciAqLworI2Vsc2UKKwkJc1swXSA8IDB4MjAJCS8qIEN0cmwgY2hhcmFjdGVyICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NJR05fSUNPTlMKKwkJJiYgc1swXSAhPSBTSUdOX0JZVEUKKyMgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJCSYmIHNbMF0gIT0gTVVMVElTSUdOX0JZVEUKKyMgZW5kaWYKKyNlbmRpZgorCQkpCisJeworCSAgICBpZiAoc1swXSA9PSAnXG4nKQkJLyogTkwgKi8KKwkgICAgeworCQlndWkuY29sID0gMDsKKwkJaWYgKGd1aS5yb3cgPCBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QpCisJCSAgICBndWkucm93Kys7CisJCWVsc2UKKwkJICAgIGd1aV9kZWxldGVfbGluZXMoZ3VpLnNjcm9sbF9yZWdpb25fdG9wLCAxKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChzWzBdID09ICdccicpCS8qIENSICovCisJICAgIHsKKwkJZ3VpLmNvbCA9IDA7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoc1swXSA9PSAnXGInKQkvKiBCYWNrc3BhY2UgKi8KKwkgICAgeworCQlpZiAoZ3VpLmNvbCkKKwkJICAgIC0tZ3VpLmNvbDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChzWzBdID09IEN0cmxfTCkJLyogY3Vyc29yLXJpZ2h0ICovCisJICAgIHsKKwkJKytndWkuY29sOworCSAgICB9CisJICAgIGVsc2UgaWYgKHNbMF0gPT0gQ3RybF9HKQkvKiBCZWVwICovCisJICAgIHsKKwkJZ3VpX21jaF9iZWVwKCk7CisJICAgIH0KKwkgICAgLyogT3RoZXIgQ3RybCBjaGFyYWN0ZXI6IHNob3VsZG4ndCBoYXBwZW4hICovCisKKwkgICAgLS1sZW47CS8qIFNraXAgdGhpcyBjaGFyICovCisJICAgICsrczsKKwl9CisJZWxzZQorCXsKKwkgICAgcCA9IHM7CisJICAgIHdoaWxlIChsZW4gPiAwICYmICgKKyNpZmRlZiBFQkNESUMKKwkJCUN0cmxDaGFyKCpwKSA9PSAwCisjZWxzZQorCQkJKnAgPj0gMHgyMAorI2VuZGlmCisjaWZkZWYgRkVBVF9TSUdOX0lDT05TCisJCQl8fCAqcCA9PSBTSUdOX0JZVEUKKyMgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJCQl8fCAqcCA9PSBNVUxUSVNJR05fQllURQorIyBlbmRpZgorI2VuZGlmCisJCQkpKQorCSAgICB7CisJCWxlbi0tOworCQlwKys7CisJICAgIH0KKwkgICAgZ3VpX291dHN0cihzLCAoaW50KShwIC0gcykpOworCSAgICBzID0gcDsKKwl9CisgICAgfQorCisgICAgLyogUG9zdHBvbmVkIHVwZGF0ZSBvZiB0aGUgY3Vyc29yICh3b24ndCB3b3JrIGlmICJjYW5fdXBkYXRlX2N1cnNvciIgaXNuJ3QKKyAgICAgKiBzZXQpLiAqLworICAgIGlmIChmb3JjZV9jdXJzb3IpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgVFJVRSk7CisKKyAgICAvKiBXaGVuIHN3aXRjaGluZyB0byBhbm90aGVyIHdpbmRvdyB0aGUgZHJhZ2dpbmcgbXVzdCBoYXZlIHN0b3BwZWQuCisgICAgICogUmVxdWlyZWQgZm9yIEdUSywgZHJhZ2dlZF9zYiBpc24ndCByZXNldC4gKi8KKyAgICBpZiAob2xkX2N1cndpbiAhPSBjdXJ3aW4pCisJZ3VpLmRyYWdnZWRfc2IgPSBTQkFSX05PTkU7CisKKyAgICAvKiBVcGRhdGUgdGhlIHNjcm9sbGJhcnMgYWZ0ZXIgY2xlYXJpbmcgdGhlIHNjcmVlbiBvciB3aGVuIHN3aXRjaGVkCisgICAgICogdG8gYW5vdGhlciB3aW5kb3cuCisgICAgICogVXBkYXRlIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBhbHdheXMsIGl0J3MgZGlmZmljdWx0IHRvIGNoZWNrIGFsbAorICAgICAqIHNpdHVhdGlvbnMgd2hlcmUgaXQgbWlnaHQgY2hhbmdlLiAqLworICAgIGlmIChmb3JjZV9zY3JvbGxiYXIgfHwgb2xkX2N1cndpbiAhPSBjdXJ3aW4pCisJZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKGZvcmNlX3Njcm9sbGJhcik7CisgICAgZWxzZQorCWd1aV91cGRhdGVfaG9yaXpfc2Nyb2xsYmFyKEZBTFNFKTsKKyAgICBvbGRfY3Vyd2luID0gY3Vyd2luOworCisgICAgLyoKKyAgICAgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGNsZWFyZWQgc2luY2UgQXRoZW5hIGRvZXNuJ3QgdGVsbCB1cyB3aGVuCisgICAgICogaGUgaXMgZG9uZSBkcmFnZ2luZy4gIERvIHRoZSBzYW1lIGZvciBHVEsuCisgICAgICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKQorICAgIGd1aS5kcmFnZ2VkX3NiID0gU0JBUl9OT05FOworI2VuZGlmCisKKyAgICBndWlfbWNoX2ZsdXNoKCk7CQkgICAgLyogSW4gY2FzZSB2aW0gZGVjaWRlcyB0byB0YWtlIGEgbmFwICovCit9CisKKy8qCisgKiBXaGVuIFNjcmVlbkxpbmVzW10gaXMgaW52YWxpZCwgdXBkYXRpbmcgdGhlIGN1cnNvciBzaG91bGQgbm90IGJlIGRvbmUsIGl0CisgKiBwcm9kdWNlcyB3cm9uZyByZXN1bHRzLiAgQ2FsbCBndWlfZG9udF91cGRhdGVfY3Vyc29yKCkgYmVmb3JlIHRoYXQgY29kZSBhbmQKKyAqIGd1aV9jYW5fdXBkYXRlX2N1cnNvcigpIGFmdGVyd2FyZHMuCisgKi8KKyAgICB2b2lkCitndWlfZG9udF91cGRhdGVfY3Vyc29yKCkKK3sKKyAgICBpZiAoZ3VpLmluX3VzZSkKKyAgICB7CisJLyogVW5kcmF3IHRoZSBjdXJzb3Igbm93LCB3ZSBwcm9iYWJseSBjYW4ndCBkbyBpdCBhZnRlciB0aGUgY2hhbmdlLiAqLworCWd1aV91bmRyYXdfY3Vyc29yKCk7CisJY2FuX3VwZGF0ZV9jdXJzb3IgPSBGQUxTRTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfY2FuX3VwZGF0ZV9jdXJzb3IoKQoreworICAgIGNhbl91cGRhdGVfY3Vyc29yID0gVFJVRTsKKyAgICAvKiBObyBuZWVkIHRvIHVwZGF0ZSB0aGUgY3Vyc29yIHJpZ2h0IG5vdywgdGhlcmUgaXMgYWx3YXlzIG1vcmUgb3V0cHV0CisgICAgICogYWZ0ZXIgc2Nyb2xsaW5nLiAqLworfQorCisgICAgc3RhdGljIHZvaWQKK2d1aV9vdXRzdHIocywgbGVuKQorICAgIGNoYXJfdSAgKnM7CisgICAgaW50CSAgICBsZW47Cit7CisgICAgaW50CSAgICB0aGlzX2xlbjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CSAgICBjZWxsczsKKyNlbmRpZgorCisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybjsKKworICAgIGlmIChsZW4gPCAwKQorCWxlbiA9IChpbnQpU1RSTEVOKHMpOworCisgICAgd2hpbGUgKGxlbiA+IDApCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgLyogRmluZCBvdXQgaG93IG1hbnkgY2hhcnMgZml0IGluIHRoZSBjdXJyZW50IGxpbmUuICovCisJICAgIGNlbGxzID0gMDsKKwkgICAgZm9yICh0aGlzX2xlbiA9IDA7IHRoaXNfbGVuIDwgbGVuOyApCisJICAgIHsKKwkJY2VsbHMgKz0gKCptYl9wdHIyY2VsbHMpKHMgKyB0aGlzX2xlbik7CisJCWlmIChndWkuY29sICsgY2VsbHMgPiBDb2x1bW5zKQorCQkgICAgYnJlYWs7CisJCXRoaXNfbGVuICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocyArIHRoaXNfbGVuKTsKKwkgICAgfQorCSAgICBpZiAodGhpc19sZW4gPiBsZW4pCisJCXRoaXNfbGVuID0gbGVuOwkgICAgLyogZG9uJ3QgaW5jbHVkZSBmb2xsb3dpbmcgY29tcG9zaW5nIGNoYXIgKi8KKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGlmIChndWkuY29sICsgbGVuID4gQ29sdW1ucykKKwkgICAgdGhpc19sZW4gPSBDb2x1bW5zIC0gZ3VpLmNvbDsKKwllbHNlCisJICAgIHRoaXNfbGVuID0gbGVuOworCisJKHZvaWQpZ3VpX291dHN0cl9ub3dyYXAocywgdGhpc19sZW4sCisJCQkJCSAgMCwgKGd1aWNvbG9yX1QpMCwgKGd1aWNvbG9yX1QpMCwgMCk7CisJcyArPSB0aGlzX2xlbjsKKwlsZW4gLT0gdGhpc19sZW47CisjaWZkZWYgRkVBVF9NQllURQorCS8qIGZpbGwgdXAgZm9yIGEgZG91YmxlLXdpZHRoIGNoYXIgdGhhdCBkb2Vzbid0IGZpdC4gKi8KKwlpZiAobGVuID4gMCAmJiBndWkuY29sIDwgQ29sdW1ucykKKwkgICAgKHZvaWQpZ3VpX291dHN0cl9ub3dyYXAoKGNoYXJfdSAqKSIgIiwgMSwKKwkJCQkJICAwLCAoZ3VpY29sb3JfVCkwLCAoZ3VpY29sb3JfVCkwLCAwKTsKKyNlbmRpZgorCS8qIFRoZSBjdXJzb3IgbWF5IHdyYXAgdG8gdGhlIG5leHQgbGluZS4gKi8KKwlpZiAoZ3VpLmNvbCA+PSBDb2x1bW5zKQorCXsKKwkgICAgZ3VpLmNvbCA9IDA7CisJICAgIGd1aS5yb3crKzsKKwl9CisgICAgfQorfQorCisvKgorICogT3V0cHV0IG9uZSBjaGFyYWN0ZXIgKG1heSBiZSBvbmUgb3IgdHdvIGRpc3BsYXkgY2VsbHMpLgorICogQ2FsbGVyIG11c3QgY2hlY2sgZm9yIHZhbGlkICJvZmYiLgorICogUmV0dXJucyBGQUlMIG9yIE9LLCBqdXN0IGxpa2UgZ3VpX291dHN0cl9ub3dyYXAoKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2d1aV9zY3JlZW5jaGFyKG9mZiwgZmxhZ3MsIGZnLCBiZywgYmFjaykKKyAgICBpbnQJCW9mZjsJICAgIC8qIE9mZnNldCBmcm9tIHN0YXJ0IG9mIHNjcmVlbiAqLworICAgIGludAkJZmxhZ3M7CisgICAgZ3VpY29sb3JfVAlmZywgYmc7CSAgICAvKiBjb2xvcnMgZm9yIGN1cnNvciAqLworICAgIGludAkJYmFjazsJICAgIC8qIGJhY2t1cCB0aGlzIG1hbnkgY2hhcnMgd2hlbiB1c2luZyBib2xkIHRyaWNrICovCit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdQlidWZbTUJfTUFYQllURVMgKyAxXTsKKworICAgIC8qIERvbid0IGRyYXcgcmlnaHQgaGFsdmUgb2YgYSBkb3VibGUtd2lkdGggVVRGLTggY2hhci4gImNhbm5vdCBoYXBwZW4iICovCisgICAgaWYgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzW29mZl0gPT0gMCkKKwlyZXR1cm4gT0s7CisKKyAgICBpZiAoZW5jX3V0ZjggJiYgU2NyZWVuTGluZXNVQ1tvZmZdICE9IDApCisJLyogRHJhdyBVVEYtOCBtdWx0aS1ieXRlIGNoYXJhY3Rlci4gKi8KKwlyZXR1cm4gZ3VpX291dHN0cl9ub3dyYXAoYnVmLCB1dGZjX2NoYXIyYnl0ZXMob2ZmLCBidWYpLAorCQkJCQkJCSBmbGFncywgZmcsIGJnLCBiYWNrKTsKKworICAgIGlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgU2NyZWVuTGluZXNbb2ZmXSA9PSAweDhlKQorICAgIHsKKwlidWZbMF0gPSBTY3JlZW5MaW5lc1tvZmZdOworCWJ1ZlsxXSA9IFNjcmVlbkxpbmVzMltvZmZdOworCXJldHVybiBndWlfb3V0c3RyX25vd3JhcChidWYsIDIsIGZsYWdzLCBmZywgYmcsIGJhY2spOworICAgIH0KKworICAgIC8qIERyYXcgbm9uLW11bHRpLWJ5dGUgY2hhcmFjdGVyIG9yIERCQ1MgY2hhcmFjdGVyLiAqLworICAgIHJldHVybiBndWlfb3V0c3RyX25vd3JhcChTY3JlZW5MaW5lcyArIG9mZiwKKwkgICAgZW5jX2RiY3MgPyAoKm1iX3B0cjJsZW5fY2hlY2spKFNjcmVlbkxpbmVzICsgb2ZmKSA6IDEsCisJCQkJCQkJIGZsYWdzLCBmZywgYmcsIGJhY2spOworI2Vsc2UKKyAgICByZXR1cm4gZ3VpX291dHN0cl9ub3dyYXAoU2NyZWVuTGluZXMgKyBvZmYsIDEsIGZsYWdzLCBmZywgYmcsIGJhY2spOworI2VuZGlmCit9CisKKyNpZmRlZiBIQVZFX0dUSzIKKy8qCisgKiBPdXRwdXQgdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4gc2NyZWVuIHBvc2l0aW9uLiAgVGhpcyBpcyB1c2VkIGluIHBsYWNlCisgKiBvZiBndWlfc2NyZWVuY2hhcigpIHdoZXJlIHBvc3NpYmxlIGJlY2F1c2UgUGFuZ28gbmVlZHMgYXMgbXVjaCBjb250ZXh0CisgKiBhcyBwb3NzaWJsZSB0byB3b3JrIG5pY2VseS4gIEl0J3MgYSBsb3QgZmFzdGVyIGFzIHdlbGwuCisgKi8KKyAgICBzdGF0aWMgaW50CitndWlfc2NyZWVuc3RyKG9mZiwgbGVuLCBmbGFncywgZmcsIGJnLCBiYWNrKQorICAgIGludAkJb2ZmOwkgICAgLyogT2Zmc2V0IGZyb20gc3RhcnQgb2Ygc2NyZWVuICovCisgICAgaW50CQlsZW47CSAgICAvKiBzdHJpbmcgbGVuZ3RoIGluIHNjcmVlbiBjZWxscyAqLworICAgIGludAkJZmxhZ3M7CisgICAgZ3VpY29sb3JfVAlmZywgYmc7CSAgICAvKiBjb2xvcnMgZm9yIGN1cnNvciAqLworICAgIGludAkJYmFjazsJICAgIC8qIGJhY2t1cCB0aGlzIG1hbnkgY2hhcnMgd2hlbiB1c2luZyBib2xkIHRyaWNrICovCit7CisgICAgY2hhcl91ICAqYnVmOworICAgIGludAkgICAgb3V0bGVuID0gMDsKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICByZXR2YWw7CisKKyAgICBpZiAobGVuIDw9IDApIC8qICJjYW5ub3QgaGFwcGVuIj8gKi8KKwlyZXR1cm4gT0s7CisKKyAgICBpZiAoZW5jX3V0ZjgpCisgICAgeworCWJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkobGVuICogTUJfTUFYQllURVMgKyAxKSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICByZXR1cm4gT0s7IC8qIG5vdCBtdWNoIHdlIGNvdWxkIGRvIGhlcmUuLi4gKi8KKworCWZvciAoaSA9IG9mZjsgaSA8IG9mZiArIGxlbjsgKytpKQorCXsKKwkgICAgaWYgKFNjcmVlbkxpbmVzW2ldID09IDApCisJCWNvbnRpbnVlOyAvKiBza2lwIHNlY29uZCBoYWxmIG9mIGRvdWJsZS13aWR0aCBjaGFyICovCisKKwkgICAgaWYgKFNjcmVlbkxpbmVzVUNbaV0gPT0gMCkKKwkJYnVmW291dGxlbisrXSA9IFNjcmVlbkxpbmVzW2ldOworCSAgICBlbHNlCisJCW91dGxlbiArPSB1dGZjX2NoYXIyYnl0ZXMoaSwgYnVmICsgb3V0bGVuKTsKKwl9CisKKwlidWZbb3V0bGVuXSA9IE5VTDsgLyogb25seSB0byBhaWQgZGVidWdnaW5nICovCisJcmV0dmFsID0gZ3VpX291dHN0cl9ub3dyYXAoYnVmLCBvdXRsZW4sIGZsYWdzLCBmZywgYmcsIGJhY2spOworCXZpbV9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICBlbHNlIGlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUpCisgICAgeworCWJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkobGVuICogMiArIDEpKTsKKwlpZiAoYnVmID09IE5VTEwpCisJICAgIHJldHVybiBPSzsgLyogbm90IG11Y2ggd2UgY291bGQgZG8gaGVyZS4uLiAqLworCisJZm9yIChpID0gb2ZmOyBpIDwgb2ZmICsgbGVuOyArK2kpCisJeworCSAgICBidWZbb3V0bGVuKytdID0gU2NyZWVuTGluZXNbaV07CisKKwkgICAgLyogaGFuZGxlIGRvdWJsZS1ieXRlIHNpbmdsZS13aWR0aCBjaGFyICovCisJICAgIGlmIChTY3JlZW5MaW5lc1tpXSA9PSAweDhlKQorCQlidWZbb3V0bGVuKytdID0gU2NyZWVuTGluZXMyW2ldOworCSAgICBlbHNlIGlmIChNQl9CWVRFMkxFTihTY3JlZW5MaW5lc1tpXSkgPT0gMikKKwkJYnVmW291dGxlbisrXSA9IFNjcmVlbkxpbmVzWysraV07CisJfQorCisJYnVmW291dGxlbl0gPSBOVUw7IC8qIG9ubHkgdG8gYWlkIGRlYnVnZ2luZyAqLworCXJldHZhbCA9IGd1aV9vdXRzdHJfbm93cmFwKGJ1Ziwgb3V0bGVuLCBmbGFncywgZmcsIGJnLCBiYWNrKTsKKwl2aW1fZnJlZShidWYpOworCisJcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXR1cm4gZ3VpX291dHN0cl9ub3dyYXAoJlNjcmVlbkxpbmVzW29mZl0sIGxlbiwKKwkJCQkgZmxhZ3MsIGZnLCBiZywgYmFjayk7CisgICAgfQorfQorI2VuZGlmIC8qIEhBVkVfR1RLMiAqLworCisvKgorICogT3V0cHV0IHRoZSBnaXZlbiBzdHJpbmcgYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAgSWYgdGhlIHN0cmluZyBpcworICogdG9vIGxvbmcgdG8gZml0IG9uIHRoZSBsaW5lLCB0aGVuIGl0IGlzIHRydW5jYXRlZC4KKyAqICJmbGFncyI6CisgKiBHVUlfTU9OX0lTX0NVUlNPUiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgdG8KKyAqIGFjdHVhbGx5IGRyYXcgKGFuIGludmVydGVkKSBjdXJzb3IuCisgKiBHVUlfTU9OX1RSU19DVVJTT1IgaXMgdXNlZCB0byBkcmF3IHRoZSBjdXJzb3IgdGV4dCB3aXRoIGEgdHJhbnNwYXJhbnQKKyAqIGJhY2tncm91bmQuCisgKiBHVUlfTU9OX05PQ0xFQVIgaXMgdXNlZCB0byBhdm9pZCBjbGVhcmluZyB0aGUgc2VsZWN0aW9uIHdoZW4gZHJhd2luZyBvdmVyCisgKiBpdC4KKyAqIFJldHVybnMgT0ssIHVubGVzcyAiYmFjayIgaXMgbm9uLXplcm8gYW5kIHVzaW5nIHRoZSBib2xkIHRyaWNrLCB0aGVuIHJldHVybgorICogRkFJTCAodGhlIGNhbGxlciBzaG91bGQgc3RhcnQgZHJhd2luZyAiYmFjayIgY2hhcnMgYmFjaykuCisgKi8KKyAgICBpbnQKK2d1aV9vdXRzdHJfbm93cmFwKHMsIGxlbiwgZmxhZ3MsIGZnLCBiZywgYmFjaykKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmbGFnczsKKyAgICBndWljb2xvcl9UCWZnLCBiZzsJICAgIC8qIGNvbG9ycyBmb3IgY3Vyc29yICovCisgICAgaW50CQliYWNrOwkgICAgLyogYmFja3VwIHRoaXMgbWFueSBjaGFycyB3aGVuIHVzaW5nIGJvbGQgdHJpY2sgKi8KK3sKKyAgICBsb25nX3UJaGlnaGxpZ2h0X21hc2s7CisgICAgbG9uZ191CWhsX21hc2tfdG9kbzsKKyAgICBndWljb2xvcl9UCWZnX2NvbG9yOworICAgIGd1aWNvbG9yX1QJYmdfY29sb3I7CisjaWYgIWRlZmluZWQoTVNXSU4xNl9GQVNUVEVYVCkgJiYgIWRlZmluZWQoSEFWRV9HVEsyKQorICAgIEd1aUZvbnQJZm9udCA9IE5PRk9OVDsKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIEd1aUZvbnRzZXQJZm9udHNldCA9IE5PRk9OVFNFVDsKKyMgZW5kaWYKKyNlbmRpZgorICAgIGF0dHJlbnRyeV9UCSphZXAgPSBOVUxMOworICAgIGludAkJZHJhd19mbGFnczsKKyAgICBpbnQJCWNvbCA9IGd1aS5jb2w7CisjaWZkZWYgRkVBVF9TSUdOX0lDT05TCisgICAgaW50CQlkcmF3X3NpZ24gPSBGQUxTRTsKKyMgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaW50CQltdWx0aV9zaWduID0gRkFMU0U7CisjIGVuZGlmCisjZW5kaWYKKworICAgIGlmIChsZW4gPCAwKQorCWxlbiA9IChpbnQpU1RSTEVOKHMpOworICAgIGlmIChsZW4gPT0gMCkKKwlyZXR1cm4gT0s7CisKKyNpZmRlZiBGRUFUX1NJR05fSUNPTlMKKyAgICBpZiAoKnMgPT0gU0lHTl9CWVRFCisjIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCSAgfHwgKnMgPT0gTVVMVElTSUdOX0JZVEUKKyMgZW5kaWYKKyAgICApCisgICAgeworIyBpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwlpZiAoKnMgPT0gTVVMVElTSUdOX0JZVEUpCisJICAgIG11bHRpX3NpZ24gPSBUUlVFOworIyBlbmRpZgorCS8qIGRyYXcgc3BhY2VzIGluc3RlYWQgKi8KKwlzID0gKGNoYXJfdSAqKSIgICI7CisJaWYgKGxlbiA9PSAxICYmIGNvbCA+IDApCisJICAgIC0tY29sOworCWxlbiA9IDI7CisJZHJhd19zaWduID0gVFJVRTsKKwloaWdobGlnaHRfbWFzayA9IDA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChndWkuaGlnaGxpZ2h0X21hc2sgPiBITF9BTEwpCisgICAgeworCWFlcCA9IHN5bl9ndWlfYXR0cjJlbnRyeShndWkuaGlnaGxpZ2h0X21hc2spOworCWlmIChhZXAgPT0gTlVMTCkJICAgIC8qIGhpZ2hsaWdodGluZyBub3Qgc2V0ICovCisJICAgIGhpZ2hsaWdodF9tYXNrID0gMDsKKwllbHNlCisJICAgIGhpZ2hsaWdodF9tYXNrID0gYWVwLT5hZV9hdHRyOworICAgIH0KKyAgICBlbHNlCisJaGlnaGxpZ2h0X21hc2sgPSBndWkuaGlnaGxpZ2h0X21hc2s7CisgICAgaGxfbWFza190b2RvID0gaGlnaGxpZ2h0X21hc2s7CisKKyNpZiAhZGVmaW5lZChNU1dJTjE2X0ZBU1RURVhUKSAmJiAhZGVmaW5lZChIQVZFX0dUSzIpCisgICAgLyogU2V0IHRoZSBmb250ICovCisgICAgaWYgKGFlcCAhPSBOVUxMICYmIGFlcC0+YWVfdS5ndWkuZm9udCAhPSBOT0ZPTlQpCisJZm9udCA9IGFlcC0+YWVfdS5ndWkuZm9udDsKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGVsc2UgaWYgKGFlcCAhPSBOVUxMICYmIGFlcC0+YWVfdS5ndWkuZm9udHNldCAhPSBOT0ZPTlRTRVQpCisJZm9udHNldCA9IGFlcC0+YWVfdS5ndWkuZm9udHNldDsKKyMgZW5kaWYKKyAgICBlbHNlCisgICAgeworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisJaWYgKGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVCkKKwkgICAgZm9udHNldCA9IGd1aS5mb250c2V0OworCWVsc2UKKyMgZW5kaWYKKwkgICAgaWYgKGhsX21hc2tfdG9kbyAmIChITF9CT0xEIHwgSExfU1RBTkRPVVQpKQorCXsKKwkgICAgaWYgKChobF9tYXNrX3RvZG8gJiBITF9JVEFMSUMpICYmIGd1aS5ib2xkaXRhbF9mb250ICE9IE5PRk9OVCkKKwkgICAgeworCQlmb250ID0gZ3VpLmJvbGRpdGFsX2ZvbnQ7CisJCWhsX21hc2tfdG9kbyAmPSB+KEhMX0JPTEQgfCBITF9TVEFORE9VVCB8IEhMX0lUQUxJQyk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZ3VpLmJvbGRfZm9udCAhPSBOT0ZPTlQpCisJICAgIHsKKwkJZm9udCA9IGd1aS5ib2xkX2ZvbnQ7CisJCWhsX21hc2tfdG9kbyAmPSB+KEhMX0JPTEQgfCBITF9TVEFORE9VVCk7CisJICAgIH0KKwkgICAgZWxzZQorCQlmb250ID0gZ3VpLm5vcm1fZm9udDsKKwl9CisJZWxzZSBpZiAoKGhsX21hc2tfdG9kbyAmIEhMX0lUQUxJQykgJiYgZ3VpLml0YWxfZm9udCAhPSBOT0ZPTlQpCisJeworCSAgICBmb250ID0gZ3VpLml0YWxfZm9udDsKKwkgICAgaGxfbWFza190b2RvICY9IH5ITF9JVEFMSUM7CisJfQorCWVsc2UKKwkgICAgZm9udCA9IGd1aS5ub3JtX2ZvbnQ7CisgICAgfQorIyBpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgaWYgKGZvbnRzZXQgIT0gTk9GT05UU0VUKQorCWd1aV9tY2hfc2V0X2ZvbnRzZXQoZm9udHNldCk7CisgICAgZWxzZQorIyBlbmRpZgorCWd1aV9tY2hfc2V0X2ZvbnQoZm9udCk7CisjZW5kaWYKKworICAgIGRyYXdfZmxhZ3MgPSAwOworCisgICAgLyogU2V0IHRoZSBjb2xvciAqLworICAgIGJnX2NvbG9yID0gZ3VpLmJhY2tfcGl4ZWw7CisgICAgaWYgKChmbGFncyAmIEdVSV9NT05fSVNfQ1VSU09SKSAmJiBndWkuaW5fZm9jdXMpCisgICAgeworCWRyYXdfZmxhZ3MgfD0gRFJBV19DVVJTT1I7CisJZmdfY29sb3IgPSBmZzsKKwliZ19jb2xvciA9IGJnOworICAgIH0KKyAgICBlbHNlIGlmIChhZXAgIT0gTlVMTCkKKyAgICB7CisJZmdfY29sb3IgPSBhZXAtPmFlX3UuZ3VpLmZnX2NvbG9yOworCWlmIChmZ19jb2xvciA9PSBJTlZBTENPTE9SKQorCSAgICBmZ19jb2xvciA9IGd1aS5ub3JtX3BpeGVsOworCWJnX2NvbG9yID0gYWVwLT5hZV91Lmd1aS5iZ19jb2xvcjsKKwlpZiAoYmdfY29sb3IgPT0gSU5WQUxDT0xPUikKKwkgICAgYmdfY29sb3IgPSBndWkuYmFja19waXhlbDsKKyAgICB9CisgICAgZWxzZQorCWZnX2NvbG9yID0gZ3VpLm5vcm1fcGl4ZWw7CisKKyAgICBpZiAoaGlnaGxpZ2h0X21hc2sgJiAoSExfSU5WRVJTRSB8IEhMX1NUQU5ET1VUKSkKKyAgICB7CisjaWYgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChSSVNDT1MpCisJZ3VpX21jaF9zZXRfY29sb3JzKGJnX2NvbG9yLCBmZ19jb2xvcik7CisjZWxzZQorCWd1aV9tY2hfc2V0X2ZnX2NvbG9yKGJnX2NvbG9yKTsKKwlndWlfbWNoX3NldF9iZ19jb2xvcihmZ19jb2xvcik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKFJJU0NPUykKKwlndWlfbWNoX3NldF9jb2xvcnMoZmdfY29sb3IsIGJnX2NvbG9yKTsKKyNlbHNlCisJZ3VpX21jaF9zZXRfZmdfY29sb3IoZmdfY29sb3IpOworCWd1aV9tY2hfc2V0X2JnX2NvbG9yKGJnX2NvbG9yKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIENsZWFyIHRoZSBzZWxlY3Rpb24gaWYgd2UgYXJlIGFib3V0IHRvIHdyaXRlIG92ZXIgaXQgKi8KKyAgICBpZiAoIShmbGFncyAmIEdVSV9NT05fTk9DTEVBUikpCisJY2xpcF9tYXlfY2xlYXJfc2VsZWN0aW9uKGd1aS5yb3csIGd1aS5yb3cpOworCisKKyNpZm5kZWYgTVNXSU4xNl9GQVNUVEVYVAorICAgIC8qIElmIHRoZXJlJ3Mgbm8gYm9sZCBmb250LCB0aGVuIGZha2UgaXQgKi8KKyAgICBpZiAoaGxfbWFza190b2RvICYgKEhMX0JPTEQgfCBITF9TVEFORE9VVCkpCisJZHJhd19mbGFncyB8PSBEUkFXX0JPTEQ7CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2hlbiBkcmF3aW5nIGJvbGQgb3IgaXRhbGljIGNoYXJhY3RlcnMgdGhlIHNwaWxsLW92ZXIgZnJvbSB0aGUgbGVmdAorICAgICAqIG5laWdoYm9yIG1heSBiZSBkZXN0cm95ZWQuICBMZXQgdGhlIGNhbGxlciBiYWNrdXAgdG8gc3RhcnQgcmVkcmF3aW5nCisgICAgICoganVzdCBhZnRlciBhIGJsYW5rLgorICAgICAqLworICAgIGlmIChiYWNrICE9IDAgJiYgKChkcmF3X2ZsYWdzICYgRFJBV19CT0xEKSB8fCAoaGlnaGxpZ2h0X21hc2sgJiBITF9JVEFMSUMpKSkKKwlyZXR1cm4gRkFJTDsKKworI2lmIGRlZmluZWQoUklTQ09TKSB8fCBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICAvKiBJZiB0aGVyZSdzIG5vIGl0YWxpYyBmb250LCB0aGVuIGZha2UgaXQuCisgICAgICogRm9yIEdUSzIsIHdlIGRvbid0IG5lZWQgYSBkaWZmZXJlbnQgZm9udCBmb3IgaXRhbGljIHN0eWxlLiAqLworICAgIGlmIChobF9tYXNrX3RvZG8gJiBITF9JVEFMSUMpCisJZHJhd19mbGFncyB8PSBEUkFXX0lUQUxJQzsKKworICAgIC8qIERvIHdlIHVuZGVybGluZSB0aGUgdGV4dD8gKi8KKyAgICBpZiAoaGxfbWFza190b2RvICYgSExfVU5ERVJMSU5FKQorCWRyYXdfZmxhZ3MgfD0gRFJBV19VTkRFUkw7CisjZWxzZQorICAgIC8qIERvIHdlIHVuZGVybGluZSB0aGUgdGV4dD8gKi8KKyAgICBpZiAoKGhsX21hc2tfdG9kbyAmIEhMX1VOREVSTElORSkKKyMgaWZuZGVmIE1TV0lOMTZfRkFTVFRFWFQKKwkgICAgfHwgKGhsX21hc2tfdG9kbyAmIEhMX0lUQUxJQykKKyMgZW5kaWYKKyAgICAgICApCisJZHJhd19mbGFncyB8PSBEUkFXX1VOREVSTDsKKyNlbmRpZgorCisgICAgLyogRG8gd2UgZHJhdyB0cmFuc3BhcmFudGx5PyAqLworICAgIGlmIChmbGFncyAmIEdVSV9NT05fVFJTX0NVUlNPUikKKwlkcmF3X2ZsYWdzIHw9IERSQVdfVFJBTlNQOworCisgICAgLyoKKyAgICAgKiBEcmF3IHRoZSB0ZXh0LgorICAgICAqLworI2lmZGVmIEhBVkVfR1RLMgorICAgIC8qIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgbGVuZ3RoIGluIGRpc3BsYXkgY2VsbHMgKi8KKyAgICBsZW4gPSBndWlfZ3RrMl9kcmF3X3N0cmluZyhndWkucm93LCBjb2wsIHMsIGxlbiwgZHJhd19mbGFncyk7CisjZWxzZQorIyBpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY191dGY4KQorICAgIHsKKwlpbnQJc3RhcnQ7CQkvKiBpbmRleCBvZiBieXRlcyB0byBiZSBkcmF3biAqLworCWludAljZWxsczsJCS8qIGNlbGx3aWR0aCBvZiBieXRlcyB0byBiZSBkcmF3biAqLworCWludAl0aGlzbGVuOwkvKiBsZW5ndGggb2YgYnl0ZXMgdG8gYmUgZHJhd2luICovCisJaW50CWNuOwkJLyogY2VsbHdpZHRoIG9mIGN1cnJlbnQgY2hhciAqLworCWludAlpOwkJLyogaW5kZXggb2YgY3VycmVudCBjaGFyICovCisJaW50CWM7CQkvKiBjdXJyZW50IGNoYXIgdmFsdWUgKi8KKwlpbnQJY2w7CQkvKiBieXRlIGxlbmd0aCBvZiBjdXJyZW50IGNoYXIgKi8KKwlpbnQJY29tcGluZzsJLyogY3VycmVudCBjaGFyIGlzIGNvbXBvc2luZyAqLworCWludAlzY29sID0gY29sOwkvKiBzY3JlZW4gY29sdW1uICovCisJaW50CWRvd2lkZTsJCS8qIHVzZSAnZ3VpZm9udHdpZGUnICovCisKKwkvKiBCcmVhayB0aGUgc3RyaW5nIGF0IGEgY29tcG9zaW5nIGNoYXJhY3RlciwgaXQgaGFzIHRvIGJlIGRyYXduIG9uCisJICogdG9wIG9mIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIuICovCisJc3RhcnQgPSAwOworCWNlbGxzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IGNsKQorCXsKKwkgICAgYyA9IHV0Zl9wdHIyY2hhcihzICsgaSk7CisJICAgIGNuID0gdXRmX2NoYXIyY2VsbHMoYyk7CisJICAgIGlmIChjbiA+IDEKKyMgIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwkJICAgICYmIGZvbnRzZXQgPT0gTk9GT05UU0VUCisjICBlbmRpZgorCQkgICAgJiYgZ3VpLndpZGVfZm9udCAhPSBOT0ZPTlQpCisJCWRvd2lkZSA9IFRSVUU7CisJICAgIGVsc2UKKwkJZG93aWRlID0gRkFMU0U7CisJICAgIGNvbXBpbmcgPSB1dGZfaXNjb21wb3NpbmcoYyk7CisJICAgIGlmICghY29tcGluZykJLyogY291bnQgY2VsbHMgZnJvbSBub24tY29tcG9zaW5nIGNoYXJzICovCisJCWNlbGxzICs9IGNuOworCSAgICBjbCA9IHV0Zl9wdHIybGVuX2NoZWNrKHMgKyBpKTsKKwkgICAgaWYgKGNsID09IDApCS8qIGhpdCBlbmQgb2Ygc3RyaW5nICovCisJCWxlbiA9IGkgKyBjbDsJLyogbGVuIG11c3QgYmUgd3JvbmcgImNhbm5vdCBoYXBwZW4iICovCisKKwkgICAgLyogcHJpbnQgdGhlIHN0cmluZyBzbyBmYXIgaWYgaXQncyB0aGUgbGFzdCBjaGFyYWN0ZXIgb3IgdGhlcmUgaXMKKwkgICAgICogYSBjb21wb3NpbmcgY2hhcmFjdGVyLiAqLworCSAgICBpZiAoaSArIGNsID49IGxlbiB8fCAoY29tcGluZyAmJiBpID4gc3RhcnQpIHx8IGRvd2lkZQorIyAgaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKQorCQkgICAgfHwgKGNuID4gMQorIyAgIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwkJCS8qIE5vIGZvbnRzZXQ6IEF0IGxlYXN0IGRyYXcgY2hhciBhZnRlciB3aWRlIGNoYXIgYXQKKwkJCSAqIHJpZ2h0IHBvc2l0aW9uLiAqLworCQkJJiYgZm9udHNldCA9PSBOT0ZPTlRTRVQKKyMgICBlbmRpZgorCQkgICAgICAgKQorIyAgZW5kaWYKKwkgICAgICAgKQorCSAgICB7CisJCWlmIChjb21waW5nIHx8IGRvd2lkZSkKKwkJICAgIHRoaXNsZW4gPSBpIC0gc3RhcnQ7CisJCWVsc2UKKwkJICAgIHRoaXNsZW4gPSBpIC0gc3RhcnQgKyBjbDsKKwkJaWYgKHRoaXNsZW4gPiAwKQorCQl7CisJCSAgICBndWlfbWNoX2RyYXdfc3RyaW5nKGd1aS5yb3csIHNjb2wsIHMgKyBzdGFydCwgdGhpc2xlbiwKKwkJCQkJCQkJICBkcmF3X2ZsYWdzKTsKKwkJICAgIHN0YXJ0ICs9IHRoaXNsZW47CisJCX0KKwkJc2NvbCArPSBjZWxsczsKKwkJY2VsbHMgPSAwOworCQlpZiAoZG93aWRlKQorCQl7CisJCSAgICBndWlfbWNoX3NldF9mb250KGd1aS53aWRlX2ZvbnQpOworCQkgICAgZ3VpX21jaF9kcmF3X3N0cmluZyhndWkucm93LCBzY29sIC0gY24sCisJCQkJCQkgICBzICsgc3RhcnQsIGNsLCBkcmF3X2ZsYWdzKTsKKwkJICAgIGd1aV9tY2hfc2V0X2ZvbnQoZm9udCk7CisJCSAgICBzdGFydCArPSBjbDsKKwkJfQorCisjICBpZiBkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspCisJCS8qIE5vIGZvbnRzZXQ6IGRyYXcgYSBzcGFjZSB0byBmaWxsIHRoZSBnYXAgYWZ0ZXIgYSB3aWRlIGNoYXIgKi8KKwkJaWYgKGNuID4gMSAmJiAoZHJhd19mbGFncyAmIERSQVdfVFJBTlNQKSA9PSAwCisjICAgaWZkZWYgRkVBVF9YRk9OVFNFVAorCQkJJiYgZm9udHNldCA9PSBOT0ZPTlRTRVQKKyMgICBlbmRpZgorCQkJJiYgIWRvd2lkZSkKKwkJICAgIGd1aV9tY2hfZHJhd19zdHJpbmcoZ3VpLnJvdywgc2NvbCAtIDEsIChjaGFyX3UgKikiICIsCisJCQkJCQkJICAgICAgIDEsIGRyYXdfZmxhZ3MpOworIyAgZW5kaWYKKwkgICAgfQorCSAgICAvKiBEcmF3IGEgY29tcG9zaW5nIGNoYXIgb24gdG9wIG9mIHRoZSBwcmV2aW91cyBjaGFyLiAqLworCSAgICBpZiAoY29tcGluZykKKwkgICAgeworCQlndWlfbWNoX2RyYXdfc3RyaW5nKGd1aS5yb3csIHNjb2wgLSBjbiwgcyArIGksIGNsLAorCQkJCQkJICAgIGRyYXdfZmxhZ3MgfCBEUkFXX1RSQU5TUCk7CisJCXN0YXJ0ID0gaSArIGNsOworCSAgICB9CisJfQorCS8qIFRoZSBzdHVmZiBiZWxvdyBhc3N1bWVzICJsZW4iIGlzIHRoZSBsZW5ndGggaW4gc2NyZWVuIGNvbHVtbnMuICovCisJbGVuID0gc2NvbCAtIGNvbDsKKyAgICB9CisgICAgZWxzZQorIyBlbmRpZgorICAgIHsKKwlndWlfbWNoX2RyYXdfc3RyaW5nKGd1aS5yb3csIGNvbCwgcywgbGVuLCBkcmF3X2ZsYWdzKTsKKyMgaWZkZWYgRkVBVF9NQllURQorCWlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUpCisJeworCSAgICBpbnQJCWNsZW4gPSAwOworCSAgICBpbnQJCWk7CisKKwkgICAgLyogR2V0IHRoZSBsZW5ndGggaW4gZGlzcGxheSBjZWxscywgdGhpcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlCisJICAgICAqIG51bWJlciBvZiBieXRlcyBmb3IgImV1Yy1qcCIuICovCisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gKCptYl9wdHIybGVuX2NoZWNrKShzICsgaSkpCisJCWNsZW4gKz0gKCptYl9wdHIyY2VsbHMpKHMgKyBpKTsKKwkgICAgbGVuID0gY2xlbjsKKwl9CisjIGVuZGlmCisgICAgfQorI2VuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworICAgIGlmICghKGZsYWdzICYgKEdVSV9NT05fSVNfQ1VSU09SIHwgR1VJX01PTl9UUlNfQ1VSU09SKSkpCisJZ3VpLmNvbCA9IGNvbCArIGxlbjsKKworICAgIC8qIE1heSBuZWVkIHRvIGludmVydCBpdCB3aGVuIGl0J3MgcGFydCBvZiB0aGUgc2VsZWN0aW9uLiAqLworICAgIGlmIChmbGFncyAmIEdVSV9NT05fTk9DTEVBUikKKwljbGlwX21heV9yZWRyYXdfc2VsZWN0aW9uKGd1aS5yb3csIGNvbCwgbGVuKTsKKworICAgIGlmICghKGZsYWdzICYgKEdVSV9NT05fSVNfQ1VSU09SIHwgR1VJX01PTl9UUlNfQ1VSU09SKSkpCisgICAgeworCS8qIEludmFsaWRhdGUgdGhlIG9sZCBwaHlzaWNhbCBjdXJzb3IgcG9zaXRpb24gaWYgd2Ugd3JvdGUgb3ZlciBpdCAqLworCWlmIChndWkuY3Vyc29yX3JvdyA9PSBndWkucm93CisJCSYmIGd1aS5jdXJzb3JfY29sID49IGNvbAorCQkmJiBndWkuY3Vyc29yX2NvbCA8IGNvbCArIGxlbikKKwkgICAgZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworICAgIH0KKworI2lmZGVmIEZFQVRfU0lHTl9JQ09OUworICAgIGlmIChkcmF3X3NpZ24pCisJLyogRHJhdyB0aGUgc2lnbiBvbiB0b3Agb2YgdGhlIHNwYWNlcy4gKi8KKwlndWlfbWNoX2RyYXdzaWduKGd1aS5yb3csIGNvbCwgZ3VpLmhpZ2hsaWdodF9tYXNrKTsKKyMgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKG11bHRpX3NpZ24pCisJbmV0YmVhbnNfZHJhd19tdWx0aXNpZ25faW5kaWNhdG9yKGd1aS5yb3cpOworIyBlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBVbi1kcmF3IHRoZSBjdXJzb3IuCUFjdHVhbGx5IHRoaXMganVzdCByZWRyYXdzIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuCisgKiBwb3NpdGlvbi4gIFRoZSBjaGFyYWN0ZXIganVzdCBiZWZvcmUgaXQgdG9vLCBmb3Igd2hlbiBpdCB3YXMgaW4gYm9sZC4KKyAqLworICAgIHZvaWQKK2d1aV91bmRyYXdfY3Vyc29yKCkKK3sKKyAgICBpZiAoZ3VpLmN1cnNvcl9pc192YWxpZCkKKyAgICB7CisjaWZkZWYgRkVBVF9IQU5HVUxJTgorCWlmIChjb21wb3NpbmdfaGFuZ3VsCisJCSAgICAmJiBndWkuY29sID09IGd1aS5jdXJzb3JfY29sICYmIGd1aS5yb3cgPT0gZ3VpLmN1cnNvcl9yb3cpCisJICAgICh2b2lkKWd1aV9vdXRzdHJfbm93cmFwKGNvbXBvc2luZ19oYW5ndWxfYnVmZmVyLCAyLAorCQkgICAgR1VJX01PTl9JU19DVVJTT1IgfCBHVUlfTU9OX05PQ0xFQVIsCisJCSAgICBndWkubm9ybV9waXhlbCwgZ3VpLmJhY2tfcGl4ZWwsIDApOworCWVsc2UKKwl7CisjZW5kaWYKKwlpZiAoZ3VpX3JlZHJhd19ibG9jayhndWkuY3Vyc29yX3JvdywgZ3VpLmN1cnNvcl9jb2wsCisJCQkgICAgICBndWkuY3Vyc29yX3JvdywgZ3VpLmN1cnNvcl9jb2wsIEdVSV9NT05fTk9DTEVBUikKKwkJJiYgZ3VpLmN1cnNvcl9jb2wgPiAwKQorCSAgICAodm9pZClndWlfcmVkcmF3X2Jsb2NrKGd1aS5jdXJzb3Jfcm93LCBndWkuY3Vyc29yX2NvbCAtIDEsCisJCQkgZ3VpLmN1cnNvcl9yb3csIGd1aS5jdXJzb3JfY29sIC0gMSwgR1VJX01PTl9OT0NMRUFSKTsKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisJICAgIGlmIChjb21wb3NpbmdfaGFuZ3VsKQorCQkodm9pZClndWlfcmVkcmF3X2Jsb2NrKGd1aS5jdXJzb3Jfcm93LCBndWkuY3Vyc29yX2NvbCArIDEsCisJCQlndWkuY3Vyc29yX3JvdywgZ3VpLmN1cnNvcl9jb2wgKyAxLCBHVUlfTU9OX05PQ0xFQVIpOworCX0KKyNlbmRpZgorCS8qIEN1cnNvcl9pc192YWxpZCBpcyByZXNldCB3aGVuIHRoZSBjdXJzb3IgaXMgdW5kcmF3biwgYWxzbyByZXNldCBpdAorCSAqIGhlcmUgaW4gY2FzZSBpdCB3YXNuJ3QgbmVlZGVkIHRvIHVuZHJhdyBpdC4gKi8KKwlndWkuY3Vyc29yX2lzX3ZhbGlkID0gRkFMU0U7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX3JlZHJhdyh4LCB5LCB3LCBoKQorICAgIGludAkJeDsKKyAgICBpbnQJCXk7CisgICAgaW50CQl3OworICAgIGludAkJaDsKK3sKKyAgICBpbnQJCXJvdzEsIGNvbDEsIHJvdzIsIGNvbDI7CisKKyAgICByb3cxID0gWV8yX1JPVyh5KTsKKyAgICBjb2wxID0gWF8yX0NPTCh4KTsKKyAgICByb3cyID0gWV8yX1JPVyh5ICsgaCAtIDEpOworICAgIGNvbDIgPSBYXzJfQ09MKHggKyB3IC0gMSk7CisKKyAgICAodm9pZClndWlfcmVkcmF3X2Jsb2NrKHJvdzEsIGNvbDEsIHJvdzIsIGNvbDIsIEdVSV9NT05fTk9DTEVBUik7CisKKyAgICAvKgorICAgICAqIFdlIG1heSBuZWVkIHRvIHJlZHJhdyB0aGUgY3Vyc29yLCBidXQgZG9uJ3QgdGFrZSBpdCB1cG9uIHVzIHRvIGNoYW5nZQorICAgICAqIGl0cyBsb2NhdGlvbiBhZnRlciBhIHNjcm9sbC4KKyAgICAgKiAobWF5YmUgYmUgbW9yZSBzdHJpY3QgZXZlbiBhbmQgdGVzdCBjb2wgdG9vPykKKyAgICAgKiBUaGVzZSB0aGluZ3MgbWF5IGJlIG91dHNpZGUgdGhlIHVwZGF0ZS9jbGlwcGluZyByZWdpb24gYW5kIHJlYWxpdHkgbWF5CisgICAgICogbm90IHJlZmxlY3QgVmltcyBpbnRlcm5hbCBpZGVhcyBpZiB0aGVzZSBvcGVyYXRpb25zIGFyZSBjbGlwcGVkIGF3YXkuCisgICAgICovCisgICAgaWYgKGd1aS5yb3cgPT0gZ3VpLmN1cnNvcl9yb3cpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgVFJVRSk7Cit9CisKKy8qCisgKiBEcmF3IGEgcmVjdGFuZ3VsYXIgYmxvY2sgb2YgY2hhcmFjdGVycywgZnJvbSByb3cxIHRvIHJvdzIgKGluY2x1c2l2ZSkgYW5kCisgKiBmcm9tIGNvbDEgdG8gY29sMiAoaW5jbHVzaXZlKS4KKyAqIFJldHVybiBUUlVFIHdoZW4gdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGZpcnN0IGRyYXduIGNoYXJhY3RlciBoYXMKKyAqIGRpZmZlcmVudCBhdHRyaWJ1dGVzIChtYXkgaGF2ZSB0byBiZSByZWRyYXduIHRvbykuCisgKi8KKyAgICBpbnQKK2d1aV9yZWRyYXdfYmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMiwgZmxhZ3MpCisgICAgaW50CQlyb3cxOworICAgIGludAkJY29sMTsKKyAgICBpbnQJCXJvdzI7CisgICAgaW50CQljb2wyOworICAgIGludAkJZmxhZ3M7CS8qIGZsYWdzIGZvciBndWlfb3V0c3RyX25vd3JhcCgpICovCit7CisgICAgaW50CQlvbGRfcm93LCBvbGRfY29sOworICAgIGxvbmdfdQlvbGRfaGxfbWFzazsKKyAgICBpbnQJCW9mZjsKKyAgICBjaGFyX3UJZmlyc3RfYXR0cjsKKyAgICBpbnQJCWlkeCwgbGVuOworICAgIGludAkJYmFjaywgbmJhY2s7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlvcmlnX2NvbDEsIG9yaWdfY29sMjsKKyNlbmRpZgorCisgICAgLyogRG9uJ3QgdHJ5IHRvIHVwZGF0ZSB3aGVuIFNjcmVlbkxpbmVzIGlzIG5vdCB2YWxpZCAqLworICAgIGlmICghc2NyZWVuX2NsZWFyZWQgfHwgU2NyZWVuTGluZXMgPT0gTlVMTCkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgLyogRG9uJ3QgdHJ5IHRvIGRyYXcgb3V0c2lkZSB0aGUgc2hlbGwhICovCisgICAgLyogQ2hlY2sgZXZlcnl0aGluZywgc3RyYW5nZSB2YWx1ZXMgbWF5IGJlIGNhdXNlZCBieSBhIGJpZyBib3JkZXIgd2lkdGggKi8KKyAgICBjb2wxID0gY2hlY2tfY29sKGNvbDEpOworICAgIGNvbDIgPSBjaGVja19jb2woY29sMik7CisgICAgcm93MSA9IGNoZWNrX3Jvdyhyb3cxKTsKKyAgICByb3cyID0gY2hlY2tfcm93KHJvdzIpOworCisgICAgLyogUmVtZW1iZXIgd2hlcmUgb3VyIGN1cnNvciB3YXMgKi8KKyAgICBvbGRfcm93ID0gZ3VpLnJvdzsKKyAgICBvbGRfY29sID0gZ3VpLmNvbDsKKyAgICBvbGRfaGxfbWFzayA9IGd1aS5oaWdobGlnaHRfbWFzazsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgb3JpZ19jb2wxID0gY29sMTsKKyAgICBvcmlnX2NvbDIgPSBjb2wyOworI2VuZGlmCisKKyAgICBmb3IgKGd1aS5yb3cgPSByb3cxOyBndWkucm93IDw9IHJvdzI7IGd1aS5yb3crKykKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCS8qIFdoZW4gb25seSBoYWxmIG9mIGEgZG91YmxlLXdpZGUgY2hhcmFjdGVyIGlzIGluIHRoZSBibG9jaywgaW5jbHVkZQorCSAqIHRoZSBvdGhlciBoYWxmLiAqLworCWNvbDEgPSBvcmlnX2NvbDE7CisJY29sMiA9IG9yaWdfY29sMjsKKwlvZmYgPSBMaW5lT2Zmc2V0W2d1aS5yb3ddOworCWlmIChlbmNfZGJjcyAhPSAwKQorCXsKKwkgICAgaWYgKGNvbDEgPiAwKQorCQljb2wxIC09IGRiY3Nfc2NyZWVuX2hlYWRfb2ZmKFNjcmVlbkxpbmVzICsgb2ZmLAorCQkJCQkJICAgIFNjcmVlbkxpbmVzICsgb2ZmICsgY29sMSk7CisJICAgIGNvbDIgKz0gZGJjc19zY3JlZW5fdGFpbF9vZmYoU2NyZWVuTGluZXMgKyBvZmYsCisJCQkJCQkgICAgU2NyZWVuTGluZXMgKyBvZmYgKyBjb2wyKTsKKwl9CisJZWxzZSBpZiAoZW5jX3V0ZjgpCisJeworCSAgICBpZiAoU2NyZWVuTGluZXNbb2ZmICsgY29sMV0gPT0gMCkKKwkJLS1jb2wxOworIyBpZmRlZiBIQVZFX0dUSzIKKwkgICAgaWYgKGNvbDIgKyAxIDwgQ29sdW1ucyAmJiBTY3JlZW5MaW5lc1tvZmYgKyBjb2wyICsgMV0gPT0gMCkKKwkJKytjb2wyOworIyBlbmRpZgorCX0KKyNlbmRpZgorCWd1aS5jb2wgPSBjb2wxOworCW9mZiA9IExpbmVPZmZzZXRbZ3VpLnJvd10gKyBndWkuY29sOworCWxlbiA9IGNvbDIgLSBjb2wxICsgMTsKKworCS8qIEZpbmQgaG93IG1hbnkgY2hhcnMgYmFjayB0aGlzIGhpZ2hsaWdodGluZyBzdGFydHMsIG9yIHdoZXJlIGEgc3BhY2UKKwkgKiBpcy4gIE5lZWRlZCBmb3Igd2hlbiB0aGUgYm9sZCB0cmljayBpcyB1c2VkICovCisJZm9yIChiYWNrID0gMDsgYmFjayA8IGNvbDE7ICsrYmFjaykKKwkgICAgaWYgKFNjcmVlbkF0dHJzW29mZiAtIDEgLSBiYWNrXSAhPSBTY3JlZW5BdHRyc1tvZmZdCisJCSAgICB8fCBTY3JlZW5MaW5lc1tvZmYgLSAxIC0gYmFja10gPT0gJyAnKQorCQlicmVhazsKKwlyZXR2YWwgPSAoY29sMSA+IDAgJiYgU2NyZWVuQXR0cnNbb2ZmIC0gMV0gIT0gMCAmJiBiYWNrID09IDAKKwkJCQkJICAgICAgJiYgU2NyZWVuTGluZXNbb2ZmIC0gMV0gIT0gJyAnKTsKKworCS8qIEJyZWFrIGl0IHVwIGluIHN0cmluZ3Mgb2YgY2hhcmFjdGVycyB3aXRoIHRoZSBzYW1lIGF0dHJpYnV0ZXMuICovCisJLyogUHJpbnQgVVRGLTggY2hhcmFjdGVycyBpbmRpdmlkdWFsbHkuICovCisJd2hpbGUgKGxlbiA+IDApCisJeworCSAgICBmaXJzdF9hdHRyID0gU2NyZWVuQXR0cnNbb2ZmXTsKKwkgICAgZ3VpLmhpZ2hsaWdodF9tYXNrID0gZmlyc3RfYXR0cjsKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKKwkgICAgaWYgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzVUNbb2ZmXSAhPSAwKQorCSAgICB7CisJCS8qIG91dHB1dCBtdWx0aS1ieXRlIGNoYXJhY3RlciBzZXBhcmF0ZWx5ICovCisJCW5iYWNrID0gZ3VpX3NjcmVlbmNoYXIob2ZmLCBmbGFncywKKwkJCQkJICAoZ3VpY29sb3JfVCkwLCAoZ3VpY29sb3JfVCkwLCBiYWNrKTsKKwkJaWYgKGd1aS5jb2wgPCBDb2x1bW5zICYmIFNjcmVlbkxpbmVzW29mZiArIDFdID09IDApCisJCSAgICBpZHggPSAyOworCQllbHNlCisJCSAgICBpZHggPSAxOworCSAgICB9CisJICAgIGVsc2UgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBTY3JlZW5MaW5lc1tvZmZdID09IDB4OGUpCisJICAgIHsKKwkJLyogb3V0cHV0IGRvdWJsZS1ieXRlLCBzaW5nbGUtd2lkdGggY2hhcmFjdGVyIHNlcGFyYXRlbHkgKi8KKwkJbmJhY2sgPSBndWlfc2NyZWVuY2hhcihvZmYsIGZsYWdzLAorCQkJCQkgIChndWljb2xvcl9UKTAsIChndWljb2xvcl9UKTAsIGJhY2spOworCQlpZHggPSAxOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisjaWZkZWYgSEFWRV9HVEsyCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyArK2lkeCkKKwkJeworCQkgICAgaWYgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzW29mZiArIGlkeF0gPT0gMCkKKwkJCWNvbnRpbnVlOyAvKiBza2lwIHNlY29uZCBoYWxmIG9mIGRvdWJsZS13aWR0aCBjaGFyICovCisJCSAgICBpZiAoU2NyZWVuQXR0cnNbb2ZmICsgaWR4XSAhPSBmaXJzdF9hdHRyKQorCQkJYnJlYWs7CisJCX0KKwkJLyogZ3VpX3NjcmVlbnN0cigpIHRha2VzIGNhcmUgb2YgbXVsdGlieXRlIGNoYXJzICovCisJCW5iYWNrID0gZ3VpX3NjcmVlbnN0cihvZmYsIGlkeCwgZmxhZ3MsCisJCQkJICAgICAgKGd1aWNvbG9yX1QpMCwgKGd1aWNvbG9yX1QpMCwgYmFjayk7CisjZWxzZQorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbiAmJiBTY3JlZW5BdHRyc1tvZmYgKyBpZHhdID09IGZpcnN0X2F0dHI7CisJCQkJCQkJCQlpZHgrKykKKwkJeworIyBpZmRlZiBGRUFUX01CWVRFCisJCSAgICAvKiBTdG9wIGF0IGEgbXVsdGktYnl0ZSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KKwkJICAgIGlmIChlbmNfdXRmOCAmJiBTY3JlZW5MaW5lc1VDW29mZiArIGlkeF0gIT0gMCkKKwkJCWJyZWFrOworCQkgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwkJICAgIHsKKwkJCS8qIFN0b3AgYXQgYSBkb3VibGUtYnl0ZSBzaW5nbGUtd2lkdGggY2hhci4gKi8KKwkJCWlmIChTY3JlZW5MaW5lc1tvZmYgKyBpZHhdID09IDB4OGUpCisJCQkgICAgYnJlYWs7CisJCQlpZiAobGVuID4gMSAmJiAoKm1iX3B0cjJsZW5fY2hlY2spKFNjcmVlbkxpbmVzCisJCQkJCQkJICAgICsgb2ZmICsgaWR4KSA9PSAyKQorCQkJICAgICsraWR4OyAgLyogc2tpcCBzZWNvbmQgYnl0ZSBvZiBkb3VibGUtYnl0ZSBjaGFyICovCisJCSAgICB9CisjIGVuZGlmCisJCX0KKwkJbmJhY2sgPSBndWlfb3V0c3RyX25vd3JhcChTY3JlZW5MaW5lcyArIG9mZiwgaWR4LCBmbGFncywKKwkJCQkJICAoZ3VpY29sb3JfVCkwLCAoZ3VpY29sb3JfVCkwLCBiYWNrKTsKKyNlbmRpZgorCSAgICB9CisJICAgIGlmIChuYmFjayA9PSBGQUlMKQorCSAgICB7CisJCS8qIE11c3QgYmFjayB1cCB0byBzdGFydCBkcmF3aW5nIHdoZXJlIGEgYm9sZCBvciBpdGFsaWMgd29yZAorCQkgKiBzdGFydHMuICovCisJCW9mZiAtPSBiYWNrOworCQlsZW4gKz0gYmFjazsKKwkJZ3VpLmNvbCAtPSBiYWNrOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlvZmYgKz0gaWR4OworCQlsZW4gLT0gaWR4OworCSAgICB9CisJICAgIGJhY2sgPSAwOworCX0KKyAgICB9CisKKyAgICAvKiBQdXQgdGhlIGN1cnNvciBiYWNrIHdoZXJlIGl0IHdhcyAqLworICAgIGd1aS5yb3cgPSBvbGRfcm93OworICAgIGd1aS5jb2wgPSBvbGRfY29sOworICAgIGd1aS5oaWdobGlnaHRfbWFzayA9IG9sZF9obF9tYXNrOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfZGVsZXRlX2xpbmVzKHJvdywgY291bnQpCisgICAgaW50CSAgICByb3c7CisgICAgaW50CSAgICBjb3VudDsKK3sKKyAgICBpZiAoY291bnQgPD0gMCkKKwlyZXR1cm47CisKKyAgICBpZiAocm93ICsgY291bnQgPiBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QpCisJLyogU2Nyb2xsZWQgb3V0IG9mIHJlZ2lvbiwganVzdCBibGFuayB0aGUgbGluZXMgb3V0ICovCisJZ3VpX2NsZWFyX2Jsb2NrKHJvdywgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJCSAgICAgIGd1aS5zY3JvbGxfcmVnaW9uX2JvdCwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOworICAgIGVsc2UKKyAgICB7CisJZ3VpX21jaF9kZWxldGVfbGluZXMocm93LCBjb3VudCk7CisKKwkvKiBJZiB0aGUgY3Vyc29yIHdhcyBpbiB0aGUgZGVsZXRlZCBsaW5lcyBpdCdzIG5vdyBnb25lLiAgSWYgdGhlCisJICogY3Vyc29yIHdhcyBpbiB0aGUgc2Nyb2xsZWQgbGluZXMgYWRqdXN0IGl0cyBwb3NpdGlvbi4gKi8KKwlpZiAoZ3VpLmN1cnNvcl9yb3cgPj0gcm93CisJCSYmIGd1aS5jdXJzb3JfY29sID49IGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKKwkJJiYgZ3VpLmN1cnNvcl9jb2wgPD0gZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpCisJeworCSAgICBpZiAoZ3VpLmN1cnNvcl9yb3cgPCByb3cgKyBjb3VudCkKKwkJZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworCSAgICBlbHNlIGlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QpCisJCWd1aS5jdXJzb3Jfcm93IC09IGNvdW50OworCX0KKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX2luc2VydF9saW5lcyhyb3csIGNvdW50KQorICAgIGludAkgICAgcm93OworICAgIGludAkgICAgY291bnQ7Cit7CisgICAgaWYgKGNvdW50IDw9IDApCisJcmV0dXJuOworCisgICAgaWYgKHJvdyArIGNvdW50ID4gZ3VpLnNjcm9sbF9yZWdpb25fYm90KQorCS8qIFNjcm9sbGVkIG91dCBvZiByZWdpb24sIGp1c3QgYmxhbmsgdGhlIGxpbmVzIG91dCAqLworCWd1aV9jbGVhcl9ibG9jayhyb3csIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJCQkgICAgICBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKyAgICBlbHNlCisgICAgeworCWd1aV9tY2hfaW5zZXJ0X2xpbmVzKHJvdywgY291bnQpOworCisJaWYgKGd1aS5jdXJzb3Jfcm93ID49IGd1aS5yb3cKKwkJJiYgZ3VpLmN1cnNvcl9jb2wgPj0gZ3VpLnNjcm9sbF9yZWdpb25fbGVmdAorCQkmJiBndWkuY3Vyc29yX2NvbCA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCkKKwl7CisJICAgIGlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBjb3VudCkKKwkJZ3VpLmN1cnNvcl9yb3cgKz0gY291bnQ7CisJICAgIGVsc2UgaWYgKGd1aS5jdXJzb3Jfcm93IDw9IGd1aS5zY3JvbGxfcmVnaW9uX2JvdCkKKwkJZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBUaGUgbWFpbiBHVUkgaW5wdXQgcm91dGluZS4JV2FpdHMgZm9yIGEgY2hhcmFjdGVyIGZyb20gdGhlIGtleWJvYXJkLgorICogd3RpbWUgPT0gLTEJICAgIFdhaXQgZm9yZXZlci4KKyAqIHd0aW1lID09IDAJICAgIERvbid0IHdhaXQuCisgKiB3dGltZSA+IDAJICAgIFdhaXQgd3RpbWUgbWlsbGlzZWNvbmRzIGZvciBhIGNoYXJhY3Rlci4KKyAqIFJldHVybnMgT0sgaWYgYSBjaGFyYWN0ZXIgd2FzIGZvdW5kIHRvIGJlIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUsCisgKiBvciBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZ3VpX3dhaXRfZm9yX2NoYXJzKHd0aW1lKQorICAgIGxvbmcgICAgd3RpbWU7Cit7CisgICAgaW50CSAgICByZXR2YWw7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgc3RhdGljIGludCBvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIElmIHdlJ3JlIGdvaW5nIHRvIHdhaXQgYSBiaXQsIHVwZGF0ZSB0aGUgbWVudXMgYW5kIG1vdXNlIHNoYXBlIGZvciB0aGUKKyAgICAgKiBjdXJyZW50IFN0YXRlLgorICAgICAqLworICAgIGlmICh3dGltZSAhPSAwKQorICAgIHsKKyNpZmRlZiBGRUFUX01FTlUKKwlndWlfdXBkYXRlX21lbnVzKDApOworI2VuZGlmCisgICAgfQorCisgICAgZ3VpX21jaF91cGRhdGUoKTsKKyAgICBpZiAoaW5wdXRfYXZhaWxhYmxlKCkpCS8qIEdvdCBjaGFyLCByZXR1cm4gaW1tZWRpYXRlbHkgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCXJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKHd0aW1lID09IDApCS8qIERvbid0IHdhaXQgZm9yIGNoYXIgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIEJlZm9yZSB3YWl0aW5nLCBmbHVzaCBhbnkgb3V0cHV0IHRvIHRoZSBzY3JlZW4uICovCisgICAgZ3VpX21jaF9mbHVzaCgpOworCisgICAgaWYgKHd0aW1lID4gMCkKKyAgICB7CisJLyogQmxpbmsgd2hlbiB3YWl0aW5nIGZvciBhIGNoYXJhY3Rlci4JUHJvYmFibHkgb25seSBkb2VzIHNvbWV0aGluZworCSAqIGZvciBzaG93bWF0Y2goKSAqLworCWd1aV9tY2hfc3RhcnRfYmxpbmsoKTsKKwlyZXR2YWwgPSBndWlfbWNoX3dhaXRfZm9yX2NoYXJzKHd0aW1lKTsKKwlndWlfbWNoX3N0b3BfYmxpbmsoKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoaWxlIHdlIGFyZSB3YWl0aW5nIGluZGVmZW5pdGVseSBmb3IgYSBjaGFyYWN0ZXIsIGJsaW5rIHRoZSBjdXJzb3IuCisgICAgICovCisgICAgZ3VpX21jaF9zdGFydF9ibGluaygpOworCisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiBJZiB0aGVyZSBpcyBubyBjaGFyYWN0ZXIgYXZhaWxhYmxlIHdpdGhpbiAyIHNlY29uZHMgKGRlZmF1bHQpLAorICAgICAqIHdyaXRlIHRoZSBhdXRvc2NyaXB0IGZpbGUgdG8gZGlzayAqLworICAgIGlmIChvbmNlX2FscmVhZHkgPT0gMikKKyAgICB7CisJdXBkYXRlc2NyaXB0KDApOworCXJldHZhbCA9IGd1aV9tY2hfd2FpdF9mb3JfY2hhcnMoLTFMKTsKKwlvbmNlX2FscmVhZHkgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChvbmNlX2FscmVhZHkgPT0gMSkKKyAgICB7CisJc2V0Y3Vyc29yKCk7CisJb25jZV9hbHJlYWR5ID0gMjsKKwlyZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlpZiAoZ3VpX21jaF93YWl0X2Zvcl9jaGFycyhwX3V0KSAhPSBPSykKKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJaWYgKGhhc19jdXJzb3Job2xkKCkgJiYgZ2V0X3JlYWxfc3RhdGUoKSA9PSBOT1JNQUxfQlVTWSkKKwl7CisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0NVUlNPUkhPTEQsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworCSAgICB1cGRhdGVfc2NyZWVuKFZBTElEKTsKKwkgICAgc2hvd3J1bGVyKEZBTFNFKTsKKwkgICAgc2V0Y3Vyc29yKCk7CisKKwkgICAgb25jZV9hbHJlYWR5ID0gMTsKKwkgICAgcmV0dmFsID0gMDsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICB1cGRhdGVzY3JpcHQoMCk7CisJICAgIHJldHZhbCA9IGd1aV9tY2hfd2FpdF9mb3JfY2hhcnMoLTFMKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCX0KKyAgICB9CisgICAgZWxzZQorCXJldHZhbCA9IE9LOworCisgICAgZ3VpX21jaF9zdG9wX2JsaW5rKCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIEZpbGwgYnVmZmVyIHdpdGggbW91c2UgY29vcmRpbmF0ZXMgZW5jb2RlZCBmb3IgY2hlY2tfdGVybWNvZGUoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmaWxsX21vdXNlX2Nvb3JkKHAsIGNvbCwgcm93KQorICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWNvbDsKKyAgICBpbnQJCXJvdzsKK3sKKyAgICBwWzBdID0gKGNoYXJfdSkoY29sIC8gMTI4ICsgJyAnICsgMSk7CisgICAgcFsxXSA9IChjaGFyX3UpKGNvbCAlIDEyOCArICcgJyArIDEpOworICAgIHBbMl0gPSAoY2hhcl91KShyb3cgLyAxMjggKyAnICcgKyAxKTsKKyAgICBwWzNdID0gKGNoYXJfdSkocm93ICUgMTI4ICsgJyAnICsgMSk7Cit9CisKKy8qCisgKiBHZW5lcmljIG1vdXNlIHN1cHBvcnQgZnVuY3Rpb24uICBBZGQgYSBtb3VzZSBldmVudCB0byB0aGUgaW5wdXQgYnVmZmVyIHdpdGgKKyAqIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLgorICogIGJ1dHRvbgkgICAgLS0tIG1heSBiZSBhbnkgb2YgTU9VU0VfTEVGVCwgTU9VU0VfTUlERExFLCBNT1VTRV9SSUdIVCwKKyAqCQkJTU9VU0VfWDEsIE1PVVNFX1gyCisgKgkJCU1PVVNFX0RSQUcsIG9yIE1PVVNFX1JFTEVBU0UuCisgKgkJCU1PVVNFXzQgYW5kIE1PVVNFXzUgYXJlIHVzZWQgZm9yIGEgc2Nyb2xsIHdoZWVsLgorICogIHgsIHkJICAgIC0tLSBDb29yZGluYXRlcyBvZiBtb3VzZSBpbiBwaXhlbHMuCisgKiAgcmVwZWF0ZWRfY2xpY2sgIC0tLSBUUlVFIGlmIHRoaXMgY2xpY2sgY29tZXMgb25seSBhIHNob3J0IHRpbWUgYWZ0ZXIgYQorICoJCQlwcmV2aW91cyBjbGljay4KKyAqICBtb2RpZmllcnMJICAgIC0tLSBCaXQgZmllbGQgd2hpY2ggbWF5IGJlIGFueSBvZiB0aGUgZm9sbG93aW5nIG1vZGlmaWVycworICoJCQlvcidlZCB0b2dldGhlcjogTU9VU0VfU0hJRlQgfCBNT1VTRV9DVFJMIHwgTU9VU0VfQUxULgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGlnbm9yZSBkcmFnIGV2ZW50cyB3aGVyZSB0aGUgbW91c2UgaGFzIG5vdCBtb3ZlZCB0byBhIG5ldworICogY2hhcmFjdGVyLgorICovCisgICAgdm9pZAorZ3VpX3NlbmRfbW91c2VfZXZlbnQoYnV0dG9uLCB4LCB5LCByZXBlYXRlZF9jbGljaywgbW9kaWZpZXJzKQorICAgIGludAkgICAgYnV0dG9uOworICAgIGludAkgICAgeDsKKyAgICBpbnQJICAgIHk7CisgICAgaW50CSAgICByZXBlYXRlZF9jbGljazsKKyAgICBpbnRfdSAgIG1vZGlmaWVyczsKK3sKKyAgICBzdGF0aWMgaW50CSAgICBwcmV2X3JvdyA9IDAsIHByZXZfY29sID0gMDsKKyAgICBzdGF0aWMgaW50CSAgICBwcmV2X2J1dHRvbiA9IC0xOworICAgIHN0YXRpYyBpbnQJICAgIG51bV9jbGlja3MgPSAxOworICAgIGNoYXJfdQkgICAgc3RyaW5nWzEwXTsKKyAgICBlbnVtIGtleV9leHRyYSAgYnV0dG9uX2NoYXI7CisgICAgaW50CQkgICAgcm93LCBjb2w7CisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICBpbnQJCSAgICBjaGVja2ZvcjsKKyAgICBpbnQJCSAgICBkaWRfY2xpcCA9IEZBTFNFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNjcm9sbGluZyBtYXkgaGFwcGVuIGF0IGFueSB0aW1lLCBhbHNvIHdoaWxlIGEgc2VsZWN0aW9uIGlzIHByZXNlbnQuCisgICAgICovCisgICAgc3dpdGNoIChidXR0b24pCisgICAgeworCWNhc2UgTU9VU0VfWDE6CisJICAgIGJ1dHRvbl9jaGFyID0gS0VfWDFNT1VTRTsKKwkgICAgZ290byBidXR0b25fc2V0OworCWNhc2UgTU9VU0VfWDI6CisJICAgIGJ1dHRvbl9jaGFyID0gS0VfWDJNT1VTRTsKKwkgICAgZ290byBidXR0b25fc2V0OworCWNhc2UgTU9VU0VfNDoKKwkgICAgYnV0dG9uX2NoYXIgPSBLRV9NT1VTRURPV047CisJICAgIGdvdG8gYnV0dG9uX3NldDsKKwljYXNlIE1PVVNFXzU6CisJICAgIGJ1dHRvbl9jaGFyID0gS0VfTU9VU0VVUDsKK2J1dHRvbl9zZXQ6CisJICAgIHsKKwkJLyogRG9uJ3QgcHV0IGV2ZW50cyBpbiB0aGUgaW5wdXQgcXVldWUgbm93LiAqLworCQlpZiAoaG9sZF9ndWlfZXZlbnRzKQorCQkgICAgcmV0dXJuOworCisJCXN0cmluZ1szXSA9IENTSTsKKwkJc3RyaW5nWzRdID0gS1NfRVhUUkE7CisJCXN0cmluZ1s1XSA9IChpbnQpYnV0dG9uX2NoYXI7CisKKwkJLyogUGFzcyB0aGUgcG9pbnRlciBjb29yZGluYXRlcyBvZiB0aGUgc2Nyb2xsIGV2ZW50IHNvIHRoYXQgd2UKKwkJICoga25vdyB3aGljaCB3aW5kb3cgdG8gc2Nyb2xsLiAqLworCQlyb3cgPSBndWlfeHkyY29scm93KHgsIHksICZjb2wpOworCQlzdHJpbmdbNl0gPSAoY2hhcl91KShjb2wgLyAxMjggKyAnICcgKyAxKTsKKwkJc3RyaW5nWzddID0gKGNoYXJfdSkoY29sICUgMTI4ICsgJyAnICsgMSk7CisJCXN0cmluZ1s4XSA9IChjaGFyX3UpKHJvdyAvIDEyOCArICcgJyArIDEpOworCQlzdHJpbmdbOV0gPSAoY2hhcl91KShyb3cgJSAxMjggKyAnICcgKyAxKTsKKworCQlpZiAobW9kaWZpZXJzID09IDApCisJCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZyArIDMsIDcpOworCQllbHNlCisJCXsKKwkJICAgIHN0cmluZ1swXSA9IENTSTsKKwkJICAgIHN0cmluZ1sxXSA9IEtTX01PRElGSUVSOworCQkgICAgc3RyaW5nWzJdID0gMDsKKwkJICAgIGlmIChtb2RpZmllcnMgJiBNT1VTRV9TSElGVCkKKwkJCXN0cmluZ1syXSB8PSBNT0RfTUFTS19TSElGVDsKKwkJICAgIGlmIChtb2RpZmllcnMgJiBNT1VTRV9DVFJMKQorCQkJc3RyaW5nWzJdIHw9IE1PRF9NQVNLX0NUUkw7CisJCSAgICBpZiAobW9kaWZpZXJzICYgTU9VU0VfQUxUKQorCQkJc3RyaW5nWzJdIHw9IE1PRF9NQVNLX0FMVDsKKwkJICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAxMCk7CisJCX0KKwkJcmV0dXJuOworCSAgICB9CisgICAgfQorCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBJZiBhIGNsaXBib2FyZCBzZWxlY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIGhhbmRsZSBpdCAqLworICAgIGlmIChjbGlwX3N0YXIuc3RhdGUgPT0gU0VMRUNUX0lOX1BST0dSRVNTKQorICAgIHsKKwljbGlwX3Byb2Nlc3Nfc2VsZWN0aW9uKGJ1dHRvbiwgWF8yX0NPTCh4KSwgWV8yX1JPVyh5KSwgcmVwZWF0ZWRfY2xpY2spOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmUgd2hpY2ggbW91c2Ugc2V0dGluZ3MgdG8gbG9vayBmb3IgYmFzZWQgb24gdGhlIGN1cnJlbnQgbW9kZSAqLworICAgIHN3aXRjaCAoZ2V0X3JlYWxfc3RhdGUoKSkKKyAgICB7CisJY2FzZSBOT1JNQUxfQlVTWToKKwljYXNlIE9QX1BFTkRJTkc6CisJY2FzZSBOT1JNQUw6CQljaGVja2ZvciA9IE1PVVNFX05PUk1BTDsJYnJlYWs7CisJY2FzZSBWSVNVQUw6CQljaGVja2ZvciA9IE1PVVNFX1ZJU1VBTDsJYnJlYWs7CisJY2FzZSBSRVBMQUNFOgorCWNhc2UgUkVQTEFDRStMQU5HTUFQOgorI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwljYXNlIFZSRVBMQUNFOgorCWNhc2UgVlJFUExBQ0UrTEFOR01BUDoKKyNlbmRpZgorCWNhc2UgSU5TRVJUOgorCWNhc2UgSU5TRVJUK0xBTkdNQVA6CWNoZWNrZm9yID0gTU9VU0VfSU5TRVJUOwlicmVhazsKKwljYXNlIEFTS01PUkU6CisJY2FzZSBISVRSRVRVUk46CQkvKiBBdCB0aGUgbW9yZS0gYW5kIGhpdC1lbnRlciBwcm9tcHQgcGFzcyB0aGUKKwkJCQkgICBtb3VzZSBldmVudCBmb3IgYSBjbGljayBvbiBvciBiZWxvdyB0aGUKKwkJCQkgICBtZXNzYWdlIGxpbmUuICovCisJCQkJaWYgKFlfMl9ST1coeSkgPj0gbXNnX3JvdykKKwkJCQkgICAgY2hlY2tmb3IgPSBNT1VTRV9OT1JNQUw7CisJCQkJZWxzZQorCQkJCSAgICBjaGVja2ZvciA9IE1PVVNFX1JFVFVSTjsKKwkJCQlicmVhazsKKworCSAgICAvKgorCSAgICAgKiBPbiB0aGUgY29tbWFuZCBsaW5lLCB1c2UgdGhlIGNsaXBib2FyZCBzZWxlY3Rpb24gb24gYWxsIGxpbmVzCisJICAgICAqIGJ1dCB0aGUgY29tbWFuZCBsaW5lLiAgQnV0IG5vdCB3aGVuIHBhc3RpbmcuCisJICAgICAqLworCWNhc2UgQ01ETElORToKKwljYXNlIENNRExJTkUrTEFOR01BUDoKKwkgICAgaWYgKFlfMl9ST1coeSkgPCBjbWRsaW5lX3JvdyAmJiBidXR0b24gIT0gTU9VU0VfTUlERExFKQorCQljaGVja2ZvciA9IE1PVVNFX05PTkU7CisJICAgIGVsc2UKKwkJY2hlY2tmb3IgPSBNT1VTRV9DT01NQU5EOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIGNoZWNrZm9yID0gTU9VU0VfTk9ORTsKKwkgICAgYnJlYWs7CisgICAgfTsKKworICAgIC8qCisgICAgICogQWxsb3cgY2xpcGJvYXJkIHNlbGVjdGlvbiBvZiB0ZXh0IG9uIHRoZSBjb21tYW5kIGxpbmUgaW4gIm5vcm1hbCIKKyAgICAgKiBtb2Rlcy4gIERvbid0IGRvIHRoaXMgd2hlbiBkcmFnZ2luZyB0aGUgc3RhdHVzIGxpbmUsIG9yIGV4dGVuZGluZyBhCisgICAgICogVmlzdWFsIHNlbGVjdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoKFN0YXRlID09IE5PUk1BTCB8fCBTdGF0ZSA9PSBOT1JNQUxfQlVTWSB8fCAoU3RhdGUgJiBJTlNFUlQpKQorCSAgICAmJiBZXzJfUk9XKHkpID49IHRvcGZyYW1lLT5mcl9oZWlnaHQKKwkgICAgJiYgYnV0dG9uICE9IE1PVVNFX0RSQUcKKyMgaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJICAgICYmICFkcmFnX3N0YXR1c19saW5lCisjICBpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICAmJiAhZHJhZ19zZXBfbGluZQorIyAgZW5kaWYKKyMgZW5kaWYKKwkgICAgKQorCWNoZWNrZm9yID0gTU9VU0VfTk9ORTsKKworICAgIC8qCisgICAgICogVXNlIG1vZGVsZXNzIHNlbGVjdGlvbiB3aGVuIGhvbGRpbmcgQ1RSTCBhbmQgU0hJRlQgcHJlc3NlZC4KKyAgICAgKi8KKyAgICBpZiAoKG1vZGlmaWVycyAmIE1PVVNFX0NUUkwpICYmIChtb2RpZmllcnMgJiBNT1VTRV9TSElGVCkpCisJY2hlY2tmb3IgPSBNT1VTRV9OT05FRjsKKworICAgIC8qCisgICAgICogSW4gRXggbW9kZSwgYWx3YXlzIHVzZSBtb2RlbGVzcyBzZWxlY3Rpb24uCisgICAgICovCisgICAgaWYgKGV4bW9kZV9hY3RpdmUpCisJY2hlY2tmb3IgPSBNT1VTRV9OT05FOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgbW91c2Ugc2V0dGluZ3Mgc2F5IHRvIG5vdCB1c2UgdGhlIG1vdXNlLCB1c2UgdGhlIG1vZGVsZXNzCisgICAgICogc2VsZWN0aW9uLiAgQnV0IGlmIFZpc3VhbCBpcyBhY3RpdmUsIGFzc3VtZSB0aGF0IG9ubHkgdGhlIFZpc3VhbCBhcmVhCisgICAgICogd2lsbCBiZSBzZWxlY3RlZC4KKyAgICAgKiBFeGNlcHRpb246IE9uIHRoZSBjb21tYW5kIGxpbmUsIGJvdGggdGhlIHNlbGVjdGlvbiBpcyB1c2VkIGFuZCBhIG1vdXNlCisgICAgICoga2V5IGlzIHNlbmQuCisgICAgICovCisgICAgaWYgKCFtb3VzZV9oYXMoY2hlY2tmb3IpIHx8IGNoZWNrZm9yID09IE1PVVNFX0NPTU1BTkQpCisgICAgeworI2lmZGVmIEZFQVRfVklTVUFMCisJLyogRG9uJ3QgZG8gbW9kZWxlc3Mgc2VsZWN0aW9uIGluIFZpc3VhbCBtb2RlLiAqLworCWlmIChjaGVja2ZvciAhPSBNT1VTRV9OT05FRiAmJiBWSXN1YWxfYWN0aXZlICYmIChTdGF0ZSAmIE5PUk1BTCkpCisJICAgIHJldHVybjsKKyNlbmRpZgorCisJLyoKKwkgKiBXaGVuICdtb3VzZW1vZGVsJyBpcyAicG9wdXAiLCBzaGlmdC1sZWZ0IGlzIHRyYW5zbGF0ZWQgdG8gcmlnaHQuCisJICogQnV0IG5vdCB3aGVuIGFsc28gdXNpbmcgQ3RybC4KKwkgKi8KKwlpZiAobW91c2VfbW9kZWxfcG9wdXAoKSAmJiBidXR0b24gPT0gTU9VU0VfTEVGVAorCQkmJiAobW9kaWZpZXJzICYgTU9VU0VfU0hJRlQpICYmICEobW9kaWZpZXJzICYgTU9VU0VfQ1RSTCkpCisJeworCSAgICBidXR0b24gPSBNT1VTRV9SSUdIVDsKKwkgICAgbW9kaWZpZXJzICY9IH4gTU9VU0VfU0hJRlQ7CisJfQorCisJLyogSWYgdGhlIHNlbGVjdGlvbiBpcyBkb25lLCBhbGxvdyB0aGUgcmlnaHQgYnV0dG9uIHRvIGV4dGVuZCBpdC4KKwkgKiBJZiB0aGUgc2VsZWN0aW9uIGlzIGNsZWFyZWQsIGFsbG93IHRoZSByaWdodCBidXR0b24gdG8gc3RhcnQgaXQKKwkgKiBmcm9tIHRoZSBjdXJzb3IgcG9zaXRpb24uICovCisJaWYgKGJ1dHRvbiA9PSBNT1VTRV9SSUdIVCkKKwl7CisJICAgIGlmIChjbGlwX3N0YXIuc3RhdGUgPT0gU0VMRUNUX0NMRUFSRUQpCisJICAgIHsKKwkJaWYgKFN0YXRlICYgQ01ETElORSkKKwkJeworCQkgICAgY29sID0gbXNnX2NvbDsKKwkJICAgIHJvdyA9IG1zZ19yb3c7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjb2wgPSBjdXJ3aW4tPndfd2NvbDsKKwkJICAgIHJvdyA9IGN1cndpbi0+d193cm93ICsgV19XSU5ST1coY3Vyd2luKTsKKwkJfQorCQljbGlwX3N0YXJ0X3NlbGVjdGlvbihjb2wsIHJvdywgRkFMU0UpOworCSAgICB9CisJICAgIGNsaXBfcHJvY2Vzc19zZWxlY3Rpb24oYnV0dG9uLCBYXzJfQ09MKHgpLCBZXzJfUk9XKHkpLAorCQkJCQkJCSAgICAgIHJlcGVhdGVkX2NsaWNrKTsKKwkgICAgZGlkX2NsaXAgPSBUUlVFOworCX0KKwkvKiBBbGxvdyB0aGUgbGVmdCBidXR0b24gdG8gc3RhcnQgdGhlIHNlbGVjdGlvbiAqLworCWVsc2UgaWYgKGJ1dHRvbiA9PQorIyBpZmRlZiBSSVNDT1MKKwkJLyogT25seSBzdGFydCBhIGRyYWcgb24gYSBkcmFnIGV2ZW50LiBPdGhlcndpc2UKKwkJICogd2UgZG9uJ3QgZ2V0IGEgcmVsZWFzZSBldmVudC4gKi8KKwkJICAgIE1PVVNFX0RSQUcKKyMgZWxzZQorCQkgICAgTU9VU0VfTEVGVAorIyBlbmRpZgorCQkJCSkKKwl7CisJICAgIGNsaXBfc3RhcnRfc2VsZWN0aW9uKFhfMl9DT0woeCksIFlfMl9ST1coeSksIHJlcGVhdGVkX2NsaWNrKTsKKwkgICAgZGlkX2NsaXAgPSBUUlVFOworCX0KKyMgaWZkZWYgUklTQ09TCisJZWxzZSBpZiAoYnV0dG9uID09IE1PVVNFX0xFRlQpCisJeworCSAgICBjbGlwX2NsZWFyX3NlbGVjdGlvbigpOworCSAgICBkaWRfY2xpcCA9IFRSVUU7CisJfQorIyBlbmRpZgorCisJLyogQWx3YXlzIGFsbG93IHBhc3RpbmcgKi8KKwlpZiAoYnV0dG9uICE9IE1PVVNFX01JRERMRSkKKwl7CisJICAgIGlmICghbW91c2VfaGFzKGNoZWNrZm9yKSB8fCBidXR0b24gPT0gTU9VU0VfUkVMRUFTRSkKKwkJcmV0dXJuOworCSAgICBpZiAoY2hlY2tmb3IgIT0gTU9VU0VfQ09NTUFORCkKKwkJYnV0dG9uID0gTU9VU0VfTEVGVDsKKwl9CisJcmVwZWF0ZWRfY2xpY2sgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoY2xpcF9zdGFyLnN0YXRlICE9IFNFTEVDVF9DTEVBUkVEICYmICFkaWRfY2xpcCkKKwljbGlwX2NsZWFyX3NlbGVjdGlvbigpOworI2VuZGlmCisKKyAgICAvKiBEb24ndCBwdXQgZXZlbnRzIGluIHRoZSBpbnB1dCBxdWV1ZSBub3cuICovCisgICAgaWYgKGhvbGRfZ3VpX2V2ZW50cykKKwlyZXR1cm47CisKKyAgICByb3cgPSBndWlfeHkyY29scm93KHgsIHksICZjb2wpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBhcmUgZHJhZ2dpbmcgYW5kIHRoZSBtb3VzZSBoYXNuJ3QgbW92ZWQgZmFyIGVub3VnaCB0byBiZSBvbiBhCisgICAgICogZGlmZmVyZW50IGNoYXJhY3RlciwgdGhlbiBkb24ndCBzZW5kIGFuIGV2ZW50IHRvIHZpbS4KKyAgICAgKi8KKyAgICBpZiAoYnV0dG9uID09IE1PVVNFX0RSQUcpCisgICAgeworCWlmIChyb3cgPT0gcHJldl9yb3cgJiYgY29sID09IHByZXZfY29sKQorCSAgICByZXR1cm47CisJLyogRHJhZ2dpbmcgYWJvdmUgdGhlIHdpbmRvdywgc2V0ICJyb3ciIHRvIC0xIHRvIGNhdXNlIGEgc2Nyb2xsLiAqLworCWlmICh5IDwgMCkKKwkgICAgcm93ID0gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0b3BsaW5lIGhhcyBjaGFuZ2VkICh3aW5kb3cgc2Nyb2xsZWQpIHNpbmNlIHRoZSBsYXN0IGNsaWNrLCByZXNldAorICAgICAqIHJlcGVhdGVkX2NsaWNrLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgc3RhcnRpbmcgVmlzdWFsIG1vZGUgd2hlbgorICAgICAqIGNsaWNraW5nIG9uIGEgZGlmZmVyZW50IGNoYXJhY3RlciBpbiB0aGUgdGV4dC4KKyAgICAgKi8KKyAgICBpZiAoY3Vyd2luLT53X3RvcGxpbmUgIT0gZ3VpX3ByZXZfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCSAgICB8fCBjdXJ3aW4tPndfdG9wZmlsbCAhPSBndWlfcHJldl90b3BmaWxsCisjZW5kaWYKKwkgICAgKQorCXJlcGVhdGVkX2NsaWNrID0gRkFMU0U7CisKKyAgICBzdHJpbmdbMF0gPSBDU0k7CS8qIHRoaXMgc2VxdWVuY2UgaXMgcmVjb2duaXplZCBieSBjaGVja190ZXJtY29kZSgpICovCisgICAgc3RyaW5nWzFdID0gS1NfTU9VU0U7CisgICAgc3RyaW5nWzJdID0gS0VfRklMTEVSOworICAgIGlmIChidXR0b24gIT0gTU9VU0VfRFJBRyAmJiBidXR0b24gIT0gTU9VU0VfUkVMRUFTRSkKKyAgICB7CisJaWYgKHJlcGVhdGVkX2NsaWNrKQorCXsKKwkgICAgLyoKKwkgICAgICogSGFuZGxlIG11bHRpcGxlIGNsaWNrcy4JVGhleSBvbmx5IGNvdW50IGlmIHRoZSBtb3VzZSBpcyBzdGlsbAorCSAgICAgKiBwb2ludGluZyBhdCB0aGUgc2FtZSBjaGFyYWN0ZXIuCisJICAgICAqLworCSAgICBpZiAoYnV0dG9uICE9IHByZXZfYnV0dG9uIHx8IHJvdyAhPSBwcmV2X3JvdyB8fCBjb2wgIT0gcHJldl9jb2wpCisJCW51bV9jbGlja3MgPSAxOworCSAgICBlbHNlIGlmICgrK251bV9jbGlja3MgPiA0KQorCQludW1fY2xpY2tzID0gMTsKKwl9CisJZWxzZQorCSAgICBudW1fY2xpY2tzID0gMTsKKwlwcmV2X2J1dHRvbiA9IGJ1dHRvbjsKKwlndWlfcHJldl90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisJZ3VpX3ByZXZfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisKKwlzdHJpbmdbM10gPSAoY2hhcl91KShidXR0b24gfCAweDIwKTsKKwlTRVRfTlVNX01PVVNFX0NMSUNLUyhzdHJpbmdbM10sIG51bV9jbGlja3MpOworICAgIH0KKyAgICBlbHNlCisJc3RyaW5nWzNdID0gKGNoYXJfdSlidXR0b247CisKKyAgICBzdHJpbmdbM10gfD0gbW9kaWZpZXJzOworICAgIGZpbGxfbW91c2VfY29vcmQoc3RyaW5nICsgNCwgY29sLCByb3cpOworICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCA4KTsKKworICAgIGlmIChyb3cgPCAwKQorCXByZXZfcm93ID0gMDsKKyAgICBlbHNlCisJcHJldl9yb3cgPSByb3c7CisgICAgcHJldl9jb2wgPSBjb2w7CisKKyAgICAvKgorICAgICAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgY2xlYXJlZCBzaW5jZSBBdGhlbmEgZG9lc24ndCB0ZWxsIHVzIHdoZW4KKyAgICAgKiBoZSBpcyBkb25lIGRyYWdnaW5nLiAgTmVpdGhlciBkb2VzIEdUSysgMiAtLSBhdCBsZWFzdCBmb3Igbm93LgorICAgICAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSB8fCBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICBndWkuZHJhZ2dlZF9zYiA9IFNCQVJfTk9ORTsKKyNlbmRpZgorfQorCisvKgorICogQ29udmVydCB4IGFuZCB5IGNvb3JkaW5hdGUgdG8gY29sdW1uIGFuZCByb3cgaW4gdGV4dCB3aW5kb3cuCisgKiBDb3JyZWN0cyBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKiByZXR1cm5zIGNvbHVtbiBpbiAiKmNvbHAiIGFuZCByb3cgYXMgcmV0dXJuIHZhbHVlOworICovCisgICAgaW50CitndWlfeHkyY29scm93KHgsIHksIGNvbHApCisgICAgaW50CQl4OworICAgIGludAkJeTsKKyAgICBpbnQJCSpjb2xwOworeworICAgIGludAkJY29sID0gY2hlY2tfY29sKFhfMl9DT0woeCkpOworICAgIGludAkJcm93ID0gY2hlY2tfcm93KFlfMl9ST1coeSkpOworCisjaWZkZWYgRkVBVF9NQllURQorICAgICpjb2xwID0gbWJfZml4X2NvbChjb2wsIHJvdyk7CisjZWxzZQorICAgICpjb2xwID0gY29sOworI2VuZGlmCisgICAgcmV0dXJuIHJvdzsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIGEgbWVudSBlbnRyeSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tZW51X2NiKG1lbnUpCisgICAgdmltbWVudV9UICptZW51OworeworICAgIGNoYXJfdSAgYnl0ZXNbMyArIHNpemVvZihsb25nX3UpXTsKKworICAgIC8qIERvbid0IHB1dCBldmVudHMgaW4gdGhlIGlucHV0IHF1ZXVlIG5vdy4gKi8KKyAgICBpZiAoaG9sZF9ndWlfZXZlbnRzKQorCXJldHVybjsKKworICAgIGJ5dGVzWzBdID0gQ1NJOworICAgIGJ5dGVzWzFdID0gS1NfTUVOVTsKKyAgICBieXRlc1syXSA9IEtFX0ZJTExFUjsKKyAgICBhZGRfbG9uZ190b19idWYoKGxvbmdfdSltZW51LCBieXRlcyArIDMpOworICAgIGFkZF90b19pbnB1dF9idWYoYnl0ZXMsIDMgKyBzaXplb2YobG9uZ191KSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFNldCB3aGljaCBjb21wb25lbnRzIGFyZSBwcmVzZW50LgorICogSWYgIm9sZHZhbCIgaXMgbm90IE5VTEwsICJvbGR2YWwiIGlzIHRoZSBwcmV2aW91cyB2YWx1ZSwgdGhlIG5ldyAqIHZhbHVlIGlzCisgKiBpbiBwX2dvLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitndWlfaW5pdF93aGljaF9jb21wb25lbnRzKG9sZHZhbCkKKyAgICBjaGFyX3UJKm9sZHZhbDsKK3sKKyAgICBzdGF0aWMgaW50CXByZXZfd2hpY2hfc2Nyb2xsYmFyc1szXSA9IHstMSwgLTEsIC0xfTsKKyNpZmRlZiBGRUFUX01FTlUKKyAgICBzdGF0aWMgaW50CXByZXZfbWVudV9pc19hY3RpdmUgPSAtMTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIHN0YXRpYyBpbnQJcHJldl90b29sYmFyID0gLTE7CisgICAgaW50CQl1c2luZ190b29sYmFyID0gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPT1RFUgorICAgIHN0YXRpYyBpbnQJcHJldl9mb290ZXIgPSAtMTsKKyAgICBpbnQJCXVzaW5nX2Zvb3RlciA9IEZBTFNFOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX01FTlUpICYmICFkZWZpbmVkKFdJTjE2KQorICAgIHN0YXRpYyBpbnQJcHJldl90ZWFyb2ZmID0gLTE7CisgICAgaW50CQl1c2luZ190ZWFyb2ZmID0gRkFMU0U7CisjZW5kaWYKKworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgaW50CQlncmV5X29sZCwgZ3JleV9uZXc7CisgICAgY2hhcl91CSp0ZW1wOworI2VuZGlmCisgICAgd2luX1QJKndwOworICAgIGludAkJbmVlZF9zZXRfc2l6ZTsKKyAgICBpbnQJCWZpeF9zaXplOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgaWYgKG9sZHZhbCAhPSBOVUxMICYmIGd1aS5pbl91c2UpCisgICAgeworCS8qCisJICogQ2hlY2sgaWYgdGhlIG1lbnUncyBnbyBmcm9tIGdyZXkgdG8gbm9uLWdyZXkgb3IgdmlzZSB2ZXJzYS4KKwkgKi8KKwlncmV5X29sZCA9ICh2aW1fc3RyY2hyKG9sZHZhbCwgR09fR1JFWSkgIT0gTlVMTCk7CisJZ3JleV9uZXcgPSAodmltX3N0cmNocihwX2dvLCBHT19HUkVZKSAhPSBOVUxMKTsKKwlpZiAoZ3JleV9vbGQgIT0gZ3JleV9uZXcpCisJeworCSAgICB0ZW1wID0gcF9nbzsKKwkgICAgcF9nbyA9IG9sZHZhbDsKKwkgICAgZ3VpX3VwZGF0ZV9tZW51cyhNRU5VX0FMTF9NT0RFUyk7CisJICAgIHBfZ28gPSB0ZW1wOworCX0KKyAgICB9CisgICAgZ3VpLm1lbnVfaXNfYWN0aXZlID0gRkFMU0U7CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJZ3VpLndoaWNoX3Njcm9sbGJhcnNbaV0gPSBGQUxTRTsKKyAgICBmb3IgKHAgPSBwX2dvOyAqcDsgcCsrKQorCXN3aXRjaCAoKnApCisJeworCSAgICBjYXNlIEdPX0xFRlQ6CisJCWd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0gPSBUUlVFOworCQlicmVhazsKKwkgICAgY2FzZSBHT19SSUdIVDoKKwkJZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0gPSBUUlVFOworCQlicmVhazsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICBjYXNlIEdPX1ZMRUZUOgorCQlpZiAod2luX2hhc3ZlcnRzcGxpdCgpKQorCQkgICAgZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSA9IFRSVUU7CisJCWJyZWFrOworCSAgICBjYXNlIEdPX1ZSSUdIVDoKKwkJaWYgKHdpbl9oYXN2ZXJ0c3BsaXQoKSkKKwkJICAgIGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfUklHSFRdID0gVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBHT19CT1Q6CisJCWd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfQk9UVE9NXSA9IFRSVUU7CisJCWJyZWFrOworI2lmZGVmIEZFQVRfTUVOVQorCSAgICBjYXNlIEdPX01FTlVTOgorCQlndWkubWVudV9pc19hY3RpdmUgPSBUUlVFOworCQlicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIEdPX0dSRVk6CisJCS8qIG1ha2UgbWVudSdzIGhhdmUgZ3JleSBpdGVtcywgaWdub3JlZCBoZXJlICovCisJCWJyZWFrOworI2lmZGVmIEZFQVRfVE9PTEJBUgorCSAgICBjYXNlIEdPX1RPT0xCQVI6CisJCXVzaW5nX3Rvb2xiYXIgPSBUUlVFOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9PVEVSCisJICAgIGNhc2UgR09fRk9PVEVSOgorCQl1c2luZ19mb290ZXIgPSBUUlVFOworCQlicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIEdPX1RFQVJPRkY6CisjaWYgZGVmaW5lZChGRUFUX01FTlUpICYmICFkZWZpbmVkKFdJTjE2KQorCQl1c2luZ190ZWFyb2ZmID0gVFJVRTsKKyNlbmRpZgorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJLyogSWdub3JlIG9wdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAqLworCQlicmVhazsKKwl9CisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCW5lZWRfc2V0X3NpemUgPSBGQUxTRTsKKwlmaXhfc2l6ZSA9IEZBTFNFOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCSAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbaV0gIT0gcHJldl93aGljaF9zY3JvbGxiYXJzW2ldKQorCSAgICB7CisJCWlmIChpID09IFNCQVJfQk9UVE9NKQorCQkgICAgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyKCZndWkuYm90dG9tX3NiYXIsCisJCQkJCQkgICAgIGd1aS53aGljaF9zY3JvbGxiYXJzW2ldKTsKKwkJZWxzZQorCQl7CisJCSAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisJCSAgICB7CisJCQlndWlfZG9fc2Nyb2xsYmFyKHdwLCBpLCBndWkud2hpY2hfc2Nyb2xsYmFyc1tpXSk7CisJCSAgICB9CisJCX0KKwkJbmVlZF9zZXRfc2l6ZSA9IFRSVUU7CisJCWlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tpXSkKKwkJICAgIGZpeF9zaXplID0gVFJVRTsKKwkgICAgfQorCSAgICBwcmV2X3doaWNoX3Njcm9sbGJhcnNbaV0gPSBndWkud2hpY2hfc2Nyb2xsYmFyc1tpXTsKKwl9CisKKyNpZmRlZiBGRUFUX01FTlUKKwlpZiAoZ3VpLm1lbnVfaXNfYWN0aXZlICE9IHByZXZfbWVudV9pc19hY3RpdmUpCisJeworCSAgICAvKiBXZSBkb24ndCB3YW50IGEgcmVzaXplIGV2ZW50IGNoYW5nZSAiUm93cyIgaGVyZSwgc2F2ZSBhbmQKKwkgICAgICogcmVzdG9yZSBpdC4gIFJlc2l6aW5nIGlzIGhhbmRsZWQgYmVsb3cuICovCisJICAgIGkgPSBSb3dzOworCSAgICBndWlfbWNoX2VuYWJsZV9tZW51KGd1aS5tZW51X2lzX2FjdGl2ZSk7CisJICAgIFJvd3MgPSBpOworCSAgICBwcmV2X21lbnVfaXNfYWN0aXZlID0gZ3VpLm1lbnVfaXNfYWN0aXZlOworCSAgICBuZWVkX3NldF9zaXplID0gVFJVRTsKKwkgICAgaWYgKGd1aS5tZW51X2lzX2FjdGl2ZSkKKwkJZml4X3NpemUgPSBUUlVFOworCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9UT09MQkFSCisJaWYgKHVzaW5nX3Rvb2xiYXIgIT0gcHJldl90b29sYmFyKQorCXsKKwkgICAgZ3VpX21jaF9zaG93X3Rvb2xiYXIodXNpbmdfdG9vbGJhcik7CisJICAgIHByZXZfdG9vbGJhciA9IHVzaW5nX3Rvb2xiYXI7CisJICAgIG5lZWRfc2V0X3NpemUgPSBUUlVFOworCSAgICBpZiAodXNpbmdfdG9vbGJhcikKKwkJZml4X3NpemUgPSBUUlVFOworCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9PVEVSCisJaWYgKHVzaW5nX2Zvb3RlciAhPSBwcmV2X2Zvb3RlcikKKwl7CisJICAgIGd1aV9tY2hfZW5hYmxlX2Zvb3Rlcih1c2luZ19mb290ZXIpOworCSAgICBwcmV2X2Zvb3RlciA9IHVzaW5nX2Zvb3RlcjsKKwkgICAgbmVlZF9zZXRfc2l6ZSA9IFRSVUU7CisJICAgIGlmICh1c2luZ19mb290ZXIpCisJCWZpeF9zaXplID0gVFJVRTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgIWRlZmluZWQoV0lOMTYpICYmICEoZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX1RFQVJPRkYpKQorCWlmICh1c2luZ190ZWFyb2ZmICE9IHByZXZfdGVhcm9mZikKKwl7CisJICAgIGd1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKHVzaW5nX3RlYXJvZmYpOworCSAgICBwcmV2X3RlYXJvZmYgPSB1c2luZ190ZWFyb2ZmOworCX0KKyNlbmRpZgorCWlmIChuZWVkX3NldF9zaXplKQorCSAgICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyB0byBtYWtlIHRoZSB0ZXh0IGFyZWEga2VlcCB0aGUKKwkgICAgICogc2FtZSBzaXplIGFuZCB0byBhdm9pZCB0aGF0IHBhcnQgb2Ygb3VyIHdpbmRvdyBpcyBvZmYtc2NyZWVuCisJICAgICAqIGFuZCBhIHNjcm9sbGJhciBjYW4ndCBiZSB1c2VkLCBmb3IgZXhhbXBsZS4gKi8KKwkgICAgZ3VpX3NldF9zaGVsbHNpemUoRkFMU0UsIGZpeF9zaXplKTsKKyAgICB9Cit9CisKKworLyoKKyAqIFNjcm9sbGJhciBzdHVmZjoKKyAqLworCisgICAgdm9pZAorZ3VpX2NyZWF0ZV9zY3JvbGxiYXIoc2IsIHR5cGUsIHdwKQorICAgIHNjcm9sbGJhcl9UCSpzYjsKKyAgICBpbnQJCXR5cGU7CisgICAgd2luX1QJKndwOworeworICAgIHN0YXRpYyBpbnQJc2Jhcl9pZGVudCA9IDA7CisKKyAgICBzYi0+aWRlbnQgPSBzYmFyX2lkZW50Kys7CS8qIE5vIGNoZWNrIGZvciB0b28gYmlnLCBidXQgd291bGQgaXQgaGFwcGVuPyAqLworICAgIHNiLT53cCA9IHdwOworICAgIHNiLT50eXBlID0gdHlwZTsKKyAgICBzYi0+dmFsdWUgPSAwOworI2lmZGVmIEZFQVRfR1VJX0FUSEVOQQorICAgIHNiLT5waXh2YWwgPSAwOworI2VuZGlmCisgICAgc2ItPnNpemUgPSAxOworICAgIHNiLT5tYXggPSAxOworICAgIHNiLT50b3AgPSAwOworICAgIHNiLT5oZWlnaHQgPSAwOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgc2ItPndpZHRoID0gMDsKKyNlbmRpZgorICAgIHNiLT5zdGF0dXNfaGVpZ2h0ID0gMDsKKyAgICBndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoc2IsICh3cCA9PSBOVUxMKSA/IFNCQVJfSE9SSVogOiBTQkFSX1ZFUlQpOworfQorCisvKgorICogRmluZCB0aGUgc2Nyb2xsYmFyIHdpdGggdGhlIGdpdmVuIGluZGV4LgorICovCisgICAgc2Nyb2xsYmFyX1QgKgorZ3VpX2ZpbmRfc2Nyb2xsYmFyKGlkZW50KQorICAgIGxvbmcJaWRlbnQ7Cit7CisgICAgd2luX1QJKndwOworCisgICAgaWYgKGd1aS5ib3R0b21fc2Jhci5pZGVudCA9PSBpZGVudCkKKwlyZXR1cm4gJmd1aS5ib3R0b21fc2JhcjsKKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uaWRlbnQgPT0gaWRlbnQpCisJICAgIHJldHVybiAmd3AtPndfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdOworCWlmICh3cC0+d19zY3JvbGxiYXJzW1NCQVJfUklHSFRdLmlkZW50ID09IGlkZW50KQorCSAgICByZXR1cm4gJndwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogRm9yIG1vc3Qgc3lzdGVtczogUHV0IGEgY29kZSBpbiB0aGUgaW5wdXQgYnVmZmVyIGZvciBhIGRyYWdnZWQgc2Nyb2xsYmFyLgorICoKKyAqIEZvciBXaW4zMiwgTWFjaW50b3NoIGFuZCBHVEsrIDI6CisgKiBTY3JvbGxiYXJzIHNlZW0gdG8gZ3JhYiBmb2N1cyBhbmQgdmltIGRvZXNuJ3QgcmVhZCB0aGUgaW5wdXQgcXVldWUgdW50aWwKKyAqIHlvdSBzdG9wIGRyYWdnaW5nIHRoZSBzY3JvbGxiYXIuICBXZSBnZXQgaGVyZSBlYWNoIHRpbWUgdGhlIHNjcm9sbGJhciBpcworICogZHJhZ2dlZCBhbm90aGVyIHBpeGVsLCBidXQgYXMgZmFyIGFzIHRoZSByZXN0IG9mIHZpbSBnb2VzLCBpdCB0aGlua3MKKyAqIHdlJ3JlIGp1c3QgaGFuZ2luZyBpbiB0aGUgY2FsbCB0byBEaXNwYXRjaE1lc3NhZ2UoKSBpbgorICogcHJvY2Vzc19tZXNzYWdlKCkuICBUaGUgRGlzcGF0Y2hNZXNzYWdlKCkgY2FsbCB0aGF0IGhhbmdzIHdhcyBwYXNzZWQgYQorICogbW91c2UgYnV0dG9uIGNsaWNrIGV2ZW50IGluIHRoZSBzY3JvbGxiYXIgd2luZG93LiAtLSB3ZWJiLgorICoKKyAqIFNvbHV0aW9uOiBEbyB0aGUgc2Nyb2xsaW5nIHJpZ2h0IGhlcmUuICBCdXQgb25seSB3aGVuIGFsbG93ZWQuCisgKiBJZ25vcmUgdGhlIHNjcm9sbGJhcnMgd2hpbGUgZXhlY3V0aW5nIGFuIGV4dGVybmFsIGNvbW1hbmQgb3Igd2hlbiB0aGVyZQorICogYXJlIHN0aWxsIGNoYXJhY3RlcnMgdG8gYmUgcHJvY2Vzc2VkLgorICovCisgICAgdm9pZAorZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCB2YWx1ZSwgc3RpbGxfZHJhZ2dpbmcpCisgICAgc2Nyb2xsYmFyX1QJKnNiOworICAgIGxvbmcJdmFsdWU7CisgICAgaW50CQlzdGlsbF9kcmFnZ2luZzsKK3sKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3A7CisjZW5kaWYKKyAgICBpbnQJCXNiX251bTsKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorICAgIGNvbG5yX1QJb2xkX2xlZnRjb2wgPSBjdXJ3aW4tPndfbGVmdGNvbDsKKyMgaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisgICAgbGluZW5yX1QJb2xkX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQlvbGRfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworIyBlbmRpZgorI2Vsc2UKKyAgICBjaGFyX3UJYnl0ZXNbNCArIHNpemVvZihsb25nX3UpXTsKKyAgICBpbnQJCWJ5dGVfY291bnQ7CisjZW5kaWYKKworICAgIGlmIChzYiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIERvbid0IHB1dCBldmVudHMgaW4gdGhlIGlucHV0IHF1ZXVlIG5vdy4gKi8KKyAgICBpZiAoaG9sZF9ndWlfZXZlbnRzKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDAgJiYgc2ItPndwICE9IGN1cndpbikKKwlyZXR1cm47CisjZW5kaWYKKworICAgIGlmIChzdGlsbF9kcmFnZ2luZykKKyAgICB7CisJaWYgKHNiLT53cCA9PSBOVUxMKQorCSAgICBndWkuZHJhZ2dlZF9zYiA9IFNCQVJfQk9UVE9NOworCWVsc2UgaWYgKHNiID09ICZzYi0+d3AtPndfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQorCSAgICBndWkuZHJhZ2dlZF9zYiA9IFNCQVJfTEVGVDsKKwllbHNlCisJICAgIGd1aS5kcmFnZ2VkX3NiID0gU0JBUl9SSUdIVDsKKwlndWkuZHJhZ2dlZF93cCA9IHNiLT53cDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlndWkuZHJhZ2dlZF9zYiA9IFNCQVJfTk9ORTsKKyNpZmRlZiBIQVZFX0dUSzIKKwkvKiBLZWVwIHRoZSAiZHJhZ2dlZF93cCIgdmFsdWUgdW50aWwgYWZ0ZXIgdGhlIHNjcm9sbGluZywgZm9yIHdoZW4gdGhlCisJICogbW91c3QgYnV0dG9uIGlzIHJlbGVhc2VkLiAgR1RLMiBkb2Vzbid0IHNlbmQgdGhlIGJ1dHRvbi11cCBldmVudC4gKi8KKwlndWkuZHJhZ2dlZF93cCA9IE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBWZXJ0aWNhbCBzYmFyIGluZm8gaXMga2VwdCBpbiB0aGUgZmlyc3Qgc2JhciAodGhlIGxlZnQgb25lKSAqLworICAgIGlmIChzYi0+d3AgIT0gTlVMTCkKKwlzYiA9ICZzYi0+d3AtPndfc2Nyb2xsYmFyc1swXTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWRpdHkgb2YgdmFsdWUKKyAgICAgKi8KKyAgICBpZiAodmFsdWUgPCAwKQorCXZhbHVlID0gMDsKKyNpZmRlZiBTQ1JPTExfUEFTVF9FTkQKKyAgICBlbHNlIGlmICh2YWx1ZSA+IHNiLT5tYXgpCisJdmFsdWUgPSBzYi0+bWF4OworI2Vsc2UKKyAgICBpZiAodmFsdWUgPiBzYi0+bWF4IC0gc2ItPnNpemUgKyAxKQorCXZhbHVlID0gc2ItPm1heCAtIHNiLT5zaXplICsgMTsKKyNlbmRpZgorCisgICAgc2ItPnZhbHVlID0gdmFsdWU7CisKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorICAgIC8qIFdoZW4gbm90IGFsbG93ZWQgdG8gZG8gdGhlIHNjcm9sbGluZyByaWdodCBub3csIHJldHVybi4gKi8KKyAgICBpZiAoZG9udF9zY3JvbGwgfHwgaW5wdXRfYXZhaWxhYmxlKCkpCisJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGlmIChzYi0+d3AgPT0gTlVMTCAmJiBjdXJ3aW4tPndfcF9ybCkKKyAgICB7CisJdmFsdWUgPSBzYi0+bWF4ICsgMSAtIHNiLT5zaXplIC0gdmFsdWU7CisJaWYgKHZhbHVlIDwgMCkKKwkgICAgdmFsdWUgPSAwOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHNiLT53cCAhPSBOVUxMKQkJLyogdmVydGljYWwgc2Nyb2xsYmFyICovCisgICAgeworCXNiX251bSA9IDA7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBzYi0+d3AgJiYgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCSAgICBzYl9udW0rKzsKKwlpZiAod3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworI2Vsc2UKKwlpZiAoc2ItPndwICE9IGN1cndpbikKKwkgICAgcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorCWN1cnJlbnRfc2Nyb2xsYmFyID0gc2JfbnVtOworCXNjcm9sbGJhcl92YWx1ZSA9IHZhbHVlOworCWlmIChTdGF0ZSAmIE5PUk1BTCkKKwl7CisJICAgIGd1aV9kb19zY3JvbGwoKTsKKwkgICAgc2V0Y3Vyc29yKCk7CisJfQorCWVsc2UgaWYgKFN0YXRlICYgSU5TRVJUKQorCXsKKwkgICAgaW5zX3Njcm9sbCgpOworCSAgICBzZXRjdXJzb3IoKTsKKwl9CisJZWxzZSBpZiAoU3RhdGUgJiBDTURMSU5FKQorCXsKKwkgICAgaWYgKG1zZ19zY3JvbGxlZCA9PSAwKQorCSAgICB7CisJCWd1aV9kb19zY3JvbGwoKTsKKwkJcmVkcmF3Y21kbGluZSgpOworCSAgICB9CisJfQorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkvKiBWYWx1ZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZm9yIGNsb3NlZCBmb2xkLiAqLworCXNiLT52YWx1ZSA9IHNiLT53cC0+d190b3BsaW5lIC0gMTsKKyMgZW5kaWYKKyNlbHNlCisJYnl0ZXNbMF0gPSBDU0k7CisJYnl0ZXNbMV0gPSBLU19WRVJfU0NST0xMQkFSOworCWJ5dGVzWzJdID0gS0VfRklMTEVSOworCWJ5dGVzWzNdID0gKGNoYXJfdSlzYl9udW07CisJYnl0ZV9jb3VudCA9IDQ7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorCXNjcm9sbGJhcl92YWx1ZSA9IHZhbHVlOworCisJaWYgKFN0YXRlICYgTk9STUFMKQorCSAgICBndWlfZG9faG9yaXpfc2Nyb2xsKCk7CisJZWxzZSBpZiAoU3RhdGUgJiBJTlNFUlQpCisJICAgIGluc19ob3JzY3JvbGwoKTsKKwllbHNlIGlmIChTdGF0ZSAmIENNRExJTkUpCisJeworCSAgICBpZiAoIW1zZ19zY3JvbGxlZCkKKwkgICAgeworCQlndWlfZG9faG9yaXpfc2Nyb2xsKCk7CisJCXJlZHJhd2NtZGxpbmUoKTsKKwkgICAgfQorCX0KKwlpZiAob2xkX2xlZnRjb2wgIT0gY3Vyd2luLT53X2xlZnRjb2wpCisJeworCSAgICB1cGRhdGVXaW5kb3coY3Vyd2luKTsgICAvKiB1cGRhdGUgd2luZG93LCBzdGF0dXMgYW5kIGNtZGxpbmUgKi8KKwkgICAgc2V0Y3Vyc29yKCk7CisJfQorI2Vsc2UKKwlieXRlc1swXSA9IENTSTsKKwlieXRlc1sxXSA9IEtTX0hPUl9TQ1JPTExCQVI7CisJYnl0ZXNbMl0gPSBLRV9GSUxMRVI7CisJYnl0ZV9jb3VudCA9IDM7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorIyBpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKyAgICAvKgorICAgICAqIHN5bmNocm9uaXplIG90aGVyIHdpbmRvd3MsIGFzIG5lY2Vzc2FyeSBhY2NvcmRpbmcgdG8gJ3Njcm9sbGJpbmQnCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d19wX3NjYgorCSAgICAmJiAoKHNiLT53cCA9PSBOVUxMICYmIGN1cndpbi0+d19sZWZ0Y29sICE9IG9sZF9sZWZ0Y29sKQorCQl8fCAoc2ItPndwID09IGN1cndpbiAmJiAoY3Vyd2luLT53X3RvcGxpbmUgIT0gb2xkX3RvcGxpbmUKKyMgIGlmZGVmIEZFQVRfRElGRgorCQkJCQkgICB8fCBjdXJ3aW4tPndfdG9wZmlsbCAhPSBvbGRfdG9wZmlsbAorIyAgZW5kaWYKKwkJCSkpKSkKKyAgICB7CisJZG9fY2hlY2tfc2Nyb2xsYmluZChUUlVFKTsKKwkvKiBuZWVkIHRvIHVwZGF0ZSB0aGUgd2luZG93IHJpZ2h0IGhlcmUgKi8KKwlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwkgICAgaWYgKHdwLT53X3JlZHJfdHlwZSA+IDApCisJCXVwZGF0ZVdpbmRvdyh3cCk7CisJc2V0Y3Vyc29yKCk7CisgICAgfQorIyBlbmRpZgorICAgIG91dF9mbHVzaCgpOworICAgIGd1aV91cGRhdGVfY3Vyc29yKEZBTFNFLCBUUlVFKTsKKyNlbHNlCisgICAgYWRkX2xvbmdfdG9fYnVmKChsb25nKXZhbHVlLCBieXRlcyArIGJ5dGVfY291bnQpOworICAgIGFkZF90b19pbnB1dF9idWYoYnl0ZXMsIGJ5dGVfY291bnQgKyBzaXplb2YobG9uZ191KSk7CisjZW5kaWYKK30KKworLyoKKyAqIFNjcm9sbGJhciBzdHVmZjoKKyAqLworCisgICAgdm9pZAorZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKGZvcmNlKQorICAgIGludAkJZm9yY2U7CSAgICAvKiBGb3JjZSBhbGwgc2Nyb2xsYmFycyB0byBnZXQgdXBkYXRlZCAqLworeworICAgIHdpbl9UCSp3cDsKKyAgICBzY3JvbGxiYXJfVAkqc2I7CisgICAgbG9uZwl2YWwsIHNpemUsIG1heDsJCS8qIG5lZWQgMzIgYml0cyBoZXJlICovCisgICAgaW50CQl3aGljaF9zYjsKKyAgICBpbnQJCWgsIHk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBzdGF0aWMgd2luX1QgKnByZXZfY3Vyd2luID0gTlVMTDsKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciAqLworICAgIGd1aV91cGRhdGVfaG9yaXpfc2Nyb2xsYmFyKGZvcmNlKTsKKworI2lmbmRlZiBXSU4zMjY0CisgICAgLyogUmV0dXJuIHN0cmFpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbmVpdGhlciBhIGxlZnQgbm9yIHJpZ2h0IHNjcm9sbGJhci4KKyAgICAgKiBPbiBNUy1XaW5kb3dzIHRoaXMgaXMgcmVxdWlyZWQgYW55d2F5IGZvciBzY3JvbGx3aGVlbCBtZXNzYWdlcy4gKi8KKyAgICBpZiAoIWd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0gJiYgIWd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfUklHSFRdKQorCXJldHVybjsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBEb24ndCB3YW50IHRvIHVwZGF0ZSBhIHNjcm9sbGJhciB3aGlsZSB3ZSdyZSBkcmFnZ2luZyBpdC4gIEJ1dCBpZiB3ZQorICAgICAqIGhhdmUgYm90aCBhIGxlZnQgYW5kIHJpZ2h0IHNjcm9sbGJhciwgYW5kIHdlIGRyYWcgb25lIG9mIHRoZW0sIHdlIHN0aWxsCisgICAgICogbmVlZCB0byB1cGRhdGUgdGhlIG90aGVyIG9uZS4KKyAgICAgKi8KKyAgICBpZiAoICAgICAgIChndWkuZHJhZ2dlZF9zYiA9PSBTQkFSX0xFRlQKKwkJfHwgZ3VpLmRyYWdnZWRfc2IgPT0gU0JBUl9SSUdIVCkKKwkgICAgJiYgKCFndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdCisJCXx8ICFndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXSkKKwkgICAgJiYgIWZvcmNlKQorCXJldHVybjsKKworICAgIGlmICghZm9yY2UgJiYgKGd1aS5kcmFnZ2VkX3NiID09IFNCQVJfTEVGVCB8fCBndWkuZHJhZ2dlZF9zYiA9PSBTQkFSX1JJR0hUKSkKKyAgICB7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIHR3byBzY3JvbGxiYXJzIGFuZCBvbmUgb2YgdGhlbSBpcyBiZWluZyBkcmFnZ2VkLCBqdXN0CisJICogY29weSB0aGUgc2Nyb2xsYmFyIHBvc2l0aW9uIGZyb20gdGhlIGRyYWdnZWQgb25lIHRvIHRoZSBvdGhlciBvbmUuCisJICovCisJd2hpY2hfc2IgPSBTQkFSX0xFRlQgKyBTQkFSX1JJR0hUIC0gZ3VpLmRyYWdnZWRfc2I7CisJaWYgKGd1aS5kcmFnZ2VkX3dwICE9IE5VTEwpCisJICAgIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYigKKwkJICAgICZndWkuZHJhZ2dlZF93cC0+d19zY3JvbGxiYXJzW3doaWNoX3NiXSwKKwkJICAgIGd1aS5kcmFnZ2VkX3dwLT53X3Njcm9sbGJhcnNbMF0udmFsdWUsCisJCSAgICBndWkuZHJhZ2dlZF93cC0+d19zY3JvbGxiYXJzWzBdLnNpemUsCisJCSAgICBndWkuZHJhZ2dlZF93cC0+d19zY3JvbGxiYXJzWzBdLm1heCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGF2b2lkIHRoYXQgbW92aW5nIGNvbXBvbmVudHMgYXJvdW5kIGdlbmVyYXRlcyBldmVudHMgKi8KKyAgICArK2hvbGRfZ3VpX2V2ZW50czsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSBXX05FWFQod3ApKQorICAgIHsKKwlpZiAod3AtPndfYnVmZmVyID09IE5VTEwpCS8qIGp1c3QgaW4gY2FzZSAqLworCSAgICBjb250aW51ZTsKKyNpZmRlZiBTQ1JPTExfUEFTVF9FTkQKKwltYXggPSB3cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCAtIDE7CisjZWxzZQorCW1heCA9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50ICsgd3AtPndfaGVpZ2h0IC0gMjsKKyNlbmRpZgorCWlmIChtYXggPCAwKQkJCS8qIGVtcHR5IGJ1ZmZlciAqLworCSAgICBtYXggPSAwOworCXZhbCA9IHdwLT53X3RvcGxpbmUgLSAxOworCXNpemUgPSB3cC0+d19oZWlnaHQ7CisjaWZkZWYgU0NST0xMX1BBU1RfRU5ECisJaWYgKHZhbCA+IG1heCkJCQkvKiBqdXN0IGluIGNhc2UgKi8KKwkgICAgdmFsID0gbWF4OworI2Vsc2UKKwlpZiAoc2l6ZSA+IG1heCArIDEpCQkvKiBqdXN0IGluIGNhc2UgKi8KKwkgICAgc2l6ZSA9IG1heCArIDE7CisJaWYgKHZhbCA+IG1heCAtIHNpemUgKyAxKQorCSAgICB2YWwgPSBtYXggLSBzaXplICsgMTsKKyNlbmRpZgorCWlmICh2YWwgPCAwKQkJCS8qIG1pbmltYWwgdmFsdWUgaXMgMCAqLworCSAgICB2YWwgPSAwOworCisJLyoKKwkgKiBTY3JvbGxiYXIgYXQgaW5kZXggMCAodGhlIGxlZnQgb25lKSBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uLgorCSAqIEl0IHdvdWxkIGJlIHRoZSBzYW1lIGluZm8gZm9yIGxlZnQgYW5kIHJpZ2h0IHNvIHdlIGp1c3Qgc3RvcmUgaXQgZm9yCisJICogb25lIG9mIHRoZW0uCisJICovCisJc2IgPSAmd3AtPndfc2Nyb2xsYmFyc1swXTsKKworCS8qCisJICogTm90ZTogbm8gY2hlY2sgZm9yIHZhbGlkIHdfYm90bGluZS4JSWYgaXQncyBub3QgdmFsaWQgdGhlCisJICogc2Nyb2xsYmFycyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgYW55d2F5LgorCSAqLworCWlmIChzaXplIDwgMSB8fCB3cC0+d19ib3RsaW5lIC0gMiA+IG1heCkKKwl7CisJICAgIC8qCisJICAgICAqIFRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgY2hhbmdpbmcgZmlsZXMuICBKdXN0IGRvbid0IHVwZGF0ZSB0aGUKKwkgICAgICogc2Nyb2xsYmFyIGZvciBub3cuCisJICAgICAqLworCSAgICBzYi0+aGVpZ2h0ID0gMDsJICAgIC8qIEZvcmNlIHVwZGF0ZSBuZXh0IHRpbWUgKi8KKwkgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0pCisJCWd1aV9kb19zY3JvbGxiYXIod3AsIFNCQVJfTEVGVCwgRkFMU0UpOworCSAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0pCisJCWd1aV9kb19zY3JvbGxiYXIod3AsIFNCQVJfUklHSFQsIEZBTFNFKTsKKwkgICAgY29udGludWU7CisJfQorCWlmIChmb3JjZSB8fCBzYi0+aGVpZ2h0ICE9IHdwLT53X2hlaWdodAorI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICB8fCBzYi0+dG9wICE9IHdwLT53X3dpbnJvdworCSAgICB8fCBzYi0+c3RhdHVzX2hlaWdodCAhPSB3cC0+d19zdGF0dXNfaGVpZ2h0CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIHx8IHNiLT53aWR0aCAhPSB3cC0+d193aWR0aAorCSAgICB8fCBwcmV2X2N1cndpbiAhPSBjdXJ3aW4KKyMgZW5kaWYKKyNlbmRpZgorCSAgICApCisJeworCSAgICAvKiBIZWlnaHQsIHdpZHRoIG9yIHBvc2l0aW9uIG9mIHNjcm9sbGJhciBoYXMgY2hhbmdlZC4gIEZvcgorCSAgICAgKiB2ZXJ0aWNhbCBzcGxpdDogY3Vyd2luIGNoYW5nZWQuICovCisJICAgIHNiLT5oZWlnaHQgPSB3cC0+d19oZWlnaHQ7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIHNiLT50b3AgPSB3cC0+d193aW5yb3c7CisJICAgIHNiLT5zdGF0dXNfaGVpZ2h0ID0gd3AtPndfc3RhdHVzX2hlaWdodDsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgc2ItPndpZHRoID0gd3AtPndfd2lkdGg7CisjIGVuZGlmCisjZW5kaWYKKworCSAgICAvKiBDYWxjdWxhdGUgaGVpZ2h0IGFuZCBwb3NpdGlvbiBpbiBwaXhlbHMgKi8KKwkgICAgaCA9IChzYi0+aGVpZ2h0ICsgc2ItPnN0YXR1c19oZWlnaHQpICogZ3VpLmNoYXJfaGVpZ2h0OworCSAgICB5ID0gc2ItPnRvcCAqIGd1aS5jaGFyX2hlaWdodCArIGd1aS5ib3JkZXJfb2Zmc2V0OworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9HVEspICYmICFkZWZpbmVkKEZFQVRfR1VJX01PVElGKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisJICAgIGlmIChndWkubWVudV9pc19hY3RpdmUpCisJCXkgKz0gZ3VpLm1lbnVfaGVpZ2h0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgKGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSkKKwkgICAgaWYgKHZpbV9zdHJjaHIocF9nbywgR09fVE9PTEJBUikgIT0gTlVMTCkKKyMgaWZkZWYgRkVBVF9HVUlfQVRIRU5BCisJCXkgKz0gZ3VpLnRvb2xiYXJfaGVpZ2h0OworIyBlbHNlCisjICBpZmRlZiBGRUFUX0dVSV9NU1dJTgorCQl5ICs9IFRPT0xCQVJfQlVUVE9OX0hFSUdIVCArIFRPT0xCQVJfQk9SREVSX0hFSUdIVDsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICBpZiAod3AtPndfd2lucm93ID09IDApCisjZW5kaWYKKwkgICAgeworCQkvKiBIZWlnaHQgb2YgdG9wIHNjcm9sbGJhciBpbmNsdWRlcyB3aWR0aCBvZiB0b3AgYm9yZGVyICovCisJCWggKz0gZ3VpLmJvcmRlcl9vZmZzZXQ7CisJCXkgLT0gZ3VpLmJvcmRlcl9vZmZzZXQ7CisJICAgIH0KKwkgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0pCisJICAgIHsKKwkJZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3Bvcygmd3AtPndfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdLAorCQkJCQkgIGd1aS5sZWZ0X3NiYXJfeCwgeSwKKwkJCQkJICBndWkuc2Nyb2xsYmFyX3dpZHRoLCBoKTsKKwkJZ3VpX2RvX3Njcm9sbGJhcih3cCwgU0JBUl9MRUZULCBUUlVFKTsKKwkgICAgfQorCSAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0pCisJICAgIHsKKwkJZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3Bvcygmd3AtPndfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXSwKKwkJCQkJICBndWkucmlnaHRfc2Jhcl94LCB5LAorCQkJCQkgIGd1aS5zY3JvbGxiYXJfd2lkdGgsIGgpOworCQlndWlfZG9fc2Nyb2xsYmFyKHdwLCBTQkFSX1JJR0hULCBUUlVFKTsKKwkgICAgfQorCX0KKworCS8qIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYigpIGJ5CisJICogY2hlY2tpbmcgaWYgdGhlIHRodW1iIG1vdmVkIGF0IGxlYXN0IGEgcGl4ZWwuICBPbmx5IGRvIHRoaXMgZm9yCisJICogQXRoZW5hLCBtb3N0IG90aGVyIEdVSXMgcmVxdWlyZSB0aGUgdXBkYXRlIGFueXdheSB0byBtYWtlIHRoZQorCSAqIGFycm93cyB3b3JrLiAqLworI2lmZGVmIEZFQVRfR1VJX0FUSEVOQQorCWlmIChtYXggPT0gMCkKKwkgICAgeSA9IDA7CisJZWxzZQorCSAgICB5ID0gKHZhbCAqIChzYi0+aGVpZ2h0ICsgMikgKiBndWkuY2hhcl9oZWlnaHQgKyBtYXggLyAyKSAvIG1heDsKKwlpZiAoZm9yY2UgfHwgc2ItPnBpeHZhbCAhPSB5IHx8IHNiLT5zaXplICE9IHNpemUgfHwgc2ItPm1heCAhPSBtYXgpCisjZWxzZQorCWlmIChmb3JjZSB8fCBzYi0+dmFsdWUgIT0gdmFsIHx8IHNiLT5zaXplICE9IHNpemUgfHwgc2ItPm1heCAhPSBtYXgpCisjZW5kaWYKKwl7CisJICAgIC8qIFRodW1iIG9mIHNjcm9sbGJhciBoYXMgbW92ZWQgKi8KKwkgICAgc2ItPnZhbHVlID0gdmFsOworI2lmZGVmIEZFQVRfR1VJX0FUSEVOQQorCSAgICBzYi0+cGl4dmFsID0geTsKKyNlbmRpZgorCSAgICBzYi0+c2l6ZSA9IHNpemU7CisJICAgIHNiLT5tYXggPSBtYXg7CisJICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdICYmIGd1aS5kcmFnZ2VkX3NiICE9IFNCQVJfTEVGVCkKKwkJZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKCZ3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0sCisJCQkJCSAgICB2YWwsIHNpemUsIG1heCk7CisJICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXQorCQkJCQkmJiBndWkuZHJhZ2dlZF9zYiAhPSBTQkFSX1JJR0hUKQorCQlndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoJndwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0sCisJCQkJCSAgICB2YWwsIHNpemUsIG1heCk7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIHByZXZfY3Vyd2luID0gY3Vyd2luOworI2VuZGlmCisgICAgLS1ob2xkX2d1aV9ldmVudHM7Cit9CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBhIHNjcm9sbGJhci4KKyAqIENoZWNrIGZvciBzY3JvbGxiYXJzIGZvciB2ZXJ0aWNhbGx5IHNwbGl0IHdpbmRvd3Mgd2hpY2ggYXJlIG5vdCBlbmFibGVkCisgKiBzb21ldGltZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2RvX3Njcm9sbGJhcih3cCwgd2hpY2gsIGVuYWJsZSkKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl3aGljaDsJICAgIC8qIFNCQVJfTEVGVCBvciBTQkFSX1JJR0hUICovCisgICAgaW50CQllbmFibGU7CSAgICAvKiBUUlVFIHRvIGVuYWJsZSBzY3JvbGxiYXIgKi8KK3sKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGludAkJbWlkY29sID0gY3Vyd2luLT53X3dpbmNvbCArIGN1cndpbi0+d193aWR0aCAvIDI7CisgICAgaW50CQloYXNfbWlkY29sID0gKHdwLT53X3dpbmNvbCA8PSBtaWRjb2wKKwkJCQkgICAgICYmIHdwLT53X3dpbmNvbCArIHdwLT53X3dpZHRoID49IG1pZGNvbCk7CisKKyAgICAvKiBPbmx5IGVuYWJsZSBzY3JvbGxiYXJzIHRoYXQgY29udGFpbiB0aGUgbWlkZGxlIGNvbHVtbiBvZiB0aGUgY3VycmVudAorICAgICAqIHdpbmRvdy4gKi8KKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0gIT0gZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKKyAgICB7CisJLyogU2Nyb2xsYmFycyBvbmx5IG9uIG9uZSBzaWRlLiAgRG9uJ3QgZW5hYmxlIHNjcm9sbGJhcnMgdGhhdCBkb24ndAorCSAqIGNvbnRhaW4gdGhlIG1pZGRsZSBjb2x1bW4gb2YgdGhlIGN1cnJlbnQgd2luZG93LiAqLworCWlmICghaGFzX21pZGNvbCkKKwkgICAgZW5hYmxlID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogU2Nyb2xsYmFycyBvbiBib3RoIHNpZGVzLiAgRG9uJ3QgZW5hYmxlIHNjcm9sbGJhcnMgdGhhdCBuZWl0aGVyCisJICogY29udGFpbiB0aGUgbWlkZGxlIGNvbHVtbiBvZiB0aGUgY3VycmVudCB3aW5kb3cgbm9yIGFyZSBvbiB0aGUgZmFyCisJICogc2lkZS4gKi8KKwlpZiAobWlkY29sID4gQ29sdW1ucyAvIDIpCisJeworCSAgICBpZiAod2hpY2ggPT0gU0JBUl9MRUZUID8gd3AtPndfd2luY29sICE9IDAgOiAhaGFzX21pZGNvbCkKKwkJZW5hYmxlID0gRkFMU0U7CisJfQorCWVsc2UKKwl7CisJICAgIGlmICh3aGljaCA9PSBTQkFSX1JJR0hUID8gd3AtPndfd2luY29sICsgd3AtPndfd2lkdGggIT0gQ29sdW1ucworCQkJCQkJCQk6ICFoYXNfbWlkY29sKQorCQllbmFibGUgPSBGQUxTRTsKKwl9CisgICAgfQorI2VuZGlmCisgICAgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyKCZ3cC0+d19zY3JvbGxiYXJzW3doaWNoXSwgZW5hYmxlKTsKK30KKworLyoKKyAqIFNjcm9sbCBhIHdpbmRvdyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlcyBzZXQgaW4gdGhlIGdsb2JhbHMgY3VycmVudF9zY3JvbGxiYXIKKyAqIGFuZCBzY3JvbGxiYXJfdmFsdWUuICBSZXR1cm4gVFJVRSBpZiB0aGUgY3Vyc29yIGluIHRoZSBjdXJyZW50IHdpbmRvdyBtb3ZlZAorICogb3IgRkFMU0Ugb3RoZXJ3aXNlLgorICovCisgICAgaW50CitndWlfZG9fc2Nyb2xsKCkKK3sKKyAgICB3aW5fVAkqd3AsICpzYXZlX3dwOworICAgIGludAkJaTsKKyAgICBsb25nCW5saW5lczsKKyAgICBwb3NfVAlvbGRfY3Vyc29yOworICAgIGxpbmVucl9UCW9sZF90b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJb2xkX3RvcGZpbGw7CisjZW5kaWYKKworICAgIGZvciAod3AgPSBmaXJzdHdpbiwgaSA9IDA7IGkgPCBjdXJyZW50X3Njcm9sbGJhcjsgd3AgPSBXX05FWFQod3ApLCBpKyspCisJaWYgKHdwID09IE5VTEwpCisJICAgIGJyZWFrOworICAgIGlmICh3cCA9PSBOVUxMKQorCS8qIENvdWxkbid0IGZpbmQgd2luZG93ICovCisJcmV0dXJuIEZBTFNFOworCisgICAgLyoKKyAgICAgKiBDb21wdXRlIG51bWJlciBvZiBsaW5lcyB0byBzY3JvbGwuICBJZiB6ZXJvLCBub3RoaW5nIHRvIGRvLgorICAgICAqLworICAgIG5saW5lcyA9IChsb25nKXNjcm9sbGJhcl92YWx1ZSArIDEgLSAobG9uZyl3cC0+d190b3BsaW5lOworICAgIGlmIChubGluZXMgPT0gMCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBzYXZlX3dwID0gY3Vyd2luOworICAgIG9sZF90b3BsaW5lID0gd3AtPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBvbGRfdG9wZmlsbCA9IHdwLT53X3RvcGZpbGw7CisjZW5kaWYKKyAgICBvbGRfY3Vyc29yID0gd3AtPndfY3Vyc29yOworICAgIGN1cndpbiA9IHdwOworICAgIGN1cmJ1ZiA9IHdwLT53X2J1ZmZlcjsKKyAgICBpZiAobmxpbmVzIDwgMCkKKwlzY3JvbGxkb3duKC1ubGluZXMsIGd1aS5kcmFnZ2VkX3dwID09IE5VTEwpOworICAgIGVsc2UKKwlzY3JvbGx1cChubGluZXMsIGd1aS5kcmFnZ2VkX3dwID09IE5VTEwpOworICAgIC8qIFJlc2V0IGRyYWdnZWRfd3AgYWZ0ZXIgdXNpbmcgaXQuICAiZHJhZ2dlZF9zYiIgd2lsbCBoYXZlIGJlZW4gcmVzZXQgZm9yCisgICAgICogdGhlIG1vdXNlLXVwIGV2ZW50IGFscmVhZHksIGJ1dCB3ZSBzdGlsbCB3YW50IGl0IHRvIGJlaGF2ZSBsaWtlIHdoZW4KKyAgICAgKiBkcmFnZ2luZy4gIEJ1dCBub3QgdGhlIG5leHQgY2xpY2sgaW4gYW4gYXJyb3cuICovCisgICAgaWYgKGd1aS5kcmFnZ2VkX3NiID09IFNCQVJfTk9ORSkKKwlndWkuZHJhZ2dlZF93cCA9IE5VTEw7CisKKyAgICBpZiAob2xkX3RvcGxpbmUgIT0gd3AtPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCSAgICB8fCBvbGRfdG9wZmlsbCAhPSB3cC0+d190b3BmaWxsCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlpZiAocF9zbyAhPSAwKQorCXsKKwkgICAgY3Vyc29yX2NvcnJlY3QoKTsJCS8qIGZpeCB3aW5kb3cgZm9yICdzbycgKi8KKwkgICAgdXBkYXRlX3RvcGxpbmUoKTsJCS8qIGF2b2lkIHVwL2Rvd24ganVtcCAqLworCX0KKwlpZiAob2xkX2N1cnNvci5sbnVtICE9IHdwLT53X2N1cnNvci5sbnVtKQorCSAgICBjb2xhZHZhbmNlKHdwLT53X2N1cnN3YW50KTsKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwl3cC0+d19zY2JpbmRfcG9zID0gd3AtPndfdG9wbGluZTsKKyNlbmRpZgorICAgIH0KKworICAgIGN1cndpbiA9IHNhdmVfd3A7CisgICAgY3VyYnVmID0gc2F2ZV93cC0+d19idWZmZXI7CisKKyAgICAvKgorICAgICAqIERvbid0IGNhbGwgdXBkYXRlV2luZG93KCkgd2hlbiBub3RoaW5nIGhhcyBjaGFuZ2VkIChpdCB3aWxsIG92ZXJ3cml0ZQorICAgICAqIHRoZSBzdGF0dXMgbGluZSEpLgorICAgICAqLworICAgIGlmIChvbGRfdG9wbGluZSAhPSB3cC0+d190b3BsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJICAgIHx8IG9sZF90b3BmaWxsICE9IHdwLT53X3RvcGZpbGwKKyNlbmRpZgorCSAgICApCisgICAgeworCXJlZHJhd193aW5fbGF0ZXIod3AsIFZBTElEKTsKKwl1cGRhdGVXaW5kb3cod3ApOyAgIC8qIHVwZGF0ZSB3aW5kb3csIHN0YXR1cyBsaW5lLCBhbmQgY21kbGluZSAqLworICAgIH0KKworICAgIHJldHVybiAod3AgPT0gY3Vyd2luICYmICFlcXVhbHBvcyhjdXJ3aW4tPndfY3Vyc29yLCBvbGRfY3Vyc29yKSk7Cit9CisKKworLyoKKyAqIEhvcml6b250YWwgc2Nyb2xsYmFyIHN0dWZmOgorICovCisKKy8qCisgKiBSZXR1cm4gbGVuZ3RoIG9mIGxpbmUgImxudW0iIGZvciBob3Jpem9udGFsIHNjcm9sbGluZy4KKyAqLworICAgIHN0YXRpYyBjb2xucl9UCitzY3JvbGxfbGluZV9sZW4obG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGNoYXJfdQkqcDsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBpbnQJCXc7CisKKyAgICBwID0gbWxfZ2V0KGxudW0pOworICAgIGNvbCA9IDA7CisgICAgaWYgKCpwICE9IE5VTCkKKwlmb3IgKDs7KQorCXsKKwkgICAgdyA9IGNoYXJ0YWJzaXplKHAsIGNvbCk7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3A7CisJICAgIGlmICgqcCA9PSBOVUwpCQkvKiBkb24ndCBjb3VudCB0aGUgbGFzdCBjaGFyYWN0ZXIgKi8KKwkJYnJlYWs7CisJICAgIGNvbCArPSB3OworCX0KKyAgICByZXR1cm4gY29sOworfQorCisvKiBSZW1lbWJlciB3aGljaCBsaW5lIGlzIGN1cnJlbnRseSB0aGUgbG9uZ2VzdCwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvCisgKiBzZWFyY2ggZm9yIGl0IHdoZW4gc2Nyb2xsaW5nIGhvcml6b250YWxseS4gKi8KK3N0YXRpYyBsaW5lbnJfVCBsb25nZXN0X2xudW0gPSAwOworCisgICAgc3RhdGljIHZvaWQKK2d1aV91cGRhdGVfaG9yaXpfc2Nyb2xsYmFyKGZvcmNlKQorICAgIGludAkJZm9yY2U7Cit7CisgICAgbG9uZwl2YWx1ZSwgc2l6ZSwgbWF4OwkvKiBuZWVkIDMyIGJpdCBpbnRzIGhlcmUgKi8KKworICAgIGlmICghZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9CT1RUT01dKQorCXJldHVybjsKKworICAgIGlmICghZm9yY2UgJiYgZ3VpLmRyYWdnZWRfc2IgPT0gU0JBUl9CT1RUT00pCisJcmV0dXJuOworCisgICAgaWYgKCFmb3JjZSAmJiBjdXJ3aW4tPndfcF93cmFwICYmIGd1aS5wcmV2X3dyYXApCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGN1cnNvciB0byBiZSBpbnZhbGlkIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YKKyAgICAgKiBzb21ldGhpbmcgKGxpa2UgY2hhbmdpbmcgZmlsZXMpLiAgSWYgc28sIGRvbid0IGRvIGFueXRoaW5nIGZvciBub3cuCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorICAgIHsKKwlndWkuYm90dG9tX3NiYXIudmFsdWUgPSAtMTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc2l6ZSA9IFdfV0lEVEgoY3Vyd2luKTsKKyAgICBpZiAoY3Vyd2luLT53X3Bfd3JhcCkKKyAgICB7CisJdmFsdWUgPSAwOworI2lmZGVmIFNDUk9MTF9QQVNUX0VORAorCW1heCA9IDA7CisjZWxzZQorCW1heCA9IFdfV0lEVEgoY3Vyd2luKSAtIDE7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl2YWx1ZSA9IGN1cndpbi0+d19sZWZ0Y29sOworCisJLyogQ2FsY3VsYXRlIG1heGltdW0gZm9yIGhvcml6b250YWwgc2Nyb2xsYmFyLiAgQ2hlY2sgZm9yIHJlYXNvbmFibGUKKwkgKiBsaW5lIG51bWJlcnMsIHRvcGxpbmUgYW5kIGJvdGxpbmUgY2FuIGJlIGludmFsaWQgd2hlbiBkaXNwbGF5aW5nIGlzCisJICogcG9zdHBvbmVkLiAqLworCWlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX0hPUlNDUk9MTCkgPT0gTlVMTAorCQkmJiBjdXJ3aW4tPndfdG9wbGluZSA8PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJJiYgY3Vyd2luLT53X2JvdGxpbmUgPiBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJJiYgY3Vyd2luLT53X2JvdGxpbmUgPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgKyAxKQorCXsKKwkgICAgbGluZW5yX1QJbG51bTsKKwkgICAgY29sbnJfVAluOworCisJICAgIC8qIFVzZSBtYXhpbXVtIG9mIGFsbCB2aXNpYmxlIGxpbmVzLiAgUmVtZW1iZXIgdGhlIGxudW0gb2YgdGhlCisJICAgICAqIGxvbmdlc3QgbGluZSwgY2xvc3Rlc3QgdG8gdGhlIGN1cnNvciBsaW5lLiAgVXNlZCB3aGVuIHNjcm9sbGluZworCSAgICAgKiBiZWxvdy4gKi8KKwkgICAgbWF4ID0gMDsKKwkgICAgZm9yIChsbnVtID0gY3Vyd2luLT53X3RvcGxpbmU7IGxudW0gPCBjdXJ3aW4tPndfYm90bGluZTsgKytsbnVtKQorCSAgICB7CisJCW4gPSBzY3JvbGxfbGluZV9sZW4obG51bSk7CisJCWlmIChuID4gKGNvbG5yX1QpbWF4KQorCQl7CisJCSAgICBtYXggPSBuOworCQkgICAgbG9uZ2VzdF9sbnVtID0gbG51bTsKKwkJfQorCQllbHNlIGlmIChuID09IChjb2xucl9UKW1heAorCQkJJiYgYWJzKChpbnQpKGxudW0gLSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pKQorCQkJICAgPCBhYnMoKGludCkobG9uZ2VzdF9sbnVtIC0gY3Vyd2luLT53X2N1cnNvci5sbnVtKSkpCisJCSAgICBsb25nZXN0X2xudW0gPSBsbnVtOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgLyogVXNlIGN1cnNvciBsaW5lIG9ubHkuICovCisJICAgIG1heCA9IHNjcm9sbF9saW5lX2xlbihjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwlpZiAodmlydHVhbF9hY3RpdmUoKSkKKwl7CisJICAgIC8qIE1heSBtb3ZlIHRoZSBjdXJzb3IgZXZlbiBmdXJ0aGVyIHRvIHRoZSByaWdodC4gKi8KKwkgICAgaWYgKGN1cndpbi0+d192aXJ0Y29sID49IChjb2xucl9UKW1heCkKKwkJbWF4ID0gY3Vyd2luLT53X3ZpcnRjb2w7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgU0NST0xMX1BBU1RfRU5ECisJbWF4ICs9IFdfV0lEVEgoY3Vyd2luKSAtIDE7CisjZW5kaWYKKwkvKiBUaGUgbGluZSBudW1iZXIgaXNuJ3Qgc2Nyb2xsZWQsIHRodXMgdGhlcmUgaXMgbGVzcyBzcGFjZSB3aGVuCisJICogJ251bWJlcicgaXMgc2V0IChhbHNvIGZvciAnZm9sZGNvbHVtbicpLiAqLworCXNpemUgLT0gY3Vyd2luX2NvbF9vZmYoKTsKKyNpZm5kZWYgU0NST0xMX1BBU1RfRU5ECisJbWF4IC09IGN1cndpbl9jb2xfb2ZmKCk7CisjZW5kaWYKKyAgICB9CisKKyNpZm5kZWYgU0NST0xMX1BBU1RfRU5ECisgICAgaWYgKHZhbHVlID4gbWF4IC0gc2l6ZSArIDEpCisJdmFsdWUgPSBtYXggLSBzaXplICsgMTsJICAgIC8qIGxpbWl0IHRoZSB2YWx1ZSB0byBhbGxvd2FibGUgcmFuZ2UgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoY3Vyd2luLT53X3BfcmwpCisgICAgeworCXZhbHVlID0gbWF4ICsgMSAtIHNpemUgLSB2YWx1ZTsKKwlpZiAodmFsdWUgPCAwKQorCXsKKwkgICAgc2l6ZSArPSB2YWx1ZTsKKwkgICAgdmFsdWUgPSAwOworCX0KKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIWZvcmNlICYmIHZhbHVlID09IGd1aS5ib3R0b21fc2Jhci52YWx1ZSAmJiBzaXplID09IGd1aS5ib3R0b21fc2Jhci5zaXplCisJCQkJCQkmJiBtYXggPT0gZ3VpLmJvdHRvbV9zYmFyLm1heCkKKwlyZXR1cm47CisKKyAgICBndWkuYm90dG9tX3NiYXIudmFsdWUgPSB2YWx1ZTsKKyAgICBndWkuYm90dG9tX3NiYXIuc2l6ZSA9IHNpemU7CisgICAgZ3VpLmJvdHRvbV9zYmFyLm1heCA9IG1heDsKKyAgICBndWkucHJldl93cmFwID0gY3Vyd2luLT53X3Bfd3JhcDsKKworICAgIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYigmZ3VpLmJvdHRvbV9zYmFyLCB2YWx1ZSwgc2l6ZSwgbWF4KTsKK30KKworLyoKKyAqIERvIGEgaG9yaXpvbnRhbCBzY3JvbGwuICBSZXR1cm4gVFJVRSBpZiB0aGUgY3Vyc29yIG1vdmVkLCBGQUxTRSBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2d1aV9kb19ob3Jpel9zY3JvbGwoKQoreworICAgIC8qIG5vIHdyYXBwaW5nLCBubyBzY3JvbGxpbmcgKi8KKyAgICBpZiAoY3Vyd2luLT53X3Bfd3JhcCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoY3Vyd2luLT53X2xlZnRjb2wgPT0gc2Nyb2xsYmFyX3ZhbHVlKQorCXJldHVybiBGQUxTRTsKKworICAgIGN1cndpbi0+d19sZWZ0Y29sID0gc2Nyb2xsYmFyX3ZhbHVlOworCisgICAgLyogV2hlbiB0aGUgbGluZSBvZiB0aGUgY3Vyc29yIGlzIHRvbyBzaG9ydCwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZQorICAgICAqIGxvbmdlc3QgdmlzaWJsZSBsaW5lLiAgRG8gYSBzYW5pdHkgY2hlY2sgb24gImxvbmdlc3RfbG51bSIsIGp1c3QgaW4KKyAgICAgKiBjYXNlLiAqLworICAgIGlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX0hPUlNDUk9MTCkgPT0gTlVMTAorCSAgICAmJiBsb25nZXN0X2xudW0gPj0gY3Vyd2luLT53X3RvcGxpbmUKKwkgICAgJiYgbG9uZ2VzdF9sbnVtIDwgY3Vyd2luLT53X2JvdGxpbmUKKwkgICAgJiYgIXZpcnR1YWxfYWN0aXZlKCkpCisgICAgeworCWlmIChzY3JvbGxiYXJfdmFsdWUgPiBzY3JvbGxfbGluZV9sZW4oY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxvbmdlc3RfbG51bTsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gbGVmdGNvbF9jaGFuZ2VkKCk7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGJhY2tncm91bmQgY29sb3IKKyAqLworICAgIHZvaWQKK2d1aV9jaGVja19jb2xvcnMoKQoreworICAgIGlmIChndWkubm9ybV9waXhlbCA9PSBndWkuYmFja19waXhlbCB8fCBndWkubm9ybV9waXhlbCA9PSBJTlZBTENPTE9SKQorICAgIHsKKwlndWlfc2V0X2JnX2NvbG9yKChjaGFyX3UgKikiV2hpdGUiKTsKKwlpZiAoZ3VpLm5vcm1fcGl4ZWwgPT0gZ3VpLmJhY2tfcGl4ZWwgfHwgZ3VpLm5vcm1fcGl4ZWwgPT0gSU5WQUxDT0xPUikKKwkgICAgZ3VpX3NldF9mZ19jb2xvcigoY2hhcl91ICopIkJsYWNrIik7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX3NldF9mZ19jb2xvcihuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBndWkubm9ybV9waXhlbCA9IGd1aV9nZXRfY29sb3IobmFtZSk7CisgICAgaGxfc2V0X2ZnX2NvbG9yX25hbWUodmltX3N0cnNhdmUobmFtZSkpOworfQorCisgICAgdm9pZAorZ3VpX3NldF9iZ19jb2xvcihuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBndWkuYmFja19waXhlbCA9IGd1aV9nZXRfY29sb3IobmFtZSk7CisgICAgaGxfc2V0X2JnX2NvbG9yX25hbWUodmltX3N0cnNhdmUobmFtZSkpOworfQorCisvKgorICogQWxsb2NhdGUgYSBjb2xvciBieSBuYW1lLgorICogUmV0dXJucyBJTlZBTENPTE9SIGFuZCBnaXZlcyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZmFpbGVkLgorICovCisgICAgZ3VpY29sb3JfVAorZ3VpX2dldF9jb2xvcihuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBndWljb2xvcl9UCXQ7CisKKyAgICBpZiAoKm5hbWUgPT0gTlVMKQorCXJldHVybiBJTlZBTENPTE9SOworICAgIHQgPSBndWlfbWNoX2dldF9jb2xvcihuYW1lKTsKKyAgICBpZiAodCA9PSBJTlZBTENPTE9SCisjaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKQorCSAgICAmJiBndWkuaW5fdXNlCisjZW5kaWYKKwkgICAgKQorCUVNU0cyKF8oIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIpLCBuYW1lKTsKKyAgICByZXR1cm4gdDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgZ3JleSB2YWx1ZSBvZiBhIGNvbG9yIChyYW5nZSAwLTI1NSkuCisgKi8KKyAgICBpbnQKK2d1aV9nZXRfbGlnaHRuZXNzKHBpeGVsKQorICAgIGd1aWNvbG9yX1QJcGl4ZWw7Cit7CisgICAgbG9uZ191CXJnYiA9IGd1aV9tY2hfZ2V0X3JnYihwaXhlbCk7CisKKyAgICByZXR1cm4gKCAgKCgocmdiID4+IDE2KSAmIDB4ZmYpICogMjk5KQorCSAgICArICgoKHJnYiA+PiA4KSAgJiAweGZmKSAqIDU4NykKKwkgICAgKyAgKChyZ2IJICAgICYgMHhmZikgKiAxMTQpKSAvIDEwMDA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbmV3X3Njcm9sbGJhcl9jb2xvcnMoKQoreworICAgIHdpbl9UCSp3cDsKKworICAgIC8qIE5vdGhpbmcgdG8gZG8gaWYgR1VJIGhhc24ndCBzdGFydGVkIHlldC4gKi8KKyAgICBpZiAoIWd1aS5pbl91c2UpCisJcmV0dXJuOworCisgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorICAgIHsKKwlndWlfbWNoX3NldF9zY3JvbGxiYXJfY29sb3JzKCYod3AtPndfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKSk7CisJZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX2NvbG9ycygmKHdwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0pKTsKKyAgICB9CisgICAgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX2NvbG9ycygmZ3VpLmJvdHRvbV9zYmFyKTsKK30KKyNlbmRpZgorCisvKgorICogQ2FsbCB0aGlzIHdoZW4gZm9jdXMgaGFzIGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitndWlfZm9jdXNfY2hhbmdlKGluX2ZvY3VzKQorICAgIGludAkJaW5fZm9jdXM7Cit7CisvKgorICogU2tpcCB0aGlzIGNvZGUgdG8gYXZvaWQgZHJhd2luZyB0aGUgY3Vyc29yIHdoZW4gZGVidWdnaW5nIGFuZCBzd2l0Y2hpbmcKKyAqIGJldHdlZW4gdGhlIGRlYnVnZ2VyIHdpbmRvdyBhbmQgZ3ZpbS4KKyAqLworI2lmIDEKKyAgICBndWkuaW5fZm9jdXMgPSBpbl9mb2N1czsKKyAgICBvdXRfZmx1c2goKTsJCS8qIG1ha2Ugc3VyZSBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiAqLworICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKworIyBpZmRlZiBGRUFUX1hJTQorICAgIHhpbV9zZXRfZm9jdXMoaW5fZm9jdXMpOworIyBlbmRpZgorCisgICAgdWlfZm9jdXNfY2hhbmdlKGluX2ZvY3VzKTsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIG1vdmVkIChidXQgbm90IHdoZW4gZHJhZ2dpbmcpLgorICovCisgICAgdm9pZAorZ3VpX21vdXNlX21vdmVkKHgsIHkpCisgICAgaW50CQl4OworICAgIGludAkJeTsKK3sKKyAgICB3aW5fVAkqd3A7CisgICAgY2hhcl91CXN0WzZdOworCisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisgICAgLyogR2V0IHdpbmRvdyBwb2ludGVyLCBhbmQgdXBkYXRlIG1vdXNlIHNoYXBlIGFzIHdlbGwuICovCisgICAgd3AgPSB4eTJ3aW4oeCwgeSk7CisjZW5kaWYKKworICAgIC8qIE9ubHkgaGFuZGxlIHRoaXMgd2hlbiAnbW91c2Vmb2N1cycgc2V0IGFuZCAuLi4gKi8KKyAgICBpZiAocF9tb3VzZWYKKwkgICAgJiYgIWhvbGRfZ3VpX2V2ZW50cwkJLyogbm90IGhvbGRpbmcgZXZlbnRzICovCisJICAgICYmIChTdGF0ZSAmIChOT1JNQUx8SU5TRVJUKSkvKiBOb3JtYWwvVmlzdWFsL0luc2VydCBtb2RlICovCisJICAgICYmIFN0YXRlICE9IEhJVFJFVFVSTgkvKiBidXQgbm90IGhpdC1yZXR1cm4gcHJvbXB0ICovCisJICAgICYmIG1zZ19zY3JvbGxlZCA9PSAwCS8qIG5vIHNjcm9sbGVkIG1lc3NhZ2UgKi8KKwkgICAgJiYgIW5lZWRfbW91c2VfY29ycmVjdAkvKiBub3QgbW92aW5nIHRoZSBwb2ludGVyICovCisJICAgICYmIGd1aS5pbl9mb2N1cykJCS8qIGd2aW0gaW4gZm9jdXMgKi8KKyAgICB7CisJLyogRG9uJ3QgbW92ZSB0aGUgbW91c2Ugd2hlbiBpdCdzIGxlZnQgb3IgcmlnaHQgb2YgdGhlIFZpbSB3aW5kb3cgKi8KKwlpZiAoeCA8IDAgfHwgeCA+IENvbHVtbnMgKiBndWkuY2hhcl93aWR0aCkKKwkgICAgcmV0dXJuOworI2lmbmRlZiBGRUFUX01PVVNFU0hBUEUKKwl3cCA9IHh5Mndpbih4LCB5KTsKKyNlbmRpZgorCWlmICh3cCA9PSBjdXJ3aW4gfHwgd3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuOwkvKiBzdGlsbCBpbiB0aGUgc2FtZSBvbGQgd2luZG93LCBvciBub25lIGF0IGFsbCAqLworCisJLyoKKwkgKiBmb3JtYXQgYSBtb3VzZSBjbGljayBvbiBzdGF0dXMgbGluZSBpbnB1dAorCSAqIGFsYSBndWlfc2VuZF9tb3VzZV9ldmVudCgwLCB4LCB5LCAwLCAwKTsKKwkgKiBUcmljazogVXNlIGEgY29sdW1uIG9mIC0xLCBzbyB0aGF0IGNoZWNrX3Rlcm1jb2RlIHdpbGwgZ2VuZXJhdGUgYQorCSAqIEtfTEVGVE1PVVNFX05NIGtleSBjb2RlLgorCSAqLworCWlmIChmaW5pc2hfb3ApCisJeworCSAgICAvKiBhYm9ydCB0aGUgY3VycmVudCBvcGVyYXRvciBmaXJzdCAqLworCSAgICBzdFswXSA9IEVTQzsKKwkgICAgYWRkX3RvX2lucHV0X2J1ZihzdCwgMSk7CisJfQorCXN0WzBdID0gQ1NJOworCXN0WzFdID0gS1NfTU9VU0U7CisJc3RbMl0gPSBLRV9GSUxMRVI7CisJc3RbM10gPSAoY2hhcl91KU1PVVNFX0xFRlQ7CisJZmlsbF9tb3VzZV9jb29yZChzdCArIDQsCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJV19XSU5DT0wod3ApLAorI2Vsc2UKKwkJLTEsCisjZW5kaWYKKwkJd3AtPndfaGVpZ2h0ICsgV19XSU5ST1cod3ApKTsKKworCWFkZF90b19pbnB1dF9idWYoc3QsIDgpOworCXN0WzNdID0gKGNoYXJfdSlNT1VTRV9SRUxFQVNFOworCWFkZF90b19pbnB1dF9idWYoc3QsIDgpOworCisjaWZkZWYgRkVBVF9HVUlfR1RLCisJLyogTmVlZCB0byB3YWtlIHVwIHRoZSBtYWluIGxvb3AgKi8KKwlpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJICAgIGd0a19tYWluX3F1aXQoKTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIENhbGxlZCB3aGVuIG1vdXNlIHNob3VsZCBiZSBtb3ZlZCB0byB3aW5kb3cgd2l0aCBmb2N1cy4KKyAqLworICAgIHZvaWQKK2d1aV9tb3VzZV9jb3JyZWN0KCkKK3sKKyAgICBpbnQJCXgsIHk7CisgICAgd2luX1QJKndwID0gTlVMTDsKKworICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IEZBTFNFOworICAgIGlmIChndWkuaW5fdXNlICYmIHBfbW91c2VmKQorICAgIHsKKwl4ID0gZ3VpX21jaF9nZXRfbW91c2VfeCgpOworCS8qIERvbid0IG1vdmUgdGhlIG1vdXNlIHdoZW4gaXQncyBsZWZ0IG9yIHJpZ2h0IG9mIHRoZSBWaW0gd2luZG93ICovCisJaWYgKHggPCAwIHx8IHggPiBDb2x1bW5zICogZ3VpLmNoYXJfd2lkdGgpCisJICAgIHJldHVybjsKKwl5ID0gZ3VpX21jaF9nZXRfbW91c2VfeSgpOworCWlmICh5ID49IDApCisJICAgIHdwID0geHkyd2luKHgsIHkpOworCWlmICh3cCAhPSBjdXJ3aW4gJiYgd3AgIT0gTlVMTCkJLyogSWYgaW4gb3RoZXIgdGhhbiBjdXJyZW50IHdpbmRvdyAqLworCXsKKwkgICAgdmFsaWRhdGVfY2xpbmVfcm93KCk7CisJICAgIGd1aV9tY2hfc2V0bW91c2UoKGludClXX0VORENPTChjdXJ3aW4pICogZ3VpLmNoYXJfd2lkdGggLSAzLAorCQkJIChXX1dJTlJPVyhjdXJ3aW4pICsgY3Vyd2luLT53X3dyb3cpICogZ3VpLmNoYXJfaGVpZ2h0CisJCQkJCQkgICAgICsgKGd1aS5jaGFyX2hlaWdodCkgLyAyKTsKKwl9CisgICAgfQorfQorCisvKgorICogRmluZCB3aW5kb3cgd2hlcmUgdGhlIG1vdXNlIHBvaW50ZXIgInkiIGNvb3JkaW5hdGUgaXMgaW4uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB3aW5fVCAqCit4eTJ3aW4oeCwgeSkKKyAgICBpbnQJCXg7CisgICAgaW50CQl5OworeworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGludAkJcm93OworICAgIGludAkJY29sOworICAgIHdpbl9UCSp3cDsKKworICAgIHJvdyA9IFlfMl9ST1coeSk7CisgICAgY29sID0gWF8yX0NPTCh4KTsKKyAgICBpZiAocm93IDwgMCB8fCBjb2wgPCAwKQkJLyogYmVmb3JlIGZpcnN0IHdpbmRvdyAqLworCXJldHVybiBOVUxMOworICAgIHdwID0gbW91c2VfZmluZF93aW4oJnJvdywgJmNvbCk7CisjIGlmZGVmIEZFQVRfTU9VU0VTSEFQRQorICAgIGlmIChTdGF0ZSA9PSBISVRSRVRVUk4gfHwgU3RhdGUgPT0gQVNLTU9SRSkKKyAgICB7CisJaWYgKFlfMl9ST1coeSkgPj0gbXNnX3JvdykKKwkgICAgdXBkYXRlX21vdXNlc2hhcGUoU0hBUEVfSURYX01PUkVMKTsKKwllbHNlCisJICAgIHVwZGF0ZV9tb3VzZXNoYXBlKFNIQVBFX0lEWF9NT1JFKTsKKyAgICB9CisgICAgZWxzZSBpZiAocm93ID4gd3AtPndfaGVpZ2h0KQkvKiBiZWxvdyBzdGF0dXMgbGluZSAqLworCXVwZGF0ZV9tb3VzZXNoYXBlKFNIQVBFX0lEWF9DTElORSk7CisjICBpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGVsc2UgaWYgKCEoU3RhdGUgJiBDTURMSU5FKSAmJiBXX1ZTRVBfV0lEVEgod3ApID4gMCAmJiBjb2wgPT0gd3AtPndfd2lkdGgKKwkgICAgJiYgKHJvdyAhPSB3cC0+d19oZWlnaHQgfHwgIXN0bF9jb25uZWN0ZWQod3ApKSkKKwl1cGRhdGVfbW91c2VzaGFwZShTSEFQRV9JRFhfVlNFUCk7CisjICBlbmRpZgorICAgIGVsc2UgaWYgKCEoU3RhdGUgJiBDTURMSU5FKSAmJiBXX1NUQVRVU19IRUlHSFQod3ApID4gMAorCQkJCQkJICAgICAgICYmIHJvdyA9PSB3cC0+d19oZWlnaHQpCisJdXBkYXRlX21vdXNlc2hhcGUoU0hBUEVfSURYX1NUQVRVUyk7CisgICAgZWxzZQorCXVwZGF0ZV9tb3VzZXNoYXBlKC0yKTsKKyMgZW5kaWYKKyAgICByZXR1cm4gd3A7CisjZWxzZQorICAgIHJldHVybiBmaXJzdHdpbjsKKyNlbmRpZgorfQorCisvKgorICogIjpndWkiIGFuZCAiOmd2aW0iOiBDaGFuZ2UgZnJvbSB0aGUgdGVybWluYWwgdmVyc2lvbiB0byB0aGUgR1VJIHZlcnNpb24uCisgKiBGaWxlIG5hbWVzIG1heSBiZSBnaXZlbiB0byByZWRlZmluZSB0aGUgYXJncyBsaXN0LgorICovCisgICAgdm9pZAorZXhfZ3VpKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yICItZiIgYXJndW1lbnQ6IGZvcmVncm91bmQsIGRvbid0IGZvcmsuCisgICAgICogQWxzbyBkb24ndCBmb3JrIHdoZW4gc3RhcnRlZCB3aXRoICJndmltIC1mIi4KKyAgICAgKiBEbyBmb3JrIHdoZW4gdXNpbmcgImd1aSAtYiIuCisgICAgICovCisgICAgaWYgKGFyZ1swXSA9PSAnLScKKwkgICAgJiYgKGFyZ1sxXSA9PSAnZicgfHwgYXJnWzFdID09ICdiJykKKwkgICAgJiYgKGFyZ1syXSA9PSBOVUwgfHwgdmltX2lzd2hpdGUoYXJnWzJdKSkpCisgICAgeworCWd1aS5kb2ZvcmsgPSAoYXJnWzFdID09ICdiJyk7CisJZWFwLT5hcmcgPSBza2lwd2hpdGUoZWFwLT5hcmcgKyAyKTsKKyAgICB9CisgICAgaWYgKCFndWkuaW5fdXNlKQorICAgIHsKKwkvKiBDbGVhciB0aGUgY29tbWFuZC4gIE5lZWRlZCBmb3Igd2hlbiBmb3JraW5nK2V4aXRpbmcsIHRvIGF2b2lkIHBhcnQKKwkgKiBvZiB0aGUgYXJndW1lbnQgZW5kaW5nIHVwIGFmdGVyIHRoZSBzaGVsbCBwcm9tcHQuICovCisJbXNnX2Nscl9lb3NfZm9yY2UoKTsKKwlndWlfc3RhcnQoKTsKKyAgICB9CisgICAgaWYgKCFlbmRzX2V4Y21kKCplYXAtPmFyZykpCisJZXhfbmV4dChlYXApOworfQorCisjaWYgKChkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoRkVBVF9HVUlfVzMyKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pKSAmJiBkZWZpbmVkKEZFQVRfVE9PTEJBUikpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVGhpcyBpcyBzaGFyZWQgYmV0d2VlbiBBdGhlbmEsIE1vdGlmIGFuZCBHVEsuCisgKi8KK3N0YXRpYyBjaGFyX3UJKmdmcF9idWZmZXI7CisKK3N0YXRpYyB2b2lkIGdmcF9zZXRuYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGRvX2luX3J1bnRpbWVwYXRoKCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ2ZwX3NldG5hbWUoZm5hbWUpCisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyAgICBpZiAoU1RSTEVOKGZuYW1lKSA+PSBNQVhQQVRITCkKKwkqZ2ZwX2J1ZmZlciA9IE5VTDsKKyAgICBlbHNlCisJU1RSQ1BZKGdmcF9idWZmZXIsIGZuYW1lKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHBhdGggb2YgYml0bWFwICJuYW1lIiB3aXRoIGV4dGVuc2lvbiAiZXh0IiBpbiAncnVudGltZXBhdGgnLgorICogUmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUgYW5kIE9LIGlmIGJ1ZmZlcltNQVhQQVRITF0gY29udGFpbnMgdGhlIHJlc3VsdC4KKyAqLworICAgIGludAorZ3VpX2ZpbmRfYml0bWFwKG5hbWUsIGJ1ZmZlciwgZXh0KQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBjaGFyCSpleHQ7Cit7CisgICAgaWYgKFNUUkxFTihuYW1lKSA+IE1BWFBBVEhMIC0gMTQpCisJcmV0dXJuIEZBSUw7CisgICAgc3ByaW50ZigoY2hhciAqKWJ1ZmZlciwgImJpdG1hcHMvJXMuJXMiLCBuYW1lLCBleHQpOworICAgIGdmcF9idWZmZXIgPSBidWZmZXI7CisgICAgaWYgKGRvX2luX3J1bnRpbWVwYXRoKGJ1ZmZlciwgRkFMU0UsIGdmcF9zZXRuYW1lKSA9PSBGQUlMIHx8ICpidWZmZXIgPT0gTlVMKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworIyBpZiAhZGVmaW5lZChIQVZFX0dUSzIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogR2l2ZW4gdGhlIG5hbWUgb2YgdGhlICJpY29uPSIgYXJndW1lbnQsIHRyeSBmaW5kaW5nIHRoZSBiaXRtYXAgZmlsZSBmb3IgdGhlCisgKiBpY29uLiAgSWYgaXQgaXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLCB1c2UgaXQgYXMgaXQgaXMuICBPdGhlcndpc2UgYXBwZW5kCisgKiAiZXh0IiBhbmQgc2VhcmNoIGZvciBpdCBpbiAncnVudGltZXBhdGgnLgorICogVGhlIHJlc3VsdCBpcyBwdXQgaW4gImJ1ZmZlcltNQVhQQVRITF0iLiAgSWYgc29tZXRoaW5nIGZhaWxzICJidWZmZXIiCisgKiBjb250YWlucyAibmFtZSIuCisgKi8KKyAgICB2b2lkCitndWlfZmluZF9pY29uZmlsZShuYW1lLCBidWZmZXIsIGV4dCkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSpidWZmZXI7CisgICAgY2hhcgkqZXh0OworeworICAgIGNoYXJfdQlidWZbTUFYUEFUSEwgKyAxXTsKKworICAgIGV4cGFuZF9lbnYobmFtZSwgYnVmZmVyLCBNQVhQQVRITCk7CisgICAgaWYgKCFtY2hfaXNGdWxsTmFtZShidWZmZXIpICYmIGd1aV9maW5kX2JpdG1hcChidWZmZXIsIGJ1ZiwgZXh0KSA9PSBPSykKKwlTVFJDUFkoYnVmZmVyLCBidWYpOworfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZGlzcGxheV9lcnJvcnMoKQoreworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChpc2F0dHkoMikpCisJZmZsdXNoKHN0ZGVycik7CisgICAgZWxzZSBpZiAoZXJyb3JfZ2EuZ2FfZGF0YSAhPSBOVUxMKQorICAgIHsKKwkvKiBhdm9pZCBwdXR0aW5nIHVwIGEgbWVzc2FnZSBib3ggd2l0aCBibGFua3Mgb25seSAqLworCWZvciAocCA9IChjaGFyX3UgKillcnJvcl9nYS5nYV9kYXRhOyAqcCAhPSBOVUw7ICsrcCkKKwkgICAgaWYgKCFpc3NwYWNlKCpwKSkKKwkgICAgeworCQkvKiBUcnVuY2F0ZSBhIHZlcnkgbG9uZyBtZXNzYWdlLCBpdCB3aWxsIGdvIG9mZi1zY3JlZW4uICovCisJCWlmIChTVFJMRU4ocCkgPiAyMDAwKQorCQkgICAgU1RSQ1BZKHAgKyAyMDAwIC0gMTQsICIuLi4odHJ1bmNhdGVkKSIpOworCQkodm9pZClkb19kaWFsb2coVklNX0VSUk9SLCAoY2hhcl91ICopXygiRXJyb3IiKSwKKwkJCQkJICAgICAgcCwgKGNoYXJfdSAqKV8oIiZPayIpLCAxLCBOVUxMKTsKKwkJYnJlYWs7CisJICAgIH0KKwlnYV9jbGVhcigmZXJyb3JfZ2EpOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChOT19DT05TT0xFX0lOUFVUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiBUUlVFIGlmIHN0aWxsIHN0YXJ0aW5nIHVwIGFuZCB0aGVyZSBpcyBubyBwbGFjZSB0byBlbnRlciB0ZXh0LgorICogRm9yIEdUSyBhbmQgWDExIHdlIGNoZWNrIGlmIHN0ZGVyciBpcyBub3QgYSB0dHksIHdoaWNoIG1lYW5zIHdlIHdlcmUKKyAqIChwcm9iYWJseSkgc3RhcnRlZCBmcm9tIHRoZSBkZXNrdG9wLiAgQWxzbyBjaGVjayBzdGRpbiwgInZpbSA+JiBmaWxlIiBkb2VzCisgKiBhbGxvdyB0eXBpbmcgb24gc3RkaW4uCisgKi8KKyAgICBpbnQKK25vX2NvbnNvbGVfaW5wdXQoKQoreworICAgIHJldHVybiAoKCFndWkuaW5fdXNlIHx8IGd1aS5zdGFydGluZykKKyMgaWZuZGVmIE5PX0NPTlNPTEUKKwkgICAgJiYgIWlzYXR0eSgwKSAmJiAhaXNhdHR5KDIpCisjIGVuZGlmCisJICAgICk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSBcCisJfHwgZGVmaW5lZChNU1dJTl9GSU5EX1JFUExBQ0UpIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFVwZGF0ZSB0aGUgY3VycmVudCB3aW5kb3cgYW5kIHRoZSBzY3JlZW4uCisgKi8KKyAgICB2b2lkCitndWlfdXBkYXRlX3NjcmVlbigpCit7CisgICAgdXBkYXRlX3RvcGxpbmUoKTsKKyAgICB2YWxpZGF0ZV9jdXJzb3IoKTsKKyAgICB1cGRhdGVfc2NyZWVuKDApOwkvKiBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIHNjcmVlbiAqLworICAgIHNldGN1cnNvcigpOworICAgIG91dF9mbHVzaCgpOwkJLyogbWFrZSBzdXJlIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuICovCisgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGd1aV9tY2hfZmx1c2goKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIFwKKwl8fCBkZWZpbmVkKE1TV0lOX0ZJTkRfUkVQTEFDRSkgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyB2b2lkIGNvbmNhdF9lc2MgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnRleHQsIGludCB3aGF0KSk7CisKKy8qCisgKiBHZXQgdGhlIHRleHQgdG8gdXNlIGluIGEgZmluZC9yZXBsYWNlIGRpYWxvZy4gIFVzZXMgdGhlIGxhc3Qgc2VhcmNoIHBhdHRlcm4KKyAqIGlmIHRoZSBhcmd1bWVudCBpcyBlbXB0eS4KKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZy4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfZmluZF9kaWFsb2dfdGV4dChhcmcsIHd3b3JkcCwgbWNhc2VwKQorICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJKnd3b3JkcDsJLyogcmV0dXJuOiBUUlVFIGlmIFw8IFw+IGZvdW5kICovCisgICAgaW50CQkqbWNhc2VwOwkvKiByZXR1cm46IFRSVUUgaWYgXEMgZm91bmQgKi8KK3sKKyAgICBjaGFyX3UJKnRleHQ7CisKKyAgICBpZiAoKmFyZyA9PSBOVUwpCisJdGV4dCA9IGxhc3Rfc2VhcmNoX3BhdCgpOworICAgIGVsc2UKKwl0ZXh0ID0gYXJnOworICAgIGlmICh0ZXh0ICE9IE5VTEwpCisgICAgeworCXRleHQgPSB2aW1fc3Ryc2F2ZSh0ZXh0KTsKKwlpZiAodGV4dCAhPSBOVUxMKQorCXsKKwkgICAgaW50IGxlbiA9IFNUUkxFTih0ZXh0KTsKKwkgICAgaW50IGk7CisKKwkgICAgLyogUmVtb3ZlICJcViIgKi8KKwkgICAgaWYgKGxlbiA+PSAyICYmIFNUUk5DTVAodGV4dCwgIlxcViIsIDIpID09IDApCisJICAgIHsKKwkJbWNoX21lbW1vdmUodGV4dCwgdGV4dCArIDIsIChzaXplX3QpKGxlbiAtIDEpKTsKKwkJbGVuIC09IDI7CisJICAgIH0KKworCSAgICAvKiBSZWNvZ25pemUgIlxjIiBhbmQgIlxDIiBhbmQgcmVtb3ZlLiAqLworCSAgICBpZiAobGVuID49IDIgJiYgKnRleHQgPT0gJ1xcJyAmJiAodGV4dFsxXSA9PSAnYycgfHwgdGV4dFsxXSA9PSAnQycpKQorCSAgICB7CisJCSptY2FzZXAgPSAodGV4dFsxXSA9PSAnQycpOworCQltY2hfbWVtbW92ZSh0ZXh0LCB0ZXh0ICsgMiwgKHNpemVfdCkobGVuIC0gMSkpOworCQlsZW4gLT0gMjsKKwkgICAgfQorCisJICAgIC8qIFJlY29nbml6ZSAiXDx0ZXh0XD4iIGFuZCByZW1vdmUuICovCisJICAgIGlmIChsZW4gPj0gNAorCQkgICAgJiYgU1RSTkNNUCh0ZXh0LCAiXFw8IiwgMikgPT0gMAorCQkgICAgJiYgU1RSTkNNUCh0ZXh0ICsgbGVuIC0gMiwgIlxcPiIsIDIpID09IDApCisJICAgIHsKKwkJKnd3b3JkcCA9IFRSVUU7CisJCW1jaF9tZW1tb3ZlKHRleHQsIHRleHQgKyAyLCAoc2l6ZV90KShsZW4gLSA0KSk7CisJCXRleHRbbGVuIC0gNF0gPSBOVUw7CisJICAgIH0KKworCSAgICAvKiBSZWNvZ25pemUgIlwvIiBvciAiXD8iIGFuZCByZW1vdmUuICovCisJICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuOyArK2kpCisJCWlmICh0ZXh0W2ldID09ICdcXCcgJiYgKHRleHRbaSArIDFdID09ICcvJworCQkJCQkJICAgICAgIHx8IHRleHRbaSArIDFdID09ICc/JykpCisJCXsKKwkJICAgIG1jaF9tZW1tb3ZlKHRleHQgKyBpLCB0ZXh0ICsgaSArIDEsIChzaXplX3QpKGxlbiAtIGkpKTsKKwkJICAgIC0tbGVuOworCQl9CisJfQorICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworLyoKKyAqIENvbmNhdGVuYXRlICJ0ZXh0IiB0byBncm93IGFycmF5ICJnYXAiLCBlc2NhcGluZyAid2hhdCIgd2l0aCBhIGJhY2tzbGFzaC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjb25jYXRfZXNjKGdhcCwgdGV4dCwgd2hhdCkKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGNoYXJfdQkqdGV4dDsKKyAgICBpbnQJCXdoYXQ7Cit7CisgICAgd2hpbGUgKCp0ZXh0ICE9IE5VTCkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWludCBsID0gKCptYl9wdHIybGVuX2NoZWNrKSh0ZXh0KTsKKwlpZiAobCA+IDEpCisJeworCSAgICB3aGlsZSAoLS1sID49IDApCisJCWdhX2FwcGVuZChnYXAsICp0ZXh0KyspOworCSAgICBjb250aW51ZTsKKwl9CisjZW5kaWYKKwlpZiAoKnRleHQgPT0gd2hhdCkKKwkgICAgZ2FfYXBwZW5kKGdhcCwgJ1xcJyk7CisJZ2FfYXBwZW5kKGdhcCwgKnRleHQpOworCSsrdGV4dDsKKyAgICB9Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIHByZXNzIG9mIGEgYnV0dG9uIGluIHRoZSBmaW5kLXJlcGxhY2UgZGlhbG9nLgorICogUmV0dXJuIFRSVUUgd2hlbiBzb21ldGhpbmcgd2FzIGFkZGVkIHRvIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KKyAgICBpbnQKK2d1aV9kb19maW5kcmVwbChmbGFncywgZmluZF90ZXh0LCByZXBsX3RleHQsIGRvd24pCisgICAgaW50CQlmbGFnczsJCS8qIG9uZSBvZiBGUkRfUkVQTEFDRSwgRlJEX0ZJTkRORVhULCBldGMuICovCisgICAgY2hhcl91CSpmaW5kX3RleHQ7CisgICAgY2hhcl91CSpyZXBsX3RleHQ7CisgICAgaW50CQlkb3duOwkJLyogU2VhcmNoIGRvd253YXJkcy4gKi8KK3sKKyAgICBnYXJyYXlfVAlnYTsKKyAgICBpbnQJCWk7CisgICAgaW50CQl0eXBlID0gKGZsYWdzICYgRlJEX1RZUEVfTUFTSyk7CisgICAgY2hhcl91CSpwOworCisgICAgZ2FfaW5pdDIoJmdhLCAxLCAxMDApOworCisgICAgaWYgKHR5cGUgPT0gRlJEX1JFUExBQ0UpCisgICAgeworCS8qIERvIHRoZSByZXBsYWNlbWVudCB3aGVuIHRoZSB0ZXh0IHVuZGVyIHRoZSBjdXJzb3IgbWF0Y2hlcy4gKi8KKwlpID0gU1RSTEVOKGZpbmRfdGV4dCk7CisJcCA9IG1sX2dldF9jdXJzb3IoKTsKKwlpZiAoKChmbGFncyAmIEZSRF9NQVRDSF9DQVNFKQorCQkgICAgPyBTVFJOQ01QKHAsIGZpbmRfdGV4dCwgaSkgPT0gMAorCQkgICAgOiBTVFJOSUNNUChwLCBmaW5kX3RleHQsIGkpID09IDApCisJCSYmIHVfc2F2ZV9jdXJzb3IoKSA9PSBPSykKKwl7CisJICAgIC8qIEEgYnV0dG9uIHdhcyBwcmVzc2VkIHRodXMgdW5kbyBzaG91bGQgYmUgc3luY2VkLiAqLworCSAgICBpZiAobm9fdV9zeW5jID09IDApCisJCXVfc3luYygpOworCisJICAgIGRlbF9ieXRlcygobG9uZylpLCBGQUxTRSk7CisJICAgIGluc19zdHIocmVwbF90ZXh0KTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT0gRlJEX1JFUExBQ0VBTEwpCisJZ2FfY29uY2F0KCZnYSwgKGNoYXJfdSAqKSIlcy8iKTsKKworICAgIGdhX2NvbmNhdCgmZ2EsIChjaGFyX3UgKikiXFxWIik7CisgICAgaWYgKGZsYWdzICYgRlJEX01BVENIX0NBU0UpCisJZ2FfY29uY2F0KCZnYSwgKGNoYXJfdSAqKSJcXEMiKTsKKyAgICBlbHNlCisJZ2FfY29uY2F0KCZnYSwgKGNoYXJfdSAqKSJcXGMiKTsKKyAgICBpZiAoZmxhZ3MgJiBGUkRfV0hPTEVfV09SRCkKKwlnYV9jb25jYXQoJmdhLCAoY2hhcl91ICopIlxcPCIpOworICAgIGlmICh0eXBlID09IEZSRF9SRVBMQUNFQUxMIHx8IGRvd24pCisJY29uY2F0X2VzYygmZ2EsIGZpbmRfdGV4dCwgJy8nKTsJLyogZXNjYXBlIHNsYXNoZXMgKi8KKyAgICBlbHNlCisJY29uY2F0X2VzYygmZ2EsIGZpbmRfdGV4dCwgJz8nKTsJLyogZXNjYXBlICc/JyAqLworICAgIGlmIChmbGFncyAmIEZSRF9XSE9MRV9XT1JEKQorCWdhX2NvbmNhdCgmZ2EsIChjaGFyX3UgKikiXFw+Iik7CisKKyAgICBpZiAodHlwZSA9PSBGUkRfUkVQTEFDRUFMTCkKKyAgICB7CisJLyogQSBidXR0b24gd2FzIHByZXNzZWQsIHRodXMgdW5kbyBzaG91bGQgYmUgc3luY2VkLiAqLworCWlmIChub191X3N5bmMgPT0gMCkKKwkgICAgdV9zeW5jKCk7CisKKwlnYV9jb25jYXQoJmdhLCAoY2hhcl91ICopIi8iKTsKKwljb25jYXRfZXNjKCZnYSwgcmVwbF90ZXh0LCAnLycpOwkvKiBlc2NhcGUgc2xhc2hlcyAqLworCWdhX2NvbmNhdCgmZ2EsIChjaGFyX3UgKikiL2ciKTsKKwlkb19jbWRsaW5lX2NtZChnYS5nYV9kYXRhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBTZWFyY2ggZm9yIHRoZSBuZXh0IG1hdGNoLiAqLworCWkgPSBtc2dfc2Nyb2xsOworCWRvX3NlYXJjaChOVUxMLCBkb3duID8gJy8nIDogJz8nLCBnYS5nYV9kYXRhLCAxTCwKKwkJCQkJCSAgICBTRUFSQ0hfTVNHICsgU0VBUkNIX01BUkspOworCW1zZ19zY3JvbGwgPSBpOwkgICAgLyogZG9uJ3QgbGV0IGFuIGVycm9yIG1lc3NhZ2Ugc2V0IG1zZ19zY3JvbGwgKi8KKyAgICB9CisKKyAgICBpZiAoU3RhdGUgJiAoTk9STUFMIHwgSU5TRVJUKSkKKyAgICB7CisJZ3VpX3VwZGF0ZV9zY3JlZW4oKTsJCS8qIHVwZGF0ZSB0aGUgc2NyZWVuICovCisJbXNnX2RpZG91dCA9IDA7CQkJLyogb3ZlcndyaXRlIGFueSBtZXNzYWdlICovCisJbmVlZF93YWl0X3JldHVybiA9IEZBTFNFOwkvKiBkb24ndCB3YWl0IGZvciByZXR1cm4gKi8KKyAgICB9CisKKyAgICB2aW1fZnJlZShnYS5nYV9kYXRhKTsKKyAgICByZXR1cm4gKGdhLmdhX2xlbiA+IDApOworfQorCisjZW5kaWYKKworI2lmIChkZWZpbmVkKEZFQVRfRE5EKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykpIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCitzdGF0aWMgdm9pZCBndWlfd2luZ290b194eSBfX0FSR1MoKGludCB4LCBpbnQgeSkpOworCisvKgorICogSnVtcCB0byB0aGUgd2luZG93IGF0IHNwZWNpZmllZCBwb2ludCAoeCwgeSkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3dpbmdvdG9feHkoeCwgeSkKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKK3sKKyAgICBpbnQJCXJvdyA9IFlfMl9ST1coeSk7CisgICAgaW50CQljb2wgPSBYXzJfQ09MKHgpOworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChyb3cgPj0gMCAmJiBjb2wgPj0gMCkKKyAgICB7CisJd3AgPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKwlpZiAod3AgIT0gTlVMTCAmJiB3cCAhPSBjdXJ3aW4pCisJICAgIHdpbl9nb3RvKHdwKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFByb2Nlc3MgZmlsZSBkcm9wLiAgTW91c2UgY3Vyc29yIHBvc2l0aW9uLCBrZXkgbW9kaWZpZXJzLCBuYW1lIG9mIGZpbGVzCisgKiBhbmQgY291bnQgb2YgZmlsZXMgYXJlIGdpdmVuLiAgQXJndW1lbnQgImZuYW1lc1tjb3VudF0iIGhhcyBmdWxsIHBhdGhuYW1lcworICogb2YgZHJvcHBlZCBmaWxlcywgdGhleSB3aWxsIGJlIGZyZWVkIGluIHRoaXMgZnVuY3Rpb24sIGFuZCBjYWxsZXIgY2FuJ3QgdXNlCisgKiBmbmFtZXMgYWZ0ZXIgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitndWlfaGFuZGxlX2Ryb3AoeCwgeSwgbW9kaWZpZXJzLCBmbmFtZXMsIGNvdW50KQorICAgIGludAkJeDsKKyAgICBpbnQJCXk7CisgICAgaW50X3UJbW9kaWZpZXJzOworICAgIGNoYXJfdQkqKmZuYW1lczsKKyAgICBpbnQJCWNvdW50OworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKgorICAgICAqIFdoZW4gdGhlIGN1cnNvciBpcyBhdCB0aGUgY29tbWFuZCBsaW5lLCBhZGQgdGhlIGZpbGUgbmFtZXMgdG8gdGhlCisgICAgICogY29tbWFuZCBsaW5lLCBkb24ndCBlZGl0IHRoZSBmaWxlcy4KKyAgICAgKi8KKyAgICBpZiAoU3RhdGUgJiBDTURMSU5FKQorICAgIHsKKwlzaG9ydGVuX2ZpbGVuYW1lcyhmbmFtZXMsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwl7CisJICAgIGlmIChmbmFtZXNbaV0gIT0gTlVMTCkKKwkgICAgeworCQlpZiAoaSA+IDApCisJCSAgICBhZGRfdG9faW5wdXRfYnVmKChjaGFyX3UqKSIgIiwgMSk7CisKKwkJLyogV2UgZG9uJ3Qga25vdyB3aGF0IGNvbW1hbmQgaXMgdXNlZCB0aHVzIHdlIGNhbid0IGJlIHN1cmUKKwkJICogYWJvdXQgd2hpY2ggY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVzY2FwZWQuICBPbmx5IGVzY2FwZSB0aGUKKwkJICogbW9zdCBjb21tb24gb25lcy4gKi8KKyMgaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJCXAgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKGZuYW1lc1tpXSwgKGNoYXJfdSAqKSIgXHRcInwiKTsKKyMgZWxzZQorCQlwID0gdmltX3N0cnNhdmVfZXNjYXBlZChmbmFtZXNbaV0sIChjaGFyX3UgKikiXFwgXHRcInwiKTsKKyMgZW5kaWYKKwkJaWYgKHAgIT0gTlVMTCkKKwkJICAgIGFkZF90b19pbnB1dF9idWYocCwgKGludClTVFJMRU4ocCkpOworCQl2aW1fZnJlZShwKTsKKwkJdmltX2ZyZWUoZm5hbWVzW2ldKTsKKwkgICAgfQorCX0KKwl2aW1fZnJlZShmbmFtZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIEdvIHRvIHRoZSB3aW5kb3cgdW5kZXIgbW91c2UgY3Vyc29yLCB0aGVuIHNob3J0ZW4gZ2l2ZW4gImZuYW1lcyIgYnkKKwkgKiBjdXJyZW50IHdpbmRvdywgYmVjYXVzZSBhIHdpbmRvdyBjYW4gaGF2ZSBsb2NhbCBjdXJyZW50IGRpci4gKi8KKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisJZ3VpX3dpbmdvdG9feHkoeCwgeSk7CisjIGVuZGlmCisJc2hvcnRlbl9maWxlbmFtZXMoZm5hbWVzLCBjb3VudCk7CisKKwkvKiBJZiBTaGlmdCBoZWxkIGRvd24sIHJlbWVtYmVyIHRoZSBmaXJzdCBpdGVtLiAqLworCWlmICgobW9kaWZpZXJzICYgTU9VU0VfU0hJRlQpICE9IDApCisJICAgIHAgPSB2aW1fc3Ryc2F2ZShmbmFtZXNbMF0pOworCWVsc2UKKwkgICAgcCA9IE5VTEw7CisKKwkvKiBIYW5kbGUgdGhlIGRyb3AsIDplZGl0IG9yIDpzcGxpdCB0byBnZXQgdG8gdGhlIGZpbGUuICBUaGlzIGFsc28KKwkgKiBmcmVlcyBmbmFtZXNbXS4gIFNraXAgdGhpcyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBpdGVtIGl0J3MgYQorCSAqIGRpcmVjdG9yeSBhbmQgU2hpZnQgaXMgaGVsZCBkb3duLiAqLworCWlmIChjb3VudCA9PSAxICYmIChtb2RpZmllcnMgJiBNT1VTRV9TSElGVCkgIT0gMAorCQkJCQkJICAgICAmJiBtY2hfaXNkaXIoZm5hbWVzWzBdKSkKKwl7CisJICAgIHZpbV9mcmVlKGZuYW1lc1swXSk7CisJICAgIHZpbV9mcmVlKGZuYW1lcyk7CisJfQorCWVsc2UKKwkgICAgaGFuZGxlX2Ryb3AoY291bnQsIGZuYW1lcywgKG1vZGlmaWVycyAmIE1PVVNFX0NUUkwpICE9IDApOworCisJLyogSWYgU2hpZnQgaGVsZCBkb3duLCBjaGFuZ2UgdG8gZmlyc3QgZmlsZSdzIGRpcmVjdG9yeS4gIElmIHRoZSBmaXJzdAorCSAqIGl0ZW0gaXMgYSBkaXJlY3RvcnksIGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSAoYW5kIGxldCB0aGUgZXhwbG9yZXIKKwkgKiBwbHVnaW4gc2hvdyB0aGUgY29udGVudHMpLiAqLworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBpZiAobWNoX2lzZGlyKHApKQorCSAgICB7CisJCWlmIChtY2hfY2hkaXIoKGNoYXIgKilwKSA9PSAwKQorCQkgICAgc2hvcnRlbl9mbmFtZXMoVFJVRSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAodmltX2NoZGlyZmlsZShwKSA9PSBPSykKKwkJc2hvcnRlbl9mbmFtZXMoVFJVRSk7CisJICAgIHZpbV9mcmVlKHApOworCX0KKworCS8qIFVwZGF0ZSB0aGUgc2NyZWVuIGRpc3BsYXkgKi8KKwl1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CisjIGlmZGVmIEZFQVRfTUVOVQorCWd1aV91cGRhdGVfbWVudXMoMCk7CisjIGVuZGlmCisJc2V0Y3Vyc29yKCk7CisJb3V0X2ZsdXNoKCk7CisJZ3VpX3VwZGF0ZV9jdXJzb3IoRkFMU0UsIEZBTFNFKTsKKwlndWlfbWNoX2ZsdXNoKCk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3VpLmggYi9zcmMvZ3VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1N2M0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWkuaApAQCAtMCwwICsxLDUyNSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCU1vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qIEZvciBkZWJ1Z2dpbmcgKi8KKy8qICNkZWZpbmUgRCh4KQlwcmludGYgeDsgKi8KKyNkZWZpbmUgRCh4KQorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9BTUlHQSkKKyMgaW5jbHVkZSA8aW50dWl0aW9uL2ludHVpdGlvbi5oPgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorIyBkZWZpbmUgRkVBVF9HVUlfWDExCisjIGluY2x1ZGUgPFhtL1htLmg+CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX0FUSEVOQQorIyBkZWZpbmUgRkVBVF9HVUlfWDExCisjIGluY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyMgaW5jbHVkZSA8WDExL1N0cmluZ0RlZnMuaD4KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9CRVZBTAorIyBpbmNsdWRlICJndWlfYmV2YWwuaCIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfR1RLCisjIGluY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyMgaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisjIGluY2x1ZGUgImd1aV9iZW9zLmgiCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX01BQworIyBpbmNsdWRlIDxUeXBlcy5oPgorLyojIGluY2x1ZGUgPE1lbW9yeS5oPiovCisjIGluY2x1ZGUgPFF1aWNrZHJhdy5oPgorIyBpbmNsdWRlIDxGb250cy5oPgorIyBpbmNsdWRlIDxFdmVudHMuaD4KKyMgaW5jbHVkZSA8TWVudXMuaD4KKyMgaWYgIShkZWZpbmVkIChUQVJHRVRfQVBJX01BQ19DQVJCT04pICYmIChUQVJHRVRfQVBJX01BQ19DQVJCT04pKQorIyAgIGluY2x1ZGUgPFdpbmRvd3MuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8Q29udHJvbHMuaD4KKy8qIyBpbmNsdWRlIDxUZXh0RWRpdC5oPiovCisjIGluY2x1ZGUgPERpYWxvZ3MuaD4KKyMgaW5jbHVkZSA8T1NVdGlscy5oPgorLyoKKyMgaW5jbHVkZSA8VG9vbFV0aWxzLmg+CisjIGluY2x1ZGUgPFNlZ0xvYWQuaD4qLworI2VuZGlmCisKKyNpZmRlZiBSSVNDT1MKKyMgaW5jbHVkZSAiZ3VpX3Jpc2Nvcy5oIgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9QSE9UT04KKyMgaW5jbHVkZSA8UGguaD4KKyMgaW5jbHVkZSA8UHQuaD4KKyMgaW5jbHVkZSAicGhvdG9uL1B4UHJvdG8uaCIKKyNlbmRpZgorCisvKgorICogT24gc29tZSBzeXN0ZW1zLCB3aGVuIHdlIGNvbXBpbGUgd2l0aCB0aGUgR1VJLCB3ZSBhbHdheXMgdXNlIGl0LiAgT24gTWFjCisgKiB0aGVyZSBpcyBubyB0ZXJtaW5hbCB2ZXJzaW9uLCBhbmQgb24gV2luZG93cyB3ZSBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0bworICogZm9yayBvbmUgb2ZmIHdpdGggOmd1aS4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IChkZWZpbmVkKEZFQVRfR1VJX01BQykgJiYgIWRlZmluZWQoTUFDT1NfWF9VTklYKSkKKyMgZGVmaW5lIEFMV0FZU19VU0VfR1VJCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9HVUlfTUFDKSB8fCBkZWZpbmVkKEhBVkVfR1RLMikKKyMgZGVmaW5lIFVTRV9PTl9GTFlfU0NST0xMCisjZW5kaWYKKworLyoKKyAqIEdVSXMgdGhhdCBzdXBwb3J0IGRyb3BwaW5nIGZpbGVzIG9uIGEgcnVubmluZyBWaW0uCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykgXAorCXx8IGRlZmluZWQoRkVBVF9HVUlfQkVPUykgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspCisjIGRlZmluZSBIQVZFX0RST1BfRklMRQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGRlZmluZSBtYWtlcyBtZW51cyBhbHdheXMgdXNlIGEgZm9udHNldC4KKyAqIFdlJ3JlIG5vdCBzdXJlIGlmIHRoaXMgY29kZSBhbHdheXMgd29ya3MsIHRodXMgaXQgY2FuIGJlIGRpc2FibGVkLgorICovCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorIyBkZWZpbmUgRk9OVFNFVF9BTFdBWVMKKyNlbmRpZgorCisvKgorICogVGhlc2UgbWFjcm9zIGNvbnZlcnQgYmV0d2VlbiBjaGFyYWN0ZXIgcm93L2NvbHVtbiBhbmQgcGl4ZWwgY29vcmRpbmF0ZXMuCisgKiBURVhUX1ggICAtIENvbnZlcnQgY2hhcmFjdGVyIGNvbHVtbiBpbnRvIFggcGl4ZWwgY29vcmQgZm9yIGRyYXdpbmcgc3RyaW5ncy4KKyAqIFRFWFRfWSAgIC0gQ29udmVydCBjaGFyYWN0ZXIgcm93IGludG8gWSBwaXhlbCBjb29yZCBmb3IgZHJhd2luZyBzdHJpbmdzLgorICogRklMTF9YICAgLSBDb252ZXJ0IGNoYXJhY3RlciBjb2x1bW4gaW50byBYIHBpeGVsIGNvb3JkIGZvciBmaWxsaW5nIHRoZSBhcmVhCisgKgkJdW5kZXIgdGhlIGNoYXJhY3Rlci4KKyAqIEZJTExfWSAgIC0gQ29udmVydCBjaGFyYWN0ZXIgcm93IGludG8gWSBwaXhlbCBjb29yZCBmb3IgZmlsbGluZyB0aGUgYXJlYQorICoJCXVuZGVyIHRoZSBjaGFyYWN0ZXIuCisgKiBYXzJfQ09MICAtIENvbnZlcnQgWCBwaXhlbCBjb29yZCBpbnRvIGNoYXJhY3RlciBjb2x1bW4uCisgKiBZXzJfUk9XICAtIENvbnZlcnQgWSBwaXhlbCBjb29yZCBpbnRvIGNoYXJhY3RlciByb3cuCisgKi8KKyNpZmRlZiBGRUFUX0dVSV9XMzIKKyMgZGVmaW5lIFRFWFRfWChjb2wpCSgoY29sKSAqIGd1aS5jaGFyX3dpZHRoKQorIyBkZWZpbmUgVEVYVF9ZKHJvdykJKChyb3cpICogZ3VpLmNoYXJfaGVpZ2h0ICsgZ3VpLmNoYXJfYXNjZW50KQorIyBkZWZpbmUgRklMTF9YKGNvbCkJKChjb2wpICogZ3VpLmNoYXJfd2lkdGgpCisjIGRlZmluZSBGSUxMX1kocm93KQkoKHJvdykgKiBndWkuY2hhcl9oZWlnaHQpCisjIGRlZmluZSBYXzJfQ09MKHgpCSgoeCkgLyBndWkuY2hhcl93aWR0aCkKKyMgZGVmaW5lIFlfMl9ST1coeSkJKCh5KSAvIGd1aS5jaGFyX2hlaWdodCkKKyNlbHNlCisjIGRlZmluZSBURVhUX1goY29sKQkoKGNvbCkgKiBndWkuY2hhcl93aWR0aCAgKyBndWkuYm9yZGVyX29mZnNldCkKKyMgZGVmaW5lIEZJTExfWChjb2wpCSgoY29sKSAqIGd1aS5jaGFyX3dpZHRoICArIGd1aS5ib3JkZXJfb2Zmc2V0KQorIyBkZWZpbmUgWF8yX0NPTCh4KQkoKCh4KSAtIGd1aS5ib3JkZXJfb2Zmc2V0KSAvIGd1aS5jaGFyX3dpZHRoKQorIyBkZWZpbmUgVEVYVF9ZKHJvdykJKChyb3cpICogZ3VpLmNoYXJfaGVpZ2h0ICsgZ3VpLmNoYXJfYXNjZW50IFwKKwkJCQkJCQkrIGd1aS5ib3JkZXJfb2Zmc2V0KQorIyBkZWZpbmUgRklMTF9ZKHJvdykJKChyb3cpICogZ3VpLmNoYXJfaGVpZ2h0ICsgZ3VpLmJvcmRlcl9vZmZzZXQpCisjIGRlZmluZSBZXzJfUk9XKHkpCSgoKHkpIC0gZ3VpLmJvcmRlcl9vZmZzZXQpIC8gZ3VpLmNoYXJfaGVpZ2h0KQorI2VuZGlmCisKKy8qIEluZGljZXMgZm9yIGFycmF5cyBvZiBzY3JvbGxiYXJzICovCisjZGVmaW5lIFNCQVJfTk9ORQkgICAgLTEKKyNkZWZpbmUgU0JBUl9MRUZUCSAgICAwCisjZGVmaW5lIFNCQVJfUklHSFQJICAgIDEKKyNkZWZpbmUgU0JBUl9CT1RUT00JICAgIDIKKworLyogT3JpZW50YXRpb25zIGZvciBzY3JvbGxiYXJzICovCisjZGVmaW5lIFNCQVJfVkVSVAkgICAgMAorI2RlZmluZSBTQkFSX0hPUklaCSAgICAxCisKKy8qIERlZmF1bHQgc2l6ZSBvZiBzY3JvbGxiYXIgKi8KKyNkZWZpbmUgU0JfREVGQVVMVF9XSURUSCAgICAxNgorCisvKiBEZWZhdWx0IGhlaWdodCBvZiB0aGUgbWVudSBiYXIgKi8KKyNkZWZpbmUgTUVOVV9ERUZBVUxUX0hFSUdIVCAxCQkvKiBmaWd1cmUgaXQgb3V0IGF0IHJ1bnRpbWUgKi8KKworLyogRmxhZ3MgZm9yIGd1aV9tY2hfb3V0c3RyX25vd3JhcCgpICovCisjZGVmaW5lIEdVSV9NT05fV1JBUF9DVVJTT1IJMHgwMQkvKiB3cmFwIGN1cnNvciBhdCBlbmQgb2YgbGluZSAqLworI2RlZmluZSBHVUlfTU9OX0lOVkVSVAkJMHgwMgkvKiBpbnZlcnQgdGhlIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgR1VJX01PTl9JU19DVVJTT1IJMHgwNAkvKiBkcmF3aW5nIGN1cnNvciAqLworI2RlZmluZSBHVUlfTU9OX1RSU19DVVJTT1IJMHgwOAkvKiBkcmF3aW5nIHRyYW5zcGFyZW50IGN1cnNvciAqLworI2RlZmluZSBHVUlfTU9OX05PQ0xFQVIJCTB4MTAJLyogZG9uJ3QgY2xlYXIgc2VsZWN0aW9uICovCisKKy8qIEZsYWdzIGZvciBndWlfbWNoX2RyYXdfc3RyaW5nKCkgKi8KKyNkZWZpbmUgRFJBV19UUkFOU1AJCTB4MDEJLyogZHJhdyB3aXRoIHRyYW5zcGFyYW50IGJnICovCisjZGVmaW5lIERSQVdfQk9MRAkJMHgwMgkvKiBkcmF3IGJvbGQgdGV4dCAqLworI2RlZmluZSBEUkFXX1VOREVSTAkJMHgwNAkvKiBkcmF3IHVuZGVybGluZSB0ZXh0ICovCisjaWYgZGVmaW5lZChSSVNDT1MpIHx8IGRlZmluZWQoSEFWRV9HVEsyKQorIyBkZWZpbmUgRFJBV19JVEFMSUMJCTB4MDgJLyogZHJhdyBpdGFsaWMgdGV4dCAqLworI2VuZGlmCisjZGVmaW5lIERSQVdfQ1VSU09SCQkweDEwCS8qIGRyYXdpbmcgYmxvY2sgY3Vyc29yICh3aW4zMikgKi8KKworLyogRm9yIG91ciBvd24gdGVhcm9mZiBtZW51IGl0ZW0gKi8KKyNkZWZpbmUgVEVBUl9TVFJJTkcJCSItLT5EZXRhY2giCisjZGVmaW5lIFRFQVJfTEVOCQkoOSkJLyogbGVuZ3RoIG9mIGFib3ZlIHN0cmluZyAqLworCisvKiBmb3IgdGhlIHRvb2xiYXIgKi8KKyNpZmRlZiBGRUFUX0dVSV9XMTYKKyMgZGVmaW5lIFRPT0xCQVJfQlVUVE9OX0hFSUdIVAkxNQorIyBkZWZpbmUgVE9PTEJBUl9CVVRUT05fV0lEVEgJMTYKKyNlbHNlCisjIGRlZmluZSBUT09MQkFSX0JVVFRPTl9IRUlHSFQJMTgKKyMgZGVmaW5lIFRPT0xCQVJfQlVUVE9OX1dJRFRICTE4CisjZW5kaWYKKyNkZWZpbmUgVE9PTEJBUl9CT1JERVJfSEVJR0hUCTEyICAvKiByb29tIGFib3ZlK2JlbG93IGJ1dHRvbnMgZm9yIE1TV2luZG93cyAqLworCisjaWYgZGVmaW5lZChOT19DT05TT0xFKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpCisjIGRlZmluZSBOT19DT05TT0xFX0lOUFVUCS8qIHVzZSBub19jb25zb2xlX2lucHV0KCkgdG8gY2hlY2sgaWYgdGhlcmUKKwkJCQkgICBpcyBubyBjb25zb2xlIGlucHV0IHBvc3NpYmxlICovCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgR3VpU2Nyb2xsYmFyCit7CisgICAgbG9uZwlpZGVudDsJCS8qIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIHNjcm9sbGJhciAqLworICAgIHN0cnVjdCB3aW5kb3cgKndwOwkJLyogU2Nyb2xsYmFyJ3Mgd2luZG93LCBOVUxMIGZvciBib3R0b20gKi8KKyAgICBpbnQJCXR5cGU7CQkvKiBvbmUgb2YgU0JBUl97TEVGVCxSSUdIVCxCT1RUT019ICovCisgICAgbG9uZwl2YWx1ZTsJCS8qIFJlcHJlc2VudHMgdG9wIGxpbmUgbnVtYmVyIHZpc2libGUgKi8KKyNpZmRlZiBGRUFUX0dVSV9BVEhFTkEKKyAgICBpbnQJCXBpeHZhbDsJCS8qIHBpeGVsIGNvdW50IG9mIHZhbHVlICovCisjZW5kaWYKKyAgICBsb25nCXNpemU7CQkvKiBTaXplIG9mIHNjcm9sbGJhciB0aHVtYiAqLworICAgIGxvbmcJbWF4OwkJLyogTnVtYmVyIG9mIGxpbmVzIGluIGJ1ZmZlciAqLworCisgICAgLyogVmFsdWVzIG1lYXN1cmVkIGluIGNoYXJhY3RlcnM6ICovCisgICAgaW50CQl0b3A7CQkvKiBUb3Agb2Ygc2Nyb2xsIGJhciAoY2hhcnMgZnJvbSByb3cgMCkgKi8KKyAgICBpbnQJCWhlaWdodDsJCS8qIEN1cnJlbnQgaGVpZ2h0IG9mIHNjcm9sbCBiYXIgaW4gcm93cyAqLworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaW50CQl3aWR0aDsJCS8qIEN1cnJlbnQgd2lkdGggb2Ygc2Nyb2xsIGJhciBpbiBjb2xzICovCisjZW5kaWYKKyAgICBpbnQJCXN0YXR1c19oZWlnaHQ7CS8qIEhlaWdodCBvZiBzdGF0dXMgbGluZSAqLworI2lmZGVmIEZFQVRfR1VJX1gxMQorICAgIFdpZGdldAlpZDsJCS8qIElkIG9mIHJlYWwgc2Nyb2xsIGJhciAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgR3RrV2lkZ2V0ICppZDsJCS8qIElkIG9mIHJlYWwgc2Nyb2xsIGJhciAqLworICAgIHVuc2lnbmVkIGxvbmcgaGFuZGxlcl9pZDsgICAvKiBJZCBvZiAidmFsdWVfY2hhbmdlZCIgc2lnbmFsIGhhbmRsZXIgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfTVNXSU4KKyAgICBIV05ECWlkOwkJLyogSWQgb2YgcmVhbCBzY3JvbGwgYmFyICovCisgICAgaW50CQlzY3JvbGxfc2hpZnQ7CS8qIFRoZSBzY3JvbGxiYXIgc3R1ZmYgY2FuIGhhbmRsZSBvbmx5IHVwIHRvCisJCQkJICAgMzI3NjcgbGluZXMuICBXaGVuIHRoZSBmaWxlIGlzIGxvbmdlciwKKwkJCQkgICBzY3JvbGxfc2hpZnQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2hpZnRzCisJCQkJICAgdG8gcmVkdWNlIHRoZSBjb3VudC4gICovCisjZW5kaWYKKyNpZiBGRUFUX0dVSV9CRU9TCisgICAgVmltU2Nyb2xsQmFyICppZDsJCS8qIFBvaW50ZXIgdG8gcmVhbCBzY3JvbGwgYmFyICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9NQUMKKyAgICBDb250cm9sSGFuZGxlIGlkOwkJLyogQSBoYW5kbGUgdG8gdGhlIHNjcm9sbGJhciAqLworI2VuZGlmCisjaWZkZWYgUklTQ09TCisgICAgaW50CQlpZDsJCS8qIFdpbmRvdyBoYW5kbGUgb2Ygc2Nyb2xsYmFyIHdpbmRvdyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfUEhPVE9OCisgICAgUHRXaWRnZXRfdAkqaWQ7CisjZW5kaWYKK30gc2Nyb2xsYmFyX1Q7CisKK3R5cGVkZWYgbG9uZwkgICAgZ3VpY29sb3JfVDsJLyogaGFuZGxlIGZvciBhIEdVSSBjb2xvcjsgZm9yIFgxMSB0aGlzIHNob3VsZAorCQkJCSAgIGJlICJQaXhlbCIsIGJ1dCB0aGF0J3MgYW4gdW5zaWduZWQgYW5kIHdlCisJCQkJICAgbmVlZCBhIHNpZ25lZCB2YWx1ZSAqLworI2RlZmluZSBJTlZBTENPTE9SIChndWljb2xvcl9UKS0xMTExMQkvKiBudW1iZXIgZm9yIGludmFsaWQgY29sb3I7IG9uIDMyIGJpdAorCQkJCSAgIGRpc3BsYXlzIHRoZXJlIGlzIGEgdGlueSBjaGFuY2UgdGhpcyBpcyBhbgorCQkJCSAgIGFjdHVhbCBjb2xvciAqLworCisjaWZkZWYgRkVBVF9HVUlfR1RLCisjIGlmZGVmIEhBVkVfR1RLMgorICB0eXBlZGVmIFBhbmdvRm9udERlc2NyaXB0aW9uCSpHdWlGb250OyAgICAgICAvKiBoYW5kbGUgZm9yIGEgR1VJIGZvbnQgKi8KKyAgdHlwZWRlZiBQYW5nb0ZvbnREZXNjcmlwdGlvbiAgKkd1aUZvbnRzZXQ7ICAgIC8qIGhhbmRsZSBmb3IgYSBHVUkgZm9udHNldCAqLworIyBlbHNlCisgIHR5cGVkZWYgR2RrRm9udAkqR3VpRm9udDsJLyogaGFuZGxlIGZvciBhIEdVSSBmb250ICovCisgIHR5cGVkZWYgR2RrRm9udAkqR3VpRm9udHNldDsJLyogaGFuZGxlIGZvciBhIEdVSSBmb250c2V0ICovCisjIGVuZGlmCisjIGRlZmluZSBOT0ZPTlQJCShHdWlGb250KU5VTEwKKyMgZGVmaW5lIE5PRk9OVFNFVAkoR3VpRm9udHNldClOVUxMCisjZWxzZQorIyBpZmRlZiBGRUFUX0dVSV9QSE9UT04KKyAgdHlwZWRlZiBjaGFyCQkqR3VpRm9udDsKKyAgdHlwZWRlZiBjaGFyCQkqR3VpRm9udHNldDsKKyMgIGRlZmluZSBOT0ZPTlQJKEd1aUZvbnQpTlVMTAorIyAgZGVmaW5lIE5PRk9OVFNFVAkoR3VpRm9udHNldClOVUxMCisjIGVsc2UKKyMgIGlmZGVmIEZFQVRfR1VJX1gxMQorICB0eXBlZGVmIFhGb250U3RydWN0CSpHdWlGb250OwkvKiBoYW5kbGUgZm9yIGEgR1VJIGZvbnQgKi8KKyAgdHlwZWRlZiBYRm9udFNldAlHdWlGb250c2V0OwkvKiBoYW5kbGUgZm9yIGEgR1VJIGZvbnRzZXQgKi8KKyMgICBkZWZpbmUgTk9GT05UCShHdWlGb250KTAKKyMgICBkZWZpbmUgTk9GT05UU0VUCShHdWlGb250c2V0KTAKKyMgIGVsc2UKKyAgdHlwZWRlZiBsb25nX3UJR3VpRm9udDsJLyogaGFuZGxlIGZvciBhIEdVSSBmb250ICovCisgIHR5cGVkZWYgbG9uZ191CUd1aUZvbnRzZXQ7CS8qIGhhbmRsZSBmb3IgYSBHVUkgZm9udHNldCAqLworIyAgIGRlZmluZSBOT0ZPTlQJKEd1aUZvbnQpMAorIyAgIGRlZmluZSBOT0ZPTlRTRVQJKEd1aUZvbnRzZXQpMAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBHdWkKK3sKKyAgICBpbnQJCWluX2ZvY3VzOwkgICAgLyogVmltIGhhcyBpbnB1dCBmb2N1cyAqLworICAgIGludAkJaW5fdXNlOwkJICAgIC8qIElzIHRoZSBHVUkgYmVpbmcgdXNlZD8gKi8KKyAgICBpbnQJCXN0YXJ0aW5nOwkgICAgLyogR1VJIHdpbGwgc3RhcnQgaW4gYSBsaXR0bGUgd2hpbGUgKi8KKyAgICBpbnQJCXNoZWxsX2NyZWF0ZWQ7CSAgICAvKiBIYXMgdGhlIHNoZWxsIGJlZW4gY3JlYXRlZCB5ZXQ/ICovCisgICAgaW50CQlkeWluZzsJCSAgICAvKiBJcyB2aW0gZHlpbmc/IFRoZW4gb3V0cHV0IHRvIHRlcm1pbmFsICovCisgICAgaW50CQlkb2Zvcms7CQkgICAgLyogVXNlIGZvcmsoKSB3aGVuIEdVSSBpcyBzdGFydGluZyAqLworICAgIGludAkJZHJhZ2dlZF9zYjsJICAgIC8qIFdoaWNoIHNjcm9sbGJhciBiZWluZyBkcmFnZ2VkLCBpZiBhbnk/ICovCisgICAgd2luX1QJKmRyYWdnZWRfd3A7CSAgICAvKiBXaGljaCBXSU4ncyBzYiBiZWluZyBkcmFnZ2VkLCBpZiBhbnk/ICovCisgICAgaW50CQlwb2ludGVyX2hpZGRlbjsJICAgIC8qIElzIHRoZSBtb3VzZSBwb2ludGVyIGhpZGRlbj8gKi8KKyAgICBpbnQJCWNvbDsJCSAgICAvKiBDdXJyZW50IGN1cnNvciBjb2x1bW4gaW4gR1VJIGRpc3BsYXkgKi8KKyAgICBpbnQJCXJvdzsJCSAgICAvKiBDdXJyZW50IGN1cnNvciByb3cgaW4gR1VJIGRpc3BsYXkgKi8KKyAgICBpbnQJCWN1cnNvcl9jb2w7CSAgICAvKiBQaHlzaWNhbCBjdXJzb3IgY29sdW1uIGluIEdVSSBkaXNwbGF5ICovCisgICAgaW50CQljdXJzb3Jfcm93OwkgICAgLyogUGh5c2ljYWwgY3Vyc29yIHJvdyBpbiBHVUkgZGlzcGxheSAqLworICAgIGNoYXIJY3Vyc29yX2lzX3ZhbGlkOyAgICAvKiBUaGVyZSBpcyBhIGN1cnNvciBhdCBjdXJzb3Jfcm93L2NvbCAqLworICAgIGludAkJbnVtX2NvbHM7CSAgICAvKiBOdW1iZXIgb2YgY29sdW1ucyAqLworICAgIGludAkJbnVtX3Jvd3M7CSAgICAvKiBOdW1iZXIgb2Ygcm93cyAqLworICAgIGludAkJc2Nyb2xsX3JlZ2lvbl90b3A7ICAvKiBUb3AgKGZpcnN0KSBsaW5lIG9mIHNjcm9sbCByZWdpb24gKi8KKyAgICBpbnQJCXNjcm9sbF9yZWdpb25fYm90OyAgLyogQm90dG9tIChsYXN0KSBsaW5lIG9mIHNjcm9sbCByZWdpb24gKi8KKyAgICBpbnQJCXNjcm9sbF9yZWdpb25fbGVmdDsgIC8qIExlZnQgKGZpcnN0KSBjb2x1bW4gb2Ygc2Nyb2xsIHJlZ2lvbiAqLworICAgIGludAkJc2Nyb2xsX3JlZ2lvbl9yaWdodDsgIC8qIFJpZ2h0IChsYXN0KSBjb2wuIG9mIHNjcm9sbCByZWdpb24gKi8KKyAgICBpbnQJCWhpZ2hsaWdodF9tYXNrOwkgICAgLyogSGlnaGxpZ2h0IGF0dHJpYnV0ZSBtYXNrICovCisgICAgaW50CQlzY3JvbGxiYXJfd2lkdGg7ICAgIC8qIFdpZHRoIG9mIHZlcnRpY2FsIHNjcm9sbGJhcnMgKi8KKyAgICBpbnQJCXNjcm9sbGJhcl9oZWlnaHQ7ICAgLyogSGVpZ2h0IG9mIGhvcml6b250YWwgc2Nyb2xsYmFyICovCisgICAgaW50CQlsZWZ0X3NiYXJfeDsJICAgIC8qIENhbGN1bGF0ZWQgeCBjb29yZCBmb3IgbGVmdCBzY3JvbGxiYXIgKi8KKyAgICBpbnQJCXJpZ2h0X3NiYXJfeDsJICAgIC8qIENhbGN1bGF0ZWQgeCBjb29yZCBmb3IgcmlnaHQgc2Nyb2xsYmFyICovCisKKyNpZmRlZiBGRUFUX01FTlUKKyMgaWZuZGVmIEZFQVRfR1VJX0dUSworICAgIGludAkJbWVudV9oZWlnaHQ7CSAgICAvKiBIZWlnaHQgb2YgdGhlIG1lbnUgYmFyICovCisgICAgaW50CQltZW51X3dpZHRoOwkgICAgLyogV2lkdGggb2YgdGhlIG1lbnUgYmFyICovCisjIGVuZGlmCisgICAgY2hhcgltZW51X2lzX2FjdGl2ZTsJICAgIC8qIFRSVUUgaWYgbWVudSBpcyBwcmVzZW50ICovCisjIGlmZGVmIEZFQVRfR1VJX0FUSEVOQQorICAgIGNoYXIJbWVudV9oZWlnaHRfZml4ZWQ7ICAvKiBUUlVFIGlmIG1lbnUgaGVpZ2h0IGZpeGVkICovCisjIGVuZGlmCisjZW5kaWYKKworICAgIHNjcm9sbGJhcl9UIGJvdHRvbV9zYmFyOwkgICAgLyogQm90dG9tIHNjcm9sbGJhciAqLworICAgIGludAkJd2hpY2hfc2Nyb2xsYmFyc1szXTsvKiBXaGljaCBzY3JvbGxiYXIgYm94ZXMgYXJlIGFjdGl2ZT8gKi8KKyAgICBpbnQJCXByZXZfd3JhcDsJICAgIC8qIEZvciB1cGRhdGluZyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKi8KKyAgICBpbnQJCWNoYXJfd2lkdGg7CSAgICAvKiBXaWR0aCBvZiBjaGFyIGluIHBpeGVscyAqLworICAgIGludAkJY2hhcl9oZWlnaHQ7CSAgICAvKiBIZWlnaHQgb2YgY2hhciBpbiBwaXhlbHMgKyAnbGluZXNwYWNlJyAqLworICAgIGludAkJY2hhcl9hc2NlbnQ7CSAgICAvKiBBc2NlbnQgb2YgY2hhciBpbiBwaXhlbHMgKi8KKyAgICBpbnQJCWJvcmRlcl93aWR0aDsJICAgIC8qIFdpZHRoIG9mIG91ciBib3JkZXIgYXJvdW5kIHRleHQgYXJlYSAqLworICAgIGludAkJYm9yZGVyX29mZnNldDsJICAgIC8qIFRvdGFsIHBpeGVsIG9mZnNldCBmb3IgYWxsIGJvcmRlcnMgKi8KKworICAgIEd1aUZvbnQJbm9ybV9mb250OwkgICAgLyogTm9ybWFsIGZvbnQgKi8KKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgR3VpRm9udAlib2xkX2ZvbnQ7CSAgICAvKiBCb2xkIGZvbnQgKi8KKyAgICBHdWlGb250CWl0YWxfZm9udDsJICAgIC8qIEl0YWxpYyBmb250ICovCisgICAgR3VpRm9udAlib2xkaXRhbF9mb250OwkgICAgLyogQm9sZC1JdGFsaWMgZm9udCAqLworI2Vsc2UKKyAgICBpbnQJCWZvbnRfY2FuX2JvbGQ7CSAgICAvKiBXaGV0aGVyIG5vcm1fZm9udCBzdXBwb3J0cyBib2xkIHdlaWdodC4KKwkJCQkgICAgICogVGhlIHN0eWxlZCBmb250IHZhcmlhbnRzIGFyZSBub3QgdXNlZC4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKKyMgaWZkZWYgRk9OVFNFVF9BTFdBWVMKKyAgICBHdWlGb250c2V0CW1lbnVfZm9udHNldDsJICAgIC8qIHNldCBvZiBmb250cyBmb3IgbXVsdGktYnl0ZSBjaGFycyAqLworIyBlbHNlCisgICAgR3VpRm9udAltZW51X2ZvbnQ7CSAgICAvKiBtZW51IGl0ZW0gZm9udCAqLworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIEd1aUZvbnQJd2lkZV9mb250OwkgICAgLyogJ2d1aWZvbnR3aWRlJyBmb250ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgR3VpRm9udHNldAlmb250c2V0OwkgICAgLyogc2V0IG9mIGZvbnRzIGZvciBtdWx0aS1ieXRlIGNoYXJzICovCisjZW5kaWYKKyAgICBndWljb2xvcl9UCWJhY2tfcGl4ZWw7CSAgICAvKiBDb2xvciBvZiBiYWNrZ3JvdW5kICovCisgICAgZ3VpY29sb3JfVAlub3JtX3BpeGVsOwkgICAgLyogQ29sb3Igb2Ygbm9ybWFsIHRleHQgKi8KKyAgICBndWljb2xvcl9UCWRlZl9iYWNrX3BpeGVsOwkgICAgLyogZGVmYXVsdCBDb2xvciBvZiBiYWNrZ3JvdW5kICovCisgICAgZ3VpY29sb3JfVAlkZWZfbm9ybV9waXhlbDsJICAgIC8qIGRlZmF1bHQgQ29sb3Igb2Ygbm9ybWFsIHRleHQgKi8KKworI2lmZGVmIEZFQVRfR1VJX1gxMQorICAgIGNoYXIJKnJzcmNfbWVudV9mZ19uYW1lOwkvKiBDb2xvciBvZiBtZW51IGFuZCBkaWFsb2cgZm9yZWdvdW5kICovCisgICAgZ3VpY29sb3JfVAltZW51X2ZnX3BpeGVsOwkJLyogU2FtZSBpbiBQaXhlbCBmb3JtYXQgKi8KKyAgICBjaGFyCSpyc3JjX21lbnVfYmdfbmFtZTsJLyogQ29sb3Igb2YgbWVudSBhbmQgZGlhbG9nIGJhY2tnb3VuZCAqLworICAgIGd1aWNvbG9yX1QJbWVudV9iZ19waXhlbDsJCS8qIFNhbWUgaW4gUGl4ZWwgZm9ybWF0ICovCisgICAgY2hhcgkqcnNyY19zY3JvbGxfZmdfbmFtZTsJLyogQ29sb3Igb2Ygc2Nyb2xsYmFyIGZvcmVncm91bmQgKi8KKyAgICBndWljb2xvcl9UCXNjcm9sbF9mZ19waXhlbDsJLyogU2FtZSBpbiBQaXhlbCBmb3JtYXQgKi8KKyAgICBjaGFyCSpyc3JjX3Njcm9sbF9iZ19uYW1lOwkvKiBDb2xvciBvZiBzY3JvbGxiYXIgYmFja2dyb3VuZCAqLworICAgIGd1aWNvbG9yX1QJc2Nyb2xsX2JnX3BpeGVsOwkvKiBTYW1lIGluIFBpeGVsIGZvcm1hdCAqLworCisjIGlmZGVmIEZFQVRfR1VJX01PVElGCisgICAgZ3VpY29sb3JfVAltZW51X2RlZl9mZ19waXhlbDsgIC8qIERlZmF1bHQgbWVudSBmb3JlZ3JvdW5kICovCisgICAgZ3VpY29sb3JfVAltZW51X2RlZl9iZ19waXhlbDsgIC8qIERlZmF1bHQgbWVudSBiYWNrZ3JvdW5kICovCisgICAgZ3VpY29sb3JfVAlzY3JvbGxfZGVmX2ZnX3BpeGVsOyAgLyogRGVmYXVsdCBzY3JvbGxiYXIgZm9yZWdyb3VuZCAqLworICAgIGd1aWNvbG9yX1QJc2Nyb2xsX2RlZl9iZ19waXhlbDsgIC8qIERlZmF1bHQgc2Nyb2xsYmFyIGJhY2tncm91bmQgKi8KKyMgZW5kaWYKKyAgICBEaXNwbGF5CSpkcHk7CQkgICAgLyogWCBkaXNwbGF5ICovCisgICAgV2luZG93CXdpZDsJCSAgICAvKiBXaW5kb3cgaWQgb2YgdGV4dCBhcmVhICovCisgICAgaW50CQl2aXNpYmlsaXR5OwkgICAgLyogSXMgc2hlbGwgcGFydGlhbGx5L2Z1bGx5IG9ic2N1cmVkPyAqLworICAgIEdDCQl0ZXh0X2djOworICAgIEdDCQliYWNrX2djOworICAgIEdDCQlpbnZlcnRfZ2M7CisgICAgQ3Vyc29yCWJsYW5rX3BvaW50ZXI7CSAgICAvKiBCbGFuayBwb2ludGVyICovCisKKyAgICAvKiBYIFJlc291cmNlcyAqLworICAgIGNoYXJfdQkqcnNyY19mb250X25hbWU7ICAgIC8qIFJlc291cmNlIGZvbnQgbmFtZSwgdXNlZCBpZiAnZ3VpZm9udCcKKwkJCQkgICAgICAgbm90IHNldCAqLworICAgIGNoYXJfdQkqcnNyY19ib2xkX2ZvbnRfbmFtZTsgLyogUmVzb3VyY2UgYm9sZCBmb250IG5hbWUgKi8KKyAgICBjaGFyX3UJKnJzcmNfaXRhbF9mb250X25hbWU7IC8qIFJlc291cmNlIGl0YWxpYyBmb250IG5hbWUgKi8KKyAgICBjaGFyX3UJKnJzcmNfYm9sZGl0YWxfZm9udF9uYW1lOyAgLyogUmVzb3VyY2UgYm9sZC1pdGFsaWMgZm9udCBuYW1lICovCisgICAgY2hhcl91CSpyc3JjX21lbnVfZm9udF9uYW1lOyAgICAvKiBSZXNvdXJjZSBtZW51IEZvbnQgbmFtZSAqLworICAgIEJvb2wJcnNyY19yZXZfdmlkZW87CSAgICAvKiBVc2UgcmV2ZXJzZSB2aWRlbz8gKi8KKworICAgIGNoYXJfdQkqZ2VvbTsJCSAgICAvKiBHZW9tZXRyeSwgZWcgIjgweDI0IiAqLworICAgIEJvb2wJY29sb3JfYXBwcm94OwkgICAgLyogU29tZSBjb2xvciB3YXMgYXBwcm94aW1hdGVkICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX0dUSworICAgIGludAkJdmlzaWJpbGl0eTsJICAgIC8qIElzIHNoZWxsIHBhcnRpYWxseS9mdWxseSBvYnNjdXJlZD8gKi8KKyAgICBHZGtDdXJzb3IJKmJsYW5rX3BvaW50ZXI7CSAgICAvKiBCbGFuayBwb2ludGVyICovCisKKyAgICAvKiBYIFJlc291cmNlcyAqLworICAgIGNoYXJfdQkqZ2VvbTsJCSAgICAvKiBHZW9tZXRyeSwgZWcgIjgweDI0IiAqLworCisgICAgR3RrV2lkZ2V0CSptYWlud2luOwkgICAgLyogdG9wIGxldmVsIEdUSyB3aW5kb3cgKi8KKyAgICBHdGtXaWRnZXQJKmZvcm13aW47CSAgICAvKiBtYW5hZ2VzIGFsbCB0aGUgd2luZG93cyBiZWxvdyAqLworICAgIEd0a1dpZGdldAkqZHJhd2FyZWE7CSAgICAvKiB0aGUgInRleHQiIGFyZWEgKi8KKyMgaWZkZWYgRkVBVF9NRU5VCisgICAgR3RrV2lkZ2V0CSptZW51YmFyOwkgICAgLyogbWVudWJhciAqLworIyBlbmRpZgorIyBpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICBHdGtXaWRnZXQJKnRvb2xiYXI7CSAgICAvKiB0b29sYmFyICovCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfR1VJX0dOT01FCisgICAgR3RrV2lkZ2V0CSptZW51YmFyX2g7CSAgICAvKiBtZW51YmFyIGhhbmRsZSAqLworICAgIEd0a1dpZGdldAkqdG9vbGJhcl9oOwkgICAgLyogdG9vbGJhciBoYW5kbGUgKi8KKyMgZW5kaWYKKyAgICBHZGtDb2xvcgkqZmdjb2xvcjsJICAgIC8qIEdESy1zdHlsZWQgZm9yZWdyb3VuZCBjb2xvciAqLworICAgIEdka0NvbG9yCSpiZ2NvbG9yOwkgICAgLyogR0RLLXN0eWxlZCBiYWNrZ3JvdW5kIGNvbG9yICovCisjIGlmbmRlZiBIQVZFX0dUSzIKKyAgICBHdWlGb250CWN1cnJlbnRfZm9udDsKKyMgZW5kaWYKKyAgICBHZGtHQwkqdGV4dF9nYzsJICAgIC8qIGNhY2hlZCBHQyBmb3Igbm9ybWFsIHRleHQgKi8KKyMgaWZkZWYgSEFWRV9HVEsyCisgICAgUGFuZ29Db250ZXh0ICAgICAqdGV4dF9jb250ZXh0OyAvKiB0aGUgY29udGV4dCB1c2VkIGZvciBhbGwgdGV4dCAqLworICAgIFBhbmdvRm9udAkgICAgICphc2NpaV9mb250OyAgIC8qIGNhY2hlZCBmb250IGZvciBBU0NJSSBzdHJpbmdzICovCisgICAgUGFuZ29HbHlwaFN0cmluZyAqYXNjaWlfZ2x5cGhzOyAvKiBjYWNoZWQgY29kZSBwb2ludCAtPiBnbHlwaCBtYXAgKi8KKyMgZW5kaWYKKworICAgIEd0a0FjY2VsR3JvdXAgKmFjY2VsX2dyb3VwOworIyBpZm5kZWYgSEFWRV9HVEsyCisgICAgR3RrV2lkZ2V0CSpmb250ZGxnOwkgICAgLyogZm9udCBzZWxlY3Rpb24gZGlhbG9nIHdpbmRvdyAqLworICAgIGNoYXJfdQkqZm9udG5hbWU7CSAgICAvKiBmb250IG5hbWUgZnJvbSBmb250IHNlbGVjdGlvbiBkaWFsb2cgKi8KKyMgZW5kaWYKKyAgICBHdGtXaWRnZXQJKmZpbGVkbGc7CSAgICAvKiBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgKi8KKyAgICBjaGFyX3UJKmJyb3dzZV9mbmFtZTsJICAgIC8qIGZpbGUgbmFtZSBmcm9tIGZpbGVkbGcgKi8KKyNlbmRpZgkvKiBGRUFUX0dVSV9HVEsgKi8KKworI2lmZGVmIEZFQVRfRk9PVEVSCisgICAgaW50CQlmb290ZXJfaGVpZ2h0OwkgICAgLyogaGVpZ2h0IG9mIHRoZSBtZXNzYWdlIGZvb3RlciAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgXAorCSYmIChkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkgfHwgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikpCisgICAgaW50CQl0b29sYmFyX2hlaWdodDsJICAgIC8qIGhlaWdodCBvZiB0aGUgdG9vbGJhciAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0JFVkFMX1RJUAorICAgIC8qIFRvb2x0aXAgcHJvcGVydGllczsgYWxzbyB1c2VkIGZvciBiYWxsb29uIGV2YWx1YXRpb24gKi8KKyAgICBjaGFyX3UJKnJzcmNfdG9vbHRpcF9mb250X25hbWU7IC8qIHRvb2x0aXAgZm9udCBuYW1lICovCisgICAgY2hhcgkqcnNyY190b29sdGlwX2ZnX25hbWU7CS8qIHRvb2x0aXAgZm9yZWdyb3VuZCBjb2xvciBuYW1lICovCisgICAgY2hhcgkqcnNyY190b29sdGlwX2JnX25hbWU7CS8qIHRvb2x0aXAgYmFja2dyb3VuZCBjb2xvciBuYW1lICovCisgICAgZ3VpY29sb3JfVAl0b29sdGlwX2ZnX3BpeGVsOwkvKiB0b29sdGlwIGZvcmVncm91bmQgY29sb3IgKi8KKyAgICBndWljb2xvcl9UCXRvb2x0aXBfYmdfcGl4ZWw7CS8qIHRvb2x0aXAgYmFja2dyb3VuZCBjb2xvciAqLworICAgIFhGb250U2V0CXRvb2x0aXBfZm9udHNldDsJLyogdG9vbHRpcCBmb250c2V0ICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX01TV0lOCisgICAgR3VpRm9udAljdXJyRm9udDsJICAgIC8qIEN1cnJlbnQgZm9udCAqLworICAgIGd1aWNvbG9yX1QJY3VyckZnQ29sb3I7CSAgICAvKiBDdXJyZW50IGZvcmVncm91bmQgdGV4dCBjb2xvciAqLworICAgIGd1aWNvbG9yX1QJY3VyckJnQ29sb3I7CSAgICAvKiBDdXJyZW50IGJhY2tncm91bmQgdGV4dCBjb2xvciAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgVmltQXBwICAgICAqdmltQXBwOworICAgIFZpbVdpbmRvdyAgKnZpbVdpbmRvdzsKKyAgICBWaW1Gb3JtVmlldyAqdmltRm9ybTsKKyAgICBWaW1UZXh0QXJlYVZpZXcgKnZpbVRleHRBcmVhOworICAgIGludAkJdmRjbXA7CQkgICAgLyogVmltIERpcmVjdCBDb21tdW5pY2F0aW9uIE1lc3NhZ2UgUG9ydCAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9NQUMKKyAgICBXaW5kb3dQdHIJVmltV2luZG93OworICAgIE1lbnVIYW5kbGUJTWFjT1NIZWxwTWVudTsJICAgIC8qIEhlbHAgbWVudSBwcm92aWRlZCBieSB0aGUgTWFjT1MgKi8KKyAgICBpbnQJCU1hY09TSGVscEl0ZW1zOwkgICAgLyogTnIgb2YgaGVscC1pdGVtcyBzdXBwbGllZCBieSBNYWNPUyAqLworICAgIGludAkJTWFjT1NIYXZlQ250eE1lbnU7ICAvKiBDb250ZXh0dWFsIG1lbnUgYXZhaWxhYmxlICovCisgICAgV2luZG93UHRyCXdpZDsJCSAgICAvKiBXaW5kb3cgaWQgb2YgdGV4dCBhcmVhICovCisgICAgaW50CQl2aXNpYmlsaXR5OwkgICAgLyogSXMgd2luZG93IHBhcnRpYWxseS9mdWxseSBvYnNjdXJlZD8gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9BTUlHQSkKKyAgICBzdHJ1Y3QgV2luZG93ICp3aW5kb3c7CQkvKiBhIGhhbmRsZSB0byB0aGUgYW1pZ2Egd2luZG93ICovCisgICAgc3RydWN0IE1lbnUJICAqbWVudTsJCS8qIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgbWVudSAqLworICAgIHN0cnVjdCBUZXh0Rm9udCAqdGV4dGZvbnQ7CQkvKiBhIHBvaW50ZXIgdG8gdGhlIGZvbnQgc3RydWN0dXJlICovCisjZW5kaWYKKworI2lmZGVmIFJJU0NPUworICAgIGludAkJd2luZG93X2hhbmRsZTsKKyAgICBjaGFyX3UJKndpbmRvd190aXRsZTsKKyAgICBpbnQJCXdpbmRvd190aXRsZV9zaXplOworICAgIGludAkJZmdfY29sb3VyOwkJLyogaW4gMHhCQkdHUlIgZm9ybWF0ICovCisgICAgaW50CQliZ19jb2xvdXI7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX1BIT1RPTgorICAgIFB0V2lkZ2V0X3QJKnZpbVdpbmRvdzsJCS8qIFB0V2luZG93ICovCisgICAgUHRXaWRnZXRfdAkqdmltVGV4dEFyZWE7CQkvKiBQdFJhdyAqLworICAgIFB0V2lkZ2V0X3QJKnZpbUNvbnRhaW5lcjsJCS8qIFB0UGFuZWwgKi8KKyMgaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoRkVBVF9UT09MQkFSKQorICAgIFB0V2lkZ2V0X3QJKnZpbVRvb2xCYXJHcm91cDsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NRU5VCisgICAgUHRXaWRnZXRfdAkqdmltTWVudUJhcjsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisgICAgUHRXaWRnZXRfdAkqdmltVG9vbEJhcjsKKyAgICBpbnQJCXRvb2xiYXJfaGVpZ2h0OworIyBlbmRpZgorICAgIFBoRXZlbnRfdAkqZXZlbnRfYnVmZmVyOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1hJTQorICAgIGNoYXIJKnJzcmNfaW5wdXRfbWV0aG9kOworICAgIGNoYXIJKnJzcmNfcHJlZWRpdF90eXBlX25hbWU7CisjZW5kaWYKK30gZ3VpX1Q7CisKK2V4dGVybiBndWlfVCBndWk7CQkJLyogdGhpcyBpcyBkZWZpbmVkIGluIGd1aS5jICovCisKKy8qIGRlZmluaXRpb25zIG9mIGF2YWlsYWJsZSB3aW5kb3cgcG9zaXRpb25pbmdzIGZvciBndWlfKl9wb3NpdGlvbl9pbl9wYXJlbnQoKQorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWV19QT1NfTU9VU0UsCisgICAgVldfUE9TX0NFTlRFUiwKKyAgICBWV19QT1NfVE9QX0NFTlRFUgorfQorZ3VpX3dpbl9wb3NfVDsKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisJfHwgZGVmaW5lZChNU1dJTl9GSU5EX1JFUExBQ0UpCisvKgorICogRmxhZ3MgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgZGlmZmVyZW50IGNvbnRleHRzIGluIHdoaWNoIHRoZQorICogZmluZC9yZXBsYWNlIGNhbGxiYWNrIG1heSBiZSBjYWxsZWQuCisgKi8KKyMgZGVmaW5lIEZSRF9GSU5ETkVYVAkxCS8qIEZpbmQgbmV4dCBpbiBmaW5kIGRpYWxvZyAqLworIyBkZWZpbmUgRlJEX1JfRklORE5FWFQJMgkvKiBGaW5kIG5leHQgaW4gcmVwbCBkaWFsb2cgKi8KKyMgZGVmaW5lIEZSRF9SRVBMQUNFCTMJLyogUmVwbGFjZSBvbmNlICovCisjIGRlZmluZSBGUkRfUkVQTEFDRUFMTAk0CS8qIFJlcGxhY2UgcmVtYWluaW5nIG1hdGNoZXMgKi8KKyMgZGVmaW5lIEZSRF9VTkRPCTUJLyogVW5kbyByZXBsYWNlZCB0ZXh0ICovCisjIGRlZmluZSBGUkRfVFlQRV9NQVNLICAgNwkvKiBNYXNrIGZvciB0aGUgY2FsbGJhY2sgdHlwZSAqLworLyogRmxhZ3Mgd2hpY2ggY2hhbmdlIHRoZSB3YXkgc2VhcmNoaW5nIGlzIGRvbmUuICovCisjIGRlZmluZSBGUkRfV0hPTEVfV09SRAkweDA4CS8qIG1hdGNoIHdob2xlIHdvcmQgb25seSAqLworIyBkZWZpbmUgRlJEX01BVENIX0NBU0UJMHgxMAkvKiBtYXRjaCBjYXNlICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9ndWlfYW1pZ2EuYyBiL3NyYy9ndWlfYW1pZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc4NmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9hbWlnYS5jCkBAIC0wLDAgKzEsMTc5NSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCUFtaWdhIEdVSSBzdXBwb3J0IGJ5IE1pY2hhZWwgTmllbHNlbgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgorI2luY2x1ZGUgPGludHVpdGlvbi9pbnR1aXRpb24uaD4KKyNpbmNsdWRlIDx1dGlsaXR5L3RhZ2l0ZW0uaD4KKyNpbmNsdWRlIDxncmFwaGljcy90ZXh0Lmg+CisjaW5jbHVkZSA8Z3JhcGhpY3MvcmFzdHBvcnQuaD4KKyNpbmNsdWRlIDxncmFwaGljcy9sYXllcnMuaD4KKyNpbmNsdWRlIDxwcm90by9pbnR1aXRpb24uaD4KKyNpbmNsdWRlIDxwcm90by9ncmFwaGljcy5oPgorI2luY2x1ZGUgPHByb3RvL2xheWVycy5oPgorI2luY2x1ZGUgPGRldmljZXMvdGltZXIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJndWlfYW1pZ2EuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZmRlZiBfX0FST1NfXworI2luY2x1ZGUgPGFyb3MvZGVidWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9BTUlHQSkgfHwgZGVmaW5lZChQUk9UTykKKworI2RlZmluZSBLRVlVUAkJNzYKKyNkZWZpbmUgS0VZRE9XTgkJNzcKKyNkZWZpbmUgS0VZUklHSFQJNzgKKyNkZWZpbmUgS0VZTEVGVAkJNzkKKyNkZWZpbmUgS0VZQkFDS1NQQUNFCTB4NDEKKyNkZWZpbmUgS0VZREVMRVRFCTB4NDYKKyNkZWZpbmUgS0VZSU5TRVJUCTB4NDcKKyNkZWZpbmUgS0VZSE9NRQkJMHg3MAorI2RlZmluZSBLRVlFTkQJCTB4NzEKKyNkZWZpbmUgS0VZV0hFRUxVUAkweDdBCisjZGVmaW5lIEtFWVdIRUVMRE9XTgkweDdCCisKKy8qIFdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzIG9uIFVuaXgsIHRoZXNlIG5lZWQgdG8gYmUgZGVmaW5lZCAqLworI2lmZGVmIFBST1RPCisjIGRlZmluZSBTVFJQVFIgY2hhciAqCisjIGRlZmluZSBCT09MIGludAorIyBkZWZpbmUgVUJZVEUgaW50CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBQcm9wSW5mbyBHYWRnZXQyU0luZm8gPSB7IEFVVE9LTk9CK1BST1BCT1JERVJMRVNTK0ZSRUVWRVJUK1BST1BORVdMT09LLCAwLCAwLCBNQVhCT0RZLCBNQVhCT0RZLCB9OworLy9zdGF0aWMgc3RydWN0IEltYWdlIEltYWdlMSA9IHsgMCwgMCwgMTAsIDM5NywJMCwgTlVMTCwgMHgwMDAwLCAweDAwMDAsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgR2FkZ2V0IHByb3BHYWRnZXQgPSB7IE5VTEwsIC0xMiwgMTUsIDEwLCAtMjgsCisJR0ZMR19SRUxSSUdIVCtHRkxHX1JFTEhFSUdIVCwKKwlHQUNUX1JFTFZFUklGWStHQUNUX1JJR0hUQk9SREVSK0dBQ1RfSU1NRURJQVRFLAorCUdUWVBfUFJPUEdBREdFVCtHVFlQX0daWkdBREdFVCwKKwlOVUxMLCBOVUxMLAorCU5VTEwsIE5VTEwsIChBUFRSKSZHYWRnZXQyU0luZm8sIE5VTEwsIE5VTEwgfTsKKworc3RhdGljIHN0cnVjdCB0aW1lcmVxdWVzdCAqVGltZXJJTzsKK3N0YXRpYyBzdHJ1Y3QgTXNnUG9ydAkgICpUaW1lck1QOworc3RhdGljIEJPT0wJCSAgIFRpbWVyU2VudDsKKworc3RydWN0IEdGWEJhc2UJCSpnZnhCYXNlOworc3RydWN0IEV4ZWNCYXNlCQkqZXhlY0Jhc2U7CitzdHJ1Y3QgTGF5ZXJzQmFzZQkqbGF5ZXJzQmFzZTsKKworc3RydWN0IE15Q29sb3IKK3sKKyAgICBXT1JEIHBlbjsKKyAgICBCT09MIGFsbG9jZWQ7Cit9OworCitzdHJ1Y3QgTXlDb2xvciBNeUNvbG9yVGFibGVbMjU2XTsKKworc3RydWN0IFRhZ0l0ZW0gdGFnc1tdID0KK3sKKyAgICB7V0FfTGVmdCwgMH0sCisgICAge1dBX1RvcCwgMH0sCisgICAge1dBX1dpZHRoLCA0MDB9LAorICAgIHtXQV9IZWlnaHQsIDQwMH0sCisgICAge1dBX1RpdGxlLCAoVUxPTkcpVklNX1ZFUlNJT05fU0hPUlR9LAorICAgIHtXQV9TY3JlZW5UaXRsZSwgKFVMT05HKVZJTV9WRVJTSU9OX0xPTkd9LAorICAgIHtXQV9EcmFnQmFyLCBUUlVFfSwJCQkvKiBlbmFibGUgZHJhZ2dpbmcgb2YgdGhlIHdpbmRvdyAqLworICAgIHtXQV9EZXB0aEdhZGdldCwgVFJVRX0sCQkvKiBlbmFibGUgdGhlIGRlcHRoIGdhZGdldCAqLworICAgIHtXQV9DbG9zZUdhZGdldCwgVFJVRX0sCQkvKiBlbmFibGUgdGhlIGNsb3NlIGdhZGdldCovCisgICAge1dBX1NpemVHYWRnZXQsIFRSVUV9LAkJLyogZW5hYmxlIHRoZSBzaXplIGdhZGdldCAqLworICAgIHtXQV9TaXplQkJvdHRvbSwgVFJVRX0sCQkvKiBzaXplZ2FkZ2V0IGNvbnRhaW5lZCBpbiBib3R0b20gYm9yZGVyICovCisgICAge1dBX1NtYXJ0UmVmcmVzaCwgVFJVRX0sCQkvKiBjaG9vc2Ugc21hcnQgcmVmcmVzaCwgc2F2ZXMgdXMgZG9pbmcgYSBsb3Qgb2Ygd29yayAqLworICAgIHtXQV9SZXBvcnRNb3VzZSwgVFJVRX0sCQkvKiBSZXBvcnQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSAqLworICAgIHtXQV9HaW1tZVplcm9aZXJvLCBUUlVFfSwKKyAgICB7V0FfQWN0aXZhdGUsIFRSVUV9LAkJLyogQWN0aXZhdGUgd2luZG93IG9uIHN0YXJ0dXAgKi8KKyAgICB7V0FfQWN0aXZhdGUsIFRSVUV9LAkJLyogQWN0aXZhdGUgd2luZG93IG9uIHN0YXJ0dXAgKi8KKyAgICB7V0FfTm9DYXJlUmVmcmVzaCwgVFJVRX0sCQkvKiBSZWZyZXNoIHNjcmVlbiwgZG9uJ3QgdGVsbCB1cyAqLworICAgIHtXQV9OZXdMb29rTWVudXMsIFRSVUV9LAkJLyogdXNlIHRoZSBuZXcgb3B0aW9ucyBmb3IgdGhlIG1lbnUgKi8KKyAgICB7V0FfQXV0b0FkanVzdCwgVFJVRX0sCQkvKiBJZiB3aW5kb3cgaXMgdG9vIGJpZyBmb3Igc2NyZWVuIGFkanVzdCBzaXplKi8KKyAgICB7V0FfTm9DYXJlUmVmcmVzaCwgVFJVRX0sCQkvKiBJZiB3aW5kb3cgaXMgdG9vIGJpZyBmb3Igc2NyZWVuIGFkanVzdCBzaXplKi8KKyAgICB7V0FfTW91c2VRdWV1ZSwgMX0sCQkJLyogTGltaXQgbnVtYmVyIG9mIHBlbmRpbmcgbW91c2UgbW92ZW1lbnQqLworICAgIHtXQV9ScHRRdWV1ZSwgMTB9LAkJCS8qIExpbWl0IG51bWJlciBvZiBwZW5kaW5nIGtleXN0cm9rZXMqLworICAgIHtXQV9JRENNUCwJCQkJLyogSURDTVAsIHdoYXQgZXZlbnRzIGludGVyZXN0IHVzICAqLworCUlEQ01QX05FV1NJWkUJCQkvKiBOb3RpZnkgdXMgYWJvdXQgc2l6ZSBjaGFuZ2Ugb2Ygd2luZG93Ki8KKwkgICAgfElEQ01QX1JFRlJFU0hXSU5ET1cJLyogTm90aWZ5IHVzIHdoZW4gdGhlIHdpbmRvdyBuZWVkcyByZWZyZXNoaW5nICovCisJICAgIHxJRENNUF9NT1VTRUJVVFRPTlMJCS8qIE5vdGlmeSB1cyB3aGVuIHRoZSBtb3VzZSBidXR0b25zIGhhdmUgYmVlbiB1c2VkICovCisJICAgIHxJRENNUF9NT1VTRU1PVkUJCS8qIE5vdGlmeSB1cyB3aGVuIHRoZSBtb3VzZSBpcyBtb3ZpbmcgKi8KKwkgICAgfElEQ01QX0dBREdFVERPV04JCS8qIE5vdGlmeSB1cyB3aGVuIGEgZ2FkZ2V0IGhhcyBiZWVuIHNlbGVjdGVkICovCisJICAgIHxJRENNUF9HQURHRVRVUAkJLyogTm90aWZ5IHVzIHdoZW4gYSBnYWRnZXQgaGFzIGJlZW4gcmVsZWFzZWQgKi8KKwkgICAgfElEQ01QX01FTlVQSUNLCQkvKiBOb3RpZnkgdXMgd2hlbiBhIG1lbnUgaGFzIGJlZW4gcGlja2VkICovCisJICAgIHxJRENNUF9DTE9TRVdJTkRPVwkJLyogTm90aWZ5IHVzIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gY2xvc2UgdGhlIHdpbmRvdyAqLworCSAgICB8SURDTVBfVkFOSUxMQUtFWQkJLyogTm90aWZ5IHVzIGFib3V0IGtleXN0cm9rZXMgKi8KKwkgICAgfElEQ01QX1JBV0tFWQkJLyogTm90aWZ5IHVzIHdoZW4gcmF3IGtleSBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGllIGN1cnNvciovCisJICAgIHxJRENNUF9JTlRVSVRJQ0tTCQkvKiBTaW1wbGVyIHRpbWVyIGZvciB0aGUgYmxpbmsgb3B0aW9uICovCisJICAgIHxJRENNUF9NRU5VSEVMUAkJLyogQWxsb3cgdGhlIGhlbHAga2V5IHRvIGJlIHVzZWQgZHVyaW5nIG1lbnUgZXZlbnRzICovCisJICAgIHxJRENNUF9HQURHRVRIRUxQCQkvKiBBbGxvdyB0aGUgaGVscCBrZXkgdG8gYmUgdXNlZCBkdXJpbmcgZ2FkZ2V0IGV2ZW50cyAqLworCSAgICB8SURDTVBfSU5BQ1RJVkVXSU5ET1cJLyogbm90aWZ5IG9mIGluYWN0aXZlIHdpbmRvdyAqLworCSAgICB8SURDTVBfQUNUSVZFV0lORE9XCQkvKiBub3RpZnkgb2YgaW5hY3RpdmUgd2luZG93ICovCisgICAgfSwKKyAgICB7VEFHX0RPTkUsIE5VTEx9Cit9OworCisjaWYgZGVmaW5lZChEKQorI3VuZGVmIEQKKyNlbmRpZgorCisvKiNkZWZpbmUgRChfbXNnKSBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBfbXNnKSovCisKKyNkZWZpbmUgRChfQSkKKyNkZWZpbmUga3ByaW50ZihzLCAuLi4pCisKK3N0YXRpYyB2b2lkIEFtaWdhRXJyb3IoY29uc3QgY2hhciAqc3RyaW5nKTsKKwordm9pZCBIYW5kbGVFdmVudCh1bnNpZ25lZCBsb25nICogb2JqZWN0KTsKK3N0YXRpYyBVQllURSBnZXRyZWFsY29sb3IoZ3VpY29sb3JfVCBpKTsKKworc3RhdGljIHN0cnVjdCBOZXdXaW5kb3cgdmltTmV3V2luZG93ID0KK3sKKyAgICAwLCAwLAkJLyogd2luZG93IFhZIG9yaWdpbiByZWxhdGl2ZSB0byBUb3BMZWZ0IG9mIHNjcmVlbiAqLworICAgIDAsIDAsCQkvKiB3aW5kb3cgd2lkdGggYW5kIGhlaWdodCAqLworICAgIDAsIDEsCQkvKiBkZXRhaWwgYW5kIGJsb2NrIHBlbnMgKi8KKyAgICBOVUxMLAkJLyogSURDTVAgZmxhZ3MgKi8KKyAgICBOVUxMLAkJLyogb3RoZXIgd2luZG93IGZsYWdzICovCisgICAgJnByb3BHYWRnZXQsCS8qIGZpcnN0IGdhZGdldCBpbiBnYWRnZXQgbGlzdCAqLworICAgIE5VTEwsCQkvKiBjdXN0b20gQ0hFQ0tNQVJLIGltYWdlcnkgKi8KKyAgICAiQW1pZ2EgVmltIGd1aSIsCS8qIHdpbmRvdyB0aXRsZSAqLworICAgIE5VTEwsCQkvKiBjdXN0b20gc2NyZWVuIHBvaW50ZXIgKi8KKyAgICBOVUxMLAkJLyogY3VzdG9tIGJpdG1hcCAqLworICAgIDUwLCA1MCwJCS8qIG1pbmltdW0gd2lkdGggYW5kIGhlaWdodCAqLworICAgICh1bnNpZ25lZCBzaG9ydCktMSwgKHVuc2lnbmVkIHNob3J0KS0xLAkvKiBtYXhpbXVtIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICBXQkVOQ0hTQ1JFRU4JLyogZGVzdGluYXRpb24gc2NyZWVuIHR5cGUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbnQgIGtleV9zeW07CisgICAgY2hhcl91ICB2aW1fY29kZTA7CisgICAgY2hhcl91ICB2aW1fY29kZTE7Cit9IHNwZWNpYWxfa2V5c1tdID0KK3sKKyAgICB7MCwJCSAgICAwLCAwfQorfTsKKworI2lmIDAKKyAgICAvKiBub3QgdXNlZD8gKi8KKyAgICBzdGF0aWMgaW50CitoZXhfZGlnaXQoaW50IGMpCit7CisgICAgaWYgKGlzZGlnaXQoYykpCisJcmV0dXJuIGMgLSAnMCc7CisgICAgYyA9IFRPTE9XRVJfQVNDKGMpOworICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwlyZXR1cm4gYyAtICdhJyArIDEwOworICAgIHJldHVybiAtMTAwMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNoYXJhY3RlcldpZHRoID0gLTE7CitzdGF0aWMgaW50IGNoYXJhY3RlckhlaWdodCA9IC0xOworc3RhdGljIHN0cnVjdAoreworICAgIEJPT0wJYWN0aXZlOworICAgIGVudW0KKyAgICB7CisJQ3Vyc29yT2ZmLAorCUN1cnNvck9uLAorCUN1cnNvcldhaXQKKyAgICB9CQlzdGF0ZTsKKyAgICBpbnQJCW9uVGltZTsKKyAgICBpbnQJCW9mZlRpbWU7CisgICAgaW50CQl3YWl0VGltZTsKKyAgICBpbnQJCWN1cnJlbnQ7Cit9IGN1cnNvciA9Cit7CisgICAgVFJVRSwKKyAgICBDdXJzb3JXYWl0LAorICAgIDEwLAorICAgIDEwLAorICAgIDcsCisgICAgMAorfTsKKworZW51bSBEcmF3Qm94TW9kZQoreworICAgIERCX0ZpbGxlZCwKKyAgICBEQl9Ob3RGaWxsZWQKK307CisKKyAgICBzdGF0aWMgdm9pZAorVGV4dERpbWVuc2lvbnModm9pZCkKK3sKKyAgICBzdHJ1Y3QgVGV4dEV4dGVudCB0ZXh0RXh0OworCisgICAgVGV4dEV4dGVudChndWkud2luZG93LT5SUG9ydCwgInMiLCAxLCAmdGV4dEV4dCk7CisKKyAgICBjaGFyYWN0ZXJXaWR0aCA9IHRleHRFeHQudGVfV2lkdGg7CisgICAgY2hhcmFjdGVySGVpZ2h0ID0gdGV4dEV4dC50ZV9IZWlnaHQ7Cit9CisKKyAgICBzdGF0aWMgaW50Citwb3NXaWR0aENoYXJUb1BvaW50KGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gKHdpZHRoKSpjaGFyYWN0ZXJXaWR0aDsKK30KKworICAgIHN0YXRpYyBpbnQKK3Bvc0hlaWdodENoYXJUb1BvaW50KGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIChpbnQpKGhlaWdodCkqY2hhcmFjdGVySGVpZ2h0OworfQorCisgICAgc3RhdGljIGludAorcG9zV2lkdGhQb2ludFRvQ2hhcihpbnQgd2lkdGgpCit7CisgICAgLy9yZXR1cm4gKGludClmbG9vcigoZmxvYXQpd2lkdGgvKGZsb2F0KWNoYXJhY3RlcldpZHRoKS0xOworICAgIHJldHVybiB3aWR0aCAvY2hhcmFjdGVyV2lkdGg7Cit9CisKKyAgICBzdGF0aWMgaW50Citwb3NIZWlnaHRQb2ludFRvQ2hhcihpbnQgaGVpZ2h0KQoreworICAgIC8vcmV0dXJuIChpbnQpZmxvb3IoKGZsb2F0KWhlaWdodC8oZmxvYXQpY2hhcmFjdGVySGVpZ2h0KS0yOworICAgIHJldHVybiBoZWlnaHQgLyBjaGFyYWN0ZXJIZWlnaHQ7Cit9CisKKyAgICBzdGF0aWMgaW50Cit3aWR0aENoYXJUb1BvaW50KGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gKHdpZHRoKSooY2hhcmFjdGVyV2lkdGgpOworfQorCisgICAgc3RhdGljIGludAoraGVpZ2h0Q2hhclRvUG9pbnQoaW50IGhlaWdodCkKK3sKKyAgICByZXR1cm4gKGhlaWdodCkqY2hhcmFjdGVySGVpZ2h0OworfQorCisgICAgc3RhdGljIGludAord2lkdGhQb2ludFRvQ2hhcihpbnQgd2lkdGgpCit7CisgICAgcmV0dXJuICh3aWR0aCkvY2hhcmFjdGVyV2lkdGg7Cit9CisKKyAgICBzdGF0aWMgaW50CitoZWlnaHRQb2ludFRvQ2hhcihpbnQgaGVpZ2h0KQoreworICAgIHJldHVybiAoaGVpZ2h0KS9jaGFyYWN0ZXJIZWlnaHQ7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcmVmcmVzaEJvcmRlcih2b2lkKQoreworICAgIC8qV2FpdEJPVlAoZ3VpLndpbmRvdy0+KTsqLworICAgIFJlZnJlc2hXaW5kb3dGcmFtZShndWkud2luZG93KTsKK30KKworICAgIHN0YXRpYyB2b2lkCitkcmF3Qm94KGVudW0gRHJhd0JveE1vZGUgbW9kZSwgdW5zaWduZWQgc2hvcnQgY29sLCB1bnNpZ25lZCBzaG9ydCByb3csIGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBMT05HIGFwZW4gPSBHZXRBUGVuKGd1aS53aW5kb3ctPlJQb3J0KTsKKyAgICBMT05HIHgxLCB5MSwgeDIsIHkyOworCitrcHJpbnRmKCIgZHJhd2JveCAlZCwlZCBjb2xvciAlZFxuIiwgY29sLCByb3csIGNvbG9yKTsKKworICAgIFNldEFQZW4oZ3VpLndpbmRvdy0+UlBvcnQsIGdldHJlYWxjb2xvcihjb2xvcikpOworCisgICAgeDEgPSBwb3NXaWR0aENoYXJUb1BvaW50KGNvbCk7CisgICAgeTEgPSBwb3NIZWlnaHRDaGFyVG9Qb2ludChyb3cgKyAxKSAtIGg7CisgICAgeDIgPSB4MSArIHcgLSAxOworICAgIHkyID0gcG9zSGVpZ2h0Q2hhclRvUG9pbnQocm93ICsgMSkgLSAxOworCisgICAgc3dpdGNoKG1vZGUpCisgICAgeworCWNhc2UgREJfRmlsbGVkOgorCSAgICBSZWN0RmlsbChndWkud2luZG93LT5SUG9ydCwgeDEsIHkxLCB4MiwgeTIpOworCSAgICBicmVhazsKKworCWNhc2UgREJfTm90RmlsbGVkOgorCSAgICBNb3ZlKGd1aS53aW5kb3ctPlJQb3J0LCB4MSwgeTEpOworCSAgICBEcmF3KGd1aS53aW5kb3ctPlJQb3J0LCB4MiwgeTEpOworCSAgICBEcmF3KGd1aS53aW5kb3ctPlJQb3J0LCB4MiwgeTIpOworCSAgICBEcmF3KGd1aS53aW5kb3ctPlJQb3J0LCB4MSwgeTIpOworCSAgICBEcmF3KGd1aS53aW5kb3ctPlJQb3J0LCB4MSwgeTEpOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICBTZXRBUGVuKGd1aS53aW5kb3ctPlJQb3J0LCBhcGVuKTsKKworfQorCisgICAgc3RhdGljIGVudW0gZXZlbnQKK0V2ZW50SGFuZGxlcih2b2lkKQoreworICAgIHN0cnVjdCBJbnR1aU1lc3NhZ2UgKm1zZzsKKyAgICBlbnVtIGV2ZW50CQlyZXR1cm5FdmVudCA9IGV2X0lnbm9yZTsKKyAgICBpbnQJCQljbGFzcywgY29kZTsKKyAgICBzdGF0aWMgaW50CQlkcmFnZ2luZyA9IDA7CisgICAgc3RhdGljIGludAkJbW91c2VYLCBtb3VzZVk7CisgICAgY2hhcl91CQlzdHJpbmdbNDBdOworICAgIEJPT0wJCXF1aXRfcmVxdWVzdCA9IEZBTFNFOworCisgICAgbXNnID0gKHN0cnVjdCBJbnR1aU1lc3NhZ2UgKilHZXRNc2coZ3VpLndpbmRvdy0+VXNlclBvcnQpOworCisgICAgaWYgKCFtc2cpCisgICAgeworCXJldHVybkV2ZW50ID0gZXZfTnVsbEV2ZW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworCisJY2xhc3MgPSBtc2ctPkNsYXNzOworCWNvZGUgPSBtc2ctPkNvZGU7CisKKwlzd2l0Y2goY2xhc3MpCisJeworCSAgICBjYXNlIElEQ01QX0lOVFVJVElDS1M6CisJCS8qCisJCSAgIGlmIChjdXJzb3IuYWN0aXZlKQorCQkgICB7CisJCSAgIGN1cnNvci5jdXJyZW50ICsrOworCQkgICBpZiAoY3Vyc29yLnN0YXRlID09IEN1cnNvck9mZikKKwkJICAgeworCQkgICBwcmludGYoImN1cnNvciB0dXJuZWQgb25cbiIpOworCQkgICBpZiAoY3Vyc29yLm9mZlRpbWUgPCBjdXJzb3IuY3VycmVudCkKKwkJICAgeworCQkgICBndWlfdW5kcmF3X2N1cnNvcigpOworCQkgICBjdXJzb3Iuc3RhdGUgPSBDdXJzb3JPbjsKKwkJICAgY3Vyc29yLmN1cnJlbnQgPSAwOworCQkgICB9CisJCSAgIH0KKwkJICAgZWxzZSBpZiAoY3Vyc29yLnN0YXRlID09IEN1cnNvck9uKQorCQkgICB7CisJCSAgIHByaW50ZigiY3Vyc29yIHR1cm5lZCBvZmZcbiIpOworCQkgICBpZiAoY3Vyc29yLm9uVGltZSA8IGN1cnNvci5jdXJyZW50KQorCQkgICB7CisJCSAgIGN1cnNvci5zdGF0ZSA9IEN1cnNvck9mZjsKKwkJICAgZ3VpX3VwZGF0ZV9jdXJzb3IoRkFMU0UpOworCQkgICBjdXJzb3IuY3VycmVudCA9IDA7CisJCSAgIH0KKwkJICAgfQorCQkgICBlbHNlIGlmIChjdXJzb3Iuc3RhdGUgPT0gQ3Vyc29yV2FpdCkKKwkJICAgeworCQkgICBwcmludGYoImN1cnNvciB0dXJuZWQgV2FpdFxuIik7CisJCSAgIGlmIChjdXJzb3Iud2FpdFRpbWUgPCBjdXJzb3IuY3VycmVudCkKKwkJICAgeworCQkgICBjdXJzb3Iuc3RhdGUgPSBDdXJzb3JPbjsKKwkJICAgY3Vyc29yLmN1cnJlbnQgPSAwOworCQkgICB9CisJfQorCX0KKwkJICAgZWxzZQorCQkgICB7CisJCSAgIH0KKwkJICAgcmV0dXJuRXZlbnQgPSBldl9JbnR1aVRpY2tzOworCQkgICAqLworCQkgICBicmVhazsKKworCSAgICBjYXNlIElEQ01QX01PVVNFQlVUVE9OUzoKKwkJICAgeworCQkgICAgICAgaW50IHZpbV9tb2RpZmllcnM9MDsKKwkJICAgICAgIEQoIk1vdXNlIGJ1dHRvbiBldmVudCBkZXRlY3RlZCIpOworCQkgICAgICAgc3dpdGNoIChtc2ctPlF1YWxpZmllciApCisJCSAgICAgICB7CisJCQkgICBjYXNlIElFUVVBTElGSUVSX0xBTFQ6CisJCQkgICBjYXNlIElFUVVBTElGSUVSX1JBTFQ6CisJCQkgICAgICAgRCgiZGV0ZWN0ZWQgYSBBbHQga2V5Iik7CisJCQkgICAgICAgdmltX21vZGlmaWVyc3w9TU9VU0VfQUxUOworCQkJICAgICAgIGJyZWFrOworCisJCQkgICBjYXNlIElFUVVBTElGSUVSX0xTSElGVDoKKwkJCSAgIGNhc2UgSUVRVUFMSUZJRVJfUlNISUZUOgorCQkJICAgICAgIEQoImRldGVjdGVkIGEgU2hpZnQga2V5Iik7CisJCQkgICAgICAgdmltX21vZGlmaWVyc3w9TU9VU0VfU0hJRlQ7CisJCQkgICAgICAgYnJlYWs7CisJCQkgICBjYXNlIElFUVVBTElGSUVSX0NPTlRST0w6CisJCQkgICAgICAgRCgiZGV0ZWN0ZWQgYSBDb250cm9sIGtleSIpOworCQkJICAgICAgIHZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKwkJCSAgICAgICBicmVhazsKKwkJICAgICAgIH0KKwkJICAgICAgIGlmIChjb2RlID09IFNFTEVDVERPV04pCisJCSAgICAgICB7CisJCQkgICBEKCJTZWxlY3QgRG93biBkZXRlY3RlZFxuIik7CisJCQkgICBkcmFnZ2luZyA9IDE7CisJCQkgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9MRUZULAorCQkJCSAgIG1vdXNlWCA9IG1zZy0+TW91c2VYIC0gZ3VpLndpbmRvdy0+Qm9yZGVyTGVmdCwKKwkJCQkgICBtb3VzZVkgPSBtc2ctPk1vdXNlWSAtIGd1aS53aW5kb3ctPkJvcmRlclRvcCwKKwkJCQkgICBGQUxTRSwKKwkJCQkgICB2aW1fbW9kaWZpZXJzKTsKKwkJCSAgIC8qZ3VpX3N0YXJ0X2hpZ2hsaWdodChITF9BTEwpOyovCisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChjb2RlID09IFNFTEVDVFVQKQorCQkgICAgICAgeworCQkJICAgRCgiU2VsZWN0IFVQIGRldGVjdGVkXG4iKTsKKwkJCSAgIGRyYWdnaW5nID0gMDsKKwkJCSAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KE1PVVNFX1JFTEVBU0UsCisJCQkJICAgbXNnLT5Nb3VzZVggLSBndWkud2luZG93LT5Cb3JkZXJMZWZ0LAorCQkJCSAgIG1zZy0+TW91c2VZIC0gZ3VpLndpbmRvdy0+Qm9yZGVyVG9wLAorCQkJCSAgIEZBTFNFLCB2aW1fbW9kaWZpZXJzKTsKKwkJCSAgIC8qZ3VpX3N0b3BfaGlnaGxpZ2h0KG1hc2spOyovCisJCSAgICAgICB9CisJCSAgICAgICByZXR1cm5FdmVudCA9IGV2X01vdXNlQnV0dG9uczsKKwkJICAgICAgIGJyZWFrOworCQkgICB9CisJICAgIGNhc2UgSURDTVBfTU9VU0VNT1ZFOgorCQkgICBpZiAoKGFicyhtb3VzZVgtKG1zZy0+TW91c2VYIC0gZ3VpLndpbmRvdy0+Qm9yZGVyTGVmdCkpID4gY2hhcmFjdGVyV2lkdGgpIHx8CisJCSAgICAgICAoYWJzKG1vdXNlWS0obXNnLT5Nb3VzZVkgLSBndWkud2luZG93LT5Cb3JkZXJUb3ApKT5jaGFyYWN0ZXJIZWlnaHQpKQorCQkgICB7CisJCSAgICAgICBpbnQgdmltX21vZGlmaWVycz0wOworCisJCSAgICAgICBzd2l0Y2ggKG1zZy0+UXVhbGlmaWVyICkKKwkJICAgICAgIHsKKwkJCSAgIGNhc2UgSUVRVUFMSUZJRVJfTEFMVDoKKwkJCSAgIGNhc2UgSUVRVUFMSUZJRVJfUkFMVDoKKwkJCSAgICAgICBEKCJkZXRlY3RlZCBhIEFsdCBrZXkiKTsKKwkJCSAgICAgICB2aW1fbW9kaWZpZXJzfD1NT1VTRV9BTFQ7CisJCQkgICAgICAgYnJlYWs7CisKKwkJCSAgIGNhc2UgSUVRVUFMSUZJRVJfTFNISUZUOgorCQkJICAgY2FzZSBJRVFVQUxJRklFUl9SU0hJRlQ6CisJCQkgICAgICAgRCgiZGV0ZWN0ZWQgYSBTaGlmdCBrZXkiKTsKKwkJCSAgICAgICB2aW1fbW9kaWZpZXJzfD1NT1VTRV9TSElGVDsKKwkJCSAgICAgICBicmVhazsKKwkJCSAgIGNhc2UgSUVRVUFMSUZJRVJfQ09OVFJPTDoKKwkJCSAgICAgICBEKCJkZXRlY3RlZCBhIENvbnRyb2wga2V5Iik7CisJCQkgICAgICAgdmltX21vZGlmaWVycyB8PSBNT1VTRV9DVFJMOworCQkJICAgICAgIGJyZWFrOworCQkgICAgICAgfQorCisJCSAgICAgICBtb3VzZVggPSBtc2ctPk1vdXNlWCAtIGd1aS53aW5kb3ctPkJvcmRlckxlZnQ7CisJCSAgICAgICBtb3VzZVkgPSBtc2ctPk1vdXNlWSAtIGd1aS53aW5kb3ctPkJvcmRlclRvcDsKKwkJICAgICAgIGlmICghZHJhZ2dpbmcpCisJCSAgICAgICB7CisJCQkgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9TRVRQT1MsIG1vdXNlWCwgbW91c2VZLCBGQUxTRSwgdmltX21vZGlmaWVycyk7CisJCQkgICBicmVhazsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UKKwkJICAgICAgIHsKKwkJCSAgIEQoImRyYWdnaW5nXG4iKTsKKwkJCSAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KE1PVVNFX0RSQUcsIG1vdXNlWCwgbW91c2VZLCBGQUxTRSwgdmltX21vZGlmaWVycyk7CisJCSAgICAgICB9CisJCSAgIH0KKwkJICAgcmV0dXJuRXZlbnQgPSBldl9Nb3VzZU1vdmU7CisJCSAgIGJyZWFrOworCSAgICBjYXNlIElEQ01QX1ZBTklMTEFLRVk6CitrcHJpbnRmKCI9PT12YW5pbGxha2V5ICVkXG4iLCBjb2RlKTsKKwkJICAgeworCQkgICAgICAgc3RyaW5nWzBdID0gKGNoYXJfdSljb2RlOworCQkgICAgICAgaWYgKGNvZGUgPT0gQ1NJKQorCQkgICAgICAgeworCQkJICAgLyogSW5zZXJ0IENTSSBhcyBLX0NTSS4gIFVudGVzdGVkISAqLworCQkJICAgc3RyaW5nWzFdID0gS1NfRVhUUkE7CisJCQkgICBzdHJpbmdbMl0gPSAoaW50KUtFX0NTSTsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOCkKKwkJICAgICAgIHsKKwkJCSAgICBzdHJpbmdbMF0gPSBDU0k7CisJCQkgICAgc3RyaW5nWzFdID0gJ2snOworCQkJICAgIHN0cmluZ1syXSA9ICdiJzsKKwkJCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChjb2RlID09IDEyNykKKwkJICAgICAgIHsKKwkJCSAgICBzdHJpbmdbMF0gPSBDU0k7CisJCQkgICAgc3RyaW5nWzFdID0gJ2snOworCQkJICAgIHN0cmluZ1syXSA9ICdEJzsKKwkJCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlCisJCSAgICAgICB7CisJCQkgICBpbnQJbGVuID0gMTsKKworCQkJICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJCQkgICAgICAgbGVuID0gY29udmVydF9pbnB1dChzdHJpbmcsIDEsIHNpemVvZihzdHJpbmcpKTsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCBsZW4pOworCQkgICAgICAgfQorCQkgICAgICAgcmV0dXJuRXZlbnQgPSBldl9LZXlTdHJva2U7CisJCSAgICAgICBicmVhazsKKworCQljYXNlIElEQ01QX1JBV0tFWToKKwkJICAgICAgIGlmIChtc2ctPlF1YWxpZmllciAmIElFUVVBTElGSUVSX0xTSElGVCkKKwkJICAgICAgIHsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKG1zZy0+UXVhbGlmaWVyICYgSUVRVUFMSUZJRVJfUlNISUZUKQorCQkgICAgICAgeworCQkgICAgICAgfQorCQkgICAgICAgZWxzZSBpZiAobXNnLT5RdWFsaWZpZXIgJiBJRVFVQUxJRklFUl9DT05UUk9MKQorCQkgICAgICAgeworCQkJICAgaWYgKGNvZGUgPT0gMzMpCisJCQkgICB7CisJCQkgICAgICAgdHJhc2hfaW5wdXRfYnVmKCk7CisJCQkgICB9CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChtc2ctPkNvZGUgPT0gS0VZVVApCisJCSAgICAgICB7CisJCQkgICBzdHJpbmdbMF0gPSBDU0k7CisJCQkgICBzdHJpbmdbMV0gPSAnayc7CisJCQkgICBzdHJpbmdbMl0gPSAndSc7CisJCQkgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChtc2ctPkNvZGUgPT0gS0VZTEVGVCkKKwkJICAgICAgIHsKKwkJCSAgIHN0cmluZ1swXSA9IENTSTsKKwkJCSAgIHN0cmluZ1sxXSA9ICdrJzsKKwkJCSAgIHN0cmluZ1syXSA9ICdsJzsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKG1zZy0+Q29kZSA9PSBLRVlSSUdIVCkKKwkJICAgICAgIHsKK2twcmludGYoIiMjIGtleXJpZ2h0Iik7CisJCQkgICBzdHJpbmdbMF0gPSBDU0k7CisJCQkgICBzdHJpbmdbMV0gPSAnayc7CisJCQkgICBzdHJpbmdbMl0gPSAncic7CisJCQkgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChtc2ctPkNvZGUgPT0gS0VZRE9XTikKKwkJICAgICAgIHsKKwkJCSAgIHN0cmluZ1swXSA9IENTSTsKKwkJCSAgIHN0cmluZ1sxXSA9ICdrJzsKKwkJCSAgIHN0cmluZ1syXSA9ICdkJzsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKG1zZy0+Q29kZSA9PSBLRVlCQUNLU1BBQ0UpCisJCSAgICAgICB7CisJCQkgICBzdHJpbmdbMF0gPSBDU0k7CisJCQkgICBzdHJpbmdbMV0gPSAnayc7CisJCQkgICBzdHJpbmdbMl0gPSAnYic7CisJCQkgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChtc2ctPkNvZGUgPT0gS0VZREVMRVRFKQorCQkgICAgICAgeworCQkJICAgc3RyaW5nWzBdID0gQ1NJOworCQkJICAgc3RyaW5nWzFdID0gJ2snOworCQkJICAgc3RyaW5nWzJdID0gJ0QnOworCQkJICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcsIDMpOworCQkgICAgICAgfQorCQkgICAgICAgZWxzZSBpZiAobXNnLT5Db2RlID09IEtFWUlOU0VSVCkKKwkJICAgICAgIHsKKwkJCSAgIHN0cmluZ1swXSA9IENTSTsKKwkJCSAgIHN0cmluZ1sxXSA9ICdrJzsKKwkJCSAgIHN0cmluZ1syXSA9ICdJJzsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKG1zZy0+Q29kZSA9PSBLRVlIT01FKQorCQkgICAgICAgeworCQkJICAgc3RyaW5nWzBdID0gQ1NJOworCQkJICAgc3RyaW5nWzFdID0gJ2snOworCQkJICAgc3RyaW5nWzJdID0gJ2gnOworCQkJICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcsIDMpOworCQkgICAgICAgfQorCQkgICAgICAgZWxzZSBpZiAobXNnLT5Db2RlID09IEtFWUVORCkKKwkJICAgICAgIHsKKwkJCSAgIHN0cmluZ1swXSA9IENTSTsKKwkJCSAgIHN0cmluZ1sxXSA9ICdAJzsKKwkJCSAgIHN0cmluZ1syXSA9ICc3JzsKKwkJCSAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJICAgICAgIH0KKwkJICAgICAgIGVsc2UgaWYgKG1zZy0+Q29kZSA9PSBLRVlXSEVFTFVQKQorCQkgICAgICAgeworCQkJICAgaW50IHZpbV9tb2RpZmllcnM9MDsKKworCQkJICAgc3dpdGNoIChtc2ctPlF1YWxpZmllciApCisJCQkgICB7CisJCQkgICAgICAgY2FzZSBJRVFVQUxJRklFUl9MQUxUOgorCQkJICAgICAgIGNhc2UgSUVRVUFMSUZJRVJfUkFMVDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIEFsdCBrZXkiKTsKKwkJCQkgICB2aW1fbW9kaWZpZXJzfD1NT1VTRV9BTFQ7CisJCQkJICAgYnJlYWs7CisKKwkJCSAgICAgICBjYXNlIElFUVVBTElGSUVSX0xTSElGVDoKKwkJCSAgICAgICBjYXNlIElFUVVBTElGSUVSX1JTSElGVDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIFNoaWZ0IGtleSIpOworCQkJCSAgIHZpbV9tb2RpZmllcnN8PU1PVVNFX1NISUZUOworCQkJCSAgIGJyZWFrOworCQkJICAgICAgIGNhc2UgSUVRVUFMSUZJRVJfQ09OVFJPTDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIENvbnRyb2wga2V5Iik7CisJCQkJICAgdmltX21vZGlmaWVycyB8PSBNT1VTRV9DVFJMOworCQkJCSAgIGJyZWFrOworCQkJICAgfQorCQkJICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQoTU9VU0VfNCwgMCwgMSwgRkFMU0UsIHZpbV9tb2RpZmllcnMpOworCisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGlmIChtc2ctPkNvZGUgPT0gS0VZV0hFRUxET1dOKQorCQkgICAgICAgeworCQkJICAgaW50IHZpbV9tb2RpZmllcnM9MDsKKworCQkJICAgc3dpdGNoIChtc2ctPlF1YWxpZmllciApCisJCQkgICB7CisJCQkgICAgICAgY2FzZSBJRVFVQUxJRklFUl9MQUxUOgorCQkJICAgICAgIGNhc2UgSUVRVUFMSUZJRVJfUkFMVDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIEFsdCBrZXkiKTsKKwkJCQkgICB2aW1fbW9kaWZpZXJzfD1NT1VTRV9BTFQ7CisJCQkJICAgYnJlYWs7CisKKwkJCSAgICAgICBjYXNlIElFUVVBTElGSUVSX0xTSElGVDoKKwkJCSAgICAgICBjYXNlIElFUVVBTElGSUVSX1JTSElGVDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIFNoaWZ0IGtleSIpOworCQkJCSAgIHZpbV9tb2RpZmllcnN8PU1PVVNFX1NISUZUOworCQkJCSAgIGJyZWFrOworCQkJICAgICAgIGNhc2UgSUVRVUFMSUZJRVJfQ09OVFJPTDoKKwkJCQkgICBEKCJkZXRlY3RlZCBhIENvbnRyb2wga2V5Iik7CisJCQkJICAgdmltX21vZGlmaWVycyB8PSBNT1VTRV9DVFJMOworCQkJCSAgIGJyZWFrOworCQkJICAgfQorCQkJICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQoTU9VU0VfNSwgMCwgMSwgRkFMU0UsIHZpbV9tb2RpZmllcnMpOworCQkgICAgICAgfQorCisJCSAgICAgICByZXR1cm5FdmVudCA9IGV2X0tleVN0cm9rZTsKKwkJICAgICAgIGJyZWFrOworCQkgICB9CisJICAgIGNhc2UgSURDTVBfTUVOVVZFUklGWToKKwkJICAgcmV0dXJuRXZlbnQgPSBldl9NZW51VmVyaWZ5OworCQkgICAvKiBNZW51IHZlcmlmaWNhdGlvbiByZXF1ZXN0ZWQgKi8KKwkJICAgc3dpdGNoIChjb2RlKQorCQkgICB7CisJCSAgICAgICBjYXNlIE1FTlVXQUlUSU5HOgorCQkJICAgLyoKKwkJCSAgICAqKiBJdCdzIG5vdCBmb3IgdXMsIHRoZSB1c2VyIGlzIGFjY2Vzc2luZyBhbm90aGVyCisJCQkgICAgKiogcHJvZ3JhbXMgbWVudSwgdGhpcyBpcyBhIGdvb2QgdGltZSB0byBkbyBzb21lCisJCQkgICAgKiogY2xlYW51cCBldGMKKwkJCSAgICAqLworCQkJICAgYnJlYWs7CisJCSAgICAgICBjYXNlIE1FTlVIT1Q6CisJCQkgICAvKgorCQkJICAgICoqIEl0IGlzIG91ciBtZW51IHRoYXQgaXMgZ29pbmcgaG90LCB3ZSBoYXZlIGtvbnRyb2wKKwkJCSAgICAqKiBNZW51IGFjdGlvbiBjYW4gYmUgY2FuY2VsbGVkIGJ5CisJCQkgICAgKiogbXNnLT5Db2RlID0gTUVOVUNBTkNFTDsKKwkJCSAgICAqLworCQkJICAgYnJlYWs7CisJCSAgICAgICBkZWZhdWx0OgorCQkJICAgYnJlYWs7CisJCSAgIH0KKwkJICAgYnJlYWs7CisJICAgIGNhc2UgSURDTVBfTUVOVVBJQ0s6CisJCSAgIHJldHVybkV2ZW50ID0gZXZfTWVudVBpY2s7CisJCSAgIHsKKwkJICAgICAgIC8qCisJCQkqKiBvbmUgb2Ygb3VyIG1lbnUncyBoYXZlIGJlZW4gc2VsZWN0ZWQsIGxldCdzIGZpbmQgb3V0IHdoaWNoCisJCQkqLworCQkgICAgICAgdW5pb24gbXlNZW51SXRlbVVuaW9uICppdGVtOworCQkgICAgICAgaW50IG1lbnVOdW1iZXI7CisKKwkJICAgICAgIG1lbnVOdW1iZXIgPSBjb2RlOworCisJCSAgICAgICBpdGVtID0gKHVuaW9uIG15TWVudUl0ZW1VbmlvbiAqKSBJdGVtQWRkcmVzcyhndWkubWVudSwgbWVudU51bWJlcik7CisKKworCQkgICAgICAgaWYgKGl0ZW0pCisJCSAgICAgICB7CisJCQkgICBndWlfbWVudV9jYihpdGVtLT5teU1lbnVJdGVtLmd1aU1lbnUpOworCQkgICAgICAgfQorCQkgICB9CisJCSAgIGJyZWFrOworCSAgICBjYXNlIElEQ01QX0NMT1NFV0lORE9XOgorCQkgICAgcXVpdF9yZXF1ZXN0ID0gVFJVRTsKKwkJICAgIGJyZWFrOworCisJICAgIGNhc2UgSURDTVBfTkVXU0laRToKKwkJICAgeworCQkgICAgICAgaW50IGN4LCBjeTsKKwkJICAgICAgIC8vY3ggPSB3aWR0aFBvaW50VG9DaGFyKGd1aS53aW5kb3ctPkdaWldpZHRoKTsKKwkJICAgICAgIC8vY3kgPSBoZWlnaHRQb2ludFRvQ2hhcihndWkud2luZG93LT5HWlpIZWlnaHQpOworCisJCSAgICAgICBjeCA9IGd1aS53aW5kb3ctPkdaWldpZHRoOworCQkgICAgICAgY3kgPSBndWkud2luZG93LT5HWlpIZWlnaHQgLSBjaGFyYWN0ZXJIZWlnaHQ7CisKKwkJICAgICAgIGd1aV9yZXNpemVfc2hlbGwoY3gsIGN5KTsKKworCQkgICAgICAgcmV0dXJuRXZlbnQgPSBldl9OZXdTaXplOworCQkgICAgICAgYnJlYWs7CisJCSAgIH0KKwkgICAgY2FzZSBJRENNUF9SRUZSRVNIV0lORE9XOgorCQkgICByZWZyZXNoQm9yZGVyKCk7CisJCSAgIHJldHVybkV2ZW50ID0gZXZfUmVmcmVzaFdpbmRvdzsKKwkJICAgYnJlYWs7CisJICAgIGNhc2UgSURDTVBfR0FER0VURE9XTjoKKwkJICAgcmV0dXJuRXZlbnQgPSBldl9HYWRnZXREb3duOworCQkgICBicmVhazsKKwkgICAgY2FzZSBJRENNUF9HQURHRVRVUDoKKwkJICAgcmV0dXJuRXZlbnQgPSBldl9HYWRnZXRVcDsKKwkJICAgYnJlYWs7CisJICAgIGNhc2UgSURDTVBfTUVOVUhFTFA6CisJCSAgIHJldHVybkV2ZW50ID0gZXZfTWVudUhlbHA7CisJCSAgIGJyZWFrOworCSAgICBjYXNlIElEQ01QX0dBREdFVEhFTFA6CisJCSAgIHJldHVybkV2ZW50ID0gZXZfR2FkZ2V0SGVscDsKKwkJICAgYnJlYWs7CisJICAgIGNhc2UgSURDTVBfSU5BQ1RJVkVXSU5ET1c6CisJCSAgIGd1aS5pbl9mb2N1cyA9IEZBTFNFOworCQkgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisJCSAgIGJyZWFrOworCisJICAgIGNhc2UgSURDTVBfQUNUSVZFV0lORE9XOgorCQkgICBndWkuaW5fZm9jdXMgPSBUUlVFOworCQkgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisJCSAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCQkgICBicmVhazsKKwl9CisJUmVwbHlNc2coKHN0cnVjdCBNZXNzYWdlKiltc2cpOworICAgIH0KKworICAgIGlmIChxdWl0X3JlcXVlc3QpCisgICAgeworCWdldG91dCgwKTsgLy8gZ3VpX21jaF9leGl0KDEpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5FdmVudDsKKyAgICAvKiBtb3VzZSBwb3NpdGluIGd1aS53aW5kb3ctPk1vc2VZLCBndWkud2luZG93LT5Nb3VzZVgpICovCit9CisKKyAgICBzdGF0aWMgaW50CitjaGVja0V2ZW50SGFuZGxlcih2b2lkKQoreworICAgIGVudW0gZXZlbnQgaGFwcGVuZWQ7CisKKyAgICBkbworICAgIHsKKwloYXBwZW5lZCA9IEV2ZW50SGFuZGxlcigpIDsKKyAgICB9CisgICAgd2hpbGUgIChoYXBwZW5lZCAhPSBldl9OdWxsRXZlbnQpOworCisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIGludAorY2hhckV2ZW50SGFuZGxlcihpbnQgd3RpbWUpCit7CisgICAgZW51bSBldmVudCBoYXBwZW5lZDsKKyAgICBpbnQgcmM7CisKKyAgICBkbworICAgIHsKKwlXYWl0KDE8PGd1aS53aW5kb3ctPlVzZXJQb3J0LT5tcF9TaWdCaXQpOworCisJaGFwcGVuZWQgPSBFdmVudEhhbmRsZXIoKSA7CisgICAgfQorICAgIHdoaWxlICgoaGFwcGVuZWQgIT0gZXZfSW50dWlUaWNrcykgJiYgKGhhcHBlbmVkICE9IGV2X0tleVN0cm9rZSkgJiYgKGhhcHBlbmVkICE9IGV2X01lbnVQaWNrKSAmJiAoaGFwcGVuZWQgIT0gZXZfTW91c2VNb3ZlKSAmJihoYXBwZW5lZCAhPSBldl9Nb3VzZUJ1dHRvbnMpICk7CisKKyAgICBpZiAoaGFwcGVuZWQgPT0gZXZfS2V5U3Ryb2tlIHx8IGhhcHBlbmVkID09IGV2X01lbnVQaWNrKQorCXJjID0gT0s7CisgICAgZWxzZQorCXJjID0gRkFJTDsKKworICAgIHJldHVybiByYzsKK30KKworCisvKgorICogYWRkIHByaW1hcnkgbWVudQorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudV9pdGVtKHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkKK3sKKyAgICB1bmlvbiBteU1lbnVJdGVtVW5pb24gKm1lbnVJdGVtVW5pb24gPSBOVUxMOworICAgIHN0cnVjdCBJbnR1aVRleHQgKm1lbnV0ZXh0ID0gTlVMTDsKKyAgICB2aW1tZW51X1QgKnBhcmVudDsKKworICAgIGFzc2VydChtZW51ICE9IE5VTEwpOworICAgIGFzc2VydChtZW51LT5wYXJlbnQgIT0gTlVMTCk7CisgICAgcGFyZW50ID0gbWVudS0+cGFyZW50OworCisgICAgLyogRG9uJ3QgYWRkIG1lbnUgc2VwYXJhdG9yICovCisgICAgaWYgKG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpKQorCXJldHVybjsKKworICAgIGlmIChwYXJlbnQtPm1lbnVJdGVtUHRyID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyogVE9ETzogdXNlIG1lbnUtPm1uZW1vbmljIGFuZCBtZW51LT5hY3RleHQgKi8KKyAgICBtZW51dGV4dCA9IChzdHJ1Y3QgSW50dWlUZXh0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IEludHVpVGV4dCkpOworCisgICAgU2V0QXR0cmliKG1lbnV0ZXh0LCBGcm9udFBlbiwgMyk7CisgICAgU2V0QXR0cmliKG1lbnV0ZXh0LCBCYWNrUGVuLCAxKTsKKyAgICBTZXRBdHRyaWIobWVudXRleHQsIERyYXdNb2RlLCBDT01QTEVNRU5UKTsKKyAgICBTZXRBdHRyaWIobWVudXRleHQsIExlZnRFZGdlLCAwKTsKKyAgICBTZXRBdHRyaWIobWVudXRleHQsIFRvcEVkZ2UsIDApOworICAgIFNldEF0dHJpYihtZW51dGV4dCwgSVRleHRGb250LCBOVUxMKTsKKyAgICBTZXRBdHRyaWIobWVudXRleHQsIE5leHRUZXh0LCBOVUxMKTsKKworICAgIG1lbnVJdGVtVW5pb24gPSBtYWxsb2Moc2l6ZW9mKCptZW51SXRlbVVuaW9uKSk7CisKKyAgICBTZXRBdHRyaWIoJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtLCBOZXh0SXRlbSwgcGFyZW50LT5tZW51SXRlbVB0cik7CisgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgTGVmdEVkZ2UsIDApOworICAgIFNldEF0dHJpYigmbWVudUl0ZW1Vbmlvbi0+bWVudUl0ZW0sIFdpZHRoLCBjaGFyYWN0ZXJXaWR0aCpzdHJsZW4obWVudS0+ZG5hbWUpKTsKKyAgICBTZXRBdHRyaWIoJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtLCBIZWlnaHQsIGNoYXJhY3RlckhlaWdodCsyKTsKKyAgICBTZXRBdHRyaWIoJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtLCBGbGFncywgSVRFTVRFWFQrSVRFTUVOQUJMRUQrSElHSENPTVApOworICAgIFNldEF0dHJpYigmbWVudUl0ZW1Vbmlvbi0+bWVudUl0ZW0sIE11dHVhbEV4Y2x1ZGUsIDApOworICAgIFNldEF0dHJpYigmbWVudUl0ZW1Vbmlvbi0+bWVudUl0ZW0sIEl0ZW1GaWxsLCAoQVBUUiltZW51dGV4dCk7CisgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgU2VsZWN0RmlsbCwgTlVMTCk7CisgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgQ29tbWFuZCwgTlVMTCk7CisgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgU3ViSXRlbSwgTlVMTCk7CisgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgTmV4dFNlbGVjdCwgTUVOVU5VTEwpOworCisgICAgbWVudXRleHQtPklUZXh0ID0gbWFsbG9jKHN0cmxlbihtZW51LT5kbmFtZSkgKyAxKTsKKworICAgIHN0cmNweShtZW51dGV4dC0+SVRleHQsIG1lbnUtPmRuYW1lKTsKKworICAgIG1lbnVJdGVtVW5pb24tPm1lbnVJdGVtLk5leHRJdGVtID0gTlVMTDsKKworCisgICAgaWYgKHBhcmVudCkKKyAgICB7CisJaWYgKCFwYXJlbnQtPm1lbnVJdGVtUHRyKQorCXsKKwkgICAgRCgiQWRkaW5nIGZpcnN0IHN1YkVsZW1lbnQiKTsKKwkgICAgU2V0QXR0cmliKCZtZW51SXRlbVVuaW9uLT5tZW51SXRlbSwgVG9wRWRnZSwgMCk7CisJICAgIHBhcmVudC0+bWVudVB0ci0+Rmlyc3RJdGVtID0gJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtOworCSAgICBwYXJlbnQtPm1lbnVJdGVtUHRyID0gJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtOworCX0KKwllbHNlCisJeworCSAgICBzdHJ1Y3QgTWVudUl0ZW0gKnRtcE1lbnVJdGVtOworCSAgICB0bXBNZW51SXRlbSA9IHBhcmVudC0+bWVudUl0ZW1QdHI7CisJICAgIHdoaWxlICh0bXBNZW51SXRlbS0+TmV4dEl0ZW0pCisJICAgIHsKKwkJdG1wTWVudUl0ZW0gPSB0bXBNZW51SXRlbS0+TmV4dEl0ZW07CisJICAgIH0KKwkgICAgdG1wTWVudUl0ZW0tPk5leHRJdGVtID0gJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtOworCSAgICBTZXRBdHRyaWIoJm1lbnVJdGVtVW5pb24tPm1lbnVJdGVtLCBUb3BFZGdlLCB0bXBNZW51SXRlbS0+VG9wRWRnZSt0bXBNZW51SXRlbS0+SGVpZ2h0KTsKKwl9CisgICAgfQorICAgIG1lbnUtPm1lbnVQdHI9IE5VTEw7CisgICAgbWVudS0+bWVudUl0ZW1QdHIgPSAmbWVudUl0ZW1Vbmlvbi0+bWVudUl0ZW07CisgICAgbWVudUl0ZW1Vbmlvbi0+bXlNZW51SXRlbS5ndWlNZW51ID0gbWVudTsKK30KKworCisgICAgc3RhdGljIHN0cnVjdCBNZW51ICoKK2dldE1lbnUoc3RydWN0IFJhc3RQb3J0ICpyYXN0LCBpbnQgbGVmdCwgU1RSUFRSIG5hbWUpCit7CisgICAgc3RydWN0IE1lbnUgKm1lbnU7CisgICAgc3RydWN0IFRleHRFeHRlbnQgdGV4dEV4dDsKKworICAgIG1lbnUgPSBtYWxsb2Moc2l6ZW9mKCptZW51KSk7CisgICAgbWVudS0+TmV4dE1lbnUgPSBOVUxMOworICAgIG1lbnUtPkxlZnRFZGdlID0gbGVmdDsKKworICAgIFRleHRFeHRlbnQocmFzdCwgbmFtZSwgc3RybGVuKG5hbWUpLCAmdGV4dEV4dCk7CisKKyAgICBtZW51LT5Ub3BFZGdlID0gMDsKKyAgICBtZW51LT5XaWR0aCA9IHRleHRFeHQudGVfV2lkdGg7CisgICAgbWVudS0+SGVpZ2h0ID0gdGV4dEV4dC50ZV9IZWlnaHQ7CisgICAgbWVudS0+RmxhZ3MgPSBJVEVNVEVYVCtISUdIQ09NUCtNRU5VRU5BQkxFRDsKKyAgICBtZW51LT5NZW51TmFtZSA9IG5hbWU7CisgICAgbWVudS0+Rmlyc3RJdGVtID0gTlVMTDsKKworICAgIHJldHVybiBtZW51OworfQorCisvKgorICogYWRkICAxc3QgbGV2ZWwgc3VibWVudSBpdGVtCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51KHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkKK3sKKyAgICBzdHJ1Y3QgTWVudQkqbmV3TWVudTsKKyAgICBpbnQJCXBvcyA9IDA7CisKKyAgICBpZiAoIW1lbnVfaXNfbWVudWJhcihtZW51LT5uYW1lKSkKKwlyZXR1cm47CisKKyAgICBtZW51LT5tZW51UHRyID0gbmV3TWVudSA9IGdldE1lbnUoZ3VpLndpbmRvdy0+UlBvcnQsIDAsIG1lbnUtPmRuYW1lKTsKKyAgICBtZW51LT5tZW51SXRlbVB0ciA9IE5VTEw7CisgICAgbmV3TWVudS0+TmV4dE1lbnUgPSBOVUxMOworCisgICAgaWYgKCFndWkubWVudSkKKyAgICB7CisJRCgiQWRkaW5nIGhlYWQgbWVudSIpOworCWd1aS5tZW51ID0gbmV3TWVudSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RydWN0IE1lbnUgKnRtcE1lbnU7CisKKwl0bXBNZW51ID0gZ3VpLm1lbnU7CisJd2hpbGUgKHRtcE1lbnUtPk5leHRNZW51KQorCSAgICB0bXBNZW51ID0gdG1wTWVudS0+TmV4dE1lbnU7CisJdG1wTWVudS0+TmV4dE1lbnUgPSBuZXdNZW51OworCXBvcyA9IHRtcE1lbnUtPkxlZnRFZGdlICsKKwkgICAgVGV4dExlbmd0aChndWkud2luZG93LT5SUG9ydCwgdG1wTWVudS0+TWVudU5hbWUsCisJCSAgICBzdHJsZW4odG1wTWVudS0+TWVudU5hbWUpKTsKKwluZXdNZW51LT5MZWZ0RWRnZSA9IHBvczsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3RvZ2dsZV90ZWFyb2ZmcyhlbmFibGUpCisgICAgaW50CQllbmFibGU7Cit7CisgICAgLyogbm8gdGVhcm9mZiBtZW51cyAqLworfQorCisgICAgaW50CitndWlfbWNoX3NldF9ibGlua2luZyhsb25nIHdhaXQsIGxvbmcgb24sIGxvbmcgb2ZmKQoreworICAgIGN1cnNvci53YWl0VGltZSA9IHdhaXQvMTAwOworICAgIGN1cnNvci5vblRpbWUgPSBvbi8xMDA7CisgICAgY3Vyc29yLm9mZlRpbWUgPSBvZmYvMTAwOworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfcHJlcGFyZShpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEQoImd1aV9tY2hfcHJlcGFyZSIpOworCisgICAgZXhlY0Jhc2UgPSAoc3RydWN0IEV4ZWNCYXNlICopT3BlbkxpYnJhcnkoImV4ZWMubGlicmFyeSIsIE5VTEwpOworICAgIGdmeEJhc2UgPSAoc3RydWN0IEdGWEJhc2UgKilPcGVuTGlicmFyeSgiZ3JhcGhpY3MubGlicmFyeSIsIE5VTEwpOworICAgIGxheWVyc0Jhc2UgPSAoc3RydWN0IExheWVyc0Jhc2UgKilPcGVuTGlicmFyeSgibGF5ZXJzLmxpYnJhcnkiLCBOVUxMKTsKKworICAgIGlmICghZXhlY0Jhc2UpCisgICAgeworCUQoIkNhbm5vdCBvcGVuIGV4ZWMubGlicmFyeSwgYWJvcnRpbmciKTsKKyAgICB9CisgICAgaWYgKCFnZnhCYXNlKQorICAgIHsKKwlEKCJDYW5ub3Qgb3BlbiBncmFwaGljcy5saWJyYXJ5LCBhYm9ydGluZyIpOworICAgIH0KKyAgICBpZiAoIWxheWVyc0Jhc2UpCisgICAgeworCUQoIkNhbm5vdCBvcGVuIGdyYXBoaWNzLmxpYnJhcnksIGFib3J0aW5nIik7CisgICAgfQorICAgIEQoImd1aV9tY2hfcHJlcGFyZSBkb25lICIpOworfQorCisgICAgdm9pZAorYXRleGl0RG9UaGlzKHZvaWQpCit7CitrcHJpbnRmKCJhdGV4aXRkb3RoaXMjIyNcbiIpOworICAgIGd1aV9tY2hfZXhpdCgtMSk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgR1VJIGNhbiBiZSBzdGFydGVkLiAgQ2FsbGVkIGJlZm9yZSBndmltcmMgaXMgc291cmNlZC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50CitndWlfbWNoX2luaXRfY2hlY2sodm9pZCkKK3sKKyAgICBpZiAoZXhlY0Jhc2UgJiYgZ2Z4QmFzZSAmJiBsYXllcnNCYXNlKQorCXJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIGludAorZ3VpX21jaF9pbml0KHZvaWQpCit7CisgICAgaW50IHJldHVybkNvZGUgPSBGQUlMOyAvKiBhc3N1bWUgZmFpbHVyZSovCisKKyAgICBUaW1lck1QID0gQ3JlYXRlTXNnUG9ydCgpOworICAgIGlmICghVGltZXJNUCkgcmV0dXJuIEZBSUw7CisKKyAgICBUaW1lcklPID0gKHN0cnVjdCB0aW1lcmVxdWVzdCAqKUNyZWF0ZUlPUmVxdWVzdChUaW1lck1QLCBzaXplb2YoKlRpbWVySU8pKTsKKyAgICBpZiAoIVRpbWVySU8pIHJldHVybiBGQUlMOworCisgICAgaWYgKE9wZW5EZXZpY2UoInRpbWVyLmRldmljZSIsIFVOSVRfVkJMQU5LLCAmVGltZXJJTy0+dHJfbm9kZSwgMCkpIHJldHVybiBGQUlMOworCisgICAgZ3VpLndpbmRvdyA9IE9wZW5XaW5kb3dUYWdMaXN0KCZ2aW1OZXdXaW5kb3csIHRhZ3MpOworICAgIGlmIChndWkud2luZG93KQorICAgIHsKKwlndWkuaW5fdXNlID0gVFJVRTsKKwlndWkuaW5fZm9jdXM9VFJVRTsKKwlndWkubm9ybV9waXhlbCA9IGd1aS5kZWZfbm9ybV9waXhlbCA9IDE7CisJZ3VpLmJhY2tfcGl4ZWwgPSBndWkuZGVmX2JhY2tfcGl4ZWwgPSAwOworCisJc2V0X25vcm1hbF9jb2xvcnMoKTsKKwlndWlfY2hlY2tfY29sb3JzKCk7CisKKwlTZXREck1kKGd1aS53aW5kb3ctPlJQb3J0LCBKQU0yKTsKKwlndWlfbWNoX3NldF9jb2xvcnMoZ3VpLm5vcm1fcGl4ZWwsIGd1aS5iYWNrX3BpeGVsKTsKKworCWF0ZXhpdChhdGV4aXREb1RoaXMpOworCisJVGV4dERpbWVuc2lvbnMoKTsKKwlyZXR1cm5Db2RlID0gT0s7IC8qIHdlJ3ZlIGhhZCBzdWNjZXNzICovCisJaWYgKGd1aV93aW5feCAhPSAtMSAmJiBndWlfd2luX3kgIT0gLTEpCisJICAgIGd1aV9tY2hfc2V0X3dpbnBvcyhndWlfd2luX3gsIGd1aV93aW5feSk7CisKKwlndWlfbWNoX2NsZWFyX2FsbCgpOworCisgICAgfQorICAgIGd1aS5tZW51ID0gTlVMTDsKKworICAgIHJldHVybiByZXR1cm5Db2RlOworfQorCisgICAgdm9pZAorZ3VpX21jaF9uZXdfY29sb3JzKHZvaWQpCit7CitrcHJpbnRmKCIjIyMgZ3VpX21jaF9uZXdfY29sb3JzXG4iKTsKKyAgICBTZXRBUGVuKGd1aS53aW5kb3ctPlJQb3J0LCBnZXRyZWFsY29sb3IoZ3VpLm5vcm1fcGl4ZWwpKTsKKyAgICBTZXRCUGVuKGd1aS53aW5kb3ctPlJQb3J0LCBnZXRyZWFsY29sb3IoZ3VpLmJhY2tfcGl4ZWwpKTsKKworICAgIEQoImd1aV9tY2hfbmV3X2NvbG9ycyIpOworfQorCisgICAgaW50CitndWlfbWNoX29wZW4odm9pZCkKK3sKKyAgICBEKCJndWlfbWNoX29wZW4iKTsKKworICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZXhpdChpbnQgcmV0dXJuQ29kZSkKK3sKK2twcmludGYoIiMjI2d1aV9tY2hfZXhpdFxuIik7CisgICAgRCgiKioqKmd1aV9tY2hfZXhpdCIpOworCisgICAgaWYgKFRpbWVyU2VudCkKKyAgICB7CisJaWYgKCFDaGVja0lPKCZUaW1lcklPLT50cl9ub2RlKSkgQWJvcnRJTygmVGltZXJJTy0+dHJfbm9kZSk7CisJV2FpdElPKCZUaW1lcklPLT50cl9ub2RlKTsKKwlUaW1lclNlbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoVGltZXJJTykKKyAgICB7CisJQ2xvc2VEZXZpY2UoJlRpbWVySU8tPnRyX25vZGUpOworCURlbGV0ZUlPUmVxdWVzdCgmVGltZXJJTy0+dHJfbm9kZSk7CisJVGltZXJJTyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKFRpbWVyTVApCisgICAgeworCURlbGV0ZU1zZ1BvcnQoVGltZXJNUCk7CisJVGltZXJNUCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGd1aS53aW5kb3cpCisgICAgeworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKE15Q29sb3JUYWJsZSkgLyBzaXplb2YoTXlDb2xvclRhYmxlWzBdKTsgaSsrKQorCXsKKwkgICAgaWYgKE15Q29sb3JUYWJsZVtpXS5hbGxvY2VkKQorCSAgICB7CisJCVJlbGVhc2VQZW4oZ3VpLndpbmRvdy0+V1NjcmVlbi0+Vmlld1BvcnQuQ29sb3JNYXAsIE15Q29sb3JUYWJsZVtpXS5wZW4pOworCQlNeUNvbG9yVGFibGVbaV0uYWxsb2NlZCA9IEZBTFNFOworCSAgICB9CisJfQorCisJRCgiQ2xvc2Vpbmcgd2luZG93ICIpOworCUNsb3NlV2luZG93KGd1aS53aW5kb3cpOworCUNsb3NlTGlicmFyeSgoc3RydWN0IExpYnJhcnkqKWV4ZWNCYXNlKTsKKwlDbG9zZUxpYnJhcnkoKHN0cnVjdCBMaWJyYXJ5KilnZnhCYXNlKTsKKwlndWkud2luZG93ID0gTlVMTDsKKwlndWkuaW5fdXNlID0gRkFMU0U7CisJLy9nZXRvdXQoMSk7CisgICAgfQorfQorCisvKgorICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X3dpbnBvcyhpbnQgKngsIGludCAqeSkKK3sKKyAgICBpZiAoZ3VpLndpbmRvdykKKyAgICB7CisJKnggPSBndWkud2luZG93LT5MZWZ0RWRnZTsKKwkqeSA9IGd1aS53aW5kb3ctPlRvcEVkZ2U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuCisgKiBjb29yZGluYXRlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCit7CisgICAgaWYgKGd1aS53aW5kb3cpCisgICAgeworCUNoYW5nZVdpbmRvd0JveChndWkud2luZG93LCB4LCB5LCBndWkud2luZG93LT5XaWR0aCwgZ3VpLndpbmRvdy0+SGVpZ2h0KTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zaGVsbHNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCWludCBtaW5fd2lkdGgsIGludCBtaW5faGVpZ2h0LCBpbnQgYmFzZV93aWR0aCwgaW50IGJhc2VfaGVpZ2h0KQoreworICAgIEQoImd1aV9tY2hfc2V0X3NoZWxsc2l6ZSIpOworCisgICAgQ2hhbmdlV2luZG93Qm94KGd1aS53aW5kb3csIGd1aS53aW5kb3ctPkxlZnRFZGdlLAorCSAgICBndWkud2luZG93LT5Ub3BFZGdlLCB3aWR0aENoYXJUb1BvaW50KHdpZHRoKSArIGd1aS53aW5kb3ctPkJvcmRlckxlZnQgKyBndWkud2luZG93LT5Cb3JkZXJSaWdodCwKKwkgICAgaGVpZ2h0Q2hhclRvUG9pbnQoaGVpZ2h0KSArIGd1aS53aW5kb3ctPkJvcmRlclRvcCArIGd1aS53aW5kb3ctPkJvcmRlckJvdHRvbSk7CisgICAgY2hlY2tFdmVudEhhbmRsZXIoKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKGludCAqc2NyZWVuX3csIGludCAqc2NyZWVuX2gpCit7CisvLyAgICAqc2NyZWVuX3cgPSB3aWR0aFBvaW50VG9DaGFyKGd1aS53aW5kb3ctPkdaWldpZHRoKTsKKy8vICAgICpzY3JlZW5faCA9IGhlaWdodFBvaW50VG9DaGFyKGd1aS53aW5kb3ctPkdaWkhlaWdodCk7CisgICAgKnNjcmVlbl93ID0gZ3VpLndpbmRvdy0+R1paV2lkdGg7CisgICAgKnNjcmVlbl9oID0gZ3VpLndpbmRvdy0+R1paSGVpZ2h0IC0gY2hhcmFjdGVySGVpZ2h0OworCisKK2twcmludGYoIj09PSBnZXRfc2NyZWVuX2RpbWVuc2lvbnM6IHNjcmVlbiAlZCwlZCBjaGFyYWN0ZXIgJWQsJWQgIGNvbnNvbGUgJWQsJWRcbiIsCitndWkud2luZG93LT5HWlpXaWR0aCwKK2d1aS53aW5kb3ctPkdaWkhlaWdodCwKK2NoYXJhY3RlcldpZHRoLAorY2hhcmFjdGVySGVpZ2h0LAorKnNjcmVlbl93LAorKnNjcmVlbl9oKTsKKworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBEKCJndWlfbWNoX3NldF90ZXh0X2FyZWFfcG9zIik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykKK3sKKyAgICAvKiBkb25lIGJ5IGRlZmF1bHQgKi8KKyAgICAvKiBUT0RPOiBkaXNhYmxlIHNjcm9sbGJhciB3aGVuIGl0J3MgdG9vIHNtYWxsICovCit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoc2Nyb2xsYmFyX1QgKnNiLCBsb25nIHZhbCwgbG9uZyBzaXplLCBsb25nIG1heCkKK3sKKyAgICBVTE9ORyB0b3RhbCA9IG1heDsKKyAgICBVTE9ORyB2aXNpYmxlID0gc2l6ZTsKKyAgICBVTE9ORyB0b3AgPSB2YWw7CisgICAgVUxPTkcgaGlkZGVuOworICAgIFVMT05HIG92ZXJsYXAgPSAwOworICAgIFVXT1JEIGJvZHksIHBvdDsKKwora3ByaW50ZigiX19zZXRfc2Nyb2xsYmFyX3RodW1iIHZhbCAlZCAgc2l6ZSAlZCAgbWF4ICVkXG4iLCB2YWwsIHNpemUsIG1heCk7CisKKyAgICBpZiAodG90YWwgPiB2aXNpYmxlKQorCWhpZGRlbiA9IHRvdGFsIC0gdmlzaWJsZTsKKyAgICBlbHNlCisJaGlkZGVuID0gMDsKKworICAgIGlmICh0b3AgPiBoaWRkZW4pCisJdG9wID0gaGlkZGVuOworCisgICAgYm9keSA9IChoaWRkZW4gPiAwKSA/CisJICAgIChVV09SRCkoKChVTE9ORykodmlzaWJsZSAtIG92ZXJsYXApICogTUFYQk9EWSkgLyAodG90YWwgLSBvdmVybGFwKSkgOgorCSAgICBNQVhCT0RZOworCisgICAgcG90ICA9IChoaWRkZW4gPiAwKSA/IChVV09SRCkoKChVTE9ORykgdG9wICogTUFYUE9UKSAvIGhpZGRlbikgOiAwOworCitrcHJpbnRmKCJfX3BvdCAleCAgYm9keSAleFxuIiwgcG90LCBib2R5KTsKKworICAgIE5ld01vZGlmeVByb3AoJnByb3BHYWRnZXQsIGd1aS53aW5kb3csIE5VTEwsCisJCSAgR2FkZ2V0MlNJbmZvLkZsYWdzLAorCQkgIE1BWFBPVCwgcG90LAorCQkgIE1BWEJPRFksIGJvZHksCisJCSAgMSk7CisgICAgcmV0dXJuOworCit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgRCgiZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyIpOworICAgIC8qTmV3TW9kaWZ5UHJvcCgmcHJvcEdhZGdldCwgZ3VpLndpbmRvdywgTlVMTCwgTUFYUE9ULCBNQVhQT1Qvc2ItPm1heCp5LCBNQVhQT1QsIE1BWEJPRFkvc2ItPm1heC9zYi0+c2l6ZSwgMSk7Ki8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfY3JlYXRlX3Njcm9sbGJhcihzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpCit7CisgICAgLyogdGhpcyBpcyBkb25lIGJ5IGRlZmF1bHQgKi8KK30KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK2d1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIoc2Nyb2xsYmFyX1QgKnNiKQoreworICAgIC8qIHRoaXMgaXMgZG9uZSBieSBkZWZhdWx0ICovCit9CisjZW5kaWYKKworaW50IGd1aV9tY2hfaW5pdF9mb250KGNoYXJfdSAqZm9udF9uYW1lLCBpbnQgZm9udHNldCkKK3sKKyAgICAvKkQoImd1aV9tY2hfaW5pdF9mb250Iik7Ki8KKworICAgIGd1aS5jaGFyX3dpZHRoID0gY2hhcmFjdGVyV2lkdGg7CisgICAgZ3VpLmNoYXJfaGVpZ2h0ID0gY2hhcmFjdGVySGVpZ2h0OworICAgIGd1aS5jaGFyX2FzY2VudCA9IGd1aS53aW5kb3ctPlJQb3J0LT5UeEJhc2VsaW5lOworCisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CitndWlfbWNoX2FkanVzdF9jaGFyc2l6ZSgpCit7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyAgICBHdWlGb250CitndWlfbWNoX2dldF9mb250KCBjaGFyX3UgKm5hbWUsIGludCBnaXZlRXJyb3JJZk1pc3NpbmcpCit7CisgICAgLypEKCJndWlfbWNoX2dldF9mb250Iik7Ki8KKyAgICByZXR1cm4gTlVMTDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIC8qRCgiZ3VpX21jaF9zZXRfZm9udCIpOyovCit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisgICAgaW50CitndWlfbWNoX3NhbWVfZm9udChHdWlGb250IGYxLCBHdWlGb250IGYyKQoreworICAgIEQoImd1aV9tY2hfc2FtZV9mb250Iik7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfZnJlZV9mb250KEd1aUZvbnQgZm9udCkKK3sKKyAgICBpZiAoZm9udCkKKwlEKCJndWlfbWNoX2ZyZWVfZm9udCIpOworfQorCisjZGVmaW5lIFJHQihhLCBiLCBjKSAoKGEgJiYgMHhmZikgKiAweDEwMDAwICsgKGIgKiAweGZmKSAqIDB4MTAwICsgKGMgJiAweGZmKSkKKworLyoKKyAqIEdldCBjb2xvciBoYW5kbGUgZm9yIGNvbG9yICJuYW1lIi4KKyAqIFJldHVybiBJTlZBTENPTE9SIHdoZW4gbm90IHBvc3NpYmxlLgorICovCisKKyAgICB0eXBlZGVmIHN0cnVjdCBndWljb2xvcl90VGFibGUKKyAgICB7CisJY2hhcgkgICAgKm5hbWU7CisJdW5zaWduZWQgbG9uZyAgICBjb2xvcjsKKwlVQllURQkJcmVkOworCVVCWVRFCQlncmVlbjsKKwlVQllURQkJYmx1ZTsKKyAgICB9IGd1aWNvbG9yX3RUYWJsZTsKKworICAgIHN0YXRpYyBndWljb2xvcl90VGFibGUgdGFibGVbXSA9CisgICAgeworCXsiR3JleSIsCTAsIDE5MCwxOTAsMTkwfSwKKwl7IkJsYWNrIiwJMSwgMCwgMCwgMH0sCisJeyJEYXJrQmx1ZSIsCTIsIDAsIDAsIDEzOX0sCisJeyJEYXJrR3JlZW4iLAkzLCAwLCAxMDAsIDB9LAorCXsiRGFya0N5YW4iLAk0LCAwLCAxMzksIDEzOX0sCisJeyJEYXJrUmVkIiwJNSwgMTM5LCAwLCAwfSwKKwl7IkRhcmtNYWdlbnRhIiwJNiwgMTM5LCAwLCAxMzl9LAorCXsiQnJvd24iLAk3LCAxNjUsIDQyLCA0Mn0sCisJeyJHcmF5IiwJOCwgMTkwLCAxOTAsIDE5MH0sCisJeyJHcmV5IiwJOSwgMTkwLCAxOTAsIDE5MH0sCisJeyJMaWdodEdyYXkiLAkxMCwgMjExLCAyMTEsIDIxMX0sCisJeyJMaWdodEdyZXkiLAkxMSwgMjExLCAyMTEsIDIxMX0sCisJeyJEYXJrR3JheSIsCTEyLCAxNjksIDE2OSwgMTY5fSwKKwl7IkRhcmtHcmV5IiwJMTMsIDE2OSwgMTY5LCAxNjl9LAorCXsiQmx1ZSIsCTE0LCAwLCAwLCAyNTV9LAorCXsiTGlnaHRCbHVlIiwJMTUsIDE3MywgMjE2LCAyMzB9LAorCXsiR3JlZW4iLAkxNiwgMCwgMjU1LCAwfSwKKwl7IkxpZ2h0R3JlZW4iLAkxNywgMTQ0LCAyMzgsIDE0NH0sCisJeyJDeWFuIiwJMTgsIDAsIDI1NSwgMjU1fSwKKwl7IkxpZ2h0Q3lhbiIsCTE5LCAyMjQsIDI1NSwgMjU1fSwKKwl7IlJlZCIsCQkyMCwgMjU1LCAwLCAwfSwKKwl7IkxpZ2h0UmVkIiwJMjEsIDI1NSwgMCwgMH0sIC8qPyovCisJeyJNYWdlbnRhIiwJMjIsIDI1NSwgMCwgMjU1fSwKKwl7IkxpZ2h0TWFnZW50YSIsMjMsIDI1NSwgMCwgMjU1fSwgLyo/Ki8KKwl7IlllbGxvdyIsCTI0LCAyNTUsIDI1NSwgMH0sCisJeyJMaWdodFllbGxvdyIsCTI1LCAyNTUsIDI1NSwgMjI0fSwJLyogVE9ETzogYWRkIERhcmtZZWxsb3cgKi8KKwl7IldoaXRlIiwJMjYsIDI1NSwgMjU1LCAyNTV9LAorCXsiU2VhR3JlZW4iLAkyNywgNDYsIDEzOSwgODd9LAorCXsiT3JhbmdlIiwJMjgsIDI1NSwgMTY1LCAwfSwKKwl7IlB1cnBsZSIsCTMwLCAxNjAsIDMyLCAyNDB9LAorCXsiU2xhdGVCbHVlIiwJMzEsIDEwNiwgOTAsIDIwNX0sCisJeyJncmV5OTAiLAkzMiwgMjI5LCAyMjksIDIyOX0sCisJeyJncmV5OTUiLAkzMywgMjQyLCAyNDIsIDI0Mn0sCisJeyJncmV5ODAiLAkzNCwgMjA0LCAyMDQsIDIwNH0sCisJe05VTEwsIE5VTEx9LAorICAgIH07CisKKyAgICBndWljb2xvcl9UCitndWlfbWNoX2dldF9jb2xvcihjaGFyX3UgKm5hbWUpCit7CisKKyAgICBndWljb2xvcl9UIGNvbG9yID0gSU5WQUxDT0xPUjsKKworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgdGFibGVbaV0ubmFtZSAhPSBOVUxMO2krKykKKyAgICB7CisJaWYgKHN0cmljbXAobmFtZSwgdGFibGVbaV0ubmFtZSkgPT0gMCkKKwl7CisJICAgIC8vY29sb3IgPSB0YWJsZVtpXS5jb2xvcjsKKwkgICAgY29sb3IgPSBpOworCX0KKyAgICB9CisKKyNpZiAwCisgICAgaWYgKGNvbG9yID09IElOVkFMQ09MT1IpCisgICAgeworCWNoYXIgKmxvb2t5ID0gTlVMTDsKKworCWNvbG9yID0gc3RydG9sKChjaGFyKiluYW1lLCAmbG9va3ksIDEwKTsKKwlpZiAoKmxvb2t5ICE9IE5VTCkKKwkgICAgY29sb3IgPSBJTlZBTENPTE9SOworICAgIH0KKyNlbmRpZgorCisgICAga3ByaW50ZigiZ3VpX21jaF9nZXRfY29sb3JbJXNdID0gJXNcbiIsIG5hbWUsIHRhYmxlW2NvbG9yXS5uYW1lKTsKKworICAgIHJldHVybiBjb2xvcjsKK30KKworc3RhdGljIFVCWVRFIGdldHJlYWxjb2xvcihndWljb2xvcl9UIGkpCit7CisgICAgaWYgKCFNeUNvbG9yVGFibGVbaV0uYWxsb2NlZCkKKyAgICB7CisJTXlDb2xvclRhYmxlW2ldLnBlbiA9IE9idGFpbkJlc3RQZW4oZ3VpLndpbmRvdy0+V1NjcmVlbi0+Vmlld1BvcnQuQ29sb3JNYXAsCisJCQkJCSAgICB0YWJsZVtpXS5yZWQgKiAweDAxMDEwMTAxLAorCQkJCQkgICAgdGFibGVbaV0uZ3JlZW4gKiAweDAxMDEwMTAxLAorCQkJCQkgICAgdGFibGVbaV0uYmx1ZSAqIDB4MDEwMTAxMDEsCisJCQkJCSAgICBPQlBfRmFpbElmQmFkLCBGQUxTRSwKKwkJCQkJICAgIE9CUF9QcmVjaXNpb24sIFBSRUNJU0lPTl9HVUksCisJCQkJCSAgICBUQUdfRE9ORSk7CisJaWYgKE15Q29sb3JUYWJsZVtpXS5wZW4gIT0gLTEpCisJeworCSAgICBNeUNvbG9yVGFibGVbaV0uYWxsb2NlZCA9IFRSVUU7CisJfQorICAgIH0KKworICAgIHJldHVybiBNeUNvbG9yVGFibGVbaV0ucGVuOworfQorCisKKyAgICB2b2lkCitndWlfbWNoX3NldF9jb2xvcnMoZ3VpY29sb3JfVCBmZywgZ3VpY29sb3JfVCBiZykKK3sKKyNpZiAwCisgICAgaWYgKGZnID09IDApCisgICAgeworCWZnID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBTZXRBQlBlbkRyTWQoZ3VpLndpbmRvdy0+UlBvcnQsIGdldHJlYWxjb2xvcihmZyksIGdldHJlYWxjb2xvcihiZyksIEpBTTIpOworCitrcHJpbnRmKCJndWlfbWNoX3NldF9jb2xvcnMgJXMsJXNcbiIsIHRhYmxlW2ZnXS5uYW1lLCB0YWJsZVtiZ10ubmFtZSk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9mZ19jb2xvcihndWljb2xvcl9UIGNvbG9yKQoreworI2lmIDAKKyAgICBpZiAoY29sb3IgPT0gMCkKKyAgICB7CisJY29sb3IgPSAxOyAvKiB2aW0gc2VuZHMgMCBhcyBkZWZhdWx0IGNvbG9yIHdoaWNoIGlzIEFMV0FZUyB0aGUKKwkJICAgICAgYmFja2dyb3VuZCBvbiB0aGUgYW1pZ2Egc2Nyb2xsaW5nIHdpdGggY29sb3VycyBhcyB0aGUKKwkJICAgICAgYmFja2dyb3VuZCBpcyBhIHZlcnkgYmFkIGlkZWEgb24gc2xvdyBtYWNoaW5lcyovCisgICAgfQorI2VuZGlmCisgICAgU2V0QVBlbihndWkud2luZG93LT5SUG9ydCwgZ2V0cmVhbGNvbG9yKGNvbG9yKSk7CisgICAgU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgSkFNMik7CisKK2twcmludGYoImd1aV9tY2hfc2V0X2ZnX2NvbG9yICVzXG4iLCB0YWJsZVtjb2xvcl0ubmFtZSk7CisKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgU2V0QlBlbihndWkud2luZG93LT5SUG9ydCwgZ2V0cmVhbGNvbG9yKGNvbG9yKSk7CitrcHJpbnRmKCJndWlfbWNoX3NldF9iZ19jb2xvciAlc1xuIiwgdGFibGVbY29sb3JdLm5hbWUpOworCit9CisKKyAgICB2b2lkCitndWlfbWNoX2RyYXdfc3RyaW5nKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKQoreworI2lmIDEKKyAgICBjaGFyIHRlbXBzdHJpbmdbMzAwXTsKKworICAgIG1lbWNweSh0ZW1wc3RyaW5nLCBzLCBsZW4pOworICAgIHRlbXBzdHJpbmdbbGVuXSA9ICdcMCc7CisKKyAgICBrcHJpbnRmKCJndWlfbWNoX2RyYXdfc3RyaW5nKCVzKSBmbGFncyAleFxuIiwgdGVtcHN0cmluZywgZmxhZ3MpOworI2VuZGlmCisKKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1RSQU5TUCkKKyAgICB7CisJU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgSkFNMSk7CisJTW92ZShndWkud2luZG93LT5SUG9ydCwgcG9zV2lkdGhDaGFyVG9Qb2ludChjb2wpLCBwb3NIZWlnaHRDaGFyVG9Qb2ludChyb3cpICsgZ3VpLndpbmRvdy0+UlBvcnQtPlR4QmFzZWxpbmUpOworCVRleHQoZ3VpLndpbmRvdy0+UlBvcnQsIHMsIGxlbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgSkFNMik7CisJTW92ZShndWkud2luZG93LT5SUG9ydCwgcG9zV2lkdGhDaGFyVG9Qb2ludChjb2wpLCBwb3NIZWlnaHRDaGFyVG9Qb2ludChyb3cpICsgZ3VpLndpbmRvdy0+UlBvcnQtPlR4QmFzZWxpbmUpOworCVRleHQoZ3VpLndpbmRvdy0+UlBvcnQsIHMsIGxlbik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRFJBV19CT0xEKQorICAgIHsKKwlTZXREck1kKGd1aS53aW5kb3ctPlJQb3J0LCBKQU0xKTsKKwlNb3ZlKGd1aS53aW5kb3ctPlJQb3J0LCBwb3NXaWR0aENoYXJUb1BvaW50KGNvbCkrMSwgcG9zSGVpZ2h0Q2hhclRvUG9pbnQocm93KSArIGd1aS53aW5kb3ctPlJQb3J0LT5UeEJhc2VsaW5lKTsKKwlUZXh0KGd1aS53aW5kb3ctPlJQb3J0LCBzLCBsZW4pOworICAgIH0KKworICAgIGlmIChmbGFncyAmIERSQVdfVU5ERVJMKQorICAgIHsKKwlNb3ZlKGd1aS53aW5kb3ctPlJQb3J0LCBwb3NXaWR0aENoYXJUb1BvaW50KGNvbCksIHBvc0hlaWdodENoYXJUb1BvaW50KHJvdyArIDEpIC0gMSk7CisJRHJhdyhndWkud2luZG93LT5SUG9ydCwgcG9zV2lkdGhDaGFyVG9Qb2ludChjb2wrbGVuKSAtIDEsIHBvc0hlaWdodENoYXJUb1BvaW50KHJvdyArIDEpIC0gMSk7CisgICAgfQorCisgICAgU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgSkFNMik7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KGNoYXJfdSAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIEQoImd1aV9tY2hfaGFza2V5Iik7CisKKyAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxICE9IE5VTDsgaSsrKQorCWlmIChuYW1lWzBdID09IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTAgJiYKKwkJbmFtZVsxXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxKQorCSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2JlZXAodm9pZCkKK3sKKyAgICBEKCJndWlfbWNoX2JlZXAiKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZmxhc2goaW50IG1zZWMpCit7CisgICAgRCgiZ3VpX21jaF9mbGFzaCIpOworCisgICAgU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgQ09NUExFTUVOVCk7CisgICAgUmVjdEZpbGwoZ3VpLndpbmRvdy0+UlBvcnQsIDAsIDAsIGd1aS53aW5kb3ctPkdaWldpZHRoIC0gMSwgZ3VpLndpbmRvdy0+R1paSGVpZ2h0IC0gMSk7CisgICAgRGVsYXkobXNlYyAqIDUwIC8gMTAwMCk7CisgICAgUmVjdEZpbGwoZ3VpLndpbmRvdy0+UlBvcnQsIDAsIDAsIGd1aS53aW5kb3ctPkdaWldpZHRoIC0gMSwgZ3VpLndpbmRvdy0+R1paSGVpZ2h0IC0gMSk7CisgICAgU2V0RHJNZChndWkud2luZG93LT5SUG9ydCwgSkFNMik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2ludmVydF9yZWN0YW5nbGUoIGludCByLCBpbnQgYywgaW50IG5yLCBpbnQgbmMpCit7CisgICAgcHJpbnRmKCJndWlfbWNoX2ludmVydF9yZWN0YW5nbGUgJWQgJWQgJWQgJWRcbiIsIHIsIGMsIG5yLCBuYyk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2ljb25pZnkodm9pZCkKK3sKKyAgICBEKCJndWlfbWNoX2ljb25pZnkiKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEJyaW5nIHRoZSBWaW0gd2luZG93IHRvIHRoZSBmb3JlZ3JvdW5kLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpCit7CisgICAgV2luZG93VG9Gcm9udChndWkud2luZG93KTsKKyAgICBEKCJndWlfbWNoX3NldF9mb3JlZ3JvdW5kIik7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfc2V0dGl0bGUoY2hhcl91ICAqdGl0bGUsIGNoYXJfdSAgKmljb24pCit7CisgICAgU2V0V2luZG93VGl0bGVzKGd1aS53aW5kb3csIHRpdGxlLCAoU1RSUFRSKX4wKTsKKyAgICBEKCJndWlfbWNoX3NldHRpdGxlIik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3N0b3BfYmxpbmsodm9pZCkKK3sKKyAgICBndWlfdW5kcmF3X2N1cnNvcigpOworICAgIEQoImd1aV9tY2hfc3RvcF9ibGluayIpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zdGFydF9ibGluayh2b2lkKQoreworICAgIGd1aV91cGRhdGVfY3Vyc29yKEZBTFNFLCBGQUxTRSk7CisgICAgRCgiZ3VpX21jaF9zdGFydF9ibGluayIpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IoZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBkcmF3Qm94KERCX05vdEZpbGxlZCwgZ3VpLmNvbCwgZ3VpLnJvdywgY2hhcmFjdGVyV2lkdGgsIGNoYXJhY3RlckhlaWdodCwgY29sb3IpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKCBpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgRCgiZ3VpX21jaF9wYXJ0X2N1cnNvciIpOworICAgIGRyYXdCb3goREJfRmlsbGVkLCBndWkuY29sLCBndWkucm93LCB3LCBoLCBjb2xvcik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3VwZGF0ZSh2b2lkKQoreworICAgIGNoZWNrRXZlbnRIYW5kbGVyKCk7CisgICAgcmV0dXJuIDsKK30KKworICAgIGludAorZ3VpX21jaF93YWl0X2Zvcl9jaGFycyhpbnQgd3RpbWUpCit7CisgICAgVUxPTkcgdGltZXJtYXNrID0gMUwgPDwgVGltZXJNUC0+bXBfU2lnQml0OworICAgIFVMT05HIHdpbm1hc2sgPSAxTCA8PCBndWkud2luZG93LT5Vc2VyUG9ydC0+bXBfU2lnQml0OworICAgIGludCByZXR2YWwgPSBGQUlMOworCisgICAga3ByaW50ZigiPT09PT09PT09PSBndWlfbWNoX3dhaXRfZm9yX2NoYXJzICVkXG4iLCB3dGltZSk7CisKKyAgICBpZiAod3RpbWUgPT0gLTEpIHd0aW1lID0gMTAwMDAwMDAwMDsKKyAgICBpZiAod3RpbWUgPCAyMCkgd3RpbWUgPSAyMDsKKworICAgIFNldFNpZ25hbCgwLCB0aW1lcm1hc2spOworICAgIFRpbWVySU8tPnRyX25vZGUuaW9fQ29tbWFuZCA9IFRSX0FERFJFUVVFU1Q7CisgICAgVGltZXJJTy0+dHJfdGltZS50dl9zZWNzID0gd3RpbWUgLyAxMDAwOworICAgIFRpbWVySU8tPnRyX3RpbWUudHZfbWljcm8gPSAod3RpbWUgJSAxMDAwKSAqIDEwMDA7CisgICAgU2VuZElPKCZUaW1lcklPLT50cl9ub2RlKTsKKyAgICBUaW1lclNlbnQgPSBUUlVFOworCisgICAgZm9yKDs7KQorICAgIHsKKwlVTE9ORyBzaWdzID0gV2FpdCh3aW5tYXNrIHwgdGltZXJtYXNrKTsKKworCWlmIChzaWdzICYgd2lubWFzaykKKwl7CisJICAgIGNoZWNrRXZlbnRIYW5kbGVyKCk7CisJICAgIGlmICghdmltX2lzX2lucHV0X2J1Zl9lbXB0eSgpKQorCSAgICB7CisJCXJldHZhbCA9IE9LOworCQlpZiAoIUNoZWNrSU8oJlRpbWVySU8tPnRyX25vZGUpKSBBYm9ydElPKCZUaW1lcklPLT50cl9ub2RlKTsKKwkJV2FpdElPKCZUaW1lcklPLT50cl9ub2RlKTsKKwkJVGltZXJTZW50ID0gRkFMU0U7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYgKHNpZ3MgJiB0aW1lcm1hc2spCisJeworCSAgICBzdHJ1Y3QgTWVzc2FnZSAqbXNnOworCisJICAgIGlmICgobXNnID0gR2V0TXNnKFRpbWVyTVApKSkKKwkgICAgeworCQlSZXBseU1zZyhtc2cpOworCQlUaW1lclNlbnQgPSBGQUxTRTsKKwkJcmV0dmFsID0gRkFJTDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKKworLy8gICAgYXNzZXJ0KHd0aW1lICE9IDApOworLy8gICAgcmV0dXJuIGNoYXJFdmVudEhhbmRsZXIod3RpbWUpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9mbHVzaCh2b2lkKQoreworfQorCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9ibG9jayhpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikKK3sKKyAgICBVQllURSBhcGVuID0gR2V0QVBlbihndWkud2luZG93LT5SUG9ydCk7CisKKyAgICBTZXRBUGVuKGd1aS53aW5kb3ctPlJQb3J0LCBnZXRyZWFsY29sb3IoZ3VpLmJhY2tfcGl4ZWwpKTsKKyAgICBSZWN0RmlsbChndWkud2luZG93LT5SUG9ydCwKKwkgICAgIHBvc1dpZHRoQ2hhclRvUG9pbnQoY29sMSksCisJICAgICBwb3NIZWlnaHRDaGFyVG9Qb2ludChyb3cxKSwKKwkgICAgIHBvc1dpZHRoQ2hhclRvUG9pbnQoY29sMiArIDEpIC0gMSwKKwkgICAgIHBvc0hlaWdodENoYXJUb1BvaW50KHJvdzIgKyAxKSAtIDEpOworICAgIFNldEFQZW4oZ3VpLndpbmRvdy0+UlBvcnQsIGFwZW4pOworCit9CisKKyAgICB2b2lkCitndWlfbWNoX2NsZWFyX2FsbCh2b2lkKQoreworICAgIFNldFJhc3QoZ3VpLndpbmRvdy0+UlBvcnQsIEdldEJQZW4oZ3VpLndpbmRvdy0+UlBvcnQpKTsKKyAgICByZWZyZXNoQm9yZGVyKCk7CisgICAgRCgiZ3VpX21jaF9jbGVhcl9hbGwiKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZGVsZXRlX2xpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgU2Nyb2xsV2luZG93UmFzdGVyKGd1aS53aW5kb3csCisJICAgIDAsCisJICAgIGNoYXJhY3RlckhlaWdodCAqIG51bV9saW5lcywKKwkgICAgcG9zV2lkdGhDaGFyVG9Qb2ludChndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0KSwKKwkgICAgcG9zSGVpZ2h0Q2hhclRvUG9pbnQocm93KSwKKwkgICAgcG9zV2lkdGhDaGFyVG9Qb2ludChndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCArIDEpIC0gMSwKKwkgICAgcG9zSGVpZ2h0Q2hhclRvUG9pbnQoZ3VpLnNjcm9sbF9yZWdpb25fYm90ICsgMSkgLSAxKTsKKworICAgIGd1aV9jbGVhcl9ibG9jayhndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMgKyAxLAorCQkgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJICAgIGd1aS5zY3JvbGxfcmVnaW9uX2JvdCwKKwkJICAgIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKworfQorCisgICAgdm9pZAorZ3VpX21jaF9pbnNlcnRfbGluZXMoaW50IHJvdywgaW50IG51bV9saW5lcykKK3sKKyAgICAgU2Nyb2xsV2luZG93UmFzdGVyKGd1aS53aW5kb3csCisJICAgIDAsCisJICAgIC1jaGFyYWN0ZXJIZWlnaHQqbnVtX2xpbmVzLAorCSAgICBwb3NXaWR0aENoYXJUb1BvaW50KGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpLAorCSAgICBwb3NIZWlnaHRDaGFyVG9Qb2ludChyb3cpLAorCSAgICBwb3NXaWR0aENoYXJUb1BvaW50KGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ICsgMSkgLSAxLAorCSAgICBwb3NIZWlnaHRDaGFyVG9Qb2ludChndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgKzEgKSAtIDEpOworCisgICAgZ3VpX2NsZWFyX2Jsb2NrKHJvdywgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJICAgIHJvdyArIG51bV9saW5lcyAtIDEsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKworfQorCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfbWVudShpbnQgZmxhZykKK3sKKyAgICBEKCJndWlfbWNoX2VuYWJsZV9tZW51Iik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9tZW51X3BvcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBEKCJndWlfbWNoX3NldF9tZW51X3BvcyIpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X21lbnUodmltbWVudV9UICptZW51KQoreworICAgIEQoImd1aV9tY2hfZGVzdHJveV9tZW51Iik7CisgICAgQ2xlYXJNZW51U3RyaXAoZ3VpLndpbmRvdyk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KQoreworICAgIEQoImd1aV9tY2hfbWVudV9ncmV5Iik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX21lbnVfaGlkZGVuKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikKK3sKKyAgICBEKCJndWlfbWNoX21lbnVfaGlkZGVuIik7CisgICAgQ2xlYXJNZW51U3RyaXAoZ3VpLndpbmRvdyk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2RyYXdfbWVudWJhcih2b2lkKQoreworICAgIEQoImd1aV9tY2hfZHJhd19tZW51YmFyIik7CisgICAgU2V0TWVudVN0cmlwKGd1aS53aW5kb3csIGd1aS5tZW51KTsKK30KKworICAgIHN0YXRpYyB2b2lkCitBbWlnYUVycm9yKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBzdGF0aWMgc3RydWN0IEludHVpVGV4dCBwb3MgPSB7IDMsIDAsIEpBTTIsIDE3LCA1LCBOVUxMLCAiQ2FuY2VsIiwgTlVMTH0gOworICAgIHN0YXRpYyBzdHJ1Y3QgSW50dWlUZXh0IG5lZyA9IHsgMywgMCwgSkFNMiwgMTcsIDUsIE5VTEwsICJDYW5jZWwiLCBOVUxMfSA7CisgICAgc3RhdGljIHN0cnVjdCBJbnR1aVRleHQgbWVzc2FnZSA9IHsgMywgMCwgSkFNMiwgMTcsIDUsIE5VTEwsIE5VTEwsIE5VTEx9IDsKKyAgICBzdGF0aWMgY2hhciAqc3RycHRyID0gMDsKKworICAgIGlmIChzdHJwdHIpCisJZnJlZShzdHJwdHIpOworICAgIHN0cnB0ciA9IG1hbGxvYyhzdHJsZW4oc3RyaW5nKSsxKTsKKworICAgIG1lc3NhZ2UuSVRleHQgPSBzdHJwdHI7CisgICAgc3RyY3B5KHN0cnB0ciwgc3RyaW5nKTsKKworICAgIEF1dG9SZXF1ZXN0KE5VTEwsICZtZXNzYWdlLCAmcG9zLCAmbmVnLCAwLCAwLCAzMDAsIDMwMCk7Cit9CisKKyAgICBpbnQKK2NsaXBfbWNoX293bl9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgRCgiY2xpYl9tY2hfb3duX3NlbGVjdGlvbiIpOworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK21jaF9zZXRtb3VzZShpbnQgIG9uKQoreworfQorCisvKgorICogR2V0IGN1cnJlbnQgeSBtb3VzZSBjb29yZGluYXRlIGluIHRleHQgd2luZG93LgorICogUmV0dXJuIC0xIHdoZW4gdW5rbm93bi4KKyAqLworICAgIGludAorZ3VpX21jaF9nZXRfbW91c2VfeCgpCit7CisgICAgcmV0dXJuIGd1aS53aW5kb3ctPkdaWk1vdXNlWDsKK30KKworICAgIGludAorZ3VpX21jaF9nZXRfbW91c2VfeSgpCit7CisgICAgcmV0dXJuIGd1aS53aW5kb3ctPkdaWk1vdXNlWTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0bW91c2UoeCwgeSkKKyAgICBpbnQJCXg7CisgICAgaW50CQl5OworeworICAgIC8qIFRPRE8gKi8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2hvd19wb3B1cG1lbnUodmltbWVudV9UICptZW51KQoreworICAgIC8qIFRPRE8gKi8KK30KKworICAgIHZvaWQKK2NsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIEQoImNsaXBfbWNoX2xvc2Vfc2VsZWNjdGlvbiIpOworfQorCisgICAgdm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgRCgiY2xpcF9tY2hfcmVxdXN0X3NlbGVjdGlvbiIpOworfQorCisgICAgdm9pZAorY2xpcF9tY2hfc2V0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKK3sKK30KKworICAgIGxvbmdfdQorZ3VpX21jaF9nZXRfcmdiKGd1aWNvbG9yX1QgcGl4ZWwpCit7CisgICAgVUxPTkcgY29sdGFibGVbM10sIGNvbG9yOworCisgICAgR2V0UkdCMzIoZ3VpLndpbmRvdy0+V1NjcmVlbi0+Vmlld1BvcnQuQ29sb3JNYXAsCisJICAgICBnZXRyZWFsY29sb3IocGl4ZWwpLAorCSAgICAgMSwKKwkgICAgIGNvbHRhYmxlKTsKKworICAgIGNvbG9yID0gKChjb2x0YWJsZVswXSAmIDB4RkYwMDAwMDApID4+IDgpIHwKKwkgICAgKChjb2x0YWJsZVsxXSAmIDB4RkYwMDAwMDApID4+IDE2KSB8CisJICAgICgoY29sdGFibGVbMl0gJiAweEZGMDAwMDAwKSA+PiAyNCk7CisKKyAgICByZXR1cm4gY29sb3I7Cit9CisKKyNlbmRpZiAvKiBVU0VfQU1JR0FfR1VJKi8KZGlmZiAtLWdpdCBhL3NyYy9ndWlfYW1pZ2EuaCBiL3NyYy9ndWlfYW1pZ2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAxMjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9hbWlnYS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCQlBbWlnYSBHVUkgc3VwcG9ydCBieSBNaWNoYWVsIE5pZWxzZW4KKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICoKKyAqIEFtaWdhIEdVSSBoZWFkZXIgZmlsZS4KKyAqLworCisjaWYgIWRlZmluZWQoX19HVUlfQU1JR0FfX0gpCisjZGVmaW5lIF9fR1VJX0FNSUdBX19ICisKKyNkZWZpbmUgU2V0QXR0cmliKF9wdHIsX2F0dHJpYixfdmFsdWUpICgoX3B0ciktPl9hdHRyaWI9KF92YWx1ZSkpCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0FNSUdBKQorCisjaW5jbHVkZSA8aW50dWl0aW9uL2ludHVpdGlvbi5oPgorCitlbnVtIGV2ZW50IHsKKyAgICBldl9OdWxsRXZlbnQsCisgICAgZXZfTWVudVZlcmlmeSwKKyAgICBldl9NZW51UGljaywKKyAgICBldl9DbG9zZVdpbmRvdywKKyAgICBldl9OZXdTaXplLAorICAgIGV2X1JlZnJlc2hXaW5kb3csCisgICAgZXZfTW91c2VCdXR0b25zLAorICAgIGV2X01vdXNlTW92ZSwKKyAgICBldl9HYWRnZXREb3duLAorICAgIGV2X0dhZGdldFVwLAorICAgIGV2X0tleVN0cm9rZSwKKyAgICBldl9JbnR1aVRpY2tzLAorICAgIGV2X01lbnVIZWxwLAorICAgIGV2X0dhZGdldEhlbHAsCisKKyAgICBldl9JZ25vcmUKK307CisKK3N0cnVjdCBNeU1lbnVJdGVtIHsKKyAgICBzdHJ1Y3QgTWVudUl0ZW0gbWVudUl0ZW07CisgICAgdmltbWVudV9UCSpndWlNZW51OworfTsKKwordW5pb24gbXlNZW51SXRlbVVuaW9uIHsKKyAgICBzdHJ1Y3QgTWVudUl0ZW0gbWVudUl0ZW07CisgICAgc3RydWN0IE15TWVudUl0ZW0gbXlNZW51SXRlbTsKK307CisKKyNlbmRpZiAvKiBGRUFUX0dVSV9BTUlHQSovCisjZW5kaWYgLyogX19HVUlfQU1JR0FfX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9hdF9mcy5jIGIvc3JjL2d1aV9hdF9mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDk2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX2F0X2ZzLmMKQEAgLTAsMCArMSwyODgwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OiAqLworCisvKgorICogQ29weXJpZ2h0IDE5ODkgU29mdHdhcmUgUmVzZWFyY2ggQXNzb2NpYXRlcywgSW5jLiwgVG9reW8sIEphcGFuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU29mdHdhcmUgUmVzZWFyY2ggQXNzb2NpYXRlcyBub3QgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgU29mdHdhcmUgUmVzZWFyY2ggQXNzb2NpYXRlcworICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFNPRlRXQVJFIFJFU0VBUkNIIEFTU09DSUFURVMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKKyAqIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTT0ZUV0FSRSBSRVNFQVJDSCBBU1NPQ0lBVEVTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCisgKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQorICogTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogQXV0aG9yOiBFcmlrIE0uIHZhbiBkZXIgUG9lbAorICoJICAgU29mdHdhcmUgUmVzZWFyY2ggQXNzb2NpYXRlcywgSW5jLiwgVG9reW8sIEphcGFuCisgKgkgICBlcmlrQHNyYS5jby5qcAorICovCisvKgorICogQXV0aG9yJ3MgYWRkcmVzc2VzOgorICoJZXJpa0BzcmEuY28uanAKKyAqCWVyaWslc3JhLmNvLmpwQHV1bmV0LnV1Lm5ldAorICoJZXJpayVzcmEuY28uanBAbWN2YXgudXVjcAorICoJdHJ5IGp1bmV0IGluc3RlYWQgb2YgY28uanAKKyAqCUVyaWsgTS4gdmFuIGRlciBQb2VsCisgKglTb2Z0d2FyZSBSZXNlYXJjaCBBc3NvY2lhdGVzLCBJbmMuCisgKgkxLTEtMSBIaXJha2F3YS1jaG8sIENoaXlvZGEta3UKKyAqCVRva3lvIDEwMiBKYXBhbi4gVEVMICs4MS0zLTIzNC0yNjkyCisgKi8KKworLyoKKyAqIEhlYXZlbHkgbW9kaWZpZWQgZm9yIFZpbSBieSBCcmFtIE1vb2xlbmFhcgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyogT25seSBpbmNsdWRlIHRoaXMgd2hlbiB1c2luZyB0aGUgZmlsZSBicm93c2VyICovCisKKyNpZmRlZiBGRUFUX0JST1dTRQorCisvKiBXZWlyZCBjb21wbGljYXRpb246IGZvciAibWFrZSBsaW50IiBUZXh0LmggZG9lc24ndCBjb21iaW5lIHdpdGggWG0uaCAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpICYmIGRlZmluZWQoRk1UOEJJVCkKKyMgdW5kZWYgRk1UOEJJVAorI2VuZGlmCisKKyNpZm5kZWYgRkVBVF9HVUlfTkVYVEFXCisjIGluY2x1ZGUgImd1aV9hdF9zYi5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKiBTRmludGVybmFsLmggKi8KKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYMTEvU3RyaW5nRGVmcy5oPgorI2luY2x1ZGUgPFgxMS9Yb3MuaD4KKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyMgaW5jbHVkZSA8WDExL25lWHRhdy9UZXh0Lmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvQXNjaWlUZXh0Lmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvU2Nyb2xsYmFyLmg+CisjZWxzZQorIyBpbmNsdWRlIDxYMTEvWGF3L1RleHQuaD4KKyMgaW5jbHVkZSA8WDExL1hhdy9Bc2NpaVRleHQuaD4KKyNlbmRpZgorCisjZGVmaW5lIFNFTF9GSUxFX0NBTkNFTAkJLTEKKyNkZWZpbmUgU0VMX0ZJTEVfT0sJCTAKKyNkZWZpbmUgU0VMX0ZJTEVfTlVMTAkJMQorI2RlZmluZSBTRUxfRklMRV9URVhUCQkyCisKKyNkZWZpbmUgU0ZfRE9fU0NST0xMCQkxCisjZGVmaW5lIFNGX0RPX05PVF9TQ1JPTEwJMAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkJc3RhdERvbmU7CisgICAgY2hhcgkqcmVhbDsKKyAgICBjaGFyCSpzaG93bjsKK30gU0ZFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyCSpkaXI7CisgICAgY2hhcgkqcGF0aDsKKyAgICBTRkVudHJ5CSplbnRyaWVzOworICAgIGludAkJbkVudHJpZXM7CisgICAgaW50CQl2T3JpZ2luOworICAgIGludAkJbkNoYXJzOworICAgIGludAkJaE9yaWdpbjsKKyAgICBpbnQJCWNoYW5nZWQ7CisgICAgaW50CQliZWdpblNlbGVjdGlvbjsKKyAgICBpbnQJCWVuZFNlbGVjdGlvbjsKKyAgICB0aW1lX3QJbXRpbWU7Cit9IFNGRGlyOworCitzdGF0aWMgY2hhcglTRnN0YXJ0RGlyW01BWFBBVEhMXSwKKwkJU0ZjdXJyZW50UGF0aFtNQVhQQVRITF0sCisJCVNGY3VycmVudERpcltNQVhQQVRITF07CisKK3N0YXRpYyBXaWRnZXQJc2VsRmlsZSwKKwkJc2VsRmlsZUZpZWxkLAorCQlzZWxGaWxlRm9ybSwKKwkJc2VsRmlsZUhTY3JvbGwsCisJCXNlbEZpbGVIU2Nyb2xsc1szXSwKKwkJc2VsRmlsZUxpc3RzWzNdLAorCQlzZWxGaWxlT0ssCisJCXNlbEZpbGVDYW5jZWwsCisJCXNlbEZpbGVQcm9tcHQsCisJCXNlbEZpbGVWU2Nyb2xsc1szXTsKKworc3RhdGljIERpc3BsYXkJKlNGZGlzcGxheTsKKworc3RhdGljIGludAlTRmNoYXJXaWR0aCwgU0ZjaGFyQXNjZW50LCBTRmNoYXJIZWlnaHQ7CisKK3N0YXRpYyBTRkRpcgkqU0ZkaXJzID0gTlVMTDsKKworc3RhdGljIGludAlTRmRpckVuZDsKK3N0YXRpYyBpbnQJU0ZkaXJQdHI7CisKK3N0YXRpYyBQaXhlbAlTRmZvcmUsIFNGYmFjazsKKworc3RhdGljIEF0b20JU0Z3bURlbGV0ZVdpbmRvdzsKKworc3RhdGljIFhTZWdtZW50IFNGc2Vnc1syXSwgU0Zjb21wbGV0aW9uU2Vnc1syXTsKKworc3RhdGljIFhhd1RleHRQb3NpdGlvbiBTRnRleHRQb3M7CisKK3N0YXRpYyBpbnQJU0Z1cHBlclgsIFNGbG93ZXJZLCBTRnVwcGVyWTsKKworc3RhdGljIGludAlTRnRleHRYLCBTRnRleHRZb2Zmc2V0OworCitzdGF0aWMgaW50CVNGZW50cnlXaWR0aCwgU0ZlbnRyeUhlaWdodDsKKworc3RhdGljIGludAlTRmxpbmVUb1RleHRIID0gMzsKK3N0YXRpYyBpbnQJU0ZsaW5lVG9UZXh0ViA9IDM7CisKK3N0YXRpYyBpbnQJU0ZiZXNpZGVUZXh0ID0gMzsKK3N0YXRpYyBpbnQJU0ZhYm92ZUFuZEJlbG93VGV4dCA9IDI7CisKK3N0YXRpYyBpbnQJU0ZjaGFyc1BlckVudHJ5ID0gMTU7CisKK3N0YXRpYyBpbnQJU0ZsaXN0U2l6ZSA9IDEwOworCitzdGF0aWMgaW50CVNGY3VycmVudEludmVydFszXSA9IHsgLTEsIC0xLCAtMSB9OworCitzdGF0aWMgaW50CVNGd29ya1Byb2NBZGRlZCA9IDA7CisKK3N0YXRpYyBYdEFwcENvbnRleHQgU0ZhcHA7CisKK3N0YXRpYyBpbnQJU0ZwYXRoU2Nyb2xsV2lkdGgsIFNGdlNjcm9sbEhlaWdodCwgU0ZoU2Nyb2xsV2lkdGg7CisKKyNpZmRlZiBGRUFUX1hGT05UU0VUCitzdGF0aWMgY2hhcglTRnRleHRCdWZmZXJbTUFYUEFUSEwqc2l6ZW9mKHdjaGFyX3QpXTsKKyNlbHNlCitzdGF0aWMgY2hhcglTRnRleHRCdWZmZXJbTUFYUEFUSExdOworI2VuZGlmCisKK3N0YXRpYyBpbnQJU0ZidXR0b25QcmVzc2VkID0gMDsKKworc3RhdGljIFh0SW50ZXJ2YWxJZCBTRmRpck1vZFRpbWVySWQ7CisKK3N0YXRpYyBpbnQJKCpTRmZ1bmMpKCk7CisKK3N0YXRpYyBpbnQJU0ZzdGF0dXMgPSBTRUxfRklMRV9OVUxMOworCisvKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBTRnNldFRleHQgX19BUkdTKChjaGFyICpwYXRoKSk7CitzdGF0aWMgdm9pZCBTRnRleHRDaGFuZ2VkIF9fQVJHUygodm9pZCkpOworc3RhdGljIGNoYXIgKlNGZ2V0VGV4dCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIFNGdXBkYXRlUGF0aCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgU0ZnZXREaXIgX19BUkdTKChTRkRpciAqZGlyKSk7CitzdGF0aWMgdm9pZCBTRmRyYXdMaXN0cyBfX0FSR1MoKGludCBkb1Njcm9sbCkpOworc3RhdGljIHZvaWQgU0ZkcmF3TGlzdCBfX0FSR1MoKGludCBuLCBpbnQgZG9TY3JvbGwpKTsKK3N0YXRpYyB2b2lkIFNGY2xlYXJMaXN0IF9fQVJHUygoaW50IG4sIGludCBkb1Njcm9sbCkpOworc3RhdGljIHZvaWQgU0ZidXR0b25QcmVzc0xpc3QgX19BUkdTKChXaWRnZXQgdywgaW50IG4sIFhCdXR0b25QcmVzc2VkRXZlbnQgKmV2ZW50KSk7CitzdGF0aWMgdm9pZCBTRmJ1dHRvblJlbGVhc2VMaXN0IF9fQVJHUygoV2lkZ2V0IHcsIGludCBuLCBYQnV0dG9uUmVsZWFzZWRFdmVudCAqZXZlbnQpKTsKK3N0YXRpYyB2b2lkIFNGZGlyTW9kVGltZXIgX19BUkdTKChYdFBvaW50ZXIgY2wsIFh0SW50ZXJ2YWxJZCAqaWQpKTsKK3N0YXRpYyBjaGFyIFNGc3RhdENoYXIgX19BUkdTKChzdHJ1Y3Qgc3RhdCAqc3RhdEJ1ZikpOworc3RhdGljIHZvaWQgU0ZkcmF3U3RyaW5ncyBfX0FSR1MoKFdpbmRvdyB3LCBTRkRpciAqZGlyLCBpbnQgZnJvbSwgaW50IHRvKSk7CitzdGF0aWMgaW50IFNGbmV3SW52ZXJ0RW50cnkgX19BUkdTKChpbnQgbiwgWE1vdGlvbkV2ZW50ICpldmVudCkpOworc3RhdGljIHZvaWQgU0ZpbnZlcnRFbnRyeSBfX0FSR1MoKGludCBuKSk7CitzdGF0aWMgdm9pZCBTRmVudGVyTGlzdCBfX0FSR1MoKFdpZGdldCB3LCBpbnQgbiwgWEVudGVyV2luZG93RXZlbnQgKmV2ZW50KSk7CitzdGF0aWMgdm9pZCBTRmxlYXZlTGlzdCBfX0FSR1MoKFdpZGdldCB3LCBpbnQgbiwgWEV2ZW50ICpldmVudCkpOworc3RhdGljIHZvaWQgU0Ztb3Rpb25MaXN0IF9fQVJHUygoV2lkZ2V0IHcsIGludCBuLCBYTW90aW9uRXZlbnQgKmV2ZW50KSk7CitzdGF0aWMgdm9pZCBTRnZGbG9hdFNsaWRlck1vdmVkQ2FsbGJhY2sgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIG4sIFh0UG9pbnRlciBmbmV3KSk7CitzdGF0aWMgdm9pZCBTRnZTbGlkZXJNb3ZlZENhbGxiYWNrIF9fQVJHUygoV2lkZ2V0IHcsIGludCBuLCBpbnQgbncpKTsKK3N0YXRpYyB2b2lkIFNGdkFyZWFTZWxlY3RlZENhbGxiYWNrIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBuLCBYdFBvaW50ZXIgcG5ldykpOworc3RhdGljIHZvaWQgU0ZoU2xpZGVyTW92ZWRDYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgbiwgWHRQb2ludGVyIG53KSk7CitzdGF0aWMgdm9pZCBTRmhBcmVhU2VsZWN0ZWRDYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgbiwgWHRQb2ludGVyIHBuZXcpKTsKK3N0YXRpYyB2b2lkIFNGcGF0aFNsaWRlck1vdmVkQ2FsbGJhY2sgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYdFBvaW50ZXIgbncpKTsKK3N0YXRpYyB2b2lkIFNGcGF0aEFyZWFTZWxlY3RlZENhbGxiYWNrIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWHRQb2ludGVyIHBuZXcpKTsKK3N0YXRpYyBCb29sZWFuIFNGd29ya1Byb2MgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IFNGY29tcGFyZUVudHJpZXMgX19BUkdTKChjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKSk7CitzdGF0aWMgdm9pZCBTRnByZXBhcmVUb1JldHVybiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIFNGY3JlYXRlV2lkZ2V0cyBfX0FSR1MoKFdpZGdldCB0b3BsZXZlbCwgY2hhciAqcHJvbXB0LCBjaGFyICpvaywgY2hhciAqY2FuY2VsKSk7CitzdGF0aWMgdm9pZCBTRnNldENvbG9ycyBfX0FSR1MoKGd1aWNvbG9yX1QgYmcsIGd1aWNvbG9yX1QgZmcsIGd1aWNvbG9yX1Qgc2Nyb2xsX2JnLCBndWljb2xvcl9UIHNjcm9sbGZnKSk7CisKKy8qKioqKioqKioqKioqKioqKiB4c3RhdC5oICovCisKKyNpZm5kZWYgU19JWFVTUgorIyBkZWZpbmUgU19JWFVTUiAwMTAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwMDEwCisjZW5kaWYKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwMDAxCisjZW5kaWYKKworI2RlZmluZSBTX0lTWFhYKG0pICgobSkgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkKKworLyoqKioqKioqKioqKioqKioqIFBhdGguYyAqLworCisjaW5jbHVkZSA8cHdkLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhcgkqbmFtZTsKKyAgICBjaGFyCSpkaXI7Cit9IFNGTG9naW47CisKK3N0YXRpYyBpbnQJU0Zkb05vdFRvdWNoRGlyUHRyID0gMDsKKworc3RhdGljIGludAlTRmRvTm90VG91Y2hWb3JpZ2luID0gMDsKKworc3RhdGljIFNGRGlyCVNGcm9vdERpciwgU0Zob21lRGlyOworCitzdGF0aWMgU0ZMb2dpbgkqU0Zsb2dpbnM7CisKK3N0YXRpYyBpbnQJU0Z0d2lkZGxlID0gMDsKKworc3RhdGljIGludCBTRmNoZGlyIF9fQVJHUygoY2hhciAqcGF0aCkpOworCisgICAgc3RhdGljIGludAorU0ZjaGRpcihwYXRoKQorICAgIGNoYXIJKnBhdGg7Cit7CisgICAgaW50CQlyZXN1bHQ7CisKKyAgICByZXN1bHQgPSAwOworCisgICAgaWYgKHN0cmNtcChwYXRoLCBTRmN1cnJlbnREaXIpKQorICAgIHsKKwlyZXN1bHQgPSBtY2hfY2hkaXIocGF0aCk7CisJaWYgKCFyZXN1bHQpCisJICAgICh2b2lkKSBzdHJjcHkoU0ZjdXJyZW50RGlyLCBwYXRoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBTRmZyZWUgX19BUkdTKChpbnQgaSkpOworCisgICAgc3RhdGljIHZvaWQKK1NGZnJlZShpKQorICAgIGludAlpOworeworICAgIFNGRGlyCSpkaXI7CisgICAgaW50CQlqOworCisgICAgZGlyID0gJihTRmRpcnNbaV0pOworCisgICAgZm9yIChqID0gZGlyLT5uRW50cmllcyAtIDE7IGogPj0gMDsgai0tKQorICAgIHsKKwlpZiAoZGlyLT5lbnRyaWVzW2pdLnNob3duICE9IGRpci0+ZW50cmllc1tqXS5yZWFsKQorCSAgICBYdEZyZWUoZGlyLT5lbnRyaWVzW2pdLnNob3duKTsKKwlYdEZyZWUoZGlyLT5lbnRyaWVzW2pdLnJlYWwpOworICAgIH0KKworICAgIFh0RnJlZSgoY2hhciAqKWRpci0+ZW50cmllcyk7CisgICAgWHRGcmVlKGRpci0+ZGlyKTsKKworICAgIGRpci0+ZGlyID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgU0ZzdHJkdXAgX19BUkdTKChjaGFyICoqczEsIGNoYXIgKnMyKSk7CisKKyAgICBzdGF0aWMgdm9pZAorU0ZzdHJkdXAoczEsIHMyKQorICAgIGNoYXIJKipzMTsKKyAgICBjaGFyCSpzMjsKK3sKKyAgICAqczEgPSBzdHJjcHkoWHRNYWxsb2MoKHVuc2lnbmVkKShzdHJsZW4oczIpICsgMSkpLCBzMik7Cit9CisKK3N0YXRpYyB2b2lkIFNGdW5yZWFkYWJsZURpciBfX0FSR1MoKFNGRGlyICpkaXIpKTsKKworICAgIHN0YXRpYyB2b2lkCitTRnVucmVhZGFibGVEaXIoZGlyKQorICAgIFNGRGlyCSpkaXI7Cit7CisgICAgY2hhcgkqY2Fubm90T3BlbiA9IF8oIjxjYW5ub3Qgb3Blbj4gIik7CisKKyAgICBkaXItPmVudHJpZXMgPSAoU0ZFbnRyeSAqKSBYdE1hbGxvYyhzaXplb2YoU0ZFbnRyeSkpOworICAgIGRpci0+ZW50cmllc1swXS5zdGF0RG9uZSA9IDE7CisgICAgU0ZzdHJkdXAoJmRpci0+ZW50cmllc1swXS5yZWFsLCBjYW5ub3RPcGVuKTsKKyAgICBkaXItPmVudHJpZXNbMF0uc2hvd24gPSBkaXItPmVudHJpZXNbMF0ucmVhbDsKKyAgICBkaXItPm5FbnRyaWVzID0gMTsKKyAgICBkaXItPm5DaGFycyA9IHN0cmxlbihjYW5ub3RPcGVuKTsKK30KKworc3RhdGljIHZvaWQgU0ZyZXBsYWNlVGV4dCBfX0FSR1MoKFNGRGlyICpkaXIsIGNoYXIgKnN0cikpOworCisgICAgc3RhdGljIHZvaWQKK1NGcmVwbGFjZVRleHQoZGlyLCBzdHIpCisgICAgU0ZEaXIJKmRpcjsKKyAgICBjaGFyCSpzdHI7Cit7CisgICAgaW50CWxlbjsKKworICAgICooZGlyLT5wYXRoKSA9IDA7CisgICAgbGVuID0gc3RybGVuKHN0cik7CisgICAgaWYgKHN0cltsZW4gLSAxXSA9PSAnLycpCisJKHZvaWQpIHN0cmNhdChTRmN1cnJlbnRQYXRoLCBzdHIpOworICAgIGVsc2UKKwkodm9pZCkgc3RybmNhdChTRmN1cnJlbnRQYXRoLCBzdHIsIGxlbiAtIDEpOworICAgIGlmIChzdHJuY21wKFNGY3VycmVudFBhdGgsIFNGc3RhcnREaXIsIHN0cmxlbihTRnN0YXJ0RGlyKSkpCisJU0ZzZXRUZXh0KFNGY3VycmVudFBhdGgpOworICAgIGVsc2UKKwlTRnNldFRleHQoJihTRmN1cnJlbnRQYXRoW3N0cmxlbihTRnN0YXJ0RGlyKV0pKTsKKworICAgIFNGdGV4dENoYW5nZWQoKTsKK30KKworc3RhdGljIHZvaWQgU0ZleHBhbmQgX19BUkdTKChjaGFyICpzdHIpKTsKKworICAgIHN0YXRpYyB2b2lkCitTRmV4cGFuZChzdHIpCisgICAgY2hhcgkqc3RyOworeworICAgIGludAkJbGVuOworICAgIGludAkJY21wOworICAgIGNoYXIJKm5hbWUsICpncm93aW5nOworICAgIFNGRGlyCSpkaXI7CisgICAgU0ZFbnRyeQkqZW50cnksICptYXg7CisKKyAgICBsZW4gPSBzdHJsZW4oc3RyKTsKKworICAgIGRpciA9ICYoU0ZkaXJzW1NGZGlyRW5kIC0gMV0pOworCisgICAgaWYgKGRpci0+YmVnaW5TZWxlY3Rpb24gPT0gLTEpCisgICAgeworCVNGc3RyZHVwKCZzdHIsIHN0cik7CisJU0ZyZXBsYWNlVGV4dChkaXIsIHN0cik7CisJWHRGcmVlKHN0cik7CisJcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChkaXItPmJlZ2luU2VsZWN0aW9uID09IGRpci0+ZW5kU2VsZWN0aW9uKQorICAgIHsKKwlTRnJlcGxhY2VUZXh0KGRpciwgZGlyLT5lbnRyaWVzW2Rpci0+YmVnaW5TZWxlY3Rpb25dLnNob3duKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbWF4ID0gJihkaXItPmVudHJpZXNbZGlyLT5lbmRTZWxlY3Rpb24gKyAxXSk7CisKKyAgICBuYW1lID0gZGlyLT5lbnRyaWVzW2Rpci0+YmVnaW5TZWxlY3Rpb25dLnNob3duOworICAgIFNGc3RyZHVwKCZncm93aW5nLCBuYW1lKTsKKworICAgIGNtcCA9IDA7CisgICAgd2hpbGUgKCFjbXApCisgICAgeworCWVudHJ5ID0gJihkaXItPmVudHJpZXNbZGlyLT5iZWdpblNlbGVjdGlvbl0pOworCXdoaWxlIChlbnRyeSA8IG1heCkKKwl7CisJICAgIGlmICgoY21wID0gc3RybmNtcChncm93aW5nLCBlbnRyeS0+c2hvd24sIGxlbikpKQorCQlicmVhazsKKwkgICAgZW50cnkrKzsKKwl9CisJbGVuKys7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTRnJlcGxhY2VUZXh0KCkgZXhwZWN0cyBmaWxlbmFtZQorICAgICAqLworICAgIGdyb3dpbmdbbGVuIC0gMl0gPSAnICc7CisKKyAgICBncm93aW5nW2xlbiAtIDFdID0gMDsKKyAgICBTRnJlcGxhY2VUZXh0KGRpciwgZ3Jvd2luZyk7CisgICAgWHRGcmVlKGdyb3dpbmcpOworfQorCitzdGF0aWMgaW50IFNGZmluZEZpbGUgX19BUkdTKChTRkRpciAqZGlyLCBjaGFyICpzdHIpKTsKKworICAgIHN0YXRpYyBpbnQKK1NGZmluZEZpbGUoZGlyLCBzdHIpCisgICAgU0ZEaXIJKmRpcjsKKyAgICBjaGFyCSpzdHI7Cit7CisgICAgaW50CQlpLCBsYXN0LCBtYXg7CisgICAgY2hhcgkqbmFtZSwgc2F2ZTsKKyAgICBTRkVudHJ5CSplbnRyaWVzOworICAgIGludAkJbGVuOworICAgIGludAkJYmVnaW4sIGVuZDsKKyAgICBpbnQJCXJlc3VsdDsKKworICAgIGxlbiA9IHN0cmxlbihzdHIpOworCisgICAgaWYgKHN0cltsZW4gLSAxXSA9PSAnICcpCisgICAgeworCVNGZXhwYW5kKHN0cik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cltsZW4gLSAxXSA9PSAnLycpCisJbGVuLS07CisKKyAgICBtYXggPSBkaXItPm5FbnRyaWVzOworCisgICAgZW50cmllcyA9IGRpci0+ZW50cmllczsKKworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgbWF4KQorICAgIHsKKwluYW1lID0gZW50cmllc1tpXS5zaG93bjsKKwlsYXN0ID0gc3RybGVuKG5hbWUpIC0gMTsKKwlzYXZlID0gbmFtZVtsYXN0XTsKKwluYW1lW2xhc3RdID0gMDsKKworCXJlc3VsdCA9IHN0cm5jbXAoc3RyLCBuYW1lLCBsZW4pOworCisJbmFtZVtsYXN0XSA9IHNhdmU7CisJaWYgKHJlc3VsdCA8PSAwKQorCSAgICBicmVhazsKKwlpKys7CisgICAgfQorICAgIGJlZ2luID0gaTsKKyAgICB3aGlsZSAoaSA8IG1heCkKKyAgICB7CisJbmFtZSA9IGVudHJpZXNbaV0uc2hvd247CisJbGFzdCA9IHN0cmxlbihuYW1lKSAtIDE7CisJc2F2ZSA9IG5hbWVbbGFzdF07CisJbmFtZVtsYXN0XSA9IDA7CisKKwlyZXN1bHQgPSBzdHJuY21wKHN0ciwgbmFtZSwgbGVuKTsKKworCW5hbWVbbGFzdF0gPSBzYXZlOworCWlmIChyZXN1bHQpCisJICAgIGJyZWFrOworCWkrKzsKKyAgICB9CisgICAgZW5kID0gaTsKKworICAgIGlmIChiZWdpbiAhPSBlbmQpCisgICAgeworCWlmICgoZGlyLT5iZWdpblNlbGVjdGlvbiAhPSBiZWdpbikgfHwgKGRpci0+ZW5kU2VsZWN0aW9uICE9IGVuZCAtIDEpKQorCXsKKwkgICAgZGlyLT5jaGFuZ2VkID0gMTsKKwkgICAgZGlyLT5iZWdpblNlbGVjdGlvbiA9IGJlZ2luOworCSAgICBpZiAoc3RyW3N0cmxlbihzdHIpIC0gMV0gPT0gJy8nKQorCQlkaXItPmVuZFNlbGVjdGlvbiA9IGJlZ2luOworCSAgICBlbHNlCisJCWRpci0+ZW5kU2VsZWN0aW9uID0gZW5kIC0gMTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKGRpci0+YmVnaW5TZWxlY3Rpb24gIT0gLTEpCisgICAgeworCWRpci0+Y2hhbmdlZCA9IDE7CisJZGlyLT5iZWdpblNlbGVjdGlvbiA9IC0xOworCWRpci0+ZW5kU2VsZWN0aW9uID0gLTE7CisgICAgfQorCisgICAgaWYgKFNGZG9Ob3RUb3VjaFZvcmlnaW4KKwkgICAgfHwgKChiZWdpbiA+IGRpci0+dk9yaWdpbikgJiYgKGVuZCA8IGRpci0+dk9yaWdpbiArIFNGbGlzdFNpemUpKSkKKyAgICB7CisJU0Zkb05vdFRvdWNoVm9yaWdpbiA9IDA7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaSA9IGJlZ2luIC0gMTsKKyAgICBpZiAoaSA+IG1heCAtIFNGbGlzdFNpemUpCisJaSA9IG1heCAtIFNGbGlzdFNpemU7CisgICAgaWYgKGkgPCAwKQorCWkgPSAwOworCisgICAgaWYgKGRpci0+dk9yaWdpbiAhPSBpKQorICAgIHsKKwlkaXItPnZPcmlnaW4gPSBpOworCWRpci0+Y2hhbmdlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIFNGdW5zZWxlY3QgX19BUkdTKCh2b2lkKSk7CisKKyAgICBzdGF0aWMgdm9pZAorU0Z1bnNlbGVjdCgpCit7CisgICAgU0ZEaXIJKmRpcjsKKworICAgIGRpciA9ICYoU0ZkaXJzW1NGZGlyRW5kIC0gMV0pOworICAgIGlmIChkaXItPmJlZ2luU2VsZWN0aW9uICE9IC0xKQorCWRpci0+Y2hhbmdlZCA9IDE7CisgICAgZGlyLT5iZWdpblNlbGVjdGlvbiA9IC0xOworICAgIGRpci0+ZW5kU2VsZWN0aW9uID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgU0Zjb21wYXJlTG9naW5zIF9fQVJHUygoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkpOworCisgICAgc3RhdGljIGludAorU0Zjb21wYXJlTG9naW5zKHAsIHEpCisgICAgY29uc3Qgdm9pZCAqcCwgKnE7Cit7CisgICAgcmV0dXJuIHN0cmNtcCgoKFNGTG9naW4gKilwKS0+bmFtZSwgKChTRkxvZ2luICopcSktPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBTRmdldEhvbWVEaXJzIF9fQVJHUygodm9pZCkpOworCisgICAgc3RhdGljIHZvaWQKK1NGZ2V0SG9tZURpcnMoKQoreworICAgIHN0cnVjdAlwYXNzd2QJKnB3OworICAgIGludAkJQWxsb2M7CisgICAgaW50CQlpOworICAgIFNGRW50cnkJKmVudHJpZXMgPSBOVUxMOworICAgIGludAkJbGVuOworICAgIGludAkJbWF4Q2hhcnM7CisKKyAgICBBbGxvYyA9IDE7CisgICAgaSA9IDE7CisgICAgZW50cmllcyA9IChTRkVudHJ5ICopWHRNYWxsb2Moc2l6ZW9mKFNGRW50cnkpKTsKKyAgICBTRmxvZ2lucyA9IChTRkxvZ2luICopWHRNYWxsb2Moc2l6ZW9mKFNGTG9naW4pKTsKKyAgICBlbnRyaWVzWzBdLnJlYWwgPSBYdE1hbGxvYygzKTsKKyAgICAodm9pZCkgc3RyY3B5KGVudHJpZXNbMF0ucmVhbCwgIn4iKTsKKyAgICBlbnRyaWVzWzBdLnNob3duID0gZW50cmllc1swXS5yZWFsOworICAgIGVudHJpZXNbMF0uc3RhdERvbmUgPSAxOworICAgIFNGbG9naW5zWzBdLm5hbWUgPSAiIjsKKyAgICBwdyA9IGdldHB3dWlkKChpbnQpIGdldHVpZCgpKTsKKyAgICBTRnN0cmR1cCgmU0Zsb2dpbnNbMF0uZGlyLCBwdyA/IHB3LT5wd19kaXIgOiAiLyIpOworICAgIG1heENoYXJzID0gMDsKKworICAgICh2b2lkKSBzZXRwd2VudCgpOworCisgICAgd2hpbGUgKChwdyA9IGdldHB3ZW50KCkpICYmICgqKHB3LT5wd19uYW1lKSkpCisgICAgeworCWlmIChpID49IEFsbG9jKQorCXsKKwkgICAgQWxsb2MgKj0gMjsKKwkgICAgZW50cmllcyA9IChTRkVudHJ5ICopIFh0UmVhbGxvYygoY2hhciAqKWVudHJpZXMsCisJCQkJCSAodW5zaWduZWQpKEFsbG9jICogc2l6ZW9mKFNGRW50cnkpKSk7CisJICAgIFNGbG9naW5zID0gKFNGTG9naW4gKikgWHRSZWFsbG9jKChjaGFyICopU0Zsb2dpbnMsCisJCQkJCSAodW5zaWduZWQpKEFsbG9jICogc2l6ZW9mKFNGTG9naW4pKSk7CisJfQorCWxlbiA9IHN0cmxlbihwdy0+cHdfbmFtZSk7CisJZW50cmllc1tpXS5yZWFsID0gWHRNYWxsb2MoKHVuc2lnbmVkKSAobGVuICsgMykpOworCSh2b2lkKSBzdHJjYXQoc3RyY3B5KGVudHJpZXNbaV0ucmVhbCwgIn4iKSwgcHctPnB3X25hbWUpOworCWVudHJpZXNbaV0uc2hvd24gPSBlbnRyaWVzW2ldLnJlYWw7CisJZW50cmllc1tpXS5zdGF0RG9uZSA9IDE7CisJaWYgKGxlbiA+IG1heENoYXJzKQorCSAgICBtYXhDaGFycyA9IGxlbjsKKwlTRnN0cmR1cCgmU0Zsb2dpbnNbaV0ubmFtZSwgcHctPnB3X25hbWUpOworCVNGc3RyZHVwKCZTRmxvZ2luc1tpXS5kaXIsIHB3LT5wd19kaXIpOworCWkrKzsKKyAgICB9CisKKyAgICBTRmhvbWVEaXIuZGlyCQk9IFh0TWFsbG9jKDEpOworICAgIFNGaG9tZURpci5kaXJbMF0JCT0gMDsKKyAgICBTRmhvbWVEaXIucGF0aAkJPSBTRmN1cnJlbnRQYXRoOworICAgIFNGaG9tZURpci5lbnRyaWVzCQk9IGVudHJpZXM7CisgICAgU0Zob21lRGlyLm5FbnRyaWVzCQk9IGk7CisgICAgU0Zob21lRGlyLnZPcmlnaW4JCT0gMDsJLyogOi0pICovCisgICAgU0Zob21lRGlyLm5DaGFycwkJPSBtYXhDaGFycyArIDI7CisgICAgU0Zob21lRGlyLmhPcmlnaW4JCT0gMDsKKyAgICBTRmhvbWVEaXIuY2hhbmdlZAkJPSAxOworICAgIFNGaG9tZURpci5iZWdpblNlbGVjdGlvbgk9IC0xOworICAgIFNGaG9tZURpci5lbmRTZWxlY3Rpb24JPSAtMTsKKworICAgIHFzb3J0KChjaGFyICopZW50cmllcywgKHNpemVfdClpLCBzaXplb2YoU0ZFbnRyeSksIFNGY29tcGFyZUVudHJpZXMpOworICAgIHFzb3J0KChjaGFyICopU0Zsb2dpbnMsIChzaXplX3QpaSwgc2l6ZW9mKFNGTG9naW4pLCBTRmNvbXBhcmVMb2dpbnMpOworCisgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCSh2b2lkKXN0cmNhdChlbnRyaWVzW2ldLnJlYWwsICIvIik7Cit9CisKK3N0YXRpYyBpbnQgU0ZmaW5kSG9tZURpciBfX0FSR1MoKGNoYXIgKmJlZ2luLCBjaGFyICplbmQpKTsKKworICAgIHN0YXRpYyBpbnQKK1NGZmluZEhvbWVEaXIoYmVnaW4sIGVuZCkKKyAgICBjaGFyCSpiZWdpbiwgKmVuZDsKK3sKKyAgICBjaGFyCXNhdmU7CisgICAgY2hhcgkqdGhlUmVzdDsKKyAgICBpbnQJaTsKKworICAgIHNhdmUgPSAqZW5kOworICAgICplbmQgPSAwOworCisgICAgZm9yIChpID0gU0Zob21lRGlyLm5FbnRyaWVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworCWlmICghc3RyY21wKFNGaG9tZURpci5lbnRyaWVzW2ldLnJlYWwsIGJlZ2luKSkKKwl7CisJICAgICplbmQgPSBzYXZlOworCSAgICBTRnN0cmR1cCgmdGhlUmVzdCwgZW5kKTsKKwkgICAgKHZvaWQpIHN0cmNhdChzdHJjYXQoc3RyY3B5KFNGY3VycmVudFBhdGgsCisJCQkJCVNGbG9naW5zW2ldLmRpciksICIvIiksIHRoZVJlc3QpOworCSAgICBYdEZyZWUodGhlUmVzdCk7CisJICAgIFNGc2V0VGV4dChTRmN1cnJlbnRQYXRoKTsKKwkgICAgU0Z0ZXh0Q2hhbmdlZCgpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgKmVuZCA9IHNhdmU7CisKKyAgICByZXR1cm4gMDsKK30KKworICAgIHN0YXRpYyB2b2lkCitTRnVwZGF0ZVBhdGgoKQoreworICAgIHN0YXRpYyBpbnQJQWxsb2M7CisgICAgc3RhdGljIGludAl3YXNUd2lkZGxlID0gMDsKKyAgICBjaGFyCSpiZWdpbiwgKmVuZDsKKyAgICBpbnQJCWksIGo7CisgICAgaW50CQlwcmV2Q2hhbmdlOworICAgIGludAkJU0ZkaXJQdHJTYXZlLCBTRmRpckVuZFNhdmU7CisgICAgU0ZEaXIJKmRpcjsKKworICAgIGlmICghU0ZkaXJzKQorICAgIHsKKwlTRmRpcnMgPSAoU0ZEaXIgKikgWHRNYWxsb2MoKEFsbG9jID0gMTApICogc2l6ZW9mKFNGRGlyKSk7CisJZGlyID0gJihTRmRpcnNbMF0pOworCVNGc3RyZHVwKCZkaXItPmRpciwgIi8iKTsKKwkodm9pZCkgU0ZjaGRpcigiLyIpOworCSh2b2lkKSBTRmdldERpcihkaXIpOworCWZvciAoaiA9IDE7IGogPCBBbGxvYzsgaisrKQorCSAgICBTRmRpcnNbal0uZGlyID0gTlVMTDsKKwlkaXItPnBhdGggPSBTRmN1cnJlbnRQYXRoICsgMTsKKwlkaXItPnZPcmlnaW4gPSAwOworCWRpci0+aE9yaWdpbiA9IDA7CisJZGlyLT5jaGFuZ2VkID0gMTsKKwlkaXItPmJlZ2luU2VsZWN0aW9uID0gLTE7CisJZGlyLT5lbmRTZWxlY3Rpb24gPSAtMTsKKwlTRmhvbWVEaXIuZGlyID0gTlVMTDsKKyAgICB9CisKKyAgICBTRmRpckVuZFNhdmUgPSBTRmRpckVuZDsKKyAgICBTRmRpckVuZCA9IDE7CisKKyAgICBTRmRpclB0clNhdmUgPSBTRmRpclB0cjsKKyAgICBTRmRpclB0ciA9IDA7CisKKyAgICBiZWdpbiA9IE5VTEw7CisKKyAgICBpZiAoU0ZjdXJyZW50UGF0aFswXSA9PSAnficpCisgICAgeworCWlmICghU0Z0d2lkZGxlKQorCXsKKwkgICAgU0Z0d2lkZGxlID0gMTsKKwkgICAgZGlyID0gJihTRmRpcnNbMF0pOworCSAgICBTRnJvb3REaXIgPSAqZGlyOworCSAgICBpZiAoIVNGaG9tZURpci5kaXIpCisJCVNGZ2V0SG9tZURpcnMoKTsKKwkgICAgKmRpciA9IFNGaG9tZURpcjsKKwkgICAgZGlyLT5jaGFuZ2VkID0gMTsKKwl9CisJZW5kID0gU0ZjdXJyZW50UGF0aDsKKwlTRmRvTm90VG91Y2hEaXJQdHIgPSAxOworCXdhc1R3aWRkbGUgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChTRnR3aWRkbGUpCisJeworCSAgICBTRnR3aWRkbGUgPSAwOworCSAgICBkaXIgPSAmKFNGZGlyc1swXSk7CisJICAgICpkaXIgPSBTRnJvb3REaXI7CisJICAgIGRpci0+Y2hhbmdlZCA9IDE7CisJfQorCWVuZCA9IFNGY3VycmVudFBhdGggKyAxOworICAgIH0KKworICAgIGkgPSAwOworCisgICAgcHJldkNoYW5nZSA9IDA7CisKKyAgICB3aGlsZSAoKmVuZCkKKyAgICB7CisJd2hpbGUgKCplbmQrKyA9PSAnLycpCisJICAgIDsKKwllbmQtLTsKKwliZWdpbiA9IGVuZDsKKwl3aGlsZSAoKCplbmQpICYmICgqZW5kKysgIT0gJy8nKSkKKwkgICAgOworCWlmICgoZW5kIC0gU0ZjdXJyZW50UGF0aCA8PSBTRnRleHRQb3MpICYmICgqKGVuZCAtIDEpID09ICcvJykpCisJeworCSAgICBTRmRpclB0ciA9IGkgLSAxOworCSAgICBpZiAoU0ZkaXJQdHIgPCAwKQorCQlTRmRpclB0ciA9IDA7CisJfQorCWlmICgqYmVnaW4pCisJeworCSAgICBpZiAoKihlbmQgLSAxKSA9PSAnLycpCisJICAgIHsKKwkJY2hhciBzYXZlID0gKmVuZDsKKworCQlpZiAoU0Z0d2lkZGxlKQorCQl7CisJCSAgICBpZiAoU0ZmaW5kSG9tZURpcihiZWdpbiwgZW5kKSkKKwkJCXJldHVybjsKKwkJfQorCQkqZW5kID0gMDsKKwkJaSsrOworCQlTRmRpckVuZCsrOworCQlpZiAoaSA+PSBBbGxvYykKKwkJeworCQkgICAgU0ZkaXJzID0gKFNGRGlyICopIFh0UmVhbGxvYygoY2hhciAqKSBTRmRpcnMsCisJCQkJICAgICh1bnNpZ25lZCkoKEFsbG9jICo9IDIpICogc2l6ZW9mKFNGRGlyKSkpOworCQkgICAgZm9yIChqID0gQWxsb2MgLyAyOyBqIDwgQWxsb2M7IGorKykKKwkJCVNGZGlyc1tqXS5kaXIgPSBOVUxMOworCQl9CisJCWRpciA9ICYoU0ZkaXJzW2ldKTsKKwkJaWYgKCghKGRpci0+ZGlyKSkgfHwgcHJldkNoYW5nZSB8fCBzdHJjbXAoZGlyLT5kaXIsIGJlZ2luKSkKKwkJeworCQkgICAgaWYgKGRpci0+ZGlyKQorCQkJU0ZmcmVlKGkpOworCQkgICAgcHJldkNoYW5nZSA9IDE7CisJCSAgICBTRnN0cmR1cCgmZGlyLT5kaXIsIGJlZ2luKTsKKwkJICAgIGRpci0+cGF0aCA9IGVuZDsKKwkJICAgIGRpci0+dk9yaWdpbiA9IDA7CisJCSAgICBkaXItPmhPcmlnaW4gPSAwOworCQkgICAgZGlyLT5jaGFuZ2VkID0gMTsKKwkJICAgIGRpci0+YmVnaW5TZWxlY3Rpb24gPSAtMTsKKwkJICAgIGRpci0+ZW5kU2VsZWN0aW9uID0gLTE7CisJCSAgICAodm9pZClTRmZpbmRGaWxlKGRpciAtIDEsIGJlZ2luKTsKKwkJICAgIGlmIChTRmNoZGlyKFNGY3VycmVudFBhdGgpIHx8IFNGZ2V0RGlyKGRpcikpCisJCSAgICB7CisJCQlTRnVucmVhZGFibGVEaXIoZGlyKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCSplbmQgPSBzYXZlOworCQlpZiAoIXNhdmUpCisJCSAgICBTRnVuc2VsZWN0KCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChTRmZpbmRGaWxlKCYoU0ZkaXJzW1NGZGlyRW5kLTFdKSwgYmVnaW4pKQorCQkgICAgcmV0dXJuOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgU0Z1bnNlbGVjdCgpOworICAgIH0KKworICAgIGlmICgoZW5kID09IFNGY3VycmVudFBhdGggKyAxKSAmJiAoIVNGdHdpZGRsZSkpCisJU0Z1bnNlbGVjdCgpOworCisgICAgZm9yIChpID0gU0ZkaXJFbmQ7IGkgPCBBbGxvYzsgaSsrKQorCWlmIChTRmRpcnNbaV0uZGlyKQorCSAgICBTRmZyZWUoaSk7CisKKyAgICBpZiAoU0Zkb05vdFRvdWNoRGlyUHRyKQorICAgIHsKKwlpZiAod2FzVHdpZGRsZSkKKwl7CisJICAgIHdhc1R3aWRkbGUgPSAwOworCSAgICBTRmRpclB0ciA9IFNGZGlyRW5kIC0gMjsKKwkgICAgaWYgKFNGZGlyUHRyIDwgMCkKKwkJU0ZkaXJQdHIgPSAwOworCX0KKwllbHNlCisJICAgIFNGZGlyUHRyID0gU0ZkaXJQdHJTYXZlOworCVNGZG9Ob3RUb3VjaERpclB0ciA9IDA7CisgICAgfQorCisgICAgaWYgKChTRmRpclB0ciAhPSBTRmRpclB0clNhdmUpIHx8IChTRmRpckVuZCAhPSBTRmRpckVuZFNhdmUpKQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwlYYXdTY3JvbGxiYXJTZXRUaHVtYiggc2VsRmlsZUhTY3JvbGwsCisJCShmbG9hdCkgKCgoZG91YmxlKSBTRmRpclB0cikgLyBTRmRpckVuZCksCisJCShmbG9hdCkgKCgoZG91YmxlKSAoKFNGZGlyRW5kIDwgMykgPyBTRmRpckVuZCA6IDMpKSAvCisJCQkgU0ZkaXJFbmQpKTsKKyNlbHNlCisJdmltX1hhd1Njcm9sbGJhclNldFRodW1iKCBzZWxGaWxlSFNjcm9sbCwKKwkJKGZsb2F0KSAoKChkb3VibGUpIFNGZGlyUHRyKSAvIFNGZGlyRW5kKSwKKwkJKGZsb2F0KSAoKChkb3VibGUpICgoU0ZkaXJFbmQgPCAzKSA/IFNGZGlyRW5kIDogMykpIC8KKwkJCSBTRmRpckVuZCksCisJCShkb3VibGUpU0ZkaXJFbmQpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKFNGZGlyUHRyICE9IFNGZGlyUHRyU2F2ZSkKKwlTRmRyYXdMaXN0cyhTRl9ET19TQ1JPTEwpOworICAgIGVsc2UKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkgICAgaWYgKFNGZGlyUHRyICsgaSA8IFNGZGlyRW5kKQorCSAgICB7CisJCWlmIChTRmRpcnNbU0ZkaXJQdHIgKyBpXS5jaGFuZ2VkKQorCQl7CisJCSAgICBTRmRpcnNbU0ZkaXJQdHIgKyBpXS5jaGFuZ2VkID0gMDsKKwkJICAgIFNGZHJhd0xpc3QoaSwgU0ZfRE9fU0NST0xMKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJU0ZjbGVhckxpc3QoaSwgU0ZfRE9fU0NST0xMKTsKKwl9Cit9CisKKyNpZmRlZiBYdE5pbnRlcm5hdGlvbmFsCisgICAgc3RhdGljIGludAorV2NzTGVuKHApCisgICAgd2NoYXJfdCAqcDsKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKCpwKysgIT0gMCkKKwlpKys7CisgICAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCitTRnNldFRleHQocGF0aCkKKyAgICBjaGFyCSpwYXRoOworeworICAgIFhhd1RleHRCbG9jawl0ZXh0OworCisgICAgdGV4dC5maXJzdFBvcyA9IDA7CisgICAgdGV4dC5sZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgdGV4dC5wdHIgPSBwYXRoOworICAgIHRleHQuZm9ybWF0ID0gRk1UOEJJVDsKKworI2lmZGVmIFh0TmludGVybmF0aW9uYWwKKyAgICBpZiAoX1hhd1RleHRGb3JtYXQoKFRleHRXaWRnZXQpc2VsRmlsZUZpZWxkKSA9PSBYYXdGbXRXaWRlKQorICAgIHsKKwlYYXdUZXh0UmVwbGFjZShzZWxGaWxlRmllbGQsIChYYXdUZXh0UG9zaXRpb24pMCwKKwkJCQkgICAgKFhhd1RleHRQb3NpdGlvbilXY3NMZW4oKHdjaGFyX3QgKikmU0Z0ZXh0QnVmZmVyWzBdKSwgJnRleHQpOworCVhhd1RleHRTZXRJbnNlcnRpb25Qb2ludChzZWxGaWxlRmllbGQsCisJCQkJCSAgIChYYXdUZXh0UG9zaXRpb24pV2NzTGVuKCh3Y2hhcl90ICopJlNGdGV4dEJ1ZmZlclswXSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCVhhd1RleHRSZXBsYWNlKHNlbEZpbGVGaWVsZCwgKFhhd1RleHRQb3NpdGlvbikwLAorCQkJCSAgICAoWGF3VGV4dFBvc2l0aW9uKXN0cmxlbihTRnRleHRCdWZmZXIpLCAmdGV4dCk7CisJWGF3VGV4dFNldEluc2VydGlvblBvaW50KHNlbEZpbGVGaWVsZCwKKwkJCQkJICAgKFhhd1RleHRQb3NpdGlvbilzdHJsZW4oU0Z0ZXh0QnVmZmVyKSk7CisgICAgfQorI2Vsc2UKKyAgICBYYXdUZXh0UmVwbGFjZShzZWxGaWxlRmllbGQsIChYYXdUZXh0UG9zaXRpb24pMCwKKwkJCQkoWGF3VGV4dFBvc2l0aW9uKXN0cmxlbihTRnRleHRCdWZmZXIpLCAmdGV4dCk7CisgICAgWGF3VGV4dFNldEluc2VydGlvblBvaW50KHNlbEZpbGVGaWVsZCwKKwkJCQkgICAgICAgKFhhd1RleHRQb3NpdGlvbilzdHJsZW4oU0Z0ZXh0QnVmZmVyKSk7CisjZW5kaWYKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZidXR0b25QcmVzc0xpc3QodywgbiwgZXZlbnQpCisgICAgV2lkZ2V0CQl3OworICAgIGludAkJCW47CisgICAgWEJ1dHRvblByZXNzZWRFdmVudAkqZXZlbnQ7Cit7CisgICAgU0ZidXR0b25QcmVzc2VkID0gMTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZidXR0b25SZWxlYXNlTGlzdCh3LCBuLCBldmVudCkKKyAgICBXaWRnZXQJCSB3OworICAgIGludAkJCSBuOworICAgIFhCdXR0b25SZWxlYXNlZEV2ZW50ICpldmVudDsKK3sKKyAgICBTRkRpcgkqZGlyOworCisgICAgU0ZidXR0b25QcmVzc2VkID0gMDsKKworICAgIGlmIChTRmN1cnJlbnRJbnZlcnRbbl0gIT0gLTEpCisgICAgeworCWlmIChuIDwgMikKKwkgICAgU0Zkb05vdFRvdWNoRGlyUHRyID0gMTsKKwlTRmRvTm90VG91Y2hWb3JpZ2luID0gMTsKKwlkaXIgPSAmKFNGZGlyc1tTRmRpclB0ciArIG5dKTsKKwlTRnJlcGxhY2VUZXh0KGRpciwKKwkJICAgICAgIGRpci0+ZW50cmllc1tkaXItPnZPcmlnaW4gKyBTRmN1cnJlbnRJbnZlcnRbbl1dLnNob3duKTsKKwlTRm1vdGlvbkxpc3QodywgbiwgKFhNb3Rpb25FdmVudCAqKSBldmVudCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IFNGY2hlY2tEaXIgX19BUkdTKChpbnQgbiwgU0ZEaXIgKmRpcikpOworCisgICAgc3RhdGljIGludAorU0ZjaGVja0RpcihuLCBkaXIpCisgICAgaW50CQluOworICAgIFNGRGlyCQkqZGlyOworeworICAgIHN0cnVjdCBzdGF0CXN0YXRCdWY7CisgICAgaW50CQlpOworCisgICAgaWYgKCghbWNoX3N0YXQoIi4iLCAmc3RhdEJ1ZikpICYmIChzdGF0QnVmLnN0X210aW1lICE9IGRpci0+bXRpbWUpKQorICAgIHsKKwkvKgorCSAqIElmIHRoZSBwb2ludGVyIGlzIGN1cnJlbnRseSBpbiB0aGUgd2luZG93IHRoYXQgd2UgYXJlIGFib3V0CisJICogdG8gdXBkYXRlLCB3ZSBtdXN0IHdhcnAgaXQgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tCisJICogYWNjaWRlbnRhbGx5IHNlbGVjdGluZyB0aGUgd3JvbmcgZmlsZS4KKwkgKi8KKwlpZiAoU0ZjdXJyZW50SW52ZXJ0W25dICE9IC0xKQorCXsKKwkgICAgWFdhcnBQb2ludGVyKAorCQkgICAgU0ZkaXNwbGF5LAorCQkgICAgTm9uZSwKKwkJICAgIFh0V2luZG93KHNlbEZpbGVMaXN0c1tuXSksCisJCSAgICAwLAorCQkgICAgMCwKKwkJICAgIDAsCisJCSAgICAwLAorCQkgICAgMCwKKwkJICAgIDApOworCX0KKworCWZvciAoaSA9IGRpci0+bkVudHJpZXMgLSAxOyBpID49IDA7IGktLSkKKwl7CisJICAgIGlmIChkaXItPmVudHJpZXNbaV0uc2hvd24gIT0gZGlyLT5lbnRyaWVzW2ldLnJlYWwpCisJCVh0RnJlZShkaXItPmVudHJpZXNbaV0uc2hvd24pOworCSAgICBYdEZyZWUoZGlyLT5lbnRyaWVzW2ldLnJlYWwpOworCX0KKwlYdEZyZWUoKGNoYXIgKikgZGlyLT5lbnRyaWVzKTsKKwlpZiAoU0ZnZXREaXIoZGlyKSkKKwkgICAgU0Z1bnJlYWRhYmxlRGlyKGRpcik7CisJaWYgKGRpci0+dk9yaWdpbiA+IGRpci0+bkVudHJpZXMgLSBTRmxpc3RTaXplKQorCSAgICBkaXItPnZPcmlnaW4gPSBkaXItPm5FbnRyaWVzIC0gU0ZsaXN0U2l6ZTsKKwlpZiAoZGlyLT52T3JpZ2luIDwgMCkKKwkgICAgZGlyLT52T3JpZ2luID0gMDsKKwlpZiAoZGlyLT5oT3JpZ2luID4gZGlyLT5uQ2hhcnMgLSBTRmNoYXJzUGVyRW50cnkpCisJICAgIGRpci0+aE9yaWdpbiA9IGRpci0+bkNoYXJzIC0gU0ZjaGFyc1BlckVudHJ5OworCWlmIChkaXItPmhPcmlnaW4gPCAwKQorCSAgICBkaXItPmhPcmlnaW4gPSAwOworCWRpci0+YmVnaW5TZWxlY3Rpb24gPSAtMTsKKwlkaXItPmVuZFNlbGVjdGlvbiA9IC0xOworCVNGZG9Ob3RUb3VjaFZvcmlnaW4gPSAxOworCWlmICgoZGlyICsgMSktPmRpcikKKwkgICAgKHZvaWQpIFNGZmluZEZpbGUoZGlyLCAoZGlyICsgMSktPmRpcik7CisJZWxzZQorCSAgICAodm9pZCkgU0ZmaW5kRmlsZShkaXIsIGRpci0+cGF0aCk7CisKKwlpZiAoIVNGd29ya1Byb2NBZGRlZCkKKwl7CisJICAgICh2b2lkKSBYdEFwcEFkZFdvcmtQcm9jKFNGYXBwLCAoWHRXb3JrUHJvYylTRndvcmtQcm9jLCBOVUxMKTsKKwkgICAgU0Z3b3JrUHJvY0FkZGVkID0gMTsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFNGY2hlY2tGaWxlcyBfX0FSR1MoKFNGRGlyICpkaXIpKTsKKworICAgIHN0YXRpYyBpbnQKK1NGY2hlY2tGaWxlcyhkaXIpCisJU0ZEaXIJKmRpcjsKK3sKKyAgICBpbnQJCWZyb20sIHRvOworICAgIGludAkJcmVzdWx0OworICAgIGNoYXIJb2xkYywgbmV3YzsKKyAgICBpbnQJCWk7CisgICAgY2hhcgkqc3RyOworICAgIGludAkJbGFzdDsKKyAgICBzdHJ1Y3Qgc3RhdAlzdGF0QnVmOworCisgICAgcmVzdWx0ID0gMDsKKworICAgIGZyb20gPSBkaXItPnZPcmlnaW47CisgICAgdG8gPSBkaXItPnZPcmlnaW4gKyBTRmxpc3RTaXplOworICAgIGlmICh0byA+IGRpci0+bkVudHJpZXMpCisJdG8gPSBkaXItPm5FbnRyaWVzOworCisgICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyspCisgICAgeworCXN0ciA9IGRpci0+ZW50cmllc1tpXS5yZWFsOworCWxhc3QgPSBzdHJsZW4oc3RyKSAtIDE7CisJb2xkYyA9IHN0cltsYXN0XTsKKwlzdHJbbGFzdF0gPSAwOworCWlmIChtY2hfc3RhdChzdHIsICZzdGF0QnVmKSkKKwkgICAgbmV3YyA9ICcgJzsKKwllbHNlCisJICAgIG5ld2MgPSBTRnN0YXRDaGFyKCZzdGF0QnVmKTsKKwlzdHJbbGFzdF0gPSBuZXdjOworCWlmIChuZXdjICE9IG9sZGMpCisJICAgIHJlc3VsdCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZkaXJNb2RUaW1lcihjbCwgaWQpCisgICAgWHRQb2ludGVyCQljbDsKKyAgICBYdEludGVydmFsSWQJKmlkOworeworICAgIHN0YXRpYyBpbnQJCW4gPSAtMTsKKyAgICBzdGF0aWMgaW50CQlmID0gMDsKKyAgICBjaGFyCQlzYXZlOworICAgIFNGRGlyCQkqZGlyOworCisgICAgaWYgKCghU0Z0d2lkZGxlKSAmJiAoU0ZkaXJQdHIgPCBTRmRpckVuZCkpCisgICAgeworCW4rKzsKKwlpZiAoKG4gPiAyKSB8fCAoU0ZkaXJQdHIgKyBuID49IFNGZGlyRW5kKSkKKwl7CisJICAgIG4gPSAwOworCSAgICBmKys7CisJICAgIGlmICgoZiA+IDIpIHx8IChTRmRpclB0ciArIGYgPj0gU0ZkaXJFbmQpKQorCQlmID0gMDsKKwl9CisJZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyBuXSk7CisJc2F2ZSA9ICooZGlyLT5wYXRoKTsKKwkqKGRpci0+cGF0aCkgPSAwOworCWlmIChTRmNoZGlyKFNGY3VycmVudFBhdGgpKQorCXsKKwkgICAgKihkaXItPnBhdGgpID0gc2F2ZTsKKworCSAgICAvKgorCSAgICAgKiBmb3JjZSBhIHJlLXJlYWQKKwkgICAgICovCisJICAgICooZGlyLT5kaXIpID0gMDsKKworCSAgICBTRnVwZGF0ZVBhdGgoKTsKKwl9CisJZWxzZQorCXsKKwkgICAgKihkaXItPnBhdGgpID0gc2F2ZTsKKwkgICAgaWYgKFNGY2hlY2tEaXIobiwgZGlyKSB8fCAoKGYgPT0gbikgJiYgU0ZjaGVja0ZpbGVzKGRpcikpKQorCQlTRmRyYXdMaXN0KG4sIFNGX0RPX1NDUk9MTCk7CisJfQorICAgIH0KKworICAgIFNGZGlyTW9kVGltZXJJZCA9IFh0QXBwQWRkVGltZU91dChTRmFwcCwgKHVuc2lnbmVkIGxvbmcpIDEwMDAsCisJICAgIFNGZGlyTW9kVGltZXIsIChYdFBvaW50ZXIpIE5VTEwpOworfQorCisvKiBSZXR1cm4gYSBzaW5nbGUgY2hhcmFjdGVyIGRlc2NyaWJpbmcgd2hhdCBraW5kIG9mIGZpbGUgU1RBVEJVRiBpcy4gICovCisKKyAgICBzdGF0aWMgY2hhcgorU0ZzdGF0Q2hhcihzdGF0QnVmKQorICAgIHN0cnVjdCBzdGF0ICpzdGF0QnVmOworeworICAgIGlmIChTX0lTRElSIChzdGF0QnVmLT5zdF9tb2RlKSkKKwlyZXR1cm4gJy8nOworICAgIGlmIChTX0lTUkVHIChzdGF0QnVmLT5zdF9tb2RlKSkKKwlyZXR1cm4gU19JU1hYWCAoc3RhdEJ1Zi0+c3RfbW9kZSkgPyAnKicgOiAnICc7CisjaWZkZWYgU19JU1NPQ0sKKyAgICBpZiAoU19JU1NPQ0sgKHN0YXRCdWYtPnN0X21vZGUpKQorCXJldHVybiAnPSc7CisjZW5kaWYgLyogU19JU1NPQ0sgKi8KKyAgICByZXR1cm4gJyAnOworfQorCisvKioqKioqKioqKioqKioqKiogRHJhdy5jICovCisKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyMgaW5jbHVkZSA8WDExL25lWHRhdy9DYXJkaW5hbHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPFgxMS9YYXcvQ2FyZGluYWxzLmg+CisjZW5kaWYKKworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKyMgZGVmaW5lIFNGX0RFRkFVTFRfRk9OVCAiLW1pc2MtZml4ZWQtbWVkaXVtLXItbm9ybWFsLS0xNC0qIgorI2Vsc2UKKyMgZGVmaW5lIFNGX0RFRkFVTFRfRk9OVCAiOXgxNSIKKyNlbmRpZgorCisjaWZkZWYgQUJTCisjIHVuZGVmIEFCUworI2VuZGlmCisjZGVmaW5lIEFCUyh4KSAoKCh4KSA8IDApID8gKC0oeCkpIDogKHgpKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgKmZvbnRuYW1lOworfSBUZXh0RGF0YTsKKworc3RhdGljIEdDIFNGbGluZUdDLCBTRnNjcm9sbEdDLCBTRmludmVydEdDLCBTRnRleHRHQzsKKworc3RhdGljIFh0UmVzb3VyY2UgdGV4dFJlc291cmNlc1tdID0KK3sKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJe1h0TmZvbnRTZXQsIFh0Q0ZvbnRTZXQsIFh0UlN0cmluZywgc2l6ZW9mIChjaGFyICopLAorCQlYdE9mZnNldE9mKFRleHREYXRhLCBmb250bmFtZSksIFh0UlN0cmluZywgU0ZfREVGQVVMVF9GT05UfSwKKyNlbHNlCisJe1h0TmZvbnQsIFh0Q0ZvbnQsIFh0UlN0cmluZywgc2l6ZW9mIChjaGFyICopLAorCQlYdE9mZnNldE9mKFRleHREYXRhLCBmb250bmFtZSksIFh0UlN0cmluZywgU0ZfREVGQVVMVF9GT05UfSwKKyNlbmRpZgorfTsKKworI2lmZGVmIEZFQVRfWEZPTlRTRVQKK3N0YXRpYyBYRm9udFNldCBTRmZvbnQ7CisjZWxzZQorc3RhdGljIFhGb250U3RydWN0ICpTRmZvbnQ7CisjZW5kaWYKKworc3RhdGljIGludCBTRmN1cnJlbnRMaXN0WTsKKworc3RhdGljIFh0SW50ZXJ2YWxJZCBTRnNjcm9sbFRpbWVySWQ7CisKK3N0YXRpYyB2b2lkIFNGaW5pdEZvbnQgX19BUkdTKCh2b2lkKSk7CisKKyAgICBzdGF0aWMgdm9pZAorU0Zpbml0Rm9udCgpCit7CisgICAgVGV4dERhdGEJKmRhdGE7CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIFhGb250U2V0RXh0ZW50cyAqZXh0ZW50czsKKyAgICBjaGFyICoqbWlzc2luZywgKmRlZl9zdHI7CisgICAgaW50ICBudW1fbWlzc2luZzsKKyNlbmRpZgorCisgICAgZGF0YSA9IFh0TmV3KFRleHREYXRhKTsKKworICAgIFh0R2V0QXBwbGljYXRpb25SZXNvdXJjZXMoc2VsRmlsZUZvcm0sIChYdFBvaW50ZXIpIGRhdGEsIHRleHRSZXNvdXJjZXMsCisJICAgIFh0TnVtYmVyKHRleHRSZXNvdXJjZXMpLCAoQXJnICopIE5VTEwsIFpFUk8pOworCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIFNGZm9udCA9IFhDcmVhdGVGb250U2V0KFNGZGlzcGxheSwgZGF0YS0+Zm9udG5hbWUsCisJCQkgICAgJm1pc3NpbmcsICZudW1fbWlzc2luZywgJmRlZl9zdHIpOworI2Vsc2UKKyAgICBTRmZvbnQgPSBYTG9hZFF1ZXJ5Rm9udChTRmRpc3BsYXksIGRhdGEtPmZvbnRuYW1lKTsKKyNlbmRpZgorICAgIGlmICghU0Zmb250KQorICAgIHsKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJU0Zmb250ID0gWENyZWF0ZUZvbnRTZXQoU0ZkaXNwbGF5LCBTRl9ERUZBVUxUX0ZPTlQsCisJCQkJCSAgICAmbWlzc2luZywgJm51bV9taXNzaW5nLCAmZGVmX3N0cik7CisjZWxzZQorCVNGZm9udCA9IFhMb2FkUXVlcnlGb250KFNGZGlzcGxheSwgU0ZfREVGQVVMVF9GT05UKTsKKyNlbmRpZgorCWlmICghU0Zmb250KQorCXsKKwkgICAgRU1TRzIoXygiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIiksIFNGX0RFRkFVTFRfRk9OVCk7CisJICAgIFNGc3RhdHVzID0gU0VMX0ZJTEVfQ0FOQ0VMOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBleHRlbnRzID0gWEV4dGVudHNPZkZvbnRTZXQoU0Zmb250KTsKKyAgICBTRmNoYXJXaWR0aCA9IGV4dGVudHMtPm1heF9sb2dpY2FsX2V4dGVudC53aWR0aDsKKyAgICBTRmNoYXJBc2NlbnQgPSAtZXh0ZW50cy0+bWF4X2xvZ2ljYWxfZXh0ZW50Lnk7CisgICAgU0ZjaGFySGVpZ2h0ID0gZXh0ZW50cy0+bWF4X2xvZ2ljYWxfZXh0ZW50LmhlaWdodDsKKyNlbHNlCisgICAgU0ZjaGFyV2lkdGggPSAoU0Zmb250LT5tYXhfYm91bmRzLndpZHRoICsgU0Zmb250LT5taW5fYm91bmRzLndpZHRoKSAvIDI7CisgICAgU0ZjaGFyQXNjZW50ID0gU0Zmb250LT5tYXhfYm91bmRzLmFzY2VudDsKKyAgICBTRmNoYXJIZWlnaHQgPSBTRmNoYXJBc2NlbnQgKyBTRmZvbnQtPm1heF9ib3VuZHMuZGVzY2VudDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBTRmNyZWF0ZUdDIF9fQVJHUygodm9pZCkpOworCisgICAgc3RhdGljIHZvaWQKK1NGY3JlYXRlR0MoKQoreworICAgIFhHQ1ZhbHVlcwlnY1ZhbHVlczsKKyAgICBYUmVjdGFuZ2xlCXJlY3RhbmdsZXNbMV07CisKKyAgICBnY1ZhbHVlcy5mb3JlZ3JvdW5kID0gU0Zmb3JlOworCisgICAgU0ZsaW5lR0MgPSBYdEdldEdDKAorCSAgICBzZWxGaWxlTGlzdHNbMF0sCisJICAgIChYdEdDTWFzaylHQ0ZvcmVncm91bmQsCisJICAgICZnY1ZhbHVlcyk7CisKKyAgICBTRnNjcm9sbEdDID0gWHRHZXRHQygKKwkgICAgc2VsRmlsZUxpc3RzWzBdLAorCSAgICAoWHRHQ01hc2spMCwKKwkgICAgJmdjVmFsdWVzKTsKKworICAgIGdjVmFsdWVzLmZ1bmN0aW9uID0gR1h4b3I7CisgICAgZ2NWYWx1ZXMuZm9yZWdyb3VuZCA9IFNGZm9yZSBeIFNGYmFjazsKKyAgICBnY1ZhbHVlcy5iYWNrZ3JvdW5kID0gU0Zmb3JlIF4gU0ZiYWNrOworCisgICAgU0ZpbnZlcnRHQyA9IFh0R2V0R0MoCisJICAgIHNlbEZpbGVMaXN0c1swXSwKKwkgICAgKFh0R0NNYXNrKUdDRnVuY3Rpb24gfCBHQ0ZvcmVncm91bmQgfCBHQ0JhY2tncm91bmQsCisJICAgICZnY1ZhbHVlcyk7CisKKyAgICBnY1ZhbHVlcy5mb3JlZ3JvdW5kID0gU0Zmb3JlOworICAgIGdjVmFsdWVzLmJhY2tncm91bmQgPSBTRmJhY2s7CisjaWZuZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBnY1ZhbHVlcy5mb250ID0gU0Zmb250LT5maWQ7CisjZW5kaWYKKworICAgIFNGdGV4dEdDID0gWENyZWF0ZUdDKAorCSAgICBTRmRpc3BsYXksCisJICAgIFh0V2luZG93KHNlbEZpbGVMaXN0c1swXSksCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCSAgICAodW5zaWduZWQgbG9uZylHQ0ZvcmVncm91bmQgfCBHQ0JhY2tncm91bmQsCisjZWxzZQorCSAgICAodW5zaWduZWQgbG9uZylHQ0ZvcmVncm91bmQgfCBHQ0JhY2tncm91bmQgfCBHQ0ZvbnQsCisjZW5kaWYKKwkgICAgJmdjVmFsdWVzKTsKKworICAgIHJlY3RhbmdsZXNbMF0ueCA9IFNGbGluZVRvVGV4dEggKyBTRmJlc2lkZVRleHQ7CisgICAgcmVjdGFuZ2xlc1swXS55ID0gMDsKKyAgICByZWN0YW5nbGVzWzBdLndpZHRoID0gU0ZjaGFyc1BlckVudHJ5ICogU0ZjaGFyV2lkdGg7CisgICAgcmVjdGFuZ2xlc1swXS5oZWlnaHQgPSBTRnVwcGVyWSArIDE7CisKKyAgICBYU2V0Q2xpcFJlY3RhbmdsZXMoCisJICAgIFNGZGlzcGxheSwKKwkgICAgU0Z0ZXh0R0MsCisJICAgIDAsCisJICAgIDAsCisJICAgIHJlY3RhbmdsZXMsCisJICAgIDEsCisJICAgIFVuc29ydGVkKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitTRmNsZWFyTGlzdChuLCBkb1Njcm9sbCkKKyAgICBpbnQJbjsKKyAgICBpbnQJZG9TY3JvbGw7Cit7CisgICAgU0ZEaXIJKmRpcjsKKworICAgIFNGY3VycmVudEludmVydFtuXSA9IC0xOworCisgICAgWENsZWFyV2luZG93KFNGZGlzcGxheSwgWHRXaW5kb3coc2VsRmlsZUxpc3RzW25dKSk7CisKKyAgICBYRHJhd1NlZ21lbnRzKFNGZGlzcGxheSwgWHRXaW5kb3coc2VsRmlsZUxpc3RzW25dKSwgU0ZsaW5lR0MsIFNGc2VncywgMik7CisKKyAgICBpZiAoZG9TY3JvbGwpCisgICAgeworCWRpciA9ICYoU0ZkaXJzW1NGZGlyUHRyICsgbl0pOworCisJaWYgKChTRmRpclB0ciArIG4gPCBTRmRpckVuZCkgJiYgZGlyLT5uRW50cmllcyAmJiBkaXItPm5DaGFycykKKwl7CisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisJICAgIFhhd1Njcm9sbGJhclNldFRodW1iKAorCQkgICAgc2VsRmlsZVZTY3JvbGxzW25dLAorCQkgICAgKGZsb2F0KSAoKChkb3VibGUpIGRpci0+dk9yaWdpbikgLworCQkJICAgICBkaXItPm5FbnRyaWVzKSwKKwkJICAgIChmbG9hdCkgKCgoZG91YmxlKSAoKGRpci0+bkVudHJpZXMgPCBTRmxpc3RTaXplKQorCQkJCQk/IGRpci0+bkVudHJpZXMgOiBTRmxpc3RTaXplKSkgLworCQkJICAgICBkaXItPm5FbnRyaWVzKSk7CisjZWxzZQorCSAgICB2aW1fWGF3U2Nyb2xsYmFyU2V0VGh1bWIoCisJCSAgICBzZWxGaWxlVlNjcm9sbHNbbl0sCisJCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgZGlyLT52T3JpZ2luKSAvCisJCQkgICAgIGRpci0+bkVudHJpZXMpLAorCQkgICAgKGZsb2F0KSAoKChkb3VibGUpICgoZGlyLT5uRW50cmllcyA8IFNGbGlzdFNpemUpCisJCQkJCT8gZGlyLT5uRW50cmllcyA6IFNGbGlzdFNpemUpKSAvCisJCQkgICAgIGRpci0+bkVudHJpZXMpLAorCQkgICAgKGRvdWJsZSlkaXItPm5FbnRyaWVzKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisJICAgIFhhd1Njcm9sbGJhclNldFRodW1iKAorCQkgICAgc2VsRmlsZUhTY3JvbGxzW25dLAorCQkgICAgKGZsb2F0KSAoKChkb3VibGUpIGRpci0+aE9yaWdpbikgLyBkaXItPm5DaGFycyksCisJCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgKChkaXItPm5DaGFycyA8CisJCQkJCSBTRmNoYXJzUGVyRW50cnkpID8gZGlyLT5uQ2hhcnMgOgorCQkJCQlTRmNoYXJzUGVyRW50cnkpKSAvIGRpci0+bkNoYXJzKSk7CisjZWxzZQorCSAgICB2aW1fWGF3U2Nyb2xsYmFyU2V0VGh1bWIoCisJCSAgICBzZWxGaWxlSFNjcm9sbHNbbl0sCisJCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgZGlyLT5oT3JpZ2luKSAvIGRpci0+bkNoYXJzKSwKKwkJICAgIChmbG9hdCkgKCgoZG91YmxlKSAoKGRpci0+bkNoYXJzIDwKKwkJCQkJIFNGY2hhcnNQZXJFbnRyeSkgPyBkaXItPm5DaGFycyA6CisJCQkJCVNGY2hhcnNQZXJFbnRyeSkpIC8gZGlyLT5uQ2hhcnMpLAorCQkgICAgKGRvdWJsZSlkaXItPm5DaGFycyk7CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwkgICAgWGF3U2Nyb2xsYmFyU2V0VGh1bWIoc2VsRmlsZVZTY3JvbGxzW25dLCAoZmxvYXQpIDAuMCwKKwkJICAgIChmbG9hdCkgMS4wKTsKKyNlbHNlCisJICAgIHZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYihzZWxGaWxlVlNjcm9sbHNbbl0sIChmbG9hdCkgMC4wLAorCQkgICAgKGZsb2F0KSAxLjAsIDEuMCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwkgICAgWGF3U2Nyb2xsYmFyU2V0VGh1bWIoc2VsRmlsZUhTY3JvbGxzW25dLCAoZmxvYXQpIDAuMCwKKwkJICAgIChmbG9hdCkgMS4wKTsKKyNlbHNlCisJICAgIHZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYihzZWxGaWxlSFNjcm9sbHNbbl0sIChmbG9hdCkgMC4wLAorCQkgICAgKGZsb2F0KSAxLjAsIDEuMCk7CisjZW5kaWYKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBTRmRlbGV0ZUVudHJ5IF9fQVJHUygoU0ZEaXIgKmRpciwgU0ZFbnRyeSAqZW50cnkpKTsKKworICAgIHN0YXRpYyB2b2lkCitTRmRlbGV0ZUVudHJ5KGRpciwgZW50cnkpCisgICAgU0ZEaXIJKmRpcjsKKyAgICBTRkVudHJ5CSplbnRyeTsKK3sKKyAgICBTRkVudHJ5CSplOworICAgIFNGRW50cnkJKmVuZDsKKyAgICBpbnQJCW47CisgICAgaW50CQlpZHg7CisKKyAgICBpZHggPSBlbnRyeSAtIGRpci0+ZW50cmllczsKKworICAgIGlmIChpZHggPCBkaXItPmJlZ2luU2VsZWN0aW9uKQorCWRpci0+YmVnaW5TZWxlY3Rpb24tLTsKKyAgICBpZiAoaWR4IDw9IGRpci0+ZW5kU2VsZWN0aW9uKQorCWRpci0+ZW5kU2VsZWN0aW9uLS07CisgICAgaWYgKGRpci0+YmVnaW5TZWxlY3Rpb24gPiBkaXItPmVuZFNlbGVjdGlvbikKKwlkaXItPmJlZ2luU2VsZWN0aW9uID0gZGlyLT5lbmRTZWxlY3Rpb24gPSAtMTsKKworICAgIGlmIChpZHggPCBkaXItPnZPcmlnaW4pCisJZGlyLT52T3JpZ2luLS07CisKKyAgICBYdEZyZWUoZW50cnktPnJlYWwpOworCisgICAgZW5kID0gJihkaXItPmVudHJpZXNbZGlyLT5uRW50cmllcyAtIDFdKTsKKworICAgIGZvciAoZSA9IGVudHJ5OyBlIDwgZW5kOyBlKyspCisJKmUgPSAqKGUgKyAxKTsKKworICAgIGlmICghKC0tZGlyLT5uRW50cmllcykpCisJcmV0dXJuOworCisgICAgbiA9IGRpciAtICYoU0ZkaXJzW1NGZGlyUHRyXSk7CisgICAgaWYgKChuIDwgMCkgfHwgKG4gPiAyKSkKKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyAgICBYYXdTY3JvbGxiYXJTZXRUaHVtYigKKwkgICAgc2VsRmlsZVZTY3JvbGxzW25dLAorCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgZGlyLT52T3JpZ2luKSAvIGRpci0+bkVudHJpZXMpLAorCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgKChkaXItPm5FbnRyaWVzIDwgU0ZsaXN0U2l6ZSkgPworCQkJCWRpci0+bkVudHJpZXMgOiBTRmxpc3RTaXplKSkgLyBkaXItPm5FbnRyaWVzKSk7CisjZWxzZQorICAgIHZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYigKKwkgICAgc2VsRmlsZVZTY3JvbGxzW25dLAorCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgZGlyLT52T3JpZ2luKSAvIGRpci0+bkVudHJpZXMpLAorCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgKChkaXItPm5FbnRyaWVzIDwgU0ZsaXN0U2l6ZSkgPworCQkJCWRpci0+bkVudHJpZXMgOiBTRmxpc3RTaXplKSkgLyBkaXItPm5FbnRyaWVzKSwKKwkgICAgKGRvdWJsZSlkaXItPm5FbnRyaWVzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBTRndyaXRlU3RhdENoYXIgX19BUkdTKChjaGFyICpuYW1lLCBpbnQgbGFzdCwgc3RydWN0IHN0YXQgKnN0YXRCdWYpKTsKKworICAgIHN0YXRpYyB2b2lkCitTRndyaXRlU3RhdENoYXIobmFtZSwgbGFzdCwgc3RhdEJ1ZikKKyAgICBjaGFyCSpuYW1lOworICAgIGludAkJbGFzdDsKKyAgICBzdHJ1Y3Qgc3RhdAkqc3RhdEJ1ZjsKK3sKKyAgICBuYW1lW2xhc3RdID0gU0ZzdGF0Q2hhcihzdGF0QnVmKTsKK30KKworc3RhdGljIGludCBTRnN0YXRBbmRDaGVjayBfX0FSR1MoKFNGRGlyICpkaXIsIFNGRW50cnkgKmVudHJ5KSk7CisKKyAgICBzdGF0aWMgaW50CitTRnN0YXRBbmRDaGVjayhkaXIsIGVudHJ5KQorICAgIFNGRGlyCSpkaXI7CisgICAgU0ZFbnRyeQkqZW50cnk7Cit7CisgICAgc3RydWN0IHN0YXQJc3RhdEJ1ZjsKKyAgICBjaGFyCXNhdmU7CisgICAgaW50CQlsYXN0OworCisgICAgLyoKKyAgICAgKiBtdXN0IGJlIHJlc3RvcmVkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKi8KKyAgICBzYXZlID0gKihkaXItPnBhdGgpOworICAgICooZGlyLT5wYXRoKSA9IDA7CisKKyAgICBpZiAoIVNGY2hkaXIoU0ZjdXJyZW50UGF0aCkpCisgICAgeworCWxhc3QgPSBzdHJsZW4oZW50cnktPnJlYWwpIC0gMTsKKwllbnRyeS0+cmVhbFtsYXN0XSA9IDA7CisJZW50cnktPnN0YXREb25lID0gMTsKKwlpZiAoKCFtY2hfc3RhdChlbnRyeS0+cmVhbCwgJnN0YXRCdWYpKQorI2lmZGVmIFNfSUZMTksKKwkJfHwgKCFtY2hfbHN0YXQoZW50cnktPnJlYWwsICZzdGF0QnVmKSkKKyNlbmRpZgorCSAgICkKKwl7CisJICAgIGlmIChTRmZ1bmMpCisJICAgIHsKKwkJY2hhciAqc2hvd247CisKKwkJc2hvd24gPSBOVUxMOworCQlpZiAoU0ZmdW5jKGVudHJ5LT5yZWFsLCAmc2hvd24sICZzdGF0QnVmKSkKKwkJeworCQkgICAgaWYgKHNob3duKQorCQkgICAgeworCQkJaW50IGxlbjsKKworCQkJbGVuID0gc3RybGVuKHNob3duKTsKKwkJCWVudHJ5LT5zaG93biA9IFh0TWFsbG9jKCh1bnNpZ25lZCkgKGxlbiArIDIpKTsKKwkJCSh2b2lkKSBzdHJjcHkoZW50cnktPnNob3duLCBzaG93bik7CisJCQlTRndyaXRlU3RhdENoYXIoZW50cnktPnNob3duLCBsZW4sICZzdGF0QnVmKTsKKwkJCWVudHJ5LT5zaG93bltsZW4gKyAxXSA9IDA7CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBTRmRlbGV0ZUVudHJ5KGRpciwgZW50cnkpOworCisJCSAgICAqKGRpci0+cGF0aCkgPSBzYXZlOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkgICAgfQorCSAgICBTRndyaXRlU3RhdENoYXIoZW50cnktPnJlYWwsIGxhc3QsICZzdGF0QnVmKTsKKwl9CisJZWxzZQorCSAgICBlbnRyeS0+cmVhbFtsYXN0XSA9ICcgJzsKKyAgICB9CisKKyAgICAqKGRpci0+cGF0aCkgPSBzYXZlOworICAgIHJldHVybiAwOworfQorCisKKyAgICBzdGF0aWMgdm9pZAorU0ZkcmF3U3RyaW5ncyh3LCBkaXIsIGZyb20sIHRvKQorICAgIFdpbmRvdwl3OworICAgIFNGRGlyCSpkaXI7CisgICAgaW50CQlmcm9tOworICAgIGludAkJdG87Cit7CisgICAgaW50CQlpOworICAgIFNGRW50cnkJKmVudHJ5OworICAgIGludAkJeDsKKworICAgIHggPSBTRnRleHRYIC0gZGlyLT5oT3JpZ2luICogU0ZjaGFyV2lkdGg7CisKKyAgICBpZiAoZGlyLT52T3JpZ2luICsgdG8gPj0gZGlyLT5uRW50cmllcykKKwl0byA9IGRpci0+bkVudHJpZXMgLSBkaXItPnZPcmlnaW4gLSAxOworICAgIGZvciAoaSA9IGZyb207IGkgPD0gdG87IGkrKykKKyAgICB7CisJZW50cnkgPSAmKGRpci0+ZW50cmllc1tkaXItPnZPcmlnaW4gKyBpXSk7CisJaWYgKCEoZW50cnktPnN0YXREb25lKSkKKwl7CisJICAgIGlmIChTRnN0YXRBbmRDaGVjayhkaXIsIGVudHJ5KSkKKwkgICAgeworCQlpZiAoZGlyLT52T3JpZ2luICsgdG8gPj0gZGlyLT5uRW50cmllcykKKwkJICAgIHRvID0gZGlyLT5uRW50cmllcyAtIGRpci0+dk9yaWdpbiAtIDE7CisJCWktLTsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCVhtYkRyYXdJbWFnZVN0cmluZygKKwkJU0ZkaXNwbGF5LAorCQl3LAorCQlTRmZvbnQsCisJCVNGdGV4dEdDLAorCQl4LAorCQlTRnRleHRZb2Zmc2V0ICsgaSAqIFNGZW50cnlIZWlnaHQsCisJCWVudHJ5LT5zaG93biwKKwkJc3RybGVuKGVudHJ5LT5zaG93bikpOworI2Vsc2UKKwlYRHJhd0ltYWdlU3RyaW5nKAorCQlTRmRpc3BsYXksCisJCXcsCisJCVNGdGV4dEdDLAorCQl4LAorCQlTRnRleHRZb2Zmc2V0ICsgaSAqIFNGZW50cnlIZWlnaHQsCisJCWVudHJ5LT5zaG93biwKKwkJc3RybGVuKGVudHJ5LT5zaG93bikpOworI2VuZGlmCisJaWYgKGRpci0+dk9yaWdpbiArIGkgPT0gZGlyLT5iZWdpblNlbGVjdGlvbikKKwl7CisJICAgIFhEcmF3TGluZSgKKwkJICAgIFNGZGlzcGxheSwKKwkJICAgIHcsCisJCSAgICBTRmxpbmVHQywKKwkJICAgIFNGbGluZVRvVGV4dEggKyAxLAorCQkgICAgU0Zsb3dlclkgKyBpICogU0ZlbnRyeUhlaWdodCwKKwkJICAgIFNGbGluZVRvVGV4dEggKyBTRmVudHJ5V2lkdGggLSAyLAorCQkgICAgU0Zsb3dlclkgKyBpICogU0ZlbnRyeUhlaWdodCk7CisJfQorCWlmICgoZGlyLT52T3JpZ2luICsgaSA+PSBkaXItPmJlZ2luU2VsZWN0aW9uKSAmJgorCQkoZGlyLT52T3JpZ2luICsgaSA8PSBkaXItPmVuZFNlbGVjdGlvbikpCisJeworCSAgICBTRmNvbXBsZXRpb25TZWdzWzBdLnkxID0gU0Zjb21wbGV0aW9uU2Vnc1sxXS55MSA9CisJCVNGbG93ZXJZICsgaSAqIFNGZW50cnlIZWlnaHQ7CisJICAgIFNGY29tcGxldGlvblNlZ3NbMF0ueTIgPSBTRmNvbXBsZXRpb25TZWdzWzFdLnkyID0KKwkJU0Zsb3dlclkgKyAoaSArIDEpICogU0ZlbnRyeUhlaWdodCAtIDE7CisJICAgIFhEcmF3U2VnbWVudHMoCisJCSAgICBTRmRpc3BsYXksCisJCSAgICB3LAorCQkgICAgU0ZsaW5lR0MsCisJCSAgICBTRmNvbXBsZXRpb25TZWdzLAorCQkgICAgMik7CisJfQorCWlmIChkaXItPnZPcmlnaW4gKyBpID09IGRpci0+ZW5kU2VsZWN0aW9uKQorCXsKKwkgICAgWERyYXdMaW5lKAorCQkgICAgU0ZkaXNwbGF5LAorCQkgICAgdywKKwkJICAgIFNGbGluZUdDLAorCQkgICAgU0ZsaW5lVG9UZXh0SCArIDEsCisJCSAgICBTRmxvd2VyWSArIChpICsgMSkgKiBTRmVudHJ5SGVpZ2h0IC0gMSwKKwkJICAgIFNGbGluZVRvVGV4dEggKyBTRmVudHJ5V2lkdGggLSAyLAorCQkgICAgU0Zsb3dlclkgKyAoaSArIDEpICogU0ZlbnRyeUhlaWdodCAtIDEpOworCX0KKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorU0ZkcmF3TGlzdChuLCBkb1Njcm9sbCkKKyAgICBpbnQJbjsKKyAgICBpbnQJZG9TY3JvbGw7Cit7CisgICAgU0ZEaXIJKmRpcjsKKyAgICBXaW5kb3cJdzsKKworICAgIFNGY2xlYXJMaXN0KG4sIGRvU2Nyb2xsKTsKKworICAgIGlmIChTRmRpclB0ciArIG4gPCBTRmRpckVuZCkKKyAgICB7CisJZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyBuXSk7CisJdyA9IFh0V2luZG93KHNlbEZpbGVMaXN0c1tuXSk7CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCVhtYkRyYXdJbWFnZVN0cmluZygKKwkJU0ZkaXNwbGF5LAorCQl3LAorCQlTRmZvbnQsCisJCVNGdGV4dEdDLAorCQlTRnRleHRYIC0gZGlyLT5oT3JpZ2luICogU0ZjaGFyV2lkdGgsCisJCVNGbGluZVRvVGV4dFYgKyBTRmFib3ZlQW5kQmVsb3dUZXh0ICsgU0ZjaGFyQXNjZW50LAorCQlkaXItPmRpciwKKwkJc3RybGVuKGRpci0+ZGlyKSk7CisjZWxzZQorCVhEcmF3SW1hZ2VTdHJpbmcoCisJCVNGZGlzcGxheSwKKwkJdywKKwkJU0Z0ZXh0R0MsCisJCVNGdGV4dFggLSBkaXItPmhPcmlnaW4gKiBTRmNoYXJXaWR0aCwKKwkJU0ZsaW5lVG9UZXh0ViArIFNGYWJvdmVBbmRCZWxvd1RleHQgKyBTRmNoYXJBc2NlbnQsCisJCWRpci0+ZGlyLAorCQlzdHJsZW4oZGlyLT5kaXIpKTsKKyNlbmRpZgorCVNGZHJhd1N0cmluZ3ModywgZGlyLCAwLCBTRmxpc3RTaXplIC0gMSk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK1NGZHJhd0xpc3RzKGRvU2Nyb2xsKQorICAgIGludAlkb1Njcm9sbDsKK3sKKyAgICBpbnQJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJU0ZkcmF3TGlzdChpLCBkb1Njcm9sbCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorU0ZpbnZlcnRFbnRyeShuKQorICAgIGludAkJbjsKK3sKKyAgICBYRmlsbFJlY3RhbmdsZSgKKwkgICAgU0ZkaXNwbGF5LAorCSAgICBYdFdpbmRvdyhzZWxGaWxlTGlzdHNbbl0pLAorCSAgICBTRmludmVydEdDLAorCSAgICBTRmxpbmVUb1RleHRILAorCSAgICBTRmN1cnJlbnRJbnZlcnRbbl0gKiBTRmVudHJ5SGVpZ2h0ICsgU0Zsb3dlclksCisJICAgIFNGZW50cnlXaWR0aCwKKwkgICAgU0ZlbnRyeUhlaWdodCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNGc2Nyb2xsVGltZXJJbnRlcnZhbCBfX0FSR1MoKHZvaWQpKTsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nCitTRnNjcm9sbFRpbWVySW50ZXJ2YWwoKQoreworICAgIHN0YXRpYyBpbnQJbWF4VmFsID0gMjAwOworICAgIHN0YXRpYyBpbnQJdmFyeURpc3QgPSA1MDsKKyAgICBzdGF0aWMgaW50CW1pbkRpc3QgPSA1MDsKKyAgICBpbnQJCXQ7CisgICAgaW50CQlkaXN0OworCisgICAgaWYgKFNGY3VycmVudExpc3RZIDwgU0Zsb3dlclkpCisJZGlzdCA9IFNGbG93ZXJZIC0gU0ZjdXJyZW50TGlzdFk7CisgICAgZWxzZSBpZiAoU0ZjdXJyZW50TGlzdFkgPiBTRnVwcGVyWSkKKwlkaXN0ID0gU0ZjdXJyZW50TGlzdFkgLSBTRnVwcGVyWTsKKyAgICBlbHNlCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAxOworCisgICAgdCA9IG1heFZhbCAtICgobWF4VmFsIC8gdmFyeURpc3QpICogKGRpc3QgLSBtaW5EaXN0KSk7CisKKyAgICBpZiAodCA8IDEpCisJdCA9IDE7CisKKyAgICBpZiAodCA+IG1heFZhbCkKKwl0ID0gbWF4VmFsOworCisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXQ7Cit9CisKK3N0YXRpYyB2b2lkIFNGc2Nyb2xsVGltZXIgX19BUkdTKChYdFBvaW50ZXIgcCwgWHRJbnRlcnZhbElkICppZCkpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRnNjcm9sbFRpbWVyKHAsIGlkKQorICAgIFh0UG9pbnRlcgkJcDsKKyAgICBYdEludGVydmFsSWQJKmlkOworeworICAgIFNGRGlyCSpkaXI7CisgICAgaW50CQlzYXZlOworICAgIGludAkJbjsKKworICAgIG4gPSAobG9uZylwOworCisgICAgZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyBuXSk7CisgICAgc2F2ZSA9IGRpci0+dk9yaWdpbjsKKworICAgIGlmIChTRmN1cnJlbnRMaXN0WSA8IFNGbG93ZXJZKQorICAgIHsKKwlpZiAoZGlyLT52T3JpZ2luID4gMCkKKwkgICAgU0Z2U2xpZGVyTW92ZWRDYWxsYmFjayhzZWxGaWxlVlNjcm9sbHNbbl0sIG4sIGRpci0+dk9yaWdpbiAtIDEpOworICAgIH0KKyAgICBlbHNlIGlmIChTRmN1cnJlbnRMaXN0WSA+IFNGdXBwZXJZKQorICAgIHsKKwlpZiAoZGlyLT52T3JpZ2luIDwgZGlyLT5uRW50cmllcyAtIFNGbGlzdFNpemUpCisJICAgIFNGdlNsaWRlck1vdmVkQ2FsbGJhY2soc2VsRmlsZVZTY3JvbGxzW25dLCBuLCBkaXItPnZPcmlnaW4gKyAxKTsKKyAgICB9CisKKyAgICBpZiAoZGlyLT52T3JpZ2luICE9IHNhdmUpCisgICAgeworCWlmIChkaXItPm5FbnRyaWVzKQorCXsKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwkgICAgWGF3U2Nyb2xsYmFyU2V0VGh1bWIoCisJCSAgICBzZWxGaWxlVlNjcm9sbHNbbl0sCisJCSAgICAoZmxvYXQpICgoKGRvdWJsZSkgZGlyLT52T3JpZ2luKSAvIGRpci0+bkVudHJpZXMpLAorCQkgICAgKGZsb2F0KSAoKChkb3VibGUpICgoZGlyLT5uRW50cmllcyA8IFNGbGlzdFNpemUpID8KKwkJCQlkaXItPm5FbnRyaWVzIDogU0ZsaXN0U2l6ZSkpIC8gZGlyLT5uRW50cmllcykpOworI2Vsc2UKKwkgICAgdmltX1hhd1Njcm9sbGJhclNldFRodW1iKAorCQkgICAgc2VsRmlsZVZTY3JvbGxzW25dLAorCQkgICAgKGZsb2F0KSAoKChkb3VibGUpIGRpci0+dk9yaWdpbikgLyBkaXItPm5FbnRyaWVzKSwKKwkJICAgIChmbG9hdCkgKCgoZG91YmxlKSAoKGRpci0+bkVudHJpZXMgPCBTRmxpc3RTaXplKSA/CisJCQkJZGlyLT5uRW50cmllcyA6IFNGbGlzdFNpemUpKSAvIGRpci0+bkVudHJpZXMpLAorCQkgICAgKGRvdWJsZSlkaXItPm5FbnRyaWVzKTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICBpZiAoU0ZidXR0b25QcmVzc2VkKQorCVNGc2Nyb2xsVGltZXJJZCA9IFh0QXBwQWRkVGltZU91dChTRmFwcCwKKwkJICAgICAgIFNGc2Nyb2xsVGltZXJJbnRlcnZhbCgpLCBTRnNjcm9sbFRpbWVyLCAoWHRQb2ludGVyKSBuKTsKK30KKworICAgIHN0YXRpYyBpbnQKK1NGbmV3SW52ZXJ0RW50cnkobiwgZXZlbnQpCisgICAgaW50CQkJbjsKKyAgICBYTW90aW9uRXZlbnQJKmV2ZW50OworeworICAgIGludAkJCXgsIHk7CisgICAgaW50CQkJbnc7CisgICAgc3RhdGljIGludAkJU0ZzY3JvbGxUaW1lckFkZGVkID0gMDsKKworICAgIHggPSBldmVudC0+eDsKKyAgICB5ID0gZXZlbnQtPnk7CisKKyAgICBpZiAoU0ZkaXJQdHIgKyBuID49IFNGZGlyRW5kKQorCXJldHVybiAtMTsKKworICAgIGlmICgoeCA+PSAwKSAmJiAoeCA8PSBTRnVwcGVyWCkgJiYgKHkgPj0gU0Zsb3dlclkpICYmICh5IDw9IFNGdXBwZXJZKSkKKyAgICB7CisJU0ZEaXIgKmRpciA9ICYoU0ZkaXJzW1NGZGlyUHRyICsgbl0pOworCisJaWYgKFNGc2Nyb2xsVGltZXJBZGRlZCkKKwl7CisJICAgIFNGc2Nyb2xsVGltZXJBZGRlZCA9IDA7CisJICAgIFh0UmVtb3ZlVGltZU91dChTRnNjcm9sbFRpbWVySWQpOworCX0KKworCW53ID0gKHkgLSBTRmxvd2VyWSkgLyBTRmVudHJ5SGVpZ2h0OworCWlmIChkaXItPnZPcmlnaW4gKyBudyA+PSBkaXItPm5FbnRyaWVzKQorCSAgICByZXR1cm4gLTE7CisJcmV0dXJuIG53OworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChTRmJ1dHRvblByZXNzZWQpCisJeworCSAgICBTRmN1cnJlbnRMaXN0WSA9IHk7CisJICAgIGlmICghU0ZzY3JvbGxUaW1lckFkZGVkKQorCSAgICB7CisJCVNGc2Nyb2xsVGltZXJBZGRlZCA9IDE7CisJCVNGc2Nyb2xsVGltZXJJZCA9IFh0QXBwQWRkVGltZU91dChTRmFwcCwKKwkJCVNGc2Nyb2xsVGltZXJJbnRlcnZhbCgpLCBTRnNjcm9sbFRpbWVyLAorCQkJKFh0UG9pbnRlcikgbik7CisJICAgIH0KKwl9CisJcmV0dXJuIC0xOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZlbnRlckxpc3QodywgbiwgZXZlbnQpCisgICAgV2lkZ2V0CQl3OworICAgIGludAkJCW47CisgICAgWEVudGVyV2luZG93RXZlbnQJKmV2ZW50OworeworICAgIGludAkJCW53OworCisgICAgLyogc2FuaXR5ICovCisgICAgaWYgKFNGY3VycmVudEludmVydFtuXSAhPSAtMSkKKyAgICB7CisJU0ZpbnZlcnRFbnRyeShuKTsKKwlTRmN1cnJlbnRJbnZlcnRbbl0gPSAtMTsKKyAgICB9CisKKyAgICBudyA9IFNGbmV3SW52ZXJ0RW50cnkobiwgKFhNb3Rpb25FdmVudCAqKSBldmVudCk7CisgICAgaWYgKG53ICE9IC0xKQorICAgIHsKKwlTRmN1cnJlbnRJbnZlcnRbbl0gPSBudzsKKwlTRmludmVydEVudHJ5KG4pOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZsZWF2ZUxpc3QodywgbiwgZXZlbnQpCisgICAgV2lkZ2V0CXc7CisgICAgaW50CQluOworICAgIFhFdmVudAkqZXZlbnQ7Cit7CisgICAgaWYgKFNGY3VycmVudEludmVydFtuXSAhPSAtMSkKKyAgICB7CisJU0ZpbnZlcnRFbnRyeShuKTsKKwlTRmN1cnJlbnRJbnZlcnRbbl0gPSAtMTsKKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1NGbW90aW9uTGlzdCh3LCBuLCBldmVudCkKKyAgICBXaWRnZXQJCXc7CisgICAgaW50CQkJbjsKKyAgICBYTW90aW9uRXZlbnQJKmV2ZW50OworeworICAgIGludAkJbnc7CisKKyAgICBudyA9IFNGbmV3SW52ZXJ0RW50cnkobiwgZXZlbnQpOworCisgICAgaWYgKG53ICE9IFNGY3VycmVudEludmVydFtuXSkKKyAgICB7CisJaWYgKFNGY3VycmVudEludmVydFtuXSAhPSAtMSkKKwkgICAgU0ZpbnZlcnRFbnRyeShuKTsKKwlTRmN1cnJlbnRJbnZlcnRbbl0gPSBudzsKKwlpZiAobncgIT0gLTEpCisJICAgIFNGaW52ZXJ0RW50cnkobik7CisgICAgfQorfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRnZGbG9hdFNsaWRlck1vdmVkQ2FsbGJhY2sodywgbiwgZm5ldykKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJbjsKKyAgICBYdFBvaW50ZXIJZm5ldzsKK3sKKyAgICBpbnQJCW53OworCisgICAgbncgPSAoKihmbG9hdCAqKWZuZXcpICogU0ZkaXJzW1NGZGlyUHRyICsgKGludCkobG9uZyluXS5uRW50cmllczsKKyAgICBTRnZTbGlkZXJNb3ZlZENhbGxiYWNrKHcsIChpbnQpKGxvbmcpbiwgbncpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRnZTbGlkZXJNb3ZlZENhbGxiYWNrKHcsIG4sIG53KQorICAgIFdpZGdldAl3OworICAgIGludAkJbjsKKyAgICBpbnQJCW53OworeworICAgIGludAkJb2xkOworICAgIFdpbmRvdwl3aW47CisgICAgU0ZEaXIJKmRpcjsKKworICAgIGRpciA9ICYoU0ZkaXJzW1NGZGlyUHRyICsgbl0pOworCisgICAgb2xkID0gZGlyLT52T3JpZ2luOworICAgIGRpci0+dk9yaWdpbiA9IG53OworCisgICAgaWYgKG9sZCA9PSBudykKKwlyZXR1cm47CisKKyAgICB3aW4gPSBYdFdpbmRvdyhzZWxGaWxlTGlzdHNbbl0pOworCisgICAgaWYgKEFCUyhudyAtIG9sZCkgPCBTRmxpc3RTaXplKQorICAgIHsKKwlpZiAobncgPiBvbGQpCisJeworCSAgICBYQ29weUFyZWEoCisJCSAgICBTRmRpc3BsYXksCisJCSAgICB3aW4sCisJCSAgICB3aW4sCisJCSAgICBTRnNjcm9sbEdDLAorCQkgICAgU0ZsaW5lVG9UZXh0SCwKKwkJICAgIFNGbG93ZXJZICsgKG53IC0gb2xkKSAqIFNGZW50cnlIZWlnaHQsCisJCSAgICBTRmVudHJ5V2lkdGggKyBTRmxpbmVUb1RleHRILAorCQkgICAgKFNGbGlzdFNpemUgLSAobncgLSBvbGQpKSAqIFNGZW50cnlIZWlnaHQsCisJCSAgICBTRmxpbmVUb1RleHRILAorCQkgICAgU0Zsb3dlclkpOworCSAgICBYQ2xlYXJBcmVhKAorCQkgICAgU0ZkaXNwbGF5LAorCQkgICAgd2luLAorCQkgICAgU0ZsaW5lVG9UZXh0SCwKKwkJICAgIFNGbG93ZXJZICsgKFNGbGlzdFNpemUgLSAobncgLSBvbGQpKSAqCisJCSAgICBTRmVudHJ5SGVpZ2h0LAorCQkgICAgU0ZlbnRyeVdpZHRoICsgU0ZsaW5lVG9UZXh0SCwKKwkJICAgIChudyAtIG9sZCkgKiBTRmVudHJ5SGVpZ2h0LAorCQkgICAgRmFsc2UpOworCSAgICBTRmRyYXdTdHJpbmdzKHdpbiwgZGlyLCBTRmxpc3RTaXplIC0gKG53IC0gb2xkKSwKKwkJICAgIFNGbGlzdFNpemUgLSAxKTsKKwl9CisJZWxzZQorCXsKKwkgICAgWENvcHlBcmVhKAorCQkgICAgU0ZkaXNwbGF5LAorCQkgICAgd2luLAorCQkgICAgd2luLAorCQkgICAgU0ZzY3JvbGxHQywKKwkJICAgIFNGbGluZVRvVGV4dEgsCisJCSAgICBTRmxvd2VyWSwKKwkJICAgIFNGZW50cnlXaWR0aCArIFNGbGluZVRvVGV4dEgsCisJCSAgICAoU0ZsaXN0U2l6ZSAtIChvbGQgLSBudykpICogU0ZlbnRyeUhlaWdodCwKKwkJICAgIFNGbGluZVRvVGV4dEgsCisJCSAgICBTRmxvd2VyWSArIChvbGQgLSBudykgKiBTRmVudHJ5SGVpZ2h0KTsKKwkgICAgWENsZWFyQXJlYSgKKwkJICAgIFNGZGlzcGxheSwKKwkJICAgIHdpbiwKKwkJICAgIFNGbGluZVRvVGV4dEgsCisJCSAgICBTRmxvd2VyWSwKKwkJICAgIFNGZW50cnlXaWR0aCArIFNGbGluZVRvVGV4dEgsCisJCSAgICAob2xkIC0gbncpICogU0ZlbnRyeUhlaWdodCwKKwkJICAgIEZhbHNlKTsKKwkgICAgU0ZkcmF3U3RyaW5ncyh3aW4sIGRpciwgMCwgb2xkIC0gbncpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlYQ2xlYXJBcmVhKAorCQlTRmRpc3BsYXksCisJCXdpbiwKKwkJU0ZsaW5lVG9UZXh0SCwKKwkJU0Zsb3dlclksCisJCVNGZW50cnlXaWR0aCArIFNGbGluZVRvVGV4dEgsCisJCVNGbGlzdFNpemUgKiBTRmVudHJ5SGVpZ2h0LAorCQlGYWxzZSk7CisJU0ZkcmF3U3RyaW5ncyh3aW4sIGRpciwgMCwgU0ZsaXN0U2l6ZSAtIDEpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0Z2QXJlYVNlbGVjdGVkQ2FsbGJhY2sodywgbiwgcG5ldykKKyAgICBXaWRnZXQJCXc7CisgICAgWHRQb2ludGVyCW47CisgICAgWHRQb2ludGVyCXBuZXc7Cit7CisgICAgU0ZEaXIJKmRpcjsKKyAgICBpbnQJCW53OworCisgICAgZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyAoaW50KShsb25nKW5dKTsKKworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworICAgIGlmICgoaW50KShsb25nKXBuZXcgPCAwKQorICAgIHsKKwlpZiAoKGludCkobG9uZylwbmV3ID4gLVNGdlNjcm9sbEhlaWdodCkKKwkgICAgKGludCkobG9uZylwbmV3ID0gLTE7CisJZWxzZQorCSAgICAoaW50KShsb25nKXBuZXcgPSAtU0ZsaXN0U2l6ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCkobG9uZylwbmV3ID4gMCkKKyAgICB7CisJaWYgKChpbnQpKGxvbmcpcG5ldyA8IFNGdlNjcm9sbEhlaWdodCkKKwkgICAgKGludCkobG9uZylwbmV3ID0gMTsKKwllbHNlCisJICAgIChpbnQpKGxvbmcpcG5ldyA9IFNGbGlzdFNpemU7CisgICAgfQorI2VuZGlmCisgICAgbncgPSBkaXItPnZPcmlnaW4gKyAoaW50KShsb25nKXBuZXc7CisKKyAgICBpZiAobncgPiBkaXItPm5FbnRyaWVzIC0gU0ZsaXN0U2l6ZSkKKwludyA9IGRpci0+bkVudHJpZXMgLSBTRmxpc3RTaXplOworCisgICAgaWYgKG53IDwgMCkKKwludyA9IDA7CisKKyAgICBpZiAoZGlyLT5uRW50cmllcykKKyAgICB7CisJZmxvYXQJZjsKKworCWYgPSAoKGRvdWJsZSkgbncpIC8gZGlyLT5uRW50cmllczsKKworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworCVhhd1Njcm9sbGJhclNldFRodW1iKAorCQl3LAorCQlmLAorCQkoZmxvYXQpICgoKGRvdWJsZSkgKChkaXItPm5FbnRyaWVzIDwgU0ZsaXN0U2l6ZSkgPworCQkJCWRpci0+bkVudHJpZXMgOiBTRmxpc3RTaXplKSkgLyBkaXItPm5FbnRyaWVzKSk7CisjZWxzZQorCXZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYigKKwkJdywKKwkJZiwKKwkJKGZsb2F0KSAoKChkb3VibGUpICgoZGlyLT5uRW50cmllcyA8IFNGbGlzdFNpemUpID8KKwkJCQlkaXItPm5FbnRyaWVzIDogU0ZsaXN0U2l6ZSkpIC8gZGlyLT5uRW50cmllcyksCisJCShkb3VibGUpZGlyLT5uRW50cmllcyk7CisjZW5kaWYKKyAgICB9CisKKyAgICBTRnZTbGlkZXJNb3ZlZENhbGxiYWNrKHcsIChpbnQpKGxvbmcpbiwgbncpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRmhTbGlkZXJNb3ZlZENhbGxiYWNrKHcsIG4sIG53KQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgluOworICAgIFh0UG9pbnRlcgludzsKK3sKKyAgICBTRkRpcgkqZGlyOworICAgIGludAlzYXZlOworCisgICAgZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyAoaW50KShsb25nKW5dKTsKKyAgICBzYXZlID0gZGlyLT5oT3JpZ2luOworICAgIGRpci0+aE9yaWdpbiA9ICgqKGZsb2F0ICopbncpICogZGlyLT5uQ2hhcnM7CisgICAgaWYgKGRpci0+aE9yaWdpbiA9PSBzYXZlKQorCXJldHVybjsKKworICAgIFNGZHJhd0xpc3QoKGludCkobG9uZyluLCBTRl9ET19OT1RfU0NST0xMKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZoQXJlYVNlbGVjdGVkQ2FsbGJhY2sodywgbiwgcG5ldykKKyAgICBXaWRnZXQJCXc7CisgICAgWHRQb2ludGVyCW47CisgICAgWHRQb2ludGVyCXBuZXc7Cit7CisgICAgU0ZEaXIJKmRpcjsKKyAgICBpbnQJCW53OworCisgICAgZGlyID0gJihTRmRpcnNbU0ZkaXJQdHIgKyAoaW50KShsb25nKW5dKTsKKworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworICAgIGlmICgoaW50KShsb25nKXBuZXcgPCAwKQorICAgIHsKKwlpZiAoKGludCkobG9uZylwbmV3ID4gLVNGaFNjcm9sbFdpZHRoKQorCSAgICAoaW50KShsb25nKXBuZXcgPSAtMTsKKwllbHNlCisJICAgIChpbnQpKGxvbmcpcG5ldyA9IC1TRmNoYXJzUGVyRW50cnk7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpKGxvbmcpcG5ldyA+IDApCisgICAgeworCWlmICgoaW50KShsb25nKXBuZXcgPCBTRmhTY3JvbGxXaWR0aCkKKwkgICAgKGludCkobG9uZylwbmV3ID0gMTsKKwllbHNlCisJICAgIChpbnQpKGxvbmcpcG5ldyA9IFNGY2hhcnNQZXJFbnRyeTsKKyAgICB9CisjZW5kaWYKKyAgICBudyA9IGRpci0+aE9yaWdpbiArIChpbnQpKGxvbmcpcG5ldzsKKworICAgIGlmIChudyA+IGRpci0+bkNoYXJzIC0gU0ZjaGFyc1BlckVudHJ5KQorCW53ID0gZGlyLT5uQ2hhcnMgLSBTRmNoYXJzUGVyRW50cnk7CisKKyAgICBpZiAobncgPCAwKQorCW53ID0gMDsKKworICAgIGlmIChkaXItPm5DaGFycykKKyAgICB7CisJZmxvYXQJZjsKKworCWYgPSAoKGRvdWJsZSkgbncpIC8gZGlyLT5uQ2hhcnM7CisKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwlYYXdTY3JvbGxiYXJTZXRUaHVtYigKKwkJdywKKwkJZiwKKwkJKGZsb2F0KSAoKChkb3VibGUpICgoZGlyLT5uQ2hhcnMgPCBTRmNoYXJzUGVyRW50cnkpID8KKwkJCSAgICAgICBkaXItPm5DaGFycyA6IFNGY2hhcnNQZXJFbnRyeSkpIC8gZGlyLT5uQ2hhcnMpKTsKKyNlbHNlCisJdmltX1hhd1Njcm9sbGJhclNldFRodW1iKAorCQl3LAorCQlmLAorCQkoZmxvYXQpICgoKGRvdWJsZSkgKChkaXItPm5DaGFycyA8IFNGY2hhcnNQZXJFbnRyeSkgPworCQkJICAgICAgIGRpci0+bkNoYXJzIDogU0ZjaGFyc1BlckVudHJ5KSkgLyBkaXItPm5DaGFycyksCisJCShkb3VibGUpZGlyLT5uQ2hhcnMpOworI2VuZGlmCisKKwlTRmhTbGlkZXJNb3ZlZENhbGxiYWNrKHcsIG4sIChYdFBvaW50ZXIpJmYpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZwYXRoU2xpZGVyTW92ZWRDYWxsYmFjayh3LCBjbGllbnRfZGF0YSwgbncpCisgICAgV2lkZ2V0CQl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYdFBvaW50ZXIJbnc7Cit7CisgICAgU0ZEaXIJCSpkaXI7CisgICAgaW50CQkJbjsKKyAgICBYYXdUZXh0UG9zaXRpb24JcG9zOworICAgIGludAkJCVNGZGlyUHRyU2F2ZTsKKworICAgIFNGZGlyUHRyU2F2ZSA9IFNGZGlyUHRyOworICAgIFNGZGlyUHRyID0gKCooZmxvYXQgKiludykgKiBTRmRpckVuZDsKKyAgICBpZiAoU0ZkaXJQdHIgPT0gU0ZkaXJQdHJTYXZlKQorCXJldHVybjsKKworICAgIFNGZHJhd0xpc3RzKFNGX0RPX1NDUk9MTCk7CisKKyAgICBuID0gMjsKKyAgICB3aGlsZSAoU0ZkaXJQdHIgKyBuID49IFNGZGlyRW5kKQorCW4tLTsKKworICAgIGRpciA9ICYoU0ZkaXJzW1NGZGlyUHRyICsgbl0pOworCisgICAgcG9zID0gZGlyLT5wYXRoIC0gU0ZjdXJyZW50UGF0aDsKKworICAgIGlmICghc3RybmNtcChTRmN1cnJlbnRQYXRoLCBTRnN0YXJ0RGlyLCBzdHJsZW4oU0ZzdGFydERpcikpKQorICAgIHsKKwlwb3MgLT0gc3RybGVuKFNGc3RhcnREaXIpOworCWlmIChwb3MgPCAwKQorCSAgICBwb3MgPSAwOworICAgIH0KKworICAgIFhhd1RleHRTZXRJbnNlcnRpb25Qb2ludChzZWxGaWxlRmllbGQsIHBvcyk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1NGcGF0aEFyZWFTZWxlY3RlZENhbGxiYWNrKHcsIGNsaWVudF9kYXRhLCBwbmV3KQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYdFBvaW50ZXIJcG5ldzsKK3sKKyAgICBpbnQJCW53OworICAgIGZsb2F0CWY7CisKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyAgICBpZiAoKGludCkobG9uZylwbmV3IDwgMCkKKyAgICB7CisJaWYgKChpbnQpKGxvbmcpcG5ldyA+IC1TRnBhdGhTY3JvbGxXaWR0aCkKKwkgICAgKGludCkobG9uZylwbmV3ID0gLTE7CisJZWxzZQorCSAgICAoaW50KShsb25nKXBuZXcgPSAtMzsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCkobG9uZylwbmV3ID4gMCkKKyAgICB7CisJaWYgKChpbnQpKGxvbmcpcG5ldyA8IFNGcGF0aFNjcm9sbFdpZHRoKQorCSAgICAoaW50KShsb25nKXBuZXcgPSAxOworCWVsc2UKKwkgICAgKGludCkobG9uZylwbmV3ID0gMzsKKyAgICB9CisjZW5kaWYKKyAgICBudyA9IFNGZGlyUHRyICsgKGludCkobG9uZylwbmV3OworCisgICAgaWYgKG53ID4gU0ZkaXJFbmQgLSAzKQorCW53ID0gU0ZkaXJFbmQgLSAzOworCisgICAgaWYgKG53IDwgMCkKKwludyA9IDA7CisKKyAgICBmID0gKChkb3VibGUpIG53KSAvIFNGZGlyRW5kOworCisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisgICAgWGF3U2Nyb2xsYmFyU2V0VGh1bWIoCisJICAgIHcsCisJICAgIGYsCisJICAgIChmbG9hdCkgKCgoZG91YmxlKSAoKFNGZGlyRW5kIDwgMykgPyBTRmRpckVuZCA6IDMpKSAvIFNGZGlyRW5kKSk7CisjZWxzZQorICAgIHZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYigKKwkgICAgdywKKwkgICAgZiwKKwkgICAgKGZsb2F0KSAoKChkb3VibGUpICgoU0ZkaXJFbmQgPCAzKSA/IFNGZGlyRW5kIDogMykpIC8gU0ZkaXJFbmQpLAorCSAgICAoZG91YmxlKVNGZGlyRW5kKTsKKyNlbmRpZgorCisgICAgU0ZwYXRoU2xpZGVyTW92ZWRDYWxsYmFjayh3LCAoWHRQb2ludGVyKSBOVUxMLCAoWHRQb2ludGVyKSZmKTsKK30KKworICAgIHN0YXRpYyBCb29sZWFuCitTRndvcmtQcm9jKCkKK3sKKyAgICBTRkRpcgkqZGlyOworICAgIFNGRW50cnkJKmVudHJ5OworCisgICAgZm9yIChkaXIgPSAmKFNGZGlyc1tTRmRpckVuZCAtIDFdKTsgZGlyID49IFNGZGlyczsgZGlyLS0pCisgICAgeworCWlmICghKGRpci0+bkVudHJpZXMpKQorCSAgICBjb250aW51ZTsKKwlmb3IgKGVudHJ5ID0gJihkaXItPmVudHJpZXNbZGlyLT5uRW50cmllcyAtIDFdKTsKKwkJZW50cnkgPj0gZGlyLT5lbnRyaWVzOworCQllbnRyeS0tKQorCXsKKwkgICAgaWYgKCEoZW50cnktPnN0YXREb25lKSkKKwkgICAgeworCQkodm9pZClTRnN0YXRBbmRDaGVjayhkaXIsIGVudHJ5KTsKKwkJcmV0dXJuIEZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAgIFNGd29ya1Byb2NBZGRlZCA9IDA7CisKKyAgICByZXR1cm4gVHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqIERpci5jICovCisKKyAgICBzdGF0aWMgaW50CitTRmNvbXBhcmVFbnRyaWVzKHAsIHEpCisgICAgY29uc3Qgdm9pZAkqcDsKKyAgICBjb25zdCB2b2lkCSpxOworeworICAgIHJldHVybiBzdHJjbXAoKChTRkVudHJ5ICopcCktPnJlYWwsICgoU0ZFbnRyeSAqKXEpLT5yZWFsKTsKK30KKworICAgIHN0YXRpYyBpbnQKK1NGZ2V0RGlyKGRpcikKKyAgICBTRkRpcgkqZGlyOworeworICAgIFNGRW50cnkJCSpyZXN1bHQgPSBOVUxMOworICAgIGludAkJCUFsbG9jID0gMDsKKyAgICBpbnQJCQlpOworICAgIERJUgkJCSpkaXJwOworICAgIHN0cnVjdCBkaXJlbnQJKmRwOworICAgIGNoYXIJCSpzdHI7CisgICAgaW50CQkJbGVuOworICAgIGludAkJCW1heENoYXJzOworICAgIHN0cnVjdCBzdGF0CQlzdGF0QnVmOworCisgICAgbWF4Q2hhcnMgPSBzdHJsZW4oZGlyLT5kaXIpIC0gMTsKKworICAgIGRpci0+ZW50cmllcyA9IE5VTEw7CisgICAgZGlyLT5uRW50cmllcyA9IDA7CisgICAgZGlyLT5uQ2hhcnMgPSAwOworCisgICAgcmVzdWx0ID0gTlVMTDsKKyAgICBpID0gMDsKKworICAgIGRpcnAgPSBvcGVuZGlyKCIuIik7CisgICAgaWYgKCFkaXJwKQorCXJldHVybiAxOworCisgICAgKHZvaWQpbWNoX3N0YXQoIi4iLCAmc3RhdEJ1Zik7CisgICAgZGlyLT5tdGltZSA9IHN0YXRCdWYuc3RfbXRpbWU7CisKKyAgICB3aGlsZSAoKGRwID0gcmVhZGRpcihkaXJwKSkpCisgICAgeworCS8qIElnbm9yZSAiLiIgYW5kICIuLiIgKi8KKwlpZiAoc3RyY21wKGRwLT5kX25hbWUsICIuIikgPT0gMCB8fCBzdHJjbXAoZHAtPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkgICAgY29udGludWU7CisJaWYgKGkgPj0gQWxsb2MpCisJeworCSAgICBBbGxvYyA9IDIgKiAoQWxsb2MgKyAxKTsKKwkgICAgcmVzdWx0ID0gKFNGRW50cnkgKikgWHRSZWFsbG9jKChjaGFyICopIHJlc3VsdCwKKwkJICAgICh1bnNpZ25lZCkgKEFsbG9jICogc2l6ZW9mKFNGRW50cnkpKSk7CisJfQorCXJlc3VsdFtpXS5zdGF0RG9uZSA9IDA7CisJc3RyID0gZHAtPmRfbmFtZTsKKwlsZW4gPSBzdHJsZW4oc3RyKTsKKwlyZXN1bHRbaV0ucmVhbCA9IFh0TWFsbG9jKCh1bnNpZ25lZCkgKGxlbiArIDIpKTsKKwkodm9pZCkgc3RyY2F0KHN0cmNweShyZXN1bHRbaV0ucmVhbCwgc3RyKSwgIiAiKTsKKwlpZiAobGVuID4gbWF4Q2hhcnMpCisJICAgIG1heENoYXJzID0gbGVuOworCXJlc3VsdFtpXS5zaG93biA9IHJlc3VsdFtpXS5yZWFsOworCWkrKzsKKyAgICB9CisKKyAgICBxc29ydCgoY2hhciAqKSByZXN1bHQsIChzaXplX3QpIGksIHNpemVvZihTRkVudHJ5KSwgU0Zjb21wYXJlRW50cmllcyk7CisKKyAgICBkaXItPmVudHJpZXMgPSByZXN1bHQ7CisgICAgZGlyLT5uRW50cmllcyA9IGk7CisgICAgZGlyLT5uQ2hhcnMgPSBtYXhDaGFycyArIDE7CisKKyAgICBjbG9zZWRpcihkaXJwKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKiogU0ZpbnRlcm5hbC5oICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxYMTEvY3Vyc29yZm9udC5oPgorI2luY2x1ZGUgPFgxMS9Db21wb3NpdGUuaD4KKyNpbmNsdWRlIDxYMTEvU2hlbGwuaD4KKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyMgaW5jbHVkZSA8WDExL25lWHRhdy9Gb3JtLmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvQ29tbWFuZC5oPgorIyBpbmNsdWRlIDxYMTEvbmVYdGF3L0xhYmVsLmg+CisjZWxzZQorI2luY2x1ZGUgPFgxMS9YYXcvRm9ybS5oPgorI2luY2x1ZGUgPFgxMS9YYXcvQ29tbWFuZC5oPgorI2luY2x1ZGUgPFgxMS9YYXcvTGFiZWwuaD4KKyNlbmRpZgorCitzdGF0aWMgY2hhciAqb25lTGluZVRleHRFZGl0VHJhbnNsYXRpb25zID0gIlwKKwk8S2V5PlJldHVybjoJcmVkcmF3LWRpc3BsYXkoKVxuXAorCUN0cmw8S2V5Pk06CXJlZHJhdy1kaXNwbGF5KClcblwKKyI7CisKK3N0YXRpYyB2b2lkIFNGZXhwb3NlTGlzdCBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgbiwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqY29udCkpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRmV4cG9zZUxpc3QodywgbiwgZXZlbnQsIGNvbnQpCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCW47CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpjb250OworeworICAgIGlmICgoZXZlbnQtPnR5cGUgPT0gTm9FeHBvc2UpIHx8IGV2ZW50LT54ZXhwb3NlLmNvdW50KQorCXJldHVybjsKKworICAgIFNGZHJhd0xpc3QoKGludCkobG9uZyluLCBTRl9ET19OT1RfU0NST0xMKTsKK30KKworc3RhdGljIHZvaWQgU0Ztb2RWZXJpZnlDYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2xpZW50X2RhdGEsIFhFdmVudCAqZXZlbnQsIEJvb2xlYW4gKmNvbnQpKTsKKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0Ztb2RWZXJpZnlDYWxsYmFjayh3LCBjbGllbnRfZGF0YSwgZXZlbnQsIGNvbnQpCisgICAgV2lkZ2V0CQl3OworICAgIFh0UG9pbnRlcgkJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CQkqZXZlbnQ7CisgICAgQm9vbGVhbgkJKmNvbnQ7Cit7CisgICAgY2hhcglidWZbMl07CisKKyAgICBpZiAoKFhMb29rdXBTdHJpbmcoJihldmVudC0+eGtleSksIGJ1ZiwgMiwgTlVMTCwgTlVMTCkgPT0gMSkgJiYKKwkgICAgKCgqYnVmKSA9PSAnXHInKSkKKwlTRnN0YXR1cyA9IFNFTF9GSUxFX09LOworICAgIGVsc2UKKwlTRnN0YXR1cyA9IFNFTF9GSUxFX1RFWFQ7Cit9CisKK3N0YXRpYyB2b2lkIFNGb2tDYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2wsIFh0UG9pbnRlciBjZCkpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRm9rQ2FsbGJhY2sodywgY2wsIGNkKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbCwgY2Q7Cit7CisgICAgU0ZzdGF0dXMgPSBTRUxfRklMRV9PSzsKK30KKworc3RhdGljIFh0Q2FsbGJhY2tSZWMgU0Zva1NlbGVjdFtdID0KK3sKKyAgICB7IFNGb2tDYWxsYmFjaywgKFh0UG9pbnRlcikgTlVMTCB9LAorICAgIHsgTlVMTCwgKFh0UG9pbnRlcikgTlVMTCB9LAorfTsKKworc3RhdGljIHZvaWQgU0ZjYW5jZWxDYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2wsIFh0UG9pbnRlciBjZCkpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTRmNhbmNlbENhbGxiYWNrKHcsIGNsLCBjZCkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2wsIGNkOworeworICAgIFNGc3RhdHVzID0gU0VMX0ZJTEVfQ0FOQ0VMOworfQorCitzdGF0aWMgWHRDYWxsYmFja1JlYyBTRmNhbmNlbFNlbGVjdFtdID0KK3sKKyAgICB7IFNGY2FuY2VsQ2FsbGJhY2ssIChYdFBvaW50ZXIpIE5VTEwgfSwKKyAgICB7IE5VTEwsIChYdFBvaW50ZXIpIE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIFNGZGlzbWlzc0FjdGlvbiBfX0FSR1MoKFdpZGdldCB3LCBYRXZlbnQgKmV2ZW50LCBTdHJpbmcgKnBhcmFtcywgQ2FyZGluYWwgKm51bV9wYXJhbXMpKTsKKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU0ZkaXNtaXNzQWN0aW9uKHcsIGV2ZW50LCBwYXJhbXMsIG51bV9wYXJhbXMpCisgICAgV2lkZ2V0CXc7CisgICAgWEV2ZW50ICpldmVudDsKKyAgICBTdHJpbmcgKnBhcmFtczsKKyAgICBDYXJkaW5hbCAqbnVtX3BhcmFtczsKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gQ2xpZW50TWVzc2FnZSAmJgorCSAgICBldmVudC0+eGNsaWVudC5kYXRhLmxbMF0gIT0gU0Z3bURlbGV0ZVdpbmRvdykKKwlyZXR1cm47CisKKyAgICBTRnN0YXR1cyA9IFNFTF9GSUxFX0NBTkNFTDsKK30KKworc3RhdGljIGNoYXIgKndtRGVsZXRlV2luZG93VHJhbnNsYXRpb24gPSAiXAorCTxNZXNzYWdlPldNX1BST1RPQ09MUzoJU2VsRmlsZURpc21pc3MoKVxuXAorIjsKKworc3RhdGljIFh0QWN0aW9uc1JlYyBhY3Rpb25zW10gPQoreworICAgIHsiU2VsRmlsZURpc21pc3MiLAlTRmRpc21pc3NBY3Rpb259LAorfTsKKworICAgIHN0YXRpYyB2b2lkCitTRnNldENvbG9ycyhiZywgZmcsIHNjcm9sbF9iZywgc2Nyb2xsX2ZnKQorICAgIGd1aWNvbG9yX1QJYmc7CisgICAgZ3VpY29sb3JfVAlmZzsKKyAgICBndWljb2xvcl9UCXNjcm9sbF9iZzsKKyAgICBndWljb2xvcl9UCXNjcm9sbF9mZzsKK3sKKyAgICBpZiAoc2VsRmlsZUZvcm0pCisgICAgeworCVh0VmFTZXRWYWx1ZXMoc2VsRmlsZUZvcm0sIFh0TmJhY2tncm91bmQsICBiZywKKwkJCQkgICBYdE5mb3JlZ3JvdW5kLCAgZmcsCisJCQkJICAgWHROYm9yZGVyQ29sb3IsIGJnLAorCQkJCSAgIE5VTEwpOworICAgIH0KKyAgICB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCXsKKwkgICAgaWYgKHNlbEZpbGVMaXN0c1tpXSkKKwkgICAgeworCQlYdFZhU2V0VmFsdWVzKHNlbEZpbGVMaXN0c1tpXSwgWHROYmFja2dyb3VuZCwgIGJnLAorCQkJCQkgICAgICAgWHROZm9yZWdyb3VuZCwgIGZnLAorCQkJCQkgICAgICAgWHROYm9yZGVyQ29sb3IsIGZnLAorCQkJCQkgICAgICAgTlVMTCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChzZWxGaWxlT0spCisgICAgeworCVh0VmFTZXRWYWx1ZXMoc2VsRmlsZU9LLCBYdE5iYWNrZ3JvdW5kLCAgYmcsCisJCQkJIFh0TmZvcmVncm91bmQsICBmZywKKwkJCQkgWHROYm9yZGVyQ29sb3IsIGZnLAorCQkJCSBOVUxMKTsKKyAgICB9CisgICAgaWYgKHNlbEZpbGVDYW5jZWwpCisgICAgeworCVh0VmFTZXRWYWx1ZXMoc2VsRmlsZUNhbmNlbCwgWHROYmFja2dyb3VuZCwgYmcsCisJCQkJICAgICBYdE5mb3JlZ3JvdW5kLCBmZywKKwkJCQkgICAgIFh0TmJvcmRlckNvbG9yLCBmZywKKwkJCQkgICAgIE5VTEwpOworICAgIH0KKyAgICBpZiAoc2VsRmlsZVByb21wdCkKKyAgICB7CisJWHRWYVNldFZhbHVlcyhzZWxGaWxlUHJvbXB0LCBYdE5iYWNrZ3JvdW5kLCBiZywKKwkJCQkgICAgIFh0TmZvcmVncm91bmQsIGZnLAorCQkJCSAgICAgTlVMTCk7CisgICAgfQorICAgIGlmIChndWkuZHB5KQorICAgIHsKKwlYU2V0QmFja2dyb3VuZChndWkuZHB5LCBTRnRleHRHQywgYmcpOworCVhTZXRGb3JlZ3JvdW5kKGd1aS5kcHksIFNGdGV4dEdDLCBmZyk7CisJWFNldEZvcmVncm91bmQoZ3VpLmRweSwgU0ZsaW5lR0MsIGZnKTsKKworCS8qIFRoaXMgaXMgYW4geG9yIEdDLCBzbyBjb21iaW5lIHRoZSBmZyBhbmQgYmFja2dyb3VuZCAqLworCVhTZXRCYWNrZ3JvdW5kKGd1aS5kcHksIFNGaW52ZXJ0R0MsIGZnIF4gYmcpOworCVhTZXRGb3JlZ3JvdW5kKGd1aS5kcHksIFNGaW52ZXJ0R0MsIGZnIF4gYmcpOworICAgIH0KKyAgICBpZiAoc2VsRmlsZUhTY3JvbGwpCisgICAgeworCVh0VmFTZXRWYWx1ZXMoc2VsRmlsZUhTY3JvbGwsIFh0TmJhY2tncm91bmQsIHNjcm9sbF9iZywKKwkJCQkgICAgICBYdE5mb3JlZ3JvdW5kLCBzY3JvbGxfZmcsCisJCQkJICAgICAgWHROYm9yZGVyQ29sb3IsIGZnLAorCQkJCSAgICAgIE5VTEwpOworICAgIH0KKyAgICB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkgICAgWHRWYVNldFZhbHVlcyhzZWxGaWxlVlNjcm9sbHNbaV0sIFh0TmJhY2tncm91bmQsIHNjcm9sbF9iZywKKwkJCQkJICAgICAgWHROZm9yZWdyb3VuZCwgc2Nyb2xsX2ZnLAorCQkJCQkgICAgICBYdE5ib3JkZXJDb2xvciwgZmcsCisJCQkJCSAgICAgIE5VTEwpOworCSAgICBYdFZhU2V0VmFsdWVzKHNlbEZpbGVIU2Nyb2xsc1tpXSwgWHROYmFja2dyb3VuZCwgc2Nyb2xsX2JnLAorCQkJCQkgICAgICBYdE5mb3JlZ3JvdW5kLCBzY3JvbGxfZmcsCisJCQkJCSAgICAgIFh0TmJvcmRlckNvbG9yLCBmZywKKwkJCQkJICAgICAgTlVMTCk7CisJfQorICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitTRmNyZWF0ZVdpZGdldHModG9wbGV2ZWwsIHByb21wdCwgb2ssIGNhbmNlbCkKKyAgICBXaWRnZXQJdG9wbGV2ZWw7CisgICAgY2hhcgkqcHJvbXB0OworICAgIGNoYXIJKm9rOworICAgIGNoYXIJKmNhbmNlbDsKK3sKKyAgICBDYXJkaW5hbAluOworICAgIGludAkJbGlzdFdpZHRoLCBsaXN0SGVpZ2h0OworICAgIGludAkJbGlzdFNwYWNpbmcgPSAxMDsKKyAgICBpbnQJCXNjcm9sbFRoaWNrbmVzcyA9IDE1OworICAgIGludAkJaFNjcm9sbFgsIGhTY3JvbGxZOworICAgIGludAkJdlNjcm9sbFgsIHZTY3JvbGxZOworCisgICAgc2VsRmlsZSA9IFh0VmFBcHBDcmVhdGVTaGVsbCgic2VsRmlsZSIsICJTZWxGaWxlIiwKKwkJdHJhbnNpZW50U2hlbGxXaWRnZXRDbGFzcywgU0ZkaXNwbGF5LAorCQlYdE50cmFuc2llbnRGb3IsIHRvcGxldmVsLAorCQlYdE50aXRsZSwgcHJvbXB0LAorCQlOVUxMKTsKKworICAgIC8qIEFkZCBXTV9ERUxFVEVfV0lORE9XIHByb3RvY29sICovCisgICAgWHRBcHBBZGRBY3Rpb25zKFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoc2VsRmlsZSksCisJICAgIGFjdGlvbnMsIFh0TnVtYmVyKGFjdGlvbnMpKTsKKyAgICBYdE92ZXJyaWRlVHJhbnNsYXRpb25zKHNlbEZpbGUsCisJICAgIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlKHdtRGVsZXRlV2luZG93VHJhbnNsYXRpb24pKTsKKworICAgIHNlbEZpbGVGb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInNlbEZpbGVGb3JtIiwKKwkJZm9ybVdpZGdldENsYXNzLCBzZWxGaWxlLAorCQlYdE5kZWZhdWx0RGlzdGFuY2UsIDMwLAorCQlYdE5mb3JlZ3JvdW5kLCBTRmZvcmUsCisJCVh0TmJhY2tncm91bmQsIFNGYmFjaywKKwkJWHROYm9yZGVyQ29sb3IsIFNGYmFjaywKKwkJTlVMTCk7CisKKyAgICBzZWxGaWxlUHJvbXB0ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInNlbEZpbGVQcm9tcHQiLAorCQlsYWJlbFdpZGdldENsYXNzLCBzZWxGaWxlRm9ybSwKKwkJWHRObGFiZWwsIHByb21wdCwKKwkJWHROcmVzaXphYmxlLCBUcnVlLAorCQlYdE50b3AsIFh0Q2hhaW5Ub3AsCisJCVh0TmJvdHRvbSwgWHRDaGFpblRvcCwKKwkJWHRObGVmdCwgWHRDaGFpbkxlZnQsCisJCVh0TnJpZ2h0LCBYdENoYWluTGVmdCwKKwkJWHROYm9yZGVyV2lkdGgsIDAsCisJCVh0TmZvcmVncm91bmQsIFNGZm9yZSwKKwkJWHROYmFja2dyb3VuZCwgU0ZiYWNrLAorCQlOVUxMKTsKKworICAgIC8qCisgICAgWHRWYUdldFZhbHVlcyhzZWxGaWxlUHJvbXB0LAorCQlYdE5mb3JlZ3JvdW5kLCAmU0Zmb3JlLAorCQlYdE5iYWNrZ3JvdW5kLCAmU0ZiYWNrLAorCQlOVUxMKTsKKyAgICAqLworCisgICAgU0Zpbml0Rm9udCgpOworCisgICAgU0ZlbnRyeVdpZHRoID0gU0ZiZXNpZGVUZXh0ICsgU0ZjaGFyc1BlckVudHJ5ICogU0ZjaGFyV2lkdGggKworCVNGYmVzaWRlVGV4dDsKKyAgICBTRmVudHJ5SGVpZ2h0ID0gU0ZhYm92ZUFuZEJlbG93VGV4dCArIFNGY2hhckhlaWdodCArCisJU0ZhYm92ZUFuZEJlbG93VGV4dDsKKworICAgIGxpc3RXaWR0aCA9IFNGbGluZVRvVGV4dEggKyBTRmVudHJ5V2lkdGggKyBTRmxpbmVUb1RleHRIICsgMSArCisJc2Nyb2xsVGhpY2tuZXNzOworICAgIGxpc3RIZWlnaHQgPSBTRmxpbmVUb1RleHRWICsgU0ZlbnRyeUhlaWdodCArIFNGbGluZVRvVGV4dFYgKyAxICsKKwlTRmxpbmVUb1RleHRWICsgU0ZsaXN0U2l6ZSAqIFNGZW50cnlIZWlnaHQgKworCVNGbGluZVRvVGV4dFYgKyAxICsgc2Nyb2xsVGhpY2tuZXNzOworCisgICAgU0ZwYXRoU2Nyb2xsV2lkdGggPSAzICogbGlzdFdpZHRoICsgMiAqIGxpc3RTcGFjaW5nICsgNDsKKworICAgIGhTY3JvbGxYID0gLTE7CisgICAgaFNjcm9sbFkgPSBTRmxpbmVUb1RleHRWICsgU0ZlbnRyeUhlaWdodCArIFNGbGluZVRvVGV4dFYgKyAxICsKKwlTRmxpbmVUb1RleHRWICsgU0ZsaXN0U2l6ZSAqIFNGZW50cnlIZWlnaHQgKworCVNGbGluZVRvVGV4dFY7CisgICAgU0ZoU2Nyb2xsV2lkdGggPSBTRmxpbmVUb1RleHRIICsgU0ZlbnRyeVdpZHRoICsgU0ZsaW5lVG9UZXh0SDsKKworICAgIHZTY3JvbGxYID0gU0ZsaW5lVG9UZXh0SCArIFNGZW50cnlXaWR0aCArIFNGbGluZVRvVGV4dEg7CisgICAgdlNjcm9sbFkgPSBTRmxpbmVUb1RleHRWICsgU0ZlbnRyeUhlaWdodCArIFNGbGluZVRvVGV4dFY7CisgICAgU0Z2U2Nyb2xsSGVpZ2h0ID0gU0ZsaW5lVG9UZXh0ViArIFNGbGlzdFNpemUgKiBTRmVudHJ5SGVpZ2h0ICsKKwlTRmxpbmVUb1RleHRWOworCisgICAgU0Z1cHBlclggPSBTRmxpbmVUb1RleHRIICsgU0ZlbnRyeVdpZHRoICsgU0ZsaW5lVG9UZXh0SCAtIDE7CisgICAgU0Zsb3dlclkgPSBTRmxpbmVUb1RleHRWICsgU0ZlbnRyeUhlaWdodCArIFNGbGluZVRvVGV4dFYgKyAxICsKKwlTRmxpbmVUb1RleHRWOworICAgIFNGdXBwZXJZID0gU0ZsaW5lVG9UZXh0ViArIFNGZW50cnlIZWlnaHQgKyBTRmxpbmVUb1RleHRWICsgMSArCisJU0ZsaW5lVG9UZXh0ViArIFNGbGlzdFNpemUgKiBTRmVudHJ5SGVpZ2h0IC0gMTsKKworICAgIFNGdGV4dFggPSBTRmxpbmVUb1RleHRIICsgU0ZiZXNpZGVUZXh0OworICAgIFNGdGV4dFlvZmZzZXQgPSBTRmxvd2VyWSArIFNGYWJvdmVBbmRCZWxvd1RleHQgKyBTRmNoYXJBc2NlbnQ7CisKKyAgICBTRnNlZ3NbMF0ueDEgPSAwOworICAgIFNGc2Vnc1swXS55MSA9IHZTY3JvbGxZOworICAgIFNGc2Vnc1swXS54MiA9IHZTY3JvbGxYIC0gMTsKKyAgICBTRnNlZ3NbMF0ueTIgPSB2U2Nyb2xsWTsKKyAgICBTRnNlZ3NbMV0ueDEgPSB2U2Nyb2xsWDsKKyAgICBTRnNlZ3NbMV0ueTEgPSAwOworICAgIFNGc2Vnc1sxXS54MiA9IHZTY3JvbGxYOworICAgIFNGc2Vnc1sxXS55MiA9IHZTY3JvbGxZIC0gMTsKKworICAgIFNGY29tcGxldGlvblNlZ3NbMF0ueDEgPSBTRmNvbXBsZXRpb25TZWdzWzBdLngyID0gU0ZsaW5lVG9UZXh0SDsKKyAgICBTRmNvbXBsZXRpb25TZWdzWzFdLngxID0gU0Zjb21wbGV0aW9uU2Vnc1sxXS54MiA9CisJU0ZsaW5lVG9UZXh0SCArIFNGZW50cnlXaWR0aCAtIDE7CisKKyAgICBzZWxGaWxlRmllbGQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZUZpZWxkIiwKKwkJYXNjaWlUZXh0V2lkZ2V0Q2xhc3MsIHNlbEZpbGVGb3JtLAorCQlYdE53aWR0aCwgMyAqIGxpc3RXaWR0aCArIDIgKiBsaXN0U3BhY2luZyArIDQsCisJCVh0TmJvcmRlckNvbG9yLCBTRmZvcmUsCisJCVh0TmZyb21WZXJ0LCBzZWxGaWxlUHJvbXB0LAorCQlYdE52ZXJ0RGlzdGFuY2UsIDEwLAorCQlYdE5yZXNpemFibGUsIFRydWUsCisJCVh0TnRvcCwgWHRDaGFpblRvcCwKKwkJWHROYm90dG9tLCBYdENoYWluVG9wLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAorCQlYdE5zdHJpbmcsIFNGdGV4dEJ1ZmZlciwKKwkJWHRObGVuZ3RoLCBNQVhQQVRITCwKKwkJWHROZWRpdFR5cGUsIFhhd3RleHRFZGl0LAorCQlYdE53cmFwLCBYYXd0ZXh0V3JhcFdvcmQsCisJCVh0TnJlc2l6ZSwgWGF3dGV4dFJlc2l6ZUhlaWdodCwKKwkJWHROdXNlU3RyaW5nSW5QbGFjZSwgVHJ1ZSwKKwkJTlVMTCk7CisKKyAgICBYdE92ZXJyaWRlVHJhbnNsYXRpb25zKHNlbEZpbGVGaWVsZCwKKwkgICAgWHRQYXJzZVRyYW5zbGF0aW9uVGFibGUob25lTGluZVRleHRFZGl0VHJhbnNsYXRpb25zKSk7CisgICAgWHRTZXRLZXlib2FyZEZvY3VzKHNlbEZpbGVGb3JtLCBzZWxGaWxlRmllbGQpOworCisgICAgc2VsRmlsZUhTY3JvbGwgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZUhTY3JvbGwiLAorI2lmZGVmIEZFQVRfR1VJX05FWFRBVworCQlzY3JvbGxiYXJXaWRnZXRDbGFzcywgc2VsRmlsZUZvcm0sCisjZWxzZQorCQl2aW1fc2Nyb2xsYmFyV2lkZ2V0Q2xhc3MsIHNlbEZpbGVGb3JtLAorI2VuZGlmCisJCVh0Tm9yaWVudGF0aW9uLCBYdG9yaWVudEhvcml6b250YWwsCisJCVh0TndpZHRoLCBTRnBhdGhTY3JvbGxXaWR0aCwKKwkJWHROaGVpZ2h0LCBzY3JvbGxUaGlja25lc3MsCisJCVh0TmJvcmRlckNvbG9yLCBTRmZvcmUsCisJCVh0TmZyb21WZXJ0LCBzZWxGaWxlRmllbGQsCisJCVh0TnZlcnREaXN0YW5jZSwgMzAsCisJCVh0TnRvcCwgWHRDaGFpblRvcCwKKwkJWHROYm90dG9tLCBYdENoYWluVG9wLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAorCQlYdE5mb3JlZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLAorCQlYdE5iYWNrZ3JvdW5kLCBndWkuc2Nyb2xsX2JnX3BpeGVsLAorI2lmbmRlZiBGRUFUX0dVSV9ORVhUQVcKKwkJWHRObGltaXRUaHVtYiwgMSwKKyNlbmRpZgorCQlOVUxMKTsKKworICAgIFh0QWRkQ2FsbGJhY2soc2VsRmlsZUhTY3JvbGwsIFh0Tmp1bXBQcm9jLAorCSAgICAoWHRDYWxsYmFja1Byb2MpIFNGcGF0aFNsaWRlck1vdmVkQ2FsbGJhY2ssIChYdFBvaW50ZXIpTlVMTCk7CisgICAgWHRBZGRDYWxsYmFjayhzZWxGaWxlSFNjcm9sbCwgWHROc2Nyb2xsUHJvYywKKwkgICAgKFh0Q2FsbGJhY2tQcm9jKSBTRnBhdGhBcmVhU2VsZWN0ZWRDYWxsYmFjaywgKFh0UG9pbnRlcilOVUxMKTsKKworICAgIHNlbEZpbGVMaXN0c1swXSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJzZWxGaWxlTGlzdDEiLAorCQljb21wb3NpdGVXaWRnZXRDbGFzcywgc2VsRmlsZUZvcm0sCisJCVh0TndpZHRoLCBsaXN0V2lkdGgsCisJCVh0TmhlaWdodCwgbGlzdEhlaWdodCwKKwkJWHROZm9yZWdyb3VuZCwgIFNGZm9yZSwKKwkJWHROYmFja2dyb3VuZCwgIFNGYmFjaywKKwkJWHROYm9yZGVyQ29sb3IsIFNGZm9yZSwKKwkJWHROZnJvbVZlcnQsIHNlbEZpbGVIU2Nyb2xsLAorCQlYdE52ZXJ0RGlzdGFuY2UsIDEwLAorCQlYdE50b3AsIFh0Q2hhaW5Ub3AsCisJCVh0TmJvdHRvbSwgWHRDaGFpblRvcCwKKwkJWHRObGVmdCwgWHRDaGFpbkxlZnQsCisJCVh0TnJpZ2h0LCBYdENoYWluTGVmdCwKKwkJTlVMTCk7CisKKyAgICBzZWxGaWxlTGlzdHNbMV0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZUxpc3QyIiwKKwkJY29tcG9zaXRlV2lkZ2V0Q2xhc3MsIHNlbEZpbGVGb3JtLAorCQlYdE53aWR0aCwgbGlzdFdpZHRoLAorCQlYdE5oZWlnaHQsIGxpc3RIZWlnaHQsCisJCVh0TmZvcmVncm91bmQsICBTRmZvcmUsCisJCVh0TmJhY2tncm91bmQsICBTRmJhY2ssCisJCVh0TmJvcmRlckNvbG9yLCBTRmZvcmUsCisJCVh0TmZyb21Ib3Jpeiwgc2VsRmlsZUxpc3RzWzBdLAorCQlYdE5mcm9tVmVydCwgc2VsRmlsZUhTY3JvbGwsCisJCVh0Tmhvcml6RGlzdGFuY2UsIGxpc3RTcGFjaW5nLAorCQlYdE52ZXJ0RGlzdGFuY2UsIDEwLAorCQlYdE50b3AsIFh0Q2hhaW5Ub3AsCisJCVh0TmJvdHRvbSwgWHRDaGFpblRvcCwKKwkJWHRObGVmdCwgWHRDaGFpbkxlZnQsCisJCVh0TnJpZ2h0LCBYdENoYWluTGVmdCwKKwkJTlVMTCk7CisKKyAgICBzZWxGaWxlTGlzdHNbMl0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZUxpc3QzIiwKKwkJY29tcG9zaXRlV2lkZ2V0Q2xhc3MsIHNlbEZpbGVGb3JtLAorCQlYdE53aWR0aCwgbGlzdFdpZHRoLAorCQlYdE5oZWlnaHQsIGxpc3RIZWlnaHQsCisJCVh0TmZvcmVncm91bmQsICBTRmZvcmUsCisJCVh0TmJhY2tncm91bmQsICBTRmJhY2ssCisJCVh0TmJvcmRlckNvbG9yLCBTRmZvcmUsCisJCVh0TmZyb21Ib3Jpeiwgc2VsRmlsZUxpc3RzWzFdLAorCQlYdE5mcm9tVmVydCwgc2VsRmlsZUhTY3JvbGwsCisJCVh0Tmhvcml6RGlzdGFuY2UsIGxpc3RTcGFjaW5nLAorCQlYdE52ZXJ0RGlzdGFuY2UsIDEwLAorCQlYdE50b3AsIFh0Q2hhaW5Ub3AsCisJCVh0TmJvdHRvbSwgWHRDaGFpblRvcCwKKwkJWHRObGVmdCwgWHRDaGFpbkxlZnQsCisJCVh0TnJpZ2h0LCBYdENoYWluTGVmdCwKKwkJTlVMTCk7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKQorICAgIHsKKwlzZWxGaWxlVlNjcm9sbHNbbl0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZVZTY3JvbGwiLAorI2lmZGVmIEZFQVRfR1VJX05FWFRBVworCQkgICAgc2Nyb2xsYmFyV2lkZ2V0Q2xhc3MsIHNlbEZpbGVMaXN0c1tuXSwKKyNlbHNlCisJCSAgICB2aW1fc2Nyb2xsYmFyV2lkZ2V0Q2xhc3MsIHNlbEZpbGVMaXN0c1tuXSwKKyNlbmRpZgorCQkgICAgWHROeCwgdlNjcm9sbFgsCisJCSAgICBYdE55LCB2U2Nyb2xsWSwKKwkJICAgIFh0TndpZHRoLCBzY3JvbGxUaGlja25lc3MsCisJCSAgICBYdE5oZWlnaHQsIFNGdlNjcm9sbEhlaWdodCwKKwkJICAgIFh0TmJvcmRlckNvbG9yLCBTRmZvcmUsCisJCSAgICBYdE5mb3JlZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLAorCQkgICAgWHROYmFja2dyb3VuZCwgZ3VpLnNjcm9sbF9iZ19waXhlbCwKKyNpZm5kZWYgRkVBVF9HVUlfTkVYVEFXCisJCSAgICBYdE5saW1pdFRodW1iLCAxLAorI2VuZGlmCisJCSAgICBOVUxMKTsKKworCVh0QWRkQ2FsbGJhY2soc2VsRmlsZVZTY3JvbGxzW25dLCBYdE5qdW1wUHJvYywKKwkJKFh0Q2FsbGJhY2tQcm9jKVNGdkZsb2F0U2xpZGVyTW92ZWRDYWxsYmFjaywgKFh0UG9pbnRlciluKTsKKwlYdEFkZENhbGxiYWNrKHNlbEZpbGVWU2Nyb2xsc1tuXSwgWHROc2Nyb2xsUHJvYywKKwkJKFh0Q2FsbGJhY2tQcm9jKVNGdkFyZWFTZWxlY3RlZENhbGxiYWNrLCAoWHRQb2ludGVyKW4pOworCisJc2VsRmlsZUhTY3JvbGxzW25dID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInNlbEZpbGVIU2Nyb2xsIiwKKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKwkJICAgIHNjcm9sbGJhcldpZGdldENsYXNzLCBzZWxGaWxlTGlzdHNbbl0sCisjZWxzZQorCQkgICAgdmltX3Njcm9sbGJhcldpZGdldENsYXNzLCBzZWxGaWxlTGlzdHNbbl0sCisjZW5kaWYKKwkJICAgIFh0Tm9yaWVudGF0aW9uLCBYdG9yaWVudEhvcml6b250YWwsCisJCSAgICBYdE54LCBoU2Nyb2xsWCwKKwkJICAgIFh0TnksIGhTY3JvbGxZLAorCQkgICAgWHROd2lkdGgsIFNGaFNjcm9sbFdpZHRoLAorCQkgICAgWHROaGVpZ2h0LCBzY3JvbGxUaGlja25lc3MsCisJCSAgICBYdE5ib3JkZXJDb2xvciwgU0Zmb3JlLAorCQkgICAgWHROZm9yZWdyb3VuZCwgZ3VpLnNjcm9sbF9mZ19waXhlbCwKKwkJICAgIFh0TmJhY2tncm91bmQsIGd1aS5zY3JvbGxfYmdfcGl4ZWwsCisjaWZuZGVmIEZFQVRfR1VJX05FWFRBVworCQkgICAgWHRObGltaXRUaHVtYiwgMSwKKyNlbmRpZgorCQkgICAgTlVMTCk7CisKKwlYdEFkZENhbGxiYWNrKHNlbEZpbGVIU2Nyb2xsc1tuXSwgWHROanVtcFByb2MsCisJCShYdENhbGxiYWNrUHJvYylTRmhTbGlkZXJNb3ZlZENhbGxiYWNrLCAoWHRQb2ludGVyKW4pOworCVh0QWRkQ2FsbGJhY2soc2VsRmlsZUhTY3JvbGxzW25dLCBYdE5zY3JvbGxQcm9jLAorCQkoWHRDYWxsYmFja1Byb2MpU0ZoQXJlYVNlbGVjdGVkQ2FsbGJhY2ssIChYdFBvaW50ZXIpbik7CisgICAgfQorCisgICAgc2VsRmlsZU9LID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInNlbEZpbGVPSyIsCisJCWNvbW1hbmRXaWRnZXRDbGFzcywgc2VsRmlsZUZvcm0sCisJCVh0TmxhYmVsLCBvaywKKwkJWHROcmVzaXphYmxlLCBUcnVlLAorCQlYdE5jYWxsYmFjaywgU0Zva1NlbGVjdCwKKwkJWHROZm9yZWdyb3VuZCwgIFNGZm9yZSwKKwkJWHROYmFja2dyb3VuZCwgIFNGYmFjaywKKwkJWHROYm9yZGVyQ29sb3IsIFNGZm9yZSwKKwkJWHROZnJvbUhvcml6LCBzZWxGaWxlTGlzdHNbMF0sCisJCVh0TmZyb21WZXJ0LCBzZWxGaWxlTGlzdHNbMF0sCisJCVh0TnZlcnREaXN0YW5jZSwgMzAsCisJCVh0TnRvcCwgWHRDaGFpblRvcCwKKwkJWHROYm90dG9tLCBYdENoYWluVG9wLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAorCQlOVUxMKTsKKworICAgIHNlbEZpbGVDYW5jZWwgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgic2VsRmlsZUNhbmNlbCIsCisJCWNvbW1hbmRXaWRnZXRDbGFzcywgc2VsRmlsZUZvcm0sCisJCVh0TmxhYmVsLCBjYW5jZWwsCisJCVh0TnJlc2l6YWJsZSwgVHJ1ZSwKKwkJWHROY2FsbGJhY2ssIFNGY2FuY2VsU2VsZWN0LAorCQlYdE5mb3JlZ3JvdW5kLCAgU0Zmb3JlLAorCQlYdE5iYWNrZ3JvdW5kLCAgU0ZiYWNrLAorCQlYdE5ib3JkZXJDb2xvciwgU0Zmb3JlLAorCQlYdE5mcm9tSG9yaXosIHNlbEZpbGVPSywKKwkJWHROZnJvbVZlcnQsIHNlbEZpbGVMaXN0c1swXSwKKwkJWHROaG9yaXpEaXN0YW5jZSwgMzAsCisJCVh0TnZlcnREaXN0YW5jZSwgMzAsCisJCVh0TnRvcCwgWHRDaGFpblRvcCwKKwkJWHROYm90dG9tLCBYdENoYWluVG9wLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAorCQlOVUxMKTsKKworICAgIFh0U2V0TWFwcGVkV2hlbk1hbmFnZWQoc2VsRmlsZSwgRmFsc2UpOworICAgIFh0UmVhbGl6ZVdpZGdldChzZWxGaWxlKTsKKworICAgIC8qIEFkZCBXTV9ERUxFVEVfV0lORE9XIHByb3RvY29sICovCisgICAgU0Z3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKFNGZGlzcGxheSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7CisgICAgWFNldFdNUHJvdG9jb2xzKFNGZGlzcGxheSwgWHRXaW5kb3coc2VsRmlsZSksICZTRndtRGVsZXRlV2luZG93LCAxKTsKKworICAgIFNGY3JlYXRlR0MoKTsKKworICAgIGZvciAobiA9IDA7IG4gPCAzOyBuKyspCisgICAgeworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgRXhwb3N1cmVNYXNrLCBUcnVlLAorCQkoWHRFdmVudEhhbmRsZXIpU0ZleHBvc2VMaXN0LCAoWHRQb2ludGVyKW4pOworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgRW50ZXJXaW5kb3dNYXNrLCBGYWxzZSwKKwkJKFh0RXZlbnRIYW5kbGVyKVNGZW50ZXJMaXN0LCAoWHRQb2ludGVyKW4pOworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgTGVhdmVXaW5kb3dNYXNrLCBGYWxzZSwKKwkJKFh0RXZlbnRIYW5kbGVyKVNGbGVhdmVMaXN0LCAoWHRQb2ludGVyKW4pOworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgUG9pbnRlck1vdGlvbk1hc2ssIEZhbHNlLAorCQkoWHRFdmVudEhhbmRsZXIpU0Ztb3Rpb25MaXN0LCAoWHRQb2ludGVyKW4pOworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgQnV0dG9uUHJlc3NNYXNrLCBGYWxzZSwKKwkJKFh0RXZlbnRIYW5kbGVyKVNGYnV0dG9uUHJlc3NMaXN0LCAoWHRQb2ludGVyKW4pOworCVh0QWRkRXZlbnRIYW5kbGVyKHNlbEZpbGVMaXN0c1tuXSwgQnV0dG9uUmVsZWFzZU1hc2ssIEZhbHNlLAorCQkoWHRFdmVudEhhbmRsZXIpU0ZidXR0b25SZWxlYXNlTGlzdCwgKFh0UG9pbnRlciluKTsKKyAgICB9CisKKyAgICBYdEFkZEV2ZW50SGFuZGxlcihzZWxGaWxlRmllbGQsIEtleVByZXNzTWFzaywgRmFsc2UsCisJCQkJICAgICAgIFNGbW9kVmVyaWZ5Q2FsbGJhY2ssIChYdFBvaW50ZXIpTlVMTCk7CisKKyAgICBTRmFwcCA9IFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoc2VsRmlsZSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorU0Z0ZXh0Q2hhbmdlZCgpCit7CisjaWYgZGVmaW5lZChGRUFUX1hGT05UU0VUKSAmJiBkZWZpbmVkKFh0TmludGVybmF0aW9uYWwpCisgICAgaWYgKF9YYXdUZXh0Rm9ybWF0KChUZXh0V2lkZ2V0KXNlbEZpbGVGaWVsZCkgPT0gWGF3Rm10V2lkZSkKKyAgICB7CisJd2NoYXJfdCAqd2NidWY9KHdjaGFyX3QgKilTRnRleHRCdWZmZXI7CisKKwlpZiAoKHdjYnVmWzBdID09IEwnLycpIHx8ICh3Y2J1ZlswXSA9PSBMJ34nKSkKKwl7CisJICAgICh2b2lkKSB3Y3N0b21icyhTRmN1cnJlbnRQYXRoLCB3Y2J1ZiwgTUFYUEFUSEwpOworCSAgICBTRnRleHRQb3MgPSBYYXdUZXh0R2V0SW5zZXJ0aW9uUG9pbnQoc2VsRmlsZUZpZWxkKTsKKwl9CisJZWxzZQorCXsKKwkgICAgc3RyY3B5KFNGY3VycmVudFBhdGgsIFNGc3RhcnREaXIpOworCSAgICAodm9pZCkgd2NzdG9tYnMoU0ZjdXJyZW50UGF0aCArIHN0cmxlbihTRmN1cnJlbnRQYXRoKSwgd2NidWYsIE1BWFBBVEhMKTsKKworCSAgICBTRnRleHRQb3MgPSBYYXdUZXh0R2V0SW5zZXJ0aW9uUG9pbnQoc2VsRmlsZUZpZWxkKSArIHN0cmxlbihTRnN0YXJ0RGlyKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmICgoU0Z0ZXh0QnVmZmVyWzBdID09ICcvJykgfHwgKFNGdGV4dEJ1ZmZlclswXSA9PSAnficpKQorICAgIHsKKwkodm9pZCkgc3RyY3B5KFNGY3VycmVudFBhdGgsIFNGdGV4dEJ1ZmZlcik7CisJU0Z0ZXh0UG9zID0gWGF3VGV4dEdldEluc2VydGlvblBvaW50KHNlbEZpbGVGaWVsZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJKHZvaWQpIHN0cmNhdChzdHJjcHkoU0ZjdXJyZW50UGF0aCwgU0ZzdGFydERpciksIFNGdGV4dEJ1ZmZlcik7CisKKwlTRnRleHRQb3MgPSBYYXdUZXh0R2V0SW5zZXJ0aW9uUG9pbnQoc2VsRmlsZUZpZWxkKSArIHN0cmxlbihTRnN0YXJ0RGlyKTsKKyAgICB9CisKKyAgICBpZiAoIVNGd29ya1Byb2NBZGRlZCkKKyAgICB7CisJKHZvaWQpIFh0QXBwQWRkV29ya1Byb2MoU0ZhcHAsIChYdFdvcmtQcm9jKVNGd29ya1Byb2MsIE5VTEwpOworCVNGd29ya1Byb2NBZGRlZCA9IDE7CisgICAgfQorCisgICAgU0Z1cGRhdGVQYXRoKCk7Cit9CisKKyAgICBzdGF0aWMgY2hhciAqCitTRmdldFRleHQoKQoreworI2lmIGRlZmluZWQoRkVBVF9YRk9OVFNFVCkgJiYgZGVmaW5lZChYdE5pbnRlcm5hdGlvbmFsKQorICAgIGNoYXIgKmJ1ZjsKKworICAgIGlmIChfWGF3VGV4dEZvcm1hdCgoVGV4dFdpZGdldClzZWxGaWxlRmllbGQpID09IFhhd0ZtdFdpZGUpCisgICAgeworCXdjaGFyX3QgKndjYnVmOworCWludCBtYnNsZW5ndGg7CisKKwlYdFZhR2V0VmFsdWVzKHNlbEZpbGVGaWVsZCwKKwkgICAgWHROc3RyaW5nLCAmd2NidWYsCisJTlVMTCk7CisJbWJzbGVuZ3RoID0gd2NzdG9tYnMoTlVMTCwgd2NidWYsIDApOworCS8qIEhhY2s6IHNvbWUgYnJva2VuIHdjc3RvbWJzKCkgcmV0dXJucyB6ZXJvLCBqdXN0IGdldCBhIGxhcmdlIGJ1ZmZlciAqLworCWlmIChtYnNsZW5ndGggPT0gMCAmJiB3Y2J1ZiAhPSBOVUxMICYmIHdjYnVmWzBdICE9IDApCisJICAgIG1ic2xlbmd0aCA9IE1BWFBBVEhMOworCWJ1Zj0oY2hhciAqKVh0TWFsbG9jKG1ic2xlbmd0aCArIDEpOworCXdjc3RvbWJzKGJ1Ziwgd2NidWYsIG1ic2xlbmd0aCArMSk7CisJcmV0dXJuIGJ1ZjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopU0Z0ZXh0QnVmZmVyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitTRnByZXBhcmVUb1JldHVybigpCit7CisgICAgU0ZzdGF0dXMgPSBTRUxfRklMRV9OVUxMOworICAgIFh0UmVtb3ZlR3JhYihzZWxGaWxlKTsKKyAgICBYdFVubWFwV2lkZ2V0KHNlbEZpbGUpOworICAgIFh0UmVtb3ZlVGltZU91dChTRmRpck1vZFRpbWVySWQpOworICAgIGlmIChTRmNoZGlyKFNGc3RhcnREaXIpKQorICAgIHsKKwlFTVNHKF8oIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiKSk7CisJU0ZzdGF0dXMgPSBTRUxfRklMRV9DQU5DRUw7CisgICAgfQorfQorCisgICAgY2hhciAqCit2aW1fU2VsRmlsZSh0b3BsZXZlbCwgcHJvbXB0LCBpbml0X3BhdGgsIHNob3dfZW50cnksIHgsIHksIGZnLCBiZywgc2Nyb2xsX2ZnLCBzY3JvbGxfYmcpCisgICAgV2lkZ2V0CXRvcGxldmVsOworICAgIGNoYXIJKnByb21wdDsKKyAgICBjaGFyCSppbml0X3BhdGg7CisgICAgaW50CQkoKnNob3dfZW50cnkpKCk7CisgICAgaW50CQl4LCB5OworICAgIGd1aWNvbG9yX1QJZmcsIGJnOworICAgIGd1aWNvbG9yX1QJc2Nyb2xsX2ZnLCBzY3JvbGxfYmc7IC8qIFRoZSAiU2Nyb2xsYmFyIiBncm91cCBjb2xvcnMgKi8KK3sKKyAgICBzdGF0aWMgaW50CWZpcnN0VGltZSA9IDE7CisgICAgWEV2ZW50CWV2ZW50OworICAgIGNoYXIJKm5hbWVfcmV0dXJuOworCisgICAgaWYgKHByb21wdCA9PSBOVUxMKQorCXByb21wdCA9IF8oIlBhdGhuYW1lOiIpOworICAgIFNGZm9yZSA9IGZnOworICAgIFNGYmFjayA9IGJnOworCisgICAgaWYgKG1jaF9kaXJuYW1lKChjaGFyX3UgKilTRnN0YXJ0RGlyLCBNQVhQQVRITCkgPT0gRkFJTCkKKyAgICB7CisJRU1TRyhfKCJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IikpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChmaXJzdFRpbWUpCisgICAgeworCWZpcnN0VGltZSA9IDA7CisJU0ZkaXNwbGF5ID0gWHREaXNwbGF5KHRvcGxldmVsKTsKKwlTRmNyZWF0ZVdpZGdldHModG9wbGV2ZWwsIHByb21wdCwgXygiT0siKSwgXygiQ2FuY2VsIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCVh0VmFTZXRWYWx1ZXMoc2VsRmlsZVByb21wdCwgWHRObGFiZWwsIHByb21wdCwgTlVMTCk7CisJWHRWYVNldFZhbHVlcyhzZWxGaWxlLCBYdE50aXRsZSwgcHJvbXB0LCBOVUxMKTsKKwlTRnNldENvbG9ycyhiZywgZmcsIHNjcm9sbF9iZywgc2Nyb2xsX2ZnKTsKKyAgICB9CisKKyAgICBYdFZhU2V0VmFsdWVzKHNlbEZpbGUsIFh0TngsIHgsIFh0TnksIHksIE5VTEwpOworICAgIFh0TWFwV2lkZ2V0KHNlbEZpbGUpOworCisgICAgKHZvaWQpc3RyY2F0KFNGc3RhcnREaXIsICIvIik7CisgICAgKHZvaWQpc3RyY3B5KFNGY3VycmVudERpciwgU0ZzdGFydERpcik7CisKKyAgICBpZiAoaW5pdF9wYXRoKQorICAgIHsKKwlpZiAoaW5pdF9wYXRoWzBdID09ICcvJykKKwl7CisJICAgICh2b2lkKXN0cmNweShTRmN1cnJlbnRQYXRoLCBpbml0X3BhdGgpOworCSAgICBpZiAoc3RybmNtcChTRmN1cnJlbnRQYXRoLCBTRnN0YXJ0RGlyLCBzdHJsZW4oU0ZzdGFydERpcikpKQorCQlTRnNldFRleHQoU0ZjdXJyZW50UGF0aCk7CisJICAgIGVsc2UKKwkJU0ZzZXRUZXh0KCYoU0ZjdXJyZW50UGF0aFtzdHJsZW4oU0ZzdGFydERpcildKSk7CisJfQorCWVsc2UKKwl7CisJICAgICh2b2lkKXN0cmNhdChzdHJjcHkoU0ZjdXJyZW50UGF0aCwgU0ZzdGFydERpciksIGluaXRfcGF0aCk7CisJICAgIFNGc2V0VGV4dCgmKFNGY3VycmVudFBhdGhbc3RybGVuKFNGc3RhcnREaXIpXSkpOworCX0KKyAgICB9CisgICAgZWxzZQorCSh2b2lkKXN0cmNweShTRmN1cnJlbnRQYXRoLCBTRnN0YXJ0RGlyKTsKKworICAgIFNGZnVuYyA9IHNob3dfZW50cnk7CisKKyAgICBTRnRleHRDaGFuZ2VkKCk7CisKKyAgICBYdEFkZEdyYWIoc2VsRmlsZSwgVHJ1ZSwgVHJ1ZSk7CisKKyAgICBTRmRpck1vZFRpbWVySWQgPSBYdEFwcEFkZFRpbWVPdXQoU0ZhcHAsICh1bnNpZ25lZCBsb25nKSAxMDAwLAorCSAgICBTRmRpck1vZFRpbWVyLCAoWHRQb2ludGVyKSBOVUxMKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKwlYdEFwcE5leHRFdmVudChTRmFwcCwgJmV2ZW50KTsKKwlYdERpc3BhdGNoRXZlbnQoJmV2ZW50KTsKKwlzd2l0Y2ggKFNGc3RhdHVzKQorCXsKKwkgICAgY2FzZSBTRUxfRklMRV9URVhUOgorCQlTRnN0YXR1cyA9IFNFTF9GSUxFX05VTEw7CisJCVNGdGV4dENoYW5nZWQoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0VMX0ZJTEVfT0s6CisJCW5hbWVfcmV0dXJuID0gU0ZnZXRUZXh0KCk7CisJCVNGcHJlcGFyZVRvUmV0dXJuKCk7CisJCXJldHVybiBuYW1lX3JldHVybjsKKwkgICAgY2FzZSBTRUxfRklMRV9DQU5DRUw6CisJCVNGcHJlcGFyZVRvUmV0dXJuKCk7CisJCXJldHVybiBOVUxMOworCSAgICBjYXNlIFNFTF9GSUxFX05VTEw6CisJCWJyZWFrOworCX0KKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9CUk9XU0UgKi8KZGlmZiAtLWdpdCBhL3NyYy9ndWlfYXRfc2IuYyBiL3NyYy9ndWlfYXRfc2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmUzYWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9hdF9zYi5jCkBAIC0wLDAgKzEsMTIxMyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDogKi8KKy8qCisgKiBNT0RJRklFRCBBVEhFTkEgU0NST0xMQkFSIChVU0lORyBBUlJPV0hFQURTIEFUIEVORFMgT0YgVFJBVkVMKQorICogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgMTk5MiBieSBNaXRjaCBUcmFjaHRlbmJlcmcKKyAqIFJpZ2h0cywgcGVybWlzc2lvbnMsIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFyZSBhcyBpbiB0aGUgREVDIGFuZCBNSVQKKyAqIG5vdGljZSBiZWxvdy4KKyAqICRYQ29uc29ydGl1bTogU2Nyb2xsYmFyLmMsdiAxLjcyIDk0LzA0LzE3IDIwOjEyOjQwIGthbGViIEV4cCAkCisgKi8KKworLyoKKyAqIE1vZGlmaWVkIGZvciBWaW0gYnkgQmlsbCBGb3N0ZXIgYW5kIEJyYW0gTW9vbGVuYWFyCisgKi8KKworLyoKKworQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4LCAxOTk0CVggQ29uc29ydGl1bQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKK2NvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgWAorQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KK0FDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluCit0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29ydGl1bS4KKworQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAordGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwKK0JFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKi8KKworLyogU2Nyb2xsQmFyLmMgKi8KKy8qIGNyZWF0ZWQgYnkgd2Vpc3NtYW4sIE1vbiBKdWwgIDcgMTM6MjA6MDMgMTk4NiAqLworLyogY29udmVydGVkIGJ5IHN3aWNrLCBUaHUgQXVnIDI3IDE5ODcgKi8KKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWNQLmg+CisjaW5jbHVkZSA8WDExL1N0cmluZ0RlZnMuaD4KKworI2luY2x1ZGUgPFgxMS9YYXcvWGF3SW5pdC5oPgorI2luY2x1ZGUgInZpbS5oIgorI2luY2x1ZGUgImd1aV9hdF9zYi5oIgorCisjaW5jbHVkZSA8WDExL1htdS9EcmF3aW5nLmg+CisKKy8qIFByaXZhdGUgZGVmaW5pdGlvbnMuICovCisKK3N0YXRpYyBjaGFyIGRlZmF1bHRUcmFuc2xhdGlvbnNbXSA9CisgICAgIjxCdG4xRG93bj46IE5vdGlmeVNjcm9sbCgpXG5cCisgICAgIDxCdG4yRG93bj46IE1vdmVUaHVtYigpIE5vdGlmeVRodW1iKClcblwKKyAgICAgPEJ0bjNEb3duPjogTm90aWZ5U2Nyb2xsKClcblwKKyAgICAgPEJ0bjREb3duPjogU2Nyb2xsT25lTGluZVVwKClcblwKKyAgICAgU2hpZnQ8QnRuNERvd24+OiBTY3JvbGxQYWdlVXAoKVxuXAorICAgICA8QnRuNURvd24+OiBTY3JvbGxPbmVMaW5lRG93bigpXG5cCisgICAgIFNoaWZ0PEJ0bjVEb3duPjogU2Nyb2xsUGFnZURvd24oKVxuXAorICAgICA8QnRuMU1vdGlvbj46IEhhbmRsZVRodW1iKClcblwKKyAgICAgPEJ0bjNNb3Rpb24+OiBIYW5kbGVUaHVtYigpXG5cCisgICAgIDxCdG4yTW90aW9uPjogTW92ZVRodW1iKCkgTm90aWZ5VGh1bWIoKVxuXAorICAgICA8QnRuVXA+OiBFbmRTY3JvbGwoKSI7CisKK3N0YXRpYyBmbG9hdCBmbG9hdFplcm8gPSAwLjA7CisKKyNkZWZpbmUgT2Zmc2V0KGZpZWxkKSBYdE9mZnNldE9mKFNjcm9sbGJhclJlYywgZmllbGQpCisKK3N0YXRpYyBYdFJlc291cmNlIHJlc291cmNlc1tdID0KK3sKKyAge1h0Tmxlbmd0aCwgWHRDTGVuZ3RoLCBYdFJEaW1lbnNpb24sIHNpemVvZihEaW1lbnNpb24pLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIubGVuZ3RoKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAxfSwKKyAge1h0TnRoaWNrbmVzcywgWHRDVGhpY2tuZXNzLCBYdFJEaW1lbnNpb24sIHNpemVvZihEaW1lbnNpb24pLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIudGhpY2tuZXNzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAxNH0sCisgIHtYdE5vcmllbnRhdGlvbiwgWHRDT3JpZW50YXRpb24sIFh0Uk9yaWVudGF0aW9uLCBzaXplb2YoWHRPcmllbnRhdGlvbiksCisgICAgICBPZmZzZXQoc2Nyb2xsYmFyLm9yaWVudGF0aW9uKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBYdG9yaWVudFZlcnRpY2FsfSwKKyAge1h0TnNjcm9sbFByb2MsIFh0Q0NhbGxiYWNrLCBYdFJDYWxsYmFjaywgc2l6ZW9mKFh0UG9pbnRlciksCisgICAgICAgT2Zmc2V0KHNjcm9sbGJhci5zY3JvbGxQcm9jKSwgWHRSQ2FsbGJhY2ssIE5VTEx9LAorICB7WHROdGh1bWJQcm9jLCBYdENDYWxsYmFjaywgWHRSQ2FsbGJhY2ssIHNpemVvZihYdFBvaW50ZXIpLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIudGh1bWJQcm9jKSwgWHRSQ2FsbGJhY2ssIE5VTEx9LAorICB7WHROanVtcFByb2MsIFh0Q0NhbGxiYWNrLCBYdFJDYWxsYmFjaywgc2l6ZW9mKFh0UG9pbnRlciksCisgICAgICAgT2Zmc2V0KHNjcm9sbGJhci5qdW1wUHJvYyksIFh0UkNhbGxiYWNrLCBOVUxMfSwKKyAge1h0TnRodW1iLCBYdENUaHVtYiwgWHRSQml0bWFwLCBzaXplb2YoUGl4bWFwKSwKKyAgICAgICBPZmZzZXQoc2Nyb2xsYmFyLnRodW1iKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSBYdFVuc3BlY2lmaWVkUGl4bWFwfSwKKyAge1h0TmZvcmVncm91bmQsIFh0Q0ZvcmVncm91bmQsIFh0UlBpeGVsLCBzaXplb2YoUGl4ZWwpLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIuZm9yZWdyb3VuZCksIFh0UlN0cmluZywgWHREZWZhdWx0Rm9yZWdyb3VuZH0sCisgIHtYdE5zaG93biwgWHRDU2hvd24sIFh0UkZsb2F0LCBzaXplb2YoZmxvYXQpLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIuc2hvd24pLCBYdFJGbG9hdCwgKFh0UG9pbnRlcikmZmxvYXRaZXJvfSwKKyAge1h0TnRvcE9mVGh1bWIsIFh0Q1RvcE9mVGh1bWIsIFh0UkZsb2F0LCBzaXplb2YoZmxvYXQpLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIudG9wKSwgWHRSRmxvYXQsIChYdFBvaW50ZXIpJmZsb2F0WmVyb30sCisgIHtYdE5tYXhPZlRodW1iLCBYdENNYXhPZlRodW1iLCBYdFJGbG9hdCwgc2l6ZW9mKGZsb2F0KSwKKyAgICAgICBPZmZzZXQoc2Nyb2xsYmFyLm1heCksIFh0UkZsb2F0LCAoWHRQb2ludGVyKSZmbG9hdFplcm99LAorICB7WHRObWluaW11bVRodW1iLCBYdENNaW5pbXVtVGh1bWIsIFh0UkRpbWVuc2lvbiwgc2l6ZW9mKERpbWVuc2lvbiksCisgICAgICAgT2Zmc2V0KHNjcm9sbGJhci5taW5fdGh1bWIpLCBYdFJJbW1lZGlhdGUsIChYdFBvaW50ZXIpIDd9LAorICB7WHROc2hhZG93V2lkdGgsIFh0Q1NoYWRvd1dpZHRoLCBYdFJEaW1lbnNpb24sIHNpemVvZihEaW1lbnNpb24pLAorICAgICAgIE9mZnNldChzY3JvbGxiYXIuc2hhZG93X3dpZHRoKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAxfSwKKyAge1h0TnRvcFNoYWRvd1BpeGVsLCBYdENUb3BTaGFkb3dQaXhlbCwgWHRSUGl4ZWwsIHNpemVvZihQaXhlbCksCisgICAgICAgT2Zmc2V0KHNjcm9sbGJhci50b3Bfc2hhZG93X3BpeGVsKSwgWHRSU3RyaW5nLCBYdERlZmF1bHRCYWNrZ3JvdW5kfSwKKyAge1h0TmJvdHRvbVNoYWRvd1BpeGVsLCBYdENCb3R0b21TaGFkb3dQaXhlbCwgWHRSUGl4ZWwsIHNpemVvZihQaXhlbCksCisgICAgICAgT2Zmc2V0KHNjcm9sbGJhci5ib3Rfc2hhZG93X3BpeGVsKSwgWHRSU3RyaW5nLCBYdERlZmF1bHRGb3JlZ3JvdW5kfSwKKyAge1h0TmxpbWl0VGh1bWIsIFh0Q0xpbWl0VGh1bWIsIFh0UkJvb2wsIHNpemVvZihCb29sKSwKKyAgICAgICBPZmZzZXQoc2Nyb2xsYmFyLmxpbWl0X3RodW1iKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKTB9Cit9OworI3VuZGVmIE9mZnNldAorCitzdGF0aWMgdm9pZCBDbGFzc0luaXRpYWxpemUgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBJbml0aWFsaXplIF9fQVJHUygoV2lkZ2V0LCBXaWRnZXQsIEFyZ0xpc3QsIENhcmRpbmFsICopKTsKK3N0YXRpYyB2b2lkIERlc3Ryb3kgX19BUkdTKChXaWRnZXQpKTsKK3N0YXRpYyB2b2lkIFJlYWxpemUgX19BUkdTKChXaWRnZXQsIE1hc2sgKiwgWFNldFdpbmRvd0F0dHJpYnV0ZXMgKikpOworc3RhdGljIHZvaWQgUmVzaXplIF9fQVJHUygoV2lkZ2V0KSk7CitzdGF0aWMgdm9pZCBSZWRpc3BsYXkgX19BUkdTKChXaWRnZXQsIFhFdmVudCAqLCBSZWdpb24pKTsKK3N0YXRpYyBCb29sZWFuIFNldFZhbHVlcyBfX0FSR1MoKFdpZGdldCwgV2lkZ2V0LCBXaWRnZXQsIEFyZ0xpc3QsIENhcmRpbmFsICopKTsKKworc3RhdGljIHZvaWQgSGFuZGxlVGh1bWIgX19BUkdTKChXaWRnZXQsIFhFdmVudCAqLCBTdHJpbmcgKiwgQ2FyZGluYWwgKikpOworc3RhdGljIHZvaWQgTW92ZVRodW1iIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwgU3RyaW5nICosIENhcmRpbmFsICopKTsKK3N0YXRpYyB2b2lkIE5vdGlmeVRodW1iIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwgU3RyaW5nICosIENhcmRpbmFsICopKTsKK3N0YXRpYyB2b2lkIE5vdGlmeVNjcm9sbCBfX0FSR1MoKFdpZGdldCwgWEV2ZW50ICosIFN0cmluZyAqLCBDYXJkaW5hbCAqKSk7CitzdGF0aWMgdm9pZCBFbmRTY3JvbGwgX19BUkdTKChXaWRnZXQsIFhFdmVudCAqLCBTdHJpbmcgKiwgQ2FyZGluYWwgKikpOworc3RhdGljIHZvaWQgU2Nyb2xsT25lTGluZVVwIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwgU3RyaW5nICosIENhcmRpbmFsICopKTsKK3N0YXRpYyB2b2lkIFNjcm9sbE9uZUxpbmVEb3duIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwgU3RyaW5nICosIENhcmRpbmFsICopKTsKK3N0YXRpYyB2b2lkIFNjcm9sbFBhZ2VVcCBfX0FSR1MoKFdpZGdldCwgWEV2ZW50ICosIFN0cmluZyAqLCBDYXJkaW5hbCAqKSk7CitzdGF0aWMgdm9pZCBTY3JvbGxQYWdlRG93biBfX0FSR1MoKFdpZGdldCwgWEV2ZW50ICosIFN0cmluZyAqLCBDYXJkaW5hbCAqKSk7CitzdGF0aWMgdm9pZCBTY3JvbGxTb21lIF9fQVJHUygoV2lkZ2V0IHcsIFhFdmVudCAqZXZlbnQsIGludCBjYWxsX2RhdGEpKTsKK3N0YXRpYyB2b2lkIF9YYXczZERyYXdTaGFkb3dzIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwgUmVnaW9uLCBpbnQpKTsKK3N0YXRpYyB2b2lkIEFsbG9jVG9wU2hhZG93R0MgX19BUkdTKChXaWRnZXQpKTsKK3N0YXRpYyB2b2lkIEFsbG9jQm90U2hhZG93R0MgX19BUkdTKChXaWRnZXQpKTsKKworc3RhdGljIFh0QWN0aW9uc1JlYyBhY3Rpb25zW10gPQoreworICAgIHsiSGFuZGxlVGh1bWIiLAlIYW5kbGVUaHVtYn0sCisgICAgeyJNb3ZlVGh1bWIiLAlNb3ZlVGh1bWJ9LAorICAgIHsiTm90aWZ5VGh1bWIiLAlOb3RpZnlUaHVtYn0sCisgICAgeyJOb3RpZnlTY3JvbGwiLAlOb3RpZnlTY3JvbGx9LAorICAgIHsiRW5kU2Nyb2xsIiwJRW5kU2Nyb2xsfSwKKyAgICB7IlNjcm9sbE9uZUxpbmVVcCIsIFNjcm9sbE9uZUxpbmVVcH0sCisgICAgeyJTY3JvbGxPbmVMaW5lRG93biIsIFNjcm9sbE9uZUxpbmVEb3dufSwKKyAgICB7IlNjcm9sbFBhZ2VVcCIsCVNjcm9sbFBhZ2VVcH0sCisgICAgeyJTY3JvbGxQYWdlRG93biIsCVNjcm9sbFBhZ2VEb3dufQorfTsKKworCitTY3JvbGxiYXJDbGFzc1JlYyB2aW1fc2Nyb2xsYmFyQ2xhc3NSZWMgPQoreworICB7IC8qIGNvcmUgZmllbGRzICovCisgICAgLyogc3VwZXJjbGFzcwkqLyAgKFdpZGdldENsYXNzKSAmc2ltcGxlQ2xhc3NSZWMsCisgICAgLyogY2xhc3NfbmFtZQkqLyAgIlNjcm9sbGJhciIsCisgICAgLyogc2l6ZQkJKi8gIHNpemVvZihTY3JvbGxiYXJSZWMpLAorICAgIC8qIGNsYXNzX2luaXRpYWxpemUJKi8gIENsYXNzSW5pdGlhbGl6ZSwKKyAgICAvKiBjbGFzc19wYXJ0X2luaXQJKi8gIE5VTEwsCisgICAgLyogY2xhc3NfaW5pdGVkCSovICBGQUxTRSwKKyAgICAvKiBpbml0aWFsaXplCSovICBJbml0aWFsaXplLAorICAgIC8qIGluaXRpYWxpemVfaG9vawkqLyAgTlVMTCwKKyAgICAvKiByZWFsaXplCQkqLyAgUmVhbGl6ZSwKKyAgICAvKiBhY3Rpb25zCQkqLyAgYWN0aW9ucywKKyAgICAvKiBudW1fYWN0aW9ucwkqLyAgWHROdW1iZXIoYWN0aW9ucyksCisgICAgLyogcmVzb3VyY2VzCSovICByZXNvdXJjZXMsCisgICAgLyogbnVtX3Jlc291cmNlcwkqLyAgWHROdW1iZXIocmVzb3VyY2VzKSwKKyAgICAvKiB4cm1fY2xhc3MJKi8gIE5VTExRVUFSSywKKyAgICAvKiBjb21wcmVzc19tb3Rpb24JKi8gIFRSVUUsCisgICAgLyogY29tcHJlc3NfZXhwb3N1cmUqLyAgVFJVRSwKKyAgICAvKiBjb21wcmVzc19lbnRlcmxlYXZlKi8JVFJVRSwKKyAgICAvKiB2aXNpYmxlX2ludGVyZXN0ICovICBGQUxTRSwKKyAgICAvKiBkZXN0cm95CQkqLyAgRGVzdHJveSwKKyAgICAvKiByZXNpemUJCSovICBSZXNpemUsCisgICAgLyogZXhwb3NlCQkqLyAgUmVkaXNwbGF5LAorICAgIC8qIHNldF92YWx1ZXMJKi8gIFNldFZhbHVlcywKKyAgICAvKiBzZXRfdmFsdWVzX2hvb2sJKi8gIE5VTEwsCisgICAgLyogc2V0X3ZhbHVlc19hbG1vc3QgKi8gWHRJbmhlcml0U2V0VmFsdWVzQWxtb3N0LAorICAgIC8qIGdldF92YWx1ZXNfaG9vawkqLyAgTlVMTCwKKyAgICAvKiBhY2NlcHRfZm9jdXMJKi8gIE5VTEwsCisgICAgLyogdmVyc2lvbgkJKi8gIFh0VmVyc2lvbiwKKyAgICAvKiBjYWxsYmFja19wcml2YXRlICovICBOVUxMLAorICAgIC8qIHRtX3RhYmxlCQkqLyAgZGVmYXVsdFRyYW5zbGF0aW9ucywKKyAgICAvKiBxdWVyeV9nZW9tZXRyeQkqLyAgWHRJbmhlcml0UXVlcnlHZW9tZXRyeSwKKyAgICAvKiBkaXNwbGF5X2FjY2VsZXJhdG9yKi8JWHRJbmhlcml0RGlzcGxheUFjY2VsZXJhdG9yLAorICAgIC8qIGV4dGVuc2lvbgkqLyAgTlVMTAorICB9LAorICB7IC8qIHNpbXBsZSBmaWVsZHMgKi8KKyAgICAvKiBjaGFuZ2Vfc2Vuc2l0aXZlCSovICBYdEluaGVyaXRDaGFuZ2VTZW5zaXRpdmUKKyAgfSwKKyAgeyAvKiBzY3JvbGxiYXIgZmllbGRzICovCisgICAgLyogaWdub3JlCSAgICAqLwkwCisgIH0KK307CisKK1dpZGdldENsYXNzIHZpbV9zY3JvbGxiYXJXaWRnZXRDbGFzcyA9IChXaWRnZXRDbGFzcykmdmltX3Njcm9sbGJhckNsYXNzUmVjOworCisjZGVmaW5lIE5vQnV0dG9uIC0xCisjZGVmaW5lIFBJQ0tMRU5HVEgod2lkZ2V0LCB4LCB5KSBcCisgICAgKCh3aWRnZXQtPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudEhvcml6b250YWwpID8gKHgpIDogKHkpKQorI2RlZmluZSBBVF9NSU4oeCx5KSAgICAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorI2RlZmluZSBBVF9NQVgoeCx5KSAgICAoKHgpID4gKHkpID8gKHgpIDogKHkpKQorCisjZGVmaW5lIExJTkVfREVMQVkJMzAwCisjZGVmaW5lIFBBR0VfREVMQVkJMzAwCisjZGVmaW5lIExJTkVfUkVQRUFUCSA1MAorI2RlZmluZSBQQUdFX1JFUEVBVAkyNTAKKworICAgIHN0YXRpYyB2b2lkCitDbGFzc0luaXRpYWxpemUoKQoreworICAgIFhhd0luaXRpYWxpemVXaWRnZXRTZXQoKTsKKyAgICBYdEFkZENvbnZlcnRlciggWHRSU3RyaW5nLCBYdFJPcmllbnRhdGlvbiwgWG11Q3Z0U3RyaW5nVG9PcmllbnRhdGlvbiwKKwkgICAgKFh0Q29udmVydEFyZ0xpc3QpTlVMTCwgKENhcmRpbmFsKTAgKTsKK30KKworI2RlZmluZSBNQVJHSU4oc2J3KSAoc2J3KS0+c2Nyb2xsYmFyLnRoaWNrbmVzcyArIChzYncpLT5zY3JvbGxiYXIuc2hhZG93X3dpZHRoCisKKyAgICBzdGF0aWMgdm9pZAorRmlsbEFyZWEoc2J3LCB0b3AsIGJvdHRvbSwgZmlsbCwgZHJhd19zaGFkb3cpCisgICAgU2Nyb2xsYmFyV2lkZ2V0CXNidzsKKyAgICBQb3NpdGlvbgkJdG9wLCBib3R0b207CisgICAgaW50CQkJZmlsbDsKKyAgICBpbnQJCQlkcmF3X3NoYWRvdzsKK3sKKyAgICBpbnQgdGxlbiA9IGJvdHRvbSAtIHRvcDsJLyogbGVuZ3RoIG9mIHRodW1iIGluIHBpeGVscyAqLworICAgIGludCBzdywgbWFyZ2luLCBmbG9vcjsKKyAgICBpbnQgbHgsIGx5LCBsdywgbGg7CisKKyAgICBpZiAoYm90dG9tIDw9IDAgfHwgYm90dG9tIDw9IHRvcCkKKwlyZXR1cm47CisgICAgaWYgKChzdyA9IHNidy0+c2Nyb2xsYmFyLnNoYWRvd193aWR0aCkgPCAwKQorCXN3ID0gMDsKKyAgICBtYXJnaW4gPSBNQVJHSU4gKHNidyk7CisgICAgZmxvb3IgPSBzYnctPnNjcm9sbGJhci5sZW5ndGggLSBtYXJnaW4gKyAyOworCisgICAgaWYgKHNidy0+c2Nyb2xsYmFyLm9yaWVudGF0aW9uID09IFh0b3JpZW50SG9yaXpvbnRhbCkKKyAgICB7CisJbHggPSAoKHRvcCA8IG1hcmdpbikgPyBtYXJnaW4gOiB0b3ApOworCWx5ID0gc3c7CisJbHcgPSAoKCh0b3AgKyB0bGVuKSA+IGZsb29yKSA/IGZsb29yIC0gdG9wIDogdGxlbik7CisJbGggPSBzYnctPmNvcmUuaGVpZ2h0IC0gMiAqIHN3OworICAgIH0KKyAgICBlbHNlCisgICAgeworCWx4ID0gc3c7CisJbHkgPSAoKHRvcCA8IG1hcmdpbikgPyBtYXJnaW4gOiB0b3ApOworCWx3ID0gc2J3LT5jb3JlLndpZHRoIC0gMiAqIHN3OworCWxoID0gKCgodG9wICsgdGxlbikgPiBmbG9vcikgPyBmbG9vciAtIHRvcCA6IHRsZW4pOworICAgIH0KKyAgICBpZiAobGggPD0gMCB8fCBsdyA8PSAwKQorCXJldHVybjsKKworICAgIGlmIChkcmF3X3NoYWRvdykKKyAgICB7CisJaWYgKCEoc2J3LT5zY3JvbGxiYXIub3JpZW50YXRpb24gPT0gWHRvcmllbnRIb3Jpem9udGFsKSkKKwl7CisJICAgIC8qIFRvcCBib3JkZXIgKi8KKwkgICAgWERyYXdMaW5lIChYdERpc3BsYXkgKChXaWRnZXQpIHNidyksIFh0V2luZG93ICgoV2lkZ2V0KSBzYncpLAorCQkgICAgc2J3LT5zY3JvbGxiYXIudG9wX3NoYWRvd19HQywKKwkJICAgIGx4LCBseSwgbHggKyBsdyAtIDEsIGx5KTsKKworCSAgICAvKiBCb3R0b20gYm9yZGVyICovCisJICAgIFhEcmF3TGluZSAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJICAgIHNidy0+c2Nyb2xsYmFyLmJvdF9zaGFkb3dfR0MsCisJCSAgICBseCwgbHkgKyBsaCAtIDEsIGx4ICsgbHcgLSAxLCBseSArIGxoIC0gMSk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIExlZnQgYm9yZGVyICovCisJICAgIFhEcmF3TGluZSAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJICAgIHNidy0+c2Nyb2xsYmFyLnRvcF9zaGFkb3dfR0MsCisJCSAgICBseCwgbHksIGx4LCBseSArIGxoIC0gMSk7CisKKwkgICAgLyogUmlnaHQgYm9yZGVyICovCisJICAgIFhEcmF3TGluZSAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJICAgIHNidy0+c2Nyb2xsYmFyLmJvdF9zaGFkb3dfR0MsCisJCSAgICBseCArIGx3IC0gMSwgbHksIGx4ICsgbHcgLSAxLCBseSArIGxoIC0gMSk7CisJfQorCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmlsbCkKKyAgICB7CisJWEZpbGxSZWN0YW5nbGUoWHREaXNwbGF5KChXaWRnZXQpIHNidyksIFh0V2luZG93KChXaWRnZXQpIHNidyksCisJCXNidy0+c2Nyb2xsYmFyLmdjLAorCQlseCwgbHksICh1bnNpZ25lZCBpbnQpIGx3LCAodW5zaWduZWQgaW50KSBsaCk7CisKKwlpZiAoIShzYnctPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudEhvcml6b250YWwpKQorCXsKKwkgICAgLyogTGVmdCBib3JkZXIgKi8KKwkgICAgWERyYXdMaW5lKFh0RGlzcGxheSAoKFdpZGdldCkgc2J3KSwgWHRXaW5kb3cgKChXaWRnZXQpIHNidyksCisJCSAgICBzYnctPnNjcm9sbGJhci50b3Bfc2hhZG93X0dDLAorCQkgICAgbHgsIGx5LCBseCwgbHkgKyBsaCAtIDEpOworCisJICAgIC8qIFJpZ2h0IGJvcmRlciAqLworCSAgICBYRHJhd0xpbmUoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJICAgIHNidy0+c2Nyb2xsYmFyLmJvdF9zaGFkb3dfR0MsCisJCSAgICBseCArIGx3IC0gMSwgbHksIGx4ICsgbHcgLSAxLCBseSArIGxoIC0gMSk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIFRvcCBib3JkZXIgKi8KKwkgICAgWERyYXdMaW5lKFh0RGlzcGxheSAoKFdpZGdldCkgc2J3KSwgWHRXaW5kb3cgKChXaWRnZXQpIHNidyksCisJCSAgICBzYnctPnNjcm9sbGJhci50b3Bfc2hhZG93X0dDLAorCQkgICAgbHgsIGx5LCBseCArIGx3IC0gMSwgbHkpOworCisJICAgIC8qIEJvdHRvbSBib3JkZXIgKi8KKwkgICAgWERyYXdMaW5lKFh0RGlzcGxheSAoKFdpZGdldCkgc2J3KSwgWHRXaW5kb3cgKChXaWRnZXQpIHNidyksCisJCSAgICBzYnctPnNjcm9sbGJhci5ib3Rfc2hhZG93X0dDLAorCQkgICAgbHgsIGx5ICsgbGggLSAxLCBseCArIGx3IC0gMSwgbHkgKyBsaCAtIDEpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlYQ2xlYXJBcmVhKFh0RGlzcGxheSgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdygoV2lkZ2V0KSBzYncpLAorCQlseCwgbHksICh1bnNpZ25lZCBpbnQpIGx3LCAodW5zaWduZWQgaW50KSBsaCwgRkFMU0UpOworICAgIH0KK30KKworLyogUGFpbnQgdGhlIHRodW1iIGluIHRoZSBhcmVhIHNwZWNpZmllZCBieSBzYnctPnRvcCBhbmQKKyAgIHNidy0+c2hvd24uCVRoZSBvbGQgYXJlYSBpcyBlcmFzZWQuICBUaGUgcGFpbnRpbmcgYW5kCisgICBlcmFzaW5nIGlzIGRvbmUgY2xldmVybHkgc28gdGhhdCBubyBmbGlja2VyaW5nIHdpbGwgb2NjdXIuCisgKi8KKworICAgIHN0YXRpYyB2b2lkCitQYWludFRodW1iKHNidykKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3OworeworICAgIFBvc2l0aW9uCSAgICBvbGR0b3AsIG9sZGJvdCwgbmV3dG9wLCBuZXdib3Q7CisgICAgRGltZW5zaW9uCSAgICBtYXJnaW4sIHR6bDsKKworICAgIG1hcmdpbiA9IE1BUkdJTiAoc2J3KTsKKyAgICB0emwgPSBzYnctPnNjcm9sbGJhci5sZW5ndGggLSAyICogbWFyZ2luOworICAgIG5ld3RvcCA9IG1hcmdpbiArIChpbnQpKHR6bCAqIHNidy0+c2Nyb2xsYmFyLnRvcCk7CisgICAgbmV3Ym90ID0gbmV3dG9wICsgKGludCkodHpsICogc2J3LT5zY3JvbGxiYXIuc2hvd24pICsgMTsKKyAgICBpZiAobmV3Ym90IDwgbmV3dG9wICsgKGludClzYnctPnNjcm9sbGJhci5taW5fdGh1bWIpCisJbmV3Ym90ID0gbmV3dG9wICsgc2J3LT5zY3JvbGxiYXIubWluX3RodW1iOworCisgICAgb2xkdG9wID0gc2J3LT5zY3JvbGxiYXIudG9wTG9jOworICAgIG9sZGJvdCA9IG9sZHRvcCArIHNidy0+c2Nyb2xsYmFyLnNob3duTGVuZ3RoOworICAgIHNidy0+c2Nyb2xsYmFyLnRvcExvYyA9IG5ld3RvcDsKKyAgICBzYnctPnNjcm9sbGJhci5zaG93bkxlbmd0aCA9IG5ld2JvdCAtIG5ld3RvcDsKKyAgICBpZiAoWHRJc1JlYWxpemVkICgoV2lkZ2V0KSBzYncpKQorICAgIHsKKwlpZiAobmV3dG9wIDwgb2xkdG9wKQorCSAgICBGaWxsQXJlYShzYncsIG5ld3RvcCwgQVRfTUlOKG5ld2JvdCwJb2xkdG9wKzEpLDEsMCk7CisJaWYgKG5ld3RvcCA+IG9sZHRvcCkKKwkgICAgRmlsbEFyZWEoc2J3LCBvbGR0b3AsIEFUX01JTihuZXd0b3AsCW9sZGJvdAkpLDAsMCk7CisJaWYgKG5ld2JvdCA8IG9sZGJvdCkKKwkgICAgRmlsbEFyZWEoc2J3LCBBVF9NQVgobmV3Ym90LCBvbGR0b3ApLAlvbGRib3QsICAgMCwwKTsKKwlpZiAobmV3Ym90ID4gb2xkYm90KQorCSAgICBGaWxsQXJlYShzYncsIEFUX01BWChuZXd0b3AsIG9sZGJvdC0xKSwgbmV3Ym90LCAgMSwwKTsKKworCS8qIE9ubHkgZHJhdyB0aGUgbWlzc2luZyBzaGFkb3dzICovCisJRmlsbEFyZWEoc2J3LCBuZXd0b3AsIG5ld2JvdCwgMCwgMSk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK1BhaW50QXJyb3dzKHNidykKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3OworeworICAgIFhQb2ludAlwb2ludFs2XTsKKyAgICBEaW1lbnNpb24JdGhpY2tuZXNzID0gc2J3LT5zY3JvbGxiYXIudGhpY2tuZXNzIC0gMTsKKyAgICBEaW1lbnNpb24Jc2l6ZTsKKyAgICBEaW1lbnNpb24Jb2ZmOworCisgICAgaWYgKFh0SXNSZWFsaXplZCgoV2lkZ2V0KSBzYncpKQorICAgIHsKKwlpZiAoKGludCl0aGlja25lc3MgKiAyID4gKGludClzYnctPnNjcm9sbGJhci5sZW5ndGgpCisJeworCSAgICBzaXplID0gc2J3LT5zY3JvbGxiYXIubGVuZ3RoIC8gMjsKKwkgICAgb2ZmID0gKGludCkodGhpY2tuZXNzIC0gc2l6ZSkgLyAyOworCX0KKwllbHNlCisJeworCSAgICBzaXplID0gdGhpY2tuZXNzOworCSAgICBvZmYgPSAwOworCX0KKwlwb2ludFswXS54ID0gb2ZmICsgc2J3LT5zY3JvbGxiYXIuc2hhZG93X3dpZHRoOworCXBvaW50WzBdLnkgPSBzaXplOworCXBvaW50WzFdLnggPSB0aGlja25lc3MgLSBvZmYgLSBzYnctPnNjcm9sbGJhci5zaGFkb3dfd2lkdGg7CisJcG9pbnRbMV0ueSA9IHNpemU7CisJcG9pbnRbMl0ueCA9IHRoaWNrbmVzcyAvIDI7CisJcG9pbnRbMl0ueSA9IHNidy0+c2Nyb2xsYmFyLnNoYWRvd193aWR0aDsKKworCXBvaW50WzNdLnggPSBvZmYgKyBzYnctPnNjcm9sbGJhci5zaGFkb3dfd2lkdGg7CisJcG9pbnRbM10ueSA9IHNidy0+c2Nyb2xsYmFyLmxlbmd0aCAtIHNpemU7CisJcG9pbnRbNF0ueCA9IHRoaWNrbmVzcyAtIG9mZiAtIHNidy0+c2Nyb2xsYmFyLnNoYWRvd193aWR0aDsKKwlwb2ludFs0XS55ID0gc2J3LT5zY3JvbGxiYXIubGVuZ3RoIC0gc2l6ZTsKKwlwb2ludFs1XS54ID0gdGhpY2tuZXNzIC8gMjsKKwlwb2ludFs1XS55ID0gc2J3LT5zY3JvbGxiYXIubGVuZ3RoIC0gc2J3LT5zY3JvbGxiYXIuc2hhZG93X3dpZHRoIC0gMTsKKworCS8qIGhvcml6b250YWwgYXJyb3dzIHJlcXVpcmUgdGhhdCB4IGFuZCB5IGNvb3JkaW5hdGVzIGJlIHN3YXBwZWQgKi8KKwlpZiAoc2J3LT5zY3JvbGxiYXIub3JpZW50YXRpb24gPT0gWHRvcmllbnRIb3Jpem9udGFsKQorCXsKKwkgICAgaW50IG47CisJICAgIGludCBzd2FwOworCSAgICBmb3IgKG4gPSAwOyBuIDwgNjsgbisrKQorCSAgICB7CisJCXN3YXAgPSBwb2ludFtuXS54OworCQlwb2ludFtuXS54ID0gcG9pbnRbbl0ueTsKKwkJcG9pbnRbbl0ueSA9IHN3YXA7CisJICAgIH0KKwl9CisJLyogZHJhdyB0aGUgdXAvbGVmdCBhcnJvdyAqLworCVhGaWxsUG9seWdvbiAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJc2J3LT5zY3JvbGxiYXIuZ2MsCisJCXBvaW50LCAzLAorCQlDb252ZXgsIENvb3JkTW9kZU9yaWdpbik7CisJWERyYXdMaW5lcyAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJc2J3LT5zY3JvbGxiYXIuYm90X3NoYWRvd19HQywKKwkJcG9pbnQsIDMsCisJCUNvb3JkTW9kZU9yaWdpbik7CisJWERyYXdMaW5lIChYdERpc3BsYXkgKChXaWRnZXQpIHNidyksIFh0V2luZG93ICgoV2lkZ2V0KSBzYncpLAorCQlzYnctPnNjcm9sbGJhci50b3Bfc2hhZG93X0dDLAorCQlwb2ludFswXS54LCBwb2ludFswXS55LAorCQlwb2ludFsyXS54LCBwb2ludFsyXS55KTsKKwkvKiBkcmF3IHRoZSBkb3duL3JpZ2h0IGFycm93ICovCisJWEZpbGxQb2x5Z29uIChYdERpc3BsYXkgKChXaWRnZXQpIHNidyksIFh0V2luZG93ICgoV2lkZ2V0KSBzYncpLAorCQlzYnctPnNjcm9sbGJhci5nYywKKwkJcG9pbnQrMywgMywKKwkJQ29udmV4LCBDb29yZE1vZGVPcmlnaW4pOworCVhEcmF3TGluZSAoWHREaXNwbGF5ICgoV2lkZ2V0KSBzYncpLCBYdFdpbmRvdyAoKFdpZGdldCkgc2J3KSwKKwkJc2J3LT5zY3JvbGxiYXIudG9wX3NoYWRvd19HQywKKwkJcG9pbnRbM10ueCwgcG9pbnRbM10ueSwKKwkJcG9pbnRbNF0ueCwgcG9pbnRbNF0ueSk7CisJWERyYXdMaW5lIChYdERpc3BsYXkgKChXaWRnZXQpIHNidyksIFh0V2luZG93ICgoV2lkZ2V0KSBzYncpLAorCQlzYnctPnNjcm9sbGJhci50b3Bfc2hhZG93X0dDLAorCQlwb2ludFszXS54LCBwb2ludFszXS55LAorCQlwb2ludFs1XS54LCBwb2ludFs1XS55KTsKKwlYRHJhd0xpbmUgKFh0RGlzcGxheSAoKFdpZGdldCkgc2J3KSwgWHRXaW5kb3cgKChXaWRnZXQpIHNidyksCisJCXNidy0+c2Nyb2xsYmFyLmJvdF9zaGFkb3dfR0MsCisJCXBvaW50WzRdLngsIHBvaW50WzRdLnksCisJCXBvaW50WzVdLngsIHBvaW50WzVdLnkpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitEZXN0cm95KHcpCisgICAgV2lkZ2V0IHc7Cit7CisgICAgU2Nyb2xsYmFyV2lkZ2V0IHNidyA9IChTY3JvbGxiYXJXaWRnZXQpIHc7CisgICAgaWYgKHNidy0+c2Nyb2xsYmFyLnRpbWVyX2lkICE9IChYdEludGVydmFsSWQpIDApCisJWHRSZW1vdmVUaW1lT3V0IChzYnctPnNjcm9sbGJhci50aW1lcl9pZCk7CisgICAgWHRSZWxlYXNlR0Modywgc2J3LT5zY3JvbGxiYXIuZ2MpOworICAgIFh0UmVsZWFzZUdDKHcsIHNidy0+c2Nyb2xsYmFyLnRvcF9zaGFkb3dfR0MpOworICAgIFh0UmVsZWFzZUdDKHcsIHNidy0+c2Nyb2xsYmFyLmJvdF9zaGFkb3dfR0MpOworfQorCisgICAgc3RhdGljIHZvaWQKK0NyZWF0ZUdDKHcpCisgICAgV2lkZ2V0IHc7Cit7CisgICAgU2Nyb2xsYmFyV2lkZ2V0CXNidyA9IChTY3JvbGxiYXJXaWRnZXQpIHc7CisgICAgWEdDVmFsdWVzCQlnY1ZhbHVlczsKKyAgICBYdEdDTWFzawkJbWFzazsKKyAgICB1bnNpZ25lZCBpbnQJZGVwdGggPSAxOworCisgICAgaWYgKHNidy0+c2Nyb2xsYmFyLnRodW1iID09IFh0VW5zcGVjaWZpZWRQaXhtYXApCisgICAgeworCXNidy0+c2Nyb2xsYmFyLnRodW1iID0gWG11Q3JlYXRlU3RpcHBsZWRQaXhtYXAgKFh0U2NyZWVuKHcpLAorCQkgICAgKFBpeGVsKSAxLCAoUGl4ZWwpIDAsIGRlcHRoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2J3LT5zY3JvbGxiYXIudGh1bWIgIT0gTm9uZSkKKyAgICB7CisJV2luZG93CQlyb290OworCWludAkJeCwgeTsKKwl1bnNpZ25lZCBpbnQJd2lkdGgsIGhlaWdodCwgYnc7CisKKwlpZiAoWEdldEdlb21ldHJ5IChYdERpc3BsYXkodyksIHNidy0+c2Nyb2xsYmFyLnRodW1iLCAmcm9vdCwgJngsICZ5LAorCQkmd2lkdGgsICZoZWlnaHQsICZidywgJmRlcHRoKSA9PSAwKQorCSAgICBFTVNHKF8oIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIpKTsKKyAgICB9CisKKyAgICBnY1ZhbHVlcy5mb3JlZ3JvdW5kID0gc2J3LT5zY3JvbGxiYXIuZm9yZWdyb3VuZDsKKyAgICBnY1ZhbHVlcy5iYWNrZ3JvdW5kID0gc2J3LT5jb3JlLmJhY2tncm91bmRfcGl4ZWw7CisgICAgbWFzayA9IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZDsKKworICAgIGlmIChzYnctPnNjcm9sbGJhci50aHVtYiAhPSBOb25lKQorICAgIHsKKwlnY1ZhbHVlcy5maWxsX3N0eWxlID0gRmlsbFNvbGlkOworCW1hc2sgfD0gR0NGaWxsU3R5bGU7CisgICAgfQorICAgIC8qIHRoZSBjcmVhdGlvbiBzaG91bGQgYmUgbm9uLWNhY2hpbmcsIGJlY2F1c2UgKi8KKyAgICAvKiB3ZSBub3cgc2V0IGFuZCBjbGVhciBjbGlwIG1hc2tzIG9uIHRoZSBnYyByZXR1cm5lZCAqLworICAgIHNidy0+c2Nyb2xsYmFyLmdjID0gWHRHZXRHQyAodywgbWFzaywgJmdjVmFsdWVzKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitTZXREaW1lbnNpb25zKHNidykKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3OworeworICAgIGlmIChzYnctPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudFZlcnRpY2FsKQorICAgIHsKKwlzYnctPnNjcm9sbGJhci5sZW5ndGggPSBzYnctPmNvcmUuaGVpZ2h0OworCXNidy0+c2Nyb2xsYmFyLnRoaWNrbmVzcyA9IHNidy0+Y29yZS53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzYnctPnNjcm9sbGJhci5sZW5ndGggPSBzYnctPmNvcmUud2lkdGg7CisJc2J3LT5zY3JvbGxiYXIudGhpY2tuZXNzID0gc2J3LT5jb3JlLmhlaWdodDsKKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK0luaXRpYWxpemUocmVxdWVzdCwgbmV3LCBhcmdzLCBudW1fYXJncykKKyAgICBXaWRnZXQJcmVxdWVzdDsJLyogd2hhdCB0aGUgY2xpZW50IGFza2VkIGZvciAqLworICAgIFdpZGdldAluZXc7CQkvKiB3aGF0IHdlJ3JlIGdvaW5nIHRvIGdpdmUgaGltICovCisgICAgQXJnTGlzdAlhcmdzOworICAgIENhcmRpbmFsCSpudW1fYXJnczsKK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgbmV3OworCisgICAgQ3JlYXRlR0MobmV3KTsKKyAgICBBbGxvY1RvcFNoYWRvd0dDKG5ldyk7CisgICAgQWxsb2NCb3RTaGFkb3dHQyhuZXcpOworCisgICAgaWYgKHNidy0+Y29yZS53aWR0aCA9PSAwKQorCXNidy0+Y29yZS53aWR0aCA9IChzYnctPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudFZlcnRpY2FsKQorCSAgICA/IHNidy0+c2Nyb2xsYmFyLnRoaWNrbmVzcyA6IHNidy0+c2Nyb2xsYmFyLmxlbmd0aDsKKworICAgIGlmIChzYnctPmNvcmUuaGVpZ2h0ID09IDApCisJc2J3LT5jb3JlLmhlaWdodCA9IChzYnctPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudEhvcml6b250YWwpCisJICAgID8gc2J3LT5zY3JvbGxiYXIudGhpY2tuZXNzIDogc2J3LT5zY3JvbGxiYXIubGVuZ3RoOworCisgICAgU2V0RGltZW5zaW9ucyhzYncpOworICAgIHNidy0+c2Nyb2xsYmFyLnNjcm9sbF9tb2RlID0gU01PREVfTk9ORTsKKyAgICBzYnctPnNjcm9sbGJhci50aW1lcl9pZCA9IChYdEludGVydmFsSWQpMDsKKyAgICBzYnctPnNjcm9sbGJhci50b3BMb2MgPSAwOworICAgIHNidy0+c2Nyb2xsYmFyLnNob3duTGVuZ3RoID0gc2J3LT5zY3JvbGxiYXIubWluX3RodW1iOworfQorCisgICAgc3RhdGljIHZvaWQKK1JlYWxpemUodywgdmFsdWVNYXNrLCBhdHRyaWJ1dGVzKQorICAgIFdpZGdldCB3OworICAgIE1hc2sgKnZhbHVlTWFzazsKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyAqYXR0cmlidXRlczsKK3sKKyAgICAvKiBUaGUgU2ltcGxlIHdpZGdldCBhY3R1YWxseSBzdHVmZnMgdGhlIHZhbHVlIGluIHRoZSB2YWx1ZW1hc2suICovCisgICAgKCp2aW1fc2Nyb2xsYmFyV2lkZ2V0Q2xhc3MtPmNvcmVfY2xhc3Muc3VwZXJjbGFzcy0+Y29yZV9jbGFzcy5yZWFsaXplKQorCSh3LCB2YWx1ZU1hc2ssIGF0dHJpYnV0ZXMpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBCb29sZWFuCitTZXRWYWx1ZXMoY3VycmVudCwgcmVxdWVzdCwgZGVzaXJlZCwgYXJncywgbnVtX2FyZ3MpCisgICAgV2lkZ2V0ICBjdXJyZW50LAkgICAgLyogd2hhdCBJIGFtICovCisJICAgIHJlcXVlc3QsCSAgICAvKiB3aGF0IGhlIHdhbnRzIG1lIHRvIGJlICovCisJICAgIGRlc2lyZWQ7CSAgICAvKiB3aGF0IEkgd2lsbCBiZWNvbWUgKi8KKyAgICBBcmdMaXN0IGFyZ3M7CisgICAgQ2FyZGluYWwgKm51bV9hcmdzOworeworICAgIFNjcm9sbGJhcldpZGdldAlzYncgPSAoU2Nyb2xsYmFyV2lkZ2V0KSBjdXJyZW50OworICAgIFNjcm9sbGJhcldpZGdldAlkc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgZGVzaXJlZDsKKyAgICBCb29sZWFuCQlyZWRyYXcgPSBGQUxTRTsKKworLyoKKyAqIElmIHRoZXNlIHZhbHVlcyBhcmUgb3V0c2lkZSB0aGUgYWNjZXB0YWJsZSByYW5nZSBpZ25vcmUgdGhlbS4uLgorICovCisgICAgaWYgKGRzYnctPnNjcm9sbGJhci50b3AgPCAwLjAgfHwgZHNidy0+c2Nyb2xsYmFyLnRvcCA+IDEuMCkKKwlkc2J3LT5zY3JvbGxiYXIudG9wID0gc2J3LT5zY3JvbGxiYXIudG9wOworCisgICAgaWYgKGRzYnctPnNjcm9sbGJhci5zaG93biA8IDAuMCB8fCBkc2J3LT5zY3JvbGxiYXIuc2hvd24gPiAxLjApCisJZHNidy0+c2Nyb2xsYmFyLnNob3duID0gc2J3LT5zY3JvbGxiYXIuc2hvd247CisKKy8qCisgKiBDaGFuZ2UgY29sb3JzIGFuZCBzdHVmZi4uLgorICovCisgICAgaWYgKFh0SXNSZWFsaXplZChkZXNpcmVkKSkKKyAgICB7CisJaWYgKHNidy0+c2Nyb2xsYmFyLmZvcmVncm91bmQgIT0gZHNidy0+c2Nyb2xsYmFyLmZvcmVncm91bmQgfHwKKwkJc2J3LT5jb3JlLmJhY2tncm91bmRfcGl4ZWwgIT0gZHNidy0+Y29yZS5iYWNrZ3JvdW5kX3BpeGVsIHx8CisJCXNidy0+c2Nyb2xsYmFyLnRodW1iICE9IGRzYnctPnNjcm9sbGJhci50aHVtYikKKwl7CisJICAgIFh0UmVsZWFzZUdDKGRlc2lyZWQsIHNidy0+c2Nyb2xsYmFyLmdjKTsKKwkgICAgQ3JlYXRlR0MgKGRlc2lyZWQpOworCSAgICByZWRyYXcgPSBUUlVFOworCX0KKwlpZiAoc2J3LT5zY3JvbGxiYXIudG9wICE9IGRzYnctPnNjcm9sbGJhci50b3AgfHwKKwkJc2J3LT5zY3JvbGxiYXIuc2hvd24gIT0gZHNidy0+c2Nyb2xsYmFyLnNob3duKQorCSAgICByZWRyYXcgPSBUUlVFOworICAgIH0KKyAgICByZXR1cm4gcmVkcmF3OworfQorCisgICAgc3RhdGljIHZvaWQKK1Jlc2l6ZSh3KQorICAgIFdpZGdldCB3OworeworICAgIC8qIEZvcmdldEdyYXZpdHkgaGFzIHRha2VuIGNhcmUgb2YgYmFja2dyb3VuZCwgYnV0IHRodW1iIG1heQorICAgICAqIGhhdmUgdG8gbW92ZSBhcyBhIHJlc3VsdCBvZiB0aGUgbmV3IHNpemUuICovCisgICAgU2V0RGltZW5zaW9ucyAoKFNjcm9sbGJhcldpZGdldCkgdyk7CisgICAgUmVkaXNwbGF5KHcsIChYRXZlbnQqKSBOVUxMLCAoUmVnaW9uKU5VTEwpOworfQorCisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1JlZGlzcGxheSh3LCBldmVudCwgcmVnaW9uKQorICAgIFdpZGdldCB3OworICAgIFhFdmVudCAqZXZlbnQ7CisgICAgUmVnaW9uIHJlZ2lvbjsKK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgdzsKKyAgICBpbnQgeCwgeTsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIF9YYXczZERyYXdTaGFkb3dzKHcsIGV2ZW50LCByZWdpb24sIEZBTFNFKTsKKworICAgIGlmIChzYnctPnNjcm9sbGJhci5vcmllbnRhdGlvbiA9PSBYdG9yaWVudEhvcml6b250YWwpCisgICAgeworCXggPSBzYnctPnNjcm9sbGJhci50b3BMb2M7CisJeSA9IDE7CisJd2lkdGggPSBzYnctPnNjcm9sbGJhci5zaG93bkxlbmd0aDsKKwloZWlnaHQgPSBzYnctPmNvcmUuaGVpZ2h0IC0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl4ID0gMTsKKwl5ID0gc2J3LT5zY3JvbGxiYXIudG9wTG9jOworCXdpZHRoID0gc2J3LT5jb3JlLndpZHRoIC0gMjsKKwloZWlnaHQgPSBzYnctPnNjcm9sbGJhci5zaG93bkxlbmd0aDsKKyAgICB9CisgICAgaWYgKHJlZ2lvbiA9PSBOVUxMIHx8CisJICAgIFhSZWN0SW5SZWdpb24gKHJlZ2lvbiwgeCwgeSwgd2lkdGgsIGhlaWdodCkgIT0gUmVjdGFuZ2xlT3V0KQorICAgIHsKKwkvKiBGb3JjZXMgZW50aXJlIHRodW1iIHRvIGJlIHBhaW50ZWQuICovCisJc2J3LT5zY3JvbGxiYXIudG9wTG9jID0gLShzYnctPnNjcm9sbGJhci5sZW5ndGggKyAxKTsKKwlQYWludFRodW1iIChzYncpOworICAgIH0KKyAgICAvKiB3ZSdkIGxpa2UgdG8gYmUgcmVnaW9uIGF3YXJlIGhlcmUhISEhICovCisgICAgUGFpbnRBcnJvd3Moc2J3KTsKK30KKworCisgICAgc3RhdGljIEJvb2xlYW4KK0NvbXBhcmVFdmVudHMob2xkRXZlbnQsIG5ld0V2ZW50KQorICAgIFhFdmVudCAqb2xkRXZlbnQsICpuZXdFdmVudDsKK3sKKyNkZWZpbmUgQ2hlY2soZmllbGQpIGlmIChuZXdFdmVudC0+ZmllbGQgIT0gb2xkRXZlbnQtPmZpZWxkKSByZXR1cm4gRmFsc2U7CisKKyAgICBDaGVjayh4YW55LmRpc3BsYXkpOworICAgIENoZWNrKHhhbnkudHlwZSk7CisgICAgQ2hlY2soeGFueS53aW5kb3cpOworCisgICAgc3dpdGNoIChuZXdFdmVudC0+dHlwZSkKKyAgICB7CisJY2FzZSBNb3Rpb25Ob3RpZnk6CisJICAgIENoZWNrKHhtb3Rpb24uc3RhdGUpOworCSAgICBicmVhazsKKwljYXNlIEJ1dHRvblByZXNzOgorCWNhc2UgQnV0dG9uUmVsZWFzZToKKwkgICAgQ2hlY2soeGJ1dHRvbi5zdGF0ZSk7CisJICAgIENoZWNrKHhidXR0b24uYnV0dG9uKTsKKwkgICAgYnJlYWs7CisJY2FzZSBLZXlQcmVzczoKKwljYXNlIEtleVJlbGVhc2U6CisJICAgIENoZWNrKHhrZXkuc3RhdGUpOworCSAgICBDaGVjayh4a2V5LmtleWNvZGUpOworCSAgICBicmVhazsKKwljYXNlIEVudGVyTm90aWZ5OgorCWNhc2UgTGVhdmVOb3RpZnk6CisJICAgIENoZWNrKHhjcm9zc2luZy5tb2RlKTsKKwkgICAgQ2hlY2soeGNyb3NzaW5nLmRldGFpbCk7CisJICAgIENoZWNrKHhjcm9zc2luZy5zdGF0ZSk7CisJICAgIGJyZWFrOworICAgIH0KKyN1bmRlZiBDaGVjaworCisgICAgcmV0dXJuIFRydWU7Cit9CisKK3N0cnVjdCBFdmVudERhdGEKK3sKKyAgICBYRXZlbnQgKm9sZEV2ZW50OworICAgIGludCBjb3VudDsKK307CisKKyAgICBzdGF0aWMgQm9vbAorUGVla05vdGlmeUV2ZW50KGRweSwgZXZlbnQsIGFyZ3MpCisgICAgRGlzcGxheSAqZHB5OworICAgIFhFdmVudCAqZXZlbnQ7CisgICAgY2hhciAqYXJnczsKK3sKKyAgICBzdHJ1Y3QgRXZlbnREYXRhICpldmVudERhdGEgPSAoc3RydWN0IEV2ZW50RGF0YSopYXJnczsKKworICAgIHJldHVybiAoKCsrZXZlbnREYXRhLT5jb3VudCA9PSBRTGVuZ3RoKGRweSkpIC8qIHNpbmNlIFBlZWtJZiBibG9ja3MgKi8KKwl8fCBDb21wYXJlRXZlbnRzKGV2ZW50LCBldmVudERhdGEtPm9sZEV2ZW50KSk7Cit9CisKKworICAgIHN0YXRpYyBCb29sZWFuCitMb29rQWhlYWQodywgZXZlbnQpCisgICAgV2lkZ2V0IHc7CisgICAgWEV2ZW50ICpldmVudDsKK3sKKyAgICBYRXZlbnQgbmV3RXZlbnQ7CisgICAgc3RydWN0IEV2ZW50RGF0YSBldmVudERhdGE7CisKKyAgICBpZiAoUUxlbmd0aCAoWHREaXNwbGF5ICh3KSkgPT0gMCkKKwlyZXR1cm4gRmFsc2U7CisKKyAgICBldmVudERhdGEuY291bnQgPSAwOworICAgIGV2ZW50RGF0YS5vbGRFdmVudCA9IGV2ZW50OworCisgICAgWFBlZWtJZkV2ZW50IChYdERpc3BsYXkgKHcpLCAmbmV3RXZlbnQsIFBlZWtOb3RpZnlFdmVudCwgKGNoYXIqKSZldmVudERhdGEpOworCisgICAgcmV0dXJuIENvbXBhcmVFdmVudHMgKGV2ZW50LCAmbmV3RXZlbnQpOworfQorCisKKyAgICBzdGF0aWMgdm9pZAorRXh0cmFjdFBvc2l0aW9uKGV2ZW50LCB4LCB5LCBzdGF0ZSkKKyAgICBYRXZlbnQJICAgICpldmVudDsKKyAgICBQb3NpdGlvbgkgICAgKngsICp5OwkvKiBSRVRVUk4gKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgKnN0YXRlOwkvKiBSRVRVUk4gKi8KK3sKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKQorICAgIHsKKwljYXNlIE1vdGlvbk5vdGlmeToKKwkgICAgKnggPSBldmVudC0+eG1vdGlvbi54OworCSAgICAqeSA9IGV2ZW50LT54bW90aW9uLnk7CisJICAgIGlmIChzdGF0ZSAhPSBOVUxMKQorCQkqc3RhdGUgPSBldmVudC0+eG1vdGlvbi5zdGF0ZTsKKwkgICAgYnJlYWs7CisJY2FzZSBCdXR0b25QcmVzczoKKwljYXNlIEJ1dHRvblJlbGVhc2U6CisJICAgICp4ID0gZXZlbnQtPnhidXR0b24ueDsKKwkgICAgKnkgPSBldmVudC0+eGJ1dHRvbi55OworCSAgICBpZiAoc3RhdGUgIT0gTlVMTCkKKwkJKnN0YXRlID0gZXZlbnQtPnhidXR0b24uc3RhdGU7CisJICAgIGJyZWFrOworCWNhc2UgS2V5UHJlc3M6CisJY2FzZSBLZXlSZWxlYXNlOgorCSAgICAqeCA9IGV2ZW50LT54a2V5Lng7CisJICAgICp5ID0gZXZlbnQtPnhrZXkueTsKKwkgICAgaWYgKHN0YXRlICE9IE5VTEwpCisJCSpzdGF0ZSA9IGV2ZW50LT54a2V5LnN0YXRlOworCSAgICBicmVhazsKKwljYXNlIEVudGVyTm90aWZ5OgorCWNhc2UgTGVhdmVOb3RpZnk6CisJICAgICp4ID0gZXZlbnQtPnhjcm9zc2luZy54OworCSAgICAqeSA9IGV2ZW50LT54Y3Jvc3NpbmcueTsKKwkgICAgaWYgKHN0YXRlICE9IE5VTEwpCisJCSpzdGF0ZSA9IGV2ZW50LT54Y3Jvc3Npbmcuc3RhdGU7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgICp4ID0gMDsgKnkgPSAwOworCSAgICBpZiAoc3RhdGUgIT0gTlVMTCkKKwkJKnN0YXRlID0gMDsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorSGFuZGxlVGh1bWIodywgZXZlbnQsIHBhcmFtcywgbnVtX3BhcmFtcykKKyAgICBXaWRnZXQgdzsKKyAgICBYRXZlbnQgKmV2ZW50OworICAgIFN0cmluZyAqcGFyYW1zOworICAgIENhcmRpbmFsICpudW1fcGFyYW1zOworeworICAgIFBvc2l0aW9uIHgsIHksIGxvYzsKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgdzsKKworICAgIEV4dHJhY3RQb3NpdGlvbihldmVudCwgJngsICZ5LCAodW5zaWduZWQgaW50ICopTlVMTCk7CisgICAgbG9jID0gUElDS0xFTkdUSChzYncsIHgsIHkpOworICAgIC8qIGlmIHRoZSBtb3Rpb24gZXZlbnQgcHV0cyB0aGUgcG9pbnRlciBpbiB0aHVtYiwgY2FsbCBNb3ZlIGFuZCBOb3RpZnkgKi8KKyAgICAvKiBhbHNvIGNhbGwgTW92ZSBhbmQgTm90aWZ5IGlmIHdlJ3JlIGFscmVhZHkgaW4gY29udGludW91cyBzY3JvbGwgbW9kZSAqLworICAgIGlmIChzYnctPnNjcm9sbGJhci5zY3JvbGxfbW9kZSA9PSBTTU9ERV9DT05UIHx8CisJICAgIChsb2MgPj0gc2J3LT5zY3JvbGxiYXIudG9wTG9jICYmCisJICAgICBsb2MgPD0gc2J3LT5zY3JvbGxiYXIudG9wTG9jICsgKGludClzYnctPnNjcm9sbGJhci5zaG93bkxlbmd0aCkpCisgICAgeworCVh0Q2FsbEFjdGlvblByb2ModywgIk1vdmVUaHVtYiIsIGV2ZW50LCBwYXJhbXMsICpudW1fcGFyYW1zKTsKKwlYdENhbGxBY3Rpb25Qcm9jKHcsICJOb3RpZnlUaHVtYiIsIGV2ZW50LCBwYXJhbXMsICpudW1fcGFyYW1zKTsKKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1JlcGVhdE5vdGlmeShjbGllbnRfZGF0YSwgaWRwKQorICAgIFh0UG9pbnRlciBjbGllbnRfZGF0YTsKKyAgICBYdEludGVydmFsSWQgKmlkcDsKK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgY2xpZW50X2RhdGE7CisgICAgaW50CQkgICAgY2FsbF9kYXRhOworICAgIGNoYXIJICAgIG1vZGUgPSBzYnctPnNjcm9sbGJhci5zY3JvbGxfbW9kZTsKKyAgICB1bnNpZ25lZCBsb25nICAgcmVwOworCisgICAgaWYgKG1vZGUgPT0gU01PREVfTk9ORSB8fCBtb2RlID09IFNNT0RFX0NPTlQpCisgICAgeworCXNidy0+c2Nyb2xsYmFyLnRpbWVyX2lkID0gKFh0SW50ZXJ2YWxJZCkwOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAobW9kZSA9PSBTTU9ERV9MSU5FX0RPV04gfHwgbW9kZSA9PSBTTU9ERV9MSU5FX1VQKQorICAgIHsKKwljYWxsX2RhdGEgPSBPTkVfTElORV9EQVRBOworCXJlcCA9IExJTkVfUkVQRUFUOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWNhbGxfZGF0YSA9IE9ORV9QQUdFX0RBVEE7CisJcmVwID0gUEFHRV9SRVBFQVQ7CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0gU01PREVfUEFHRV9VUCB8fCBtb2RlID09IFNNT0RFX0xJTkVfVVApCisJY2FsbF9kYXRhID0gLWNhbGxfZGF0YTsKKworICAgIFh0Q2FsbENhbGxiYWNrcygoV2lkZ2V0KXNidywgWHROc2Nyb2xsUHJvYywgKFh0UG9pbnRlciljYWxsX2RhdGEpOworCisgICAgc2J3LT5zY3JvbGxiYXIudGltZXJfaWQgPQorCVh0QXBwQWRkVGltZU91dChYdFdpZGdldFRvQXBwbGljYXRpb25Db250ZXh0KChXaWRnZXQpc2J3KSwKKwkJcmVwLAorCQlSZXBlYXROb3RpZnksCisJCWNsaWVudF9kYXRhKTsKK30KKworLyoKKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3IgZmxvYXRpbmcgbnVtYmVycy4KKyAqLworICAgIHN0YXRpYyBmbG9hdAorRmxvYXRJblJhbmdlKG51bSwgc21hbGwsIGJpZykKKyAgICBmbG9hdCBudW0sIHNtYWxsLCBiaWc7Cit7CisgICAgcmV0dXJuIChudW0gPCBzbWFsbCkgPyBzbWFsbCA6ICgobnVtID4gYmlnKSA/IGJpZyA6IG51bSk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1Njcm9sbE9uZUxpbmVVcCh3LCBldmVudCwgcGFyYW1zLCBudW1fcGFyYW1zKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgU3RyaW5nCSpwYXJhbXM7CisgICAgQ2FyZGluYWwJKm51bV9wYXJhbXM7Cit7CisgICAgU2Nyb2xsU29tZSh3LCBldmVudCwgLU9ORV9MSU5FX0RBVEEpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitTY3JvbGxPbmVMaW5lRG93bih3LCBldmVudCwgcGFyYW1zLCBudW1fcGFyYW1zKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgU3RyaW5nCSpwYXJhbXM7CisgICAgQ2FyZGluYWwJKm51bV9wYXJhbXM7Cit7CisgICAgU2Nyb2xsU29tZSh3LCBldmVudCwgT05FX0xJTkVfREFUQSk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK1Njcm9sbFBhZ2VEb3duKHcsIGV2ZW50LCBwYXJhbXMsIG51bV9wYXJhbXMpCisgICAgV2lkZ2V0CXc7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBTdHJpbmcJKnBhcmFtczsKKyAgICBDYXJkaW5hbAkqbnVtX3BhcmFtczsKK3sKKyAgICBTY3JvbGxTb21lKHcsIGV2ZW50LCBPTkVfUEFHRV9EQVRBKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorU2Nyb2xsUGFnZVVwKHcsIGV2ZW50LCBwYXJhbXMsIG51bV9wYXJhbXMpCisgICAgV2lkZ2V0CXc7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBTdHJpbmcJKnBhcmFtczsKKyAgICBDYXJkaW5hbAkqbnVtX3BhcmFtczsKK3sKKyAgICBTY3JvbGxTb21lKHcsIGV2ZW50LCAtT05FX1BBR0VfREFUQSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorU2Nyb2xsU29tZSh3LCBldmVudCwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgaW50CQljYWxsX2RhdGE7Cit7CisgICAgU2Nyb2xsYmFyV2lkZ2V0CXNidyA9IChTY3JvbGxiYXJXaWRnZXQpIHc7CisKKyAgICBpZiAoc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX21vZGUgPT0gU01PREVfQ09OVCkgICAvKiBpZiBzY3JvbGwgY29udGludW91cyAqLworCXJldHVybjsKKworICAgIGlmIChMb29rQWhlYWQodywgZXZlbnQpKQorCXJldHVybjsKKworICAgIHNidy0+c2Nyb2xsYmFyLnNjcm9sbF9tb2RlID0gU01PREVfTElORV9VUDsKKyAgICBYdENhbGxDYWxsYmFja3ModywgWHROc2Nyb2xsUHJvYywgKFh0UG9pbnRlciljYWxsX2RhdGEpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitOb3RpZnlTY3JvbGwodywgZXZlbnQsIHBhcmFtcywgbnVtX3BhcmFtcykKKyAgICBXaWRnZXQJdzsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIFN0cmluZwkqcGFyYW1zOworICAgIENhcmRpbmFsCSpudW1fcGFyYW1zOworeworICAgIFNjcm9sbGJhcldpZGdldCBzYncgPSAoU2Nyb2xsYmFyV2lkZ2V0KSB3OworICAgIFBvc2l0aW9uCSAgICB4LCB5LCBsb2M7CisgICAgRGltZW5zaW9uCSAgICBhcnJvd19zaXplOworICAgIHVuc2lnbmVkIGxvbmcgICBkZWxheSA9IDA7CisgICAgaW50CQkgICAgY2FsbF9kYXRhID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgICAgc3RhdGU7CisKKyAgICBpZiAoc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX21vZGUgPT0gU01PREVfQ09OVCkgICAvKiBpZiBzY3JvbGwgY29udGludW91cyAqLworCXJldHVybjsKKworICAgIGlmIChMb29rQWhlYWQgKHcsIGV2ZW50KSkKKwlyZXR1cm47CisKKyAgICBFeHRyYWN0UG9zaXRpb24oZXZlbnQsICZ4LCAmeSwgJnN0YXRlKTsKKyAgICBsb2MgPSBQSUNLTEVOR1RIKHNidywgeCwgeSk7CisKKyAgICBpZiAoKGludClzYnctPnNjcm9sbGJhci50aGlja25lc3MgKiAyID4gKGludClzYnctPnNjcm9sbGJhci5sZW5ndGgpCisJYXJyb3dfc2l6ZSA9IHNidy0+c2Nyb2xsYmFyLmxlbmd0aCAvIDI7CisgICAgZWxzZQorCWFycm93X3NpemUgPSBzYnctPnNjcm9sbGJhci50aGlja25lc3M7CisKKyAgICAvKgorICAgICAqIGhhbmRsZSBDVFJMIG1vZGlmaWVyCisgICAgICovCisgICAgaWYgKHN0YXRlICYgQ29udHJvbE1hc2spCisgICAgeworCWlmIChsb2MgPiBzYnctPnNjcm9sbGJhci50b3BMb2MgKyAoUG9zaXRpb24pc2J3LT5zY3JvbGxiYXIuc2hvd25MZW5ndGgpCisJICAgIGNhbGxfZGF0YSA9IEVORF9QQUdFX0RBVEE7CisJZWxzZQorCSAgICBjYWxsX2RhdGEgPSAtRU5EX1BBR0VfREFUQTsKKwlzYnctPnNjcm9sbGJhci5zY3JvbGxfbW9kZSA9IFNNT0RFX05PTkU7CisgICAgfQorICAgIC8qCisgICAgICogaGFuZGxlIGZpcnN0IGFycm93IHpvbmUKKyAgICAgKi8KKyAgICBlbHNlIGlmIChsb2MgPCAoUG9zaXRpb24pYXJyb3dfc2l6ZSkKKyAgICB7CisJY2FsbF9kYXRhID0gLU9ORV9MSU5FX0RBVEE7CisJc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX21vZGUgPSBTTU9ERV9MSU5FX1VQOworCWRlbGF5ID0gTElORV9ERUxBWTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSBsYXN0IGFycm93IHpvbmUKKyAgICAgKi8KKyAgICBlbHNlIGlmIChsb2MgPiAoUG9zaXRpb24pKHNidy0+c2Nyb2xsYmFyLmxlbmd0aCAtIGFycm93X3NpemUpKQorICAgIHsKKwljYWxsX2RhdGEgPSBPTkVfTElORV9EQVRBOworCXNidy0+c2Nyb2xsYmFyLnNjcm9sbF9tb2RlID0gU01PREVfTElORV9ET1dOOworCWRlbGF5ID0gTElORV9ERUxBWTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGhhbmRsZSB6b25lICJhYm92ZSIgdGhlIHRodW1iCisgICAgICovCisgICAgZWxzZSBpZiAobG9jIDwgc2J3LT5zY3JvbGxiYXIudG9wTG9jKQorICAgIHsKKwljYWxsX2RhdGEgPSAtT05FX1BBR0VfREFUQTsKKwlzYnctPnNjcm9sbGJhci5zY3JvbGxfbW9kZSA9IFNNT0RFX1BBR0VfVVA7CisJZGVsYXkgPSBQQUdFX0RFTEFZOworICAgIH0KKworICAgIC8qCisgICAgICogaGFuZGxlIHpvbmUgImJlbG93IiB0aGUgdGh1bWIKKyAgICAgKi8KKyAgICBlbHNlIGlmIChsb2MgPiBzYnctPnNjcm9sbGJhci50b3BMb2MgKyAoUG9zaXRpb24pc2J3LT5zY3JvbGxiYXIuc2hvd25MZW5ndGgpCisgICAgeworCWNhbGxfZGF0YSA9IE9ORV9QQUdFX0RBVEE7CisJc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX21vZGUgPSBTTU9ERV9QQUdFX0RPV047CisJZGVsYXkgPSBQQUdFX0RFTEFZOworICAgIH0KKworICAgIGlmIChjYWxsX2RhdGEpCisJWHRDYWxsQ2FsbGJhY2tzKHcsIFh0TnNjcm9sbFByb2MsIChYdFBvaW50ZXIpY2FsbF9kYXRhKTsKKworICAgIC8qIGVzdGFibGlzaCBhdXRvc2Nyb2xsICovCisgICAgaWYgKGRlbGF5KQorCXNidy0+c2Nyb2xsYmFyLnRpbWVyX2lkID0KKwkgICAgWHRBcHBBZGRUaW1lT3V0KFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQodyksCisJCQkJCSAgIGRlbGF5LCBSZXBlYXROb3RpZnksIChYdFBvaW50ZXIpdyk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK0VuZFNjcm9sbCh3LCBldmVudCwgcGFyYW1zLCBudW1fcGFyYW1zKQorICAgIFdpZGdldCB3OworICAgIFhFdmVudCAqZXZlbnQ7CS8qIHVudXNlZCAqLworICAgIFN0cmluZyAqcGFyYW1zOwkvKiB1bnVzZWQgKi8KKyAgICBDYXJkaW5hbCAqbnVtX3BhcmFtczsgICAvKiB1bnVzZWQgKi8KK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgdzsKKworICAgIHNidy0+c2Nyb2xsYmFyLnNjcm9sbF9tb2RlID0gU01PREVfTk9ORTsKKyAgICAvKiBubyBuZWVkIHRvIHJlbW92ZSBhbnkgYXV0b3Njcm9sbCB0aW1lb3V0OyBpdCB3aWxsIG5vLW9wICovCisgICAgLyogYmVjYXVzZSB0aGUgc2Nyb2xsX21vZGUgaXMgU01PREVfTk9ORSAqLworICAgIC8qIGJ1dCBiZSBzdXJlIHRvIHJlbW92ZSB0aW1lb3V0IGluIGRlc3Ryb3kgcHJvYyAqLworfQorCisgICAgc3RhdGljIGZsb2F0CitGcmFjdGlvbkxvYyhzYncsIHgsIHkpCisgICAgU2Nyb2xsYmFyV2lkZ2V0IHNidzsKKyAgICBpbnQgeCwgeTsKK3sKKyAgICBpbnQJICAgIG1hcmdpbjsKKyAgICBmbG9hdCAgIGhlaWdodCwgd2lkdGg7CisKKyAgICBtYXJnaW4gPSBNQVJHSU4oc2J3KTsKKyAgICB4IC09IG1hcmdpbjsKKyAgICB5IC09IG1hcmdpbjsKKyAgICBoZWlnaHQgPSAoZmxvYXQpc2J3LT5jb3JlLmhlaWdodCAtIDIgKiBtYXJnaW47CisgICAgd2lkdGggPSAoZmxvYXQpc2J3LT5jb3JlLndpZHRoIC0gMiAqIG1hcmdpbjsKKyAgICByZXR1cm4gUElDS0xFTkdUSChzYncsIHggLyB3aWR0aCwgeSAvIGhlaWdodCk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK01vdmVUaHVtYih3LCBldmVudCwgcGFyYW1zLCBudW1fcGFyYW1zKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgU3RyaW5nCSpwYXJhbXM7CS8qIHVudXNlZCAqLworICAgIENhcmRpbmFsCSpudW1fcGFyYW1zOwkvKiB1bnVzZWQgKi8KK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQJc2J3ID0gKFNjcm9sbGJhcldpZGdldCl3OworICAgIFBvc2l0aW9uCQl4LCB5OworICAgIGZsb2F0CQl0b3A7CisgICAgY2hhcgkJb2xkX21vZGUgPSBzYnctPnNjcm9sbGJhci5zY3JvbGxfbW9kZTsKKworICAgIHNidy0+c2Nyb2xsYmFyLnNjcm9sbF9tb2RlID0gU01PREVfQ09OVDsgLyogaW5kaWNhdGUgY29udGludW91cyBzY3JvbGwgKi8KKworICAgIGlmIChMb29rQWhlYWQodywgZXZlbnQpKQorCXJldHVybjsKKworICAgIGlmICghZXZlbnQtPnhtb3Rpb24uc2FtZV9zY3JlZW4pCisJcmV0dXJuOworCisgICAgRXh0cmFjdFBvc2l0aW9uKGV2ZW50LCAmeCwgJnksICh1bnNpZ25lZCBpbnQgKilOVUxMKTsKKworICAgIHRvcCA9IEZyYWN0aW9uTG9jKHNidywgeCwgeSk7CisKKyAgICBpZiAob2xkX21vZGUgIT0gU01PREVfQ09OVCkJCSAgICAvKiBzdGFydCBkcmFnZ2luZzogc2V0IG9mZnNldCAqLworICAgIHsKKwlpZiAoZXZlbnQtPnhidXR0b24uYnV0dG9uID09IEJ1dHRvbjIpCisJICAgIHNidy0+c2Nyb2xsYmFyLnNjcm9sbF9vZmYgPSBzYnctPnNjcm9sbGJhci5zaG93biAvIDIuOworCWVsc2UKKwkgICAgc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX29mZiA9IHRvcCAtIHNidy0+c2Nyb2xsYmFyLnRvcDsKKyAgICB9CisKKyAgICB0b3AgLT0gc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX29mZjsKKyAgICBpZiAoc2J3LT5zY3JvbGxiYXIubGltaXRfdGh1bWIpCisJdG9wID0gRmxvYXRJblJhbmdlKHRvcCwgMC4wLAorCQkJc2J3LT5zY3JvbGxiYXIubWF4IC0gc2J3LT5zY3JvbGxiYXIuc2hvd24gKyAwLjAwMDAwMSk7CisgICAgZWxzZQorCXRvcCA9IEZsb2F0SW5SYW5nZSh0b3AsIDAuMCwgc2J3LT5zY3JvbGxiYXIubWF4KTsKKworICAgIHNidy0+c2Nyb2xsYmFyLnRvcCA9IHRvcDsKKyAgICBQYWludFRodW1iKHNidyk7CisgICAgWEZsdXNoKFh0RGlzcGxheSh3KSk7ICAgLyogcmUtZHJhdyBpdCBiZWZvcmUgTm90aWZ5aW5nICovCit9CisKKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorTm90aWZ5VGh1bWIodywgZXZlbnQsIHBhcmFtcywgbnVtX3BhcmFtcykKKyAgICBXaWRnZXQJdzsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIFN0cmluZwkqcGFyYW1zOwkvKiB1bnVzZWQgKi8KKyAgICBDYXJkaW5hbAkqbnVtX3BhcmFtczsJLyogdW51c2VkICovCit7CisgICAgU2Nyb2xsYmFyV2lkZ2V0IHNidyA9IChTY3JvbGxiYXJXaWRnZXQpdzsKKworICAgIGlmIChMb29rQWhlYWQodywgZXZlbnQpKQorCXJldHVybjsKKworICAgIC8qIHRodW1iUHJvYyBpcyBub3QgcHJldHR5LCBidXQgaXMgbmVjZXNzYXJ5IGZvciBiYWNrd2FyZHMKKyAgICAgICBjb21wYXRpYmlsaXR5IG9uIHRob3NlIGFyY2hpdGVjdHVyZXMgZm9yIHdoaWNoIGl0IHdvcmt7cyxlZH07CisgICAgICAgdGhlIGludGVudCBpcyB0byBwYXNzIGEgKHRydW5jYXRlZCkgZmxvYXQgYnkgdmFsdWUuICovCisgICAgWHRDYWxsQ2FsbGJhY2tzKHcsIFh0TnRodW1iUHJvYywgKihYdFBvaW50ZXIqKSZzYnctPnNjcm9sbGJhci50b3ApOworICAgIFh0Q2FsbENhbGxiYWNrcyh3LCBYdE5qdW1wUHJvYywgKFh0UG9pbnRlcikmc2J3LT5zY3JvbGxiYXIudG9wKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorQWxsb2NUb3BTaGFkb3dHQyh3KQorICAgIFdpZGdldCB3OworeworICAgIFNjcm9sbGJhcldpZGdldCBzYncgPSAoU2Nyb2xsYmFyV2lkZ2V0KSB3OworICAgIFh0R0NNYXNrCSAgICB2YWx1ZW1hc2s7CisgICAgWEdDVmFsdWVzCSAgICBteVhHQ1Y7CisKKyAgICB2YWx1ZW1hc2sgPSBHQ0ZvcmVncm91bmQ7CisgICAgbXlYR0NWLmZvcmVncm91bmQgPSBzYnctPnNjcm9sbGJhci50b3Bfc2hhZG93X3BpeGVsOworICAgIHNidy0+c2Nyb2xsYmFyLnRvcF9zaGFkb3dfR0MgPSBYdEdldEdDKHcsIHZhbHVlbWFzaywgJm15WEdDVik7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK0FsbG9jQm90U2hhZG93R0ModykKKyAgICBXaWRnZXQgdzsKK3sKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgdzsKKyAgICBYdEdDTWFzawkgICAgdmFsdWVtYXNrOworICAgIFhHQ1ZhbHVlcwkgICAgbXlYR0NWOworCisgICAgdmFsdWVtYXNrID0gR0NGb3JlZ3JvdW5kOworICAgIG15WEdDVi5mb3JlZ3JvdW5kID0gc2J3LT5zY3JvbGxiYXIuYm90X3NoYWRvd19waXhlbDsKKyAgICBzYnctPnNjcm9sbGJhci5ib3Rfc2hhZG93X0dDID0gWHRHZXRHQyh3LCB2YWx1ZW1hc2ssICZteVhHQ1YpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitfWGF3M2REcmF3U2hhZG93cyhndywgZXZlbnQsIHJlZ2lvbiwgb3V0KQorICAgIFdpZGdldCAgZ3c7CisgICAgWEV2ZW50ICAqZXZlbnQ7CisgICAgUmVnaW9uICByZWdpb247CisgICAgaW50CSAgICBvdXQ7Cit7CisgICAgWFBvaW50ICBwdFs2XTsKKyAgICBTY3JvbGxiYXJXaWRnZXQgc2J3ID0gKFNjcm9sbGJhcldpZGdldCkgZ3c7CisgICAgRGltZW5zaW9uCXMgPSBzYnctPnNjcm9sbGJhci5zaGFkb3dfd2lkdGg7CisgICAgLyoKKyAgICAgKiBkcmF3IHRoZSBzaGFkb3dzIHVzaW5nIHRoZSBjb3JlIHBhcnQgd2lkdGggYW5kIGhlaWdodCwKKyAgICAgKiBhbmQgdGhlIHNjcm9sbGJhciBwYXJ0IHNoYWRvd193aWR0aC4KKyAgICAgKgorICAgICAqCW5vIHBvaW50IHRvIGRvIGFueXRoaW5nIGlmIHRoZSBzaGFkb3dfd2lkdGggaXMgMCBvciB0aGUKKyAgICAgKgl3aWRnZXQgaGFzIG5vdCBiZWVuIHJlYWxpemVkLgorICAgICAqLworICAgIGlmIChzID4gMCAmJiBYdElzUmVhbGl6ZWQoZ3cpKQorICAgIHsKKwlEaW1lbnNpb24gICBoID0gc2J3LT5jb3JlLmhlaWdodDsKKwlEaW1lbnNpb24gICB3ID0gc2J3LT5jb3JlLndpZHRoOworCURpbWVuc2lvbiAgIHdtcyA9IHcgLSBzOworCURpbWVuc2lvbiAgIGhtcyA9IGggLSBzOworCURpc3BsYXkJICAgICpkcHkgPSBYdERpc3BsYXkgKGd3KTsKKwlXaW5kb3cJICAgIHdpbiA9IFh0V2luZG93IChndyk7CisJR0MJdG9wLCBib3Q7CisKKwlpZiAob3V0KQorCXsKKwkgICAgdG9wID0gc2J3LT5zY3JvbGxiYXIudG9wX3NoYWRvd19HQzsKKwkgICAgYm90ID0gc2J3LT5zY3JvbGxiYXIuYm90X3NoYWRvd19HQzsKKwl9CisJZWxzZQorCXsKKwkgICAgdG9wID0gc2J3LT5zY3JvbGxiYXIuYm90X3NoYWRvd19HQzsKKwkgICAgYm90ID0gc2J3LT5zY3JvbGxiYXIudG9wX3NoYWRvd19HQzsKKwl9CisKKwkvKiB0b3AtbGVmdCBzaGFkb3cgKi8KKwlpZiAoKHJlZ2lvbiA9PSBOVUxMKSB8fAorCQkoWFJlY3RJblJlZ2lvbiAocmVnaW9uLCAwLCAwLCB3LCBzKSAhPSBSZWN0YW5nbGVPdXQpIHx8CisJCShYUmVjdEluUmVnaW9uIChyZWdpb24sIDAsIDAsIHMsIGgpICE9IFJlY3RhbmdsZU91dCkpCisJeworCSAgICBwdFswXS54ID0gMDsgICAgcHRbMF0ueSA9IGg7CisJICAgIHB0WzFdLnggPQkgICAgcHRbMV0ueSA9IDA7CisJICAgIHB0WzJdLnggPSB3OyAgICBwdFsyXS55ID0gMDsKKwkgICAgcHRbM10ueCA9IHdtczsgIHB0WzNdLnkgPSBzOworCSAgICBwdFs0XS54ID0JICAgIHB0WzRdLnkgPSBzOworCSAgICBwdFs1XS54ID0gczsgICAgcHRbNV0ueSA9IGhtczsKKwkgICAgWEZpbGxQb2x5Z29uIChkcHksIHdpbiwgdG9wLCBwdCwgNiwgQ29tcGxleCwgQ29vcmRNb2RlT3JpZ2luKTsKKwl9CisKKwkvKiBib3R0b20tcmlnaHQgc2hhZG93ICovCisJaWYgKChyZWdpb24gPT0gTlVMTCkgfHwKKwkJKFhSZWN0SW5SZWdpb24gKHJlZ2lvbiwgMCwgaG1zLCB3LCBzKSAhPSBSZWN0YW5nbGVPdXQpIHx8CisJCShYUmVjdEluUmVnaW9uIChyZWdpb24sIHdtcywgMCwgcywgaCkgIT0gUmVjdGFuZ2xlT3V0KSkKKwl7CisJICAgIHB0WzBdLnggPSAwOyAgICBwdFswXS55ID0gaDsKKwkgICAgcHRbMV0ueCA9IHc7ICAgIHB0WzFdLnkgPSBoOworCSAgICBwdFsyXS54ID0gdzsgICAgcHRbMl0ueSA9IDA7CisJICAgIHB0WzNdLnggPSB3bXM7ICBwdFszXS55ID0gczsKKwkgICAgcHRbNF0ueCA9IHdtczsgIHB0WzRdLnkgPSBobXM7CisJICAgIHB0WzVdLnggPSBzOyAgICBwdFs1XS55ID0gaG1zOworCSAgICBYRmlsbFBvbHlnb24gKGRweSwgd2luLCBib3QsIHB0LCA2LCBDb21wbGV4LCBDb29yZE1vZGVPcmlnaW4pOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIFNldCB0aGUgc2Nyb2xsIGJhciB0byB0aGUgZ2l2ZW4gbG9jYXRpb24uCisgKi8KKyAgICB2b2lkCit2aW1fWGF3U2Nyb2xsYmFyU2V0VGh1bWIodywgdG9wLCBzaG93biwgbWF4KQorICAgIFdpZGdldCB3OworICAgIGRvdWJsZSB0b3AsIHNob3duLCBtYXg7Cit7CisgICAgU2Nyb2xsYmFyV2lkZ2V0IHNidyA9IChTY3JvbGxiYXJXaWRnZXQpIHc7CisKKyAgICBpZiAoc2J3LT5zY3JvbGxiYXIuc2Nyb2xsX21vZGUgPT0gU01PREVfQ09OVCkgLyogaWYgc3RpbGwgdGh1bWJpbmcgKi8KKwlyZXR1cm47CisKKyAgICBzYnctPnNjcm9sbGJhci5tYXggPSAobWF4ID4gMS4wKSA/IDEuMCA6CisJCShtYXggPj0gMC4wKSA/IG1heCA6IHNidy0+c2Nyb2xsYmFyLm1heDsKKworICAgIHNidy0+c2Nyb2xsYmFyLnRvcCA9ICh0b3AgPiBzYnctPnNjcm9sbGJhci5tYXgpID8gc2J3LT5zY3JvbGxiYXIubWF4IDoKKwkJKHRvcCA+PSAwLjApID8gdG9wIDogc2J3LT5zY3JvbGxiYXIudG9wOworCisgICAgc2J3LT5zY3JvbGxiYXIuc2hvd24gPSAoc2hvd24gPiAxLjApID8gMS4wIDoKKwkJKHNob3duID49IDAuMCkgPyBzaG93biA6IHNidy0+c2Nyb2xsYmFyLnNob3duOworCisgICAgUGFpbnRUaHVtYihzYncpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9hdF9zYi5oIGIvc3JjL2d1aV9hdF9zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2QxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX2F0X3NiLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6ICovCisvKiBNT0RJRklFRCBBVEhFTkEgU0NST0xMQkFSIChVU0lORyBBUlJPV0hFQURTIEFUIEVORFMgT0YgVFJBVkVMKSAqLworLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgMTk5MiBieSBNaXRjaCBUcmFjaHRlbmJlcmcJCSAgKi8KKy8qIFJpZ2h0cywgcGVybWlzc2lvbnMsIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFyZSBhcyBpbiB0aGUgICovCisvKiBERUMgYW5kIE1JVCBub3RpY2UgYmVsb3cuICBTZWUgdXNhZ2Ugd2FybmluZyBpbiAuYyBmaWxlLgkgICovCisvKgorICogJFhDb25zb3J0aXVtOiBTY3JvbGxiYXJQLmgsdiAxLjMgOTQvMDQvMTcgMjA6MTI6NDIgamltIEV4cCAkCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4ICBYIENvbnNvcnRpdW0KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvcnRpdW0uCisKKworQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1Njcm9sbGJhcl9oCisjZGVmaW5lIF9TY3JvbGxiYXJfaAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNjcm9sbGJhciBXaWRnZXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWNQLmg+CisjaW5jbHVkZSA8WDExL1hhdy9TaW1wbGVQLmg+CisjaW5jbHVkZSA8WDExL1htdS9Db252ZXJ0ZXJzLmg+CisKKy8qCisgKiBNb3N0IHRoaW5ncyB3ZSBuZWVkIGFyZSBpbiBTdHJpbmdEZWZzLmgKKyAqLworI2RlZmluZSBYdENNaW5pbXVtVGh1bWIJCSJNaW5pbXVtVGh1bWIiCisjZGVmaW5lIFh0Q1Nob3duCQkiU2hvd24iCisjZGVmaW5lIFh0Q1RvcE9mVGh1bWIJCSJUb3BPZlRodW1iIgorI2RlZmluZSBYdENNYXhPZlRodW1iCQkiTWF4T2ZUaHVtYiIKKyNkZWZpbmUgWHRDU2hhZG93V2lkdGgJCSJTaGFkb3dXaWR0aCIKKyNkZWZpbmUgWHRDVG9wU2hhZG93UGl4ZWwJIlRvcFNoYWRvd1BpeGVsIgorI2RlZmluZSBYdENCb3R0b21TaGFkb3dQaXhlbAkiQm90dG9tU2hhZG93UGl4ZWwiCisjZGVmaW5lIFh0Q0xpbWl0VGh1bWIJCSJMaW1pdFRodW1iIgorCisjZGVmaW5lIFh0Tm1pbmltdW1UaHVtYgkJIm1pbmltdW1UaHVtYiIKKyNkZWZpbmUgWHROdG9wT2ZUaHVtYgkJInRvcE9mVGh1bWIiCisjZGVmaW5lIFh0Tm1heE9mVGh1bWIJCSJtYXhPZlRodW1iIgorI2RlZmluZSBYdE5zaGFkb3dXaWR0aAkJInNoYWRvd1dpZHRoIgorI2RlZmluZSBYdE50b3BTaGFkb3dQaXhlbAkidG9wU2hhZG93UGl4ZWwiCisjZGVmaW5lIFh0TmJvdHRvbVNoYWRvd1BpeGVsCSJib3R0b21TaGFkb3dQaXhlbCIKKyNkZWZpbmUgWHRObGltaXRUaHVtYgkJImxpbWl0VGh1bWIiCisKK3R5cGVkZWYgc3RydWN0IF9TY3JvbGxiYXJSZWMJICAqU2Nyb2xsYmFyV2lkZ2V0OwordHlwZWRlZiBzdHJ1Y3QgX1Njcm9sbGJhckNsYXNzUmVjICpTY3JvbGxiYXJXaWRnZXRDbGFzczsKKworZXh0ZXJuIFdpZGdldENsYXNzIHZpbV9zY3JvbGxiYXJXaWRnZXRDbGFzczsKKworZXh0ZXJuIHZvaWQgdmltX1hhd1Njcm9sbGJhclNldFRodW1iIF9fQVJHUygoV2lkZ2V0LCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgIC8qIHB1YmxpYyAqLworICAgIFBpeGVsCSAgZm9yZWdyb3VuZDsJLyogdGh1bWIgZm9yZWdyb3VuZCBjb2xvciAqLworICAgIFh0T3JpZW50YXRpb24gb3JpZW50YXRpb247CS8qIGhvcml6b250YWwgb3IgdmVydGljYWwgKi8KKyAgICBYdENhbGxiYWNrTGlzdCBzY3JvbGxQcm9jOwkvKiBwcm9wb3J0aW9uYWwgc2Nyb2xsICovCisgICAgWHRDYWxsYmFja0xpc3QgdGh1bWJQcm9jOwkvKiBqdW1wICh0byBwb3NpdGlvbikgc2Nyb2xsICovCisgICAgWHRDYWxsYmFja0xpc3QganVtcFByb2M7CS8qIHNhbWUgYXMgdGh1bWJQcm9jIGJ1dCBwYXNzIGRhdGEgYnkgcmVmICovCisgICAgUGl4bWFwCSAgdGh1bWI7CS8qIHRodW1iIGNvbG9yICovCisgICAgZmxvYXQJICB0b3A7CQkvKiBXaGF0IHBlcmNlbnQgaXMgYWJvdmUgdGhlIHdpbidzIHRvcCAqLworICAgIGZsb2F0CSAgc2hvd247CS8qIFdoYXQgcGVyY2VudCBpcyBzaG93biBpbiB0aGUgd2luICovCisgICAgZmxvYXQJICBtYXg7CQkvKiBNYXhpbXVtIHZhbHVlIGZvciB0b3AgKi8KKyAgICBEaW1lbnNpb24JICBsZW5ndGg7CS8qIGVpdGhlciBoZWlnaHQgb3Igd2lkdGggKi8KKyAgICBEaW1lbnNpb24JICB0aGlja25lc3M7CS8qIGVpdGhlciB3aWR0aCBvciBoZWlnaHQgKi8KKyAgICBEaW1lbnNpb24JICBtaW5fdGh1bWI7CS8qIG1pbml1bSBzaXplIGZvciB0aGUgdGh1bWIuICovCisKKyAgICAgLyogcHJpdmF0ZSAqLworICAgIFh0SW50ZXJ2YWxJZCAgdGltZXJfaWQ7CS8qIGF1dG9yZXBlYXQgdGltZXI7IHJlbW92ZSBvbiBkZXN0cnVjdGlvbiAqLworICAgIGNoYXIJICBzY3JvbGxfbW9kZTsJLyogc2VlIGJlbG93ICovCisgICAgZmxvYXQJICBzY3JvbGxfb2ZmOwkvKiBvZmZzZXQgZnJvbSBldmVudCB0byB0b3Agb2YgdGh1bWIgKi8KKyAgICBHQwkJICBnYzsJCS8qIGEgKHNoYXJlZCkgZ2MgKi8KKyAgICBQb3NpdGlvbgkgIHRvcExvYzsJLyogUGl4ZWwgdGhhdCBjb3JyZXNwb25kcyB0byB0b3AgKi8KKyAgICBEaW1lbnNpb24JICBzaG93bkxlbmd0aDsJLyogTnVtIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHNob3duICovCisKKyAgICAvKiBGcm9tIDNkIHdpZGdldCAqLworICAgIERpbWVuc2lvbglzaGFkb3dfd2lkdGg7CisgICAgUGl4ZWwJdG9wX3NoYWRvd19waXhlbDsKKyAgICBQaXhlbAlib3Rfc2hhZG93X3BpeGVsOworICAgIEJvb2wJbGltaXRfdGh1bWI7CS8qIGxpbWl0IHRodW1iIHRvIGluc2lkZSBzY3JvbGxiYXIgKi8KKyAgICBpbnQJCXRvcF9zaGFkb3dfY29udHJhc3Q7CisgICAgaW50CQlib3Rfc2hhZG93X2NvbnRyYXN0OworICAgIEdDCQl0b3Bfc2hhZG93X0dDOworICAgIEdDCQlib3Rfc2hhZG93X0dDOworfSBTY3JvbGxiYXJQYXJ0OworCisjZGVmaW5lIFNNT0RFX05PTkUJCTAKKyNkZWZpbmUgU01PREVfQ09OVAkJMQorI2RlZmluZSBTTU9ERV9QQUdFX1VQCQkyCisjZGVmaW5lIFNNT0RFX1BBR0VfRE9XTgkJMworI2RlZmluZSBTTU9ERV9MSU5FX1VQCQk0CisjZGVmaW5lIFNNT0RFX0xJTkVfRE9XTgkJNQorCisjZGVmaW5lIE9ORV9MSU5FX0RBVEEJCTEKKyNkZWZpbmUgT05FX1BBR0VfREFUQQkJMTAKKyNkZWZpbmUgRU5EX1BBR0VfREFUQQkJOTk5OQorCit0eXBlZGVmIHN0cnVjdCBfU2Nyb2xsYmFyUmVjIHsKKyAgICBDb3JlUGFydAkJY29yZTsKKyAgICBTaW1wbGVQYXJ0CQlzaW1wbGU7CisgICAgU2Nyb2xsYmFyUGFydAlzY3JvbGxiYXI7Cit9IFNjcm9sbGJhclJlYzsKKwordHlwZWRlZiBzdHJ1Y3Qge2ludCBlbXB0eTt9IFNjcm9sbGJhckNsYXNzUGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgX1Njcm9sbGJhckNsYXNzUmVjIHsKKyAgICBDb3JlQ2xhc3NQYXJ0CQljb3JlX2NsYXNzOworICAgIFNpbXBsZUNsYXNzUGFydAkJc2ltcGxlX2NsYXNzOworICAgIFNjcm9sbGJhckNsYXNzUGFydAkJc2Nyb2xsYmFyX2NsYXNzOworfSBTY3JvbGxiYXJDbGFzc1JlYzsKKworZXh0ZXJuIFNjcm9sbGJhckNsYXNzUmVjIHZpbV9zY3JvbGxiYXJDbGFzc1JlYzsKKworI2VuZGlmIC8qIF9TY3JvbGxiYXJfaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9hdGhlbmEuYyBiL3NyYy9ndWlfYXRoZW5hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NzdlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfYXRoZW5hLmMKQEAgLTAsMCArMSwyMjMwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCQkJCUF0aGVuYSBwb3J0IGJ5IEJpbGwgRm9zdGVyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKyNpbmNsdWRlIDxYMTEvU3RyaW5nRGVmcy5oPgorI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpZmRlZiBGRUFUX0dVSV9ORVhUQVcKKyMgaW5jbHVkZSA8WDExL25lWHRhdy9Gb3JtLmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvU2ltcGxlTWVudS5oPgorIyBpbmNsdWRlIDxYMTEvbmVYdGF3L01lbnVCdXR0b24uaD4KKyMgaW5jbHVkZSA8WDExL25lWHRhdy9TbWVCU0IuaD4KKyMgaW5jbHVkZSA8WDExL25lWHRhdy9TbWVMaW5lLmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvQm94Lmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvRGlhbG9nLmg+CisjIGluY2x1ZGUgPFgxMS9uZVh0YXcvVGV4dC5oPgorIyBpbmNsdWRlIDxYMTEvbmVYdGF3L0FzY2lpVGV4dC5oPgorIyBpbmNsdWRlIDxYMTEvbmVYdGF3L1Njcm9sbGJhci5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8WDExL1hhdy9Gb3JtLmg+CisjIGluY2x1ZGUgPFgxMS9YYXcvU2ltcGxlTWVudS5oPgorIyBpbmNsdWRlIDxYMTEvWGF3L01lbnVCdXR0b24uaD4KKyMgaW5jbHVkZSA8WDExL1hhdy9TbWVCU0IuaD4KKyMgaW5jbHVkZSA8WDExL1hhdy9TbWVMaW5lLmg+CisjIGluY2x1ZGUgPFgxMS9YYXcvQm94Lmg+CisjIGluY2x1ZGUgPFgxMS9YYXcvRGlhbG9nLmg+CisjIGluY2x1ZGUgPFgxMS9YYXcvVGV4dC5oPgorIyBpbmNsdWRlIDxYMTEvWGF3L0FzY2lpVGV4dC5oPgorI2VuZGlmIC8qIEZFQVRfR1VJX05FWFRBVyAqLworCisjaW5jbHVkZSAidmltLmgiCisjaWZuZGVmIEZFQVRfR1VJX05FWFRBVworIyBpbmNsdWRlICJndWlfYXRfc2IuaCIKKyNlbmRpZgorCitleHRlcm4gV2lkZ2V0IHZpbVNoZWxsOworCitzdGF0aWMgV2lkZ2V0IHZpbUZvcm0gPSAoV2lkZ2V0KTA7CitzdGF0aWMgV2lkZ2V0IHRleHRBcmVhID0gKFdpZGdldCkwOworI2lmZGVmIEZFQVRfTUVOVQorc3RhdGljIFdpZGdldCBtZW51QmFyID0gKFdpZGdldCkwOworc3RhdGljIFh0SW50ZXJ2YWxJZCB0aW1lciA9IDA7CSAgICAvKiAwID0gZXhwaXJlZCwgb3RoZXJ3aXNlIGFjdGl2ZSAqLworCisvKiBVc2VkIHRvIGZpZ3VyZSBvdXQgbWVudSBvcmRlcmluZyAqLworc3RhdGljIHZpbW1lbnVfVCAqYV9jdXJfbWVudSA9IE5VTEw7CitzdGF0aWMgQ2FyZGluYWwJYXRoZW5hX2NhbGN1bGF0ZV9pbnNfcG9zIF9fQVJHUygoV2lkZ2V0KSk7CisKK3N0YXRpYyBQaXhtYXAgZ3VpX2F0aGVuYV9jcmVhdGVfcHVsbHJpZ2h0X3BpeG1hcCBfX0FSR1MoKFdpZGdldCkpOworc3RhdGljIHZvaWQgZ3VpX2F0aGVuYV9tZW51X3RpbWVvdXQgX19BUkdTKChYdFBvaW50ZXIsIFh0SW50ZXJ2YWxJZCAqKSk7CitzdGF0aWMgdm9pZCBndWlfYXRoZW5hX3BvcHVwX2NhbGxiYWNrIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFh0UG9pbnRlcikpOworc3RhdGljIHZvaWQgZ3VpX2F0aGVuYV9kZWxheWVkX2FybV9hY3Rpb24gX19BUkdTKChXaWRnZXQsIFhFdmVudCAqLCBTdHJpbmcgKiwKKwkJCQkJCSBDYXJkaW5hbCAqKSk7CitzdGF0aWMgdm9pZCBndWlfYXRoZW5hX3BvcGRvd25fc3VibWVudXNfYWN0aW9uIF9fQVJHUygoV2lkZ2V0LCBYRXZlbnQgKiwKKwkJCQkJCSAgICAgIFN0cmluZyAqLCBDYXJkaW5hbCAqKSk7CitzdGF0aWMgWHRBY3Rpb25zUmVjCXB1bGxBY3Rpb25bMl0gPSB7CisgICAgeyAibWVudS1kZWxheWVkcG9wdXAiLCAoWHRBY3Rpb25Qcm9jKWd1aV9hdGhlbmFfZGVsYXllZF9hcm1fYWN0aW9ufSwKKyAgICB7ICJtZW51LXBvcGRvd25zdWJtZW51cyIsIChYdEFjdGlvblByb2MpZ3VpX2F0aGVuYV9wb3Bkb3duX3N1Ym1lbnVzX2FjdGlvbn0KK307CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVE9PTEJBUgorc3RhdGljIHZvaWQgZ3VpX21jaF9yZXNldF9mb2N1cyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBXaWRnZXQgdG9vbEJhciA9IChXaWRnZXQpMDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBndWlfYXRoZW5hX3Njcm9sbF9jYl9qdW1wCV9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFh0UG9pbnRlcikpOworc3RhdGljIHZvaWQgZ3VpX2F0aGVuYV9zY3JvbGxfY2Jfc2Nyb2xsIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFh0UG9pbnRlcikpOworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfTUVOVSkKK3N0YXRpYyB2b2lkIGd1aV9hdGhlbmFfbWVudV9jb2xvcnMgX19BUkdTKChXaWRnZXQgaWQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZ3VpX2F0aGVuYV9zY3JvbGxfY29sb3JzIF9fQVJHUygoV2lkZ2V0IGlkKSk7CisKKyNpZmRlZiBGRUFUX01FTlUKK3N0YXRpYyBYdFRyYW5zbGF0aW9ucwlwb3B1cFRyYW5zLCBwYXJlbnRUcmFucywgbWVudVRyYW5zLCBzdXBlcm1lbnVUcmFuczsKK3N0YXRpYyBQaXhtYXAJCXB1bGxlckJpdG1hcCA9IE5vbmU7CitzdGF0aWMgaW50CQlwdWxsZXJfd2lkdGggPSAwOworI2VuZGlmCisKKy8qCisgKiBTY3JvbGxiYXIgY2FsbGJhY2sgKFh0Tmp1bXBQcm9jKSBmb3Igd2hlbiB0aGUgc2Nyb2xsYmFyIGlzIGRyYWdnZWQgd2l0aCB0aGUKKyAqIGxlZnQgb3IgbWlkZGxlIG1vdXNlIGJ1dHRvbi4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2F0aGVuYV9zY3JvbGxfY2JfanVtcCh3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSwgY2FsbF9kYXRhOworeworICAgIHNjcm9sbGJhcl9UICpzYiwgKnNiX2luZm87CisgICAgbG9uZwl2YWx1ZTsKKworICAgIHNiID0gZ3VpX2ZpbmRfc2Nyb2xsYmFyKChsb25nKWNsaWVudF9kYXRhKTsKKworICAgIGlmIChzYiA9PSBOVUxMKQorCXJldHVybjsKKyAgICBlbHNlIGlmIChzYi0+d3AgIT0gTlVMTCkJICAgIC8qIExlZnQgb3IgcmlnaHQgc2Nyb2xsYmFyICovCisgICAgeworCS8qCisJICogQ2FyZWZ1bDogbmVlZCB0byBnZXQgc2Nyb2xsYmFyIGluZm8gb3V0IG9mIGZpcnN0IChsZWZ0KSBzY3JvbGxiYXIKKwkgKiBmb3Igd2luZG93LCBidXQga2VlcCByZWFsIHNjcm9sbGJhciB0b28gYmVjYXVzZSB3ZSBtdXN0IHBhc3MgaXQgdG8KKwkgKiBndWlfZHJhZ19zY3JvbGxiYXIoKS4KKwkgKi8KKwlzYl9pbmZvID0gJnNiLT53cC0+d19zY3JvbGxiYXJzWzBdOworICAgIH0KKyAgICBlbHNlCSAgICAvKiBCb3R0b20gc2Nyb2xsYmFyICovCisJc2JfaW5mbyA9IHNiOworCisgICAgdmFsdWUgPSAobG9uZykoKigoZmxvYXQgKiljYWxsX2RhdGEpICogKGZsb2F0KShzYl9pbmZvLT5tYXggKyAxKSArIDAuMDAxKTsKKyAgICBpZiAodmFsdWUgPiBzYl9pbmZvLT5tYXgpCisJdmFsdWUgPSBzYl9pbmZvLT5tYXg7CisKKyAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbHVlLCBUUlVFKTsKK30KKworLyoKKyAqIFNjcm9sbGJhciBjYWxsYmFjayAoWHROc2Nyb2xsUHJvYykgZm9yIHBhZ2luZyB1cCBvciBkb3duIHdpdGggdGhlIGxlZnQgb3IKKyAqIHJpZ2h0IG1vdXNlIGJ1dHRvbnMuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9hdGhlbmFfc2Nyb2xsX2NiX3Njcm9sbCh3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSwgY2FsbF9kYXRhOworeworICAgIHNjcm9sbGJhcl9UICpzYiwgKnNiX2luZm87CisgICAgbG9uZwl2YWx1ZTsKKyAgICBpbnQJCWRhdGEgPSAoaW50KShsb25nKWNhbGxfZGF0YTsKKyAgICBpbnQJCXBhZ2U7CisKKyAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZyljbGllbnRfZGF0YSk7CisKKyAgICBpZiAoc2IgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgaWYgKHNiLT53cCAhPSBOVUxMKQkJLyogTGVmdCBvciByaWdodCBzY3JvbGxiYXIgKi8KKyAgICB7CisJLyoKKwkgKiBDYXJlZnVsOiBuZWVkIHRvIGdldCBzY3JvbGxiYXIgaW5mbyBvdXQgb2YgZmlyc3QgKGxlZnQpIHNjcm9sbGJhcgorCSAqIGZvciB3aW5kb3csIGJ1dCBrZWVwIHJlYWwgc2Nyb2xsYmFyIHRvbyBiZWNhdXNlIHdlIG11c3QgcGFzcyBpdCB0bworCSAqIGd1aV9kcmFnX3Njcm9sbGJhcigpLgorCSAqLworCXNiX2luZm8gPSAmc2ItPndwLT53X3Njcm9sbGJhcnNbMF07CisKKwlpZiAoc2JfaW5mby0+c2l6ZSA+IDUpCisJICAgIHBhZ2UgPSBzYl9pbmZvLT5zaXplIC0gMjsJICAgIC8qIHVzZSB0d28gbGluZXMgb2YgY29udGV4dCAqLworCWVsc2UKKwkgICAgcGFnZSA9IHNiX2luZm8tPnNpemU7CisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisJaWYgKGRhdGEgPCAwKQorCXsKKwkgICAgZGF0YSA9IChkYXRhIC0gZ3VpLmNoYXJfaGVpZ2h0ICsgMSkgLyBndWkuY2hhcl9oZWlnaHQ7CisJICAgIGlmIChkYXRhID4gLXNiX2luZm8tPnNpemUpCisJCWRhdGEgPSAtMTsKKwkgICAgZWxzZQorCQlkYXRhID0gLXBhZ2U7CisJfQorCWVsc2UgaWYgKGRhdGEgPiAwKQorCXsKKwkgICAgZGF0YSA9IChkYXRhICsgZ3VpLmNoYXJfaGVpZ2h0IC0gMSkgLyBndWkuY2hhcl9oZWlnaHQ7CisJICAgIGlmIChkYXRhIDwgc2JfaW5mby0+c2l6ZSkKKwkJZGF0YSA9IDE7CisJICAgIGVsc2UKKwkJZGF0YSA9IHBhZ2U7CisJfQorI2Vsc2UKKwlzd2l0Y2ggKGRhdGEpCisJeworCSAgICBjYXNlICBPTkVfTElORV9EQVRBOiBkYXRhID0gMTsgYnJlYWs7CisJICAgIGNhc2UgLU9ORV9MSU5FX0RBVEE6IGRhdGEgPSAtMTsgYnJlYWs7CisJICAgIGNhc2UgIE9ORV9QQUdFX0RBVEE6IGRhdGEgPSBwYWdlOyBicmVhazsKKwkgICAgY2FzZSAtT05FX1BBR0VfREFUQTogZGF0YSA9IC1wYWdlOyBicmVhazsKKwkgICAgY2FzZSAgRU5EX1BBR0VfREFUQTogZGF0YSA9IHNiX2luZm8tPm1heDsgYnJlYWs7CisJICAgIGNhc2UgLUVORF9QQUdFX0RBVEE6IGRhdGEgPSAtc2JfaW5mby0+bWF4OyBicmVhazsKKwkJCWRlZmF1bHQ6IGRhdGEgPSAwOyBicmVhazsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQkJCS8qIEJvdHRvbSBzY3JvbGxiYXIgKi8KKyAgICB7CisJc2JfaW5mbyA9IHNiOworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworCWlmIChkYXRhIDwgMCkKKwl7CisJICAgIGRhdGEgPSAoZGF0YSAtIGd1aS5jaGFyX3dpZHRoICsgMSkgLyBndWkuY2hhcl93aWR0aDsKKwkgICAgaWYgKGRhdGEgPiAtc2ItPnNpemUpCisJCWRhdGEgPSAtMTsKKwl9CisJZWxzZSBpZiAoZGF0YSA+IDApCisJeworCSAgICBkYXRhID0gKGRhdGEgKyBndWkuY2hhcl93aWR0aCAtIDEpIC8gZ3VpLmNoYXJfd2lkdGg7CisJICAgIGlmIChkYXRhIDwgc2ItPnNpemUpCisJCWRhdGEgPSAxOworCX0KKyNlbmRpZgorCWlmIChkYXRhIDwgLTEpCQkvKiBwYWdlLXdpZHRoIGxlZnQgKi8KKwl7CisJICAgIGlmIChzYi0+c2l6ZSA+IDgpCisJCWRhdGEgPSAtKHNiLT5zaXplIC0gNSk7CisJICAgIGVsc2UKKwkJZGF0YSA9IC1zYi0+c2l6ZTsKKwl9CisJZWxzZSBpZiAoZGF0YSA+IDEpCS8qIHBhZ2Utd2lkdGggcmlnaHQgKi8KKwl7CisJICAgIGlmIChzYi0+c2l6ZSA+IDgpCisJCWRhdGEgPSAoc2ItPnNpemUgLSA1KTsKKwkgICAgZWxzZQorCQlkYXRhID0gc2ItPnNpemU7CisJfQorICAgIH0KKworICAgIHZhbHVlID0gc2JfaW5mby0+dmFsdWUgKyBkYXRhOworICAgIGlmICh2YWx1ZSA+IHNiX2luZm8tPm1heCkKKwl2YWx1ZSA9IHNiX2luZm8tPm1heDsKKyAgICBlbHNlIGlmICh2YWx1ZSA8IDApCisJdmFsdWUgPSAwOworCisgICAgLyogVXBkYXRlIHRoZSBib3R0b20gc2Nyb2xsYmFyIGFuIGV4dHJhIHRpbWUgKHdoeSBpcyB0aGlzIG5lZWRlZD8/ICovCisgICAgaWYgKHNiLT53cCA9PSBOVUxMKQkJLyogQm90dG9tIHNjcm9sbGJhciAqLworCWd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYihzYiwgdmFsdWUsIHNiLT5zaXplLCBzYi0+bWF4KTsKKworICAgIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIEZBTFNFKTsKK30KKworLyoKKyAqIENyZWF0ZSBhbGwgdGhlIEF0aGVuYSB3aWRnZXRzIG5lY2Vzc2FyeS4KKyAqLworICAgIHZvaWQKK2d1aV94MTFfY3JlYXRlX3dpZGdldHMoKQoreworICAgIC8qCisgICAgICogV2UgZG9uJ3QgaGF2ZSBhbnkgYm9yZGVycyBoYW5kbGVkIGludGVybmFsbHkgYnkgdGhlIHRleHRBcmVhIHRvIHdvcnJ5CisgICAgICogYWJvdXQgc28gb25seSBza2lwIG92ZXIgdGhlIGNvbmZpZ3VyZWQgYm9yZGVyIHdpZHRoLgorICAgICAqLworICAgIGd1aS5ib3JkZXJfb2Zmc2V0ID0gZ3VpLmJvcmRlcl93aWR0aDsKKworI2lmIDAgLyogbm90IG5lZWRlZD8gKi8KKyAgICBYdEluaXRpYWxpemVXaWRnZXRDbGFzcyhmb3JtV2lkZ2V0Q2xhc3MpOworICAgIFh0SW5pdGlhbGl6ZVdpZGdldENsYXNzKGJveFdpZGdldENsYXNzKTsKKyAgICBYdEluaXRpYWxpemVXaWRnZXRDbGFzcyhjb3JlV2lkZ2V0Q2xhc3MpOworI2lmZGVmIEZFQVRfTUVOVQorICAgIFh0SW5pdGlhbGl6ZVdpZGdldENsYXNzKG1lbnVCdXR0b25XaWRnZXRDbGFzcyk7CisjZW5kaWYKKyAgICBYdEluaXRpYWxpemVXaWRnZXRDbGFzcyhzaW1wbGVNZW51V2lkZ2V0Q2xhc3MpOworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworICAgIFh0SW5pdGlhbGl6ZVdpZGdldENsYXNzKHNjcm9sbGJhcldpZGdldENsYXNzKTsKKyNlbHNlCisgICAgWHRJbml0aWFsaXplV2lkZ2V0Q2xhc3ModmltX3Njcm9sbGJhcldpZGdldENsYXNzKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBUaGUgZm9ybSBjb250YWluaW5nIGFsbCB0aGUgb3RoZXIgd2lkZ2V0cyAqLworICAgIHZpbUZvcm0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgidmltRm9ybSIsCisJZm9ybVdpZGdldENsYXNzLAl2aW1TaGVsbCwKKwlYdE5ib3JkZXJXaWR0aCwJCTAsCisJTlVMTCk7CisgICAgZ3VpX2F0aGVuYV9zY3JvbGxfY29sb3JzKHZpbUZvcm0pOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgLyogVGhlIHRvcCBtZW51IGJhciAqLworICAgIG1lbnVCYXIgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgibWVudUJhciIsCisJYm94V2lkZ2V0Q2xhc3MsCQl2aW1Gb3JtLAorCVh0TnJlc2l6YWJsZSwJCVRydWUsCisJWHROdG9wLAkJCVh0Q2hhaW5Ub3AsCisJWHROYm90dG9tLAkJWHRDaGFpblRvcCwKKwlYdE5sZWZ0LAkJWHRDaGFpbkxlZnQsCisJWHROcmlnaHQsCQlYdENoYWluUmlnaHQsCisJWHROaW5zZXJ0UG9zaXRpb24sCWF0aGVuYV9jYWxjdWxhdGVfaW5zX3BvcywKKwlOVUxMKTsKKyAgICBndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnVCYXIpOworICAgIGlmIChndWkubWVudV9mZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCVh0VmFTZXRWYWx1ZXMobWVudUJhciwgWHROYm9yZGVyQ29sb3IsIGd1aS5tZW51X2ZnX3BpeGVsLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgLyogRG9uJ3QgY3JlYXRlIGl0IE1hbmFnZWQsIGl0IHdpbGwgYmUgbWFuYWdlZCB3aGVuIGNyZWF0aW5nIHRoZSBmaXJzdAorICAgICAqIGl0ZW0uICBPdGhlcndpc2UgYW4gZW1wdHkgdG9vbGJhciBzaG93cyB1cC4gKi8KKyAgICB0b29sQmFyID0gWHRWYUNyZWF0ZVdpZGdldCgidG9vbEJhciIsCisJYm94V2lkZ2V0Q2xhc3MsCQl2aW1Gb3JtLAorCVh0TnJlc2l6YWJsZSwJCVRydWUsCisJWHROdG9wLAkJCVh0Q2hhaW5Ub3AsCisJWHROYm90dG9tLAkJWHRDaGFpblRvcCwKKwlYdE5sZWZ0LAkJWHRDaGFpbkxlZnQsCisJWHROcmlnaHQsCQlYdENoYWluUmlnaHQsCisJWHROb3JpZW50YXRpb24sCQlYdG9yaWVudEhvcml6b250YWwsCisJWHROaFNwYWNlLAkJMSwKKwlYdE52U3BhY2UsCQkzLAorCVh0Tmluc2VydFBvc2l0aW9uLAlhdGhlbmFfY2FsY3VsYXRlX2luc19wb3MsCisJTlVMTCk7CisgICAgZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyh0b29sQmFyKTsKKyNlbmRpZgorCisgICAgLyogVGhlIHRleHQgYXJlYS4gKi8KKyAgICB0ZXh0QXJlYSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ0ZXh0QXJlYSIsCisJY29yZVdpZGdldENsYXNzLAl2aW1Gb3JtLAorCVh0TnJlc2l6YWJsZSwJCVRydWUsCisJWHROdG9wLAkJCVh0Q2hhaW5Ub3AsCisJWHROYm90dG9tLAkJWHRDaGFpblRvcCwKKwlYdE5sZWZ0LAkJWHRDaGFpbkxlZnQsCisJWHROcmlnaHQsCQlYdENoYWluTGVmdCwKKwlYdE5iYWNrZ3JvdW5kLAkJZ3VpLmJhY2tfcGl4ZWwsCisJWHROYm9yZGVyV2lkdGgsCQkwLAorCU5VTEwpOworCisgICAgLyoKKyAgICAgKiBJbnN0YWxsIHRoZSBjYWxsYmFja3MuCisgICAgICovCisgICAgZ3VpX3gxMV9jYWxsYmFja3ModGV4dEFyZWEsIHZpbUZvcm0pOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgcG9wdXBUcmFucyA9IFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlKAorCSAgICAiPEVudGVyV2luZG93PjogbWVudS1wb3Bkb3duc3VibWVudXMoKSBoaWdobGlnaHQoKSBtZW51LWRlbGF5ZWRwb3B1cCgpXG4iCisJICAgICI8TGVhdmVXaW5kb3c+OiB1bmhpZ2hsaWdodCgpXG4iCisJICAgICI8QnRuVXA+OiBtZW51LXBvcGRvd25zdWJtZW51cygpIFh0TWVudVBvcGRvd24oKSBub3RpZnkoKSB1bmhpZ2hsaWdodCgpXG4iCisJICAgICI8TW90aW9uPjogaGlnaGxpZ2h0KCkgbWVudS1kZWxheWVkcG9wdXAoKSIpOworICAgIHBhcmVudFRyYW5zID0gWHRQYXJzZVRyYW5zbGF0aW9uVGFibGUoIjxMZWF2ZVdpbmRvdz46IHVuaGlnaGxpZ2h0KCkiKTsKKyAgICBtZW51VHJhbnMgPSBYdFBhcnNlVHJhbnNsYXRpb25UYWJsZSgKKwkgICAgIjxFbnRlcldpbmRvdz46IG1lbnUtcG9wZG93bnN1Ym1lbnVzKCkgaGlnaGxpZ2h0KCkgbWVudS1kZWxheWVkcG9wdXAoKVxuIgorCSAgICAiPExlYXZlV2luZG93PjogbWVudS1wb3Bkb3duc3VibWVudXMoKSBYdE1lbnVQb3Bkb3duKCkgdW5oaWdobGlnaHQoKVxuIgorCSAgICAiPEJ0blVwPjogbm90aWZ5KCkgdW5oaWdobGlnaHQoKVxuIgorCSAgICAiPEJ0bk1vdGlvbj46IGhpZ2hsaWdodCgpIG1lbnUtZGVsYXllZHBvcHVwKCkiKTsKKyAgICBzdXBlcm1lbnVUcmFucyA9IFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlKAorCSAgICAiPEVudGVyV2luZG93PjogbWVudS1wb3Bkb3duc3VibWVudXMoKSBoaWdobGlnaHQoKSBtZW51LWRlbGF5ZWRwb3B1cCgpXG4iCisJICAgICI8TGVhdmVXaW5kb3c+OiB1bmhpZ2hsaWdodCgpXG4iCisJICAgICI8QnRuVXA+OiBtZW51LXBvcGRvd25zdWJtZW51cygpIFh0TWVudVBvcGRvd24oKSBub3RpZnkoKSB1bmhpZ2hsaWdodCgpXG4iCisJICAgICI8QnRuTW90aW9uPjogaGlnaGxpZ2h0KCkgbWVudS1kZWxheWVkcG9wdXAoKSIpOworCisgICAgWHRBcHBBZGRBY3Rpb25zKFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQodmltRm9ybSksIHB1bGxBY3Rpb24sCisJCSAgICBYdE51bWJlcihwdWxsQWN0aW9uKSk7CisjZW5kaWYKKworICAgIC8qIFByZXRlbmQgd2UgZG9uJ3QgaGF2ZSBpbnB1dCBmb2N1cywgd2Ugd2lsbCBnZXQgYW4gZXZlbnQgaWYgd2UgZG8uICovCisgICAgZ3VpLmluX2ZvY3VzID0gRkFMU0U7Cit9CisKKyNpZmRlZiBGRUFUX01FTlUKKy8qCisgKiBDYWxjdWxhdGVzIHRoZSBQaXhtYXAgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgbWVudSBmb250LgorICovCisgICAgc3RhdGljIFBpeG1hcAorZ3VpX2F0aGVuYV9jcmVhdGVfcHVsbHJpZ2h0X3BpeG1hcCh3KQorICAgIFdpZGdldCAgdzsKK3sKKyAgICBQaXhtYXAgIHJldHZhbDsKKyNpZmRlZiBGT05UU0VUX0FMV0FZUworICAgIFhGb250U2V0CWZvbnQgPSBOb25lOworI2Vsc2UKKyAgICBYRm9udFN0cnVjdAkqZm9udCA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisgICAgaWYgKGd1aS5tZW51X2ZvbnRzZXQgPT0gTk9GT05UU0VUKQorI2Vsc2UKKyAgICBpZiAoZ3VpLm1lbnVfZm9udCA9PSBOT0ZPTlQpCisjZW5kaWYKKyAgICB7CisJWHJtVmFsdWUgZnJvbSwgdG87CisJV2lkZ2V0TGlzdCAgY2hpbGRyZW47CisJQ2FyZGluYWwgICAgbnVtX2NoaWxkcmVuOworCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwlmcm9tLnNpemUgPSBzdHJsZW4oZnJvbS5hZGRyID0gWHREZWZhdWx0Rm9udFNldCk7CisJdG8uYWRkciA9IChYdFBvaW50ZXIpJmZvbnQ7CisJdG8uc2l6ZSA9IHNpemVvZihYRm9udFNldCk7CisjZWxzZQorCWZyb20uc2l6ZSA9IHN0cmxlbihmcm9tLmFkZHIgPSBYdERlZmF1bHRGb250KTsKKwl0by5hZGRyID0gKFh0UG9pbnRlcikmZm9udDsKKwl0by5zaXplID0gc2l6ZW9mKFhGb250U3RydWN0ICopOworI2VuZGlmCisJLyogQXNzdW1wdGlvbjogVGhlIG1lbnVCYXIgY2hpbGRyZW4gd2lsbCB1c2UgdGhlIHNhbWUgZm9udCBhcyB0aGUKKwkgKgkgICAgICAgcHVsbGRvd24gbWVudSBpdGVtcyBBTkQgdGhleSB3aWxsIGFsbCBiZSBvZiB0eXBlCisJICoJICAgICAgIFh0TmZvbnQuCisJICovCisJWHRWYUdldFZhbHVlcyhtZW51QmFyLCBYdE5jaGlsZHJlbiwgJmNoaWxkcmVuLAorCQkJICAgICAgIFh0Tm51bUNoaWxkcmVuLCAmbnVtX2NoaWxkcmVuLAorCQkJICAgICAgIE5VTEwpOworCWlmIChYdENvbnZlcnRBbmRTdG9yZSh3ID8gdyA6CisJCQkJKG51bV9jaGlsZHJlbiA+IDApID8gY2hpbGRyZW5bMF0gOiBtZW51QmFyLAorCQkJICAgICAgWHRSU3RyaW5nLCAmZnJvbSwKKyNpZmRlZiBGT05UU0VUX0FMV0FZUworCQkJICAgICAgWHRSRm9udFNldCwgJnRvCisjZWxzZQorCQkJICAgICAgWHRSRm9udFN0cnVjdCwgJnRvCisjZW5kaWYKKwkJICAgICkgPT0gRmFsc2UpCisJICAgIHJldHVybiBOb25lOworCS8qICJmb250IiBzaG91bGQgbm93IGNvbnRhaW4gZGF0YSAqLworICAgIH0KKyAgICBlbHNlCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwlmb250ID0gKFhGb250U2V0KWd1aS5tZW51X2ZvbnRzZXQ7CisjZWxzZQorCWZvbnQgPSAoWEZvbnRTdHJ1Y3QgKilndWkubWVudV9mb250OworI2VuZGlmCisKKyAgICB7CisJaW50CSAgICB3aWR0aCwgaGVpZ2h0OworCUdDCSAgICBkcmF3X2djLCB1bmRyYXdfZ2M7CisJWEdDVmFsdWVzICAgZ2NfdmFsdWVzOworCVhQb2ludAkgICAgcG9pbnRzWzNdOworCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwloZWlnaHQgPSBmb250c2V0X2hlaWdodDIoZm9udCk7CisjZWxzZQorCWhlaWdodCA9IGZvbnQtPm1heF9ib3VuZHMuYXNjZW50ICsgZm9udC0+bWF4X2JvdW5kcy5kZXNjZW50OworI2VuZGlmCisJd2lkdGggPSBoZWlnaHQgLSAyOworCXB1bGxlcl93aWR0aCA9IHdpZHRoICsgNDsKKwlyZXR2YWwgPSBYQ3JlYXRlUGl4bWFwKGd1aS5kcHksRGVmYXVsdFJvb3RXaW5kb3coZ3VpLmRweSksd2lkdGgsCisJCQkgICAgICAgaGVpZ2h0LCAxKTsKKwlnY192YWx1ZXMuZm9yZWdyb3VuZCA9IDE7CisJZ2NfdmFsdWVzLmJhY2tncm91bmQgPSAwOworCWRyYXdfZ2MgPSBYQ3JlYXRlR0MoZ3VpLmRweSwgcmV0dmFsLAorCQkgICAgR0NGb3JlZ3JvdW5kIHwgR0NCYWNrZ3JvdW5kLAorCQkgICAgJmdjX3ZhbHVlcyk7CisJZ2NfdmFsdWVzLmZvcmVncm91bmQgPSAwOworCWdjX3ZhbHVlcy5iYWNrZ3JvdW5kID0gMTsKKwl1bmRyYXdfZ2MgPSBYQ3JlYXRlR0MoZ3VpLmRweSwgcmV0dmFsLAorCQkJICAgICAgR0NGb3JlZ3JvdW5kIHwgR0NCYWNrZ3JvdW5kLAorCQkJICAgICAgJmdjX3ZhbHVlcyk7CisJcG9pbnRzWzBdLnggPSAwOworCXBvaW50c1swXS55ID0gMDsKKwlwb2ludHNbMV0ueCA9IHdpZHRoIC0gMTsKKwlwb2ludHNbMV0ueSA9IChoZWlnaHQgLSAxKSAvIDI7CisJcG9pbnRzWzJdLnggPSAwOworCXBvaW50c1syXS55ID0gaGVpZ2h0IC0gMTsKKwlYRmlsbFJlY3RhbmdsZShndWkuZHB5LCByZXR2YWwsIHVuZHJhd19nYywgMCwgMCwgaGVpZ2h0LCBoZWlnaHQpOworCVhGaWxsUG9seWdvbihndWkuZHB5LCByZXR2YWwsIGRyYXdfZ2MsIHBvaW50cywgWHROdW1iZXIocG9pbnRzKSwKKwkJICAgICBDb252ZXgsIENvb3JkTW9kZU9yaWdpbik7CisJWEZyZWVHQyhndWkuZHB5LCBkcmF3X2djKTsKKwlYRnJlZUdDKGd1aS5kcHksIHVuZHJhd19nYyk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBHVUkgaXMgbm90IGdvaW5nIHRvIHN0YXJ0IGFmdGVyIGFsbC4KKyAqLworICAgIHZvaWQKK2d1aV94MTFfZGVzdHJveV93aWRnZXRzKCkKK3sKKyAgICB0ZXh0QXJlYSA9IE5VTEw7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgbWVudUJhciA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICB0b29sQmFyID0gTlVMTDsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9zZXRfdG9vbGJhcl9wb3MoeCwgeSwgdywgaCkKKyAgICBpbnQJICAgIHg7CisgICAgaW50CSAgICB5OworICAgIGludAkgICAgdzsKKyAgICBpbnQJICAgIGg7Cit7CisgICAgRGltZW5zaW9uCWJvcmRlcjsKKyAgICBpbnQJCWhlaWdodDsKKworICAgIGlmICghWHRJc01hbmFnZWQodG9vbEJhcikpCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisgICAgWHRVbm1hbmFnZUNoaWxkKHRvb2xCYXIpOworICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwKKwkJWHROYm9yZGVyV2lkdGgsICZib3JkZXIsCisJCU5VTEwpOworICAgIGhlaWdodCA9IGggLSAyICogYm9yZGVyOworICAgIGlmIChoZWlnaHQgPCAwKQorCWhlaWdodCA9IDE7CisgICAgWHRWYVNldFZhbHVlcyh0b29sQmFyLAorCQkgIFh0Tmhvcml6RGlzdGFuY2UsIHgsCisJCSAgWHROdmVydERpc3RhbmNlLCB5LAorCQkgIFh0TndpZHRoLCB3IC0gMiAqIGJvcmRlciwKKwkJICBYdE5oZWlnaHQsCWhlaWdodCwKKwkJICBOVUxMKTsKKyAgICBYdE1hbmFnZUNoaWxkKHRvb2xCYXIpOworfQorI2VuZGlmCisKKyAgICB2b2lkCitndWlfbWNoX3NldF90ZXh0X2FyZWFfcG9zKHgsIHksIHcsIGgpCisgICAgaW50CSAgICB4OworICAgIGludAkgICAgeTsKKyAgICBpbnQJICAgIHc7CisgICAgaW50CSAgICBoOworeworICAgIFh0VW5tYW5hZ2VDaGlsZCh0ZXh0QXJlYSk7CisgICAgWHRWYVNldFZhbHVlcyh0ZXh0QXJlYSwKKwkJICBYdE5ob3JpekRpc3RhbmNlLCB4LAorCQkgIFh0TnZlcnREaXN0YW5jZSwgeSwKKwkJICBYdE53aWR0aCwgdywKKwkJICBYdE5oZWlnaHQsIGgsCisJCSAgTlVMTCk7CisgICAgWHRNYW5hZ2VDaGlsZCh0ZXh0QXJlYSk7CisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgLyogR2l2ZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgdGV4dEFyZWEgaW5zdGVhZCBvZiB0aGUgdG9vbGJhci4gKi8KKyAgICBndWlfbWNoX3Jlc2V0X2ZvY3VzKCk7CisjZW5kaWYKK30KKworI2lmZGVmIEZFQVRfVE9PTEJBUgorLyoKKyAqIEEgdG9vbGJhciBidXR0b24gaGFzIGJlZW4gcHVzaGVkOyBub3cgcmVzZXQgdGhlIGlucHV0IGZvY3VzCisgKiBzdWNoIHRoYXQgdGhlIHVzZXIgY2FuIHR5cGUgcGFnZSB1cC9kb3duIGV0Yy4gYW5kIGhhdmUgdGhlCisgKiBpbnB1dCBnbyB0byB0aGUgZWRpdG9yIHdpbmRvdywgbm90IHRoZSBidXR0b24KKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfbWNoX3Jlc2V0X2ZvY3VzKCkKK3sKKyAgICBYdFNldEtleWJvYXJkRm9jdXModmltRm9ybSwgdGV4dEFyZWEpOworfQorI2VuZGlmCisKKworICAgIHZvaWQKK2d1aV94MTFfc2V0X2JhY2tfY29sb3IoKQoreworICAgIGlmICh0ZXh0QXJlYSAhPSBOVUxMKQorCVh0VmFTZXRWYWx1ZXModGV4dEFyZWEsCisJCSAgWHROYmFja2dyb3VuZCwgZ3VpLmJhY2tfcGl4ZWwsCisJCSAgTlVMTCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBNZW51IHN0dWZmLgorICovCisKK3N0YXRpYyBjaGFyX3UJKm1ha2VfcHVsbF9uYW1lIF9fQVJHUygoY2hhcl91ICogbmFtZSkpOworc3RhdGljIFdpZGdldAlnZXRfcG9wdXBfZW50cnkgX19BUkdTKChXaWRnZXQgdykpOworc3RhdGljIFdpZGdldAlzdWJtZW51X3dpZGdldCBfX0FSR1MoKFdpZGdldCkpOworc3RhdGljIEJvb2xlYW4JaGFzX3N1Ym1lbnUgX19BUkdTKChXaWRnZXQpKTsKK3N0YXRpYyB2b2lkIGd1aV9tY2hfc3VibWVudV9jaGFuZ2UgX19BUkdTKCh2aW1tZW51X1QgKm1wLCBpbnQgY29sb3JzKSk7CitzdGF0aWMgdm9pZCBndWlfYXRoZW5hX21lbnVfZm9udCBfX0FSR1MoKFdpZGdldCBpZCkpOworc3RhdGljIEJvb2xlYW4JZ3VpX2F0aGVuYV9tZW51X2hhc19zdWJtZW51cyBfX0FSR1MoKFdpZGdldCwgV2lkZ2V0KSk7CisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9tZW51KGZsYWcpCisgICAgaW50CSAgICBmbGFnOworeworICAgIGlmIChmbGFnKQorICAgIHsKKwlYdE1hbmFnZUNoaWxkKG1lbnVCYXIpOworIyBpZmRlZiBGRUFUX1RPT0xCQVIKKwlpZiAoWHRJc01hbmFnZWQodG9vbEJhcikpCisJeworCSAgICBYdFZhU2V0VmFsdWVzKHRvb2xCYXIsCisJCVh0TnZlcnREaXN0YW5jZSwgICAgZ3VpLm1lbnVfaGVpZ2h0LAorCQlOVUxMKTsKKwkgICAgWHRWYVNldFZhbHVlcyh0ZXh0QXJlYSwKKwkJWHROdmVydERpc3RhbmNlLCAgICBndWkubWVudV9oZWlnaHQgKyBndWkudG9vbGJhcl9oZWlnaHQsCisJCU5VTEwpOworCX0KKyMgZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlYdFVubWFuYWdlQ2hpbGQobWVudUJhcik7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorCWlmIChYdElzTWFuYWdlZCh0b29sQmFyKSkKKwl7CisJICAgIFh0VmFTZXRWYWx1ZXModG9vbEJhciwKKwkJWHROdmVydERpc3RhbmNlLCAgICAwLAorCQlOVUxMKTsKKwl9CisjIGVuZGlmCisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfbWVudV9wb3MoeCwgeSwgdywgaCkKKyAgICBpbnQJICAgIHg7CisgICAgaW50CSAgICB5OworICAgIGludAkgICAgdzsKKyAgICBpbnQJICAgIGg7Cit7CisgICAgRGltZW5zaW9uCWJvcmRlcjsKKyAgICBpbnQJCWhlaWdodDsKKworICAgIFh0VW5tYW5hZ2VDaGlsZChtZW51QmFyKTsKKyAgICBYdFZhR2V0VmFsdWVzKG1lbnVCYXIsIFh0TmJvcmRlcldpZHRoLCAmYm9yZGVyLCBOVUxMKTsKKyAgICAvKiBhdm9pZCB0cm91YmxlIHdoZW4gdGhlcmUgYXJlIG5vIG1lbnUgaXRlbXMsIGFuZCBoIGlzIDEgKi8KKyAgICBoZWlnaHQgPSBoIC0gMiAqIGJvcmRlcjsKKyAgICBpZiAoaGVpZ2h0IDwgMCkKKwloZWlnaHQgPSAxOworICAgIFh0VmFTZXRWYWx1ZXMobWVudUJhciwKKwkJWHROaG9yaXpEaXN0YW5jZSwgeCwKKwkJWHROdmVydERpc3RhbmNlLCB5LAorCQlYdE53aWR0aCwgdyAtIDIgKiBib3JkZXIsCisJCVh0TmhlaWdodCwgaGVpZ2h0LAorCQlOVUxMKTsKKyAgICBYdE1hbmFnZUNoaWxkKG1lbnVCYXIpOworfQorCisvKgorICogVXNlZCB0byBjYWxjdWxhdGUgdGhlIGluc2VydGlvbiBwb3NpdGlvbiBvZiBhIHdpZGdldCB3aXRoIHJlc3BlY3QgdG8gaXRzCisgKiBuZWlnaGJvcnMuCisgKgorICogVmFsaWQgcmFuZ2Ugb2YgcmV0dXJuIHZhbHVlcyBpczogMCAoYmVnaW5uaW5nIG9mIGNoaWxkcmVuKSB0bworICoJCQkJICAgIG51bUNoaWxkcmVuIChlbmQgb2YgY2hpbGRyZW4pLgorICovCisgICAgc3RhdGljIENhcmRpbmFsCithdGhlbmFfY2FsY3VsYXRlX2luc19wb3Mod2lkZ2V0KQorICAgIFdpZGdldAl3aWRnZXQ7Cit7CisgICAgLyogQXNzdW1lIHRoYXQgaWYgdGhlIHBhcmVudCBvZiB0aGUgdmltbWVudV9UIGlzIE5VTEwsIHRoZW4gd2UgY2FuIGdldAorICAgICAqIHRvIHRoaXMgbWVudSBieSB0cmF2ZXJzaW5nICJuZXh0Iiwgc3RhcnRpbmcgYXQgInJvb3RfbWVudSIuCisgICAgICoKKyAgICAgKiBUaGlzIGhvbGRzIHRydWUgZm9yIHBvcHVwIG1lbnVzLCB0b29sYmFyLCBhbmQgdG9wbGV2ZWwgbWVudSBpdGVtcy4KKyAgICAgKi8KKworICAgIC8qIFBvcHVwIG1lbnVzOiAgImlkIiBpcyBOVUxMLiBPbmx5IHN1Ym1lbnVfaWQgaXMgdmFsaWQgKi8KKworICAgIC8qIE1lbnVzIHRoYXQgYXJlIG5vdCB0b3BsZXZlbDogInBhcmVudCIgd2lsbCBiZSBub24tTlVMTCwgImlkIiAmCisgICAgICogInN1Ym1lbnVfaWQiIHdpbGwgYmUgbm9uLU5VTEwuCisgICAgICovCisKKyAgICAvKiBUb3BsZXZlbCBtZW51czogInBhcmVudCIgaXMgTlVMTCwgaWQgaXMgdGhlIHdpZGdldCBvZiB0aGUgbWVudSBpdGVtICovCisKKyAgICBXaWRnZXRMaXN0CWNoaWxkcmVuOworICAgIENhcmRpbmFsCW51bV9jaGlsZHJlbiA9IDA7CisgICAgaW50CQlyZXR2YWw7CisgICAgQXJnCQlhcmdzWzJdOworICAgIGludAkJbiA9IDA7CisgICAgaW50CQlpOworCisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWHROY2hpbGRyZW4sICZjaGlsZHJlbik7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYdE5udW1DaGlsZHJlbiwgJm51bV9jaGlsZHJlbik7IG4rKzsKKyAgICBYdEdldFZhbHVlcyhYdFBhcmVudCh3aWRnZXQpLCBhcmdzLCBuKTsKKworICAgIHJldHZhbCA9IG51bV9jaGlsZHJlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgeworCVdpZGdldAljdXJyZW50ID0gY2hpbGRyZW5baV07CisJdmltbWVudV9UCSptZW51ID0gTlVMTDsKKworCWZvciAobWVudSA9IChhX2N1cl9tZW51LT5wYXJlbnQgPT0gTlVMTCkKKwkJCSAgICAgICA/IHJvb3RfbWVudSA6IGFfY3VyX21lbnUtPnBhcmVudC0+Y2hpbGRyZW47CisJCQkgICAgICAgbWVudSAhPSBOVUxMOworCQkJICAgICAgIG1lbnUgPSBtZW51LT5uZXh0KQorCSAgICBpZiAoY3VycmVudCA9PSBtZW51LT5pZAorCQkgICAgJiYgYV9jdXJfbWVudS0+cHJpb3JpdHkgPCBtZW51LT5wcmlvcml0eQorCQkgICAgJiYgaSA8IHJldHZhbCkKKwkJcmV0dmFsID0gaTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51KG1lbnUsIGlkeCkKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQlpZHg7Cit7CisgICAgY2hhcl91CSpwdWxscmlnaHRfbmFtZTsKKyAgICBEaW1lbnNpb24JaGVpZ2h0LCBzcGFjZSwgYm9yZGVyOworICAgIHZpbW1lbnVfVAkqcGFyZW50ID0gbWVudS0+cGFyZW50OworCisgICAgYV9jdXJfbWVudSA9IG1lbnU7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgIHsKKwlpZiAobWVudV9pc19wb3B1cChtZW51LT5kbmFtZSkpCisJeworCSAgICBtZW51LT5zdWJtZW51X2lkID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJc2ltcGxlTWVudVdpZGdldENsYXNzLAl2aW1TaGVsbCwKKwkJWHROaW5zZXJ0UG9zaXRpb24sCWF0aGVuYV9jYWxjdWxhdGVfaW5zX3BvcywKKwkJWHROdHJhbnNsYXRpb25zLAlwb3B1cFRyYW5zLAorCQlOVUxMKTsKKwkgICAgZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyhtZW51LT5zdWJtZW51X2lkKTsKKwl9CisJZWxzZSBpZiAobWVudV9pc19tZW51YmFyKG1lbnUtPmRuYW1lKSkKKwl7CisJICAgIG1lbnUtPmlkID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJbWVudUJ1dHRvbldpZGdldENsYXNzLCBtZW51QmFyLAorCQlYdE5tZW51TmFtZSwJICAgIG1lbnUtPmRuYW1lLAorI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisJCVh0TmludGVybmF0aW9uYWwsICAgVHJ1ZSwKKyNlbmRpZgorCQlOVUxMKTsKKwkgICAgaWYgKG1lbnUtPmlkID09IChXaWRnZXQpMCkKKwkJcmV0dXJuOworCSAgICBndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnUtPmlkKTsKKwkgICAgZ3VpX2F0aGVuYV9tZW51X2ZvbnQobWVudS0+aWQpOworCisJICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgoY2hhciAqKW1lbnUtPmRuYW1lLAorCQlzaW1wbGVNZW51V2lkZ2V0Q2xhc3MsIG1lbnUtPmlkLAorCQlYdE5pbnNlcnRQb3NpdGlvbiwJYXRoZW5hX2NhbGN1bGF0ZV9pbnNfcG9zLAorCQlYdE50cmFuc2xhdGlvbnMsCXN1cGVybWVudVRyYW5zLAorCQlOVUxMKTsKKwkgICAgZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyhtZW51LT5zdWJtZW51X2lkKTsKKwkgICAgZ3VpX2F0aGVuYV9tZW51X2ZvbnQobWVudS0+c3VibWVudV9pZCk7CisKKwkgICAgLyogRG9uJ3QgdXBkYXRlIHRoZSBtZW51IGhlaWdodCB3aGVuIGl0IHdhcyBzZXQgYXQgYSBmaXhlZCB2YWx1ZSAqLworCSAgICBpZiAoIWd1aS5tZW51X2hlaWdodF9maXhlZCkKKwkgICAgeworCQkvKgorCQkgKiBXaGVuIHdlIGFkZCBhIHRvcC1sZXZlbCBpdGVtIHRvIHRoZSBtZW51IGJhciwgd2UgY2FuIGZpZ3VyZQorCQkgKiBvdXQgaG93IGhpZ2ggdGhlIG1lbnUgYmFyIHNob3VsZCBiZS4KKwkJICovCisJCVh0VmFHZXRWYWx1ZXMobWVudUJhciwKKwkJCVh0TnZTcGFjZSwJJnNwYWNlLAorCQkJWHROYm9yZGVyV2lkdGgsICZib3JkZXIsCisJCQlOVUxMKTsKKwkJWHRWYUdldFZhbHVlcyhtZW51LT5pZCwKKwkJCVh0TmhlaWdodCwJJmhlaWdodCwKKwkJCU5VTEwpOworCQlndWkubWVudV9oZWlnaHQgPSBoZWlnaHQgKyAyICogKHNwYWNlICsgYm9yZGVyKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZSBpZiAocGFyZW50LT5zdWJtZW51X2lkICE9IChXaWRnZXQpMCkKKyAgICB7CisJbWVudS0+aWQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgoY2hhciAqKW1lbnUtPmRuYW1lLAorCSAgICBzbWVCU0JPYmplY3RDbGFzcywgcGFyZW50LT5zdWJtZW51X2lkLAorCSAgICBYdE5sYWJlbCwgbWVudS0+ZG5hbWUsCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwkgICAgWHROaW50ZXJuYXRpb25hbCwJVHJ1ZSwKKyNlbmRpZgorCSAgICBOVUxMKTsKKwlpZiAobWVudS0+aWQgPT0gKFdpZGdldCkwKQorCSAgICByZXR1cm47CisJaWYgKHB1bGxlckJpdG1hcCA9PSBOb25lKQorCSAgICBwdWxsZXJCaXRtYXAgPSBndWlfYXRoZW5hX2NyZWF0ZV9wdWxscmlnaHRfcGl4bWFwKG1lbnUtPmlkKTsKKworCVh0VmFTZXRWYWx1ZXMobWVudS0+aWQsIFh0TnJpZ2h0Qml0bWFwLCBwdWxsZXJCaXRtYXAsCisJCQkJTlVMTCk7CisJLyogSWYgdGhlcmUgYXJlIG90aGVyIG1lbnUgaXRlbXMgdGhhdCBhcmUgbm90IHB1bGxkb3duIG1lbnVzLAorCSAqIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByaWdodCBtYXJnaW5zIG9mIHRob3NlLCB0b28uCisJICovCisJeworCSAgICBXaWRnZXRMaXN0CWNoaWxkcmVuOworCSAgICBDYXJkaW5hbAludW1fY2hpbGRyZW47CisJICAgIGludAkJaTsKKworCSAgICBYdFZhR2V0VmFsdWVzKHBhcmVudC0+c3VibWVudV9pZCwgWHROY2hpbGRyZW4sICZjaGlsZHJlbiwKKwkJCQkJICAgICAgWHRObnVtQ2hpbGRyZW4sICZudW1fY2hpbGRyZW4sCisJCQkJCSAgICAgIE5VTEwpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisJICAgIHsKKwkJWHRWYVNldFZhbHVlcyhjaGlsZHJlbltpXSwKKwkJCSAgICAgIFh0TnJpZ2h0TWFyZ2luLCBwdWxsZXJfd2lkdGgsCisJCQkgICAgICBOVUxMKTsKKwkgICAgfQorCX0KKwlndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnUtPmlkKTsKKwlndWlfYXRoZW5hX21lbnVfZm9udChtZW51LT5pZCk7CisKKwlwdWxscmlnaHRfbmFtZSA9IG1ha2VfcHVsbF9uYW1lKG1lbnUtPmRuYW1lKTsKKwltZW51LT5zdWJtZW51X2lkID0gWHRWYUNyZWF0ZVBvcHVwU2hlbGwoKGNoYXIgKilwdWxscmlnaHRfbmFtZSwKKwkgICAgc2ltcGxlTWVudVdpZGdldENsYXNzLCBwYXJlbnQtPnN1Ym1lbnVfaWQsCisJICAgIFh0TnRyYW5zbGF0aW9ucywgbWVudVRyYW5zLAorCSAgICBOVUxMKTsKKwlndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnUtPnN1Ym1lbnVfaWQpOworCWd1aV9hdGhlbmFfbWVudV9mb250KG1lbnUtPnN1Ym1lbnVfaWQpOworCXZpbV9mcmVlKHB1bGxyaWdodF9uYW1lKTsKKwlYdEFkZENhbGxiYWNrKG1lbnUtPnN1Ym1lbnVfaWQsIFh0TnBvcHVwQ2FsbGJhY2ssCisJCSAgICAgIGd1aV9hdGhlbmFfcG9wdXBfY2FsbGJhY2ssIChYdFBvaW50ZXIpbWVudSk7CisKKwlpZiAocGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKKwkgICAgWHRPdmVycmlkZVRyYW5zbGF0aW9ucyhwYXJlbnQtPnN1Ym1lbnVfaWQsIHBhcmVudFRyYW5zKTsKKyAgICB9CisgICAgYV9jdXJfbWVudSA9IE5VTEw7Cit9CisKKy8qIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBTaW1wbGVNZW51IGhhcyBwdWxsZG93biBlbnRyaWVzLgorICoKKyAqICJpZCIgaXMgdGhlIHBhcmVudCBvZiB0aGUgbWVudSBpdGVtcy4KKyAqIElnbm9yZSB3aWRnZXQgImlnbm9yZSIgaW4gdGhlIHBhbmUuCisgKi8KKyAgICBzdGF0aWMgQm9vbGVhbgorZ3VpX2F0aGVuYV9tZW51X2hhc19zdWJtZW51cyhpZCwgaWdub3JlKQorICAgIFdpZGdldAlpZDsKKyAgICBXaWRnZXQJaWdub3JlOworeworICAgIFdpZGdldExpc3QJY2hpbGRyZW47CisgICAgQ2FyZGluYWwJbnVtX2NoaWxkcmVuOworICAgIGludAkJaTsKKworICAgIFh0VmFHZXRWYWx1ZXMoaWQsIFh0TmNoaWxkcmVuLCAmY2hpbGRyZW4sCisJCSAgICAgIFh0Tm51bUNoaWxkcmVuLCAmbnVtX2NoaWxkcmVuLAorCQkgICAgICBOVUxMKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgeworCWlmIChjaGlsZHJlbltpXSA9PSBpZ25vcmUpCisJICAgIGNvbnRpbnVlOworCWlmIChoYXNfc3VibWVudShjaGlsZHJlbltpXSkpCisJICAgIHJldHVybiBUcnVlOworICAgIH0KKyAgICByZXR1cm4gRmFsc2U7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX2F0aGVuYV9tZW51X2ZvbnQoaWQpCisgICAgV2lkZ2V0CWlkOworeworI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisgICAgaWYgKGd1aS5tZW51X2ZvbnRzZXQgIT0gTk9GT05UU0VUKQorICAgIHsKKwlpZiAoWHRJc01hbmFnZWQoaWQpKQorCXsKKwkgICAgWHRVbm1hbmFnZUNoaWxkKGlkKTsKKwkgICAgWHRWYVNldFZhbHVlcyhpZCwgWHROZm9udFNldCwgZ3VpLm1lbnVfZm9udHNldCwgTlVMTCk7CisJICAgIC8qIFdlIHNob3VsZCBmb3JjZSB0aGUgd2lkZ2V0IHRvIHJlY2FsY3VsYXRlIGl0J3MKKwkgICAgICogZ2VvbWV0cnkgbm93LiAqLworCSAgICBYdE1hbmFnZUNoaWxkKGlkKTsKKwl9CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKGlkLCBYdE5mb250U2V0LCBndWkubWVudV9mb250c2V0LCBOVUxMKTsKKwlpZiAoaGFzX3N1Ym1lbnUoaWQpKQorCSAgICBYdFZhU2V0VmFsdWVzKGlkLCBYdE5yaWdodEJpdG1hcCwgcHVsbGVyQml0bWFwLCBOVUxMKTsKKyAgICB9CisjZWxzZQorICAgIGludAkJbWFuYWdlZCA9IEZBTFNFOworCisgICAgaWYgKGd1aS5tZW51X2ZvbnQgIT0gTk9GT05UKQorICAgIHsKKwlpZiAoWHRJc01hbmFnZWQoaWQpKQorCXsKKwkgICAgWHRVbm1hbmFnZUNoaWxkKGlkKTsKKwkgICAgbWFuYWdlZCA9IFRSVUU7CisJfQorCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlpZiAoZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUKQorCSAgICBYdFZhU2V0VmFsdWVzKGlkLCBYdE5mb250U2V0LCBndWkubWVudV9mb250LCBOVUxMKTsKKwllbHNlCisjIGVuZGlmCisJICAgIFh0VmFTZXRWYWx1ZXMoaWQsIFh0TmZvbnQsIGd1aS5tZW51X2ZvbnQsIE5VTEwpOworCWlmIChoYXNfc3VibWVudShpZCkpCisJICAgIFh0VmFTZXRWYWx1ZXMoaWQsIFh0TnJpZ2h0Qml0bWFwLCBwdWxsZXJCaXRtYXAsIE5VTEwpOworCisJLyogRm9yY2UgdGhlIHdpZGdldCB0byByZWNhbGN1bGF0ZSBpdCdzIGdlb21ldHJ5IG5vdy4gKi8KKwlpZiAobWFuYWdlZCkKKwkgICAgWHRNYW5hZ2VDaGlsZChpZCk7CisgICAgfQorI2VuZGlmCit9CisKKworICAgIHZvaWQKK2d1aV9tY2hfbmV3X21lbnVfZm9udCgpCit7CisgICAgUGl4bWFwIG9sZHB1bGxlciA9IE5vbmU7CisKKyAgICBpZiAobWVudUJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworCisgICAgaWYgKHB1bGxlckJpdG1hcCAhPSBOb25lKQorICAgIHsKKwlvbGRwdWxsZXIgPSBwdWxsZXJCaXRtYXA7CisJcHVsbGVyQml0bWFwID0gZ3VpX2F0aGVuYV9jcmVhdGVfcHVsbHJpZ2h0X3BpeG1hcChOVUxMKTsKKyAgICB9CisgICAgZ3VpX21jaF9zdWJtZW51X2NoYW5nZShyb290X21lbnUsIEZBTFNFKTsKKworICAgIHsKKwkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1lbnViYXIgbWVudSBpdGVtcyBhbmQgZ2V0IHRoZSBoZWlnaHQgb2YKKwkgKiBlYWNoIG9uZS4gIFRoZSBtZW51IGJhciBoZWlnaHQgaXMgc2V0IHRvIHRoZSBtYXhpbXVtIG9mIGFsbAorCSAqIHRoZSBoZWlnaHRzLgorCSAqLworCXZpbW1lbnVfVCAqbXA7CisJaW50IG1heF9oZWlnaHQgPSA5OTk5OworCisJZm9yIChtcCA9IHJvb3RfbWVudTsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkKKwl7CisJICAgIGlmIChtZW51X2lzX21lbnViYXIobXAtPmRuYW1lKSkKKwkgICAgeworCQlEaW1lbnNpb24gaGVpZ2h0OworCisJCVh0VmFHZXRWYWx1ZXMobXAtPmlkLAorCQkJWHROaGVpZ2h0LChYdEFyZ1ZhbCAqKSZoZWlnaHQsCisJCQlOVUxMKTsKKwkJaWYgKGhlaWdodCA8IG1heF9oZWlnaHQpCisJCSAgICBtYXhfaGVpZ2h0ID0gaGVpZ2h0OworCSAgICB9CisJfQorCWlmIChtYXhfaGVpZ2h0ICE9IDk5OTkpCisJeworCSAgICAvKiBEb24ndCB1cGRhdGUgdGhlIG1lbnUgaGVpZ2h0IHdoZW4gaXQgd2FzIHNldCBhdCBhIGZpeGVkIHZhbHVlICovCisJICAgIGlmICghZ3VpLm1lbnVfaGVpZ2h0X2ZpeGVkKQorCSAgICB7CisJCURpbWVuc2lvbiAgIHNwYWNlLCBib3JkZXI7CisKKwkJWHRWYUdldFZhbHVlcyhtZW51QmFyLAorCQkJWHROdlNwYWNlLAkmc3BhY2UsCisJCQlYdE5ib3JkZXJXaWR0aCwgJmJvcmRlciwKKwkJCU5VTEwpOworCQlndWkubWVudV9oZWlnaHQgPSBtYXhfaGVpZ2h0ICsgMiAqIChzcGFjZSArIGJvcmRlcik7CisJICAgIH0KKwl9CisgICAgfQorICAgIC8qIE5vdywgdG8gc2ltdWxhdGUgdGhlIHdpbmRvdyBiZWluZyByZXNpemVkLiAgT25seSwgdGhpcworICAgICAqIHdpbGwgcmVzaXplIHRoZSB3aW5kb3cgdG8gaXQncyBjdXJyZW50IHN0YXRlLgorICAgICAqCisgICAgICogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSwgYnV0IEkgZG8gbm90IHNlZSBvbmUgYXQgdGhpcyB0aW1lLgorICAgICAqIChEYXZpZCBIYXJyaXNvbikKKyAgICAgKi8KKyAgICB7CisJUG9zaXRpb24gdywgaDsKKworCVh0VmFHZXRWYWx1ZXModmltU2hlbGwsCisJCVh0TndpZHRoLCAmdywKKwkJWHROaGVpZ2h0LCAmaCwKKwkJTlVMTCk7CisJZ3VpX3Jlc2l6ZV9zaGVsbCh3LCBoCisjaWZkZWYgRkVBVF9YSU0KKwkJCQkJCS0geGltX2dldF9zdGF0dXNfYXJlYV9oZWlnaHQoKQorI2VuZGlmCisJCSAgICAgKTsKKyAgICB9CisgICAgZ3VpX3NldF9zaGVsbHNpemUoRkFMU0UsIFRSVUUpOworICAgIHVpX25ld19zaGVsbHNpemUoKTsKKyAgICBpZiAob2xkcHVsbGVyICE9IE5vbmUpCisJWEZyZWVQaXhtYXAoZ3VpLmRweSwgb2xkcHVsbGVyKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9CRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX25ld190b29sdGlwX2ZvbnQoKQoreworIyAgaWZkZWYgRkVBVF9UT09MQkFSCisgICAgdmltbWVudV9UICAgKm1lbnU7CisKKyAgICBpZiAodG9vbEJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworCisgICAgbWVudSA9IGd1aV9maW5kX21lbnUoKGNoYXJfdSAqKSJUb29sQmFyIik7CisgICAgaWYgKG1lbnUgIT0gTlVMTCkKKwlndWlfbWNoX3N1Ym1lbnVfY2hhbmdlKG1lbnUsIEZBTFNFKTsKKyMgIGVuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX25ld190b29sdGlwX2NvbG9ycygpCit7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIHZpbW1lbnVfVCAgICptZW51OworCisgICAgaWYgKHRvb2xCYXIgPT0gKFdpZGdldCkwKQorCXJldHVybjsKKworICAgIG1lbnUgPSBndWlfZmluZF9tZW51KChjaGFyX3UgKikiVG9vbEJhciIpOworICAgIGlmIChtZW51ICE9IE5VTEwpCisJZ3VpX21jaF9zdWJtZW51X2NoYW5nZShtZW51LCBUUlVFKTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQKK2d1aV9tY2hfc3VibWVudV9jaGFuZ2UobWVudSwgY29sb3JzKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCWNvbG9yczsJCS8qIFRSVUUgZm9yIGNvbG9ycywgRkFMU0UgZm9yIGZvbnQgKi8KK3sKKyAgICB2aW1tZW51X1QJKm1wOworCisgICAgZm9yIChtcCA9IG1lbnU7IG1wICE9IE5VTEw7IG1wID0gbXAtPm5leHQpCisgICAgeworCWlmIChtcC0+aWQgIT0gKFdpZGdldCkwKQorCXsKKwkgICAgaWYgKGNvbG9ycykKKwkgICAgeworCQlndWlfYXRoZW5hX21lbnVfY29sb3JzKG1wLT5pZCk7CisjaWZkZWYgRkVBVF9UT09MQkFSCisJCS8qIEZvciBhIHRvb2xiYXIgaXRlbTogRnJlZSB0aGUgcGl4bWFwIGFuZCBhbGxvY2F0ZSBhIG5ldyBvbmUsCisJCSAqIHNvIHRoYXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXMgcmlnaHQuICovCisJCWlmIChtcC0+aW1hZ2UgIT0gKFBpeG1hcCkwKQorCQl7CisJCSAgICBYRnJlZVBpeG1hcChndWkuZHB5LCBtcC0+aW1hZ2UpOworCQkgICAgZ2V0X3Rvb2xiYXJfcGl4bWFwKG1wLCAmbXAtPmltYWdlLCBOVUxMKTsKKwkJICAgIGlmIChtcC0+aW1hZ2UgIT0gKFBpeG1hcCkwKQorCQkJWHRWYVNldFZhbHVlcyhtcC0+aWQsIFh0TmJpdG1hcCwgbXAtPmltYWdlLCBOVUxMKTsKKwkJfQorCisjIGlmZGVmIEZFQVRfQkVWQUwKKwkJLyogSWYgd2UgaGF2ZSBhIHRvb2x0aXAsIHRoZW4gd2UgbmVlZCB0byBjaGFuZ2UgaXQncyBjb2xvcnMgKi8KKwkJaWYgKG1wLT50aXAgIT0gTlVMTCkKKwkJeworCQkgICAgQXJnIGFyZ3NbMl07CisKKwkJICAgIGFyZ3NbMF0ubmFtZSA9IFh0TmJhY2tncm91bmQ7CisJCSAgICBhcmdzWzBdLnZhbHVlID0gZ3VpLnRvb2x0aXBfYmdfcGl4ZWw7CisJCSAgICBhcmdzWzFdLm5hbWUgPSBYdE5mb3JlZ3JvdW5kOworCQkgICAgYXJnc1sxXS52YWx1ZSA9IGd1aS50b29sdGlwX2ZnX3BpeGVsOworCQkgICAgWHRTZXRWYWx1ZXMobXAtPnRpcC0+YmFsbG9vbkxhYmVsLCAmYXJnc1swXSwgWHROdW1iZXIoYXJncykpOworCQl9CisjIGVuZGlmCisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZ3VpX2F0aGVuYV9tZW51X2ZvbnQobXAtPmlkKTsKKyNpZmRlZiBGRUFUX0JFVkFMCisJCS8qIElmIHdlIGhhdmUgYSB0b29sdGlwLCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIGl0J3MgZm9udCAqLworCQkvKiBBc3N1bWUgWHROaW50ZXJuYXRpb25hbCA9PSBUcnVlIChpbiBjcmVhdGVCYWxsb29uRXZhbFdpbmRvdykKKwkJICovCisJCWlmIChtcC0+dGlwICE9IE5VTEwpCisJCXsKKwkJICAgIEFyZyBhcmdzWzFdOworCisJCSAgICBhcmdzWzBdLm5hbWUgPSBYdE5mb250U2V0OworCQkgICAgYXJnc1swXS52YWx1ZSA9IChYdEFyZ1ZhbClndWkudG9vbHRpcF9mb250c2V0OworCQkgICAgWHRTZXRWYWx1ZXMobXAtPnRpcC0+YmFsbG9vbkxhYmVsLCAmYXJnc1swXSwgWHROdW1iZXIoYXJncykpOworCQl9CisjZW5kaWYKKwkgICAgfQorCX0KKworCWlmIChtcC0+Y2hpbGRyZW4gIT0gTlVMTCkKKwl7CisJICAgIC8qIFNldCB0aGUgY29sb3JzL2ZvbnQgZm9yIHRoZSB0ZWFyIG9mZiB3aWRnZXQgKi8KKwkgICAgaWYgKG1wLT5zdWJtZW51X2lkICE9IChXaWRnZXQpMCkKKwkgICAgeworCQlpZiAoY29sb3JzKQorCQkgICAgZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyhtcC0+c3VibWVudV9pZCk7CisJCWVsc2UKKwkJICAgIGd1aV9hdGhlbmFfbWVudV9mb250KG1wLT5zdWJtZW51X2lkKTsKKwkgICAgfQorCSAgICAvKiBTZXQgdGhlIGNvbG9ycyBmb3IgdGhlIGNoaWxkcmVuICovCisJICAgIGd1aV9tY2hfc3VibWVudV9jaGFuZ2UobXAtPmNoaWxkcmVuLCBjb2xvcnMpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBNYWtlIGEgc3VibWVudSBuYW1lIGludG8gYSBwdWxscmlnaHQgbmFtZS4KKyAqIFJlcGxhY2UgJy4nIGJ5ICdfJywgY2FuJ3QgaW5jbHVkZSAnLicgaW4gdGhlIHN1Ym1lbnUgbmFtZS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorbWFrZV9wdWxsX25hbWUobmFtZSkKKyAgICBjaGFyX3UgKiBuYW1lOworeworICAgIGNoYXJfdSAgKnBuYW1lOworICAgIGNoYXJfdSAgKnA7CisKKyAgICBwbmFtZSA9IHZpbV9zdHJuc2F2ZShuYW1lLCBTVFJMRU4obmFtZSkgKyBzdHJsZW4oIi1wdWxscmlnaHQiKSk7CisgICAgaWYgKHBuYW1lICE9IE5VTEwpCisgICAgeworCXN0cmNhdCgoY2hhciAqKXBuYW1lLCAiLXB1bGxyaWdodCIpOworCXdoaWxlICgocCA9IHZpbV9zdHJjaHIocG5hbWUsICcuJykpICE9IE5VTEwpCisJICAgICpwID0gJ18nOworICAgIH0KKyAgICByZXR1cm4gcG5hbWU7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudV9pdGVtKG1lbnUsIGlkeCkKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQlpZHg7Cit7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisKKyAgICBhX2N1cl9tZW51ID0gbWVudTsKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisgICAgaWYgKG1lbnVfaXNfdG9vbGJhcihwYXJlbnQtPm5hbWUpKQorICAgIHsKKwlXaWRnZXRDbGFzcwl0eXBlOworCWludAkJbjsKKwlBcmcJCWFyZ3NbMjFdOworCisJbiA9IDA7CisJaWYgKG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpKQorCXsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWHRObGFiZWwsICIiKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYdE5ib3JkZXJXaWR0aCwgMCk7IG4rKzsKKwl9CisJZWxzZQorCXsKKwkgICAgZ2V0X3Rvb2xiYXJfcGl4bWFwKG1lbnUsICZtZW51LT5pbWFnZSwgTlVMTCk7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmxhYmVsLCBtZW51LT5kbmFtZSk7IG4rKzsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWHROaW50ZXJuYWxIZWlnaHQsIDEpOyBuKys7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmludGVybmFsV2lkdGgsIDEpOyBuKys7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmJvcmRlcldpZHRoLCAxKTsgbisrOworCSAgICBpZiAobWVudS0+aW1hZ2UgIT0gMCkKKwkJWHRTZXRBcmcoYXJnc1tuXSwgWHROYml0bWFwLCBtZW51LT5pbWFnZSk7IG4rKzsKKwl9CisJWHRTZXRBcmcoYXJnc1tuXSwgWHROaGlnaGxpZ2h0VGhpY2tuZXNzLCAwKTsgbisrOworCXR5cGUgPSBjb21tYW5kV2lkZ2V0Q2xhc3M7CisJLyogVE9ETzogZmlndXJlIG91dCB0aGUgcG9zaXRpb24gaW4gdGhlIHRvb2xiYXI/CisJICogICAgICAgVGhpcyBjdXJyZW50bHkgd29ya3MgZmluZSBmb3IgdGhlIGRlZmF1bHQgdG9vbGJhciwgYnV0CisJICogICAgICAgd2hhdCBpZiB3ZSBhZGQvcmVtb3ZlIGl0ZW1zIGR1cmluZyBsYXRlciBydW50aW1lPworCSAqLworCisJLyogTk9URTogImlkeCIgaXNuJ3QgdXNlZCBoZXJlLiAgVGhlIHBvc2l0aW9uIGlzIGNhbGN1bGF0ZWQgYnkKKwkgKiAgICAgICBhdGhlbmFfY2FsY3VsYXRlX2luc19wb3MoKS4gIFRoZSBwb3NpdGlvbiBpdCBjYWxjdWxhdGVzCisJICogICAgICAgc2hvdWxkIGJlIGVxdWFsIHRvICJpZHgiLgorCSAqLworCS8qIFRPRE86IENvdWxkIHdlIGp1c3Qgc3RvcmUgImlkeCIgYW5kIHVzZSB0aGF0IGFzIHRoZSBjaGlsZAorCSAqIHBsYWNlbWVudD8KKwkgKi8KKworCWlmIChtZW51LT5pZCA9PSBOVUxMKQorCXsKKwkgICAgbWVudS0+aWQgPSBYdENyZWF0ZU1hbmFnZWRXaWRnZXQoKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJCXR5cGUsIHRvb2xCYXIsIGFyZ3MsIG4pOworCSAgICBYdEFkZENhbGxiYWNrKG1lbnUtPmlkLAorCQkgICAgWHROY2FsbGJhY2ssIGd1aV94MTFfbWVudV9jYiwgbWVudSk7CisJfQorCWVsc2UKKwkgICAgWHRTZXRWYWx1ZXMobWVudS0+aWQsIGFyZ3MsIG4pOworCWd1aV9hdGhlbmFfbWVudV9jb2xvcnMobWVudS0+aWQpOworCisjaWZkZWYgRkVBVF9CRVZBTAorCWd1aV9tY2hfbWVudV9zZXRfdGlwKG1lbnUpOworI2VuZGlmCisKKwltZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisJbWVudS0+c3VibWVudV9pZCA9IE5VTEw7CisJaWYgKCFYdElzTWFuYWdlZCh0b29sQmFyKQorCQkgICAgJiYgdmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKQorCSAgICBndWlfbWNoX3Nob3dfdG9vbGJhcihUUlVFKTsKKwlndWkudG9vbGJhcl9oZWlnaHQgPSBndWlfbWNoX2NvbXB1dGVfdG9vbGJhcl9oZWlnaHQoKTsKKwlyZXR1cm47CisgICAgfSAvKiB0b29sYmFyIG1lbnUgaXRlbSAqLworIyBlbmRpZgorCisgICAgLyogQWRkIG1lbnUgc2VwYXJhdG9yICovCisgICAgaWYgKG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpKQorICAgIHsKKwltZW51LT5zdWJtZW51X2lkID0gKFdpZGdldCkwOworCW1lbnUtPmlkID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJc21lTGluZU9iamVjdENsYXNzLCBwYXJlbnQtPnN1Ym1lbnVfaWQsCisJCU5VTEwpOworCWlmIChtZW51LT5pZCA9PSAoV2lkZ2V0KTApCisJICAgIHJldHVybjsKKwlndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnUtPmlkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAocGFyZW50ICE9IE5VTEwgJiYgcGFyZW50LT5zdWJtZW51X2lkICE9IChXaWRnZXQpMCkKKwl7CisJICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSAoV2lkZ2V0KTA7CisJICAgIG1lbnUtPmlkID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJICAgIHNtZUJTQk9iamVjdENsYXNzLCBwYXJlbnQtPnN1Ym1lbnVfaWQsCisJCSAgICBYdE5sYWJlbCwgbWVudS0+ZG5hbWUsCisjaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwkJICAgIFh0TmludGVybmF0aW9uYWwsCVRydWUsCisjZW5kaWYKKwkJICAgIE5VTEwpOworCSAgICBpZiAobWVudS0+aWQgPT0gKFdpZGdldCkwKQorCQlyZXR1cm47CisKKwkgICAgLyogSWYgdGhlcmUgYXJlIG90aGVyICJwdWxsZG93biIgaXRlbXMgaW4gdGhpcyBwYW5lLCB0aGVuIGFkanVzdAorCSAgICAgKiB0aGUgcmlnaHQgbWFyZ2luIHRvIGFjY29tb2RhdGUgdGhlIGFycm93IHBpeG1hcCwgb3RoZXJ3aXNlCisJICAgICAqIHRoZSByaWdodCBtYXJnaW4gd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgbGVmdCBtYXJnaW4uCisJICAgICAqLworCSAgICB7CisJCURpbWVuc2lvbiAgIGxlZnRfbWFyZ2luOworCisJCVh0VmFHZXRWYWx1ZXMobWVudS0+aWQsIFh0TmxlZnRNYXJnaW4sICZsZWZ0X21hcmdpbiwgTlVMTCk7CisJCVh0VmFTZXRWYWx1ZXMobWVudS0+aWQsIFh0TnJpZ2h0TWFyZ2luLAorCQkJZ3VpX2F0aGVuYV9tZW51X2hhc19zdWJtZW51cyhwYXJlbnQtPnN1Ym1lbnVfaWQsIE5VTEwpID8KKwkJCSAgICBwdWxsZXJfd2lkdGggOgorCQkJICAgIGxlZnRfbWFyZ2luLAorCQkJTlVMTCk7CisJICAgIH0KKworCSAgICBndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnUtPmlkKTsKKwkgICAgZ3VpX2F0aGVuYV9tZW51X2ZvbnQobWVudS0+aWQpOworCSAgICBYdEFkZENhbGxiYWNrKG1lbnUtPmlkLCBYdE5jYWxsYmFjaywgZ3VpX3gxMV9tZW51X2NiLAorCQkgICAgKFh0UG9pbnRlciltZW51KTsKKwl9CisgICAgfQorICAgIGFfY3VyX21lbnUgPSBOVUxMOworfQorCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9zaG93X3Rvb2xiYXIoaW50IHNob3dpdCkKK3sKKyAgICBDYXJkaW5hbAludW1DaGlsZHJlbjsJICAgIC8qIGhvdyBtYW55IGNoaWxkcmVuIHRvb2xCYXIgaGFzICovCisKKyAgICBpZiAodG9vbEJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwgWHRObnVtQ2hpbGRyZW4sICZudW1DaGlsZHJlbiwgTlVMTCk7CisgICAgaWYgKHNob3dpdCAmJiBudW1DaGlsZHJlbiA+IDApCisgICAgeworCS8qIEFzc3VtZSB0aGF0IHdlIHdhbnQgdG8gc2hvdyB0aGUgdG9vbGJhciBpZiBwX3Rvb2xiYXIgY29udGFpbnMgdmFsaWQKKwkgKiBvcHRpb24gc2V0dGluZ3MsIHRoZXJlZm9yZSBwX3Rvb2xiYXIgbXVzdCBub3QgYmUgTlVMTC4KKwkgKi8KKwlXaWRnZXRMaXN0ICBjaGlsZHJlbjsKKworCVh0VmFHZXRWYWx1ZXModG9vbEJhciwgWHROY2hpbGRyZW4sICZjaGlsZHJlbiwgTlVMTCk7CisJeworCSAgICB2b2lkICAgICgqYWN0aW9uKShCYWxsb29uRXZhbCAqKTsKKwkgICAgaW50CSAgICB0ZXh0ID0gMDsKKworCSAgICBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAidG9vbHRpcHMiKSkKKwkJYWN0aW9uID0gJmd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWE7CisJICAgIGVsc2UKKwkJYWN0aW9uID0gJmd1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhOworCSAgICBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAidGV4dCIpKQorCQl0ZXh0ID0gMTsKKwkgICAgZWxzZSBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAiaWNvbnMiKSkKKwkJdGV4dCA9IC0xOworCSAgICBpZiAodGV4dCAhPSAwKQorCSAgICB7CisJCXZpbW1lbnVfVCAgICp0b29sYmFyOworCQl2aW1tZW51X1QgICAqY3VyOworCisJCWZvciAodG9vbGJhciA9IHJvb3RfbWVudTsgdG9vbGJhcjsgdG9vbGJhciA9IHRvb2xiYXItPm5leHQpCisJCSAgICBpZiAobWVudV9pc190b29sYmFyKHRvb2xiYXItPmRuYW1lKSkKKwkJCWJyZWFrOworCQkvKiBBc3N1bXB0aW9uOiB0b29sYmFyIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gdG9vbGJhciwKKwkJICoJICAgICAgIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgdG9vbGJhciBtZW51IHN0cnVjdHVyZS4KKwkJICoKKwkJICogQXNzdW1wdGlvbjogIm51bUNoaWxkcmVuIiA9PSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0CisJCSAqCSAgICAgICBvZiBpdGVtcyBiZWdpbm5pbmcgd2l0aCB0b29sYmFyLT5jaGlsZHJlbi4KKwkJICovCisJCWlmICh0b29sYmFyKQorCQl7CisJCSAgICBmb3IgKGN1ciA9IHRvb2xiYXItPmNoaWxkcmVuOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKwkJICAgIHsKKwkJCUFyZwkgICAgYXJnc1syXTsKKwkJCWludAkgICAgbiA9IDA7CisKKwkJCS8qIEVuYWJsZS9EaXNhYmxlIHRvb2x0aXAgKE9LIHRvIGVuYWJsZSB3aGlsZSBjdXJyZW50bHkKKwkJCSAqIGVuYWJsZWQpCisJCQkgKi8KKwkJCWlmIChjdXItPnRpcCAhPSBOVUxMKQorCQkJICAgICgqYWN0aW9uKShjdXItPnRpcCk7CisJCQlpZiAodGV4dCA9PSAxKQorCQkJeworCQkJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmJpdG1hcCwgTm9uZSk7CisJCQkgICAgbisrOworCQkJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmxhYmVsLAorCQkJCSAgICBtZW51X2lzX3NlcGFyYXRvcihjdXItPm5hbWUpID8gIiIgOgorCQkJCQkoY2hhciAqKWN1ci0+ZG5hbWUpOworCQkJICAgIG4rKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBYdFNldEFyZyhhcmdzW25dLCBYdE5iaXRtYXAsIGN1ci0+aW1hZ2UpOworCQkJICAgIG4rKzsKKwkJCSAgICBYdFNldEFyZyhhcmdzW25dLCBYdE5sYWJlbCwgKGN1ci0+aW1hZ2UgPT0gTm9uZSkgPworCQkJCSAgICBtZW51X2lzX3NlcGFyYXRvcihjdXItPm5hbWUpID8KKwkJCQkJIiIgOgorCQkJCQkoY2hhciAqKWN1ci0+ZG5hbWUKKwkJCQkgICAgOgorCQkJCSAgICAoY2hhciAqKU5vbmUpOworCQkJICAgIG4rKzsKKwkJCX0KKwkJCWlmIChjdXItPmlkICE9IE5VTEwpCisJCQl7CisJCQkgICAgWHRVbm1hbmFnZUNoaWxkKGN1ci0+aWQpOworCQkJICAgIFh0U2V0VmFsdWVzKGN1ci0+aWQsIGFyZ3MsIG4pOworCQkJICAgIFh0TWFuYWdlQ2hpbGQoY3VyLT5pZCk7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlndWkudG9vbGJhcl9oZWlnaHQgPSBndWlfbWNoX2NvbXB1dGVfdG9vbGJhcl9oZWlnaHQoKTsKKwlYdE1hbmFnZUNoaWxkKHRvb2xCYXIpOworCWlmIChYdElzTWFuYWdlZChtZW51QmFyKSkKKwl7CisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWEsCisJCSAgICBYdE52ZXJ0RGlzdGFuY2UsICAgIGd1aS50b29sYmFyX2hlaWdodCArIGd1aS5tZW51X2hlaWdodCwKKwkJICAgIE5VTEwpOworCSAgICBYdFZhU2V0VmFsdWVzKHRvb2xCYXIsCisJCSAgICBYdE52ZXJ0RGlzdGFuY2UsICAgIGd1aS5tZW51X2hlaWdodCwKKwkJICAgIE5VTEwpOworCX0KKwllbHNlCisJeworCSAgICBYdFZhU2V0VmFsdWVzKHRleHRBcmVhLAorCQkgICAgWHROdmVydERpc3RhbmNlLCAgICBndWkudG9vbGJhcl9oZWlnaHQsCisJCSAgICBOVUxMKTsKKwkgICAgWHRWYVNldFZhbHVlcyh0b29sQmFyLAorCQkgICAgWHROdmVydERpc3RhbmNlLCAgICAwLAorCQkgICAgTlVMTCk7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWd1aS50b29sYmFyX2hlaWdodCA9IDA7CisJaWYgKFh0SXNNYW5hZ2VkKG1lbnVCYXIpKQorCSAgICBYdFZhU2V0VmFsdWVzKHRleHRBcmVhLAorCQlYdE52ZXJ0RGlzdGFuY2UsICAgIGd1aS5tZW51X2hlaWdodCwKKwkJTlVMTCk7CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKHRleHRBcmVhLAorCQlYdE52ZXJ0RGlzdGFuY2UsICAgIDAsCisJCU5VTEwpOworCisJWHRVbm1hbmFnZUNoaWxkKHRvb2xCYXIpOworICAgIH0KKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgRkFMU0UpOworfQorCisKKyAgICBpbnQKK2d1aV9tY2hfY29tcHV0ZV90b29sYmFyX2hlaWdodCgpCit7CisgICAgRGltZW5zaW9uCWhlaWdodDsJCSAgICAvKiB0b3RhbCBUb29sYmFyIGhlaWdodCAqLworICAgIERpbWVuc2lvbgl3aGd0OwkJICAgIC8qIGhlaWdodCBvZiBlYWNoIHdpZGdldCAqLworICAgIERpbWVuc2lvbgltYXJnaW5IZWlnaHQ7CSAgICAvKiBYbU5tYXJnaW5IZWlnaHQgb2YgdG9vbEJhciAqLworICAgIERpbWVuc2lvbglzaGFkb3dUaGlja25lc3M7ICAgIC8qIHRoaWNrbmVzcyBvZiBYdHBhcmVudCh0b29sQmFyKSAqLworICAgIFdpZGdldExpc3QJY2hpbGRyZW47CSAgICAvKiBsaXN0IG9mIHRvb2xCYXIncyBjaGlsZHJlbiAqLworICAgIENhcmRpbmFsCW51bUNoaWxkcmVuOwkgICAgLyogaG93IG1hbnkgY2hpbGRyZW4gdG9vbEJhciBoYXMgKi8KKyAgICBpbnQJCWk7CisKKyAgICBoZWlnaHQgPSAwOworICAgIHNoYWRvd1RoaWNrbmVzcyA9IDA7CisgICAgbWFyZ2luSGVpZ2h0ID0gMDsKKyAgICBpZiAodG9vbEJhciAhPSAoV2lkZ2V0KTApCisgICAgeworCVh0VmFHZXRWYWx1ZXModG9vbEJhciwKKwkJWHROYm9yZGVyV2lkdGgsCSAgICAmc2hhZG93VGhpY2tuZXNzLAorCQlYdE52U3BhY2UsCSAgICAmbWFyZ2luSGVpZ2h0LAorCQlYdE5jaGlsZHJlbiwJICAgICZjaGlsZHJlbiwKKwkJWHRObnVtQ2hpbGRyZW4sCSAgICAmbnVtQ2hpbGRyZW4sCisJCU5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKQorCXsKKwkgICAgd2hndCA9IDA7CisKKwkgICAgWHRWYUdldFZhbHVlcyhjaGlsZHJlbltpXSwgWHROaGVpZ2h0LCAmd2hndCwgTlVMTCk7CisJICAgIGlmIChoZWlnaHQgPCB3aGd0KQorCQloZWlnaHQgPSB3aGd0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gKGludCkoaGVpZ2h0ICsgKG1hcmdpbkhlaWdodCA8PCAxKSArIChzaGFkb3dUaGlja25lc3MgPDwgMSkpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9nZXRfdG9vbGJhcl9jb2xvcnMoYmdwLCBmZ3AsIGJzcCwgdHNwLCBoc3ApCisgICAgUGl4ZWwJKmJncDsKKyAgICBQaXhlbAkqZmdwOworICAgIFBpeGVsICAgICAgICpic3A7CisgICAgUGl4ZWwJKnRzcDsKKyAgICBQaXhlbAkqaHNwOworeworICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwgWHROYmFja2dyb3VuZCwgYmdwLCBYdE5ib3JkZXJDb2xvciwgZmdwLCBOVUxMKTsKKyAgICAqYnNwID0gKmJncDsKKyAgICAqdHNwID0gKmZncDsKKyAgICAqaHNwID0gKnRzcDsKK30KKyNlbmRpZgorCisKKy8qIEFSR1NVU0VEICovCisgICAgdm9pZAorZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMoZW5hYmxlKQorICAgIGludAkJZW5hYmxlOworeworICAgIC8qIG5vIHRlYXJvZmYgbWVudXMgKi8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfbmV3X21lbnVfY29sb3JzKCkKK3sKKyAgICBpZiAobWVudUJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworICAgIGlmIChndWkubWVudV9mZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCVh0VmFTZXRWYWx1ZXMobWVudUJhciwgWHROYm9yZGVyQ29sb3IsCWd1aS5tZW51X2ZnX3BpeGVsLCBOVUxMKTsKKyAgICBndWlfYXRoZW5hX21lbnVfY29sb3JzKG1lbnVCYXIpOworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIGd1aV9hdGhlbmFfbWVudV9jb2xvcnModG9vbEJhcik7CisjZW5kaWYKKworICAgIGd1aV9tY2hfc3VibWVudV9jaGFuZ2Uocm9vdF9tZW51LCBUUlVFKTsKK30KKworLyoKKyAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KQorICAgIHZpbW1lbnVfVCAqbWVudTsKK3sKKyAgICBXaWRnZXQJcGFyZW50OworCisgICAgLyogVGhlcmUgaXMgbm8gaXRlbSBmb3IgdGhlIHRvb2xiYXIuICovCisgICAgaWYgKG1lbnUtPmlkID09IChXaWRnZXQpMCkKKwlyZXR1cm47CisKKyAgICBwYXJlbnQgPSBYdFBhcmVudChtZW51LT5pZCk7CisKKyAgICAvKiBXaGVuIHJlbW92aW5nIHRoZSBsYXN0ICJwdWxsZG93biIgbWVudSBpdGVtIGZyb20gYSBwYW5lLCBhZGp1c3QgdGhlCisgICAgICogcmlnaHQgbWFyZ2lucyBvZiB0aGUgcmVtYWluaW5nIHdpZGdldHMuCisgICAgICovCisgICAgaWYgKG1lbnUtPnN1Ym1lbnVfaWQgIT0gKFdpZGdldCkwKQorICAgIHsKKwkvKiBHbyB0aHJvdWdoIHRoZSBtZW51IGl0ZW1zIGluIHRoZSBwYXJlbnQgb2YgdGhpcyBpdGVtIGFuZAorCSAqIGFkanVzdCB0aGVpciBtYXJnaW5zLCBpZiBuZWNlc3NhcnkuCisJICogVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZW4gd2UgZGVsZXRlIHRoZSBsYXN0IG1lbnUgaXRlbSBpbiBhCisJICogcGFuZSB0aGF0IGhhcyBhIHN1Ym1lbnUuICBJbiB0aGlzIGNhc2UsIHRoZXJlIHdpbGwgYmUgbm8gYXJyb3cKKwkgKiBwaXhtYXBzIHNob3duIGFueW1vcmUuCisJICovCisJeworCSAgICBXaWRnZXRMaXN0ICBjaGlsZHJlbjsKKwkgICAgQ2FyZGluYWwgICAgbnVtX2NoaWxkcmVuOworCSAgICBpbnQJCWk7CisJICAgIERpbWVuc2lvbglyaWdodF9tYXJnaW4gPSAwOworCSAgICBCb29sZWFuCWdldF9sZWZ0X21hcmdpbiA9IEZhbHNlOworCisJICAgIFh0VmFHZXRWYWx1ZXMocGFyZW50LCBYdE5jaGlsZHJlbiwgJmNoaWxkcmVuLAorCQkJCSAgWHRObnVtQ2hpbGRyZW4sICZudW1fY2hpbGRyZW4sCisJCQkJICBOVUxMKTsKKwkgICAgaWYgKGd1aV9hdGhlbmFfbWVudV9oYXNfc3VibWVudXMocGFyZW50LCBtZW51LT5pZCkpCisJCXJpZ2h0X21hcmdpbiA9IHB1bGxlcl93aWR0aDsKKwkgICAgZWxzZQorCQlnZXRfbGVmdF9tYXJnaW4gPSBUcnVlOworCisJICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2hpbGRyZW47ICsraSkKKwkgICAgeworCQlpZiAoY2hpbGRyZW5baV0gPT0gbWVudS0+aWQpCisJCSAgICBjb250aW51ZTsKKwkJaWYgKGdldF9sZWZ0X21hcmdpbiA9PSBUcnVlKQorCQl7CisJCSAgICBEaW1lbnNpb24gbGVmdF9tYXJnaW47CisKKwkJICAgIFh0VmFHZXRWYWx1ZXMoY2hpbGRyZW5baV0sIFh0TmxlZnRNYXJnaW4sICZsZWZ0X21hcmdpbiwKKwkJCQkgIE5VTEwpOworCQkgICAgWHRWYVNldFZhbHVlcyhjaGlsZHJlbltpXSwgWHROcmlnaHRNYXJnaW4sIGxlZnRfbWFyZ2luLAorCQkJCSAgTlVMTCk7CisJCX0KKwkJZWxzZQorCQkgICAgWHRWYVNldFZhbHVlcyhjaGlsZHJlbltpXSwgWHROcmlnaHRNYXJnaW4sIHJpZ2h0X21hcmdpbiwKKwkJCQkgIE5VTEwpOworCSAgICB9CisJfQorICAgIH0KKyAgICAvKiBQbGVhc2UgYmUgc3VyZSB0byBkZXN0cm95IHRoZSBwYXJlbnQgd2lkZ2V0IGZpcnN0IChpLmUuIG1lbnUtPmlkKS4KKyAgICAgKgorICAgICAqIFRoaXMgY29kZSBzaG91bGQgYmUgYmFzaWNhbGx5IGlkZW50aWNhbCB0byB0aGF0IGluIHRoZSBmaWxlIGd1aV9tb3RpZi5jCisgICAgICogYmVjYXVzZSB0aGV5IGFyZSBib3RoIFh0IGJhc2VkLgorICAgICAqLworICAgIGlmIChtZW51LT5pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCUNhcmRpbmFsICAgIG51bV9jaGlsZHJlbjsKKwlEaW1lbnNpb24gICBoZWlnaHQsIHNwYWNlLCBib3JkZXI7CisKKwlYdFZhR2V0VmFsdWVzKG1lbnVCYXIsCisJCVh0TnZTcGFjZSwJJnNwYWNlLAorCQlYdE5ib3JkZXJXaWR0aCwgJmJvcmRlciwKKwkJTlVMTCk7CisJWHRWYUdldFZhbHVlcyhtZW51LT5pZCwKKwkJWHROaGVpZ2h0LAkmaGVpZ2h0LAorCQlOVUxMKTsKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCWlmIChwYXJlbnQgPT0gdG9vbEJhciAmJiBtZW51LT50aXAgIT0gTlVMTCkKKwl7CisJICAgIC8qIFdlIHRyeSB0byBkZXN0cm95IHRoaXMgYmVmb3JlIHRoZSBhY3R1YWwgbWVudSwgYmVjYXVzZSB0aGVyZSBhcmUKKwkgICAgICogY2FsbGJhY2tzLCBldGMuIHRoYXQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQgZHVyaW5nIHRoZSB0b29sdGlwCisJICAgICAqIGRlc3RydWN0aW9uLgorCSAgICAgKgorCSAgICAgKiBJZiB5b3UgY2FsbCAiZ3VpX21jaF9kZXN0cm95X2JldmFsX2FyZWEoKSIgYWZ0ZXIgZGVzdHJveWluZworCSAgICAgKiBtZW51LT5pZCwgdGhlbiB0aGUgdG9vbHRpcCdzIHdpbmRvdyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCisJICAgICAqIGRlYWxsb2NhdGVkIGJ5IFh0LCBhbmQgdW5rbm93biBiZWhhdmlvdXIgd2lsbCBlbnN1ZSAocHJvYmFibHkKKwkgICAgICogYSBjb3JlIGR1bXApLgorCSAgICAgKi8KKwkgICAgZ3VpX21jaF9kZXN0cm95X2JldmFsX2FyZWEobWVudS0+dGlwKTsKKwkgICAgbWVudS0+dGlwID0gTlVMTDsKKwl9CisjZW5kaWYKKwkvKgorCSAqIFRoaXMgaXMgYSBoYWNrIHRvIHN0b3AgdGhlIEF0aGVuYSBzaW1wbGVNZW51V2lkZ2V0IGZyb20gZ2V0dGluZyBhCisJICogQmFkVmFsdWUgZXJyb3Igd2hlbiBhIG1lbnUncyBsYXN0IGNoaWxkIGlzIGRlc3Ryb3llZC4gV2UgY2hlY2sgdG8KKwkgKiBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBjaGlsZCBhbmQgaWYgc28sIGRvbid0IGRlbGV0ZSBpdC4gVGhlIHBhcmVudAorCSAqIHdpbGwgYmUgZGVsZXRlZCBzb29uIGFueXdheSwgYW5kIGl0IHdpbGwgZGVsZXRlIGl0J3MgY2hpbGRyZW4gbGlrZQorCSAqIGFsbCBnb29kIHdpZGdldHMgZG8uCisJICovCisJLyogTk9URTogVGhlIGNhdXNlIG9mIHRoZSBCYWRWYWx1ZSBYIFByb3RvY29sIEVycm9yIGlzIGJlY2F1c2Ugd2hlbiB0aGUKKwkgKiBsYXN0IGNoaWxkIGlzIGRlc3Ryb3llZCwgaXQgaXMgZmlyc3QgdW5tYW5hZ2VkLCB0aHVzIGNhdXNpbmcgYQorCSAqIGdlb21ldHJ5IHJlc2l6ZSByZXF1ZXN0IGZyb20gdGhlIHBhcmVudCBTaGVsbCB3aWRnZXQuCisJICogU2luY2UgdGhlIFNoZWxsIHdpZGdldCBoYXMgbm8gbW9yZSBjaGlsZHJlbiwgaXQgaXMgcmVzaXplZCB0byBoYXZlCisJICogd2lkdGgvaGVpZ2h0IG9mIDAuICBYQ29uZmlndXJlV2luZG93KCkgaXMgdGhlbiBjYWxsZWQgd2l0aCB0aGUKKwkgKiB3aWR0aC9oZWlnaHQgb2YgMCwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBCYWRWYWx1ZS4KKwkgKgorCSAqIFRoaXMgaGFwcGVucyBpbiBwaGFzZSB0d28gb2YgdGhlIHdpZGdldCBkZXN0cnVjdGlvbiBwcm9jZXNzLgorCSAqLworCXsKKwkgICAgaWYgKHBhcmVudCAhPSBtZW51QmFyCisjaWZkZWYgRkVBVF9UT09MQkFSCisJCSAgICAmJiBwYXJlbnQgIT0gdG9vbEJhcgorI2VuZGlmCisJCSAgICApCisJICAgIHsKKwkJWHRWYUdldFZhbHVlcyhwYXJlbnQsIFh0Tm51bUNoaWxkcmVuLCAmbnVtX2NoaWxkcmVuLCBOVUxMKTsKKwkJaWYgKG51bV9jaGlsZHJlbiA+IDEpCisJCSAgICBYdERlc3Ryb3lXaWRnZXQobWVudS0+aWQpOworCSAgICB9CisJICAgIGVsc2UKKwkJWHREZXN0cm95V2lkZ2V0KG1lbnUtPmlkKTsKKwkgICAgbWVudS0+aWQgPSAoV2lkZ2V0KTA7CisJfQorCisJaWYgKHBhcmVudCA9PSBtZW51QmFyKQorCXsKKwkgICAgaWYgKCFndWkubWVudV9oZWlnaHRfZml4ZWQpCisJCWd1aS5tZW51X2hlaWdodCA9IGhlaWdodCArIDIgKiAoc3BhY2UgKyBib3JkZXIpOworCX0KKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwllbHNlIGlmIChwYXJlbnQgPT0gdG9vbEJhcikKKwl7CisJICAgIC8qIFdoZW4gcmVtb3ZpbmcgbGFzdCB0b29sYmFyIGl0ZW0sIGRvbid0IGRpc3BsYXkgdGhlIHRvb2xiYXIuICovCisJICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwgWHRObnVtQ2hpbGRyZW4sICZudW1fY2hpbGRyZW4sIE5VTEwpOworCSAgICBpZiAobnVtX2NoaWxkcmVuID09IDApCisJCWd1aV9tY2hfc2hvd190b29sYmFyKEZBTFNFKTsKKwkgICAgZWxzZQorCQlndWkudG9vbGJhcl9oZWlnaHQgPSBndWlfbWNoX2NvbXB1dGVfdG9vbGJhcl9oZWlnaHQoKTsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgaWYgKG1lbnUtPnN1Ym1lbnVfaWQgIT0gKFdpZGdldCkwKQorICAgIHsKKwlYdERlc3Ryb3lXaWRnZXQobWVudS0+c3VibWVudV9pZCk7CisJbWVudS0+c3VibWVudV9pZCA9IChXaWRnZXQpMDsKKyAgICB9Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitndWlfYXRoZW5hX21lbnVfdGltZW91dChjbGllbnRfZGF0YSwgaWQpCisgICAgWHRQb2ludGVyCSAgICBjbGllbnRfZGF0YTsKKyAgICBYdEludGVydmFsSWQgICAgKmlkOworeworICAgIFdpZGdldCAgdyA9IChXaWRnZXQpY2xpZW50X2RhdGE7CisgICAgV2lkZ2V0ICBwb3B1cDsKKworICAgIHRpbWVyID0gMDsKKyAgICBpZiAoWHRJc1N1YmNsYXNzKHcsc21lQlNCT2JqZWN0Q2xhc3MpKQorICAgIHsKKwlQaXhtYXAgcDsKKworCVh0VmFHZXRWYWx1ZXModywgWHROcmlnaHRCaXRtYXAsICZwLCBOVUxMKTsKKwlpZiAoKHAgIT0gTm9uZSkgJiYgKHAgIT0gWHRVbnNwZWNpZmllZFBpeG1hcCkpCisJeworCSAgICAvKiBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIGl0ZW0gdGhhdCBoYXMgYSBzdWJtZW51ICovCisJICAgIHBvcHVwID0gZ2V0X3BvcHVwX2VudHJ5KFh0UGFyZW50KHcpKTsKKwkgICAgaWYgKHBvcHVwID09IChXaWRnZXQpMCkKKwkJcmV0dXJuOworCSAgICBYdFBvcHVwKHBvcHVwLCBYdEdyYWJOb25leGNsdXNpdmUpOworCX0KKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gKGluIHNjcmVlbiBjb29yZGluYXRlcykKKyAqIHdoZXJlIGEgc3VibWVudSBzaG91bGQgYXBwZWFyIHJlbGF0aXZlIHRvIHRoZSBtZW51IGVudHJ5IHRoYXQgcG9wcGVkIGl0CisgKiB1cC4gIEl0IHNob3VsZCBhcHBlYXIgZXZlbiB3aXRoIGFuZCBqdXN0IHNsaWdodGx5IHRvIHRoZSBsZWZ0IG9mIHRoZQorICogcmlnaHRtb3N0IGVuZCBvZiB0aGUgbWVudSBlbnRyeSB0aGF0IGNhdXNlZCB0aGUgcG9wdXAuCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBYdFBvcHVwKCkgaXMgY2FsbGVkLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2F0aGVuYV9wb3B1cF9jYWxsYmFjayh3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYdFBvaW50ZXIJY2FsbF9kYXRhOworeworICAgIC8qIEFzc3VtcHRpb246IFh0SXNTdWJjbGFzcyhYdFBhcmVudCh3KSxzaW1wbGVNZW51V2lkZ2V0Q2xhc3MpICovCisgICAgdmltbWVudV9UCSptZW51ID0gKHZpbW1lbnVfVCAqKWNsaWVudF9kYXRhOworICAgIERpbWVuc2lvbgl3aWR0aDsKKyAgICBQb3NpdGlvbglyb290X3gsIHJvb3RfeTsKKworICAgIC8qIEZpcnN0LCBwb3Bkb3duIGFueSBzaWJsaW5ncyB0aGF0IG1heSBoYXZlIG1lbnVzIHBvcHBlZCB1cCAqLworICAgIHsKKwl2aW1tZW51X1QgKmk7CisKKwlmb3IgKGkgPSBtZW51LT5wYXJlbnQtPmNoaWxkcmVuOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KQorCXsKKwkgICAgaWYgKGktPnN1Ym1lbnVfaWQgIT0gTlVMTCAmJiBYdElzTWFuYWdlZChpLT5zdWJtZW51X2lkKSkKKwkJWHRQb3Bkb3duKGktPnN1Ym1lbnVfaWQpOworCX0KKyAgICB9CisgICAgWHRWYUdldFZhbHVlcyhYdFBhcmVudCh3KSwKKwkJICBYdE53aWR0aCwgICAmd2lkdGgsCisJCSAgTlVMTCk7CisgICAgLyogQXNzdW1wdGlvbjogWGF3U2ltcGxlTWVudUdldEFjdGl2ZUVudHJ5KFh0UGFyZW50KHcpKSA9PSBtZW51LT5pZCAqLworICAgIC8qIGkuZS4gVGhpcyBJUyB0aGUgYWN0aXZlIGVudHJ5ICovCisgICAgWHRUcmFuc2xhdGVDb29yZHMobWVudS0+aWQsd2lkdGggLSA1LCAwLCAmcm9vdF94LCAmcm9vdF95KTsKKyAgICBYdFZhU2V0VmFsdWVzKHcsIFh0TngsIHJvb3RfeCwKKwkJICAgICBYdE55LCByb290X3ksCisJCSAgICAgTlVMTCk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9hdGhlbmFfcG9wZG93bl9zdWJtZW51c19hY3Rpb24odywgZXZlbnQsIGFyZ3MsIG5hcmdzKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgU3RyaW5nCSphcmdzOworICAgIENhcmRpbmFsCSpuYXJnczsKK3sKKyAgICBXaWRnZXRMaXN0CWNoaWxkcmVuOworICAgIENhcmRpbmFsCW51bV9jaGlsZHJlbjsKKworICAgIFh0VmFHZXRWYWx1ZXModywgWHROY2hpbGRyZW4sICZjaGlsZHJlbiwKKwkJICAgICBYdE5udW1DaGlsZHJlbiwgJm51bV9jaGlsZHJlbiwKKwkJICAgICBOVUxMKTsKKyAgICBmb3IgKDsgbnVtX2NoaWxkcmVuID4gMDsgLS1udW1fY2hpbGRyZW4pCisgICAgeworCVdpZGdldCBjaGlsZCA9IGNoaWxkcmVuW251bV9jaGlsZHJlbiAtIDFdOworCisJaWYgKGhhc19zdWJtZW51KGNoaWxkKSkKKwl7CisJICAgIFdpZGdldCB0ZW1wX3c7CisKKwkgICAgdGVtcF93ID0gc3VibWVudV93aWRnZXQoY2hpbGQpOworCSAgICBndWlfYXRoZW5hX3BvcGRvd25fc3VibWVudXNfYWN0aW9uKHRlbXBfdyxldmVudCxhcmdzLG5hcmdzKTsKKwkgICAgWHRQb3Bkb3duKHRlbXBfdyk7CisJfQorICAgIH0KK30KKworLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHdpZGdldCBoYXMgYSBzdWJtZW51IHRoYXQgY2FuIGJlIHBvcHBlZCB1cC4gKi8KKyAgICBzdGF0aWMgQm9vbGVhbgoraGFzX3N1Ym1lbnUod2lkZ2V0KQorICAgIFdpZGdldCAgd2lkZ2V0OworeworICAgIGlmICgod2lkZ2V0ICE9IE5VTEwpICYmIFh0SXNTdWJjbGFzcyh3aWRnZXQsc21lQlNCT2JqZWN0Q2xhc3MpKQorICAgIHsKKwlQaXhtYXAgcDsKKworCVh0VmFHZXRWYWx1ZXMod2lkZ2V0LCBYdE5yaWdodEJpdG1hcCwgJnAsIE5VTEwpOworCWlmICgocCAhPSBOb25lKSAmJiAocCAhPSBYdFVuc3BlY2lmaWVkUGl4bWFwKSkKKwkgICAgcmV0dXJuIFRydWU7CisgICAgfQorICAgIHJldHVybiBGYWxzZTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2F0aGVuYV9kZWxheWVkX2FybV9hY3Rpb24odywgZXZlbnQsIGFyZ3MsIG5hcmdzKQorICAgIFdpZGdldAl3OworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgU3RyaW5nCSphcmdzOworICAgIENhcmRpbmFsCSpuYXJnczsKK3sKKyAgICBEaW1lbnNpb24Jd2lkdGgsIGhlaWdodDsKKworICAgIGlmIChldmVudC0+dHlwZSAhPSBNb3Rpb25Ob3RpZnkpCisJcmV0dXJuOworCisgICAgWHRWYUdldFZhbHVlcyh3LAorCVh0TndpZHRoLCAgICZ3aWR0aCwKKwlYdE5oZWlnaHQsICAmaGVpZ2h0LAorCU5VTEwpOworCisgICAgaWYgKGV2ZW50LT54bW90aW9uLnggPj0gKGludCl3aWR0aCB8fCBldmVudC0+eG1vdGlvbi55ID49IChpbnQpaGVpZ2h0KQorCXJldHVybjsKKworICAgIHsKKwlzdGF0aWMgV2lkZ2V0CSAgICBwcmV2aW91c19hY3RpdmVfd2lkZ2V0ID0gTlVMTDsKKwlXaWRnZXQJCSAgICBjdXJyZW50OworCisJY3VycmVudCA9IFhhd1NpbXBsZU1lbnVHZXRBY3RpdmVFbnRyeSh3KTsKKwlpZiAoY3VycmVudCAhPSBwcmV2aW91c19hY3RpdmVfd2lkZ2V0KQorCXsKKwkgICAgaWYgKHRpbWVyKQorCSAgICB7CisJCS8qIElmIHRoZSB0aW1lb3V0IGhhc24ndCBiZWVuIHRyaWdnZXJlZCwgcmVtb3ZlIGl0ICovCisJCVh0UmVtb3ZlVGltZU91dCh0aW1lcik7CisJICAgIH0KKwkgICAgZ3VpX2F0aGVuYV9wb3Bkb3duX3N1Ym1lbnVzX2FjdGlvbih3LGV2ZW50LGFyZ3MsbmFyZ3MpOworCSAgICBpZiAoaGFzX3N1Ym1lbnUoY3VycmVudCkpCisJICAgIHsKKwkJWHRBcHBBZGRUaW1lT3V0KFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQodyksIDYwMEwsCisJCQkJZ3VpX2F0aGVuYV9tZW51X3RpbWVvdXQsCisJCQkJKFh0UG9pbnRlciljdXJyZW50KTsKKwkgICAgfQorCSAgICBwcmV2aW91c19hY3RpdmVfd2lkZ2V0ID0gY3VycmVudDsKKwl9CisgICAgfQorfQorCisgICAgc3RhdGljIFdpZGdldAorZ2V0X3BvcHVwX2VudHJ5KHcpCisgICAgV2lkZ2V0ICB3OworeworICAgIFdpZGdldAltZW51dzsKKworICAgIC8qIEdldCB0aGUgYWN0aXZlIGVudHJ5IGZvciB0aGUgY3VycmVudCBtZW51ICovCisgICAgaWYgKChtZW51dyA9IFhhd1NpbXBsZU1lbnVHZXRBY3RpdmVFbnRyeSh3KSkgPT0gKFdpZGdldCkwKQorCXJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHN1Ym1lbnVfd2lkZ2V0KG1lbnV3KTsKK30KKworLyogR2l2ZW4gdGhlIHdpZGdldCB0aGF0IGhhcyBiZWVuIGRldGVybWluZWQgdG8gaGF2ZSBhIHN1Ym1lbnUsIHJldHVybiB0aGUgc3VibWVudSB3aWRnZXQKKyAqIHRoYXQgaXMgdG8gYmUgcG9wcGVkIHVwLgorICovCisgICAgc3RhdGljIFdpZGdldAorc3VibWVudV93aWRnZXQod2lkZ2V0KQorICAgIFdpZGdldCAgd2lkZ2V0OworeworICAgIC8qIFByZWNvbmRpdGlvbjogaGFzX3N1Ym1lbnUod2lkZ2V0KSA9PSBUcnVlCisgICAgICoJICAgIFh0SXNTdWJjbGFzcyhYdFBhcmVudCh3aWRnZXQpLHNpbXBsZU1lbnVXaWRnZXRDbGFzcykgPT0gVHJ1ZQorICAgICAqLworCisgICAgY2hhcl91CSpwdWxscmlnaHRfbmFtZTsKKyAgICBXaWRnZXQJcG9wdXA7CisKKyAgICBwdWxscmlnaHRfbmFtZSA9IG1ha2VfcHVsbF9uYW1lKChjaGFyX3UgKilYdE5hbWUod2lkZ2V0KSk7CisgICAgcG9wdXAgPSBYdE5hbWVUb1dpZGdldChYdFBhcmVudCh3aWRnZXQpLCAoY2hhciAqKXB1bGxyaWdodF9uYW1lKTsKKyAgICB2aW1fZnJlZShwdWxscmlnaHRfbmFtZSk7CisKKyAgICByZXR1cm4gcG9wdXA7CisgICAgLyogUG9zdGNvbmRpdGlvbjogKHBvcHVwICE9IE5VTEwpIGltcGxpZXMKKyAgICAgKiAoWHRJc1N1YmNsYXNzKHBvcHVwLHNpbXBsZU1lbnVXaWRnZXRDbGFzcykgPT0gVHJ1ZSkgKi8KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICB2b2lkCitndWlfbWNoX3Nob3dfcG9wdXBtZW51KG1lbnUpCisgICAgdmltbWVudV9UICptZW51OworeworICAgIGludAkJcm9vdHgsIHJvb3R5LCB3aW54LCB3aW55OworICAgIFdpbmRvdwlyb290LCBjaGlsZDsKKyAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgIGlmIChtZW51LT5zdWJtZW51X2lkID09IChXaWRnZXQpMCkKKwlyZXR1cm47CisKKyAgICAvKiBQb3NpdGlvbiB0aGUgcG9wdXAgbWVudSBhdCB0aGUgcG9pbnRlciAqLworICAgIGlmIChYUXVlcnlQb2ludGVyKGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSwgJnJvb3QsICZjaGlsZCwKKwkJJnJvb3R4LCAmcm9vdHksICZ3aW54LCAmd2lueSwgJm1hc2spKQorICAgIHsKKwlyb290eCAtPSAzMDsKKwlpZiAocm9vdHggPCAwKQorCSAgICByb290eCA9IDA7CisJcm9vdHkgLT0gNTsKKwlpZiAocm9vdHkgPCAwKQorCSAgICByb290eSA9IDA7CisJWHRWYVNldFZhbHVlcyhtZW51LT5zdWJtZW51X2lkLAorCQlYdE54LCByb290eCwKKwkJWHROeSwgcm9vdHksCisJCU5VTEwpOworICAgIH0KKworICAgIFh0T3ZlcnJpZGVUcmFuc2xhdGlvbnMobWVudS0+c3VibWVudV9pZCwgcG9wdXBUcmFucyk7CisgICAgWHRQb3B1cFNwcmluZ0xvYWRlZChtZW51LT5zdWJtZW51X2lkKTsKK30KKworI2VuZGlmIC8qIEZFQVRfTUVOVSAqLworCisvKgorICogU2V0IHRoZSBtZW51IGFuZCBzY3JvbGxiYXIgY29sb3JzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kZWZfY29sb3JzKCkKK3sKKyAgICAvKgorICAgICAqIEdldCB0aGUgY29sb3JzIG91cnNlbHZlcy4gIFVzaW5nIHRoZSBhdXRvbWF0aWMgY29udmVyc2lvbiBkb2Vzbid0CisgICAgICogaGFuZGxlIGxvb2tpbmcgZm9yIGFwcHJveGltYXRlIGNvbG9ycy4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKyAgICB7CisJZ3VpLm1lbnVfZmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY19tZW51X2ZnX25hbWUpOworCWd1aS5tZW51X2JnX3BpeGVsID0gZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZ3VpLnJzcmNfbWVudV9iZ19uYW1lKTsKKwlndWkuc2Nyb2xsX2ZnX3BpeGVsID0gZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZ3VpLnJzcmNfc2Nyb2xsX2ZnX25hbWUpOworCWd1aS5zY3JvbGxfYmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY19zY3JvbGxfYmdfbmFtZSk7CisjaWZkZWYgRkVBVF9CRVZBTAorCWd1aS50b29sdGlwX2ZnX3BpeGVsID0gZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZ3VpLnJzcmNfdG9vbHRpcF9mZ19uYW1lKTsKKwlndWkudG9vbHRpcF9iZ19waXhlbCA9IGd1aV9nZXRfY29sb3IoKGNoYXJfdSAqKWd1aS5yc3JjX3Rvb2x0aXBfYmdfbmFtZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKworLyoKKyAqIFNjcm9sbGJhciBzdHVmZi4KKyAqLworCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNiLCB2YWwsIHNpemUsIG1heCkKKyAgICBzY3JvbGxiYXJfVAkqc2I7CisgICAgbG9uZwl2YWw7CisgICAgbG9uZwlzaXplOworICAgIGxvbmcJbWF4OworeworICAgIGRvdWJsZQl2LCBzOworCisgICAgaWYgKHNiLT5pZCA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBBdGhlbmEgc2Nyb2xsYmFyIG11c3QgZ28gZnJvbSAwLjAgdG8gMS4wLgorICAgICAqLworICAgIGlmIChtYXggPT0gMCkKKyAgICB7CisJLyogU28geW91IGNhbid0IHNjcm9sbCBpdCBhdCBhbGwgKG5vcm1hbGx5IGl0IHNjcm9sbHMgcGFzdCBlbmQpICovCisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisJWGF3U2Nyb2xsYmFyU2V0VGh1bWIoc2ItPmlkLCAwLjAsIDEuMCk7CisjZWxzZQorCXZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYihzYi0+aWQsIDAuMCwgMS4wLCAwLjApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdiA9IChkb3VibGUpdmFsIC8gKGRvdWJsZSkobWF4ICsgMSk7CisJcyA9IChkb3VibGUpc2l6ZSAvIChkb3VibGUpKG1heCArIDEpOworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworCVhhd1Njcm9sbGJhclNldFRodW1iKHNiLT5pZCwgdiwgcyk7CisjZWxzZQorCXZpbV9YYXdTY3JvbGxiYXJTZXRUaHVtYihzYi0+aWQsIHYsIHMsIDEuMCk7CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKHNiLCB4LCB5LCB3LCBoKQorICAgIHNjcm9sbGJhcl9UICpzYjsKKyAgICBpbnQJCXg7CisgICAgaW50CQl5OworICAgIGludAkJdzsKKyAgICBpbnQJCWg7Cit7CisgICAgaWYgKHNiLT5pZCA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworCisgICAgWHRVbm1hbmFnZUNoaWxkKHNiLT5pZCk7CisgICAgWHRWYVNldFZhbHVlcyhzYi0+aWQsCisJCSAgWHROaG9yaXpEaXN0YW5jZSwgeCwKKwkJICBYdE52ZXJ0RGlzdGFuY2UsIHksCisJCSAgWHROd2lkdGgsIHcsCisJCSAgWHROaGVpZ2h0LCBoLAorCQkgIE5VTEwpOworICAgIFh0TWFuYWdlQ2hpbGQoc2ItPmlkKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZW5hYmxlX3Njcm9sbGJhcihzYiwgZmxhZykKKyAgICBzY3JvbGxiYXJfVAkqc2I7CisgICAgaW50CQlmbGFnOworeworICAgIGlmIChzYi0+aWQgIT0gKFdpZGdldCkwKQorICAgIHsKKwlpZiAoZmxhZykKKwkgICAgWHRNYW5hZ2VDaGlsZChzYi0+aWQpOworCWVsc2UKKwkgICAgWHRVbm1hbmFnZUNoaWxkKHNiLT5pZCk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9jcmVhdGVfc2Nyb2xsYmFyKHNiLCBvcmllbnQpCisgICAgc2Nyb2xsYmFyX1QgKnNiOworICAgIGludAkJb3JpZW50OwkvKiBTQkFSX1ZFUlQgb3IgU0JBUl9IT1JJWiAqLworeworICAgIHNiLT5pZCA9IFh0VmFDcmVhdGVXaWRnZXQoInNjcm9sbEJhciIsCisjaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisJICAgIHNjcm9sbGJhcldpZGdldENsYXNzLCB2aW1Gb3JtLAorI2Vsc2UKKwkgICAgdmltX3Njcm9sbGJhcldpZGdldENsYXNzLCB2aW1Gb3JtLAorI2VuZGlmCisJICAgIFh0TnJlc2l6YWJsZSwgICBUcnVlLAorCSAgICBYdE50b3AsCSAgICBYdENoYWluVG9wLAorCSAgICBYdE5ib3R0b20sCSAgICBYdENoYWluVG9wLAorCSAgICBYdE5sZWZ0LAkgICAgWHRDaGFpbkxlZnQsCisJICAgIFh0TnJpZ2h0LAkgICAgWHRDaGFpbkxlZnQsCisJICAgIFh0TmJvcmRlcldpZHRoLCAwLAorCSAgICBYdE5vcmllbnRhdGlvbiwgKG9yaWVudCA9PSBTQkFSX1ZFUlQpID8gWHRvcmllbnRWZXJ0aWNhbAorCQkJCQkJICA6IFh0b3JpZW50SG9yaXpvbnRhbCwKKwkgICAgWHROZm9yZWdyb3VuZCwgZ3VpLnNjcm9sbF9mZ19waXhlbCwKKwkgICAgWHROYmFja2dyb3VuZCwgZ3VpLnNjcm9sbF9iZ19waXhlbCwKKwkgICAgTlVMTCk7CisgICAgaWYgKHNiLT5pZCA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworCisgICAgWHRBZGRDYWxsYmFjayhzYi0+aWQsIFh0Tmp1bXBQcm9jLAorCQkgIGd1aV9hdGhlbmFfc2Nyb2xsX2NiX2p1bXAsIChYdFBvaW50ZXIpc2ItPmlkZW50KTsKKyAgICBYdEFkZENhbGxiYWNrKHNiLT5pZCwgWHROc2Nyb2xsUHJvYywKKwkJICBndWlfYXRoZW5hX3Njcm9sbF9jYl9zY3JvbGwsIChYdFBvaW50ZXIpc2ItPmlkZW50KTsKKworI2lmZGVmIEZFQVRfR1VJX05FWFRBVworICAgIFhhd1Njcm9sbGJhclNldFRodW1iKHNiLT5pZCwgMC4wLCAxLjApOworI2Vsc2UKKyAgICB2aW1fWGF3U2Nyb2xsYmFyU2V0VGh1bWIoc2ItPmlkLCAwLjAsIDEuMCwgMC4wKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhcihzYikKKyAgICBzY3JvbGxiYXJfVCAqc2I7Cit7CisgICAgaWYgKHNiLT5pZCAhPSAoV2lkZ2V0KTApCisJWHREZXN0cm95V2lkZ2V0KHNiLT5pZCk7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl9jb2xvcnMoc2IpCisgICAgc2Nyb2xsYmFyX1QgKnNiOworeworICAgIGlmIChzYi0+aWQgIT0gKFdpZGdldCkwKQorCVh0VmFTZXRWYWx1ZXMoc2ItPmlkLAorCSAgICBYdE5mb3JlZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLAorCSAgICBYdE5iYWNrZ3JvdW5kLCBndWkuc2Nyb2xsX2JnX3BpeGVsLAorCSAgICBOVUxMKTsKKworICAgIC8qIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcmVjdGFuZ2xlIGJlbG93IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXJzLiAqLworICAgIGlmIChzYiA9PSAmZ3VpLmJvdHRvbV9zYmFyICYmIHZpbUZvcm0gIT0gKFdpZGdldCkwKQorCWd1aV9hdGhlbmFfc2Nyb2xsX2NvbG9ycyh2aW1Gb3JtKTsKK30KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgc3R1ZmY6CisgKi8KKyAgICBXaW5kb3cKK2d1aV94MTFfZ2V0X3dpZCgpCit7CisgICAgcmV0dXJuIFh0V2luZG93KHRleHRBcmVhKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9CUk9XU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUHV0IHVwIGEgZmlsZSByZXF1ZXN0ZXIuCisgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBuYW1lIGluIGFsbG9jYXRlZCBtZW1vcnksIG9yIE5VTEwgZm9yIENhbmNlbC4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBjaGFyX3UgKgorZ3VpX21jaF9icm93c2Uoc2F2aW5nLCB0aXRsZSwgZGZsdCwgZXh0LCBpbml0ZGlyLCBmaWx0ZXIpCisgICAgaW50CQlzYXZpbmc7CQkvKiBzZWxlY3QgZmlsZSB0byB3cml0ZSAqLworICAgIGNoYXJfdQkqdGl0bGU7CQkvKiBub3QgdXNlZCAodGl0bGUgZm9yIHRoZSB3aW5kb3cpICovCisgICAgY2hhcl91CSpkZmx0OwkJLyogbm90IHVzZWQgKGRlZmF1bHQgbmFtZSkgKi8KKyAgICBjaGFyX3UJKmV4dDsJCS8qIG5vdCB1c2VkIChleHRlbnNpb24gYWRkZWQpICovCisgICAgY2hhcl91CSppbml0ZGlyOwkvKiBpbml0aWFsIGRpcmVjdG9yeSwgTlVMTCBmb3IgY3VycmVudCBkaXIgKi8KKyAgICBjaGFyX3UJKmZpbHRlcjsJLyogbm90IHVzZWQgKGZpbGUgbmFtZSBmaWx0ZXIpICovCit7CisgICAgUG9zaXRpb24geCwgeTsKKyAgICBjaGFyX3UJZGlyYnVmW01BWFBBVEhMXTsKKworICAgIC8qIENvbmNhdGVuYXRlICJpbml0ZGlyIiBhbmQgImRmbHQiLiAqLworICAgIGlmIChpbml0ZGlyID09IE5VTEwgfHwgKmluaXRkaXIgPT0gTlVMKQorCW1jaF9kaXJuYW1lKGRpcmJ1ZiwgTUFYUEFUSEwpOworICAgIGVsc2UgaWYgKFNUUkxFTihpbml0ZGlyKSArIDIgPCBNQVhQQVRITCkKKwlTVFJDUFkoZGlyYnVmLCBpbml0ZGlyKTsKKyAgICBlbHNlCisJZGlyYnVmWzBdID0gTlVMOworICAgIGlmIChkZmx0ICE9IE5VTEwgJiYgKmRmbHQgIT0gTlVMCisJCQkgICAgICAmJiBTVFJMRU4oZGlyYnVmKSArIDIgKyBTVFJMRU4oZGZsdCkgPCBNQVhQQVRITCkKKyAgICB7CisJYWRkX3BhdGhzZXAoZGlyYnVmKTsKKwlTVFJDQVQoZGlyYnVmLCBkZmx0KTsKKyAgICB9CisKKyAgICAvKiBQb3NpdGlvbiB0aGUgZmlsZSBzZWxlY3RvciBqdXN0IGJlbG93IHRoZSBtZW51YmFyICovCisgICAgWHRUcmFuc2xhdGVDb29yZHModmltU2hlbGwsIChQb3NpdGlvbikwLCAoUG9zaXRpb24pCisjaWZkZWYgRkVBVF9NRU5VCisJICAgIGd1aS5tZW51X2hlaWdodAorI2Vsc2UKKwkgICAgMAorI2VuZGlmCisJICAgICwgJngsICZ5KTsKKyAgICByZXR1cm4gKGNoYXJfdSAqKXZpbV9TZWxGaWxlKHZpbVNoZWxsLCAoY2hhciAqKXRpdGxlLCAoY2hhciAqKWRpcmJ1ZiwKKwkJICBOVUxMLCAoaW50KXgsIChpbnQpeSwgZ3VpLm1lbnVfZmdfcGl4ZWwsIGd1aS5tZW51X2JnX3BpeGVsLAorCQkgIGd1aS5zY3JvbGxfZmdfcGl4ZWwsIGd1aS5zY3JvbGxfYmdfcGl4ZWwpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChQUk9UTykKKworc3RhdGljIGludAlkaWFsb2dTdGF0dXM7CitzdGF0aWMgQXRvbQlkaWFsb2dhdG9tOworCitzdGF0aWMgdm9pZCBrZXloaXRfY2FsbGJhY2sgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYRXZlbnQgKmV2ZW50LCBCb29sZWFuICpjb250KSk7CitzdGF0aWMgdm9pZCBidXRwcm9jIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWHRQb2ludGVyIGNhbGxfZGF0YSkpOworc3RhdGljIHZvaWQgZGlhbG9nX3dtX2hhbmRsZXIgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYRXZlbnQgKmV2ZW50LCBCb29sZWFuICpkdW0pKTsKKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgdGV4dGZpZWxkLiAgV2hlbiBDUiBpcyBoaXQgdGhpcyB3b3JrcyBsaWtlCisgKiBoaXR0aW5nIHRoZSAiT0siIGJ1dHRvbiwgRVNDIGxpa2UgIkNhbmNlbCIuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2tleWhpdF9jYWxsYmFjayh3LCBjbGllbnRfZGF0YSwgZXZlbnQsIGNvbnQpCisgICAgV2lkZ2V0CQl3OworICAgIFh0UG9pbnRlcgkJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CQkqZXZlbnQ7CisgICAgQm9vbGVhbgkJKmNvbnQ7Cit7CisgICAgY2hhcglidWZbMl07CisKKyAgICBpZiAoWExvb2t1cFN0cmluZygmKGV2ZW50LT54a2V5KSwgYnVmLCAyLCBOVUxMLCBOVUxMKSA9PSAxKQorICAgIHsKKwlpZiAoKmJ1ZiA9PSBDQVIpCisJICAgIGRpYWxvZ1N0YXR1cyA9IDE7CisJZWxzZSBpZiAoKmJ1ZiA9PSBFU0MpCisJICAgIGRpYWxvZ1N0YXR1cyA9IDA7CisgICAgfQorfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitidXRwcm9jKHcsIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCWNsaWVudF9kYXRhOworICAgIFh0UG9pbnRlcgljYWxsX2RhdGE7Cit7CisgICAgZGlhbG9nU3RhdHVzID0gKGludCkobG9uZyljbGllbnRfZGF0YSArIDE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiBkaWFsb2cgd2luZG93IGNsb3NlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2RpYWxvZ193bV9oYW5kbGVyKHcsIGNsaWVudF9kYXRhLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKmR1bTsKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gQ2xpZW50TWVzc2FnZQorCSAgICAmJiAoKFhDbGllbnRNZXNzYWdlRXZlbnQgKilldmVudCktPmRhdGEubFswXSA9PSBkaWFsb2dhdG9tKQorCWRpYWxvZ1N0YXR1cyA9IDA7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgaW50CitndWlfbWNoX2RpYWxvZyh0eXBlLCB0aXRsZSwgbWVzc2FnZSwgYnV0dG9ucywgZGZsdGJ1dHRvbiwgdGV4dGZpZWxkKQorICAgIGludAkJdHlwZTsKKyAgICBjaGFyX3UJKnRpdGxlOworICAgIGNoYXJfdQkqbWVzc2FnZTsKKyAgICBjaGFyX3UJKmJ1dHRvbnM7CisgICAgaW50CQlkZmx0YnV0dG9uOworICAgIGNoYXJfdQkqdGV4dGZpZWxkOworeworICAgIGNoYXJfdQkJKmJ1dHM7CisgICAgY2hhcl91CQkqcCwgKm5leHQ7CisgICAgWHRBcHBDb250ZXh0CWFwcDsKKyAgICBYRXZlbnQJCWV2ZW50OworICAgIFBvc2l0aW9uCQl3ZCwgaGQ7CisgICAgUG9zaXRpb24JCXd2LCBodjsKKyAgICBQb3NpdGlvbgkJeCwgeTsKKyAgICBXaWRnZXQJCWRpYWxvZzsKKyAgICBXaWRnZXQJCWRpYWxvZ3NoZWxsOworICAgIFdpZGdldAkJZGlhbG9nbWVzc2FnZTsKKyAgICBXaWRnZXQJCWRpYWxvZ3RleHRmaWVsZCA9IDA7CisgICAgV2lkZ2V0CQlkaWFsb2dCdXR0b247CisgICAgV2lkZ2V0CQlwcmV2X2RpYWxvZ0J1dHRvbiA9IE5VTEw7CisgICAgaW50CQkJYnV0Y291bnQ7CisgICAgaW50CQkJdmVydGljYWw7CisKKyAgICBpZiAodGl0bGUgPT0gTlVMTCkKKwl0aXRsZSA9IChjaGFyX3UgKilfKCJWaW0gZGlhbG9nIik7CisgICAgZGlhbG9nU3RhdHVzID0gLTE7CisKKyAgICAvKiBpZiBvdXIgcG9pbnRlciBpcyBjdXJyZW50bHkgaGlkZGVuLCB0aGVuIHdlIHNob3VsZCBzaG93IGl0LiAqLworICAgIGd1aV9tY2hfbW91c2VoaWRlKEZBTFNFKTsKKworICAgIC8qIENoZWNrICd2JyBmbGFnIGluICdndWlvcHRpb25zJzogdmVydGljYWwgYnV0dG9uIHBsYWNlbWVudC4gKi8KKyAgICB2ZXJ0aWNhbCA9ICh2aW1fc3RyY2hyKHBfZ28sIEdPX1ZFUlRJQ0FMKSAhPSBOVUxMKTsKKworICAgIC8qIFRoZSBzaGVsbCBpcyBjcmVhdGVkIGVhY2ggdGltZSwgdG8gbWFrZSBzdXJlIGl0IGlzIHJlc2l6ZWQgcHJvcGVybHkgKi8KKyAgICBkaWFsb2dzaGVsbCA9IFh0VmFDcmVhdGVQb3B1cFNoZWxsKCJkaWFsb2dTaGVsbCIsCisJICAgIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MsIHZpbVNoZWxsLAorCSAgICBYdE50aXRsZSwgdGl0bGUsCisJICAgIE5VTEwpOworICAgIGlmIChkaWFsb2dzaGVsbCA9PSAoV2lkZ2V0KTApCisJZ290byBlcnJvcjsKKworICAgIGRpYWxvZyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJkaWFsb2ciLAorCSAgICBmb3JtV2lkZ2V0Q2xhc3MsIGRpYWxvZ3NoZWxsLAorCSAgICBYdE5kZWZhdWx0RGlzdGFuY2UsIDIwLAorCSAgICBOVUxMKTsKKyAgICBpZiAoZGlhbG9nID09IChXaWRnZXQpMCkKKwlnb3RvIGVycm9yOworICAgIGd1aV9hdGhlbmFfbWVudV9jb2xvcnMoZGlhbG9nKTsKKyAgICBkaWFsb2dtZXNzYWdlID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZ01lc3NhZ2UiLAorCSAgICBsYWJlbFdpZGdldENsYXNzLCBkaWFsb2csCisJICAgIFh0TmxhYmVsLCBtZXNzYWdlLAorCSAgICBYdE50b3AsIFh0Q2hhaW5Ub3AsCisJICAgIFh0TmJvdHRvbSwgWHRDaGFpblRvcCwKKwkgICAgWHRObGVmdCwgWHRDaGFpbkxlZnQsCisJICAgIFh0TnJpZ2h0LCBYdENoYWluTGVmdCwKKwkgICAgWHROcmVzaXphYmxlLCBUcnVlLAorCSAgICBYdE5ib3JkZXJXaWR0aCwgMCwKKwkgICAgTlVMTCk7CisgICAgZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyhkaWFsb2dtZXNzYWdlKTsKKworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKyAgICB7CisJZGlhbG9ndGV4dGZpZWxkID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInRleHRmaWVsZCIsCisJCWFzY2lpVGV4dFdpZGdldENsYXNzLCBkaWFsb2csCisJCVh0TndpZHRoLCA0MDAsCisJCVh0TnRvcCwgWHRDaGFpblRvcCwKKwkJWHROYm90dG9tLCBYdENoYWluVG9wLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5SaWdodCwKKwkJWHROZnJvbVZlcnQsIGRpYWxvZ21lc3NhZ2UsCisJCVh0TnJlc2l6YWJsZSwgVHJ1ZSwKKwkJWHROc3RyaW5nLCB0ZXh0ZmllbGQsCisJCVh0Tmxlbmd0aCwgSU9TSVpFLAorCQlYdE51c2VTdHJpbmdJblBsYWNlLCBUcnVlLAorCQlYdE5lZGl0VHlwZSwgWGF3dGV4dEVkaXQsCisJCVh0TndyYXAsIFhhd3RleHRXcmFwTmV2ZXIsCisJCVh0TnJlc2l6ZSwgWGF3dGV4dFJlc2l6ZUhlaWdodCwKKwkJTlVMTCk7CisJWHRNYW5hZ2VDaGlsZChkaWFsb2d0ZXh0ZmllbGQpOworCVh0QWRkRXZlbnRIYW5kbGVyKGRpYWxvZ3RleHRmaWVsZCwgS2V5UHJlc3NNYXNrLCBGYWxzZSwKKwkJCSAgICAoWHRFdmVudEhhbmRsZXIpa2V5aGl0X2NhbGxiYWNrLCAoWHRQb2ludGVyKU5VTEwpOworCVhhd1RleHRTZXRJbnNlcnRpb25Qb2ludChkaWFsb2d0ZXh0ZmllbGQsCisJCQkJCSAgKFhhd1RleHRQb3NpdGlvbilTVFJMRU4odGV4dGZpZWxkKSk7CisJWHRTZXRLZXlib2FyZEZvY3VzKGRpYWxvZywgZGlhbG9ndGV4dGZpZWxkKTsKKyAgICB9CisKKyAgICAvKiBtYWtlIGEgY29weSwgc28gdGhhdCB3ZSBjYW4gaW5zZXJ0IE5VTHMgKi8KKyAgICBidXRzID0gdmltX3N0cnNhdmUoYnV0dG9ucyk7CisgICAgaWYgKGJ1dHMgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICBwID0gYnV0czsKKyAgICBmb3IgKGJ1dGNvdW50ID0gMDsgKnA7ICsrYnV0Y291bnQpCisgICAgeworCWZvciAobmV4dCA9IHA7ICpuZXh0OyArK25leHQpCisJeworCSAgICBpZiAoKm5leHQgPT0gRExHX0hPVEtFWV9DSEFSKQorCQltY2hfbWVtbW92ZShuZXh0LCBuZXh0ICsgMSwgU1RSTEVOKG5leHQpKTsKKwkgICAgaWYgKCpuZXh0ID09IERMR19CVVRUT05fU0VQKQorCSAgICB7CisJCSpuZXh0KysgPSBOVUw7CisJCWJyZWFrOworCSAgICB9CisJfQorCWRpYWxvZ0J1dHRvbiA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJidXR0b24iLAorCQljb21tYW5kV2lkZ2V0Q2xhc3MsIGRpYWxvZywKKwkJWHRObGFiZWwsIHAsCisJCVh0TnRvcCwgWHRDaGFpbkJvdHRvbSwKKwkJWHROYm90dG9tLCBYdENoYWluQm90dG9tLAorCQlYdE5sZWZ0LCBYdENoYWluTGVmdCwKKwkJWHROcmlnaHQsIFh0Q2hhaW5MZWZ0LAorCQlYdE5mcm9tVmVydCwgdGV4dGZpZWxkID09IE5VTEwgPyBkaWFsb2dtZXNzYWdlIDogZGlhbG9ndGV4dGZpZWxkLAorCQlYdE52ZXJ0RGlzdGFuY2UsIHZlcnRpY2FsID8gNCA6IDIwLAorCQlYdE5yZXNpemFibGUsIEZhbHNlLAorCQlOVUxMKTsKKwlndWlfYXRoZW5hX21lbnVfY29sb3JzKGRpYWxvZ0J1dHRvbik7CisJaWYgKGJ1dGNvdW50ID4gMCkKKwkgICAgWHRWYVNldFZhbHVlcyhkaWFsb2dCdXR0b24sCisJCSAgICB2ZXJ0aWNhbCA/IFh0TmZyb21WZXJ0IDogWHROZnJvbUhvcml6LCBwcmV2X2RpYWxvZ0J1dHRvbiwKKwkJICAgIE5VTEwpOworCisJWHRBZGRDYWxsYmFjayhkaWFsb2dCdXR0b24sIFh0TmNhbGxiYWNrLCBidXRwcm9jLCAoWHRQb2ludGVyKWJ1dGNvdW50KTsKKwlwID0gbmV4dDsKKwlwcmV2X2RpYWxvZ0J1dHRvbiA9IGRpYWxvZ0J1dHRvbjsKKyAgICB9CisgICAgdmltX2ZyZWUoYnV0cyk7CisKKyAgICBYdFJlYWxpemVXaWRnZXQoZGlhbG9nc2hlbGwpOworCisgICAgLyogU2V0dXAgZm9yIGNhdGNoaW5nIHRoZSBjbG9zZS13aW5kb3cgZXZlbnQsIGRvbid0IGxldCBpdCBjbG9zZSBWaW0hICovCisgICAgZGlhbG9nYXRvbSA9IFhJbnRlcm5BdG9tKGd1aS5kcHksICJXTV9ERUxFVEVfV0lORE9XIiwgRmFsc2UpOworICAgIFhTZXRXTVByb3RvY29scyhndWkuZHB5LCBYdFdpbmRvdyhkaWFsb2dzaGVsbCksICZkaWFsb2dhdG9tLCAxKTsKKyAgICBYdEFkZEV2ZW50SGFuZGxlcihkaWFsb2dzaGVsbCwgTm9FdmVudE1hc2ssIFRydWUsIGRpYWxvZ193bV9oYW5kbGVyLCBOVUxMKTsKKworICAgIFh0VmFHZXRWYWx1ZXMoZGlhbG9nc2hlbGwsCisJICAgIFh0TndpZHRoLCAmd2QsCisJICAgIFh0TmhlaWdodCwgJmhkLAorCSAgICBOVUxMKTsKKyAgICBYdFZhR2V0VmFsdWVzKHZpbVNoZWxsLAorCSAgICBYdE53aWR0aCwgJnd2LAorCSAgICBYdE5oZWlnaHQsICZodiwKKwkgICAgTlVMTCk7CisgICAgWHRUcmFuc2xhdGVDb29yZHModmltU2hlbGwsCisJICAgIChQb3NpdGlvbikoKHd2IC0gd2QpIC8gMiksCisJICAgIChQb3NpdGlvbikoKGh2IC0gaGQpIC8gMiksCisJICAgICZ4LCAmeSk7CisgICAgaWYgKHggPCAwKQorCXggPSAwOworICAgIGlmICh5IDwgMCkKKwl5ID0gMDsKKyAgICBYdFZhU2V0VmFsdWVzKGRpYWxvZ3NoZWxsLCBYdE54LCB4LCBYdE55LCB5LCBOVUxMKTsKKworICAgIC8qIFBvc2l0aW9uIHRoZSBtb3VzZSBwb2ludGVyIGluIHRoZSBkaWFsb2csIHJlcXVpcmVkIGZvciB3aGVuIGZvY3VzCisgICAgICogZm9sbG93cyBtb3VzZS4gKi8KKyAgICBYV2FycFBvaW50ZXIoZ3VpLmRweSwgKFdpbmRvdykwLCBYdFdpbmRvdyhkaWFsb2dzaGVsbCksIDAsIDAsIDAsIDAsIDIwLCA0MCk7CisKKworICAgIGFwcCA9IFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoZGlhbG9nc2hlbGwpOworCisgICAgWHRQb3B1cChkaWFsb2dzaGVsbCwgWHRHcmFiTm9uZXhjbHVzaXZlKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKwlYdEFwcE5leHRFdmVudChhcHAsICZldmVudCk7CisJWHREaXNwYXRjaEV2ZW50KCZldmVudCk7CisJaWYgKGRpYWxvZ1N0YXR1cyA+PSAwKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICBYdFBvcGRvd24oZGlhbG9nc2hlbGwpOworCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMICYmIGRpYWxvZ1N0YXR1cyA8IDApCisJKnRleHRmaWVsZCA9IE5VTDsKKworZXJyb3I6CisgICAgWHREZXN0cm95V2lkZ2V0KGRpYWxvZ3NoZWxsKTsKKworICAgIHJldHVybiBkaWFsb2dTdGF0dXM7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfTUVOVSkKKy8qCisgKiBTZXQgdGhlIGNvbG9ycyBvZiBXaWRnZXQgImlkIiB0byB0aGUgbWVudSBjb2xvcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2F0aGVuYV9tZW51X2NvbG9ycyhpZCkKKyAgICBXaWRnZXQgIGlkOworeworICAgIGlmIChndWkubWVudV9iZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCVh0VmFTZXRWYWx1ZXMoaWQsIFh0TmJhY2tncm91bmQsIGd1aS5tZW51X2JnX3BpeGVsLCBOVUxMKTsKKyAgICBpZiAoZ3VpLm1lbnVfZmdfcGl4ZWwgIT0gSU5WQUxDT0xPUikKKwlYdFZhU2V0VmFsdWVzKGlkLCBYdE5mb3JlZ3JvdW5kLCBndWkubWVudV9mZ19waXhlbCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgY29sb3JzIG9mIFdpZGdldCAiaWQiIHRvIHRoZSBzY3JvbGwgY29sb3JzLgorICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9hdGhlbmFfc2Nyb2xsX2NvbG9ycyhpZCkKKyAgICBXaWRnZXQgIGlkOworeworICAgIGlmIChndWkuc2Nyb2xsX2JnX3BpeGVsICE9IElOVkFMQ09MT1IpCisJWHRWYVNldFZhbHVlcyhpZCwgWHROYmFja2dyb3VuZCwgZ3VpLnNjcm9sbF9iZ19waXhlbCwgTlVMTCk7CisgICAgaWYgKGd1aS5zY3JvbGxfZmdfcGl4ZWwgIT0gSU5WQUxDT0xPUikKKwlYdFZhU2V0VmFsdWVzKGlkLCBYdE5mb3JlZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9ndWlfYmVvcy5jYyBiL3NyYy9ndWlfYmVvcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmM2NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9iZW9zLmNjCkBAIC0wLDAgKzEsMzM0NyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCSAgICBCZUJveCBHVUkgc3VwcG9ydCBDb3B5cmlnaHQgMTk5OCBieSBPbGFmIFNlaWJlcnQuCisgKgkJCSAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKgorICogQmVPUyBHVUkuCisgKgorICogR1VJIHN1cHBvcnQgZm9yIHRoZSBCdXp6d29yZCBFbmhhbmNlZCBPcGVyYXRpbmcgU3lzdGVtLgorICoKKyAqIFBvcnRlZCB0byBSNCBieSBSaWNoYXJkIE9mZmVyIDxyaWNoYXJkQHdoaXRlcXVlZW4uY29tPiBKdWwgOTkKKyAqCisgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgQmVPUyBHVUkgY29kZToKKyAqCisgKiBUaGVyZSBhcmUgMyB0aHJlYWRzLgorICogMS4gVGhlIGluaXRpYWwgdGhyZWFkLiBJbiBndWlfbWNoX3ByZXBhcmUoKSB0aGlzIGdldHMgdG8gcnVuIHRoZQorICogICAgQkFwcGxpY2F0aW9uIG1lc3NhZ2UgbG9vcC4gQnV0IGJlZm9yZSBpdCBzdGFydHMgZG9pbmcgdGhhdCwKKyAqICAgIGl0IGNyZWF0ZXMgdGhyZWFkIDI6CisgKiAyLiBUaGUgbWFpbigpIHRocmVhZC4gVGhpcyB0aHJlYWQgaXMgY3JlYXRlZCBpbiBndWlfbWNoX3ByZXBhcmUoKQorICogICAgYW5kIGl0cyBwdXJwb3NlIGluIGxpZmUgaXMgdG8gY2FsbCBtYWluKGFyZ2MsIGFyZ3YpIGFnYWluLgorICogICAgVGhpcyB0aHJlYWQgaXMgZG9pbmcgdGhlIGJ1bGsgb2YgdGhlIHdvcmsuCisgKiAzLiBTb29uZXIgb3IgbGF0ZXIsIGEgd2luZG93IGlzIG9wZW5lZCBieSB0aGUgbWFpbigpIHRocmVhZC4gVGhpcworICogICAgY2F1c2VzIGEgc2Vjb25kIG1lc3NhZ2UgbG9vcCB0byBiZSBjcmVhdGVkOiB0aGUgd2luZG93IHRocmVhZC4KKyAqCisgKiA9PSBhbHRlcm5hdGl2ZWx5ID09PQorICoKKyAqICNpZiBSVU5fQkFQUExJQ0FUSU9OX0lOX05FV19USFJFQUQuLi4KKyAqCisgKiAxLiBUaGUgaW5pdGlhbCB0aHJlYWQuIEluIGd1aV9tY2hfcHJlcGFyZSgpIHRoaXMgZ2V0cyB0byBzcGF3bgorICogICAgdGhyZWFkIDIuIEFmdGVyIGRvaW5nIHRoYXQsIGl0IHJldHVybnMgdG8gbWFpbigpIHRvIGRvIHRoZQorICogICAgYnVsayBvZiB0aGUgd29yaywgYmVpbmcgdGhlIG1haW4oKSB0aHJlYWQuCisgKiAyLiBSdW5zIHRoZSBCQXBwbGljYXRpb24uCisgKiAzLiBUaGUgd2luZG93IHRocmVhZCwganVzdCBsaWtlIGluIHRoZSBmaXJzdCBjYXNlLgorICoKKyAqIFRoaXMgc2Vjb25kIGFsdGVybmF0aXZlIGlzIGNsZWFuZXIgZnJvbSBWaW0ncyB2aWV3cG9pbnQuIEhvd2V2ZXIsCisgKiB0aGUgQmVCb29rIHNlZW1zIHRvIGFzc3VtZSBldmVyeXdoZXJlIHRoYXQgdGhlIEJBcHBsaWNhdGlvbiAqbXVzdCoKKyAqIHJ1biBpbiB0aGUgaW5pdGlhbCB0aHJlYWQuIFNvIHBlcmhhcHMgZG9pbmcgb3RoZXJ3aXNlIGlzIHZlcnkgd3JvbmcuCisgKgorICogSG93ZXZlciwgZnJvbSBhIEJfU0lOR0xFX0xBVU5DSCB2aWV3cG9pbnQsIHRoZSBmaXJzdCBpcyBiZXR0ZXIuCisgKiBJZiBWaW0gaXMgbWFya2VkICJTaW5nbGUgTGF1bmNoIiBpbiBpdHMgYXBwbGljYXRpb24gcmVzb3VyY2VzLAorICogYW5kIGEgZmlsZSBpcyBkcm9wcGVkIG9uIHRoZSBWaW0gaWNvbiwgYW5kIGFub3RoZXIgVmltIGlzIGFscmVhZHkKKyAqIHJ1bm5pbmcsIHRoZSBmaWxlIGlzIHBhc3NlZCBvbiB0byB0aGUgZWFybGllciBWaW0uIFRoaXMgaGFwcGVucworICogaW4gQkFwcGxpY2F0aW9uOjpSdW4oKS4gU28gd2Ugd2FudCBWaW0gdG8gdGVybWluYXRlIGlmCisgKiBCQXBwbGljYXRpb246OlJ1bigpIHRlcm1pbmF0ZXMuIChTZWUgdGhlIEJlQm9vaywgb24gQkFwcGxpY2F0aW9uLgorICogSG93ZXZlciwgaXQgc2VlbXMgdGhhdCB0aGUgc2Vjb25kIGNvcHkgb2YgVmltIGlzbid0IGV2ZW4gc3RhcnRlZAorICogaW4gdGhpcyBjYXNlLi4uIHdoaWNoIGlzIGZvciB0aGUgYmV0dGVyIHNpbmNlIEkgd291bGRuJ3Qga25vdyBob3cKKyAqIHRvIGRldGVjdCB0aGlzIGNhc2UuKQorICoKKyAqIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGVzZSB0aHJlYWRzIG9jY3VycyBtb3N0bHkgYnkgdHJhbnNsYXRpbmcKKyAqIEJNZXNzYWdlcyB0aGF0IGNvbWUgaW4gYW5kIHBvc3RpbmcgYW4gYXBwcm9wcmlhdGUgdHJhbnNsYXRpb24gb24KKyAqIHRoZSBWRENNUCAoVmltIERpcmVjdCBDb21tdW5pY2F0aW9uIE1lc3NhZ2UgUG9ydCkuIFRoZXJlZm9yZSB0aGUKKyAqIGFjdGlvbnMgcmVxdWlyZWQgZm9yIGtleXByZXNzZXMgYW5kIHdpbmRvdyByZXNpemVzLCBldGMsIGFyZSBtb3N0bHkKKyAqIHBlcmZvcm1lZCBpbiB0aGUgbWFpbigpIHRocmVhZC4KKyAqCisgKiBBIG5vdGFibGUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgdGhlIERyYXcoKSBldmVudC4gVGhlIHJlZHJhd2luZyBvZgorICogdGhlIHdpbmRvdyBjb250ZW50cyBpcyBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUgd2luZG93CisgKiB0aHJlYWQuIFRvIG1ha2UgdGhpcyB3b3JrIGNvcnJlY3RseSwgYSBsb2NraW5nIHByb3RvY29sIGlzIHVzZWQgd2hlbgorICogYW55IHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIGVzc2VudGlhbCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBieQorICogdGhlIHdpbmRvdyB0aHJlYWQuCisgKgorICogVGhpcyBsb2NraW5nIHByb3RvY29sIGNvbnNpc3RzIG9mIGxvY2tpbmcgVmltJ3Mgd2luZG93LiBUaGlzIGlzIGJvdGgKKyAqIGNvbnZlbmllbnQgYW5kIG5lY2Vzc2FyeS4KKyAqLworZXh0ZXJuICJDIiB7CisKKyNkZWZpbmUgbmV3CQl4eHhfbmV3X3h4eAorCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKyNpbmNsdWRlICJvcHRpb24uaCIKKworI3VuZGVmIG5ldworCit9CS8qIGV4dGVybiAiQyIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLSBzdGFydCBvZiBoZWFkZXIgcGFydCAtLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxiZS9hcHAvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8YmUvYXBwL0NsaXBib2FyZC5oPgorI2luY2x1ZGUgPGJlL2tlcm5lbC9PUy5oPgorI2luY2x1ZGUgPGJlL3N1cHBvcnQvQmVlcC5oPgorI2luY2x1ZGUgPGJlL2ludGVyZmFjZS9WaWV3Lmg+CisjaW5jbHVkZSA8YmUvaW50ZXJmYWNlL1dpbmRvdy5oPgorI2luY2x1ZGUgPGJlL2ludGVyZmFjZS9NZW51QmFyLmg+CisjaW5jbHVkZSA8YmUvaW50ZXJmYWNlL01lbnVJdGVtLmg+CisjaW5jbHVkZSA8YmUvaW50ZXJmYWNlL1Njcm9sbEJhci5oPgorI2luY2x1ZGUgPGJlL2ludGVyZmFjZS9SZWdpb24uaD4KKyNpbmNsdWRlIDxiZS9pbnRlcmZhY2UvU2NyZWVuLmg+CisjaW5jbHVkZSA8YmUvc3RvcmFnZS9QYXRoLmg+CisjaW5jbHVkZSA8YmUvc3RvcmFnZS9EaXJlY3RvcnkuaD4KKyNpbmNsdWRlIDxiZS9zdG9yYWdlL0VudHJ5Lmg+CisjaW5jbHVkZSA8YmUvYXBwL0FwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8YmUvc3VwcG9ydC9EZWJ1Zy5oPgorCisvKgorICogVGhlIG1hY3JvIEJfUElYRUxfQUxJR05NRU5UIHNob3dzIHVzIHdoaWNoIHZlcnNpb24KKyAqIG9mIHRoZSBoZWFkZXIgZmlsZXMgd2UncmUgdXNpbmcuCisgKi8KKyNpZiBkZWZpbmVkKEJfUElYRUxfQUxJR05NRU5UKQorI2RlZmluZSBIQVZFX1IzX09SX0xBVEVSICAgIDEKKyNlbHNlCisjZGVmaW5lIEhBVkVfUjNfT1JfTEFURVIgICAgMAorI2VuZGlmCisKK2NsYXNzIFZpbUFwcDsKK2NsYXNzIFZpbUZvcm1WaWV3OworY2xhc3MgVmltVGV4dEFyZWFWaWV3OworY2xhc3MgVmltV2luZG93OworCitleHRlcm4ga2V5X21hcCAqa2V5TWFwOworZXh0ZXJuIGNoYXIgKmtleU1hcENoYXJzOworCitleHRlcm4gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworI2lmbmRlZiBCX01BWF9QT1JUX0NPVU5UCisjZGVmaW5lIEJfTUFYX1BPUlRfQ09VTlQgICAgMTAwCisjZW5kaWYKKworLyoKKyAqIFZpbUFwcCBzZWVtcyBjb21wYXJhYmxlIHRvIHRoZSBYICJ2aW1TaGVsbCIKKyAqLworY2xhc3MgVmltQXBwOiBwdWJsaWMgQkFwcGxpY2F0aW9uCit7CisgICAgdHlwZWRlZiBCQXBwbGljYXRpb24gSW5oZXJpdGVkOworcHVibGljOgorICAgIFZpbUFwcChjb25zdCBjaGFyICphcHBzaWcpOworICAgIH5WaW1BcHAoKTsKKworICAgIC8vIGNhbGxiYWNrczoKKyNpZiAwCisgICAgdmlydHVhbCB2b2lkIERpc3BhdGNoTWVzc2FnZShCTWVzc2FnZSAqbSwgQkhhbmRsZXIgKmgpCisgICAgeworCW0tPlByaW50VG9TdHJlYW0oKTsKKwlJbmhlcml0ZWQ6OkRpc3BhdGNoTWVzc2FnZShtLCBoKTsKKyAgICB9CisjZW5kaWYKKyAgICB2aXJ0dWFsIHZvaWQgUmVhZHlUb1J1bigpOworICAgIHZpcnR1YWwgdm9pZCBBcmd2UmVjZWl2ZWQoaW50MzIgYXJnYywgY2hhciAqKmFyZ3YpOworICAgIHZpcnR1YWwgdm9pZCBSZWZzUmVjZWl2ZWQoQk1lc3NhZ2UgKm0pOworICAgIHZpcnR1YWwgYm9vbCBRdWl0UmVxdWVzdGVkKCk7CisKKyAgICBzdGF0aWMgdm9pZCBTZW5kUmVmcyhCTWVzc2FnZSAqbSwgYm9vbCBjaGFuZ2VkaXIpOworcHJpdmF0ZToKK307CisKK2NsYXNzIFZpbVdpbmRvdzogcHVibGljIEJXaW5kb3cKK3sKKyAgICB0eXBlZGVmIEJXaW5kb3cgSW5oZXJpdGVkOworcHVibGljOgorICAgIFZpbVdpbmRvdygpOworICAgIH5WaW1XaW5kb3coKTsKKworICAgIHZpcnR1YWwgdm9pZCBEaXNwYXRjaE1lc3NhZ2UoQk1lc3NhZ2UgKm0sIEJIYW5kbGVyICpoKTsKKyAgICB2aXJ0dWFsIHZvaWQgV2luZG93QWN0aXZhdGVkKGJvb2wgYWN0aXZlKTsKKyAgICB2aXJ0dWFsIGJvb2wgUXVpdFJlcXVlc3RlZCgpOworCisgICAgVmltRm9ybVZpZXcJCSpmb3JtVmlldzsKKworcHJpdmF0ZToKKyAgICB2b2lkIGluaXQoKTsKKworfTsKKworY2xhc3MgVmltRm9ybVZpZXc6IHB1YmxpYyBCVmlldworeworICAgIHR5cGVkZWYgQlZpZXcgSW5oZXJpdGVkOworcHVibGljOgorICAgIFZpbUZvcm1WaWV3KEJSZWN0IGZyYW1lKTsKKyAgICB+VmltRm9ybVZpZXcoKTsKKworICAgIC8vIGNhbGxiYWNrczoKKyAgICB2aXJ0dWFsIHZvaWQgQWxsQXR0YWNoZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgRnJhbWVSZXNpemVkKGZsb2F0IG5ld193aWR0aCwgZmxvYXQgbmV3X2hlaWdodCk7CisKKyNkZWZpbmUgTUVOVUJBUl9NQVJHSU4JMQorICAgIGZsb2F0IE1lbnVIZWlnaHQoKSBjb25zdAorCXsgcmV0dXJuIG1lbnVCYXIgPyBtZW51QmFyLT5GcmFtZSgpLkhlaWdodCgpICsgTUVOVUJBUl9NQVJHSU46IDA7IH0KKyAgICBCTWVudUJhciAqTWVudUJhcigpIGNvbnN0CisJeyByZXR1cm4gbWVudUJhcjsgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5pdChCUmVjdCk7CisKKyAgICBCTWVudUJhcgkJKm1lbnVCYXI7CisgICAgVmltVGV4dEFyZWFWaWV3CSp0ZXh0QXJlYTsKK307CisKK2NsYXNzIFZpbVRleHRBcmVhVmlldzogcHVibGljIEJWaWV3Cit7CisgICAgdHlwZWRlZiBCVmlldyBJbmhlcml0ZWQ7CitwdWJsaWM6CisgICAgVmltVGV4dEFyZWFWaWV3KEJSZWN0IGZyYW1lKTsKKyAgICB+VmltVGV4dEFyZWFWaWV3KCk7CisKKyAgICAvLyBjYWxsYmFja3M6CisgICAgdmlydHVhbCB2b2lkIERyYXcoQlJlY3QgdXBkYXRlUmVjdCk7CisgICAgdmlydHVhbCB2b2lkIEtleURvd24oY29uc3QgY2hhciAqYnl0ZXMsIGludDMyIG51bUJ5dGVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgTW91c2VEb3duKEJQb2ludCBwb2ludCk7CisgICAgdmlydHVhbCB2b2lkIE1vdXNlVXAoQlBvaW50IHBvaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgTW91c2VNb3ZlZChCUG9pbnQgcG9pbnQsIHVpbnQzMiB0cmFuc2l0LCBjb25zdCBCTWVzc2FnZSAqbWVzc2FnZSk7CisgICAgdmlydHVhbCB2b2lkIE1lc3NhZ2VSZWNlaXZlZChCTWVzc2FnZSAqbSk7CisKKyAgICAvLyBvd24gZnVuY3Rpb25zOgorICAgIGludCBtY2hJbml0Rm9udChjaGFyX3UgKm5hbWUpOworICAgIHZvaWQgbWNoRHJhd1N0cmluZyhpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncyk7CisgICAgdm9pZCBtY2hDbGVhckJsb2NrKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKTsKKyAgICB2b2lkIG1jaENsZWFyQWxsKCk7CisgICAgdm9pZCBtY2hEZWxldGVMaW5lcyhpbnQgcm93LCBpbnQgbnVtX2xpbmVzKTsKKyAgICB2b2lkIG1jaEluc2VydExpbmVzKGludCByb3csIGludCBudW1fbGluZXMpOworCisgICAgc3RhdGljIHZvaWQgZ3VpU2VuZE1vdXNlRXZlbnQoaW50IGJ1dHRvbiwgaW50IHgsIGludCB5LCBpbnQgcmVwZWF0ZWRfY2xpY2ssIGludF91IG1vZGlmaWVycyk7CisgICAgc3RhdGljIHZvaWQgZ3VpQmxhbmtNb3VzZShib29sIHNob3VsZF9oaWRlKTsKKyAgICBzdGF0aWMgaW50X3UgbW91c2VNb2RpZmllcnNUb1ZpbShpbnQzMiBiZU1vZGlmaWVycyk7CisKKyAgICBpbnQzMiBtb3VzZURyYWdFdmVudENvdW50OworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdChCUmVjdCk7CisKKyAgICBpbnRfdQkgICAgdmltTW91c2VCdXR0b247CisgICAgaW50X3UJICAgIHZpbU1vdXNlTW9kaWZpZXJzOworfTsKKworY2xhc3MgVmltU2Nyb2xsQmFyOiBwdWJsaWMgQlNjcm9sbEJhcgoreworICAgIHR5cGVkZWYgQlNjcm9sbEJhciBJbmhlcml0ZWQ7CitwdWJsaWM6CisgICAgVmltU2Nyb2xsQmFyKHNjcm9sbGJhcl9UICpnc2IsIG9yaWVudGF0aW9uIHBvc3R1cmUpOworICAgIH5WaW1TY3JvbGxCYXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBWYWx1ZUNoYW5nZWQoZmxvYXQgbmV3VmFsdWUpOworICAgIHZpcnR1YWwgdm9pZCBNb3VzZVVwKEJQb2ludCB3aGVyZSk7CisgICAgdm9pZCBTZXRWYWx1ZShmbG9hdCBuZXd2YWwpOworICAgIHNjcm9sbGJhcl9UICpnZXRHc2IoKQorCXsgcmV0dXJuIGdzYjsgfQorCisgICAgaW50MzIJICAgIHNjcm9sbEV2ZW50Q291bnQ7CisKK3ByaXZhdGU6CisgICAgc2Nyb2xsYmFyX1QgKmdzYjsKKyAgICBmbG9hdAlpZ25vcmVWYWx1ZTsKK307CisKKworLyoKKyAqIEZvciBjYWNoaW5nIHRoZSBmb250cyB0aGF0IGFyZSB1c2VkOworICogVmltIHNlZW1zIHJhdGhlciBzbG9wcHkgaW4gdGhpcyByZWdhcmQuCisgKi8KK2NsYXNzIFZpbUZvbnQ6IHB1YmxpYyBCRm9udAoreworICAgIHR5cGVkZWYgQkZvbnQgSW5oZXJpdGVkOworcHVibGljOgorICAgIFZpbUZvbnQoKTsKKyAgICBWaW1Gb250KGNvbnN0IFZpbUZvbnQgKnJocyk7CisgICAgVmltRm9udChjb25zdCBCRm9udCAqcmhzKTsKKyAgICBWaW1Gb250KGNvbnN0IFZpbUZvbnQgJnJocyk7CisgICAgflZpbUZvbnQoKTsKKworICAgIFZpbUZvbnQgKm5leHQ7CisgICAgaW50IHJlZmNvdW50OworICAgIGNoYXJfdSAqbmFtZTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGluaXQoKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gZW5kIG9mIEdVSSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IE1haW5BcmdzIHsKKyAgICBpbnQJCSBhcmdjOworICAgIGNoYXIJKiphcmd2OworfTsKKworLyoKKyAqIFRoZXNlIG1lc3NhZ2VzIGFyZSBjb3BpZWQgdGhyb3VnaCB0aGUgVkRDTVAuCisgKiBUaGVyZWZvcmUgdGhleSBvdWdodCBub3QgdG8gaGF2ZSBhbnl0aGluZyBmYW5jeS4KKyAqIFRoZXkgbXVzdCBiZSBvZiBQT0QgdHlwZSAoUGxhaW4gT2xkIERhdGEpCisgKiBhcyB0aGUgQysrIHN0YW5kYXJkIGNhbGxzIHRoZW0uCisgKi8KKworI2RlZmluZQlLRVlfTVNHX0JVRlNJWgk3CisjaWYgS0VZX01TR19CVUZTSVogPCBNQVhfS0VZX0NPREVfTEVOCisjZXJyb3IgSW5jcmVhc2UgS0VZX01TR19CVUZTSVohCisjZW5kaWYKKworc3RydWN0IFZpbUtleU1zZyB7CisgICAgY2hhcl91CWxlbmd0aDsKKyAgICBjaGFyX3UJY2hhcnNbS0VZX01TR19CVUZTSVpdOwkvKiBjb250YWlucyBWaW0gZW5jb2RpbmcgKi8KK307CisKK3N0cnVjdCBWaW1SZXNpemVNc2cgeworICAgIGludAkJd2lkdGg7CisgICAgaW50CQloZWlnaHQ7Cit9OworCitzdHJ1Y3QgVmltU2Nyb2xsQmFyTXNnIHsKKyAgICBWaW1TY3JvbGxCYXIgKnNiOworICAgIGxvbmcJdmFsdWU7CisgICAgaW50CQlzdGlsbERyYWdnaW5nOworfTsKKworc3RydWN0IFZpbU1lbnVNc2cgeworICAgIHZpbW1lbnVfVAkqZ3VpTWVudTsKK307CisKK3N0cnVjdCBWaW1Nb3VzZU1zZyB7CisgICAgaW50CQlidXR0b247CisgICAgaW50CQl4OworICAgIGludAkJeTsKKyAgICBpbnQJCXJlcGVhdGVkX2NsaWNrOworICAgIGludF91CW1vZGlmaWVyczsKK307CisKK3N0cnVjdCBWaW1Gb2N1c01zZyB7CisgICAgYm9vbAlhY3RpdmU7Cit9OworCitzdHJ1Y3QgVmltUmVmc01zZyB7CisgICAgQk1lc3NhZ2UgICAqbWVzc2FnZTsKKyAgICBib29sCWNoYW5nZWRpcjsKK307CisKK3N0cnVjdCBWaW1Nc2cgeworICAgIGVudW0gVmltTXNnVHlwZSB7CisJS2V5LCBSZXNpemUsIFNjcm9sbEJhciwgTWVudSwgTW91c2UsIEZvY3VzLCBSZWZzCisgICAgfTsKKworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgVmltS2V5TXNnCUtleTsKKwlzdHJ1Y3QgVmltUmVzaXplTXNnCU5ld1NpemU7CisJc3RydWN0IFZpbVNjcm9sbEJhck1zZwlTY3JvbGw7CisJc3RydWN0IFZpbU1lbnVNc2cJTWVudTsKKwlzdHJ1Y3QgVmltTW91c2VNc2cJTW91c2U7CisJc3RydWN0IFZpbUZvY3VzTXNnCUZvY3VzOworCXN0cnVjdCBWaW1SZWZzTXNnCVJlZnM7CisgICAgfSB1OworfTsKKworI2RlZmluZSBSR0IociwgZywgYikJKChjaGFyX3UpKHIpIDw8IDE2IHwgKGNoYXJfdSkoZykgPDwgOCB8IChjaGFyX3UpKGIpIDw8IDApCisjZGVmaW5lIEdVSV9UT19SR0IoZykJeyAoZykgPj4gMTYsIChnKSA+PiA4LCAoZykgPj4gMCwgMjU1IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgaGVhZGVyIHBhcnQgLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHNwZWNpYWxrZXkKK3sKKyAgICB1aW50MTYgIEJlS2V5czsKKyNkZWZpbmUgS0VZKGEsYikJKChhKTw8OHwoYikpCisjZGVmaW5lIEsoYSkJCUtFWSgwLGEpCQkgICAgLy8gZm9yIEFTQ0lJIGNvZGVzCisjZGVmaW5lIEYoYikJCUtFWSgxLGIpCQkgICAgLy8gZm9yIHNjYW5jb2RlcworICAgIGNoYXJfdSAgdmltX2NvZGUwOworICAgIGNoYXJfdSAgdmltX2NvZGUxOworfSBzcGVjaWFsX2tleXNbXSA9Cit7CisgICAge0soQl9VUF9BUlJPVyksCSAgICAnaycsICd1J30sCisgICAge0soQl9ET1dOX0FSUk9XKSwJICAgICdrJywgJ2QnfSwKKyAgICB7SyhCX0xFRlRfQVJST1cpLAkgICAgJ2snLCAnbCd9LAorICAgIHtLKEJfUklHSFRfQVJST1cpLAkgICAgJ2snLCAncid9LAorICAgIHtLKEJfQkFDS1NQQUNFKSwJICAgICdrJywgJ2InfSwKKyAgICB7SyhCX0lOU0VSVCksCSAgICAnaycsICdJJ30sCisgICAge0soQl9ERUxFVEUpLAkgICAgJ2snLCAnRCd9LAorICAgIHtLKEJfSE9NRSksCQkgICAgJ2snLCAnaCd9LAorICAgIHtLKEJfRU5EKSwJCSAgICAnQCcsICc3J30sCisgICAge0soQl9QQUdFX1VQKSwJICAgICdrJywgJ1AnfSwJICAgIC8qIFhLX1ByaW9yICovCisgICAge0soQl9QQUdFX0RPV04pLAkgICAgJ2snLCAnTid9LAkgICAgLyogWEtfTmV4dCwgKi8KKworI2RlZmluZSBGSVJTVF9GVU5DVElPTl9LRVkgIDExCisgICAge0YoQl9GMV9LRVkpLAkgICAgJ2snLCAnMSd9LAorICAgIHtGKEJfRjJfS0VZKSwJICAgICdrJywgJzInfSwKKyAgICB7RihCX0YzX0tFWSksCSAgICAnaycsICczJ30sCisgICAge0YoQl9GNF9LRVkpLAkgICAgJ2snLCAnNCd9LAorICAgIHtGKEJfRjVfS0VZKSwJICAgICdrJywgJzUnfSwKKyAgICB7RihCX0Y2X0tFWSksCSAgICAnaycsICc2J30sCisgICAge0YoQl9GN19LRVkpLAkgICAgJ2snLCAnNyd9LAorICAgIHtGKEJfRjhfS0VZKSwJICAgICdrJywgJzgnfSwKKyAgICB7RihCX0Y5X0tFWSksCSAgICAnaycsICc5J30sCisgICAge0YoQl9GMTBfS0VZKSwJICAgICdrJywgJzsnfSwKKworICAgIHtGKEJfRjExX0tFWSksCSAgICAnRicsICcxJ30sCisgICAge0YoQl9GMTJfS0VZKSwJICAgICdGJywgJzInfSwKKy8vICB7WEtfRjEzLAkJICAgICdGJywgJzMnfSwJCS8qIHdvdWxkIGJlIHByaW50IHNjcmVlbi8gKi8KKwkJCQkJCS8qIHN5c3JlcSAqLworICAgIHtGKDB4MEYpLAkJICAgICdGJywgJzQnfSwJCS8qIHNjcm9sbCBsb2NrICovCisgICAge0YoMHgxMCksCQkgICAgJ0YnLCAnNSd9LAkJLyogcGF1c2UvYnJlYWsgKi8KKy8vICB7WEtfRjE2LAkgICAgJ0YnLCAnNid9LAorLy8gIHtYS19GMTcsCSAgICAnRicsICc3J30sCisvLyAge1hLX0YxOCwJICAgICdGJywgJzgnfSwKKy8vICB7WEtfRjE5LAkgICAgJ0YnLCAnOSd9LAorLy8gIHtYS19GMjAsCSAgICAnRicsICdBJ30sCisvLworLy8gIHtYS19GMjEsCSAgICAnRicsICdCJ30sCisvLyAge1hLX0YyMiwJICAgICdGJywgJ0MnfSwKKy8vICB7WEtfRjIzLAkgICAgJ0YnLCAnRCd9LAorLy8gIHtYS19GMjQsCSAgICAnRicsICdFJ30sCisvLyAge1hLX0YyNSwJICAgICdGJywgJ0YnfSwKKy8vICB7WEtfRjI2LAkgICAgJ0YnLCAnRyd9LAorLy8gIHtYS19GMjcsCSAgICAnRicsICdIJ30sCisvLyAge1hLX0YyOCwJICAgICdGJywgJ0knfSwKKy8vICB7WEtfRjI5LAkgICAgJ0YnLCAnSid9LAorLy8gIHtYS19GMzAsCSAgICAnRicsICdLJ30sCisvLworLy8gIHtYS19GMzEsCSAgICAnRicsICdMJ30sCisvLyAge1hLX0YzMiwJICAgICdGJywgJ00nfSwKKy8vICB7WEtfRjMzLAkgICAgJ0YnLCAnTid9LAorLy8gIHtYS19GMzQsCSAgICAnRicsICdPJ30sCisvLyAge1hLX0YzNSwJICAgICdGJywgJ1AnfSwJICAgIC8qIGtleXN5bWRlZi5oIGRlZmluZXMgdXAgdG8gRjM1ICovCisKKy8vICB7WEtfSGVscCwJICAgICclJywgJzEnfSwJICAgIC8qIFhLX0hlbHAgKi8KKyAgICB7RihCX1BSSU5UX0tFWSksCSAgICAnJScsICc5J30sCisKKyNpZiAwCisgICAgLyogS2V5cGFkIGtleXM6ICovCisgICAge0YoMHg0OCksCSAgICAnaycsICdsJ30sCSAgICAvKiBYS19LUF9MZWZ0ICovCisgICAge0YoMHg0QSksCSAgICAnaycsICdyJ30sCSAgICAvKiBYS19LUF9SaWdodCAqLworICAgIHtGKDB4MzgpLAkgICAgJ2snLCAndSd9LAkgICAgLyogWEtfS1BfVXAgKi8KKyAgICB7RigweDU5KSwJICAgICdrJywgJ2QnfSwJICAgIC8qIFhLX0tQX0Rvd24gKi8KKyAgICB7RigweDY0KSwJICAgICdrJywgJ0knfSwJICAgIC8qIFhLX0tQX0luc2VydCAqLworICAgIHtGKDB4NjUpLAkgICAgJ2snLCAnRCd9LAkgICAgLyogWEtfS1BfRGVsZXRlICovCisgICAge0YoMHgzNyksCSAgICAnaycsICdoJ30sCSAgICAvKiBYS19LUF9Ib21lICovCisgICAge0YoMHg1OCksCSAgICAnQCcsICc3J30sCSAgICAvKiBYS19LUF9FbmQgKi8KKyAgICB7RigweDM5KSwJICAgICdrJywgJ1AnfSwJICAgIC8qIFhLX0tQX1ByaW9yICovCisgICAge0YoMHg2MCksCSAgICAnaycsICdOJ30sCSAgICAvKiBYS19LUF9OZXh0ICovCisgICAge0YoMHg0OSksCSAgICAnJicsICc4J30sCSAgICAvKiBYS19VbmRvLCBrZXlwYWQgNSAqLworI2VuZGlmCisKKyAgICAvKiBFbmQgb2YgbGlzdCBtYXJrZXI6ICovCisgICAgezAsCQkJICAgIDAsIDB9Cit9OworCisjZGVmaW5lIE5VTV9TUEVDSUFMX0tFWVMgICAgKHNpemVvZihzcGVjaWFsX2tleXMpL3NpemVvZihzcGVjaWFsX2tleXNbMF0pKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tIFZpbUFwcCAtLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBzdGF0aWMgdm9pZAorZG9jZChCUGF0aCAmcGF0aCkKK3sKKyAgICBtY2hfY2hkaXIocGF0aC5QYXRoKCkpOworICAgIC8qIERvIHRoaXMgdG8gZ2V0IHRoZSBzaWRlIGVmZmVjdHMgb2YgYSA6Y2QgY29tbWFuZCAqLworICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiY2QgLiIpOworfQorCisvKgorICogUmVhbGx5IGhhbmRsZSBkcm9wcGVkIGZpbGVzIGFuZCBmb2xkZXJzLgorICovCisgICAgc3RhdGljIHZvaWQKK1JlZnNSZWNlaXZlZChCTWVzc2FnZSAqbSwgYm9vbCBjaGFuZ2VkaXIpCit7CisgICAgdWludDMyIHR5cGU7CisgICAgaW50MzIgY291bnQ7CisKKyAgICAvL20tPlByaW50VG9TdHJlYW0oKTsKKyAgICBzd2l0Y2ggKG0tPndoYXQpIHsKKyAgICBjYXNlIEJfUkVGU19SRUNFSVZFRDoKKyAgICBjYXNlIEJfU0lNUExFX0RBVEE6CisJbS0+R2V0SW5mbygicmVmcyIsICZ0eXBlLCAmY291bnQpOworCWlmICh0eXBlICE9IEJfUkVGX1RZUEUpCisJICAgIGdvdG8gYmFkOworCWJyZWFrOworICAgIGNhc2UgQl9BUkdWX1JFQ0VJVkVEOgorCW0tPkdldEluZm8oImFyZ3YiLCAmdHlwZSwgJmNvdW50KTsKKwlpZiAodHlwZSAhPSBCX1NUUklOR19UWVBFKQorCSAgICBnb3RvIGJhZDsKKwlpZiAoY2hhbmdlZGlyKSB7CisJICAgIGNoYXIgKmRpcm5hbWU7CisJICAgIGlmIChtLT5GaW5kU3RyaW5nKCJjd2QiLCAoY29uc3QgY2hhciAqKikgJmRpcm5hbWUpID09IEJfT0spIHsKKwkJY2hkaXIoZGlybmFtZSk7CisJCWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiY2QgLiIpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgYmFkOgorCS8vZnByaW50ZihzdGRlcnIsICJiYWQhXG4iKTsKKwlkZWxldGUgbTsKKwlyZXR1cm47CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICByZXNldF9WSXN1YWwoKTsKKyNlbmRpZgorCisgICAgY2hhcl91ICAqKmZuYW1lczsKKyAgICBmbmFtZXMgPSAoY2hhcl91ICoqKSBhbGxvYyhjb3VudCAqIHNpemVvZihjaGFyX3UgKikpOworICAgIGludCBmbmFtZV9pbmRleCA9IDA7CisKKyAgICBzd2l0Y2ggKG0tPndoYXQpIHsKKyAgICBjYXNlIEJfUkVGU19SRUNFSVZFRDoKKyAgICBjYXNlIEJfU0lNUExFX0RBVEE6CisJLy9mcHJpbnRmKHN0ZGVyciwgImNhc2UgQl9SRUZTX1JFQ0VJVkVEXG4iKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisJeworCSAgICBlbnRyeV9yZWYgcmVmOworCSAgICBpZiAobS0+RmluZFJlZigicmVmcyIsIGksICZyZWYpID09IEJfT0spIHsKKwkJQkVudHJ5IGVudHJ5KCZyZWYsIGZhbHNlKTsKKwkJQlBhdGggcGF0aDsKKwkJZW50cnkuR2V0UGF0aCgmcGF0aCk7CisKKwkJLyogQ2hhbmdlIHRvIHBhcmVudCBkaXJlY3Rvcnk/ICovCisJCWlmIChjaGFuZ2VkaXIpIHsKKwkJICAgIEJQYXRoIHBhcmVudHBhdGg7CisJCSAgICBwYXRoLkdldFBhcmVudCgmcGFyZW50cGF0aCk7CisJCSAgICBkb2NkKHBhcmVudHBhdGgpOworCQl9CisKKwkJLyogSXMgaXQgYSBkaXJlY3Rvcnk/IElmIHNvLCBjZCBpbnRvIGl0LiAqLworCQlCRGlyZWN0b3J5IGJkaXIoJnJlZik7CisJCWlmIChiZGlyLkluaXRDaGVjaygpID09IEJfT0spIHsKKwkJICAgIC8qIGRvbid0IGNkIGlmIHdlIGFscmVhZHkgZGlkIGl0ICovCisJCSAgICBpZiAoIWNoYW5nZWRpcikKKwkJCWRvY2QocGF0aCk7CisJCX0gZWxzZSB7CisJCSAgICBtY2hfZGlybmFtZShJT2J1ZmYsIElPU0laRSk7CisJCSAgICBjaGFyX3UgKmZuYW1lID0gc2hvcnRlbl9mbmFtZSgoY2hhcl91ICopcGF0aC5QYXRoKCksIElPYnVmZik7CisJCSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwkJCWZuYW1lID0gKGNoYXJfdSAqKXBhdGguUGF0aCgpOworCQkgICAgZm5hbWVzW2ZuYW1lX2luZGV4KytdID0gdmltX3N0cnNhdmUoZm5hbWUpOworCQkgICAgLy9mcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBmbmFtZSk7CisJCX0KKworCQkvKiBPbmx5IGRvIGl0IGZvciB0aGUgZmlyc3QgZmlsZS9kaXIgKi8KKwkJY2hhbmdlZGlyID0gZmFsc2U7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgY2FzZSBCX0FSR1ZfUkVDRUlWRUQ6CisJLy9mcHJpbnRmKHN0ZGVyciwgImNhc2UgQl9BUkdWX1JFQ0VJVkVEXG4iKTsKKwlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyArK2kpCisJeworCSAgICBjaGFyICpmbmFtZTsKKworCSAgICBpZiAobS0+RmluZFN0cmluZygiYXJndiIsIGksIChjb25zdCBjaGFyICoqKSAmZm5hbWUpID09IEJfT0spIHsKKwkJZm5hbWVzW2ZuYW1lX2luZGV4KytdID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKWZuYW1lKTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCS8vZnByaW50ZihzdGRlcnIsICJjYXNlIGRlZmF1bHRcbiIpOworCWJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZSBtOworCisgICAgLyogSGFuZGxlIHRoZSBkcm9wLCA6ZWRpdCB0byBnZXQgdG8gdGhlIGZpbGUgKi8KKyAgICBpZiAoZm5hbWVfaW5kZXggPiAwKSB7CisJaGFuZGxlX2Ryb3AoZm5hbWVfaW5kZXgsIGZuYW1lcywgRkFMU0UpOworCisJLyogVXBkYXRlIHRoZSBzY3JlZW4gZGlzcGxheSAqLworCXVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKwlzZXRjdXJzb3IoKTsKKwlvdXRfZmx1c2goKTsKKyAgICB9IGVsc2UgeworCXZpbV9mcmVlKGZuYW1lcyk7CisgICAgfQorfQorCitWaW1BcHA6OlZpbUFwcChjb25zdCBjaGFyICphcHBzaWcpOgorICAgIEJBcHBsaWNhdGlvbihhcHBzaWcpCit7Cit9CisKK1ZpbUFwcDo6flZpbUFwcCgpCit7Cit9CisKKyAgICB2b2lkCitWaW1BcHA6OlJlYWR5VG9SdW4oKQoreworICAgIC8qCisgICAgICogQXBwYXJlbnRseSBzaWduYWxzIGFyZSBpbmhlcml0ZWQgYnkgdGhlIGNyZWF0ZWQgdGhyZWFkIC0KKyAgICAgKiBkaXNhYmxlIHRoZSBtb3N0IGFubm95aW5nIG9uZXMuCisgICAgICovCisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisgICAgc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworfQorCisgICAgdm9pZAorVmltQXBwOjpBcmd2UmVjZWl2ZWQoaW50MzIgYXJnX2FyZ2MsIGNoYXIgKiphcmdfYXJndikKK3sKKyAgICBpZiAoIUlzTGF1bmNoaW5nKCkpIHsKKwkvKgorCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBhcmUgc2V0IHRvIFNpbmdsZSBvciBFeGNsdXNpdmUKKwkgKiBMYXVuY2guIEJlIG5pY2UgYW5kIG9wZW4gdGhlIGZpbGUocykuCisJICovCisJaWYgKGd1aS52aW1XaW5kb3cpCisJICAgIGd1aS52aW1XaW5kb3ctPk1pbmltaXplKGZhbHNlKTsKKwlCTWVzc2FnZSAqbSA9IEN1cnJlbnRNZXNzYWdlKCk7CisJRGV0YWNoQ3VycmVudE1lc3NhZ2UoKTsKKwlTZW5kUmVmcyhtLCB0cnVlKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitWaW1BcHA6OlJlZnNSZWNlaXZlZChCTWVzc2FnZSAqbSkKK3sKKyAgICAvKiBIb3JyaWJsZSBoYWNrISEhIFhYWCBYWFggWFhYCisgICAgICogVGhlIHJlYWwgcHJvYmxlbSBpcyB0aGF0IGJfc3RhcnRfZmZjIGlzIHNldCB0b28gbGF0ZSBmb3IKKyAgICAgKiB0aGUgaW5pdGlhbCBlbXB0eSBidWZmZXIuIEFzIGEgcmVzdWx0IHRoZSB3aW5kb3cgd2lsbCBiZQorICAgICAqIHNwbGl0IGluc3RlYWQgb2YgYWJhbmRvbmVkLgorICAgICAqLworICAgIGludCBsaW1pdCA9IDE1OworICAgIHdoaWxlICgtLWxpbWl0ID49IDAgJiYgKGN1cmJ1ZiA9PSBOVUxMIHx8IGN1cmJ1Zi0+Yl9zdGFydF9mZmMgPT0gMCkpCisJc25vb3plKDEwMDAwMCk7ICAgIC8vIDAuMSBzCisgICAgaWYgKGd1aS52aW1XaW5kb3cpCisJZ3VpLnZpbVdpbmRvdy0+TWluaW1pemUoZmFsc2UpOworICAgIERldGFjaEN1cnJlbnRNZXNzYWdlKCk7CisgICAgU2VuZFJlZnMobSwgdHJ1ZSk7Cit9CisKKy8qCisgKiBQYXNzIGEgQk1lc3NhZ2Ugb24gdG8gdGhlIG1haW4oKSB0aHJlYWQuCisgKiBDYWxsZXIgbXVzdCBoYXZlIGRldGFjaGVkIHRoZSBtZXNzYWdlLgorICovCisgICAgdm9pZAorVmltQXBwOjpTZW5kUmVmcyhCTWVzc2FnZSAqbSwgYm9vbCBjaGFuZ2VkaXIpCit7CisgICAgVmltUmVmc01zZyBybTsKKyAgICBybS5tZXNzYWdlID0gbTsKKyAgICBybS5jaGFuZ2VkaXIgPSBjaGFuZ2VkaXI7CisKKyAgICB3cml0ZV9wb3J0KGd1aS52ZGNtcCwgVmltTXNnOjpSZWZzLCAmcm0sIHNpemVvZihybSkpOworICAgIC8vIGNhbGxzIDo6UmVmc1JlY2VpdmVkCit9CisKKyAgICBib29sCitWaW1BcHA6OlF1aXRSZXF1ZXN0ZWQoKQoreworICAgICh2b2lkKUluaGVyaXRlZDo6UXVpdFJlcXVlc3RlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLSBWaW1XaW5kb3cgLS0tLS0tLS0tLS0tLS0tLSAqLworCitWaW1XaW5kb3c6OlZpbVdpbmRvdygpOgorICAgIEJXaW5kb3coQlJlY3QoNDAsIDQwLCAxNTAsIDE1MCksCisJICAgICJWaW0iLAorCSAgICBCX1RJVExFRF9XSU5ET1csCisJICAgIDAsCisJICAgIEJfQ1VSUkVOVF9XT1JLU1BBQ0UpCisKK3sKKyAgICBpbml0KCk7Cit9CisKK1ZpbVdpbmRvdzo6flZpbVdpbmRvdygpCit7CisgICAgaWYgKGZvcm1WaWV3KSB7CisJUmVtb3ZlQ2hpbGQoZm9ybVZpZXcpOworCWRlbGV0ZSBmb3JtVmlldzsKKyAgICB9CisgICAgZ3VpLnZpbVdpbmRvdyA9IE5VTEw7Cit9CisKKyAgICB2b2lkCitWaW1XaW5kb3c6OmluaXQoKQoreworICAgIC8qIEF0dGFjaCB0aGUgVmltRm9ybVZpZXcgKi8KKyAgICBmb3JtVmlldyA9IG5ldyBWaW1Gb3JtVmlldyhCb3VuZHMoKSk7CisgICAgaWYgKGZvcm1WaWV3ICE9IE5VTEwpIHsKKwlBZGRDaGlsZChmb3JtVmlldyk7CisgICAgfQorfQorCisgICAgdm9pZAorVmltV2luZG93OjpEaXNwYXRjaE1lc3NhZ2UoQk1lc3NhZ2UgKm0sIEJIYW5kbGVyICpoKQoreworICAgIC8qCisgICAgICogUm91dGUgQl9NT1VTRV9VUCBtZXNzYWdlcyB0byBNb3VzZVVwKCksIGluCisgICAgICogYSBtYW5uZXIgdGhhdCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAqIGludGVuZGVkIGZ1dHVyZSBzeXN0ZW0gYmVoYXZpb3VyLgorICAgICAqLworICAgIHN3aXRjaCAobS0+d2hhdCkgeworICAgIGNhc2UgQl9NT1VTRV9VUDoKKwkvLyBpZiAoIWgpIGggPSBQcmVmZXJyZWRIYW5kbGVyKCk7CisvLyBnY2MgaXNuJ3QgaGFwcHkgd2l0aG91dCB0aGlzIGV4dHJhIHNldCBvZiBicmFjZXMsIGNvbXBsYWlucyBhYm91dAorLy8ganVtcCB0byBjYXNlIGxhYmVsIGNyb3NzZXMgaW5pdCBvZiAnY2xhc3MgQlZpZXcgKiB2JworLy8gcmljaGFyZEB3aGl0ZXF1ZWVuLmNvbSBqdWwgOTkKKwl7CisJQlZpZXcgKnYgPSBkeW5hbWljX2Nhc3Q8QlZpZXcgKj4oaCk7CisJaWYgKHYpIHsKKwkgICAgLy9tLT5QcmludFRvU3RyZWFtKCk7CisJICAgIEJQb2ludCB3aGVyZTsKKwkgICAgbS0+RmluZFBvaW50KCJ3aGVyZSIsICZ3aGVyZSk7CisJICAgIHYtPk1vdXNlVXAod2hlcmUpOworCX0gZWxzZSB7CisJICAgIEluaGVyaXRlZDo6RGlzcGF0Y2hNZXNzYWdlKG0sIGgpOworCX0KKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlJbmhlcml0ZWQ6OkRpc3BhdGNoTWVzc2FnZShtLCBoKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitWaW1XaW5kb3c6OldpbmRvd0FjdGl2YXRlZChib29sIGFjdGl2ZSkKK3sKKyAgICBJbmhlcml0ZWQ6OldpbmRvd0FjdGl2YXRlZChhY3RpdmUpOworICAgIC8qIHRoZSB0ZXh0QXJlYSBnZXRzIHRoZSBrZXlib2FyZCBhY3Rpb24gKi8KKyAgICBpZiAoYWN0aXZlICYmIGd1aS52aW1UZXh0QXJlYSkKKwlndWkudmltVGV4dEFyZWEtPk1ha2VGb2N1cyh0cnVlKTsKKworICAgIHN0cnVjdCBWaW1Gb2N1c01zZyBmbTsKKyAgICBmbS5hY3RpdmUgPSBhY3RpdmU7CisKKyAgICB3cml0ZV9wb3J0KGd1aS52ZGNtcCwgVmltTXNnOjpGb2N1cywgJmZtLCBzaXplb2YoZm0pKTsKK30KKworICAgIGJvb2wKK1ZpbVdpbmRvdzo6UXVpdFJlcXVlc3RlZCgpCit7CisgICAgc3RydWN0IFZpbUtleU1zZyBrbTsKKyAgICBrbS5sZW5ndGggPSA1OworICAgIG1lbWNweSgoY2hhciAqKWttLmNoYXJzLCAiXDAzMzpxYVxyIiwga20ubGVuZ3RoKTsKKworICAgIHdyaXRlX3BvcnQoZ3VpLnZkY21wLCBWaW1Nc2c6OktleSwgJmttLCBzaXplb2Yoa20pKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLSBWaW1Gb3JtVmlldyAtLS0tLS0tLS0tLS0tLS0tICovCisKK1ZpbUZvcm1WaWV3OjpWaW1Gb3JtVmlldyhCUmVjdCBmcmFtZSk6CisgICAgQlZpZXcoZnJhbWUsICJWaW1Gb3JtVmlldyIsIEJfRk9MTE9XX0FMTF9TSURFUywKKwkgICAgQl9XSUxMX0RSQVcgfCBCX0ZSQU1FX0VWRU5UUyksCisgICAgbWVudUJhcihOVUxMKSwKKyAgICB0ZXh0QXJlYShOVUxMKQoreworICAgIGluaXQoZnJhbWUpOworfQorCitWaW1Gb3JtVmlldzo6flZpbUZvcm1WaWV3KCkKK3sKKyAgICBpZiAobWVudUJhcikgeworCVJlbW92ZUNoaWxkKG1lbnVCYXIpOworI2lmZGVmIG5ldmVyCisJLy8gZGVsZXRpbmcgdGhlIG1lbnVCYXIgbGVhZHMgdG8gU0VHViBvbiBleGl0CisJLy8gcmljaGFyZEB3aGl0ZXF1ZWVuLmNvbSBKdWwgOTkKKwlkZWxldGUgbWVudUJhcjsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAodGV4dEFyZWEpIHsKKwlSZW1vdmVDaGlsZCh0ZXh0QXJlYSk7CisJZGVsZXRlIHRleHRBcmVhOworICAgIH0KKyAgICBndWkudmltRm9ybSA9IE5VTEw7Cit9CisKKyAgICB2b2lkCitWaW1Gb3JtVmlldzo6aW5pdChCUmVjdCBmcmFtZSkKK3sKKyAgICBtZW51QmFyID0gbmV3IEJNZW51QmFyKEJSZWN0KDAsMCwtTUVOVUJBUl9NQVJHSU4sLU1FTlVCQVJfTUFSR0lOKSwKKwkgICAgIlZpbU1lbnVCYXIiKTsKKworICAgIEFkZENoaWxkKG1lbnVCYXIpOworCisgICAgQlJlY3QgcmVtYWluaW5nID0gZnJhbWU7CisgICAgdGV4dEFyZWEgPSBuZXcgVmltVGV4dEFyZWFWaWV3KHJlbWFpbmluZyk7CisgICAgQWRkQ2hpbGQodGV4dEFyZWEpOworICAgIC8qIFRoZSB0ZXh0QXJlYSB3aWxsIGJlIHJlc2l6ZWQgbGF0ZXIgd2hlbiBtZW51cyBhcmUgYWRkZWQgKi8KKworICAgIGd1aS52aW1Gb3JtID0gdGhpczsKK30KKworICAgIHZvaWQKK1ZpbUZvcm1WaWV3OjpBbGxBdHRhY2hlZCgpCit7CisgICAgLyoKKyAgICAgKiBBcHBhcmVudGx5IHNpZ25hbHMgYXJlIGluaGVyaXRlZCBieSB0aGUgY3JlYXRlZCB0aHJlYWQgLQorICAgICAqIGRpc2FibGUgdGhlIG1vc3QgYW5ub3lpbmcgb25lcy4KKyAgICAgKi8KKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKyAgICBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CisKKyAgICBpZiAobWVudUJhciAmJiB0ZXh0QXJlYSkgeworCS8qCisJICogUmVzaXplIHRoZSB0ZXh0QXJlYSB0byBmaWxsIHRoZSBzcGFjZSBsZWZ0IG92ZXIgYnkgdGhlIG1lbnUuCisJICogVGhpcyBpcyBzb21ld2hhdCBmdXRpbGUgc2luY2UgaXQgd2lsbCBiZSBkb25lIGFnYWluIG9uY2UKKwkgKiBtZW51cyBhcmUgYWRkZWQgdG8gdGhlIG1lbnUgYmFyLgorCSAqLworCUJSZWN0IHJlbWFpbmluZyA9IEJvdW5kcygpOworCXJlbWFpbmluZy50b3AgPSBNZW51SGVpZ2h0KCk7CisJdGV4dEFyZWEtPlJlc2l6ZVRvKHJlbWFpbmluZy5XaWR0aCgpLCByZW1haW5pbmcuSGVpZ2h0KCkpOworCXRleHRBcmVhLT5Nb3ZlVG8ocmVtYWluaW5nLmxlZnQsIHJlbWFpbmluZy50b3ApOworCisjaWZkZWYgRkVBVF9NRU5VCisJbWVudUJhci0+UmVzaXplVG8ocmVtYWluaW5nLnJpZ2h0LCByZW1haW5pbmcudG9wKTsKKwlndWkubWVudV9oZWlnaHQgPSAoaW50KSByZW1haW5pbmcudG9wOworI2VuZGlmCisgICAgfQorICAgIEluaGVyaXRlZDo6QWxsQXR0YWNoZWQoKTsKK30KKworICAgIHZvaWQKK1ZpbUZvcm1WaWV3OjpGcmFtZVJlc2l6ZWQoZmxvYXQgbmV3X3dpZHRoLCBmbG9hdCBuZXdfaGVpZ2h0KQoreworICAgIEJXaW5kb3cgKncgPSBXaW5kb3coKTsKKyNpZiAxCisgICAgLyoKKyAgICAgKiBMb29rIGlmIHRoZXJlIGFyZSBtb3JlIHJlc2l6ZSBtZXNzYWdlcyBpbiB0aGUgcXVldWUuCisgICAgICogSWYgc28sIGlnbm9yZSB0aGlzIG9uZS4gVGhlIGxhdGVyIG9uZSB3aWxsIGJlIGhhbmRsZWQKKyAgICAgKiBldmVudHVhbGx5LgorICAgICAqLworICAgIEJNZXNzYWdlUXVldWUgKnEgPSB3LT5NZXNzYWdlUXVldWUoKTsKKyAgICBpZiAocS0+RmluZE1lc3NhZ2UoQl9WSUVXX1JFU0laRUQsIDApICE9IE5VTEwpIHsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgbmV3X3dpZHRoICs9IDE7CSAgICAvLyBhZGp1c3QgZnJvbSB3aWR0aCB0byBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkCisgICAgbmV3X2hlaWdodCArPSAxOworCisjaWYgIUhBVkVfUjNfT1JfTEFURVIKKyAgICBpbnQgYWRqdXN0X2gsIGFkanVzdF93OworCisgICAgYWRqdXN0X3cgPSAoKGludCluZXdfd2lkdGggLSBndWlfZ2V0X2Jhc2Vfd2lkdGgoKSkgJSBndWkuY2hhcl93aWR0aDsKKyAgICBhZGp1c3RfaCA9ICgoaW50KW5ld19oZWlnaHQgLSBndWlfZ2V0X2Jhc2VfaGVpZ2h0KCkpICUgZ3VpLmNoYXJfaGVpZ2h0OworCisgICAgaWYgKGFkanVzdF93ID4gMCB8fCBhZGp1c3RfaCA+IDApIHsKKwkvKgorCSAqIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIG5ldyBGcmFtZVJlc2l6ZWQoKSBtZXNzYWdlLgorCSAqIElmIHdlJ3JlIHJ1bm5pbmcgUjMgb3IgbGF0ZXIsIFNldFdpbmRvd0FsaWdubWVudCgpIHNob3VsZCBtYWtlCisJICogc3VyZSB0aGF0IHRoaXMgZG9lcyBub3QgaGFwcGVuLgorCSAqLworCXctPlJlc2l6ZUJ5KC1hZGp1c3RfdywgLWFkanVzdF9oKTsKKworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cnVjdCBWaW1SZXNpemVNc2cgc207CisgICAgc20ud2lkdGggPSAoaW50KSBuZXdfd2lkdGg7CisgICAgc20uaGVpZ2h0ID0gKGludCkgbmV3X2hlaWdodDsKKworICAgIHdyaXRlX3BvcnQoZ3VpLnZkY21wLCBWaW1Nc2c6OlJlc2l6ZSwgJnNtLCBzaXplb2Yoc20pKTsKKyAgICAvLyBjYWxscyBndWlfcmVzaXplX3NoZWxsKG5ld193aWR0aCwgbmV3X2hlaWdodCk7CisKKyAgICByZXR1cm47CisKKyAgICAvKgorICAgICAqIFRoZSBhcmVhIGJlbG93IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgZXJhc2VkIHRvIHRoZSBjb2xvdXIKKyAgICAgKiBzZXQgd2l0aCBTZXRWaWV3Q29sb3IoKSBhdXRvbWF0aWNhbGx5LCBiZWNhdXNlIHdlIGhhZCBzZXQKKyAgICAgKiBCX1dJTExfRFJBVy4gUmVzaXppbmcgdGhlIHdpbmRvdyB0aWdodCBhcm91bmQgdGhlIHZlcnRpY2FsCisgICAgICogc2Nyb2xsIGJhciBhbHNvIGhlbHBzIHRvIGF2b2lkIGRlYnJpcy4KKyAgICAgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLSBWaW1UZXh0QXJlYVZpZXcgLS0tLS0tLS0tLS0tLS0tLSAqLworCitWaW1UZXh0QXJlYVZpZXc6OlZpbVRleHRBcmVhVmlldyhCUmVjdCBmcmFtZSk6CisgICAgQlZpZXcoZnJhbWUsICJWaW1UZXh0QXJlYVZpZXciLCBCX0ZPTExPV19BTExfU0lERVMsCisJICAgIEJfV0lMTF9EUkFXIHwgQl9GVUxMX1VQREFURV9PTl9SRVNJWkUpLAorICAgIG1vdXNlRHJhZ0V2ZW50Q291bnQoMCkKK3sKKyAgICBpbml0KGZyYW1lKTsKK30KKworVmltVGV4dEFyZWFWaWV3Ojp+VmltVGV4dEFyZWFWaWV3KCkKK3sKKyAgICBndWkudmltVGV4dEFyZWEgPSBOVUxMOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3Ojppbml0KEJSZWN0IGZyYW1lKQoreworICAgIC8qIHNldCB1cCBnbG9iYWwgdmFyIGZvciBmYXN0IGFjY2VzcyAqLworICAgIGd1aS52aW1UZXh0QXJlYSA9IHRoaXM7CisKKyAgICAvKgorICAgICAqIFRlbGwgdGhlIGFwcCBzZXJ2ZXIgbm90IHRvIGVyYXNlIHRoZSB2aWV3OiB3ZSB3aWxsCisgICAgICogZmlsbCBpdCBpbiBjb21wbGV0ZWx5IGJ5IG91cnNlbHZlcy4KKyAgICAgKiAoRG9lcyB0aGlzIHJlYWxseSB3b3JrPyBFdmVuIGlmIG5vdCwgaXQgd29uJ3QgaGFybSBlaXRoZXIuKQorICAgICAqLworICAgIFNldFZpZXdDb2xvcihCX1RSQU5TUEFSRU5UXzMyX0JJVCk7CisjZGVmaW5lIFBFTl9XSURUSCAgIDEKKyAgICBTZXRQZW5TaXplKFBFTl9XSURUSCk7Cit9CisKKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6OkRyYXcoQlJlY3QgdXBkYXRlUmVjdCkKK3sKKyAgICAvKgorICAgICAqIFhYWCBPdGhlciBwb3J0cyBjYWxsIGhlcmU6CisgICAgICogb3V0X2ZsdXNoKCk7CSAgICAgKiBtYWtlIHN1cmUgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9jZXNzZWQgKgorICAgICAqIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0LCBzaW5jZSBpdCBpbnZvbHZlcyB0b28gbXVjaCBpbmZvcm1hdGlvbgorICAgICAqIHRoYXQgaXMgb3duZWQgYnkgb3RoZXIgdGhyZWFkcy4uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiAgTm8gbmVlZCB0byB1c2UgZ3VpLnZpbVdpbmRvdy0+TG9jaygpOiB3ZSBhcmUgbG9ja2VkIGFscmVhZHkuCisgICAgICogIEhvd2V2ZXIsIGl0IHdvdWxkIG5vdCBodXJ0LgorICAgICAqLworICAgIGd1aV9yZWRyYXcoKGludCkgdXBkYXRlUmVjdC5sZWZ0LCAoaW50KSB1cGRhdGVSZWN0LnRvcCwKKwkgICAgKGludCkgKHVwZGF0ZVJlY3QuV2lkdGgoKSArIFBFTl9XSURUSCksIChpbnQpICh1cGRhdGVSZWN0LkhlaWdodCgpICsgUEVOX1dJRFRIKSk7CisKKyAgICAvKiBDbGVhciB0aGUgYm9yZGVyIGFyZWFzIGlmIG5lZWRlZCAqLworICAgIHJnYl9jb2xvciByZ2IgPSBHVUlfVE9fUkdCKGd1aS5iYWNrX3BpeGVsKTsKKyAgICBTZXRMb3dDb2xvcihyZ2IpOworCisgICAgaWYgKHVwZGF0ZVJlY3QubGVmdCA8IEZJTExfWCgwKSkJLy8gbGVmdCBib3JkZXIKKwlGaWxsUmVjdChCUmVjdCh1cGRhdGVSZWN0LmxlZnQsIHVwZGF0ZVJlY3QudG9wLAorCQkgICAgICAgRklMTF9YKDApLVBFTl9XSURUSCwgdXBkYXRlUmVjdC5ib3R0b20pLCBCX1NPTElEX0xPVyk7CisgICAgaWYgKHVwZGF0ZVJlY3QudG9wIDwgRklMTF9ZKDApKQkvLyB0b3AgYm9yZGVyCisJRmlsbFJlY3QoQlJlY3QodXBkYXRlUmVjdC5sZWZ0LCB1cGRhdGVSZWN0LnRvcCwKKwkJICAgICAgIHVwZGF0ZVJlY3QucmlnaHQsIEZJTExfWSgwKS1QRU5fV0lEVEgpLCBCX1NPTElEX0xPVyk7CisgICAgaWYgKHVwZGF0ZVJlY3QucmlnaHQgPj0gRklMTF9YKENvbHVtbnMpKSAvLyByaWdodCBib3JkZXIKKwlGaWxsUmVjdChCUmVjdChGSUxMX1goKGludClDb2x1bW5zKSwgdXBkYXRlUmVjdC50b3AsCisJCSAgICAgICB1cGRhdGVSZWN0LnJpZ2h0LCB1cGRhdGVSZWN0LmJvdHRvbSksIEJfU09MSURfTE9XKTsKKyAgICBpZiAodXBkYXRlUmVjdC5ib3R0b20gPj0gRklMTF9ZKFJvd3MpKSAgIC8vIGJvdHRvbSBib3JkZXIKKwlGaWxsUmVjdChCUmVjdCh1cGRhdGVSZWN0LmxlZnQsIEZJTExfWSgoaW50KVJvd3MpLAorCQkgICAgICAgdXBkYXRlUmVjdC5yaWdodCwgdXBkYXRlUmVjdC5ib3R0b20pLCBCX1NPTElEX0xPVyk7Cit9CisKKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6OktleURvd24oY29uc3QgY2hhciAqYnl0ZXMsIGludDMyIG51bUJ5dGVzKQoreworICAgIHN0cnVjdCBWaW1LZXlNc2cga207CisgICAgY2hhcl91ICpkZXN0ID0ga20uY2hhcnM7CisKKyAgICBCTWVzc2FnZSAqbXNnID0gV2luZG93KCktPkN1cnJlbnRNZXNzYWdlKCk7CisgICAgYXNzZXJ0KG1zZyk7CisgICAgLy9tc2ctPlByaW50VG9TdHJlYW0oKTsKKworICAgIC8qCisgICAgICogQ29udmVydCBzcGVjaWFsIGtleXMgdG8gVmltIGNvZGVzLgorICAgICAqIEkgdGhpbmsgaXQgaXMgYmV0dGVyIHRvIGRvIGl0IGluIHRoZSB3aW5kb3cgdGhyZWFkCisgICAgICogc28gd2UgdXNlIGF0IGxlYXN0IGEgbGl0dGxlIGJpdCBvZiB0aGUgcG90ZW50aWFsCisgICAgICogb2Ygb3VyIDIgQ1BVcy4gQmVzaWRlcywgZHVlIHRvIHRoZSBmYW50YXN0aWMgbWFwcGluZworICAgICAqIG9mIHNwZWNpYWwga2V5cyB0byBVVEYtOCwgd2UgaGF2ZSBxdWl0ZSBzb21lIHdvcmsgdG8KKyAgICAgKiBkby4uLgorICAgICAqIFRPRE86IEknbSBub3QgcXVpdGUgaGFwcHkgd2l0aCBkZXRlY3Rpb24gb2Ygc3BlY2lhbAorICAgICAqIGtleXMuIFBlcmhhcHMgSSBzaG91bGQgdXNlIHNjYW4gY29kZXMgYWZ0ZXIgYWxsLi4uCisgICAgICovCisgICAgaWYgKG51bUJ5dGVzID4gMSkgeworCS8qIFRoaXMgY2Fubm90IGJlIGEgc3BlY2lhbCBrZXkgKi8KKwlpZiAobnVtQnl0ZXMgPiBLRVlfTVNHX0JVRlNJWikKKwkgICAgbnVtQnl0ZXMgPSBLRVlfTVNHX0JVRlNJWjsJICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gPz8/CisJa20ubGVuZ3RoID0gbnVtQnl0ZXM7CisJbWVtY3B5KChjaGFyICopZGVzdCwgYnl0ZXMsIG51bUJ5dGVzKTsKKyAgICB9IGVsc2UgeworCWludDMyIHNjYW5jb2RlID0gMDsKKwltc2ctPkZpbmRJbnQzMigia2V5IiwgJnNjYW5jb2RlKTsKKworCWludDMyIGJlTW9kaWZpZXJzID0gMDsKKwltc2ctPkZpbmRJbnQzMigibW9kaWZpZXJzIiwgJmJlTW9kaWZpZXJzKTsKKworCWNoYXJfdSBzdHJpbmdbM107CisJaW50IGxlbiA9IDA7CisJa20ubGVuZ3RoID0gMDsKKworCWJvb2wgY2FuSGF2ZVZpbU1vZGlmaWVycyA9IGZhbHNlOworCisJLyoKKwkgKiBGb3Igbm9ybWFsLCBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycywgZG9uJ3QgbG9vayB0aGVtIHVwCisJICogdG8gY2hlY2sgaWYgdGhleSBtaWdodCBiZSBhIHNwZWNpYWwga2V5LiBUaGV5IGFyZW4ndC4KKwkgKi8KKwlhc3NlcnQoQl9CQUNLU1BBQ0UgPD0gMHgyMCk7CisJYXNzZXJ0KEJfREVMRVRFID09IDB4N0YpOworCWlmICgoKGNoYXJfdSlieXRlc1swXSA8PSAweDIwIHx8IChjaGFyX3UpYnl0ZXNbMF0gPT0gMHg3RikgJiYKKwkJbnVtQnl0ZXMgPT0gMSkgeworCSAgICAvKgorCSAgICAgKiBEdWUgdG8gdGhlIGdyZWF0IG5hdHVyZSBvZiBCZSdzIG1hcHBpbmcgb2Ygc3BlY2lhbCBrZXlzLAorCSAgICAgKiB2aXouIGludG8gdGhlIHJhbmdlIG9mIHRoZSBjb250cm9sIGNoYXJhY3RlcnMsCisJICAgICAqIHdlIGNhbiBvbmx5IGJlIHN1cmUgaXQgaXMgKnJlYWxseSogYSBzcGVjaWFsIGtleSBpZgorCSAgICAgKiBpZiBpdCBpcyBzcGVjaWFsIHdpdGhvdXQgdXNpbmcgY3RybC4gU28sIG9ubHkgaWYgY3RybCBpcworCSAgICAgKiB1c2VkLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IHVubW9kaWZpZWQuCisJICAgICAqLworCSAgICBpZiAoYmVNb2RpZmllcnMgJiBCX0NPTlRST0xfS0VZKSB7CisJCWludCBpbmRleCA9IGtleU1hcC0+bm9ybWFsX21hcFtzY2FuY29kZV07CisJCWludCBuZXdOdW1CeXRlcyA9IGtleU1hcENoYXJzW2luZGV4XTsKKwkJY2hhcl91ICpuZXdCeXRlcyA9IChjaGFyX3UgKikma2V5TWFwQ2hhcnNbaW5kZXggKyAxXTsKKworCQkvKgorCQkgKiBDaGVjayBpZiBzdGlsbCBzcGVjaWFsIHdpdGhvdXQgdGhlIGNvbnRyb2wga2V5LgorCQkgKiBUaGlzIGlzIG5lZWRlZCBmb3IgQkFDS1NQQUNFOiB0aGF0IGtleSBkb2VzIHByb2R1Y2UKKwkJICogZGlmZmVyZW50IHZhbHVlcyB3aXRoIG1vZGlmaWVycyAoREVMKS4KKwkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHNpbXBseSBoYXZlIGNoZWNrZWQgZm9yIGVxdWFsaXR5LgorCQkgKi8KKwkJaWYgKG5ld051bUJ5dGVzICE9IDEgfHwgKCpuZXdCeXRlcyA+IDB4MjAgJiYKKwkJCQkJICpuZXdCeXRlcyAhPSAweDdGICkpIHsKKwkJICAgIGdvdG8gbm90c3BlY2lhbDsKKwkJfQorCQlieXRlcyA9IChjaGFyICopbmV3Qnl0ZXM7CisJICAgIH0KKwkgICAgY2FuSGF2ZVZpbU1vZGlmaWVycyA9IHRydWU7CisKKwkgICAgdWludDE2IGJlb3NrZXk7CisJICAgIGludCBmaXJzdCwgbGFzdDsKKworCSAgICAvKgorCSAgICAgKiBJZiBudW1CeXRlcyA9PSAwIHRoYXQgcHJvYmFibHkgYWx3YXlzIGluZGljYXRlcyBhIHNwZWNpYWwga2V5LgorCSAgICAgKiAoZG9lcyBub3QgaGFwcGVuIHlldCkKKwkgICAgICovCisJICAgIGlmIChudW1CeXRlcyA9PSAwIHx8IGJ5dGVzWzBdID09IEJfRlVOQ1RJT05fS0VZKSB7CisJCWJlb3NrZXkgPSBGKHNjYW5jb2RlKTsKKwkJZmlyc3QgPSBGSVJTVF9GVU5DVElPTl9LRVk7CisJCWxhc3QgPSBOVU1fU1BFQ0lBTF9LRVlTOworCSAgICB9IGVsc2UgaWYgKCpieXRlcyA9PSAnXG4nICYmIHNjYW5jb2RlID09IDB4NDcpIHsKKwkJIC8qIHJlbWFwIHRoZSAobm9uLWtleXBhZCkgRU5URVIga2V5IGZyb20gXG4gdG8gXHIuICovCisJCXN0cmluZ1swXSA9ICdccic7CisJCWxlbiA9IDE7CisJCWZpcnN0ID0gbGFzdCA9IDA7CisJICAgIH0gZWxzZSB7CisJCWJlb3NrZXkgPSBLKGJ5dGVzWzBdKTsKKwkJZmlyc3QgPSAwOworCQlsYXN0ID0gRklSU1RfRlVOQ1RJT05fS0VZOworCSAgICB9CisKKwkgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGFzdDsgaSsrKSB7CisJCWlmIChzcGVjaWFsX2tleXNbaV0uQmVLZXlzID09IGJlb3NrZXkpIHsKKwkJICAgIHN0cmluZ1swXSA9IENTSTsKKwkJICAgIHN0cmluZ1sxXSA9IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTA7CisJCSAgICBzdHJpbmdbMl0gPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxOworCQkgICAgbGVuID0gMzsKKwkJfQorCSAgICB9CisJfQorICAgIG5vdHNwZWNpYWw6CisJaWYgKGxlbiA9PSAwKSB7CisJICAgIHN0cmluZ1swXSA9IGJ5dGVzWzBdOworCSAgICBsZW4gPSAxOworCX0KKworCS8qIFNwZWNpYWwga2V5cyAoYW5kIGEgZmV3IG90aGVycykgbWF5IGhhdmUgbW9kaWZpZXJzICovCisjaWYgMAorCWlmIChsZW4gPT0gMyB8fAorCQlieXRlc1swXSA9PSBCX1NQQUNFIHx8IGJ5dGVzWzBdID09IEJfVEFCIHx8CisJCWJ5dGVzWzBdID09IEJfUkVUVVJOIHx8IGJ5dGVzWzBdID09ICdccicgfHwKKwkJYnl0ZXNbMF0gPT0gQl9FU0NBUEUpCisjZWxzZQorCWlmIChjYW5IYXZlVmltTW9kaWZpZXJzKQorI2VuZGlmCisJeworCSAgICBpbnQgbW9kaWZpZXJzOworCSAgICBtb2RpZmllcnMgPSAwOworCSAgICBpZiAoYmVNb2RpZmllcnMgJiBCX1NISUZUX0tFWSkKKwkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCSAgICBpZiAoYmVNb2RpZmllcnMgJiBCX0NPTlRST0xfS0VZKQorCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKKwkgICAgaWYgKGJlTW9kaWZpZXJzICYgQl9PUFRJT05fS0VZKQorCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOworCisJICAgIC8qCisJICAgICAqIEZvciBzb21lIGtleXMgYSBzaGlmdCBtb2RpZmllciBpcyB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBrZXkKKwkgICAgICogY29kZS4gIERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGxlbiAhPSAxIGFuZAorCSAgICAgKiBzdHJpbmdbMF0gIT0gQ1NJPyAoTm90IGZvciBCZU9TLCBzaW5jZSBsZW4gPT0gMyBpbXBsaWVzCisJICAgICAqIHN0cmluZ1swXSA9PSBDU0kuLi4pCisJICAgICAqLworCSAgICBpbnQga2V5OworCSAgICBpZiAoc3RyaW5nWzBdID09IENTSSAmJiBsZW4gPT0gMykKKwkJa2V5ID0gVE9fU1BFQ0lBTChzdHJpbmdbMV0sIHN0cmluZ1syXSk7CisJICAgIGVsc2UKKwkJa2V5ID0gc3RyaW5nWzBdOworCSAgICBrZXkgPSBzaW1wbGlmeV9rZXkoa2V5LCAmbW9kaWZpZXJzKTsKKwkgICAgaWYgKElTX1NQRUNJQUwoa2V5KSkKKwkgICAgeworCQlzdHJpbmdbMF0gPSBDU0k7CisJCXN0cmluZ1sxXSA9IEtfU0VDT05EKGtleSk7CisJCXN0cmluZ1syXSA9IEtfVEhJUkQoa2V5KTsKKwkJbGVuID0gMzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJc3RyaW5nWzBdID0ga2V5OworCQlsZW4gPSAxOworCSAgICB9CisKKwkgICAgaWYgKG1vZGlmaWVycykKKwkgICAgeworCQkqZGVzdCsrID0gQ1NJOworCQkqZGVzdCsrID0gS1NfTU9ESUZJRVI7CisJCSpkZXN0KysgPSBtb2RpZmllcnM7CisJCWttLmxlbmd0aCA9IDM7CisJICAgIH0KKwl9CisJbWVtY3B5KChjaGFyICopZGVzdCwgc3RyaW5nLCBsZW4pOworCWttLmxlbmd0aCArPSBsZW47CisgICAgfQorCisgICAgd3JpdGVfcG9ydChndWkudmRjbXAsIFZpbU1zZzo6S2V5LCAma20sIHNpemVvZihrbSkpOworCisgICAgLyoKKyAgICAgKiBibGFuayBvdXQgdGhlIHBvaW50ZXIgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBfbWggJiYgIWd1aS5wb2ludGVyX2hpZGRlbikKKyAgICB7CisJZ3VpQmxhbmtNb3VzZSh0cnVlKTsKKwlndWkucG9pbnRlcl9oaWRkZW4gPSBUUlVFOworICAgIH0KK30KKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6Omd1aVNlbmRNb3VzZUV2ZW50KAorICAgIGludAkgICAgYnV0dG9uLAorICAgIGludAkgICAgeCwKKyAgICBpbnQJICAgIHksCisgICAgaW50CSAgICByZXBlYXRlZF9jbGljaywKKyAgICBpbnRfdSAgIG1vZGlmaWVycykKK3sKKyAgICBWaW1Nb3VzZU1zZyBtbTsKKworICAgIG1tLmJ1dHRvbiA9IGJ1dHRvbjsKKyAgICBtbS54ID0geDsKKyAgICBtbS55ID0geTsKKyAgICBtbS5yZXBlYXRlZF9jbGljayA9IHJlcGVhdGVkX2NsaWNrOworICAgIG1tLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKworICAgIHdyaXRlX3BvcnQoZ3VpLnZkY21wLCBWaW1Nc2c6Ok1vdXNlLCAmbW0sIHNpemVvZihtbSkpOworICAgIC8vIGNhbGxzIGd1aV9zZW5kX21vdXNlX2V2ZW50KCkKKworICAgIC8qCisgICAgICogaWYgb3VyIHBvaW50ZXIgaXMgY3VycmVudGx5IGhpZGRlbiwgdGhlbiB3ZSBzaG91bGQgc2hvdyBpdC4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLnBvaW50ZXJfaGlkZGVuKQorICAgIHsKKwlndWlCbGFua01vdXNlKGZhbHNlKTsKKwlndWkucG9pbnRlcl9oaWRkZW4gPSBGQUxTRTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6Omd1aUJsYW5rTW91c2UoYm9vbCBzaG91bGRfaGlkZSkKK3sKKyAgICBpZiAoc2hvdWxkX2hpZGUpIHsKKwkvL2d1aS52aW1BcHAtPkhpZGVDdXJzb3IoKTsKKwlndWkudmltQXBwLT5PYnNjdXJlQ3Vyc29yKCk7CisJLyoKKwkgKiBPYnNjdXJlQ3Vyc29yKCkgd291bGQgZXZlbiBiZSBlYXNpZXIsIGJ1dCB0aGVuCisJICogVmltJ3MgaWRlYSBvZiBtb3VzZSB2aXNpYmlsaXR5IGRvZXMgbm90IG5lY2Vzc2FyaWx5CisJICogY29ycmVzcG9uZCB0byByZWFsaXR5LgorCSAqLworICAgIH0gZWxzZSB7CisJLy9ndWkudmltQXBwLT5TaG93Q3Vyc29yKCk7CisgICAgfQorfQorCisgICAgaW50X3UKK1ZpbVRleHRBcmVhVmlldzo6bW91c2VNb2RpZmllcnNUb1ZpbShpbnQzMiBiZU1vZGlmaWVycykKK3sKKyAgICBpbnRfdSB2aW1fbW9kaWZpZXJzID0gMHgwOworCisgICAgaWYgKGJlTW9kaWZpZXJzICYgQl9TSElGVF9LRVkpCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKyAgICBpZiAoYmVNb2RpZmllcnMgJiBCX0NPTlRST0xfS0VZKQorCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiAoYmVNb2RpZmllcnMgJiBCX09QVElPTl9LRVkpCSAgICAvKiBBbHQgb3IgTWV0YSBrZXkgKi8KKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKKworICAgIHJldHVybiB2aW1fbW9kaWZpZXJzOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjpNb3VzZURvd24oQlBvaW50IHBvaW50KQoreworICAgIEJNZXNzYWdlICptID0gV2luZG93KCktPkN1cnJlbnRNZXNzYWdlKCk7CisgICAgYXNzZXJ0KG0pOworCisgICAgaW50MzIgYnV0dG9ucyA9IDA7CisgICAgbS0+RmluZEludDMyKCJidXR0b25zIiwgJmJ1dHRvbnMpOworCisgICAgaW50IHZpbUJ1dHRvbjsKKworICAgIGlmIChidXR0b25zICYgQl9QUklNQVJZX01PVVNFX0JVVFRPTikKKwl2aW1CdXR0b24gPSBNT1VTRV9MRUZUOworICAgIGVsc2UgaWYgKGJ1dHRvbnMgJiBCX1NFQ09OREFSWV9NT1VTRV9CVVRUT04pCisJdmltQnV0dG9uID0gTU9VU0VfUklHSFQ7CisgICAgZWxzZSBpZiAoYnV0dG9ucyAmIEJfVEVSVElBUllfTU9VU0VfQlVUVE9OKQorCXZpbUJ1dHRvbiA9IE1PVVNFX01JRERMRTsKKyAgICBlbHNlCisJcmV0dXJuOwkJCS8qIFVua25vd24gYnV0dG9uICovCisKKyAgICB2aW1Nb3VzZUJ1dHRvbiA9IDE7CQkvKiBkb24ndCBjYXJlIHdoaWNoIG9uZSAqLworCisgICAgLyogSGFuZGxlIG11bHRpcGxlIGNsaWNrcyAqLworICAgIGludDMyIGNsaWNrcyA9IDA7CisgICAgbS0+RmluZEludDMyKCJjbGlja3MiLCAmY2xpY2tzKTsKKworICAgIGludDMyIG1vZGlmaWVycyA9IDA7CisgICAgbS0+RmluZEludDMyKCJtb2RpZmllcnMiLCAmbW9kaWZpZXJzKTsKKworICAgIHZpbU1vdXNlTW9kaWZpZXJzID0gbW91c2VNb2RpZmllcnNUb1ZpbShtb2RpZmllcnMpOworCisgICAgZ3VpU2VuZE1vdXNlRXZlbnQodmltQnV0dG9uLCBwb2ludC54LCBwb2ludC55LAorCSAgICBjbGlja3MgPiAxIC8qID0gcmVwZWF0ZWRfY2xpY2sqLywgdmltTW91c2VNb2RpZmllcnMpOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjpNb3VzZVVwKEJQb2ludCBwb2ludCkKK3sKKyAgICB2aW1Nb3VzZUJ1dHRvbiA9IDA7CisKKyAgICBCTWVzc2FnZSAqbSA9IFdpbmRvdygpLT5DdXJyZW50TWVzc2FnZSgpOworICAgIGFzc2VydChtKTsKKyAgICAvL20tPlByaW50VG9TdHJlYW0oKTsKKworICAgIGludDMyIG1vZGlmaWVycyA9IDA7CisgICAgbS0+RmluZEludDMyKCJtb2RpZmllcnMiLCAmbW9kaWZpZXJzKTsKKworICAgIHZpbU1vdXNlTW9kaWZpZXJzID0gbW91c2VNb2RpZmllcnNUb1ZpbShtb2RpZmllcnMpOworCisgICAgZ3VpU2VuZE1vdXNlRXZlbnQoTU9VU0VfUkVMRUFTRSwgcG9pbnQueCwgcG9pbnQueSwKKwkgICAgMCAvKiA9IHJlcGVhdGVkX2NsaWNrKi8sIHZpbU1vdXNlTW9kaWZpZXJzKTsKKworICAgIEluaGVyaXRlZDo6TW91c2VVcChwb2ludCk7Cit9CisKKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6Ok1vdXNlTW92ZWQoQlBvaW50IHBvaW50LCB1aW50MzIgdHJhbnNpdCwgY29uc3QgQk1lc3NhZ2UgKm1lc3NhZ2UpCit7CisgICAgLyoKKyAgICAgKiBpZiBvdXIgcG9pbnRlciBpcyBjdXJyZW50bHkgaGlkZGVuLCB0aGVuIHdlIHNob3VsZCBzaG93IGl0LgorICAgICAqLworICAgIGlmIChndWkucG9pbnRlcl9oaWRkZW4pCisgICAgeworCWd1aUJsYW5rTW91c2UoZmFsc2UpOworCWd1aS5wb2ludGVyX2hpZGRlbiA9IEZBTFNFOworICAgIH0KKworICAgIGlmICghdmltTW91c2VCdXR0b24pICAgIC8qIGNvdWxkIGFsc28gY2hlY2sgbS0+ImJ1dHRvbnMiICovCisJcmV0dXJuOworCisgICAgYXRvbWljX2FkZCgmbW91c2VEcmFnRXZlbnRDb3VudCwgMSk7CisKKyAgICAvKiBEb24ndCBjYXJlIG11Y2ggYWJvdXQgInRyYW5zaXQiICovCisgICAgZ3VpU2VuZE1vdXNlRXZlbnQoTU9VU0VfRFJBRywgcG9pbnQueCwgcG9pbnQueSwgMCwgdmltTW91c2VNb2RpZmllcnMpOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjpNZXNzYWdlUmVjZWl2ZWQoQk1lc3NhZ2UgKm0pCit7CisgICAgc3dpdGNoIChtLT53aGF0KSB7CisgICAgY2FzZSAnbWVudSc6CisJeworCSAgICBWaW1NZW51TXNnIG1tOworCSAgICBtbS5ndWlNZW51ID0gTlVMTDsJLyogaW4gY2FzZSBubyBwb2ludGVyIGluIG1zZyAqLworCSAgICBtLT5GaW5kUG9pbnRlcigiVmltTWVudSIsICh2b2lkICoqKSZtbS5ndWlNZW51KTsKKworCSAgICB3cml0ZV9wb3J0KGd1aS52ZGNtcCwgVmltTXNnOjpNZW51LCAmbW0sIHNpemVvZihtbSkpOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChtLT5XYXNEcm9wcGVkKCkpIHsKKwkgICAgQldpbmRvdyAqdyA9IFdpbmRvdygpOworCSAgICB3LT5EZXRhY2hDdXJyZW50TWVzc2FnZSgpOworCSAgICB3LT5NaW5pbWl6ZShmYWxzZSk7CisJICAgIFZpbUFwcDo6U2VuZFJlZnMobSwgKG1vZGlmaWVycygpICYgQl9TSElGVF9LRVkpICE9IDApOworCX0gZWxzZSB7CisJICAgIEluaGVyaXRlZDo6TWVzc2FnZVJlY2VpdmVkKG0pOworCX0KKwlicmVhazsKKyAgICB9Cit9CisKKyAgICBpbnQKK1ZpbVRleHRBcmVhVmlldzo6bWNoSW5pdEZvbnQoY2hhcl91ICpuYW1lKQoreworICAgIFZpbUZvbnQgKm5ld0ZvbnQgPSAoVmltRm9udCAqKWd1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgMCk7CisKKyAgICBndWkubm9ybV9mb250ID0gKEd1aUZvbnQpbmV3Rm9udDsKKyAgICBndWlfbWNoX3NldF9mb250KChHdWlGb250KW5ld0ZvbnQpOworICAgIGlmIChuYW1lKQorCWhsX3NldF9mb250X25hbWUobmFtZSk7CisKKyAgICBTZXREcmF3aW5nTW9kZShCX09QX0NPUFkpOworCisgICAgLyoKKyAgICAgKiBUcnkgdG8gbG9hZCBvdGhlciBmb250cyBmb3IgYm9sZCwgaXRhbGljLCBhbmQgYm9sZC1pdGFsaWMuCisgICAgICogV2Ugc2hvdWxkIGFsc28gdHJ5IHRvIHdvcmsgb3V0IHdoYXQgZm9udCB0byB1c2UgZm9yIHRoZXNlIHdoZW4gdGhleSBhcmUKKyAgICAgKiBub3Qgc3BlY2lmaWVkIGJ5IFggcmVzb3VyY2VzLCBidXQgd2UgZG9uJ3QgeWV0LgorICAgICAqLworCisgICAgcmV0dXJuIE9LOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjptY2hEcmF3U3RyaW5nKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKQoreworICAgIC8qCisgICAgICogRmlyc3Qgd2UgbXVzdCBlcmFzZSB0aGUgYXJlYSwgYmVjYXVzZSBEcmF3U3RyaW5nIHdvbid0IGRvCisgICAgICogdGhhdCBmb3IgdXMuIFhYWCBNb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgYSB3YXN0ZSBvZiBlZmZvcnQKKyAgICAgKiBzaW5jZSB0aGUgYmFjaGdyb3VuZCBoYXMgYmVlbiBlcmFzZWQgYWxyZWFkeS4uLiBEUkFXX1RSQU5TUAorICAgICAqIHNob3VsZCBiZSBzZXQgd2hlbiBhcHByb3ByaWF0ZSEhIQorICAgICAqIChSZWN0YW5nbGVzIGluY2x1ZGUgdGhlIGJvdHRvbSBhbmQgcmlnaHQgZWRnZSkKKyAgICAgKi8KKyAgICBpZiAoIShmbGFncyAmIERSQVdfVFJBTlNQKSkgeworCUJSZWN0IHIoRklMTF9YKGNvbCksIEZJTExfWShyb3cpLAorCQlGSUxMX1goY29sICsgbGVuKSAtIFBFTl9XSURUSCwgRklMTF9ZKHJvdyArIDEpIC0gUEVOX1dJRFRIKTsKKwlGaWxsUmVjdChyLCBCX1NPTElEX0xPVyk7CisgICAgfQorICAgIEJQb2ludCB3aGVyZShURVhUX1goY29sKSwgVEVYVF9ZKHJvdykpOworICAgIERyYXdTdHJpbmcoKGNoYXIgKilzLCBsZW4sIHdoZXJlKTsKKworICAgIGlmIChmbGFncyAmIERSQVdfQk9MRCkgeworCXdoZXJlLnggKz0gMS4wOworCVNldERyYXdpbmdNb2RlKEJfT1BfQkxFTkQpOworCURyYXdTdHJpbmcoKGNoYXIgKilzLCBsZW4sIHdoZXJlKTsKKwlTZXREcmF3aW5nTW9kZShCX09QX0NPUFkpOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkgeworCUJQb2ludCBzdGFydChGSUxMX1goY29sKSwgRklMTF9ZKHJvdyArIDEpIC0gUEVOX1dJRFRIKTsKKwlCUG9pbnQgZW5kKEZJTExfWChjb2wgKyBsZW4pIC0gUEVOX1dJRFRILCBzdGFydC55KTsKKworCVN0cm9rZUxpbmUoc3RhcnQsIGVuZCk7CisgICAgfQorfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjptY2hDbGVhckJsb2NrKAorICAgIGludAkJcm93MSwKKyAgICBpbnQJCWNvbDEsCisgICAgaW50CQlyb3cyLAorICAgIGludAkJY29sMikKK3sKKyAgICBCUmVjdCByKEZJTExfWChjb2wxKSwgRklMTF9ZKHJvdzEpLAorCSAgICBGSUxMX1goY29sMiArIDEpIC0gUEVOX1dJRFRILCBGSUxMX1kocm93MiArIDEpIC0gUEVOX1dJRFRIKTsKKyAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CisgICAgRmlsbFJlY3QociwgQl9TT0xJRF9MT1cpOworfQorCisgICAgdm9pZAorVmltVGV4dEFyZWFWaWV3OjptY2hDbGVhckFsbCgpCit7CisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworICAgIEZpbGxSZWN0KEJvdW5kcygpLCBCX1NPTElEX0xPVyk7Cit9CisKKy8qCisgKiBtY2hEZWxldGVMaW5lcygpIExvY2soKXMgdGhlIHdpbmRvdyBieSBpdHNlbGYuCisgKi8KKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6Om1jaERlbGV0ZUxpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgaWYgKHJvdyArIG51bV9saW5lcyA+IGd1aS5zY3JvbGxfcmVnaW9uX2JvdCkKKyAgICB7CisJLyogU2Nyb2xsZWQgb3V0IG9mIHJlZ2lvbiwganVzdCBibGFuayB0aGUgbGluZXMgb3V0ICovCisJZ3VpX2NsZWFyX2Jsb2NrKHJvdywgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJZ3VpLnNjcm9sbF9yZWdpb25fYm90LCBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogY29weSBvbmUgZXh0cmEgcGl4ZWwsIGZvciB3aGVuIGJvbGQgaGFzIHNwaWxsZWQgb3ZlciAqLworCWludCB3aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0CisJCQkJLSBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0ICsgMSkgKyAxIC0gUEVOX1dJRFRIOworCWludCBoZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQgKgorCQkgICAgIChndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSByb3cgLSBudW1fbGluZXMgKyAxKSAtIFBFTl9XSURUSDsKKworCUJSZWN0IHNvdXJjZSwgZGVzdDsKKworCXNvdXJjZS5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworCXNvdXJjZS50b3AgPSBGSUxMX1kocm93ICsgbnVtX2xpbmVzKTsKKwlzb3VyY2UucmlnaHQgPSBzb3VyY2UubGVmdCArIHdpZHRoOworCXNvdXJjZS5ib3R0b20gPSBzb3VyY2UudG9wICsgaGVpZ2h0OworCisJZGVzdC5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworCWRlc3QudG9wID0gRklMTF9ZKHJvdyk7CisJZGVzdC5yaWdodCA9IGRlc3QubGVmdCArIHdpZHRoOworCWRlc3QuYm90dG9tID0gZGVzdC50b3AgKyBoZWlnaHQ7CisKKwkvKiBYWFggQXR0ZW1wdCBhdCBhIGhhY2s6ICovCisJZ3VpLnZpbVdpbmRvdy0+VXBkYXRlSWZOZWVkZWQoKTsKKyNpZiAwCisJLyogWFhYIEF0dGVtcHQgYXQgYSBoYWNrOiAqLworCWlmIChndWkudmltV2luZG93LT5OZWVkc1VwZGF0ZSgpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAibWNoRGVsZXRlTGluZXM6IE5lZWRzVXBkYXRlIVxuIik7CisJICAgIGd1aS52aW1XaW5kb3ctPlVwZGF0ZUlmTmVlZGVkKCk7CisJICAgIHdoaWxlIChndWkudmltV2luZG93LT5OZWVkc1VwZGF0ZSgpKSB7CisJCWlmIChmYWxzZSAmJiBndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwkJICAgIFN5bmMoKTsKKwkJICAgIGd1aS52aW1XaW5kb3ctPlVubG9jaygpOworCQl9CisJCXNub296ZSgyKTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisJaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCSAgICBTeW5jKCk7CisJICAgIENvcHlCaXRzKHNvdXJjZSwgZGVzdCk7CisJICAgIC8vU3luYygpOworCisJICAgIC8qIFVwZGF0ZSBndWkuY3Vyc29yX3JvdyBpZiB0aGUgY3Vyc29yIHNjcm9sbGVkIG9yIGNvcGllZCBvdmVyICovCisJICAgIGlmIChndWkuY3Vyc29yX3JvdyA+PSByb3cKKwkJJiYgZ3VpLmN1cnNvcl9jb2wgPj0gZ3VpLnNjcm9sbF9yZWdpb25fbGVmdAorCQkmJiBndWkuY3Vyc29yX2NvbCA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCkKKwkgICAgeworCQlpZiAoZ3VpLmN1cnNvcl9yb3cgPCByb3cgKyBudW1fbGluZXMpCisJCSAgICBndWkuY3Vyc29yX2lzX3ZhbGlkID0gRkFMU0U7CisJCWVsc2UgaWYgKGd1aS5jdXJzb3Jfcm93IDw9IGd1aS5zY3JvbGxfcmVnaW9uX2JvdCkKKwkJICAgIGd1aS5jdXJzb3Jfcm93IC09IG51bV9saW5lczsKKwkgICAgfQorCisJICAgIC8qIENsZWFyIG9uZSBjb2x1bW4gbW9yZSBmb3Igd2hlbiBib2xkIGhhcyBzcGlsbGVkIG92ZXIgKi8KKwkgICAgZ3VpX2NsZWFyX2Jsb2NrKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcyArIDEsCisJCQkJCQkgICAgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJZ3VpLnNjcm9sbF9yZWdpb25fYm90LCBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCk7CisKKwkgICAgZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisJICAgIC8qCisJICAgICAqIFRoZSBEcmF3KCkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgbm93IGlmIHNvbWUgb2YgdGhlIHNvdXJjZQorCSAgICAgKiBiaXRzIHdlcmUgbm90IGluIHRoZSB2aXNpYmxlIHJlZ2lvbi4KKwkgICAgICovCisKKwkgICAgLy9ndWlfeDExX2NoZWNrX2NvcHlfYXJlYSgpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBtY2hJbnNlcnRMaW5lcygpIExvY2soKXMgdGhlIHdpbmRvdyBieSBpdHNlbGYuCisgKi8KKyAgICB2b2lkCitWaW1UZXh0QXJlYVZpZXc6Om1jaEluc2VydExpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgaWYgKHJvdyArIG51bV9saW5lcyA+IGd1aS5zY3JvbGxfcmVnaW9uX2JvdCkKKyAgICB7CisJLyogU2Nyb2xsZWQgb3V0IG9mIHJlZ2lvbiwganVzdCBibGFuayB0aGUgbGluZXMgb3V0ICovCisJZ3VpX2NsZWFyX2Jsb2NrKHJvdywgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJZ3VpLnNjcm9sbF9yZWdpb25fYm90LCBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogY29weSBvbmUgZXh0cmEgcGl4ZWwsIGZvciB3aGVuIGJvbGQgaGFzIHNwaWxsZWQgb3ZlciAqLworCWludCB3aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0CisJCQkJLSBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0ICsgMSkgKyAxIC0gUEVOX1dJRFRIOworCWludCBoZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQgKgorCQkgICAgIChndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSByb3cgLSBudW1fbGluZXMgKyAxKSAtIFBFTl9XSURUSDsKKworCUJSZWN0IHNvdXJjZSwgZGVzdDsKKworCXNvdXJjZS5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworCXNvdXJjZS50b3AgPSBGSUxMX1kocm93KTsKKwlzb3VyY2UucmlnaHQgPSBzb3VyY2UubGVmdCArIHdpZHRoOworCXNvdXJjZS5ib3R0b20gPSBzb3VyY2UudG9wICsgaGVpZ2h0OworCisJZGVzdC5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworCWRlc3QudG9wID0gRklMTF9ZKHJvdyArIG51bV9saW5lcyk7CisJZGVzdC5yaWdodCA9IGRlc3QubGVmdCArIHdpZHRoOworCWRlc3QuYm90dG9tID0gZGVzdC50b3AgKyBoZWlnaHQ7CisKKwkvKiBYWFggQXR0ZW1wdCBhdCBhIGhhY2s6ICovCisJZ3VpLnZpbVdpbmRvdy0+VXBkYXRlSWZOZWVkZWQoKTsKKyNpZiAwCisJLyogWFhYIEF0dGVtcHQgYXQgYSBoYWNrOiAqLworCWlmIChndWkudmltV2luZG93LT5OZWVkc1VwZGF0ZSgpKQorCSAgICBmcHJpbnRmKHN0ZGVyciwgIm1jaEluc2VydExpbmVzOiBOZWVkc1VwZGF0ZSFcbiIpOworCWd1aS52aW1XaW5kb3ctPlVwZGF0ZUlmTmVlZGVkKCk7CisJd2hpbGUgKGd1aS52aW1XaW5kb3ctPk5lZWRzVXBkYXRlKCkpCisJICAgIHNub296ZSgyKTsKKyNlbmRpZgorCisJaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCSAgICBTeW5jKCk7CisJICAgIENvcHlCaXRzKHNvdXJjZSwgZGVzdCk7CisJICAgIC8vU3luYygpOworCisJICAgIC8qIFVwZGF0ZSBndWkuY3Vyc29yX3JvdyBpZiB0aGUgY3Vyc29yIHNjcm9sbGVkIG9yIGNvcGllZCBvdmVyICovCisJICAgIGlmIChndWkuY3Vyc29yX3JvdyA+PSBndWkucm93CisJCSYmIGd1aS5jdXJzb3JfY29sID49IGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKKwkJJiYgZ3VpLmN1cnNvcl9jb2wgPD0gZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpCisJICAgIHsKKwkJaWYgKGd1aS5jdXJzb3Jfcm93IDw9IGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcykKKwkJICAgIGd1aS5jdXJzb3Jfcm93ICs9IG51bV9saW5lczsKKwkJZWxzZSBpZiAoZ3VpLmN1cnNvcl9yb3cgPD0gZ3VpLnNjcm9sbF9yZWdpb25fYm90KQorCQkgICAgZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOworCSAgICB9CisJICAgIC8qIENsZWFyIG9uZSBjb2x1bW4gbW9yZSBmb3Igd2hlbiBib2xkIGhhcyBzcGlsbGVkIG92ZXIgKi8KKwkgICAgZ3VpX2NsZWFyX2Jsb2NrKHJvdywgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwkJICAgIHJvdyArIG51bV9saW5lcyAtIDEsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKworCSAgICBndWkudmltV2luZG93LT5VbmxvY2soKTsKKwkgICAgLyoKKwkgICAgICogVGhlIERyYXcoKSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBub3cgaWYgc29tZSBvZiB0aGUgc291cmNlCisJICAgICAqIGJpdHMgd2VyZSBub3QgaW4gdGhlIHZpc2libGUgcmVnaW9uLgorCSAgICAgKiBIb3dldmVyLCBpZiB3ZSBzY3JvbGwgdG9vIGZhc3QgaXQgY2FuJ3Qga2VlcCB1cCBhbmQgdGhlCisJICAgICAqIHVwZGF0ZSByZWdpb24gZ2V0cyBtZXNzZWQgdXAuIFRoaXMgc2VlbXMgdG8gYmUgYmVjYXVzZSBjb3B5aW5nCisJICAgICAqIHVuLURyYXcoKW4gYml0cyBkb2VzIG5vdCBnZW5lcmF0ZSBEcmF3KCkgY2FsbHMgZm9yIHRoZSBjb3B5Li4uCisJICAgICAqIEkgbW92ZWQgdGhlIGhhY2sgdG8gYmVmb3JlIHRoZSBDb3B5Qml0cygpIHRvIHJlZHVjZSB0aGUKKwkgICAgICogYW1vdW50IG9mIGFkZGl0aW9uYWwgd2FpdGluZyBuZWVkZWQuCisJICAgICAqLworCisJICAgIC8vZ3VpX3gxMV9jaGVja19jb3B5X2FyZWEoKTsKKwl9CisgICAgfQorCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gVmltU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQlVHOiBYWFgKKyAqIEl0IHNlZW1zIHRoYXQgQlNjcm9sbEJhciBkZXRlcm1pbmUgdGhlaXIgZGlyZWN0aW9uIG5vdCBmcm9tCisgKiAicG9zdHVyZSIgYnV0IGZyb20gaWYgdGhleSBhcmUgInRhbGwiIG9yICJ3aWRlIiBpbiBzaGFwZS4uLgorICoKKyAqIEFsc28sIHBsYWNlIHRoZW0gb3V0IG9mIHNpZ2h0LCBiZWNhdXNlIFZpbSBlbmFibGVzIHRoZW0gYmVmb3JlCisgKiB0aGV5IGFyZSBwb3NpdGlvbmVkLgorICovCitWaW1TY3JvbGxCYXI6OlZpbVNjcm9sbEJhcihzY3JvbGxiYXJfVCAqZywgb3JpZW50YXRpb24gcG9zdHVyZSk6CisgICAgQlNjcm9sbEJhcihwb3N0dXJlID09IEJfSE9SSVpPTlRBTCA/ICBCUmVjdCgtMTAwLC0xMDAsLTEwLC05MCkgOgorCQkJCQkgIEJSZWN0KC0xMDAsLTEwMCwtOTAsLTEwKSwKKwkJInZpbSBzY3JvbGxiYXIiLCAoQlZpZXcgKilOVUxMLAorCSAgICAwLjAsIDEwLjAsIHBvc3R1cmUpLAorICAgIGlnbm9yZVZhbHVlKC0xKSwKKyAgICBzY3JvbGxFdmVudENvdW50KDApCit7CisgICAgZ3NiID0gZzsKKyAgICBTZXRSZXNpemluZ01vZGUoQl9GT0xMT1dfTk9ORSk7Cit9CisKK1ZpbVNjcm9sbEJhcjo6flZpbVNjcm9sbEJhcigpCit7Cit9CisKKyAgICB2b2lkCitWaW1TY3JvbGxCYXI6OlZhbHVlQ2hhbmdlZChmbG9hdCBuZXdWYWx1ZSkKK3sKKyAgICBpZiAoaWdub3JlVmFsdWUgPj0gMC4wICYmIG5ld1ZhbHVlID09IGlnbm9yZVZhbHVlKSB7CisJaWdub3JlVmFsdWUgPSAtMTsKKwlyZXR1cm47CisgICAgfQorICAgIGlnbm9yZVZhbHVlID0gLTE7CisgICAgLyoKKyAgICAgKiBXZSB3YW50IHRvIHRocm90dGxlIHRoZSBhbW91bnQgb2Ygc2Nyb2xsIG1lc3NhZ2VzIGdlbmVyYXRlZC4KKyAgICAgKiBOb3JtYWxseSBJIHByZXN1bWUgeW91IHdvbid0IGdldCBhIG5ldyBtZXNzYWdlIGJlZm9yZSB3ZSd2ZQorICAgICAqIGhhbmRsZWQgdGhlIHByZXZpb3VzIG9uZSwgYnV0IGJlY2F1c2Ugd2UncmUgcGFzc2luZyB0aGVtIG9uIHRoaXMKKyAgICAgKiBoYXBwZW5zIHZlcnkgcXVpY2tseS4gU28gaW5zdGVhZCB3ZSBrZWVwIGEgY291bnRlciBvZiBob3cgbWFueQorICAgICAqIHNjcm9sbCBldmVudHMgdGhlcmUgYXJlIChvciB3aWxsIGJlKSBpbiB0aGUgVkRDTVAsIGFuZCB0aGUKKyAgICAgKiB0aHJvdHRsaW5nIGhhcHBlbnMgYXQgdGhlIHJlY2VpdmluZyBlbmQuCisgICAgICovCisgICAgYXRvbWljX2FkZCgmc2Nyb2xsRXZlbnRDb3VudCwgMSk7CisKKyAgICBzdHJ1Y3QgVmltU2Nyb2xsQmFyTXNnIHNtOworCisgICAgc20uc2IgPSB0aGlzOworICAgIHNtLnZhbHVlID0gKGxvbmcpIG5ld1ZhbHVlOworICAgIHNtLnN0aWxsRHJhZ2dpbmcgPSBUUlVFOworCisgICAgd3JpdGVfcG9ydChndWkudmRjbXAsIFZpbU1zZzo6U2Nyb2xsQmFyLCAmc20sIHNpemVvZihzbSkpOworCisgICAgLy8gY2FsbHMgZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCBuZXdWYWx1ZSwgVFJVRSk7Cit9CisKKy8qCisgKiBXaGVuIHRoZSBtb3VzZSBnb2VzIHVwLCByZXBvcnQgdGhhdCBzY3JvbGxpbmcgaGFzIHN0b3BwZWQuCisgKiBNb3VzZVVwKCkgaXMgTk9UIGNhbGxlZCB3aGVuIHRoZSBtb3VzZS11cCBvY2N1cnMgb3V0c2lkZQorICogdGhlIHdpbmRvdywgZXZlbiB0aG91Z2ggdGhlIHRodW1iIGRvZXMgbW92ZSB3aGlsZSB0aGUgbW91c2UKKyAqIGlzIG91dHNpZGUuLi4gVGhpcyBoYXMgc29tZSBmdW5ueSBlZmZlY3RzLi4uIFhYWAorICogU28gd2UgZG8gc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhlIHdpbmRvdyBkZS9hY3RpdmF0ZXMuCisgKi8KKyAgICB2b2lkCitWaW1TY3JvbGxCYXI6Ok1vdXNlVXAoQlBvaW50IHdoZXJlKQoreworICAgIC8vQk1lc3NhZ2UgKm0gPSBXaW5kb3coKS0+Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAvL20tPlByaW50VG9TdHJlYW0oKTsKKworICAgIGF0b21pY19hZGQoJnNjcm9sbEV2ZW50Q291bnQsIDEpOworCisgICAgc3RydWN0IFZpbVNjcm9sbEJhck1zZyBzbTsKKworICAgIHNtLnNiID0gdGhpczsKKyAgICBzbS52YWx1ZSA9IChsb25nKSBWYWx1ZSgpOworICAgIHNtLnN0aWxsRHJhZ2dpbmcgPSBGQUxTRTsKKworICAgIHdyaXRlX3BvcnQoZ3VpLnZkY21wLCBWaW1Nc2c6OlNjcm9sbEJhciwgJnNtLCBzaXplb2Yoc20pKTsKKworICAgIC8vIGNhbGxzIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgbmV3VmFsdWUsIEZBTFNFKTsKKworICAgIEluaGVyaXRlZDo6TW91c2VVcCh3aGVyZSk7Cit9CisKKyAgICB2b2lkCitWaW1TY3JvbGxCYXI6OlNldFZhbHVlKGZsb2F0IG5ld1ZhbHVlKQoreworICAgIGlmIChuZXdWYWx1ZSA9PSBWYWx1ZSgpKQorCXJldHVybjsKKworICAgIGlnbm9yZVZhbHVlID0gbmV3VmFsdWU7CisgICAgSW5oZXJpdGVkOjpTZXRWYWx1ZShuZXdWYWx1ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gVmltRm9udCAtLS0tLS0tLS0tLS0tLS0tICovCisKK1ZpbUZvbnQ6OlZpbUZvbnQoKTogQkZvbnQoKQoreworICAgIGluaXQoKTsKK30KKworVmltRm9udDo6VmltRm9udChjb25zdCBWaW1Gb250ICpyaHMpOiBCRm9udChyaHMpCit7CisgICAgaW5pdCgpOworfQorCitWaW1Gb250OjpWaW1Gb250KGNvbnN0IEJGb250ICpyaHMpOiBCRm9udChyaHMpCit7CisgICAgaW5pdCgpOworfQorCitWaW1Gb250OjpWaW1Gb250KGNvbnN0IFZpbUZvbnQgJnJocyk6IEJGb250KHJocykKK3sKKyAgICBpbml0KCk7Cit9CisKK1ZpbUZvbnQ6On5WaW1Gb250KCkKK3sKK30KKworICAgIHZvaWQKK1ZpbUZvbnQ6OmluaXQoKQoreworICAgIG5leHQgPSBOVUxMOworICAgIHJlZmNvdW50ID0gMTsKKyAgICBuYW1lID0gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIHNvbWUgZ2xvYmFsIHZhcmlhYmxlcworc3RhdGljIGNoYXIgYXBwc2lnW10gPSAiYXBwbGljYXRpb24veC12bmQuUmhpYWx0by1WaW0tNSI7CitrZXlfbWFwICprZXlNYXA7CitjaGFyICprZXlNYXBDaGFyczsKK2ludCBtYWluX2V4aXRjb2RlID0gMTI3OworCisgICAgc3RhdHVzX3QKK2d1aV9iZW9zX3Byb2Nlc3NfZXZlbnQoYmlndGltZV90IHRpbWVvdXQpCit7CisgICAgc3RydWN0IFZpbU1zZyB2bTsKKyAgICBsb25nIHdoYXQ7CisgICAgc3NpemVfdCBzaXplOworCisgICAgc2l6ZSA9IHJlYWRfcG9ydF9ldGMoZ3VpLnZkY21wLCAmd2hhdCwgJnZtLCBzaXplb2Yodm0pLAorCSAgICBCX1RJTUVPVVQsIHRpbWVvdXQpOworCisgICAgaWYgKHNpemUgPj0gMCkgeworCXN3aXRjaCAod2hhdCkgeworCWNhc2UgVmltTXNnOjpLZXk6CisJICAgIHsKKwkJY2hhcl91ICpzdHJpbmcgPSB2bS51LktleS5jaGFyczsKKwkJaW50IGxlbiA9IHZtLnUuS2V5Lmxlbmd0aDsKKwkJaWYgKGxlbiA9PSAxICYmIHN0cmluZ1swXSA9PSBDdHJsX2NocignQycpKSB7CisJCSAgICB0cmFzaF9pbnB1dF9idWYoKTsKKwkJICAgIGdvdF9pbnQgPSBUUlVFOworCQl9CisJCWFkZF90b19pbnB1dF9idWYoc3RyaW5nLCBsZW4pOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgVmltTXNnOjpSZXNpemU6CisJICAgIGd1aV9yZXNpemVfc2hlbGwodm0udS5OZXdTaXplLndpZHRoLCB2bS51Lk5ld1NpemUuaGVpZ2h0KTsKKwkgICAgYnJlYWs7CisJY2FzZSBWaW1Nc2c6OlNjcm9sbEJhcjoKKwkgICAgeworCQkvKgorCQkgKiBJZiBsb2FkcyBvZiBzY3JvbGwgbWVzc2FnZXMgcXVldWUgdXAsIHVzZSBvbmx5IHRoZSBsYXN0CisJCSAqIG9uZS4gQWx3YXlzIHJlcG9ydCB3aGVuIHRoZSBzY3JvbGxiYXIgc3RvcHMgZHJhZ2dpbmcuCisJCSAqIFRoaXMgaXMgbm90IHBlcmZlY3QgeWV0IGFueXdheTogdGhlc2UgZXZlbnRzIGFyZSBxdWV1ZWQKKwkJICogeWV0IGFnYWluLCB0aGlzIHRpbWUgaW4gdGhlIGtleWJvYXJkIGlucHV0IGJ1ZmZlci4KKwkJICovCisJCWludDMyIG9sZENvdW50ID0KKwkJICAgIGF0b21pY19hZGQoJnZtLnUuU2Nyb2xsLnNiLT5zY3JvbGxFdmVudENvdW50LCAtMSk7CisJCWlmIChvbGRDb3VudCA8PSAxIHx8ICF2bS51LlNjcm9sbC5zdGlsbERyYWdnaW5nKQorCQkgICAgZ3VpX2RyYWdfc2Nyb2xsYmFyKHZtLnUuU2Nyb2xsLnNiLT5nZXRHc2IoKSwKKwkJCSAgICB2bS51LlNjcm9sbC52YWx1ZSwgdm0udS5TY3JvbGwuc3RpbGxEcmFnZ2luZyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBWaW1Nc2c6Ok1lbnU6CisJICAgIGd1aV9tZW51X2NiKHZtLnUuTWVudS5ndWlNZW51KTsKKwkgICAgYnJlYWs7CisJY2FzZSBWaW1Nc2c6Ok1vdXNlOgorCSAgICB7CisJCWludDMyIG9sZENvdW50OworCQlpZiAodm0udS5Nb3VzZS5idXR0b24gPT0gTU9VU0VfRFJBRykKKwkJICAgIG9sZENvdW50ID0KKwkJCWF0b21pY19hZGQoJmd1aS52aW1UZXh0QXJlYS0+bW91c2VEcmFnRXZlbnRDb3VudCwgLTEpOworCQllbHNlCisJCSAgICBvbGRDb3VudCA9IDA7CisJCWlmIChvbGRDb3VudCA8PSAxKQorCQkgICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQodm0udS5Nb3VzZS5idXR0b24sIHZtLnUuTW91c2UueCwKKwkJCSAgICB2bS51Lk1vdXNlLnksIHZtLnUuTW91c2UucmVwZWF0ZWRfY2xpY2ssCisJCQkgICAgdm0udS5Nb3VzZS5tb2RpZmllcnMpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgVmltTXNnOjpGb2N1czoKKwkgICAgZ3VpLmluX2ZvY3VzID0gdm0udS5Gb2N1cy5hY3RpdmU7CisJICAgIC8qIFhYWCBTaWduYWwgdGhhdCBzY3JvbGxiYXIgZHJhZ2dpbmcgaGFzIHN0b3BwZWQ/CisJICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgZ2V0IGEgTW91c2VVcCBpZgorCSAgICAgKiB0aGF0IGhhcHBlbnMgd2hpbGUgb3V0c2lkZSB0aGUgd2luZG93Li4uIDotKAorCSAgICAgKi8KKwkgICAgaWYgKGd1aS5kcmFnZ2VkX3NiKSB7CisJCWd1aS5kcmFnZ2VkX3NiID0gU0JBUl9OT05FOworCSAgICB9CisJICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKwkgICAgYnJlYWs7CisJY2FzZSBWaW1Nc2c6OlJlZnM6CisJICAgIDo6UmVmc1JlY2VpdmVkKHZtLnUuUmVmcy5tZXNzYWdlLCB2bS51LlJlZnMuY2hhbmdlZGlyKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgLy8gdW5yZWNvZ25pc2VkIG1lc3NhZ2UsIGlnbm9yZSBpdAorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBzaXplIDwgQl9PSywgaXQgaXMgYW4gZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIEhlcmUgYXJlIHNvbWUgZnVuY3Rpb25zIHRvIHByb3RlY3QgYWNjZXNzIHRvIFNjcmVlbkxpbmVzW10gYW5kCisgKiBMaW5lT2Zmc2V0W10uIFRoZXNlIGFyZSB1c2VkIGZyb20gdGhlIHdpbmRvdyB0aHJlYWQgdG8gcmVzcG9uZAorICogdG8gYSBEcmF3KCkgY2FsbGJhY2suIFdoZW4gdGhhdCBvY2N1cnMsIHRoZSB3aW5kb3cgaXMgYWxyZWFkeQorICogbG9ja2VkIGJ5IHRoZSBzeXN0ZW0uCisgKgorICogT3RoZXIgY29kZSB0aGF0IG5lZWRzIHRvIGxvY2sgaXMgYW55IGNvZGUgdGhhdCBjaGFuZ2VzIHRoZXNlCisgKiB2YXJpYWJsZXMuIE90aGVyIHJlYWQtb25seSBhY2Nlc3MsIG9yIGFjY2VzcyBtZXJlbHkgdG8gdGhlCisgKiBjb250ZW50cyBvZiB0aGUgc2NyZWVuIGJ1ZmZlciwgbmVlZCBub3QgYmUgbG9ja2VkLgorICoKKyAqIElmIHRoZXJlIGlzIG5vIHdpbmRvdywgZG9uJ3QgY2FsbCBMb2NrKCkgYnV0IGRvIHN1Y2NlZWQuCisgKi8KKworICAgIGludAordmltX2xvY2tfc2NyZWVuKCkKK3sKKyAgICByZXR1cm4gIWd1aS52aW1XaW5kb3cgfHwgZ3VpLnZpbVdpbmRvdy0+TG9jaygpOworfQorCisgICAgdm9pZAordmltX3VubG9ja19zY3JlZW4oKQoreworICAgIGlmIChndWkudmltV2luZG93KQorCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworfQorCisjZGVmaW5lIFJVTl9CQVBQTElDQVRJT05fSU5fTkVXX1RIUkVBRAkwCisKKyNpZiBSVU5fQkFQUExJQ0FUSU9OX0lOX05FV19USFJFQUQKKworICAgIGludDMyCitydW5fdmltYXBwKHZvaWQgKmFyZ3MpCit7CisgICAgVmltQXBwIGFwcChhcHBzaWcpOworCisgICAgZ3VpLnZpbUFwcCA9ICZhcHA7CisgICAgYXBwLlJ1bigpOwkJCSAgICAvKiBSdW4gdW50aWwgUXVpdCgpIGNhbGxlZCAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyAgICBpbnQzMgorY2FsbF9tYWluKHZvaWQgKmFyZ3MpCit7CisgICAgc3RydWN0IE1haW5BcmdzICptYSA9IChNYWluQXJncyAqKWFyZ3M7CisKKyAgICByZXR1cm4gbWFpbihtYS0+YXJnYywgbWEtPmFyZ3YpOworfQorI2VuZGlmCisKK2V4dGVybiAiQyIgeworCisvKgorICogUGFyc2UgdGhlIEdVSSByZWxhdGVkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBBbnkgYXJndW1lbnRzIHVzZWQgYXJlCisgKiBkZWxldGVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkIGFjY29yZGluZ2x5LiAgVGhpcyBpcyBjYWxsZWQKKyAqIHdoZW4gdmltIGlzIHN0YXJ0ZWQsIHdoZXRoZXIgb3Igbm90IHRoZSBHVUkgaGFzIGJlZW4gc3RhcnRlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfcHJlcGFyZSgKKyAgICBpbnQJCSphcmdjLAorICAgIGNoYXIJKiphcmd2KQoreworICAgIC8qCisgICAgICogV2UgZG9uJ3QgaGF2ZSBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEJlT1MgR1VJIHlldCwKKyAgICAgKiBidXQgdGhpcyBpcyBhbiBleGNlbGxlbnQgcGxhY2UgdG8gY3JlYXRlIG91ciBBcHBsaWNhdGlvbiBvYmplY3QuCisgICAgICovCisgICAgaWYgKCFndWkudmltQXBwKSB7CisJdGhyZWFkX2luZm8gdGluZm87CisJZ2V0X3RocmVhZF9pbmZvKGZpbmRfdGhyZWFkKE5VTEwpLCAmdGluZm8pOworCisJLyogTWF5IG5lZWQgdGhlIHBvcnQgdmVyeSBlYXJseSBvbiB0byBwcm9jZXNzIFJlZnNSZWNlaXZlZCgpICovCisJZ3VpLnZkY21wID0gY3JlYXRlX3BvcnQoQl9NQVhfUE9SVF9DT1VOVCwgInZpbSBWRENNUCIpOworCisjaWYgUlVOX0JBUFBMSUNBVElPTl9JTl9ORVdfVEhSRUFECisJdGhyZWFkX2lkIHRpZCA9IHNwYXduX3RocmVhZChydW5fdmltYXBwLCAidmltIFZpbUFwcCIsCisJCQkJCQl0aW5mby5wcmlvcml0eSwgTlVMTCk7CisJaWYgKHRpZCA+PSBCX09LKSB7CisJICAgIHJlc3VtZV90aHJlYWQodGlkKTsKKwl9IGVsc2UgeworCSAgICBnZXRvdXQoMSk7CisJfQorI2Vsc2UKKwlNYWluQXJncyBtYSA9IHsgKmFyZ2MsIGFyZ3YgfTsKKwl0aHJlYWRfaWQgdGlkID0gc3Bhd25fdGhyZWFkKGNhbGxfbWFpbiwgInZpbSBtYWluKCkiLAorCQkJCQkJdGluZm8ucHJpb3JpdHksICZtYSk7CisJaWYgKHRpZCA+PSBCX09LKSB7CisJICAgIFZpbUFwcCBhcHAoYXBwc2lnKTsKKworCSAgICBndWkudmltQXBwID0gJmFwcDsKKwkgICAgcmVzdW1lX3RocmVhZCh0aWQpOworCSAgICAvKgorCSAgICAgKiBUaGlzIGlzIHJhdGhlciBob3JyaWJsZS4KKwkgICAgICogY2FsbF9tYWluIHdpbGwgY2FsbCBtYWluKCkgYWdhaW4uLi4KKwkgICAgICogVGhlcmUgd2lsbCBiZSBubyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2UKKwkgICAgICogZ3VpLnZpbUFwcCBpcyBzZXQgbm93LgorCSAgICAgKi8KKwkgICAgYXBwLlJ1bigpOwkJCSAgICAvKiBSdW4gdW50aWwgUXVpdCgpIGNhbGxlZCAqLworCSAgICAvL2ZwcmludGYoc3RkZXJyLCAiYXBwLlJ1bigpIHJldHVybmVkLi4uXG4iKTsKKwkgICAgc3RhdHVzX3QgZHVtbXlfZXhpdGNvZGU7CisJICAgICh2b2lkKXdhaXRfZm9yX3RocmVhZCh0aWQsICZkdW1teV9leGl0Y29kZSk7CisKKwkgICAgLyoKKwkgICAgICogVGhpcyBwYXRoIHNob3VsZCBiZSB0aGUgbm9ybWFsIG9uZSB0YWtlbiB0byBleGl0IFZpbS4KKwkgICAgICogVGhlIG1haW4oKSB0aHJlYWQgY2FsbHMgbWNoX2V4aXQoKSB3aGljaCBjYWxscworCSAgICAgKiBndWlfbWNoX2V4aXQoKSB3aGljaCB0ZXJtaW5hdGVzIGl0cyB0aHJlYWQuCisJICAgICAqLworCSAgICBleGl0KG1haW5fZXhpdGNvZGUpOworCX0KKyNlbmRpZgorICAgIH0KKyAgICAvKiBEb24ndCBmb3JrKCkgd2hlbiBzdGFydGluZyB0aGUgR1VJLiBTcGF3bmVkIHRocmVhZHMgYXJlIG5vdAorICAgICAqIGR1cGxpY2F0ZWQgd2l0aCBhIGZvcmsoKS4gVGhlIHJlc3VsdCBpcyBhIG1lc3MuCisgICAgICovCisgICAgZ3VpLmRvZm9yayA9IEZBTFNFOworICAgIC8qCisgICAgICogWFhYIFRyeSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSB3ZXJlIHN0YXJ0ZWQgZnJvbQorICAgICAqIHRoZSBUcmFja2VyIG9yIHRoZSB0ZXJtaW5hbC4KKyAgICAgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhpcyB3b3JrLCBiZWNhdXNlIHRoZSBUcmFja2VyCisgICAgICogZm9sbG93cyBzeW1saW5rcywgc28gZXZlbiBpZiB5b3UgZG91YmxlLWNsaWNrIG9uIGd2aW0sCisgICAgICogd2hlbiBpdCBpcyBhIGxpbmsgdG8gdmltIGl0IHdpbGwgc3RpbGwgcGFzcyBhIGNvbW1hbmQgbmFtZQorICAgICAqIG9mIHZpbS4uLgorICAgICAqIFdlIHRyeSBoZXJlIHRvIHNlZSBpZiBzdGRpbiBjb21lcyBmcm9tIC9kZXYvbnVsbC4gSWYgc28sCisgICAgICogKG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuKSBzdGFydCB0aGUgR1VJLgorICAgICAqIFRoaXMgZG9lcyB0aGUgd3JvbmcgdGhpbmcgZm9yIHZpbSAtIDwvZGV2L251bGwsIGFuZCB3ZSdyZQorICAgICAqIHRvbyBlYXJseSB0byBzZWUgdGhlIGNvbW1hbmQgbGluZSBwYXJzaW5nLiBUb3VnaC4KKyAgICAgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgc3RhcnRzIHRoZSBndWkgZm9yIHZpbSBmaWxlICYgd2hpY2ggaXMgbmljZS4KKyAgICAgKi8KKyAgICBpZiAoIWlzYXR0eSgwKSkgeworCXN0cnVjdCBzdGF0IHN0YXRfc3RkaW4sIHN0YXRfZGV2X251bGw7CisKKwlpZiAoZnN0YXQoMCwgJnN0YXRfc3RkaW4pID09IC0xIHx8CisJICAgIHN0YXQoIi9kZXYvbnVsbCIsICZzdGF0X2Rldl9udWxsKSA9PSAtMSB8fAorCSAgICAoc3RhdF9zdGRpbi5zdF9kZXYgPT0gc3RhdF9kZXZfbnVsbC5zdF9kZXYgJiYKKwkgICAgIHN0YXRfc3RkaW4uc3RfaW5vID09IHN0YXRfZGV2X251bGwuc3RfaW5vKSkKKwkgICAgZ3VpLnN0YXJ0aW5nID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgR1VJIGNhbiBiZSBzdGFydGVkLiAgQ2FsbGVkIGJlZm9yZSBndmltcmMgaXMgc291cmNlZC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50CitndWlfbWNoX2luaXRfY2hlY2sodm9pZCkKK3sKKyAgICByZXR1cm4gT0s7CQkvKiBUT0RPOiBHVUkgY2FuIGFsd2F5cyBiZSBzdGFydGVkPyAqLworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgR1VJLiAgQ3JlYXRlIGFsbCB0aGUgd2luZG93cywgc2V0IHVwIGFsbCB0aGUgY2FsbC1iYWNrcworICogZXRjLgorICovCisgICAgaW50CitndWlfbWNoX2luaXQoKQoreworICAgIGd1aS5kZWZfbm9ybV9waXhlbCA9IFJHQigweDAwLCAweDAwLCAweDAwKTsJLy8gYmxhY2sKKyAgICBndWkuZGVmX2JhY2tfcGl4ZWwgPSBSR0IoMHhGRiwgMHhGRiwgMHhGRik7CS8vIHdoaXRlCisgICAgZ3VpLm5vcm1fcGl4ZWwgPSBndWkuZGVmX25vcm1fcGl4ZWw7CisgICAgZ3VpLmJhY2tfcGl4ZWwgPSBndWkuZGVmX2JhY2tfcGl4ZWw7CisKKyAgICBndWkuc2Nyb2xsYmFyX3dpZHRoID0gKGludCkgQl9WX1NDUk9MTF9CQVJfV0lEVEg7CisgICAgZ3VpLnNjcm9sbGJhcl9oZWlnaHQgPSAoaW50KSBCX0hfU0NST0xMX0JBUl9IRUlHSFQ7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgZ3VpLm1lbnVfaGVpZ2h0ID0gMTk7CS8vIGluaXRpYWwgZ3Vlc3MgLQorCQkJCS8vIGNvcnJlY3QgZm9yIG15IGRlZmF1bHQgc2V0dGluZ3MKKyNlbmRpZgorICAgIGd1aS5ib3JkZXJfb2Zmc2V0ID0gMzsJLy8gY29vcmRpbmF0ZXMgYXJlIGluc2lkZSB3aW5kb3cgYm9yZGVycworCisgICAgaWYgKGd1aS52ZGNtcCA8IEJfT0spCisJcmV0dXJuIEZBSUw7CisgICAgZ2V0X2tleV9tYXAoJmtleU1hcCwgJmtleU1hcENoYXJzKTsKKworICAgIGd1aS52aW1XaW5kb3cgPSBuZXcgVmltV2luZG93KCk7CS8qIGhpZGRlbiBhbmQgbG9ja2VkICovCisgICAgaWYgKCFndWkudmltV2luZG93KQorCXJldHVybiBGQUlMOworCisgICAgZ3VpLnZpbVdpbmRvdy0+UnVuKCk7CQkvKiBSdW4oKSB1bmxvY2tzIGJ1dCBkb2VzIG5vdCBzaG93ICovCisKKyAgICAvKiBHZXQgdGhlIGNvbG9ycyBmcm9tIHRoZSAiTm9ybWFsIiBncm91cCAoc2V0IGluIHN5bnRheC5jIG9yIGluIGEgdmltcmMKKyAgICAgKiBmaWxlKSAqLworICAgIHNldF9ub3JtYWxfY29sb3JzKCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoYXQgbm9uZSBvZiB0aGUgY29sb3JzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAqLworICAgIGd1aV9jaGVja19jb2xvcnMoKTsKKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZvciB0aGUgaGlnaGxpZ2h0IGdyb3VwcyAoZ3VpX2NoZWNrX2NvbG9ycygpIG1pZ2h0IGhhdmUKKyAgICAgKiBjaGFuZ2VkIHRoZW0pICovCisgICAgaGlnaGxpZ2h0X2d1aV9zdGFydGVkKCk7CQkvKiByZS1pbml0IGNvbG9ycyBhbmQgZm9udHMgKi8KKworICAgIGd1aV9tY2hfbmV3X2NvbG9ycygpOwkJLyogd2luZG93IG11c3QgZXhpc3QgZm9yIHRoaXMgKi8KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgY29sb3IgaGFzIGJlZW4gY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbmV3X2NvbG9ycygpCit7CisgICAgcmdiX2NvbG9yIHJnYiA9IEdVSV9UT19SR0IoZ3VpLmJhY2tfcGl4ZWwpOworCisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCWd1aS52aW1Gb3JtLT5TZXRWaWV3Q29sb3IocmdiKTsKKwkvLyBEb2VzIHRoaXMgbm90IGhhdmUgdG9vIG11Y2ggZWZmZWN0IGZvciB0aG9zZSBzbWFsbCByZWN0YW5nbGVzPworCWd1aS52aW1Gb3JtLT5JbnZhbGlkYXRlKCk7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisvKgorICogT3BlbiB0aGUgR1VJIHdpbmRvdyB3aGljaCB3YXMgY3JlYXRlZCBieSBhIGNhbGwgdG8gZ3VpX21jaF9pbml0KCkuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfb3BlbigpCit7CisgICAgaWYgKGd1aV93aW5feCAhPSAtMSAmJiBndWlfd2luX3kgIT0gLTEpCisJZ3VpX21jaF9zZXRfd2lucG9zKGd1aV93aW5feCwgZ3VpX3dpbl95KTsKKworICAgIC8qIEFjdHVhbGx5IG9wZW4gdGhlIHdpbmRvdyAqLworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltV2luZG93LT5TaG93KCk7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisKKyNpZiBVU0VfVEhSRUFEX0ZPUl9JTlBVVF9XSVRIX1RJTUVPVVQKKwkvKiBLaWxsIHRoZSB0aHJlYWQgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBUZXJtaW5hbCAqLworCWJlb3NfY2xlYW51cF9yZWFkX3RocmVhZCgpOworI2VuZGlmCisKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2V4aXQoaW50IHZpbV9leGl0Y29kZSkKK3sKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdykgeworCXRocmVhZF9pZCB0aWQgPSBndWkudmltV2luZG93LT5UaHJlYWQoKTsKKwlndWkudmltV2luZG93LT5Mb2NrKCk7CisJZ3VpLnZpbVdpbmRvdy0+UXVpdCgpOworCS8qIFdhaXQgdW50aWwgaXQgaXMgdHJ1ZWx5IGdvbmUgKi8KKwlpbnQzMiBleGl0Y29kZTsKKwl3YWl0X2Zvcl90aHJlYWQodGlkLCAmZXhpdGNvZGUpOworICAgIH0KKyAgICBkZWxldGVfcG9ydChndWkudmRjbXApOworI2lmICFSVU5fQkFQUExJQ0FUSU9OX0lOX05FV19USFJFQUQKKyAgICAvKgorICAgICAqIFdlIGFyZSBpbiB0aGUgbWFpbigpIHRocmVhZCAtIHF1aXQgdGhlIEFwcCB0aHJlYWQgYW5kCisgICAgICogcXVpdCBvdXJzZWx2ZXMgKHBhc3Npbmcgb24gdGhlIGV4aXRjb2RlKS4gVXNlIGEgZ2xvYmFsIHNpbmNlIHRoZQorICAgICAqIHZhbHVlIGZyb20gZXhpdF90aHJlYWQoKSBpcyBvbmx5IHVzZWQgaWYgd2FpdF9mb3JfdGhyZWFkKCkgaXMKKyAgICAgKiBjYWxsZWQgaW4gdGltZSAocmFjZSBjb25kaXRpb24pLgorICAgICAqLworI2VuZGlmCisgICAgaWYgKGd1aS52aW1BcHApIHsKKwlWaW1UZXh0QXJlYVZpZXc6Omd1aUJsYW5rTW91c2UoZmFsc2UpOworCisJbWFpbl9leGl0Y29kZSA9IHZpbV9leGl0Y29kZTsKKyNpZiBSVU5fQkFQUExJQ0FUSU9OX0lOX05FV19USFJFQUQKKwl0aHJlYWRfaWQgdGlkID0gZ3VpLnZpbUFwcC0+VGhyZWFkKCk7CisJaW50MzIgZXhpdGNvZGU7CisJZ3VpLnZpbUFwcC0+TG9jaygpOworCWd1aS52aW1BcHAtPlF1aXQoKTsKKwlndWkudmltQXBwLT5VbmxvY2soKTsKKwl3YWl0X2Zvcl90aHJlYWQodGlkLCAmZXhpdGNvZGUpOworI2Vsc2UKKwlndWkudmltQXBwLT5Mb2NrKCk7CisJZ3VpLnZpbUFwcC0+UXVpdCgpOworCWd1aS52aW1BcHAtPlVubG9jaygpOworCS8qIHN1aWNpZGUgKi8KKwlleGl0X3RocmVhZCh2aW1fZXhpdGNvZGUpOworI2VuZGlmCisgICAgfQorICAgIC8qIElmIHdlIGFyZSBzb21laG93IHN0aWxsIGhlcmUsIGxldCBtY2hfZXhpdCgpIGhhbmRsZSB0aGluZ3MuICovCit9CisKKy8qCisgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvdy4KKyAqLworICAgIGludAorZ3VpX21jaF9nZXRfd2lucG9zKGludCAqeCwgaW50ICp5KQoreworICAgIC8qIFRPRE8gKi8KKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93IHRvIHRoZSBnaXZlbgorICogY29vcmRpbmF0ZXMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF93aW5wb3MoaW50IHgsIGludCB5KQoreworICAgIC8qIFRPRE8gKi8KK30KKworLyoKKyAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3NoZWxsc2l6ZSgKKyAgICBpbnQJCXdpZHRoLAorICAgIGludAkJaGVpZ2h0LAorICAgIGludAkJbWluX3dpZHRoLAorICAgIGludAkJbWluX2hlaWdodCwKKyAgICBpbnQJCWJhc2Vfd2lkdGgsCisgICAgaW50CQliYXNlX2hlaWdodCkKK3sKKyAgICAvKgorICAgICAqIFdlIGFyZSBiYXNpY2FsbHkgZ2l2ZW4gdGhlIHNpemUgb2YgdGhlIFZpbUZvcm0sIGlmIEkgdW5kZXJzdGFuZAorICAgICAqIGNvcnJlY3RseS4gU2luY2UgaXQgZmlsbHMgdGhlIHdpbmRvdyBjb21wbGV0ZWx5LCB0aGlzIHdpbGwgYWxzbworICAgICAqIGJlIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cuCisgICAgICovCisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCWd1aS52aW1XaW5kb3ctPlJlc2l6ZVRvKHdpZHRoIC0gUEVOX1dJRFRILCBoZWlnaHQgLSBQRU5fV0lEVEgpOworCisJLyogc2V0IHNpemUgbGltaXRzICovCisJZmxvYXQgbWluV2lkdGgsIG1heFdpZHRoLCBtaW5IZWlnaHQsIG1heEhlaWdodDsKKworCWd1aS52aW1XaW5kb3ctPkdldFNpemVMaW1pdHMoJm1pbldpZHRoLCAmbWF4V2lkdGgsCisJCQkJICAgICAmbWluSGVpZ2h0LCAmbWF4SGVpZ2h0KTsKKwlndWkudmltV2luZG93LT5TZXRTaXplTGltaXRzKG1pbl93aWR0aCwgbWF4V2lkdGgsCisJCQkJICAgICBtaW5faGVpZ2h0LCBtYXhIZWlnaHQpOworCisjaWYgSEFWRV9SM19PUl9MQVRFUgorCS8qCisJICogU2V0IHRoZSByZXNpemluZyBhbGlnbm1lbnQgZGVwZW5kaW5nIG9uIGZvbnQgc2l6ZS4KKwkgKiBYWFggVGhpcyBpcyB1bnRlc3RlZCwgc2luY2UgSSBkb24ndCBoYXZlIFIzIHlldC4KKwkgKi8KKwlTZXRXaW5kb3dBbGlnbm1lbnQoCisJICAgIEJfUElYRUxfQUxJR05NRU5ULAkJLy8gd2luZG93X2FsaWdubWVudCBtb2RlLAorCSAgICAxLAkJCQkvLyBpbnQzMiBoLAorCSAgICAwLAkJCQkvLyBpbnQzMiBoT2Zmc2V0ID0gMCwKKwkgICAgZ3VpLmNoYXJfd2lkdGgsCQkvLyBpbnQzMiB3aWR0aCA9IDAsCisJICAgIGJhc2Vfd2lkdGgsCQkJLy8gaW50MzIgd2lkdGhPZmZzZXQgPSAwLAorCSAgICAxLAkJCQkvLyBpbnQzMiB2ID0gMCwKKwkgICAgMCwJCQkJLy8gaW50MzIgdk9mZnNldCA9IDAsCisJICAgIGd1aS5jaGFyX2hlaWdodCwJCS8vIGludDMyIGhlaWdodCA9IDAsCisJICAgIGJhc2VfaGVpZ2h0CQkJLy8gaW50MzIgaGVpZ2h0T2Zmc2V0ID0gMAorCSk7CisjZWxzZQorCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIGJhc2Vfe3dpZHRoLGhlaWdodH0uICovCisjZW5kaWYKKworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworICAgIHZvaWQKK2d1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKAorICAgIGludAkJKnNjcmVlbl93LAorICAgIGludAkJKnNjcmVlbl9oKQoreworICAgIEJSZWN0IGZyYW1lOworCisgICAgeworCUJTY3JlZW4gc2NyZWVuKGd1aS52aW1XaW5kb3cpOworCisJaWYgKHNjcmVlbi5Jc1ZhbGlkKCkpIHsKKwkgICAgZnJhbWUgPSBzY3JlZW4uRnJhbWUoKTsKKwl9IGVsc2UgeworCSAgICBmcmFtZS5yaWdodCA9IDY0MDsKKwkgICAgZnJhbWUuYm90dG9tID0gNDgwOworCX0KKyAgICB9CisKKyAgICAvKiBYWFggYXBwcm94aW1hdGlvbnMuLi4gKi8KKyAgICAqc2NyZWVuX3cgPSAoaW50KSBmcmFtZS5yaWdodCAtIDIgKiBndWkuc2Nyb2xsYmFyX3dpZHRoIC0gMjA7CisgICAgKnNjcmVlbl9oID0gKGludCkgZnJhbWUuYm90dG9tIC0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQKKyNpZmRlZiBGRUFUX01FTlUKKwktIGd1aS5tZW51X2hlaWdodAorI2VuZGlmCisJLSAzMDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MoCisgICAgaW50CQl4LAorICAgIGludAkJeSwKKyAgICBpbnQJCXcsCisgICAgaW50CQloKQoreworICAgIGlmICghZ3VpLnZpbVRleHRBcmVhKQorCXJldHVybjsKKworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltVGV4dEFyZWEtPk1vdmVUbyh4LCB5KTsKKwlndWkudmltVGV4dEFyZWEtPlJlc2l6ZVRvKHcgLSBQRU5fV0lEVEgsIGggLSBQRU5fV0lEVEgpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworCisvKgorICogU2Nyb2xsYmFyIHN0dWZmOgorICovCisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoCisgICAgc2Nyb2xsYmFyX1QJKnNiLAorICAgIGludAkJZmxhZykKK3sKKyAgICBWaW1TY3JvbGxCYXIgKnZzYiA9IHNiLT5pZDsKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIGlkZW1wb3RlbnQsIGJ1dCBTaG93KCkvSGlkZSgpCisJICogaXMgbm90LiBUaGVyZWZvcmUgd2UgdGVzdCBpZiB0aGV5IGFyZSBuZWVkZWQuCisJICovCisJaWYgKGZsYWcpIHsKKwkgICAgaWYgKHZzYi0+SXNIaWRkZW4oKSkgeworCQl2c2ItPlNob3coKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICghdnNiLT5Jc0hpZGRlbigpKSB7CisJCXZzYi0+SGlkZSgpOworCSAgICB9CisJfQorCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYigKKyAgICBzY3JvbGxiYXJfVCAqc2IsCisgICAgaW50CQl2YWwsCisgICAgaW50CQlzaXplLAorICAgIGludAkJbWF4KQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlWaW1TY3JvbGxCYXIgKnMgPSBzYi0+aWQ7CisJaWYgKG1heCA9PSAwKSB7CisJICAgIHMtPlNldFZhbHVlKDApOworCSAgICBzLT5TZXRSYW5nZSgwLjAsIDAuMCk7CisJfSBlbHNlIHsKKwkgICAgcy0+U2V0UHJvcG9ydGlvbigoZmxvYXQpc2l6ZSAvIChtYXggKyAxLjApKTsKKwkgICAgcy0+U2V0U3RlcHMoMS4wLCBzaXplID4gNSA/IHNpemUgLSAyIDogc2l6ZSk7CisjaWZuZGVmIFNDUk9MTF9QQVNUX0VORAkJLy8gcmVhbGx5IG9ubHkgZGVmaW5lZCBpbiBndWkuYy4uLgorCSAgICBtYXggPSBtYXggKyAxIC0gc2l6ZTsKKyNlbmRpZgorCSAgICBpZiAobWF4IDwgcy0+VmFsdWUoKSkgeworCQkvKgorCQkgKiBJZiB0aGUgbmV3IG1heGltdW0gaXMgbG93ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSwKKwkJICogc2V0dGluZyBpdCB3b3VsZCBjYXVzZSB0aGUgdmFsdWUgdG8gYmUgY2xpcHBlZCBhbmQKKwkJICogdGhlcmVmb3JlIGEgVmFsdWVDaGFuZ2VkKCkgY2FsbC4KKwkJICogV2UgYXZvaWQgdGhpcyBieSBzZXR0aW5nIHRoZSB2YWx1ZSBmaXJzdCwgYmVjYXVzZQorCQkgKiBpdCBwcmVzdW1hYmx5IGlzIDw9IG1heC4KKwkJICovCisJCXMtPlNldFZhbHVlKHZhbCk7CisJCXMtPlNldFJhbmdlKDAuMCwgbWF4KTsKKwkgICAgfSBlbHNlIHsKKwkJLyoKKwkJICogSW4gdGhlIG90aGVyIGNhc2UsIHNldCB0aGUgcmFuZ2UgZmlyc3QsIHNpbmNlIHRoZQorCQkgKiBuZXcgdmFsdWUgbWlnaHQgYmUgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQgbWF4LgorCQkgKi8KKwkJcy0+U2V0UmFuZ2UoMC4wLCBtYXgpOworCQlzLT5TZXRWYWx1ZSh2YWwpOworCSAgICB9CisJfQorCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3MoCisgICAgc2Nyb2xsYmFyX1QgKnNiLAorICAgIGludAkJeCwKKyAgICBpbnQJCXksCisgICAgaW50CQl3LAorICAgIGludAkJaCkKK3sKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJVmltU2Nyb2xsQmFyICp2c2IgPSBzYi0+aWQ7CisJdnNiLT5Nb3ZlVG8oeCwgeSk7CisJdnNiLT5SZXNpemVUbyh3IC0gUEVOX1dJRFRILCBoIC0gUEVOX1dJRFRIKTsKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoCisgICAgc2Nyb2xsYmFyX1QgKnNiLAorICAgIGludAkJb3JpZW50KQkJLyogU0JBUl9WRVJUIG9yIFNCQVJfSE9SSVogKi8KK3sKKyAgICBvcmllbnRhdGlvbiBwb3N0dXJlID0KKwkob3JpZW50ID09IFNCQVJfSE9SSVopID8gQl9IT1JJWk9OVEFMIDogQl9WRVJUSUNBTDsKKworICAgIFZpbVNjcm9sbEJhciAqdnNiID0gc2ItPmlkID0gbmV3IFZpbVNjcm9sbEJhcihzYiwgcG9zdHVyZSk7CisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCXZzYi0+U2V0VGFyZ2V0KGd1aS52aW1UZXh0QXJlYSk7CisJdnNiLT5IaWRlKCk7CisJZ3VpLnZpbUZvcm0tPkFkZENoaWxkKHZzYik7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhcigKKyAgICBzY3JvbGxiYXJfVAkqc2IpCit7CisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCXNiLT5pZC0+UmVtb3ZlU2VsZigpOworCWRlbGV0ZSBzYi0+aWQ7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBDdXJzb3IgYmxpbmsgZnVuY3Rpb25zLgorICoKKyAqIFRoaXMgaXMgYSBzaW1wbGUgc3RhdGUgbWFjaGluZToKKyAqIEJMSU5LX05PTkUJbm90IGJsaW5raW5nIGF0IGFsbAorICogQkxJTktfT0ZGCWJsaW5raW5nLCBjdXJzb3IgaXMgbm90IHNob3duCisgKiBCTElOS19PTglibGlua2luZywgY3Vyc29yIGlzIHNob3duCisgKi8KKworI2RlZmluZSBCTElOS19OT05FICAwCisjZGVmaW5lIEJMSU5LX09GRiAgIDEKKyNkZWZpbmUgQkxJTktfT04gICAgMgorCitzdGF0aWMgaW50CQlibGlua19zdGF0ZSA9IEJMSU5LX05PTkU7CitzdGF0aWMgbG9uZ191CQlibGlua193YWl0dGltZSA9IDcwMDsKK3N0YXRpYyBsb25nX3UJCWJsaW5rX29udGltZSA9IDQwMDsKK3N0YXRpYyBsb25nX3UJCWJsaW5rX29mZnRpbWUgPSAyNTA7CitzdGF0aWMgaW50CWJsaW5rX3RpbWVyID0gMDsKKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JsaW5raW5nKAorICAgIGxvbmcgICAgd2FpdHRpbWUsCisgICAgbG9uZyAgICBvbiwKKyAgICBsb25nICAgIG9mZikKK3sKKwkvKiBUT0RPICovCisgICAgYmxpbmtfd2FpdHRpbWUgPSB3YWl0dGltZTsKKyAgICBibGlua19vbnRpbWUgPSBvbjsKKyAgICBibGlua19vZmZ0aW1lID0gb2ZmOworfQorCisvKgorICogU3RvcCB0aGUgY3Vyc29yIGJsaW5raW5nLiAgU2hvdyB0aGUgY3Vyc29yIGlmIGl0IHdhc24ndCBzaG93bi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RvcF9ibGluaygpCit7CisJLyogVE9ETyAqLworICAgIGlmIChibGlua190aW1lciAhPSAwKQorICAgIHsKKwkvL1h0UmVtb3ZlVGltZU91dChibGlua190aW1lcik7CisJYmxpbmtfdGltZXIgPSAwOworICAgIH0KKyAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT0ZGKQorCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKyAgICBibGlua19zdGF0ZSA9IEJMSU5LX05PTkU7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgY3Vyc29yIGJsaW5raW5nLiAgSWYgaXQgd2FzIGFscmVhZHkgYmxpbmtpbmcsIHRoaXMgcmVzdGFydHMgdGhlCisgKiB3YWl0aW5nIHRpbWUgYW5kIHNob3dzIHRoZSBjdXJzb3IuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3N0YXJ0X2JsaW5rKCkKK3sKKwkvKiBUT0RPICovCisgICAgaWYgKGJsaW5rX3RpbWVyICE9IDApCisJOy8vWHRSZW1vdmVUaW1lT3V0KGJsaW5rX3RpbWVyKTsKKyAgICAvKiBPbmx5IHN3aXRjaCBibGlua2luZyBvbiBpZiBub25lIG9mIHRoZSB0aW1lcyBpcyB6ZXJvICovCisgICAgaWYgKGJsaW5rX3dhaXR0aW1lICYmIGJsaW5rX29udGltZSAmJiBibGlua19vZmZ0aW1lICYmIGd1aS5pbl9mb2N1cykKKyAgICB7CisJYmxpbmtfdGltZXIgPSAxOyAvL1h0QXBwQWRkVGltZU91dChhcHBfY29udGV4dCwgYmxpbmtfd2FpdHRpbWUsCisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgfQorfQorCisvKgorICogSW5pdGlhbGlzZSB2aW0gdG8gdXNlIHRoZSBmb250IHdpdGggdGhlIGdpdmVuIG5hbWUuCVJldHVybiBGQUlMIGlmIHRoZSBmb250CisgKiBjb3VsZCBub3QgYmUgbG9hZGVkLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaW5pdF9mb250KAorICAgIGNoYXJfdQkJKmZvbnRfbmFtZSwKKyAgICBpbnQJCQlmb250c2V0KQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpCisgICAgeworCWludCByYyA9IGd1aS52aW1UZXh0QXJlYS0+bWNoSW5pdEZvbnQoZm9udF9uYW1lKTsKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIGludAorZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUoKQoreworICAgIHJldHVybiBGQUlMOworfQorCisgICAgR3VpRm9udAorZ3VpX21jaF9nZXRfZm9udCgKKyAgICBjaGFyX3UJCSpuYW1lLAorICAgIGludAkJCWdpdmVFcnJvcklmTWlzc2luZykKK3sKKyAgICBWaW1Gb250CQkqZm9udCA9IDA7CisgICAgc3RhdGljIFZpbUZvbnQgKmZvbnRMaXN0ID0gTlVMTDsKKworICAgIGlmICghZ3VpLmluX3VzZSkJCSAgICAvKiBjYW4ndCBkbyB0aGlzIHdoZW4gR1VJIG5vdCBydW5uaW5nICovCisJcmV0dXJuIE5PRk9OVDsKKworICAgIGlmICghbmFtZSkKKwluYW1lID0gKGNoYXJfdSAqKSJiZV9maXhlZF9mb250IjsKKworICAgIFZpbUZvbnQgKmZscDsKKyAgICBmb3IgKGZscCA9IGZvbnRMaXN0OyBmbHA7IGZscCA9IGZscC0+bmV4dCkgeworCWlmIChTVFJDTVAobmFtZSwgZmxwLT5uYW1lKSA9PSAwKSB7CisJICAgIGZscC0+cmVmY291bnQrKzsKKwkgICAgcmV0dXJuIChHdWlGb250KWZscDsKKwl9CisgICAgfQorCisgICAgZm9udCA9IG5ldyBWaW1Gb250KGJlX2ZpeGVkX2ZvbnQpOworCisgICAgLyogU2V0IHNvbWUgdW5pdmVyc2FsIGZlYXR1cmVzOiAqLworICAgIGZvbnQtPlNldFNwYWNpbmcoQl9GSVhFRF9TUEFDSU5HKTsKKyAgICBmb250LT5TZXRFbmNvZGluZyhCX0lTT184ODU5XzEpOworCisgICAgLyogUmVtZW1iZXIgZm9udCBmb3IgbGF0ZXIgdXNlICovCisgICAgZm9udC0+bmFtZSA9IHZpbV9zdHJzYXZlKG5hbWUpOworICAgIGZvbnQtPm5leHQgPSBmb250TGlzdDsKKyAgICBmb250TGlzdCA9IGZvbnQ7CisKKyAgICBmb250X2ZhbWlseSBmYW1pbHk7CisgICAgZm9udF9zdHlsZSBzdHlsZTsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgbGVuOworICAgIGNoYXJfdSAqZW5kOworCisjaWZkZWYgbmV2ZXIKKyAgICAvLyBUaGlzIGxlYWRzIHRvIFNFR1YvQlVTIG9uIFI0KworICAgIC8vIFJlcGxhY2UgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXMsIGFuZCBJIGNhbid0IHNlZSB3aHkgPworICAgIC8vIHJpY2hhcmRAd2hpdGVxdWVlbi5jb20ganVsIDk5CisgICAgd2hpbGUgKGVuZCA9IChjaGFyX3UgKilzdHJjaHIoKGNoYXIgKiluYW1lLCAnXycpKQorCSplbmQgPSAnICc7CisjZW5kaWYKKyAgICAvKgorICAgICAqICBQYXJzZSBmb250IG5hbWVzIGFzIEZhbWlseS9TdHlsZS9TaXplLgorICAgICAqICBPbiBlcnJvcnMsIGp1c3Qga2VlcCB0aGUgYmVfZml4ZWRfZm9udC4KKyAgICAgKi8KKyAgICBlbmQgPSAoY2hhcl91ICopc3RyY2hyKChjaGFyICopbmFtZSwgJy8nKTsKKyAgICBpZiAoIWVuZCkKKwlnb3RvIGVycm9yOworICAgIHN0cm5jcHkoZmFtaWx5LCAoY2hhciAqKW5hbWUsIGxlbiA9IGVuZCAtIG5hbWUpOworICAgIGZhbWlseVtsZW5dID0gJ1wwJzsKKworICAgIG5hbWUgPSBlbmQgKyAxOworICAgIGVuZCA9IChjaGFyX3UgKilzdHJjaHIoKGNoYXIgKiluYW1lLCAnLycpOworICAgIGlmICghZW5kKQorCWdvdG8gZXJyb3I7CisgICAgc3RybmNweShzdHlsZSwgKGNoYXIgKiluYW1lLCBsZW4gPSBlbmQgLSBuYW1lKTsKKyAgICBzdHlsZVtsZW5dID0gJ1wwJzsKKworICAgIG5hbWUgPSBlbmQgKyAxOworICAgIHNpemUgPSBhdG9pKChjaGFyICopbmFtZSk7CisgICAgaWYgKHNpemUgPD0gMCkKKwlnb3RvIGVycm9yOworCisgICAgZm9udC0+U2V0RmFtaWx5QW5kU3R5bGUoZmFtaWx5LCBzdHlsZSk7CisgICAgZm9udC0+U2V0U2l6ZShzaXplKTsKKyAgICBmb250LT5TZXRTcGFjaW5nKEJfRklYRURfU1BBQ0lORyk7CisgICAgZm9udC0+U2V0RW5jb2RpbmcoQl9JU09fODg1OV8xKTsKKyAgICAvL2ZvbnQtPlByaW50VG9TdHJlYW0oKTsKKworICAgIHJldHVybiAoR3VpRm9udClmb250OworCitlcnJvcjoKKyAgICBpZiAoZ2l2ZUVycm9ySWZNaXNzaW5nKQorCUVNU0cyKCIoZmUwKSBVbmtub3duIGZvbnQ6ICVzIiwgbmFtZSk7CisKKyAgICByZXR1cm4gKEd1aUZvbnQpZm9udDsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb250KAorICAgIEd1aUZvbnQJZm9udCkKK3sKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJVmltRm9udCAqdmYgPSAoVmltRm9udCAqKWZvbnQ7CisKKwlndWkudmltVGV4dEFyZWEtPlNldEZvbnQodmYpOworCisJZ3VpLmNoYXJfd2lkdGggPSAoaW50KSB2Zi0+U3RyaW5nV2lkdGgoIm4iKTsKKwlmb250X2hlaWdodCBmaDsKKwl2Zi0+R2V0SGVpZ2h0KCZmaCk7CisJZ3VpLmNoYXJfaGVpZ2h0ID0gKGludCkoZmguYXNjZW50ICsgMC45OTk5KQorCQkgICAgKyAoaW50KShmaC5kZXNjZW50ICsgMC45OTk5KSArIChpbnQpKGZoLmxlYWRpbmcgKyAwLjk5OTkpOworCWd1aS5jaGFyX2FzY2VudCA9IChpbnQpKGZoLmFzY2VudCArIDAuOTk5OSk7CisKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIHR3byBmb250cyBnaXZlbiBhcmUgZXF1aXZhbGVudC4KKyAqLworICAgIGludAorZ3VpX21jaF9zYW1lX2ZvbnQoCisgICAgR3VpRm9udAlmMSwKKyAgICBHdWlGb250CWYyKQoreworICAgIFZpbUZvbnQgKnZmMSA9IChWaW1Gb250ICopZjE7CisgICAgVmltRm9udCAqdmYyID0gKFZpbUZvbnQgKilmMjsKKworICAgIHJldHVybiBmMSA9PSBmMiB8fAorCSAgICAodmYxLT5GYW1pbHlBbmRTdHlsZSgpID09IHZmMi0+RmFtaWx5QW5kU3R5bGUoKSAmJgorCSAgICAgdmYxLT5TaXplKCkgPT0gdmYyLT5TaXplKCkpOworfQorI2VuZGlmCisKKy8qIFhYWCBUT0RPIFRoaXMgaXMgYXBwYXJlbnRseSBuZXZlciBjYWxsZWQuLi4gKi8KKyAgICB2b2lkCitndWlfbWNoX2ZyZWVfZm9udCgKKyAgICBHdWlGb250CWZvbnQpCit7CisgICAgVmltRm9udCAqZiA9IChWaW1Gb250ICopZm9udDsKKyAgICBpZiAoLS1mLT5yZWZjb3VudCA8PSAwKSB7CisJaWYgKGYtPnJlZmNvdW50IDwgMCkKKwkgICAgZnByaW50ZihzdGRlcnIsICJWaW1Gb250OiByZWZjb3VudCA8IDBcbiIpOworCWRlbGV0ZSBmOworICAgIH0KK30KKworICAgIHN0YXRpYyBpbnQKK2hleF9kaWdpdChpbnQgYykKK3sKKyAgICBpZiAoaXNkaWdpdChjKSkKKwlyZXR1cm4gYyAtICcwJzsKKyAgICBjID0gVE9MT1dFUl9BU0MoYyk7CisgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCXJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIC0xMDAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBsaWZ0ZWQgZnJvbSBndWlfdzMyLmMgYW5kIGV4dGVuZGVkIGEgYml0LgorICoKKyAqIFJldHVybiB0aGUgUGl4ZWwgdmFsdWUgKGNvbG9yKSBmb3IgdGhlIGdpdmVuIGNvbG9yIG5hbWUuCisgKiBSZXR1cm4gSU5WQUxDT0xPUiBmb3IgZXJyb3IuCisgKi8KKyAgICBndWljb2xvcl9UCitndWlfbWNoX2dldF9jb2xvcigKKyAgICBjaGFyX3UJKm5hbWUpCit7CisgICAgdHlwZWRlZiBzdHJ1Y3QgR3VpQ29sb3VyVGFibGUKKyAgICB7CisJY2hhcgkgICAgKm5hbWU7CisJZ3VpY29sb3JfVCAgICAgY29sb3VyOworICAgIH0gR3VpQ29sb3VyVGFibGU7CisKKyNkZWZpbmUgTlNUQVRJQ19DT0xPVVJTCQkzMgorI2RlZmluZSBORFlOQU1JQ19DT0xPVVJTCTMzCisjZGVmaW5lIE5DT0xPVVJTCQkoTlNUQVRJQ19DT0xPVVJTICsgTkRZTkFNSUNfQ09MT1VSUykKKworICAgIHN0YXRpYyBHdWlDb2xvdXJUYWJsZSB0YWJsZVtOQ09MT1VSU10gPQorICAgIHsKKwl7IkJsYWNrIiwJICAgIFJHQigweDAwLCAweDAwLCAweDAwKX0sCisJeyJEYXJrR3JheSIsCSAgICBSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LAorCXsiRGFya0dyZXkiLAkgICAgUkdCKDB4ODAsIDB4ODAsIDB4ODApfSwKKwl7IkdyYXkiLAkgICAgUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkdyZXkiLAkgICAgUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkxpZ2h0R3JheSIsCSAgICBSR0IoMHhEMywgMHhEMywgMHhEMyl9LAorCXsiTGlnaHRHcmV5IiwJICAgIFJHQigweEQzLCAweEQzLCAweEQzKX0sCisJeyJXaGl0ZSIsCSAgICBSR0IoMHhGRiwgMHhGRiwgMHhGRil9LAorCXsiRGFya1JlZCIsCSAgICBSR0IoMHg4MCwgMHgwMCwgMHgwMCl9LAorCXsiUmVkIiwJCSAgICBSR0IoMHhGRiwgMHgwMCwgMHgwMCl9LAorCXsiTGlnaHRSZWQiLAkgICAgUkdCKDB4RkYsIDB4QTAsIDB4QTApfSwKKwl7IkRhcmtCbHVlIiwJICAgIFJHQigweDAwLCAweDAwLCAweDgwKX0sCisJeyJCbHVlIiwJICAgIFJHQigweDAwLCAweDAwLCAweEZGKX0sCisJeyJMaWdodEJsdWUiLAkgICAgUkdCKDB4QTAsIDB4QTAsIDB4RkYpfSwKKwl7IkRhcmtHcmVlbiIsCSAgICBSR0IoMHgwMCwgMHg4MCwgMHgwMCl9LAorCXsiR3JlZW4iLAkgICAgUkdCKDB4MDAsIDB4RkYsIDB4MDApfSwKKwl7IkxpZ2h0R3JlZW4iLAkgICAgUkdCKDB4QTAsIDB4RkYsIDB4QTApfSwKKwl7IkRhcmtDeWFuIiwJICAgIFJHQigweDAwLCAweDgwLCAweDgwKX0sCisJeyJDeWFuIiwJICAgIFJHQigweDAwLCAweEZGLCAweEZGKX0sCisJeyJMaWdodEN5YW4iLAkgICAgUkdCKDB4QTAsIDB4RkYsIDB4RkYpfSwKKwl7IkRhcmtNYWdlbnRhIiwJICAgIFJHQigweDgwLCAweDAwLCAweDgwKX0sCisJeyJNYWdlbnRhIiwJICAgIFJHQigweEZGLCAweDAwLCAweEZGKX0sCisJeyJMaWdodE1hZ2VudGEiLCAgICBSR0IoMHhGRiwgMHhBMCwgMHhGRil9LAorCXsiQnJvd24iLAkgICAgUkdCKDB4ODAsIDB4NDAsIDB4NDApfSwKKwl7IlllbGxvdyIsCSAgICBSR0IoMHhGRiwgMHhGRiwgMHgwMCl9LAorCXsiTGlnaHRZZWxsb3ciLAkgICAgUkdCKDB4RkYsIDB4RkYsIDB4QTApfSwKKwl7IkRhcmtZZWxsb3ciLAkgICAgUkdCKDB4QkIsIDB4QkIsIDB4MDApfSwKKwl7IlNlYUdyZWVuIiwJICAgIFJHQigweDJFLCAweDhCLCAweDU3KX0sCisJeyJPcmFuZ2UiLAkgICAgUkdCKDB4RkYsIDB4QTUsIDB4MDApfSwKKwl7IlB1cnBsZSIsCSAgICBSR0IoMHhBMCwgMHgyMCwgMHhGMCl9LAorCXsiU2xhdGVCbHVlIiwJICAgIFJHQigweDZBLCAweDVBLCAweENEKX0sCisJeyJWaW9sZXQiLAkgICAgUkdCKDB4RUUsIDB4ODIsIDB4RUUpfSwKKyAgICB9OworCisgICAgc3RhdGljIGludCBlbmRDb2xvdXIgPSBOU1RBVElDX0NPTE9VUlM7CisgICAgc3RhdGljIGludCBuZXdDb2xvdXIgPSBOU1RBVElDX0NPTE9VUlM7CisKKyAgICBpbnQJCSAgICByLCBnLCBiOworICAgIGludAkJICAgIGk7CisKKyAgICBpZiAobmFtZVswXSA9PSAnIycgJiYgU1RSTEVOKG5hbWUpID09IDcpCisgICAgeworCS8qIE5hbWUgaXMgaW4gIiNycmdnYmIiIGZvcm1hdCAqLworCXIgPSBoZXhfZGlnaXQobmFtZVsxXSkgKiAxNiArIGhleF9kaWdpdChuYW1lWzJdKTsKKwlnID0gaGV4X2RpZ2l0KG5hbWVbM10pICogMTYgKyBoZXhfZGlnaXQobmFtZVs0XSk7CisJYiA9IGhleF9kaWdpdChuYW1lWzVdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNl0pOworCWlmIChyIDwgMCB8fCBnIDwgMCB8fCBiIDwgMCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisJcmV0dXJuIFJHQihyLCBnLCBiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBDaGVjayBpZiB0aGUgbmFtZSBpcyBvbmUgb2YgdGhlIGNvbG91cnMgd2Uga25vdyAqLworCWZvciAoaSA9IDA7IGkgPCBlbmRDb2xvdXI7IGkrKykKKwkgICAgaWYgKFNUUklDTVAobmFtZSwgdGFibGVbaV0ubmFtZSkgPT0gMCkKKwkJcmV0dXJuIHRhYmxlW2ldLmNvbG91cjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExhc3QgYXR0ZW1wdC4gTG9vayBpbiB0aGUgZmlsZSAiJFZJTS9yZ2IudHh0Ii4KKyAgICAgKi8KKyAgICB7CisjZGVmaW5lIExJTkVfTEVOIDEwMAorCUZJTEUJKmZkOworCWNoYXIJbGluZVtMSU5FX0xFTl07CisJY2hhcl91CSpmbmFtZTsKKworCWZuYW1lID0gZXhwYW5kX2Vudl9zYXZlKChjaGFyX3UgKikiJFZJTS9yZ2IudHh0Iik7CisJaWYgKGZuYW1lID09IE5VTEwpCisJICAgIHJldHVybiBJTlZBTENPTE9SOworCisJZmQgPSBmb3BlbigoY2hhciAqKWZuYW1lLCAicnQiKTsKKwl2aW1fZnJlZShmbmFtZSk7CisJaWYgKGZkID09IE5VTEwpCisJICAgIHJldHVybiBJTlZBTENPTE9SOworCisJd2hpbGUgKCFmZW9mKGZkKSkKKwl7CisJICAgIGludAkgICAgbGVuOworCSAgICBpbnQJICAgIHBvczsKKwkgICAgY2hhciAgICAqY29sb3VyOworCisJICAgIGZnZXRzKGxpbmUsIExJTkVfTEVOLCBmZCk7CisJICAgIGxlbiA9IHN0cmxlbihsaW5lKTsKKworCSAgICBpZiAobGVuIDw9IDEgfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJY29udGludWU7CisKKwkgICAgbGluZVtsZW4tMV0gPSAnXDAnOworCisJICAgIGkgPSBzc2NhbmYobGluZSwgIiVkICVkICVkICVuIiwgJnIsICZnLCAmYiwgJnBvcyk7CisJICAgIGlmIChpICE9IDMpCisJCWNvbnRpbnVlOworCisJICAgIGNvbG91ciA9IGxpbmUgKyBwb3M7CisKKwkgICAgaWYgKFNUUklDTVAoY29sb3VyLCBuYW1lKSA9PSAwKQorCSAgICB7CisJCWZjbG9zZShmZCk7CisJCS8qCisJCSAqIE5vdyByZW1lbWJlciB0aGlzIGNvbG91ciBpbiB0aGUgdGFibGUuCisJCSAqIEEgTFJVIHNjaGVtZSBtaWdodCBiZSBiZXR0ZXIgYnV0IHRoaXMgaXMgc2ltcGxlci4KKwkJICogT3IgY291bGQgdXNlIGEgZ3Jvd2luZyBhcnJheS4KKwkJICovCisJCWd1aWNvbG9yX1QgZ2NvbG91ciA9IFJHQihyLGcsYik7CisKKwkJdmltX2ZyZWUodGFibGVbbmV3Q29sb3VyXS5uYW1lKTsKKwkJdGFibGVbbmV3Q29sb3VyXS5uYW1lID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopY29sb3VyKTsKKwkJdGFibGVbbmV3Q29sb3VyXS5jb2xvdXIgPSBnY29sb3VyOworCisJCW5ld0NvbG91cisrOworCQlpZiAobmV3Q29sb3VyID49IE5DT0xPVVJTKQorCQkgICAgbmV3Q29sb3VyID0gTlNUQVRJQ19DT0xPVVJTOworCQlpZiAoZW5kQ29sb3VyIDwgTkNPTE9VUlMpCisJCSAgICBlbmRDb2xvdXIgPSBuZXdDb2xvdXI7CisKKwkJcmV0dXJuIGdjb2xvdXI7CisJICAgIH0KKwl9CisKKwlmY2xvc2UoZmQpOworICAgIH0KKworICAgIHJldHVybiBJTlZBTENPTE9SOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9yZWdyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZnX2NvbG9yKAorICAgIGd1aWNvbG9yX1QJY29sb3IpCit7CisgICAgcmdiX2NvbG9yIHJnYiA9IEdVSV9UT19SR0IoY29sb3IpOworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltVGV4dEFyZWEtPlNldEhpZ2hDb2xvcihyZ2IpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGJhY2tncm91bmQgY29sb3IuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9iZ19jb2xvcigKKyAgICBndWljb2xvcl9UCWNvbG9yKQoreworICAgIHJnYl9jb2xvciByZ2IgPSBHVUlfVE9fUkdCKGNvbG9yKTsKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJZ3VpLnZpbVRleHRBcmVhLT5TZXRMb3dDb2xvcihyZ2IpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19zdHJpbmcoCisgICAgaW50CQlyb3csCisgICAgaW50CQljb2wsCisgICAgY2hhcl91CSpzLAorICAgIGludAkJbGVuLAorICAgIGludAkJZmxhZ3MpCit7CisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCWd1aS52aW1UZXh0QXJlYS0+bWNoRHJhd1N0cmluZyhyb3csIGNvbCwgcywgbGVuLCBmbGFncyk7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIE9LIGlmIHRoZSBrZXkgd2l0aCB0aGUgdGVybWNhcCBuYW1lICJuYW1lIiBpcyBzdXBwb3J0ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KAorICAgIGNoYXJfdQkqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5CZUtleXMgIT0gMDsgaSsrKQorCWlmIChuYW1lWzBdID09IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTAgJiYKKwkJCQkJIG5hbWVbMV0gPT0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSkKKwkgICAgcmV0dXJuIE9LOworICAgIHJldHVybiBGQUlMOworfQorCisgICAgdm9pZAorZ3VpX21jaF9iZWVwKCkKK3sKKyAgICA6OmJlZXAoKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZmxhc2goaW50IG1zZWMpCit7CisgICAgLyogRG8gYSB2aXN1YWwgYmVlcCBieSByZXZlcnNpbmcgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzICovCisKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJQlJlY3QgcmVjdCA9IGd1aS52aW1UZXh0QXJlYS0+Qm91bmRzKCk7CisKKwlndWkudmltVGV4dEFyZWEtPlNldERyYXdpbmdNb2RlKEJfT1BfSU5WRVJUKTsKKwlndWkudmltVGV4dEFyZWEtPkZpbGxSZWN0KHJlY3QpOworCWd1aS52aW1UZXh0QXJlYS0+U3luYygpOworCXNub296ZShtc2VjICogMTAwMCk7CSAvKiB3YWl0IGZvciBhIGZldyBtc2VjICovCisJZ3VpLnZpbVRleHRBcmVhLT5GaWxsUmVjdChyZWN0KTsKKwlndWkudmltVGV4dEFyZWEtPlNldERyYXdpbmdNb2RlKEJfT1BfQ09QWSk7CisJZ3VpLnZpbVRleHRBcmVhLT5GbHVzaCgpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworLyoKKyAqIEludmVydCBhIHJlY3RhbmdsZSBmcm9tIHJvdyByLCBjb2x1bW4gYywgZm9yIG5yIHJvd3MgYW5kIG5jIGNvbHVtbnMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ludmVydF9yZWN0YW5nbGUoCisgICAgaW50CQlyLAorICAgIGludAkJYywKKyAgICBpbnQJCW5yLAorICAgIGludAkJbmMpCit7CisgICAgQlJlY3QgcmVjdDsKKyAgICByZWN0LmxlZnQgPSBGSUxMX1goYyk7CisgICAgcmVjdC50b3AgPSBGSUxMX1kocik7CisgICAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIG5jICogZ3VpLmNoYXJfd2lkdGggLSBQRU5fV0lEVEg7CisgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIG5yICogZ3VpLmNoYXJfaGVpZ2h0IC0gUEVOX1dJRFRIOworCisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCWd1aS52aW1UZXh0QXJlYS0+U2V0RHJhd2luZ01vZGUoQl9PUF9JTlZFUlQpOworCWd1aS52aW1UZXh0QXJlYS0+RmlsbFJlY3QocmVjdCk7CisJZ3VpLnZpbVRleHRBcmVhLT5TZXREcmF3aW5nTW9kZShCX09QX0NPUFkpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworLyoKKyAqIEljb25pZnkgdGhlIEdVSSB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ljb25pZnkoKQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltV2luZG93LT5NaW5pbWl6ZSh0cnVlKTsKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBCcmluZyB0aGUgVmltIHdpbmRvdyB0byB0aGUgZm9yZWdyb3VuZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZvcmVncm91bmQoKQoreworICAgIC8qIFRPRE8gKi8KK30KKyNlbmRpZgorCisvKgorICogU2V0IHRoZSB3aW5kb3cgdGl0bGUKKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0dGl0bGUoCisgICAgY2hhcl91CSp0aXRsZSwKKyAgICBjaGFyX3UJKmljb24pCit7CisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkgeworCWd1aS52aW1XaW5kb3ctPlNldFRpdGxlKChjaGFyICopdGl0bGUpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworLyoKKyAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworCisgICAgQlJlY3QgcjsKKyAgICByLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCk7CisgICAgci50b3AgPSBGSUxMX1koZ3VpLnJvdyk7CisgICAgci5yaWdodCA9IHIubGVmdCArIGd1aS5jaGFyX3dpZHRoIC0gUEVOX1dJRFRIOworICAgIHIuYm90dG9tID0gci50b3AgKyBndWkuY2hhcl9oZWlnaHQgLSBQRU5fV0lEVEg7CisKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJZ3VpLnZpbVRleHRBcmVhLT5TdHJva2VSZWN0KHIpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworCS8vZ3VpX21jaF9mbHVzaCgpOworICAgIH0KK30KKworLyoKKyAqIERyYXcgcGFydCBvZiBhIGN1cnNvciwgb25seSB3IHBpeGVscyB3aWRlLCBhbmQgaCBwaXhlbHMgaGlnaC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19wYXJ0X2N1cnNvcigKKyAgICBpbnQJCXcsCisgICAgaW50CQloLAorICAgIGd1aWNvbG9yX1QJY29sb3IpCit7CisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworCisgICAgQlJlY3QgcjsKKyAgICByLmxlZnQgPQorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJLyogdmVydGljYWwgbGluZSBzaG91bGQgYmUgb24gdGhlIHJpZ2h0IG9mIGN1cnJlbnQgcG9pbnQgKi8KKwlDVVJTT1JfQkFSX1JJR0hUID8gRklMTF9YKGd1aS5jb2wgKyAxKSAtIHcgOgorI2VuZGlmCisJICAgIEZJTExfWChndWkuY29sKTsKKyAgICByLnJpZ2h0ID0gci5sZWZ0ICsgdyAtIFBFTl9XSURUSDsKKyAgICByLmJvdHRvbSA9IEZJTExfWShndWkucm93ICsgMSkgLSBQRU5fV0lEVEg7CisgICAgci50b3AgPSByLmJvdHRvbSAtIGggKyBQRU5fV0lEVEg7CisKKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJZ3VpLnZpbVRleHRBcmVhLT5GaWxsUmVjdChyKTsKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKwkvL2d1aV9tY2hfZmx1c2goKTsKKyAgICB9Cit9CisKKy8qCisgKiBDYXRjaCB1cCB3aXRoIGFueSBxdWV1ZWQgZXZlbnRzLiAgVGhpcyBtYXkgcHV0IGtleWJvYXJkIGlucHV0IGludG8gdGhlCisgKiBpbnB1dCBidWZmZXIsIGNhbGwgcmVzaXplIGNhbGwtYmFja3MsIHRyaWdnZXIgdGltZXJzIGV0Yy4gIElmIHRoZXJlIGlzCisgKiBub3RoaW5nIGluIHRoZSBldmVudCBxdWV1ZSAoJiBubyB0aW1lcnMgcGVuZGluZyksIHRoZW4gd2UgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdXBkYXRlKCkKK3sKKyAgICBndWlfbWNoX2ZsdXNoKCk7CisgICAgd2hpbGUgKHBvcnRfY291bnQoZ3VpLnZkY21wKSA+IDAgJiYKKwkgICAgIXZpbV9pc19pbnB1dF9idWZfZnVsbCgpICYmCisJICAgIGd1aV9iZW9zX3Byb2Nlc3NfZXZlbnQoMCkgPj0gQl9PSykKKwkvKiBub3RoaW5nICovIDsKK30KKworLyoKKyAqIEdVSSBpbnB1dCByb3V0aW5lIGNhbGxlZCBieSBndWlfd2FpdF9mb3JfY2hhcnMoKS4gIFdhaXRzIGZvciBhIGNoYXJhY3RlcgorICogZnJvbSB0aGUga2V5Ym9hcmQuCisgKgl3dGltZSA9PSAtMQkJV2FpdCBmb3JldmVyLgorICoJd3RpbWUgPT0gMAkJVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICoJd3RpbWUgPiAwCQlXYWl0IHd0aW1lIG1pbGxpc2Vjb25kcyBmb3IgYSBjaGFyYWN0ZXIuCisgKiBSZXR1cm5zIE9LIGlmIGEgY2hhcmFjdGVyIHdhcyBmb3VuZCB0byBiZSBhdmFpbGFibGUgd2l0aGluIHRoZSBnaXZlbiB0aW1lLAorICogb3IgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfd2FpdF9mb3JfY2hhcnMoCisgICAgaW50CQl3dGltZSkKK3sKKyAgICBpbnQJCSAgICBmb2N1czsKKyAgICBiaWd0aW1lX3QJICAgIHVudGlsLCB0aW1lb3V0OworICAgIHN0YXR1c190CSAgICBzdDsKKworICAgIGlmICh3dGltZSA+PSAwKSB7CisJdGltZW91dCA9IHd0aW1lICogMTAwMDsKKwl1bnRpbCA9IHN5c3RlbV90aW1lKCkgKyB0aW1lb3V0OworICAgIH0gZWxzZSB7CisJdGltZW91dCA9IEJfSU5GSU5JVEVfVElNRU9VVDsKKyAgICB9CisKKyAgICBmb2N1cyA9IGd1aS5pbl9mb2N1czsKKyAgICBmb3IgKDs7KQorICAgIHsKKwkvKiBTdG9wIG9yIHN0YXJ0IGJsaW5raW5nIHdoZW4gZm9jdXMgY2hhbmdlcyAqLworCWlmIChndWkuaW5fZm9jdXMgIT0gZm9jdXMpCisJeworCSAgICBpZiAoZ3VpLmluX2ZvY3VzKQorCQlndWlfbWNoX3N0YXJ0X2JsaW5rKCk7CisJICAgIGVsc2UKKwkJZ3VpX21jaF9zdG9wX2JsaW5rKCk7CisJICAgIGZvY3VzID0gZ3VpLmluX2ZvY3VzOworCX0KKworCWd1aV9tY2hfZmx1c2goKTsKKwkvKgorCSAqIERvbid0IHVzZSBndWlfbWNoX3VwZGF0ZSgpIGJlY2F1c2UgdGhlbiB3ZSB3aWxsIHNwaW4tbG9jayB1bnRpbCBhCisJICogY2hhciBhcnJpdmVzLCBpbnN0ZWFkIHdlIHVzZSBndWlfYmVvc19wcm9jZXNzX2V2ZW50KCkgdG8gaGFuZyB1bnRpbAorCSAqIGFuIGV2ZW50IGFycml2ZXMuICBObyBuZWVkIHRvIGNoZWNrIGZvciBpbnB1dF9idWZfZnVsbCBiZWNhdXNlIHdlCisJICogYXJlIHJldHVybmluZyBhcyBzb29uIGFzIGl0IGNvbnRhaW5zIGEgc2luZ2xlIGNoYXIuCisJICovCisJc3QgPSBndWlfYmVvc19wcm9jZXNzX2V2ZW50KHRpbWVvdXQpOworCisJaWYgKGlucHV0X2F2YWlsYWJsZSgpKQorCSAgICByZXR1cm4gT0s7CisJaWYgKHN0IDwgQl9PSykJCSAgICAvKiBpbmNsdWRlcyBCX1RJTUVEX09VVCAqLworCSAgICByZXR1cm4gRkFJTDsKKworCS8qCisJICogQ2FsY3VsYXRlIGhvdyBtdWNoIGxvbmdlciB3ZSdyZSB3aWxsaW5nIHRvIHdhaXQgZm9yIHRoZQorCSAqIG5leHQgZXZlbnQuCisJICovCisJaWYgKHd0aW1lID49IDApIHsKKwkgICAgdGltZW91dCA9IHVudGlsIC0gc3lzdGVtX3RpbWUoKTsKKwkgICAgaWYgKHRpbWVvdXQgPCAwKQorCQlicmVhazsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUlMOworCit9CisKKy8qCisgKiBPdXRwdXQgcm91dGluZXMuCisgKi8KKworLyoKKyAqIEZsdXNoIGFueSBvdXRwdXQgdG8gdGhlIHNjcmVlbi4gVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGJlZm9yZQorICogdGhlIGFwcCBnb2VzIHRvIHNsZWVwLgorICovCisgICAgdm9pZAorZ3VpX21jaF9mbHVzaCgpCit7CisgICAgLy8gZG9lcyB0aGlzIG5lZWQgdG8gbG9jayB0aGUgd2luZG93PyBBcHBhcmVudGx5IG5vdCBidXQgYmUgc2FmZS4KKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKSB7CisJZ3VpLnZpbVdpbmRvdy0+Rmx1c2goKTsKKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKgorICogQ2xlYXIgYSByZWN0YW5ndWxhciByZWdpb24gb2YgdGhlIHNjcmVlbiBmcm9tIHRleHQgcG9zIChyb3cxLCBjb2wxKSB0bworICogKHJvdzIsIGNvbDIpIGluY2x1c2l2ZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfY2xlYXJfYmxvY2soCisgICAgaW50CQlyb3cxLAorICAgIGludAkJY29sMSwKKyAgICBpbnQJCXJvdzIsCisgICAgaW50CQljb2wyKQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltVGV4dEFyZWEtPm1jaENsZWFyQmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMik7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9hbGwoKQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpIHsKKwlndWkudmltVGV4dEFyZWEtPm1jaENsZWFyQWxsKCk7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisvKgorICogRGVsZXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgdXAgYW55CisgKiB0ZXh0IGZ1cnRoZXIgZG93biB3aXRoaW4gdGhlIHNjcm9sbCByZWdpb24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RlbGV0ZV9saW5lcygKKyAgICBpbnQJCXJvdywKKyAgICBpbnQJCW51bV9saW5lcykKK3sKKyAgICBndWkudmltVGV4dEFyZWEtPm1jaERlbGV0ZUxpbmVzKHJvdywgbnVtX2xpbmVzKTsKK30KKworLyoKKyAqIEluc2VydCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzIGJlZm9yZSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgZG93biBhbnkKKyAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW5zZXJ0X2xpbmVzKAorICAgIGludAkJcm93LAorICAgIGludAkJbnVtX2xpbmVzKQoreworICAgIGd1aS52aW1UZXh0QXJlYS0+bWNoSW5zZXJ0TGluZXMocm93LCBudW1fbGluZXMpOworfQorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTWVudSBzdHVmZi4KKyAqLworCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfbWVudSgKKyAgICBpbnQJCWZsYWcpCit7CisgICAgaWYgKGd1aS52aW1XaW5kb3ctPkxvY2soKSkKKyAgICB7CisJQk1lbnVCYXIgKm1lbnViYXIgPSBndWkudmltRm9ybS0+TWVudUJhcigpOworCW1lbnViYXItPlNldEVuYWJsZWQoZmxhZyk7CisJZ3VpLnZpbVdpbmRvdy0+VW5sb2NrKCk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfbWVudV9wb3MoCisgICAgaW50CQl4LAorICAgIGludAkJeSwKKyAgICBpbnQJCXcsCisgICAgaW50CQloKQoreworICAgIC8qIEl0IHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHBsYWNlIGFueXdheSAqLworfQorCisvKgorICogQWRkIGEgc3ViIG1lbnUgdG8gdGhlIG1lbnUgYmFyLgorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudSgKKyAgICB2aW1tZW51X1QJKm1lbnUsCisgICAgaW50CQlpZHgpCit7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisKKyAgICBpZiAoIW1lbnVfaXNfbWVudWJhcihtZW51LT5uYW1lKQorCSAgICB8fCAocGFyZW50ICE9IE5VTEwgJiYgcGFyZW50LT5zdWJtZW51X2lkID09IE5VTEwpKQorCXJldHVybjsKKworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpCisgICAgeworLyogTWFqb3IgcmUtd3JpdGUgb2YgdGhlIG1lbnUgY29kZSwgaXQgd2FzIGZhaWxpbmcgd2l0aCBtZW1vcnkgY29ycnVwdGlvbiB3aGVuCisgKiB3ZSBzdGFydGVkIGxvYWRpbmcgbXVsdGlwbGUgZmlsZXMgKHRoZSBCdWZmZXIgbWVudSkKKyAqCisgKiBOb3RlIHdlIGRvbid0IHVzZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgeWV0LCBhbGwgYXJlIGluc2VydGVkIGludG8gdGhlCisgKiBtZW51YmFyIG9uIGEgZmlyc3QgY29tZS1maXJzdCBzZXJ2ZWQgYmFzaXMuLi4KKyAqCisgKiByaWNoYXJkQHdoaXRlcXVlZW4uY29tIGp1bCA5OQorICovCisKKwlCTWVudSAqdG1wOworCisJaWYgKCBwYXJlbnQgKQorCSAgICB0bXAgPSBwYXJlbnQtPnN1Ym1lbnVfaWQ7CisJZWxzZQorCSAgICB0bXAgPSBndWkudmltRm9ybS0+TWVudUJhcigpOworLy8gbWFrZSBzdXJlIHdlIGRvbid0IHRyeSBhbmQgYWRkIHRoZSBzYW1lIG1lbnUgdHdpY2UuIFRoZSBCdWZmZXJzIG1lbnUgdHJpZXMgdG8KKy8vIGRvIHRoaXMgYW5kIEJlIHN0YXJ0cyB0byBjcmFzaC4uLgorCisJaWYgKCAhIHRtcC0+RmluZEl0ZW0oKGNvbnN0IGNoYXIgKikgbWVudS0+ZG5hbWUpKSB7CisKKwkgICAgQk1lbnUgKmJtZW51ID0gbmV3IEJNZW51KChjaGFyICopbWVudS0+ZG5hbWUpOworCisJICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBibWVudTsKKworLy8gd2hlbiB3ZSBhZGQgYSBCTWVudSB0byBhbm90aGVyIE1lbnUsIGl0IGNyZWF0ZXMgdGhlIGludGVyY29ubmVjdGluZyBCTWVudUl0ZW0KKwkgICAgdG1wLT5BZGRJdGVtKGJtZW51KTsKKworLy8gTm93IGl0cyBzYWZlIHRvIHF1ZXJ5IHRoZSBtZW51IGZvciB0aGUgYXNzb2NpYXRlZCBNZW51SXRlbS4uLi4KKwkgICAgbWVudS0+aWQgPSB0bXAtPkZpbmRJdGVtKChjb25zdCBjaGFyICopIG1lbnUtPmRuYW1lKTsKKworCX0KKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3RvZ2dsZV90ZWFyb2ZmcyhpbnQgZW5hYmxlKQoreworICAgIC8qIG5vIHRlYXJvZmYgbWVudXMgKi8KK30KKworICAgIHN0YXRpYyBCTWVzc2FnZSAqCitNZW51TWVzc2FnZSh2aW1tZW51X1QgKm1lbnUpCit7CisgICAgQk1lc3NhZ2UgKm0gPSBuZXcgQk1lc3NhZ2UoJ21lbnUnKTsKKyAgICBtLT5BZGRQb2ludGVyKCJWaW1NZW51IiwgKHZvaWQgKiltZW51KTsKKworICAgIHJldHVybiBtOworfQorCisvKgorICogQWRkIGEgbWVudSBpdGVtIHRvIGEgbWVudQorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudV9pdGVtKAorICAgIHZpbW1lbnVfVAkqbWVudSwKKyAgICBpbnQJCWlkeCkKK3sKKyAgICBpbnQJCW1uZW1vbmljID0gMDsKKyAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKKworICAgIGlmIChwYXJlbnQtPnN1Ym1lbnVfaWQgPT0gTlVMTCkKKwlyZXR1cm47CisKKyNpZmRlZiBuZXZlcgorICAgIC8qIHdoeSBub3QgYWRkIHNlcGFyYXRvcnMgPworICAgICAqIHJpY2hhcmQKKyAgICAgKi8KKyAgICAvKiBEb24ndCBhZGQgbWVudSBzZXBhcmF0b3IgKi8KKyAgICBpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkpCisJcmV0dXJuOworI2VuZGlmCisKKyAgICAvKiBUT0RPOiB1c2UgbWVudS0+YWN0ZXh0ICovCisgICAgLyogVGhpcyBpcyBkaWZmaWN1bHQsIHNpbmNlIG9uIEJlLCBhbiBhY2NlbGVyYXRvciBtdXN0IGJlIGEgc2luZ2xlIGNoYXIKKyAgICAgKiBhbmQgYSBsb3Qgb2YgVmltIG9uZXMgYXJlIHRoZSBzdGFuZGFyZCBWSSBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIFB1bnQgZm9yIE5vdy4uLgorICAgICAqIHJpY2hhcmRAd2hpZXF1ZWVuLmNvbSBqdWwgOTkKKyAgICAgKi8KKyAgICBpZiAoZ3VpLnZpbVdpbmRvdy0+TG9jaygpKQorICAgIHsKKwlpZiAoIG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpKSB7CisJICAgIEJTZXBhcmF0b3JJdGVtICppdGVtID0gbmV3IEJTZXBhcmF0b3JJdGVtKCk7CisJICAgIHBhcmVudC0+c3VibWVudV9pZC0+QWRkSXRlbShpdGVtKTsKKwkgICAgbWVudS0+aWQgPSBpdGVtOworCSAgICBtZW51LT5zdWJtZW51X2lkID0gTlVMTDsKKwl9CisJZWxzZSB7CisJICAgIEJNZW51SXRlbSAqaXRlbSA9IG5ldyBCTWVudUl0ZW0oKGNoYXIgKiltZW51LT5kbmFtZSwKKwkJICAgIE1lbnVNZXNzYWdlKG1lbnUpKTsKKwkgICAgaXRlbS0+U2V0VGFyZ2V0KGd1aS52aW1UZXh0QXJlYSk7CisJICAgIGl0ZW0tPlNldFRyaWdnZXIoKGNoYXIpIG1lbnUtPm1uZW1vbmljKTsKKwkgICAgcGFyZW50LT5zdWJtZW51X2lkLT5BZGRJdGVtKGl0ZW0pOworCSAgICBtZW51LT5pZCA9IGl0ZW07CisJICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBOVUxMOworCX0KKwlndWkudmltV2luZG93LT5VbmxvY2soKTsKKyAgICB9Cit9CisKKy8qCisgKiBEZXN0cm95IHRoZSBtYWNoaW5lIHNwZWNpZmljIG1lbnUgd2lkZ2V0LgorICovCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X21lbnUoCisgICAgdmltbWVudV9UCSptZW51KQoreworICAgIGlmIChndWkudmltV2luZG93LT5Mb2NrKCkpCisgICAgeworCWFzc2VydChtZW51LT5zdWJtZW51X2lkID09IE5VTEwgfHwgbWVudS0+c3VibWVudV9pZC0+Q291bnRJdGVtcygpID09IDApOworCS8qCisJICogRGV0YWNoIHRoaXMgbWVudSBmcm9tIGl0cyBwYXJlbnQsIHNvIHRoYXQgaXQgaXMgbm90IGRlbGV0ZWQKKwkgKiB0d2ljZSBvbmNlIHdlIGdldCB0byBkZWxldGUgdGhhdCBwYXJlbnQuCisJICogRGVsZXRpbmcgYSBCTWVudUl0ZW0gYWxzbyBkZWxldGVzIHRoZSBhc3NvY2lhdGVkIEJNZW51LCBpZiBhbnkKKwkgKiAod2hpY2ggZG9lcyBub3QgaGF2ZSBhbnkgaXRlbXMgYW55bW9yZSBzaW5jZSB0aGV5IHdlcmUKKwkgKiByZW1vdmVkIGFuZCBkZWxldGVkIGJlZm9yZSkuCisJICovCisJQk1lbnUgKmJtZW51ID0gbWVudS0+aWQtPk1lbnUoKTsKKwlpZiAoYm1lbnUpCisJeworCSAgICBibWVudS0+UmVtb3ZlSXRlbShtZW51LT5pZCk7CisJICAgIC8qCisJICAgICAqIElmIHdlIHJlbW92ZWQgdGhlIGxhc3QgaXRlbSBmcm9tIHRoZSBtZW51IGJhciwKKwkgICAgICogcmVzaXplIGl0IG91dCBvZiBzaWdodC4KKwkgICAgICovCisJICAgIGlmIChibWVudSA9PSBndWkudmltRm9ybS0+TWVudUJhcigpICYmIGJtZW51LT5Db3VudEl0ZW1zKCkgPT0gMCkKKwkgICAgeworCQlibWVudS0+UmVzaXplVG8oLU1FTlVCQVJfTUFSR0lOLCAtTUVOVUJBUl9NQVJHSU4pOworCSAgICB9CisJfQorCWRlbGV0ZSBtZW51LT5pZDsKKwltZW51LT5pZCA9IE5VTEw7CisJbWVudS0+c3VibWVudV9pZCA9IE5VTEw7CisKKwlndWkubWVudV9oZWlnaHQgPSAoaW50KSBndWkudmltRm9ybS0+TWVudUhlaWdodCgpOworCWd1aS52aW1XaW5kb3ctPlVubG9jaygpOworICAgIH0KK30KKworLyoKKyAqIE1ha2UgYSBtZW51IGVpdGhlciBncmV5IG9yIG5vdCBncmV5LgorICovCisgICAgdm9pZAorZ3VpX21jaF9tZW51X2dyZXkoCisgICAgdmltbWVudV9UCSptZW51LAorICAgIGludAkJZ3JleSkKK3sKKyAgICBpZiAobWVudS0+aWQgIT0gTlVMTCkKKwltZW51LT5pZC0+U2V0RW5hYmxlZCghZ3JleSk7Cit9CisKKy8qCisgKiBNYWtlIG1lbnUgaXRlbSBoaWRkZW4gb3Igbm90IGhpZGRlbgorICovCisgICAgdm9pZAorZ3VpX21jaF9tZW51X2hpZGRlbigKKyAgICB2aW1tZW51X1QJKm1lbnUsCisgICAgaW50CQloaWRkZW4pCit7CisgICAgaWYgKG1lbnUtPmlkICE9IE5VTEwpCisJbWVudS0+aWQtPlNldEVuYWJsZWQoIWhpZGRlbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBzZXR0aW5nIGFsbCB0aGUgbWVudXMgdG8gZ3JleS9oaWRkZW4gb3Igbm90LgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X21lbnViYXIoKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gQmVPUyAqLworfQorCisjZW5kaWYgLyogRkVBVF9NRU5VICovCisKKy8qIE1vdXNlIHN0dWZmICovCisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorLyoKKyAqIENsaXBib2FyZCBzdHVmZiwgZm9yIGN1dHRpbmcgYW5kIHBhc3RpbmcgdGV4dCB0byBvdGhlciB3aW5kb3dzLgorICovCitjaGFyIHRleHRwbGFpbltdID0gInRleHQvcGxhaW4iOworY2hhciB2aW1zZWxlY3Rpb250eXBlW10gPSAiYXBwbGljYXRpb24veC12bmQuUmhpYWx0by1WaW0tc2VsZWN0aW9udHlwZSI7CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBwdXQgaXQgaW4gdGhlIGNsaXBib2FyZCByZWdpc3Rlci4KKyAqLworICAgIHZvaWQKK2NsaXBfbWNoX3JlcXVlc3Rfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIGlmIChiZV9jbGlwYm9hcmQtPkxvY2soKSkKKyAgICB7CisJQk1lc3NhZ2UgKm0gPSBiZV9jbGlwYm9hcmQtPkRhdGEoKTsKKwkvL20tPlByaW50VG9TdHJlYW0oKTsKKworCWNoYXJfdSAqc3RyaW5nID0gTlVMTDsKKwlzc2l6ZV90IHN0cmluZ2xlbiA9IC0xOworCisJaWYgKG0tPkZpbmREYXRhKHRleHRwbGFpbiwgQl9NSU1FX1RZUEUsCisJCQkJICAgKGNvbnN0IHZvaWQgKiopJnN0cmluZywgJnN0cmluZ2xlbikgPT0gQl9PSworCQl8fCBtLT5GaW5kU3RyaW5nKCJ0ZXh0IiwgKGNvbnN0IGNoYXIgKiopJnN0cmluZykgPT0gQl9PSykKKwl7CisJICAgIGlmIChzdHJpbmdsZW4gPT0gLTEpCisJCXN0cmluZ2xlbiA9IFNUUkxFTihzdHJpbmcpOworCisJICAgIGludCB0eXBlOworCSAgICBjaGFyICpzZWx0eXBlOworCSAgICBzc2l6ZV90IHNlbHR5cGVsZW47CisKKwkgICAgLyoKKwkgICAgICogVHJ5IHRvIGdldCB0aGUgc3BlY2lhbCB2aW0gc2VsZWN0aW9uIHR5cGUgZmlyc3QKKwkgICAgICovCisJICAgIGlmIChtLT5GaW5kRGF0YSh2aW1zZWxlY3Rpb250eXBlLCBCX01JTUVfVFlQRSwKKwkJICAgIChjb25zdCB2b2lkICoqKSZzZWx0eXBlLCAmc2VsdHlwZWxlbikgPT0gQl9PSykKKwkgICAgeworCQlzd2l0Y2ggKCpzZWx0eXBlKQorCQl7CisJCSAgICBkZWZhdWx0OgorCQkgICAgY2FzZSAnTCc6CXR5cGUgPSBNTElORTsJYnJlYWs7CisJCSAgICBjYXNlICdDJzoJdHlwZSA9IE1DSEFSOwlicmVhazsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQkgICAgY2FzZSAnQic6CXR5cGUgPSBNQkxPQ0s7CWJyZWFrOworI2VuZGlmCisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogT3RoZXJ3aXNlIHVzZSBoZXVyaXN0aWMgYXMgZG9jdW1lbnRlZCAqLworCQl0eXBlID0gbWVtY2hyKHN0cmluZywgc3RyaW5nbGVuLCAnXG4nKSA/IE1MSU5FIDogTUNIQVI7CisJICAgIH0KKwkgICAgY2xpcF95YW5rX3NlbGVjdGlvbih0eXBlLCBzdHJpbmcsIChsb25nKXN0cmluZ2xlbiwgY2JkKTsKKwl9CisJYmVfY2xpcGJvYXJkLT5VbmxvY2soKTsKKyAgICB9Cit9CisvKgorICogTWFrZSB2aW0gdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAqLworICAgIHZvaWQKK2NsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIC8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlICovCit9CisKKy8qCisgKiBNYWtlIHZpbSB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgUmV0dXJuIE9LIHVwb24gc3VjY2Vzcy4KKyAqLworICAgIGludAorY2xpcF9tY2hfb3duX3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKK3sKKyAgICAvKgorICAgICAqIE5ldmVyIGFjdHVhbGx5IG93biB0aGUgY2xpcGJvYXJkLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzIHRoZQorICAgICAqIGNsaXBib2FyZCwgd2UgZG9uJ3Qgd2FudCB0byB0aGluayB0aGF0IHdlIHN0aWxsIG93biBpdC4KKyAgICAgKi8KKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuCisgKi8KKyAgICB2b2lkCitjbGlwX21jaF9zZXRfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIGlmIChiZV9jbGlwYm9hcmQtPkxvY2soKSkKKyAgICB7CisJYmVfY2xpcGJvYXJkLT5DbGVhcigpOworCUJNZXNzYWdlICptID0gYmVfY2xpcGJvYXJkLT5EYXRhKCk7CisJYXNzZXJ0KG0pOworCisJLyogSWYgdGhlICcqJyByZWdpc3RlciBpc24ndCBhbHJlYWR5IGZpbGxlZCBpbiwgZmlsbCBpdCBpbiBub3cgKi8KKwljYmQtPm93bmVkID0gVFJVRTsKKwljbGlwX2dldF9zZWxlY3Rpb24oY2JkKTsKKwljYmQtPm93bmVkID0gRkFMU0U7CisKKwljaGFyX3UgICpzdHIgPSBOVUxMOworCWxvbmdfdSAgY291bnQ7CisJaW50CXR5cGU7CisKKwl0eXBlID0gY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigmc3RyLCAmY291bnQsIGNiZCk7CisKKwlpZiAodHlwZSA8IDApCisJICAgIHJldHVybjsKKworCW0tPkFkZERhdGEodGV4dHBsYWluLCBCX01JTUVfVFlQRSwgKHZvaWQgKilzdHIsIGNvdW50KTsKKworCS8qIEFkZCB0eXBlIG9mIHNlbGVjdGlvbiAqLworCWNoYXIgICAgdnR5cGU7CisJc3dpdGNoICh0eXBlKQorCXsKKwkgICAgZGVmYXVsdDoKKwkgICAgY2FzZSBNTElORTogICAgdnR5cGUgPSAnTCc7ICAgIGJyZWFrOworCSAgICBjYXNlIE1DSEFSOiAgICB2dHlwZSA9ICdDJzsgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgY2FzZSBNQkxPQ0s6ICAgdnR5cGUgPSAnQic7ICAgIGJyZWFrOworI2VuZGlmCisJfQorCW0tPkFkZERhdGEodmltc2VsZWN0aW9udHlwZSwgQl9NSU1FX1RZUEUsICh2b2lkICopJnZ0eXBlLCAxKTsKKworCXZpbV9mcmVlKHN0cik7CisKKwliZV9jbGlwYm9hcmQtPkNvbW1pdCgpOworCWJlX2NsaXBib2FyZC0+VW5sb2NrKCk7CisgICAgfQorfQorCisjZW5kaWYJLyogRkVBVF9DTElQQk9BUkQgKi8KKworLyoKKyAqIFJldHVybiB0aGUgUkdCIHZhbHVlIG9mIGEgcGl4ZWwgYXMgbG9uZy4KKyAqLworICAgIGxvbmdfdQorZ3VpX21jaF9nZXRfcmdiKGd1aWNvbG9yX1QgcGl4ZWwpCit7CisgICAgcmdiX2NvbG9yIHJnYiA9IEdVSV9UT19SR0IocGl4ZWwpOworCisgICAgcmV0dXJuICgocmdiLnJlZCAmIDB4ZmYpIDw8IDE2KSArICgocmdiLmdyZWVuICYgMHhmZikgPDwgOCkKKwkJCQkJCQkgICsgKHJnYi5ibHVlICYgMHhmZik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldG1vdXNlKGludCB4LCBpbnQgeSkKK3sKKyAgICBUUkFDRSgpOworICAgIC8qIFRPRE8gKi8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2hvd19wb3B1cG1lbnUodmltbWVudV9UICptZW51KQoreworICAgIFRSQUNFKCk7CisgICAgLyogVE9ETyAqLworfQorCitpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3goKQoreworICAgIFRSQUNFKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitndWlfbWNoX2dldF9tb3VzZV95KCkKK3sKKyAgICBUUkFDRSgpOworICAgIHJldHVybiAwOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KZGlmZiAtLWdpdCBhL3NyYy9ndWlfYmVvcy5oIGIvc3JjL2d1aV9iZW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmYzQ1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfYmVvcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCQlHVUkgc3VwcG9ydCBieSBPbGFmICJSaGlhbHRvIiBTZWliZXJ0CisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqCisgKiBCZU9TIEdVSS4KKyAqCisgKiBHVUkgc3VwcG9ydCBmb3IgdGhlIEJ1enp3b3JkIEVuaGFuY2VkIE9wZXJhdGluZyBTeXN0ZW0gZm9yIFBQQy4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBtdXN0IGJlIGFjY2VwdGFibGUgYm90aCBhcyBDIGFuZCBDKysuCisgKiBUaGUgQmVPUyBBUEkgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBDKyssIGJ1dCBzb21lIGNsYXNzZXMKKyAqIHNob3VsZCBiZSBzb21ld2hhdCBrbm93biBpbiB0aGUgY29tbW9uIEMgY29kZS4KKyAqLworCisvKiBTeXN0ZW0gY2xhc3NlcyAqLworCitzdHJ1Y3QgQk1lbnU7CitzdHJ1Y3QgQk1lbnVJdGVtOworCisvKiBPdXIgb3duIFZpbS1yZWxhdGVkIGNsYXNzZXMgKi8KKworc3RydWN0IFZpbUFwcDsKK3N0cnVjdCBWaW1Gb3JtVmlldzsKK3N0cnVjdCBWaW1UZXh0QXJlYVZpZXc7CitzdHJ1Y3QgVmltV2luZG93Oworc3RydWN0IFZpbVNjcm9sbEJhcjsKKworLyogTG9ja2luZyBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIGludCB2aW1fbG9ja19zY3JlZW4oKTsKK2V4dGVybiB2b2lkIHZpbV91bmxvY2tfc2NyZWVuKCk7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKwordHlwZWRlZiBzdHJ1Y3QgQk1lbnUgQk1lbnU7Cit0eXBlZGVmIHN0cnVjdCBCTWVudUl0ZW0gQk1lbnVJdGVtOwordHlwZWRlZiBzdHJ1Y3QgVmltV2luZG93IFZpbVdpbmRvdzsKK3R5cGVkZWYgc3RydWN0IFZpbUZvcm1WaWV3IFZpbUZvcm1WaWV3OwordHlwZWRlZiBzdHJ1Y3QgVmltVGV4dEFyZWFWaWV3IFZpbVRleHRBcmVhVmlldzsKK3R5cGVkZWYgc3RydWN0IFZpbUFwcCBWaW1BcHA7Cit0eXBlZGVmIHN0cnVjdCBWaW1TY3JvbGxCYXIgVmltU2Nyb2xsQmFyOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9ndWlfYmV2YWwuYyBiL3NyYy9ndWlfYmV2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTljMWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9iZXZhbC5jCkBAIC0wLDAgKzEsMTI2OCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoJCQlWaXN1YWwgV29ya3Nob3AgaW50ZWdyYXRpb24gYnkgR29yZG9uIFByaWV1cgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZiBkZWZpbmVkKEZFQVRfQkVWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qIG9uIFdpbjMyIG9ubHkgZ3VpX21jaF9nZXRfYmV2YWxfaW5mbyBpcyByZXF1aXJlZCAqLworI2lmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChQUk9UTykKKworI2lmZGVmIEZFQVRfR1VJX0dUSworIyBpbmNsdWRlIDxnZGsvZ2Rra2V5c3ltcy5oPgorIyBpbmNsdWRlIDxndGsvZ3RrLmg+CisjZWxzZQorIyBpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisjIGlmZGVmIEZFQVRfR1VJX01PVElGCisjICBpbmNsdWRlIDxYbS9QdXNoQi5oPgorIyAgaW5jbHVkZSA8WG0vU2VwYXJhdG9yLmg+CisjICBpbmNsdWRlIDxYbS9MaXN0Lmg+CisjICBpbmNsdWRlIDxYbS9MYWJlbC5oPgorIyAgaW5jbHVkZSA8WG0vQXRvbU1nci5oPgorIyAgaW5jbHVkZSA8WG0vUHJvdG9jb2xzLmg+CisjIGVsc2UKKyAgIC8qIEFzc3VtZSBBdGhlbmEgKi8KKyMgIGluY2x1ZGUgPFgxMS9TaGVsbC5oPgorIyAgaW5jbHVkZSA8WDExL1hhdy9MYWJlbC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJndWlfYmV2YWwuaCIKKworI2lmbmRlZiBGRUFUX0dVSV9HVEsKK2V4dGVybiBXaWRnZXQgdmltU2hlbGw7CisKKy8qCisgKiBDdXJyZW50bHksIHdlIGFzc3VtZSB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBCYWxsb29uRXZhbCBzaG93aW5nCisgKiBvbi1zY3JlZW4gYXQgYW55IGdpdmVuIG1vbWVudC4gIFRoaXMgdmFyaWFibGUgd2lsbCBob2xkIHRoZSBjdXJyZW50bHkKKyAqIHNob3dpbmcgQmFsbG9vbkV2YWwgb3IgTlVMTCBpZiBub25lIGlzIHNob3dpbmcuCisgKi8KK3N0YXRpYyBCYWxsb29uRXZhbCAqY3VycmVudF9iZXZhbCA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX0dUSworc3RhdGljIHZvaWQgYWRkRXZlbnRIYW5kbGVyIF9fQVJHUygoR3RrV2lkZ2V0ICosIEJhbGxvb25FdmFsICopKTsKK3N0YXRpYyB2b2lkIHJlbW92ZUV2ZW50SGFuZGxlciBfX0FSR1MoKEJhbGxvb25FdmFsICopKTsKK3N0YXRpYyBnaW50IHRhcmdldF9ldmVudF9jYiBfX0FSR1MoKEd0a1dpZGdldCAqLCBHZGtFdmVudCAqLCBncG9pbnRlcikpOworc3RhdGljIGdpbnQgbWFpbndpbl9ldmVudF9jYiBfX0FSR1MoKEd0a1dpZGdldCAqLCBHZGtFdmVudCAqLCBncG9pbnRlcikpOworc3RhdGljIHZvaWQgcG9pbnRlcl9ldmVudCBfX0FSR1MoKEJhbGxvb25FdmFsICosIGludCwgaW50LCB1bnNpZ25lZCkpOworc3RhdGljIHZvaWQga2V5X2V2ZW50IF9fQVJHUygoQmFsbG9vbkV2YWwgKiwgdW5zaWduZWQsIGludCkpOworc3RhdGljIGdpbnQgdGltZW91dF9jYiBfX0FSR1MoKGdwb2ludGVyKSk7CitzdGF0aWMgZ2ludCBiYWxsb29uX2V4cG9zZV9ldmVudF9jYiBfX0FSR1MoKEd0a1dpZGdldCAqLCBHZGtFdmVudEV4cG9zZSAqLCBncG9pbnRlcikpOworIyBpZm5kZWYgSEFWRV9HVEsyCitzdGF0aWMgdm9pZCBiYWxsb29uX2RyYXdfY2IgX19BUkdTKChHdGtXaWRnZXQgKiwgR2RrUmVjdGFuZ2xlICosIGdwb2ludGVyKSk7CisjIGVuZGlmCisjZWxzZQorc3RhdGljIHZvaWQgYWRkRXZlbnRIYW5kbGVyIF9fQVJHUygoV2lkZ2V0LCBCYWxsb29uRXZhbCAqKSk7CitzdGF0aWMgdm9pZCByZW1vdmVFdmVudEhhbmRsZXIgX19BUkdTKChCYWxsb29uRXZhbCAqKSk7CitzdGF0aWMgdm9pZCBwb2ludGVyRXZlbnRFSCBfX0FSR1MoKFdpZGdldCwgWHRQb2ludGVyLCBYRXZlbnQgKiwgQm9vbGVhbiAqKSk7CitzdGF0aWMgdm9pZCBwb2ludGVyRXZlbnQgX19BUkdTKChCYWxsb29uRXZhbCAqLCBYRXZlbnQgKikpOworc3RhdGljIHZvaWQgdGltZXJSb3V0aW5lIF9fQVJHUygoWHRQb2ludGVyLCBYdEludGVydmFsSWQgKikpOworI2VuZGlmCitzdGF0aWMgdm9pZCBjYW5jZWxCYWxsb29uIF9fQVJHUygoQmFsbG9vbkV2YWwgKikpOworc3RhdGljIHZvaWQgcmVxdWVzdEJhbGxvb24gX19BUkdTKChCYWxsb29uRXZhbCAqKSk7CitzdGF0aWMgdm9pZCBkcmF3QmFsbG9vbiBfX0FSR1MoKEJhbGxvb25FdmFsICopKTsKK3N0YXRpYyB2b2lkIHVuZHJhd0JhbGxvb24gX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwpKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZUJhbGxvb25FdmFsV2luZG93IF9fQVJHUygoQmFsbG9vbkV2YWwgKikpOworCisKKworLyoKKyAqIENyZWF0ZSBhIGJhbGxvb24tZXZhbHVhdGlvbiBhcmVhIGZvciBhIFdpZGdldC4KKyAqIFRoZXJlIGNhbiBiZSBlaXRoZXIgYSAibWVzZyIgZm9yIGEgZml4ZWQgc3RyaW5nIG9yICJtZXNnQ0IiIHRvIGdlbmVyYXRlIGEKKyAqIG1lc3NhZ2UgYnkgY2FsbGluZyB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogV2hlbiAibWVzZyIgaXMgbm90IE5VTEwgaXQgbXVzdCByZW1haW4gdmFsaWQgZm9yIGFzIGxvbmcgYXMgdGhlIGJhbGxvb24gaXMKKyAqIHVzZWQuICBJdCBpcyBub3QgZnJlZWQgaGVyZS4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgb2JqZWN0IChOVUxMIHdoZW4gb3V0IG9mIG1lbW9yeSkuCisgKi8KKyAgICBCYWxsb29uRXZhbCAqCitndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKHRhcmdldCwgbWVzZywgbWVzZ0NCLCBjbGllbnREYXRhKQorICAgIHZvaWQJKnRhcmdldDsKKyAgICBjaGFyX3UJKm1lc2c7CisgICAgdm9pZAkoKm1lc2dDQilfX0FSR1MoKEJhbGxvb25FdmFsICosIGludCkpOworICAgIHZvaWQJKmNsaWVudERhdGE7Cit7CisjaWZuZGVmIEZFQVRfR1VJX0dUSworICAgIGNoYXIJKmRpc3BsYXlfbmFtZTsJICAgIC8qIGdldCBmcm9tIGd1aS5kcHkgKi8KKyAgICBpbnQJCXNjcmVlbl9udW07CisgICAgY2hhcgkqcDsKKyNlbmRpZgorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKKworICAgIGlmIChtZXNnICE9IE5VTEwgJiYgbWVzZ0NCICE9IE5VTEwpCisgICAgeworCUVNU0coXygiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYmV2YWwgPSAoQmFsbG9vbkV2YWwgKilhbGxvYyhzaXplb2YoQmFsbG9vbkV2YWwpKTsKKyAgICBpZiAoYmV2YWwgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgRkVBVF9HVUlfR1RLCisJYmV2YWwtPnRhcmdldCA9IEdUS19XSURHRVQodGFyZ2V0KTsKKwliZXZhbC0+YmFsbG9vblNoZWxsID0gTlVMTDsKKwliZXZhbC0+dGltZXJJRCA9IDA7CisjZWxzZQorCWJldmFsLT50YXJnZXQgPSAoV2lkZ2V0KXRhcmdldDsKKwliZXZhbC0+YmFsbG9vblNoZWxsID0gTlVMTDsKKwliZXZhbC0+dGltZXJJRCA9IChYdEludGVydmFsSWQpTlVMTDsKKwliZXZhbC0+YXBwQ29udGV4dCA9IFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoKFdpZGdldCl0YXJnZXQpOworI2VuZGlmCisJYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19ORVVUUkFMOworCWJldmFsLT54ID0gMDsKKwliZXZhbC0+eSA9IDA7CisJYmV2YWwtPm1zZyA9IG1lc2c7CisJYmV2YWwtPm1zZ0NCID0gbWVzZ0NCOworCWJldmFsLT5jbGllbnREYXRhID0gY2xpZW50RGF0YTsKKworCS8qCisJICogU2V0IHVwIGV2ZW50IGhhbmRsZXIgd2hpY2ggd2lsbCBrZWVwIGl0cyBleWVzIG9uIHRoZSBwb2ludGVyLAorCSAqIGFuZCB3aGVuIHRoZSBwb2ludGVyIHJlc3RzIGluIGEgY2VydGFpbiBzcG90IGZvciBhIGdpdmVuIHRpbWUKKwkgKiBpbnRlcnZhbCwgc2hvdyB0aGUgYmV2YWwuCisJICovCisJYWRkRXZlbnRIYW5kbGVyKGJldmFsLT50YXJnZXQsIGJldmFsKTsKKwljcmVhdGVCYWxsb29uRXZhbFdpbmRvdyhiZXZhbCk7CisKKyNpZm5kZWYgRkVBVF9HVUlfR1RLCisJLyoKKwkgKiBOb3cgY3JlYXRlIGFuZCBzYXZlIHRoZSBzY3JlZW4gd2lkdGggYW5kIGhlaWdodC4gVXNlZCBpbiBkcmF3aW5nLgorCSAqLworCWRpc3BsYXlfbmFtZSA9IERpc3BsYXlTdHJpbmcoZ3VpLmRweSk7CisJcCA9IHN0cnJjaHIoZGlzcGxheV9uYW1lLCAnLicpOworCWlmIChwICE9IE5VTEwpCisJICAgIHNjcmVlbl9udW0gPSBhdG9pKCsrcCk7CisJZWxzZQorCSAgICBzY3JlZW5fbnVtID0gMDsKKwliZXZhbC0+c2NyZWVuX3dpZHRoID0gRGlzcGxheVdpZHRoKGd1aS5kcHksIHNjcmVlbl9udW0pOworCWJldmFsLT5zY3JlZW5faGVpZ2h0ID0gRGlzcGxheUhlaWdodChndWkuZHB5LCBzY3JlZW5fbnVtKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBiZXZhbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9CRVZBTF9USVApIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRGVzdHJveSBhIGJhbGxvbi1ldmFsIGFuZCBmcmVlIGl0cyBhc3NvY2lhdGVkIG1lbW9yeS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVzdHJveV9iZXZhbF9hcmVhKGJldmFsKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK3sKKyAgICBjYW5jZWxCYWxsb29uKGJldmFsKTsKKyAgICByZW1vdmVFdmVudEhhbmRsZXIoYmV2YWwpOworICAgIC8qIENoaWxkcmVuIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQgKi8KKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgZ3RrX3dpZGdldF9kZXN0cm95KGJldmFsLT5iYWxsb29uU2hlbGwpOworIyBlbHNlCisgICAgWHREZXN0cm95V2lkZ2V0KGJldmFsLT5iYWxsb29uU2hlbGwpOworIyBlbmRpZgorICAgIHZpbV9mcmVlKGJldmFsKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfYmV2YWxfYXJlYShiZXZhbCkKKyAgICBCYWxsb29uRXZhbAkqYmV2YWw7Cit7CisgICAgaWYgKGJldmFsICE9IE5VTEwpCisJYWRkRXZlbnRIYW5kbGVyKGJldmFsLT50YXJnZXQsIGJldmFsKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhKGJldmFsKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK3sKKyAgICBpZiAoYmV2YWwgIT0gTlVMTCkKKwlyZW1vdmVFdmVudEhhbmRsZXIoYmV2YWwpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0JFVkFMX1RJUCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEJhbGxvb25FdmFsICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50bHkKKyAqIGRpc3BsYXllZCB0b29sdGlwLiAgUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIG5vIHRvb2x0aXAgY3VycmVudGx5IHNob3dpbmcuCisgKgorICogQXNzdW1wdGlvbjogT25seSBvbmUgdG9vbHRpcCBjYW4gYmUgc2hvd24gYXQgYSB0aW1lLgorICovCisgICAgQmFsbG9vbkV2YWwgKgorZ3VpX21jaF9jdXJyZW50bHlfc2hvd2luZ19iZXZhbCgpCit7CisgICAgcmV0dXJuIGN1cnJlbnRfYmV2YWw7Cit9CisjZW5kaWYKKyNlbmRpZiAvKiAhRkVBVF9HVUlfVzMyICovCisKKyNpZiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSB8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgdGhlIHRleHQgYW5kIHBvc2l0aW9uIHRvIGJlIGV2YWx1YXRlZCBmb3IgImJldmFsIi4KKyAqIFdoZW4gInVzaW5nTmV0YmVhbnMiIGlzIHNldCB0aGUgcmV0dXJuZWQgdGV4dCBpcyBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogUmV0dXJucyBPSyBvciBGQUlMLgorICovCisgICAgaW50CitndWlfbWNoX2dldF9iZXZhbF9pbmZvKGJldmFsLCBmaWxlbmFtZSwgbGluZSwgdGV4dCwgaWR4KQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKKyAgICBjaGFyX3UgICAgICoqZmlsZW5hbWU7CisgICAgaW50CQkqbGluZTsKKyAgICBjaGFyX3UgICAgICoqdGV4dDsKKyAgICBpbnQJCSppZHg7Cit7CisgICAgd2luX1QJKndwOworICAgIGludAkJcm93LCBjb2w7CisgICAgY2hhcl91CSpsYnVmOworICAgIGxpbmVucl9UCWxudW07CisKKyAgICAqdGV4dCA9IE5VTEw7CisgICAgcm93ID0gWV8yX1JPVyhiZXZhbC0+eSk7CisgICAgY29sID0gWF8yX0NPTChiZXZhbC0+eCk7CisgICAgd3AgPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKyAgICBpZiAod3AgIT0gTlVMTCAmJiByb3cgPCB3cC0+d19oZWlnaHQgJiYgY29sIDwgV19XSURUSCh3cCkpCisgICAgeworCS8qIEZvdW5kIGEgd2luZG93IGFuZCB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0LiAgTm93IGZpbmQgdGhlIGxpbmUKKwkgKiBudW1iZXIuICovCisJaWYgKCFtb3VzZV9jb21wX3Bvcyh3cCwgJnJvdywgJmNvbCwgJmxudW0pKQorCXsKKwkgICAgLyogTm90IHBhc3QgZW5kIG9mIHRoZSBmaWxlLiAqLworCSAgICBsYnVmID0gbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW0sIEZBTFNFKTsKKwkgICAgaWYgKGNvbCA8PSB3aW5fbGluZXRhYnNpemUod3AsIGxidWYsIChjb2xucl9UKU1BWENPTCkpCisJICAgIHsKKwkJLyogTm90IHBhc3QgZW5kIG9mIGxpbmUuICovCisjIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCQlpZiAodXNpbmdOZXRiZWFucykKKwkJeworCQkgICAgLyogRm9yIE5ldGJlYW5zIHdlIGdldCB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGUgbGluZQorCQkgICAgICogaW5zdGVhZCBvZiB0aGUgd2hvbGUgbGluZS4gKi8KKwkJICAgIGludAkJbGVuOworCQkgICAgcG9zX1QJKnNwb3MgPSBOVUxMLCAqZXBvcyA9IE5VTEw7CisKKwkJICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCQkgICAgeworCQkJaWYgKGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisJCQl7CisJCQkgICAgc3BvcyA9ICZWSXN1YWw7CisJCQkgICAgZXBvcyA9ICZjdXJ3aW4tPndfY3Vyc29yOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIHNwb3MgPSAmY3Vyd2luLT53X2N1cnNvcjsKKwkJCSAgICBlcG9zID0gJlZJc3VhbDsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgY29sID0gdmNvbDJjb2wod3AsIGxudW0sIGNvbCkgLSAxOworCisJCSAgICBpZiAoVklzdWFsX2FjdGl2ZQorCQkJICAgICYmIHdwLT53X2J1ZmZlciA9PSBjdXJ3aW4tPndfYnVmZmVyCisJCQkgICAgJiYgKGxudW0gPT0gc3Bvcy0+bG51bQorCQkJCT8gY29sID49IChpbnQpc3Bvcy0+Y29sCisJCQkJOiBsbnVtID4gc3Bvcy0+bG51bSkKKwkJCSAgICAmJiAobG51bSA9PSBlcG9zLT5sbnVtCisJCQkJPyBjb2wgPD0gKGludCllcG9zLT5jb2wKKwkJCQk6IGxudW0gPCBlcG9zLT5sbnVtKSkKKwkJICAgIHsKKwkJCS8qIFZpc3VhbCBtb2RlIGFuZCBwb2ludGluZyB0byB0aGUgbGluZSB3aXRoIHRoZQorCQkJICogVmlzdWFsIHNlbGVjdGlvbjogcmV0dXJuIHNlbGVjdGVkIHRleHQsIHdpdGggYQorCQkJICogbWF4aW11bSBvZiBvbmUgbGluZS4gKi8KKwkJCWlmIChzcG9zLT5sbnVtICE9IGVwb3MtPmxudW0gfHwgc3Bvcy0+Y29sID09IGVwb3MtPmNvbCkKKwkJCSAgICByZXR1cm4gRkFJTDsKKworCQkJbGJ1ZiA9IG1sX2dldF9idWYoY3Vyd2luLT53X2J1ZmZlciwgVklzdWFsLmxudW0sIEZBTFNFKTsKKwkJCWxidWYgPSB2aW1fc3RybnNhdmUobGJ1ZiArIHNwb3MtPmNvbCwKKwkJCQkgICAgIGVwb3MtPmNvbCAtIHNwb3MtPmNvbCArICgqcF9zZWwgIT0gJ2UnKSk7CisJCQlsbnVtID0gc3Bvcy0+bG51bTsKKwkJCWNvbCA9IHNwb3MtPmNvbDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIEZpbmQgdGhlIHdvcmQgdW5kZXIgdGhlIGN1cnNvci4gKi8KKwkJCSsrZW1zZ19vZmY7CisJCQlsZW4gPSBmaW5kX2lkZW50X2F0X3Bvcyh3cCwgbG51bSwgKGNvbG5yX1QpY29sLCAmbGJ1ZiwKKwkJCQkJRklORF9JREVOVCArIEZJTkRfU1RSSU5HICsgRklORF9FVkFMKTsKKwkJCS0tZW1zZ19vZmY7CisJCQlpZiAobGVuID09IDApCisJCQkgICAgcmV0dXJuIEZBSUw7CisJCQlsYnVmID0gdmltX3N0cm5zYXZlKGxidWYsIGxlbik7CisJCSAgICB9CisJCX0KKyMgZW5kaWYKKwkJKmZpbGVuYW1lID0gd3AtPndfYnVmZmVyLT5iX2ZmbmFtZTsKKwkJKmxpbmUgPSAoaW50KWxudW07CisJCSp0ZXh0ID0gbGJ1ZjsKKwkJKmlkeCA9IGNvbDsKKwkJYmV2YWwtPnRzID0gd3AtPndfYnVmZmVyLT5iX3BfdHM7CisJCXJldHVybiBPSzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gRkFJTDsKK30KKworIyBpZiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBTaG93IGEgYmFsbG9vbiB3aXRoICJtZXNnIi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfcG9zdF9iYWxsb29uKGJldmFsLCBtZXNnKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKKyAgICBjaGFyX3UJKm1lc2c7Cit7CisgICAgYmV2YWwtPm1zZyA9IG1lc2c7CisgICAgaWYgKG1lc2cgIT0gTlVMTCkKKwlkcmF3QmFsbG9vbihiZXZhbCk7CisgICAgZWxzZQorCXVuZHJhd0JhbGxvb24oYmV2YWwpOworfQorIyBlbmRpZiAvKiBGRUFUX0dVSV9XMzIgKi8KKyNlbmRpZiAvKiBGRUFUX1NVTl9XT1JLU0hPUCB8fCBGRUFUX05FVEJFQU5TX0lOVEcgfHwgUFJPVE8gKi8KKworI2lmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChQUk9UTykKKyNpZiBkZWZpbmVkKEZFQVRfQkVWQUxfVElQKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEhpZGUgdGhlIGdpdmVuIGJhbGxvb24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3VucG9zdF9iYWxsb29uKGJldmFsKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK3sKKyAgICB1bmRyYXdCYWxsb29uKGJldmFsKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfR1RLCisvKgorICogV2UgY2FuIHVuY29uZGl0aW9uYWxseSB1c2UgQU5TSS1zdHlsZSBwcm90b3R5cGVzIGhlcmUgc2luY2UKKyAqIEdUSysgcmVxdWlyZXMgYW4gQU5TSSBDIGNvbXBpbGVyIGFueXdheS4KKyAqLworICAgIHN0YXRpYyB2b2lkCithZGRFdmVudEhhbmRsZXIoR3RrV2lkZ2V0ICp0YXJnZXQsIEJhbGxvb25FdmFsICpiZXZhbCkKK3sKKyAgICAvKgorICAgICAqIENvbm5lY3QgdG8gdGhlIGdlbmVyaWMgImV2ZW50IiBzaWduYWwgaW5zdGVhZCBvZiB0aGUgaW5kaXZpZHVhbAorICAgICAqIHNpZ25hbHMgZm9yIGVhY2ggZXZlbnQgdHlwZSwgYmVjYXVzZSB0aGUgZm9ybWVyIGlzIGVtaXR0ZWQgZWFybGllci4KKyAgICAgKiBUaGlzIGFsbG93cyB1cyB0byBjYXRjaCBldmVudHMgaW5kZXBlbmRlbnRseSBvZiB0aGUgc2lnbmFsIGhhbmRsZXJzCisgICAgICogaW4gZ3VpX2d0a194MTEuYy4KKyAgICAgKi8KKyAgICAvKiBTaG91bGQgdXNlIEdUS19PQkpFQ1QoKSBoZXJlLCBidXQgdGhhdCBjYXVzZXMgYSBsaW50IHdhcm5pbmcuLi4gKi8KKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoKEd0a09iamVjdCopKHRhcmdldCksICJldmVudCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkModGFyZ2V0X2V2ZW50X2NiKSwKKwkJICAgICAgIGJldmFsKTsKKyAgICAvKgorICAgICAqIE5hc3R5OiAgS2V5IHByZXNzIGV2ZW50cyBnbyB0byB0aGUgbWFpbiB3aW5kb3cgdGh1cyB0aGUgZHJhd2luZyBhcmVhCisgICAgICogd2lsbCBuZXZlciBzZWUgdGhlbS4gIFRoaXMgbWVhbnMgd2UgaGF2ZSB0byBjb25uZWN0IHRvIHRoZSBtYWluIHdpbmRvdworICAgICAqIGFzIHdlbGwgaW4gb3JkZXIgdG8gY2F0Y2ggdGhvc2UgZXZlbnRzLgorICAgICAqLworICAgIGlmIChndGtfc29ja2V0X2lkID09IDAgJiYgZ3VpLm1haW53aW4gIT0gTlVMTAorCSAgICAmJiBndGtfd2lkZ2V0X2lzX2FuY2VzdG9yKHRhcmdldCwgZ3VpLm1haW53aW4pKQorICAgIHsKKwlndGtfc2lnbmFsX2Nvbm5lY3QoKEd0a09iamVjdCopKGd1aS5tYWlud2luKSwgImV2ZW50IiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQyhtYWlud2luX2V2ZW50X2NiKSwKKwkJCSAgIGJldmFsKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcmVtb3ZlRXZlbnRIYW5kbGVyKEJhbGxvb25FdmFsICpiZXZhbCkKK3sKKyAgICBndGtfc2lnbmFsX2Rpc2Nvbm5lY3RfYnlfZnVuYygoR3RrT2JqZWN0KikoYmV2YWwtPnRhcmdldCksCisJCQkJICBHVEtfU0lHTkFMX0ZVTkModGFyZ2V0X2V2ZW50X2NiKSwKKwkJCQkgIGJldmFsKTsKKworICAgIGlmIChndGtfc29ja2V0X2lkID09IDAgJiYgZ3VpLm1haW53aW4gIT0gTlVMTAorCSAgICAmJiBndGtfd2lkZ2V0X2lzX2FuY2VzdG9yKGJldmFsLT50YXJnZXQsIGd1aS5tYWlud2luKSkKKyAgICB7CisJZ3RrX3NpZ25hbF9kaXNjb25uZWN0X2J5X2Z1bmMoKEd0a09iamVjdCopKGd1aS5tYWlud2luKSwKKwkJCQkgICAgICBHVEtfU0lHTkFMX0ZVTkMobWFpbndpbl9ldmVudF9jYiksCisJCQkJICAgICAgYmV2YWwpOworICAgIH0KK30KKworICAgIHN0YXRpYyBnaW50Cit0YXJnZXRfZXZlbnRfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBCYWxsb29uRXZhbCAqYmV2YWwgPSAoQmFsbG9vbkV2YWwgKilkYXRhOworCisgICAgc3dpdGNoIChldmVudC0+dHlwZSkKKyAgICB7CisJY2FzZSBHREtfRU5URVJfTk9USUZZOgorCSAgICBwb2ludGVyX2V2ZW50KGJldmFsLCAoaW50KWV2ZW50LT5jcm9zc2luZy54LAorCQkJCSAoaW50KWV2ZW50LT5jcm9zc2luZy55LAorCQkJCSBldmVudC0+Y3Jvc3Npbmcuc3RhdGUpOworCSAgICBicmVhazsKKwljYXNlIEdES19NT1RJT05fTk9USUZZOgorCSAgICBpZiAoZXZlbnQtPm1vdGlvbi5pc19oaW50KQorCSAgICB7CisJCWludAkJeDsKKwkJaW50CQl5OworCQlHZGtNb2RpZmllclR5cGUJc3RhdGU7CisJCS8qCisJCSAqIEdES19QT0lOVEVSX01PVElPTl9ISU5UX01BU0sgaXMgc2V0LCB0aHVzIHdlIGNhbm5vdCBvYnRhaW4KKwkJICogdGhlIGNvb3JkaW5hdGVzIGZyb20gdGhlIEdka0V2ZW50TW90aW9uIHN0cnVjdCBkaXJlY3RseS4KKwkJICovCisJCWdka193aW5kb3dfZ2V0X3BvaW50ZXIod2lkZ2V0LT53aW5kb3csICZ4LCAmeSwgJnN0YXRlKTsKKwkJcG9pbnRlcl9ldmVudChiZXZhbCwgeCwgeSwgKHVuc2lnbmVkIGludClzdGF0ZSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXBvaW50ZXJfZXZlbnQoYmV2YWwsIChpbnQpZXZlbnQtPm1vdGlvbi54LAorCQkJCSAgICAgKGludClldmVudC0+bW90aW9uLnksCisJCQkJICAgICBldmVudC0+bW90aW9uLnN0YXRlKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIEdES19MRUFWRV9OT1RJRlk6CisJICAgIC8qCisJICAgICAqIElnbm9yZSBMZWF2ZU5vdGlmeSBldmVudHMgdGhhdCBhcmUgbm90ICJub3JtYWwiLgorCSAgICAgKiBBcHBhcmVudGx5IHdlIGFsc28gZ2V0IGl0IHdoZW4gc29tZWJvZHkgZWxzZSBncmFicyBmb2N1cy4KKwkgICAgICovCisJICAgIGlmIChldmVudC0+Y3Jvc3NpbmcubW9kZSA9PSBHREtfQ1JPU1NJTkdfTk9STUFMKQorCQljYW5jZWxCYWxsb29uKGJldmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSBHREtfQlVUVE9OX1BSRVNTOgorIyBpZmRlZiBIQVZFX0dUSzIKKwljYXNlIEdES19TQ1JPTEw6CisjIGVuZGlmCisJICAgIGNhbmNlbEJhbGxvb24oYmV2YWwpOworCSAgICBicmVhazsKKwljYXNlIEdES19LRVlfUFJFU1M6CisJICAgIGtleV9ldmVudChiZXZhbCwgZXZlbnQtPmtleS5rZXl2YWwsIFRSVUUpOworCSAgICBicmVhazsKKwljYXNlIEdES19LRVlfUkVMRUFTRToKKwkgICAga2V5X2V2ZW50KGJldmFsLCBldmVudC0+a2V5LmtleXZhbCwgRkFMU0UpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7IC8qIGNvbnRpbnVlIGVtaXNzaW9uICovCit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CittYWlud2luX2V2ZW50X2NiKEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudCAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgQmFsbG9vbkV2YWwgKmJldmFsID0gKEJhbGxvb25FdmFsICopZGF0YTsKKworICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpCisgICAgeworCWNhc2UgR0RLX0tFWV9QUkVTUzoKKwkgICAga2V5X2V2ZW50KGJldmFsLCBldmVudC0+a2V5LmtleXZhbCwgVFJVRSk7CisJICAgIGJyZWFrOworCWNhc2UgR0RLX0tFWV9SRUxFQVNFOgorCSAgICBrZXlfZXZlbnQoYmV2YWwsIGV2ZW50LT5rZXkua2V5dmFsLCBGQUxTRSk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsgLyogY29udGludWUgZW1pc3Npb24gKi8KK30KKworICAgIHN0YXRpYyB2b2lkCitwb2ludGVyX2V2ZW50KEJhbGxvb25FdmFsICpiZXZhbCwgaW50IHgsIGludCB5LCB1bnNpZ25lZCBzdGF0ZSkKK3sKKyAgICBpbnQgZGlzdGFuY2U7CisKKyAgICBkaXN0YW5jZSA9IEFCUyh4IC0gYmV2YWwtPngpICsgQUJTKHkgLSBiZXZhbC0+eSk7CisKKyAgICBpZiAoZGlzdGFuY2UgPiA0KQorICAgIHsKKwkvKgorCSAqIE1vdmVkIG91dCBvZiB0aGUgYmFsbG9vbiBsb2NhdGlvbjogY2FuY2VsIGl0LgorCSAqIFJlbWVtYmVyIGJ1dHRvbiBzdGF0ZQorCSAqLworCWJldmFsLT5zdGF0ZSA9IHN0YXRlOworCWNhbmNlbEJhbGxvb24oYmV2YWwpOworCisJLyogTW91c2UgYnV0dG9ucyBhcmUgcHJlc3NlZCAtIG5vIGJhbGxvb24gbm93ICovCisJaWYgKCEoc3RhdGUgJiAoKGludClHREtfQlVUVE9OMV9NQVNLIHwgKGludClHREtfQlVUVE9OMl9NQVNLCisJCQkJCQkgICAgfCAoaW50KUdES19CVVRUT04zX01BU0spKSkKKwl7CisJICAgIGJldmFsLT54ID0geDsKKwkgICAgYmV2YWwtPnkgPSB5OworCisJICAgIGlmIChzdGF0ZSAmIChpbnQpR0RLX01PRDFfTUFTSykKKwkgICAgeworCQkvKgorCQkgKiBBbHQgaXMgcHJlc3NlZCAtLSBlbnRlciBzdXBlci1ldmFsdWF0ZS1tb2RlLAorCQkgKiB3aGVyZSB0aGVyZSBpcyBubyB0aW1lIGRlbGF5CisJCSAqLworCQlpZiAoYmV2YWwtPm1zZ0NCICE9IE5VTEwpCisJCXsKKwkJICAgIGJldmFsLT5zaG93U3RhdGUgPSBTaFNfUEVORElORzsKKwkJICAgICgqYmV2YWwtPm1zZ0NCKShiZXZhbCwgc3RhdGUpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWJldmFsLT50aW1lcklEID0gZ3RrX3RpbWVvdXRfYWRkKChndWludDMyKXBfYmRsYXksCisJCQkJCQkgJnRpbWVvdXRfY2IsIGJldmFsKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAora2V5X2V2ZW50KEJhbGxvb25FdmFsICpiZXZhbCwgdW5zaWduZWQga2V5dmFsLCBpbnQgaXNfa2V5cHJlc3MpCit7CisgICAgaWYgKGJldmFsLT5zaG93U3RhdGUgPT0gU2hTX1NIT1dJTkcgJiYgYmV2YWwtPm1zZ0NCICE9IE5VTEwpCisgICAgeworCXN3aXRjaCAoa2V5dmFsKQorCXsKKwkgICAgY2FzZSBHREtfU2hpZnRfTDoKKwkgICAgY2FzZSBHREtfU2hpZnRfUjoKKwkJYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19VUERBVEVfUEVORElORzsKKwkJKCpiZXZhbC0+bXNnQ0IpKGJldmFsLCAoaXNfa2V5cHJlc3MpCisJCQkJCQkgICA/IChpbnQpR0RLX1NISUZUX01BU0sgOiAwKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgR0RLX0NvbnRyb2xfTDoKKwkgICAgY2FzZSBHREtfQ29udHJvbF9SOgorCQliZXZhbC0+c2hvd1N0YXRlID0gU2hTX1VQREFURV9QRU5ESU5HOworCQkoKmJldmFsLT5tc2dDQikoYmV2YWwsIChpc19rZXlwcmVzcykKKwkJCQkJCSA/IChpbnQpR0RLX0NPTlRST0xfTUFTSyA6IDApOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJY2FuY2VsQmFsbG9vbihiZXZhbCk7CisJCWJyZWFrOworCX0KKyAgICB9CisgICAgZWxzZQorCWNhbmNlbEJhbGxvb24oYmV2YWwpOworfQorCisgICAgc3RhdGljIGdpbnQKK3RpbWVvdXRfY2IoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBCYWxsb29uRXZhbCAqYmV2YWwgPSAoQmFsbG9vbkV2YWwgKilkYXRhOworCisgICAgYmV2YWwtPnRpbWVySUQgPSAwOworICAgIC8qCisgICAgICogSWYgdGhlIHRpbWVyIGV2ZW50IGhhcHBlbnMgdGhlbiB0aGUgbW91c2UgaGFzIHN0b3BwZWQgbG9uZyBlbm91Z2ggZm9yCisgICAgICogYSByZXF1ZXN0IHRvIGJlIHN0YXJ0ZWQuIFRoZSByZXF1ZXN0IHdpbGwgb25seSBzZW5kIHRvIHRoZSBkZWJ1Z2dlciBpZgorICAgICAqIHRoZXJlIHRoZSBtb3VzZSBpcyBwb2ludGluZyBhdCByZWFsIGRhdGEuCisgICAgICovCisgICAgcmVxdWVzdEJhbGxvb24oYmV2YWwpOworCisgICAgcmV0dXJuIEZBTFNFOyAvKiBkb24ndCBjYWxsIG1lIGFnYWluICovCit9CisKKy8qQVJHU1VTRUQyKi8KKyAgICBzdGF0aWMgZ2ludAorYmFsbG9vbl9leHBvc2VfZXZlbnRfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50RXhwb3NlICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBndGtfcGFpbnRfZmxhdF9ib3god2lkZ2V0LT5zdHlsZSwgd2lkZ2V0LT53aW5kb3csCisJCSAgICAgICBHVEtfU1RBVEVfTk9STUFMLCBHVEtfU0hBRE9XX09VVCwKKwkJICAgICAgICZldmVudC0+YXJlYSwgd2lkZ2V0LCAidG9vbHRpcCIsCisJCSAgICAgICAwLCAwLCAtMSwgLTEpOworCisgICAgcmV0dXJuIEZBTFNFOyAvKiBjb250aW51ZSBlbWlzc2lvbiAqLworfQorCisjIGlmbmRlZiBIQVZFX0dUSzIKKy8qQVJHU1VTRUQyKi8KKyAgICBzdGF0aWMgdm9pZAorYmFsbG9vbl9kcmF3X2NiKEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtSZWN0YW5nbGUgKmFyZWEsIGdwb2ludGVyIGRhdGEpCit7CisgICAgR3RrV2lkZ2V0CSAgICAqY2hpbGQ7CisgICAgR2RrUmVjdGFuZ2xlICAgIGNoaWxkX2FyZWE7CisKKyAgICBndGtfcGFpbnRfZmxhdF9ib3god2lkZ2V0LT5zdHlsZSwgd2lkZ2V0LT53aW5kb3csCisJCSAgICAgICBHVEtfU1RBVEVfTk9STUFMLCBHVEtfU0hBRE9XX09VVCwKKwkJICAgICAgIGFyZWEsIHdpZGdldCwgInRvb2x0aXAiLAorCQkgICAgICAgMCwgMCwgLTEsIC0xKTsKKworICAgIGNoaWxkID0gR1RLX0JJTih3aWRnZXQpLT5jaGlsZDsKKworICAgIGlmIChndGtfd2lkZ2V0X2ludGVyc2VjdChjaGlsZCwgYXJlYSwgJmNoaWxkX2FyZWEpKQorCWd0a193aWRnZXRfZHJhdyhjaGlsZCwgJmNoaWxkX2FyZWEpOworfQorIyBlbmRpZgorCisjZWxzZSAvKiAhRkVBVF9HVUlfR1RLICovCisKKyAgICBzdGF0aWMgdm9pZAorYWRkRXZlbnRIYW5kbGVyKHRhcmdldCwgYmV2YWwpCisgICAgV2lkZ2V0CXRhcmdldDsKKyAgICBCYWxsb29uRXZhbAkqYmV2YWw7Cit7CisgICAgWHRBZGRFdmVudEhhbmRsZXIodGFyZ2V0LAorCQkJUG9pbnRlck1vdGlvbk1hc2sgfCBFbnRlcldpbmRvd01hc2sgfAorCQkJTGVhdmVXaW5kb3dNYXNrIHwgQnV0dG9uUHJlc3NNYXNrIHwgS2V5UHJlc3NNYXNrIHwKKwkJCUtleVJlbGVhc2VNYXNrLAorCQkJRmFsc2UsCisJCQlwb2ludGVyRXZlbnRFSCwgKFh0UG9pbnRlciliZXZhbCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcmVtb3ZlRXZlbnRIYW5kbGVyKGJldmFsKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK3sKKyAgICBYdFJlbW92ZUV2ZW50SGFuZGxlcihiZXZhbC0+dGFyZ2V0LAorCQkJUG9pbnRlck1vdGlvbk1hc2sgfCBFbnRlcldpbmRvd01hc2sgfAorCQkJTGVhdmVXaW5kb3dNYXNrIHwgQnV0dG9uUHJlc3NNYXNrIHwgS2V5UHJlc3NNYXNrIHwKKwkJCUtleVJlbGVhc2VNYXNrLAorCQkJRmFsc2UsCisJCQlwb2ludGVyRXZlbnRFSCwgKFh0UG9pbnRlciliZXZhbCk7Cit9CisKKworLyoKKyAqIFRoZSBYIGV2ZW50IGhhbmRsZXIuIEFsbCBpdCBkb2VzIGlzIGNhbGwgdGhlIHJlYWwgZXZlbnQgaGFuZGxlci4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3BvaW50ZXJFdmVudEVIKHcsIGNsaWVudF9kYXRhLCBldmVudCwgdW51c2VkKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKnVudXNlZDsKK3sKKyAgICBCYWxsb29uRXZhbCAqYmV2YWwgPSAoQmFsbG9vbkV2YWwgKiljbGllbnRfZGF0YTsKKyAgICBwb2ludGVyRXZlbnQoYmV2YWwsIGV2ZW50KTsKK30KKworCisvKgorICogVGhlIHJlYWwgZXZlbnQgaGFuZGxlci4gQ2FsbGVkIGJ5IHBvaW50ZXJFdmVudEVIKCkgd2hlbmV2ZXIgYW4gZXZlbnQgd2UgYXJlCisgKiBpbnRlcmVzdGVkIGluIG9jdXJycy4KKyAqLworCisgICAgc3RhdGljIHZvaWQKK3BvaW50ZXJFdmVudChiZXZhbCwgZXZlbnQpCisgICAgQmFsbG9vbkV2YWwJKmJldmFsOworICAgIFhFdmVudAkqZXZlbnQ7Cit7CisgICAgUG9zaXRpb24JZGlzdGFuY2U7CSAgICAvKiBhIG1lYXN1cmUgb2YgaG93IG11Y2ggdGhlIHBvbnRlciBtb3ZlZCAqLworICAgIFBvc2l0aW9uCWRlbHRhOwkJICAgIC8qIHVzZWQgdG8gY29tcHV0ZSBkaXN0YW5jZSAqLworCisgICAgc3dpdGNoIChldmVudC0+dHlwZSkKKyAgICB7CisJY2FzZSBFbnRlck5vdGlmeToKKwljYXNlIE1vdGlvbk5vdGlmeToKKwkgICAgZGVsdGEgPSBldmVudC0+eG1vdGlvbi54IC0gYmV2YWwtPng7CisJICAgIGlmIChkZWx0YSA8IDApCisJCWRlbHRhID0gLWRlbHRhOworCSAgICBkaXN0YW5jZSA9IGRlbHRhOworCSAgICBkZWx0YSA9IGV2ZW50LT54bW90aW9uLnkgLSBiZXZhbC0+eTsKKwkgICAgaWYgKGRlbHRhIDwgMCkKKwkJZGVsdGEgPSAtZGVsdGE7CisJICAgIGRpc3RhbmNlICs9IGRlbHRhOworCSAgICBpZiAoZGlzdGFuY2UgPiA0KQorCSAgICB7CisJCS8qCisJCSAqIE1vdmVkIG91dCBvZiB0aGUgYmFsbG9vbiBsb2NhdGlvbjogY2FuY2VsIGl0LgorCQkgKiBSZW1lbWJlciBidXR0b24gc3RhdGUKKwkJICovCisJCWJldmFsLT5zdGF0ZSA9IGV2ZW50LT54bW90aW9uLnN0YXRlOworCQlpZiAoYmV2YWwtPnN0YXRlICYgKEJ1dHRvbjFNYXNrfEJ1dHRvbjJNYXNrfEJ1dHRvbjNNYXNrKSkKKwkJeworCQkgICAgLyogTW91c2UgYnV0dG9ucyBhcmUgcHJlc3NlZCAtIG5vIGJhbGxvb24gbm93ICovCisJCSAgICBjYW5jZWxCYWxsb29uKGJldmFsKTsKKwkJfQorCQllbHNlIGlmIChiZXZhbC0+c3RhdGUgJiAoTW9kMU1hc2t8TW9kMk1hc2t8TW9kM01hc2spKQorCQl7CisJCSAgICAvKgorCQkgICAgICogQWx0IGlzIHByZXNzZWQgLS0gZW50ZXIgc3VwZXItZXZhbHVhdGUtbW9kZSwKKwkJICAgICAqIHdoZXJlIHRoZXJlIGlzIG5vIHRpbWUgZGVsYXkKKwkJICAgICAqLworCQkgICAgYmV2YWwtPnggPSBldmVudC0+eG1vdGlvbi54OworCQkgICAgYmV2YWwtPnkgPSBldmVudC0+eG1vdGlvbi55OworCQkgICAgYmV2YWwtPnhfcm9vdCA9IGV2ZW50LT54bW90aW9uLnhfcm9vdDsKKwkJICAgIGJldmFsLT55X3Jvb3QgPSBldmVudC0+eG1vdGlvbi55X3Jvb3Q7CisJCSAgICBjYW5jZWxCYWxsb29uKGJldmFsKTsKKwkJICAgIGlmIChiZXZhbC0+bXNnQ0IgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWJldmFsLT5zaG93U3RhdGUgPSBTaFNfUEVORElORzsKKwkJCSgqYmV2YWwtPm1zZ0NCKShiZXZhbCwgYmV2YWwtPnN0YXRlKTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGJldmFsLT54ID0gZXZlbnQtPnhtb3Rpb24ueDsKKwkJICAgIGJldmFsLT55ID0gZXZlbnQtPnhtb3Rpb24ueTsKKwkJICAgIGJldmFsLT54X3Jvb3QgPSBldmVudC0+eG1vdGlvbi54X3Jvb3Q7CisJCSAgICBiZXZhbC0+eV9yb290ID0gZXZlbnQtPnhtb3Rpb24ueV9yb290OworCQkgICAgY2FuY2VsQmFsbG9vbihiZXZhbCk7CisJCSAgICBiZXZhbC0+dGltZXJJRCA9IFh0QXBwQWRkVGltZU91dCggYmV2YWwtPmFwcENvbnRleHQsCisJCQkJCShsb25nX3UpcF9iZGxheSwgdGltZXJSb3V0aW5lLCBiZXZhbCk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCS8qCisJICogTW90aWYgYW5kIEF0aGVuYSB2ZXJzaW9uOiBLZXlzdHJva2VzIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQorCSAqICJ0ZXh0QXJlYSIgd2lkZ2V0LCBhbmQgaGFuZGxlZCBpbiBndWlfeDExX2tleV9oaXRfY2IoKS4KKwkgKi8KKwljYXNlIEtleVByZXNzOgorCSAgICBpZiAoYmV2YWwtPnNob3dTdGF0ZSA9PSBTaFNfU0hPV0lORyAmJiBiZXZhbC0+bXNnQ0IgIT0gTlVMTCkKKwkgICAgeworCQlNb2RpZmllcnMgICBtb2RpZmllcjsKKwkJS2V5U3ltCSAgICBrZXlzeW07CisKKwkJWHRUcmFuc2xhdGVLZXljb2RlKGd1aS5kcHksCisJCQkJICAgICAgIGV2ZW50LT54a2V5LmtleWNvZGUsIGV2ZW50LT54a2V5LnN0YXRlLAorCQkJCSAgICAgICAmbW9kaWZpZXIsICZrZXlzeW0pOworCQlpZiAoa2V5c3ltID09IFhLX1NoaWZ0X0wgfHwga2V5c3ltID09IFhLX1NoaWZ0X1IpCisJCXsKKwkJICAgIGJldmFsLT5zaG93U3RhdGUgPSBTaFNfVVBEQVRFX1BFTkRJTkc7CisJCSAgICAoKmJldmFsLT5tc2dDQikoYmV2YWwsIFNoaWZ0TWFzayk7CisJCX0KKwkJZWxzZSBpZiAoa2V5c3ltID09IFhLX0NvbnRyb2xfTCB8fCBrZXlzeW0gPT0gWEtfQ29udHJvbF9SKQorCQl7CisJCSAgICBiZXZhbC0+c2hvd1N0YXRlID0gU2hTX1VQREFURV9QRU5ESU5HOworCQkgICAgKCpiZXZhbC0+bXNnQ0IpKGJldmFsLCBDb250cm9sTWFzayk7CisJCX0KKwkJZWxzZQorCQkgICAgY2FuY2VsQmFsbG9vbihiZXZhbCk7CisJICAgIH0KKwkgICAgZWxzZQorCQljYW5jZWxCYWxsb29uKGJldmFsKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEtleVJlbGVhc2U6CisJICAgIGlmIChiZXZhbC0+c2hvd1N0YXRlID09IFNoU19TSE9XSU5HICYmIGJldmFsLT5tc2dDQiAhPSBOVUxMKQorCSAgICB7CisJCU1vZGlmaWVycyBtb2RpZmllcjsKKwkJS2V5U3ltIGtleXN5bTsKKworCQlYdFRyYW5zbGF0ZUtleWNvZGUoZ3VpLmRweSwgZXZlbnQtPnhrZXkua2V5Y29kZSwKKwkJCQlldmVudC0+eGtleS5zdGF0ZSwgJm1vZGlmaWVyLCAma2V5c3ltKTsKKwkJaWYgKChrZXlzeW0gPT0gWEtfU2hpZnRfTCkgfHwgKGtleXN5bSA9PSBYS19TaGlmdF9SKSkgeworCQkgICAgYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19VUERBVEVfUEVORElORzsKKwkJICAgICgqYmV2YWwtPm1zZ0NCKShiZXZhbCwgMCk7CisJCX0KKwkJZWxzZSBpZiAoKGtleXN5bSA9PSBYS19Db250cm9sX0wpIHx8IChrZXlzeW0gPT0gWEtfQ29udHJvbF9SKSkKKwkJeworCQkgICAgYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19VUERBVEVfUEVORElORzsKKwkJICAgICgqYmV2YWwtPm1zZ0NCKShiZXZhbCwgMCk7CisJCX0KKwkJZWxzZQorCQkgICAgY2FuY2VsQmFsbG9vbihiZXZhbCk7CisJICAgIH0KKwkgICAgZWxzZQorCQljYW5jZWxCYWxsb29uKGJldmFsKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIExlYXZlTm90aWZ5OgorCQkvKiBJZ25vcmUgTGVhdmVOb3RpZnkgZXZlbnRzIHRoYXQgYXJlIG5vdCAibm9ybWFsIi4KKwkJICogQXBwYXJlbnRseSB3ZSBhbHNvIGdldCBpdCB3aGVuIHNvbWVib2R5IGVsc2UgZ3JhYnMgZm9jdXMuCisJCSAqIEhhcHBlbnMgZm9yIG1lIGV2ZXJ5IHR3byBzZWNvbmRzIChzb21lIGNsaXBib2FyZCB0b29sPykgKi8KKwkJaWYgKGV2ZW50LT54Y3Jvc3NpbmcubW9kZSA9PSBOb3RpZnlOb3JtYWwpCisJCSAgICBjYW5jZWxCYWxsb29uKGJldmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJ1dHRvblByZXNzOgorCQljYW5jZWxCYWxsb29uKGJldmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKyAgICB9Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit0aW1lclJvdXRpbmUoZHgsIGlkKQorICAgIFh0UG9pbnRlcgkgICAgZHg7CisgICAgWHRJbnRlcnZhbElkICAgICppZDsKK3sKKyAgICBCYWxsb29uRXZhbCAqYmV2YWwgPSAoQmFsbG9vbkV2YWwgKilkeDsKKworICAgIGJldmFsLT50aW1lcklEID0gKFh0SW50ZXJ2YWxJZClOVUxMOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgdGltZXIgZXZlbnQgaGFwcGVucyB0aGVuIHRoZSBtb3VzZSBoYXMgc3RvcHBlZCBsb25nIGVub3VnaCBmb3IKKyAgICAgKiBhIHJlcXVlc3QgdG8gYmUgc3RhcnRlZC4gVGhlIHJlcXVlc3Qgd2lsbCBvbmx5IHNlbmQgdG8gdGhlIGRlYnVnZ2VyIGlmCisgICAgICogdGhlcmUgdGhlIG1vdXNlIGlzIHBvaW50aW5nIGF0IHJlYWwgZGF0YS4KKyAgICAgKi8KKyAgICByZXF1ZXN0QmFsbG9vbihiZXZhbCk7Cit9CisKKyNlbmRpZiAvKiAhRkVBVF9HVUlfR1RLICovCisKKyAgICBzdGF0aWMgdm9pZAorcmVxdWVzdEJhbGxvb24oYmV2YWwpCisgICAgQmFsbG9vbkV2YWwJKmJldmFsOworeworICAgIGlmIChiZXZhbC0+c2hvd1N0YXRlICE9IFNoU19QRU5ESU5HKQorICAgIHsKKwkvKiBEZXRlcm1pbmUgdGhlIGJldmFsIHRvIGRpc3BsYXkgKi8KKwlpZiAoYmV2YWwtPm1zZ0NCICE9IE5VTEwpCisJeworCSAgICBiZXZhbC0+c2hvd1N0YXRlID0gU2hTX1BFTkRJTkc7CisJICAgICgqYmV2YWwtPm1zZ0NCKShiZXZhbCwgYmV2YWwtPnN0YXRlKTsKKwl9CisJZWxzZSBpZiAoYmV2YWwtPm1zZyAhPSBOVUxMKQorCSAgICBkcmF3QmFsbG9vbihiZXZhbCk7CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9HVUlfR1RLCisKKyMgaWZkZWYgSEFWRV9HVEsyCisvKgorICogQ29udmVydCB0aGUgc3RyaW5nIHRvIFVURi04IGlmICdlbmNvZGluZycgaXMgbm90ICJ1dGYtOCIuCisgKiBSZXBsYWNlIGFueSBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgYW5kIGludmFsaWQgYnl0ZXMgc2VxdWVuY2VzIHdpdGgKKyAqICJeWCIgb3IgIjx4eD4iIGVzY2FwZXMsIGFuZCBhcHBseSBTcGVjaWFsS2V5IGhpZ2hsaWdodGluZyB0byB0aGVtLgorICogVEFCIGFuZCBOTCBhcmUgcGFzc2VkIHRocm91Z2ggdW5zY2F0aGVkLgorICovCisjICBkZWZpbmUgSVNfTk9OUFJJTlRBQkxFKGMpICgoKGMpIDwgMHgyMCAmJiAoYykgIT0gVEFCICYmIChjKSAhPSBOTCkgXAorCQkJICAgICAgfHwgKGMpID09IERFTCkKKyAgICBzdGF0aWMgdm9pZAorc2V0X3ByaW50YWJsZV9sYWJlbF90ZXh0KEd0a0xhYmVsICpsYWJlbCwgY2hhcl91ICptc2cpCit7CisgICAgY2hhcl91CSAgICAqY29udmJ1ZiA9IE5VTEw7CisgICAgY2hhcl91CSAgICAqYnVmOworICAgIGNoYXJfdQkgICAgKnA7CisgICAgY2hhcl91CSAgICAqcGRlc3Q7CisgICAgdW5zaWduZWQgaW50ICAgIGxlbjsKKyAgICBpbnQJCSAgICBjaGFybGVuOworICAgIGludAkJICAgIHVjOworICAgIFBhbmdvQXR0ckxpc3QgICAqYXR0cl9saXN0OworCisgICAgLyogQ29udmVydCB0byBVVEYtOCBpZiBpdCBpc24ndCBhbHJlYWR5ICovCisgICAgaWYgKG91dHB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorICAgIHsKKwljb252YnVmID0gc3RyaW5nX2NvbnZlcnQoJm91dHB1dF9jb252LCBtc2csIE5VTEwpOworCWlmIChjb252YnVmICE9IE5VTEwpCisJICAgIG1zZyA9IGNvbnZidWY7CisgICAgfQorCisgICAgLyogRmlyc3QgbGV0J3Mgc2VlIGhvdyBtdWNoIHdlIG5lZWQgdG8gYWxsb2NhdGUgKi8KKyAgICBsZW4gPSAwOworICAgIGZvciAocCA9IG1zZzsgKnAgIT0gTlVMOyBwICs9IGNoYXJsZW4pCisgICAgeworCWlmICgoKnAgJiAweDgwKSA9PSAwKQkvKiBiZSBxdWljayBmb3IgQVNDSUkgKi8KKwl7CisJICAgIGNoYXJsZW4gPSAxOworCSAgICBsZW4gKz0gSVNfTk9OUFJJTlRBQkxFKCpwKSA/IDIgOiAxOwkvKiBub25wcmludGFibGU6IF5YICovCisJfQorCWVsc2UKKwl7CisJICAgIGNoYXJsZW4gPSB1dGZfcHRyMmxlbl9jaGVjayhwKTsKKwkgICAgdWMgPSB1dGZfcHRyMmNoYXIocCk7CisKKwkgICAgaWYgKGNoYXJsZW4gIT0gdXRmX2NoYXIybGVuKHVjKSkKKwkJY2hhcmxlbiA9IDE7IC8qIHJlamVjdCBvdmVybG9uZyBzZXF1ZW5jZXMgKi8KKworCSAgICBpZiAoY2hhcmxlbiA9PSAxIHx8IHVjIDwgMHhhMCkJLyogaWxsZWdhbCBieXRlIG9yICAgICovCisJCWxlbiArPSA0OwkJCS8qIGNvbnRyb2wgY2hhcjogPHh4PiAqLworCSAgICBlbHNlIGlmICghdXRmX3ByaW50YWJsZSh1YykpCisJCS8qIE5vdGU6IHdlIGFzc3VtZSBoZXJlIHRoYXQgdXRmX3ByaW50YWJsZSgpIGRvZXNuJ3QKKwkJICogY2FyZSBhYm91dCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEJNUC4gKi8KKwkJbGVuICs9IDY7CQkJLyogbm9ucHJpbnRhYmxlOiA8eHh4eD4gKi8KKwkgICAgZWxzZQorCQlsZW4gKz0gY2hhcmxlbjsKKwl9CisgICAgfQorCisgICAgYXR0cl9saXN0ID0gcGFuZ29fYXR0cl9saXN0X25ldygpOworICAgIGJ1ZiA9IGFsbG9jKGxlbiArIDEpOworCisgICAgLyogTm93IGdvIGZvciB0aGUgcmVhbCB3b3JrICovCisgICAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIHsKKwlhdHRyZW50cnlfVAkqYWVwOworCVBhbmdvQXR0cmlidXRlCSphdHRyOworCWd1aWNvbG9yX1QJcGl4ZWw7CisJR2RrQ29sb3IJY29sb3IgPSB7IDAsIDAsIDAsIDAgfTsKKworCS8qIExvb2sgdXAgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIFNwZWNpYWxLZXkgZm9yZWdyb3VuZCBjb2xvci4gKi8KKwlhZXAgPSBzeW5fZ3VpX2F0dHIyZW50cnkoaGxfYXR0cihITEZfOCkpOworCXBpeGVsID0gKGFlcCAhPSBOVUxMKSA/IGFlcC0+YWVfdS5ndWkuZmdfY29sb3IgOiBJTlZBTENPTE9SOworCWlmIChwaXhlbCAhPSBJTlZBTENPTE9SKQorCSAgICBnZGtfY29sb3JtYXBfcXVlcnlfY29sb3IoZ3RrX3dpZGdldF9nZXRfY29sb3JtYXAoZ3VpLmRyYXdhcmVhKSwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKXBpeGVsLCAmY29sb3IpOworCisJcGRlc3QgPSBidWY7CisJcCA9IG1zZzsKKwl3aGlsZSAoKnAgIT0gTlVMKQorCXsKKwkgICAgLyogQmUgcXVpY2sgZm9yIEFTQ0lJICovCisJICAgIGlmICgoKnAgJiAweDgwKSA9PSAwICYmICFJU19OT05QUklOVEFCTEUoKnApKQorCSAgICB7CisJCSpwZGVzdCsrID0gKnArKzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJY2hhcmxlbiA9IHV0Zl9wdHIybGVuX2NoZWNrKHApOworCQl1YyA9IHV0Zl9wdHIyY2hhcihwKTsKKworCQlpZiAoY2hhcmxlbiAhPSB1dGZfY2hhcjJsZW4odWMpKQorCQkgICAgY2hhcmxlbiA9IDE7IC8qIHJlamVjdCBvdmVybG9uZyBzZXF1ZW5jZXMgKi8KKworCQlpZiAoY2hhcmxlbiA9PSAxIHx8IHVjIDwgMHhhMCB8fCAhdXRmX3ByaW50YWJsZSh1YykpCisJCXsKKwkJICAgIGludAlvdXRsZW47CisKKwkJICAgIC8qIENhcmVmdWw6IHdlIGNhbid0IGp1c3QgdXNlIHRyYW5zY2hhcl9ieXRlKCkgaGVyZSwKKwkJICAgICAqIHNpbmNlICdlbmNvZGluZycgaXMgbm90IG5lY2Vzc2FyaWx5IHNldCB0byAidXRmLTgiLiAqLworCQkgICAgaWYgKCpwICYgMHg4MCAmJiBjaGFybGVuID09IDEpCisJCSAgICB7CisJCQl0cmFuc2NoYXJfaGV4KHBkZXN0LCAqcCk7CS8qIDx4eD4gKi8KKwkJCW91dGxlbiA9IDQ7CisJCSAgICB9CisJCSAgICBlbHNlIGlmICh1YyA+PSAweDgwKQorCQkgICAgeworCQkJLyogTm90ZTogd2UgYXNzdW1lIGhlcmUgdGhhdCB1dGZfcHJpbnRhYmxlKCkgZG9lc24ndAorCQkJICogY2FyZSBhYm91dCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEJNUC4gKi8KKwkJCXRyYW5zY2hhcl9oZXgocGRlc3QsIHVjKTsJLyogPHh4PiBvciA8eHh4eD4gKi8KKwkJCW91dGxlbiA9ICh1YyA8IDB4MTAwKSA/IDQgOiA2OworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJdHJhbnNjaGFyX25vbnByaW50KHBkZXN0LCAqcCk7CS8qIF5YICovCisJCQlvdXRsZW4gPSAyOworCQkgICAgfQorCQkgICAgaWYgKHBpeGVsICE9IElOVkFMQ09MT1IpCisJCSAgICB7CisJCQlhdHRyID0gcGFuZ29fYXR0cl9mb3JlZ3JvdW5kX25ldygKKwkJCQljb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKTsKKwkJCWF0dHItPnN0YXJ0X2luZGV4ID0gcGRlc3QgLSBidWY7CisJCQlhdHRyLT5lbmRfaW5kZXggICA9IHBkZXN0IC0gYnVmICsgb3V0bGVuOworCQkJcGFuZ29fYXR0cl9saXN0X2luc2VydChhdHRyX2xpc3QsIGF0dHIpOworCQkgICAgfQorCQkgICAgcGRlc3QgKz0gb3V0bGVuOworCQkgICAgcCArPSBjaGFybGVuOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgZG8KKwkJCSpwZGVzdCsrID0gKnArKzsKKwkJICAgIHdoaWxlICgtLWNoYXJsZW4gIT0gMCk7CisJCX0KKwkgICAgfQorCX0KKwkqcGRlc3QgPSBOVUw7CisgICAgfQorCisgICAgdmltX2ZyZWUoY29udmJ1Zik7CisKKyAgICBndGtfbGFiZWxfc2V0X3RleHQobGFiZWwsIChjb25zdCBjaGFyICopYnVmKTsKKyAgICB2aW1fZnJlZShidWYpOworCisgICAgZ3RrX2xhYmVsX3NldF9hdHRyaWJ1dGVzKGxhYmVsLCBhdHRyX2xpc3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJlZihhdHRyX2xpc3QpOworfQorIyAgdW5kZWYgSVNfTk9OUFJJTlRBQkxFCisjIGVuZGlmIC8qIEhBVkVfR1RLMiAqLworCisvKgorICogRHJhdyBhIGJhbGxvb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZHJhd0JhbGxvb24oQmFsbG9vbkV2YWwgKmJldmFsKQoreworICAgIGlmIChiZXZhbC0+bXNnICE9IE5VTEwpCisgICAgeworCUd0a1JlcXVpc2l0aW9uCXJlcXVpc2l0aW9uOworCWludAkJc2NyZWVuX3c7CisJaW50CQlzY3JlZW5faDsKKwlpbnQJCXg7CisJaW50CQl5OworCWludAkJeF9vZmZzZXQgPSBFVkFMX09GRlNFVF9YOworCWludAkJeV9vZmZzZXQgPSBFVkFMX09GRlNFVF9ZOworIyBpZmRlZiBIQVZFX0dUSzIKKwlQYW5nb0xheW91dAkqbGF5b3V0OworIyBlbmRpZgorIyBpZmRlZiBIQVZFX0dUS19NVUxUSUhFQUQKKwlHZGtTY3JlZW4JKnNjcmVlbjsKKworCXNjcmVlbiA9IGd0a193aWRnZXRfZ2V0X3NjcmVlbihiZXZhbC0+dGFyZ2V0KTsKKwlndGtfd2luZG93X3NldF9zY3JlZW4oR1RLX1dJTkRPVyhiZXZhbC0+YmFsbG9vblNoZWxsKSwgc2NyZWVuKTsKKwlzY3JlZW5fdyA9IGdka19zY3JlZW5fZ2V0X3dpZHRoKHNjcmVlbik7CisJc2NyZWVuX2ggPSBnZGtfc2NyZWVuX2dldF9oZWlnaHQoc2NyZWVuKTsKKyMgZWxzZQorCXNjcmVlbl93ID0gZ2RrX3NjcmVlbl93aWR0aCgpOworCXNjcmVlbl9oID0gZ2RrX3NjcmVlbl9oZWlnaHQoKTsKKyMgZW5kaWYKKwlndGtfd2lkZ2V0X2Vuc3VyZV9zdHlsZShiZXZhbC0+YmFsbG9vblNoZWxsKTsKKwlndGtfd2lkZ2V0X2Vuc3VyZV9zdHlsZShiZXZhbC0+YmFsbG9vbkxhYmVsKTsKKworIyBpZmRlZiBIQVZFX0dUSzIKKwlzZXRfcHJpbnRhYmxlX2xhYmVsX3RleHQoR1RLX0xBQkVMKGJldmFsLT5iYWxsb29uTGFiZWwpLCBiZXZhbC0+bXNnKTsKKwkvKgorCSAqIERpcnR5IHRyaWNrOiAgRW5hYmxlIHdyYXBwaW5nIG1vZGUgb24gdGhlIGxhYmVsJ3MgbGF5b3V0IGJlaGluZCBpdHMKKwkgKiBiYWNrLiAgVGhpcyB3YXkgR3RrTGFiZWwgd29uJ3QgdHJ5IHRvIGNvbnN0cmFpbiB0aGUgd3JhcCB3aWR0aCB0byBhCisJICogYnVpbHRpbiBtYXhpbXVtIHZhbHVlIG9mIGFib3V0IDY1IExhdGluIGNoYXJhY3RlcnMuCisJICovCisJbGF5b3V0ID0gZ3RrX2xhYmVsX2dldF9sYXlvdXQoR1RLX0xBQkVMKGJldmFsLT5iYWxsb29uTGFiZWwpKTsKKyMgIGlmZGVmIFBBTkdPX1dSQVBfV09SRF9DSEFSCisJcGFuZ29fbGF5b3V0X3NldF93cmFwKGxheW91dCwgUEFOR09fV1JBUF9XT1JEX0NIQVIpOworIyAgZWxzZQorCXBhbmdvX2xheW91dF9zZXRfd3JhcChsYXlvdXQsIFBBTkdPX1dSQVBfV09SRCk7CisjICBlbmRpZgorCXBhbmdvX2xheW91dF9zZXRfd2lkdGgobGF5b3V0LAorCQkvKiB0cnkgdG8gY29tZSB1cCB3aXRoIHNvbWUgcmVhc29uYWJsZSB3aWR0aCAqLworCQlQQU5HT19TQ0FMRSAqIENMQU1QKGd1aS5udW1fY29scyAqIGd1aS5jaGFyX3dpZHRoLAorCQkJCSAgICBzY3JlZW5fdyAvIDIsCisJCQkJICAgIE1BWCgyMCwgc2NyZWVuX3cgLSAyMCkpKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgYmFsbG9vbidzIHdpZHRoIGFuZCBoZWlnaHQuICovCisJZ3RrX3dpZGdldF9zaXplX3JlcXVlc3QoYmV2YWwtPmJhbGxvb25TaGVsbCwgJnJlcXVpc2l0aW9uKTsKKyMgZWxzZQorCWd0a19sYWJlbF9zZXRfbGluZV93cmFwKEdUS19MQUJFTChiZXZhbC0+YmFsbG9vbkxhYmVsKSwgRkFMU0UpOworCWd0a19sYWJlbF9zZXRfdGV4dChHVEtfTEFCRUwoYmV2YWwtPmJhbGxvb25MYWJlbCksCisJCQkgICAoY29uc3QgY2hhciAqKWJldmFsLT5tc2cpOworCisJLyogQ2FsY3VsYXRlIHRoZSBiYWxsb29uJ3Mgd2lkdGggYW5kIGhlaWdodC4gKi8KKwlndGtfd2lkZ2V0X3NpemVfcmVxdWVzdChiZXZhbC0+YmFsbG9vblNoZWxsLCAmcmVxdWlzaXRpb24pOworCS8qCisJICogVW5mb3J0dW5hdGVseSwgdGhlIGRpcnR5IHRyaWNrIHVzZWQgYWJvdmUgdG8gZ2V0IGFyb3VuZCB0aGUgYnVpbHRpbgorCSAqIG1heGltdW0gd3JhcCB3aWR0aCBvZiBHdGtMYWJlbCBkb2Vzbid0IHdvcmsgd2l0aCBHVEsrIDEuICBUaHVzIGlmCisJICogYW5kIG9ubHkgaWYgaXQncyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSB0byBhdm9pZCBkcmF3aW5nIG9mZi1zY3JlZW4sCisJICogZG8gZW5hYmxlIHdyYXBwaW5nIG5vdyBhbmQgcmVjYWxjdWxhdGUgdGhlIHNpemUgcmVxdWVzdC4KKwkgKi8KKwlpZiAocmVxdWlzaXRpb24ud2lkdGggPiBzY3JlZW5fdykKKwl7CisJICAgIGd0a19sYWJlbF9zZXRfbGluZV93cmFwKEdUS19MQUJFTChiZXZhbC0+YmFsbG9vbkxhYmVsKSwgVFJVRSk7CisJICAgIGd0a193aWRnZXRfc2l6ZV9yZXF1ZXN0KGJldmFsLT5iYWxsb29uU2hlbGwsICZyZXF1aXNpdGlvbik7CisJfQorIyBlbmRpZgorCisJLyogQ29tcHV0ZSBwb3NpdGlvbiBvZiB0aGUgYmFsbG9vbiBhcmVhICovCisJZ2RrX3dpbmRvd19nZXRfb3JpZ2luKGJldmFsLT50YXJnZXQtPndpbmRvdywgJngsICZ5KTsKKwl4ICs9IGJldmFsLT54OworCXkgKz0gYmV2YWwtPnk7CisKKwkvKiBHZXQgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIG1vdXNlIHBvaW50ZXIgKi8KKwlpZiAoeCArIHhfb2Zmc2V0ICsgcmVxdWlzaXRpb24ud2lkdGggPiBzY3JlZW5fdykKKwkgICAgeV9vZmZzZXQgKz0gMTU7CisJaWYgKHkgKyB5X29mZnNldCArIHJlcXVpc2l0aW9uLmhlaWdodCA+IHNjcmVlbl9oKQorCSAgICB5X29mZnNldCA9IC1yZXF1aXNpdGlvbi5oZWlnaHQgLSBFVkFMX09GRlNFVF9ZOworCisJLyogU2FuaXRpemUgdmFsdWVzICovCisJeCA9IENMQU1QKHggKyB4X29mZnNldCwgMCwgTUFYKDAsIHNjcmVlbl93IC0gcmVxdWlzaXRpb24ud2lkdGgpKTsKKwl5ID0gQ0xBTVAoeSArIHlfb2Zmc2V0LCAwLCBNQVgoMCwgc2NyZWVuX2ggLSByZXF1aXNpdGlvbi5oZWlnaHQpKTsKKworCS8qIFNob3cgdGhlIGJhbGxvb24gKi8KKwlndGtfd2lkZ2V0X3NldF91cG9zaXRpb24oYmV2YWwtPmJhbGxvb25TaGVsbCwgeCwgeSk7CisJZ3RrX3dpZGdldF9zaG93KGJldmFsLT5iYWxsb29uU2hlbGwpOworCisJYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19TSE9XSU5HOworICAgIH0KK30KKworLyoKKyAqIFVuZHJhdyBhIGJhbGxvb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAordW5kcmF3QmFsbG9vbihCYWxsb29uRXZhbCAqYmV2YWwpCit7CisgICAgaWYgKGJldmFsLT5iYWxsb29uU2hlbGwgIT0gTlVMTCkKKwlndGtfd2lkZ2V0X2hpZGUoYmV2YWwtPmJhbGxvb25TaGVsbCk7CisgICAgYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19ORVVUUkFMOworfQorCisgICAgc3RhdGljIHZvaWQKK2NhbmNlbEJhbGxvb24oQmFsbG9vbkV2YWwgKmJldmFsKQoreworICAgIGlmIChiZXZhbC0+c2hvd1N0YXRlID09IFNoU19TSE9XSU5HCisJICAgIHx8IGJldmFsLT5zaG93U3RhdGUgPT0gU2hTX1VQREFURV9QRU5ESU5HKQorCXVuZHJhd0JhbGxvb24oYmV2YWwpOworCisgICAgaWYgKGJldmFsLT50aW1lcklEICE9IDApCisgICAgeworCWd0a190aW1lb3V0X3JlbW92ZShiZXZhbC0+dGltZXJJRCk7CisJYmV2YWwtPnRpbWVySUQgPSAwOworICAgIH0KKyAgICBiZXZhbC0+c2hvd1N0YXRlID0gU2hTX05FVVRSQUw7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY3JlYXRlQmFsbG9vbkV2YWxXaW5kb3coQmFsbG9vbkV2YWwgKmJldmFsKQoreworICAgIGJldmFsLT5iYWxsb29uU2hlbGwgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsKKworICAgIGd0a193aWRnZXRfc2V0X2FwcF9wYWludGFibGUoYmV2YWwtPmJhbGxvb25TaGVsbCwgVFJVRSk7CisgICAgZ3RrX3dpbmRvd19zZXRfcG9saWN5KEdUS19XSU5ET1coYmV2YWwtPmJhbGxvb25TaGVsbCksIEZBTFNFLCBGQUxTRSwgVFJVRSk7CisgICAgZ3RrX3dpZGdldF9zZXRfbmFtZShiZXZhbC0+YmFsbG9vblNoZWxsLCAiZ3RrLXRvb2x0aXBzIik7CisgICAgZ3RrX2NvbnRhaW5lcl9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUihiZXZhbC0+YmFsbG9vblNoZWxsKSwgNCk7CisKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoKEd0a09iamVjdCopKGJldmFsLT5iYWxsb29uU2hlbGwpLCAiZXhwb3NlX2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhiYWxsb29uX2V4cG9zZV9ldmVudF9jYiksIE5VTEwpOworIyBpZm5kZWYgSEFWRV9HVEsyCisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KChHdGtPYmplY3QqKShiZXZhbC0+YmFsbG9vblNoZWxsKSwgImRyYXciLAorCQkgICAgICAgR1RLX1NJR05BTF9GVU5DKGJhbGxvb25fZHJhd19jYiksIE5VTEwpOworIyBlbmRpZgorICAgIGJldmFsLT5iYWxsb29uTGFiZWwgPSBndGtfbGFiZWxfbmV3KE5VTEwpOworCisgICAgZ3RrX2xhYmVsX3NldF9saW5lX3dyYXAoR1RLX0xBQkVMKGJldmFsLT5iYWxsb29uTGFiZWwpLCBGQUxTRSk7CisgICAgZ3RrX2xhYmVsX3NldF9qdXN0aWZ5KEdUS19MQUJFTChiZXZhbC0+YmFsbG9vbkxhYmVsKSwgR1RLX0pVU1RJRllfTEVGVCk7CisgICAgZ3RrX21pc2Nfc2V0X2FsaWdubWVudChHVEtfTUlTQyhiZXZhbC0+YmFsbG9vbkxhYmVsKSwgMC41ZiwgMC41Zik7CisgICAgZ3RrX3dpZGdldF9zZXRfbmFtZShiZXZhbC0+YmFsbG9vbkxhYmVsLCAidmltLWJhbGxvb24tbGFiZWwiKTsKKyAgICBndGtfd2lkZ2V0X3Nob3coYmV2YWwtPmJhbGxvb25MYWJlbCk7CisKKyAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKGJldmFsLT5iYWxsb29uU2hlbGwpLCBiZXZhbC0+YmFsbG9vbkxhYmVsKTsKK30KKworI2Vsc2UgLyogIUZFQVRfR1VJX0dUSyAqLworCisvKgorICogRHJhdyBhIGJhbGxvb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZHJhd0JhbGxvb24oYmV2YWwpCisgICAgQmFsbG9vbkV2YWwJKmJldmFsOworeworICAgIERpbWVuc2lvbgl3OworICAgIERpbWVuc2lvbgloOworICAgIFBvc2l0aW9uIHR4OworICAgIFBvc2l0aW9uIHR5OworCisgICAgaWYgKGJldmFsLT5tc2cgIT0gTlVMTCkKKyAgICB7CisJLyogU2hvdyB0aGUgQmFsbG9vbiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBsYWJlbCdzIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorCVhtU3RyaW5nIHM7CisKKwkvKiBGb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdlIHBhcnNlIE5MIGNoYXJhY3RlcnMgdG8gY3JlYXRlIGEKKwkgKiBtdWx0aS1saW5lIGxhYmVsLiAgVGhpcyBkb2Vzbid0IHdvcmsgZm9yIGFsbCBsYW5ndWFnZXMsIGJ1dAorCSAqIFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKCkgZG9lc24ndCBkbyBtdWx0aS1saW5lIGxhYmVscy4uLiAqLworCWlmIChiZXZhbC0+bXNnQ0IgIT0gTlVMTCkKKwkgICAgcyA9IFhtU3RyaW5nQ3JlYXRlTHRvUigoY2hhciAqKWJldmFsLT5tc2csIFhtRk9OVExJU1RfREVGQVVMVF9UQUcpOworCWVsc2UKKwkgICAgcyA9IFhtU3RyaW5nQ3JlYXRlTG9jYWxpemVkKChjaGFyICopYmV2YWwtPm1zZyk7CisJeworCSAgICBYbUZvbnRMaXN0IGZsOworCisJICAgIGZsID0gZ3VpX21vdGlmX2ZvbnRzZXQyZm9udGxpc3QoJmd1aS50b29sdGlwX2ZvbnRzZXQpOworCSAgICBpZiAoZmwgIT0gTlVMTCkKKwkgICAgeworCQlYbVN0cmluZ0V4dGVudChmbCwgcywgJncsICZoKTsKKwkJWG1Gb250TGlzdEZyZWUoZmwpOworCSAgICB9CisJfQorCXcgKz0gZ3VpLmJvcmRlcl9vZmZzZXQgPDwgMTsKKwloICs9IGd1aS5ib3JkZXJfb2Zmc2V0IDw8IDE7CisJWHRWYVNldFZhbHVlcyhiZXZhbC0+YmFsbG9vbkxhYmVsLCBYbU5sYWJlbFN0cmluZywgcywgTlVMTCk7CisJWG1TdHJpbmdGcmVlKHMpOworI2Vsc2UgLyogQXRoZW5hICovCisJLyogQXNzdW1lIFh0TmludGVybmF0aW9uYWwgPT0gVHJ1ZSAqLworCVhGb250U2V0CWZzZXQ7CisJWEZvbnRTZXRFeHRlbnRzICpleHQ7CisKKwlYdFZhR2V0VmFsdWVzKGJldmFsLT5iYWxsb29uTGFiZWwsIFh0TmZvbnRTZXQsICZmc2V0LCBOVUxMKTsKKwlleHQgPSBYRXh0ZW50c09mRm9udFNldChmc2V0KTsKKwloID0gZXh0LT5tYXhfaW5rX2V4dGVudC5oZWlnaHQ7CisJdyA9IFhtYlRleHRFc2NhcGVtZW50KGZzZXQsCisJCQkgICAgICAoY2hhciAqKWJldmFsLT5tc2csCisJCQkgICAgICAoaW50KVNUUkxFTihiZXZhbC0+bXNnKSk7CisJdyArPSBndWkuYm9yZGVyX29mZnNldCA8PCAxOworCWggKz0gZ3VpLmJvcmRlcl9vZmZzZXQgPDwgMTsKKwlYdFZhU2V0VmFsdWVzKGJldmFsLT5iYWxsb29uTGFiZWwsIFh0TmxhYmVsLCBiZXZhbC0+bXNnLCBOVUxMKTsKKyNlbmRpZgorCisJLyogQ29tcHV0ZSBwb3NpdGlvbiBvZiB0aGUgYmFsbG9vbiBhcmVhICovCisJdHggPSBiZXZhbC0+eF9yb290ICsgRVZBTF9PRkZTRVRfWDsKKwl0eSA9IGJldmFsLT55X3Jvb3QgKyBFVkFMX09GRlNFVF9ZOworCWlmICgodHggKyB3KSA+IGJldmFsLT5zY3JlZW5fd2lkdGgpCisJICAgIHR4ID0gYmV2YWwtPnNjcmVlbl93aWR0aCAtIHc7CisJaWYgKCh0eSArIGgpID4gYmV2YWwtPnNjcmVlbl9oZWlnaHQpCisJICAgIHR5ID0gYmV2YWwtPnNjcmVlbl9oZWlnaHQgLSBoOworI2lmZGVmIEZFQVRfR1VJX01PVElGCisJWHRWYVNldFZhbHVlcyhiZXZhbC0+YmFsbG9vblNoZWxsLAorCQlYbU54LCB0eCwKKwkJWG1OeSwgdHksCisJCU5VTEwpOworI2Vsc2UKKwkvKiBBdGhlbmEgKi8KKwlYdFZhU2V0VmFsdWVzKGJldmFsLT5iYWxsb29uU2hlbGwsCisJCVh0TngsIHR4LAorCQlYdE55LCB0eSwKKwkJTlVMTCk7CisjZW5kaWYKKworCVh0UG9wdXAoYmV2YWwtPmJhbGxvb25TaGVsbCwgWHRHcmFiTm9uZSk7CisKKwliZXZhbC0+c2hvd1N0YXRlID0gU2hTX1NIT1dJTkc7CisKKwljdXJyZW50X2JldmFsID0gYmV2YWw7CisgICAgfQorfQorCisvKgorICogVW5kcmF3IGEgYmFsbG9vbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCit1bmRyYXdCYWxsb29uKGJldmFsKQorICAgIEJhbGxvb25FdmFsICpiZXZhbDsKK3sKKyAgICBpZiAoYmV2YWwtPmJhbGxvb25TaGVsbCAhPSAoV2lkZ2V0KTApCisJWHRQb3Bkb3duKGJldmFsLT5iYWxsb29uU2hlbGwpOworICAgIGJldmFsLT5zaG93U3RhdGUgPSBTaFNfTkVVVFJBTDsKKworICAgIGN1cnJlbnRfYmV2YWwgPSBOVUxMOworfQorCisgICAgc3RhdGljIHZvaWQKK2NhbmNlbEJhbGxvb24oYmV2YWwpCisgICAgQmFsbG9vbkV2YWwJKmJldmFsOworeworICAgIGlmIChiZXZhbC0+c2hvd1N0YXRlID09IFNoU19TSE9XSU5HCisJICAgIHx8IGJldmFsLT5zaG93U3RhdGUgPT0gU2hTX1VQREFURV9QRU5ESU5HKQorCXVuZHJhd0JhbGxvb24oYmV2YWwpOworCisgICAgaWYgKGJldmFsLT50aW1lcklEICE9IChYdEludGVydmFsSWQpTlVMTCkKKyAgICB7CisJWHRSZW1vdmVUaW1lT3V0KGJldmFsLT50aW1lcklEKTsKKwliZXZhbC0+dGltZXJJRCA9IChYdEludGVydmFsSWQpTlVMTDsKKyAgICB9CisgICAgYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19ORVVUUkFMOworfQorCisKKyAgICBzdGF0aWMgdm9pZAorY3JlYXRlQmFsbG9vbkV2YWxXaW5kb3coYmV2YWwpCisgICAgQmFsbG9vbkV2YWwJKmJldmFsOworeworICAgIEFyZwkJYXJnc1sxMl07CisgICAgaW50CQluOworCisgICAgbiA9IDA7CisjaWZkZWYgRkVBVF9HVUlfTU9USUYKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5hbGxvd1NoZWxsUmVzaXplLCBUcnVlKTsgbisrOworICAgIGJldmFsLT5iYWxsb29uU2hlbGwgPSBYdEFwcENyZWF0ZVNoZWxsKCJiYWxsb29uRXZhbCIsICJCYWxsb29uRXZhbCIsCisJCSAgICBvdmVycmlkZVNoZWxsV2lkZ2V0Q2xhc3MsIGd1aS5kcHksIGFyZ3MsIG4pOworI2Vsc2UKKyAgICAvKiBBdGhlbmEgKi8KKyAgICBYdFNldEFyZyhhcmdzW25dLCBYdE5hbGxvd1NoZWxsUmVzaXplLCBUcnVlKTsgbisrOworICAgIGJldmFsLT5iYWxsb29uU2hlbGwgPSBYdEFwcENyZWF0ZVNoZWxsKCJiYWxsb29uRXZhbCIsICJCYWxsb29uRXZhbCIsCisJCSAgICBvdmVycmlkZVNoZWxsV2lkZ2V0Q2xhc3MsIGd1aS5kcHksIGFyZ3MsIG4pOworI2VuZGlmCisKKyAgICBuID0gMDsKKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorICAgIHsKKwlYbUZvbnRMaXN0IGZsOworCisJZmwgPSBndWlfbW90aWZfZm9udHNldDJmb250bGlzdCgmZ3VpLnRvb2x0aXBfZm9udHNldCk7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1OZm9yZWdyb3VuZCwgZ3VpLnRvb2x0aXBfZmdfcGl4ZWwpOyBuKys7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1OYmFja2dyb3VuZCwgZ3VpLnRvb2x0aXBfYmdfcGl4ZWwpOyBuKys7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1OZm9udExpc3QsIGZsKTsgbisrOworCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmFsaWdubWVudCwgWG1BTElHTk1FTlRfQkVHSU5OSU5HKTsgbisrOworCWJldmFsLT5iYWxsb29uTGFiZWwgPSBYdENyZWF0ZU1hbmFnZWRXaWRnZXQoImJhbGxvb25MYWJlbCIsCisJCQl4bUxhYmVsV2lkZ2V0Q2xhc3MsIGJldmFsLT5iYWxsb29uU2hlbGwsIGFyZ3MsIG4pOworICAgIH0KKyNlbHNlIC8qIEZFQVRfR1VJX0FUSEVOQSAqLworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmZvcmVncm91bmQsIGd1aS50b29sdGlwX2ZnX3BpeGVsKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmJhY2tncm91bmQsIGd1aS50b29sdGlwX2JnX3BpeGVsKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFh0TmludGVybmF0aW9uYWwsIFRydWUpOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWHROZm9udFNldCwgZ3VpLnRvb2x0aXBfZm9udHNldCk7IG4rKzsKKyAgICBiZXZhbC0+YmFsbG9vbkxhYmVsID0gWHRDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJiYWxsb29uTGFiZWwiLAorCQkgICAgbGFiZWxXaWRnZXRDbGFzcywgYmV2YWwtPmJhbGxvb25TaGVsbCwgYXJncywgbik7CisjZW5kaWYKK30KKworI2VuZGlmIC8qICFGRUFUX0dVSV9HVEsgKi8KKyNlbmRpZiAvKiAhRkVBVF9HVUlfVzMyICovCisKKyNlbmRpZiAvKiBGRUFUX0JFVkFMICovCmRpZmYgLS1naXQgYS9zcmMvZ3VpX2JldmFsLmggYi9zcmMvZ3VpX2JldmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkNWExOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfYmV2YWwuaApAQCAtMCwwICsxLDc2IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCVZpc3VhbCBXb3Jrc2hvcCBpbnRlZ3JhdGlvbiBieSBHb3Jkb24gUHJpZXVyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisjaWYgIWRlZmluZWQoR1VJX0JFVkFMX0gpICYmIChkZWZpbmVkKEZFQVRfQkVWQUwpIHx8IGRlZmluZWQoUFJPVE8pKQorI2RlZmluZSBHVUlfQkVWQUxfSAorCisjaWZkZWYgRkVBVF9HVUlfR1RLCisjIGluY2x1ZGUgPGd0ay9ndGt3aWRnZXQuaD4KKyNlbHNlCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfWDExKQorIyAgaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorIyBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgZW51bQoreworICAgIFNoU19ORVVUUkFMLAkJCS8qIG5vdGhpbmcgc2hvd2luZyBvciBwZW5kaW5nICovCisgICAgU2hTX1BFTkRJTkcsCQkJLyogZGF0YSByZXF1ZXN0ZWQgZnJvbSBkZWJ1Z2dlciAqLworICAgIFNoU19VUERBVEVfUEVORElORywJCQkvKiBzd2l0Y2hpbmcgaW5mb3JtYXRpb24gZGlzcGxheWVkICovCisgICAgU2hTX1NIT1dJTkcJCQkJLyogdGhlIGJhbGxvb24gaXMgYmVpbmcgZGlzcGxheWVkICovCit9IEJlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IEJhbGxvb25FdmFsU3RydWN0Cit7CisjaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgR3RrV2lkZ2V0CQkqdGFyZ2V0OwkvKiB3aWRnZXQgd2UgYXJlIG1vbml0b3JpbmcgKi8KKyAgICBHdGtXaWRnZXQJCSpiYWxsb29uU2hlbGw7CisgICAgR3RrV2lkZ2V0CQkqYmFsbG9vbkxhYmVsOworICAgIHVuc2lnbmVkIGludAl0aW1lcklEOwkvKiB0aW1lciBmb3IgcnVuICovCisgICAgQmVTdGF0ZQkJc2hvd1N0YXRlOwkvKiB0ZWxscyB1cyB3aGF0cyBjdXJyZW50bHkgZ29pbmcgb24gKi8KKyAgICBpbnQJCQl4OworICAgIGludAkJCXk7CisgICAgdW5zaWduZWQgaW50CXN0YXRlOwkJLyogQnV0dG9uL01vZGlmaWVyIGtleSBzdGF0ZSAqLworI2Vsc2UKKyMgaWYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQorICAgIFdpZGdldAkJdGFyZ2V0OwkJLyogd2lkZ2V0IHdlIGFyZSBtb25pdG9yaW5nICovCisgICAgV2lkZ2V0CQliYWxsb29uU2hlbGw7CisgICAgV2lkZ2V0CQliYWxsb29uTGFiZWw7CisgICAgWHRJbnRlcnZhbElkCXRpbWVySUQ7CS8qIHRpbWVyIGZvciBydW4gKi8KKyAgICBCZVN0YXRlCQlzaG93U3RhdGU7CS8qIHRlbGxzIHVzIHdoYXRzIGN1cnJlbnRseSBnb2luZyBvbiAqLworICAgIFh0QXBwQ29udGV4dAlhcHBDb250ZXh0OwkvKiB1c2VkIGluIGV2ZW50IGhhbmRsZXIgKi8KKyAgICBQb3NpdGlvbgkJeDsKKyAgICBQb3NpdGlvbgkJeTsKKyAgICBQb3NpdGlvbgkJeF9yb290OworICAgIFBvc2l0aW9uCQl5X3Jvb3Q7CisgICAgaW50CQkJc3RhdGU7CQkvKiBCdXR0b24vTW9kaWZpZXIga2V5IHN0YXRlICovCisjIGVsc2UKKyAgICBIV05ECQl0YXJnZXQ7CisgICAgSFdORAkJYmFsbG9vbjsKKyAgICBpbnQJCQl4OworICAgIGludAkJCXk7CisgICAgQmVTdGF0ZQkJc2hvd1N0YXRlOwkvKiB0ZWxscyB1cyB3aGF0cyBjdXJyZW50bHkgZ29pbmcgb24gKi8KKyMgZW5kaWYKKyNlbmRpZgorICAgIGludAkJCXRzOwkJLyogdGFic3RvcCBzZXR0aW5nIGZvciB0aGlzIGJ1ZmZlciAqLworICAgIGNoYXJfdQkJKm1zZzsKKyAgICB2b2lkCQkoKm1zZ0NCKV9fQVJHUygoc3RydWN0IEJhbGxvb25FdmFsU3RydWN0ICosIGludCkpOworICAgIHZvaWQJCSpjbGllbnREYXRhOwkvKiBGb3IgY2FsbGJhY2sgKi8KKyNpZiAhZGVmaW5lZChGRUFUX0dVSV9HVEspICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKKyAgICBEaW1lbnNpb24JCXNjcmVlbl93aWR0aDsJLyogc2NyZWVuIHdpZHRoIGluIHBpeGVscyAqLworICAgIERpbWVuc2lvbgkJc2NyZWVuX2hlaWdodDsJLyogc2NyZWVuIGhlaWdodCBpbiBwaXhlbHMgKi8KKyNlbmRpZgorfSBCYWxsb29uRXZhbDsKKworI2RlZmluZSBFVkFMX09GRlNFVF9YIDE1IC8qIGRpc3BsYWNlbWVudCBvZiBiZXZhbCB0b3BsZWZ0IGNvcm5lciBmcm9tIHBvaW50ZXIgKi8KKyNkZWZpbmUgRVZBTF9PRkZTRVRfWSAxMAorCisjaW5jbHVkZSAiZ3VpX2JldmFsLnBybyIKKworI2VuZGlmIC8qIEdVSV9CRVZBTF9IIGFuZCBGRUFUX0JFVkFMICovCmRpZmYgLS1naXQgYS9zcmMvZ3VpX2d0ay5jIGIvc3JjL2d1aV9ndGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU1MmMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9ndGsuYwpAQCAtMCwwICsxLDMwMzUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBQb3J0aW5nIHRvIEdUSysgd2FzIGRvbmUgYnk6CisgKgorICogKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IE1hcmNpbiBEYWxlY2tpIDxkYWxlY2tpQGV2aXNpb24uYWc+CisgKgorICogV2l0aCBHUkVBVCBzdXBwb3J0IGFuZCBjb250aW51b3VzIGVuY291cmFnZW1lbnRzIGJ5IEFuZHkgS2FobiBhbmQgb2YKKyAqIGNvdXJzZSBCcmFtIE1vb2xlbmFhciEKKyAqCisgKiBTdXBwb3J0IGZvciBHVEsrIDIgd2FzIGFkZGVkIGJ5OgorICoKKyAqIChDKSAyMDAyLDIwMDMgIEphc29uIEhpbGRlYnJhbmQgIDxqYXNvbkBwZWFjZXdvcmtzLmNhPgorICoJCSAgRGFuaWVsIEVsc3RuZXIgIDxkYW5pZWwuZWxzdG5lckBnbXgubmV0PgorICoKKyAqIEJlc3Qgc3VwcG9ydGluZyBhY3RvciAoSGUgaGVscGVkIHNvbWV3aGF0LCBhZXN0aGV0aWNhbGx5IHNwZWFraW5nKToKKyAqIE1heGltZSBSb21hbm8gPHZlcmJvcGhvYmVAaG90bWFpbC5jb20+CisgKi8KKworI2lmZGVmIEZFQVRfR1VJX0dUSworIyBpbmNsdWRlICJndWlfZ3RrX2YuaCIKKyNlbmRpZgorCisvKiBHVEsgZGVmaW5lcyBNQVggYW5kIE1JTiwgYnV0IHNvbWUgc3lzdGVtIGhlYWRlciBmaWxlcyBhcyB3ZWxsLiAgVW5kZWZpbmUKKyAqIHRoZW0gYW5kIGRvbid0IHVzZSB0aGVtLiAqLworI2lmZGVmIE1JTgorIyB1bmRlZiBNSU4KKyNlbmRpZgorI2lmZGVmIE1BWAorIyB1bmRlZiBNQVgKKyNlbmRpZgorCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRQorLyogR25vbWUgcmVkZWZpbmVzIF8oKSBhbmQgTl8oKS4gIEdycnIuLi4gKi8KKyMgaWZkZWYgXworIyAgdW5kZWYgXworIyBlbmRpZgorIyBpZmRlZiBOXworIyAgdW5kZWYgTl8KKyMgZW5kaWYKKyMgaWZkZWYgdGV4dGRvbWFpbgorIyAgdW5kZWYgdGV4dGRvbWFpbgorIyBlbmRpZgorIyBpZmRlZiBiaW5kdGV4dGRvbWFpbgorIyAgdW5kZWYgYmluZHRleHRkb21haW4KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0dFVFRFWFQpICYmICFkZWZpbmVkKEVOQUJMRV9OTFMpCisjICBkZWZpbmUgRU5BQkxFX05MUwkvKiBzbyB0aGUgdGV4dHMgaW4gdGhlIGRpYWxvZyBib3hlcyBhcmUgdHJhbnNsYXRlZCAqLworIyBlbmRpZgorIyBpbmNsdWRlIDxnbm9tZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgJiYgIWRlZmluZWQoSEFWRV9HVEsyKQorIyBpbmNsdWRlICIuLi9waXhtYXBzL2FsZXJ0LnhwbSIKKyMgaW5jbHVkZSAiLi4vcGl4bWFwcy9lcnJvci54cG0iCisjIGluY2x1ZGUgIi4uL3BpeG1hcHMvZ2VuZXJpYy54cG0iCisjIGluY2x1ZGUgIi4uL3BpeG1hcHMvaW5mby54cG0iCisjIGluY2x1ZGUgIi4uL3BpeG1hcHMvcXVlc3QueHBtIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgIWRlZmluZWQoSEFWRV9HVEsyKQorLyoKKyAqIEljb25zIHVzZWQgYnkgdGhlIHRvb2xiYXIgY29kZS4KKyAqLworI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbmV3LnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX29wZW4ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfY2xvc2UueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc2F2ZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9wcmludC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9jdXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfY29weS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9wYXN0ZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9maW5kLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2ZpbmRfbmV4dC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9maW5kX3ByZXYueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfZmluZF9oZWxwLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2V4aXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfdW5kby54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9yZWRvLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2hlbHAueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWFjcm8ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWFrZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9zYXZlX2FsbC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9qdW1wLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2N0YWdzLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2xvYWRfc2Vzc2lvbi54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9zYXZlX3Nlc3Npb24ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbmV3X3Nlc3Npb24ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfYmxhbmsueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWF4aW1pemUueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc3BsaXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWluaW1pemUueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc2hlbGwueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfcmVwbGFjZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl92c3BsaXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWF4d2lkdGgueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWlud2lkdGgueHBtIgorI2VuZGlmIC8qIEZFQVRfVE9PTEJBUiAmJiAhSEFWRV9HVEsyICovCisKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKyMgaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KKyMgaW5jbHVkZSA8Z2RrL2dkay5oPgorIyBpZmRlZiBXSU4zMjY0CisjICBpbmNsdWRlIDxnZGsvZ2Rrd2luMzIuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8Z2RrL2dka3guaD4KKyMgZW5kaWYKKworIyBpbmNsdWRlIDxndGsvZ3RrLmg+CisjZWxzZQorLyogZGVmaW5lIHRoZXNlIGl0ZW1zIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgcHJvdG90eXBlcyB3aXRob3V0IEdUSyAqLwordHlwZWRlZiBpbnQgR3RrV2lkZ2V0OworIyBkZWZpbmUgZ3BvaW50ZXIgaW50CisjIGRlZmluZSBndWludDggaW50CisjIGRlZmluZSBHZGtQaXhtYXAgaW50CisjIGRlZmluZSBHZGtCaXRtYXAgaW50CisjIGRlZmluZSBHdGtJY29uRmFjdG9yeSBpbnQKKyMgZGVmaW5lIEd0a1Rvb2xiYXIgaW50CisjIGRlZmluZSBHdGtBZGp1c3RtZW50IGludAorIyBkZWZpbmUgZ2Jvb2xlYW4gaW50CisjIGRlZmluZSBHZGtFdmVudEtleSBpbnQKKyMgZGVmaW5lIENhbmNlbERhdGEgaW50CisjZW5kaWYKKworI2lmZGVmIEhBVkVfR1RLMgorLyoKKyAqIENvbnZlbmllbmNlIG1hY3JvcyB0byBjb252ZXJ0IGZyb20gJ2VuY29kaW5nJyB0byAndGVybWVuY29kaW5nJyBhbmQKKyAqIHZpY2UgdmVyc2EuCUlmIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHRoZSBwYXNzZWQtaW4gcG9pbnRlciBpcworICogcmV0dXJuZWQgYXMgaXMsIHdpdGhvdXQgYWxsb2NhdGluZyBhbnkgbWVtb3J5LiAgVGh1cyBhZGRpdGlvbmFsIF9GUkVFKCkKKyAqIG1hY3JvcyBhcmUgcHJvdmlkZWQuICBUaGUgX0ZSRUUoKSBtYWNyb3MgYWxzbyBzZXQgdGhlIHBvaW50ZXIgdG8gTlVMTCwKKyAqIGluIG9yZGVyIHRvIGF2b2lkIGJ1Z3MgZHVlIHRvIGlsbGVnYWwgbWVtb3J5IGFjY2VzcyBvbmx5IGhhcHBlbmluZyBpZgorICogJ2VuY29kaW5nJyAhPSB1dGYtOC4uLgorICoKKyAqIERlZmluaW5nIHRoZXNlIG1hY3JvcyBhcyBwdXJlIGV4cHJlc3Npb25zIGxvb2tzIGEgYml0IHRyaWNreSBidXQKKyAqIGF2b2lkcyBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgb2YgdGhlIG1hY3JvIGV4cGFuc2lvbi4gIE9uZSBvZiB0aGUKKyAqIHJhcmUgb2NjYXNpb25zIHdoZXJlIHRoZSBjb21tYSBvcGVyYXRvciBjb21lcyBpbiBoYW5keSA6KQorICoKKyAqIE5vdGU6IERvIE5PVCBrZWVwIHRoZSByZXN1bHQgYXJvdW5kIHdoZW4gaGFuZGxpbmcgY29udHJvbCBiYWNrIHRvCisgKiB0aGUgbWFpbiBWaW0hICBUaGUgdXNlciBjb3VsZCBjaGFuZ2UgJ2VuY29kaW5nJyBhdCBhbnkgdGltZS4KKyAqLworIyBkZWZpbmUgQ09OVkVSVF9UT19VVEY4KFN0cmluZykJCQkJXAorICAgICgob3V0cHV0X2NvbnYudmNfdHlwZSA9PSBDT05WX05PTkUgfHwgKFN0cmluZykgPT0gTlVMTCkJXAorCSAgICA/IChTdHJpbmcpCQkJCQkJXAorCSAgICA6IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgKFN0cmluZyksIE5VTEwpKQorCisjIGRlZmluZSBDT05WRVJUX1RPX1VURjhfRlJFRShTdHJpbmcpCQkJCVwKKyAgICAoKFN0cmluZykgPSAoKG91dHB1dF9jb252LnZjX3R5cGUgPT0gQ09OVl9OT05FKQkJXAorCQkJPyAoY2hhcl91ICopTlVMTAkJCVwKKwkJCTogKHZpbV9mcmVlKFN0cmluZyksIChjaGFyX3UgKilOVUxMKSkpCisKKyMgZGVmaW5lIENPTlZFUlRfRlJPTV9VVEY4KFN0cmluZykJCQkJXAorICAgICgoaW5wdXRfY29udi52Y190eXBlID09IENPTlZfTk9ORSB8fCAoU3RyaW5nKSA9PSBOVUxMKQlcCisJICAgID8gKFN0cmluZykJCQkJCQlcCisJICAgIDogc3RyaW5nX2NvbnZlcnQoJmlucHV0X2NvbnYsIChTdHJpbmcpLCBOVUxMKSkKKworIyBkZWZpbmUgQ09OVkVSVF9GUk9NX1VURjhfRlJFRShTdHJpbmcpCQkJCVwKKyAgICAoKFN0cmluZykgPSAoKGlucHV0X2NvbnYudmNfdHlwZSA9PSBDT05WX05PTkUpCQlcCisJCQk/IChjaGFyX3UgKilOVUxMCQkJXAorCQkJOiAodmltX2ZyZWUoU3RyaW5nKSwgKGNoYXJfdSAqKU5VTEwpKSkKKworI2VuZGlmIC8qIEhBVkVfR1RLMiAqLworCitzdGF0aWMgdm9pZCBlbnRyeV9hY3RpdmF0ZV9jYihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgZGF0YSk7CitzdGF0aWMgdm9pZCBlbnRyeV9jaGFuZ2VkX2NiKEd0a1dpZGdldCAqZW50cnksIEd0a1dpZGdldCAqZGlhbG9nKTsKK3N0YXRpYyB2b2lkIGZpbmRfcmVwbGFjZV9jYihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgZGF0YSk7CisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgZGVmaW5lZChIQVZFX0dUSzIpCisvKgorICogVGFibGUgZnJvbSBCdWlsdEluIyMgaWNvbiBpbmRpY2VzIHRvIEdUSysgc3RvY2sgSURzLiAgT3JkZXIgbXVzdCBleGFjdGx5CisgKiBtYXRjaCB0b29sYmFyX25hbWVzW10gaW4gbWVudS5jISAgQWxsIHN0b2NrIGljb25zIGluY2x1ZGluZyB0aGUgInZpbS0qIgorICogb25lcyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB5b3VyIGd0a3JjIGZpbGUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWVudV9zdG9ja19pZHNbXSA9Cit7CisgICAgLyogMDAgKi8gR1RLX1NUT0NLX05FVywKKyAgICAvKiAwMSAqLyBHVEtfU1RPQ0tfT1BFTiwKKyAgICAvKiAwMiAqLyBHVEtfU1RPQ0tfU0FWRSwKKyAgICAvKiAwMyAqLyBHVEtfU1RPQ0tfVU5ETywKKyAgICAvKiAwNCAqLyBHVEtfU1RPQ0tfUkVETywKKyAgICAvKiAwNSAqLyBHVEtfU1RPQ0tfQ1VULAorICAgIC8qIDA2ICovIEdUS19TVE9DS19DT1BZLAorICAgIC8qIDA3ICovIEdUS19TVE9DS19QQVNURSwKKyAgICAvKiAwOCAqLyBHVEtfU1RPQ0tfUFJJTlQsCisgICAgLyogMDkgKi8gR1RLX1NUT0NLX0hFTFAsCisgICAgLyogMTAgKi8gR1RLX1NUT0NLX0ZJTkQsCisgICAgLyogMTEgKi8gInZpbS1zYXZlLWFsbCIsCisgICAgLyogMTIgKi8gInZpbS1zZXNzaW9uLXNhdmUiLAorICAgIC8qIDEzICovICJ2aW0tc2Vzc2lvbi1uZXciLAorICAgIC8qIDE0ICovICJ2aW0tc2Vzc2lvbi1sb2FkIiwKKyAgICAvKiAxNSAqLyBHVEtfU1RPQ0tfRVhFQ1VURSwKKyAgICAvKiAxNiAqLyBHVEtfU1RPQ0tfRklORF9BTkRfUkVQTEFDRSwKKyAgICAvKiAxNyAqLyBHVEtfU1RPQ0tfQ0xPU0UsCQkvKiBGSVhNRTogZnV6enkgKi8KKyAgICAvKiAxOCAqLyAidmltLXdpbmRvdy1tYXhpbWl6ZSIsCisgICAgLyogMTkgKi8gInZpbS13aW5kb3ctbWluaW1pemUiLAorICAgIC8qIDIwICovICJ2aW0td2luZG93LXNwbGl0IiwKKyAgICAvKiAyMSAqLyAidmltLXNoZWxsIiwKKyAgICAvKiAyMiAqLyBHVEtfU1RPQ0tfR09fQkFDSywKKyAgICAvKiAyMyAqLyBHVEtfU1RPQ0tfR09fRk9SV0FSRCwKKyAgICAvKiAyNCAqLyAidmltLWZpbmQtaGVscCIsCisgICAgLyogMjUgKi8gR1RLX1NUT0NLX0NPTlZFUlQsCisgICAgLyogMjYgKi8gR1RLX1NUT0NLX0pVTVBfVE8sCisgICAgLyogMjcgKi8gInZpbS1idWlsZC10YWdzIiwKKyAgICAvKiAyOCAqLyAidmltLXdpbmRvdy1zcGxpdC12ZXJ0aWNhbCIsCisgICAgLyogMjkgKi8gInZpbS13aW5kb3ctbWF4aW1pemUtd2lkdGgiLAorICAgIC8qIDMwICovICJ2aW0td2luZG93LW1pbmltaXplLXdpZHRoIiwKKyAgICAvKiAzMSAqLyBHVEtfU1RPQ0tfUVVJVAorfTsKKworICAgIHN0YXRpYyB2b2lkCithZGRfc3RvY2tfaWNvbihHdGtJY29uRmFjdG9yeQkqZmFjdG9yeSwKKwkgICAgICAgY29uc3QgY2hhcgkqc3RvY2tfaWQsCisJICAgICAgIGNvbnN0IGd1aW50OAkqaW5saW5lX2RhdGEsCisJICAgICAgIGludAkJZGF0YV9sZW5ndGgpCit7CisgICAgR2RrUGl4YnVmCSpwaXhidWY7CisgICAgR3RrSWNvblNldAkqaWNvbl9zZXQ7CisKKyAgICBwaXhidWYgPSBnZGtfcGl4YnVmX25ld19mcm9tX2lubGluZShkYXRhX2xlbmd0aCwgaW5saW5lX2RhdGEsIEZBTFNFLCBOVUxMKTsKKyAgICBpY29uX3NldCA9IGd0a19pY29uX3NldF9uZXdfZnJvbV9waXhidWYocGl4YnVmKTsKKworICAgIGd0a19pY29uX2ZhY3RvcnlfYWRkKGZhY3RvcnksIHN0b2NrX2lkLCBpY29uX3NldCk7CisKKyAgICBndGtfaWNvbl9zZXRfdW5yZWYoaWNvbl9zZXQpOworICAgIGdfb2JqZWN0X3VucmVmKHBpeGJ1Zik7Cit9CisKKyAgICBzdGF0aWMgaW50Citsb29rdXBfbWVudV9pY29uZmlsZShjaGFyX3UgKmljb25maWxlLCBjaGFyX3UgKmRlc3QpCit7CisgICAgZXhwYW5kX2VudihpY29uZmlsZSwgZGVzdCwgTUFYUEFUSEwpOworCisgICAgaWYgKG1jaF9pc0Z1bGxOYW1lKGRlc3QpKQorICAgIHsKKwlyZXR1cm4gdmltX2ZleGlzdHMoZGVzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RhdGljIGNvbnN0IGNoYXIgICBzdWZmaXhlc1tdWzRdID0geyJwbmciLCAieHBtIiwgImJtcCJ9OworCWNoYXJfdQkJICAgIGJ1ZltNQVhQQVRITF07CisJdW5zaWduZWQgaW50CSAgICBpOworCisJZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyhzdWZmaXhlcyk7ICsraSkKKwkgICAgaWYgKGd1aV9maW5kX2JpdG1hcChkZXN0LCBidWYsIChjaGFyICopc3VmZml4ZXNbaV0pID09IE9LKQorCSAgICB7CisJCVNUUkNQWShkZXN0LCBidWYpOworCQlyZXR1cm4gVFJVRTsKKwkgICAgfQorCisJcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworICAgIHN0YXRpYyBHdGtXaWRnZXQgKgorbG9hZF9tZW51X2ljb25maWxlKGNoYXJfdSAqbmFtZSwgR3RrSWNvblNpemUgaWNvbl9zaXplKQoreworICAgIEd0a1dpZGdldAkgICAgKmltYWdlID0gTlVMTDsKKyAgICBHdGtJY29uU2V0CSAgICAqaWNvbl9zZXQ7CisgICAgR3RrSWNvblNvdXJjZSAgICppY29uX3NvdXJjZTsKKworICAgIC8qCisgICAgICogUmF0aGVyIHRoYW4gbG9hZGluZyB0aGUgaWNvbiBkaXJlY3RseSBpbnRvIGEgR3RrSW1hZ2UsIGNyZWF0ZQorICAgICAqIGEgbmV3IEd0a0ljb25TZXQgYW5kIHB1dCBpdCBpbiB0aGVyZS4gIFRoaXMgd2F5IHdlIGNhbiBlYXNpbHkKKyAgICAgKiBzY2FsZSB0aGUgdG9vbGJhciBpY29ucyBvbiB0aGUgZmx5IHdoZW4gbmVlZGVkLgorICAgICAqLworICAgIGljb25fc2V0ID0gZ3RrX2ljb25fc2V0X25ldygpOworICAgIGljb25fc291cmNlID0gZ3RrX2ljb25fc291cmNlX25ldygpOworCisgICAgZ3RrX2ljb25fc291cmNlX3NldF9maWxlbmFtZShpY29uX3NvdXJjZSwgKGNvbnN0IGNoYXIgKiluYW1lKTsKKyAgICBndGtfaWNvbl9zZXRfYWRkX3NvdXJjZShpY29uX3NldCwgaWNvbl9zb3VyY2UpOworCisgICAgaW1hZ2UgPSBndGtfaW1hZ2VfbmV3X2Zyb21faWNvbl9zZXQoaWNvbl9zZXQsIGljb25fc2l6ZSk7CisKKyAgICBndGtfaWNvbl9zb3VyY2VfZnJlZShpY29uX3NvdXJjZSk7CisgICAgZ3RrX2ljb25fc2V0X3VucmVmKGljb25fc2V0KTsKKworICAgIHJldHVybiBpbWFnZTsKK30KKworICAgIHN0YXRpYyBHdGtXaWRnZXQgKgorY3JlYXRlX21lbnVfaWNvbih2aW1tZW51X1QgKm1lbnUsIEd0a0ljb25TaXplIGljb25fc2l6ZSkKK3sKKyAgICBHdGtXaWRnZXQJKmltYWdlID0gTlVMTDsKKyAgICBjaGFyX3UJYnVmW01BWFBBVEhMXTsKKworICAgIC8qIEZpcnN0IHVzZSBhIHNwZWNpZmllZCAiaWNvbj0iIGFyZ3VtZW50LiAqLworICAgIGlmIChtZW51LT5pY29uZmlsZSAhPSBOVUxMICYmIGxvb2t1cF9tZW51X2ljb25maWxlKG1lbnUtPmljb25maWxlLCBidWYpKQorCWltYWdlID0gbG9hZF9tZW51X2ljb25maWxlKGJ1ZiwgaWNvbl9zaXplKTsKKworICAgIC8qIElmIG5vdCBmb3VuZCBhbmQgbm90IGJ1aWx0aW4gc3BlY2lmaWVkIHRyeSB1c2luZyB0aGUgbWVudSBuYW1lLiAqLworICAgIGlmIChpbWFnZSA9PSBOVUxMICYmICFtZW51LT5pY29uX2J1aWx0aW4KKwkJCQkgICAgICYmIGxvb2t1cF9tZW51X2ljb25maWxlKG1lbnUtPm5hbWUsIGJ1ZikpCisJaW1hZ2UgPSBsb2FkX21lbnVfaWNvbmZpbGUoYnVmLCBpY29uX3NpemUpOworCisgICAgLyogU3RpbGwgbm90IGZvdW5kPyAgVGhlbiB1c2UgYSBidWlsdGluIGljb24sIGEgYmxhbmsgb25lIGFzIGZhbGxiYWNrLiAqLworICAgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgIHsKKwljb25zdCBjaGFyICAqc3RvY2tfaWQ7CisJY29uc3QgaW50ICAgbl9pZHMgPSBHX05fRUxFTUVOVFMobWVudV9zdG9ja19pZHMpOworCisJaWYgKG1lbnUtPmljb25pZHggPj0gMCAmJiBtZW51LT5pY29uaWR4IDwgbl9pZHMpCisJICAgIHN0b2NrX2lkID0gbWVudV9zdG9ja19pZHNbbWVudS0+aWNvbmlkeF07CisJZWxzZQorCSAgICBzdG9ja19pZCA9IEdUS19TVE9DS19NSVNTSU5HX0lNQUdFOworCisJaW1hZ2UgPSBndGtfaW1hZ2VfbmV3X2Zyb21fc3RvY2soc3RvY2tfaWQsIGljb25fc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIGltYWdlOworfQorCisjZW5kaWYgLyogRkVBVF9UT09MQkFSICYmIEhBVkVfR1RLMiAqLworCisjaWYgKGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikpIHx8IGRlZmluZWQoUFJPVE8pCisKKyAgICB2b2lkCitndWlfZ3RrX3JlZ2lzdGVyX3N0b2NrX2ljb25zKHZvaWQpCit7CisjICAgaW5jbHVkZSAiLi4vcGl4bWFwcy9zdG9ja19pY29ucy5oIgorICAgIEd0a0ljb25GYWN0b3J5ICpmYWN0b3J5OworCisgICAgZmFjdG9yeSA9IGd0a19pY29uX2ZhY3RvcnlfbmV3KCk7CisjICAgZGVmaW5lIEFERF9JQ09OKE5hbWUsIERhdGEpIGFkZF9zdG9ja19pY29uKGZhY3RvcnksIE5hbWUsIERhdGEsIChpbnQpc2l6ZW9mKERhdGEpKQorCisgICAgQUREX0lDT04oInZpbS1idWlsZC10YWdzIiwJCSAgc3RvY2tfdmltX2J1aWxkX3RhZ3MpOworICAgIEFERF9JQ09OKCJ2aW0tZmluZC1oZWxwIiwJCSAgc3RvY2tfdmltX2ZpbmRfaGVscCk7CisgICAgQUREX0lDT04oInZpbS1zYXZlLWFsbCIsCQkgIHN0b2NrX3ZpbV9zYXZlX2FsbCk7CisgICAgQUREX0lDT04oInZpbS1zZXNzaW9uLWxvYWQiLAkgIHN0b2NrX3ZpbV9zZXNzaW9uX2xvYWQpOworICAgIEFERF9JQ09OKCJ2aW0tc2Vzc2lvbi1uZXciLAkJICBzdG9ja192aW1fc2Vzc2lvbl9uZXcpOworICAgIEFERF9JQ09OKCJ2aW0tc2Vzc2lvbi1zYXZlIiwJICBzdG9ja192aW1fc2Vzc2lvbl9zYXZlKTsKKyAgICBBRERfSUNPTigidmltLXNoZWxsIiwJCSAgc3RvY2tfdmltX3NoZWxsKTsKKyAgICBBRERfSUNPTigidmltLXdpbmRvdy1tYXhpbWl6ZSIsCSAgc3RvY2tfdmltX3dpbmRvd19tYXhpbWl6ZSk7CisgICAgQUREX0lDT04oInZpbS13aW5kb3ctbWF4aW1pemUtd2lkdGgiLCBzdG9ja192aW1fd2luZG93X21heGltaXplX3dpZHRoKTsKKyAgICBBRERfSUNPTigidmltLXdpbmRvdy1taW5pbWl6ZSIsCSAgc3RvY2tfdmltX3dpbmRvd19taW5pbWl6ZSk7CisgICAgQUREX0lDT04oInZpbS13aW5kb3ctbWluaW1pemUtd2lkdGgiLCBzdG9ja192aW1fd2luZG93X21pbmltaXplX3dpZHRoKTsKKyAgICBBRERfSUNPTigidmltLXdpbmRvdy1zcGxpdCIsCSAgc3RvY2tfdmltX3dpbmRvd19zcGxpdCk7CisgICAgQUREX0lDT04oInZpbS13aW5kb3ctc3BsaXQtdmVydGljYWwiLCBzdG9ja192aW1fd2luZG93X3NwbGl0X3ZlcnRpY2FsKTsKKworIyAgIHVuZGVmIEFERF9JQ09OCisgICAgZ3RrX2ljb25fZmFjdG9yeV9hZGRfZGVmYXVsdChmYWN0b3J5KTsKKyAgICBnX29iamVjdF91bnJlZihmYWN0b3J5KTsKK30KKworI2VuZGlmIC8qIEZFQVRfVE9PTEJBUiAmJiBIQVZFX0dUSzIgKi8KKworCisvKgorICogT25seSB1c2UgYWNjZWxlcmF0b3JzIHdoZW4gZ3RrX21lbnVfZW5zdXJlX3VsaW5lX2FjY2VsX2dyb3VwKCkgaXMKKyAqIGF2YWlsYWJsZSwgd2hpY2ggaXMgaW4gdmVyc2lvbiAxLjIuMS4gIFRoYXQgd2FzIHRoZSBmaXJzdCB2ZXJzaW9uIHdoZXJlCisgKiBhY2NlbGVyYXRvcnMgcHJvcGVybHkgd29ya2VkIChhY2NvcmRpbmcgdG8gdGhlIGNoYW5nZSBsb2cpLgorICovCisjaWZkZWYgR1RLX0NIRUNLX1ZFUlNJT04KKyMgaWYgR1RLX0NIRUNLX1ZFUlNJT04oMSwgMiwgMSkKKyMgIGRlZmluZSBHVEtfVVNFX0FDQ0VMCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogVHJhbnNsYXRlIFZpbSdzIG1uZW1vbmljIHRhZ2dpbmcgdG8gR1RLKyBzdHlsZSBhbmQgY29udmVydCB0byBVVEYtOAorICogaWYgbmVjZXNzYXJ5LiAgVGhlIGNhbGxlciBtdXN0IHZpbV9mcmVlKCkgdGhlIHJldHVybmVkIHN0cmluZy4KKyAqCisgKglJbnB1dAlPdXRwdXQKKyAqCV8JX18KKyAqCSYmCSYKKyAqCSYJXwlzdHJpcHBlZCBpZiB1c2VfbW5lbW9uaWMgPT0gRkFMU0UKKyAqCTxUYWI+CQllbmQgb2YgbWVudSBsYWJlbCB0ZXh0CisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3RyYW5zbGF0ZV9tbmVtb25pY190YWcoY2hhcl91ICpuYW1lLCBpbnQgdXNlX21uZW1vbmljKQoreworICAgIGNoYXJfdSAgKmJ1ZjsKKyAgICBjaGFyX3UgICpwc3JjOworICAgIGNoYXJfdSAgKnBkZXN0OworICAgIGludAkgICAgbl91bmRlcnNjb3JlcyA9IDA7CisKKyMgaWZkZWYgSEFWRV9HVEsyCisgICAgbmFtZSA9IENPTlZFUlRfVE9fVVRGOChuYW1lKTsKKyMgZW5kaWYKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZm9yIChwc3JjID0gbmFtZTsgKnBzcmMgIT0gTlVMICYmICpwc3JjICE9IFRBQjsgKytwc3JjKQorCWlmICgqcHNyYyA9PSAnXycpCisJICAgICsrbl91bmRlcnNjb3JlczsKKworICAgIGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkocHNyYyAtIG5hbWUgKyBuX3VuZGVyc2NvcmVzICsgMSkpOworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICB7CisJcGRlc3QgPSBidWY7CisJZm9yIChwc3JjID0gbmFtZTsgKnBzcmMgIT0gTlVMICYmICpwc3JjICE9IFRBQjsgKytwc3JjKQorCXsKKwkgICAgaWYgKCpwc3JjID09ICdfJykKKwkgICAgeworCQkqcGRlc3QrKyA9ICdfJzsKKwkJKnBkZXN0KysgPSAnXyc7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnBzcmMgIT0gJyYnKQorCSAgICB7CisJCSpwZGVzdCsrID0gKnBzcmM7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKihwc3JjICsgMSkgPT0gJyYnKQorCSAgICB7CisJCSpwZGVzdCsrID0gKnBzcmMrKzsKKwkgICAgfQorCSAgICBlbHNlIGlmICh1c2VfbW5lbW9uaWMpCisJICAgIHsKKwkJKnBkZXN0KysgPSAnXyc7CisJICAgIH0KKwl9CisJKnBkZXN0ID0gTlVMOworICAgIH0KKworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICBDT05WRVJUX1RPX1VURjhfRlJFRShuYW1lKTsKKyMgZW5kaWYKKyAgICByZXR1cm4gYnVmOworfQorCisjIGlmZGVmIEhBVkVfR1RLMgorCisgICAgc3RhdGljIHZvaWQKK21lbnVfaXRlbV9uZXcodmltbWVudV9UICptZW51LCBHdGtXaWRnZXQgKnBhcmVudF93aWRnZXQpCit7CisgICAgR3RrV2lkZ2V0CSpib3g7CisgICAgY2hhcl91CSp0ZXh0OworICAgIGludAkJdXNlX21uZW1vbmljOworCisgICAgLyogSXQgd291bGQgYmUgbmVhdCB0byBoYXZlIGltYWdlIG1lbnUgaXRlbXMsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgbWFqb3IKKyAgICAgKiBjaGFuZ2VzIHRvIFZpbSdzIG1lbnUgc3lzdGVtLiAgTm90IHRvIG1lbnRpb24gdGhhdCBhbGwgdGhlIHRyYW5zbGF0aW9ucworICAgICAqIGhhZCB0byBiZSB1cGRhdGVkLiAqLworICAgIG1lbnUtPmlkID0gZ3RrX21lbnVfaXRlbV9uZXcoKTsKKyAgICBib3ggPSBndGtfaGJveF9uZXcoRkFMU0UsIDIwKTsKKworICAgIHVzZV9tbmVtb25pYyA9IChwX3dha1swXSAhPSAnbicgfHwgIUdUS19JU19NRU5VX0JBUihwYXJlbnRfd2lkZ2V0KSk7CisgICAgdGV4dCA9IHRyYW5zbGF0ZV9tbmVtb25pY190YWcobWVudS0+bmFtZSwgdXNlX21uZW1vbmljKTsKKworICAgIG1lbnUtPmxhYmVsID0gZ3RrX2xhYmVsX25ld193aXRoX21uZW1vbmljKChjb25zdCBjaGFyICopdGV4dCk7CisgICAgdmltX2ZyZWUodGV4dCk7CisKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChib3gpLCBtZW51LT5sYWJlbCwgRkFMU0UsIEZBTFNFLCAwKTsKKworICAgIGlmIChtZW51LT5hY3RleHQgIT0gTlVMTCAmJiBtZW51LT5hY3RleHRbMF0gIT0gTlVMKQorICAgIHsKKwl0ZXh0ID0gQ09OVkVSVF9UT19VVEY4KG1lbnUtPmFjdGV4dCk7CisKKwlndGtfYm94X3BhY2tfZW5kKEdUS19CT1goYm94KSwKKwkJCSBndGtfbGFiZWxfbmV3KChjb25zdCBjaGFyICopdGV4dCksCisJCQkgRkFMU0UsIEZBTFNFLCAwKTsKKworCUNPTlZFUlRfVE9fVVRGOF9GUkVFKHRleHQpOworICAgIH0KKworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIobWVudS0+aWQpLCBib3gpOworICAgIGd0a193aWRnZXRfc2hvd19hbGwobWVudS0+aWQpOworfQorCisjIGVsc2UgLyogIUhBVkVfR1RLMiAqLworCisvKgorICogQ3JlYXRlIGEgaGlnaGx5IGN1c3RvbWl6ZWQgbWVudSBpdGVtIGJ5IGhhbmQgaW5zdGVhZCBvZiBieSB1c2luZzoKKyAqCisgKiBndGtfbWVudV9pdGVtX25ld193aXRoX2xhYmVsKG1lbnUtPmRuYW1lKTsKKyAqCisgKiBUaGlzIGlzIG5lY2Nlc3NhcnksIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIHdheSBpbiBHVEsrIDEgdG8gZ2V0IHRoZQorICogbm90IGF1dG9tYXRpY2FsbHkgcGFyc2VkIGFjY2VsbGVyYXRvciBzdHVmZiByaWdodC4KKyAqLworICAgIHN0YXRpYyB2b2lkCittZW51X2l0ZW1fbmV3KHZpbW1lbnVfVCAqbWVudSwgR3RrV2lkZ2V0ICpwYXJlbnRfd2lkZ2V0KQoreworICAgIEd0a1dpZGdldAkqd2lkZ2V0OworICAgIEd0a1dpZGdldAkqYmluOworICAgIEd0a1dpZGdldAkqbGFiZWw7CisgICAgY2hhcl91CSpuYW1lOworICAgIGd1aW50CWFjY2VsX2tleTsKKworICAgIHdpZGdldCA9IGd0a193aWRnZXRfbmV3KEdUS19UWVBFX01FTlVfSVRFTSwKKwkJCSAgICAiR3RrV2lkZ2V0Ojp2aXNpYmxlIiwgVFJVRSwKKwkJCSAgICAiR3RrV2lkZ2V0OjpzZW5zaXRpdmUiLCBUUlVFLAorCQkJICAgIC8qICJHdGtXaWRnZXQ6OnBhcmVudCIsIHBhcmVudC0+c3VibWVudV9pZCwgKi8KKwkJCSAgICBOVUxMKTsKKyAgICBiaW4gPSBndGtfd2lkZ2V0X25ldyhHVEtfVFlQRV9IQk9YLAorCQkJICJHdGtXaWRnZXQ6OnZpc2libGUiLCBUUlVFLAorCQkJICJHdGtXaWRnZXQ6OnBhcmVudCIsIHdpZGdldCwKKwkJCSAiR3RrQm94OjpzcGFjaW5nIiwgMTYsCisJCQkgTlVMTCk7CisgICAgbGFiZWwgPSBndGtfd2lkZ2V0X25ldyhHVEtfVFlQRV9BQ0NFTF9MQUJFTCwKKwkJCSAgICJHdGtXaWRnZXQ6OnZpc2libGUiLCBUUlVFLAorCQkJICAgIkd0a1dpZGdldDo6cGFyZW50IiwgYmluLAorCQkJICAgIkd0a0FjY2VsTGFiZWw6OmFjY2VsX3dpZGdldCIsIHdpZGdldCwKKwkJCSAgICJHdGtNaXNjOjp4YWxpZ24iLCAwLjAsCisJCQkgICBOVUxMKTsKKyAgICBtZW51LT5sYWJlbCA9IGxhYmVsOworCisgICAgaWYgKG1lbnUtPmFjdGV4dCkKKwlndGtfd2lkZ2V0X25ldyhHVEtfVFlQRV9MQUJFTCwKKwkJICAgICAgICJHdGtXaWRnZXQ6OnZpc2libGUiLCBUUlVFLAorCQkgICAgICAgIkd0a1dpZGdldDo6cGFyZW50IiwgYmluLAorCQkgICAgICAgIkd0a0xhYmVsOjpsYWJlbCIsIG1lbnUtPmFjdGV4dCwKKwkJICAgICAgICJHdGtNaXNjOjp4YWxpZ24iLCAxLjAsCisJCQlOVUxMKTsKKworICAgIC8qCisgICAgICogVHJhbnNsYXRlIFZJTSBhY2NlbGVyYXRvciB0YWdnaW5nIGludG8gR1RLKydzLiAgTm90ZSB0aGF0IHNpbmNlIEdUSyB1c2VzCisgICAgICogdW5kZXJzY29yZXMgYXMgdGhlIGFjY2VsZXJhdG9yIGtleSwgd2UgbmVlZCB0byBhZGQgYW4gYWRkaXRpb25hbCB1bmRlci0KKyAgICAgKiBzY29yZSBmb3IgZWFjaCB1bmRlcnN0b3JlIHRoYXQgYXBwZWFycyBpbiB0aGUgbWVudSBuYW1lLgorICAgICAqLworIyAgaWZkZWYgR1RLX1VTRV9BQ0NFTAorICAgIG5hbWUgPSB0cmFuc2xhdGVfbW5lbW9uaWNfdGFnKG1lbnUtPm5hbWUsCisJCShwX3dha1swXSAhPSAnbicgfHwgIUdUS19JU19NRU5VX0JBUihwYXJlbnRfd2lkZ2V0KSkpOworIyAgZWxzZQorICAgIG5hbWUgPSB0cmFuc2xhdGVfbW5lbW9uaWNfdGFnKG1lbnUtPm5hbWUsIEZBTFNFKTsKKyMgIGVuZGlmCisKKyAgICAvKiBsZXQgR1RLIGRvIGl0cyB0aGluZyAqLworICAgIGFjY2VsX2tleSA9IGd0a19sYWJlbF9wYXJzZV91bGluZShHVEtfTEFCRUwobGFiZWwpLCAoY29uc3QgY2hhciAqKW5hbWUpOworICAgIHZpbV9mcmVlKG5hbWUpOworCisjICBpZmRlZiBHVEtfVVNFX0FDQ0VMCisgICAgLyogRG9uJ3QgYWRkIGFjY2VsYXRvciBpZiAnd2luYWx0a2V5cycgaXMgIm5vIi4gKi8KKyAgICBpZiAoYWNjZWxfa2V5ICE9IEdES19Wb2lkU3ltYm9sKQorICAgIHsKKwlpZiAoR1RLX0lTX01FTlVfQkFSKHBhcmVudF93aWRnZXQpKQorCXsKKwkgICAgaWYgKCpwX3dhayAhPSAnbicpCisJCWd0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yKHdpZGdldCwKKwkJCSJhY3RpdmF0ZV9pdGVtIiwKKwkJCWd1aS5hY2NlbF9ncm91cCwKKwkJCWFjY2VsX2tleSwgR0RLX01PRDFfTUFTSywKKwkJCShHdGtBY2NlbEZsYWdzKTApOworCX0KKwllbHNlCisJeworCSAgICBndGtfd2lkZ2V0X2FkZF9hY2NlbGVyYXRvcih3aWRnZXQsCisJCSAgICAiYWN0aXZhdGVfaXRlbSIsCisJCSAgICBndGtfbWVudV9lbnN1cmVfdWxpbmVfYWNjZWxfZ3JvdXAoR1RLX01FTlUocGFyZW50X3dpZGdldCkpLAorCQkgICAgYWNjZWxfa2V5LCAwLAorCQkgICAgKEd0a0FjY2VsRmxhZ3MpMCk7CisJfQorICAgIH0KKyMgIGVuZGlmIC8qIEdUS19VU0VfQUNDRUwgKi8KKworICAgIG1lbnUtPmlkID0gd2lkZ2V0OworfQorCisjIGVuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworICAgIHZvaWQKK2d1aV9tY2hfYWRkX21lbnUodmltbWVudV9UICptZW51LCBpbnQgaWR4KQoreworICAgIHZpbW1lbnVfVAkqcGFyZW50OworICAgIEd0a1dpZGdldAkqcGFyZW50X3dpZGdldDsKKworICAgIGlmIChtZW51LT5uYW1lWzBdID09ICddJyB8fCBtZW51X2lzX3BvcHVwKG1lbnUtPm5hbWUpKQorICAgIHsKKwltZW51LT5zdWJtZW51X2lkID0gZ3RrX21lbnVfbmV3KCk7CisJcmV0dXJuOworICAgIH0KKworICAgIHBhcmVudCA9IG1lbnUtPnBhcmVudDsKKworICAgIGlmICgocGFyZW50ICE9IE5VTEwgJiYgcGFyZW50LT5zdWJtZW51X2lkID09IE5VTEwpCisJICAgIHx8ICFtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisJcmV0dXJuOworCisgICAgcGFyZW50X3dpZGdldCA9IChwYXJlbnQgIT0gTlVMTCkgPyBwYXJlbnQtPnN1Ym1lbnVfaWQgOiBndWkubWVudWJhcjsKKyAgICBtZW51X2l0ZW1fbmV3KG1lbnUsIHBhcmVudF93aWRnZXQpOworCisgICAgLyogc2luY2UgdGhlIHRlYXJvZmYgc2hvdWxkIGFsd2F5cyBhcHBlYXIgZmlyc3QsIGluY3JlbWVudCBpZHggKi8KKyAgICBpZiAocGFyZW50ICE9IE5VTEwgJiYgIW1lbnVfaXNfcG9wdXAocGFyZW50LT5uYW1lKSkKKwkrK2lkeDsKKworICAgIGd0a19tZW51X3NoZWxsX2luc2VydChHVEtfTUVOVV9TSEVMTChwYXJlbnRfd2lkZ2V0KSwgbWVudS0+aWQsIGlkeCk7CisKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgLyoKKyAgICAgKiBUaGUgIkhlbHAiIG1lbnUgaXMgYSBzcGVjaWFsIGNhc2UsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZSBmYXIKKyAgICAgKiByaWdodCBoYW5kIHNpZGUgb2YgdGhlIG1lbnUtYmFyLiAgSXQncyBkZXRlY3RlZCBieSBpdHMgaGlnaCBwcmlvcml0eS4KKyAgICAgKgorICAgICAqIFJpZ2h0LWFsaWduaW5nICJIZWxwIiBpcyBjb25zaWRlcmVkIGJhZCBVSSBkZXNpZ24gbm93YWRheXMuCisgICAgICogVGh1cyBsZXRzIGRpc2FibGUgdGhpcyBmb3IgR1RLKyAyIHRvIG1hdGNoIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBpZiAocGFyZW50ID09IE5VTEwgJiYgbWVudS0+cHJpb3JpdHkgPj0gOTk5OSkKKwlndGtfbWVudV9pdGVtX3JpZ2h0X2p1c3RpZnkoR1RLX01FTlVfSVRFTShtZW51LT5pZCkpOworI2VuZGlmCisKKyAgICBtZW51LT5zdWJtZW51X2lkID0gZ3RrX21lbnVfbmV3KCk7CisKKyAgICBndGtfbWVudV9zZXRfYWNjZWxfZ3JvdXAoR1RLX01FTlUobWVudS0+c3VibWVudV9pZCksIGd1aS5hY2NlbF9ncm91cCk7CisgICAgZ3RrX21lbnVfaXRlbV9zZXRfc3VibWVudShHVEtfTUVOVV9JVEVNKG1lbnUtPmlkKSwgbWVudS0+c3VibWVudV9pZCk7CisKKyAgICBtZW51LT50ZWFyb2ZmX2hhbmRsZSA9IGd0a190ZWFyb2ZmX21lbnVfaXRlbV9uZXcoKTsKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19URUFST0ZGKSAhPSBOVUxMKQorCWd0a193aWRnZXRfc2hvdyhtZW51LT50ZWFyb2ZmX2hhbmRsZSk7CisgICAgZ3RrX21lbnVfcHJlcGVuZChHVEtfTUVOVShtZW51LT5zdWJtZW51X2lkKSwgbWVudS0+dGVhcm9mZl9oYW5kbGUpOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorbWVudV9pdGVtX2FjdGl2YXRlKEd0a1dpZGdldCAqd2lkZ2V0LCBncG9pbnRlciBkYXRhKQoreworICAgIGd1aV9tZW51X2NiKCh2aW1tZW51X1QgKilkYXRhKTsKKworIyBpZm5kZWYgSEFWRV9HVEsyCisgICAgLyogV29yayBhcm91bmQgYSBidWcgaW4gR1RLKyAxOiB3ZSBkb24ndCBzZWVtIHRvIGdldCBhIGZvY3VzLWluCisgICAgICogZXZlbnQgYWZ0ZXIgY2xpY2tpbmcgYSBtZW51IGl0ZW0gc2hvd24gdmlhIDpwb3B1cC4gKi8KKyAgICBpZiAoIWd1aS5pbl9mb2N1cykKKwlndWlfZm9jdXNfY2hhbmdlKFRSVUUpOworIyBlbmRpZgorCisgICAgLyogbWFrZSBzdXJlIHRoZSBtZW51IGFjdGlvbiBpcyB0YWtlbiBpbW1lZGlhdGVseSAqLworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBpeG1hcHMgdXNlZCBmb3IgdGhlIGRlZmF1bHQgYnV0dG9ucy4KKyAqIE9yZGVyIG11c3QgZXhhY3RseSBtYXRjaCB0b29sYmFyX25hbWVzW10gaW4gbWVudS5jIQorICovCitzdGF0aWMgY2hhciAqKihidWlsdF9pbl9waXhtYXBzW10pID0KK3sKKyAgICB0Yl9uZXdfeHBtLAorICAgIHRiX29wZW5feHBtLAorICAgIHRiX3NhdmVfeHBtLAorICAgIHRiX3VuZG9feHBtLAorICAgIHRiX3JlZG9feHBtLAorICAgIHRiX2N1dF94cG0sCisgICAgdGJfY29weV94cG0sCisgICAgdGJfcGFzdGVfeHBtLAorICAgIHRiX3ByaW50X3hwbSwKKyAgICB0Yl9oZWxwX3hwbSwKKyAgICB0Yl9maW5kX3hwbSwKKyAgICB0Yl9zYXZlX2FsbF94cG0sCisgICAgdGJfc2F2ZV9zZXNzaW9uX3hwbSwKKyAgICB0Yl9uZXdfc2Vzc2lvbl94cG0sCisgICAgdGJfbG9hZF9zZXNzaW9uX3hwbSwKKyAgICB0Yl9tYWNyb194cG0sCisgICAgdGJfcmVwbGFjZV94cG0sCisgICAgdGJfY2xvc2VfeHBtLAorICAgIHRiX21heGltaXplX3hwbSwKKyAgICB0Yl9taW5pbWl6ZV94cG0sCisgICAgdGJfc3BsaXRfeHBtLAorICAgIHRiX3NoZWxsX3hwbSwKKyAgICB0Yl9maW5kX3ByZXZfeHBtLAorICAgIHRiX2ZpbmRfbmV4dF94cG0sCisgICAgdGJfZmluZF9oZWxwX3hwbSwKKyAgICB0Yl9tYWtlX3hwbSwKKyAgICB0Yl9qdW1wX3hwbSwKKyAgICB0Yl9jdGFnc194cG0sCisgICAgdGJfdnNwbGl0X3hwbSwKKyAgICB0Yl9tYXh3aWR0aF94cG0sCisgICAgdGJfbWlud2lkdGhfeHBtLAorICAgIHRiX2V4aXRfeHBtCit9OworCisvKgorICogY3JlYXRlcyBhIGJsYW5rIHBpeG1hcCB1c2luZyB0Yl9ibGFuaworICovCisgICAgc3RhdGljIHZvaWQKK3BpeG1hcF9jcmVhdGVfZnJvbV94cG0oY2hhciAqKnhwbSwgR2RrUGl4bWFwICoqcGl4bWFwLCBHZGtCaXRtYXAgKiptYXNrKQoreworICAgICpwaXhtYXAgPSBnZGtfcGl4bWFwX2NvbG9ybWFwX2NyZWF0ZV9mcm9tX3hwbV9kKAorCSAgICBOVUxMLAorCSAgICBndGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndWkubWFpbndpbiksCisJICAgIG1hc2ssCisJICAgIE5VTEwsCisJICAgIHhwbSk7Cit9CisKKy8qCisgKiBjcmVhdGVzIGEgcGl4bWFwIGJ5IHVzaW5nIGEgYnVpbHQtaW4gbnVtYmVyCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcGl4bWFwX2NyZWF0ZV9ieV9udW0oaW50IHBpeG1hcF9udW0sIEdka1BpeG1hcCAqKnBpeG1hcCwgR2RrQml0bWFwICoqbWFzaykKK3sKKyAgICBpZiAocGl4bWFwX251bSA+PSAwICYmIHBpeG1hcF9udW0gPCAoc2l6ZW9mKGJ1aWx0X2luX3BpeG1hcHMpCisJCQkJCSAgICAvIHNpemVvZihidWlsdF9pbl9waXhtYXBzWzBdKSkpCisJcGl4bWFwX2NyZWF0ZV9mcm9tX3hwbShidWlsdF9pbl9waXhtYXBzW3BpeG1hcF9udW1dLCBwaXhtYXAsIG1hc2spOworfQorCisvKgorICogQ3JlYXRlcyBhIHBpeG1hcCBieSB1c2luZyB0aGUgcGl4bWFwICJuYW1lIiBmb3VuZCBpbiAncnVudGltZXBhdGgnL2JpdG1hcHMvCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcGl4bWFwX2NyZWF0ZV9ieV9kaXIoY2hhcl91ICpuYW1lLCBHZGtQaXhtYXAgKipwaXhtYXAsIEdka0JpdG1hcCAqKm1hc2spCit7CisgICAgY2hhcl91IGZ1bGxfcGF0aG5hbWVbTUFYUEFUSEwgKyAxXTsKKworICAgIGlmIChndWlfZmluZF9iaXRtYXAobmFtZSwgZnVsbF9wYXRobmFtZSwgInhwbSIpID09IE9LKQorCSpwaXhtYXAgPSBnZGtfcGl4bWFwX2NvbG9ybWFwX2NyZWF0ZV9mcm9tX3hwbSgKKwkJTlVMTCwKKwkJZ3RrX3dpZGdldF9nZXRfY29sb3JtYXAoZ3VpLm1haW53aW4pLAorCQltYXNrLAorCQkmZ3VpLm1haW53aW4tPnN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXSwKKwkJKGNvbnN0IGNoYXIgKilmdWxsX3BhdGhuYW1lKTsKK30KKworLyoKKyAqIENyZWF0ZXMgYSBwaXhtYXAgYnkgdXNpbmcgdGhlIHBpeG1hcCAiZm5hbWUiLgorICovCisgICAgc3RhdGljIHZvaWQKK3BpeG1hcF9jcmVhdGVfZnJvbV9maWxlKGNoYXJfdSAqZm5hbWUsIEdka1BpeG1hcCAqKnBpeG1hcCwgR2RrQml0bWFwICoqbWFzaykKK3sKKyAgICAqcGl4bWFwID0gZ2RrX3BpeG1hcF9jb2xvcm1hcF9jcmVhdGVfZnJvbV94cG0oCisJCU5VTEwsCisJCWd0a193aWRnZXRfZ2V0X2NvbG9ybWFwKGd1aS5tYWlud2luKSwKKwkJbWFzaywKKwkJJmd1aS5tYWlud2luLT5zdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCShjb25zdCBjaGFyICopZm5hbWUpOworfQorCisjIGVuZGlmIC8qIEZFQVRfVE9PTEJBUiAmJiAhSEFWRV9HVEsyICovCisKKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51X2l0ZW0odmltbWVudV9UICptZW51LCBpbnQgaWR4KQoreworICAgIHZpbW1lbnVfVCAqcGFyZW50OworCisgICAgcGFyZW50ID0gbWVudS0+cGFyZW50OworCisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIGlmIChtZW51X2lzX3Rvb2xiYXIocGFyZW50LT5uYW1lKSkKKyAgICB7CisJR3RrVG9vbGJhciAqdG9vbGJhcjsKKworCXRvb2xiYXIgPSBHVEtfVE9PTEJBUihndWkudG9vbGJhcik7CisJbWVudS0+c3VibWVudV9pZCA9IE5VTEw7CisKKwlpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkpCisJeworCSAgICBndGtfdG9vbGJhcl9pbnNlcnRfc3BhY2UodG9vbGJhciwgaWR4KTsKKwkgICAgbWVudS0+aWQgPSBOVUxMOworCX0KKwllbHNlCisJeworIyAgaWZkZWYgSEFWRV9HVEsyCisJICAgIGNoYXJfdSAqdGV4dDsKKwkgICAgY2hhcl91ICp0b29sdGlwOworCisJICAgIHRleHQgICAgPSBDT05WRVJUX1RPX1VURjgobWVudS0+ZG5hbWUpOworCSAgICB0b29sdGlwID0gQ09OVkVSVF9UT19VVEY4KG1lbnUtPnN0cmluZ3NbTUVOVV9JTkRFWF9USVBdKTsKKworCSAgICBtZW51LT5pZCA9IGd0a190b29sYmFyX2luc2VydF9pdGVtKAorCQkgICAgdG9vbGJhciwKKwkJICAgIChjb25zdCBjaGFyICopdGV4dCwKKwkJICAgIChjb25zdCBjaGFyICopdG9vbHRpcCwKKwkJICAgIE5VTEwsCisJCSAgICBjcmVhdGVfbWVudV9pY29uKG1lbnUsIGd0a190b29sYmFyX2dldF9pY29uX3NpemUodG9vbGJhcikpLAorCQkgICAgR19DQUxMQkFDSygmbWVudV9pdGVtX2FjdGl2YXRlKSwKKwkJICAgIG1lbnUsCisJCSAgICBpZHgpOworCisJICAgIENPTlZFUlRfVE9fVVRGOF9GUkVFKHRleHQpOworCSAgICBDT05WRVJUX1RPX1VURjhfRlJFRSh0b29sdGlwKTsKKworIyAgZWxzZSAvKiAhSEFWRV9HVEsyICovCisKKwkgICAgR2RrUGl4bWFwICpwaXhtYXAgPSBOVUxMOworCSAgICBHZGtCaXRtYXAgKm1hc2sgPSBOVUxMOworCisJICAgIC8qIEZpcnN0IHRyeSB1c2VyIHNwZWNpZmllZCBiaXRtYXAsIHRoZW4gYnVpbHRpbiwgdGhlIGEgYmxhbmsuICovCisJICAgIGlmIChtZW51LT5pY29uZmlsZSAhPSBOVUxMKQorCSAgICB7CisJCWNoYXJfdSBidWZbTUFYUEFUSEwgKyAxXTsKKworCQlndWlfZmluZF9pY29uZmlsZShtZW51LT5pY29uZmlsZSwgYnVmLCAieHBtIik7CisJCXBpeG1hcF9jcmVhdGVfZnJvbV9maWxlKGJ1ZiwgJnBpeG1hcCwgJm1hc2spOworCSAgICB9CisJICAgIGlmIChwaXhtYXAgPT0gTlVMTCAmJiAhbWVudS0+aWNvbl9idWlsdGluKQorCQlwaXhtYXBfY3JlYXRlX2J5X2RpcihtZW51LT5uYW1lLCAmcGl4bWFwLCAmbWFzayk7CisJICAgIGlmIChwaXhtYXAgPT0gTlVMTCAmJiBtZW51LT5pY29uaWR4ID49IDApCisJCXBpeG1hcF9jcmVhdGVfYnlfbnVtKG1lbnUtPmljb25pZHgsICZwaXhtYXAsICZtYXNrKTsKKwkgICAgaWYgKHBpeG1hcCA9PSBOVUxMKQorCQlwaXhtYXBfY3JlYXRlX2Zyb21feHBtKHRiX2JsYW5rX3hwbSwgJnBpeG1hcCwgJm1hc2spOworCSAgICBpZiAocGl4bWFwID09IE5VTEwpCisJCXJldHVybjsgLyogc2hvdWxkIGF0IGxlYXN0IGhhdmUgYmxhbmsgcGl4bWFwLCBidXQgaWYgbm90Li4uICovCisKKwkgICAgbWVudS0+aWQgPSBndGtfdG9vbGJhcl9pbnNlcnRfaXRlbSgKKwkJCQkgICAgdG9vbGJhciwKKwkJCQkgICAgKGNoYXIgKikobWVudS0+ZG5hbWUpLAorCQkJCSAgICAoY2hhciAqKShtZW51LT5zdHJpbmdzW01FTlVfSU5ERVhfVElQXSksCisJCQkJICAgIChjaGFyICopKG1lbnUtPmRuYW1lKSwKKwkJCQkgICAgZ3RrX3BpeG1hcF9uZXcocGl4bWFwLCBtYXNrKSwKKwkJCQkgICAgR1RLX1NJR05BTF9GVU5DKG1lbnVfaXRlbV9hY3RpdmF0ZSksCisJCQkJICAgIChncG9pbnRlciltZW51LAorCQkJCSAgICBpZHgpOworIyAgZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCX0KKyAgICB9CisgICAgZWxzZQorIyBlbmRpZiAvKiBGRUFUX1RPT0xCQVIgKi8KKyAgICB7CisJLyogTm8gcGFyZW50LCBtdXN0IGJlIGEgbm9uLW1lbnViYXIgbWVudSAqLworCWlmIChwYXJlbnQtPnN1Ym1lbnVfaWQgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJLyogTWFrZSBwbGFjZSBmb3IgdGhlIHBvc3NpYmxlIHRlYXJvZmYgaGFuZGxlIGl0ZW0uICBOb3QgaW4gdGhlIHBvcHVwCisJICogbWVudSwgaXQgZG9lc24ndCBoYXZlIGEgdGVhcm9mZiBpdGVtLiAqLworCWlmIChwYXJlbnQgIT0gTlVMTCAmJiAhbWVudV9pc19wb3B1cChwYXJlbnQtPm5hbWUpKQorCSAgICArK2lkeDsKKworCWlmIChtZW51X2lzX3NlcGFyYXRvcihtZW51LT5uYW1lKSkKKwl7CisJICAgIC8qIFNlcGFyYXRvcjogSnVzdCBhZGQgaXQgKi8KKwkgICAgbWVudS0+aWQgPSBndGtfbWVudV9pdGVtX25ldygpOworCSAgICBndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUobWVudS0+aWQsIEZBTFNFKTsKKwkgICAgZ3RrX3dpZGdldF9zaG93KG1lbnUtPmlkKTsKKwkgICAgZ3RrX21lbnVfaW5zZXJ0KEdUS19NRU5VKHBhcmVudC0+c3VibWVudV9pZCksIG1lbnUtPmlkLCBpZHgpOworCisJICAgIHJldHVybjsKKwl9CisKKwkvKiBBZGQgdGV4dHVhbCBtZW51IGl0ZW0uICovCisJbWVudV9pdGVtX25ldyhtZW51LCBwYXJlbnQtPnN1Ym1lbnVfaWQpOworCWd0a193aWRnZXRfc2hvdyhtZW51LT5pZCk7CisJZ3RrX21lbnVfaW5zZXJ0KEdUS19NRU5VKHBhcmVudC0+c3VibWVudV9pZCksIG1lbnUtPmlkLCBpZHgpOworCisJaWYgKG1lbnUtPmlkICE9IE5VTEwpCisJICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKG1lbnUtPmlkKSwgImFjdGl2YXRlIiwKKwkJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMobWVudV9pdGVtX2FjdGl2YXRlKSwgbWVudSk7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfTUVOVSAqLworCisKKyAgICB2b2lkCitndWlfbWNoX3NldF90ZXh0X2FyZWFfcG9zKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGd0a19mb3JtX21vdmVfcmVzaXplKEdUS19GT1JNKGd1aS5mb3Jtd2luKSwgZ3VpLmRyYXdhcmVhLCB4LCB5LCB3LCBoKTsKK30KKworCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRW5hYmxlIG9yIGRpc2FibGUgYWNjZWxhdG9ycyBmb3IgdGhlIHRvcGxldmVsIG1lbnVzLgorICovCisgICAgdm9pZAorZ3VpX2d0a19zZXRfbW5lbW9uaWNzKGludCBlbmFibGUpCit7CisgICAgdmltbWVudV9UCSptZW51OworICAgIGNoYXJfdQkqbmFtZTsKKyMgaWYgIWRlZmluZWQoSEFWRV9HVEsyKSAmJiBkZWZpbmVkKEdUS19VU0VfQUNDRUwpCisgICAgZ3VpbnQJYWNjZWxfa2V5OworIyBlbmRpZgorCisgICAgZm9yIChtZW51ID0gcm9vdF9tZW51OyBtZW51ICE9IE5VTEw7IG1lbnUgPSBtZW51LT5uZXh0KQorICAgIHsKKwlpZiAobWVudS0+aWQgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKyMgaWYgZGVmaW5lZChIQVZFX0dUSzIpCisJbmFtZSA9IHRyYW5zbGF0ZV9tbmVtb25pY190YWcobWVudS0+bmFtZSwgZW5hYmxlKTsKKwlndGtfbGFiZWxfc2V0X3RleHRfd2l0aF9tbmVtb25pYyhHVEtfTEFCRUwobWVudS0+bGFiZWwpLAorCQkJCQkgKGNvbnN0IGNoYXIgKiluYW1lKTsKKwl2aW1fZnJlZShuYW1lKTsKKyMgZWxpZiBkZWZpbmVkKEdUS19VU0VfQUNDRUwpCisJbmFtZSA9IHRyYW5zbGF0ZV9tbmVtb25pY190YWcobWVudS0+bmFtZSwgVFJVRSk7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwl7CisJICAgIGFjY2VsX2tleSA9IGd0a19sYWJlbF9wYXJzZV91bGluZShHVEtfTEFCRUwobWVudS0+bGFiZWwpLAorCQkJCQkgICAgICAoY29uc3QgY2hhciAqKW5hbWUpOworCSAgICBpZiAoYWNjZWxfa2V5ICE9IEdES19Wb2lkU3ltYm9sKQorCQlndGtfd2lkZ2V0X3JlbW92ZV9hY2NlbGVyYXRvcihtZW51LT5pZCwgZ3VpLmFjY2VsX2dyb3VwLAorCQkJCQkgICAgICBhY2NlbF9rZXksIEdES19NT0QxX01BU0spOworCSAgICBpZiAoZW5hYmxlICYmIGFjY2VsX2tleSAhPSBHREtfVm9pZFN5bWJvbCkKKwkJZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3IobWVudS0+aWQsICJhY3RpdmF0ZV9pdGVtIiwKKwkJCQkJICAgZ3VpLmFjY2VsX2dyb3VwLAorCQkJCQkgICBhY2NlbF9rZXksIEdES19NT0QxX01BU0ssCisJCQkJCSAgIChHdGtBY2NlbEZsYWdzKTApOworCSAgICB2aW1fZnJlZShuYW1lKTsKKwl9CisJaWYgKCFlbmFibGUpCisJeworCSAgICBuYW1lID0gdHJhbnNsYXRlX21uZW1vbmljX3RhZyhtZW51LT5uYW1lLCBGQUxTRSk7CisJICAgIGd0a19sYWJlbF9wYXJzZV91bGluZShHVEtfTEFCRUwobWVudS0+bGFiZWwpLCAoY29uc3QgY2hhciAqKW5hbWUpOworCSAgICB2aW1fZnJlZShuYW1lKTsKKwl9CisjIGVuZGlmCisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3JlY3Vyc2VfdGVhcm9mZnModmltbWVudV9UICptZW51LCBpbnQgdmFsKQoreworICAgIGZvciAoOyBtZW51ICE9IE5VTEw7IG1lbnUgPSBtZW51LT5uZXh0KQorICAgIHsKKwlpZiAobWVudS0+c3VibWVudV9pZCAhPSBOVUxMICYmIG1lbnUtPnRlYXJvZmZfaGFuZGxlICE9IE5VTEwKKwkJJiYgbWVudS0+bmFtZVswXSAhPSAnXScgJiYgIW1lbnVfaXNfcG9wdXAobWVudS0+bmFtZSkpCisJeworCSAgICBpZiAodmFsKQorCQlndGtfd2lkZ2V0X3Nob3cobWVudS0+dGVhcm9mZl9oYW5kbGUpOworCSAgICBlbHNlCisJCWd0a193aWRnZXRfaGlkZShtZW51LT50ZWFyb2ZmX2hhbmRsZSk7CisJfQorCXJlY3Vyc2VfdGVhcm9mZnMobWVudS0+Y2hpbGRyZW4sIHZhbCk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMoaW50IGVuYWJsZSkKK3sKKyAgICByZWN1cnNlX3RlYXJvZmZzKHJvb3RfbWVudSwgZW5hYmxlKTsKK30KKyNlbmRpZiAvKiBGRUFUX01FTlUgKi8KKworCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEhBVkVfR1RLMikKKy8qCisgKiBTZWVtcyBsaWtlIHRoZXJlJ3MgYSBob2xlIGluIHRoZSBHVEsgVG9vbGJhciBBUEk6IHRoZXJlJ3Mgbm8gcHJvdmlzaW9uIGZvcgorICogcmVtb3ZpbmcgYW4gaXRlbSBmcm9tIHRoZSB0b29sYmFyLiAgVGhlcmVmb3JlIEkgbmVlZCB0byByZXNvcnQgdG8gZ29pbmcKKyAqIHJlYWxseSBkZWVwbHkgaW50byB0aGUgaW50ZXJuYWwgd2lkZ2V0IHN0cnVjdHVyZXMuCisgKgorICogPGRhbmllbGs+IEknbSBub3Qgc3VyZSB0aGUgc3RhdGVtZW50IGFib3ZlIGlzIHRydWUgLS0gYXQgbGVhc3Qgd2l0aAorICogR1RLKyAyIG9uZSBjYW4ganVzdCBjYWxsIGd0a193aWRnZXRfZGVzdHJveSgpIGFuZCBiZSBkb25lIHdpdGggaXQuCisgKiBJdCBpcyB0cnVlIHRob3VnaCB0aGF0IHlvdSBjb3VsZG4ndCByZW1vdmUgc3BhY2UgaXRlbXMgYmVmb3JlIEdUSysgMgorICogKHdpdGhvdXQgZGlnZ2luZyBpbnRvIHRoZSBpbnRlcm5hbHMgdGhhdCBpcykuICBCdXQgdGhlIGNvZGUgYmVsb3cKKyAqIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgdGhvc2UgZWl0aGVyLiAgV2VsbCwgaXQncyBvYnNvbGV0ZSBhbnl3YXkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordG9vbGJhcl9yZW1vdmVfaXRlbV9ieV90ZXh0KEd0a1Rvb2xiYXIgKnRiLCBjb25zdCBjaGFyICp0ZXh0KQoreworICAgIEd0a0NvbnRhaW5lciAqY29udGFpbmVyOworICAgIEdMaXN0ICpjaGlsZGw7CisgICAgR3RrVG9vbGJhckNoaWxkICpndGJjOworCisgICAgZ19yZXR1cm5faWZfZmFpbCh0YiAhPSBOVUxMKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19UT09MQkFSKHRiKSk7CisgICAgY29udGFpbmVyID0gR1RLX0NPTlRBSU5FUigmdGItPmNvbnRhaW5lcik7CisKKyAgICBmb3IgKGNoaWxkbCA9IHRiLT5jaGlsZHJlbjsgY2hpbGRsOyBjaGlsZGwgPSBjaGlsZGwtPm5leHQpCisgICAgeworCWd0YmMgPSAoR3RrVG9vbGJhckNoaWxkICopY2hpbGRsLT5kYXRhOworCisJaWYgKGd0YmMtPnR5cGUgIT0gR1RLX1RPT0xCQVJfQ0hJTERfU1BBQ0UKKwkJJiYgc3RyY21wKEdUS19MQUJFTChndGJjLT5sYWJlbCktPmxhYmVsLCB0ZXh0KSA9PSAwKQorCXsKKwkgICAgZ2Jvb2xlYW4gd2FzX3Zpc2libGU7CisKKwkgICAgd2FzX3Zpc2libGUgPSBHVEtfV0lER0VUX1ZJU0lCTEUoZ3RiYy0+d2lkZ2V0KTsKKwkgICAgZ3RrX3dpZGdldF91bnBhcmVudChndGJjLT53aWRnZXQpOworCisJICAgIHRiLT5jaGlsZHJlbiA9IGdfbGlzdF9yZW1vdmVfbGluayh0Yi0+Y2hpbGRyZW4sIGNoaWxkbCk7CisJICAgIGdfZnJlZShndGJjKTsKKwkgICAgZ19saXN0X2ZyZWUoY2hpbGRsKTsKKwkgICAgdGItPm51bV9jaGlsZHJlbi0tOworCisJICAgIGlmICh3YXNfdmlzaWJsZSAmJiBHVEtfV0lER0VUX1ZJU0lCTEUoY29udGFpbmVyKSkKKwkJZ3RrX3dpZGdldF9xdWV1ZV9yZXNpemUoR1RLX1dJREdFVChjb250YWluZXIpKTsKKworCSAgICBicmVhazsKKwl9CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfVE9PTEJBUiAmJiAhSEFWRV9HVEsyICovCisKKworI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICBzdGF0aWMgaW50CitnZXRfbWVudV9wb3NpdGlvbih2aW1tZW51X1QgKm1lbnUpCit7CisgICAgdmltbWVudV9UCSpub2RlOworICAgIGludAkJaW5kZXggPSAwOworCisgICAgZm9yIChub2RlID0gbWVudS0+cGFyZW50LT5jaGlsZHJlbjsgbm9kZSAhPSBtZW51OyBub2RlID0gbm9kZS0+bmV4dCkKKyAgICB7CisJZ19yZXR1cm5fdmFsX2lmX2ZhaWwobm9kZSAhPSBOVUxMLCAtMSk7CisJKytpbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisjZW5kaWYgLyogRkVBVF9UT09MQkFSICYmIEhBVkVfR1RLMiAqLworCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX21lbnVfc2V0X3RpcCh2aW1tZW51X1QgKm1lbnUpCit7CisgICAgaWYgKG1lbnUtPmlkICE9IE5VTEwgJiYgbWVudS0+cGFyZW50ICE9IE5VTEwKKwkgICAgJiYgZ3VpLnRvb2xiYXIgIT0gTlVMTCAmJiBtZW51X2lzX3Rvb2xiYXIobWVudS0+cGFyZW50LT5uYW1lKSkKKyAgICB7CisJY2hhcl91ICp0b29sdGlwOworCisjIGlmZGVmIEhBVkVfR1RLMgorCXRvb2x0aXAgPSBDT05WRVJUX1RPX1VURjgobWVudS0+c3RyaW5nc1tNRU5VX0lOREVYX1RJUF0pOworIyBlbHNlCisJdG9vbHRpcCA9IG1lbnUtPnN0cmluZ3NbTUVOVV9JTkRFWF9USVBdOworIyBlbmRpZgorCWd0a190b29sdGlwc19zZXRfdGlwKEdUS19UT09MQkFSKGd1aS50b29sYmFyKS0+dG9vbHRpcHMsCisJCQkgICAgIG1lbnUtPmlkLCAoY29uc3QgY2hhciAqKXRvb2x0aXAsIE5VTEwpOworIyBpZmRlZiBIQVZFX0dUSzIKKwlDT05WRVJUX1RPX1VURjhfRlJFRSh0b29sdGlwKTsKKyMgZW5kaWYKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9UT09MQkFSICovCisKKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfbWVudSh2aW1tZW51X1QgKm1lbnUpCit7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIGlmIChtZW51LT5wYXJlbnQgIT0gTlVMTCAmJiBtZW51X2lzX3Rvb2xiYXIobWVudS0+cGFyZW50LT5uYW1lKSkKKyAgICB7CisjICBpZmRlZiBIQVZFX0dUSzIKKwlpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkpCisJICAgIGd0a190b29sYmFyX3JlbW92ZV9zcGFjZShHVEtfVE9PTEJBUihndWkudG9vbGJhciksCisJCQkJICAgICBnZXRfbWVudV9wb3NpdGlvbihtZW51KSk7CisJZWxzZSBpZiAobWVudS0+aWQgIT0gTlVMTCkKKwkgICAgZ3RrX3dpZGdldF9kZXN0cm95KG1lbnUtPmlkKTsKKyMgIGVsc2UKKwl0b29sYmFyX3JlbW92ZV9pdGVtX2J5X3RleHQoR1RLX1RPT0xCQVIoZ3VpLnRvb2xiYXIpLAorCQkJCSAgICAoY29uc3QgY2hhciAqKW1lbnUtPmRuYW1lKTsKKyMgIGVuZGlmCisgICAgfQorICAgIGVsc2UKKyMgZW5kaWYgLyogRkVBVF9UT09MQkFSICovCisgICAgeworCWlmIChtZW51LT5zdWJtZW51X2lkICE9IE5VTEwpCisJICAgIGd0a193aWRnZXRfZGVzdHJveShtZW51LT5zdWJtZW51X2lkKTsKKworCWlmIChtZW51LT5pZCAhPSBOVUxMKQorCSAgICBndGtfd2lkZ2V0X2Rlc3Ryb3kobWVudS0+aWQpOworICAgIH0KKworICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBOVUxMOworICAgIG1lbnUtPmlkID0gTlVMTDsKK30KKyNlbmRpZiAvKiBGRUFUX01FTlUgKi8KKworCisvKgorICogU2Nyb2xsYmFyIHN0dWZmLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpCit7CisgICAgaWYgKHNiLT5pZCAhPSBOVUxMKQorICAgIHsKKwlHdGtBZGp1c3RtZW50ICphZGp1c3RtZW50OworCisJYWRqdXN0bWVudCA9IGd0a19yYW5nZV9nZXRfYWRqdXN0bWVudChHVEtfUkFOR0Uoc2ItPmlkKSk7CisKKwlhZGp1c3RtZW50LT5sb3dlciA9IDAuMDsKKwlhZGp1c3RtZW50LT52YWx1ZSA9IHZhbDsKKwlhZGp1c3RtZW50LT51cHBlciA9IG1heCArIDE7CisJYWRqdXN0bWVudC0+cGFnZV9zaXplID0gc2l6ZTsKKwlhZGp1c3RtZW50LT5wYWdlX2luY3JlbWVudCA9IHNpemUgPCAzTCA/IDFMIDogc2l6ZSAtIDJMOworCWFkanVzdG1lbnQtPnN0ZXBfaW5jcmVtZW50ID0gMS4wOworCisjaWZkZWYgSEFWRV9HVEsyCisJZ19zaWduYWxfaGFuZGxlcl9ibG9jayhHVEtfT0JKRUNUKGFkanVzdG1lbnQpLAorCQkJCQkJICAgICAgKGd1bG9uZylzYi0+aGFuZGxlcl9pZCk7CisjZWxzZQorCWd0a19zaWduYWxfaGFuZGxlcl9ibG9jayhHVEtfT0JKRUNUKGFkanVzdG1lbnQpLAorCQkJCQkJICAgICAgIChndWludClzYi0+aGFuZGxlcl9pZCk7CisjZW5kaWYKKwlndGtfYWRqdXN0bWVudF9jaGFuZ2VkKGFkanVzdG1lbnQpOworI2lmZGVmIEhBVkVfR1RLMgorCWdfc2lnbmFsX2hhbmRsZXJfdW5ibG9jayhHVEtfT0JKRUNUKGFkanVzdG1lbnQpLAorCQkJCQkJICAgICAgKGd1bG9uZylzYi0+aGFuZGxlcl9pZCk7CisjZWxzZQorCWd0a19zaWduYWxfaGFuZGxlcl91bmJsb2NrKEdUS19PQkpFQ1QoYWRqdXN0bWVudCksCisJCQkJCQkgICAgICAgKGd1aW50KXNiLT5oYW5kbGVyX2lkKTsKKyNlbmRpZgorICAgIH0KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3Moc2Nyb2xsYmFyX1QgKnNiLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBpZiAoc2ItPmlkICE9IE5VTEwpCisJZ3RrX2Zvcm1fbW92ZV9yZXNpemUoR1RLX0ZPUk0oZ3VpLmZvcm13aW4pLCBzYi0+aWQsIHgsIHksIHcsIGgpOworfQorCisvKgorICogVGFrZSBhY3Rpb24gdXBvbiBzY3JvbGxiYXIgZHJhZ2dpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYWRqdXN0bWVudF92YWx1ZV9jaGFuZ2VkKEd0a0FkanVzdG1lbnQgKmFkanVzdG1lbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgc2Nyb2xsYmFyX1QJKnNiOworICAgIGxvbmcJdmFsdWU7CisgICAgaW50CQlkcmFnZ2luZyA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9YSU0KKyAgICAvKiBjYW5jZWwgYW55IHByZWVkaXRpbmcgKi8KKyAgICBpZiAoaW1faXNfcHJlZWRpdGluZygpKQorCXhpbV9yZXNldCgpOworI2VuZGlmCisKKyAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZylkYXRhKTsKKyAgICB2YWx1ZSA9IChsb25nKWFkanVzdG1lbnQtPnZhbHVlOworICAgIC8qCisgICAgICogVGhlIGRyYWdnaW5nIGFyZ3VtZW50IG11c3QgYmUgcmlnaHQgZm9yIHRoZSBzY3JvbGxiYXIgdG8gd29yayB3aXRoCisgICAgICogY2xvc2VkIGZvbGRzLiAgVGhpcyBpc24ndCBkb2N1bWVudGVkLCBob3BlZnVsbHkgdGhpcyB3aWxsIGtlZXAgb24KKyAgICAgKiB3b3JraW5nIGluIGxhdGVyIEdUSyB2ZXJzaW9ucy4KKyAgICAgKgorICAgICAqIEZJWE1FOiBXZWxsLCBpdCBkb2Vzbid0IHdvcmsgaW4gR1RLMi4gOikKKyAgICAgKiBIQUNLOiBHZXQgdGhlIG1vdXNlIHBvaW50ZXIgcG9zaXRpb24sIGlmIGl0IGFwcGVhcnMgdG8gYmUgb24gYW4gYXJyb3cKKyAgICAgKiBidXR0b24gc2V0ICJkcmFnZ2luZyIgdG8gRkFMU0UuICBUaGlzIGFzc3VtZXMgc3F1YXJlIGJ1dHRvbnMhCisgICAgICovCisgICAgaWYgKHNiICE9IE5VTEwpCisgICAgeworI2lmZGVmIEhBVkVfR1RLMgorCWRyYWdnaW5nID0gVFJVRTsKKworCWlmIChzYi0+d3AgIT0gTlVMTCkKKwl7CisJICAgIGludAkJCXg7CisJICAgIGludAkJCXk7CisJICAgIEdka01vZGlmaWVyVHlwZQlzdGF0ZTsKKwkgICAgaW50CQkJd2lkdGg7CisJICAgIGludAkJCWhlaWdodDsKKworCSAgICAvKiB2ZXJ0aWNhbCBzY3JvbGxiYXI6IG5lZWQgdG8gc2V0ICJkcmFnZ2luZyIgcHJvcGVybHkgaW4gY2FzZQorCSAgICAgKiB0aGVyZSBhcmUgY2xvc2VkIGZvbGRzLiAqLworCSAgICBnZGtfd2luZG93X2dldF9wb2ludGVyKHNiLT5pZC0+d2luZG93LCAmeCwgJnksICZzdGF0ZSk7CisJICAgIGdka193aW5kb3dfZ2V0X3NpemUoc2ItPmlkLT53aW5kb3csICZ3aWR0aCwgJmhlaWdodCk7CisJICAgIGlmICh4ID49IDAgJiYgeCA8IHdpZHRoICYmIHkgPj0gMCAmJiB5IDwgaGVpZ2h0KQorCSAgICB7CisJCWlmICh5IDwgd2lkdGgpCisJCXsKKwkJICAgIC8qIHVwIGFycm93OiBtb3ZlIG9uZSAoY2xvc2VkIGZvbGQpIGxpbmUgdXAgKi8KKwkJICAgIGRyYWdnaW5nID0gRkFMU0U7CisJCSAgICB2YWx1ZSA9IHNiLT53cC0+d190b3BsaW5lIC0gMjsKKwkJfQorCQllbHNlIGlmICh5ID4gaGVpZ2h0IC0gd2lkdGgpCisJCXsKKwkJICAgIC8qIGRvd24gYXJyb3c6IG1vdmUgb25lIChjbG9zZWQgZm9sZCkgbGluZSBkb3duICovCisJCSAgICBkcmFnZ2luZyA9IEZBTFNFOworCQkgICAgdmFsdWUgPSBzYi0+d3AtPndfdG9wbGluZTsKKwkJfQorCSAgICB9CisJfQorI2Vsc2UKKwlkcmFnZ2luZyA9IChHVEtfUkFOR0Uoc2ItPmlkKS0+c2Nyb2xsX3R5cGUgPT0gR1RLX1NDUk9MTF9OT05FKTsKKyNlbmRpZgorICAgIH0KKworICAgIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIGRyYWdnaW5nKTsKKworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKy8qIFNCQVJfVkVSVCBvciBTQkFSX0hPUklaICovCisgICAgdm9pZAorZ3VpX21jaF9jcmVhdGVfc2Nyb2xsYmFyKHNjcm9sbGJhcl9UICpzYiwgaW50IG9yaWVudCkKK3sKKyAgICBpZiAob3JpZW50ID09IFNCQVJfSE9SSVopCisJc2ItPmlkID0gZ3RrX2hzY3JvbGxiYXJfbmV3KE5VTEwpOworICAgIGVsc2UgaWYgKG9yaWVudCA9PSBTQkFSX1ZFUlQpCisJc2ItPmlkID0gZ3RrX3ZzY3JvbGxiYXJfbmV3KE5VTEwpOworCisgICAgaWYgKHNiLT5pZCAhPSBOVUxMKQorICAgIHsKKwlHdGtBZGp1c3RtZW50ICphZGp1c3RtZW50OworCisJR1RLX1dJREdFVF9VTlNFVF9GTEFHUyhzYi0+aWQsIEdUS19DQU5fRk9DVVMpOworCWd0a19mb3JtX3B1dChHVEtfRk9STShndWkuZm9ybXdpbiksIHNiLT5pZCwgMCwgMCk7CisKKwlhZGp1c3RtZW50ID0gZ3RrX3JhbmdlX2dldF9hZGp1c3RtZW50KEdUS19SQU5HRShzYi0+aWQpKTsKKworCXNiLT5oYW5kbGVyX2lkID0gZ3RrX3NpZ25hbF9jb25uZWN0KAorCQkJICAgICBHVEtfT0JKRUNUKGFkanVzdG1lbnQpLCAidmFsdWVfY2hhbmdlZCIsCisJCQkgICAgIEdUS19TSUdOQUxfRlVOQyhhZGp1c3RtZW50X3ZhbHVlX2NoYW5nZWQpLAorCQkJICAgICBHSU5UX1RPX1BPSU5URVIoc2ItPmlkZW50KSk7CisJZ3VpX21jaF91cGRhdGUoKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNjcm9sbGJhcl9UICpzYikKK3sKKyAgICBpZiAoc2ItPmlkICE9IE5VTEwpCisgICAgeworCWd0a193aWRnZXRfZGVzdHJveShzYi0+aWQpOworCXNiLT5pZCA9IE5VTEw7CisgICAgfQorICAgIGd1aV9tY2hfdXBkYXRlKCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9CUk9XU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbGUgc2VsZWN0b3IgcmVsYXRlZCBzdHVmZgorICovCisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCiticm93c2Vfb2tfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIGNiZGF0YSkKK3sKKyAgICBndWlfVCAqdncgPSAoZ3VpX1QgKiljYmRhdGE7CisKKyAgICBpZiAodnctPmJyb3dzZV9mbmFtZSAhPSBOVUxMKQorCWdfZnJlZSh2dy0+YnJvd3NlX2ZuYW1lKTsKKworICAgIHZ3LT5icm93c2VfZm5hbWUgPSAoY2hhcl91ICopZ19zdHJkdXAoZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZSgKKwkJCQkJR1RLX0ZJTEVfU0VMRUNUSU9OKHZ3LT5maWxlZGxnKSkpOworICAgIGd0a193aWRnZXRfaGlkZSh2dy0+ZmlsZWRsZyk7CisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2Jyb3dzZV9jYW5jZWxfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIGNiZGF0YSkKK3sKKyAgICBndWlfVCAqdncgPSAoZ3VpX1QgKiljYmRhdGE7CisKKyAgICBpZiAodnctPmJyb3dzZV9mbmFtZSAhPSBOVUxMKQorICAgIHsKKwlnX2ZyZWUodnctPmJyb3dzZV9mbmFtZSk7CisJdnctPmJyb3dzZV9mbmFtZSA9IE5VTEw7CisgICAgfQorICAgIGd0a193aWRnZXRfaGlkZSh2dy0+ZmlsZWRsZyk7CisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGdib29sZWFuCiticm93c2VfZGVzdHJveV9jYihHdGtXaWRnZXQgKiB3aWRnZXQpCit7CisgICAgaWYgKGd1aS5icm93c2VfZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJZ19mcmVlKGd1aS5icm93c2VfZm5hbWUpOworCWd1aS5icm93c2VfZm5hbWUgPSBOVUxMOworICAgIH0KKyAgICBndWkuZmlsZWRsZyA9IE5VTEw7CisKKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUHV0IHVwIGEgZmlsZSByZXF1ZXN0ZXIuCisgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBuYW1lIGluIGFsbG9jYXRlZCBtZW1vcnksIG9yIE5VTEwgZm9yIENhbmNlbC4KKyAqIHNhdmluZywJCQlzZWxlY3QgZmlsZSB0byB3cml0ZQorICogdGl0bGUJCQl0aXRsZSBmb3IgdGhlIHdpbmRvdworICogZGZsdAkJCQlkZWZhdWx0IG5hbWUKKyAqIGV4dAkJCQlub3QgdXNlZCAoZXh0ZW5zaW9uIGFkZGVkKQorICogaW5pdGRpcgkJCWluaXRpYWwgZGlyZWN0b3J5LCBOVUxMIGZvciBjdXJyZW50IGRpcgorICogZmlsdGVyCQkJbm90IHVzZWQgKGZpbGUgbmFtZSBmaWx0ZXIpCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGNoYXJfdSAqCitndWlfbWNoX2Jyb3dzZShpbnQgc2F2aW5nLAorCSAgICAgICBjaGFyX3UgKnRpdGxlLAorCSAgICAgICBjaGFyX3UgKmRmbHQsCisJICAgICAgIGNoYXJfdSAqZXh0LAorCSAgICAgICBjaGFyX3UgKmluaXRkaXIsCisJICAgICAgIGNoYXJfdSAqZmlsdGVyKQoreworICAgIEd0a0ZpbGVTZWxlY3Rpb24gKmZzOwkvKiBzaG9ydGN1dCAqLworICAgIGNoYXJfdSBkaXJidWZbTUFYUEFUSExdOworICAgIGNoYXJfdSAqcDsKKworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICB0aXRsZSA9IENPTlZFUlRfVE9fVVRGOCh0aXRsZSk7CisjIGVuZGlmCisKKyAgICBpZiAoIWd1aS5maWxlZGxnKQorICAgIHsKKwlndWkuZmlsZWRsZyA9IGd0a19maWxlX3NlbGVjdGlvbl9uZXcoKGNvbnN0IGdjaGFyICopdGl0bGUpOworCWd0a193aW5kb3dfc2V0X21vZGFsKEdUS19XSU5ET1coZ3VpLmZpbGVkbGcpLCBUUlVFKTsKKwlndGtfd2luZG93X3NldF90cmFuc2llbnRfZm9yKEdUS19XSU5ET1coZ3VpLmZpbGVkbGcpLAorCQlHVEtfV0lORE9XKGd1aS5tYWlud2luKSk7CisJZnMgPSBHVEtfRklMRV9TRUxFQ1RJT04oZ3VpLmZpbGVkbGcpOworCisJZ3RrX2NvbnRhaW5lcl9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUihmcyksIDQpOworCisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZnMtPm9rX2J1dHRvbiksCisJCSJjbGlja2VkIiwgR1RLX1NJR05BTF9GVU5DKGJyb3dzZV9va19jYiksICZndWkpOworCWd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGZzLT5jYW5jZWxfYnV0dG9uKSwKKwkJImNsaWNrZWQiLCBHVEtfU0lHTkFMX0ZVTkMoYnJvd3NlX2NhbmNlbF9jYiksICZndWkpOworCS8qIGd0a19zaWduYWxfY29ubmVjdCgpIGRvZXNuJ3Qgd29yayBmb3IgZGVzdHJveSwgaXQgY2F1c2VzIGEgaGFuZyAqLworCWd0a19zaWduYWxfY29ubmVjdF9vYmplY3QoR1RLX09CSkVDVChndWkuZmlsZWRsZyksCisJCSJkZXN0cm95IiwgR1RLX1NJR05BTF9GVU5DKGJyb3dzZV9kZXN0cm95X2NiKSwKKwkJR1RLX09CSkVDVChndWkuZmlsZWRsZykpOworICAgIH0KKyAgICBlbHNlCisJZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyhndWkuZmlsZWRsZyksIChjb25zdCBnY2hhciAqKXRpdGxlKTsKKworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICBDT05WRVJUX1RPX1VURjhfRlJFRSh0aXRsZSk7CisjIGVuZGlmCisKKyAgICAvKiBpZiBvdXIgcG9pbnRlciBpcyBjdXJyZW50bHkgaGlkZGVuLCB0aGVuIHdlIHNob3VsZCBzaG93IGl0LiAqLworICAgIGd1aV9tY2hfbW91c2VoaWRlKEZBTFNFKTsKKworICAgIC8qIENvbmNhdGVuYXRlICJpbml0ZGlyIiBhbmQgImRmbHQiLiAqLworICAgIGlmIChpbml0ZGlyID09IE5VTEwgfHwgKmluaXRkaXIgPT0gTlVMKQorCW1jaF9kaXJuYW1lKGRpcmJ1ZiwgTUFYUEFUSEwpOworICAgIGVsc2UgaWYgKFNUUkxFTihpbml0ZGlyKSArIDIgPCBNQVhQQVRITCkKKwlTVFJDUFkoZGlyYnVmLCBpbml0ZGlyKTsKKyAgICBlbHNlCisJZGlyYnVmWzBdID0gTlVMOworICAgIC8qIEFsd2F5cyBuZWVkIGEgdHJhaWxpbmcgc2xhc2ggZm9yIGEgZGlyZWN0b3J5LiAqLworICAgIGFkZF9wYXRoc2VwKGRpcmJ1Zik7CisgICAgaWYgKGRmbHQgIT0gTlVMTCAmJiAqZGZsdCAhPSBOVUwKKwkJCSAgICAgICYmIFNUUkxFTihkaXJidWYpICsgMiArIFNUUkxFTihkZmx0KSA8IE1BWFBBVEhMKQorCVNUUkNBVChkaXJidWYsIGRmbHQpOworCisgICAgZ3RrX2ZpbGVfc2VsZWN0aW9uX3NldF9maWxlbmFtZShHVEtfRklMRV9TRUxFQ1RJT04oZ3VpLmZpbGVkbGcpLAorCQkJCQkJICAgICAgKGNvbnN0IGdjaGFyICopZGlyYnVmKTsKKyMgaWZuZGVmIEhBVkVfR1RLMgorICAgIGd1aV9ndGtfcG9zaXRpb25faW5fcGFyZW50KEdUS19XSURHRVQoZ3VpLm1haW53aW4pLAorCQkJCSAgICAgICBHVEtfV0lER0VUKGd1aS5maWxlZGxnKSwgVldfUE9TX01PVVNFKTsKKyMgZW5kaWYKKworICAgIGd0a193aWRnZXRfc2hvdyhndWkuZmlsZWRsZyk7CisgICAgd2hpbGUgKGd1aS5maWxlZGxnICYmIEdUS19XSURHRVRfRFJBV0FCTEUoZ3VpLmZpbGVkbGcpKQorCWd0a19tYWluX2l0ZXJhdGlvbl9kbyhUUlVFKTsKKworICAgIGlmIChndWkuYnJvd3NlX2ZuYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBzaG9ydGVuIHRoZSBmaWxlIG5hbWUgaWYgcG9zc2libGUgKi8KKyAgICBtY2hfZGlybmFtZShkaXJidWYsIE1BWFBBVEhMKTsKKyAgICBwID0gc2hvcnRlbl9mbmFtZShndWkuYnJvd3NlX2ZuYW1lLCBkaXJidWYpOworICAgIGlmIChwID09IE5VTEwpCisJcCA9IGd1aS5icm93c2VfZm5hbWU7CisgICAgcmV0dXJuIHZpbV9zdHJzYXZlKHApOworfQorCisjZW5kaWYJLyogRkVBVF9CUk9XU0UgKi8KKworI2lmIChkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgJiYgIWRlZmluZWQoSEFWRV9HVEsyKSkgfHwgZGVmaW5lZChQUk9UTykKKworc3RhdGljIGNoYXJfdSAqZGlhbG9nX3RleHRmaWVsZCA9IE5VTEw7CitzdGF0aWMgR3RrV2lkZ2V0ICpkaWFsb2dfdGV4dGVudHJ5OworCisgICAgc3RhdGljIHZvaWQKK2RsZ19kZXN0cm95KEd0a1dpZGdldCAqZGxnKQoreworICAgIGlmIChkaWFsb2dfdGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCWNvbnN0IGNoYXIgKnRleHQ7CisKKwl0ZXh0ID0gZ3RrX2VudHJ5X2dldF90ZXh0KEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSk7CisJU1RSTkNQWShkaWFsb2dfdGV4dGZpZWxkLCB0ZXh0LCBJT1NJWkUpOworCWRpYWxvZ190ZXh0ZmllbGRbSU9TSVpFIC0gMV0gPSBOVUw7CisgICAgfQorCisgICAgLyogRGVzdHJveSB0aGUgZGlhbG9nLCB3aWxsIGJyZWFrIHRoZSB3YWl0aW5nIGxvb3AuICovCisgICAgZ3RrX3dpZGdldF9kZXN0cm95KGRsZyk7Cit9CisKKyMgaWZkZWYgRkVBVF9HVUlfR05PTUUKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAorZ3VpX2dub21lX2RpYWxvZyggaW50CXR5cGUsCisJCWNoYXJfdQkqdGl0bGUsCisJCWNoYXJfdQkqbWVzc2FnZSwKKwkJY2hhcl91CSpidXR0b25zLAorCQlpbnQJZGZsdGJ1dHRvbiwKKwkJY2hhcl91CSp0ZXh0ZmllbGQpCit7CisgICAgR3RrV2lkZ2V0CSpkbGc7CisgICAgY2hhcgkqZ2R0eXBlOworICAgIGNoYXJfdQkqYnV0dG9uc19jb3B5LCAqcCwgKm5leHQ7CisgICAgY2hhcgkqKmJ1dHRvbnNfbGlzdDsKKyAgICBpbnQJCWJ1dGNvdW50LCBjdXI7CisKKyAgICAvKiBtYWtlIGEgY29weSwgc28gdGhhdCB3ZSBjYW4gaW5zZXJ0IE5VTHMgKi8KKyAgICBpZiAoKGJ1dHRvbnNfY29weSA9IHZpbV9zdHJzYXZlKGJ1dHRvbnMpKSA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qIGRldGVybWluZSBleGFjdCBudW1iZXIgb2YgYnV0dG9ucyBhbmQgYWxsb2NhdGUgYXJyYXkgdG8gaG9sZCB0aGVtICovCisgICAgZm9yIChidXRjb3VudCA9IDAsIHAgPSBidXR0b25zOyAqcDsgcCsrKQorICAgIHsKKwlpZiAoKnAgPT0gJ1xuJykKKwkgICAgYnV0Y291bnQrKzsKKyAgICB9CisgICAgYnV0Y291bnQrKzsKKyAgICBidXR0b25zX2xpc3QgPSBnX25ldzAoY2hhciAqLCBidXRjb3VudCArIDEpOworCisgICAgLyogQWRkIHBpeG1hcCAqLworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBWSU1fRVJST1I6CisJZ2R0eXBlID0gR05PTUVfTUVTU0FHRV9CT1hfRVJST1I7CisJYnJlYWs7CisgICAgY2FzZSBWSU1fV0FSTklORzoKKwlnZHR5cGUgPSBHTk9NRV9NRVNTQUdFX0JPWF9XQVJOSU5HOworCWJyZWFrOworICAgIGNhc2UgVklNX0lORk86CisJZ2R0eXBlID0gR05PTUVfTUVTU0FHRV9CT1hfSU5GTzsKKwlicmVhazsKKyAgICBjYXNlIFZJTV9RVUVTVElPTjoKKwlnZHR5cGUgPSBHTk9NRV9NRVNTQUdFX0JPWF9RVUVTVElPTjsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWdkdHlwZSA9IEdOT01FX01FU1NBR0VfQk9YX0dFTkVSSUM7CisgICAgfTsKKworICAgIHAgPSBidXR0b25zX2NvcHk7CisgICAgZm9yIChjdXIgPSAwOyBjdXIgPCBidXRjb3VudDsgKytjdXIpCisgICAgeworCWZvciAobmV4dCA9IHA7ICpuZXh0OyArK25leHQpCisJeworCSAgICBpZiAoKm5leHQgPT0gRExHX0hPVEtFWV9DSEFSKQorCQltY2hfbWVtbW92ZShuZXh0LCBuZXh0ICsgMSwgU1RSTEVOKG5leHQpKTsKKwkgICAgaWYgKCpuZXh0ID09IERMR19CVVRUT05fU0VQKQorCSAgICB7CisJCSpuZXh0KysgPSBOVUw7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJLyogdGhpcyBzaG91bGQgcHJvYmFibHkgZ28gaW50byBhIHRhYmxlLCBidXQgb2ggd2VsbCAqLworCWlmIChnX3N0cmNhc2VjbXAoKGNoYXIgKilwLCAiT2siKSA9PSAwKQorCSAgICBidXR0b25zX2xpc3RbY3VyXSA9IGdfc3RyZHVwKEdOT01FX1NUT0NLX0JVVFRPTl9PSyk7CisJZWxzZSBpZiAoZ19zdHJjYXNlY21wKChjaGFyICopcCwgIkNhbmNlbCIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX0NBTkNFTCk7CisJZWxzZSBpZiAoZ19zdHJjYXNlY21wKChjaGFyICopcCwgIlllcyIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX1lFUyk7CisJZWxzZSBpZiAoZ19zdHJjYXNlY21wKChjaGFyICopcCwgIk5vIikgPT0gMCkKKwkgICAgYnV0dG9uc19saXN0W2N1cl0gPSBnX3N0cmR1cChHTk9NRV9TVE9DS19CVVRUT05fTk8pOworCWVsc2UgaWYgKGdfc3RyY2FzZWNtcCgoY2hhciAqKXAsICJDbG9zZSIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX0NMT1NFKTsKKwllbHNlIGlmIChnX3N0cmNhc2VjbXAoKGNoYXIgKilwLCAiSGVscCIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX0hFTFApOworCWVsc2UgaWYgKGdfc3RyY2FzZWNtcCgoY2hhciAqKXAsICJBcHBseSIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX0FQUExZKTsKKyNpZiAwCisJLyoKKwkgKiB0aGVzZSBhcmVuJ3QgcmVhbGx5IHVzZWQgdGhhdCBvZnRlbiBhbnl3YXksIGJ1dCBhcmUgbGlzdGVkIGhlcmUgYXMKKwkgKiBwbGFjZWhvbGRlcnMgaW4gY2FzZSB3ZSBuZWVkIHRoZW0uCisJICovCisJZWxzZSBpZiAoZ19zdHJjYXNlY21wKChjaGFyICopcCwgIk5leHQiKSA9PSAwKQorCSAgICBidXR0b25zX2xpc3RbY3VyXSA9IGdfc3RyZHVwKEdOT01FX1NUT0NLX0JVVFRPTl9ORVhUKTsKKwllbHNlIGlmIChnX3N0cmNhc2VjbXAoKGNoYXIgKilwLCAiUHJldiIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX1BSRVYpOworCWVsc2UgaWYgKGdfc3RyY2FzZWNtcCgoY2hhciAqKXAsICJVcCIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX1VQKTsKKwllbHNlIGlmIChnX3N0cmNhc2VjbXAoKGNoYXIgKilwLCAiRG93biIpID09IDApCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoR05PTUVfU1RPQ0tfQlVUVE9OX0RPV04pOworCWVsc2UgaWYgKGdfc3RyY2FzZWNtcCgoY2hhciAqKXAsICJGb250IikgPT0gMCkKKwkgICAgYnV0dG9uc19saXN0W2N1cl0gPSBnX3N0cmR1cChHTk9NRV9TVE9DS19CVVRUT05fRk9OVCk7CisjZW5kaWYKKwllbHNlCisJICAgIGJ1dHRvbnNfbGlzdFtjdXJdID0gZ19zdHJkdXAoKGNoYXIgKilwKTsKKworCWlmICgqbmV4dCA9PSBOVUwpCisJICAgIGJyZWFrOworCisJcCA9IG5leHQ7CisgICAgfQorICAgIHZpbV9mcmVlKGJ1dHRvbnNfY29weSk7CisKKyAgICBkbGcgPSBnbm9tZV9tZXNzYWdlX2JveF9uZXd2KChjb25zdCBjaGFyICopbWVzc2FnZSwKKwkJCQkgKGNvbnN0IGNoYXIgKilnZHR5cGUsCisJCQkJIChjb25zdCBjaGFyICoqKWJ1dHRvbnNfbGlzdCk7CisgICAgZm9yIChjdXIgPSAwOyBjdXIgPCBidXRjb3VudDsgKytjdXIpCisJZ19mcmVlKGJ1dHRvbnNfbGlzdFtjdXJdKTsKKyAgICBnX2ZyZWUoYnV0dG9uc19saXN0KTsKKworICAgIGRpYWxvZ190ZXh0ZmllbGQgPSB0ZXh0ZmllbGQ7CisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorICAgIHsKKwkvKiBBZGQgdGV4dCBlbnRyeSBmaWVsZCAqLworCWRpYWxvZ190ZXh0ZW50cnkgPSBndGtfZW50cnlfbmV3KCk7CisJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goR05PTUVfRElBTE9HKGRsZyktPnZib3gpLCBkaWFsb2dfdGV4dGVudHJ5LAorCQkJICAgVFJVRSwgVFJVRSwgMCk7CisJZ3RrX2VudHJ5X3NldF90ZXh0KEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSwKKwkJCSAgIChjb25zdCBnY2hhciAqKXRleHRmaWVsZCk7CisJZ3RrX2VudHJ5X3NlbGVjdF9yZWdpb24oR1RLX0VOVFJZKGRpYWxvZ190ZXh0ZW50cnkpLCAwLAorCQkJCVNUUkxFTih0ZXh0ZmllbGQpKTsKKwlndGtfZW50cnlfc2V0X21heF9sZW5ndGgoR1RLX0VOVFJZKGRpYWxvZ190ZXh0ZW50cnkpLCBJT1NJWkUgLSAxKTsKKwlndGtfZW50cnlfc2V0X3Bvc2l0aW9uKEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSwgU1RSTEVOKHRleHRmaWVsZCkpOworCWd0a193aWRnZXRfc2hvdyhkaWFsb2dfdGV4dGVudHJ5KTsKKwlndGtfd2luZG93X3NldF9mb2N1cyhHVEtfV0lORE9XKGRsZyksIGRpYWxvZ190ZXh0ZW50cnkpOworICAgIH0KKworICAgIGd0a19zaWduYWxfY29ubmVjdF9vYmplY3QoR1RLX09CSkVDVChkbGcpLCAiZGVzdHJveSIsCisJCQkgICAgICBHVEtfU0lHTkFMX0ZVTkMoZGxnX2Rlc3Ryb3kpLCBHVEtfT0JKRUNUKGRsZykpOworICAgIGdub21lX2RpYWxvZ19zZXRfZGVmYXVsdChHTk9NRV9ESUFMT0coZGxnKSwgZGZsdGJ1dHRvbiArIDEpOworICAgIGd1aV9ndGtfcG9zaXRpb25faW5fcGFyZW50KEdUS19XSURHRVQoZ3VpLm1haW53aW4pLAorCQkJICAgICAgIEdUS19XSURHRVQoZGxnKSwgVldfUE9TX01PVVNFKTsKKworICAgIHJldHVybiAoMSArIGdub21lX2RpYWxvZ19ydW5fYW5kX2Nsb3NlKEdOT01FX0RJQUxPRyhkbGcpKSk7Cit9CisKKyMgZW5kaWYgLyogRkVBVF9HVUlfR05PTUUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0J1dHRvbkRhdGEKK3sKKyAgICBpbnQJCSpzdGF0dXM7CisgICAgaW50CQlpbmRleDsKKyAgICBHdGtXaWRnZXQJKmRpYWxvZzsKK30gQnV0dG9uRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NhbmNlbERhdGEKK3sKKyAgICBpbnQJCSpzdGF0dXM7CisgICAgaW50CQlpZ25vcmVfZW50ZXI7CisgICAgR3RrV2lkZ2V0CSpkaWFsb2c7Cit9IENhbmNlbERhdGE7CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2RsZ19idXR0b25fY2xpY2tlZChHdGtXaWRnZXQgKiB3aWRnZXQsIEJ1dHRvbkRhdGEgKmRhdGEpCit7CisgICAgKihkYXRhLT5zdGF0dXMpID0gZGF0YS0+aW5kZXggKyAxOworICAgIGRsZ19kZXN0cm95KGRhdGEtPmRpYWxvZyk7Cit9CisKKy8qCisgKiBUaGlzIG1ha2VzIHRoZSBFc2NhcGUga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGNhbmNlbCBidXR0b24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBpbnQKK2RsZ19rZXlfcHJlc3NfZXZlbnQoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudEtleSAqIGV2ZW50LCBDYW5jZWxEYXRhICpkYXRhKQoreworICAgIC8qIElnbm9yZSBoaXR0aW5nIEVudGVyIHdoZW4gdGhlcmUgaXMgbm8gZGVmYXVsdCBidXR0b24uICovCisgICAgaWYgKGRhdGEtPmlnbm9yZV9lbnRlciAmJiBldmVudC0+a2V5dmFsID09IEdES19SZXR1cm4pCisJcmV0dXJuIFRSVUU7CisKKyAgICBpZiAoZXZlbnQtPmtleXZhbCAhPSBHREtfRXNjYXBlICYmIGV2ZW50LT5rZXl2YWwgIT0gR0RLX1JldHVybikKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBUaGUgcmVzdWx0IHZhbHVlIG9mIDAgZnJvbSBhIGRpYWxvZyBpcyBzaWduYWxpbmcgY2FuY2VsYXRpb24uCisgICAgICogMSBtZWFucyBPSy4gKi8KKyAgICAqKGRhdGEtPnN0YXR1cykgPSAoZXZlbnQtPmtleXZhbCA9PSBHREtfUmV0dXJuKTsKKyAgICBkbGdfZGVzdHJveShkYXRhLT5kaWFsb2cpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB0aGUgZGlhbG9nIHdhcyBkZXN0cm95ZWQgYnkgYSB3aW5kb3cgbWFuYWdlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitkbGdfZGVzdHJveV9jYihpbnQgKnApCit7CisgICAgKnAgPSBUUlVFOwkJLyogc2V0IGRpYWxvZ19kZXN0cm95ZWQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK2d1aV9tY2hfZGlhbG9nKAlpbnQJdHlwZSwJCS8qIHR5cGUgb2YgZGlhbG9nICovCisJCWNoYXJfdQkqdGl0bGUsCQkvKiB0aXRsZSBvZiBkaWFsb2cgKi8KKwkJY2hhcl91CSptZXNzYWdlLAkvKiBtZXNzYWdlIHRleHQgKi8KKwkJY2hhcl91CSpidXR0b25zLAkvKiBuYW1lcyBvZiBidXR0b25zICovCisJCWludAlkZWZfYnV0LAkvKiBkZWZhdWx0IGJ1dHRvbiAqLworCQljaGFyX3UJKnRleHRmaWVsZCkJLyogdGV4dCBmb3IgdGV4dGZpZWxkIG9yIE5VTEwgKi8KK3sKKyAgICBjaGFyX3UJKm5hbWVzOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlidXRjb3VudDsKKyAgICBpbnQJCWRpYWxvZ19zdGF0dXMgPSAtMTsKKyAgICBpbnQJCWRpYWxvZ19kZXN0cm95ZWQgPSBGQUxTRTsKKyAgICBpbnQJCXZlcnRpY2FsOworCisgICAgR3RrV2lkZ2V0CQkqZGlhbG9nOworICAgIEd0a1dpZGdldAkJKmZyYW1lOworICAgIEd0a1dpZGdldAkJKnZib3g7CisgICAgR3RrV2lkZ2V0CQkqdGFibGU7CisgICAgR3RrV2lkZ2V0CQkqZGlhbG9nbWVzc2FnZTsKKyAgICBHdGtXaWRnZXQJCSphY3Rpb25fYXJlYTsKKyAgICBHdGtXaWRnZXQJCSpzdWJfYXJlYTsKKyAgICBHdGtXaWRnZXQJCSpzZXBhcmF0b3I7CisgICAgR3RrQWNjZWxHcm91cAkqYWNjZWxfZ3JvdXA7CisgICAgR3RrV2lkZ2V0CQkqcGl4bWFwOworICAgIEdka1BpeG1hcAkJKmljb24gPSBOVUxMOworICAgIEdka0JpdG1hcAkJKm1hc2sgPSBOVUxMOworICAgIGNoYXIJCSoqaWNvbl9kYXRhID0gTlVMTDsKKworICAgIEd0a1dpZGdldAkJKipidXR0b247CisgICAgQnV0dG9uRGF0YQkJKmRhdGE7CisgICAgQ2FuY2VsRGF0YQkJY2FuY2VsX2RhdGE7CisKKyAgICAvKiBpZiBvdXIgcG9pbnRlciBpcyBjdXJyZW50bHkgaGlkZGVuLCB0aGVuIHdlIHNob3VsZCBzaG93IGl0LiAqLworICAgIGd1aV9tY2hfbW91c2VoaWRlKEZBTFNFKTsKKworIyBpZmRlZiBGRUFUX0dVSV9HTk9NRQorICAgIC8qIElmIEdub21lIGlzIGF2YWlsYWJsZSwgdXNlIGl0IGZvciB0aGUgZGlhbG9nLiAqLworICAgIGlmIChndGtfc29ja2V0X2lkID09IDApCisJcmV0dXJuIGd1aV9nbm9tZV9kaWFsb2codHlwZSwgdGl0bGUsIG1lc3NhZ2UsIGJ1dHRvbnMsIGRlZl9idXQsCisJCQkJCQkJCSAgIHRleHRmaWVsZCk7CisjIGVuZGlmCisKKyAgICBpZiAodGl0bGUgPT0gTlVMTCkKKwl0aXRsZSA9IChjaGFyX3UgKilfKCJWaW0gZGlhbG9nLi4uIik7CisKKyAgICBpZiAoKHR5cGUgPCAwKSB8fCAodHlwZSA+IFZJTV9MQVNUX1RZUEUpKQorCXR5cGUgPSBWSU1fR0VORVJJQzsKKworICAgIC8qIENoZWNrICd2JyBmbGFnIGluICdndWlvcHRpb25zJzogdmVydGljYWwgYnV0dG9uIHBsYWNlbWVudC4gKi8KKyAgICB2ZXJ0aWNhbCA9ICh2aW1fc3RyY2hyKHBfZ28sIEdPX1ZFUlRJQ0FMKSAhPSBOVUxMKTsKKworICAgIGRpYWxvZyA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfRElBTE9HKTsKKyAgICBndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKGRpYWxvZyksIChjb25zdCBnY2hhciAqKXRpdGxlKTsKKyAgICBndGtfd2luZG93X3NldF90cmFuc2llbnRfZm9yKEdUS19XSU5ET1coZGlhbG9nKSwgR1RLX1dJTkRPVyhndWkubWFpbndpbikpOworICAgIGd0a193aWRnZXRfcmVhbGl6ZShkaWFsb2cpOworICAgIGdka193aW5kb3dfc2V0X2RlY29yYXRpb25zKGRpYWxvZy0+d2luZG93LCBHREtfREVDT1JfQk9SREVSKTsKKyAgICBnZGtfd2luZG93X3NldF9mdW5jdGlvbnMoZGlhbG9nLT53aW5kb3csIEdES19GVU5DX01PVkUpOworCisgICAgY2FuY2VsX2RhdGEuc3RhdHVzID0gJmRpYWxvZ19zdGF0dXM7CisgICAgY2FuY2VsX2RhdGEuZGlhbG9nID0gZGlhbG9nOworICAgIGd0a19zaWduYWxfY29ubmVjdF9hZnRlcihHVEtfT0JKRUNUKGRpYWxvZyksICJrZXlfcHJlc3NfZXZlbnQiLAorCQkgICAgR1RLX1NJR05BTF9GVU5DKGRsZ19rZXlfcHJlc3NfZXZlbnQpLAorCQkgICAgKGdwb2ludGVyKSAmY2FuY2VsX2RhdGEpOworICAgIC8qIENhdGNoIHRoZSBkZXN0cm95IHNpZ25hbCwgb3RoZXJ3aXNlIHdlIGRvbid0IG5vdGljZSBhIHdpbmRvdyBtYW5hZ2VyCisgICAgICogZGVzdHJveWluZyB0aGUgZGlhbG9nIHdpbmRvdy4gKi8KKyAgICBndGtfc2lnbmFsX2Nvbm5lY3Rfb2JqZWN0KEdUS19PQkpFQ1QoZGlhbG9nKSwgImRlc3Ryb3kiLAorCQkgICAgR1RLX1NJR05BTF9GVU5DKGRsZ19kZXN0cm95X2NiKSwKKwkJICAgIChncG9pbnRlcikmZGlhbG9nX2Rlc3Ryb3llZCk7CisKKyAgICBndGtfZ3JhYl9hZGQoZGlhbG9nKTsKKworICAgIC8qIHRoaXMgbWFrZXMgaXQgbG9vayBiZXRlciBvbiBNb3RpZiBzdHlsZSB3aW5kb3cgbWFuYWdlcnMgKi8KKyAgICBmcmFtZSA9IGd0a19mcmFtZV9uZXcoTlVMTCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihkaWFsb2cpLCBmcmFtZSk7CisgICAgZ3RrX3dpZGdldF9zaG93KGZyYW1lKTsKKworICAgIHZib3ggPSBndGtfdmJveF9uZXcoRkFMU0UsIDApOworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZnJhbWUpLCB2Ym94KTsKKyAgICBndGtfd2lkZ2V0X3Nob3codmJveCk7CisKKyAgICB0YWJsZSA9IGd0a190YWJsZV9uZXcoMSwgMywgRkFMU0UpOworICAgIGd0a190YWJsZV9zZXRfcm93X3NwYWNpbmdzKEdUS19UQUJMRSh0YWJsZSksIDQpOworICAgIGd0a190YWJsZV9zZXRfY29sX3NwYWNpbmdzKEdUS19UQUJMRSh0YWJsZSksIDgpOworICAgIGd0a19jb250YWluZXJfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIodGFibGUpLCA0KTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgdGFibGUsIDQsIDQsIDApOworICAgIGd0a193aWRnZXRfc2hvdyh0YWJsZSk7CisKKyAgICAvKiBBZGQgcGl4bWFwICovCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIFZJTV9HRU5FUklDOgorCWljb25fZGF0YSA9IGdlbmVyaWNfeHBtOworCWJyZWFrOworICAgIGNhc2UgVklNX0VSUk9SOgorCWljb25fZGF0YSA9IGVycm9yX3hwbTsKKwlicmVhazsKKyAgICBjYXNlIFZJTV9XQVJOSU5HOgorCWljb25fZGF0YSA9IGFsZXJ0X3hwbTsKKwlicmVhazsKKyAgICBjYXNlIFZJTV9JTkZPOgorCWljb25fZGF0YSA9IGluZm9feHBtOworCWJyZWFrOworICAgIGNhc2UgVklNX1FVRVNUSU9OOgorCWljb25fZGF0YSA9IHF1ZXN0X3hwbTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWljb25fZGF0YSA9IGdlbmVyaWNfeHBtOworICAgIH07CisgICAgaWNvbiA9IGdka19waXhtYXBfY29sb3JtYXBfY3JlYXRlX2Zyb21feHBtX2QoTlVMTCwKKwkJCQkgICAgIGd0a193aWRnZXRfZ2V0X2NvbG9ybWFwKGRpYWxvZyksCisJCQkJICAgICAmbWFzaywgTlVMTCwgaWNvbl9kYXRhKTsKKyAgICBpZiAoaWNvbikKKyAgICB7CisJcGl4bWFwID0gZ3RrX3BpeG1hcF9uZXcoaWNvbiwgbWFzayk7CisJLyogZ3RrX21pc2Nfc2V0X2FsaWdubWVudChHVEtfTUlTQyhwaXhtYXApLCAwLjUsIDAuNSk7ICovCisJZ3RrX3RhYmxlX2F0dGFjaF9kZWZhdWx0cyhHVEtfVEFCTEUodGFibGUpLCBwaXhtYXAsIDAsIDEsIDAsIDEpOworCWd0a193aWRnZXRfc2hvdyhwaXhtYXApOworICAgIH0KKworICAgIC8qIEFkZCBsYWJlbCAqLworICAgIGRpYWxvZ21lc3NhZ2UgPSBndGtfbGFiZWxfbmV3KChjb25zdCBnY2hhciAqKW1lc3NhZ2UpOworICAgIGd0a190YWJsZV9hdHRhY2hfZGVmYXVsdHMoR1RLX1RBQkxFKHRhYmxlKSwgZGlhbG9nbWVzc2FnZSwgMSwgMiwgMCwgMSk7CisgICAgZ3RrX3dpZGdldF9zaG93KGRpYWxvZ21lc3NhZ2UpOworCisgICAgZGlhbG9nX3RleHRmaWVsZCA9IHRleHRmaWVsZDsKKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCS8qIEFkZCB0ZXh0IGVudHJ5IGZpZWxkICovCisJZGlhbG9nX3RleHRlbnRyeSA9IGd0a19lbnRyeV9uZXcoKTsKKwlndGtfd2lkZ2V0X3NldF91c2l6ZShkaWFsb2dfdGV4dGVudHJ5LCA0MDAsIC0yKTsKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgZGlhbG9nX3RleHRlbnRyeSwgVFJVRSwgVFJVRSwgMCk7CisJZ3RrX2VudHJ5X3NldF90ZXh0KEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSwKKwkJCQkJCSAgICAoY29uc3QgZ2NoYXIgKil0ZXh0ZmllbGQpOworCWd0a19lbnRyeV9zZWxlY3RfcmVnaW9uKEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSwgMCwKKwkJCQkJCQkgICBTVFJMRU4odGV4dGZpZWxkKSk7CisJZ3RrX2VudHJ5X3NldF9tYXhfbGVuZ3RoKEdUS19FTlRSWShkaWFsb2dfdGV4dGVudHJ5KSwgSU9TSVpFIC0gMSk7CisJZ3RrX2VudHJ5X3NldF9wb3NpdGlvbihHVEtfRU5UUlkoZGlhbG9nX3RleHRlbnRyeSksIFNUUkxFTih0ZXh0ZmllbGQpKTsKKwlndGtfd2lkZ2V0X3Nob3coZGlhbG9nX3RleHRlbnRyeSk7CisgICAgfQorCisgICAgLyogQWRkIGJveCBmb3IgYnV0dG9ucyAqLworICAgIGFjdGlvbl9hcmVhID0gZ3RrX2hib3hfbmV3KEZBTFNFLCAwKTsKKyAgICBndGtfY29udGFpbmVyX2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKGFjdGlvbl9hcmVhKSwgNCk7CisgICAgZ3RrX2JveF9wYWNrX2VuZChHVEtfQk9YKHZib3gpLCBhY3Rpb25fYXJlYSwgRkFMU0UsIFRSVUUsIDApOworICAgIGd0a193aWRnZXRfc2hvdyhhY3Rpb25fYXJlYSk7CisKKyAgICAvKiBBZGQgYSBbdmhdYm94IGluIHRoZSBoYm94IHRvIGNlbnRlciB0aGUgYnV0dG9ucyBpbiB0aGUgZGlhbG9nLiAqLworICAgIGlmICh2ZXJ0aWNhbCkKKwlzdWJfYXJlYSA9IGd0a192Ym94X25ldyhGQUxTRSwgMCk7CisgICAgZWxzZQorCXN1Yl9hcmVhID0gZ3RrX2hib3hfbmV3KEZBTFNFLCAwKTsKKyAgICBndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUihzdWJfYXJlYSksIDApOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGFjdGlvbl9hcmVhKSwgc3ViX2FyZWEsIFRSVUUsIEZBTFNFLCAwKTsKKyAgICBndGtfd2lkZ2V0X3Nob3coc3ViX2FyZWEpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIGJ1dHRvbnMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRyYW5zbGF0ZSB0aGUgVmltIGFjY2VsZXJhdG9yIGNoYXJhY3RlciBpbnRvIGFuIHVuZGVyc2NvcmUgZm9yIEdUSysuCisgICAgICogRG91YmxlIHVuZGVyc2NvcmVzIHRvIGtlZXAgdGhlbSBpbiB0aGUgbGFiZWwuCisgICAgICovCisgICAgLyogY291bnQgdGhlIG51bWJlciBvZiB1bmRlcnNjb3JlcyAqLworICAgIGkgPSAxOworICAgIGZvciAocCA9IGJ1dHRvbnM7ICpwOyArK3ApCisJaWYgKCpwID09ICdfJykKKwkgICAgKytpOworCisgICAgLyogbWFrZSBhIGNvcHkgb2YgImJ1dHRvbnMiIHdpdGggdGhlIHRyYW5zbGF0ZWQgY2hhcmFjdGVycyAqLworICAgIG5hbWVzID0gYWxsb2MoU1RSTEVOKGJ1dHRvbnMpICsgaSk7CisgICAgaWYgKG5hbWVzID09IE5VTEwpCisJcmV0dXJuIC0xOworCisgICAgcCA9IG5hbWVzOworICAgIGZvciAoaSA9IDA7IGJ1dHRvbnNbaV07ICsraSkKKyAgICB7CisJaWYgKGJ1dHRvbnNbaV0gPT0gRExHX0hPVEtFWV9DSEFSKQorCSAgICAqcCsrID0gJ18nOworCWVsc2UKKwl7CisJICAgIGlmIChidXR0b25zW2ldID09ICdfJykKKwkJKnArKyA9ICdfJzsKKwkgICAgKnArKyA9IGJ1dHRvbnNbaV07CisJfQorICAgIH0KKyAgICAqcCA9IE5VTDsKKworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgYnV0dG9ucyBhbmQgYWxsb2NhdGUgYnV0dG9uW10gYW5kIGRhdGFbXS4gKi8KKyAgICBidXRjb3VudCA9IDE7CisgICAgZm9yIChwID0gbmFtZXM7ICpwOyArK3ApCisJaWYgKCpwID09IERMR19CVVRUT05fU0VQKQorCSAgICArK2J1dGNvdW50OworICAgIGJ1dHRvbiA9IChHdGtXaWRnZXQgKiopYWxsb2MoKHVuc2lnbmVkKShidXRjb3VudCAqIHNpemVvZihHdGtXaWRnZXQgKikpKTsKKyAgICBkYXRhID0gKEJ1dHRvbkRhdGEgKilhbGxvYygodW5zaWduZWQpKGJ1dGNvdW50ICogc2l6ZW9mKEJ1dHRvbkRhdGEpKSk7CisgICAgaWYgKGJ1dHRvbiA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUobmFtZXMpOworCXZpbV9mcmVlKGJ1dHRvbik7CisJdmltX2ZyZWUoZGF0YSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEF0dGFjaCB0aGUgbmV3IGFjY2VsZXJhdG9yIGdyb3VwIHRvIHRoZSB3aW5kb3cuICovCisgICAgYWNjZWxfZ3JvdXAgPSBndGtfYWNjZWxfZ3JvdXBfbmV3KCk7CisgICAgZ3RrX2FjY2VsX2dyb3VwX2F0dGFjaChhY2NlbF9ncm91cCwgR1RLX09CSkVDVChkaWFsb2cpKTsKKworICAgIHAgPSBuYW1lczsKKyAgICBmb3IgKGJ1dGNvdW50ID0gMDsgKnA7ICsrYnV0Y291bnQpCisgICAgeworCWNoYXJfdQkJKm5leHQ7CisJR3RrV2lkZ2V0CSpsYWJlbDsKKyMgaWZkZWYgR1RLX1VTRV9BQ0NFTAorCWd1aW50CQlhY2NlbF9rZXk7CisjIGVuZGlmCisKKwkvKiBDaHVuayBvdXQgdGhpcyBzaW5nbGUgYnV0dG9uLiAqLworCWZvciAobmV4dCA9IHA7ICpuZXh0OyArK25leHQpCisJeworCSAgICBpZiAoKm5leHQgPT0gRExHX0JVVFRPTl9TRVApCisJICAgIHsKKwkJKm5leHQrKyA9IE5VTDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwlidXR0b25bYnV0Y291bnRdID0gZ3RrX2J1dHRvbl9uZXcoKTsKKwlHVEtfV0lER0VUX1NFVF9GTEFHUyhidXR0b25bYnV0Y291bnRdLCBHVEtfQ0FOX0RFRkFVTFQpOworCisJbGFiZWwgPSBndGtfYWNjZWxfbGFiZWxfbmV3KCIiKTsKKwlndGtfYWNjZWxfbGFiZWxfc2V0X2FjY2VsX3dpZGdldChHVEtfQUNDRUxfTEFCRUwobGFiZWwpLCBkaWFsb2cpOworCisjIGlmZGVmIEdUS19VU0VfQUNDRUwKKwlhY2NlbF9rZXkgPSBndGtfbGFiZWxfcGFyc2VfdWxpbmUoR1RLX0xBQkVMKGxhYmVsKSwgKGNvbnN0IGdjaGFyICopcCk7CisJLyogRG9uJ3QgYWRkIGFjY2VsYXRvciBpZiAnd2luYWx0a2V5cycgaXMgIm5vIi4gKi8KKwlpZiAoYWNjZWxfa2V5ICE9IEdES19Wb2lkU3ltYm9sKQorCXsKKwkgICAgZ3RrX3dpZGdldF9hZGRfYWNjZWxlcmF0b3IoYnV0dG9uW2J1dGNvdW50XSwKKwkJICAgICJjbGlja2VkIiwKKwkJICAgIGFjY2VsX2dyb3VwLAorCQkgICAgYWNjZWxfa2V5LCAwLAorCQkgICAgMCk7CisJfQorIyBlbHNlCisJKHZvaWQpZ3RrX2xhYmVsX3BhcnNlX3VsaW5lKEdUS19MQUJFTChsYWJlbCksIChjb25zdCBnY2hhciAqKXApOworIyBlbmRpZgorCisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihidXR0b25bYnV0Y291bnRdKSwgbGFiZWwpOworCWd0a193aWRnZXRfc2hvd19hbGwoYnV0dG9uW2J1dGNvdW50XSk7CisKKwlkYXRhW2J1dGNvdW50XS5zdGF0dXMgPSAmZGlhbG9nX3N0YXR1czsKKwlkYXRhW2J1dGNvdW50XS5pbmRleCA9IGJ1dGNvdW50OworCWRhdGFbYnV0Y291bnRdLmRpYWxvZyA9IGRpYWxvZzsKKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChidXR0b25bYnV0Y291bnRdKSwKKwkJCSAgIChjb25zdCBjaGFyICopImNsaWNrZWQiLAorCQkJICAgR1RLX1NJR05BTF9GVU5DKGRsZ19idXR0b25fY2xpY2tlZCksCisJCQkgICAoZ3BvaW50ZXIpICZkYXRhW2J1dGNvdW50XSk7CisKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChzdWJfYXJlYSksIGJ1dHRvbltidXRjb3VudF0sCisJCQkgICBUUlVFLCBGQUxTRSwgMCk7CisJcCA9IG5leHQ7CisgICAgfQorCisgICAgdmltX2ZyZWUobmFtZXMpOworCisgICAgY2FuY2VsX2RhdGEuaWdub3JlX2VudGVyID0gRkFMU0U7CisgICAgaWYgKGJ1dGNvdW50ID4gMCkKKyAgICB7CisJLS1kZWZfYnV0OwkJLyogMSBpcyBmaXJzdCBidXR0b24gKi8KKwlpZiAoZGVmX2J1dCA+PSBidXRjb3VudCkKKwkgICAgZGVmX2J1dCA9IC0xOworCWlmIChkZWZfYnV0ID49IDApCisJeworCSAgICBndGtfd2lkZ2V0X2dyYWJfZm9jdXMoYnV0dG9uW2RlZl9idXRdKTsKKwkgICAgZ3RrX3dpZGdldF9ncmFiX2RlZmF1bHQoYnV0dG9uW2RlZl9idXRdKTsKKwl9CisJZWxzZQorCSAgICAvKiBObyBkZWZhdWx0LCBpZ25vcmUgaGl0dGluZyBFbnRlci4gKi8KKwkgICAgY2FuY2VsX2RhdGEuaWdub3JlX2VudGVyID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisJZ3RrX3dpbmRvd19zZXRfZm9jdXMoR1RLX1dJTkRPVyhkaWFsb2cpLCBkaWFsb2dfdGV4dGVudHJ5KTsKKworICAgIHNlcGFyYXRvciA9IGd0a19oc2VwYXJhdG9yX25ldygpOworICAgIGd0a19ib3hfcGFja19lbmQoR1RLX0JPWCh2Ym94KSwgc2VwYXJhdG9yLCBGQUxTRSwgVFJVRSwgMCk7CisgICAgZ3RrX3dpZGdldF9zaG93KHNlcGFyYXRvcik7CisKKyAgICBkaWFsb2dfc3RhdHVzID0gLTE7CisKKyAgICBndWlfZ3RrX3Bvc2l0aW9uX2luX3BhcmVudChHVEtfV0lER0VUKGd1aS5tYWlud2luKSwKKwkJCQkJICAgIEdUS19XSURHRVQoZGlhbG9nKSwgVldfUE9TX01PVVNFKTsKKworICAgIGd0a193aWRnZXRfc2hvdyhkaWFsb2cpOworCisgICAgLyogbG9vcCBoZXJlIHVudGlsIHRoZSBkaWFsb2cgZ29lcyBhd2F5ICovCisgICAgd2hpbGUgKGRpYWxvZ19zdGF0dXMgPT0gLTEgJiYgIWRpYWxvZ19kZXN0cm95ZWQKKwkJCQkJICAgICAgICYmIEdUS19XSURHRVRfRFJBV0FCTEUoZGlhbG9nKSkKKwlndGtfbWFpbl9pdGVyYXRpb25fZG8oVFJVRSk7CisKKyAgICBpZiAoZGlhbG9nX3N0YXR1cyA8IDApCisJZGlhbG9nX3N0YXR1cyA9IDA7CisgICAgaWYgKGRpYWxvZ19zdGF0dXMgIT0gMSAmJiB0ZXh0ZmllbGQgIT0gTlVMTCkKKwkqdGV4dGZpZWxkID0gTlVMOwkvKiBkaWFsb2cgd2FzIGNhbmNlbGxlZCAqLworCisgICAgLyogbGV0IHRoZSBnYXJiYWdlIGNvbGxlY3RvciBrbm93IHRoYXQgd2UgZG9uJ3QgbmVlZCBpdCBhbnkgbG9uZ2VyICovCisgICAgZ3RrX2FjY2VsX2dyb3VwX3VucmVmKGFjY2VsX2dyb3VwKTsKKworICAgIHZpbV9mcmVlKGJ1dHRvbik7CisgICAgdmltX2ZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gZGlhbG9nX3N0YXR1czsKK30KKworI2VuZGlmIC8qIEZFQVRfR1VJX0RJQUxPRyAmJiAhSEFWRV9HVEsyICovCisKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKworICAgIHN0YXRpYyBHdGtXaWRnZXQgKgorY3JlYXRlX21lc3NhZ2VfZGlhbG9nKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UpCit7CisgICAgR3RrV2lkZ2V0CSAgICAqZGlhbG9nOworICAgIEd0a01lc3NhZ2VUeXBlICBtZXNzYWdlX3R5cGU7CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworCWNhc2UgVklNX0VSUk9SOgkgICAgbWVzc2FnZV90eXBlID0gR1RLX01FU1NBR0VfRVJST1I7CSBicmVhazsKKwljYXNlIFZJTV9XQVJOSU5HOiAgIG1lc3NhZ2VfdHlwZSA9IEdUS19NRVNTQUdFX1dBUk5JTkc7CSBicmVhazsKKwljYXNlIFZJTV9RVUVTVElPTjogIG1lc3NhZ2VfdHlwZSA9IEdUS19NRVNTQUdFX1FVRVNUSU9OOyBicmVhazsKKwlkZWZhdWx0OgkgICAgbWVzc2FnZV90eXBlID0gR1RLX01FU1NBR0VfSU5GTzsJIGJyZWFrOworICAgIH0KKworICAgIG1lc3NhZ2UgPSBDT05WRVJUX1RPX1VURjgobWVzc2FnZSk7CisgICAgZGlhbG9nICA9IGd0a19tZXNzYWdlX2RpYWxvZ19uZXcoR1RLX1dJTkRPVyhndWkubWFpbndpbiksCisJCQkJICAgICBHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJICAgICBtZXNzYWdlX3R5cGUsCisJCQkJICAgICBHVEtfQlVUVE9OU19OT05FLAorCQkJCSAgICAgIiVzIiwgKGNvbnN0IGNoYXIgKiltZXNzYWdlKTsKKyAgICBDT05WRVJUX1RPX1VURjhfRlJFRShtZXNzYWdlKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMKQorICAgIHsKKwl0aXRsZSA9IENPTlZFUlRfVE9fVVRGOCh0aXRsZSk7CisJZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyhkaWFsb2cpLCAoY29uc3QgY2hhciAqKXRpdGxlKTsKKwlDT05WRVJUX1RPX1VURjhfRlJFRSh0aXRsZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT0gVklNX0dFTkVSSUMpCisgICAgeworCWd0a193aW5kb3dfc2V0X3RpdGxlKEdUS19XSU5ET1coZGlhbG9nKSwgIlZJTSIpOworICAgIH0KKworICAgIHJldHVybiBkaWFsb2c7Cit9CisKKy8qCisgKiBTcGxpdCB1cCBidXR0b25fc3RyaW5nIGludG8gaW5kaXZpZHVhbCBidXR0b24gbGFiZWxzIGJ5IGluc2VydGluZworICogTlVMIGJ5dGVzLiAgQWxzbyByZXBsYWNlIHRoZSBWaW0tc3R5bGUgbW5lbW9uaWMgYWNjZWxlcmF0b3IgcHJlZml4CisgKiAnJicgd2l0aCAnXycuICBidXR0b25fc3RyaW5nIG11c3QgcG9pbnQgdG8gYWxsb2NhdGVkIG1lbW9yeSEKKyAqIFJldHVybiBhbiBhbGxvY2F0ZWQgYXJyYXkgb2YgcG9pbnRlcnMgaW50byBidXR0b25fc3RyaW5nLgorICovCisgICAgc3RhdGljIGNoYXIgKioKK3NwbGl0X2J1dHRvbl9zdHJpbmcoY2hhcl91ICpidXR0b25fc3RyaW5nLCBpbnQgKm5fYnV0dG9ucykKK3sKKyAgICBjaGFyCSAgICAqKmFycmF5OworICAgIGNoYXJfdQkgICAgKnA7CisgICAgdW5zaWduZWQgaW50ICAgIGNvdW50ID0gMTsKKworICAgIGZvciAocCA9IGJ1dHRvbl9zdHJpbmc7ICpwICE9IE5VTDsgKytwKQorCWlmICgqcCA9PSBETEdfQlVUVE9OX1NFUCkKKwkgICAgKytjb3VudDsKKworICAgIGFycmF5ID0gKGNoYXIgKiopYWxsb2MoKGNvdW50ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisgICAgY291bnQgPSAwOworCisgICAgaWYgKGFycmF5ICE9IE5VTEwpCisgICAgeworCWFycmF5W2NvdW50KytdID0gKGNoYXIgKilidXR0b25fc3RyaW5nOworCWZvciAocCA9IGJ1dHRvbl9zdHJpbmc7ICpwICE9IE5VTDsgKytwKQorCXsKKwkgICAgaWYgKCpwID09IERMR19CVVRUT05fU0VQKQorCSAgICB7CisJCSpwID0gTlVMOworCQlhcnJheVtjb3VudCsrXSA9IChjaGFyICopcCArIDE7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnAgPT0gRExHX0hPVEtFWV9DSEFSKQorCQkqcCA9ICdfJzsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGVsc2UgaWYgKGhhc19tYnl0ZSkKKwkJcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorCX0KKwlhcnJheVtjb3VudF0gPSBOVUxMOyAvKiBjdXJyZW50bHkgbm90IHJlbGllZCB1cG9uLCBidXQgZG9lc24ndCBodXJ0ICovCisgICAgfQorCisgICAgKm5fYnV0dG9ucyA9IGNvdW50OworICAgIHJldHVybiBhcnJheTsKK30KKworICAgIHN0YXRpYyBjaGFyICoqCitzcGxpdF9idXR0b25fdHJhbnNsYXRpb24oY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgICBjaGFyICAgICoqYnV0dG9ucyA9IE5VTEw7CisgICAgY2hhcl91ICAqc3RyOworICAgIGludAkgICAgbl9idXR0b25zID0gMDsKKyAgICBpbnQJICAgIG5fZXhwZWN0ZWQgPSAxOworCisgICAgZm9yIChzdHIgPSAoY2hhcl91ICopbWVzc2FnZTsgKnN0ciAhPSBOVUw7ICsrc3RyKQorCWlmICgqc3RyID09IERMR19CVVRUT05fU0VQKQorCSAgICArK25fZXhwZWN0ZWQ7CisKKyAgICBzdHIgPSAoY2hhcl91ICopXyhtZXNzYWdlKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpCisgICAgeworCWlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgc3RyID0gc3RyaW5nX2NvbnZlcnQoJm91dHB1dF9jb252LCBzdHIsIE5VTEwpOworCWVsc2UKKwkgICAgc3RyID0gdmltX3N0cnNhdmUoc3RyKTsKKworCWlmIChzdHIgIT0gTlVMTCkKKwkgICAgYnV0dG9ucyA9IHNwbGl0X2J1dHRvbl9zdHJpbmcoc3RyLCAmbl9idXR0b25zKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBVaC1vaC4uLiB0aGlzIHNob3VsZCBuZXZlciBldmVyIGhhcHBlbi4JQnV0IHdlIGRvbid0IHdhbm5hIGNyYXNoCisgICAgICogaWYgdGhlIHRyYW5zbGF0aW9uIGlzIGJyb2tlbiwgdGh1cyBmYWxsIGJhY2sgdG8gdGhlIHVudHJhbnNsYXRlZAorICAgICAqIGJ1dHRvbnMgc3RyaW5nIGluIGNhc2Ugb2YgZW1lcmdlbmN5LgorICAgICAqLworICAgIGlmIChidXR0b25zID09IE5VTEwgfHwgbl9idXR0b25zICE9IG5fZXhwZWN0ZWQpCisgICAgeworCXZpbV9mcmVlKGJ1dHRvbnMpOworCXZpbV9mcmVlKHN0cik7CisJYnV0dG9ucyA9IE5VTEw7CisJc3RyID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKW1lc3NhZ2UpOworCisJaWYgKHN0ciAhPSBOVUxMKQorCSAgICBidXR0b25zID0gc3BsaXRfYnV0dG9uX3N0cmluZyhzdHIsICZuX2J1dHRvbnMpOworCWlmIChidXR0b25zID09IE5VTEwpCisJICAgIHZpbV9mcmVlKHN0cik7CisgICAgfQorCisgICAgcmV0dXJuIGJ1dHRvbnM7Cit9CisKKyAgICBzdGF0aWMgaW50CitidXR0b25fZXF1YWwoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKyAgICB3aGlsZSAoKmEgIT0gJ1wwJyAmJiAqYiAhPSAnXDAnKQorICAgIHsKKwlpZiAoKmEgPT0gJ18nICYmICorK2EgPT0gJ1wwJykKKwkgICAgYnJlYWs7CisJaWYgKCpiID09ICdfJyAmJiAqKytiID09ICdcMCcpCisJICAgIGJyZWFrOworCisJaWYgKGdfdW5pY2hhcl90b2xvd2VyKGdfdXRmOF9nZXRfY2hhcihhKSkKKwkJIT0gZ191bmljaGFyX3RvbG93ZXIoZ191dGY4X2dldF9jaGFyKGIpKSkKKwkgICAgcmV0dXJuIEZBTFNFOworCisJYSA9IGdfdXRmOF9uZXh0X2NoYXIoYSk7CisJYiA9IGdfdXRmOF9uZXh0X2NoYXIoYik7CisgICAgfQorCisgICAgcmV0dXJuICgqYSA9PSAnXDAnICYmICpiID09ICdcMCcpOworfQorCisgICAgc3RhdGljIHZvaWQKK2RpYWxvZ19hZGRfYnV0dG9ucyhHdGtEaWFsb2cgKmRpYWxvZywgY2hhcl91ICpidXR0b25fc3RyaW5nKQoreworICAgIGNoYXIgICAgKipvazsKKyAgICBjaGFyICAgICoqeW5jOyAgLyogInllcyBubyBjYW5jZWwiICovCisgICAgY2hhciAgICAqKmJ1dHRvbnM7CisgICAgaW50CSAgICBuX2J1dHRvbnMgPSAwOworICAgIGludAkgICAgaW5kZXg7CisKKyAgICBidXR0b25fc3RyaW5nID0gdmltX3N0cnNhdmUoYnV0dG9uX3N0cmluZyk7IC8qIG11c3QgYmUgd3JpdGFibGUgKi8KKyAgICBpZiAoYnV0dG9uX3N0cmluZyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIENoZWNrICd2JyBmbGFnIGluICdndWlvcHRpb25zJzogdmVydGljYWwgYnV0dG9uIHBsYWNlbWVudC4gKi8KKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19WRVJUSUNBTCkgIT0gTlVMTCkKKyAgICB7CisJR3RrV2lkZ2V0CSp2YnV0dG9uX2JveDsKKworCXZidXR0b25fYm94ID0gZ3RrX3ZidXR0b25fYm94X25ldygpOworCWd0a193aWRnZXRfc2hvdyh2YnV0dG9uX2JveCk7CisJZ3RrX2JveF9wYWNrX2VuZChHVEtfQk9YKEdUS19ESUFMT0coZGlhbG9nKS0+dmJveCksCisJCQkJCQkgdmJ1dHRvbl9ib3gsIFRSVUUsIEZBTFNFLCAwKTsKKwkvKiBPdmVycnVsZSB0aGUgImFjdGlvbl9hcmVhIiB2YWx1ZSwgaG9wZWZ1bGx5IHRoaXMgd29ya3MuLi4gKi8KKwlHVEtfRElBTE9HKGRpYWxvZyktPmFjdGlvbl9hcmVhID0gdmJ1dHRvbl9ib3g7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBZZXMgdGhpcyBpcyB1Z2x5LCBJIGRvbid0IHBhcnRpY3VsYXJseSBsaWtlIGl0IGVpdGhlci4gIEJ1dCBkb2luZyBpdAorICAgICAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyAgICAgKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyAgICAgKi8KKyAgICBvawkgICAgPSBzcGxpdF9idXR0b25fdHJhbnNsYXRpb24oTl8oIiZPayIpKTsKKyAgICB5bmMgICAgID0gc3BsaXRfYnV0dG9uX3RyYW5zbGF0aW9uKE5fKCImWWVzXG4mTm9cbiZDYW5jZWwiKSk7CisgICAgYnV0dG9ucyA9IHNwbGl0X2J1dHRvbl9zdHJpbmcoYnV0dG9uX3N0cmluZywgJm5fYnV0dG9ucyk7CisKKyAgICAvKgorICAgICAqIFllcywgdGhlIGJ1dHRvbnMgYXJlIGluIHJldmVyc2VkIG9yZGVyIHRvIG1hdGNoIHRoZSBHTk9NRSAyIGRlc2t0b3AKKyAgICAgKiBlbnZpcm9ubWVudC4gIERvbid0IGhpdCBtZSAtLSBpdCdzIGFsbCBhYm91dCBjb25zaXN0ZW5jeS4KKyAgICAgKiBXZWxsLCBhcHBhcmVudGx5IHNvbWVib2R5IGNoYW5nZWQgaGlzIG1pbmQ6IHdpdGggR1RLIDIuMi40IGl0IHdvcmtzIHRoZQorICAgICAqIG90aGVyIHdheSBhcm91bmQuLi4KKyAgICAgKi8KKyAgICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPD0gbl9idXR0b25zOyArK2luZGV4KQorICAgIHsKKwljaGFyCSpsYWJlbDsKKwljaGFyX3UJKmxhYmVsODsKKworCWxhYmVsID0gYnV0dG9uc1tpbmRleCAtIDFdOworCS8qCisJICogUGVyZm9ybSBzb21lIGd1ZXNzd29yayB0byBmaW5kIGFwcHJvcHJpYXRlIHN0b2NrIGl0ZW1zIGZvciB0aGUKKwkgKiBidXR0b25zLiAgV2UgaGF2ZSB0byBjb21wYXJlIHdpdGggYSBzYW1wbGUgb2YgdGhlIHRyYW5zbGF0ZWQKKwkgKiBidXR0b24gc3RyaW5nIHRvIGdldCB0aGluZ3MgcmlnaHQuICBZZXMsIHRoaXMgaXMgaGFja2lzaCA6LworCSAqCisJICogQnV0IGV2ZW4gdGhlIGNvbW1vbiBidXR0b24gbGFiZWxzIGFyZW4ndCBuZWNlc3NhcmlseSB0cmFuc2xhdGVkLAorCSAqIHNpbmNlIGFueW9uZSBjYW4gY3JlYXRlIHRoZWlyIG93biBkaWFsb2dzIHVzaW5nIFZpbSBmdW5jdGlvbnMuCisJICogVGh1cyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aG9zZSB0b28uCisJICovCisJaWYgKG9rICE9IE5VTEwgJiYgeW5jICE9IE5VTEwpIC8qIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGZhaWwgKi8KKwl7CisJICAgIGlmCSAgICAoYnV0dG9uX2VxdWFsKGxhYmVsLCBva1swXSkpICAgIGxhYmVsID0gR1RLX1NUT0NLX09LOworCSAgICBlbHNlIGlmIChidXR0b25fZXF1YWwobGFiZWwsIHluY1swXSkpICAgbGFiZWwgPSBHVEtfU1RPQ0tfWUVTOworCSAgICBlbHNlIGlmIChidXR0b25fZXF1YWwobGFiZWwsIHluY1sxXSkpICAgbGFiZWwgPSBHVEtfU1RPQ0tfTk87CisJICAgIGVsc2UgaWYgKGJ1dHRvbl9lcXVhbChsYWJlbCwgeW5jWzJdKSkgICBsYWJlbCA9IEdUS19TVE9DS19DQU5DRUw7CisJICAgIGVsc2UgaWYgKGJ1dHRvbl9lcXVhbChsYWJlbCwgIk9rIikpICAgICBsYWJlbCA9IEdUS19TVE9DS19PSzsKKwkgICAgZWxzZSBpZiAoYnV0dG9uX2VxdWFsKGxhYmVsLCAiWWVzIikpICAgIGxhYmVsID0gR1RLX1NUT0NLX1lFUzsKKwkgICAgZWxzZSBpZiAoYnV0dG9uX2VxdWFsKGxhYmVsLCAiTm8iKSkgICAgIGxhYmVsID0gR1RLX1NUT0NLX05POworCSAgICBlbHNlIGlmIChidXR0b25fZXF1YWwobGFiZWwsICJDYW5jZWwiKSkgbGFiZWwgPSBHVEtfU1RPQ0tfQ0FOQ0VMOworCX0KKwlsYWJlbDggPSBDT05WRVJUX1RPX1VURjgoKGNoYXJfdSAqKWxhYmVsKTsKKwlndGtfZGlhbG9nX2FkZF9idXR0b24oZGlhbG9nLCAoY29uc3QgZ2NoYXIgKilsYWJlbDgsIGluZGV4KTsKKwlDT05WRVJUX1RPX1VURjhfRlJFRShsYWJlbDgpOworICAgIH0KKworICAgIGlmIChvayAhPSBOVUxMKQorCXZpbV9mcmVlKCpvayk7CisgICAgaWYgKHluYyAhPSBOVUxMKQorCXZpbV9mcmVlKCp5bmMpOworICAgIHZpbV9mcmVlKG9rKTsKKyAgICB2aW1fZnJlZSh5bmMpOworICAgIHZpbV9mcmVlKGJ1dHRvbnMpOworICAgIHZpbV9mcmVlKGJ1dHRvbl9zdHJpbmcpOworfQorCisvKgorICogQWxsb3cgbW5lbW9uaWMgYWNjZWxlcmF0b3JzIHRvIGJlIGFjdGl2YXRlZCB3aXRob3V0IHByZXNzaW5nIDxBbHQ+LgorICogSSdtIG5vdCBzdXJlIGlmIGl0J3MgYSB3aXNlIGlkZWEgdG8gZG8gdGhpcy4gIEhvd2V2ZXIsIHRoZSBvbGQgR1RLKyAxLjIKKyAqIEdVSSB1c2VkIHRvIHdvcmsgdGhpcyB3YXksIGFuZCBJIGNvbnNpZGVyIHRoZSBpbXBhY3Qgb24gVUkgY29uc2lzdGVuY3kKKyAqIGxvdyBlbm91Z2ggdG8ganVzdGlmeSBpbXBsZW1lbnRpbmcgdGhpcyBhcyBhIHNwZWNpYWwgVmltIGZlYXR1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9EaWFsb2dJbmZvCit7CisgICAgaW50CQlpZ25vcmVfZW50ZXI7CSAgICAvKiBubyBkZWZhdWx0IGJ1dHRvbiwgaWdub3JlICJFbnRlciIgKi8KKyAgICBpbnQJCW5vYWx0OwkJICAgIC8qIGFjY2VwdCBhY2NlbGVyYXRvcnMgd2l0aG91dCBBbHQgKi8KKyAgICBHdGtEaWFsb2cJKmRpYWxvZzsJICAgIC8qIFdpZGdldCBvZiB0aGUgZGlhbG9nICovCit9IERpYWxvZ0luZm87CisKKy8qQVJHU1VTRUQyKi8KKyAgICBzdGF0aWMgZ2Jvb2xlYW4KK2RpYWxvZ19rZXlfcHJlc3NfZXZlbnRfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50S2V5ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBEaWFsb2dJbmZvICpkaSA9IChEaWFsb2dJbmZvICopZGF0YTsKKworICAgIC8qIElnbm9yZSBoaXR0aW5nICJFbnRlciIgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBidXR0b24uICovCisgICAgaWYgKGRpLT5pZ25vcmVfZW50ZXIgJiYgZXZlbnQtPmtleXZhbCA9PSBHREtfUmV0dXJuKQorCXJldHVybiBUUlVFOworCisgICAgLyogQ2xvc2UgdGhlIGRpYWxvZyB3aGVuIGhpdHRpbmcgIkVzYyIuICovCisgICAgaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX0VzY2FwZSkKKyAgICB7CisJZ3RrX2RpYWxvZ19yZXNwb25zZShkaS0+ZGlhbG9nLCBHVEtfUkVTUE9OU0VfUkVKRUNUKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoZGktPm5vYWx0CisJICAgICAgJiYgKGV2ZW50LT5zdGF0ZSAmIGd0a19hY2NlbGVyYXRvcl9nZXRfZGVmYXVsdF9tb2RfbWFzaygpKSA9PSAwKQorICAgIHsKKwlyZXR1cm4gZ3RrX3dpbmRvd19tbmVtb25pY19hY3RpdmF0ZSgKKwkJICAgR1RLX1dJTkRPVyh3aWRnZXQpLCBldmVudC0+a2V5dmFsLAorCQkgICBndGtfd2luZG93X2dldF9tbmVtb25pY19tb2RpZmllcihHVEtfV0lORE9XKHdpZGdldCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7IC8qIGNvbnRpbnVlIGVtaXNzaW9uICovCit9CisKKyAgICBpbnQKK2d1aV9tY2hfZGlhbG9nKGludAl0eXBlLAkgICAgLyogdHlwZSBvZiBkaWFsb2cgKi8KKwkgICAgICAgY2hhcl91CSp0aXRsZSwJICAgIC8qIHRpdGxlIG9mIGRpYWxvZyAqLworCSAgICAgICBjaGFyX3UJKm1lc3NhZ2UsICAgLyogbWVzc2FnZSB0ZXh0ICovCisJICAgICAgIGNoYXJfdQkqYnV0dG9ucywgICAvKiBuYW1lcyBvZiBidXR0b25zICovCisJICAgICAgIGludAlkZWZfYnV0LCAgICAvKiBkZWZhdWx0IGJ1dHRvbiAqLworCSAgICAgICBjaGFyX3UJKnRleHRmaWVsZCkgLyogdGV4dCBmb3IgdGV4dGZpZWxkIG9yIE5VTEwgKi8KK3sKKyAgICBHdGtXaWRnZXQJKmRpYWxvZzsKKyAgICBHdGtXaWRnZXQJKmVudHJ5ID0gTlVMTDsKKyAgICBjaGFyX3UJKnRleHQ7CisgICAgaW50CQlyZXNwb25zZTsKKyAgICBEaWFsb2dJbmZvICBkaWFsb2dpbmZvOworCisgICAgZGlhbG9nID0gY3JlYXRlX21lc3NhZ2VfZGlhbG9nKHR5cGUsIHRpdGxlLCBtZXNzYWdlKTsKKyAgICBkaWFsb2dpbmZvLmRpYWxvZyA9IEdUS19ESUFMT0coZGlhbG9nKTsKKyAgICBkaWFsb2dfYWRkX2J1dHRvbnMoR1RLX0RJQUxPRyhkaWFsb2cpLCBidXR0b25zKTsKKworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKyAgICB7CisJR3RrV2lkZ2V0ICphbGlnbm1lbnQ7CisKKwllbnRyeSA9IGd0a19lbnRyeV9uZXcoKTsKKwlndGtfd2lkZ2V0X3Nob3coZW50cnkpOworCisJdGV4dCA9IENPTlZFUlRfVE9fVVRGOCh0ZXh0ZmllbGQpOworCWd0a19lbnRyeV9zZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpLCAoY29uc3QgY2hhciAqKXRleHQpOworCUNPTlZFUlRfVE9fVVRGOF9GUkVFKHRleHQpOworCisJYWxpZ25tZW50ID0gZ3RrX2FsaWdubWVudF9uZXcoKGZsb2F0KTAuNSwgKGZsb2F0KTAuNSwKKwkJCQkJCSAgICAgIChmbG9hdCkxLjAsIChmbG9hdCkxLjApOworCWd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoYWxpZ25tZW50KSwgZW50cnkpOworCWd0a19jb250YWluZXJfc2V0X2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKGFsaWdubWVudCksIDUpOworCWd0a193aWRnZXRfc2hvdyhhbGlnbm1lbnQpOworCisJZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goR1RLX0RJQUxPRyhkaWFsb2cpLT52Ym94KSwKKwkJCSAgIGFsaWdubWVudCwgVFJVRSwgRkFMU0UsIDApOworCWRpYWxvZ2luZm8ubm9hbHQgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorCWRpYWxvZ2luZm8ubm9hbHQgPSBUUlVFOworCisgICAgLyogQWxsb3cgYWN0aXZhdGlvbiBvZiBtbmVtb25pYyBhY2NlbGVyYXRvcnMgd2l0aG91dCBwcmVzc2luZyA8QWx0PiB3aGVuCisgICAgICogdGhlcmUgaXMgbm8gdGV4dGZpZWxkLiAgSGFuZGxlIHByZXNzaW5nIEVudGVyIGFuZCBFc2MuICovCisgICAgZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChkaWFsb2cpLCAia2V5X3ByZXNzX2V2ZW50IiwKKwkJCSBHX0NBTExCQUNLKCZkaWFsb2dfa2V5X3ByZXNzX2V2ZW50X2NiKSwgJmRpYWxvZ2luZm8pOworCisgICAgaWYgKGRlZl9idXQgPiAwKQorICAgIHsKKwlndGtfZGlhbG9nX3NldF9kZWZhdWx0X3Jlc3BvbnNlKEdUS19ESUFMT0coZGlhbG9nKSwgZGVmX2J1dCk7CisJZGlhbG9naW5mby5pZ25vcmVfZW50ZXIgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorCS8qIE5vIGRlZmF1bHQgYnV0dG9uLCBpZ25vcmUgcHJlc3NpbmcgRW50ZXIuICovCisJZGlhbG9naW5mby5pZ25vcmVfZW50ZXIgPSBUUlVFOworCisgICAgLyogU2hvdyB0aGUgbW91c2UgcG9pbnRlciBpZiBpdCdzIGN1cnJlbnRseSBoaWRkZW4uICovCisgICAgZ3VpX21jaF9tb3VzZWhpZGUoRkFMU0UpOworCisgICAgcmVzcG9uc2UgPSBndGtfZGlhbG9nX3J1bihHVEtfRElBTE9HKGRpYWxvZykpOworCisgICAgLyogR1RLX1JFU1BPTlNFX05PTkUgbWVhbnMgdGhlIGRpYWxvZyB3YXMgcHJvZ3JhbW1hdGljYWxseSBkZXN0cm95ZWQuICovCisgICAgaWYgKHJlc3BvbnNlICE9IEdUS19SRVNQT05TRV9OT05FKQorICAgIHsKKwlpZiAodGV4dGZpZWxkICE9IE5VTEwpCisJeworCSAgICB0ZXh0ID0gKGNoYXJfdSAqKWd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpKTsKKwkgICAgdGV4dCA9IENPTlZFUlRfRlJPTV9VVEY4KHRleHQpOworCisJICAgIFNUUk5DUFkodGV4dGZpZWxkLCB0ZXh0LCBJT1NJWkUpOworCSAgICB0ZXh0ZmllbGRbSU9TSVpFIC0gMV0gPSBOVUw7CisKKwkgICAgQ09OVkVSVF9GUk9NX1VURjhfRlJFRSh0ZXh0KTsKKwl9CisJZ3RrX3dpZGdldF9kZXN0cm95KGRpYWxvZyk7CisgICAgfQorCisgICAgLyogVGVycmlibGUgaGFjazogV2hlbiB0aGUgdGV4dCBhcmVhIHN0aWxsIGhhcyBmb2N1cyB3aGVuIHdlIHJlbW92ZSB0aGUKKyAgICAgKiBkaWFsb2csIHNvbWVob3cgZ3ZpbSBsb3NlcyB3aW5kb3cgZm9jdXMuICBUaGlzIGlzIHdpdGggInBvaW50IHRvIHR5cGUiCisgICAgICogaW4gdGhlIEtERSAzLjEgd2luZG93IG1hbmFnZXIuICBXYXJwIHRoZSBtb3VzZSBwb2ludGVyIHRvIG91dHNpZGUgdGhlCisgICAgICogd2luZG93IGFuZCBiYWNrIHRvIGF2b2lkIHRoYXQuICovCisgICAgaWYgKCFndWkuaW5fZm9jdXMpCisgICAgeworCWludCB4LCB5OworCisJZ2RrX3dpbmRvd19nZXRfcG9pbnRlcihndWkuZHJhd2FyZWEtPndpbmRvdywgJngsICZ5LCBOVUxMKTsKKwlndWlfbWNoX3NldG1vdXNlKC0xMDAsIC0xMDApOworCWd1aV9tY2hfc2V0bW91c2UoeCwgeSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3BvbnNlID4gMCA/IHJlc3BvbnNlIDogMDsKK30KKworI2VuZGlmIC8qIEZFQVRfR1VJX0RJQUxPRyAmJiBIQVZFX0dUSzIgKi8KKworCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisKKyAgICB2b2lkCitndWlfbWNoX3Nob3dfcG9wdXBtZW51KHZpbW1lbnVfVCAqbWVudSkKK3sKKyMgaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChIQVZFX0dUSzIpCisgICAgLyoKKyAgICAgKiBBcHBlbmQgYSBzdWJtZW51IGZvciBzZWxlY3RpbmcgYW4gaW5wdXQgbWV0aG9kLglUaGlzIGlzCisgICAgICogY3VycmVudGx5IHRoZSBvbmx5IHdheSB0byBzd2l0Y2ggaW5wdXQgbWV0aG9kcyBhdCBydW50aW1lLgorICAgICAqLworICAgIGlmICh4aWMgIT0gTlVMTCAmJiBnX29iamVjdF9nZXRfZGF0YShHX09CSkVDVChtZW51LT5zdWJtZW51X2lkKSwKKwkJCQkJICJ2aW0taGFzLWltLW1lbnUiKSA9PSBOVUxMKQorICAgIHsKKwlHdGtXaWRnZXQgICAqbWVudWl0ZW07CisJR3RrV2lkZ2V0ICAgKnN1Ym1lbnU7CisJY2hhcl91CSAgICAqbmFtZTsKKworCW1lbnVpdGVtID0gZ3RrX3NlcGFyYXRvcl9tZW51X2l0ZW1fbmV3KCk7CisJZ3RrX3dpZGdldF9zaG93KG1lbnVpdGVtKTsKKwlndGtfbWVudV9zaGVsbF9hcHBlbmQoR1RLX01FTlVfU0hFTEwobWVudS0+c3VibWVudV9pZCksIG1lbnVpdGVtKTsKKworCW5hbWUgPSAoY2hhcl91ICopXygiSW5wdXQgX01ldGhvZHMiKTsKKwluYW1lID0gQ09OVkVSVF9UT19VVEY4KG5hbWUpOworCW1lbnVpdGVtID0gZ3RrX21lbnVfaXRlbV9uZXdfd2l0aF9tbmVtb25pYygoY29uc3QgY2hhciAqKW5hbWUpOworCUNPTlZFUlRfVE9fVVRGOF9GUkVFKG5hbWUpOworCWd0a193aWRnZXRfc2hvdyhtZW51aXRlbSk7CisKKwlzdWJtZW51ID0gZ3RrX21lbnVfbmV3KCk7CisJZ3RrX21lbnVfaXRlbV9zZXRfc3VibWVudShHVEtfTUVOVV9JVEVNKG1lbnVpdGVtKSwgc3VibWVudSk7CisJZ3RrX21lbnVfc2hlbGxfYXBwZW5kKEdUS19NRU5VX1NIRUxMKG1lbnUtPnN1Ym1lbnVfaWQpLCBtZW51aXRlbSk7CisKKwlndGtfaW1fbXVsdGljb250ZXh0X2FwcGVuZF9tZW51aXRlbXMoR1RLX0lNX01VTFRJQ09OVEVYVCh4aWMpLAorCQkJCQkgICAgIEdUS19NRU5VX1NIRUxMKHN1Ym1lbnUpKTsKKwlnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChtZW51LT5zdWJtZW51X2lkKSwKKwkJCSAgInZpbS1oYXMtaW0tbWVudSIsIEdJTlRfVE9fUE9JTlRFUihUUlVFKSk7CisgICAgfQorIyBlbmRpZiAvKiBGRUFUX1hJTSAmJiBIQVZFX0dUSzIgKi8KKworICAgIGd0a19tZW51X3BvcHVwKEdUS19NRU5VKG1lbnUtPnN1Ym1lbnVfaWQpLAorCQkgICBOVUxMLCBOVUxMLAorCQkgICAoR3RrTWVudVBvc2l0aW9uRnVuYylOVUxMLCBOVUxMLAorCQkgICAzVSwgKGd1aW50MzIpR0RLX0NVUlJFTlRfVElNRSk7Cit9CisKKy8qCisgKiBNZW51IHBvc2l0aW9uIGNhbGxiYWNrOyB1c2VkIGJ5IGd1aV9tYWtlX3BvcHVwKCkgdG8gcGxhY2UgdGhlIG1lbnUKKyAqIGF0IHRoZSBjdXJyZW50IHRleHQgY3Vyc29yIHBvc2l0aW9uLgorICoKKyAqIE5vdGU6IFRoZSBwdXNoX2luIG91dHB1dCBhcmd1bWVudCBzZWVtcyB0byBhZmZlY3Qgc2Nyb2xsaW5nIG9mIGh1Z2UKKyAqIG1lbnVzIHRoYXQgZG9uJ3QgZml0IG9uIHRoZSBzY3JlZW4uCUxlYXZlIGl0IGF0IHRoZSBkZWZhdWx0IGZvciBub3cuCisgKi8KKy8qQVJHU1VTRUQwKi8KKyAgICBzdGF0aWMgdm9pZAorcG9wdXBfbWVudV9wb3NpdGlvbl9mdW5jKEd0a01lbnUgKm1lbnUsCisJCQkgZ2ludCAqeCwgZ2ludCAqeSwKKyMgaWZkZWYgSEFWRV9HVEsyCisJCQkgZ2Jvb2xlYW4gKnB1c2hfaW4sCisjIGVuZGlmCisJCQkgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICAgIGlmIChjdXJ3aW4gIT0gTlVMTCAmJiBndWkuZHJhd2FyZWEgIT0gTlVMTCAmJiBndWkuZHJhd2FyZWEtPndpbmRvdyAhPSBOVUxMKQorICAgIHsKKwlnZGtfd2luZG93X2dldF9vcmlnaW4oZ3VpLmRyYXdhcmVhLT53aW5kb3csIHgsIHkpOworCisJLyogRmluZCB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IHdpbmRvdyAqLworCSp4ICs9IEZJTExfWChXX1dJTkNPTChjdXJ3aW4pICsgY3Vyd2luLT53X3djb2wgKyAxKSArIDE7CisJKnkgKz0gRklMTF9ZKFdfV0lOUk9XKGN1cndpbikgKyBjdXJ3aW4tPndfd3JvdyArIDEpICsgMTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWFrZV9wb3B1cChjaGFyX3UgKnBhdGhfbmFtZSkKK3sKKyAgICB2aW1tZW51X1QgKm1lbnU7CisKKyAgICBtZW51ID0gZ3VpX2ZpbmRfbWVudShwYXRoX25hbWUpOworCisgICAgaWYgKG1lbnUgIT0gTlVMTCAmJiBtZW51LT5zdWJtZW51X2lkICE9IE5VTEwpCisgICAgeworCWd0a19tZW51X3BvcHVwKEdUS19NRU5VKG1lbnUtPnN1Ym1lbnVfaWQpLAorCQkgICAgICAgTlVMTCwgTlVMTCwKKwkJICAgICAgICZwb3B1cF9tZW51X3Bvc2l0aW9uX2Z1bmMsIE5VTEwsCisJCSAgICAgICAwVSwgKGd1aW50MzIpR0RLX0NVUlJFTlRfVElNRSk7CisgICAgfQorfQorCisjZW5kaWYgLyogRkVBVF9NRU5VICovCisKKworLyoKKyAqIFdlIGRvbid0IGNyZWF0ZSBpdCB0d2ljZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfU2hhcmVkRmluZFJlcGxhY2UKK3sKKyAgICBHdGtXaWRnZXQgKmRpYWxvZzsJLyogdGhlIG1haW4gZGlhbG9nIHdpZGdldCAqLworICAgIEd0a1dpZGdldCAqd3dvcmQ7CS8qICdXaG9sZSB3b3JkIG9ubHknIGNoZWNrIGJ1dHRvbiAqLworICAgIEd0a1dpZGdldCAqbWNhc2U7CS8qICdNYXRjaCBjYXNlJyBjaGVjayBidXR0b24gKi8KKyAgICBHdGtXaWRnZXQgKnVwOwkvKiBzZWFyY2ggZGlyZWN0aW9uICdVcCcgcmFkaW8gYnV0dG9uICovCisgICAgR3RrV2lkZ2V0ICpkb3duOwkvKiBzZWFyY2ggZGlyZWN0aW9uICdEb3duJyByYWRpbyBidXR0b24gKi8KKyAgICBHdGtXaWRnZXQgKndoYXQ7CS8qICdGaW5kIHdoYXQnIGVudHJ5IHRleHQgd2lkZ2V0ICovCisgICAgR3RrV2lkZ2V0ICp3aXRoOwkvKiAnUmVwbGFjZSB3aXRoJyBlbnRyeSB0ZXh0IHdpZGdldCAqLworICAgIEd0a1dpZGdldCAqZmluZDsJLyogJ0ZpbmQgTmV4dCcgYWN0aW9uIGJ1dHRvbiAqLworICAgIEd0a1dpZGdldCAqcmVwbGFjZTsJLyogJ1JlcGxhY2UgV2l0aCcgYWN0aW9uIGJ1dHRvbiAqLworICAgIEd0a1dpZGdldCAqYWxsOwkvKiAnUmVwbGFjZSBBbGwnIGFjdGlvbiBidXR0b24gKi8KK30gU2hhcmVkRmluZFJlcGxhY2U7CisKK3N0YXRpYyBTaGFyZWRGaW5kUmVwbGFjZSBmaW5kX3dpZGdldHMgPSB7IE5VTEwsIH07CitzdGF0aWMgU2hhcmVkRmluZFJlcGxhY2UgcmVwbF93aWRnZXRzID0geyBOVUxMLCB9OworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRfa2V5X3ByZXNzX2V2ZW50KAorCQlHdGtXaWRnZXQJKndpZGdldCwKKwkJR2RrRXZlbnRLZXkJKmV2ZW50LAorCQlTaGFyZWRGaW5kUmVwbGFjZSAqZnJkcCkKK3sKKyAgICAvKiBJZiB0aGUgdXNlciBpcyBob2xkaW5nIG9uZSBvZiB0aGUga2V5IG1vZGlmaWVycyB3ZSB3aWxsIGp1c3QgYmFpbCBvdXQsCisgICAgICogdGh1cyBwcmVzZXJ2aW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBub3JtYWwgZm9jdXMgdHJhdmVyc2FsLgorICAgICAqLworICAgIGlmIChldmVudC0+c3RhdGUgJiAoR0RLX0NPTlRST0xfTUFTSyB8IEdES19TSElGVF9NQVNLKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiB0aGUgRXNjYXBlIGtleSBzeW50aGVzaXplcyBhIGNhbmNlbGxhdGlvbiBhY3Rpb24gKi8KKyAgICBpZiAoZXZlbnQtPmtleXZhbCA9PSBHREtfRXNjYXBlKQorICAgIHsKKwlndGtfd2lkZ2V0X2hpZGUoZnJkcC0+ZGlhbG9nKTsKKworCXJldHVybiBUUlVFOworICAgIH0KKyAgICAvKgorICAgICAqIFdoYXQgdGhlICoqKiogaXMgdGhpcyBmb3I/ICBEaXNhYmxlZCBmb3IgR1RLKyAyIGJlY2F1c2UgZHVlIHRvCisgICAgICogZ3RrX3NpZ25hbF9jb25uZWN0X2FmdGVyKCkgaXQgZG9lc24ndCBoYXZlIGFueSBlZmZlY3QgYW55d2F5LgorICAgICAqIChGb3J0dW5hdGVseS4pCisgICAgICovCisjaWZuZGVmIEhBVkVfR1RLMgorICAgIC8qIGJsb2NrIHRyYXZlcnNhbCByZXN1bHRpbmcgZnJvbSB0aG9zZSBrZXlzICovCisgICAgaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX0xlZnQKKwkgICAgfHwgZXZlbnQtPmtleXZhbCA9PSBHREtfUmlnaHQKKwkgICAgfHwgZXZlbnQtPmtleXZhbCA9PSBHREtfc3BhY2UpCisJcmV0dXJuIFRSVUU7CisjZW5kaWYKKworICAgIC8qIEl0IHdvdWxkIGJlIGRlbGlnaHRmdWxsIGlmIGl0IHdoZXJlIHBvc3NpYmxlIHRvIGRvIHNlYXJjaCBoaXN0b3J5CisgICAgICogb3BlcmF0aW9ucyBvbiB0aGUgS19VUCBhbmQgS19ET1dOIGtleXMgaGVyZS4KKyAgICAgKi8KKworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIEhBVkVfR1RLMgorICAgIHN0YXRpYyBHdGtXaWRnZXQgKgorY3JlYXRlX2ltYWdlX2J1dHRvbihjb25zdCBjaGFyICpzdG9ja19pZCwgY29uc3QgY2hhciAqbGFiZWwpCit7CisgICAgY2hhcl91CSp0ZXh0OworICAgIEd0a1dpZGdldAkqYm94OworICAgIEd0a1dpZGdldAkqYWxpZ25tZW50OworICAgIEd0a1dpZGdldAkqYnV0dG9uOworCisgICAgdGV4dCA9IENPTlZFUlRfVE9fVVRGOCgoY2hhcl91ICopbGFiZWwpOworCisgICAgYm94ID0gZ3RrX2hib3hfbmV3KEZBTFNFLCAzKTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChib3gpLAorCQkgICAgICAgZ3RrX2ltYWdlX25ld19mcm9tX3N0b2NrKHN0b2NrX2lkLCBHVEtfSUNPTl9TSVpFX0JVVFRPTiksCisJCSAgICAgICBGQUxTRSwgRkFMU0UsIDApOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKGJveCksCisJCSAgICAgICBndGtfbGFiZWxfbmV3KChjb25zdCBjaGFyICopdGV4dCksCisJCSAgICAgICBGQUxTRSwgRkFMU0UsIDApOworCisgICAgQ09OVkVSVF9UT19VVEY4X0ZSRUUodGV4dCk7CisKKyAgICBhbGlnbm1lbnQgPSBndGtfYWxpZ25tZW50X25ldygoZmxvYXQpMC41LCAoZmxvYXQpMC41LAorCQkJCQkJICAgICAgKGZsb2F0KTAuMCwgKGZsb2F0KTAuMCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihhbGlnbm1lbnQpLCBib3gpOworICAgIGd0a193aWRnZXRfc2hvd19hbGwoYWxpZ25tZW50KTsKKworICAgIGJ1dHRvbiA9IGd0a19idXR0b25fbmV3KCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihidXR0b24pLCBhbGlnbm1lbnQpOworCisgICAgcmV0dXJuIGJ1dHRvbjsKK30KKworLyoKKyAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSBmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZSgpLCBhbmQKKyAqIEknZCByZWFsbHkgbGlrZSB0byBrZWVwIGl0IGF0IHRoYXQuCUluIG90aGVyIHdvcmRzOiBkb24ndCBzcHJlYWQKKyAqIHRoaXMgbmFzdHkgaGFjayBhbGwgb3ZlciB0aGUgY29kZS4gIFRoaW5rIHR3aWNlLgorICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKgorY29udmVydF9sb2NhbGl6ZWRfbWVzc2FnZShjaGFyX3UgKipidWZmZXIsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgaWYgKG91dHB1dF9jb252LnZjX3R5cGUgPT0gQ09OVl9OT05FKQorCXJldHVybiBtZXNzYWdlOworCisgICAgdmltX2ZyZWUoKmJ1ZmZlcik7CisgICAgKmJ1ZmZlciA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgKGNoYXJfdSAqKW1lc3NhZ2UsIE5VTEwpOworCisgICAgcmV0dXJuIChjb25zdCBjaGFyICopKmJ1ZmZlcjsKK30KKyNlbmRpZiAvKiBIQVZFX0dUSzIgKi8KKworICAgIHN0YXRpYyB2b2lkCitmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZShjaGFyX3UgKmFyZywgaW50IGRvX3JlcGxhY2UpCit7CisjaWZuZGVmIEhBVkVfR1RLMgorICAgIEd0a1dpZGdldAkqZnJhbWU7CisjZW5kaWYKKyAgICBHdGtXaWRnZXQJKmhib3g7CQkvKiBtYWluIHRvcCBkb3duIGJveCAqLworICAgIEd0a1dpZGdldAkqYWN0aW9uYXJlYTsKKyAgICBHdGtXaWRnZXQJKnRhYmxlOworICAgIEd0a1dpZGdldAkqdG1wOworICAgIEd0a1dpZGdldAkqdmJveDsKKyAgICBnYm9vbGVhbglzZW5zaXRpdmU7CisgICAgU2hhcmVkRmluZFJlcGxhY2UgKmZyZHA7CisgICAgY2hhcl91CSplbnRyeV90ZXh0OworICAgIGludAkJd3dvcmQgPSBGQUxTRTsKKyAgICBpbnQJCW1jYXNlID0gIXBfaWM7CisjaWZkZWYgSEFWRV9HVEsyCisgICAgY2hhcl91CSpjb252X2J1ZmZlciA9IE5VTEw7CisjICAgZGVmaW5lIENPTlYobWVzc2FnZSkgY29udmVydF9sb2NhbGl6ZWRfbWVzc2FnZSgmY29udl9idWZmZXIsIChtZXNzYWdlKSkKKyNlbHNlCisjICAgZGVmaW5lIENPTlYobWVzc2FnZSkgKG1lc3NhZ2UpCisjZW5kaWYKKworICAgIGZyZHAgPSAoZG9fcmVwbGFjZSkgPyAoJnJlcGxfd2lkZ2V0cykgOiAoJmZpbmRfd2lkZ2V0cyk7CisKKyAgICAvKiBHZXQgdGhlIHNlYXJjaCBzdHJpbmcgdG8gdXNlLiAqLworICAgIGVudHJ5X3RleHQgPSBnZXRfZmluZF9kaWFsb2dfdGV4dChhcmcsICZ3d29yZCwgJm1jYXNlKTsKKworI2lmZGVmIEhBVkVfR1RLMgorICAgIGlmIChlbnRyeV90ZXh0ICE9IE5VTEwgJiYgb3V0cHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisgICAgeworCWNoYXJfdSAqb2xkX3RleHQgPSBlbnRyeV90ZXh0OworCWVudHJ5X3RleHQgPSBzdHJpbmdfY29udmVydCgmb3V0cHV0X2NvbnYsIGVudHJ5X3RleHQsIE5VTEwpOworCXZpbV9mcmVlKG9sZF90ZXh0KTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgdGhlIGRpYWxvZyBhbHJlYWR5IGV4aXN0cywganVzdCByYWlzZSBpdC4KKyAgICAgKi8KKyAgICBpZiAoZnJkcC0+ZGlhbG9nKQorICAgIHsKKyNpZm5kZWYgSEFWRV9HVEsyCisJLyogYWx3YXlzIG1ha2UgdGhlIGRpYWxvZyBhcHBlYXIgd2hlcmUgeW91IHdhbnQgaXQgZXZlbiBpZiB0aGUgbWFpbndpbgorCSAqIGhhcyBtb3ZlZCAtLSBkYnYgKi8KKwlndWlfZ3RrX3Bvc2l0aW9uX2luX3BhcmVudChHVEtfV0lER0VUKGd1aS5tYWlud2luKSwKKwkJCQkgICAgICBHVEtfV0lER0VUKGZyZHAtPmRpYWxvZyksIFZXX1BPU19NT1VTRSk7CisJZ3VpX2d0a19zeW5jaF9mb250cygpOworCisJaWYgKCFHVEtfV0lER0VUX1ZJU0lCTEUoZnJkcC0+ZGlhbG9nKSkKKwl7CisJICAgIGd0a193aWRnZXRfZ3JhYl9mb2N1cyhmcmRwLT53aGF0KTsKKwkgICAgZ3RrX3dpZGdldF9zaG93KGZyZHAtPmRpYWxvZyk7CisJfQorI2VuZGlmCisJaWYgKGVudHJ5X3RleHQgIT0gTlVMTCkKKwl7CisJICAgIGd0a19lbnRyeV9zZXRfdGV4dChHVEtfRU5UUlkoZnJkcC0+d2hhdCksIChjaGFyICopZW50cnlfdGV4dCk7CisJICAgIGd0a190b2dnbGVfYnV0dG9uX3NldF9zdGF0ZShHVEtfVE9HR0xFX0JVVFRPTihmcmRwLT53d29yZCksCisJCQkJCQkJICAgICAoZ2Jvb2xlYW4pd3dvcmQpOworCSAgICBndGtfdG9nZ2xlX2J1dHRvbl9zZXRfc3RhdGUoR1RLX1RPR0dMRV9CVVRUT04oZnJkcC0+bWNhc2UpLAorCQkJCQkJCSAgICAgKGdib29sZWFuKW1jYXNlKTsKKwl9CisjaWZkZWYgSEFWRV9HVEsyCisJZ3RrX3dpbmRvd19wcmVzZW50KEdUS19XSU5ET1coZnJkcC0+ZGlhbG9nKSk7CisjZWxzZQorCWdka193aW5kb3dfcmFpc2UoZnJkcC0+ZGlhbG9nLT53aW5kb3cpOworI2VuZGlmCisJdmltX2ZyZWUoZW50cnlfdGV4dCk7CisJcmV0dXJuOworICAgIH0KKworI2lmZGVmIEhBVkVfR1RLMgorICAgIGZyZHAtPmRpYWxvZyA9IGd0a19kaWFsb2dfbmV3KCk7CisgICAgZ3RrX2RpYWxvZ19zZXRfaGFzX3NlcGFyYXRvcihHVEtfRElBTE9HKGZyZHAtPmRpYWxvZyksIEZBTFNFKTsKKyAgICBndGtfd2luZG93X3NldF90cmFuc2llbnRfZm9yKEdUS19XSU5ET1coZnJkcC0+ZGlhbG9nKSwgR1RLX1dJTkRPVyhndWkubWFpbndpbikpOworICAgIGd0a193aW5kb3dfc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnQoR1RLX1dJTkRPVyhmcmRwLT5kaWFsb2cpLCBUUlVFKTsKKyNlbHNlCisgICAgZnJkcC0+ZGlhbG9nID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19ESUFMT0cpOworI2VuZGlmCisKKyAgICBpZiAoZG9fcmVwbGFjZSkKKyAgICB7CisjaWZuZGVmIEhBVkVfR1RLMgorCWd0a193aW5kb3dfc2V0X3dtY2xhc3MoR1RLX1dJTkRPVyhmcmRwLT5kaWFsb2cpLCAic2VhcmNocmVwbCIsICJndmltIik7CisjZW5kaWYKKwlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKGZyZHAtPmRpYWxvZyksCisJCQkgICAgIENPTlYoXygiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIikpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZm5kZWYgSEFWRV9HVEsyCisJZ3RrX3dpbmRvd19zZXRfd21jbGFzcyhHVEtfV0lORE9XKGZyZHAtPmRpYWxvZyksICJzZWFyY2giLCAiZ3ZpbSIpOworI2VuZGlmCisJZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyhmcmRwLT5kaWFsb2cpLAorCQkJICAgICBDT05WKF8oIlZJTSAtIFNlYXJjaC4uLiIpKSk7CisgICAgfQorCisjaWZuZGVmIEhBVkVfR1RLMiAvKiBVdHRlciBjcmFjay4gIFNodWRkZXIuICovCisgICAgZ3RrX3dpZGdldF9yZWFsaXplKGZyZHAtPmRpYWxvZyk7CisgICAgZ2RrX3dpbmRvd19zZXRfZGVjb3JhdGlvbnMoZnJkcC0+ZGlhbG9nLT53aW5kb3csCisJICAgIEdES19ERUNPUl9USVRMRSB8IEdES19ERUNPUl9CT1JERVIgfCBHREtfREVDT1JfUkVTSVpFSCk7CisgICAgZ2RrX3dpbmRvd19zZXRfZnVuY3Rpb25zKGZyZHAtPmRpYWxvZy0+d2luZG93LAorCSAgICBHREtfRlVOQ19SRVNJWkUgfCBHREtfRlVOQ19NT1ZFKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR1RLMgorICAgIC8qIHRoaXMgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gTW90aWYgc3R5bGUgd2luZG93IG1hbmFnZXJzICovCisgICAgZnJhbWUgPSBndGtfZnJhbWVfbmV3KE5VTEwpOworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZnJkcC0+ZGlhbG9nKSwgZnJhbWUpOworI2VuZGlmCisKKyAgICBoYm94ID0gZ3RrX2hib3hfbmV3KEZBTFNFLCAwKTsKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUihoYm94KSwgMTApOworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoR1RLX0RJQUxPRyhmcmRwLT5kaWFsb2cpLT52Ym94KSwgaGJveCk7CisjZWxzZQorICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZnJhbWUpLCBoYm94KTsKKyNlbmRpZgorCisgICAgaWYgKGRvX3JlcGxhY2UpCisJdGFibGUgPSBndGtfdGFibGVfbmV3KDEwMjQsIDQsIEZBTFNFKTsKKyAgICBlbHNlCisJdGFibGUgPSBndGtfdGFibGVfbmV3KDEwMjQsIDMsIEZBTFNFKTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChoYm94KSwgdGFibGUsIFRSVUUsIFRSVUUsIDApOworICAgIGd0a19jb250YWluZXJfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIodGFibGUpLCA0KTsKKworICAgIHRtcCA9IGd0a19sYWJlbF9uZXcoQ09OVihfKCJGaW5kIHdoYXQ6IikpKTsKKyAgICBndGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKHRtcCksIChnZmxvYXQpMC4wLCAoZ2Zsb2F0KTAuNSk7CisgICAgZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCB0bXAsIDAsIDEsIDAsIDEsCisJCSAgICAgR1RLX0ZJTEwsIEdUS19FWFBBTkQsIDIsIDIpOworICAgIGZyZHAtPndoYXQgPSBndGtfZW50cnlfbmV3KCk7CisgICAgc2Vuc2l0aXZlID0gKGVudHJ5X3RleHQgIT0gTlVMTCAmJiBlbnRyeV90ZXh0WzBdICE9IE5VTCk7CisgICAgaWYgKGVudHJ5X3RleHQgIT0gTlVMTCkKKwlndGtfZW50cnlfc2V0X3RleHQoR1RLX0VOVFJZKGZyZHAtPndoYXQpLCAoY2hhciAqKWVudHJ5X3RleHQpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGZyZHAtPndoYXQpLCAiY2hhbmdlZCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoZW50cnlfY2hhbmdlZF9jYiksIGZyZHAtPmRpYWxvZyk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0X2FmdGVyKEdUS19PQkpFQ1QoZnJkcC0+d2hhdCksICJrZXlfcHJlc3NfZXZlbnQiLAorCQkJCSBHVEtfU0lHTkFMX0ZVTkMoZmluZF9rZXlfcHJlc3NfZXZlbnQpLAorCQkJCSAoZ3BvaW50ZXIpIGZyZHApOworICAgIGd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgZnJkcC0+d2hhdCwgMSwgMTAyNCwgMCwgMSwKKwkJICAgICBHVEtfRVhQQU5EIHwgR1RLX0ZJTEwsIEdUS19FWFBBTkQsIDIsIDIpOworCisgICAgaWYgKGRvX3JlcGxhY2UpCisgICAgeworCXRtcCA9IGd0a19sYWJlbF9uZXcoQ09OVihfKCJSZXBsYWNlIHdpdGg6IikpKTsKKwlndGtfbWlzY19zZXRfYWxpZ25tZW50KEdUS19NSVNDKHRtcCksIChnZmxvYXQpMC4wLCAoZ2Zsb2F0KTAuNSk7CisJZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCB0bXAsIDAsIDEsIDEsIDIsCisJCQkgR1RLX0ZJTEwsIEdUS19FWFBBTkQsIDIsIDIpOworCWZyZHAtPndpdGggPSBndGtfZW50cnlfbmV3KCk7CisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZnJkcC0+d2l0aCksICJhY3RpdmF0ZSIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMoZmluZF9yZXBsYWNlX2NiKSwKKwkJCSAgIEdJTlRfVE9fUE9JTlRFUihGUkRfUl9GSU5ETkVYVCkpOworCWd0a19zaWduYWxfY29ubmVjdF9hZnRlcihHVEtfT0JKRUNUKGZyZHAtPndpdGgpLCAia2V5X3ByZXNzX2V2ZW50IiwKKwkJCQkgR1RLX1NJR05BTF9GVU5DKGZpbmRfa2V5X3ByZXNzX2V2ZW50KSwKKwkJCQkgKGdwb2ludGVyKSBmcmRwKTsKKwlndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIGZyZHAtPndpdGgsIDEsIDEwMjQsIDEsIDIsCisJCQkgR1RLX0VYUEFORCB8IEdUS19GSUxMLCBHVEtfRVhQQU5ELCAyLCAyKTsKKworCS8qCisJICogTWFrZSB0aGUgZW50cnkgYWN0aXZhdGlvbiBvbmx5IGNoYW5nZSB0aGUgaW5wdXQgZm9jdXMgb250byB0aGUKKwkgKiB3aXRoIGl0ZW0uCisJICovCisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZnJkcC0+d2hhdCksICJhY3RpdmF0ZSIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMoZW50cnlfYWN0aXZhdGVfY2IpLCBmcmRwLT53aXRoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIE1ha2UgdGhlIGVudHJ5IGFjdGl2YXRpb24gZG8gdGhlIHNlYXJjaC4KKwkgKi8KKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChmcmRwLT53aGF0KSwgImFjdGl2YXRlIiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQyhmaW5kX3JlcGxhY2VfY2IpLAorCQkJICAgR0lOVF9UT19QT0lOVEVSKEZSRF9GSU5ETkVYVCkpOworICAgIH0KKworICAgIC8qIHdob2xlIHdvcmQgb25seSBidXR0b24gKi8KKyAgICBmcmRwLT53d29yZCA9IGd0a19jaGVja19idXR0b25fbmV3X3dpdGhfbGFiZWwoQ09OVihfKCJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiKSkpOworICAgIGd0a190b2dnbGVfYnV0dG9uX3NldF9zdGF0ZShHVEtfVE9HR0xFX0JVVFRPTihmcmRwLT53d29yZCksCisJCQkJCQkJKGdib29sZWFuKXd3b3JkKTsKKyAgICBpZiAoZG9fcmVwbGFjZSkKKwlndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIGZyZHAtPnd3b3JkLCAwLCAxMDIzLCAyLCAzLAorCQkJIEdUS19GSUxMLCBHVEtfRVhQQU5ELCAyLCAyKTsKKyAgICBlbHNlCisJZ3RrX3RhYmxlX2F0dGFjaChHVEtfVEFCTEUodGFibGUpLCBmcmRwLT53d29yZCwgMCwgMTAyMywgMSwgMiwKKwkJCSBHVEtfRklMTCwgR1RLX0VYUEFORCwgMiwgMik7CisKKyAgICAvKiBtYXRjaCBjYXNlIGJ1dHRvbiAqLworICAgIGZyZHAtPm1jYXNlID0gZ3RrX2NoZWNrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbChDT05WKF8oIk1hdGNoIGNhc2UiKSkpOworICAgIGd0a190b2dnbGVfYnV0dG9uX3NldF9zdGF0ZShHVEtfVE9HR0xFX0JVVFRPTihmcmRwLT5tY2FzZSksCisJCQkJCQkJICAgICAoZ2Jvb2xlYW4pbWNhc2UpOworICAgIGlmIChkb19yZXBsYWNlKQorCWd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgZnJkcC0+bWNhc2UsIDAsIDEwMjMsIDMsIDQsCisJCQkgR1RLX0ZJTEwsIEdUS19FWFBBTkQsIDIsIDIpOworICAgIGVsc2UKKwlndGtfdGFibGVfYXR0YWNoKEdUS19UQUJMRSh0YWJsZSksIGZyZHAtPm1jYXNlLCAwLCAxMDIzLCAyLCAzLAorCQkJIEdUS19GSUxMLCBHVEtfRVhQQU5ELCAyLCAyKTsKKworICAgIHRtcCA9IGd0a19mcmFtZV9uZXcoQ09OVihfKCJEaXJlY3Rpb24iKSkpOworICAgIGlmIChkb19yZXBsYWNlKQorCWd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgdG1wLCAxMDIzLCAxMDI0LCAyLCA0LAorCQkJIEdUS19GSUxMLCBHVEtfRklMTCwgMiwgMik7CisgICAgZWxzZQorCWd0a190YWJsZV9hdHRhY2goR1RLX1RBQkxFKHRhYmxlKSwgdG1wLCAxMDIzLCAxMDI0LCAxLCAzLAorCQkJIEdUS19GSUxMLCBHVEtfRklMTCwgMiwgMik7CisgICAgdmJveCA9IGd0a192Ym94X25ldyhGQUxTRSwgMCk7CisgICAgZ3RrX2NvbnRhaW5lcl9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUih2Ym94KSwgMCk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUih0bXApLCB2Ym94KTsKKworICAgIC8qICdVcCcgYW5kICdEb3duJyBidXR0b25zICovCisgICAgZnJkcC0+dXAgPSBndGtfcmFkaW9fYnV0dG9uX25ld193aXRoX2xhYmVsKE5VTEwsIENPTlYoXygiVXAiKSkpOworICAgIGd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKHZib3gpLCBmcmRwLT51cCwgVFJVRSwgVFJVRSwgMCk7CisgICAgZnJkcC0+ZG93biA9IGd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWwoCisJCQlndGtfcmFkaW9fYnV0dG9uX2dyb3VwKEdUS19SQURJT19CVVRUT04oZnJkcC0+dXApKSwKKwkJCUNPTlYoXygiRG93biIpKSk7CisgICAgZ3RrX3RvZ2dsZV9idXR0b25fc2V0X3N0YXRlKEdUS19UT0dHTEVfQlVUVE9OKGZyZHAtPmRvd24pLCBUUlVFKTsKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGgoR1RLX0NPTlRBSU5FUih2Ym94KSwgMik7CisjZW5kaWYKKyAgICBndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgZnJkcC0+ZG93biwgVFJVRSwgVFJVRSwgMCk7CisKKyAgICAvKiB2Ym94IHRvIGhvbGQgdGhlIGFjdGlvbiBidXR0b25zICovCisgICAgYWN0aW9uYXJlYSA9IGd0a192YnV0dG9uX2JveF9uZXcoKTsKKyAgICBndGtfY29udGFpbmVyX2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKGFjdGlvbmFyZWEpLCAyKTsKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgaWYgKGRvX3JlcGxhY2UpCisgICAgeworCWd0a19idXR0b25fYm94X3NldF9sYXlvdXQoR1RLX0JVVFRPTl9CT1goYWN0aW9uYXJlYSksCisJCQkJICBHVEtfQlVUVE9OQk9YX0VORCk7CisJZ3RrX2J1dHRvbl9ib3hfc2V0X3NwYWNpbmcoR1RLX0JVVFRPTl9CT1goYWN0aW9uYXJlYSksIDApOworICAgIH0KKyNlbmRpZgorICAgIGd0a19ib3hfcGFja19lbmQoR1RLX0JPWChoYm94KSwgYWN0aW9uYXJlYSwgRkFMU0UsIEZBTFNFLCAwKTsKKworICAgIC8qICdGaW5kIE5leHQnIGJ1dHRvbiAqLworI2lmZGVmIEhBVkVfR1RLMgorICAgIGZyZHAtPmZpbmQgPSBjcmVhdGVfaW1hZ2VfYnV0dG9uKEdUS19TVE9DS19GSU5ELCBfKCJGaW5kIE5leHQiKSk7CisjZWxzZQorICAgIGZyZHAtPmZpbmQgPSBndGtfYnV0dG9uX25ld193aXRoX2xhYmVsKF8oIkZpbmQgTmV4dCIpKTsKKyNlbmRpZgorICAgIGd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShmcmRwLT5maW5kLCBzZW5zaXRpdmUpOworCisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZnJkcC0+ZmluZCksICJjbGlja2VkIiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhmaW5kX3JlcGxhY2VfY2IpLAorCQkgICAgICAgKGRvX3JlcGxhY2UpID8gR0lOVF9UT19QT0lOVEVSKEZSRF9SX0ZJTkRORVhUKQorCQkJCSAgICA6IEdJTlRfVE9fUE9JTlRFUihGUkRfRklORE5FWFQpKTsKKworICAgIEdUS19XSURHRVRfU0VUX0ZMQUdTKGZyZHAtPmZpbmQsIEdUS19DQU5fREVGQVVMVCk7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1goYWN0aW9uYXJlYSksIGZyZHAtPmZpbmQsIEZBTFNFLCBGQUxTRSwgMCk7CisgICAgZ3RrX3dpZGdldF9ncmFiX2RlZmF1bHQoZnJkcC0+ZmluZCk7CisKKyAgICBpZiAoZG9fcmVwbGFjZSkKKyAgICB7CisJLyogJ1JlcGxhY2UnIGJ1dHRvbiAqLworI2lmZGVmIEhBVkVfR1RLMgorCWZyZHAtPnJlcGxhY2UgPSBjcmVhdGVfaW1hZ2VfYnV0dG9uKEdUS19TVE9DS19DT05WRVJULCBfKCJSZXBsYWNlIikpOworI2Vsc2UKKwlmcmRwLT5yZXBsYWNlID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbChfKCJSZXBsYWNlIikpOworI2VuZGlmCisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGZyZHAtPnJlcGxhY2UsIHNlbnNpdGl2ZSk7CisJR1RLX1dJREdFVF9TRVRfRkxBR1MoZnJkcC0+cmVwbGFjZSwgR1RLX0NBTl9ERUZBVUxUKTsKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChhY3Rpb25hcmVhKSwgZnJkcC0+cmVwbGFjZSwgRkFMU0UsIEZBTFNFLCAwKTsKKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChmcmRwLT5yZXBsYWNlKSwgImNsaWNrZWQiLAorCQkJICAgR1RLX1NJR05BTF9GVU5DKGZpbmRfcmVwbGFjZV9jYiksCisJCQkgICBHSU5UX1RPX1BPSU5URVIoRlJEX1JFUExBQ0UpKTsKKworCS8qICdSZXBsYWNlIEFsbCcgYnV0dG9uICovCisjaWZkZWYgSEFWRV9HVEsyCisJZnJkcC0+YWxsID0gY3JlYXRlX2ltYWdlX2J1dHRvbihHVEtfU1RPQ0tfQ09OVkVSVCwgXygiUmVwbGFjZSBBbGwiKSk7CisjZWxzZQorCWZyZHAtPmFsbCA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwoXygiUmVwbGFjZSBBbGwiKSk7CisjZW5kaWYKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoZnJkcC0+YWxsLCBzZW5zaXRpdmUpOworCUdUS19XSURHRVRfU0VUX0ZMQUdTKGZyZHAtPmFsbCwgR1RLX0NBTl9ERUZBVUxUKTsKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWChhY3Rpb25hcmVhKSwgZnJkcC0+YWxsLCBGQUxTRSwgRkFMU0UsIDApOworCWd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGZyZHAtPmFsbCksICJjbGlja2VkIiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQyhmaW5kX3JlcGxhY2VfY2IpLAorCQkJICAgR0lOVF9UT19QT0lOVEVSKEZSRF9SRVBMQUNFQUxMKSk7CisgICAgfQorCisgICAgLyogJ0NhbmNlbCcgYnV0dG9uICovCisjaWZkZWYgSEFWRV9HVEsyCisgICAgdG1wID0gZ3RrX2J1dHRvbl9uZXdfZnJvbV9zdG9jayhHVEtfU1RPQ0tfQ0xPU0UpOworI2Vsc2UKKyAgICB0bXAgPSBndGtfYnV0dG9uX25ld193aXRoX2xhYmVsKF8oIkNhbmNlbCIpKTsKKyNlbmRpZgorICAgIEdUS19XSURHRVRfU0VUX0ZMQUdTKHRtcCwgR1RLX0NBTl9ERUZBVUxUKTsKKyAgICBndGtfYm94X3BhY2tfZW5kKEdUS19CT1goYWN0aW9uYXJlYSksIHRtcCwgRkFMU0UsIEZBTFNFLCAwKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3Rfb2JqZWN0KEdUS19PQkpFQ1QodG1wKSwKKwkJCSAgICAgICJjbGlja2VkIiwgR1RLX1NJR05BTF9GVU5DKGd0a193aWRnZXRfaGlkZSksCisJCQkgICAgICBHVEtfT0JKRUNUKGZyZHAtPmRpYWxvZykpOworICAgIGd0a19zaWduYWxfY29ubmVjdF9vYmplY3QoR1RLX09CSkVDVChmcmRwLT5kaWFsb2cpLAorCQkJICAgICAgImRlbGV0ZV9ldmVudCIsIEdUS19TSUdOQUxfRlVOQyhndGtfd2lkZ2V0X2hpZGVfb25fZGVsZXRlKSwKKwkJCSAgICAgIEdUS19PQkpFQ1QoZnJkcC0+ZGlhbG9nKSk7CisKKyAgICB0bXAgPSBndGtfdnNlcGFyYXRvcl9uZXcoKTsKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBndGtfYm94X3BhY2tfZW5kKEdUS19CT1goaGJveCksIHRtcCwgRkFMU0UsIEZBTFNFLCAxMCk7CisjZWxzZQorICAgIGd0a19ib3hfcGFja19lbmQoR1RLX0JPWChoYm94KSwgdG1wLCBGQUxTRSwgVFJVRSwgMCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dUSzIKKyAgICBndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZnJkcC0+d2hhdCk7CisKKyAgICAvKiBzaG93IHRoZSBmcmFtZSBhbmQgcmVhbGl6ZSB0aGUgZnJkcC0+ZGlhbG9nIHRoaXMgZ2l2ZXMgdXMgYSB3aW5kb3cgc2l6ZQorICAgICAqIHJlcXVlc3QgdGhhdCB3ZSdsbCB1c2UgdG8gcG9zaXRpb24gdGhlIHdpbmRvdyB3aXRoaW4gdGhlIGJvdW5kYXJ5IG9mCisgICAgICogdGhlIG1haW53aW4gLS1kYnYgKi8KKyAgICBndGtfd2lkZ2V0X3Nob3dfYWxsKGZyYW1lKTsKKyAgICBndWlfZ3RrX3Bvc2l0aW9uX2luX3BhcmVudChHVEtfV0lER0VUKGd1aS5tYWlud2luKSwKKwkJCQkgICAgICBHVEtfV0lER0VUKGZyZHAtPmRpYWxvZyksIFZXX1BPU19NT1VTRSk7CisgICAgZ3VpX2d0a19zeW5jaF9mb250cygpOworICAgIGd0a193aWRnZXRfc2hvd19hbGwoZnJkcC0+ZGlhbG9nKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HVEsyCisgICAgLyogU3VwcHJlc3MgYXV0b21hdGljIHNob3cgb2YgdGhlIHVudXNlZCBhY3Rpb24gYXJlYSAqLworICAgIGd0a193aWRnZXRfaGlkZShHVEtfRElBTE9HKGZyZHAtPmRpYWxvZyktPmFjdGlvbl9hcmVhKTsKKyAgICBndGtfd2lkZ2V0X3Nob3dfYWxsKGhib3gpOworICAgIGd0a193aWRnZXRfc2hvdyhmcmRwLT5kaWFsb2cpOworI2VuZGlmCisKKyAgICB2aW1fZnJlZShlbnRyeV90ZXh0KTsKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICB2aW1fZnJlZShjb252X2J1ZmZlcik7CisjZW5kaWYKKyN1bmRlZiBDT05WCit9CisKKyAgICB2b2lkCitndWlfbWNoX2ZpbmRfZGlhbG9nKGV4YXJnX1QgKmVhcCkKK3sKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZShlYXAtPmFyZywgRkFMU0UpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9yZXBsYWNlX2RpYWxvZyhleGFyZ19UICplYXApCit7CisgICAgaWYgKGd1aS5pbl91c2UpCisJZmluZF9yZXBsYWNlX2RpYWxvZ19jcmVhdGUoZWFwLT5hcmcsIFRSVUUpOworfQorCisKKyNpZiAhZGVmaW5lZChIQVZFX0dUSzIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU3luY2hyb25pemUgYWxsIGd1aSBlbGVtZW50cywgd2hpY2ggYXJlIGRlcGVuZGFudCB1cG9uIHRoZQorICogbWFpbiB0ZXh0IGZvbnQgdXNlZC4gVGhvc2UgYXJlIGluIGVzcC4gdGhlIGZpbmQvcmVwbGFjZSBkaWFsb2dzLgorICogSWYgeW91IGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoaXMgc2hvdWxkIGJlIG5lZWRlZCwgcGxlYXNlIHRyeSB0bworICogc2VhcmNoIGZvciAicGnEmcWbxIciIGluIGlzbzg4NTktMi4KKyAqCisgKiAoPGRhbmllbGs+IEkgY29udmVydGVkIHRoZSBjb21tZW50IGFib3ZlIHRvIFVURi04IHRvIHB1dAorICogIGEgc3RvcHBlciB0byB0aGUgZW5jb2RpbmcgbWVzcy4gIEZvcmdpdmUgbWUgOikKKyAqCisgKiBPYnNvbGV0ZSB3aXRoIEdUSzIuCisgKi8KKyAgICB2b2lkCitndWlfZ3RrX3N5bmNoX2ZvbnRzKHZvaWQpCit7CisgICAgU2hhcmVkRmluZFJlcGxhY2UgKmZyZHA7CisgICAgaW50IGRvX3JlcGxhY2U7CisKKyAgICAvKiBPSyB0aGlzIGxvb3AgaXMgYSBiaXQgdHJpY2t5Li4uICovCisgICAgZm9yIChkb19yZXBsYWNlID0gMDsgZG9fcmVwbGFjZSA8PSAxOyArK2RvX3JlcGxhY2UpCisgICAgeworCWZyZHAgPSAoZG9fcmVwbGFjZSkgPyAoJnJlcGxfd2lkZ2V0cykgOiAoJmZpbmRfd2lkZ2V0cyk7CisJaWYgKGZyZHAtPmRpYWxvZykKKwl7CisJICAgIEd0a1N0eWxlICpzdHlsZTsKKworCSAgICAvKiBzeW5jaCB0aGUgZm9udCB3aXRoIHdoYXRzIHVzZWQgYnkgdGhlIHRleHQgaXRzZWxmICovCisJICAgIHN0eWxlID0gZ3RrX3N0eWxlX2NvcHkoZ3RrX3dpZGdldF9nZXRfc3R5bGUoZnJkcC0+d2hhdCkpOworCSAgICBnZGtfZm9udF91bnJlZihzdHlsZS0+Zm9udCk7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwkgICAgaWYgKGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVCkKKwkJc3R5bGUtPmZvbnQgPSBndWkuZm9udHNldDsKKwkgICAgZWxzZQorIyBlbmRpZgorCQlzdHlsZS0+Zm9udCA9IGd1aS5ub3JtX2ZvbnQ7CisJICAgIGdka19mb250X3JlZihzdHlsZS0+Zm9udCk7CisJICAgIGd0a193aWRnZXRfc2V0X3N0eWxlKGZyZHAtPndoYXQsIHN0eWxlKTsKKwkgICAgZ3RrX3N0eWxlX3VucmVmKHN0eWxlKTsKKwkgICAgaWYgKGRvX3JlcGxhY2UpCisJICAgIHsKKwkJc3R5bGUgPSBndGtfc3R5bGVfY29weShndGtfd2lkZ2V0X2dldF9zdHlsZShmcmRwLT53aXRoKSk7CisJCWdka19mb250X3VucmVmKHN0eWxlLT5mb250KTsKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorCQlpZiAoZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUKQorCQkgICAgc3R5bGUtPmZvbnQgPSBndWkuZm9udHNldDsKKwkJZWxzZQorIyBlbmRpZgorCQkgICAgc3R5bGUtPmZvbnQgPSBndWkubm9ybV9mb250OworCQlnZGtfZm9udF9yZWYoc3R5bGUtPmZvbnQpOworCQlndGtfd2lkZ2V0X3NldF9zdHlsZShmcmRwLT53aXRoLCBzdHlsZSk7CisJCWd0a19zdHlsZV91bnJlZihzdHlsZSk7CisJICAgIH0KKwl9CisgICAgfQorfQorI2VuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworCisvKgorICogQ2FsbGJhY2sgZm9yIGFjdGlvbnMgb2YgdGhlIGZpbmQgYW5kIHJlcGxhY2UgZGlhbG9ncworICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZmluZF9yZXBsYWNlX2NiKEd0a1dpZGdldCAqd2lkZ2V0LCBncG9pbnRlciBkYXRhKQoreworICAgIGludAkJCWZsYWdzOworICAgIGNoYXJfdQkJKmZpbmRfdGV4dDsKKyAgICBjaGFyX3UJCSpyZXBsX3RleHQ7CisgICAgZ2Jvb2xlYW4JCWRpcmVjdGlvbl9kb3duOworICAgIFNoYXJlZEZpbmRSZXBsYWNlCSpzZnI7CisgICAgaW50CQkJcmM7CisKKyAgICBmbGFncyA9IChpbnQpKGxvbmcpZGF0YTsJICAgIC8qIGF2b2lkIGEgbGludCB3YXJuaW5nIGhlcmUgKi8KKworICAgIC8qIEdldCB0aGUgc2VhcmNoL3JlcGxhY2Ugc3RyaW5ncyBmcm9tIHRoZSBkaWFsb2cgKi8KKyAgICBpZiAoZmxhZ3MgPT0gRlJEX0ZJTkRORVhUKQorICAgIHsKKwlyZXBsX3RleHQgPSBOVUxMOworCXNmciA9ICZmaW5kX3dpZGdldHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmVwbF90ZXh0ID0gKGNoYXJfdSAqKWd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkocmVwbF93aWRnZXRzLndpdGgpKTsKKwlzZnIgPSAmcmVwbF93aWRnZXRzOworICAgIH0KKworICAgIGZpbmRfdGV4dCA9IChjaGFyX3UgKilndGtfZW50cnlfZ2V0X3RleHQoR1RLX0VOVFJZKHNmci0+d2hhdCkpOworICAgIGRpcmVjdGlvbl9kb3duID0gR1RLX1RPR0dMRV9CVVRUT04oc2ZyLT5kb3duKS0+YWN0aXZlOworCisgICAgaWYgKEdUS19UT0dHTEVfQlVUVE9OKHNmci0+d3dvcmQpLT5hY3RpdmUpCisJZmxhZ3MgfD0gRlJEX1dIT0xFX1dPUkQ7CisgICAgaWYgKEdUS19UT0dHTEVfQlVUVE9OKHNmci0+bWNhc2UpLT5hY3RpdmUpCisJZmxhZ3MgfD0gRlJEX01BVENIX0NBU0U7CisKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICByZXBsX3RleHQgPSBDT05WRVJUX0ZST01fVVRGOChyZXBsX3RleHQpOworICAgIGZpbmRfdGV4dCA9IENPTlZFUlRfRlJPTV9VVEY4KGZpbmRfdGV4dCk7CisjZW5kaWYKKyAgICByYyA9IGd1aV9kb19maW5kcmVwbChmbGFncywgZmluZF90ZXh0LCByZXBsX3RleHQsIGRpcmVjdGlvbl9kb3duKTsKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBDT05WRVJUX0ZST01fVVRGOF9GUkVFKHJlcGxfdGV4dCk7CisgICAgQ09OVkVSVF9GUk9NX1VURjhfRlJFRShmaW5kX3RleHQpOworI2VuZGlmCisKKyAgICBpZiAocmMgJiYgZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOyAvKiBtYWtlIHN1cmUgY21kIHdpbGwgYmUgaGFuZGxlZCBpbW1lZGlhdGVseSAqLworfQorCisvKiBvdXIgdXN1YWwgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitlbnRyeV9hY3RpdmF0ZV9jYihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBndGtfd2lkZ2V0X2dyYWJfZm9jdXMoR1RLX1dJREdFVChkYXRhKSk7Cit9CisKKy8qCisgKiBTeW5jaW5nIHRoZSBmaW5kL3JlcGxhY2UgZGlhbG9ncyBvbiB0aGUgZmx5IGlzIHV0dGVybHkgdXNlbGVzcyBjcmFjaywKKyAqIGFuZCBjYXVzZXMgbm90aGluZyBidXQgcHJvYmxlbXMuICBQbGVhc2UgdGVsbCBtZSBhIHVzZSBjYXNlIGZvciB3aGljaAorICogeW91J2QgbmVlZCBib3RoIGEgZmluZCBkaWFsb2cgYW5kIGEgZmluZC9yZXBsYWNlIG9uZSBhdCB0aGUgc2FtZSB0aW1lLAorICogd2l0aG91dCBiZWluZyBhYmxlIHRvIGFjdHVhbGx5IHVzZSB0aGVtIHNlcGFyYXRlbHkgc2luY2UgdGhleSdyZSBzeW5jaW5nCisgKiBhbGwgdGhlIHRpbWUuICBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGh3aGlsZSB0byBmaXggdGhpcyBub25zZW5zZSwKKyAqIHBhcnRpY3VsYXJseSBldmlsIGluY2FybmF0aW9uIG9mIGJyYWluZGVhZG5lc3MsIHdoYXRldmVyOyBJJ2QgbXVjaCByYXRoZXIKKyAqIHNlZSBpdCBleHRpbmd1aXNoZWQgZnJvbSB0aGlzIHBsYW5ldC4gIFRoYW5rcyBmb3IgbGlzdGVuaW5nLiAgU29ycnkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZW50cnlfY2hhbmdlZF9jYihHdGtXaWRnZXQgKiBlbnRyeSwgR3RrV2lkZ2V0ICogZGlhbG9nKQoreworICAgIGNvbnN0IGdjaGFyCSplbnRyeV90ZXh0OworICAgIGdib29sZWFuCW5vbmVtcHR5OworCisgICAgZW50cnlfdGV4dCA9IGd0a19lbnRyeV9nZXRfdGV4dChHVEtfRU5UUlkoZW50cnkpKTsKKworICAgIGlmICghZW50cnlfdGV4dCkKKwlyZXR1cm47CQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCisgICAgbm9uZW1wdHkgPSAoZW50cnlfdGV4dFswXSAhPSAnXDAnKTsKKworICAgIGlmIChkaWFsb2cgPT0gZmluZF93aWRnZXRzLmRpYWxvZykKKyAgICB7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGZpbmRfd2lkZ2V0cy5maW5kLCBub25lbXB0eSk7CisgICAgfQorCisgICAgaWYgKGRpYWxvZyA9PSByZXBsX3dpZGdldHMuZGlhbG9nKQorICAgIHsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUocmVwbF93aWRnZXRzLmZpbmQsIG5vbmVtcHR5KTsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUocmVwbF93aWRnZXRzLnJlcGxhY2UsIG5vbmVtcHR5KTsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUocmVwbF93aWRnZXRzLmFsbCwgbm9uZW1wdHkpOworICAgIH0KK30KKworLyoKKyAqICI6aGVscGZpbmQiCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X2hlbHBmaW5kKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgLyogVGhpcyB3aWxsIGZhaWwgd2hlbiBtZW51cyBhcmUgbm90IGxvYWRlZC4gIFdlbGwsIGl0J3Mgb25seSBmb3IKKyAgICAgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbnl3YXkuICovCisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJlbWVudSBUb29sQmFyLkZpbmRIZWxwIik7Cit9CisKKyNpZiAhZGVmaW5lZChIQVZFX0dUSzIpIHx8IGRlZmluZWQoUFJPVE8pIC8qIENyYWNrIGNyYWNrIGNyYWNrLiAgQnJycnIuICovCisKKy8qICBndWlfZ3RrX3Bvc2l0aW9uX2luX3BhcmVudAorICoKKyAqICB0aGlzIGZ1bmN0aW9uIGNhdXNlcyBhIGNoaWxkIHdpbmRvdyB0byBiZSBwbGFjZWQgd2l0aGluIHRoZSBib3VuZGFyeSBvZgorICogIHRoZSBwYXJlbnQgKG1haW53aW4pIHdpbmRvdy4KKyAqCisgKiAgeW91IGNhbiBzcGVjaWZ5IHdoZXJlIHRoZSB3aW5kb3cgd2lsbCBiZSBwb3NpdGlvbmVkIGJ5IHRoZSB0aGlyZCBhcmd1bWVudAorICogIChkZWZpbmVkIGluIGd1aS5oKToKKyAqCVZXX1BPU19DRU5URVIJCWF0IGNlbnRlciBvZiBwYXJlbnQgd2luZG93CisgKglWV19QT1NfTU9VU0UJCWNlbnRlciBvZiBjaGlsZCBhdCBtb3VzZSBwb3NpdGlvbgorICoJVldfUE9TX1RPUF9DRU5URVIJdG9wIG9mIGNoaWxkIGF0IHRvcCBvZiBwYXJlbnQgY2VudGVyZWQKKyAqCQkJCWhvcml6b250YWxseSBhYm91dCB0aGUgbW91c2UuCisgKgorICogIE5PVEU6IGZvciB0aGlzIGZ1bmN0aW9uIHRvIGFjdCBhcyBkZXNpcmVkIHRoZSBjaGlsZCB3aW5kb3cgbXVzdCBoYXZlIGEKKyAqCSAgd2luZG93IHNpemUgcmVxdWVzdGVkLiAgdGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHBhY2tpbmcvcGxhY2luZworICoJICBjaGlsZCB3aWRnZXRzIG9udG8gYSBndGtfZnJhbWUgd2lkZ2V0IHJhdGhlciB0aGFuIHRoZSBndGtfd2luZG93CisgKgkgIHdpZGdldC4uLgorICoKKyAqICBicmVudCAtLSBkYnYKKyAqLworICAgIHZvaWQKK2d1aV9ndGtfcG9zaXRpb25faW5fcGFyZW50KAorCUd0a1dpZGdldAkqcGFyZW50LAorCUd0a1dpZGdldAkqY2hpbGQsCisJZ3VpX3dpbl9wb3NfVAl3aGVyZSkKK3sKKyAgICBHdGtSZXF1aXNpdGlvbgljX3NpemU7CisgICAgZ2ludAkJeFBtLCB5UG07CisgICAgZ2ludAkJeFAsIHlQLCB3UCwgaFAsIHBvc194LCBwb3NfeTsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgY2hpbGQgd2lkZ2V0IGlzIHNldCB1cCB0aGVuIGdldCBpdHMgc2l6ZS4gKi8KKyAgICBndGtfd2lkZ2V0X3NpemVfcmVxdWVzdChjaGlsZCwgJmNfc2l6ZSk7CisKKyAgICAvKiBnZXQgb3JpZ2luIGFuZCBzaXplIG9mIHBhcmVudCB3aW5kb3cgKi8KKyAgICBnZGtfd2luZG93X2dldF9vcmlnaW4oKEdka1dpbmRvdyAqKShwYXJlbnQtPndpbmRvdyksICZ4UCwgJnlQKTsKKyAgICBnZGtfd2luZG93X2dldF9zaXplKChHZGtXaW5kb3cgKikocGFyZW50LT53aW5kb3cpLCAmd1AsICZoUCk7CisKKyAgICBpZiAoY19zaXplLndpZHRoID4gd1AgfHwgY19zaXplLmhlaWdodCA+IGhQKQorICAgIHsKKwkvKiBkb2ghIG1heWJlIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciBnaXZpbmcgZ1ZpbSBhIGxpdHRsZSBtb3JlCisJICogc2NyZWVuIHJlYWwgZXN0YXRlICovCisJZ3RrX3dpZGdldF9zZXRfdXBvc2l0aW9uKGNoaWxkICwgeFAgKyAyICwgeVAgKyAyKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHdoZXJlID09IFZXX1BPU19NT1VTRSkKKyAgICB7CisJLyogcG9zaXRpb24gd2luZG93IGF0IG1vdXNlIHBvaW50ZXIgKi8KKwlndGtfd2lkZ2V0X2dldF9wb2ludGVyKHBhcmVudCwgJnhQbSwgJnlQbSk7CisJcG9zX3ggPSB4UCArIHhQbSAtIChjX3NpemUud2lkdGgpIC8gMjsKKwlwb3NfeSA9IHlQICsgeVBtIC0gKGNfc2l6ZS5oZWlnaHQpIC8gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBzZXQgY2hpbGQgeCBvcmlnaW4gc28gaXQgaXMgaW4gY2VudGVyIG9mIFZpbSB3aW5kb3cgKi8KKwlwb3NfeCA9ICB4UCArICh3UCAtIGNfc2l6ZS53aWR0aCkgLyAyOworCisJaWYgKHdoZXJlID09IFZXX1BPU19UT1BfQ0VOVEVSKQorCSAgICBwb3NfeSA9IHlQICsgMjsKKwllbHNlCisJICAgIC8qIHdoZXJlID09IFZXX1BPU19DRU5URVIgKi8KKwkgICAgcG9zX3kgPSB5UCArIChoUCAtIGNfc2l6ZS5oZWlnaHQpIC8gMjsKKyAgICB9CisKKyAgICAvKiBub3csIG1ha2Ugc3VyZSB0aGUgd2luZG93IHdpbGwgYmUgaW5zaWRlIHRoZSBWaW0gd2luZG93Li4uICovCisgICAgaWYgKHBvc194IDwgeFApCisJcG9zX3ggPSB4UCArIDI7CisgICAgaWYgKHBvc195IDwgeVApCisJcG9zX3kgPSB5UCArIDI7CisgICAgaWYgKChwb3NfeCArIGNfc2l6ZS53aWR0aCkgPiAod1AgKyB4UCkpCisJcG9zX3ggPSB4UCArIHdQIC0gY19zaXplLndpZHRoIC0gMjsKKyAgICAvKiBBc3N1bWUgJ2d1aWhlYWRyb29tJyBpbmRpY2F0ZXMgdGhlIHRpdGxlIGJhciBoZWlnaHQuLi4gKi8KKyAgICBpZiAoKHBvc195ICsgY19zaXplLmhlaWdodCArIHBfZ2hyIC8gMikgPiAoaFAgKyB5UCkpCisJcG9zX3kgPSB5UCArIGhQIC0gY19zaXplLmhlaWdodCAtIDIgLSBwX2dociAvIDI7CisKKyAgICBndGtfd2lkZ2V0X3NldF91cG9zaXRpb24oY2hpbGQsIHBvc194LCBwb3NfeSk7Cit9CisKKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKZGlmZiAtLWdpdCBhL3NyYy9ndWlfZ3RrX2YuYyBiL3NyYy9ndWlfZ3RrX2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I4MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9ndGtfZi5jCkBAIC0wLDAgKzEsOTQyIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogKEMpIDE5OTgsMTk5OSBieSBNYXJjaW4gRGFsZWNraSA8ZGFsZWNraUBjcy5uZXQucGw+CisgKgorICoJIkknbSBhIG9uZS1tYW4gc29mdHdhcmUgY29tcGFueS4gSWYgeW91IGhhdmUgYW55dGhpbmcgVU5JWCwgbmV0IG9yCisgKgllbWJlZGRlZCBzeXN0ZW1zIHJlbGF0ZWQsIHdoaWNoIHNlZW1zIHRvIGNhdXNlIHNvbWUgc2VyaW91cyB0cm91YmxlIGZvcgorICoJeW91cidzIGluLWhvdXNlIGRldmVsb3BlcnMsIG1heWJlIHdlIG5lZWQgdG8gdGFsayBiYWRseSB3aXRoIGVhY2ggb3RoZXIKKyAqCTotKSA8ZGFsZWNraUBjcy5uZXQucGw+IChNeSBuYXRpdmUgbGFuZ3VhZ2UgaXMgcG9saXNoIGFuZCBJIHNwZWFrCisgKgluYXRpdmUgZ3JhZGUgZ2VybWFuIHRvby4gSSdtIGxpdmluZyBpbiBHw7Z0dGluZ2VuLmRlLikKKyAqCS0tbWRja2kiCisgKgorICogU3VwcG9ydCBmb3IgR1RLKyAyIHdhcyBhZGRlZCBieToKKyAqCisgKiAoQykgMjAwMiwyMDAzICBKYXNvbiBIaWxkZWJyYW5kICA8amFzb25AcGVhY2V3b3Jrcy5jYT4KKyAqCQkgIERhbmllbCBFbHN0bmVyICA8ZGFuaWVsLmVsc3RuZXJAZ214Lm5ldD4KKyAqCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBwdXJzcG9zZSBjb250YWluZXIgd2lkZ2V0LCB3aGljaCBtYW5hZ2VzIGFyYml0cmFyeSBjaGlsZHMKKyAqIGF0IGFyYml0cmFyeSBwb3NpdGlvbnMgd2lkdGggYXJiaXRyYXJ5IHNpemVzLiAgVGhpcyBmaW5hbGx5IHB1dHMgYW4gZW5kIG9uCisgKiBvdXIgcmVzaXplbWVudCBwcm9ibGVtcyB3aXRoIHdoaWNoIHdlIHdoZXJlIHN0cnVnZ2xpbmcgZm9yIHN1Y2ggYSBsb25nIHRpbWUuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorI2luY2x1ZGUgPGd0ay9ndGsuaD4JLyogd2l0aG91dCB0aGlzIGl0IGNvbXBpbGVzLCBidXQgZ2l2ZXMgZXJyb3JzIGF0CisJCQkgICBydW50aW1lISAqLworI2luY2x1ZGUgImd1aV9ndGtfZi5oIgorI2luY2x1ZGUgPGd0ay9ndGtzaWduYWwuaD4KKyNpZmRlZiBXSU4zMjY0CisjIGluY2x1ZGUgPGdkay9nZGt3aW4zMi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8Z2RrL2dka3guaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfR3RrRm9ybUNoaWxkIEd0a0Zvcm1DaGlsZDsKKworc3RydWN0IF9HdGtGb3JtQ2hpbGQKK3sKKyAgICBHdGtXaWRnZXQgKndpZGdldDsKKyAgICBHZGtXaW5kb3cgKndpbmRvdzsKKyAgICBnaW50IHg7CQkvKiByZWxhdGl2ZSBzdWJ3aWRnZXQgeCBwb3NpdGlvbiAqLworICAgIGdpbnQgeTsJCS8qIHJlbGF0aXZlIHN1YndpZGdldCB5IHBvc2l0aW9uICovCisgICAgZ2ludCBtYXBwZWQ7Cit9OworCisKK3N0YXRpYyB2b2lkIGd0a19mb3JtX2NsYXNzX2luaXQoR3RrRm9ybUNsYXNzICprbGFzcyk7CitzdGF0aWMgdm9pZCBndGtfZm9ybV9pbml0KEd0a0Zvcm0gKmZvcm0pOworCitzdGF0aWMgdm9pZCBndGtfZm9ybV9yZWFsaXplKEd0a1dpZGdldCAqd2lkZ2V0KTsKK3N0YXRpYyB2b2lkIGd0a19mb3JtX3VucmVhbGl6ZShHdGtXaWRnZXQgKndpZGdldCk7CitzdGF0aWMgdm9pZCBndGtfZm9ybV9tYXAoR3RrV2lkZ2V0ICp3aWRnZXQpOworc3RhdGljIHZvaWQgZ3RrX2Zvcm1fc2l6ZV9yZXF1ZXN0KEd0a1dpZGdldCAqd2lkZ2V0LAorCQkJCSAgR3RrUmVxdWlzaXRpb24gKnJlcXVpc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGd0a19mb3JtX3NpemVfYWxsb2NhdGUoR3RrV2lkZ2V0ICp3aWRnZXQsCisJCQkJICAgR3RrQWxsb2NhdGlvbiAqYWxsb2NhdGlvbik7CisjaWZuZGVmIEhBVkVfR1RLMiAgLyogdGhpcyBpc24ndCBuZWVkZWQgaW4gZ3RrMiAqLworc3RhdGljIHZvaWQgZ3RrX2Zvcm1fZHJhdyhHdGtXaWRnZXQgKndpZGdldCwKKwkJCSAgR2RrUmVjdGFuZ2xlICphcmVhKTsKKyNlbmRpZgorc3RhdGljIGdpbnQgZ3RrX2Zvcm1fZXhwb3NlKEd0a1dpZGdldCAqd2lkZ2V0LAorCQkJICAgIEdka0V2ZW50RXhwb3NlICpldmVudCk7CisKK3N0YXRpYyB2b2lkIGd0a19mb3JtX3JlbW92ZShHdGtDb250YWluZXIgKmNvbnRhaW5lciwKKwkJCSAgICBHdGtXaWRnZXQgKndpZGdldCk7CitzdGF0aWMgdm9pZCBndGtfZm9ybV9mb3JhbGwoR3RrQ29udGFpbmVyICpjb250YWluZXIsCisJCQkgICAgZ2Jvb2xlYW4gaW5jbHVkZV9pbnRlcm5hbHMsCisJCQkgICAgR3RrQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkgICAgZ3BvaW50ZXIgY2FsbGJhY2tfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGd0a19mb3JtX2F0dGFjaF9jaGlsZF93aW5kb3coR3RrRm9ybSAqZm9ybSwKKwkJCQkJIEd0a0Zvcm1DaGlsZCAqY2hpbGQpOworc3RhdGljIHZvaWQgZ3RrX2Zvcm1fcmVhbGl6ZV9jaGlsZChHdGtGb3JtICpmb3JtLAorCQkJCSAgIEd0a0Zvcm1DaGlsZCAqY2hpbGQpOworc3RhdGljIHZvaWQgZ3RrX2Zvcm1fcG9zaXRpb25fY2hpbGQoR3RrRm9ybSAqZm9ybSwKKwkJCQkgICAgR3RrRm9ybUNoaWxkICpjaGlsZCwKKwkJCQkgICAgZ2Jvb2xlYW4gZm9yY2VfYWxsb2NhdGUpOworc3RhdGljIHZvaWQgZ3RrX2Zvcm1fcG9zaXRpb25fY2hpbGRyZW4oR3RrRm9ybSAqZm9ybSk7CisKK3N0YXRpYyBHZGtGaWx0ZXJSZXR1cm4gZ3RrX2Zvcm1fZmlsdGVyKEdka1hFdmVudCAqZ2RrX3hldmVudCwKKwkJCQkgICAgICAgR2RrRXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBncG9pbnRlciBkYXRhKTsKK3N0YXRpYyBHZGtGaWx0ZXJSZXR1cm4gZ3RrX2Zvcm1fbWFpbl9maWx0ZXIoR2RrWEV2ZW50ICpnZGtfeGV2ZW50LAorCQkJCQkgICAgR2RrRXZlbnQgKmV2ZW50LAorCQkJCQkgICAgZ3BvaW50ZXIgZGF0YSk7CisKK3N0YXRpYyB2b2lkIGd0a19mb3JtX3NldF9zdGF0aWNfZ3Jhdml0eShHZGtXaW5kb3cgKndpbmRvdywKKwkJCQkJZ2Jvb2xlYW4gdXNlX3N0YXRpYyk7CisKK3N0YXRpYyB2b2lkIGd0a19mb3JtX3NlbmRfY29uZmlndXJlKEd0a0Zvcm0gKmZvcm0pOworCitzdGF0aWMgdm9pZCBndGtfZm9ybV9jaGlsZF9tYXAoR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgdm9pZCBndGtfZm9ybV9jaGlsZF91bm1hcChHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworc3RhdGljIEd0a1dpZGdldENsYXNzICpwYXJlbnRfY2xhc3MgPSBOVUxMOworCisvKiBQdWJsaWMgaW50ZXJmYWNlCisgKi8KKworICAgIEd0a1dpZGdldCAqCitndGtfZm9ybV9uZXcodm9pZCkKK3sKKyAgICBHdGtGb3JtICpmb3JtOworCisgICAgZm9ybSA9IGd0a190eXBlX25ldyhndGtfZm9ybV9nZXRfdHlwZSgpKTsKKworICAgIHJldHVybiBHVEtfV0lER0VUKGZvcm0pOworfQorCisgICAgdm9pZAorZ3RrX2Zvcm1fcHV0KEd0a0Zvcm0JKmZvcm0sCisJICAgICBHdGtXaWRnZXQJKmNoaWxkX3dpZGdldCwKKwkgICAgIGdpbnQJeCwKKwkgICAgIGdpbnQJeSkKK3sKKyAgICBHdGtGb3JtQ2hpbGQgKmNoaWxkOworCisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STShmb3JtKSk7CisKKyAgICBjaGlsZCA9IGdfbmV3KEd0a0Zvcm1DaGlsZCwgMSk7CisKKyAgICBjaGlsZC0+d2lkZ2V0ID0gY2hpbGRfd2lkZ2V0OworICAgIGNoaWxkLT53aW5kb3cgPSBOVUxMOworICAgIGNoaWxkLT54ID0geDsKKyAgICBjaGlsZC0+eSA9IHk7CisgICAgY2hpbGQtPndpZGdldC0+cmVxdWlzaXRpb24ud2lkdGggPSAwOworICAgIGNoaWxkLT53aWRnZXQtPnJlcXVpc2l0aW9uLmhlaWdodCA9IDA7CisgICAgY2hpbGQtPm1hcHBlZCA9IEZBTFNFOworCisgICAgZm9ybS0+Y2hpbGRyZW4gPSBnX2xpc3RfYXBwZW5kKGZvcm0tPmNoaWxkcmVuLCBjaGlsZCk7CisKKyAgICAvKiBjaGlsZC0+d2luZG93IG11c3QgYmUgY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIHdpZGdldCBfYmVmb3JlXworICAgICAqIGl0IGhhcyBiZWVuIHJlYWxpemVkLCBvciBlbHNlIHRoaW5ncyB3aWxsIGJyZWFrIHdpdGggR1RLMi4gIE5vdGUKKyAgICAgKiB0aGF0IGd0a193aWRnZXRfc2V0X3BhcmVudCgpIHJlYWxpemVzIHRoZSB3aWRnZXQgaWYgaXQncyB2aXNpYmxlCisgICAgICogYW5kIGl0cyBwYXJlbnQgaXMgbWFwcGVkLgorICAgICAqLworICAgIGlmIChHVEtfV0lER0VUX1JFQUxJWkVEKGZvcm0pKQorCWd0a19mb3JtX2F0dGFjaF9jaGlsZF93aW5kb3coZm9ybSwgY2hpbGQpOworCisgICAgZ3RrX3dpZGdldF9zZXRfcGFyZW50KGNoaWxkX3dpZGdldCwgR1RLX1dJREdFVChmb3JtKSk7CisgICAgZ3RrX3dpZGdldF9zaXplX3JlcXVlc3QoY2hpbGQtPndpZGdldCwgTlVMTCk7CisKKyAgICBpZiAoR1RLX1dJREdFVF9SRUFMSVpFRChmb3JtKSAmJiAhR1RLX1dJREdFVF9SRUFMSVpFRChjaGlsZF93aWRnZXQpKQorCWd0a19mb3JtX3JlYWxpemVfY2hpbGQoZm9ybSwgY2hpbGQpOworCisgICAgZ3RrX2Zvcm1fcG9zaXRpb25fY2hpbGQoZm9ybSwgY2hpbGQsIFRSVUUpOworfQorCisgICAgdm9pZAorZ3RrX2Zvcm1fbW92ZShHdGtGb3JtCSpmb3JtLAorCSAgICAgIEd0a1dpZGdldAkqY2hpbGRfd2lkZ2V0LAorCSAgICAgIGdpbnQJeCwKKwkgICAgICBnaW50CXkpCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworICAgIEd0a0Zvcm1DaGlsZCAqY2hpbGQ7CisKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19GT1JNKGZvcm0pKTsKKworICAgIGZvciAodG1wX2xpc3QgPSBmb3JtLT5jaGlsZHJlbjsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCisgICAgeworCWNoaWxkID0gdG1wX2xpc3QtPmRhdGE7CisJaWYgKGNoaWxkLT53aWRnZXQgPT0gY2hpbGRfd2lkZ2V0KQorCXsKKwkgICAgY2hpbGQtPnggPSB4OworCSAgICBjaGlsZC0+eSA9IHk7CisKKwkgICAgZ3RrX2Zvcm1fcG9zaXRpb25fY2hpbGQoZm9ybSwgY2hpbGQsIFRSVUUpOworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworICAgIHZvaWQKK2d0a19mb3JtX3NldF9zaXplKEd0a0Zvcm0gKmZvcm0sIGd1aW50IHdpZHRoLCBndWludCBoZWlnaHQpCit7CisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STShmb3JtKSk7CisKKyAgICAvKiBwcmV2ZW50IHVubmVjY2Vzc2FyeSBjYWxscyAqLworICAgIGlmIChmb3JtLT53aWR0aCA9PSB3aWR0aCAmJiBmb3JtLT5oZWlnaHQgPT0gaGVpZ2h0KQorCXJldHVybjsKKyAgICBmb3JtLT53aWR0aCA9IHdpZHRoOworICAgIGZvcm0tPmhlaWdodCA9IGhlaWdodDsKKworICAgIC8qIHNpZ25hbCB0aGUgY2hhbmdlICovCisjaWZkZWYgSEFWRV9HVEsyCisgICAgZ3RrX3dpZGdldF9xdWV1ZV9yZXNpemUoZ3RrX3dpZGdldF9nZXRfcGFyZW50KEdUS19XSURHRVQoZm9ybSkpKTsKKyNlbHNlCisgICAgZ3RrX2NvbnRhaW5lcl9xdWV1ZV9yZXNpemUoR1RLX0NPTlRBSU5FUihHVEtfV0lER0VUKGZvcm0pLT5wYXJlbnQpKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3RrX2Zvcm1fZnJlZXplKEd0a0Zvcm0gKmZvcm0pCit7CisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STShmb3JtKSk7CisKKyAgICArK2Zvcm0tPmZyZWV6ZV9jb3VudDsKK30KKworICAgIHZvaWQKK2d0a19mb3JtX3RoYXcoR3RrRm9ybSAqZm9ybSkKK3sKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19GT1JNKGZvcm0pKTsKKworICAgIGlmIChmb3JtLT5mcmVlemVfY291bnQpCisgICAgeworCWlmICghKC0tZm9ybS0+ZnJlZXplX2NvdW50KSkKKwl7CisJICAgIGd0a19mb3JtX3Bvc2l0aW9uX2NoaWxkcmVuKGZvcm0pOworI2lmZGVmIEhBVkVfR1RLMgorCSAgICBndGtfd2lkZ2V0X3F1ZXVlX2RyYXcoR1RLX1dJREdFVChmb3JtKSk7CisjZWxzZQorCSAgICBndGtfd2lkZ2V0X2RyYXcoR1RLX1dJREdFVChmb3JtKSwgTlVMTCk7CisjZW5kaWYKKwl9CisgICAgfQorfQorCisvKiBCYXNpYyBPYmplY3QgaGFuZGxpbmcgcHJvY2VkdXJlcworICovCisgICAgR3RrVHlwZQorZ3RrX2Zvcm1fZ2V0X3R5cGUodm9pZCkKK3sKKyAgICBzdGF0aWMgR3RrVHlwZSBmb3JtX3R5cGUgPSAwOworCisgICAgaWYgKCFmb3JtX3R5cGUpCisgICAgeworCUd0a1R5cGVJbmZvIGZvcm1faW5mbyA9CisJeworCSAgICAiR3RrRm9ybSIsCisJICAgIHNpemVvZihHdGtGb3JtKSwKKwkgICAgc2l6ZW9mKEd0a0Zvcm1DbGFzcyksCisJICAgIChHdGtDbGFzc0luaXRGdW5jKSBndGtfZm9ybV9jbGFzc19pbml0LAorCSAgICAoR3RrT2JqZWN0SW5pdEZ1bmMpIGd0a19mb3JtX2luaXQKKwl9OworCisJZm9ybV90eXBlID0gZ3RrX3R5cGVfdW5pcXVlKEdUS19UWVBFX0NPTlRBSU5FUiwgJmZvcm1faW5mbyk7CisgICAgfQorICAgIHJldHVybiBmb3JtX3R5cGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3RrX2Zvcm1fY2xhc3NfaW5pdChHdGtGb3JtQ2xhc3MgKmtsYXNzKQoreworICAgIEd0a1dpZGdldENsYXNzICp3aWRnZXRfY2xhc3M7CisgICAgR3RrQ29udGFpbmVyQ2xhc3MgKmNvbnRhaW5lcl9jbGFzczsKKworICAgIHdpZGdldF9jbGFzcyA9IChHdGtXaWRnZXRDbGFzcyAqKSBrbGFzczsKKyAgICBjb250YWluZXJfY2xhc3MgPSAoR3RrQ29udGFpbmVyQ2xhc3MgKikga2xhc3M7CisKKyAgICBwYXJlbnRfY2xhc3MgPSBndGtfdHlwZV9jbGFzcyhndGtfY29udGFpbmVyX2dldF90eXBlKCkpOworCisgICAgd2lkZ2V0X2NsYXNzLT5yZWFsaXplID0gZ3RrX2Zvcm1fcmVhbGl6ZTsKKyAgICB3aWRnZXRfY2xhc3MtPnVucmVhbGl6ZSA9IGd0a19mb3JtX3VucmVhbGl6ZTsKKyAgICB3aWRnZXRfY2xhc3MtPm1hcCA9IGd0a19mb3JtX21hcDsKKyAgICB3aWRnZXRfY2xhc3MtPnNpemVfcmVxdWVzdCA9IGd0a19mb3JtX3NpemVfcmVxdWVzdDsKKyAgICB3aWRnZXRfY2xhc3MtPnNpemVfYWxsb2NhdGUgPSBndGtfZm9ybV9zaXplX2FsbG9jYXRlOworI2lmbmRlZiBIQVZFX0dUSzIgLyogbm90IG5lZWRlZCBmb3IgR1RLMiAqLworICAgIHdpZGdldF9jbGFzcy0+ZHJhdyA9IGd0a19mb3JtX2RyYXc7CisjZW5kaWYKKyAgICB3aWRnZXRfY2xhc3MtPmV4cG9zZV9ldmVudCA9IGd0a19mb3JtX2V4cG9zZTsKKworICAgIGNvbnRhaW5lcl9jbGFzcy0+cmVtb3ZlID0gZ3RrX2Zvcm1fcmVtb3ZlOworICAgIGNvbnRhaW5lcl9jbGFzcy0+Zm9yYWxsID0gZ3RrX2Zvcm1fZm9yYWxsOworfQorCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX2luaXQoR3RrRm9ybSAqZm9ybSkKK3sKKyAgICBmb3JtLT5jaGlsZHJlbiA9IE5VTEw7CisKKyAgICBmb3JtLT53aWR0aCA9IDE7CisgICAgZm9ybS0+aGVpZ2h0ID0gMTsKKworICAgIGZvcm0tPmJpbl93aW5kb3cgPSBOVUxMOworCisgICAgZm9ybS0+Y29uZmlndXJlX3NlcmlhbCA9IDA7CisgICAgZm9ybS0+dmlzaWJpbGl0eSA9IEdES19WSVNJQklMSVRZX1BBUlRJQUw7CisKKyAgICBmb3JtLT5mcmVlemVfY291bnQgPSAwOworfQorCisvKgorICogV2lkZ2V0IG1ldGhvZHMKKyAqLworCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3JlYWxpemUoR3RrV2lkZ2V0ICp3aWRnZXQpCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworICAgIEd0a0Zvcm0gKmZvcm07CisgICAgR2RrV2luZG93QXR0ciBhdHRyaWJ1dGVzOworICAgIGdpbnQgYXR0cmlidXRlc19tYXNrOworCisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STSh3aWRnZXQpKTsKKworICAgIGZvcm0gPSBHVEtfRk9STSh3aWRnZXQpOworICAgIEdUS19XSURHRVRfU0VUX0ZMQUdTKGZvcm0sIEdUS19SRUFMSVpFRCk7CisKKyAgICBhdHRyaWJ1dGVzLndpbmRvd190eXBlID0gR0RLX1dJTkRPV19DSElMRDsKKyAgICBhdHRyaWJ1dGVzLnggPSB3aWRnZXQtPmFsbG9jYXRpb24ueDsKKyAgICBhdHRyaWJ1dGVzLnkgPSB3aWRnZXQtPmFsbG9jYXRpb24ueTsKKyAgICBhdHRyaWJ1dGVzLndpZHRoID0gd2lkZ2V0LT5hbGxvY2F0aW9uLndpZHRoOworICAgIGF0dHJpYnV0ZXMuaGVpZ2h0ID0gd2lkZ2V0LT5hbGxvY2F0aW9uLmhlaWdodDsKKyAgICBhdHRyaWJ1dGVzLndjbGFzcyA9IEdES19JTlBVVF9PVVRQVVQ7CisgICAgYXR0cmlidXRlcy52aXN1YWwgPSBndGtfd2lkZ2V0X2dldF92aXN1YWwod2lkZ2V0KTsKKyAgICBhdHRyaWJ1dGVzLmNvbG9ybWFwID0gZ3RrX3dpZGdldF9nZXRfY29sb3JtYXAod2lkZ2V0KTsKKyAgICBhdHRyaWJ1dGVzLmV2ZW50X21hc2sgPSBHREtfVklTSUJJTElUWV9OT1RJRllfTUFTSzsKKworICAgIGF0dHJpYnV0ZXNfbWFzayA9IEdES19XQV9YIHwgR0RLX1dBX1kgfCBHREtfV0FfVklTVUFMIHwgR0RLX1dBX0NPTE9STUFQOworCisgICAgd2lkZ2V0LT53aW5kb3cgPSBnZGtfd2luZG93X25ldyhndGtfd2lkZ2V0X2dldF9wYXJlbnRfd2luZG93KHdpZGdldCksCisJCQkJICAgICZhdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzX21hc2spOworICAgIGdka193aW5kb3dfc2V0X3VzZXJfZGF0YSh3aWRnZXQtPndpbmRvdywgd2lkZ2V0KTsKKworICAgIGF0dHJpYnV0ZXMueCA9IDA7CisgICAgYXR0cmlidXRlcy55ID0gMDsKKyAgICBhdHRyaWJ1dGVzLmV2ZW50X21hc2sgPSBndGtfd2lkZ2V0X2dldF9ldmVudHMod2lkZ2V0KTsKKworICAgIGZvcm0tPmJpbl93aW5kb3cgPSBnZGtfd2luZG93X25ldyh3aWRnZXQtPndpbmRvdywKKwkJCQkgICAgICAmYXR0cmlidXRlcywgYXR0cmlidXRlc19tYXNrKTsKKyAgICBnZGtfd2luZG93X3NldF91c2VyX2RhdGEoZm9ybS0+YmluX3dpbmRvdywgd2lkZ2V0KTsKKworICAgIGd0a19mb3JtX3NldF9zdGF0aWNfZ3Jhdml0eShmb3JtLT5iaW5fd2luZG93LCBUUlVFKTsKKworICAgIHdpZGdldC0+c3R5bGUgPSBndGtfc3R5bGVfYXR0YWNoKHdpZGdldC0+c3R5bGUsIHdpZGdldC0+d2luZG93KTsKKyAgICBndGtfc3R5bGVfc2V0X2JhY2tncm91bmQod2lkZ2V0LT5zdHlsZSwgd2lkZ2V0LT53aW5kb3csIEdUS19TVEFURV9OT1JNQUwpOworICAgIGd0a19zdHlsZV9zZXRfYmFja2dyb3VuZCh3aWRnZXQtPnN0eWxlLCBmb3JtLT5iaW5fd2luZG93LCBHVEtfU1RBVEVfTk9STUFMKTsKKworICAgIGdka193aW5kb3dfYWRkX2ZpbHRlcih3aWRnZXQtPndpbmRvdywgZ3RrX2Zvcm1fbWFpbl9maWx0ZXIsIGZvcm0pOworICAgIGdka193aW5kb3dfYWRkX2ZpbHRlcihmb3JtLT5iaW5fd2luZG93LCBndGtfZm9ybV9maWx0ZXIsIGZvcm0pOworCisgICAgZm9yICh0bXBfbGlzdCA9IGZvcm0tPmNoaWxkcmVuOyB0bXBfbGlzdDsgdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dCkKKyAgICB7CisJR3RrRm9ybUNoaWxkICpjaGlsZCA9IHRtcF9saXN0LT5kYXRhOworCisJZ3RrX2Zvcm1fYXR0YWNoX2NoaWxkX3dpbmRvdyhmb3JtLCBjaGlsZCk7CisKKwlpZiAoR1RLX1dJREdFVF9WSVNJQkxFKGNoaWxkLT53aWRnZXQpKQorCSAgICBndGtfZm9ybV9yZWFsaXplX2NoaWxkKGZvcm0sIGNoaWxkKTsKKyAgICB9Cit9CisKKworLyogQWZ0ZXIgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiBhdAorICogaHR0cDovL2RldmVsb3Blci5nbm9tZS5vcmcvZG9jL0FQSS8yLjAvZ3RrL2d0ay1jaGFuZ2VzLTItMC5odG1sCisgKiBJIHRoaW5rIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGVuIGNvbXBpbGluZworICogYWdhaW5zdCBndGstMi4wLiAgSXQgZG9lc24ndCBzZWVtIHRvIGNhdXNlIHByb2JsZW1zLCB0aG91Z2guCisgKgorICogV2VsbCwgSSByZWNrb24gYXQgbGVhc3QgdGhlIGdka193aW5kb3dfc2hvdyhmb3JtLT5iaW5fd2luZG93KQorICogaXMgbmVjZXNzYXJ5LiAgR3RrRm9ybSBpcyBhbnl0aGluZyBidXQgYSB1c3VhbCBjb250YWluZXIgd2lkZ2V0LgorICovCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX21hcChHdGtXaWRnZXQgKndpZGdldCkKK3sKKyAgICBHTGlzdCAqdG1wX2xpc3Q7CisgICAgR3RrRm9ybSAqZm9ybTsKKworICAgIGdfcmV0dXJuX2lmX2ZhaWwoR1RLX0lTX0ZPUk0od2lkZ2V0KSk7CisKKyAgICBmb3JtID0gR1RLX0ZPUk0od2lkZ2V0KTsKKworICAgIEdUS19XSURHRVRfU0VUX0ZMQUdTKHdpZGdldCwgR1RLX01BUFBFRCk7CisKKyAgICBnZGtfd2luZG93X3Nob3cod2lkZ2V0LT53aW5kb3cpOworICAgIGdka193aW5kb3dfc2hvdyhmb3JtLT5iaW5fd2luZG93KTsKKworICAgIGZvciAodG1wX2xpc3QgPSBmb3JtLT5jaGlsZHJlbjsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCisgICAgeworCUd0a0Zvcm1DaGlsZCAqY2hpbGQgPSB0bXBfbGlzdC0+ZGF0YTsKKworCWlmIChHVEtfV0lER0VUX1ZJU0lCTEUoY2hpbGQtPndpZGdldCkKKwkJJiYgIUdUS19XSURHRVRfTUFQUEVEKGNoaWxkLT53aWRnZXQpKQorCSAgICBndGtfd2lkZ2V0X21hcChjaGlsZC0+d2lkZ2V0KTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3RrX2Zvcm1fdW5yZWFsaXplKEd0a1dpZGdldCAqd2lkZ2V0KQoreworICAgIEdMaXN0ICp0bXBfbGlzdDsKKyAgICBHdGtGb3JtICpmb3JtOworCisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STSh3aWRnZXQpKTsKKworICAgIGZvcm0gPSBHVEtfRk9STSh3aWRnZXQpOworCisgICAgdG1wX2xpc3QgPSBmb3JtLT5jaGlsZHJlbjsKKworICAgIGdka193aW5kb3dfc2V0X3VzZXJfZGF0YShmb3JtLT5iaW5fd2luZG93LCBOVUxMKTsKKyAgICBnZGtfd2luZG93X2Rlc3Ryb3koZm9ybS0+YmluX3dpbmRvdyk7CisgICAgZm9ybS0+YmluX3dpbmRvdyA9IE5VTEw7CisKKyAgICB3aGlsZSAodG1wX2xpc3QpCisgICAgeworCUd0a0Zvcm1DaGlsZCAqY2hpbGQgPSB0bXBfbGlzdC0+ZGF0YTsKKworCWlmIChjaGlsZC0+d2luZG93ICE9IE5VTEwpCisJeworCSAgICBndGtfc2lnbmFsX2Rpc2Nvbm5lY3RfYnlfZnVuYyhHVEtfT0JKRUNUKGNoaWxkLT53aWRnZXQpLAorCQkJCQkgIEdUS19TSUdOQUxfRlVOQyhndGtfZm9ybV9jaGlsZF9tYXApLAorCQkJCQkgIGNoaWxkKTsKKwkgICAgZ3RrX3NpZ25hbF9kaXNjb25uZWN0X2J5X2Z1bmMoR1RLX09CSkVDVChjaGlsZC0+d2lkZ2V0KSwKKwkJCQkJICBHVEtfU0lHTkFMX0ZVTkMoZ3RrX2Zvcm1fY2hpbGRfdW5tYXApLAorCQkJCQkgIGNoaWxkKTsKKworCSAgICBnZGtfd2luZG93X3NldF91c2VyX2RhdGEoY2hpbGQtPndpbmRvdywgTlVMTCk7CisJICAgIGdka193aW5kb3dfZGVzdHJveShjaGlsZC0+d2luZG93KTsKKworCSAgICBjaGlsZC0+d2luZG93ID0gTlVMTDsKKwl9CisKKwl0bXBfbGlzdCA9IHRtcF9saXN0LT5uZXh0OworICAgIH0KKworICAgIGlmIChHVEtfV0lER0VUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT51bnJlYWxpemUpCisJICgqIEdUS19XSURHRVRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnVucmVhbGl6ZSkgKHdpZGdldCk7Cit9CisKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX2RyYXcoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka1JlY3RhbmdsZSAqYXJlYSkKK3sKKyAgICBHdGtGb3JtCQkqZm9ybTsKKyAgICBHTGlzdAkJKmNoaWxkcmVuOworICAgIEd0a0Zvcm1DaGlsZAkqY2hpbGQ7CisgICAgR2RrUmVjdGFuZ2xlCWNoaWxkX2FyZWE7CisKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19GT1JNKHdpZGdldCkpOworCisgICAgaWYgKEdUS19XSURHRVRfRFJBV0FCTEUod2lkZ2V0KSkKKyAgICB7CisJZm9ybSA9IEdUS19GT1JNKHdpZGdldCk7CisKKwljaGlsZHJlbiA9IGZvcm0tPmNoaWxkcmVuOworCisJd2hpbGUgKGNoaWxkcmVuKQorCXsKKwkgICAgY2hpbGQgPSBjaGlsZHJlbi0+ZGF0YTsKKworCSAgICBpZiAoR1RLX1dJREdFVF9EUkFXQUJMRShjaGlsZC0+d2lkZ2V0KQorCQkgICAgJiYgZ3RrX3dpZGdldF9pbnRlcnNlY3QoY2hpbGQtPndpZGdldCwgYXJlYSwgJmNoaWxkX2FyZWEpKQorCQlndGtfd2lkZ2V0X2RyYXcoY2hpbGQtPndpZGdldCwgJmNoaWxkX2FyZWEpOworCisJICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQ7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyAgICBzdGF0aWMgdm9pZAorZ3RrX2Zvcm1fc2l6ZV9yZXF1ZXN0KEd0a1dpZGdldCAqd2lkZ2V0LCBHdGtSZXF1aXNpdGlvbiAqcmVxdWlzaXRpb24pCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworICAgIEd0a0Zvcm0gKmZvcm07CisKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19GT1JNKHdpZGdldCkpOworCisgICAgZm9ybSA9IEdUS19GT1JNKHdpZGdldCk7CisKKyAgICByZXF1aXNpdGlvbi0+d2lkdGggPSBmb3JtLT53aWR0aDsKKyAgICByZXF1aXNpdGlvbi0+aGVpZ2h0ID0gZm9ybS0+aGVpZ2h0OworCisgICAgdG1wX2xpc3QgPSBmb3JtLT5jaGlsZHJlbjsKKworICAgIHdoaWxlICh0bXBfbGlzdCkKKyAgICB7CisJR3RrRm9ybUNoaWxkICpjaGlsZCA9IHRtcF9saXN0LT5kYXRhOworCWd0a193aWRnZXRfc2l6ZV9yZXF1ZXN0KGNoaWxkLT53aWRnZXQsIE5VTEwpOworCXRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQ7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3NpemVfYWxsb2NhdGUoR3RrV2lkZ2V0ICp3aWRnZXQsIEd0a0FsbG9jYXRpb24gKmFsbG9jYXRpb24pCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworICAgIEd0a0Zvcm0gKmZvcm07CisgICAgZ2Jvb2xlYW4gbmVlZF9yZXBvc2l0aW9uOworCisgICAgZ19yZXR1cm5faWZfZmFpbChHVEtfSVNfRk9STSh3aWRnZXQpKTsKKworICAgIGlmICh3aWRnZXQtPmFsbG9jYXRpb24ueCA9PSBhbGxvY2F0aW9uLT54CisJICAgICYmIHdpZGdldC0+YWxsb2NhdGlvbi55ID09IGFsbG9jYXRpb24tPnkKKwkgICAgJiYgd2lkZ2V0LT5hbGxvY2F0aW9uLndpZHRoID09IGFsbG9jYXRpb24tPndpZHRoCisJICAgICYmIHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQgPT0gYWxsb2NhdGlvbi0+aGVpZ2h0KQorCXJldHVybjsKKworICAgIG5lZWRfcmVwb3NpdGlvbiA9IHdpZGdldC0+YWxsb2NhdGlvbi53aWR0aCAhPSBhbGxvY2F0aW9uLT53aWR0aAorCQkgICB8fCB3aWRnZXQtPmFsbG9jYXRpb24uaGVpZ2h0ICE9IGFsbG9jYXRpb24tPmhlaWdodDsKKyAgICBmb3JtID0gR1RLX0ZPUk0od2lkZ2V0KTsKKworICAgIGlmIChuZWVkX3JlcG9zaXRpb24pCisgICAgeworCXRtcF9saXN0ID0gZm9ybS0+Y2hpbGRyZW47CisKKwl3aGlsZSAodG1wX2xpc3QpCisJeworCSAgICBHdGtGb3JtQ2hpbGQgKmNoaWxkID0gdG1wX2xpc3QtPmRhdGE7CisJICAgIGd0a19mb3JtX3Bvc2l0aW9uX2NoaWxkKGZvcm0sIGNoaWxkLCBUUlVFKTsKKworCSAgICB0bXBfbGlzdCA9IHRtcF9saXN0LT5uZXh0OworCX0KKyAgICB9CisKKyAgICBpZiAoR1RLX1dJREdFVF9SRUFMSVpFRCh3aWRnZXQpKQorICAgIHsKKwlnZGtfd2luZG93X21vdmVfcmVzaXplKHdpZGdldC0+d2luZG93LAorCQkJICAgICAgIGFsbG9jYXRpb24tPngsIGFsbG9jYXRpb24tPnksCisJCQkgICAgICAgYWxsb2NhdGlvbi0+d2lkdGgsIGFsbG9jYXRpb24tPmhlaWdodCk7CisJZ2RrX3dpbmRvd19tb3ZlX3Jlc2l6ZShHVEtfRk9STSh3aWRnZXQpLT5iaW5fd2luZG93LAorCQkJICAgICAgIDAsIDAsCisJCQkgICAgICAgYWxsb2NhdGlvbi0+d2lkdGgsIGFsbG9jYXRpb24tPmhlaWdodCk7CisgICAgfQorICAgIHdpZGdldC0+YWxsb2NhdGlvbiA9ICphbGxvY2F0aW9uOworICAgIGlmIChuZWVkX3JlcG9zaXRpb24pCisJZ3RrX2Zvcm1fc2VuZF9jb25maWd1cmUoZm9ybSk7Cit9CisKKyAgICBzdGF0aWMgZ2ludAorZ3RrX2Zvcm1fZXhwb3NlKEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudEV4cG9zZSAqZXZlbnQpCit7CisgICAgR0xpc3QgICAqdG1wX2xpc3Q7CisgICAgR3RrRm9ybSAqZm9ybTsKKworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKEdUS19JU19GT1JNKHdpZGdldCksIEZBTFNFKTsKKworICAgIGZvcm0gPSBHVEtfRk9STSh3aWRnZXQpOworCisgICAgaWYgKGV2ZW50LT53aW5kb3cgPT0gZm9ybS0+YmluX3dpbmRvdykKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKHRtcF9saXN0ID0gZm9ybS0+Y2hpbGRyZW47IHRtcF9saXN0OyB0bXBfbGlzdCA9IHRtcF9saXN0LT5uZXh0KQorICAgIHsKKyNpZmRlZiBIQVZFX0dUSzIKKwlHdGtGb3JtQ2hpbGQJKmZvcm1jaGlsZCA9IHRtcF9saXN0LT5kYXRhOworCUd0a1dpZGdldAkqY2hpbGQJICAgPSBmb3JtY2hpbGQtPndpZGdldDsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgY2h1bmsgb2YgY29kZSBpcyB0YWtlbiBmcm9tIGd0a2NvbnRhaW5lci5jLiAgVGhlCisJICogZ3RrMS54IGNvZGUgc3ludGhlc2l6ZWQgZXhwb3NlIGV2ZW50cyBkaXJlY3RseSBvbiB0aGUgY2hpbGQgd2lkZ2V0cywKKwkgKiB3aGljaCBjYW4ndCBiZSBkb25lIGluIGd0azIKKwkgKi8KKwlpZiAoR1RLX1dJREdFVF9EUkFXQUJMRShjaGlsZCkgJiYgR1RLX1dJREdFVF9OT19XSU5ET1coY2hpbGQpCisJCSYmIGNoaWxkLT53aW5kb3cgPT0gZXZlbnQtPndpbmRvdykKKwl7CisJICAgIEdka0V2ZW50RXhwb3NlIGNoaWxkX2V2ZW50OworCSAgICBjaGlsZF9ldmVudCA9ICpldmVudDsKKworCSAgICBjaGlsZF9ldmVudC5yZWdpb24gPSBndGtfd2lkZ2V0X3JlZ2lvbl9pbnRlcnNlY3QoY2hpbGQsIGV2ZW50LT5yZWdpb24pOworCSAgICBpZiAoIWdka19yZWdpb25fZW1wdHkoY2hpbGRfZXZlbnQucmVnaW9uKSkKKwkgICAgeworCQlnZGtfcmVnaW9uX2dldF9jbGlwYm94KGNoaWxkX2V2ZW50LnJlZ2lvbiwgJmNoaWxkX2V2ZW50LmFyZWEpOworCQlndGtfd2lkZ2V0X3NlbmRfZXhwb3NlKGNoaWxkLCAoR2RrRXZlbnQgKikmY2hpbGRfZXZlbnQpOworCSAgICB9CisJfQorI2Vsc2UgLyogIUhBVkVfR1RLMiAqLworCUd0a0Zvcm1DaGlsZCAqY2hpbGQgPSB0bXBfbGlzdC0+ZGF0YTsKKworCWlmIChldmVudC0+d2luZG93ID09IGNoaWxkLT53aW5kb3cpCisJICAgIHJldHVybiBndGtfd2lkZ2V0X2V2ZW50KGNoaWxkLT53aWRnZXQsIChHZGtFdmVudCAqKSBldmVudCk7CisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworLyogQ29udGFpbmVyIG1ldGhvZAorICovCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3JlbW92ZShHdGtDb250YWluZXIgKmNvbnRhaW5lciwgR3RrV2lkZ2V0ICp3aWRnZXQpCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworICAgIEd0a0Zvcm0gKmZvcm07CisgICAgR3RrRm9ybUNoaWxkICpjaGlsZCA9IE5VTEw7CSAgICAvKiBpbml0IGZvciBnY2MgKi8KKworICAgIGdfcmV0dXJuX2lmX2ZhaWwoR1RLX0lTX0ZPUk0oY29udGFpbmVyKSk7CisKKyAgICBmb3JtID0gR1RLX0ZPUk0oY29udGFpbmVyKTsKKworICAgIHRtcF9saXN0ID0gZm9ybS0+Y2hpbGRyZW47CisgICAgd2hpbGUgKHRtcF9saXN0KQorICAgIHsKKwljaGlsZCA9IHRtcF9saXN0LT5kYXRhOworCWlmIChjaGlsZC0+d2lkZ2V0ID09IHdpZGdldCkKKwkgICAgYnJlYWs7CisJdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAodG1wX2xpc3QpCisgICAgeworCWlmIChjaGlsZC0+d2luZG93KQorCXsKKwkgICAgZ3RrX3NpZ25hbF9kaXNjb25uZWN0X2J5X2Z1bmMoR1RLX09CSkVDVChjaGlsZC0+d2lkZ2V0KSwKKwkJCQkJICBHVEtfU0lHTkFMX0ZVTkMoJmd0a19mb3JtX2NoaWxkX21hcCksIGNoaWxkKTsKKwkgICAgZ3RrX3NpZ25hbF9kaXNjb25uZWN0X2J5X2Z1bmMoR1RLX09CSkVDVChjaGlsZC0+d2lkZ2V0KSwKKwkJCQkJICBHVEtfU0lHTkFMX0ZVTkMoJmd0a19mb3JtX2NoaWxkX3VubWFwKSwgY2hpbGQpOworCisJICAgIC8qIEZJWE1FOiBUaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yIHJlcGFyZW50aW5nIE5PX1dJTkRPVworCSAgICAgKiB3aWRnZXRzIG91dCBvZiBhIEd0a0Zvcm0KKwkgICAgICovCisJICAgIGdka193aW5kb3dfc2V0X3VzZXJfZGF0YShjaGlsZC0+d2luZG93LCBOVUxMKTsKKwkgICAgZ2RrX3dpbmRvd19kZXN0cm95KGNoaWxkLT53aW5kb3cpOworCX0KKwlndGtfd2lkZ2V0X3VucGFyZW50KHdpZGdldCk7CisKKwlmb3JtLT5jaGlsZHJlbiA9IGdfbGlzdF9yZW1vdmVfbGluayhmb3JtLT5jaGlsZHJlbiwgdG1wX2xpc3QpOworCWdfbGlzdF9mcmVlXzEodG1wX2xpc3QpOworCWdfZnJlZShjaGlsZCk7CisgICAgfQorfQorCisvKkFSR1NVU0VEMSovCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX2ZvcmFsbChHdGtDb250YWluZXIJKmNvbnRhaW5lciwKKwkJZ2Jvb2xlYW4JaW5jbHVkZV9pbnRlcm5hbHMsCisJCUd0a0NhbGxiYWNrCWNhbGxiYWNrLAorCQlncG9pbnRlcgljYWxsYmFja19kYXRhKQoreworICAgIEd0a0Zvcm0gKmZvcm07CisgICAgR3RrRm9ybUNoaWxkICpjaGlsZDsKKyAgICBHTGlzdCAqdG1wX2xpc3Q7CisKKyAgICBnX3JldHVybl9pZl9mYWlsKEdUS19JU19GT1JNKGNvbnRhaW5lcikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoY2FsbGJhY2sgIT0gTlVMTCk7CisKKyAgICBmb3JtID0gR1RLX0ZPUk0oY29udGFpbmVyKTsKKworICAgIHRtcF9saXN0ID0gZm9ybS0+Y2hpbGRyZW47CisgICAgd2hpbGUgKHRtcF9saXN0KQorICAgIHsKKwljaGlsZCA9IHRtcF9saXN0LT5kYXRhOworCXRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQ7CisKKwkoKmNhbGxiYWNrKSAoY2hpbGQtPndpZGdldCwgY2FsbGJhY2tfZGF0YSk7CisgICAgfQorfQorCisvKiBPcGVyYXRpb25zIG9uIGNoaWxkcmVuCisgKi8KKworICAgIHN0YXRpYyB2b2lkCitndGtfZm9ybV9hdHRhY2hfY2hpbGRfd2luZG93KEd0a0Zvcm0gKmZvcm0sIEd0a0Zvcm1DaGlsZCAqY2hpbGQpCit7CisgICAgaWYgKGNoaWxkLT53aW5kb3cgIT0gTlVMTCkKKwlyZXR1cm47IC8qIGJlZW4gdGhlcmUsIGRvbmUgdGhhdCAqLworCisgICAgaWYgKEdUS19XSURHRVRfTk9fV0lORE9XKGNoaWxkLT53aWRnZXQpKQorICAgIHsKKwlHdGtXaWRnZXQJKndpZGdldDsKKwlHZGtXaW5kb3dBdHRyCWF0dHJpYnV0ZXM7CisJZ2ludAkJYXR0cmlidXRlc19tYXNrOworCisJd2lkZ2V0ID0gR1RLX1dJREdFVChmb3JtKTsKKworCWF0dHJpYnV0ZXMud2luZG93X3R5cGUgPSBHREtfV0lORE9XX0NISUxEOworCWF0dHJpYnV0ZXMueCA9IGNoaWxkLT54OworCWF0dHJpYnV0ZXMueSA9IGNoaWxkLT55OworCWF0dHJpYnV0ZXMud2lkdGggPSBjaGlsZC0+d2lkZ2V0LT5yZXF1aXNpdGlvbi53aWR0aDsKKwlhdHRyaWJ1dGVzLmhlaWdodCA9IGNoaWxkLT53aWRnZXQtPnJlcXVpc2l0aW9uLmhlaWdodDsKKwlhdHRyaWJ1dGVzLndjbGFzcyA9IEdES19JTlBVVF9PVVRQVVQ7CisJYXR0cmlidXRlcy52aXN1YWwgPSBndGtfd2lkZ2V0X2dldF92aXN1YWwod2lkZ2V0KTsKKwlhdHRyaWJ1dGVzLmNvbG9ybWFwID0gZ3RrX3dpZGdldF9nZXRfY29sb3JtYXAod2lkZ2V0KTsKKwlhdHRyaWJ1dGVzLmV2ZW50X21hc2sgPSBHREtfRVhQT1NVUkVfTUFTSzsKKworCWF0dHJpYnV0ZXNfbWFzayA9IEdES19XQV9YIHwgR0RLX1dBX1kgfCBHREtfV0FfVklTVUFMIHwgR0RLX1dBX0NPTE9STUFQOworCWNoaWxkLT53aW5kb3cgPSBnZGtfd2luZG93X25ldyhmb3JtLT5iaW5fd2luZG93LAorCQkJCSAgICAgICAmYXR0cmlidXRlcywgYXR0cmlidXRlc19tYXNrKTsKKwlnZGtfd2luZG93X3NldF91c2VyX2RhdGEoY2hpbGQtPndpbmRvdywgd2lkZ2V0KTsKKworCWd0a19zdHlsZV9zZXRfYmFja2dyb3VuZCh3aWRnZXQtPnN0eWxlLAorCQkJCSBjaGlsZC0+d2luZG93LAorCQkJCSBHVEtfU1RBVEVfTk9STUFMKTsKKworCWd0a193aWRnZXRfc2V0X3BhcmVudF93aW5kb3coY2hpbGQtPndpZGdldCwgY2hpbGQtPndpbmRvdyk7CisJZ3RrX2Zvcm1fc2V0X3N0YXRpY19ncmF2aXR5KGNoaWxkLT53aW5kb3csIFRSVUUpOworCS8qCisJICogSW5zdGFsbCBzaWduYWwgaGFuZGxlcnMgdG8gbWFwL3VubWFwIGNoaWxkLT53aW5kb3cKKwkgKiBhbG9uZ3NpZGUgd2l0aCB0aGUgYWN0dWFsIHdpZGdldC4KKwkgKi8KKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChjaGlsZC0+d2lkZ2V0KSwgIm1hcCIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMoJmd0a19mb3JtX2NoaWxkX21hcCksIGNoaWxkKTsKKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChjaGlsZC0+d2lkZ2V0KSwgInVubWFwIiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQygmZ3RrX2Zvcm1fY2hpbGRfdW5tYXApLCBjaGlsZCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFHVEtfV0lER0VUX1JFQUxJWkVEKGNoaWxkLT53aWRnZXQpKQorICAgIHsKKwlndGtfd2lkZ2V0X3NldF9wYXJlbnRfd2luZG93KGNoaWxkLT53aWRnZXQsIGZvcm0tPmJpbl93aW5kb3cpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitndGtfZm9ybV9yZWFsaXplX2NoaWxkKEd0a0Zvcm0gKmZvcm0sIEd0a0Zvcm1DaGlsZCAqY2hpbGQpCit7CisgICAgZ3RrX2Zvcm1fYXR0YWNoX2NoaWxkX3dpbmRvdyhmb3JtLCBjaGlsZCk7CisgICAgZ3RrX3dpZGdldF9yZWFsaXplKGNoaWxkLT53aWRnZXQpOworCisgICAgaWYgKGNoaWxkLT53aW5kb3cgPT0gTlVMTCkgLyogbWlnaHQgYmUgYWxyZWFkeSBzZXQsIHNlZSBhYm92ZSAqLworCWd0a19mb3JtX3NldF9zdGF0aWNfZ3Jhdml0eShjaGlsZC0+d2lkZ2V0LT53aW5kb3csIFRSVUUpOworfQorCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3Bvc2l0aW9uX2NoaWxkKEd0a0Zvcm0gKmZvcm0sIEd0a0Zvcm1DaGlsZCAqY2hpbGQsCisJCQlnYm9vbGVhbiBmb3JjZV9hbGxvY2F0ZSkKK3sKKyAgICBnaW50IHg7CisgICAgZ2ludCB5OworCisgICAgeCA9IGNoaWxkLT54OworICAgIHkgPSBjaGlsZC0+eTsKKworICAgIGlmICgoeCA+PSBHX01JTlNIT1JUKSAmJiAoeCA8PSBHX01BWFNIT1JUKSAmJgorCSh5ID49IEdfTUlOU0hPUlQpICYmICh5IDw9IEdfTUFYU0hPUlQpKQorICAgIHsKKwlpZiAoIWNoaWxkLT5tYXBwZWQpCisJeworCSAgICBpZiAoR1RLX1dJREdFVF9NQVBQRUQoZm9ybSkgJiYgR1RLX1dJREdFVF9WSVNJQkxFKGNoaWxkLT53aWRnZXQpKQorCSAgICB7CisJCWlmICghR1RLX1dJREdFVF9NQVBQRUQoY2hpbGQtPndpZGdldCkpCisJCSAgICBndGtfd2lkZ2V0X21hcChjaGlsZC0+d2lkZ2V0KTsKKworCQljaGlsZC0+bWFwcGVkID0gVFJVRTsKKwkJZm9yY2VfYWxsb2NhdGUgPSBUUlVFOworCSAgICB9CisJfQorCisJaWYgKGZvcmNlX2FsbG9jYXRlKQorCXsKKwkgICAgR3RrQWxsb2NhdGlvbiBhbGxvY2F0aW9uOworCisJICAgIGlmIChHVEtfV0lER0VUX05PX1dJTkRPVyhjaGlsZC0+d2lkZ2V0KSkKKwkgICAgeworCQlpZiAoY2hpbGQtPndpbmRvdykKKwkJeworCQkgICAgZ2RrX3dpbmRvd19tb3ZlX3Jlc2l6ZShjaGlsZC0+d2luZG93LAorCQkJICAgIHgsIHksCisJCQkgICAgY2hpbGQtPndpZGdldC0+cmVxdWlzaXRpb24ud2lkdGgsCisJCQkgICAgY2hpbGQtPndpZGdldC0+cmVxdWlzaXRpb24uaGVpZ2h0KTsKKwkJfQorCisJCWFsbG9jYXRpb24ueCA9IDA7CisJCWFsbG9jYXRpb24ueSA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWFsbG9jYXRpb24ueCA9IHg7CisJCWFsbG9jYXRpb24ueSA9IHk7CisJICAgIH0KKworCSAgICBhbGxvY2F0aW9uLndpZHRoID0gY2hpbGQtPndpZGdldC0+cmVxdWlzaXRpb24ud2lkdGg7CisJICAgIGFsbG9jYXRpb24uaGVpZ2h0ID0gY2hpbGQtPndpZGdldC0+cmVxdWlzaXRpb24uaGVpZ2h0OworCisJICAgIGd0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZShjaGlsZC0+d2lkZ2V0LCAmYWxsb2NhdGlvbik7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChjaGlsZC0+bWFwcGVkKQorCXsKKwkgICAgY2hpbGQtPm1hcHBlZCA9IEZBTFNFOworCisJICAgIGlmIChHVEtfV0lER0VUX01BUFBFRChjaGlsZC0+d2lkZ2V0KSkKKwkJZ3RrX3dpZGdldF91bm1hcChjaGlsZC0+d2lkZ2V0KTsKKwl9CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3Bvc2l0aW9uX2NoaWxkcmVuKEd0a0Zvcm0gKmZvcm0pCit7CisgICAgR0xpc3QgKnRtcF9saXN0OworCisgICAgZm9yICh0bXBfbGlzdCA9IGZvcm0tPmNoaWxkcmVuOyB0bXBfbGlzdDsgdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dCkKKwlndGtfZm9ybV9wb3NpdGlvbl9jaGlsZChmb3JtLCB0bXBfbGlzdC0+ZGF0YSwgRkFMU0UpOworfQorCisvKiBDYWxsYmFja3MgKi8KKworLyogVGhlIG1haW4gZXZlbnQgZmlsdGVyLiBBY3R1YWxseSwgd2UgcHJvYmFibHkgZG9uJ3QgcmVhbGx5IG5lZWQKKyAqIHRvIGluc3RhbGwgdGhpcyBhcyBhIGZpbHRlciBhdCBhbGwsIHNpbmNlIHdlIGFyZSBjYWxsaW5nIGl0CisgKiBkaXJlY3RseSBhYm92ZSBpbiB0aGUgZXhwb3NlLWhhbmRsaW5nIGhhY2suCisgKgorICogVGhpcyByb3V0aW5lIGlkZW50aWZpZXMgZXhwb3NlIGV2ZW50cyB0aGF0IGFyZSBnZW5lcmF0ZWQgd2hlbgorICogd2UndmUgdGVtcG9yYXJpbHkgbW92ZWQgdGhlIGJpbl93aW5kb3dfb3JpZ2luLCBhbmQgdHJhbnNsYXRlcworICogdGhlbSBvciBkaXNjYXJkcyB0aGVtLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgb2JzY3VyZWQKKyAqIG9yIG5vdC4KKyAqLworLypBUkdTVVNFRDEqLworICAgIHN0YXRpYyBHZGtGaWx0ZXJSZXR1cm4KK2d0a19mb3JtX2ZpbHRlcihHZGtYRXZlbnQgKmdka194ZXZlbnQsIEdka0V2ZW50ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBYRXZlbnQgKnhldmVudDsKKyAgICBHdGtGb3JtICpmb3JtOworCisgICAgeGV2ZW50ID0gKFhFdmVudCAqKSBnZGtfeGV2ZW50OworICAgIGZvcm0gPSBHVEtfRk9STShkYXRhKTsKKworICAgIHN3aXRjaCAoeGV2ZW50LT50eXBlKQorICAgIHsKKyAgICBjYXNlIEV4cG9zZToKKwlpZiAoeGV2ZW50LT54ZXhwb3NlLnNlcmlhbCA9PSBmb3JtLT5jb25maWd1cmVfc2VyaWFsKQorCXsKKwkgICAgaWYgKGZvcm0tPnZpc2liaWxpdHkgPT0gR0RLX1ZJU0lCSUxJVFlfVU5PQlNDVVJFRCkKKwkJcmV0dXJuIEdES19GSUxURVJfUkVNT1ZFOworCSAgICBlbHNlCisJCWJyZWFrOworCX0KKwlicmVhazsKKworICAgIGNhc2UgQ29uZmlndXJlTm90aWZ5OgorCWlmICgoeGV2ZW50LT54Y29uZmlndXJlLnggIT0gMCkgfHwgKHhldmVudC0+eGNvbmZpZ3VyZS55ICE9IDApKQorCSAgICBmb3JtLT5jb25maWd1cmVfc2VyaWFsID0geGV2ZW50LT54Y29uZmlndXJlLnNlcmlhbDsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gR0RLX0ZJTFRFUl9DT05USU5VRTsKK30KKworLyogQWx0aG91Z2ggR0RLIGRvZXMgaGF2ZSBhIEdES19WSVNJQklMSVRZX05PVElGWSBldmVudCwKKyAqIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZXZlbnQgaW4gR1RLLCBzbyB3ZSBoYXZlCisgKiB0byBnZXQgdGhlIGV2ZW50cyBmcm9tIGEgZmlsdGVyCisgKi8KKy8qQVJHU1VTRUQxKi8KKyAgICBzdGF0aWMgR2RrRmlsdGVyUmV0dXJuCitndGtfZm9ybV9tYWluX2ZpbHRlcihHZGtYRXZlbnQgKmdka194ZXZlbnQsIEdka0V2ZW50ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBYRXZlbnQgKnhldmVudDsKKyAgICBHdGtGb3JtICpmb3JtOworCisgICAgeGV2ZW50ID0gKFhFdmVudCAqKSBnZGtfeGV2ZW50OworICAgIGZvcm0gPSBHVEtfRk9STShkYXRhKTsKKworICAgIGlmICh4ZXZlbnQtPnR5cGUgPT0gVmlzaWJpbGl0eU5vdGlmeSkKKyAgICB7CisJc3dpdGNoICh4ZXZlbnQtPnh2aXNpYmlsaXR5LnN0YXRlKQorCXsKKwljYXNlIFZpc2liaWxpdHlGdWxseU9ic2N1cmVkOgorCSAgICBmb3JtLT52aXNpYmlsaXR5ID0gR0RLX1ZJU0lCSUxJVFlfRlVMTFlfT0JTQ1VSRUQ7CisJICAgIGJyZWFrOworCisJY2FzZSBWaXNpYmlsaXR5UGFydGlhbGx5T2JzY3VyZWQ6CisJICAgIGZvcm0tPnZpc2liaWxpdHkgPSBHREtfVklTSUJJTElUWV9QQVJUSUFMOworCSAgICBicmVhazsKKworCWNhc2UgVmlzaWJpbGl0eVVub2JzY3VyZWQ6CisJICAgIGZvcm0tPnZpc2liaWxpdHkgPSBHREtfVklTSUJJTElUWV9VTk9CU0NVUkVEOworCSAgICBicmVhazsKKwl9CisKKwlyZXR1cm4gR0RLX0ZJTFRFUl9SRU1PVkU7CisgICAgfQorICAgIHJldHVybiBHREtfRklMVEVSX0NPTlRJTlVFOworfQorCisvKiBSb3V0aW5lcyB0byBzZXQgdGhlIHdpbmRvdyBncmF2aXR5LCBhbmQgY2hlY2sgd2hldGhlciBpdCBpcworICogZnVuY3Rpb25hbC4gRXh0cmEgY2FwYWJpbGl0aWVzIG5lZWQgdG8gYmUgYWRkZWQgdG8gR0RLLCBzbworICogd2UgZG9uJ3QgaGF2ZSB0byB1c2UgWGxpYiBoZXJlLgorICovCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX3NldF9zdGF0aWNfZ3Jhdml0eShHZGtXaW5kb3cgKndpbmRvdywgZ2Jvb2xlYW4gdXNlX3N0YXRpYykKK3sKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBnYm9vbGVhbiBzdGF0aWNfZ3Jhdml0eV9zdXBwb3J0ZWQ7CisKKyAgICBzdGF0aWNfZ3Jhdml0eV9zdXBwb3J0ZWQgPSBnZGtfd2luZG93X3NldF9zdGF0aWNfZ3Jhdml0aWVzKHdpbmRvdywKKwkJCQkJCQkgICAgICAgdXNlX3N0YXRpYyk7CisgICAgZ19yZXR1cm5faWZfZmFpbChzdGF0aWNfZ3Jhdml0eV9zdXBwb3J0ZWQpOworI2Vsc2UKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyB4YXR0cmlidXRlczsKKworICAgIHhhdHRyaWJ1dGVzLndpbl9ncmF2aXR5ID0gKHVzZV9zdGF0aWMpID8gU3RhdGljR3Jhdml0eSA6IE5vcnRoV2VzdEdyYXZpdHk7CisgICAgeGF0dHJpYnV0ZXMuYml0X2dyYXZpdHkgPSAodXNlX3N0YXRpYykgPyBTdGF0aWNHcmF2aXR5IDogTm9ydGhXZXN0R3Jhdml0eTsKKworICAgIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKEdES19XSU5ET1dfWERJU1BMQVkod2luZG93KSwKKwkJCSAgICBHREtfV0lORE9XX1hXSU5ET1cod2luZG93KSwKKwkJCSAgICBDV0JpdEdyYXZpdHkgfCBDV1dpbkdyYXZpdHksCisJCQkgICAgJnhhdHRyaWJ1dGVzKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3RrX2Zvcm1fbW92ZV9yZXNpemUoR3RrRm9ybSAqZm9ybSwgR3RrV2lkZ2V0ICp3aWRnZXQsCisJCSAgICAgZ2ludCB4LCBnaW50IHksIGdpbnQgdywgZ2ludCBoKQoreworICAgIHdpZGdldC0+cmVxdWlzaXRpb24ud2lkdGggID0gdzsKKyAgICB3aWRnZXQtPnJlcXVpc2l0aW9uLmhlaWdodCA9IGg7CisKKyAgICBndGtfZm9ybV9tb3ZlKGZvcm0sIHdpZGdldCwgeCwgeSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3RrX2Zvcm1fc2VuZF9jb25maWd1cmUoR3RrRm9ybSAqZm9ybSkKK3sKKyAgICBHdGtXaWRnZXQgKndpZGdldDsKKyAgICBHZGtFdmVudENvbmZpZ3VyZSBldmVudDsKKworICAgIHdpZGdldCA9IEdUS19XSURHRVQoZm9ybSk7CisKKyAgICBldmVudC50eXBlID0gR0RLX0NPTkZJR1VSRTsKKyAgICBldmVudC53aW5kb3cgPSB3aWRnZXQtPndpbmRvdzsKKyAgICBldmVudC54ID0gd2lkZ2V0LT5hbGxvY2F0aW9uLng7CisgICAgZXZlbnQueSA9IHdpZGdldC0+YWxsb2NhdGlvbi55OworICAgIGV2ZW50LndpZHRoID0gd2lkZ2V0LT5hbGxvY2F0aW9uLndpZHRoOworICAgIGV2ZW50LmhlaWdodCA9IHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQ7CisKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBndGtfbWFpbl9kb19ldmVudCgoR2RrRXZlbnQqKSZldmVudCk7CisjZWxzZQorICAgIGd0a193aWRnZXRfZXZlbnQod2lkZ2V0LCAoR2RrRXZlbnQqKSZldmVudCk7CisjZW5kaWYKK30KKworLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyB2b2lkCitndGtfZm9ybV9jaGlsZF9tYXAoR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgICBHdGtGb3JtQ2hpbGQgKmNoaWxkOworCisgICAgY2hpbGQgPSAoR3RrRm9ybUNoaWxkICopdXNlcl9kYXRhOworCisgICAgY2hpbGQtPm1hcHBlZCA9IFRSVUU7CisgICAgZ2RrX3dpbmRvd19zaG93KGNoaWxkLT53aW5kb3cpOworfQorCisvKkFSR1NVU0VEMCovCisgICAgc3RhdGljIHZvaWQKK2d0a19mb3JtX2NoaWxkX3VubWFwKEd0a1dpZGdldCAqd2lkZ2V0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgICAgR3RrRm9ybUNoaWxkICpjaGlsZDsKKworICAgIGNoaWxkID0gKEd0a0Zvcm1DaGlsZCAqKXVzZXJfZGF0YTsKKworICAgIGNoaWxkLT5tYXBwZWQgPSBGQUxTRTsKKyAgICBnZGtfd2luZG93X2hpZGUoY2hpbGQtPndpbmRvdyk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9ndWlfZ3RrX2YuaCBiL3NyYy9ndWlfZ3RrX2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM3ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9ndGtfZi5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisjaWZuZGVmIF9fR1RLX0ZPUk1fSF9fCisjZGVmaW5lIF9fR1RLX0ZPUk1fSF9fCisKKyNpZmRlZiBWTVMKKyMgaW5jbHVkZSAiZ3VpX2d0a192bXMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2RrL2dkay5oPgorI2luY2x1ZGUgPGd0ay9ndGtjb250YWluZXIuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgR1RLX1RZUEVfRk9STQkJICAgICAgIChndGtfZm9ybV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1RLX0ZPUk0ob2JqKQkJICAgICAgIChHVEtfQ0hFQ0tfQ0FTVCAoKG9iaiksIEdUS19UWVBFX0ZPUk0sIEd0a0Zvcm0pKQorI2RlZmluZSBHVEtfRk9STV9DTEFTUyhrbGFzcykJICAgICAgIChHVEtfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1RLX1RZUEVfRk9STSwgR3RrRm9ybUNsYXNzKSkKKyNkZWZpbmUgR1RLX0lTX0ZPUk0ob2JqKQkgICAgICAgKEdUS19DSEVDS19UWVBFICgob2JqKSwgR1RLX1RZUEVfRk9STSkpCisjZGVmaW5lIEdUS19JU19GT1JNX0NMQVNTKGtsYXNzKSAgICAgICAoR1RLX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdUS19UWVBFX0ZPUk0pKQorCisKK3R5cGVkZWYgc3RydWN0IF9HdGtGb3JtIEd0a0Zvcm07Cit0eXBlZGVmIHN0cnVjdCBfR3RrRm9ybUNsYXNzIEd0a0Zvcm1DbGFzczsKKworc3RydWN0IF9HdGtGb3JtCit7CisgICAgR3RrQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgIEdMaXN0ICpjaGlsZHJlbjsKKworICAgIGd1aW50IHdpZHRoOworICAgIGd1aW50IGhlaWdodDsKKworICAgIEdka1dpbmRvdyAqYmluX3dpbmRvdzsKKworICAgIEdka1Zpc2liaWxpdHlTdGF0ZSB2aXNpYmlsaXR5OworICAgIGd1bG9uZyBjb25maWd1cmVfc2VyaWFsOworCisgICAgZ2ludCBmcmVlemVfY291bnQ7Cit9OworCitzdHJ1Y3QgX0d0a0Zvcm1DbGFzcworeworICAgIEd0a0NvbnRhaW5lckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0d0a1R5cGUgZ3RrX2Zvcm1fZ2V0X3R5cGUodm9pZCk7CisKK0d0a1dpZGdldCAqZ3RrX2Zvcm1fbmV3KHZvaWQpOworCit2b2lkIGd0a19mb3JtX3B1dChHdGtGb3JtICogZm9ybSwgR3RrV2lkZ2V0ICogd2lkZ2V0LAorCWdpbnQgeCwgZ2ludCB5KTsKKwordm9pZCBndGtfZm9ybV9tb3ZlKEd0a0Zvcm0gKmZvcm0sIEd0a1dpZGdldCAqIHdpZGdldCwKKwlnaW50IHgsIGdpbnQgeSk7CisKK3ZvaWQgZ3RrX2Zvcm1fbW92ZV9yZXNpemUoR3RrRm9ybSAqIGZvcm0sIEd0a1dpZGdldCAqIHdpZGdldCwKKwlnaW50IHgsIGdpbnQgeSwKKwlnaW50IHcsIGdpbnQgaCk7Cit2b2lkIGd0a19mb3JtX3NldF9zaXplKEd0a0Zvcm0gKiBmb3JtLCBndWludCB3aWR0aCwgZ3VpbnQgaGVpZ2h0KTsKKworLyogVGhlc2UgZGlzYWJsZSBhbmQgZW5hYmxlIG1vdmluZyBhbmQgcmVwYWludGluZyByZXNwZWN0aXZlbHkuICBJZiB5b3UKKyAqIHdhbnQgdG8gdXBkYXRlIHRoZSBsYXlvdXQncyBvZmZzZXRzIGJ1dCBkbyBub3Qgd2FudCBpdCB0byByZXBhaW50CisgKiBpdHNlbGYsIHlvdSBzaG91bGQgdXNlIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworCit2b2lkIGd0a19mb3JtX2ZyZWV6ZShHdGtGb3JtICpmb3JtKTsKK3ZvaWQgZ3RrX2Zvcm1fdGhhdyhHdGtGb3JtICpmb3JtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCS8qIF9fR1RLX0ZPUk1fSF9fICovCmRpZmYgLS1naXQgYS9zcmMvZ3VpX2d0a192bXMuaCBiL3NyYy9ndWlfZ3RrX3Ztcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODcyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX2d0a192bXMuaApAQCAtMCwwICsxLDczNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZCAgICBieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWRpLgorICoKKyAqIEZpbGUgTU9USUZfUkVERUZJTkVTLkggb3JpZ2luYWxseSBkZWxpdmVycyB0b2dldGhlciB3aXRoCisgKiBPcGVuVk1TIFBvcnRpbmcgTGlicmFyeQorICogaHR0cDovL3d3dy5vcGVudm1zLmNvbXBhcS5jb20vb3BlbnZtcy9wcm9kdWN0cy9pcHMvcG9ydGluZy5odG1sCisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBWaW0gZGV2ZWxvcG1lbnQuCisgKiBPcmlnaW5hbCBmaWxlIGNvbnRhaW5zIGp1c3QgZGVmaW5lcyB0aGF0IEdUSyBmb3IgT3BlblZNUyB1c2VzLAorICogYnV0IG5vdCBhbGwgZnVuY3Rpb25zIHRoYXQgREVDVyBsaWJyYXJ5IGhhcy4gVGhlcmVmb3JlIGl0IGhhcyBiZWVuIGV4cGFuZGVkCisgKiB3aXRoIG5lY2Vzc2FyeSBkZWZpbmVzIGZvciBWaW0gb24gT3BlblZNUyB3aXRoIEdUSyBHVUkuCisgKgorICogWm9sdGFuIEFycGFkZmZ5IDxhcnBhZGZmeUBwb2xhcmhvbWUuY29tPgorICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkgKgorICogQ29weXJpZ2h0IDIwMDAgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCQkJCSAqCisgKgkJCQkJCQkJCSAqCisgKiBDT01QQVEgUmVnaXN0ZXJlZCBpbiBVLlMuIFBhdGVudCBhbmQgVHJhZGVtYXJrIE9mZmljZS4JCSAqCisgKgkJCQkJCQkJCSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU1QT1JUQU5UOiBDYXJlZnVsbHkgcmVhZCB0aGUgTGljZW5zZSBUZXJtcyBiZWxvdyBiZWZvcmUJCSAqCisgKiBwcm9jZWVkaW5nLglCeSB1c2Ugb2YgdGhlc2UgbWF0ZXJpYWxzIHlvdSBhZ3JlZSB0byB0aGVzZSB0ZXJtcy4JICoKKyAqIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhlc2UgdGVybXMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIG9yICAqCisgKiB0aGUgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCQkJCQkgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExJQ0VOU0UgVEVSTVMJCQkJCQkJICoKKyAqIDEuIEdSQU5UCQkJCQkJCQkgKgorICogQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uICgiQ09NUEFRIikgZ3JhbnRzIHlvdSB0aGUgcmlnaHQgdG8gdXNlLAkgKgorICogbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlICh0aGUgIlNvZnR3YXJlIikJICoKKyAqIG9uIGFueSBudW1iZXIgb2YgY29tcHV0ZXJzLiBZb3UgbWF5IHVzZSB0aGUgU29mdHdhcmUgYXMgcGFydCBvZgkgKgorICogY3JlYXRpbmcgYSBzb2Z0d2FyZSBwcm9ncmFtIG9yIHByb2R1Y3QgaW50ZW5kZWQgZm9yIGNvbW1lcmNpYWwgb3IJICoKKyAqIG5vbi1jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBpbiBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCBiaW5hcnksICAqCisgKiBvciBleGVjdXRhYmxlIGZvcm1hdHMuIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgU29mdHdhcmUgYXMJCSAqCisgKiBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIHByb3ZpZGVkIHRoaXMgbGljZW5zZSBpcyBub3QgcmVtb3ZlZAkgKgorICogZnJvbSB0aGUgU29mdHdhcmUgYW5kIGFueSBtb2RpZmljYXRpb25zIGFyZSBjb25zcGljdW91c2x5IGluZGljYXRlZC4gICoKKyAqIDIuIENPUFlSSUdIVAkJCQkJCQkJICoKKyAqIFRoZSBTb2Z0d2FyZSBpcyBvd25lZCBieSBDT01QQVEgYW5kIGl0cyBzdXBwbGllcnMgYW5kIGlzIHByb3RlY3RlZCBieSAqCisgKiBjb3B5cmlnaHQgbGF3cyBhbmQgaW50ZXJuYXRpb25hbCB0cmVhdGllcy4gIFlvdXIgdXNlIG9mIHRoZSBTb2Z0d2FyZSAgKgorICogYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBhcHBsaWNhYmxlIGNvcHlyaWdodAkgKgorICogbGF3cyBhbmQgdGhlIGV4cHJlc3MgcmlnaHRzIGFuZCByZXN0cmljdGlvbnMgb2YgdGhlc2UgdGVybXMuCQkgKgorICogMy4gUkVTVFJJQ1RJT05TCQkJCQkJCSAqCisgKiBZb3UgbWF5IG5vdCByZW1vdmUgYW55IGNvcHlyaWdodCwgdHJhZGVtYXJrLCBvciBvdGhlciBwcm9wcmlldGFyeQkgKgorICogbm90aWNlcyBmcm9tIHRoZSBTb2Z0d2FyZSBvciB0aGUgYXNzb2NpYXRlZAlkb2N1bWVudGF0aW9uLgkJICoKKyAqIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCBhbGwgYXBwbGljYWJsZSBleHBvcnQgb3IJICoKKyAqIHJlLWV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb25zIGlmIHlvdSBleHBvcnQgdGhlIFNvZnR3YXJlLgkgKgorICogVGhpcyBsaWNlbnNlIGlzIGdvdmVybmVkIGJ5IGFuZCBpcyB0byBiZSBjb25zdHJ1ZWQgdW5kZXIgdGhlIGxhd3MJICoKKyAqIG9mIHRoZSBTdGF0ZSBvZiBUZXhhcy4JCQkJCQkgKgorICoJCQkJCQkJCQkgKgorICogRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBBTkQgTElBQklMSVRZCQkJCQkgKgorICogQ29tcGFxIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIHRlY2huaWNhbCBvciBlZGl0b3JpYWwgZXJyb3JzIG9yCSAqCisgKiBvbWlzc2lvbnMgY29udGFpbmVkIGhlcmVpbi4gVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMJICoKKyAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgkJCQkJICoKKyAqCQkJCQkJCQkJICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELgkgKgorICogVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBSRU1BSU5TIFdJVEggICoKKyAqIFJFQ0lQSUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIENPTVBBUSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCSAqCisgKiBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSBPUiBPVEhFUiBEQU1BR0VTCSAqCisgKiBXSEFUU09FVkVSIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIERBTUFHRVMgRk9SIExPU1MgT0YgQlVTSU5FU1MgKgorICogUFJPRklUUywgQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIEJVU0lORVNTIElORk9STUFUSU9OKSwJICoKKyAqIEVWRU4gSUYgQ09NUEFRIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUwkgKgorICogQU5EIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNUIE9SIFRPUlQgSU5DTFVESU5HIE5FR0xJR0VOQ0UuCSAqCisgKgkJCQkJCQkJCSAqCisgKiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGNvbmNlcm5pbmcgdGhpcyBsaWNlbnNlLCBwbGVhc2UgY29udGFjdDoJICoKKyAqIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgU29mdHdhcmUgQnVzaW5lc3MgUHJhY3RpY2VzLCBaS08xLTIvRDIyLCAqCisgKiAxMTAgU3BpdCBCcm9vayBSb2FkLCBOYXNodWEsIE5ILiAwMzA2Mi0yNjk4LgkJCQkgKgorICoJCQkJCQkJCQkgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBJTlRSSU5TSUMuSCBvbWl0cyBwcm90byBpZiBYdEZyZWUgaXMgZGVmaW5lZCAqLworLyogVk1TX0JFR0lOX0NfUExVU19QTFVTICovCitleHRlcm4gdm9pZCBYdEZyZWUoY2hhciopOworLyogVk1TX0VORF9DX1BMVVNfUExVUyAqLworCisjZGVmaW5lIF9YUmVnaXN0ZXJGaWx0ZXJCeVR5cGUgX1hSRUdJU1RFUkZJTFRFUkJZVFlQRQorCisjZGVmaW5lIFhBbGxvY0NsYXNzSGludCBYQUxMT0NDTEFTU0hJTlQKKyNkZWZpbmUgWEFsbG9jQ29sb3IgWEFMTE9DQ09MT1IKKyNkZWZpbmUgWEFsbG9jQ29sb3JDZWxscyBYQUxMT0NDT0xPUkNFTExTCisjZGVmaW5lIFhBbGxvY1NpemVIaW50cyBYQUxMT0NTSVpFSElOVFMKKyNkZWZpbmUgWEFsbG9jV01IaW50cyBYQUxMT0NXTUhJTlRTCisjZGVmaW5lIFhBdXRvUmVwZWF0T2ZmIFhBVVRPUkVQRUFUT0ZGCisjZGVmaW5lIFhBdXRvUmVwZWF0T24gWEFVVE9SRVBFQVRPTgorI2RlZmluZSBYQmFzZUZvbnROYW1lTGlzdE9mRm9udFNldCBYQkFTRUZPTlROQU1FTElTVE9GRk9OVFNFVAorI2RlZmluZSBYQmVsbCBYQkVMTAorI2RlZmluZSBYQml0bWFwUGFkIFhCSVRNQVBQQUQKKyNkZWZpbmUgWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiIFhDSEFOR0VBQ1RJVkVQT0lOVEVSR1JBQgorI2RlZmluZSBYQ2hhbmdlR0MgWENIQU5HRUdDCisjZGVmaW5lIFhDaGFuZ2VQcm9wZXJ0eSBYQ0hBTkdFUFJPUEVSVFkKKyNkZWZpbmUgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMgWENIQU5HRVdJTkRPV0FUVFJJQlVURVMKKyNkZWZpbmUgWENoZWNrSWZFdmVudCBYQ0hFQ0tJRkVWRU5UCisjZGVmaW5lIFhDaGVja01hc2tFdmVudCBYQ0hFQ0tNQVNLRVZFTlQKKyNkZWZpbmUgWENoZWNrVHlwZWRFdmVudCBYQ0hFQ0tUWVBFREVWRU5UCisjZGVmaW5lIFhDaGVja1R5cGVkV2luZG93RXZlbnQgWENIRUNLVFlQRURXSU5ET1dFVkVOVAorI2RlZmluZSBYQ2hlY2tXaW5kb3dFdmVudCBYQ0hFQ0tXSU5ET1dFVkVOVAorI2RlZmluZSBYQ2xlYXJBcmVhIFhDTEVBUkFSRUEKKyNkZWZpbmUgWENsZWFyV2luZG93IFhDTEVBUldJTkRPVworI2RlZmluZSBYQ2xpcEJveCBYQ0xJUEJPWAorI2RlZmluZSBYQ2xvc2VEaXNwbGF5IFhDTE9TRURJU1BMQVkKKyNkZWZpbmUgWENsb3NlSU0gWENMT1NFSU0KKyNkZWZpbmUgWENvbmZpZ3VyZVdpbmRvdyBYQ09ORklHVVJFV0lORE9XCisjZGVmaW5lIFhDb252ZXJ0U2VsZWN0aW9uIFhDT05WRVJUU0VMRUNUSU9OCisjZGVmaW5lIFhDb3B5QXJlYSBYQ09QWUFSRUEKKyNkZWZpbmUgWENvcHlHQyBYQ09QWUdDCisjZGVmaW5lIFhDb3B5UGxhbmUgWENPUFlQTEFORQorI2RlZmluZSBYQ3JlYXRlQml0bWFwRnJvbURhdGEgWENSRUFURUJJVE1BUEZST01EQVRBCisjZGVmaW5lIFhDcmVhdGVDb2xvcm1hcCBYQ1JFQVRFQ09MT1JNQVAKKyNkZWZpbmUgWENyZWF0ZUZvbnRDdXJzb3IgWENSRUFURUZPTlRDVVJTT1IKKyNkZWZpbmUgWENyZWF0ZUZvbnRTZXQgWENSRUFURUZPTlRTRVQKKyNkZWZpbmUgWENyZWF0ZUdDIFhDUkVBVEVHQworI2RlZmluZSBYQ3JlYXRlSUMgWENSRUFURUlDCisjZGVmaW5lIFhDcmVhdGVJbWFnZSBYQ1JFQVRFSU1BR0UKKyNkZWZpbmUgWENyZWF0ZVBpeG1hcCBYQ1JFQVRFUElYTUFQCisjZGVmaW5lIFhDcmVhdGVQaXhtYXBDdXJzb3IgWENSRUFURVBJWE1BUENVUlNPUgorI2RlZmluZSBYQ3JlYXRlUGl4bWFwRnJvbUJpdG1hcERhdGEgWENSRUFURVBJWE1BUEZST01CSVRNQVBEQVRBCisjZGVmaW5lIFhDcmVhdGVSZWdpb24gWENSRUFURVJFR0lPTgorI2RlZmluZSBYQ3JlYXRlU2ltcGxlV2luZG93IFhDUkVBVEVTSU1QTEVXSU5ET1cKKyNkZWZpbmUgWENyZWF0ZVdpbmRvdyBYQ1JFQVRFV0lORE9XCisjZGVmaW5lIFhEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5IFhERUZBVUxUU0NSRUVOT0ZESVNQTEFZCisjZGVmaW5lIFhEZWZpbmVDdXJzb3IgWERFRklORUNVUlNPUgorI2RlZmluZSBYRGVsZXRlUHJvcGVydHkgWERFTEVURVBST1BFUlRZCisjZGVmaW5lIFhEZXN0cm95SUMgWERFU1RST1lJQworI2RlZmluZSBYRGVzdHJveVJlZ2lvbiBYREVTVFJPWVJFR0lPTgorI2RlZmluZSBYRGVzdHJveVdpbmRvdyBYREVTVFJPWVdJTkRPVworI2RlZmluZSBYRGlzcGxheU5hbWUgWERJU1BMQVlOQU1FCisjZGVmaW5lIFhEaXNwbGF5T2ZTY3JlZW4gWERJU1BMQVlPRlNDUkVFTgorI2RlZmluZSBYRGlzcGxheVN0cmluZyBYRElTUExBWVNUUklORworI2RlZmluZSBYRHJhd0FyYyBYRFJBV0FSQworI2RlZmluZSBYRHJhd0ltYWdlU3RyaW5nIFhEUkFXSU1BR0VTVFJJTkcKKyNkZWZpbmUgWERyYXdJbWFnZVN0cmluZzE2IFhEUkFXSU1BR0VTVFJJTkcxNgorI2RlZmluZSBYRHJhd0xpbmUgWERSQVdMSU5FCisjZGVmaW5lIFhEcmF3TGluZXMgWERSQVdMSU5FUworI2RlZmluZSBYRHJhd1BvaW50IFhEUkFXUE9JTlQKKyNkZWZpbmUgWERyYXdQb2ludHMgWERSQVdQT0lOVFMKKyNkZWZpbmUgWERyYXdSZWN0YW5nbGUgWERSQVdSRUNUQU5HTEUKKyNkZWZpbmUgWERyYXdTZWdtZW50cyBYRFJBV1NFR01FTlRTCisjZGVmaW5lIFhEcmF3U3RyaW5nIFhEUkFXU1RSSU5HCisjZGVmaW5lIFhEcmF3U3RyaW5nMTYgWERSQVdTVFJJTkcxNgorI2RlZmluZSBYRW1wdHlSZWdpb24gWEVNUFRZUkVHSU9OCisjZGVmaW5lIFhFcXVhbFJlZ2lvbiBYRVFVQUxSRUdJT04KKyNkZWZpbmUgWEV2ZW50c1F1ZXVlZCBYRVZFTlRTUVVFVUVECisjZGVmaW5lIFhFeHRlbnRzT2ZGb250U2V0IFhFWFRFTlRTT0ZGT05UU0VUCisjZGVmaW5lIFhGZXRjaEJ1ZmZlciBYRkVUQ0hCVUZGRVIKKyNkZWZpbmUgWEZpbGxBcmMgWEZJTExBUkMKKyNkZWZpbmUgWEZpbGxQb2x5Z29uIFhGSUxMUE9MWUdPTgorI2RlZmluZSBYRmlsbFJlY3RhbmdsZSBYRklMTFJFQ1RBTkdMRQorI2RlZmluZSBYRmlsbFJlY3RhbmdsZXMgWEZJTExSRUNUQU5HTEVTCisjZGVmaW5lIFhGaWx0ZXJFdmVudCBYRklMVEVSRVZFTlQKKyNkZWZpbmUgWEZsdXNoIFhGTFVTSAorI2RlZmluZSBYRm9udHNPZkZvbnRTZXQgWEZPTlRTT0ZGT05UU0VUCisjZGVmaW5lIFhGcmVlIFhGUkVFCisjZGVmaW5lIFhGcmVlQ29sb3JtYXAgWEZSRUVDT0xPUk1BUAorI2RlZmluZSBYRnJlZUNvbG9ycyBYRlJFRUNPTE9SUworI2RlZmluZSBYRnJlZUN1cnNvciBYRlJFRUNVUlNPUgorI2RlZmluZSBYRnJlZUZvbnQgWEZSRUVGT05UCisjZGVmaW5lIFhGcmVlRm9udEluZm8gWEZSRUVGT05USU5GTworI2RlZmluZSBYRnJlZUZvbnROYW1lcyBYRlJFRUZPTlROQU1FUworI2RlZmluZSBYRnJlZUZvbnRTZXQgWEZSRUVGT05UU0VUCisjZGVmaW5lIFhGcmVlR0MgWEZSRUVHQworI2RlZmluZSBYRnJlZU1vZGlmaWVybWFwIFhGUkVFTU9ESUZJRVJNQVAKKyNkZWZpbmUgWEZyZWVQaXhtYXAgWEZSRUVQSVhNQVAKKyNkZWZpbmUgWEZyZWVTdHJpbmdMaXN0IFhGUkVFU1RSSU5HTElTVAorI2RlZmluZSBYR2V0QXRvbU5hbWUgWEdFVEFUT01OQU1FCisjZGVmaW5lIFhHZXREZWZhdWx0IFhHRVRERUZBVUxUCisjZGVmaW5lIFhHZXRFcnJvckRhdGFiYXNlVGV4dCBYR0VURVJST1JEQVRBQkFTRVRFWFQKKyNkZWZpbmUgWEdldEVycm9yVGV4dCBYR0VURVJST1JURVhUCisjZGVmaW5lIFhHZXRGb250UHJvcGVydHkgWEdFVEZPTlRQUk9QRVJUWQorI2RlZmluZSBYR2V0R0NWYWx1ZXMgWEdFVEdDVkFMVUVTCisjZGVmaW5lIFhHZXRHZW9tZXRyeSBYR0VUR0VPTUVUUlkKKyNkZWZpbmUgWEdldEljb25TaXplcyBYR0VUSUNPTlNJWkVTCisjZGVmaW5lIFhHZXRJQ1ZhbHVlcyBYR0VUSUNWQUxVRVMKKyNkZWZpbmUgWEdldElNVmFsdWVzIFhHRVRJTVZBTFVFUworI2RlZmluZSBYR2V0SW1hZ2UgWEdFVElNQUdFCisjZGVmaW5lIFhHZXRLZXlib2FyZENvbnRyb2wgWEdFVEtFWUJPQVJEQ09OVFJPTAorI2RlZmluZSBYR2V0TW9kaWZpZXJNYXBwaW5nIFhHRVRNT0RJRklFUk1BUFBJTkcKKyNkZWZpbmUgWEdldE1vdGlvbkV2ZW50cyBYR0VUTU9USU9ORVZFTlRTCisjZGVmaW5lIFhHZXROb3JtYWxIaW50cyBYR0VUTk9STUFMSElOVFMKKyNkZWZpbmUgWEdldFNlbGVjdGlvbk93bmVyIFhHRVRTRUxFQ1RJT05PV05FUgorI2RlZmluZSBYR2V0U3ViSW1hZ2UgWEdFVFNVQklNQUdFCisjZGVmaW5lIFhHZXRWaXN1YWxJbmZvIFhHRVRWSVNVQUxJTkZPCisjZGVmaW5lIFhHZXRXTUNvbG9ybWFwV2luZG93cyBYR0VUV01DT0xPUk1BUFdJTkRPV1MKKyNkZWZpbmUgWEdldFdNUHJvdG9jb2xzIFhHRVRXTVBST1RPQ09MUworI2RlZmluZSBYR2V0V01IaW50cyBYR0VUV01ISU5UUworI2RlZmluZSBYR2V0V01OYW1lIFhHRVRXTU5BTUUKKyNkZWZpbmUgWEdldFdNTm9ybWFsSGludHMgWEdFVFdNTk9STUFMSElOVFMKKyNkZWZpbmUgWEdldFdpbmRvd0F0dHJpYnV0ZXMgWEdFVFdJTkRPV0FUVFJJQlVURVMKKyNkZWZpbmUgWEdldFdpbmRvd1Byb3BlcnR5IFhHRVRXSU5ET1dQUk9QRVJUWQorI2RlZmluZSBYR3JhYktleWJvYXJkIFhHUkFCS0VZQk9BUkQKKyNkZWZpbmUgWEdyYWJQb2ludGVyIFhHUkFCUE9JTlRFUgorI2RlZmluZSBYR3JhYlNlcnZlciBYR1JBQlNFUlZFUgorI2RlZmluZSBYSGVpZ2h0T2ZTY3JlZW4gWEhFSUdIVE9GU0NSRUVOCisjZGVmaW5lIFhJY29uaWZ5V2luZG93IFhJQ09OSUZZV0lORE9XCisjZGVmaW5lIFhJZkV2ZW50IFhJRkVWRU5UCisjZGVmaW5lIFhJbnRlcm5BdG9tIFhJTlRFUk5BVE9NCisjZGVmaW5lIFhJbnRlcnNlY3RSZWdpb24gWElOVEVSU0VDVFJFR0lPTgorI2RlZmluZSBYS2V5Y29kZVRvS2V5c3ltIFhLRVlDT0RFVE9LRVlTWU0KKyNkZWZpbmUgWEtleXN5bVRvS2V5Y29kZSBYS0VZU1lNVE9LRVlDT0RFCisjZGVmaW5lIFhLZXlzeW1Ub1N0cmluZyBYS0VZU1lNVE9TVFJJTkcKKyNkZWZpbmUgWExpc3RGb250cyBYTElTVEZPTlRTCisjZGVmaW5lIFhMaXN0Rm9udHNXaXRoSW5mbyBYTElTVEZPTlRTV0lUSElORk8KKyNkZWZpbmUgWExpc3RQaXhtYXBGb3JtYXRzIFhMSVNUUElYTUFQRk9STUFUUworI2RlZmluZSBYTGlzdFByb3BlcnRpZXMgWExJU1RQUk9QRVJUSUVTCisjZGVmaW5lIFhMb2FkUXVlcnlGb250IFhMT0FEUVVFUllGT05UCisjZGVmaW5lIFhMb29rdXBTdHJpbmcgWExPT0tVUFNUUklORworI2RlZmluZSBYTG93ZXJXaW5kb3cgWExPV0VSV0lORE9XCisjZGVmaW5lIFhNYXBSYWlzZWQgWE1BUFJBSVNFRAorI2RlZmluZSBYTWFwV2luZG93IFhNQVBXSU5ET1cKKyNkZWZpbmUgWE1hdGNoVmlzdWFsSW5mbyBYTUFUQ0hWSVNVQUxJTkZPCisjZGVmaW5lIFhNb3ZlUmVzaXplV2luZG93IFhNT1ZFUkVTSVpFV0lORE9XCisjZGVmaW5lIFhNb3ZlV2luZG93IFhNT1ZFV0lORE9XCisjZGVmaW5lIFhOZXh0RXZlbnQgWE5FWFRFVkVOVAorI2RlZmluZSBYT2Zmc2V0UmVnaW9uIFhPRkZTRVRSRUdJT04KKyNkZWZpbmUgWE9wZW5EaXNwbGF5IFhPUEVORElTUExBWQorI2RlZmluZSBYT3BlbklNIFhPUEVOSU0KKyNkZWZpbmUgWFBhcnNlQ29sb3IgWFBBUlNFQ09MT1IKKyNkZWZpbmUgWFBhcnNlR2VvbWV0cnkgWFBBUlNFR0VPTUVUUlkKKyNkZWZpbmUgWFBlZWtFdmVudCBYUEVFS0VWRU5UCisjZGVmaW5lIFhQZW5kaW5nIFhQRU5ESU5HCisjZGVmaW5lIFhQb2ludEluUmVnaW9uIFhQT0lOVElOUkVHSU9OCisjZGVmaW5lIFhQb2x5Z29uUmVnaW9uIFhQT0xZR09OUkVHSU9OCisjZGVmaW5lIFhQdXRCYWNrRXZlbnQgWFBVVEJBQ0tFVkVOVAorI2RlZmluZSBYUHV0SW1hZ2UgWFBVVElNQUdFCisjZGVmaW5lIFhSb290V2luZG93IFhST09UV0lORE9XCisjZGVmaW5lIFhRdWVyeUNvbG9yIFhRVUVSWUNPTE9SCisjZGVmaW5lIFhRdWVyeUNvbG9ycyBYUVVFUllDT0xPUlMKKyNkZWZpbmUgWFF1ZXJ5RXh0ZW5zaW9uIFhRVUVSWUVYVEVOU0lPTgorI2RlZmluZSBYUXVlcnlQb2ludGVyIFhRVUVSWVBPSU5URVIKKyNkZWZpbmUgWFF1ZXJ5VHJlZSBYUVVFUllUUkVFCisjZGVmaW5lIFhSYWlzZVdpbmRvdyBYUkFJU0VXSU5ET1cKKyNkZWZpbmUgWFJlY29uZmlndXJlV01XaW5kb3cgWFJFQ09ORklHVVJFV01XSU5ET1cKKyNkZWZpbmUgWFJlY3RJblJlZ2lvbiBYUkVDVElOUkVHSU9OCisjZGVmaW5lIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nIFhSRUZSRVNIS0VZQk9BUkRNQVBQSU5HCisjZGVmaW5lIFhSZXBhcmVudFdpbmRvdyBYUkVQQVJFTlRXSU5ET1cKKyNkZWZpbmUgWFJlc2l6ZVdpbmRvdyBYUkVTSVpFV0lORE9XCisjZGVmaW5lIFhSZXN0YWNrV2luZG93cyBYUkVTVEFDS1dJTkRPV1MKKyNkZWZpbmUgWFJvb3RXaW5kb3dPZlNjcmVlbiBYUk9PVFdJTkRPV09GU0NSRUVOCisjZGVmaW5lIFhTY3JlZW5OdW1iZXJPZlNjcmVlbiBYU0NSRUVOTlVNQkVST0ZTQ1JFRU4KKyNkZWZpbmUgWFNlbGVjdEFzeW5jRXZlbnQgWFNFTEVDVEFTWU5DRVZFTlQKKyNkZWZpbmUgWFNlbGVjdEFzeW5jSW5wdXQgWFNFTEVDVEFTWU5DSU5QVVQKKyNkZWZpbmUgWFNlbGVjdElucHV0IFhTRUxFQ1RJTlBVVAorI2RlZmluZSBYU2VuZEV2ZW50IFhTRU5ERVZFTlQKKyNkZWZpbmUgWFNlcnZlclZlbmRvciBYU0VSVkVSVkVORE9SCisjZGVmaW5lIFhTZXRCYWNrZ3JvdW5kIFhTRVRCQUNLR1JPVU5ECisjZGVmaW5lIFhTZXRDbGFzc0hpbnQgWFNFVENMQVNTSElOVAorI2RlZmluZSBYU2V0Q2xpcE1hc2sgWFNFVENMSVBNQVNLCisjZGVmaW5lIFhTZXRDbGlwT3JpZ2luIFhTRVRDTElQT1JJR0lOCisjZGVmaW5lIFhTZXRDbGlwUmVjdGFuZ2xlcyBYU0VUQ0xJUFJFQ1RBTkdMRVMKKyNkZWZpbmUgWFNldENsb3NlRG93bk1vZGUgWFNFVENMT1NFRE9XTk1PREUKKyNkZWZpbmUgWFNldENvbW1hbmQgWFNFVENPTU1BTkQKKyNkZWZpbmUgWFNldERhc2hlcyBYU0VUREFTSEVTCisjZGVmaW5lIFhTZXRFcnJvckhhbmRsZXIgWFNFVEVSUk9SSEFORExFUgorI2RlZmluZSBYU2V0RmlsbFN0eWxlIFhTRVRGSUxMU1RZTEUKKyNkZWZpbmUgWFNldEZvbnQgWFNFVEZPTlQKKyNkZWZpbmUgWFNldEZvcmVncm91bmQgWFNFVEZPUkVHUk9VTkQKKyNkZWZpbmUgWFNldEZ1bmN0aW9uIFhTRVRGVU5DVElPTgorI2RlZmluZSBYU2V0R3JhcGhpY3NFeHBvc3VyZXMgWFNFVEdSQVBISUNTRVhQT1NVUkVTCisjZGVmaW5lIFhTZXRJQ0ZvY3VzIFhTRVRJQ0ZPQ1VTCisjZGVmaW5lIFhTZXRJQ1ZhbHVlcyBYU0VUSUNWQUxVRVMKKyNkZWZpbmUgWFNldElPRXJyb3JIYW5kbGVyIFhTRVRJT0VSUk9SSEFORExFUgorI2RlZmluZSBYU2V0SW5wdXRGb2N1cyBYU0VUSU5QVVRGT0NVUworI2RlZmluZSBYU2V0TGluZUF0dHJpYnV0ZXMgWFNFVExJTkVBVFRSSUJVVEVTCisjZGVmaW5lIFhTZXRMb2NhbGVNb2RpZmllcnMgWFNFVExPQ0FMRU1PRElGSUVSUworI2RlZmluZSBYU2V0Tm9ybWFsSGludHMgWFNFVE5PUk1BTEhJTlRTCisjZGVmaW5lIFhTZXRSZWdpb24gWFNFVFJFR0lPTgorI2RlZmluZSBYU2V0U2VsZWN0aW9uT3duZXIgWFNFVFNFTEVDVElPTk9XTkVSCisjZGVmaW5lIFhTZXRTdGlwcGxlIFhTRVRTVElQUExFCisjZGVmaW5lIFhTZXRTdWJ3aW5kb3dNb2RlIFhTRVRTVUJXSU5ET1dNT0RFCisjZGVmaW5lIFhTZXRUU09yaWdpbiBYU0VUVFNPUklHSU4KKyNkZWZpbmUgWFNldFRpbGUgWFNFVFRJTEUKKyNkZWZpbmUgWFNldFRyYW5zaWVudEZvckhpbnQgWFNFVFRSQU5TSUVOVEZPUkhJTlQKKyNkZWZpbmUgWFNldFdNQ29sb3JtYXBXaW5kb3dzIFhTRVRXTUNPTE9STUFQV0lORE9XUworI2RlZmluZSBYU2V0V01IaW50cyBYU0VUV01ISU5UUworI2RlZmluZSBYU2V0V01JY29uTmFtZSBYU0VUV01JQ09OTkFNRQorI2RlZmluZSBYU2V0V01OYW1lIFhTRVRXTU5BTUUKKyNkZWZpbmUgWFNldFdNTm9ybWFsSGludHMgWFNFVFdNTk9STUFMSElOVFMKKyNkZWZpbmUgWFNldFdNUHJvcGVydGllcyBYU0VUV01QUk9QRVJUSUVTCisjZGVmaW5lIFhTZXRXTVByb3RvY29scyBYU0VUV01QUk9UT0NPTFMKKyNkZWZpbmUgWFNldFdpbmRvd0JhY2tncm91bmQgWFNFVFdJTkRPV0JBQ0tHUk9VTkQKKyNkZWZpbmUgWFNldFdpbmRvd0JhY2tncm91bmRQaXhtYXAgWFNFVFdJTkRPV0JBQ0tHUk9VTkRQSVhNQVAKKyNkZWZpbmUgWFNldFdpbmRvd0NvbG9ybWFwIFhTRVRXSU5ET1dDT0xPUk1BUAorI2RlZmluZSBYU2hhcGVDb21iaW5lTWFzayBYU0hBUEVDT01CSU5FTUFTSworI2RlZmluZSBYU2hhcGVDb21iaW5lUmVjdGFuZ2xlcyBYU0hBUEVDT01CSU5FUkVDVEFOR0xFUworI2RlZmluZSBYU2hhcGVHZXRSZWN0YW5nbGVzIFhTSEFQRUdFVFJFQ1RBTkdMRVMKKyNkZWZpbmUgWFNocmlua1JlZ2lvbiBYU0hSSU5LUkVHSU9OCisjZGVmaW5lIFhTdG9yZUNvbG9yIFhTVE9SRUNPTE9SCisjZGVmaW5lIFhTdG9yZUNvbG9ycyBYU1RPUkVDT0xPUlMKKyNkZWZpbmUgWFN0b3JlTmFtZSBYU1RPUkVOQU1FCisjZGVmaW5lIFhTdHJpbmdUb0tleXN5bSBYU1RSSU5HVE9LRVlTWU0KKyNkZWZpbmUgWFN1YnRyYWN0UmVnaW9uIFhTVUJUUkFDVFJFR0lPTgorI2RlZmluZSBYU3VwcG9ydHNMb2NhbGUgWFNVUFBPUlRTTE9DQUxFCisjZGVmaW5lIFhTeW5jIFhTWU5DCisjZGVmaW5lIFhTeW5jaHJvbml6ZSBYU1lOQ0hST05JWkUKKyNkZWZpbmUgWFRleHRFeHRlbnRzIFhURVhURVhURU5UUworI2RlZmluZSBYVGV4dEV4dGVudHMxNiBYVEVYVEVYVEVOVFMxNgorI2RlZmluZSBYVGV4dFdpZHRoIFhURVhUV0lEVEgKKyNkZWZpbmUgWFRleHRXaWR0aDE2IFhURVhUV0lEVEgxNgorI2RlZmluZSBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMgWFRSQU5TTEFURUNPT1JESU5BVEVTCisjZGVmaW5lIFhVbmRlZmluZUN1cnNvciBYVU5ERUZJTkVDVVJTT1IKKyNkZWZpbmUgWFVuZ3JhYktleWJvYXJkIFhVTkdSQUJLRVlCT0FSRAorI2RlZmluZSBYVW5ncmFiUG9pbnRlciBYVU5HUkFCUE9JTlRFUgorI2RlZmluZSBYVW5ncmFiU2VydmVyIFhVTkdSQUJTRVJWRVIKKyNkZWZpbmUgWFVuaW9uUmVjdFdpdGhSZWdpb24gWFVOSU9OUkVDVFdJVEhSRUdJT04KKyNkZWZpbmUgWFVuaW9uUmVnaW9uIFhVTklPTlJFR0lPTgorI2RlZmluZSBYVW5tYXBXaW5kb3cgWFVOTUFQV0lORE9XCisjZGVmaW5lIF9YVW5yZWdpc3RlckZpbHRlciBfWFVOUkVHSVNURVJGSUxURVIKKyNkZWZpbmUgWFVuc2V0SUNGb2N1cyBYVU5TRVRJQ0ZPQ1VTCisjZGVmaW5lIFhWYUNyZWF0ZU5lc3RlZExpc3QgWFZBQ1JFQVRFTkVTVEVETElTVAorI2RlZmluZSBYVmlzdWFsSURGcm9tVmlzdWFsIFhWSVNVQUxJREZST01WSVNVQUwKKyNkZWZpbmUgWFdhcnBQb2ludGVyIFhXQVJQUE9JTlRFUgorI2RlZmluZSBYV2lkdGhPZlNjcmVlbiBYV0lEVEhPRlNDUkVFTgorI2RlZmluZSBYV2luZG93RXZlbnQgWFdJTkRPV0VWRU5UCisjZGVmaW5lIFhXaXRoZHJhd1dpbmRvdyBYV0lUSERSQVdXSU5ET1cKKyNkZWZpbmUgWFhvclJlZ2lvbiBYWE9SUkVHSU9OCisjZGVmaW5lIFhtQWRkUHJvdG9jb2xDYWxsYmFjayBYTUFERFBST1RPQ09MQ0FMTEJBQ0sKKyNkZWZpbmUgWG1BZGRQcm90b2NvbHMgWE1BRERQUk9UT0NPTFMKKyNkZWZpbmUgWG1DaGFuZ2VDb2xvciBYTUNIQU5HRUNPTE9SCisjZGVmaW5lIFhtQ2xpcGJvYXJkQ29weSBYTUNMSVBCT0FSRENPUFkKKyNkZWZpbmUgWG1DbGlwYm9hcmRFbmRDb3B5IFhNQ0xJUEJPQVJERU5EQ09QWQorI2RlZmluZSBYbUNsaXBib2FyZElucXVpcmVMZW5ndGggWE1DTElQQk9BUkRJTlFVSVJFTEVOR1RICisjZGVmaW5lIFhtQ2xpcGJvYXJkTG9jayBYTUNMSVBCT0FSRExPQ0sKKyNkZWZpbmUgWG1DbGlwYm9hcmRSZXRyaWV2ZSBYTUNMSVBCT0FSRFJFVFJJRVZFCisjZGVmaW5lIFhtQ2xpcGJvYXJkU3RhcnRDb3B5IFhNQ0xJUEJPQVJEU1RBUlRDT1BZCisjZGVmaW5lIFhtQ2xpcGJvYXJkVW5sb2NrIFhNQ0xJUEJPQVJEVU5MT0NLCisjZGVmaW5lIFhtQ3JlYXRlQXJyb3dCdXR0b24gWE1DUkVBVEVBUlJPV0JVVFRPTgorI2RlZmluZSBYbUNyZWF0ZUFycm93QnV0dG9uR2FkZ2V0IFhNQ1JFQVRFQVJST1dCVVRUT05HQURHRVQKKyNkZWZpbmUgWG1DcmVhdGVDYXNjYWRlQnV0dG9uIFhNQ1JFQVRFQ0FTQ0FERUJVVFRPTgorI2RlZmluZSBYbUNyZWF0ZURpYWxvZ1NoZWxsIFhNQ1JFQVRFRElBTE9HU0hFTEwKKyNkZWZpbmUgWG1DcmVhdGVEcmFnSWNvbiBYTUNSRUFURURSQUdJQ09OCisjZGVmaW5lIFhtQ3JlYXRlRHJhd2luZ0FyZWEgWE1DUkVBVEVEUkFXSU5HQVJFQQorI2RlZmluZSBYbUNyZWF0ZURyYXduQnV0dG9uIFhNQ1JFQVRFRFJBV05CVVRUT04KKyNkZWZpbmUgWG1DcmVhdGVGaWxlU2VsZWN0aW9uQm94IFhNQ1JFQVRFRklMRVNFTEVDVElPTkJPWAorI2RlZmluZSBYbUNyZWF0ZUZpbGVTZWxlY3Rpb25EaWFsb2cgWE1DUkVBVEVGSUxFU0VMRUNUSU9ORElBTE9HCisjZGVmaW5lIFhtQ3JlYXRlRm9ybSBYTUNSRUFURUZPUk0KKyNkZWZpbmUgWG1DcmVhdGVGb3JtRGlhbG9nIFhNQ1JFQVRFRk9STURJQUxPRworI2RlZmluZSBYbUNyZWF0ZUZyYW1lIFhNQ1JFQVRFRlJBTUUKKyNkZWZpbmUgWG1DcmVhdGVJbmZvcm1hdGlvbkRpYWxvZyBYTUNSRUFURUlORk9STUFUSU9ORElBTE9HCisjZGVmaW5lIFhtQ3JlYXRlTGFiZWxHYWRnZXQgWE1DUkVBVEVMQUJFTEdBREdFVAorI2RlZmluZSBYbUNyZWF0ZU1haW5XaW5kb3cgWE1DUkVBVEVNQUlOV0lORE9XCisjZGVmaW5lIFhtQ3JlYXRlTWVudUJhciBYTUNSRUFURU1FTlVCQVIKKyNkZWZpbmUgWG1DcmVhdGVNZXNzYWdlQm94IFhNQ1JFQVRFTUVTU0FHRUJPWAorI2RlZmluZSBYbUNyZWF0ZU1lc3NhZ2VEaWFsb2cgWE1DUkVBVEVNRVNTQUdFRElBTE9HCisjZGVmaW5lIFhtQ3JlYXRlT3B0aW9uTWVudSBYTUNSRUFURU9QVElPTk1FTlUKKyNkZWZpbmUgWG1DcmVhdGVQYW5lZFdpbmRvdyBYTUNSRUFURVBBTkVEV0lORE9XCisjZGVmaW5lIFhtQ3JlYXRlUG9wdXBNZW51IFhNQ1JFQVRFUE9QVVBNRU5VCisjZGVmaW5lIFhtQ3JlYXRlUHJvbXB0RGlhbG9nIFhNQ1JFQVRFUFJPTVBURElBTE9HCisjZGVmaW5lIFhtQ3JlYXRlUHVsbGRvd25NZW51IFhNQ1JFQVRFUFVMTERPV05NRU5VCisjZGVmaW5lIFhtQ3JlYXRlUHVzaEJ1dHRvbiBYTUNSRUFURVBVU0hCVVRUT04KKyNkZWZpbmUgWG1DcmVhdGVQdXNoQnV0dG9uR2FkZ2V0IFhNQ1JFQVRFUFVTSEJVVFRPTkdBREdFVAorI2RlZmluZSBYbUNyZWF0ZVF1ZXN0aW9uRGlhbG9nIFhNQ1JFQVRFUVVFU1RJT05ESUFMT0cKKyNkZWZpbmUgWG1DcmVhdGVSYWRpb0JveCBYTUNSRUFURVJBRElPQk9YCisjZGVmaW5lIFhtQ3JlYXRlUm93Q29sdW1uIFhNQ1JFQVRFUk9XQ09MVU1OCisjZGVmaW5lIFhtQ3JlYXRlU2NhbGUgWE1DUkVBVEVTQ0FMRQorI2RlZmluZSBYbUNyZWF0ZVNjcm9sbEJhciBYTUNSRUFURVNDUk9MTEJBUgorI2RlZmluZSBYbUNyZWF0ZVNjcm9sbGVkTGlzdCBYTUNSRUFURVNDUk9MTEVETElTVAorI2RlZmluZSBYbUNyZWF0ZVNjcm9sbGVkVGV4dCBYTUNSRUFURVNDUk9MTEVEVEVYVAorI2RlZmluZSBYbUNyZWF0ZVNjcm9sbGVkV2luZG93IFhNQ1JFQVRFU0NST0xMRURXSU5ET1cKKyNkZWZpbmUgWG1DcmVhdGVTZWxlY3Rpb25EaWFsb2cgWE1DUkVBVEVTRUxFQ1RJT05ESUFMT0cKKyNkZWZpbmUgWG1DcmVhdGVTZXBhcmF0b3IgWE1DUkVBVEVTRVBBUkFUT1IKKyNkZWZpbmUgWG1DcmVhdGVTZXBhcmF0b3JHYWRnZXQgWE1DUkVBVEVTRVBBUkFUT1JHQURHRVQKKyNkZWZpbmUgWG1DcmVhdGVUZW1wbGF0ZURpYWxvZyBYTUNSRUFURVRFTVBMQVRFRElBTE9HCisjZGVmaW5lIFhtQ3JlYXRlVGV4dCBYTUNSRUFURVRFWFQKKyNkZWZpbmUgWG1DcmVhdGVUZXh0RmllbGQgWE1DUkVBVEVURVhURklFTEQKKyNkZWZpbmUgWG1DcmVhdGVUb2dnbGVCdXR0b24gWE1DUkVBVEVUT0dHTEVCVVRUT04KKyNkZWZpbmUgWG1DcmVhdGVUb2dnbGVCdXR0b25HYWRnZXQgWE1DUkVBVEVUT0dHTEVCVVRUT05HQURHRVQKKyNkZWZpbmUgWG1EcmFnU3RhcnQgWE1EUkFHU1RBUlQKKyNkZWZpbmUgWG1Ecm9wU2l0ZVJlZ2lzdGVyIFhNRFJPUFNJVEVSRUdJU1RFUgorI2RlZmluZSBYbURyb3BTaXRlVW5yZWdpc3RlciBYTURST1BTSVRFVU5SRUdJU1RFUgorI2RlZmluZSBYbURyb3BTaXRlVXBkYXRlIFhNRFJPUFNJVEVVUERBVEUKKyNkZWZpbmUgWG1Ecm9wVHJhbnNmZXJTdGFydCBYTURST1BUUkFOU0ZFUlNUQVJUCisjZGVmaW5lIFhtRmlsZVNlbGVjdGlvbkJveEdldENoaWxkIFhNRklMRVNFTEVDVElPTkJPWEdFVENISUxECisjZGVmaW5lIFhtRmlsZVNlbGVjdGlvbkRvU2VhcmNoIFhNRklMRVNFTEVDVElPTkRPU0VBUkNICisjZGVmaW5lIFhtRm9udExpc3RBcHBlbmRFbnRyeSBYTUZPTlRMSVNUQVBQRU5ERU5UUlkKKyNkZWZpbmUgWG1Gb250TGlzdENvcHkgWE1GT05UTElTVENPUFkKKyNkZWZpbmUgWG1Gb250TGlzdENyZWF0ZSBYTUZPTlRMSVNUQ1JFQVRFCisjZGVmaW5lIFhtRm9udExpc3RFbnRyeUNyZWF0ZSBYTUZPTlRMSVNURU5UUllDUkVBVEUKKyNkZWZpbmUgWG1Gb250TGlzdEVudHJ5RnJlZSBYTUZPTlRMSVNURU5UUllGUkVFCisjZGVmaW5lIFhtRm9udExpc3RFbnRyeUdldEZvbnQgWE1GT05UTElTVEVOVFJZR0VURk9OVAorI2RlZmluZSBYbUZvbnRMaXN0RW50cnlHZXRUYWcgWE1GT05UTElTVEVOVFJZR0VUVEFHCisjZGVmaW5lIFhtRm9udExpc3RFbnRyeUxvYWQgWE1GT05UTElTVEVOVFJZTE9BRAorI2RlZmluZSBYbUZvbnRMaXN0RnJlZSBYTUZPTlRMSVNURlJFRQorI2RlZmluZSBYbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0IFhNRk9OVExJU1RGUkVFRk9OVENPTlRFWFQKKyNkZWZpbmUgWG1Gb250TGlzdEdldE5leHRGb250IFhNRk9OVExJU1RHRVRORVhURk9OVAorI2RlZmluZSBYbUZvbnRMaXN0SW5pdEZvbnRDb250ZXh0IFhNRk9OVExJU1RJTklURk9OVENPTlRFWFQKKyNkZWZpbmUgWG1Gb250TGlzdE5leHRFbnRyeSBYTUZPTlRMSVNUTkVYVEVOVFJZCisjZGVmaW5lIFhtR2V0Q29sb3JzIFhNR0VUQ09MT1JTCisjZGVmaW5lIFhtR2V0Rm9jdXNXaWRnZXQgWE1HRVRGT0NVU1dJREdFVAorI2RlZmluZSBYbUdldE1lbnVDdXJzb3IgWE1HRVRNRU5VQ1VSU09SCisjZGVmaW5lIFhtR2V0UGl4bWFwQnlEZXB0aCBYTUdFVFBJWE1BUEJZREVQVEgKKyNkZWZpbmUgWG1HZXRUZWFyT2ZmQ29udHJvbCBYTUdFVFRFQVJPRkZDT05UUk9MCisjZGVmaW5lIFhtR2V0WG1EaXNwbGF5IFhNR0VUWE1ESVNQTEFZCisjZGVmaW5lIFhtSW1NYkxvb2t1cFN0cmluZyBYTUlNTUJMT09LVVBTVFJJTkcKKyNkZWZpbmUgWG1JbVJlZ2lzdGVyIFhNSU1SRUdJU1RFUgorI2RlZmluZSBYbUltU2V0Rm9jdXNWYWx1ZXMgWE1JTVNFVEZPQ1VTVkFMVUVTCisjZGVmaW5lIFhtSW1TZXRWYWx1ZXMgWE1JTVNFVFZBTFVFUworI2RlZmluZSBYbUltVW5yZWdpc3RlciBYTUlNVU5SRUdJU1RFUgorI2RlZmluZSBYbUltVW5zZXRGb2N1cyBYTUlNVU5TRVRGT0NVUworI2RlZmluZSBYbUludGVybkF0b20gWE1JTlRFUk5BVE9NCisjZGVmaW5lIFhtSXNNb3RpZldNUnVubmluZyBYTUlTTU9USUZXTVJVTk5JTkcKKyNkZWZpbmUgWG1MaXN0QWRkSXRlbSBYTUxJU1RBRERJVEVNCisjZGVmaW5lIFhtTGlzdEFkZEl0ZW1VbnNlbGVjdGVkIFhNTElTVEFERElURU1VTlNFTEVDVEVECisjZGVmaW5lIFhtTGlzdEFkZEl0ZW1zVW5zZWxlY3RlZCBYTUxJU1RBRERJVEVNU1VOU0VMRUNURUQKKyNkZWZpbmUgWG1MaXN0RGVsZXRlQWxsSXRlbXMgWE1MSVNUREVMRVRFQUxMSVRFTVMKKyNkZWZpbmUgWG1MaXN0RGVsZXRlSXRlbXNQb3MgWE1MSVNUREVMRVRFSVRFTVNQT1MKKyNkZWZpbmUgWG1MaXN0RGVsZXRlUG9zIFhNTElTVERFTEVURVBPUworI2RlZmluZSBYbUxpc3REZXNlbGVjdEFsbEl0ZW1zIFhNTElTVERFU0VMRUNUQUxMSVRFTVMKKyNkZWZpbmUgWG1MaXN0RGVzZWxlY3RQb3MgWE1MSVNUREVTRUxFQ1RQT1MKKyNkZWZpbmUgWG1MaXN0R2V0S2JkSXRlbVBvcyBYTUxJU1RHRVRLQkRJVEVNUE9TCisjZGVmaW5lIFhtTGlzdEdldE1hdGNoUG9zIFhNTElTVEdFVE1BVENIUE9TCisjZGVmaW5lIFhtTGlzdEdldFNlbGVjdGVkUG9zIFhNTElTVEdFVFNFTEVDVEVEUE9TCisjZGVmaW5lIFhtTGlzdFBvc1NlbGVjdGVkIFhNTElTVFBPU1NFTEVDVEVECisjZGVmaW5lIFhtTGlzdFNlbGVjdEl0ZW0gWE1MSVNUU0VMRUNUSVRFTQorI2RlZmluZSBYbUxpc3RTZWxlY3RQb3MgWE1MSVNUU0VMRUNUUE9TCisjZGVmaW5lIFhtTGlzdFNldEJvdHRvbVBvcyBYTUxJU1RTRVRCT1RUT01QT1MKKyNkZWZpbmUgWG1MaXN0U2V0SXRlbSBYTUxJU1RTRVRJVEVNCisjZGVmaW5lIFhtTGlzdFNldEtiZEl0ZW1Qb3MgWE1MSVNUU0VUS0JESVRFTVBPUworI2RlZmluZSBYbUxpc3RTZXRQb3MgWE1MSVNUU0VUUE9TCisjZGVmaW5lIFhtTWFpbldpbmRvd1NldEFyZWFzIFhNTUFJTldJTkRPV1NFVEFSRUFTCisjZGVmaW5lIFhtTWVudVBvc2l0aW9uIFhNTUVOVVBPU0lUSU9OCisjZGVmaW5lIFhtTWVzc2FnZUJveEdldENoaWxkIFhNTUVTU0FHRUJPWEdFVENISUxECisjZGVmaW5lIFhtT3B0aW9uQnV0dG9uR2FkZ2V0IFhNT1BUSU9OQlVUVE9OR0FER0VUCisjZGVmaW5lIFhtT3B0aW9uTGFiZWxHYWRnZXQgWE1PUFRJT05MQUJFTEdBREdFVAorI2RlZmluZSBYbVByb2Nlc3NUcmF2ZXJzYWwgWE1QUk9DRVNTVFJBVkVSU0FMCisjZGVmaW5lIFhtUW1vdGlmIFhNUU1PVElGCisjZGVmaW5lIFhtUmVtb3ZlUHJvdG9jb2xDYWxsYmFjayBYTVJFTU9WRVBST1RPQ09MQ0FMTEJBQ0sKKyNkZWZpbmUgWG1SZXBUeXBlR2V0SWQgWE1SRVBUWVBFR0VUSUQKKyNkZWZpbmUgWG1SZXBUeXBlR2V0UmVjb3JkIFhNUkVQVFlQRUdFVFJFQ09SRAorI2RlZmluZSBYbVJlcFR5cGVSZWdpc3RlciBYTVJFUFRZUEVSRUdJU1RFUgorI2RlZmluZSBYbVJlcFR5cGVWYWxpZFZhbHVlIFhNUkVQVFlQRVZBTElEVkFMVUUKKyNkZWZpbmUgWG1TY3JvbGxCYXJTZXRWYWx1ZXMgWE1TQ1JPTExCQVJTRVRWQUxVRVMKKyNkZWZpbmUgWG1TY3JvbGxlZFdpbmRvd1NldEFyZWFzIFhNU0NST0xMRURXSU5ET1dTRVRBUkVBUworI2RlZmluZSBYbVNlbGVjdGlvbkJveEdldENoaWxkIFhNU0VMRUNUSU9OQk9YR0VUQ0hJTEQKKyNkZWZpbmUgWG1TdHJpbmdCeXRlQ29tcGFyZSBYTVNUUklOR0JZVEVDT01QQVJFCisjZGVmaW5lIFhtU3RyaW5nQ29tcGFyZSBYTVNUUklOR0NPTVBBUkUKKyNkZWZpbmUgWG1TdHJpbmdDb25jYXQgWE1TVFJJTkdDT05DQVQKKyNkZWZpbmUgWG1TdHJpbmdDb3B5IFhNU1RSSU5HQ09QWQorI2RlZmluZSBYbVN0cmluZ0NyZWF0ZSBYTVNUUklOR0NSRUFURQorI2RlZmluZSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZCBYTVNUUklOR0NSRUFURUxPQ0FMSVpFRAorI2RlZmluZSBYbVN0cmluZ0NyZWF0ZUx0b1IgWE1TVFJJTkdDUkVBVEVMVE9SCisjZGVmaW5lIFhtU3RyaW5nQ3JlYXRlU2ltcGxlIFhNU1RSSU5HQ1JFQVRFU0lNUExFCisjZGVmaW5lIFhtU3RyaW5nRHJhdyBYTVNUUklOR0RSQVcKKyNkZWZpbmUgWG1TdHJpbmdEcmF3VW5kZXJsaW5lIFhNU1RSSU5HRFJBV1VOREVSTElORQorI2RlZmluZSBYbVN0cmluZ0V4dGVudCBYTVNUUklOR0VYVEVOVAorI2RlZmluZSBYbVN0cmluZ0ZyZWUgWE1TVFJJTkdGUkVFCisjZGVmaW5lIFhtU3RyaW5nRnJlZUNvbnRleHQgWE1TVFJJTkdGUkVFQ09OVEVYVAorI2RlZmluZSBYbVN0cmluZ0dldEx0b1IgWE1TVFJJTkdHRVRMVE9SCisjZGVmaW5lIFhtU3RyaW5nR2V0TmV4dENvbXBvbmVudCBYTVNUUklOR0dFVE5FWFRDT01QT05FTlQKKyNkZWZpbmUgWG1TdHJpbmdHZXROZXh0U2VnbWVudCBYTVNUUklOR0dFVE5FWFRTRUdNRU5UCisjZGVmaW5lIFhtU3RyaW5nSW5pdENvbnRleHQgWE1TVFJJTkdJTklUQ09OVEVYVAorI2RlZmluZSBYbVN0cmluZ0xlbmd0aCBYTVNUUklOR0xFTkdUSAorI2RlZmluZSBYbVN0cmluZ0x0b1JDcmVhdGUgWE1TVFJJTkdMVE9SQ1JFQVRFCisjZGVmaW5lIFhtU3RyaW5nTkNvbmNhdCBYTVNUUklOR05DT05DQVQKKyNkZWZpbmUgWG1TdHJpbmdTZWdtZW50Q3JlYXRlIFhNU1RSSU5HU0VHTUVOVENSRUFURQorI2RlZmluZSBYbVN0cmluZ1dpZHRoIFhNU1RSSU5HV0lEVEgKKyNkZWZpbmUgWG1UZXh0Q2xlYXJTZWxlY3Rpb24gWE1URVhUQ0xFQVJTRUxFQ1RJT04KKyNkZWZpbmUgWG1UZXh0RmllbGRHZXRFZGl0YWJsZSBYTVRFWFRGSUVMREdFVEVESVRBQkxFCisjZGVmaW5lIFhtVGV4dEZpZWxkR2V0SW5zZXJ0aW9uUG9zaXRpb24gWE1URVhURklFTERHRVRJTlNFUlRJT05QT1NJVElPTgorI2RlZmluZSBYbVRleHRGaWVsZEdldExhc3RQb3NpdGlvbiBYTVRFWFRGSUVMREdFVExBU1RQT1NJVElPTgorI2RlZmluZSBYbVRleHRGaWVsZEdldFNlbGVjdGlvbiBYTVRFWFRGSUVMREdFVFNFTEVDVElPTgorI2RlZmluZSBYbVRleHRGaWVsZEdldFN0cmluZyBYTVRFWFRGSUVMREdFVFNUUklORworI2RlZmluZSBYbVRleHRGaWVsZEluc2VydCBYTVRFWFRGSUVMRElOU0VSVAorI2RlZmluZSBYbVRleHRGaWVsZFJlbW92ZSBYTVRFWFRGSUVMRFJFTU9WRQorI2RlZmluZSBYbVRleHRGaWVsZFNldFNlbGVjdGlvbiBYTVRFWFRGSUVMRFNFVFNFTEVDVElPTgorI2RlZmluZSBYbVRleHRGaWVsZFNldFN0cmluZyBYTVRFWFRGSUVMRFNFVFNUUklORworI2RlZmluZSBYbVRleHRHZXRDdXJzb3JQb3NpdGlvbiBYTVRFWFRHRVRDVVJTT1JQT1NJVElPTgorI2RlZmluZSBYbVRleHRHZXRJbnNlcnRpb25Qb3NpdGlvbiBYTVRFWFRHRVRJTlNFUlRJT05QT1NJVElPTgorI2RlZmluZSBYbVRleHRHZXRMYXN0UG9zaXRpb24gWE1URVhUR0VUTEFTVFBPU0lUSU9OCisjZGVmaW5lIFhtVGV4dEdldE1heExlbmd0aCBYTVRFWFRHRVRNQVhMRU5HVEgKKyNkZWZpbmUgWG1UZXh0R2V0U2VsZWN0aW9uIFhNVEVYVEdFVFNFTEVDVElPTgorI2RlZmluZSBYbVRleHRHZXRTZWxlY3Rpb25Qb3NpdGlvbiBYTVRFWFRHRVRTRUxFQ1RJT05QT1NJVElPTgorI2RlZmluZSBYbVRleHRHZXRTdHJpbmcgWE1URVhUR0VUU1RSSU5HCisjZGVmaW5lIFhtVGV4dEluc2VydCBYTVRFWFRJTlNFUlQKKyNkZWZpbmUgWG1UZXh0UmVtb3ZlIFhNVEVYVFJFTU9WRQorI2RlZmluZSBYbVRleHRSZXBsYWNlIFhNVEVYVFJFUExBQ0UKKyNkZWZpbmUgWG1UZXh0U2V0Q3Vyc29yUG9zaXRpb24gWE1URVhUU0VUQ1VSU09SUE9TSVRJT04KKyNkZWZpbmUgWG1UZXh0U2V0SGlnaGxpZ2h0IFhNVEVYVFNFVEhJR0hMSUdIVAorI2RlZmluZSBYbVRleHRTZXRJbnNlcnRpb25Qb3NpdGlvbiBYTVRFWFRTRVRJTlNFUlRJT05QT1NJVElPTgorI2RlZmluZSBYbVRleHRTZXRTZWxlY3Rpb24gWE1URVhUU0VUU0VMRUNUSU9OCisjZGVmaW5lIFhtVGV4dFNldFN0cmluZyBYTVRFWFRTRVRTVFJJTkcKKyNkZWZpbmUgWG1Ub2dnbGVCdXR0b25HYWRnZXRHZXRTdGF0ZSBYTVRPR0dMRUJVVFRPTkdBREdFVEdFVFNUQVRFCisjZGVmaW5lIFhtVG9nZ2xlQnV0dG9uR2FkZ2V0U2V0U3RhdGUgWE1UT0dHTEVCVVRUT05HQURHRVRTRVRTVEFURQorI2RlZmluZSBYbVRvZ2dsZUJ1dHRvbkdldFN0YXRlIFhNVE9HR0xFQlVUVE9OR0VUU1RBVEUKKyNkZWZpbmUgWG1Ub2dnbGVCdXR0b25TZXRTdGF0ZSBYTVRPR0dMRUJVVFRPTlNFVFNUQVRFCisjZGVmaW5lIFhtVXBkYXRlRGlzcGxheSBYTVVQREFURURJU1BMQVkKKyNkZWZpbmUgWG1WYUNyZWF0ZVNpbXBsZVJhZGlvQm94IFhNVkFDUkVBVEVTSU1QTEVSQURJT0JPWAorI2RlZmluZSBYbWJEcmF3U3RyaW5nIFhNQkRSQVdTVFJJTkcKKyNkZWZpbmUgWG1iTG9va3VwU3RyaW5nIFhNQkxPT0tVUFNUUklORworI2RlZmluZSBYbWJSZXNldElDIFhNQlJFU0VUSUMKKyNkZWZpbmUgWG1iU2V0V01Qcm9wZXJ0aWVzIFhNQlNFVFdNUFJPUEVSVElFUworI2RlZmluZSBYbWJUZXh0RXNjYXBlbWVudCBYTUJURVhURVNDQVBFTUVOVAorI2RlZmluZSBYbWJUZXh0RXh0ZW50cyBYTUJURVhURVhURU5UUworI2RlZmluZSBYbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5IFhNQlRFWFRMSVNUVE9URVhUUFJPUEVSVFkKKyNkZWZpbmUgWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdCBYTUJURVhUUFJPUEVSVFlUT1RFWFRMSVNUCisjZGVmaW5lIFhtdUNsaWVudFdpbmRvdyBYTVVDTElFTlRXSU5ET1cKKyNkZWZpbmUgWG11UHJpbnREZWZhdWx0RXJyb3JNZXNzYWdlIFhNVVBSSU5UREVGQVVMVEVSUk9STUVTU0FHRQorI2RlZmluZSBYcm1HZXREYXRhYmFzZSBYUk1HRVREQVRBQkFTRQorI2RlZmluZSBYcm1HZXRSZXNvdXJjZSBYUk1HRVRSRVNPVVJDRQorI2RlZmluZSBYcm1QdXRTdHJpbmdSZXNvdXJjZSBYUk1QVVRTVFJJTkdSRVNPVVJDRQorI2RlZmluZSBYcm1RdWFya1RvU3RyaW5nIFhSTVFVQVJLVE9TVFJJTkcKKyNkZWZpbmUgWHJtU3RyaW5nVG9RdWFyayBYUk1TVFJJTkdUT1FVQVJLCisjZGVmaW5lIFh0QWRkQ2FsbGJhY2sgWFRBRERDQUxMQkFDSworI2RlZmluZSBYdEFkZENhbGxiYWNrcyBYVEFERENBTExCQUNLUworI2RlZmluZSBYdEFkZEV2ZW50SGFuZGxlciBYVEFEREVWRU5USEFORExFUgorI2RlZmluZSBYdEFkZEdyYWIgWFRBRERHUkFCCisjZGVmaW5lIFh0QWxsb2NhdGVHQyBYVEFMTE9DQVRFR0MKKyNkZWZpbmUgWHRBcHBBZGRBY3Rpb25zIFhUQVBQQUREQUNUSU9OUworI2RlZmluZSBYdEFwcEFkZElucHV0IFhUQVBQQURESU5QVVQKKyNkZWZpbmUgWHRBcHBBZGRUaW1lT3V0IFhUQVBQQUREVElNRU9VVAorI2RlZmluZSBYdEFwcENyZWF0ZVNoZWxsIFhUQVBQQ1JFQVRFU0hFTEwKKyNkZWZpbmUgWHRBcHBJbml0aWFsaXplIFhUQVBQSU5JVElBTElaRQorI2RlZmluZSBYdEFwcE5leHRFdmVudCBYVEFQUE5FWFRFVkVOVAorI2RlZmluZSBYdEFwcFBlZWtFdmVudCBYVEFQUFBFRUtFVkVOVAorI2RlZmluZSBYdEFwcFBlbmRpbmcgWFRBUFBQRU5ESU5HCisjZGVmaW5lIFh0QXBwUHJvY2Vzc0V2ZW50IFhUQVBQUFJPQ0VTU0VWRU5UCisjZGVmaW5lIFh0QXBwU2V0RXJyb3JIYW5kbGVyIFhUQVBQU0VURVJST1JIQU5ETEVSCisjZGVmaW5lIFh0QXBwU2V0RmFsbGJhY2tSZXNvdXJjZXMgWFRBUFBTRVRGQUxMQkFDS1JFU09VUkNFUworI2RlZmluZSBYdEFwcFNldFdhcm5pbmdIYW5kbGVyIFhUQVBQU0VUV0FSTklOR0hBTkRMRVIKKyNkZWZpbmUgWHRBcHBTZXRXYXJuaW5nTXNnSGFuZGxlciBYVEFQUFNFVFdBUk5JTkdNU0dIQU5ETEVSCisjZGVmaW5lIFh0QXBwV2FybmluZyBYVEFQUFdBUk5JTkcKKyNkZWZpbmUgWHRDYWxsQWN0aW9uUHJvYyBYVENBTExBQ1RJT05QUk9DCisjZGVmaW5lIFh0Q2FsbENhbGxiYWNrTGlzdCBYVENBTExDQUxMQkFDS0xJU1QKKyNkZWZpbmUgWHRDYWxsQ2FsbGJhY2tzIFhUQ0FMTENBTExCQUNLUworI2RlZmluZSBYdENvbmZpZ3VyZVdpZGdldCBYVENPTkZJR1VSRVdJREdFVAorI2RlZmluZSBYdENvbnZlcnRBbmRTdG9yZSBYVENPTlZFUlRBTkRTVE9SRQorI2RlZmluZSBYdENyZWF0ZUFwcGxpY2F0aW9uQ29udGV4dCBYVENSRUFURUFQUExJQ0FUSU9OQ09OVEVYVAorI2RlZmluZSBYdENyZWF0ZU1hbmFnZWRXaWRnZXQgWFRDUkVBVEVNQU5BR0VEV0lER0VUCisjZGVmaW5lIFh0Q3JlYXRlUG9wdXBTaGVsbCBYVENSRUFURVBPUFVQU0hFTEwKKyNkZWZpbmUgWHRDcmVhdGVXaWRnZXQgWFRDUkVBVEVXSURHRVQKKyNkZWZpbmUgWHREYXRhYmFzZSBYVERBVEFCQVNFCisjZGVmaW5lIFh0RGVzdHJveVdpZGdldCBYVERFU1RST1lXSURHRVQKKyNkZWZpbmUgWHREaXNvd25TZWxlY3Rpb24gWFRESVNPV05TRUxFQ1RJT04KKyNkZWZpbmUgWHREaXNwYXRjaEV2ZW50IFhURElTUEFUQ0hFVkVOVAorI2RlZmluZSBYdERpc3BsYXlPZk9iamVjdCBYVERJU1BMQVlPRk9CSkVDVAorI2RlZmluZSBYdERpc3BsYXlTdHJpbmdDb252V2FybmluZyBYVERJU1BMQVlTVFJJTkdDT05WV0FSTklORworI2RlZmluZSBYdERpc3BsYXlUb0FwcGxpY2F0aW9uQ29udGV4dCBYVERJU1BMQVlUT0FQUExJQ0FUSU9OQ09OVEVYVAorI2RlZmluZSBYdEZyZWUgWFRGUkVFCisjZGVmaW5lIFh0R2V0QWN0aW9uS2V5c3ltIFhUR0VUQUNUSU9OS0VZU1lNCisjZGVmaW5lIFh0R2V0QWN0aW9uTGlzdCBYVEdFVEFDVElPTkxJU1QKKyNkZWZpbmUgWHRHZXRBcHBsaWNhdGlvbk5hbWVBbmRDbGFzcyBYVEdFVEFQUExJQ0FUSU9OTkFNRUFORENMQVNTCisjZGVmaW5lIFh0R2V0QXBwbGljYXRpb25SZXNvdXJjZXMgWFRHRVRBUFBMSUNBVElPTlJFU09VUkNFUworI2RlZmluZSBYdEdldEdDIFhUR0VUR0MKKyNkZWZpbmUgWHRHZXRNdWx0aUNsaWNrVGltZSBYVEdFVE1VTFRJQ0xJQ0tUSU1FCisjZGVmaW5lIFh0R2V0U2VsZWN0aW9uVmFsdWUgWFRHRVRTRUxFQ1RJT05WQUxVRQorI2RlZmluZSBYdEdldFNlbGVjdGlvblZhbHVlcyBYVEdFVFNFTEVDVElPTlZBTFVFUworI2RlZmluZSBYdEdldFN1YnJlc291cmNlcyBYVEdFVFNVQlJFU09VUkNFUworI2RlZmluZSBYdEdldFZhbHVlcyBYVEdFVFZBTFVFUworI2RlZmluZSBYdEdyYWJLZXlib2FyZCBYVEdSQUJLRVlCT0FSRAorI2RlZmluZSBYdEdyYWJQb2ludGVyIFhUR1JBQlBPSU5URVIKKyNkZWZpbmUgWHRIYXNDYWxsYmFja3MgWFRIQVNDQUxMQkFDS1MKKyNkZWZpbmUgWHRJbml0aWFsaXplV2lkZ2V0Q2xhc3MgWFRJTklUSUFMSVpFV0lER0VUQ0xBU1MKKyNkZWZpbmUgWHRJbnNlcnRFdmVudEhhbmRsZXIgWFRJTlNFUlRFVkVOVEhBTkRMRVIKKyNkZWZpbmUgWHRJc01hbmFnZWQgWFRJU01BTkFHRUQKKyNkZWZpbmUgWHRJc09iamVjdCBYVElTT0JKRUNUCisjZGVmaW5lIFh0SXNTZW5zaXRpdmUgWFRJU1NFTlNJVElWRQorI2RlZmluZSBYdElzU3ViY2xhc3MgWFRJU1NVQkNMQVNTCisjZGVmaW5lIFh0TGFzdFRpbWVzdGFtcFByb2Nlc3NlZCBYVExBU1RUSU1FU1RBTVBQUk9DRVNTRUQKKyNkZWZpbmUgWHRNYWtlR2VvbWV0cnlSZXF1ZXN0IFhUTUFLRUdFT01FVFJZUkVRVUVTVAorI2RlZmluZSBYdE1ha2VSZXNpemVSZXF1ZXN0IFhUTUFLRVJFU0laRVJFUVVFU1QKKyNkZWZpbmUgWHRNYWxsb2MgWFRNQUxMT0MKKyNkZWZpbmUgWHRNYW5hZ2VDaGlsZCBYVE1BTkFHRUNISUxECisjZGVmaW5lIFh0TWFuYWdlQ2hpbGRyZW4gWFRNQU5BR0VDSElMRFJFTgorI2RlZmluZSBYdE1lcmdlQXJnTGlzdHMgWFRNRVJHRUFSR0xJU1RTCisjZGVmaW5lIFh0TW92ZVdpZGdldCBYVE1PVkVXSURHRVQKKyNkZWZpbmUgWHROYW1lIFhUTkFNRQorI2RlZmluZSBYdE5hbWVUb1dpZGdldCBYVE5BTUVUT1dJREdFVAorI2RlZmluZSBYdE9wZW5EaXNwbGF5IFhUT1BFTkRJU1BMQVkKKyNkZWZpbmUgWHRPdmVycmlkZVRyYW5zbGF0aW9ucyBYVE9WRVJSSURFVFJBTlNMQVRJT05TCisjZGVmaW5lIFh0T3duU2VsZWN0aW9uIFhUT1dOU0VMRUNUSU9OCisjZGVmaW5lIFh0UGFyZW50IFhUUEFSRU5UCisjZGVmaW5lIFh0UGFyc2VUcmFuc2xhdGlvblRhYmxlIFhUUEFSU0VUUkFOU0xBVElPTlRBQkxFCisjZGVmaW5lIFh0UG9wZG93biBYVFBPUERPV04KKyNkZWZpbmUgWHRQb3B1cCBYVFBPUFVQCisjZGVmaW5lIFh0UXVlcnlHZW9tZXRyeSBYVFFVRVJZR0VPTUVUUlkKKyNkZWZpbmUgWHRSZWFsaXplV2lkZ2V0IFhUUkVBTElaRVdJREdFVAorI2RlZmluZSBYdFJlYWxsb2MgWFRSRUFMTE9DCisjZGVmaW5lIFh0UmVsZWFzZUdDIFhUUkVMRUFTRUdDCisjZGVmaW5lIFh0UmVtb3ZlQWxsQ2FsbGJhY2tzIFhUUkVNT1ZFQUxMQ0FMTEJBQ0tTCisjZGVmaW5lIFh0UmVtb3ZlQ2FsbGJhY2sgWFRSRU1PVkVDQUxMQkFDSworI2RlZmluZSBYdFJlbW92ZUV2ZW50SGFuZGxlciBYVFJFTU9WRUVWRU5USEFORExFUgorI2RlZmluZSBYdFJlbW92ZUdyYWIgWFRSRU1PVkVHUkFCCisjZGVmaW5lIFh0UmVtb3ZlSW5wdXQgWFRSRU1PVkVJTlBVVAorI2RlZmluZSBYdFJlbW92ZVRpbWVPdXQgWFRSRU1PVkVUSU1FT1VUCisjZGVmaW5lIFh0UmVzaXplV2lkZ2V0IFhUUkVTSVpFV0lER0VUCisjZGVmaW5lIFh0UmVzb2x2ZVBhdGhuYW1lIFhUUkVTT0xWRVBBVEhOQU1FCisjZGVmaW5lIFh0U2V0S2V5Ym9hcmRGb2N1cyBYVFNFVEtFWUJPQVJERk9DVVMKKyNkZWZpbmUgWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCBYVFNFVE1BUFBFRFdIRU5NQU5BR0VECisjZGVmaW5lIFh0U2V0U2Vuc2l0aXZlIFhUU0VUU0VOU0lUSVZFCisjZGVmaW5lIFh0U2V0VHlwZUNvbnZlcnRlciBYVFNFVFRZUEVDT05WRVJURVIKKyNkZWZpbmUgWHRTZXRWYWx1ZXMgWFRTRVRWQUxVRVMKKyNkZWZpbmUgWHRTaGVsbFN0cmluZ3MgWFRTSEVMTFNUUklOR1MKKyNkZWZpbmUgWHRTdHJpbmdzIFhUU1RSSU5HUworI2RlZmluZSBYdFRvb2xraXRJbml0aWFsaXplIFhUVE9PTEtJVElOSVRJQUxJWkUKKyNkZWZpbmUgWHRUcmFuc2xhdGVDb29yZHMgWFRUUkFOU0xBVEVDT09SRFMKKyNkZWZpbmUgWHRUcmFuc2xhdGVLZXljb2RlIFhUVFJBTlNMQVRFS0VZQ09ERQorI2RlZmluZSBYdFVuZ3JhYktleWJvYXJkIFhUVU5HUkFCS0VZQk9BUkQKKyNkZWZpbmUgWHRVbmdyYWJQb2ludGVyIFhUVU5HUkFCUE9JTlRFUgorI2RlZmluZSBYdFVubWFuYWdlQ2hpbGQgWFRVTk1BTkFHRUNISUxECisjZGVmaW5lIFh0VW5tYW5hZ2VDaGlsZHJlbiBYVFVOTUFOQUdFQ0hJTERSRU4KKyNkZWZpbmUgWHRVbnJlYWxpemVXaWRnZXQgWFRVTlJFQUxJWkVXSURHRVQKKyNkZWZpbmUgWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQgWFRWQUNSRUFURU1BTkFHRURXSURHRVQKKyNkZWZpbmUgWHRWYUNyZWF0ZVdpZGdldCBYVFZBQ1JFQVRFV0lER0VUCisjZGVmaW5lIFh0VmFHZXRWYWx1ZXMgWFRWQUdFVFZBTFVFUworI2RlZmluZSBYdFZhU2V0VmFsdWVzIFhUVkFTRVRWQUxVRVMKKyNkZWZpbmUgWHRXYXJuaW5nIFhUV0FSTklORworI2RlZmluZSBYdFdpZGdldFRvQXBwbGljYXRpb25Db250ZXh0IFhUV0lER0VUVE9BUFBMSUNBVElPTkNPTlRFWFQKKyNkZWZpbmUgWHRXaW5kb3cgWFRXSU5ET1cKKyNkZWZpbmUgWHRXaW5kb3dPZk9iamVjdCBYVFdJTkRPV09GT0JKRUNUCisjZGVmaW5lIFh0V2luZG93VG9XaWRnZXQgWFRXSU5ET1dUT1dJREdFVAorI2RlZmluZSBYd2NEcmF3U3RyaW5nIFhXQ0RSQVdTVFJJTkcKKyNkZWZpbmUgWHdjRnJlZVN0cmluZ0xpc3QgWFdDRlJFRVNUUklOR0xJU1QKKyNkZWZpbmUgWHdjVGV4dEVzY2FwZW1lbnQgWFdDVEVYVEVTQ0FQRU1FTlQKKyNkZWZpbmUgWHdjVGV4dEV4dGVudHMgWFdDVEVYVEVYVEVOVFMKKyNkZWZpbmUgWHdjVGV4dExpc3RUb1RleHRQcm9wZXJ0eSBYV0NURVhUTElTVFRPVEVYVFBST1BFUlRZCisjZGVmaW5lIFh3Y1RleHRQcm9wZXJ0eVRvVGV4dExpc3QgWFdDVEVYVFBST1BFUlRZVE9URVhUTElTVAorI2RlZmluZSBfWG1Cb3R0b21TaGFkb3dDb2xvckRlZmF1bHQgX1hNQk9UVE9NU0hBRE9XQ09MT1JERUZBVUxUCisjZGVmaW5lIF9YbUNsZWFyQm9yZGVyIF9YTUNMRUFSQk9SREVSCisjZGVmaW5lIF9YbUNvbmZpZ3VyZU9iamVjdCBfWE1DT05GSUdVUkVPQkpFQ1QKKyNkZWZpbmUgX1htRGVzdHJveVBhcmVudENhbGxiYWNrIF9YTURFU1RST1lQQVJFTlRDQUxMQkFDSworI2RlZmluZSBfWG1EcmF3QXJyb3cgX1hNRFJBV0FSUk9XCisjZGVmaW5lIF9YbURyYXdTaGFkb3dzIF9YTURSQVdTSEFET1dTCisjZGVmaW5lIF9YbUZvbnRMaXN0R2V0RGVmYXVsdEZvbnQgX1hNRk9OVExJU1RHRVRERUZBVUxURk9OVAorI2RlZmluZSBfWG1Gcm9tSG9yaXpvbnRhbFBpeGVscyBfWE1GUk9NSE9SSVpPTlRBTFBJWEVMUworI2RlZmluZSBfWG1Gcm9tVmVydGljYWxQaXhlbHMgX1hNRlJPTVZFUlRJQ0FMUElYRUxTCisjZGVmaW5lIF9YbUdldENsYXNzRXh0ZW5zaW9uUHRyIF9YTUdFVENMQVNTRVhURU5TSU9OUFRSCisjZGVmaW5lIF9YbUdldERlZmF1bHRGb250TGlzdCBfWE1HRVRERUZBVUxURk9OVExJU1QKKyNkZWZpbmUgX1htR2V0VGV4dHVhbERyYWdJY29uIF9YTUdFVFRFWFRVQUxEUkFHSUNPTgorI2RlZmluZSBfWG1HZXRXaWRnZXRFeHREYXRhIF9YTUdFVFdJREdFVEVYVERBVEEKKyNkZWZpbmUgX1htR3JhYktleWJvYXJkIF9YTUdSQUJLRVlCT0FSRAorI2RlZmluZSBfWG1HcmFiUG9pbnRlciBfWE1HUkFCUE9JTlRFUgorI2RlZmluZSBfWG1Jbmhlcml0Q2xhc3MgX1hNSU5IRVJJVENMQVNTCisjZGVmaW5lIF9YbUlucHV0SW5HYWRnZXQgX1hNSU5QVVRJTkdBREdFVAorI2RlZmluZSBfWG1NYWtlR2VvbWV0cnlSZXF1ZXN0IF9YTU1BS0VHRU9NRVRSWVJFUVVFU1QKKyNkZWZpbmUgX1htTWVudVBvcERvd24gX1hNTUVOVVBPUERPV04KKyNkZWZpbmUgX1htTW92ZU9iamVjdCBfWE1NT1ZFT0JKRUNUCisjZGVmaW5lIF9YbU5hdmlnQ2hhbmdlTWFuYWdlZCBfWE1OQVZJR0NIQU5HRU1BTkFHRUQKKyNkZWZpbmUgX1htT1NCdWlsZEZpbGVMaXN0IF9YTU9TQlVJTERGSUxFTElTVAorI2RlZmluZSBfWG1PU0ZpbGVDb21wYXJlIF9YTU9TRklMRUNPTVBBUkUKKyNkZWZpbmUgX1htT1NGaW5kUGF0dGVyblBhcnQgX1hNT1NGSU5EUEFUVEVSTlBBUlQKKyNkZWZpbmUgX1htT1NRdWFsaWZ5RmlsZVNwZWMgX1hNT1NRVUFMSUZZRklMRVNQRUMKKyNkZWZpbmUgX1htUG9zdFBvcHVwTWVudSBfWE1QT1NUUE9QVVBNRU5VCisjZGVmaW5lIF9YbVByaW1pdGl2ZUVudGVyIF9YTVBSSU1JVElWRUVOVEVSCisjZGVmaW5lIF9YbVByaW1pdGl2ZUxlYXZlIF9YTVBSSU1JVElWRUxFQVZFCisjZGVmaW5lIF9YbVJlZGlzcGxheUdhZGdldHMgX1hNUkVESVNQTEFZR0FER0VUUworI2RlZmluZSBfWG1TaGVsbElzRXhjbHVzaXZlIF9YTVNIRUxMSVNFWENMVVNJVkUKKyNkZWZpbmUgX1htU3RyaW5nRHJhdyBfWE1TVFJJTkdEUkFXCisjZGVmaW5lIF9YbVN0cmluZ0dldFRleHRDb25jYXQgX1hNU1RSSU5HR0VUVEVYVENPTkNBVAorI2RlZmluZSBfWG1TdHJpbmdzIF9YTVNUUklOR1MKKyNkZWZpbmUgX1htVG9Ib3Jpem9udGFsUGl4ZWxzIF9YTVRPSE9SSVpPTlRBTFBJWEVMUworI2RlZmluZSBfWG1Ub1ZlcnRpY2FsUGl4ZWxzIF9YTVRPVkVSVElDQUxQSVhFTFMKKyNkZWZpbmUgX1htVG9wU2hhZG93Q29sb3JEZWZhdWx0IF9YTVRPUFNIQURPV0NPTE9SREVGQVVMVAorI2RlZmluZSBfWG1fZmFzdFB0ciBfWE1fRkFTVFBUUgorI2RlZmluZSBfWHRDaGVja1N1YmNsYXNzRmxhZyBfWFRDSEVDS1NVQkNMQVNTRkxBRworI2RlZmluZSBfWHRJbmhlcml0IF9YVElOSEVSSVQKKyNkZWZpbmUgX1h0SW5oZXJpdFRyYW5zbGF0aW9ucyBfWFRJTkhFUklUVFJBTlNMQVRJT05TCisjZGVmaW5lIGFwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzcyBBUFBMSUNBVElPTlNIRUxMV0lER0VUQ0xBU1MKKyNkZWZpbmUgY29tcG9zaXRlV2lkZ2V0Q2xhc3MgQ09NUE9TSVRFV0lER0VUQ0xBU1MKKyNkZWZpbmUgb3ZlcnJpZGVTaGVsbFdpZGdldENsYXNzIE9WRVJSSURFU0hFTExXSURHRVRDTEFTUworI2RlZmluZSBzaGVsbFdpZGdldENsYXNzIFNIRUxMV0lER0VUQ0xBU1MKKyNkZWZpbmUgdG9wTGV2ZWxTaGVsbENsYXNzUmVjIFRPUExFVkVMU0hFTExDTEFTU1JFQworI2RlZmluZSB0b3BMZXZlbFNoZWxsV2lkZ2V0Q2xhc3MgVE9QTEVWRUxTSEVMTFdJREdFVENMQVNTCisjZGVmaW5lIHRyYW5zaWVudFNoZWxsV2lkZ2V0Q2xhc3MgVFJBTlNJRU5UU0hFTExXSURHRVRDTEFTUworI2RlZmluZSB2ZW5kb3JTaGVsbENsYXNzUmVjIFZFTkRPUlNIRUxMQ0xBU1NSRUMKKyNkZWZpbmUgdmVuZG9yU2hlbGxXaWRnZXRDbGFzcyBWRU5ET1JTSEVMTFdJREdFVENMQVNTCisjZGVmaW5lIHdtU2hlbGxXaWRnZXRDbGFzcyBXTVNIRUxMV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1BcnJvd0J1dHRvbldpZGdldENsYXNzIFhNQVJST1dCVVRUT05XSURHRVRDTEFTUworI2RlZmluZSB4bUNhc2NhZGVCdXR0b25DbGFzc1JlYyBYTUNBU0NBREVCVVRUT05DTEFTU1JFQworI2RlZmluZSB4bUNhc2NhZGVCdXR0b25HYWRnZXRDbGFzcyBYTUNBU0NBREVCVVRUT05HQURHRVRDTEFTUworI2RlZmluZSB4bUNhc2NhZGVCdXR0b25XaWRnZXRDbGFzcyBYTUNBU0NBREVCVVRUT05XSURHRVRDTEFTUworI2RlZmluZSB4bURpYWxvZ1NoZWxsV2lkZ2V0Q2xhc3MgWE1ESUFMT0dTSEVMTFdJREdFVENMQVNTCisjZGVmaW5lIHhtRHJhd2luZ0FyZWFXaWRnZXRDbGFzcyBYTURSQVdJTkdBUkVBV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1EcmF3bkJ1dHRvbldpZGdldENsYXNzIFhNRFJBV05CVVRUT05XSURHRVRDTEFTUworI2RlZmluZSB4bUZpbGVTZWxlY3Rpb25Cb3hXaWRnZXRDbGFzcyBYTUZJTEVTRUxFQ1RJT05CT1hXSURHRVRDTEFTUworI2RlZmluZSB4bUZvcm1XaWRnZXRDbGFzcyBYTUZPUk1XSURHRVRDTEFTUworI2RlZmluZSB4bUZyYW1lV2lkZ2V0Q2xhc3MgWE1GUkFNRVdJREdFVENMQVNTCisjZGVmaW5lIHhtR2FkZ2V0Q2xhc3MgWE1HQURHRVRDTEFTUworI2RlZmluZSB4bUxhYmVsR2FkZ2V0Q2xhc3MgWE1MQUJFTEdBREdFVENMQVNTCisjZGVmaW5lIHhtTGFiZWxXaWRnZXRDbGFzcyBYTUxBQkVMV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1MaXN0V2lkZ2V0Q2xhc3MgWE1MSVNUV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1NYWluV2luZG93V2lkZ2V0Q2xhc3MgWE1NQUlOV0lORE9XV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1NYW5hZ2VyQ2xhc3NSZWMgWE1NQU5BR0VSQ0xBU1NSRUMKKyNkZWZpbmUgeG1NYW5hZ2VyV2lkZ2V0Q2xhc3MgWE1NQU5BR0VSV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1NZW51U2hlbGxXaWRnZXRDbGFzcyBYTU1FTlVTSEVMTFdJREdFVENMQVNTCisjZGVmaW5lIHhtTWVzc2FnZUJveFdpZGdldENsYXNzIFhNTUVTU0FHRUJPWFdJREdFVENMQVNTCisjZGVmaW5lIHhtUHJpbWl0aXZlQ2xhc3NSZWMgWE1QUklNSVRJVkVDTEFTU1JFQworI2RlZmluZSB4bVByaW1pdGl2ZVdpZGdldENsYXNzIFhNUFJJTUlUSVZFV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1QdXNoQnV0dG9uQ2xhc3NSZWMgWE1QVVNIQlVUVE9OQ0xBU1NSRUMKKyNkZWZpbmUgeG1QdXNoQnV0dG9uR2FkZ2V0Q2xhc3MgWE1QVVNIQlVUVE9OR0FER0VUQ0xBU1MKKyNkZWZpbmUgeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MgWE1QVVNIQlVUVE9OV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1Sb3dDb2x1bW5XaWRnZXRDbGFzcyBYTVJPV0NPTFVNTldJREdFVENMQVNTCisjZGVmaW5lIHhtU2FzaFdpZGdldENsYXNzIFhNU0FTSFdJREdFVENMQVNTCisjZGVmaW5lIHhtU2Nyb2xsQmFyV2lkZ2V0Q2xhc3MgWE1TQ1JPTExCQVJXSURHRVRDTEFTUworI2RlZmluZSB4bVNjcm9sbGVkV2luZG93Q2xhc3NSZWMgWE1TQ1JPTExFRFdJTkRPV0NMQVNTUkVDCisjZGVmaW5lIHhtU2Nyb2xsZWRXaW5kb3dXaWRnZXRDbGFzcyBYTVNDUk9MTEVEV0lORE9XV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1TZXBhcmF0b3JHYWRnZXRDbGFzcyBYTVNFUEFSQVRPUkdBREdFVENMQVNTCisjZGVmaW5lIHhtU2VwYXJhdG9yV2lkZ2V0Q2xhc3MgWE1TRVBBUkFUT1JXSURHRVRDTEFTUworI2RlZmluZSB4bVRleHRGaWVsZFdpZGdldENsYXNzIFhNVEVYVEZJRUxEV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1UZXh0V2lkZ2V0Q2xhc3MgWE1URVhUV0lER0VUQ0xBU1MKKyNkZWZpbmUgeG1Ub2dnbGVCdXR0b25HYWRnZXRDbGFzcyBYTVRPR0dMRUJVVFRPTkdBREdFVENMQVNTCisjZGVmaW5lIHhtVG9nZ2xlQnV0dG9uV2lkZ2V0Q2xhc3MgWE1UT0dHTEVCVVRUT05XSURHRVRDTEFTUworCisvKgorKiogWHRSZWdpc3RlckRyYXdhYmxlIGFuZCBYdFVucmVnaXN0ZXJEcmF3YWJsZSBkb24ndCBleGlzdCB1bnRpbCBSNi4KKyoqIFNvIHdlIGhhdmUgdG8gZmFrZSBpdCBmb3IgUjUgYW5kIGVhcmxpZXIuIEl0IHdvdWxkIGJlIHJlYWwgbmljZSB0bworKiogaW5jbHVkZSBYMTEuaCBoZXJlIGFuZCB0aGVuIHRlc3QgZm9yIFI2IGJ5IGNoZWNraW5nCisqKiBYbGliU3BlY2lmaWNhdGlvblJlbGVhc2UuIEJ1dCBpbmNsdWRpbmcgWDExLmggZGVmaW5lcyB0aGUgc3ltYm9sICJOb25lIgorKiogYW5kIHRoZXJlJ3MgTW96aWxsYSBjb2RlIGluIGdmeC9zcmMvZ3RrIHRoYXQgZGVmaW5lcyBhbiBlbnVtIGVsZW1lbnQKKyoqIG5hbWVkIE5vbmUuIFNvIGZvciBub3cgaGFyZCBjb2RlIHRoaXMgaXMgUjUuLi4uCisqLworI2lmbmRlZiBWTVNfWDExUjYKKy8qIFI1IG9yIGVhcmxpZXIgKi8KKyNkZWZpbmUgX1h0UmVnaXN0ZXJXaW5kb3cgX1hUUkVHSVNURVJXSU5ET1cKKyNkZWZpbmUgX1h0VW5yZWdpc3RlcldpbmRvdyBfWFRVTlJFR0lTVEVSV0lORE9XCisvKiBvcmlnaW5hbCBjb2RlIGlzIGZpeGVkIHNvIHdlIGRvbid0IG5lZWQgdGhpcyBub3cgKi8KKyNpZiAwCisjZGVmaW5lIFh0UmVnaXN0ZXJEcmF3YWJsZShkaXNwbGF5LGRyYXdhYmxlLHdpZGdldCkgXAoreyAgZXh0ZXJuIHZvaWQgX1h0UmVnaXN0ZXJXaW5kb3coV2luZG93LFdpZGdldCk7IFwKKyAgIF9YdFJlZ2lzdGVyV2luZG93KGRyYXdhYmxlLHdpZGdldCk7IFwKK30KKyNkZWZpbmUgWHRVbnJlZ2lzdGVyRHJhd2FibGUoZGlzcGxheSxkcmF3YWJsZSkgXAoreyAgZXh0ZXJuIHZvaWQgX1h0VW5yZWdpc3RlcldpbmRvdyhXaW5kb3csV2lkZ2V0KTsgXAorICAgX1h0VW5yZWdpc3RlcldpbmRvdyhkcmF3YWJsZSxYdFdpbmRvd1RvV2lkZ2V0KGRpc3BsYXksZHJhd2FibGUpKTsgXAorfQorI2VuZGlmCisjZWxzZQorLyogUjYgb3IgbGF0ZXIgKi8KKyNkZWZpbmUgWHRSZWdpc3RlckRyYXdhYmxlIFhUUkVHSVNURVJEUkFXQUJMRQorI2RlZmluZSBYdFVucmVnaXN0ZXJEcmF3YWJsZSBYVFVOUkVHSVNURVJEUkFXQUJMRQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3VpX2d0a194MTEuYyBiL3NyYy9ndWlfZ3RrX3gxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmM4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX2d0a194MTEuYwpAQCAtMCwwICsxLDY1ODkgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBQb3J0aW5nIHRvIEdUSysgd2FzIGRvbmUgYnk6CisgKgorICogKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IE1hcmNpbiBEYWxlY2tpIDxkYWxlY2tpQGV2aXNpb24uYWc+CisgKgorICogV2l0aCBHUkVBVCBzdXBwb3J0IGFuZCBjb250aW51b3VzIGVuY291cmFnZW1lbnRzIGJ5IEFuZHkgS2FobiBhbmQgb2YKKyAqIGNvdXJzZSBCcmFtIE1vb2xlbmFhciEKKyAqCisgKiBTdXBwb3J0IGZvciBHVEsrIDIgd2FzIGFkZGVkIGJ5OgorICoKKyAqIChDKSAyMDAyLDIwMDMgIEphc29uIEhpbGRlYnJhbmQgIDxqYXNvbkBwZWFjZXdvcmtzLmNhPgorICoJCSAgRGFuaWVsIEVsc3RuZXIgIDxkYW5pZWwuZWxzdG5lckBnbXgubmV0PgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRQorLyogR25vbWUgcmVkZWZpbmVzIF8oKSBhbmQgTl8oKS4gIEdycnIuLi4gKi8KKyMgaWZkZWYgXworIyAgdW5kZWYgXworIyBlbmRpZgorIyBpZmRlZiBOXworIyAgdW5kZWYgTl8KKyMgZW5kaWYKKyMgaWZkZWYgdGV4dGRvbWFpbgorIyAgdW5kZWYgdGV4dGRvbWFpbgorIyBlbmRpZgorIyBpZmRlZiBiaW5kdGV4dGRvbWFpbgorIyAgdW5kZWYgYmluZHRleHRkb21haW4KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0dFVFRFWFQpICYmICFkZWZpbmVkKEVOQUJMRV9OTFMpCisjICBkZWZpbmUgRU5BQkxFX05MUwkvKiBzbyB0aGUgdGV4dHMgaW4gdGhlIGRpYWxvZyBib3hlcyBhcmUgdHJhbnNsYXRlZCAqLworIyBlbmRpZgorIyBpbmNsdWRlIDxnbm9tZS5oPgorIyBpbmNsdWRlICJ2ZXJzaW9uLmgiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZFQVRfR1VJX0dUSykgJiYgZGVmaW5lZChQUk9UTykKKy8qIFdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzIHdlIGRvbid0IHdhbnQgc3ludGF4IGVycm9ycy4gKi8KKyMgZGVmaW5lIEdka0F0b20gaW50CisjIGRlZmluZSBHZGtFdmVudEV4cG9zZSBpbnQKKyMgZGVmaW5lIEdka0V2ZW50Rm9jdXMgaW50CisjIGRlZmluZSBHZGtFdmVudFZpc2liaWxpdHkgaW50CisjIGRlZmluZSBHZGtFdmVudFByb3BlcnR5IGludAorIyBkZWZpbmUgR3RrQ29udGFpbmVyIGludAorIyBkZWZpbmUgR3RrVGFyZ2V0RW50cnkgaW50CisjIGRlZmluZSBHdGtUeXBlIGludAorIyBkZWZpbmUgR3RrV2lkZ2V0IGludAorIyBkZWZpbmUgZ2ludCBpbnQKKyMgZGVmaW5lIGdwb2ludGVyIGludAorIyBkZWZpbmUgZ3VpbnQgaW50CisjIGRlZmluZSBHZGtFdmVudEtleSBpbnQKKyMgZGVmaW5lIEdka0V2ZW50U2VsZWN0aW9uIGludAorIyBkZWZpbmUgR3RrU2VsZWN0aW9uRGF0YSBpbnQKKyMgZGVmaW5lIEdka0V2ZW50TW90aW9uIGludAorIyBkZWZpbmUgR2RrRXZlbnRCdXR0b24gaW50CisjIGRlZmluZSBHZGtEcmFnQ29udGV4dCBpbnQKKyMgZGVmaW5lIEdka0V2ZW50Q29uZmlndXJlIGludAorIyBkZWZpbmUgR2RrRXZlbnRDbGllbnQgaW50CisjZWxzZQorIyBpbmNsdWRlIDxnZGsvZ2Rra2V5c3ltcy5oPgorIyBpbmNsdWRlIDxnZGsvZ2RrLmg+CisjIGlmZGVmIFdJTjMyNjQKKyMgIGluY2x1ZGUgPGdkay9nZGt3aW4zMi5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxnZGsvZ2RreC5oPgorIyBlbmRpZgorCisjIGluY2x1ZGUgPGd0ay9ndGsuaD4KKyMgaW5jbHVkZSAiZ3VpX2d0a19mLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfWDExX1NVTktFWVNZTV9ICisjIGluY2x1ZGUgPFgxMS9TdW5rZXlzeW0uaD4KKyNlbmRpZgorCisvKgorICogRWFzeS10by11c2UgbWFjcm8gZm9yIG11bHRpaGVhZCBzdXBwb3J0LgorICovCisjaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisjIGRlZmluZSBHRVRfWF9BVE9NKGF0b20pCWdka194MTFfYXRvbV90b194YXRvbV9mb3JfZGlzcGxheSggXAorCQkJCSAgICBndGtfd2lkZ2V0X2dldF9kaXNwbGF5KGd1aS5tYWlud2luKSwgYXRvbSkKKyNlbHNlCisjIGRlZmluZSBHRVRfWF9BVE9NKGF0b20pCSgoQXRvbSkoYXRvbSkpCisjZW5kaWYKKworLyogU2VsZWN0aW9uIHR5cGUgZGlzdGluZ3Vpc2hlcnMgKi8KK2VudW0KK3sKKyAgICBUQVJHRVRfVFlQRV9OT05FLAorICAgIFRBUkdFVF9VVEY4X1NUUklORywKKyAgICBUQVJHRVRfU1RSSU5HLAorICAgIFRBUkdFVF9DT01QT1VORF9URVhULAorICAgIFRBUkdFVF9URVhULAorICAgIFRBUkdFVF9URVhUX1VSSV9MSVNULAorICAgIFRBUkdFVF9URVhUX1BMQUlOLAorICAgIFRBUkdFVF9WSU0sCisgICAgVEFSR0VUX1ZJTUVOQworfTsKKworLyoKKyAqIFRhYmxlIG9mIHNlbGVjdGlvbiB0YXJnZXRzIHN1cHBvcnRlZCBieSBWaW0uCisgKiBOb3RlOiBPcmRlciBtYXR0ZXJzLCBwcmVmZXJyZWQgdHlwZXMgc2hvdWxkIGNvbWUgZmlyc3QuCisgKi8KK3N0YXRpYyBjb25zdCBHdGtUYXJnZXRFbnRyeSBzZWxlY3Rpb25fdGFyZ2V0c1tdID0KK3sKKyAgICB7VklNRU5DX0FUT01fTkFNRSwJMCwgVEFSR0VUX1ZJTUVOQ30sCisgICAge1ZJTV9BVE9NX05BTUUsCTAsIFRBUkdFVF9WSU19LAorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB7IlVURjhfU1RSSU5HIiwJMCwgVEFSR0VUX1VURjhfU1RSSU5HfSwKKyNlbmRpZgorICAgIHsiQ09NUE9VTkRfVEVYVCIsCTAsIFRBUkdFVF9DT01QT1VORF9URVhUfSwKKyAgICB7IlRFWFQiLAkJMCwgVEFSR0VUX1RFWFR9LAorICAgIHsiU1RSSU5HIiwJCTAsIFRBUkdFVF9TVFJJTkd9Cit9OworI2RlZmluZSBOX1NFTEVDVElPTl9UQVJHRVRTIChzaXplb2Yoc2VsZWN0aW9uX3RhcmdldHMpIC8gc2l6ZW9mKHNlbGVjdGlvbl90YXJnZXRzWzBdKSkKKworI2lmZGVmIEZFQVRfRE5ECisvKgorICogVGFibGUgb2YgRG5EIHRhcmdldHMgc3VwcG9ydGVkIGJ5IFZpbS4KKyAqIE5vdGU6IE9yZGVyIG1hdHRlcnMsIHByZWZlcnJlZCB0eXBlcyBzaG91bGQgY29tZSBmaXJzdC4KKyAqLworc3RhdGljIGNvbnN0IEd0a1RhcmdldEVudHJ5IGRuZF90YXJnZXRzW10gPQoreworICAgIHsidGV4dC91cmktbGlzdCIsCTAsIFRBUkdFVF9URVhUX1VSSV9MSVNUfSwKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIHsiVVRGOF9TVFJJTkciLAkwLCBUQVJHRVRfVVRGOF9TVFJJTkd9LAorIyBlbmRpZgorICAgIHsiU1RSSU5HIiwJCTAsIFRBUkdFVF9TVFJJTkd9LAorICAgIHsidGV4dC9wbGFpbiIsCTAsIFRBUkdFVF9URVhUX1BMQUlOfQorfTsKKyMgZGVmaW5lIE5fRE5EX1RBUkdFVFMgKHNpemVvZihkbmRfdGFyZ2V0cykgLyBzaXplb2YoZG5kX3RhcmdldHNbMF0pKQorI2VuZGlmCisKKworI2lmZGVmIEhBVkVfR1RLMgorLyoKKyAqICJNb25vc3BhY2UiIGlzIGEgc3RhbmRhcmQgZm9udCBhbGlhcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50CisgKiBvbiBhbGwgcHJvcGVyIFBhbmdvL2ZvbnRjb25maWcgaW5zdGFsbGF0aW9ucy4KKyAqLworIyBkZWZpbmUgREVGQVVMVF9GT05UCSJNb25vc3BhY2UgMTAiCisKKyNlbHNlIC8qICFIQVZFX0dUSzIgKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBzaW5nbGUgb25seSBmaXhlZCB3aWR0aCBmb250IGluIFgxMSwgd2hpY2ggc2VlbXMgdG8gYmUgcHJlc2VudAorICogb24gYWxsIHNlcnZlcnMgYW5kIGF2YWlsYWJsZSBpbiBhbGwgdGhlIHZhcmlhbnRzIHdlIG5lZWQuCisgKi8KKyMgZGVmaW5lIERFRkFVTFRfRk9OVAkiLWFkb2JlLWNvdXJpZXItbWVkaXVtLXItbm9ybWFsLSotMTQtKi0qLSotbS0qLSotKiIKKworI2VuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworI2lmICEoZGVmaW5lZChGRUFUX0dVSV9HTk9NRSkgJiYgZGVmaW5lZChGRUFUX1NFU1NJT04pKQorLyoKKyAqIEF0b21zIHVzZWQgdG8gY29tbXVuaWNhdGUgc2F2ZS15b3Vyc2VsZiBmcm9tIHRoZSBYMTEgc2Vzc2lvbiBtYW5hZ2VyLiBUaGVyZQorICogaXMgbm8gbmVlZCB0byBtb3ZlIHRoZW0gaW50byB0aGUgR1VJIHN0cnVjdCwgc2luY2UgdGhleSBzaG91bGQgYmUgY29uc3RhbnQuCisgKi8KK3N0YXRpYyBHZGtBdG9tIHdtX3Byb3RvY29sc19hdG9tID0gR0RLX05PTkU7CitzdGF0aWMgR2RrQXRvbSBzYXZlX3lvdXJzZWxmX2F0b20gPSBHREtfTk9ORTsKKyNlbmRpZgorCisvKgorICogQXRvbXMgdXNlZCB0byBjb250cm9sL3JlZmVyZW5jZSBYMTEgc2VsZWN0aW9ucy4KKyAqLworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBHZGtBdG9tIHV0Zjhfc3RyaW5nX2F0b20gPSBHREtfTk9ORTsKKyNlbmRpZgorI2lmbmRlZiBIQVZFX0dUSzIKK3N0YXRpYyBHZGtBdG9tIGNvbXBvdW5kX3RleHRfYXRvbSA9IEdES19OT05FOworc3RhdGljIEdka0F0b20gdGV4dF9hdG9tID0gR0RLX05PTkU7CisjZW5kaWYKK3N0YXRpYyBHZGtBdG9tIHZpbV9hdG9tID0gR0RLX05PTkU7CS8qIFZpbSdzIG93biBzcGVjaWFsIHNlbGVjdGlvbiBmb3JtYXQgKi8KKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgR2RrQXRvbSB2aW1lbmNfYXRvbSA9IEdES19OT05FOwkvKiBWaW0ncyBleHRlbmRlZCBzZWxlY3Rpb24gZm9ybWF0ICovCisjZW5kaWYKKworLyoKKyAqIEtleWNvZGVzIHJlY29nbml6ZWQgYnkgdmltLgorICogTk9URTogd2hlbiBjaGFuZ2luZyB0aGlzLCB0aGUgdGFibGUgaW4gZ3VpX3gxMS5jIHByb2JhYmx5IG5lZWRzIHRoZSBzYW1lCisgKiBjaGFuZ2UhCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BlY2lhbF9rZXkKK3sKKyAgICBndWludCBrZXlfc3ltOworICAgIGNoYXJfdSBjb2RlMDsKKyAgICBjaGFyX3UgY29kZTE7Cit9Citjb25zdCBzcGVjaWFsX2tleXNbXSA9Cit7CisgICAge0dES19VcCwJCSdrJywgJ3UnfSwKKyAgICB7R0RLX0Rvd24sCQknaycsICdkJ30sCisgICAge0dES19MZWZ0LAkJJ2snLCAnbCd9LAorICAgIHtHREtfUmlnaHQsCQknaycsICdyJ30sCisgICAge0dES19GMSwJCSdrJywgJzEnfSwKKyAgICB7R0RLX0YyLAkJJ2snLCAnMid9LAorICAgIHtHREtfRjMsCQknaycsICczJ30sCisgICAge0dES19GNCwJCSdrJywgJzQnfSwKKyAgICB7R0RLX0Y1LAkJJ2snLCAnNSd9LAorICAgIHtHREtfRjYsCQknaycsICc2J30sCisgICAge0dES19GNywJCSdrJywgJzcnfSwKKyAgICB7R0RLX0Y4LAkJJ2snLCAnOCd9LAorICAgIHtHREtfRjksCQknaycsICc5J30sCisgICAge0dES19GMTAsCQknaycsICc7J30sCisgICAge0dES19GMTEsCQknRicsICcxJ30sCisgICAge0dES19GMTIsCQknRicsICcyJ30sCisgICAge0dES19GMTMsCQknRicsICczJ30sCisgICAge0dES19GMTQsCQknRicsICc0J30sCisgICAge0dES19GMTUsCQknRicsICc1J30sCisgICAge0dES19GMTYsCQknRicsICc2J30sCisgICAge0dES19GMTcsCQknRicsICc3J30sCisgICAge0dES19GMTgsCQknRicsICc4J30sCisgICAge0dES19GMTksCQknRicsICc5J30sCisgICAge0dES19GMjAsCQknRicsICdBJ30sCisgICAge0dES19GMjEsCQknRicsICdCJ30sCisgICAge0dES19QYXVzZSwJCSdGJywgJ0InfSwgLyogUGF1c2UgPT0gRjIxIGFjY29yZGluZyB0byBuZXRiZWFucy50eHQgKi8KKyAgICB7R0RLX0YyMiwJCSdGJywgJ0MnfSwKKyAgICB7R0RLX0YyMywJCSdGJywgJ0QnfSwKKyAgICB7R0RLX0YyNCwJCSdGJywgJ0UnfSwKKyAgICB7R0RLX0YyNSwJCSdGJywgJ0YnfSwKKyAgICB7R0RLX0YyNiwJCSdGJywgJ0cnfSwKKyAgICB7R0RLX0YyNywJCSdGJywgJ0gnfSwKKyAgICB7R0RLX0YyOCwJCSdGJywgJ0knfSwKKyAgICB7R0RLX0YyOSwJCSdGJywgJ0onfSwKKyAgICB7R0RLX0YzMCwJCSdGJywgJ0snfSwKKyAgICB7R0RLX0YzMSwJCSdGJywgJ0wnfSwKKyAgICB7R0RLX0YzMiwJCSdGJywgJ00nfSwKKyAgICB7R0RLX0YzMywJCSdGJywgJ04nfSwKKyAgICB7R0RLX0YzNCwJCSdGJywgJ08nfSwKKyAgICB7R0RLX0YzNSwJCSdGJywgJ1AnfSwKKyNpZmRlZiBTdW5YS19GMzYKKyAgICB7U3VuWEtfRjM2LAkJJ0YnLCAnUSd9LAorICAgIHtTdW5YS19GMzcsCQknRicsICdSJ30sCisjZW5kaWYKKyAgICB7R0RLX0hlbHAsCQknJScsICcxJ30sCisgICAge0dES19VbmRvLAkJJyYnLCAnOCd9LAorICAgIHtHREtfQmFja1NwYWNlLAknaycsICdiJ30sCisgICAge0dES19JbnNlcnQsCSdrJywgJ0knfSwKKyAgICB7R0RLX0RlbGV0ZSwJJ2snLCAnRCd9LAorICAgIHtHREtfMzI3MF9CYWNrVGFiLAknaycsICdCJ30sCisgICAge0dES19DbGVhciwJCSdrJywgJ0MnfSwKKyAgICB7R0RLX0hvbWUsCQknaycsICdoJ30sCisgICAge0dES19FbmQsCQknQCcsICc3J30sCisgICAge0dES19QcmlvciwJCSdrJywgJ1AnfSwKKyAgICB7R0RLX05leHQsCQknaycsICdOJ30sCisgICAge0dES19QcmludCwJCSclJywgJzknfSwKKyAgICAvKiBLZXlwYWQga2V5czogKi8KKyAgICB7R0RLX0tQX0xlZnQsCSdrJywgJ2wnfSwKKyAgICB7R0RLX0tQX1JpZ2h0LAknaycsICdyJ30sCisgICAge0dES19LUF9VcCwJCSdrJywgJ3UnfSwKKyAgICB7R0RLX0tQX0Rvd24sCSdrJywgJ2QnfSwKKyAgICB7R0RLX0tQX0luc2VydCwJS1NfRVhUUkEsIChjaGFyX3UpS0VfS0lOU30sCisgICAge0dES19LUF9EZWxldGUsCUtTX0VYVFJBLCAoY2hhcl91KUtFX0tERUx9LAorICAgIHtHREtfS1BfSG9tZSwJJ0snLCAnMSd9LAorICAgIHtHREtfS1BfRW5kLAknSycsICc0J30sCisgICAge0dES19LUF9QcmlvciwJJ0snLCAnMyd9LCAgLyogcGFnZSB1cCAqLworICAgIHtHREtfS1BfTmV4dCwJJ0snLCAnNSd9LCAgLyogcGFnZSBkb3duICovCisKKyAgICB7R0RLX0tQX0FkZCwJJ0snLCAnNid9LAorICAgIHtHREtfS1BfU3VidHJhY3QsCSdLJywgJzcnfSwKKyAgICB7R0RLX0tQX0RpdmlkZSwJJ0snLCAnOCd9LAorICAgIHtHREtfS1BfTXVsdGlwbHksCSdLJywgJzknfSwKKyAgICB7R0RLX0tQX0VudGVyLAknSycsICdBJ30sCisgICAge0dES19LUF9EZWNpbWFsLAknSycsICdCJ30sCisKKyAgICB7R0RLX0tQXzAsCQknSycsICdDJ30sCisgICAge0dES19LUF8xLAkJJ0snLCAnRCd9LAorICAgIHtHREtfS1BfMiwJCSdLJywgJ0UnfSwKKyAgICB7R0RLX0tQXzMsCQknSycsICdGJ30sCisgICAge0dES19LUF80LAkJJ0snLCAnRyd9LAorICAgIHtHREtfS1BfNSwJCSdLJywgJ0gnfSwKKyAgICB7R0RLX0tQXzYsCQknSycsICdJJ30sCisgICAge0dES19LUF83LAkJJ0snLCAnSid9LAorICAgIHtHREtfS1BfOCwJCSdLJywgJ0snfSwKKyAgICB7R0RLX0tQXzksCQknSycsICdMJ30sCisKKyAgICAvKiBFbmQgb2YgbGlzdCBtYXJrZXI6ICovCisgICAgezAsIDAsIDB9Cit9OworCisvKgorICogRmxhZ3MgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zIHRhYmxlIGJlbG93LgorICovCisjZGVmaW5lIEFSR19GT05UCTEKKyNkZWZpbmUgQVJHX0dFT01FVFJZCTIKKyNkZWZpbmUgQVJHX1JFVkVSU0UJMworI2RlZmluZSBBUkdfTk9SRVZFUlNFCTQKKyNkZWZpbmUgQVJHX0JBQ0tHUk9VTkQJNQorI2RlZmluZSBBUkdfRk9SRUdST1VORAk2CisjZGVmaW5lIEFSR19JQ09OSUMJNworI2RlZmluZSBBUkdfUk9MRQk4CisjZGVmaW5lIEFSR19ORVRCRUFOUwk5CisjZGVmaW5lIEFSR19YUk0JCTEwCS8qIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVJHX01FTlVGT05UCTExCS8qIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVJHX0lOREVYX01BU0sJMHgwMGZmCisjZGVmaW5lIEFSR19IQVNfVkFMVUUJMHgwMTAwCS8qIGEgdmFsdWUgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGFyZ3VtZW50ICovCisjZGVmaW5lIEFSR19ORUVEU19HVUkJMHgwMjAwCS8qIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgR1VJIGZvciB0aGlzCSAgKi8KKyNkZWZpbmUgQVJHX0ZPUl9HVEsJMHgwNDAwCS8qIGFyZ3VtZW50IGlzIGhhbmRsZWQgYnkgR1RLKyBvciBHTk9NRSAgICovCisjZGVmaW5lIEFSR19DT01QQVRfTE9ORwkweDA4MDAJLyogYWNjZXB0IC1mb28gYnV0IHN1YnN0aXR1dGUgd2l0aCAtLWZvbyAgKi8KKyNkZWZpbmUgQVJHX0tFRVAJMHgxMDAwCS8qIGRvbid0IHJlbW92ZSBhcmd1bWVudCBmcm9tIGFyZ3ZbXSAqLworCisvKgorICogVGhpcyB0YWJsZSBob2xkcyBhbGwgdGhlIFggR1VJIGNvbW1hbmQgbGluZSBvcHRpb25zIGFsbG93ZWQuICBUaGlzIGluY2x1ZGVzCisgKiB0aGUgc3RhbmRhcmQgb25lcyBzbyB0aGF0IHdlIGNhbiBza2lwIHRoZW0gd2hlbiBWaW0gaXMgc3RhcnRlZCB3aXRob3V0IHRoZQorICogR1VJIChidXQgdGhlIEdVSSBtaWdodCBzdGFydCB1cCBsYXRlcikuCisgKgorICogV2hlbiBjaGFuZ2luZyB0aGlzLCBhbHNvIHVwZGF0ZSBkb2MvZ3VpX3gxMS50eHQgYW5kIHRoZSB1c2FnZSBtZXNzYWdlISEhCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhcgkgICAgKm5hbWU7CisgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzOworfQorY21kbGluZV9vcHRpb25fVDsKKworc3RhdGljIGNvbnN0IGNtZGxpbmVfb3B0aW9uX1QgY21kbGluZV9vcHRpb25zW10gPQoreworICAgIC8qIFdlIGhhbmRsZSB0aGVzZSBvcHRpb25zIG91cnNlbHZlcyAqLworICAgIHsiLWZuIiwJCUFSR19GT05UfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLWZvbnQiLAkJQVJHX0ZPTlR8QVJHX0hBU19WQUxVRX0sCisgICAgeyItZ2VvbSIsCQlBUkdfR0VPTUVUUll8QVJHX0hBU19WQUxVRX0sCisgICAgeyItZ2VvbWV0cnkiLAlBUkdfR0VPTUVUUll8QVJHX0hBU19WQUxVRX0sCisgICAgeyItcnYiLAkJQVJHX1JFVkVSU0V9LAorICAgIHsiLXJldmVyc2UiLAlBUkdfUkVWRVJTRX0sCisgICAgeyIrcnYiLAkJQVJHX05PUkVWRVJTRX0sCisgICAgeyIrcmV2ZXJzZSIsCUFSR19OT1JFVkVSU0V9LAorICAgIHsiLWJnIiwJCUFSR19CQUNLR1JPVU5EfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLWJhY2tncm91bmQiLAlBUkdfQkFDS0dST1VORHxBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii1mZyIsCQlBUkdfRk9SRUdST1VORHxBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii1mb3JlZ3JvdW5kIiwJQVJHX0ZPUkVHUk9VTkR8QVJHX0hBU19WQUxVRX0sCisgICAgeyItaWNvbmljIiwJCUFSR19JQ09OSUN9LAorI2lmZGVmIEhBVkVfR1RLMgorICAgIHsiLS1yb2xlIiwJCUFSR19ST0xFfEFSR19IQVNfVkFMVUV9LAorI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgeyItbmIiLAkJQVJHX05FVEJFQU5TfSwJICAgICAgLyogbm9uLXN0YW5kYXJkIHZhbHVlIGZvcm1hdCAqLworICAgIHsiLXhybSIsCQlBUkdfWFJNfEFSR19IQVNfVkFMVUV9LAkJLyogbm90IGltcGxlbWVudGVkICovCisgICAgeyItbWYiLAkJQVJHX01FTlVGT05UfEFSR19IQVNfVkFMVUV9LAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICB7Ii1tZW51Zm9udCIsCUFSR19NRU5VRk9OVHxBUkdfSEFTX1ZBTFVFfSwJLyogbm90IGltcGxlbWVudGVkICovCisjZW5kaWYKKyNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZDsgdGhlc2UgYXJndW1lbnRzIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIEdUSysgKi8KKyAgICB7Ii1ib2xkZm9udCIsCUFSR19IQVNfVkFMVUV9LAorICAgIHsiLWl0YWxpY2ZvbnQiLAlBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii1idyIsCQlBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii1ib3JkZXJ3aWR0aCIsCUFSR19IQVNfVkFMVUV9LAorICAgIHsiLXN3IiwJCUFSR19IQVNfVkFMVUV9LAorICAgIHsiLXNjcm9sbGJhcndpZHRoIiwJQVJHX0hBU19WQUxVRX0sCisjZW5kaWYKKyAgICAvKiBBcmd1bWVudHMgaGFuZGxlZCBieSBHVEsgKGFuZCBHTk9NRSkgaW50ZXJuYWxseS4gKi8KKyAgICB7Ii0tZy1mYXRhbC13YXJuaW5ncyIsCUFSR19GT1JfR1RLfSwKKyAgICB7Ii0tZ2RrLWRlYnVnIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1nZGstbm8tZGVidWciLAkJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRX0sCisgICAgeyItLWd0ay1kZWJ1ZyIsCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii0tZ3RrLW5vLWRlYnVnIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1ndGstbW9kdWxlIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1zeW5jIiwJCQlBUkdfRk9SX0dUS30sCisgICAgeyItLWRpc3BsYXkiLAkJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRXxBUkdfQ09NUEFUX0xPTkd9LAorICAgIHsiLS1uYW1lIiwJCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfEFSR19DT01QQVRfTE9OR30sCisgICAgeyItLWNsYXNzIiwJCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfEFSR19DT01QQVRfTE9OR30sCisjaWZkZWYgSEFWRV9HVEsyCisgICAgeyItLXNjcmVlbiIsCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii0tZ3hpZC1ob3N0IiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1neGlkLXBvcnQiLAkJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRX0sCisjZWxzZSAvKiB0aGVzZSBkb24ndCBzZWVtIHRvIGV4aXN0IGFueW1vcmUgKi8KKyAgICB7Ii0tbm8teHNobSIsCQlBUkdfRk9SX0dUS30sCisgICAgeyItLXhpbS1wcmVlZGl0IiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS14aW0tc3RhdHVzIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1neGlkX2hvc3QiLAkJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRX0sCisgICAgeyItLWd4aWRfcG9ydCIsCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX0dOT01FCisgICAgeyItLWxvYWQtbW9kdWxlcyIsCQlBUkdfRk9SX0dUS3xBUkdfSEFTX1ZBTFVFfSwKKyAgICB7Ii0tc20tY2xpZW50LWlkIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1zbS1jb25maWctcHJlZml4IiwJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRX0sCisgICAgeyItLXNtLWRpc2FibGUiLAkJQVJHX0ZPUl9HVEt9LAorICAgIHsiLS1vYWYtaW9yLWZkIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLS1vYWYtYWN0aXZhdGUtaWlkIiwJQVJHX0ZPUl9HVEt8QVJHX0hBU19WQUxVRX0sCisgICAgeyItLW9hZi1wcml2YXRlIiwJCUFSR19GT1JfR1RLfSwKKyAgICB7Ii0tZW5hYmxlLXNvdW5kIiwJCUFSR19GT1JfR1RLfSwKKyAgICB7Ii0tZGlzYWJsZS1zb3VuZCIsCQlBUkdfRk9SX0dUS30sCisgICAgeyItLWVzcGVha2VyIiwJCUFSR19GT1JfR1RLfEFSR19IQVNfVkFMVUV9LAorICAgIHsiLT8iLAkJCUFSR19GT1JfR1RLfEFSR19ORUVEU19HVUl9LAorICAgIHsiLS1oZWxwIiwJCQlBUkdfRk9SX0dUS3xBUkdfTkVFRFNfR1VJfEFSR19LRUVQfSwKKyAgICB7Ii0tdXNhZ2UiLAkJCUFSR19GT1JfR1RLfEFSR19ORUVEU19HVUl9LAorIyBpZiAwIC8qIGNvbmZsaWN0cyB3aXRoIFZpbSdzIG93biAtLXZlcnNpb24gYXJndW1lbnQgKi8KKyAgICB7Ii0tdmVyc2lvbiIsCQlBUkdfRk9SX0dUS3xBUkdfTkVFRFNfR1VJfSwKKyMgZW5kaWYKKyAgICB7Ii0tZGlzYWJsZS1jcmFzaC1kaWFsb2ciLAlBUkdfRk9SX0dUS30sCisjZW5kaWYKKyAgICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBpbnQgICAgZ3VpX2FyZ2MgPSAwOworc3RhdGljIGNoYXIgKipndWlfYXJndiA9IE5VTEw7CisKKyNpZmRlZiBIQVZFX0dUSzIKK3N0YXRpYyBjb25zdCBjaGFyICpyb2xlX2FyZ3VtZW50ID0gTlVMTDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUlfR05PTUUpICYmIGRlZmluZWQoRkVBVF9TRVNTSU9OKQorc3RhdGljIGNvbnN0IGNoYXIgKnJlc3RhcnRfY29tbWFuZCA9IE5VTEw7CisjZW5kaWYKK3N0YXRpYyBpbnQgZm91bmRfaWNvbmljX2FyZyA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9HVUlfR05PTUUKKy8qCisgKiBDYW4ndCB1c2UgR25vbWUgaWYgLS1zb2NrZXRpZCBnaXZlbgorICovCitzdGF0aWMgaW50IHVzaW5nX2dub21lID0gMDsKKyNlbHNlCisjIGRlZmluZSB1c2luZ19nbm9tZSAwCisjZW5kaWYKKworLyoKKyAqIFBhcnNlIHRoZSBHVUkgcmVsYXRlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAgQW55IGFyZ3VtZW50cyB1c2VkIGFyZQorICogZGVsZXRlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZCBhY2NvcmRpbmdseS4gIFRoaXMgaXMgY2FsbGVkCisgKiB3aGVuIHZpbSBpcyBzdGFydGVkLCB3aGV0aGVyIG9yIG5vdCB0aGUgR1VJIGhhcyBiZWVuIHN0YXJ0ZWQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3ByZXBhcmUoaW50ICphcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjb25zdCBjbWRsaW5lX29wdGlvbl9UICAqb3B0aW9uOworICAgIGludAkJCSAgICBpCT0gMDsKKyAgICBpbnQJCQkgICAgbGVuID0gMDsKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR05PTUUpICYmIGRlZmluZWQoRkVBVF9TRVNTSU9OKQorICAgIC8qCisgICAgICogRGV0ZXJtaW5lIHRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIFZpbSwgdG8gYmUgcGFzc2VkIGFzIHJlc3RhcnQKKyAgICAgKiBjb21tYW5kIHRvIHRoZSBzZXNzaW9uIG1hbmFnZXIuCUlmIGFyZ3ZbMF0gY29udGFpbnMgYW55IGRpcmVjdG9yeQorICAgICAqIGNvbXBvbmVudHMgdHJ5IGJ1aWxkaW5nIGFuIGFic29sdXRlIHBhdGgsIG90aGVyd2lzZSBsZWF2ZSBpdCBhcyBpcy4KKyAgICAgKi8KKyAgICByZXN0YXJ0X2NvbW1hbmQgPSBhcmd2WzBdOworCisgICAgaWYgKHN0cmNocihhcmd2WzBdLCBHX0RJUl9TRVBBUkFUT1IpICE9IE5VTEwpCisgICAgeworCWNoYXJfdSBidWZbTUFYUEFUSExdOworCisJaWYgKG1jaF9GdWxsTmFtZSgoY2hhcl91ICopYXJndlswXSwgYnVmLCAoaW50KXNpemVvZihidWYpLCBUUlVFKSA9PSBPSykKKwkgICAgLyogVGlueSBsZWFrOyBkb2Vzbid0IG1hdHRlciwgYW5kIHVzdWFsbHkgd2UgZG9uJ3QgZXZlbiBnZXQgaGVyZSAqLworCSAgICByZXN0YXJ0X2NvbW1hbmQgPSAoY2hhciAqKXZpbV9zdHJzYXZlKGJ1Zik7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIE1vdmUgYWxsIHRoZSBlbnRyaWVzIGluIGFyZ3Ygd2hpY2ggYXJlIHJlbGV2YW50IHRvIEdUSysgYW5kIEdOT01FCisgICAgICogaW50byBndWlfYXJndi4gIEZyZWVkIGxhdGVyIGluIGd1aV9tY2hfaW5pdCgpLgorICAgICAqLworICAgIGd1aV9hcmdjID0gMDsKKyAgICBndWlfYXJndiA9IChjaGFyICoqKWFsbG9jKCh1bnNpZ25lZCkoKCphcmdjICsgMSkgKiBzaXplb2YoY2hhciAqKSkpOworCisgICAgZ19yZXR1cm5faWZfZmFpbChndWlfYXJndiAhPSBOVUxMKTsKKworICAgIGd1aV9hcmd2W2d1aV9hcmdjKytdID0gYXJndltpKytdOworCisgICAgd2hpbGUgKGkgPCAqYXJnYykKKyAgICB7CisJLyogRG9uJ3Qgd2FzdGUgQ1BVIGN5Y2xlcyBvbiBub24tb3B0aW9uIGFyZ3VtZW50cy4gKi8KKwlpZiAoYXJndltpXVswXSAhPSAnLScgJiYgYXJndltpXVswXSAhPSAnKycpCisJeworCSAgICArK2k7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIExvb2sgZm9yIGFyZ3ZbaV0gaW4gY21kbGluZV9vcHRpb25zW10gdGFibGUuICovCisJZm9yIChvcHRpb24gPSAmY21kbGluZV9vcHRpb25zWzBdOyBvcHRpb24tPm5hbWUgIT0gTlVMTDsgKytvcHRpb24pCisJeworCSAgICBsZW4gPSBzdHJsZW4ob3B0aW9uLT5uYW1lKTsKKworCSAgICBpZiAoc3RybmNtcChhcmd2W2ldLCBvcHRpb24tPm5hbWUsIGxlbikgPT0gMCkKKwkgICAgeworCQlpZiAoYXJndltpXVtsZW5dID09ICdcMCcpCisJCSAgICBicmVhazsKKwkJLyogYWxsb3cgLS1mb289YmFyIHN0eWxlICovCisJCWlmIChhcmd2W2ldW2xlbl0gPT0gJz0nICYmIChvcHRpb24tPmZsYWdzICYgQVJHX0hBU19WQUxVRSkpCisJCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkJLyogZGFybiwgLW5iIGhhcyBub24tc3RhbmRhcmQgc3ludGF4ICovCisJCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiOj0iLCBhcmd2W2ldW2xlbl0pICE9IE5VTEwKKwkJCSYmIChvcHRpb24tPmZsYWdzICYgQVJHX0lOREVYX01BU0spID09IEFSR19ORVRCRUFOUykKKwkJICAgIGJyZWFrOworI2VuZGlmCisJICAgIH0KKwkgICAgZWxzZSBpZiAoKG9wdGlvbi0+ZmxhZ3MgJiBBUkdfQ09NUEFUX0xPTkcpCisJCQkmJiBzdHJjbXAoYXJndltpXSwgb3B0aW9uLT5uYW1lICsgMSkgPT0gMCkKKwkgICAgeworCQkvKiBSZXBsYWNlIHRoZSBzdGFuZGFyZCBYIGFyZ3VtZW50cyAiLW5hbWUiIGFuZCAiLWRpc3BsYXkiCisJCSAqIHdpdGggdGhlaXIgR05VLXN0eWxlIGxvbmcgb3B0aW9uIGNvdW50ZXJwYXJ0cy4gKi8KKwkJYXJndltpXSA9IChjaGFyICopb3B0aW9uLT5uYW1lOworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAob3B0aW9uLT5uYW1lID09IE5VTEwpIC8qIG5vIG1hdGNoICovCisJeworCSAgICArK2k7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChvcHRpb24tPmZsYWdzICYgQVJHX0ZPUl9HVEspCisJeworCSAgICAvKiBNb3ZlIHRoZSBhcmd1bWVudCBpbnRvIGd1aV9hcmd2LCB3aGljaAorCSAgICAgKiB3aWxsIGxhdGVyIGJlIHBhc3NlZCB0byBndGtfaW5pdF9jaGVjaygpICovCisJICAgIGd1aV9hcmd2W2d1aV9hcmdjKytdID0gYXJndltpXTsKKwl9CisJZWxzZQorCXsKKwkgICAgY2hhciAqdmFsdWUgPSBOVUxMOworCisJICAgIC8qIEV4dHJhY3QgdGhlIG9wdGlvbidzIHZhbHVlIGlmIHRoZXJlIGlzIG9uZS4KKwkgICAgICogQWNjZXB0IGJvdGggIi0tZm9vIGJhciIgYW5kICItLWZvbz1iYXIiIHN0eWxlLiAqLworCSAgICBpZiAob3B0aW9uLT5mbGFncyAmIEFSR19IQVNfVkFMVUUpCisJICAgIHsKKwkJaWYgKGFyZ3ZbaV1bbGVuXSA9PSAnPScpCisJCSAgICB2YWx1ZSA9ICZhcmd2W2ldW2xlbiArIDFdOworCQllbHNlIGlmIChpICsgMSA8ICphcmdjICYmIHN0cmNtcChhcmd2W2kgKyAxXSwgIi0tIikgIT0gMCkKKwkJICAgIHZhbHVlID0gYXJndltpICsgMV07CisJICAgIH0KKworCSAgICAvKiBDaGVjayBmb3Igb3B0aW9ucyBoYW5kbGVkIGJ5IFZpbSBpdHNlbGYgKi8KKwkgICAgc3dpdGNoIChvcHRpb24tPmZsYWdzICYgQVJHX0lOREVYX01BU0spCisJICAgIHsKKwkJY2FzZSBBUkdfUkVWRVJTRToKKwkJICAgIGZvdW5kX3JldmVyc2VfYXJnID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQljYXNlIEFSR19OT1JFVkVSU0U6CisJCSAgICBmb3VuZF9yZXZlcnNlX2FyZyA9IEZBTFNFOworCQkgICAgYnJlYWs7CisJCWNhc2UgQVJHX0ZPTlQ6CisJCSAgICBmb250X2FyZ3VtZW50ID0gdmFsdWU7CisJCSAgICBicmVhazsKKwkJY2FzZSBBUkdfR0VPTUVUUlk6CisJCSAgICBpZiAodmFsdWUgIT0gTlVMTCkKKwkJCWd1aS5nZW9tID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKXZhbHVlKTsKKwkJICAgIGJyZWFrOworCQljYXNlIEFSR19CQUNLR1JPVU5EOgorCQkgICAgYmFja2dyb3VuZF9hcmd1bWVudCA9IHZhbHVlOworCQkgICAgYnJlYWs7CisJCWNhc2UgQVJHX0ZPUkVHUk9VTkQ6CisJCSAgICBmb3JlZ3JvdW5kX2FyZ3VtZW50ID0gdmFsdWU7CisJCSAgICBicmVhazsKKwkJY2FzZSBBUkdfSUNPTklDOgorCQkgICAgZm91bmRfaWNvbmljX2FyZyA9IFRSVUU7CisJCSAgICBicmVhazsKKyNpZmRlZiBIQVZFX0dUSzIKKwkJY2FzZSBBUkdfUk9MRToKKwkJICAgIHJvbGVfYXJndW1lbnQgPSB2YWx1ZTsgLyogdXNlZCBsYXRlciBpbiBndWlfbWNoX29wZW4oKSAqLworCQkgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkJY2FzZSBBUkdfTkVUQkVBTlM6CisJCSAgICArK3VzaW5nTmV0YmVhbnM7CisJCSAgICBndWkuZG9mb3JrID0gRkFMU0U7IC8qIGRvbid0IGZvcmsoKSB3aGVuIHN0YXJ0aW5nIEdVSSAqLworCQkgICAgbmV0YmVhbnNBcmcgPSBhcmd2W2ldOworCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJICAgIGJyZWFrOworCSAgICB9CisJfQorCisJLyogVGhlc2UgYXJndW1lbnRzIG1ha2UgZ25vbWVfcHJvZ3JhbV9pbml0KCkgcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0LgorCSAqIE11c3Qgc3RhcnQgdGhlIEdVSSBmb3IgdGhpcywgb3RoZXJ3aXNlICI6Z3VpIiB3aWxsIGV4aXQgbGF0ZXIhICovCisJaWYgKG9wdGlvbi0+ZmxhZ3MgJiBBUkdfTkVFRFNfR1VJKQorCSAgICBndWkuc3RhcnRpbmcgPSBUUlVFOworCisJaWYgKG9wdGlvbi0+ZmxhZ3MgJiBBUkdfS0VFUCkKKwkgICAgKytpOworCWVsc2UKKwl7CisJICAgIC8qIFJlbW92ZSB0aGUgZmxhZyBmcm9tIHRoZSBhcmd1bWVudCB2ZWN0b3IuICovCisJICAgIGlmICgtLSphcmdjID4gaSkKKwkgICAgeworCQlpbnQgbl9zdHJpcCA9IDE7CisKKwkJLyogTW92ZSB0aGUgYXJndW1lbnQncyB2YWx1ZSBhcyB3ZWxsLCBpZiB0aGVyZSBpcyBvbmUuICovCisJCWlmICgob3B0aW9uLT5mbGFncyAmIEFSR19IQVNfVkFMVUUpCisJCQkmJiBhcmd2W2ldW2xlbl0gIT0gJz0nCisJCQkmJiBzdHJjbXAoYXJndltpICsgMV0sICItLSIpICE9IDApCisJCXsKKwkJICAgICsrbl9zdHJpcDsKKwkJICAgIC0tKmFyZ2M7CisJCSAgICBpZiAob3B0aW9uLT5mbGFncyAmIEFSR19GT1JfR1RLKQorCQkJZ3VpX2FyZ3ZbZ3VpX2FyZ2MrK10gPSBhcmd2W2kgKyAxXTsKKwkJfQorCisJCWlmICgqYXJnYyA+IGkpCisJCSAgICBtY2hfbWVtbW92ZSgmYXJndltpXSwgJmFyZ3ZbaSArIG5fc3RyaXBdLAorCQkJCQkJKCphcmdjIC0gaSkgKiBzaXplb2YoY2hhciAqKSk7CisJICAgIH0KKwkgICAgYXJndlsqYXJnY10gPSBOVUxMOworCX0KKyAgICB9CisKKyAgICBndWlfYXJndltndWlfYXJnY10gPSBOVUxMOworfQorCisvKgorICogVGhpcyBzaG91bGQgYmUgbWF5YmUgY29tcGxldGVseSByZW1vdmVkLgorICogRG9lc24ndCBzZWVtIHBvc3NpYmxlLCBzaW5jZSBjaGVja19jb3B5X2FyZWEoKSByZWxpZXMgb24KKyAqIHRoaXMgaW5mb3JtYXRpb24uICAtLWRhbmllbGsKKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGdpbnQKK3Zpc2liaWxpdHlfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50VmlzaWJpbGl0eSAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgZ3VpLnZpc2liaWxpdHkgPSBldmVudC0+c3RhdGU7CisgICAgLyoKKyAgICAgKiBXaGVuIHdlIGRvIGFuIGdka193aW5kb3dfY29weV9hcmVhKCksIGFuZCB0aGUgd2luZG93IGlzIHBhcnRpYWxseQorICAgICAqIG9ic2N1cmVkLCB3ZSB3YW50IHRvIHJlY2VpdmUgYW4gZXZlbnQgdG8gdGVsbCB1cyB3aGV0aGVyIGl0IHdvcmtlZAorICAgICAqIG9yIG5vdC4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLnRleHRfZ2MgIT0gTlVMTCkKKwlnZGtfZ2Nfc2V0X2V4cG9zdXJlcyhndWkudGV4dF9nYywKKwkJCSAgICAgZ3VpLnZpc2liaWxpdHkgIT0gR0RLX1ZJU0lCSUxJVFlfVU5PQlNDVVJFRCk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmVkcmF3IHRoZSBjb3JyZXNwb25kaW5nIHBvcnRpb25zIG9mIHRoZSBzY3JlZW4uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CitleHBvc2VfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50RXhwb3NlICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICAvKiBTa2lwIHRoaXMgd2hlbiB0aGUgR1VJIGlzbid0IHNldCB1cCB5ZXQsIHdpbGwgcmVkcmF3IGxhdGVyLiAqLworICAgIGlmIChndWkuc3RhcnRpbmcpCisJcmV0dXJuIEZBTFNFOworCisgICAgb3V0X2ZsdXNoKCk7CQkvKiBtYWtlIHN1cmUgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKyAgICBndWlfcmVkcmF3KGV2ZW50LT5hcmVhLngsIGV2ZW50LT5hcmVhLnksCisJICAgICAgIGV2ZW50LT5hcmVhLndpZHRoLCBldmVudC0+YXJlYS5oZWlnaHQpOworCisgICAgLyogQ2xlYXIgdGhlIGJvcmRlciBhcmVhcyBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZXZlbnQtPmFyZWEueCA8IEZJTExfWCgwKSkKKwlnZGtfd2luZG93X2NsZWFyX2FyZWEoZ3VpLmRyYXdhcmVhLT53aW5kb3csIDAsIDAsIEZJTExfWCgwKSwgMCk7CisgICAgaWYgKGV2ZW50LT5hcmVhLnkgPCBGSUxMX1koMCkpCisJZ2RrX3dpbmRvd19jbGVhcl9hcmVhKGd1aS5kcmF3YXJlYS0+d2luZG93LCAwLCAwLCAwLCBGSUxMX1koMCkpOworICAgIGlmIChldmVudC0+YXJlYS54ID4gRklMTF9YKENvbHVtbnMpKQorCWdka193aW5kb3dfY2xlYXJfYXJlYShndWkuZHJhd2FyZWEtPndpbmRvdywKKwkJCSAgICAgIEZJTExfWCgoaW50KUNvbHVtbnMpLCAwLCAwLCAwKTsKKyAgICBpZiAoZXZlbnQtPmFyZWEueSA+IEZJTExfWShSb3dzKSkKKwlnZGtfd2luZG93X2NsZWFyX2FyZWEoZ3VpLmRyYXdhcmVhLT53aW5kb3csIDAsIEZJTExfWSgoaW50KVJvd3MpLCAwLCAwKTsKKworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisvKgorICogSGFuZGxlIGNoYW5nZXMgdG8gdGhlICJDb21tIiBwcm9wZXJ0eQorICovCisvKkFSR1NVU0VEMiovCisgICAgc3RhdGljIGdpbnQKK3Byb3BlcnR5X2V2ZW50KEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudFByb3BlcnR5ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gR0RLX1BST1BFUlRZX05PVElGWQorCSAgICAmJiBldmVudC0+c3RhdGUgPT0gKGludClHREtfUFJPUEVSVFlfTkVXX1ZBTFVFCisJICAgICYmIEdES19XSU5ET1dfWFdJTkRPVyhldmVudC0+d2luZG93KSA9PSBjb21tV2luZG93CisJICAgICYmIEdFVF9YX0FUT00oZXZlbnQtPmF0b20pID09IGNvbW1Qcm9wZXJ0eSkKKyAgICB7CisJWEV2ZW50IHhldjsKKworCS8qIFRyYW5zbGF0ZSB0byBYTGliICovCisJeGV2Lnhwcm9wZXJ0eS50eXBlID0gUHJvcGVydHlOb3RpZnk7CisJeGV2Lnhwcm9wZXJ0eS5hdG9tID0gY29tbVByb3BlcnR5OworCXhldi54cHJvcGVydHkud2luZG93ID0gY29tbVdpbmRvdzsKKwl4ZXYueHByb3BlcnR5LnN0YXRlID0gUHJvcGVydHlOZXdWYWx1ZTsKKwlzZXJ2ZXJFdmVudFByb2MoR0RLX1dJTkRPV19YRElTUExBWSh3aWRnZXQtPndpbmRvdyksICZ4ZXYpOworCisJaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCSAgICBndGtfbWFpbl9xdWl0KCk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb2N1cyBoYW5kbGVyczoKKyAqLworCisKKy8qCisgKiBUaGlzIGlzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmU6CisgKiBCTElOS19OT05FCW5vdCBibGlua2luZyBhdCBhbGwKKyAqIEJMSU5LX09GRglibGlua2luZywgY3Vyc29yIGlzIG5vdCBzaG93bgorICogQkxJTktfT04JYmxpbmtpbmcsIGN1cnNvciBpcyBzaG93bgorICovCisKKyNkZWZpbmUgQkxJTktfTk9ORSAgMAorI2RlZmluZSBCTElOS19PRkYgICAxCisjZGVmaW5lIEJMSU5LX09OICAgIDIKKworc3RhdGljIGludCBibGlua19zdGF0ZSA9IEJMSU5LX05PTkU7CitzdGF0aWMgbG9uZ191IGJsaW5rX3dhaXR0aW1lID0gNzAwOworc3RhdGljIGxvbmdfdSBibGlua19vbnRpbWUgPSA0MDA7CitzdGF0aWMgbG9uZ191IGJsaW5rX29mZnRpbWUgPSAyNTA7CitzdGF0aWMgZ3VpbnQgYmxpbmtfdGltZXIgPSAwOworCisgICAgdm9pZAorZ3VpX21jaF9zZXRfYmxpbmtpbmcobG9uZyB3YWl0dGltZSwgbG9uZyBvbiwgbG9uZyBvZmYpCit7CisgICAgYmxpbmtfd2FpdHRpbWUgPSB3YWl0dGltZTsKKyAgICBibGlua19vbnRpbWUgPSBvbjsKKyAgICBibGlua19vZmZ0aW1lID0gb2ZmOworfQorCisvKgorICogU3RvcCB0aGUgY3Vyc29yIGJsaW5raW5nLiAgU2hvdyB0aGUgY3Vyc29yIGlmIGl0IHdhc24ndCBzaG93bi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RvcF9ibGluayh2b2lkKQoreworICAgIGlmIChibGlua190aW1lcikKKyAgICB7CisJZ3RrX3RpbWVvdXRfcmVtb3ZlKGJsaW5rX3RpbWVyKTsKKwlibGlua190aW1lciA9IDA7CisgICAgfQorICAgIGlmIChibGlua19zdGF0ZSA9PSBCTElOS19PRkYpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGdpbnQKK2JsaW5rX2NiKGdwb2ludGVyIGRhdGEpCit7CisgICAgaWYgKGJsaW5rX3N0YXRlID09IEJMSU5LX09OKQorICAgIHsKKwlndWlfdW5kcmF3X2N1cnNvcigpOworCWJsaW5rX3N0YXRlID0gQkxJTktfT0ZGOworCWJsaW5rX3RpbWVyID0gZ3RrX3RpbWVvdXRfYWRkKChndWludDMyKWJsaW5rX29mZnRpbWUsCisJCQkJICAgKEd0a0Z1bmN0aW9uKSBibGlua19jYiwgTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCWJsaW5rX3N0YXRlID0gQkxJTktfT047CisJYmxpbmtfdGltZXIgPSBndGtfdGltZW91dF9hZGQoKGd1aW50MzIpYmxpbmtfb250aW1lLAorCQkJCSAgIChHdGtGdW5jdGlvbikgYmxpbmtfY2IsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsJCS8qIGRvbid0IGhhcHBlbiBhZ2FpbiAqLworfQorCisvKgorICogU3RhcnQgdGhlIGN1cnNvciBibGlua2luZy4gIElmIGl0IHdhcyBhbHJlYWR5IGJsaW5raW5nLCB0aGlzIHJlc3RhcnRzIHRoZQorICogd2FpdGluZyB0aW1lIGFuZCBzaG93cyB0aGUgY3Vyc29yLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zdGFydF9ibGluayh2b2lkKQoreworICAgIGlmIChibGlua190aW1lcikKKwlndGtfdGltZW91dF9yZW1vdmUoYmxpbmtfdGltZXIpOworICAgIC8qIE9ubHkgc3dpdGNoIGJsaW5raW5nIG9uIGlmIG5vbmUgb2YgdGhlIHRpbWVzIGlzIHplcm8gKi8KKyAgICBpZiAoYmxpbmtfd2FpdHRpbWUgJiYgYmxpbmtfb250aW1lICYmIGJsaW5rX29mZnRpbWUgJiYgZ3VpLmluX2ZvY3VzKQorICAgIHsKKwlibGlua190aW1lciA9IGd0a190aW1lb3V0X2FkZCgoZ3VpbnQzMilibGlua193YWl0dGltZSwKKwkJCQkgICAoR3RrRnVuY3Rpb24pIGJsaW5rX2NiLCBOVUxMKTsKKwlibGlua19zdGF0ZSA9IEJMSU5LX09OOworCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKyAgICB9Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CitlbnRlcl9ub3RpZnlfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50Q3Jvc3NpbmcgKmV2ZW50LCBncG9pbnRlciBkYXRhKQoreworICAgIGlmIChibGlua19zdGF0ZSA9PSBCTElOS19OT05FKQorCWd1aV9tY2hfc3RhcnRfYmxpbmsoKTsKKworICAgIC8qIG1ha2Ugc3VyZSBrZXlib2FyZCBpbnB1dCBnb2VzIHRoZXJlICovCisgICAgaWYgKGd0a19zb2NrZXRfaWQgPT0gMCB8fCAhR1RLX1dJREdFVF9IQVNfRk9DVVMoZ3VpLmRyYXdhcmVhKSkKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZ3VpLmRyYXdhcmVhKTsKKworICAgIHJldHVybiBGQUxTRTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGdpbnQKK2xlYXZlX25vdGlmeV9ldmVudChHdGtXaWRnZXQgKndpZGdldCwgR2RrRXZlbnRDcm9zc2luZyAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgaWYgKGJsaW5rX3N0YXRlICE9IEJMSU5LX05PTkUpCisJZ3VpX21jaF9zdG9wX2JsaW5rKCk7CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50Citmb2N1c19pbl9ldmVudChHdGtXaWRnZXQgKndpZGdldCwgR2RrRXZlbnRGb2N1cyAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKKworICAgIGlmIChibGlua19zdGF0ZSA9PSBCTElOS19OT05FKQorCWd1aV9tY2hfc3RhcnRfYmxpbmsoKTsKKworICAgIC8qIG1ha2Ugc3VyZSBrZXlib2FyZCBpbnB1dCBnb2VzIHRoZXJlICovCisgICAgaWYgKGd0a19zb2NrZXRfaWQgPT0gMCkKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXMoZ3VpLmRyYXdhcmVhKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgZ2ludAorZm9jdXNfb3V0X2V2ZW50KEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudEZvY3VzICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBndWlfZm9jdXNfY2hhbmdlKEZBTFNFKTsKKworICAgIGlmIChibGlua19zdGF0ZSAhPSBCTElOS19OT05FKQorCWd1aV9tY2hfc3RvcF9ibGluaygpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIEhBVkVfR1RLMgorLyoKKyAqIFRyYW5zbGF0ZSBhIEdESyBrZXkgdmFsdWUgdG8gVVRGLTggaW5kZXBlbmRlbnRseSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgKiBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RyaW5nLCB3aGljaCBtdXN0IGhhdmUgcm9vbSBmb3IgYXQgbGVhc3QgNiBieXRlcworICogcGx1cyB0aGUgTlVMIHRlcm1pbmF0b3IuICBSZXR1cm5zIHRoZSBsZW5ndGggaW4gYnl0ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHRoZSBHVEsrIDIgR1VJIG9ubHkuICBUaGUgR1RLKyAxIGNvZGUgbWFrZXMgdXNlCisgKiBvZiBHZGtFdmVudEtleTo6c3RyaW5nIGluc3RlYWQuICBCdXQgZXZlbnQtPnN0cmluZyBpcyBldmlsOyBzZWUgaGVyZSB3aHk6CisgKiBodHRwOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9kb2MvQVBJLzIuMC9nZGsvZ2RrLUV2ZW50LVN0cnVjdHVyZXMuaHRtbCNHZGtFdmVudEtleQorICovCisgICAgc3RhdGljIGludAora2V5dmFsX3RvX3N0cmluZyh1bnNpZ25lZCBpbnQga2V5dmFsLCB1bnNpZ25lZCBpbnQgc3RhdGUsIGNoYXJfdSAqc3RyaW5nKQoreworICAgIGludAkgICAgbGVuOworICAgIGd1aW50MzIgdWM7CisKKyAgICB1YyA9IGdka19rZXl2YWxfdG9fdW5pY29kZShrZXl2YWwpOworICAgIGlmICh1YyAhPSAwKQorICAgIHsKKwkvKiBDaGVjayBmb3IgQ1RSTC1mb28gKi8KKwlpZiAoKHN0YXRlICYgR0RLX0NPTlRST0xfTUFTSykgJiYgdWMgPj0gMHgyMCAmJiB1YyA8IDB4ODApCisJeworCSAgICAvKiBUaGVzZSBtYXBwaW5ncyBsb29rIGFyYml0cmFyeSBhdCB0aGUgZmlyc3QgZ2xhbmNlLCBidXQgaW4gZmFjdAorCSAgICAgKiByZXNlbWJsZSBxdWl0ZSBleGFjdGx5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEdUSysgMS4yIEdVSSBvbiBteQorCSAgICAgKiBtYWNoaW5lLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyBCUyB2cy4gREVMIGZvciBDVFJMLTggKG1ha2VzCisJICAgICAqIG1vcmUgc2Vuc2UgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCB1c3VhbCB0ZXJtaW5hbCBiZWhhdmlvdXIpLiAqLworCSAgICBpZiAodWMgPj0gJ0AnKQorCQlzdHJpbmdbMF0gPSB1YyAmIDB4MUY7CisJICAgIGVsc2UgaWYgKHVjID09ICcyJykKKwkJc3RyaW5nWzBdID0gTlVMOworCSAgICBlbHNlIGlmICh1YyA+PSAnMycgJiYgdWMgPD0gJzcnKQorCQlzdHJpbmdbMF0gPSB1YyBeIDB4Mjg7CisJICAgIGVsc2UgaWYgKHVjID09ICc4JykKKwkJc3RyaW5nWzBdID0gQlM7CisJICAgIGVsc2UgaWYgKHVjID09ICc/JykKKwkJc3RyaW5nWzBdID0gREVMOworCSAgICBlbHNlCisJCXN0cmluZ1swXSA9IHVjOworCSAgICBsZW4gPSAxOworCX0KKwllbHNlCisJeworCSAgICAvKiBUcmFuc2xhdGUgYSBub3JtYWwga2V5IHRvIFVURi04LiAgVGhpcyBkb2Vzbid0IHdvcmsgZm9yIGRlYWQKKwkgICAgICoga2V5cyBvZiBjb3Vyc2UsIHlvdSBfaGF2ZV8gdG8gdXNlIGFuIGlucHV0IG1ldGhvZCBmb3IgdGhhdC4gKi8KKwkgICAgbGVuID0gdXRmX2NoYXIyYnl0ZXMoKGludCl1Yywgc3RyaW5nKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogVHJhbnNsYXRlIGtleXMgd2hpY2ggYXJlIHJlcHJlc2VudGVkIGJ5IEFTQ0lJIGNvbnRyb2wgY29kZXMgaW4gVmltLgorCSAqIFRoZXJlIGFyZSBvbmx5IGEgZmV3IG9mIHRob3NlOyBtb3N0IGNvbnRyb2wga2V5cyBhcmUgdHJhbnNsYXRlZCB0bworCSAqIHNwZWNpYWwgdGVybWluYWwtbGlrZSBjb250cm9sIHNlcXVlbmNlcy4gKi8KKwlsZW4gPSAxOworCXN3aXRjaCAoa2V5dmFsKQorCXsKKwkgICAgY2FzZSBHREtfVGFiOiBjYXNlIEdES19LUF9UYWI6IGNhc2UgR0RLX0lTT19MZWZ0X1RhYjoKKwkJc3RyaW5nWzBdID0gVEFCOworCQlicmVhazsKKwkgICAgY2FzZSBHREtfTGluZWZlZWQ6CisJCXN0cmluZ1swXSA9IE5MOworCQlicmVhazsKKwkgICAgY2FzZSBHREtfUmV0dXJuOiBjYXNlIEdES19JU09fRW50ZXI6IGNhc2UgR0RLXzMyNzBfRW50ZXI6CisJCXN0cmluZ1swXSA9IENBUjsKKwkJYnJlYWs7CisJICAgIGNhc2UgR0RLX0VzY2FwZToKKwkJc3RyaW5nWzBdID0gRVNDOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICBzdHJpbmdbbGVuXSA9IE5VTDsKKworICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYgLyogSEFWRV9HVEsyICovCisKKy8qCisgKiBNYWluIGtleWJvYXJkIGhhbmRsZXI6CisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CitrZXlfcHJlc3NfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50S2V5ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICAvKiAyNTYgYnl0ZXMgaXMgd2F5IG92ZXIgdGhlIHRvcCwgYnV0IGZvciBzYWZldHkgbGV0J3MgcmVkdWNlIGl0IG9ubHkKKyAgICAgKiBmb3IgR1RLKyAyIHdoZXJlIHdlIGtub3cgZm9yIHN1cmUgaG93IGxhcmdlIHRoZSBzdHJpbmcgbWlnaHQgZ2V0LgorICAgICAqIChUaGF0IGlzLCB1cCB0byA2IGJ5dGVzICsgTlVMICsgQ1NJIGVzY2FwZXMgKyBzYWZldHkgbWVhc3VyZS4pICovCisgICAgY2hhcl91CXN0cmluZ1szMl0sIHN0cmluZzJbMzJdOworI2Vsc2UKKyAgICBjaGFyX3UJc3RyaW5nWzI1Nl0sIHN0cmluZzJbMjU2XTsKKyNlbmRpZgorICAgIGd1aW50CWtleV9zeW07CisgICAgaW50CQlsZW47CisgICAgaW50CQlpOworICAgIGludAkJbW9kaWZpZXJzOworICAgIGludAkJa2V5OworICAgIGd1aW50CXN0YXRlOworICAgIGNoYXJfdQkqcywgKmQ7CisKKyAgICBrZXlfc3ltID0gZXZlbnQtPmtleXZhbDsKKyAgICBzdGF0ZSA9IGV2ZW50LT5zdGF0ZTsKKyNpZm5kZWYgSEFWRV9HVEsyIC8qIGRlcHJlY2F0ZWQgKi8KKyAgICBsZW4gPSBldmVudC0+bGVuZ3RoOworICAgIGdfYXNzZXJ0KGxlbiA8PSBzaXplb2Yoc3RyaW5nKSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dUSzIKKyAgICAvKgorICAgICAqIEl0IGFwcGVhcnMgYXMgaWYgd2UgYWx3YXlzIHdhbnQgdG8gY29uc3VtZSBhIGtleS1wcmVzcyAodGhlcmUgY3VycmVudGx5CisgICAgICogYXJlbid0IGFueSAncmV0dXJuIEZBTFNFJ3MpLCBzbyB3ZSBhbHdheXMgZG8gdGhpczogd2hlbiBydW5uaW5nIGluIGEKKyAgICAgKiBHdGtQbHVnIGFuZCBub3QgYSB3aW5kb3csIHdlIG11c3QgcHJldmVudCBlbWlzc2lvbiBvZiB0aGUga2V5X3ByZXNzCisgICAgICogRVZFTlQgZnJvbSBjb250aW51aW5nICh3aGljaCBpcyAnYmV5b25kJyB0aGUgbGV2ZWwgb2Ygc3RvcHBpbmcgbWVyZQorICAgICAqIHNpZ25hbHMgYnkgcmV0dXJuaW5nIEZBTFNFKSwgb3RoZXJ3aXNlIHRoaW5ncyBsaWtlIHRhYi9jdXJzb3Ita2V5cyBhcmUKKyAgICAgKiBwcm9jZXNzZWQgYnkgdGhlIEd0a1BsdWcgZGVmYXVsdCBoYW5kbGVyLCB3aGljaCBtb3ZlcyBpbnB1dCBmb2N1cyBhd2F5CisgICAgICogZnJvbSB1cyEKKyAgICAgKiBOb3RlOiBUaGlzIHNob3VsZCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHdpdGggR1RLKyAyLgorICAgICAqLworICAgIGlmIChndGtfc29ja2V0X2lkICE9IDApCisJZ3RrX3NpZ25hbF9lbWl0X3N0b3BfYnlfbmFtZShHVEtfT0JKRUNUKHdpZGdldCksICJrZXlfcHJlc3NfZXZlbnQiKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9YSU0KKyAgICBpZiAoeGltX3F1ZXVlX2tleV9wcmVzc19ldmVudChldmVudCwgVFJVRSkpCisJcmV0dXJuIFRSVUU7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfSEFOR1VMSU4KKyAgICBpZiAoa2V5X3N5bSA9PSBHREtfc3BhY2UgJiYgKHN0YXRlICYgR0RLX1NISUZUX01BU0spKQorICAgIHsKKwloYW5ndWxfaW5wdXRfc3RhdGVfdG9nZ2xlKCk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBTdW5YS19GMzYKKyAgICAvKgorICAgICAqIFRoZXNlIGtleXMgaGF2ZSBib2d1cyBsb29rdXAgc3RyaW5ncywgYW5kIHRyYXBwaW5nIHRoZW0gaGVyZSBpcworICAgICAqIGVhc2llciB0aGFuIHRyeWluZyB0byBYUmViaW5kS2V5c3ltKCkgb24gdGhlbSB3aXRoIGV2ZXJ5IHBvc3NpYmxlCisgICAgICogY29tYmluYXRpb24gb2YgbW9kaWZpZXJzLgorICAgICAqLworICAgIGlmIChrZXlfc3ltID09IFN1blhLX0YzNiB8fCBrZXlfc3ltID09IFN1blhLX0YzNykKKwlsZW4gPSAwOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBIQVZFX0dUSzIKKwlsZW4gPSBrZXl2YWxfdG9fc3RyaW5nKGtleV9zeW0sIHN0YXRlLCBzdHJpbmcyKTsKKworCS8qIENhcmVmdWw6IGNvbnZlcnRfaW5wdXQoKSBkb2Vzbid0IGhhbmRsZSB0aGUgTlVMIGNoYXJhY3Rlci4KKwkgKiBObyBuZWVkIHRvIGNvbnZlcnQgcHVyZSBBU0NJSSBhbnl3YXksIHRodXMgdGhlIGxlbiA+IDEgY2hlY2suICovCisJaWYgKGxlbiA+IDEgJiYgaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgbGVuID0gY29udmVydF9pbnB1dChzdHJpbmcyLCBsZW4sIHNpemVvZihzdHJpbmcyKSk7CisKKwlzID0gc3RyaW5nMjsKKyNlbHNlCisjIGlmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl7CisJICAgIG1jaF9tZW1tb3ZlKHN0cmluZzIsIGV2ZW50LT5zdHJpbmcsIGxlbik7CisJICAgIGxlbiA9IGNvbnZlcnRfaW5wdXQoc3RyaW5nMiwgbGVuLCBzaXplb2Yoc3RyaW5nMikpOworCSAgICBzID0gc3RyaW5nMjsKKwl9CisJZWxzZQorIyBlbmRpZgorCSAgICBzID0gKGNoYXJfdSAqKWV2ZW50LT5zdHJpbmc7CisjZW5kaWYKKworCWQgPSBzdHJpbmc7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCXsKKwkgICAgKmQrKyA9IHNbaV07CisJICAgIGlmIChkWy0xXSA9PSBDU0kgJiYgZCArIDIgPCBzdHJpbmcgKyBzaXplb2Yoc3RyaW5nKSkKKwkgICAgeworCQkvKiBUdXJuIENTSSBpbnRvIEtfQ1NJLiAqLworCQkqZCsrID0gS1NfRVhUUkE7CisJCSpkKysgPSAoaW50KUtFX0NTSTsKKwkgICAgfQorCX0KKwlsZW4gPSBkIC0gc3RyaW5nOworICAgIH0KKworICAgIC8qIFNoaWZ0LVRhYiByZXN1bHRzIGluIExlZnRfVGFiLCBidXQgd2Ugd2FudCA8Uy1UYWI+ICovCisgICAgaWYgKGtleV9zeW0gPT0gR0RLX0lTT19MZWZ0X1RhYikKKyAgICB7CisJa2V5X3N5bSA9IEdES19UYWI7CisJc3RhdGUgfD0gR0RLX1NISUZUX01BU0s7CisgICAgfQorCisjaWZuZGVmIEhBVkVfR1RLMiAvKiBmb3IgR1RLKyAyLCB3ZSBoYW5kbGUgdGhpcyBpbiBrZXl2YWxfdG9fc3RyaW5nKCkgKi8KKyAgICBpZiAoKGtleV9zeW0gPT0gR0RLXzIgfHwga2V5X3N5bSA9PSBHREtfYXQpICYmIChzdGF0ZSAmIEdES19DT05UUk9MX01BU0spKQorICAgIHsKKwlzdHJpbmdbMF0gPSBOVUw7CS8qIENUUkwtMiBhbmQgQ1RSTC1AIGlzIE5VTCAqLworCWxlbiA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKGxlbiA9PSAwICYmIChrZXlfc3ltID09IEdES19zcGFjZSB8fCBrZXlfc3ltID09IEdES19UYWIpKQorICAgIHsKKwkvKiBXaGVuIHRoZXJlIGFyZSBtb2RpZmllcnMsIHRoZXNlIGtleXMgZ2V0IHplcm8gbGVuZ3RoOyB3ZSBuZWVkIHRoZQorCSAqIG9yaWdpbmFsIGtleSBoZXJlIHRvIGJlIGFibGUgdG8gYWRkIGEgbW9kaWZpZXIgYmVsb3cuICovCisJc3RyaW5nWzBdID0gKGtleV9zeW0gJiAweGZmKTsKKwlsZW4gPSAxOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NRU5VCisgICAgLyogSWYgdGhlcmUgaXMgYSBtZW51IGFuZCAnd2FrJyBpcyAieWVzIiwgb3IgJ3dhaycgaXMgIm1lbnUiIGFuZCB0aGUga2V5CisgICAgICogaXMgYSBtZW51IHNob3J0Y3V0LCB3ZSBpZ25vcmUgZXZlcnl0aGluZyB3aXRoIHRoZSBBTFQgbW9kaWZpZXIuICovCisgICAgaWYgKChzdGF0ZSAmIEdES19NT0QxX01BU0spCisJICAgICYmIGd1aS5tZW51X2lzX2FjdGl2ZQorCSAgICAmJiAoKnBfd2FrID09ICd5JworCQl8fCAoKnBfd2FrID09ICdtJworCQkgICAgJiYgbGVuID09IDEKKwkJICAgICYmIGd1aV9pc19tZW51X3Nob3J0Y3V0KHN0cmluZ1swXSkpKSkKKyMgaWZkZWYgSEFWRV9HVEsyCisJLyogRm9yIEdUSzIgd2UgcmV0dXJuIGZhbHNlIHRvIHNpZ25pZnkgdGhhdCB3ZSBoYXZlbid0IGhhbmRsZWQgdGhlCisJICoga2V5cHJlc3MsIHNvIHRoYXQgZ3RrIHdpbGwgaGFuZGxlIHRoZSBtbmVtb25pYyBvciBhY2NlbGVyYXRvci4gKi8KKwlyZXR1cm4gRkFMU0U7CisjIGVsc2UKKwlyZXR1cm4gVFJVRTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgLyogQ2hlY2sgZm9yIEFsdC9NZXRhIGtleSAoTW9kMU1hc2spLCBidXQgbm90IGZvciBhIEJTLCBERUwgb3IgY2hhcmFjdGVyCisgICAgICogdGhhdCBhbHJlYWR5IGhhcyB0aGUgOHRoIGJpdCBzZXQuCisgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgPFMtTS1UYWI+LCB0aGF0IHNob3VsZCBiZWNvbWUgS19TX1RBQiB3aXRoIEFMVC4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciBkb3VibGUtYnl0ZSBlbmNvZGluZ3MsIGl0IHR1cm5zIHRoZSBjaGFyIGludG8gYSBsZWFkCisgICAgICogYnl0ZS4gKi8KKyAgICBpZiAobGVuID09IDEKKwkgICAgJiYgKHN0YXRlICYgR0RLX01PRDFfTUFTSykKKwkgICAgJiYgIShrZXlfc3ltID09IEdES19CYWNrU3BhY2UgfHwga2V5X3N5bSA9PSBHREtfRGVsZXRlKQorCSAgICAmJiAoc3RyaW5nWzBdICYgMHg4MCkgPT0gMAorCSAgICAmJiAhKGtleV9zeW0gPT0gR0RLX1RhYiAmJiAoc3RhdGUgJiBHREtfU0hJRlRfTUFTSykpCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAmJiAhZW5jX2RiY3MKKyNlbmRpZgorCSAgICApCisgICAgeworCXN0cmluZ1swXSB8PSAweDgwOworCXN0YXRlICY9IH5HREtfTU9EMV9NQVNLOwkvKiBkb24ndCB1c2UgaXQgYWdhaW4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4KSAvKiBjb252ZXJ0IHRvIHV0Zi04ICovCisJeworCSAgICBzdHJpbmdbMV0gPSBzdHJpbmdbMF0gJiAweGJmOworCSAgICBzdHJpbmdbMF0gPSAoKHVuc2lnbmVkKXN0cmluZ1swXSA+PiA2KSArIDB4YzA7CisJICAgIGlmIChzdHJpbmdbMV0gPT0gQ1NJKQorCSAgICB7CisJCXN0cmluZ1syXSA9IEtTX0VYVFJBOworCQlzdHJpbmdbM10gPSAoaW50KUtFX0NTSTsKKwkJbGVuID0gNDsKKwkgICAgfQorCSAgICBlbHNlCisJCWxlbiA9IDI7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHNwZWNpYWwga2V5cy4JQWxzbyBkbyB0aGlzIHdoZW4gbGVuID09IDEgKGtleSBoYXMgYW4gQVNDSUkKKyAgICAgKiB2YWx1ZSkgdG8gZGV0ZWN0IGJhY2tzcGFjZSwgZGVsZXRlIGFuZCBrZXlwYWQga2V5cy4gKi8KKyAgICBpZiAobGVuID09IDAgfHwgbGVuID09IDEpCisgICAgeworCWZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IDA7IGkrKykKKwl7CisJICAgIGlmIChzcGVjaWFsX2tleXNbaV0ua2V5X3N5bSA9PSBrZXlfc3ltKQorCSAgICB7CisJCXN0cmluZ1swXSA9IENTSTsKKwkJc3RyaW5nWzFdID0gc3BlY2lhbF9rZXlzW2ldLmNvZGUwOworCQlzdHJpbmdbMl0gPSBzcGVjaWFsX2tleXNbaV0uY29kZTE7CisJCWxlbiA9IC0zOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAobGVuID09IDApICAgLyogVW5yZWNvZ25pemVkIGtleSAqLworCXJldHVybiBUUlVFOworCisjaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspICYmICFkZWZpbmVkKEhBVkVfR1RLMikKKyAgICAvKiBDYW5jZWwgb3IgdHlwZSBiYWNrc3BhY2UuIEZvciBHVEsyLCBpbV9jb21taXRfY2IoKSBkb2VzIHRoZSBzYW1lLiAqLworICAgIHByZWVkaXRfc3RhcnRfY29sID0gTUFYQ09MOworICAgIHhpbV9jaGFuZ2VkX3doaWxlX3ByZWVkaXRpbmcgPSBUUlVFOworI2VuZGlmCisKKyAgICAvKiBTcGVjaWFsIGtleXMgKGFuZCBhIGZldyBvdGhlcnMpIG1heSBoYXZlIG1vZGlmaWVycy4gQWxzbyB3aGVuIHVzaW5nIGEKKyAgICAgKiBkb3VibGUtYnl0ZSBlbmNvZGluZyAoY2FuJ3Qgc2V0IHRoZSA4dGggYml0KS4gKi8KKyAgICBpZiAobGVuID09IC0zIHx8IGtleV9zeW0gPT0gR0RLX3NwYWNlIHx8IGtleV9zeW0gPT0gR0RLX1RhYgorCSAgICB8fCBrZXlfc3ltID09IEdES19SZXR1cm4gfHwga2V5X3N5bSA9PSBHREtfTGluZWZlZWQKKwkgICAgfHwga2V5X3N5bSA9PSBHREtfRXNjYXBlIHx8IGtleV9zeW0gPT0gR0RLX0tQX1RhYgorCSAgICB8fCBrZXlfc3ltID09IEdES19JU09fRW50ZXIgfHwga2V5X3N5bSA9PSBHREtfMzI3MF9FbnRlcgorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgKGVuY19kYmNzICYmIGxlbiA9PSAxICYmIChzdGF0ZSAmIEdES19NT0QxX01BU0spKQorI2VuZGlmCisJICAgICkKKyAgICB7CisJbW9kaWZpZXJzID0gMDsKKwlpZiAoc3RhdGUgJiBHREtfU0hJRlRfTUFTSykKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCWlmIChzdGF0ZSAmIEdES19DT05UUk9MX01BU0spCisJICAgIG1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOworCWlmIChzdGF0ZSAmIEdES19NT0QxX01BU0spCisJICAgIG1vZGlmaWVycyB8PSBNT0RfTUFTS19BTFQ7CisKKwkvKgorCSAqIEZvciBzb21lIGtleXMgYSBzaGlmdCBtb2RpZmllciBpcyB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBrZXkKKwkgKiBjb2RlLgorCSAqLworCWlmIChsZW4gPT0gLTMpCisJICAgIGtleSA9IFRPX1NQRUNJQUwoc3RyaW5nWzFdLCBzdHJpbmdbMl0pOworCWVsc2UKKwkgICAga2V5ID0gc3RyaW5nWzBdOworCisJa2V5ID0gc2ltcGxpZnlfa2V5KGtleSwgJm1vZGlmaWVycyk7CisJaWYgKGtleSA9PSBDU0kpCisJICAgIGtleSA9IEtfQ1NJOworCWlmIChJU19TUEVDSUFMKGtleSkpCisJeworCSAgICBzdHJpbmdbMF0gPSBDU0k7CisJICAgIHN0cmluZ1sxXSA9IEtfU0VDT05EKGtleSk7CisJICAgIHN0cmluZ1syXSA9IEtfVEhJUkQoa2V5KTsKKwkgICAgbGVuID0gMzsKKwl9CisJZWxzZQorCXsKKwkgICAgc3RyaW5nWzBdID0ga2V5OworCSAgICBsZW4gPSAxOworCX0KKworCWlmIChtb2RpZmllcnMgIT0gMCkKKwl7CisJICAgIHN0cmluZzJbMF0gPSBDU0k7CisJICAgIHN0cmluZzJbMV0gPSBLU19NT0RJRklFUjsKKwkgICAgc3RyaW5nMlsyXSA9IG1vZGlmaWVyczsKKwkgICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcyLCAzKTsKKwl9CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAxICYmICgoc3RyaW5nWzBdID09IEN0cmxfQyAmJiBjdHJsX2NfaW50ZXJydXB0cykKKwkJICAgfHwgKHN0cmluZ1swXSA9PSBpbnRyX2NoYXIgJiYgaW50cl9jaGFyICE9IEN0cmxfQykpKQorICAgIHsKKwl0cmFzaF9pbnB1dF9idWYoKTsKKwlnb3RfaW50ID0gVFJVRTsKKyAgICB9CisKKyAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgbGVuKTsKKworICAgIC8qIGJsYW5rIG91dCB0aGUgcG9pbnRlciBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAocF9taCkKKwlndWlfbWNoX21vdXNlaGlkZShUUlVFKTsKKworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoSEFWRV9HVEsyKQorLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyBnYm9vbGVhbgora2V5X3JlbGVhc2VfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50S2V5ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICAvKgorICAgICAqIEdUSysgMiBpbnB1dCBtZXRob2RzIG1heSBkbyBmYW5jeSBzdHVmZiBvbiBrZXkgcmVsZWFzZSBldmVudHMgdG9vLgorICAgICAqIFdpdGggdGhlIGRlZmF1bHQgSU0gZm9yIGluc3RhbmNlLCB5b3UgY2FuIGVudGVyIGFueSBVQ1MgY29kZSBwb2ludAorICAgICAqIGJ5IGhvbGRpbmcgZG93biBDVFJMLVNISUZUIGFuZCB0eXBpbmcgaGV4YWRlY2ltYWwgZGlnaXRzLgorICAgICAqLworICAgIHJldHVybiB4aW1fcXVldWVfa2V5X3ByZXNzX2V2ZW50KGV2ZW50LCBGQUxTRSk7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2VsZWN0aW9uIGhhbmRsZXJzOgorICovCisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CitzZWxlY3Rpb25fY2xlYXJfZXZlbnQoR3RrV2lkZ2V0CQkqd2lkZ2V0LAorCQkgICAgICBHZGtFdmVudFNlbGVjdGlvbgkqZXZlbnQsCisJCSAgICAgIGdwb2ludGVyCQl1c2VyX2RhdGEpCit7CisgICAgaWYgKGV2ZW50LT5zZWxlY3Rpb24gPT0gY2xpcF9wbHVzLmd0a19zZWxfYXRvbSkKKwljbGlwX2xvc2Vfc2VsZWN0aW9uKCZjbGlwX3BsdXMpOworICAgIGVsc2UKKwljbGlwX2xvc2Vfc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworCisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIFJTX05PTkUJMAkvKiBzZWxlY3Rpb25fcmVjZWl2ZWRfY2IoKSBub3QgY2FsbGVkIHlldCAqLworI2RlZmluZSBSU19PSwkxCS8qIHNlbGVjdGlvbl9yZWNlaXZlZF9jYigpIGNhbGxlZCBhbmQgT0sgKi8KKyNkZWZpbmUgUlNfRkFJTAkyCS8qIHNlbGVjdGlvbl9yZWNlaXZlZF9jYigpIGNhbGxlZCBhbmQgZmFpbGVkICovCitzdGF0aWMgaW50IHJlY2VpdmVkX3NlbGVjdGlvbiA9IFJTX05PTkU7CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitzZWxlY3Rpb25fcmVjZWl2ZWRfY2IoR3RrV2lkZ2V0CQkqd2lkZ2V0LAorCQkgICAgICBHdGtTZWxlY3Rpb25EYXRhCSpkYXRhLAorCQkgICAgICBndWludAkJdGltZV8sCisJCSAgICAgIGdwb2ludGVyCQl1c2VyX2RhdGEpCit7CisgICAgVmltQ2xpcGJvYXJkICAgICpjYmQ7CisgICAgY2hhcl91CSAgICAqdGV4dDsKKyAgICBjaGFyX3UJICAgICp0bXBidWYgPSBOVUxMOworI2lmZGVmIEhBVkVfR1RLMgorICAgIGd1Y2hhcgkgICAgKnRtcGJ1Zl91dGY4ID0gTlVMTDsKKyNlbmRpZgorICAgIGludAkJICAgIGxlbjsKKyAgICBpbnQJCSAgICBtb3Rpb25fdHlwZTsKKworICAgIGlmIChkYXRhLT5zZWxlY3Rpb24gPT0gY2xpcF9wbHVzLmd0a19zZWxfYXRvbSkKKwljYmQgPSAmY2xpcF9wbHVzOworICAgIGVsc2UKKwljYmQgPSAmY2xpcF9zdGFyOworCisgICAgdGV4dCA9IChjaGFyX3UgKilkYXRhLT5kYXRhOworICAgIGxlbiAgPSBkYXRhLT5sZW5ndGg7CisgICAgbW90aW9uX3R5cGUgPSBNQ0hBUjsKKworICAgIGlmICh0ZXh0ID09IE5VTEwgfHwgbGVuIDw9IDApCisgICAgeworCXJlY2VpdmVkX3NlbGVjdGlvbiA9IFJTX0ZBSUw7CisJLyogY2xpcF9mcmVlX3NlbGVjdGlvbihjYmQpOyA/Pz8gKi8KKworCWlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwkgICAgZ3RrX21haW5fcXVpdCgpOworCisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChkYXRhLT50eXBlID09IHZpbV9hdG9tKQorICAgIHsKKwltb3Rpb25fdHlwZSA9ICp0ZXh0Kys7CisJLS1sZW47CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIGVsc2UgaWYgKGRhdGEtPnR5cGUgPT0gdmltZW5jX2F0b20pCisgICAgeworCWNoYXJfdQkJKmVuYzsKKwl2aW1jb252X1QJY29udjsKKworCW1vdGlvbl90eXBlID0gKnRleHQrKzsKKwktLWxlbjsKKworCWVuYyA9IHRleHQ7CisJdGV4dCArPSBTVFJMRU4odGV4dCkgKyAxOworCWxlbiAtPSB0ZXh0IC0gZW5jOworCisJLyogSWYgdGhlIGVuY29kaW5nIG9mIHRoZSB0ZXh0IGlzIGRpZmZlcmVudCBmcm9tICdlbmNvZGluZycsIGF0dGVtcHQKKwkgKiBjb252ZXJ0aW5nIGl0LiAqLworCWNvbnYudmNfdHlwZSA9IENPTlZfTk9ORTsKKwljb252ZXJ0X3NldHVwKCZjb252LCBlbmMsIHBfZW5jKTsKKwlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl7CisJICAgIHRtcGJ1ZiA9IHN0cmluZ19jb252ZXJ0KCZjb252LCB0ZXh0LCAmbGVuKTsKKwkgICAgaWYgKHRtcGJ1ZiAhPSBOVUxMKQorCQl0ZXh0ID0gdG1wYnVmOworCSAgICBjb252ZXJ0X3NldHVwKCZjb252LCBOVUxMLCBOVUxMKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICAvKiBndGtfc2VsZWN0aW9uX2RhdGFfZ2V0X3RleHQoKSBoYW5kbGVzIGFsbCB0aGUgbmFzdHkgZGV0YWlscworICAgICAqIGFuZCB0YXJnZXRzIGFuZCBlbmNvZGluZ3MgZXRjLiAgVGhpcyByb2NrcyBzbyBoYXJkLiAqLworICAgIGVsc2UKKyAgICB7CisJdG1wYnVmX3V0ZjggPSBndGtfc2VsZWN0aW9uX2RhdGFfZ2V0X3RleHQoZGF0YSk7CisJaWYgKHRtcGJ1Zl91dGY4ICE9IE5VTEwpCisJeworCSAgICBsZW4gPSBTVFJMRU4odG1wYnVmX3V0ZjgpOworCSAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgeworCQl0bXBidWYgPSBzdHJpbmdfY29udmVydCgmaW5wdXRfY29udiwgdG1wYnVmX3V0ZjgsICZsZW4pOworCQlpZiAodG1wYnVmICE9IE5VTEwpCisJCSAgICB0ZXh0ID0gdG1wYnVmOworCSAgICB9CisJICAgIGVsc2UKKwkJdGV4dCA9IHRtcGJ1Zl91dGY4OworCX0KKyAgICB9CisjZWxzZSAvKiAhSEFWRV9HVEsyICovCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmIChkYXRhLT50eXBlID09IHV0Zjhfc3RyaW5nX2F0b20pCisgICAgeworCXZpbWNvbnZfVCBjb252OworCisJY29udi52Y190eXBlID0gQ09OVl9OT05FOworCWNvbnZlcnRfc2V0dXAoJmNvbnYsIChjaGFyX3UgKikidXRmLTgiLCBwX2VuYyk7CisKKwlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl7CisJICAgIHRtcGJ1ZiA9IHN0cmluZ19jb252ZXJ0KCZjb252LCB0ZXh0LCAmbGVuKTsKKwkgICAgY29udmVydF9zZXR1cCgmY29udiwgTlVMTCwgTlVMTCk7CisJfQorCWlmICh0bXBidWYgIT0gTlVMTCkKKwkgICAgdGV4dCA9IHRtcGJ1ZjsKKyAgICB9CisjIGVuZGlmCisgICAgZWxzZSBpZiAoZGF0YS0+dHlwZSA9PSBjb21wb3VuZF90ZXh0X2F0b20gfHwgZGF0YS0+dHlwZSA9PSB0ZXh0X2F0b20pCisgICAgeworCWNoYXIJICAgICoqbGlzdCA9IE5VTEw7CisJaW50CSAgICBjb3VudDsKKwlpbnQJICAgIGk7CisJdW5zaWduZWQgICAgdG1wbGVuID0gMDsKKworCWNvdW50ID0gZ2RrX3RleHRfcHJvcGVydHlfdG9fdGV4dF9saXN0KGRhdGEtPnR5cGUsIGRhdGEtPmZvcm1hdCwKKwkJCQkJICAgICAgIGRhdGEtPmRhdGEsIGRhdGEtPmxlbmd0aCwKKwkJCQkJICAgICAgICZsaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkgICAgdG1wbGVuICs9IHN0cmxlbihsaXN0W2ldKTsKKworCXRtcGJ1ZiA9IGFsbG9jKHRtcGxlbiArIDEpOworCWlmICh0bXBidWYgIT0gTlVMTCkKKwl7CisJICAgIHRtcGJ1ZlswXSA9IE5VTDsKKwkgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCVNUUkNBVCh0bXBidWYsIGxpc3RbaV0pOworCSAgICB0ZXh0ID0gdG1wYnVmOworCSAgICBsZW4gID0gdG1wbGVuOworCX0KKworCWlmIChsaXN0ICE9IE5VTEwpCisJICAgIGdka19mcmVlX3RleHRfbGlzdChsaXN0KTsKKyAgICB9CisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCisgICAgY2xpcF95YW5rX3NlbGVjdGlvbihtb3Rpb25fdHlwZSwgdGV4dCwgKGxvbmcpbGVuLCBjYmQpOworICAgIHJlY2VpdmVkX3NlbGVjdGlvbiA9IFJTX09LOworICAgIHZpbV9mcmVlKHRtcGJ1Zik7CisjaWZkZWYgSEFWRV9HVEsyCisgICAgZ19mcmVlKHRtcGJ1Zl91dGY4KTsKKyNlbmRpZgorCisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKworLyoKKyAqIFByZXBhcmUgb3VyIHNlbGVjdGlvbiBkYXRhIGZvciBwYXNzaW5nIGl0IHRvIHRoZSBleHRlcm5hbCBzZWxlY3Rpb24KKyAqIGNsaWVudC4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3NlbGVjdGlvbl9nZXRfY2IoR3RrV2lkZ2V0CSAgICAqd2lkZ2V0LAorCQkgR3RrU2VsZWN0aW9uRGF0YSAgICpzZWxlY3Rpb25fZGF0YSwKKwkJIGd1aW50CQkgICAgaW5mbywKKwkJIGd1aW50CQkgICAgdGltZV8sCisJCSBncG9pbnRlcgkgICAgdXNlcl9kYXRhKQoreworICAgIGNoYXJfdQkgICAgKnN0cmluZzsKKyAgICBjaGFyX3UJICAgICp0bXBidWY7CisgICAgbG9uZ191CSAgICB0bXBsZW47CisgICAgaW50CQkgICAgbGVuZ3RoOworICAgIGludAkJICAgIG1vdGlvbl90eXBlOworICAgIEdka0F0b20JICAgIHR5cGU7CisgICAgVmltQ2xpcGJvYXJkICAgICpjYmQ7CisKKyAgICBpZiAoc2VsZWN0aW9uX2RhdGEtPnNlbGVjdGlvbiA9PSBjbGlwX3BsdXMuZ3RrX3NlbF9hdG9tKQorCWNiZCA9ICZjbGlwX3BsdXM7CisgICAgZWxzZQorCWNiZCA9ICZjbGlwX3N0YXI7CisKKyAgICBpZiAoIWNiZC0+b3duZWQpCisJcmV0dXJuOwkJCS8qIFNob3VsZG4ndCBldmVyIGhhcHBlbiAqLworCisgICAgaWYgKGluZm8gIT0gKGd1aW50KVRBUkdFVF9TVFJJTkcKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgICYmIGluZm8gIT0gKGd1aW50KVRBUkdFVF9VVEY4X1NUUklORworCSAgICAmJiBpbmZvICE9IChndWludClUQVJHRVRfVklNRU5DCisjZW5kaWYKKwkgICAgJiYgaW5mbyAhPSAoZ3VpbnQpVEFSR0VUX1ZJTQorCSAgICAmJiBpbmZvICE9IChndWludClUQVJHRVRfQ09NUE9VTkRfVEVYVAorCSAgICAmJiBpbmZvICE9IChndWludClUQVJHRVRfVEVYVCkKKwlyZXR1cm47CisKKyAgICAvKiBnZXQgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSAnKicvJysnIHJlZ2lzdGVyICovCisgICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CisKKyAgICBtb3Rpb25fdHlwZSA9IGNsaXBfY29udmVydF9zZWxlY3Rpb24oJnN0cmluZywgJnRtcGxlbiwgY2JkKTsKKyAgICBpZiAobW90aW9uX3R5cGUgPCAwIHx8IHN0cmluZyA9PSBOVUxMKQorCXJldHVybjsKKyAgICAvKiBEdWUgdG8gaW50IGFyZ3VtZW50cyB3ZSBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIEdfTUFYSU5ULiAgQWxzbworICAgICAqIHJlc2VydmUgb25lIGV4dHJhIGJ5dGUgZm9yIE5VTCBvciB0aGUgbW90aW9uIHR5cGU7IGp1c3QgaW4gY2FzZS4KKyAgICAgKiAoTm90IHRoYXQgcGFzdGluZyAyRyBvZiB0ZXh0IGlzIGV2ZXIgZ29pbmcgdG8gd29yaywgYnV0Li4uIDstKSAqLworICAgIGxlbmd0aCA9IE1JTih0bXBsZW4sIChsb25nX3UpKEdfTUFYSU5UIC0gMSkpOworCisgICAgaWYgKGluZm8gPT0gKGd1aW50KVRBUkdFVF9WSU0pCisgICAgeworCXRtcGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZClsZW5ndGggKyAxKTsKKwlpZiAodG1wYnVmICE9IE5VTEwpCisJeworCSAgICB0bXBidWZbMF0gPSBtb3Rpb25fdHlwZTsKKwkgICAgbWNoX21lbW1vdmUodG1wYnVmICsgMSwgc3RyaW5nLCAoc2l6ZV90KWxlbmd0aCk7CisJfQorCS8qIEZvciBvdXIgb3duIGZvcm1hdCwgdGhlIGZpcnN0IGJ5dGUgY29udGFpbnMgdGhlIG1vdGlvbiB0eXBlICovCisJKytsZW5ndGg7CisJdmltX2ZyZWUoc3RyaW5nKTsKKwlzdHJpbmcgPSB0bXBidWY7CisJdHlwZSA9IHZpbV9hdG9tOworICAgIH0KKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmIChpbmZvID09IChndWludClUQVJHRVRfVklNRU5DKQorICAgIHsKKwlpbnQgbCA9IFNUUkxFTihwX2VuYyk7CisKKwkvKiBjb250ZW50czogbW90aW9uX3R5cGUgJ2VuY29kaW5nJyBOVUwgdGV4dCAqLworCXRtcGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZClsZW5ndGggKyBsICsgMik7CisJaWYgKHRtcGJ1ZiAhPSBOVUxMKQorCXsKKwkgICAgdG1wYnVmWzBdID0gbW90aW9uX3R5cGU7CisJICAgIFNUUkNQWSh0bXBidWYgKyAxLCBwX2VuYyk7CisJICAgIG1jaF9tZW1tb3ZlKHRtcGJ1ZiArIGwgKyAyLCBzdHJpbmcsIChzaXplX3QpbGVuZ3RoKTsKKwl9CisJbGVuZ3RoICs9IGwgKyAyOworCXZpbV9mcmVlKHN0cmluZyk7CisJc3RyaW5nID0gdG1wYnVmOworCXR5cGUgPSB2aW1lbmNfYXRvbTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfR1RLMgorICAgIC8qIGd0a19zZWxlY3Rpb25fZGF0YV9zZXRfdGV4dCgpIGhhbmRsZXMgZXZlcnl0aGluZyBmb3IgdXMuICBUaGlzIGlzCisgICAgICogc28gZWFzeSBhbmQgc2ltcGxlIGFuZCBjb29sLCBpdCdkIGJlIGluc2FuZSBub3QgdG8gdXNlIGl0LiAqLworICAgIGVsc2UKKyAgICB7CisJaWYgKG91dHB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgdG1wYnVmID0gc3RyaW5nX2NvbnZlcnQoJm91dHB1dF9jb252LCBzdHJpbmcsICZsZW5ndGgpOworCSAgICB2aW1fZnJlZShzdHJpbmcpOworCSAgICBpZiAodG1wYnVmID09IE5VTEwpCisJCXJldHVybjsKKwkgICAgc3RyaW5nID0gdG1wYnVmOworCX0KKwkvKiBWYWxpZGF0ZSB0aGUgc3RyaW5nIHRvIGF2b2lkIHJ1bnRpbWUgd2FybmluZ3MgKi8KKwlpZiAoZ191dGY4X3ZhbGlkYXRlKChjb25zdCBjaGFyICopc3RyaW5nLCAoZ3NzaXplKWxlbmd0aCwgTlVMTCkpCisJeworCSAgICBndGtfc2VsZWN0aW9uX2RhdGFfc2V0X3RleHQoc2VsZWN0aW9uX2RhdGEsCisJCQkJCShjb25zdCBjaGFyICopc3RyaW5nLCBsZW5ndGgpOworCX0KKwl2aW1fZnJlZShzdHJpbmcpOworCXJldHVybjsKKyAgICB9CisjZWxzZSAvKiAhSEFWRV9HVEsyICovCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmIChpbmZvID09IChndWludClUQVJHRVRfVVRGOF9TVFJJTkcpCisgICAgeworCXZpbWNvbnZfVCBjb252OworCisJY29udi52Y190eXBlID0gQ09OVl9OT05FOworCWNvbnZlcnRfc2V0dXAoJmNvbnYsIHBfZW5jLCAoY2hhcl91ICopInV0Zi04Iik7CisKKwlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl7CisJICAgIHRtcGJ1ZiA9IHN0cmluZ19jb252ZXJ0KCZjb252LCBzdHJpbmcsICZsZW5ndGgpOworCSAgICBjb252ZXJ0X3NldHVwKCZjb252LCBOVUxMLCBOVUxMKTsKKwkgICAgdmltX2ZyZWUoc3RyaW5nKTsKKwkgICAgc3RyaW5nID0gdG1wYnVmOworCX0KKwl0eXBlID0gdXRmOF9zdHJpbmdfYXRvbTsKKyAgICB9CisjIGVuZGlmCisgICAgZWxzZSBpZiAoaW5mbyA9PSAoZ3VpbnQpVEFSR0VUX0NPTVBPVU5EX1RFWFQKKwkJfHwgaW5mbyA9PSAoZ3VpbnQpVEFSR0VUX1RFWFQpCisgICAgeworCWludCBmb3JtYXQ7CisKKwkvKiBDb3B5IHRoZSBzdHJpbmcgdG8gZW5zdXJlIE5VTC10ZXJtaW5hdGlvbiAqLworCXRtcGJ1ZiA9IHZpbV9zdHJuc2F2ZShzdHJpbmcsIGxlbmd0aCk7CisJdmltX2ZyZWUoc3RyaW5nKTsKKwlpZiAodG1wYnVmICE9IE5VTEwpCisJeworCSAgICBnZGtfc3RyaW5nX3RvX2NvbXBvdW5kX3RleHQoKGNvbnN0IGNoYXIgKil0bXBidWYsCisJCQkJCSZ0eXBlLCAmZm9ybWF0LCAmc3RyaW5nLCAmbGVuZ3RoKTsKKwkgICAgdmltX2ZyZWUodG1wYnVmKTsKKwkgICAgc2VsZWN0aW9uX2RhdGEtPnR5cGUgPSB0eXBlOworCSAgICBzZWxlY3Rpb25fZGF0YS0+Zm9ybWF0ID0gZm9ybWF0OworCSAgICBndGtfc2VsZWN0aW9uX2RhdGFfc2V0KHNlbGVjdGlvbl9kYXRhLCB0eXBlLCBmb3JtYXQsIHN0cmluZywgbGVuZ3RoKTsKKwkgICAgZ2RrX2ZyZWVfY29tcG91bmRfdGV4dChzdHJpbmcpOworCX0KKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdHlwZSA9IEdES19UQVJHRVRfU1RSSU5HOworICAgIH0KKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyAgICBpZiAoc3RyaW5nICE9IE5VTEwpCisgICAgeworCXNlbGVjdGlvbl9kYXRhLT50eXBlID0gc2VsZWN0aW9uX2RhdGEtPnRhcmdldDsKKwlzZWxlY3Rpb25fZGF0YS0+Zm9ybWF0ID0gODsJLyogOCBiaXRzIHBlciBjaGFyICovCisKKwlndGtfc2VsZWN0aW9uX2RhdGFfc2V0KHNlbGVjdGlvbl9kYXRhLCB0eXBlLCA4LCBzdHJpbmcsIGxlbmd0aCk7CisJdmltX2ZyZWUoc3RyaW5nKTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgR1VJIGNhbiBiZSBzdGFydGVkLiAgQ2FsbGVkIGJlZm9yZSBndmltcmMgaXMgc291cmNlZC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50CitndWlfbWNoX2luaXRfY2hlY2sodm9pZCkKK3sKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgLyogVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbG9jYWxlIGhhbmRsaW5nIGNvbnNpc3RhbnQgYmV0d2VlbiB0aGUgR1VJCisgICAgICogYW5kIHRoZSByZXN0IG9mIFZJTS4gKi8KKyAgICBndGtfc2V0X2xvY2FsZSgpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRQorICAgIGlmIChndGtfc29ja2V0X2lkID09IDApCisJdXNpbmdfZ25vbWUgPSAxOworI2VuZGlmCisKKyAgICAvKiBEb24ndCB1c2UgZ3RrX2luaXQoKSBvciBnbm9tZV9pbml0KCksIGl0IGV4aXRzIG9uIGZhaWx1cmUuICovCisgICAgaWYgKCFndGtfaW5pdF9jaGVjaygmZ3VpX2FyZ2MsICZndWlfYXJndikpCisgICAgeworCWd1aS5keWluZyA9IFRSVUU7CisJRU1TRyhfKGVfb3BlbmRpc3ApKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vdXNlIGhhbmRsaW5nIGNhbGxiYWNrcworICovCisKKworc3RhdGljIGd1aW50IG1vdXNlX2NsaWNrX3RpbWVyID0gMDsKK3N0YXRpYyBpbnQgbW91c2VfdGltZWRfb3V0ID0gVFJVRTsKKworLyoKKyAqIFRpbWVyIHVzZWQgdG8gcmVjb2duaXplIG11bHRpcGxlIGNsaWNrcyBvZiB0aGUgbW91c2UgYnV0dG9uCisgKi8KKyAgICBzdGF0aWMgZ2ludAorbW91c2VfY2xpY2tfdGltZXJfY2IoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICAvKiB3ZSBkb24ndCB1c2UgdGhpcyBpbmZvcm1hdGlvbiBjdXJyZW50bHkgKi8KKyAgICBpbnQgKnRpbWVkX291dCA9IChpbnQgKikgZGF0YTsKKworICAgICp0aW1lZF9vdXQgPSBUUlVFOworICAgIHJldHVybiBGQUxTRTsJCS8qIGRvbid0IGhhcHBlbiBhZ2FpbiAqLworfQorCitzdGF0aWMgZ3VpbnQgbW90aW9uX3JlcGVhdF90aW1lciAgPSAwOworc3RhdGljIGludCAgIG1vdGlvbl9yZXBlYXRfb2Zmc2V0ID0gRkFMU0U7CitzdGF0aWMgZ2ludCAgbW90aW9uX3JlcGVhdF90aW1lcl9jYihncG9pbnRlcik7CisKKyAgICBzdGF0aWMgdm9pZAorcHJvY2Vzc19tb3Rpb25fbm90aWZ5KGludCB4LCBpbnQgeSwgR2RrTW9kaWZpZXJUeXBlIHN0YXRlKQoreworICAgIGludAkgICAgYnV0dG9uOworICAgIGludF91ICAgdmltX21vZGlmaWVyczsKKworICAgIGJ1dHRvbiA9IChzdGF0ZSAmIChHREtfQlVUVE9OMV9NQVNLIHwgR0RLX0JVVFRPTjJfTUFTSyB8CisJCSAgICAgICBHREtfQlVUVE9OM19NQVNLIHwgR0RLX0JVVFRPTjRfTUFTSyB8CisJCSAgICAgICBHREtfQlVUVE9ONV9NQVNLKSkKKwkgICAgICA/IE1PVVNFX0RSQUcgOiAnICc7CisKKyAgICAvKiBJZiBvdXIgcG9pbnRlciBpcyBjdXJyZW50bHkgaGlkZGVuLCB0aGVuIHdlIHNob3VsZCBzaG93IGl0LiAqLworICAgIGd1aV9tY2hfbW91c2VoaWRlKEZBTFNFKTsKKworICAgIC8qIEp1c3QgbW92aW5nIHRoZSByb2RlbnQgYWJvdmUgdGhlIGRyYXdpbmcgYXJlYSB3aXRob3V0IGFueSBidXR0b24KKyAgICAgKiBiZWluZyBwcmVzc2VkLiAqLworICAgIGlmIChidXR0b24gIT0gTU9VU0VfRFJBRykKKyAgICB7CisJZ3VpX21vdXNlX21vdmVkKHgsIHkpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiB0cmFuc2xhdGUgbW9kaWZpZXIgY29kaW5nIGJldHdlZW4gdGhlIG1haW4gZW5naW5lIGFuZCBHVEsgKi8KKyAgICB2aW1fbW9kaWZpZXJzID0gMHgwOworICAgIGlmIChzdGF0ZSAmIEdES19TSElGVF9NQVNLKQorCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfU0hJRlQ7CisgICAgaWYgKHN0YXRlICYgR0RLX0NPTlRST0xfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0NUUkw7CisgICAgaWYgKHN0YXRlICYgR0RLX01PRDFfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKKworICAgIC8qIGluZm9ybSB0aGUgZWRpdG9yIGVuZ2luZSBhYm91dCB0aGUgb2NjdXJlbmNlIG9mIHRoaXMgZXZlbnQgKi8KKyAgICBndWlfc2VuZF9tb3VzZV9ldmVudChidXR0b24sIHgsIHksIEZBTFNFLCB2aW1fbW9kaWZpZXJzKTsKKworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7CisKKyAgICAvKgorICAgICAqIEF1dG8gcmVwZWF0IHRpbWVyIGhhbmRsaW5nLgorICAgICAqLworICAgIGlmICh4IDwgMCB8fCB5IDwgMAorCSAgICB8fCB4ID49IGd1aS5kcmF3YXJlYS0+YWxsb2NhdGlvbi53aWR0aAorCSAgICB8fCB5ID49IGd1aS5kcmF3YXJlYS0+YWxsb2NhdGlvbi5oZWlnaHQpCisgICAgeworCisJaW50IGR4OworCWludCBkeTsKKwlpbnQgb2Zmc2hvb3Q7CisJaW50IGRlbGF5ID0gMTA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG1heGltYWwgZGlzdGFuY2Ugb2YgdGhlIGN1cnNvciBmcm9tIHRoZSBkcmF3aW5nIGFyZWEuCisJICogKG9mZnNob290IGNhbid0IGJlY29tZSBuZWdhdGl2ZSBoZXJlISkuCisJICovCisJZHggPSB4IDwgMCA/IC14IDogeCAtIGd1aS5kcmF3YXJlYS0+YWxsb2NhdGlvbi53aWR0aDsKKwlkeSA9IHkgPCAwID8gLXkgOiB5IC0gZ3VpLmRyYXdhcmVhLT5hbGxvY2F0aW9uLmhlaWdodDsKKworCW9mZnNob290ID0gZHggPiBkeSA/IGR4IDogZHk7CisKKwkvKiBNYWtlIGEgbGluZWFybHkgZGVjbGF5aW5nIHRpbWVyIGRlbGF5IHdpdGggYSB0aHJlc2hvbGQgb2YgNSBhdCBhCisJICogZGlzdGFuY2Ugb2YgMTI3IHBpeGVscyBmcm9tIHRoZSBtYWluIHdpbmRvdy4KKwkgKgorCSAqIE9uZSBjb3VsZCB0aGluayBlbmRsZXNzbHkgYWJvdXQgdGhlIG1vc3QgZXJnb25vbWljIHZhcmlhbnQgaGVyZS4KKwkgKiBGb3IgZXhhbXBsZSBpdCBjb3VsZCBtYWtlIHNlbnNlIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKwkgKiBkcmFncyBzdGFydCBpbnN0ZWFkLi4uCisJICoKKwkgKiBNYXliZSBhIHBhcmFib2xpYyBpbnRlcnBvbGF0aW9uIHdvdWxkIHN1aXRlIHVzIGJldHRlciBoZXJlIHRvby4uLgorCSAqLworCWlmIChvZmZzaG9vdCA+IDEyNykKKwl7CisJICAgIC8qIDUgYXBwZWFycyB0byBiZSBzb21laG93IG5lYXIgdG8gbXkgcGVyY2VwdHVhbCBsaW1pdHMgOi0pLiAqLworCSAgICBkZWxheSA9IDU7CisJfQorCWVsc2UKKwl7CisJICAgIGRlbGF5ID0gKDEzMCAqICgxMjcgLSBvZmZzaG9vdCkpIC8gMTI3ICsgNTsKKwl9CisKKwkvKiBzaG9vdCBhZ2FpbiAqLworCWlmICghbW90aW9uX3JlcGVhdF90aW1lcikKKwkgICAgbW90aW9uX3JlcGVhdF90aW1lciA9IGd0a190aW1lb3V0X2FkZCgoZ3VpbnQzMilkZWxheSwKKwkJCQkJCW1vdGlvbl9yZXBlYXRfdGltZXJfY2IsIE5VTEwpOworICAgIH0KK30KKworLyoKKyAqIFRpbWVyIHVzZWQgdG8gcmVjb2duaXplIG11bHRpcGxlIGNsaWNrcyBvZiB0aGUgbW91c2UgYnV0dG9uLgorICovCisvKkFSR1NVU0VEMCovCisgICAgc3RhdGljIGdpbnQKK21vdGlvbl9yZXBlYXRfdGltZXJfY2IoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBpbnQJCSAgICB4OworICAgIGludAkJICAgIHk7CisgICAgR2RrTW9kaWZpZXJUeXBlIHN0YXRlOworCisgICAgZ2RrX3dpbmRvd19nZXRfcG9pbnRlcihndWkuZHJhd2FyZWEtPndpbmRvdywgJngsICZ5LCAmc3RhdGUpOworCisgICAgaWYgKCEoc3RhdGUgJiAoR0RLX0JVVFRPTjFfTUFTSyB8IEdES19CVVRUT04yX01BU0sgfAorCQkgICBHREtfQlVUVE9OM19NQVNLIHwgR0RLX0JVVFRPTjRfTUFTSyB8CisJCSAgIEdES19CVVRUT041X01BU0spKSkKKyAgICB7CisJbW90aW9uX3JlcGVhdF90aW1lciA9IDA7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIElmIHRoZXJlIGFscmVhZHkgaXMgYSBtb3VzZSBjbGljayBpbiB0aGUgaW5wdXQgYnVmZmVyLCB3YWl0IGFub3RoZXIKKyAgICAgKiB0aW1lIChvdGhlcndpc2Ugd2Ugd291bGQgY3JlYXRlIGEgYmFja2xvZyBvZiBjbGlja3MpICovCisgICAgaWYgKHZpbV91c2VkX2luX2lucHV0X2J1ZigpID4gMTApCisJcmV0dXJuIFRSVUU7CisKKyAgICBtb3Rpb25fcmVwZWF0X3RpbWVyID0gMDsKKworICAgIC8qCisgICAgICogRmFrZSBhIG1vdGlvbiBldmVudC4KKyAgICAgKiBUcmljazogUHJldGVuZCB0aGUgbW91c2UgbW92ZWQgdG8gdGhlIG5leHQgY2hhcmFjdGVyIG9uIGV2ZXJ5IG90aGVyCisgICAgICogZXZlbnQsIG90aGVyd2lzZSBkcmFnIGV2ZW50cyB3aWxsIGJlIGRpc2NhcmRlZCwgYmVjYXVzZSB0aGV5IGFyZSBzdGlsbAorICAgICAqIGluIHRoZSBzYW1lIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBpZiAobW90aW9uX3JlcGVhdF9vZmZzZXQpCisJeCArPSBndWkuY2hhcl93aWR0aDsKKworICAgIG1vdGlvbl9yZXBlYXRfb2Zmc2V0ID0gIW1vdGlvbl9yZXBlYXRfb2Zmc2V0OworICAgIHByb2Nlc3NfbW90aW9uX25vdGlmeSh4LCB5LCBzdGF0ZSk7CisKKyAgICAvKiBEb24ndCBoYXBwZW4gYWdhaW4uICBXZSB3aWxsIGdldCByZWluc3RhbGxlZCBpbiB0aGUgc3ludGhldGljIGV2ZW50CisgICAgICogaWYgbmVlZGVkIC0tIHRodXMgcmVwZWF0aW5nIHNob3VsZCBzdGlsbCB3b3JrLiAqLworICAgIHJldHVybiBGQUxTRTsKK30KKworLypBUkdTVVNFRDIqLworICAgIHN0YXRpYyBnaW50Cittb3Rpb25fbm90aWZ5X2V2ZW50KEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudE1vdGlvbiAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgaWYgKGV2ZW50LT5pc19oaW50KQorICAgIHsKKwlpbnQJCXg7CisJaW50CQl5OworCUdka01vZGlmaWVyVHlwZQlzdGF0ZTsKKworCWdka193aW5kb3dfZ2V0X3BvaW50ZXIod2lkZ2V0LT53aW5kb3csICZ4LCAmeSwgJnN0YXRlKTsKKwlwcm9jZXNzX21vdGlvbl9ub3RpZnkoeCwgeSwgc3RhdGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXByb2Nlc3NfbW90aW9uX25vdGlmeSgoaW50KWV2ZW50LT54LCAoaW50KWV2ZW50LT55LAorCQkJICAgICAgKEdka01vZGlmaWVyVHlwZSlldmVudC0+c3RhdGUpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOyAvKiBoYW5kbGVkICovCit9CisKKworLyoKKyAqIE1vdXNlIGJ1dHRvbiBoYW5kbGluZy4gIE5vdGUgcGxlYXNlIHRoYXQgd2UgYXJlIGNhcHR1cmluZyBtdWx0aXBsZSBjbGljaydzCisgKiBieSBvdXIgb3duIHRpbWVvdXQgbWVjaGFuaXNtIGluc3RlYWQgb2YgdGhlIG9uZSBwcm92aWRlZCBieSBHVEsrIGl0c2VsZi4KKyAqIFRoaXMgaXMgZHVlIHRvIHRoZSB3YXkgdGhlIGdlbmVyaWMgVklNIGNvZGUgaXMgcmVjb2duaXppbmcgbXVsdGlwbGUgY2xpY2tzLgorICovCisvKkFSR1NVU0VEMiovCisgICAgc3RhdGljIGdpbnQKK2J1dHRvbl9wcmVzc19ldmVudChHdGtXaWRnZXQgKndpZGdldCwgR2RrRXZlbnRCdXR0b24gKmV2ZW50LCBncG9pbnRlciBkYXRhKQoreworICAgIGludCBidXR0b247CisgICAgaW50IHJlcGVhdGVkX2NsaWNrID0gRkFMU0U7CisgICAgaW50IHgsIHk7CisgICAgaW50X3UgdmltX21vZGlmaWVyczsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGZvY3VzIG5vdyB3ZSd2ZSBiZWVuIHNlbGVjdGVkICovCisgICAgaWYgKGd0a19zb2NrZXRfaWQgIT0gMCAmJiAhR1RLX1dJREdFVF9IQVNfRk9DVVMod2lkZ2V0KSkKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXMod2lkZ2V0KTsKKworICAgIC8qCisgICAgICogRG9uJ3QgbGV0IGFkZGl0aW9uYWwgZXZlbnRzIGFib3V0IG11bHRpcGxlIGNsaWNrcyBzZW5kIGJ5IEdUSyB0byB1cworICAgICAqIGFmdGVyIHRoZSBpbml0aWFsIGJ1dHRvbiBwcmVzcyBldmVudCBjb25mdXNlIHVzLgorICAgICAqLworICAgIGlmIChldmVudC0+dHlwZSAhPSBHREtfQlVUVE9OX1BSRVNTKQorCXJldHVybiBGQUxTRTsKKworICAgIHggPSBldmVudC0+eDsKKyAgICB5ID0gZXZlbnQtPnk7CisKKyAgICAvKiBIYW5kbGUgbXVsdGlwbGUgY2xpY2tzICovCisgICAgaWYgKCFtb3VzZV90aW1lZF9vdXQgJiYgbW91c2VfY2xpY2tfdGltZXIpCisgICAgeworCWd0a190aW1lb3V0X3JlbW92ZShtb3VzZV9jbGlja190aW1lcik7CisJbW91c2VfY2xpY2tfdGltZXIgPSAwOworCXJlcGVhdGVkX2NsaWNrID0gVFJVRTsKKyAgICB9CisKKyAgICBtb3VzZV90aW1lZF9vdXQgPSBGQUxTRTsKKyAgICBtb3VzZV9jbGlja190aW1lciA9IGd0a190aW1lb3V0X2FkZCgoZ3VpbnQzMilwX21vdXNldCwKKwkJCQkgIG1vdXNlX2NsaWNrX3RpbWVyX2NiLCAmbW91c2VfdGltZWRfb3V0KTsKKworICAgIHN3aXRjaCAoZXZlbnQtPmJ1dHRvbikKKyAgICB7CisgICAgY2FzZSAxOgorCWJ1dHRvbiA9IE1PVVNFX0xFRlQ7CisJYnJlYWs7CisgICAgY2FzZSAyOgorCWJ1dHRvbiA9IE1PVVNFX01JRERMRTsKKwlicmVhazsKKyAgICBjYXNlIDM6CisJYnV0dG9uID0gTU9VU0VfUklHSFQ7CisJYnJlYWs7CisjaWZuZGVmIEhBVkVfR1RLMgorICAgIGNhc2UgNDoKKwlidXR0b24gPSBNT1VTRV80OworCWJyZWFrOworICAgIGNhc2UgNToKKwlidXR0b24gPSBNT1VTRV81OworCWJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CQkvKiBVbmtub3duIGJ1dHRvbiAqLworICAgIH0KKworI2lmZGVmIEZFQVRfWElNCisgICAgLyogY2FuY2VsIGFueSBwcmVlZGl0aW5nICovCisgICAgaWYgKGltX2lzX3ByZWVkaXRpbmcoKSkKKwl4aW1fcmVzZXQoKTsKKyNlbmRpZgorCisgICAgdmltX21vZGlmaWVycyA9IDB4MDsKKyAgICBpZiAoZXZlbnQtPnN0YXRlICYgR0RLX1NISUZUX01BU0spCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKyAgICBpZiAoZXZlbnQtPnN0YXRlICYgR0RLX0NPTlRST0xfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0NUUkw7CisgICAgaWYgKGV2ZW50LT5zdGF0ZSAmIEdES19NT0QxX01BU0spCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9BTFQ7CisKKyAgICBndWlfc2VuZF9tb3VzZV9ldmVudChidXR0b24sIHgsIHksIHJlcGVhdGVkX2NsaWNrLCB2aW1fbW9kaWZpZXJzKTsKKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOyAvKiBtYWtlIHN1cmUgdGhlIGFib3ZlIHdpbGwgYmUgaGFuZGxlZCBpbW1lZGlhdGVseSAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBIQVZFX0dUSzIKKy8qCisgKiBHVEsrIDIgZG9lc24ndCBoYW5kbGUgbW91c2UgYnV0dG9ucyA0LCA1LCA2IGFuZCA3IHRoZSBzYW1lIHdheSBhcyBHVEsrIDEuCisgKiBJbnN0ZWFkLCBpdCBhYnN0cmFjdHMgc2Nyb2xsaW5nIHZpYSB0aGUgbmV3IEdka0V2ZW50U2Nyb2xsLgorICovCisvKkFSR1NVU0VEMiovCisgICAgc3RhdGljIGdib29sZWFuCitzY3JvbGxfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50U2Nyb2xsICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBpbnQJICAgIGJ1dHRvbjsKKyAgICBpbnRfdSAgIHZpbV9tb2RpZmllcnMgPSAwOworCisgICAgaWYgKGd0a19zb2NrZXRfaWQgIT0gMCAmJiAhR1RLX1dJREdFVF9IQVNfRk9DVVMod2lkZ2V0KSkKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXMod2lkZ2V0KTsKKworICAgIHN3aXRjaCAoZXZlbnQtPmRpcmVjdGlvbikKKyAgICB7CisJY2FzZSBHREtfU0NST0xMX1VQOgorCSAgICBidXR0b24gPSBNT1VTRV80OworCSAgICBicmVhazsKKwljYXNlIEdES19TQ1JPTExfRE9XTjoKKwkgICAgYnV0dG9uID0gTU9VU0VfNTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDogLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBsZWZ0IGFuZCByaWdodC4uLiAgWWV0LiAqLworCSAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjIGlmZGVmIEZFQVRfWElNCisgICAgLyogY2FuY2VsIGFueSBwcmVlZGl0aW5nICovCisgICAgaWYgKGltX2lzX3ByZWVkaXRpbmcoKSkKKwl4aW1fcmVzZXQoKTsKKyMgZW5kaWYKKworICAgIGlmIChldmVudC0+c3RhdGUgJiBHREtfU0hJRlRfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX1NISUZUOworICAgIGlmIChldmVudC0+c3RhdGUgJiBHREtfQ09OVFJPTF9NQVNLKQorCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiAoZXZlbnQtPnN0YXRlICYgR0RLX01PRDFfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKKworICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KGJ1dHRvbiwgKGludClldmVudC0+eCwgKGludClldmVudC0+eSwKKwkJCQkJCQlGQUxTRSwgdmltX21vZGlmaWVycyk7CisKKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOyAvKiBtYWtlIHN1cmUgdGhlIGFib3ZlIHdpbGwgYmUgaGFuZGxlZCBpbW1lZGlhdGVseSAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogSEFWRV9HVEsyICovCisKKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGdpbnQKK2J1dHRvbl9yZWxlYXNlX2V2ZW50KEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudEJ1dHRvbiAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50X3UgdmltX21vZGlmaWVyczsKKworICAgIC8qIFJlbW92ZSBhbnkgbW90aW9uICJtYWNoaW5lIGd1biIgdGltZXJzIHVzZWQgZm9yIGF1dG9tYXRpYyBmdXJ0aGVyCisgICAgICAgZXh0ZW5zaW9uIG9mIGFsbG9jYXRpb24gYXJlYXMgaWYgb3V0c2lkZSBvZiB0aGUgYXBwbGljYXRpb25zIHdpbmRvdworICAgICAgIGFyZWEgLiovCisgICAgaWYgKG1vdGlvbl9yZXBlYXRfdGltZXIpCisgICAgeworCWd0a190aW1lb3V0X3JlbW92ZShtb3Rpb25fcmVwZWF0X3RpbWVyKTsKKwltb3Rpb25fcmVwZWF0X3RpbWVyID0gMDsKKyAgICB9CisKKyAgICB4ID0gZXZlbnQtPng7CisgICAgeSA9IGV2ZW50LT55OworCisgICAgdmltX21vZGlmaWVycyA9IDB4MDsKKyAgICBpZiAoZXZlbnQtPnN0YXRlICYgR0RLX1NISUZUX01BU0spCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKyAgICBpZiAoZXZlbnQtPnN0YXRlICYgR0RLX0NPTlRST0xfTUFTSykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0NUUkw7CisgICAgaWYgKGV2ZW50LT5zdGF0ZSAmIEdES19NT0QxX01BU0spCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9BTFQ7CisKKyAgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9SRUxFQVNFLCB4LCB5LCBGQUxTRSwgdmltX21vZGlmaWVycyk7CisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsJLyogbWFrZSBzdXJlIGl0IHdpbGwgYmUgaGFuZGxlZCBpbW1lZGlhdGVseSAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIEZFQVRfRE5ECisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRHJhZyBhTmQgRHJvcCBzdXBwb3J0IGhhbmRsZXJzLgorICovCisKKy8qCisgKiBDb3VudCBob3cgbWFueSBpdGVtcyB0aGVyZSBtYXkgYmUgYW5kIHNlcGFyYXRlIHRoZW0gd2l0aCBhIE5VTC4KKyAqIEFwcGFyZW50bHkgdGhlIGl0ZW1zIGFyZSBzZXBhcmF0ZWQgd2l0aCBcclxuLiAgVGhpcyBpcyBub3QgZG9jdW1lbnRlZCwKKyAqIHRodXMgYmUgY2FyZWZ1bCBub3QgdG8gZ28gcGFzdCB0aGUgZW5kLglBbHNvIGFsbG93IHNlcGFyYXRpb24gd2l0aAorICogTlVMIGNoYXJhY3RlcnMuCisgKi8KKyAgICBzdGF0aWMgaW50Citjb3VudF9hbmRfZGVjb2RlX3VyaV9saXN0KGNoYXJfdSAqb3V0LCBjaGFyX3UgKnJhdywgaW50IGxlbikKK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpwID0gb3V0OworICAgIGludAkJY291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHsKKwlpZiAocmF3W2ldID09IE5VTCB8fCByYXdbaV0gPT0gJ1xuJyB8fCByYXdbaV0gPT0gJ1xyJykKKwl7CisJICAgIGlmIChwID4gb3V0ICYmIHBbLTFdICE9IE5VTCkKKwkgICAgeworCQkrK2NvdW50OworCQkqcCsrID0gTlVMOworCSAgICB9CisJfQorCWVsc2UgaWYgKHJhd1tpXSA9PSAnJScgJiYgaSArIDIgPCBsZW4gJiYgaGV4aGV4Mm5yKHJhdyArIGkgKyAxKSA+IDApCisJeworCSAgICAqcCsrID0gaGV4aGV4Mm5yKHJhdyArIGkgKyAxKTsKKwkgICAgaSArPSAyOworCX0KKwllbHNlCisJICAgICpwKysgPSByYXdbaV07CisgICAgfQorICAgIGlmIChwID4gb3V0ICYmIHBbLTFdICE9IE5VTCkKKyAgICB7CisJKnAgPSBOVUw7CS8qIGxhc3QgaXRlbSBkaWRuJ3QgaGF2ZSBcciBvciBcbiAqLworCSsrY291bnQ7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFBhcnNlIE5VTCBzZXBhcmF0ZWQgInNyYyIgc3RyaW5ncy4gIE1ha2UgaXQgYW4gYXJyYXkgIm91dGxpc3QiIGZvcm0uICBPbgorICogdGhpcyBwcm9jZXNzLCBVUkkgd2hpY2ggcHJvdG9jb2wgaXMgbm90ICJmaWxlOiIgYXJlIHJlbW92ZWQuICBSZXR1cm4KKyAqIGxlbmd0aCBvZiBhcnJheSAobGVzcyB0aGFuICJtYXgiKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbHRlcl91cmlfbGlzdChjaGFyX3UgKipvdXRsaXN0LCBpbnQgbWF4LCBjaGFyX3UgKnNyYykKK3sKKyAgICBpbnQJaSwgajsKKworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbWF4OyArK2kpCisgICAgeworCW91dGxpc3RbaV0gPSBOVUxMOworCWlmIChTVFJOQ01QKHNyYywgImZpbGU6IiwgNSkgPT0gMCkKKwl7CisJICAgIHNyYyArPSA1OworCSAgICBpZiAoU1RSTkNNUChzcmMsICIvL2xvY2FsaG9zdCIsIDExKSA9PSAwKQorCQlzcmMgKz0gMTE7CisJICAgIHdoaWxlIChzcmNbMF0gPT0gJy8nICYmIHNyY1sxXSA9PSAnLycpCisJCSsrc3JjOworCSAgICBvdXRsaXN0W2orK10gPSB2aW1fc3Ryc2F2ZShzcmMpOworCX0KKwlzcmMgKz0gU1RSTEVOKHNyYykgKyAxOworICAgIH0KKyAgICByZXR1cm4gajsKK30KKworICAgIHN0YXRpYyBjaGFyX3UgKioKK3BhcnNlX3VyaV9saXN0KGludCAqY291bnQsIGNoYXJfdSAqZGF0YSwgaW50IGxlbikKK3sKKyAgICBpbnQJICAgIG4JICAgID0gMDsKKyAgICBjaGFyX3UgICp0bXAgICAgPSBOVUxMOworICAgIGNoYXJfdSAgKiphcnJheSA9IE5VTEw7OworCisgICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBsZW4gPiAwICYmICh0bXAgPSAoY2hhcl91ICopYWxsb2MobGVuICsgMSkpICE9IE5VTEwpCisgICAgeworCW4gPSBjb3VudF9hbmRfZGVjb2RlX3VyaV9saXN0KHRtcCwgZGF0YSwgbGVuKTsKKwlpZiAobiA+IDAgJiYgKGFycmF5ID0gKGNoYXJfdSAqKilhbGxvYyhuICogc2l6ZW9mKGNoYXJfdSAqKSkpICE9IE5VTEwpCisJICAgIG4gPSBmaWx0ZXJfdXJpX2xpc3QoYXJyYXksIG4sIHRtcCk7CisgICAgfQorICAgIHZpbV9mcmVlKHRtcCk7CisgICAgKmNvdW50ID0gbjsKKyAgICByZXR1cm4gYXJyYXk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZHJhZ19oYW5kbGVfdXJpX2xpc3QoR2RrRHJhZ0NvbnRleHQJKmNvbnRleHQsCisJCSAgICAgR3RrU2VsZWN0aW9uRGF0YQkqZGF0YSwKKwkJICAgICBndWludAkJdGltZV8sCisJCSAgICAgR2RrTW9kaWZpZXJUeXBlCXN0YXRlLAorCQkgICAgIGdpbnQJCXgsCisJCSAgICAgZ2ludAkJeSkKK3sKKyAgICBjaGFyX3UgICoqZm5hbWVzOworICAgIGludAkgICAgbmZpbGVzID0gMDsKKworICAgIGZuYW1lcyA9IHBhcnNlX3VyaV9saXN0KCZuZmlsZXMsIGRhdGEtPmRhdGEsIGRhdGEtPmxlbmd0aCk7CisKKyAgICBpZiAoZm5hbWVzICE9IE5VTEwgJiYgbmZpbGVzID4gMCkKKyAgICB7CisJaW50X3UgICBtb2RpZmllcnMgPSAwOworCisJZ3RrX2RyYWdfZmluaXNoKGNvbnRleHQsIFRSVUUsIEZBTFNFLCB0aW1lXyk7IC8qIGFjY2VwdCAqLworCisJaWYgKHN0YXRlICYgR0RLX1NISUZUX01BU0spCisJICAgIG1vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKwlpZiAoc3RhdGUgJiBHREtfQ09OVFJPTF9NQVNLKQorCSAgICBtb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKwlpZiAoc3RhdGUgJiBHREtfTU9EMV9NQVNLKQorCSAgICBtb2RpZmllcnMgfD0gTU9VU0VfQUxUOworCisJZ3VpX2hhbmRsZV9kcm9wKHgsIHksIG1vZGlmaWVycywgZm5hbWVzLCBuZmlsZXMpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitkcmFnX2hhbmRsZV90ZXh0KEdka0RyYWdDb250ZXh0CSAgICAqY29udGV4dCwKKwkJIEd0a1NlbGVjdGlvbkRhdGEgICAqZGF0YSwKKwkJIGd1aW50CQkgICAgdGltZV8sCisJCSBHZGtNb2RpZmllclR5cGUgICAgc3RhdGUpCit7CisgICAgY2hhcl91ICBkcm9wa2V5WzZdID0ge0NTSSwgS1NfTU9ESUZJRVIsIDAsIENTSSwgS1NfRVhUUkEsIChjaGFyX3UpS0VfRFJPUH07CisgICAgY2hhcl91ICAqdGV4dDsKKyAgICBpbnQJICAgIGxlbjsKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdSAgKnRtcGJ1ZiA9IE5VTEw7CisjIGVuZGlmCisKKyAgICB0ZXh0ID0gZGF0YS0+ZGF0YTsKKyAgICBsZW4gID0gZGF0YS0+bGVuZ3RoOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZGF0YS0+dHlwZSA9PSB1dGY4X3N0cmluZ19hdG9tKQorICAgIHsKKyMgIGlmZGVmIEhBVkVfR1RLMgorCWlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCSAgICB0bXBidWYgPSBzdHJpbmdfY29udmVydCgmaW5wdXRfY29udiwgdGV4dCwgJmxlbik7CisjICBlbHNlCisJdmltY29udl9UIGNvbnY7CisKKwljb252LnZjX3R5cGUgPSBDT05WX05PTkU7CisJY29udmVydF9zZXR1cCgmY29udiwgKGNoYXJfdSAqKSJ1dGYtOCIsIHBfZW5jKTsKKworCWlmIChjb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgdG1wYnVmID0gc3RyaW5nX2NvbnZlcnQoJmNvbnYsIHRleHQsICZsZW4pOworCSAgICBjb252ZXJ0X3NldHVwKCZjb252LCBOVUxMLCBOVUxMKTsKKwl9CisjICBlbmRpZgorCWlmICh0bXBidWYgIT0gTlVMTCkKKwkgICAgdGV4dCA9IHRtcGJ1ZjsKKyAgICB9CisjIGVuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworICAgIGRuZF95YW5rX2RyYWdfZGF0YSh0ZXh0LCAobG9uZylsZW4pOworICAgIGd0a19kcmFnX2ZpbmlzaChjb250ZXh0LCBUUlVFLCBGQUxTRSwgdGltZV8pOyAvKiBhY2NlcHQgKi8KKyMgaWZkZWYgRkVBVF9NQllURQorICAgIHZpbV9mcmVlKHRtcGJ1Zik7CisjIGVuZGlmCisKKyAgICBpZiAoc3RhdGUgJiBHREtfU0hJRlRfTUFTSykKKwlkcm9wa2V5WzJdIHw9IE1PRF9NQVNLX1NISUZUOworICAgIGlmIChzdGF0ZSAmIEdES19DT05UUk9MX01BU0spCisJZHJvcGtleVsyXSB8PSBNT0RfTUFTS19DVFJMOworICAgIGlmIChzdGF0ZSAmIEdES19NT0QxX01BU0spCisJZHJvcGtleVsyXSB8PSBNT0RfTUFTS19BTFQ7CisKKyAgICBpZiAoZHJvcGtleVsyXSAhPSAwKQorCWFkZF90b19pbnB1dF9idWYoZHJvcGtleSwgKGludClzaXplb2YoZHJvcGtleSkpOworICAgIGVsc2UKKwlhZGRfdG9faW5wdXRfYnVmKGRyb3BrZXkgKyAzLCAoaW50KShzaXplb2YoZHJvcGtleSkgLSAzKSk7CisKKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOworfQorCisvKgorICogRE5EIHJlY2VpdmVyLgorICovCisvKkFSR1NVU0VEMiovCisgICAgc3RhdGljIHZvaWQKK2RyYWdfZGF0YV9yZWNlaXZlZF9jYihHdGtXaWRnZXQJCSp3aWRnZXQsCisJCSAgICAgIEdka0RyYWdDb250ZXh0CSpjb250ZXh0LAorCQkgICAgICBnaW50CQl4LAorCQkgICAgICBnaW50CQl5LAorCQkgICAgICBHdGtTZWxlY3Rpb25EYXRhCSpkYXRhLAorCQkgICAgICBndWludAkJaW5mbywKKwkJICAgICAgZ3VpbnQJCXRpbWVfLAorCQkgICAgICBncG9pbnRlcgkJdXNlcl9kYXRhKQoreworICAgIEdka01vZGlmaWVyVHlwZSBzdGF0ZTsKKworICAgIC8qIEd1YXJkIGFnYWluc3QgdHJhc2ggKi8KKyAgICBpZiAoZGF0YS0+ZGF0YSA9PSBOVUxMCisJICAgIHx8IGRhdGEtPmxlbmd0aCA8PSAwCisJICAgIHx8IGRhdGEtPmZvcm1hdCAhPSA4CisJICAgIHx8IGRhdGEtPmRhdGFbZGF0YS0+bGVuZ3RoXSAhPSAnXDAnKQorICAgIHsKKwlndGtfZHJhZ19maW5pc2goY29udGV4dCwgRkFMU0UsIEZBTFNFLCB0aW1lXyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBtb2RpZmllciBzdGF0ZSBmb3IgcHJvcGVyIGRpc3Rpbmd1aXNobWVudCBiZXR3ZWVuCisgICAgICogZGlmZmVyZW50IG9wZXJhdGlvbnMgbGF0ZXIuICovCisgICAgZ2RrX3dpbmRvd19nZXRfcG9pbnRlcih3aWRnZXQtPndpbmRvdywgTlVMTCwgTlVMTCwgJnN0YXRlKTsKKworICAgIC8qIE5vdCBzdXJlIGFib3V0IHRoZSByb2xlIG9mICJ0ZXh0L3BsYWluIiBoZXJlLi4uICovCisgICAgaWYgKGluZm8gPT0gKGd1aW50KVRBUkdFVF9URVhUX1VSSV9MSVNUKQorCWRyYWdfaGFuZGxlX3VyaV9saXN0KGNvbnRleHQsIGRhdGEsIHRpbWVfLCBzdGF0ZSwgeCwgeSk7CisgICAgZWxzZQorCWRyYWdfaGFuZGxlX3RleHQoY29udGV4dCwgZGF0YSwgdGltZV8sIHN0YXRlKTsKKworfQorI2VuZGlmIC8qIEZFQVRfRE5EICovCisKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR05PTUUpICYmIGRlZmluZWQoRkVBVF9TRVNTSU9OKQorLyoKKyAqIEdub21lQ2xpZW50IGludGVyYWN0IGNhbGxiYWNrLiAgQ2hlY2sgZm9yIHVuc2F2ZWQgYnVmZmVycyB0aGF0IGNhbm5vdAorICogYmUgYWJhbmRvbmVkIGFuZCBwb3AgdXAgYSBkaWFsb2cgYXNraW5nIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24gaWYKKyAqIG5lY2Vzc2FyeS4KKyAqLworLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyB2b2lkCitzbV9jbGllbnRfY2hlY2tfY2hhbmdlZF9hbnkoR25vbWVDbGllbnQJICAgICpjbGllbnQsCisJCQkgICAgZ2ludAkgICAga2V5LAorCQkJICAgIEdub21lRGlhbG9nVHlwZSB0eXBlLAorCQkJICAgIGdwb2ludGVyCSAgICBkYXRhKQoreworICAgIGNtZG1vZF9UCXNhdmVfY21kbW9kOworICAgIGdib29sZWFuCXNodXRkb3duX2NhbmNlbGxlZDsKKworICAgIHNhdmVfY21kbW9kID0gY21kbW9kOworCisjIGlmZGVmIEZFQVRfQlJPV1NFCisgICAgY21kbW9kLmJyb3dzZSA9IFRSVUU7CisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKyAgICBjbWRtb2QuY29uZmlybSA9IFRSVUU7CisjIGVuZGlmCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBhcmUgY2hhbmdlZCBidWZmZXJzLCBwcmVzZW50IHRoZSB1c2VyIHdpdGgKKyAgICAgKiBhIGRpYWxvZyBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGdpdmUgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBzaHV0ZG93bl9jYW5jZWxsZWQgPSBjaGVja19jaGFuZ2VkX2FueShGQUxTRSk7CisKKyAgICBleGl0aW5nID0gRkFMU0U7CisgICAgY21kbW9kID0gc2F2ZV9jbWRtb2Q7CisgICAgc2V0Y3Vyc29yKCk7IC8qIHBvc2l0aW9uIHRoZSBjdXJzb3IgKi8KKyAgICBvdXRfZmx1c2goKTsKKyAgICAvKgorICAgICAqIElmIHRoZSB1c2VyIGhpdCB0aGUgW0NhbmNlbF0gYnV0dG9uIHRoZSB3aG9sZSBzaHV0ZG93bgorICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkLiAgV293LCBxdWl0ZSBwb3dlcmZ1bCBmZWF0dXJlICg6CisgICAgICovCisgICAgZ25vbWVfaW50ZXJhY3Rpb25fa2V5X3JldHVybihrZXksIHNodXRkb3duX2NhbmNlbGxlZCk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIHNjcmlwdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc3RvcmUgdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLgorICogU2F2ZSB0aGUgdmFsdWUgb2Ygdjp0aGlzX3Nlc3Npb24gYmVmb3JlIHJ1bm5pbmcgOm1rc2Vzc2lvbiBpbiBvcmRlciB0byBtYWtlCisgKiBhdXRvbWFnaWMgc2Vzc2lvbiBzYXZlIGZ1bGx5IHRyYW5zcGFyZW50LiAgUmV0dXJuIFRSVUUgb24gc3VjY2Vzcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3dyaXRlX3Nlc3Npb25fZmlsZShjaGFyX3UgKmZpbGVuYW1lKQoreworICAgIGNoYXJfdQkgICAgKmVzY2FwZWRfZmlsZW5hbWU7CisgICAgY2hhcgkgICAgKm1rc2Vzc2lvbl9jbWRsaW5lOworICAgIHVuc2lnbmVkIGludCAgICBzYXZlX3Nzb3BfZmxhZ3M7CisgICAgaW50CQkgICAgZmFpbGVkOworCisgICAgLyoKKyAgICAgKiBCdWlsZCBhbiBleCBjb21tYW5kIGxpbmUgdG8gY3JlYXRlIGEgc2NyaXB0IHRoYXQgcmVzdG9yZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBzZXNzaW9uIGlmIGV4ZWN1dGVkLiAgRXNjYXBlIHRoZSBmaWxlbmFtZSB0byBhdm9pZCBuYXN0eSBzdXJwcmlzZXMuCisgICAgICovCisgICAgZXNjYXBlZF9maWxlbmFtZSA9IHZpbV9zdHJzYXZlX2VzY2FwZWQoZmlsZW5hbWUsIGVzY2FwZV9jaGFycyk7CisgICAgaWYgKGVzY2FwZWRfZmlsZW5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisgICAgbWtzZXNzaW9uX2NtZGxpbmUgPSBnX3N0cmNvbmNhdCgibWtzZXNzaW9uICIsIChjaGFyICopZXNjYXBlZF9maWxlbmFtZSwgTlVMTCk7CisgICAgdmltX2ZyZWUoZXNjYXBlZF9maWxlbmFtZSk7CisgICAgLyoKKyAgICAgKiBVc2UgYSByZWFzb25hYmxlIGhhcmRjb2RlZCBzZXQgb2YgJ3Nlc3Npb25vcHRpb25zJyBmbGFncyB0byBhdm9pZAorICAgICAqIHVucHJlZGljdGFibGUgZWZmZWN0cyB3aGVuIHRoZSBzZXNzaW9uIGlzIHNhdmVkIGF1dG9tYXRpY2FsbHkuICBBbHNvLAorICAgICAqIHdlIGRlZmluaXRlbHkgbmVlZCBTU09QX0dMT0JBTFMgdG8gYmUgYWJsZSB0byByZXN0b3JlIHY6dGhpc19zZXNzaW9uLgorICAgICAqIERvbid0IHVzZSBTU09QX0JVRkZFUlMgdG8gcHJldmVudCB0aGUgYnVmZmVyIGxpc3QgZnJvbSBiZWNvbWluZworICAgICAqIGVub3Jtb3VzbHkgbGFyZ2UgaWYgdGhlIEdOT01FIHNlc3Npb24gZmVhdHVyZSBpcyB1c2VkIHJlZ3VsYXJseS4KKyAgICAgKi8KKyAgICBzYXZlX3Nzb3BfZmxhZ3MgPSBzc29wX2ZsYWdzOworICAgIHNzb3BfZmxhZ3MgPSAoU1NPUF9CTEFOS3xTU09QX0NVUkRJUnxTU09QX0ZPTERTfFNTT1BfR0xPQkFMUworCQkgIHxTU09QX0hFTFB8U1NPUF9PUFRJT05TfFNTT1BfV0lOU0laRSk7CisKKyAgICBkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopImxldCBTYXZlX1ZWX3RoaXNfc2Vzc2lvbiA9IHY6dGhpc19zZXNzaW9uIik7CisgICAgZmFpbGVkID0gKGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKilta3Nlc3Npb25fY21kbGluZSkgPT0gRkFJTCk7CisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJsZXQgdjp0aGlzX3Nlc3Npb24gPSBTYXZlX1ZWX3RoaXNfc2Vzc2lvbiIpOworICAgIGRvX3VubGV0KChjaGFyX3UgKikiU2F2ZV9WVl90aGlzX3Nlc3Npb24iKTsKKworICAgIHNzb3BfZmxhZ3MgPSBzYXZlX3Nzb3BfZmxhZ3M7CisgICAgZ19mcmVlKG1rc2Vzc2lvbl9jbWRsaW5lKTsKKyAgICAvKgorICAgICAqIFJlb3BlbiB0aGUgZmlsZSBhbmQgYXBwZW5kIGEgY29tbWFuZCB0byByZXN0b3JlIHY6dGhpc19zZXNzaW9uLAorICAgICAqIGFzIGlmIHRoaXMgc2F2ZSBuZXZlciBoYXBwZW5lZC4JVGhpcyBpcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aAorICAgICAqIHRoZSB1c2VyJ3Mgb3duIHNlc3Npb25zLiAgRklYTUU6IEl0J3MgcHJvYmFibHkgbGVzcyBoYWNraXNoIHRvIGFkZAorICAgICAqIGEgInN0ZWFsdGgiIGZsYWcgdG8gJ3Nlc3Npb25vcHRpb25zJyAtLSBnb3R0YSBhc2sgQnJhbS4KKyAgICAgKi8KKyAgICBpZiAoIWZhaWxlZCkKKyAgICB7CisJRklMRSAqZmQ7CisKKwlmZCA9IG9wZW5fZXhmaWxlKGZpbGVuYW1lLCBUUlVFLCBBUFBFTkRCSU4pOworCisJZmFpbGVkID0gKGZkID09IE5VTEwKKwkgICAgICAgfHwgcHV0X2xpbmUoZmQsICJsZXQgdjp0aGlzX3Nlc3Npb24gPSBTYXZlX1ZWX3RoaXNfc2Vzc2lvbiIpID09IEZBSUwKKwkgICAgICAgfHwgcHV0X2xpbmUoZmQsICJ1bmxldCBTYXZlX1ZWX3RoaXNfc2Vzc2lvbiIpID09IEZBSUwpOworCisJaWYgKGZkICE9IE5VTEwgJiYgZmNsb3NlKGZkKSAhPSAwKQorCSAgICBmYWlsZWQgPSBUUlVFOworCisJaWYgKGZhaWxlZCkKKwkgICAgbWNoX3JlbW92ZShmaWxlbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuICFmYWlsZWQ7Cit9CisKKy8qCisgKiAic2F2ZV95b3Vyc2VsZiIgc2lnbmFsIGhhbmRsZXIuICBJbml0aWF0ZSBhbiBpbnRlcmFjdGlvbiB0byBhc2sgdGhlIHVzZXIKKyAqIGZvciBjb25maXJtYXRpb24gaWYgbmVjZXNzYXJ5LiAgU2F2ZSB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24gYW5kIHRlbGwKKyAqIHRoZSBzZXNzaW9uIG1hbmFnZXIgaG93IHRvIHJlc3RhcnQgVmltLgorICovCisvKkFSR1NVU0VEMSovCisgICAgc3RhdGljIGdib29sZWFuCitzbV9jbGllbnRfc2F2ZV95b3Vyc2VsZihHbm9tZUNsaWVudAkgICAgKmNsaWVudCwKKwkJCWdpbnQJCSAgICBwaGFzZSwKKwkJCUdub21lU2F2ZVN0eWxlCSAgICBzYXZlX3N0eWxlLAorCQkJZ2Jvb2xlYW4JICAgIHNodXRkb3duLAorCQkJR25vbWVJbnRlcmFjdFN0eWxlICBpbnRlcmFjdF9zdHlsZSwKKwkJCWdib29sZWFuCSAgICBmYXN0LAorCQkJZ3BvaW50ZXIJICAgIGRhdGEpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIJc3VmZml4W10gPSAiLXNlc3Npb24udmltIjsKKyAgICBjaGFyCQkqc2Vzc2lvbl9maWxlOworICAgIHVuc2lnbmVkIGludAlsZW47CisgICAgZ2Jvb2xlYW4JCXN1Y2Nlc3M7CisKKyAgICAvKiBBbHdheXMgcmVxdWVzdCBhbiBpbnRlcmFjdGlvbiBpZiBwb3NzaWJsZS4gIGNoZWNrX2NoYW5nZWRfYW55KCkKKyAgICAgKiB3b24ndCBhY3R1YWxseSBzaG93IGEgZGlhbG9nIHVubGVzcyBhbnkgYnVmZmVycyBoYXZlIGJlZW4gbW9kaWZpZWQuCisgICAgICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFuIG9idmlvdXMgd2F5IHRvIGNoZWNrIHRoYXQgd2l0aG91dAorICAgICAqIGF1dG9tYXRpY2FsbHkgZmlyaW5nIHRoZSBkaWFsb2cuICBBbnl3YXksIGl0IHdvcmtzIGp1c3QgZmluZS4gKi8KKyAgICBpZiAoaW50ZXJhY3Rfc3R5bGUgPT0gR05PTUVfSU5URVJBQ1RfQU5ZKQorCWdub21lX2NsaWVudF9yZXF1ZXN0X2ludGVyYWN0aW9uKGNsaWVudCwgR05PTUVfRElBTE9HX05PUk1BTCwKKwkJCQkJICZzbV9jbGllbnRfY2hlY2tfY2hhbmdlZF9hbnksCisJCQkJCSBOVUxMKTsKKyAgICBvdXRfZmx1c2goKTsKKyAgICBtbF9zeW5jX2FsbChGQUxTRSwgRkFMU0UpOyAvKiBwcmVzZXJ2ZSBhbGwgc3dhcCBmaWxlcyAqLworCisgICAgLyogVGhlIHBhdGggaXMgdW5pcXVlIGZvciBlYWNoIHNlc3Npb24gc2F2ZS4gIFdlIGRvIG5laXRoZXIga25vdyBub3IgY2FyZQorICAgICAqIHdoaWNoIHNlc3Npb24gc2NyaXB0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBsYXRlci4gIFRoaXMgZGVjaXNpb24gaXMgaW4KKyAgICAgKiB0aGUgZG9tYWluIG9mIHRoZSBzZXNzaW9uIG1hbmFnZXIuICovCisgICAgc2Vzc2lvbl9maWxlID0gZ25vbWVfY29uZmlnX2dldF9yZWFsX3BhdGgoCisJCQlnbm9tZV9jbGllbnRfZ2V0X2NvbmZpZ19wcmVmaXgoY2xpZW50KSk7CisgICAgbGVuID0gc3RybGVuKHNlc3Npb25fZmlsZSk7CisKKyAgICBpZiAobGVuID4gMCAmJiBzZXNzaW9uX2ZpbGVbbGVuLTFdID09IEdfRElSX1NFUEFSQVRPUikKKwktLWxlbjsgLyogZ2V0IHJpZCBvZiB0aGUgc3VwZXJmbHVvdXMgdHJhaWxpbmcgJy8nICovCisKKyAgICBzZXNzaW9uX2ZpbGUgPSBnX3JlbmV3KGNoYXIsIHNlc3Npb25fZmlsZSwgbGVuICsgc2l6ZW9mKHN1ZmZpeCkpOworICAgIG1lbWNweShzZXNzaW9uX2ZpbGUgKyBsZW4sIHN1ZmZpeCwgc2l6ZW9mKHN1ZmZpeCkpOworCisgICAgc3VjY2VzcyA9IHdyaXRlX3Nlc3Npb25fZmlsZSgoY2hhcl91ICopc2Vzc2lvbl9maWxlKTsKKworICAgIGlmIChzdWNjZXNzKQorICAgIHsKKwljb25zdCBjaGFyICAqYXJndls4XTsKKwlpbnQJICAgIGk7CisKKwkvKiBUZWxsIHRoZSBzZXNzaW9uIG1hbmFnZXIgaG93IHRvIHdpcGUgb3V0IHRoZSBzdG9yZWQgc2Vzc2lvbiBkYXRhLgorCSAqIFRoaXMgaXNuJ3QgYXMgZGFuZ2Vyb3VzIGFzIGl0IGxvb2tzLCBkb24ndCB3b3JyeSA6KQlzZXNzaW9uX2ZpbGUKKwkgKiBpcyBhIHVuaXF1ZSBhYnNvbHV0ZSBmaWxlbmFtZS4gIFVzdWFsbHkgaXQnbGwgYmUgc29tZXRoaW5nIGxpa2UKKwkgKiBgL2hvbWUvdXNlci8uZ25vbWUyL3ZpbS1YWFhYWFgtc2Vzc2lvbi52aW0nLiAqLworCWkgPSAwOworCWFyZ3ZbaSsrXSA9ICJybSI7CisJYXJndltpKytdID0gc2Vzc2lvbl9maWxlOworCWFyZ3ZbaV0gPSBOVUxMOworCisJZ25vbWVfY2xpZW50X3NldF9kaXNjYXJkX2NvbW1hbmQoY2xpZW50LCBpLCAoY2hhciAqKilhcmd2KTsKKworCS8qIFRlbGwgdGhlIHNlc3Npb24gbWFuYWdlciBob3cgdG8gcmVzdG9yZSB0aGUganVzdCBzYXZlZCBzZXNzaW9uLgorCSAqIFRoaXMgaXMgZWFzaWx5IGRvbmUgdGhhbmtzIHRvIFZpbSdzIC1TIG9wdGlvbi4gIFBhc3MgdGhlIC1mIGZsYWcKKwkgKiBzaW5jZSB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yayAtLSBpdCBtaWdodCBldmVuIGNhdXNlIGNvbmZ1c2lvbi4KKwkgKiBBbHNvIHBhc3MgdGhlIHdpbmRvdyByb2xlIHRvIGdpdmUgdGhlIFdNIHNvbWV0aGluZyB0byBtYXRjaCBvbi4KKwkgKiBUaGUgcm9sZSBpcyBzZXQgaW4gZ3VpX21jaF9vcGVuKCksIHRodXMgc2hvdWxkIF9uZXZlcl8gYmUgTlVMTC4gKi8KKwlpID0gMDsKKwlhcmd2W2krK10gPSByZXN0YXJ0X2NvbW1hbmQ7CisJYXJndltpKytdID0gIi1mIjsKKwlhcmd2W2krK10gPSAiLWciOworIyBpZmRlZiBIQVZFX0dUSzIKKwlhcmd2W2krK10gPSAiLS1yb2xlIjsKKwlhcmd2W2krK10gPSBndGtfd2luZG93X2dldF9yb2xlKEdUS19XSU5ET1coZ3VpLm1haW53aW4pKTsKKyMgZW5kaWYKKwlhcmd2W2krK10gPSAiLVMiOworCWFyZ3ZbaSsrXSA9IHNlc3Npb25fZmlsZTsKKwlhcmd2W2ldID0gTlVMTDsKKworCWdub21lX2NsaWVudF9zZXRfcmVzdGFydF9jb21tYW5kKGNsaWVudCwgaSwgKGNoYXIgKiopYXJndik7CisJZ25vbWVfY2xpZW50X3NldF9jbG9uZV9jb21tYW5kKGNsaWVudCwgMCwgTlVMTCk7CisgICAgfQorCisgICAgZ19mcmVlKHNlc3Npb25fZmlsZSk7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgd2FudHMgdXMgdG8gZGllLiAgVGhlcmUgaXNuJ3QgbXVjaCB0byBzYXZlCisgKiBoZXJlIHNpbmNlICJzYXZlX3lvdXJzZWxmIiBoYXMgYmVlbiBlbWl0dGVkIGJlZm9yZSAodW5sZXNzIHNlcmlvdXMgdHJvdWJsZQorICogaXMgaGFwcGVuaW5nKS4KKyAqLworLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyB2b2lkCitzbV9jbGllbnRfZGllKEdub21lQ2xpZW50ICpjbGllbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgLyogRG9uJ3Qgd3JpdGUgbWVzc2FnZXMgdG8gdGhlIEdVSSBhbnltb3JlICovCisgICAgZnVsbF9zY3JlZW4gPSBGQUxTRTsKKworICAgIFNUUk5DUFkoSU9idWZmLCBfKCJWaW06IFJlY2VpdmVkIFwiZGllXCIgcmVxdWVzdCBmcm9tIHNlc3Npb24gbWFuYWdlclxuIiksCisJICAgIElPU0laRSk7CisgICAgSU9idWZmW0lPU0laRSAtIDFdID0gTlVMOworICAgIHByZXNlcnZlX2V4aXQoKTsKK30KKworLyoKKyAqIENvbm5lY3Qgb3VyIHNpZ25hbCBoYW5kbGVycyB0byBiZSBub3RpZmllZCBvbiBzZXNzaW9uIHNhdmUgYW5kIHNodXRkb3duLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldHVwX3NhdmVfeW91cnNlbGYodm9pZCkKK3sKKyAgICBHbm9tZUNsaWVudCAqY2xpZW50OworCisgICAgY2xpZW50ID0gZ25vbWVfbWFzdGVyX2NsaWVudCgpOworCisgICAgaWYgKGNsaWVudCAhPSBOVUxMKQorICAgIHsKKwkvKiBNdXN0IHVzZSB0aGUgZGVwcmVjYXRlZCBndGtfc2lnbmFsX2Nvbm5lY3QoKSBmb3IgY29tcGF0aWJpbGl0eQorCSAqIHdpdGggR05PTUUgMS4gIEFycmdoLCB6b21iaWVzISAqLworCWd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGNsaWVudCksICJzYXZlX3lvdXJzZWxmIiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQygmc21fY2xpZW50X3NhdmVfeW91cnNlbGYpLCBOVUxMKTsKKwlndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChjbGllbnQpLCAiZGllIiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQygmc21fY2xpZW50X2RpZSksIE5VTEwpOworICAgIH0KK30KKworI2Vsc2UgLyogIShGRUFUX0dVSV9HTk9NRSAmJiBGRUFUX1NFU1NJT04pICovCisKKyMgaWZkZWYgVVNFX1hTTVAKKy8qCisgKiBHVEsgdGVsbHMgdXMgdGhhdCBYU01QIG5lZWRzIGF0dGVudGlvbgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgZ2Jvb2xlYW4KK2xvY2FsX3hzbXBfaGFuZGxlX3JlcXVlc3RzKHNvdXJjZSwgY29uZGl0aW9uLCBkYXRhKQorICAgIEdJT0NoYW5uZWwJCSpzb3VyY2U7CisgICAgR0lPQ29uZGl0aW9uCWNvbmRpdGlvbjsKKyAgICBncG9pbnRlcgkJZGF0YTsKK3sKKyAgICBpZiAoY29uZGl0aW9uID09IEdfSU9fSU4pCisgICAgeworCS8qIERvIHN0dWZmOyBtYXliZSBjbG9zZSBjb25uZWN0aW9uICovCisJaWYgKHhzbXBfaGFuZGxlX3JlcXVlc3RzKCkgPT0gRkFJTCkKKwkgICAgZ19pb19jaGFubmVsX3VucmVmKChHSU9DaGFubmVsICopZGF0YSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIC8qIEVycm9yICovCisgICAgZ19pb19jaGFubmVsX3VucmVmKChHSU9DaGFubmVsICopZGF0YSk7CisgICAgeHNtcF9jbG9zZSgpOworICAgIHJldHVybiBUUlVFOworfQorIyBlbmRpZiAvKiBVU0VfWFNNUCAqLworCisvKgorICogU2V0dXAgdGhlIFdNX1BST1RPQ09MUyB0byBpbmRpY2F0ZSB3ZSB3YW50IHRoZSBXTV9TQVZFX1lPVVJTRUxGIGV2ZW50LgorICogVGhpcyBpcyBhbiB1Z2x5IHVzZSBvZiBYIGZ1bmN0aW9ucy4JR1RLIGRvZXNuJ3Qgb2ZmZXIgYW4gYWx0ZXJuYXRpdmUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0dXBfc2F2ZV95b3Vyc2VsZih2b2lkKQoreworICAgIEF0b20gICAgKmV4aXN0aW5nX2F0b21zID0gTlVMTDsKKyAgICBpbnQJICAgIGNvdW50ID0gMDsKKworI2lmZGVmIFVTRV9YU01QCisgICAgaWYgKHhzbXBfaWNlZmQgIT0gLTEpCisgICAgeworCS8qCisJICogVXNlIFhTTVAgaXMgcHJlZmVyZW5jZSB0byBsZWdhY3kgV01fU0FWRV9ZT1VSU0VMRjsKKwkgKiBzZXQgdXAgR1RLIElPIG1vbml0b3IKKwkgKi8KKwlHSU9DaGFubmVsICpnX2lvID0gZ19pb19jaGFubmVsX3VuaXhfbmV3KHhzbXBfaWNlZmQpOworCisJZ19pb19hZGRfd2F0Y2goZ19pbywgR19JT19JTiB8IEdfSU9fRVJSIHwgR19JT19IVVAsCisJCQkJICBsb2NhbF94c21wX2hhbmRsZV9yZXF1ZXN0cywgKGdwb2ludGVyKWdfaW8pOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJLyogRmFsbCBiYWNrIHRvIG9sZCBtZXRob2QgKi8KKworCS8qIGZpcnN0IGdldCB0aGUgZXhpc3RpbmcgdmFsdWUgKi8KKwlpZiAoWEdldFdNUHJvdG9jb2xzKEdES19XSU5ET1dfWERJU1BMQVkoZ3VpLm1haW53aW4tPndpbmRvdyksCisJCSAgICBHREtfV0lORE9XX1hXSU5ET1coZ3VpLm1haW53aW4tPndpbmRvdyksCisJCSAgICAmZXhpc3RpbmdfYXRvbXMsICZjb3VudCkpCisJeworCSAgICBBdG9tCSpuZXdfYXRvbXM7CisJICAgIEF0b20Jc2F2ZV95b3Vyc2VsZl94YXRvbTsKKwkgICAgaW50CWk7CisKKwkgICAgc2F2ZV95b3Vyc2VsZl94YXRvbSA9IEdFVF9YX0FUT00oc2F2ZV95b3Vyc2VsZl9hdG9tKTsKKworCSAgICAvKiBjaGVjayBpZiBXTV9TQVZFX1lPVVJTRUxGIGlzbid0IHRoZXJlIHlldCAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJaWYgKGV4aXN0aW5nX2F0b21zW2ldID09IHNhdmVfeW91cnNlbGZfeGF0b20pCisJCSAgICBicmVhazsKKworCSAgICBpZiAoaSA9PSBjb3VudCkKKwkgICAgeworCQkvKiBhbGxvY2F0ZSBhbiBBdG9tcyBhcnJheSB3aGljaCBpcyBvbmUgaXRlbSBsb25nZXIgKi8KKwkJbmV3X2F0b21zID0gKEF0b20gKilhbGxvYygodW5zaWduZWQpKChjb3VudCArIDEpCisJCQkJCQkJICAgICAqIHNpemVvZihBdG9tKSkpOworCQlpZiAobmV3X2F0b21zICE9IE5VTEwpCisJCXsKKwkJICAgIG1lbWNweShuZXdfYXRvbXMsIGV4aXN0aW5nX2F0b21zLCBjb3VudCAqIHNpemVvZihBdG9tKSk7CisJCSAgICBuZXdfYXRvbXNbY291bnRdID0gc2F2ZV95b3Vyc2VsZl94YXRvbTsKKwkJICAgIFhTZXRXTVByb3RvY29scyhHREtfV0lORE9XX1hESVNQTEFZKGd1aS5tYWlud2luLT53aW5kb3cpLAorCQkJICAgIEdES19XSU5ET1dfWFdJTkRPVyhndWkubWFpbndpbi0+d2luZG93KSwKKwkJCSAgICBuZXdfYXRvbXMsIGNvdW50ICsgMSk7CisJCSAgICB2aW1fZnJlZShuZXdfYXRvbXMpOworCQl9CisJICAgIH0KKwkgICAgWEZyZWUoZXhpc3RpbmdfYXRvbXMpOworCX0KKyAgICB9Cit9CisKKyMgaWZkZWYgSEFWRV9HVEsyCisvKgorICogSW5zdGFsbGluZyBhIGdsb2JhbCBldmVudCBmaWx0ZXIgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGNhdGNoCisgKiBjbGllbnQgbWVzc2FnZXMgb2YgdHlwZSBXTV9QUk9UT0NPTFMgd2l0aG91dCBvdmVycmlkaW5nIEdESydzIG93bgorICogY2xpZW50IG1lc3NhZ2UgZXZlbnQgZmlsdGVyLiAgV2VsbCwgdGhhdCdzIHN0aWxsIGJldHRlciB0aGFuIHRyeWluZworICogdG8gZ3Vlc3Mgd2hhdCB0aGUgR0RLIGZpbHRlciBoYWQgZG9uZSBpZiBpdCBoYWQgYmVlbiBpbnZva2VkIGluc3RlYWQKKyAqIChUaGlzIGlzIHdoYXQgd2UgZGlkIGZvciBHVEsrIDEuMiwgc2VlIGJlbG93KS4KKyAqCisgKiBHVEsyX0ZJWE1FOglUaGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiAgRm9yIHNvbWUgcmVhc29uIHdlIG5ldmVyCisgKiByZWNlaXZlIFdNX1NBVkVfWU9VUlNFTEYgZXZlbiB0aG91Z2ggZXZlcnl0aGluZyBpcyBzZXQgdXAgY29ycmVjdGx5LgorICogSSBoYXZlIHRoZSBuYXN0eSBmZWVsaW5nIG1vZGVybiBzZXNzaW9uIG1hbmFnZXJzIGp1c3QgZG9uJ3Qgc2VuZCB0aGlzCisgKiBkZXByZWNhdGVkIG1lc3NhZ2UgYW55bW9yZS4JQWRkaXRpb246IGNvbmZpcm1lZCBieSBzZXZlcmFsIHBlb3BsZS4KKyAqCisgKiBUaGUgR05PTUUgc2Vzc2lvbiBzdXBwb3J0IGlzIG11Y2ggY29vbGVyIGFueXdheS4gIFVubGlrZSB0aGlzIHVnbHkKKyAqIFdNX1NBVkVfWU9VUlNFTEYgaGFjayBpdCBhY3R1YWxseSBzdG9yZXMgdGhlIHNlc3Npb24uLi4gIEFuZCB5ZXMsCisgKiBpdCBzaG91bGQgd29yayB3aXRoIEtERSBhcyB3ZWxsLgorICovCisvKkFSR1NVU0VEMSovCisgICAgc3RhdGljIEdka0ZpbHRlclJldHVybgorZ2xvYmFsX2V2ZW50X2ZpbHRlcihHZGtYRXZlbnQgKnhldiwgR2RrRXZlbnQgKmV2ZW50LCBncG9pbnRlciBkYXRhKQoreworICAgIFhFdmVudCAqeGV2ZW50ID0gKFhFdmVudCAqKXhldjsKKworICAgIGlmICh4ZXZlbnQgIT0gTlVMTAorCSAgICAmJiB4ZXZlbnQtPnR5cGUgPT0gQ2xpZW50TWVzc2FnZQorCSAgICAmJiB4ZXZlbnQtPnhjbGllbnQubWVzc2FnZV90eXBlID09IEdFVF9YX0FUT00od21fcHJvdG9jb2xzX2F0b20pCisJICAgICYmIHhldmVudC0+eGNsaWVudC5kYXRhLmxbMF0gPT0gR0VUX1hfQVRPTShzYXZlX3lvdXJzZWxmX2F0b20pKQorICAgIHsKKwlvdXRfZmx1c2goKTsKKwltbF9zeW5jX2FsbChGQUxTRSwgRkFMU0UpOyAvKiBwcmVzZXJ2ZSBhbGwgc3dhcCBmaWxlcyAqLworCS8qCisJICogU2V0IHRoZSB3aW5kb3cncyBXTV9DT01NQU5EIHByb3BlcnR5LCB0byBsZXQgdGhlIHdpbmRvdyBtYW5hZ2VyCisJICoga25vdyB3ZSBhcmUgZG9uZSBzYXZpbmcgb3Vyc2VsdmVzLiAgV2UgZG9uJ3Qgd2FudCB0byBiZQorCSAqIHJlc3RhcnRlZCwgdGh1cyBzZXQgYXJndiB0byBOVUxMLgorCSAqLworCVhTZXRDb21tYW5kKEdES19XSU5ET1dfWERJU1BMQVkoZ3VpLm1haW53aW4tPndpbmRvdyksCisJCSAgICBHREtfV0lORE9XX1hXSU5ET1coZ3VpLm1haW53aW4tPndpbmRvdyksCisJCSAgICBOVUxMLCAwKTsKKwlyZXR1cm4gR0RLX0ZJTFRFUl9SRU1PVkU7CisgICAgfQorCisgICAgcmV0dXJuIEdES19GSUxURVJfQ09OVElOVUU7Cit9CisKKyMgZWxzZSAvKiAhSEFWRV9HVEsyICovCisKKy8qCisgKiBHREsgaGFuZGxlciBmb3IgWCBDbGllbnRNZXNzYWdlIGV2ZW50cy4KKyAqLworLypBUkdTVVNFRDIqLworICAgIHN0YXRpYyBHZGtGaWx0ZXJSZXR1cm4KK2dka193bV9wcm90b2NvbHNfZmlsdGVyKEdka1hFdmVudCAqeGV2LCBHZGtFdmVudCAqZXZlbnQsIGdwb2ludGVyIGRhdGEpCit7CisgICAgLyogRnJvbSBleGFtcGxlIGluIGdka2V2ZW50cy5jL2dka193bV9wcm90b2NvbHNfZmlsdGVyICovCisgICAgWEV2ZW50ICp4ZXZlbnQgPSAoWEV2ZW50ICopeGV2OworCisgICAgaWYgKHhldmVudCAhPSBOVUxMKQorICAgIHsKKwlpZiAoeGV2ZW50LT54Y2xpZW50LmRhdGEubFswXSA9PSBHRVRfWF9BVE9NKHNhdmVfeW91cnNlbGZfYXRvbSkpCisJeworCSAgICBvdXRfZmx1c2goKTsKKwkgICAgbWxfc3luY19hbGwoRkFMU0UsIEZBTFNFKTsJICAgIC8qIHByZXNlcnZlIGFsbCBzd2FwIGZpbGVzICovCisKKwkgICAgLyogU2V0IHRoZSB3aW5kb3cncyBXTV9DT01NQU5EIHByb3BlcnR5LCB0byBsZXQgdGhlIHdpbmRvdyBtYW5hZ2VyCisJICAgICAqIGtub3cgd2UgYXJlIGRvbmUgc2F2aW5nIG91cnNlbHZlcy4gIFdlIGRvbid0IHdhbnQgdG8gYmUKKwkgICAgICogcmVzdGFydGVkLCB0aHVzIHNldCBhcmd2IHRvIE5VTEwuICovCisJICAgIFhTZXRDb21tYW5kKEdES19XSU5ET1dfWERJU1BMQVkoZ3VpLm1haW53aW4tPndpbmRvdyksCisJCQlHREtfV0lORE9XX1hXSU5ET1coZ3VpLm1haW53aW4tPndpbmRvdyksCisJCQlOVUxMLCAwKTsKKwl9CisJLyoKKwkgKiBGdW5jdGlvbmFsaXR5IGZyb20gZ2RrZXZlbnRzLmMvZ2RrX3dtX3Byb3RvY29sc19maWx0ZXI7CisJICogUmVnaXN0ZXJpbmcgdGhpcyBmaWx0ZXIgYXBwYXJlbnRseSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgR0RLIG9uZSwKKwkgKiBzbyB3ZSBuZWVkIHRvIHBlcmZvcm0gaXRzIGZ1bmN0aW9uYWxpdHkuICBUaGVyZSBzZWVtcyBubyB3YXkgdG8KKwkgKiByZWdpc3RlciBmb3IgV01fUFJPVE9DT0xTLCBhbmQgb25seSBwcm9jZXNzIHRoZSBXTV9TQVZFX1lPVVJTRUxGCisJICogYml0OyBpdCdzIGFsbCBvciBub3RoaW5nLiAgVXBkYXRlOiBObywgdGhlcmUgaXMgYSB3YXkgLS0gYnV0IGl0CisJICogb25seSB3b3JrcyB3aXRoIEdUSysgMiBhcHBhcmVudGx5LiAgU2VlIGFib3ZlLgorCSAqLworCWVsc2UgaWYgKHhldmVudC0+eGNsaWVudC5kYXRhLmxbMF0gPT0gR0VUX1hfQVRPTShnZGtfd21fZGVsZXRlX3dpbmRvdykpCisJeworCSAgICBldmVudC0+YW55LnR5cGUgPSBHREtfREVMRVRFOworCSAgICByZXR1cm4gR0RLX0ZJTFRFUl9UUkFOU0xBVEU7CisJfQorICAgIH0KKworICAgIHJldHVybiBHREtfRklMVEVSX1JFTU9WRTsKK30KKyMgZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCisjZW5kaWYgLyogIShGRUFUX0dVSV9HTk9NRSAmJiBGRUFUX1NFU1NJT04pICovCisKKworLyoKKyAqIFNldHVwIHRoZSB3aW5kb3cgaWNvbiAmIHhjbWRzcnYgY29tbSBhZnRlciB0aGUgbWFpbiB3aW5kb3cgaGFzIGJlZW4gcmVhbGl6ZWQuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCittYWlud2luX3JlYWxpemUoR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIGRhdGEpCit7CisvKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgaGVyZSwgeW91IHN0aWxsIG5lZWQgdG8gdW5wYWNrIHRoZSBydW50aW1lCisgKiBhcmNoaXZlISAqLworI2lmZGVmIG1hZ2ljaworIyB1bmRlZiBtYWdpY2sKKyNlbmRpZgorI2lmZGVmIEhBVkVfR1RLMgorICAvKiBBIGJpdCBoYWNraXNoLCBidXQgYXZvaWRzIGNhc3RpbmcgbGF0ZXIgYW5kIGFsbG93cyBvcHRpbWl6YXRpb24gKi8KKyMgZGVmaW5lIHN0YXRpYyBzdGF0aWMgY29uc3QKKyNlbmRpZgorI2RlZmluZSBtYWdpY2sgdmltMzJ4MzIKKyNpbmNsdWRlICIuLi9ydW50aW1lL3ZpbTMyeDMyLnhwbSIKKyN1bmRlZiBtYWdpY2sKKyNkZWZpbmUgbWFnaWNrIHZpbTE2eDE2CisjaW5jbHVkZSAiLi4vcnVudGltZS92aW0xNngxNi54cG0iCisjdW5kZWYgbWFnaWNrCisjZGVmaW5lIG1hZ2ljayB2aW00OHg0OAorI2luY2x1ZGUgIi4uL3J1bnRpbWUvdmltNDh4NDgueHBtIgorI3VuZGVmIG1hZ2ljaworI2lmZGVmIEhBVkVfR1RLMgorIyB1bmRlZiBzdGF0aWMKKyNlbmRpZgorCisgICAgLyogV2hlbiBzdGFydGVkIHdpdGggIi0tZWNoby13aWQiIGFyZ3VtZW50LCB3cml0ZSB3aW5kb3cgSUQgb24gc3Rkb3V0LiAqLworICAgIGlmIChlY2hvX3dpZF9hcmcpCisgICAgeworCXByaW50ZigiV0lEOiAlbGRcbiIsIChsb25nKUdES19XSU5ET1dfWFdJTkRPVyhndWkubWFpbndpbi0+d2luZG93KSk7CisJZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgaWYgKHZpbV9zdHJjaHIocF9nbywgR09fSUNPTikgIT0gTlVMTCkKKyAgICB7CisJLyoKKwkgKiBBZGQgYW4gaWNvbiB0byB0aGUgbWFpbiB3aW5kb3cuIEZvciBmdW4gYW5kIGNvbnZlbmllbmNlIG9mIHRoZSB1c2VyLgorCSAqLworI2lmZGVmIEhBVkVfR1RLMgorCUdMaXN0ICppY29ucyA9IE5VTEw7CisKKwlpY29ucyA9IGdfbGlzdF9wcmVwZW5kKGljb25zLCBnZGtfcGl4YnVmX25ld19mcm9tX3hwbV9kYXRhKHZpbTE2eDE2KSk7CisJaWNvbnMgPSBnX2xpc3RfcHJlcGVuZChpY29ucywgZ2RrX3BpeGJ1Zl9uZXdfZnJvbV94cG1fZGF0YSh2aW0zMngzMikpOworCWljb25zID0gZ19saXN0X3ByZXBlbmQoaWNvbnMsIGdka19waXhidWZfbmV3X2Zyb21feHBtX2RhdGEodmltNDh4NDgpKTsKKworCWd0a193aW5kb3dfc2V0X2ljb25fbGlzdChHVEtfV0lORE9XKGd1aS5tYWlud2luKSwgaWNvbnMpOworCisJZ19saXN0X2ZvcmVhY2goaWNvbnMsIChHRnVuYykmZ19vYmplY3RfdW5yZWYsIE5VTEwpOworCWdfbGlzdF9mcmVlKGljb25zKTsKKworI2Vsc2UgLyogIUhBVkVfR1RLMiAqLworCisJR2RrUGl4bWFwICAgKmljb247CisJR2RrQml0bWFwICAgKmljb25fbWFzayA9IE5VTEw7CisJY2hhcgkgICAgKiptYWdpY2sgPSB2aW0zMngzMjsKKwlEaXNwbGF5CSAgICAqeGRpc3BsYXk7CisJV2luZG93CSAgICByb290X3dpbmRvdzsKKwlYSWNvblNpemUgICAqc2l6ZTsKKwlpbnQJICAgIG51bWJlcl9zaXplczsKKwkvKgorCSAqIEFkanVzdCB0aGUgaWNvbiB0byB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGFjdHVhbCB3aW5kb3cgbWFuYWdlci4KKwkgKiBUaGlzIGlzIG9uY2UgYWdhaW4gYSB3b3JrYXJvdW5kIGZvciBhIGRlZmZpY2llbmN5IGluIEdUSysgMS4yLgorCSAqLworCXhkaXNwbGF5ID0gR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KTsKKwlyb290X3dpbmRvdyA9IFhSb290V2luZG93KHhkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKHhkaXNwbGF5KSk7CisJaWYgKFhHZXRJY29uU2l6ZXMoeGRpc3BsYXksIHJvb3Rfd2luZG93LCAmc2l6ZSwgJm51bWJlcl9zaXplcykpCisJeworCSAgICBpZiAobnVtYmVyX3NpemVzID4gMCkKKwkgICAgeworCQlpZiAoc2l6ZS0+bWF4X2hlaWdodCA+PSA0OCAmJiBzaXplLT5tYXhfaGVpZ2h0ID49IDQ4KQorCQkgICAgbWFnaWNrID0gdmltNDh4NDg7CisJCWVsc2UgaWYgKHNpemUtPm1heF9oZWlnaHQgPj0gMzIgJiYgc2l6ZS0+bWF4X2hlaWdodCA+PSAzMikKKwkJICAgIG1hZ2ljayA9IHZpbTMyeDMyOworCQllbHNlIGlmIChzaXplLT5tYXhfaGVpZ2h0ID49IDE2ICYmIHNpemUtPm1heF9oZWlnaHQgPj0gMTYpCisJCSAgICBtYWdpY2sgPSB2aW0xNngxNjsKKwkgICAgfQorCSAgICBYRnJlZShzaXplKTsKKwl9CisJaWNvbiA9IGdka19waXhtYXBfY3JlYXRlX2Zyb21feHBtX2QoZ3VpLm1haW53aW4tPndpbmRvdywKKwkJCQkJICAgICZpY29uX21hc2ssIE5VTEwsIG1hZ2ljayk7CisJaWYgKGljb24gIT0gTlVMTCkKKwkgICAgLyogTm90ZTogZm9yIHNvbWUgcmVhc29uIGdka193aW5kb3dfc2V0X2ljb24oKSBkb2Vzbid0IGFjcXVpcmUKKwkgICAgICogYSByZWZlcmVuY2Ugb24gdGhlIHBpeG1hcCwgdGh1cyB3ZSBfaGF2ZV8gdG8gbGVhayBpdC4gKi8KKwkgICAgZ2RrX3dpbmRvd19zZXRfaWNvbihndWkubWFpbndpbi0+d2luZG93LCBOVUxMLCBpY29uLCBpY29uX21hc2spOworCisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworICAgIH0KKworI2lmICEoZGVmaW5lZChGRUFUX0dVSV9HTk9NRSkgJiYgZGVmaW5lZChGRUFUX1NFU1NJT04pKQorICAgIC8qIFJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgV01fU0FWRV9ZT1VSU0VMRiB3aXRoIEdESydzIGxvdy1sZXZlbCBYIEkvRiAqLworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICBnZGtfd2luZG93X2FkZF9maWx0ZXIoTlVMTCwgJmdsb2JhbF9ldmVudF9maWx0ZXIsIE5VTEwpOworIyBlbHNlCisgICAgZ2RrX2FkZF9jbGllbnRfbWVzc2FnZV9maWx0ZXIod21fcHJvdG9jb2xzX2F0b20sCisJCQkJICAmZ2RrX3dtX3Byb3RvY29sc19maWx0ZXIsIE5VTEwpOworIyBlbmRpZgorI2VuZGlmCisgICAgLyogU2V0dXAgdG8gaW5kaWNhdGUgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyIHRoYXQgd2Ugd2FudCB0byBjYXRjaCB0aGUKKyAgICAgKiBXTV9TQVZFX1lPVVJTRUxGIGV2ZW50LglGb3IgR05PTUUsIHRoaXMgY29ubmVjdHMgdG8gdGhlIHNlc3Npb24KKyAgICAgKiBtYW5hZ2VyIGluc3RlYWQuICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9HTk9NRSkgJiYgZGVmaW5lZChGRUFUX1NFU1NJT04pCisgICAgaWYgKHVzaW5nX2dub21lKQorI2VuZGlmCisJc2V0dXBfc2F2ZV95b3Vyc2VsZigpOworCisjaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKKyAgICBpZiAoc2VydmVyTmFtZSA9PSBOVUxMICYmIHNlcnZlckRlbGF5ZWRTdGFydE5hbWUgIT0gTlVMTCkKKyAgICB7CisJLyogVGhpcyBpcyBhIDpndWkgY29tbWFuZCBpbiBhIHBsYWluIHZpbSB3aXRoIG5vIHByZXZpb3VzIHNlcnZlciAqLworCWNvbW1XaW5kb3cgPSBHREtfV0lORE9XX1hXSU5ET1coZ3VpLm1haW53aW4tPndpbmRvdyk7CisKKwkodm9pZClzZXJ2ZXJSZWdpc3Rlck5hbWUoR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KSwKKwkJCQkgc2VydmVyRGVsYXllZFN0YXJ0TmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBDYW5ub3QgaGFuZGxlICJYTGliLW9ubHkiIHdpbmRvd3Mgd2l0aCBndGsgZXZlbnQgcm91dGluZXMsIHdlJ2xsCisJICogaGF2ZSB0byBjaGFuZ2UgdGhlICJzZXJ2ZXIiIHJlZ2lzdHJhdGlvbiB0byB0aGF0IG9mIHRoZSBtYWluIHdpbmRvdworCSAqIElmIHdlIGhhdmUgbm90IHJlZ2lzdGVyZWQgYSBuYW1lIHlldCwgcmVtZW1iZXIgdGhlIHdpbmRvdworCSAqLworCXNlcnZlckNoYW5nZVJlZ2lzdGVyZWRXaW5kb3coR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KSwKKwkJCQkgICAgIEdES19XSU5ET1dfWFdJTkRPVyhndWkubWFpbndpbi0+d2luZG93KSk7CisgICAgfQorICAgIGd0a193aWRnZXRfYWRkX2V2ZW50cyhndWkubWFpbndpbiwgR0RLX1BST1BFUlRZX0NIQU5HRV9NQVNLKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkubWFpbndpbiksICJwcm9wZXJ0eV9ub3RpZnlfZXZlbnQiLAorCQkgICAgICAgR1RLX1NJR05BTF9GVU5DKHByb3BlcnR5X2V2ZW50KSwgTlVMTCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyBHZGtDdXJzb3IgKgorY3JlYXRlX2JsYW5rX3BvaW50ZXIodm9pZCkKK3sKKyAgICBHZGtXaW5kb3cJKnJvb3Rfd2luZG93ID0gTlVMTDsKKyAgICBHZGtQaXhtYXAJKmJsYW5rX21hc2s7CisgICAgR2RrQ3Vyc29yCSpjdXJzb3I7CisgICAgR2RrQ29sb3IJY29sb3IgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBjaGFyCWJsYW5rX2RhdGFbXSA9IHsgMHgwIH07CisKKyNpZmRlZiBIQVZFX0dUS19NVUxUSUhFQUQKKyAgICByb290X3dpbmRvdyA9IGd0a193aWRnZXRfZ2V0X3Jvb3Rfd2luZG93KGd1aS5tYWlud2luKTsKKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIGEgcHNldWRvIGJsYW5rIHBvaW50ZXIsIHdoaWNoIGlzIGluIGZhY3Qgb25lIHBpeGVsIGJ5IG9uZSBwaXhlbAorICAgICAqIGluIHNpemUuICovCisgICAgYmxhbmtfbWFzayA9IGdka19iaXRtYXBfY3JlYXRlX2Zyb21fZGF0YShyb290X3dpbmRvdywgYmxhbmtfZGF0YSwgMSwgMSk7CisgICAgY3Vyc29yID0gZ2RrX2N1cnNvcl9uZXdfZnJvbV9waXhtYXAoYmxhbmtfbWFzaywgYmxhbmtfbWFzaywKKwkJCQkJJmNvbG9yLCAmY29sb3IsIDAsIDApOworICAgIGdka19iaXRtYXBfdW5yZWYoYmxhbmtfbWFzayk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCisjaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisvKkFSR1NVU0VEMSovCisgICAgc3RhdGljIHZvaWQKK21haW53aW5fc2NyZWVuX2NoYW5nZWRfY2IoR3RrV2lkZ2V0ICAqd2lkZ2V0LAorCQkJICBHZGtTY3JlZW4gICpwcmV2aW91c19zY3JlZW4sCisJCQkgIGdwb2ludGVyICAgZGF0YSkKK3sKKyAgICBpZiAoIWd0a193aWRnZXRfaGFzX3NjcmVlbih3aWRnZXQpKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogUmVjcmVhdGUgdGhlIGludmlzYmxlIG1vdXNlIGN1cnNvci4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLmJsYW5rX3BvaW50ZXIgIT0gTlVMTCkKKwlnZGtfY3Vyc29yX3VucmVmKGd1aS5ibGFua19wb2ludGVyKTsKKworICAgIGd1aS5ibGFua19wb2ludGVyID0gY3JlYXRlX2JsYW5rX3BvaW50ZXIoKTsKKworICAgIGlmIChndWkucG9pbnRlcl9oaWRkZW4gJiYgZ3VpLmRyYXdhcmVhLT53aW5kb3cgIT0gTlVMTCkKKwlnZGtfd2luZG93X3NldF9jdXJzb3IoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS5ibGFua19wb2ludGVyKTsKKworICAgIC8qCisgICAgICogQ3JlYXRlIGEgbmV3IFBhbmdvQ29udGV4dCBmb3IgdGhpcyBzY3JlZW4sIGFuZCBpbml0aWFsaXplIGl0CisgICAgICogd2l0aCB0aGUgY3VycmVudCBmb250IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLnRleHRfY29udGV4dCAhPSBOVUxMKQorCWdfb2JqZWN0X3VucmVmKGd1aS50ZXh0X2NvbnRleHQpOworCisgICAgZ3VpLnRleHRfY29udGV4dCA9IGd0a193aWRnZXRfY3JlYXRlX3BhbmdvX2NvbnRleHQod2lkZ2V0KTsKKyAgICBwYW5nb19jb250ZXh0X3NldF9iYXNlX2RpcihndWkudGV4dF9jb250ZXh0LCBQQU5HT19ESVJFQ1RJT05fTFRSKTsKKworICAgIGlmIChndWkubm9ybV9mb250ICE9IE5VTEwpCisgICAgeworCWd1aV9tY2hfaW5pdF9mb250KHBfZ3VpZm9udCwgMCk7CisJZ3VpX3NldF9zaGVsbHNpemUoRkFMU0UsIEZBTFNFKTsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9HVEtfTVVMVElIRUFEICovCisKKy8qCisgKiBBZnRlciB0aGUgZHJhd2luZyBhcmVhIGNvbWVzIHVwLCB3ZSBjYWxjdWxhdGUgYWxsIGNvbG9ycyBhbmQgY3JlYXRlIHRoZQorICogZHVtbXkgYmxhbmsgY3Vyc29yLgorICoKKyAqIERvbid0IHRyeSB0byBzZXQgYW55IFZJTSBzY3JvbGxiYXIgc2l6ZXMgYW55d2hlcmUgaGVyZS4gSSdtIHJlbHlpbmcgb24gdGhlCisgKiBmYWN0IHRoYXQgdGhlIG1haW4gVklNIGVuZ2luZSBkb2Vzbid0IHRha2UgdGhlbSBpbnRvIGFjY291bnQgYW55d2hlcmUuCisgKi8KKy8qQVJHU1VTRUQxKi8KKyAgICBzdGF0aWMgdm9pZAorZHJhd2FyZWFfcmVhbGl6ZV9jYihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBHdGtXaWRnZXQgKnNiYXI7CisKKyNpZmRlZiBGRUFUX1hJTQorICAgIHhpbV9pbml0KCk7CisjZW5kaWYKKyAgICBndWlfbWNoX25ld19jb2xvcnMoKTsKKyAgICBndWkudGV4dF9nYyA9IGdka19nY19uZXcoZ3VpLmRyYXdhcmVhLT53aW5kb3cpOworCisgICAgZ3VpLmJsYW5rX3BvaW50ZXIgPSBjcmVhdGVfYmxhbmtfcG9pbnRlcigpOworICAgIGlmIChndWkucG9pbnRlcl9oaWRkZW4pCisJZ2RrX3dpbmRvd19zZXRfY3Vyc29yKHdpZGdldC0+d2luZG93LCBndWkuYmxhbmtfcG9pbnRlcik7CisKKyAgICAvKiBnZXQgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzY3JvbGxiYXJzLCBpZiB0aGV5IGFyZSByZWFsaXplZCAqLworICAgIHNiYXIgPSBmaXJzdHdpbi0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uaWQ7CisgICAgaWYgKCFzYmFyIHx8ICghZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXQorCQkJCSAgICAmJiBmaXJzdHdpbi0+d19zY3JvbGxiYXJzW1NCQVJfUklHSFRdLmlkKSkKKwlzYmFyID0gZmlyc3R3aW4tPndfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXS5pZDsKKyAgICBpZiAoc2JhciAmJiBHVEtfV0lER0VUX1JFQUxJWkVEKHNiYXIpICYmIHNiYXItPmFsbG9jYXRpb24ud2lkdGgpCisJZ3VpLnNjcm9sbGJhcl93aWR0aCA9IHNiYXItPmFsbG9jYXRpb24ud2lkdGg7CisKKyAgICBzYmFyID0gZ3VpLmJvdHRvbV9zYmFyLmlkOworICAgIGlmIChzYmFyICYmIEdUS19XSURHRVRfUkVBTElaRUQoc2JhcikgJiYgc2Jhci0+YWxsb2NhdGlvbi5oZWlnaHQpCisJZ3VpLnNjcm9sbGJhcl9oZWlnaHQgPSBzYmFyLT5hbGxvY2F0aW9uLmhlaWdodDsKK30KKworLyoKKyAqIFByb3Blcmx5IGNsZWFuIHVwIG9uIHNodXRkb3duLgorICovCisvKkFSR1NVU0VEMCovCisgICAgc3RhdGljIHZvaWQKK2RyYXdhcmVhX3VucmVhbGl6ZV9jYihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICAvKiBEb24ndCB3cml0ZSBtZXNzYWdlcyB0byB0aGUgR1VJIGFueW1vcmUgKi8KKyAgICBmdWxsX3NjcmVlbiA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9YSU0KKyAgICBpbV9zaHV0ZG93bigpOworI2VuZGlmCisjaWZkZWYgSEFWRV9HVEsyCisgICAgaWYgKGd1aS5hc2NpaV9nbHlwaHMgIT0gTlVMTCkKKyAgICB7CisJcGFuZ29fZ2x5cGhfc3RyaW5nX2ZyZWUoZ3VpLmFzY2lpX2dseXBocyk7CisJZ3VpLmFzY2lpX2dseXBocyA9IE5VTEw7CisgICAgfQorICAgIGlmIChndWkuYXNjaWlfZm9udCAhPSBOVUxMKQorICAgIHsKKwlnX29iamVjdF91bnJlZihndWkuYXNjaWlfZm9udCk7CisJZ3VpLmFzY2lpX2ZvbnQgPSBOVUxMOworICAgIH0KKyAgICBnX29iamVjdF91bnJlZihndWkudGV4dF9jb250ZXh0KTsKKyAgICBndWkudGV4dF9jb250ZXh0ID0gTlVMTDsKKworICAgIGdfb2JqZWN0X3VucmVmKGd1aS50ZXh0X2djKTsKKyAgICBndWkudGV4dF9nYyA9IE5VTEw7CisKKyAgICBnZGtfY3Vyc29yX3VucmVmKGd1aS5ibGFua19wb2ludGVyKTsKKyAgICBndWkuYmxhbmtfcG9pbnRlciA9IE5VTEw7CisjZWxzZQorICAgIGdka19nY191bnJlZihndWkudGV4dF9nYyk7CisgICAgZ3VpLnRleHRfZ2MgPSBOVUxMOworCisgICAgZ2RrX2N1cnNvcl9kZXN0cm95KGd1aS5ibGFua19wb2ludGVyKTsKKyAgICBndWkuYmxhbmtfcG9pbnRlciA9IE5VTEw7CisjZW5kaWYKK30KKworLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyB2b2lkCitkcmF3YXJlYV9zdHlsZV9zZXRfY2IoR3RrV2lkZ2V0CSp3aWRnZXQsCisJCSAgICAgIEd0a1N0eWxlCSpwcmV2aW91c19zdHlsZSwKKwkJICAgICAgZ3BvaW50ZXIJZGF0YSkKK3sKKyAgICBndWlfbWNoX25ld19jb2xvcnMoKTsKK30KKworLyoKKyAqIENhbGxiYWNrIHJvdXRpbmUgZm9yIHRoZSAiZGVsZXRlX2V2ZW50IiBzaWduYWwgb24gdGhlIHRvcGxldmVsIHdpbmRvdy4KKyAqIFRyaWVzIHRvIHZpbSBncmFjZWZ1bGx5LCBvciByZWZ1c2VzIHRvIGV4aXQgd2l0aCBjaGFuZ2VkIGJ1ZmZlcnMuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBnaW50CitkZWxldGVfZXZlbnRfY2IoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50QW55ICpldmVudCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBndWlfc2hlbGxfY2xvc2VkKCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKworIyBpZmRlZiBIQVZFX0dUSzIKKy8qCisgKiBUaGlzIGV4dHJhIGVmZm9ydCB3b3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYgd2Ugb25seSB1c2VkIHN0b2NrIGljb25zIGluIHRoZQorICogdG9vbGJhciwgYXMgd2UgZG8gZm9yIGFsbCBidWlsdGluIGljb25zLiAgQnV0IHVzZXItZGVmaW5lZCB0b29sYmFyIGljb25zCisgKiBzaG91bGRuJ3QgYmUgdHJlYXRlZCBkaWZmZXJlbnRseSwgdGh1cyB3ZSBkbyBuZWVkIHRoaXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraWNvbl9zaXplX2NoYW5nZWRfZm9yZWFjaChHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICAgIGlmIChHVEtfSVNfSU1BR0Uod2lkZ2V0KSkKKyAgICB7CisJR3RrSW1hZ2UgKmltYWdlID0gKEd0a0ltYWdlICopd2lkZ2V0OworCisJLyogVXNlci1kZWZpbmVkIGljb25zIGFyZSBzdG9yZWQgaW4gYSBHdGtJY29uU2V0ICovCisJaWYgKGd0a19pbWFnZV9nZXRfc3RvcmFnZV90eXBlKGltYWdlKSA9PSBHVEtfSU1BR0VfSUNPTl9TRVQpCisJeworCSAgICBHdGtJY29uU2V0CSppY29uX3NldDsKKwkgICAgR3RrSWNvblNpemUJaWNvbl9zaXplOworCisJICAgIGd0a19pbWFnZV9nZXRfaWNvbl9zZXQoaW1hZ2UsICZpY29uX3NldCwgJmljb25fc2l6ZSk7CisJICAgIGljb25fc2l6ZSA9IChHdGtJY29uU2l6ZSkobG9uZyl1c2VyX2RhdGE7CisKKwkgICAgZ3RrX2ljb25fc2V0X3JlZihpY29uX3NldCk7CisJICAgIGd0a19pbWFnZV9zZXRfZnJvbV9pY29uX3NldChpbWFnZSwgaWNvbl9zZXQsIGljb25fc2l6ZSk7CisJICAgIGd0a19pY29uX3NldF91bnJlZihpY29uX3NldCk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChHVEtfSVNfQ09OVEFJTkVSKHdpZGdldCkpCisgICAgeworCWd0a19jb250YWluZXJfZm9yZWFjaCgoR3RrQ29udGFpbmVyICopd2lkZ2V0LAorCQkJICAgICAgJmljb25fc2l6ZV9jaGFuZ2VkX2ZvcmVhY2gsCisJCQkgICAgICB1c2VyX2RhdGEpOworICAgIH0KK30KKyMgZW5kaWYgLyogSEFWRV9HVEsyICovCisKKyAgICBzdGF0aWMgdm9pZAorc2V0X3Rvb2xiYXJfc3R5bGUoR3RrVG9vbGJhciAqdG9vbGJhcikKK3sKKyAgICBHdGtUb29sYmFyU3R5bGUgc3R5bGU7CisjIGlmZGVmIEhBVkVfR1RLMgorICAgIEd0a0ljb25TaXplCSAgICBzaXplOworICAgIEd0a0ljb25TaXplCSAgICBvbGRzaXplOworIyBlbmRpZgorCisjIGlmZGVmIEhBVkVfR1RLMgorICAgIGlmICgodG9vbGJhcl9mbGFncyAmIChUT09MQkFSX1RFWFQgfCBUT09MQkFSX0lDT05TIHwgVE9PTEJBUl9IT1JJWikpCisJCSAgICAgID09IChUT09MQkFSX1RFWFQgfCBUT09MQkFSX0lDT05TIHwgVE9PTEJBUl9IT1JJWikpCisJc3R5bGUgPSBHVEtfVE9PTEJBUl9CT1RIX0hPUklaOworICAgIGVsc2UKKyMgZW5kaWYKKyAgICBpZiAoKHRvb2xiYXJfZmxhZ3MgJiAoVE9PTEJBUl9URVhUIHwgVE9PTEJBUl9JQ09OUykpCisJCSAgICAgID09IChUT09MQkFSX1RFWFQgfCBUT09MQkFSX0lDT05TKSkKKwlzdHlsZSA9IEdUS19UT09MQkFSX0JPVEg7CisgICAgZWxzZSBpZiAodG9vbGJhcl9mbGFncyAmIFRPT0xCQVJfVEVYVCkKKwlzdHlsZSA9IEdUS19UT09MQkFSX1RFWFQ7CisgICAgZWxzZQorCXN0eWxlID0gR1RLX1RPT0xCQVJfSUNPTlM7CisKKyAgICBndGtfdG9vbGJhcl9zZXRfc3R5bGUodG9vbGJhciwgc3R5bGUpOworICAgIGd0a190b29sYmFyX3NldF90b29sdGlwcyh0b29sYmFyLCAodG9vbGJhcl9mbGFncyAmIFRPT0xCQVJfVE9PTFRJUFMpICE9IDApOworCisjIGlmZGVmIEhBVkVfR1RLMgorICAgIHN3aXRjaCAodGJpc19mbGFncykKKyAgICB7CisJY2FzZSBUQklTX1RJTlk6CSAgICBzaXplID0gR1RLX0lDT05fU0laRV9NRU5VOwkJYnJlYWs7CisJY2FzZSBUQklTX1NNQUxMOiAgICBzaXplID0gR1RLX0lDT05fU0laRV9TTUFMTF9UT09MQkFSOwlicmVhazsKKwljYXNlIFRCSVNfTUVESVVNOiAgIHNpemUgPSBHVEtfSUNPTl9TSVpFX0JVVFRPTjsJYnJlYWs7CisJY2FzZSBUQklTX0xBUkdFOiAgICBzaXplID0gR1RLX0lDT05fU0laRV9MQVJHRV9UT09MQkFSOwlicmVhazsKKwlkZWZhdWx0OgkgICAgc2l6ZSA9IEdUS19JQ09OX1NJWkVfSU5WQUxJRDsJYnJlYWs7CisgICAgfQorICAgIG9sZHNpemUgPSBndGtfdG9vbGJhcl9nZXRfaWNvbl9zaXplKHRvb2xiYXIpOworCisgICAgaWYgKHNpemUgPT0gR1RLX0lDT05fU0laRV9JTlZBTElEKQorICAgIHsKKwkvKiBMZXQgZ2xvYmFsIHVzZXIgcHJlZmVyZW5jZXMgZGVjaWRlIHRoZSBpY29uIHNpemUuICovCisJZ3RrX3Rvb2xiYXJfdW5zZXRfaWNvbl9zaXplKHRvb2xiYXIpOworCXNpemUgPSBndGtfdG9vbGJhcl9nZXRfaWNvbl9zaXplKHRvb2xiYXIpOworICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBvbGRzaXplKQorICAgIHsKKwlndGtfY29udGFpbmVyX2ZvcmVhY2goR1RLX0NPTlRBSU5FUih0b29sYmFyKSwKKwkJCSAgICAgICZpY29uX3NpemVfY2hhbmdlZF9mb3JlYWNoLAorCQkJICAgICAgR0lOVF9UT19QT0lOVEVSKChpbnQpc2l6ZSkpOworICAgIH0KKyAgICBndGtfdG9vbGJhcl9zZXRfaWNvbl9zaXplKHRvb2xiYXIsIHNpemUpOworIyBlbmRpZgorfQorCisjZW5kaWYgLyogRkVBVF9UT09MQkFSICovCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBHVUkuCUNyZWF0ZSBhbGwgdGhlIHdpbmRvd3MsIHNldCB1cCBhbGwgdGhlIGNhbGxiYWNrcyBldGMuCisgKiBSZXR1cm5zIE9LIGZvciBzdWNjZXNzLCBGQUlMIHdoZW4gdGhlIEdVSSBjYW4ndCBiZSBzdGFydGVkLgorICovCisgICAgaW50CitndWlfbWNoX2luaXQodm9pZCkKK3sKKyAgICBHdGtXaWRnZXQgKnZib3g7CisKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRQorICAgIC8qIEluaXRpYWxpemUgdGhlIEdOT01FIGxpYnJhcmllcy4JZ25vbWVfcHJvZ3JhbV9pbml0KCkvZ25vbWVfaW5pdCgpCisgICAgICogZXhpdHMgb24gZmFpbHVyZSwgYnV0IHRoYXQncyBhIG5vbi1pc3N1ZSBiZWNhdXNlIHdlIGFscmVhZHkgY2FsbGVkCisgICAgICogZ3RrX2luaXRfY2hlY2soKSBpbiBndWlfbWNoX2luaXRfY2hlY2soKS4gKi8KKyAgICBpZiAodXNpbmdfZ25vbWUpCisjIGlmZGVmIEhBVkVfR1RLMgorCWdub21lX3Byb2dyYW1faW5pdChWSU1QQUNLQUdFLCBWSU1fVkVSU0lPTl9TSE9SVCwKKwkJCSAgIExJQkdOT01FVUlfTU9EVUxFLCBndWlfYXJnYywgZ3VpX2FyZ3YsIE5VTEwpOworIyBlbHNlCisJZ25vbWVfaW5pdChWSU1QQUNLQUdFLCBWSU1fVkVSU0lPTl9TSE9SVCwgZ3VpX2FyZ2MsIGd1aV9hcmd2KTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIHZpbV9mcmVlKGd1aV9hcmd2KTsKKyAgICBndWlfYXJndiA9IE5VTEw7CisKKyNpZmRlZiBIQVZFX0dUSzIKKyMgaWYgR0xJQl9DSEVDS19WRVJTSU9OKDIsMSwzKQorICAgIC8qIFNldCB0aGUgaHVtYW4tcmVhZGFibGUgYXBwbGljYXRpb24gbmFtZSAqLworICAgIGdfc2V0X2FwcGxpY2F0aW9uX25hbWUoIlZpbSIpOworIyBlbmRpZgorICAgIC8qCisgICAgICogRm9yY2UgVVRGLTggb3V0cHV0IG5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBvZiAnZW5jb2RpbmcnIGlzLgorICAgICAqIGRpZF9zZXRfc3RyaW5nX29wdGlvbigpIGluIG9wdGlvbi5jIHByb2hpYml0cyBjaGFuZ2luZyAndGVybWVuY29kaW5nJworICAgICAqIHRvIHNvbWV0aGluZyBlbHNlIHRoYW4gVVRGLTggaWYgdGhlIEdVSSBpcyBpbiB1c2UuCisgICAgICovCisgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInRlcm1lbmNvZGluZyIsIDBMLCAoY2hhcl91ICopInV0Zi04IiwgMCk7CisKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisgICAgZ3VpX2d0a19yZWdpc3Rlcl9zdG9ja19pY29ucygpOworIyBlbmRpZgorICAgIC8qIEZJWE1FOiBOZWVkIHRvIGluc3RhbGwgdGhlIGNsYXNzaWMgaWNvbnMgYW5kIGEgZ3RrcmMuY2xhc3NpYyBmaWxlLgorICAgICAqIFRoZSBoYXJkIHBhcnQgaXMgZGVjaWRpbmcgaW5zdGFsbCBsb2NhdGlvbnMgYW5kIHRoZSBNYWtlZmlsZSBtYWdpYy4gKi8KKyMgaWYgMAorICAgIGd0a19yY19wYXJzZSgiZ3RrcmMiKTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSB2YWx1ZXMgKi8KKyAgICBndWkuYm9yZGVyX3dpZHRoID0gMjsKKyAgICBndWkuc2Nyb2xsYmFyX3dpZHRoID0gU0JfREVGQVVMVF9XSURUSDsKKyAgICBndWkuc2Nyb2xsYmFyX2hlaWdodCA9IFNCX0RFRkFVTFRfV0lEVEg7CisgICAgZ3VpLmZnY29sb3IgPSBnX25ldzAoR2RrQ29sb3IsIDEpOworICAgIGd1aS5iZ2NvbG9yID0gZ19uZXcwKEdka0NvbG9yLCAxKTsKKworICAgIC8qIEluaXRpYWxpc2UgYXRvbXMgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgdXRmOF9zdHJpbmdfYXRvbSA9IGdka19hdG9tX2ludGVybigiVVRGOF9TVFJJTkciLCBGQUxTRSk7CisjZW5kaWYKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgY29tcG91bmRfdGV4dF9hdG9tID0gZ2RrX2F0b21faW50ZXJuKCJDT01QT1VORF9URVhUIiwgRkFMU0UpOworICAgIHRleHRfYXRvbSA9IGdka19hdG9tX2ludGVybigiVEVYVCIsIEZBTFNFKTsKKyNlbmRpZgorCisgICAgLyogU2V0IGRlZmF1bHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMuICovCisgICAgZ3VpLm5vcm1fcGl4ZWwgPSBndWkuZGVmX25vcm1fcGl4ZWw7CisgICAgZ3VpLmJhY2tfcGl4ZWwgPSBndWkuZGVmX2JhY2tfcGl4ZWw7CisKKyAgICBpZiAoZ3RrX3NvY2tldF9pZCAhPSAwKQorICAgIHsKKwlHdGtXaWRnZXQgKnBsdWc7CisKKwkvKiBVc2UgR3RrU29ja2V0IGZyb20gYW5vdGhlciBhcHAuICovCisjaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisJcGx1ZyA9IGd0a19wbHVnX25ld19mb3JfZGlzcGxheShnZGtfZGlzcGxheV9nZXRfZGVmYXVsdCgpLAorCQkJCQlndGtfc29ja2V0X2lkKTsKKyNlbHNlCisJcGx1ZyA9IGd0a19wbHVnX25ldyhndGtfc29ja2V0X2lkKTsKKyNlbmRpZgorCWlmIChwbHVnICE9IE5VTEwgJiYgR1RLX1BMVUcocGx1ZyktPnNvY2tldF93aW5kb3cgIT0gTlVMTCkKKwl7CisJICAgIGd1aS5tYWlud2luID0gcGx1ZzsKKwl9CisJZWxzZQorCXsKKwkgICAgZ193YXJuaW5nKCJDb25uZWN0aW9uIHRvIEdUSysgc29ja2V0IChJRCAldSkgZmFpbGVkIiwKKwkJICAgICAgKHVuc2lnbmVkIGludClndGtfc29ja2V0X2lkKTsKKwkgICAgLyogUHJldGVuZCB3ZSBuZXZlciB3YW50ZWQgaXQgaWYgaXQgZmFpbGVkIChnZXQgb3duIHdpbmRvdykgKi8KKwkgICAgZ3RrX3NvY2tldF9pZCA9IDA7CisJfQorICAgIH0KKworICAgIGlmIChndGtfc29ja2V0X2lkID09IDApCisgICAgeworI2lmZGVmIEZFQVRfR1VJX0dOT01FCisJaWYgKHVzaW5nX2dub21lKQorCXsKKwkgICAgZ3VpLm1haW53aW4gPSBnbm9tZV9hcHBfbmV3KCJWaW0iLCBOVUxMKTsKKyMgaWZkZWYgVVNFX1hTTVAKKwkgICAgLyogVXNlIHRoZSBHTk9NRSBzYXZlLXlvdXJzZWxmIGZ1bmN0aW9uYWxpdHkgbm93LiAqLworCSAgICB4c21wX2Nsb3NlKCk7CisjIGVuZGlmCisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBndWkubWFpbndpbiA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfVE9QTEVWRUwpOworICAgIH0KKworICAgIGd0a193aWRnZXRfc2V0X25hbWUoZ3VpLm1haW53aW4sICJ2aW0tbWFpbi13aW5kb3ciKTsKKworI2lmZGVmIEhBVkVfR1RLMgorICAgIC8qIENyZWF0ZSB0aGUgUGFuZ29Db250ZXh0IHVzZWQgZm9yIGRyYXdpbmcgYWxsIHRleHQuICovCisgICAgZ3VpLnRleHRfY29udGV4dCA9IGd0a193aWRnZXRfY3JlYXRlX3BhbmdvX2NvbnRleHQoZ3VpLm1haW53aW4pOworICAgIHBhbmdvX2NvbnRleHRfc2V0X2Jhc2VfZGlyKGd1aS50ZXh0X2NvbnRleHQsIFBBTkdPX0RJUkVDVElPTl9MVFIpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HVEsyCisgICAgZ3RrX3dpbmRvd19zZXRfcG9saWN5KEdUS19XSU5ET1coZ3VpLm1haW53aW4pLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyNlbmRpZgorICAgIGd0a19jb250YWluZXJfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIoZ3VpLm1haW53aW4pLCAwKTsKKyAgICBndGtfd2lkZ2V0X2FkZF9ldmVudHMoZ3VpLm1haW53aW4sIEdES19WSVNJQklMSVRZX05PVElGWV9NQVNLKTsKKworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5tYWlud2luKSwgImRlbGV0ZV9ldmVudCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoJmRlbGV0ZV9ldmVudF9jYiksIE5VTEwpOworCisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLm1haW53aW4pLCAicmVhbGl6ZSIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoJm1haW53aW5fcmVhbGl6ZSksIE5VTEwpOworI2lmZGVmIEhBVkVfR1RLX01VTFRJSEVBRAorICAgIGdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QoZ3VpLm1haW53aW4pLCAic2NyZWVuX2NoYW5nZWQiLAorCQkgICAgIEdfQ0FMTEJBQ0soJm1haW53aW5fc2NyZWVuX2NoYW5nZWRfY2IpLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfR1RLMgorICAgIGd1aS5hY2NlbF9ncm91cCA9IGd0a19hY2NlbF9ncm91cF9uZXcoKTsKKyAgICBndGtfd2luZG93X2FkZF9hY2NlbF9ncm91cChHVEtfV0lORE9XKGd1aS5tYWlud2luKSwgZ3VpLmFjY2VsX2dyb3VwKTsKKyNlbHNlCisgICAgZ3VpLmFjY2VsX2dyb3VwID0gZ3RrX2FjY2VsX2dyb3VwX2dldF9kZWZhdWx0KCk7CisjZW5kaWYKKworICAgIHZib3ggPSBndGtfdmJveF9uZXcoRkFMU0UsIDApOworCisjaWZkZWYgRkVBVF9HVUlfR05PTUUKKyAgICBpZiAodXNpbmdfZ25vbWUpCisgICAgeworIyBpZiBkZWZpbmVkKEhBVkVfR1RLMikgJiYgZGVmaW5lZChGRUFUX01FTlUpCisJLyogYXV0b21hZ2ljYWxseSByZXN0b3JlIG1lbnViYXIvdG9vbGJhciBwbGFjZW1lbnQgKi8KKwlnbm9tZV9hcHBfZW5hYmxlX2xheW91dF9jb25maWcoR05PTUVfQVBQKGd1aS5tYWlud2luKSwgVFJVRSk7CisjIGVuZGlmCisJZ25vbWVfYXBwX3NldF9jb250ZW50cyhHTk9NRV9BUFAoZ3VpLm1haW53aW4pLCB2Ym94KTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZ3VpLm1haW53aW4pLCB2Ym94KTsKKwlndGtfd2lkZ2V0X3Nob3codmJveCk7CisgICAgfQorCisjaWZkZWYgRkVBVF9NRU5VCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIG1lbnViYXIgYW5kIGhhbmRsZQorICAgICAqLworICAgIGd1aS5tZW51YmFyID0gZ3RrX21lbnVfYmFyX25ldygpOworICAgIGd0a193aWRnZXRfc2V0X25hbWUoZ3VpLm1lbnViYXIsICJ2aW0tbWVudWJhciIpOworCisjIGlmZGVmIEZFQVRfR1VJX0dOT01FCisgICAgaWYgKHVzaW5nX2dub21lKQorICAgIHsKKyMgIGlmZGVmIEhBVkVfR1RLMgorCUJvbm9ib0RvY2tJdGVtICpkb2NraXRlbTsKKworCWdub21lX2FwcF9zZXRfbWVudXMoR05PTUVfQVBQKGd1aS5tYWlud2luKSwgR1RLX01FTlVfQkFSKGd1aS5tZW51YmFyKSk7CisJZG9ja2l0ZW0gPSBnbm9tZV9hcHBfZ2V0X2RvY2tfaXRlbV9ieV9uYW1lKEdOT01FX0FQUChndWkubWFpbndpbiksCisJCQkJCQkgICBHTk9NRV9BUFBfTUVOVUJBUl9OQU1FKTsKKwlndWkubWVudWJhcl9oID0gR1RLX1dJREdFVChkb2NraXRlbSk7CisjICBlbHNlCisJZ3VpLm1lbnViYXJfaCA9IGdub21lX2RvY2tfaXRlbV9uZXcoIlZpbU1haW5NZW51IiwKKwkJCQkJICAgIEdOT01FX0RPQ0tfSVRFTV9CRUhfRVhDTFVTSVZFIHwKKwkJCQkJICAgIEdOT01FX0RPQ0tfSVRFTV9CRUhfTkVWRVJfVkVSVElDQUwpOworCWd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZ3VpLm1lbnViYXJfaCksIGd1aS5tZW51YmFyKTsKKworCWdub21lX2RvY2tfYWRkX2l0ZW0oR05PTUVfRE9DSyhHTk9NRV9BUFAoZ3VpLm1haW53aW4pLT5kb2NrKSwKKwkJCSAgICBHTk9NRV9ET0NLX0lURU0oZ3VpLm1lbnViYXJfaCksCisJCQkgICAgR05PTUVfRE9DS19UT1AsIC8qIHBsYWNlbWVudCAqLworCQkJICAgIDEsCS8qIGJhbmRfbnVtICovCisJCQkgICAgMCwJLyogYmFuZF9wb3NpdGlvbiAqLworCQkJICAgIDAsCS8qIG9mZnNldCAqLworCQkJICAgIFRSVUUpOworCWd0a193aWRnZXRfc2hvdyhndWkubWVudWJhcik7CisjICBlbmRpZgorICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCS8qIEZFQVRfR1VJX0dOT01FICovCisgICAgeworCWlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX01FTlVTKSAhPSBOVUxMKQorCSAgICBndGtfd2lkZ2V0X3Nob3coZ3VpLm1lbnViYXIpOworCWd0a19ib3hfcGFja19zdGFydChHVEtfQk9YKHZib3gpLCBndWkubWVudWJhciwgRkFMU0UsIEZBTFNFLCAwKTsKKyAgICB9CisjZW5kaWYJLyogRkVBVF9NRU5VICovCisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgdG9vbGJhciBhbmQgaGFuZGxlCisgICAgICovCisjIGlmZGVmIEhBVkVfR1RLMgorICAgIC8qIHNvbWUgYWVzdGhldGljcyBvbiB0aGUgdG9vbGJhciAqLworICAgIGd0a19yY19wYXJzZV9zdHJpbmcoCisJICAgICJzdHlsZSBcInZpbS10b29sYmFyLXN0eWxlXCIge1xuIgorCSAgICAiICBHdGtUb29sYmFyOjpidXR0b25fcmVsaWVmID0gR1RLX1JFTElFRl9OT05FXG4iCisJICAgICJ9XG4iCisJICAgICJ3aWRnZXQgXCIqLnZpbS10b29sYmFyXCIgc3R5bGUgXCJ2aW0tdG9vbGJhci1zdHlsZVwiXG4iKTsKKyAgICBndWkudG9vbGJhciA9IGd0a190b29sYmFyX25ldygpOworICAgIGd0a193aWRnZXRfc2V0X25hbWUoZ3VpLnRvb2xiYXIsICJ2aW0tdG9vbGJhciIpOworIyBlbHNlCisgICAgZ3VpLnRvb2xiYXIgPSBndGtfdG9vbGJhcl9uZXcoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwsCisJCQkJICBHVEtfVE9PTEJBUl9JQ09OUyk7CisgICAgZ3RrX3Rvb2xiYXJfc2V0X2J1dHRvbl9yZWxpZWYoR1RLX1RPT0xCQVIoZ3VpLnRvb2xiYXIpLCBHVEtfUkVMSUVGX05PTkUpOworIyBlbmRpZgorICAgIHNldF90b29sYmFyX3N0eWxlKEdUS19UT09MQkFSKGd1aS50b29sYmFyKSk7CisKKyMgaWZkZWYgRkVBVF9HVUlfR05PTUUKKyAgICBpZiAodXNpbmdfZ25vbWUpCisgICAgeworIyAgaWZkZWYgSEFWRV9HVEsyCisJQm9ub2JvRG9ja0l0ZW0gKmRvY2tpdGVtOworCisJZ25vbWVfYXBwX3NldF90b29sYmFyKEdOT01FX0FQUChndWkubWFpbndpbiksIEdUS19UT09MQkFSKGd1aS50b29sYmFyKSk7CisJZG9ja2l0ZW0gPSBnbm9tZV9hcHBfZ2V0X2RvY2tfaXRlbV9ieV9uYW1lKEdOT01FX0FQUChndWkubWFpbndpbiksCisJCQkJCQkgICBHTk9NRV9BUFBfVE9PTEJBUl9OQU1FKTsKKwlndWkudG9vbGJhcl9oID0gR1RLX1dJREdFVChkb2NraXRlbSk7CisJZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIoZ3VpLnRvb2xiYXIpLCAwKTsKKyMgIGVsc2UKKwlHdGtXaWRnZXQgKmRvY2tpdGVtOworCisJZG9ja2l0ZW0gPSBnbm9tZV9kb2NrX2l0ZW1fbmV3KCJWaW1Ub29sQmFyIiwKKwkJCQkgICAgICAgR05PTUVfRE9DS19JVEVNX0JFSF9FWENMVVNJVkUpOworCWd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZG9ja2l0ZW0pLCBHVEtfV0lER0VUKGd1aS50b29sYmFyKSk7CisJZ3VpLnRvb2xiYXJfaCA9IGRvY2tpdGVtOworCisJZ25vbWVfZG9ja19hZGRfaXRlbShHTk9NRV9ET0NLKEdOT01FX0FQUChndWkubWFpbndpbiktPmRvY2spLAorCQkJICAgIEdOT01FX0RPQ0tfSVRFTShkb2NraXRlbSksCisJCQkgICAgR05PTUVfRE9DS19UT1AsCS8qIHBsYWNlbWVudCAqLworCQkJICAgIDEsCS8qIGJhbmRfbnVtICovCisJCQkgICAgMSwJLyogYmFuZF9wb3NpdGlvbiAqLworCQkJICAgIDAsCS8qIG9mZnNldCAqLworCQkJICAgIFRSVUUpOworCWd0a19jb250YWluZXJfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIoZ3VpLnRvb2xiYXIpLCAyKTsKKwlndGtfd2lkZ2V0X3Nob3coZ3VpLnRvb2xiYXIpOworIyAgZW5kaWYKKyAgICB9CisgICAgZWxzZQorIyBlbmRpZgkvKiBGRUFUX0dVSV9HTk9NRSAqLworICAgIHsKKyMgaWZuZGVmIEhBVkVfR1RLMgorCWd0a19jb250YWluZXJfYm9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIoZ3VpLnRvb2xiYXIpLCAxKTsKKyMgZW5kaWYKKwlpZiAodmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMCisJCSYmICh0b29sYmFyX2ZsYWdzICYgKFRPT0xCQVJfVEVYVCB8IFRPT0xCQVJfSUNPTlMpKSkKKwkgICAgZ3RrX3dpZGdldF9zaG93KGd1aS50b29sYmFyKTsKKwlndGtfYm94X3BhY2tfc3RhcnQoR1RLX0JPWCh2Ym94KSwgZ3VpLnRvb2xiYXIsIEZBTFNFLCBGQUxTRSwgMCk7CisgICAgfQorI2VuZGlmIC8qIEZFQVRfVE9PTEJBUiAqLworCisgICAgZ3VpLmZvcm13aW4gPSBndGtfZm9ybV9uZXcoKTsKKyAgICBndGtfY29udGFpbmVyX2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKGd1aS5mb3Jtd2luKSwgMCk7CisgICAgZ3RrX3dpZGdldF9zZXRfZXZlbnRzKGd1aS5mb3Jtd2luLCBHREtfRVhQT1NVUkVfTUFTSyk7CisKKyAgICBndWkuZHJhd2FyZWEgPSBndGtfZHJhd2luZ19hcmVhX25ldygpOworCisgICAgLyogRGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB3ZSB3aWxsIGZpbHRlci4gKi8KKyAgICBndGtfd2lkZ2V0X3NldF9ldmVudHMoZ3VpLmRyYXdhcmVhLAorCQkJICBHREtfRVhQT1NVUkVfTUFTSyB8CisJCQkgIEdES19FTlRFUl9OT1RJRllfTUFTSyB8CisJCQkgIEdES19MRUFWRV9OT1RJRllfTUFTSyB8CisJCQkgIEdES19CVVRUT05fUFJFU1NfTUFTSyB8CisJCQkgIEdES19CVVRUT05fUkVMRUFTRV9NQVNLIHwKKyNpZmRlZiBIQVZFX0dUSzIKKwkJCSAgR0RLX1NDUk9MTF9NQVNLIHwKKyNlbmRpZgorCQkJICBHREtfS0VZX1BSRVNTX01BU0sgfAorCQkJICBHREtfS0VZX1JFTEVBU0VfTUFTSyB8CisJCQkgIEdES19QT0lOVEVSX01PVElPTl9NQVNLIHwKKwkJCSAgR0RLX1BPSU5URVJfTU9USU9OX0hJTlRfTUFTSyk7CisKKyAgICBndGtfd2lkZ2V0X3Nob3coZ3VpLmRyYXdhcmVhKTsKKyAgICBndGtfZm9ybV9wdXQoR1RLX0ZPUk0oZ3VpLmZvcm13aW4pLCBndWkuZHJhd2FyZWEsIDAsIDApOworICAgIGd0a193aWRnZXRfc2hvdyhndWkuZm9ybXdpbik7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0KEdUS19CT1godmJveCksIGd1aS5mb3Jtd2luLCBUUlVFLCBUUlVFLCAwKTsKKworICAgIC8qIEZvciBHdGtTb2NrZXRzLCBrZXktcHJlc3NlcyBtdXN0IGdvIHRvIHRoZSBmb2N1cyB3aWRnZXQgKGRyYXdhcmVhKQorICAgICAqIGFuZCBub3QgdGhlIHdpbmRvdy4gKi8KKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoKGd0a19zb2NrZXRfaWQgPT0gMCkgPyBHVEtfT0JKRUNUKGd1aS5tYWlud2luKQorCQkJCQkgICAgOiBHVEtfT0JKRUNUKGd1aS5kcmF3YXJlYSksCisJCSAgICAgICAia2V5X3ByZXNzX2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhrZXlfcHJlc3NfZXZlbnQpLCBOVUxMKTsKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICAvKiBBbHNvIGZvcndhcmQga2V5IHJlbGVhc2UgZXZlbnRzIGZvciB0aGUgYmVuZWZpdCBvZiBHVEsrIDIgaW5wdXQKKyAgICAgKiBtb2R1bGVzLiAgVHJ5IENUUkwtU0hJRlQteGRpZ2l0cyB0byBlbnRlciBhIFVuaWNvZGUgY29kZSBwb2ludC4gKi8KKyAgICBnX3NpZ25hbF9jb25uZWN0KChndGtfc29ja2V0X2lkID09IDApID8gR19PQkpFQ1QoZ3VpLm1haW53aW4pCisJCQkJCSAgOiBHX09CSkVDVChndWkuZHJhd2FyZWEpLAorCQkgICAgICJrZXlfcmVsZWFzZV9ldmVudCIsCisJCSAgICAgR19DQUxMQkFDSygma2V5X3JlbGVhc2VfZXZlbnQpLCBOVUxMKTsKKyNlbmRpZgorICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5kcmF3YXJlYSksICJyZWFsaXplIiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhkcmF3YXJlYV9yZWFsaXplX2NiKSwgTlVMTCk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgInVucmVhbGl6ZSIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoZHJhd2FyZWFfdW5yZWFsaXplX2NiKSwgTlVMTCk7CisKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXIoR1RLX09CSkVDVChndWkuZHJhd2FyZWEpLCAic3R5bGVfc2V0IiwKKwkJCSAgICAgR1RLX1NJR05BTF9GVU5DKCZkcmF3YXJlYV9zdHlsZV9zZXRfY2IpLCBOVUxMKTsKKworICAgIGd1aS52aXNpYmlsaXR5ID0gR0RLX1ZJU0lCSUxJVFlfVU5PQlNDVVJFRDsKKworI2lmICEoZGVmaW5lZChGRUFUX0dVSV9HTk9NRSkgJiYgZGVmaW5lZChGRUFUX1NFU1NJT04pKQorICAgIHdtX3Byb3RvY29sc19hdG9tID0gZ2RrX2F0b21faW50ZXJuKCJXTV9QUk9UT0NPTFMiLCBGQUxTRSk7CisgICAgc2F2ZV95b3Vyc2VsZl9hdG9tID0gZ2RrX2F0b21faW50ZXJuKCJXTV9TQVZFX1lPVVJTRUxGIiwgRkFMU0UpOworI2VuZGlmCisKKyAgICBpZiAoZ3RrX3NvY2tldF9pZCAhPSAwKQorCS8qIG1ha2Ugc3VyZSBrZXlib3JkIGlucHV0IGNhbiBnbyB0byB0aGUgZHJhd2FyZWEgKi8KKwlHVEtfV0lER0VUX1NFVF9GTEFHUyhndWkuZHJhd2FyZWEsIEdUS19DQU5fRk9DVVMpOworCisgICAgLyoKKyAgICAgKiBTZXQgY2xpcGJvYXJkIHNwZWNpZmljIGF0b21zCisgICAgICovCisgICAgdmltX2F0b20gPSBnZGtfYXRvbV9pbnRlcm4oVklNX0FUT01fTkFNRSwgRkFMU0UpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1lbmNfYXRvbSA9IGdka19hdG9tX2ludGVybihWSU1FTkNfQVRPTV9OQU1FLCBGQUxTRSk7CisjZW5kaWYKKyAgICBjbGlwX3N0YXIuZ3RrX3NlbF9hdG9tID0gR0RLX1NFTEVDVElPTl9QUklNQVJZOworICAgIGNsaXBfcGx1cy5ndGtfc2VsX2F0b20gPSBnZGtfYXRvbV9pbnRlcm4oIkNMSVBCT0FSRCIsIEZBTFNFKTsKKworICAgIC8qCisgICAgICogU3RhcnQgb3V0IGJ5IGFkZGluZyB0aGUgY29uZmlndXJlZCBib3JkZXIgd2lkdGggaW50byB0aGUgYm9yZGVyIG9mZnNldC4KKyAgICAgKi8KKyAgICBndWkuYm9yZGVyX29mZnNldCA9IGd1aS5ib3JkZXJfd2lkdGg7CisKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkubWFpbndpbiksICJ2aXNpYmlsaXR5X25vdGlmeV9ldmVudCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkModmlzaWJpbGl0eV9ldmVudCksIE5VTEwpOworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5kcmF3YXJlYSksICJleHBvc2VfZXZlbnQiLAorCQkgICAgICAgR1RLX1NJR05BTF9GVU5DKGV4cG9zZV9ldmVudCksIE5VTEwpOworCisgICAgLyoKKyAgICAgKiBPbmx5IGluc3RhbGwgdGhlc2UgZW50ZXIvbGVhdmUgY2FsbGJhY2tzIHdoZW4gJ3AnIGluICdndWlvcHRpb25zJy4KKyAgICAgKiBPbmx5IG5lZWRlZCBmb3Igc29tZSB3aW5kb3cgbWFuYWdlcnMuCisgICAgICovCisgICAgaWYgKHZpbV9zdHJjaHIocF9nbywgR09fUE9JTlRFUikgIT0gTlVMTCkKKyAgICB7CisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgImxlYXZlX25vdGlmeV9ldmVudCIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMobGVhdmVfbm90aWZ5X2V2ZW50KSwgTlVMTCk7CisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgImVudGVyX25vdGlmeV9ldmVudCIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMoZW50ZXJfbm90aWZ5X2V2ZW50KSwgTlVMTCk7CisgICAgfQorCisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLm1haW53aW4pLCAiZm9jdXNfb3V0X2V2ZW50IiwKKwkJCSAgIEdUS19TSUdOQUxfRlVOQyhmb2N1c19vdXRfZXZlbnQpLCBOVUxMKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkubWFpbndpbiksICJmb2N1c19pbl9ldmVudCIsCisJCQkgICBHVEtfU0lHTkFMX0ZVTkMoZm9jdXNfaW5fZXZlbnQpLCBOVUxMKTsKKworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5kcmF3YXJlYSksICJtb3Rpb25fbm90aWZ5X2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhtb3Rpb25fbm90aWZ5X2V2ZW50KSwgTlVMTCk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgImJ1dHRvbl9wcmVzc19ldmVudCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoYnV0dG9uX3ByZXNzX2V2ZW50KSwgTlVMTCk7CisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgImJ1dHRvbl9yZWxlYXNlX2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhidXR0b25fcmVsZWFzZV9ldmVudCksIE5VTEwpOworI2lmZGVmIEhBVkVfR1RLMgorICAgIGdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QoZ3VpLmRyYXdhcmVhKSwgInNjcm9sbF9ldmVudCIsCisJCSAgICAgR19DQUxMQkFDSygmc2Nyb2xsX2V2ZW50KSwgTlVMTCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogQWRkIHNlbGVjdGlvbiBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkuZHJhd2FyZWEpLCAic2VsZWN0aW9uX2NsZWFyX2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhzZWxlY3Rpb25fY2xlYXJfZXZlbnQpLCBOVUxMKTsKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkuZHJhd2FyZWEpLCAic2VsZWN0aW9uX3JlY2VpdmVkIiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhzZWxlY3Rpb25fcmVjZWl2ZWRfY2IpLCBOVUxMKTsKKworICAgIC8qCisgICAgICogQWRkIHNlbGVjdGlvbiB0YXJnZXRzIGZvciBQUklNQVJZIGFuZCBDTElQQk9BUkQgc2VsZWN0aW9ucy4KKyAgICAgKi8KKyAgICBndGtfc2VsZWN0aW9uX2FkZF90YXJnZXRzKGd1aS5kcmF3YXJlYSwKKwkJCSAgICAgIChHZGtBdG9tKUdES19TRUxFQ1RJT05fUFJJTUFSWSwKKwkJCSAgICAgIHNlbGVjdGlvbl90YXJnZXRzLCBOX1NFTEVDVElPTl9UQVJHRVRTKTsKKyAgICBndGtfc2VsZWN0aW9uX2FkZF90YXJnZXRzKGd1aS5kcmF3YXJlYSwKKwkJCSAgICAgIChHZGtBdG9tKWNsaXBfcGx1cy5ndGtfc2VsX2F0b20sCisJCQkgICAgICBzZWxlY3Rpb25fdGFyZ2V0cywgTl9TRUxFQ1RJT05fVEFSR0VUUyk7CisKKyAgICBndGtfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChndWkuZHJhd2FyZWEpLCAic2VsZWN0aW9uX2dldCIsCisJCSAgICAgICBHVEtfU0lHTkFMX0ZVTkMoc2VsZWN0aW9uX2dldF9jYiksIE5VTEwpOworCisgICAgLyogUHJldGVuZCB3ZSBkb24ndCBoYXZlIGlucHV0IGZvY3VzLCB3ZSB3aWxsIGdldCBhbiBldmVudCBpZiB3ZSBkby4gKi8KKyAgICBndWkuaW5fZm9jdXMgPSBGQUxTRTsKKworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIGlmICh1c2luZ05ldGJlYW5zKQorCW5ldGJlYW5zX2d0a19jb25uZWN0KCk7CisjIGVuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZiAoZGVmaW5lZChGRUFUX0dVSV9HTk9NRSkgJiYgZGVmaW5lZChGRUFUX1NFU1NJT04pKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZ3VpX3N0YXJ0KCkgYWZ0ZXIgYSBmb3JrKCkgaGFzIGJlZW4gZG9uZS4KKyAqIFdlIGhhdmUgdG8gdGVsbCB0aGUgc2Vzc2lvbiBtYW5hZ2VyIG91ciBuZXcgUElELgorICovCisgICAgdm9pZAorZ3VpX21jaF9mb3JrZWQodm9pZCkKK3sKKyAgICBpZiAodXNpbmdfZ25vbWUpCisgICAgeworCUdub21lQ2xpZW50ICpjbGllbnQ7CisKKwljbGllbnQgPSBnbm9tZV9tYXN0ZXJfY2xpZW50KCk7CisKKwlpZiAoY2xpZW50ICE9IE5VTEwpCisJICAgIGdub21lX2NsaWVudF9zZXRfcHJvY2Vzc19pZChjbGllbnQsIGdldHBpZCgpKTsKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9HVUlfR05PTUUgJiYgRkVBVF9TRVNTSU9OICovCisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kIGNvbG9yIGhhcyBiZWVuIGNoYW5nZWQuCisgKiBUaGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBncmFwaGljcyBjb250ZXh0cyBkaXJlY3RseSBidXQgd2UgYXJlCisgKiBjdXJyZW50bHkgbWFuaXB1bGF0aW5nIHRoZW0gd2hlcmUgZGVzaXJlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbmV3X2NvbG9ycyh2b2lkKQoreworICAgIGlmIChndWkuZHJhd2FyZWEgIT0gTlVMTCAmJiBndWkuZHJhd2FyZWEtPndpbmRvdyAhPSBOVUxMKQorICAgIHsKKwlHZGtDb2xvciBjb2xvciA9IHsgMCwgMCwgMCwgMCB9OworCisJY29sb3IucGl4ZWwgPSBndWkuYmFja19waXhlbDsKKwlnZGtfd2luZG93X3NldF9iYWNrZ3JvdW5kKGd1aS5kcmF3YXJlYS0+d2luZG93LCAmY29sb3IpOworICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKEZFQVRfVE9PTEJBUikKKyAgICBzdGF0aWMgaW50CitnZXRfaXRlbV9kaW1lbnNpb25zKEd0a1dpZGdldCAqd2lkZ2V0LCBHdGtPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBHdGtPcmllbnRhdGlvbiBpdGVtX29yaWVudGF0aW9uID0gR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUw7CisKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRQorICAgIGlmICh1c2luZ19nbm9tZSAmJiB3aWRnZXQgIT0gTlVMTCkKKyAgICB7CisjIGlmZGVmIEhBVkVfR1RLMgorCUJvbm9ib0RvY2tJdGVtICpkb2NraXRlbTsKKworCXdpZGdldAkgPSBndGtfd2lkZ2V0X2dldF9wYXJlbnQod2lkZ2V0KTsKKwlkb2NraXRlbSA9IEJPTk9CT19ET0NLX0lURU0od2lkZ2V0KTsKKworCWlmIChkb2NraXRlbSA9PSBOVUxMIHx8IGRvY2tpdGVtLT5pc19mbG9hdGluZykKKwkgICAgcmV0dXJuIDA7CisJaXRlbV9vcmllbnRhdGlvbiA9IGJvbm9ib19kb2NrX2l0ZW1fZ2V0X29yaWVudGF0aW9uKGRvY2tpdGVtKTsKKyMgZWxzZQorCUdub21lRG9ja0l0ZW0gKmRvY2tpdGVtOworCisJd2lkZ2V0CSA9IHdpZGdldC0+cGFyZW50OworCWRvY2tpdGVtID0gR05PTUVfRE9DS19JVEVNKHdpZGdldCk7CisKKwlpZiAoZG9ja2l0ZW0gPT0gTlVMTCB8fCBkb2NraXRlbS0+aXNfZmxvYXRpbmcpCisJICAgIHJldHVybiAwOworCWl0ZW1fb3JpZW50YXRpb24gPSBnbm9tZV9kb2NrX2l0ZW1fZ2V0X29yaWVudGF0aW9uKGRvY2tpdGVtKTsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAod2lkZ2V0ICE9IE5VTEwKKwkgICAgJiYgaXRlbV9vcmllbnRhdGlvbiA9PSBvcmllbnRhdGlvbgorCSAgICAmJiBHVEtfV0lER0VUX1JFQUxJWkVEKHdpZGdldCkKKwkgICAgJiYgR1RLX1dJREdFVF9WSVNJQkxFKHdpZGdldCkpCisgICAgeworCWlmIChvcmllbnRhdGlvbiA9PSBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkKKwkgICAgcmV0dXJuIHdpZGdldC0+YWxsb2NhdGlvbi5oZWlnaHQ7CisJZWxzZQorCSAgICByZXR1cm4gd2lkZ2V0LT5hbGxvY2F0aW9uLndpZHRoOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisgICAgc3RhdGljIGludAorZ2V0X21lbnVfdG9vbF93aWR0aCh2b2lkKQoreworICAgIGludCB3aWR0aCA9IDA7CisKKyNpZmRlZiBGRUFUX0dVSV9HTk9NRSAvKiB0aGVzZSBhcmUgbmV2ZXIgdmVydGljYWwgd2l0aG91dCBHTk9NRSAqLworIyBpZmRlZiBGRUFUX01FTlUKKyAgICB3aWR0aCArPSBnZXRfaXRlbV9kaW1lbnNpb25zKGd1aS5tZW51YmFyLCBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwpOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICB3aWR0aCArPSBnZXRfaXRlbV9kaW1lbnNpb25zKGd1aS50b29sYmFyLCBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwpOworIyBlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKyAgICBzdGF0aWMgaW50CitnZXRfbWVudV90b29sX2hlaWdodCh2b2lkKQoreworICAgIGludCBoZWlnaHQgPSAwOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgaGVpZ2h0ICs9IGdldF9pdGVtX2RpbWVuc2lvbnMoZ3VpLm1lbnViYXIsIEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIGhlaWdodCArPSBnZXRfaXRlbV9kaW1lbnNpb25zKGd1aS50b29sYmFyLCBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCk7CisjZW5kaWYKKworICAgIHJldHVybiBoZWlnaHQ7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordXBkYXRlX3dpbmRvd19tYW5hZ2VyX2hpbnRzKHZvaWQpCit7CisgICAgc3RhdGljIGludCBvbGRfd2lkdGggID0gMDsKKyAgICBzdGF0aWMgaW50IG9sZF9oZWlnaHQgPSAwOworICAgIHN0YXRpYyBpbnQgb2xkX2NoYXJfd2lkdGggID0gMDsKKyAgICBzdGF0aWMgaW50IG9sZF9jaGFyX2hlaWdodCA9IDA7CisKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKworICAgIC8qIFRoaXMgYWxzbyBuZWVkcyB0byBiZSBkb25lIHdoZW4gdGhlIG1haW4gd2luZG93IGlzbid0IHRoZXJlIHlldCwKKyAgICAgKiBvdGhlcndpc2UgdGhlIGhpbnRzIGRvbid0IHdvcmsuICovCisgICAgd2lkdGggID0gZ3VpX2dldF9iYXNlX3dpZHRoKCk7CisgICAgaGVpZ2h0ID0gZ3VpX2dldF9iYXNlX2hlaWdodCgpOworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICB3aWR0aCAgKz0gZ2V0X21lbnVfdG9vbF93aWR0aCgpOworICAgIGhlaWdodCArPSBnZXRfbWVudV90b29sX2hlaWdodCgpOworIyBlbmRpZgorCisgICAgLyogQXZvaWQgYW4gZXhwb3NlIGV2ZW50IHdoZW4gdGhlIHNpemUgZGlkbid0IGNoYW5nZS4gKi8KKyAgICBpZiAod2lkdGggIT0gb2xkX3dpZHRoCisJICAgIHx8IGhlaWdodCAhPSBvbGRfaGVpZ2h0CisJICAgIHx8IGd1aS5jaGFyX3dpZHRoICE9IG9sZF9jaGFyX3dpZHRoCisJICAgIHx8IGd1aS5jaGFyX2hlaWdodCAhPSBvbGRfY2hhcl9oZWlnaHQpCisgICAgeworCUdka0dlb21ldHJ5CWdlb21ldHJ5OworCUdka1dpbmRvd0hpbnRzCWdlb21ldHJ5X21hc2s7CisKKwlnZW9tZXRyeS53aWR0aF9pbmMgICA9IGd1aS5jaGFyX3dpZHRoOworCWdlb21ldHJ5LmhlaWdodF9pbmMgID0gZ3VpLmNoYXJfaGVpZ2h0OworCWdlb21ldHJ5LmJhc2Vfd2lkdGggID0gd2lkdGg7CisJZ2VvbWV0cnkuYmFzZV9oZWlnaHQgPSBoZWlnaHQ7CisJZ2VvbWV0cnkubWluX3dpZHRoICAgPSB3aWR0aCAgKyBNSU5fQ09MVU1OUyAqIGd1aS5jaGFyX3dpZHRoOworCWdlb21ldHJ5Lm1pbl9oZWlnaHQgID0gaGVpZ2h0ICsgTUlOX0xJTkVTICAgKiBndWkuY2hhcl9oZWlnaHQ7CisJZ2VvbWV0cnlfbWFzawkgICAgID0gR0RLX0hJTlRfQkFTRV9TSVpFfEdES19ISU5UX1JFU0laRV9JTkMKKwkJCSAgICAgICB8R0RLX0hJTlRfTUlOX1NJWkU7CisjIGlmZGVmIEhBVkVfR1RLMgorCS8qIFVzaW5nIGd1aS5mb3Jtd2luIGFzIGdlb21ldHJ5IHdpZGdldCBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkgKiB3aXRoIEdUSysgMiAtLSBkdW5ubyB3aHkuICBQcmVzdW1hYmx5IGFsbCB0aGUgcmVzaXppbmcgaGFja3MKKwkgKiBpbiBWaW0gY29uZnVzZSBHVEsrLiAqLworCWd0a193aW5kb3dfc2V0X2dlb21ldHJ5X2hpbnRzKEdUS19XSU5ET1coZ3VpLm1haW53aW4pLCBndWkubWFpbndpbiwKKwkJCQkgICAgICAmZ2VvbWV0cnksIGdlb21ldHJ5X21hc2spOworIyBlbHNlCisJZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHMoR1RLX1dJTkRPVyhndWkubWFpbndpbiksIGd1aS5mb3Jtd2luLAorCQkJCSAgICAgICZnZW9tZXRyeSwgZ2VvbWV0cnlfbWFzayk7CisjIGVuZGlmCisJb2xkX3dpZHRoICA9IHdpZHRoOworCW9sZF9oZWlnaHQgPSBoZWlnaHQ7CisJb2xkX2NoYXJfd2lkdGgJPSBndWkuY2hhcl93aWR0aDsKKwlvbGRfY2hhcl9oZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQ7CisgICAgfQorfQorCisvKgorICogVGhpcyBzaWduYWwgaW5mb3JtcyB1cyBhYm91dCB0aGUgbmVlZCB0byByZWFycmFuZ2Ugb3VyIHN1Yi13aWRnZXRzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgZ2ludAorZm9ybV9jb25maWd1cmVfZXZlbnQoR3RrV2lkZ2V0ICp3aWRnZXQsIEdka0V2ZW50Q29uZmlndXJlICpldmVudCwKKwkJICAgICBncG9pbnRlciBkYXRhKQoreworICAgIGd0a19mb3JtX2ZyZWV6ZShHVEtfRk9STShndWkuZm9ybXdpbikpOworICAgIGd1aV9yZXNpemVfc2hlbGwoZXZlbnQtPndpZHRoLCBldmVudC0+aGVpZ2h0KTsKKyAgICBndGtfZm9ybV90aGF3KEdUS19GT1JNKGd1aS5mb3Jtd2luKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHdpbmRvdyBhbHJlYWR5IGNsb3NlZC4KKyAqIFdlIGNhbid0IGRvIG11Y2ggbW9yZSBoZXJlIHRoYW4gdG8gdHJ5aW5nIHRvIHByZXNlcnZlIHdoYXQgaGFkIGJlZW4gZG9uZSwKKyAqIHNpbmNlIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBpbmV2aXRhYmx5IGdvaW5nIGF3YXkuCisgKi8KKy8qQVJHU1VTRUQwKi8KKyAgICBzdGF0aWMgdm9pZAorbWFpbndpbl9kZXN0cm95X2NiKEd0a09iamVjdCAqb2JqZWN0LCBncG9pbnRlciBkYXRhKQoreworICAgIC8qIERvbid0IHdyaXRlIG1lc3NhZ2VzIHRvIHRoZSBHVUkgYW55bW9yZSAqLworICAgIGZ1bGxfc2NyZWVuID0gRkFMU0U7CisKKyAgICBndWkubWFpbndpbiAgPSBOVUxMOworICAgIGd1aS5kcmF3YXJlYSA9IE5VTEw7CisKKyAgICBpZiAoIWV4aXRpbmcpIC8qIG9ubHkgZG8gYW55dGhpbmcgaWYgdGhlIGRlc3Ryb3kgd2FzIHVuZXhwZWN0ZWQgKi8KKyAgICB7CisJU1RSTkNQWShJT2J1ZmYsIF8oIlZpbTogTWFpbiB3aW5kb3cgdW5leHBlY3RlZGx5IGRlc3Ryb3llZFxuIiksCisJCUlPU0laRSk7CisJSU9idWZmW0lPU0laRSAtIDFdID0gTlVMOworCXByZXNlcnZlX2V4aXQoKTsKKyAgICB9Cit9CisKKy8qCisgKiBPcGVuIHRoZSBHVUkgd2luZG93IHdoaWNoIHdhcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBndWlfbWNoX2luaXQoKS4KKyAqLworICAgIGludAorZ3VpX21jaF9vcGVuKHZvaWQpCit7CisgICAgZ3VpY29sb3JfVCBmZ19waXhlbCA9IElOVkFMQ09MT1I7CisgICAgZ3VpY29sb3JfVCBiZ19waXhlbCA9IElOVkFMQ09MT1I7CisKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICAvKgorICAgICAqIEFsbG93IHNldHRpbmcgYSB3aW5kb3cgcm9sZSBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpbnZlbnQgb25lCisgICAgICogaWYgbm9uZSB3YXMgc3BlY2lmaWVkLiAgVGhpcyBpcyBtYWlubHkgdXNlZnVsIGZvciBHTk9NRSBzZXNzaW9uCisgICAgICogc3VwcG9ydDsgYWxsb3dpbmcgdGhlIFdNIHRvIHJlc3RvcmUgd2luZG93IHBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBpZiAocm9sZV9hcmd1bWVudCAhPSBOVUxMKQorICAgIHsKKwlndGtfd2luZG93X3NldF9yb2xlKEdUS19XSU5ET1coZ3VpLm1haW53aW4pLCByb2xlX2FyZ3VtZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaGFyICpyb2xlOworCisJLyogSW52ZW50IGEgdW5pcXVlLWVub3VnaCBJRCBzdHJpbmcgZm9yIHRoZSByb2xlICovCisJcm9sZSA9IGdfc3RyZHVwX3ByaW50ZigidmltLSV1LSV1LSV1IiwKKwkJCSAgICAgICAodW5zaWduZWQpbWNoX2dldF9waWQoKSwKKwkJCSAgICAgICAodW5zaWduZWQpZ19yYW5kb21faW50KCksCisJCQkgICAgICAgKHVuc2lnbmVkKXRpbWUoTlVMTCkpOworCisJZ3RrX3dpbmRvd19zZXRfcm9sZShHVEtfV0lORE9XKGd1aS5tYWlud2luKSwgcm9sZSk7CisJZ19mcmVlKHJvbGUpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGd1aV93aW5feCAhPSAtMSAmJiBndWlfd2luX3kgIT0gLTEpCisjaWZkZWYgSEFWRV9HVEsyCisJZ3RrX3dpbmRvd19tb3ZlKEdUS19XSU5ET1coZ3VpLm1haW53aW4pLCBndWlfd2luX3gsIGd1aV93aW5feSk7CisjZWxzZQorCWd0a193aWRnZXRfc2V0X3Vwb3NpdGlvbihndWkubWFpbndpbiwgZ3VpX3dpbl94LCBndWlfd2luX3kpOworI2VuZGlmCisKKyAgICAvKiBEZXRlcm1pbmUgdXNlciBzcGVjaWZpZWQgZ2VvbWV0cnksIGlmIHByZXNlbnQuICovCisgICAgaWYgKGd1aS5nZW9tICE9IE5VTEwpCisgICAgeworCWludAkJbWFzazsKKwl1bnNpZ25lZCBpbnQJdywgaDsKKwlpbnQJCXggPSAwOworCWludAkJeSA9IDA7CisKKwltYXNrID0gWFBhcnNlR2VvbWV0cnkoKGNoYXIgKilndWkuZ2VvbSwgJngsICZ5LCAmdywgJmgpOworCisJaWYgKG1hc2sgJiBXaWR0aFZhbHVlKQorCSAgICBDb2x1bW5zID0gdzsKKwlpZiAobWFzayAmIEhlaWdodFZhbHVlKQorCSAgICBSb3dzID0gaDsKKwlpZiAobWFzayAmIChYVmFsdWUgfCBZVmFsdWUpKQorI2lmZGVmIEhBVkVfR1RLMgorCSAgICBndGtfd2luZG93X21vdmUoR1RLX1dJTkRPVyhndWkubWFpbndpbiksIHgsIHkpOworI2Vsc2UKKwkgICAgZ3RrX3dpZGdldF9zZXRfdXBvc2l0aW9uKGd1aS5tYWlud2luLCB4LCB5KTsKKyNlbmRpZgorCXZpbV9mcmVlKGd1aS5nZW9tKTsKKwlndWkuZ2VvbSA9IE5VTEw7CisgICAgfQorCisgICAgZ3RrX2Zvcm1fc2V0X3NpemUoR1RLX0ZPUk0oZ3VpLmZvcm13aW4pLAorCSAgICAoZ3VpbnQpKGd1aV9nZXRfYmFzZV93aWR0aCgpICsgQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoKSwKKwkgICAgKGd1aW50KShndWlfZ2V0X2Jhc2VfaGVpZ2h0KCkgKyBSb3dzICogZ3VpLmNoYXJfaGVpZ2h0KSk7CisgICAgdXBkYXRlX3dpbmRvd19tYW5hZ2VyX2hpbnRzKCk7CisKKyAgICBpZiAoZm9yZWdyb3VuZF9hcmd1bWVudCAhPSBOVUxMKQorCWZnX3BpeGVsID0gZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZm9yZWdyb3VuZF9hcmd1bWVudCk7CisgICAgaWYgKGZnX3BpeGVsID09IElOVkFMQ09MT1IpCisJZmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKikiQmxhY2siKTsKKworICAgIGlmIChiYWNrZ3JvdW5kX2FyZ3VtZW50ICE9IE5VTEwpCisJYmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKiliYWNrZ3JvdW5kX2FyZ3VtZW50KTsKKyAgICBpZiAoYmdfcGl4ZWwgPT0gSU5WQUxDT0xPUikKKwliZ19waXhlbCA9IGd1aV9nZXRfY29sb3IoKGNoYXJfdSAqKSJXaGl0ZSIpOworCisgICAgaWYgKGZvdW5kX3JldmVyc2VfYXJnKQorICAgIHsKKwlndWkuZGVmX25vcm1fcGl4ZWwgPSBiZ19waXhlbDsKKwlndWkuZGVmX2JhY2tfcGl4ZWwgPSBmZ19waXhlbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlndWkuZGVmX25vcm1fcGl4ZWwgPSBmZ19waXhlbDsKKwlndWkuZGVmX2JhY2tfcGl4ZWwgPSBiZ19waXhlbDsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGNvbG9ycyBmcm9tIHRoZSAiTm9ybWFsIiBhbmQgIk1lbnUiIGdyb3VwIChzZXQgaW4gc3ludGF4LmMgb3IKKyAgICAgKiBpbiBhIHZpbXJjIGZpbGUpICovCisgICAgc2V0X25vcm1hbF9jb2xvcnMoKTsKKworICAgIC8qIENoZWNrIHRoYXQgbm9uZSBvZiB0aGUgY29sb3JzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYmFja2dyb3VuZCBjb2xvciAqLworICAgIGd1aV9jaGVja19jb2xvcnMoKTsKKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZvciB0aGUgaGlnaGxpZ2h0IGdyb3VwcyAoZ3VpX2NoZWNrX2NvbG9ycygpIG1pZ2h0IGhhdmUKKyAgICAgKiBjaGFuZ2VkIHRoZW0pLiAqLworICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOwkvKiByZS1pbml0IGNvbG9ycyBhbmQgZm9udHMgKi8KKworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5tYWlud2luKSwgImRlc3Ryb3kiLAorCQkgICAgICAgR1RLX1NJR05BTF9GVU5DKG1haW53aW5fZGVzdHJveV9jYiksIE5VTEwpOworCisjaWZkZWYgRkVBVF9IQU5HVUxJTgorICAgIGhhbmd1bF9rZXlib2FyZF9zZXQoKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBOb3RpZnkgdGhlIGZpeGVkIGFyZWEgYWJvdXQgdGhlIG5lZWQgdG8gcmVzaXplIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgKiBndWkuZm9ybXdpbiwgd2hpY2ggd2UgdXNlIGZvciByYW5kb20gcG9zaXRpb25pbmcgb2YgdGhlIGluY2x1ZGVkCisgICAgICogY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdlIGNvbm5lY3QgdGhpcyBzaWduYWwgZGVmZXJyZWQgZmluYWxseSBhZnRlciBhbnl0aGluZyBpcyBpbiBwbGFjZSwKKyAgICAgKiBzaW5jZSB0aGlzIGlzIGludGVuZGVkIHRvIGhhbmRsZSByZXNpemVtZW50cyBjb21pbmcgZnJvbSB0aGUgd2luZG93CisgICAgICogbWFuYWdlciB1cG9uIHVzIGFuZCBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIHdoYXQgVklNIGlzIHJlcXVlc3RpbmcKKyAgICAgKiB1cG9uIHN0YXJ0dXAuCisgICAgICovCisgICAgZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmZvcm13aW4pLCAiY29uZmlndXJlX2V2ZW50IiwKKwkJICAgICAgIEdUS19TSUdOQUxfRlVOQyhmb3JtX2NvbmZpZ3VyZV9ldmVudCksIE5VTEwpOworCisjaWZkZWYgRkVBVF9ETkQKKyAgICAvKgorICAgICAqIFNldCB1cCBmb3IgcmVjZWl2aW5nIERORCBpdGVtcy4KKyAgICAgKi8KKyAgICBndGtfZHJhZ19kZXN0X3NldChndWkuZHJhd2FyZWEsCisJCSAgICAgIEdUS19ERVNUX0RFRkFVTFRfQUxMLAorCQkgICAgICBkbmRfdGFyZ2V0cywgTl9ETkRfVEFSR0VUUywKKwkJICAgICAgR0RLX0FDVElPTl9DT1BZKTsKKworICAgIGd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGd1aS5kcmF3YXJlYSksICJkcmFnX2RhdGFfcmVjZWl2ZWQiLAorCQkgICAgICAgR1RLX1NJR05BTF9GVU5DKGRyYWdfZGF0YV9yZWNlaXZlZF9jYiksIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dUSzIKKwkvKiBXaXRoIEdUSysgMiwgd2UgbmVlZCB0byBpY29uaWZ5IHRoZSB3aW5kb3cgYmVmb3JlIGNhbGxpbmcgc2hvdygpCisJICogdG8gYXZvaWQgbWFwcGluZyB0aGUgd2luZG93IGZvciBhIHNob3J0IHRpbWUuICBUaGlzIGlzIGp1c3QgYXMgb25lCisJICogd291bGQgZXhwZWN0IGl0IHRvIHdvcmssIGJ1dCBpdCdzIGRpZmZlcmVudCBpbiBHVEsrIDEuICBUaGUgZnVubnkKKwkgKiB0aGluZyBpcyB0aGF0IGljb25pZnlpbmcgYWZ0ZXIgc2hvdygpIF9kb2VzXyB3b3JrIHdpdGggR1RLKyAxLgorCSAqIChCVFcgZG9pbmcgdGhpcyBpbiB0aGUgInJlYWxpemUiIGhhbmRsZXIgbWFrZXMgbm8gZGlmZmVyZW5jZS4pICovCisJaWYgKGZvdW5kX2ljb25pY19hcmcgJiYgZ3RrX3NvY2tldF9pZCA9PSAwKQorCSAgICBndWlfbWNoX2ljb25pZnkoKTsKKyNlbmRpZgorCisgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUlfR05PTUUpICYmIGRlZmluZWQoSEFWRV9HVEsyKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkKKwl1bnNpZ25lZCBsb25nIG1lbnVfaGFuZGxlciA9IDA7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorCXVuc2lnbmVkIGxvbmcgdG9vbF9oYW5kbGVyID0gMDsKKyMgZW5kaWYKKwkvKgorCSAqIFVyZ2ggaGFja2lzaCA6LyAgRm9yIHNvbWUgcmVhc29uIEJvbm9ib0RvY2tMYXlvdXQgYWx3YXlzIGZvcmNlcyBhCisJICogc2hvdyB3aGVuIHJlc3RvcmluZyB0aGUgc2F2ZWQgbGF5b3V0IGNvbmZpZ3VyYXRpb24uCVdlIGNhbid0IGp1c3QKKwkgKiBoaWRlIHRoZSB3aWRnZXRzIGFnYWluIGFmdGVyIGd0a193aWRnZXRfc2hvdyhndWkubWFpbndpbikgc2luY2UgaXQncworCSAqIGEgdG9wbGV2ZWwgd2luZG93IGFuZCB0aHVzIHdpbGwgYmUgcmVhbGl6ZWQgaW1tZWRpYXRlbHkuICBJbnN0ZWFkLAorCSAqIGNvbm5lY3Qgc2lnbmFsIGhhbmRsZXJzIHRvIGhpZGUgdGhlIHdpZGdldHMganVzdCBhZnRlciB0aGV5J3ZlIGJlZW4KKwkgKiBtYXJrZWQgdmlzaWJsZSwgYnV0IGJlZm9yZSB0aGUgbWFpbiB3aW5kb3cgaXMgcmVhbGl6ZWQuCisJICovCisJaWYgKHVzaW5nX2dub21lICYmIHZpbV9zdHJjaHIocF9nbywgR09fTUVOVVMpID09IE5VTEwpCisJICAgIG1lbnVfaGFuZGxlciA9IGdfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXIoZ3VpLm1lbnViYXJfaCwgInNob3ciLAorCQkJCQkJICBHX0NBTExCQUNLKCZndGtfd2lkZ2V0X2hpZGUpLAorCQkJCQkJICBOVUxMKTsKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisJaWYgKHVzaW5nX2dub21lICYmIHZpbV9zdHJjaHIocF9nbywgR09fVE9PTEJBUikgPT0gTlVMTAorCQkmJiAodG9vbGJhcl9mbGFncyAmIChUT09MQkFSX1RFWFQgfCBUT09MQkFSX0lDT05TKSkpCisJICAgIHRvb2xfaGFuZGxlciA9IGdfc2lnbmFsX2Nvbm5lY3RfYWZ0ZXIoZ3VpLnRvb2xiYXJfaCwgInNob3ciLAorCQkJCQkJICBHX0NBTExCQUNLKCZndGtfd2lkZ2V0X2hpZGUpLAorCQkJCQkJICBOVUxMKTsKKyMgZW5kaWYKKyNlbmRpZgorCWd0a193aWRnZXRfc2hvdyhndWkubWFpbndpbik7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dOT01FKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikgJiYgZGVmaW5lZChGRUFUX01FTlUpCisJaWYgKG1lbnVfaGFuZGxlciAhPSAwKQorCSAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QoZ3VpLm1lbnViYXJfaCwgbWVudV9oYW5kbGVyKTsKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisJaWYgKHRvb2xfaGFuZGxlciAhPSAwKQorCSAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QoZ3VpLnRvb2xiYXJfaCwgdG9vbF9oYW5kbGVyKTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIH0KKworI2lmbmRlZiBIQVZFX0dUSzIKKwkvKiBXaXRoIEdUSysgMSwgd2UgbmVlZCB0byBpY29uaWZ5IHRoZSB3aW5kb3cgYWZ0ZXIgY2FsbGluZyBzaG93KCkuCisJICogU2VlIHRoZSBjb21tZW50IGFib3ZlIGZvciBkZXRhaWxzLiAqLworCWlmIChmb3VuZF9pY29uaWNfYXJnICYmIGd0a19zb2NrZXRfaWQgPT0gMCkKKwkgICAgZ3VpX21jaF9pY29uaWZ5KCk7CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKworCisvKkFSR1NVU0VEMCovCisgICAgdm9pZAorZ3VpX21jaF9leGl0KGludCByYykKK3sKKyAgICBpZiAoZ3VpLm1haW53aW4gIT0gTlVMTCkKKwlndGtfd2lkZ2V0X2Rlc3Ryb3koZ3VpLm1haW53aW4pOworCisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKworLyoKKyAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgorICovCisgICAgaW50CitndWlfbWNoX2dldF93aW5wb3MoaW50ICp4LCBpbnQgKnkpCit7CisjaWZkZWYgSEFWRV9HVEsyCisgICAgZ3RrX3dpbmRvd19nZXRfcG9zaXRpb24oR1RLX1dJTkRPVyhndWkubWFpbndpbiksIHgsIHkpOworI2Vsc2UKKyAgICAvKiBGb3Igc29tZSBwZW9wbGUgdGhpcyBtdXN0IGJlIGdka193aW5kb3dfZ2V0X29yaWdpbigpIGZvciBhIGNvcnJlY3QKKyAgICAgKiByZXN1bHQuCVdoZXJlIGlzIHRoZSBkb2N1bWVudGF0aW9uISAqLworICAgIGdka193aW5kb3dfZ2V0X3Jvb3Rfb3JpZ2luKGd1aS5tYWlud2luLT53aW5kb3csIHgsIHkpOworI2VuZGlmCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuCisgKiBjb29yZGluYXRlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCit7CisjaWZkZWYgSEFWRV9HVEsyCisgICAgZ3RrX3dpbmRvd19tb3ZlKEdUS19XSU5ET1coZ3VpLm1haW53aW4pLCB4LCB5KTsKKyNlbHNlCisgICAgZ2RrX3dpbmRvd19tb3ZlKGd1aS5tYWlud2luLT53aW5kb3csIHgsIHkpOworI2VuZGlmCit9CisKKyNpZmRlZiBIQVZFX0dUSzIKKyNpZiAwCitzdGF0aWMgaW50IHJlc2l6ZV9pZGxlX2luc3RhbGxlZCA9IEZBTFNFOworLyoKKyAqIElkbGUgaGFuZGxlciB0byBmb3JjZSByZXNpemUuICBVc2VkIGJ5IGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSgpIHRvIGVuc3VyZQorICogdGhlIHNoZWxsIHNpemUgZG9lc24ndCBleGNlZWQgdGhlIHdpbmRvdyBzaXplLCBpLmUuIGlmIHRoZSB3aW5kb3cgbWFuYWdlcgorICogaWdub3JlZCBvdXIgc2l6ZSByZXF1ZXN0LiAgVXN1YWxseSB0aGlzIGhhcHBlbnMgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWl6ZWQuCisgKgorICogRklYTUU6IEl0J2QgYmUgbmljZSBpZiB3ZSBjb3VsZCBmaW5kIGEgbGl0dGxlIG1vcmUgb3J0aG9kb3ggc29sdXRpb24uCisgKiBTZWUgYWxzbyB0aGUgcmVtYXJrIGJlbG93IGluIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSgpLgorICoKKyAqIERJU0FCTEVEOiBXaGVuIGRvaW5nICI6c2V0IGxpbmVzKz0xIiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGZpcnN0IGludm9rZQorICogZ3VpX3Jlc2l6ZV9zaGVsbCgpIHdpdGggdGhlIG9sZCBzaXplLCB0aGVuIHRoZSBub3JtYWwgY2FsbGJhY2sgd291bGQKKyAqIHJlcG9ydCB0aGUgbmV3IHNpemUgdGhyb3VnaCBmb3JtX2NvbmZpZ3VyZV9ldmVudCgpLiAgVGhhdCBjYXVzZWQgdGhlIHdpbmRvdworICogbGF5b3V0IHRvIGJlIG1lc3NlZCB1cC4KKyAqLworLypBUkdTVVNFRDAqLworICAgIHN0YXRpYyBnYm9vbGVhbgorZm9yY2Vfc2hlbGxfcmVzaXplX2lkbGUoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgICBpZiAoZ3VpLm1haW53aW4gIT0gTlVMTAorCSAgICAmJiBHVEtfV0lER0VUX1JFQUxJWkVEKGd1aS5tYWlud2luKQorCSAgICAmJiBHVEtfV0lER0VUX1ZJU0lCTEUoZ3VpLm1haW53aW4pKQorICAgIHsKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKworCWd0a193aW5kb3dfZ2V0X3NpemUoR1RLX1dJTkRPVyhndWkubWFpbndpbiksICZ3aWR0aCwgJmhlaWdodCk7CisKKwl3aWR0aCAgLT0gZ2V0X21lbnVfdG9vbF93aWR0aCgpOworCWhlaWdodCAtPSBnZXRfbWVudV90b29sX2hlaWdodCgpOworCisJZ3VpX3Jlc2l6ZV9zaGVsbCh3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXNpemVfaWRsZV9pbnN0YWxsZWQgPSBGQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7IC8qIGRvbid0IGNhbGwgbWUgYWdhaW4gKi8KK30KKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfR1RLMiAqLworCisvKgorICogU2V0IHRoZSB3aW5kb3dzIHNpemUuCisgKi8KKy8qQVJHU1VTRUQyKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9zaGVsbHNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkgICAgICBpbnQgbWluX3dpZHRoLCAgaW50IG1pbl9oZWlnaHQsCisJCSAgICAgIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpCit7CisjaWZuZGVmIEhBVkVfR1RLMgorICAgIC8qIEhhY2s6IFdoZW4gdGhlIGZvcm0gYWxyZWFkeSBpcyBhdCB0aGUgZGVzaXJlZCBzaXplLCB0aGUgd2luZG93IG1pZ2h0CisgICAgICogaGF2ZSBiZWVuIHJlc2l6ZWQgd2l0aCB0aGUgbW91c2UuICBGb3JjZSBhIHJlc2l6ZSBieSBzZXR0aW5nIGEKKyAgICAgKiBkaWZmZXJlbnQgc2l6ZSBmaXJzdC4gKi8KKyAgICBpZiAoR1RLX0ZPUk0oZ3VpLmZvcm13aW4pLT53aWR0aCA9PSB3aWR0aAorCSAgICAmJiBHVEtfRk9STShndWkuZm9ybXdpbiktPmhlaWdodCA9PSBoZWlnaHQpCisgICAgeworCWd0a19mb3JtX3NldF9zaXplKEdUS19GT1JNKGd1aS5mb3Jtd2luKSwgd2lkdGggKyAxLCBoZWlnaHQgKyAxKTsKKwlndWlfbWNoX3VwZGF0ZSgpOworICAgIH0KKyAgICBndGtfZm9ybV9zZXRfc2l6ZShHVEtfRk9STShndWkuZm9ybXdpbiksIHdpZHRoLCBoZWlnaHQpOworI2VuZGlmCisKKyAgICAvKiBnaXZlIEdUSysgYSBjaGFuY2UgdG8gcHV0IGFsbCB3aWRnZXQncyBpbnRvIHBsYWNlICovCisgICAgZ3VpX21jaF91cGRhdGUoKTsKKworICAgIC8qIHRoaXMgd2lsbCBjYXVzZSB0aGUgcHJvcGVyIHJlc2l6ZW1lbnQgdG8gaGFwcGVuIHRvbyAqLworICAgIHVwZGF0ZV93aW5kb3dfbWFuYWdlcl9oaW50cygpOworCisjaWZkZWYgSEFWRV9HVEsyCisgICAgLyogV2l0aCBHVEsrIDIsIGNoYW5naW5nIHRoZSBzaXplIG9mIHRoZSBmb3JtIHdpZGdldCBkb2Vzbid0IHJlc2l6ZQorICAgICAqIHRoZSB3aW5kb3cuICBTbyBsZXRzIGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kIGFuZCByZXNpemUgdGhlCisgICAgICogbWFpbiB3aW5kb3cgaW5zdGVhZC4gKi8KKyAgICB3aWR0aCAgKz0gZ2V0X21lbnVfdG9vbF93aWR0aCgpOworICAgIGhlaWdodCArPSBnZXRfbWVudV90b29sX2hlaWdodCgpOworCisgICAgZ3RrX3dpbmRvd19yZXNpemUoR1RLX1dJTkRPVyhndWkubWFpbndpbiksIHdpZHRoLCBoZWlnaHQpOworCisjaWYgMAorICAgIGlmICghcmVzaXplX2lkbGVfaW5zdGFsbGVkKQorICAgIHsKKwlnX2lkbGVfYWRkX2Z1bGwoR0RLX1BSSU9SSVRZX0VWRU5UUyArIDEwLAorCQkJJmZvcmNlX3NoZWxsX3Jlc2l6ZV9pZGxlLCBOVUxMLCBOVUxMKTsKKwlyZXNpemVfaWRsZV9pbnN0YWxsZWQgPSBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIC8qCisgICAgICogV2FpdCB1bnRpbCBhbGwgZXZlbnRzIGFyZSBwcm9jZXNzZWQgdG8gcHJldmVudCBhIGNyYXNoIGJlY2F1c2UgdGhlCisgICAgICogcmVhbCBzaXplIG9mIHRoZSBkcmF3aW5nIGFyZWEgZG9lc24ndCByZWZsZWN0IFZpbSdzIGludGVybmFsIGlkZWFzLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIHNpbmNlIFZpbSBpcyBhIHRlcm1pbmFsIGFwcGxpY2F0aW9uIHdpdGggYSBHVUkKKyAgICAgKiBvbiB0b3AsIHdoaWxlIHRoZSBHVUkgZXhwZWN0cyB0byBiZSB0aGUgYm9zcy4KKyAgICAgKi8KKyAgICBndWlfbWNoX3VwZGF0ZSgpOworI2VuZGlmCit9CisKKworLyoKKyAqIFRoZSBzY3JlZW4gc2l6ZSBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgaW5pdGlhbCB3aW5kb3cgZG9lc24ndCBnZXQgYmlnZ2VyCisgKiB0aGFuIHRoZSBzY3JlZW4uICBUaGlzIHN1YnRyYWN0cyBzb21lIHJvb20gZm9yIG1lbnViYXIsIHRvb2xiYXIgYW5kIHdpbmRvdworICogZGVjb3JhdGlvbnMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucyhpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKQoreworI2lmZGVmIEhBVkVfR1RLX01VTFRJSEVBRAorICAgIEdka1NjcmVlbiogc2NyZWVuOworCisgICAgaWYgKGd1aS5tYWlud2luICE9IE5VTEwgJiYgZ3RrX3dpZGdldF9oYXNfc2NyZWVuKGd1aS5tYWlud2luKSkKKwlzY3JlZW4gPSBndGtfd2lkZ2V0X2dldF9zY3JlZW4oZ3VpLm1haW53aW4pOworICAgIGVsc2UKKwlzY3JlZW4gPSBnZGtfc2NyZWVuX2dldF9kZWZhdWx0KCk7CisKKyAgICAqc2NyZWVuX3cgPSBnZGtfc2NyZWVuX2dldF93aWR0aChzY3JlZW4pOworICAgICpzY3JlZW5faCA9IGdka19zY3JlZW5fZ2V0X2hlaWdodChzY3JlZW4pIC0gcF9naHI7CisjZWxzZQorICAgICpzY3JlZW5fdyA9IGdka19zY3JlZW5fd2lkdGgoKTsKKyAgICAvKiBTdWJ0cmFjdCAnZ3VpaGVhZHJvb20nIGZyb20gdGhlIGhlaWdodCB0byBhbGxvdyBzb21lIHJvb20gZm9yIHRoZQorICAgICAqIHdpbmRvdyBtYW5hZ2VyICh0YXNrIGxpc3QgYW5kIHdpbmRvdyB0aXRsZSBiYXIpLiAqLworICAgICpzY3JlZW5faCA9IGdka19zY3JlZW5faGVpZ2h0KCkgLSBwX2docjsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGSVhNRTogZGlydHkgdHJpY2s6IEJlY2F1c2UgdGhlIGd1aV9nZXRfYmFzZV9oZWlnaHQoKSBkb2Vzbid0IGluY2x1ZGUKKyAgICAgKiB0aGUgdG9vbGJhciBhbmQgbWVudWJhciBmb3IgR1RLLCB3ZSBzdWJ0cmFjdCB0aGVtIGZyb20gdGhlIHNjcmVlbgorICAgICAqIGhpZ2h0LCBzbyB0aGF0IHRoZSB3aW5kb3cgc2l6ZSBjYW4gYmUgbWFkZSB0byBmaXQgb24gdGhlIHNjcmVlbi4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWx5IGNoYW5nZWQgbGF0ZXIuCisgICAgICovCisgICAgKnNjcmVlbl93IC09IGdldF9tZW51X3Rvb2xfd2lkdGgoKTsKKyAgICAqc2NyZWVuX2ggLT0gZ2V0X21lbnVfdG9vbF9oZWlnaHQoKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9USVRMRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0dGl0bGUoY2hhcl91ICp0aXRsZSwgY2hhcl91ICppY29uKQoreworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICBpZiAodGl0bGUgIT0gTlVMTCAmJiBvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl0aXRsZSA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgdGl0bGUsIE5VTEwpOworIyBlbmRpZgorCisgICAgZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyhndWkubWFpbndpbiksIChjb25zdCBjaGFyICopdGl0bGUpOworCisjIGlmZGVmIEhBVkVfR1RLMgorICAgIGlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl2aW1fZnJlZSh0aXRsZSk7CisjIGVuZGlmCit9CisjZW5kaWYgLyogRkVBVF9USVRMRSAqLworCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfbWVudShpbnQgc2hvd2l0KQoreworICAgIEd0a1dpZGdldCAqd2lkZ2V0OworCisjIGlmZGVmIEZFQVRfR1VJX0dOT01FCisgICAgaWYgKHVzaW5nX2dub21lKQorCXdpZGdldCA9IGd1aS5tZW51YmFyX2g7CisgICAgZWxzZQorIyBlbmRpZgorCXdpZGdldCA9IGd1aS5tZW51YmFyOworCisgICAgaWYgKCFzaG93aXQgIT0gIUdUS19XSURHRVRfVklTSUJMRSh3aWRnZXQpKQorICAgIHsKKwlpZiAoc2hvd2l0KQorCSAgICBndGtfd2lkZ2V0X3Nob3cod2lkZ2V0KTsKKwllbHNlCisJICAgIGd0a193aWRnZXRfaGlkZSh3aWRnZXQpOworCisJdXBkYXRlX3dpbmRvd19tYW5hZ2VyX2hpbnRzKCk7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfTUVOVSAqLworCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9zaG93X3Rvb2xiYXIoaW50IHNob3dpdCkKK3sKKyAgICBHdGtXaWRnZXQgKndpZGdldDsKKworICAgIGlmIChndWkudG9vbGJhciA9PSBOVUxMKQorCXJldHVybjsKKworIyBpZmRlZiBGRUFUX0dVSV9HTk9NRQorICAgIGlmICh1c2luZ19nbm9tZSkKKwl3aWRnZXQgPSBndWkudG9vbGJhcl9oOworICAgIGVsc2UKKyMgZW5kaWYKKwl3aWRnZXQgPSBndWkudG9vbGJhcjsKKworICAgIGlmIChzaG93aXQpCisJc2V0X3Rvb2xiYXJfc3R5bGUoR1RLX1RPT0xCQVIoZ3VpLnRvb2xiYXIpKTsKKworICAgIGlmICghc2hvd2l0ICE9ICFHVEtfV0lER0VUX1ZJU0lCTEUod2lkZ2V0KSkKKyAgICB7CisJaWYgKHNob3dpdCkKKwkgICAgZ3RrX3dpZGdldF9zaG93KHdpZGdldCk7CisJZWxzZQorCSAgICBndGtfd2lkZ2V0X2hpZGUod2lkZ2V0KTsKKworCXVwZGF0ZV93aW5kb3dfbWFuYWdlcl9oaW50cygpOworICAgIH0KK30KKyNlbmRpZiAvKiBGRUFUX1RPT0xCQVIgKi8KKworI2lmbmRlZiBIQVZFX0dUSzIKKy8qCisgKiBHZXQgYSBmb250IHN0cnVjdHVyZSBmb3IgaGlnaGxpZ2h0aW5nLgorICogImNiZGF0YSIgaXMgYSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgZ3VpIHN0cnVjdHVyZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZvbnRfc2VsX29rKEd0a1dpZGdldCAqd2d0LCBncG9pbnRlciBjYmRhdGEpCit7CisgICAgZ3VpX1QgKnZ3ID0gKGd1aV9UICopY2JkYXRhOworICAgIEd0a0ZvbnRTZWxlY3Rpb25EaWFsb2cgKmZzID0gKEd0a0ZvbnRTZWxlY3Rpb25EaWFsb2cgKil2dy0+Zm9udGRsZzsKKworICAgIGlmICh2dy0+Zm9udG5hbWUpCisJZ19mcmVlKHZ3LT5mb250bmFtZSk7CisKKyAgICB2dy0+Zm9udG5hbWUgPSAoY2hhcl91ICopZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lKGZzKTsKKyAgICBndGtfd2lkZ2V0X2hpZGUodnctPmZvbnRkbGcpOworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmb250X3NlbF9jYW5jZWwoR3RrV2lkZ2V0ICp3Z3QsIGdwb2ludGVyIGNiZGF0YSkKK3sKKyAgICBndWlfVCAqdncgPSAoZ3VpX1QgKiljYmRhdGE7CisKKyAgICBndGtfd2lkZ2V0X2hpZGUodnctPmZvbnRkbGcpOworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmb250X3NlbF9kZXN0cm95KEd0a1dpZGdldCAqd2d0LCBncG9pbnRlciBjYmRhdGEpCit7CisgICAgZ3VpX1QgKnZ3ID0gKGd1aV9UICopY2JkYXRhOworCisgICAgdnctPmZvbnRkbGcgPSBOVUxMOworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCisjaWZkZWYgSEFWRV9HVEsyCisvKgorICogQ2hlY2sgaWYgYSBnaXZlbiBmb250IGlzIGEgQ0pLIGZvbnQuIFRoaXMgaXMgZG9uZSBpbiBhIHZlcnkgY3J1ZGUgbWFubmVyLiBJdAorICoganVzdCBzZWUgaWYgVSswNEUwMCBmb3IgemggYW5kIGphIGFuZCBVK0FDMDAgZm9yIGtvIGFyZSBjb3ZlcmVkIGluIGEgZ2l2ZW4KKyAqIGZvbnQuIENvbnNlcXVlbnRseSwgdGhpcyBmdW5jdGlvbiBjYW5ub3QgIGJlIHVzZWQgYXMgYSBnZW5lcmFsIHB1cnBvc2UgY2hlY2sKKyAqIGZvciBDSkstbmVzcyBmb3Igd2hpY2ggZm9udGNvbmZpZyBBUElzIHNob3VsZCBiZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWQgYnkKKyAqIGd1aV9tY2hfaW5pdF9mb250KCkgdG8gZGVhbCB3aXRoICdDSksgZml4ZWQgd2lkdGggZm9udHMnLgorICovCisgICAgc3RhdGljIGludAoraXNfY2prX2ZvbnQoUGFuZ29Gb250RGVzY3JpcHRpb24gKmZvbnRfZGVzYykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNqa19sYW5nc1tdID0KKwl7InpoX0NOIiwgInpoX1RXIiwgInpoX0hLIiwgImphIiwgImtvIn07CisKKyAgICBQYW5nb0ZvbnQJKmZvbnQ7CisgICAgdW5zaWduZWQJaTsKKyAgICBpbnQJCWlzX2NqayA9IEZBTFNFOworCisgICAgZm9udCA9IHBhbmdvX2NvbnRleHRfbG9hZF9mb250KGd1aS50ZXh0X2NvbnRleHQsIGZvbnRfZGVzYyk7CisKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaSA9IDA7ICFpc19jamsgJiYgaSA8IEdfTl9FTEVNRU5UUyhjamtfbGFuZ3MpOyArK2kpCisgICAgeworCVBhbmdvQ292ZXJhZ2UJKmNvdmVyYWdlOworCWd1bmljaGFyCXVjOworCisJY292ZXJhZ2UgPSBwYW5nb19mb250X2dldF9jb3ZlcmFnZSgKKwkJZm9udCwgcGFuZ29fbGFuZ3VhZ2VfZnJvbV9zdHJpbmcoY2prX2xhbmdzW2ldKSk7CisKKwlpZiAoY292ZXJhZ2UgIT0gTlVMTCkKKwl7CisJICAgIHVjID0gKGNqa19sYW5nc1tpXVswXSA9PSAnaycpID8gMHhBQzAwIDogMHg0RTAwOworCSAgICBpc19jamsgPSAocGFuZ29fY292ZXJhZ2VfZ2V0KGNvdmVyYWdlLCB1YykgPT0gUEFOR09fQ09WRVJBR0VfRVhBQ1QpOworCSAgICBwYW5nb19jb3ZlcmFnZV91bnJlZihjb3ZlcmFnZSk7CisJfQorICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmKGZvbnQpOworCisgICAgcmV0dXJuIGlzX2NqazsKK30KKyNlbmRpZiAvKiBIQVZFX0dUSzIgKi8KKworICAgIGludAorZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0dUSzIKKyAgICBQYW5nb0ZvbnRNZXRyaWNzCSptZXRyaWNzOworICAgIGludAkJCWFzY2VudDsKKyAgICBpbnQJCQlkZXNjZW50OworCisgICAgbWV0cmljcyA9IHBhbmdvX2NvbnRleHRfZ2V0X21ldHJpY3MoZ3VpLnRleHRfY29udGV4dCwgZ3VpLm5vcm1fZm9udCwKKwkJCQlwYW5nb19jb250ZXh0X2dldF9sYW5ndWFnZShndWkudGV4dF9jb250ZXh0KSk7CisgICAgYXNjZW50ICA9IHBhbmdvX2ZvbnRfbWV0cmljc19nZXRfYXNjZW50KG1ldHJpY3MpOworICAgIGRlc2NlbnQgPSBwYW5nb19mb250X21ldHJpY3NfZ2V0X2Rlc2NlbnQobWV0cmljcyk7CisKKyAgICBwYW5nb19mb250X21ldHJpY3NfdW5yZWYobWV0cmljcyk7CisKKyAgICBndWkuY2hhcl9oZWlnaHQgPSAoYXNjZW50ICsgZGVzY2VudCArIFBBTkdPX1NDQUxFIC0gMSkgLyBQQU5HT19TQ0FMRQorCQkgICAgICArIHBfbGluZXNwYWNlOworICAgIGd1aS5jaGFyX2FzY2VudCA9IFBBTkdPX1BJWEVMUyhhc2NlbnQgKyBwX2xpbmVzcGFjZSAqIFBBTkdPX1NDQUxFIC8gMik7CisKKyNlbHNlIC8qICFIQVZFX0dUSzIgKi8KKworICAgIGd1aS5jaGFyX2hlaWdodCA9IGd1aS5jdXJyZW50X2ZvbnQtPmFzY2VudCArIGd1aS5jdXJyZW50X2ZvbnQtPmRlc2NlbnQKKwkJICAgICAgKyBwX2xpbmVzcGFjZTsKKyAgICBndWkuY2hhcl9hc2NlbnQgPSBndWkuY3VycmVudF9mb250LT5hc2NlbnQgKyBwX2xpbmVzcGFjZSAvIDI7CisKKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyAgICAvKiBBIG5vdC1wb3NpdGl2ZSB2YWx1ZSBvZiBjaGFyX2hlaWdodCBtYXkgY3Jhc2ggVmltLiAgT25seSBoYXBwZW5zCisgICAgICogaWYgJ2xpbmVzcGFjZScgaXMgbmVnYXRpdmUgKHdoaWNoIGRvZXMgbWFrZSBzZW5zZSBzb21ldGltZXMpLiAqLworICAgIGd1aS5jaGFyX2FzY2VudCA9IE1BWChndWkuY2hhcl9hc2NlbnQsIDApOworICAgIGd1aS5jaGFyX2hlaWdodCA9IE1BWChndWkuY2hhcl9oZWlnaHQsIGd1aS5jaGFyX2FzY2VudCArIDEpOworCisgICAgcmV0dXJuIE9LOworfQorCisjaWYgZGVmaW5lZChGRUFUX1hGT05UU0VUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFRyeSB0byBsb2FkIHRoZSByZXF1ZXN0ZWQgZm9udHNldC4KKyAqLworLypBUkdTVVNFRDIqLworICAgIEd1aUZvbnRzZXQKK2d1aV9tY2hfZ2V0X2ZvbnRzZXQoY2hhcl91ICpuYW1lLCBpbnQgcmVwb3J0X2Vycm9yLCBpbnQgZml4ZWRfd2lkdGgpCit7CisgICAgR2RrRm9udCAqZm9udDsKKworICAgIGlmICghZ3VpLmluX3VzZSB8fCBuYW1lID09IE5VTEwpCisJcmV0dXJuIE5PRk9OVDsKKworICAgIGZvbnQgPSBnZGtfZm9udHNldF9sb2FkKChnY2hhciAqKW5hbWUpOworCisgICAgaWYgKGZvbnQgPT0gTlVMTCkKKyAgICB7CisJaWYgKHJlcG9ydF9lcnJvcikKKwkgICAgRU1TRzIoXyhlX2ZvbnRzZXQpLCBuYW1lKTsKKwlyZXR1cm4gTk9GT05UOworICAgIH0KKyAgICAvKiBUT0RPOiBjaGVjayBpZiB0aGUgZm9udCBpcyBmaXhlZCB3aWR0aC4gKi8KKworICAgIC8qIHJlZmVyZW5jZSB0aGlzIGZvbnQgYXMgYmVpbmcgaW4gdXNlICovCisgICAgZ2RrX2ZvbnRfcmVmKGZvbnQpOworCisgICAgcmV0dXJuIChHdWlGb250c2V0KWZvbnQ7Cit9CisjZW5kaWYgLyogRkVBVF9YRk9OVFNFVCAqLworCisjaWZuZGVmIEhBVkVfR1RLMgorLyoKKyAqIFB1dCB1cCBhIGZvbnQgZGlhbG9nIGFuZCByZXR1cm4gdGhlIHNlbGVjdGVkIGZvbnQgbmFtZSBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogIm9sZHZhbCIgaXMgdGhlIHByZXZpb3VzIHZhbHVlLgorICogUmV0dXJuIE5VTEwgd2hlbiBjYW5jZWxsZWQuCisgKi8KKyAgICBjaGFyX3UgKgorZ3VpX21jaF9mb250X2RpYWxvZyhjaGFyX3UgKm9sZHZhbCkKK3sKKyAgICBjaGFyX3UgKmZvbnRuYW1lID0gTlVMTDsKKworICAgIGlmICghZ3VpLmZvbnRkbGcpCisgICAgeworCUd0a0ZvbnRTZWxlY3Rpb25EaWFsb2cJKmZzZCA9IE5VTEw7CisKKwlndWkuZm9udGRsZyA9IGd0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfbmV3KF8oIkZvbnQgU2VsZWN0aW9uIikpOworCWZzZCA9IEdUS19GT05UX1NFTEVDVElPTl9ESUFMT0coZ3VpLmZvbnRkbGcpOworCWd0a193aW5kb3dfc2V0X21vZGFsKEdUS19XSU5ET1coZ3VpLmZvbnRkbGcpLCBUUlVFKTsKKwlndGtfd2luZG93X3NldF90cmFuc2llbnRfZm9yKEdUS19XSU5ET1coZ3VpLmZvbnRkbGcpLAorCQlHVEtfV0lORE9XKGd1aS5tYWlud2luKSk7CisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZ3VpLmZvbnRkbGcpLCAiZGVzdHJveSIsCisJCUdUS19TSUdOQUxfRlVOQyhmb250X3NlbF9kZXN0cm95KSwgJmd1aSk7CisJZ3RrX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoZnNkLT5va19idXR0b24pLCAiY2xpY2tlZCIsCisJCUdUS19TSUdOQUxfRlVOQyhmb250X3NlbF9vayksICZndWkpOworCWd0a19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKGZzZC0+Y2FuY2VsX2J1dHRvbiksICJjbGlja2VkIiwKKwkJR1RLX1NJR05BTF9GVU5DKGZvbnRfc2VsX2NhbmNlbCksICZndWkpOworICAgIH0KKworICAgIGlmIChvbGR2YWwgIT0gTlVMTCAmJiAqb2xkdmFsICE9IE5VTCkKKwlndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9mb250X25hbWUoCisJCUdUS19GT05UX1NFTEVDVElPTl9ESUFMT0coZ3VpLmZvbnRkbGcpLCAoY2hhciAqKW9sZHZhbCk7CisKKyAgICBpZiAoZ3VpLmZvbnRuYW1lKQorICAgIHsKKwlnX2ZyZWUoZ3VpLmZvbnRuYW1lKTsKKwlndWkuZm9udG5hbWUgPSBOVUxMOworICAgIH0KKyAgICBndGtfd2luZG93X3Bvc2l0aW9uKEdUS19XSU5ET1coZ3VpLmZvbnRkbGcpLCBHVEtfV0lOX1BPU19NT1VTRSk7CisgICAgZ3RrX3dpZGdldF9zaG93KGd1aS5mb250ZGxnKTsKKyAgICB7CisJc3RhdGljIGdjaGFyCSpzcGFjaW5nc1tdID0geyJjIiwgIm0iLCBOVUxMfTsKKworCS8qIEluIEdUSyAxLjIuMyB0aGlzIG11c3QgYmUgYWZ0ZXIgdGhlIGd0a193aWRnZXRfc2hvdygpIGNhbGwsCisJICogb3RoZXJ3aXNlIGV2ZXJ5dGhpbmcgaXMgYmxvY2tlZCBmb3IgdGVuIHNlY29uZHMuICovCisJZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZmlsdGVyKAorCQlHVEtfRk9OVF9TRUxFQ1RJT05fRElBTE9HKGd1aS5mb250ZGxnKSwKKwkJR1RLX0ZPTlRfRklMVEVSX0JBU0UsCisJCUdUS19GT05UX0FMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgc3BhY2luZ3MsIE5VTEwpOworICAgIH0KKworICAgIC8qIFdhaXQgZm9yIHRoZSBmb250IGRpYWxvZyB0byBiZSBjbG9zZWQuICovCisgICAgd2hpbGUgKGd1aS5mb250ZGxnICYmIEdUS19XSURHRVRfRFJBV0FCTEUoZ3VpLmZvbnRkbGcpKQorCWd0a19tYWluX2l0ZXJhdGlvbl9kbyhUUlVFKTsKKworICAgIGlmIChndWkuZm9udG5hbWUgIT0gTlVMTCkKKyAgICB7CisJZm9udG5hbWUgPSB2aW1fc3Ryc2F2ZShndWkuZm9udG5hbWUpOworCWdfZnJlZShndWkuZm9udG5hbWUpOworCWd1aS5mb250bmFtZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBmb250bmFtZTsKK30KKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyNpZmRlZiBIQVZFX0dUSzIKKy8qCisgKiBQdXQgdXAgYSBmb250IGRpYWxvZyBhbmQgcmV0dXJuIHRoZSBzZWxlY3RlZCBmb250IG5hbWUgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqICJvbGR2YWwiIGlzIHRoZSBwcmV2aW91cyB2YWx1ZS4gIFJldHVybiBOVUxMIHdoZW4gY2FuY2VsbGVkLgorICogVGhpcyBzaG91bGQgcHJvYmFibHkgZ28gaW50byBndWlfZ3RrLmMuICBIbW0uCisgKiBGSVhNRToKKyAqIFRoZSBHVEsyIGZvbnQgc2VsZWN0aW9uIGRpYWxvZyBoYXMgbm8gZmlsdGVyaW5nIEFQSS4gIFNvIHdlIGNvdWxkIGVpdGhlcgorICogYSkgaW1wbGVtZW50IG91ciBvd24gKHBvc3NpYmx5IGNvcHlpbmcgdGhlIGNvZGUgZnJvbSBzb21ld2hlcmUgZWxzZSkgb3IKKyAqIGIpIGp1c3QgbGl2ZSB3aXRoIGl0LgorICovCisgICAgY2hhcl91ICoKK2d1aV9tY2hfZm9udF9kaWFsb2coY2hhcl91ICpvbGR2YWwpCit7CisgICAgR3RrV2lkZ2V0CSpkaWFsb2c7CisgICAgaW50CQlyZXNwb25zZTsKKyAgICBjaGFyX3UJKmZvbnRuYW1lID0gTlVMTDsKKyAgICBjaGFyX3UJKm9sZG5hbWU7CisKKyAgICBkaWFsb2cgPSBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX25ldyhOVUxMKTsKKworICAgIGd0a193aW5kb3dfc2V0X3RyYW5zaWVudF9mb3IoR1RLX1dJTkRPVyhkaWFsb2cpLCBHVEtfV0lORE9XKGd1aS5tYWlud2luKSk7CisgICAgZ3RrX3dpbmRvd19zZXRfZGVzdHJveV93aXRoX3BhcmVudChHVEtfV0lORE9XKGRpYWxvZyksIFRSVUUpOworCisgICAgaWYgKG9sZHZhbCAhPSBOVUxMICYmIG9sZHZhbFswXSAhPSBOVUwpCisgICAgeworCWlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgb2xkbmFtZSA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgb2xkdmFsLCBOVUxMKTsKKwllbHNlCisJICAgIG9sZG5hbWUgPSBvbGR2YWw7CisKKwkvKiBBbm5veWluZyBidWcgaW4gR1RLIChvciBQYW5nbyk6IGlmIHRoZSBmb250IG5hbWUgZG9lcyBub3QgaW5jbHVkZSBhCisJICogc2l6ZSwgemVybyBpcyB1c2VkLiAgVXNlIGRlZmF1bHQgcG9pbnQgc2l6ZSB0ZW4uICovCisJaWYgKCF2aW1faXNkaWdpdChvbGRuYW1lW1NUUkxFTihvbGRuYW1lKSAtIDFdKSkKKwl7CisJICAgIGNoYXJfdQkqcCA9IHZpbV9zdHJuc2F2ZShvbGRuYW1lLCBTVFJMRU4ob2xkbmFtZSkgKyAzKTsKKworCSAgICBpZiAocCAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNQWShwICsgU1RSTEVOKHApLCAiIDEwIik7CisJCWlmIChvbGRuYW1lICE9IG9sZHZhbCkKKwkJICAgIHZpbV9mcmVlKG9sZG5hbWUpOworCQlvbGRuYW1lID0gcDsKKwkgICAgfQorCX0KKworCWd0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfc2V0X2ZvbnRfbmFtZSgKKwkJR1RLX0ZPTlRfU0VMRUNUSU9OX0RJQUxPRyhkaWFsb2cpLCAoY29uc3QgY2hhciAqKW9sZG5hbWUpOworCisJaWYgKG9sZG5hbWUgIT0gb2xkdmFsKQorCSAgICB2aW1fZnJlZShvbGR2YWwpOworICAgIH0KKworICAgIHJlc3BvbnNlID0gZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhkaWFsb2cpKTsKKworICAgIGlmIChyZXNwb25zZSA9PSBHVEtfUkVTUE9OU0VfT0spCisgICAgeworCWNoYXIgKm5hbWU7CisKKwluYW1lID0gZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lKAorCQkJICAgIEdUS19GT05UX1NFTEVDVElPTl9ESUFMT0coZGlhbG9nKSk7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwl7CisJICAgIGlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCQlmb250bmFtZSA9IHN0cmluZ19jb252ZXJ0KCZpbnB1dF9jb252LCAoY2hhcl91ICopbmFtZSwgTlVMTCk7CisJICAgIGVsc2UKKwkJZm9udG5hbWUgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopbmFtZSk7CisJICAgIGdfZnJlZShuYW1lKTsKKwl9CisgICAgfQorCisgICAgaWYgKHJlc3BvbnNlICE9IEdUS19SRVNQT05TRV9OT05FKQorCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOworCisgICAgcmV0dXJuIGZvbnRuYW1lOworfQorCisvKgorICogU29tZSBtb25vc3BhY2UgZm9udHMgZG9uJ3Qgc3VwcG9ydCBhIGJvbGQgd2VpZ2h0LCBhbmQgZmFsbCBiYWNrCisgKiBzaWxlbnRseSB0byB0aGUgcmVndWxhciB3ZWlnaHQuICBCdXQgdGhpcyBpcyBubyBnb29kIHNpbmNlIG91ciB0ZXh0CisgKiBkcmF3aW5nIGZ1bmN0aW9uIGNhbiBlbXVsYXRlIGJvbGQgYnkgb3ZlcnN0cmlraW5nLiAgU28gbGV0J3MgdHJ5CisgKiB0byBkZXRlY3Qgd2hldGhlciBib2xkIHdlaWdodCBpcyBhY3R1YWxseSBhdmFpbGFibGUgYW5kIGVtdWxhdGUgaXQKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgaXRhbGljIHN0eWxlIHNpbmNlIFhmdCBjYW4KKyAqIGVtdWxhdGUgaXRhbGljIG9uIGl0cyBvd24sIHByb3ZpZGVkIHlvdSBoYXZlIGEgcHJvcGVyIGZvbnRjb25maWcKKyAqIHNldHVwLiAgV2Ugd291bGRuJ3QgYmUgYWJsZSB0byBlbXVsYXRlIGl0IGluIFZpbSBhbnl3YXkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ2V0X3N0eWxlZF9mb250X3ZhcmlhbnRzKHZvaWQpCit7CisgICAgUGFuZ29Gb250RGVzY3JpcHRpb24gICAgKmJvbGRfZm9udF9kZXNjOworICAgIFBhbmdvRm9udAkJICAgICpwbGFpbl9mb250OworICAgIFBhbmdvRm9udAkJICAgICpib2xkX2ZvbnQ7CisKKyAgICBndWkuZm9udF9jYW5fYm9sZCA9IEZBTFNFOworCisgICAgcGxhaW5fZm9udCA9IHBhbmdvX2NvbnRleHRfbG9hZF9mb250KGd1aS50ZXh0X2NvbnRleHQsIGd1aS5ub3JtX2ZvbnQpOworCisgICAgaWYgKHBsYWluX2ZvbnQgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBib2xkX2ZvbnRfZGVzYyA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fY29weV9zdGF0aWMoZ3VpLm5vcm1fZm9udCk7CisgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfd2VpZ2h0KGJvbGRfZm9udF9kZXNjLCBQQU5HT19XRUlHSFRfQk9MRCk7CisKKyAgICBib2xkX2ZvbnQgPSBwYW5nb19jb250ZXh0X2xvYWRfZm9udChndWkudGV4dF9jb250ZXh0LCBib2xkX2ZvbnRfZGVzYyk7CisgICAgLyoKKyAgICAgKiBUaGUgY29tcGFyaXNvbiByZWxpZXMgb24gdGhlIHVuaXF1ZSBoYW5kbGUgbmF0dXJlIG9mIGEgUGFuZ29Gb250KiwKKyAgICAgKiBpLmUuIGl0J3MgYXNzdW1lZCB0aGF0IGEgZGlmZmVyZW50IFBhbmdvRm9udCogd29uJ3QgcmVmZXIgdG8gdGhlCisgICAgICogc2FtZSBmb250LiAgU2VlbXMgdG8gd29yaywgYW5kIGZhaWxpbmcgaGVyZSBpc24ndCBjcml0aWNhbCBhbnl3YXkuCisgICAgICovCisgICAgaWYgKGJvbGRfZm9udCAhPSBOVUxMKQorICAgIHsKKwlndWkuZm9udF9jYW5fYm9sZCA9IChib2xkX2ZvbnQgIT0gcGxhaW5fZm9udCk7CisJZ19vYmplY3RfdW5yZWYoYm9sZF9mb250KTsKKyAgICB9CisKKyAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUoYm9sZF9mb250X2Rlc2MpOworICAgIGdfb2JqZWN0X3VucmVmKHBsYWluX2ZvbnQpOworfQorCisjZWxzZSAvKiAhSEFWRV9HVEsyICovCisKKy8qCisgKiBUaGVyZSBpcyBvbmx5IG9uZSBleGN1c2UgSSBjYW4gZ2l2ZSBmb3IgdGhlIGZvbGxvd2luZyBhdHRlbXB0IHRvIG1hbmFnZSBmb250CisgKiBzdHlsZXM6CisgKgorICogSSBIQVRFIFRIRSBCUkFJTiBERUFEIFdBWSBYMTEgSVMgSEFORExJTkcgRk9OVFMgKC0tbWRja2kpCisgKiAoTWUgdG9vLiAtLWRhbmllbGspCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ2V0X3N0eWxlZF9mb250X3ZhcmlhbnRzKGNoYXJfdSAqIGZvbnRfbmFtZSkKK3sKKyAgICBjaGFyCSpjaHVua1szMl07CisgICAgY2hhcgkqc2R1cDsKKyAgICBjaGFyCSp0bXA7CisgICAgaW50CQlsZW4sIGk7CisgICAgR3VpRm9udAkqc3R5bGVkX2ZvbnRbM107CisKKyAgICBzdHlsZWRfZm9udFswXSA9ICZndWkuYm9sZF9mb250OworICAgIHN0eWxlZF9mb250WzFdID0gJmd1aS5pdGFsX2ZvbnQ7CisgICAgc3R5bGVkX2ZvbnRbMl0gPSAmZ3VpLmJvbGRpdGFsX2ZvbnQ7CisKKyAgICAvKiBGaXJzdCBmcmVlIHdoYXRldmVyIHdhcyBmcmV2aW91c2x5IHRoZXJlLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJaWYgKCpzdHlsZWRfZm9udFtpXSkKKwl7CisJICAgIGdka19mb250X3VucmVmKCpzdHlsZWRfZm9udFtpXSk7CisJICAgICpzdHlsZWRfZm9udFtpXSA9IE5VTEw7CisJfQorCisgICAgaWYgKChzZHVwID0gZ19zdHJkdXAoKGNvbnN0IGNoYXIgKilmb250X25hbWUpKSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIHNwbGl0IHVwIHRoZSB3aG9sZSAqLworICAgIGkgPSAwOworICAgIGZvciAodG1wID0gc2R1cDsgKnRtcCAhPSAnXDAnOyArK3RtcCkKKyAgICB7CisJaWYgKCp0bXAgPT0gJy0nKQorCXsKKwkgICAgKnRtcCA9ICdcMCc7CisKKwkgICAgaWYgKGkgPT0gMzIpCisJCWJyZWFrOworCisJICAgIGNodW5rW2ldID0gdG1wICsgMTsKKwkgICAgKytpOworCX0KKyAgICB9CisKKyAgICBpZiAoaSA9PSAxNCkKKyAgICB7CisJR2RrRm9udAkJKmZvbnQgPSBOVUxMOworCWNvbnN0IGNoYXIJKmJvbGRfY2h1bmtbM10JICAgID0geyAiYm9sZCIsIE5VTEwsCSJib2xkIiB9OworCWNvbnN0IGNoYXIJKml0YWxpY19jaHVua1szXSAgICA9IHsgTlVMTCwJIm8iLAkibyIgfTsKKworCS8qIGZvbnQgbmFtZSB3YXMgY29tcGxldGUgKi8KKwlsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilmb250X25hbWUpICsgMzI7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCXsKKwkgICAgY2hhciAqc3R5bGVkX25hbWU7CisJICAgIGludCBqOworCisJICAgIHN0eWxlZF9uYW1lID0gKGNoYXIgKilhbGxvYyhsZW4pOworCSAgICBpZiAoc3R5bGVkX25hbWUgPT0gTlVMTCkKKwkgICAgeworCQlnX2ZyZWUoc2R1cCk7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgICpzdHlsZWRfbmFtZSA9ICdcMCc7CisKKwkgICAgZm9yIChqID0gMDsgaiA8IDE0OyArK2opCisJICAgIHsKKwkJc3RyY2F0KHN0eWxlZF9uYW1lLCAiLSIpOworCQlpZiAoaiA9PSAyICYmIGJvbGRfY2h1bmtbaV0gIT0gTlVMTCkKKwkJICAgIHN0cmNhdChzdHlsZWRfbmFtZSwgYm9sZF9jaHVua1tpXSk7CisJCWVsc2UgaWYgKGogPT0gMyAmJiBpdGFsaWNfY2h1bmtbaV0gIT0gTlVMTCkKKwkJICAgIHN0cmNhdChzdHlsZWRfbmFtZSwgaXRhbGljX2NodW5rW2ldKTsKKwkJZWxzZQorCQkgICAgc3RyY2F0KHN0eWxlZF9uYW1lLCBjaHVua1tqXSk7CisJICAgIH0KKworCSAgICBmb250ID0gZ3VpX21jaF9nZXRfZm9udCgoY2hhcl91ICopc3R5bGVkX25hbWUsIEZBTFNFKTsKKwkgICAgaWYgKGZvbnQgIT0gTlVMTCkKKwkJKnN0eWxlZF9mb250W2ldID0gZm9udDsKKworCSAgICB2aW1fZnJlZShzdHlsZWRfbmFtZSk7CisJfQorICAgIH0KKworICAgIGdfZnJlZShzZHVwKTsKK30KKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyNpZmRlZiBIQVZFX0dUSzIKK3N0YXRpYyBQYW5nb0VuZ2luZVNoYXBlICpkZWZhdWx0X3NoYXBlX2VuZ2luZSA9IE5VTEw7CisKKy8qCisgKiBDcmVhdGUgYSBtYXAgZnJvbSBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbMzIsMTI2XSB0byBnbHlwaHMKKyAqIG9mIHRoZSBjdXJyZW50IGZvbnQuICBUaGlzIGlzIHVzZWQgYnkgZ3VpX2d0azJfZHJhd19zdHJpbmcoKSB0byBza2lwCisgKiB0aGUgaXRlbWl6ZSBhbmQgc2hhcGluZyBwcm9jZXNzIGZvciB0aGUgbW9zdCBjb21tb24gY2FzZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCithc2NpaV9nbHlwaF90YWJsZV9pbml0KHZvaWQpCit7CisgICAgY2hhcl91CSAgICBhc2NpaV9jaGFyc1sxMjhdOworICAgIFBhbmdvQXR0ckxpc3QgICAqYXR0cl9saXN0OworICAgIEdMaXN0CSAgICAqaXRlbV9saXN0OworICAgIGludAkJICAgIGk7CisKKyAgICBpZiAoZ3VpLmFzY2lpX2dseXBocyAhPSBOVUxMKQorCXBhbmdvX2dseXBoX3N0cmluZ19mcmVlKGd1aS5hc2NpaV9nbHlwaHMpOworICAgIGlmIChndWkuYXNjaWlfZm9udCAhPSBOVUxMKQorCWdfb2JqZWN0X3VucmVmKGd1aS5hc2NpaV9mb250KTsKKworICAgIGd1aS5hc2NpaV9nbHlwaHMgPSBOVUxMOworICAgIGd1aS5hc2NpaV9mb250ICAgPSBOVUxMOworCisgICAgLyogRm9yIHNhZmV0eSwgZmlsbCBpbiBxdWVzdGlvbiBtYXJrcyBmb3IgdGhlIGNvbnRyb2wgY2hhcmFjdGVycy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKKwlhc2NpaV9jaGFyc1tpXSA9ICc/JzsKKyAgICBmb3IgKDsgaSA8IDEyNzsgKytpKQorCWFzY2lpX2NoYXJzW2ldID0gaTsKKyAgICBhc2NpaV9jaGFyc1tpXSA9ICc/JzsKKworICAgIGF0dHJfbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXcoKTsKKyAgICBpdGVtX2xpc3QgPSBwYW5nb19pdGVtaXplKGd1aS50ZXh0X2NvbnRleHQsIChjb25zdCBjaGFyICopYXNjaWlfY2hhcnMsCisJCQkgICAgICAwLCBzaXplb2YoYXNjaWlfY2hhcnMpLCBhdHRyX2xpc3QsIE5VTEwpOworCisgICAgaWYgKGl0ZW1fbGlzdCAhPSBOVUxMICYmIGl0ZW1fbGlzdC0+bmV4dCA9PSBOVUxMKSAvKiBwbGF5IHNhZmUgKi8KKyAgICB7CisJUGFuZ29JdGVtICAgKml0ZW07CisJaW50CSAgICB3aWR0aDsKKworCWl0ZW0gID0gKFBhbmdvSXRlbSAqKWl0ZW1fbGlzdC0+ZGF0YTsKKwl3aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogUEFOR09fU0NBTEU7CisKKwkvKiBSZW1lbWJlciB0aGUgc2hhcGUgZW5naW5lIHVzZWQgZm9yIEFTQ0lJLiAqLworCWRlZmF1bHRfc2hhcGVfZW5naW5lID0gaXRlbS0+YW5hbHlzaXMuc2hhcGVfZW5naW5lOworCisJZ3VpLmFzY2lpX2ZvbnQgPSBpdGVtLT5hbmFseXNpcy5mb250OworCWdfb2JqZWN0X3JlZihndWkuYXNjaWlfZm9udCk7CisKKwlndWkuYXNjaWlfZ2x5cGhzID0gcGFuZ29fZ2x5cGhfc3RyaW5nX25ldygpOworCisJcGFuZ29fc2hhcGUoKGNvbnN0IGNoYXIgKilhc2NpaV9jaGFycywgc2l6ZW9mKGFzY2lpX2NoYXJzKSwKKwkJICAgICZpdGVtLT5hbmFseXNpcywgZ3VpLmFzY2lpX2dseXBocyk7CisKKwlnX3JldHVybl9pZl9mYWlsKGd1aS5hc2NpaV9nbHlwaHMtPm51bV9nbHlwaHMgPT0gc2l6ZW9mKGFzY2lpX2NoYXJzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3VpLmFzY2lpX2dseXBocy0+bnVtX2dseXBoczsgKytpKQorCXsKKwkgICAgUGFuZ29HbHlwaEdlb21ldHJ5ICpnZW9tOworCisJICAgIGdlb20gPSAmZ3VpLmFzY2lpX2dseXBocy0+Z2x5cGhzW2ldLmdlb21ldHJ5OworCSAgICBnZW9tLT54X29mZnNldCArPSBNQVgoMCwgd2lkdGggLSBnZW9tLT53aWR0aCkgLyAyOworCSAgICBnZW9tLT53aWR0aCA9IHdpZHRoOworCX0KKyAgICB9CisKKyAgICBnX2xpc3RfZm9yZWFjaChpdGVtX2xpc3QsIChHRnVuYykmcGFuZ29faXRlbV9mcmVlLCBOVUxMKTsKKyAgICBnX2xpc3RfZnJlZShpdGVtX2xpc3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJlZihhdHRyX2xpc3QpOworfQorI2VuZGlmIC8qIEhBVkVfR1RLMiAqLworCisvKgorICogSW5pdGlhbGl6ZSBWaW0gdG8gdXNlIHRoZSBmb250IG9yIGZvbnRzZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAqIFJldHVybiBGQUlMIGlmIHRoZSBmb250IGNvdWxkIG5vdCBiZSBsb2FkZWQsIE9LIG90aGVyd2lzZS4KKyAqLworLypBUkdTVVNFRDEqLworICAgIGludAorZ3VpX21jaF9pbml0X2ZvbnQoY2hhcl91ICpmb250X25hbWUsIGludCBmb250c2V0KQoreworI2lmZGVmIEhBVkVfR1RLMgorICAgIFBhbmdvRm9udERlc2NyaXB0aW9uICAgICpmb250X2Rlc2M7CisgICAgUGFuZ29MYXlvdXQJCSAgICAqbGF5b3V0OworICAgIGludAkJCSAgICB3aWR0aDsKKworICAgIC8qIElmIGZvbnRfbmFtZSBpcyBOVUxMLCB0aGlzIG1lYW5zIHRvIHVzZSB0aGUgZGVmYXVsdCwgd2hpY2ggc2hvdWxkCisgICAgICogYmUgcHJlc2VudCBvbiBhbGwgcHJvcGVyIFBhbmdvL2ZvbnRjb25maWcgaW5zdGFsbGF0aW9ucy4gKi8KKyAgICBpZiAoZm9udF9uYW1lID09IE5VTEwpCisJZm9udF9uYW1lID0gKGNoYXJfdSAqKURFRkFVTFRfRk9OVDsKKworICAgIGZvbnRfZGVzYyA9IGd1aV9tY2hfZ2V0X2ZvbnQoZm9udF9uYW1lLCBGQUxTRSk7CisKKyAgICBpZiAoZm9udF9kZXNjID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkubm9ybV9mb250KTsKKyAgICBndWkubm9ybV9mb250ID0gZm9udF9kZXNjOworCisgICAgcGFuZ29fY29udGV4dF9zZXRfZm9udF9kZXNjcmlwdGlvbihndWkudGV4dF9jb250ZXh0LCBmb250X2Rlc2MpOworCisgICAgbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25ldyhndWkudGV4dF9jb250ZXh0KTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0LCAiTVciLCAyKTsKKyAgICBwYW5nb19sYXlvdXRfZ2V0X3NpemUobGF5b3V0LCAmd2lkdGgsIE5VTEwpOworICAgIC8qCisgICAgICogU2V0IGNoYXJfd2lkdGggdG8gaGFsZiB0aGUgd2lkdGggb2J0YWluZWQgZnJvbSBwYW5nb19sYXlvdXRfZ2V0X3NpemUoKQorICAgICAqIGZvciBDSksgZml4ZWRfd2lkdGgvYmktd2lkdGggZm9udHMuICBBbiB1bnBhdGNoZWQgdmVyc2lvbiBvZiBYZnQgbGVhZHMKKyAgICAgKiBQYW5nbyB0byB1c2UgdGhlIHNhbWUgd2lkdGggZm9yIGJvdGggbm9uLUNKSyBjaGFyYWN0ZXJzIChlLmcuIExhdGluCisgICAgICogbGV0dGVycyBhbmQgbnVtYmVycykgYW5kIENKSyBjaGFyYWN0ZXJzLiAgVGhpcyByZXN1bHRzIGluICdzIHAgYSBjIGUgZAorICAgICAqIG8gdSB0JyByZW5kZXJpbmcgd2hlbiBhIENKSyAnZml4ZWQgd2lkdGgnIGZvbnQgaXMgdXNlZC4gVG8gd29yayBhcm91bmQKKyAgICAgKiB0aGF0LCBkaXZpZGUgdGhlIHdpZHRoIHJldHVybmVkIGJ5IFBhbmdvIGJ5IDIgaWYgY2prX3dpZHRoIGlzIGVxdWFsIHRvCisgICAgICogd2lkdGggZm9yIENKSyBmb250cy4KKyAgICAgKgorICAgICAqIEZvciByZWxhdGVkIGJ1Z3MsIHNlZToKKyAgICAgKiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDY2MTgKKyAgICAgKiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDY2MjQKKyAgICAgKgorICAgICAqIFdpdGggdGhpcywgZm9yIGFsbCBmb3VyIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMsIFZpbSB3b3JrcyBmaW5lOgorICAgICAqCSAgIGd1aWZvbnQ9Q0pLX2ZpeGVkX3dpZHRoX2ZvbnQKKyAgICAgKgkgICBndWlmb250PU5vbl9DSktfZml4ZWRfZm9udAorICAgICAqCSAgIGd1aWZvbnQ9Tm9uX0NKS19maXhlZF9mb250LENKS19GaXhlZF9mb250CisgICAgICoJICAgZ3VpZm9udD1Ob25fQ0pLX2ZpeGVkX2ZvbnQgZ3VpZm9udHdpZGU9Q0pLX2ZpeGVkX2ZvbnQKKyAgICAgKi8KKyAgICBpZiAoaXNfY2prX2ZvbnQoZ3VpLm5vcm1fZm9udCkpCisgICAgeworCWludCBjamtfd2lkdGg7CisKKwkvKiBNZWFzdXJlIHRoZSB0ZXh0IGV4dGVudCBvZiBVKzRFMDAgYW5kIFUrNEU4QyAqLworCXBhbmdvX2xheW91dF9zZXRfdGV4dChsYXlvdXQsICJcMzQ0XDI3MFwyMDBcMzQ0XDI3MlwyMTQiLCAtMSk7CisJcGFuZ29fbGF5b3V0X2dldF9zaXplKGxheW91dCwgJmNqa193aWR0aCwgTlVMTCk7CisKKwlpZiAod2lkdGggPT0gY2prX3dpZHRoKSAgLyogWGZ0IG5vdCBwYXRjaGVkICovCisJICAgIHdpZHRoIC89IDI7CisgICAgfQorICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICBndWkuY2hhcl93aWR0aCA9ICh3aWR0aCAvIDIgKyBQQU5HT19TQ0FMRSAtIDEpIC8gUEFOR09fU0NBTEU7CisKKyAgICAvKiBBIHplcm8gd2lkdGggbWF5IGNhdXNlIGEgY3Jhc2guCUhhcHBlbnMgZm9yIHNlbWktaW52YWxpZCBmb250c2V0cy4gKi8KKyAgICBpZiAoZ3VpLmNoYXJfd2lkdGggPD0gMCkKKwlndWkuY2hhcl93aWR0aCA9IDg7CisKKyAgICBndWlfbWNoX2FkanVzdF9jaGFyc2l6ZSgpOworCisgICAgLyogU2V0IHRoZSBmb250bmFtZSwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyAqLworICAgIGhsX3NldF9mb250X25hbWUoZm9udF9uYW1lKTsKKworICAgIGdldF9zdHlsZWRfZm9udF92YXJpYW50cygpOworICAgIGFzY2lpX2dseXBoX3RhYmxlX2luaXQoKTsKKworICAgIC8qIEF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkIGlmICdndWlmb250d2lkZScgaXMgZXF1YWwgdG8gJ2d1aWZvbnQnLiAqLworICAgIGlmIChndWkud2lkZV9mb250ICE9IE5VTEwKKwkmJiBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2VxdWFsKGd1aS5ub3JtX2ZvbnQsIGd1aS53aWRlX2ZvbnQpKQorICAgIHsKKwlwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUoZ3VpLndpZGVfZm9udCk7CisJZ3VpLndpZGVfZm9udCA9IE5VTEw7CisgICAgfQorCisjZWxzZSAvKiAhSEFWRV9HVEsyICovCisKKyAgICBHZGtGb250CSpmb250ID0gTlVMTDsKKworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgLyogVHJ5IGxvYWRpbmcgYSBmb250c2V0LiAgSWYgdGhpcyBmYWlscyB3ZSB0cnkgbG9hZGluZyBhIG5vcm1hbCBmb250LiAqLworICAgIGlmIChmb250c2V0ICYmIGZvbnRfbmFtZSAhPSBOVUxMKQorCWZvbnQgPSBndWlfbWNoX2dldF9mb250c2V0KGZvbnRfbmFtZSwgVFJVRSwgVFJVRSk7CisKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorIyBlbmRpZgorICAgIHsKKwkvKiBJZiBmb250X25hbWUgaXMgTlVMTCwgdGhpcyBtZWFucyB0byB1c2UgdGhlIGRlZmF1bHQsIHdoaWNoIHNob3VsZAorCSAqIGJlIHByZXNlbnQgb24gYWxsIFgxMSBzZXJ2ZXJzLiAqLworCWlmIChmb250X25hbWUgPT0gTlVMTCkKKwkgICAgZm9udF9uYW1lID0gKGNoYXJfdSAqKURFRkFVTFRfRk9OVDsKKwlmb250ID0gZ3VpX21jaF9nZXRfZm9udChmb250X25hbWUsIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLm5vcm1fZm9udCk7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBndWlfbWNoX2ZyZWVfZm9udHNldChndWkuZm9udHNldCk7CisgICAgaWYgKGZvbnQtPnR5cGUgPT0gR0RLX0ZPTlRfRk9OVFNFVCkKKyAgICB7CisJZ3VpLm5vcm1fZm9udCA9IE5PRk9OVDsKKwlndWkuZm9udHNldCA9IChHdWlGb250c2V0KWZvbnQ7CisJLyogVXNlIHR3byBieXRlcywgdGhpcyB3b3JrcyBhcm91bmQgdGhlIHByb2JsZW0gdGhhdCB0aGUgcmVzdWx0IHdvdWxkCisJICogYmUgemVybyBpZiBubyA4LWJpdCBmb250IHdhcyBmb3VuZC4gKi8KKwlndWkuY2hhcl93aWR0aCA9IGdka19zdHJpbmdfd2lkdGgoZm9udCwgInhXIikgLyAyOworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisgICAgeworCWd1aS5ub3JtX2ZvbnQgPSBmb250OworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisJZ3VpLmZvbnRzZXQgPSBOT0ZPTlRTRVQ7CisjIGVuZGlmCisJZ3VpLmNoYXJfd2lkdGggPSAoKFhGb250U3RydWN0ICopCisJCQkJICAgICAgR0RLX0ZPTlRfWEZPTlQoZm9udCkpLT5tYXhfYm91bmRzLndpZHRoOworICAgIH0KKworICAgIC8qIEEgemVybyB3aWR0aCBtYXkgY2F1c2UgYSBjcmFzaC4JSGFwcGVucyBmb3Igc2VtaS1pbnZhbGlkIGZvbnRzZXRzLiAqLworICAgIGlmIChndWkuY2hhcl93aWR0aCA8PSAwKQorCWd1aS5jaGFyX3dpZHRoID0gODsKKworICAgIGd1aS5jaGFyX2hlaWdodCA9IGZvbnQtPmFzY2VudCArIGZvbnQtPmRlc2NlbnQgKyBwX2xpbmVzcGFjZTsKKyAgICBndWkuY2hhcl9hc2NlbnQgPSBmb250LT5hc2NlbnQgKyBwX2xpbmVzcGFjZSAvIDI7CisKKyAgICAvKiBBIG5vdC1wb3NpdGl2ZSB2YWx1ZSBvZiBjaGFyX2hlaWdodCBtYXkgY3Jhc2ggVmltLiAgT25seSBoYXBwZW5zCisgICAgICogaWYgJ2xpbmVzcGFjZScgaXMgbmVnYXRpdmUgKHdoaWNoIGRvZXMgbWFrZSBzZW5zZSBzb21ldGltZXMpLiAqLworICAgIGd1aS5jaGFyX2FzY2VudCA9IE1BWChndWkuY2hhcl9hc2NlbnQsIDApOworICAgIGd1aS5jaGFyX2hlaWdodCA9IE1BWChndWkuY2hhcl9oZWlnaHQsIGd1aS5jaGFyX2FzY2VudCArIDEpOworCisgICAgLyogU2V0IHRoZSBmb250bmFtZSwgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyAqLworICAgIGhsX3NldF9mb250X25hbWUoZm9udF9uYW1lKTsKKworICAgIGlmIChmb250LT50eXBlICE9IEdES19GT05UX0ZPTlRTRVQpCisJZ2V0X3N0eWxlZF9mb250X3ZhcmlhbnRzKGZvbnRfbmFtZSk7CisKKyAgICAvKiBTeW5jaHJvbml6ZSB0aGUgZm9udHMgdXNlZCBpbiB1c2VyIGlucHV0IGRpYWxvZ3MsIHNpbmNlIG90aGVyd2lzZQorICAgICAqIHNlYXJjaC9yZXBsYWNlIHdpbGwgYmUgZXNwLiBhbm5veWluZyBpbiBjYXNlIG9mIGludGVybmF0aW9uYWwgZm9udAorICAgICAqIHVzYWdlLgorICAgICAqLworICAgIGd1aV9ndGtfc3luY2hfZm9udHMoKTsKKworIyBpZmRlZiBGRUFUX1hJTQorICAgIC8qIEFkanVzdCBpbnB1dCBtYW5hZ2VtZW50IGJlaGF2aW91ciB0byB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBuZXcKKyAgICAgKiBmb250c2V0ICovCisgICAgeGltX2RlY2lkZV9pbnB1dF9zdHlsZSgpOworICAgIGlmICh4aW1fZ2V0X3N0YXR1c19hcmVhX2hlaWdodCgpKQorICAgIHsKKwkvKiBTdGF0dXMgYXJlYSBpcyByZXF1aXJlZC4gIEp1c3QgY3JlYXRlIHRoZSBlbXB0eSBjb250YWluZXIgc28gdGhhdAorCSAqIG1haW53aW4gd2lsbCBhbGxvY2F0ZSB0aGUgZXh0cmEgc3BhY2UgZm9yIHN0YXR1cyBhcmVhLiAqLworCUd0a1dpZGdldCAqYWxpZ25tZW50ID0gZ3RrX2FsaWdubWVudF9uZXcoKGdmbG9hdCkwLjUsIChnZmxvYXQpMC41LAorCQkJCQkJICAgIChnZmxvYXQpMS4wLCAoZ2Zsb2F0KTEuMCk7CisKKwlndGtfd2lkZ2V0X3NldF91c2l6ZShhbGlnbm1lbnQsIDIwLCBndWkuY2hhcl9oZWlnaHQgKyAyKTsKKwlndGtfYm94X3BhY2tfZW5kKEdUS19CT1goR1RLX0JJTihndWkubWFpbndpbiktPmNoaWxkKSwKKwkJCSBhbGlnbm1lbnQsIEZBTFNFLCBGQUxTRSwgMCk7CisJZ3RrX3dpZGdldF9zaG93KGFsaWdubWVudCk7CisgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworICAgIC8qIFByZXNlcnZlIHRoZSBsb2dpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHNjcmVlbi4gKi8KKyAgICB1cGRhdGVfd2luZG93X21hbmFnZXJfaGludHMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgZm9udCAibmFtZSIuCisgKiBSZXR1cm4gemVybyBmb3IgZmFpbHVyZS4KKyAqLworICAgIEd1aUZvbnQKK2d1aV9tY2hfZ2V0X2ZvbnQoY2hhcl91ICpuYW1lLCBpbnQgcmVwb3J0X2Vycm9yKQoreworI2lmZGVmIEhBVkVfR1RLMgorICAgIFBhbmdvRm9udERlc2NyaXB0aW9uICAgICpmb250OworI2Vsc2UKKyAgICBHZGtGb250CQkgICAgKmZvbnQ7CisjZW5kaWYKKworICAgIC8qIGNhbid0IGRvIHRoaXMgd2hlbiBHVUkgaXMgbm90IHJ1bm5pbmcgKi8KKyAgICBpZiAoIWd1aS5pbl91c2UgfHwgbmFtZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisjaWZkZWYgSEFWRV9HVEsyCisgICAgaWYgKG91dHB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorICAgIHsKKwljaGFyX3UgKmJ1ZjsKKworCWJ1ZiA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgbmFtZSwgTlVMTCk7CisJaWYgKGJ1ZiAhPSBOVUxMKQorCXsKKwkgICAgZm9udCA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9zdHJpbmcoKGNvbnN0IGNoYXIgKilidWYpOworCSAgICB2aW1fZnJlZShidWYpOworCX0KKwllbHNlCisJICAgIGZvbnQgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisJZm9udCA9IHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJvbV9zdHJpbmcoKGNvbnN0IGNoYXIgKiluYW1lKTsKKworICAgIGlmIChmb250ICE9IE5VTEwpCisgICAgeworCVBhbmdvRm9udCAqcmVhbF9mb250OworCisJLyogcGFuZ29fY29udGV4dF9sb2FkX2ZvbnQoKSBiYWlscyBvdXQgaWYgbm8gZm9udCBzaXplIGlzIHNldCAqLworCWlmIChwYW5nb19mb250X2Rlc2NyaXB0aW9uX2dldF9zaXplKGZvbnQpIDw9IDApCisJICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X3NpemUoZm9udCwgMTAgKiBQQU5HT19TQ0FMRSk7CisKKwlyZWFsX2ZvbnQgPSBwYW5nb19jb250ZXh0X2xvYWRfZm9udChndWkudGV4dF9jb250ZXh0LCBmb250KTsKKworCWlmIChyZWFsX2ZvbnQgPT0gTlVMTCkKKwl7CisJICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShmb250KTsKKwkgICAgZm9udCA9IE5VTEw7CisJfQorCWVsc2UKKwkgICAgZ19vYmplY3RfdW5yZWYocmVhbF9mb250KTsKKyAgICB9CisjZWxzZQorICAgIGZvbnQgPSBnZGtfZm9udF9sb2FkKChjb25zdCBnY2hhciAqKW5hbWUpOworI2VuZGlmCisKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorICAgIHsKKwlpZiAocmVwb3J0X2Vycm9yKQorCSAgICBFTVNHMihfKGVfZm9udCksIG5hbWUpOworCXJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIEhBVkVfR1RLMgorICAgIC8qCisgICAgICogVGhlIGZpeGVkLXdpZHRoIGNoZWNrIGhhcyBiZWVuIGRpc2FibGVkIGZvciBHVEsrIDIuICBSYXRpb25hbGU6CisgICAgICoKKyAgICAgKgkgLSBUaGUgY2hlY2sgdGVuZHMgdG8gcmVwb3J0IGZhbHNlIHBvc2l0aXZlcywgcGFydGljdWxhcmx5CisgICAgICoJICAgaW4gbm9uLUxhdGluIGxvY2FsZXMgb3Igd2l0aCBvbGQgWCBmb250cy4KKyAgICAgKgkgLSBUaGFua3MgdG8gb3VyIGZpeGVkLXdpZHRoIGhhY2sgaW4gZ3VpX2d0azJfZHJhd19zdHJpbmcoKSwKKyAgICAgKgkgICBHVEsrIDIgVmltIGlzIGFjdHVhbGx5IGNhcGFibGUgb2YgZGlzcGxheWluZyB2YXJpYWJsZSB3aWR0aAorICAgICAqCSAgIGZvbnRzLiAgVGhvc2Ugd2lsbCBqdXN0IGJlIHNwYWNlZCBvdXQgbGlrZSBpbiBBQSB4dGVybS4KKyAgICAgKgkgLSBGYWlsaW5nIGhlcmUgZm9yIHRoZSBkZWZhdWx0IGZvbnQgY2F1c2VzIEdVSSBzdGFydHVwIHRvIGZhaWwKKyAgICAgKgkgICBldmVuIHdpdGggd2lwZWQgb3V0IGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICoJIC0gVGhlIGZvbnQgZGlhbG9nIGRpc3BsYXlzIGFsbCBmb250cyB1bmZpbHRlcmVkLCBhbmQgaXQncyByYXRoZXIKKyAgICAgKgkgICBhbm5veWluZyBpZiA5NSUgb2YgdGhlIGxpc3RlZCBmb250cyBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICovCisjIGlmIDAKKyAgICB7CisJLyogQ2hlY2sgdGhhdCB0aGlzIGlzIGEgbW9uby1zcGFjZWQgZm9udC4gIE5hdHVyYWxseSwgdGhpcyBpcyBhIGJpdAorCSAqIGhhY2tpc2ggLS0gZml4ZWQtd2lkdGggaXNuJ3QgcmVhbGx5IHN1aXRhYmxlIGZvciBpMThuIHRleHQgOi8gKi8KKwlQYW5nb0xheW91dAkqbGF5b3V0OworCXVuc2lnbmVkIGludAlpOworCWludAkJbGFzdF93aWR0aCAgID0gLTE7CisJY29uc3QgY2hhcgl0ZXN0X2NoYXJzW10gPSB7ICdXJywgJ2knLCAnLCcsICd4JyB9OyAvKiBhcmJpdHJhcnkgKi8KKworCWxheW91dCA9IHBhbmdvX2xheW91dF9uZXcoZ3VpLnRleHRfY29udGV4dCk7CisJcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uKGxheW91dCwgZm9udCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTKHRlc3RfY2hhcnMpOyArK2kpCisJeworCSAgICBpbnQgd2lkdGg7CisKKwkgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgJnRlc3RfY2hhcnNbaV0sIDEpOworCSAgICBwYW5nb19sYXlvdXRfZ2V0X3NpemUobGF5b3V0LCAmd2lkdGgsIE5VTEwpOworCisJICAgIGlmIChsYXN0X3dpZHRoID49IDAgJiYgd2lkdGggIT0gbGFzdF93aWR0aCkKKwkgICAgeworCQlwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUoZm9udCk7CisJCWZvbnQgPSBOVUxMOworCQlicmVhazsKKwkgICAgfQorCisJICAgIGxhc3Rfd2lkdGggPSB3aWR0aDsKKwl9CisKKwlnX29iamVjdF91bnJlZihsYXlvdXQpOworICAgIH0KKyMgZW5kaWYKKyNlbHNlIC8qICFIQVZFX0dUSzIgKi8KKyAgICB7CisJWEZvbnRTdHJ1Y3QgKnhmb250OworCisJLyogcmVmZXJlbmNlIHRoaXMgZm9udCBhcyBiZWluZyBpbiB1c2UgKi8KKwlnZGtfZm9udF9yZWYoZm9udCk7CisKKwkvKiBDaGVjayB0aGF0IHRoaXMgaXMgYSBtb25vLXNwYWNlZCBmb250LgorCSAqLworCXhmb250ID0gKFhGb250U3RydWN0ICopIEdES19GT05UX1hGT05UKGZvbnQpOworCisJaWYgKHhmb250LT5tYXhfYm91bmRzLndpZHRoICE9IHhmb250LT5taW5fYm91bmRzLndpZHRoKQorCXsKKwkgICAgZ2RrX2ZvbnRfdW5yZWYoZm9udCk7CisJICAgIGZvbnQgPSBOVUxMOworCX0KKyAgICB9CisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCisjaWYgIWRlZmluZWQoSEFWRV9HVEsyKSB8fCAwIC8qIGRpc2FibGVkIGZvciBHVEsrIDIsIHNlZSBhYm92ZSAqLworICAgIGlmIChmb250ID09IE5VTEwgJiYgcmVwb3J0X2Vycm9yKQorCUVNU0cyKF8oZV9mb250d2lkdGgpLCBuYW1lKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZvbnQ7Cit9CisKKyNpZiAhZGVmaW5lZChIQVZFX0dUSzIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udC4KKyAqIFNpbmNlIHdlIGNyZWF0ZSBhbGwgR0Mgb24gZGVtYW5kLCB3ZSB1c2UganVzdCBndWkuY3VycmVudF9mb250IHRvCisgKiBpbmRpY2F0ZSB0aGUgZGVzaXJlZCBjdXJyZW50IGZvbnQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb250KEd1aUZvbnQgZm9udCkKK3sKKyAgICBndWkuY3VycmVudF9mb250ID0gZm9udDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1hGT05UU0VUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnRzZXQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb250c2V0KEd1aUZvbnRzZXQgZm9udHNldCkKK3sKKyAgICBndWkuY3VycmVudF9mb250ID0gZm9udHNldDsKK30KKyNlbmRpZgorCisvKgorICogSWYgYSBmb250IGlzIG5vdCBnb2luZyB0byBiZSB1c2VkLCBmcmVlIGl0cyBzdHJ1Y3R1cmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ZyZWVfZm9udChHdWlGb250IGZvbnQpCit7CisgICAgaWYgKGZvbnQgIT0gTk9GT05UKQorI2lmZGVmIEhBVkVfR1RLMgorCXBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShmb250KTsKKyNlbHNlCisJZ2RrX2ZvbnRfdW5yZWYoZm9udCk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVF9YRk9OVFNFVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBJZiBhIGZvbnRzZXQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQsIGZyZWUgaXRzIHN0cnVjdHVyZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZnJlZV9mb250c2V0KEd1aUZvbnRzZXQgZm9udHNldCkKK3sKKyAgICBpZiAoZm9udHNldCAhPSBOT0ZPTlRTRVQpCisJZ2RrX2ZvbnRfdW5yZWYoZm9udHNldCk7Cit9CisjZW5kaWYKKworCisvKgorICogUmV0dXJuIHRoZSBQaXhlbCB2YWx1ZSAoY29sb3IpIGZvciB0aGUgZ2l2ZW4gY29sb3IgbmFtZS4gIFRoaXMgcm91dGluZSB3YXMKKyAqIHByZXR0eSBtdWNoIHRha2VuIGZyb20gZXhhbXBsZSBjb2RlIGluIHRoZSBTaWxpY29uIEdyYXBoaWNzIE9TRi9Nb3RpZgorICogUHJvZ3JhbW1lcidzIEd1aWRlLgorICogUmV0dXJuIElOVkFMQ09MT1IgZm9yIGVycm9yLgorICovCisgICAgZ3VpY29sb3JfVAorZ3VpX21jaF9nZXRfY29sb3IoY2hhcl91ICpuYW1lKQoreworICAgIC8qIEEgbnVtYmVyIG9mIGNvbG9ycyB0aGF0IHNvbWUgWDExIHN5c3RlbXMgZG9uJ3QgaGF2ZSAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2aW1uYW1lc1tdWzJdID0KKyAgICB7CisJeyJMaWdodFJlZCIsCSAiI0ZGQkJCQiJ9LAorCXsiTGlnaHRHcmVlbiIsCSAiIzg4RkY4OCJ9LAorCXsiTGlnaHRNYWdlbnRhIiwgIiNGRkJCRkYifSwKKwl7IkRhcmtDeWFuIiwJICIjMDA4ODg4In0sCisJeyJEYXJrQmx1ZSIsCSAiIzAwMDBCQiJ9LAorCXsiRGFya1JlZCIsCSAiI0JCMDAwMCJ9LAorCXsiRGFya01hZ2VudGEiLCAgIiNCQjAwQkIifSwKKwl7IkRhcmtHcmV5IiwJICIjQkJCQkJCIn0sCisJeyJEYXJrWWVsbG93IiwJICIjQkJCQjAwIn0sCisJe05VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGlmICghZ3VpLmluX3VzZSkJCS8qIGNhbid0IGRvIHRoaXMgd2hlbiBHVUkgbm90IHJ1bm5pbmcgKi8KKwlyZXR1cm4gSU5WQUxDT0xPUjsKKworICAgIHdoaWxlIChuYW1lICE9IE5VTEwpCisgICAgeworCUdka0NvbG9yICAgIGNvbG9yOworCWludAkgICAgcGFyc2VkOworCWludAkgICAgaTsKKworCXBhcnNlZCA9IGdka19jb2xvcl9wYXJzZSgoY29uc3QgY2hhciAqKW5hbWUsICZjb2xvcik7CisKKyNpZm5kZWYgSEFWRV9HVEsyIC8qIG9oaCwgbG92ZWx5IEdUSysgMiwgZWFzZXMgb3VyIHBhaW4gOikgKi8KKwkvKgorCSAqIFNpbmNlIHdlIGhhdmUgYWxyZWFkeSBjYWxsZWQgZ3RrX3NldF9sb2NhbGUgaGVyZSB0aGUgYnVnZ2VyCisJICogWFBhcnNlQ29sb3Igd2lsbCBhY2NlcHQgb25seSBleHBsaWNpdCBjb2xvciBuYW1lcyBpbiB0aGUgbGFuZ3VhZ2UKKwkgKiBvZiB0aGUgY3VycmVudCBsb2NhbGUuICBIb3dldmVyIHRoaXMgd2lsbCBpbnRlcmZlcnJlIHdpdGg6CisJICogMS4gVmltJ3MgZ2xvYmFsIHN0YXJ0dXAgZmlsZXMKKwkgKiAyLiBFeHBsaWNpdCBjb2xvciBuYW1lcyBpbiAudmltcmMKKwkgKgorCSAqIFRoZXJlZm9yZSB3ZSBmaXJzdCB0cnkgdG8gcGFyc2UgdGhlIGNvbG9yIGluIHRoZSBjdXJyZW50IGxvY2FsZSBhbmQKKwkgKiBpZiBpdCBmYWlscywgd2UgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJsZSAiQyIgb25lLgorCSAqLworCWlmICghcGFyc2VkKQorCXsKKwkgICAgY2hhciAqY3VycmVudDsKKworCSAgICBjdXJyZW50ID0gc2V0bG9jYWxlKExDX0FMTCwgTlVMTCk7CisJICAgIGlmIChjdXJyZW50ICE9IE5VTEwpCisJICAgIHsKKwkJY2hhciAqc2F2ZWQ7CisKKwkJc2F2ZWQgPSBnX3N0cmR1cChjdXJyZW50KTsKKwkJc2V0bG9jYWxlKExDX0FMTCwgIkMiKTsKKworCQlwYXJzZWQgPSBnZGtfY29sb3JfcGFyc2UoKGNvbnN0IGdjaGFyICopbmFtZSwgJmNvbG9yKTsKKworCQlzZXRsb2NhbGUoTENfQUxMLCBzYXZlZCk7CisJCWd0a19zZXRfbG9jYWxlKCk7CisKKwkJZ19mcmVlKHNhdmVkKTsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKwlpZiAocGFyc2VkKQorCXsKKyNpZmRlZiBIQVZFX0dUSzIKKwkgICAgZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9yKGd0a193aWRnZXRfZ2V0X2NvbG9ybWFwKGd1aS5kcmF3YXJlYSksCisJCQkJICAgICAmY29sb3IsIEZBTFNFLCBUUlVFKTsKKyNlbHNlCisJICAgIGdka19jb2xvcl9hbGxvYyhndGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndWkuZHJhd2FyZWEpLCAmY29sb3IpOworI2VuZGlmCisJICAgIHJldHVybiAoZ3VpY29sb3JfVCljb2xvci5waXhlbDsKKwl9CisJLyogYWRkIGEgZmV3IGJ1aWx0aW4gbmFtZXMgYW5kIHRyeSBhZ2FpbiAqLworCWZvciAoaSA9IDA7IDsgKytpKQorCXsKKwkgICAgaWYgKHZpbW5hbWVzW2ldWzBdID09IE5VTEwpCisJICAgIHsKKwkJbmFtZSA9IE5VTEw7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChTVFJJQ01QKG5hbWUsIHZpbW5hbWVzW2ldWzBdKSA9PSAwKQorCSAgICB7CisJCW5hbWUgPSAoY2hhcl91ICopdmltbmFtZXNbaV1bMV07CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiBJTlZBTENPTE9SOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9yZWdyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZnX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgZ3VpLmZnY29sb3ItPnBpeGVsID0gKHVuc2lnbmVkIGxvbmcpY29sb3I7Cit9CisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBndWkuYmdjb2xvci0+cGl4ZWwgPSAodW5zaWduZWQgbG9uZyljb2xvcjsKK30KKworI2lmZGVmIEhBVkVfR1RLMgorLyoKKyAqIEZ1bmN0aW9uLWxpa2UgY29udmVuaWVuY2UgbWFjcm8gZm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3kuCisgKi8KKyNkZWZpbmUgSU5TRVJUX1BBTkdPX0FUVFIoQXR0cmlidXRlLCBBdHRyTGlzdCwgU3RhcnQsIEVuZCkgIFwKKyAgICBHX1NUTVRfU1RBUlR7CQkJCQkgICAgXAorCVBhbmdvQXR0cmlidXRlICp0bXBfYXR0cl87CQkJICAgIFwKKwl0bXBfYXR0cl8gPSAoQXR0cmlidXRlKTsJCQkgICAgXAorCXRtcF9hdHRyXy0+c3RhcnRfaW5kZXggPSAoU3RhcnQpOwkJICAgIFwKKwl0bXBfYXR0cl8tPmVuZF9pbmRleCA9IChFbmQpOwkJCSAgICBcCisJcGFuZ29fYXR0cl9saXN0X2luc2VydCgoQXR0ckxpc3QpLCB0bXBfYXR0cl8pOwkgICAgXAorICAgIH1HX1NUTVRfRU5ECisKKyAgICBzdGF0aWMgdm9pZAorYXBwbHlfd2lkZV9mb250X2F0dHIoY2hhcl91ICpzLCBpbnQgbGVuLCBQYW5nb0F0dHJMaXN0ICphdHRyX2xpc3QpCit7CisgICAgY2hhcl91ICAqc3RhcnQgPSBOVUxMOworICAgIGNoYXJfdSAgKnA7CisgICAgaW50CSAgICB1YzsKKworICAgIGZvciAocCA9IHM7IHAgPCBzICsgbGVuOyBwICs9IHV0Zl9ieXRlMmxlbigqcCkpCisgICAgeworCXVjID0gdXRmX3B0cjJjaGFyKHApOworCisJaWYgKHN0YXJ0ID09IE5VTEwpCisJeworCSAgICBpZiAodWMgPj0gMHg4MCAmJiB1dGZfY2hhcjJjZWxscyh1YykgPT0gMikKKwkJc3RhcnQgPSBwOworCX0KKwllbHNlIGlmICh1YyA8IDB4ODAgLyogb3B0aW1pemF0aW9uIHNob3J0Y3V0ICovCisJCSB8fCAodXRmX2NoYXIyY2VsbHModWMpICE9IDIgJiYgIXV0Zl9pc2NvbXBvc2luZyh1YykpKQorCXsKKwkgICAgSU5TRVJUX1BBTkdPX0FUVFIocGFuZ29fYXR0cl9mb250X2Rlc2NfbmV3KGd1aS53aWRlX2ZvbnQpLAorCQkJICAgICAgYXR0cl9saXN0LCBzdGFydCAtIHMsIHAgLSBzKTsKKwkgICAgc3RhcnQgPSBOVUxMOworCX0KKyAgICB9CisKKyAgICBpZiAoc3RhcnQgIT0gTlVMTCkKKwlJTlNFUlRfUEFOR09fQVRUUihwYW5nb19hdHRyX2ZvbnRfZGVzY19uZXcoZ3VpLndpZGVfZm9udCksCisJCQkgIGF0dHJfbGlzdCwgc3RhcnQgLSBzLCBsZW4pOworfQorCisgICAgc3RhdGljIGludAorY291bnRfY2x1c3Rlcl9jZWxscyhjaGFyX3UgKnMsIFBhbmdvSXRlbSAqaXRlbSwKKwkJICAgIFBhbmdvR2x5cGhTdHJpbmcqIGdseXBocywgaW50IGksCisJCSAgICBpbnQgKmNsdXN0ZXJfd2lkdGgsCisJCSAgICBpbnQgKmxhc3RfZ2x5cGhfcmJlYXJpbmcpCit7CisgICAgY2hhcl91ICAqcDsKKyAgICBpbnQJICAgIG5leHQ7CS8qIGdseXBoIHN0YXJ0IGluZGV4IG9mIG5leHQgY2x1c3RlciAqLworICAgIGludAkgICAgc3RhcnQsIGVuZDsgLyogc3RyaW5nIHNlZ21lbnQgb2YgY3VycmVudCBjbHVzdGVyICovCisgICAgaW50CSAgICB3aWR0aDsJLyogcmVhbCBjbHVzdGVyIHdpZHRoIGluIFBhbmdvIHVuaXRzICovCisgICAgaW50CSAgICB1YzsKKyAgICBpbnQJICAgIGNlbGxjb3VudCA9IDA7CisKKyAgICB3aWR0aCA9IGdseXBocy0+Z2x5cGhzW2ldLmdlb21ldHJ5LndpZHRoOworCisgICAgZm9yIChuZXh0ID0gaSArIDE7IG5leHQgPCBnbHlwaHMtPm51bV9nbHlwaHM7ICsrbmV4dCkKKyAgICB7CisJaWYgKGdseXBocy0+Z2x5cGhzW25leHRdLmF0dHIuaXNfY2x1c3Rlcl9zdGFydCkKKwkgICAgYnJlYWs7CisJZWxzZSBpZiAoZ2x5cGhzLT5nbHlwaHNbbmV4dF0uZ2VvbWV0cnkud2lkdGggPiB3aWR0aCkKKwkgICAgd2lkdGggPSBnbHlwaHMtPmdseXBoc1tuZXh0XS5nZW9tZXRyeS53aWR0aDsKKyAgICB9CisKKyAgICBzdGFydCA9IGl0ZW0tPm9mZnNldCArIGdseXBocy0+bG9nX2NsdXN0ZXJzW2ldOworICAgIGVuZCAgID0gaXRlbS0+b2Zmc2V0ICsgKChuZXh0IDwgZ2x5cGhzLT5udW1fZ2x5cGhzKSA/CisJCQkgICAgZ2x5cGhzLT5sb2dfY2x1c3RlcnNbbmV4dF0gOiBpdGVtLT5sZW5ndGgpOworCisgICAgZm9yIChwID0gcyArIHN0YXJ0OyBwIDwgcyArIGVuZDsgcCArPSB1dGZfYnl0ZTJsZW4oKnApKQorICAgIHsKKwl1YyA9IHV0Zl9wdHIyY2hhcihwKTsKKwlpZiAodWMgPCAweDgwKQorCSAgICArK2NlbGxjb3VudDsKKwllbHNlIGlmICghdXRmX2lzY29tcG9zaW5nKHVjKSkKKwkgICAgY2VsbGNvdW50ICs9IHV0Zl9jaGFyMmNlbGxzKHVjKTsKKyAgICB9CisKKyAgICBpZiAobGFzdF9nbHlwaF9yYmVhcmluZyAhPSBOVUxMCisJICAgICYmIGNlbGxjb3VudCA+IDAgJiYgbmV4dCA9PSBnbHlwaHMtPm51bV9nbHlwaHMpCisgICAgeworCVBhbmdvUmVjdGFuZ2xlIGlua19yZWN0OworCS8qCisJICogSWYgYSBjZXJ0YWluIGNvbWJpbmluZyBtYXJrIGhhZCB0byBiZSB0YWtlbiBmcm9tIGEgbm9uLW1vbm9zcGFjZQorCSAqIGZvbnQsIHdlIGhhdmUgdG8gY29tcGVuc2F0ZSBtYW51YWxseSBieSBhZGFwdGluZyB4X29mZnNldCBhY2NvcmRpbmcKKwkgKiB0byB0aGUgaW5rIGV4dGVudHMgb2YgdGhlIHByZXZpb3VzIGdseXBoLgorCSAqLworCXBhbmdvX2ZvbnRfZ2V0X2dseXBoX2V4dGVudHMoaXRlbS0+YW5hbHlzaXMuZm9udCwKKwkJCQkgICAgIGdseXBocy0+Z2x5cGhzW2ldLmdseXBoLAorCQkJCSAgICAgJmlua19yZWN0LCBOVUxMKTsKKworCWlmIChQQU5HT19SQkVBUklORyhpbmtfcmVjdCkgPiAwKQorCSAgICAqbGFzdF9nbHlwaF9yYmVhcmluZyA9IFBBTkdPX1JCRUFSSU5HKGlua19yZWN0KTsKKyAgICB9CisKKyAgICBpZiAoY2VsbGNvdW50ID4gMCkKKwkqY2x1c3Rlcl93aWR0aCA9IHdpZHRoOworCisgICAgcmV0dXJuIGNlbGxjb3VudDsKK30KKworLyoKKyAqIElmIHRoZXJlIGFyZSBvbmx5IGNvbWJpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSBjbHVzdGVyLCB3ZSBjYW5ub3QganVzdAorICogY2hhbmdlIHRoZSB3aWR0aCBvZiB0aGUgcHJldmlvdXMgZ2x5cGggc2luY2UgdGhlcmUgaXMgbm9uZS4JVGhlcmVmb3JlCisgKiBzb21lIGd1ZXNzd29yayBpcyBuZWVkZWQuCisgKgorICogSWYgaW5rX3JlY3QueCBpcyBuZWdhdGl2ZSBQYW5nbyBhcHBhcmVudGx5IGhhcyB0YWtlbiBjYXJlIG9mIHRoZSBjb21wb3NpbmcKKyAqIGJ5IGl0c2VsZi4gIEFjdHVhbGx5IHNldHRpbmcgeF9vZmZzZXQgPSAwIHNob3VsZCBiZSBzdWZmaWNpZW50IHRoZW4sIGJ1dCBkdWUKKyAqIHRvIHByb2JsZW1zIHdpdGggY29tcG9zaW5nIGZyb20gZGlmZmVyZW50IGZvbnRzIHdlIHN0aWxsIG5lZWQgdG8gZmluZS10dW5lCisgKiB4X29mZnNldCB0byBhdm9pZCB1Z2x5bmVzcy4KKyAqCisgKiBJZiBpbmtfcmVjdC54IGlzIG5vdCBuZWdhdGl2ZSwgZm9yY2Ugb3ZlcnN0cmlraW5nIGJ5IHBvaW50aW5nIHhfb2Zmc2V0IHRvCisgKiB0aGUgcG9zaXRpb24gb2YgdGhlIHByZXZpb3VzIGdseXBoLglBcHBhcmVudGx5IHRoaXMgaGFwcGVucyBvbmx5IHdpdGggb2xkCisgKiBYIGZvbnRzIHdoaWNoIGRvbid0IHByb3ZpZGUgdGhlIHNwZWNpYWwgY29tYmluaW5nIGluZm9ybWF0aW9uIG5lZWRlZCBieQorICogUGFuZ28uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0dXBfemVyb193aWR0aF9jbHVzdGVyKFBhbmdvSXRlbSAqaXRlbSwgUGFuZ29HbHlwaEluZm8gKmdseXBoLAorCQkJIGludCBsYXN0X2NlbGxjb3VudCwgaW50IGxhc3RfY2x1c3Rlcl93aWR0aCwKKwkJCSBpbnQgbGFzdF9nbHlwaF9yYmVhcmluZykKK3sKKyAgICBQYW5nb1JlY3RhbmdsZSAgaW5rX3JlY3Q7CisgICAgUGFuZ29SZWN0YW5nbGUgIGxvZ2ljYWxfcmVjdDsKKyAgICBpbnQJCSAgICB3aWR0aDsKKworICAgIHdpZHRoID0gbGFzdF9jZWxsY291bnQgKiBndWkuY2hhcl93aWR0aCAqIFBBTkdPX1NDQUxFOworICAgIGdseXBoLT5nZW9tZXRyeS54X29mZnNldCA9IC13aWR0aCArIE1BWCgwLCB3aWR0aCAtIGxhc3RfY2x1c3Rlcl93aWR0aCkgLyAyOworICAgIGdseXBoLT5nZW9tZXRyeS53aWR0aCA9IDA7CisKKyAgICBwYW5nb19mb250X2dldF9nbHlwaF9leHRlbnRzKGl0ZW0tPmFuYWx5c2lzLmZvbnQsCisJCQkJIGdseXBoLT5nbHlwaCwKKwkJCQkgJmlua19yZWN0LCAmbG9naWNhbF9yZWN0KTsKKyAgICBpZiAoaW5rX3JlY3QueCA8IDApCisgICAgeworCWdseXBoLT5nZW9tZXRyeS54X29mZnNldCArPSBsYXN0X2dseXBoX3JiZWFyaW5nOworCWdseXBoLT5nZW9tZXRyeS55X29mZnNldCAgPSBsb2dpY2FsX3JlY3QuaGVpZ2h0CisJCS0gKGd1aS5jaGFyX2hlaWdodCAtIHBfbGluZXNwYWNlKSAqIFBBTkdPX1NDQUxFOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitkcmF3X2dseXBoX3N0cmluZyhpbnQgcm93LCBpbnQgY29sLCBpbnQgbnVtX2NlbGxzLCBpbnQgZmxhZ3MsCisJCSAgUGFuZ29Gb250ICpmb250LCBQYW5nb0dseXBoU3RyaW5nICpnbHlwaHMpCit7CisgICAgaWYgKCEoZmxhZ3MgJiBEUkFXX1RSQU5TUCkpCisgICAgeworCWdka19nY19zZXRfZm9yZWdyb3VuZChndWkudGV4dF9nYywgZ3VpLmJnY29sb3IpOworCisJZ2RrX2RyYXdfcmVjdGFuZ2xlKGd1aS5kcmF3YXJlYS0+d2luZG93LAorCQkJICAgZ3VpLnRleHRfZ2MsCisJCQkgICBUUlVFLAorCQkJICAgRklMTF9YKGNvbCksCisJCQkgICBGSUxMX1kocm93KSwKKwkJCSAgIG51bV9jZWxscyAqIGd1aS5jaGFyX3dpZHRoLAorCQkJICAgZ3VpLmNoYXJfaGVpZ2h0KTsKKyAgICB9CisKKyAgICBnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsIGd1aS5mZ2NvbG9yKTsKKworICAgIGdka19kcmF3X2dseXBocyhndWkuZHJhd2FyZWEtPndpbmRvdywKKwkJICAgIGd1aS50ZXh0X2djLAorCQkgICAgZm9udCwKKwkJICAgIFRFWFRfWChjb2wpLAorCQkgICAgVEVYVF9ZKHJvdyksCisJCSAgICBnbHlwaHMpOworCisgICAgLyogcmVkcmF3IHRoZSBjb250ZW50cyB3aXRoIGFuIG9mZnNldCBvZiAxIHRvIGVtdWxhdGUgYm9sZCAqLworICAgIGlmICgoZmxhZ3MgJiBEUkFXX0JPTEQpICYmICFndWkuZm9udF9jYW5fYm9sZCkKKwlnZGtfZHJhd19nbHlwaHMoZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQlndWkudGV4dF9nYywKKwkJCWZvbnQsCisJCQlURVhUX1goY29sKSArIDEsCisJCQlURVhUX1kocm93KSwKKwkJCWdseXBocyk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0dUSzIgKi8KKworI2lmIGRlZmluZWQoSEFWRV9HVEsyKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGludAorZ3VpX2d0azJfZHJhd19zdHJpbmcoaW50IHJvdywgaW50IGNvbCwgY2hhcl91ICpzLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgR2RrUmVjdGFuZ2xlCWFyZWE7CQkgICAgLyogYXJlYSBmb3IgY2xpcCBtYXNrCSAgKi8KKyAgICBQYW5nb0dseXBoU3RyaW5nCSpnbHlwaHM7CSAgICAvKiBnbHlwaHMgb2YgY3VycmVudCBpdGVtCSAgKi8KKyAgICBpbnQJCQljb2x1bW5fb2Zmc2V0ID0gMDsgIC8qIGNvbHVtbiBvZmZzZXQgaW4gY2VsbHMJICAqLworICAgIGludAkJCWk7CisgICAgY2hhcl91CQkqY29udl9idWYgPSBOVUxMOyAgIC8qIHJlc3VsdCBvZiBVVEYtOCBjb252ZXJzaW9uICovCisgICAgY2hhcl91CQkqbmV3X2NvbnZfYnVmOworICAgIGludAkJCWNvbnZsZW47CisgICAgY2hhcl91CQkqc3AsICpicDsKKyAgICBpbnQJCQlwbGVuOworCisgICAgaWYgKGd1aS50ZXh0X2NvbnRleHQgPT0gTlVMTCB8fCBndWkuZHJhd2FyZWEtPndpbmRvdyA9PSBOVUxMKQorCXJldHVybiBsZW47CisKKyAgICBpZiAob3V0cHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisgICAgeworCS8qCisJICogQ29udmVydCBjaGFyYWN0ZXJzIGZyb20gJ2VuY29kaW5nJyB0byAndGVybWVuY29kaW5nJywgd2hpY2ggaXMgc2V0CisJICogdG8gVVRGLTggYnkgZ3VpX21jaF9pbml0KCkuCWRpZF9zZXRfc3RyaW5nX29wdGlvbigpIGluIG9wdGlvbi5jCisJICogcHJvaGliaXRzIGNoYW5naW5nIHRoaXMgdG8gc29tZXRoaW5nIGVsc2UgdGhhbiBVVEYtOCBpZiB0aGUgR1VJIGlzCisJICogaW4gdXNlLgorCSAqLworCWNvbnZsZW4gPSBsZW47CisJY29udl9idWYgPSBzdHJpbmdfY29udmVydCgmb3V0cHV0X2NvbnYsIHMsICZjb252bGVuKTsKKwlnX3JldHVybl92YWxfaWZfZmFpbChjb252X2J1ZiAhPSBOVUxMLCBsZW4pOworCisJLyogQ29ycmVjdCBmb3IgZGlmZmVyZW5jZXMgaW4gY2hhciB3aWR0aDogc29tZSBjaGFycyBhcmUKKwkgKiBkb3VibGUtd2lkZSBpbiAnZW5jb2RpbmcnIGJ1dCBzaW5nbGUtd2lkZSBpbiB1dGYtOC4gIEFkZCBhIHNwYWNlIHRvCisJICogY29tcGVuc2F0ZSBmb3IgdGhhdC4gKi8KKwlmb3IgKHNwID0gcywgYnAgPSBjb252X2J1Zjsgc3AgPCBzICsgbGVuICYmIGJwIDwgY29udl9idWYgKyBjb252bGVuOyApCisJeworCSAgICBwbGVuID0gdXRmX3B0cjJsZW5fY2hlY2soYnApOworCSAgICBpZiAoKCptYl9wdHIyY2VsbHMpKHNwKSA9PSAyICYmIHV0Zl9wdHIyY2VsbHMoYnApID09IDEpCisJICAgIHsKKwkJbmV3X2NvbnZfYnVmID0gYWxsb2MoY29udmxlbiArIDIpOworCQlpZiAobmV3X2NvbnZfYnVmID09IE5VTEwpCisJCSAgICByZXR1cm4gbGVuOworCQlwbGVuICs9IGJwIC0gY29udl9idWY7CisJCW1jaF9tZW1tb3ZlKG5ld19jb252X2J1ZiwgY29udl9idWYsIHBsZW4pOworCQluZXdfY29udl9idWZbcGxlbl0gPSAnICc7CisJCW1jaF9tZW1tb3ZlKG5ld19jb252X2J1ZiArIHBsZW4gKyAxLCBjb252X2J1ZiArIHBsZW4sCisJCQkJCQkJICBjb252bGVuIC0gcGxlbiArIDEpOworCQl2aW1fZnJlZShjb252X2J1Zik7CisJCWNvbnZfYnVmID0gbmV3X2NvbnZfYnVmOworCQkrK2NvbnZsZW47CisJCWJwID0gY29udl9idWYgKyBwbGVuOworCQlwbGVuID0gMTsKKwkgICAgfQorCSAgICBzcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHNwKTsKKwkgICAgYnAgKz0gcGxlbjsKKwl9CisJcyA9IGNvbnZfYnVmOworCWxlbiA9IGNvbnZsZW47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0cmljdCBhbGwgZHJhd2luZyB0byB0aGUgY3VycmVudCBzY3JlZW4gbGluZSBpbiBvcmRlciB0byBwcmV2ZW50CisgICAgICogZnV6enkgZm9udCBsb29rdXBzIGZyb20gbWVzc2luZyB1cCB0aGUgc2NyZWVuLgorICAgICAqLworICAgIGFyZWEueCA9IGd1aS5ib3JkZXJfb2Zmc2V0OworICAgIGFyZWEueSA9IEZJTExfWShyb3cpOworICAgIGFyZWEud2lkdGgJPSBndWkubnVtX2NvbHMgKiBndWkuY2hhcl93aWR0aDsKKyAgICBhcmVhLmhlaWdodCA9IGd1aS5jaGFyX2hlaWdodDsKKworICAgIGdka19nY19zZXRfY2xpcF9vcmlnaW4oZ3VpLnRleHRfZ2MsIDAsIDApOworICAgIGdka19nY19zZXRfY2xpcF9yZWN0YW5nbGUoZ3VpLnRleHRfZ2MsICZhcmVhKTsKKworICAgIGdseXBocyA9IHBhbmdvX2dseXBoX3N0cmluZ19uZXcoKTsKKworICAgIC8qCisgICAgICogT3B0aW1pemF0aW9uIGhhY2s6ICBJZiBwb3NzaWJsZSwgc2tpcCB0aGUgaXRlbWl6ZSBhbmQgc2hhcGluZyBwcm9jZXNzCisgICAgICogZm9yIHB1cmUgQVNDSUkgc3RyaW5ncy4JVGhpcyBvcHRpbWl6YXRpb24gaXMgcGFydGljdWxhcmx5IGVmZmVjdGl2ZQorICAgICAqIGJlY2F1c2UgVmltIGRyYXdzIHNwYWNlIGNoYXJhY3RlcnMgdG8gY2xlYXIgcGFydHMgb2YgdGhlIHNjcmVlbi4KKyAgICAgKi8KKyAgICBpZiAoIShmbGFncyAmIERSQVdfSVRBTElDKQorCSAgICAmJiAhKChmbGFncyAmIERSQVdfQk9MRCkgJiYgZ3VpLmZvbnRfY2FuX2JvbGQpCisJICAgICYmIGd1aS5hc2NpaV9nbHlwaHMgIT0gTlVMTCkKKyAgICB7CisJY2hhcl91ICpwOworCisJZm9yIChwID0gczsgcCA8IHMgKyBsZW47ICsrcCkKKwkgICAgaWYgKCpwICYgMHg4MCkKKwkJZ290byBub3RfYXNjaWk7CisKKwlwYW5nb19nbHlwaF9zdHJpbmdfc2V0X3NpemUoZ2x5cGhzLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCXsKKwkgICAgZ2x5cGhzLT5nbHlwaHNbaV0gPSBndWkuYXNjaWlfZ2x5cGhzLT5nbHlwaHNbc1tpXV07CisJICAgIGdseXBocy0+bG9nX2NsdXN0ZXJzW2ldID0gaTsKKwl9CisKKwlkcmF3X2dseXBoX3N0cmluZyhyb3csIGNvbCwgbGVuLCBmbGFncywgZ3VpLmFzY2lpX2ZvbnQsIGdseXBocyk7CisKKwljb2x1bW5fb2Zmc2V0ID0gbGVuOworICAgIH0KKyAgICBlbHNlCitub3RfYXNjaWk6CisgICAgeworCVBhbmdvQXR0ckxpc3QJKmF0dHJfbGlzdDsKKwlHTGlzdAkJKml0ZW1fbGlzdDsKKwlpbnQJCWNsdXN0ZXJfd2lkdGg7CisJaW50CQlsYXN0X2dseXBoX3JiZWFyaW5nOworCWludAkJY2VsbHMgPSAwOyAgLyogY2VsbHMgb2NjdXBpZWQgYnkgY3VycmVudCBjbHVzdGVyICovCisKKwkvKiBvcmlnaW5hbCB3aWR0aCBvZiB0aGUgY3VycmVudCBjbHVzdGVyICovCisJY2x1c3Rlcl93aWR0aCA9IFBBTkdPX1NDQUxFICogZ3VpLmNoYXJfd2lkdGg7CisKKwkvKiByaWdodCBiZWFyaW5nIG9mIHRoZSBsYXN0IG5vbi1jb21wb3NpbmcgZ2x5cGggKi8KKwlsYXN0X2dseXBoX3JiZWFyaW5nID0gUEFOR09fU0NBTEUgKiBndWkuY2hhcl93aWR0aDsKKworCWF0dHJfbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXcoKTsKKworCS8qIElmICdndWlmb250d2lkZScgaXMgc2V0IHRoZW4gdXNlIHRoYXQgZm9yIGRvdWJsZS13aWR0aCBjaGFyYWN0ZXJzLgorCSAqIE90aGVyd2lzZSBqdXN0IGdvIHdpdGggJ2d1aWZvbnQnIGFuZCBsZXQgUGFuZ28gZG8gaXRzIHRoaW5nLiAqLworCWlmIChndWkud2lkZV9mb250ICE9IE5VTEwpCisJICAgIGFwcGx5X3dpZGVfZm9udF9hdHRyKHMsIGxlbiwgYXR0cl9saXN0KTsKKworCWlmICgoZmxhZ3MgJiBEUkFXX0JPTEQpICYmIGd1aS5mb250X2Nhbl9ib2xkKQorCSAgICBJTlNFUlRfUEFOR09fQVRUUihwYW5nb19hdHRyX3dlaWdodF9uZXcoUEFOR09fV0VJR0hUX0JPTEQpLAorCQkJICAgICAgYXR0cl9saXN0LCAwLCBsZW4pOworCWlmIChmbGFncyAmIERSQVdfSVRBTElDKQorCSAgICBJTlNFUlRfUEFOR09fQVRUUihwYW5nb19hdHRyX3N0eWxlX25ldyhQQU5HT19TVFlMRV9JVEFMSUMpLAorCQkJICAgICAgYXR0cl9saXN0LCAwLCBsZW4pOworCS8qCisJICogQnJlYWsgdGhlIHRleHQgaW50byBzZWdtZW50cyB3aXRoIGNvbnNpc3RlbnQgZGlyZWN0aW9uYWwgbGV2ZWwKKwkgKiBhbmQgc2hhcGluZyBlbmdpbmUuCVB1cmUgTGF0aW4gdGV4dCBuZWVkcyBvbmx5IGEgc2luZ2xlIHNlZ21lbnQsCisJICogc28gdGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBsb29wJ3MgZWZmaWNpZW5jeS4gIEJldHRlcgorCSAqIHRyeSB0byBvcHRpbWl6ZSBlbHNld2hlcmUsIGUuZy4gcmVkdWNpbmcgZXhwb3NlcyBhbmQgc3R1ZmYgOikKKwkgKi8KKwlpdGVtX2xpc3QgPSBwYW5nb19pdGVtaXplKGd1aS50ZXh0X2NvbnRleHQsCisJCQkJICAoY29uc3QgY2hhciAqKXMsIDAsIGxlbiwgYXR0cl9saXN0LCBOVUxMKTsKKworCXdoaWxlIChpdGVtX2xpc3QgIT0gTlVMTCkKKwl7CisJICAgIFBhbmdvSXRlbQkqaXRlbTsKKwkgICAgaW50CQlpdGVtX2NlbGxzID0gMDsgLyogaXRlbSBsZW5ndGggaW4gY2VsbHMgKi8KKworCSAgICBpdGVtID0gKFBhbmdvSXRlbSAqKWl0ZW1fbGlzdC0+ZGF0YTsKKwkgICAgaXRlbV9saXN0ID0gZ19saXN0X2RlbGV0ZV9saW5rKGl0ZW1fbGlzdCwgaXRlbV9saXN0KTsKKwkgICAgLyoKKwkgICAgICogSW5jcmVtZW50IHRoZSBiaWRpcmVjdGlvbmFsIGVtYmVkZGluZyBsZXZlbCBieSAxIGlmIGl0IGlzIG5vdAorCSAgICAgKiBldmVuLiAgQW4gb2RkIG51bWJlciBtZWFucyB0aGUgb3V0cHV0IHdpbGwgYmUgUlRMLCBidXQgd2UgZG9uJ3QKKwkgICAgICogd2FudCB0aGF0IHNpbmNlIFZpbSBoYW5kbGVzIHJpZ2h0LXRvLWxlZnQgdGV4dCBvbiBpdHMgb3duLiAgSXQKKwkgICAgICogd291bGQgcHJvYmFibHkgYmUgc3VmZmljaWVudCB0byBqdXN0IHNldCBsZXZlbCA9IDAsIGJ1dCB5b3UgY2FuCisJICAgICAqIG5ldmVyIGtub3cgOikKKwkgICAgICoKKwkgICAgICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB0YWtlIGFkdmFudGFnZSBvZiBQYW5nbydzIGFiaWxpdHkgdG8KKwkgICAgICogcmVuZGVyIGJvdGggTFRSIGFuZCBSVEwgYXQgdGhlIHNhbWUgdGltZS4gIEluIG9yZGVyIHRvIHN1cHBvcnQKKwkgICAgICogdGhhdCwgVmltJ3MgbWFpbiBzY3JlZW4gZW5naW5lIHdvdWxkIGhhdmUgdG8gbWFrZSB1c2Ugb2YgUGFuZ28KKwkgICAgICogZnVuY3Rpb25hbGl0eS4KKwkgICAgICovCisJICAgIGl0ZW0tPmFuYWx5c2lzLmxldmVsID0gKGl0ZW0tPmFuYWx5c2lzLmxldmVsICsgMSkgJiAofjFVKTsKKworCSAgICAvKiBIQUNLOiBPdmVycnVsZSB0aGUgc2hhcGUgZW5naW5lLCB3ZSBkb24ndCB3YW50IHNoYXBpbmcgdG8gYmUKKwkgICAgICogZG9uZSwgYmVjYXVzZSBkcmF3aW5nIHRoZSBjdXJzb3Igd291bGQgY2hhbmdlIHRoZSBkaXNwbGF5LiAqLworCSAgICBpdGVtLT5hbmFseXNpcy5zaGFwZV9lbmdpbmUgPSBkZWZhdWx0X3NoYXBlX2VuZ2luZTsKKworCSAgICBwYW5nb19zaGFwZSgoY29uc3QgY2hhciAqKXMgKyBpdGVtLT5vZmZzZXQsIGl0ZW0tPmxlbmd0aCwKKwkJCSZpdGVtLT5hbmFseXNpcywgZ2x5cGhzKTsKKwkgICAgLyoKKwkgICAgICogRml4ZWQtd2lkdGggaGFjazogaXRlcmF0ZSBvdmVyIHRoZSBhcnJheSBhbmQgYXNzaWduIGEgZml4ZWQKKwkgICAgICogd2lkdGggdG8gZWFjaCBnbHlwaCwgdGh1cyBvdmVycmlkaW5nIHRoZSBjaG9pY2UgbWFkZSBieSB0aGUKKwkgICAgICogc2hhcGluZyBlbmdpbmUuCVdlIHVzZSB1dGZfY2hhcjJjZWxscygpIHRvIGRldGVybWluZSB0aGUKKwkgICAgICogbnVtYmVyIG9mIGNlbGxzIG5lZWRlZC4KKwkgICAgICoKKwkgICAgICogQWxzbyBwZXJmb3JtIGFsbCBraW5kIG9mIGRhcmsgbWFnaWMgdG8gZ2V0IGNvbXBvc2luZworCSAgICAgKiBjaGFyYWN0ZXJzIHJpZ2h0IChhbmQgcHJldHR5IHRvbyBvZiBjb3Vyc2UpLgorCSAgICAgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IGdseXBocy0+bnVtX2dseXBoczsgKytpKQorCSAgICB7CisJCVBhbmdvR2x5cGhJbmZvICpnbHlwaDsKKworCQlnbHlwaCA9ICZnbHlwaHMtPmdseXBoc1tpXTsKKworCQlpZiAoZ2x5cGgtPmF0dHIuaXNfY2x1c3Rlcl9zdGFydCkKKwkJeworCQkgICAgaW50IGNlbGxjb3VudDsKKworCQkgICAgY2VsbGNvdW50ID0gY291bnRfY2x1c3Rlcl9jZWxscygKKwkJCXMsIGl0ZW0sIGdseXBocywgaSwgJmNsdXN0ZXJfd2lkdGgsCisJCQkoaXRlbV9saXN0ICE9IE5VTEwpID8gJmxhc3RfZ2x5cGhfcmJlYXJpbmcgOiBOVUxMKTsKKworCQkgICAgaWYgKGNlbGxjb3VudCA+IDApCisJCSAgICB7CisJCQlpbnQgd2lkdGg7CisKKwkJCXdpZHRoID0gY2VsbGNvdW50ICogZ3VpLmNoYXJfd2lkdGggKiBQQU5HT19TQ0FMRTsKKwkJCWdseXBoLT5nZW9tZXRyeS54X29mZnNldCArPQorCQkJCQkgICAgTUFYKDAsIHdpZHRoIC0gY2x1c3Rlcl93aWR0aCkgLyAyOworCQkJZ2x5cGgtPmdlb21ldHJ5LndpZHRoID0gd2lkdGg7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQkvKiBJZiB0aGVyZSBhcmUgb25seSBjb21iaW5pbmcgY2hhcmFjdGVycyBpbiB0aGUKKwkJCSAqIGNsdXN0ZXIsIHdlIGNhbm5vdCBqdXN0IGNoYW5nZSB0aGUgd2lkdGggb2YgdGhlCisJCQkgKiBwcmV2aW91cyBnbHlwaCBzaW5jZSB0aGVyZSBpcyBub25lLglUaGVyZWZvcmUKKwkJCSAqIHNvbWUgZ3Vlc3N3b3JrIGlzIG5lZWRlZC4gKi8KKwkJCXNldHVwX3plcm9fd2lkdGhfY2x1c3RlcihpdGVtLCBnbHlwaCwgY2VsbHMsCisJCQkJCQkgY2x1c3Rlcl93aWR0aCwKKwkJCQkJCSBsYXN0X2dseXBoX3JiZWFyaW5nKTsKKwkJICAgIH0KKworCQkgICAgaXRlbV9jZWxscyArPSBjZWxsY291bnQ7CisJCSAgICBjZWxscyA9IGNlbGxjb3VudDsKKwkJfQorCQllbHNlIGlmIChpID4gMCkKKwkJeworCQkgICAgaW50IHdpZHRoOworCisJCSAgICAvKiBUaGVyZSBpcyBhIHByZXZpb3VzIGdseXBoLCBzbyB3ZSBkZWFsIHdpdGggY29tYmluaW5nCisJCSAgICAgKiBjaGFyYWN0ZXJzIHRoZSBjYW5vbmljYWwgd2F5LiAgVGhhdCBpcywgc2V0dGluZyB0aGUKKwkJICAgICAqIHdpZHRoIG9mIHRoZSBwcmV2aW91cyBnbHlwaCB0byAwLiAqLworCQkgICAgZ2x5cGhzLT5nbHlwaHNbaSAtIDFdLmdlb21ldHJ5LndpZHRoID0gMDsKKworCQkgICAgd2lkdGggPSBjZWxscyAqIGd1aS5jaGFyX3dpZHRoICogUEFOR09fU0NBTEU7CisJCSAgICBnbHlwaC0+Z2VvbWV0cnkueF9vZmZzZXQgKz0KKwkJCQkJICAgIE1BWCgwLCB3aWR0aCAtIGNsdXN0ZXJfd2lkdGgpIC8gMjsKKwkJICAgIGdseXBoLT5nZW9tZXRyeS53aWR0aCA9IHdpZHRoOworCQl9CisJCWVsc2UgLyogaSA9PSAwICJjYW5ub3QgaGFwcGVuIiAqLworCQl7CisJCSAgICBnbHlwaC0+Z2VvbWV0cnkud2lkdGggPSAwOworCQl9CisJICAgIH0KKworCSAgICAvKioqIEFhYWFhbmQgYWN0aW9uISAqKiovCisJICAgIGRyYXdfZ2x5cGhfc3RyaW5nKHJvdywgY29sICsgY29sdW1uX29mZnNldCwgaXRlbV9jZWxscywKKwkJCSAgICAgIGZsYWdzLCBpdGVtLT5hbmFseXNpcy5mb250LCBnbHlwaHMpOworCisJICAgIHBhbmdvX2l0ZW1fZnJlZShpdGVtKTsKKworCSAgICBjb2x1bW5fb2Zmc2V0ICs9IGl0ZW1fY2VsbHM7CisJfQorCisJcGFuZ29fYXR0cl9saXN0X3VucmVmKGF0dHJfbGlzdCk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRFJBV19VTkRFUkwpCisJZ2RrX2RyYXdfbGluZShndWkuZHJhd2FyZWEtPndpbmRvdywKKwkJICAgICAgZ3VpLnRleHRfZ2MsCisJCSAgICAgIEZJTExfWChjb2wpLAorCQkgICAgICBGSUxMX1kocm93ICsgMSkgLSAxLAorCQkgICAgICBGSUxMX1goY29sICsgY29sdW1uX29mZnNldCkgLSAxLAorCQkgICAgICBGSUxMX1kocm93ICsgMSkgLSAxKTsKKworICAgIHBhbmdvX2dseXBoX3N0cmluZ19mcmVlKGdseXBocyk7CisgICAgdmltX2ZyZWUoY29udl9idWYpOworCisgICAgZ2RrX2djX3NldF9jbGlwX3JlY3RhbmdsZShndWkudGV4dF9nYywgTlVMTCk7CisKKyAgICByZXR1cm4gY29sdW1uX29mZnNldDsKK30KKyNlbmRpZiAvKiBIQVZFX0dUSzIgKi8KKworI2lmICFkZWZpbmVkKEhBVkVfR1RLMikgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX2RyYXdfc3RyaW5nKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKQoreworICAgIHN0YXRpYyBYQ2hhcjJiCSpidWYgPSBOVUxMOworICAgIHN0YXRpYyBpbnQJCWJ1ZmxlbiA9IDA7CisgICAgaW50CQkJaXNfd2lkZTsKKyAgICBYQ2hhcjJiCQkqdGV4dDsKKyAgICBpbnQJCQl0ZXh0bGVuOworICAgIFhGb250U3RydWN0CQkqeGZvbnQ7CisgICAgY2hhcl91CQkqcDsKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIHVuc2lnbmVkCQljOworIyBlbmRpZgorICAgIGludAkJCXdpZHRoOworCisgICAgaWYgKGd1aS5jdXJyZW50X2ZvbnQgPT0gTlVMTCB8fCBndWkuZHJhd2FyZWEtPndpbmRvdyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogWWVhaCB5ZWFoIGFwcGFyZW50bHkgdGhlIGZvbnQgc3VwcG9ydCBpbiBHVEsrIDEuMiBvbmx5IGNhcmVzIGZvciBlaXRoZXI6CisgICAgICogYXNpYW5zIG9yIDgtYml0IGZvbnRzLiBJdCBpcyBicm9rZW4gdGhlcmUsIGJ1dCBubyB3b25kZXIgdGhlIHdob2xlIGZvbnQKKyAgICAgKiBzdHVmZiBpcyBicm9rZW4gaW4gWDExIGluIGZpcnN0IHBsYWNlLiBBbmQgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIEFQSQorICAgICAqIGlzbid0IHNvbWV0aGluZyB5b3Ugd291bGQgcmVhbGx5IGxpa2UgdG8gdXNlLgorICAgICAqLworCisgICAgeGZvbnQgPSAoWEZvbnRTdHJ1Y3QgKikoKEdka0ZvbnRQcml2YXRlKilndWkuY3VycmVudF9mb250KS0+eGZvbnQ7CisgICAgaXNfd2lkZSA9ICgoeGZvbnQtPm1pbl9ieXRlMSAhPSAwIHx8IHhmb250LT5tYXhfYnl0ZTEgIT0gMCkKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorCSAgICAmJiBndWkuZm9udHNldCA9PSBOT0ZPTlRTRVQKKyMgZW5kaWYKKwkgICAgKTsKKworICAgIGlmIChpc193aWRlKQorICAgIHsKKwkvKiBDb252ZXJ0IGEgYnl0ZSBzZXF1ZW5jZSB0byAxNiBiaXQgY2hhcmFjdGVycyBmb3IgdGhlIEdkayBmdW5jdGlvbnMuCisJICogTmVlZCBhIGJ1ZmZlciBmb3IgdGhlIDE2IGJpdCBjaGFyYWN0ZXJzLiAgS2VlcCBpdCBiZXR3ZWVuIGNhbGxzLAorCSAqIGJlY2F1c2UgYWxsb2NhdGluZyBpdCBlYWNoIHRpbWUgaXMgc2xvdy4gKi8KKwlpZiAoYnVmbGVuIDwgbGVuKQorCXsKKwkgICAgWHRGcmVlKChjaGFyICopYnVmKTsKKwkgICAgYnVmID0gKFhDaGFyMmIgKilYdE1hbGxvYyhsZW4gKiBzaXplb2YoWENoYXIyYikpOworCSAgICBidWZsZW4gPSBsZW47CisJfQorCisJcCA9IHM7CisJdGV4dGxlbiA9IDA7CisJd2lkdGggPSAwOworCXdoaWxlIChwIDwgcyArIGxlbikKKwl7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGVuY191dGY4KQorCSAgICB7CisJCWMgPSB1dGZfcHRyMmNoYXIocCk7CisJCWlmIChjID49IDB4MTAwMDApCS8qIHNob3cgY2hhcnMgPiAweGZmZmYgYXMgPyAqLworCQkgICAgYyA9IDB4YmY7CisJCWJ1Zlt0ZXh0bGVuXS5ieXRlMSA9IGMgPj4gODsKKwkJYnVmW3RleHRsZW5dLmJ5dGUyID0gYzsKKwkJcCArPSB1dGZfcHRyMmxlbl9jaGVjayhwKTsKKwkJd2lkdGggKz0gdXRmX2NoYXIyY2VsbHMoYyk7CisJICAgIH0KKwkgICAgZWxzZQorIyBlbmRpZgorCSAgICB7CisJCWJ1Zlt0ZXh0bGVuXS5ieXRlMSA9ICdcMCc7CS8qIGhpZ2ggZWlnaHQgYml0cyAqLworCQlidWZbdGV4dGxlbl0uYnl0ZTIgPSAqcDsJLyogbG93IGVpZ2h0IGJpdHMgKi8KKwkJKytwOworCQkrK3dpZHRoOworCSAgICB9CisJICAgICsrdGV4dGxlbjsKKwl9CisJdGV4dCA9IGJ1ZjsKKwl0ZXh0bGVuID0gdGV4dGxlbiAqIDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdGV4dCA9IChYQ2hhcjJiICopczsKKwl0ZXh0bGVuID0gbGVuOworIyBpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIHdpZHRoID0gMDsKKwkgICAgZm9yIChwID0gczsgcCA8IHMgKyBsZW47IHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkKKwkJd2lkdGggKz0gKCptYl9wdHIyY2VsbHMpKHApOworCX0KKwllbHNlCisjIGVuZGlmCisJICAgIHdpZHRoID0gbGVuOworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgRFJBV19UUkFOU1ApKQorICAgIHsKKwlnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsIGd1aS5iZ2NvbG9yKTsKKwlnZGtfZHJhd19yZWN0YW5nbGUoZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQkgICBndWkudGV4dF9nYywKKwkJCSAgIFRSVUUsCisJCQkgICBGSUxMX1goY29sKSwgRklMTF9ZKHJvdyksCisJCQkgICB3aWR0aCAqIGd1aS5jaGFyX3dpZHRoLCBndWkuY2hhcl9oZWlnaHQpOworICAgIH0KKyAgICBnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsIGd1aS5mZ2NvbG9yKTsKKyAgICBnZGtfZHJhd190ZXh0KGd1aS5kcmF3YXJlYS0+d2luZG93LAorCQkgIGd1aS5jdXJyZW50X2ZvbnQsCisJCSAgZ3VpLnRleHRfZ2MsCisJCSAgVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpLAorCQkgIChjb25zdCBnY2hhciAqKXRleHQsIHRleHRsZW4pOworCisgICAgLyogcmVkcmF3IHRoZSBjb250ZW50cyB3aXRoIGFuIG9mZnNldCBvZiAxIHRvIGVtdWxhdGUgYm9sZCAqLworICAgIGlmIChmbGFncyAmIERSQVdfQk9MRCkKKwlnZGtfZHJhd190ZXh0KGd1aS5kcmF3YXJlYS0+d2luZG93LAorCQkgICAgICBndWkuY3VycmVudF9mb250LAorCQkgICAgICBndWkudGV4dF9nYywKKwkJICAgICAgVEVYVF9YKGNvbCkgKyAxLCBURVhUX1kocm93KSwKKwkJICAgICAgKGNvbnN0IGdjaGFyICopdGV4dCwgdGV4dGxlbik7CisKKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkKKyAgICB7CisJZ2RrX2RyYXdfbGluZShndWkuZHJhd2FyZWEtPndpbmRvdywKKwkJICAgICAgZ3VpLnRleHRfZ2MsIEZJTExfWChjb2wpLAorCUZJTExfWShyb3cgKyAxKSAtIDEsIEZJTExfWChjb2wgKyB3aWR0aCkgLSAxLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKKyAgICB9Cit9CisjZW5kaWYgLyogIUhBVkVfR1RLMiAqLworCisvKgorICogUmV0dXJuIE9LIGlmIHRoZSBrZXkgd2l0aCB0aGUgdGVybWNhcCBuYW1lICJuYW1lIiBpcyBzdXBwb3J0ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KGNoYXJfdSAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IDA7IGkrKykKKwlpZiAobmFtZVswXSA9PSBzcGVjaWFsX2tleXNbaV0uY29kZTAKKwkJJiYgbmFtZVsxXSA9PSBzcGVjaWFsX2tleXNbaV0uY29kZTEpCisJICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9USVRMRSkgXAorCXx8IChkZWZpbmVkKEZFQVRfWElNKSAmJiAhZGVmaW5lZChIQVZFX0dUSzIpKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gdGhlIHRleHQgd2luZG93LWlkIGFuZCBkaXNwbGF5LiAgT25seSByZXF1aXJlZCBmb3IgWC1iYXNlZCBHVUkncworICovCisgICAgaW50CitndWlfZ2V0X3gxMV93aW5kaXMoV2luZG93ICp3aW4sIERpc3BsYXkgKipkaXMpCit7CisgICAgaWYgKGd1aS5tYWlud2luICE9IE5VTEwgJiYgZ3VpLm1haW53aW4tPndpbmRvdyAhPSBOVUxMKQorICAgIHsKKwkqZGlzID0gR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KTsKKwkqd2luID0gR0RLX1dJTkRPV19YV0lORE9XKGd1aS5tYWlud2luLT53aW5kb3cpOworCXJldHVybiBPSzsKKyAgICB9CisKKyAgICAqZGlzID0gTlVMTDsKKyAgICAqd2luID0gMDsKKyAgICByZXR1cm4gRkFJTDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikgXAorCXx8IChkZWZpbmVkKEZFQVRfWDExKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSkgfHwgZGVmaW5lZChQUk9UTykKKworICAgIERpc3BsYXkgKgorZ3VpX21jaF9nZXRfZGlzcGxheSh2b2lkKQoreworICAgIGlmIChndWkubWFpbndpbiAhPSBOVUxMICYmIGd1aS5tYWlud2luLT53aW5kb3cgIT0gTlVMTCkKKwlyZXR1cm4gR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KTsKKyAgICBlbHNlCisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfYmVlcCh2b2lkKQoreworI2lmZGVmIEhBVkVfR1RLX01VTFRJSEVBRAorICAgIEdka0Rpc3BsYXkgKmRpc3BsYXk7CisKKyAgICBpZiAoZ3VpLm1haW53aW4gIT0gTlVMTCAmJiBHVEtfV0lER0VUX1JFQUxJWkVEKGd1aS5tYWlud2luKSkKKwlkaXNwbGF5ID0gZ3RrX3dpZGdldF9nZXRfZGlzcGxheShndWkubWFpbndpbik7CisgICAgZWxzZQorCWRpc3BsYXkgPSBnZGtfZGlzcGxheV9nZXRfZGVmYXVsdCgpOworCisgICAgaWYgKGRpc3BsYXkgIT0gTlVMTCkKKwlnZGtfZGlzcGxheV9iZWVwKGRpc3BsYXkpOworI2Vsc2UKKyAgICBnZGtfYmVlcCgpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX2ZsYXNoKGludCBtc2VjKQoreworICAgIEdka0dDVmFsdWVzCXZhbHVlczsKKyAgICBHZGtHQwkqaW52ZXJ0X2djOworCisgICAgaWYgKGd1aS5kcmF3YXJlYS0+d2luZG93ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgdmFsdWVzLmZvcmVncm91bmQucGl4ZWwgPSBndWkubm9ybV9waXhlbCBeIGd1aS5iYWNrX3BpeGVsOworICAgIHZhbHVlcy5iYWNrZ3JvdW5kLnBpeGVsID0gZ3VpLm5vcm1fcGl4ZWwgXiBndWkuYmFja19waXhlbDsKKyAgICB2YWx1ZXMuZnVuY3Rpb24gPSBHREtfWE9SOworICAgIGludmVydF9nYyA9IGdka19nY19uZXdfd2l0aF92YWx1ZXMoZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQkJICAgICAgICZ2YWx1ZXMsCisJCQkJICAgICAgIEdES19HQ19GT1JFR1JPVU5EIHwKKwkJCQkgICAgICAgR0RLX0dDX0JBQ0tHUk9VTkQgfAorCQkJCSAgICAgICBHREtfR0NfRlVOQ1RJT04pOworICAgIGdka19nY19zZXRfZXhwb3N1cmVzKGludmVydF9nYywKKwkJCSBndWkudmlzaWJpbGl0eSAhPSBHREtfVklTSUJJTElUWV9VTk9CU0NVUkVEKTsKKyAgICAvKgorICAgICAqIERvIGEgdmlzdWFsIGJlZXAgYnkgY2hhbmdpbmcgYmFjayBhbmQgZm9ydGggaW4gc29tZSB1bmRldGVybWluZWQgd2F5LAorICAgICAqIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycy4gIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQKKyAgICAgKiB0aGVyZSBjYW4ndCBiZSByZWFsbHkgYW55IHByZWRpY3Rpb24gYWJvdXQgdGhlIGVmZmVjdHMgb2YgWE9SIG9uCisgICAgICogYXJiaXRyYXJ5IFgxMSBzZXJ2ZXJzLiBIb3dldmVyIHRoaXMgc2VlbXMgdG8gYmUgZW5vdWdoIGZvciB3aGF0IHdlCisgICAgICogaW50ZW5kIGl0IHRvIGRvLgorICAgICAqLworICAgIGdka19kcmF3X3JlY3RhbmdsZShndWkuZHJhd2FyZWEtPndpbmRvdywgaW52ZXJ0X2djLAorCQkgICAgICAgVFJVRSwKKwkJICAgICAgIDAsIDAsCisJCSAgICAgICBGSUxMX1goKGludClDb2x1bW5zKSArIGd1aS5ib3JkZXJfb2Zmc2V0LAorCQkgICAgICAgRklMTF9ZKChpbnQpUm93cykgKyBndWkuYm9yZGVyX29mZnNldCk7CisKKyAgICBndWlfbWNoX2ZsdXNoKCk7CisgICAgdWlfZGVsYXkoKGxvbmcpbXNlYywgVFJVRSk7CS8qIHdhaXQgc28gbWFueSBtc2VjICovCisKKyAgICBnZGtfZHJhd19yZWN0YW5nbGUoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGludmVydF9nYywKKwkJICAgICAgIFRSVUUsCisJCSAgICAgICAwLCAwLAorCQkgICAgICAgRklMTF9YKChpbnQpQ29sdW1ucykgKyBndWkuYm9yZGVyX29mZnNldCwKKwkJICAgICAgIEZJTExfWSgoaW50KVJvd3MpICsgZ3VpLmJvcmRlcl9vZmZzZXQpOworCisgICAgZ2RrX2djX2Rlc3Ryb3koaW52ZXJ0X2djKTsKK30KKworLyoKKyAqIEludmVydCBhIHJlY3RhbmdsZSBmcm9tIHJvdyByLCBjb2x1bW4gYywgZm9yIG5yIHJvd3MgYW5kIG5jIGNvbHVtbnMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ludmVydF9yZWN0YW5nbGUoaW50IHIsIGludCBjLCBpbnQgbnIsIGludCBuYykKK3sKKyAgICBHZGtHQ1ZhbHVlcyB2YWx1ZXM7CisgICAgR2RrR0MgKmludmVydF9nYzsKKyAgICBHZGtDb2xvciBmb3JlZ3JvdW5kOworICAgIEdka0NvbG9yIGJhY2tncm91bmQ7CisKKyAgICBpZiAoZ3VpLmRyYXdhcmVhLT53aW5kb3cgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBmb3JlZ3JvdW5kLnBpeGVsID0gZ3VpLm5vcm1fcGl4ZWwgXiBndWkuYmFja19waXhlbDsKKyAgICBiYWNrZ3JvdW5kLnBpeGVsID0gZ3VpLm5vcm1fcGl4ZWwgXiBndWkuYmFja19waXhlbDsKKworICAgIHZhbHVlcy5mb3JlZ3JvdW5kID0gZm9yZWdyb3VuZDsKKyAgICB2YWx1ZXMuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7CisgICAgdmFsdWVzLmZ1bmN0aW9uID0gR0RLX1hPUjsKKyAgICBpbnZlcnRfZ2MgPSBnZGtfZ2NfbmV3X3dpdGhfdmFsdWVzKGd1aS5kcmF3YXJlYS0+d2luZG93LAorCQkJCSAgICAgICAmdmFsdWVzLAorCQkJCSAgICAgICBHREtfR0NfRk9SRUdST1VORCB8CisJCQkJICAgICAgIEdES19HQ19CQUNLR1JPVU5EIHwKKwkJCQkgICAgICAgR0RLX0dDX0ZVTkNUSU9OKTsKKyAgICBnZGtfZ2Nfc2V0X2V4cG9zdXJlcyhpbnZlcnRfZ2MsIGd1aS52aXNpYmlsaXR5ICE9IEdES19WSVNJQklMSVRZX1VOT0JTQ1VSRUQpOworICAgIGdka19kcmF3X3JlY3RhbmdsZShndWkuZHJhd2FyZWEtPndpbmRvdywgaW52ZXJ0X2djLAorCQkgICAgICAgVFJVRSwKKwkJICAgICAgIEZJTExfWChjKSwgRklMTF9ZKHIpLAorCQkgICAgICAgKG5jKSAqIGd1aS5jaGFyX3dpZHRoLCAobnIpICogZ3VpLmNoYXJfaGVpZ2h0KTsKKyAgICBnZGtfZ2NfZGVzdHJveShpbnZlcnRfZ2MpOworfQorCisvKgorICogSWNvbmlmeSB0aGUgR1VJIHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaWNvbmlmeSh2b2lkKQoreworI2lmZGVmIEhBVkVfR1RLMgorICAgIGd0a193aW5kb3dfaWNvbmlmeShHVEtfV0lORE9XKGd1aS5tYWlud2luKSk7CisjZWxzZQorICAgIFhJY29uaWZ5V2luZG93KEdES19XSU5ET1dfWERJU1BMQVkoZ3VpLm1haW53aW4tPndpbmRvdyksCisJCSAgIEdES19XSU5ET1dfWFdJTkRPVyhndWkubWFpbndpbi0+d2luZG93KSwKKwkJICAgRGVmYXVsdFNjcmVlbihHREtfV0lORE9XX1hESVNQTEFZKGd1aS5tYWlud2luLT53aW5kb3cpKSk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEJyaW5nIHRoZSBWaW0gd2luZG93IHRvIHRoZSBmb3JlZ3JvdW5kLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCh2b2lkKQoreworIyBpZmRlZiBIQVZFX0dUSzIKKyAgICBndGtfd2luZG93X3ByZXNlbnQoR1RLX1dJTkRPVyhndWkubWFpbndpbikpOworIyBlbHNlCisgICAgZ2RrX3dpbmRvd19yYWlzZShndWkubWFpbndpbi0+d2luZG93KTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogRHJhdyBhIGN1cnNvciB3aXRob3V0IGZvY3VzLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IoZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBpbnQJCWkgPSAxOworCisgICAgaWYgKGd1aS5kcmF3YXJlYS0+d2luZG93ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworCisgICAgZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuZmdjb2xvcik7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChtYl9sZWZ0aGFsdmUoZ3VpLnJvdywgZ3VpLmNvbCkpCisJaSA9IDI7CisjZW5kaWYKKyAgICBnZGtfZHJhd19yZWN0YW5nbGUoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS50ZXh0X2djLAorCSAgICBGQUxTRSwKKwkgICAgRklMTF9YKGd1aS5jb2wpLCBGSUxMX1koZ3VpLnJvdyksCisJICAgIGkgKiBndWkuY2hhcl93aWR0aCAtIDEsIGd1aS5jaGFyX2hlaWdodCAtIDEpOworfQorCisvKgorICogRHJhdyBwYXJ0IG9mIGEgY3Vyc29yLCAidyIgcGl4ZWxzIHdpZGUsIGFuZCAiaCIgcGl4ZWxzIGhpZ2gsIHVzaW5nCisgKiBjb2xvciAiY29sb3IiLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBpZiAoZ3VpLmRyYXdhcmVhLT53aW5kb3cgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcik7CisKKyAgICBnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsIGd1aS5mZ2NvbG9yKTsKKyAgICBnZGtfZHJhd19yZWN0YW5nbGUoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS50ZXh0X2djLAorCSAgICBUUlVFLAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJICAgIC8qIHZlcnRpY2FsIGxpbmUgc2hvdWxkIGJlIG9uIHRoZSByaWdodCBvZiBjdXJyZW50IHBvaW50ICovCisJICAgIENVUlNPUl9CQVJfUklHSFQgPyBGSUxMX1goZ3VpLmNvbCArIDEpIC0gdyA6CisjZW5kaWYKKwkgICAgRklMTF9YKGd1aS5jb2wpLAorCSAgICBGSUxMX1koZ3VpLnJvdykgKyBndWkuY2hhcl9oZWlnaHQgLSBoLAorCSAgICB3LCBoKTsKK30KKworCisvKgorICogQ2F0Y2ggdXAgd2l0aCBhbnkgcXVldWVkIFgxMSBldmVudHMuICBUaGlzIG1heSBwdXQga2V5Ym9hcmQgaW5wdXQgaW50byB0aGUKKyAqIGlucHV0IGJ1ZmZlciwgY2FsbCByZXNpemUgY2FsbC1iYWNrcywgdHJpZ2dlciB0aW1lcnMgZXRjLiAgSWYgdGhlcmUgaXMKKyAqIG5vdGhpbmcgaW4gdGhlIFgxMSBldmVudCBxdWV1ZSAoJiBubyB0aW1lcnMgcGVuZGluZyksIHRoZW4gd2UgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdXBkYXRlKHZvaWQpCit7CisgICAgd2hpbGUgKGd0a19ldmVudHNfcGVuZGluZygpICYmICF2aW1faXNfaW5wdXRfYnVmX2Z1bGwoKSkKKwlndGtfbWFpbl9pdGVyYXRpb25fZG8oRkFMU0UpOworfQorCisgICAgc3RhdGljIGdpbnQKK2lucHV0X3RpbWVyX2NiKGdwb2ludGVyIGRhdGEpCit7CisgICAgaW50ICp0aW1lZF9vdXQgPSAoaW50ICopIGRhdGE7CisKKyAgICAvKiBKdXN0IGluZm9ybSB0aGUgY2FsbGVyIGFib3V0IHRoZSBvY2N1cmVuY2Ugb2YgaXQgKi8KKyAgICAqdGltZWRfb3V0ID0gVFJVRTsKKworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7CisKKyAgICByZXR1cm4gRkFMU0U7CQkvKiBkb24ndCBoYXBwZW4gYWdhaW4gKi8KK30KKworI2lmZGVmIEZFQVRfU05JRkYKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiwgdXNlZCB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlIG9uIHRoZSBTTmlGRiBjb25uZWN0aW9uLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzbmlmZl9yZXF1ZXN0X2NiKAorICAgIGdwb2ludGVyCWRhdGEsCisgICAgZ2ludAlzb3VyY2VfZmQsCisgICAgR2RrSW5wdXRDb25kaXRpb24gY29uZGl0aW9uKQoreworICAgIHN0YXRpYyBjaGFyX3UgYnl0ZXNbM10gPSB7Q1NJLCAoaW50KUtTX0VYVFJBLCAoaW50KUtFX1NOSUZGfTsKKworICAgIGFkZF90b19pbnB1dF9idWYoYnl0ZXMsIDMpOworCisgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCWd0a19tYWluX3F1aXQoKTsKK30KKyNlbmRpZgorCisvKgorICogR1VJIGlucHV0IHJvdXRpbmUgY2FsbGVkIGJ5IGd1aV93YWl0X2Zvcl9jaGFycygpLiAgV2FpdHMgZm9yIGEgY2hhcmFjdGVyCisgKiBmcm9tIHRoZSBrZXlib2FyZC4KKyAqICB3dGltZSA9PSAtMSAgICAgV2FpdCBmb3JldmVyLgorICogIHd0aW1lID09IDAJICAgIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAqICB3dGltZSA+IDAJICAgIFdhaXQgd3RpbWUgbWlsbGlzZWNvbmRzIGZvciBhIGNoYXJhY3Rlci4KKyAqIFJldHVybnMgT0sgaWYgYSBjaGFyYWN0ZXIgd2FzIGZvdW5kIHRvIGJlIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGdpdmVuIHRpbWUsCisgKiBvciBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZ3VpX21jaF93YWl0X2Zvcl9jaGFycyhsb25nIHd0aW1lKQoreworICAgIGludCBmb2N1czsKKyAgICBndWludCB0aW1lcjsKKyAgICBzdGF0aWMgaW50IHRpbWVkX291dDsKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgc3RhdGljIGludAlzbmlmZl9vbiA9IDA7CisgICAgc3RhdGljIGdpbnQJc25pZmZfaW5wdXRfaWQgPSAwOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgaWYgKHNuaWZmX29uICYmICF3YW50X3NuaWZmX3JlcXVlc3QpCisgICAgeworCWlmIChzbmlmZl9pbnB1dF9pZCkKKwkgICAgZ2RrX2lucHV0X3JlbW92ZShzbmlmZl9pbnB1dF9pZCk7CisJc25pZmZfb24gPSAwOworICAgIH0KKyAgICBlbHNlIGlmICghc25pZmZfb24gJiYgd2FudF9zbmlmZl9yZXF1ZXN0KQorICAgIHsKKwkvKiBBZGQgZmRfZnJvbV9zbmlmZiB0byB3YXRjaCBmb3IgYXZhaWxhYmxlIGRhdGEgaW4gbWFpbiBsb29wLiAqLworCXNuaWZmX2lucHV0X2lkID0gZ2RrX2lucHV0X2FkZChmZF9mcm9tX3NuaWZmLAorCQkJICAgICAgIEdES19JTlBVVF9SRUFELCBzbmlmZl9yZXF1ZXN0X2NiLCBOVUxMKTsKKwlzbmlmZl9vbiA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICB0aW1lZF9vdXQgPSBGQUxTRTsKKworICAgIC8qIHRoaXMgdGltZW91dCBtYWtlcyBzdXJlIHRoYXQgd2Ugd2lsbCByZXR1cm4gaWYgbm8gY2hhcmFjdGVycyBhcnJpdmVkIGluCisgICAgICogdGltZSAqLworCisgICAgaWYgKHd0aW1lID4gMCkKKwl0aW1lciA9IGd0a190aW1lb3V0X2FkZCgoZ3VpbnQzMil3dGltZSwgaW5wdXRfdGltZXJfY2IsICZ0aW1lZF9vdXQpOworICAgIGVsc2UKKwl0aW1lciA9IDA7CisKKyAgICBmb2N1cyA9IGd1aS5pbl9mb2N1czsKKworICAgIGRvCisgICAgeworCS8qIFN0b3Agb3Igc3RhcnQgYmxpbmtpbmcgd2hlbiBmb2N1cyBjaGFuZ2VzICovCisJaWYgKGd1aS5pbl9mb2N1cyAhPSBmb2N1cykKKwl7CisJICAgIGlmIChndWkuaW5fZm9jdXMpCisJCWd1aV9tY2hfc3RhcnRfYmxpbmsoKTsKKwkgICAgZWxzZQorCQlndWlfbWNoX3N0b3BfYmxpbmsoKTsKKwkgICAgZm9jdXMgPSBndWkuaW5fZm9jdXM7CisJfQorCisJLyoKKwkgKiBMb29wIGluIEdUSysgcHJvY2Vzc2luZyAgdW50aWwgYSB0aW1lb3V0IG9yIGlucHV0IG9jY3Vycy4KKwkgKi8KKwlndGtfbWFpbigpOworCisJLyogR290IGNoYXIsIHJldHVybiBpbW1lZGlhdGVseSAqLworCWlmIChpbnB1dF9hdmFpbGFibGUoKSkKKwl7CisJICAgIGlmICh0aW1lciAhPSAwICYmICF0aW1lZF9vdXQpCisJCWd0a190aW1lb3V0X3JlbW92ZSh0aW1lcik7CisJICAgIHJldHVybiBPSzsKKwl9CisgICAgfSB3aGlsZSAod3RpbWUgPCAwIHx8ICF0aW1lZF9vdXQpOworCisgICAgLyoKKyAgICAgKiBGbHVzaCBhbGwgZXZlbnR1YWxseSBwZW5kaW5nIChkcmF3aW5nKSBldmVudHMuCisgICAgICovCisgICAgZ3VpX21jaF91cGRhdGUoKTsKKworICAgIHJldHVybiBGQUlMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPdXRwdXQgZHJhd2luZyByb3V0aW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIEZsdXNoIGFueSBvdXRwdXQgdG8gdGhlIHNjcmVlbiAqLworICAgIHZvaWQKK2d1aV9tY2hfZmx1c2godm9pZCkKK3sKKyNpZmRlZiBIQVZFX0dUS19NVUxUSUhFQUQKKyAgICBpZiAoZ3VpLm1haW53aW4gIT0gTlVMTCAmJiBHVEtfV0lER0VUX1JFQUxJWkVEKGd1aS5tYWlud2luKSkKKwlnZGtfZGlzcGxheV9zeW5jKGd0a193aWRnZXRfZ2V0X2Rpc3BsYXkoZ3VpLm1haW53aW4pKTsKKyNlbHNlCisgICAgZ2RrX2ZsdXNoKCk7IC8qIGhpc3RvcmljYWwgbWlzbm9tZXI6IGNhbGxzIFhTeW5jKCksIG5vdCBYRmx1c2goKSAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9HVEsyCisgICAgLyogVGhpcyBoYXBwZW5zIHRvIGFjdHVhbGx5IGRvIHdoYXQgZ3VpX21jaF9mbHVzaCgpIGlzIHN1cHBvc2VkIHRvIGRvLAorICAgICAqIGFjY29yZGluZyB0byB0aGUgY29tbWVudCBhYm92ZS4gKi8KKyAgICBpZiAoZ3VpLmRyYXdhcmVhICE9IE5VTEwgJiYgZ3VpLmRyYXdhcmVhLT53aW5kb3cgIT0gTlVMTCkKKwlnZGtfd2luZG93X3Byb2Nlc3NfdXBkYXRlcyhndWkuZHJhd2FyZWEtPndpbmRvdywgRkFMU0UpOworI2VuZGlmCit9CisKKy8qCisgKiBDbGVhciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aGUgc2NyZWVuIGZyb20gdGV4dCBwb3MgKHJvdzEsIGNvbDEpIHRvCisgKiAocm93MiwgY29sMikgaW5jbHVzaXZlLgorICovCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9ibG9jayhpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikKK3sKKyAgICBHZGtDb2xvciBjb2xvcjsKKworICAgIGlmIChndWkuZHJhd2FyZWEtPndpbmRvdyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGNvbG9yLnBpeGVsID0gZ3VpLmJhY2tfcGl4ZWw7CisKKyAgICBnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsICZjb2xvcik7CisKKyAgICAvKiBDbGVhciBvbmUgZXh0cmEgcGl4ZWwgYXQgdGhlIGZhciByaWdodCwgZm9yIHdoZW4gYm9sZCBjaGFyYWN0ZXJzIGhhdmUKKyAgICAgKiBzcGlsbGVkIG92ZXIgdG8gdGhlIHdpbmRvdyBib3JkZXIuICovCisgICAgZ2RrX2RyYXdfcmVjdGFuZ2xlKGd1aS5kcmF3YXJlYS0+d2luZG93LCBndWkudGV4dF9nYywgVFJVRSwKKwkJICAgICAgIEZJTExfWChjb2wxKSwgRklMTF9ZKHJvdzEpLAorCQkgICAgICAgKGNvbDIgLSBjb2wxICsgMSkgKiBndWkuY2hhcl93aWR0aAorCQkJCQkJICAgICAgKyAoY29sMiA9PSBDb2x1bW5zIC0gMSksCisJCSAgICAgICAocm93MiAtIHJvdzEgKyAxKSAqIGd1aS5jaGFyX2hlaWdodCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2NsZWFyX2FsbCh2b2lkKQoreworICAgIGlmIChndWkuZHJhd2FyZWEtPndpbmRvdyAhPSBOVUxMKQorCWdka193aW5kb3dfY2xlYXIoZ3VpLmRyYXdhcmVhLT53aW5kb3cpOworfQorCisvKgorICogUmVkcmF3IGFueSB0ZXh0IHJldmVhbGVkIGJ5IHNjcm9sbGluZyB1cC9kb3duLgorICovCisgICAgc3RhdGljIHZvaWQKK2NoZWNrX2NvcHlfYXJlYSh2b2lkKQoreworICAgIEdka0V2ZW50CSpldmVudDsKKyAgICBpbnQJCWV4cG9zZV9jb3VudDsKKworICAgIGlmIChndWkudmlzaWJpbGl0eSAhPSBHREtfVklTSUJJTElUWV9QQVJUSUFMKQorCXJldHVybjsKKworICAgIC8qIEF2b2lkIHJlZHJhd2luZyB0aGUgY3Vyc29yIHdoaWxlIHNjcm9sbGluZyBvciBpdCdsbCBlbmQgdXAgd2hlcmUKKyAgICAgKiB3ZSBkb24ndCB3YW50IGl0IHRvIGJlLglJJ20gbm90IHN1cmUgaWYgaXQncyBjb3JyZWN0IHRvIGNhbGwKKyAgICAgKiBndWlfZG9udF91cGRhdGVfY3Vyc29yKCkgYXQgdGhpcyBwb2ludCBidXQgaXQgd29ya3MgYXMgYSBxdWljaworICAgICAqIGZpeCBmb3Igbm93LiAqLworICAgIGd1aV9kb250X3VwZGF0ZV9jdXJzb3IoKTsKKworICAgIGRvCisgICAgeworCS8qIFdhaXQgdG8gY2hlY2sgd2hldGhlciB0aGUgc2Nyb2xsIHdvcmtlZCBvciBub3QuICovCisJZXZlbnQgPSBnZGtfZXZlbnRfZ2V0X2dyYXBoaWNzX2V4cG9zZShndWkuZHJhd2FyZWEtPndpbmRvdyk7CisKKwlpZiAoZXZlbnQgPT0gTlVMTCkKKwkgICAgYnJlYWs7IC8qIHJlY2VpdmVkIE5vRXhwb3NlIGV2ZW50ICovCisKKwlndWlfcmVkcmF3KGV2ZW50LT5leHBvc2UuYXJlYS54LCBldmVudC0+ZXhwb3NlLmFyZWEueSwKKwkJICAgZXZlbnQtPmV4cG9zZS5hcmVhLndpZHRoLCBldmVudC0+ZXhwb3NlLmFyZWEuaGVpZ2h0KTsKKworCWV4cG9zZV9jb3VudCA9IGV2ZW50LT5leHBvc2UuY291bnQ7CisJZ2RrX2V2ZW50X2ZyZWUoZXZlbnQpOworICAgIH0KKyAgICB3aGlsZSAoZXhwb3NlX2NvdW50ID4gMCk7IC8qIG1vcmUgZXZlbnRzIGZvbGxvdyAqLworCisgICAgZ3VpX2Nhbl91cGRhdGVfY3Vyc29yKCk7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGdpdmVuIG51bWJlciBvZiBsaW5lcyBmcm9tIHRoZSBnaXZlbiByb3csIHNjcm9sbGluZyB1cCBhbnkKKyAqIHRleHQgZnVydGhlciBkb3duIHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVsZXRlX2xpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgaWYgKGd1aS52aXNpYmlsaXR5ID09IEdES19WSVNJQklMSVRZX0ZVTExZX09CU0NVUkVEKQorCXJldHVybjsJCQkvKiBDYW4ndCBzZWUgdGhlIHdpbmRvdyAqLworCisgICAgZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuZmdjb2xvcik7CisgICAgZ2RrX2djX3NldF9iYWNrZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuYmdjb2xvcik7CisKKyAgICAvKiBjb3B5IG9uZSBleHRyYSBwaXhlbCwgZm9yIHdoZW4gYm9sZCBoYXMgc3BpbGxlZCBvdmVyICovCisgICAgZ2RrX3dpbmRvd19jb3B5X2FyZWEoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS50ZXh0X2djLAorCSAgICBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCksIEZJTExfWShyb3cpLAorCSAgICBndWkuZHJhd2FyZWEtPndpbmRvdywKKwkgICAgRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpLAorCSAgICBGSUxMX1kocm93ICsgbnVtX2xpbmVzKSwKKwkgICAgZ3VpLmNoYXJfd2lkdGggKiAoZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQKKwkJCQkJICAgIC0gZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCArIDEpICsgMSwKKwkgICAgZ3VpLmNoYXJfaGVpZ2h0ICogKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIHJvdyAtIG51bV9saW5lcyArIDEpKTsKKworICAgIGd1aV9jbGVhcl9ibG9jayhndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMgKyAxLAorCQkJCQkJICAgICAgIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJCSAgICBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKyAgICBjaGVja19jb3B5X2FyZWEoKTsKK30KKworLyoKKyAqIEluc2VydCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzIGJlZm9yZSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgZG93biBhbnkKKyAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW5zZXJ0X2xpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgaWYgKGd1aS52aXNpYmlsaXR5ID09IEdES19WSVNJQklMSVRZX0ZVTExZX09CU0NVUkVEKQorCXJldHVybjsJCQkvKiBDYW4ndCBzZWUgdGhlIHdpbmRvdyAqLworCisgICAgZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuZmdjb2xvcik7CisgICAgZ2RrX2djX3NldF9iYWNrZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuYmdjb2xvcik7CisKKyAgICAvKiBjb3B5IG9uZSBleHRyYSBwaXhlbCwgZm9yIHdoZW4gYm9sZCBoYXMgc3BpbGxlZCBvdmVyICovCisgICAgZ2RrX3dpbmRvd19jb3B5X2FyZWEoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS50ZXh0X2djLAorCSAgICBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCksIEZJTExfWShyb3cgKyBudW1fbGluZXMpLAorCSAgICBndWkuZHJhd2FyZWEtPndpbmRvdywKKwkgICAgRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpLCBGSUxMX1kocm93KSwKKwkgICAgZ3VpLmNoYXJfd2lkdGggKiAoZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQKKwkJCQkJICAgIC0gZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCArIDEpICsgMSwKKwkgICAgZ3VpLmNoYXJfaGVpZ2h0ICogKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIHJvdyAtIG51bV9saW5lcyArIDEpKTsKKworICAgIGd1aV9jbGVhcl9ibG9jayhyb3csIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJCQkJcm93ICsgbnVtX2xpbmVzIC0gMSwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOworICAgIGNoZWNrX2NvcHlfYXJlYSgpOworfQorCisvKgorICogWCBTZWxlY3Rpb24gc3R1ZmYsIGZvciBjdXR0aW5nIGFuZCBwYXN0aW5nIHRleHQgdG8gb3RoZXIgd2luZG93cy4KKyAqLworICAgIHZvaWQKK2NsaXBfbWNoX3JlcXVlc3Rfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIEdka0F0b20JdGFyZ2V0OworICAgIHVuc2lnbmVkCWk7CisgICAgaW50CQluYnl0ZXM7CisgICAgY2hhcl91CSpidWZmZXI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9TRUxFQ1RJT05fVEFSR0VUUzsgKytpKQorICAgIHsKKwlyZWNlaXZlZF9zZWxlY3Rpb24gPSBSU19OT05FOworCXRhcmdldCA9IGdka19hdG9tX2ludGVybihzZWxlY3Rpb25fdGFyZ2V0c1tpXS50YXJnZXQsIEZBTFNFKTsKKworCWd0a19zZWxlY3Rpb25fY29udmVydChndWkuZHJhd2FyZWEsCisJCQkgICAgICBjYmQtPmd0a19zZWxfYXRvbSwgdGFyZ2V0LAorCQkJICAgICAgKGd1aW50MzIpR0RLX0NVUlJFTlRfVElNRSk7CisKKwl3aGlsZSAocmVjZWl2ZWRfc2VsZWN0aW9uID09IFJTX05PTkUpCisJICAgIGd0a19tYWluKCk7CS8qIHdhaXQgZm9yIHNlbGVjdGlvbl9yZWNlaXZlZF9jYiAqLworCisJaWYgKHJlY2VpdmVkX3NlbGVjdGlvbiAhPSBSU19GQUlMKQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgLyogRmluYWwgZmFsbGJhY2sgcG9zaXRpb24gLSB1c2UgdGhlIFggQ1VUX0JVRkZFUjAgc3RvcmUgKi8KKyAgICBuYnl0ZXMgPSAwOworICAgIGJ1ZmZlciA9IChjaGFyX3UgKilYRmV0Y2hCdWZmZXIoR0RLX1dJTkRPV19YRElTUExBWShndWkubWFpbndpbi0+d2luZG93KSwKKwkJCQkgICAgJm5ieXRlcywgMCk7CisgICAgaWYgKG5ieXRlcyA+IDApCisgICAgeworCS8qIEdvdCBzb21ldGhpbmcgKi8KKwljbGlwX3lhbmtfc2VsZWN0aW9uKE1DSEFSLCBidWZmZXIsIChsb25nKW5ieXRlcywgY2JkKTsKKwlpZiAocF92ZXJib3NlID4gMCkKKwkgICAgc21zZygoY2hhcl91ICopXygiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIpKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorCVhGcmVlKGJ1ZmZlcik7Cit9CisKKy8qCisgKiBEaXNvd24gdGhlIHNlbGVjdGlvbi4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgLyogV0VJUkQ6IHdoZW4gdXNpbmcgTlVMTCB0byBhY3R1YWxseSBkaXNvd24gdGhlIHNlbGVjdGlvbiwgd2UgbG9zZSB0aGUKKyAgICAgKiBzZWxlY3Rpb24gdGhlIGZpcnN0IHRpbWUgd2Ugb3duIGl0LiAqLworICAgIC8qCisgICAgZ3RrX3NlbGVjdGlvbl9vd25lcl9zZXQoTlVMTCwgY2JkLT5ndGtfc2VsX2F0b20sIChndWludDMyKUdES19DVVJSRU5UX1RJTUUpOworICAgIGd1aV9tY2hfdXBkYXRlKCk7CisgICAgICovCit9CisKKy8qCisgKiBPd24gdGhlIHNlbGVjdGlvbiBhbmQgcmV0dXJuIE9LIGlmIGl0IHdvcmtlZC4KKyAqLworICAgIGludAorY2xpcF9tY2hfb3duX3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKK3sKKyAgICBpbnQgc3VjY2VzczsKKworICAgIHN1Y2Nlc3MgPSBndGtfc2VsZWN0aW9uX293bmVyX3NldChndWkuZHJhd2FyZWEsIGNiZC0+Z3RrX3NlbF9hdG9tLAorCQkJCSAgICAgIChndWludDMyKUdES19DVVJSRU5UX1RJTUUpOworICAgIGd1aV9tY2hfdXBkYXRlKCk7CisgICAgcmV0dXJuIChzdWNjZXNzKSA/IE9LIDogRkFJTDsKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuICBEbyBub3RoaW5nIGZvciBYIGJlY2F1c2Ugd2UKKyAqIHdpbGwgZmlsbCBpbiB0aGUgc2VsZWN0aW9uIG9ubHkgd2hlbiByZXF1ZXN0ZWQgYnkgYW5vdGhlciBhcHAuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2NsaXBfbWNoX3NldF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7Cit9CisKKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIE1ha2UgYSBtZW51IGl0ZW0gYXBwZWFyIGVpdGhlciBhY3RpdmUgb3Igbm90IGFjdGl2ZSAoZ3JleSBvciBub3QgZ3JleSkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KQoreworICAgIGlmIChtZW51LT5pZCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChtZW51X2lzX3NlcGFyYXRvcihtZW51LT5uYW1lKSkKKwlncmV5ID0gVFJVRTsKKworICAgIGd1aV9tY2hfbWVudV9oaWRkZW4obWVudSwgRkFMU0UpOworICAgIC8qIEJlIGNsZXZlciBhYm91dCBiaXRmaWVsZHMgdmVyc3VzIHRydWUgYm9vbGVhbnMgaGVyZSEgKi8KKyAgICBpZiAoIUdUS19XSURHRVRfU0VOU0lUSVZFKG1lbnUtPmlkKSA9PSAhZ3JleSkKKyAgICB7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKG1lbnUtPmlkLCAhZ3JleSk7CisJZ3VpX21jaF91cGRhdGUoKTsKKyAgICB9Cit9CisKKy8qCisgKiBNYWtlIG1lbnUgaXRlbSBoaWRkZW4gb3Igbm90IGhpZGRlbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbWVudV9oaWRkZW4odmltbWVudV9UICptZW51LCBpbnQgaGlkZGVuKQoreworICAgIGlmIChtZW51LT5pZCA9PSAwKQorCXJldHVybjsKKworICAgIGlmIChoaWRkZW4pCisgICAgeworCWlmIChHVEtfV0lER0VUX1ZJU0lCTEUobWVudS0+aWQpKQorCXsKKwkgICAgZ3RrX3dpZGdldF9oaWRlKG1lbnUtPmlkKTsKKwkgICAgZ3VpX21jaF91cGRhdGUoKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKCFHVEtfV0lER0VUX1ZJU0lCTEUobWVudS0+aWQpKQorCXsKKwkgICAgZ3RrX3dpZGdldF9zaG93KG1lbnUtPmlkKTsKKwkgICAgZ3VpX21jaF91cGRhdGUoKTsKKwl9CisgICAgfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIG1lbnVzIHRvIGdyZXkvaGlkZGVuIG9yIG5vdC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19tZW51YmFyKHZvaWQpCit7CisgICAgLyoganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgdmlzdWFsIGNoYW5nZXMgZ2V0IGVmZmVjdCBpbW1lZGlhdGVseSAqLworICAgIGd1aV9tY2hfdXBkYXRlKCk7Cit9CisjZW5kaWYgLyogRkVBVF9NRU5VICovCisKKy8qCisgKiBTY3JvbGxiYXIgc3R1ZmYuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykKK3sKKyAgICBpZiAoc2ItPmlkID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGZsYWcpCisJZ3RrX3dpZGdldF9zaG93KHNiLT5pZCk7CisgICAgZWxzZQorCWd0a193aWRnZXRfaGlkZShzYi0+aWQpOworCisgICAgdXBkYXRlX3dpbmRvd19tYW5hZ2VyX2hpbnRzKCk7Cit9CisKKworLyoKKyAqIFJldHVybiB0aGUgUkdCIHZhbHVlIG9mIGEgcGl4ZWwgYXMgbG9uZy4KKyAqLworICAgIGxvbmdfdQorZ3VpX21jaF9nZXRfcmdiKGd1aWNvbG9yX1QgcGl4ZWwpCit7CisgICAgR2RrQ29sb3IgY29sb3I7CisjaWZuZGVmIEhBVkVfR1RLMgorICAgIEdka0NvbG9yQ29udGV4dCAqY2M7CisKKyAgICBjYyA9IGdka19jb2xvcl9jb250ZXh0X25ldyhndGtfd2lkZ2V0X2dldF92aXN1YWwoZ3VpLmRyYXdhcmVhKSwKKwkJCSAgICAgICBndGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndWkuZHJhd2FyZWEpKTsKKyAgICBjb2xvci5waXhlbCA9IHBpeGVsOworICAgIGdka19jb2xvcl9jb250ZXh0X3F1ZXJ5X2NvbG9yKGNjLCAmY29sb3IpOworCisgICAgZ2RrX2NvbG9yX2NvbnRleHRfZnJlZShjYyk7CisjZWxzZQorICAgIGdka19jb2xvcm1hcF9xdWVyeV9jb2xvcihndGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndWkuZHJhd2FyZWEpLAorCQkJICAgICAodW5zaWduZWQgbG9uZylwaXhlbCwgJmNvbG9yKTsKKyNlbmRpZgorCisgICAgcmV0dXJuICgoKHVuc2lnbmVkKWNvbG9yLnJlZCAgICYgMHhmZjAwKSA8PCA4KQorCSB8ICAoKHVuc2lnbmVkKWNvbG9yLmdyZWVuICYgMHhmZjAwKQorCSB8ICgoKHVuc2lnbmVkKWNvbG9yLmJsdWUgICYgMHhmZjAwKSA+PiA4KTsKK30KKworLyoKKyAqIEdldCBjdXJyZW50IHkgbW91c2UgY29vcmRpbmF0ZSBpbiB0ZXh0IHdpbmRvdy4KKyAqIFJldHVybiAtMSB3aGVuIHVua25vd24uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3godm9pZCkKK3sKKyAgICBpbnQgd2luX3g7CisKKyAgICBnZGtfd2luZG93X2dldF9wb2ludGVyKGd1aS5kcmF3YXJlYS0+d2luZG93LCAmd2luX3gsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiB3aW5feDsKK30KKworICAgIGludAorZ3VpX21jaF9nZXRfbW91c2VfeSh2b2lkKQoreworICAgIGludCB3aW5feTsKKworICAgIGdka193aW5kb3dfZ2V0X3BvaW50ZXIoZ3VpLmRyYXdhcmVhLT53aW5kb3csIE5VTEwsICZ3aW5feSwgTlVMTCk7CisgICAgcmV0dXJuIHdpbl95OworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRtb3VzZShpbnQgeCwgaW50IHkpCit7CisgICAgLyogU29ycnkgZm9yIHRoZSBYbGliIGNhbGwsIGJ1dCB3ZSBjYW4ndCBhdm9pZCBpdCwgc2luY2UgdGhlcmUgaXMgbm8KKyAgICAgKiBpbnRlcm5hbCBHREsgbWVjaGFuaXNtIHByZXNlbnQgdG8gYWNjb21wbGlzaCB0aGlzLiAgKGFuZCBmb3IgZ29vZAorICAgICAqIHJlYXNvbi4uLikgKi8KKyAgICBYV2FycFBvaW50ZXIoR0RLX1dJTkRPV19YRElTUExBWShndWkuZHJhd2FyZWEtPndpbmRvdyksCisJCSAoV2luZG93KTAsIEdES19XSU5ET1dfWFdJTkRPVyhndWkuZHJhd2FyZWEtPndpbmRvdyksCisJCSAwLCAwLCAwVSwgMFUsIHgsIHkpOworfQorCisKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKy8qIFRoZSBsYXN0IHNldCBtb3VzZSBwb2ludGVyIHNoYXBlIGlzIHJlbWVtYmVyZWQsIHRvIGJlIHVzZWQgd2hlbiBpdCBnb2VzCisgKiBmcm9tIGhpZGRlbiB0byBub3QgaGlkZGVuLiAqLworc3RhdGljIGludCBsYXN0X3NoYXBlID0gMDsKKyNlbmRpZgorCisvKgorICogVXNlIHRoZSBibGFuayBtb3VzZSBwb2ludGVyIG9yIG5vdC4KKyAqCisgKiBoaWRlOiBUUlVFID0gdXNlIGJsYW5rIHB0ciwgRkFMU0UgPSB1c2UgcGFyZW50IHB0cgorICovCisgICAgdm9pZAorZ3VpX21jaF9tb3VzZWhpZGUoaW50IGhpZGUpCit7CisgICAgaWYgKGd1aS5wb2ludGVyX2hpZGRlbiAhPSBoaWRlKQorICAgIHsKKwlndWkucG9pbnRlcl9oaWRkZW4gPSBoaWRlOworCWlmIChndWkuZHJhd2FyZWEtPndpbmRvdyAmJiBndWkuYmxhbmtfcG9pbnRlciAhPSBOVUxMKQorCXsKKwkgICAgaWYgKGhpZGUpCisJCWdka193aW5kb3dfc2V0X2N1cnNvcihndWkuZHJhd2FyZWEtPndpbmRvdywgZ3VpLmJsYW5rX3BvaW50ZXIpOworCSAgICBlbHNlCisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJCW1jaF9zZXRfbW91c2Vfc2hhcGUobGFzdF9zaGFwZSk7CisjZWxzZQorCQlnZGtfd2luZG93X3NldF9jdXJzb3IoZ3VpLmRyYXdhcmVhLT53aW5kb3csIE5VTEwpOworI2VuZGlmCisJfQorICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9NT1VTRVNIQVBFKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKiBUYWJsZSBmb3Igc2hhcGUgSURzLiAgS2VlcCBpbiBzeW5jIHdpdGggdGhlIG1zaGFwZV9uYW1lc1tdIHRhYmxlIGluCisgKiBtaXNjMi5jISAqLworc3RhdGljIGNvbnN0IGludCBtc2hhcGVfaWRzW10gPQoreworICAgIEdES19MRUZUX1BUUiwJCS8qIGFycm93ICovCisgICAgR0RLX0NVUlNPUl9JU19QSVhNQVAsCS8qIGJsYW5rICovCisgICAgR0RLX1hURVJNLAkJCS8qIGJlYW0gKi8KKyAgICBHREtfU0JfVl9ET1VCTEVfQVJST1csCS8qIHVwZG93biAqLworICAgIEdES19TSVpJTkcsCQkJLyogdWRzaXppbmcgKi8KKyAgICBHREtfU0JfSF9ET1VCTEVfQVJST1csCS8qIGxlZnRyaWdodCAqLworICAgIEdES19TSVpJTkcsCQkJLyogbHJzaXppbmcgKi8KKyAgICBHREtfV0FUQ0gsCQkJLyogYnVzeSAqLworICAgIEdES19YX0NVUlNPUiwJCS8qIG5vICovCisgICAgR0RLX0NST1NTSEFJUiwJCS8qIGNyb3NzaGFpciAqLworICAgIEdES19IQU5EMSwJCQkvKiBoYW5kMSAqLworICAgIEdES19IQU5EMiwJCQkvKiBoYW5kMiAqLworICAgIEdES19QRU5DSUwsCQkJLyogcGVuY2lsICovCisgICAgR0RLX1FVRVNUSU9OX0FSUk9XLAkJLyogcXVlc3Rpb24gKi8KKyAgICBHREtfUklHSFRfUFRSLAkJLyogcmlnaHQtYXJyb3cgKi8KKyAgICBHREtfQ0VOVEVSX1BUUiwJCS8qIHVwLWFycm93ICovCisgICAgR0RLX0xFRlRfUFRSCQkvKiBsYXN0IG9uZSAqLworfTsKKworICAgIHZvaWQKK21jaF9zZXRfbW91c2Vfc2hhcGUoaW50IHNoYXBlKQoreworICAgIGludAkJICAgaWQ7CisgICAgR2RrQ3Vyc29yCSAgICpjOworCisgICAgaWYgKGd1aS5kcmF3YXJlYS0+d2luZG93ID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKHNoYXBlID09IE1TSEFQRV9ISURFIHx8IGd1aS5wb2ludGVyX2hpZGRlbikKKwlnZGtfd2luZG93X3NldF9jdXJzb3IoZ3VpLmRyYXdhcmVhLT53aW5kb3csIGd1aS5ibGFua19wb2ludGVyKTsKKyAgICBlbHNlCisgICAgeworCWlmIChzaGFwZSA+PSBNU0hBUEVfTlVNQkVSRUQpCisJeworCSAgICBpZCA9IHNoYXBlIC0gTVNIQVBFX05VTUJFUkVEOworCSAgICBpZiAoaWQgPj0gR0RLX0xBU1RfQ1VSU09SKQorCQlpZCA9IEdES19MRUZUX1BUUjsKKwkgICAgZWxzZQorCQlpZCAmPSB+MTsJLyogdGhleSBhcmUgYWx3YXlzIGV2ZW4gKHdoeT8pICovCisJfQorCWVsc2UKKwkgICAgaWQgPSBtc2hhcGVfaWRzW3NoYXBlXTsKKyMgaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisJYyA9IGdka19jdXJzb3JfbmV3X2Zvcl9kaXNwbGF5KAorCQlndGtfd2lkZ2V0X2dldF9kaXNwbGF5KGd1aS5kcmF3YXJlYSksIGlkKTsKKyMgZWxzZQorCWMgPSBnZGtfY3Vyc29yX25ldyhpZCk7CisjIGVuZGlmCisJZ2RrX3dpbmRvd19zZXRfY3Vyc29yKGd1aS5kcmF3YXJlYS0+d2luZG93LCBjKTsKKwlnZGtfY3Vyc29yX2Rlc3Ryb3koYyk7IC8qIFVucmVmLCBhY3R1YWxseS4gIEJsb29keSBHVEsrIDEuICovCisgICAgfQorICAgIGlmIChzaGFwZSAhPSBNU0hBUEVfSElERSkKKwlsYXN0X3NoYXBlID0gc2hhcGU7Cit9CisjZW5kaWYgLyogRkVBVF9NT1VTRVNIQVBFICovCisKKworI2lmIGRlZmluZWQoRkVBVF9TSUdOX0lDT05TKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNpZ25zIGFyZSBjdXJyZW50bHkgYWx3YXlzIDIgY2hhcnMgd2lkZS4gIFdpdGggR1RLKyAyLCB0aGUgaW1hZ2Ugd2lsbCBiZQorICogc2NhbGVkIGRvd24gaWYgdGhlIGN1cnJlbnQgZm9udCBpcyBub3QgYmlnIGVub3VnaCwgb3Igc2NhbGVkIHVwIGlmIHRoZSBpbWFnZQorICogc2l6ZSBpcyBsZXNzIHRoYW4gMy80IG9mIHRoZSBtYXhpbXVtIHNpZ24gc2l6ZS4gIFdpdGggR1RLKyAxLCB0aGUgcGl4bWFwCisgKiB3aWxsIGJlIGN1dCBvZmYgaWYgdGhlIGN1cnJlbnQgZm9udCBpcyBub3QgYmlnIGVub3VnaCwgb3IgY2VudGVyZWQgaWYgaXQncworICogdG9vIHNtYWxsLgorICovCisjIGRlZmluZSBTSUdOX1dJRFRIICAoMiAqIGd1aS5jaGFyX3dpZHRoKQorIyBkZWZpbmUgU0lHTl9IRUlHSFQgKGd1aS5jaGFyX2hlaWdodCkKKyMgZGVmaW5lIFNJR05fQVNQRUNUICgoZG91YmxlKVNJR05fSEVJR0hUIC8gKGRvdWJsZSlTSUdOX1dJRFRIKQorCisjIGlmZGVmIEhBVkVfR1RLMgorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3c2lnbihpbnQgcm93LCBpbnQgY29sLCBpbnQgdHlwZW5yKQoreworICAgIEdka1BpeGJ1ZiAqc2lnbjsKKworICAgIHNpZ24gPSAoR2RrUGl4YnVmICopc2lnbl9nZXRfaW1hZ2UodHlwZW5yKTsKKworICAgIGlmIChzaWduICE9IE5VTEwgJiYgZ3VpLmRyYXdhcmVhICE9IE5VTEwgJiYgZ3VpLmRyYXdhcmVhLT53aW5kb3cgIT0gTlVMTCkKKyAgICB7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisJaW50IHhvZmZzZXQ7CisJaW50IHlvZmZzZXQ7CisJaW50IG5lZWRfc2NhbGU7CisKKwl3aWR0aCAgPSBnZGtfcGl4YnVmX2dldF93aWR0aChzaWduKTsKKwloZWlnaHQgPSBnZGtfcGl4YnVmX2dldF9oZWlnaHQoc2lnbik7CisJLyoKKwkgKiBEZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIHNjYWxlLiAgQWxsb3cgb25lIHBpeGVsIG9mIGJvcmRlcgorCSAqIHdpZHRoIHRvIGJlIGN1dCBvZmYsIGluIG9yZGVyIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBzY2FsaW5nIGZvcgorCSAqIHRpbnkgZGlmZmVyZW5jZXMgaW4gZm9udCBzaXplLgorCSAqLworCW5lZWRfc2NhbGUgPSAod2lkdGggPiBTSUdOX1dJRFRIICsgMgorCQkgICAgICB8fCBoZWlnaHQgPiBTSUdOX0hFSUdIVCArIDIKKwkJICAgICAgfHwgKHdpZHRoIDwgMyAqIFNJR05fV0lEVEggLyA0CisJCQkgICYmIGhlaWdodCA8IDMgKiBTSUdOX0hFSUdIVCAvIDQpKTsKKwlpZiAobmVlZF9zY2FsZSkKKwl7CisJICAgIGRvdWJsZSBhc3BlY3Q7CisKKwkgICAgLyogS2VlcCB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvICovCisJICAgIGFzcGVjdCA9IChkb3VibGUpaGVpZ2h0IC8gKGRvdWJsZSl3aWR0aDsKKwkgICAgd2lkdGggID0gKGRvdWJsZSlTSUdOX1dJRFRIICogU0lHTl9BU1BFQ1QgLyBhc3BlY3Q7CisJICAgIHdpZHRoICA9IE1JTih3aWR0aCwgU0lHTl9XSURUSCk7CisJICAgIGhlaWdodCA9IChkb3VibGUpd2lkdGggKiBhc3BlY3Q7CisKKwkgICAgLyogVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgd29ydGggY2FjaGluZywgYW5kIGRvaW5nIHNvCisJICAgICAqIHdvdWxkIGNvbXBsaWNhdGUgdGhlIGNvZGUgcXVpdGUgYSBiaXQuICovCisJICAgIHNpZ24gPSBnZGtfcGl4YnVmX3NjYWxlX3NpbXBsZShzaWduLCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkgICBHREtfSU5URVJQX0JJTElORUFSKTsKKwkgICAgaWYgKHNpZ24gPT0gTlVMTCkKKwkJcmV0dXJuOyAvKiBvdXQgb2YgbWVtb3J5ICovCisJfQorCisJLyogVGhlIG9yaWdpbiBpcyB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBpeG1hcC4gIFRoZXJlZm9yZQorCSAqIHRoZXNlIG9mZnNldCBtYXkgYmVjb21lIG5lZ2F0aXZlIGlmIHRoZSBwaXhtYXAgaXMgc21hbGxlciB0aGFuCisJICogdGhlIDJ4MSBjZWxscyByZXNlcnZlZCBmb3IgdGhlIHNpZ24gaWNvbi4gKi8KKwl4b2Zmc2V0ID0gKHdpZHRoICAtIFNJR05fV0lEVEgpICAvIDI7CisJeW9mZnNldCA9IChoZWlnaHQgLSBTSUdOX0hFSUdIVCkgLyAyOworCisJZ2RrX2djX3NldF9mb3JlZ3JvdW5kKGd1aS50ZXh0X2djLCBndWkuYmdjb2xvcik7CisKKwlnZGtfZHJhd19yZWN0YW5nbGUoZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQkgICBndWkudGV4dF9nYywKKwkJCSAgIFRSVUUsCisJCQkgICBGSUxMX1goY29sKSwKKwkJCSAgIEZJTExfWShyb3cpLAorCQkJICAgU0lHTl9XSURUSCwKKwkJCSAgIFNJR05fSEVJR0hUKTsKKworIyAgaWYgR1RLX0NIRUNLX1ZFUlNJT04oMiwxLDEpCisJZ2RrX2RyYXdfcGl4YnVmKGd1aS5kcmF3YXJlYS0+d2luZG93LAorCQkJTlVMTCwKKwkJCXNpZ24sCisJCQlNQVgoMCwgeG9mZnNldCksCisJCQlNQVgoMCwgeW9mZnNldCksCisJCQlGSUxMX1goY29sKSAtIE1JTigwLCB4b2Zmc2V0KSwKKwkJCUZJTExfWShyb3cpIC0gTUlOKDAsIHlvZmZzZXQpLAorCQkJTUlOKHdpZHRoLCAgU0lHTl9XSURUSCksCisJCQlNSU4oaGVpZ2h0LCBTSUdOX0hFSUdIVCksCisJCQlHREtfUkdCX0RJVEhFUl9OT1JNQUwsCisJCQkwLCAwKTsKKyMgIGVsc2UKKwlnZGtfcGl4YnVmX3JlbmRlcl90b19kcmF3YWJsZV9hbHBoYShzaWduLAorCQkJCQkgICAgZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQkJCSAgICBNQVgoMCwgeG9mZnNldCksCisJCQkJCSAgICBNQVgoMCwgeW9mZnNldCksCisJCQkJCSAgICBGSUxMX1goY29sKSAtIE1JTigwLCB4b2Zmc2V0KSwKKwkJCQkJICAgIEZJTExfWShyb3cpIC0gTUlOKDAsIHlvZmZzZXQpLAorCQkJCQkgICAgTUlOKHdpZHRoLAlTSUdOX1dJRFRIKSwKKwkJCQkJICAgIE1JTihoZWlnaHQsIFNJR05fSEVJR0hUKSwKKwkJCQkJICAgIEdES19QSVhCVUZfQUxQSEFfQklMRVZFTCwKKwkJCQkJICAgIDEyNywKKwkJCQkJICAgIEdES19SR0JfRElUSEVSX05PUk1BTCwKKwkJCQkJICAgIDAsIDApOworIyAgZW5kaWYKKwlpZiAobmVlZF9zY2FsZSkKKwkgICAgZ19vYmplY3RfdW5yZWYoc2lnbik7CisgICAgfQorfQorCisgICAgdm9pZCAqCitndWlfbWNoX3JlZ2lzdGVyX3NpZ24oY2hhcl91ICpzaWduZmlsZSkKK3sKKyAgICBpZiAoc2lnbmZpbGVbMF0gIT0gTlVMICYmIHNpZ25maWxlWzBdICE9ICctJyAmJiBndWkuaW5fdXNlKQorICAgIHsKKwlHZGtQaXhidWYgICAqc2lnbjsKKwlHRXJyb3IJICAgICplcnJvciA9IE5VTEw7CisJY2hhcl91CSAgICAqbWVzc2FnZTsKKworCXNpZ24gPSBnZGtfcGl4YnVmX25ld19mcm9tX2ZpbGUoKGNvbnN0IGNoYXIgKilzaWduZmlsZSwgJmVycm9yKTsKKworCWlmIChlcnJvciA9PSBOVUxMKQorCSAgICByZXR1cm4gc2lnbjsKKworCW1lc3NhZ2UgPSAoY2hhcl91ICopZXJyb3ItPm1lc3NhZ2U7CisKKwlpZiAobWVzc2FnZSAhPSBOVUxMICYmIGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJICAgIG1lc3NhZ2UgPSBzdHJpbmdfY29udmVydCgmaW5wdXRfY29udiwgbWVzc2FnZSwgTlVMTCk7CisKKwlpZiAobWVzc2FnZSAhPSBOVUxMKQorCXsKKwkgICAgLyogVGhlIGVycm9yIG1lc3NhZ2UgaXMgYWxyZWFkeSB0cmFuc2xhdGVkIGFuZCB3aWxsIGJlIG1vcmUKKwkgICAgICogZGVzY3JpcHRpdmUgdGhhbiBhbnl0aGluZyB3ZSBjb3VsZCBwb3NzaWJseSBkbyBvdXJzZWx2ZXMuICovCisJICAgIEVNU0cyKCJFMjU1OiAlcyIsIG1lc3NhZ2UpOworCisJICAgIGlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCQl2aW1fZnJlZShtZXNzYWdlKTsKKwl9CisJZ19lcnJvcl9mcmVlKGVycm9yKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZGVzdHJveV9zaWduKHZvaWQgKnNpZ24pCit7CisgICAgaWYgKHNpZ24gIT0gTlVMTCkKKwlnX29iamVjdF91bnJlZihzaWduKTsKK30KKworIyBlbHNlIC8qICFIQVZFX0dUSzIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBHZGtQaXhtYXAgKnBpeG1hcDsKKyAgICBHZGtCaXRtYXAgKm1hc2s7Cit9CitzaWduaWNvbl9UOworCisgICAgdm9pZAorZ3VpX21jaF9kcmF3c2lnbihpbnQgcm93LCBpbnQgY29sLCBpbnQgdHlwZW5yKQoreworICAgIHNpZ25pY29uX1QgKnNpZ247CisKKyAgICBzaWduID0gKHNpZ25pY29uX1QgKilzaWduX2dldF9pbWFnZSh0eXBlbnIpOworCisgICAgaWYgKHNpZ24gIT0gTlVMTCAmJiBzaWduLT5waXhtYXAgIT0gTlVMTAorCSYmIGd1aS5kcmF3YXJlYSAhPSBOVUxMICYmIGd1aS5kcmF3YXJlYS0+d2luZG93ICE9IE5VTEwpCisgICAgeworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCWludCB4b2Zmc2V0OworCWludCB5b2Zmc2V0OworCisJZ2RrX3dpbmRvd19nZXRfc2l6ZShzaWduLT5waXhtYXAsICZ3aWR0aCwgJmhlaWdodCk7CisKKwkvKiBUaGUgb3JpZ2luIGlzIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGl4bWFwLiAgVGhlcmVmb3JlCisJICogdGhlc2Ugb2Zmc2V0IG1heSBiZWNvbWUgbmVnYXRpdmUgaWYgdGhlIHBpeG1hcCBpcyBzbWFsbGVyIHRoYW4KKwkgKiB0aGUgMngxIGNlbGxzIHJlc2VydmVkIGZvciB0aGUgc2lnbiBpY29uLiAqLworCXhvZmZzZXQgPSAod2lkdGggIC0gU0lHTl9XSURUSCkgIC8gMjsKKwl5b2Zmc2V0ID0gKGhlaWdodCAtIFNJR05fSEVJR0hUKSAvIDI7CisKKwlnZGtfZ2Nfc2V0X2ZvcmVncm91bmQoZ3VpLnRleHRfZ2MsIGd1aS5iZ2NvbG9yKTsKKworCWdka19kcmF3X3JlY3RhbmdsZShndWkuZHJhd2FyZWEtPndpbmRvdywKKwkJCSAgIGd1aS50ZXh0X2djLAorCQkJICAgVFJVRSwKKwkJCSAgIEZJTExfWChjb2wpLAorCQkJICAgRklMTF9ZKHJvdyksCisJCQkgICBTSUdOX1dJRFRILAorCQkJICAgU0lHTl9IRUlHSFQpOworCisJLyogU2V0IHRoZSBjbGlwIG1hc2sgZm9yIGJpbGV2ZWwgdHJhbnNwYXJlbmN5ICovCisJaWYgKHNpZ24tPm1hc2sgIT0gTlVMTCkKKwl7CisJICAgIGdka19nY19zZXRfY2xpcF9vcmlnaW4oZ3VpLnRleHRfZ2MsCisJCQkJICAgRklMTF9YKGNvbCkgLSB4b2Zmc2V0LAorCQkJCSAgIEZJTExfWShyb3cpIC0geW9mZnNldCk7CisJICAgIGdka19nY19zZXRfY2xpcF9tYXNrKGd1aS50ZXh0X2djLCBzaWduLT5tYXNrKTsKKwl9CisKKwlnZGtfZHJhd19waXhtYXAoZ3VpLmRyYXdhcmVhLT53aW5kb3csCisJCQlndWkudGV4dF9nYywKKwkJCXNpZ24tPnBpeG1hcCwKKwkJCU1BWCgwLCB4b2Zmc2V0KSwKKwkJCU1BWCgwLCB5b2Zmc2V0KSwKKwkJCUZJTExfWChjb2wpIC0gTUlOKDAsIHhvZmZzZXQpLAorCQkJRklMTF9ZKHJvdykgLSBNSU4oMCwgeW9mZnNldCksCisJCQlNSU4od2lkdGgsICBTSUdOX1dJRFRIKSwKKwkJCU1JTihoZWlnaHQsIFNJR05fSEVJR0hUKSk7CisKKwlnZGtfZ2Nfc2V0X2NsaXBfbWFzayhndWkudGV4dF9nYywgTlVMTCk7CisgICAgfQorfQorCisgICAgdm9pZCAqCitndWlfbWNoX3JlZ2lzdGVyX3NpZ24oY2hhcl91ICpzaWduZmlsZSkKK3sKKyAgICBzaWduaWNvbl9UICpzaWduID0gTlVMTDsKKworICAgIGlmIChzaWduZmlsZVswXSAhPSBOVUwgJiYgc2lnbmZpbGVbMF0gIT0gJy0nCisJICAgICYmIGd1aS5kcmF3YXJlYSAhPSBOVUxMICYmIGd1aS5kcmF3YXJlYS0+d2luZG93ICE9IE5VTEwpCisgICAgeworCXNpZ24gPSAoc2lnbmljb25fVCAqKWFsbG9jKHNpemVvZihzaWduaWNvbl9UKSk7CisKKwlpZiAoc2lnbiAhPSBOVUxMKSAvKiBOVUxMID09IE9PTSA9PSAiY2Fubm90IHJlYWxseSBoYXBwZW4iICovCisJeworCSAgICBzaWduLT5tYXNrID0gTlVMTDsKKwkgICAgc2lnbi0+cGl4bWFwID0gZ2RrX3BpeG1hcF9jb2xvcm1hcF9jcmVhdGVfZnJvbV94cG0oCisJCSAgICBndWkuZHJhd2FyZWEtPndpbmRvdywgTlVMTCwKKwkJICAgICZzaWduLT5tYXNrLCBOVUxMLAorCQkgICAgKGNvbnN0IGNoYXIgKilzaWduZmlsZSk7CisKKwkgICAgaWYgKHNpZ24tPnBpeG1hcCA9PSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHNpZ24pOworCQlzaWduID0gTlVMTDsKKwkJRU1TRyhfKGVfc2lnbmRhdGEpKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIHNpZ247Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2lnbih2b2lkICpzaWduKQoreworICAgIGlmIChzaWduICE9IE5VTEwpCisgICAgeworCXNpZ25pY29uX1QgKnNpZ25pY29uID0gKHNpZ25pY29uX1QgKilzaWduOworCisJaWYgKHNpZ25pY29uLT5waXhtYXAgIT0gTlVMTCkKKwkgICAgZ2RrX3BpeG1hcF91bnJlZihzaWduaWNvbi0+cGl4bWFwKTsKKwlpZiAoc2lnbmljb24tPm1hc2sgIT0gTlVMTCkKKwkgICAgZ2RrX2JpdG1hcF91bnJlZihzaWduaWNvbi0+bWFzayk7CisKKwl2aW1fZnJlZShzaWduaWNvbik7CisgICAgfQorfQorIyBlbmRpZiAvKiAhSEFWRV9HVEsyICovCisKKyNlbmRpZiAvKiBGRUFUX1NJR05fSUNPTlMgKi8KKwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tYWMuYyBiL3NyYy9ndWlfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NGM2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfbWFjLmMKQEAgLTAsMCArMSw1ODIwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCQkJCU1hY2ludG9zaCBwb3J0IGJ5IERhbnkgU3QtQW1hbnQKKyAqCQkJCQkgICAgICBhbmQgQXhlbCBLaWVsaG9ybgorICoJCQkJUG9ydCB0byBNUFcgYnkgQmVybmhhcmQgUHKfbW1lcgorICoJCQkJSW5pdGlhbCBDYXJib24gcG9ydCBieSBBbW1vbiBTa2lkbW9yZQorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogTk9URTogQ29tbWVudCBtZW50aW9ubmluZyBGQVEgcmVmZXIgdG8gdGhlIGJvb2s6CisgKiAgICAgICAiTWFjd29ybGQgTWFjIFByb2dyYW1taW5nIEZBUXMiIGZyb20gIklERyBCb29rcyIKKyAqLworCisvKgorICogV0FSTklORzogVmltIG11c3QgYmUgYWJsZSB0byBjb21waWxlIHdpdGhvdXQgQ2FyYm9uCisgKgkgICAgQXMgdGhlIGRlc2lyZWQgbWluaW11bSByZXF1aXJlbWVudCBhcmUgY2lyY2EgU3lzdGVtIDcKKyAqCSAgICAoSSB3YW50IHRvIHJ1biBpdCBvbiBteSBNYWMgQ2xhc3NpYykgKERhbnkpCisgKi8KKworLyoKKyAqIFRPRE86IENoYW5nZSBzdGlsbCB0byBtZXJnZSBmcm9tIHRoZSBtYWN2aW0ncyBpRGlzaworICoKKyAqIGVycm9yX2dhLCBtY2hfZXJybXNnLCBOYXZpZ2F0aW9uJ3MgY2hhbmdlcyBpbiBndWlfbWNoX2Jyb3dzZQorICogdXNlcyBvZiBNZW51SXRlbUluZGV4LCBjaGFuZ2VzIGluIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSwKKyAqIFNjcmFwTWFuYWdlciBlcnJvciBoYW5kbGluZy4KKyAqIENvbW1lbnRzIGFib3V0IGZ1bmN0aW9uIHJlbWFpbmluZyB0byBDYXJib25pemUuCisgKgorICovCisKKy8qIFRPRE86IGZpbmQgdGhlIGJlc3QgcGxhY2UgZm9yIHRoaXMgKERhbnkpICovCisjaWYgMAorIyAgaWYgISBUQVJHRVRfQVBJX01BQ19DQVJCT04KKy8qIEVuYWJsZSB0aGUgbmV3IEFQSSBmdW5jdGlvbnMgZXZlbiB3aGVuIG5vdCBjb21waWxpbmcgZm9yIENhcmJvbiAqLworLyogQXBwbGUgcmVjb21lbmRzIFVuaXZlcnNhbCBJbnRlcmZhY2UgMy4zLjIgb3IgbGF0ZXIgKi8KKyMgIGRlZmluZSBPUEFRVUVfVE9PTEJPWF9TVFJVQ1RTCQkxCisjICBkZWZpbmUgQUNDRVNTT1JfQ0FMTFNfQVJFX0ZVTkNUSU9OUwkxCisvKiBIZWxwIE1lbnUgbm90IHN1cHBvcnRlZCBieSBDYXJib24gKi8KKyMgIGRlZmluZSBVU0VfSEVMUE1FTlUKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8RGV2aWNlcy5oPiAvKiBpbmNsdWRlZCBmaXJzdCB0byBhdm9pZCBDUiBwcm9ibGVtcyAqLworI2luY2x1ZGUgInZpbS5oIgorCisvKiBFbmFibGUgQ29udGV4dHVhbCBNZW51IFN1cHBvcnQgKi8KKyNpZiBVTklWRVJTQUxfSU5URVJGQUNFU19WRVJTSU9OID49IDB4MDMyMAorIyBkZWZpbmUgVVNFX0NUUkxDTElDS01FTlUKKyNlbmRpZgorCisvKiBQdXQgVmltIEhlbHAgaW4gTWFjT1MgSGVscCAqLworI2RlZmluZSBVU0VfSEVMUE1FTlUKKworLyogRW5hYmxlIEFFVkVOVCAqLworI2RlZmluZSBVU0VfQUVWRU5UCisKKy8qIENvbXBpbGUgYXMgQ29kZVdhcmlvciBFeHRlcm5hbCBFZGl0b3IgKi8KKyNpZiBkZWZpbmVkKEZFQVRfQ1dfRURJVE9SKSAmJiAhZGVmaW5lZChVU0VfQUVWRU5UKQorIyBkZWZpbmUgVVNFX0FFVkVOVCAvKiBOZWVkIEFwcGxlIEV2ZW50IFN1cHBvcnQgKi8KKyNlbmRpZgorCisvKiBUaGUgVklNIGNyZWF0b3IgaXMgQ29kZVdhcmlvciBzcGVjaWZpYyAqLworI2lmICEoZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgfHwgZGVmaW5lZChfX0FQUExFX0NDX18pKQorIyBkZWZpbmUgVVNFX1ZJTV9DUkVBVE9SX0lECisjZWxzZQorIyBpZiAwIC8qIFdhcyB0aGlzIHVzZWZ1bGwgZm9yIHNvbWUgY29tcGlsZXI/IChEYW55KSAqLworc3RhdGljICAgIE9TVHlwZQlfZmNyZWF0b3IgPSAnVklNISc7CitzdGF0aWMgICAgT1NUeXBlCV9mdHlwZSA9ICdURVhUJzsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBDQVJCT04gdmVyc2lvbiBvbmx5IHRlc3RlZCB3aXRoIFByb2plY3QgQnVpbGRlciB1bmRlciBNYWNPUyBYICovCisjdW5kZWYgVVNFX0NBUkJPTklaRUQKKyNpZiAoZGVmaW5lZChfX0FQUExFX0NDX18pIHx8IGRlZmluZWQoX19NUkNfXykpICYmIGRlZmluZWQoVEFSR0VUX0FQSV9NQUNfQ0FSQk9OKQorIyBpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyMgIGRlZmluZSBVU0VfQ0FSQk9OSVpFRAorIyBlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBVU0VfTU9VU0VXSEVFTAorI2lmIGRlZmluZWQoTUFDT1NfWCkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKKyMgZGVmaW5lIFVTRV9NT1VTRVdIRUVMCitzdGF0aWMgRXZlbnRIYW5kbGVyVVBQIG1vdXNlV2hlZWxIYW5kbGVyVVBQID0gTlVMTDsKKyNlbmRpZgorCisvKiBEZWJ1Z2dpbmcgZmVhdHVyZTogc3RhcnQgVmltIHdpbmRvdyBPRkZTRVRlZCAqLworI3VuZGVmIFVTRV9PRkZTRVRFRF9XSU5ET1cKKworLyogRGVidWdnaW5nIGZlYXR1cmU6IHVzZSBDb2RlV2FyaW9yIFNJT1VYICovCisjdW5kZWYgVVNFX1NJT1VYCisKKworLyogSW5jbHVkZSBzb21lIGZpbGUuIFRPRE86IG1vdmUgaW50byBvc19tYWMuaCAqLworI2luY2x1ZGUgPE1lbnVzLmg+CisjaW5jbHVkZSA8UmVzb3VyY2VzLmg+CisjaWYgIVRBUkdFVF9BUElfTUFDX0NBUkJPTgorI2luY2x1ZGUgPFN0YW5kYXJkRmlsZS5oPgorI2luY2x1ZGUgPFRyYXBzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxCYWxsb29ucy5oPgorI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgorI2lmZGVmIFVTRV9BRVZFTlQKKyMgaW5jbHVkZSA8QXBwbGVFdmVudHMuaD4KKyMgaW5jbHVkZSA8QUVSZWdpc3RyeS5oPgorI2VuZGlmCisjaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKKyMgaW5jbHVkZSA8R2VzdGFsdC5oPgorI2VuZGlmCisjaWZkZWYgVVNFX1NJT1VYCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPHNpb3V4Lmg+CisjIGluY2x1ZGUgPGNvbnNvbGUuaD4KKyNlbmRpZgorI2lmIFVOSVZFUlNBTF9JTlRFUkZBQ0VTX1ZFUlNJT04gPj0gMHgwMzMwCisjIGluY2x1ZGUgPENvbnRyb2xEZWZpbml0aW9ucy5oPgorIyBpbmNsdWRlIDxOYXZpZ2F0aW9uLmg+ICAvKiBOYXZpZ2F0aW9uIG9ubHkgcGFydCBvZiA/PyAqLworI2VuZGlmCisKKyNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgMAorLyogTmV3IEhlbHAgSW50ZXJmYWNlIGZvciBNYWMsIG5vdCBpbXBsZW1lbnRlZCB5ZXQuKi8KKyMgaW5jbHVkZSA8TWFjSGVscC5oPgorI2VuZGlmCisKKy8qCisgKiBUcmFuc2xhdGUgbmV3IG5hbWUgdG8gb2xkIG9uZXMKKyAqIE5ldyBmdW5jdGlvbiBvbmx5IGF2YWlsYWJsZSBpbiBNYWNPUyA4LjUsCisgKiBTbyB1c2Ugb2xkIG9uZSB0byBiZSBjb21wYXRpYmxlIGJhY2sgdG8gU3lzdGVtIDcKKyAqLworI2lmbmRlZiBVU0VfQ0FSQk9OSVpFRAorIyB1bmRlZiAgRW5hYmxlTWVudUl0ZW0KKyMgZGVmaW5lIEVuYWJsZU1lbnVJdGVtIEVuYWJsZUl0ZW0KKyMgdW5kZWYgIERpc2FibGVNZW51SXRlbQorIyBkZWZpbmUgRGlzYWJsZU1lbnVJdGVtIERpc2FibGVJdGVtCisjZW5kaWYKKworLyogQ2FyYm9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIEdldC9TZXRDb250cm9sbCBmdW5jdGlvbnMsCisgKiB1c2UgR2V0L1NldENvbnRyb2wzMkJpdCBpbnN0ZWFkIGFuZCByZW5hbWUgZm9yIG5vbi1jYXJib24KKyAqIHN5c3RlbXMuCisgKi8KKworI2lmbmRlZiBVU0VfQ0FSQk9OSVpFRAorIyB1bmRlZiAgICBTZXRDb250cm9sMzJCaXRNYXhpbXVtCisjIGRlZmluZSAgIFNldENvbnRyb2wzMkJpdE1heGltdW0gU2V0Q29udHJvbE1heGltdW0KKyMgdW5kZWYgICAgU2V0Q29udHJvbDMyQml0TWluaW11bQorIyBkZWZpbmUgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtIFNldENvbnRyb2xNaW5pbXVtCisjIHVuZGVmICAgIFNldENvbnRyb2wzMkJpdFZhbHVlCisjIGRlZmluZSAgIFNldENvbnRyb2wzMkJpdFZhbHVlIFNldENvbnRyb2xWYWx1ZQorIyB1bmRlZiAgICBHZXRDb250cm9sMzJCaXRWYWx1ZQorIyBkZWZpbmUgICBHZXRDb250cm9sMzJCaXRWYWx1ZSBHZXRDb250cm9sVmFsdWUKKyNlbmRpZgorCisvKgorICogPz8/CisgKi8KKworI2RlZmluZSBrTm90aGluZyAwCisjZGVmaW5lIGtDcmVhdGVFbXB0eSAyIC8qMSovCisjZGVmaW5lIGtDcmVhdGVSZWN0IDIKKyNkZWZpbmUga0Rlc3Ryb3kgMworCisvKgorICogRGFueTogRG9uJ3QgbGlrZSB0aG9zZS4uLgorICovCisKKyNkZWZpbmUgdG9wTGVmdChyKQkoKChQb2ludCopJihyKSlbMF0pCisjZGVmaW5lIGJvdFJpZ2h0KHIpCSgoKFBvaW50KikmKHIpKVsxXSkKKworCisvKiBUaW1lIG9mIGxhc3QgbW91c2UgY2xpY2ssIHRvIGRldGVjdCBkb3VibGUtY2xpY2sgKi8KK3N0YXRpYyBsb25nIGxhc3RNb3VzZVRpY2sgPSAwOworCisvKiA/Pz8gKi8KK3N0YXRpYyBSZ25IYW5kbGUgY3Vyc29yUmduOworc3RhdGljIFJnbkhhbmRsZSBkcmFnUmduOworc3RhdGljIFJlY3QgZHJhZ1JlY3Q7CitzdGF0aWMgc2hvcnQgZHJhZ1JlY3RFbmJsOworc3RhdGljIHNob3J0IGRyYWdSZWN0Q29udHJvbDsKKworLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgd2hlbiB3YWl0aW5nIGZvciBhbiBldmVudCwgd2hpY2ggaXMgdGhlIG9ubHkgbW9tZW50CisgKiBzY3JvbGxiYXIgZHJhZ2dpbmcgY2FuIGJlIGRvbmUgZGlyZWN0bHkuICBJdCdzIG5vdCBhbGxvd2VkIHdoaWxlIGNvbW1hbmRzCisgKiBhcmUgZXhlY3V0ZWQsIGJlY2F1c2UgaXQgbWF5IG1vdmUgdGhlIGN1cnNvciBhbmQgdGhhdCBtYXkgY2F1c2UgdW5leHBlY3RlZAorICogcHJvYmxlbXMgKGUuZy4sIHdoaWxlICI6cyIgaXMgd29ya2luZykuCisgKi8KK3N0YXRpYyBpbnQgYWxsb3dfc2Nyb2xsYmFyID0gRkFMU0U7CisKKy8qIExhc3QgbW91c2UgY2xpY2sgY2F1c2VkIGNvbnRleHR1YWwgbWVudSwgKHRvIHByb3ZpZGUgcHJvcGVyIHJlbGVhc2UpICovCisjaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKK3N0YXRpYyBzaG9ydCBjbGlja0lzUG9wdXA7CisjZW5kaWYKKworLyogRmVlZGJhY2sgQWN0aW9uIGZvciBTY3JvbGxiYXIgKi8KK0NvbnRyb2xBY3Rpb25VUFAgZ1Njcm9sbEFjdGlvbjsKK0NvbnRyb2xBY3Rpb25VUFAgZ1Njcm9sbERyYWc7CisKKy8qIEtlZXBpbmcgdHJhY2sgb2Ygd2hpY2ggc2Nyb2xsYmFyIGlzIGJlaW5nIGRyYWdnZWQgKi8KK3N0YXRpYyBDb250cm9sSGFuZGxlIGRyYWdnZWRfc2IgPSBOVUxMOworCisvKgorICogVGhlIFF1aWNrZHJhdyBnbG9iYWwgaXMgcHJlZGVmaW5lZCBpbiBDb2RlV2FyaW9yCisgKiBidXQgaXMgbm90IGluIEFwcGxlIE1QVworICovCisjaWYgKGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pKQorIyBpZiAhKGRlZmluZWQoVEFSR0VUX0FQSV9NQUNfQ0FSQk9OKSAmJiBUQVJHRVRfQVBJX01BQ19DQVJCT04pCitRREdsb2JhbHMgcWQ7CisjIGVuZGlmCisjZW5kaWYKKworLyogQ29sb3JzIE1hY3JvcyAqLworI2RlZmluZSBSR0IocixnLGIpCSgocikgPDwgMTYpICsgKChnKSA8PCA4KSArIChiKQorI2RlZmluZSBSZWQoYykJCSgoYyAmIDB4MDBGRjAwMDApID4+IDE2KQorI2RlZmluZSBHcmVlbihjKQkoKGMgJiAweDAwMDBGRjAwKSA+PiAgOCkKKyNkZWZpbmUgQmx1ZShjKQkJKChjICYgMHgwMDAwMDBGRikgPj4gIDApCisKKy8qIEtleSBtYXBwaW5nICovCisKKyNkZWZpbmUgdmtfRXNjCQkweDM1CS8qIC0+IDFCICovCisKKyNkZWZpbmUgdmtfRjEJCTB4N0EJLyogLT4gMTAgKi8KKyNkZWZpbmUgdmtfRjIJCTB4NzggIC8qMHg2MyovCisjZGVmaW5lIHZrX0YzCQkweDYzICAvKjB4NzYqLworI2RlZmluZSB2a19GNAkJMHg3NiAgLyoweDYwKi8KKyNkZWZpbmUgdmtfRjUJCTB4NjAgIC8qMHg2MSovCisjZGVmaW5lIHZrX0Y2CQkweDYxICAvKjB4NjIqLworI2RlZmluZSB2a19GNwkJMHg2MiAgLyoweDYzKi8gIC8qPyovCisjZGVmaW5lIHZrX0Y4CQkweDY0CisjZGVmaW5lIHZrX0Y5CQkweDY1CisjZGVmaW5lIHZrX0YxMAkJMHg2RAorI2RlZmluZSB2a19GMTEJCTB4NjcKKyNkZWZpbmUgdmtfRjEyCQkweDZGCisjZGVmaW5lIHZrX0YxMwkJMHg2OQorI2RlZmluZSB2a19GMTQJCTB4NkIKKyNkZWZpbmUgdmtfRjE1CQkweDcxCisKKyNkZWZpbmUgdmtfQ2xyCQkweDQ3CS8qIC0+IDFCIChFU0MpICovCisjZGVmaW5lIHZrX0VudGVyCTB4NEMJLyogLT4gMDMgKi8KKworI2RlZmluZSB2a19TcGFjZQkweDMxCS8qIC0+IDIwICovCisjZGVmaW5lIHZrX1RhYgkJMHgzMAkvKiAtPiAwOSAqLworI2RlZmluZSB2a19SZXR1cm4JMHgyNAkvKiAtPiAwRCAqLworLyogVGhpcyBpcyB3cm9uZyBmb3IgT1NYLCB3aGF0IGlzIGl0IGZvcj8gKi8KKyNkZWZpbmUgdmtfRGVsZXRlCTBYMDgJLyogLT4gMDggQmFja1NwYWNlICovCisKKyNkZWZpbmUgdmtfSGVscAkJMHg3MgkvKiAtPiAwNSAqLworI2RlZmluZSB2a19Ib21lCQkweDczCS8qIC0+IDAxICovCisjZGVmaW5lCXZrX1BhZ2VVcAkweDc0CS8qIC0+IDBEICovCisjZGVmaW5lIHZrX0Z3ZERlbGV0ZQkweDc1CS8qIC0+IDdGICovCisjZGVmaW5lCXZrX0VuZAkJMHg3NwkvKiAtPiAwNCAqLworI2RlZmluZSB2a19QYWdlRG93bgkweDc5CS8qIC0+IDBDICovCisKKyNkZWZpbmUgdmtfVXAJCTB4N0UJLyogLT4gMUUgKi8KKyNkZWZpbmUgdmtfRG93bgkJMHg3RAkvKiAtPiAxRiAqLworI2RlZmluZQl2a19MZWZ0CQkweDdCCS8qIC0+IDFDICovCisjZGVmaW5lIHZrX1JpZ2h0CTB4N0MJLyogLT4gMUQgKi8KKworI2RlZmluZSB2a19VbmRvCQl2a19GMQorI2RlZmluZSB2a19DdXQJCXZrX0YyCisjZGVmaW5lCXZrX0NvcHkJCXZrX0YzCisjZGVmaW5lCXZrX1Bhc3RlCXZrX0Y0CisjZGVmaW5lIHZrX1ByaW50U2NyZWVuCXZrX0YxMworI2RlZmluZSB2a19TQ3JvbGxMb2NrCXZrX0YxNAorI2RlZmluZQl2a19QYXVzZQl2a19GMTUKKyNkZWZpbmUJdmtfTnVtTG9jawl2a19DbHIKKyNkZWZpbmUgdmtfSW5zZXJ0CXZrX0hlbHAKKworI2RlZmluZSBLZXlTeW0JY2hhcgorCitzdGF0aWMgc3RydWN0Cit7CisgICAgS2V5U3ltICBrZXlfc3ltOworICAgIGNoYXJfdSAgdmltX2NvZGUwOworICAgIGNoYXJfdSAgdmltX2NvZGUxOworfSBzcGVjaWFsX2tleXNbXSA9Cit7CisgICAge3ZrX1VwLAkJJ2snLCAndSd9LAorICAgIHt2a19Eb3duLAkJJ2snLCAnZCd9LAorICAgIHt2a19MZWZ0LAkJJ2snLCAnbCd9LAorICAgIHt2a19SaWdodCwJCSdrJywgJ3InfSwKKworICAgIHt2a19GMSwJCSdrJywgJzEnfSwKKyAgICB7dmtfRjIsCQknaycsICcyJ30sCisgICAge3ZrX0YzLAkJJ2snLCAnMyd9LAorICAgIHt2a19GNCwJCSdrJywgJzQnfSwKKyAgICB7dmtfRjUsCQknaycsICc1J30sCisgICAge3ZrX0Y2LAkJJ2snLCAnNid9LAorICAgIHt2a19GNywJCSdrJywgJzcnfSwKKyAgICB7dmtfRjgsCQknaycsICc4J30sCisgICAge3ZrX0Y5LAkJJ2snLCAnOSd9LAorICAgIHt2a19GMTAsCQknaycsICc7J30sCisKKyAgICB7dmtfRjExLAkJJ0YnLCAnMSd9LAorICAgIHt2a19GMTIsCQknRicsICcyJ30sCisgICAge3ZrX0YxMywJCSdGJywgJzMnfSwKKyAgICB7dmtfRjE0LAkJJ0YnLCAnNCd9LAorICAgIHt2a19GMTUsCQknRicsICc1J30sCisKKy8qICB7WEtfSGVscCwJCSclJywgJzEnfSwgKi8KKy8qICB7WEtfVW5kbywJCScmJywgJzgnfSwgKi8KKy8qICB7WEtfQmFja1NwYWNlLAknaycsICdiJ30sICovCisjaWZuZGVmIE1BQ09TX1gKKyAgICB7dmtfRGVsZXRlLAkJJ2snLCAnYid9LAorI2VuZGlmCisgICAge3ZrX0luc2VydCwJCSdrJywgJ0knfSwKKyAgICB7dmtfRndkRGVsZXRlLAknaycsICdEJ30sCisgICAge3ZrX0hvbWUsCQknaycsICdoJ30sCisgICAge3ZrX0VuZCwJCSdAJywgJzcnfSwKKy8qICB7WEtfUHJpb3IsCQknaycsICdQJ30sICovCisvKiAge1hLX05leHQsCQknaycsICdOJ30sICovCisvKiAge1hLX1ByaW50LAkJJyUnLCAnOSd9LCAqLworCisgICAge3ZrX1BhZ2VVcCwJCSdrJywgJ1AnfSwKKyAgICB7dmtfUGFnZURvd24sCSdrJywgJ04nfSwKKworICAgIC8qIEVuZCBvZiBsaXN0IG1hcmtlcjogKi8KKyAgICB7KEtleVN5bSkwLAkJMCwgMH0KK307CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvcndhcmQgZGVjbGFyYXRpb24gKGZvciB0aG9zZSBuZWVkZWQpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZkZWYgVVNFX0FFVkVOVAorT1NFcnIgSGFuZGxlVW51c2VkUGFybXMgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCk7CisjZW5kaWYKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29udmVyc2lvbiBVdGlsaXR5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogQzJQYXNjYWxfc2F2ZQorICoKKyAqIEFsbG9jYXRlIG1lbW9yeSBhbmQgY29udmVydCB0aGUgQy1TdHJpbmcgcGFzc2VkIGluCisgKiBpbnRvIGEgcGFzY2FsIHN0cmluZworICoKKyAqLworCitjaGFyX3UgKkMyUGFzY2FsX3NhdmUoY2hhcl91ICpDc3RyaW5nKQoreworICAgIGNoYXJfdSAgKlBhc2NhbFN0cmluZzsKKyAgICBpbnQJICAgIGxlbjsKKworICAgIGlmIChDc3RyaW5nID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBsZW4gPSBTVFJMRU4oQ3N0cmluZyk7CisKKyAgICBpZiAobGVuID4gMjU1KSAvKiBUcnVuY2F0ZSBpZiBuZWNlc3NhcnkgKi8KKwlsZW4gPSAyNTU7CisKKyAgICBQYXNjYWxTdHJpbmcgPSBhbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoUGFzY2FsU3RyaW5nICE9IE5VTEwpCisgICAgeworCW1jaF9tZW1tb3ZlKFBhc2NhbFN0cmluZyArIDEsIENzdHJpbmcsIGxlbik7CisJUGFzY2FsU3RyaW5nWzBdID0gbGVuOworICAgIH0KKworICAgIHJldHVybiBQYXNjYWxTdHJpbmc7Cit9CisKKy8qCisgKiBDMlBhc2NhbF9zYXZlX2FuZF9yZW1vdmVfYmFja3NsYXNoCisgKgorICogQWxsb2NhdGUgbWVtb3J5IGFuZCBjb252ZXJ0IHRoZSBDLVN0cmluZyBwYXNzZWQgaW4KKyAqIGludG8gYSBwYXNjYWwgc3RyaW5nLiBBbHNvIHJlbW92ZSB0aGUgYmFja3NsYXNoIGF0IHRoZSBzYW1lIHRpbWUKKyAqCisgKi8KKworY2hhcl91ICpDMlBhc2NhbF9zYXZlX2FuZF9yZW1vdmVfYmFja3NsYXNoKGNoYXJfdSAqQ3N0cmluZykKK3sKKyAgICBjaGFyX3UgICpQYXNjYWxTdHJpbmc7CisgICAgaW50CSAgICBsZW47CisgICAgY2hhcl91ICAqcCwgKmM7CisKKyAgICBsZW4gPSBTVFJMRU4oQ3N0cmluZyk7CisKKyAgICBpZiAobGVuID4gMjU1KSAvKiBUcnVuY2F0ZSBpZiBuZWNlc3NhcnkgKi8KKwlsZW4gPSAyNTU7CisKKyAgICBQYXNjYWxTdHJpbmcgPSBhbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoUGFzY2FsU3RyaW5nICE9IE5VTEwpCisgICAgeworCWZvciAoYyA9IENzdHJpbmcsIHAgPSBQYXNjYWxTdHJpbmcrMSwgbGVuID0gMDsgKCpjICE9IDApICYmIChsZW4gPCAyNTUpOyBjKyspCisJeworCSAgICBpZiAoKCpjID09ICdcXCcpICYmIChjWzFdICE9IDApKQorCSAgICB7CisJCWMrKzsKKwkgICAgfQorCSAgICAqcCA9ICpjOworCSAgICBwKys7CisJICAgIGxlbisrOworCX0KKwlQYXNjYWxTdHJpbmdbMF0gPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIFBhc2NhbFN0cmluZzsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlIG1vZGlmaWVycyBvZiBhbiBFdmVudCBpbnRvIHZpbSdzIG1vZGlmaWVycyAobW91c2UpCisgKi8KKworICAgIGludF91CitFdmVudE1vZGlmaWVyczJWaW1Nb3VzZU1vZGlmaWVycyhFdmVudE1vZGlmaWVycyBtYWNNb2RpZmllcnMpCit7CisgICAgaW50X3UgdmltTW9kaWZpZXJzID0gMHgwMDsKKworICAgIGlmIChtYWNNb2RpZmllcnMgJiAoc2hpZnRLZXkgfCByaWdodFNoaWZ0S2V5KSkKKwl2aW1Nb2RpZmllcnMgfD0gTU9VU0VfU0hJRlQ7CisgICAgaWYgKG1hY01vZGlmaWVycyAmIChjb250cm9sS2V5IHwgcmlnaHRDb250cm9sS2V5KSkKKwl2aW1Nb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiAobWFjTW9kaWZpZXJzICYgKG9wdGlvbktleSB8IHJpZ2h0T3B0aW9uS2V5KSkKKwl2aW1Nb2RpZmllcnMgfD0gTU9VU0VfQUxUOworI2lmIDAKKyAgICAvKiBOb3QgeWV0IHN1cHBvcnRlZCAqLworICAgIGlmIChtYWNNb2RpZmllcnMgJiAoY21kS2V5KSkgLyogVGhlcmUncyBubyByaWdodENtZEtleSAqLworCXZpbU1vZGlmaWVycyB8PSBNT1VTRV9DTUQ7CisjZW5kaWYKKyAgICByZXR1cm4gKHZpbU1vZGlmaWVycyk7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBtb2RpZmllcnMgb2YgYW4gRXZlbnQgaW50byB2aW0ncyBtb2RpZmllcnMgKGtleXMpCisgKi8KKworICAgIHN0YXRpYyBpbnRfdQorRXZlbnRNb2RpZmllcnMyVmltTW9kaWZpZXJzKEV2ZW50TW9kaWZpZXJzIG1hY01vZGlmaWVycykKK3sKKyAgICBpbnRfdSB2aW1Nb2RpZmllcnMgPSAweDAwOworCisgICAgaWYgKG1hY01vZGlmaWVycyAmIChzaGlmdEtleSB8IHJpZ2h0U2hpZnRLZXkpKQorCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKKyAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNvbnRyb2xLZXkgfCByaWdodENvbnRyb2xLZXkpKQorCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOworICAgIGlmIChtYWNNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgcmlnaHRPcHRpb25LZXkpKQorCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19BTFQ7CisjaWZkZWYgVVNFX0NNRF9LRVkKKyAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNtZEtleSkpIC8qIFRoZXJlJ3Mgbm8gcmlnaHRDbWRLZXkgKi8KKwl2aW1Nb2RpZmllcnMgfD0gTU9EX01BU0tfQ01EOworI2VuZGlmCisgICAgcmV0dXJuICh2aW1Nb2RpZmllcnMpOworfQorCisvKiBDb252ZXJ0IGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBvaW50IHNpemUgaW50byBwaXhlbHMuIFRoZSBzdHJpbmcgc2hvdWxkCisgKiBiZSBhIHBvc2l0aXZlIGRlY2ltYWwgbnVtYmVyLCB3aXRoIGFuIG9wdGlvbmFsIGRlY2ltYWwgcG9pbnQgKGVnLCAiMTIiLCBvcgorICogIjEwLjUiKS4gVGhlIHBpeGVsIHZhbHVlIGlzIHJldHVybmVkLCBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHVuY29udmVydGVkCisgKiBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluICplbmQuIFRoZSBmbGFnICJ2ZXJ0aWNhbCIgc2F5cyB3aGV0aGVyIHRoaXMKKyAqIGNhbGN1bGF0aW9uIGlzIGZvciBhIHZlcnRpY2FsIChoZWlnaHQpIHNpemUgb3IgYSBob3Jpem9udGFsICh3aWR0aCkgb25lLgorICoKKyAqIEZyb20gZ3VpX3c0OC5jCisgKi8KKyAgICBzdGF0aWMgaW50Citwb2ludHNfdG9fcGl4ZWxzKGNoYXJfdSAqc3RyLCBjaGFyX3UgKiplbmQsIGludCB2ZXJ0aWNhbCkKK3sKKyAgICBpbnQJCXBpeGVsczsKKyAgICBpbnQJCXBvaW50cyA9IDA7CisgICAgaW50CQlkaXZpc29yID0gMDsKKworICAgIHdoaWxlICgqc3RyKQorICAgIHsKKwlpZiAoKnN0ciA9PSAnLicgJiYgZGl2aXNvciA9PSAwKQorCXsKKwkgICAgLyogU3RhcnQga2VlcGluZyBhIGRpdmlzb3IsIGZvciBsYXRlciAqLworCSAgICBkaXZpc29yID0gMTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFpc2RpZ2l0KCpzdHIpKQorCSAgICBicmVhazsKKworCXBvaW50cyAqPSAxMDsKKwlwb2ludHMgKz0gKnN0ciAtICcwJzsKKwlkaXZpc29yICo9IDEwOworCisJKytzdHI7CisgICAgfQorCisgICAgaWYgKGRpdmlzb3IgPT0gMCkKKwlkaXZpc29yID0gMTsKKworICAgIHBpeGVscyA9IHBvaW50cy9kaXZpc29yOworICAgICplbmQgPSBzdHI7CisgICAgcmV0dXJuIHBpeGVsczsKK30KKworLyoKKyAqIENvbnZlcnQgYSBsaXN0IG9mIEZTU3BlYyBhbGlhc2VzIGludG8gYSBsaXN0IG9mIGZ1bGxwYXRobmFtZQorICogY2hhcmFjdGVyIHN0cmluZ3MuCisgKi8KKworY2hhcl91ICoqbmV3X2ZuYW1lc19mcm9tX0FFRGVzYyhBRURlc2MgKnRoZUxpc3QsIGxvbmcgKm51bUZpbGVzLCBPU0VyciAqZXJyb3IpCit7CisgICAgY2hhcl91CSoqZm5hbWVzID0gTlVMTDsKKyAgICBPU0VycgluZXdFcnJvcjsKKyAgICBsb25nCWZpbGVDb3VudDsKKyAgICBGU1NwZWMJZmlsZVRvT3BlbjsKKyAgICBsb25nCWFjdHVhbFNpemU7CisgICAgQUVLZXl3b3JkCWR1bW15S2V5d29yZDsKKyAgICBEZXNjVHlwZQlkdW1teVR5cGU7CisKKyAgICAvKiBHZXQgbnVtYmVyIG9mIGZpbGVzIGluIGxpc3QgKi8KKyAgICAqZXJyb3IgPSBBRUNvdW50SXRlbXModGhlTGlzdCwgbnVtRmlsZXMpOworICAgIGlmICgqZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoImZuYW1lX2Zyb21fQUVEZXNjOiBBRUNvdW50SXRlbXMgZXJyb3I6ICVkXG4iLCBlcnJvcik7CisjZW5kaWYKKwlyZXR1cm4oZm5hbWVzKTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgcG9pbnRlciBsaXN0ICovCisgICAgZm5hbWVzID0gKGNoYXJfdSAqKikgYWxsb2MoKm51bUZpbGVzICogc2l6ZW9mKGNoYXJfdSAqKSk7CisKKyAgICAvKiBFbXB0eSBvdXQgdGhlIGxpc3QgKi8KKyAgICBmb3IgKGZpbGVDb3VudCA9IDA7IGZpbGVDb3VudCA8ICpudW1GaWxlczsgZmlsZUNvdW50KyspCisJZm5hbWVzW2ZpbGVDb3VudF0gPSBOVUxMOworCisgICAgLyogU2NhbiB0aGUgbGlzdCBvZiBGU1NwZWMgKi8KKyAgICBmb3IgKGZpbGVDb3VudCA9IDE7IGZpbGVDb3VudCA8PSAqbnVtRmlsZXM7IGZpbGVDb3VudCsrKQorICAgIHsKKwkvKiBHZXQgdGhlIGFsaWFzIGZvciB0aGUgbnRoIGZpbGUsIGNvbnZlcnQgdG8gYW4gRlNTcGVjICovCisJbmV3RXJyb3IgPSBBRUdldE50aFB0cih0aGVMaXN0LCBmaWxlQ291bnQsIHR5cGVGU1MsCisJCQkJJmR1bW15S2V5d29yZCwgJmR1bW15VHlwZSwKKwkJCQkoUHRyKSAmZmlsZVRvT3Blbiwgc2l6ZW9mKEZTU3BlYyksICZhY3R1YWxTaXplKTsKKwlpZiAobmV3RXJyb3IpCisJeworCSAgICAvKiBDYWxsZXIgaXMgYWJsZSB0byBjbGVhbiB1cCAqLworCSAgICAvKiBUT0RPOiBTaG91bGQgYmUgY2xlYW4gdXAgb3Igbm90PyBGb3Igc2FmZXR5LiAqLworI2lmZGVmIFVTRV9TSU9VWAorCSAgICBwcmludGYgKCJhZXZ0X29kb2M6IEFFR2V0TnRoUHRyIGVycm9yOiAlZFxuIiwgbmV3RXJyb3IpOworI2VuZGlmCisJICAgIHJldHVybihmbmFtZXMpOworCX0KKworCS8qIENvbnZlcnQgdGhlIEZTU3BlYyB0byBhIHBhdGhuYW1lICovCisJZm5hbWVzW2ZpbGVDb3VudCAtIDFdID0gRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUgKGZpbGVUb09wZW4pOworICAgIH0KKworICAgIHJldHVybiAoZm5hbWVzKTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29kZVdhcnJpb3IgRXh0ZXJuYWwgRWRpdG9yIFN1cHBvcnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZkZWYgRkVBVF9DV19FRElUT1IKKworLyoKKyAqIEhhbmRsZSB0aGUgV2luZG93IFNlYXJjaCBldmVudCBmcm9tIENvZGVXYXJyaW9yCisgKgorICogRGVzY3JpcHRpb24KKyAqIC0tLS0tLS0tLS0tCisgKgorICogVGhlIElERSBzZW5kcyB0aGUgV2luZG93IFNlYXJjaCBBcHBsZUV2ZW50IHRvIHRoZSBlZGl0b3Igd2hlbiBpdAorICogbmVlZHMgdG8ga25vdyB3aGV0aGVyIGEgcGFydGljdWxhciBmaWxlIGlzIG9wZW4gaW4gdGhlIGVkaXRvci4KKyAqCisgKiBFdmVudCBSZXBseQorICogLS0tLS0tLS0tLS0KKyAqCisgKiBOb25lLiBQdXQgZGF0YSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3R1cmUgcmVjZWl2ZWQuCisgKgorICogUmVtYXJrcworICogLS0tLS0tLQorICoKKyAqIFdoZW4gdGhlIGVkaXRvciByZWNlaXZlcyB0aGlzIGV2ZW50LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkCisgKiBmaWxlIGlzIG9wZW4uIElmIGl0IGlzLCByZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUgZm9yIHRoYXQgZmlsZQorICogaW4gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0dXJlLiBJZiB0aGUgZmlsZSBpcworICogbm90IG9wZW5lZCwgcHV0IHRoZSB2YWx1ZSBmbmZFcnIgKGZpbGUgbm90IGZvdW5kKSBpbiB0aGF0IGxvY2F0aW9uLgorICoKKyAqLworCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgV2luZG93U2VhcmNoIFdpbmRvd1NlYXJjaDsKK3N0cnVjdCBXaW5kb3dTZWFyY2ggLyogZm9yIGhhbmRsaW5nIGNsYXNzICdLQUhMJywgZXZlbnQgJ1NSQ0gnLCBrZXlEaXJlY3RPYmplY3QgdHlwZUNoYXIqLworeworICAgIEZTU3BlYyB0aGVGaWxlOyAvLyBpZGVudGlmaWVzIHRoZSBmaWxlCisgICAgbG9uZyAqdGhlRGF0ZTsgLy8gd2hlcmUgdG8gcHV0IHRoZSBtb2RpZmljYXRpb24gZGF0ZS90aW1lCit9OworI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KKyMgcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyNlbmRpZgorCitwYXNjYWwgT1NFcnIgSGFuZGxlX0tBSExfU1JDSF9BRSAoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCit7CisgICAgT1NFcnIJZXJyb3IgPSBub0VycjsKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJZm91bmRGaWxlID0gZmFsc2U7CisgICAgRGVzY1R5cGUJdHlwZUNvZGU7CisgICAgV2luZG93U2VhcmNoIFNlYXJjaERhdGE7CisgICAgU2l6ZQlhY3R1YWxTaXplOworCisgICAgZXJyb3IgPSBBRUdldFBhcmFtUHRyKHRoZUFFdmVudCwga2V5RGlyZWN0T2JqZWN0LCB0eXBlQ2hhciwgJnR5cGVDb2RlLCAoUHRyKSAmU2VhcmNoRGF0YSwgc2l6ZW9mKFdpbmRvd1NlYXJjaCksICZhY3R1YWxTaXplKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoIktBSExfU1JDSDogQUVHZXRQYXJhbVB0ciBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyNlbmRpZgorCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyAodGhlQUV2ZW50KTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoIktBSExfU1JDSDogSGFuZGxlVW51c2VkUGFybXMgZXJyb3I6ICVkXG4iLCBlcnJvcik7CisjZW5kaWYKKwlyZXR1cm4oZXJyb3IpOworICAgIH0KKworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMCisJCSYmIFNlYXJjaERhdGEudGhlRmlsZS5wYXJJRCA9PSBidWYtPmJfRlNTcGVjLnBhcklECisJCSYmIFNlYXJjaERhdGEudGhlRmlsZS5uYW1lWzBdID09IGJ1Zi0+Yl9GU1NwZWMubmFtZVswXQorCQkmJiBTVFJOQ01QKFNlYXJjaERhdGEudGhlRmlsZS5uYW1lLCBidWYtPmJfRlNTcGVjLm5hbWUsIGJ1Zi0+Yl9GU1NwZWMubmFtZVswXSArIDEpID09IDApCisJICAgIHsKKwkJZm91bmRGaWxlID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgIH0KKworICAgIGlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCisJKlNlYXJjaERhdGEudGhlRGF0ZSA9IGZuZkVycjsKKyAgICBlbHNlCisJKlNlYXJjaERhdGEudGhlRGF0ZSA9IGJ1Zi0+Yl9tdGltZTsKKworI2lmZGVmIFVTRV9TSU9VWAorICAgIHByaW50ZiAoIktBSExfU1JDSDogZmlsZSBcIiUjc1wiIHslZH0iLCBTZWFyY2hEYXRhLnRoZUZpbGUubmFtZSxTZWFyY2hEYXRhLnRoZUZpbGUucGFySUQpOworICAgIGlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCisJcHJpbnRmICgiIE5PVCIpOworICAgIHByaW50ZiAoIiBmb3VuZC4gW2RhdGUgJWx4LCAlbHhdXG4iLCAqU2VhcmNoRGF0YS50aGVEYXRlLCBidWYtPmJfbXRpbWVfcmVhZCk7CisjZW5kaWYKKworICAgIHJldHVybiBlcnJvcjsKK307CisKKy8qCisgKiBIYW5kbGUgdGhlIE1vZGlmaWVkIChmcm9tIElERSB0byBFZGl0b3IpIGV2ZW50IGZyb20gQ29kZVdhcnJpb3IKKyAqCisgKiBEZXNjcmlwdGlvbgorICogLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgSURFIHNlbmRzIHRoaXMgZXZlbnQgdG8gdGhlIGV4dGVybmFsIGVkaXRvciB3aGVuIGl0IHdhbnRzIHRvCisgKiBrbm93IHdoaWNoIGZpbGVzIHRoYXQgYXJlIG9wZW4gaW4gdGhlIGVkaXRvciBoYXZlIGJlZW4gbW9kaWZpZWQuCisgKgorICogUGFyYW1ldGVycyAgIE5vbmUuCisgKiAtLS0tLS0tLS0tCisgKgorICogRXZlbnQgUmVwbHkKKyAqIC0tLS0tLS0tLS0tCisgKiBUaGUgcmVwbHkgZm9yIHRoaXMgZXZlbnQgaXM6CisgKgorICoga2V5RGlyZWN0T2JqZWN0IHR5cGVBRUxpc3QgcmVxdWlyZWQKKyAqICBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgYSBzdHJ1Y3R1cmUgb2YgdHlwZUNoYXIKKyAqCisgKiBSZW1hcmtzCisgKiAtLS0tLS0tCisgKgorICogV2hlbiBidWlsZGluZyB0aGUgcmVwbHkgZXZlbnQsIGluY2x1ZGUgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgZm9yCisgKiBlYWNoIG9wZW4gZmlsZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkLgorICoKKyAqLworCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgTW9kaWZpY2F0aW9uSW5mbyBNb2RpZmljYXRpb25JbmZvOworc3RydWN0IE1vZGlmaWNhdGlvbkluZm8gLyogZm9yIHJlcGx5aW5nIHRvIGNsYXNzICdLQUhMJywgZXZlbnQgJ01PRCAnLCBrZXlEaXJlY3RPYmplY3QgdHlwZUFFTGlzdCovCit7CisgICAgRlNTcGVjIHRoZUZpbGU7IC8vIGlkZW50aWZpZXMgdGhlIGZpbGUKKyAgICBsb25nIHRoZURhdGU7IC8vIHRoZSBkYXRlL3RpbWUgdGhlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQKKyAgICBzaG9ydCBzYXZlZDsgLy8gc2V0IHRoaXMgdG8gemVybyB3aGVuIHJlcGx5aW5nLCB1bnVzZWQKK307CisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKK3Bhc2NhbCBPU0VyciBIYW5kbGVfS0FITF9NT0RfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQoreworICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CisgICAgQUVEZXNjTGlzdAlyZXBseUxpc3Q7CisgICAgbG9uZwludW1GaWxlczsKKyAgICBNb2RpZmljYXRpb25JbmZvIHRoZUZpbGU7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgIHRoZUZpbGUuc2F2ZWQgPSAwOworCisgICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyAodGhlQUV2ZW50KTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoIktBSExfTU9EOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyNlbmRpZgorCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgLyogU2VuZCB0aGUgcmVwbHkgKi8KKy8qICByZXBseU9iamVjdC5kZXNjcmlwdG9yVHlwZSA9IHR5cGVOdWxsOworICAgIHJlcGx5T2JqZWN0LmRhdGFIYW5kbGUgICAgID0gbmlsOyovCisKKy8qIEFFQ3JlYXRlRGVzYyh0eXBlQ2hhciwgKFB0cikmdGl0bGVbMV0sIHRpdGxlWzBdLCAmZGF0YSkgKi8KKyAgICBlcnJvciA9IEFFQ3JlYXRlTGlzdChuaWwsIDAsIGZhbHNlLCAmcmVwbHlMaXN0KTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoIktBSExfTU9EOiBBRUNyZWF0ZUxpc3QgZXJyb3I6ICVkXG4iLCBlcnJvcik7CisjZW5kaWYKKwlyZXR1cm4oZXJyb3IpOworICAgIH0KKworI2lmIDAKKyAgICBlcnJvciA9IEFFQ291bnRJdGVtcygmcmVwbHlMaXN0LCAmbnVtRmlsZXMpOworI2lmZGVmIFVTRV9TSU9VWAorICAgIHByaW50ZiAoIktBSExfTU9EIFJlcGx5TGlzdDogJXggJXhcbiIsIHJlcGx5TGlzdC5kZXNjcmlwdG9yVHlwZSwgcmVwbHlMaXN0LmRhdGFIYW5kbGUpOworICAgIHByaW50ZiAoIktBSExfTU9EIEl0ZW1Jbkxpc3Q6ICVkXG4iLCBudW1GaWxlcyk7CisjZW5kaWYKKworICAgIC8qIEFFUHV0S2V5RGVzYyAoJnJlcGx5TGlzdCwga2V5QUVQbmplY3QsICZhRGVzYykKKyAgICAgKiBBRVB1dEtleVB0ciAgKCZyZXBseUxpc3QsIGtleUFFUG9zaXRpb24sIHR5cGVDaGFyLCAoUHRyKSZ0aGVUeXBlLAorICAgICAqIHNpemVvZihEZXNjVHlwZSkpCisgICAgICovCisKKyAgICAvKiBBRVB1dERlc2MgKi8KKyNlbmRpZgorCisgICAgbnVtRmlsZXMgPSAwOworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCXsKKwkgICAgLyogQWRkIHRoaXMgZmlsZSB0byB0aGUgbGlzdCAqLworCSAgICB0aGVGaWxlLnRoZUZpbGUgPSBidWYtPmJfRlNTcGVjOworCSAgICB0aGVGaWxlLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CisvKgkgICAgdGhlRmlsZS50aGVEYXRlID0gdGltZSAoTlVMTCkgJiAodGltZV90KSAweEZGRkZGRkYwOyAqLworCSAgICBlcnJvciA9IEFFUHV0UHRyICgmcmVwbHlMaXN0LCBudW1GaWxlcywgdHlwZUNoYXIsIChQdHIpICZ0aGVGaWxlLCBzaXplb2YodGhlRmlsZSkpOworI2lmZGVmIFVTRV9TSU9VWAorCSAgICBpZiAobnVtRmlsZXMgPT0gMCkKKwkJcHJpbnRmICgiS0FITF9NT0Q6ICIpOworCSAgICBlbHNlCisJCXByaW50ZiAoIiwgIik7CisJICAgIHByaW50ZiAoIlwiJSNzXCIgeyVkfSBbZGF0ZSAlbHgsICVseF0iLCB0aGVGaWxlLnRoZUZpbGUubmFtZSwgdGhlRmlsZS50aGVGaWxlLnBhcklELCB0aGVGaWxlLnRoZURhdGUsIGJ1Zi0+Yl9tdGltZV9yZWFkKTsKKwkgICAgaWYgKGVycm9yKQorCQlwcmludGYgKCIgKCVkKSIsIGVycm9yKTsKKwkgICAgbnVtRmlsZXMrKzsKKyNlbmRpZgorCX07CisKKyNpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJcbiIpOworI2VuZGlmCisKKyNpZiAwCisgICAgZXJyb3IgPSBBRUNvdW50SXRlbXMoJnJlcGx5TGlzdCwgJm51bUZpbGVzKTsKKyNpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJLQUhMX01PRCBJdGVtSW5MaXN0OiAlZFxuIiwgbnVtRmlsZXMpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIFdlIGNhbiBhZGQgZGF0YSBvbmx5IGlmIHNvbWV0aGluZyB0byByZXBseSAqLworICAgIGVycm9yID0gQUVQdXRQYXJhbURlc2MgKHRoZVJlcGx5LCBrZXlEaXJlY3RPYmplY3QsICZyZXBseUxpc3QpOworCisjaWZkZWYgVVNFX1NJT1VYCisgICAgaWYgKGVycm9yKQorCXByaW50ZiAoIktBSExfTU9EOiBBRVB1dFBhcmFtRGVzYyBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyNlbmRpZgorCisgICAgaWYgKHJlcGx5TGlzdC5kYXRhSGFuZGxlKQorCUFFRGlzcG9zZURlc2MoJnJlcGx5TGlzdCk7CisKKyAgICByZXR1cm4gZXJyb3I7Cit9OworCisvKgorICogSGFuZGxlIHRoZSBHZXQgVGV4dCBldmVudCBmcm9tIENvZGVXYXJyaW9yCisgKgorICogRGVzY3JpcHRpb24KKyAqIC0tLS0tLS0tLS0tCisgKgorICogVGhlIElERSBzZW5kcyB0aGUgR2V0IFRleHQgQXBwbGVFdmVudCB0byB0aGUgZWRpdG9yIHdoZW4gaXQgbmVlZHMKKyAqIHRoZSBzb3VyY2UgY29kZSBmcm9tIGEgZmlsZS4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIHVzZXIgaXNzdWVzIGEKKyAqIENoZWNrIFN5bnRheCBvciBDb21waWxlIGNvbW1hbmQsIHRoZSBjb21waWxlciBuZWVkcyBhY2Nlc3MgdG8KKyAqIHRoZSBzb3VyY2UgY29kZSBjb250YWluZWQgaW4gdGhlIGZpbGUuCisgKgorICogRXZlbnQgUmVwbHkKKyAqIC0tLS0tLS0tLS0tCisgKgorICogTm9uZS4gUHV0IGRhdGEgaW4gbG9jYXRpb25zIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0dXJlIHJlY2VpdmVkLgorICoKKyAqIFJlbWFya3MKKyAqIC0tLS0tLS0KKyAqCisgKiBXaGVuIHRoZSBlZGl0b3IgcmVjZWl2ZXMgdGhpcyBldmVudCwgaXQgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIGhhbmRsZQorICogaW4gdGhlVGV4dCB0byBmaXQgdGhlIGRhdGEgaW4gdGhlIGZpbGUuIEl0IG11c3QgdGhlbiBjb3B5IHRoZSBlbnRpcmUKKyAqIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBpbnRvIHRoZSBtZW1vcnkgbG9jYXRpb24gc3BlY2lmaWVkIGluCisgKiB0aGVUZXh0LgorICoKKyAqLworCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgQ1dfR2V0VGV4dCBDV19HZXRUZXh0Oworc3RydWN0IENXX0dldFRleHQgLyogZm9yIGhhbmRsaW5nIGNsYXNzICdLQUhMJywgZXZlbnQgJ0dUVFgnLCBrZXlEaXJlY3RPYmplY3QgdHlwZUNoYXIqLworeworICAgIEZTU3BlYyB0aGVGaWxlOyAvKiBpZGVudGlmaWVzIHRoZSBmaWxlICovCisgICAgSGFuZGxlIHRoZVRleHQ7IC8qIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgcmV0dXJuIHRoZSB0ZXh0IChtdXN0IGJlIHJlc2l6ZWQgcHJvcGVybHkpICovCisgICAgbG9uZyAqdW51c2VkOyAgIC8qIDAgKG5vdCB1c2VkKSAqLworICAgIGxvbmcgKnRoZURhdGU7ICAvKiB3aGVyZSB0byBwdXQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUgKi8KK307CisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKK3Bhc2NhbCBPU0VyciBIYW5kbGVfS0FITF9HVFRYX0FFIChjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKK3sKKyAgICBPU0VycgllcnJvciA9IG5vRXJyOworICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmb3VuZEZpbGUgPSBmYWxzZTsKKyAgICBEZXNjVHlwZQl0eXBlQ29kZTsKKyAgICBDV19HZXRUZXh0CUdldFRleHREYXRhOworICAgIFNpemUJYWN0dWFsU2l6ZTsKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY2hhcl91CSpmdWxsYnVmZmVyID0gTlVMTDsKKyAgICBsb25nCWxpbmVzaXplOworICAgIGxvbmcJbGluZVN0YXJ0OworICAgIGxvbmcJQnVmZmVyU2l6ZTsKKyAgICBsb25nCWxpbmVubzsKKworICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUNoYXIsICZ0eXBlQ29kZSwgKFB0cikgJkdldFRleHREYXRhLCBzaXplb2YoR2V0VGV4dERhdGEpLCAmYWN0dWFsU2l6ZSk7CisKKyAgICBpZiAoZXJyb3IpCisgICAgeworI2lmZGVmIFVTRV9TSU9VWAorCXByaW50ZiAoIktBSExfR1RUWDogQUVHZXRQYXJhbVB0ciBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyNlbmRpZgorCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCisJICAgIGlmIChHZXRUZXh0RGF0YS50aGVGaWxlLnBhcklEID09IGJ1Zi0+Yl9GU1NwZWMucGFySUQpCisJICAgIHsKKwkJZm91bmRGaWxlID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgIH0KKworICAgIGlmIChmb3VuZEZpbGUpCisgICAgeworCUJ1ZmZlclNpemUgPSAwOyAvKiBHZXRIYW5kbGVTaXplIChHZXRUZXh0RGF0YS50aGVUZXh0KTsgKi8KKwlmb3IgKGxpbmVubyA9IDA7IGxpbmVubyA8PSBidWYtPmJfbWwubWxfbGluZV9jb3VudDsgbGluZW5vKyspCisJeworCSAgICAvKiBNdXN0IHVzZSB0aGUgcmlnaHQgYnVmZmVyICovCisJICAgIGxpbmUgPSBtbF9nZXRfYnVmKGJ1ZiwgKGxpbmVucl9UKSBsaW5lbm8sIEZBTFNFKTsKKwkgICAgbGluZXNpemUgPSBTVFJMRU4obGluZSkgKyAxOworCSAgICBsaW5lU3RhcnQgPSBCdWZmZXJTaXplOworCSAgICBCdWZmZXJTaXplICs9IGxpbmVzaXplOworCSAgICAvKiBSZXNpemUgaGFuZGxlIHRvIGxpbmVzaXplKzEgdG8gaW5jbHVkZSB0aGUgbGluZWZlZWQgKi8KKwkgICAgU2V0SGFuZGxlU2l6ZSAoR2V0VGV4dERhdGEudGhlVGV4dCwgQnVmZmVyU2l6ZSk7CisJICAgIGlmIChHZXRIYW5kbGVTaXplIChHZXRUZXh0RGF0YS50aGVUZXh0KSAhPSBCdWZmZXJTaXplKQorCSAgICB7CisJI2lmZGVmIFVTRV9TSU9VWAorCQlwcmludGYgKCJLQUhMX0dUVFg6IFNldEhhbmRsZVNpemUgaW5jcmVhc2U6ICVkLCBzaXplICVkXG4iLAorCQkJbGluZXNpemUsIEJ1ZmZlclNpemUpOworCSNlbmRpZgorCQlicmVhazsgLyogU2ltcGxlIGhhbmRsaW5nIGZvciBub3cgKi8KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJSExvY2sgKEdldFRleHREYXRhLnRoZVRleHQpOworCQlmdWxsYnVmZmVyID0gKGNoYXJfdSAqKSAqR2V0VGV4dERhdGEudGhlVGV4dDsKKwkJU1RSQ1BZICgoY2hhcl91ICopIChmdWxsYnVmZmVyICsgbGluZVN0YXJ0KSwgbGluZSk7CisJCWZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9ICdccic7CisJCUhVbmxvY2sgKEdldFRleHREYXRhLnRoZVRleHQpOworCSAgICB9CisJfQorCWlmIChmdWxsYnVmZmVyICE9IE5VTEwpCisJeworCSAgICBITG9jayAoR2V0VGV4dERhdGEudGhlVGV4dCk7CisJICAgIGZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9IDA7CisJICAgIEhVbmxvY2sgKEdldFRleHREYXRhLnRoZVRleHQpOworCX0KKwlpZiAoZm91bmRGaWxlID09IGZhbHNlKQorCSAgICAqR2V0VGV4dERhdGEudGhlRGF0ZSA9IGZuZkVycjsKKwllbHNlCisvKgkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSB0aW1lIChOVUxMKSAmICh0aW1lX3QpIDB4RkZGRkZGRjA7Ki8KKwkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CisgICAgfQorI2lmZGVmIFVTRV9TSU9VWAorICAgIHByaW50ZiAoIktBSExfR1RUWDogZmlsZSBcIiUjc1wiIHslZH0gW2RhdGUgJWx4LCAlbHhdIiwgR2V0VGV4dERhdGEudGhlRmlsZS5uYW1lLCBHZXRUZXh0RGF0YS50aGVGaWxlLnBhcklELCAqR2V0VGV4dERhdGEudGhlRGF0ZSwgYnVmLT5iX210aW1lX3JlYWQpOworICAgIGlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCisJcHJpbnRmICgiIE5PVCIpOworICAgIHByaW50ZiAoIiBmb3VuZC4gKEJ1ZmZlclNpemUgPSAlZClcbiIsIEJ1ZmZlclNpemUpOworI2VuZGlmCisKKyAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zICh0aGVBRXZlbnQpOworICAgIGlmIChlcnJvcikKKyAgICB7CisjaWZkZWYgVVNFX1NJT1VYCisJcHJpbnRmICgiS0FITF9HVFRYOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyNlbmRpZgorCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqCisgKi8KKworLyogVGFrZW4gZnJvbSBNb3JlQXBwbGVFdmVudHM6UHJvY2Vzc0hlbHBlcnMqLworcGFzY2FsCU9TRXJyCUZpbmRQcm9jZXNzQnlTaWduYXR1cmUoIGNvbnN0IE9TVHlwZSB0YXJnZXRUeXBlLAorCQkJCQljb25zdCBPU1R5cGUgdGFyZ2V0Q3JlYXRvciwKKwkJCQkJICAgICAgUHJvY2Vzc1NlcmlhbE51bWJlclB0ciBwc25QdHIgKQoreworICAgIE9TRXJyCWFuRXJyID0gbm9FcnI7CisgICAgQm9vbGVhbglsb29raW5nRm9yUHJvY2VzcyA9IHRydWU7CisKKyAgICBQcm9jZXNzSW5mb1JlYyAgaW5mb1JlYzsKKworICAgIGluZm9SZWMucHJvY2Vzc0luZm9MZW5ndGggPSBzaXplb2YoIFByb2Nlc3NJbmZvUmVjICk7CisgICAgaW5mb1JlYy5wcm9jZXNzTmFtZSA9IG5pbDsKKyAgICBpbmZvUmVjLnByb2Nlc3NBcHBTcGVjID0gbmlsOworCisgICAgcHNuUHRyLT5sb3dMb25nT2ZQU04gPSBrTm9Qcm9jZXNzOworICAgIHBzblB0ci0+aGlnaExvbmdPZlBTTiA9IGtOb1Byb2Nlc3M7CisKKyAgICB3aGlsZSAoIGxvb2tpbmdGb3JQcm9jZXNzICkKKyAgICB7CisJYW5FcnIgPSBHZXROZXh0UHJvY2VzcyggcHNuUHRyICk7CisJaWYgKCBhbkVyciAhPSBub0VyciApCisJeworCSAgICBsb29raW5nRm9yUHJvY2VzcyA9IGZhbHNlOworCX0KKwllbHNlCisJeworCSAgICBhbkVyciA9IEdldFByb2Nlc3NJbmZvcm1hdGlvbiggcHNuUHRyLCAmaW5mb1JlYyApOworCSAgICBpZiAoICggYW5FcnIgPT0gbm9FcnIgKQorCQkgJiYgKCBpbmZvUmVjLnByb2Nlc3NUeXBlID09IHRhcmdldFR5cGUgKQorCQkgJiYgKCBpbmZvUmVjLnByb2Nlc3NTaWduYXR1cmUgPT0gdGFyZ2V0Q3JlYXRvciApICkKKwkgICAgeworCQlsb29raW5nRm9yUHJvY2VzcyA9IGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiBhbkVycjsKK30vL2VuZCBGaW5kUHJvY2Vzc0J5U2lnbmF0dXJlCisKK3ZvaWQgU2VuZF9LQUhMX01PRF9BRSAoYnVmX1QgKmJ1ZikKK3sKKyAgICBPU0VyciAgIGFuRXJyID0gbm9FcnI7CisgICAgQUVEZXNjICB0YXJnZXRBcHBEZXNjID0geyB0eXBlTnVsbCwgbmlsIH07CisgICAgUHJvY2Vzc1NlcmlhbE51bWJlcgkgICAgcHNuID0geyBrTm9Qcm9jZXNzLCBrTm9Qcm9jZXNzIH07CisgICAgQXBwbGVFdmVudAl0aGVSZXBseSA9IHsgdHlwZU51bGwsIG5pbCB9OworICAgIEFFU2VuZE1vZGUJc2VuZE1vZGU7CisgICAgQXBwbGVFdmVudCAgdGhlRXZlbnQgPSB7dHlwZU51bGwsIG5pbCB9OworICAgIEFFSWRsZVVQUCAgIGlkbGVQcm9jVVBQID0gbmlsOworICAgIE1vZGlmaWNhdGlvbkluZm8gTW9kRGF0YTsKKworCisgICAgYW5FcnIgPSBGaW5kUHJvY2Vzc0J5U2lnbmF0dXJlKCAnQVBQTCcsICdDV0lFJywgJnBzbiApOworI2lmZGVmIFVTRV9TSU9VWAorICAgIHByaW50ZiAoIkNvZGVXYXJyaW9yIGlzIik7CisgICAgaWYgKGFuRXJyICE9IG5vRXJyKQorCXByaW50ZiAoIiBOT1QiKTsKKyAgICBwcmludGYgKCIgcnVubmluZ1xuIik7CisjZW5kaWYKKyAgICBpZiAoIGFuRXJyID09IG5vRXJyICkKKyAgICB7CisJYW5FcnIgPSBBRUNyZWF0ZURlc2MgKHR5cGVQcm9jZXNzU2VyaWFsTnVtYmVyLCAmcHNuLAorCQkJICAgICAgc2l6ZW9mKCBQcm9jZXNzU2VyaWFsTnVtYmVyICksICZ0YXJnZXRBcHBEZXNjKTsKKworCWlmICggYW5FcnIgPT0gbm9FcnIgKQorCXsKKwkgICAgYW5FcnIgPSBBRUNyZWF0ZUFwcGxlRXZlbnQoICdLQUhMJywgJ01PRCAnLCAmdGFyZ2V0QXBwRGVzYywKKwkJCQkJa0F1dG9HZW5lcmF0ZVJldHVybklELCBrQW55VHJhbnNhY3Rpb25JRCwgJnRoZUV2ZW50KTsKKwl9CisKKwlBRURpc3Bvc2VEZXNjKCAmdGFyZ2V0QXBwRGVzYyApOworCisJLyogQWRkIHRoZSBwYXJtcyAqLworCU1vZERhdGEudGhlRmlsZSA9IGJ1Zi0+Yl9GU1NwZWM7CisJTW9kRGF0YS50aGVEYXRlID0gYnVmLT5iX210aW1lOworCisJaWYgKGFuRXJyID09IG5vRXJyKQorCSAgICBhbkVyciA9QUVQdXRQYXJhbVB0ciAoJnRoZUV2ZW50LCBrZXlEaXJlY3RPYmplY3QsIHR5cGVDaGFyLCAmTW9kRGF0YSwgc2l6ZW9mKE1vZERhdGEpKTsKKworCWlmICggaWRsZVByb2NVUFAgPT0gbmlsICkKKwkgICAgc2VuZE1vZGUgPSBrQUVOb1JlcGx5OworCWVsc2UKKwkgICAgc2VuZE1vZGUgPSBrQUVXYWl0UmVwbHk7CisKKwlpZiAoIGFuRXJyID09IG5vRXJyICkKKwkgICAgYW5FcnIgPSBBRVNlbmQoICZ0aGVFdmVudCwgJnRoZVJlcGx5LCBzZW5kTW9kZSwga0FFTm9ybWFsUHJpb3JpdHksIGtOb1RpbWVPdXQsIGlkbGVQcm9jVVBQLCBuaWwgKTsKKwlpZiAoIGFuRXJyID09IG5vRXJyICAmJiAgc2VuZE1vZGUgPT0ga0FFV2FpdFJlcGx5ICkKKwl7CisjaWZkZWYgVVNFX1NJT1VYCisJICAgIHByaW50ZiAoIktBSExfTU9EOiBTZW5kIGVycm9yOiAlZFxuIiwgYW5FcnIpOworI2VuZGlmCisvKgkgICAgYW5FcnIgPSAgQUVIR2V0SGFuZGxlckVycm9yKCAmdGhlUmVwbHkgKTsqLworCX0KKwkodm9pZCkgQUVEaXNwb3NlRGVzYyggJnRoZVJlcGx5ICk7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfQ1dfRURJVE9SICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFwcGxlIEV2ZW50IEhhbmRsaW5nIHByb2NlZHVyZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZmRlZiBVU0VfQUVWRU5UCisKKy8qCisgKiBIYW5kbGUgdGhlIFVudXNlZCBwYXJtcyBvZiBhbiBBcHBsZUV2ZW50CisgKi8KKworT1NFcnIgSGFuZGxlVW51c2VkUGFybXMgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCkKK3sKKyAgICBPU0VycgllcnJvcjsKKyAgICBsb25nCWFjdHVhbFNpemU7CisgICAgRGVzY1R5cGUJZHVtbXlUeXBlOworICAgIEFFS2V5d29yZAltaXNzZWRLZXl3b3JkOworCisgICAgLyogR2V0IHRoZSAibWlzc2VkIGtleXdvcmQiIGF0dHJpYnV0ZSBmcm9tIHRoZSBBcHBsZUV2ZW50LiAqLworICAgIGVycm9yID0gQUVHZXRBdHRyaWJ1dGVQdHIodGhlQUV2ZW50LCBrZXlNaXNzZWRLZXl3b3JkQXR0ciwKKwkJCSAgICAgIHR5cGVLZXl3b3JkLCAmZHVtbXlUeXBlLAorCQkJICAgICAgKFB0cikmbWlzc2VkS2V5d29yZCwgc2l6ZW9mKG1pc3NlZEtleXdvcmQpLAorCQkJICAgICAgJmFjdHVhbFNpemUpOworCisgICAgLyogSWYgdGhlIGRlc2NyaXB0b3IgaXNuJ3QgZm91bmQsIHRoZW4gd2UgZ290IHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChlcnJvciA9PSBlcnJBRURlc2NOb3RGb3VuZCkKKyAgICB7CisJZXJyb3IgPSBub0VycjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiAwCisJLyogV2h5IGlzIHRoaXMgcmVtb3ZlZD8gKi8KKwllcnJvciA9IGVyckFFRXZlbnROb3RIYW5kbGVkOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiBIYW5kbGUgdGhlIE9Eb2MgQXBwbGVFdmVudAorICoKKyAqIERlYWxzIHdpdGggYWxsIGZpbGVzIGRyYWdnZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGljb24uCisgKgorICovCisKKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pICAvKiBvbmx5IGluIENvZGV3YXJyaW9yICovCisjIHByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4aworI2VuZGlmCit0eXBlZGVmIHN0cnVjdCBTZWxlY3Rpb25SYW5nZSBTZWxlY3Rpb25SYW5nZTsKK3N0cnVjdCBTZWxlY3Rpb25SYW5nZSAvKiBmb3IgaGFuZGxpbmcga0NvcmVDbGFzc0V2ZW50OmtPcGVuRG9jdW1lbnRzOmtleUFFUG9zaXRpb24gdHlwZUNoYXIgKi8KK3sKKyAgICBzaG9ydCB1bnVzZWQxOyAvLyAwIChub3QgdXNlZCkKKyAgICBzaG9ydCBsaW5lTnVtOyAvLyBsaW5lIHRvIHNlbGVjdCAoPDAgdG8gc3BlY2lmeSByYW5nZSkKKyAgICBsb25nIHN0YXJ0UmFuZ2U7IC8vIHN0YXJ0IG9mIHNlbGVjdGlvbiByYW5nZSAoaWYgbGluZSA8IDApCisgICAgbG9uZyBlbmRSYW5nZTsgLy8gZW5kIG9mIHNlbGVjdGlvbiByYW5nZSAoaWYgbGluZSA8IDApCisgICAgbG9uZyB1bnVzZWQyOyAvLyAwIChub3QgdXNlZCkKKyAgICBsb25nIHRoZURhdGU7IC8vIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUKK307CisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKKy8qIFRoZSBJREUgdXNlcyB0aGUgb3B0aW9uYWwga2V5QUVQb3NpdGlvbiBwYXJhbWV0ZXIgdG8gdGVsbCB0aGUgZWQtCisgICBpdG9yIHRoZSBzZWxlY3Rpb24gcmFuZ2UuIElmIGxpbmVOdW0gaXMgemVybyBvciBncmVhdGVyLCBzY3JvbGwgdGhlIHRleHQKKyAgIHRvIHRoZSBzcGVjaWZpZWQgbGluZS4gSWYgbGluZU51bSBpcyBsZXNzIHRoYW4gemVybywgdXNlIHRoZSB2YWx1ZXMgaW4KKyAgIHN0YXJ0UmFuZ2UgYW5kIGVuZFJhbmdlIHRvIHNlbGVjdCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMuIFNjcm9sbAorICAgdGhlIHRleHQgdG8gZGlzcGxheSB0aGUgc2VsZWN0aW9uLiBJZiBsaW5lTnVtLCBzdGFydFJhbmdlLCBhbmQKKyAgIGVuZFJhbmdlIGFyZSBhbGwgbmVnYXRpdmUsIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiByYW5nZSBzcGVjaWZpZWQuCisgKi8KKworcGFzY2FsIE9TRXJyIEhhbmRsZU9Eb2NBRSAoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBDbGVhbiB1cCB0aGUgY29kZSB3aXRoIGNvbnZlcnQgdGhlIEFwcGxlRXZlbnQgaW50bworICAgICAqICAgICAgIGEgIjphcmdzIgorICAgICAqLworICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CisvLyAgICBPU0VycglmaXJzdEVycm9yID0gbm9FcnI7CisvLyAgICBzaG9ydAludW1FcnJvcnMgPSAwOworICAgIEFFRGVzYwl0aGVMaXN0OworICAgIERlc2NUeXBlCXR5cGVDb2RlOworICAgIGxvbmcJbnVtRmlsZXM7CisgLy8gICBsb25nCSBmaWxlQ291bnQ7CisgICAgY2hhcl91CSoqZm5hbWVzOworLy8gICAgY2hhcl91CWZuYW1lWzI1Nl07CisgICAgU2l6ZQlhY3R1YWxTaXplOworICAgIFNlbGVjdGlvblJhbmdlIHRoZVBvc2l0aW9uOworICAgIHNob3J0CWdvdFBvc2l0aW9uID0gZmFsc2U7CisgICAgbG9uZwlsbnVtOworCisjaWZkZWYgVVNFX1NJT1VYCisgICAgcHJpbnRmICgiYWV2dF9vZG9jOlxuIik7CisjZW5kaWYKKworICAgIC8qIHRoZSBkaXJlY3Qgb2JqZWN0IHBhcmFtZXRlciBpcyB0aGUgbGlzdCBvZiBhbGlhc2VzIHRvIGZpbGVzIChvbmUgb3IgbW9yZSkgKi8KKyAgICBlcnJvciA9IEFFR2V0UGFyYW1EZXNjKHRoZUFFdmVudCwga2V5RGlyZWN0T2JqZWN0LCB0eXBlQUVMaXN0LCAmdGhlTGlzdCk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyNpZmRlZiBVU0VfU0lPVVgKKwlwcmludGYgKCJhZXZ0X29kb2M6IEFFR2V0UGFyYW1EZXNjIGVycm9yOiAlZFxuIiwgZXJyb3IpOworI2VuZGlmCisJcmV0dXJuKGVycm9yKTsKKyAgICB9CisKKworICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleUFFUG9zaXRpb24sIHR5cGVDaGFyLCAmdHlwZUNvZGUsIChQdHIpICZ0aGVQb3NpdGlvbiwgc2l6ZW9mKFNlbGVjdGlvblJhbmdlKSwgJmFjdHVhbFNpemUpOworICAgIGlmIChlcnJvciA9PSBub0VycikKKwlnb3RQb3NpdGlvbiA9IHRydWU7CisgICAgaWYgKGVycm9yID09IGVyckFFRGVzY05vdEZvdW5kKQorCWVycm9yID0gbm9FcnI7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyNpZmRlZiBVU0VfU0lPVVgKKwlwcmludGYgKCJhZXZ0X29kb2M6IEFFR2V0UGFyYW1QdHIgZXJyb3I6ICVkXG4iLCBlcnJvcik7CisjZW5kaWYKKwlyZXR1cm4oZXJyb3IpOworICAgIH0KKworI2lmZGVmIFVTRV9TSU9VWAorICAgIHByaW50ZiAoImFldnRfb2RvYzogbGluZU51bTogJWQsIHN0YXJ0UmFuZ2UgJWQsIGVuZFJhbmdlICVkLCBbZGF0ZSAlbHhdXG4iLAorCSAgICB0aGVQb3NpdGlvbi5saW5lTnVtLCB0aGVQb3NpdGlvbi5zdGFydFJhbmdlLCB0aGVQb3NpdGlvbi5lbmRSYW5nZSwKKwkgICAgdGhlUG9zaXRpb24udGhlRGF0ZSk7CisjZW5kaWYKKy8qCisgICAgZXJyb3IgPSBBRUdldFBhcmFtRGVzYyh0aGVBRXZlbnQsIGtleUFFUG9zaXRpb24sIHR5cGVDaGFyLCAmdGhlUG9zaXRpb24pOworCisgICAgaWYgKF5lcnJvcikgdGhlbgorICAgIHsKKwlpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQorCXsKKwkgIC8vIEdvdG8gdGhpcyBsaW5lCisJfQorCWVsc2UKKwl7CisJICAvLyBTZXQgdGhlIHJhbmdlIGNoYXIgd2lzZQorCX0KKyAgICB9CisgKi8KKworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICByZXNldF9WSXN1YWwoKTsKKyNlbmRpZgorCisgICAgZm5hbWVzID0gbmV3X2ZuYW1lc19mcm9tX0FFRGVzYygmdGhlTGlzdCwgJm51bUZpbGVzLCAmZXJyb3IpOworCisgICAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIC8qIFRPRE86IGVtcHR5IGZuYW1lc1tdIGZpcnN0ICovCisgICAgICB2aW1fZnJlZShmbmFtZXMpOworICAgICAgcmV0dXJuIChlcnJvcik7CisgICAgfQorCisgICAgaWYgKHN0YXJ0aW5nID4gMCkKKyAgICB7CisJaW50IGk7CisJY2hhcl91ICpwOworCisJLyogdGhlc2UgYXJlIHRoZSBpbml0aWFsIGZpbGVzIGRyb3BwZWQgb24gdGhlIFZpbSBpY29uICovCisJZm9yIChpID0gMCA7IGkgPCBudW1GaWxlczsgaSsrKQorCXsKKwkgICAgaWYgKGdhX2dyb3coJmdsb2JhbF9hbGlzdC5hbF9nYSwgMSkgPT0gRkFJTAorCQkJCSAgICAgIHx8IChwID0gdmltX3N0cnNhdmUoZm5hbWVzW2ldKSkgPT0gTlVMTCkKKwkJbWNoX2V4aXQoMik7CisJICAgIGVsc2UKKwkJYWxpc3RfYWRkKCZnbG9iYWxfYWxpc3QsIHAsIDIpOworCX0KKwlnb3RvIGZpbmlzaGVkOworICAgIH0KKworICAgIC8qIEhhbmRsZSB0aGUgZHJvcCwgOmVkaXQgdG8gZ2V0IHRvIHRoZSBmaWxlICovCisgICAgaGFuZGxlX2Ryb3AobnVtRmlsZXMsIGZuYW1lcywgRkFMU0UpOworCisgICAgLyogVE9ETzogSGFuZGxlIHRoZSBnb3RvL3NlbGVjdCBsaW5lIG1vcmUgY2xlYW5seSAqLworICAgIGlmICgobnVtRmlsZXMgPT0gMSkgJiAoZ290UG9zaXRpb24pKQorICAgIHsKKwlpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQorCXsKKwkgICAgbG51bSA9IHRoZVBvc2l0aW9uLmxpbmVOdW07CisJLyogIG9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKwkgICAgc2V0cGNtYXJrKCk7Ki8KKwkgICAgaWYgKGxudW0gPCAxTCkKKwkJbG51bSA9IDFMOworCSAgICBlbHNlIGlmIChsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCWxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwkvKiAgYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7Ki8KKwl9CisJZWxzZQorCSAgICBnb3RvX2J5dGUodGhlUG9zaXRpb24uc3RhcnRSYW5nZSArIDEpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgc2NyZWVuIGRpc3BsYXkgKi8KKyAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CisgICAgc2V0Y3Vyc29yKCk7CisgICAgb3V0X2ZsdXNoKCk7CisKKyAgZmluaXNoZWQ6CisgICAgQUVEaXNwb3NlRGVzYygmdGhlTGlzdCk7IC8qIGRpc3Bvc2Ugd2hhdCB3ZSBhbGxvY2F0ZWQgKi8KKworICAgIGVycm9yID0gSGFuZGxlVW51c2VkUGFybXMgKHRoZUFFdmVudCk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyNpZmRlZiBVU0VfU0lPVVgKKwlwcmludGYgKCJhZXZ0X29kb2M6IEhhbmRsZVVudXNlZFBhcm1zIGVycm9yOiAlZFxuIiwgZXJyb3IpOworI2VuZGlmCisJcmV0dXJuKGVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqCisgKi8KKworcGFzY2FsIE9TRXJyIEhhbmRsZV9hZXZ0X29hcHBfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQoreworICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CisKKyNpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJhZXZ0X29hcHA6XG4iKTsKKyNlbmRpZgorCisgICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyAodGhlQUV2ZW50KTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqCisgKi8KKworcGFzY2FsIE9TRXJyIEhhbmRsZV9hZXZ0X3F1aXRfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQoreworICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CisKKyNpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJhZXZ0X3F1aXRcbiIpOworI2VuZGlmCisKKyAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zICh0aGVBRXZlbnQpOworICAgIGlmIChlcnJvcikKKyAgICB7CisJcmV0dXJuKGVycm9yKTsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIGZha2UgYSA6Y29uZmlybSBxYSAqLworICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiY29uZmlybSBxYSIpOworCisgICAgcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqCisgKi8KKworcGFzY2FsIE9TRXJyIEhhbmRsZV9hZXZ0X3Bkb2NfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQoreworICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CisKKyNpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJhZXZ0X3Bkb2M6XG4iKTsKKyNlbmRpZgorCisgICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyAodGhlQUV2ZW50KTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworCXJldHVybihlcnJvcik7CisgICAgfQorCisgICAgcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIEhhbmRsaW5nIG9mIHVua25vd24gQXBwbGVFdmVudAorICoKKyAqIChKdXN0IGdldCByaWQgb2YgYWxsIHRoZSBwYXJtcykKKyAqLworcGFzY2FsIE9TRXJyIEhhbmRsZV91bmtub3duX0FFIChjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKK3sKKyAgICBPU0VycgllcnJvciA9IG5vRXJyOworCisjaWZkZWYgVVNFX1NJT1VYCisgICAgcHJpbnRmICgiVW5rbm93biBFdmVudDogJXhcbiIsIHRoZUFFdmVudC0+ZGVzY3JpcHRvclR5cGUpOworI2VuZGlmCisKKyAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zICh0aGVBRXZlbnQpOworICAgIGlmIChlcnJvcikKKyAgICB7CisJcmV0dXJuKGVycm9yKTsKKyAgICB9CisKKyAgICByZXR1cm4oZXJyb3IpOworfQorCisKKworI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorIyBkZWZpbmUgTmV3QUVFdmVudEhhbmRsZXJQcm9jKHgpIE5ld0FFRXZlbnRIYW5kbGVyVVBQKHgpCisjZW5kaWYKKworLyoKKyAqIEluc3RhbGwgdGhlIHZhcmlvdXMgQXBwbGVFdmVudCBIYW5kbGVycworICovCitPU0VyciAgIEluc3RhbGxBRUhhbmRsZXJzICh2b2lkKQoreworICAgIE9TRXJyICAgZXJyb3I7CisKKyAgICAvKiBpbnN0YWxsIG9wZW4gYXBwbGljYXRpb24gaGFuZGxlciAqLworICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtDb3JlRXZlbnRDbGFzcywga0FFT3BlbkFwcGxpY2F0aW9uLAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV9hZXZ0X29hcHBfQUUpLCAwLCBmYWxzZSk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKwlyZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgLyogaW5zdGFsbCBxdWl0IGFwcGxpY2F0aW9uIGhhbmRsZXIgKi8KKyAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRVF1aXRBcHBsaWNhdGlvbiwKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfYWV2dF9xdWl0X0FFKSwgMCwgZmFsc2UpOworICAgIGlmIChlcnJvcikKKyAgICB7CisJcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIC8qIGluc3RhbGwgb3BlbiBkb2N1bWVudCBoYW5kbGVyICovCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0NvcmVFdmVudENsYXNzLCBrQUVPcGVuRG9jdW1lbnRzLAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZU9Eb2NBRSksIDAsIGZhbHNlKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworCXJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBpbnN0YWxsIHByaW50IGRvY3VtZW50IGhhbmRsZXIgKi8KKyAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRVByaW50RG9jdW1lbnRzLAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV9hZXZ0X3Bkb2NfQUUpLCAwLCBmYWxzZSk7CisKKy8qIEluc3RhbGwgQ29yZSBTdWl0ZSAqLworLyogIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFQ2xvbmUsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKKworICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFQ2xvc2UsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKKworICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFQ291bnRFbGVtZW50cywKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDcmVhdGVFbGVtZW50LAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CisKKyAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRURlbGV0ZSwKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVEb09iamVjdHNFeGlzdCwKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVHZXREYXRhLAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwga0FFR2V0RGF0YSwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVHZXREYXRhU2l6ZSwKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIGtBRUdldERhdGFTaXplLCBmYWxzZSk7CisKKyAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldENsYXNzSW5mbywKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVHZXRFdmVudEluZm8sCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKKworICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFTW92ZSwKKwkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOworCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVTYXZlLAorCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CisKKyAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRVNldERhdGEsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKKyovCisKKyNpZmRlZiBGRUFUX0NXX0VESVRPUgorICAgIC8qCisgICAgICogQmluZCBjb2Rld2FycmlvciBzdXBwb3J0IGhhbmRsZXJzCisgICAgICovCisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnR1RUWCcsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX0tBSExfR1RUWF9BRSksIDAsIGZhbHNlKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworCXJldHVybiBlcnJvcjsKKyAgICB9CisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnU1JDSCcsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX0tBSExfU1JDSF9BRSksIDAsIGZhbHNlKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworCXJldHVybiBlcnJvcjsKKyAgICB9CisgICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnTU9EICcsCisJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX0tBSExfTU9EX0FFKSwgMCwgZmFsc2UpOworICAgIGlmIChlcnJvcikKKyAgICB7CisJcmV0dXJuIGVycm9yOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGVycm9yOworCit9CisjZW5kaWYgLyogVVNFX0FFVkVOVCAqLworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBVbmZpbGVkIHlldAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqICBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgKKyAqCisgKiAgUmV0dXJucyB0aGUgaW5kZXggaW5zaWRlIHRoZSBtZW51IHdoZXIKKyAqLworICAgIHNob3J0IC8qIFNob3VsZGUgd2UgcmV0dXJuIE1lbnVJdGVtSW5kZXg/ICovCitndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXggKHBNZW51KQorICAgIHZpbW1lbnVfVCAqcE1lbnU7Cit7CisgICAgc2hvcnQJaW5kZXg7CisgICAgc2hvcnQJaXRlbUluZGV4ID0gLTE7CisgICAgdmltbWVudV9UCSpwQnJvdGhlcjsKKworICAgIC8qIE9ubHkgbWVudSB3aXRob3V0IHBhcmVudCBhcmUgdGhlOgorICAgICAqIC1tZW51IGluIHRoZSBtZW51YmFyCisgICAgICogLXBvcHVwIG1lbnUKKyAgICAgKiAtdG9vbGJhciAoZ3Vlc3MpCisgICAgICoKKyAgICAgKiBXaGljaCBhcmUgbm90IGl0ZW1zIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAocE1lbnUtPnBhcmVudCkKKyAgICB7CisJLyogU3RhcnQgZnJvbSB0aGUgT2xkZXN0IEJyb3RoZXIgKi8KKwlwQnJvdGhlciA9IHBNZW51LT5wYXJlbnQtPmNoaWxkcmVuOworCWluZGV4ID0gMTsKKwl3aGlsZSAoKHBCcm90aGVyKSAmJiAoaXRlbUluZGV4ID09IC0xKSkKKwl7CisJICAgIGlmIChwQnJvdGhlciA9PSBwTWVudSkKKwkJaXRlbUluZGV4ID0gaW5kZXg7CisJICAgIGluZGV4Kys7CisJICAgIHBCcm90aGVyID0gcEJyb3RoZXItPm5leHQ7CisJfQorI2lmZGVmIFVTRV9IRUxQTUVOVQorCS8qIEFkanVzdCBpbmRleCBpbiBoZWxwIG1lbnUgKGZvciBwcmVkZWZpbmVkIG9uZXMpICovCisJaWYgKGl0ZW1JbmRleCAhPSAtMSkKKwkgICAgaWYgKHBNZW51LT5wYXJlbnQtPnN1Ym1lbnVfaWQgPT0ga0hNSGVscE1lbnVJRCkKKwkJaXRlbUluZGV4ICs9IGd1aS5NYWNPU0hlbHBJdGVtczsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gaXRlbUluZGV4OworfQorCisgICAgc3RhdGljIHZpbW1lbnVfVCAqCitndWlfbWFjX2dldF92aW1fbWVudSAobWVudUlELCBpdGVtSW5kZXgsIHBNZW51KQorICAgIHNob3J0CW1lbnVJRDsKKyAgICBzaG9ydAlpdGVtSW5kZXg7CisgICAgdmltbWVudV9UCSpwTWVudTsKK3sKKyAgICBzaG9ydAlpbmRleDsKKyAgICB2aW1tZW51X1QJKnBDaGlsZE1lbnU7CisgICAgdmltbWVudV9UCSpwRWxkZXIgPSBwTWVudS0+cGFyZW50OworCisKKyAgICAvKiBPbmx5IG1lbnUgd2l0aG91dCBwYXJlbnQgYXJlIHRoZToKKyAgICAgKiAtbWVudSBpbiB0aGUgbWVudWJhcgorICAgICAqIC1wb3B1cCBtZW51CisgICAgICogLXRvb2xiYXIgKGd1ZXNzKQorICAgICAqCisgICAgICogV2hpY2ggYXJlIG5vdCBpdGVtcyBhbnl3YXkuCisgICAgICovCisKKyAgICBpZiAoKHBFbGRlcikgJiYgKHBFbGRlci0+c3VibWVudV9pZCA9PSBtZW51SUQpKQorICAgIHsKKyNpZmRlZiBVU0VfSEVMUE1FTlUKKwlpZiAobWVudUlEID09IGtITUhlbHBNZW51SUQpCisJICAgIGl0ZW1JbmRleCAtPSBndWkuTWFjT1NIZWxwSXRlbXM7CisjZW5kaWYKKworCWZvciAoaW5kZXggPSAxOyAoaW5kZXggIT0gaXRlbUluZGV4KSAmJiAocE1lbnUgIT0gTlVMTCk7IGluZGV4KyspCisJICAgIHBNZW51ID0gcE1lbnUtPm5leHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZm9yICg7IHBNZW51ICE9IE5VTEw7IHBNZW51ID0gcE1lbnUtPm5leHQpCisJeworCSAgICBpZiAocE1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCisJICAgIHsKKwkJcENoaWxkTWVudSA9IGd1aV9tYWNfZ2V0X3ZpbV9tZW51CisJCQkgICAobWVudUlELCBpdGVtSW5kZXgsIHBNZW51LT5jaGlsZHJlbik7CisJCWlmIChwQ2hpbGRNZW51KQorCQl7CisJCSAgICBwTWVudSA9IHBDaGlsZE1lbnU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gcE1lbnU7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1hY09TIEZlZWRiYWNrIHByb2NlZHVyZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisgICAgcGFzY2FsCisgICAgdm9pZAorZ3VpX21hY19kcmFnX3RodW1iIChDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wsIHNob3J0IHBhcnRDb2RlKQoreworICAgIHNjcm9sbGJhcl9UCQkqc2I7CisgICAgaW50CQkJdmFsdWUsIGRyYWdnaW5nOworICAgIENvbnRyb2xIYW5kbGUJdGhlQ29udHJvbFRvVXNlOworICAgIGludAkJCWRvbnRfc2Nyb2xsX3NhdmUgPSBkb250X3Njcm9sbDsKKworICAgIHRoZUNvbnRyb2xUb1VzZSA9IGRyYWdnZWRfc2I7CisKKyAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZykgR2V0Q29udHJvbFJlZmVyZW5jZSAodGhlQ29udHJvbFRvVXNlKSk7CisKKyAgICBpZiAoc2IgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAvKiBOZWVkIHRvIGZpbmQgdmFsdWUgYnkgZGlmZiBiZXR3ZWVuIE9sZCBQb3NzIE5ldyBQb3MgKi8KKyAgICB2YWx1ZSA9IEdldENvbnRyb2wzMkJpdFZhbHVlICh0aGVDb250cm9sVG9Vc2UpOworICAgIGRyYWdnaW5nID0gKHBhcnRDb2RlICE9IDApOworCisgICAgLyogV2hlbiAiYWxsb3dfc2Nyb2xsYmFyIiBpcyBGQUxTRSBzdGlsbCBuZWVkIHRvIHJlbWVtYmVyIHRoZSBuZXcKKyAgICAgKiBwb3NpdGlvbiwgYnV0IGRvbid0IGFjdHVhbGx5IHNjcm9sbCBieSBzZXR0aW5nICJkb250X3Njcm9sbCIuICovCisgICAgZG9udF9zY3JvbGwgPSAhYWxsb3dfc2Nyb2xsYmFyOworICAgIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIGRyYWdnaW5nKTsKKyAgICBkb250X3Njcm9sbCA9IGRvbnRfc2Nyb2xsX3NhdmU7Cit9CisKKyAgICBwYXNjYWwKKyAgICB2b2lkCitndWlfbWFjX3Njcm9sbF9hY3Rpb24gKENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCwgc2hvcnQgcGFydENvZGUpCit7CisgICAgLyogVE9ETzogaGF2ZSBsaXZlIHN1cHBvcnQgKi8KKyAgICBzY3JvbGxiYXJfVCAqc2IsICpzYl9pbmZvOworICAgIGxvbmcJZGF0YTsKKyAgICBsb25nCXZhbHVlOworICAgIGludAkJcGFnZTsKKyAgICBpbnQJCWRyYWdnaW5nID0gRkFMU0U7CisgICAgaW50CQlkb250X3Njcm9sbF9zYXZlID0gZG9udF9zY3JvbGw7CisKKyAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZykgR2V0Q29udHJvbFJlZmVyZW5jZSAodGhlQ29udHJvbCkpOworCisgICAgaWYgKHNiID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKHNiLT53cCAhPSBOVUxMKQkJLyogTGVmdCBvciByaWdodCBzY3JvbGxiYXIgKi8KKyAgICB7CisJLyoKKwkgKiBDYXJlZnVsOiBuZWVkIHRvIGdldCBzY3JvbGxiYXIgaW5mbyBvdXQgb2YgZmlyc3QgKGxlZnQpIHNjcm9sbGJhcgorCSAqIGZvciB3aW5kb3csIGJ1dCBrZWVwIHJlYWwgc2Nyb2xsYmFyIHRvbyBiZWNhdXNlIHdlIG11c3QgcGFzcyBpdCB0bworCSAqIGd1aV9kcmFnX3Njcm9sbGJhcigpLgorCSAqLworCXNiX2luZm8gPSAmc2ItPndwLT53X3Njcm9sbGJhcnNbMF07CisKKwlpZiAoc2JfaW5mby0+c2l6ZSA+IDUpCisJICAgIHBhZ2UgPSBzYl9pbmZvLT5zaXplIC0gMjsJLyogdXNlIHR3byBsaW5lcyBvZiBjb250ZXh0ICovCisJZWxzZQorCSAgICBwYWdlID0gc2JfaW5mby0+c2l6ZTsKKyAgICB9CisgICAgZWxzZQkJCS8qIEJvdHRvbSBzY3JvbGxiYXIgKi8KKyAgICB7CisJc2JfaW5mbyA9IHNiOworCXBhZ2UgPSBXX1dJRFRIKGN1cndpbikgLSA1OworICAgIH0KKworICAgIHN3aXRjaCAocGFydENvZGUpCisgICAgeworCWNhc2UgIGtDb250cm9sVXBCdXR0b25QYXJ0OiAgIGRhdGEgPSAtMTsgICAgYnJlYWs7CisJY2FzZSAga0NvbnRyb2xEb3duQnV0dG9uUGFydDogZGF0YSA9IDE7ICAgICBicmVhazsKKwljYXNlICBrQ29udHJvbFBhZ2VEb3duUGFydDogICBkYXRhID0gcGFnZTsgIGJyZWFrOworCWNhc2UgIGtDb250cm9sUGFnZVVwUGFydDogICAgIGRhdGEgPSAtcGFnZTsgYnJlYWs7CisJCSAgICBkZWZhdWx0OiBkYXRhID0gMDsgYnJlYWs7CisgICAgfQorCisgICAgdmFsdWUgPSBzYl9pbmZvLT52YWx1ZSArIGRhdGE7CisvKiAgaWYgKHZhbHVlID4gc2JfaW5mby0+bWF4KQorCXZhbHVlID0gc2JfaW5mby0+bWF4OworICAgIGVsc2UgaWYgKHZhbHVlIDwgMCkKKwl2YWx1ZSA9IDA7Ki8KKworICAgIC8qIFdoZW4gImFsbG93X3Njcm9sbGJhciIgaXMgRkFMU0Ugc3RpbGwgbmVlZCB0byByZW1lbWJlciB0aGUgbmV3CisgICAgICogcG9zaXRpb24sIGJ1dCBkb24ndCBhY3R1YWxseSBzY3JvbGwgYnkgc2V0dGluZyAiZG9udF9zY3JvbGwiLiAqLworICAgIGRvbnRfc2Nyb2xsID0gIWFsbG93X3Njcm9sbGJhcjsKKyAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbHVlLCBkcmFnZ2luZyk7CisgICAgZG9udF9zY3JvbGwgPSBkb250X3Njcm9sbF9zYXZlOworCisgICAgb3V0X2ZsdXNoKCk7CisgICAgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNiLCB2YWx1ZSwgc2JfaW5mby0+c2l6ZSwgc2JfaW5mby0+bWF4KTsKKworLyogIGlmIChzYl9pbmZvLT53cCAhPSBOVUxMKQorICAgIHsKKwl3aW5fVAkqd3A7CisJaW50CXNiX251bTsKKworCXNiX251bSA9IDA7CisJZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBzYi0+d3AgJiYgd3AgIT0gTlVMTDsgd3AgPSBXX05FWFQod3ApKQorCXNiX251bSsrOworCisJaWYgKHdwICE9IE5VTEwpCisJeworCSAgICBjdXJyZW50X3Njcm9sbGJhciA9IHNiX251bTsKKwkgICAgc2Nyb2xsYmFyX3ZhbHVlID0gdmFsdWU7CisJICAgIGd1aV9kb19zY3JvbGwoKTsKKwkgICAgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNiLCB2YWx1ZSwgc2JfaW5mby0+c2l6ZSwgc2JfaW5mby0+bWF4KTsKKwl9CisgICAgfSovCit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1hY09TIENsaWNrIEhhbmRsaW5nIHByb2NlZHVyZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKworLyoKKyAqIEhhbmRsZSBhIGNsaWNrIGluc2lkZSB0aGUgd2luZG93LCBpdCBtYXkgaGFwcGVucyBpbiB0aGUKKyAqIHNjcm9sbGJhciBvciB0aGUgY29udGVudHMuCisgKgorICogVE9ETzogQWRkIHN1cHBvcnQgZm9yIHBvdGVudGlhbCBUT09MQkFSCisgKi8KKyAgICB2b2lkCitndWlfbWFjX2RvSW5Db250ZW50Q2xpY2sgKHRoZUV2ZW50LCB3aGljaFdpbmRvdykKKyAgICBFdmVudFJlY29yZCAqdGhlRXZlbnQ7CisgICAgV2luZG93UHRyCSB3aGljaFdpbmRvdzsKK3sKKyAgICBQb2ludAkJdGhlUG9pbnQ7CisgICAgaW50X3UJCXZpbU1vZGlmaWVyczsKKyAgICBzaG9ydAkJdGhlUG9ydGlvbjsKKyAgICBDb250cm9sSGFuZGxlCXRoZUNvbnRyb2w7CisgICAgaW50CQkJdmltTW91c2VCdXR0b247CisgICAgc2hvcnQJCWRibENsaWNrOworCisgICAgdGhlUG9pbnQgPSB0aGVFdmVudC0+d2hlcmU7CisgICAgR2xvYmFsVG9Mb2NhbCAoJnRoZVBvaW50KTsKKyAgICBTZWxlY3RXaW5kb3cgKHdoaWNoV2luZG93KTsKKworICAgIHRoZVBvcnRpb24gPSBGaW5kQ29udHJvbCAodGhlUG9pbnQsIHdoaWNoV2luZG93LCAmdGhlQ29udHJvbCk7CisKKyAgICBpZiAodGhlQ29udHJvbCAhPSBOVUwpCisgICAgeworCS8qIFdlIGhpdCBhIHNjb2xsYmFyICovCisKKwlpZiAodGhlUG9ydGlvbiAhPSBrQ29udHJvbEluZGljYXRvclBhcnQpCisJeworCSAgICBkcmFnZ2VkX3NiID0gdGhlQ29udHJvbDsKKwkgICAgVHJhY2tDb250cm9sKHRoZUNvbnRyb2wsIHRoZVBvaW50LCBnU2Nyb2xsQWN0aW9uKTsKKwkgICAgZHJhZ2dlZF9zYiA9IE5VTEw7CisJfQorCWVsc2UKKwl7CisJICAgIGRyYWdnZWRfc2IgPSB0aGVDb250cm9sOworI2lmIDEKKwkgICAgVHJhY2tDb250cm9sKHRoZUNvbnRyb2wsIHRoZVBvaW50LCBnU2Nyb2xsRHJhZyk7CisjZWxzZQorCSAgICBUcmFja0NvbnRyb2wodGhlQ29udHJvbCwgdGhlUG9pbnQsIE5VTEwpOworI2VuZGlmCisJICAgIC8qIHBhc3MgMCBhcyB0aGUgcGFydCB0byB0ZWxsIGd1aV9tYWNfZHJhZ190aHVtYiwgdGhhdCB0aGUgbW91c2UKKwkgICAgICogYnV0dG9uIGhhcyBiZWVuIHJlbGVhc2VkICovCisJICAgIGd1aV9tYWNfZHJhZ190aHVtYiAodGhlQ29udHJvbCwgMCk7IC8qIFNob3VsZCBpdCBiZSB0aGVQb3J0aW9uID8gKERhbnkpICovCisJICAgIGRyYWdnZWRfc2IgPSBOVUxMOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBXZSBhcmUgaW5zaWRlIHRoZSBjb250ZW50cyAqLworCisJLyogQ29udmVydCB0aGUgQ1RSTCwgT1BUSU9OLCBTSElGVCBhbmQgQ01EIGtleSAqLworCXZpbU1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKHRoZUV2ZW50LT5tb2RpZmllcnMpOworCisJLyogRGVmYXVsdHMgdG8gTU9VU0VfTEVGVCBhcyB0aGVyZSdzIG9ubHkgb25lIG1vdXNlIGJ1dHRvbiAqLworCXZpbU1vdXNlQnV0dG9uID0gTU9VU0VfTEVGVDsKKworI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCisJLyogQ29udmVydCB0aGUgQ1RSTF9NT1VTRV9MRUZUIHRvIE1PVVNFX1JJR0hUICovCisJY2xpY2tJc1BvcHVwID0gRkFMU0U7CisKKwlpZiAoKGd1aS5NYWNPU0hhdmVDbnR4TWVudSkgJiYgKG1vdXNlX21vZGVsX3BvcHVwKCkpKQorCSAgICBpZiAoSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayh0aGVFdmVudCkpCisJICAgIHsKKwkJdmltTW91c2VCdXR0b24gPSBNT1VTRV9SSUdIVDsKKwkJdmltTW9kaWZpZXJzICY9IH5NT1VTRV9DVFJMOworCQljbGlja0lzUG9wdXAgPSBUUlVFOworCSAgICB9CisjZW5kaWYKKworCS8qIElzIGl0IGEgZG91YmxlIGNsaWNrID8gKi8KKwlkYmxDbGljayA9ICgodGhlRXZlbnQtPndoZW4gLSBsYXN0TW91c2VUaWNrKSA8IEdldERibFRpbWUoKSk7CisKKwkvKiBTZW5kIHRoZSBtb3VzZSBjbGljaiB0byBWaW0gKi8KKwlndWlfc2VuZF9tb3VzZV9ldmVudCh2aW1Nb3VzZUJ1dHRvbiwgdGhlUG9pbnQuaCwKKwkJCQkJICB0aGVQb2ludC52LCBkYmxDbGljaywgdmltTW9kaWZpZXJzKTsKKworCS8qIENyZWF0ZSB0aGUgcmVjdGFuZ2xlIGFyb3VuZCB0aGUgY3Vyc29yIHRvIGRldGVjdAorCSAqIHRoZSBtb3VzZSBkcmFnZ2luZworCSAqLworI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCisjaWYgMAorCS8qIFRPRE86IERvIHdlIG5lZWQgdG8gdGhpcyBldmVuIGZvciB0aGUgY29udGV4dHVhbCBtZW51PworCSAqIEl0IG1heSBiZSByZXF1aXJlIGZvciBwb3B1cF9zZXRwb3MsIGJ1dCBmb3IgcG9wdXA/CisJICovCisJaWYgKHZpbU1vdXNlQnV0dG9uID09IE1PVVNFX0xFRlQpCisjZW5kaWYKKyNlbmRpZgorCXsKKwkgICAgU2V0UmVjdCAoJmRyYWdSZWN0LCBGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSksCisJCQkJRklMTF9ZKFlfMl9ST1codGhlUG9pbnQudikpLAorCQkJCUZJTExfWChYXzJfQ09MKHRoZVBvaW50LmgpKzEpLAorCQkJCUZJTExfWShZXzJfUk9XKHRoZVBvaW50LnYpKzEpKTsKKworCSAgICBkcmFnUmVjdEVuYmwgPSBUUlVFOworCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrQ3JlYXRlUmVjdDsKKwl9CisgICAgfQorfQorCisvKgorICogSGFuZGxlIHRoZSBjbGljayBpbiB0aGUgdGl0bGViYXIgKHRvIG1vdmUgdGhlIHdpbmRvdykKKyAqLworICAgIHZvaWQKK2d1aV9tYWNfZG9JbkRyYWdDbGljayAod2hlcmUsIHdoaWNoV2luZG93KQorICAgIFBvaW50CXdoZXJlOworICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKK3sKKyAgICBSZWN0CW1vdmluZ0xpbWl0czsKKyAgICBSZWN0CSptb3ZpbmdMaW1pdHNQdHIgPSAmbW92aW5nTGltaXRzOworCisgICAgLyogVE9ETzogbWF5IHRyeSB0byBwcmV2ZW50IG1vdmUgb3V0c2lkZSBzY3JlZW4/ICovCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBtb3ZpbmdMaW1pdHNQdHIgPSBHZXRSZWdpb25Cb3VuZHMgKCBHZXRHcmF5UmduKCksICZtb3ZpbmdMaW1pdHMgKTsKKyNlbHNlCisgICAgbW92aW5nTGltaXRzUHRyID0gJigqR2V0R3JheVJnbigpKS0+cmduQkJveDsKKyNlbmRpZgorICAgIERyYWdXaW5kb3cgKHdoaWNoV2luZG93LCB3aGVyZSwgbW92aW5nTGltaXRzUHRyKTsKK30KKworLyoKKyAqIEhhbmRsZSB0aGUgY2xpY2sgaW4gdGhlIGdyb3cgYm94CisgKi8KKyAgICB2b2lkCitndWlfbWFjX2RvSW5Hcm93Q2xpY2sod2hlcmUsIHdoaWNoV2luZG93KQorICAgIFBvaW50CXdoZXJlOworICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKK3sKKworICAgIGxvbmcJICAgIG5ld1NpemU7CisgICAgdW5zaWduZWQgc2hvcnQgIG5ld1dpZHRoOworICAgIHVuc2lnbmVkIHNob3J0ICBuZXdIZWlnaHQ7CisgICAgUmVjdAkgICAgcmVzaXplTGltaXRzOworICAgIFJlY3QJICAgICpyZXNpemVMaW1pdHNQdHIgPSAmcmVzaXplTGltaXRzOworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgUmVjdAkgICAgTmV3Q29udGVudFJlY3Q7CisKKyAgICByZXNpemVMaW1pdHNQdHIgPSBHZXRSZWdpb25Cb3VuZHMgKCBHZXRHcmF5UmduKCksICZyZXNpemVMaW1pdHMgKTsKKyNlbHNlCisgICAgcmVzaXplTGltaXRzID0gcWQuc2NyZWVuQml0cy5ib3VuZHM7CisjZW5kaWYKKworICAgIC8qIFNldCB0aGUgbWluaW11biBzaXplICovCisgICAgLyogVE9ETzogU2hvdWxkIHRoaXMgY29tZSBmcm9tIFZpbT8gKi8KKyAgICByZXNpemVMaW1pdHMudG9wID0gMTAwOworICAgIHJlc2l6ZUxpbWl0cy5sZWZ0ID0gMTAwOworCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBuZXdTaXplID0gUmVzaXplV2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgJnJlc2l6ZUxpbWl0cywgJk5ld0NvbnRlbnRSZWN0KTsKKyAgICBuZXdXaWR0aCAgPSBOZXdDb250ZW50UmVjdC5yaWdodCAtIE5ld0NvbnRlbnRSZWN0LmxlZnQ7CisgICAgbmV3SGVpZ2h0ID0gTmV3Q29udGVudFJlY3QuYm90dG9tIC0gTmV3Q29udGVudFJlY3QudG9wOworICAgIGd1aV9yZXNpemVfc2hlbGwobmV3V2lkdGgsIG5ld0hlaWdodCk7CisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworICAgIGd1aV9zZXRfc2hlbGxzaXplKFRSVUUsIEZBTFNFKTsKKyNlbHNlCisgICAgbmV3U2l6ZSA9IEdyb3dXaW5kb3cod2hpY2hXaW5kb3csIHdoZXJlLCAmcmVzaXplTGltaXRzKTsKKyAgICBpZiAobmV3U2l6ZSAhPSAwKQorICAgIHsKKwluZXdXaWR0aCAgPSBuZXdTaXplICYgMHgwMDAwRkZGRjsKKwluZXdIZWlnaHQgPSAobmV3U2l6ZSA+PiAxNikgJiAweDAwMDBGRkZGOworCisJZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworCisJZ3VpX3Jlc2l6ZV9zaGVsbChuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKworCS8qCisJICogV2UgbmVlZCB0byBjYWxsIGd1aV9zZXRfc2hlbGxzaXplIGFzIHRoZSBzaXplCisJICogdXNlZCBieSBWaW0gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBzZWxlY3RlZAorCSAqIGJ5IHRoZSB1c2VyLiBUaGlzIGNhdXNlIHNvbWUgb3ZlcmhlYWQKKwkgKiBUT0RPOiBhZGQgYSBjaGVjayBpbnNpZGUgZ3VpX3Jlc2l6ZV9zaGVsbD8KKwkgKi8KKwlndWlfc2V0X3NoZWxsc2l6ZShUUlVFLCBGQUxTRSk7CisKKwkvKgorCSAqIE9yaWdpbiBvZiB0aGUgY29kZSBiZWxvdyBpcyB1bmtub3duLgorCSAqIEZ1bmN0aW9uYWxpdHkgaXMgdW5rbm93bi4KKwkgKiBUaW1lIG9mIGNvbW1lbnRlZCBvdXQgaXMgdW5rbm93bi4KKwkgKi8KKy8qCVNldFBvcnQod3ApOworCUludmFsUmVjdCgmd3AtPnBvcnRSZWN0KTsKKwlpZiAoaXNVc2VyV2luZG93KHdwKSkgeworCSAgICBEcmF3aW5nV2luZG93UGVlawlhV2luZG93ID0gKERyYXdpbmdXaW5kb3dQZWVrKXdwOworCisJICAgIGlmIChhV2luZG93LT50b29sUm91dGluZXMudG9vbFdpbmRvd1Jlc2l6ZWRQcm9jKQorCQlDYWxsVG9vbFdpbmRvd1Jlc2l6ZWRQcm9jKGFXaW5kb3ctPnRvb2xSb3V0aW5lcy50b29sV2luZG93UmVzaXplZFByb2MsIHdwKTsKKwl9Ki8KKyAgICB9OworI2VuZGlmCisKK30KKworLyoKKyAqIEhhbmRsZSB0aGUgY2xpY2sgaW4gdGhlIHpvb20gYm94CisgKi8KKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIHN0YXRpYyB2b2lkCitndWlfbWFjX2RvSW5ab29tQ2xpY2sodGhlRXZlbnQsIHdoaWNoV2luZG93KQorICAgIEV2ZW50UmVjb3JkCSp0aGVFdmVudDsKKyAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7Cit7CisgICAgUmVjdAlyOworICAgIFBvaW50CXA7CisgICAgc2hvcnQJdGhlUGFydDsKKworICAgIC8qIGlkZWFsIHdpZHRoIGlzIGN1cnJlbnQgKi8KKyAgICBwLmggPSBDb2x1bW5zICogZ3VpLmNoYXJfd2lkdGggKyAyICogZ3VpLmJvcmRlcl9vZmZzZXQ7CisgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfTEVGVF0pCisJcC5oICs9IGd1aS5zY3JvbGxiYXJfd2lkdGg7CisgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfUklHSFRdKQorCXAuaCArPSBndWkuc2Nyb2xsYmFyX3dpZHRoOworICAgIC8qIGlkZWFsIGhlaWdodCBpcyBhcyBoZWlnaCBhcyB3ZSBjYW4gZ2V0ICovCisgICAgcC52ID0gMTUgKiAxMDI0OworCisgICAgdGhlUGFydCA9IElzV2luZG93SW5TdGFuZGFyZFN0YXRlKHdoaWNoV2luZG93LCAmcCwgJnIpCisJCQkJCQkgICAgICAgPyBpblpvb21JbiA6IGluWm9vbU91dDsKKworICAgIGlmICghVHJhY2tCb3god2hpY2hXaW5kb3csIHRoZUV2ZW50LT53aGVyZSwgdGhlUGFydCkpCisJcmV0dXJuOworCisgICAgLyogdXNlIHJldHVybmVkIHdpZHRoICovCisgICAgcC5oID0gci5yaWdodCAtIHIubGVmdDsKKyAgICAvKiBhZGp1c3QgcmV0dXJuZWQgaGVpZ2h0ICovCisgICAgcC52ID0gci5ib3R0b20gLSByLnRvcCAtIDIgKiBndWkuYm9yZGVyX29mZnNldDsKKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9CT1RUT01dKQorCXAudiAtPSBndWkuc2Nyb2xsYmFyX2hlaWdodDsKKyAgICBwLnYgLT0gcC52ICUgZ3VpLmNoYXJfaGVpZ2h0OworICAgIHAudiArPSAyICogZ3VpLmJvcmRlcl93aWR0aDsKKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9CT1RUT01dKTsKKwlwLnYgKz0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQ7CisKKyAgICBab29tV2luZG93SWRlYWwod2hpY2hXaW5kb3csIHRoZVBhcnQsICZwKTsKKworICAgIEdldFdpbmRvd0JvdW5kcyh3aGljaFdpbmRvdywga1dpbmRvd0NvbnRlbnRSZ24sICZyKTsKKyAgICBndWlfcmVzaXplX3NoZWxsKHIucmlnaHQgLSByLmxlZnQsIHIuYm90dG9tIC0gci50b3ApOworICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKKyAgICBndWlfc2V0X3NoZWxsc2l6ZShUUlVFLCBGQUxTRSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgKi8KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWFjT1MgRXZlbnQgSGFuZGxpbmcgcHJvY2VkdXJlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogSGFuZGxlIHRoZSBVcGRhdGUgRXZlbnQKKyAqLworCisgICAgdm9pZAorZ3VpX21hY19kb1VwZGF0ZUV2ZW50KGV2ZW50KQorICAgIEV2ZW50UmVjb3JkCSpldmVudDsKK3sKKyAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CisgICAgR3JhZlB0cglzYXZlUG9ydDsKKyAgICBSZ25IYW5kbGUJdXBkYXRlUmduOworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgUmVjdAl1cGRhdGVSZWN0OworI2VuZGlmCisgICAgUmVjdAkqdXBkYXRlUmVjdFB0cjsKKyAgICBSZWN0CXJjOworICAgIFJlY3QJZ3Jvd1JlY3Q7CisgICAgUmduSGFuZGxlCXNhdmVSZ247CisKKworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgdXBkYXRlUmduID0gTmV3UmduKCk7CisgICAgaWYgKHVwZGF0ZVJnbiA9PSBOVUxMKQorCXJldHVybjsKKyNlbmRpZgorCisgICAgLyogVGhpcyBjb3VsZCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIgYXMgd2UKKyAgICAgKiBkb24ndCByZXF1aXJlIGFueXRoaW5nIGVsc2Ugb3V0IG9mIHRoZSBldmVudAorICAgICAqLworICAgIHdoaWNoV2luZG93ID0gKFdpbmRvd1B0cikgZXZlbnQtPm1lc3NhZ2U7CisKKyAgICAvKiBTYXZlIEN1cnJlbnQgUG9ydCAqLworICAgIEdldFBvcnQgKCZzYXZlUG9ydCk7CisKKyAgICAvKiBTZWxlY3QgdGhlIFdpbmRvdydzIFBvcnQgKi8KKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIFNldFBvcnRXaW5kb3dQb3J0ICh3aGljaFdpbmRvdyk7CisjZWxzZQorICAgIFNldFBvcnQgKHdoaWNoV2luZG93KTsKKyNlbmRpZgorCisgICAgLyogTGV0J3MgdXBkYXRlIHRoZSB3aW5kb3cgKi8KKyAgICAgIEJlZ2luVXBkYXRlICh3aGljaFdpbmRvdyk7CisJLyogUmVkcmF3IHRoZSBiaWdnZXN0IHJlY3RhbmdsZSBjb3ZlcmluZyB0aGUgYXJlYQorCSAqIHRvIGJlIHVwZGF0ZWQuCisJICovCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKwlHZXRQb3J0VmlzaWJsZVJlZ2lvbihHZXRXaW5kb3dQb3J0KHdoaWNoV2luZG93KSwgdXBkYXRlUmduKTsKKyMgaWYgMAorCS8qIFdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdG8gdXNlIHRoZSBmb2xsd2luZyBidXQgZG9lc24ndAorCSAqIHNlZW0gdG8gd29yayB1bmRlciBNYWNPUyBYIChEYW55KQorCSAqLworCUdldFdpbmRvd1JlZ2lvbih3aGljaFdpbmRvdywga1dpbmRvd1VwZGF0ZVJnbiwgdXBkYXRlUmduKTsKKyMgZW5kaWYKKyNlbHNlCisJdXBkYXRlUmduID0gd2hpY2hXaW5kb3ctPnZpc1JnbjsKKyNlbmRpZgorCS8qIFVzZSB0aGUgSExvY2sgdXNlbGVzcyBpbiBDYXJib24/IElzIGl0IGhhcm1mdWw/Ki8KKwlITG9jayAoKEhhbmRsZSkgdXBkYXRlUmduKTsKKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorCSAgdXBkYXRlUmVjdFB0ciA9IEdldFJlZ2lvbkJvdW5kcyAoIHVwZGF0ZVJnbiwgJnVwZGF0ZVJlY3QgKTsKKyMgaWYgMAorCSAgLyogQ29kZSBmcm9tIG9yaWdpbmFsIENhcmJvbiBQb3J0ICh1c2luZyBHZXRXaW5kb3dSZWdpb24uCisJICAgKiBJIGJlbGlldmUgdGhlIFVwZGF0ZVJnbiBpcyBhbHJlYWR5IGluIGxvY2FsIChEYW55KQorCSAgICovCisJICBHbG9iYWxUb0xvY2FsKCZ0b3BMZWZ0KHVwZGF0ZVJlY3QpKTsgLyogcHJlQ2FyYm9uPyAqLworCSAgR2xvYmFsVG9Mb2NhbCgmYm90UmlnaHQodXBkYXRlUmVjdCkpOworIyBlbmRpZgorI2Vsc2UKKwkgIHVwZGF0ZVJlY3RQdHIgPSAmKCp1cGRhdGVSZ24pLT5yZ25CQm94OworI2VuZGlmCisJICAvKiBVcGRhdGUgdGhlIGNvbnRlbnQgKGkuZS4gdGhlIHRleHQpICovCisJICBndWlfcmVkcmF3KHVwZGF0ZVJlY3RQdHItPmxlZnQsIHVwZGF0ZVJlY3RQdHItPnRvcCwKKwkJICAgICAgdXBkYXRlUmVjdFB0ci0+cmlnaHQgLSB1cGRhdGVSZWN0UHRyLT5sZWZ0LAorCQkgICAgICB1cGRhdGVSZWN0UHRyLT5ib3R0b20gICAtIHVwZGF0ZVJlY3RQdHItPnRvcCk7CisJICAvKiBDbGVhciB0aGUgYm9yZGVyIGFyZWFzIGlmIG5lZWRlZCAqLworCSAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworCSAgaWYgKHVwZGF0ZVJlY3RQdHItPmxlZnQgPCBGSUxMX1goMCkpCisJICB7CisJICAgIFNldFJlY3QgKCZyYywgMCwgMCwgRklMTF9YKDApLCBGSUxMX1koUm93cykpOworCSAgICBFcmFzZVJlY3QgKCZyYyk7CisJICB9CisJICBpZiAodXBkYXRlUmVjdFB0ci0+dG9wIDwgRklMTF9ZKDApKQorCSAgeworCSAgICBTZXRSZWN0ICgmcmMsIDAsIDAsIEZJTExfWChDb2x1bW5zKSwgRklMTF9ZKDApKTsKKwkgICAgRXJhc2VSZWN0ICgmcmMpOworCSAgfQorCSAgaWYgKHVwZGF0ZVJlY3RQdHItPnJpZ2h0ID4gRklMTF9YKENvbHVtbnMpKQorCSAgeworCSAgICBTZXRSZWN0ICgmcmMsIEZJTExfWChDb2x1bW5zKSwgMCwKKwkJCSAgIEZJTExfWChDb2x1bW5zKSArIGd1aS5ib3JkZXJfb2Zmc2V0LCBGSUxMX1koUm93cykpOworCSAgICBFcmFzZVJlY3QgKCZyYyk7CisJICB9CisJICBpZiAodXBkYXRlUmVjdFB0ci0+Ym90dG9tID4gRklMTF9ZKFJvd3MpKQorCSAgeworCSAgICBTZXRSZWN0ICgmcmMsIDAsIEZJTExfWShSb3dzKSwgRklMTF9YKENvbHVtbnMpICsgZ3VpLmJvcmRlcl9vZmZzZXQsCisJCQkJCSAgICBGSUxMX1koUm93cykgKyBndWkuYm9yZGVyX29mZnNldCk7CisJICAgIEVyYXNlUmVjdCAoJnJjKTsKKwkgIH0KKwlIVW5sb2NrICgoSGFuZGxlKSB1cGRhdGVSZ24pOworI2lmZGVmIFVTRV9DQVJCT05JWkVECisJRGlzcG9zZVJnbiAodXBkYXRlUmduKTsKKyNlbmRpZgorCisJLyogVXBkYXRlIHNjcm9sbGJhcnMgKi8KKwlEcmF3Q29udHJvbHMgKHdoaWNoV2luZG93KTsKKworCS8qIFVwZGF0ZSB0aGUgR3Jvd0JveCAqLworCS8qIFRha2VuIGZyb20gRkFRIDMzLTI3ICovCisJc2F2ZVJnbiA9IE5ld1JnbigpOworI2lmZGVmIFVTRV9DQVJCT05JWkVECisJR2V0V2luZG93Qm91bmRzKHdoaWNoV2luZG93LCBrV2luZG93R3Jvd1JnbiwgJmdyb3dSZWN0KTsKKyNlbHNlCisJZ3Jvd1JlY3QgPSB3aGljaFdpbmRvdy0+cG9ydFJlY3Q7CisJZ3Jvd1JlY3QudG9wICA9IGdyb3dSZWN0LmJvdHRvbSAtIDE1OworCWdyb3dSZWN0LmxlZnQgPSBncm93UmVjdC5yaWdodCAgLSAxNTsKKyNlbmRpZgorCUdldENsaXAgKHNhdmVSZ24pOworCUNsaXBSZWN0ICgmZ3Jvd1JlY3QpOworCURyYXdHcm93SWNvbiAod2hpY2hXaW5kb3cpOworCVNldENsaXAgKHNhdmVSZ24pOworCURpc3Bvc2VSZ24gKHNhdmVSZ24pOworICAgICAgRW5kVXBkYXRlICh3aGljaFdpbmRvdyk7CisKKyAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIFBvcnQgKi8KKyAgICBTZXRQb3J0IChzYXZlUG9ydCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIGFjdGl2YXRlL2RlYWN0aXZhdGUgZXZlbnQKKyAqIChhcHBseSB0byBhIHdpbmRvdykKKyAqLworICAgIHZvaWQKK2d1aV9tYWNfZG9BY3RpdmF0ZUV2ZW50KGV2ZW50KQorICAgIEV2ZW50UmVjb3JkCSpldmVudDsKK3sKKyAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CisKKyAgICB3aGljaFdpbmRvdyA9IChXaW5kb3dQdHIpIGV2ZW50LT5tZXNzYWdlOworICAgIGlmICgoZXZlbnQtPm1vZGlmaWVycykgJiBhY3RpdmVGbGFnKQorCS8qIEFjdGl2YXRlICovCisJZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKKyAgICBlbHNlCisgICAgeworCS8qIERlYWN0aXZhdGUgKi8KKwlndWlfZm9jdXNfY2hhbmdlKEZBTFNFKTsKKy8qCURPTidUIEtOT1cgd2hhdCB0aGUgY29kZSBiZWxvdyB3YXMgZG9pbmcKKwlmb3VuZCBpbiB0aGUgZGVhY3RpdmF0ZSBjbGF1c2UsIGJ1dCB0aGUKKwljbGF1c2Ugd3JpdHRpbmcgVFJVRSBpbnRvIGluX2ZvY3VzIChCVUcpCisgKi8KKworI2lmIDAJLyogUmVtb3ZlZCBieSBEYW55IGFzIHBlciBhYm92ZSBKdW5lIDIwMDEgKi8KKwlhX2Jvb2wgPSBmYWxzZTsKKwlTZXRQcmVzZXJ2ZUdseXBoIChhX2Jvb2wpOworCVNldE91dGxpbmVQcmVmZXJyZWQgKGFfYm9vbCk7CisjZW5kaWYKKyAgICB9Cit9CisKKworLyoKKyAqIEhhbmRsZSB0aGUgc3VzcGVuZC9yZXN1bWUgZXZlbnQKKyAqIChhcHBseSB0byB0aGUgYXBwbGljYXRpb24pCisgKi8KKyAgICB2b2lkCitndWlfbWFjX2RvU3VzcGVuZEV2ZW50KGV2ZW50KQorICAgIEV2ZW50UmVjb3JkCSpldmVudDsKK3sKKyAgICAvKiBUaGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uIGp1c3QgY2hhbmdlZCAqLworCisgICAgLyogTk9URTogdGhlIHN1c3BlbmQgbWF5IGhhcHBlbiBiZWZvcmUgdGhlIGRlYWN0aXZhdGUKKyAgICAgKiAgICAgICBzZWVuIG9uIE1hY09TIFgKKyAgICAgKi8KKworICAgIC8qIE1heSBub3QgbmVlZCB0byBjaGFuZ2UgZm9jdXMgYXMgdGhlIHdpbmRvdyB3aWxsCisgICAgICogZ2V0IGFuIGFjdGl2YXRlL2Rlc2FjdGl2YXRlIGV2ZW50CisgICAgICovCisgICAgaWYgKGV2ZW50LT5tZXNzYWdlICYgMSkKKwkvKiBSZXN1bWUgKi8KKwlndWlfZm9jdXNfY2hhbmdlKFRSVUUpOworICAgIGVsc2UKKwkvKiBTdXNwZW5kICovCisJZ3VpX2ZvY3VzX2NoYW5nZShGQUxTRSk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIGtleQorICovCisKKyAgICB2b2lkCitndWlfbWFjX2RvS2V5RXZlbnQoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KQoreworICAgIC8qIFRPRE86IGFkZCBzdXBwb3J0IGZvciBDT01NQU5EIEtFWSAqLworICAgIGxvbmcJCW1lbnU7CisgICAgdW5zaWduZWQgY2hhcglzdHJpbmdbMjBdOworICAgIHNob3J0CQludW0sIGk7CisgICAgc2hvcnQJCWxlbiA9IDA7CisgICAgS2V5U3ltCQlrZXlfc3ltOworICAgIGludAkJCWtleV9jaGFyOworICAgIGludAkJCW1vZGlmaWVyczsKKworICAgIC8qIE1hc2sgdGhlIG1vdXNlIChhcyBwZXIgdXNlciBzZXR0aW5nKSAqLworICAgIGlmIChwX21oKQorCU9ic2N1cmVDdXJzb3IoKTsKKworICAgIC8qIEdldCB0aGUga2V5IGNvZGUgYW5kIGl0J3MgQVNDSUkgcmVwcmVzZW50YXRpb24gKi8KKyAgICBrZXlfc3ltID0gKCh0aGVFdmVudC0+bWVzc2FnZSAmIGtleUNvZGVNYXNrKSA+PiA4KTsKKyAgICBrZXlfY2hhciA9IHRoZUV2ZW50LT5tZXNzYWdlICYgY2hhckNvZGVNYXNrOworICAgIG51bSA9IDE7CisKKyAgICAvKiBJbnRlcmNlcHQgQ1RSTC1DICovCisgICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjb250cm9sS2V5KQorCWlmIChrZXlfY2hhciA9PSBDdHJsX0MgJiYgY3RybF9jX2ludGVycnVwdHMpCisJICAgIGdvdF9pbnQgPSBUUlVFOworCisgICAgLyogSW50ZXJjZXB0IENNRC0uICovCisgICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjbWRLZXkpCisJaWYgKGtleV9jaGFyID09ICcuJykKKwkgICAgZ290X2ludCA9IFRSVUU7CisKKyAgICAvKiBIYW5kbGUgY29tbWFuZCBrZXkgYXMgcGVyIG1lbnUgKi8KKyAgICAvKiBUT0RPOiBzaG91bGQgb3ZlcnJpZGUgYmUgYWxsb3dlZD8gUmVxdWlyZSBZQU8gb3IgY291bGQgdXNlICd3aW5hbHRrZXknICovCisgICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjbWRLZXkpCisJLyogT25seSBhY2NlcHQgQ01EIGFsb25lIG9yIHdpdGggQ0FQTE9DS1MgYW5kIHRoZSBtb3VzZSBidXR0b24uCisJICogV2h5IHRoZSBtb3VzZSBidXR0b24/ICovCisJaWYgKCh0aGVFdmVudC0+bW9kaWZpZXJzICYgKH4oY21kS2V5IHwgYnRuU3RhdGUgfCBhbHBoYUxvY2spKSkgPT0gMCkKKwl7CisJICAgIG1lbnUgPSBNZW51S2V5KGtleV9jaGFyKTsKKwkgICAgaWYgKEhpV29yZChtZW51KSkKKwkgICAgeworCQlndWlfbWFjX2hhbmRsZV9tZW51KG1lbnUpOworCQlyZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAvKiBDb252ZXJ0IHRoZSBtb2RpZmllcnMgKi8KKyAgICBtb2RpZmllcnMgPSBFdmVudE1vZGlmaWVyczJWaW1Nb2RpZmllcnModGhlRXZlbnQtPm1vZGlmaWVycyk7CisKKworICAgIC8qIEhhbmRsZSBzcGVjaWFsIGtleXMuICovCisjaWYgMAorICAgIC8qIFdoeSBoYXZlIHRoaXMgYmVlbiByZW1vdmVkPyAqLworICAgIGlmCSghKHRoZUV2ZW50LT5tb2RpZmllcnMgJiAoY21kS2V5IHwgY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpKQorI2VuZGlmCisgICAgeworCS8qIEZpbmQgdGhlIHNwZWNpYWwga2V5IChmb3Igbm9uLXByaW50YWJsZSBrZXl0X2NoYXIpICovCisJaWYgICgoa2V5X2NoYXIgPCAweDIwKSB8fCAoa2V5X2NoYXIgPT0gMHg3ZikpCisJICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IChLZXlTeW0pMDsgaSsrKQorCQlpZiAoc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0ga2V5X3N5bSkKKwkJeworIyBpZiAwCisJCSAgICAvKiBXZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSBub3Qgc28gc3BlY2lhbCBrZXkgKi8KKwkJICAgIGlmIChzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxID09IE5VTCkKKwkJCWtleV9jaGFyID0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMDsKKwkJICAgIGVsc2UKKyMgZW5kaWYKKwkJCWtleV9jaGFyID0gVE9fU1BFQ0lBTCggc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMCwKKwkJCQkJCXNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEgKTsKKwkJICAgIGtleV9jaGFyID0gc2ltcGxpZnlfa2V5KGtleV9jaGFyLCZtb2RpZmllcnMpOworCQkgICAgYnJlYWs7CisJCX0KKyAgICB9CisKKworICAgIC8qIEFkZCB0aGUgbW9kaWZpZXIgdG8gdGhlIGlucHV0IGJ1IGlmIG5lZWRlZCAqLworICAgIC8qIERvIG5vdCB3YW50IFNISUZULUEgb3IgQ1RSTC1BIHdpdGggbW9kaWZpZXIgKi8KKyAgICBpZiAoIUlTX1NQRUNJQUwoa2V5X2NoYXIpCisJICAgICYmIGtleV9zeW0gIT0gdmtfU3BhY2UKKwkgICAgJiYga2V5X3N5bSAhPSB2a19UYWIKKwkgICAgJiYga2V5X3N5bSAhPSB2a19SZXR1cm4KKwkgICAgJiYga2V5X3N5bSAhPSB2a19FbnRlcgorCSAgICAmJiBrZXlfc3ltICE9IHZrX0VzYykKKyAgICB7CisjaWYgMQorICAgIC8qIENsZWFyIG1vZGlmaWVycyB3aGVuIG9ubHkgb25lIG1vZGlmaWVyIGlzIHNldCAqLworCWlmKCAobW9kaWZpZXJzID09IE1PRF9NQVNLX1NISUZUKSB8fAorCSAgICAobW9kaWZpZXJzID09IE1PRF9NQVNLX0NUUkwpICB8fAorCSAgICAobW9kaWZpZXJzID09IE1PRF9NQVNLX0FMVCkpCisJICAgIG1vZGlmaWVycyA9IDA7CisjZWxzZQorCWlmKCBtb2RpZmllcnMgJiBNT0RfTUFTS19DVFJMKQorCSAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgJiB+TU9EX01BU0tfQ1RSTDsKKwlpZiggbW9kaWZpZXJzICYgTU9EX01BU0tfQUxUKQorCSAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgJiB+TU9EX01BU0tfQUxUOworCWlmKCBtb2RpZmllcnMgJiBNT0RfTUFTS19TSElGVCkKKwkgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzICYgfk1PRF9NQVNLX1NISUZUOworI2VuZGlmCisgICAgfQorCWlmKCBtb2RpZmllcnMgKQorCXsKKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gQ1NJOworCSAgICBzdHJpbmdbIGxlbisrIF0gPSBLU19NT0RJRklFUjsKKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gbW9kaWZpZXJzOworCX0KKworCWlmKCBJU19TUEVDSUFMKCBrZXlfY2hhciApICkKKwl7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IENTSTsKKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gS19TRUNPTkQoIGtleV9jaGFyICk7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IEtfVEhJUkQoIGtleV9jaGFyICk7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgeworCQljaGFyX3UJZnJvbVsyXSwgKnRvOworCQlpbnQJbDsKKworCQlmcm9tWzBdID0ga2V5X2NoYXI7CisJCWZyb21bMV0gPSBOVUw7CisJCWwgPSAxOworCQl0byA9IHN0cmluZ19jb252ZXJ0KCZpbnB1dF9jb252LCBmcm9tLCAmbCk7CisJCWlmICh0byAhPSBOVUxMKQorCQl7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbCAmJiBsZW4gPCAxOTsgaSsrKQorCQkgICAgeworCQkJaWYgKHRvW2ldID09IENTSSkKKwkJCXsKKwkJCSAgICBzdHJpbmdbbGVuKytdID0gS1NfRVhUUkE7CisJCQkgICAgc3RyaW5nW2xlbisrXSA9IEtFX0NTSTsKKwkJCX0KKwkJCWVsc2UKKwkJCSAgICBzdHJpbmdbbGVuKytdID0gdG9baV07CisJCSAgICB9CisJCSAgICB2aW1fZnJlZSh0byk7CisJCX0KKwkJZWxzZQorCQkgICAgc3RyaW5nW2xlbisrXSA9IGtleV9jaGFyOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlzdHJpbmdbbGVuKytdID0ga2V5X2NoYXI7CisJfQorCisJaWYgKGxlbiA9PSAxICYmIHN0cmluZ1swXSA9PSBDU0kpCisJeworCSAgICAvKiBUdXJuIENTSSBpbnRvIEtfQ1NJLiAqLworCSAgICBzdHJpbmdbIGxlbisrIF0gPSBLU19FWFRSQTsKKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gS0VfQ1NJOworCX0KKworICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCBsZW4pOworfQorCisvKgorICogSGFuZGxlIE1vdXNlQ2xpY2sKKyAqLworICAgIHZvaWQKK2d1aV9tYWNfZG9Nb3VzZURvd25FdmVudCAodGhlRXZlbnQpCisgICAgRXZlbnRSZWNvcmQgKnRoZUV2ZW50OworeworICAgIHNob3J0CQl0aGVQYXJ0OworICAgIFdpbmRvd1B0cgkJd2hpY2hXaW5kb3c7CisKKyAgICB0aGVQYXJ0ID0gRmluZFdpbmRvdyAodGhlRXZlbnQtPndoZXJlLCAmd2hpY2hXaW5kb3cpOworCisgICAgc3dpdGNoICh0aGVQYXJ0KQorICAgIHsKKwljYXNlIChpbkRlc2spOgorCSAgICAvKiBUT0RPOiB3aGF0IHRvIGRvPyAqLworCSAgICBicmVhazsKKworCWNhc2UgKGluTWVudUJhcik6CisJICAgIGd1aV9tYWNfaGFuZGxlX21lbnUoTWVudVNlbGVjdCAodGhlRXZlbnQtPndoZXJlKSk7CisJICAgIGJyZWFrOworCisJY2FzZSAoaW5Db250ZW50KToKKwkgICAgZ3VpX21hY19kb0luQ29udGVudENsaWNrICh0aGVFdmVudCwgd2hpY2hXaW5kb3cpOworCSAgICBicmVhazsKKworCWNhc2UgKGluRHJhZyk6CisJICAgIGd1aV9tYWNfZG9JbkRyYWdDbGljayAodGhlRXZlbnQtPndoZXJlLCB3aGljaFdpbmRvdyk7CisJICAgIGJyZWFrOworCisJY2FzZSAoaW5Hcm93KToKKwkgICAgZ3VpX21hY19kb0luR3Jvd0NsaWNrICh0aGVFdmVudC0+d2hlcmUsIHdoaWNoV2luZG93KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIChpbkdvQXdheSk6CisJICAgIGlmIChUcmFja0dvQXdheSh3aGljaFdpbmRvdywgdGhlRXZlbnQtPndoZXJlKSkKKwkJZ3VpX3NoZWxsX2Nsb3NlZCgpOworCSAgICBicmVhazsKKworCWNhc2UgKGluWm9vbUluKToKKwljYXNlIChpblpvb21PdXQpOgorI2lmZGVmIFVTRV9DQVJCT05JWkVECisJICAgIGd1aV9tYWNfZG9Jblpvb21DbGljayh0aGVFdmVudCwgd2hpY2hXaW5kb3cpOworI2VuZGlmCisJICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSBNb3VzZU1vdmVkCisgKiBbdGhpcyBldmVudCBpcyBhIG1vdmluZyBpbiBhbmQgb3V0IG9mIGEgcmVnaW9uXQorICovCisgICAgdm9pZAorZ3VpX21hY19kb01vdXNlTW92ZWRFdmVudCAoZXZlbnQpCisgICAgRXZlbnRSZWNvcmQgKmV2ZW50OworeworICAgIFBvaW50ICAgdGhlUG9pbnQ7CisgICAgaW50X3UgICB2aW1Nb2RpZmllcnM7CisKKyAgICB0aGVQb2ludCA9IGV2ZW50LT53aGVyZTsKKyAgICBHbG9iYWxUb0xvY2FsICgmdGhlUG9pbnQpOworICAgIHZpbU1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKGV2ZW50LT5tb2RpZmllcnMpOworCisgICAgaWYgKCFCdXR0b24oKSkKKwlndWlfbW91c2VfbW92ZWQgKHRoZVBvaW50LmgsIHRoZVBvaW50LnYpOworICAgIGVsc2UKKyNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQorCWlmICghY2xpY2tJc1BvcHVwKQorI2VuZGlmCisJICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KE1PVVNFX0RSQUcsIHRoZVBvaW50LmgsCisJCQkJCSAgICAgdGhlUG9pbnQudiwgRkFMU0UsIHZpbU1vZGlmaWVycyk7CisKKyAgICAvKiBSZXNldCB0aGUgcmVnaW9uIGZyb20gd2hpY2ggd2UgbW92ZSBpbiBhbmQgb3V0ICovCisgICAgU2V0UmVjdCAoJmRyYWdSZWN0LCBGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSksCisJCQlGSUxMX1koWV8yX1JPVyh0aGVQb2ludC52KSksCisJCQlGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSsxKSwKKwkJCUZJTExfWShZXzJfUk9XKHRoZVBvaW50LnYpKzEpKTsKKworICAgIGlmIChkcmFnUmVjdEVuYmwpCisJZHJhZ1JlY3RDb250cm9sID0ga0NyZWF0ZVJlY3Q7CisKK30KKworLyoKKyAqIEhhbmRsZSB0aGUgbW91c2UgcmVsZWFzZQorICovCisgICAgdm9pZAorZ3VpX21hY19kb01vdXNlVXBFdmVudCAodGhlRXZlbnQpCisgICAgRXZlbnRSZWNvcmQgKnRoZUV2ZW50OworeworICAgIFBvaW50ICAgdGhlUG9pbnQ7CisgICAgaW50X3UgICB2aW1Nb2RpZmllcnM7CisKKyAgICAvKiBUT0RPOiBQcm9wZXJseSBjb252ZXJ0IHRoZSBDb250ZXh0dWFsIG1lbnUgbW91c2UtdXAgKi8KKyAgICAvKiAgICAgICBQb3RlbnRpYWwgc291cmNlIG9mIHRoZSBkb3VibGUgbWVudSAqLworICAgIGxhc3RNb3VzZVRpY2sgPSB0aGVFdmVudC0+d2hlbjsKKyAgICBkcmFnUmVjdEVuYmwgPSBGQUxTRTsKKyAgICBkcmFnUmVjdENvbnRyb2wgPSBrQ3JlYXRlRW1wdHk7CisgICAgdGhlUG9pbnQgPSB0aGVFdmVudC0+d2hlcmU7CisgICAgR2xvYmFsVG9Mb2NhbCAoJnRoZVBvaW50KTsKKworICAgIHZpbU1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKHRoZUV2ZW50LT5tb2RpZmllcnMpOworI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCisgICAgaWYgKGNsaWNrSXNQb3B1cCkKKyAgICB7CisJdmltTW9kaWZpZXJzICY9IH5NT1VTRV9DVFJMOworCWNsaWNrSXNQb3B1cCA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50CisgICAgICAoTU9VU0VfUkVMRUFTRSwgdGhlUG9pbnQuaCwgdGhlUG9pbnQudiwgRkFMU0UsIHZpbU1vZGlmaWVycyk7Cit9CisKKyNpZmRlZiBVU0VfTU9VU0VXSEVFTAorICAgIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMKK2d1aV9tYWNfbW91c2Vfd2hlZWwoRXZlbnRIYW5kbGVyQ2FsbFJlZiBuZXh0SGFuZGxlciwgRXZlbnRSZWYgdGhlRXZlbnQsCisJCQkJCQkJCSAgIHZvaWQgKmRhdGEpCit7CisgICAgRXZlbnRSZWYJYm9ndXNFdmVudDsKKyAgICBQb2ludAlwb2ludDsKKyAgICBSZWN0CWJvdW5kczsKKyAgICBVSW50MzIJbW9kOworICAgIFNJbnQzMglkZWx0YTsKKyAgICBpbnRfdQl2aW1fbW9kOworCisgICAgaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBrRXZlbnRQYXJhbU1vdXNlV2hlZWxEZWx0YSwKKwkJCSAgICAgIHR5cGVTSW50MzIsIE5VTEwsIHNpemVvZihTSW50MzIpLCBOVUxMLCAmZGVsdGEpKQorCWdvdG8gYmFpbDsKKyAgICBpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsIGtFdmVudFBhcmFtTW91c2VMb2NhdGlvbiwKKwkJCSAgICAgIHR5cGVRRFBvaW50LCBOVUxMLCBzaXplb2YoUG9pbnQpLCBOVUxMLCAmcG9pbnQpKQorCWdvdG8gYmFpbDsKKyAgICBpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsIGtFdmVudFBhcmFtS2V5TW9kaWZpZXJzLAorCQkJCXR5cGVVSW50MzIsIE5VTEwsIHNpemVvZihVSW50MzIpLCBOVUxMLCAmbW9kKSkKKwlnb3RvIGJhaWw7CisKKyAgICB2aW1fbW9kID0gMDsKKyAgICBpZiAobW9kICYgc2hpZnRLZXkpCisJdmltX21vZCB8PSBNT1VTRV9TSElGVDsKKyAgICBpZiAobW9kICYgY29udHJvbEtleSkKKwl2aW1fbW9kIHw9IE1PVVNFX0NUUkw7CisgICAgaWYgKG1vZCAmIG9wdGlvbktleSkKKwl2aW1fbW9kIHw9IE1PVVNFX0FMVDsKKworICAgIC8qIHBvc3QgYSBib2d1cyBldmVudCB0byB3YWtlIHVwIFdhaXROZXh0RXZlbnQgKi8KKyAgICBpZiAobm9FcnIgIT0gQ3JlYXRlRXZlbnQoTlVMTCwga0V2ZW50Q2xhc3NNb3VzZSwga0V2ZW50TW91c2VNb3ZlZCwgMCwKKwkJCQkJICAgIGtFdmVudEF0dHJpYnV0ZU5vbmUsICZib2d1c0V2ZW50KSkKKwlnb3RvIGJhaWw7CisgICAgaWYgKG5vRXJyICE9IFBvc3RFdmVudFRvUXVldWUoR2V0TWFpbkV2ZW50UXVldWUoKSwgYm9ndXNFdmVudCwKKwkJCQkJCQkgICBrRXZlbnRQcmlvcml0eUxvdykpCisJZ290byBiYWlsOworCisgICAgaWYgKG5vRXJyID09IEdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93Q29udGVudFJnbiwgJmJvdW5kcykpCisgICAgeworCXBvaW50LmggLT0gYm91bmRzLmxlZnQ7CisJcG9pbnQudiAtPSBib3VuZHMudG9wOworICAgIH0KKworICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KChkZWx0YSA+IDApID8gTU9VU0VfNCA6IE1PVVNFXzUsCisJCQkJCSAgICBwb2ludC5oLCBwb2ludC52LCBGQUxTRSwgdmltX21vZCk7CisKKyAgICByZXR1cm4gbm9FcnI7CisKKyAgYmFpbDoKKyAgICAvKgorICAgICAqIHdoZW4gd2UgZmFpbCBnaXZlIGFueSBhZGRpdGlvbmFsIGNhbGxiYWNrIGhhbmRsZXIgYSBjaGFuY2UgdG8gcGVyZm9ybQorICAgICAqIGl0J3MgYWN0aW9ucworICAgICAqLworICAgIHJldHVybiBDYWxsTmV4dEV2ZW50SGFuZGxlcihuZXh0SGFuZGxlciwgdGhlRXZlbnQpOworfQorI2VuZGlmIC8qIGRlZmluZWQoVVNFX01PVVNFV0hFRUwpICovCisKKyNpZiAwCisKKy8qCisgKiBUaGlzIHdvdWxkIGJlIHRoZSBub3JtYWwgd2F5IG9mIGludm9raW5nIHRoZSBjb250ZXh0dWFsIG1lbnUKKyAqIGJ1dCB0aGUgVmltIEFQSSBkb2Vzbid0IHNlZW0gdG8gYSBzdXBwb3J0IGEgcmVxdWVzdCB0byBnZXQKKyAqIHRoZSBtZW51IHRoYXQgd2Ugc2hvdWxkIGRpc3BsYXkKKyAqLworICAgIHZvaWQKK2d1aV9tYWNfaGFuZGxlX2NvbnRleHR1YWxfbWVudShldmVudCkKKyAgICBFdmVudFJlY29yZCAqZXZlbnQ7Cit7CisvKgorICogIENsb25lIFBvcFVwIHRvIHVzZSBtZW51CisgKiAgQ3JlYXRlIGEgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbgorICogIENhbGwgdGhlIHByb2NlZHVyZQorICovCisKKy8vICBDYWxsIHRvIEhhbmRsZSBQb3B1cAorICAgIE9TU3RhdHVzIHN0YXR1cyA9IENvbnRleHR1YWxNZW51U2VsZWN0KENudHhNZW51LCBldmVudC0+d2hlcmUsIGZhbHNlLCBrQ01IZWxwSXRlbU5vSGVscCwgIiIsIE5VTEwsICZDbnR4VHlwZSwgJkNudHhNZW51SUQsICZDbnR4TWVudUl0ZW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBub0VycikKKwlyZXR1cm47CisKKyAgICBpZiAoQ250eFR5cGUgPT0ga0NNTWVudUl0ZW1TZWxlY3RlZCkKKyAgICB7CisJLyogSGFuZGxlIHRoZSBtZW51IENudHhNZW51SUQsIENudHhNZW51SXRlbSAqLworCS8qIFRoZSBzdWJtZW51IGNhbiBiZSBoYW5kbGUgZGlyZWN0bHkgYnkgZ3VpX21hY19oYW5kbGVfbWVudSAqLworCS8qIEJ1dCB3aGF0IGFib3V0IHRoZSBjdXJyZW50IG1lbnUsIGlzIHRoZSBtZW55IGNoYW5nZWQgYnkgQ29udGV4dHVhbE1lbnVTZWxlY3QgKi8KKwlndWlfbWFjX2hhbmRsZV9tZW51ICgoQ250eE1lbnVJRCA8PCAxNikgKyBDbnR4TWVudUl0ZW0pOworICAgIH0KKyAgICBlbHNlIGlmIChDbnR4TWVudUlEID09IGtDTVNob3dIZWxwU2VsZWN0ZWQpCisgICAgeworCS8qIFNob3VsZCBjb21lIHVwIHdpdGggdGhlIGhlbHAgKi8KKyAgICB9CisKK30KKyNlbmRpZgorCisvKgorICogSGFuZGxlIG1lbnViYXIgc2VsZWN0aW9uCisgKi8KKyAgICB2b2lkCitndWlfbWFjX2hhbmRsZV9tZW51KG1lbnVDaG9pY2UpCisgICAgbG9uZyBtZW51Q2hvaWNlOworeworICAgIHNob3J0CW1lbnUgPSBIaVdvcmQobWVudUNob2ljZSk7CisgICAgc2hvcnQJaXRlbSA9IExvV29yZChtZW51Q2hvaWNlKTsKKyAgICB2aW1tZW51X1QJKnRoZVZpbU1lbnUgPSByb290X21lbnU7CisjaWZuZGVmIFVTRV9DQVJCT05JWkVECisgICAgTWVudUhhbmRsZQlhcHBsZU1lbnU7CisgICAgU3RyMjU1CWl0ZW1OYW1lOworI2VuZGlmCisKKyAgICBpZiAobWVudSA9PSAyNTYpICAvKiBUT0RPOiB1c2UgY29uc3RhbnQgb3IgZ3VpLnh5eiAqLworICAgIHsKKwlpZiAoaXRlbSA9PSAxKQorCSAgICBndWlfbWNoX2JlZXAoKTsgLyogVE9ETzogUG9wdXAgZGlhbG9nIG9yIGRvIDppbnRybyAqLworCWVsc2UKKwl7CisjaWZuZGVmIFVTRV9DQVJCT05JWkVECisJICAgIC8qIERlc2sgQWNjZXNzb3J5IGRvZXNuJ3QgZXhpc3QgaW4gQ2FyYm9uICovCisJICAgIGFwcGxlTWVudSA9IEdldE1lbnVIYW5kbGUgKG1lbnUpOworCSAgICBHZXRNZW51SXRlbVRleHQgKGFwcGxlTWVudSwgaXRlbSwgaXRlbU5hbWUpOworCSAgICAodm9pZCkgT3BlbkRlc2tBY2MgKGl0ZW1OYW1lKTsKKyNlbmRpZgorCX0KKyAgICB9CisgICAgZWxzZSBpZiAoaXRlbSAhPSAwKQorICAgIHsKKwl0aGVWaW1NZW51ID0gZ3VpX21hY19nZXRfdmltX21lbnUobWVudSwgaXRlbSwgcm9vdF9tZW51KTsKKworCWlmICh0aGVWaW1NZW51KQorCSAgICBndWlfbWVudV9jYih0aGVWaW1NZW51KTsKKyAgICB9CisgICAgSGlsaXRlTWVudSAoMCk7Cit9CisKKy8qCisgKiBEaXNwYXRjaCB0aGUgZXZlbnQgdG8gcHJvcGVyIGhhbmRsZXIKKyAqLworCisgICAgdm9pZAorZ3VpX21hY19oYW5kbGVfZXZlbnQgKGV2ZW50KQorICAgIEV2ZW50UmVjb3JkICpldmVudDsKK3sKKyAgICBPU0VycgllcnJvcjsKKworICAgIC8qIEhhbmRsZSBjb250ZXh0dWFsIG1lbnUgcmlnaHQgbm93IChpZiBuZWVkZWQpICovCisjaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKKyAgICBpZiAoZ3VpLk1hY09TSGF2ZUNudHhNZW51KQorCWlmIChJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKGV2ZW50KSkKKwl7CisjIGlmIDAKKwkgICAgZ3VpX21hY19oYW5kbGVfY29udGV4dHVhbF9tZW51KGV2ZW50KTsKKyMgZWxzZQorCSAgICBndWlfbWFjX2RvTW91c2VEb3duRXZlbnQoZXZlbnQpOworIyBlbmRpZgorCSAgICByZXR1cm47CisJfQorI2VuZGlmCisKKyAgICAvKiBIYW5kbGUgbm9ybWFsIGV2ZW50ICovCisgICAgc3dpdGNoIChldmVudC0+d2hhdCkKKyAgICB7CisJY2FzZSAoa2V5RG93bik6CisJY2FzZSAoYXV0b0tleSk6CisJICAgIGd1aV9tYWNfZG9LZXlFdmVudCAoZXZlbnQpOworCSAgICBicmVhazsKKworCWNhc2UgKGtleVVwKToKKwkgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB3aGVuIHRoZSBrZXkgZ2V0IHJlbGVhc2UgKi8KKwkgICAgYnJlYWs7CisKKwljYXNlIChtb3VzZURvd24pOgorCSAgICBndWlfbWFjX2RvTW91c2VEb3duRXZlbnQoZXZlbnQpOworCSAgICBicmVhazsKKworCWNhc2UgKG1vdXNlVXApOgorCSAgICBndWlfbWFjX2RvTW91c2VVcEV2ZW50KGV2ZW50KTsKKwkgICAgYnJlYWs7CisKKwljYXNlICh1cGRhdGVFdnQpOgorCSAgICBndWlfbWFjX2RvVXBkYXRlRXZlbnQgKGV2ZW50KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIChkaXNrRXZ0KToKKwkgICAgLyogV2UgZG9uJ3QgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBkaXNrIGluc2VydGlvbiAqLworCSAgICBicmVhazsKKworCWNhc2UgKGFjdGl2YXRlRXZ0KToKKwkgICAgZ3VpX21hY19kb0FjdGl2YXRlRXZlbnQgKGV2ZW50KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIChvc0V2dCk6CisJICAgIHN3aXRjaCAoKGV2ZW50LT5tZXNzYWdlID4+IDI0KSAmIDB4RkYpCisJICAgIHsKKwkJY2FzZSAoMHhGQSk6IC8qIG1vdXNlTW92ZWRNZXNzYWdlICovCisJCSAgICBndWlfbWFjX2RvTW91c2VNb3ZlZEV2ZW50IChldmVudCk7CisJCSAgICBicmVhazsKKwkJY2FzZSAoMHgwMSk6IC8qIHN1c3BlbmRSZXN1bWVNZXNzYWdlICovCisJCSAgICBndWlfbWFjX2RvU3VzcGVuZEV2ZW50IChldmVudCk7CisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKworI2lmZGVmIFVTRV9BRVZFTlQKKwljYXNlIChrSGlnaExldmVsRXZlbnQpOgorCSAgICAvKiBTb21lb25lJ3MgdGFsa2luZyB0byB1cywgdGhyb3VnaCBBcHBsZUV2ZW50cyAqLworCSAgICBlcnJvciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoZXZlbnQpOyAvKiBUT0RPOiBFcnJvciBIYW5kbGluZyAqLworCSAgICBicmVhazsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVW5rbm93biBTdHVmZgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworCisgICAgR3VpRm9udAorZ3VpX21hY19maW5kX2ZvbnQgKGZvbnRfbmFtZSkKKyAgICBjaGFyX3UgKmZvbnRfbmFtZTsKK3sKKyAgICBjaGFyX3UJYzsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CXBGb250TmFtZVsyNTZdOworICAgIFN0cjI1NQlzeXN0ZW1Gb250bmFtZTsKKyAgICBzaG9ydAlmb250X2lkOworICAgIHNob3J0CXNpemU9OTsKKyAgICBHdWlGb250CWZvbnQ7CisjaWYgMAorICAgIGNoYXJfdSAgICAgICpmb250TmFtZVB0cjsKKyNlbmRpZgorCisgICAgZm9yIChwID0gZm9udF9uYW1lOyAoKCpwICE9IDApICYmICgqcCAhPSAnOicpKTsgcCsrKQorCTsKKworICAgIGMgPSAqcDsKKyAgICAqcCA9IDA7CisKKyNpZiAxCisgICAgU1RSQ1BZKCZwRm9udE5hbWVbMV0sIGZvbnRfbmFtZSk7CisgICAgcEZvbnROYW1lWzBdID0gU1RSTEVOKGZvbnRfbmFtZSk7CisgICAgKnAgPSBjOworCisgICAgR2V0Rk51bSAocEZvbnROYW1lLCAmZm9udF9pZCk7CisjZWxzZQorICAgIC8qIG5hbWUgPSBDMlBhc2NhbF9zYXZlKG1lbnUtPmRuYW1lKTsgKi8KKyAgICBmb250TmFtZVB0ciA9IEMyUGFzY2FsX3NhdmVfYW5kX3JlbW92ZV9iYWNrc2xhc2goZm9udF9uYW1lKTsKKworICAgIEdldEZOdW0gKGZvbnROYW1lUHRyLCAmZm9udF9pZCk7CisjZW5kaWYKKworCisgICAgaWYgKGZvbnRfaWQgPT0gMCkKKyAgICB7CisJLyogT3VwcywgdGhlIHN5c3RlbSBmb250IHdhcyBpdCB0aGUgb25lIHRoZSB1c2VyIHdhbnQgKi8KKworCUdldEZvbnROYW1lICgwLCBzeXN0ZW1Gb250bmFtZSk7CisJaWYgKCFFcXVhbFN0cmluZyhwRm9udE5hbWUsIHN5c3RlbUZvbnRuYW1lLCBmYWxzZSwgZmFsc2UpKQorCSAgICByZXR1cm4gTk9GT05UOworICAgIH0KKyAgICBpZiAoKnAgPT0gJzonKQorICAgIHsKKwlwKys7CisJLyogU2V0IHRoZSB2YWx1ZXMgZm91bmQgYWZ0ZXIgJzonICovCisJd2hpbGUgKCpwKQorCXsKKwkgICAgc3dpdGNoICgqcCsrKQorCSAgICB7CisJCWNhc2UgJ2gnOgorCQkgICAgc2l6ZSA9IHBvaW50c190b19waXhlbHMocCwgJnAsIFRSVUUpOworCQkgICAgYnJlYWs7CisJCSAgICAvKgorCQkgICAgICogVE9ETzogTWF5YmUgYWNjZXB0IHdpZHRoIGFuZCBzdHlsZXMKKwkJICAgICAqLworCSAgICB9CisJICAgIHdoaWxlICgqcCA9PSAnOicpCisJCXArKzsKKwl9CisgICAgfQorCisgICAgaWYgKHNpemUgPCAxKQorCXNpemUgPSAxOyAgIC8qIEF2b2lkIGhhdmluZyBhIHNpemUgb2YgMCB3aXRoIHN5c3RlbSBmb250ICovCisKKyAgICBmb250ID0gKHNpemUgPDwgMTYpICsgKChsb25nKSBmb250X2lkICYgMHhGRkZGKTsKKworICAgIHJldHVybiBmb250OworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHVUlfTUNIIGZ1bmN0aW9ubmFsaXR5CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogUGFyc2UgdGhlIEdVSSByZWxhdGVkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBBbnkgYXJndW1lbnRzIHVzZWQgYXJlCisgKiBkZWxldGVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkIGFjY29yZGluZ2x5LiAgVGhpcyBpcyBjYWxsZWQKKyAqIHdoZW4gdmltIGlzIHN0YXJ0ZWQsIHdoZXRoZXIgb3Igbm90IHRoZSBHVUkgaGFzIGJlZW4gc3RhcnRlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfcHJlcGFyZShhcmdjLCBhcmd2KQorICAgIGludAkJKmFyZ2M7CisgICAgY2hhcgkqKmFyZ3Y7Cit7CisgICAgLyogVE9ETzogTW92ZSBtb3N0IG9mIHRoaXMgc3R1ZmYgdG93YXJkIGd1aV9tY2hfaW5pdCAqLworI2lmZGVmIFVTRV9FWEVfTkFNRQorICAgIEZTU3BlYwlhcHBsRGlyOworIyBpZm5kZWYgVVNFX0ZJTkRfQlVORExFX1BBVEgKKyAgICBzaG9ydAlhcHBsVlJlZk51bTsKKyAgICBsb25nCWFwcGxEaXJJRDsKKyAgICBTdHIyNTUJdm9sTmFtZTsKKyMgZWxzZQorICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIgcHNuOworICAgIEZTUmVmCWFwcGxGU1JlZjsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFVTRV9DQVJCT05JWkVECisgICAgTWF4QXBwbFpvbmUoKTsJICAgIC8qIFdoYXQgY291bGQgcmVwbGFjZSB0aG9zICovCisgICAgLyogSW4gQ2FyYm9uLCBhbGwgc2hhcmVkIGxpYnJhcnkgYXJlIGF1dG9tYXRpY2FsbHkgbG9hZCBpbgorICAgICAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBpbml0IHRoZW0KKyAgICAgKi8KKyAgICBJbml0R3JhZigmcWQudGhlUG9ydCk7CisgICAgSW5pdEZvbnRzKCk7CisgICAgSW5pdFdpbmRvd3MoKTsKKyAgICBJbml0TWVudXMoKTsKKyAgICBURUluaXQoKTsKKyAgICBJbml0RGlhbG9ncyhuaWwpOworI2Vsc2UKKyAgICAvKiBXaHkgZGlkIEkgcHV0IHRoYXQgaW4/IChEYW55KSAqLworICAgIE1vcmVNYXN0ZXJQb2ludGVycyAoMHg0MCAqIDMpOyAvKiB3ZSBsb3ZlIGhhbmRsZXMgKi8KKyNlbmRpZgorCisjaWYgMAorICAgIEluaXRDdXJzb3IoKTsKKworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9BRVZFTlQKKyAgICAodm9pZCkgSW5zdGFsbEFFSGFuZGxlcnMoKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKKyAgICBpZiAoR2VzdGFsdChnZXN0YWx0Q29udGV4dHVhbE1lbnVBdHRyLCAmZ2VzdGFsdF9yYykgPT0gbm9FcnIpCisJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gQml0VHN0KCZnZXN0YWx0X3JjLCAzMS1nZXN0YWx0Q29udGV4dHVhbE1lbnVUcmFwQXZhaWxhYmxlKTsKKyAgICBlbHNlCisJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gZmFsc2U7CisKKyAgICBpZiAoZ3VpLk1hY09TSGF2ZUNudHhNZW51KQorCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IChJbml0Q29udGV4dHVhbE1lbnVzKCk9PW5vRXJyKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX1NJT1VYCisgICAgU0lPVVhTZXR0aW5ncy5zdGFuZGFsb25lID0gZmFsc2U7CisgICAgU0lPVVhTZXR0aW5ncy5pbml0aWFsaXplVEIgPSBmYWxzZTsKKyAgICBTSU9VWFNldHRpbmdzLnNldHVwbWVudXMgPSBmYWxzZTsKKyAgICBTSU9VWFNldHRpbmdzLmFza3Rvc2F2ZW9uY2xvc2UgPSBmYWxzZTsKKyAgICBTSU9VWFNldHRpbmdzLnNob3dzdGF0dXNsaW5lID0gdHJ1ZTsKKyAgICBTSU9VWFNldHRpbmdzLnRvcHBpeGVsID0gMzAwOworICAgIFNJT1VYU2V0dGluZ3MubGVmdHBpeGVsID0gMTA7CisgICAgSW5zdGFsbENvbnNvbGUgKDEpOyAvKiBmaWxlbm8oc3Rkb3V0KSA9IDEsIG9uIHBhZ2UgNDMwIG9mIE1TTCBDICovCisgICAgcHJpbnRmICgiRGVidWdnaW5nIGNvbnNvbGUgZW5hYmxlZFxuIik7CisgICAgLyoJU0lPVVhTZXRUaXRsZSAoKGNoYXJfdSAqKSAiVmltIFN0ZG91dCIpOyAqLworI2VuZGlmCisKKyAgICBwb21tZSA9IE5ld01lbnUgKDI1NiwgIlxwXDAyNCIpOyAvKiAweDE0PSA9IEFwcGxlIE1lbnUgKi8KKworICAgIEFwcGVuZE1lbnUgKHBvbW1lLCAiXHBBYm91dCBWSU0iKTsKKyNpZm5kZWYgVVNFX0NBUkJPTklaRUQKKyAgICBBcHBlbmRNZW51IChwb21tZSwgIlxwLSIpOworICAgIEFwcGVuZFJlc01lbnUgKHBvbW1lLCAnRFJWUicpOworI2VuZGlmCisKKyAgICBJbnNlcnRNZW51IChwb21tZSwgMCk7CisKKyAgICBEcmF3TWVudUJhcigpOworCisKKyNpZm5kZWYgVVNFX09GRlNFVEVEX1dJTkRPVworICAgIFNldFJlY3QgKCZ3aW5kUmVjdCwgMTAsIDQ4LCAxMCs4MCo3ICsgMTYsIDQ4KzI0KjExKTsKKyNlbHNlCisgICAgU2V0UmVjdCAoJndpbmRSZWN0LCAzMDAsIDQwLCAzMDArODAqNyArIDE2LCA0MCsyNCoxMSk7CisjZW5kaWYKKworCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBDcmVhdGVOZXdXaW5kb3coa0RvY3VtZW50V2luZG93Q2xhc3MsCisJCWtXaW5kb3dSZXNpemFibGVBdHRyaWJ1dGUgfCBrV2luZG93Q29sbGFwc2VCb3hBdHRyaWJ1dGUsCisJCSZ3aW5kUmVjdCwgJmd1aS5WaW1XaW5kb3cgKTsKKyAgICBTZXRQb3J0V2luZG93UG9ydCAoIGd1aS5WaW1XaW5kb3cgKTsKKyNlbHNlCisgICAgZ3VpLlZpbVdpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmd2luZFJlY3QsICJccGdWaW0gb24gTWFjaW50b3NoIiwgdHJ1ZSwgZG9jdW1lbnRQcm9jLAorCQkJKFdpbmRvd1B0cikgLTFMLCBmYWxzZSwgMCk7CisgICAgU2V0UG9ydChndWkuVmltV2luZG93KTsKKyNlbmRpZgorCisgICAgZ3VpLmNoYXJfd2lkdGggPSA3OworICAgIGd1aS5jaGFyX2hlaWdodCA9IDExOworICAgIGd1aS5jaGFyX2FzY2VudCA9IDY7CisgICAgZ3VpLm51bV9yb3dzID0gMjQ7CisgICAgZ3VpLm51bV9jb2xzID0gODA7CisgICAgZ3VpLmluX2ZvY3VzID0gVFJVRTsgLyogRm9yIHRoZSBtb21lbnQgLT4gc3luLiBvZiBmcm9udCBhcHBsaWNhdGlvbiAqLworCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgZ1Njcm9sbEFjdGlvbiA9IE5ld0NvbnRyb2xBY3Rpb25VUFAgKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CisgICAgZ1Njcm9sbERyYWcgICA9IE5ld0NvbnRyb2xBY3Rpb25VUFAgKGd1aV9tYWNfZHJhZ190aHVtYik7CisjZWxzZQorICAgIGdTY3JvbGxBY3Rpb24gPSBOZXdDb250cm9sQWN0aW9uUHJvYyAoZ3VpX21hY19zY3JvbGxfYWN0aW9uKTsKKyAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblByb2MgKGd1aV9tYWNfZHJhZ190aHVtYik7CisjZW5kaWYKKworICAgIC8qIEdldHRpbmcgYSBoYW5kbGUgdG8gdGhlIEhlbHAgbWVudSAqLworI2lmZGVmIFVTRV9IRUxQTUVOVQorIyBpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIEhNR2V0SGVscE1lbnUoJmd1aS5NYWNPU0hlbHBNZW51LCBOVUxMKTsKKyMgZWxzZQorICAgICh2b2lkKSBITUdldEhlbHBNZW51SGFuZGxlKCZndWkuTWFjT1NIZWxwTWVudSk7CisjIGVuZGlmCisKKyAgICBpZiAoZ3VpLk1hY09TSGVscE1lbnUgIT0gbmlsKQorCWd1aS5NYWNPU0hlbHBJdGVtcyA9IENvdW50TWVudUl0ZW1zIChndWkuTWFjT1NIZWxwTWVudSk7CisgICAgZWxzZQorCWd1aS5NYWNPU0hlbHBJdGVtcyA9IDA7CisjZW5kaWYKKworICAgIGRyYWdSZWN0RW5ibCA9IEZBTFNFOworICAgIGRyYWdSZ24gPSBOVUxMOworICAgIGRyYWdSZWN0Q29udHJvbCA9IGtDcmVhdGVFbXB0eTsKKyAgICBjdXJzb3JSZ24gPSBOZXdSZ24oKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9FWEVfTkFNRQorIyBpZm5kZWYgVVNFX0ZJTkRfQlVORExFX1BBVEgKKyAgICBIR2V0Vm9sICh2b2xOYW1lLCAmYXBwbFZSZWZOdW0sICZhcHBsRGlySUQpOworICAgIC8qIFROMjAxNTogbWVudGlvbiBhIHBvc3NpYmxlIGJhZCBWUmVmTnVtICovCisgICAgRlNNYWtlRlNTcGVjIChhcHBsVlJlZk51bSwgYXBwbERpcklELCAiXHAiLCAmYXBwbERpcik7CisjIGVsc2UKKyAgICAvKiBPU0VyciBHZXRBcHBsaWNhdGlvbkJ1bmRsZUZTU3BlYyhGU1NwZWNQdHIgdGhlRlNTcGVjUHRyKQorICAgICAqIG9mIFROMjAxNQorICAgICAqIFRoaXMgdGVjaG5pYyByZW1vdmUgdGhlIC4uL0NvbnRlbnRzL01hY09TL2V0YyBwYXJ0CisgICAgICovCisgICAgKHZvaWQpIEdldEN1cnJlbnRQcm9jZXNzKCZwc24pOworICAgIC8qIGlmIChlcnIgIT0gbm9FcnIpIHJldHVybiBlcnI7ICovCisKKyAgICAodm9pZCkgR2V0UHJvY2Vzc0J1bmRsZUxvY2F0aW9uKCZwc24sICZhcHBsRlNSZWYpOworICAgIC8qIGlmIChlcnIgIT0gbm9FcnIpIHJldHVybiBlcnI7ICovCisKKyAgICAodm9pZCkgRlNHZXRDYXRhbG9nSW5mbygmYXBwbEZTUmVmLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgJmFwcGxEaXIsIE5VTEwpOworCisgICAgLyogVGhpcyB0ZWNobmljIHJldHVybiBOSUwgd2hlbiB3ZSBkaXNhbGxvd19ndWkgKi8KKyMgZW5kaWYKKyAgICBleGVfbmFtZSA9IEZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlIChhcHBsRGlyKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX1ZJTV9DUkVBVE9SX0lECisgICAgX2ZjcmVhdG9yID0gJ1ZJTSEnOworICAgIF9mdHlwZSA9ICdURVhUJzsKKyNlbmRpZgorfQorCisjaWZuZGVmIEFMV0FZU19VU0VfR1VJCisvKgorICogQ2hlY2sgaWYgdGhlIEdVSSBjYW4gYmUgc3RhcnRlZC4gIENhbGxlZCBiZWZvcmUgZ3ZpbXJjIGlzIHNvdXJjZWQuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIGludAorZ3VpX21jaF9pbml0X2NoZWNrKHZvaWQpCit7CisgICAgLyogVE9ETzogRm9yIE1hY09TIFggZmluZCBhIHdheSB0byByZXR1cm4gRkFJTCwgaWYgdGhlIHVzZXIgbG9nZ2VkIGluCisgICAgICogdXNpbmcgdGhlID5jb25zb2xlCisgICAgICovCisgICAgaWYgKGRpc2FsbG93X2d1aSkgLyogc2VlIG1haW4uYyBmb3IgcmVhc29uIHRvIGRpc2FsbG93ICovCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgT1NFcnIKK3JlY2VpdmVIYW5kbGVyKFdpbmRvd1JlZiB0aGVXaW5kb3csIHZvaWQqIGhhbmRsZXJSZWZDb24sIERyYWdSZWYgdGhlRHJhZykKK3sKKyAgICBpbnQJCXgsIHk7CisgICAgaW50X3UJbW9kaWZpZXJzOworICAgIGNoYXJfdQkqKmZuYW1lcyA9IE5VTEw7CisgICAgaW50CQljb3VudDsKKyAgICBpbnQJCWksIGo7CisKKyAgICAvKiBHZXQgZHJvcCBwb3NpdGlvbiwgbW9kaWZpZXJzIGFuZCBjb3VudCBvZiBpdGVtcyAqLworICAgIHsKKwlQb2ludAlwb2ludDsKKwlTSW50MTYJbW91c2VVcE1vZGlmaWVyczsKKwlVSW50MTYJY291bnRJdGVtOworCisJR2V0RHJhZ01vdXNlKHRoZURyYWcsICZwb2ludCwgTlVMTCk7CisJR2xvYmFsVG9Mb2NhbCgmcG9pbnQpOworCXggPSBwb2ludC5oOworCXkgPSBwb2ludC52OworCUdldERyYWdNb2RpZmllcnModGhlRHJhZywgTlVMTCwgTlVMTCwgJm1vdXNlVXBNb2RpZmllcnMpOworCW1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKG1vdXNlVXBNb2RpZmllcnMpOworCUNvdW50RHJhZ0l0ZW1zKHRoZURyYWcsICZjb3VudEl0ZW0pOworCWNvdW50ID0gY291bnRJdGVtOworICAgIH0KKworICAgIGZuYW1lcyA9IChjaGFyX3UgKiopYWxsb2MoY291bnQgKiBzaXplb2YoY2hhcl91ICopKTsKKyAgICBpZiAoZm5hbWVzID09IE5VTEwpCisJcmV0dXJuIGRyYWdOb3RBY2NlcHRlZEVycjsKKworICAgIC8qIEdldCBmaWxlIG5hbWVzIGRyb3BwZWQgKi8KKyAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgeworCURyYWdJdGVtUmVmCWl0ZW07CisJT1NFcnIJCWVycjsKKwlTaXplCQlzaXplOworCUZsYXZvclR5cGUJdHlwZSA9IGZsYXZvclR5cGVIRlM7CisJSEZTRmxhdm9yCWhmc0ZsYXZvcjsKKworCWZuYW1lc1tpXSA9IE5VTEw7CisJR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIodGhlRHJhZywgaSArIDEsICZpdGVtKTsKKwllcnIgPSBHZXRGbGF2b3JEYXRhU2l6ZSh0aGVEcmFnLCBpdGVtLCB0eXBlLCAmc2l6ZSk7CisJaWYgKGVyciAhPSBub0VyciB8fCBzaXplID4gc2l6ZW9mKGhmc0ZsYXZvcikpCisJICAgIGNvbnRpbnVlOworCWVyciA9IEdldEZsYXZvckRhdGEodGhlRHJhZywgaXRlbSwgdHlwZSwgJmhmc0ZsYXZvciwgJnNpemUsIDApOworCWlmIChlcnIgIT0gbm9FcnIpCisJICAgIGNvbnRpbnVlOworCWZuYW1lc1tqKytdID0gRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUoaGZzRmxhdm9yLmZpbGVTcGVjKTsKKyAgICB9CisgICAgY291bnQgPSBqOworCisgICAgZ3VpX2hhbmRsZV9kcm9wKHgsIHksIG1vZGlmaWVycywgZm5hbWVzLCBjb3VudCk7CisgICAgcmV0dXJuIG5vRXJyOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgR1VJLiAgQ3JlYXRlIGFsbCB0aGUgd2luZG93cywgc2V0IHVwIGFsbCB0aGUgY2FsbC1iYWNrcworICogZXRjLgorICovCisgICAgaW50CitndWlfbWNoX2luaXQoKQoreworICAgIC8qIFRPRE86IE1vdmUgbW9zdCBvZiB0aGlzIHN0dWZmIHRvd2FyZCBndWlfbWNoX2luaXQgKi8KKyAgICBSZWN0CXdpbmRSZWN0OworICAgIE1lbnVIYW5kbGUJcG9tbWU7CisjaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKKyAgICBsb25nCWdlc3RhbHRfcmM7CisjZW5kaWYKKyNpZmRlZiBVU0VfTU9VU0VXSEVFTAorICAgIEV2ZW50VHlwZVNwZWMgICBldmVudFR5cGVTcGVjOworICAgIEV2ZW50SGFuZGxlclJlZiBtb3VzZVdoZWVsSGFuZGxlclJlZjsKKyNlbmRpZgorI2lmIDEKKyAgICBJbml0Q3Vyc29yKCk7CisKKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCgpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfQUVWRU5UCisgICAgKHZvaWQpIEluc3RhbGxBRUhhbmRsZXJzKCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCisgICAgaWYgKEdlc3RhbHQoZ2VzdGFsdENvbnRleHR1YWxNZW51QXR0ciwgJmdlc3RhbHRfcmMpID09IG5vRXJyKQorCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IEJpdFRzdCgmZ2VzdGFsdF9yYywgMzEtZ2VzdGFsdENvbnRleHR1YWxNZW51VHJhcEF2YWlsYWJsZSk7CisgICAgZWxzZQorCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IGZhbHNlOworCisgICAgaWYgKGd1aS5NYWNPU0hhdmVDbnR4TWVudSkKKwlndWkuTWFjT1NIYXZlQ250eE1lbnUgPSAoSW5pdENvbnRleHR1YWxNZW51cygpPT1ub0Vycik7CisjZW5kaWYKKworI2lmZGVmIFVTRV9TSU9VWAorICAgIFNJT1VYU2V0dGluZ3Muc3RhbmRhbG9uZSA9IGZhbHNlOworICAgIFNJT1VYU2V0dGluZ3MuaW5pdGlhbGl6ZVRCID0gZmFsc2U7CisgICAgU0lPVVhTZXR0aW5ncy5zZXR1cG1lbnVzID0gZmFsc2U7CisgICAgU0lPVVhTZXR0aW5ncy5hc2t0b3NhdmVvbmNsb3NlID0gZmFsc2U7CisgICAgU0lPVVhTZXR0aW5ncy5zaG93c3RhdHVzbGluZSA9IHRydWU7CisgICAgU0lPVVhTZXR0aW5ncy50b3BwaXhlbCA9IDMwMDsKKyAgICBTSU9VWFNldHRpbmdzLmxlZnRwaXhlbCA9IDEwOworICAgIEluc3RhbGxDb25zb2xlICgxKTsgLyogZmlsZW5vKHN0ZG91dCkgPSAxLCBvbiBwYWdlIDQzMCBvZiBNU0wgQyAqLworICAgIHByaW50ZiAoIkRlYnVnZ2luZyBjb25zb2xlIGVuYWJsZWRcbiIpOworICAgIC8qCVNJT1VYU2V0VGl0bGUgKChjaGFyX3UgKikgIlZpbSBTdGRvdXQiKTsgKi8KKyNlbmRpZgorCisgICAgcG9tbWUgPSBOZXdNZW51ICgyNTYsICJccFwwMjQiKTsgLyogMHgxND0gPSBBcHBsZSBNZW51ICovCisKKyAgICBBcHBlbmRNZW51IChwb21tZSwgIlxwQWJvdXQgVklNIik7CisjaWZuZGVmIFVTRV9DQVJCT05JWkVECisgICAgQXBwZW5kTWVudSAocG9tbWUsICJccC0iKTsKKyAgICBBcHBlbmRSZXNNZW51IChwb21tZSwgJ0RSVlInKTsKKyNlbmRpZgorCisgICAgSW5zZXJ0TWVudSAocG9tbWUsIDApOworCisgICAgRHJhd01lbnVCYXIoKTsKKworCisjaWZuZGVmIFVTRV9PRkZTRVRFRF9XSU5ET1cKKyAgICBTZXRSZWN0ICgmd2luZFJlY3QsIDEwLCA0OCwgMTArODAqNyArIDE2LCA0OCsyNCoxMSk7CisjZWxzZQorICAgIFNldFJlY3QgKCZ3aW5kUmVjdCwgMzAwLCA0MCwgMzAwKzgwKjcgKyAxNiwgNDArMjQqMTEpOworI2VuZGlmCisKKyAgICBndWkuVmltV2luZG93ID0gTmV3Q1dpbmRvdyhuaWwsICZ3aW5kUmVjdCwgIlxwZ1ZpbSBvbiBNYWNpbnRvc2giLCB0cnVlLAorI2lmZGVmIFVTRV9DQVJCT05JWkVECisJCQl6b29tRG9jUHJvYywKKyNlbHNlCisJCQlkb2N1bWVudFByb2MsCisjZW5kaWYKKwkJCShXaW5kb3dQdHIpLTFMLCB0cnVlLCAwKTsKKyAgICBJbnN0YWxsUmVjZWl2ZUhhbmRsZXIoKERyYWdSZWNlaXZlSGFuZGxlclVQUClyZWNlaXZlSGFuZGxlciwKKwkgICAgZ3VpLlZpbVdpbmRvdywgTlVMTCk7CisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBTZXRQb3J0V2luZG93UG9ydCAoIGd1aS5WaW1XaW5kb3cgKTsKKyNlbHNlCisgICAgU2V0UG9ydChndWkuVmltV2luZG93KTsKKyNlbmRpZgorCisgICAgZ3VpLmNoYXJfd2lkdGggPSA3OworICAgIGd1aS5jaGFyX2hlaWdodCA9IDExOworICAgIGd1aS5jaGFyX2FzY2VudCA9IDY7CisgICAgZ3VpLm51bV9yb3dzID0gMjQ7CisgICAgZ3VpLm51bV9jb2xzID0gODA7CisgICAgZ3VpLmluX2ZvY3VzID0gVFJVRTsgLyogRm9yIHRoZSBtb21lbnQgLT4gc3luLiBvZiBmcm9udCBhcHBsaWNhdGlvbiAqLworCisjaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgZ1Njcm9sbEFjdGlvbiA9IE5ld0NvbnRyb2xBY3Rpb25VUFAgKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CisgICAgZ1Njcm9sbERyYWcgICA9IE5ld0NvbnRyb2xBY3Rpb25VUFAgKGd1aV9tYWNfZHJhZ190aHVtYik7CisjZWxzZQorICAgIGdTY3JvbGxBY3Rpb24gPSBOZXdDb250cm9sQWN0aW9uUHJvYyAoZ3VpX21hY19zY3JvbGxfYWN0aW9uKTsKKyAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblByb2MgKGd1aV9tYWNfZHJhZ190aHVtYik7CisjZW5kaWYKKworICAgIC8qIEdldHRpbmcgYSBoYW5kbGUgdG8gdGhlIEhlbHAgbWVudSAqLworI2lmZGVmIFVTRV9IRUxQTUVOVQorIyBpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIEhNR2V0SGVscE1lbnUoJmd1aS5NYWNPU0hlbHBNZW51LCBOVUxMKTsKKyMgZWxzZQorICAgICh2b2lkKSBITUdldEhlbHBNZW51SGFuZGxlKCZndWkuTWFjT1NIZWxwTWVudSk7CisjIGVuZGlmCisKKyAgICBpZiAoZ3VpLk1hY09TSGVscE1lbnUgIT0gbmlsKQorCWd1aS5NYWNPU0hlbHBJdGVtcyA9IENvdW50TWVudUl0ZW1zIChndWkuTWFjT1NIZWxwTWVudSk7CisgICAgZWxzZQorCWd1aS5NYWNPU0hlbHBJdGVtcyA9IDA7CisjZW5kaWYKKworICAgIGRyYWdSZWN0RW5ibCA9IEZBTFNFOworICAgIGRyYWdSZ24gPSBOVUxMOworICAgIGRyYWdSZWN0Q29udHJvbCA9IGtDcmVhdGVFbXB0eTsKKyAgICBjdXJzb3JSZ24gPSBOZXdSZ24oKTsKKyNlbmRpZgorICAgIC8qIERpc3BsYXkgYW55IHBlbmRpbmcgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBkaXNwbGF5X2Vycm9ycygpOworCisgICAgLyogR2V0IGJhY2tncm91bmQvZm9yZWdyb3VuZCBjb2xvcnMgZnJvbSBzeXN0ZW0gKi8KKyAgICAvKiBUT0RPOiBkbyB0aGUgYXBwcm9yaWF0ZSBjYWxsIHRvIGdldCByZWFsIGRlZmF1bHRzICovCisgICAgZ3VpLm5vcm1fcGl4ZWwgPSAweDAwMDAwMDAwOworICAgIGd1aS5iYWNrX3BpeGVsID0gMHgwMEZGRkZGRjsKKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZyb20gdGhlICJOb3JtYWwiIGdyb3VwIChzZXQgaW4gc3ludGF4LmMgb3IgaW4gYSB2aW1yYworICAgICAqIGZpbGUpLiAqLworICAgIHNldF9ub3JtYWxfY29sb3JzKCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoYXQgbm9uZSBvZiB0aGUgY29sb3JzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgICAgKiBUaGVuIHN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBhcyB0aGUgZGVmYXVsdHMuCisgICAgICovCisgICAgZ3VpX2NoZWNrX2NvbG9ycygpOworICAgIGd1aS5kZWZfbm9ybV9waXhlbCA9IGd1aS5ub3JtX3BpeGVsOworICAgIGd1aS5kZWZfYmFja19waXhlbCA9IGd1aS5iYWNrX3BpeGVsOworCisgICAgLyogR2V0IHRoZSBjb2xvcnMgZm9yIHRoZSBoaWdobGlnaHQgZ3JvdXBzIChndWlfY2hlY2tfY29sb3JzKCkgbWlnaHQgaGF2ZQorICAgICAqIGNoYW5nZWQgdGhlbSkgKi8KKyAgICBoaWdobGlnaHRfZ3VpX3N0YXJ0ZWQoKTsKKworICAgIC8qCisgICAgICogU2V0dGluZyB0aGUgZ3VpIGNvbnN0YW50cworICAgICAqLworI2lmZGVmIEZFQVRfTUVOVQorICAgIGd1aS5tZW51X2hlaWdodCA9IDA7CisjZW5kaWYKKyAgICBndWkuc2Nyb2xsYmFyX2hlaWdodCA9IGd1aS5zY3JvbGxiYXJfd2lkdGggPSAxNTsgLyogY2hlYXQgMSBvdmVybGFwICovCisgICAgZ3VpLmJvcmRlcl9vZmZzZXQgPSBndWkuYm9yZGVyX3dpZHRoID0gMjsKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKKyAgICAvKiBJZiBRdWFydHotc3R5bGUgdGV4dCBhbnRpYWxpYXNpbmcgaXMgYXZhaWxhYmxlIChzZWUKKyAgICAgICBndWlfbWNoX2RyYXdfc3RyaW5nKCkgYmVsb3cpLCBlbmFibGUgaXQgZm9yIGFsbCBmb250IHNpemVzLiAqLworICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJRRFRFWFRfTUlOU0laRSIsIChjaGFyX3UgKikiMSIpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfTU9VU0VXSEVFTAorICAgIGV2ZW50VHlwZVNwZWMuZXZlbnRDbGFzcyA9IGtFdmVudENsYXNzTW91c2U7CisgICAgZXZlbnRUeXBlU3BlYy5ldmVudEtpbmQgPSBrRXZlbnRNb3VzZVdoZWVsTW92ZWQ7CisgICAgbW91c2VXaGVlbEhhbmRsZXJVUFAgPSBOZXdFdmVudEhhbmRsZXJVUFAoZ3VpX21hY19tb3VzZV93aGVlbCk7CisgICAgaWYgKG5vRXJyICE9IEluc3RhbGxBcHBsaWNhdGlvbkV2ZW50SGFuZGxlcihtb3VzZVdoZWVsSGFuZGxlclVQUCwgMSwKKwkJCQkgJmV2ZW50VHlwZVNwZWMsIE5VTEwsICZtb3VzZVdoZWVsSGFuZGxlclJlZikpCisgICAgeworCW1vdXNlV2hlZWxIYW5kbGVyUmVmID0gTlVMTDsKKwlEaXNwb3NlRXZlbnRIYW5kbGVyVVBQKG1vdXNlV2hlZWxIYW5kbGVyVVBQKTsKKwltb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInRlcm1lbmNvZGluZyIsIDBMLCAoY2hhcl91ICopIm1hY3JvbWFuIiwgMCk7CisjZW5kaWYKKworICAgIC8qIFRPRE86IExvYWQgYml0bWFwIGlmIHVzaW5nIFRPT0xCQVIgKi8KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kIGNvbG9yIGhhcyBiZWVuIGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX25ld19jb2xvcnMoKQoreworICAgIC8qIFRPRE86CisgICAgICogVGhpcyBwcm9jIGlzIGNhbGxlZCB3aGVuIE5vcm1hbCBpcyBzZXQgdG8gYSB2YWx1ZQorICAgICAqIHNvIHdoYXQgbXN1dCBiZSBkb25lPyBJIGRvbid0IGtub3cKKyAgICAgKi8KK30KKworLyoKKyAqIE9wZW4gdGhlIEdVSSB3aW5kb3cgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGd1aV9tY2hfaW5pdCgpLgorICovCisgICAgaW50CitndWlfbWNoX29wZW4oKQoreworICAgIFNob3dXaW5kb3coZ3VpLlZpbVdpbmRvdyk7CisKKyAgICBpZiAoZ3VpX3dpbl94ICE9IC0xICYmIGd1aV93aW5feSAhPSAtMSkKKwlndWlfbWNoX3NldF93aW5wb3MoZ3VpX3dpbl94LCBndWlfd2luX3kpOworCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICAvKgorICAgICAqIE1ha2UgdGhlIEdVSSB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIChpbiBjYXNlIGl0IHdhcyBsYXVuY2hlZAorICAgICAqIGZyb20gdGhlIFRlcm1pbmFsIG9yIHZpYSA6Z3VpKS4KKyAgICAgKi8KKyAgICB7CisJUHJvY2Vzc1NlcmlhbE51bWJlciBwc247CisJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pID09IG5vRXJyKQorCSAgICBTZXRGcm9udFByb2Nlc3MoJnBzbik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2V4aXQoaW50IHJjKQoreworICAgIC8qIFRPRE86IGZpbmQgb3V0IGFsbCB3aGF0IGlzIG1pc3NpbmcgaGVyZT8gKi8KKyAgICBEaXNwb3NlUmduKGN1cnNvclJnbik7CisKKyNpZmRlZiBVU0VfTU9VU0VXSEVFTAorICAgIGlmIChtb3VzZVdoZWVsSGFuZGxlclVQUCAhPSBOVUxMKQorCURpc3Bvc2VFdmVudEhhbmRsZXJVUFAobW91c2VXaGVlbEhhbmRsZXJVUFApOworI2VuZGlmCisKKyAgICAvKiBFeGl0IHRvIHNoZWxsPyAqLworICAgIGV4aXQocmMpOworfQorCisvKgorICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X3dpbnBvcyhpbnQgKngsIGludCAqeSkKK3sKKyAgICAvKiBUT0RPICovCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBSZWN0CWJvdW5kczsKKyAgICBPU1N0YXR1cwlzdGF0dXM7CisKKyAgICAvKiBDYXJib24gPj0gMS4wLjIsIE1hY09TID49IDguNSAqLworICAgIHN0YXR1cyA9IEdldFdpbmRvd0JvdW5kcyAoZ3VpLlZpbVdpbmRvdywga1dpbmRvd1N0cnVjdHVyZVJnbiwgJmJvdW5kcyk7CisKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQorCXJldHVybiBGQUlMOworICAgICp4ID0gYm91bmRzLmxlZnQ7CisgICAgKnkgPSBib3VuZHMudG9wOworICAgIHJldHVybiBPSzsKKyNlbmRpZgorICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuCisgKiBjb29yZGluYXRlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCit7CisgICAgLyogVE9ETzogIFNob3VsZCBtYWtlIHN1cmUgdGhlIHdpbmRvdyBpcyBtb3ZlIHdpdGhpbiByYW5nZQorICAgICAqCSAgICAgIGUuZy46IHkgPiB+MTYgW01lbnUgYmFyXSwgeCA+IDAsIHggPCBzY3JlZW4gd2lkdGgKKyAgICAgKi8KKyAgICBNb3ZlV2luZG93KGd1aS5WaW1XaW5kb3csIHgsIHksIFRSVUUpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2hlbGxzaXplKAorICAgIGludAkJd2lkdGgsCisgICAgaW50CQloZWlnaHQsCisgICAgaW50CQltaW5fd2lkdGgsCisgICAgaW50CQltaW5faGVpZ2h0LAorICAgIGludAkJYmFzZV93aWR0aCwKKyAgICBpbnQJCWJhc2VfaGVpZ2h0KQoreworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgQ0dyYWZQdHIJVmltUG9ydDsKKyAgICBSZWN0CVZpbUJvdW5kOworI2VuZGlmCisKKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKKyAgICB7CisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKwlWaW1Qb3J0ID0gR2V0V2luZG93UG9ydCAoIGd1aS5WaW1XaW5kb3cgKTsKKwlHZXRQb3J0Qm91bmRzIChWaW1Qb3J0LCAmVmltQm91bmQpOworCVZpbUJvdW5kLmxlZnQgPSAtZ3VpLnNjcm9sbGJhcl93aWR0aDsgLyogKyAxOyovCisJU2V0UG9ydEJvdW5kcyAoVmltUG9ydCwgJlZpbUJvdW5kKTsKKyAgICAvKglHZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZ3aW5Qb3J0UmVjdCk7ID8/Ki8KKyNlbHNlCisJZ3VpLlZpbVdpbmRvdy0+cG9ydFJlY3QubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoOyAvKiArIDE7Ki8KKyAgICAvKglTZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZ3aW5Qb3J0UmVjdCk7ID8/Ki8KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFVTRV9DQVJCT05JWkVECisJVmltUG9ydCA9IEdldFdpbmRvd1BvcnQgKCBndWkuVmltV2luZG93ICk7CisJR2V0UG9ydEJvdW5kcyAoVmltUG9ydCwgJlZpbUJvdW5kKTsKKwlWaW1Cb3VuZC5sZWZ0ID0gMDsKKwlTZXRQb3J0Qm91bmRzIChWaW1Qb3J0LCAmVmltQm91bmQpOworI2Vsc2UKKwlndWkuVmltV2luZG93LT5wb3J0UmVjdC5sZWZ0ID0gMDsKKyNlbmRpZjsKKyAgICB9CisKKyAgICBTaXplV2luZG93KGd1aS5WaW1XaW5kb3csIHdpZHRoLCBoZWlnaHQsIFRSVUUpOworCisgICAgZ3VpX3Jlc2l6ZV9zaGVsbCh3aWR0aCwgaGVpZ2h0KTsKK30KKworLyoKKyAqIEdldCB0aGUgc2NyZWVuIGRpbWVuc2lvbnMuCisgKiBBbGxvdyAxMCBwaXhlbHMgZm9yIGhvcml6b250YWwgYm9yZGVycywgNDAgZm9yIHZlcnRpY2FsIGJvcmRlcnMuCisgKiBJcyB0aGVyZSBubyB3YXkgdG8gZmluZCBvdXQgaG93IHdpZGUgdGhlIGJvcmRlcnMgcmVhbGx5IGFyZT8KKyAqIFRPRE86IEFkZCBsaXZlIHVkYXRlIG9mIHRob3NlIHZhbHVlIG9uIHN1c3BlbmQvcmVzdW1lLgorICovCisgICAgdm9pZAorZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMoc2NyZWVuX3csIHNjcmVlbl9oKQorICAgIGludAkJKnNjcmVlbl93OworICAgIGludAkJKnNjcmVlbl9oOworeworICAgIEdESGFuZGxlCWRvbWluYW50RGV2aWNlID0gR2V0TWFpbkRldmljZSgpOworICAgIFJlY3QJc2NyZWVuUmVjdCA9ICgqKmRvbWluYW50RGV2aWNlKS5nZFJlY3Q7CisKKyAgICAqc2NyZWVuX3cgPSBzY3JlZW5SZWN0LnJpZ2h0IC0gMTA7CisgICAgKnNjcmVlbl9oID0gc2NyZWVuUmVjdC5ib3R0b20gLSA0MDsKK30KKworCisKKy8qCisgKiBJbml0aWFsaXNlIHZpbSB0byB1c2UgdGhlIGZvbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4JUmV0dXJuIEZBSUwgaWYgdGhlIGZvbnQKKyAqIGNvdWxkIG5vdCBiZSBsb2FkZWQsIE9LIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZ3VpX21jaF9pbml0X2ZvbnQoZm9udF9uYW1lLCBmb250c2V0KQorICAgIGNoYXJfdQkqZm9udF9uYW1lOworICAgIGludAkJZm9udHNldDsJICAgIC8qIG5vdCB1c2VkICovCit7CisgICAgLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIGJvbGQgaXRhbGljIHVuZGVybGluZSBwcm9wb3J0aW9uYWwgZXRjLi4uICovCisgICAgU3RyMjU1CXN1Z2dlc3RlZEZvbnQgPSAiXHBNb25hY28iOworICAgIGludAkJc3VnZ2VzdGVkU2l6ZSA9IDk7CisgICAgRm9udEluZm8JZm9udF9pbmZvOworICAgIHNob3J0CWZvbnRfaWQ7CisgICAgR3VpRm9udAlmb250OworCisgICAgaWYgKGZvbnRfbmFtZSA9PSBOVUxMKQorICAgIHsKKwkvKiBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgZm9udCAqLworCUdldEZOdW0oc3VnZ2VzdGVkRm9udCwgJmZvbnRfaWQpOworCisJaWYgKGZvbnRfaWQgPT0gMCkKKwl7CisJICAgIC8qIFRoZW4gcGlja3VwIHRoZSBzdGFuZGFyZCBhcHBsaWNhdGlvbiBmb250ICovCisJICAgIGZvbnRfaWQgPSBHZXRBcHBGb250KCk7CisJfQorCWZvbnQgPSAoc3VnZ2VzdGVkU2l6ZSA8PCAxNikgKyAoKGxvbmcpIGZvbnRfaWQgJiAweEZGRkYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWZvbnQgPSBndWlfbWFjX2ZpbmRfZm9udCAoZm9udF9uYW1lKTsKKworCWlmIChmb250ID09IE5PRk9OVCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGd1aS5ub3JtX2ZvbnQgPSBmb250OworCisgICAgVGV4dFNpemUgKGZvbnQgPj4gMTYpOworICAgIFRleHRGb250IChmb250ICYgMHhGRkZGKTsKKworICAgIEdldEZvbnRJbmZvICgmZm9udF9pbmZvKTsKKworICAgIGd1aS5jaGFyX2FzY2VudCA9IGZvbnRfaW5mby5hc2NlbnQ7CisgICAgZ3VpLmNoYXJfd2lkdGggID0gQ2hhcldpZHRoICgnXycpOworICAgIGd1aS5jaGFyX2hlaWdodCA9IGZvbnRfaW5mby5hc2NlbnQgKyBmb250X2luZm8uZGVzY2VudCArIHBfbGluZXNwYWNlOworCisgICAgcmV0dXJuIE9LOworCit9CisKKyAgICBpbnQKK2d1aV9tY2hfYWRqdXN0X2NoYXJzaXplKCkKK3sKKyAgICBGb250SW5mbyAgICBmb250X2luZm87CisKKyAgICBHZXRGb250SW5mbyAoJmZvbnRfaW5mbyk7CisgICAgZ3VpLmNoYXJfaGVpZ2h0ID0gZm9udF9pbmZvLmFzY2VudCArIGZvbnRfaW5mby5kZXNjZW50ICsgcF9saW5lc3BhY2U7CisgICAgZ3VpLmNoYXJfYXNjZW50ID0gZm9udF9pbmZvLmFzY2VudCArIHBfbGluZXNwYWNlIC8gMjsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBHZXQgYSBmb250IHN0cnVjdHVyZSBmb3IgaGlnaGxpZ2h0aW5nLgorICovCisgICAgR3VpRm9udAorZ3VpX21jaF9nZXRfZm9udChuYW1lLCBnaXZlRXJyb3JJZk1pc3NpbmcpCisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJZ2l2ZUVycm9ySWZNaXNzaW5nOworeworICAgIEd1aUZvbnQgZm9udDsKKworICAgIGZvbnQgPSBndWlfbWFjX2ZpbmRfZm9udChuYW1lKTsKKworICAgIGlmIChmb250ID09IE5PRk9OVCkKKyAgICB7CisJaWYgKGdpdmVFcnJvcklmTWlzc2luZykKKwkgICAgRU1TRzIoXyhlX2ZvbnQpLCBuYW1lKTsKKwlyZXR1cm4gTk9GT05UOworICAgIH0KKyAgICAvKgorICAgICAqIFRPRE8gOiBBY2NlcHQgb25seSBtb25vc3BhY2UKKyAgICAgKi8KKworICAgIHJldHVybiBmb250OworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZvbnQoZm9udCkKKyAgICBHdWlGb250CWZvbnQ7Cit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBtYXliZSBhdm9pZCBzZXQgYWdhaW4gdGhlIGN1cnJlbnQgZm9udC4KKyAgICAgKi8KKyAgICBUZXh0U2l6ZShmb250ID4+IDE2KTsKKyAgICBUZXh0Rm9udChmb250ICYgMHhGRkZGKTsKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgdHdvIGZvbnRzIGdpdmVuIGFyZSBlcXVpdmFsZW50LgorICovCisgICAgaW50CitndWlfbWNoX3NhbWVfZm9udChmMSwgZjIpCisgICAgR3VpRm9udAlmMTsKKyAgICBHdWlGb250CWYyOworeworICAgIHJldHVybiBmMSA9PSBmMjsKK30KKyNlbmRpZgorCisvKgorICogSWYgYSBmb250IGlzIG5vdCBnb2luZyB0byBiZSB1c2VkLCBmcmVlIGl0cyBzdHJ1Y3R1cmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ZyZWVfZm9udChmb250KQorICAgIEd1aUZvbnQJZm9udDsKK3sKKyAgICAvKgorICAgICAqIEZyZWUgZm9udCB3aGVuICJmb250IiBpcyBub3QgMC4KKyAgICAgKiBOb3RoaW5nIHRvIGRvIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBzaW5jZQorICAgICAqIG5vdGhpbmcgaXMgYWxsb2NhdGVkIGZvciBlYWNoIGZvbnQgdXNlZC4KKyAgICAgKi8KK30KKworICAgIHN0YXRpYyBpbnQKK2hleF9kaWdpdChjKQorICAgIGludAkJYzsKK3sKKyAgICBpZiAoaXNkaWdpdChjKSkKKwlyZXR1cm4gYyAtICcwJzsKKyAgICBjID0gVE9MT1dFUl9BU0MoYyk7CisgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCXJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIC0xMDAwOworfQorCisvKgorICogUmV0dXJuIHRoZSBQaXhlbCB2YWx1ZSAoY29sb3IpIGZvciB0aGUgZ2l2ZW4gY29sb3IgbmFtZS4gIFRoaXMgcm91dGluZSB3YXMKKyAqIHByZXR0eSBtdWNoIHRha2VuIGZyb20gZXhhbXBsZSBjb2RlIGluIHRoZSBTaWxpY29uIEdyYXBoaWNzIE9TRi9Nb3RpZgorICogUHJvZ3JhbW1lcidzIEd1aWRlLgorICogUmV0dXJuIElOVkFMQ09MT1Igd2hlbiBmYWlsZWQuCisgKi8KKyAgICBndWljb2xvcl9UCitndWlfbWNoX2dldF9jb2xvcihuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyAgICAvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyBuYW1lZCBjb2xvciBvZiBNYWNPUyA4CisgICAgICovCisgICAgUkdCQ29sb3IJTWFjQ29sb3I7CisvLyAgICBndWljb2xvcl9UCWNvbG9yID0gMDsKKworICAgIHR5cGVkZWYgc3RydWN0IGd1aWNvbG9yX3RUYWJsZQorICAgIHsKKwljaGFyCSAgICAqbmFtZTsKKwlndWljb2xvcl9UICBjb2xvcjsKKyAgICB9IGd1aWNvbG9yX3RUYWJsZTsKKworICAgIC8qCisgICAgICogVGhlIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiBlYWNoIGxpbmUgaXMgdGhlIHNvdXJjZQorICAgICAqIChNYWMsIFdpbmRvdywgVW5peCkgYW5kIHRoZSBudW1iZXIgaXMgdGhlIHVuaXggcmdiLnR4dCB2YWx1ZQorICAgICAqLworICAgIHN0YXRpYyBndWljb2xvcl90VGFibGUgdGFibGVbXSA9CisgICAgeworCXsiQmxhY2siLAlSR0IoMHgwMCwgMHgwMCwgMHgwMCl9LAorCXsiZGFya2dyYXkiLAlSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LCAvKlcqLworCXsiZGFya2dyZXkiLAlSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LCAvKlcqLworCXsiR3JheSIsCVJHQigweEMwLCAweEMwLCAweEMwKX0sIC8qVyovCisJeyJHcmV5IiwJUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwgLypXKi8KKwl7ImxpZ2h0Z3JheSIsCVJHQigweEUwLCAweEUwLCAweEUwKX0sIC8qVyovCisJeyJsaWdodGdyZXkiLAlSR0IoMHhFMCwgMHhFMCwgMHhFMCl9LCAvKlcqLworCXsid2hpdGUiLAlSR0IoMHhGRiwgMHhGRiwgMHhGRil9LAorCXsiZGFya3JlZCIsCVJHQigweDgwLCAweDAwLCAweDAwKX0sIC8qVyovCisJeyJyZWQiLAkJUkdCKDB4REQsIDB4MDgsIDB4MDYpfSwgLypNKi8KKwl7ImxpZ2h0cmVkIiwJUkdCKDB4RkYsIDB4QTAsIDB4QTApfSwgLypXKi8KKwl7IkRhcmtCbHVlIiwJUkdCKDB4MDAsIDB4MDAsIDB4ODApfSwgLypXKi8KKwl7IkJsdWUiLAlSR0IoMHgwMCwgMHgwMCwgMHhENCl9LCAvKk0qLworCXsibGlnaHRibHVlIiwJUkdCKDB4QTAsIDB4QTAsIDB4RkYpfSwgLypXKi8KKwl7IkRhcmtHcmVlbiIsCVJHQigweDAwLCAweDgwLCAweDAwKX0sIC8qVyovCisJeyJHcmVlbiIsCVJHQigweDAwLCAweDY0LCAweDExKX0sIC8qTSovCisJeyJsaWdodGdyZWVuIiwJUkdCKDB4QTAsIDB4RkYsIDB4QTApfSwgLypXKi8KKwl7IkRhcmtDeWFuIiwJUkdCKDB4MDAsIDB4ODAsIDB4ODApfSwgLypXID8weDMwN0Q3RSAqLworCXsiY3lhbiIsCVJHQigweDAyLCAweEFCLCAweEVBKX0sIC8qTSovCisJeyJsaWdodGN5YW4iLAlSR0IoMHhBMCwgMHhGRiwgMHhGRil9LCAvKlcqLworCXsiZGFya21hZ2VudGEiLAlSR0IoMHg4MCwgMHgwMCwgMHg4MCl9LCAvKlcqLworCXsibWFnZW50YSIsCVJHQigweEYyLCAweDA4LCAweDg0KX0sIC8qTSovCisJeyJsaWdodG1hZ2VudGEiLFJHQigweEYwLCAweEEwLCAweEYwKX0sIC8qVyovCisJeyJicm93biIsCVJHQigweDgwLCAweDQwLCAweDQwKX0sIC8qVyovCisJeyJ5ZWxsb3ciLAlSR0IoMHhGQywgMHhGMywgMHgwNSl9LCAvKk0qLworCXsibGlnaHR5ZWxsb3ciLAlSR0IoMHhGRiwgMHhGRiwgMHhBMCl9LCAvKk0qLworCXsiU2VhR3JlZW4iLAlSR0IoMHgyRSwgMHg4QiwgMHg1Nyl9LCAvKlcgMHg0RTg5NzUgKi8KKwl7Im9yYW5nZSIsCVJHQigweEZDLCAweDgwLCAweDAwKX0sIC8qVyAweEY4N0ExNyAqLworCXsiUHVycGxlIiwJUkdCKDB4QTAsIDB4MjAsIDB4RjApfSwgLypXIDB4OGUzNWU1ICovCisJeyJTbGF0ZUJsdWUiLAlSR0IoMHg2QSwgMHg1QSwgMHhDRCl9LCAvKlcgMHg3MzdDQTEgKi8KKwl7IlZpb2xldCIsCVJHQigweDhELCAweDM4LCAweEM5KX0sIC8qVSovCisgICAgfTsKKworICAgIGludAkJciwgZywgYjsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAobmFtZVswXSA9PSAnIycgJiYgc3RybGVuKChjaGFyICopIG5hbWUpID09IDcpCisgICAgeworCS8qIE5hbWUgaXMgaW4gIiNycmdnYmIiIGZvcm1hdCAqLworCXIgPSBoZXhfZGlnaXQobmFtZVsxXSkgKiAxNiArIGhleF9kaWdpdChuYW1lWzJdKTsKKwlnID0gaGV4X2RpZ2l0KG5hbWVbM10pICogMTYgKyBoZXhfZGlnaXQobmFtZVs0XSk7CisJYiA9IGhleF9kaWdpdChuYW1lWzVdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNl0pOworCWlmIChyIDwgMCB8fCBnIDwgMCB8fCBiIDwgMCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisJcmV0dXJuIFJHQihyLCBnLCBiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoU1RSSUNNUCAobmFtZSwgImhpbGl0ZSIpID09IDApCisJeworCSAgICBMTUdldEhpbGl0ZVJHQiAoJk1hY0NvbG9yKTsKKwkgICAgcmV0dXJuIChSR0IgKE1hY0NvbG9yLnJlZCA+PiA4LCBNYWNDb2xvci5ncmVlbiA+PiA4LCBNYWNDb2xvci5ibHVlID4+IDgpKTsKKwl9CisJLyogQ2hlY2sgaWYgdGhlIG5hbWUgaXMgb25lIG9mIHRoZSBjb2xvcnMgd2Uga25vdyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGFibGUpIC8gc2l6ZW9mKHRhYmxlWzBdKTsgaSsrKQorCSAgICBpZiAoU1RSSUNNUChuYW1lLCB0YWJsZVtpXS5uYW1lKSA9PSAwKQorCQlyZXR1cm4gdGFibGVbaV0uY29sb3I7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIExhc3QgYXR0ZW1wdC4gTG9vayBpbiB0aGUgZmlsZSAiJFZJTS9yZ2IudHh0Ii4KKyAgICAgKi8KKyAgICB7CisjZGVmaW5lIExJTkVfTEVOIDEwMAorCUZJTEUJKmZkOworCWNoYXIJbGluZVtMSU5FX0xFTl07CisJY2hhcl91CSpmbmFtZTsKKworI2lmZGVmIENPTE9OX0FTX1BBVEhTRVAKKwlmbmFtZSA9IGV4cGFuZF9lbnZfc2F2ZSgoY2hhcl91ICopIiRWSU1SVU5USU1FOnJnYi50eHQiKTsKKyNlbHNlCisJZm5hbWUgPSBleHBhbmRfZW52X3NhdmUoKGNoYXJfdSAqKSIkVklNUlVOVElNRS9yZ2IudHh0Iik7CisjZW5kaWYKKwlpZiAoZm5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisKKwlmZCA9IGZvcGVuKChjaGFyICopZm5hbWUsICJydCIpOworCXZpbV9mcmVlKGZuYW1lKTsKKwlpZiAoZmQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisKKwl3aGlsZSAoIWZlb2YoZmQpKQorCXsKKwkgICAgaW50CQlsZW47CisJICAgIGludAkJcG9zOworCSAgICBjaGFyCSpjb2xvcjsKKworCSAgICBmZ2V0cyhsaW5lLCBMSU5FX0xFTiwgZmQpOworCSAgICBsZW4gPSBzdHJsZW4obGluZSk7CisKKwkgICAgaWYgKGxlbiA8PSAxIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCWNvbnRpbnVlOworCisJICAgIGxpbmVbbGVuLTFdID0gJ1wwJzsKKworCSAgICBpID0gc3NjYW5mKGxpbmUsICIlZCAlZCAlZCAlbiIsICZyLCAmZywgJmIsICZwb3MpOworCSAgICBpZiAoaSAhPSAzKQorCQljb250aW51ZTsKKworCSAgICBjb2xvciA9IGxpbmUgKyBwb3M7CisKKwkgICAgaWYgKFNUUklDTVAoY29sb3IsIG5hbWUpID09IDApCisJICAgIHsKKwkJZmNsb3NlKGZkKTsKKwkJcmV0dXJuIChndWljb2xvcl9UKSBSR0IociwgZywgYik7CisJICAgIH0KKwl9CisJZmNsb3NlKGZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxDT0xPUjsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvcmVncm91bmQgY29sb3IuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcikKKyAgICBndWljb2xvcl9UCWNvbG9yOworeworICAgIFJHQkNvbG9yIFRoZUNvbG9yOworCisgICAgVGhlQ29sb3IucmVkID0gUmVkKGNvbG9yKSAqIDB4MDEwMTsKKyAgICBUaGVDb2xvci5ncmVlbiA9IEdyZWVuKGNvbG9yKSAqIDB4MDEwMTsKKyAgICBUaGVDb2xvci5ibHVlID0gQmx1ZShjb2xvcikgKiAweDAxMDE7CisKKyAgICBSR0JGb3JlQ29sb3IgKCZUaGVDb2xvcik7Cit9CisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfYmdfY29sb3IoY29sb3IpCisgICAgZ3VpY29sb3JfVAljb2xvcjsKK3sKKyAgICBSR0JDb2xvciBUaGVDb2xvcjsKKworICAgIFRoZUNvbG9yLnJlZCA9IFJlZChjb2xvcikgKiAweDAxMDE7CisgICAgVGhlQ29sb3IuZ3JlZW4gPSBHcmVlbihjb2xvcikgKiAweDAxMDE7CisgICAgVGhlQ29sb3IuYmx1ZSA9IEJsdWUoY29sb3IpICogMHgwMTAxOworCisgICAgUkdCQmFja0NvbG9yICgmVGhlQ29sb3IpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3N0cmluZyhyb3csIGNvbCwgcywgbGVuLCBmbGFncykKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWNvbDsKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmbGFnczsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKE1BQ09TX1gpCisgICAgU0ludDMyCXN5c192ZXJzaW9uOworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdQkqdG9mcmVlID0gTlVMTDsKKworICAgIGlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKyAgICB7CisJdG9mcmVlID0gc3RyaW5nX2NvbnZlcnQoJm91dHB1dF9jb252LCBzLCAmbGVuKTsKKwlpZiAodG9mcmVlICE9IE5VTEwpCisJICAgIHMgPSB0b2ZyZWU7CisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKE1BQ09TX1gpCisgICAgLyoKKyAgICAgKiBPbiBPUyBYLCB0cnkgdXNpbmcgUXVhcnR6LXN0eWxlIHRleHQgYW50aWFsaWFzaW5nLgorICAgICAqLworICAgIHN5c192ZXJzaW9uID0gMDsKKworICAgIEdlc3RhbHQoZ2VzdGFsdFN5c3RlbVZlcnNpb24sICZzeXNfdmVyc2lvbik7CisgICAgaWYgKHN5c192ZXJzaW9uID49IDB4MTAyMCkKKyAgICB7CisJLyogUXVhcnR6IGFudGlhbGlhc2luZyBpcyBhdmFpbGFibGUgb25seSBpbiBPUyAxMC4yIGFuZCBsYXRlci4gKi8KKwlVSW50MzIgcWRfZmxhZ3MgPSAocF9hbnRpYWxpYXMgPworCQkJICAgICBrUURVc2VDR1RleHRSZW5kZXJpbmcgfCBrUURVc2VDR1RleHRNZXRyaWNzIDogMCk7CisJKHZvaWQpU3dhcFFEVGV4dEZsYWdzKHFkX2ZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAoc3lzX3ZlcnNpb24gPj0gMHgxMDIwICYmIHBfYW50aWFsaWFzKQorICAgIHsKKwlTdHlsZVBhcmFtZXRlciBmYWNlOworCisJZmFjZSA9IG5vcm1hbDsKKwlpZiAoZmxhZ3MgJiBEUkFXX0JPTEQpCisJICAgIGZhY2UgfD0gYm9sZDsKKwlpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkKKwkgICAgZmFjZSB8PSB1bmRlcmxpbmU7CisJVGV4dEZhY2UoZmFjZSk7CisKKwkvKiBRdWFydHogYW50aWFsaWFzaW5nIHdvcmtzIG9ubHkgaW4gc3JjT3IgdHJhbnNmZXIgbW9kZS4gKi8KKwlUZXh0TW9kZShzcmNPcik7CisKKwlpZiAoIShmbGFncyAmIERSQVdfVFJBTlNQKSkKKwl7CisJICAgIC8qCisJICAgICAqIFNpbmNlIHdlJ3JlIHVzaW5nIHNyY09yIG1vZGUsIHdlIGhhdmUgdG8gY2xlYXIgdGhlIGJsb2NrCisJICAgICAqIGJlZm9yZSBkcmF3aW5nIHRoZSB0ZXh0LiAgVGhlIGZvbGxvd2luZyBpcyBsaWtlIGNhbGxpbmcKKwkgICAgICogZ3VpX21jaF9jbGVhcl9ibG9jayhyb3csIGNvbCwgcm93LCBjb2wgKyBsZW4gLSAxKSwKKwkgICAgICogYnV0IHdpdGhvdXQgc2V0dGluZyB0aGUgYmcgY29sb3IgdG8gZ3VpLmJhY2tfcGl4ZWwuCisJICAgICAqLworCSAgICBSZWN0IHJjOworCSAgICByYy5sZWZ0ID0gRklMTF9YKGNvbCk7CisJICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOworCSAgICByYy5yaWdodCA9IEZJTExfWChjb2wgKyBsZW4pICsgKGNvbCArIGxlbiA9PSBDb2x1bW5zKTsKKwkgICAgcmMuYm90dG9tID0gRklMTF9ZKHJvdyArIDEpOworCSAgICBFcmFzZVJlY3QoJnJjKTsKKwl9CisKKwlNb3ZlVG8oVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpKTsKKwlEcmF3VGV4dCgoY2hhciopcywgMCwgbGVuKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qIFVzZSBvbGQtc3R5bGUsIG5vbi1hbnRpYWxpYXNlZCBRdWlja0RyYXcgdGV4dCByZW5kZXJpbmcuICovCisJVGV4dE1vZGUgKHNyY0NvcHkpOworCVRleHRGYWNlIChub3JtYWwpOworCisgICAgLyogIFNlbGVjdEZvbnQoaGRjLCBndWkuY3VyckZvbnQpOyAqLworCisJaWYgKGZsYWdzICYgRFJBV19UUkFOU1ApCisJeworCSAgICBUZXh0TW9kZSAoc3JjT3IpOworCX0KKworCU1vdmVUbyAoVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpKTsKKwlEcmF3VGV4dCAoKGNoYXIgKilzLCAwLCBsZW4pOworCisKKwlpZiAoZmxhZ3MgJiBEUkFXX0JPTEQpCisJeworCSAgICBUZXh0TW9kZSAoc3JjT3IpOworCSAgICBNb3ZlVG8gKFRFWFRfWChjb2wpICsgMSwgVEVYVF9ZKHJvdykpOworCSAgICBEcmF3VGV4dCAoKGNoYXIgKilzLCAwLCBsZW4pOworCX0KKworCWlmIChmbGFncyAmIERSQVdfVU5ERVJMKQorCXsKKwkgICAgTW92ZVRvIChGSUxMX1goY29sKSwgRklMTF9ZKHJvdyArIDEpIC0gMSk7CisJICAgIExpbmVUbyAoRklMTF9YKGNvbCArIGxlbikgLSAxLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbV9mcmVlKHRvZnJlZSk7CisjZW5kaWYKK30KKworLyoKKyAqIFJldHVybiBPSyBpZiB0aGUga2V5IHdpdGggdGhlIHRlcm1jYXAgbmFtZSAibmFtZSIgaXMgc3VwcG9ydGVkLgorICovCisgICAgaW50CitndWlfbWNoX2hhc2tleShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX2tleXNbaV0ua2V5X3N5bSAhPSAoS2V5U3ltKTA7IGkrKykKKwlpZiAobmFtZVswXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwICYmCisJCQkJCSBuYW1lWzFdID09IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEpCisJICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfYmVlcCgpCit7CisgICAgU3lzQmVlcCAoMSk7IC8qIFNob3VsZCB0aGlzIGJlIDA/ICg/Pz8/KSAqLworfQorCisgICAgdm9pZAorZ3VpX21jaF9mbGFzaChtc2VjKQorICAgIGludAkgICAgbXNlYzsKK3sKKyAgICAvKiBEbyBhIHZpc3VhbCBiZWVwIGJ5IHJldmVyc2luZyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgKi8KKyAgICBSZWN0ICAgIHJjOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBJbnZlcnRSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCisgICAgICovCisgICAgcmMubGVmdCA9IDA7CisgICAgcmMudG9wID0gMDsKKyAgICByYy5yaWdodCA9IGd1aS5udW1fY29scyAqIGd1aS5jaGFyX3dpZHRoOworICAgIHJjLmJvdHRvbSA9IGd1aS5udW1fcm93cyAqIGd1aS5jaGFyX2hlaWdodDsKKyAgICBJbnZlcnRSZWN0KCZyYyk7CisKKyAgICB1aV9kZWxheSgobG9uZyltc2VjLCBUUlVFKTsJCS8qIHdhaXQgZm9yIHNvbWUgbXNlYyAqLworCisgICAgSW52ZXJ0UmVjdCgmcmMpOworfQorCisvKgorICogSW52ZXJ0IGEgcmVjdGFuZ2xlIGZyb20gcm93IHIsIGNvbHVtbiBjLCBmb3IgbnIgcm93cyBhbmQgbmMgY29sdW1ucy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZShyLCBjLCBuciwgbmMpCisgICAgaW50CQlyOworICAgIGludAkJYzsKKyAgICBpbnQJCW5yOworICAgIGludAkJbmM7Cit7CisgICAgUmVjdAlyYzsKKworICAgIC8qCisgICAgICogTm90ZTogSW52ZXJ0UmVjdCgpIGV4Y2x1ZGVzIHJpZ2h0IGFuZCBib3R0b20gb2YgcmVjdGFuZ2xlLgorICAgICAqLworICAgIHJjLmxlZnQgPSBGSUxMX1goYyk7CisgICAgcmMudG9wID0gRklMTF9ZKHIpOworICAgIHJjLnJpZ2h0ID0gcmMubGVmdCArIG5jICogZ3VpLmNoYXJfd2lkdGg7CisgICAgcmMuYm90dG9tID0gcmMudG9wICsgbnIgKiBndWkuY2hhcl9oZWlnaHQ7CisgICAgSW52ZXJ0UmVjdCgmcmMpOworCit9CisKKy8qCisgKiBJY29uaWZ5IHRoZSBHVUkgd2luZG93LgorICovCisgICAgdm9pZAorZ3VpX21jaF9pY29uaWZ5KCkKK3sKKyAgICAvKiBUT0RPOiBmaW5kIG91dCB3aGF0IGNvdWxkIHJlcGxhY2UgaWNvbmlmeQorICAgICAqCSAgICAgLXdpbmRvdyBzaGFkZT8KKyAgICAgKgkgICAgIC1oaWRlIGFwcGxpY2F0aW9uPworICAgICAqLworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQnJpbmcgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCkKK3sKKyAgICAvKiBUT0RPICovCit9CisjZW5kaWYKKworLyoKKyAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGNvbG9yKQorICAgIGd1aWNvbG9yX1QJY29sb3I7Cit7CisgICAgUmVjdCByYzsKKworICAgIGd1aV9tY2hfc2V0X2ZnX2NvbG9yKGNvbG9yKTsKKworICAgIC8qCisgICAgICogTm90ZTogRnJhbWVSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCisgICAgICovCisgICAgcmMubGVmdCA9IEZJTExfWChndWkuY29sKTsKKyAgICByYy50b3AgPSBGSUxMX1koZ3VpLnJvdyk7CisgICAgcmMucmlnaHQgPSByYy5sZWZ0ICsgZ3VpLmNoYXJfd2lkdGg7CisgICAgcmMuYm90dG9tID0gcmMudG9wICsgZ3VpLmNoYXJfaGVpZ2h0OworCisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworCisgICAgRnJhbWVSZWN0ICgmcmMpOworfQorCisvKgorICogRHJhdyBwYXJ0IG9mIGEgY3Vyc29yLCBvbmx5IHcgcGl4ZWxzIHdpZGUsIGFuZCBoIHBpeGVscyBoaWdoLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKHcsIGgsIGNvbG9yKQorICAgIGludAkJdzsKKyAgICBpbnQJCWg7CisgICAgZ3VpY29sb3JfVAljb2xvcjsKK3sKKyAgICBSZWN0IHJjOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICAvKiB2ZXJ0aWNhbCBsaW5lIHNob3VsZCBiZSBvbiB0aGUgcmlnaHQgb2YgY3VycmVudCBwb2ludCAqLworICAgIGlmIChDVVJTT1JfQkFSX1JJR0hUKQorCXJjLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCArIDEpIC0gdzsKKyAgICBlbHNlCisjZW5kaWYKKwlyYy5sZWZ0ID0gRklMTF9YKGd1aS5jb2wpOworICAgIHJjLnRvcCA9IEZJTExfWShndWkucm93KSArIGd1aS5jaGFyX2hlaWdodCAtIGg7CisgICAgcmMucmlnaHQgPSByYy5sZWZ0ICsgdzsKKyAgICByYy5ib3R0b20gPSByYy50b3AgKyBoOworCisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworCisgICAgUGFpbnRSZWN0ICgmcmMpOworfQorCisKKworLyoKKyAqIENhdGNoIHVwIHdpdGggYW55IHF1ZXVlZCBYIGV2ZW50cy4gIFRoaXMgbWF5IHB1dCBrZXlib2FyZCBpbnB1dCBpbnRvIHRoZQorICogaW5wdXQgYnVmZmVyLCBjYWxsIHJlc2l6ZSBjYWxsLWJhY2tzLCB0cmlnZ2VyIHRpbWVycyBldGMuICBJZiB0aGVyZSBpcworICogbm90aGluZyBpbiB0aGUgWCBldmVudCBxdWV1ZSAoJiBubyB0aW1lcnMgcGVuZGluZyksIHRoZW4gd2UgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdXBkYXRlKCkKK3sKKyAgICAvKiBUT0RPOiBmaW5kIHdoYXQgdG8gZG8KKyAgICAgKgkgICAgIG1heWJlIGNhbGwgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyAoMCkKKyAgICAgKgkgICAgIG1vcmUgbGlrZSBsb29rIGF0IEV2ZW50UXVldWUgdGhlbgorICAgICAqCSAgICAgY2FsbCBoZWFydCBvZiBndWlfbWNoX3dhaXRfZm9yX2NoYXJzOworICAgICAqCisgICAgICoJaWYgKGV2ZW50dGhlcikKKyAgICAgKgkgICAgZ3VpX21hY19oYW5kbGVfZXZlbnQoJmV2ZW50KTsKKyAgICAgKi8KKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKworICAgIGlmIChFdmVudEF2YWlsIChldmVyeUV2ZW50LCAmdGhlRXZlbnQpKQorCWlmICh0aGVFdmVudC53aGF0ICE9IG51bGxFdmVudCkKKwkgICAgZ3VpX21jaF93YWl0X2Zvcl9jaGFycygwKTsKK30KKworLyoKKyAqIFNpbXBsZSB3cmFwcGVyIHRvIG5lZ2xlY3QgbW9yZSBlYXNpbHkgdGhlIHRpbWUKKyAqIHNwZW50IGluc2lkZSBXYWl0TmV4dEV2ZW50IHdoaWxlIHByb2ZpbGluZy4KKyAqLworCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgcHJvZmlsZSByZXNldAorI2VuZGlmCisgICAgcGFzY2FsCisgICAgQm9vbGVhbgorV2FpdE5leHRFdmVudFdycCAoRXZlbnRNYXNrIGV2ZW50TWFzaywgRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBVSW50MzIgc2xlZXAsIFJnbkhhbmRsZSBtb3VzZVJnbikKK3sKKyAgICBpZiAoKChsb25nKSBzbGVlcCkgPCAtMSkKKwlzbGVlcCA9IDMyNzY3OworICAgIHJldHVybiBXYWl0TmV4dEV2ZW50KGV2ZW50TWFzaywgdGhlRXZlbnQsIHNsZWVwLCBtb3VzZVJnbik7Cit9CisKKy8qCisgKiBHVUkgaW5wdXQgcm91dGluZSBjYWxsZWQgYnkgZ3VpX3dhaXRfZm9yX2NoYXJzKCkuICBXYWl0cyBmb3IgYSBjaGFyYWN0ZXIKKyAqIGZyb20gdGhlIGtleWJvYXJkLgorICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCisgKiAgd3RpbWUgPT0gMAkgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICogIHd0aW1lID4gMAkgICAgV2FpdCB3dGltZSBtaWxsaXNlY29uZHMgZm9yIGEgY2hhcmFjdGVyLgorICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKKyAqIG9yIEZBSUwgb3RoZXJ3aXNlLgorICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgcHJvZmlsZSByZXNldAorI2VuZGlmCisgICAgaW50CitndWlfbWNoX3dhaXRfZm9yX2NoYXJzKHd0aW1lKQorICAgIGludAkgICAgd3RpbWU7Cit7CisgICAgRXZlbnRNYXNrCW1hc2sgID0gKGV2ZXJ5RXZlbnQpOworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIGxvbmcJZW50cnlUaWNrOworICAgIGxvbmcJY3VycmVudFRpY2s7CisgICAgbG9uZwlzbGVlcHB5VGljazsKKworICAgIC8qIElmIHdlIGFyZSBwcm92aWRpbmcgbGlmZSBmZWVkYmFjayB3aXRoIHRoZSBzY3JvbGxiYXIsCisgICAgICogd2UgZG9uJ3Qgd2FudCB0byB0cnkgdG8gd2FpdCBmb3IgYW4gZXZlbnQsIG9yIGVsc2UKKyAgICAgKiB0aGVyZSB3b24ndCBiZSBhbnkgbGlmZSBmZWVkYmFjay4KKyAgICAgKi8KKyAgICBpZiAoZHJhZ2dlZF9zYiAhPSBOVUxMKQorCXJldHVybiBGQUlMOworCS8qIFRPRE86IENoZWNrIGlmIEZBSUwgaXMgdGhlIHByb3BlciByZXR1cm4gY29kZSAqLworCisgICAgZW50cnlUaWNrID0gVGlja0NvdW50KCk7CisKKyAgICBhbGxvd19zY3JvbGxiYXIgPSBUUlVFOworCisgICAgZG8KKyAgICB7CisvKglpZiAoZHJhZ1JlY3RDb250cm9sID09IGtDcmVhdGVFbXB0eSkKKwl7CisJICAgIGRyYWdSZ24gPSBOVUxMOworCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrTm90aGluZzsKKwl9CisJZWxzZSovIGlmIChkcmFnUmVjdENvbnRyb2wgPT0ga0NyZWF0ZVJlY3QpCisJeworCSAgICBkcmFnUmduID0gY3Vyc29yUmduOworCSAgICBSZWN0UmduIChkcmFnUmduLCAmZHJhZ1JlY3QpOworCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrTm90aGluZzsKKwl9CisJLyoKKwkgKiBEb24ndCB1c2UgZ3VpX21jaF91cGRhdGUoKSBiZWNhdXNlIHRoZW4gd2Ugd2lsbCBzcGluLWxvY2sgdW50aWwgYQorCSAqIGNoYXIgYXJyaXZlcywgaW5zdGVhZCB3ZSB1c2UgV2FpdE5leHRFdmVudFdycCgpIHRvIGhhbmcgdW50aWwgYW4KKwkgKiBldmVudCBhcnJpdmVzLiAgTm8gbmVlZCB0byBjaGVjayBmb3IgaW5wdXRfYnVmX2Z1bGwgYmVjYXVzZSB3ZSBhcmUKKwkgKiByZXR1cm5pbmcgYXMgc29vbiBhcyBpdCBjb250YWlucyBhIHNpbmdsZSBjaGFyLgorCSAqLworCS8qIFRPRE86IHJlZHVjZSB3dGltZSBhY2NvcmRpbmx5Pz8/ICAqLworCWlmICh3dGltZSA+IC0xKQorCSAgICBzbGVlcHB5VGljayA9IDYwKnd0aW1lLzEwMDA7CisJZWxzZQorCSAgICBzbGVlcHB5VGljayA9IDMyNzY3OworCWlmIChXYWl0TmV4dEV2ZW50V3JwIChtYXNrLCAmZXZlbnQsIHNsZWVwcHlUaWNrLCBkcmFnUmduKSkKKwl7CisjaWZkZWYgVVNFX1NJT1VYCisJICAgIGlmICghU0lPVVhIYW5kbGVPbmVFdmVudCgmZXZlbnQpKQorI2VuZGlmCisJCWd1aV9tYWNfaGFuZGxlX2V2ZW50ICgmZXZlbnQpOworCSAgICBpZiAoaW5wdXRfYXZhaWxhYmxlKCkpCisJICAgIHsKKwkJYWxsb3dfc2Nyb2xsYmFyID0gRkFMU0U7CisJCXJldHVybiBPSzsKKwkgICAgfQorCX0KKwljdXJyZW50VGljayA9IFRpY2tDb3VudCgpOworICAgIH0KKyAgICB3aGlsZSAoKHd0aW1lID09IC0xKSB8fCAoKGN1cnJlbnRUaWNrIC0gZW50cnlUaWNrKSA8IDYwKnd0aW1lLzEwMDApKTsKKworICAgIGFsbG93X3Njcm9sbGJhciA9IEZBTFNFOworICAgIHJldHVybiBGQUlMOworfQorCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLworIyBwcmFnbWEgcHJvZmlsZSByZXNldAorI2VuZGlmCisKKy8qCisgKiBPdXRwdXQgcm91dGluZXMuCisgKi8KKworLyogRmx1c2ggYW55IG91dHB1dCB0byB0aGUgc2NyZWVuICovCisgICAgdm9pZAorZ3VpX21jaF9mbHVzaCgpCit7CisgICAgLyogVE9ETzogSXMgYW55dGhpbmcgbmVlZGVkIGhlcmU/ICovCit9CisKKy8qCisgKiBDbGVhciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aGUgc2NyZWVuIGZyb20gdGV4dCBwb3MgKHJvdzEsIGNvbDEpIHRvCisgKiAocm93MiwgY29sMikgaW5jbHVzaXZlLgorICovCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9ibG9jayhyb3cxLCBjb2wxLCByb3cyLCBjb2wyKQorICAgIGludAkJcm93MTsKKyAgICBpbnQJCWNvbDE7CisgICAgaW50CQlyb3cyOworICAgIGludAkJY29sMjsKK3sKKyAgICBSZWN0IHJjOworCisgICAgLyoKKyAgICAgKiBDbGVhciBvbmUgZXh0cmEgcGl4ZWwgYXQgdGhlIGZhciByaWdodCwgZm9yIHdoZW4gYm9sZCBjaGFyYWN0ZXJzIGhhdmUKKyAgICAgKiBzcGlsbGVkIG92ZXIgdG8gdGhlIG5leHQgY29sdW1uLgorICAgICAqLworICAgIHJjLmxlZnQgPSBGSUxMX1goY29sMSk7CisgICAgcmMudG9wID0gRklMTF9ZKHJvdzEpOworICAgIHJjLnJpZ2h0ID0gRklMTF9YKGNvbDIgKyAxKSArIChjb2wyID09IENvbHVtbnMgLSAxKTsKKyAgICByYy5ib3R0b20gPSBGSUxMX1kocm93MiArIDEpOworCisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworICAgIEVyYXNlUmVjdCAoJnJjKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB3aG9sZSB0ZXh0IHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfY2xlYXJfYWxsKCkKK3sKKyAgICBSZWN0CXJjOworCisgICAgcmMubGVmdCA9IDA7CisgICAgcmMudG9wID0gMDsKKyAgICByYy5yaWdodCA9IENvbHVtbnMgKiBndWkuY2hhcl93aWR0aCArIDIgKiBndWkuYm9yZGVyX3dpZHRoOworICAgIHJjLmJvdHRvbSA9IFJvd3MgKiBndWkuY2hhcl9oZWlnaHQgKyAyICogZ3VpLmJvcmRlcl93aWR0aDsKKworICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKKyAgICBFcmFzZVJlY3QoJnJjKTsKKy8qICBndWlfbWNoX3NldF9mZ19jb2xvcihndWkubm9ybV9waXhlbCk7CisgICAgRnJhbWVSZWN0KCZyYyk7CisqLworfQorCisvKgorICogRGVsZXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgdXAgYW55CisgKiB0ZXh0IGZ1cnRoZXIgZG93biB3aXRoaW4gdGhlIHNjcm9sbCByZWdpb24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RlbGV0ZV9saW5lcyhyb3csIG51bV9saW5lcykKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCW51bV9saW5lczsKK3sKKyAgICBSZWN0CXJjOworCisgICAgLyogY2hhbmdlZCB3aXRob3V0IGNoZWNraW5nISAqLworICAgIHJjLmxlZnQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCk7CisgICAgcmMucmlnaHQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKyAxKTsKKyAgICByYy50b3AgPSBGSUxMX1kocm93KTsKKyAgICByYy5ib3R0b20gPSBGSUxMX1koZ3VpLnNjcm9sbF9yZWdpb25fYm90ICsgMSk7CisKKyAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CisgICAgU2Nyb2xsUmVjdCAoJnJjLCAwLCAtbnVtX2xpbmVzICogZ3VpLmNoYXJfaGVpZ2h0LCAoUmduSGFuZGxlKSBuaWwpOworCisgICAgZ3VpX2NsZWFyX2Jsb2NrKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcyArIDEsCisJCQkJCQkgICAgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwlndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKK30KKworLyoKKyAqIEluc2VydCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzIGJlZm9yZSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgZG93biBhbnkKKyAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW5zZXJ0X2xpbmVzKHJvdywgbnVtX2xpbmVzKQorICAgIGludAkJcm93OworICAgIGludAkJbnVtX2xpbmVzOworeworICAgIFJlY3QgcmM7CisKKyAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworICAgIHJjLnJpZ2h0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ICsgMSk7CisgICAgcmMudG9wID0gRklMTF9ZKHJvdyk7CisgICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOworCisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOworCisgICAgU2Nyb2xsUmVjdCAoJnJjLCAwLCBndWkuY2hhcl9oZWlnaHQgKiBudW1fbGluZXMsIChSZ25IYW5kbGUpIG5pbCk7CisKKyAgICAvKiBVcGRhdGUgZ3VpLmN1cnNvcl9yb3cgaWYgdGhlIGN1cnNvciBzY3JvbGxlZCBvciBjb3BpZWQgb3ZlciAqLworICAgIGlmIChndWkuY3Vyc29yX3JvdyA+PSBndWkucm93CisJICAgICYmIGd1aS5jdXJzb3JfY29sID49IGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKKwkgICAgJiYgZ3VpLmN1cnNvcl9jb2wgPD0gZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpCisgICAgeworCWlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMpCisJICAgIGd1aS5jdXJzb3Jfcm93ICs9IG51bV9saW5lczsKKwllbHNlIGlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QpCisJICAgIGd1aS5jdXJzb3JfaXNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBndWlfY2xlYXJfYmxvY2socm93LCBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAorCQkJCXJvdyArIG51bV9saW5lcyAtIDEsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKK30KKworICAgIC8qCisgICAgICogVE9ETzogYWRkIGEgdmltIGZvcm1hdCB0byB0aGUgY2xpcGJvYXJkIHdoaWNoIHJlbWVtYmVyCisgICAgICoJICAgICBMSU5FV0lTRSwgQ0hBUldJU0UsIEJMT0NLV0lTRQorICAgICAqLworCisgICAgdm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZCAqY2JkOworeworCisgICAgSGFuZGxlCXRleHRPZkNsaXA7CisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBTaXplCXNjcmFwU2l6ZTsKKyAgICBTY3JhcEZsYXZvckZsYWdzCXNjcmFwRmxhZ3M7CisgICAgU2NyYXBSZWYgICAgc2NyYXAgPSBuaWw7CisgICAgT1NTdGF0dXMJZXJyb3I7CisjZWxzZQorICAgIGxvbmcJc2NyYXBPZmZzZXQ7CisgICAgbG9uZwlzY3JhcFNpemU7CisjZW5kaWYKKyAgICBpbnQJCXR5cGU7CisgICAgY2hhcgkqc2VhcmNoQ1I7CisgICAgY2hhcl91CSp0ZW1wY2xpcDsKKworCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBlcnJvciA9IEdldEN1cnJlbnRTY3JhcCAoJnNjcmFwKTsKKyAgICBpZiAoZXJyb3IgIT0gbm9FcnIpCisJcmV0dXJuOworCisgICAgZXJyb3IgPSBHZXRTY3JhcEZsYXZvckZsYWdzKHNjcmFwLCBrU2NyYXBGbGF2b3JUeXBlVGV4dCwgJnNjcmFwRmxhZ3MpOworICAgIGlmIChlcnJvciAhPSBub0VycikKKwlyZXR1cm47CisKKyAgICBlcnJvciA9IEdldFNjcmFwRmxhdm9yU2l6ZSAoc2NyYXAsIGtTY3JhcEZsYXZvclR5cGVUZXh0LCAmc2NyYXBTaXplKTsKKyAgICBpZiAoZXJyb3IgIT0gbm9FcnIpCisJcmV0dXJuOworCisgICAgUmVzZXJ2ZU1lbSAoc2NyYXBTaXplKTsKKyNlbHNlCisgICAgLyogQ2FsbCB0byBMb2FkU2NyYXAgc2VlbSB0byBhdm9pZCBwcm9ibGVtIHdpdGggY3Jhc2ggb24gZmlyc3QgcGFzdGUgKi8KKyAgICBzY3JhcFNpemUgPSBMb2FkU2NyYXAoKTsKKyAgICBzY3JhcFNpemUgPSBHZXRTY3JhcChuaWwsICdURVhUJywgJnNjcmFwT2Zmc2V0KTsKKworICAgIGlmIChzY3JhcFNpemUgPiAwKQorI2VuZGlmCisgICAgeworI2lmZGVmIFVTRV9DQVJCT05JWkVECisJLyogSW4gQ0FSQk9OIHdlIGRvbid0IG5lZWQgYSBIYW5kbGUsIGEgcG9pbnRlciBpcyBnb29kICovCisJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZSAoc2NyYXBTaXplKTsKKwkvKiB0ZW1wY2xpcCA9IGxhbGxvYyhzY3JhcFNpemUrMSwgVFJVRSk7ICovCisjZWxzZQorCXRleHRPZkNsaXAgPSBOZXdIYW5kbGUoMCk7CisjZW5kaWYKKwlITG9jayAodGV4dE9mQ2xpcCk7CisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKwllcnJvciA9IEdldFNjcmFwRmxhdm9yRGF0YSAoc2NyYXAsIGtTY3JhcEZsYXZvclR5cGVUZXh0LCAmc2NyYXBTaXplLCAqdGV4dE9mQ2xpcCk7CisjZWxzZQorCXNjcmFwU2l6ZSA9IEdldFNjcmFwKHRleHRPZkNsaXAsICdURVhUJywgJnNjcmFwT2Zmc2V0KTsKKyNlbmRpZgorCisJdHlwZSA9IChzdHJjaHIoKnRleHRPZkNsaXAsICdccicpICE9IE5VTEwpID8gTUxJTkUgOiBNQ0hBUjsKKworCXRlbXBjbGlwID0gbGFsbG9jKHNjcmFwU2l6ZSsxLCBUUlVFKTsKKwlTVFJOQ1BZKHRlbXBjbGlwLCAqdGV4dE9mQ2xpcCwgc2NyYXBTaXplKTsKKwl0ZW1wY2xpcFtzY3JhcFNpemVdID0gMDsKKworCXNlYXJjaENSID0gKGNoYXIgKil0ZW1wY2xpcDsKKwl3aGlsZSAoc2VhcmNoQ1IgIT0gTlVMTCkKKwl7CisJICAgIHNlYXJjaENSID0gc3RyY2hyKHNlYXJjaENSLCAnXHInKTsKKworCSAgICBpZiAoc2VhcmNoQ1IgIT0gTlVMTCkKKwkJc2VhcmNoQ1JbMF0gPSAnXG4nOworCisJfQorCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgY2hhcl91CSp0bzsKKwkgICAgaW50CQlsID0gc2NyYXBTaXplOworCisJICAgIHRvID0gc3RyaW5nX2NvbnZlcnQoJmlucHV0X2NvbnYsIHRlbXBjbGlwLCAmbCk7CisJICAgIGlmICh0byAhPSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHRlbXBjbGlwKTsKKwkJdGVtcGNsaXAgPSB0bzsKKwkJc2NyYXBTaXplID0gbDsKKwkgICAgfQorCX0KKyNlbmRpZgorCWNsaXBfeWFua19zZWxlY3Rpb24odHlwZSwgdGVtcGNsaXAsIHNjcmFwU2l6ZSwgY2JkKTsKKworCXZpbV9mcmVlKHRlbXBjbGlwKTsKKwlIVW5sb2NrKHRleHRPZkNsaXApOworCisJRGlzcG9zZUhhbmRsZSh0ZXh0T2ZDbGlwKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitjbGlwX21jaF9sb3NlX3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkICpjYmQ7Cit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBSZWFsbHkgbm90aGluZyB0byBkbz8KKyAgICAgKi8KK30KKworICAgIGludAorY2xpcF9tY2hfb3duX3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkICpjYmQ7Cit7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU2VuZCB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZC4KKyAqLworICAgIHZvaWQKK2NsaXBfbWNoX3NldF9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZCAqY2JkOworeworICAgIEhhbmRsZQl0ZXh0T2ZDbGlwOworICAgIGxvbmcJc2NyYXBTaXplOworICAgIGludAkJdHlwZTsKKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIFNjcmFwUmVmICAgIHNjcmFwOworI2VuZGlmCisKKyAgICBjaGFyX3UJKnN0ciA9IE5VTEw7CisKKyAgICBpZiAoIWNiZC0+b3duZWQpCisJcmV0dXJuOworCisgICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CisKKyAgICAvKgorICAgICAqIE9uY2Ugd2Ugc2V0IHRoZSBjbGlwYm9hcmQsIGxvc2Ugb3duZXJzaGlwLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzCisgICAgICogdGhlIGNsaXBib2FyZCwgd2UgZG9uJ3Qgd2FudCB0byB0aGluayB0aGF0IHdlIHN0aWxsIG93biBpdC4KKyAgICAgKgorICAgICAqLworCisgICAgY2JkLT5vd25lZCA9IEZBTFNFOworCisgICAgdHlwZSA9IGNsaXBfY29udmVydF9zZWxlY3Rpb24oJnN0ciwgKGxvbmdfdSAqKSAmc2NyYXBTaXplLCBjYmQpOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKyAgICB7CisJY2hhcl91CSp0bzsKKwlpbnQJbCA9IHNjcmFwU2l6ZTsKKworCXRvID0gc3RyaW5nX2NvbnZlcnQoJm91dHB1dF9jb252LCBzdHIsICZsKTsKKwlpZiAodG8gIT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKHN0cik7CisJICAgIHN0ciA9IHRvOworCSAgICBzY3JhcFNpemUgPSBsOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICh0eXBlID49IDApCisgICAgeworI2lmZGVmIFVTRV9DQVJCT05JWkVECisJQ2xlYXJDdXJyZW50U2NyYXAoKTsKKyNlbHNlCisJWmVyb1NjcmFwKCk7CisjZW5kaWYKKworCXRleHRPZkNsaXAgPSBOZXdIYW5kbGUoc2NyYXBTaXplKTsKKwlITG9jayh0ZXh0T2ZDbGlwKTsKKworCVNUUk5DUFkoKnRleHRPZkNsaXAsIHN0ciwgc2NyYXBTaXplKTsKKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorCUdldEN1cnJlbnRTY3JhcCAoJnNjcmFwKTsKKwlQdXRTY3JhcEZsYXZvcihzY3JhcCwga1NjcmFwRmxhdm9yVHlwZVRleHQsIGtTY3JhcEZsYXZvck1hc2tOb25lLAorCQkJc2NyYXBTaXplLCAqdGV4dE9mQ2xpcCk7CisjZWxzZQorCVB1dFNjcmFwKHNjcmFwU2l6ZSwgJ1RFWFQnLCAqdGV4dE9mQ2xpcCk7CisjZW5kaWYKKwlIVW5sb2NrKHRleHRPZkNsaXApOworCURpc3Bvc2VIYW5kbGUodGV4dE9mQ2xpcCk7CisgICAgfQorCisgICAgdmltX2ZyZWUoc3RyKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MoeCwgeSwgdywgaCkKKyAgICBpbnQJCXg7CisgICAgaW50CQl5OworICAgIGludAkJdzsKKyAgICBpbnQJCWg7Cit7CisgICAgUmVjdAlWaW1Cb3VuZDsKKworLyogIEhpZGVXaW5kb3cgKGd1aS5WaW1XaW5kb3cpOyAqLworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgR2V0V2luZG93Qm91bmRzKGd1aS5WaW1XaW5kb3csIGtXaW5kb3dHbG9iYWxQb3J0UmduLCAmVmltQm91bmQpOworI2Vsc2UKKyAgICBWaW1Cb3VuZCA9IGd1aS5WaW1XaW5kb3ctPnBvcnRSZWN0OworI2VuZGlmCisKKyAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKKyAgICB7CisJVmltQm91bmQubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlWaW1Cb3VuZC5sZWZ0ID0gMDsKKyAgICB9CisKKyNpZmRlZiBVU0VfQ0FSQk9OSVpFRAorICAgIFNldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93R2xvYmFsUG9ydFJnbiwgJlZpbUJvdW5kKTsKKyNlbmRpZgorCisgICAgU2hvd1dpbmRvdyAoZ3VpLlZpbVdpbmRvdyk7Cit9CisKKy8qCisgKiBNZW51IHN0dWZmLgorICovCisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9tZW51KGZsYWcpCisgICAgaW50CQlmbGFnOworeworICAgIC8qCisgICAgICogTWVudSBpcyBhbHdheXMgYWN0aXZlIGluIGl0c2VsZgorICAgICAqIChtYXliZSB3ZSBzaG91bGQgb25seSBkaXNhYmxlIGEgdmltIG1lbnUKKyAgICAgKglhbmQga2VlcCBzdGFuZGFyZCBtZW51KQorICAgICAqCisgICAgICovCit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9tZW51X3Bvcyh4LCB5LCB3LCBoKQorICAgIGludAkJeDsKKyAgICBpbnQJCXk7CisgICAgaW50CQl3OworICAgIGludAkJaDsKK3sKKyAgICAvKgorICAgICAqIFRoZSBtZW51IGlzIGFsd2F5cyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4KKyAgICAgKiBNYXliZSBhIGZ1dHVyIHZlcnNpb24gd2lsbCBwZXJtaXQgYSBtZW51IGluIHRoZSB3aW5kb3cKKyAgICAgKgorICAgICAqLworfQorCisvKgorICogQWRkIGEgc3ViIG1lbnUgdG8gdGhlIG1lbnUgYmFyLgorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudShtZW51LCBpZHgpCisgICAgdmltbWVudV9UCSptZW51OworICAgIGludAkJaWR4OworeworICAgIC8qCisgICAgICogVE9ETzogVHJ5IHRvIHVzZSBvbmx5IG1lbnVfaWQgaW5zdGVhZCBvZiBib3RoIG1lbnVfaWQgYW5kIG1lbnVfaGFuZGxlLgorICAgICAqIFRPRE86IHVzZSBtZW51LT5tbmVtb25pYyBhbmQgbWVudS0+YWN0ZXh0CisgICAgICogVE9ETzogVHJ5IHRvIHJldXNlIG1lbnUgaWQKKyAgICAgKiAgICAgICBDYXJib24gSGVscCBzdWdnZXN0IHRvIHVzZSBvbmx5IGlkIGJldHdlZW4gMSBhbmQgMjM1CisgICAgICovCisgICAgc3RhdGljIGxvbmcJIG5leHRfYXZhaWxfaWQgPSAxMjg7CisgICAgbG9uZwkgbWVudV9hZnRlcl9tZSA9IDA7IC8qIERlZmF1bHQgdG8gdGhlIGVuZCAqLworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBzaG9ydAkgaW5kZXg7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisgICAgdmltbWVudV9UCSpicm90aGVyID0gbWVudS0+bmV4dDsKKworICAgIC8qIENhbm5vdCBhZGQgYSBtZW51IGlmIC4uLiAqLworICAgIGlmICgocGFyZW50ICE9IE5VTEwgJiYgcGFyZW50LT5zdWJtZW51X2lkID09IDApKQorCXJldHVybjsKKworICAgIC8qIG1lbnUgSUQgZ3JlYXRlciB0aGFuIDEwMjQgYXJlIHJlc2VydmVkIGZvciA/Pz8gKi8KKyAgICBpZiAobmV4dF9hdmFpbF9pZCA9PSAxMDI0KQorCXJldHVybjsKKworICAgIC8qIE15IGJyb3RoZXIgY291bGQgYmUgdGhlIFBvcFVwLCBmaW5kIG15IHJlYWwgYnJvdGhlciAqLworICAgIHdoaWxlICgoYnJvdGhlciAhPSBOVUxMKSAmJiAoIW1lbnVfaXNfbWVudWJhcihicm90aGVyLT5uYW1lKSkpCisJYnJvdGhlciA9IGJyb3RoZXItPm5leHQ7CisKKyAgICAvKiAgRmluZCB3aGVyZSB0byBpbnNlcnQgdGhlIG1lbnUgKGZvciBNZW51QmFyKSAqLworICAgIGlmICgocGFyZW50ID09IE5VTEwpICYmIChicm90aGVyICE9IE5VTEwpKQorCW1lbnVfYWZ0ZXJfbWUgPSBicm90aGVyLT5zdWJtZW51X2lkOworCisgICAgLyogSWYgdGhlIG1lbnUgaXMgbm90IHBhcnQgb2YgdGhlIG1lbnViYXIgKGFuZCBpdHMgc3VibWVudXMpLCBhZGQgaXQgJ25vd2hlcmUnICovCisgICAgaWYgKCFtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisJbWVudV9hZnRlcl9tZSA9IGhpZXJNZW51OworCisgICAgLyogQ29udmVydCB0aGUgbmFtZSAqLworICAgIG5hbWUgPSBDMlBhc2NhbF9zYXZlKG1lbnUtPmRuYW1lKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIENyZWF0ZSB0aGUgbWVudSB1bmxlc3MgaXQncyB0aGUgaGVscCBtZW51ICovCisjaWZkZWYgVVNFX0hFTFBNRU5VCisgICAgaWYgKFNUUk5DTVAobmFtZSwgIlw0SGVscCIsIDUpID09IDApCisgICAgeworCW1lbnUtPnN1Ym1lbnVfaWQgPSBrSE1IZWxwTWVudUlEOworCW1lbnUtPnN1Ym1lbnVfaGFuZGxlID0gZ3VpLk1hY09TSGVscE1lbnU7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKiBDYXJib24gc3VnZ2VzdCB1c2Ugb2YKKwkgKiBPU1N0YXR1cyBDcmVhdGVOZXdNZW51ICggTWVudUlELCBNZW51QXR0cmlidXRlcywgTWVudVJlZiAqKTsKKwkgKiBPU1N0YXR1cyBTZXRNZW51VGl0bGUgKCBNZW51UmVmLCBDb25zdFN0cjI1NVBhcmFtIHRpdGxlICk7CisJICovCisJbWVudS0+c3VibWVudV9pZCA9IG5leHRfYXZhaWxfaWQ7CisJbWVudS0+c3VibWVudV9oYW5kbGUgPSBOZXdNZW51IChtZW51LT5zdWJtZW51X2lkLCBuYW1lKTsKKwluZXh0X2F2YWlsX2lkKys7CisgICAgfQorCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgIHsKKwkvKiBBZGRpbmcgYSBtZW51IHRvIHRoZSBtZW51YmFyLCBvciBpbiB0aGUgbm8gbWFucyBsYW5kIChmb3IgUG9wVXApICovCisKKwkvKiBUT0RPOiBWZXJpZnkgaWYgd2UgY291bGQgb25seSBJbnNlcnQgTWVudSBpZiByZWFsbHkgcGFydCBvZiB0aGUKKwkgKiBtZW51YmFyIFRoZSBJbnNlcnRlZCBtZW51IGFyZSBzY2FubmVkIG9yIHRoZSBDb21tYW5kLWtleSBjb21ib3MKKwkgKi8KKworCS8qIEluc2VydCB0aGUgbWVudSB1bmxlc3MgaXQncyB0aGUgSGVscCBtZW51ICovCisjaWZkZWYgVVNFX0hFTFBNRU5VCisJaWYgKG1lbnUtPnN1Ym1lbnVfaWQgIT0ga0hNSGVscE1lbnVJRCkKKyNlbmRpZgorCSAgICBJbnNlcnRNZW51IChtZW51LT5zdWJtZW51X2hhbmRsZSwgbWVudV9hZnRlcl9tZSk7IC8qIGluc2VydCBiZWZvcmUgKi8KKyNpZiAxCisJLyogVmltIHNob3VsZCBub3JtYWxseSB1cGRhdGUgaXQuIFRPRE86IHZlcmlmeSAqLworCURyYXdNZW51QmFyKCk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBBZGRpbmcgYXMgYSBzdWJtZW51ICovCisKKwlpbmRleCA9IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleCAobWVudSk7CisKKwkvKiBDYWxsIEluc2VydE1lbnVJdGVtIGZvbGxvd2VkIGJ5IFNldE1lbnVJdGVtVGV4dAorCSAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCisJICovCisJSW5zZXJ0TWVudUl0ZW0ocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgIlxwICIsIGlkeCk7IC8qIGFmdGVySXRlbSAqLworCVNldE1lbnVJdGVtVGV4dChwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7CisJU2V0SXRlbUNtZChwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgMHgxQik7CisJU2V0SXRlbU1hcmsocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG1lbnUtPnN1Ym1lbnVfaWQpOworCUluc2VydE1lbnUobWVudS0+c3VibWVudV9oYW5kbGUsIGhpZXJNZW51KTsKKyAgICB9CisKKyAgICB2aW1fZnJlZSAobmFtZSk7CisKKyNpZiAwCisgICAgLyogRG9uZSBieSBWaW0gbGF0ZXIgb24gKi8KKyAgICBEcmF3TWVudUJhcigpOworI2VuZGlmCit9CisKKy8qCisgKiBBZGQgYSBtZW51IGl0ZW0gdG8gYSBtZW51CisgKi8KKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51X2l0ZW0obWVudSwgaWR4KQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCWlkeDsKK3sKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisgICAgaW50CQltZW51X2luc2VydGVkOworCisgICAgLyogQ2Fubm90IGFkZCBpdGVtLCBpZiB0aGUgbWVudSBoYXZlIG5vdCBiZWVuIGNyZWF0ZWQgKi8KKyAgICBpZiAocGFyZW50LT5zdWJtZW51X2lkID09IDApCisJcmV0dXJuOworCisgICAgLyogQ291bGQgY2FsbCBTZXRNZW51UmVmQ29uIFtDQVJCT05dIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBNZW51LAorICAgICAgIGZvciBvbGRlciBPUyBjYWxsIEdldE1lbnVJdGVtRGF0YSAobWVudSwgaXRlbSwgaXNDb21tYW5kSUQ/LCBkYXRhKSAqLworCisgICAgLyogQ29udmVydCB0aGUgbmFtZSAqLworICAgIG5hbWUgPSBDMlBhc2NhbF9zYXZlKG1lbnUtPmRuYW1lKTsKKworICAgIC8qIFdoZXJlIGFyZSBqdXN0IGEgbWVudSBpdGVtLCBzbyBubyBoYW5kbGUsIG5vIGlkICovCisgICAgbWVudS0+c3VibWVudV9pZCA9IDA7CisgICAgbWVudS0+c3VibWVudV9oYW5kbGUgPSBOVUxMOworCisjaWZkZWYgVVNFX0hFTFBNRU5VCisgICAgLyogVGhlIGluZGV4IGluIHRoZSBoZWxwIG1lbnUgYXJlIG9mZnNldGVkICovCisgICAgaWYgKHBhcmVudC0+c3VibWVudV9pZCA9PSBrSE1IZWxwTWVudUlEKQorCWlkeCArPSBndWkuTWFjT1NIZWxwSXRlbXM7CisjZW5kaWYKKworICAgIG1lbnVfaW5zZXJ0ZWQgPSAwOworICAgIGlmIChtZW51LT5hY3RleHQpCisgICAgeworCS8qIElmIHRoZSBhY2NlbGVyYXRvciB0ZXh0IGZvciB0aGUgbWVudSBpdGVtIGxvb2tzIGxpa2UgaXQgZGVzY3JpYmVzCisJICogYSBjb21tYW5kIGtleSAoZS5nLiwgIjxELVMtdD4iIG9yICI8Qy03PiIpLCBkaXNwbGF5IGl0IGFzIHRoZQorCSAqIGl0ZW0ncyBjb21tYW5kIGVxdWl2YWxlbnQuCisJICovCisJaW50CSAgICBrZXkgPSAwOworCWludAkgICAgbW9kaWZpZXJzID0gMDsKKwljaGFyX3UJICAgICpwX2FjdGV4dDsKKworCXBfYWN0ZXh0ID0gbWVudS0+YWN0ZXh0OworCWtleSA9IGZpbmRfc3BlY2lhbF9rZXkoJnBfYWN0ZXh0LCAmbW9kaWZpZXJzLCAvKmtleWNvZGU9Ki8wKTsKKwlpZiAoKnBfYWN0ZXh0ICE9IDApCisJICAgIGtleSA9IDA7IC8qIGVycm9yOiB0cmFpbGluZyB0ZXh0ICovCisJLyogZmluZF9zcGVjaWFsX2tleSgpIHJldHVybnMgYSBrZXljb2RlIHdpdGggYXMgbWFueSBvZiB0aGUKKwkgKiBzcGVjaWZpZWQgbW9kaWZpZXJzIGFzIGFwcHJvcHJpYXRlIGFscmVhZHkgYXBwbGllZCAoZS5nLiwgZm9yCisJICogIjxELUMteD4iIGl0IHJldHVybnMgQ3RybC1YIGFzIHRoZSBrZXljb2RlIGFuZCBNT0RfTUFTS19DTUQKKwkgKiBhcyB0aGUgb25seSBtb2RpZmllcikuICBTaW5jZSB3ZSB3YW50IHRvIGRpc3BsYXkgYWxsIG9mIHRoZQorCSAqIG1vZGlmaWVycywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBrZXljb2RlIGJhY2sgdG8gYSBwcmludGFibGUKKwkgKiBjaGFyYWN0ZXIgcGx1cyBtb2RpZmllcnMuCisJICogVE9ETzogV3JpdGUgYW4gYWx0ZXJuYXRpdmUgZmluZF9zcGVjaWFsX2tleSgpIHRoYXQgZG9lc24ndAorCSAqIGFwcGx5IG1vZGlmaWVycy4KKwkgKi8KKwlpZiAoa2V5ID4gMCAmJiBrZXkgPCAzMikKKwl7CisJICAgIC8qIENvbnZlcnQgYSBjb250cm9sIGtleSB0byBhbiB1cHBlcmNhc2UgbGV0dGVyLiAgTm90ZSB0aGF0CisJICAgICAqIGJ5IHRoaXMgcG9pbnQgaXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoCisJICAgICAqIGJldHdlZW4sIGUuZy4sIEN0cmwtUyBhbmQgQ3RybC1TaGlmdC1TLgorCSAgICAgKi8KKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CisJICAgIGtleSArPSAnQCc7CisJfQorCS8qIElmIHRoZSBrZXljb2RlIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIHNldCB0aGUgU2hpZnQgbW9kaWZpZXIuCisJICogSWYgaXQgaXMgYSBsb3dlcmNhc2UgbGV0dGVyLCBkb24ndCBzZXQgdGhlIG1vZGlmaWVyLCBidXQgY29udmVydAorCSAqIHRoZSBsZXR0ZXIgdG8gdXBwZXJjYXNlIGZvciBkaXNwbGF5IGluIHRoZSBtZW51LgorCSAqLworCWVsc2UgaWYgKGtleSA+PSAnQScgJiYga2V5IDw9ICdaJykKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCWVsc2UgaWYgKGtleSA+PSAnYScgJiYga2V5IDw9ICd6JykKKwkgICAga2V5ICs9ICdBJyAtICdhJzsKKwkvKiBOb3RlOiBrZXljb2RlcyBiZWxvdyAweDIyIGFyZSByZXNlcnZlZCBieSBBcHBsZS4gKi8KKwlpZiAoa2V5ID49IDB4MjIgJiYgdmltX2lzcHJpbnRjX3N0cmljdChrZXkpKQorCXsKKwkgICAgaW50CQl2YWxpZCA9IDE7CisJICAgIGNoYXJfdSAgICAgIG1hY19tb2RzID0ga01lbnVOb01vZGlmaWVyczsKKwkgICAgLyogQ29udmVydCBWaW0gbW9kaWZpZXIgY29kZXMgdG8gTWVudSBNYW5hZ2VyIGVxdWl2YWxlbnRzLiAqLworCSAgICBpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfU0hJRlQpCisJCW1hY19tb2RzIHw9IGtNZW51U2hpZnRNb2RpZmllcjsKKwkgICAgaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX0NUUkwpCisJCW1hY19tb2RzIHw9IGtNZW51Q29udHJvbE1vZGlmaWVyOworCSAgICBpZiAoIShtb2RpZmllcnMgJiBNT0RfTUFTS19DTUQpKQorCQltYWNfbW9kcyB8PSBrTWVudU5vQ29tbWFuZE1vZGlmaWVyOworCSAgICBpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfQUxUIHx8IG1vZGlmaWVycyAmIE1PRF9NQVNLX01VTFRJX0NMSUNLKQorCQl2YWxpZCA9IDA7IC8qIFRPRE86IHdpbGwgQWx0IHNvbWVkYXkgbWFwIHRvIE9wdGlvbj8gKi8KKwkgICAgaWYgKHZhbGlkKQorCSAgICB7CisJCWNoYXJfdQkgICAgaXRlbV90eHRbMTBdOworCQkvKiBJbnNlcnQgdGhlIG1lbnUgaXRlbSBhZnRlciBpZHgsIHdpdGggaXRzIGNvbW1hbmQga2V5LiAqLworCQlpdGVtX3R4dFswXSA9IDM7IGl0ZW1fdHh0WzFdID0gJyAnOyBpdGVtX3R4dFsyXSA9ICcvJzsKKwkJaXRlbV90eHRbM10gPSBrZXk7CisJCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGl0ZW1fdHh0LCBpZHgpOworCQkvKiBTZXQgdGhlIG1vZGlmaWVyIGtleXMuICovCisJCVNldE1lbnVJdGVtTW9kaWZpZXJzKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBtYWNfbW9kcyk7CisJCW1lbnVfaW5zZXJ0ZWQgPSAxOworCSAgICB9CisJfQorICAgIH0KKyAgICAvKiBDYWxsIEluc2VydE1lbnVJdGVtIGZvbGxvd2VkIGJ5IFNldE1lbnVJdGVtVGV4dAorICAgICAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCisgICAgICovCisgICAgaWYgKCFtZW51X2luc2VydGVkKQorCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsICJccCAiLCBpZHgpOyAvKiBhZnRlckl0ZW0gKi8KKyAgICAvKiBTZXQgdGhlIG1lbnUgaXRlbSBuYW1lLiAqLworICAgIFNldE1lbnVJdGVtVGV4dChwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7CisKKyNpZiAwCisgICAgLyogQ2FsbGVkIGJ5IFZpbSAqLworICAgIERyYXdNZW51QmFyKCk7CisjZW5kaWYKKworICAgIC8qIFRPRE86IENhbiBuYW1lIGJlIGZyZWVkPyAqLworICAgIHZpbV9mcmVlKG5hbWUpOworfQorCisgICAgdm9pZAorZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMoZW5hYmxlKQorICAgIGludAkgICAgZW5hYmxlOworeworICAgIC8qIG5vIHRlYXJvZmYgbWVudXMgKi8KK30KKworLyoKKyAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICBzaG9ydAlpbmRleCA9IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleCAobWVudSk7CisKKyAgICBpZiAoaW5kZXggPiAwKQorICAgIHsKKyAgICAgIGlmIChtZW51LT5wYXJlbnQpCisgICAgICB7CisjaWZkZWYgVVNFX0hFTFBNRU5VCisJaWYgKG1lbnUtPnBhcmVudC0+c3VibWVudV9oYW5kbGUgIT0gbmlsKSAvKmd1aS5NYWNPU0hlbHBNZW51KSovCisjZW5kaWYKKwl7CisJICAgIC8qIEZvciBub3cganVzdCBkb24ndCBkZWxldGUgaGVscCBtZW51IGl0ZW1zLiAoSHVoPyBEYW55KSAqLworCSAgICBEZWxldGVNZW51SXRlbSAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaW5kZXgpOworCisJICAgIC8qIERlbGV0ZSB0aGUgTWVudSBpZiBpdCB3YXMgYSBoaWVyYXJjaGljYWwgTWVudSAqLworCSAgICBpZiAobWVudS0+c3VibWVudV9pZCAhPSAwKQorCSAgICB7CisJCURlbGV0ZU1lbnUgKG1lbnUtPnN1Ym1lbnVfaWQpOworCQlEaXNwb3NlTWVudSAobWVudS0+c3VibWVudV9oYW5kbGUpOworCSAgICB9CisJfQorI2lmZGVmIFVTRV9IRUxQTUVOVQorIyBpZmRlZiBERUJVR19NQUNfTUVOVQorCWVsc2UKKwl7CisJICAgIHByaW50ZiAoImdtZG0gMVxuIik7CisJfQorIyBlbmRpZgorI2VuZGlmCisgICAgICB9CisjaWZkZWYgREVCVUdfTUFDX01FTlUKKyAgICAgIGVsc2UKKyAgICAgIHsKKwlwcmludGYgKCJnbWRtIDJcbiIpOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogRG8gbm90IGRlbGV0ZSB0aGUgSGVscCBNZW51ICovCisjaWZkZWYgVVNFX0hFTFBNRU5VCisJaWYgKG1lbnUtPnN1Ym1lbnVfaWQgIT0ga0hNSGVscE1lbnVJRCkKKyNlbmRpZgorCXsKKwkgICAgRGVsZXRlTWVudSAobWVudS0+c3VibWVudV9pZCk7CisJICAgIERpc3Bvc2VNZW51IChtZW51LT5zdWJtZW51X2hhbmRsZSk7CisJfQorICAgIH0KKyAgICAvKiBTaG91bGRuJ3QgdGhpcyBiZSBhbHJlYWR5IGRvbmUgYnkgVmltLiBUT0RPOiBDaGVjayAqLworICAgIERyYXdNZW51QmFyKCk7Cit9CisKKy8qCisgKiBNYWtlIGEgbWVudSBlaXRoZXIgZ3JleSBvciBub3QgZ3JleS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbWVudV9ncmV5KG1lbnUsIGdyZXkpCisgICAgdmltbWVudV9UCSptZW51OworICAgIGludAkJZ3JleTsKK3sKKyAgICAvKiBUT0RPOiBDaGVjayBpZiBtZW51IHJlYWxseSBleGlzdHMgKi8KKyAgICBzaG9ydCBpbmRleCA9IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleCAobWVudSk7CisvKgorICAgIGluZGV4ID0gbWVudS0+aW5kZXg7CisqLworICAgIGlmIChncmV5KQorICAgIHsKKwlpZiAobWVudS0+Y2hpbGRyZW4pCisJICAgIERpc2FibGVNZW51SXRlbShtZW51LT5zdWJtZW51X2hhbmRsZSwgaW5kZXgpOworCWlmIChtZW51LT5wYXJlbnQpCisJICBpZiAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSkKKwkgICAgRGlzYWJsZU1lbnVJdGVtKG1lbnUtPnBhcmVudC0+c3VibWVudV9oYW5kbGUsIGluZGV4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAobWVudS0+Y2hpbGRyZW4pCisJICAgIEVuYWJsZU1lbnVJdGVtKG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CisJaWYgKG1lbnUtPnBhcmVudCkKKwkgIGlmIChtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlKQorCSAgICBFbmFibGVNZW51SXRlbShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CisgICAgfQorfQorCisvKgorICogTWFrZSBtZW51IGl0ZW0gaGlkZGVuIG9yIG5vdCBoaWRkZW4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbWVudV9oaWRkZW4obWVudSwgaGlkZGVuKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCWhpZGRlbjsKK3sKKyAgICAvKiBUaGVyZSdzIG5vIGhpZGRlbiBtb2RlIG9uIE1hY09TICovCisgICAgZ3VpX21jaF9tZW51X2dyZXkgKG1lbnUsIGhpZGRlbik7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNldHRpbmcgYWxsIHRoZSBtZW51cyB0byBncmV5L2hpZGRlbiBvciBub3QuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RyYXdfbWVudWJhcigpCit7CisgICAgRHJhd01lbnVCYXIoKTsKK30KKworCisvKgorICogU2Nyb2xsYmFyIHN0dWZmLgorICovCisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2IsIGZsYWcpCisgICAgc2Nyb2xsYmFyX1QJKnNiOworICAgIGludAkJZmxhZzsKK3sKKyAgICBpZiAoZmxhZykKKwlTaG93Q29udHJvbChzYi0+aWQpOworICAgIGVsc2UKKwlIaWRlQ29udHJvbChzYi0+aWQpOworCisjaWZkZWYgREVCVUdfTUFDX1NCCisgICAgcHJpbnRmICgiZW5iX3NiICgleCkgJXhcbiIsc2ItPmlkLCBmbGFnKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNiLCB2YWwsIHNpemUsIG1heCkKKyAgICBzY3JvbGxiYXJfVCAqc2I7CisgICAgbG9uZwl2YWw7CisgICAgbG9uZwlzaXplOworICAgIGxvbmcJbWF4OworeworICAgIFNldENvbnRyb2wzMkJpdE1heGltdW0gKHNiLT5pZCwgbWF4KTsKKyAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtIChzYi0+aWQsIDApOworICAgIFNldENvbnRyb2wzMkJpdFZhbHVlICAgKHNiLT5pZCwgdmFsKTsKKyNpZmRlZiBERUJVR19NQUNfU0IKKyAgICBwcmludGYgKCJ0aHVtYl9zYiAoJXgpICV4LCAleCwleFxuIixzYi0+aWQsIHZhbCwgc2l6ZSwgbWF4KTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyhzYiwgeCwgeSwgdywgaCkKKyAgICBzY3JvbGxiYXJfVCAqc2I7CisgICAgaW50CQl4OworICAgIGludAkJeTsKKyAgICBpbnQJCXc7CisgICAgaW50CQloOworeworICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKKy8qICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKKyAgICB7CisJTW92ZUNvbnRyb2wgKHNiLT5pZCwgeC0xNiwgeSk7CisJU2l6ZUNvbnRyb2wgKHNiLT5pZCwgdyArIDEsIGgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCU1vdmVDb250cm9sIChzYi0+aWQsIHgsIHkpOworCVNpemVDb250cm9sIChzYi0+aWQsIHcgKyAxLCBoKTsKKyAgICB9Ki8KKyAgICBpZiAoc2IgPT0gJmd1aS5ib3R0b21fc2JhcikKKwloICs9IDE7CisgICAgZWxzZQorCXcgKz0gMTsKKworICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQorCXggLT0gMTU7CisKKyAgICBNb3ZlQ29udHJvbCAoc2ItPmlkLCB4LCB5KTsKKyAgICBTaXplQ29udHJvbCAoc2ItPmlkLCB3LCBoKTsKKyNpZmRlZiBERUJVR19NQUNfU0IKKyAgICBwcmludGYgKCJzaXplX3NiICgleCkgJXgsICV4LCAleCwgJXhcbiIsc2ItPmlkLCB4LCB5LCB3LCBoKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3VpX21jaF9jcmVhdGVfc2Nyb2xsYmFyKHNiLCBvcmllbnQpCisgICAgc2Nyb2xsYmFyX1QgKnNiOworICAgIGludAkJb3JpZW50OwkvKiBTQkFSX1ZFUlQgb3IgU0JBUl9IT1JJWiAqLworeworICAgIFJlY3QgYm91bmRzOworCisgICAgYm91bmRzLnRvcCA9IC0xNjsKKyAgICBib3VuZHMuYm90dG9tID0gLTEwOworICAgIGJvdW5kcy5yaWdodCA9IC0xMDsKKyAgICBib3VuZHMubGVmdCA9IC0xNjsKKworICAgIHNiLT5pZCA9IE5ld0NvbnRyb2wgKGd1aS5WaW1XaW5kb3csCisJCQkgJmJvdW5kcywKKwkJCSAiXHBTY3JvbGxCYXIiLAorCQkJIFRSVUUsCisJCQkgMCwgLyogY3VycmVudCovCisJCQkgMCwgLyogdG9wICovCisJCQkgMCwgLyogYm90dG9tICovCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKwkJCSBrQ29udHJvbFNjcm9sbEJhckxpdmVQcm9jLAorI2Vsc2UKKwkJCSBzY3JvbGxCYXJQcm9jLAorI2VuZGlmCisJCQkgKGxvbmcpIHNiLT5pZGVudCk7CisjaWZkZWYgREVCVUdfTUFDX1NCCisgICAgcHJpbnRmICgiY3JlYXRlX3NiICgleCkgJXhcbiIsc2ItPmlkLCBvcmllbnQpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNiKQorICAgIHNjcm9sbGJhcl9UICpzYjsKK3sKKyAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CisgICAgRGlzcG9zZUNvbnRyb2wgKHNiLT5pZCk7CisjaWZkZWYgREVCVUdfTUFDX1NCCisgICAgcHJpbnRmICgiZGVzdF9zYiAoJXgpIFxuIixzYi0+aWQpOworI2VuZGlmCit9CisKKworLyoKKyAqIEN1cnNvciBibGluayBmdW5jdGlvbnMuCisgKgorICogVGhpcyBpcyBhIHNpbXBsZSBzdGF0ZSBtYWNoaW5lOgorICogQkxJTktfTk9ORQlub3QgYmxpbmtpbmcgYXQgYWxsCisgKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KKyAqIEJMSU5LX09OIGJsaW5raW5nLCBjdXJzb3IgaXMgc2hvd24KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JsaW5raW5nKGxvbmcgd2FpdCwgbG9uZyBvbiwgbG9uZyBvZmYpCit7CisgICAgLyogVE9ETzogVE9ETzogVE9ETzogVE9ETzogKi8KKy8qICAgIGJsaW5rX3dhaXR0aW1lID0gd2FpdDsKKyAgICBibGlua19vbnRpbWUgPSBvbjsKKyAgICBibGlua19vZmZ0aW1lID0gb2ZmOyovCit9CisKKy8qCisgKiBTdG9wIHRoZSBjdXJzb3IgYmxpbmtpbmcuICBTaG93IHRoZSBjdXJzb3IgaWYgaXQgd2Fzbid0IHNob3duLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zdG9wX2JsaW5rKCkKK3sKKyAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgLyogVE9ETzogVE9ETzogVE9ETzogVE9ETzogKi8KKy8qICAgIGd1aV93MzJfcm1fYmxpbmtfdGltZXIoKTsKKyAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT0ZGKQorICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKyAgICBibGlua19zdGF0ZSA9IEJMSU5LX05PTkU7Ki8KK30KKworLyoKKyAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKKyAqIHdhaXRpbmcgdGltZSBhbmQgc2hvd3MgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RhcnRfYmxpbmsoKQoreworICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKyAgICAvKiBUT0RPOiBUT0RPOiBUT0RPOiBUT0RPOiAqLworLyogICAgZ3VpX3czMl9ybV9ibGlua190aW1lcigpOyAqLworCisgICAgLyogT25seSBzd2l0Y2ggYmxpbmtpbmcgb24gaWYgbm9uZSBvZiB0aGUgdGltZXMgaXMgemVybyAqLworLyogICAgaWYgKGJsaW5rX3dhaXR0aW1lICYmIGJsaW5rX29udGltZSAmJiBibGlua19vZmZ0aW1lKQorICAgIHsKKyAgICBibGlua190aW1lciA9IFNldFRpbWVyKE5VTEwsIDAsIChVSU5UKWJsaW5rX3dhaXR0aW1lLAorCQkJICAgIChUSU1FUlBST0MpX09uQmxpbmtUaW1lcik7CisgICAgYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKyAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgfSovCit9CisKKy8qCisgKiBSZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiBhIHBpeGVsIGFzIGxvbmcuCisgKi8KKyAgICBsb25nX3UKK2d1aV9tY2hfZ2V0X3JnYihndWljb2xvcl9UIHBpeGVsKQoreworICAgIHJldHVybiAoUmVkKHBpeGVsKSA8PCAxNikgKyAoR3JlZW4ocGl4ZWwpIDw8IDgpICsgQmx1ZShwaXhlbCk7Cit9CisKKworCisjaWZkZWYgRkVBVF9CUk9XU0UKKy8qCisgKiBQb3Agb3BlbiBhIGZpbGUgYnJvd3NlciBhbmQgcmV0dXJuIHRoZSBmaWxlIHNlbGVjdGVkLCBpbiBhbGxvY2F0ZWQgbWVtb3J5LAorICogb3IgTlVMTCBpZiBDYW5jZWwgaXMgaGl0LgorICogIHNhdmluZyAgLSBUUlVFIGlmIHRoZSBmaWxlIHdpbGwgYmUgc2F2ZWQgdG8sIEZBTFNFIGlmIGl0IHdpbGwgYmUgb3BlbmVkLgorICogIHRpdGxlICAgLSBUaXRsZSBtZXNzYWdlIGZvciB0aGUgZmlsZSBicm93c2VyIGRpYWxvZy4KKyAqICBkZmx0ICAgIC0gRGVmYXVsdCBuYW1lIG9mIGZpbGUuCisgKiAgZXh0ICAgICAtIERlZmF1bHQgZXh0ZW5zaW9uIHRvIGJlIGFkZGVkIHRvIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9ucy4KKyAqICBpbml0ZGlyIC0gZGlyZWN0b3J5IGluIHdoaWNoIHRvIG9wZW4gdGhlIGJyb3dzZXIgKE5VTEwgPSBjdXJyZW50IGRpcikKKyAqICBmaWx0ZXIgIC0gRmlsdGVyIGZvciBtYXRjaGVkIGZpbGVzIHRvIGNob29zZSBmcm9tLgorICogIEhhcyBhIGZvcm1hdCBsaWtlIHRoaXM6CisgKiAgIkMgRmlsZXMgKCouYylcMCouY1wwIgorICogICJBbGwgRmlsZXNcMCouKlwwXDAiCisgKiAgSWYgdGhlc2UgdHdvIHN0cmluZ3Mgd2VyZSBjb25jYXRlbmF0ZWQsIHRoZW4gYSBjaG9pY2Ugb2YgdHdvIGZpbGUKKyAqICBmaWx0ZXJzIHdpbGwgYmUgc2VsZWN0YWJsZSB0byB0aGUgdXNlci4gIFRoZW4gb25seSBtYXRjaGluZyBmaWxlcyB3aWxsCisgKiAgYmUgc2hvd24gaW4gdGhlIGJyb3dzZXIuICBJZiBOVUxMLCB0aGUgZGVmYXVsdCBhbGxvd3MgYWxsIGZpbGVzLgorICoKKyAqICAqTk9URSogLSB0aGUgZmlsdGVyIHN0cmluZyBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBUV08gbnVsbHMuCisgKi8KKyAgICBjaGFyX3UgKgorZ3VpX21jaF9icm93c2UoCisgICAgaW50IHNhdmluZywKKyAgICBjaGFyX3UgKnRpdGxlLAorICAgIGNoYXJfdSAqZGZsdCwKKyAgICBjaGFyX3UgKmV4dCwKKyAgICBjaGFyX3UgKmluaXRkaXIsCisgICAgY2hhcl91ICpmaWx0ZXIpCit7CisjaWYgZGVmaW5lZCAoVVNFX05BVklHQVRJT05fU0VSVklDRSkgfHwgZGVmaW5lZCAoVVNFX0NBUkJPTklaRUQpCisgICAgLyogVE9ETzogQWRkIEFtbW9uJ3Mgc2FmZXR5IGNoZWNsIChEYW55KSAqLworICAgIE5hdlJlcGx5UmVjb3JkCXJlcGx5OworICAgIGNoYXJfdQkJKmZuYW1lID0gTlVMTDsKKyAgICBjaGFyX3UJCSoqZm5hbWVzID0gTlVMTDsKKyAgICBsb25nCQludW1GaWxlczsKKyAgICBOYXZEaWFsb2dPcHRpb25zCW5hdk9wdGlvbnM7CisgICAgT1NFcnIJCWVycm9yOworCisgICAgLyogR2V0IE5hdmlnYXRpb24gU2VydmljZSBEZWZhdWx0cyB2YWx1ZSAqLworICAgIE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zICgmbmF2T3B0aW9ucyk7CisKKworICAgIC8qIFRPRE86IElmIHdlIGdldCBhIDpicm93c2UgYXJncywgc2V0IHRoZSBNdWx0aXBsZSBiaXQuICovCisgICAgbmF2T3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncyA9ICBrTmF2QWxsb3dJbnZpc2libGVGaWxlcworCQkJCSB8ICBrTmF2RG9udEF1dG9UcmFuc2xhdGUKKwkJCQkgfCAga05hdkRvbnRBZGRUcmFuc2xhdGVJdGVtcworCQkJICAgIC8qCSB8ICBrTmF2QWxsb3dNdWx0aXBsZUZpbGVzICovCisJCQkJIHwgIGtOYXZBbGxvd1N0YXRpb25lcnk7CisKKyAgICAodm9pZCkgQzJQYXNjYWxTdHJpbmcgKHRpdGxlLCAgICZuYXZPcHRpb25zLm1lc3NhZ2UpOworICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyAoZGZsdCwgICAgJm5hdk9wdGlvbnMuc2F2ZWRGaWxlTmFtZSk7CisgICAgLyogQ291bGQgc2V0IGNsaWVudE5hbWU/CisgICAgICoJCSB3aW5kb3dUaXRsZT8gKHRoZXJlJ3Mgbm8gdGl0bGUgYmFyPykKKyAgICAgKi8KKworICAgIGlmIChzYXZpbmcpCisgICAgeworCS8qIENoYW5nZSBmaXJzdCBwYXJtIEFFRGVzYyAodHlwZUZTUykgKmRlZmF1bHRMb2NhdGlvbiB0byBtYXRjaCBkZmx0ICovCisJTmF2UHV0RmlsZSAoTlVMTCwgJnJlcGx5LCAmbmF2T3B0aW9ucywgTlVMTCwgJ1RFWFQnLCAnVklNIScsIE5VTEwpOworCWlmICghcmVwbHkudmFsaWRSZWNvcmQpCisJICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIENoYW5nZSBmaXJzdCBwYXJtIEFFRGVzYyAodHlwZUZTUykgKmRlZmF1bHRMb2NhdGlvbiB0byBtYXRjaCBkZmx0ICovCisJTmF2R2V0RmlsZShOVUxMLCAmcmVwbHksICZuYXZPcHRpb25zLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXJlcGx5LnZhbGlkUmVjb3JkKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbmFtZXMgPSBuZXdfZm5hbWVzX2Zyb21fQUVEZXNjKCZyZXBseS5zZWxlY3Rpb24sICZudW1GaWxlcywgJmVycm9yKTsKKworICAgIE5hdkRpc3Bvc2VSZXBseSAoJnJlcGx5KTsKKworICAgIGlmIChmbmFtZXMpCisgICAgeworCWZuYW1lID0gZm5hbWVzWzBdOworCXZpbV9mcmVlKGZuYW1lcyk7CisgICAgfQorCisgICAgLyogVE9ETzogU2hvcnRlbiB0aGUgZmlsZSBuYW1lIGlmIHBvc3NpYmxlICovCisgICAgcmV0dXJuIGZuYW1lOworI2Vsc2UKKyAgICBTRlR5cGVMaXN0CQlmaWxlVHlwZXM7CisgICAgU3RhbmRhcmRGaWxlUmVwbHkJcmVwbHk7CisgICAgU3RyMjU1CQlQcm9tcHQ7CisgICAgU3RyMjU1CQlEZWZhdWx0TmFtZTsKKyAgICBTdHIyNTUJCURpcmVjdG9yeTsKKworICAgIC8qIFRPRE86IHNwbGl0IGRmbHQgaW4gcGF0aCBhbmQgZmlsZW5hbWUgKi8KKworICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyAodGl0bGUsICAgJlByb21wdCk7CisgICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nIChkZmx0LCAgICAmRGVmYXVsdE5hbWUpOworICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyAoaW5pdGRpciwgJkRpcmVjdG9yeSk7CisKKyAgICBpZiAoc2F2aW5nKQorICAgIHsKKwkvKiBVc2UgYSBjdXN0b24gZmlsdGVyIGluc3RlYWQgb2YgbmlsIEZBUSA5LTQgKi8KKwlTdGFuZGFyZFB1dEZpbGUgKFByb21wdCwgRGVmYXVsdE5hbWUsICAmcmVwbHkpOworCWlmICghcmVwbHkuc2ZHb29kKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlTdGFuZGFyZEdldEZpbGUgKG5pbCwgLTEsIGZpbGVUeXBlcywgJnJlcGx5KTsKKwlpZiAoIXJlcGx5LnNmR29vZCkKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogV29yayBmaW5lIGJ1dCBhcHBlbmQgYSA6IGZvciBuZXcgZmlsZSAqLworICAgIHJldHVybiAoRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUgKHJlcGx5LnNmRmlsZSkpOworCisgICAgLyogU2hvcnRlbiB0aGUgZmlsZSBuYW1lIGlmIHBvc3NpYmxlICovCisvKiAgICBtY2hfZGlybmFtZShJT2J1ZmYsIElPU0laRSk7CisgICAgcCA9IHNob3J0ZW5fZm5hbWUoZmlsZUJ1ZiwgSU9idWZmKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgIHAgPSBmaWxlQnVmOworICAgIHJldHVybiB2aW1fc3Ryc2F2ZShwKTsKKyovCisjZW5kaWYKK30KKyNlbmRpZiAvKiBGRUFUX0JST1dTRSAqLworCisjaWZkZWYgRkVBVF9HVUlfRElBTE9HCisvKgorICogU3R1ZmYgZm9yIGRpYWxvZ3VlcworICovCisKKy8qCisgKiBDcmVhdGUgYSBkaWFsb2d1ZSBkeW5hbWljYWxseSBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RyaW5ncy4KKyAqIHR5cGUgICAgICAgPSB0eXBlIG9mIGRpYWxvZ3VlIChxdWVzdGlvbiwgYWxlcnQsIGV0Yy4pCisgKiB0aXRsZSAgICAgID0gZGlhbG9ndWUgdGl0bGUuIG1heSBiZSBOVUxMIGZvciBkZWZhdWx0IHRpdGxlLgorICogbWVzc2FnZSAgICA9IHRleHQgdG8gZGlzcGxheS4gRGlhbG9ndWUgc2l6ZXMgdG8gYWNjb21tb2RhdGUgaXQuCisgKiBidXR0b25zICAgID0gJ1xuJyBzZXBhcmF0ZWQgbGlzdCBvZiBidXR0b24gY2FwdGlvbnMsIGRlZmF1bHQgZmlyc3QuCisgKiBkZmx0YnV0dG9uID0gbnVtYmVyIG9mIGRlZmF1bHQgYnV0dG9uLgorICoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIDEgaWYgdGhlIGZpcnN0IGJ1dHRvbiBpcyBwcmVzc2VkLAorICoJICAgIDIgZm9yIHRoZSBzZWNvbmQsIGV0Yy4KKyAqCisgKgkgICAgMCBpbmRpY2F0ZXMgRXNjIHdhcyBwcmVzc2VkLgorICoJICAgIC0xIGZvciB1bmV4cGVjdGVkIGVycm9yCisgKgorICogSWYgc3R1YmJpbmcgb3V0IHRoaXMgZm4sIHJldHVybiAxLgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc2hvcnQgICBpZHg7CisgICAgc2hvcnQgICB3aWR0aDsJLyogU2l6ZSBvZiB0aGUgdGV4dCBpbiBwaXhlbCAqLworICAgIFJlY3QgICAgYm94OworfSB2Z21EbGdJdG07IC8qIFZpbSBHdWlfTWFjLmMgRGlhbG9nIEl0ZW0gKi8KKworI2RlZmluZSBNb3ZlUmVjdFRvKHIseCx5KSBPZmZzZXRSZWN0KHIseC1yLT5sZWZ0LHktci0+dG9wKQorCisgICAgc3RhdGljIHZvaWQKK21hY01vdmVEaWFsb2dJdGVtKAorICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCisgICAgc2hvcnQJaXRlbU51bWJlciwKKyAgICBzaG9ydAlYLAorICAgIHNob3J0CVksCisgICAgUmVjdAkqaW5Cb3gpCit7CisjaWYgMCAvKiBVU0VfQ0FSQk9OSVpFRCAqLworICAgIC8qIFVudGVzdGVkICovCisgICAgTW92ZURpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaXRlbU51bWJlciwgWCwgWSk7CisgICAgaWYgKGluQm94ICE9IG5pbCkKKwlHZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsIGluQm94KTsKKyNlbHNlCisgICAgc2hvcnQJaXRlbVR5cGU7CisgICAgSGFuZGxlCWl0ZW1IYW5kbGU7CisgICAgUmVjdAlsb2NhbEJveDsKKyAgICBSZWN0CSppdGVtQm94ID0gJmxvY2FsQm94OworCisgICAgaWYgKGluQm94ICE9IG5pbCkKKwlpdGVtQm94ID0gaW5Cb3g7CisKKyAgICBHZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsIGl0ZW1Cb3gpOworICAgIE9mZnNldFJlY3QgKGl0ZW1Cb3gsIC1pdGVtQm94LT5sZWZ0LCAtaXRlbUJveC0+dG9wKTsKKyAgICBPZmZzZXRSZWN0IChpdGVtQm94LCBYLCBZKTsKKyAgICAvKiBUbyBtb3ZlIGEgY29udHJvbCAobGlrZSBhIGJ1dHRvbikgd2UgbmVlZCB0byBjYWxsIGJvdGgKKyAgICAgKiBNb3ZlQ29udHJvbCBhbmQgU2V0RGlhbG9nSXRlbS4gRkFRIDYtMTggKi8KKyAgICBpZiAoMSkgLyooaXRlbVR5cGUgJiBrQ29udHJvbERpYWxvZ0l0ZW0pICovCisJTW92ZUNvbnRyb2wgKChDb250cm9sUmVmKSBpdGVtSGFuZGxlLCBYLCBZKTsKKyAgICBTZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIGl0ZW1UeXBlLCBpdGVtSGFuZGxlLCBpdGVtQm94KTsKKyNlbmRpZgorfQorCisgICAgc3RhdGljIHZvaWQKK21hY1NpemVEaWFsb2dJdGVtKAorICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCisgICAgc2hvcnQJaXRlbU51bWJlciwKKyAgICBzaG9ydAl3aWR0aCwKKyAgICBzaG9ydAloZWlnaHQpCit7CisgICAgc2hvcnQJaXRlbVR5cGU7CisgICAgSGFuZGxlCWl0ZW1IYW5kbGU7CisgICAgUmVjdAlpdGVtQm94OworCisgICAgR2V0RGlhbG9nSXRlbSAodGhlRGlhbG9nLCBpdGVtTnVtYmVyLCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCAmaXRlbUJveCk7CisKKyAgICAvKiBXaGVuIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIGRvIG5vdCBjaGFuZ2UgaXQgKi8KKyAgICBpZiAod2lkdGggID09IDApCisJd2lkdGggID0gaXRlbUJveC5yaWdodCAgLSBpdGVtQm94LmxlZnQ7CisgICAgaWYgKGhlaWdodCA9PSAwKQorCWhlaWdodCA9IGl0ZW1Cb3guYm90dG9tIC0gaXRlbUJveC50b3A7CisKKyNpZiAwIC8qIFVTRV9DQVJCT05JWkVEICovCisgICAgU2l6ZURpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaXRlbU51bWJlciwgd2lkdGgsIGhlaWdodCk7IC8qIFVudGVzdGVkICovCisjZWxzZQorICAgIC8qIFJlc2l6ZSB0aGUgYm91bmRpbmcgYm94ICovCisgICAgaXRlbUJveC5yaWdodCAgPSBpdGVtQm94LmxlZnQgKyB3aWR0aDsKKyAgICBpdGVtQm94LmJvdHRvbSA9IGl0ZW1Cb3gudG9wICArIGhlaWdodDsKKworICAgIC8qIFRvIHJlc2l6ZSBhIGNvbnRyb2wgKGxpa2UgYSBidXR0b24pIHdlIG5lZWQgdG8gY2FsbCBib3RoCisgICAgICogU2l6ZUNvbnRyb2wgYW5kIFNldERpYWxvZ0l0ZW0uIChkZWR1Y3RlZCBmcm9tIEZBUSA2LTE4KSAqLworICAgIGlmIChpdGVtVHlwZSAmIGtDb250cm9sRGlhbG9nSXRlbSkKKwlTaXplQ29udHJvbCAoKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIHdpZHRoLCBoZWlnaHQpOworCisgICAgLyogQ29uZmlndXJlIGJhY2sgdGhlIGl0ZW0gKi8KKyAgICBTZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIGl0ZW1UeXBlLCBpdGVtSGFuZGxlLCAmaXRlbUJveCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyB2b2lkCittYWNTZXREaWFsb2dJdGVtVGV4dCgKKyAgICBEaWFsb2dSZWYJdGhlRGlhbG9nLAorICAgIHNob3J0CWl0ZW1OdW1iZXIsCisgICAgU3RyMjU1CWl0ZW1OYW1lKQoreworICAgIHNob3J0CWl0ZW1UeXBlOworICAgIEhhbmRsZQlpdGVtSGFuZGxlOworICAgIFJlY3QJaXRlbUJveDsKKworICAgIEdldERpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaXRlbU51bWJlciwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJml0ZW1Cb3gpOworCisgICAgaWYgKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKQorCVNldENvbnRyb2xUaXRsZSAoKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIGl0ZW1OYW1lKTsKKyAgICBlbHNlCisJU2V0RGlhbG9nSXRlbVRleHQgKGl0ZW1IYW5kbGUsIGl0ZW1OYW1lKTsKK30KKworICAgIGludAorZ3VpX21jaF9kaWFsb2coCisgICAgaW50CQl0eXBlLAorICAgIGNoYXJfdQkqdGl0bGUsCisgICAgY2hhcl91CSptZXNzYWdlLAorICAgIGNoYXJfdQkqYnV0dG9ucywKKyAgICBpbnQJCWRmbHRidXR0b24sCisgICAgY2hhcl91CSp0ZXh0ZmllbGQpCit7CisgICAgSGFuZGxlCWJ1dHRvbkRJVEw7CisgICAgSGFuZGxlCWljb25ESVRMOworICAgIEhhbmRsZQlpbnB1dERJVEw7CisgICAgSGFuZGxlCW1lc3NhZ2VESVRMOworICAgIEhhbmRsZQlpdGVtSGFuZGxlOworICAgIEhhbmRsZQlpY29uSGFuZGxlOworICAgIERpYWxvZ1B0cgl0aGVEaWFsb2c7CisgICAgY2hhcl91CWxlbjsKKyAgICBjaGFyX3UJUGFzY2FsVGl0bGVbMjU2XTsJLyogcGxhY2UgaG9sZGVyIGZvciB0aGUgdGl0bGUgKi8KKyAgICBjaGFyX3UJbmFtZVsyNTZdOworICAgIEdyYWZQdHIJb2xkUG9ydDsKKyAgICBzaG9ydAlpdGVtSGl0OworICAgIGNoYXJfdQkqYnV0dG9uQ2hhcjsKKyAgICBSZWN0CWJveDsKKyAgICBzaG9ydAlidXR0b247CisgICAgc2hvcnQJbGFzdEJ1dHRvbjsKKyAgICBzaG9ydAlpdGVtVHlwZTsKKyAgICBzaG9ydAl1c2VJY29uOworICAgIHNob3J0CXdpZHRoOworICAgIHNob3J0CXRvdGFsQnV0dG9uV2lkdGggPSAwOyAgIC8qIHRoZSB3aWR0aCBvZiBhbGwgYnV0dG9uIHRvZ2V0aGVyIGluY3VkaW5nIHNwYWNpbmcgKi8KKyAgICBzaG9ydAl3aWRlc3RCdXR0b24gPSAwOworICAgIHNob3J0CWRmbHRCdXR0b25FZGdlICAgICA9IDIwOyAgLyogZ3V0IGZlZWxpbmcgKi8KKyAgICBzaG9ydAlkZmx0RWxlbWVudFNwYWNpbmcgPSAxMzsgIC8qIGZyb20gSU06Vi4yLTI5ICovCisgICAgc2hvcnQgICAgICAgZGZsdEljb25TaWRlU3BhY2UgID0gMjM7ICAvKiBmcm9tIElNOlYuMi0yOSAqLworICAgIHNob3J0CW1heGltdW1XaWR0aCAgICAgICA9IDQwMDsgLyogZ3V0IGZlZWxpbmcgKi8KKyAgICBzaG9ydAltYXhCdXR0b25XaWR0aAkgICA9IDE3NTsgLyogZ3V0IGZlZWxpbmcgKi8KKworICAgIHNob3J0CXZlcnRpY2FsOworICAgIHNob3J0CWRpYWxvZ0hlaWdodDsKKyAgICBzaG9ydAltZXNzYWdlTGluZXMgPSAzOworICAgIEZvbnRJbmZvCXRleHRGb250SW5mbzsKKworICAgIHZnbURsZ0l0bSAgIGljb25JdG07CisgICAgdmdtRGxnSXRtICAgbWVzc2FnZUl0bTsKKyAgICB2Z21EbGdJdG0gICBpbnB1dEl0bTsKKyAgICB2Z21EbGdJdG0gICBidXR0b25JdG07CisKKyAgICBXaW5kb3dSZWYJdGhlV2luZG93OworCisgICAgLyogQ2hlY2sgJ3YnIGZsYWcgaW4gJ2d1aW9wdGlvbnMnOiB2ZXJ0aWNhbCBidXR0b24gcGxhY2VtZW50LiAqLworICAgIHZlcnRpY2FsID0gKHZpbV9zdHJjaHIocF9nbywgR09fVkVSVElDQUwpICE9IE5VTEwpOworCisgICAgLyogQ3JlYXRlIGEgbmV3IERpYWxvZyBCb3ggZnJvbSB0ZW1wbGF0ZS4gKi8KKyAgICB0aGVEaWFsb2cgPSBHZXROZXdEaWFsb2cgKDEyOSwgbmlsLCAoV2luZG93UmVmKSAtMSk7CisKKyAgICAvKiBHZXQgdGhlIFdpbmRvd1JlZiAqLworICAgIHRoZVdpbmRvdyA9IEdldERpYWxvZ1dpbmRvdyh0aGVEaWFsb2cpOworCisgICAgLyogSGlkZSB0aGUgd2luZG93LgorICAgICAqIDEuIHRvIGF2b2lkIHNlZWluZyBzbG93IGRyYXdpbmcKKyAgICAgKiAyLiB0byBwcmV2ZW50IGEgcHJvYmxlbSBzZWVuIHdoaWxlIG1vdmluZyBkaWFsb2cgaXRlbQorICAgICAqICAgIHdpdGhpbiBhIHZpc2libGUgd2luZG93LiAobm9uLUNhcmJvbiBNYWNPUyA5KQorICAgICAqIENvdWxkIGJlIGF2b2lkZWQgYnkgY2hhbmdpbmcgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIEhpZGVXaW5kb3cgKHRoZVdpbmRvdyk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIGdyYXBoaWNhbCBwb3J0IHRvIHRoZSBkaWFsb2csCisgICAgICogc28gd2UgY2FuIG1lYXN1cmUgdGhlIHRleHQgd2l0aCB0aGUgcHJvcGVyIGZvbnQgKi8KKyAgICBHZXRQb3J0ICgmb2xkUG9ydCk7CisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICBTZXRQb3J0RGlhbG9nUG9ydCAodGhlRGlhbG9nKTsKKyNlbHNlCisgICAgU2V0UG9ydCAodGhlRGlhbG9nKTsKKyNlbmRpZgorCisgICAgLyogR2V0IHRoZSBpbmZvIGFib3V0IHRoZSBkZWZhdWx0IHRleHQsCisgICAgICogdXNlZCB0byBjYWxjdWxhdGUgdGhlIGhlaWdodCBvZiB0aGUgbWVzc2FnZQorICAgICAqIGFuZCBvZiB0aGUgIHRleHQgZmllbGQgKi8KKyAgICBHZXRGb250SW5mbygmdGV4dEZvbnRJbmZvKTsKKworICAgIC8qCVNldCB0aGUgZGlhbG9nIHRpdGxlICovCisgICAgaWYgKHRpdGxlICE9IE5VTEwpCisgICAgeworCSh2b2lkKSBDMlBhc2NhbFN0cmluZyAodGl0bGUsICZQYXNjYWxUaXRsZSk7CisJU2V0V1RpdGxlICh0aGVXaW5kb3csIFBhc2NhbFRpdGxlKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGVzIHRoZSBidXR0b25zIGFuZCBhZGQgdGhlbSB0byB0aGUgRGlhbG9nIEJveC4gKi8KKyAgICBidXR0b25ESVRMID0gR2V0UmVzb3VyY2UgKCdESVRMJywgMTMwKTsKKyAgICBidXR0b25DaGFyID0gYnV0dG9uczsKKyAgICBidXR0b24gPSAwOworCisgICAgZm9yICg7KmJ1dHRvbkNoYXIgIT0gMDspCisgICAgeworCS8qIEdldCB0aGUgbmFtZSBvZiB0aGUgYnV0dG9uICovCisJYnV0dG9uKys7CisJbGVuID0gMDsKKwlmb3IgKDsoKCpidXR0b25DaGFyICE9IERMR19CVVRUT05fU0VQKSAmJiAoKmJ1dHRvbkNoYXIgIT0gMCkgJiYgKGxlbiA8IDI1NSkpOyBidXR0b25DaGFyKyspCisJeworCSAgICBpZiAoKmJ1dHRvbkNoYXIgIT0gRExHX0hPVEtFWV9DSEFSKQorCQluYW1lWysrbGVuXSA9ICpidXR0b25DaGFyOworCX0KKwlpZiAoKmJ1dHRvbkNoYXIgIT0gMCkKKwkgIGJ1dHRvbkNoYXIrKzsKKwluYW1lWzBdID0gbGVuOworCisJLyogQWRkIHRoZSBidXR0b24gKi8KKwlBcHBlbmRESVRMICh0aGVEaWFsb2csIGJ1dHRvbkRJVEwsIG92ZXJsYXlESVRMKTsgLyogYXBwZW5kRElUTFJpZ2h0KTsgKi8KKworCS8qIENoYW5nZSB0aGUgYnV0dG9uJ3MgbmFtZSAqLworCW1hY1NldERpYWxvZ0l0ZW1UZXh0ICh0aGVEaWFsb2csIGJ1dHRvbiwgbmFtZSk7CisKKwkvKiBSZXNpemUgdGhlIGJ1dHRvbiB0byBmaXQgaXRzIG5hbWUgKi8KKwl3aWR0aCA9IFN0cmluZ1dpZHRoIChuYW1lKSArIDIgKiBkZmx0QnV0dG9uRWRnZTsKKwkvKiBMaW1pdGUgdGhlIHNpemUgb2YgYW55IGJ1dHRvbiB0byBhbiBhY2NlcHRhYmxlIHZhbHVlLiAqLworCS8qIFRPRE86IFNob3VsZCBiZSBiYXNlZCBvbiB0aGUgbWVzc2FnZSB3aWR0aCAqLworCWlmICh3aWR0aCA+IG1heEJ1dHRvbldpZHRoKQorCSAgICB3aWR0aCA9IG1heEJ1dHRvbldpZHRoOworCW1hY1NpemVEaWFsb2dJdGVtICh0aGVEaWFsb2csIGJ1dHRvbiwgd2lkdGgsIDApOworCisJdG90YWxCdXR0b25XaWR0aCArPSB3aWR0aDsKKworCWlmICh3aWR0aCA+IHdpZGVzdEJ1dHRvbikKKwkgICAgd2lkZXN0QnV0dG9uID0gd2lkdGg7CisgICAgfQorICAgIFJlbGVhc2VSZXNvdXJjZSAoYnV0dG9uRElUTCk7CisgICAgbGFzdEJ1dHRvbiA9IGJ1dHRvbjsKKworICAgIC8qIEFkZCB0aGUgaWNvbiB0byB0aGUgRGlhbG9nIEJveC4gKi8KKyAgICBpY29uSXRtLmlkeCA9IGxhc3RCdXR0b24gKyAxOworICAgIGljb25ESVRMID0gR2V0UmVzb3VyY2UgKCdESVRMJywgMTMxKTsKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworCWNhc2UgVklNX0dFTkVSSUM6ICB1c2VJY29uID0ga05vdGVJY29uOworCWNhc2UgVklNX0VSUk9SOiAgICB1c2VJY29uID0ga1N0b3BJY29uOworCWNhc2UgVklNX1dBUk5JTkc6ICB1c2VJY29uID0ga0NhdXRpb25JY29uOworCWNhc2UgVklNX0lORk86ICAgICB1c2VJY29uID0ga05vdGVJY29uOworCWNhc2UgVklNX1FVRVNUSU9OOiB1c2VJY29uID0ga05vdGVJY29uOworCWRlZmF1bHQ6ICAgICAgdXNlSWNvbiA9IGtTdG9wSWNvbjsKKyAgICB9OworICAgIEFwcGVuZERJVEwgKHRoZURpYWxvZywgaWNvbkRJVEwsIG92ZXJsYXlESVRMKTsKKyAgICBSZWxlYXNlUmVzb3VyY2UgKGljb25ESVRMKTsKKyAgICBHZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGljb25JdG0uaWR4LCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCAmYm94KTsKKyAgICAvKiBUT0RPOiBTaG91bGQgdGhlIGl0ZW0gYmUgZnJlZWQ/ICovCisgICAgaWNvbkhhbmRsZSA9IEdldEljb24gKHVzZUljb24pOworICAgIFNldERpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsIGl0ZW1UeXBlLCBpY29uSGFuZGxlLCAmYm94KTsKKworICAgIC8qIEFkZCB0aGUgbWVzc2FnZSB0byB0aGUgRGlhbG9nIGJveC4gKi8KKyAgICBtZXNzYWdlSXRtLmlkeCA9IGxhc3RCdXR0b24gKyAyOworICAgIG1lc3NhZ2VESVRMID0gR2V0UmVzb3VyY2UgKCdESVRMJywgMTMyKTsKKyAgICBBcHBlbmRESVRMICh0aGVEaWFsb2csIG1lc3NhZ2VESVRMLCBvdmVybGF5RElUTCk7CisgICAgUmVsZWFzZVJlc291cmNlIChtZXNzYWdlRElUTCk7CisgICAgR2V0RGlhbG9nSXRlbSAodGhlRGlhbG9nLCBtZXNzYWdlSXRtLmlkeCwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmJveCk7CisgICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nIChtZXNzYWdlLCAmbmFtZSk7CisgICAgU2V0RGlhbG9nSXRlbVRleHQgKGl0ZW1IYW5kbGUsIG5hbWUpOworICAgIG1lc3NhZ2VJdG0ud2lkdGggPSBTdHJpbmdXaWR0aCAobmFtZSk7CisKKyAgICAvKiBBZGQgdGhlIGlucHV0IGJveCBpZiBuZWVkZWQgKi8KKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCS8qIENoZWF0IGZvciBub3cgcmV1c2UgdGhlIG1lc3NhZ2UgYW5kIGNvbnZldCB0byB0ZXh0IGVkaXQgKi8KKwlpbnB1dEl0bS5pZHggPSBsYXN0QnV0dG9uICsgMzsKKwlpbnB1dERJVEwgPSBHZXRSZXNvdXJjZSAoJ0RJVEwnLCAxMzIpOworCUFwcGVuZERJVEwgKHRoZURpYWxvZywgaW5wdXRESVRMLCBvdmVybGF5RElUTCk7CisJUmVsZWFzZVJlc291cmNlIChpbnB1dERJVEwpOworCUdldERpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCAmYm94KTsKKy8qCSAgU2V0RGlhbG9nSXRlbSAodGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsIGtFZGl0VGV4dERpYWxvZ0l0ZW0sIGl0ZW1IYW5kbGUsICZib3gpOyovCisJKHZvaWQpIEMyUGFzY2FsU3RyaW5nICh0ZXh0ZmllbGQsICZuYW1lKTsKKwlTZXREaWFsb2dJdGVtVGV4dCAoaXRlbUhhbmRsZSwgbmFtZSk7CisJaW5wdXRJdG0ud2lkdGggPSBTdHJpbmdXaWR0aCAobmFtZSk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSA8RU5URVI+IGFuZCA8RVNDPiBidXR0b24uICovCisgICAgU2V0RGlhbG9nRGVmYXVsdEl0ZW0gKHRoZURpYWxvZywgZGZsdGJ1dHRvbik7CisgICAgU2V0RGlhbG9nQ2FuY2VsSXRlbSAodGhlRGlhbG9nLCAwKTsKKworICAgIC8qIFJlcG9zaXRpb24gZWxlbWVudCAqLworCisgICAgLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBmb3JjZSB2ZXJ0aWNhbCAqLworICAgIGlmICh0b3RhbEJ1dHRvbldpZHRoID4gbWF4aW11bVdpZHRoKQorCXZlcnRpY2FsID0gVFJVRTsKKworICAgIC8qIFBsYWNlIGljb24gKi8KKyAgICBtYWNNb3ZlRGlhbG9nSXRlbSAodGhlRGlhbG9nLCBpY29uSXRtLmlkeCwgZGZsdEljb25TaWRlU3BhY2UsIGRmbHRFbGVtZW50U3BhY2luZywgJmJveCk7CisgICAgaWNvbkl0bS5ib3gucmlnaHQgPSBib3gucmlnaHQ7CisgICAgaWNvbkl0bS5ib3guYm90dG9tID0gYm94LmJvdHRvbTsKKworICAgIC8qIFBsYWNlIE1lc3NhZ2UgKi8KKyAgICBtZXNzYWdlSXRtLmJveC5sZWZ0ID0gaWNvbkl0bS5ib3gucmlnaHQgKyBkZmx0SWNvblNpZGVTcGFjZTsKKyAgICBtYWNTaXplRGlhbG9nSXRlbSAodGhlRGlhbG9nLCBtZXNzYWdlSXRtLmlkeCwgMCwgIG1lc3NhZ2VMaW5lcyAqICh0ZXh0Rm9udEluZm8uYXNjZW50ICsgdGV4dEZvbnRJbmZvLmRlc2NlbnQpKTsKKyAgICBtYWNNb3ZlRGlhbG9nSXRlbSAodGhlRGlhbG9nLCBtZXNzYWdlSXRtLmlkeCwgbWVzc2FnZUl0bS5ib3gubGVmdCwgZGZsdEVsZW1lbnRTcGFjaW5nLCAmbWVzc2FnZUl0bS5ib3gpOworCisgICAgLyogUGxhY2UgSW5wdXQgKi8KKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCWlucHV0SXRtLmJveC5sZWZ0ID0gbWVzc2FnZUl0bS5ib3gubGVmdDsKKwlpbnB1dEl0bS5ib3gudG9wICA9IG1lc3NhZ2VJdG0uYm94LmJvdHRvbSArIGRmbHRFbGVtZW50U3BhY2luZzsKKwltYWNTaXplRGlhbG9nSXRlbSAodGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsIDAsIHRleHRGb250SW5mby5hc2NlbnQgKyB0ZXh0Rm9udEluZm8uZGVzY2VudCk7CisJbWFjTW92ZURpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBpbnB1dEl0bS5ib3gubGVmdCwgaW5wdXRJdG0uYm94LnRvcCwgJmlucHV0SXRtLmJveCk7CisJLyogQ29udmVydCB0aGUgc3RhdGljIHRleHQgaW50byBhIHRleHQgZWRpdC4KKwkgKiBGb3Igc29tZSByZWFzb24gdGhpcyBjaGFuZ2UgbmVlZCB0byBiZSBkb25lIGxhc3QgKERhbnkpICovCisJR2V0RGlhbG9nSXRlbSAodGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZpbnB1dEl0bS5ib3gpOworCVNldERpYWxvZ0l0ZW0gKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBrRWRpdFRleHREaWFsb2dJdGVtLCBpdGVtSGFuZGxlLCAmaW5wdXRJdG0uYm94KTsKKwlTZWxlY3REaWFsb2dJdGVtVGV4dCh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgMCwgMzI3NjcpOworICAgIH0KKworICAgIC8qIFBsYWNlIEJ1dHRvbiAqLworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKyAgICB7CisJYnV0dG9uSXRtLmJveC5sZWZ0ID0gaW5wdXRJdG0uYm94LmxlZnQ7CisJYnV0dG9uSXRtLmJveC50b3AgID0gaW5wdXRJdG0uYm94LmJvdHRvbSArIGRmbHRFbGVtZW50U3BhY2luZzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlidXR0b25JdG0uYm94LmxlZnQgPSBtZXNzYWdlSXRtLmJveC5sZWZ0OworCWJ1dHRvbkl0bS5ib3gudG9wICA9IG1lc3NhZ2VJdG0uYm94LmJvdHRvbSArIGRmbHRFbGVtZW50U3BhY2luZzsKKyAgICB9CisKKyAgICBmb3IgKGJ1dHRvbj0xOyBidXR0b24gPD0gbGFzdEJ1dHRvbjsgYnV0dG9uKyspCisgICAgeworCisJbWFjTW92ZURpYWxvZ0l0ZW0gKHRoZURpYWxvZywgYnV0dG9uLCBidXR0b25JdG0uYm94LmxlZnQsIGJ1dHRvbkl0bS5ib3gudG9wLCAmYm94KTsKKwkvKiBXaXRoIHZlcnRpY2FsLCBpdCdzIGJldHRlciB0byBoYXZlIGFsbCBidXR0b24gdGhlIHNhbWUgbGVuZ2h0ICovCisJaWYgKHZlcnRpY2FsKQorCXsKKwkgICAgbWFjU2l6ZURpYWxvZ0l0ZW0gKHRoZURpYWxvZywgYnV0dG9uLCB3aWRlc3RCdXR0b24sIDApOworCSAgICBHZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGJ1dHRvbiwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmJveCk7CisJfQorCS8qIENhbGN1bGF0ZSBwb3NpdGlvbiBvZiBuZXh0IGJ1dHRvbiAqLworCWlmICh2ZXJ0aWNhbCkKKwkgICAgYnV0dG9uSXRtLmJveC50b3AgID0gYm94LmJvdHRvbSArIGRmbHRFbGVtZW50U3BhY2luZzsKKwllbHNlCisJICAgIGJ1dHRvbkl0bS5ib3gubGVmdCAgPSBib3gucmlnaHQgKyBkZmx0RWxlbWVudFNwYWNpbmc7CisgICAgfQorCisgICAgLyogUmVzaXplIHRoZSBkaWFsb2cgYm94ICovCisgICAgZGlhbG9nSGVpZ2h0ID0gYm94LmJvdHRvbSArIGRmbHRFbGVtZW50U3BhY2luZzsKKyAgICBTaXplV2luZG93KHRoZVdpbmRvdywgbWF4aW11bVdpZHRoLCBkaWFsb2dIZWlnaHQsIFRSVUUpOworCisjaWZkZWYgVVNFX0NBUkJPTklaRUQKKyAgICAvKiBNYWdpYyByZXNpemUgKi8KKyAgICBBdXRvU2l6ZURpYWxvZyAodGhlRGlhbG9nKTsKKyAgICAvKiBOZWVkIGEgaG9yaXpvbnRhbCByZXNpemUgYW55d2F5IHNvIG5vdCB0aGF0IHVzZWZ1bCAqLworI2VuZGlmCisKKyAgICAvKiBEaXNwbGF5IGl0ICovCisgICAgU2hvd1dpbmRvdyh0aGVXaW5kb3cpOworLyogIEJyaW5nVG9Gcm9udCh0aGVXaW5kb3cpOyAqLworICAgIFNlbGVjdFdpbmRvdyh0aGVXaW5kb3cpOworCisvKiAgRHJhd0RpYWxvZyAodGhlRGlhbG9nKTsgKi8KKyNpZiAwCisgICAgR2V0UG9ydCAoJm9sZFBvcnQpOworI2lmZGVmIFVTRV9DQVJCT05JWkVECisgICAgU2V0UG9ydERpYWxvZ1BvcnQgKHRoZURpYWxvZyk7CisjZWxzZQorICAgIFNldFBvcnQgKHRoZURpYWxvZyk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyogSGFuZyB1bnRpbCBvbmUgb2YgdGhlIGJ1dHRvbiBpcyBoaXQgKi8KKyAgICBkbworICAgIHsKKwlNb2RhbERpYWxvZyAobmlsLCAmaXRlbUhpdCk7CisgICAgfSB3aGlsZSAoKGl0ZW1IaXQgPCAxKSB8fCAoaXRlbUhpdCA+IGxhc3RCdXR0b24pKTsKKworICAgIC8qIENvcHkgYmFjayB0aGUgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGludG8gdGhlIHBhcmFtICovCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorICAgIHsKKwlHZXREaWFsb2dJdGVtICh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmJveCk7CisJR2V0RGlhbG9nSXRlbVRleHQgKGl0ZW1IYW5kbGUsIChjaGFyX3UgKikgJm5hbWUpOworI2lmIElPU0laRSA8IDI1NgorCS8qIFRydW5jYXRlIHRoZSBuYW1lIHRvIElPU0laRSBpZiBuZWVkZWQgKi8KKwlpZiAobmFtZVswXSA+IElPU0laRSkKKwkgICAgbmFtZVswXSA9IElPU0laRSAtIDE7CisjZW5kaWYKKwlTVFJOQ1BZKHRleHRmaWVsZCwgJm5hbWVbMV0sIG5hbWVbMF0pOworCXRleHRmaWVsZFtuYW1lWzBdXSA9IE5VTDsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBncmFwaGljYWwgcG9ydCAqLworICAgIFNldFBvcnQgKG9sZFBvcnQpOworCisgICAgLyogR2V0IHJpZGUgb2YgdGggZWRpYWxvZyAoZnJlZSBtZW1vcnkpICovCisgICAgRGlzcG9zZURpYWxvZyAodGhlRGlhbG9nKTsKKworICAgIHJldHVybiBpdGVtSGl0OworLyoKKyAqIFVzZWZ1bGwgdGhpbmcgd2hpY2ggY291bGQgYmUgdXNlZAorICogU2V0RGlhbG9nVGltZW91dCgpOiBBdXRvIGNsaWNrIGEgYnV0dG9uIGFmdGVyIHRpbWVvdXQKKyAqIFNldERpYWxvZ1RyYWNrc0N1cnNvcigpIDogR2V0IHRoZSBJLWJlYW0gY3Vyc29yIG92ZXIgaW5wdXQgYm94CisgKiBNb3ZlRGlhbG9nSXRlbSgpOgkgICAgUHJvYmFibHkgYmV0dGVyIHRoYW4gU2V0RGlhbG9nSXRlbQorICogU2l6ZURpYWxvZ0l0ZW0oKToJCShidXQgaXMgaXQgQ2FyYm9uIE9ubHk/KQorICogQXV0b1NpemVEaWFsb2coKToJICAgIE1hZ2ljIHJlc2l6ZSBvZiBkaWFsb2cgYmFzZWQgb24gdGV4dCBsZW5naHQKKyAqLworfQorI2VuZGlmIC8qIEZFQVRfRElBTE9HX0dVSSAqLworCisvKgorICogRGlzcGxheSB0aGUgc2F2ZWQgZXJyb3IgbWVzc2FnZShzKS4KKyAqLworI2lmZGVmIFVTRV9NQ0hfRVJSTVNHCisgICAgdm9pZAorZGlzcGxheV9lcnJvcnMoKQoreworICAgIGNoYXIJKnA7CisgICAgY2hhcl91CXBFcnJvclsyNTZdOworCisgICAgaWYgKGVycm9yX2dhLmdhX2RhdGEgIT0gTlVMTCkKKyAgICB7CisJLyogYXZvaWQgcHV0dGluZyB1cCBhIG1lc3NhZ2UgYm94IHdpdGggYmxhbmtzIG9ubHkgKi8KKwlmb3IgKHAgPSAoY2hhciAqKWVycm9yX2dhLmdhX2RhdGE7ICpwOyArK3ApCisJICAgIGlmICghaXNzcGFjZSgqcCkpCisJICAgIHsKKwkJaWYgKFNUUkxFTihwKSA+IDI1NSkKKwkJICAgIHBFcnJvclswXSA9IDI1NTsKKwkJZWxzZQorCQkgICAgcEVycm9yWzBdID0gU1RSTEVOKHApOworCisJCVNUUk5DUFkoJnBFcnJvclsxXSwgcCwgcEVycm9yWzBdKTsKKwkJUGFyYW1UZXh0IChwRXJyb3IsIG5pbCwgbmlsLCBuaWwpOworCQlBbGVydCAoMTI4LCBuaWwpOworCQlicmVhazsKKwkJLyogVE9ETzogaGFuZGxlZCBtZXNzYWdlIGxvbmdlciB0aGFuIDI1NiBjaGFycworCQkgKgkgdXNlIGF1dG8tc2l6ZWFibGUgYWxlcnQKKwkJICoJIG9yIGRpYWxvZyB3aXRoIHNjcm9sbGJhcnMgKFRleHRFZGl0IHpvbmUpCisJCSAqLworCSAgICB9CisJZ2FfY2xlYXIoJmVycm9yX2dhKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCBjdXJyZW50IHkgbW91c2UgY29vcmRpbmF0ZSBpbiB0ZXh0IHdpbmRvdy4KKyAqIFJldHVybiAtMSB3aGVuIHVua25vd24uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3goKQoreworICAgIFBvaW50IHdoZXJlOworCisgICAgR2V0TW91c2UoJndoZXJlKTsKKworICAgIHJldHVybiAod2hlcmUuaCk7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3koKQoreworICAgIFBvaW50IHdoZXJlOworCisgICAgR2V0TW91c2UoJndoZXJlKTsKKworICAgIHJldHVybiAod2hlcmUudik7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldG1vdXNlKHgsIHkpCisgICAgaW50CQl4OworICAgIGludAkJeTsKK3sKKyAgICAvKiBUT0RPICovCisjaWYgMAorICAgIC8qIEZyb20gRkFRIDMtMTEgKi8KKworICAgIEN1cnNvckRldmljZVB0ciBteU1vdXNlOworICAgIFBvaW50CSAgICB3aGVyZTsKKworICAgIGlmICggICBOR2V0VHJhcEFkZHJlc3MgKF9DdXJzb3JEZXZpY2VEaXNwYXRjaCwgVG9vbFRyYXApCisJIT0gTkdldFRyYXBBZGRyZXNzIChfVW5pbXBsZW1lbnRlZCwgICBUb29sVHJhcCkgKQorICAgIHsKKwkvKiBOZXcgd2F5ICovCisKKwkvKgorCSAqIEdldCBmaXJzdCBkZXZvaWNlIHdpdGggb25lIGJ1dHRvbi4KKwkgKiBUaGlzIHdpbGwgcHJvYmFibHkgYmUgdGhlIHN0YW5kYWQgbW91c2UKKwkgKiBzdGFydGF0IGhlYWQgb2YgY3Vyc29yIGRldiBsaXN0CisJICoKKwkgKi8KKworCW15TW91c2UgPSBuaWw7CisKKwlkbworCXsKKwkgICAgLyogR2V0IHRoZSBuZXh0IGN1cnNvciBkZXZpY2UgKi8KKwkgICAgQ3Vyc29yRGV2aWNlTmV4dERldmljZSgmbXlNb3VzZSk7CisJfQorCXdoaWxlICggKG15TW91c2UgIT0gbmlsKSAmJiAobXlNb3VzZS0+Y250QnV0dG9ucyAhPSAxKSApOworCisJQ3Vyc29yRGV2aWNlTW92ZVRvIChteU1vdXNlLCB4LCB5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBPbGQgd2F5ICovCisJd2hlcmUuaCA9IHg7CisJd2hlcmUudiA9IHk7CisKKwkqKFBvaW50ICopUmF3TW91c2UgPSB3aGVyZTsKKwkqKFBvaW50ICopTVRlbXAgICAgPSB3aGVyZTsKKwkqKFB0cikgICAgQ3Jzck5ldyAgPSAweEZGRkY7CisgICAgfQorI2VuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX3Nob3dfcG9wdXBtZW51KG1lbnUpCisgICAgdmltbWVudV9UICptZW51OworeworI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCisvKgorICogIENsb25lIFBvcFVwIHRvIHVzZSBtZW51CisgKiAgQ3JlYXRlIGEgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbgorICogIENhbGwgdGhlIHByb2NlZHVyZQorICovCisKKyAgICBNZW51SGFuZGxlCUNudHhNZW51OworICAgIFBvaW50CXdoZXJlOworICAgIE9TU3RhdHVzCXN0YXR1czsKKyAgICBVSW50MzIJQ250eFR5cGU7CisgICAgU0ludDE2CUNudHhNZW51SUQ7CisgICAgVUludDE2CUNudHhNZW51SXRlbTsKKyAgICBTdHIyNTUJSGVscE5hbWUgPSAiIjsKKyAgICBHcmFmUHRyCXNhdmVQb3J0OworCisgICAgLyogU2F2ZSBDdXJyZW50IFBvcnQ6IE9uIE1hY09TIFggd2Ugc2VlbSB0byBsb3NlIHRoZSBwb3J0ICovCisgICAgR2V0UG9ydCAoJnNhdmVQb3J0KTsgLypPU1gqLworCisgICAgR2V0TW91c2UgKCZ3aGVyZSk7CisgICAgTG9jYWxUb0dsb2JhbCAoJndoZXJlKTsgLypPU1gqLworICAgIENudHhNZW51ID0gbWVudS0+c3VibWVudV9oYW5kbGU7CisKKyAgICAvKiBUT0RPOiBHZXQgdGhlIHRleHQgc2VsZWN0aW9uIGZyb20gVmltICovCisKKyAgICAvKiBDYWxsIHRvIEhhbmRsZSBQb3B1cCAqLworICAgIHN0YXR1cyA9IENvbnRleHR1YWxNZW51U2VsZWN0KENudHhNZW51LCB3aGVyZSwgZmFsc2UsIGtDTUhlbHBJdGVtTm9IZWxwLCBIZWxwTmFtZSwgTlVMTCwgJkNudHhUeXBlLCAmQ250eE1lbnVJRCwgJkNudHhNZW51SXRlbSk7CisKKyAgICBpZiAoc3RhdHVzID09IG5vRXJyKQorICAgIHsKKwlpZiAoQ250eFR5cGUgPT0ga0NNTWVudUl0ZW1TZWxlY3RlZCkKKwl7CisJICAgIC8qIEhhbmRsZSB0aGUgbWVudSBDbnR4TWVudUlELCBDbnR4TWVudUl0ZW0gKi8KKwkgICAgLyogVGhlIHN1Ym1lbnUgY2FuIGJlIGhhbmRsZSBkaXJlY3RseSBieSBndWlfbWFjX2hhbmRsZV9tZW51ICovCisJICAgIC8qIEJ1dCB3aGF0IGFib3V0IHRoZSBjdXJyZW50IG1lbnUsIGlzIHRoZSBtZW51IGNoYW5nZWQgYnkgQ29udGV4dHVhbE1lbnVTZWxlY3QgKi8KKwkgICAgZ3VpX21hY19oYW5kbGVfbWVudSAoKENudHhNZW51SUQgPDwgMTYpICsgQ250eE1lbnVJdGVtKTsKKwl9CisJZWxzZSBpZiAoQ250eE1lbnVJRCA9PSBrQ01TaG93SGVscFNlbGVjdGVkKQorCXsKKwkgICAgLyogU2hvdWxkIGNvbWUgdXAgd2l0aCB0aGUgaGVscCAqLworCX0KKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIFBvcnQgKi8KKyAgICBTZXRQb3J0IChzYXZlUG9ydCk7IC8qT1NYKi8KKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX0NXX0VESVRPUikgfHwgZGVmaW5lZChQUk9UTykKKy8qIFRPRE86IElzIGl0IG5lZWQgZm9yIE1BQ09TX1g/IChEYW55KSAqLworICAgIHZvaWQKK21jaF9wb3N0X2J1ZmZlcl93cml0ZShidWZfVCAqYnVmKQoreworIyBpZmRlZiBVU0VfU0lPVVgKKyAgICBwcmludGYgKCJXcml0aW5nIEJ1Zi4uLlxuIik7CisjIGVuZGlmCisgICAgR2V0RlNTcGVjRnJvbVBhdGggKGJ1Zi0+Yl9mZm5hbWUsICZidWYtPmJfRlNTcGVjKTsKKyAgICBTZW5kX0tBSExfTU9EX0FFIChidWYpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1RJVExFCisvKgorICogU2V0IHRoZSB3aW5kb3cgdGl0bGUgYW5kIGljb24uCisgKiAoVGhlIGljb24gaXMgbm90IHRha2VuIGNhcmUgb2YpLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXR0aXRsZSh0aXRsZSwgaWNvbikKKyAgICBjaGFyX3UgKnRpdGxlOworICAgIGNoYXJfdSAqaWNvbjsKK3sKKyAgICAvKiBUT0RPOiBHZXQgdmltIHRvIG1ha2Ugc3VyZSBtYXhsZW4gKGZyb20gcF90aXRsZWxlbikgaXMgc21hbGxlcgorICAgICAqICAgICAgIHRoYXQgMjU2LiBFdmVuIGJldHRlciBnZXQgaXQgdG8gZml0IG5pY2VseSBpbiB0aGUgdGl0bGViYXIuCisgICAgICovCisgICAgY2hhcl91ICAgKnBhc2NhbFRpdGxlOworCisgICAgaWYgKHRpdGxlID09IE5VTEwpCQkvKiBub3RoaW5nIHRvIGRvICovCisJcmV0dXJuOworCisgICAgcGFzY2FsVGl0bGUgPSBDMlBhc2NhbF9zYXZlKHRpdGxlKTsKKyAgICBpZiAocGFzY2FsVGl0bGUgIT0gTlVMTCkKKyAgICB7CisJU2V0V1RpdGxlKGd1aS5WaW1XaW5kb3csIHBhc2NhbFRpdGxlKTsKKwl2aW1fZnJlZShwYXNjYWxUaXRsZSk7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBUcmFuc2ZlcmVkIGZyb20gb3NfbWFjLmMgZm9yIE1hY09TIFggdXNpbmcgb3NfdW5peC5jIHByZXAgd29yaworICovCisKKyAgICBpbnQKK0MyUGFzY2FsU3RyaW5nIChDU3RyaW5nLCBQYXNjYWxTdHJpbmcpCisgICAgY2hhcl91ICAqQ1N0cmluZzsKKyAgICBTdHIyNTUgICpQYXNjYWxTdHJpbmc7Cit7CisgICAgY2hhcl91ICpQYXNjYWxQdHIgPSAoY2hhcl91ICopIFBhc2NhbFN0cmluZzsKKyAgICBpbnQgICAgbGVuOworICAgIGludCAgICBpOworCisgICAgUGFzY2FsUHRyWzBdID0gMDsKKyAgICBpZiAoQ1N0cmluZyA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgbGVuID0gU1RSTEVOKENTdHJpbmcpOworICAgIGlmIChsZW4gPiAyNTUpCisJbGVuID0gMjU1OworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCVBhc2NhbFB0cltpKzFdID0gQ1N0cmluZ1tpXTsKKworICAgIFBhc2NhbFB0clswXSA9IGxlbjsKKworICAgIHJldHVybiAwOworfQorCisgICAgaW50CitHZXRGU1NwZWNGcm9tUGF0aCAoZmlsZSwgZmlsZUZTU3BlYykKKyAgICBjaGFyX3UgKmZpbGU7CisgICAgRlNTcGVjICpmaWxlRlNTcGVjOworeworICAgIC8qIEZyb20gRkFRIDgtMTIgKi8KKyAgICBTdHIyNTUgICAgICBmaWxlUGFzY2FsOworICAgIENJbmZvUEJSZWMJbXlDUEI7CisgICAgT1NFcnIJZXJyOworCisgICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nIChmaWxlLCAmZmlsZVBhc2NhbCk7CisKKyAgICBteUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZmlsZVBhc2NhbDsKKyAgICBteUNQQi5kaXJJbmZvLmlvVlJlZk51bSAgID0gMDsKKyAgICBteUNQQi5kaXJJbmZvLmlvRkRpckluZGV4ID0gMDsKKyAgICBteUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gMDsKKworICAgIGVycj0gUEJHZXRDYXRJbmZvICgmbXlDUEIsIGZhbHNlKTsKKworICAgIC8qICAgIHZSZWZOdW0sIGRpcklELCBuYW1lICovCisgICAgRlNNYWtlRlNTcGVjICgwLCAwLCBmaWxlUGFzY2FsLCBmaWxlRlNTcGVjKTsKKworICAgIC8qIFRPRE86IFVzZSBhbiBlcnJvciBjb2RlIG1lY2hhbmlzbSAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogQ29udmVydCBhIEZTU3BlYyB0byBhIGZ1aWxsIHBhdGgKKyAqLworCitjaGFyX3UgKkZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlIChGU1NwZWMgZmlsZSkKK3sKKyAgICAvKgorICAgICAqIFRPRE86IEFkZCBwcm90ZWN0aW9uIGZvciAyNTYgY2hhciBtYXguCisgICAgICovCisKKyAgICBDSW5mb1BCUmVjCXRoZUNQQjsKKyAgICBjaGFyX3UJZm5hbWVbMjU2XTsKKyAgICBjaGFyX3UJKmZpbGVuYW1lUHRyID0gZm5hbWU7CisgICAgT1NFcnIJZXJyb3I7CisgICAgaW50CQlmb2xkZXIgPSAxOworI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICBTSW50MTYJZGZsdFZvbF92UmVmTnVtOworICAgIFNJbnQzMglkZmx0Vm9sX2RpcklEOworICAgIEZTUmVmCXJlZkZpbGU7CisgICAgT1NTdGF0dXMJc3RhdHVzOworICAgIFVJbnQzMglwYXRoU2l6ZSA9IDI1NjsKKyAgICBjaGFyX3UJcGF0aG5hbWVbMjU2XTsKKyAgICBjaGFyX3UJKnBhdGggPSBwYXRobmFtZTsKKyNlbHNlCisgICAgU3RyMjU1CWRpcmVjdG9yeU5hbWU7CisgICAgY2hhcl91CXRlbXBvcmFyeVsyNTVdOworICAgIGNoYXJfdQkqdGVtcG9yYXJ5UHRyID0gdGVtcG9yYXJ5OworI2VuZGlmCisKKyNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCisgICAgLyogR2V0IHRoZSBkZWZhdWx0IHZvbHVtZSAqLworICAgIC8qIFRPRE86IFJlbW92ZSBhcyB0aGlzIG9ubHkgd29yayBpZiBWaW0gaXMgb24gdGhlIEJvb3QgVm9sdW1lKi8KKyAgICBlcnJvcj1IR2V0Vm9sICggTlVMTCwgJmRmbHRWb2xfdlJlZk51bSwgJmRmbHRWb2xfZGlySUQgKTsKKworICAgIGlmIChlcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisKKyAgICAvKiBTdGFydCBmaWxsaW5nIGZuYW1lIHdpdGggZmlsZS5uYW1lICAqLworICAgIFNUUk5DUFkoZmlsZW5hbWVQdHIsICZmaWxlLm5hbWVbMV0sIGZpbGUubmFtZVswXSk7CisgICAgZmlsZW5hbWVQdHJbZmlsZS5uYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKworICAgIC8qIEdldCB0aGUgaW5mbyBhYm91dCB0aGUgZmlsZSBzcGVjaWZpZWQgaW4gRlNTcGVjICovCisgICAgdGhlQ1BCLmRpckluZm8uaW9GRGlySW5kZXggPSAwOworICAgIHRoZUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZmlsZS5uYW1lOworICAgIHRoZUNQQi5kaXJJbmZvLmlvVlJlZk51bSAgID0gZmlsZS52UmVmTnVtOworICAvKnRoZUNQQi5oRmlsZUluZm8uaW9EaXJJRCAgID0gMDsqLworICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gZmlsZS5wYXJJRDsKKworICAgIC8qIEFzIGlvRkRpckluZGV4ID0gMCwgZ2V0IHRoZSBpbmZvIG9mIGlvTmFtZVB0ciwKKyAgICAgICB3aGljaCBpcyByZWxhdGl2ZSB0byBpb1ZyZWZOdW0sIGlvRGlySUQgKi8KKyAgICBlcnJvciA9IFBCR2V0Q2F0SW5mbyAoJnRoZUNQQiwgZmFsc2UpOworCisgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBmb3IgYSBuZXcgZmlsZSB3ZSBleHBlY3QgZm5mRXJyICovCisgICAgaWYgKChlcnJvcikgJiYgKGVycm9yICE9IGZuZkVycikpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIENoZWNrIGlmIGl0J3MgYSBmaWxlIG9yIGZvbGRlciAgICAgICAqLworICAgIC8qIGRlZmF1bHQgdG8gZmlsZSBpZiBmaWxlIGRvbid0IGV4aXN0ICAqLworICAgIGlmICgoKHRoZUNQQi5oRmlsZUluZm8uaW9GbEF0dHJpYiAmIGlvRGlyTWFzaykgPT0gMCkgfHwgKGVycm9yKSkKKyAgICAgIGZvbGRlciA9IDA7IC8qIEl0J3Mgbm90IGEgZm9sZGVyICovCisgICAgZWxzZQorICAgICAgZm9sZGVyID0gMTsKKworI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICAvKgorICAgICAqIFRoZSBmdW5jdGlvbiB1c2VkIGhlcmUgYXJlIGF2YWlsYWJsZSBpbiBDYXJib24sIGJ1dAorICAgICAqIGRvIG5vdGhpbmcgdW5lIE1hY09TIDggYW5kIDkKKyAgICAgKi8KKyAgICBpZiAoZXJyb3IgPT0gZm5mRXJyKQorICAgIHsKKwkvKiBJZiB0aGUgZmlsZSB0byBiZSBzYXZlZCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCBpc24ndCBwb3NzaWJsZQorCSAgIHRvIGNvbnZlcnQgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAgQnV0IHdlIGNhbiBjb25zdHJ1Y3QgYW4KKwkgICBGU1NwZWMgZm9yIHRoZSBmaWxlJ3MgcGFyZW50IGZvbGRlciAoc2luY2Ugd2UgaGF2ZSBpdHMgdm9sdW1lIGFuZAorCSAgIGRpcmVjdG9yeSBJRHMpLCBhbmQgc2luY2UgdGhhdCBmb2xkZXIgZG9lcyBleGlzdCwgd2UgY2FuIGNvbnZlcnQKKwkgICB0aGF0IEZTU3BlYyBpbnRvIGFuIEZTUmVmLCBjb252ZXJ0IHRoZSBGU1JlZiBpbiB0dXJuIGludG8gYSBwYXRoLAorCSAgIGFuZCwgZmluYWxseSwgYXBwZW5kIHRoZSBmaWxlbmFtZS4gKi8KKwlGU1NwZWMgZGlyU3BlYzsKKwlGU1JlZiBkaXJSZWY7CisJU3RyMjU1IGVtcHR5RmlsZW5hbWUgPSAiXHAiOworCWVycm9yID0gRlNNYWtlRlNTcGVjKHRoZUNQQi5kaXJJbmZvLmlvVlJlZk51bSwKKwkgICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklELCBlbXB0eUZpbGVuYW1lLCAmZGlyU3BlYyk7CisJaWYgKGVycm9yKQorCSAgICByZXR1cm4gTlVMTDsKKworCWVycm9yID0gRlNwTWFrZUZTUmVmKCZkaXJTcGVjLCAmZGlyUmVmKTsKKwlpZiAoZXJyb3IpCisJICAgIHJldHVybiBOVUxMOworCisJc3RhdHVzID0gRlNSZWZNYWtlUGF0aCgmZGlyUmVmLCAoVUludDgqKXBhdGgsIHBhdGhTaXplKTsKKwlpZiAoc3RhdHVzKQorCSAgICByZXR1cm4gTlVMTDsKKworCVNUUkNBVChwYXRoLCAiLyIpOworCVNUUkNBVChwYXRoLCBmaWxlbmFtZVB0cik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogSWYgdGhlIGZpbGUgdG8gYmUgc2F2ZWQgYWxyZWFkeSBleGlzdHMsIHdlIGNhbiBnZXQgaXRzIGZ1bGwgcGF0aAorCSAgIGJ5IGNvbnZlcnRpbmcgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAqLworCWVycm9yPUZTcE1ha2VGU1JlZiAoJmZpbGUsICZyZWZGaWxlKTsKKwlpZiAoZXJyb3IpCisJICAgIHJldHVybiBOVUxMOworCisJc3RhdHVzPUZTUmVmTWFrZVBhdGggKCZyZWZGaWxlLCAoVUludDggKikgcGF0aCwgcGF0aFNpemUpOworCWlmIChzdGF0dXMpCisJICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEFkZCBhIHNsYXNoIGF0IHRoZSBlbmQgaWYgbmVlZGVkICovCisgICAgaWYgKGZvbGRlcikKKwlTVFJDQVQgKHBhdGgsICIvIik7CisKKyAgICByZXR1cm4gKHZpbV9zdHJzYXZlIChwYXRoKSk7CisjZWxzZQorICAgIC8qIFRPRE86IEdldCByaWQgb2YgYWxsIFVTRV9VTklYRklMRU5BTUUgYmVsb3cgKi8KKyAgICAvKiBTZXQgaW9OYW1lUHRyLCBpdCdzIHRoZSBzYW1lIGFyZWEgd2hpY2ggaXMgYWx3YXlzIHJldXNlZC4gKi8KKyAgICB0aGVDUEIuZGlySW5mby5pb05hbWVQdHIgPSBkaXJlY3RvcnlOYW1lOworCisgICAgLyogVHJpY2sgZm9yIGZpcnN0IGVudHJ5LCBzZXQgaW9EclBhcklEIHRvIHRoZSBmaXJzdCB2YWx1ZQorICAgICAqIHdlIHdhbnQgZm9yIGlvRHJEaXJJRCovCisgICAgdGhlQ1BCLmRpckluZm8uaW9EclBhcklEID0gZmlsZS5wYXJJRDsKKyAgICB0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgPSBmaWxlLnBhcklEOworCisgICAgaWYgKChUUlVFKSAmJiAoZmlsZS5wYXJJRCAhPSBmc1J0RGlySUQgLypmc1J0UGFySUQqLyApKQorICAgIGRvCisgICAgeworCXRoZUNQQi5kaXJJbmZvLmlvRkRpckluZGV4ID0gLTE7CisgICAgIC8qIHRoZUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZGlyZWN0b3J5TmFtZTsgQWxyZWFkeSBkb25lIGFib3ZlLiAqLworCXRoZUNQQi5kaXJJbmZvLmlvVlJlZk51bSAgID0gZmlsZS52UmVmTnVtOworICAgICAvKiB0aGVDUEIuZGlySW5mby5pb0RpcklEICAgICA9IGlycmV2ZWxhbnQgd2hlbiBpb0ZEaXJJbmRleCA9IC0xICovCisJdGhlQ1BCLmRpckluZm8uaW9EckRpcklEICAgPSB0aGVDUEIuZGlySW5mby5pb0RyUGFySUQ7CisKKwkvKiBBcyBpb0ZEaXJJbmRleCA9IC0xLCBnZXQgdGhlIGluZm8gb2YgaW9EckRpcklELCAqLworCS8qICAqaW9OYW1lUHRyWzAgVE8gMzFdIHdpbGwgYmUgdXBkYXRlZAkJICAgKi8KKwllcnJvciA9IFBCR2V0Q2F0SW5mbyAoJnRoZUNQQixmYWxzZSk7CisKKwlpZiAoZXJyb3IpCisJICByZXR1cm4gTlVMTDsKKworCS8qIFB1dCB0aGUgbmV3IGRpcmVjdG9yeU5hbWUgaW4gZnJvbnQgb2YgdGhlIGN1cnJlbnQgZm5hbWUgKi8KKwlTVFJDUFkodGVtcG9yYXJ5UHRyLCBmaWxlbmFtZVB0cik7CisJU1RSTkNQWShmaWxlbmFtZVB0ciwgJmRpcmVjdG9yeU5hbWVbMV0sIGRpcmVjdG9yeU5hbWVbMF0pOworCWZpbGVuYW1lUHRyW2RpcmVjdG9yeU5hbWVbMF1dID0gMDsgLyogTlVMTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCVNUUkNBVChmaWxlbmFtZVB0ciwgIjoiKTsKKwlTVFJDQVQoZmlsZW5hbWVQdHIsIHRlbXBvcmFyeVB0cik7CisgICAgfQorI2lmIDEgLyogZGVmIFVTRV9VTklYRklMRU5BTUUgKi8KKyAgICB3aGlsZSAoKHRoZUNQQi5kaXJJbmZvLmlvRHJQYXJJRCAhPSBmc1J0RGlySUQpIC8qICYmICovCisJIC8qICAodGhlQ1BCLmRpckluZm8uaW9EckRpcklEICE9IGZzUnREaXJJRCkqLyk7CisjZWxzZQorICAgIHdoaWxlICh0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgIT0gZnNSdERpcklEKTsKKyNlbmRpZgorCisgICAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdm9sdW1lIG9uIHdoaWNoIHRoZSBmaWxlIHJlc2lkZSAqLworICAgIHRoZUNQQi5kaXJJbmZvLmlvRkRpckluZGV4ID0gLTE7CisgLyogdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBkaXJlY3RvcnlOYW1lOyBBbHJlYWR5IGRvbmUgYWJvdmUuICovCisgICAgdGhlQ1BCLmRpckluZm8uaW9WUmVmTnVtICAgPSBmaWxlLnZSZWZOdW07CisgLyogdGhlQ1BCLmRpckluZm8uaW9EaXJJRCAgICAgPSBpcnJldmVsYW50IHdoZW4gaW9GRGlySW5kZXggPSAtMSAqLworICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gdGhlQ1BCLmRpckluZm8uaW9EclBhcklEOworCisgICAgLyogQXMgaW9GRGlySW5kZXggPSAtMSwgZ2V0IHRoZSBpbmZvIG9mIGlvRHJEaXJJRCwgKi8KKyAgICAvKgkqaW9OYW1lUHRyWzAgVE8gMzFdIHdpbGwgYmUgdXBkYXRlZAkgICAgICAgKi8KKyAgICBlcnJvciA9IFBCR2V0Q2F0SW5mbyAoJnRoZUNQQixmYWxzZSk7CisKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEZvciBNYWNPUyBDbGFzc2ljIGFsd2F5cyBhZGQgdGhlIHZvbHVtZSBuYW1lCSAgICAgKi8KKyAgICAvKiBGb3IgTWFjT1MgWCBhZGQgdGhlIHZvbHVtZSBuYW1lIHByZWNlZGVkIGJ5ICJWb2x1bWVzIiAqLworICAgIC8qCXdoZW4gd2UgYXJlIG5vdCByZWZlcmluZyB0byB0aGUgYm9vdCB2b2x1bWUJICAgICAqLworI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICBpZiAoZmlsZS52UmVmTnVtICE9IGRmbHRWb2xfdlJlZk51bSkKKyNlbmRpZgorICAgIHsKKwkvKiBBZGQgdGhlIHZvbHVtZSBuYW1lICovCisJU1RSQ1BZKHRlbXBvcmFyeVB0ciwgZmlsZW5hbWVQdHIpOworCVNUUk5DUFkoZmlsZW5hbWVQdHIsICZkaXJlY3RvcnlOYW1lWzFdLCBkaXJlY3RvcnlOYW1lWzBdKTsKKwlmaWxlbmFtZVB0cltkaXJlY3RvcnlOYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwlTVFJDQVQoZmlsZW5hbWVQdHIsICI6Iik7CisJU1RSQ0FUKGZpbGVuYW1lUHRyLCB0ZW1wb3JhcnlQdHIpOworCisjaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQorCVNUUkNQWSh0ZW1wb3JhcnlQdHIsIGZpbGVuYW1lUHRyKTsKKwlmaWxlbmFtZVB0clswXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwlTVFJDQVQoZmlsZW5hbWVQdHIsICJWb2x1bWVzOiIpOworCVNUUkNBVChmaWxlbmFtZVB0ciwgdGVtcG9yYXJ5UHRyKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIEFwcGVuZCBmaW5hbCBwYXRoIHNlcGFyYXRvciBpZiBpdCdzIGEgZm9sZGVyICovCisgICAgaWYgKGZvbGRlcikKKwlTVFJDQVQgKGZuYW1lLCAiOiIpOworCisgICAgLyogQXMgd2UgdXNlIFVuaXggRmlsZSBOYW1lIGZvciBNYWNPUyBYIGNvbnZlcnQgaXQgKi8KKyNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCisgICAgLyogTmVlZCB0byBpbnNlcnQgbGVhZGluZyAvICovCisgICAgLyogVE9ETzogZ2V0IHRoZSBhYm92ZSBjb2RlIHRvIHVzZSBkaXJlY3RseSB0aGUgLyAqLworICAgIFNUUkNQWSgmdGVtcG9yYXJ5UHRyWzFdLCBmaWxlbmFtZVB0cik7CisgICAgdGVtcG9yYXJ5UHRyWzBdID0gJy8nOworICAgIFNUUkNQWShmaWxlbmFtZVB0ciwgdGVtcG9yYXJ5UHRyKTsKKyAgICB7CisgICAgY2hhcgkqcDsKKyAgICBmb3IgKHAgPSBmbmFtZTsgKnA7IHArKykKKwlpZiAoKnAgPT0gJzonKQorCSAgICAqcCA9ICcvJzsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAodmltX3N0cnNhdmUgKGZuYW1lKSk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoVVNFX0lNX0NPTlRST0wpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogSW5wdXQgTWV0aG9kIENvbnRyb2wgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBOb3RpZnkgY3Vyc29yIHBvc2l0aW9uIHRvIElNLgorICovCisgICAgdm9pZAoraW1fc2V0X3Bvc2l0aW9uKGludCByb3csIGludCBjb2wpCit7CisgICAgLyogVE9ETzogSW1wbGVtZW50IG1lISAqLworfQorCisvKgorICogU2V0IElNIHN0YXR1cyBvbiAoImFjdGl2ZSIgaXMgVFJVRSkgb3Igb2ZmICgiYWN0aXZlIiBpcyBGQUxTRSkuCisgKi8KKyAgICB2b2lkCitpbV9zZXRfYWN0aXZlKGludCBhY3RpdmUpCit7CisgICAgS2V5U2NyaXB0KGFjdGl2ZSA/IHNtS2V5U3lzU2NyaXB0IDogc21LZXlSb21hbik7Cit9CisKKy8qCisgKiBHZXQgSU0gc3RhdHVzLiAgV2hlbiBJTSBpcyBvbiwgcmV0dXJuIG5vdCAwLiAgRWxzZSByZXR1cm4gMC4KKyAqLworICAgIGludAoraW1fZ2V0X3N0YXR1cygpCit7CisgICAgU0ludDMyIHNjcmlwdCA9IEdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbUtleVNjcmlwdCk7CisgICAgcmV0dXJuIChzY3JpcHQgIT0gc21Sb21hbgorCSAgICAmJiBzY3JpcHQgPT0gR2V0U2NyaXB0TWFuYWdlclZhcmlhYmxlKHNtU3lzU2NyaXB0KSkgPyAxIDogMDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKFBST1RPKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tYWMuaWNucyBiL3NyYy9ndWlfbWFjLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1ZmExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfbWFjLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tYWMuciBiL3NyYy9ndWlfbWFjLnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExOTE2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfbWFjLnIKQEAgLTAsMCArMSwzMyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKyNpZmRlZiBlbnZpcm9uX29zX21hYyAvKiBvciAxIGZvciBDYXJib24sIDAgZm9yIG5vbi1DYXJib24gKi8KKyMgaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5yPgorI2Vsc2UKKyMgaW5jbHVkZSA8U3lzVHlwZXMucj4KKyMgaW5jbHVkZSA8VHlwZXMucj4KKyNlbmRpZgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyogVXNlZCBhcyBhcHBsaWNhdGlvbiB2ZXJzaW9uICovCityZXNvdXJjZSAndmVycycgKDEpIHsKKwlWSU1fVkVSU0lPTl9NQUpPUiwgVklNX1ZFUlNJT05fQlVJTERfQkNELCBWSU1fVkVSU0lPTl9SRUxFQVNFLCBWSU1fVkVSU0lPTl9QQVRDSExFVkVMLAorCXZlclVTLAorCVZJTV9WRVJTSU9OX01FRElVTSwKKwlWSU1fVkVSU0lPTl9MT05HX0RBVEUgJCRkYXRlICIgIiAkJHRpbWUgIikiCit9OworCisvKiBVc2VkIGFzIGFwcGxpY2F0aW9uIGdyb3VwIHZlcnNpb24gKi8KK3Jlc291cmNlICd2ZXJzJyAoMikgeworCVZJTV9WRVJTSU9OX01BSk9SLCBWSU1fVkVSU0lPTl9CVUlMRF9CQ0QsIFZJTV9WRVJTSU9OX1JFTEVBU0UsIFZJTV9WRVJTSU9OX1BBVENITEVWRUwsCisJdmVyVVMsCisJVklNX1ZFUlNJT05fTUVESVVNLAorCVZJTV9WRVJTSU9OX0xPTkcKK307CisKKy8qIFRPRE86IFNtYWxsIEFib3V0IGJveCB3aXRoIGNvbXBpbGUgdGltZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tb3RpZi5jIGIvc3JjL2d1aV9tb3RpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX21vdGlmLmMKQEAgLTAsMCArMSwzMDkwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPFhtL0Zvcm0uaD4KKyNpbmNsdWRlIDxYbS9Sb3dDb2x1bW4uaD4KKyNpbmNsdWRlIDxYbS9QdXNoQi5oPgorI2luY2x1ZGUgPFhtL1RleHQuaD4KKyNpbmNsdWRlIDxYbS9UZXh0Ri5oPgorI2luY2x1ZGUgPFhtL1NlcGFyYXRvci5oPgorI2luY2x1ZGUgPFhtL0xhYmVsLmg+CisjaW5jbHVkZSA8WG0vQ2FzY2FkZUIuaD4KKyNpbmNsdWRlIDxYbS9TY3JvbGxCYXIuaD4KKyNpbmNsdWRlIDxYbS9NZW51U2hlbGwuaD4KKyNpbmNsdWRlIDxYbS9EcmF3aW5nQS5oPgorI2lmIChYbVZlcnNpb24gPj0gMTAwMikKKyMgaW5jbHVkZSA8WG0vUmVwVHlwZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8WG0vRnJhbWUuaD4KKyNpbmNsdWRlIDxYbS9MYWJlbEcuaD4KKyNpbmNsdWRlIDxYbS9Ub2dnbGVCRy5oPgorI2luY2x1ZGUgPFhtL1NlcGFyYXRvRy5oPgorCisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorI2luY2x1ZGUgPFgxMS9TdHJpbmdEZWZzLmg+CisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBIQVZFX1gxMV9YUE1fSAorIyBpbmNsdWRlIDxYMTEveHBtLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1hNX1hQTVBfSAorIyAgaW5jbHVkZSA8WG0vWHBtUC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgJiYgZGVmaW5lZChIQVZFX1hQTSkKKyMgaW5jbHVkZSAiLi4vcGl4bWFwcy9hbGVydC54cG0iCisjIGluY2x1ZGUgIi4uL3BpeG1hcHMvZXJyb3IueHBtIgorIyBpbmNsdWRlICIuLi9waXhtYXBzL2dlbmVyaWMueHBtIgorIyBpbmNsdWRlICIuLi9waXhtYXBzL2luZm8ueHBtIgorIyBpbmNsdWRlICIuLi9waXhtYXBzL3F1ZXN0LnhwbSIKKyNlbmRpZgorCisjZGVmaW5lIE1PVElGX1BPUFVQCisKK2V4dGVybiBXaWRnZXQgdmltU2hlbGw7CisKK3N0YXRpYyBXaWRnZXQgdmltRm9ybTsKK3N0YXRpYyBXaWRnZXQgdGV4dEFyZWFGb3JtOworV2lkZ2V0IHRleHRBcmVhOworI2lmZGVmIEZFQVRfVE9PTEJBUgorc3RhdGljIFdpZGdldCB0b29sQmFyRnJhbWU7CitzdGF0aWMgV2lkZ2V0IHRvb2xCYXI7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPT1RFUgorc3RhdGljIFdpZGdldCBmb290ZXI7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01FTlUKKyMgaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorLyogcmVtZW1iZXIgdGhlIGxhc3Qgc2V0IHZhbHVlIGZvciB0aGUgdGVhcm9mZiBpdGVtICovCitzdGF0aWMgaW50IHRlYXJvZmZfdmFsID0gKGludClYbVRFQVJfT0ZGX0VOQUJMRUQ7CisjIGVuZGlmCitzdGF0aWMgV2lkZ2V0IG1lbnVCYXI7CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2Nyb2xsX2NiIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWHRQb2ludGVyIGNhbGxfZGF0YSkpOworI2lmZGVmIEZFQVRfVE9PTEJBUgorIyBpZiAwCitzdGF0aWMgdm9pZCB0b29sYmFyX2VudGVyX2NiIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFhFdmVudCAqLCBCb29sZWFuICopKTsKK3N0YXRpYyB2b2lkIHRvb2xiYXJfbGVhdmVfY2IgX19BUkdTKChXaWRnZXQsIFh0UG9pbnRlciwgWEV2ZW50ICosIEJvb2xlYW4gKikpOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0ZPT1RFUgorc3RhdGljIHZvaWQgdG9vbGJhcmJ1dHRvbl9lbnRlcl9jYiBfX0FSR1MoKFdpZGdldCwgWHRQb2ludGVyLCBYRXZlbnQgKiwgQm9vbGVhbiAqKSk7CitzdGF0aWMgdm9pZCB0b29sYmFyYnV0dG9uX2xlYXZlX2NiIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFhFdmVudCAqLCBCb29sZWFuICopKTsKKyMgZW5kaWYKK3N0YXRpYyB2b2lkIGd1aV9tY2hfcmVzZXRfZm9jdXMgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPT1RFUgorc3RhdGljIGludCBndWlfbWNoX2NvbXB1dGVfZm9vdGVyX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorI2lmZGVmIFdTREVCVUcKK3N0YXRpYyB2b2lkIGF0dGFjaER1bXAoV2lkZ2V0LCBjaGFyICopOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGd1aV9tb3RpZl9tZW51X2NvbG9ycyBfX0FSR1MoKFdpZGdldCBpZCkpOworc3RhdGljIHZvaWQgZ3VpX21vdGlmX3Njcm9sbF9jb2xvcnMgX19BUkdTKChXaWRnZXQgaWQpKTsKKyNpZmRlZiBGRUFUX01FTlUKK3N0YXRpYyB2b2lkIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0IF9fQVJHUygoV2lkZ2V0IGlkKSk7CisjZW5kaWYKKworI2lmIChYbVZlcnNpb24gPj0gMTAwMikKKyMgZGVmaW5lIFNUUklOR19UQUcgIFhtRk9OVExJU1RfREVGQVVMVF9UQUcKKyNlbHNlCisjIGRlZmluZSBTVFJJTkdfVEFHICBYbVNUUklOR19ERUZBVUxUX0NIQVJTRVQKKyNlbmRpZgorCisvKgorICogQ2FsbC1iYWNrIHJvdXRpbmVzLgorICovCisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK3Njcm9sbF9jYih3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSwgY2FsbF9kYXRhOworeworICAgIHNjcm9sbGJhcl9UICpzYjsKKyAgICBsb25nCXZhbHVlOworICAgIGludAkJZHJhZ2dpbmc7CisKKyAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZyljbGllbnRfZGF0YSk7CisKKyAgICB2YWx1ZSA9ICgoWG1TY3JvbGxCYXJDYWxsYmFja1N0cnVjdCAqKWNhbGxfZGF0YSktPnZhbHVlOworICAgIGRyYWdnaW5nID0gKCgoWG1TY3JvbGxCYXJDYWxsYmFja1N0cnVjdCAqKWNhbGxfZGF0YSktPnJlYXNvbiA9PQorCQkJCQkJCSAgICAgIChpbnQpWG1DUl9EUkFHKTsKKyAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbHVlLCBkcmFnZ2luZyk7Cit9CisKKworLyoKKyAqIEVuZCBvZiBjYWxsLWJhY2sgcm91dGluZXMKKyAqLworCisvKgorICogQ3JlYXRlIGFsbCB0aGUgbW90aWYgd2lkZ2V0cyBuZWNlc3NhcnkuCisgKi8KKyAgICB2b2lkCitndWlfeDExX2NyZWF0ZV93aWRnZXRzKCkKK3sKKyAgICAvKgorICAgICAqIFN0YXJ0IG91dCBieSBhZGRpbmcgdGhlIGNvbmZpZ3VyZWQgYm9yZGVyIHdpZHRoIGludG8gdGhlIGJvcmRlciBvZmZzZXQKKyAgICAgKi8KKyAgICBndWkuYm9yZGVyX29mZnNldCA9IGd1aS5ib3JkZXJfd2lkdGg7CisKKyAgICAvKgorICAgICAqIEluc3RhbGwgdGhlIHRlYXJPZmZNb2RlbCByZXNvdXJjZSBjb252ZXJ0ZXIuCisgICAgICovCisjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorICAgIFhtUmVwVHlwZUluc3RhbGxUZWFyT2ZmTW9kZWxDb252ZXJ0ZXIoKTsKKyNlbmRpZgorCisgICAgLyogTWFrZSBzdXJlIHRoZSAiUXVpdCIgbWVudSBlbnRyeSBvZiB0aGUgd2luZG93IG1hbmFnZXIgaXMgaWdub3JlZCAqLworICAgIFh0VmFTZXRWYWx1ZXModmltU2hlbGwsIFhtTmRlbGV0ZVJlc3BvbnNlLCBYbURPX05PVEhJTkcsIE5VTEwpOworCisgICAgdmltRm9ybSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ2aW1Gb3JtIiwKKwl4bUZvcm1XaWRnZXRDbGFzcywgdmltU2hlbGwsCisJWG1OYm9yZGVyV2lkdGgsIDAsCisJWG1OaGlnaGxpZ2h0VGhpY2tuZXNzLCAwLAorCVhtTnNoYWRvd1RoaWNrbmVzcywgMCwKKwlYbU5tYXJnaW5XaWR0aCwgMCwKKwlYbU5tYXJnaW5IZWlnaHQsIDAsCisJWG1OcmVzaXplUG9saWN5LCBYbVJFU0laRV9BTlksCisJTlVMTCk7CisgICAgZ3VpX21vdGlmX21lbnVfY29sb3JzKHZpbUZvcm0pOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgeworCUFyZyBhbFs3XTsgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBhcmd1bWVudHMhICovCisJaW50IGFjID0gMDsKKworIyBpZiAoWG1WZXJzaW9uID49IDEwMDIpCisJWHRTZXRBcmcoYWxbYWNdLCBYbU50ZWFyT2ZmTW9kZWwsIHRlYXJvZmZfdmFsKTsgYWMrKzsKKyMgZW5kaWYKKwlYdFNldEFyZyhhbFthY10sIFhtTmxlZnRBdHRhY2htZW50LCAgWG1BVFRBQ0hfRk9STSk7IGFjKys7CisJWHRTZXRBcmcoYWxbYWNdLCBYbU50b3BBdHRhY2htZW50LCAgIFhtQVRUQUNIX0ZPUk0pOyBhYysrOworCVh0U2V0QXJnKGFsW2FjXSwgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgYWMrKzsKKyMgaWZuZGVmIEZFQVRfVE9PTEJBUgorCS8qIEFsd2F5cyBzdGljayB0byByaWdodCBoYW5kIHNpZGUuICovCisJWHRTZXRBcmcoYWxbYWNdLCBYbU5yaWdodE9mZnNldCwgMCk7IGFjKys7CisjIGVuZGlmCisJbWVudUJhciA9IFhtQ3JlYXRlTWVudUJhcih2aW1Gb3JtLCAibWVudUJhciIsIGFsLCBhYyk7CisJWHRNYW5hZ2VDaGlsZChtZW51QmFyKTsKKworCS8qIFJlbWVtYmVyIHRoZSBkZWZhdWx0IGNvbG9ycywgbmVlZGVkIGZvciAiOmhpIGNsZWFyIi4gKi8KKwlYdFZhR2V0VmFsdWVzKG1lbnVCYXIsCisJICAgIFhtTmJhY2tncm91bmQsICZndWkubWVudV9kZWZfYmdfcGl4ZWwsCisJICAgIFhtTmZvcmVncm91bmQsICZndWkubWVudV9kZWZfZmdfcGl4ZWwsCisJICAgIE5VTEwpOworCWd1aV9tb3RpZl9tZW51X2NvbG9ycyhtZW51QmFyKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIC8qCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IFRvb2xCYXIuIFdlIHNob3VsZCBnZXQgYnV0dG9ucyBkZWZpbmVkIGZyb20gbWVudS52aW0uCisgICAgICovCisgICAgdG9vbEJhckZyYW1lID0gWHRWYUNyZWF0ZVdpZGdldCgidG9vbEJhckZyYW1lIiwKKwl4bUZyYW1lV2lkZ2V0Q2xhc3MsIHZpbUZvcm0sCisJWG1Oc2hhZG93VGhpY2tuZXNzLCAwLAorCVhtTm1hcmdpbkhlaWdodCwgMCwKKwlYbU5tYXJnaW5XaWR0aCwgMCwKKwlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJTlVMTCk7CisgICAgZ3VpX21vdGlmX21lbnVfY29sb3JzKHRvb2xCYXJGcmFtZSk7CisKKyAgICB0b29sQmFyID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInRvb2xCYXIiLAorCXhtUm93Q29sdW1uV2lkZ2V0Q2xhc3MsIHRvb2xCYXJGcmFtZSwKKwlYbU5jaGlsZFR5cGUsIFhtRlJBTUVfV09SS0FSRUFfQ0hJTEQsCisJWG1Ocm93Q29sdW1uVHlwZSwgWG1XT1JLX0FSRUEsCisJWG1Ob3JpZW50YXRpb24sIFhtSE9SSVpPTlRBTCwKKwlYbU50cmF2ZXJzYWxPbiwgRmFsc2UsCisJWG1OaXNIb21vZ2VuZW91cywgRmFsc2UsCisJWG1OcGFja2luZywgWG1QQUNLX1RJR0hULAorCVhtTnNwYWNpbmcsIDAsCisJWG1Oc2hhZG93VGhpY2tuZXNzLCAwLAorCVhtTmhpZ2hsaWdodFRoaWNrbmVzcywgMCwKKwlYbU5tYXJnaW5IZWlnaHQsIDAsCisJWG1ObWFyZ2luV2lkdGgsIDAsCisJWG1OYWRqdXN0TGFzdCwgVHJ1ZSwKKwlOVUxMKTsKKyAgICBndWlfbW90aWZfbWVudV9jb2xvcnModG9vbEJhcik7CisKKyMgaWYgMAkvKiB0aGVzZSBkb24ndCB3b3JrLCBiZWNhdXNlIG9mIHRoZSBYbU50cmF2ZXJzYWxPbiBhYm92ZS4gKi8KKyAgICBYdEFkZEV2ZW50SGFuZGxlcih0b29sQmFyLCBFbnRlcldpbmRvd01hc2ssIEZhbHNlLAorCSAgICB0b29sYmFyX2VudGVyX2NiLCBOVUxMKTsKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih0b29sQmFyLCBMZWF2ZVdpbmRvd01hc2ssIEZhbHNlLAorCSAgICB0b29sYmFyX2xlYXZlX2NiLCBOVUxMKTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgdGV4dEFyZWFGb3JtID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInRleHRBcmVhRm9ybSIsCisJeG1Gb3JtV2lkZ2V0Q2xhc3MsIHZpbUZvcm0sCisJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCVhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU5tYXJnaW5XaWR0aCwgMCwKKwlYbU5tYXJnaW5IZWlnaHQsIDAsCisJWG1OcmVzaXplUG9saWN5LCBYbVJFU0laRV9BTlksCisJTlVMTCk7CisgICAgZ3VpX21vdGlmX3Njcm9sbF9jb2xvcnModGV4dEFyZWFGb3JtKTsKKworICAgIHRleHRBcmVhID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInRleHRBcmVhIiwKKwl4bURyYXdpbmdBcmVhV2lkZ2V0Q2xhc3MsIHRleHRBcmVhRm9ybSwKKwlYbU5mb3JlZ3JvdW5kLCBndWkubm9ybV9waXhlbCwKKwlYbU5iYWNrZ3JvdW5kLCBndWkuYmFja19waXhlbCwKKwlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCisJLyoKKwkgKiBUaGVzZSB0YWtlIHNvbWUgY29udHJvbCBhd2F5IGZyb20gdGhlIHVzZXIsIGJ1dCBhdm9pZHMgbWFraW5nIHRoZW0KKwkgKiBhZGQgcmVzb3VyY2VzIHRvIGdldCBhIGRlY2VudCBsb29raW5nIHNldHVwLgorCSAqLworCVhtTmJvcmRlcldpZHRoLCAwLAorCVhtTmhpZ2hsaWdodFRoaWNrbmVzcywgMCwKKwlYbU5zaGFkb3dUaGlja25lc3MsIDAsCisJTlVMTCk7CisKKyNpZmRlZiBGRUFUX0ZPT1RFUgorICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSBGb290ZXIuCisgICAgICovCisgICAgZm9vdGVyID0gWHRWYUNyZWF0ZVdpZGdldCgiZm9vdGVyIiwKKwl4bUxhYmVsR2FkZ2V0Q2xhc3MsIHZpbUZvcm0sCisJWG1OYWxpZ25tZW50LCBYbUFMSUdOTUVOVF9CRUdJTk5JTkcsCisJWG1ObWFyZ2luSGVpZ2h0LCAwLAorCVhtTm1hcmdpbldpZHRoLCAwLAorCVhtTnRyYXZlcnNhbE9uLCBGYWxzZSwKKwlYbU5yZWNvbXB1dGVTaXplLCBGYWxzZSwKKwlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU5sZWZ0T2Zmc2V0LCA1LAorCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwlYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCU5VTEwpOworICAgIGd1aV9tY2hfc2V0X2Zvb3RlcigoY2hhcl91ICopICIiKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJbnN0YWxsIHRoZSBjYWxsYmFja3MuCisgICAgICovCisgICAgZ3VpX3gxMV9jYWxsYmFja3ModGV4dEFyZWEsIHZpbUZvcm0pOworCisgICAgLyogUHJldGVuZCB3ZSBkb24ndCBoYXZlIGlucHV0IGZvY3VzLCB3ZSB3aWxsIGdldCBhbiBldmVudCBpZiB3ZSBkby4gKi8KKyAgICBndWkuaW5fZm9jdXMgPSBGQUxTRTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBHVUkgaXMgbm90IGdvaW5nIHRvIHN0YXJ0IGFmdGVyIGFsbC4KKyAqLworICAgIHZvaWQKK2d1aV94MTFfZGVzdHJveV93aWRnZXRzKCkKK3sKKyAgICB0ZXh0QXJlYSA9IE5VTEw7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgbWVudUJhciA9IE5VTEw7CisjZW5kaWYKK30KKworLypBUkdTVVNFRCovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3Bvcyh4LCB5LCB3LCBoKQorICAgIGludAkgICAgeDsKKyAgICBpbnQJICAgIHk7CisgICAgaW50CSAgICB3OworICAgIGludAkgICAgaDsKK3sKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICAvKiBHaXZlIGtleWJvYXJkIGZvY3VzIHRvIHRoZSB0ZXh0QXJlYSBpbnN0ZWFkIG9mIHRoZSB0b29sYmFyLiAqLworICAgIGd1aV9tY2hfcmVzZXRfZm9jdXMoKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3VpX3gxMV9zZXRfYmFja19jb2xvcigpCit7CisgICAgaWYgKHRleHRBcmVhICE9IE5VTEwpCisjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorCVhtQ2hhbmdlQ29sb3IodGV4dEFyZWEsIGd1aS5iYWNrX3BpeGVsKTsKKyNlbHNlCisJWHRWYVNldFZhbHVlcyh0ZXh0QXJlYSwKKwkJICBYbU5iYWNrZ3JvdW5kLCBndWkuYmFja19waXhlbCwKKwkJICBOVUxMKTsKKyNlbmRpZgorfQorCisvKgorICogTWFuYWdlIGRpYWxvZyBjZW50ZXJlZCBvbiBwb2ludGVyLiBUaGlzIGNvdWxkIGJlIHVzZWQgYnkgdGhlIEF0aGVuYSBjb2RlIGFzCisgKiB3ZWxsLgorICovCitzdGF0aWMgdm9pZCBtYW5hZ2VfY2VudGVyZWQgX19BUkdTKChXaWRnZXQgZGlhbG9nX2NoaWxkKSk7CisKK3N0YXRpYyB2b2lkCittYW5hZ2VfY2VudGVyZWQoZGlhbG9nX2NoaWxkKQorICAgIFdpZGdldCBkaWFsb2dfY2hpbGQ7Cit7CisgICAgV2lkZ2V0IHNoZWxsID0gWHRQYXJlbnQoZGlhbG9nX2NoaWxkKTsKKyAgICBXaW5kb3cgcm9vdCwgY2hpbGQ7CisgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIGJvcmRlcl93aWR0aCwgZGVwdGg7CisgICAgaW50IHgsIHksIHdpbl94LCB3aW5feSwgbWF4WCwgbWF4WTsKKyAgICBCb29sZWFuIG1hcHBlZFdoZW5NYW5hZ2VkOworCisgICAgLyogVGVtcG9yYXJpbHkgc2V0IHZhbHVlIG9mIFhtTm1hcHBlZFdoZW5NYW5hZ2VkCisgICAgICAgdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gcG9wcGluZyB1cCByaWdodCBhd2F5ICovCisgICAgWHRWYUdldFZhbHVlcyhzaGVsbCwgWG1ObWFwcGVkV2hlbk1hbmFnZWQsICZtYXBwZWRXaGVuTWFuYWdlZCwgMCk7CisgICAgWHRWYVNldFZhbHVlcyhzaGVsbCwgWG1ObWFwcGVkV2hlbk1hbmFnZWQsIEZhbHNlLCAwKTsKKworICAgIFh0TWFuYWdlQ2hpbGQoZGlhbG9nX2NoaWxkKTsKKworICAgIC8qIEdldCB0aGUgcG9pbnRlciBwb3NpdGlvbiAoeCwgeSkgKi8KKyAgICBYUXVlcnlQb2ludGVyKFh0RGlzcGxheShzaGVsbCksIFh0V2luZG93KHNoZWxsKSwgJnJvb3QsICZjaGlsZCwKKwkJICAmeCwgJnksICZ3aW5feCwgJndpbl95LCAmbWFzayk7CisKKyAgICAvKiBUcmFuc2xhdGUgdGhlIHBvaW50ZXIgcG9zaXRpb24gKHgsIHkpIGludG8gYSBwb3NpdGlvbiBmb3IgdGhlIG5ldworICAgICAgIHdpbmRvdyB0aGF0IHdpbGwgcGxhY2UgdGhlIHBvaW50ZXIgYXQgaXRzIGNlbnRlciAqLworICAgIFhHZXRHZW9tZXRyeShYdERpc3BsYXkoc2hlbGwpLCBYdFdpbmRvdyhzaGVsbCksICZyb290LCAmd2luX3gsICZ3aW5feSwKKwkJICZ3aWR0aCwgJmhlaWdodCwgJmJvcmRlcl93aWR0aCwgJmRlcHRoKTsKKyAgICB3aWR0aCArPSAyICogYm9yZGVyX3dpZHRoOworICAgIGhlaWdodCArPSAyICogYm9yZGVyX3dpZHRoOworICAgIHggLT0gd2lkdGggLyAyOworICAgIHkgLT0gaGVpZ2h0IC8gMjsKKworICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBkaWFsb2cgcmVtYWlucyBvbiBzY3JlZW4gKi8KKyAgICBtYXhYID0gWHRTY3JlZW4oc2hlbGwpLT53aWR0aCAtIHdpZHRoOworICAgIG1heFkgPSBYdFNjcmVlbihzaGVsbCktPmhlaWdodCAtIGhlaWdodDsKKyAgICBpZiAoeCA8IDApCisJeCA9IDA7CisgICAgaWYgKHggPiBtYXhYKQorCXggPSBtYXhYOworICAgIGlmICh5IDwgMCkKKwl5ID0gMDsKKyAgICBpZiAoeSA+IG1heFkpCisJeSA9IG1heFk7CisKKyAgICAvKiBTZXQgZGVzaXJlZCB3aW5kb3cgcG9zaXRpb24gaW4gdGhlIERpYWxvZ1NoZWxsICovCisgICAgWHRWYVNldFZhbHVlcyhzaGVsbCwgWG1OeCwgeCwgWG1OeSwgeSwgTlVMTCk7CisKKyAgICAvKiBNYXAgdGhlIHdpZGdldCAqLworICAgIFh0TWFwV2lkZ2V0KHNoZWxsKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIHZhbHVlIG9mIFhtTm1hcHBlZFdoZW5NYW5hZ2VkICovCisgICAgWHRWYVNldFZhbHVlcyhzaGVsbCwgWG1ObWFwcGVkV2hlbk1hbmFnZWQsIG1hcHBlZFdoZW5NYW5hZ2VkLCAwKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBFbmNhcHN1bGF0ZSB0aGUgd2F5IGFuIFhtRm9udExpc3QgaXMgY3JlYXRlZC4KKyAqLworICAgIFhtRm9udExpc3QKK2d1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoZm9udCkKKyAgICBYRm9udFN0cnVjdCAgICAqZm9udDsKK3sKKyAgICBYbUZvbnRMaXN0IGZvbnRfbGlzdDsKKworIyBpZiAoWG1WZXJzaW9uIDw9IDEwMDEpCisgICAgLyogTW90aWYgMS4xIG1ldGhvZCAqLworICAgIGZvbnRfbGlzdCA9IFhtRm9udExpc3RDcmVhdGUoZm9udCwgU1RSSU5HX1RBRyk7CisjIGVsc2UKKyAgICAvKiBNb3RpZiAxLjIgbWV0aG9kICovCisgICAgWG1Gb250TGlzdEVudHJ5IGZvbnRfbGlzdF9lbnRyeTsKKworICAgIGZvbnRfbGlzdF9lbnRyeSA9IFhtRm9udExpc3RFbnRyeUNyZWF0ZShTVFJJTkdfVEFHLCBYbUZPTlRfSVNfRk9OVCwKKwkJCQkJICAgIChYdFBvaW50ZXIpZm9udCk7CisgICAgZm9udF9saXN0ID0gWG1Gb250TGlzdEFwcGVuZEVudHJ5KE5VTEwsIGZvbnRfbGlzdF9lbnRyeSk7CisgICAgWG1Gb250TGlzdEVudHJ5RnJlZSgmZm9udF9saXN0X2VudHJ5KTsKKyMgZW5kaWYKKyAgICByZXR1cm4gZm9udF9saXN0OworfQorCisjIGlmICgoWG1WZXJzaW9uID4gMTAwMSkgJiYgZGVmaW5lZChGRUFUX1hGT05UU0VUKSkgfHwgZGVmaW5lZChQUk9UTykKKyAgICBYbUZvbnRMaXN0CitndWlfbW90aWZfZm9udHNldDJmb250bGlzdChmb250c2V0KQorICAgIFhGb250U2V0CSpmb250c2V0OworeworICAgIFhtRm9udExpc3QgZm9udF9saXN0OworCisgICAgLyogTW90aWYgMS4yIG1ldGhvZCAqLworICAgIFhtRm9udExpc3RFbnRyeSBmb250X2xpc3RfZW50cnk7CisKKyAgICBmb250X2xpc3RfZW50cnkgPSBYbUZvbnRMaXN0RW50cnlDcmVhdGUoU1RSSU5HX1RBRywKKwkJCQkJICAgIFhtRk9OVF9JU19GT05UU0VULAorCQkJCQkgICAgKFh0UG9pbnRlcikqZm9udHNldCk7CisgICAgZm9udF9saXN0ID0gWG1Gb250TGlzdEFwcGVuZEVudHJ5KE5VTEwsIGZvbnRfbGlzdF9lbnRyeSk7CisgICAgWG1Gb250TGlzdEVudHJ5RnJlZSgmZm9udF9saXN0X2VudHJ5KTsKKyAgICByZXR1cm4gZm9udF9saXN0OworfQorIyBlbmRpZgorCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NRU5VKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIE1lbnUgc3R1ZmYuCisgKi8KKworc3RhdGljIHZvaWQgZ3VpX21vdGlmX2FkZF9hY3RleHQgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKKyNpZiAoWG1WZXJzaW9uID49IDEwMDIpCitzdGF0aWMgdm9pZCB0b2dnbGVfdGVhcm9mZiBfX0FSR1MoKFdpZGdldCB3aWQpKTsKK3N0YXRpYyB2b2lkIGd1aV9tY2hfcmVjdXJzZV90ZWFyb2ZmcyBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOworI2VuZGlmCitzdGF0aWMgdm9pZCBndWlfbWNoX3N1Ym1lbnVfY2hhbmdlIF9fQVJHUygodmltbWVudV9UICptcCwgaW50IGNvbG9ycykpOworCitzdGF0aWMgdm9pZCBkb19zZXRfbW5lbW9uaWNzIF9fQVJHUygoaW50IGVuYWJsZSkpOworc3RhdGljIGludCBtZW51X2VuYWJsZWQgPSBUUlVFOworCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfbWVudShmbGFnKQorICAgIGludAkgICAgZmxhZzsKK3sKKyAgICBpZiAoZmxhZykKKyAgICB7CisJWHRNYW5hZ2VDaGlsZChtZW51QmFyKTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwlpZiAoWHRJc01hbmFnZWQoWHRQYXJlbnQodG9vbEJhcikpKQorCXsKKwkgICAgLyogdG9vbEJhciBpcyBhdHRhY2hlZCB0byB0b3AgZm9ybSAqLworCSAgICBYdFZhU2V0VmFsdWVzKFh0UGFyZW50KHRvb2xCYXIpLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgbWVudUJhciwKKwkJTlVMTCk7CisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWFGb3JtLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgWHRQYXJlbnQodG9vbEJhciksCisJCU5VTEwpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWFGb3JtLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgbWVudUJhciwKKwkJTlVMTCk7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCVh0VW5tYW5hZ2VDaGlsZChtZW51QmFyKTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwlpZiAoWHRJc01hbmFnZWQoWHRQYXJlbnQodG9vbEJhcikpKQorCXsKKwkgICAgWHRWYVNldFZhbHVlcyhYdFBhcmVudCh0b29sQmFyKSwKKwkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJTlVMTCk7CisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWFGb3JtLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgWHRQYXJlbnQodG9vbEJhciksCisJCU5VTEwpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWFGb3JtLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlOVUxMKTsKKwl9CisgICAgfQorCit9CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBtbmVtb25pY3MgZm9yIHRoZSB0b3BsZXZlbCBtZW51cy4KKyAqLworICAgIHZvaWQKK2d1aV9tb3RpZl9zZXRfbW5lbW9uaWNzKGVuYWJsZSkKKyAgICBpbnQJCWVuYWJsZTsKK3sKKyAgICAvKgorICAgICAqIERvbid0IGVuYWJsZSBtZW51IG1uZW1vbmljcyB3aGVuIHRoZSBtZW51IGJhciBpcyBkaXNhYmxlZCwgTGVzc1RpZgorICAgICAqIGNyYXNoZXMgd2hlbiB1c2luZyBhIG1uZW1vbmljIHRoZW4uCisgICAgICovCisgICAgaWYgKCFtZW51X2VuYWJsZWQpCisJZW5hYmxlID0gRkFMU0U7CisgICAgZG9fc2V0X21uZW1vbmljcyhlbmFibGUpOworfQorCisgICAgc3RhdGljIHZvaWQKK2RvX3NldF9tbmVtb25pY3MoZW5hYmxlKQorICAgIGludAkJZW5hYmxlOworeworICAgIHZpbW1lbnVfVAkqbWVudTsKKworICAgIGZvciAobWVudSA9IHJvb3RfbWVudTsgbWVudSAhPSBOVUxMOyBtZW51ID0gbWVudS0+bmV4dCkKKwlpZiAobWVudS0+aWQgIT0gKFdpZGdldCkwKQorCSAgICBYdFZhU2V0VmFsdWVzKG1lbnUtPmlkLAorCQkgICAgWG1ObW5lbW9uaWMsIGVuYWJsZSA/IG1lbnUtPm1uZW1vbmljIDogTlVMLAorCQkgICAgTlVMTCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51KG1lbnUsIGlkeCkKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQlpZHg7Cit7CisgICAgWG1TdHJpbmcJbGFiZWw7CisgICAgV2lkZ2V0CXNoZWxsOworICAgIHZpbW1lbnVfVAkqcGFyZW50ID0gbWVudS0+cGFyZW50OworCisjaWZkZWYgTU9USUZfUE9QVVAKKyAgICBpZiAobWVudV9pc19wb3B1cChtZW51LT5uYW1lKSkKKyAgICB7CisJQXJnIGFyZ1syXTsKKwlpbnQgbiA9IDA7CisKKwkvKiBPbmx5IGNyZWF0ZSB0aGUgcG9wdXAgbWVudSB3aGVuIGl0J3MgYWN0dWFsbHkgdXNlZCwgb3RoZXJ3aXNlIHRoZXJlCisJICogaXMgYSBkZWxheSB3aGVuIHVzaW5nIHRoZSByaWdodCBtb3VzZSBidXR0b24uICovCisjIGlmIChYbVZlcnNpb24gPD0gMTAwMikKKwlpZiAobW91c2VfbW9kZWxfcG9wdXAoKSkKKyMgZW5kaWYKKwl7CisJICAgIGlmIChndWkubWVudV9iZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCSAgICB7CisJCVh0U2V0QXJnKGFyZ1swXSwgWG1OYmFja2dyb3VuZCwgZ3VpLm1lbnVfYmdfcGl4ZWwpOyBuKys7CisJICAgIH0KKwkgICAgaWYgKGd1aS5tZW51X2ZnX3BpeGVsICE9IElOVkFMQ09MT1IpCisJICAgIHsKKwkJWHRTZXRBcmcoYXJnWzFdLCBYbU5mb3JlZ3JvdW5kLCBndWkubWVudV9mZ19waXhlbCk7IG4rKzsKKwkgICAgfQorCSAgICBtZW51LT5zdWJtZW51X2lkID0gWG1DcmVhdGVQb3B1cE1lbnUodGV4dEFyZWEsICJjb250ZXh0TWVudSIsCisJCQkJCQkJCSAgICAgIGFyZywgbik7CisJICAgIG1lbnUtPmlkID0gKFdpZGdldCkwOworCX0KKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIW1lbnVfaXNfbWVudWJhcihtZW51LT5uYW1lKQorCSAgICB8fCAocGFyZW50ICE9IE5VTEwgJiYgcGFyZW50LT5zdWJtZW51X2lkID09IChXaWRnZXQpMCkpCisJcmV0dXJuOworCisgICAgbGFiZWwgPSBYbVN0cmluZ0NyZWF0ZSgoY2hhciAqKW1lbnUtPmRuYW1lLCBTVFJJTkdfVEFHKTsKKyAgICBpZiAobGFiZWwgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgbWVudS0+aWQgPSBYdFZhQ3JlYXRlV2lkZ2V0KCJzdWJNZW51IiwKKwkgICAgeG1DYXNjYWRlQnV0dG9uV2lkZ2V0Q2xhc3MsCisJICAgIChwYXJlbnQgPT0gTlVMTCkgPyBtZW51QmFyIDogcGFyZW50LT5zdWJtZW51X2lkLAorCSAgICBYbU5sYWJlbFN0cmluZywgbGFiZWwsCisJICAgIFhtTm1uZW1vbmljLCBwX3dha1swXSA9PSAnbicgPyBOVUwgOiBtZW51LT5tbmVtb25pYywKKyNpZiAoWG1WZXJzaW9uID49IDEwMDIpCisJICAgIC8qIHN1Ym1lbnU6IGNvdW50IHRoZSB0ZWFyb2ZmIGl0ZW0gKG5lZWRlZCBmb3IgTGVzc1RpZikgKi8KKwkgICAgWG1OcG9zaXRpb25JbmRleCwgaWR4ICsgKHBhcmVudCAhPSBOVUxMCisJCQkgICAmJiB0ZWFyb2ZmX3ZhbCA9PSAoaW50KVhtVEVBUl9PRkZfRU5BQkxFRCA/IDEgOiAwKSwKKyNlbmRpZgorCSAgICBOVUxMKTsKKyAgICBndWlfbW90aWZfbWVudV9jb2xvcnMobWVudS0+aWQpOworICAgIGd1aV9tb3RpZl9tZW51X2ZvbnRsaXN0KG1lbnUtPmlkKTsKKyAgICBYbVN0cmluZ0ZyZWUobGFiZWwpOworCisgICAgaWYgKG1lbnUtPmlkID09IChXaWRnZXQpMCkJCS8qIGZhaWxlZCAqLworCXJldHVybjsKKworICAgIC8qIGFkZCBhY2NlbGVyYXRvciB0ZXh0ICovCisgICAgZ3VpX21vdGlmX2FkZF9hY3RleHQobWVudSk7CisKKyAgICBzaGVsbCA9IFh0VmFDcmVhdGVXaWRnZXQoInN1Yk1lbnVTaGVsbCIsCisJeG1NZW51U2hlbGxXaWRnZXRDbGFzcywgbWVudS0+aWQsCisJWG1Od2lkdGgsIDEsCisJWG1OaGVpZ2h0LCAxLAorCU5VTEwpOworICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyhzaGVsbCk7CisgICAgbWVudS0+c3VibWVudV9pZCA9IFh0VmFDcmVhdGVXaWRnZXQoInJvd0NvbHVtbk1lbnUiLAorCXhtUm93Q29sdW1uV2lkZ2V0Q2xhc3MsIHNoZWxsLAorCVhtTnJvd0NvbHVtblR5cGUsIFhtTUVOVV9QVUxMRE9XTiwKKwlOVUxMKTsKKyAgICBndWlfbW90aWZfbWVudV9jb2xvcnMobWVudS0+c3VibWVudV9pZCk7CisKKyAgICBpZiAobWVudS0+c3VibWVudV9pZCA9PSAoV2lkZ2V0KTApCQkvKiBmYWlsZWQgKi8KKwlyZXR1cm47CisKKyNpZiAoWG1WZXJzaW9uID49IDEwMDIpCisgICAgLyogU2V0IHRoZSBjb2xvcnMgZm9yIHRoZSB0ZWFyIG9mZiB3aWRnZXQgKi8KKyAgICB0b2dnbGVfdGVhcm9mZihtZW51LT5zdWJtZW51X2lkKTsKKyNlbmRpZgorCisgICAgWHRWYVNldFZhbHVlcyhtZW51LT5pZCwKKwlYbU5zdWJNZW51SWQsIG1lbnUtPnN1Ym1lbnVfaWQsCisJTlVMTCk7CisKKyAgICAvKgorICAgICAqIFRoZSAiSGVscCIgbWVudSBpcyBhIHNwZWNpYWwgY2FzZSwgYW5kIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIGZhcgorICAgICAqIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgbWVudS1iYXIuICBJdCdzIHJlY29nbml6ZWQgYnkgaXRzIGhpZ2ggcHJpb3JpdHkuCisgICAgICovCisgICAgaWYgKHBhcmVudCA9PSBOVUxMICYmIG1lbnUtPnByaW9yaXR5ID49IDk5OTkpCisJWHRWYVNldFZhbHVlcyhtZW51QmFyLAorCQlYbU5tZW51SGVscFdpZGdldCwgbWVudS0+aWQsCisJCU5VTEwpOworCisgICAgLyoKKyAgICAgKiBXaGVuIHdlIGFkZCBhIHRvcC1sZXZlbCBpdGVtIHRvIHRoZSBtZW51IGJhciwgd2UgY2FuIGZpZ3VyZSBvdXQgaG93CisgICAgICogaGlnaCB0aGUgbWVudSBiYXIgc2hvdWxkIGJlLgorICAgICAqLworICAgIGlmIChwYXJlbnQgPT0gTlVMTCkKKwlndWlfbWNoX2NvbXB1dGVfbWVudV9oZWlnaHQobWVudS0+aWQpOworfQorCisKKy8qCisgKiBBZGQgbW5lbW9uaWMgYW5kIGFjY2VsZXJhdG9yIHRleHQgdG8gYSBtZW51IGJ1dHRvbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfbW90aWZfYWRkX2FjdGV4dChtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICBYbVN0cmluZwlsYWJlbDsKKworICAgIC8qIEFkZCBhY2NlbHJhdG9yIHRleHQsIGlmIHRoZXJlIGlzIG9uZSAqLworICAgIGlmIChtZW51LT5hY3RleHQgIT0gTlVMTCAmJiBtZW51LT5pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCWxhYmVsID0gWG1TdHJpbmdDcmVhdGUoKGNoYXIgKiltZW51LT5hY3RleHQsIFNUUklOR19UQUcpOworCWlmIChsYWJlbCA9PSBOVUxMKQorCSAgICByZXR1cm47CisJWHRWYVNldFZhbHVlcyhtZW51LT5pZCwgWG1OYWNjZWxlcmF0b3JUZXh0LCBsYWJlbCwgTlVMTCk7CisJWG1TdHJpbmdGcmVlKGxhYmVsKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3RvZ2dsZV90ZWFyb2ZmcyhlbmFibGUpCisgICAgaW50CQllbmFibGU7Cit7CisjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorICAgIGlmIChlbmFibGUpCisJdGVhcm9mZl92YWwgPSAoaW50KVhtVEVBUl9PRkZfRU5BQkxFRDsKKyAgICBlbHNlCisJdGVhcm9mZl92YWwgPSAoaW50KVhtVEVBUl9PRkZfRElTQUJMRUQ7CisgICAgdG9nZ2xlX3RlYXJvZmYobWVudUJhcik7CisgICAgZ3VpX21jaF9yZWN1cnNlX3RlYXJvZmZzKHJvb3RfbWVudSk7CisjZW5kaWYKK30KKworI2lmIChYbVZlcnNpb24gPj0gMTAwMikKKy8qCisgKiBTZXQgdGhlIHRlYXJvZmYgZm9yIG9uZSBtZW51IHdpZGdldCBvbiBvciBvZmYsIGFuZCBzZXQgdGhlIGNvbG9yIG9mIHRoZQorICogdGVhcm9mZiB3aWRnZXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordG9nZ2xlX3RlYXJvZmYod2lkKQorICAgIFdpZGdldAl3aWQ7Cit7CisgICAgV2lkZ2V0CXc7CisKKyAgICBYdFZhU2V0VmFsdWVzKHdpZCwgWG1OdGVhck9mZk1vZGVsLCB0ZWFyb2ZmX3ZhbCwgTlVMTCk7CisgICAgaWYgKHRlYXJvZmZfdmFsID09IChpbnQpWG1URUFSX09GRl9FTkFCTEVECisJICAgICYmICh3ID0gWG1HZXRUZWFyT2ZmQ29udHJvbCh3aWQpKSAhPSAoV2lkZ2V0KTApCisJZ3VpX21vdGlmX21lbnVfY29sb3JzKHcpOworfQorCisgICAgc3RhdGljIHZvaWQKK2d1aV9tY2hfcmVjdXJzZV90ZWFyb2ZmcyhtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICB3aGlsZSAobWVudSAhPSBOVUxMKQorICAgIHsKKwlpZiAoIW1lbnVfaXNfcG9wdXAobWVudS0+bmFtZSkpCisJeworCSAgICBpZiAobWVudS0+c3VibWVudV9pZCAhPSAoV2lkZ2V0KTApCisJCXRvZ2dsZV90ZWFyb2ZmKG1lbnUtPnN1Ym1lbnVfaWQpOworCSAgICBndWlfbWNoX3JlY3Vyc2VfdGVhcm9mZnMobWVudS0+Y2hpbGRyZW4pOworCX0KKwltZW51ID0gbWVudS0+bmV4dDsKKyAgICB9Cit9CisjZW5kaWYKKworICAgIGludAorZ3VpX21jaF90ZXh0X2FyZWFfZXh0cmFfaGVpZ2h0KCkKK3sKKyAgICBEaW1lbnNpb24Jc2hhZG93SGVpZ2h0OworCisgICAgWHRWYUdldFZhbHVlcyh0ZXh0QXJlYUZvcm0sIFhtTnNoYWRvd1RoaWNrbmVzcywgJnNoYWRvd0hlaWdodCwgTlVMTCk7CisgICAgcmV0dXJuIHNoYWRvd0hlaWdodDsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIGhlaWdodCBvZiB0aGUgbWVudSBiYXIuCisgKiBXZSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgaXRlbXMgZm9yIHRoZWlyIHBvc2l0aW9uIGFuZCBoZWlnaHQsIGZvciB0aGUgY2FzZQorICogdGhlcmUgYXJlIHNldmVyYWwgcm93cywgYW5kL29yIHNvbWUgY2hhcmFjdGVycyBleHRlbmQgaGlnaGVyIG9yIGxvd2VyLgorICovCisgICAgdm9pZAorZ3VpX21jaF9jb21wdXRlX21lbnVfaGVpZ2h0KGlkKQorICAgIFdpZGdldAlpZDsJCSAgICAvKiBjYW4gYmUgTlVMTCB3aGVuIGRlbGV0aW5nIG1lbnUgKi8KK3sKKyAgICBEaW1lbnNpb24JeSwgbWF4eTsKKyAgICBEaW1lbnNpb24JbWFyZ2luLCBzaGFkb3c7CisgICAgdmltbWVudV9UCSptcDsKKyAgICBzdGF0aWMgRGltZW5zaW9uCWhlaWdodCA9IDIxOwkvKiBub3JtYWwgaGVpZ2h0IG9mIGEgbWVudSBpdGVtICovCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgaGVpZ2h0IG9mIHRoZSBuZXcgaXRlbSwgYmVmb3JlIG1hbmFnaW5nIGl0LCBiZWNhdXNlIGl0IHdpbGwKKyAgICAgKiBzdGlsbCByZWZsZWN0IHRoZSBmb250IHNpemUuICBBZnRlciBtYW5hZ2luZyBpdCBkZXBlbmRzIG9uIHRoZSBtZW51CisgICAgICogaGVpZ2h0LCB3aGljaCBpcyB3aGF0IHdlIGp1c3Qgd2FudGVkIHRvIGdldCEuCisgICAgICovCisgICAgaWYgKGlkICE9IChXaWRnZXQpMCkKKwlYdFZhR2V0VmFsdWVzKGlkLCBYbU5oZWlnaHQsICZoZWlnaHQsIE5VTEwpOworCisgICAgLyogRmluZCBhbnkgbWVudSBXaWRnZXQsIHRvIGJlIGFibGUgdG8gY2FsbCBYdE1hbmFnZUNoaWxkKCkgKi8KKyAgICBlbHNlCisJZm9yIChtcCA9IHJvb3RfbWVudTsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkKKwkgICAgaWYgKG1wLT5pZCAhPSAoV2lkZ2V0KTAgJiYgbWVudV9pc19tZW51YmFyKG1wLT5uYW1lKSkKKwkgICAgeworCQlpZCA9IG1wLT5pZDsKKwkJYnJlYWs7CisJICAgIH0KKworICAgIC8qCisgICAgICogTm93IG1hbmFnZSB0aGUgbWVudSBpdGVtLCB0byBtYWtlIHRoZW0gYWxsIGJlIHBvc2l0aW9uZWQgKG1ha2VzIGFuCisgICAgICogZXh0cmEgcm93IHdoZW4gbmVlZGVkLCByZW1vdmVzIGl0IHdoZW4gbm90IG5lZWRlZCkuCisgICAgICovCisgICAgaWYgKGlkICE9IChXaWRnZXQpMCkKKwlYdE1hbmFnZUNoaWxkKGlkKTsKKworICAgIC8qCisgICAgICogTm93IGZpbmQgdGhlIG1lbnUgaXRlbSB0aGF0IGlzIHRoZSBmdXJ0aGVzdCBkb3duLCBhbmQgZ2V0IGl0J3MgcG9zaXRpb24uCisgICAgICovCisgICAgbWF4eSA9IDA7CisgICAgZm9yIChtcCA9IHJvb3RfbWVudTsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkKKyAgICB7CisJaWYgKG1wLT5pZCAhPSAoV2lkZ2V0KTAgJiYgbWVudV9pc19tZW51YmFyKG1wLT5uYW1lKSkKKwl7CisJICAgIFh0VmFHZXRWYWx1ZXMobXAtPmlkLCBYbU55LCAmeSwgTlVMTCk7CisJICAgIGlmICh5ID4gbWF4eSkKKwkJbWF4eSA9IHk7CisJfQorICAgIH0KKworICAgIFh0VmFHZXRWYWx1ZXMobWVudUJhciwKKwlYbU5tYXJnaW5IZWlnaHQsICZtYXJnaW4sCisJWG1Oc2hhZG93VGhpY2tuZXNzLCAmc2hhZG93LAorCU5VTEwpOworCisgICAgLyoKKyAgICAgKiBUaGlzIGNvbXB1dGF0aW9uIGlzIHRoZSByZXN1bHQgb2YgdHJpYWwtYW5kLWVycm9yOgorICAgICAqIG1heHkgPQlUaGUgbWF4aW11bSBwb3NpdGlvbiBvZiBhbiBpdGVtOyByZXF1aXJlZCBmb3Igd2hlbiB0aGVyZSBhcmUKKyAgICAgKgkJdHdvIG9yIG1vcmUgcm93cworICAgICAqIGhlaWdodCA9IGhlaWdodCBvZiBhbiBpdGVtLCBiZWZvcmUgbWFuYWdpbmcgaXQ7CUhvcGVmdWxseSB0aGlzIHdpbGwKKyAgICAgKgkJY2hhbmdlIHdpdGggdGhlIGZvbnQgaGVpZ2h0LiAgSW5jbHVkZXMgc2hhZG93LWJvcmRlci4KKyAgICAgKiBzaGFkb3cgPQlzaGFkb3ctYm9yZGVyOyBtdXN0IGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgaGVpZ2h0LgorICAgICAqIG1hcmdpbiA9IG1hcmdpbiBhcm91bmQgdGhlIG1lbnUgYnV0dG9uczsgIE11c3QgYmUgYWRkZWQuCisgICAgICogQWRkIDQgZm9yIHRoZSB1bmRlcmxpbmluZyBvZiBzaG9ydGN1dCBrZXlzLgorICAgICAqLworICAgIGd1aS5tZW51X2hlaWdodCA9IG1heHkgKyBoZWlnaHQgLSAyICogc2hhZG93ICsgMiAqIG1hcmdpbiArIDQ7CisKKyNpZmRlZiBMRVNTVElGX1ZFUlNJT04KKyAgICAvKiBTb21laG93IHRoZSBtZW51IGJhciBkb2Vzbid0IHJlc2l6ZSBhdXRvbWF0aWNhbGx5LiAgU2V0IGl0IGhlcmUsCisgICAgICogZXZlbiB0aG91Z2ggdGhpcyBpcyBhIGNhdGNoIDIyLiAgRG9uJ3QgZG8gdGhpcyB3aGVuIHN0YXJ0aW5nIHVwLAorICAgICAqIHNvbWVob3cgdGhlIG1lbnUgZ2V0cyB2ZXJ5IGhpZ2ggdGhlbi4gKi8KKyAgICBpZiAoZ3VpLnNoZWxsX2NyZWF0ZWQpCisJWHRWYVNldFZhbHVlcyhtZW51QmFyLCBYbU5oZWlnaHQsIGd1aS5tZW51X2hlaWdodCwgTlVMTCk7CisjZW5kaWYKK30KKworICAgIHZvaWQKK2d1aV9tY2hfYWRkX21lbnVfaXRlbShtZW51LCBpZHgpCisgICAgdmltbWVudV9UCSptZW51OworICAgIGludAkJaWR4OworeworICAgIFhtU3RyaW5nCWxhYmVsOworICAgIHZpbW1lbnVfVAkqcGFyZW50ID0gbWVudS0+cGFyZW50OworCisjIGlmZGVmIEVCQ0RJQworICAgIG1lbnUtPm1uZW1vbmljID0gMDsKKyMgZW5kaWYKKworIyBpZiAoWG1WZXJzaW9uIDw9IDEwMDIpCisgICAgLyogRG9uJ3QgYWRkIFBvcHVwIG1lbnUgaXRlbXMgd2hlbiB0aGUgcG9wdXAgbWVudSBpc24ndCB1c2VkLiAqLworICAgIGlmIChtZW51X2lzX2NoaWxkX29mX3BvcHVwKG1lbnUpICYmICFtb3VzZV9tb2RlbF9wb3B1cCgpKQorCXJldHVybjsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICBpZiAobWVudV9pc190b29sYmFyKHBhcmVudC0+bmFtZSkpCisgICAgeworCVdpZGdldENsYXNzCXR5cGU7CisJWG1TdHJpbmcJeG1zID0gTlVMTDsgICAgLyogZmFsbGJhY2sgbGFiZWwgaWYgcGl4bWFwIG5vdCBmb3VuZCAqLworCWludAkJbjsKKwlBcmcJCWFyZ3NbMThdOworCisJbiA9IDA7CisJaWYgKG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpKQorCXsKKwkgICAgY2hhcgkqY3A7CisJICAgIERpbWVuc2lvbgl3aWQ7CisKKwkgICAgLyoKKwkgICAgICogQSBzZXBhcmF0b3IgaGFzIHRoZSBmb3JtYXQgIi1zZXAlZFs6JWRdLSIuIFRoZSBvcHRpb25hbCA6JWQgaXMKKwkgICAgICogYSB3aWR0aCBzcGVjaWZpZXIuIElmIG5vIHdpZHRoIGlzIHNwZWNpZmllZCB0aGVuIHdlIGNob29zZSBvbmUuCisJICAgICAqLworCSAgICBjcCA9IChjaGFyICopdmltX3N0cmNocihtZW51LT5uYW1lLCAnOicpOworCSAgICBpZiAoY3AgIT0gTlVMTCkKKwkJd2lkID0gKERpbWVuc2lvbilhdG9pKCsrY3ApOworCSAgICBlbHNlCisJCXdpZCA9IDQ7CisKKyNpZiAwCisJICAgIC8qIFdlIGJldHRlciB1c2UgYSBGb3JtV2lkZ2V0IGhlcmUsIHNpbmNlIGl0J3MgZmFyIG1vcmUKKwkgICAgICogZmxleGlibGUgaW4gdGVybXMgb2Ygc2l6ZS4gICovCisJICAgIHR5cGUgPSB4bUZvcm1XaWRnZXRDbGFzczsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Od2lkdGgsIHdpZCk7IG4rKzsKKyNlbHNlCisJICAgIHR5cGUgPSB4bVNlcGFyYXRvcldpZGdldENsYXNzOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU53aWR0aCwgd2lkKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5taW5XaWR0aCwgd2lkKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5vcmllbnRhdGlvbiwgWG1WRVJUSUNBTCk7IG4rKzsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Oc2VwYXJhdG9yVHlwZSwgWG1OT19MSU5FKTsgbisrOworI2VuZGlmCisJfQorCWVsc2UKKwl7CisJICAgIGdldF90b29sYmFyX3BpeG1hcChtZW51LCAmbWVudS0+aW1hZ2UsICZtZW51LT5pbWFnZV9pbnMpOworCSAgICAvKiBTZXQgdGhlIGxhYmVsIGhlcmUsIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBiZXR3ZWVuIGljb25zL3RleHQKKwkgICAgICogYnkgY2hhbmdpbmcgdGhlIFhtTmxhYmVsVHlwZSByZXNvdXJjZS4gKi8KKwkgICAgeG1zID0gWG1TdHJpbmdDcmVhdGUoKGNoYXIgKiltZW51LT5kbmFtZSwgU1RSSU5HX1RBRyk7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsU3RyaW5nLCB4bXMpOyBuKys7CisKKyNpZm5kZWYgRkVBVF9TVU5fV09SS1NIT1AKKworCSAgICAvKiBXaXRob3V0IHNoYWRvd3Mgb25lIGNhbid0IHNlbnNlIHdoYXRldmVyIHRoZSBidXR0b24gaGFzIGJlZW4KKwkgICAgICogcHJlc3NlZCBvciBub3QhIEhvd2V2ZXIgd2Ugd2FuJ3QgdG8gc2F2ZSBhIGJpdCBvZiBzcGFjZS4uLgorCSAgICAgKi8KKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OaGlnaGxpZ2h0VGhpY2tuZXNzLCAwKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5oaWdobGlnaHRPbkVudGVyLCBUcnVlKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5tYXJnaW5XaWR0aCwgMCk7IG4rKzsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObWFyZ2luSGVpZ2h0LCAwKTsgbisrOworI2VuZGlmCisJICAgIGlmIChtZW51LT5pbWFnZSA9PSAwKQorCSAgICB7CisJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsVHlwZSwgWG1TVFJJTkcpOyBuKys7CisJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsUGl4bWFwLCAwKTsgbisrOworCQlYdFNldEFyZyhhcmdzW25dLCBYbU5sYWJlbEluc2Vuc2l0aXZlUGl4bWFwLCAwKTsgbisrOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlYdFNldEFyZyhhcmdzW25dLCBYbU5sYWJlbFBpeG1hcCwgbWVudS0+aW1hZ2UpOyBuKys7CisJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsSW5zZW5zaXRpdmVQaXhtYXAsIG1lbnUtPmltYWdlX2lucyk7IG4rKzsKKwkJWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGFiZWxUeXBlLCBYbVBJWE1BUCk7IG4rKzsKKwkgICAgfQorCSAgICB0eXBlID0geG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3M7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTndpZHRoLCA4MCk7IG4rKzsKKwl9CisKKwlYdFNldEFyZyhhcmdzW25dLCBYbU5wb3NpdGlvbkluZGV4LCBpZHgpOyBuKys7CisJaWYgKG1lbnUtPmlkID09IE5VTEwpCisJeworCSAgICBtZW51LT5pZCA9IFh0Q3JlYXRlTWFuYWdlZFdpZGdldCgoY2hhciAqKW1lbnUtPmRuYW1lLAorCQkJdHlwZSwgdG9vbEJhciwgYXJncywgbik7CisJICAgIGlmIChtZW51LT5pZCAhPSBOVUxMICYmIHR5cGUgPT0geG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MpCisJICAgIHsKKwkJWHRBZGRDYWxsYmFjayhtZW51LT5pZCwKKwkJCVhtTmFjdGl2YXRlQ2FsbGJhY2ssIGd1aV94MTFfbWVudV9jYiwgbWVudSk7CisKKyMgaWZkZWYgRkVBVF9GT09URVIKKwkJWHRBZGRFdmVudEhhbmRsZXIobWVudS0+aWQsIEVudGVyV2luZG93TWFzaywgRmFsc2UsCisJCQl0b29sYmFyYnV0dG9uX2VudGVyX2NiLCBtZW51KTsKKwkJWHRBZGRFdmVudEhhbmRsZXIobWVudS0+aWQsIExlYXZlV2luZG93TWFzaywgRmFsc2UsCisJCQl0b29sYmFyYnV0dG9uX2xlYXZlX2NiLCBtZW51KTsKKyMgZW5kaWYKKwkgICAgfQorCX0KKwllbHNlCisJICAgIFh0U2V0VmFsdWVzKG1lbnUtPmlkLCBhcmdzLCBuKTsKKwlpZiAoeG1zICE9IE5VTEwpCisJICAgIFhtU3RyaW5nRnJlZSh4bXMpOworCisjaWZkZWYgRkVBVF9CRVZBTAorCWd1aV9tY2hfbWVudV9zZXRfdGlwKG1lbnUpOworI2VuZGlmCisKKwltZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisJbWVudS0+c3VibWVudV9pZCA9IE5VTEw7CisJLyogV2hlbiBhZGRpbmcgZmlyc3QgaXRlbSB0byB0b29sYmFyIGl0IG1pZ2h0IGhhdmUgdG8gYmUgZW5hYmxlZCAuKi8KKwlpZiAoIVh0SXNNYW5hZ2VkKFh0UGFyZW50KHRvb2xCYXIpKQorCQkgICAgJiYgdmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKQorCSAgICBndWlfbWNoX3Nob3dfdG9vbGJhcihUUlVFKTsKKwlndWkudG9vbGJhcl9oZWlnaHQgPSBndWlfbWNoX2NvbXB1dGVfdG9vbGJhcl9oZWlnaHQoKTsKKwlyZXR1cm47CisgICAgfSAvKiB0b29sYmFyIG1lbnUgaXRlbSAqLworIyBlbmRpZgorCisgICAgLyogTm8gcGFyZW50LCBtdXN0IGJlIGEgbm9uLW1lbnViYXIgbWVudSAqLworICAgIGlmIChwYXJlbnQtPnN1Ym1lbnVfaWQgPT0gKFdpZGdldCkwKQorCXJldHVybjsKKworICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSAoV2lkZ2V0KTA7CisKKyAgICAvKiBBZGQgbWVudSBzZXBhcmF0b3IgKi8KKyAgICBpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkpCisgICAgeworCW1lbnUtPmlkID0gWHRWYUNyZWF0ZVdpZGdldCgic3ViTWVudSIsCisJCXhtU2VwYXJhdG9yR2FkZ2V0Q2xhc3MsIHBhcmVudC0+c3VibWVudV9pZCwKKyNpZiAoWG1WZXJzaW9uID49IDEwMDIpCisJCS8qIGNvdW50IHRoZSB0ZWFyb2ZmIGl0ZW0gKG5lZWRlZCBmb3IgTGVzc1RpZikgKi8KKwkJWG1OcG9zaXRpb25JbmRleCwgaWR4ICsgKHRlYXJvZmZfdmFsID09IChpbnQpWG1URUFSX09GRl9FTkFCTEVECisJCQkJCQkJCSAgICAgPyAxIDogMCksCisjZW5kaWYKKwkJTlVMTCk7CisJZ3VpX21vdGlmX21lbnVfY29sb3JzKG1lbnUtPmlkKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgbGFiZWwgPSBYbVN0cmluZ0NyZWF0ZSgoY2hhciAqKW1lbnUtPmRuYW1lLCBTVFJJTkdfVEFHKTsKKyAgICBpZiAobGFiZWwgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgbWVudS0+aWQgPSBYdFZhQ3JlYXRlV2lkZ2V0KCJzdWJNZW51IiwKKwl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgcGFyZW50LT5zdWJtZW51X2lkLAorCVhtTmxhYmVsU3RyaW5nLCBsYWJlbCwKKwlYbU5tbmVtb25pYywgbWVudS0+bW5lbW9uaWMsCisjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorCS8qIGNvdW50IHRoZSB0ZWFyb2ZmIGl0ZW0gKG5lZWRlZCBmb3IgTGVzc1RpZikgKi8KKwlYbU5wb3NpdGlvbkluZGV4LCBpZHggKyAodGVhcm9mZl92YWwgPT0gKGludClYbVRFQVJfT0ZGX0VOQUJMRUQKKwkJCQkJCQkJICAgICA/IDEgOiAwKSwKKyNlbmRpZgorCU5VTEwpOworICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyhtZW51LT5pZCk7CisgICAgZ3VpX21vdGlmX21lbnVfZm9udGxpc3QobWVudS0+aWQpOworICAgIFhtU3RyaW5nRnJlZShsYWJlbCk7CisKKyAgICBpZiAobWVudS0+aWQgIT0gKFdpZGdldCkwKQorICAgIHsKKwlYdEFkZENhbGxiYWNrKG1lbnUtPmlkLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLCBndWlfeDExX21lbnVfY2IsCisJCShYdFBvaW50ZXIpbWVudSk7CisJLyogYWRkIGFjY2VsZXJhdG9yIHRleHQgKi8KKwlndWlfbW90aWZfYWRkX2FjdGV4dChtZW51KTsKKyAgICB9Cit9CisKKyNpZiAoWG1WZXJzaW9uIDw9IDEwMDIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGRlc3Ryb3kvY3JlYXRlIHRoZSBwb3B1cCBtZW51cyBkeW5hbWljYWxseSwKKyAqIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgJ21vdXNlbW9kZWwnLgorICogVGhpcyB3aWxsIGZpeCB0aGUgInJpZ2h0IG1vdXNlIGJ1dHRvbiBmcmVlemUiIHRoYXQgb2NjdXJzIHdoZW4KKyAqIHRoZXJlIGV4aXN0cyBhIHBvcHVwIG1lbnUgYnV0IGl0IGlzbid0IG1hbmFnZWQuCisgKi8KKyAgICB2b2lkCitndWlfbW90aWZfdXBkYXRlX21vdXNlbW9kZWwobWVudSkKKyAgICB2aW1tZW51X1QJKm1lbnU7Cit7CisgICAgaW50CQlpZHggPSAwOworCisgICAgLyogV2hlbiBHVUkgaGFzbid0IHN0YXJ0ZWQgdGhlIG1lbnVzIGhhdmUgbm90IGJlZW4gY3JlYXRlZC4gKi8KKyAgICBpZiAoIWd1aS5pbl91c2UpCisgICAgICByZXR1cm47CisKKyAgICB3aGlsZSAobWVudSkKKyAgICB7CisgICAgICBpZiAobWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkKKyAgICAgIHsKKwkgIGlmIChtZW51X2lzX3BvcHVwKG1lbnUtPm5hbWUpKQorCSAgeworCSAgICAgIGlmIChtb3VzZV9tb2RlbF9wb3B1cCgpKQorCSAgICAgIHsKKwkJICAvKiBQb3B1cCBtZW51IHdpbGwgYmUgdXNlZC4gIENyZWF0ZSB0aGUgcG9wdXAgbWVudXMuICovCisJCSAgZ3VpX21jaF9hZGRfbWVudShtZW51LCBpZHgpOworCQkgIGd1aV9tb3RpZl91cGRhdGVfbW91c2Vtb2RlbChtZW51LT5jaGlsZHJlbik7CisJICAgICAgfQorCSAgICAgIGVsc2UKKwkgICAgICB7CisJCSAgLyogUG9wdXAgbWVudSB3aWxsIG5vdCBiZSB1c2VkLiAgRGVzdHJveSB0aGUgcG9wdXAgbWVudXMuICovCisJCSAgZ3VpX21vdGlmX3VwZGF0ZV9tb3VzZW1vZGVsKG1lbnUtPmNoaWxkcmVuKTsKKwkJICBndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChtZW51X2lzX2NoaWxkX29mX3BvcHVwKG1lbnUpKQorICAgICAgeworCSAgaWYgKG1vdXNlX21vZGVsX3BvcHVwKCkpCisJICAgICAgZ3VpX21jaF9hZGRfbWVudV9pdGVtKG1lbnUsIGlkeCk7CisJICBlbHNlCisJICAgICAgZ3VpX21jaF9kZXN0cm95X21lbnUobWVudSk7CisgICAgICB9CisgICAgICBtZW51ID0gbWVudS0+bmV4dDsKKyAgICAgICsraWR4OworICAgIH0KK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9uZXdfbWVudV9jb2xvcnMoKQoreworICAgIGlmIChtZW51QmFyID09IChXaWRnZXQpMCkKKwlyZXR1cm47CisgICAgZ3VpX21vdGlmX21lbnVfY29sb3JzKG1lbnVCYXIpOworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyh0b29sQmFyRnJhbWUpOworICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyh0b29sQmFyKTsKKyNlbmRpZgorCisgICAgZ3VpX21jaF9zdWJtZW51X2NoYW5nZShyb290X21lbnUsIFRSVUUpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9uZXdfbWVudV9mb250KCkKK3sKKyAgICBpZiAobWVudUJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworICAgIGd1aV9tY2hfc3VibWVudV9jaGFuZ2Uocm9vdF9tZW51LCBGQUxTRSk7CisgICAgeworCURpbWVuc2lvbiAgIGhlaWdodDsKKwlQb3NpdGlvbiB3LCBoOworCisJWHRWYUdldFZhbHVlcyhtZW51QmFyLCBYbU5oZWlnaHQsICZoZWlnaHQsIE5VTEwpOworCWd1aS5tZW51X2hlaWdodCA9IGhlaWdodDsKKworCVh0VmFHZXRWYWx1ZXModmltU2hlbGwsIFh0TndpZHRoLCAmdywgWHROaGVpZ2h0LCAmaCwgTlVMTCk7CisJZ3VpX3Jlc2l6ZV9zaGVsbCh3LCBoCisjaWZkZWYgRkVBVF9YSU0KKwkJLSB4aW1fZ2V0X3N0YXR1c19hcmVhX2hlaWdodCgpCisjZW5kaWYKKwkJICAgICApOworICAgIH0KKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgVFJVRSk7CisgICAgdWlfbmV3X3NoZWxsc2l6ZSgpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0JFVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK2d1aV9tY2hfbmV3X3Rvb2x0aXBfZm9udCgpCit7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIHZpbW1lbnVfVCAgICptZW51OworCisgICAgaWYgKHRvb2xCYXIgPT0gKFdpZGdldCkwKQorCXJldHVybjsKKworICAgIG1lbnUgPSBndWlfZmluZF9tZW51KChjaGFyX3UgKikiVG9vbEJhciIpOworICAgIGlmIChtZW51ICE9IE5VTEwpCisJZ3VpX21jaF9zdWJtZW51X2NoYW5nZShtZW51LCBGQUxTRSk7CisjIGVuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX25ld190b29sdGlwX2NvbG9ycygpCit7CisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIHZpbW1lbnVfVCAgICp0b29sYmFyOworCisgICAgaWYgKHRvb2xCYXIgPT0gKFdpZGdldCkwKQorCXJldHVybjsKKworICAgIHRvb2xiYXIgPSBndWlfZmluZF9tZW51KChjaGFyX3UgKikiVG9vbEJhciIpOworICAgIGlmICh0b29sYmFyICE9IE5VTEwpCisJZ3VpX21jaF9zdWJtZW51X2NoYW5nZSh0b29sYmFyLCBUUlVFKTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQKK2d1aV9tY2hfc3VibWVudV9jaGFuZ2UobWVudSwgY29sb3JzKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCWNvbG9yczsJCS8qIFRSVUUgZm9yIGNvbG9ycywgRkFMU0UgZm9yIGZvbnQgKi8KK3sKKyAgICB2aW1tZW51X1QJKm1wOworCisgICAgZm9yIChtcCA9IG1lbnU7IG1wICE9IE5VTEw7IG1wID0gbXAtPm5leHQpCisgICAgeworCWlmIChtcC0+aWQgIT0gKFdpZGdldCkwKQorCXsKKwkgICAgaWYgKGNvbG9ycykKKwkgICAgeworCQlndWlfbW90aWZfbWVudV9jb2xvcnMobXAtPmlkKTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwkJLyogRm9yIGEgdG9vbGJhciBpdGVtOiBGcmVlIHRoZSBwaXhtYXAgYW5kIGFsbG9jYXRlIGEgbmV3IG9uZSwKKwkJICogc28gdGhhdCB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyByaWdodC4gKi8KKwkJaWYgKG1wLT5pbWFnZSAhPSAoUGl4bWFwKTApCisJCXsKKwkJICAgIFhGcmVlUGl4bWFwKGd1aS5kcHksIG1wLT5pbWFnZSk7CisJCSAgICBYRnJlZVBpeG1hcChndWkuZHB5LCBtcC0+aW1hZ2VfaW5zKTsKKwkJICAgIGdldF90b29sYmFyX3BpeG1hcChtcCwgJm1wLT5pbWFnZSwgJm1wLT5pbWFnZV9pbnMpOworCQkgICAgaWYgKG1wLT5pbWFnZSAhPSAoUGl4bWFwKTApCisJCQlYdFZhU2V0VmFsdWVzKG1wLT5pZCwKKwkJCQlYbU5sYWJlbFBpeG1hcCwgbXAtPmltYWdlLAorCQkJCVhtTmxhYmVsSW5zZW5zaXRpdmVQaXhtYXAsIG1wLT5pbWFnZV9pbnMsCisJCQkJTlVMTCk7CisJCX0KKyMgaWZkZWYgRkVBVF9CRVZBTAorCQkvKiBJZiB3ZSBoYXZlIGEgdG9vbHRpcCwgdGhlbiB3ZSBuZWVkIHRvIGNoYW5nZSBpdCdzIGZvbnQgKi8KKwkJaWYgKG1wLT50aXAgIT0gTlVMTCkKKwkJeworCQkgICAgQXJnIGFyZ3NbMl07CisKKwkJICAgIGFyZ3NbMF0ubmFtZSA9IFhtTmJhY2tncm91bmQ7CisJCSAgICBhcmdzWzBdLnZhbHVlID0gZ3VpLnRvb2x0aXBfYmdfcGl4ZWw7CisJCSAgICBhcmdzWzFdLm5hbWUgPSBYbU5mb3JlZ3JvdW5kOworCQkgICAgYXJnc1sxXS52YWx1ZSA9IGd1aS50b29sdGlwX2ZnX3BpeGVsOworCQkgICAgWHRTZXRWYWx1ZXMobXAtPnRpcC0+YmFsbG9vbkxhYmVsLCAmYXJnc1swXSwgWHROdW1iZXIoYXJncykpOworCQl9CisjIGVuZGlmCisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZ3VpX21vdGlmX21lbnVfZm9udGxpc3QobXAtPmlkKTsKKyNpZmRlZiBGRUFUX0JFVkFMCisJCS8qIElmIHdlIGhhdmUgYSB0b29sdGlwLCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIGl0J3MgZm9udCAqLworCQlpZiAobXAtPnRpcCAhPSBOVUxMKQorCQl7CisJCSAgICBBcmcgYXJnc1sxXTsKKworCQkgICAgYXJnc1swXS5uYW1lID0gWG1OZm9udExpc3Q7CisJCSAgICBhcmdzWzBdLnZhbHVlID0gKFh0QXJnVmFsKWd1aV9tb3RpZl9mb250c2V0MmZvbnRsaXN0KAorCQkJCQkJICAgICZndWkudG9vbHRpcF9mb250c2V0KTsKKwkJICAgIFh0U2V0VmFsdWVzKG1wLT50aXAtPmJhbGxvb25MYWJlbCwgJmFyZ3NbMF0sIFh0TnVtYmVyKGFyZ3MpKTsKKwkJfQorI2VuZGlmCisJICAgIH0KKwl9CisKKwlpZiAobXAtPmNoaWxkcmVuICE9IE5VTEwpCisJeworI2lmIChYbVZlcnNpb24gPj0gMTAwMikKKwkgICAgLyogU2V0IHRoZSBjb2xvcnMvZm9udCBmb3IgdGhlIHRlYXIgb2ZmIHdpZGdldCAqLworCSAgICBpZiAobXAtPnN1Ym1lbnVfaWQgIT0gKFdpZGdldCkwKQorCSAgICB7CisJCWlmIChjb2xvcnMpCisJCSAgICBndWlfbW90aWZfbWVudV9jb2xvcnMobXAtPnN1Ym1lbnVfaWQpOworCQllbHNlCisJCSAgICBndWlfbW90aWZfbWVudV9mb250bGlzdChtcC0+c3VibWVudV9pZCk7CisJCXRvZ2dsZV90ZWFyb2ZmKG1wLT5zdWJtZW51X2lkKTsKKwkgICAgfQorI2VuZGlmCisJICAgIC8qIFNldCB0aGUgY29sb3JzIGZvciB0aGUgY2hpbGRyZW4gKi8KKwkgICAgZ3VpX21jaF9zdWJtZW51X2NoYW5nZShtcC0+Y2hpbGRyZW4sIGNvbG9ycyk7CisJfQorICAgIH0KK30KKworLyoKKyAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICAvKiBQbGVhc2UgYmUgc3VyZSB0byBkZXN0cm95IHRoZSBwYXJlbnQgd2lkZ2V0IGZpcnN0IChpLmUuIG1lbnUtPmlkKS4KKyAgICAgKiBPbiB0aGUgb3RoZXIgaGFuZCwgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlcG9ydGVkIHRoYXQgdGhlIHN1Ym1lbnUgbXVzdCBiZQorICAgICAqIGRlbGV0ZWQgZmlyc3QuLi4KKyAgICAgKgorICAgICAqIFRoaXMgY29kZSBzaG91bGQgYmUgYmFzaWNhbGx5IGlkZW50aWNhbCB0byB0aGF0IGluIHRoZSBmaWxlIGd1aV9hdGhlbmEuYworICAgICAqIGJlY2F1c2UgdGhleSBhcmUgYm90aCBYdCBiYXNlZC4KKyAgICAgKi8KKyAgICBpZiAobWVudS0+c3VibWVudV9pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCVh0RGVzdHJveVdpZGdldChtZW51LT5zdWJtZW51X2lkKTsKKwltZW51LT5zdWJtZW51X2lkID0gKFdpZGdldCkwOworICAgIH0KKworICAgIGlmIChtZW51LT5pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCVdpZGdldAkgICAgcGFyZW50OworCisJcGFyZW50ID0gWHRQYXJlbnQobWVudS0+aWQpOworI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpCisJaWYgKChwYXJlbnQgPT0gdG9vbEJhcikgJiYgKG1lbnUtPnRpcCAhPSBOVUxMKSkKKwl7CisJICAgIC8qIFdlIHRyeSB0byBkZXN0cm95IHRoaXMgYmVmb3JlIHRoZSBhY3R1YWwgbWVudSwgYmVjYXVzZSB0aGVyZSBhcmUKKwkgICAgICogY2FsbGJhY2tzLCBldGMuIHRoYXQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQgZHVyaW5nIHRoZSB0b29sdGlwCisJICAgICAqIGRlc3RydWN0aW9uLgorCSAgICAgKgorCSAgICAgKiBJZiB5b3UgY2FsbCAiZ3VpX21jaF9kZXN0cm95X2JldmFsX2FyZWEoKSIgYWZ0ZXIgZGVzdHJveWluZworCSAgICAgKiBtZW51LT5pZCwgdGhlbiB0aGUgdG9vbHRpcCdzIHdpbmRvdyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCisJICAgICAqIGRlYWxsb2NhdGVkIGJ5IFh0LCBhbmQgdW5rbm93biBiZWhhdmlvdXIgd2lsbCBlbnN1ZSAocHJvYmFibHkKKwkgICAgICogYSBjb3JlIGR1bXApLgorCSAgICAgKi8KKwkgICAgZ3VpX21jaF9kZXN0cm95X2JldmFsX2FyZWEobWVudS0+dGlwKTsKKwkgICAgbWVudS0+dGlwID0gTlVMTDsKKwl9CisjZW5kaWYKKwlYdERlc3Ryb3lXaWRnZXQobWVudS0+aWQpOworCW1lbnUtPmlkID0gKFdpZGdldCkwOworCWlmIChwYXJlbnQgPT0gbWVudUJhcikKKwkgICAgZ3VpX21jaF9jb21wdXRlX21lbnVfaGVpZ2h0KChXaWRnZXQpMCk7CisjaWZkZWYgRkVBVF9UT09MQkFSCisJZWxzZSBpZiAocGFyZW50ID09IHRvb2xCYXIpCisJeworCSAgICBDYXJkaW5hbCAgICBudW1fY2hpbGRyZW47CisKKwkgICAgLyogV2hlbiByZW1vdmluZyBsYXN0IHRvb2xiYXIgaXRlbSwgZG9uJ3QgZGlzcGxheSB0aGUgdG9vbGJhci4gKi8KKwkgICAgWHRWYUdldFZhbHVlcyh0b29sQmFyLCBYbU5udW1DaGlsZHJlbiwgJm51bV9jaGlsZHJlbiwgTlVMTCk7CisJICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKwkJZ3VpX21jaF9zaG93X3Rvb2xiYXIoRkFMU0UpOworCSAgICBlbHNlCisJCWd1aS50b29sYmFyX2hlaWdodCA9IGd1aV9tY2hfY29tcHV0ZV90b29sYmFyX2hlaWdodCgpOworCX0KKyNlbmRpZgorICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KKyAgICB2b2lkCitndWlfbWNoX3Nob3dfcG9wdXBtZW51KG1lbnUpCisgICAgdmltbWVudV9UICptZW51OworeworI2lmZGVmIE1PVElGX1BPUFVQCisgICAgWG1NZW51UG9zaXRpb24obWVudS0+c3VibWVudV9pZCwgZ3VpX3gxMV9nZXRfbGFzdF9tb3VzZV9ldmVudCgpKTsKKyAgICBYdE1hbmFnZUNoaWxkKG1lbnUtPnN1Ym1lbnVfaWQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGRUFUX01FTlUgKi8KKworLyoKKyAqIFNldCB0aGUgbWVudSBhbmQgc2Nyb2xsYmFyIGNvbG9ycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVmX2NvbG9ycygpCit7CisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCS8qIFVzZSB0aGUgdmFsdWVzIHNhdmVkIHdoZW4gc3RhcnRpbmcgdXAuICBUaGVzZSBzaG91bGQgY29tZSBmcm9tIHRoZQorCSAqIHdpbmRvdyBtYW5hZ2VyIG9yIGEgcmVzb3VyY2VzIGZpbGUuICovCisJZ3VpLm1lbnVfZmdfcGl4ZWwgPSBndWkubWVudV9kZWZfZmdfcGl4ZWw7CisJZ3VpLm1lbnVfYmdfcGl4ZWwgPSBndWkubWVudV9kZWZfYmdfcGl4ZWw7CisJZ3VpLnNjcm9sbF9mZ19waXhlbCA9IGd1aS5zY3JvbGxfZGVmX2ZnX3BpeGVsOworCWd1aS5zY3JvbGxfYmdfcGl4ZWwgPSBndWkuc2Nyb2xsX2RlZl9iZ19waXhlbDsKKyNpZmRlZiBGRUFUX0JFVkFMCisJZ3VpLnRvb2x0aXBfZmdfcGl4ZWwgPQorCQkJZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZ3VpLnJzcmNfdG9vbHRpcF9mZ19uYW1lKTsKKwlndWkudG9vbHRpcF9iZ19waXhlbCA9CisJCQlndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY190b29sdGlwX2JnX25hbWUpOworI2VuZGlmCisgICAgfQorfQorCisKKy8qCisgKiBTY3JvbGxiYXIgc3R1ZmYuCisgKi8KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYihzYiwgdmFsLCBzaXplLCBtYXgpCisgICAgc2Nyb2xsYmFyX1QgKnNiOworICAgIGxvbmcJdmFsOworICAgIGxvbmcJc2l6ZTsKKyAgICBsb25nCW1heDsKK3sKKyAgICBpZiAoc2ItPmlkICE9IChXaWRnZXQpMCkKKwlYdFZhU2V0VmFsdWVzKHNiLT5pZCwKKwkJICBYbU52YWx1ZSwgdmFsLAorCQkgIFhtTnNsaWRlclNpemUsIHNpemUsCisJCSAgWG1OcGFnZUluY3JlbWVudCwgKHNpemUgPiAyID8gc2l6ZSAtIDIgOiAxKSwKKwkJICBYbU5tYXhpbXVtLCBtYXggKyAxLAkgICAgLyogTW90aWYgaGFzIG1heCBvbmUgcGFzdCB0aGUgZW5kICovCisJCSAgTlVMTCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKHNiLCB4LCB5LCB3LCBoKQorICAgIHNjcm9sbGJhcl9UICpzYjsKKyAgICBpbnQJCXg7CisgICAgaW50CQl5OworICAgIGludAkJdzsKKyAgICBpbnQJCWg7Cit7CisgICAgaWYgKHNiLT5pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCWlmIChzYi0+dHlwZSA9PSBTQkFSX0xFRlQgfHwgc2ItPnR5cGUgPT0gU0JBUl9SSUdIVCkKKwl7CisJICAgIGlmICh5ID09IDApCisJCWggLT0gZ3VpLmJvcmRlcl9vZmZzZXQ7CisJICAgIGVsc2UKKwkJeSAtPSBndWkuYm9yZGVyX29mZnNldDsKKwkgICAgWHRWYVNldFZhbHVlcyhzYi0+aWQsCisJCQkgIFhtTnRvcE9mZnNldCwgeSwKKwkJCSAgWG1OYm90dG9tT2Zmc2V0LCAteSAtIGgsCisJCQkgIFhtTndpZHRoLCB3LAorCQkJICBOVUxMKTsKKwl9CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKHNiLT5pZCwKKwkJCSAgWG1OdG9wT2Zmc2V0LCB5LAorCQkJICBYbU5sZWZ0T2Zmc2V0LCB4LAorCQkJICBYbU5yaWdodE9mZnNldCwgZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0KKwkJCQkJCSAgICA/IGd1aS5zY3JvbGxiYXJfd2lkdGggOiAwLAorCQkJICBYbU5oZWlnaHQsIGgsCisJCQkgIE5VTEwpOworCVh0TWFuYWdlQ2hpbGQoc2ItPmlkKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2IsIGZsYWcpCisgICAgc2Nyb2xsYmFyX1QgKnNiOworICAgIGludAkJZmxhZzsKK3sKKyAgICBBcmcJCWFyZ3NbMTZdOworICAgIGludAkJbjsKKworICAgIGlmIChzYi0+aWQgIT0gKFdpZGdldCkwKQorICAgIHsKKwluID0gMDsKKwlpZiAoZmxhZykKKwl7CisJICAgIHN3aXRjaCAoc2ItPnR5cGUpCisJICAgIHsKKwkJY2FzZSBTQkFSX0xFRlQ6CisJCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sZWZ0T2Zmc2V0LCBndWkuc2Nyb2xsYmFyX3dpZHRoKTsgbisrOworCQkgICAgYnJlYWs7CisKKwkJY2FzZSBTQkFSX1JJR0hUOgorCQkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRPZmZzZXQsIGd1aS5zY3JvbGxiYXJfd2lkdGgpOyBuKys7CisJCSAgICBicmVhazsKKworCQljYXNlIFNCQVJfQk9UVE9NOgorCQkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OYm90dG9tT2Zmc2V0LCBndWkuc2Nyb2xsYmFyX2hlaWdodCk7bisrOworCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgWHRTZXRWYWx1ZXModGV4dEFyZWEsIGFyZ3MsIG4pOworCSAgICBYdE1hbmFnZUNoaWxkKHNiLT5pZCk7CisJfQorCWVsc2UKKwl7CisJICAgIGlmICghZ3VpLndoaWNoX3Njcm9sbGJhcnNbc2ItPnR5cGVdKQorCSAgICB7CisJCS8qIFRoZSBzY3JvbGxiYXJzIG9mIHRoaXMgdHlwZSBhcmUgYWxsIGRpc2FibGVkLCBhZGp1c3QgdGhlCisJCSAqIHRleHRBcmVhIGF0dGFjaG1lbnQgb2Zmc2V0LiAqLworCQlzd2l0Y2ggKHNiLT50eXBlKQorCQl7CisJCSAgICBjYXNlIFNCQVJfTEVGVDoKKwkJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxlZnRPZmZzZXQsIDApOyBuKys7CisJCQlicmVhazsKKworCQkgICAgY2FzZSBTQkFSX1JJR0hUOgorCQkJWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRPZmZzZXQsIDApOyBuKys7CisJCQlicmVhazsKKworCQkgICAgY2FzZSBTQkFSX0JPVFRPTToKKwkJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmJvdHRvbU9mZnNldCwgMCk7bisrOworCQkJYnJlYWs7CisJCX0KKwkJWHRTZXRWYWx1ZXModGV4dEFyZWEsIGFyZ3MsIG4pOworCSAgICB9CisJICAgIFh0VW5tYW5hZ2VDaGlsZChzYi0+aWQpOworCX0KKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoc2IsIG9yaWVudCkKKyAgICBzY3JvbGxiYXJfVCAqc2I7CisgICAgaW50CQlvcmllbnQ7CS8qIFNCQVJfVkVSVCBvciBTQkFSX0hPUklaICovCit7CisgICAgQXJnCQlhcmdzWzE2XTsKKyAgICBpbnQJCW47CisKKyAgICBuID0gMDsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5zaGFkb3dUaGlja25lc3MsIDEpOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1ObWluaW11bSwgMCk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5vcmllbnRhdGlvbiwKKwkgICAgKG9yaWVudCA9PSBTQkFSX1ZFUlQpID8gWG1WRVJUSUNBTCA6IFhtSE9SSVpPTlRBTCk7IG4rKzsKKworICAgIHN3aXRjaCAoc2ItPnR5cGUpCisgICAgeworCWNhc2UgU0JBUl9MRUZUOgorCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9PUFBPU0lURV9GT1JNKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNCQVJfUklHSFQ6CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0pOyBuKys7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX09QUE9TSVRFX0ZPUk0pOyBuKys7CisJICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNCQVJfQk9UVE9NOgorCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKwkgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworCSAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICBzYi0+aWQgPSBYdENyZWF0ZVdpZGdldCgic2Nyb2xsQmFyIiwKKwkgICAgeG1TY3JvbGxCYXJXaWRnZXRDbGFzcywgdGV4dEFyZWFGb3JtLCBhcmdzLCBuKTsKKworICAgIC8qIFJlbWVtYmVyIHRoZSBkZWZhdWx0IGNvbG9ycywgbmVlZGVkIGZvciAiOmhpIGNsZWFyIi4gKi8KKyAgICBpZiAoZ3VpLnNjcm9sbF9kZWZfYmdfcGl4ZWwgPT0gKGd1aWNvbG9yX1QpMAorCSAgICAmJiBndWkuc2Nyb2xsX2RlZl9mZ19waXhlbCA9PSAoZ3VpY29sb3JfVCkwKQorCVh0VmFHZXRWYWx1ZXMoc2ItPmlkLAorCQlYbU5iYWNrZ3JvdW5kLCAmZ3VpLnNjcm9sbF9kZWZfYmdfcGl4ZWwsCisJCVhtTmZvcmVncm91bmQsICZndWkuc2Nyb2xsX2RlZl9mZ19waXhlbCwKKwkJTlVMTCk7CisKKyAgICBpZiAoc2ItPmlkICE9IChXaWRnZXQpMCkKKyAgICB7CisJZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX2NvbG9ycyhzYik7CisJWHRBZGRDYWxsYmFjayhzYi0+aWQsIFhtTnZhbHVlQ2hhbmdlZENhbGxiYWNrLAorCQkgICAgICBzY3JvbGxfY2IsIChYdFBvaW50ZXIpc2ItPmlkZW50KTsKKwlYdEFkZENhbGxiYWNrKHNiLT5pZCwgWG1OZHJhZ0NhbGxiYWNrLAorCQkgICAgICBzY3JvbGxfY2IsIChYdFBvaW50ZXIpc2ItPmlkZW50KTsKKwlYdEFkZEV2ZW50SGFuZGxlcihzYi0+aWQsIEtleVByZXNzTWFzaywgRkFMU0UsIGd1aV94MTFfa2V5X2hpdF9jYiwKKwkgICAgKFh0UG9pbnRlcikwKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNiKQorICAgIHNjcm9sbGJhcl9UICpzYjsKK3sKKyAgICBpZiAoc2ItPmlkICE9IChXaWRnZXQpMCkKKwlYdERlc3Ryb3lXaWRnZXQoc2ItPmlkKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX2NvbG9ycyhzYikKKyAgICBzY3JvbGxiYXJfVCAqc2I7Cit7CisgICAgaWYgKHNiLT5pZCAhPSAoV2lkZ2V0KTApCisgICAgeworCWlmIChndWkuc2Nyb2xsX2JnX3BpeGVsICE9IElOVkFMQ09MT1IpCisJeworI2lmIChYbVZlcnNpb24+PTEwMDIpCisJICAgIFhtQ2hhbmdlQ29sb3Ioc2ItPmlkLCBndWkuc2Nyb2xsX2JnX3BpeGVsKTsKKyNlbHNlCisJICAgIFh0VmFTZXRWYWx1ZXMoc2ItPmlkLAorCQkgICAgWG1OdHJvdWdoQ29sb3IsIGd1aS5zY3JvbGxfYmdfcGl4ZWwsCisJCSAgICBOVUxMKTsKKyNlbmRpZgorCX0KKworCWlmIChndWkuc2Nyb2xsX2ZnX3BpeGVsICE9IElOVkFMQ09MT1IpCisJICAgIFh0VmFTZXRWYWx1ZXMoc2ItPmlkLAorCQkgICAgWG1OZm9yZWdyb3VuZCwgZ3VpLnNjcm9sbF9mZ19waXhlbCwKKyNpZiAoWG1WZXJzaW9uPDEwMDIpCisJCSAgICBYbU5iYWNrZ3JvdW5kLCBndWkuc2Nyb2xsX2ZnX3BpeGVsLAorI2VuZGlmCisJCSAgICBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHJlY3RhbmdsZSBiZWxvdyB0aGUgdmVydGljYWwgc2Nyb2xsYmFycy4gKi8KKyAgICBpZiAoc2IgPT0gJmd1aS5ib3R0b21fc2JhciAmJiB0ZXh0QXJlYUZvcm0gIT0gKFdpZGdldCkwKQorCWd1aV9tb3RpZl9zY3JvbGxfY29sb3JzKHRleHRBcmVhRm9ybSk7Cit9CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN0dWZmOgorICovCisKKyAgICBXaW5kb3cKK2d1aV94MTFfZ2V0X3dpZCgpCit7CisgICAgcmV0dXJuKFh0V2luZG93KHRleHRBcmVhKSk7Cit9CisKKworI2lmIGRlZmluZWQoRkVBVF9CUk9XU0UpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBmaWxlIHNlbGVjdG9yIHJlbGF0ZWQgc3R1ZmYKKyAqLworCisjaW5jbHVkZSA8WG0vRmlsZVNCLmg+CisjaW5jbHVkZSA8WG0vWG1TdHJEZWZzLmg+CisKK3R5cGVkZWYgc3RydWN0IGRpYWxvZ19jYWxsYmFja19hcmcKK3sKKyAgICBjaGFyICogIGFyZ3M7ICAgLyogbm90IHVzZWQgcmlnaHQgbm93ICovCisgICAgaW50CSAgICBpZDsKK30gZGNiYXJnX1Q7CisKK3N0YXRpYyBXaWRnZXQgZGlhbG9nX3dndDsKK3N0YXRpYyBjaGFyICpicm93c2VfZm5hbWUgPSBOVUxMOworc3RhdGljIFhtU3RyaW5nQ2hhclNldCBjaGFyc2V0ID0gKFhtU3RyaW5nQ2hhclNldCkgWG1TVFJJTkdfREVGQVVMVF9DSEFSU0VUOworCQkJCS8qIHVzZWQgdG8gc2V0IHVwIFhtU3RyaW5ncyAqLworCitzdGF0aWMgdm9pZCBEaWFsb2dDYW5jZWxDQiBfX0FSR1MoKFdpZGdldCwgWHRQb2ludGVyLCBYdFBvaW50ZXIpKTsKK3N0YXRpYyB2b2lkIERpYWxvZ0FjY2VwdENCIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIFh0UG9pbnRlcikpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgcHJlZGVmaW5lZCBsYWJlbCB0ZXh0IG9mIHRoZQorICogcHJlY29tcG9zZWQgZGlhbG9ncy4gV2UgZG8gdGhpcyBleHBsaWNpdGx5IHRvIGFsbG93OgorICoKKyAqIC0gdXNhZ2Ugb2YgZ2V0dGV4dCBmb3IgdHJhbnNsYXRpb24sIGFzIGluIGFsbCB0aGUgb3RoZXIgcGxhY2VzLgorICoKKyAqIC0gZXF1YWxpemUgdGhlIG1lc3NhZ2VzIGJldHdlZW4gZGlmZmVyZW50IEdVSSBpbXBsZW1lbnRhdGlvbnMgYXMgZmFyIGFzCisgKiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgc2V0X3ByZWRlZmluZWRfbGFiZWwgX19BUkdTKChXaWRnZXQgcGFyZW50LCBTdHJpbmcgbmFtZSwgY2hhciAqIG5ld19sYWJlbCkpOworCitzdGF0aWMgdm9pZAorc2V0X3ByZWRlZmluZWRfbGFiZWwocGFyZW50LCBuYW1lLCBuZXdfbGFiZWwpCisgICAgV2lkZ2V0IHBhcmVudDsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBjaGFyICogbmV3X2xhYmVsOworeworICAgIFhtU3RyaW5nIHN0cjsKKyAgICBXaWRnZXQgdzsKKworICAgIHcgPSBYdE5hbWVUb1dpZGdldChwYXJlbnQsIG5hbWUpOworCisgICAgaWYgKCF3KQorCXJldHVybjsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlKG5ld19sYWJlbCwgU1RSSU5HX1RBRyk7CisKKyAgICBpZiAoc3RyKQorICAgIHsKKwlYdFZhU2V0VmFsdWVzKHcsIFhtTmxhYmVsU3RyaW5nLCBzdHIsIE5VTEwpOworCVhtU3RyaW5nRnJlZShzdHIpOworICAgIH0KK30KKworLyoKKyAqIFB1dCB1cCBhIGZpbGUgcmVxdWVzdGVyLgorICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgbmFtZSBpbiBhbGxvY2F0ZWQgbWVtb3J5LCBvciBOVUxMIGZvciBDYW5jZWwuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgY2hhcl91ICoKK2d1aV9tY2hfYnJvd3NlKHNhdmluZywgdGl0bGUsIGRmbHQsIGV4dCwgaW5pdGRpciwgZmlsdGVyKQorICAgIGludAkJc2F2aW5nOwkJLyogc2VsZWN0IGZpbGUgdG8gd3JpdGUgKi8KKyAgICBjaGFyX3UJKnRpdGxlOwkJLyogdGl0bGUgZm9yIHRoZSB3aW5kb3cgKi8KKyAgICBjaGFyX3UJKmRmbHQ7CQkvKiBkZWZhdWx0IG5hbWUgKi8KKyAgICBjaGFyX3UJKmV4dDsJCS8qIG5vdCB1c2VkIChleHRlbnNpb24gYWRkZWQpICovCisgICAgY2hhcl91CSppbml0ZGlyOwkvKiBpbml0aWFsIGRpcmVjdG9yeSwgTlVMTCBmb3IgY3VycmVudCBkaXIgKi8KKyAgICBjaGFyX3UJKmZpbHRlcjsJLyogZmlsZSBuYW1lIGZpbHRlciAqLworeworICAgIGNoYXJfdQlkaXJidWZbTUFYUEFUSExdOworICAgIGNoYXJfdQlkZmx0YnVmW01BWFBBVEhMXTsKKyAgICBjaGFyX3UJKnBhdHRlcm47CisgICAgY2hhcl91CSp0b2ZyZWUgPSBOVUxMOworCisgICAgZGlhbG9nX3dndCA9IFhtQ3JlYXRlRmlsZVNlbGVjdGlvbkRpYWxvZyh2aW1TaGVsbCwgKGNoYXIgKil0aXRsZSwgTlVMTCwgMCk7CisKKyAgICBpZiAoaW5pdGRpciA9PSBOVUxMIHx8ICppbml0ZGlyID09IE5VTCkKKyAgICB7CisJbWNoX2Rpcm5hbWUoZGlyYnVmLCBNQVhQQVRITCk7CisJaW5pdGRpciA9IGRpcmJ1ZjsKKyAgICB9CisKKyAgICBpZiAoZGZsdCA9PSBOVUxMKQorCWRmbHQgPSAoY2hhcl91ICopIiI7CisgICAgZWxzZSBpZiAoU1RSTEVOKGluaXRkaXIpICsgU1RSTEVOKGRmbHQpICsgMiA8IE1BWFBBVEhMKQorICAgIHsKKwkvKiBUaGUgZGVmYXVsdCBzZWxlY3Rpb24gc2hvdWxkIGJlIHRoZSBmdWxsIHBhdGgsICJkZmx0IiBpcyBvbmx5IHRoZQorCSAqIGZpbGUgbmFtZS4gKi8KKwlTVFJDUFkoZGZsdGJ1ZiwgaW5pdGRpcik7CisJYWRkX3BhdGhzZXAoZGZsdGJ1Zik7CisJU1RSQ0FUKGRmbHRidWYsIGRmbHQpOworCWRmbHQgPSBkZmx0YnVmOworICAgIH0KKworICAgIC8qIENhbiBvbmx5IHVzZSBvbmUgcGF0dGVybiBmb3IgYSBmaWxlIG5hbWUuICBHZXQgdGhlIGZpcnN0IHBhdHRlcm4gb3V0IG9mCisgICAgICogdGhlIGZpbHRlci4gIEFuIGVtcHR5IHBhdHRlcm4gbWVhbnMgZXZlcnl0aGluZyBtYXRjaGVzLiAqLworICAgIGlmIChmaWx0ZXIgPT0gTlVMTCkKKwlwYXR0ZXJuID0gKGNoYXJfdSAqKSIiOworICAgIGVsc2UKKyAgICB7CisJY2hhcl91CSpzLCAqcDsKKworCXMgPSBmaWx0ZXI7CisJZm9yIChwID0gZmlsdGVyOyAqcCAhPSBOVUw7ICsrcCkKKwl7CisJICAgIGlmICgqcCA9PSAnXHQnKQkvKiBlbmQgb2YgZGVzY3JpcHRpb24sIHN0YXJ0IG9mIHBhdHRlcm4gKi8KKwkJcyA9IHAgKyAxOworCSAgICBpZiAoKnAgPT0gJzsnIHx8ICpwID09ICdcbicpCS8qIGVuZCBvZiAoZmlyc3QpIHBhdHRlcm4gKi8KKwkJYnJlYWs7CisJfQorCXBhdHRlcm4gPSB2aW1fc3RybnNhdmUocywgcCAtIHMpOworCXRvZnJlZSA9IHBhdHRlcm47CisJaWYgKHBhdHRlcm4gPT0gTlVMTCkKKwkgICAgcGF0dGVybiA9IChjaGFyX3UgKikiIjsKKyAgICB9CisKKyAgICBYdFZhU2V0VmFsdWVzKGRpYWxvZ193Z3QsCisJWHRWYVR5cGVkQXJnLAorCSAgICBYbU5kaXJlY3RvcnksIFhtUlN0cmluZywgKGNoYXIgKilpbml0ZGlyLCBTVFJMRU4oaW5pdGRpcikgKyAxLAorCVh0VmFUeXBlZEFyZywKKwkgICAgWG1OZGlyU3BlYywJWG1SU3RyaW5nLCAoY2hhciAqKWRmbHQsIFNUUkxFTihkZmx0KSArIDEsCisJWHRWYVR5cGVkQXJnLAorCSAgICBYbU5wYXR0ZXJuLAlYbVJTdHJpbmcsIChjaGFyICopcGF0dGVybiwgU1RSTEVOKHBhdHRlcm4pICsgMSwKKwlYdFZhVHlwZWRBcmcsCisJICAgIFhtTmRpYWxvZ1RpdGxlLCBYbVJTdHJpbmcsIChjaGFyICopdGl0bGUsIFNUUkxFTih0aXRsZSkgKyAxLAorCU5VTEwpOworCisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkFwcGx5IiwgXygiRmlsdGVyIikpOworICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJDYW5jZWwiLCBfKCJDYW5jZWwiKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkRpciIsIF8oIkRpcmVjdG9yaWVzIikpOworICAgIHNldF9wcmVkZWZpbmVkX2xhYmVsKGRpYWxvZ193Z3QsICJGaWx0ZXJMYWJlbCIsIF8oIkZpbHRlciIpKTsKKyAgICBzZXRfcHJlZGVmaW5lZF9sYWJlbChkaWFsb2dfd2d0LCAiSGVscCIsIF8oIkhlbHAiKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIkl0ZW1zIiwgXygiRmlsZXMiKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIk9LIiwgXygiT0siKSk7CisgICAgc2V0X3ByZWRlZmluZWRfbGFiZWwoZGlhbG9nX3dndCwgIlNlbGVjdGlvbiIsIF8oIlNlbGVjdGlvbiIpKTsKKworICAgIGd1aV9tb3RpZl9tZW51X2NvbG9ycyhkaWFsb2dfd2d0KTsKKyAgICBpZiAoZ3VpLnNjcm9sbF9iZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCVh0VmFTZXRWYWx1ZXMoZGlhbG9nX3dndCwgWG1OdHJvdWdoQ29sb3IsIGd1aS5zY3JvbGxfYmdfcGl4ZWwsIE5VTEwpOworCisgICAgWHRBZGRDYWxsYmFjayhkaWFsb2dfd2d0LCBYbU5va0NhbGxiYWNrLCBEaWFsb2dBY2NlcHRDQiwgKFh0UG9pbnRlcikwKTsKKyAgICBYdEFkZENhbGxiYWNrKGRpYWxvZ193Z3QsIFhtTmNhbmNlbENhbGxiYWNrLCBEaWFsb2dDYW5jZWxDQiwgKFh0UG9pbnRlcikwKTsKKyAgICAvKiBXZSBoYXZlIG5vIGhlbHAgaW4gdGhpcyB3aW5kb3csIHNvIGhpZGUgaGVscCBidXR0b24gKi8KKyAgICBYdFVubWFuYWdlQ2hpbGQoWG1GaWxlU2VsZWN0aW9uQm94R2V0Q2hpbGQoZGlhbG9nX3dndCwKKwkJCQkJKHVuc2lnbmVkIGNoYXIpWG1ESUFMT0dfSEVMUF9CVVRUT04pKTsKKworICAgIG1hbmFnZV9jZW50ZXJlZChkaWFsb2dfd2d0KTsKKworICAgIC8qIHNpdCBpbiBhIGxvb3AgdW50aWwgdGhlIGRpYWxvZyBib3ggaGFzIGdvbmUgYXdheSAqLworICAgIGRvCisgICAgeworCVh0QXBwUHJvY2Vzc0V2ZW50KFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoZGlhbG9nX3dndCksCisJICAgIChYdElucHV0TWFzaylYdElNQWxsKTsKKyAgICB9IHdoaWxlIChYdElzTWFuYWdlZChkaWFsb2dfd2d0KSk7CisKKyAgICBYdERlc3Ryb3lXaWRnZXQoZGlhbG9nX3dndCk7CisgICAgdmltX2ZyZWUodG9mcmVlKTsKKworICAgIGlmIChicm93c2VfZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdmltX3N0cnNhdmUoKGNoYXJfdSAqKWJyb3dzZV9mbmFtZSk7Cit9CisKKy8qCisgKiBUaGUgY29kZSBiZWxvdyB3YXMgb3JpZ2luYWxseSB0YWtlbiBmcm9tCisgKgkvdXNyL2V4YW1wbGVzL21vdGlmL3htc2FtcGxlcnMveG1lZGl0b3IuYworICogb24gRGlnaXRhbCBVbml4IDQuMGQsIGJ1dCBoZWF2aWx5IG1vZGlmaWVkLgorICovCisKKy8qCisgKiBQcm9jZXNzIGNhbGxiYWNrIGZyb20gRGlhbG9nIGNhbmNlbCBhY3Rpb25zLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitEaWFsb2dDYW5jZWxDQih3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OwkJLyogIHdpZGdldCBpZAkJKi8KKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CS8qICBkYXRhIGZyb20gYXBwbGljYXRpb24gICAqLworICAgIFh0UG9pbnRlcgljYWxsX2RhdGE7CS8qICBkYXRhIGZyb20gd2lkZ2V0IGNsYXNzICAqLworeworICAgIGlmIChicm93c2VfZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJWHRGcmVlKGJyb3dzZV9mbmFtZSk7CisJYnJvd3NlX2ZuYW1lID0gTlVMTDsKKyAgICB9CisgICAgWHRVbm1hbmFnZUNoaWxkKGRpYWxvZ193Z3QpOworfQorCisvKgorICogUHJvY2VzcyBjYWxsYmFjayBmcm9tIERpYWxvZyBhY3Rpb25zLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitEaWFsb2dBY2NlcHRDQih3LCBjbGllbnRfZGF0YSwgY2FsbF9kYXRhKQorICAgIFdpZGdldAl3OwkJLyogIHdpZGdldCBpZAkJKi8KKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CS8qICBkYXRhIGZyb20gYXBwbGljYXRpb24gICAqLworICAgIFh0UG9pbnRlcgljYWxsX2RhdGE7CS8qICBkYXRhIGZyb20gd2lkZ2V0IGNsYXNzICAqLworeworICAgIFhtRmlsZVNlbGVjdGlvbkJveENhbGxiYWNrU3RydWN0ICpmY2I7CisKKyAgICBpZiAoYnJvd3NlX2ZuYW1lICE9IE5VTEwpCisgICAgeworCVh0RnJlZShicm93c2VfZm5hbWUpOworCWJyb3dzZV9mbmFtZSA9IE5VTEw7CisgICAgfQorICAgIGZjYiA9IChYbUZpbGVTZWxlY3Rpb25Cb3hDYWxsYmFja1N0cnVjdCAqKWNhbGxfZGF0YTsKKworICAgIC8qIGdldCB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgZmlsZSBzZWxlY3Rpb24gYm94ICovCisgICAgWG1TdHJpbmdHZXRMdG9SKGZjYi0+dmFsdWUsIGNoYXJzZXQsICZicm93c2VfZm5hbWUpOworCisgICAgLyogcG9wZG93biB0aGUgZmlsZSBzZWxlY3Rpb24gYm94ICovCisgICAgWHRVbm1hbmFnZUNoaWxkKGRpYWxvZ193Z3QpOworfQorCisjZW5kaWYgLyogRkVBVF9CUk9XU0UgKi8KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKFBST1RPKQorCitzdGF0aWMgaW50CWRpYWxvZ1N0YXR1czsKKworc3RhdGljIHZvaWQga2V5aGl0X2NhbGxiYWNrIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqY29udCkpOworc3RhdGljIHZvaWQgYnV0cHJvYyBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2xpZW50X2RhdGEsIFh0UG9pbnRlciBjYWxsX2RhdGEpKTsKKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgdGV4dGZpZWxkLiAgV2hlbiBDUiBpcyBoaXQgdGhpcyB3b3JrcyBsaWtlCisgKiBoaXR0aW5nIHRoZSAiT0siIGJ1dHRvbiwgRVNDIGxpa2UgIkNhbmNlbCIuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2tleWhpdF9jYWxsYmFjayh3LCBjbGllbnRfZGF0YSwgZXZlbnQsIGNvbnQpCisgICAgV2lkZ2V0CQl3OworICAgIFh0UG9pbnRlcgkJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CQkqZXZlbnQ7CisgICAgQm9vbGVhbgkJKmNvbnQ7Cit7CisgICAgY2hhcglidWZbMl07CisgICAgS2V5U3ltCWtleV9zeW07CisKKyAgICBpZiAoWExvb2t1cFN0cmluZygmKGV2ZW50LT54a2V5KSwgYnVmLCAyLCAma2V5X3N5bSwgTlVMTCkgPT0gMSkKKyAgICB7CisJaWYgKCpidWYgPT0gQ0FSKQorCSAgICBkaWFsb2dTdGF0dXMgPSAxOworCWVsc2UgaWYgKCpidWYgPT0gRVNDKQorCSAgICBkaWFsb2dTdGF0dXMgPSAyOworICAgIH0KKyAgICBpZiAoKGtleV9zeW0gPT0gWEtfTGVmdCB8fCBrZXlfc3ltID09IFhLX1JpZ2h0KQorCSAgICAmJiAhKGV2ZW50LT54a2V5LnN0YXRlICYgU2hpZnRNYXNrKSkKKwlYbVRleHRGaWVsZENsZWFyU2VsZWN0aW9uKHcsIFh0TGFzdFRpbWVzdGFtcFByb2Nlc3NlZChndWkuZHB5KSk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2J1dHByb2ModywgY2xpZW50X2RhdGEsIGNhbGxfZGF0YSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWHRQb2ludGVyCWNhbGxfZGF0YTsKK3sKKyAgICBkaWFsb2dTdGF0dXMgPSAoaW50KShsb25nKWNsaWVudF9kYXRhICsgMTsKK30KKworc3RhdGljIHZvaWQgZ3VpX21vdGlmX3NldF9mb250bGlzdCBfX0FSR1MoKFdpZGdldCB3ZykpOworCisvKgorICogVXNlIHRoZSAnZ3VpZm9udCcgb3IgJ2d1aWZvbnRzZXQnIGFzIGEgZm9udGxpc3QgZm9yIGEgZGlhbG9nIHdpZGdldC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfbW90aWZfc2V0X2ZvbnRsaXN0KHdnKQorICAgIFdpZGdldCB3ZzsKK3sKKyAgICBYbUZvbnRMaXN0IGZsOworCisgICAgZmwgPQorI2lmZGVmIEZFQVRfWEZPTlRTRVQKKwkgICAgZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUID8KKwkJICAgIGd1aV9tb3RpZl9mb250c2V0MmZvbnRsaXN0KChYRm9udFNldCAqKSZndWkuZm9udHNldCkKKwkJCQkgICAgIDoKKyNlbmRpZgorCQkgICAgZ3VpX21vdGlmX2NyZWF0ZV9mb250bGlzdCgoWEZvbnRTdHJ1Y3QgKilndWkubm9ybV9mb250KTsKKyAgICBpZiAoZmwgIT0gTlVMTCkKKyAgICB7CisJWHRWYVNldFZhbHVlcyh3ZywgWG1OZm9udExpc3QsIGZsLCBOVUxMKTsKKwlYbUZvbnRMaXN0RnJlZShmbCk7CisgICAgfQorfQorCisjaWZkZWYgSEFWRV9YUE0KKworc3RhdGljIFdpZGdldCBjcmVhdGVfcGl4bWFwX2xhYmVsKFdpZGdldCBwYXJlbnQsIFN0cmluZyBuYW1lLCBjaGFyICoqZGF0YSwgQXJnTGlzdCBhcmdzLCBDYXJkaW5hbCBhcmcpOworCisgICAgc3RhdGljIFdpZGdldAorY3JlYXRlX3BpeG1hcF9sYWJlbChwYXJlbnQsIG5hbWUsIGRhdGEsIGFyZ3MsIGFyZykKKyAgICBXaWRnZXQJcGFyZW50OworICAgIFN0cmluZwluYW1lOworICAgIGNoYXIJKipkYXRhOworICAgIEFyZ0xpc3QJYXJnczsKKyAgICBDYXJkaW5hbAlhcmc7Cit7CisgICAgV2lkZ2V0CQlsYWJlbDsKKyAgICBEaXNwbGF5CQkqZHNwOworICAgIFNjcmVlbgkJKnNjcjsKKyAgICBpbnQJCQlkZXB0aDsKKyAgICBQaXhtYXAJCXBpeG1hcCA9IDA7CisgICAgWHBtQXR0cmlidXRlcwlhdHRyOworICAgIEJvb2xlYW4JCXJzOworICAgIFhwbUNvbG9yU3ltYm9sCWNvbG9yWzVdID0KKyAgICB7CisJeyJub25lIiwgTlVMTCwgMH0sCisJeyJpY29uQ29sb3IxIiwgTlVMTCwgMH0sCisJeyJib3R0b21TaGFkb3dDb2xvciIsIE5VTEwsIDB9LAorCXsidG9wU2hhZG93Q29sb3IiLCBOVUxMLCAwfSwKKwl7InNlbGVjdENvbG9yIiwgTlVMTCwgMH0KKyAgICB9OworCisgICAgbGFiZWwgPSBYbUNyZWF0ZUxhYmVsR2FkZ2V0KHBhcmVudCwgbmFtZSwgYXJncywgYXJnKTsKKworICAgIC8qCisgICAgICogV2UgbmVlZCB0byBiZSBjYXJlZnVsbCBoZXJlLCBzaW5jZSBpbiBjYXNlIG9mIGdhZGdldHMsIHRoZXJlIGlzCisgICAgICogbm8gd2F5IHRvIGdldCB0aGUgYmFja2dyb3VuZCBjb2xvciBkaXJlY3RseSBmcm9tIHRoZSB3aWRnZXQgaXRzZWxmLgorICAgICAqIEluIHN1Y2ggY2FzZXMgd2UgZ2V0IGl0IGZyb20gVGhlIENvcmUgcGFydCBvZiBoaXMgcGFyZW50IGluc3RlYWQuCisgICAgICovCisgICAgZHNwID0gWHREaXNwbGF5T2ZPYmplY3QobGFiZWwpOworICAgIHNjciA9IFh0U2NyZWVuT2ZPYmplY3QobGFiZWwpOworICAgIFh0VmFHZXRWYWx1ZXMoWHRJc1N1YmNsYXNzKGxhYmVsLCBjb3JlV2lkZ2V0Q2xhc3MpCisJICAgID8gIGxhYmVsIDogWHRQYXJlbnQobGFiZWwpLAorCQkgIFhtTmRlcHRoLCAmZGVwdGgsCisJCSAgWG1OYmFja2dyb3VuZCwgJmNvbG9yWzBdLnBpeGVsLAorCQkgIFhtTmZvcmVncm91bmQsICZjb2xvclsxXS5waXhlbCwKKwkJICBYbU5ib3R0b21TaGFkb3dDb2xvciwgJmNvbG9yWzJdLnBpeGVsLAorCQkgIFhtTnRvcFNoYWRvd0NvbG9yLCAmY29sb3JbM10ucGl4ZWwsCisJCSAgWG1OaGlnaGxpZ2h0LCAmY29sb3JbNF0ucGl4ZWwsCisJCSAgTlVMTCk7CisKKyAgICBhdHRyLnZhbHVlbWFzayA9IFhwbUNvbG9yU3ltYm9scyB8IFhwbUNsb3NlbmVzcyB8IFhwbURlcHRoOworICAgIGF0dHIuY29sb3JzeW1ib2xzID0gY29sb3I7CisgICAgYXR0ci5udW1zeW1ib2xzID0gNTsKKyAgICBhdHRyLmNsb3NlbmVzcyA9IDY1NTM1OworICAgIGF0dHIuZGVwdGggPSBkZXB0aDsKKyAgICBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YShkc3AsIFJvb3RXaW5kb3dPZlNjcmVlbihzY3IpLAorCQkgICAgZGF0YSwgJnBpeG1hcCwgTlVMTCwgJmF0dHIpOworCisgICAgWHRWYUdldFZhbHVlcyhsYWJlbCwgWG1OcmVjb21wdXRlU2l6ZSwgJnJzLCBOVUxMKTsKKyAgICBYdFZhU2V0VmFsdWVzKGxhYmVsLCBYbU5yZWNvbXB1dGVTaXplLCBUcnVlLCBOVUxMKTsKKyAgICBYdFZhU2V0VmFsdWVzKGxhYmVsLAorCSAgICBYbU5sYWJlbFR5cGUsIFhtUElYTUFQLAorCSAgICBYbU5sYWJlbFBpeG1hcCwgcGl4bWFwLAorCSAgICBOVUxMKTsKKyAgICBYdFZhU2V0VmFsdWVzKGxhYmVsLCBYbU5yZWNvbXB1dGVTaXplLCBycywgTlVMTCk7CisKKyAgICByZXR1cm4gbGFiZWw7Cit9CisjZW5kaWYKKworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK2d1aV9tY2hfZGlhbG9nKHR5cGUsIHRpdGxlLCBtZXNzYWdlLCBidXR0b25fbmFtZXMsIGRmbHRidXR0b24sIHRleHRmaWVsZCkKKyAgICBpbnQJCXR5cGU7CisgICAgY2hhcl91CSp0aXRsZTsKKyAgICBjaGFyX3UJKm1lc3NhZ2U7CisgICAgY2hhcl91CSpidXR0b25fbmFtZXM7CisgICAgaW50CQlkZmx0YnV0dG9uOworICAgIGNoYXJfdQkqdGV4dGZpZWxkOwkJLyogYnVmZmVyIG9mIHNpemUgSU9TSVpFICovCit7CisgICAgY2hhcl91CQkqYnV0czsKKyAgICBjaGFyX3UJCSpwLCAqbmV4dDsKKyAgICBYdEFwcENvbnRleHQJYXBwOworICAgIFhtU3RyaW5nCQlsYWJlbDsKKyAgICBpbnQJCQlidXRjb3VudDsKKyAgICBXaWRnZXQJCWRpYWxvZ2Zvcm0gPSBOVUxMOworICAgIFdpZGdldAkJZm9ybSA9IE5VTEw7CisgICAgV2lkZ2V0CQlkaWFsb2d0ZXh0ZmllbGQgPSBOVUxMOworICAgIFdpZGdldAkJKmJ1dHRvbnM7CisgICAgV2lkZ2V0CQlzZXBfZm9ybSA9IE5VTEw7CisgICAgQm9vbGVhbgkJdmVydGljYWw7CisgICAgV2lkZ2V0CQlzZXBhcmF0b3IgPSBOVUxMOworICAgIGludAkJCW47CisgICAgQXJnCQkJYXJnc1s2XTsKKyNpZmRlZiBIQVZFX1hQTQorICAgIGNoYXIJCSoqaWNvbl9kYXRhID0gTlVMTDsKKyAgICBXaWRnZXQJCWRpYWxvZ3BpeG1hcCA9IE5VTEw7CisjZW5kaWYKKworICAgIGlmICh0aXRsZSA9PSBOVUxMKQorCXRpdGxlID0gKGNoYXJfdSAqKV8oIlZpbSBkaWFsb2ciKTsKKworICAgIC8qIGlmIG91ciBwb2ludGVyIGlzIGN1cnJlbnRseSBoaWRkZW4sIHRoZW4gd2Ugc2hvdWxkIHNob3cgaXQuICovCisgICAgZ3VpX21jaF9tb3VzZWhpZGUoRkFMU0UpOworCisgICAgZGlhbG9nZm9ybSA9IFhtQ3JlYXRlRm9ybURpYWxvZyh2aW1TaGVsbCwgKGNoYXIgKikiZGlhbG9nIiwgTlVMTCwgMCk7CisKKyAgICAvKiBDaGVjayAndicgZmxhZyBpbiAnZ3Vpb3B0aW9ucyc6IHZlcnRpY2FsIGJ1dHRvbiBwbGFjZW1lbnQuICovCisgICAgdmVydGljYWwgPSAodmltX3N0cmNocihwX2dvLCBHT19WRVJUSUNBTCkgIT0gTlVMTCk7CisKKyAgICAvKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBEaWFsb2cgd2luZG93ICovCisgICAgbGFiZWwgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZSgoY2hhciAqKXRpdGxlKTsKKyAgICBpZiAobGFiZWwgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgWHRWYVNldFZhbHVlcyhkaWFsb2dmb3JtLAorCSAgICBYbU5kaWFsb2dUaXRsZSwgbGFiZWwsCisJICAgIFhtTmhvcml6b250YWxTcGFjaW5nLCA0LAorCSAgICBYbU52ZXJ0aWNhbFNwYWNpbmcsIHZlcnRpY2FsID8gMCA6IDQsCisJICAgIE5VTEwpOworICAgIFhtU3RyaW5nRnJlZShsYWJlbCk7CisKKyAgICAvKiBtYWtlIGEgY29weSwgc28gdGhhdCB3ZSBjYW4gaW5zZXJ0IE5VTHMgKi8KKyAgICBidXRzID0gdmltX3N0cnNhdmUoYnV0dG9uX25hbWVzKTsKKyAgICBpZiAoYnV0cyA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgYnV0dG9ucyBhbmQgYWxsb2NhdGUgYnV0dG9uc1tdLiAqLworICAgIGJ1dGNvdW50ID0gMTsKKyAgICBmb3IgKHAgPSBidXRzOyAqcDsgKytwKQorCWlmICgqcCA9PSBETEdfQlVUVE9OX1NFUCkKKwkgICAgKytidXRjb3VudDsKKyAgICBidXR0b25zID0gKFdpZGdldCAqKWFsbG9jKCh1bnNpZ25lZCkoYnV0Y291bnQgKiBzaXplb2YoV2lkZ2V0KSkpOworICAgIGlmIChidXR0b25zID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1dHMpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgYnV0dG9ucy4KKyAgICAgKi8KKyAgICBzZXBfZm9ybSA9IChXaWRnZXQpIDA7CisgICAgcCA9IGJ1dHM7CisgICAgZm9yIChidXRjb3VudCA9IDA7ICpwOyArK2J1dGNvdW50KQorICAgIHsKKwlmb3IgKG5leHQgPSBwOyAqbmV4dDsgKytuZXh0KQorCXsKKwkgICAgaWYgKCpuZXh0ID09IERMR19IT1RLRVlfQ0hBUikKKwkJbWNoX21lbW1vdmUobmV4dCwgbmV4dCArIDEsIFNUUkxFTihuZXh0KSk7CisJICAgIGlmICgqbmV4dCA9PSBETEdfQlVUVE9OX1NFUCkKKwkgICAgeworCQkqbmV4dCsrID0gTlVMOworCQlicmVhazsKKwkgICAgfQorCX0KKwlsYWJlbCA9IFhtU3RyaW5nQ3JlYXRlKF8oKGNoYXIgKilwKSwgU1RSSU5HX1RBRyk7CisJaWYgKGxhYmVsID09IE5VTEwpCisJICAgIGJyZWFrOworCisJYnV0dG9uc1tidXRjb3VudF0gPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiYnV0dG9uIiwKKwkJeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGRpYWxvZ2Zvcm0sCisJCVhtTmxhYmVsU3RyaW5nLCBsYWJlbCwKKwkJWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJWG1OYm90dG9tT2Zmc2V0LCA0LAorCQlYbU5zaG93QXNEZWZhdWx0LCBidXRjb3VudCA9PSBkZmx0YnV0dG9uIC0gMSwKKwkJWG1OZGVmYXVsdEJ1dHRvblNoYWRvd1RoaWNrbmVzcywgMSwKKwkJTlVMTCk7CisJWG1TdHJpbmdGcmVlKGxhYmVsKTsKKworCS8qIExheW91dCBwcm9wZXJseS4gKi8KKworCWlmIChidXRjb3VudCA+IDApCisJeworCSAgICBpZiAodmVydGljYWwpCisJCVh0VmFTZXRWYWx1ZXMoYnV0dG9uc1tidXRjb3VudF0sCisJCQlYbU50b3BXaWRnZXQsIGJ1dHRvbnNbYnV0Y291bnQgLSAxXSwKKwkJCU5VTEwpOworCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKCpuZXh0ID09IE5VTCkKKwkJeworCQkgICAgWHRWYVNldFZhbHVlcyhidXR0b25zW2J1dGNvdW50XSwKKwkJCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCQkgICAgWG1OcmlnaHRPZmZzZXQsIDQsCisJCQkgICAgTlVMTCk7CisKKwkJICAgIC8qIGZpbGwgaW4gYSBmb3JtIGFzIGludmlzaWJsZSBzZXBhcmF0b3IgKi8KKwkJICAgIHNlcF9mb3JtID0gWHRWYUNyZWF0ZVdpZGdldCgic2VwYXJhdG9yRm9ybSIsCisJCQkgICAgeG1Gb3JtV2lkZ2V0Q2xhc3MsCWRpYWxvZ2Zvcm0sCisJCQkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkJCSAgICBYbU5sZWZ0V2lkZ2V0LCBidXR0b25zW2J1dGNvdW50IC0gMV0sCisJCQkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCQkgICAgWG1OcmlnaHRXaWRnZXQsIGJ1dHRvbnNbYnV0Y291bnRdLAorCQkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCQkgICAgWG1OYm90dG9tT2Zmc2V0LCA0LAorCQkJICAgIE5VTEwpOworCQkgICAgWHRNYW5hZ2VDaGlsZChzZXBfZm9ybSk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBYdFZhU2V0VmFsdWVzKGJ1dHRvbnNbYnV0Y291bnRdLAorCQkJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCQkgICAgWG1ObGVmdFdpZGdldCwgYnV0dG9uc1tidXRjb3VudCAtIDFdLAorCQkJICAgIE5VTEwpOworCQl9CisJICAgIH0KKwl9CisJZWxzZSBpZiAoIXZlcnRpY2FsKQorCXsKKwkgICAgaWYgKCpuZXh0ID09IE5VTCkKKwkgICAgeworCQlYdFZhU2V0VmFsdWVzKGJ1dHRvbnNbMF0sCisJCQlYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCQlYbU5yaWdodE9mZnNldCwgNCwKKwkJCU5VTEwpOworCisJCS8qIGZpbGwgaW4gYSBmb3JtIGFzIGludmlzaWJsZSBzZXBhcmF0b3IgKi8KKwkJc2VwX2Zvcm0gPSBYdFZhQ3JlYXRlV2lkZ2V0KCJzZXBhcmF0b3JGb3JtIiwKKwkJCXhtRm9ybVdpZGdldENsYXNzLCBkaWFsb2dmb3JtLAorCQkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCQlYbU5sZWZ0T2Zmc2V0LCA0LAorCQkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCQlYbU5yaWdodFdpZGdldCwgYnV0dG9uc1swXSwKKwkJCVhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCQlYbU5ib3R0b21PZmZzZXQsIDQsCisJCQlOVUxMKTsKKwkJWHRNYW5hZ2VDaGlsZChzZXBfZm9ybSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlYdFZhU2V0VmFsdWVzKGJ1dHRvbnNbMF0sCisJCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJCVhtTmxlZnRPZmZzZXQsIDQsCisJCQlOVUxMKTsKKwl9CisKKwlYdEFkZENhbGxiYWNrKGJ1dHRvbnNbYnV0Y291bnRdLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAorCQkJICAoWHRDYWxsYmFja1Byb2MpYnV0cHJvYywgKFh0UG9pbnRlcikobG9uZylidXRjb3VudCk7CisJcCA9IG5leHQ7CisgICAgfQorICAgIHZpbV9mcmVlKGJ1dHMpOworCisgICAgc2VwYXJhdG9yID0gKFdpZGdldCkgMDsKKyAgICBpZiAoYnV0Y291bnQgPiAwKQorICAgIHsKKwkvKiBDcmVhdGUgdGhlIHNlcGFyYXRvciBmb3IgYmVhdXR5LiAqLworCW4gPSAwOworCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm9yaWVudGF0aW9uLCBYbUhPUklaT05UQUwpOyBuKys7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VUKTsgbisrOworCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmJvdHRvbVdpZGdldCwgYnV0dG9uc1swXSk7IG4rKzsKKwlYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21PZmZzZXQsIDQpOyBuKys7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0pOyBuKys7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworCXNlcGFyYXRvciA9IFhtQ3JlYXRlU2VwYXJhdG9yR2FkZ2V0KGRpYWxvZ2Zvcm0sICJzZXBhcmF0b3IiLCBhcmdzLCBuKTsKKwlYdE1hbmFnZUNoaWxkKHNlcGFyYXRvcik7CisgICAgfQorCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorICAgIHsKKwlkaWFsb2d0ZXh0ZmllbGQgPSBYdFZhQ3JlYXRlV2lkZ2V0KCJ0ZXh0RmllbGQiLAorCQl4bVRleHRGaWVsZFdpZGdldENsYXNzLCBkaWFsb2dmb3JtLAorCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlOVUxMKTsKKwlpZiAoYnV0Y291bnQgPiAwKQorCSAgICBYdFZhU2V0VmFsdWVzKGRpYWxvZ3RleHRmaWVsZCwKKwkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkJICAgIFhtTmJvdHRvbVdpZGdldCwgc2VwYXJhdG9yLAorCQkgICAgTlVMTCk7CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKGRpYWxvZ3RleHRmaWVsZCwKKwkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCSAgICBOVUxMKTsKKworCWd1aV9tb3RpZl9zZXRfZm9udGxpc3QoZGlhbG9ndGV4dGZpZWxkKTsKKwlYbVRleHRGaWVsZFNldFN0cmluZyhkaWFsb2d0ZXh0ZmllbGQsIChjaGFyICopdGV4dGZpZWxkKTsKKwlYdE1hbmFnZUNoaWxkKGRpYWxvZ3RleHRmaWVsZCk7CisJWHRBZGRFdmVudEhhbmRsZXIoZGlhbG9ndGV4dGZpZWxkLCBLZXlQcmVzc01hc2ssIEZhbHNlLAorCQkJICAgIChYdEV2ZW50SGFuZGxlcilrZXloaXRfY2FsbGJhY2ssIChYdFBvaW50ZXIpTlVMTCk7CisgICAgfQorCisgICAgLyogRm9ybSBob2xkaW5nIGJvdGggbWVzc2FnZSBhbmQgcGl4bWFwIGxhYmVscyAqLworICAgIGZvcm0gPSBYdFZhQ3JlYXRlV2lkZ2V0KCJzZXBhcmF0b3JGb3JtIiwKKwkgICAgeG1Gb3JtV2lkZ2V0Q2xhc3MsIGRpYWxvZ2Zvcm0sCisJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5yaWdodEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIE5VTEwpOworICAgIFh0TWFuYWdlQ2hpbGQoZm9ybSk7CisKKyNpZmRlZiBIQVZFX1hQTQorICAgIC8qIEFkZCBhIHBpeG1hcCwgbGVmdCBvZiB0aGUgbWVzc2FnZS4gKi8KKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworCWNhc2UgVklNX0dFTkVSSUM6CisJICAgIGljb25fZGF0YSA9IGdlbmVyaWNfeHBtOworCSAgICBicmVhazsKKwljYXNlIFZJTV9FUlJPUjoKKwkgICAgaWNvbl9kYXRhID0gZXJyb3JfeHBtOworCSAgICBicmVhazsKKwljYXNlIFZJTV9XQVJOSU5HOgorCSAgICBpY29uX2RhdGEgPSBhbGVydF94cG07CisJICAgIGJyZWFrOworCWNhc2UgVklNX0lORk86CisJICAgIGljb25fZGF0YSA9IGluZm9feHBtOworCSAgICBicmVhazsKKwljYXNlIFZJTV9RVUVTVElPTjoKKwkgICAgaWNvbl9kYXRhID0gcXVlc3RfeHBtOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBpY29uX2RhdGEgPSBnZW5lcmljX3hwbTsKKyAgICB9CisKKyAgICBuID0gMDsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnRvcE9mZnNldCwgOCk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmJvdHRvbU9mZnNldCwgOCk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5sZWZ0T2Zmc2V0LCA4KTsgbisrOworCisgICAgZGlhbG9ncGl4bWFwID0gY3JlYXRlX3BpeG1hcF9sYWJlbChmb3JtLCAiZGlhbG9nUGl4bWFwIiwKKwkgICAgaWNvbl9kYXRhLCBhcmdzLCBuKTsKKyAgICBYdE1hbmFnZUNoaWxkKGRpYWxvZ3BpeG1hcCk7CisjZW5kaWYKKworICAgIC8qIENyZWF0ZSB0aGUgZGlhbG9nIG1lc3NhZ2UuICovCisgICAgbGFiZWwgPSBYbVN0cmluZ0x0b1JDcmVhdGUoKGNoYXIgKiltZXNzYWdlLCBTVFJJTkdfVEFHKTsKKyAgICBpZiAobGFiZWwgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgKHZvaWQpWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpYWxvZ01lc3NhZ2UiLAorCQkJCXhtTGFiZWxHYWRnZXRDbGFzcywgZm9ybSwKKwkJCQlYbU5sYWJlbFN0cmluZywgbGFiZWwsCisJCQkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJCQlYbU50b3BPZmZzZXQsIDgsCisjaWZkZWYgSEFWRV9YUE0KKwkJCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCQkJCVhtTmxlZnRXaWRnZXQsIGRpYWxvZ3BpeG1hcCwKKyNlbHNlCisJCQkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisjZW5kaWYKKwkJCQlYbU5sZWZ0T2Zmc2V0LCA4LAorCQkJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJCQlYbU5yaWdodE9mZnNldCwgOCwKKwkJCQlYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQkJCVhtTmJvdHRvbU9mZnNldCwgOCwKKwkJCQlOVUxMKTsKKyAgICBYbVN0cmluZ0ZyZWUobGFiZWwpOworCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorICAgIHsKKwlYdFZhU2V0VmFsdWVzKGZvcm0sCisJCVhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkJWG1OYm90dG9tV2lkZ2V0LCBkaWFsb2d0ZXh0ZmllbGQsCisJCU5VTEwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChidXRjb3VudCA+IDApCisJICAgIFh0VmFTZXRWYWx1ZXMoZm9ybSwKKwkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkJICAgIFhtTmJvdHRvbVdpZGdldCwgc2VwYXJhdG9yLAorCQkgICAgTlVMTCk7CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKGZvcm0sCisJCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQkgICAgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGRmbHRidXR0b24gPCAxKQorCWRmbHRidXR0b24gPSAxOworICAgIGlmIChkZmx0YnV0dG9uID4gYnV0Y291bnQpCisJZGZsdGJ1dHRvbiA9IGJ1dGNvdW50OworICAgIFh0VmFTZXRWYWx1ZXMoZGlhbG9nZm9ybSwKKwkgICAgWG1OZGVmYXVsdEJ1dHRvbiwgYnV0dG9uc1tkZmx0YnV0dG9uIC0gMV0sIE5VTEwpOworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKwlYdFZhU2V0VmFsdWVzKGRpYWxvZ2Zvcm0sIFhtTmluaXRpYWxGb2N1cywgZGlhbG9ndGV4dGZpZWxkLCBOVUxMKTsKKyAgICBlbHNlCisJWHRWYVNldFZhbHVlcyhkaWFsb2dmb3JtLCBYbU5pbml0aWFsRm9jdXMsIGJ1dHRvbnNbZGZsdGJ1dHRvbiAtIDFdLAorCQkJCQkJCQkJTlVMTCk7CisKKyAgICBtYW5hZ2VfY2VudGVyZWQoZGlhbG9nZm9ybSk7CisKKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwgJiYgKnRleHRmaWVsZCAhPSBOVUwpCisgICAgeworCS8qIFRoaXMgb25seSB3b3JrcyBhZnRlciB0aGUgdGV4dGZpZWxkIGhhcyBiZWVuIHJlYWxpc2VkLiAqLworCVhtVGV4dEZpZWxkU2V0U2VsZWN0aW9uKGRpYWxvZ3RleHRmaWVsZCwKKwkJCSAoWG1UZXh0UG9zaXRpb24pMCwgKFhtVGV4dFBvc2l0aW9uKVNUUkxFTih0ZXh0ZmllbGQpLAorCQkJCQkgICBYdExhc3RUaW1lc3RhbXBQcm9jZXNzZWQoZ3VpLmRweSkpOworCVhtVGV4dEZpZWxkU2V0Q3Vyc29yUG9zaXRpb24oZGlhbG9ndGV4dGZpZWxkLAorCQkJCQkgICAoWG1UZXh0UG9zaXRpb24pU1RSTEVOKHRleHRmaWVsZCkpOworICAgIH0KKworICAgIGFwcCA9IFh0V2lkZ2V0VG9BcHBsaWNhdGlvbkNvbnRleHQoZGlhbG9nZm9ybSk7CisKKyAgICAvKiBMb29wIHVudGlsIGEgYnV0dG9uIGlzIHByZXNzZWQgb3IgdGhlIGRpYWxvZyBpcyBraWxsZWQgc29tZWhvdy4gKi8KKyAgICBkaWFsb2dTdGF0dXMgPSAtMTsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlYdEFwcFByb2Nlc3NFdmVudChhcHAsIChYdElucHV0TWFzaylYdElNQWxsKTsKKwlpZiAoZGlhbG9nU3RhdHVzID49IDAgfHwgIVh0SXNNYW5hZ2VkKGRpYWxvZ2Zvcm0pKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICB2aW1fZnJlZShidXR0b25zKTsKKworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKyAgICB7CisJcCA9IChjaGFyX3UgKilYbVRleHRHZXRTdHJpbmcoZGlhbG9ndGV4dGZpZWxkKTsKKwlpZiAocCA9PSBOVUxMIHx8IGRpYWxvZ1N0YXR1cyA8IDApCisJICAgICp0ZXh0ZmllbGQgPSBOVUw7CisJZWxzZQorCXsKKwkgICAgU1RSTkNQWSh0ZXh0ZmllbGQsIHAsIElPU0laRSk7CisJICAgIHRleHRmaWVsZFtJT1NJWkUgLSAxXSA9IE5VTDsKKwl9CisgICAgfQorCisgICAgWHREZXN0cm95V2lkZ2V0KGRpYWxvZ2Zvcm0pOworCisgICAgcmV0dXJuIGRpYWxvZ1N0YXR1czsKK30KKyNlbmRpZiAvKiBGRUFUX0dVSV9ESUFMT0cgKi8KKworI2lmIGRlZmluZWQoRkVBVF9GT09URVIpIHx8IGRlZmluZWQoUFJPVE8pCisKKyAgICBzdGF0aWMgaW50CitndWlfbWNoX2NvbXB1dGVfZm9vdGVyX2hlaWdodCgpCit7CisgICAgRGltZW5zaW9uCWhlaWdodDsJCSAgICAvKiB0b3RhbCBUb29sYmFyIGhlaWdodCAqLworICAgIERpbWVuc2lvbgl0b3A7CQkgICAgLyogWG1ObWFyZ2luVG9wICovCisgICAgRGltZW5zaW9uCWJvdHRvbTsJCSAgICAvKiBYbU5tYXJnaW5Cb3R0b20gKi8KKyAgICBEaW1lbnNpb24Jc2hhZG93OwkJICAgIC8qIFhtTnNoYWRvd1RoaWNrbmVzcyAqLworCisgICAgWHRWYUdldFZhbHVlcyhmb290ZXIsCisJICAgIFhtTmhlaWdodCwgJmhlaWdodCwKKwkgICAgWG1ObWFyZ2luVG9wLCAmdG9wLAorCSAgICBYbU5tYXJnaW5Cb3R0b20sICZib3R0b20sCisJICAgIFhtTnNoYWRvd1RoaWNrbmVzcywgJnNoYWRvdywKKwkgICAgTlVMTCk7CisKKyAgICByZXR1cm4gKGludCkgaGVpZ2h0ICsgdG9wICsgYm90dG9tICsgKHNoYWRvdyA8PCAxKTsKK30KKworI2lmIDAJICAgIC8qIG5vdCB1c2VkICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9vdGVyX3BvcyhoKQorICAgIGludAkgICAgaDsJCQkgICAgLyogdGV4dEFyZWEgaGVpZ2h0ICovCit7CisgICAgWHRWYVNldFZhbHVlcyhmb290ZXIsCisJCSAgWG1OdG9wT2Zmc2V0LCBoICsgNywKKwkJICBOVUxMKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfZm9vdGVyKHNob3dpdCkKKyAgICBpbnQJCXNob3dpdDsKK3sKKyAgICBpZiAoc2hvd2l0KQorICAgIHsKKwlndWkuZm9vdGVyX2hlaWdodCA9IGd1aV9tY2hfY29tcHV0ZV9mb290ZXJfaGVpZ2h0KCk7CisJWHRNYW5hZ2VDaGlsZChmb290ZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWd1aS5mb290ZXJfaGVpZ2h0ID0gMDsKKwlYdFVubWFuYWdlQ2hpbGQoZm9vdGVyKTsKKyAgICB9CisgICAgWHRWYVNldFZhbHVlcyh0ZXh0QXJlYUZvcm0sIFhtTmJvdHRvbU9mZnNldCwgZ3VpLmZvb3Rlcl9oZWlnaHQsIE5VTEwpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9vdGVyKHMpCisgICAgY2hhcl91CSpzOworeworICAgIFhtU3RyaW5nCXhtczsKKworICAgIHhtcyA9IFhtU3RyaW5nQ3JlYXRlKChjaGFyICopcywgU1RSSU5HX1RBRyk7CisgICAgWHRWYVNldFZhbHVlcyhmb290ZXIsIFhtTmxhYmVsU3RyaW5nLCB4bXMsIE5VTEwpOworICAgIFhtU3RyaW5nRnJlZSh4bXMpOworfQorCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9zaG93X3Rvb2xiYXIoaW50IHNob3dpdCkKK3sKKyAgICBDYXJkaW5hbAludW1DaGlsZHJlbjsJICAgIC8qIGhvdyBtYW55IGNoaWxkcmVuIHRvb2xCYXIgaGFzICovCisKKyAgICBpZiAodG9vbEJhciA9PSAoV2lkZ2V0KTApCisJcmV0dXJuOworICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwgWG1ObnVtQ2hpbGRyZW4sICZudW1DaGlsZHJlbiwgTlVMTCk7CisgICAgaWYgKHNob3dpdCAmJiBudW1DaGlsZHJlbiA+IDApCisgICAgeworCS8qIEFzc3VtZSB0aGF0IHdlIHdhbnQgdG8gc2hvdyB0aGUgdG9vbGJhciBpZiBwX3Rvb2xiYXIgY29udGFpbnMKKwkgKiB2YWxpZCBvcHRpb24gc2V0dGluZ3MsIHRoZXJlZm9yZSBwX3Rvb2xiYXIgbXVzdCBub3QgYmUgTlVMTC4KKwkgKi8KKwlXaWRnZXRMaXN0ICBjaGlsZHJlbjsKKworCVh0VmFHZXRWYWx1ZXModG9vbEJhciwgWG1OY2hpbGRyZW4sICZjaGlsZHJlbiwgTlVMTCk7CisJeworCSAgICB2b2lkICAgICgqYWN0aW9uKShCYWxsb29uRXZhbCAqKTsKKwkgICAgaW50CSAgICB0ZXh0ID0gMDsKKworCSAgICBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAidG9vbHRpcHMiKSkKKwkJYWN0aW9uID0gJmd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWE7CisJICAgIGVsc2UKKwkJYWN0aW9uID0gJmd1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhOworCSAgICBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAidGV4dCIpKQorCQl0ZXh0ID0gMTsKKwkgICAgZWxzZSBpZiAoc3Ryc3RyKChjb25zdCBjaGFyICopcF90b29sYmFyLCAiaWNvbnMiKSkKKwkJdGV4dCA9IC0xOworCSAgICBpZiAodGV4dCAhPSAwKQorCSAgICB7CisJCXZpbW1lbnVfVCAgICp0b29sYmFyOworCQl2aW1tZW51X1QgICAqY3VyOworCisJCWZvciAodG9vbGJhciA9IHJvb3RfbWVudTsgdG9vbGJhcjsgdG9vbGJhciA9IHRvb2xiYXItPm5leHQpCisJCSAgICBpZiAobWVudV9pc190b29sYmFyKHRvb2xiYXItPmRuYW1lKSkKKwkJCWJyZWFrOworCQkvKiBBc3N1bXB0aW9uOiB0b29sYmFyIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gdG9vbGJhciwKKwkJICoJICAgICAgIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgdG9vbGJhciBtZW51IHN0cnVjdHVyZS4KKwkJICoKKwkJICogQXNzdW1wdGlvbjogIm51bUNoaWxkcmVuIiA9PSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0CisJCSAqCSAgICAgICBvZiBpdGVtcyBiZWdpbm5pbmcgd2l0aCB0b29sYmFyLT5jaGlsZHJlbi4KKwkJICovCisJCWlmICh0b29sYmFyKQorCQl7CisJCSAgICBmb3IgKGN1ciA9IHRvb2xiYXItPmNoaWxkcmVuOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKwkJICAgIHsKKwkJCUFyZwkgICAgYXJnc1sxXTsKKwkJCWludAkgICAgbiA9IDA7CisKKwkJCS8qIEVuYWJsZS9EaXNhYmxlIHRvb2x0aXAgKE9LIHRvIGVuYWJsZSB3aGlsZQorCQkJICogY3VycmVudGx5IGVuYWJsZWQpCisJCQkgKi8KKwkJCWlmIChjdXItPnRpcCAhPSBOVUxMKQorCQkJICAgICgqYWN0aW9uKShjdXItPnRpcCk7CisJCQlpZiAoIW1lbnVfaXNfc2VwYXJhdG9yKGN1ci0+bmFtZSkpCisJCQl7CisJCQkgICAgaWYgKHRleHQgPT0gMSB8fCBjdXItPmltYWdlID09IDApCisJCQkJWHRTZXRBcmcoYXJnc1tuXSwgWG1ObGFiZWxUeXBlLCBYbVNUUklORyk7CisJCQkgICAgZWxzZQorCQkJCVh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmxhYmVsVHlwZSwgWG1QSVhNQVApOworCQkJICAgIG4rKzsKKwkJCSAgICBpZiAoY3VyLT5pZCAhPSBOVUxMKQorCQkJICAgIHsKKwkJCQlYdFVubWFuYWdlQ2hpbGQoY3VyLT5pZCk7CisJCQkJWHRTZXRWYWx1ZXMoY3VyLT5pZCwgYXJncywgbik7CisJCQkJWHRNYW5hZ2VDaGlsZChjdXItPmlkKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlndWkudG9vbGJhcl9oZWlnaHQgPSBndWlfbWNoX2NvbXB1dGVfdG9vbGJhcl9oZWlnaHQoKTsKKwlYdE1hbmFnZUNoaWxkKFh0UGFyZW50KHRvb2xCYXIpKTsKKwlYdFZhU2V0VmFsdWVzKHRleHRBcmVhRm9ybSwKKwkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCQlYbU50b3BXaWRnZXQsIFh0UGFyZW50KHRvb2xCYXIpLAorCQlOVUxMKTsKKwlpZiAoWHRJc01hbmFnZWQobWVudUJhcikpCisJICAgIFh0VmFTZXRWYWx1ZXMoWHRQYXJlbnQodG9vbEJhciksCisJCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCSAgICBYbU50b3BXaWRnZXQsIG1lbnVCYXIsCisJCSAgICBOVUxMKTsKKwllbHNlCisJICAgIFh0VmFTZXRWYWx1ZXMoWHRQYXJlbnQodG9vbEJhciksCisJCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQkgICAgTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZ3VpLnRvb2xiYXJfaGVpZ2h0ID0gMDsKKwlpZiAoWHRJc01hbmFnZWQobWVudUJhcikpCisJICAgIFh0VmFTZXRWYWx1ZXModGV4dEFyZWFGb3JtLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgbWVudUJhciwKKwkJTlVMTCk7CisJZWxzZQorCSAgICBYdFZhU2V0VmFsdWVzKHRleHRBcmVhRm9ybSwKKwkJWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJTlVMTCk7CisKKwlYdFVubWFuYWdlQ2hpbGQoWHRQYXJlbnQodG9vbEJhcikpOworICAgIH0KKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogQSB0b29sYmFyIGJ1dHRvbiBoYXMgYmVlbiBwdXNoZWQ7IG5vdyByZXNldCB0aGUgaW5wdXQgZm9jdXMKKyAqIHN1Y2ggdGhhdCB0aGUgdXNlciBjYW4gdHlwZSBwYWdlIHVwL2Rvd24gZXRjLiBhbmQgaGF2ZSB0aGUKKyAqIGlucHV0IGdvIHRvIHRoZSBlZGl0b3Igd2luZG93LCBub3QgdGhlIGJ1dHRvbgorICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9tY2hfcmVzZXRfZm9jdXMoKQoreworICAgIGlmICh0ZXh0QXJlYSAhPSBOVUxMKQorCVhtUHJvY2Vzc1RyYXZlcnNhbCh0ZXh0QXJlYSwgWG1UUkFWRVJTRV9DVVJSRU5UKTsKK30KKworICAgIGludAorZ3VpX21jaF9jb21wdXRlX3Rvb2xiYXJfaGVpZ2h0KCkKK3sKKyAgICBEaW1lbnNpb24JaGVpZ2h0OwkJICAgIC8qIHRvdGFsIFRvb2xiYXIgaGVpZ2h0ICovCisgICAgRGltZW5zaW9uCXdoZ3Q7CQkgICAgLyogaGVpZ2h0IG9mIGVhY2ggd2lkZ2V0ICovCisgICAgRGltZW5zaW9uCW1hcmdpbkhlaWdodDsJICAgIC8qIFhtTm1hcmdpbkhlaWdodCBvZiB0b29sQmFyICovCisgICAgRGltZW5zaW9uCXNoYWRvd1RoaWNrbmVzczsgICAgLyogdGhpY2tuZXNzIG9mIFh0cGFyZW50KHRvb2xCYXIpICovCisgICAgV2lkZ2V0TGlzdAljaGlsZHJlbjsJICAgIC8qIGxpc3Qgb2YgdG9vbEJhcidzIGNoaWxkcmVuICovCisgICAgQ2FyZGluYWwJbnVtQ2hpbGRyZW47CSAgICAvKiBob3cgbWFueSBjaGlsZHJlbiB0b29sQmFyIGhhcyAqLworICAgIGludAkJaTsKKworICAgIGhlaWdodCA9IDA7CisgICAgc2hhZG93VGhpY2tuZXNzID0gMDsKKyAgICBtYXJnaW5IZWlnaHQgPSAwOworICAgIGlmICh0b29sQmFyICE9IChXaWRnZXQpMCAmJiB0b29sQmFyRnJhbWUgIT0gKFdpZGdldCkwKQorICAgIHsJCQkJICAgIC8qIGdldCBoZWlnaHQgb2YgWG1GcmFtZSBwYXJlbnQgKi8KKwlYdFZhR2V0VmFsdWVzKHRvb2xCYXJGcmFtZSwKKwkJWG1Oc2hhZG93VGhpY2tuZXNzLCAmc2hhZG93VGhpY2tuZXNzLAorCQlOVUxMKTsKKwlYdFZhR2V0VmFsdWVzKHRvb2xCYXIsCisJCVhtTm1hcmdpbkhlaWdodCwgJm1hcmdpbkhlaWdodCwKKwkJWG1OY2hpbGRyZW4sICZjaGlsZHJlbiwKKwkJWG1ObnVtQ2hpbGRyZW4sICZudW1DaGlsZHJlbiwgTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCisJeworCSAgICB3aGd0ID0gMDsKKwkgICAgWHRWYUdldFZhbHVlcyhjaGlsZHJlbltpXSwgWG1OaGVpZ2h0LCAmd2hndCwgTlVMTCk7CisJICAgIGlmIChoZWlnaHQgPCB3aGd0KQorCQloZWlnaHQgPSB3aGd0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gKGludCkoaGVpZ2h0ICsgKG1hcmdpbkhlaWdodCA8PCAxKSArIChzaGFkb3dUaGlja25lc3MgPDwgMSkpOworfQorCisjaWYgMCAvKiB0aGVzZSBhcmUgbmV2ZXIgY2FsbGVkLiAqLworLyoKKyAqIFRoZSBuZXh0IHRvb2xiYXIgZW50ZXIvbGVhdmUgY2FsbGJhY2tzIG1ha2Ugc3VyZSB0aGUgdGV4dCBhcmVhIGdldHMgdGhlCisgKiBrZXlib2FyZCBmb2N1cyB3aGVuIHRoZSBwb2ludGVyIGlzIG5vdCBpbiB0aGUgdG9vbGJhci4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3Rvb2xiYXJfZW50ZXJfY2IodywgY2xpZW50X2RhdGEsIGV2ZW50LCBjb250KQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKmNvbnQ7Cit7CisgICAgWG1Qcm9jZXNzVHJhdmVyc2FsKHRvb2xCYXIsIFhtVFJBVkVSU0VfQ1VSUkVOVCk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit0b29sYmFyX2xlYXZlX2NiKHcsIGNsaWVudF9kYXRhLCBldmVudCwgY29udCkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpjb250OworeworICAgIFhtUHJvY2Vzc1RyYXZlcnNhbCh0ZXh0QXJlYSwgWG1UUkFWRVJTRV9DVVJSRU5UKTsKK30KKyNlbmRpZgorCisjIGlmZGVmIEZFQVRfRk9PVEVSCisvKgorICogVGhlIG5leHQgdG9vbGJhciBlbnRlci9sZWF2ZSBjYWxsYmFja3Mgc2hvdWxkIHJlYWxseSBkbyBiYWxsb29uIGhlbHAuICBCdXQKKyAqIEkgaGF2ZSB0byB1c2UgZm9vdGVyIGhlbHAgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LiAgSG9wZWZ1bGx5IGJvdGggd2lsbAorICogZ2V0IGltcGxlbWVudGVkIGFuZCB0aGUgdXNlciB3aWxsIGhhdmUgYSBjaG9pY2UuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit0b29sYmFyYnV0dG9uX2VudGVyX2NiKHcsIGNsaWVudF9kYXRhLCBldmVudCwgY29udCkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpjb250OworeworICAgIHZpbW1lbnVfVAkqbWVudSA9ICh2aW1tZW51X1QgKikgY2xpZW50X2RhdGE7CisKKyAgICBpZiAobWVudS0+c3RyaW5nc1tNRU5VX0lOREVYX1RJUF0gIT0gTlVMTCkKKyAgICB7CisJaWYgKHZpbV9zdHJjaHIocF9nbywgR09fRk9PVEVSKSAhPSBOVUxMKQorCSAgICBndWlfbWNoX3NldF9mb290ZXIobWVudS0+c3RyaW5nc1tNRU5VX0lOREVYX1RJUF0pOworICAgIH0KK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3Rvb2xiYXJidXR0b25fbGVhdmVfY2IodywgY2xpZW50X2RhdGEsIGV2ZW50LCBjb250KQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKmNvbnQ7Cit7CisgICAgZ3VpX21jaF9zZXRfZm9vdGVyKChjaGFyX3UgKikgIiIpOworfQorIyBlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9nZXRfdG9vbGJhcl9jb2xvcnMoYmdwLCBmZ3AsIGJzcCwgdHNwLCBoc3ApCisgICAgUGl4ZWwJKmJncDsKKyAgICBQaXhlbAkqZmdwOworICAgIFBpeGVsICAgICAgICpic3A7CisgICAgUGl4ZWwJKnRzcDsKKyAgICBQaXhlbAkqaHNwOworeworICAgIFh0VmFHZXRWYWx1ZXModG9vbEJhciwKKwkgICAgWG1OYmFja2dyb3VuZCwgYmdwLAorCSAgICBYbU5mb3JlZ3JvdW5kLCBmZ3AsCisJICAgIFhtTmJvdHRvbVNoYWRvd0NvbG9yLCBic3AsCisJICAgIFhtTnRvcFNoYWRvd0NvbG9yLCB0c3AsCisJICAgIFhtTmhpZ2hsaWdodENvbG9yLCBoc3AsCisJICAgIE5VTEwpOworfQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIGNvbG9ycyBvZiBXaWRnZXQgImlkIiB0byB0aGUgbWVudSBjb2xvcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX21vdGlmX21lbnVfY29sb3JzKGlkKQorICAgIFdpZGdldCAgaWQ7Cit7CisgICAgaWYgKGd1aS5tZW51X2JnX3BpeGVsICE9IElOVkFMQ09MT1IpCisjaWYgKFhtVmVyc2lvbiA+PSAxMDAyKQorCVhtQ2hhbmdlQ29sb3IoaWQsIGd1aS5tZW51X2JnX3BpeGVsKTsKKyNlbHNlCisJWHRWYVNldFZhbHVlcyhpZCwgWG1OYmFja2dyb3VuZCwgZ3VpLm1lbnVfYmdfcGl4ZWwsIE5VTEwpOworI2VuZGlmCisgICAgaWYgKGd1aS5tZW51X2ZnX3BpeGVsICE9IElOVkFMQ09MT1IpCisJWHRWYVNldFZhbHVlcyhpZCwgWG1OZm9yZWdyb3VuZCwgZ3VpLm1lbnVfZmdfcGl4ZWwsIE5VTEwpOworfQorCisvKgorICogU2V0IHRoZSBjb2xvcnMgb2YgV2lkZ2V0ICJpZCIgdG8gdGhlIHNjcm9sbGJhciBjb2xvcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX21vdGlmX3Njcm9sbF9jb2xvcnMoaWQpCisgICAgV2lkZ2V0ICBpZDsKK3sKKyAgICBpZiAoZ3VpLnNjcm9sbF9iZ19waXhlbCAhPSBJTlZBTENPTE9SKQorI2lmIChYbVZlcnNpb24gPj0gMTAwMikKKwlYbUNoYW5nZUNvbG9yKGlkLCBndWkuc2Nyb2xsX2JnX3BpeGVsKTsKKyNlbHNlCisJWHRWYVNldFZhbHVlcyhpZCwgWG1OYmFja2dyb3VuZCwgZ3VpLnNjcm9sbF9iZ19waXhlbCwgTlVMTCk7CisjZW5kaWYKKyAgICBpZiAoZ3VpLnNjcm9sbF9mZ19waXhlbCAhPSBJTlZBTENPTE9SKQorCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvcmVncm91bmQsIGd1aS5zY3JvbGxfZmdfcGl4ZWwsIE5VTEwpOworfQorCisjaWZkZWYgRkVBVF9NRU5VCisvKgorICogU2V0IHRoZSBmb250bGlzdCBmb3IgV2lkZ2V0ICJpZCIgdG8gdXNlIGd1aS5tZW51X2ZvbnRzZXQgb3IgZ3VpLm1lbnVfZm9udC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfbW90aWZfbWVudV9mb250bGlzdChpZCkKKyAgICBXaWRnZXQgIGlkOworeworI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisgICAgaWYgKGd1aS5tZW51X2ZvbnRzZXQgIT0gTk9GT05UU0VUKQorICAgIHsKKwlYbUZvbnRMaXN0IGZsOworCisJZmwgPSBndWlfbW90aWZfZm9udHNldDJmb250bGlzdCgoWEZvbnRTZXQgKikmZ3VpLm1lbnVfZm9udHNldCk7CisJaWYgKGZsICE9IE5VTEwpCisJeworCSAgICBpZiAoWHRJc01hbmFnZWQoaWQpKQorCSAgICB7CisJCVh0VW5tYW5hZ2VDaGlsZChpZCk7CisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJCS8qIFdlIHNob3VsZCBmb3JjZSB0aGUgd2lkZ2V0IHRvIHJlY2FsY3VsYXRlIGl0J3MKKwkJICogZ2VvbWV0cnkgbm93LiAqLworCQlYdE1hbmFnZUNoaWxkKGlkKTsKKwkgICAgfQorCSAgICBlbHNlCisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJICAgIFhtRm9udExpc3RGcmVlKGZsKTsKKwl9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoZ3VpLm1lbnVfZm9udCAhPSBOT0ZPTlQpCisgICAgeworCVhtRm9udExpc3QgZmw7CisKKwlmbCA9IGd1aV9tb3RpZl9jcmVhdGVfZm9udGxpc3QoKFhGb250U3RydWN0ICopZ3VpLm1lbnVfZm9udCk7CisJaWYgKGZsICE9IE5VTEwpCisJeworCSAgICBpZiAoWHRJc01hbmFnZWQoaWQpKQorCSAgICB7CisJCVh0VW5tYW5hZ2VDaGlsZChpZCk7CisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJCS8qIFdlIHNob3VsZCBmb3JjZSB0aGUgd2lkZ2V0IHRvIHJlY2FsY3VsYXRlIGl0J3MKKwkJICogZ2VvbWV0cnkgbm93LiAqLworCQlYdE1hbmFnZUNoaWxkKGlkKTsKKwkgICAgfQorCSAgICBlbHNlCisJCVh0VmFTZXRWYWx1ZXMoaWQsIFhtTmZvbnRMaXN0LCBmbCwgTlVMTCk7CisJICAgIFhtRm9udExpc3RGcmVlKGZsKTsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZgorCisvKgorICogV2UgZG9uJ3QgY3JlYXRlIGl0IHR3aWNlIGZvciB0aGUgc2FrZSBvZiBzcGVlZC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfU2hhcmVkRmluZFJlcGxhY2UKK3sKKyAgICBXaWRnZXQgZGlhbG9nOwkvKiB0aGUgbWFpbiBkaWFsb2cgd2lkZ2V0ICovCisgICAgV2lkZ2V0IHd3b3JkOwkvKiAnRXhhY3QgbWF0Y2gnIGNoZWNrIGJ1dHRvbiAqLworICAgIFdpZGdldCBtY2FzZTsJLyogJ21hdGNoIGNhc2UnIGNoZWNrIGJ1dHRvbiAqLworICAgIFdpZGdldCB1cDsJCS8qIHNlYXJjaCBkaXJlY3Rpb24gJ1VwJyByYWRpbyBidXR0b24gKi8KKyAgICBXaWRnZXQgZG93bjsJLyogc2VhcmNoIGRpcmVjdGlvbiAnRG93bicgcmFkaW8gYnV0dG9uICovCisgICAgV2lkZ2V0IHdoYXQ7CS8qICdGaW5kIHdoYXQnIGVudHJ5IHRleHQgd2lkZ2V0ICovCisgICAgV2lkZ2V0IHdpdGg7CS8qICdSZXBsYWNlIHdpdGgnIGVudHJ5IHRleHQgd2lkZ2V0ICovCisgICAgV2lkZ2V0IGZpbmQ7CS8qICdGaW5kIE5leHQnIGFjdGlvbiBidXR0b24gKi8KKyAgICBXaWRnZXQgcmVwbGFjZTsJLyogJ1JlcGxhY2UgV2l0aCcgYWN0aW9uIGJ1dHRvbiAqLworICAgIFdpZGdldCBhbGw7CQkvKiAnUmVwbGFjZSBBbGwnIGFjdGlvbiBidXR0b24gKi8KKyAgICBXaWRnZXQgdW5kbzsJLyogJ1VuZG8nIGFjdGlvbiBidXR0b24gKi8KKworICAgIFdpZGdldCBjYW5jZWw7Cit9IFNoYXJlZEZpbmRSZXBsYWNlOworCitzdGF0aWMgU2hhcmVkRmluZFJlcGxhY2UgZmluZF93aWRnZXRzID0geyBOVUxMIH07CitzdGF0aWMgU2hhcmVkRmluZFJlcGxhY2UgcmVwbF93aWRnZXRzID0geyBOVUxMIH07CisKK3N0YXRpYyB2b2lkIGZpbmRfcmVwbGFjZV9kZXN0cm95X2NhbGxiYWNrIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwgWHRQb2ludGVyIGNhbGxfZGF0YSkpOworc3RhdGljIHZvaWQgZmluZF9yZXBsYWNlX2Rpc21pc3NfY2FsbGJhY2sgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLCBYdFBvaW50ZXIgY2FsbF9kYXRhKSk7CitzdGF0aWMgdm9pZCBlbnRyeV9hY3RpdmF0ZV9jYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2xpZW50X2RhdGEsIFh0UG9pbnRlciBjYWxsX2RhdGEpKTsKK3N0YXRpYyB2b2lkIGZpbmRfcmVwbGFjZV9jYWxsYmFjayBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2xpZW50X2RhdGEsIFh0UG9pbnRlciBjYWxsX2RhdGEpKTsKK3N0YXRpYyB2b2lkIGZpbmRfcmVwbGFjZV9rZXlwcmVzcyBfX0FSR1MoKFdpZGdldCB3LCBTaGFyZWRGaW5kUmVwbGFjZSAqIGZyZHAsIFhLZXlFdmVudCAqIGV2ZW50KSk7CitzdGF0aWMgdm9pZCBmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZSBfX0FSR1MoKGNoYXJfdSAqZW50cnlfdGV4dCwgaW50IGRvX3JlcGxhY2UpKTsKKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ZpbmRfcmVwbGFjZV9kZXN0cm95X2NhbGxiYWNrKHcsIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCWNsaWVudF9kYXRhOworICAgIFh0UG9pbnRlcgljYWxsX2RhdGE7Cit7CisgICAgU2hhcmVkRmluZFJlcGxhY2UgKmNkID0gKFNoYXJlZEZpbmRSZXBsYWNlICopY2xpZW50X2RhdGE7CisKKyAgICBpZiAoY2QgIT0gTlVMTCkKKwljZC0+ZGlhbG9nID0gKFdpZGdldCkwOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZmluZF9yZXBsYWNlX2Rpc21pc3NfY2FsbGJhY2sodywgY2xpZW50X2RhdGEsIGNhbGxfZGF0YSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWHRQb2ludGVyCWNhbGxfZGF0YTsKK3sKKyAgICBTaGFyZWRGaW5kUmVwbGFjZSAqY2QgPSAoU2hhcmVkRmluZFJlcGxhY2UgKiljbGllbnRfZGF0YTsKKworICAgIGlmIChjZCAhPSBOVUxMKQorCVh0VW5tYW5hZ2VDaGlsZChjZC0+ZGlhbG9nKTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2VudHJ5X2FjdGl2YXRlX2NhbGxiYWNrKHcsIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCWNsaWVudF9kYXRhOworICAgIFh0UG9pbnRlcgljYWxsX2RhdGE7Cit7CisgICAgWG1Qcm9jZXNzVHJhdmVyc2FsKChXaWRnZXQpY2xpZW50X2RhdGEsIFhtVFJBVkVSU0VfQ1VSUkVOVCk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitmaW5kX3JlcGxhY2VfY2FsbGJhY2sodywgY2xpZW50X2RhdGEsIGNhbGxfZGF0YSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWHRQb2ludGVyCWNhbGxfZGF0YTsKK3sKKyAgICBsb25nX3UJZmxhZ3MgPSAobG9uZ191KWNsaWVudF9kYXRhOworICAgIGNoYXIJKmZpbmRfdGV4dCwgKnJlcGxfdGV4dDsKKyAgICBCb29sZWFuCWRpcmVjdGlvbl9kb3duID0gVFJVRTsKKyAgICBCb29sZWFuCXd3b3JkOworICAgIEJvb2xlYW4JbWNhc2U7CisgICAgU2hhcmVkRmluZFJlcGxhY2UgKnNmcjsKKworICAgIGlmIChmbGFncyA9PSBGUkRfVU5ETykKKyAgICB7CisJY2hhcl91CSpzYXZlX2NwbyA9IHBfY3BvOworCisJLyogTm8gbmVlZCB0byBiZSBWaSBjb21wYXRpYmxlIGhlcmUuICovCisJcF9jcG8gPSAoY2hhcl91ICopIiI7CisJdV91bmRvKDEpOworCXBfY3BvID0gc2F2ZV9jcG87CisJZ3VpX3VwZGF0ZV9zY3JlZW4oKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogR2V0IHRoZSBzZWFyY2gvcmVwbGFjZSBzdHJpbmdzIGZyb20gdGhlIGRpYWxvZyAqLworICAgIGlmIChmbGFncyA9PSBGUkRfRklORE5FWFQpCisgICAgeworCXJlcGxfdGV4dCA9IE5VTEw7CisJc2ZyID0gJmZpbmRfd2lkZ2V0czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXBsX3RleHQgPSBYbVRleHRGaWVsZEdldFN0cmluZyhyZXBsX3dpZGdldHMud2l0aCk7CisJc2ZyID0gJnJlcGxfd2lkZ2V0czsKKyAgICB9CisgICAgZmluZF90ZXh0ID0gWG1UZXh0RmllbGRHZXRTdHJpbmcoc2ZyLT53aGF0KTsKKyAgICBYdFZhR2V0VmFsdWVzKHNmci0+ZG93biwgWG1Oc2V0LCAmZGlyZWN0aW9uX2Rvd24sIE5VTEwpOworICAgIFh0VmFHZXRWYWx1ZXMoc2ZyLT53d29yZCwgWG1Oc2V0LCAmd3dvcmQsIE5VTEwpOworICAgIFh0VmFHZXRWYWx1ZXMoc2ZyLT5tY2FzZSwgWG1Oc2V0LCAmbWNhc2UsIE5VTEwpOworICAgIGlmICh3d29yZCkKKwlmbGFncyB8PSBGUkRfV0hPTEVfV09SRDsKKyAgICBpZiAobWNhc2UpCisJZmxhZ3MgfD0gRlJEX01BVENIX0NBU0U7CisKKyAgICAodm9pZClndWlfZG9fZmluZHJlcGwoKGludClmbGFncywgKGNoYXJfdSAqKWZpbmRfdGV4dCwgKGNoYXJfdSAqKXJlcGxfdGV4dCwKKwkJCQkJCQkgICAgICBkaXJlY3Rpb25fZG93bik7CisKKyAgICBpZiAoZmluZF90ZXh0ICE9IE5VTEwpCisJWHRGcmVlKGZpbmRfdGV4dCk7CisgICAgaWYgKHJlcGxfdGV4dCAhPSBOVUxMKQorCVh0RnJlZShyZXBsX3RleHQpOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZmluZF9yZXBsYWNlX2tleXByZXNzKHcsIGZyZHAsIGV2ZW50KQorICAgIFdpZGdldAkJdzsKKyAgICBTaGFyZWRGaW5kUmVwbGFjZQkqZnJkcDsKKyAgICBYS2V5RXZlbnQJCSpldmVudDsKK3sKKyAgICBLZXlTeW0ga2V5c3ltOworCisgICAgaWYgKGZyZHAgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKGV2ZW50LCAwKTsKKworICAgIC8qIHRoZSBzY2FwZSBrZXkgcG9wcyB0aGUgd2hvbGUgZGlhbG9nIGRvd24gKi8KKyAgICBpZiAoa2V5c3ltID09IFhLX0VzY2FwZSkKKwlYdFVubWFuYWdlQ2hpbGQoZnJkcC0+ZGlhbG9nKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZShhcmcsIGRvX3JlcGxhY2UpCisgICAgY2hhcl91CSphcmc7CisgICAgaW50CQlkb19yZXBsYWNlOworeworICAgIFNoYXJlZEZpbmRSZXBsYWNlCSpmcmRwOworICAgIFdpZGdldAkJc2VwYXJhdG9yOworICAgIFdpZGdldAkJaW5wdXRfZm9ybTsKKyAgICBXaWRnZXQJCWJ1dHRvbl9mb3JtOworICAgIFdpZGdldAkJdG9nZ2xlX2Zvcm07CisgICAgV2lkZ2V0CQlmcmFtZTsKKyAgICBYbVN0cmluZwkJc3RyOworICAgIGludAkJCW47CisgICAgQXJnCQkJYXJnc1s2XTsKKyAgICBpbnQJCQl3d29yZCA9IEZBTFNFOworICAgIGludAkJCW1jYXNlID0gIXBfaWM7CisgICAgRGltZW5zaW9uCQl3aWR0aDsKKyAgICBEaW1lbnNpb24JCXdpZGVzdDsKKyAgICBjaGFyX3UJCSplbnRyeV90ZXh0OworCisgICAgZnJkcCA9IGRvX3JlcGxhY2UgPyAmcmVwbF93aWRnZXRzIDogJmZpbmRfd2lkZ2V0czsKKworICAgIC8qIEdldCB0aGUgc2VhcmNoIHN0cmluZyB0byB1c2UuICovCisgICAgZW50cnlfdGV4dCA9IGdldF9maW5kX2RpYWxvZ190ZXh0KGFyZywgJnd3b3JkLCAmbWNhc2UpOworCisgICAgLyogSWYgdGhlIGRpYWxvZyBhbHJlYWR5IGV4aXN0cywganVzdCByYWlzZSBpdC4gKi8KKyAgICBpZiAoZnJkcC0+ZGlhbG9nKQorICAgIHsKKwkvKiBJZiB0aGUgd2luZG93IGlzIGFscmVhZHkgdXAsIGp1c3QgcG9wIGl0IHRvIHRoZSB0b3AgKi8KKwlpZiAoWHRJc01hbmFnZWQoZnJkcC0+ZGlhbG9nKSkKKwkgICAgWE1hcFJhaXNlZChYdERpc3BsYXkoZnJkcC0+ZGlhbG9nKSwKKwkJCQkJICAgIFh0V2luZG93KFh0UGFyZW50KGZyZHAtPmRpYWxvZykpKTsKKwllbHNlCisJICAgIFh0TWFuYWdlQ2hpbGQoZnJkcC0+ZGlhbG9nKTsKKwlYdFBvcHVwKFh0UGFyZW50KGZyZHAtPmRpYWxvZyksIFh0R3JhYk5vbmUpOworCVhtUHJvY2Vzc1RyYXZlcnNhbChmcmRwLT53aGF0LCBYbVRSQVZFUlNFX0NVUlJFTlQpOworCisJaWYgKGVudHJ5X3RleHQgIT0gTlVMTCkKKwkgICAgWG1UZXh0RmllbGRTZXRTdHJpbmcoZnJkcC0+d2hhdCwgKGNoYXIgKillbnRyeV90ZXh0KTsKKwl2aW1fZnJlZShlbnRyeV90ZXh0KTsKKworCVh0VmFTZXRWYWx1ZXMoZnJkcC0+d3dvcmQsIFhtTnNldCwgd3dvcmQsIE5VTEwpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBmcmVzaCBuZXcgZGlhbG9nIHdpbmRvdyAqLworICAgIGlmIChkb19yZXBsYWNlKQorCSBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJWSU0gLSBTZWFyY2ggYW5kIFJlcGxhY2UuLi4iKSk7CisgICAgZWxzZQorCSBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJWSU0gLSBTZWFyY2guLi4iKSk7CisKKyAgICBuID0gMDsKKyAgICBYdFNldEFyZyhhcmdzW25dLCBYbU5hdXRvVW5tYW5hZ2UsIEZhbHNlKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTm5vUmVzaXplLCBUcnVlKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTmRpYWxvZ1RpdGxlLCBzdHIpOyBuKys7CisKKyAgICBmcmRwLT5kaWFsb2cgPSBYbUNyZWF0ZUZvcm1EaWFsb2codmltU2hlbGwsICJmaW5kUmVwbGFjZURpYWxvZyIsIGFyZ3MsIG4pOworICAgIFhtU3RyaW5nRnJlZShzdHIpOworICAgIFh0QWRkQ2FsbGJhY2soZnJkcC0+ZGlhbG9nLCBYbU5kZXN0cm95Q2FsbGJhY2ssCisJICAgIGZpbmRfcmVwbGFjZV9kZXN0cm95X2NhbGxiYWNrLCBmcmRwKTsKKworICAgIGJ1dHRvbl9mb3JtID0gWHRWYUNyZWF0ZVdpZGdldCgiYnV0dG9uRm9ybSIsCisJICAgIHhtRm9ybVdpZGdldENsYXNzLAlmcmRwLT5kaWFsb2csCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OcmlnaHRPZmZzZXQsIDQsCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnRvcE9mZnNldCwgNCwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYm90dG9tT2Zmc2V0LCA0LAorCSAgICBOVUxMKTsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIkZpbmQgTmV4dCIpKTsKKyAgICBmcmRwLT5maW5kID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImZpbmRCdXR0b24iLAorCSAgICB4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgYnV0dG9uX2Zvcm0sCisJICAgIFhtTmxhYmVsU3RyaW5nLCBzdHIsCisJICAgIFhtTnNlbnNpdGl2ZSwgVHJ1ZSwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgTlVMTCk7CisgICAgWG1TdHJpbmdGcmVlKHN0cik7CisKKyAgICBYdEFkZENhbGxiYWNrKGZyZHAtPmZpbmQsIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCisJICAgIGZpbmRfcmVwbGFjZV9jYWxsYmFjaywKKwkgICAgKFh0UG9pbnRlcikgKGRvX3JlcGxhY2UgPyBGUkRfUl9GSU5ETkVYVCA6IEZSRF9GSU5ETkVYVCkpOworCisgICAgaWYgKGRvX3JlcGxhY2UpCisgICAgeworCXN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIlJlcGxhY2UiKSk7CisJZnJkcC0+cmVwbGFjZSA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJyZXBsYWNlQnV0dG9uIiwKKwkJeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAorCQlYbU5sYWJlbFN0cmluZywgc3RyLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgZnJkcC0+ZmluZCwKKwkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJTlVMTCk7CisJWG1TdHJpbmdGcmVlKHN0cik7CisJWHRBZGRDYWxsYmFjayhmcmRwLT5yZXBsYWNlLCBYbU5hY3RpdmF0ZUNhbGxiYWNrLAorCQlmaW5kX3JlcGxhY2VfY2FsbGJhY2ssIChYdFBvaW50ZXIpRlJEX1JFUExBQ0UpOworCisJc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiUmVwbGFjZSBBbGwiKSk7CisJZnJkcC0+YWxsID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInJlcGxhY2VBbGxCdXR0b24iLAorCQl4bVB1c2hCdXR0b25XaWRnZXRDbGFzcywgYnV0dG9uX2Zvcm0sCisJCVhtTmxhYmVsU3RyaW5nLCBzdHIsCisJCVhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkJWG1OdG9wV2lkZ2V0LCBmcmRwLT5yZXBsYWNlLAorCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlOVUxMKTsKKwlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlYdEFkZENhbGxiYWNrKGZyZHAtPmFsbCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKKwkJZmluZF9yZXBsYWNlX2NhbGxiYWNrLCAoWHRQb2ludGVyKUZSRF9SRVBMQUNFQUxMKTsKKworCXN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIlVuZG8iKSk7CisJZnJkcC0+dW5kbyA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ1bmRvQnV0dG9uIiwKKwkJeG1QdXNoQnV0dG9uV2lkZ2V0Q2xhc3MsIGJ1dHRvbl9mb3JtLAorCQlYbU5sYWJlbFN0cmluZywgc3RyLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgZnJkcC0+YWxsLAorCQlYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlOVUxMKTsKKwlYbVN0cmluZ0ZyZWUoc3RyKTsKKwlYdEFkZENhbGxiYWNrKGZyZHAtPnVuZG8sIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCisJCWZpbmRfcmVwbGFjZV9jYWxsYmFjaywgKFh0UG9pbnRlcilGUkRfVU5ETyk7CisgICAgfQorCisgICAgc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiQ2FuY2VsIikpOworICAgIGZyZHAtPmNhbmNlbCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJjbG9zZUJ1dHRvbiIsCisJICAgIHhtUHVzaEJ1dHRvbldpZGdldENsYXNzLCBidXR0b25fZm9ybSwKKwkgICAgWG1ObGFiZWxTdHJpbmcsIHN0ciwKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgTlVMTCk7CisgICAgWG1TdHJpbmdGcmVlKHN0cik7CisgICAgWHRBZGRDYWxsYmFjayhmcmRwLT5jYW5jZWwsIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCisJICAgIGZpbmRfcmVwbGFjZV9kaXNtaXNzX2NhbGxiYWNrLCBmcmRwKTsKKworICAgIFh0TWFuYWdlQ2hpbGQoYnV0dG9uX2Zvcm0pOworCisgICAgbiA9IDA7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1Ob3JpZW50YXRpb24sIFhtVkVSVElDQUwpOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQpOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OcmlnaHRXaWRnZXQsIGJ1dHRvbl9mb3JtKTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnJpZ2h0T2Zmc2V0LCA0KTsgbisrOworICAgIFh0U2V0QXJnKGFyZ3Nbbl0sIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0pOyBuKys7CisgICAgWHRTZXRBcmcoYXJnc1tuXSwgWG1OYm90dG9tQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSk7IG4rKzsKKyAgICBzZXBhcmF0b3IgPSBYbUNyZWF0ZVNlcGFyYXRvckdhZGdldChmcmRwLT5kaWFsb2csICJzZXBhcmF0b3IiLCBhcmdzLCBuKTsKKyAgICBYdE1hbmFnZUNoaWxkKHNlcGFyYXRvcik7CisKKyAgICBpbnB1dF9mb3JtID0gWHRWYUNyZWF0ZVdpZGdldCgiaW5wdXRGb3JtIiwKKwkgICAgeG1Gb3JtV2lkZ2V0Q2xhc3MsCWZyZHAtPmRpYWxvZywKKwkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTmxlZnRPZmZzZXQsIDQsCisJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU5yaWdodFdpZGdldCwgc2VwYXJhdG9yLAorCSAgICBYbU5yaWdodE9mZnNldCwgNCwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1OdG9wT2Zmc2V0LCA0LAorCSAgICBOVUxMKTsKKworICAgIHsKKwlXaWRnZXQgbGFiZWxfd2hhdDsKKwlXaWRnZXQgbGFiZWxfd2l0aCA9IChXaWRnZXQpMDsKKworCXN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIkZpbmQgd2hhdDoiKSk7CisJbGFiZWxfd2hhdCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ3aGF0TGFiZWwiLAorCQl4bUxhYmVsR2FkZ2V0Q2xhc3MsIGlucHV0X2Zvcm0sCisJCVhtTmxhYmVsU3RyaW5nLCBzdHIsCisJCVhtTmxlZnRBdHRhY2htZW50LAlYbUFUVEFDSF9GT1JNLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlYbU50b3BPZmZzZXQsIDQsCisJCU5VTEwpOworCVhtU3RyaW5nRnJlZShzdHIpOworCisJZnJkcC0+d2hhdCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KCJ3aGF0VGV4dCIsCisJCXhtVGV4dEZpZWxkV2lkZ2V0Q2xhc3MsIGlucHV0X2Zvcm0sCisJCVhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCU5VTEwpOworCisJaWYgKGRvX3JlcGxhY2UpCisJeworCSAgICBmcmRwLT53aXRoID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoIndpdGhUZXh0IiwKKwkJICAgIHhtVGV4dEZpZWxkV2lkZ2V0Q2xhc3MsCWlucHV0X2Zvcm0sCisJCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCSAgICBYbU50b3BXaWRnZXQsIGZyZHAtPndoYXQsCisJCSAgICBYbU50b3BPZmZzZXQsIDQsCisJCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJICAgIFhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCSAgICBOVUxMKTsKKworCSAgICBYdEFkZENhbGxiYWNrKGZyZHAtPndpdGgsIFhtTmFjdGl2YXRlQ2FsbGJhY2ssCisJCSAgICBmaW5kX3JlcGxhY2VfY2FsbGJhY2ssIChYdFBvaW50ZXIpIEZSRF9SX0ZJTkRORVhUKTsKKworCSAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJSZXBsYWNlIHdpdGg6IikpOworCSAgICBsYWJlbF93aXRoID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoIndpdGhMYWJlbCIsCisJCSAgICB4bUxhYmVsR2FkZ2V0Q2xhc3MsIGlucHV0X2Zvcm0sCisJCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCQkgICAgWG1ObGVmdEF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCSAgICBYbU50b3BXaWRnZXQsIGZyZHAtPndoYXQsCisJCSAgICBYbU50b3BPZmZzZXQsIDQsCisJCSAgICBYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQkgICAgTlVMTCk7CisJICAgIFhtU3RyaW5nRnJlZShzdHIpOworCisJICAgIC8qCisJICAgICAqIE1ha2UgdGhlIGVudHJ5IGFjdGl2YXRpb24gb25seSBjaGFuZ2UgdGhlIGlucHV0IGZvY3VzIG9udG8gdGhlCisJICAgICAqIHdpdGggaXRlbS4KKwkgICAgICovCisJICAgIFh0QWRkQ2FsbGJhY2soZnJkcC0+d2hhdCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKKwkJICAgIGVudHJ5X2FjdGl2YXRlX2NhbGxiYWNrLCBmcmRwLT53aXRoKTsKKwkgICAgWHRBZGRFdmVudEhhbmRsZXIoZnJkcC0+d2l0aCwgS2V5UHJlc3NNYXNrLCBGYWxzZSwKKwkJCSAgICAoWHRFdmVudEhhbmRsZXIpZmluZF9yZXBsYWNlX2tleXByZXNzLAorCQkJICAgIChYdFBvaW50ZXIpIGZyZHApOworCisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIE1ha2UgdGhlIGVudHJ5IGFjdGl2YXRpb24gZG8gdGhlIHNlYXJjaC4KKwkgICAgICovCisJICAgIFh0QWRkQ2FsbGJhY2soZnJkcC0+d2hhdCwgWG1OYWN0aXZhdGVDYWxsYmFjaywKKwkJICAgIGZpbmRfcmVwbGFjZV9jYWxsYmFjaywgKFh0UG9pbnRlcilGUkRfRklORE5FWFQpOworCX0KKwlYdEFkZEV2ZW50SGFuZGxlcihmcmRwLT53aGF0LCBLZXlQcmVzc01hc2ssIEZhbHNlLAorCQkJICAgIChYdEV2ZW50SGFuZGxlcilmaW5kX3JlcGxhY2Vfa2V5cHJlc3MsCisJCQkgICAgKFh0UG9pbnRlcilmcmRwKTsKKworCS8qIEdldCB0aGUgbWF4aW11bSB3aWR0aCBiZXR3ZWVuIHRoZSBsYWJlbCB3aWRnZXRzIGFuZCBsaW5lIHRoZW0gdXAuCisJICovCisJbiA9IDA7CisJWHRTZXRBcmcoYXJnc1tuXSwgWG1Od2lkdGgsICZ3aWR0aCk7IG4rKzsKKwlYdEdldFZhbHVlcyhsYWJlbF93aGF0LCBhcmdzLCBuKTsKKwl3aWRlc3QgPSB3aWR0aDsKKwlpZiAoZG9fcmVwbGFjZSkKKwl7CisJICAgIFh0R2V0VmFsdWVzKGxhYmVsX3dpdGgsIGFyZ3MsIG4pOworCSAgICBpZiAod2lkdGggPiB3aWRlc3QpCisJCXdpZGVzdCA9IHdpZHRoOworCX0KKworCVh0VmFTZXRWYWx1ZXMoZnJkcC0+d2hhdCwgWG1ObGVmdE9mZnNldCwgd2lkZXN0LCBOVUxMKTsKKwlpZiAoZG9fcmVwbGFjZSkKKwkgICAgWHRWYVNldFZhbHVlcyhmcmRwLT53aXRoLCBYbU5sZWZ0T2Zmc2V0LCB3aWRlc3QsIE5VTEwpOworCisgICAgfQorCisgICAgWHRNYW5hZ2VDaGlsZChpbnB1dF9mb3JtKTsKKworICAgIHsKKwlXaWRnZXQgcmFkaW9fYm94OworCisJZnJhbWUgPSBYdFZhQ3JlYXRlV2lkZ2V0KCJkaXJlY3Rpb25GcmFtZSIsCisJCXhtRnJhbWVXaWRnZXRDbGFzcywgZnJkcC0+ZGlhbG9nLAorCQlYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJCVhtTnRvcFdpZGdldCwgaW5wdXRfZm9ybSwKKwkJWG1OdG9wT2Zmc2V0LCA0LAorCQlYbU5ib3R0b21BdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCQlYbU5ib3R0b21PZmZzZXQsIDQsCisJCVhtTnJpZ2h0QXR0YWNobWVudCwgWG1BVFRBQ0hfT1BQT1NJVEVfV0lER0VULAorCQlYbU5yaWdodFdpZGdldCwgaW5wdXRfZm9ybSwKKwkJTlVMTCk7CisKKwlzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJEaXJlY3Rpb24iKSk7CisJKHZvaWQpWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRpcmVjdGlvbkZyYW1lTGFiZWwiLAorCQl4bUxhYmVsR2FkZ2V0Q2xhc3MsIGZyYW1lLAorCQlYbU5sYWJlbFN0cmluZywgc3RyLAorCQlYbU5jaGlsZEhvcml6b250YWxBbGlnbm1lbnQsIFhtQUxJR05NRU5UX0JFR0lOTklORywKKwkJWG1OY2hpbGRUeXBlLCBYbUZSQU1FX1RJVExFX0NISUxELAorCQlOVUxMKTsKKwlYbVN0cmluZ0ZyZWUoc3RyKTsKKworCXJhZGlvX2JveCA9IFhtQ3JlYXRlUmFkaW9Cb3goZnJhbWUsICJyYWRpb0JveCIsCisJCShBcmdMaXN0KU5VTEwsIDApOworCisJc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoIF8oIlVwIikpOworCWZyZHAtPnVwID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoInVwUmFkaW9CdXR0b24iLAorCQl4bVRvZ2dsZUJ1dHRvbkdhZGdldENsYXNzLCByYWRpb19ib3gsCisJCVhtTmxhYmVsU3RyaW5nLCBzdHIsCisJCVhtTnNldCwgRmFsc2UsCisJCU5VTEwpOworCVhtU3RyaW5nRnJlZShzdHIpOworCisJc3RyID0gWG1TdHJpbmdDcmVhdGVTaW1wbGUoXygiRG93biIpKTsKKwlmcmRwLT5kb3duID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoImRvd25SYWRpb0J1dHRvbiIsCisJCXhtVG9nZ2xlQnV0dG9uR2FkZ2V0Q2xhc3MsIHJhZGlvX2JveCwKKwkJWG1ObGFiZWxTdHJpbmcsIHN0ciwKKwkJWG1Oc2V0LCBUcnVlLAorCQlOVUxMKTsKKwlYbVN0cmluZ0ZyZWUoc3RyKTsKKworCVh0TWFuYWdlQ2hpbGQocmFkaW9fYm94KTsKKwlYdE1hbmFnZUNoaWxkKGZyYW1lKTsKKyAgICB9CisKKyAgICB0b2dnbGVfZm9ybSA9IFh0VmFDcmVhdGVXaWRnZXQoInRvZ2dsZUZvcm0iLAorCSAgICB4bUZvcm1XaWRnZXRDbGFzcywJZnJkcC0+ZGlhbG9nLAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdE9mZnNldCwgNCwKKwkgICAgWG1OcmlnaHRBdHRhY2htZW50LCBYbUFUVEFDSF9XSURHRVQsCisJICAgIFhtTnJpZ2h0V2lkZ2V0LCBmcmFtZSwKKwkgICAgWG1OcmlnaHRPZmZzZXQsIDQsCisJICAgIFhtTnRvcEF0dGFjaG1lbnQsIFhtQVRUQUNIX1dJREdFVCwKKwkgICAgWG1OdG9wV2lkZ2V0LCBpbnB1dF9mb3JtLAorCSAgICBYbU50b3BPZmZzZXQsIDQsCisJICAgIFhtTmJvdHRvbUF0dGFjaG1lbnQsIFhtQVRUQUNIX0ZPUk0sCisJICAgIFhtTmJvdHRvbU9mZnNldCwgNCwKKwkgICAgTlVMTCk7CisKKyAgICBzdHIgPSBYbVN0cmluZ0NyZWF0ZVNpbXBsZShfKCJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiKSk7CisgICAgZnJkcC0+d3dvcmQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgid29yZFRvZ2dsZSIsCisJICAgIHhtVG9nZ2xlQnV0dG9uR2FkZ2V0Q2xhc3MsIHRvZ2dsZV9mb3JtLAorCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCSAgICBYbU50b3BBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU50b3BPZmZzZXQsIDQsCisJICAgIFhtTmxlZnRBdHRhY2htZW50LCBYbUFUVEFDSF9GT1JNLAorCSAgICBYbU5sZWZ0T2Zmc2V0LCA0LAorCSAgICBYbU5zZXQsIHd3b3JkLAorCSAgICBOVUxMKTsKKyAgICBYbVN0cmluZ0ZyZWUoc3RyKTsKKworICAgIHN0ciA9IFhtU3RyaW5nQ3JlYXRlU2ltcGxlKF8oIk1hdGNoIGNhc2UiKSk7CisgICAgZnJkcC0+bWNhc2UgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCgiY2FzZVRvZ2dsZSIsCisJICAgIHhtVG9nZ2xlQnV0dG9uR2FkZ2V0Q2xhc3MsIHRvZ2dsZV9mb3JtLAorCSAgICBYbU5sYWJlbFN0cmluZywgc3RyLAorCSAgICBYbU5sZWZ0QXR0YWNobWVudCwgWG1BVFRBQ0hfRk9STSwKKwkgICAgWG1ObGVmdE9mZnNldCwgNCwKKwkgICAgWG1OdG9wQXR0YWNobWVudCwgWG1BVFRBQ0hfV0lER0VULAorCSAgICBYbU50b3BXaWRnZXQsIGZyZHAtPnd3b3JkLAorCSAgICBYbU50b3BPZmZzZXQsIDQsCisJICAgIFhtTnNldCwgbWNhc2UsCisJICAgIE5VTEwpOworICAgIFhtU3RyaW5nRnJlZShzdHIpOworCisgICAgWHRNYW5hZ2VDaGlsZCh0b2dnbGVfZm9ybSk7CisKKyAgICBpZiAoZW50cnlfdGV4dCAhPSBOVUxMKQorCVhtVGV4dEZpZWxkU2V0U3RyaW5nKGZyZHAtPndoYXQsIChjaGFyICopZW50cnlfdGV4dCk7CisgICAgdmltX2ZyZWUoZW50cnlfdGV4dCk7CisKKyAgICBYdE1hbmFnZUNoaWxkKGZyZHAtPmRpYWxvZyk7CisgICAgWG1Qcm9jZXNzVHJhdmVyc2FsKGZyZHAtPndoYXQsIFhtVFJBVkVSU0VfQ1VSUkVOVCk7Cit9CisKKyAgIHZvaWQKK2d1aV9tY2hfZmluZF9kaWFsb2coZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoIWd1aS5pbl91c2UpCisJcmV0dXJuOworCisgICAgZmluZF9yZXBsYWNlX2RpYWxvZ19jcmVhdGUoZWFwLT5hcmcsIEZBTFNFKTsKK30KKworCisgICAgdm9pZAorZ3VpX21jaF9yZXBsYWNlX2RpYWxvZyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGlmICghZ3VpLmluX3VzZSkKKwlyZXR1cm47CisKKyAgICBmaW5kX3JlcGxhY2VfZGlhbG9nX2NyZWF0ZShlYXAtPmFyZywgVFJVRSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZ3VpX3Bob3Rvbi5jIGIvc3JjL2d1aV9waG90b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmJkNWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV9waG90b24uYwpAQCAtMCwwICsxLDMwNjAgQEAKKy8qIHZpOnNldCB0cz04IHN3PTQgc3RzPTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJUGhvdG9uIEdVSSBzdXBwb3J0IGJ5IEp1bGlhbiBLaW5yYWlkCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqCisgKgorICogQ2xpcGJvYXJkIHN1cHBvcnQgaXMgaW4gb3NfcW54LmMKKyAqIFBoQXR0YWNoKCkgaXMgY2FsbGVkIGluIG9zX3FueC5jOnFueF9pbml0KCkKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyMgaW5jbHVkZSA8cGhvdG9uL1B4SW1hZ2UuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19RTlhfXykKKy8qIFVzZWQgd2hlbiBnZW5lcmF0aW5nIHByb3RvdHlwZXMuICovCisjIGRlZmluZSBQZ0NvbG9yX3QJaW50CisjIGRlZmluZSBQaEV2ZW50X3QJaW50CisjIGRlZmluZSBQaFBvaW50X3QJaW50CisjIGRlZmluZSBQdFdpZGdldF90CWludAorIyBkZWZpbmUgUGdfQkxBQ0sJMAorIyBkZWZpbmUgUHRDYWxsYmFja0ZfdAlpbnQKKyMgZGVmaW5lIFB0Q2FsbGJhY2tJbmZvX3QgaW50CisjIGRlZmluZSBQaFRpbGVfdAlpbnQKKyMgZGVmaW5lIFB0V2lkZ2V0X3QJaW50CisjIGRlZmluZSBQaEltYWdlX3QJaW50CisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9MRU5HVEgoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyNkZWZpbmUgUkdCKHIsZyxiKSBQZ1JHQihyLGcsYikKKworI2RlZmluZSBFVkVOVF9CVUZGRVJfU0laRSBzaXplb2YoIFBoRXZlbnRfdCApICsgMTAwMAorCisvKiBTb21lIGRlZmluZXMgZm9yIGd1aV9tY2hfbW91c2VoaWRlKCkgKi8KKyNkZWZpbmUgTU9VU0VfSElERQkJVFJVRQorI2RlZmluZSBNT1VTRV9TSE9XCQlGQUxTRQorCisvKiBPcHRpb25hbCBzdXBwb3J0IGZvciB1c2luZyBhIFB0UGFuZWxHcm91cCB3aWRnZXQsIG5lZWRzIHdvcmsgKi8KKyN1bmRlZiBVU0VfUEFORUxfR1JPVVAKKworI2lmZGVmIFVTRV9QQU5FTF9HUk9VUAorc3RhdGljIGNoYXIJKmVtcHR5X3RpdGxlID0gIiAgICAiOworc3RhdGljIGNoYXIJKipwYW5lbF90aXRsZXMgPSBOVUxMOworc3RhdGljIHVzaG9ydF90CW51bV9wYW5lbHMgPSAwOworc3RhdGljIHNob3J0IHBnX21hcmdpbl9sZWZ0LCBwZ19tYXJnaW5fcmlnaHQsIHBnX21hcmdpbl90b3AsIHBnX21hcmdpbl9ib3R0b207CisjZW5kaWYKKworI2RlZmluZSBHVUlfUEhfTUFSR0lOCQk0CS8qIFNpemUgb2YgdGhlIGJldmVsICovCisKKyNkZWZpbmUgR1VJX1BIX01PVVNFX1RZUEUJCVBoX0NVUlNPUl9JTlNFUlQKK3N0YXRpYyBQZ0NvbG9yX3QgZ3VpX3BoX21vdXNlX2NvbG9yID0JUGdfQkxBQ0s7CisKK3N0YXRpYyBQaFBvaW50X3QgICAgZ3VpX3BoX3Jhd19vZmZzZXQ7CitzdGF0aWMgUHRXaWRnZXRfdCAgICpndWlfcGhfdGltZXJfY3Vyc29yOyAgIC8qIGhhbmRsZSBjdXJzb3IgYmxpbmtpbmcgKi8KK3N0YXRpYyBQdFdpZGdldF90ICAgKmd1aV9waF90aW1lcl90aW1lb3V0OyAgLyogdXNlZCBpbiBndWlfbWNoX3dhaXRfZm9yX2NoYXJzICovCitzdGF0aWMgc2hvcnQJICAgIGlzX3RpbWVvdXQ7CQkgICAgLyogSGFzIHRoZSB0aW1lb3V0IG9jY3VyZWQ/ICovCisKKy8qCisgKiBUaGlzIGlzIHNldCBpbnNpZGUgdGhlIG1vdXNlIGNhbGxiYWNrIGZvciBhIHJpZ2h0IG1vdXNlCisgKiBidXR0b24gY2xpY2ssIGFuZCB1c2VkIGZvciB0aGUgcG9wdXAgbWVudXMKKyAqLworc3RhdGljIFBoUG9pbnRfdCAgICBhYnNfbW91c2U7CisKKy8qIFRyeSBhbmQgYXZvaWQgcmVkcmF3cyB3aGlsZSBhIHJlc2l6ZSBpcyBpbiBwcm9ncmVzcyAqLworc3RhdGljIGludCBpc19pZ25vcmVfZHJhdyA9IEZBTFNFOworCisvKiBVc2VkIGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gdXRmLTggYW5kIG90aGVyIGNoYXJzZXRzICovCitzdGF0aWMgc3RydWN0IFB4VHJhbnNDdHJsICpjaGFyc2V0X3RyYW5zbGF0ZTsKKworLyoKKyAqIEN1cnNvciBibGluayBmdW5jdGlvbnMuCisgKgorICogVGhpcyBpcyBhIHNpbXBsZSBzdGF0ZSBtYWNoaW5lOgorICogQkxJTktfTk9ORQlub3QgYmxpbmtpbmcgYXQgYWxsCisgKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KKyAqIEJMSU5LX09OCWJsaW5raW5nLCBjdXJzb3IgaXMgc2hvd24KKyAqLworc3RhdGljIGVudW0geworICAgIEJMSU5LX05PTkUsCisgICAgQkxJTktfT0ZGLAorICAgIEJMSU5LX09OCit9IGJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKKworc3RhdGljIGxvbmdfdQlibGlua193YWl0dGltZQk9IDcwMDsKK3N0YXRpYyBsb25nX3UJYmxpbmtfb250aW1lCT0gNDAwOworc3RhdGljIGxvbmdfdQlibGlua19vZmZ0aW1lCT0gMjUwOworCitzdGF0aWMgc3RydWN0Cit7CisgICAgaW50CSAgICBrZXlfc3ltOworICAgIGNoYXJfdSAgdmltX2NvZGUwOworICAgIGNoYXJfdSAgdmltX2NvZGUxOworfSBzcGVjaWFsX2tleXNbXSA9Cit7CisgICAge1BrX1VwLAkgICAgJ2snLCAndSd9LAorICAgIHtQa19Eb3duLAkgICAgJ2snLCAnZCd9LAorICAgIHtQa19MZWZ0LAkgICAgJ2snLCAnbCd9LAorICAgIHtQa19SaWdodCwJICAgICdrJywgJ3InfSwKKworICAgIHtQa19GMSwJICAgICdrJywgJzEnfSwKKyAgICB7UGtfRjIsCSAgICAnaycsICcyJ30sCisgICAge1BrX0YzLAkgICAgJ2snLCAnMyd9LAorICAgIHtQa19GNCwJICAgICdrJywgJzQnfSwKKyAgICB7UGtfRjUsCSAgICAnaycsICc1J30sCisgICAge1BrX0Y2LAkgICAgJ2snLCAnNid9LAorICAgIHtQa19GNywJICAgICdrJywgJzcnfSwKKyAgICB7UGtfRjgsCSAgICAnaycsICc4J30sCisgICAge1BrX0Y5LAkgICAgJ2snLCAnOSd9LAorICAgIHtQa19GMTAsCSAgICAnaycsICc7J30sCisKKyAgICB7UGtfRjExLAkgICAgJ0YnLCAnMSd9LAorICAgIHtQa19GMTIsCSAgICAnRicsICcyJ30sCisgICAge1BrX0YxMywJICAgICdGJywgJzMnfSwKKyAgICB7UGtfRjE0LAkgICAgJ0YnLCAnNCd9LAorICAgIHtQa19GMTUsCSAgICAnRicsICc1J30sCisgICAge1BrX0YxNiwJICAgICdGJywgJzYnfSwKKyAgICB7UGtfRjE3LAkgICAgJ0YnLCAnNyd9LAorICAgIHtQa19GMTgsCSAgICAnRicsICc4J30sCisgICAge1BrX0YxOSwJICAgICdGJywgJzknfSwKKyAgICB7UGtfRjIwLAkgICAgJ0YnLCAnQSd9LAorCisgICAge1BrX0YyMSwJICAgICdGJywgJ0InfSwKKyAgICB7UGtfRjIyLAkgICAgJ0YnLCAnQyd9LAorICAgIHtQa19GMjMsCSAgICAnRicsICdEJ30sCisgICAge1BrX0YyNCwJICAgICdGJywgJ0UnfSwKKyAgICB7UGtfRjI1LAkgICAgJ0YnLCAnRid9LAorICAgIHtQa19GMjYsCSAgICAnRicsICdHJ30sCisgICAge1BrX0YyNywJICAgICdGJywgJ0gnfSwKKyAgICB7UGtfRjI4LAkgICAgJ0YnLCAnSSd9LAorICAgIHtQa19GMjksCSAgICAnRicsICdKJ30sCisKKyAgICB7UGtfRjMwLAkgICAgJ0YnLCAnSyd9LAorICAgIHtQa19GMzEsCSAgICAnRicsICdMJ30sCisgICAge1BrX0YzMiwJICAgICdGJywgJ00nfSwKKyAgICB7UGtfRjMzLAkgICAgJ0YnLCAnTid9LAorICAgIHtQa19GMzQsCSAgICAnRicsICdPJ30sCisgICAge1BrX0YzNSwJICAgICdGJywgJ1AnfSwKKworICAgIHtQa19IZWxwLAkgICAgJyUnLCAnMSd9LAorICAgIHtQa19CYWNrU3BhY2UsICAnaycsICdiJ30sCisgICAge1BrX0luc2VydCwJICAgICdrJywgJ0knfSwKKyAgICB7UGtfRGVsZXRlLAkgICAgJ2snLCAnRCd9LAorICAgIHtQa19Ib21lLAkgICAgJ2snLCAnaCd9LAorICAgIHtQa19FbmQsCSAgICAnQCcsICc3J30sCisgICAge1BrX1ByaW9yLAkgICAgJ2snLCAnUCd9LAorICAgIHtQa19OZXh0LAkgICAgJ2snLCAnTid9LAorICAgIHtQa19QcmludCwJICAgICclJywgJzknfSwKKworICAgIHtQa19LUF9BZGQsCSAgICAnSycsICc2J30sCisgICAge1BrX0tQX1N1YnRyYWN0LCdLJywgJzcnfSwKKyAgICB7UGtfS1BfRGl2aWRlLCAgJ0snLCAnOCd9LAorICAgIHtQa19LUF9NdWx0aXBseSwnSycsICc5J30sCisgICAge1BrX0tQX0VudGVyLCAgICdLJywgJ0EnfSwKKworICAgIHtQa19LUF8wLAkgICAgS1NfRVhUUkEsIEtFX0tJTlN9LCAvKiBJbnNlcnQgICAgKi8KKyAgICB7UGtfS1BfRGVjaW1hbCwgS1NfRVhUUkEsIEtFX0tERUx9LCAvKiBEZWxldGUgICAgKi8KKworICAgIHtQa19LUF80LAkgICAgJ2snLCAnbCd9LCAvKiBMZWZ0CSAgICAqLworICAgIHtQa19LUF82LAkgICAgJ2snLCAncid9LCAvKiBSaWdodAkgICAgKi8KKyAgICB7UGtfS1BfOCwJICAgICdrJywgJ3UnfSwgLyogVXAJICAgICovCisgICAge1BrX0tQXzIsCSAgICAnaycsICdkJ30sIC8qIERvd24JICAgICovCisKKyAgICB7UGtfS1BfNywJICAgICdLJywgJzEnfSwgLyogSG9tZQkgICAgKi8KKyAgICB7UGtfS1BfMSwJICAgICdLJywgJzQnfSwgLyogRW5kCSAgICAqLworCisgICAge1BrX0tQXzksCSAgICAnSycsICczJ30sIC8qIFBhZ2UgVXAgICAqLworICAgIHtQa19LUF8zLAkgICAgJ0snLCAnNSd9LCAvKiBQYWdlIERvd24gKi8KKworICAgIHtQa19LUF81LAkgICAgJyYnLCAnOCd9LCAvKiBVbmRvCSAgICAqLworCisgICAgLyogS2V5cyB0aGF0IHdlIHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgYW55IG1vZGlmaWVyIHdpdGg6ICovCisgICAge1BrX1JldHVybiwJICAgIENBUiwgIE5VTH0sCisgICAge1BrX3NwYWNlLAkgICAgJyAnLCBOVUx9LAorICAgIHtQa19UYWIsCSAgICBUQUIsIE5VTH0sCisgICAge1BrX0VzY2FwZSwJICAgIEVTQywgTlVMfSwKKyAgICB7TkwsCSAgICBOTCwJIE5VTH0sCisgICAge0NBUiwJICAgIENBUiwgIE5VTH0sCisKKyAgICAvKiBFbmQgb2YgbGlzdCBtYXJrZXI6ICovCisgICAgezAsCQkwLCAwfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFB0Q2FsbGJhY2tGX3QgZ3VpX3BoX2hhbmRsZV90aW1lcl9jdXJzb3I7CitzdGF0aWMgUHRDYWxsYmFja0ZfdCBndWlfcGhfaGFuZGxlX3RpbWVyX3RpbWVvdXQ7CisKK3N0YXRpYyBQdENhbGxiYWNrRl90IGd1aV9waF9oYW5kbGVfd2luZG93X2NiOworCitzdGF0aWMgUHRDYWxsYmFja0ZfdCBndWlfcGhfaGFuZGxlX3Njcm9sbGJhcjsKK3N0YXRpYyBQdENhbGxiYWNrRl90IGd1aV9waF9oYW5kbGVfa2V5Ym9hcmQ7CitzdGF0aWMgUHRDYWxsYmFja0ZfdCBndWlfcGhfaGFuZGxlX21vdXNlOworc3RhdGljIFB0Q2FsbGJhY2tGX3QgZ3VpX3BoX2hhbmRsZV9wdWxsZG93bl9tZW51Oworc3RhdGljIFB0Q2FsbGJhY2tGX3QgZ3VpX3BoX2hhbmRsZV9tZW51Oworc3RhdGljIFB0Q2FsbGJhY2tGX3QgZ3VpX3BoX2hhbmRsZV9mb2N1czsJLyogZm9jdXMgY2hhbmdlIG9mIHRleHQgYXJlYSAqLworCitzdGF0aWMgUHRDYWxsYmFja0ZfdCBndWlfcGhfaGFuZGxlX21lbnVfcmVzaXplOworCisvKiBXaGVuIGEgbWVudSBpcyB1bnJlYWxpemVkLCBnaXZlIGZvY3VzIGJhY2sgdG8gdmltVGV4dEFyZWEgKi8KK3N0YXRpYyBQdENhbGxiYWNrRl90IGd1aV9waF9oYW5kbGVfbWVudV91bnJlYWxpemVkOworCisjaWZkZWYgVVNFX1BBTkVMX0dST1VQCitzdGF0aWMgdm9pZCBndWlfcGhfZ2V0X3BhbmVsZ3JvdXBfbWFyZ2lucyggc2hvcnQqLCBzaG9ydCosIHNob3J0Kiwgc2hvcnQqICk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVE9PTEJBUgorc3RhdGljIFBoSW1hZ2VfdCAqZ3VpX3BoX3Rvb2xiYXJfZmluZF9pY29uKCB2aW1tZW51X1QgKm1lbnUgKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBndWlfcGhfZHJhd19zdGFydCggdm9pZCApOworc3RhdGljIHZvaWQgZ3VpX3BoX2RyYXdfZW5kKCB2b2lkICk7CisKKy8qIFNldCB0aGUgdGV4dCBmb3IgdGhlIGJhbGxvb24gKi8KK3N0YXRpYyBQdFdpZGdldF90ICogZ3VpX3BoX3Nob3dfdG9vbHRpcCggUHRXaWRnZXRfdCAqd2luZG93LAorCQkJICAgICBQdFdpZGdldF90ICp3aWRnZXQsCisJCQkgICAgIGludCBwb3NpdGlvbiwKKwkJCSAgICAgY2hhciAqdGV4dCwKKwkJCSAgICAgY2hhciAqZm9udCwKKwkJCSAgICAgUGdDb2xvcl90IGZpbGxfY29sb3IsCisJCQkgICAgIFBnQ29sb3JfdCB0ZXh0X2NvbG9yICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgUHRXaWRnZXRfdCAqIGd1aV9waF9zaG93X3Rvb2x0aXAoIFB0V2lkZ2V0X3QgKndpbmRvdywKKwkJCSAgICAgUHRXaWRnZXRfdCAqd2lkZ2V0LAorCQkJICAgICBpbnQgcG9zaXRpb24sCisJCQkgICAgIGNoYXIgKnRleHQsCisJCQkgICAgIGNoYXIgKmZvbnQsCisJCQkgICAgIFBnQ29sb3JfdCBmaWxsX2NvbG9yLAorCQkJICAgICBQZ0NvbG9yX3QgdGV4dF9jb2xvciApCit7CisgICAgUHRBcmdfdCBhcmc7CisgICAgdmltbWVudV9UICptZW51OworICAgIGNoYXJfdSAgKnRvb2x0aXA7CisKKyAgICBQdFNldEFyZyggJmFyZywgUHRfQVJHX1BPSU5URVIsICZtZW51LCAwICk7CisgICAgUHRHZXRSZXNvdXJjZXMoIHdpZGdldCwgMSwgJmFyZyApOworCisgICAgLyogT3ZlcnJpZGUgdGhlIHRleHQgYW5kIHBvc2l0aW9uICovCisKKyAgICB0b29sdGlwID0gdGV4dDsKKyAgICBpZiggbWVudSAhPSBOVUxMICkKKyAgICB7CisJaW50IGluZGV4ID0gTUVOVV9JTkRFWF9USVA7CisJaWYoIG1lbnUtPnN0cmluZ3NbIGluZGV4IF0gIT0gTlVMTCApCisJICAgIHRvb2x0aXAgPSBtZW51LT5zdHJpbmdzWyBpbmRleCBdOworICAgIH0KKworICAgIHJldHVybiggUHRJbmZsYXRlQmFsbG9vbigKKwkgICAgd2luZG93LAorCSAgICB3aWRnZXQsCisJICAgIC8qIERvbid0IHB1dCB0aGUgYmFsbG9vbiBhdCB0aGUgYm90dG9tLAorCSAgICAgKiBpdCBnZXRzIGRyYXduIG92ZXIgYnkgZ2Z4IGRvbmUgaW4gdGhlIFB0UmF3ICovCisJICAgIFB0X0JBTExPT05fVE9QLAorCSAgICB0b29sdGlwLAorCSAgICBmb250LAorCSAgICBmaWxsX2NvbG9yLAorCSAgICB0ZXh0X2NvbG9yICkgKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfcGhfcmVzaXplX2NvbnRhaW5lciggdm9pZCApCit7CisgICAgUGhBcmVhX3QgYXJlYTsKKworICAgIFB0V2lkZ2V0QXJlYSggZ3VpLnZpbVdpbmRvdywgJmFyZWEgKTsKKyAgICBQdFdpZGdldFBvcyAoIGd1aS52aW1Db250YWluZXIsICZhcmVhLnBvcyApOworCisgICAgUHRTZXRSZXNvdXJjZSggZ3VpLnZpbUNvbnRhaW5lciwgUHRfQVJHX0FSRUEsICZhcmVhLCAwICk7Cit9CisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX21lbnVfcmVzaXplKAorCVB0V2lkZ2V0X3QgKndpZGdldCwKKwl2b2lkICpvdGhlciwKKwlQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBQdENvbnRhaW5lckNhbGxiYWNrX3QgKnNpemVzID0gaW5mby0+Y2JkYXRhOworICAgIFB0V2lkZ2V0X3QJCSpjb250YWluZXI7CisgICAgUGhQb2ludF90CQliZWxvd19tZW51OworICAgIGludF91CQloZWlnaHQ7CisKKyAgICBoZWlnaHQgPSBzaXplcy0+bmV3X2RpbS5oOworCisgICAgLyogQmVjYXVzZSB2aW0gdHJlYXRzIHRoZSB0b29sYmFyIGFuZCBtZW51YmFyIHNlcGFyYXRseSwKKyAgICAgKiBhbmQgaGVyZSB0aGV5J3JlIGx1bXBlZCB0b2dldGhlciBpbnRvIGEgUHRUb29sYmFyR3JvdXAsCisgICAgICogd2Ugb25seSBuZWVkIGVpdGhlciBtZW51X2hlaWdodCBvciB0b29sYmFyX2hlaWdodCBzZXQgYXQgb25jZSAqLworICAgIGlmKCBndWkubWVudV9pc19hY3RpdmUgKQorICAgIHsKKwlndWkubWVudV9oZWlnaHQgPSBoZWlnaHQ7CisJZ3VpLnRvb2xiYXJfaGVpZ2h0ID0gMDsKKyAgICB9CisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgZWxzZQorCWd1aS50b29sYmFyX2hlaWdodCA9IGhlaWdodDsKKyNlbmRpZgorCisgICAgYmVsb3dfbWVudS54ID0gMDsKKyAgICBiZWxvd19tZW51LnkgPSBoZWlnaHQ7CisKKyNpZmRlZiBVU0VfUEFORUxfR1JPVVAKKyAgICBjb250YWluZXIgPSBndWkudmltUGFuZWxHcm91cDsKKyNlbHNlCisgICAgY29udGFpbmVyID0gZ3VpLnZpbUNvbnRhaW5lcjsKKyNlbmRpZgorCisgICAgUHRTZXRSZXNvdXJjZSggY29udGFpbmVyLCBQdF9BUkdfUE9TLCAmYmVsb3dfbWVudSwgMCApOworCisgICAgZ3VpX3BoX3Jlc2l6ZV9jb250YWluZXIoKTsKKworI2lmZGVmIFVTRV9QQU5FTF9HUk9VUAorICAgIGd1aV9waF9nZXRfcGFuZWxncm91cF9tYXJnaW5zKAorCSAgICAmcGdfbWFyZ2luX3RvcCwgJnBnX21hcmdpbl9ib3R0b20sCisJICAgICZwZ19tYXJnaW5fbGVmdCwgJnBnX21hcmdpbl9yaWdodCApOworI2VuZGlmCisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisvKgorICogUHRfQVJHX1RJTUVSX1JFUEVBVCBpc24ndCB1c2VkIGJlY2F1c2UgdGhlIG9uICYgb2ZmIHRpbWVzCisgKiBhcmUgZGlmZmVyZW50CisgKi8KKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX3RpbWVyX2N1cnNvcigKKwlQdFdpZGdldF90ICp3aWRnZXQsCisJdm9pZCAqZGF0YSwKKwlQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBpZiggYmxpbmtfc3RhdGUgPT0gQkxJTktfT04gKQorICAgIHsKKwlndWlfdW5kcmF3X2N1cnNvcigpOworCWJsaW5rX3N0YXRlID0gQkxJTktfT0ZGOworCVB0U2V0UmVzb3VyY2UoIGd1aV9waF90aW1lcl9jdXJzb3IsIFB0X0FSR19USU1FUl9JTklUSUFMLAorCQlibGlua19vZmZ0aW1lLCAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCWJsaW5rX3N0YXRlID0gQkxJTktfT047CisJUHRTZXRSZXNvdXJjZSggZ3VpX3BoX3RpbWVyX2N1cnNvciwgUHRfQVJHX1RJTUVSX0lOSVRJQUwsCisJCWJsaW5rX29udGltZSwgMCApOworICAgIH0KKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX3RpbWVyX3RpbWVvdXQoUHRXaWRnZXRfdCAqd2lkZ2V0LCB2b2lkICpkYXRhLCBQdENhbGxiYWNrSW5mb190ICppbmZvKQoreworICAgIGlzX3RpbWVvdXQgPSBUUlVFOworCisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV93aW5kb3dfY2IoIFB0V2lkZ2V0X3QgKndpZGdldCwgdm9pZCAqZGF0YSwgUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgUGhXaW5kb3dFdmVudF90ICp3ZSA9IGluZm8tPmNiZGF0YTsKKyAgICB1c2hvcnRfdCAqd2lkdGgsICpoZWlnaHQ7CisKKyAgICBzd2l0Y2goIHdlLT5ldmVudF9mICkgeworCWNhc2UgUGhfV01fQ0xPU0U6CisJICAgIGd1aV9zaGVsbF9jbG9zZWQoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFBoX1dNX0ZPQ1VTOgorCSAgICAvKiBKdXN0IGluIGNhc2UgaXQncyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHNob3duICovCisJICAgIGd1aV9tY2hfbW91c2VoaWRlKCBNT1VTRV9TSE9XICk7CisKKwkgICAgaWYoIHdlLT5ldmVudF9zdGF0ZSA9PSBQaF9XTV9FVlNUQVRFX0ZPQ1VTICkKKwkgICAgeworCQlndWlfZm9jdXNfY2hhbmdlKFRSVUUpOworCQlndWlfbWNoX3N0YXJ0X2JsaW5rKCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWd1aV9mb2N1c19jaGFuZ2UoRkFMU0UpOworCQlndWlfbWNoX3N0b3BfYmxpbmsoKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgUGhfV01fUkVTSVpFOgorCSAgICBQdEdldFJlc291cmNlKCBndWkudmltV2luZG93LCBQdF9BUkdfV0lEVEgsICZ3aWR0aCwgMCApOworCSAgICBQdEdldFJlc291cmNlKCBndWkudmltV2luZG93LCBQdF9BUkdfSEVJR0hULCAmaGVpZ2h0LCAwICk7CisjaWZkZWYgVVNFX1BBTkVMX0dST1VQCisJICAgIHdpZHRoICAtPSAocGdfbWFyZ2luX2xlZnQgKyBwZ19tYXJnaW5fcmlnaHQpOworCSAgICBoZWlnaHQgLT0gKHBnX21hcmdpbl90b3AgKyBwZ19tYXJnaW5fYm90dG9tKTsKKyNlbmRpZgorCSAgICBndWlfcmVzaXplX3NoZWxsKCAqd2lkdGgsICpoZWlnaHQgKTsKKwkgICAgZ3VpX3NldF9zaGVsbHNpemUoIEZBTFNFLCBGQUxTRSApOworCSAgICBpc19pZ25vcmVfZHJhdyA9IEZBTFNFOworCSAgICBQdEVuZEZsdXgoIGd1aS52aW1Db250YWluZXIgKTsKKwkgICAgUHRDb250YWluZXJSZWxlYXNlKCBndWkudmltQ29udGFpbmVyICk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV9zY3JvbGxiYXIoIFB0V2lkZ2V0X3QgKndpZGdldCwgdm9pZCAqZGF0YSwgUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgUHRTY3JvbGxiYXJDYWxsYmFja190ICpzY3JvbGw7CisgICAgc2Nyb2xsYmFyX1QgKnNiOworICAgIGludAkgICAgdmFsdWUsIGRyYWdnaW5nID0gRkFMU0U7CisKKyAgICBzY3JvbGwgPSBpbmZvLT5jYmRhdGE7CisKKyAgICBzYiA9IChzY3JvbGxiYXJfVCAqKSBkYXRhOworICAgIGlmKCBzYiAhPSBOVUxMICkKKyAgICB7CisJdmFsdWUgPSBzY3JvbGwtPnBvc2l0aW9uOworCXN3aXRjaCggc2Nyb2xsLT5hY3Rpb24gKQorCXsKKwkgICAgY2FzZSBQdF9TQ1JPTExfRFJBR0dFRDoKKwkJZHJhZ2dpbmcgPSBUUlVFOworCQlicmVhazsKKworCSAgICBjYXNlIFB0X1NDUk9MTF9TRVQ6CisJCS8qIEZJWE1FOiByZXR1cm4gc3RyYWlnaHQgYXdheSBoZXJlPyAqLworCQlyZXR1cm4oIFB0X0NPTlRJTlVFICk7CisJCWJyZWFrOworCX0KKworCWd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIGRyYWdnaW5nKTsKKyAgICB9CisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV9rZXlib2FyZCggUHRXaWRnZXRfdCAqd2lkZ2V0LCB2b2lkICpkYXRhLCBQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBQaEtleUV2ZW50X3QgICAgKmtleTsKKyAgICB1bnNpZ25lZCBjaGFyICAgc3RyaW5nWzZdOworICAgIGludAkJICAgIGxlbiwgaTsKKyAgICBpbnQJCSAgICBjaCwgbW9kaWZpZXJzOworCisgICAga2V5ID0gUGhHZXREYXRhKCBpbmZvLT5ldmVudCApOworCisgICAgY2ggPSBtb2RpZmllcnMgPSBsZW4gPSAwOworCisgICAgaWYoIHBfbWggKQorCWd1aV9tY2hfbW91c2VoaWRlKCBNT1VTRV9ISURFICk7CisKKyAgICAvKiBXZSdyZSBhIGdvb2QgbGlsIHBob3RvbiBwcm9ncmFtLCBhcmVuJ3Qgd2U/IHllcyB3ZSBhcmUsIHllZXNzIHdlZSBhcnJyICovCisgICAgaWYoIGtleS0+a2V5X2ZsYWdzICYgUGtfS0ZfQ29tcG9zZSApCisgICAgeworCXJldHVybiggUHRfQ09OVElOVUUgKTsKKyAgICB9CisKKyAgICBpZiggKGtleS0+a2V5X2ZsYWdzICYgUGtfS0ZfQ2FwX1ZhbGlkKSAmJgorCSAgICBQa0lzS2V5RG93bigga2V5LT5rZXlfZmxhZ3MgKSApCisgICAgeworI2lmZGVmIEZFQVRfTUVOVQorCS8qCisJICogT25seSBzaG93IHRoZSBtZW51IGlmIHRoZSBBbHQga2V5IGlzIGRvd24sIGFuZCB0aGUgU2hpZnQgJiBDdHJsCisJICoga2V5cyBhcmVuJ3QgZG93biwgYXMgd2VsbCBhcyB0aGUgb3RoZXIgY29uZGl0aW9ucworCSAqLworCWlmKCAoICgga2V5LT5rZXlfbW9kcyAmIFBrX0tNX0FsdCApICYmCisJCSAgICAhKCBrZXktPmtleV9tb2RzICYgUGtfS01fU2hpZnQgKSAmJgorCQkgICAgISgga2V5LT5rZXlfbW9kcyAmIFBrX0tNX0N0cmwgKSApICYmCisJICAgIGd1aS5tZW51X2lzX2FjdGl2ZSAmJgorCSAgICAoICpwX3dhayA9PSAneScgfHwKKwkgICAgICAoICpwX3dhayA9PSAnbScgJiYKKwkJZ3VpX2lzX21lbnVfc2hvcnRjdXQoIGtleS0+a2V5X2NhcCApICkgKSApCisJeworCSAgICAvKiBGYWxsdGhyb3VnaCBhbmQgbGV0IHBob3RvbiBsb29rIGZvciB0aGUgaG90a2V5ICovCisJICAgIHJldHVybiggUHRfQ09OVElOVUUgKTsKKwl9CisjZW5kaWYKKworCWZvciggaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IDA7IGkrKyApCisJeworCSAgICBpZiggc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0ga2V5LT5rZXlfY2FwICkKKwkgICAgeworCQlsZW4gPSAwOworCQlpZiggc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSA9PSBOVUwgKQorCQkgICAgY2ggPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwOworCQllbHNlCisJCXsKKwkJICAgIC8qIERldGVjdCBpZiBhIGtleXBhZCBudW1iZXIga2V5IGhhcyBiZWVuIHByZXNzZWQKKwkJICAgICAqIGFuZCBjaGFuZ2UgdGhlIGtleSBpZiBOdW0gTG9jayBpcyBvbiAqLworCQkgICAgaWYoIGtleS0+a2V5X2NhcCA+PSBQa19LUF9FbnRlciAmJiBrZXktPmtleV9jYXAgPD0gUGtfS1BfOQorCQkJICAgICYmICgga2V5LT5rZXlfbW9kcyAmIFBrX0tNX051bV9Mb2NrICkgKQorCQkgICAgeworCQkJLyogRklYTUU6IEZvciBub3csIGp1c3QgbWFwIHRoZSBrZXkgdG8gYSBhc2NpaSB2YWx1ZQorCQkJICogKHNlZSA8cGhvdG9uL1BrS2V5RGVmLmg+KSAqLworCQkJY2ggPSBrZXktPmtleV9jYXAgLSAweGYwODA7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQljaCA9IFRPX1NQRUNJQUwoIHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTAsCisJCQkJc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSApOworCQl9CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYoIGtleS0+a2V5X21vZHMgJiBQa19LTV9DdHJsICkKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CisJaWYoIGtleS0+a2V5X21vZHMgJiBQa19LTV9BbHQgKQorCSAgICBtb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOworCWlmKCBrZXktPmtleV9tb2RzICYgUGtfS01fU2hpZnQgKQorCSAgICBtb2RpZmllcnMgfD0gTU9EX01BU0tfU0hJRlQ7CisKKwkvKiBJcyB0aGlzIG5vdCBhIHNwZWNpYWwga2V5PyAqLworCWlmKCBzcGVjaWFsX2tleXNbaV0ua2V5X3N5bSA9PSAwICkKKwl7CisJICAgIGNoID0gUGhUbzg4NTlfMSgga2V5ICk7CisJICAgIGlmKCBjaCA9PSAtMQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJfHwgKCBlbmNfdXRmOCAmJiBjaCA+IDEyNyApCisjZW5kaWYKKwkJKQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlsZW4gPSBQaEtleVRvTWIoIHN0cmluZywga2V5ICk7CisJCWlmKCBsZW4gPiAwICkKKwkJeworCQkgICAgc3RhdGljIGNoYXIgYnVmWzZdOworCQkgICAgaW50IHNyY190YWtlbiwgZHN0X21hZGU7CisJCSAgICBpZiggZW5jX3V0ZjggIT0gVFJVRSApCisJCSAgICB7CisJCQlQeFRyYW5zbGF0ZUZyb21VVEYoCisJCQkJY2hhcnNldF90cmFuc2xhdGUsCisJCQkJc3RyaW5nLAorCQkJCWxlbiwKKwkJCQkmc3JjX3Rha2VuLAorCQkJCWJ1ZiwKKwkJCQk2LAorCQkJCSZkc3RfbWFkZSApOworCisJCQlhZGRfdG9faW5wdXRfYnVmKCBidWYsIGRzdF9tYWRlICk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlhZGRfdG9faW5wdXRfYnVmKCBzdHJpbmcsIGxlbiApOworCQkgICAgfQorCisJCSAgICByZXR1cm4oIFB0X0NPTlNVTUUgKTsKKwkJfQorCQlsZW4gPSAwOworI2VuZGlmCisJCWNoID0ga2V5LT5rZXlfY2FwOworCQlpZiggY2ggPCAweGZmICkKKwkJeworCQkgICAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvPyAqLworCQkgICAgaWYoIG1vZGlmaWVycyAmIE1PRF9NQVNLX0NUUkwgKQorCQkgICAgeworCQkJbW9kaWZpZXJzICY9IH5NT0RfTUFTS19DVFJMOworCisJCQlpZiggKCBjaCA+PSAnYScgICYmICBjaCA8PSAneicgKSB8fAorCQkJCWNoID09ICdbJyB8fAorCQkJCWNoID09ICddJyB8fAorCQkJCWNoID09ICdcXCcgKQorCQkJICAgIGNoID0gQ3RybF9jaHIoIGNoICk7CisJCQllbHNlIGlmKCBjaCA9PSAnMicgKQorCQkJICAgIGNoID0gTlVMOworCQkJZWxzZSBpZiggY2ggPT0gJzYnICkKKwkJCSAgICBjaCA9IDB4MWU7CisJCQllbHNlIGlmKCBjaCA9PSAnLScgKQorCQkJICAgIGNoID0gMHgxZjsKKwkJCWVsc2UKKwkJCSAgICBtb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKKwkJICAgIH0KKworCQkgICAgaWYoIG1vZGlmaWVycyAmIE1PRF9NQVNLX0FMVCApCisJCSAgICB7CisJCQljaCA9IE1ldGEoIGNoICk7CisJCQltb2RpZmllcnMgJj0gfk1PRF9NQVNLX0FMVDsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHJldHVybiggUHRfQ09OVElOVUUgKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJbW9kaWZpZXJzICY9IH5NT0RfTUFTS19TSElGVDsKKwl9CisKKwljaCA9IHNpbXBsaWZ5X2tleSggY2gsICZtb2RpZmllcnMgKTsKKwlpZiggbW9kaWZpZXJzICkKKwl7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IENTSTsKKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gS1NfTU9ESUZJRVI7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IG1vZGlmaWVyczsKKwl9CisKKwlpZiggSVNfU1BFQ0lBTCggY2ggKSApCisJeworCSAgICBzdHJpbmdbIGxlbisrIF0gPSBDU0k7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IEtfU0VDT05EKCBjaCApOworCSAgICBzdHJpbmdbIGxlbisrIF0gPSBLX1RISVJEKCBjaCApOworCX0KKwllbHNlCisJeworCSAgICBzdHJpbmdbIGxlbisrIF0gPSBjaDsKKwl9CisKKwlpZiAobGVuID09IDEgJiYgKChjaCA9PSBDdHJsX0MgJiYgY3RybF9jX2ludGVycnVwdHMpCisJCQkJCQkJICB8fCBjaCA9PSBpbnRyX2NoYXIpKQorCXsKKwkgICAgdHJhc2hfaW5wdXRfYnVmKCk7CisJICAgIGdvdF9pbnQgPSBUUlVFOworCX0KKworCWlmIChsZW4gPT0gMSAmJiBzdHJpbmdbMF0gPT0gQ1NJKQorCXsKKwkgICAgLyogVHVybiBDU0kgaW50byBLX0NTSS4gKi8KKwkgICAgc3RyaW5nWyBsZW4rKyBdID0gS1NfRVhUUkE7CisJICAgIHN0cmluZ1sgbGVuKysgXSA9IEtFX0NTSTsKKwl9CisKKwlpZiggbGVuID4gMCApCisJeworCSAgICBhZGRfdG9faW5wdXRfYnVmKCBzdHJpbmcsIGxlbiApOworCSAgICByZXR1cm4oIFB0X0NPTlNVTUUgKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV9tb3VzZSggUHRXaWRnZXRfdCAqd2lkZ2V0LCB2b2lkICpkYXRhLCBQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBQaFBvaW50ZXJFdmVudF90ICpwb2ludGVyOworICAgIFBoUmVjdF90CSAgICAgKnBvczsKKyAgICBpbnQJCSAgICAgYnV0dG9uID0gMCwgcmVwZWF0ZWRfY2xpY2ssIG1vZGlmaWVycyA9IDB4MDsKKyAgICBzaG9ydAkgICAgIG1vdXNlX3gsIG1vdXNlX3k7CisKKyAgICBwb2ludGVyID0gUGhHZXREYXRhKCBpbmZvLT5ldmVudCApOworICAgIHBvcyA9IFBoR2V0UmVjdHMoIGluZm8tPmV2ZW50ICk7CisKKyAgICBndWlfbWNoX21vdXNlaGlkZSggTU9VU0VfU0hPVyApOworCisgICAgLyoKKyAgICAgKiBDb29yZGluYXRlcyBuZWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHdpbmRvdywKKyAgICAgKiBub3QgcmVsYXRpdmUgdG8gdGhlIHZpbVRleHRBcmVhIHdpZGdldAorICAgICAqLworICAgIG1vdXNlX3ggPSBwb3MtPnVsLnggKyBndWkuYm9yZGVyX3dpZHRoOworICAgIG1vdXNlX3kgPSBwb3MtPnVsLnkgKyBndWkuYm9yZGVyX3dpZHRoOworCisgICAgaWYoIGluZm8tPmV2ZW50LT50eXBlID09IFBoX0VWX1BUUl9NT1RJT05fTk9CVVRUT04gKQorICAgIHsKKwlndWlfbW91c2VfbW92ZWQoIG1vdXNlX3gsIG1vdXNlX3kgKTsKKwlyZXR1cm4oIFB0X0NPTlRJTlVFICk7CisgICAgfQorCisgICAgaWYoIHBvaW50ZXItPmtleV9tb2RzICYgUGtfS01fU2hpZnQgKQorCW1vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKyAgICBpZiggcG9pbnRlci0+a2V5X21vZHMgJiBQa19LTV9DdHJsICkKKwltb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiggcG9pbnRlci0+a2V5X21vZHMgJiBQa19LTV9BbHQgKQorCW1vZGlmaWVycyB8PSBNT1VTRV9BTFQ7CisKKyAgICAvKgorICAgICAqIEZJWE1FIE1vcmUgdGhhbiBvbmUgYnV0dG9uIG1heSBiZSBpbnZvbHZlZCwgYnV0IGZvcgorICAgICAqIG5vdyBqdXN0IGRlYWwgd2l0aCBvbmUKKyAgICAgKi8KKyAgICBpZiggcG9pbnRlci0+YnV0dG9ucyAmIFBoX0JVVFRPTl9TRUxFQ1QgKQorCWJ1dHRvbiA9IE1PVVNFX0xFRlQ7CisKKyAgICBpZiggcG9pbnRlci0+YnV0dG9ucyAmIFBoX0JVVFRPTl9NRU5VICkKKyAgICB7CisJYnV0dG9uID0gTU9VU0VfUklHSFQ7CisJLyogTmVlZCB0aGUgYWJzb2x1dGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBwb3B1cCBtZW51ICovCisJYWJzX21vdXNlLnggPSBwb2ludGVyLT5wb3MueDsKKwlhYnNfbW91c2UueSA9IHBvaW50ZXItPnBvcy55OworICAgIH0KKworICAgIGlmKCBwb2ludGVyLT5idXR0b25zICYgUGhfQlVUVE9OX0FESlVTVCApCisJYnV0dG9uID0gTU9VU0VfTUlERExFOworCisgICAgLyogQ2F0Y2ggYSByZWFsIHJlbGVhc2UgKG5vdCBwaGFudG9tIG9yIG90aGVyIHJlbGVhc2VzICovCisgICAgaWYoIGluZm8tPmV2ZW50LT50eXBlID09IFBoX0VWX0JVVF9SRUxFQVNFICkKKwlidXR0b24gPSBNT1VTRV9SRUxFQVNFOworCisgICAgaWYoIGluZm8tPmV2ZW50LT50eXBlICYgUGhfRVZfUFRSX01PVElPTl9CVVRUT04gKQorCWJ1dHRvbiA9IE1PVVNFX0RSQUc7CisKKyNpZiAwCisgICAgLyogVmltIGRvZXNuJ3QgdXNlIGJ1dHRvbiByZXBlYXRzICovCisgICAgaWYoIGluZm8tPmV2ZW50LT50eXBlICYgUGhfRVZfQlVUX1JFUEVBVCApCisJYnV0dG9uID0gTU9VU0VfRFJBRzsKKyNlbmRpZgorCisgICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgaXQgaXMgb25lIG9mIHRoZSBwaGFudG9tIG1vdXNlIHJlbGVhc2UgZXZlbnRzICovCisgICAgaWYoICggYnV0dG9uICE9IE1PVVNFX1JFTEVBU0UgKSB8fAorCSAgICAoIGluZm8tPmV2ZW50LT5zdWJ0eXBlID09IFBoX0VWX1JFTEVBU0VfUkVBTCApICkKKyAgICB7CisJcmVwZWF0ZWRfY2xpY2sgPSAocG9pbnRlci0+Y2xpY2tfY291bnQgPj0gMikgPyBUUlVFIDogRkFMU0U7CisKKwlndWlfc2VuZF9tb3VzZV9ldmVudCggYnV0dG9uICwgbW91c2VfeCwgbW91c2VfeSwgcmVwZWF0ZWRfY2xpY2ssIG1vZGlmaWVycyApOworICAgIH0KKworICAgIHJldHVybiggUHRfQ09OVElOVUUgKTsKK30KKworLyogSGFuZGxlIGEgZm9jdXMgY2hhbmdlIG9mIHRoZSBQdFJhdyB3aWRnZXQgKi8KKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX2ZvY3VzKCBQdFdpZGdldF90ICp3aWRnZXQsIHZvaWQgKmRhdGEsIFB0Q2FsbGJhY2tJbmZvX3QgKmluZm8gKQoreworICAgIGlmKCBpbmZvLT5yZWFzb24gPT0gUHRfQ0JfTE9TVF9GT0NVUyApCisgICAgeworCVB0UmVtb3ZlRXZlbnRIYW5kbGVyKCBndWkudmltVGV4dEFyZWEsIFBoX0VWX1BUUl9NT1RJT05fTk9CVVRUT04sCisJCWd1aV9waF9oYW5kbGVfbW91c2UsIE5VTEwgKTsKKworCWd1aV9tY2hfbW91c2VoaWRlKCBNT1VTRV9TSE9XICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUHRBZGRFdmVudEhhbmRsZXIoIGd1aS52aW1UZXh0QXJlYSwgUGhfRVZfUFRSX01PVElPTl9OT0JVVFRPTiwKKwkJZ3VpX3BoX2hhbmRsZV9tb3VzZSwgTlVMTCApOworICAgIH0KKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX2hhbmRsZV9yYXdfZHJhdyggUHRXaWRnZXRfdCAqd2lkZ2V0LCBQaFRpbGVfdCAqZGFtYWdlICkKK3sKKyAgICBQaFJlY3RfdAkqcjsKKyAgICBQaFBvaW50X3QJb2Zmc2V0OworICAgIFBoUG9pbnRfdAl0cmFuc2xhdGlvbjsKKworICAgIGlmKCBpc19pZ25vcmVfZHJhdyA9PSBUUlVFICkKKwlyZXR1cm47CisKKyAgICBQdFN1cGVyQ2xhc3NEcmF3KCBQdEJhc2ljLCB3aWRnZXQsIGRhbWFnZSApOworICAgIFBnR2V0VHJhbnNsYXRpb24oICZ0cmFuc2xhdGlvbiApOworICAgIFBnQ2xlYXJUcmFuc2xhdGlvbigpOworCisjaWYgMAorICAgIC8qCisgICAgICogVGhpcyBjYXVzZXMgc29tZSB3aWVyZCBwcm9iZW1zLCB3aXRoIGRyYXdpbmcgYmVpbmcgZG9uZSBmcm9tCisgICAgICogd2l0aGluIHRoaXMgcmF3IGRyYXdpbmcgZnVuY3Rpb24gKHJhdGhlciB0aGFuIGp1c3Qgc2ltcGxlIGNsZWFyaW5nCisgICAgICogYW5kIHRleHQgZHJhd2luZyBkb25lIGJ5IGd1aV9yZWRyYXcpCisgICAgICoKKyAgICAgKiBUaGUgbWFpbiBwcm9ibGVtIGlzIHdoZW4gUGhCbGl0IGlzIHVzZWQsIGFuZCB0aGUgY3Vyc29yIGFwcGVhcmluZworICAgICAqIGluIHBsYWNlcyB3aGVyZSBpdCBzaG91bGRuJ3QKKyAgICAgKi8KKyAgICBvdXRfZmx1c2goKTsKKyNlbmRpZgorCisgICAgUHRXaWRnZXRPZmZzZXQoIHdpZGdldCwgJm9mZnNldCApOworICAgIFBoVHJhbnNsYXRlUG9pbnQoICZvZmZzZXQsIFB0V2lkZ2V0UG9zKCBndWkudmltVGV4dEFyZWEsIE5VTEwgKSApOworCisjaWYgMQorICAgIC8qIFJlZHJhdyBpbmRpdmlkdWFsIGRhbWFnZSByZWdpb25zICovCisgICAgaWYoIGRhbWFnZS0+bmV4dCAhPSBOVUxMICkKKwlkYW1hZ2UgPSBkYW1hZ2UtPm5leHQ7CisKKyAgICB3aGlsZSggZGFtYWdlICE9IE5VTEwgKQorICAgIHsKKwlyID0gJmRhbWFnZS0+cmVjdDsKKwlndWlfcmVkcmF3KAorCQlyLT51bC54IC0gb2Zmc2V0LngsIHItPnVsLnkgLSBvZmZzZXQueSwKKwkJci0+bHIueCAtIHItPnVsLnggKyAxLAorCQlyLT5sci55IC0gci0+dWwueSArIDEgKTsKKwlkYW1hZ2UgPSBkYW1hZ2UtPm5leHQ7CisgICAgfQorI2Vsc2UKKyAgICAvKiBSZWRyYXcgdGhlIHJlY3RhbmdsZSB0aGF0IGNvdmVycyBhbGwgdGhlIGRhbWFnZWQgcmVnaW9ucyAqLworICAgIHIgPSAmZGFtYWdlLT5yZWN0OworICAgIGd1aV9yZWRyYXcoCisJICAgIHItPnVsLnggLSBvZmZzZXQueCwgci0+dWwueSAtIG9mZnNldC55LAorCSAgICByLT5sci54IC0gci0+dWwueCArIDEsCisJICAgIHItPmxyLnkgLSByLT51bC55ICsgMSApOworI2VuZGlmCisKKyAgICBQZ1NldFRyYW5zbGF0aW9uKCAmdHJhbnNsYXRpb24sIDAgKTsKK30KKworICAgIHN0YXRpYyBpbnQKK2d1aV9waF9oYW5kbGVfcHVsbGRvd25fbWVudSgKKwlQdFdpZGdldF90ICp3aWRnZXQsCisJdm9pZCAqZGF0YSwKKwlQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBpZiggZGF0YSAhPSBOVUxMICkKKyAgICB7CisJdmltbWVudV9UICptZW51ID0gKHZpbW1lbnVfVCAqKSBkYXRhOworCisJUHRQb3NpdGlvbk1lbnUoIG1lbnUtPnN1Ym1lbnVfaWQsIE5VTEwgKTsKKwlQdFJlYWxpemVXaWRnZXQoIG1lbnUtPnN1Ym1lbnVfaWQgKTsKKyAgICB9CisKKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgcHVsbGRvd24vcG9wdXAgbWVudXMgYW5kIGFsc28gdG9vbGJhciBidXR0b25zICovCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV9tZW51KCBQdFdpZGdldF90ICp3aWRnZXQsIHZvaWQgKmRhdGEsIFB0Q2FsbGJhY2tJbmZvX3QgKmluZm8gKQoreworICAgIGlmKCBkYXRhICE9IE5VTEwgKQorICAgIHsKKwl2aW1tZW51X1QgKm1lbnUgPSAodmltbWVudV9UICopIGRhdGE7CisJZ3VpX21lbnVfY2IoIG1lbnUgKTsKKyAgICB9CisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisvKiBTdG9wIGZvY3VzIGZyb20gZGlzYXBwZWFyaW5nIGludG8gdGhlIG1lbnViYXIuLi4gKi8KKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX21lbnVfdW5yZWFsaXplZCgKKwlQdFdpZGdldF90ICp3aWRnZXQsCisJdm9pZCAqZGF0YSwKKwlQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBQdEdpdmVGb2N1cyggZ3VpLnZpbVRleHRBcmVhLCBOVUxMICk7CisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV93aW5kb3dfb3BlbigKKwlQdFdpZGdldF90ICp3aWRnZXQsCisJdm9pZCAqZGF0YSwKKwlQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBndWlfc2V0X3NoZWxsc2l6ZSggRkFMU0UsIFRSVUUgKTsKKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERSQVdfU1RBUlQgIGd1aV9waF9kcmF3X3N0YXJ0KCkKKyNkZWZpbmUgRFJBV19FTkQgICAgZ3VpX3BoX2RyYXdfZW5kKCkKKworLyogVE9ETzogU2V0IGEgY2xpcHBpbmcgcmVjdD8gKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX2RyYXdfc3RhcnQoIHZvaWQgKQoreworICAgIFBnU2V0UmVnaW9uKCBQdFdpZGdldFJpZCggUHRGaW5kRGlzam9pbnQoIGd1aS52aW1UZXh0QXJlYSApICkgKTsKKworICAgIFB0V2lkZ2V0T2Zmc2V0KCBndWkudmltVGV4dEFyZWEsICZndWlfcGhfcmF3X29mZnNldCApOworICAgIFBoVHJhbnNsYXRlUG9pbnQoICZndWlfcGhfcmF3X29mZnNldCwgUHRXaWRnZXRQb3MoIGd1aS52aW1UZXh0QXJlYSwgTlVMTCApICk7CisKKyAgICBQZ1NldFRyYW5zbGF0aW9uKCAmZ3VpX3BoX3Jhd19vZmZzZXQsIFBnX1JFTEFUSVZFICk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX2RyYXdfZW5kKCB2b2lkICkKK3sKKyAgICBndWlfcGhfcmF3X29mZnNldC54ID0gLWd1aV9waF9yYXdfb2Zmc2V0Lng7CisgICAgZ3VpX3BoX3Jhd19vZmZzZXQueSA9IC1ndWlfcGhfcmF3X29mZnNldC55OworICAgIFBnU2V0VHJhbnNsYXRpb24oICZndWlfcGhfcmF3X29mZnNldCwgUGdfUkVMQVRJVkUgKTsKK30KKworI2lmZGVmIFVTRV9QQU5FTF9HUk9VUAorICAgIHN0YXRpYyB2aW1tZW51X1QgKgorZ3VpX3BoX2ZpbmRfYnVmZmVyX2l0ZW0oIGNoYXJfdSAqbmFtZSApCit7CisgICAgdmltbWVudV9UICp0b3BfbGV2ZWwgPSByb290X21lbnU7CisgICAgdmltbWVudV9UICppdGVtcyA9IE5VTEw7CisKKyAgICB3aGlsZSggdG9wX2xldmVsICE9IE5VTEwgJiYKKwkgICAgKCBTVFJDTVAoIHRvcF9sZXZlbC0+ZG5hbWUsICJCdWZmZXJzIiApICE9IDAgKSApCisJdG9wX2xldmVsID0gdG9wX2xldmVsLT5uZXh0OworCisgICAgaWYoIHRvcF9sZXZlbCAhPSBOVUxMICkKKyAgICB7CisJaXRlbXMgPSB0b3BfbGV2ZWwtPmNoaWxkcmVuOworCisJd2hpbGUoIGl0ZW1zICE9IE5VTEwgJiYKKwkJKCBTVFJDTVAoIGl0ZW1zLT5kbmFtZSwgbmFtZSApICE9IDAgKSApCisJICAgIGl0ZW1zID0gaXRlbXMtPm5leHQ7CisgICAgfQorICAgIHJldHVybiggaXRlbXMgKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfcGhfcGdfc2V0X2J1ZmZlcl9udW0oIGludF91IGJ1Zl9udW0gKQoreworICAgIGludCBpOworICAgIGNoYXIgc2VhcmNoWzE2XTsKKyAgICBjaGFyICptYXJrOworCisgICAgaWYoIGd1aS52aW1UZXh0QXJlYSA9PSBOVUxMIHx8IGJ1Zl9udW0gPT0gMCApCisJcmV0dXJuOworCisgICAgc2VhcmNoWzBdID0gJygnOworICAgIHVsdG9hKCBidWZfbnVtLCAmc2VhcmNoWzFdLCAxMCApOworICAgIFNUUkNBVCggc2VhcmNoLCAiKSIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBudW1fcGFuZWxzOyBpKysgKQorICAgIHsKKwkvKiBmaW5kIHRoZSBsYXN0ICIoIiBpbiB0aGUgcGFuZWwgdGl0bGUgYW5kIHNlZSBpZiB0aGUgYnVmZmVyCisJICogbnVtYmVyIGluIHRoZSB0aXRsZSBtYXRjaGVzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IgKi8KKwltYXJrID0gU1RSUkNIUiggcGFuZWxfdGl0bGVzWyBpIF0sICcoJyApOworCWlmKCBtYXJrICE9IE5VTEwgJiYgU1RSQ01QKCBtYXJrLCBzZWFyY2ggKSA9PSAwICkKKwl7CisJICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1QYW5lbEdyb3VwLCBQdF9BUkdfUEdfQ1VSUkVOVF9JTkRFWCwKKwkJICAgIGksIDAgKTsKKwl9CisgICAgfQorfQorCisgICAgc3RhdGljIGludAorZ3VpX3BoX2hhbmRsZV9wZ19jaGFuZ2UoCisJUHRXaWRnZXRfdCAqd2lkZ2V0LAorCXZvaWQgKmRhdGEsCisJUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgdmltbWVudV9UICptZW51OworICAgIFB0UGFuZWxHcm91cENhbGxiYWNrX3QgKnBhbmVsOworCisgICAgaWYoIGluZm8tPmV2ZW50ICE9IE5VTEwgKQorICAgIHsKKwlwYW5lbCA9IGluZm8tPmNiZGF0YTsKKwlpZiggcGFuZWwtPm5ld19wYW5lbCAhPSBOVUxMICkKKwl7CisJICAgIG1lbnUgPSBndWlfcGhfZmluZF9idWZmZXJfaXRlbSggcGFuZWwtPm5ld19wYW5lbCApOworCSAgICBpZiggbWVudSApCisJCWd1aV9tZW51X2NiKCBtZW51ICk7CisJfQorICAgIH0KKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX2dldF9wYW5lbGdyb3VwX21hcmdpbnMoCisJc2hvcnQgKnRvcCwKKwlzaG9ydCAqYm90dG9tLAorCXNob3J0ICpsZWZ0LAorCXNob3J0ICpyaWdodCApCit7CisgICAgdW5zaWduZWQgc2hvcnQgYWJzX3Jhd194LCBhYnNfcmF3X3ksIGFic19wYW5lbF94LCBhYnNfcGFuZWxfeTsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqbWFyZ2luX3RvcCwgKm1hcmdpbl9ib3R0b207CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKm1hcmdpbl9sZWZ0LCAqbWFyZ2luX3JpZ2h0OworCisgICAgUHRHZXRBYnNQb3NpdGlvbiggZ3VpLnZpbVRleHRBcmVhLCAmYWJzX3Jhd194LCAmYWJzX3Jhd195ICk7CisgICAgUHRHZXRBYnNQb3NpdGlvbiggZ3VpLnZpbVBhbmVsR3JvdXAsICZhYnNfcGFuZWxfeCwgJmFic19wYW5lbF95ICk7CisKKyAgICBQdEdldFJlc291cmNlKCBndWkudmltUGFuZWxHcm91cCwgUHRfQVJHX01BUkdJTl9SSUdIVCwgJm1hcmdpbl9yaWdodCwgMCApOworICAgIFB0R2V0UmVzb3VyY2UoIGd1aS52aW1QYW5lbEdyb3VwLCBQdF9BUkdfTUFSR0lOX0JPVFRPTSwgJm1hcmdpbl9ib3R0b20sIDAgKTsKKworICAgIGFic19yYXdfeCAtPSBhYnNfcGFuZWxfeDsKKyAgICBhYnNfcmF3X3kgLT0gYWJzX3BhbmVsX3k7CisKKyAgICAqdG9wICAgID0gYWJzX3Jhd195OworICAgICpib3R0b20gPSAqbWFyZ2luX2JvdHRvbTsKKworICAgICpsZWZ0ICA9IGFic19yYXdfeDsKKyAgICAqcmlnaHQgPSAqbWFyZ2luX3JpZ2h0OworfQorCisvKiBVc2VkIGZvciB0aGUgdGFicyBmb3IgUHRQYW5lbEdyb3VwICovCisgICAgc3RhdGljIGludAorZ3VpX3BoX2lzX2J1ZmZlcl9pdGVtKCB2aW1tZW51X1QgKm1lbnUsIHZpbW1lbnVfVCAqcGFyZW50ICkKK3sKKyAgICBjaGFyICptYXJrOworCisgICAgaWYoIFNUUkNNUCggcGFyZW50LT5kbmFtZSwgIkJ1ZmZlcnMiICkgPT0gMCApCisgICAgeworCS8qIExvb2sgZm9yICcoJyBkaWdpdHMgJyknICovCisJbWFyayA9IHZpbV9zdHJjaHIoIG1lbnUtPmRuYW1lLCAnKCcgKTsKKwlpZiggbWFyayAhPSBOVUxMICkKKwl7CisJICAgIG1hcmsrKzsKKwkgICAgd2hpbGUoIGlzZGlnaXQoICptYXJrICkgKQorCQltYXJrKys7CisKKwkgICAgaWYoICptYXJrID09ICcpJyApCisJCXJldHVybiggVFJVRSk7CisJfQorICAgIH0KKyAgICByZXR1cm4oIEZBTFNFICk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX3BnX2FkZF9idWZmZXIoY2hhciAqbmFtZSApCit7CisgICAgY2hhciAqKm5ld190aXRsZXMgPSBOVUxMOworCisgICAgbmV3X3RpdGxlcyA9IChjaGFyICoqKSBhbGxvYyggKCBudW1fcGFuZWxzICsgMSApICogc2l6ZW9mKCBjaGFyICoqICkgKTsKKyAgICBpZiggbmV3X3RpdGxlcyAhPSBOVUxMICkKKyAgICB7CisJaWYoIG51bV9wYW5lbHMgPiAwICkKKwkgICAgbWVtY3B5KCBuZXdfdGl0bGVzLCBwYW5lbF90aXRsZXMsIG51bV9wYW5lbHMgKiBzaXplb2YoIGNoYXIgKiogKSApOworCisJbmV3X3RpdGxlc1sgbnVtX3BhbmVscysrIF0gPSBuYW1lOworCisJUHRTZXRSZXNvdXJjZSggZ3VpLnZpbVBhbmVsR3JvdXAsIFB0X0FSR19QR19QQU5FTF9USVRMRVMsIG5ld190aXRsZXMsCisJCW51bV9wYW5lbHMgKTsKKworCXZpbV9mcmVlKCBwYW5lbF90aXRsZXMgKTsKKwlwYW5lbF90aXRsZXMgPSBuZXdfdGl0bGVzOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfcGhfcGdfcmVtb3ZlX2J1ZmZlciggY2hhciAqbmFtZSApCit7CisgICAgaW50IGk7CisgICAgY2hhciAqKm5ld190aXRsZXMgPSBOVUxMOworCisgICAgLyogSWYgdGhlcmUgaXMgb25seSAxIHBhbmVsLCB3ZSBqdXN0IHVzZSB0aGUgdGVtcG9yYXJ5IHBsYWNlIGhvbGRlciAqLworICAgIGlmKCBudW1fcGFuZWxzID4gMSApCisgICAgeworCW5ld190aXRsZXMgPSAoY2hhciAqKikgYWxsb2MoICggbnVtX3BhbmVscyAtIDEgKSAqIHNpemVvZiggY2hhciAqKiApICk7CisJaWYoIG5ld190aXRsZXMgIT0gTlVMTCApCisJeworCSAgICBjaGFyICoqcyA9IG5ld190aXRsZXM7CisJICAgIC8qIENvcHkgYWxsIHRoZSB0aXRsZXMgZXhjZXB0IHRoZSBvbmUgd2UncmUgcmVtb3ZpbmcgKi8KKwkgICAgZm9yKCBpID0gMDsgaSA8IG51bV9wYW5lbHM7IGkrKyApCisJICAgIHsKKwkJaWYoIFNUUkNNUCggcGFuZWxfdGl0bGVzWyBpIF0sIG5hbWUgKSAhPSAwICkKKwkJeworCQkgICAgKnMrKyA9IHBhbmVsX3RpdGxlc1sgaSBdOworCQl9CisJICAgIH0KKwkgICAgbnVtX3BhbmVscy0tOworCisJICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1QYW5lbEdyb3VwLCBQdF9BUkdfUEdfUEFORUxfVElUTEVTLCBuZXdfdGl0bGVzLAorCQkgICAgbnVtX3BhbmVscyApOworCisJICAgIHZpbV9mcmVlKCBwYW5lbF90aXRsZXMgKTsKKwkgICAgcGFuZWxfdGl0bGVzID0gbmV3X3RpdGxlczsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbnVtX3BhbmVscy0tOworCVB0U2V0UmVzb3VyY2UoIGd1aS52aW1QYW5lbEdyb3VwLCBQdF9BUkdfUEdfUEFORUxfVElUTEVTLCAmZW1wdHlfdGl0bGUsCisJCTEgKTsKKworCXZpbV9mcmVlKCBwYW5lbF90aXRsZXMgKTsKKwlwYW5lbF90aXRsZXMgPSBOVUxMOworICAgIH0KK30KKworLyogV2hlbiBhIGJ1ZmZlciBpdGVtIGlzIGRlbGV0ZWQgZnJvbSB0aGUgYnVmZmVyIG1lbnUgKi8KKyAgICBzdGF0aWMgaW50CitndWlfcGhfaGFuZGxlX2J1ZmZlcl9yZW1vdmUoCisJUHRXaWRnZXRfdCAqd2lkZ2V0LAorCXZvaWQgKmRhdGEsCisJUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgdmltbWVudV9UICptZW51OworCisgICAgaWYoIGRhdGEgIT0gTlVMTCApCisgICAgeworCW1lbnUgPSAodmltbWVudV9UICopIGRhdGE7CisJZ3VpX3BoX3BnX3JlbW92ZV9idWZmZXIoIG1lbnUtPmRuYW1lICk7CisgICAgfQorCisgICAgcmV0dXJuKCBQdF9DT05USU5VRSApOworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfcGFuZV9yZXNpemUoIFB0V2lkZ2V0X3QgKndpZGdldCwgdm9pZCAqZGF0YSwgUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgaWYoIFB0V2lkZ2V0SXNSZWFsaXplZCggd2lkZ2V0ICkgKQorICAgIHsKKwlpc19pZ25vcmVfZHJhdyA9IFRSVUU7CisJUHRTdGFydEZsdXgoIGd1aS52aW1Db250YWluZXIgKTsKKwlQdENvbnRhaW5lckhvbGQoIGd1aS52aW1Db250YWluZXIgKTsKKyAgICB9CisKKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRkVBVF9NQllURQorICAgIHZvaWQKK2d1aV9waF9lbmNvZGluZ19jaGFuZ2VkKCBpbnQgbmV3X2VuY29kaW5nICkKK3sKKyAgICAvKiBEZWZhdWx0IGVuY29kaW5nIGlzIGxhdGluMSAqLworICAgIGNoYXIgKmNoYXJzZXQgPSAibGF0aW4xIjsKKyAgICBpbnQgaTsKKworICAgIHN0cnVjdCB7CisJaW50IGVuY29kaW5nOworCWNoYXIgKm5hbWU7CisgICAgfSBjaGFyc2V0c1tdID0geworCXsgREJDU19KUE4sICJTSElGVF9KSVMiIH0sCisJeyBEQkNTX0tPUiwgImNzRVVDS1IiIH0sCisJeyBEQkNTX0NIVCwgImJpZzUiIH0sCisJeyBEQkNTX0NIUywgImdiIiB9CisgICAgfTsKKworICAgIGZvciggaSA9IDA7IGkgPCBBUlJBWV9MRU5HVEgoIGNoYXJzZXRzICk7IGkrKyApCisgICAgeworCWlmKCBuZXdfZW5jb2RpbmcgPT0gY2hhcnNldHNbIGkgXS5lbmNvZGluZyApCisJICAgIGNoYXJzZXQgPSBjaGFyc2V0c1sgaSBdLm5hbWU7CisgICAgfQorCisgICAgY2hhcnNldF90cmFuc2xhdGUgPSBQeFRyYW5zbGF0ZVNldCggY2hhcnNldF90cmFuc2xhdGUsIGNoYXJzZXQgKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgdm9pZAorZ3VpX21jaF9wcmVwYXJlKGFyZ2MsIGFyZ3YpCisgICAgaW50CSAgICAqYXJnYzsKKyAgICBjaGFyICAgICoqYXJndjsKK3sKKyAgICBQdEluaXQoIE5VTEwgKTsKK30KKworICAgIGludAorZ3VpX21jaF9pbml0KHZvaWQpCit7CisgICAgUHRBcmdfdCBhcmdzWzEwXTsKKyAgICBpbnQJICAgIGZsYWdzID0gMCwgbiA9IDA7CisKKyAgICBQaERpbV90CXdpbmRvd19zaXplID0gezEwMCwgMTAwfTsgLyogQWJpdHJhcnkgdmFsdWVzICovCisgICAgUGhQb2ludF90CXBvcyA9IHswLCAwfTsKKworICAgIGd1aS5ldmVudF9idWZmZXIgPSAoUGhFdmVudF90ICopIGFsbG9jKCBFVkVOVF9CVUZGRVJfU0laRSApOworICAgIGlmKCBndWkuZXZlbnRfYnVmZmVyID09IE5VTEwgKQorCXJldHVybiggRkFJTCApOworCisgICAgLyogR2V0IGEgdHJhbnNsYXRpb24gc28gd2UgY2FuIGNvbnZlcnQgZnJvbSBJU08gTGF0aW4tMSB0byBVVEYgKi8KKyAgICBjaGFyc2V0X3RyYW5zbGF0ZSA9IFB4VHJhbnNsYXRlU2V0KCBOVUxMLCAibGF0aW4xIiApOworCisgICAgLyogVGhlICsyIGlzIGZvciB0aGUgMSBwaXhlbCBkYXJrIGxpbmUgb24gZWFjaCBzaWRlICovCisgICAgZ3VpLmJvcmRlcl9vZmZzZXQgPSBndWkuYm9yZGVyX3dpZHRoID0gR1VJX1BIX01BUkdJTiArIDI7CisKKyAgICAvKiBIYW5kbGUgY2xvc2UgZXZlbnRzIG91cnNlbHZlcyAqLworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19XSU5ET1dfTUFOQUdFRF9GTEFHUywgUHRfRkFMU0UsIFBoX1dNX0NMT1NFICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1dJTkRPV19OT1RJRllfRkxBR1MsIFB0X1RSVUUsCisJICAgIFBoX1dNX0NMT1NFIHwgUGhfV01fUkVTSVpFIHwgUGhfV01fRk9DVVMgKTsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfRElNLCAmd2luZG93X3NpemUsIDAgKTsKKyAgICBndWkudmltV2luZG93ID0gUHRDcmVhdGVXaWRnZXQoIFB0V2luZG93LCBOVUxMLCBuLCBhcmdzICk7CisgICAgaWYoIGd1aS52aW1XaW5kb3cgPT0gTlVMTCApCisJcmV0dXJuKCBGQUlMICk7CisKKyAgICBQdEFkZENhbGxiYWNrKCBndWkudmltV2luZG93LCBQdF9DQl9XSU5ET1csIGd1aV9waF9oYW5kbGVfd2luZG93X2NiLCBOVUxMICk7CisgICAgUHRBZGRDYWxsYmFjayggZ3VpLnZpbVdpbmRvdywgUHRfQ0JfV0lORE9XX09QRU5JTkcsCisJICAgIGd1aV9waF9oYW5kbGVfd2luZG93X29wZW4sIE5VTEwgKTsKKworICAgIG4gPSAwOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19BTkNIT1JfRkxBR1MsIFB0X0FOQ0hPUl9BTEwsIFB0X0lTX0FOQ0hPUkVEICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0RJTSwgJndpbmRvd19zaXplLCAwICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1BPUywgJnBvcywgMCApOworCisjaWZkZWYgVVNFX1BBTkVMX0dST1VQCisgICAgLyogUHV0IGluIGEgdGVtcHJhcnkgcGxhY2UgaG9sZGVyIHRpdGxlICovCisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1BHX1BBTkVMX1RJVExFUywgJmVtcHR5X3RpdGxlLCAxICk7CisKKyAgICBndWkudmltUGFuZWxHcm91cCA9IFB0Q3JlYXRlV2lkZ2V0KCBQdFBhbmVsR3JvdXAsIGd1aS52aW1XaW5kb3csIG4sIGFyZ3MgKTsKKyAgICBpZiggZ3VpLnZpbVBhbmVsR3JvdXAgPT0gTlVMTCApCisJcmV0dXJuKCBGQUlMICk7CisKKyAgICBQdEFkZENhbGxiYWNrKCBndWkudmltUGFuZWxHcm91cCwgUHRfQ0JfUEdfUEFORUxfU1dJVENISU5HLAorCSAgICBndWlfcGhfaGFuZGxlX3BnX2NoYW5nZSwgTlVMTCApOworI2Vsc2UKKyAgICAvKiBUdXJuIG9mZiBhbGwgZWRnZSBkZWNvcmF0aW9ucyAqLworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19CQVNJQ19GTEFHUywgUHRfRkFMU0UsIFB0X0FMTCApOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19CRVZFTF9XSURUSCwgMCwgMCApOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19NQVJHSU5fV0lEVEgsIDAsIDAgKTsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTUFSR0lOX0hFSUdIVCwgMCwgMCApOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19DT05UQUlORVJfRkxBR1MsIFB0X1RSVUUsIFB0X0FVVE9fRVhURU5UICk7CisKKyAgICBndWkudmltQ29udGFpbmVyID0gUHRDcmVhdGVXaWRnZXQoIFB0UGFuZSwgZ3VpLnZpbVdpbmRvdywgbiwgYXJncyApOworICAgIGlmKCBndWkudmltQ29udGFpbmVyID09IE5VTEwgKQorCXJldHVybiggRkFJTCApOworCisgICAgUHRBZGRDYWxsYmFjayggZ3VpLnZpbUNvbnRhaW5lciwgUHRfQ0JfUkVTSVpFLCBndWlfcGhfcGFuZV9yZXNpemUsIE5VTEwgKTsKKyNlbmRpZgorCisgICAgLyogU2l6ZSBmb3IgdGhlIHRleHQgYXJlYSBpcyBzZXQgaW4gZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyAqLworICAgIG4gPSAwOworCisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1JBV19EUkFXX0YsIGd1aV9waF9oYW5kbGVfcmF3X2RyYXcsIDEgKTsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfQkVWRUxfV0lEVEgsIEdVSV9QSF9NQVJHSU4sIDAgKTsKKyAgICAvKgorICAgICAqIFVzaW5nIGZvY3VzIHJlbmRlciBhbHNvIGNhdXNlcyB0aGUgd2hvbGUgd2lkZ2V0IHRvIGJlIHJlZHJhd24KKyAgICAgKiB3aGVuZXZlciBpdCBjaGFuZ2VzIGZvY3VzLCB3aGljaCBpcyB2ZXJ5IGFubm95aW5nIDpwCisgICAgICovCisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0ZMQUdTLCBQdF9UUlVFLAorCSAgICBQdF9HRVRTX0ZPQ1VTIHwgUHRfSElHSExJR0hURUQgKTsKKyNpZm5kZWYgRkVBVF9NT1VTRVNIQVBFCisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0NVUlNPUl9UWVBFLCBHVUlfUEhfTU9VU0VfVFlQRSwgMCApOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19DVVJTT1JfQ09MT1IsIGd1aV9waF9tb3VzZV9jb2xvciwgMCApOworI2VuZGlmCisKKyAgICBndWkudmltVGV4dEFyZWEgPSBQdENyZWF0ZVdpZGdldCggUHRSYXcsIFB0X0RGTFRfUEFSRU5ULCBuLCBhcmdzICk7CisgICAgaWYoIGd1aS52aW1UZXh0QXJlYSA9PSBOVUxMKQorCXJldHVybiggRkFJTCApOworCisgICAgLyogVE9ETzogdXNlIFB0QWRkRXZlbnRIYW5kbGVycyBpbnN0ZWFkPyAqLworICAgIC8qIE5vdCB1c2luZyBQaF9FVl9CVVRfUkVQRUFUIGJlY2F1c2UgdmltIHdvdWxkbid0IHVzZSBpdCBhbnl3YXkgKi8KKyAgICBQdEFkZEV2ZW50SGFuZGxlciggZ3VpLnZpbVRleHRBcmVhLAorCSAgICBQaF9FVl9CVVRfUFJFU1MgfCBQaF9FVl9CVVRfUkVMRUFTRSB8IFBoX0VWX1BUUl9NT1RJT05fQlVUVE9OLAorCSAgICBndWlfcGhfaGFuZGxlX21vdXNlLCBOVUxMICk7CisgICAgUHRBZGRFdmVudEhhbmRsZXIoIGd1aS52aW1UZXh0QXJlYSwgUGhfRVZfS0VZLAorCSAgICBndWlfcGhfaGFuZGxlX2tleWJvYXJkLCBOVUxMICk7CisgICAgUHRBZGRDYWxsYmFjayggZ3VpLnZpbVRleHRBcmVhLCBQdF9DQl9HT1RfRk9DVVMsCisJICAgIGd1aV9waF9oYW5kbGVfZm9jdXMsIE5VTEwgKTsKKyAgICBQdEFkZENhbGxiYWNrKCBndWkudmltVGV4dEFyZWEsIFB0X0NCX0xPU1RfRk9DVVMsCisJICAgIGd1aV9waF9oYW5kbGVfZm9jdXMsIE5VTEwgKTsKKworICAgIC8qCisgICAgICogTm93IHRoYXQgdGhlIHRleHQgYXJlYSB3aWRnZXQgaGFzIGJlZW4gY3JlYXRlZCwgc2V0IHVwIHRoZSBjb2xvdXJzLAorICAgICAqIHdoaWNoIHdpbCBjYWxsIFB0U2V0UmVzb3VyY2UgZnJvbSBndWlfbWNoX25ld19jb2xvcnMKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSB0d28gdGltZXJzLCBub3QgYXMgYWNjdXJhdGUgYXMgdXNpbmcgdGhlIGtlcm5lbCB0aW1lcgorICAgICAqIGZ1bmN0aW9ucywgYnV0IGdvb2QgZW5vdWdoCisgICAgICovCisgICAgZ3VpX3BoX3RpbWVyX2N1cnNvciAgPSBQdENyZWF0ZVdpZGdldCggUHRUaW1lciwgZ3VpLnZpbVdpbmRvdywgMCwgTlVMTCApOworICAgIGlmKCBndWlfcGhfdGltZXJfY3Vyc29yID09IE5VTEwgKQorCXJldHVybiggRkFJTCApOworCisgICAgZ3VpX3BoX3RpbWVyX3RpbWVvdXQgPSBQdENyZWF0ZVdpZGdldCggUHRUaW1lciwgZ3VpLnZpbVdpbmRvdywgMCwgTlVMTCApOworICAgIGlmKCBndWlfcGhfdGltZXJfdGltZW91dCA9PSBOVUxMICkKKwlyZXR1cm4oIEZBSUwgKTsKKworICAgIFB0QWRkQ2FsbGJhY2soIGd1aV9waF90aW1lcl9jdXJzb3IsICBQdF9DQl9USU1FUl9BQ1RJVkFURSwKKwkgICAgZ3VpX3BoX2hhbmRsZV90aW1lcl9jdXJzb3IsIE5VTEwpOworICAgIFB0QWRkQ2FsbGJhY2soIGd1aV9waF90aW1lcl90aW1lb3V0LCBQdF9DQl9USU1FUl9BQ1RJVkFURSwKKwkgICAgZ3VpX3BoX2hhbmRsZV90aW1lcl90aW1lb3V0LCBOVUxMKTsKKworI2lmZGVmIEZFQVRfTUVOVQorICAgIG4gPSAwOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19XSURUSCwgd2luZG93X3NpemUudywgMCApOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19BTkNIT1JfRkxBR1MsIFB0X0FOQ0hPUl9MRUZUX1JJR0hULAorCSAgICBQdF9JU19BTkNIT1JFRCApOworICAgIGd1aS52aW1Ub29sQmFyR3JvdXAgPSBQdENyZWF0ZVdpZGdldCggUHRUb29sYmFyR3JvdXAsIGd1aS52aW1XaW5kb3csCisJICAgIG4sIGFyZ3MgKTsKKyAgICBpZiggZ3VpLnZpbVRvb2xCYXJHcm91cCA9PSBOVUxMICkKKwlyZXR1cm4oIEZBSUwgKTsKKworICAgIFB0QWRkQ2FsbGJhY2soIGd1aS52aW1Ub29sQmFyR3JvdXAsIFB0X0NCX1JFU0laRSwKKwkgICAgZ3VpX3BoX2hhbmRsZV9tZW51X3Jlc2l6ZSwgTlVMTCApOworCisgICAgbiA9IDA7CisgICAgZmxhZ3MgPSAwOworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19XSURUSCwgd2luZG93X3NpemUudywgMCApOworICAgIGlmKCAhIHZpbV9zdHJjaHIoIHBfZ28sIEdPX01FTlVTICkgKQorICAgIHsKKwlmbGFncyB8PSBQdF9ERUxBWV9SRUFMSVpFOworCVB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19GTEFHUywgUHRfVFJVRSwgZmxhZ3MgKTsKKyAgICB9CisgICAgZ3VpLnZpbU1lbnVCYXIgPSBQdENyZWF0ZVdpZGdldCggUHRNZW51QmFyLCBndWkudmltVG9vbEJhckdyb3VwLCBuLCBhcmdzICk7CisgICAgaWYoIGd1aS52aW1NZW51QmFyID09IE5VTEwgKQorCXJldHVybiggRkFJTCApOworCisjIGlmZGVmIEZFQVRfVE9PTEJBUgorICAgIG4gPSAwOworCisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0FOQ0hPUl9GTEFHUywKKwkgICAgUHRfQU5DSE9SX0xFRlRfUklHSFQgfFB0X1RPUF9BTkNIT1JFRF9UT1AsIFB0X0lTX0FOQ0hPUkVEICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1JFU0laRV9GTEFHUywgUHRfVFJVRSwKKwkgICAgUHRfUkVTSVpFX1lfQVNfUkVRVUlSRUQgKTsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfV0lEVEgsIHdpbmRvd19zaXplLncsIDAgKTsKKworICAgIGZsYWdzID0gUHRfR0VUU19GT0NVUzsKKyAgICBpZiggISB2aW1fc3RyY2hyKCBwX2dvLCBHT19UT09MQkFSICkgKQorCWZsYWdzIHw9IFB0X0RFTEFZX1JFQUxJWkU7CisKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfRkxBR1MsIFB0X0RFTEFZX1JFQUxJWkUsIGZsYWdzICk7CisKKyAgICBndWkudmltVG9vbEJhciA9IFB0Q3JlYXRlV2lkZ2V0KCBQdFRvb2xiYXIsIGd1aS52aW1Ub29sQmFyR3JvdXAsIG4sIGFyZ3MgKTsKKyAgICBpZiggZ3VpLnZpbVRvb2xCYXIgPT0gTlVMTCApCisJcmV0dXJuKCBGQUlMICk7CisKKyAgICAvKgorICAgICAqIFNpemUgZm9yIHRoZSB0b29sYmFyIGlzIGZldGNoZWQgaW4gZ3VpX21jaF9zaG93X3Rvb2xiYXIsIGFmdGVyCisgICAgICogdGhlIGJ1dHRvbnMgaGF2ZSBiZWVuIGFkZGVkIGFuZCB0aGUgdG9vbGJhciBoYXMgcmVzaXplZCBpdCdzIGhlaWdodAorICAgICAqIGZvciB0aGUgYnV0dG9ucyB0byBmaXQKKyAgICAgKi8KKyMgZW5kaWYKKworI2VuZGlmCisKKyAgICByZXR1cm4oIE9LICk7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfaW5pdF9jaGVjayh2b2lkKQoreworICAgIHJldHVybiggKGlzX3Bob3Rvbl9hdmFpbGFibGUgPT0gVFJVRSkgPyBPSyA6IEZBSUwgKTsKK30KKworICAgIGludAorZ3VpX21jaF9vcGVuKHZvaWQpCit7CisgICAgZ3VpLm5vcm1fcGl4ZWwgPSAgUGdfQkxBQ0s7CisgICAgZ3VpLmJhY2tfcGl4ZWwgPSAgUGdfV0hJVEU7CisKKyAgICBzZXRfbm9ybWFsX2NvbG9ycygpOworCisgICAgZ3VpX2NoZWNrX2NvbG9ycygpOworICAgIGd1aS5kZWZfbm9ybV9waXhlbCA9IGd1aS5ub3JtX3BpeGVsOworICAgIGd1aS5kZWZfYmFja19waXhlbCA9IGd1aS5iYWNrX3BpeGVsOworCisgICAgaGlnaGxpZ2h0X2d1aV9zdGFydGVkKCk7CisKKyAgICBpZiAoZ3VpX3dpbl94ICE9IC0xICYmIGd1aV93aW5feSAhPSAtMSkKKwlndWlfbWNoX3NldF93aW5wb3MoZ3VpX3dpbl94LCBndWlfd2luX3kpOworCisgICAgcmV0dXJuKCAoUHRSZWFsaXplV2lkZ2V0KCBndWkudmltV2luZG93ICkgPT0gMCkgPyBPSyA6IEZBSUwgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZXhpdChpbnQgcmMpCit7CisgICAgUHREZXN0cm95V2lkZ2V0KCBndWkudmltV2luZG93ICk7CisKKyAgICBQeFRyYW5zbGF0ZVNldCggY2hhcnNldF90cmFuc2xhdGUsIE5VTEwgKTsKKworICAgIHZpbV9mcmVlKCBndWkuZXZlbnRfYnVmZmVyICk7CisKKyNpZmRlZiBVU0VfUEFORUxfR1JPVVBTCisgICAgdmltX2ZyZWUoIHBhbmVsX3RpdGxlcyApOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXZlbnRzICovCisKKy8qIFdoZW4gbm8gZXZlbnRzIGFyZSBhdmFpbGFibGUsIHBob3RvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiwgd29ya2luZyBpcworICogc2V0IHRvIEZBTFNFLCBhbmQgdGhlIGd1aV9tY2hfdXBkYXRlIGxvb3Agd2lsbCBleGl0LiAqLworICAgIHN0YXRpYyBpbnQKK2V4aXRfZ3VpX21jaF91cGRhdGUoIHZvaWQgKmRhdGEgKQoreworICAgICooaW50ICopZGF0YSA9IEZBTFNFOworICAgIHJldHVybiggUHRfRU5EICk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3VwZGF0ZSh2b2lkKQoreworICAgIGludCB3b3JraW5nID0gVFJVRTsKKworICAgIFB0QXBwQWRkV29ya1Byb2MoIE5VTEwsIGV4aXRfZ3VpX21jaF91cGRhdGUsICZ3b3JraW5nICk7CisgICAgd2hpbGUoICggd29ya2luZyA9PSBUUlVFICkgJiYgIXZpbV9pc19pbnB1dF9idWZfZnVsbCgpKQorICAgIHsKKwlQdFByb2Nlc3NFdmVudCgpOworICAgIH0KK30KKworICAgIGludAorZ3VpX21jaF93YWl0X2Zvcl9jaGFycyhpbnQgd3RpbWUpCit7CisgICAgaXNfdGltZW91dCA9IEZBTFNFOworCisgICAgaWYoIHd0aW1lID4gMCApCisJUHRTZXRSZXNvdXJjZSggZ3VpX3BoX3RpbWVyX3RpbWVvdXQsIFB0X0FSR19USU1FUl9JTklUSUFMLCB3dGltZSwgMCApOworCisgICAgd2hpbGUoIDEgKQorICAgIHsKKwlQdFByb2Nlc3NFdmVudCgpOworCWlmKCBpbnB1dF9hdmFpbGFibGUoKSApCisJeworCSAgICBQdFNldFJlc291cmNlKCBndWlfcGhfdGltZXJfdGltZW91dCwgUHRfQVJHX1RJTUVSX0lOSVRJQUwsIDAsIDAgKTsKKwkgICAgcmV0dXJuKCBPSyApOworCX0KKwllbHNlIGlmKCBpc190aW1lb3V0ID09IFRSVUUgKQorCSAgICByZXR1cm4oIEZBSUwgKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKCBGRUFUX0JST1dTRSApIHx8IGRlZmluZWQoIFBST1RPICkKKy8qCisgKiBQdXQgdXAgYSBmaWxlIHJlcXVlc3Rlci4KKyAqIFJldHVybnMgdGhlIHNlbGVjdGVkIG5hbWUgaW4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgTlVMTCBmb3IgQ2FuY2VsLgorICogc2F2aW5nLAkgICAgc2VsZWN0IGZpbGUgdG8gd3JpdGUKKyAqIHRpdGxlCSAgICB0aXRsZSBmb3IgdGhlIHdpbmRvdworICogZGVmYXVsdF9uYW1lCSAgICBkZWZhdWx0IG5hbWUgKHdlbGwgZHVoISkKKyAqIGV4dAkJICAgIG5vdCB1c2VkIChleHRlbnNpb24gYWRkZWQpCisgKiBpbml0ZGlyCSAgICBpbml0aWFsIGRpcmVjdG9yeSwgTlVMTCBmb3IgY3VycmVudCBkaXIKKyAqIGZpbHRlcgkgICAgbm90IHVzZWQgKGZpbGUgbmFtZSBmaWx0ZXIpCisgKi8KKyAgICBjaGFyX3UgKgorZ3VpX21jaF9icm93c2UoCisJaW50IHNhdmluZywKKwljaGFyX3UgKnRpdGxlLAorCWNoYXJfdSAqZGVmYXVsdF9uYW1lLAorCWNoYXJfdSAqZXh0LAorCWNoYXJfdSAqaW5pdGRpciwKKwljaGFyX3UgKmZpbHRlcikKK3sKKyAgICBQdEZpbGVTZWxlY3Rpb25JbmZvX3QgZmlsZTsKKyAgICBpbnQJICAgIGZsYWdzOworICAgIGNoYXJfdSAgKmRlZmF1bHRfcGF0aDsKKyAgICBjaGFyX3UgICpvcGVuX3RleHQgPSBOVUxMOworCisgICAgZmxhZ3MgPSAwOworICAgIG1lbXNldCggJmZpbGUsIDAsIHNpemVvZiggZmlsZSApICk7CisKKyAgICBkZWZhdWx0X3BhdGggPSBhbGxvYyggTUFYUEFUSEwgKyAxICsgTkFNRV9NQVggKyAxICk7CisgICAgaWYoIGRlZmF1bHRfcGF0aCAhPSBOVUxMICkKKyAgICB7CisJaWYoIHNhdmluZyA9PSBUUlVFICkKKwl7CisJICAgIC8qIERvbid0IG5lZWQgUHRfRlNSX0NPTkZJUk1fRVhJU1RJTkcsIHZpbSB3aWxsIGFzayBhbnl3YXkgKi8KKwkgICAgZmxhZ3MgfD0gUHRfRlNSX05PX0ZDSEVDSzsKKwkgICAgb3Blbl90ZXh0ID0gIiZTYXZlIjsKKwl9CisKKwkvKiBjb21iaW5lIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGludG8gYSBzaW5nbGUgcGF0aCAqLworCWlmKCBpbml0ZGlyID09IE5VTEwgfHwgKmluaXRkaXIgPT0gTlVMICkKKwl7CisJICAgIG1jaF9kaXJuYW1lKCBkZWZhdWx0X3BhdGgsIE1BWFBBVEhMICk7CisJICAgIGluaXRkaXIgPSBkZWZhdWx0X3BhdGg7CisJfQorCWVsc2UKKwl7CisJICAgIFNUUkNQWSggZGVmYXVsdF9wYXRoLCBpbml0ZGlyICk7CisJICAgIGluaXRkaXIgPSBkZWZhdWx0X3BhdGg7CisJfQorCisJaWYoIGRlZmF1bHRfbmFtZSAhPSBOVUxMICkKKwl7CisJICAgIGlmKCBkZWZhdWx0X3BhdGhbIFNUUkxFTiggZGVmYXVsdF9wYXRoICkgLSAxIF0gIT0gJy8nICkKKwkJU1RSQ0FUKCBkZWZhdWx0X3BhdGgsICIvIiApOworCisJICAgIFNUUkNBVCggZGVmYXVsdF9wYXRoLCBkZWZhdWx0X25hbWUgKTsKKwl9CisKKwkvKiBUT0RPOiBhZGQgYSBmaWx0ZXI/ICovCisJUHRGaWxlU2VsZWN0aW9uKAorCQlndWkudmltV2luZG93LAorCQlOVUxMLAorCQl0aXRsZSwKKwkJZGVmYXVsdF9wYXRoLAorCQlOVUxMLAorCQlvcGVuX3RleHQsCisJCU5VTEwsCisJCU5VTEwsCisJCSZmaWxlLAorCQlmbGFncyApOworCisJdmltX2ZyZWUoIGRlZmF1bHRfcGF0aCApOworCisJaWYoIGZpbGUucmV0ID09IFB0X0ZTRElBTE9HX0JUTjEgKQorCSAgICByZXR1cm4oIHZpbV9zdHJzYXZlKCBmaWxlLnBhdGggKSApOworICAgIH0KKyAgICByZXR1cm4oIE5VTEwgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCggRkVBVF9HVUlfRElBTE9HICkgfHwgZGVmaW5lZCggUFJPVE8gKQorc3RhdGljIFB0V2lkZ2V0X3QgKmd1aV9waF9kaWFsb2dfdGV4dCA9IE5VTEw7CisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfZGlhbG9nX2Nsb3NlKCBpbnQgYnV0dG9uLCB2b2lkICpkYXRhICkKK3sKKyAgICBQdE1vZGFsQ3RybF90ICptb2RhbF9jdHJsID0gZGF0YTsKKyAgICBjaGFyX3UgKmRpYWxvZ190ZXh0LCAqdmltX3RleHQ7CisKKyAgICBpZiggZ3VpX3BoX2RpYWxvZ190ZXh0ICE9IE5VTEwgKQorICAgIHsKKwlQdEdldFJlc291cmNlKCBndWlfcGhfZGlhbG9nX3RleHQsIFB0X0FSR19URVhUX1NUUklORywgJmRpYWxvZ190ZXh0LCAwICk7CisJUHRHZXRSZXNvdXJjZSggZ3VpX3BoX2RpYWxvZ190ZXh0LCBQdF9BUkdfUE9JTlRFUiwgJnZpbV90ZXh0LCAwICk7CisJU1RSTkNQWSggdmltX3RleHQsIGRpYWxvZ190ZXh0LCBJT1NJWkUgLSAxICk7CisgICAgfQorCisgICAgUHRNb2RhbFVuYmxvY2soIG1vZGFsX2N0cmwsICh2b2lkICopIGJ1dHRvbiApOworCisgICAgcmV0dXJuKCBQdF9UUlVFICk7Cit9CisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfZGlhbG9nX3RleHRfZW50ZXIoIFB0V2lkZ2V0X3QgKndpZGdldCwgdm9pZCAqZGF0YSwgUHRDYWxsYmFja0luZm9fdCAqaW5mbyApCit7CisgICAgaWYoIGluZm8tPnJlYXNvbl9zdWJ0eXBlID09IFB0X0VESVRfQUNUSVZBVEUgKQorCWd1aV9waF9kaWFsb2dfY2xvc2UoIDEsIGRhdGEgKTsKKyAgICByZXR1cm4oIFB0X0NPTlRJTlVFICk7Cit9CisKKyAgICBzdGF0aWMgaW50CitndWlfcGhfZGlhbG9nX2VzYyggUHRXaWRnZXRfdCAqd2lkZ2V0LCB2b2lkICpkYXRhLCBQdENhbGxiYWNrSW5mb190ICppbmZvICkKK3sKKyAgICBQaEtleUV2ZW50X3QgKmtleTsKKworICAgIGtleSA9IFBoR2V0RGF0YSggaW5mby0+ZXZlbnQgKTsKKyAgICBpZiggKCBrZXktPmtleV9mbGFncyAmIFBrX0tGX0NhcF9WYWxpZCApICYmICgga2V5LT5rZXlfY2FwID09IFBrX0VzY2FwZSApICkKKyAgICB7CisJZ3VpX3BoX2RpYWxvZ19jbG9zZSggMCwgZGF0YSApOworCXJldHVybiggUHRfQ09OU1VNRSApOworICAgIH0KKyAgICByZXR1cm4oIFB0X1BST0NFU1MgKTsKK30KKworICAgIGludAorZ3VpX21jaF9kaWFsb2coCisJaW50CXR5cGUsCisJY2hhcl91CSp0aXRsZSwKKwljaGFyX3UJKm1lc3NhZ2UsCisJY2hhcl91CSpidXR0b25zLAorCWludAlkZWZhdWx0X2J1dHRvbiwKKwljaGFyX3UJKnRleHRmaWVsZCkKK3sKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBjaGFyX3UJKipidXR0b25fYXJyYXk7CisgICAgY2hhcl91CSpidXR0b25zX2NvcHk7CisKKyAgICBpbnQJCWJ1dHRvbl9jb3VudDsKKyAgICBpbnQJCWksIGxlbjsKKyAgICBpbnQJCWRpYWxvZ19yZXN1bHQgPSAtMTsKKworICAgIC8qIEZJWE1FOiB0aGUgdmVydGljYWwgb3B0aW9uIGluIGd1aW9wdGlvbnMgaXMgYmxhdGFudGx5IGlnbm9yZWQgKi8KKyAgICAvKiBGSVhNRTogc28gaXMgdGhlIHR5cGUgKi8KKworICAgIGJ1dHRvbl9jb3VudCA9IGxlbiA9IGkgPSAwOworCisgICAgaWYoIGJ1dHRvbnMgPT0gTlVMTCB8fCAqYnV0dG9ucyA9PSBOVUwgKQorCXJldHVybiggLTEgKTsKKworICAgIC8qIFRoZXJlIGlzIG9uZSBsZXNzIHNlcGFyYXRvciB0aGFuIGJ1dHRvbnMsIHNvIGJ1bXAgdXAgdGhlIGJ1dHRvbiBjb3VudCAqLworICAgIGJ1dHRvbl9jb3VudCA9IDE7CisKKyAgICAvKiBDb3VudCBzdHJpbmcgbGVuZ3RoIGFuZCBudW1iZXIgb2Ygc2VwZXJhdG9ycyAqLworICAgIGZvciggc3RyID0gYnV0dG9uczsgKnN0cjsgc3RyKysgKQorICAgIHsKKwlsZW4rKzsKKwlpZiggKnN0ciA9PSBETEdfQlVUVE9OX1NFUCApCisJICAgIGJ1dHRvbl9jb3VudCsrOworICAgIH0KKworICAgIGlmICggdGl0bGUgPT0gTlVMTCApCisJdGl0bGUgPSAiVmltIjsKKworICAgIGJ1dHRvbnNfY29weSA9IGFsbG9jKCBsZW4gKyAxICk7CisgICAgYnV0dG9uX2FycmF5ID0gKGNoYXJfdSAqKikgYWxsb2MoIGJ1dHRvbl9jb3VudCAqIHNpemVvZiggY2hhcl91ICogKSApOworICAgIGlmKCBidXR0b25zX2NvcHkgIT0gTlVMTCAmJiBidXR0b25fYXJyYXkgIT0gTlVMTCApCisgICAgeworCVNUUkNQWSggYnV0dG9uc19jb3B5LCBidXR0b25zICk7CisKKwkvKgorCSAqIENvbnZlcnQgRExHX0JVVFRPTl9TRVAgaW50byBOVUwncyBhbmQgZmlsbCBpbgorCSAqIGJ1dHRvbl9hcnJheSB3aXRoIHRoZSBwb2ludGVyIHRvIGVhY2ggTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCisJICovCisJc3RyID0gYnV0dG9uc19jb3B5OworCWZvciggaSA9IDA7IGkgPCBidXR0b25fY291bnQ7IGkrKyApCisJeworCSAgICBidXR0b25fYXJyYXlbIGkgXSA9IHN0cjsKKwkgICAgZm9yKCA7ICpzdHI7IHN0cisrICkKKwkgICAgeworCQlpZiggKnN0ciA9PSBETEdfQlVUVE9OX1NFUCApCisJCXsKKwkJICAgICpzdHIrKyA9IE5VTDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisjaWZuZGVmIEZFQVRfR1VJX1RFWFRESUFMT0cKKwlkaWFsb2dfcmVzdWx0ID0gUHRBbGVydCgKKwkJZ3VpLnZpbVdpbmRvdywgTlVMTCwKKwkJdGl0bGUsCisJCU5VTEwsCisJCW1lc3NhZ2UsIE5VTEwsCisJCWJ1dHRvbl9jb3VudCwgKGNvbnN0IGNoYXIgKiopIGJ1dHRvbl9hcnJheSwgTlVMTCwKKwkJZGVmYXVsdF9idXR0b24sIDAsIFB0X01PREFMICk7CisjZWxzZQorCS8qIFdyaXRpbmcgdGhlIGRpYWxvZyBvdXJzZWx2ZXMgbGV0cyB1cyBhZGQgZXh0cmEgZmVhdHVyZXMsIGxpa2UKKwkgKiB0cmFwcGluZyB0aGUgZXNjYXBlIGtleSBhbmQgcmV0dXJuaW5nIDAgdG8gdmltICovCisJeworCSAgICBpbnQgbjsKKwkgICAgUHRBcmdfdCBhcmdzWzVdOworCSAgICBQdFdpZGdldF90ICpkaWFsb2csICpwYW5lOworCSAgICBQdE1vZGFsQ3RybF90IG1vZGFsX2N0cmw7CisJICAgIFB0RGlhbG9nSW5mb190IGRpOworCisJICAgIG1lbXNldCggJmRpLCAwLCBzaXplb2YoIGRpICkgKTsKKwkgICAgbWVtc2V0KCAmbW9kYWxfY3RybCwgMCwgc2l6ZW9mKCBtb2RhbF9jdHJsICkgKTsKKworCSAgICBuID0gMDsKKwkgICAgUHRTZXRBcmcoICZhcmdzW24rK10sIFB0X0FSR19HUk9VUF9ST1dTX0NPTFMsIDAsIDAgKTsKKwkgICAgUHRTZXRBcmcoICZhcmdzW24rK10sIFB0X0FSR19XSURUSCwgMzUwLCAwICk7CisJICAgIFB0U2V0QXJnKCAmYXJnc1tuKytdLCBQdF9BUkdfR1JPVVBfT1JJRU5UQVRJT04sCisJCSAgICBQdF9HUk9VUF9WRVJUSUNBTCwgMCApOworCSAgICBQdFNldEFyZyggJmFyZ3NbbisrXSwgUHRfQVJHX0dST1VQX0ZMQUdTLAorCQkgICAgUHRfVFJVRSwgUHRfR1JPVVBfTk9fS0VZUyB8IFB0X0dST1VQX1NUUkVUQ0hfSE9SSVpPTlRBTCApOworCSAgICBQdFNldEFyZyggJmFyZ3NbbisrXSwgUHRfQVJHX0NPTlRBSU5FUl9GTEFHUywgUHRfRkFMU0UsIFB0X1RSVUUgKTsKKwkgICAgcGFuZSA9IFB0Q3JlYXRlV2lkZ2V0KCBQdEdyb3VwLCBOVUxMLCBuLCBhcmdzICk7CisKKwkgICAgbiA9IDA7CisJICAgIFB0U2V0QXJnKCAmYXJnc1tuKytdLCBQdF9BUkdfVEVYVF9TVFJJTkcsIG1lc3NhZ2UsIDAgKTsKKwkgICAgUHRDcmVhdGVXaWRnZXQoIFB0TGFiZWwsIHBhbmUsIG4sIGFyZ3MgKTsKKworCSAgICBpZiggdGV4dGZpZWxkICE9IE5VTEwgKQorCSAgICB7CisJCW4gPSAwOworCQlQdFNldEFyZyggJmFyZ3NbbisrXSwgUHRfQVJHX01BWF9MRU5HVEgsIElPU0laRSAtIDEsIDAgKTsKKwkJUHRTZXRBcmcoICZhcmdzW24rK10sIFB0X0FSR19URVhUX1NUUklORywgdGV4dGZpZWxkLCAwICk7CisJCVB0U2V0QXJnKCAmYXJnc1tuKytdLCBQdF9BUkdfUE9JTlRFUiwgdGV4dGZpZWxkLCAwICk7CisJCWd1aV9waF9kaWFsb2dfdGV4dCA9IFB0Q3JlYXRlV2lkZ2V0KCBQdFRleHQsIHBhbmUsIG4sIGFyZ3MgKTsKKwkJUHRBZGRDYWxsYmFjayggZ3VpX3BoX2RpYWxvZ190ZXh0LCBQdF9DQl9BQ1RJVkFURSwKKwkJCWd1aV9waF9kaWFsb2dfdGV4dF9lbnRlciwgJm1vZGFsX2N0cmwgKTsKKwkgICAgfQorCisJICAgIGRpLnBhcmVudCA9IGd1aS52aW1XaW5kb3c7CisJICAgIGRpLnBhbmUgPSBwYW5lOworCSAgICBkaS50aXRsZSA9IHRpdGxlOworCSAgICBkaS5idXR0b25zID0gKGNvbnN0IGNoYXIgKiopIGJ1dHRvbl9hcnJheTsKKwkgICAgZGkubmJ0bnMgPSBidXR0b25fY291bnQ7CisJICAgIGRpLmRlZl9idG4gPSBkZWZhdWx0X2J1dHRvbjsKKwkgICAgLyogVGhpcyBpcyBqdXN0IHRvIGdpdmUgdGhlIGRpYWxvZyB0aGUgY2xvc2UgYnV0dG9uLgorCSAgICAgKiBXZSBjaGVjayBmb3IgdGhlIEVzY2FwZSBrZXkgb3Vyc2VsdmVzIGFuZCByZXR1cm4gMCAqLworCSAgICBkaS5lc2NfYnRuID0gYnV0dG9uX2NvdW50OworCSAgICBkaS5jYWxsYmFjayA9IGd1aV9waF9kaWFsb2dfY2xvc2U7CisJICAgIGRpLmRhdGEgPSAmbW9kYWxfY3RybDsKKworCSAgICBkaWFsb2cgPSBQdENyZWF0ZURpYWxvZyggJmRpICk7CisJICAgIFB0QWRkRmlsdGVyQ2FsbGJhY2soIGRpYWxvZywgUGhfRVZfS0VZLAorCQkgICAgZ3VpX3BoX2RpYWxvZ19lc2MsICZtb2RhbF9jdHJsICk7CisKKwkgICAgaWYoIGd1aV9waF9kaWFsb2dfdGV4dCAhPSBOVUxMICkKKwkJUHRHaXZlRm9jdXMoIGd1aV9waF9kaWFsb2dfdGV4dCwgTlVMTCApOworCisJICAgIC8qIE9wZW4gZGlhbG9nLCBibG9jayB0aGUgdmltIHdpbmRvdyBhbmQgd2FpdCBmb3IgdGhlIGRpYWxvZyB0byBjbG9zZSAqLworCSAgICBQdFJlYWxpemVXaWRnZXQoIGRpYWxvZyApOworCSAgICBQdE1ha2VNb2RhbCggZGlhbG9nLCBQaF9DVVJTT1JfTk9JTlBVVCwgUGhfQ1VSU09SX0RFRkFVTFRfQ09MT1IgKTsKKwkgICAgZGlhbG9nX3Jlc3VsdCA9IChpbnQpIFB0TW9kYWxCbG9jayggJm1vZGFsX2N0cmwsIDAgKTsKKworCSAgICBQdERlc3Ryb3lXaWRnZXQoIGRpYWxvZyApOworCSAgICBndWlfcGhfZGlhbG9nX3RleHQgPSBOVUxMOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIHZpbV9mcmVlKCBidXR0b25fYXJyYXkgKTsKKyAgICB2aW1fZnJlZSggYnV0dG9uc19jb3B5ICk7CisKKyAgICByZXR1cm4oIGRpYWxvZ19yZXN1bHQgKTsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB3aW5kb3cgc2l6ZS9wb3NpdGlvbi9zdGF0ZSAqLworCisgICAgaW50CitndWlfbWNoX2dldF93aW5wb3MoaW50ICp4LCBpbnQgKnkpCit7CisgICAgUGhQb2ludF90ICpwb3M7CisKKyAgICBwb3MgPSBQdFdpZGdldFBvcyggZ3VpLnZpbVdpbmRvdywgTlVMTCApOworCisgICAgKnggPSBwb3MtPng7CisgICAgKnkgPSBwb3MtPnk7CisKKyAgICByZXR1cm4oIE9LICk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF93aW5wb3MoaW50IHgsIGludCB5KQoreworICAgIFBoUG9pbnRfdCBwb3MgPSB7IHgsIHkgfTsKKworICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1XaW5kb3csIFB0X0FSR19QT1MsICZwb3MsIDAgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3NoZWxsc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpCit7CisgICAgUGhEaW1fdCB3aW5kb3dfc2l6ZSA9IHsgd2lkdGgsIGhlaWdodCB9OworICAgIFBoRGltX3QgbWluX3NpemUgPSB7IG1pbl93aWR0aCwgbWluX2hlaWdodCB9OworCisjaWZkZWYgVVNFX1BBTkVMX0dST1VQCisgICAgd2luZG93X3NpemUudyArPSBwZ19tYXJnaW5fbGVmdCArIHBnX21hcmdpbl9yaWdodDsKKyAgICB3aW5kb3dfc2l6ZS5oICs9IHBnX21hcmdpbl90b3AgKyBwZ19tYXJnaW5fYm90dG9tOworI2VuZGlmCisKKyAgICBQdFNldFJlc291cmNlKCBndWkudmltV2luZG93LCBQdF9BUkdfTUlOSU1VTV9ESU0sICZtaW5fc2l6ZSwgMCApOworICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1XaW5kb3csIFB0X0FSR19ESU0sICZ3aW5kb3dfc2l6ZSwgMCApOworCisgICAgaWYoICEgUHRXaWRnZXRJc1JlYWxpemVkKCBndWkudmltV2luZG93ICkgKQorCWd1aV9waF9yZXNpemVfY29udGFpbmVyKCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzY3JlZW4gc3BhY2UgdGhhdCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgKHN1Y2ggYXMKKyAqIGJ5IHRoZSBzaGVsZikuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucyhpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKQoreworICAgIFBoUmVjdF90IGNvbnNvbGU7CisKKyAgICBQaFdpbmRvd1F1ZXJ5VmlzaWJsZSggUGhfUVVFUllfV09SS1NQQUNFLCAwLAorCSAgICBQaElucHV0R3JvdXAoIE5VTEwgKSwgJmNvbnNvbGUgKTsKKworICAgICpzY3JlZW5fdyA9IGNvbnNvbGUubHIueCAtIGNvbnNvbGUudWwueCArIDE7CisgICAgKnNjcmVlbl9oID0gY29uc29sZS5sci55IC0gY29uc29sZS51bC55ICsgMTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfaWNvbmlmeSh2b2lkKQoreworICAgIFBoV2luZG93RXZlbnRfdCBldmVudDsKKworICAgIG1lbXNldCggJmV2ZW50LCAwLCBzaXplb2YgKGV2ZW50KSApOworICAgIGV2ZW50LmV2ZW50X2YgPSBQaF9XTV9ISURFOworICAgIGV2ZW50LmV2ZW50X3N0YXRlID0gUGhfV01fRVZTVEFURV9ISURFOworICAgIGV2ZW50LnJpZCA9IFB0V2lkZ2V0UmlkKCBndWkudmltV2luZG93ICk7CisgICAgUHRGb3J3YXJkV2luZG93RXZlbnQoICZldmVudCApOworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQnJpbmcgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCkKK3sKKyAgICBQaFdpbmRvd0V2ZW50X3QgZXZlbnQ7CisKKyAgICBtZW1zZXQoICZldmVudCwgMCwgc2l6ZW9mIChldmVudCkgKTsKKyAgICBldmVudC5ldmVudF9mID0gUGhfV01fVE9GUk9OVDsKKyAgICBldmVudC5ldmVudF9zdGF0ZSA9IFBoX1dNX0VWU1RBVEVfRkZST05UOworICAgIGV2ZW50LnJpZCA9IFB0V2lkZ2V0UmlkKCBndWkudmltV2luZG93ICk7CisgICAgUHRGb3J3YXJkV2luZG93RXZlbnQoICZldmVudCApOworfQorI2VuZGlmCisKKyAgICB2b2lkCitndWlfbWNoX3NldHRpdGxlKGNoYXJfdSAqdGl0bGUsCWNoYXJfdSAqaWNvbikKK3sKKyNpZmRlZiBVU0VfUEFORUxfR1JPVVAKKyAgICBndWlfcGhfcGdfc2V0X2J1ZmZlcl9udW0oIGN1cndpbi0+d19idWZmZXItPmJfZm51bSApOworI2VuZGlmCisgICAgUHRTZXRSZXNvdXJjZSggZ3VpLnZpbVdpbmRvdywgUHRfQVJHX1dJTkRPV19USVRMRSwgdGl0bGUsIDAgKTsKKyAgICAvKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGhlIGljb24gdGV4dCwgc2V0IGJhbGxvb24gdGV4dCBzb21laG93PyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNjcm9sbGJhciAqLworCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNjcm9sbGJhcl9UICpzYiwgaW50IHZhbCwgaW50IHNpemUsIGludCBtYXgpCit7CisgICAgaW50CSAgICBuID0gMDsKKyAgICBQdEFyZ190IGFyZ3NbM107CisKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTUFYSU1VTSwgbWF4LCAwICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1NMSURFUl9TSVpFLCBzaXplLCAwICk7CisgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0dBVUdFX1ZBTFVFLCB2YWwsIDAgKTsKKyAgICBQdFNldFJlc291cmNlcyggc2ItPmlkLCBuLCBhcmdzICk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgUGhBcmVhX3QgYXJlYSA9IHt7IHgsIHkgfSwgeyB3LCBoIH19OworCisgICAgUHRTZXRSZXNvdXJjZSggc2ItPmlkLCBQdF9BUkdfQVJFQSwgJmFyZWEsIDAgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfY3JlYXRlX3Njcm9sbGJhcihzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpCit7CisgICAgaW50CSAgICBuID0gMDsKKy8qICAgIGludAkgICAgYW5jaG9yX2ZsYWdzID0gMDsqLworICAgIFB0QXJnX3QgYXJnc1s0XTsKKworICAgIC8qCisgICAgICogU3RvcCB0aGUgc2Nyb2xsYmFyIGZyb20gYmVpbmcgcmVhbGl6ZWQgd2hlbiB0aGUgcGFyZW50CisgICAgICogaXMgcmVhbGl6ZWQsIHNvIGl0IGNhbiBiZSBleHBsaWNpdGx5IHJlYWxpemVkIGJ5IHZpbS4KKyAgICAgKgorICAgICAqIEFsc28sIGRvbid0IGxldCB0aGUgc2Nyb2xsYmFyIGdldCBmb2N1cworICAgICAqLworICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19GTEFHUywgUHRfREVMQVlfUkVBTElaRSwKKwkgICAgUHRfREVMQVlfUkVBTElaRSB8IFB0X0dFVFNfRk9DVVMgKTsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfU0NST0xMQkFSX0ZMQUdTLCBQdF9TQ1JPTExCQVJfU0hPV19BUlJPV1MsIDApOworI2lmIDAKKyAgICAvKiBEb24ndCBuZWVkIHRoaXMgYW5jaG9yaW5nIGZvciB0aGUgc2Nyb2xsYmFycyAqLworICAgIGlmKCBvcmllbnQgPT0gU0JBUl9IT1JJWiApCisgICAgeworCWFuY2hvcl9mbGFncyA9IFB0X0JPVFRPTV9BTkNIT1JFRF9CT1RUT00gfAorCSAgICBQdF9MRUZUX0FOQ0hPUkVEX0xFRlQgfCBQdF9SSUdIVF9BTkNIT1JFRF9SSUdIVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlhbmNob3JfZmxhZ3MgPSBQdF9CT1RUT01fQU5DSE9SRURfQk9UVE9NIHwgUHRfVE9QX0FOQ0hPUkVEX1RPUDsKKwlpZiggc2ItPndwICE9IE5VTEwgKQorCXsKKwkgICAgaWYoIHNiID09ICZzYi0+d3AtPndfc2Nyb2xsYmFyc1sgU0JBUl9MRUZUIF0gKQorCQlhbmNob3JfZmxhZ3MgfD0gUHRfTEVGVF9BTkNIT1JFRF9MRUZUOworCSAgICBlbHNlCisJCWFuY2hvcl9mbGFncyB8PSBQdF9SSUdIVF9BTkNIT1JFRF9SSUdIVDsKKwl9CisgICAgfQorICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19BTkNIT1JfRkxBR1MsIGFuY2hvcl9mbGFncywgUHRfSVNfQU5DSE9SRUQgKTsKKyNlbmRpZgorICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19PUklFTlRBVElPTiwKKwkgICAgKG9yaWVudCA9PSBTQkFSX0hPUklaKSA/IFB0X0hPUklaT05UQUwgOiBQdF9WRVJUSUNBTCwgMCApOworI2lmZGVmIFVTRV9QQU5FTF9HUk9VUAorICAgIHNiLT5pZCA9IFB0Q3JlYXRlV2lkZ2V0KCBQdFNjcm9sbGJhciwgZ3VpLnZpbVBhbmVsR3JvdXAsIG4sIGFyZ3MgKTsKKyNlbHNlCisgICAgc2ItPmlkID0gUHRDcmVhdGVXaWRnZXQoIFB0U2Nyb2xsYmFyLCBndWkudmltQ29udGFpbmVyLCBuLCBhcmdzICk7CisjZW5kaWYKKworICAgIFB0QWRkQ2FsbGJhY2soIHNiLT5pZCwgUHRfQ0JfU0NST0xMQkFSX01PVkUsIGd1aV9waF9oYW5kbGVfc2Nyb2xsYmFyLCBzYiApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyKHNjcm9sbGJhcl9UICpzYiwgaW50IGZsYWcpCit7CisgICAgaWYoIGZsYWcgIT0gMCApCisJUHRSZWFsaXplV2lkZ2V0KCBzYi0+aWQgKTsKKyAgICBlbHNlCisJUHRVbnJlYWxpemVXaWRnZXQoIHNiLT5pZCApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhcihzY3JvbGxiYXJfVCAqc2IpCit7CisgICAgUHREZXN0cm95V2lkZ2V0KCBzYi0+aWQgKTsKKyAgICBzYi0+aWQgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vdXNlIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChGRUFUX01PVVNFU0hBUEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKiBUaGUgbGFzdCBzZXQgbW91c2UgcG9pbnRlciBzaGFwZSBpcyByZW1lbWJlcmVkLCB0byBiZSB1c2VkIHdoZW4gaXQgZ29lcworICogZnJvbSBoaWRkZW4gdG8gbm90IGhpZGRlbi4gKi8KK3N0YXRpYyBpbnQgbGFzdF9zaGFwZSA9IDA7CisKKy8qIFRhYmxlIGZvciBzaGFwZSBJRHMuICBLZWVwIGluIHN5bmMgd2l0aCB0aGUgbXNoYXBlX25hbWVzW10gdGFibGUgaW4KKyAqIG1pc2MyLmMhICovCitzdGF0aWMgaW50IG1zaGFwZV9pZHNbXSA9Cit7CisgICAgUGhfQ1VSU09SX1BPSU5URVIsCQkvKiBhcnJvdyAqLworICAgIFBoX0NVUlNPUl9OT05FLAkJLyogYmxhbmsgKi8KKyAgICBQaF9DVVJTT1JfSU5TRVJULAkJLyogYmVhbSAqLworICAgIFBoX0NVUlNPUl9EUkFHX1ZFUlRJQ0FMLAkvKiB1cGRvd24gKi8KKyAgICBQaF9DVVJTT1JfRFJBR19WRVJUSUNBTCwJLyogdWRzaXppbmcgKi8KKyAgICBQaF9DVVJTT1JfRFJBR19IT1JJWk9OVEFMLAkvKiBsZWZ0cmlnaHQgKi8KKyAgICBQaF9DVVJTT1JfRFJBR19IT1JJWk9OVEFMLAkvKiBscnNpemluZyAqLworICAgIFBoX0NVUlNPUl9XQUlULAkJLyogYnVzeSAqLworICAgIFBoX0NVUlNPUl9ET05ULAkJLyogbm8gKi8KKyAgICBQaF9DVVJTT1JfQ1JPU1NIQUlSLAkvKiBjcm9zc2hhaXIgKi8KKyAgICBQaF9DVVJTT1JfRklOR0VSLAkJLyogaGFuZDEgKi8KKyAgICBQaF9DVVJTT1JfRklOR0VSLAkJLyogaGFuZDIgKi8KKyAgICBQaF9DVVJTT1JfRklOR0VSLAkJLyogcGVuY2lsICovCisgICAgUGhfQ1VSU09SX1FVRVNUSU9OX1BPSU5ULAkvKiBxdWVzdGlvbiAqLworICAgIFBoX0NVUlNPUl9QT0lOVEVSLAkJLyogcmlnaHQtYXJyb3cgKi8KKyAgICBQaF9DVVJTT1JfUE9JTlRFUiwJCS8qIHVwLWFycm93ICovCisgICAgUGhfQ1VSU09SX1BPSU5URVIJCS8qIGxhc3Qgb25lICovCit9OworCisgICAgdm9pZAorbWNoX3NldF9tb3VzZV9zaGFwZShzaGFwZSkKKyAgICBpbnQJc2hhcGU7Cit7CisgICAgaW50CSAgICBpZDsKKworICAgIGlmICghZ3VpLmluX3VzZSkKKwlyZXR1cm47CisKKyAgICBpZiAoc2hhcGUgPT0gTVNIQVBFX0hJREUgfHwgZ3VpLnBvaW50ZXJfaGlkZGVuKQorCVB0U2V0UmVzb3VyY2UoIGd1aS52aW1UZXh0QXJlYSwgUHRfQVJHX0NVUlNPUl9UWVBFLCBQaF9DVVJTT1JfTk9ORSwKKwkJMCApOworICAgIGVsc2UKKyAgICB7CisJaWYgKHNoYXBlID49IE1TSEFQRV9OVU1CRVJFRCkKKwkgICAgaWQgPSBQaF9DVVJTT1JfUE9JTlRFUjsKKwllbHNlCisJICAgIGlkID0gbXNoYXBlX2lkc1tzaGFwZV07CisKKwlQdFNldFJlc291cmNlKCBndWkudmltVGV4dEFyZWEsIFB0X0FSR19DVVJTT1JfVFlQRSwgaWQsCTAgKTsKKyAgICB9CisgICAgaWYgKHNoYXBlICE9IE1TSEFQRV9ISURFKQorCWxhc3Rfc2hhcGUgPSBzaGFwZTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9tb3VzZWhpZGUoaW50IGhpZGUpCit7CisgICAgaWYoIGd1aS5wb2ludGVyX2hpZGRlbiAhPSBoaWRlICkKKyAgICB7CisJZ3VpLnBvaW50ZXJfaGlkZGVuID0gaGlkZTsKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKwlpZiggaGlkZSApCisJICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1UZXh0QXJlYSwgUHRfQVJHX0NVUlNPUl9UWVBFLAorCQkgICAgUGhfQ1VSU09SX05PTkUsIDAgKTsKKwllbHNlCisJICAgIG1jaF9zZXRfbW91c2Vfc2hhcGUoIGxhc3Rfc2hhcGUgKTsKKyNlbHNlCisJUHRTZXRSZXNvdXJjZSggZ3VpLnZpbVRleHRBcmVhLCBQdF9BUkdfQ1VSU09SX1RZUEUsCisJCSggaGlkZSA9PSBNT1VTRV9TSE9XICkgPyBHVUlfUEhfTU9VU0VfVFlQRSA6IFBoX0NVUlNPUl9OT05FLAorCQkwICk7CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3godm9pZCkKK3sKKyAgICBQaEN1cnNvckluZm9fdCBpbmZvOworICAgIHNob3J0IHgsIHk7CisKKyAgICAvKiBGSVhNRTogZG9lcyB0aGlzIHJldHVybiB0aGUgY29ycmVjdCBwb3NpdGlvbiwKKyAgICAgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIGJvcmRlcj8gKi8KKyAgICBQaFF1ZXJ5Q3Vyc29yKCBQaElucHV0R3JvdXAoIE5VTEwgKSwgJmluZm8gKTsKKyAgICBQdEdldEFic1Bvc2l0aW9uKCBndWkudmltVGV4dEFyZWEgLCAmeCwgJnkgKTsKKworICAgIHJldHVybiggaW5mby5wb3MueCAtIHggKTsKK30KKworICAgIGludAorZ3VpX21jaF9nZXRfbW91c2VfeSh2b2lkKQoreworICAgIFBoQ3Vyc29ySW5mb190IGluZm87CisgICAgc2hvcnQgeCwgeTsKKworICAgIFBoUXVlcnlDdXJzb3IoIFBoSW5wdXRHcm91cCggTlVMTCApLCAmaW5mbyApOworICAgIFB0R2V0QWJzUG9zaXRpb24oIGd1aS52aW1UZXh0QXJlYSAsICZ4LCAmeSApOworICAgIC8qIFRPRE86IEFkZCBib3JkZXIgb2Zmc2V0PyAqLworICAgIHJldHVybiggaW5mby5wb3MueSAtIHkgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0bW91c2UoaW50IHgsIGludCB5KQoreworICAgIHNob3J0IGFic194LCBhYnNfeTsKKworICAgIFB0R2V0QWJzUG9zaXRpb24oIGd1aS52aW1UZXh0QXJlYSwgJmFic194LCAmYWJzX3kgKTsKKyAgICAvKiBBZGQgdGhlIGJvcmRlciBvZmZzZXQ/ICovCisgICAgUGhNb3ZlQ3Vyc29yQWJzKCBQaElucHV0R3JvdXAoIE5VTEwgKSwgYWJzX3ggKyB4LCBhYnNfeSArIHkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb2xvdXJzICovCisKKy8qCisgKiBSZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiBhIHBpeGVsIGFzIGEgbG9uZy4KKyAqLworICAgIGxvbmdfdQorZ3VpX21jaF9nZXRfcmdiKGd1aWNvbG9yX1QgcGl4ZWwpCit7CisgICAgcmV0dXJuIFBnUkdCKFBnUmVkVmFsdWUocGl4ZWwpLCBQZ0dyZWVuVmFsdWUocGl4ZWwpLCBQZ0JsdWVWYWx1ZShwaXhlbCkpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9uZXdfY29sb3JzKHZvaWQpCit7CisjaWYgMCAvKiBEb24ndCBib3RoZXIgY2hhbmdpbmcgdGhlIGN1cnNvciBjb2xvdXIgKi8KKyAgICBzaG9ydCBjb2xvcl9kaWZmOworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBhbmQKKyAgICAgKiB0aGUgbW91c2UgcG9pbnRlciBjb2xvdXIgdGhlbiBjaGFuZ2UgdGhlIG1vdXNlIHBvaW50ZXIgY29sb3VyCisgICAgICovCisgICAgY29sb3JfZGlmZiA9IGd1aV9nZXRfbGlnaHRuZXNzKGd1aV9waF9tb3VzZV9jb2xvcikKKwkJCQkJICAtIGd1aV9nZXRfbGlnaHRuZXNzKGd1aS5iYWNrX3BpeGVsKTsKKworICAgIGlmKCBhYnMoIGNvbG9yX2RpZmYgKSA8IDY0ICkKKyAgICB7CisJc2hvcnQgciwgZywgYjsKKwkvKiBub3QgYSBncmVhdCBhbGdvcml0aG0uLi4gKi8KKwlyID0gUGdSZWRWYWx1ZSggZ3VpX3BoX21vdXNlX2NvbG9yICkgXiAyNTU7CisJZyA9IFBnR3JlZW5WYWx1ZSggZ3VpX3BoX21vdXNlX2NvbG9yICkgXiAyNTU7CisJYiA9IFBnQmx1ZVZhbHVlKCBndWlfcGhfbW91c2VfY29sb3IgKSBeIDI1NTsKKworI2lmbmRlZiBGRUFUX01PVVNFU0hBUEUKKwlndWlfcGhfbW91c2VfY29sb3IgPSBQZ1JHQiggciwgZywgYiApOworCVB0U2V0UmVzb3VyY2UoIGd1aS52aW1UZXh0QXJlYSwgUHRfQVJHX0NVUlNPUl9DT0xPUiwKKwkJZ3VpX3BoX21vdXNlX2NvbG9yLCAwICk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1UZXh0QXJlYSwgUHRfQVJHX0ZJTExfQ09MT1IsIGd1aS5iYWNrX3BpeGVsLCAwICk7Cit9CisKKyAgICBzdGF0aWMgaW50CitoZXhfZGlnaXQoaW50IGMpCit7CisgICAgaWYgKFZJTV9JU0RJR0lUKGMpKQorCXJldHVybiggYyAtICcwJyApOworICAgIGMgPSBUT0xPV0VSX0FTQyhjKTsKKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJcmV0dXJuKCBjIC0gJ2EnICsgMTAgKTsKKyAgICByZXR1cm4oIC0xMDAwICk7Cit9CisKKworLyoKKyAqIFRoaXMgc2hvdWxkIGJlIHNwbGl0IG91dCBpbnRvIGEgc2VwZXJhdGUgZmlsZSwKKyAqIGV2ZXJ5IHBvcnQgZG9lcyBiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmcuCisgKgorICogVGhpcyBpcyB0aGUgZ3VpX3czMi5jIHZlcnNpb24gKGkgdGhpbmsuLikKKyAqIFJldHVybiBJTlZBTENPTE9SIHdoZW4gZmFpbGVkLgorICovCisKKyAgICBndWljb2xvcl9UCitndWlfbWNoX2dldF9jb2xvcihjaGFyX3UgKm5hbWUpCit7CisgICAgaW50IGk7CisgICAgaW50IHIsIGcsIGI7CisKKworICAgIHR5cGVkZWYgc3RydWN0IEd1aUNvbG91clRhYmxlCisgICAgeworCWNoYXIJICAgICpuYW1lOworCWd1aWNvbG9yX1QgICAgIGNvbG91cjsKKyAgICB9IEd1aUNvbG91clRhYmxlOworCisgICAgc3RhdGljIEd1aUNvbG91clRhYmxlIHRhYmxlW10gPQorICAgIHsKKwl7IkJsYWNrIiwJICAgIFJHQigweDAwLCAweDAwLCAweDAwKX0sCisJeyJEYXJrR3JheSIsCSAgICBSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LAorCXsiRGFya0dyZXkiLAkgICAgUkdCKDB4ODAsIDB4ODAsIDB4ODApfSwKKwl7IkdyYXkiLAkgICAgUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkdyZXkiLAkgICAgUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkxpZ2h0R3JheSIsCSAgICBSR0IoMHhEMywgMHhEMywgMHhEMyl9LAorCXsiTGlnaHRHcmV5IiwJICAgIFJHQigweEQzLCAweEQzLCAweEQzKX0sCisJeyJXaGl0ZSIsCSAgICBSR0IoMHhGRiwgMHhGRiwgMHhGRil9LAorCXsiRGFya1JlZCIsCSAgICBSR0IoMHg4MCwgMHgwMCwgMHgwMCl9LAorCXsiUmVkIiwJCSAgICBSR0IoMHhGRiwgMHgwMCwgMHgwMCl9LAorCXsiTGlnaHRSZWQiLAkgICAgUkdCKDB4RkYsIDB4QTAsIDB4QTApfSwKKwl7IkRhcmtCbHVlIiwJICAgIFJHQigweDAwLCAweDAwLCAweDgwKX0sCisJeyJCbHVlIiwJICAgIFJHQigweDAwLCAweDAwLCAweEZGKX0sCisJeyJMaWdodEJsdWUiLAkgICAgUkdCKDB4QTAsIDB4QTAsIDB4RkYpfSwKKwl7IkRhcmtHcmVlbiIsCSAgICBSR0IoMHgwMCwgMHg4MCwgMHgwMCl9LAorCXsiR3JlZW4iLAkgICAgUkdCKDB4MDAsIDB4RkYsIDB4MDApfSwKKwl7IkxpZ2h0R3JlZW4iLAkgICAgUkdCKDB4QTAsIDB4RkYsIDB4QTApfSwKKwl7IkRhcmtDeWFuIiwJICAgIFJHQigweDAwLCAweDgwLCAweDgwKX0sCisJeyJDeWFuIiwJICAgIFJHQigweDAwLCAweEZGLCAweEZGKX0sCisJeyJMaWdodEN5YW4iLAkgICAgUkdCKDB4QTAsIDB4RkYsIDB4RkYpfSwKKwl7IkRhcmtNYWdlbnRhIiwJICAgIFJHQigweDgwLCAweDAwLCAweDgwKX0sCisJeyJNYWdlbnRhIiwJICAgIFJHQigweEZGLCAweDAwLCAweEZGKX0sCisJeyJMaWdodE1hZ2VudGEiLCAgICBSR0IoMHhGRiwgMHhBMCwgMHhGRil9LAorCXsiQnJvd24iLAkgICAgUkdCKDB4ODAsIDB4NDAsIDB4NDApfSwKKwl7IlllbGxvdyIsCSAgICBSR0IoMHhGRiwgMHhGRiwgMHgwMCl9LAorCXsiTGlnaHRZZWxsb3ciLAkgICAgUkdCKDB4RkYsIDB4RkYsIDB4QTApfSwKKwl7IlNlYUdyZWVuIiwJICAgIFJHQigweDJFLCAweDhCLCAweDU3KX0sCisJeyJPcmFuZ2UiLAkgICAgUkdCKDB4RkYsIDB4QTUsIDB4MDApfSwKKwl7IlB1cnBsZSIsCSAgICBSR0IoMHhBMCwgMHgyMCwgMHhGMCl9LAorCXsiU2xhdGVCbHVlIiwJICAgIFJHQigweDZBLCAweDVBLCAweENEKX0sCisJeyJWaW9sZXQiLAkgICAgUkdCKDB4RUUsIDB4ODIsIDB4RUUpfSwKKyAgICB9OworCisgICAgLyogaXMgbmFtZSAjcnJnZ2JiIGZvcm1hdD8gKi8KKyAgICBpZiggbmFtZVswXSA9PSAnIycgJiYgU1RSTEVOKCBuYW1lICkgPT0gNyApCisgICAgeworCXIgPSBoZXhfZGlnaXQoIG5hbWVbMV0gKSAqIDE2ICsgaGV4X2RpZ2l0KCBuYW1lWzJdICk7CisJZyA9IGhleF9kaWdpdCggbmFtZVszXSApICogMTYgKyBoZXhfZGlnaXQoIG5hbWVbNF0gKTsKKwliID0gaGV4X2RpZ2l0KCBuYW1lWzVdICkgKiAxNiArIGhleF9kaWdpdCggbmFtZVs2XSApOworCWlmKCByIDwgMCB8fCBnIDwgMCB8fCBiIDwgMCApCisJICAgIHJldHVybiBJTlZBTENPTE9SOworCXJldHVybiggUkdCKCByLCBnLCBiICkgKTsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQVJSQVlfTEVOR1RIKCB0YWJsZSApOyBpKysgKQorICAgIHsKKwlpZiggU1RSSUNNUCggbmFtZSwgdGFibGVbaV0ubmFtZSApID09IDAgKQorCSAgICByZXR1cm4oIHRhYmxlW2ldLmNvbG91ciApOworICAgIH0KKworICAgIC8qCisgICAgICogTGFzdCBhdHRlbXB0LiBMb29rIGluIHRoZSBmaWxlICIkVklNUlVOVElNRS9yZ2IudHh0Ii4KKyAgICAgKi8KKyAgICB7CisjZGVmaW5lIExJTkVfTEVOIDEwMAorCUZJTEUJKmZkOworCWNoYXIJbGluZVtMSU5FX0xFTl07CisJY2hhcl91CSpmbmFtZTsKKworCWZuYW1lID0gZXhwYW5kX2Vudl9zYXZlKChjaGFyX3UgKikiJFZJTVJVTlRJTUUvcmdiLnR4dCIpOworCWlmIChmbmFtZSA9PSBOVUxMKQorCSAgICByZXR1cm4gSU5WQUxDT0xPUjsKKworCWZkID0gZm9wZW4oKGNoYXIgKilmbmFtZSwgInJ0Iik7CisJdmltX2ZyZWUoZm5hbWUpOworCWlmIChmZCA9PSBOVUxMKQorCSAgICByZXR1cm4gSU5WQUxDT0xPUjsKKworCXdoaWxlICghZmVvZihmZCkpCisJeworCSAgICBpbnQJICAgIGxlbjsKKwkgICAgaW50CSAgICBwb3M7CisJICAgIGNoYXIgICAgKmNvbG9yOworCisJICAgIGZnZXRzKGxpbmUsIExJTkVfTEVOLCBmZCk7CisJICAgIGxlbiA9IFNUUkxFTihsaW5lKTsKKworCSAgICBpZiAobGVuIDw9IDEgfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJY29udGludWU7CisKKwkgICAgbGluZVtsZW4tMV0gPSAnXDAnOworCisJICAgIGkgPSBzc2NhbmYobGluZSwgIiVkICVkICVkICVuIiwgJnIsICZnLCAmYiwgJnBvcyk7CisJICAgIGlmIChpICE9IDMpCisJCWNvbnRpbnVlOworCisJICAgIGNvbG9yID0gbGluZSArIHBvczsKKworCSAgICBpZiAoU1RSSUNNUChjb2xvciwgbmFtZSkgPT0gMCkKKwkgICAgeworCQlmY2xvc2UoZmQpOworCQlyZXR1cm4oIChndWljb2xvcl9UKSBSR0IocixnLGIpICk7CisJICAgIH0KKwl9CisKKwlmY2xvc2UoZmQpOworICAgIH0KKworCisgICAgcmV0dXJuIElOVkFMQ09MT1I7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9mZ19jb2xvcihndWljb2xvcl9UIGNvbG9yKQoreworICAgIFBnU2V0VGV4dENvbG9yKCBjb2xvciApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBQZ1NldEZpbGxDb2xvciggY29sb3IgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZShpbnQgcm93LCBpbnQgY29sLCBpbnQgbnIsIGludCBuYykKK3sKKyAgICBQaFJlY3RfdCByZWN0OworCisgICAgcmVjdC51bC54ID0gRklMTF9YKCBjb2wgKTsKKyAgICByZWN0LnVsLnkgPSBGSUxMX1koIHJvdyApOworCisgICAgLyogRklYTUU6IFRoaXMgaGFzIGFuIG9mZiBieSBvbmUgcGl4ZWwgcHJvYmxlbSAqLworICAgIHJlY3QubHIueCA9IHJlY3QudWwueCArIG5jICogZ3VpLmNoYXJfd2lkdGg7CisgICAgcmVjdC5sci55ID0gcmVjdC51bC55ICsgbnIgKiBndWkuY2hhcl9oZWlnaHQ7CisgICAgaWYoIG5jID4gMCApCisJcmVjdC5sci54IC09IDE7CisgICAgaWYoIG5yID4gMCApCisJcmVjdC5sci55IC09IDE7CisKKyAgICBEUkFXX1NUQVJUOworICAgIFBnU2V0RHJhd01vZGUoIFBnX0RyYXdNb2RlRFNUSU5WRVJUICk7CisgICAgUGdEcmF3UmVjdCggJnJlY3QsIFBnX0RSQVdfRklMTCApOworICAgIFBnU2V0RHJhd01vZGUoIFBnX0RyYXdNb2RlU1JDQ09QWSApOworICAgIERSQVdfRU5EOworfQorCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9ibG9jayhpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikKK3sKKyAgICBQaFJlY3RfdCBibG9jayA9IHsKKwl7IEZJTExfWCggY29sMSApLCBGSUxMX1koIHJvdzEgKSB9LAorCXsgRklMTF9YKCBjb2wyICsgMSApIC0gMSwgRklMTF9ZKCByb3cyICsgMSApIC0gMX0KKyAgICB9OworCisgICAgRFJBV19TVEFSVDsKKyAgICBndWlfbWNoX3NldF9iZ19jb2xvciggZ3VpLmJhY2tfcGl4ZWwgKTsKKyAgICBQZ0RyYXdSZWN0KCAmYmxvY2ssIFBnX0RSQVdfRklMTCApOworICAgIERSQVdfRU5EOworfQorCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9hbGwoKQoreworICAgIFBoUmVjdF90IHRleHRfcmVjdCA9IHsKKwl7IGd1aS5ib3JkZXJfd2lkdGgsIGd1aS5ib3JkZXJfd2lkdGggfSwKKwl7IENvbHVtbnMgKiBndWkuY2hhcl93aWR0aCArIGd1aS5ib3JkZXJfd2lkdGggLSAxICwKKwkgICAgUm93cyAqIGd1aS5jaGFyX2hlaWdodCArIGd1aS5ib3JkZXJfd2lkdGggLSAxIH0KKyAgICB9OworCisgICAgaWYoIGlzX2lnbm9yZV9kcmF3ID09IFRSVUUgKQorCXJldHVybjsKKworICAgIERSQVdfU1RBUlQ7CisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoIGd1aS5iYWNrX3BpeGVsICk7CisgICAgUGdEcmF3UmVjdCggJnRleHRfcmVjdCwgUGdfRFJBV19GSUxMICk7CisgICAgRFJBV19FTkQ7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2RlbGV0ZV9saW5lcyhpbnQgcm93LCBpbnQgbnVtX2xpbmVzKQoreworICAgIFBoUmVjdF90ICAgIHJlY3Q7CisgICAgUGhQb2ludF90ICAgZGVsdGE7CisKKyAgICByZWN0LnVsLnggPSBGSUxMX1goIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQgKTsKKyAgICByZWN0LnVsLnkgPSBGSUxMX1koIHJvdyArIG51bV9saW5lcyApOworCisgICAgcmVjdC5sci54ID0gRklMTF9YKCBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCArIDEgKSAtIDE7CisgICAgcmVjdC5sci55ID0gRklMTF9ZKCBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgKyAxKSAtIDE7CisKKyAgICBQdFdpZGdldE9mZnNldCggZ3VpLnZpbVRleHRBcmVhLCAmZ3VpX3BoX3Jhd19vZmZzZXQgKTsKKyAgICBQaFRyYW5zbGF0ZVBvaW50KCAmZ3VpX3BoX3Jhd19vZmZzZXQsIFB0V2lkZ2V0UG9zKGd1aS52aW1UZXh0QXJlYSwgTlVMTCkpOworICAgIFBoVHJhbnNsYXRlUmVjdCggJnJlY3QsICZndWlfcGhfcmF3X29mZnNldCApOworCisgICAgZGVsdGEueCA9IDA7CisgICAgZGVsdGEueSA9IC1udW1fbGluZXMgKiBndWkuY2hhcl9oZWlnaHQ7CisKKyAgICBQZ0ZsdXNoKCk7CisKKyAgICBQaEJsaXQoIFB0V2lkZ2V0UmlkKCBQdEZpbmREaXNqb2ludCggZ3VpLnZpbVRleHRBcmVhICkgKSwgJnJlY3QsICZkZWx0YSApOworCisgICAgZ3VpX2NsZWFyX2Jsb2NrKAorCWd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcyArIDEsCisJZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwlndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsCisJZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfaW5zZXJ0X2xpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgUGhSZWN0X3QgICAgcmVjdDsKKyAgICBQaFBvaW50X3QgICBkZWx0YTsKKworICAgIHJlY3QudWwueCA9IEZJTExfWCggZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCApOworICAgIHJlY3QudWwueSA9IEZJTExfWSggcm93ICk7CisKKyAgICByZWN0LmxyLnggPSBGSUxMX1goIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ICsgMSApIC0gMTsKKyAgICByZWN0LmxyLnkgPSBGSUxMX1koIGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcyArIDEgKSAtIDE7CisKKyAgICBQdFdpZGdldE9mZnNldCggZ3VpLnZpbVRleHRBcmVhLCAmZ3VpX3BoX3Jhd19vZmZzZXQgKTsKKyAgICBQaFRyYW5zbGF0ZVBvaW50KCAmZ3VpX3BoX3Jhd19vZmZzZXQsIFB0V2lkZ2V0UG9zKCBndWkudmltVGV4dEFyZWEsIE5VTEwgKSApOworICAgIFBoVHJhbnNsYXRlUmVjdCggJnJlY3QsICZndWlfcGhfcmF3X29mZnNldCApOworCisgICAgZGVsdGEueCA9IDA7CisgICAgZGVsdGEueSA9IG51bV9saW5lcyAqIGd1aS5jaGFyX2hlaWdodDsKKworICAgIFBnRmx1c2goKTsKKworICAgIFBoQmxpdCggUHRXaWRnZXRSaWQoIFB0RmluZERpc2pvaW50KCBndWkudmltVGV4dEFyZWEgKSApICwgJnJlY3QsICZkZWx0YSApOworCisgICAgZ3VpX2NsZWFyX2Jsb2NrKCByb3csIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJICAgIHJvdyArIG51bV9saW5lcyAtIDEsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ICk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2RyYXdfc3RyaW5nKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKQoreworICAgIHN0YXRpYyBjaGFyICp1dGY4X2J1ZmZlciA9IE5VTEw7CisgICAgc3RhdGljIGludAl1dGY4X2xlbiA9IDA7CisKKyAgICBQaFBvaW50X3QJcG9zID0geyBURVhUX1goIGNvbCApLCBURVhUX1koIHJvdyApIH07CisgICAgUGhSZWN0X3QJcmVjdDsKKworICAgIGlmKCBpc19pZ25vcmVfZHJhdyA9PSBUUlVFICkKKwlyZXR1cm47CisKKyAgICBEUkFXX1NUQVJUOworCisgICAgaWYoICEoIGZsYWdzICYgRFJBV19UUkFOU1AgKSApCisgICAgeworCVBnRHJhd0lSZWN0KAorCQlGSUxMX1goIGNvbCApLCBGSUxMX1koIHJvdyApLAorCQlGSUxMX1goIGNvbCArIGxlbiApIC0gMSwgRklMTF9ZKCByb3cgKyAxICkgLSAxLAorCQlQZ19EUkFXX0ZJTEwgKTsKKyAgICB9CisKKyAgICBpZiggZmxhZ3MgJiBEUkFXX1VOREVSTCApCisJUGdTZXRVbmRlcmxpbmUoIGd1aS5ub3JtX3BpeGVsLCBQZ19UUkFOU1BBUkVOVCwgMCApOworCisgICAgaWYoIGNoYXJzZXRfdHJhbnNsYXRlICE9IE5VTEwKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgICYmIGVuY191dGY4ID09IDAKKyNlbmRpZgorCSAgICApCisgICAgeworCWludCBzcmNfdGFrZW4sIGRzdF9tYWRlOworCisJLyogVXNlIGEgc3RhdGljIGJ1ZmZlciB0byBhdm9pZCBsYXJnZSBhbW91bnRzIG9mIGRlL2FsbG9jYXRpb25zICovCisJaWYoIHV0ZjhfbGVuIDwgbGVuICkKKwl7CisJICAgIHV0ZjhfYnVmZmVyID0gcmVhbGxvYyggdXRmOF9idWZmZXIsIGxlbiAqIE1CX0xFTl9NQVggKTsKKwkgICAgdXRmOF9sZW4gPSBsZW47CisJfQorCisJUHhUcmFuc2xhdGVUb1VURigKKwkJY2hhcnNldF90cmFuc2xhdGUsCisJCXMsCisJCWxlbiwKKwkJJnNyY190YWtlbiwKKwkJdXRmOF9idWZmZXIsCisJCXV0ZjhfbGVuLAorCQkmZHN0X21hZGUgKTsKKwlzID0gdXRmOF9idWZmZXI7CisJbGVuID0gZHN0X21hZGU7CisgICAgfQorCisgICAgUGdEcmF3VGV4dCggcywgbGVuLCAmcG9zLCAwICk7CisKKyAgICBpZiggZmxhZ3MgJiBEUkFXX0JPTEQgKQorICAgIHsKKwkvKiBGSVhNRTogdHJ5IGFuZCBvbmx5IGNhbGN1bGF0ZSB0aGVzZSB2YWx1ZXMgb25jZS4uLiAqLworCXJlY3QudWwueCA9IEZJTExfWCggY29sICkgKyAxOworCXJlY3QudWwueSA9IEZJTExfWSggcm93ICk7CisJcmVjdC5sci54ID0gRklMTF9YKCBjb2wgKyBsZW4gKSAtIDE7CisJcmVjdC5sci55ID0gRklMTF9ZKCByb3cgKyAxKSAtIDE7CisJLyogUGdTZXRVc2VyQ2xpcCggTlVMTCApIGNhdXNlcyB0aGUgc2Nyb2xsYmFyIHRvIG5vdCByZWRyYXcuLi4gKi8KKyNpZiAwCisJcG9zLngrKzsKKworCVBnU2V0VXNlckNsaXAoICZyZWN0ICk7CisJUGdEcmF3VGV4dCggcywgbGVuLCAmcG9zLCAwICk7CisJUGdTZXRVc2VyQ2xpcCggTlVMTCApOworI2Vsc2UKKwlyZWN0LmxyLnkgLT0gKCBwX2xpbmVzcGFjZSArIDEgKSAvIDI7CisJLyogWFhYOiBEcmF3VGV4dEFyZWEgZG9lc24ndCB3b3JrIHdpdGggcGhkaXR0byAqLworCVBnRHJhd1RleHRBcmVhKCBzLCBsZW4sICZyZWN0LCBQZ19URVhUX0JPVFRPTSApOworI2VuZGlmCisgICAgfQorCisgICAgaWYoIGZsYWdzICYgRFJBV19VTkRFUkwgKQorCVBnU2V0VW5kZXJsaW5lKCBQZ19UUkFOU1BBUkVOVCwgUGdfVFJBTlNQQVJFTlQsIDAgKTsKKworICAgIERSQVdfRU5EOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEN1cnNvciAqLworCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IoZ3VpY29sb3JfVCBjb2xvcikKK3sKKyAgICBQaFJlY3RfdCByOworCisgICAgLyogRklYTUU6IERvdWJsZSB3aWR0aCBjaGFyYWN0ZXJzICovCisKKyAgICByLnVsLnggPSBGSUxMX1goIGd1aS5jb2wgKTsKKyAgICByLnVsLnkgPSBGSUxMX1koIGd1aS5yb3cgKTsKKyAgICByLmxyLnggPSByLnVsLnggKyBndWkuY2hhcl93aWR0aCAtIDE7CisgICAgci5sci55ID0gci51bC55ICsgZ3VpLmNoYXJfaGVpZ2h0IC0gMTsKKworICAgIERSQVdfU1RBUlQ7CisgICAgUGdTZXRTdHJva2VDb2xvciggY29sb3IgKTsKKyAgICBQZ0RyYXdSZWN0KCAmciwgUGdfRFJBV19TVFJPS0UgKTsKKyAgICBEUkFXX0VORDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19wYXJ0X2N1cnNvcihpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgUGhSZWN0X3QgcjsKKworICAgIHIudWwueCA9IEZJTExfWCggZ3VpLmNvbCApOworICAgIHIudWwueSA9IEZJTExfWSggZ3VpLnJvdyApICsgZ3VpLmNoYXJfaGVpZ2h0IC0gaDsKKyAgICByLmxyLnggPSByLnVsLnggKyB3IC0gMTsKKyAgICByLmxyLnkgPSByLnVsLnkgKyBoIC0gMTsKKworICAgIERSQVdfU1RBUlQ7CisgICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoIGNvbG9yICk7CisgICAgUGdEcmF3UmVjdCggJnIsIFBnX0RSQVdfRklMTCApOworICAgIERSQVdfRU5EOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfYmxpbmtpbmcobG9uZyB3YWl0LCBsb25nIG9uLCBsb25nIG9mZikKK3sKKyAgICBibGlua193YWl0dGltZSA9IHdhaXQ7CisgICAgYmxpbmtfb250aW1lID0gb247CisgICAgYmxpbmtfb2ZmdGltZSA9IG9mZjsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc3RhcnRfYmxpbmsodm9pZCkKK3sKKyAgICAvKiBPbmx5IHR1cm4gb24gdGhlIHRpbWVyIG9uIGlmIG5vbmUgb2YgdGhlIHRpbWVzIGFyZSB6ZXJvICovCisgICAgaWYoIGJsaW5rX3dhaXR0aW1lICYmIGJsaW5rX29udGltZSAmJiBibGlua19vZmZ0aW1lICYmIGd1aS5pbl9mb2N1cykKKyAgICB7CisJUHRTZXRSZXNvdXJjZSggZ3VpX3BoX3RpbWVyX2N1cnNvciwgUHRfQVJHX1RJTUVSX0lOSVRJQUwsCisJCWJsaW5rX3dhaXR0aW1lLCAwICk7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9zdG9wX2JsaW5rKHZvaWQpCit7CisgICAgUHRTZXRSZXNvdXJjZSggZ3VpX3BoX3RpbWVyX2N1cnNvciwgUHRfQVJHX1RJTUVSX0lOSVRJQUwsIDAsIDAgKTsKKworICAgIGlmKCBibGlua19zdGF0ZSA9PSBCTElOS19PRkYgKQorCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKworICAgIGJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworCisgICAgdm9pZAorZ3VpX21jaF9iZWVwKHZvaWQpCit7CisgICAgUHRCZWVwKCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2ZsYXNoKGludCBtc2VjKQoreworICAgIFBnU2V0RmlsbFhPUkNvbG9yKCBQZ19CTEFDSywgUGdfV0hJVEUgKTsKKyAgICBQZ1NldERyYXdNb2RlKCBQZ19EUkFXTU9ERV9YT1IgKTsKKyAgICBndWlfbWNoX2NsZWFyX2FsbCgpOworICAgIGd1aV9tY2hfZmx1c2goKTsKKworICAgIHVpX2RlbGF5KCAobG9uZykgbXNlYywgVFJVRSApOworCisgICAgZ3VpX21jaF9jbGVhcl9hbGwoKTsKKyAgICBQZ1NldERyYXdNb2RlKCBQZ19EUkFXTU9ERV9PUEFRVUUgKTsKKyAgICBndWlfbWNoX2ZsdXNoKCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2ZsdXNoKHZvaWQpCit7CisgICAgUGdGbHVzaCgpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBQaEFyZWFfdCBhcmVhID0ge3t4LCB5fSwge3csIGh9fTsKKworICAgIFB0U2V0UmVzb3VyY2UoIGd1aS52aW1UZXh0QXJlYSwgUHRfQVJHX0FSRUEsICZhcmVhLCAwICk7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KGNoYXJfdSAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IDA7IGkrKykKKwlpZiAobmFtZVswXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwICYmCisJCSBuYW1lWzFdID09IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEpCisJICAgIHJldHVybiggT0sgKTsKKyAgICByZXR1cm4oIEZBSUwgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZW51ICovCisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyNpbmNsdWRlICJ0b29sYmFyLnBoaSIKKworc3RhdGljIFBoSW1hZ2VfdCAqZ3VpX3BoX3Rvb2xiYXJfaW1hZ2VzW10gPSB7CisgICAgJnRiX25ld19waGksCisgICAgJnRiX29wZW5fcGhpLAorICAgICZ0Yl9zYXZlX3BoaSwKKyAgICAmdGJfdW5kb19waGksCisgICAgJnRiX3JlZG9fcGhpLAorICAgICZ0Yl9jdXRfcGhpLAorICAgICZ0Yl9jb3B5X3BoaSwKKyAgICAmdGJfcGFzdGVfcGhpLAorICAgICZ0Yl9wcmludF9waGksCisgICAgJnRiX2hlbHBfcGhpLAorICAgICZ0Yl9maW5kX3BoaSwKKyAgICAmdGJfc2F2ZV9hbGxfcGhpLAorICAgICZ0Yl9zYXZlX3Nlc3Npb25fcGhpLAorICAgICZ0Yl9uZXdfc2Vzc2lvbl9waGksCisgICAgJnRiX2xvYWRfc2Vzc2lvbl9waGksCisgICAgJnRiX21hY3JvX3BoaSwKKyAgICAmdGJfcmVwbGFjZV9waGksCisgICAgJnRiX2Nsb3NlX3BoaSwKKyAgICAmdGJfbWF4aW1pemVfcGhpLAorICAgICZ0Yl9taW5pbWl6ZV9waGksCisgICAgJnRiX3NwbGl0X3BoaSwKKyAgICAmdGJfc2hlbGxfcGhpLAorICAgICZ0Yl9maW5kX3ByZXZfcGhpLAorICAgICZ0Yl9maW5kX25leHRfcGhpLAorICAgICZ0Yl9maW5kX2hlbHBfcGhpLAorICAgICZ0Yl9tYWtlX3BoaSwKKyAgICAmdGJfanVtcF9waGksCisgICAgJnRiX2N0YWdzX3BoaSwKKyAgICAmdGJfdnNwbGl0X3BoaSwKKyAgICAmdGJfbWF4d2lkdGhfcGhpLAorICAgICZ0Yl9taW53aWR0aF9waGkKK307CisKK3N0YXRpYyBQaEltYWdlX3QgKgorZ3VpX3BoX3Rvb2xiYXJfbG9hZF9pY29uKCBjaGFyX3UgKmljb25maWxlICkKK3sKKyAgICBzdGF0aWMgUGhJbWFnZV90IGV4dGVybmFsX2ljb247CisgICAgUGhJbWFnZV90ICp0ZW1wX3BoaSA9IE5VTEw7CisKKyAgICB0ZW1wX3BoaSA9IFB4TG9hZEltYWdlKCBpY29uZmlsZSwgTlVMTCApOworICAgIGlmKCB0ZW1wX3BoaSAhPSBOVUxMICkKKyAgICB7CisJLyogVGhlIGxhYmVsIHdpZGdldCB3aWxsIGZyZWUgdGhlIGltYWdlL3BhbGV0dGUvZXRjLiBmb3IgdXMgd2hlbgorCSAqIGl0J3MgZGVzdHJveWVkICovCisJdGVtcF9waGktPmZsYWdzIHw9IFBoX1JFTEVBU0VfSU1BR0VfQUxMOworCW1lbWNweSggJmV4dGVybmFsX2ljb24sIHRlbXBfcGhpLCBzaXplb2YoIGV4dGVybmFsX2ljb24gKSApOworCWZyZWUoIHRlbXBfcGhpICk7CisKKwl0ZW1wX3BoaSA9ICZleHRlcm5hbF9pY29uOworICAgIH0KKyAgICByZXR1cm4oIHRlbXBfcGhpICk7Cit9CisKKy8qCisgKiBUaGlzIHJldHVybnMgZWl0aGVyIGEgYnVpbHRpbiBpY29uIGltYWdlLCBhbiBleHRlcm5hbCBpbWFnZSBvciBOVUxMCisgKiBpZiBpdCBjYW4ndCBmaW5kIGVpdGhlci4gIFRoZSBjYWxsZXIgY2FuJ3QgYW5kIGRvZXNuJ3QgbmVlZCB0byB0cnkgYW5kCisgKiBmcmVlKCkgdGhlIHJldHVybmVkIGltYWdlLCBhbmQgaXQgY2FuJ3Qgc3RvcmUgdGhlIGltYWdlIHBvaW50ZXIuCisgKiAoV2hlbiBzZXR0aW5nIHRoZSBQdF9BUkdfTEFCRUxfSU1BR0UgcmVzb3VyY2UsIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIFBoSW1hZ2VfdCBhcmUgY29waWVkLCBhbmQgdGhlIG9yaWdpbmFsIFBoSW1hZ2VfdCBhcmVuJ3QgbmVlZGVkIGFueW1vcmUpLgorICovCitzdGF0aWMgUGhJbWFnZV90ICoKK2d1aV9waF90b29sYmFyX2ZpbmRfaWNvbiggdmltbWVudV9UICptZW51ICkKK3sKKyAgICBjaGFyX3UgZnVsbF9wYXRobmFtZVsgTUFYUEFUSEwgKyAxIF07CisgICAgUGhJbWFnZV90ICppY29uID0gTlVMTDsKKworICAgIGlmKCBtZW51LT5pY29uX2J1aWx0aW4gPT0gRkFMU0UgKQorICAgIHsKKwlpZiggbWVudS0+aWNvbmZpbGUgIT0gTlVMTCApCisJICAgIC8qIFRPRE86IHVzZSBndWlfZmluZF9pY29uZmlsZSgpICovCisJICAgIGljb24gPSBndWlfcGhfdG9vbGJhcl9sb2FkX2ljb24oIG1lbnUtPmljb25maWxlICk7CisKKwkvKiBUT0RPOiBSZXN0cmljdCBsb2FkaW5nIHRvIGp1c3QgLnBuZz8gU2VhcmNoIGZvciBhbnkgZm9ybWF0PyAqLworCWlmKCAoIGljb24gPT0gTlVMTCApICYmCisJICAgICggKCBndWlfZmluZF9iaXRtYXAoIG1lbnUtPm5hbWUsIGZ1bGxfcGF0aG5hbWUsICJnaWYiICkgPT0gT0sgKSB8fAorCSAgICAgICggZ3VpX2ZpbmRfYml0bWFwKCBtZW51LT5uYW1lLCBmdWxsX3BhdGhuYW1lLCAicG5nIiApID09IE9LICkgKSApCisJICAgIGljb24gPSBndWlfcGhfdG9vbGJhcl9sb2FkX2ljb24oIGZ1bGxfcGF0aG5hbWUgKTsKKworCWlmKCBpY29uICE9IE5VTEwgKQorCSAgICByZXR1cm4oIGljb24gKTsKKyAgICB9CisKKyAgICBpZiggbWVudS0+aWNvbmlkeCA+PSAwICYmCisJICAgICggbWVudS0+aWNvbmlkeCA8IEFSUkFZX0xFTkdUSCggZ3VpX3BoX3Rvb2xiYXJfaW1hZ2VzICkgKSApCisgICAgeworCXJldHVybiggZ3VpX3BoX3Rvb2xiYXJfaW1hZ2VzWyBtZW51LT5pY29uaWR4IF0gKTsKKyAgICB9CisKKyAgICByZXR1cm4oIE5VTEwgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCggRkVBVF9NRU5VICkgfHwgZGVmaW5lZCggUFJPVE8gKQorICAgIHZvaWQKK2d1aV9tY2hfZW5hYmxlX21lbnUoaW50IGZsYWcpCit7CisgICAgaWYoIGZsYWcgIT0gMCApCisJUHRSZWFsaXplV2lkZ2V0KCBndWkudmltTWVudUJhciApOworICAgIGVsc2UKKwlQdFVucmVhbGl6ZVdpZGdldCggZ3VpLnZpbU1lbnVCYXIgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X21lbnVfcG9zKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIC8qIE5vdGhpbmcgKi8KK30KKworLyogQ2hhbmdlIHRoZSBwb3NpdGlvbiBvZiBhIG1lbnUgYnV0dG9uIGluIHRoZSBwYXJlbnQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3BoX3Bvc2l0aW9uX21lbnUoIFB0V2lkZ2V0X3QgKndpZGdldCwgaW50IHByaW9yaXR5ICkKK3sKKyAgICBQdFdpZGdldF90CSp0cmF2ZXJzZTsKKyAgICB2aW1tZW51X1QJKm1lbnU7CisKKyAgICB0cmF2ZXJzZSA9IFB0V2lkZ2V0Q2hpbGRCYWNrKCBQdFdpZGdldFBhcmVudCggd2lkZ2V0ICkgKTsKKworICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB3aWRnZXRzIGluIHRyYXZlcnNlLCB1bnRpbAorICAgICAqIHdlIGZpbmQgdGhlIHBvc2l0aW9uIHdlIHdhbnQgdG8gaW5zZXJ0IG91ciB3aWRnZXQgaW50byAqLworICAgIC8qIFRPRE86IHRyYXZlcnNlIGZyb20gZnJvbnQgdG8gYmFjaywgcG9zc2libGUgc3BlZWR1cD8gKi8KKyAgICB3aGlsZSggdHJhdmVyc2UgIT0gTlVMTCApCisgICAgeworCVB0R2V0UmVzb3VyY2UoIHRyYXZlcnNlLCBQdF9BUkdfUE9JTlRFUiwgJm1lbnUsIDAgKTsKKworCWlmKCBtZW51ICE9IE5VTEwgJiYKKwkJcHJpb3JpdHkgPCBtZW51LT5wcmlvcml0eSAmJgorCQl3aWRnZXQgIT0gdHJhdmVyc2UgKQorCXsKKwkgICAgLyogSW5zZXJ0IHRoZSB3aWRnZXQgYmVmb3JlIHRoZSBjdXJyZW50IHRyYXZlcnNlIHdpZGdldCAqLworCSAgICBQdFdpZGdldEluc2VydCggd2lkZ2V0LCB0cmF2ZXJzZSwgMSApOworCSAgICByZXR1cm47CisJfQorCisJdHJhdmVyc2UgPSBQdFdpZGdldEJyb3RoZXJJbkZyb250KCB0cmF2ZXJzZSApOworICAgIH0KK30KKworLyogdGhlIGluZGV4IGlzIGlnbm9yZWQgYmVjYXVzZSBpdCdzIG5vdCB1c2VmdWwgZm9yIG91ciBwdXJwb3NlcyAqLworICAgIHZvaWQKK2d1aV9tY2hfYWRkX21lbnUodmltbWVudV9UICptZW51LCBpbnQgaW5kZXgpCit7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisgICAgY2hhcl91CSphY2NlbF9rZXk7CisgICAgY2hhcl91CW1uZW1vbmljX3N0cltNQl9MRU5fTUFYXTsKKyAgICBpbnQJICAgIG47CisgICAgUHRBcmdfdCBhcmdzWzVdOworCisgICAgbWVudS0+c3VibWVudV9pZCA9IG1lbnUtPmlkID0gTlVMTDsKKworICAgIGlmKCBtZW51X2lzX21lbnViYXIoIG1lbnUtPm5hbWUgKSApCisgICAgeworCisJYWNjZWxfa2V5ID0gdmltX3N0cmNociggbWVudS0+bmFtZSwgJyYnICk7CisJaWYoIGFjY2VsX2tleSAhPSBOVUxMICkKKwl7CisJICAgIG1uZW1vbmljX3N0clswXSA9IGFjY2VsX2tleVsxXTsKKwkgICAgbW5lbW9uaWNfc3RyWzFdID0gTlVMOworCX0KKworCS8qIENyZWF0ZSB0aGUgbWVudSBidXR0b24gKi8KKwluID0gMDsKKwlQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfVEVYVF9TVFJJTkcsIG1lbnUtPmRuYW1lLCAwICk7CisJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0FDQ0VMX1RFWFQsIG1lbnUtPmFjdGV4dCwgMCApOworCWlmKCBhY2NlbF9rZXkgIT0gTlVMTCApCisJICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19BQ0NFTF9LRVksIG1uZW1vbmljX3N0ciwgMCApOworCVB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19QT0lOVEVSLCBtZW51LCAwICk7CisKKwlpZiggcGFyZW50ICE9IE5VTEwgKQorCSAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfQlVUVE9OX1RZUEUsIFB0X01FTlVfUklHSFQsIDAgKTsKKworCW1lbnUtPmlkID0gUHRDcmVhdGVXaWRnZXQoIFB0TWVudUJ1dHRvbiwKKwkJKHBhcmVudCA9PSBOVUxMKSA/IGd1aS52aW1NZW51QmFyIDogcGFyZW50LT5zdWJtZW51X2lkLAorCQluLCBhcmdzICk7CisKKwlQdEFkZENhbGxiYWNrKCBtZW51LT5pZCwgUHRfQ0JfQVJNLCBndWlfcGhfaGFuZGxlX3B1bGxkb3duX21lbnUsIG1lbnUgKTsKKworCS8qIENyZWF0ZSB0aGUgYWN0dWFsIG1lbnUgKi8KKwluID0gMDsKKwlpZiggcGFyZW50ICE9IE5VTEwgKQorCSAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTUVOVV9GTEFHUywgUHRfVFJVRSwgUHRfTUVOVV9DSElMRCApOworCisJbWVudS0+c3VibWVudV9pZCA9IFB0Q3JlYXRlV2lkZ2V0KCBQdE1lbnUsIG1lbnUtPmlkLCBuLCBhcmdzICk7CisKKwlpZiggcGFyZW50ID09IE5VTEwgKQorCXsKKwkgICAgUHRBZGRDYWxsYmFjayggbWVudS0+c3VibWVudV9pZCwgUHRfQ0JfVU5SRUFMSVpFRCwKKwkJICAgIGd1aV9waF9oYW5kbGVfbWVudV91bnJlYWxpemVkLCBtZW51ICk7CisKKwkgICAgaWYoIG1lbnUtPm1uZW1vbmljICE9IDAgKQorCSAgICB7CisJCVB0QWRkSG90a2V5SGFuZGxlciggZ3VpLnZpbVdpbmRvdywgdG9sb3dlciggbWVudS0+bW5lbW9uaWMgKSwKKwkJCVBrX0tNX0FsdCwgMCwgbWVudSwgZ3VpX3BoX2hhbmRsZV9wdWxsZG93bl9tZW51ICk7CisJICAgIH0KKwl9CisKKwlndWlfcGhfcG9zaXRpb25fbWVudSggbWVudS0+aWQsIG1lbnUtPnByaW9yaXR5ICk7CisKKwkvKiBSZWRyYXcgbWVudWJhciBoZXJlIGluc3RlYWQgb2YgZ3VpX21jaF9kcmF3X21lbnViYXIgKi8KKwlpZiggZ3VpLm1lbnVfaXNfYWN0aXZlICkKKwkgICAgUHRSZWFsaXplV2lkZ2V0KCBtZW51LT5pZCApOworICAgIH0KKyAgICBlbHNlIGlmKCBtZW51X2lzX3BvcHVwKCBtZW51LT5uYW1lICkgKQorICAgIHsKKwltZW51LT5zdWJtZW51X2lkID0gUHRDcmVhdGVXaWRnZXQoIFB0TWVudSwgZ3VpLnZpbVdpbmRvdywgMCwgTlVMTCApOworCVB0QWRkQ2FsbGJhY2soIG1lbnUtPnN1Ym1lbnVfaWQsIFB0X0NCX1VOUkVBTElaRUQsCisJCWd1aV9waF9oYW5kbGVfbWVudV91bnJlYWxpemVkLCBtZW51ICk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudV9pdGVtKHZpbW1lbnVfVCAqbWVudSwgaW50IGluZGV4KQoreworICAgIHZpbW1lbnVfVAkqcGFyZW50ID0gbWVudS0+cGFyZW50OworICAgIGNoYXJfdQkqYWNjZWxfa2V5OworICAgIGNoYXJfdQltbmVtb25pY19zdHJbTUJfTEVOX01BWF07CisgICAgaW50CSAgICBuOworICAgIFB0QXJnX3QgYXJnc1sxM107CisKKyAgICBuID0gMDsKKyAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfUE9JTlRFUiwgbWVudSwgMCApOworCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgaWYoIG1lbnVfaXNfdG9vbGJhciggcGFyZW50LT5uYW1lICkgKQorICAgIHsKKwlpZiggbWVudV9pc19zZXBhcmF0b3IoIG1lbnUtPm5hbWUgKSApCisJeworCSAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfU0VQX0ZMQUdTLAorCQkgICAgUHRfU0VQX1ZFUlRJQ0FMLCBQdF9TRVBfT1JJRU5UQVRJT04gKTsKKwkgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1NFUF9UWVBFLCBQdF9FVENIRURfSU4sIDAgKTsKKwkgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0FOQ0hPUl9GTEFHUywKKwkJICAgIFB0X1RSVUUsIFB0X0FOQ0hPUl9UT1BfQk9UVE9NICk7CisJICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19XSURUSCwgMiwgMCApOworCSAgICBtZW51LT5pZCA9IFB0Q3JlYXRlV2lkZ2V0KCBQdFNlcGFyYXRvciwgZ3VpLnZpbVRvb2xCYXIsIG4sIGFyZ3MgKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYoIHN0cnN0ciggKGNvbnN0IGNoYXIgKikgcF90b29sYmFyLCAidGV4dCIgKSAhPSBOVUxMICkKKwkgICAgeworCQlQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfQkFMTE9PTl9QT1NJVElPTiwKKwkJCVB0X0JBTExPT05fQk9UVE9NLCAwICk7CisJCVB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19URVhUX1NUUklORywgbWVudS0+ZG5hbWUsIDAgKTsKKwkJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1RFWFRfRk9OVCwgIlRleHRGb250MDgiLCAwICk7CisJICAgIH0KKwkgICAgaWYoICggc3Ryc3RyKCAoY29uc3QgY2hhciAqKSBwX3Rvb2xiYXIsICJpY29ucyIgKSAhPSBOVUxMICkgJiYKKwkJICAgICggZ3VpX3BoX3Rvb2xiYXJfaW1hZ2VzICE9IE5VTEwgKSApCisJICAgIHsKKwkJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0xBQkVMX0lNQUdFLAorCQkJZ3VpX3BoX3Rvb2xiYXJfZmluZF9pY29uKCBtZW51ICksIDAgKTsKKwkJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0xBQkVMX1RZUEUsIFB0X1RFWFRfSU1BR0UsIDAgKTsKKwkJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX1RFWFRfSU1BR0VfU1BBQ0lORywgMCwgMCApOworCSAgICB9CisJICAgIGlmKCBzdHJzdHIoIChjb25zdCBjaGFyICopIHBfdG9vbGJhciwgInRvb2x0aXBzIiApICE9IE5VTEwgKQorCSAgICB7CisJCVB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19MQUJFTF9CQUxMT09OLAorCQkJZ3VpX3BoX3Nob3dfdG9vbHRpcCwgMCApOworCQlQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTEFCRUxfRkxBR1MsCisJCQlQdF9UUlVFLCBQdF9TSE9XX0JBTExPT04gKTsKKwkgICAgfQorCSAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTUFSR0lOX0hFSUdIVCwgMSwgMCApOworCSAgICBQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfTUFSR0lOX1dJRFRILCAxLCAwICk7CisJICAgIFB0U2V0QXJnKCAmYXJnc1sgbisrIF0sIFB0X0FSR19GTEFHUywgUHRfRkFMU0UsCisJCSAgICBQdF9ISUdITElHSFRFRCB8IFB0X0dFVFNfRk9DVVMgKTsKKwkgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0ZJTExfQ09MT1IsIFBnX1RSQU5TUEFSRU5ULCAwICk7CisJICAgIG1lbnUtPmlkID0gUHRDcmVhdGVXaWRnZXQoIFB0QnV0dG9uLCBndWkudmltVG9vbEJhciwgbiwgYXJncyApOworCisJICAgIFB0QWRkQ2FsbGJhY2soIG1lbnUtPmlkLCBQdF9DQl9BQ1RJVkFURSwgZ3VpX3BoX2hhbmRsZV9tZW51LCBtZW51ICk7CisJfQorCS8qIFVwZGF0ZSB0b29sYmFyIGlmIGl0J3Mgb3BlbiAqLworCWlmKCBQdFdpZGdldElzUmVhbGl6ZWQoIGd1aS52aW1Ub29sQmFyICkgKQorCSAgICBQdFJlYWxpemVXaWRnZXQoIG1lbnUtPmlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWlmKCBtZW51X2lzX3NlcGFyYXRvciggbWVudS0+bmFtZSApICkKKyAgICB7CisJbWVudS0+aWQgPSBQdENyZWF0ZVdpZGdldCggUHRTZXBhcmF0b3IsIHBhcmVudC0+c3VibWVudV9pZCwgbiwgYXJncyApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWFjY2VsX2tleSA9IHZpbV9zdHJjaHIoIG1lbnUtPm5hbWUsICcmJyApOworCWlmKCBhY2NlbF9rZXkgIT0gTlVMTCApCisJeworCSAgICBtbmVtb25pY19zdHJbMF0gPSBhY2NlbF9rZXlbMV07CisJICAgIG1uZW1vbmljX3N0clsxXSA9IE5VTDsKKwl9CisKKwlQdFNldEFyZyggJmFyZ3NbIG4rKyBdLCBQdF9BUkdfVEVYVF9TVFJJTkcsIG1lbnUtPmRuYW1lLCAwICk7CisJaWYoIGFjY2VsX2tleSAhPSBOVUxMICkKKwkgICAgUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0FDQ0VMX0tFWSwgbW5lbW9uaWNfc3RyLAorCQkgICAgMCApOworCisJUHRTZXRBcmcoICZhcmdzWyBuKysgXSwgUHRfQVJHX0FDQ0VMX1RFWFQsIG1lbnUtPmFjdGV4dCwgMCApOworCisJbWVudS0+aWQgPSBQdENyZWF0ZVdpZGdldCggUHRNZW51QnV0dG9uLCBwYXJlbnQtPnN1Ym1lbnVfaWQsIG4sIGFyZ3MgKTsKKworCVB0QWRkQ2FsbGJhY2soIG1lbnUtPmlkLCBQdF9DQl9BQ1RJVkFURSwgZ3VpX3BoX2hhbmRsZV9tZW51LCBtZW51ICk7CisKKyNpZmRlZiBVU0VfUEFORUxfR1JPVVAKKwlpZiggZ3VpX3BoX2lzX2J1ZmZlcl9pdGVtKCBtZW51LCBwYXJlbnQgKSA9PSBUUlVFICkKKwl7CisJICAgIFB0QWRkQ2FsbGJhY2soIG1lbnUtPmlkLCBQdF9DQl9ERVNUUk9ZRUQsCisJCSAgICBndWlfcGhfaGFuZGxlX2J1ZmZlcl9yZW1vdmUsIG1lbnUgKTsKKwkgICAgZ3VpX3BoX3BnX2FkZF9idWZmZXIoIG1lbnUtPmRuYW1lICk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgZ3VpX3BoX3Bvc2l0aW9uX21lbnUoIG1lbnUtPmlkLCBtZW51LT5wcmlvcml0eSApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X21lbnUodmltbWVudV9UICptZW51KQoreworICAgIGlmKCBtZW51LT5zdWJtZW51X2lkICE9IE5VTEwgKQorCVB0RGVzdHJveVdpZGdldCggbWVudS0+c3VibWVudV9pZCApOworICAgIGlmKCBtZW51LT5pZCAhPSBOVUxMICkKKwlQdERlc3Ryb3lXaWRnZXQoIG1lbnUtPmlkICk7CisKKyAgICBtZW51LT5zdWJtZW51X2lkID0gTlVMTDsKKyAgICBtZW51LT5pZCA9IE5VTEw7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KQoreworICAgIGxvbmcgICAgZmxhZ3MsIG1hc2ssIGZpZWxkczsKKworICAgIGlmKCBtZW51LT5pZCA9PSBOVUxMICkKKwlyZXR1cm47CisKKyAgICBmbGFncyA9IFB0V2lkZ2V0RmxhZ3MoIG1lbnUtPmlkICk7CisgICAgaWYoIFB0V2lkZ2V0SXNDbGFzcyggbWVudS0+aWQsIFB0TWVudUJ1dHRvbiApICYmCisJICAgIFB0V2lkZ2V0SXNDbGFzcyggUHRXaWRnZXRQYXJlbnQoIG1lbnUtPmlkICksIFB0TWVudSApICkKKyAgICB7CisJZmllbGRzID0gUHRfRkFMU0U7CisJbWFzayA9IFB0X1NFTEVDVEFCTEUgfCBQdF9ISUdITElHSFRFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmaWVsZHMgPSBQdF9UUlVFOworCW1hc2sgPSBQdF9CTE9DS0VEIHwgUHRfR0hPU1Q7CisgICAgfQorCisgICAgaWYoICEgZ3JleSApCisJZmllbGRzID0gfmZpZWxkczsKKworICAgIFB0U2V0UmVzb3VyY2UoIG1lbnUtPmlkLCBQdF9BUkdfRkxBR1MsIGZpZWxkcywKKwkgICAgbWFzayApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9tZW51X2hpZGRlbih2aW1tZW51X1QgKm1lbnUsIGludCBoaWRkZW4pCit7CisgICAgLyogVE9ETzogW3VuXXJlYWxpemUgdGhlIHdpZGdldD8gKi8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19tZW51YmFyKHZvaWQpCit7CisgICAgLyogVGhlIG9ubHkgdGltZSBhIHJlZHJhdyBpcyBuZWVkZWQgaXMgd2hlbiBhIG1lbnUgYnV0dG9uCisgICAgICogaXMgYWRkZWQgdG8gdGhlIG1lbnViYXIsIGFuZCB0aGF0IGlzIGRldGVjdGVkIGFuZCB0aGUgYmFyCisgICAgICogcmVkcmF3biBpbiBndWlfbWNoX2FkZF9tZW51X2l0ZW0KKyAgICAgKi8KK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2hvd19wb3B1cG1lbnUodmltbWVudV9UICptZW51KQoreworICAgIFB0U2V0UmVzb3VyY2UoIG1lbnUtPnN1Ym1lbnVfaWQsIFB0X0FSR19QT1MsICZhYnNfbW91c2UsIDAgKTsKKyAgICBQdFJlYWxpemVXaWRnZXQoIG1lbnUtPnN1Ym1lbnVfaWQgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKGludCBlbmFibGUpCit7CisgICAgLyogTm8gdGVhcm9mZnMgeWV0ICovCit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggRkVBVF9UT09MQkFSICkgfHwgZGVmaW5lZCggUFJPVE8gKQorICAgIHZvaWQKK2d1aV9tY2hfc2hvd190b29sYmFyKGludCBzaG93aXQpCit7CisgICAgaWYoIHNob3dpdCApCisJUHRSZWFsaXplV2lkZ2V0KCBndWkudmltVG9vbEJhciApOworICAgIGVsc2UKKwlQdFVucmVhbGl6ZVdpZGdldCggZ3VpLnZpbVRvb2xCYXIgKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvbnRzICovCisKKyAgICBzdGF0aWMgR3VpRm9udAorZ3VpX3BoX2dldF9mb250KAorCWNoYXJfdQkqZm9udF9uYW1lLAorCWludF91CWZvbnRfZmxhZ3MsCisJaW50X3UJZm9udF9zaXplLAorCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdGluZyBmb250IGhhcyB0aGUgZm9udCBmbGFncyBhbmQgc2l6ZSB0aGF0CisJICogd2FzIGFza2VkIGZvciAqLworCWludF91CWVuZm9yY2UKKwkpCit7CisgICAgY2hhcl91CSAgICAqZm9udF90YWc7CisgICAgRm9udFF1ZXJ5SW5mbyAgIGluZm87CisgICAgaW50X3UJICAgIHN0eWxlOworCisgICAgZm9udF90YWcgPSBhbGxvYyggTUFYX0ZPTlRfVEFHICk7CisgICAgaWYoIGZvbnRfdGFnICE9IE5VTEwgKQorICAgIHsKKwlpZiggUGZHZW5lcmF0ZUZvbnROYW1lKCBmb250X25hbWUsIGZvbnRfZmxhZ3MsIGZvbnRfc2l6ZSwKKwkJICAgIGZvbnRfdGFnICkgIT0gTlVMTCApCisJeworCSAgICAvKiBFbmZvcmNlIHNvbWUgbGltaXRzIG9uIHRoZSBmb250IHVzZWQgKi8KKwkgICAgc3R5bGUgPSBQSEZPTlRfSU5GT19GSVhFRDsKKworCSAgICBpZiggZW5mb3JjZSAmIFBGX1NUWUxFX0JPTEQgKQorCQlzdHlsZSB8PSBQSEZPTlRfSU5GT19CT0xEOworCSAgICBpZiggZW5mb3JjZSAmIFBGX1NUWUxFX0FOVElBTElBUyApCisJCXN0eWxlIHw9IFBIRk9OVF9JTkZPX0FMSUFTOworCSAgICBpZiggZW5mb3JjZSAmIFBGX1NUWUxFX0lUQUxJQyApCisJCXN0eWxlIHw9IFBIRk9OVF9JTkZPX0lUQUxJQzsKKworCSAgICBQZlF1ZXJ5Rm9udEluZm8oIGZvbnRfdGFnLCAmaW5mbyApOworCisJICAgIGlmKCBpbmZvLnNpemUgPT0gMCApCisJCWZvbnRfc2l6ZSA9IDA7CisKKwkgICAgLyogTWFrZSBzdXJlIGZvbnQgc2l6ZSBtYXRjaGVzLCBhbmQgdGhhdCB0aGUgZm9udCBzdHlsZQorCSAgICAgKiBhdCBsZWFzdCBoYXMgdGhlIGJpdHMgd2UncmUgY2hlY2tpbmcgZm9yICovCisJICAgIGlmKCBmb250X3NpemUgPT0gaW5mby5zaXplICYmCisJCSAgICBzdHlsZSA9PSAoaW5mby5zdHlsZSAmIHN0eWxlKSApCisJCXJldHVybiggKEd1aUZvbnQpIGZvbnRfdGFnICk7CisJfQorCXZpbV9mcmVlKCBmb250X3RhZyApOworICAgIH0KKyAgICByZXR1cm4oIE5VTEwgKTsKK30KKworLyoKKyAqIFNwbGl0IHVwIHRoZSB2aW0gZm9udCBuYW1lCisgKgorICogdmltX2ZvbnQgaXMgaW4gdGhlIGZvcm0gb2YKKyAqIDxuYW1lPjpzPGhlaWdodD46YTpiOmkKKyAqCisgKiBhID0gYW50aWFsaWFzCisgKiBiID0gYm9sZAorICogaSA9IGl0YWxpYworICoKKyAqLworCisgICAgc3RhdGljIGludAorZ3VpX3BoX3BhcnNlX2ZvbnRfbmFtZSgKKwljaGFyX3UgKnZpbV9mb250LAorCWNoYXJfdSAqKmZvbnRfbmFtZSwKKwlpbnRfdSAqZm9udF9mbGFncywKKwlpbnRfdSAqZm9udF9zaXplICkKK3sKKyAgICBjaGFyX3UgICptYXJrOworICAgIGludF91ICAgbmFtZV9sZW4sIHNpemU7CisKKyAgICBtYXJrID0gdmltX3N0cmNociggdmltX2ZvbnQsICc6JyApOworICAgIGlmKCBtYXJrID09IE5VTEwgKQorCW5hbWVfbGVuID0gU1RSTEVOKCB2aW1fZm9udCApOworICAgIGVsc2UKKwluYW1lX2xlbiA9IChpbnRfdSkgKCBtYXJrIC0gdmltX2ZvbnQgKTsKKworICAgICpmb250X25hbWUgPSB2aW1fc3RybnNhdmUoIHZpbV9mb250LCBuYW1lX2xlbiApOworICAgIGlmKCAqZm9udF9uYW1lICE9IE5VTEwgKQorICAgIHsKKwlpZiggbWFyayAhPSBOVUxMICkKKwl7CisJICAgIHdoaWxlKCAqbWFyayAhPSBOVUwgJiYgKm1hcmsrKyA9PSAnOicpCisJICAgIHsKKwkJc3dpdGNoKCB0b2xvd2VyKCAqbWFyaysrICkgKQorCQl7CisJCSAgICBjYXNlICdhJzogKmZvbnRfZmxhZ3MgfD0gUEZfU1RZTEVfQU5USUFMSUFTOyBicmVhazsKKwkJICAgIGNhc2UgJ2InOiAqZm9udF9mbGFncyB8PSBQRl9TVFlMRV9CT0xEOyBicmVhazsKKwkJICAgIGNhc2UgJ2knOiAqZm9udF9mbGFncyB8PSBQRl9TVFlMRV9JVEFMSUM7IGJyZWFrOworCisJCSAgICBjYXNlICdzJzoKKwkJCXNpemUgPSBnZXRkaWdpdHMoICZtYXJrICk7CisJCQkvKiBSZXN0cmljdCB0aGUgc2l6ZSB0byBzb21lIHZhZ3VlIGxpbWl0cyAqLworCQkJaWYoIHNpemUgPCAxIHx8IHNpemUgPiAxMDAgKQorCQkJICAgIHNpemUgPSA4OworCisJCQkqZm9udF9zaXplID0gc2l6ZTsKKwkJCWJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKwlyZXR1cm4oIFRSVUUgKTsKKyAgICB9CisgICAgcmV0dXJuKCBGQUxTRSApOworfQorCisgICAgaW50CitndWlfbWNoX2luaXRfZm9udChjaGFyX3UgKnZpbV9mb250X25hbWUsIGludCBmb250c2V0KQoreworICAgIGNoYXJfdSAgKmZvbnRfdGFnOworICAgIGNoYXJfdSAgKmZvbnRfbmFtZSA9IE5VTEw7CisgICAgaW50X3UgICBmb250X2ZsYWdzID0gMDsKKyAgICBpbnRfdSAgIGZvbnRfc2l6ZSAgPSAxMjsKKworICAgIEZvbnRRdWVyeUluZm8gaW5mbzsKKyAgICBQaFJlY3RfdCBleHRlbnQ7CisKKyAgICBpZiggdmltX2ZvbnRfbmFtZSA9PSBOVUxMICkKKyAgICB7CisJLyogRGVmYXVsdCBmb250ICovCisJdmltX2ZvbnRfbmFtZSA9ICJQQyBUZXJtIjsKKyAgICB9CisKKyAgICBpZiggU1RSQ01QKCB2aW1fZm9udF9uYW1lLCAiKiIgKSA9PSAwICkKKyAgICB7CisJZm9udF90YWcgPSBQdEZvbnRTZWxlY3Rpb24oIGd1aS52aW1XaW5kb3csIE5VTEwsIE5VTEwsCisJCSJwY3Rlcm0xMiIsIC0xLCBQSEZPTlRfRklYRUQsIE5VTEwgKTsKKworCWlmKCBmb250X3RhZyA9PSBOVUxMICkKKwkgICAgcmV0dXJuKCBGQUlMICk7CisKKwlndWlfbWNoX2ZyZWVfZm9udCggZ3VpLm5vcm1fZm9udCApOworCWd1aS5ub3JtX2ZvbnQgPSBmb250X3RhZzsKKworCVBmUXVlcnlGb250SW5mbyggZm9udF90YWcsICZpbmZvICk7CisJZm9udF9uYW1lID0gdmltX3N0cnNhdmUoIGluZm8uZm9udCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmKCBndWlfcGhfcGFyc2VfZm9udF9uYW1lKCB2aW1fZm9udF9uYW1lLCAmZm9udF9uYW1lLCAmZm9udF9mbGFncywKKwkJICAgICZmb250X3NpemUgKSA9PSBGQUxTRSApCisJICAgIHJldHVybiggRkFJTCApOworCisJZm9udF90YWcgPSBndWlfcGhfZ2V0X2ZvbnQoIGZvbnRfbmFtZSwgZm9udF9mbGFncywgZm9udF9zaXplLCAwICk7CisJaWYoIGZvbnRfdGFnID09IE5VTEwgKQorCXsKKwkgICAgdmltX2ZyZWUoIGZvbnRfbmFtZSApOworCSAgICByZXR1cm4oIEZBSUwgKTsKKwl9CisJZ3VpX21jaF9mcmVlX2ZvbnQoIGd1aS5ub3JtX2ZvbnQgKTsKKwlndWkubm9ybV9mb250ID0gZm9udF90YWc7CisgICAgfQorCisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoIGd1aS5ib2xkX2ZvbnQgKTsKKyAgICBndWkuYm9sZF9mb250ID0gZ3VpX3BoX2dldF9mb250KCBmb250X25hbWUsIGZvbnRfZmxhZ3MgfCBQRl9TVFlMRV9CT0xELAorCSAgICBmb250X3NpemUsIFBGX1NUWUxFX0JPTEQgKTsKKworICAgIGd1aV9tY2hfZnJlZV9mb250KCBndWkuaXRhbF9mb250ICk7CisgICAgZ3VpLml0YWxfZm9udCA9IGd1aV9waF9nZXRfZm9udCggZm9udF9uYW1lLCBmb250X2ZsYWdzIHwgUEZfU1RZTEVfSVRBTElDLAorCSAgICBmb250X3NpemUsIFBGX1NUWUxFX0lUQUxJQyApOworCisgICAgLyogVGhpcyBleHRlbnQgd2FzIGJyb3VnaHQgdG8geW91IGJ5IHRoZSBsZXR0ZXIgJ2cnICovCisgICAgUGZFeHRlbnRUZXh0KCAmZXh0ZW50LCBOVUxMLCBmb250X3RhZywgImciLCAxICk7CisKKyAgICBndWkuY2hhcl93aWR0aCA9IGV4dGVudC5sci54IC0gZXh0ZW50LnVsLnggKyAxOworICAgIGd1aS5jaGFyX2hlaWdodCA9ICgtIGV4dGVudC51bC55KSArIGV4dGVudC5sci55ICsgMTsKKyAgICBndWkuY2hhcl9hc2NlbnQgPSAtIGV4dGVudC51bC55OworCisgICAgdmltX2ZyZWUoIGZvbnRfbmFtZSApOworICAgIHJldHVybiggT0sgKTsKK30KKworICAgIGludAorZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUodm9pZCkKK3sKKyAgICBGb250UXVlcnlJbmZvIGluZm87CisKKyAgICBQZlF1ZXJ5Rm9udEluZm8oIGd1aS5ub3JtX2ZvbnQsICZpbmZvICk7CisKKyAgICBndWkuY2hhcl9oZWlnaHQgPSAtIGluZm8uYXNjZW5kZXIgKyBpbmZvLmRlc2NlbmRlciArIHBfbGluZXNwYWNlOworICAgIGd1aS5jaGFyX2FzY2VudCA9IC0gaW5mby5hc2NlbmRlciArIHBfbGluZXNwYWNlIC8gMjsKKworICAgIHJldHVybiggT0sgKTsKK30KKworICAgIEd1aUZvbnQKK2d1aV9tY2hfZ2V0X2ZvbnQoY2hhcl91ICp2aW1fZm9udF9uYW1lLCBpbnQgcmVwb3J0X2Vycm9yKQoreworICAgIGNoYXJfdSAgKmZvbnRfbmFtZTsKKyAgICBjaGFyX3UgICpmb250X3RhZzsKKyAgICBpbnRfdSAgIGZvbnRfc2l6ZSA9IDEyOworICAgIGludF91ICAgZm9udF9mbGFncyA9IDA7CisKKyAgICBpZiggZ3VpX3BoX3BhcnNlX2ZvbnRfbmFtZSggdmltX2ZvbnRfbmFtZSwgJmZvbnRfbmFtZSwgJmZvbnRfZmxhZ3MsCisJCSZmb250X3NpemUgKSAhPSBGQUxTRSApCisgICAgeworCWZvbnRfdGFnID0gZ3VpX3BoX2dldF9mb250KCBmb250X25hbWUsIGZvbnRfZmxhZ3MsIGZvbnRfc2l6ZSwgLTEgKTsKKwl2aW1fZnJlZSggZm9udF9uYW1lICk7CisKKwlpZiggZm9udF90YWcgIT0gTlVMTCApCisJICAgIHJldHVybiggKEd1aUZvbnQpIGZvbnRfdGFnICk7CisgICAgfQorCisgICAgaWYoIHJlcG9ydF9lcnJvciApCisJRU1TRzIoZV9mb250LCB2aW1fZm9udF9uYW1lICk7CisKKyAgICByZXR1cm4oIEZBSUwgKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIFBnU2V0Rm9udCggZm9udCApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9mcmVlX2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIHZpbV9mcmVlKCBmb250ICk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9ndWlfcmlzY29zLmMgYi9zcmMvZ3VpX3Jpc2Nvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjNhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX3Jpc2Nvcy5jCkBAIC0wLDAgKzEsMzU0NyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qCisgKiBndWlfcmlzY29zLmMKKyAqCisgKiBUaG9tYXMgTGVvbmFyZCA8dGFsMTk3QGVjcy5zb3Rvbi5hYy51az4KKyAqIFVwZGF0ZWQgYnkgQW5keSBXaW5nYXRlIDxhbmR5QHNwYXJzZS5uZXQ+CisgKi8KKworZXh0ZXJuIGludCB0aW1lX29mX2xhc3RfcG9sbDsKKworaW50IHRhc2tfaGFuZGxlID0gMDsJCS8qIFplcm8gbWVhbnMgd2UgYXJlIG5vdCB5ZXQgYSBXaW1wIHRhc2sgKi8KK2ludCBjaGlsZF9oYW5kbGUgPSAwOwkJLyogVGFzayBoYW5kbGUgb2Ygb3VyIGNoaWxkIHByb2Nlc3MgKHplcm8gaWYgbm9uZSkuICovCitpbnQgKndpbXBfbWVudSA9IChpbnQgKikgLTE7CS8qIFBvaW50ZXIgdG8gYSBXaW1wIG1lbnUgc3RydWN0dXJlIChvciAtMSkgKi8KK2ludCBzYXZlX3dpbmRvdyA9IC0xOwkJLyogU2F2ZSBBcyB3aW5kb3cgaGFuZGxlICovCisKK2ludCAqcmVkcmF3X2Jsb2NrID0gTlVMTDsJLyogTlVMTCBtZWFucyBub3QgaW4gYSByZWRyYXcgbG9vcC4gKi8KK2ludCByb19yZXR1cm5fZWFybHkgPSBGQUxTRTsJLyogQnJlYWsgb3V0IG9mIGd1aV9tY2hfd2FpdF9mb3JfY2hhcnMoKSAqLworCitpbnQgbGVhZl9yZWYgPSAwOwkJLyogV2ltcCBtZXNzYWdlIG51bWJlciAtIHNlbmQgdmlhIFdpbXAkU2NyYXAgKi8KK2NoYXJfdSAqbGVhZl9uYW1lID0gTlVMTDsJLyogTGVhZiBuYW1lIGZyb20gRGF0YVNhdmUgKi8KKworaW50IGRlZmF1bHRfY29sdW1ucyA9IDEyMDsJLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGlmIHRoZSAtLXJvd3MgYW5kIC0tY29sdW1ucyAqLworaW50IGRlZmF1bHRfcm93cyA9IDMyOwkJLyogb3B0aW9ucyBhcmVuJ3QgdXNlZCBvbiBzdGFydHVwLiAqLworCisjZGVmaW5lIERSQUdfRkFMU0UJICAgIDAKKyNkZWZpbmUgRFJBR19TRUxFQ1RJT04JICAgIDEKKyNkZWZpbmUgRFJBR19SRVNJWkVfV0lORE9XICAyCitpbnQgcm9fZHJhZ2dpbmcgPSBEUkFHX0ZBTFNFOworaW50IGRyYWdfYnV0dG9uOworaW50IGRyYWdfbW9kaWZpZXJzOworaW50IGRyYWdfeF9vZmZzZXQ7CitpbnQgZHJhZ195X29mZnNldDsKKworaW50IG5lc3RlZF93aW1wID0gRkFMU0U7CS8qIEJvb2wgLSBjYW4gd2UgdXNlIHRoZSBuZXcgd2ltcD8gKi8KKworaW50IGNoYW5nZWRfbW9kZSA9IEZBTFNFOworaW50IHhfZWlnZW5fZmFjdG9yOworaW50IHlfZWlnZW5fZmFjdG9yOworCisvKiBJZiByb19jdXJyZW50X2ZvbnQgaXMgbm9uLXplcm8gdGhlbiB1c2UgdGhlIG91dGxpbmUgZm9udCB3aXRoIHRoYXQgaGFuZGxlLAorICogb3RoZXJ3aXNlLCBpZiB6YXBfcmVkcmF3IGlzIFRSVUUgdGhlbiB1c2UgWmFwUmVkcmF3LCBvdGhlcndpc2UgdXNlIHRoZQorICogc3lzdGVtIGZvbnQuCisgKgorICogSWYgemFwX3JlZHJhdyBpcyBUUlVFIHRoZW4gemFwX2ZpbGVbXSBjb250YWlucyB2YWxpZCBaYXAgZm9udCBmaWxlCisgKiBwb2ludGVycyAob3IgTlVMTHMpLgorICovCitpbnQgcm9fY3VycmVudF9mb250ID0gMDsJLyogMCBpcyBzeXN0ZW0gZm9udCwgb3IgWmFwUmVkcmF3ICovCitpbnQgZm9udF94X29mZnNldCAgID0gMDsJLyogV2hlcmUgdG8gcG9zaXRpb24gZWFjaCBjaGFyIGluIGl0cyBib3ggKi8KK2ludCBmb250X3lfb2Zmc2V0ICAgPSAwOworCitpbnQgemFwX3JlZHJhdwkgICAgPSBGQUxTRTsKK2ludCBkb3VibGVfaGVpZ2h0ICAgPSBGQUxTRTsJLyogUGxvdCBlYWNoIGxpbmUgdHdpY2U/ICovCisKKyNkZWZpbmUgZ3JnYihyLGcsYikgKChiPDwxNikgKyAoZzw8OCkgKyAocikpCisjZGVmaW5lIFVOVVNFRF9DT0xPVVIgKGd1aS5iYWNrX3BpeGVsKQorCisjZGVmaW5lIFJPX0xPQURfQ0xJUEJPQVJEIC0yCS8qIEludGVybmFsIGhhbmRsZSBmb3IgRGF0YVNhdmUgbWVzc2FnZS4gKi8KKworLyogQ2hhbmdlcyBieSBKb2huIEtvcnRpbmssIDIyLTIzIEp1bHkgMTk5OAorICoKKyAqIFN0dWZmIHRvIG1ha2UgcmVkcmF3IGEgbG90IGZhc3Rlci4gQWxtb3N0IGFsbCBvZiBpdCBpcyByaWdodCBoZXJlIGJlbG93LAorICogZWxzZXdoZXJlIGNoYW5nZXMgYXJlIG1hcmtlZCB3aXRoICdKSzIzMDc5OCcuIEFwYXJ0IGZyb20gYSBzbWFsbCBjaGFuZ2UgaW4KKyAqICdndWkuYycgYWxsIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gdGhpcyBmaWxlLCAnZ3VpX3Jpc2Nvcy5jJy4gVGhlIGNoYW5nZSBpbgorICogJ2d1aS5jJyBpcyB0byBtYWtlIFZpbSBzdG9wIGJlaW5nICdzbWFydCcgbm90IHJlZHJhd2luZyBjaGFyYWN0ZXJzIHRoYXQgYXJlCisgKiAnYWxyZWFkeSB0aGVyZScgKGkuZS4gZnJvbSB0aGUgcHJldmlvdXMgbGluZSwgYnkgY29pbmNpZGVuY2UpLiBUaGlzIGNhdXNlZCBhCisgKiBsb3QgbW9yZSBjYWxscyB0byB0aGUgcmVkcmF3IGNvZGUsIHdoaWNoIHdlIHdhbnQgdG8gYXZvaWQgYmVjYXVzZSBhIGZldyBuaWNlCisgKiBiaWcgc3RyaW5ncyBhdCBhIHRpbWUgaXMgYSBsb3QgZmFzdGVyIHRoYW4gYSB0cnVja2xvYWQgb2Ygc21hbGwgb25lcy4gKCdEZWFyCisgKiBCcmFtIC4uLicpLgorICovCisKKy8qIFRoZSBaYXBSZWRyYXcgc3RydWN0dXJlICovCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBpbnQJCXJfZmxhZ3M7CisgICAgaW50CQlyX21pbng7CisgICAgaW50CQlyX21pbnk7CisgICAgaW50CQlyX21heHg7CisgICAgaW50CQlyX21heHk7CisgICAgaW50CQlyX3NjcmVlbjsKKyAgICBpbnQJCXJfYnBsOworICAgIGludAkJcl9icHA7CisgICAgaW50CQlyX2NoYXJ3OworICAgIGludAkJcl9jaGFyaDsKKyAgICBjaGFyCSpyX2NhZGRyOworICAgIGludAkJcl9jYnBsOworICAgIGludAkJcl9jYnBjOworICAgIGludAkJcl9saW5lc3A7CisgICAgaW50CQlyX2RhdGE7CisgICAgaW50CQlyX3Njcm9sbHg7CisgICAgaW50CQlyX3Njcm9sbHk7CisgICAgaW50CQkqcl9wYWxldHRlOworICAgIGludAkJcl9mb3I7CisgICAgaW50CQlyX2JhYzsKKyAgICBjaGFyCSpyX3dvcmthcmVhOworICAgIGludAkJcl9tYWd4OworICAgIGludAkJcl9tYWd5OworICAgIGludAkJcl94c2l6ZTsKKyAgICBpbnQJCXJfeXNpemU7CisgICAgaW50CQlyX21vZGU7Cit9Cit6YXBfcmVkcmF3X2Jsb2NrOworCisvKiBPdGhlciBnbG9iYWxzICovCisKK3N0YXRpYyBpbnQJemFwX3JlZHJhd19pbml0aWFsaXNlZCA9IEZBTFNFOworc3RhdGljIGludAl6YXBfcmVkcmF3X3VwZGF0ZV9jb2xvdXJzOworc3RhdGljIGludAl6YXBfcmVkcmF3X2NvbG91cnNbMl07CitzdGF0aWMgaW50CXphcF9yZWRyYXdfcGFsZXR0ZVsxNl07CisKKy8qIEhvbGRzIHRoZSBjdXJyZW50IFphcCBmb250IGZpbGUocykuCisgKiBUaGUgZm9udCBpcyByZWNyZWF0ZWQgZnJvbSB0aGlzIGJsb2NrIG9uIGEgbW9kZSBjaGFuZ2UuCisgKiBXaGVuIHVzaW5nIHphcCwgZWxlbWVudCBaQVBfTk9STUFMIGlzIGFsd2F5cyB2YWxpZCwgYnV0CisgKiB0aGUgb3RoZXJzIGNhbiBiZSBOVUxMLgorICovCisKKyNkZWZpbmUgWkFQX05PUk1BTCAgMAorI2RlZmluZSBaQVBfQk9MRCAgICAxCisjZGVmaW5lIFpBUF9JVEFMSUMgIDIKKyNkZWZpbmUgWkFQX0JJVEFMSUMgMworI2RlZmluZSBaQVBfU1RZTEVTICA0CisKKy8qIFphcCBmb250IGZpbGUgZm9ybWF0IGRhdGEgKi8KK3N0YXRpYyBjaGFyCSp6YXBfZmlsZVtaQVBfU1RZTEVTXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKworLyogcl9jYWRkciBmb3JtYXQgZm9yIGN1cnJlbnQgbW9kZSAqLworc3RhdGljIGNoYXIJKnphcF9jYWRkcltaQVBfU1RZTEVTXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKworc3RhdGljIHZvaWQgcm9fcmVtb3ZlX21lbnUoaW50ICptZW51KTsKKworLyoKKyAqIEluaXRpYWxpc2UgYWxsIHRoZSBaYXBSZWRyYXcgc3R1ZmYuCisgKiBDYWxsIHRoaXMgd2hlbiBjaGFuZ2luZyBmb250IGFuZCBhZnRlciBlYWNoIG1vZGUgY2hhbmdlLgorICogemFwX3JlZHJhd19iaXRtYXAgbXVzdCBjb250YWluIGEgdmFsaWQgWmFwIGZvbnQgZmlsZSAocG9zc2libHkKKyAqIGNyZWF0ZWQgZnJvbSB0aGUgc3lzdGVtIGZvbnQpLgorICoKKyAqIFJldHVybiBGQUlMIHRvIHJldmVydCB0byBzeXN0ZW0gZm9udCAoaWYgd2UgY2FuJ3QgdXNlIFphcFJlZHJhdykuCisgKi8KKyAgICBpbnQKK3JvX3phcF9yZWRyYXdfaW5pdGlhbGlzZSgpCit7CisgICAgaW50CSAgICBieXRlc19wZXJfYml0bWFwX2NoYXI7CisgICAgaW50CSAgICBmaXJzdCwgbGFzdDsKKyAgICBpbnQJICAgIGk7CisKKyAgICAvKiBDYW4ndCBoYXZlIGluaXRpYWxpc2VycyBmb3Igc3RydWN0IG1lbWJlcnMgOi0oLCBvaywgdGhpcyB3YXkgdGhlbiAuLi4gKi8KKyAgICBpZiAoIXphcF9yZWRyYXdfaW5pdGlhbGlzZWQpCisgICAgeworCXphcF9yZWRyYXdfYmxvY2sucl93b3JrYXJlYSA9IE5VTEw7CisJemFwX3JlZHJhd19pbml0aWFsaXNlZCA9IFRSVUU7CisgICAgfQorCisgICAgLyogV2UgcmVkcmF3IGluIERTQSBtb2RlICovCisgICAgemFwX3JlZHJhd19ibG9jay5yX2ZsYWdzID0gMHgwOworCisgICAgLyogTGV0IFphcFJlZHJhdyBnZXQgdGhlIHNjcmVlbiBhZGRyZXNzIGZvciB1cyAqLworICAgIHphcF9yZWRyYXdfYmxvY2sucl9zY3JlZW4gPSAwOworCisgICAgLyogUmVhZCB0aGUgZm9udCB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGZvbnQgZmlsZSBoZWFkZXIuCisgICAgICogQXNzdW1lIHRoYXQgYWxsIHN0eWxlcyBhcmUgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKiBaQVBfTk9STUFMIGlzIGFsd2F5cyBwcmVzZW50LgorICAgICAqLworICAgIHphcF9yZWRyYXdfYmxvY2sucl9jaGFydyA9ICgoaW50ICopIHphcF9maWxlW1pBUF9OT1JNQUxdKVsyXTsKKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfY2hhcmggPSAoKGludCAqKSB6YXBfZmlsZVtaQVBfTk9STUFMXSlbM107CisKKyAgICAvKiBXZSBoYXZlIG5vIGxpbmVzcGFjaW5nICovCisgICAgemFwX3JlZHJhd19ibG9jay5yX2xpbmVzcCA9IDA7CisKKyAgICAvKiBGaXggZm9yZWdyb3VuZCA9IGNvbG91ciAxICovCisgICAgemFwX3JlZHJhd19ibG9jay5yX2ZvciA9IDE7CisKKyAgICAvKiBGaXggYmFja2dyb3VuZCA9IGNvbG91ciAwICovCisgICAgemFwX3JlZHJhd19ibG9jay5yX2JhYyA9IDA7CisKKyAgICAvKiBDb2xvdXIgbWFzayBidWZmZXIgKi8KKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfcGFsZXR0ZSA9IHphcF9yZWRyYXdfcGFsZXR0ZTsKKworICAgIC8qIEFsbG9jYXRlIGxvY2FsIHdvcmtzcGFjZSAoZm9yIHRoZSBmZXcgY2FsbHMgZm9sbG93aW5nIGhlcmUpICovCisgICAgaWYgKHphcF9yZWRyYXdfYmxvY2sucl93b3JrYXJlYSAhPSBOVUxMKQorCWZyZWUoemFwX3JlZHJhd19ibG9jay5yX3dvcmthcmVhKTsKKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfd29ya2FyZWEgPSAoY2hhciopIG1hbGxvYygxMjgpOworICAgIGlmICghemFwX3JlZHJhd19ibG9jay5yX3dvcmthcmVhKQorCXJldHVybiBGQUlMOwkvKiBPdXQgb2YgbWVtb3J5ICovCisKKyAgICAvKiBGaWxsIGluIFZEVSB2YXJpYWJsZXMgKi8KKyAgICBpZiAoeHN3aShaYXBSZWRyYXdfUmVhZFZkdVZhcnMsIDAsICZ6YXBfcmVkcmF3X2Jsb2NrKSAmIHZfZmxhZykKKwlyZXR1cm4gRkFJTDsJICAgIC8qIENhbid0IGZpbmQgWmFwUmVkcmF3IG1vZHVsZSAtIHVzZSBWRFUgaW5zdGVhZCAqLworCisgICAgLyogRGV0ZXJtaW5lIGNicGwgYW5kIGNicGMgKi8KKyAgICBzd2koWmFwUmVkcmF3X0NhY2hlZENoYXJTaXplLCB6YXBfcmVkcmF3X2Jsb2NrLnJfYnBwLCAwLAorCXphcF9yZWRyYXdfYmxvY2sucl9jaGFydywgemFwX3JlZHJhd19ibG9jay5yX2NoYXJoKTsKKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfY2JwbCA9IHIyOworICAgIHphcF9yZWRyYXdfYmxvY2sucl9jYnBjID0gcjM7CisKKyAgICAvKiBBbGxvY2F0ZSBnZW5lcmFsIHdvcmtzcGFjZSAoZm9yIHRoZSBjYWxscyBvdXRzaWRlKSAqLworICAgIGlmICh6YXBfcmVkcmF3X2Jsb2NrLnJfd29ya2FyZWEgIT0gTlVMTCkKKwlmcmVlKHphcF9yZWRyYXdfYmxvY2sucl93b3JrYXJlYSk7CisgICAgemFwX3JlZHJhd19ibG9jay5yX3dvcmthcmVhID0gKGNoYXIqKSBtYWxsb2MoMTI4ICsgemFwX3JlZHJhd19ibG9jay5yX2NicGwpOworICAgIGlmICghemFwX3JlZHJhd19ibG9jay5yX3dvcmthcmVhKQorCXJldHVybiBGQUlMOwkvKiBPdXQgb2YgbWVtb3J5ICovCisKKyAgICAvKiBOb3cgY29udmVydCB0aGUgMSBicHAgY2hhcmFjdGVyIGRhdGEgcmVhZHkgZm9yIHRoZSBjdXJyZW50IG1vZGUgKi8KKworICAgIGJ5dGVzX3Blcl9iaXRtYXBfY2hhciA9ICh6YXBfcmVkcmF3X2Jsb2NrLnJfY2hhcncgKiB6YXBfcmVkcmF3X2Jsb2NrLnJfY2hhcmggKyA3KSAvIDg7CisKKyAgICAvKiBDb252ZXJ0IHRoZSBmb250cyBmcm9tIDFicHAgdG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIHRoZQorICAgICAqIGN1cnJlbnQgbW9kZS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWkFQX1NUWUxFUzsgaSsrKQorICAgIHsKKwlmaXJzdCA9ICgoaW50ICopIHphcF9maWxlW2ldKVs0XTsKKwlsYXN0ICA9ICgoaW50ICopIHphcF9maWxlW2ldKVs1XTsKKworCWlmIChsYXN0ID4gMjU1KQorCSAgICBsYXN0ID0gMjU1OwkvKiBEb24ndCBjb252ZXJ0IGN1cnNvcnMgKG92ZXJ3cml0ZXMgbWVtb3J5ISkgKi8KKworCS8qIEFsbG9jYXRlIHRoZSBmb250IGNhY2hlICovCisJdmltX2ZyZWUoemFwX2NhZGRyW2ldKTsKKwlpZiAoemFwX2ZpbGVbaV0pCisJICAgIHphcF9jYWRkcltpXSA9IChjaGFyKikgbWFsbG9jKHphcF9yZWRyYXdfYmxvY2sucl9jYnBjICogMjU2KTsKKwllbHNlCisJICAgIHphcF9jYWRkcltpXSA9IE5VTEw7ICAgIC8qIE5vIGZpbGUgZm9yIHRoaXMgc3R5bGUgKi8KKworCWlmICh6YXBfY2FkZHJbaV0pCisJeworCSAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfY2FkZHIgPSB6YXBfY2FkZHJbaV07CisKKwkgICAgc3dpKFphcFJlZHJhd19Db252ZXJ0Qml0bWFwLCAwLCAmemFwX3JlZHJhd19ibG9jaywKKwkJICAgIGZpcnN0LCBsYXN0LAkJLyogUmFuZ2Ugb2YgY2hhcmFjdGVycyB0byBjb252ZXJ0ICovCisJCSAgICB6YXBfZmlsZVtpXSArIDB4MjAJLyogQWRkciBvZiBmaXJzdCBjaGFyIHByb3ZpZGVkIGJ5IGZvbnQgKi8KKwkJICAgIC0gZmlyc3QgKiBieXRlc19wZXJfYml0bWFwX2NoYXIpOworCX0KKyAgICB9CisKKyAgICBpZiAoIXphcF9jYWRkcltaQVBfTk9STUFMXSkKKyAgICB7CisJemFwX3JlZHJhdyA9IEZBTFNFOwkvKiBPdXQgb2YgbWVtb3J5ICovCisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyogTmV4dCB0aW1lIHdlIG5lZWQgdGhlbSwgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGNvbG91ciBtYXNrcyAqLworICAgIHphcF9yZWRyYXdfdXBkYXRlX2NvbG91cnMgPSBUUlVFOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogUmVkcmF3IGEgc3RyaW5nIGF0IE9TIGNvb3JkaW5hdGVzIDx4LHk+ICh0b3AtbGVmdCwgeCBpbmNsdXNpdmUsIHkgZXhjbHVzaXZlKS4KKyAqIEdyYXBoaWNzIGNsaXAgd2luZG93IGlzIHdpbmRvd1swLi4zXSBhcyBpbiBSMSsyOC4uNDAgb2YgV2ltcF9SZWRyYXdXaW5kb3cuCisgKiBSZXR1cm5zIChwb3NzaWJseSBtb2RpZmllZCkgZmxhZ3MuCisgKi8KKyAgICBpbnQKK3JvX3phcF9yZWRyYXdfZHJhd19zdHJpbmcoeCwgeSwgc3RyaW5nLCBsZW5ndGgsIGZsYWdzLCBjbGlwKQorICAgIGludAkgICAgeDsKKyAgICBpbnQJICAgIHk7CisgICAgY2hhciAgICAqc3RyaW5nOworICAgIGludAkgICAgbGVuZ3RoOworICAgIGludAkgICAgZmxhZ3M7CS8qIERSQVdfVFJBTlNQLCBEUkFXX0JPTEQsIERSQVdfVU5ERVJMLCBEUkFXX0lUQUxJQyAqLworICAgIGludAkgICAgKmNsaXA7Cit7CisgICAgY2hhciByZWRyYXdfZGF0YVsxMDI0XTsKKyAgICBpbnQgY2xpcF9taW54OworICAgIGludCBjbGlwX21pbnk7CisgICAgaW50IGNsaXBfbWF4eDsKKyAgICBpbnQgY2xpcF9tYXh5OworICAgIGludCBvc194c2hpZnQgPSB6YXBfcmVkcmF3X2Jsb2NrLnJfbWFneDsKKyAgICBpbnQgb3NfeXNoaWZ0ID0gemFwX3JlZHJhd19ibG9jay5yX21hZ3k7CisKKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1RSQU5TUCkKKwlyZXR1cm4gZmxhZ3M7CS8qIFdlIGRvbid0IGRvIHRyYW5zcGFyZW50IHBsb3R0aW5nIHlldC4gKi8KKworICAgIGlmIChmbGFncyAmIERSQVdfQk9MRCkKKyAgICB7CisJaWYgKGZsYWdzICYgRFJBV19JVEFMSUMgJiYgemFwX2NhZGRyW1pBUF9CSVRBTElDXSkKKwkgICAgemFwX3JlZHJhd19ibG9jay5yX2NhZGRyID0gemFwX2NhZGRyW1pBUF9CSVRBTElDXTsKKwllbHNlCisJICAgIHphcF9yZWRyYXdfYmxvY2sucl9jYWRkciA9IHphcF9jYWRkcltaQVBfQk9MRF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGZsYWdzICYgRFJBV19JVEFMSUMpCisJICAgIHphcF9yZWRyYXdfYmxvY2sucl9jYWRkciA9IHphcF9jYWRkcltaQVBfSVRBTElDXTsKKwllbHNlCisJICAgIHphcF9yZWRyYXdfYmxvY2sucl9jYWRkciA9IHphcF9jYWRkcltaQVBfTk9STUFMXTsKKyAgICB9CisgICAgaWYgKCF6YXBfcmVkcmF3X2Jsb2NrLnJfY2FkZHIpCisgICAgeworCXphcF9yZWRyYXdfYmxvY2sucl9jYWRkciA9IHphcF9jYWRkcltaQVBfTk9STUFMXTsKKwlmbGFncyB8PSBEUkFXX1VOREVSTDsJICAgIC8qIFN0eWxlIG1pc3NpbmcgLSB3ZSBjYW4gYWx3YXlzIHVuZGVybGluZSAqLworICAgIH0KKworICAgIC8qIFNldCB0aGUgdmVydGljYWwgc2NhbGluZyBmbGFnICovCisgICAgaWYgKGRvdWJsZV9oZWlnaHQpCisJemFwX3JlZHJhd19ibG9jay5yX2ZsYWdzID0gMSA8PCAxOworICAgIGVsc2UKKwl6YXBfcmVkcmF3X2Jsb2NrLnJfZmxhZ3MgPSAwOworCisgICAgLyogVXBkYXRlIHRoZSBjb2xvdXIgbWFza3MgKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAoemFwX3JlZHJhd191cGRhdGVfY29sb3VycykKKyAgICB7CisJc3dpKFphcFJlZHJhd19DcmVhdGVQYWxldHRlLCAyLAorCQkmemFwX3JlZHJhd19ibG9jaywKKwkJemFwX3JlZHJhd19jb2xvdXJzLAorCQl6YXBfcmVkcmF3X2Jsb2NrLnJfcGFsZXR0ZSwgMik7CisJemFwX3JlZHJhd191cGRhdGVfY29sb3VycyA9IEZBTFNFOworICAgIH0KKworICAgIC8qIFRhcmdldCByZWN0YW5nbGUgaW4gWmFwUmVkcmF3IHJlY3RhbmdsZSBjb29yZGluYXRlcyAocGl4ZWxzLCBZLW1pbi9tYXggcmV2ZXJzZWQgISEhKSAqLworICAgIHphcF9yZWRyYXdfYmxvY2sucl9taW54ID0geCA+PiBvc194c2hpZnQ7CQkJCQkvKiBpbmNsdXNpdmUgKi8KKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfbWlueSA9IHphcF9yZWRyYXdfYmxvY2sucl95c2l6ZSAtICh5ID4+IG9zX3lzaGlmdCk7CS8qIGluY2x1c2l2ZSAqLworICAgIHphcF9yZWRyYXdfYmxvY2sucl9tYXh4ID0gKHggKyBsZW5ndGggKiBndWkuY2hhcl93aWR0aCkgPj4gb3NfeHNoaWZ0OwkvKiBleGNsdXNpdmUgKi8KKyAgICB6YXBfcmVkcmF3X2Jsb2NrLnJfbWF4eSA9IHphcF9yZWRyYXdfYmxvY2sucl95c2l6ZSAtICgoeSAtIGd1aS5jaGFyX2hlaWdodCkgPj4gb3NfeXNoaWZ0KTsKKwkJCQkJCQkJCQkvKiBleGNsdXNpdmUgKi8KKworICAgIC8qIENsaXAgcmVjdGFuZ2xlIGluIFphcFJlZHJhdyByZWN0YW5nbGUgY29vcmRpbmF0ZXMgKHBpeGVscywgWS1taW4vbWF4IHJldmVyc2VkICEhISkgKi8KKyAgICBjbGlwX21pbnggPSBjbGlwWzBdID4+IG9zX3hzaGlmdDsJCQkJCS8qIGluY2x1c2l2ZSAqLworICAgIGNsaXBfbWlueSA9IHphcF9yZWRyYXdfYmxvY2sucl95c2l6ZSAtIChjbGlwWzNdID4+IG9zX3lzaGlmdCk7CS8qIGluY2x1c2l2ZSAqLworICAgIGNsaXBfbWF4eCA9IGNsaXBbMl0gPj4gb3NfeHNoaWZ0OwkJCQkJLyogZXhjbHVzaXZlICovCisgICAgY2xpcF9tYXh5ID0gemFwX3JlZHJhd19ibG9jay5yX3lzaXplIC0gKGNsaXBbMV0gPj4gb3NfeXNoaWZ0KTsJLyogZXhjbHVzaXZlICovCisKKyAgICAvKiBDbGlwIHRhcmdldCByZWN0YW5nbGUgYWdhaW5zdCB0aGUgY3VycmVudCBncmFwaGljcyB3aW5kb3cgKi8KKyAgICBpZiAoemFwX3JlZHJhd19ibG9jay5yX21pbnggPCBjbGlwX21pbngpCisgICAgeworCXphcF9yZWRyYXdfYmxvY2sucl9zY3JvbGx4ID0gY2xpcF9taW54IC0gemFwX3JlZHJhd19ibG9jay5yX21pbng7CisJemFwX3JlZHJhd19ibG9jay5yX21pbnggPSBjbGlwX21pbng7CisgICAgfQorICAgIGVsc2UKKwl6YXBfcmVkcmF3X2Jsb2NrLnJfc2Nyb2xseCA9IDA7CisgICAgaWYgKHphcF9yZWRyYXdfYmxvY2sucl9taW55IDwgY2xpcF9taW55KQorICAgIHsKKwl6YXBfcmVkcmF3X2Jsb2NrLnJfc2Nyb2xseSA9IGNsaXBfbWlueSAtIHphcF9yZWRyYXdfYmxvY2sucl9taW55OworCXphcF9yZWRyYXdfYmxvY2sucl9taW55ID0gY2xpcF9taW55OworICAgIH0KKyAgICBlbHNlCisJemFwX3JlZHJhd19ibG9jay5yX3Njcm9sbHkgPSAwOworICAgIGlmICh6YXBfcmVkcmF3X2Jsb2NrLnJfbWF4eCA+IGNsaXBfbWF4eCkKKwl6YXBfcmVkcmF3X2Jsb2NrLnJfbWF4eCA9IGNsaXBfbWF4eDsKKyAgICBpZiAoemFwX3JlZHJhd19ibG9jay5yX21heHkgPiBjbGlwX21heHkpCisJemFwX3JlZHJhd19ibG9jay5yX21heHkgPSBjbGlwX21heHk7CisKKyAgICAvKiBGaWxsIGluIHRoZSBjaGFyYWN0ZXIgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAobGVuZ3RoID4gKHNpemVvZihyZWRyYXdfZGF0YSkgLSAyICogNCAtIDIpKQorCWxlbmd0aCA9IHNpemVvZihyZWRyYXdfZGF0YSkgLSAyICogNCAtIDI7CisgICAgKChpbnQqKSByZWRyYXdfZGF0YSlbMF0gPSAyICogNDsKKyAgICAoKGludCopIHJlZHJhd19kYXRhKVsxXSA9IDA7CisgICAgc3RybmNweShyZWRyYXdfZGF0YSArIDIgKiA0LCBzdHJpbmcsIGxlbmd0aCk7CisgICAgcmVkcmF3X2RhdGFbMiAqIDQgKyBsZW5ndGggKyAwXSA9ICdcMCc7CisgICAgcmVkcmF3X2RhdGFbMiAqIDQgKyBsZW5ndGggKyAxXSA9ICdceDInOworICAgIHphcF9yZWRyYXdfYmxvY2sucl9kYXRhID0gKGludCkgcmVkcmF3X2RhdGE7CisKKyAgICAvKiBQZXJmb3JtIHRoZSBkcmF3ICovCisgICAgc3dpKFphcFJlZHJhd19SZWRyYXdBcmVhLCAwLCAmemFwX3JlZHJhd19ibG9jayk7CisKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKiBPa2F5IHRoYXQgd2FzIGl0IGZyb20gbWUsIGJhY2sgdG8gVGhvbWFzIC4uLgorICovCisKKy8qCisgKiBQYXJzZSB0aGUgR1VJIHJlbGF0ZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gIEFueSBhcmd1bWVudHMgdXNlZCBhcmUKKyAqIGRlbGV0ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgorICovCisgICAgdm9pZAorZ3VpX21jaF9wcmVwYXJlKGludCAqYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50CSAgICBhcmcgPSAxOworCisgICAgd2hpbGUgKGFyZyA8ICphcmdjIC0gMSkKKyAgICB7CisJaWYgKHN0cmNtcChhcmd2W2FyZ10sICItLXJvd3MiKSA9PSAwIHx8IHN0cmNtcChhcmd2W2FyZ10sICItLWNvbHVtbnMiKSA9PSAwKQorCXsKKwkgICAgaW50CSAgICB2YWx1ZTsKKworCSAgICB2YWx1ZSA9IGF0b2koYXJndlthcmcgKyAxXSk7CisKKwkgICAgaWYgKGFyZ3ZbYXJnXVsyXSA9PSAncicpCisJCWRlZmF1bHRfcm93cyA9IHZhbHVlOworCSAgICBlbHNlCisJCWRlZmF1bHRfY29sdW1ucyA9IHZhbHVlOworCisJICAgIC8qIERlbGV0ZSBhcmd1bWVudCBmcm9tIGFyZ3ZbXS4gKGhvcGUgdGhpcyBpcyByZWFkL3dyaXRlISkgKi8KKworCSAgICAqYXJnYyAtPSAyOworCSAgICBpZiAoKmFyZ2MgPiBhcmcpCisJICAgIG1jaF9tZW1tb3ZlKCZhcmd2W2FyZ10sICZhcmd2W2FyZyArIDJdLCAoKmFyZ2MgLSBhcmcpCisJCSAgICAqIHNpemVvZihjaGFyICopKTsKKwl9CisJZWxzZQorCSAgICBhcmcrKzsKKyAgICB9Cit9CisKKy8qIEZhdGFsIGVycm9yIG9uIGluaXRpYWxpc2F0aW9uIC0gcmVwb3J0IGl0IGFuZCBkaWUuICovCisgICAgdm9pZAorcm9fZGllKGVycm9yKQorICAgIGNoYXJfdSAqZXJyb3I7CS8qIFJJU0MgT1MgZXJyb3IgYmxvY2sgKi8KK3sKKyAgICBzd2koV2ltcF9SZXBvcnRFcnJvciwgZXJyb3IsIDUsICJHVmltIik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisvKiBGaW5kIHRoZSBzaXplcyBvZiB0aGUgd2luZG93IHRvb2xzOgorICoKKyAqIENyZWF0ZSBhIHRlc3Qgd2luZG93LgorICogRmluZCBpbm5lciBhbmQgb3V0ZXIgc2l6ZXMuCisgKiBGaW5kIHRoZSBkaWZmZXJlbmNlLgorICogRGVsZXRlIHdpbmRvdy4KKyAqCisgKiBXaGlsZSB3ZSdyZSBoZXJlLCBmaW5kIHRoZSBlaWdlbiB2YWx1ZXMgdG9vLgorICovCisgICAgdm9pZAorcm9fbWVhc3VyZV90b29scygpCit7CisgICAgaW50IGJsb2NrWzEwXTsKKyAgICBpbnQgdmR1W10gPSB7IDQsIDUsIC0xfTsKKyAgICBpbnQgdGVzdF93aW5kb3dbXSA9CisJeworCSAgICAtMTAwLCAtMTAwLAkJLyogVmlzaWJsZSBhcmVhIDogbWluIFgsWSAqLworCSAgICAtNTAsIC01MCwJCS8qCQkgIG1heCBYLFkgKi8KKwkgICAgMCwgICAwLAkJLyogU2Nyb2xsIG9mZnNldHMgKi8KKwkgICAgLTEsCQkJLyogV2luZG93IGluIGZyb250ICovCisJICAgIDB4ZDA4MDAxNTAsCQkvKiBXaW5kb3cgZmxhZ3MgKi8KKwkgICAgMHhmZjA3MDIwNywJCS8qIENvbG91cnMgKi8KKwkgICAgMHgwMDBjMDEwMywJCS8qIE1vcmUgY29sb3VycyAqLworCSAgICAwLCAtMHg0MDAwLAkJLyogV29ya2FyZWEgZXh0ZW50ICovCisJICAgIDB4NDAwMCwgMCwJCS8qIG1heCBYLFkgKi8KKwkgICAgMHgwMDAwMDAwMCwJCS8qIE5vIHRpdGxlICovCisJICAgIDAgPDwgMTIsCQkvKiBObyB3b3JrYXJlYSBidXR0b24gdHlwZSAqLworCSAgICAxLAkJCS8qIFdpbXAgc3ByaXRlIGFyZWEgKi8KKwkgICAgMHgwMDAxMDAwMSwJCS8qIE1pbmltdW0gd2lkdGgsIGhlaWdodCAqLworCSAgICAwLCAwLCAwLAkJLyogVGl0bGUgZGF0YSAobm9uZSkgKi8KKwkgICAgMAkJCS8qIE5vIGljb25zICovCisJfTsKKyAgICBpbnQgaW5uZXJfbWF4X3gsIGlubmVyX21pbl95OworCisgICAgc3dpKFdpbXBfQ3JlYXRlV2luZG93LCAwLCB0ZXN0X3dpbmRvdyk7CisKKyAgICBibG9ja1swXSA9IHIwOworICAgIC8qIE9wZW4gdGhlIHdpbmRvdyAoYW5kIHJlYWQgc3RhdGUpLgorICAgICAqIEdldFdpbmRvd091dGxpbmUgbmVlZHMgaXQgdG9vIGlmIHRoZSB3aW1wIGlzbid0IG5lc3RlZC4KKyAgICAgKi8KKyAgICBzd2koV2ltcF9PcGVuV2luZG93LCAwLCBibG9jayk7CisgICAgaW5uZXJfbWF4X3ggPSBibG9ja1szXTsKKyAgICBpbm5lcl9taW5feSA9IGJsb2NrWzJdOworCisgICAgc3dpKFdpbXBfR2V0V2luZG93T3V0bGluZSwgMCwgYmxvY2spOworCisgICAgZ3VpLnNjcm9sbGJhcl93aWR0aCA9IGJsb2NrWzNdIC0gaW5uZXJfbWF4X3g7CisgICAgZ3VpLnNjcm9sbGJhcl9oZWlnaHQgPSBpbm5lcl9taW5feSAtIGJsb2NrWzJdOworCisgICAgc3dpKFdpbXBfRGVsZXRlV2luZG93LCAwLCBibG9jayk7CisKKyAgICAvKiBSZWFkIHRoZSBzaXplIG9mIG9uZSBwaXhlbC4gKi8KKyAgICBzd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgdmR1LCB2ZHUpOworICAgIHhfZWlnZW5fZmFjdG9yID0gdmR1WzBdOworICAgIHlfZWlnZW5fZmFjdG9yID0gdmR1WzFdOworfQorCisvKiBMb2FkIGEgdGVtcGxhdGUgZnJvbSB0aGUgY3VycmVudCB0ZW1wbGF0ZXMgZmlsZS4KKyAqIENyZWF0ZSB0aGUgd2luZG93IGFuZCByZXR1cm4gaXRzIGhhbmRsZS4KKyAqLworICAgIGludAorcm9fbG9hZF90ZW1wbGF0ZShzdHJfbmFtZSwgdGl0bGUsIHRpdGxlX3NpemUpCisgICAgY2hhcl91ICAqc3RyX25hbWU7ICAgICAgLyogSWRlbnRpZmllciBvZiB3aW5kb3cgaW4gZmlsZSAobWF4IDEyIGNoYXJzKSAgICovCisgICAgY2hhcl91ICAqKnRpdGxlOwkgICAgLyogSWYgbm90IE5VTEwgdGhlbiByZXR1cm4gcG9pbnRlciB0byB0aXRsZSBoZXJlICovCisgICAgaW50ICAgICAqdGl0bGVfc2l6ZTsgICAgLyogSWYgbm90IE5VTEwgdGhlbiByZXR1cm4gdGhlIHRpdGxlIGxlbmd0aCBoZXJlICovCit7CisgICAgaW50ICAgICAqd2luZG93OworICAgIGNoYXIgICAgKmRhdGE7CisgICAgaW50ICAgICBuYW1lWzRdOworCisgICAgc3RyY3B5KCAoY2hhciAqKSBuYW1lLCBzdHJfbmFtZSk7CisKKyAgICAvKiBGaW5kIGhvdyBiaWcgd2UgbXVzdCBtYWtlIHRoZSBidWZmZXJzICovCisKKyAgICBpZiAoeHN3aShXaW1wX0xvYWRUZW1wbGF0ZSwgMCwgMCwgMCwgMCwgLTEsIG5hbWUsIDApICYgdl9mbGFnKQorCXJvX2RpZSggKGNoYXIgKikgcjApOworCisgICAgd2luZG93ID0gbWFsbG9jKHIxKTsJLyogRG9uJ3QgcHJpbnQgdGV4dCBtZXNzYWdlcyBmcm9tIGFsbG9jKCkgKi8KKyAgICBkYXRhID0gbWFsbG9jKHIyKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMKQorCXJvX2RpZSgiXDBcMFwwXDBPdXQgb2YgbWVtb3J5IC0gQ2FuJ3QgbG9hZCB0ZW1wbGF0ZXMiKTsKKworICAgIC8qIExvYWQgdGhlIHRlbXBsYXRlIGludG8gdGhlIGJ1ZmZlcnMgKi8KKworICAgIHN3aShXaW1wX0xvYWRUZW1wbGF0ZSwgMCwKKwkJCQl3aW5kb3csCQkvKiBUZW1wIGJsb2NrICovCisJCQkJZGF0YSwJCS8qIEljb24gZGF0YSAqLworCQkJCWRhdGEgKyByMiArIDEsCS8qIEVuZCBvZiBpY29uIGRhdGEgKi8KKwkJCQktMSwJCS8qIE5vIGZvbnRzICovCisJCQkJbmFtZSwgMCk7CS8qIEZpcnN0IG1hdGNoICovCisgICAgaWYgKHI2ID09IDApCisJcm9fZGllKCJcMFwwXDBcMENhbid0IGZpbmQgd2luZG93IGluIFRlbXBsYXRlcyBmaWxlIik7CisKKyAgICAvKiBDcmVhdGUgdGhlIHdpbmRvdyAqLworCisgICAgaWYgKHhzd2koV2ltcF9DcmVhdGVXaW5kb3csIDAsIHdpbmRvdykgJiB2X2ZsYWcpCisJcm9fZGllKCAoY2hhciAqKSByMCk7CisKKyAgICBpZiAodGl0bGUpCisJKnRpdGxlID0gKGNoYXJfdSAqKSB3aW5kb3dbMThdOworICAgIGlmICh0aXRsZV9zaXplKQorCSp0aXRsZV9zaXplID0gd2luZG93WzIwXTsKKworICAgIGZyZWUod2luZG93KTsJLyogRnJlZSB0ZW1wIGJsb2NrICovCisgICAgcmV0dXJuIHIwOwkJLyogUmV0dXJuIHRoZSB3aW5kb3cgaGFuZGxlICovCit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgR1VJIGNhbiBiZSBzdGFydGVkLiAgQ2FsbGVkIGJlZm9yZSBndmltcmMgaXMgc291cmNlZC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50CitndWlfbWNoX2luaXRfY2hlY2soKQoreworICAgIHJldHVybiBPSzsJCS8qIFRPRE86IEdVSSBjYW4gYWx3YXlzIGJlIHN0YXJ0ZWQ/ICovCit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBSSVNDIE9TIEdVSS4KKyAqIENyZWF0ZSBhbGwgdGhlIHdpbmRvd3MuCisgKiBSZXR1cm5zIE9LIGZvciBzdWNjZXNzLCBGQUlMIHdoZW4gdGhlIEdVSSBjYW4ndCBiZSBzdGFydGVkLgorICovCisgICAgaW50CitndWlfbWNoX2luaXQoKQoreworICAgIGludCAgICAgbWVzc2FnZXNbXSA9IHsKKwkgICAgMSwgMiwgMywgNCwJLyogRGF0YVNhdmUsIERhdGFTYXZlQWNrLCBEYXRhTG9hZCwgRGF0YUxvYWRBY2sgKi8KKwkgICAgOCwJCS8qIFByZVF1aXQgKi8KKwkgICAgMHhmLAkvKiBDbGFpbUVudGl0eSAoZm9yIGNsaXBib2FyZCkgKi8KKwkgICAgMHgxMCwJLyogRGF0YVJlcXVlc3QgKGZvciBjbGlwYm9hcmQpICovCisJICAgIDB4NDAwYzEsCS8qIE1vZGUgY2hhbmdlICovCisJICAgIDB4NDAwYzMsCS8qIFRhc2tDbG9zZURvd24gKi8KKwkgICAgMHg0MDBjOSwJLyogTWVudXNEZWxldGVkICovCisJICAgIDB4ODA4YzEsCS8qIFRXX091dHB1dCAqLworCSAgICAweDgwOGMyLCAgICAvKiBUV19FZ28gKi8KKwkgICAgMHg4MDhjMywJLyogVFdfTW9yaW8gKi8KKwkgICAgMHg4MDhjNCwJLyogVFdfTW9yaXRlICovCisJICAgIDB9OwkJLyogRW5kLW9mLWxpc3QuICovCisKKworICAgIC8qIFRoZXJlIG1heSBoYXZlIGJlZW4gc29tZSBlcnJvcnMgcmVwb3J0ZWQgaW4gdGhlCisgICAgICogY29tbWFuZCB3aW5kb3cgYmVmb3JlIHdlIGdldCBoZXJlLiBXYWl0IGlmIHNvLgorICAgICAqLworICAgIHN3aShXaW1wX1JlYWRTeXNJbmZvLCAzKTsKKyAgICBpZiAocjAgPT0gMCkKKwlzd2koV2ltcF9Db21tYW5kV2luZG93LCAwKTsJLyogV2luZG93IG9wZW5lZCAtIGNsb3NlIHdpdGggcHJvbXB0ICovCisKKyAgICBpZiAoeHN3aShXaW1wX0luaXRpYWxpc2UsIDMxMCwgMHg0YjUzNDE1NCwgIkdWaW0iLCBtZXNzYWdlcykgJiB2X2ZsYWcpCisJcmV0dXJuIEZBSUw7CisgICAgbmVzdGVkX3dpbXAgPSByMCA+PSAzOTc7CisgICAgdGFza19oYW5kbGUgPSByMTsKKworICAgIC8qIExvYWQgdGhlIHRlbXBsYXRlcy4gKi8KKworICAgIGlmICh4c3dpKFdpbXBfT3BlblRlbXBsYXRlLCAwLCAiVmltOlRlbXBsYXRlcyIpICYgdl9mbGFnKQorCXJvX2RpZSggKGNoYXIgKikgcjApOworCisgICAgZ3VpLndpbmRvd19oYW5kbGUgPSByb19sb2FkX3RlbXBsYXRlKCJlZGl0b3IiLAorCSAgICAmZ3VpLndpbmRvd190aXRsZSwKKwkgICAgJmd1aS53aW5kb3dfdGl0bGVfc2l6ZSk7CisKKyAgICBzYXZlX3dpbmRvdyA9IHJvX2xvYWRfdGVtcGxhdGUoInNhdmUiLCBOVUxMLCBOVUxMKTsKKworICAgIHN3aShXaW1wX0Nsb3NlVGVtcGxhdGUpOworCisgICAgLyogU2V0IGRlZmF1bHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvdXJzLiAqLworCisgICAgZ3VpLm5vcm1fcGl4ZWwgPSBndWkuZGVmX25vcm1fcGl4ZWw7CisgICAgZ3VpLmJhY2tfcGl4ZWwgPSBndWkuZGVmX2JhY2tfcGl4ZWw7CisKKyAgICAvKiBHZXQgdGhlIGNvbG91cnMgZnJvbSB0aGUgIk5vcm1hbCIgYW5kICJNZW51IiBncm91cCAoc2V0IGluIHN5bnRheC5jIG9yCisgICAgICogaW4gYSB2aW1yYyBmaWxlKSAqLworCisgICAgc2V0X25vcm1hbF9jb2xvcnMoKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhhdCBub25lIG9mIHRoZSBjb2xvcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICovCisKKyAgICBndWlfY2hlY2tfY29sb3JzKCk7CisKKyAgICAvKiBHZXQgdGhlIGNvbG91cnMgZm9yIHRoZSBoaWdobGlnaHQgZ3JvdXBzIChndWlfY2hlY2tfY29sb3JzKCkgbWlnaHQgaGF2ZQorICAgICAqIGNoYW5nZWQgdGhlbSkgKi8KKworICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOwkJLyogcmUtaW5pdCBjb2xvdXJzIGFuZCBmb250cyAqLworCisgICAgLyogU2V0IGdlb21ldHJ5IGJhc2VkIG9uIHZhbHVlcyByZWFkIG9uIGluaXRpYWxpc2F0aW9uLiAqLworCisgICAgZ3VpLm51bV9jb2xzID0gQ29sdW1ucyA9IGRlZmF1bHRfY29sdW1uczsKKyAgICBndWkubnVtX3Jvd3MgPSBSb3dzICAgID0gZGVmYXVsdF9yb3dzOworCisgICAgLyogR2V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgb3VyIGVudmlyb25tZW50LiAqLworCisgICAgcm9fbWVhc3VyZV90b29scygpOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBjb2xvdXIgaGFzIGJlZW4gY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbmV3X2NvbG9ycygpCit7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBHVUkgd2luZG93IHdoaWNoIHdhcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBndWlfbWNoX2luaXQoKS4KKyAqLworICAgIGludAorZ3VpX21jaF9vcGVuKHZvaWQpCit7CisgICAgaW50IGJsb2NrWzEwXTsKKworICAgIGJsb2NrWzBdID0gZ3VpLndpbmRvd19oYW5kbGU7CisgICAgc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKyAgICBibG9ja1s3XSA9IC0xOwkJICAgIC8qIE9wZW4gYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKi8KKyAgICBzd2koV2ltcF9PcGVuV2luZG93LCAwLCBibG9jayk7CisKKyAgICAvKiBHaXZlIHRoZSBuZXcgd2luZG93IHRoZSBpbnB1dCBmb2N1cyAqLworICAgIHN3aShXaW1wX1NldENhcmV0UG9zaXRpb24sIGd1aS53aW5kb3dfaGFuZGxlLCAtMSwgMCwgMCwgLTEsIC0xKTsKKworICAgIGlmIChndWlfd2luX3ggIT0gLTEgJiYgZ3VpX3dpbl95ICE9IC0xKQorCWd1aV9tY2hfc2V0X3dpbnBvcyhndWlfd2luX3gsIGd1aV93aW5feSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2V4aXQoaW50IHJjKQoreworICAgIGludAkgICAgYmxvY2tbNjRdOworCisgICAgLyogQ2xvc2Ugd2luZG93LiBTdG9wcyB1cyBmcm9tIGdldHRpbmcgdHJvdWJsZXNvbWUgZXZlbnRzCisgICAgICogaWYgd2UgdGFrZSBhIHdoaWxlIHRvIGRpZS4KKyAgICAgKi8KKyAgICBibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIHN3aShXaW1wX0Nsb3NlV2luZG93LCAwLCBibG9jayk7CisKKyAgICBpZiAoY2hpbGRfaGFuZGxlKQorICAgIHsKKwkvKiBXZSBzdGlsbCBoYXZlIGEgc3ViLXRhc2sgcnVubmluZyAtIGtpbGwgaXQgKi8KKwlibG9ja1swXSA9IDIwOworCWJsb2NrWzNdID0gMDsKKwlibG9ja1s0XSA9IDA7CSAgICAvKiBRdWl0ICovCisJaWYgKCh4c3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE3LCBibG9jaywgY2hpbGRfaGFuZGxlKSAmIHZfZmxhZykgPT0gMCkKKwl7CisJICAgIC8qIElkbGUgdW50aWwgY2hpbGQgZGllcy4gKi8KKwkgICAgd2hpbGUgKGNoaWxkX2hhbmRsZSkKKwkgICAgeworCQlwcm9jZXNzX2V2ZW50KHdpbXBfcG9sbCgxLCBibG9jayksIGJsb2NrKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBleGl0KHJjKTsKK30KKworLyoKKyAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgorICovCisgICAgaW50CitndWlfbWNoX2dldF93aW5wb3MoaW50ICp4LCBpbnQgKnkpCit7CisgICAgLyogVE9ETyAqLworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuCisgKiBjb29yZGluYXRlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCit7CisgICAgLyogVE9ETyAqLworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIG1pbl93aWR0aCwgbWluX2hlaWdodCwgYmFzZV93aWR0aCwgYmFzZV9oZWlnaHQpCisgICAgaW50IHdpZHRoOwkJLyogSW4gT1MgdW5pdHMgKi8KKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBtaW5fd2lkdGg7CS8qIFNtYWxsZXN0IHBlcm1pc3NhYmxlIHdpbmRvdyBzaXplIChpZ25vcmVkKSAqLworICAgIGludCBtaW5faGVpZ2h0OworICAgIGludCBiYXNlX3dpZHRoOwkvKiBTcGFjZSBmb3Igc2Nyb2xsIGJhcnMsIGV0YyAqLworICAgIGludCBiYXNlX2hlaWdodDsKK3sKKyAgICBpbnQgc193aWR0aCwgc19oZWlnaHQ7CisgICAgaW50IGJsb2NrW10gPSB7CisJZ3VpLndpbmRvd19oYW5kbGUsCisJMCwKKwktaGVpZ2h0ICsgMSwKKwl3aWR0aCwKKwkxfTsKKworICAgIGd1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKCZzX3dpZHRoLCAmc19oZWlnaHQpOworICAgIHNfd2lkdGggLT0gYmFzZV93aWR0aDsKKyAgICBzX2hlaWdodCAtPSBiYXNlX2hlaWdodDsJCSAgICAvKiBVbmRlcmVzdGltYXRlIC0gaWdub3JlcyB0aXRsZWJhciAqLworCisgICAgc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKyAgICBibG9ja1szXSAgPSBibG9ja1sxXSArIHdpZHRoOworICAgIGJsb2NrWzJdICA9IGJsb2NrWzRdIC0gaGVpZ2h0OworICAgIGlmIChibG9ja1szXSA+IHNfd2lkdGgpCisgICAgeworCWJsb2NrWzNdID0gc193aWR0aDsKKwlibG9ja1sxXSA9IGJsb2NrWzNdIC0gd2lkdGg7CisgICAgfQorICAgIGlmIChibG9ja1syXSA8IGd1aS5zY3JvbGxiYXJfaGVpZ2h0KQorICAgIHsKKwlibG9ja1syXSA9IGd1aS5zY3JvbGxiYXJfaGVpZ2h0OworCWJsb2NrWzRdID0gYmxvY2tbMl0gKyBoZWlnaHQ7CisgICAgfQorICAgIHN3aShXaW1wX09wZW5XaW5kb3csIDAsIGJsb2NrKTsKKyAgICBzd2koV2ltcF9Gb3JjZVJlZHJhdywgZ3VpLndpbmRvd19oYW5kbGUsIDAsIC1oZWlnaHQsIHdpZHRoLCAwKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKGludCAqc2NyZWVuX3csIGludCAqc2NyZWVuX2gpCit7CisgICAgaW50IGJsb2NrW10gPSB7NCwgNSwgMTEsIDEyLCAtMX07CisKKyAgICBzd2koT1NfUmVhZFZkdVZhcmlhYmxlcywgYmxvY2ssIGJsb2NrKTsKKyAgICAqc2NyZWVuX3cgPSAoYmxvY2tbMl0gKyAxKSA8PCBibG9ja1swXTsKKyAgICAqc2NyZWVuX2ggPSAoYmxvY2tbM10gKyAxKSA8PCBibG9ja1sxXTsKK30KKworLyogVGFrZSBhIGZvbnQgbmFtZSB3aXRoIG9wdGlvbnMgYW5kIHJldHVybiBhIGZvbnQgaGFuZGxlLCBvcgorICogemVybyBmb3IgZmFpbHVyZS4KKyAqIFJlcGxhY2UgZXh0ZW5zaW9uIHdpdGggJ0JvbGQnIG9yICdJdGFsaWMnIGRlcGVuZGluZyBvbiBtb2RpZmllcnMuCisgKi8KKyAgICBpbnQKK3JvX2dldF9mb250KGZ1bGxuYW1lLCB3ZWlnaHQpCisgICAgY2hhcl91CSpmdWxsbmFtZTsKKyAgICBpbnQJCXdlaWdodDsJCS8qIEluaXRpYWwgd2VpZ2h0czoKKwkJCQkgKiBCSVQJICAgIE1FQU5JTkcKKwkJCQkgKiAwCSAgICBib2xkCisJCQkJICogMQkgICAgaXRhbGljCisJCQkJICovCit7CisgICAgY2hhcl91CSphcmc7CisgICAgY2hhcl91CWZvbnRbNDFdOworICAgIGludAkJd2lkdGggPSAtMTsKKyAgICBpbnQJCWhlaWdodCA9IC0xOworICAgIGludAkJbmFtZV9sZW47CisgICAgaW50CQlpOworICAgIGNoYXJfdQljOworCisgICAgZm9yIChpID0gMDsgaSA8IDM5OykKKyAgICB7CisJYyA9IGZ1bGxuYW1lW2ldOworCWlmIChjID09ICc6JyB8fCBjID09IE5VTCB8fCBjID09ICcuJykKKwkgICAgYnJlYWs7CisJZm9udFtpKytdID0gYzsKKyAgICB9CisKKyAgICAvKiBmaW5kIHRoZSBmaXJzdCBtb2RpZmllciwgTlVMTCBpZiBub25lICovCisgICAgYXJnID0gc3RyY2hyKGZ1bGxuYW1lICsgaSwgJzonKTsKKworICAgIHdoaWxlIChhcmcpCisgICAgeworCXN3aXRjaCAoKisrYXJnKQorCXsKKwkgICAgY2FzZSAnaCc6CisJCWhlaWdodCA9IHN0cnRvbChhcmcgKyAxLCAoY2hhciAqKikgJmFyZywgMTApOworCQlicmVhazsKKwkgICAgY2FzZSAndyc6CisJCXdpZHRoID0gc3RydG9sKGFyZyArIDEsIChjaGFyICoqKSAmYXJnLCAxMCk7CisJCWJyZWFrOworCSAgICBjYXNlICdiJzoKKwkJd2VpZ2h0IHw9IDE7CisJCWJyZWFrOworCSAgICBjYXNlICdpJzoKKwkJd2VpZ2h0IHw9IDI7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJYXJnID0gc3RyY2hyKGFyZywgJzonKTsKKyAgICB9CisKKyAgICBpZiAoKHdlaWdodCAmIDEpICYmIGkgPCAzNSkKKyAgICB7CisJLyogQm9sZCBnb2VzIGluc3RlYWQgb2YgZ2l2ZW4gc3VmZml4ICovCisJc3RybmNweShmb250ICsgaSwgIi5Cb2xkIiwgNSk7CisJaSArPSA1OworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIENvcHkgcmVzdCBvZiBuYW1lIHVubGVzcyB3ZSBhcmUgdXNpbmcgQm9sZCAqLworCXdoaWxlIChpIDwgMzkpCisJeworCSAgICBjID0gZnVsbG5hbWVbaV07CisJICAgIGlmIChjID09ICc6JyB8fCBjID09IE5VTCkKKwkJYnJlYWs7CisJICAgIGZvbnRbaSsrXSA9IGM7CisJfQorICAgIH0KKyAgICBpZiAoKHdlaWdodCAmIDIpICYmIGkgPCAzMikKKyAgICB7CisJc3RybmNweShmb250ICsgaSwgIi5PYmxpcXVlIiwgOCk7CisJaSArPSA4OworICAgIH0KKworICAgIGZvbnRbaV0gPSAwOworCisgICAgaWYgKGhlaWdodCA8IDEgJiYgd2lkdGggPCAxKQorCWhlaWdodCA9IHdpZHRoID0gMTA7CS8qIERlZmF1bHQgdG8gMTBwdCAqLworICAgIGVsc2UgaWYgKGhlaWdodCA8IDEpCisJaGVpZ2h0ID0gd2lkdGg7CisgICAgZWxzZSBpZiAod2lkdGggPCAxKQorCXdpZHRoID0gaGVpZ2h0OworCisgICAgaWYgKHhzd2koRm9udF9GaW5kRm9udCwgMCwgZm9udCwgd2lkdGggPDwgNCwgaGVpZ2h0IDw8IDQsIDAsIDApICYgdl9mbGFnKQorCXJldHVybiBOT0ZPTlQ7CQkvKiBDYW4ndCBmaW5kIGZvbnQgKi8KKworICAgIHJldHVybiByMDsKK30KKworLyogTG9hZCBhIGZpbGUgaW50byBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBjaGVjayBpdCBpcyB2YWxpZC4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBibG9jayBvbiBzdWNjZXNzLgorICovCisgICAgY2hhciAgICAqCit6YXBfbG9hZF9maWxlKG5hbWUsIHN0eWxlKQorICAgIGNoYXJfdSAgKm5hbWU7CSAgICAvKiBOYW1lIG9mIGRpcmVjdG9yeSBjb250YWluaW5nIHN0eWxlcyAqLworICAgIGNoYXJfdSAgKnN0eWxlOwkgICAgLyogTmFtZSBvZiBzdHlsZSB3aXRoaW4gZGlyZWN0b3J5ICovCit7CisgICAgY2hhcl91ICBmbmFtZVsyNTZdOworICAgIGNoYXJfdSAgKmZpbGU7CisKKyAgICBpZiAoc3RybGVuKG5hbWUpICsgc3RybGVuKHN0eWxlKSA+IDI1NCkKKwlyZXR1cm4gTlVMTDsJICAgIC8qIE5hbWVzIHRvbyBsb25nICovCisKKyAgICBzcHJpbnRmKGZuYW1lLCAiJXMuJXMiLCBuYW1lLCBzdHlsZSk7CisKKyAgICAvKiBMb2FkIHRoZSBuYW1lZCBmb250IGluIDFicHAgZm9ybWF0LiAqLworICAgIGlmICh4c3dpKE9TX0ZpbGUsIDEzLCBmbmFtZSwgMCwgMCwgIlZpbUZvbnRzOiIpICYgdl9mbGFnIHx8IHIwICE9IDEpCisJcmV0dXJuIE5VTEw7CSAgICAvKiBFcnJvciByZWFkaW5nIGZpbGUgaW5mbywgb3Igbm90IGEgZmlsZSAqLworCisgICAgLyogQWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBsb2FkIHRoZSB3aG9sZSBmaWxlICovCisgICAgZmlsZSA9IChjaGFyICopIGFsbG9jKHI0KTsKKyAgICBpZiAoIWZpbGUpCisJcmV0dXJuIE5VTEw7CS8qIE91dCBvZiBtZW1vcnkgKi8KKworICAgIGlmICh4c3dpKE9TX0ZpbGUsIDEyLCBmbmFtZSwgZmlsZSwgMCwgIlZpbUZvbnRzOiIpICYgdl9mbGFnKQorCXJldHVybiBOVUxMOwkvKiBVbmFibGUgdG8gbG9hZCBmaWxlICovCisKKyAgICBpZiAoc3RybmNtcChmaWxlLCAiWmFwRm9udFwwMTUiLCA4KSA9PSAwKQorCXJldHVybiBmaWxlOwkvKiBMb2FkZWQgT0shICovCisKKyAgICBmcmVlKGZpbGUpOworICAgIHJldHVybiBOVUxMOwkvKiBOb3QgYSB2YWxpZCBmb250IGZpbGUgKi8KK30KKworLyogTG9hZCBhbmQgY29udmVydCB0aGUgbmFtZWQgZm9udC4KKyAqIElmIG5hbWUgaXMgTlVMTCBvciBhIG51bGwgc3RyaW5nIHRoZW4gY29udmVydCB0aGUgc3lzdGVtIGZvbnQuCisgKiBSZXR1cm4gT0sgb24gc3VjY2VzczsgRkFJTCBhbmQgd2UgcmV2ZXJ0IHRvIHVzaW5nIHRoZSBWRFUgZHJpdmVycy4KKyAqCisgKiAnbmFtZScgaXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkuCisgKiBUcmllcyB0byBsb2FkICduYW1lLjAnLCAnbmFtZS5CJywgJ25hbWUuSScgYW5kICduYW1lLklCJy4KKyAqLworICAgIGludAoremFwX2xvYWRfZm9udChuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaW50CSAgICBpOworCisgICAgLyogRnJlZSB0aGUgZXhpc3RpbmcgZm9udCBmaWxlcywgaWYgYW55ICovCisgICAgZm9yIChpID0gMDsgaSA8IFpBUF9TVFlMRVM7IGkrKykKKyAgICB7CisJdmltX2ZyZWUoemFwX2ZpbGVbaV0pOworCXphcF9maWxlW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobmFtZSAmJiAqbmFtZSA9PSAnIScpCisgICAgeworCW5hbWUrKzsKKwlkb3VibGVfaGVpZ2h0ID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorCWRvdWJsZV9oZWlnaHQgPSBGQUxTRTsKKworICAgIGlmIChuYW1lICYmICpuYW1lKQorICAgIHsKKwl6YXBfZmlsZVtaQVBfTk9STUFMXQk9IHphcF9sb2FkX2ZpbGUobmFtZSwgIjAiKTsKKwlpZiAoIXphcF9maWxlW1pBUF9OT1JNQUxdKQorCSAgICByZXR1cm4gRkFJTDsJLyogQ2FuJ3QgbG9hZCB0aGUgJ25vcm1hbCcgc3R5bGUgLSBlcnJvciAqLworCisJemFwX2ZpbGVbWkFQX0JPTERdCT0gemFwX2xvYWRfZmlsZShuYW1lLCAiQiIpOworCXphcF9maWxlW1pBUF9JVEFMSUNdCT0gemFwX2xvYWRfZmlsZShuYW1lLCAiSSIpOworCXphcF9maWxlW1pBUF9CSVRBTElDXQk9IHphcF9sb2FkX2ZpbGUobmFtZSwgIklCIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaW50CSpoZWFkZXI7CisJY2hhcgl3b3JrYXJlYVsxNl07CisJY2hhcgkqb2xkX3dhOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzeXN0ZW0gZm9udCAoOCB4IDggeCAyNTYgYml0cywgcGx1cyBoZWFkZXIpICovCisJaGVhZGVyID0gKGludCAqKSBhbGxvYygweDIwICsgOCAqIDI1Nik7CisJaWYgKGhlYWRlciA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKwl6YXBfZmlsZVtaQVBfTk9STUFMXSA9IChjaGFyICopIGhlYWRlcjsKKworCS8qIFN0b3JlIGRldGFpbHMgYWJvdXQgdGhlIHN5c3RlbSBmb250ICovCisJaGVhZGVyWzJdID0gODsJICAgIC8qIFdpZHRoICovCisJaGVhZGVyWzNdID0gODsJICAgIC8qIEhlaWdodCAqLworCWhlYWRlcls0XSA9IDA7CSAgICAvKiBGaXJzdCBjaGFyICovCisJaGVhZGVyWzVdID0gMjU1OyAgICAvKiBMYXN0IGNoYXIgKi8KKwloZWFkZXJbNl0gPSBoZWFkZXJbN10gPSAwOyAgLyogUmVzZXJ2ZWQgKi8KKworCS8qIEdldCBzeXN0ZW0gZm9udCBiaXRtYXAgKi8KKwlvbGRfd2EgPSB6YXBfcmVkcmF3X2Jsb2NrLnJfd29ya2FyZWE7CisJemFwX3JlZHJhd19ibG9jay5yX3dvcmthcmVhID0gd29ya2FyZWE7CisJc3dpKFphcFJlZHJhd19SZWFkU3lzdGVtQ2hhcnMsIHphcF9maWxlW1pBUF9OT1JNQUxdICsgMHgyMCwgJnphcF9yZWRyYXdfYmxvY2spOworCXphcF9yZWRyYXdfYmxvY2sucl93b3JrYXJlYSA9IG9sZF93YTsKKyAgICB9CisKKyAgICByZXR1cm4gcm9femFwX3JlZHJhd19pbml0aWFsaXNlKCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHZpbSB0byB1c2UgdGhlIGZvbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAqIFJldHVybiBGQUlMIGlmIHRoZSBmb250IGNvdWxkIG5vdCBiZSBsb2FkZWQsIE9LIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZ3VpX21jaF9pbml0X2ZvbnQoY2hhcl91ICpmb250X25hbWUsIGludCBmb250c2V0KQoreworICAgIGludAkgICAgbmV3X2hhbmRsZQk9IDA7CSAgICAvKiBVc2UgdGhlIHN5c3RlbSBmb250IGJ5IGRlZmF1bHQgKi8KKworICAgIGlmIChmb250X25hbWVbMF0gPT0gJyEnKQorICAgIHsKKwkvKiBTZWxlY3QgYSBaYXBSZWRyYXcgZm9udCAqLworCWlmICh6YXBfbG9hZF9mb250KGZvbnRfbmFtZSArIDEpKQorCSAgICB6YXBfcmVkcmF3ID0gVFJVRTsKKwllbHNlCisJeworCSAgICBFTVNHMihfKCJFNjEwOiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciKSwgZm9udF9uYW1lKTsKKwkgICAgZm9udF9uYW1lID0gIlN5c3RlbSI7ICAgLyogRXJyb3IgLSB1c2Ugc3lzdGVtIGZvbnQgKi8KKwkgICAgemFwX3JlZHJhdyA9IEZBTFNFOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl6YXBfcmVkcmF3ID0gRkFMU0U7CisKKwlpZiAoZm9udF9uYW1lKQorCXsKKwkgICAgLyogRXh0cmFjdCBhbnkgZXh0cmEgZGV0YWlscyBhYm91dCB0aGUgZm9udCAqLworCSAgICBuZXdfaGFuZGxlID0gcm9fZ2V0X2ZvbnQoZm9udF9uYW1lLCAwKTsKKwkgICAgaWYgKCFuZXdfaGFuZGxlKQorCQlyZXR1cm4gRkFJTDsKKwl9CisJZWxzZQorCSAgICBmb250X25hbWUgPSAiU3lzdGVtIjsKKyAgICB9CisKKyAgICAvKiBGcmVlIHRoZSBwcmV2aW91cyBmb250LCBpZiBhbnkgKi8KKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkubm9ybV9mb250KTsKKyAgICBndWkubm9ybV9mb250ID0gbmV3X2hhbmRsZTsKKyAgICBndWkuY2hhcl9hc2NlbnQgPSAwOworCisgICAgaWYgKG5ld19oYW5kbGUpCisgICAgeworCS8qIFJlYWQgZGV0YWlscyBhYm91dCB0aGUgY2hvc2VuIGZvbnQgKi8KKwlzd2koRm9udF9SZWFkSW5mbywgbmV3X2hhbmRsZSk7CisKKwlndWkuY2hhcl93aWR0aAk9IHIzIC0gcjE7CisJZ3VpLmNoYXJfaGVpZ2h0ID0gcjQgLSByMjsKKworCWZvbnRfeF9vZmZzZXQgPSAtcjE7CS8qIFdoZXJlIHRvIHBvc2l0aW9uIGVhY2ggY2hhciBpbiBpdHMgYm94ICovCisJZm9udF95X29mZnNldCA9IC1yNDsKKworCS8qIFRyeSB0byBsb2FkIG90aGVyIGZvbnRzIGZvciBib2xkLCBpdGFsaWMsIGFuZCBib2xkLWl0YWxpYyAqLworCWd1aV9tY2hfZnJlZV9mb250KGd1aS5ib2xkX2ZvbnQpOworCWd1aS5ib2xkX2ZvbnQgPSByb19nZXRfZm9udChmb250X25hbWUsIDEpOworCWd1aV9tY2hfZnJlZV9mb250KGd1aS5pdGFsX2ZvbnQpOworCWd1aS5pdGFsX2ZvbnQgPSByb19nZXRfZm9udChmb250X25hbWUsIDIpOworCWd1aV9tY2hfZnJlZV9mb250KGd1aS5ib2xkaXRhbF9mb250KTsKKwlndWkuYm9sZGl0YWxfZm9udCA9IHJvX2dldF9mb250KGZvbnRfbmFtZSwgMyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogVXNlIHRoZSBzeXN0ZW0gZm9udCBvciBaYXBSZWRyYXcuICovCisJaWYgKHphcF9yZWRyYXcpCisJeworCSAgICBndWkuY2hhcl93aWR0aAk9IHphcF9yZWRyYXdfYmxvY2sucl9jaGFydyA8PCB6YXBfcmVkcmF3X2Jsb2NrLnJfbWFneDsKKwkgICAgZ3VpLmNoYXJfaGVpZ2h0CT0gemFwX3JlZHJhd19ibG9jay5yX2NoYXJoIDw8IHphcF9yZWRyYXdfYmxvY2sucl9tYWd5OworCSAgICBpZiAoZG91YmxlX2hlaWdodCkKKwkJZ3VpLmNoYXJfaGVpZ2h0IDw8PSAxOworCX0KKwllbHNlCisJeworCSAgICBndWkuY2hhcl93aWR0aAk9IDE2OworCSAgICBndWkuY2hhcl9oZWlnaHQJPSAzMjsKKwl9CisKKwlndWlfbWNoX2ZyZWVfZm9udChndWkuYm9sZF9mb250KTsKKwlndWkuYm9sZF9mb250ID0gMDsKKwlndWlfbWNoX2ZyZWVfZm9udChndWkuaXRhbF9mb250KTsKKwlndWkuaXRhbF9mb250ID0gMDsKKwlndWlfbWNoX2ZyZWVfZm9udChndWkuYm9sZGl0YWxfZm9udCk7CisJZ3VpLmJvbGRpdGFsX2ZvbnQgPSAwOworICAgIH0KKyAgICBobF9zZXRfZm9udF9uYW1lKGZvbnRfbmFtZSk7CisKKyAgICBtdXN0X3JlZHJhdyA9IENMRUFSOworICAgIHJldHVybiBPSzsKK30KKworICAgIGludAorZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUoKQoreworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogR2V0IGEgZm9udCBzdHJ1Y3R1cmUgZm9yIGhpZ2hsaWdodGluZy4KKyAqLworICAgIEd1aUZvbnQKK2d1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgZ2l2ZUVycm9ySWZNaXNzaW5nKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKK3sKKyAgICBpbnQJCWhhbmRsZTsKKworICAgIGlmICghbmFtZSkKKwlyZXR1cm4gTk9GT05UOwkJLyogU3lzdGVtIGZvbnQgaWYgbm8gbmFtZSAqLworCisgICAgaGFuZGxlID0gcm9fZ2V0X2ZvbnQobmFtZSwgMCk7CisgICAgaWYgKCFoYW5kbGUpCisgICAgeworCWlmIChnaXZlRXJyb3JJZk1pc3NpbmcpCisJICAgIEVNU0cyKF8oIkU2MTE6IENhbid0IHVzZSBmb250ICVzIiksIG5hbWUpOworCXJldHVybiBOT0ZPTlQ7CisgICAgfQorCisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb250KEd1aUZvbnQgZm9udCkKK3sKKyAgICByb19jdXJyZW50X2ZvbnQgPSBmb250OworCisgICAgaWYgKGZvbnQpCisgICAgeworCS8qIE5vdCB0aGUgc3lzdGVtIGZvbnQgb3IgWmFwUmVkcmF3IGZvbnQgLSBzZWxlY3QgaXQgKi8KKwlzd2koRm9udF9TZXRGb250LCBmb250KTsKKyAgICB9Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIHR3byBmb250cyBnaXZlbiBhcmUgZXF1aXZhbGVudC4KKyAqLworICAgIGludAorZ3VpX21jaF9zYW1lX2ZvbnQoR3VpRm9udCBmMSwgR3VpRm9udCBmMikKK3sKKyAgICByZXR1cm4gZjEgPT0gZjI7Cit9CisjZW5kaWYKKworLyoKKyAqIElmIGEgZm9udCBpcyBub3QgZ29pbmcgdG8gYmUgdXNlZCwgZnJlZSBpdHMgc3RydWN0dXJlLgorICovCisgICAgdm9pZAorZ3VpX21jaF9mcmVlX2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIGlmIChmb250KQorCXN3aShGb250X0xvc2VGb250LCBmb250KTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgUGl4ZWwgdmFsdWUgKGNvbG91cikgZm9yIHRoZSBnaXZlbiBjb2xvdXIgbmFtZS4KKyAqIFJldHVybiBJTlZBTENPTE9SIGZvciBlcnJvci4KKyAqIE5COiBJJ3ZlIGNoYW5nZWQgR3JlZW4gZm9yIG5vdywgc2luY2UgaXQgbG9va2VkIHJlYWxseSBzaWNrCisgKi8KKyAgICBndWljb2xvcl9UCitndWlfbWNoX2dldF9jb2xvcihjaGFyX3UgKm5hbWUpCit7CisgICAgaW50CQlpOworICAgIHN0cnVjdCBjb2xvdXIKKyAgICB7CisJY2hhcl91CQkqbmFtZTsKKwlndWljb2xvcl9UCXZhbHVlOworICAgIH0gY29sb3Vyc1tdID0KKyAgICB7CisJeyAiUmVkIiwJCWdyZ2IoMjU1LAkwLAkwKQl9LAorCXsgIkxpZ2h0UmVkIiwJCWdyZ2IoMjU1LAkwLAkwKQl9LAorCXsgIkRhcmtSZWQiLAkJZ3JnYigxMzksCTAsCTApCX0sCisKKwl7ICJHcmVlbiIsCQlncmdiKDUwLAkyMDAsCTUwKQl9LAorCXsgIkxpZ2h0R3JlZW4iLAkJZ3JnYigxNDQsCTIzOCwJMTQ0KQl9LAorCXsgIkRhcmtHcmVlbiIsCQlncmdiKDAsCQkxMDAsCTApCX0sCisJeyAiU2VhR3JlZW4iLAkJZ3JnYig0NiwJMTM5LAk4NykJfSwKKworCXsgIkJsdWUiLAkJZ3JnYigwLAkJMCwJMjU1KQl9LAorCXsgIkxpZ2h0Qmx1ZSIsCQlncmdiKDE3MywJMjE2LAkyMzApCX0sCisJeyAiRGFya0JsdWUiLAkJZ3JnYigwLAkJMCwJMTM5KQl9LAorCXsgIlNsYXRlQmx1ZSIsCQlncmdiKDE2MCwJOTAsCTIwNSkJfSwKKworCXsgIkN5YW4iLAkJZ3JnYigwLAkJMjU1LAkyNTUpCX0sCisJeyAiTGlnaHRDeWFuIiwJCWdyZ2IoMjI0LAkyNTUsCTI1NSkJfSwKKwl7ICJEYXJrQ3lhbiIsCQlncmdiKDAsCQkxMzksCTEzOSkJfSwKKworCXsgIk1hZ2VudGEiLAkJZ3JnYigyNTUsCTAsCTI1NSkJfSwKKwl7ICJMaWdodE1hZ2VudGEiLAlncmdiKDI1NSwJMjI0LAkyNTUpCX0sCisJeyAiRGFya01hZ2VudGEiLAlncmdiKDEzOSwJMCwJMTM5KQl9LAorCisJeyAiWWVsbG93IiwJCWdyZ2IoMjU1LAkyNTUsCTApCX0sCisJeyAiTGlnaHRZZWxsb3ciLAlncmdiKDI1NSwJMjU1LAkyMjQpCX0sCisJeyAiRGFya1llbGxvdyIsCQlncmdiKDEzOSwJMTM5LAkwKQl9LAorCXsgIkJyb3duIiwJCWdyZ2IoMTY1LAk0MiwJNDIpCX0sCisKKwl7ICJHcmF5IiwJCWdyZ2IoMTkwLAkxOTAsCTE5MCkJfSwKKwl7ICJHcmV5IiwJCWdyZ2IoMTkwLAkxOTAsCTE5MCkJfSwKKwl7ICJMaWdodEdyYXkiLAkJZ3JnYigyMTEsCTIxMSwJMjExKQl9LAorCXsgIkxpZ2h0R3JleSIsCQlncmdiKDIxMSwJMjExLAkyMTEpCX0sCisJeyAiRGFya0dyYXkiLAkJZ3JnYigxNjksCTE2OSwJMTY5KQl9LAorCXsgIkRhcmtHcmV5IiwJCWdyZ2IoMTY5LAkxNjksCTE2OSkJfSwKKworCXsgIkJsYWNrIiwJCWdyZ2IoMCwJCTAsCTApCX0sCisJeyAiV2hpdGUiLAkJZ3JnYigyNTUsCTI1NSwJMjU1KQl9LAorCisJeyAiT3JhbmdlIiwJCWdyZ2IoMjU1LAkxNjUsCTApCX0sCisJeyAiUHVycGxlIiwJCWdyZ2IoMTYwLAkzMiwJMjQwKQl9LAorCXsgIlZpb2xldCIsCQlncmdiKDIzOCwJMTMwLAkyMzgpCX0sCisJe05VTEwsIDB9CisgICAgfTsKKworICAgIGlmIChuYW1lWzBdID09ICcjJykKKyAgICB7CisJY2hhcgkgICAgKmVuZDsKKwlpbnQJICAgIGM7CisKKwljID0gc3RydG9sKG5hbWUgKyAxLCAmZW5kLCAxNik7CisJcmV0dXJuIChndWljb2xvcl9UKSAoKGMgPj4gMTYpICYgMHhmZikgfCAoYyAmIDB4ZmYwMCkgfCAoKGMgJiAweGZmKSA8PCAxNik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgY29sb3Vyc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICB7CisJaWYgKFNUUklDTVAobmFtZSwgY29sb3Vyc1tpXS5uYW1lKSA9PSAwKQorCSAgICByZXR1cm4gY29sb3Vyc1tpXS52YWx1ZTsKKyAgICB9CisgICAgaWYgKHN0cm5pY21wKG5hbWUsICJncmV5IiwgNCkgPT0gMCB8fCBzdHJuaWNtcChuYW1lLCAiZ3JheSIsIDQpID09IDApCisgICAgeworCWludCBsZXZlbCA9ICgyNTUgKiBhdG9pKG5hbWUgKyA0KSkgLyAxMDA7CisJcmV0dXJuIChndWljb2xvcl9UKSBncmdiKGxldmVsLCBsZXZlbCwgbGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gSU5WQUxDT0xPUjsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGNvbG91cnMuCisgKiBJZiB3ZSBhcmUgdXNpbmcgZm9udHMgdGhlbiBzZXQgdGhlIGFudGlhbGlhc2luZyBjb2xvdXJzIHRvby4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2NvbG9ycyhndWljb2xvcl9UIGZnLCBndWljb2xvcl9UIGJnKQoreworICAgIHphcF9yZWRyYXdfY29sb3Vyc1swXSA9IGJnIDw8IDg7CS8qIEpLMjMwNzk4LCByZWdpc3RlciBuZXcgYmFja2dyb3VuZCBjb2xvdXIgKi8KKyAgICB6YXBfcmVkcmF3X2NvbG91cnNbMV0gPSBmZyA8PCA4OwkvKiBKSzIzMDc5OCwgcmVnaXN0ZXIgbmV3IGZvcmVncm91bmQgY29sb3VyICovCisgICAgemFwX3JlZHJhd191cGRhdGVfY29sb3VycyA9IFRSVUU7CS8qIEpLMjMwNzk4LCBuZWVkIHVwZGF0ZSBvZiBjb2xvdXIgbWFza3MgKi8KKworICAgIHN3aShDb2xvdXJUcmFuc19SZXR1cm5HQ09MLCBmZyA8PCA4KTsKKyAgICBndWkuZmdfY29sb3VyID0gcjA7CisgICAgc3dpKENvbG91clRyYW5zX1JldHVybkdDT0wsIGJnIDw8IDgpOworICAgIGd1aS5iZ19jb2xvdXIgPSByMDsKKworICAgIGlmIChyb19jdXJyZW50X2ZvbnQpCisJc3dpKENvbG91clRyYW5zX1NldEZvbnRDb2xvdXJzLCAwLCBiZyA8PCA4LCBmZyA8PCA4LCAxNCk7Cit9CisKKyAgICB2b2lkCityb19kcmF3X3N0cmluZyh4LCB5LCBzLCBsZW4sIGZsYWdzLCBjbGlwKQorICAgIGludAkgICAgeDsJCS8qIFRvcC1sZWZ0IGNvb3JkIHRvIHBsb3QgYXQgKHggaW5jbCwgeSBleGNsKSAqLworICAgIGludAkgICAgeTsJCS8qIChzY3JlZW4gY29vcmRzKSAqLworICAgIGNoYXJfdSAgKnM7CQkvKiBTdHJpbmcgdG8gcGxvdCAqLworICAgIGludAkgICAgbGVuOwkvKiBMZW5ndGggb2Ygc3RyaW5nICovCisgICAgaW50CSAgICBmbGFnczsJLyogRFJBV19UUkFOU1AsIERSQVdfQk9MRCwgRFJBV19VTkRFUkwgKi8KKyAgICBpbnQqICAgIGNsaXA7CS8qIEpLMjMwNzk4LCBhZGRlZCBjbGlwIHdpbmRvdyAqLworeworICAgIGlmIChyb19jdXJyZW50X2ZvbnQpCisgICAgeworCWludAlmeDsKKwlpbnQJZmxlbiA9IGxlbjsJLyogUHJlc2VydmUgZm9yIHVuZGVybGluZSAqLworCisJLyogVXNlIHRoZSBGb250IG1hbmFnZXIgdG8gcGFpbnQgdGhlIHN0cmluZy4KKwkgKiBNdXN0IGRvIG9uZSBjaGFyIGF0IGEgdGltZSB0byBnZXQgbW9ub3NwYWNpbmcuCisJICovCisKKwlpZiAoZmxhZ3MgJiBEUkFXX0lUQUxJQyAmJiAhZ3VpLml0YWxfZm9udCkKKwkgICAgZmxhZ3MgfD0gRFJBV19VTkRFUkw7CS8qIE5vIGl0YWxpYyAtIHVuZGVybGluZSBpbnN0ZWFkICovCisKKwlpZiAoKGZsYWdzICYgRFJBV19UUkFOU1ApID09IDApCisJeworCSAgICBzd2koQ29sb3VyVHJhbnNfU2V0Q29sb3VyLCBndWkuYmdfY29sb3VyLCAwLCAwLCAwLCAwKTsKKwkgICAgc3dpKE9TX1Bsb3QsIDQsIHgsIHkgLSBndWkuY2hhcl9oZWlnaHQpOworCSAgICBzd2koT1NfUGxvdCwgOTYgKyA1LCB4ICsgbGVuICogZ3VpLmNoYXJfd2lkdGggLSAxLCB5IC0gMSk7CisJfQorCisJZnggPSB4ICsgZm9udF94X29mZnNldDsKKwl3aGlsZSAoZmxlbi0tKQorCXsKKwkgICAgc3dpKEZvbnRfUGFpbnQsIDAsIHMrKywgMHg5MCwgZngsIHkgKyBmb250X3lfb2Zmc2V0LCAwLCAwLCAxKTsKKwkgICAgZnggKz0gZ3VpLmNoYXJfd2lkdGg7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmICh6YXBfcmVkcmF3KQorCXsKKwkgICAgLyogVXNpbmcgZmFzdCBaYXAgcmVkcmF3LiAqLworCSAgICBmbGFncyA9IHJvX3phcF9yZWRyYXdfZHJhd19zdHJpbmcoeCwgeSwgcywgbGVuLCBmbGFncywgY2xpcCk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIFVzaW5nIHRoZSBzeXN0ZW0gZm9udCAqLworCSAgICBpZiAoZmxhZ3MgJiBEUkFXX0lUQUxJQykKKwkJZmxhZ3MgfD0gRFJBV19VTkRFUkw7CisKKwkgICAgaWYgKChmbGFncyAmIERSQVdfVFJBTlNQKSA9PSAwKQorCSAgICB7CisJCXN3aShDb2xvdXJUcmFuc19TZXRDb2xvdXIsIGd1aS5iZ19jb2xvdXIsIDAsIDAsIDAsIDApOworCQlzd2koT1NfUGxvdCwgNCwgeCwgeSAtIGd1aS5jaGFyX2hlaWdodCk7CisJCXN3aShPU19QbG90LCA5NiArIDUsIHggKyBsZW4gKiBndWkuY2hhcl93aWR0aCAtIDEsIHkgLSAxKTsKKwkgICAgfQorCSAgICBzd2koT1NfUGxvdCwgNCwJCQkvKiBNb3ZlIHRoZSBkcmF3aW5nIGN1cnNvciAqLworCQkgICAgeCwKKwkJICAgIHkgLSAxKTsKKwkgICAgc3dpKENvbG91clRyYW5zX1NldENvbG91ciwgZ3VpLmZnX2NvbG91ciwgMCwgMCwgMCwgMCk7CisJICAgIHN3aShPU19Xcml0ZU4sIHMsIGxlbik7CisKKwkgICAgaWYgKGZsYWdzICYgRFJBV19CT0xEKQorCSAgICB7CisJCXN3aShPU19QbG90LCA0LCB4ICsgKDEgPDwgeF9laWdlbl9mYWN0b3IpLCB5IC0gMSk7CisJCXN3aShPU19Xcml0ZU4sIHMsIGxlbik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRFJBV19VTkRFUkwpCisgICAgeworCWlmIChyb19jdXJyZW50X2ZvbnQgfHwgemFwX3JlZHJhdykKKwkgICAgc3dpKENvbG91clRyYW5zX1NldENvbG91ciwgZ3VpLmZnX2NvbG91ciwgMCwgMCwgMCwgMCk7CisJLyogVW5kZXJsaW5lZCBpcyB0aGUgc2FtZSB3aXRoIGFsbCBwbG90dGluZyBtZXRob2RzICovCisJc3dpKE9TX1Bsb3QsIDQsIHgsIHkgLSBndWkuY2hhcl9oZWlnaHQpOworCXN3aShPU19QbG90LCAxLCBndWkuY2hhcl93aWR0aCAqIGxlbiwgMCk7CisgICAgfQorfQorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3N0cmluZyhpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncykKK3sKKyAgICBpbnQgeCwgeTsJCS8qIFdvcmthcmVhIHgseSAqLworICAgIHggPSBjb2wgKiBndWkuY2hhcl93aWR0aDsKKyAgICB5ID0gLXJvdyAqIGd1aS5jaGFyX2hlaWdodDsKKworICAgIGlmIChyZWRyYXdfYmxvY2spCisgICAgeworCXJvX2RyYXdfc3RyaW5nKHggKyByZWRyYXdfYmxvY2tbMV0sIHkgKyByZWRyYXdfYmxvY2tbNF0sCisJCQlzLCBsZW4sIGZsYWdzLCAmcmVkcmF3X2Jsb2NrWzddKTsJLyogSksyMzA3OTgsIGFkZGVkIGNsaXAgd2luZG93ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaW50IGJsb2NrWzQ0XTsKKwlibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworCWJsb2NrWzFdID0geDsKKwlibG9ja1syXSA9IHkgLSBndWkuY2hhcl9oZWlnaHQ7CisJYmxvY2tbM10gPSAoY29sICsgbGVuKSAqIGd1aS5jaGFyX3dpZHRoOworCWJsb2NrWzRdID0geTsKKwlzd2koV2ltcF9VcGRhdGVXaW5kb3csIDAsIGJsb2NrKTsKKwl3aGlsZSAocjApCisJeworCSAgICByb19kcmF3X3N0cmluZyh4ICsgYmxvY2tbMV0sIHkgKyBibG9ja1s0XSwKKwkJCXMsIGxlbiwgZmxhZ3MsICZibG9ja1s3XSk7CS8qIEpLMjMwNzk4LCBhZGRlZCBjbGlwIHdpbmRvdyAqLworCSAgICBzd2koV2ltcF9HZXRSZWN0YW5nbGUsIDAsIGJsb2NrKTsKKwl9CisgICAgfQorfQorCisvKgorICogUmV0dXJuIE9LIGlmIHRoZSBrZXkgd2l0aCB0aGUgdGVybWNhcCBuYW1lICJuYW1lIiBpcyBzdXBwb3J0ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KGNoYXJfdSAqbmFtZSkKK3sKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfYmVlcCh2b2lkKQoreworICAgIHN3aShPU19Xcml0ZUkgKyA3KTsKK30KKworLyoKKyAqIFZpc3VhbCBiZWxsLgorICovCisgICAgdm9pZAorZ3VpX21jaF9mbGFzaChpbnQgbXNlYykKK3sKKyAgICAvKiBUT0RPICovCit9CisKKworLyoKKyAqIFBsb3QgYSBzb2xpZCByZWN0YW5nbGUgdXNpbmcgdGhlIGdpdmVuIHBsb3QgYWN0aW9uIGFuZCBjb2xvdXIuCisgKiBDb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlIGFuZCB3aW5kb3ctcmVsYXRpdmUuCisgKi8KKyAgICB2b2lkCitwbG90X3JlY3RhbmdsZShwbG90LCBjb2xvdXIsIG1pbngsIG1pbnksIG1heHgsIG1heHkpCisgICAgaW50IHBsb3Q7CQkvKiBPU19QbG90IGFjdGlvbiAqLworICAgIGludCBjb2xvdXI7CisgICAgaW50IG1pbng7CisgICAgaW50IG1pbnk7CisgICAgaW50IG1heHg7CisgICAgaW50IG1heHk7Cit7CisgICAgaWYgKHJlZHJhd19ibG9jaykKKyAgICB7CisJc3dpKENvbG91clRyYW5zX1NldENvbG91ciwgY29sb3VyLCAwLCAwLCAwLCAwKTsKKwlzd2koT1NfUGxvdCwgNCwgbWlueCArIHJlZHJhd19ibG9ja1sxXSwgbWlueSArIHJlZHJhd19ibG9ja1s0XSk7CisJc3dpKE9TX1Bsb3QsIHBsb3QsIG1heHggKyByZWRyYXdfYmxvY2tbMV0sIG1heHkgKyByZWRyYXdfYmxvY2tbNF0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWludCBibG9ja1s0NF07CisJYmxvY2tbMF0gPSBndWkud2luZG93X2hhbmRsZTsKKwlibG9ja1sxXSA9IG1pbng7CisJYmxvY2tbMl0gPSBtaW55OworCWJsb2NrWzNdID0gbWF4eCArIDE7CisJYmxvY2tbNF0gPSBtYXh5ICsgMTsKKwlzd2koV2ltcF9VcGRhdGVXaW5kb3csIDAsIGJsb2NrKTsKKwl3aGlsZSAocjApCisJeworCSAgICBzd2koQ29sb3VyVHJhbnNfU2V0Q29sb3VyLCBjb2xvdXIsIDAsIDAsIDAsIDApOworCSAgICBzd2koT1NfUGxvdCwgNCwgbWlueCArIGJsb2NrWzFdLCBtaW55ICsgYmxvY2tbNF0pOworCSAgICBzd2koT1NfUGxvdCwgcGxvdCwgbWF4eCArIGJsb2NrWzFdLCBtYXh5ICsgYmxvY2tbNF0pOworCSAgICBzd2koV2ltcF9HZXRSZWN0YW5nbGUsIDAsIGJsb2NrKTsKKwl9CisgICAgfQorfQorCisvKgorICogSW52ZXJ0IGEgcmVjdGFuZ2xlIGZyb20gcm93IHIsIGNvbHVtbiBjLCBmb3IgbnIgcm93cyBhbmQgbmMgY29sdW1ucy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZShpbnQgciwgaW50IGMsIGludCBuciwgaW50IG5jKQoreworICAgIHBsb3RfcmVjdGFuZ2xlKDk2ICsgNiwgMCwgRklMTF9YKGMpLCAtRklMTF9ZKHIgKyBuciksIEZJTExfWChjICsgbmMpLCAtRklMTF9ZKHIpKTsKK30KKworLyoKKyAqIEljb25pZnkgdGhlIEdVSSB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ljb25pZnkodm9pZCkKK3sKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEJyaW5nIHRoZSBWaW0gd2luZG93IHRvIHRoZSBmb3JlZ3JvdW5kLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpCit7CisgICAgLyogVE9ETyAqLworfQorI2VuZGlmCisKKy8qIERyYXcgYSBob2xsb3cgcmVjdGFuZ2xlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CisgKiBncmFwaGljcyBjdXJzb3IgcG9zaXRpb24sIHdpdGggdGhlIGdpdmVuIHdpZHRoCisgKiBhbmQgaGVpZ2h0LiBTdGFydCBwb3NpdGlvbiBpcyB0b3AtbGVmdC4KKyAqLworICAgIHZvaWQKK2RyYXdfaG9sbG93KHcsIGgpCisgICAgaW50CXc7CisgICAgaW50CWg7Cit7CisgICAgc3dpKE9TX1Bsb3QsIDEsIHcgLSAxLCAwKTsKKyAgICBzd2koT1NfUGxvdCwgMSwgMCwgMSAtIGgpOworICAgIHN3aShPU19QbG90LCAxLCAxIC0gdywgMCk7CisgICAgc3dpKE9TX1Bsb3QsIDEsIDAsIGggLSAxKTsKK30KKworLyoKKyAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGd1aWNvbG9yX1QgY29sb3VyKQoreworICAgIGludCB4ID0gRklMTF9YKGd1aS5jdXJzb3JfY29sKTsJLyogV2luZG93IHJlbGF0aXZlLCB0b3AtbGVmdCAqLworICAgIGludCB5ID0gLUZJTExfWShndWkuY3Vyc29yX3Jvdyk7CisgICAgaWYgKHJlZHJhd19ibG9jayA9PSBOVUxMKQorICAgIHsKKwlpbnQgYmxvY2tbMTFdOworCisJYmxvY2tbMF0gPSBndWkud2luZG93X2hhbmRsZTsKKwlibG9ja1sxXSA9IHg7CisJYmxvY2tbMl0gPSB5IC0gZ3VpLmNoYXJfaGVpZ2h0OworCWJsb2NrWzNdID0geCArIGd1aS5jaGFyX3dpZHRoOworCWJsb2NrWzRdID0geTsKKwlzd2koV2ltcF9VcGRhdGVXaW5kb3csIDAsIGJsb2NrKTsKKwl3aGlsZSAocjApCisJeworCSAgICBzd2koQ29sb3VyVHJhbnNfU2V0R0NPTCwgY29sb3VyIDw8IDgsIDAsIDAsIDAsIDApOworCisJICAgIHN3aShPU19QbG90LCA0LCB4ICsgYmxvY2tbMV0sIHkgKyBibG9ja1s0XSAtIDEpOworCSAgICBkcmF3X2hvbGxvdyhndWkuY2hhcl93aWR0aCwgZ3VpLmNoYXJfaGVpZ2h0KTsKKworCSAgICBzd2koV2ltcF9HZXRSZWN0YW5nbGUsIDAsIGJsb2NrKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3dpKENvbG91clRyYW5zX1NldEdDT0wsIGNvbG91ciA8PCA4LCAwLCAwLCAwLCAwKTsKKworCXN3aShPU19QbG90LCA0LCB4ICsgcmVkcmF3X2Jsb2NrWzFdLCB5ICsgcmVkcmF3X2Jsb2NrWzRdIC0gMSk7CisJZHJhd19ob2xsb3coZ3VpLmNoYXJfd2lkdGgsIGd1aS5jaGFyX2hlaWdodCk7CisgICAgfQorfQorCisvKgorICogRHJhdyBwYXJ0IG9mIGEgY3Vyc29yLCAidyIgcGl4ZWxzIHdpZGUsIGFuZCAiaCIgcGl4ZWxzIGhpZ2gsIHVzaW5nCisgKiBjb2xvciAiY29sb3IiLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKHcsIGgsIGNvbG91cikKKyAgICBpbnQgdzsKKyAgICBpbnQgaDsKKyAgICBndWljb2xvcl9UIGNvbG91cjsKK3sKKyAgICBpbnQgeCA9IEZJTExfWChndWkuY3Vyc29yX2NvbCk7CisgICAgaW50IHkgPSAtRklMTF9ZKGd1aS5jdXJzb3Jfcm93KTsKKyAgICBzd2koQ29sb3VyVHJhbnNfUmV0dXJuR0NPTCwgY29sb3VyIDw8IDgpOworICAgIHBsb3RfcmVjdGFuZ2xlKDk2ICsgNSwgcjAsIHgsIHkgLSBoLCB4ICsgdyAtIDEsIHkgLSAxKTsKK30KKworLyoKKyAqIENhdGNoIHVwIHdpdGggYW55IHF1ZXVlZCBldmVudHMuICBUaGlzIG1heSBwdXQga2V5Ym9hcmQgaW5wdXQgaW50byB0aGUKKyAqIGlucHV0IGJ1ZmZlciwgY2FsbCByZXNpemUgY2FsbC1iYWNrcywgdHJpZ2dlciB0aW1lcnMgZXRjLgorICogSWYgdGhlcmUgaXMgbm90aGluZyBpbiB0aGUgZXZlbnQgcXVldWUoJiBubyB0aW1lcnMgcGVuZGluZyksIHRoZW4gd2UgcmV0dXJuCisgKiBpbW1lZGlhdGVseSAod2VsbCwgYWZ0ZXIgYSBXaW1wX1BvbGwpLgorICovCisgICAgdm9pZAorZ3VpX21jaF91cGRhdGUodm9pZCkKK3sKKyAgICBpbnQgYmxvY2tbNjRdOworICAgIGludCByZWFzb247CisKKyAgICBzd2koT1NfUmVhZE1vbm90b25pY1RpbWUpOworICAgIGlmICgocjAgLSB0aW1lX29mX2xhc3RfcG9sbCkgPCA1MCkKKwlyZXR1cm47CQkJICAgIC8qIERvbid0IHJldHVybiB0b28gb2Z0ZW4gKi8KKworICAgIHJlYXNvbiA9IHdpbXBfcG9sbCgwLCBibG9jayk7CisgICAgaWYgKHJlYXNvbikKKwlwcm9jZXNzX2V2ZW50KHJlYXNvbiwgYmxvY2spOworICAgIHJvX3JldHVybl9lYXJseSA9IEZBTFNFOwkJLyogV2UncmUgcmV0dXJuaW5nIGFueXdheS4gKi8KK30KKworICAgIHZvaWQKK3JlZHJhd193aW5kb3coYmxvY2spCisgICAgaW50ICpibG9jazsKK3sKKyAgICBpbnQgeCwgeTsJCQkvKiBWaW0gd29ya2FyZWEgY29vcmRzICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGJsYW5rX2NvbDsKKworICAgIHN3aShDb2xvdXJUcmFuc19SZXR1cm5HQ09MLCBVTlVTRURfQ09MT1VSIDw8IDgsIDAsIDAsIDE8PDcsIDApOworICAgIGJsYW5rX2NvbCA9IHIwOworCisgICAgc3dpKFdpbXBfUmVkcmF3V2luZG93LCAwLCBibG9jayk7CisgICAgcmVkcmF3X2Jsb2NrID0gYmxvY2s7CisgICAgd2hpbGUgKHIwKQorICAgIHsKKwl4ID0gYmxvY2tbN10gLSBibG9ja1sxXTsKKwl5ID0gYmxvY2tbNF0gLSBibG9ja1sxMF07CisJd2lkdGggID0gYmxvY2tbOV0gIC0gYmxvY2tbN107CisJaGVpZ2h0ID0gYmxvY2tbMTBdIC0gYmxvY2tbOF07CisKKwlpZiAoaGVpZ2h0ICsgeSA+IFJvd3MgKiBndWkuY2hhcl9oZWlnaHQpCisJeworCSAgICAvKiBCbGFuayBldmVyeXRoaW5nIG9mZiB0aGUgYm90dG9tLiAqLworCSAgICBwbG90X3JlY3RhbmdsZSg5NiArIDUsIGJsYW5rX2NvbCwKKwkJCQkwLCBibG9ja1s4XSAtIGJsb2NrWzRdLAorCQkJCWJsb2NrWzldIC0gYmxvY2tbMV0sIC1GSUxMX1koUm93cykgLSAxKTsKKwkgICAgaGVpZ2h0ID0gUm93cyAqIGd1aS5jaGFyX2hlaWdodDsKKwl9CisJaWYgKHdpZHRoICsgeD4gQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoKQorCXsKKwkgICAgLyogQmxhbmsgZXZlcnl0aGluZyBvZmYgdG8gdGhlIHJpZ2h0LiAqLworCSAgICBwbG90X3JlY3RhbmdsZSg5NiArIDUsIGJsYW5rX2NvbCwKKwkJCQlGSUxMX1goQ29sdW1ucyksIGJsb2NrWzhdIC0gYmxvY2tbNF0sCisJCQkJYmxvY2tbOV0gLSBibG9ja1sxXSwgMCk7CisJICAgIHdpZHRoID0gQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoOworCX0KKwlndWlfcmVkcmF3KHggLCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwlzd2koV2ltcF9HZXRSZWN0YW5nbGUsIDAsIGJsb2NrKTsKKyAgICB9CisgICAgcmVkcmF3X2Jsb2NrID0gTlVMTDsKK30KKworLyogQ2hlY2sgaWYgd2UgaGF2ZSBtb2RpZmllZCBkYXRhLgorICogSWYgd2UgZG8gdGhlbiBhY2sgdGhlIG1lc3NhZ2UgdG8gc3RvcCB0aGUgc2h1dGRvd24uCisgKiBPdGhlcndpc2UsIGlnbm9yZSB0aGUgbWVzc2FnZS4KKyAqLworICAgIHZvaWQKK3JvX3ByZXF1aXQoYmxvY2spCisgICAgaW50CSAgICAqYmxvY2s7Cit7CisgICAgaWYgKCFyb19va190b19xdWl0KCkpCisgICAgeworCS8qIE5vdCBPSyB0byBxdWl0IC0gc3RvcCBzaHV0ZG93biAqLworCWJsb2NrWzNdID0gYmxvY2tbMl07CisJc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE5LCBibG9jaywgYmxvY2tbMV0pOworICAgIH0KKyAgICAvKiBEbyBub3RoaW5nLiBXZSBtYXkgZ2V0IGEgTWVzc2FnZV9RdWl0IGxhdGVyLiAqLworfQorCisvKiBJZiB0aGVyZSBpcyB1bnNhdmVkIGRhdGEgdGhlbiBhc2sgdGhlIHVzZXIgaWYgdGhleSBtaW5kIGxvc2luZyBpdC4KKyAqIFJldHVybiBUUlVFIGlmIHdlIGNhbiBxdWl0IHdpdGhvdXQgc2F2aW5nLCBGQUxTRSB0byBoYWx0IHRoZQorICogc2h1dGRvd24uCisgKi8KKyAgICBpbnQKK3JvX29rX3RvX3F1aXQoKQoreworICAgIGludAkgICAgb2xkX2NvbmZpcm0gPSBjbWRtb2QuY29uZmlybTsKKworICAgIGNtZG1vZC5jb25maXJtID0gRkFMU0U7CSAgICAvKiBVc2Ugb3VyIG93biwgc2luZ2xlIHRhc2tpbmcsIGJveCAqLworCisgICAgaWYgKGNoZWNrX2NoYW5nZWRfYW55KEZBTFNFKSkKKyAgICB7CisJc3dpKFdpbXBfUmVwb3J0RXJyb3IsCisJCSJcMFwwXDBcMFZpbSBjb250YWlucyB1bnNhdmVkIGRhdGEgLSBxdWl0IGFueXdheT8iLAorCQkweDE3LAorCQkiVmltIik7CisJY21kbW9kLmNvbmZpcm0gPSBvbGRfY29uZmlybTsKKwlpZiAocjEgIT0gMSkKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBjbWRtb2QuY29uZmlybSA9IG9sZF9jb25maXJtOworICAgIHJldHVybiBUUlVFOworfQorCisvKiBRdWl0IHdpdGhvdXQgY2hlY2tpbmcgZm9yIHVuc2F2ZWQgZGF0YS4gKi8KKyAgICB2b2lkCityb19xdWl0KCkKK3sKKyAgICBleGl0aW5nID0gVFJVRTsKKyAgICBnZXRvdXQoMCk7CisKKyAgICBleGl0aW5nID0gRkFMU0U7CQkgICAgLyogcHJvYmFibHkgY2FuJ3QgZ2V0IGhlcmUgKi8KKyAgICBzZXRjdXJzb3IoKTsJCSAgICAvKiBwb3NpdGlvbiBjdXJzb3IgKi8KKyAgICBvdXRfZmx1c2goKTsKK30KKworLyogSW5zZW50IHRoZSBnaXZlbiB2aW0gc3BlY2lhbCBjb2RlIGludG8gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIHZvaWQKK3JvX3ByZXNzKGEsIGIsIG1vZGlmaWVyKQorICAgIGNoYXIgYTsKKyAgICBjaGFyIGI7CisgICAgaW50IG1vZGlmaWVyOwkvKiAlPEN0cmw+PFNoaWZ0PiAwMDAwIDAwMDAgKi8KK3sKKyAgICBjaGFyX3UgYnVmWzZdOworICAgIGludAkgICAgdmltX21vZDsKKyAgICBpbnQJICAgIGtleTsKKworCisgICAgLyogQ29udmVydCBSSVNDIE9TIG1vZGlmaWVyIHRvIFZpbSBtb2RpZmllci4gKi8KKyAgICB2aW1fbW9kID0gKChtb2RpZmllciAmIDB4MTApID8gTU9EX01BU0tfU0hJRlQgOiAwKQorCSAgICAgICB8ICgobW9kaWZpZXIgJiAweDIwKSA/IE1PRF9NQVNLX0NUUkwgOiAwKTsKKyAgICBrZXkgPSBzaW1wbGlmeV9rZXkoVEVSTUNBUDJLRVkoYSwgYiksICZ2aW1fbW9kKTsKKworICAgIGJ1ZlszXSA9IENTSTsKKyAgICBidWZbNF0gPSBLRVkyVEVSTUNBUDAoa2V5KTsKKyAgICBidWZbNV0gPSBLRVkyVEVSTUNBUDEoa2V5KTsKKyAgICBpZiAodmltX21vZCkKKyAgICB7CisJYnVmWzBdID0gQ1NJOworCWJ1ZlsxXSA9IEtTX01PRElGSUVSOworCWJ1ZlsyXSA9IHZpbV9tb2Q7CisJYWRkX3RvX2lucHV0X2J1ZihidWYsIDYpOworICAgIH0KKyAgICBlbHNlCisJYWRkX3RvX2lucHV0X2J1ZihidWYgKyAzLCAzKTsKK30KKworLyogVGFrZSBhIHdpbXAga2V5IGNvZGUgYW5kIGluc2VydCB0aGUgdmltIGVxdWl2YWxlbnQKKyAqIGludG8gdmltJ3MgaW5wdXQgYnVmZmVyLgorICogQ1RSTC1DIGFsc28gc2V0cyBnb3RfaW50LgorICovCisgICAgdm9pZAorcm9faW5zZXJ0X2tleShjb2RlKQorICAgIGNoYXJfdSAqY29kZTsJCS8qIFdpbXBfUHJvY2Vzc0tleSBjb2RlICg0IGJ5dGVzKSAqLworeworICAgIGNoYXIgYSA9IGNvZGVbMF07CisgICAgY2hhciBiID0gY29kZVsxXTsKKyAgICBpbnQgYmFzZSwgbW9kaWZpZXI7CisKKyAgICBpZiAoYSA9PSAzICYmIGN0cmxfY19pbnRlcnJ1cHRzKQorCWdvdF9pbnQgPSBUUlVFOworCisgICAgLyogSXMgaXQgYSBub3JtYWwga2V5PyAqLworICAgIGlmIChhID4gMzEgJiYgYSA8IDEyNykKKyAgICB7CisJYWRkX3RvX2lucHV0X2J1Zihjb2RlLCAxKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogV2Ugc2hvdWxkIHBhc3MgYW55IHVucmVjb2duaXNlZCBrZXlzIG9uLCBidXQKKyAgICAgKiBmb3Igbm93IGp1c3QgcGFzcyBvbiBGMTIgY29tYmluYXRpb25zLgorICAgICAqLworICAgIHN3aXRjaCAoYikKKyAgICB7CisJY2FzZSAwOgorCSAgICAvKiBIb21lIGFuZCBEZWxldGUgYXJlIHRoZSBvbmx5IHNwZWNpYWwgY2FzZXMgKi8KKwkgICAgc3dpdGNoIChhKQorCSAgICB7CisJCWNhc2UgMHgxZToKKwkJICAgIHJvX3ByZXNzKCdrJywnaCcsIDApOwkvKiBIb21lICovCisJCSAgICByZXR1cm47CisJCWNhc2UgMHg3ZjoKKwkJICAgIHJvX3ByZXNzKCdrJywnRCcsIDApOwkvKiBEZWxldGUgKi8KKwkJICAgIHJldHVybjsKKwkJY2FzZSBDU0k6CisJCSAgICB7CisJCQkvKiBUdXJuIENTSSBpbnRvIEtfQ1NJLiAgVW50ZXN0ZWQhICovCisJCQljaGFyX3Ugc3RyaW5nWzNdID0ge0NTSSwgS1NfRVhUUkEsIEtFX0NTSX07CisKKwkJCWFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAzKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJZGVmYXVsdDoKKwkJICAgIGFkZF90b19pbnB1dF9idWYoY29kZSwgMSk7CisJCSAgICByZXR1cm47CisJICAgIH0KKwljYXNlIDE6CisJICAgIGlmICgoYSAmIDB4Y2YpID09IDB4Y2MpCisJICAgIHsKKwkJLyogRjEyIHByZXNzZWQgLSBwYXNzIGl0IG9uIChxdWljayBoYWNrKSAqLworCQlzd2koV2ltcF9Qcm9jZXNzS2V5LCBhIHwgMHgxMDApOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgYmFzZSA9IGEgJiAweGNmOworCSAgICBtb2RpZmllciA9IGEgJiAweDMwOworCSAgICBzd2l0Y2ggKGJhc2UpCisJICAgIHsKKwkJY2FzZSAweDhhOgkvKiBUYWIgKi8KKwkJICAgIGFkZF90b19pbnB1dF9idWYoIlwwMTEiLCAxKTsKKwkJICAgIHJldHVybjsKKwkJY2FzZSAweDhiOgkvKiBDb3B5IChFbmQpICovCisJCSAgICByZXR1cm4gcm9fcHJlc3MoJ0AnLCAnNycsIG1vZGlmaWVyKTsKKwkJY2FzZSAweDhjOgkvKiBMZWZ0ICovCisJCSAgICByZXR1cm4gcm9fcHJlc3MoJ2snLCAnbCcsIG1vZGlmaWVyKTsKKwkJY2FzZSAweDhkOgkvKiBSaWdodCAqLworCQkgICAgcmV0dXJuIHJvX3ByZXNzKCdrJywgJ3InLCBtb2RpZmllcik7CisJCWNhc2UgMHg4ZToJLyogRG93biAqLworCQkgICAgaWYgKG1vZGlmaWVyICYgMHgxMCkKKwkJCXJldHVybiByb19wcmVzcygnaycsICdOJywgbW9kaWZpZXIgXiAweDEwKTsKKwkJICAgIGVsc2UKKwkJCXJldHVybiByb19wcmVzcygnaycsICdkJywgbW9kaWZpZXIpOworCQljYXNlIDB4OGY6CS8qIFVwICovCisJCSAgICBpZiAobW9kaWZpZXIgJiAweDEwKQorCQkJcmV0dXJuIHJvX3ByZXNzKCdrJywgJ1AnLCBtb2RpZmllciBeIDB4MTApOworCQkgICAgZWxzZQorCQkJcmV0dXJuIHJvX3ByZXNzKCdrJywgJ3UnLCBtb2RpZmllcik7CisJCWNhc2UgMHhjYToJLyogRjEwICovCisJCSAgICByZXR1cm4gcm9fcHJlc3MoJ2snLCAnOycsIG1vZGlmaWVyKTsKKwkJY2FzZSAweGNiOgkvKiBGMTEgKi8KKwkJICAgIHJldHVybiByb19wcmVzcygnRicsICcxJywgbW9kaWZpZXIpOworCQljYXNlIDB4Y2Q6CS8qIEluc2VydCAqLworCQkgICAgcmV0dXJuIHJvX3ByZXNzKCdrJywgJ0knLCBtb2RpZmllcik7CisJCWRlZmF1bHQ6CisJCSAgICBpZiAoYmFzZSA+IDB4ODAgJiYgYmFzZSA8IDB4MThhKQorCQkgICAgeworCQkJLyogT25lIG9mIHRoZSBvdGhlciBmdW5jdGlvbiBrZXlzICovCisJCQlyZXR1cm4gcm9fcHJlc3MoJ2snLCAnMCcgKyAoYmFzZSAmIDE1KSwgbW9kaWZpZXIpOworCQkgICAgfQorCSAgICB9CisgICAgfQorfQorCisvKiBQcm9jZXNzIGEgbW91c2UgZXZlbnQuICovCisgICAgdm9pZAorcm9fbW91c2UoYmxvY2spCisgICAgaW50ICpibG9jazsKK3sKKyAgICBpbnQgeCwgeSwgYnV0dG9uLCB2aW1fYnV0dG9uOworICAgIGludCBtb2RpZmllcnMgPSAwOworICAgIGludCBtaW5feCwgbWluX3k7CQkvKiBWaXNpYmxlIGFyZWEgb2YgZWRpdG9yIHdpbmRvdyAqLworICAgIGludCBtYXhfeCwgbWF4X3k7CisKKyAgICBpZiAoYmxvY2tbM10gIT0gZ3VpLndpbmRvd19oYW5kbGUgfHwgcm9fZHJhZ2dpbmcpCisJcmV0dXJuOwkJCS8qIE5vdCBvdXIgd2luZG93IG9yIGlnbm9yaW5nIGNsaWNrcyovCisKKyAgICB4ID0gYmxvY2tbMF07CQkvKiBDbGljayBwb3NpdGlvbiAtIHNjcmVlbiBjb29yZHMgKi8KKyAgICB5ID0gYmxvY2tbMV07CisgICAgYnV0dG9uID0gYmxvY2tbMl07CisKKyAgICBibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIHN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisgICAgbWluX3ggPSBibG9ja1sxXTsKKyAgICBtaW5feSA9IGJsb2NrWzJdOworICAgIG1heF94ID0gYmxvY2tbM107CisgICAgbWF4X3kgPSBibG9ja1s0XTsKKworICAgIGlmIChibG9ja1szXSAtIHggPCBndWkuc2Nyb2xsYmFyX3dpZHRoKQorICAgIHsKKwkvKiBDbGljayBpbiB0aGF0IGJsYW5rIGFyZWEgdW5kZXIgdGhlIHNjcm9sbGJhcnMgKi8KKworCWlmIChidXR0b24gJiAweDQ0NCkKKwl7CisJICAgIGludAkgICAgZnJvbnRfYmxvY2tbMTBdOworCSAgICAvKiBEcmFnZ2luZyB3aXRoIFNlbGVjdCAtIGJyaW5nIHdpbmRvdyB0byBmcm9udCBmaXJzdCAqLworCSAgICBmcm9udF9ibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworCSAgICBzd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgMCwgZnJvbnRfYmxvY2spOworCSAgICBmcm9udF9ibG9ja1s3XSA9IC0xOworCSAgICByb19vcGVuX21haW4oZnJvbnRfYmxvY2spOworCX0KKworCWJsb2NrWzBdID0gZ3VpLndpbmRvd19oYW5kbGU7CisJYmxvY2tbMV0gPSA3OwkJCS8qIERyYWcgcG9pbnQgKi8KKwlibG9ja1syXSA9IGJsb2NrWzRdID0gMDsJLyogQ29vcmRzIG9mIHBvaW50LiAqLworCWJsb2NrWzNdID0gYmxvY2tbNV0gPSAwOworCWRyYWdfeF9vZmZzZXQgPSBtYXhfeCAtIHg7CisJZHJhZ195X29mZnNldCA9IG1pbl95IC0geTsKKworCS8qIFBhcmVudCBib3guICovCisJYmxvY2tbNl0gPSBtaW5feCArCisJCQlndWkuc2Nyb2xsYmFyX3dpZHRoICogMiArCisJCQlNSU5fQ09MVU1OUyAqIGd1aS5jaGFyX3dpZHRoOworCWJsb2NrWzddID0gMDsKKwlndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucygmYmxvY2tbOF0sICZibG9ja1s5XSk7CisJYmxvY2tbOV0gPSBtYXhfeSAtCisJCQk0ICogZ3VpLmNoYXJfaGVpZ2h0IC0KKwkJCWd1aS5zY3JvbGxiYXJfaGVpZ2h0OworCisJc3dpKFdpbXBfRHJhZ0JveCwgMCwgYmxvY2spOworCXJvX2RyYWdnaW5nID0gRFJBR19SRVNJWkVfV0lORE9XOworCWRyYWdfYnV0dG9uID0gdmltX2J1dHRvbjsKKwlkcmFnX21vZGlmaWVycyA9IG1vZGlmaWVyczsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGJ1dHRvbiAmIDB4MTExKQorCXZpbV9idXR0b24gPSBNT1VTRV9SSUdIVDsKKyAgICBlbHNlIGlmIChidXR0b24gJiAweDIyMikKKwl2aW1fYnV0dG9uID0gTU9VU0VfTUlERExFOworICAgIGVsc2UKKwl2aW1fYnV0dG9uID0gTU9VU0VfTEVGVDsKKworICAgIHN3aShPU19CeXRlLCAxMjEsIDB4ODApOworICAgIGlmIChyMSA9PSAweGZmKQorCW1vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKKyAgICBzd2koT1NfQnl0ZSwgMTIxLCAweDgxKTsKKyAgICBpZiAocjEgPT0gMHhmZikKKwltb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBzd2koT1NfQnl0ZSwgMTIxLCAweDgyKTsKKyAgICBpZiAocjEgPT0gMHhmZikKKwltb2RpZmllcnMgfD0gTU9VU0VfQUxUOworCisgICAgaWYgKGJ1dHRvbiA9PSAyKQorICAgIHsKKwkvKiBNZW51IGNsaWNrOgorCSAqIElmIHNoaWZ0IHdhcyBwcmVzc2VkIHRoZW4gZG8gdGhlIHBhc3RlIGFjdGlvbi4KKwkgKiBJZiBub3QsIHRoZW4gb3BlbiB0aGUgcG9wLXVwIG1lbnUuCisJICovCisJbW9kaWZpZXJzIF49IE1PVVNFX1NISUZUOworCWlmIChtb2RpZmllcnMgJiYgTU9VU0VfU0hJRlQpCisJeworCSAgICB2aW1tZW51X1QJbWFpbjsKKwkgICAgLyogU2hpZnQgd2FzIE5PVCBwcmVzc2VkIC0gc2hvdyBtZW51ICovCisJICAgIG1haW4uZG5hbWUgPSAoY2hhcl91ICopICJWaW0iOworCSAgICBtYWluLmNoaWxkcmVuID0gcm9vdF9tZW51OworCSAgICBndWlfbWNoX3Nob3dfcG9wdXBtZW51KCZtYWluKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICAvKiBHYWluIHRoZSBpbnB1dCBmb2N1cyAqLworICAgIHN3aShXaW1wX1NldENhcmV0UG9zaXRpb24sIGd1aS53aW5kb3dfaGFuZGxlLCAtMSwgMCwgMCwgLTEsIC0xKTsKKworICAgIGlmIChidXR0b24gJiAweGYwKQorICAgIHsKKwkvKiBEcmFnIG9wZXJhdGlvbjoKKwkgKgorCSAqIFRlbGwgdGhlIFdpbXAgdG8gc3RhcnQgYSBkcmFnLgorCSAqIE1vbml0b3IgbnVsbCBldmVudHMuCisJICovCisJYmxvY2tbMV0gPSA3OwkJCS8qIERyYWcgYSBwb2ludC4gKi8KKwlibG9ja1syXSA9IGJsb2NrWzRdID0geDsJLyogQ29vcmRzIG9mIHBvaW50LiAqLworCWJsb2NrWzNdID0gYmxvY2tbNV0gPSB5OworCWJsb2NrWzZdID0gMDsJCQkvKiBDb29yZHMgb2YgYm91bmRpbmcgYm94LiAqLworCWJsb2NrWzddID0gMDsKKwlndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucygmYmxvY2tbOF0sICZibG9ja1s5XSk7CisKKwlkcmFnX3hfb2Zmc2V0ID0gZHJhZ195X29mZnNldCA9IDA7CisKKwlzd2koV2ltcF9EcmFnQm94LCAwLCBibG9jayk7CisJcm9fZHJhZ2dpbmcgPSBEUkFHX1NFTEVDVElPTjsKKwlkcmFnX2J1dHRvbiA9IHZpbV9idXR0b247CisJZHJhZ19tb2RpZmllcnMgPSBtb2RpZmllcnM7CisKKwl2aW1fYnV0dG9uIHw9IE1PVVNFX0RSQUc7CisgICAgfQorCisgICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQoCisJCXZpbV9idXR0b24sCisJCXggLSBtaW5feCwKKwkJbWF4X3kgLSB5LAorCQlidXR0b24gJiAweGYgPyBUUlVFIDogRkFMU0UsCS8qIGRjbGljayAqLworCQltb2RpZmllcnMpOworfQorCisgICAgdm9pZAorcm9fY29udGludWVfZHJhZyhibG9jaykKKyAgICBpbnQgKmJsb2NrOwkJCS8qIEp1c3QgdXNlZCBhcyBzY3JhcC4gKi8KK3sKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIEdldCBzY3JlZW4gY29vcmRzIG9mIHBvaW50ZXIuICovCisgICAgc3dpKFdpbXBfR2V0UG9pbnRlckluZm8sIDAsIGJsb2NrKTsKKyAgICB4ID0gYmxvY2tbMF0gKyBkcmFnX3hfb2Zmc2V0OworICAgIHkgPSBibG9ja1sxXSArIGRyYWdfeV9vZmZzZXQ7CisKKyAgICBibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIHN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisKKyAgICBpZiAocm9fZHJhZ2dpbmcgPT0gRFJBR19SRVNJWkVfV0lORE9XKQorICAgIHsKKwkvKiBSZXNpemVpbmcgdGhlIG1haW4gd2luZG93LiAqLworCWJsb2NrWzJdID0geTsKKwlibG9ja1szXSA9IHg7CisJcm9fb3Blbl9tYWluKGJsb2NrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBTZWxlY3Rpbmcgc29tZSB0ZXh0LiAqLworCWd1aV9zZW5kX21vdXNlX2V2ZW50KAorCSAgICBkcmFnX2J1dHRvbiB8IE1PVVNFX0RSQUcsCS8qIEFsd2F5cyByZXBvcnQgdGhlIHNhbWUgYnV0dG9uICovCisJICAgIHggLSBibG9ja1sxXSwKKwkgICAgYmxvY2tbNF0gLSB5LAorCSAgICBGQUxTRSwJCQkvKiBOb3QgYSBkb3VibGUgY2xpY2suICovCisJICAgIGRyYWdfbW9kaWZpZXJzKTsKKyAgICB9Cit9CisKKy8qIFVzZXIgaGFzIHJlbGVhc2VkIGFsbCBtb3VzZSBidXR0b25zLCBtYXJraW5nIHRoZSBlbmQgb2YgYSBkcmFnLiAqLworICAgIHZvaWQKK3JvX2RyYWdfZmluaXNoZWQoYmxvY2spCisgICAgaW50ICpibG9jazsKK3sKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKworICAgIC8qIEkgZG9uJ3QgdHJ1c3QgdGhlIGJveCByZXR1cm5lZCBieSBXaW1wX1BvbGw7IGxvb2sgYXQgdGhlIHBvaW50ZXIKKyAgICAgKiBvdXJzZWx2ZXMuCisgICAgICovCisgICAgc3dpKFdpbXBfR2V0UG9pbnRlckluZm8sIDAsIGJsb2NrKTsKKyAgICB4ID0gYmxvY2tbMF0gKyBkcmFnX3hfb2Zmc2V0OworICAgIHkgPSBibG9ja1sxXSArIGRyYWdfeV9vZmZzZXQ7CisKKyAgICBpZiAocm9fZHJhZ2dpbmcgPT0gRFJBR19SRVNJWkVfV0lORE9XKQorICAgIHsKKwlibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworCXN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisJYmxvY2tbMl0gPSB5OworCWJsb2NrWzNdID0geDsKKwlyb19vcGVuX21haW4oYmxvY2spOworCisJd2lkdGggPSAoYmxvY2tbM10gLSBibG9ja1sxXSk7CisJaGVpZ2h0ID0gKGJsb2NrWzRdIC0gYmxvY2tbMl0pOworCisJc3dpKFdpbXBfRm9yY2VSZWRyYXcsIGd1aS53aW5kb3dfaGFuZGxlLCAwLCAtaGVpZ2h0LCB3aWR0aCwgMCk7CisJZ3VpX3Jlc2l6ZV9zaGVsbCh3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworCXN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisJZ3VpX3NlbmRfbW91c2VfZXZlbnQoCisJCU1PVVNFX1JFTEVBU0UsCisJCXggLSBibG9ja1sxXSwKKwkJYmxvY2tbNF0gLSB5LAorCQlGQUxTRSwJCQkvKiBub3QgYSBkb3VibGUgY2xpY2sgKi8KKwkJZHJhZ19tb2RpZmllcnMpOworICAgIH0KKyAgICByb19kcmFnZ2luZyA9IERSQUdfRkFMU0U7Cit9CisKKy8qIExvYWQgdGhlIGZpbGUvcGF0aG5hbWUgZ2l2ZW4gaW4gYmxvY2sgaW50byBhIFtuZXddIGJ1ZmZlci4KKyAqCisgKiBNb2RpZmllcglBY3Rpb24KKyAqCisgKiBOb25lCQk6Y29uZmlybSBlIDxmaWxlPgorICogQ3RybAkJOnNwIDxmaWxlPgorICogU2hpZnQJPGZpbGU+CisgKgorICogSW5zZXJ0IGludG8gdHlwZWJ1ZiwgYXQgdGhlIHN0YXJ0LgorICogSWYgbG9hZGluZyBmcm9tICFTY3JhcCB0aGVuIHVzZSBzYXZlZCBsZWFmbmFtZSBpbnN0ZWFkLCBhbmQKKyAqIGRlbGV0ZSB0aGUgc2NyYXAgZmlsZS4gQWxzbywgaWdub3JlIHNoaWZ0IGtleS4KKyAqCisgKiBOQjogRG9lc24ndCBzZW5kIERhdGFMb2FkQWNrIChvdGhlciBhcHAgbWlnaHQgZGVsZXRlIHRlbXAgZmlsZT8pLgorICovCisgICAgdm9pZAorcm9fZGF0YWxvYWQoYmxvY2spCisgICAgaW50CSAgICAqYmxvY2s7Cit7CisgICAgY2hhcl91ICBuZXdfcGF0aFtNQVhQQVRITF07CisgICAgY2hhcl91ICAqcGF0aCA9ICgoY2hhcl91ICopIGJsb2NrKSArIDQ0OworICAgIGludAkgICAgc2NyYXAgPSBGQUxTRTsKKworICAgIGlmIChibG9ja1szXSA9PSBsZWFmX3JlZiAmJiBsZWFmX25hbWUpCisJc2NyYXAgPSBUUlVFOworCisgICAgc3dpdGNoIChnZXRfcmVhbF9zdGF0ZSgpICYgMHhmZikKKyAgICB7CisJY2FzZSBJTlNFUlQ6CisJY2FzZSBDTURMSU5FOgorCWNhc2UgQ01ETElORStMQU5HTUFQOgorCSAgICAvKiBGb3IgaW5zZXJ0IG1vZGUgd2UgY2FuIG9ubHkgaW5zZXJ0IHRoZSBwYXRobmFtZSAoY3VycmVudGx5KQorCSAgICAgKiBNYWtlIHN1cmUgU2hpZnQgaXMgcHJlc3NlZC4KKwkgICAgICovCisJICAgIHN3aShPU19CeXRlLCAxMjEsIDB4ODApOwkgICAgLyogSXMgU2hpZnQgcHJlc3NlZD8gKi8KKwkgICAgaWYgKHIxID09IDB4ZmYpCisJICAgIHsKKwkJaW5zX3R5cGVidWYoIiAiLCBSRU1BUF9OT05FLCAwLCBUUlVFLCBGQUxTRSk7CisJCWluc190eXBlYnVmKHBhdGgsIFJFTUFQX05PTkUsIDAsIFRSVUUsIEZBTFNFKTsKKwkJcm9fcmV0dXJuX2Vhcmx5ID0gVFJVRTsJCSAgICAvKiBSZXR1cm4gZXZlbiB0aG91Z2ggbm90aGluZyB3YXMgdHlwZWQuICovCisJICAgIH0KKwkgICAgZWxzZQorCQlzd2koV2ltcF9SZXBvcnRFcnJvciwKKwkJCSJcMFwwXDBcMFNvcnJ5LCB5b3UgY2FuIG9ubHkgbG9hZCB0ZXh0IGluIG5vcm1hbCBtb2RlIiwgNSwgIlZpbSIpOworCSAgICBicmVhazsKKworCWNhc2UgTk9STUFMOgorCSAgICByb19yZXR1cm5fZWFybHkgPSBUUlVFOwkgICAgLyogUmV0dXJuIGV2ZW4gdGhvdWdoIG5vdGhpbmcgd2FzIHR5cGVkLiAqLworCisJICAgIGlmIChzY3JhcCkJCQkgICAgLyogUmVtb3ZlIDxXaW1wJFNjcmFwPi4gTGF0ZXIuICovCisJCWluc190eXBlYnVmKCI6IX5yZW1vdmUgPFdpbXAkU2NyYXA+XHIiLCBSRU1BUF9OT05FLCAwLCBUUlVFLCBGQUxTRSk7CisKKwkgICAgLyogSW5zZXJ0IHs6c3AgLDpjb25maXJtIGUgfVsrZlwgPGxlYWY+IF08ZmlsZT48Q1I+ICovCisJICAgIGluc190eXBlYnVmKCJcciIsIFJFTUFQX05PTkUsIDAsIFRSVUUsIEZBTFNFKTsKKwkgICAgaW5zX3R5cGVidWYocGF0aCwgUkVNQVBfTk9ORSwgMCwgVFJVRSwgRkFMU0UpOworCSAgICBpbnNfdHlwZWJ1ZigiICIsIFJFTUFQX05PTkUsIDAsIFRSVUUsIEZBTFNFKTsKKworCSAgICBpZiAoc2NyYXApCisJICAgIHsKKwkJLyogTG9hZGluZyB2aWEgIVNjcmFwIC0gY2hhbmdlIHBhdGhuYW1lIHRvIHN0b3JlZCBsZWFmbmFtZSAqLworCQlpbnNfdHlwZWJ1ZihsZWFmX25hbWUsIFJFTUFQX05PTkUsIDAsIFRSVUUsIEZBTFNFKTsKKwkJaW5zX3R5cGVidWYoIiArZlxcICIsIFJFTUFQX05PTkUsIDAsIFRSVUUsIEZBTFNFKTsKKwkJbGVhZl9yZWYgPSAwOworCQl2aW1fZnJlZShsZWFmX25hbWUpOworCQlsZWFmX25hbWUgPSBOVUxMOworCSAgICB9CisKKwkgICAgc3dpKE9TX0J5dGUsIDEyMSwgMHg4MSk7CSAgICAvKiBJcyBDdHJsIHByZXNzZWQ/ICovCisJICAgIGlmIChyMSA9PSAweGZmKQorCQkvKiBZZXMsIHNwbGl0IHdpbmRvdyAqLworCQlpbnNfdHlwZWJ1ZigiOnNwIiwgUkVNQVBfTk9ORSwgMCwgVFJVRSwgRkFMU0UpOworCSAgICBlbHNlCisJCWluc190eXBlYnVmKCI6Y29uZmlybSBlIiwgUkVNQVBfTk9ORSwgMCwgVFJVRSwgRkFMU0UpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHN3aShXaW1wX1JlcG9ydEVycm9yLCAiXDBcMFwwXDBZb3UgY2FuIG9ubHkgbG9hZCB0ZXh0IGluIG5vcm1hbCBtb2RlLiIsIDUsICJWaW0iKTsKKyAgICB9CisgICAgLyogU2VuZCBEYXRhU2F2ZUFjayBzbyBvdGhlciBwcm9ncmFtIGRvZXNuJ3QgdGhpbmsgd2UgZGllZAorICAgICAqIGFuZCBkZWxldGUgPFdpbXAkU2NyYXA+LgorICAgICAqLworICAgIGJsb2NrWzNdID0gYmxvY2tbMl07CisgICAgYmxvY2tbNF0gPSA0OworICAgIHN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIGJsb2NrWzFdKTsKK30KKworICAgIHZvaWQKK3JvX2RhdGFzYXZlKGJsb2NrKQorICAgIGludAkgICAgKmJsb2NrOworeworICAgIGNoYXJfdSAqcGF0aCA9ICgoY2hhcl91ICopIGJsb2NrKSArIDQ0OworCisgICAgLyogUHJlc2VydmUgdGhlIG5hbWUgZ2l2ZW4gc28gd2UgY2FuIHVzZSBpdCwgbm90IDxXaW1wJFNjcmFwPiAqLworICAgIGlmIChsZWFmX25hbWUpCisJdmltX2ZyZWUobGVhZl9uYW1lKTsKKyAgICBsZWFmX25hbWUgPSB2aW1fc3Ryc2F2ZShwYXRoKTsKKworICAgIGJsb2NrWzldID0gLTE7CSAgICAvKiBGaWxlIGlzIHVuc2FmZS4gKi8KKyAgICBzdHJjcHkocGF0aCwgIjxXaW1wJFNjcmFwPiIpOworICAgIGJsb2NrWzBdID0gNjA7CisgICAgYmxvY2tbM10gPSBibG9ja1syXTsKKyAgICBibG9ja1s0XSA9IDI7CisgICAgc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE3LCBibG9jaywgYmxvY2tbMV0pOworCisgICAgbGVhZl9yZWYgPSBibG9ja1syXTsKK30KKworICAgIHZvaWQKK3JvX21lc3NhZ2UoYmxvY2spCisgICAgaW50ICpibG9jazsKK3sKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBsb25nX3UJbGVuOworCisgICAgaWYgKGJsb2NrWzFdID09IHRhc2tfaGFuZGxlKQorCXJldHVybjsJCQkgICAgLyogRG9uJ3QgdGFsayB0byBvdXJzZWxmISAqLworICAgIHN3aXRjaCAoYmxvY2tbNF0pCisgICAgeworCWNhc2UgMDoJCS8qIFF1aXQuICovCisJICAgIGlmIChibG9ja1s0XSA9PSAwKQorCQlyb19xdWl0KCk7CisJICAgIGJyZWFrOworCWNhc2UgMToJLyogRGF0YVNhdmUgKi8KKwkgICAgcm9fZGF0YXNhdmUoYmxvY2spOworCSAgICBicmVhazsKKwljYXNlIDI6CQkvKiBEYXRhU2F2ZUFjay4gKi8KKwkgICAgaWYgKGNsaXBfY29udmVydF9zZWxlY3Rpb24oJmJ1ZmZlciwgJmxlbiwgJmNsaXBfc3RhcikgPT0gLTEpCisJCXJldHVybjsKKworCSAgICAvKiBTYXZlIHRoZSBjbGlwYm9hcmQgY29udGVudHMgdG8gYSBmaWxlLiAqLworCSAgICBzd2koT1NfRmlsZSwgMTAsICgoY2hhcl91ICopIGJsb2NrKSArIDQ0LCAweGZmZiwgMCwgYnVmZmVyLCBidWZmZXIgKyBsZW4pOworCisJICAgIC8qIEFjayB3aXRoIERhdGFMb2FkIG1lc3NhZ2UuICovCisJICAgIGJsb2NrWzNdID0gYmxvY2tbMl07CisJICAgIGJsb2NrWzRdID0gMzsKKwkgICAgYmxvY2tbOV0gPSBsZW47CisJICAgIHN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIGJsb2NrWzFdKTsKKworCSAgICB2aW1fZnJlZShidWZmZXIpOworCSAgICBicmVhazsKKwljYXNlIDM6CQkvKiBEYXRhTG9hZCAqLworCSAgICByb19kYXRhbG9hZChibG9jayk7CisJICAgIGJyZWFrOworCWNhc2UgODoJCS8qIFByZVF1aXQgKi8KKwkgICAgcm9fcHJlcXVpdChibG9jayk7CisJICAgIGJyZWFrOworCWNhc2UgMHhmOgkvKiBMb3NlIGNsaXBib2FyZC4gKi8KKwkgICAgaWYgKGJsb2NrWzVdICYgNCkKKwkgICAgeworCQljbGlwX2ZyZWVfc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworCQljbGlwX3N0YXIub3duZWQgPSBGQUxTRTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDB4MTA6CS8qIERhdGFSZXF1ZXN0IChjbGlwX3N0YXIpICovCisJICAgIGlmIChjbGlwX3N0YXIub3duZWQpCisJICAgIHsKKwkJaW50IHJvd3M7CisKKwkJLyogVGVsbCBvdGhlciBwcm9ncmFtIHRoYXQgd2UgaGF2ZSB0aGUgY2xpcGJvYXJkLiAqLworCQlibG9ja1swXSA9IDUyOworCQlibG9ja1szXSA9IGJsb2NrWzJdOwkgICAgLyogQ29weSBteXJlZiB0byB5b3VycmVmLiAqLworCQlibG9ja1s0XSA9IDE7CQkgICAgLyogRGF0YVNhdmUgbWVzc2FnZS4gKi8KKwkJLyogQ3JlYXRlIGFuIGVzdGltYXRlIGZvciB0aGUgc2l6ZSAobGFyZ2VyIG9yIHNhbWUgYXMgdHJ1ZQorCQkgKiB2YWx1ZSkgKi8KKwkJcm93cyA9IGNsaXBfc3Rhci5lbmQubG51bSAtIGNsaXBfc3Rhci5zdGFydC5sbnVtOworCQlpZiAocm93cyA8IDApCisJCSAgICByb3dzID0gLXJvd3M7CisJCWJsb2NrWzldID0gKHJvd3MgKyAxKSAqIENvbHVtbnMgKyAxOyAvKiBBZGQgb25lIGZvciBwb3NzaWJsZQorCQkJCQkJCWZpbmFsIG5ld2xpbmUuICovCisJCWJsb2NrWzEwXSA9IDB4ZmZmOwkgICAgLyogQ2xpcGJvYXJkIGlzIHRleHQuICovCisJCXN0cmNweSggKChjaGFyX3UgKikgYmxvY2spICsgNDQsICJWaW1DbGlwIik7CisJCXN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIGJsb2NrWzFdKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDB4NDAwYzE6CS8qIE1vZGUgY2hhbmdlICovCisJICAgIGNoYW5nZWRfbW9kZSA9IFRSVUU7CQkvKiBGbGFnIC0gdXBkYXRlIG9uIG5leHQgT3BlbldpbmRvdyAqLworCSAgICBpZiAoemFwX3JlZHJhdykKKwkgICAgeworCQkvKiBKSzIzMDc5OCwgcmUtaW5pdGlhbGlzZSBaYXBSZWRyYXcgc3R1ZmYgKi8KKwkJaWYgKHJvX3phcF9yZWRyYXdfaW5pdGlhbGlzZSgpID09IEZBSUwpCisJCSAgICB6YXBfcmVkcmF3ID0gRkFMU0U7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAweDQwMGMzOgkvKiBUYXNrQ2xvc2VEb3duICovCisJICAgIGlmIChibG9ja1sxXSA9PSBjaGlsZF9oYW5kbGUpCisJCWNoaWxkX2hhbmRsZSA9IDA7CisJICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIENvbnZlcnRzIGEgc2Nyb2xsYmFyJ3Mgd2luZG93IGhhbmRsZSBpbnRvIGEgc2Nyb2xsYmFyIHBvaW50ZXIuCisgKiBOVUxMIG9uIGZhaWx1cmUuCisgKi8KKyAgICBzY3JvbGxiYXJfVCAqCityb19maW5kX3NiYXIoaWQpCisgICAgaW50CQlpZDsKK3sKKyAgICB3aW5fVAkqd3A7CisKKyAgICBpZiAoZ3VpLmJvdHRvbV9zYmFyLmlkID09IGlkKQorCXJldHVybiAmZ3VpLmJvdHRvbV9zYmFyOworICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKyAgICB7CisJaWYgKHdwLT53X3Njcm9sbGJhcnNbU0JBUl9MRUZUXS5pZCA9PSBpZCkKKwkgICAgcmV0dXJuICZ3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF07CisJaWYgKHdwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0uaWQgPT0gaWQpCisJICAgIHJldHVybiAmd3AtPndfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyAgICB2b2lkCitzY3JvbGxfdG8obGluZSwgc2IpCisgICAgaW50IHNiOwkvKiBTY3JvbGxiYXIgbnVtYmVyICovCisgICAgaW50IGxpbmU7Cit7CisgICAgY2hhcl91IGNvZGVbOF07CisKKyAgICAvKiBEb24ndCBwdXQgZXZlbnRzIGluIHRoZSBpbnB1dCBxdWV1ZSBub3cuICovCisgICAgaWYgKGhvbGRfZ3VpX2V2ZW50cykKKwlyZXR1cm47CisKKyAgICAvKiBTZW5kIGEgc2Nyb2xsIGV2ZW50OgorICAgICAqCisgICAgICogQSBzY3JvbGxiYXIgZXZlbnQgaXMgQ1NJIChOT1QgS19TUEVDSUFMKSwgS1NfVkVSX1NDUk9MTEJBUiwKKyAgICAgKiBLRV9GSUxMRVIgZm9sbG93ZWQgYnk6CisgICAgICogb25lIGJ5dGUgcmVwcmVzZW50aW5nIHRoZSBzY3JvbGxiYXIgbnVtYmVyLCBhbmQgdGhlbiBmb3VyIGJ5dGVzCisgICAgICogcmVwcmVzZW50aW5nIGEgbG9uZ191IHdoaWNoIGlzIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHNjcm9sbGJhci4KKyAgICAgKi8KKyAgICBjb2RlWzBdID0gQ1NJOworICAgIGNvZGVbMV0gPSBLU19WRVJfU0NST0xMQkFSOworICAgIGNvZGVbMl0gPSBLRV9GSUxMRVI7CisgICAgY29kZVszXSA9IHNiOworICAgIGNvZGVbNF0gPSBsaW5lID4+IDI0OworICAgIGNvZGVbNV0gPSBsaW5lID4+IDE2OworICAgIGNvZGVbNl0gPSBsaW5lID4+IDg7CisgICAgY29kZVs3XSA9IGxpbmU7CisgICAgYWRkX3RvX2lucHV0X2J1Zihjb2RlLCA4KTsKK30KKworICAgIHZvaWQKK2hfc2Nyb2xsX3RvKGNvbCkKKyAgICBpbnQgY29sOworeworICAgIGNoYXJfdSBjb2RlWzhdOworCisgICAgLyogRG9uJ3QgcHV0IGV2ZW50cyBpbiB0aGUgaW5wdXQgcXVldWUgbm93LiAqLworICAgIGlmIChob2xkX2d1aV9ldmVudHMpCisJcmV0dXJuOworCisgICAgLyogU2VuZCBhIHNjcm9sbCBldmVudDoKKyAgICAgKgorICAgICAqIEEgc2Nyb2xsYmFyIGV2ZW50IGlzIENTSSAoTk9UIEtfU1BFQ0lBTCkKKyAgICAgKgorICAgICAqIEEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgZXZlbnQgaXMgS19TUEVDSUFMLCBLU19IT1JfU0NST0xMQkFSLAorICAgICAqIEtFX0ZJTExFUiBmb2xsb3dlZCBieSBmb3VyIGJ5dGVzIHJlcHJlc2VudGluZyBhIGxvbmdfdSB3aGljaCBpcyB0aGUKKyAgICAgKiBuZXcgdmFsdWUgb2YgdGhlIHNjcm9sbGJhci4KKyAgICAgKi8KKyAgICBjb2RlWzBdID0gQ1NJOworICAgIGNvZGVbMV0gPSBLU19IT1JfU0NST0xMQkFSOworICAgIGNvZGVbMl0gPSBLRV9GSUxMRVI7CisgICAgY29kZVs0XSA9IGNvbCA+PiAyNDsKKyAgICBjb2RlWzVdID0gY29sID4+IDE2OworICAgIGNvZGVbNl0gPSBjb2wgPj4gODsKKyAgICBjb2RlWzddID0gY29sOworICAgIGFkZF90b19pbnB1dF9idWYoY29kZSwgOCk7Cit9CisKKyAgICB2b2lkCityb19zY3JvbGwoYmxvY2spCisgICAgaW50CQkqYmxvY2s7Cit7CisgICAgc2Nyb2xsYmFyX1QJKnNiOworICAgIGludAkJb2Zmc2V0OworICAgIHdpbl9UCSp3cDsKKworICAgIC8qIEJsb2NrIGlzIHJlYWR5IGZvciBXaW1wX09wZW5XaW5kb3csIGFuZCBhbHNvIGNvbnRhaW5zOgorICAgICAqCisgICAgICogKzMyID0gc2Nyb2xsIFggZGlyZWN0aW9uICgtMiAuLiArMikKKyAgICAgKiArMzYgPSBzY3JvbGwgWSBkaXJlY3Rpb24gKC0yIC4uICsyKQorICAgICAqLworCisgICAgc2IgPSByb19maW5kX3NiYXIoYmxvY2tbMF0pOworICAgIGlmICghc2IpCisJcmV0dXJuOwkJLyogV2luZG93IG5vdCBmb3VuZCAoZXJyb3IpLiAqLworCisgICAgd3AgPSBzYi0+IHdwOworCisgICAgaWYgKHdwID09IE5VTEwpCisgICAgeworCS8qIEhvcml6b250YWwgYmFyLiAqLworCW9mZnNldCA9IGJsb2NrWzhdOworCWlmIChvZmZzZXQgPT0gLTIpCisJICAgIG9mZnNldCA9IChibG9ja1sxXSAtIGJsb2NrWzNdKSAvIGd1aS5jaGFyX3dpZHRoOworCWVsc2UgaWYgKG9mZnNldCA9PSAyKQorCSAgICBvZmZzZXQgPSAoYmxvY2tbM10gLSBibG9ja1sxXSkgLyBndWkuY2hhcl93aWR0aDsKKworCWJsb2NrWzVdICs9IG9mZnNldCAqIGd1aS5jaGFyX3dpZHRoOworCisJZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCBibG9ja1s1XSAvIGd1aS5jaGFyX3dpZHRoLCBGQUxTRSk7CisKKwlzd2koV2ltcF9PcGVuV2luZG93LCAwLCBibG9jayk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJb2Zmc2V0ID0gLWJsb2NrWzldOworCWlmIChvZmZzZXQgPT0gLTIpCisJICAgIG9mZnNldCA9IC0od3AgLT4gd19oZWlnaHQgLSAxKTsKKwllbHNlIGlmIChvZmZzZXQgPT0gMikKKwkgICAgb2Zmc2V0ID0gd3AgLT4gd19oZWlnaHQgLSAxOworCisJLyogUG9zc2libHkgd2Ugc2hvdWxkIHJlcG9zaXRpb24gdGhlIHNjcm9sbGJhcj8KKwkgKiBWaW0gc2VlbXMgdG8gdXBkYXRlIHRoZSBiYXIgYW55d2F5Li4uCisJICovCisJZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCBvZmZzZXQgLSAoYmxvY2tbNl0gLyBndWkuY2hhcl9oZWlnaHQpLCBGQUxTRSk7CisgICAgfQorfQorCisvKiBNb3ZlIGEgd2luZG93IGJ5IGEgZ2l2ZW4gb2Zmc2V0LiBVc2VkIHRvIHNpbXVsYXRlIHRoZSBmdW5jdGlvbiBvZiB0aGUKKyAqIG5lc3RlZCB3aW1wLgorICovCisgICAgdm9pZAorcm9fbW92ZV9jaGlsZCh3aW5kb3csIHgsIHksIHBvc193YW50ZWQsIHBvc19nb3QpCisgICAgaW50CXdpbmRvdzsKKyAgICBpbnQgeCx5OwkJLyogb2Zmc2V0IHRvIG1vdmUgYnkgKi8KKyAgICBpbnQJcG9zX3dhbnRlZCwgcG9zX2dvdDsKK3sKKyAgICBpbnQJYmxvY2tbMTBdOworCisgICAgYmxvY2tbMF0gPSB3aW5kb3c7CisgICAgc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKyAgICBibG9ja1sxXSArPSB4OworICAgIGJsb2NrWzJdICs9IHk7CisgICAgYmxvY2tbM10gKz0geDsKKyAgICBibG9ja1s0XSArPSB5OworICAgIGlmIChwb3Nfd2FudGVkID09IC0xKQorCWJsb2NrWzddID0gLTE7CisgICAgZWxzZSBpZiAocG9zX3dhbnRlZCA9PSAtMikKKwlibG9ja1s3XSA9IHBvc19nb3Q7CisgICAgc3dpKFdpbXBfT3BlbldpbmRvdywgMCwgYmxvY2spOworfQorCisvKiBPcGVuIHRoZSBtYWluIHdpbmRvdy4gQWxzbyB1cGRhdGVzIHNjcm9sbGJhcnMgaWYgd2UgYXJlIG5vdAorICogdXNpbmcgdGhlIG5lc3RlZCBXaW1wLgorICogSWYgd2UgaGF2ZSBqdXN0IGNoYW5nZWQgbW9kZSB0aGVuIHJlLXJlYWQgYWxsIHZhbHVlcy4KKyAqLworICAgIHZvaWQKK3JvX29wZW5fbWFpbihibG9jaykKKyAgICBpbnQJICAgICpibG9jazsKK3sKKyAgICBpbnQJICAgIHRvZ2dsZV9zaXplOworCisgICAgLyogRmluZCBvdXQgaWYgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgdG9nZ2xlIHNpemUgaWNvbi4gKi8KKyAgICBibG9ja1syMF0gPSBibG9ja1swXTsKKyAgICBzd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgMCwgYmxvY2sgKyAyMCk7CisgICAgdG9nZ2xlX3NpemUgPSBibG9ja1syOF0gJiAoMSA8PCAxOSk7CisKKyAgICBpZiAobmVzdGVkX3dpbXApCisgICAgeworCXN3aShXaW1wX09wZW5XaW5kb3csIDAsIGJsb2NrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpbnQJb2xkWzEwXTsKKwlpbnQJeF9vZmZzZXQsIHlfb2Zmc2V0OwkgICAgLyogTW92ZSBjaGlsZHJlbiBzYW1lIGFzIHBhcmVudC4gKi8KKwlpbnQJcG9zX3dhbnRlZCwgcG9zX2dvdDsKKwlpbnQJbGVmdF9iYXIgID0gZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXTsKKwlpbnQJcmlnaHRfYmFyID0gZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF07CisJd2luX1QJKndwOworCisJLyogVGhyZWUgY2FzZXMgdG8gdGhpbmsgYWJvdXQ6CisJICogMSkgTW92ZSB0byB0b3AuIE9wZW4gZWFjaCB3aW5kb3cgYXQgdGhlIHRvcC4KKwkgKiAyKSBTYW1lIHN0YWNrIHBvc2l0aW9uLiBPcGVuIGVhY2ggd2l0aCBzYW1lIHBvc2l0aW9uLgorCSAqIDMpIE9wZW4gYXQgYm90dG9tLiBPcGVuIGNoaWxkcmVuIHdpdGggcGFyZW50J3MgbmV3IHBvc2l0aW9uLgorCSAqLworCisJb2xkWzBdID0gYmxvY2tbMF07CisJc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIG9sZCk7CisJcG9zX3dhbnRlZCA9IGJsb2NrWzddOworCXN3aShXaW1wX09wZW5XaW5kb3csIDAsIGJsb2NrKTsKKwkvKiBCbG9jayB1cGRhdGVkIGJ5IE9wZW5XaW5kb3c/IEkgZG9uJ3QgdGhpbmsgc28hICovCisJc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKwlwb3NfZ290ID0gYmxvY2tbN107CisKKwl4X29mZnNldCA9IGJsb2NrWzFdIC0gb2xkWzFdOworCXlfb2Zmc2V0ID0gYmxvY2tbNF0gLSBvbGRbNF07CisJaWYgKHhfb2Zmc2V0IHx8IHlfb2Zmc2V0IHx8IHBvc193YW50ZWQgPT0gLTEgfHwgcG9zX3dhbnRlZCA9PSAtMikKKwl7CisJICAgIC8qIElmIHBhcmVudCBoYXMgbW92ZWQsIHJlLW9wZW4gYWxsIHRoZSBjaGlsZCB3aW5kb3dzLiAqLworCSAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisJICAgIHsKKwkJLyogUmVvcGVuIHNjcm9sbGJhcnMgZm9yIHRoaXMgd2luZG93LiAqLworCQlpZiAobGVmdF9iYXIpCisJCSAgICByb19tb3ZlX2NoaWxkKHdwIC0+IHdfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdLmlkLAorCQkJCXhfb2Zmc2V0LCB5X29mZnNldCwKKwkJCQlwb3Nfd2FudGVkLCBwb3NfZ290KTsKKwkJaWYgKHJpZ2h0X2JhcikKKwkJICAgIHJvX21vdmVfY2hpbGQod3AgLT4gd19zY3JvbGxiYXJzW1NCQVJfUklHSFRdLmlkLAorCQkJCXhfb2Zmc2V0LCB5X29mZnNldCwKKwkJCQlwb3Nfd2FudGVkLCBwb3NfZ290KTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGNoYW5nZWRfbW9kZSB8fCB0b2dnbGVfc2l6ZSkKKyAgICB7CisJaW50CXdpZHRoLCBoZWlnaHQ7CisKKwlpZiAoY2hhbmdlZF9tb2RlKQorCSAgICByb19tZWFzdXJlX3Rvb2xzKCk7CisJYmxvY2tbMF0gPSBndWkud2luZG93X2hhbmRsZTsKKwlzd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgMCwgYmxvY2spOworCisJd2lkdGggPSBibG9ja1szXSAtIGJsb2NrWzFdOworCWhlaWdodCA9IGJsb2NrWzRdIC0gYmxvY2tbMl07CisJc3dpKFdpbXBfRm9yY2VSZWRyYXcsIGd1aS53aW5kb3dfaGFuZGxlLCAwLCAtaGVpZ2h0LCB3aWR0aCwgMCk7CisJZ3VpX3Jlc2l6ZV9zaGVsbCh3aWR0aCwgaGVpZ2h0KTsKKwljaGFuZ2VkX21vZGUgPSBGQUxTRTsKKyAgICB9Cit9CisKKyAgICB2b2lkCityb19vcGVuX3dpbmRvdyhibG9jaykKKyAgICBpbnQJCSpibG9jazsKK3sKKyAgICBpbnQJCXBvczsKKyAgICBzY3JvbGxiYXJfVCAqc2I7CisKKyAgICBpZiAoYmxvY2tbMF0gPT0gZ3VpLndpbmRvd19oYW5kbGUpCisJcm9fb3Blbl9tYWluKGJsb2NrKTsKKyAgICBlbHNlCisgICAgeworCXN3aShXaW1wX09wZW5XaW5kb3csIDAsIGJsb2NrKTsKKwlpZiAoYmxvY2tbMF0gIT0gZ3VpLndpbmRvd19oYW5kbGUpCisJeworCSAgICBzYiA9IHJvX2ZpbmRfc2JhcihibG9ja1swXSk7CisJICAgIGlmIChzYikKKwkgICAgeworCQlpZiAoc2ItPiB3cCAhPSBOVUxMKQorCQkgICAgZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCAtYmxvY2tbNl0gLyBndWkuY2hhcl9oZWlnaHQsIEZBTFNFKTsKKwkJZWxzZQorCQkgICAgZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCBibG9ja1s1XSAvIGd1aS5jaGFyX3dpZHRoLCBGQUxTRSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisgICAgdm9pZAorcm9fbWVudV9zZWxlY3Rpb24oYmxvY2spCisgICAgaW50CQkqYmxvY2s7Cit7CisgICAgaW50CQkqaXRlbSA9IHdpbXBfbWVudSArIDc7CisgICAgdmltbWVudV9UCSptZW51OworICAgIC8qIHdpbXBfbWVudSBwb2ludHMgdG8gYSB3aW1wIG1lbnUgc3RydWN0dXJlICovCisKKyAgICBmb3IgKDs7KQorICAgIHsKKwl3aGlsZSAoYmxvY2tbMF0tLSkKKwkgICAgaXRlbSArPSA2OworCWlmIChibG9ja1sxXSA9PSAtMSkKKwkgICAgYnJlYWs7CisJaXRlbSA9ICgoaW50ICopIGl0ZW1bMV0pICsgNzsKKwlibG9jaysrOworICAgIH0KKyAgICAvKiBpdGVtIHBvaW50cyB0byB0aGUgd2ltcCBtZW51IGl0ZW0gc3RydWN0dXJlIGNob3NlbiAqLworICAgIG1lbnUgPSAodmltbWVudV9UICopIGl0ZW1bNV07CisKKyAgICBzd2koV2ltcF9HZXRQb2ludGVySW5mbywgMCwgYmxvY2spOworICAgIGlmIChibG9ja1syXSA9PSAxKQorCS8qIEFkanVzdCB1c2VkIC0ga2VlcCBtZW51IG9wZW4gKi8KKwlzd2koV2ltcF9DcmVhdGVNZW51LCAwLCB3aW1wX21lbnUpOworCisgICAgaWYgKG1lbnUtPiBjYikKKwltZW51LT4gY2IobWVudSk7Cit9CisKKyAgICB2b2lkCityb19vcGVuX3BhcmVudCgpCit7CisgICAgaW50IGhlYWQ7CisgICAgY2hhcl91ICppID0gY3VyYnVmLT4gYl9mZm5hbWU7CisgICAgY2hhcl91ICBidWZmZXJbMjU2XTsKKworICAgIGhlYWQgPSAwOworICAgIGZvciAoOyAqaTsgaSsrKQorICAgIHsKKwlpZiAoKmkgPT0gJy4nKQorCSAgICBoZWFkID0gaSAtIGN1cmJ1Zi0+IGJfZmZuYW1lOworICAgIH0KKworICAgIC8qIEFwcGVuZCBoZWFkIGNoYXJzIHRvIGJ1ZmZlciAqLworICAgIGlmIChoZWFkIDwgMjQwICYmIGN1cmJ1Zi0+IGJfZmZuYW1lICYmIGhlYWQpCisgICAgeworCXN0cmNweShidWZmZXIsICIlZmlsZXJfb3BlbmRpciAiKTsKKwlzdHJuY3B5KGJ1ZmZlciArIDE1LCBjdXJidWYtPiBiX2ZmbmFtZSwgaGVhZCk7CisJYnVmZmVyWzE1ICsgaGVhZF0gPSAnXDAnOworCXN3aShPU19DTEksIGJ1ZmZlcik7CisgICAgfQorfQorCisgICAgdm9pZAorcHJvY2Vzc19ldmVudChldmVudCwgYmxvY2spCisgICAgaW50IGV2ZW50OworICAgIGludCAqYmxvY2s7Cit7CisgICAgc3dpdGNoIChldmVudCkKKyAgICB7CisJY2FzZSAwOgkJLyogTm90aGluZyAtIHVwZGF0ZSBkcmFnIHN0YXRlLiAqLworCSAgICBpZiAocm9fZHJhZ2dpbmcpCisJCXJvX2NvbnRpbnVlX2RyYWcoYmxvY2spOworCSAgICBicmVhazsKKwljYXNlIDE6CQkvKiBSZWRyYXcgd2luZG93LiAqLworCSAgICByZWRyYXdfd2luZG93KGJsb2NrKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgkJLyogT3BlbiB3aW5kb3cuICovCisJICAgIHJvX29wZW5fd2luZG93KGJsb2NrKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogQ2xvc2Ugd2luZG93LiAqLworCSAgICBzd2koV2ltcF9HZXRQb2ludGVySW5mbywgMCwgYmxvY2sgKyAxKTsKKwkgICAgaWYgKGJsb2NrWzNdID09IDEpCisJCXJvX29wZW5fcGFyZW50KCk7CisJICAgIGVsc2UKKwkJaWYgKHJvX29rX3RvX3F1aXQoKSkKKwkJICAgIHJvX3F1aXQoKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgkJLyogTW91c2UgY2xpY2suICovCisJICAgIHJvX21vdXNlKGJsb2NrKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgkJLyogRmluaXNoZWQgZHJhZy4gKi8KKwkgICAgcm9fZHJhZ19maW5pc2hlZChibG9jayk7CisJICAgIGJyZWFrOworCWNhc2UgODoJCS8qIEtleSBwcmVzc2VkLiAqLworCSAgICByb19pbnNlcnRfa2V5KChjaGFyX3UgKikgJmJsb2NrWzZdKTsKKwkgICAgYnJlYWs7CisJY2FzZSA5OgorCSAgICByb19tZW51X3NlbGVjdGlvbihibG9jayk7CisJICAgIGJyZWFrOworCWNhc2UgMTA6CS8qIFNjcm9sbCByZXF1ZXN0LiAqLworCSAgICByb19zY3JvbGwoYmxvY2spOworCSAgICBicmVhazsKKwljYXNlIDExOgkvKiBMb3NlIGNhcmV0LiAqLworCSAgICBpZiAoYmxvY2tbMF0gPT0gZ3VpLndpbmRvd19oYW5kbGUpCisJCWd1aV9mb2N1c19jaGFuZ2UoRkFMU0UpOworCSAgICBicmVhazsKKwljYXNlIDEyOgkvKiBHYWluIGNhcmV0LiAqLworCSAgICBpZiAoYmxvY2tbMF0gPT0gZ3VpLndpbmRvd19oYW5kbGUpCisJCWd1aV9mb2N1c19jaGFuZ2UoVFJVRSk7CisJICAgIGJyZWFrOworCWNhc2UgMTc6CS8qIFVzZXIgbWVzc2FnZS4gKi8KKwljYXNlIDE4OgkvKiBVc2VyIG1lc3NhZ2UgcmVjb3JkZWQuICovCisJICAgIHJvX21lc3NhZ2UoYmxvY2spOworCSAgICBicmVhazsKKyAgICB9Cit9CisKKy8qCisgKiBHVUkgaW5wdXQgcm91dGluZSBjYWxsZWQgYnkgZ3VpX3dhaXRfZm9yX2NoYXJzKCkuICBXYWl0cyBmb3IgYSBjaGFyYWN0ZXIKKyAqIGZyb20gdGhlIGtleWJvYXJkLgorICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCisgKiAgd3RpbWUgPT0gMAkgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICogIHd0aW1lID4gMAkgICAgV2FpdCB3dGltZSBtaWxsaXNlY29uZHMgZm9yIGEgY2hhcmFjdGVyLgorICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKKyAqIG9yIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitndWlfbWNoX3dhaXRfZm9yX2NoYXJzKGxvbmcgd3RpbWUpCit7CisgICAgaW50IGJsb2NrWzY0XTsKKyAgICBpbnQJcmVhc29uOworICAgIGludCBzdGFydF90aW1lID0gLTE7CisgICAgaW50IGN0aW1lID0gd3RpbWUgLyAxMDsJLyogZGVsYXkgaW4gY3MgKi8KKworICAgIGlmICh3dGltZSAhPSAtMSkKKyAgICB7CisJc3dpKE9TX1JlYWRNb25vdG9uaWNUaW1lKTsKKwlzdGFydF90aW1lID0gcjA7CisgICAgfQorCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKHJvX2RyYWdnaW5nKQorCSAgICByZWFzb24gPSB3aW1wX3BvbGwoMCwgYmxvY2spOwkvKiBBbHdheXMgcmV0dXJuIGltbWVkaWF0ZWx5ICovCisJZWxzZSBpZiAod3RpbWUgPT0gLTEpCisJICAgIHJlYXNvbiA9IHdpbXBfcG9sbCgxLCBibG9jayk7CisJZWxzZQorCSAgICByZWFzb24gPSB3aW1wX3BvbGxpZGxlKDAsIGJsb2NrLCBzdGFydF90aW1lICsgY3RpbWUpOworCisJcHJvY2Vzc19ldmVudChyZWFzb24sIGJsb2NrKTsKKworCWlmIChpbnB1dF9hdmFpbGFibGUoKSB8fCByb19yZXR1cm5fZWFybHkpCisJeworCSAgICByb19yZXR1cm5fZWFybHkgPSBGQUxTRTsKKwkgICAgcmV0dXJuIE9LOwkgICAgLyogVGhlcmUgaXMgc29tZXRoaW5nIHRvIHByb2Nlc3MgKGtleSAvIG1lbnUgZXZlbnQpICovCisJfQorCisJaWYgKHd0aW1lICE9IC0xKQorCXsKKwkgICAgc3dpKE9TX1JlYWRNb25vdG9uaWNUaW1lKTsKKwkgICAgaWYgKHIwIC0gc3RhcnRfdGltZSA+IGN0aW1lKQorCQlyZXR1cm4gRkFJTDsJLyogV2UndmUgYmVlbiB3YWl0aW5nIHRvbyBsb25nIC0gcmV0dXJuIGZhaWx1cmUgKi8KKwl9CisgICAgfQorfQorCisvKiBGbHVzaCBhbnkgb3V0cHV0IHRvIHRoZSBzY3JlZW4gKi8KKyAgICB2b2lkCitndWlfbWNoX2ZsdXNoKHZvaWQpCit7Cit9CisKKy8qCisgKiBDbGVhciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aGUgc2NyZWVuIGZyb20gdGV4dCBwb3Mocm93MSwgY29sMSkgdG8KKyAqIChyb3cyLCBjb2wyKSBpbmNsdXNpdmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2NsZWFyX2Jsb2NrKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKQoreworICAgIHN3aShDb2xvdXJUcmFuc19SZXR1cm5HQ09MLCBndWkuYmFja19waXhlbCA8PCA4LCAwLCAwLCAxPDw3LCAwKTsKKyAgICBwbG90X3JlY3RhbmdsZSg5NiArIDUsIHIwLAorCQkJRklMTF9YKGNvbDEpLCAtRklMTF9ZKHJvdzIgKyAxKSwKKwkJCUZJTExfWChjb2wyICsgMSksIC1GSUxMX1kocm93MSkpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9hbGwodm9pZCkKK3sKKyAgICBpZiAocmVkcmF3X2Jsb2NrKQorICAgIHsKKwlzd2koQ29sb3VyVHJhbnNfU2V0R0NPTCwgZ3VpLmJhY2tfcGl4ZWwgPDwgOCwgMCwgMCwgMTw8NywgMCk7CisJc3dpKE9TX1dyaXRlSSArIDE2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpbnQgYmxvY2tbNDRdOworCWJsb2NrWzBdID0gZ3VpLndpbmRvd19oYW5kbGU7CisJYmxvY2tbMV0gPSAwOworCWJsb2NrWzJdID0gLWd1aS5udW1fcm93cyAqIGd1aS5jaGFyX2hlaWdodDsKKwlibG9ja1szXSA9IGd1aS5udW1fY29scyAqIGd1aS5jaGFyX3dpZHRoOworCWJsb2NrWzRdID0gMDsKKwlzd2koV2ltcF9VcGRhdGVXaW5kb3csIDAsIGJsb2NrKTsKKwl3aGlsZSAocjApCisJeworCSAgICBzd2koQ29sb3VyVHJhbnNfU2V0R0NPTCwgZ3VpLmJhY2tfcGl4ZWwgPDwgOCwgMCwgMCwgMTw8NywgMCk7CisJICAgIHN3aShPU19Xcml0ZUkgKyAxNik7CisJICAgIHN3aShXaW1wX0dldFJlY3RhbmdsZSwgMCwgYmxvY2spOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGdpdmVuIG51bWJlciBvZiBsaW5lcyBmcm9tIHRoZSBnaXZlbiByb3csIHNjcm9sbGluZyB1cCBhbnkKKyAqIHRleHQgZnVydGhlciBkb3duIHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVsZXRlX2xpbmVzKGludCByb3csIGludCBudW1fbGluZXMpCit7CisgICAgaW50IHRvcF9mcm9tID0gLXJvdyAtIG51bV9saW5lczsKKyAgICBpbnQgYm90X2Zyb20gPSAtZ3VpLnNjcm9sbF9yZWdpb25fYm90IC0gMTsKKyAgICBpbnQgYm90X3RvICAgPSBib3RfZnJvbSArIG51bV9saW5lczsKKworICAgIHN3aShDb2xvdXJUcmFuc19TZXRHQ09MLCBndWkuYmFja19waXhlbCA8PCA4LCAwLCAwLCAweDgwLCAwKTsKKworICAgIC8qIENoYW5nZWQgd2l0aG91dCBjaGVja2luZyEgKi8KKyAgICBzd2koV2ltcF9CbG9ja0NvcHksIGd1aS53aW5kb3dfaGFuZGxlLAorCQkJICAgIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQgKiBndWkuY2hhcl93aWR0aCwKKwkJCSAgICBib3RfZnJvbSAqIGd1aS5jaGFyX2hlaWdodCwKKwkJCSAgICAoZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgLSBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0CisJCQkJCQkJKyAxKSAqIGd1aS5jaGFyX3dpZHRoLAorCQkJICAgIHRvcF9mcm9tICogZ3VpLmNoYXJfaGVpZ2h0LAorCisJCQkgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCAqIGd1aS5jaGFyX3dpZHRoLAorCQkJICAgIGJvdF90byAqIGd1aS5jaGFyX2hlaWdodCk7CisKKyAgICBndWlfY2xlYXJfYmxvY2soZ3VpLnNjcm9sbF9yZWdpb25fYm90IC0gbnVtX2xpbmVzICsgMSwKKwkJCQkJCSAgICAgICBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAorCWd1aS5zY3JvbGxfcmVnaW9uX2JvdCwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOworfQorCisvKgorICogSW5zZXJ0IHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgYmVmb3JlIHRoZSBnaXZlbiByb3csIHNjcm9sbGluZyBkb3duIGFueQorICogZm9sbG93aW5nIHRleHQgd2l0aGluIHRoZSBzY3JvbGwgcmVnaW9uLgorICovCisgICAgdm9pZAorZ3VpX21jaF9pbnNlcnRfbGluZXMoaW50IHJvdywgaW50IG51bV9saW5lcykKK3sKKyAgICBpbnQgdG9wX2Zyb20gPSAtcm93OworICAgIGludCBib3RfdG8gICA9IC1ndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSAxOworICAgIGludCBib3RfZnJvbSA9IGJvdF90byArIG51bV9saW5lczsKKworICAgIHN3aShDb2xvdXJUcmFuc19TZXRHQ09MLCBndWkuYmFja19waXhlbCA8PCA4LCAwLCAwLCAweDgwLCAwKTsKKworICAgIHN3aShXaW1wX0Jsb2NrQ29weSwgZ3VpLndpbmRvd19oYW5kbGUsCisJCQkgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCAqIGd1aS5jaGFyX3dpZHRoLAorCQkJICAgIGJvdF9mcm9tICogZ3VpLmNoYXJfaGVpZ2h0LAorCQkJICAgIChndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCAtIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKKwkJCQkJCQkrIDEpICogZ3VpLmNoYXJfd2lkdGgsCisJCQkgICAgdG9wX2Zyb20gKiBndWkuY2hhcl9oZWlnaHQsCisKKwkJCSAgICBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0ICogZ3VpLmNoYXJfd2lkdGgsCisJCQkgICAgYm90X3RvICogZ3VpLmNoYXJfaGVpZ2h0KTsKKworICAgIGd1aV9jbGVhcl9ibG9jayhyb3csIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJCQkJcm93ICsgbnVtX2xpbmVzIC0gMSwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOworfQorCisvKiBQdXQgc2VsZWN0aW9uIGluIGNsaXBib2FyZCBidWZmZXIuCisgKiBTaG91bGQgd2UgYmVjb21lIHRoZSBuZXcgb3duZXI/CisgKi8KKyAgICB2b2lkCitjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKK3sKKyAgICBpbnQJCWJsb2NrWzY0XTsJLyogV2lsbCBiZSB1c2VkIGluIFdpbXBfUG9sbC4gKi8KKyAgICBpbnQJCXJlYXNvbjsKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBsb25nX3UJbGVuZ3RoOworCisgICAgYmxvY2tbMF0gPSA0ODsJCQkvKiBTaXplIG9mIGJsb2NrLiAqLworICAgIGJsb2NrWzNdID0gMDsJCQkvKiBPcmluaWFsIG1lc3NhZ2UuICovCisgICAgYmxvY2tbNF0gPSAweDEwOwkJCS8qIERhdGEgcmVxdWVzdC4gKi8KKyAgICBibG9ja1s1XSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIGJsb2NrWzZdID0gUk9fTE9BRF9DTElQQk9BUkQ7CS8qIEludGVybmFsIGhhbmRsZS4gKi8KKyAgICBibG9ja1s3XSA9IGJsb2NrWzhdID0gMDsJCS8qICh4LHkpIG5vdCB1c2VkLiAqLworICAgIGJsb2NrWzldID0gNDsKKyAgICBibG9ja1sxMF0gPSAweGZmZjsJICAgIC8qIFdlIHdhbnQgdGV4dCBmaWxlcyBpZiBwb3NzaWJsZSwgSSB0aGluay4gKi8KKyAgICBibG9ja1sxMV0gPSAtMTsJICAgIC8qIEVuZCBvZiBsaXN0LiAqLworICAgIHN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIDApOyAgICAvKiBCcm9hZGNhc3QgcmVxdWVzdC4gKi8KKworICAgIC8qIE9LLCB3ZSd2ZSBzZW50IHRoZSByZXF1ZXN0LiBQb2xsIHVudGlsIHdlIGdldCBhIG51bGwgcG9sbCAoZmFpbHVyZSkgb3IKKyAgICAgKiB3ZSBsb2FkIHRoZSBjbGlwYm9hcmQuCisgICAgICogSWYgd2UgcmVjZWl2ZSBhIERhdGFTYXZlIGV2ZW50IHdpdGggaWNvbiBoYW5kbGUgPSAtMiB0aGVuIHB1dCBpdCBvbiB0aGUKKyAgICAgKiBjbGlwYm9hcmQuIFJJU0MgT1Mgc2hvdWxkIGVuc3VyZSB0aGF0IGtleSBldmVudHMgd2lsbCBub3QgYmUgZGVsaXZlcmVkCisgICAgICogdW50aWwgdGhlIGNsaXBib2FyZCBvcGVyYXRpb24gY29tcGxldGVzICh1bmxlc3MgdGhlIG93bmVyIHN0YXJ0cyBpZGxpbmcKKyAgICAgKiAtIHdlIGNhbid0IHdhaXQgZm9yZXZlciEpLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCXJlYXNvbiA9IHdpbXBfcG9sbCgwLCBibG9jayk7CisJaWYgKHJlYXNvbiA9PSAwKQorCSAgICByZXR1cm47CSAgICAvKiBGYWlsZWQgdG8gZ2V0IGNsaXBib2FyZC4gKi8KKwlpZiAoKHJlYXNvbiA9PSAxNyB8fCByZWFzb24gPT0gMTgpICYmCisJCWJsb2NrWzRdID09IDEgJiYgYmxvY2tbNl0gPT0gUk9fTE9BRF9DTElQQk9BUkQpCisJICAgIGJyZWFrOwkgICAgLyogR290IGl0IC0gc3RvcCB3YWl0aW5nLiAqLworCXByb2Nlc3NfZXZlbnQocmVhc29uLCBibG9jayk7CisJaWYgKHJvX3JldHVybl9lYXJseSkKKwkgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBUZWxsIG93bmVyIHRvIHNhdmUgZGF0YSBpbiA8V2ltcCRTY3JhcD4uICovCisgICAgYmxvY2tbMF0gPSA2MDsKKyAgICBibG9ja1szXSA9IGJsb2NrWzJdOyAgIC8qIENvcHkgbXlyZWYgLT4geW91cnJlZiAqLworICAgIGJsb2NrWzRdID0gMjsJICAgIC8qIERhdGFTYXZlQWNrLiAqLworICAgIGJsb2NrWzldID0gLTE7CSAgICAvKiBEYXRhIGlzIHVuc2FmZS4gKi8KKyAgICBzdHJjcHkoICgoY2hhcl91ICopIGJsb2NrKSArIDQ0LCAiPFdpbXAkU2NyYXA+Iik7CisgICAgc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE3LCBibG9jaywgYmxvY2tbMV0pOworCisgICAgLyogV2FpdCBhZ2FpbiBmb3IgcmVwbHkuICovCisgICAgZm9yICg7OykKKyAgICB7CisJcmVhc29uID0gd2ltcF9wb2xsKDAsIGJsb2NrKTsKKwlpZiAocmVhc29uID09IDApCisJICAgIHJldHVybjsJLyogT3RoZXIgcHJvZ3JhbSBoYXMgZ2l2ZW4gdXAhICovCisJaWYgKChyZWFzb24gPT0gMTcgfHwgcmVhc29uID09IDE4KSAmJiBibG9ja1s0XSA9PSAzICYmIGJsb2NrWzZdID09IFJPX0xPQURfQ0xJUEJPQVJEKQorCSAgICBicmVhazsJLyogQ2xpcGJvYXJkIGRhdGEgc2F2ZWQgdG8gPFdpbXAkU2NyYXA+ICovCisJcHJvY2Vzc19ldmVudChyZWFzb24sIGJsb2NrKTsKKwlpZiAocm9fcmV0dXJuX2Vhcmx5KQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgLyogPFdpbXAkU2NyYXA+IGNvbnRhaW5zIGNsaXBib2FyZCAtIGxvYWQgaXQuICovCisgICAgaWYgKHhzd2koT1NfRmlsZSwgMTcsICI8V2ltcCRTY3JhcD4iKSAmIHZfZmxhZykKKwlyZXR1cm47CQkvKiBFcnJvciEgKi8KKyAgICBpZiAocjAgIT0gMSAmJiByMCAhPSAzKQorCXJldHVybjsKKyAgICBsZW5ndGggPSByNDsKKworICAgIGJ1ZmZlciA9IGxhbGxvYyhsZW5ndGgsIFRSVUUpOyAgLyogQ2xhaW0gbWVtb3J5IChhbmQgcmVwb3J0IGVycm9ycykuICovCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmICh4c3dpKE9TX0ZpbGUsIDE2LCAiPFdpbXAkU2NyYXA+IiwgYnVmZmVyLCAwKSAmIHZfZmxhZykKKwlyZXR1cm47CisKKyAgICBjbGlwX3lhbmtfc2VsZWN0aW9uKE1DSEFSLCBidWZmZXIsIGxlbmd0aCwgY2JkKTsKKworICAgIHZpbV9mcmVlKGJ1ZmZlcik7CisKKyAgICBzd2koT1NfRlNDb250cm9sLCAyNywgIjxXaW1wJFNjcmFwPiIsIDAsIDApOyAgICAvKiBEZWxldGUgdGVtcCBmaWxlLiAqLworCisgICAgYmxvY2tbNF0gPSA0OwkJICAgIC8qIFNlbmQgRGF0YUxvYWRBY2suICovCisgICAgYmxvY2tbM10gPSBibG9ja1syXTsJICAgIC8qIENvcHkgbXlyZWYgLT4geW91cnJlZi4gKi8KKyAgICBzd2koV2ltcF9TZW5kTWVzc2FnZSwgMTcsIGJsb2NrLCBibG9ja1sxXSk7Cit9CisKKy8qIE5vdCBzdXJlIHdoYXQgdGhpcyBtZWFucyB1bmRlciBSSVNDIE9TLiAqLworICAgIHZvaWQKK2NsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworfQorCisvKiBUZWxsIGV2ZXJ5b25lIHRoYXQgd2Ugbm93IG93biB0aGUgY2xpcGJvYXJkLgorICogUmV0dXJuIE9LIGlmIG91ciBjbGFpbSBpcyBhY2NlcHRlZCAoYWx3YXlzLCB1bmRlciBSSVNDIE9TKQorICovCisgICAgaW50CitjbGlwX21jaF9vd25fc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIGludCBibG9ja1s2XTsKKyAgICBibG9ja1swXSA9IDI0OwkvKiBMZW5ndGggb2YgYmxvY2suICAqLworICAgIGJsb2NrWzNdID0gMDsJLyogT3JpZ2luYWwgbWVzc2FnZS4gKi8KKyAgICBibG9ja1s0XSA9IDB4ZjsJLyogQ2xhaW1FbnRpdHkuICovCisgICAgYmxvY2tbNV0gPSAweDQ7CS8qIENsYWltIGNsaXBib2FyZCBvbmx5LiAqLworICAgIHN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIDApOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuICBEbyBub3RoaW5nIGZvciBYIGJlY2F1c2Ugd2UKKyAqIHdpbGwgZmlsbCBpbiB0aGUgc2VsZWN0aW9uIG9ubHkgd2hlbiByZXF1ZXN0ZWQgYnkgYW5vdGhlciBhcHAuIFNvdW5kcyBnb29kCisgKiBmb3IgUklTQyBPUyB0b28uCisgKi8KKyAgICB2b2lkCitjbGlwX21jaF9zZXRfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIGNsaXBfZ2V0X3NlbGVjdGlvbihjYmQpOworfQorCisvKgorICogTWFrZSBhIG1lbnUgZWl0aGVyIGdyZXkgb3Igbm90IGdyZXkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KQoreworICAgIG1lbnUtPiBncmV5ZWRfb3V0ID0gZ3JleTsKK30KKworLyoKKyAqIE1ha2UgbWVudSBpdGVtIGhpZGRlbiBvciBub3QgaGlkZGVuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfaGlkZGVuKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikKK3sKKyAgICBtZW51LT4gaGlkZGVuID0gaGlkZGVuOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIG1lbnVzIHRvIGdyZXkvaGlkZGVuIG9yIG5vdC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19tZW51YmFyKHZvaWQpCit7CisgICAgc3dpKFdpbXBfQ3JlYXRlTWVudSwgMCwgLTEpOworICAgIGlmICh3aW1wX21lbnUgIT0gKGludCAqKSAtMSkKKyAgICB7CisJcm9fcmVtb3ZlX21lbnUod2ltcF9tZW51KTsKKwl3aW1wX21lbnUgPSAoaW50ICopIC0xOworICAgIH0KK30KKworLyogQWRkIG9yIHJlbW92ZSBhIHNjcm9sbGJhci4gTm90ZSB0aGF0IHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbgorICogdGhlIHNjcm9sbGJhciBzdGF0ZSBpcyBjaGFuZ2luZy4KKyAqIFRoZSBzY3JvbGwgYmFyIHdpbmRvdyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCisgKiBXZSBjYW4ndCBkbyBhbnl0aGluZyBleGNlcHQgcmVtb3ZlIHRoZSBzY3JvbGwgYmFyCisgKiB1bnRpbCB3ZSBrbm93IHdoYXQgc2l6ZSB0byB1c2UuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2IsIGZsYWcpCisgICAgc2Nyb2xsYmFyX1QJKnNiOworICAgIGludAkJZmxhZzsKK3sKKyAgICBpZiAoIWZsYWcpCisJc3dpKFdpbXBfQ2xvc2VXaW5kb3csIDAsICYgKHNiLT5pZCkgKTsKKyAgICByZXR1cm47Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9ibGlua2luZyhsb25nIHdhaXR0aW1lLCBsb25nIG9uLCBsb25nIG9mZikKK3sKK30KKworLyoKKyAqIFN0b3AgdGhlIGN1cnNvciBibGlua2luZy4gIFNob3cgdGhlIGN1cnNvciBpZiBpdCB3YXNuJ3Qgc2hvd24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3N0b3BfYmxpbmsodm9pZCkKK3sKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKKyAqIHdhaXRpbmcgdGltZSBhbmQgc2hvd3MgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RhcnRfYmxpbmsodm9pZCkKK3sKK30KKworLyoKKyAqIFJldHVybiB0aGUgUkdCIHZhbHVlIG9mIGEgcGl4ZWwgYXMgYSBsb25nLgorICovCisgICAgbG9uZ191CitndWlfbWNoX2dldF9yZ2IoZ3VpY29sb3JfVCBwaXhlbCkKK3sKKyAgICByZXR1cm4gKGxvbmdfdSlwaXhlbDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2VuYWJsZV9tZW51KGludCBmbGFnKQoreworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfbWVudV9wb3MoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51KHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkKK3sKK30KKworICAgIHZvaWQKK2d1aV9tY2hfYWRkX21lbnVfaXRlbSh2aW1tZW51X1QgKm1lbnUsIGludCBpZHgpCit7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX25ld19tZW51X2NvbG9ycyh2b2lkKQoreworfQorCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X21lbnUodmltbWVudV9UICptZW51KQoreworfQorCisvKiBTaXplIG9mIGJ1ZmZlciBoYXMgY2hhbmdlZC4KKyAqIEFkZCBvbmUgdG8gbWF4IHNpbmNlIGd1aS5jIHN1YnN0cmFjdHMgb25lIG1vcmUgdGhhbiBpdCBzaG91bGQhCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoc2IsIHZhbCwgc2l6ZSwgbWF4KQorICAgIHNjcm9sbGJhcl9UCSpzYjsKKyAgICBsb25nCXZhbDsKKyAgICBsb25nCXNpemU7CisgICAgbG9uZwltYXg7Cit7CisgICAgaW50CQlibG9ja1sxMF0sIHdpZHRoLCBoZWlnaHQ7CisKKyAgICB3aWR0aCA9IChtYXggKyAxKSAqIGd1aS5jaGFyX3dpZHRoOworICAgIGhlaWdodCA9IChtYXggKyAxICsgV19TVEFUVVNfSEVJR0hUKHNiLT53cCkpICogZ3VpLmNoYXJfaGVpZ2h0OworCisgICAgYmxvY2tbMF0gPSBibG9ja1szXSA9IDA7CisgICAgYmxvY2tbMV0gPSAtaGVpZ2h0ICsgKDEgPDwgeV9laWdlbl9mYWN0b3IpOworICAgIGJsb2NrWzJdID0gd2lkdGg7CisKKyAgICBzd2koV2ltcF9TZXRFeHRlbnQsIHNiIC0+IGlkLCBibG9jayk7CisKKyAgICBibG9ja1swXSA9IHNiIC0+IGlkOworICAgIHN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisgICAgYmxvY2tbNV0gPSB2YWwgKiBndWkuY2hhcl93aWR0aDsKKyAgICBibG9ja1s2XSA9IC12YWwgKiBndWkuY2hhcl9oZWlnaHQ7CisgICAgc3dpKFdpbXBfT3BlbldpbmRvdywgMCwgYmxvY2ssIDB4NGI1MzQxNTQsCisJCQlndWkud2luZG93X2hhbmRsZSwJLyogUGFyZW50IHdpbmRvdyBoYW5kbGUuICovCisJCQkoQ0hJTERfRklYX1RPX1JJR0hUICA8PCBDSElMRF9MRUZUICApICAgfAorCQkJKENISUxEX0ZJWF9UT19SSUdIVCAgPDwgQ0hJTERfUklHSFQgKSAgIHwKKwkJCShDSElMRF9GSVhfVE9fQk9UVE9NIDw8IENISUxEX1RPUCAgICkgICB8CisJCQkoQ0hJTERfRklYX1RPX0JPVFRPTSA8PCBDSElMRF9CT1RUT00pICAgfAorCQkJKENISUxEX1NFTEZfU0NST0xMICAgPDwgQ0hJTERfU0NST0xMX1gpIHwKKwkJCShDSElMRF9TRUxGX1NDUk9MTCAgIDw8IENISUxEX1NDUk9MTF9ZKQorCQkJKTsKK30KKworLyogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsYmFyIHdpdGhpbiB0aGUgZWRpdG9yCisgKiB3aW5kb3cuIE5vdGUgdGhhdCwgZm9yIHZlcnRpY2FsIHNjcm9sbGJhcnMsIHggYW5kIHcKKyAqIGFyZSBpZ25vcmVkLiBGb3IgaG9yaXpvbnRhbCBiYXJzIHkgYW5kIGggYXJlIGlnbm9yZWQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKHNiLCB4LCB5LCB3LCBoKQorICAgIHNjcm9sbGJhcl9UICpzYjsKKyAgICBpbnQJCXg7CQkvKiBIb3Jpem9udGFsIHNiIHBvc2l0aW9uICovCisgICAgaW50CQl5OwkJLyogVG9wIG9mIHNjcm9sbCBiYXIgKi8KKyAgICBpbnQJCXc7CQkvKiBXaWR0aCAqLworICAgIGludAkJaDsJCS8qIEhlaWdodCAqLworeworICAgIGludAkJYmxvY2tbMjRdOworICAgIGludAkJcHgxLCBweTE7CS8qIFBhcmVudCB3aW5kb3cgbWluIGNvb3JkcyAqLworICAgIGludAkJcHgyLCBweTI7CS8qIFBhcmVudCB3aW5kb3cgbWF4IGNvb3JkcyAqLworCisgICAgLyogRmluZCB3aGVyZSB0aGUgcGFyZW50IHdpbmRvdyBpcy4gKi8KKyAgICBibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIHN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisgICAgcHgxID0gYmxvY2tbMV07CisgICAgcHkxID0gYmxvY2tbMl07CisgICAgcHgyID0gYmxvY2tbM107CisgICAgcHkyID0gYmxvY2tbNF07CisKKyAgICBibG9ja1swXSA9IHNiIC0+IGlkOworCisgICAgLyogRmluZCBvdXQgaG93IGJpZyB0aGUgc2Nyb2xsIHdpbmRvdyBpcyBhdCB0aGUgbW9tZW50LiAqLworICAgIHN3aShXaW1wX0dldFdpbmRvd0luZm8sIDAsICgoY2hhcl91ICopYmxvY2spICsgMSk7CisKKyAgICBpZiAoYmxvY2tbMTNdIDwgdyB8fCBibG9ja1sxMl0gPiAtaCkKKyAgICB7CisJLyogQ3VycmVudCB3aW5kb3cgaXMgdG9vIHNtYWxsISAqLworCWlmIChibG9ja1sxMl0gPiAtaCkKKwkgICAgYmxvY2tbMTJdID0gLWg7CisJaWYgKGJsb2NrWzEzXSA8IHcpCisJICAgIGJsb2NrWzEzXSA9IHc7CisJc3dpKFdpbXBfU2V0RXh0ZW50LCBibG9ja1swXSwgYmxvY2sgKyAxMSk7CisgICAgfQorCisgICAgLyogVGhpcyB3b3JrcyBiZXR0ZXIgb24gdGhlIG5lc3RlZF93aW1wLiAqLworICAgIGlmIChzYi0+IHdwKQorICAgIHsKKwkvKiBUaGlzIGlzIGEgdmVydGljYWwgc2Nyb2xsYmFyLiAqLworCWJsb2NrWzFdID0gYmxvY2tbM10gPSBweDIgLSBndWkuc2Nyb2xsYmFyX3dpZHRoICsgKDEgPDwgeF9laWdlbl9mYWN0b3IpOworCWJsb2NrWzJdID0gMSArIHB5MiAtICh5ICsgaCkgKyAoMSA8PCB5X2VpZ2VuX2ZhY3Rvcik7CisJYmxvY2tbNF0gPSAxICsgcHkyIC0geTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBUaGlzIGlzIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIuICovCisJYmxvY2tbMl0gPSBibG9ja1s0XSA9IHB5MSArIGd1aS5zY3JvbGxiYXJfaGVpZ2h0OworCWJsb2NrWzFdID0gcHgxOworCWJsb2NrWzNdID0gcHgyIC0gZ3VpLnNjcm9sbGJhcl93aWR0aDsKKyAgICB9CisKKyAgICBibG9ja1s1XSA9IDA7CisgICAgYmxvY2tbNl0gPSAwOworICAgIGJsb2NrWzddID0gLTE7CisKKyAgICBzd2koV2ltcF9PcGVuV2luZG93LCAwLCBibG9jaywgMHg0YjUzNDE1NCwKKwkgICAgZ3VpLndpbmRvd19oYW5kbGUsCS8qIFBhcmVudCB3aW5kb3cgaGFuZGxlLiAqLworCSAgICAoQ0hJTERfRklYX1RPX1JJR0hUICA8PCBDSElMRF9MRUZUICApICAgfAorCSAgICAoQ0hJTERfRklYX1RPX1JJR0hUICA8PCBDSElMRF9SSUdIVCApICAgfAorCSAgICAoQ0hJTERfRklYX1RPX0JPVFRPTSA8PCBDSElMRF9UT1AgICApICAgfAorCSAgICAoQ0hJTERfRklYX1RPX0JPVFRPTSA8PCBDSElMRF9CT1RUT00pICAgfAorCSAgICAoQ0hJTERfU0VMRl9TQ1JPTEwgICA8PCBDSElMRF9TQ1JPTExfWCkgfAorCSAgICAoQ0hJTERfU0VMRl9TQ1JPTEwgICA8PCBDSElMRF9TQ1JPTExfWSkKKyAgICAgICApOworfQorCisvKiBDcmVhdGUgYSB3aW5kb3cgd2l0aCBubyB3b3JrYXJlYSB0byBwbGFjZSBpbnNpZGUgZWRpdG9yIHdpbmRvdy4KKyAqICh3aGF0IGhhcHBlbnMgd2l0aG91dCB0aGUgbmVzdGVkIHdpbXA/KQorICogRGF0YSBmb3Igc2Nyb2xsYmFyIGlzIGludmFsaWQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoc2IsIG9yaWVudCkKKyAgICBzY3JvbGxiYXJfVCAqc2I7CisgICAgaW50CQlvcmllbnQ7CS8qIG9yaWVudCBpcyBTQkFSX0hPUklaIG9yIFNCQVJfVkVSVCAqLworeworICAgIGludCBiYXJbXSA9CisJeworCSAgICAwLCAgIDAsCQkvKiBWaXNpYmxlIGFyZWEgOiBtaW4gWCxZICovCisJICAgIDEwMCwgMTAwLAkJLyoJCSAgbWF4IFgsWSAqLworCSAgICAwLCAgIDAsCQkvKiBTY3JvbGwgb2Zmc2V0cyAqLworCSAgICAtMSwJCQkvKiBXaW5kb3cgaW4gZnJvbnQgKi8KKwkgICAgMHg4MDgwMDE1MCB8IChvcmllbnQgPT0gU0JBUl9IT1JJWiA/ICgxIDw8IDMwKSA6ICgxIDw8IDI4KSksCisJICAgIDB4ZmYwNzAyMDcsCQkvKiBDb2xvdXJzICovCisJICAgIDB4MDAwYzAxMDMsCQkvKiBNb3JlIGNvbG91cnMgKi8KKwkgICAgMCwgLTB4NDAwMCwJCS8qIFdvcmthcmVhIGV4dGVudCAqLworCSAgICAweDQwMDAsIDAsCQkvKiBtYXggWCxZICovCisJICAgIDB4MDAwMDAwMDAsCQkvKiBObyB0aXRsZSAqLworCSAgICAwIDw8IDEyLAkJLyogTm8gd29ya2FyZWEgYnV0dG9uIHR5cGUgKi8KKwkgICAgMSwJCQkvKiBXaW1wIHNwcml0ZSBhcmVhICovCisJICAgIDB4MDAwMTAwMDEsCQkvKiBNaW5pbXVtIHdpZHRoLCBoZWlnaHQgKi8KKwkgICAgMCwgMCwgMCwJCS8qIFRpdGxlIGRhdGEgKG5vbmUpICovCisJICAgIDAJCQkvKiBObyBpY29ucyAqLworCX07CisgICAgc3dpKFdpbXBfQ3JlYXRlV2luZG93LCAwLCBiYXIpOworICAgIHNiIC0+IGlkID0gcjA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNjcm9sbGJhcl9UICpzYikKK3sKKyAgICBzd2koV2ltcF9EZWxldGVXaW5kb3csIDAsICYgKHNiLT5pZCkpOworICAgIHNiIC0+IGlkID0gLTE7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3Njcm9sbGJhcl9jb2xvcnMoc2Nyb2xsYmFyX1QgKnNiKQoreworICAgIC8qIEFsd2F5cyB1c2UgZGVmYXVsdCBSTyBjb2xvdXIgc2NoZW1lLiAqLworfQorCisvKgorICogR2V0IGN1cnJlbnQgeCBtb3VzZSBjb29yZGluYXRlIGluIHRleHQgd2luZG93LgorICogTm90ZTogKDAsMCkgaXMgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciwgcG9zaXRpdmUgeSBpcyBVUC4KKyAqIFJldHVybiAtMSB3aGVuIHVua25vd24uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3goKQoreworICAgIGludCBsZWZ0OworICAgIGludCBibG9ja1sxMF07CisKKyAgICBibG9ja1swXSA9IGd1aS53aW5kb3dfaGFuZGxlOworICAgIHN3aShXaW1wX0dldFdpbmRvd1N0YXRlLCAwLCBibG9jayk7CisgICAgbGVmdCA9IGJsb2NrWzFdOworCisgICAgc3dpKFdpbXBfR2V0UG9pbnRlckluZm8sIDAsIGJsb2NrKTsKKyAgICByZXR1cm4gYmxvY2tbMF0gLSBsZWZ0OworfQorCisvKgorICogR2V0IGN1cnJlbnQgeSBtb3VzZSBjb29yZGluYXRlIGluIHRleHQgd2luZG93LgorICogUmV0dXJuIC0xIHdoZW4gdW5rbm93bi4KKyAqLworICAgIGludAorZ3VpX21jaF9nZXRfbW91c2VfeSgpCit7CisgICAgaW50IHRvcDsKKyAgICBpbnQgYmxvY2tbMTBdOworCisgICAgYmxvY2tbMF0gPSBndWkud2luZG93X2hhbmRsZTsKKyAgICBzd2koV2ltcF9HZXRXaW5kb3dTdGF0ZSwgMCwgYmxvY2spOworICAgIHRvcCA9IGJsb2NrWzRdOworCisgICAgc3dpKFdpbXBfR2V0UG9pbnRlckluZm8sIDAsIGJsb2NrKTsKKyAgICByZXR1cm4gdG9wIC0gYmxvY2tbMV07Cit9CisKKy8qIE1vdXNlVG8oeCwgeSkgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldG1vdXNlKHgsIHkpCisgICAgaW50CQl4OworICAgIGludAkJeTsKK3sKK30KKworICAgIHZvaWQKK2d1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKGVuYWJsZSkKKyAgICBpbnQJCWVuYWJsZTsKK3sKKyAgICAvKiBubyB0ZWFyb2ZmIG1lbnVzICovCit9CisKKy8qIFJlZHJhdyBhIHdpbmRvdydzIHRpdGxlLgorICogRm9yIHRoZSBuZXN0ZWQgd2ltcCB3ZSB1c2UgdGhlIG5ldyAncmVkcmF3LXRpdGxlLWJhcicgcmVhc29uIGNvZGUuCisgKiBGb3Igb2xkZXIgd2ltcHMgd2UgbWFyayB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHdoZXJlIHRoZSB0aXRsZSBiYXIKKyAqIGlzIGFzIGludmFsaWQuCisgKi8KKyAgICB2b2lkCityb19yZWRyYXdfdGl0bGUod2luZG93KQorICAgIGludCB3aW5kb3c7Cit7CisgICAgaWYgKG5lc3RlZF93aW1wKQorICAgIHsKKwlzd2koV2ltcF9Gb3JjZVJlZHJhdywgd2luZG93LCAweDRiNTM0MTU0LCAzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpbnQgYmxvY2tbMTBdOworCWludCBtaW55OworCisJYmxvY2tbMF0gPSB3aW5kb3c7CisJc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKwltaW55ID0gYmxvY2tbNF07CisJc3dpKFdpbXBfR2V0V2luZG93T3V0bGluZSwgMCwgYmxvY2spOworCXN3aShXaW1wX0ZvcmNlUmVkcmF3LCAtMSwKKwkJCWJsb2NrWzFdLCBtaW55LAorCQkJYmxvY2tbM10sIGJsb2NrWzRdKTsKKyAgICB9Cit9CisKKy8qIFR1cm4gYSB2aW1tZW51X1Qgc3RydWN0dXJlIGludG8gYSB3aW1wIG1lbnUgc3RydWN0dXJlLgorICogLTEgaWYgcmVzdWx0aW5nIG1lbnUgaXMgZW1wdHkuCisgKiBPbmx5IHRoZSBjaGlsZHJlbiBhbmQgZG5hbWUgaXRlbXMgaW4gdGhlIHJvb3QgbWVudSBhcmUgdXNlZC4KKyAqLworICAgIGludCAqCityb19idWlsZF9tZW51KG1lbnUpCisgICAgdmltbWVudV9UCSptZW51OworeworICAgIGludAkJKndpbXBfbWVudTsKKyAgICBpbnQJCXdpZHRoID0gNDsKKyAgICBpbnQJCXc7CisgICAgaW50CQlzaXplID0gMjg7CisgICAgdmltbWVudV9UCSppdGVtOworICAgIGludAkJKndpbXBfaXRlbTsKKworICAgIC8qIEZpbmQgb3V0IGhvdyBiaWcgdGhlIG1lbnUgaXMgc28gd2UgY2FuIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgKi8KKyAgICBmb3IgKGl0ZW0gPSBtZW51LT4gY2hpbGRyZW47IGl0ZW07IGl0ZW0gPSBpdGVtLT4gbmV4dCkKKyAgICB7CisJaWYgKGl0ZW0tPiBoaWRkZW4gPT0gRkFMU0UgJiYgIW1lbnVfaXNfc2VwYXJhdG9yKGl0ZW0tPm5hbWUpKQorCSAgICBzaXplICs9IDI0OworICAgIH0KKworICAgIGlmIChzaXplIDw9IDI4KQorCXJldHVybiAoaW50ICopIC0xOwkJLyogTm8gY2hpbGRyZW4gLSBzaG91bGRuJ3QgaGFwcGVuICovCisKKyAgICB3aW1wX21lbnUgPSAoaW50ICopIGFsbG9jKHNpemUpOworCisgICAgd2ltcF9tZW51WzBdID0gKGludCkgbWVudS0+IGRuYW1lOworICAgIHdpbXBfbWVudVsxXSA9IC0xOworICAgIHdpbXBfbWVudVsyXSA9IDA7CisgICAgd2ltcF9tZW51WzNdID0gMHgwMDA3MDIwNzsKKyAgICB3aW1wX21lbnVbNV0gPSA0NDsKKyAgICB3aW1wX21lbnVbNl0gPSAwOworCisgICAgd2ltcF9pdGVtID0gd2ltcF9tZW51ICsgNzsKKworICAgIGZvciAoaXRlbSA9IG1lbnUtPiBjaGlsZHJlbjsgaXRlbTsgaXRlbSA9IGl0ZW0tPiBuZXh0KQorICAgIHsKKwlpZiAobWVudV9pc19zZXBhcmF0b3IoaXRlbS0+IG5hbWUpKQorCXsKKwkgICAgLyogVGhpcyBtZW51IGVudHJ5IGlzIGFjdHVhbGx5IGEgc2VwYXJhdG9yLiBJZiBpdCBpcyBub3QgdGhlIGZpcnN0CisJICAgICAqIG1lbnUgZW50cnkgdGhlbiBtYXJrIHRoZSBwcmV2aW91cyBtZW51IGl0ZW0gYXMgbmVlZGluZyBhIGRvdHRlZAorCSAgICAgKiBsaW5lIGFmdGVyIGl0LgorCSAgICAgKi8KKwkgICAgaWYgKHdpbXBfaXRlbSA+IHdpbXBfbWVudSArIDcpCisJCXdpbXBfaXRlbVstNl0gfD0gMHgyOworCX0KKwllbHNlIGlmIChpdGVtLT4gaGlkZGVuID09IEZBTFNFKQorCXsKKwkgICAgd2ltcF9pdGVtWzBdID0gMDsKKwkgICAgd2ltcF9pdGVtWzFdID0gaXRlbS0+IGNoaWxkcmVuID8gKGludCkgcm9fYnVpbGRfbWVudShpdGVtKSA6IC0xOworCSAgICB3aW1wX2l0ZW1bMl0gPSAweDA3MDA5MTMxIHwgKGl0ZW0tPiBncmV5ZWRfb3V0IDw8IDIyKTsKKwkgICAgd2ltcF9pdGVtWzNdID0gKGludCkgaXRlbS0+IGRuYW1lOworCSAgICB3aW1wX2l0ZW1bNF0gPSAtMTsKKwkgICAgd2ltcF9pdGVtWzVdID0gKGludCkgaXRlbTsgIC8qIFN0dWZmIHRoZSBtZW51IGFkZHJlc3MgaW4gdGhpcyB1bnVzZWQgc3BhY2UgKi8KKworCSAgICB3ID0gc3RybGVuKGl0ZW0tPiBkbmFtZSkgKyAxOworCSAgICBpZiAodyA+IHdpZHRoKQorCQl3aWR0aCA9IHc7CisJICAgIHdpbXBfaXRlbSArPSA2OworCX0KKyAgICB9CisKKyAgICB3aW1wX21lbnVbNF0gPSAod2lkdGggKyAyKSAqIDE2OworICAgIHdpbXBfbWVudVs3XSAgfD0gMHgxMDA7CSAgICAvKiBNZW51IHRpdGxlIGlzIGluZGlyZWN0ZWQgKi8KKyAgICB3aW1wX2l0ZW1bLTZdIHw9IDB4MDgwOwkgICAgLyogTGFzdCBlbnRyeSBpbiBtZW51ICovCisgICAgcmV0dXJuIHdpbXBfbWVudTsKK30KKworICAgIHN0YXRpYyB2b2lkCityb19yZW1vdmVfbWVudShtZW51KQorICAgIGludAkgICAgKm1lbnU7Cit7CisgICAgaW50CSAgICAqaXRlbSA9IG1lbnUgKyA3OworCisgICAgaWYgKG1lbnUgPT0gTlVMTCB8fCBtZW51ID09IChpbnQgKikgLTEpCisJcmV0dXJuOworCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKGl0ZW1bMV0gIT0gLTEpCisJICAgIHJvX3JlbW92ZV9tZW51KChpbnQgKikgaXRlbVsxXSk7CS8qIFJlbW92ZSBzdWItbWVudSAqLworCWlmIChpdGVtWzBdICYgMHg4MCkKKwkgICAgYnJlYWs7CQkJLyogVGhpcyB3YXMgdGhlIGxhc3QgZW50cnkgKi8KKwlpdGVtICs9IDY7CisgICAgfQorICAgIHZpbV9mcmVlKG1lbnUpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zaG93X3BvcHVwbWVudShtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICBpbnQJCWJsb2NrWzEwXTsKKworICAgIC8qIFJlbW92ZSB0aGUgZXhpc3RpbmcgbWVudSwgaWYgYW55ICovCisgICAgaWYgKHdpbXBfbWVudSAhPSAoaW50ICopIC0xKQorICAgIHsKKwlzd2koV2ltcF9DcmVhdGVNZW51LCAwLCAtMSk7CisJcm9fcmVtb3ZlX21lbnUod2ltcF9tZW51KTsKKwl3aW1wX21lbnUgPSAoaW50ICopIC0xOworICAgIH0KKworICAgIHdpbXBfbWVudSA9IHJvX2J1aWxkX21lbnUobWVudSk7CisgICAgaWYgKHdpbXBfbWVudSAhPSAoaW50ICopIC0xKQorICAgIHsKKwlzd2koV2ltcF9HZXRQb2ludGVySW5mbywgMCwgYmxvY2spOworCXN3aShXaW1wX0NyZWF0ZU1lbnUsIDAsIHdpbXBfbWVudSwgYmxvY2tbMF0gLSA2NCwgYmxvY2tbMV0gKyA2NCk7CisgICAgfQorfQorCisvKiBSdW4gYSBjb21tYW5kIHVzaW5nIHRoZSBUYXNrV2luZG93IG1vZHVsZS4KKyAqIElmIFNIRUxMX0ZJTFRFUiBpcyBzZXQgdGhlbiBvdXRwdXQgaXMgbm90IGVjaG9lZCB0byB0aGUgc2NyZWVuLAorICogSWYgaXQgaXMgbm90IHNldCwgdGhlbiBcciBpcyBub3Qgc2VudCB0byB0aGUgb3V0cHV0IGZpbGUuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfY2FsbF9zaGVsbChjbWQsIG9wdGlvbnMpCisgICAgY2hhcl91ICAqY21kOworICAgIGludAkgICAgb3B0aW9uczsJLyogU0hFTExfRklMVEVSIGlmIGNhbGxlZCBieSBkb19maWx0ZXIoKSAqLworCQkJLyogU0hFTExfQ09PS0VEIGlmIHRlcm0gbmVlZHMgY29va2VkIG1vZGUgKi8KK3sKKyAgICBjaGFyX3UgIHRhc2tfY21kWzI1Nl07CS8qIENvbnRhaW5zICpUYXNrV2luZG93IGNvbW1hbmQuICovCisgICAgaW50CSAgICBibG9ja1s2NF07CisgICAgaW50CSAgICByZWFzb247CisgICAgY2hhcl91ICAqb3V0OworICAgIGNoYXJfdSAgYzsKKyAgICBpbnQJICAgIG9sZF9tc2dfY29sOworICAgIGNoYXJfdSAgKm91dF9yZWRpcjsKKyAgICBpbnQJICAgIGxlbmd0aDsKKyAgICBGSUxFICAgICpvdXRfZmlsZSA9IE5VTEw7CisKKyAgICBvdXRfcmVkaXIgPSBzdHJzdHIoY21kLCAiID4gIik7CisgICAgaWYgKG91dF9yZWRpciA9PSBOVUxMKQorCWxlbmd0aCA9IHN0cmxlbihjbWQpOwkvKiBObyByZWRpcmVjdGlvbi4gKi8KKyAgICBlbHNlCisgICAgeworCWxlbmd0aCA9IG91dF9yZWRpciAtIGNtZDsKKwlvdXRfZmlsZSA9IGZvcGVuKG91dF9yZWRpciArIDMsICJ3YiIpOworCWlmIChvdXRfZmlsZSA9PSBOVUxMKQorCSAgICBtc2dfc3RyKCJXQVJOSU5HIDogQ2FuJ3Qgb3BlbiBmaWxlICVzIGZvciB3cml0aW5nXG4iLAorCQkJCQkJCSAgICAgICBvdXRfcmVkaXIgKyAzKTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID4gMTgwKQorICAgIHsKKwlpZiAob3V0X2ZpbGUpCisJICAgIGZjbG9zZShvdXRfZmlsZSk7CisJcmV0dXJuIEZBSUw7CQkvKiBDb21tYW5kIHRvbyBsb25nLiAqLworICAgIH0KKworICAgIHN0cmNweSh0YXNrX2NtZCwgIlRhc2tXaW5kb3cgXCIiKTsKKyAgICBzdHJuY3B5KHRhc2tfY21kICsgMTIsIGNtZCwgbGVuZ3RoKTsKKyAgICBzcHJpbnRmKHRhc2tfY21kICsgMTIgKyBsZW5ndGgsCisJICAgICJcIiAtdGFzayAmJTA4eCAtY3RybCAtcXVpdCAtbmFtZSBcIlZpbSBjb21tYW5kXCIiLAorCSAgICB0YXNrX2hhbmRsZSk7CisKKyAgICBpZiAob3B0aW9ucyAmIFNIRUxMX0NPT0tFRCkKKwlzZXR0bW9kZShUTU9ERV9DT09LKTsKKworICAgIGlmICh4c3dpKFdpbXBfU3RhcnRUYXNrLCB0YXNrX2NtZCkgJiB2X2ZsYWcpCisgICAgeworCS8qIEZhaWxlZCB0byBldmVuIHN0YXJ0IGEgbmV3IHRhc2sgKG91dCBvZiBtZW1vcnk/KSAqLworCXNldHRtb2RlKFRNT0RFX1JBVyk7CisJaWYgKG91dF9maWxlKQorCSAgICBmY2xvc2Uob3V0X2ZpbGUpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIFdhaXQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGluaXRpYWxpc2UuICovCisgICAgY2hpbGRfaGFuZGxlID0gMDsKKyAgICB3aGlsZSAoIWNoaWxkX2hhbmRsZSkKKyAgICB7CisJcmVhc29uID0gd2ltcF9wb2xsKDAsIGJsb2NrKTsKKwlpZiAoKHJlYXNvbiA9PSAxNyB8fCByZWFzb24gPT0gMTgpICYmIGJsb2NrWzRdID09IDB4ODA4YzIpCisJICAgIGNoaWxkX2hhbmRsZSA9IGJsb2NrWzFdOworCWVsc2UKKwkgICAgcHJvY2Vzc19ldmVudChyZWFzb24sIGJsb2NrKTsKKyAgICB9CisKKyAgICAvKiBCbG9jayB1bnRpbCBmaW5pc2hlZCAqLworICAgIHdoaWxlIChjaGlsZF9oYW5kbGUpCisgICAgeworCXJlYXNvbiA9IHdpbXBfcG9sbCgxLCBibG9jayk7CisJaWYgKHJlYXNvbiA9PSAzIHx8IChyZWFzb24gPT0gOCAmJiBibG9ja1s2XSA9PSAzKSkKKwl7CisJICAgIC8qIENsb3NlIHdpbmRvdyByZXF1ZXN0IG9yIENUUkwtQyAtIGtpbGwgY2hpbGQgdGFzay4gKi8KKwkgICAgYmxvY2tbMF0gPSAyMDsKKwkgICAgYmxvY2tbM10gPSAwOworCSAgICBibG9ja1s0XSA9IDB4ODA4YzQ7CSAgICAvKiBNb3JpdGUgKi8KKwkgICAgc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE3LCBibG9jaywgY2hpbGRfaGFuZGxlKTsKKwkgICAgTVNHX1BVVFMoXygiXG5TZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iKSk7CisJICAgIGNvbnRpbnVlOworCX0KKwllbHNlIGlmIChyZWFzb24gPT0gOCkKKwl7CisJICAgIGJsb2NrWzBdID0gMjg7CisJICAgIGJsb2NrWzNdID0gMDsKKwkgICAgYmxvY2tbNF0gPSAweDgwOGMwOwkgICAgLyogSW5wdXQgKi8KKwkgICAgYmxvY2tbNV0gPSAxOworCSAgICAvKiBCbG9ja1s2XSBpcyBPSyBhcyBpdCBpcyEgKi8KKwkgICAgc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE3LCBibG9jaywgY2hpbGRfaGFuZGxlKTsKKwkgICAgY29udGludWU7CisJfQorCWVsc2UgaWYgKHJlYXNvbiA9PSAxNyB8fCByZWFzb24gPT0gMTgpCisJeworCSAgICBpZiAoYmxvY2tbNF0gPT0gMHg4MDhjMSkKKwkgICAgeworCQkvKiBBY2sgbWVzc2FnZS4gKi8KKwkJYmxvY2tbM10gPSBibG9ja1syXTsKKwkJc3dpKFdpbXBfU2VuZE1lc3NhZ2UsIDE5LCBibG9jaywgYmxvY2tbMV0pOworCQlvdXQgPSAoY2hhcl91ICopYmxvY2sgKyAyNDsKKwkJb2xkX21zZ19jb2wgPSBtc2dfY29sOworCQl3aGlsZSAoYmxvY2tbNV0tLSkKKwkJeworCQkgICAgYyA9ICpvdXQrKzsKKwkJICAgIGlmIChvdXRfZmlsZSAmJiAoYyAhPSAnXHInIHx8IChvcHRpb25zICYgU0hFTExfRklMVEVSKSkpCisJCQlmcHV0YyhjLCBvdXRfZmlsZSk7CisJCSAgICBpZiAoKG9wdGlvbnMgJiBTSEVMTF9GSUxURVIpID09IDApCisJCSAgICB7CisJCQlpZiAoYyA9PSAxMjcpCisJCQkgICAgbXNnX3B1dHMoIlxiIFxiIik7CisJCQllbHNlIGlmIChjID4gMzEpCisJCQkgICAgbXNnX3B1dGNoYXIoYyk7CisJCQllbHNlIGlmIChjID09IDEwKQorCQkJeworCQkJICAgIGxpbmVzX2xlZnQgPSA4OwkvKiBEb24ndCBkbyBNb3JlIHByb21wdCEgKi8KKwkJCSAgICBtc2dfcHV0Y2hhcigxMCk7CisJCQl9CisJCSAgICB9CisJCX0KKwkJLyogRmx1c2ggb3V0cHV0IHRvIHRoZSBzY3JlZW4uICovCisJCXdpbmRnb3RvKG1zZ19yb3csIG1zZ19jb2wpOworCQlvdXRfZmx1c2goKTsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisJcHJvY2Vzc19ldmVudChyZWFzb24sIGJsb2NrKTsKKyAgICB9CisgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisgICAgc2V0dG1vZGUoVE1PREVfUkFXKTsKKyAgICBpZiAob3V0X2ZpbGUpCisJZmNsb3NlKG91dF9maWxlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIExpa2Ugc3Ryc2F2ZSgpLCBidXQgc3RvcHMgYXQgYW55IGNvbnRyb2wgY2hhciAqLworICAgIGNoYXJfdSAqCit3aW1wX3N0cnNhdmUoc3RyKQorICAgIGNoYXIgICAgKnN0cjsKK3sKKyAgICBpbnQJICAgIHN0cmxlbiA9IDA7CisgICAgY2hhcl91ICAqcmV0dmFsOworICAgIHdoaWxlIChzdHJbc3RybGVuXSA+IDMxKQorCXN0cmxlbisrOworICAgIHJldHZhbCA9IGFsbG9jKHN0cmxlbiArIDEpOworICAgIGlmIChyZXR2YWwpCisgICAgeworCW1lbWNweShyZXR2YWwsIHN0ciwgc3RybGVuKTsKKwlyZXR2YWxbc3RybGVuXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIElmIHdlIGFyZSBzYXZpbmcgdGhlbiBwb3AgdXAgYSBzdGFuZGFyZCBSSVNDIE9TIHNhdmUgYm94LgorICogT3RoZXJ3aXNlLCBvcGVuIGEgZGlyZWN0b3J5IHZpZXdlciBvbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IChhbmQgcmV0dXJuIE5VTEwpCisgKiBUaGUgc3RyaW5nIHdlIHJldHVybiB3aWxsIGJlIGZyZWVkIGxhdGVyLgorICovCisgICAgY2hhcl91ICoKK2d1aV9tY2hfYnJvd3NlKHNhdmluZywgdGl0bGUsIGRmbHQsIGV4dCwgaW5pdGRpciwgZmlsdGVyKQorICAgIGludAkJc2F2aW5nOwkJLyogd3JpdGUgYWN0aW9uICovCisgICAgY2hhcl91CSp0aXRsZTsJCS8qIHRpdGxlIGZvciB0aGUgd2luZG93ICovCisgICAgY2hhcl91CSpkZmx0OwkJLyogZGVmYXVsdCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmV4dDsJCS8qIGV4dGVuc2lvbiBhZGRlZCAqLworICAgIGNoYXJfdQkqaW5pdGRpcjsJLyogaW5pdGlhbCBkaXJlY3RvcnksIE5VTEwgZm9yIGN1cnJlbnQgZGlyICovCisgICAgY2hhcl91CSpmaWx0ZXI7CS8qIGZpbGUgbmFtZSBmaWx0ZXIgKi8KK3sKKyAgICBjaGFyIGNvbW1hbmRbMjU2XTsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgaWYgKHNhdmluZykKKyAgICB7CisJaW50CWJsb2NrWzY0XTsKKwlpbnQJcmVhc29uOworCWludAlkb25lX3NhdmUgPSBGQUxTRTsKKwljaGFyX3UJKnJldHZhbCA9IE5VTEw7CisJY2hhcl91ICAqc3BybmFtZTsKKwljaGFyX3UJKmZuYW1lOworCWludAlkcmFnZ2luZ19pY29uID0gRkFMU0U7CisJaW50CWZpbGV0eXBlOworCisJaWYgKCFkZmx0KQorCSAgICBkZmx0ID0gIlRleHRGaWxlIjsKKworCWJsb2NrWzBdID0gc2F2ZV93aW5kb3c7CisJYmxvY2tbMV0gPSAwOworCXN3aShXaW1wX0dldEljb25TdGF0ZSwgMCwgYmxvY2spOworCXNwcm5hbWUgPSAoKGNoYXJfdSAqKSBibG9ja1s3XSk7CisJYmxvY2tbMV0gPSAxOworCXN3aShXaW1wX0dldEljb25TdGF0ZSwgMCwgYmxvY2spOworCWZuYW1lID0gKChjaGFyICopIGJsb2NrWzddKTsKKwlzdHJuY3B5KGZuYW1lLCBkZmx0LCAyNTUpOworCisJaWYgKHhzd2koT1NfRlNDb250cm9sLCAzMSwgY3VyYnVmLT5iX3Bfb2Z0KSAmIHZfZmxhZykKKwl7CisJICAgIGZpbGV0eXBlID0gMHhmZmY7CisJICAgIHN0cmNweShzcHJuYW1lICsgNSwgInh4eCIpOworCX0KKwllbHNlCisJeworCSAgICBmaWxldHlwZSA9IHIyOworCSAgICBzcHJpbnRmKHNwcm5hbWUgKyA1LCAiJTAzeCIsIGZpbGV0eXBlKTsKKwl9CisKKwkvKiBPcGVuIHRoZSBzYXZlIGJveCAqLworCisJc3dpKFdpbXBfR2V0UG9pbnRlckluZm8sIDAsIGJsb2NrKTsKKwlzd2koV2ltcF9DcmVhdGVNZW51LCAwLCBzYXZlX3dpbmRvdywgYmxvY2tbMF0gLSA2NCwgYmxvY2tbMV0gKyA2NCk7CisJc3dpKFdpbXBfU2V0Q2FyZXRQb3NpdGlvbiwgc2F2ZV93aW5kb3csIDEsIDAsIDAsIC0xLCAtMSk7CisKKwl3aGlsZSAoIWRvbmVfc2F2ZSkKKwl7CisJICAgIHJlYXNvbiA9IHdpbXBfcG9sbCgxLCBibG9jayk7CisJICAgIHN3aXRjaCAocmVhc29uKQorCSAgICB7CisJCWNhc2UgMToKKwkJICAgIHJlZHJhd193aW5kb3coYmxvY2spOworCQkgICAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICAgIGlmIChibG9ja1swXSA9PSBzYXZlX3dpbmRvdykKKwkJCXN3aShXaW1wX09wZW5XaW5kb3csIDAsIGJsb2NrKTsKKwkJICAgIGVsc2UKKwkJCXJvX29wZW5fd2luZG93KGJsb2NrKTsKKwkJICAgIGJyZWFrOworCQljYXNlIDM6CisJCSAgICBkb25lX3NhdmUgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCWNhc2UgNjoKKwkJICAgIGlmIChibG9ja1szXSAhPSBzYXZlX3dpbmRvdykKKwkJCWRvbmVfc2F2ZSA9IFRSVUU7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpbnQgZHJhZ19ib3hbNF07CisJCQlpbnQgbWluX3gsIG1heF95OworCisJCQlzd2l0Y2ggKGJsb2NrWzRdKQorCQkJeworCQkJICAgIGNhc2UgICAgMDogLyogU3RhcnQgZHJhZyAqLworCQkJCWJsb2NrWzBdID0gc2F2ZV93aW5kb3c7CisJCQkJc3dpKFdpbXBfR2V0V2luZG93U3RhdGUsIDAsIGJsb2NrKTsKKwkJCQltaW5feCA9IGJsb2NrWzFdOworCQkJCW1heF95ID0gYmxvY2tbNF07CisJCQkJYmxvY2tbMV0gPSAwOworCQkJCXN3aShXaW1wX0dldEljb25TdGF0ZSwgMCwgYmxvY2spOworCQkJCWRyYWdfYm94WzBdID0gYmxvY2tbMl0gKyBtaW5feDsKKwkJCQlkcmFnX2JveFsxXSA9IGJsb2NrWzNdICsgbWF4X3k7CisJCQkJZHJhZ19ib3hbMl0gPSBibG9ja1s0XSArIG1pbl94OworCQkJCWRyYWdfYm94WzNdID0gYmxvY2tbNV0gKyBtYXhfeTsKKworCQkJCXN3aShEcmFnQVNwcml0ZV9TdGFydCwKKwkJCQkJMHg0NSwKKwkJCQkJMSwKKwkJCQkJc3BybmFtZSwKKwkJCQkJZHJhZ19ib3gpOworCQkJCWRyYWdnaW5nX2ljb24gPSBUUlVFOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgICAgMjogLyogT0sgKi8KKwkJCQlyZXR2YWwgPSB3aW1wX3N0cnNhdmUoZm5hbWUpOworCQkJCWRvbmVfc2F2ZSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAgICAzOiAvKiBDYW5jZWwgKi8KKwkJCQlkb25lX3NhdmUgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgNzoKKwkJICAgIGlmIChkcmFnZ2luZ19pY29uKQorCQkgICAgeworCQkJaW50IGxlbiA9IDA7CisKKwkJCWRyYWdnaW5nX2ljb24gPSBGQUxTRTsKKwkJCXN3aShXaW1wX0dldFBvaW50ZXJJbmZvLCAwLCBibG9jayk7CisJCQlibG9ja1s1XSA9IGJsb2NrWzNdOworCQkJYmxvY2tbNl0gPSBibG9ja1s0XTsKKwkJCWJsb2NrWzddID0gYmxvY2tbMF07CisJCQlibG9ja1s4XSA9IGJsb2NrWzFdOworCQkJYmxvY2tbOV0gPSAwOwkJLyogRG9uJ3Qga25vdyB0aGUgc2l6ZSAqLworCQkJYmxvY2tbMTBdID0gZmlsZXR5cGU7CisKKwkJCXdoaWxlIChmbmFtZVtsZW5dID4gMzEpCisJCQl7CisJCQkgICAgaWYgKGZuYW1lW2xlbl0gPT0gJy4nKQorCQkJICAgIHsKKwkJCQlmbmFtZSArPSBsZW4gKyAxOworCQkJCWxlbiA9IDA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCQlsZW4rKzsKKwkJCX0KKwkJCWlmIChsZW4gPiAyMTEpCisJCQkgICAgbGVuID0gMjExOworCisJCQltZW1jcHkoKChjaGFyX3UgKikgYmxvY2spICsgNDQsIGZuYW1lLCBsZW4pOworCQkJKChjaGFyX3UgKilibG9jaylbNDQgKyBsZW5dID0gJ1wwJzsKKworCQkJYmxvY2tbMF0gPSAobGVuICsgNDgpICYgMHhmYzsKKwkJCWJsb2NrWzNdID0gMDsKKwkJCWJsb2NrWzRdID0gMTsJICAgIC8qIERhdGFTYXZlICovCisKKwkJCXN3aShXaW1wX1NlbmRNZXNzYWdlLCAxNywgYmxvY2ssIGJsb2NrWzVdLCBibG9ja1s2XSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlyb19kcmFnX2ZpbmlzaGVkKGJsb2NrKTsKKwkJICAgIGJyZWFrOworCQljYXNlIDg6CisJCSAgICBpZiAoYmxvY2tbNl0gPT0gMTMpCisJCSAgICB7CisJCQlyZXR2YWwgPSB3aW1wX3N0cnNhdmUoZm5hbWUpOworCQkJZG9uZV9zYXZlID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGJsb2NrWzZdID09IDB4MWIpCisJCQlkb25lX3NhdmUgPSBUUlVFOworCQkgICAgZWxzZQorCQkJc3dpKFdpbXBfUHJvY2Vzc0tleSwgYmxvY2tbNl0pOworCQkgICAgYnJlYWs7CisJCWNhc2UgMTc6CisJCWNhc2UgMTg6CisJCSAgICBpZiAoYmxvY2tbNF0gPT0gMiAmJiBibG9ja1s5XSAhPSAtMSkKKwkJICAgIHsKKwkJCS8qIERhdGFTYXZlQWNrIGZyb20gZHJhZ2dpbmcgaWNvbi4gKi8KKwkJCXJldHZhbCA9IHdpbXBfc3Ryc2F2ZSgoKGNoYXJfdSAqKSBibG9jaykgKyA0NCk7CisJCQlkb25lX3NhdmUgPSBUUlVFOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAoYmxvY2tbNF0gPT0gMHg0MDBjOSkKKwkJICAgIHsKKwkJCS8qIE1lbnVzRGVsZXRlZCAqLworCQkJZG9uZV9zYXZlID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCXJvX21lc3NhZ2UoYmxvY2spOworCQkgICAgYnJlYWs7CisJICAgIH0KKwl9CisJYmxvY2tbMF0gPSBzYXZlX3dpbmRvdzsKKwlzd2koV2ltcF9DbG9zZVdpbmRvdywgMCwgYmxvY2spOworCXN3aShXaW1wX0dldENhcmV0UG9zaXRpb24sIDAsIGJsb2NrKTsKKwlpZiAoYmxvY2tbMF0gPT0gLTEpCisJICAgIHN3aShXaW1wX1NldENhcmV0UG9zaXRpb24sIGd1aS53aW5kb3dfaGFuZGxlLCAtMSwgMCwgMCwgLTEsIC0xKTsKKworCXJldHVybiByZXR2YWw7CisgICAgfQorICAgIGVsc2UgaWYgKGluaXRkaXIpCisgICAgeworCS8qIE9wZW4gYSBkaXJlY3Rvcnkgdmlld2VyICovCisJbGVuZ3RoID0gc3RybGVuKGluaXRkaXIpOworCisJaWYgKGxlbmd0aCA+IDI0MCkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIFBhdGggdG9vIGxvbmchICovCisKKwlsZW5ndGggPSBzcHJpbnRmKGNvbW1hbmQsICJGaWxlcl9PcGVuRGlyICVzIiwgaW5pdGRpcik7CisJd2hpbGUgKGNvbW1hbmRbbGVuZ3RoIC0gMV0gPT0gJy4nKQorCSAgICBsZW5ndGgtLTsKKwljb21tYW5kW2xlbmd0aF0gPSAnXDAnOworCXN3aShPU19DTEksIGNvbW1hbmQpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2d1aV9yaXNjb3MuaCBiL3NyYy9ndWlfcmlzY29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMmU2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfcmlzY29zLmgKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworI2RlZmluZSBGRUFUX0JST1dTRQorCisjZGVmaW5lIFRBU0sgMHg0YjUzNDE1NAorCisvKiBOZXN0ZWQgd2ltcCBmbGFnczogKi8KKyNkZWZpbmUgQ0hJTERfRklYX1RPX1dPUktBUkVBCTAKKyNkZWZpbmUgQ0hJTERfRklYX1RPX0xFRlQJMQorI2RlZmluZSBDSElMRF9GSVhfVE9fQk9UVE9NCTEKKyNkZWZpbmUgQ0hJTERfRklYX1RPX1JJR0hUCTIKKyNkZWZpbmUgQ0hJTERfRklYX1RPX1RPUAkyCisKKyNkZWZpbmUgQ0hJTERfU0VMRl9TQ1JPTEwJMAorI2RlZmluZSBDSElMRF9QQVJFTlRfU0NST0xMCTEKKworI2RlZmluZSBDSElMRF9MRUZUCQkxNgorI2RlZmluZSBDSElMRF9CT1RUT00JCTE4CisjZGVmaW5lIENISUxEX1JJR0hUCQkyMAorI2RlZmluZSBDSElMRF9UT1AJCTIyCisjZGVmaW5lIENISUxEX1NDUk9MTF9YCQkyNAorI2RlZmluZSBDSElMRF9TQ1JPTExfWQkJMjYKKworaW50IHdpbXBfcG9sbChpbnQgbWFzaywgaW50ICpibG9jayk7CitpbnQgd2ltcF9wb2xsX2lkbGUoaW50IG1hc2ssIGludCAqYmxvY2ssIGludCBlbmRfdGltZSk7Cit2b2lkIHJvX29wZW5fbWFpbihpbnQgKmJsb2NrKTsKZGlmZiAtLWdpdCBhL3NyYy9ndWlfdzE2LmMgYi9zcmMvZ3VpX3cxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWE4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3VpX3cxNi5jCkBAIC0wLDAgKzEsMTUyNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCUdVSSBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogZ3VpX3cxNi5jCisgKgorICogR1VJIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIDMuMXgKKyAqCisgKiBHZW9yZ2UgVi4gUmVpbGx5IDxnZW9yZ2VAcmVpbGx5Lm9yZz4gd3JvdGUgdGhlIG9yaWdpbmFsIFdpbjMyIEdVSS4KKyAqIFJvYmVydCBXZWJiIHJld29ya2VkIGl0IHRvIHVzZSB0aGUgZXhpc3RpbmcgR1VJIHN0dWZmIGFuZCBhZGRlZCBtZW51LAorICogc2Nyb2xsYmFycywgZXRjLgorICoKKyAqIFZpbmNlIE5lZ3JpIHRoZW4gYnV0Y2hlcmVkIHRoZSBjb2RlIHRvIGdldCBpdCBjb21waWxpbmcgZm9yCisgKiAxNi1iaXQgd2luZG93cy4KKyAqCisgKi8KKworLyoKKyAqIEluY2x1ZGUgdGhlIGNvbW1vbiBzdHVmZiBmb3IgTVMtV2luZG93cyBHVUkuCisgKi8KKyNpbmNsdWRlICJndWlfdzQ4LmMiCisKKyNpbmNsdWRlICJndWl3MTZyYy5oIgorCisvKiBVbmRvY3VtZW50ZWQgV2luZG93cyBNZXNzYWdlIC0gbm90IGV2ZW4gZGVmaW5lZCBpbiBzb21lIFNESyBoZWFkZXJzICovCisjZGVmaW5lIFdNX0VYSVRTSVpFTU9WRQkJCTB4MDIzMgorCisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyMgZGVmaW5lIENNRF9UQl9CQVNFICg5OSkKKyMgaW5jbHVkZSA8dmltdGJhci5oPgorI2VuZGlmCisKKyNpZmRlZiBQUk9UTworIyBkZWZpbmUgV0lOQVBJCisjZW5kaWYKKworI2RlZmluZSBIQU5ETEVfV01fRFJPUEZJTEVTKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKEhEUk9QKSh3UGFyYW0pKSwgMEwpCisKKworLyogTG9jYWwgdmFyaWFibGVzOiAqLworCisjaWZkZWYgRkVBVF9NRU5VCitzdGF0aWMgVUlOVAlzX21lbnVfaWQgPSAxMDA7CisjZW5kaWYKKworCisjZGVmaW5lIFZJTV9OQU1FCSJ2aW0iCisjZGVmaW5lIFZJTV9DTEFTUwkiVmltIgorCisjZGVmaW5lIERMR19BTExPQ19TSVpFIDE2ICogMTAyNAorCisvKgorICogc3R1ZmYgZm9yIGRpYWxvZ3MsIG1lbnVzLCB0ZWFyb2ZmcyBldGMuCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyBCT09MIENBTExCQUNLIGRpYWxvZ19jYWxsYmFjayhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7CisKK3N0YXRpYyBMUFdPUkQKK2FkZF9kaWFsb2dfZWxlbWVudCgKKwlMUFdPUkQgcCwKKwlEV09SRCBsU3R5bGUsCisJV09SRCB4LAorCVdPUkQgeSwKKwlXT1JEIHcsCisJV09SRCBoLAorCVdPUkQgSWQsCisJQllURSBjbHNzLAorCWNvbnN0IGNoYXIgKmNhcHRpb24pOworCitzdGF0aWMgaW50IGRpYWxvZ19kZWZhdWx0X2J1dHRvbiA9IC0xOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9kaWFsb2dfZm9udF9tZXRyaWNzKHZvaWQpOworCisjaWZkZWYgRkVBVF9UT09MQkFSCitzdGF0aWMgdm9pZCBpbml0aWFsaXNlX3Rvb2xiYXIodm9pZCk7CisjZW5kaWYKKworCisjaWZkZWYgRkVBVF9NRU5VCisvKgorICogRmlndXJlIG91dCBob3cgaGlnaCB0aGUgbWVudSBiYXIgaXMgYXQgdGhlIG1vbWVudC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2d1aV9tc3dpbl9nZXRfbWVudV9oZWlnaHQoCisgICAgaW50CSAgICBmaXhfd2luZG93KQkgICAgLyogSWYgVFJVRSwgcmVzaXplIHdpbmRvdyBpZiBtZW51IGhlaWdodCBjaGFuZ2VkICovCit7CisgICAgc3RhdGljIGludAlvbGRfbWVudV9oZWlnaHQgPSAtMTsKKworICAgIGludAkgICAgbnVtOworICAgIGludAkgICAgbWVudV9oZWlnaHQ7CisKKyAgICBpZiAoZ3VpLm1lbnVfaXNfYWN0aXZlKQorCW51bSA9IEdldE1lbnVJdGVtQ291bnQoc19tZW51QmFyKTsKKyAgICBlbHNlCisJbnVtID0gMDsKKworICAgIGlmIChudW0gPT0gMCkKKwltZW51X2hlaWdodCA9IDA7CisgICAgZWxzZSBpZiAoZ3VpLnN0YXJ0aW5nKQorCW1lbnVfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlUpOworICAgIGVsc2UKKyAgICB7CisJUkVDVCByMSwgcjI7CisJaW50IGZyYW1laHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpOworCWludCBjYXBodCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKTsKKworCS8qCWdldCB3aW5kb3cgcmVjdCBvZiBzX2h3bmQKKwkJICogZ2V0IGNsaWVudCByZWN0IG9mIHNfaHduZAorCQkgKiBnZXQgY2FwIGhlaWdodAorCQkgKiBzdWJ0cmFjdCBmcm9tIHdpbmRvdyByZWN0LCB0aGUgc3VtIG9mIGNsaWVudCBoZWlnaHQsCisJCSAqIChpZiBub3QgbWF4aW1pemVkKWZyYW1lIHRoaWNrbmVzcywgYW5kIGNhcHRpb24gaGVpZ2h0LgorCSAqLworCUdldFdpbmRvd1JlY3Qoc19od25kLCAmcjEpOworCUdldENsaWVudFJlY3Qoc19od25kLCAmcjIpOworCW1lbnVfaGVpZ2h0ID0gcjEuYm90dG9tIC0gcjEudG9wIC0gKHIyLmJvdHRvbS1yMi50b3AgKworCQkJICAgICAgIDIgKiBmcmFtZWh0ICogKCFJc1pvb21lZChzX2h3bmQpKSArIGNhcGh0KTsKKyAgICB9CisKKyAgICBpZiAoZml4X3dpbmRvdyAmJiBtZW51X2hlaWdodCAhPSBvbGRfbWVudV9oZWlnaHQpCisgICAgeworCW9sZF9tZW51X2hlaWdodCA9IG1lbnVfaGVpZ2h0OworCWd1aV9zZXRfc2hlbGxzaXplKEZBTFNFLCBGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIG1lbnVfaGVpZ2h0OworfQorI2VuZGlmIC8qRkVBVF9NRU5VKi8KKworCisvKgorICogRXZlbiB0aG91Z2ggd2UgaGF2ZSBfRHVyaW5nU2l6aW5nKCkgd2hpY2ggbWFrZXMgdGhlIHJ1YmJlciBiYW5kIGEgdmFsaWQKKyAqIHNpemUsIHdlIG5lZWQgdGhpcyBmb3Igd2hlbiB0aGUgdXNlciBtYXhpbWlzZXMgdGhlIHdpbmRvdy4KKyAqIFRPRE86IERvZXNuJ3Qgc2VlbSB0byBhZGp1c3QgdGhlIHdpZHRoIHRob3VnaCBmb3Igc29tZSByZWFzb24uCisgKi8KKyAgICBzdGF0aWMgQk9PTAorX09uV2luZG93UG9zQ2hhbmdpbmcoCisgICAgSFdORCBod25kLAorICAgIExQV0lORE9XUE9TIGxwd3BvcykKK3sKKworICAgIGlmICghSXNJY29uaWMoaHduZCkgJiYgIShscHdwb3MtPmZsYWdzICYgU1dQX05PU0laRSkpCisgICAgeworCWd1aV9tc3dpbl9nZXRfdmFsaWRfZGltZW5zaW9ucyhscHdwb3MtPmN4LCBscHdwb3MtPmN5LAorCQkJCSAgICAgJmxwd3Bvcy0+Y3gsICZscHdwb3MtPmN5KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLCitfV25kUHJvYygKKyAgICBIV05EIGh3bmQsCisgICAgVUlOVCB1TXNnLAorICAgIFdQQVJBTSB3UGFyYW0sCisgICAgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICAvKgorICAgIFRSQUNFKCJXbmRQcm9jOiBod25kID0gJTA4eCwgbXNnID0gJXgsIHdQYXJhbSA9ICV4LCBsUGFyYW0gPSAleFxuIiwKKwkgIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAqLworCisgICAgSGFuZGxlTW91c2VIaWRlKHVNc2csIGxQYXJhbSk7CisKKyAgICBzX3VNc2cgPSB1TXNnOworICAgIHNfd1BhcmFtID0gd1BhcmFtOworICAgIHNfbFBhcmFtID0gbFBhcmFtOworCisgICAgc3dpdGNoICh1TXNnKQorICAgIHsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0RFQURDSEFSLAlfT25EZWFkQ2hhcik7CisJSEFORExFX01TRyhod25kLCBXTV9TWVNERUFEQ0hBUiwgX09uRGVhZENoYXIpOworCS8qIEhBTkRMRV9NU0coaHduZCwgV01fQUNUSVZBVEUsICAgIF9PbkFjdGl2YXRlKTsgKi8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0NIQVIsCV9PbkNoYXIpOworCUhBTkRMRV9NU0coaHduZCwgV01fQ0xPU0UsCV9PbkNsb3NlKTsKKwkvKiBIQU5ETEVfTVNHKGh3bmQsIFdNX0NPTU1BTkQsCV9PbkNvbW1hbmQpOyAqLworCUhBTkRMRV9NU0coaHduZCwgV01fREVTVFJPWSwJX09uRGVzdHJveSk7CisJSEFORExFX01TRyhod25kLCBXTV9EUk9QRklMRVMsCV9PbkRyb3BGaWxlcyk7CisJSEFORExFX01TRyhod25kLCBXTV9IU0NST0xMLAlfT25TY3JvbGwpOworCUhBTkRMRV9NU0coaHduZCwgV01fS0lMTEZPQ1VTLAlfT25LaWxsRm9jdXMpOworI2lmZGVmIEZFQVRfTUVOVQorCUhBTkRMRV9NU0coaHduZCwgV01fQ09NTUFORCwJX09uTWVudSk7CisjZW5kaWYKKwkvKiBIQU5ETEVfTVNHKGh3bmQsIFdNX01PVkUsCSAgICBfT25Nb3ZlKTsgKi8KKwkvKiBIQU5ETEVfTVNHKGh3bmQsIFdNX05DQUNUSVZBVEUsICBfT25OQ0FjdGl2YXRlKTsgKi8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1NFVEZPQ1VTLAlfT25TZXRGb2N1cyk7CisJSEFORExFX01TRyhod25kLCBXTV9TSVpFLAlfT25TaXplKTsKKwkvKiBIQU5ETEVfTVNHKGh3bmQsIFdNX1NZU0NPTU1BTkQsICBfT25TeXNDb21tYW5kKTsgKi8KKwkvKiBIQU5ETEVfTVNHKGh3bmQsIFdNX1NZU0tFWURPV04sICBfT25BbHRLZXkpOyAqLworCUhBTkRMRV9NU0coaHduZCwgV01fVlNDUk9MTCwJX09uU2Nyb2xsKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HSU5HLAlfT25XaW5kb3dQb3NDaGFuZ2luZyk7CisJSEFORExFX01TRyhod25kLCBXTV9BQ1RJVkFURUFQUCwgX09uQWN0aXZhdGVBcHApOworCisgICAgY2FzZSBXTV9RVUVSWUVORFNFU1NJT046CS8qIFN5c3RlbSB3YW50cyB0byBnbyBkb3duLiAqLworCWd1aV9zaGVsbF9jbG9zZWQoKTsJLyogV2lsbCBleGl0IHdoZW4gbm8gY2hhbmdlZCBidWZmZXJzLiAqLworCXJldHVybiBGQUxTRTsJCS8qIERvIE5PVCBhbGxvdyBzeXN0ZW0gdG8gZ28gZG93bi4gKi8KKworICAgIGNhc2UgV01fRU5EU0VTU0lPTjoKKwlpZiAod1BhcmFtKQkvKiBzeXN0ZW0gb25seSByZWFsbHkgZ29lcyBkb3duIHdoZW4gd1BhcmFtIGlzIFRSVUUgKi8KKwkgICAgX09uRW5kU2Vzc2lvbigpOworCWJyZWFrOworCisgICAgY2FzZSBXTV9TWVNDSEFSOgorCS8qCisJICogaWYgJ3dpbmFsdGtleXMnIGlzICJubyIsIG9yIGl0J3MgIm1lbnUiIGFuZCBpdCdzIG5vdCBhIG1lbnUKKwkgKiBzaG9ydGN1dCBrZXksIGhhbmRsZSBsaWtlIGEgdHlwZWQgQUxUIGtleSwgb3RoZXJ3aXNlIGNhbGwgV2luZG93cworCSAqIEFMVCBrZXkgaGFuZGxpbmcuCisJICovCisjaWZkZWYgRkVBVF9NRU5VCisJaWYgKAkhZ3VpLm1lbnVfaXNfYWN0aXZlCisJCXx8IHBfd2FrWzBdID09ICduJworCQl8fCAocF93YWtbMF0gPT0gJ20nICYmICFndWlfaXNfbWVudV9zaG9ydGN1dCgoaW50KXdQYXJhbSkpCisJCSkKKyNlbmRpZgorCSAgICByZXR1cm4gSEFORExFX1dNX1NZU0NIQVIoKGh3bmQpLCAod1BhcmFtKSwgKGxQYXJhbSksIChfT25TeXNDaGFyKSk7CisjaWZkZWYgRkVBVF9NRU5VCisJZWxzZQorCSAgICByZXR1cm4gTXlXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyNlbmRpZgorCisgICAgY2FzZSBXTV9TWVNLRVlVUDoKKyNpZmRlZiBGRUFUX01FTlUKKwkvKiBPbmx5IHdoZW4gbWVudSBpcyBhY3RpdmUsIEFMVCBrZXkgaXMgdXNlZCBmb3IgdGhhdC4gKi8KKwlpZiAoZ3VpLm1lbnVfaXNfYWN0aXZlKQorCXsKKwkgICAgcmV0dXJuIE15V2luZG93UHJvYyhod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICByZXR1cm4gMDsKKworI2lmIGRlZmluZWQoTUVOVUhJTlRTKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkKKyAgICBjYXNlIFdNX01FTlVTRUxFQ1Q6CisJaWYgKCgoVUlOVCkgTE9XT1JEKGxQYXJhbSkKKwkJICAgICYgKDB4ZmZmZiBeIChNRl9NT1VTRVNFTEVDVCArIE1GX0JJVE1BUCArIE1GX1BPUFVQKSkpCisJCT09IE1GX0hJTElURQorCQkmJiAoU3RhdGUgJiBDTURMSU5FKSA9PSAwKQorCXsKKwkgICAgVUlOVCBpZEJ1dHRvbjsKKwkgICAgaW50CWlkeDsKKwkgICAgdmltbWVudV9UICpwTWVudTsKKworCSAgICBpZEJ1dHRvbiA9IChVSU5UKUxPV09SRCh3UGFyYW0pOworCSAgICBwTWVudSA9IGd1aV9tc3dpbl9maW5kX21lbnUocm9vdF9tZW51LCBpZEJ1dHRvbik7CisJICAgIGlmIChwTWVudSkKKwkgICAgeworCQlpZHggPSBNRU5VX0lOREVYX1RJUDsKKwkJbXNnX2Nscl9jbWRsaW5lKCk7CisJCWlmIChwTWVudS0+c3RyaW5nc1tpZHhdKQorCQkgICAgbXNnKHBNZW51LT5zdHJpbmdzW2lkeF0pOworCQllbHNlCisJCSAgICBtc2coIiIpOworCQlzZXRjdXJzb3IoKTsKKwkJb3V0X2ZsdXNoKCk7CisJICAgIH0KKwl9CisJYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFdNX05DSElUVEVTVDoKKwl7CisJICAgIExSRVNVTFQJcmVzdWx0OworCSAgICBpbnQgeCwgeTsKKwkgICAgaW50IHhQb3MgPSBHRVRfWF9MUEFSQU0obFBhcmFtKTsKKworCSAgICByZXN1bHQgPSBNeVdpbmRvd1Byb2MoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICBpZiAocmVzdWx0ID09IEhUQ0xJRU5UKQorCSAgICB7CisJCWd1aV9tY2hfZ2V0X3dpbnBvcygmeCwgJnkpOworCQl4UG9zIC09IHg7CisKKwkJaWYgKHhQb3MgPCA0OCkgLyo8Vk4+IFRPRE8gc2hvdWxkIHVzZSBzeXN0ZW0gbWV0cmljPyovCisJCSAgICByZXR1cm4gSFRCT1RUT01MRUZUOworCQllbHNlCisJCSAgICByZXR1cm4gSFRCT1RUT01SSUdIVDsKKwkJfQorCSAgICBlbHNlCisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIGJyZWFrOyAqLworICAgIGRlZmF1bHQ6CisjaWZkZWYgTVNXSU5fRklORF9SRVBMQUNFCisJaWYgKHVNc2cgPT0gc19maW5kcmVwX21zZyAmJiBzX2ZpbmRyZXBfbXNnICE9IDApCisJeworCSAgICBfT25GaW5kUmVwbCgpOworCX0KKyNlbmRpZgorCXJldHVybiBNeVdpbmRvd1Byb2MoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKKworLyoKKyAqIEVuZCBvZiBjYWxsLWJhY2sgcm91dGluZXMKKyAqLworCisKKy8qCisgKiBQYXJzZSB0aGUgR1VJIHJlbGF0ZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gIEFueSBhcmd1bWVudHMgdXNlZCBhcmUKKyAqIGRlbGV0ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgorICovCisgICAgdm9pZAorZ3VpX21jaF9wcmVwYXJlKGludCAqYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgLyogTm8gc3BlY2lhbCBhcmdzIGZvciB3aW4xNiBHVUkgYXQgdGhlIG1vbWVudC4gKi8KKworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgR1VJLglDcmVhdGUgYWxsIHRoZSB3aW5kb3dzLCBzZXQgdXAgYWxsIHRoZSBjYWxsLWJhY2tzCisgKiBldGMuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaW5pdCh2b2lkKQoreworICAgIGNvbnN0IGNoYXIgc3pWaW1XbmRDbGFzc1tdID0gVklNX0NMQVNTOworICAgIGNvbnN0IGNoYXIgc3pUZXh0QXJlYUNsYXNzW10gPSAiVmltVGV4dEFyZWEiOworICAgIFdORENMQVNTIHduZGNsYXNzOworCisjaWZkZWYgV0lOMTZfM0RMT09LCisgICAgQ3RsM2RSZWdpc3RlcihzX2hpbnN0KTsKKyAgICBDdGwzZEF1dG9TdWJjbGFzcyhzX2hpbnN0KTsKKyNlbmRpZgorCisgICAgLyogRGlzcGxheSBhbnkgcGVuZGluZyBlcnJvciBtZXNzYWdlcyAqLworICAgIGRpc3BsYXlfZXJyb3JzKCk7CisKKyAgICBndWkuc2Nyb2xsYmFyX3dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOworICAgIGd1aS5zY3JvbGxiYXJfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOworI2lmZGVmIEZFQVRfTUVOVQorICAgIGd1aS5tZW51X2hlaWdodCA9IDA7CS8qIFdpbmRvd3MgdGFrZXMgY2FyZSBvZiB0aGlzICovCisjZW5kaWYKKyAgICBndWkuYm9yZGVyX3dpZHRoID0gMDsKKworICAgIGd1aS5jdXJyQmdDb2xvciA9IElOVkFMQ09MT1I7CisKKyAgICBzX2JydXNoID0gQ3JlYXRlU29saWRCcnVzaChHZXRTeXNDb2xvcihDT0xPUl9CVE5GQUNFKSk7CisKKyAgICBpZiAoR2V0Q2xhc3NJbmZvKHNfaGluc3QsIHN6VmltV25kQ2xhc3MsICZ3bmRjbGFzcykgPT0gMCkgeworCXduZGNsYXNzLnN0eWxlID0gMDsKKwl3bmRjbGFzcy5scGZuV25kUHJvYyA9IF9XbmRQcm9jOworCXduZGNsYXNzLmNiQ2xzRXh0cmEgPSAwOworCXduZGNsYXNzLmNiV25kRXh0cmEgPSAwOworCXduZGNsYXNzLmhJbnN0YW5jZSA9IHNfaGluc3Q7CisJd25kY2xhc3MuaEljb24gPSBMb2FkSWNvbih3bmRjbGFzcy5oSW5zdGFuY2UsIE1BS0VJTlRSRVNPVVJDRShJRFJfVklNKSk7CisJd25kY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKKwl3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gc19icnVzaDsKKwl3bmRjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOworCXduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBzelZpbVduZENsYXNzOworCisgICAgaWYgKCgKKyNpZmRlZiBHTE9CQUxfSU1FCisJYXRvbSA9CisjZW5kaWYKKwkJUmVnaXN0ZXJDbGFzcygmd25kY2xhc3MpKSA9PSAwKQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICBzX2h3bmQgPSBDcmVhdGVXaW5kb3coCisJc3pWaW1XbmRDbGFzcywgIlZpbSBNU1dpbmRvd3MgR1VJIiwKKwlXU19PVkVSTEFQUEVEV0lORE9XLAorCWd1aV93aW5feCA9PSAtMSA/IENXX1VTRURFRkFVTFQgOiBndWlfd2luX3gsCisJZ3VpX3dpbl95ID09IC0xID8gQ1dfVVNFREVGQVVMVCA6IGd1aV93aW5feSwKKwkxMDAsCQkJCS8qIEFueSB2YWx1ZSB3aWxsIGRvICovCisJMTAwLAkJCQkvKiBBbnkgdmFsdWUgd2lsbCBkbyAqLworCU5VTEwsIE5VTEwsCisJc19oaW5zdCwgTlVMTCk7CisKKyAgICBpZiAoc19od25kID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyNpZmRlZiBHTE9CQUxfSU1FCisgICAgZ2xvYmFsX2ltZV9pbml0KGF0b20sIHNfaHduZCk7CisjZW5kaWYKKworICAgIC8qIENyZWF0ZSB0aGUgdGV4dCBhcmVhIHdpbmRvdyAqLworICAgIGlmIChHZXRDbGFzc0luZm8oc19oaW5zdCwgc3pUZXh0QXJlYUNsYXNzLCAmd25kY2xhc3MpID09IDApIHsKKwl3bmRjbGFzcy5zdHlsZSA9IENTX09XTkRDOworCXduZGNsYXNzLmxwZm5XbmRQcm9jID0gX1RleHRBcmVhV25kUHJvYzsKKwl3bmRjbGFzcy5jYkNsc0V4dHJhID0gMDsKKwl3bmRjbGFzcy5jYlduZEV4dHJhID0gMDsKKwl3bmRjbGFzcy5oSW5zdGFuY2UgPSBzX2hpbnN0OworCXduZGNsYXNzLmhJY29uID0gTlVMTDsKKwl3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOworCXduZGNsYXNzLmhickJhY2tncm91bmQgPSBOVUxMOworCXduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7CisJd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHN6VGV4dEFyZWFDbGFzczsKKworCWlmIChSZWdpc3RlckNsYXNzKCZ3bmRjbGFzcykgPT0gMCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHNfdGV4dEFyZWEgPSBDcmVhdGVXaW5kb3coCisJc3pUZXh0QXJlYUNsYXNzLCAiVmltIHRleHQgYXJlYSIsCisJV1NfQ0hJTEQgfCBXU19WSVNJQkxFLCAwLCAwLAorCTEwMCwJCQkJLyogQW55IHZhbHVlIHdpbGwgZG8gZm9yIG5vdyAqLworCTEwMCwJCQkJLyogQW55IHZhbHVlIHdpbGwgZG8gZm9yIG5vdyAqLworCXNfaHduZCwgTlVMTCwKKwlzX2hpbnN0LCBOVUxMKTsKKworICAgIGlmIChzX3RleHRBcmVhID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyNpZmRlZiBGRUFUX01FTlUKKyAgICBzX21lbnVCYXIgPSBDcmVhdGVNZW51KCk7CisjZW5kaWYKKyAgICBzX2hkYyA9IEdldERDKHNfdGV4dEFyZWEpOworCisjaWZkZWYgTVNXSU4xNl9GQVNUVEVYVAorICAgIFNldEJrTW9kZShzX2hkYywgT1BBUVVFKTsKKyNlbmRpZgorCisgICAgRHJhZ0FjY2VwdEZpbGVzKHNfaHduZCwgVFJVRSk7CisKKyAgICAvKiBEbyB3ZSBuZWVkIHRvIGJvdGhlciB3aXRoIHRoaXM/ICovCisgICAgLyogbV9mTW91c2VBdmFpbCA9IEdldFN5c3RlbU1ldHJpY3MoU01fTU9VU0VQUkVTRU5UKTsgKi8KKworICAgIC8qIEdldCBiYWNrZ3JvdW5kL2ZvcmVncm91bmQgY29sb3JzIGZyb20gdGhlIHN5c3RlbSAqLworICAgIGd1aV9tY2hfZGVmX2NvbG9ycygpOworCisgICAgLyogR2V0IHRoZSBjb2xvcnMgZnJvbSB0aGUgIk5vcm1hbCIgZ3JvdXAgKHNldCBpbiBzeW50YXguYyBvciBpbiBhIHZpbXJjCisgICAgICogZmlsZSkgKi8KKyAgICBzZXRfbm9ybWFsX2NvbG9ycygpOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGJhY2tncm91bmQgY29sb3IuCisgICAgICogVGhlbiBzdG9yZSB0aGUgY3VycmVudCB2YWx1ZXMgYXMgdGhlIGRlZmF1bHRzLgorICAgICAqLworICAgIGd1aV9jaGVja19jb2xvcnMoKTsKKyAgICBndWkuZGVmX25vcm1fcGl4ZWwgPSBndWkubm9ybV9waXhlbDsKKyAgICBndWkuZGVmX2JhY2tfcGl4ZWwgPSBndWkuYmFja19waXhlbDsKKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZvciB0aGUgaGlnaGxpZ2h0IGdyb3VwcyAoZ3VpX2NoZWNrX2NvbG9ycygpIG1pZ2h0IGhhdmUKKyAgICAgKiBjaGFuZ2VkIHRoZW0pICovCisgICAgaGlnaGxpZ2h0X2d1aV9zdGFydGVkKCk7CisKKyAgICAvKgorICAgICAqIFN0YXJ0IG91dCBieSBhZGRpbmcgdGhlIGNvbmZpZ3VyZWQgYm9yZGVyIHdpZHRoIGludG8gdGhlIGJvcmRlciBvZmZzZXQKKyAgICAgKi8KKyAgICBndWkuYm9yZGVyX29mZnNldCA9IGd1aS5ib3JkZXJfd2lkdGg7CisKKworICAgIC8qCisgICAgICogY29tcHV0ZSBhIGNvdXBsZSBvZiBtZXRyaWNzIHVzZWQgZm9yIHRoZSBkaWFsb2dzCisgICAgICovCisgICAgZ2V0X2RpYWxvZ19mb250X21ldHJpY3MoKTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgdG9vbGJhcgorICAgICAqLworICAgIGluaXRpYWxpc2VfdG9vbGJhcigpOworI2VuZGlmCisjaWZkZWYgTVNXSU5fRklORF9SRVBMQUNFCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBkaWFsb2cgYm94IHN0dWZmCisgICAgICovCisgICAgc19maW5kcmVwX21zZyA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShGSU5ETVNHU1RSSU5HKTsKKworICAgIC8qIEluaXRpYWxpc2UgdGhlIHN0cnVjdCAqLworICAgIHNfZmluZHJlcF9zdHJ1Y3QubFN0cnVjdFNpemUgPSBzaXplb2Yoc19maW5kcmVwX3N0cnVjdCk7CisgICAgc19maW5kcmVwX3N0cnVjdC5scHN0ckZpbmRXaGF0ID0gYWxsb2MoTVNXSU5fRlJfQlVGU0laRSk7CisgICAgc19maW5kcmVwX3N0cnVjdC5scHN0ckZpbmRXaGF0WzBdID0gTlVMOworICAgIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJSZXBsYWNlV2l0aCA9IGFsbG9jKE1TV0lOX0ZSX0JVRlNJWkUpOworICAgIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJSZXBsYWNlV2l0aFswXSA9IE5VTDsKKyAgICBzX2ZpbmRyZXBfc3RydWN0LndGaW5kV2hhdExlbiA9IE1TV0lOX0ZSX0JVRlNJWkU7CisgICAgc19maW5kcmVwX3N0cnVjdC53UmVwbGFjZVdpdGhMZW4gPSBNU1dJTl9GUl9CVUZTSVpFOworI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKworLyoKKyAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IHRvIHRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3NoZWxsc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpCit7CisgICAgUkVDVAl3b3JrYXJlYV9yZWN0OworICAgIGludAkJd2luX3dpZHRoLCB3aW5faGVpZ2h0OworICAgIGludAkJd2luX3hwb3MsIHdpbl95cG9zOworICAgIFdJTkRPV1BMQUNFTUVOVCB3bmRwbDsKKworICAgIC8qIHRyeSB0byBrZWVwIHdpbmRvdyBjb21wbGV0ZWx5IG9uIHNjcmVlbiAqLworICAgIC8qIGdldCBzaXplIG9mIHRoZSBzY3JlZW4gd29yayBhcmVhIC0gdXNlIFNNX0NZRlVMTFNDUkVFTgorICAgICAqIGluc3RlYWQgb2YgU01fQ1lTQ1JFRU4gc28gdGhhdCB3ZSBkb24ndCBvdmVybGFwIHRoZQorICAgICAqIHRhc2tiYXIgaWYgc29tZW9uZSBmaXJlcyB1cyB1cCBvbiBXaW45NS9OVCAqLworICAgIHdvcmthcmVhX3JlY3QubGVmdCA9IDA7CisgICAgd29ya2FyZWFfcmVjdC50b3AgPSAwOworICAgIHdvcmthcmVhX3JlY3QucmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKyAgICB3b3JrYXJlYV9yZWN0LmJvdHRvbSA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGVUxMU0NSRUVOKTsKKworICAgIC8qIGdldCBjdXJyZW50IHBvc2lzaW9uIG9mIG91ciB3aW5kb3cgKi8KKyAgICB3bmRwbC5sZW5ndGggPSBzaXplb2YoV0lORE9XUExBQ0VNRU5UKTsKKyAgICBHZXRXaW5kb3dQbGFjZW1lbnQoc19od25kLCAmd25kcGwpOworICAgIGlmICh3bmRwbC5zaG93Q21kID09IFNXX1NIT1dOT1JNQUwpCisgICAgeworCXdpbl94cG9zID0gd25kcGwucmNOb3JtYWxQb3NpdGlvbi5sZWZ0OworCXdpbl95cG9zID0gd25kcGwucmNOb3JtYWxQb3NpdGlvbi50b3A7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJd2luX3hwb3MgPSB3b3JrYXJlYV9yZWN0LmxlZnQ7CisJd2luX3lwb3MgPSB3b3JrYXJlYV9yZWN0LnRvcDsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBvdXRzaWRlIG9mIHRoZSB3aW5kb3cgKi8KKyAgICB3aW5fd2lkdGggPSB3aWR0aCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hGUkFNRSkgKiAyOworICAgIHdpbl9oZWlnaHQgPSBoZWlnaHQgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpICogMgorCQkJKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikKKyNpZmRlZiBGRUFUX01FTlUKKwkJCSsgZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChGQUxTRSkKKyNlbmRpZgorCQkJOworCisgICAgLyogaWYgdGhlIHdpbmRvdyBpcyBnb2luZyBvZmYgdGhlIHNjcmVlbiwgbW92ZSBpdCBvbiB0byB0aGUgc2NyZWVuICovCisgICAgaWYgKHdpbl94cG9zICsgd2luX3dpZHRoID4gd29ya2FyZWFfcmVjdC5yaWdodCkKKwl3aW5feHBvcyA9IHdvcmthcmVhX3JlY3QucmlnaHQgLSB3aW5fd2lkdGg7CisKKyAgICBpZiAod2luX3hwb3MgPCB3b3JrYXJlYV9yZWN0LmxlZnQpCisJd2luX3hwb3MgPSB3b3JrYXJlYV9yZWN0LmxlZnQ7CisKKyAgICBpZiAod2luX3lwb3MgKyB3aW5faGVpZ2h0ID4gd29ya2FyZWFfcmVjdC5ib3R0b20pCisJd2luX3lwb3MgPSB3b3JrYXJlYV9yZWN0LmJvdHRvbSAtIHdpbl9oZWlnaHQ7CisKKyAgICBpZiAod2luX3lwb3MgPCB3b3JrYXJlYV9yZWN0LnRvcCkKKwl3aW5feXBvcyA9IHdvcmthcmVhX3JlY3QudG9wOworCisgICAgLyogc2V0IHdpbmRvdyBwb3NpdGlvbiAqLworICAgIFNldFdpbmRvd1BvcyhzX2h3bmQsIE5VTEwsIHdpbl94cG9zLCB3aW5feXBvcywgd2luX3dpZHRoLCB3aW5faGVpZ2h0LAorCQkgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUpOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgLyogTWVudSBtYXkgd3JhcCBkaWZmZXJlbnRseSBub3cgKi8KKyAgICBndWlfbXN3aW5fZ2V0X21lbnVfaGVpZ2h0KCFndWkuc3RhcnRpbmcpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoCisgICAgc2Nyb2xsYmFyX1QgICAgICpzYiwKKyAgICBsb25nCSAgICB2YWwsCisgICAgbG9uZwkgICAgc2l6ZSwKKyAgICBsb25nCSAgICBtYXgpCit7CisgICAgc2ItPnNjcm9sbF9zaGlmdCA9IDA7CisgICAgd2hpbGUgKG1heCA+IDMyNzY3KQorICAgIHsKKwltYXggPSAobWF4ICsgMSkgPj4gMTsKKwl2YWwgID4+PSAxOworCXNpemUgPj49IDE7CisJKytzYi0+c2Nyb2xsX3NoaWZ0OworICAgIH0KKworICAgIGlmIChzYi0+c2Nyb2xsX3NoaWZ0ID4gMCkKKwkrK3NpemU7CisKKyAgICBTZXRTY3JvbGxSYW5nZShzYi0+aWQsIFNCX0NUTCwgMCwgKGludCkgbWF4LCBGQUxTRSk7CisgICAgU2V0U2Nyb2xsUG9zKHNiLT5pZCwgU0JfQ1RMLCAoaW50KSB2YWwsIFRSVUUpOworfQorCisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb250LgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9udChHdWlGb250IGZvbnQpCit7CisgICAgZ3VpLmN1cnJGb250ID0gZm9udDsKKyAgICBTZWxlY3RGb250KHNfaGRjLCBndWkuY3VyckZvbnQpOworfQorCisKKworCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9yZWdyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZnX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgZ3VpLmN1cnJGZ0NvbG9yID0gY29sb3I7CisgICAgU2V0VGV4dENvbG9yKHNfaGRjLCBndWkuY3VyckZnQ29sb3IpOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgYmFja2dyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgaWYgKGd1aS5jdXJyQmdDb2xvciA9PSBjb2xvcikKKwlyZXR1cm47CisKKyAgICBndWkuY3VyckJnQ29sb3IgPSBjb2xvcjsKKyAgICBTZXRCa0NvbG9yKHNfaGRjLCBndWkuY3VyckJnQ29sb3IpOworfQorCisKKworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19zdHJpbmcoCisgICAgaW50CQlyb3csCisgICAgaW50CQljb2wsCisgICAgY2hhcl91CSp0ZXh0LAorICAgIGludAkJbGVuLAorICAgIGludAkJZmxhZ3MpCit7CisjaWZuZGVmIE1TV0lOMTZfRkFTVFRFWFQKKyAgICBzdGF0aWMgaW50CSpwYWRkaW5nID0gTlVMTDsKKyAgICBzdGF0aWMgaW50CXBhZF9zaXplID0gMDsKKyAgICBpbnQJCWk7CisjZW5kaWYKKyAgICBIUEVOCWhwZW4sIG9sZF9wZW47CisgICAgaW50CQl5OworCisjaWZuZGVmIE1TV0lOMTZfRkFTVFRFWFQKKyAgICAvKgorICAgICAqIEl0YWxpYyBhbmQgYm9sZCB0ZXh0IHNlZW1zIHRvIGhhdmUgYW4gZXh0cmEgcm93IG9mIHBpeGVscyBhdCB0aGUgYm90dG9tCisgICAgICogKGJlbG93IHdoZXJlIHRoZSBib3R0b20gb2YgdGhlIGNoYXJhY3RlciBzaG91bGQgYmUpLiAgSWYgd2UgZHJhdyB0aGUKKyAgICAgKiBjaGFyYWN0ZXJzIHdpdGggYSBzb2xpZCBiYWNrZ3JvdW5kLCB0aGUgdG9wIHJvdyBvZiBwaXhlbHMgaW4gdGhlCisgICAgICogY2hhcmFjdGVyIGJlbG93IHdpbGwgYmUgb3ZlcndyaXR0ZW4uICBXZSBjYW4gZml4IHRoaXMgYnkgZmlsbGluZyBpbiB0aGUKKyAgICAgKiBiYWNrZ3JvdW5kIG91cnNlbHZlcywgdG8gdGhlIGNvcnJlY3QgY2hhcmFjdGVyIHByb3BvcnRpb25zLCBhbmQgdGhlbgorICAgICAqIHdyaXRpbmcgdGhlIGNoYXJhY3RlciBpbiB0cmFuc3BhcmVudCBtb2RlLiAgU3RpbGwgaGF2ZSBhIHByb2JsZW0gd2hlbgorICAgICAqIHRoZSBjaGFyYWN0ZXIgaXMgIl8iLCB3aGljaCBnZXRzIHdyaXR0ZW4gb24gdG8gdGhlIGNoYXJhY3RlciBiZWxvdy4KKyAgICAgKiBOZXcgZml4OiBzZXQgZ3VpLmNoYXJfYXNjZW50IHRvIC0xLiAgVGhpcyBzaGlmdHMgYWxsIGNoYXJhY3RlcnMgdXAgb25lCisgICAgICogcGl4ZWwgaW4gdGhlaXIgc2xvdHMsIHdoaWNoIGZpeGVzIHRoZSBwcm9ibGVtIHdpdGggdGhlIGJvdHRvbSByb3cgb2YKKyAgICAgKiBwaXhlbHMuCVdlIHN0aWxsIG5lZWQgdGhpcyBjb2RlIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSB0b3Agcm93IG9mIHBpeGVscworICAgICAqIGJlY29tZXMgYSBwcm9ibGVtLiAtIHdlYmIuCisgICAgICovCisgICAgSEJSVVNICWhicjsKKyAgICBSRUNUCXJjOworCisgICAgaWYgKCEoZmxhZ3MgJiBEUkFXX1RSQU5TUCkpCisgICAgeworCS8qCisJICogQ2xlYXIgYmFja2dyb3VuZCBmaXJzdC4KKwkgKiBOb3RlOiBGaWxsUmVjdCgpIGV4Y2x1ZGVzIHJpZ2h0IGFuZCBib3R0b20gb2YgcmVjdGFuZ2xlLgorCSAqLworCXJjLmxlZnQgPSBGSUxMX1goY29sKTsKKwlyYy50b3AgPSBGSUxMX1kocm93KTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGludCBjZWxsX2xlbiA9IDA7CisKKwkgICAgLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIGluIGRpc3BsYXkgY2VsbHMuICovCisJICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4gKz0gTUJfQllURTJMRU4odGV4dFtuXSkpCisJCWNlbGxfbGVuICs9ICgqbWJfcHRyMmNlbGxzKSh0ZXh0ICsgbik7CisJICAgIHJjLnJpZ2h0ID0gRklMTF9YKGNvbCArIGNlbGxfbGVuKTsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIHJjLnJpZ2h0ID0gRklMTF9YKGNvbCArIGxlbik7CisJcmMuYm90dG9tID0gRklMTF9ZKHJvdyArIDEpOworCWhiciA9IENyZWF0ZVNvbGlkQnJ1c2goZ3VpLmN1cnJCZ0NvbG9yKTsKKwlGaWxsUmVjdChzX2hkYywgJnJjLCBoYnIpOworCURlbGV0ZUJydXNoKGhicik7CisKKwlTZXRCa01vZGUoc19oZGMsIFRSQU5TUEFSRU5UKTsKKworCS8qCisJICogV2hlbiBkcmF3aW5nIGJsb2NrIGN1cnNvciwgcHJldmVudCBpbnZlcnRlZCBjaGFyYWN0ZXIgc3BpbGxpbmcKKwkgKiBvdmVyIGNoYXJhY3RlciBjZWxsIChjYW4gaGFwcGVuIHdpdGggYm9sZC9pdGFsaWMpCisJICovCisJaWYgKGZsYWdzICYgRFJBV19DVVJTT1IpCisJeworCSAgICBwY2xpcHJlY3QgPSAmcmM7CisJICAgIGZvcHRpb25zID0gRVRPX0NMSVBQRUQ7CisJfQorICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBBbHRlcm5hdGl2ZTogd3JpdGUgdGhlIGNoYXJhY3RlcnMgaW4gb3BhcXVlIG1vZGUsIHNpbmNlIHdlIGhhdmUgYmxvY2tlZAorICAgICAqIGJvbGQgb3IgaXRhbGljIGZvbnRzLgorICAgICAqLworICAgIC8qIFRoZSBPUEFRVUUgbW9kZSBhbmQgYmFja2NvbG91ciBoYXZlIGFscmVhZHkgYmVlbiBzZXQgKi8KKyNlbmRpZgorICAgIC8qIFRoZSBmb3JlY29sb3IgYW5kIGZvbnQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0ICovCisKKyNpZm5kZWYgTVNXSU4xNl9GQVNUVEVYVAorCisgICAgaWYgKHBhZF9zaXplICE9IENvbHVtbnMgfHwgcGFkZGluZyA9PSBOVUxMIHx8IHBhZGRpbmdbMF0gIT0gZ3VpLmNoYXJfd2lkdGgpCisgICAgeworCXZpbV9mcmVlKHBhZGRpbmcpOworCXBhZF9zaXplID0gQ29sdW1uczsKKworCXBhZGRpbmcgPSAoaW50ICopYWxsb2MocGFkX3NpemUgKiBzaXplb2YoaW50KSk7CisJaWYgKHBhZGRpbmcgIT0gTlVMTCkKKwkgICAgZm9yIChpID0gMDsgaSA8IHBhZF9zaXplOyBpKyspCisJCXBhZGRpbmdbaV0gPSBndWkuY2hhcl93aWR0aDsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2UgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWRkaW5nIGFyZ3VtZW50IGJlY2F1c2UgaXRhbGljIGFuZCBib2xkIHZlcnNpb25zCisgICAgICogb2YgZml4ZWQtd2lkdGggZm9udHMgYXJlIG9mdGVuIG9uZSBwaXhlbCBvciBzbyB3aWRlciB0aGFuIHRoZWlyIG5vcm1hbAorICAgICAqIHZlcnNpb25zLgorICAgICAqIE5vIGNoZWNrIGZvciBEUkFXX0JPTEQsIFdpbmRvd3Mgd2lsbCBoYXZlIGRvbmUgaXQgYWxyZWFkeS4KKyAgICAgKi8KKyNpZm5kZWYgTVNXSU4xNl9GQVNUVEVYVAorICAgIEV4dFRleHRPdXQoc19oZGMsIFRFWFRfWChjb2wpLCBURVhUX1kocm93KSwgMCwgTlVMTCwKKwkJCQkJCSAgICAgKGNoYXIgKil0ZXh0LCBsZW4sIHBhZGRpbmcpOworI2Vsc2UKKyAgICBUZXh0T3V0KHNfaGRjLCBURVhUX1goY29sKSwgVEVYVF9ZKHJvdyksIChjaGFyICopdGV4dCwgbGVuKTsKKyNlbmRpZgorCisgICAgaWYgKGZsYWdzICYgRFJBV19VTkRFUkwpCisgICAgeworCWhwZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIGd1aS5jdXJyRmdDb2xvcik7CisJb2xkX3BlbiA9IFNlbGVjdE9iamVjdChzX2hkYywgaHBlbik7CisJLyogV2hlbiBwX2xpbmVzcGFjZSBpcyAwLCBvdmVyd3JpdGUgdGhlIGJvdHRvbSByb3cgb2YgcGl4ZWxzLgorCSAqIE90aGVyd2lzZSBwdXQgdGhlIGxpbmUganVzdCBiZWxvdyB0aGUgY2hhcmFjdGVyLiAqLworCXkgPSBGSUxMX1kocm93ICsgMSkgLSAxOworI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisJaWYgKHBfbGluZXNwYWNlID4gMSkKKwkgICAgeSAtPSBwX2xpbmVzcGFjZSAtIDE7CisjZW5kaWYKKwlNb3ZlVG9FeChzX2hkYywgRklMTF9YKGNvbCksIHksIE5VTEwpOworCS8qIE5vdGU6IExpbmVUbygpIGV4Y2x1ZGVzIHRoZSBsYXN0IHBpeGVsIGluIHRoZSBsaW5lLiAqLworCUxpbmVUbyhzX2hkYywgRklMTF9YKGNvbCArIGxlbiksIHkpOworCURlbGV0ZU9iamVjdChTZWxlY3RPYmplY3Qoc19oZGMsIG9sZF9wZW4pKTsKKyAgICB9Cit9CisKKworLyoKKyAqIE91dHB1dCByb3V0aW5lcy4KKyAqLworCisvKiBGbHVzaCBhbnkgb3V0cHV0IHRvIHRoZSBzY3JlZW4gKi8KKyAgICB2b2lkCitndWlfbWNoX2ZsdXNoKHZvaWQpCit7CisgICAgLyogSXMgYW55dGhpbmcgbmVlZGVkIGhlcmU/ICovCit9CisKKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfcmVjdChSRUNUICpyY3ApCit7CisgICAgLyogVXNlIHRyaWNrIGZvciBmYXN0IHJlY3QgY2xlYXIgKi8KKyAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CisgICAgRXh0VGV4dE91dChzX2hkYywgMCwgMCwgRVRPX0NMSVBQRUQgfCBFVE9fT1BBUVVFLCByY3AsIE5VTEwsIDAsIE5VTEwpOworfQorCisKKworCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQWRkIGEgc3ViIG1lbnUgdG8gdGhlIG1lbnUgYmFyLgorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudSgKKyAgICB2aW1tZW51X1QJKm1lbnUsCisgICAgaW50CQlwb3MpCit7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisKKyAgICBtZW51LT5zdWJtZW51X2lkID0gQ3JlYXRlUG9wdXBNZW51KCk7CisgICAgbWVudS0+aWQgPSBzX21lbnVfaWQrKzsKKworICAgIGlmIChtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisgICAgeworCUluc2VydE1lbnUoKHBhcmVudCA9PSBOVUxMKSA/IHNfbWVudUJhciA6IHBhcmVudC0+c3VibWVudV9pZCwKKwkJKFVJTlQpcG9zLCBNRl9QT1BVUCB8IE1GX1NUUklORyB8IE1GX0JZUE9TSVRJT04sCisJCShVSU5UKW1lbnUtPnN1Ym1lbnVfaWQsICBtZW51LT5uYW1lKTsKKyAgICB9CisKKyAgICAvKiBGaXggd2luZG93IHNpemUgaWYgbWVudSBtYXkgaGF2ZSB3cmFwcGVkICovCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorCWd1aV9tc3dpbl9nZXRfbWVudV9oZWlnaHQoIWd1aS5zdGFydGluZyk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3Nob3dfcG9wdXBtZW51KHZpbW1lbnVfVCAqbWVudSkKK3sKKyAgICBQT0lOVCBtcDsKKworICAgICh2b2lkKUdldEN1cnNvclBvcygoTFBQT0lOVCkmbXApOworICAgIGd1aV9tY2hfc2hvd19wb3B1cG1lbnVfYXQobWVudSwgKGludCltcC54LCAoaW50KW1wLnkpOworfQorCisgICAgdm9pZAorZ3VpX21ha2VfcG9wdXAoY2hhcl91ICpwYXRoX25hbWUpCit7CisgICAgdmltbWVudV9UCSptZW51ID0gZ3VpX2ZpbmRfbWVudShwYXRoX25hbWUpOworCisgICAgaWYgKG1lbnUgIT0gTlVMTCkKKyAgICB7CisJLyogRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgY3Vyc29yICovCisJRFdPUkQJdGVtcF9wOworCVBPSU5UCXA7CisJdGVtcF9wID0gR2V0RENPcmcoc19oZGMpOworCXAueCA9IExPV09SRCh0ZW1wX3ApOworCXAueSA9IEhJV09SRCh0ZW1wX3ApOworCWlmIChjdXJ3aW4hPU5VTEwpCisJeworCSAgICBwLngrPSBURVhUX1goV19XSU5DT0woY3Vyd2luKSArIGN1cndpbi0+d193Y29sICsxKTsKKwkgICAgcC55Kz0gVEVYVF9ZKFdfV0lOUk9XKGN1cndpbikgKyBjdXJ3aW4tPndfd3JvdyArMSk7CisJfQorCW1zZ19zY3JvbGwgPSBGQUxTRTsKKwlndWlfbWNoX3Nob3dfcG9wdXBtZW51X2F0KG1lbnUsIChpbnQpcC54LCAoaW50KXAueSk7CisgICAgfQorfQorCisvKgorICogQWRkIGEgbWVudSBpdGVtIHRvIGEgbWVudQorICovCisgICAgdm9pZAorZ3VpX21jaF9hZGRfbWVudV9pdGVtKAorICAgIHZpbW1lbnVfVAkqbWVudSwKKyAgICBpbnQJCWlkeCkKK3sKKyAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKKworICAgIG1lbnUtPmlkID0gc19tZW51X2lkKys7CisgICAgbWVudS0+c3VibWVudV9pZCA9IE5VTEw7CisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICBpZiAobWVudV9pc190b29sYmFyKHBhcmVudC0+bmFtZSkpCisgICAgeworCVRCQlVUVE9OIG5ld3RiOworCisJdmltX21lbXNldCgmbmV3dGIsIDAsIHNpemVvZihuZXd0YikpOworCWlmIChtZW51X2lzX3NlcGFyYXRvcihtZW51LT5uYW1lKSkKKwl7CisJICAgIG5ld3RiLmlCaXRtYXAgPSAwOworCSAgICBuZXd0Yi5mc1N0eWxlID0gVEJTVFlMRV9TRVA7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChtZW51LT5pY29uaWR4ID49IFRPT0xCQVJfQklUTUFQX0NPVU5UKQorCQluZXd0Yi5pQml0bWFwID0gLTE7CisJICAgIGVsc2UKKwkJbmV3dGIuaUJpdG1hcCA9IG1lbnUtPmljb25pZHg7CisJICAgIG5ld3RiLmZzU3R5bGUgPSBUQlNUWUxFX0JVVFRPTjsKKwl9CisJbmV3dGIuaWRDb21tYW5kID0gbWVudS0+aWQ7CisJbmV3dGIuZnNTdGF0ZSA9IFRCU1RBVEVfRU5BQkxFRDsKKwlTZW5kTWVzc2FnZShzX3Rvb2xiYXJod25kLCBUQl9JTlNFUlRCVVRUT04sIChXUEFSQU0paWR4LAorCQkJCQkJCSAgICAgKExQQVJBTSkmbmV3dGIpOworCW1lbnUtPnN1Ym1lbnVfaWQgPSAoSE1FTlUpLTE7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlJbnNlcnRNZW51KHBhcmVudC0+c3VibWVudV9pZCwgKFVJTlQpaWR4LAorCQkobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkgPyBNRl9TRVBBUkFUT1IgOiBNRl9TVFJJTkcpCisJCQkJCQkJICAgICAgfCBNRl9CWVBPU0lUSU9OLAorCQkoVUlOVCltZW51LT5pZCwgbWVudS0+bmFtZSk7CisgICAgfQorfQorCisvKgorICogRGVzdHJveSB0aGUgbWFjaGluZSBzcGVjaWZpYyBtZW51IHdpZGdldC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVzdHJveV9tZW51KHZpbW1lbnVfVCAqbWVudSkKK3sKKyAgICBVSU5UIGksIGo7CisgICAgY2hhciBwYW50c1s4MF07IC8qPFZOPiBoYWNrKi8KKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICAvKgorICAgICAqIGlzIHRoaXMgYSB0b29sYmFyIGJ1dHRvbj8KKyAgICAgKi8KKyAgICBpZiAobWVudS0+c3VibWVudV9pZCA9PSAoSE1FTlUpLTEpCisgICAgeworCWludCBpQnV0dG9uOworCisJaUJ1dHRvbiA9IFNlbmRNZXNzYWdlKHNfdG9vbGJhcmh3bmQsIFRCX0NPTU1BTkRUT0lOREVYLCAoV1BBUkFNKW1lbnUtPmlkLCAwKTsKKwlTZW5kTWVzc2FnZShzX3Rvb2xiYXJod25kLCBUQl9ERUxFVEVCVVRUT04sIChXUEFSQU0paUJ1dHRvbiwgMCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIG5lZ3JpOiBob3JyaWJsZSBBUEkgYnVnIHdoZW4gcnVubmluZyAxNi1iaXQgcHJvZ3JhbXMgdW5kZXIgV2luOXggb3IKKwkgKiBOVCBtZWFucyB0aGF0IHdlIGNhbid0IHVzZSBNRl9CWUNPTU1BTkQgZm9yIG1lbnUgaXRlbXMgd2hpY2ggaGF2ZQorCSAqIHN1Ym1lbnVzLCBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBoZWFkaW5ncy4gV2UgaGF2ZSB0byBmaW5kIHRoZSBtZW51CisJICogaXRlbSBhbmQgdXNlIE1GX0JZUE9TSVRJT04gaW5zdGVhZC4gOi1wCisJICovCisgICAgaWYgKG1lbnUtPnBhcmVudCAhPSBOVUxMCisJICAgICYmIG1lbnVfaXNfcG9wdXAobWVudS0+cGFyZW50LT5kbmFtZSkKKwkgICAgJiYgbWVudS0+cGFyZW50LT5zdWJtZW51X2lkICE9IE5VTEwpCisJUmVtb3ZlTWVudShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaWQsIG1lbnUtPmlkLCBNRl9CWUNPTU1BTkQpOworICAgIGVsc2UgaWYgKG1lbnUtPnN1Ym1lbnVfaWQgPT0gTlVMTCkKKwlSZW1vdmVNZW51KHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCk7CisgICAgZWxzZSBpZiAobWVudS0+cGFyZW50ICE9IE5VTEwpCisgICAgeworCWkgPSBHZXRNZW51SXRlbUNvdW50KG1lbnUtPnBhcmVudC0+c3VibWVudV9pZCk7CisJZm9yIChqID0gMDsgaiA8IGk7ICsraikKKwl7CisJICAgIEdldE1lbnVTdHJpbmcobWVudS0+cGFyZW50LT5zdWJtZW51X2lkLCBqLAorCQkgICAgcGFudHMsIDgwLCBNRl9CWVBPU0lUSU9OKTsKKwkgICAgaWYgKHN0cmNtcChwYW50cywgbWVudS0+bmFtZSkgPT0gMCkKKwkgICAgeworCQlSZW1vdmVNZW51KG1lbnUtPnBhcmVudC0+c3VibWVudV9pZCwgaiwgTUZfQllQT1NJVElPTik7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWkgPSBHZXRNZW51SXRlbUNvdW50KHNfbWVudUJhcik7CisJZm9yIChqID0gMDsgaiA8IGk7ICsraikKKwl7CisJICAgIEdldE1lbnVTdHJpbmcoc19tZW51QmFyLCBqLCBwYW50cywgODAsIE1GX0JZUE9TSVRJT04pOworCSAgICBpZiAoc3RyY21wKHBhbnRzLCBtZW51LT5uYW1lKSA9PSAwKQorCSAgICB7CisJCVJlbW92ZU1lbnUoc19tZW51QmFyLCBqLCBNRl9CWVBPU0lUSU9OKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKG1lbnUtPnN1Ym1lbnVfaWQgIT0gTlVMTCkKKwlEZXN0cm95TWVudShtZW51LT5zdWJtZW51X2lkKTsKKyAgICB9CisgICAgRHJhd01lbnVCYXIoc19od25kKTsKK30KKworCisvKgorICogTWFrZSBhIG1lbnUgZWl0aGVyIGdyZXkgb3Igbm90IGdyZXkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSgKKyAgICB2aW1tZW51X1QgKm1lbnUsCisgICAgaW50CSAgICBncmV5KQoreworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIC8qCisgICAgICogaXMgdGhpcyBhIHRvb2xiYXIgYnV0dG9uPworICAgICAqLworICAgIGlmIChtZW51LT5zdWJtZW51X2lkID09IChITUVOVSktMSkKKyAgICB7CisJU2VuZE1lc3NhZ2Uoc190b29sYmFyaHduZCwgVEJfRU5BQkxFQlVUVE9OLAorCSAgICAoV1BBUkFNKW1lbnUtPmlkLCAoTFBBUkFNKSBNQUtFTE9ORygoZ3JleSA/IEZBTFNFIDogVFJVRSksIDApICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChncmV5KQorCUVuYWJsZU1lbnVJdGVtKHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgICAgZWxzZQorCUVuYWJsZU1lbnVJdGVtKHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCB8IE1GX0VOQUJMRUQpOworCit9CisKKworI2VuZGlmIC8qRkVBVF9NRU5VKi8KKworCisvKiBkZWZpbmUgc29tZSBtYWNyb3MgdXNlZCB0byBtYWtlIHRoZSBkaWFsb2d1ZSBjcmVhdGlvbiBtb3JlIHJlYWRhYmxlICovCisKKyNkZWZpbmUgYWRkX3N0cmluZyhzKSBzdHJjcHkoKExQU1RSKXAsIHMpOyAoTFBTVFIpcCArPSAoc3RybGVuKChMUFNUUilwKSArIDEpCisjZGVmaW5lIGFkZF93b3JkKHgpCQkqcCsrID0gKHgpCisjZGVmaW5lIGFkZF9ieXRlKHgpCQkqKChMUFNUUilwKSsrID0gKHgpCisjZGVmaW5lIGFkZF9sb25nKHgpCQkqKChMUERXT1JEKXApKysgPSAoeCkKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHN0dWZmIGZvciBkaWFsb2dzCisgKi8KKworLyoKKyAqIFRoZSBjYWxsYmFjayByb3V0aW5lIHVzZWQgYnkgYWxsIHRoZSBkaWFsb2dzLiAgVmVyeSBzaW1wbGUuICBGaXJzdCwKKyAqIGFja25vd2xlZGdlcyB0aGUgSU5JVERJQUxPRyBtZXNzYWdlIHNvIHRoYXQgV2luZG93cyBrbm93cyB0byBkbyBzdGFuZGFyZAorICogZGlhbG9nIHN0dWZmIChSZXR1cm4gPSBkZWZhdWx0LCBFc2MgPSBjYW5jZWwuLi4uKSBTZWNvbmQsIGlmIGEgYnV0dG9uIGlzCisgKiBwcmVzc2VkLCByZXR1cm4gdGhhdCBidXR0b24ncyBJRCAtIElEQ0FOQ0VMICgyKSwgd2hpY2ggaXMgdGhlIGJ1dHRvbidzCisgKiBudW1iZXIuCisgKi8KKwkgc3RhdGljIEJPT0wgQ0FMTEJBQ0sKK2RpYWxvZ19jYWxsYmFjaygKKwkgSFdORCBod25kLAorCSBVSU5UIG1lc3NhZ2UsCisJIFdQQVJBTSB3UGFyYW0sCisJIExQQVJBTSBsUGFyYW0pCit7CisgICAgaWYgKG1lc3NhZ2UgPT0gV01fSU5JVERJQUxPRykKKyAgICB7CisJQ2VudGVyV2luZG93KGh3bmQsIEdldFdpbmRvdyhod25kLCBHV19PV05FUikpOworCS8qIFNldCBmb2N1cyB0byB0aGUgZGlhbG9nLiAgU2V0IHRoZSBkZWZhdWx0IGJ1dHRvbiwgaWYgc3BlY2lmaWVkLiAqLworCSh2b2lkKVNldEZvY3VzKGh3bmQpOworCWlmIChkaWFsb2dfZGVmYXVsdF9idXR0b24gPiBJRENBTkNFTCkKKwkgICAgKHZvaWQpU2V0Rm9jdXMoR2V0RGxnSXRlbShod25kLCBkaWFsb2dfZGVmYXVsdF9idXR0b24pKTsKKy8vCWlmIChkaWFsb2dfZGVmYXVsdF9idXR0b24gPiAwKQorLy8JICAgICh2b2lkKVNldEZvY3VzKEdldERsZ0l0ZW0oaHduZCwgZGlhbG9nX2RlZmF1bHRfYnV0dG9uICsgSURDQU5DRUwpKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKG1lc3NhZ2UgPT0gV01fQ09NTUFORCkKKyAgICB7CisJaW50CWJ1dHRvbiA9IExPV09SRCh3UGFyYW0pOworCisJLyogRG9uJ3QgZW5kIHRoZSBkaWFsb2cgaWYgc29tZXRoaW5nIHdhcyBzZWxlY3RlZCB0aGF0IHdhcworCSAqIG5vdCBhIGJ1dHRvbi4KKwkgKi8KKwlpZiAoYnV0dG9uID49IERMR19OT05CVVRUT05fQ09OVFJPTCkKKwkgICAgcmV0dXJuIFRSVUU7CisKKwkvKiBJZiB0aGUgZWRpdCBib3ggZXhpc3RzLCBjb3B5IHRoZSBzdHJpbmcuICovCisJaWYgKHNfdGV4dGZpZWxkICE9IE5VTEwpCisJICAgIEdldERsZ0l0ZW1UZXh0KGh3bmQsIERMR19OT05CVVRUT05fQ09OVFJPTCArIDIsCisJCQkJCQkJIHNfdGV4dGZpZWxkLCBJT1NJWkUpOworCisJLyoKKwkgKiBOZWVkIHRvIGNoZWNrIGZvciBJRE9LIGJlY2F1c2UgaWYgdGhlIHVzZXIganVzdCBoaXRzIFJldHVybiB0bworCSAqIGFjY2VwdCB0aGUgZGVmYXVsdCB2YWx1ZSwgc29tZSByZWFzb24gdGhpcyBpcyB3aGF0IHdlIGdldC4KKwkgKi8KKwlpZiAoYnV0dG9uID09IElET0spCisJICAgIEVuZERpYWxvZyhod25kLCBkaWFsb2dfZGVmYXVsdF9idXR0b24pOworCWVsc2UKKwkgICAgRW5kRGlhbG9nKGh3bmQsIGJ1dHRvbiAtIElEQ0FOQ0VMKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKG1lc3NhZ2UgPT0gV01fU1lTQ09NTUFORCkgJiYgKHdQYXJhbSA9PSBTQ19DTE9TRSkpCisgICAgeworCUVuZERpYWxvZyhod25kLCAwKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQ3JlYXRlIGEgZGlhbG9nIGR5bmFtaWNhbGx5IGZyb20gdGhlIHBhcmFtZXRlciBzdHJpbmdzLgorICogdHlwZQkJPSB0eXBlIG9mIGRpYWxvZyAocXVlc3Rpb24sIGFsZXJ0LCBldGMuKQorICogdGl0bGUJPSBkaWFsb2cgdGl0bGUuIG1heSBiZSBOVUxMIGZvciBkZWZhdWx0IHRpdGxlLgorICogbWVzc2FnZQk9IHRleHQgdG8gZGlzcGxheS4gRGlhbG9nIHNpemVzIHRvIGFjY29tbW9kYXRlIGl0LgorICogYnV0dG9ucwk9ICdcbicgc2VwYXJhdGVkIGxpc3Qgb2YgYnV0dG9uIGNhcHRpb25zLCBkZWZhdWx0IGZpcnN0LgorICogZGZsdGJ1dHRvbgk9IG51bWJlciBvZiBkZWZhdWx0IGJ1dHRvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyAxIGlmIHRoZSBmaXJzdCBidXR0b24gaXMgcHJlc3NlZCwKKyAqCQkJMiBmb3IgdGhlIHNlY29uZCwgZXRjLgorICoKKyAqCQkJMCBpbmRpY2F0ZXMgRXNjIHdhcyBwcmVzc2VkLgorICoJCQktMSBmb3IgdW5leHBlY3RlZCBlcnJvcgorICoKKyAqIElmIHN0dWJiaW5nIG91dCB0aGlzIGZuLCByZXR1cm4gMS4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhcl91IGRsZ19pY29uc1tdID0gLyogbXVzdCBtYXRjaCBuYW1lcyBpbiByZXNvdXJjZSBmaWxlICovCit7CisgICAgSURSX1ZJTSwKKyAgICBJRFJfVklNX0VSUk9SLAorICAgIElEUl9WSU1fQUxFUlQsCisgICAgSURSX1ZJTV9JTkZPLAorICAgIElEUl9WSU1fUVVFU1RJT04KK307CisKKyAgICBpbnQKK2d1aV9tY2hfZGlhbG9nKAorICAgIGludAkJIHR5cGUsCisgICAgY2hhcl91CSp0aXRsZSwKKyAgICBjaGFyX3UJKm1lc3NhZ2UsCisgICAgY2hhcl91CSpidXR0b25zLAorICAgIGludAkJIGRmbHRidXR0b24sCisgICAgY2hhcl91CSp0ZXh0ZmllbGQpCit7CisgICAgRkFSUFJPQwlkcDsKKyAgICBMUFdPUkQJcCwgcG51bWl0ZW1zOworICAgIGludAkJbnVtQnV0dG9uczsKKyAgICBpbnQJCSpidXR0b25XaWR0aHMsICpidXR0b25Qb3NpdGlvbnM7CisgICAgaW50CQlidXR0b25ZcG9zOworICAgIGludAkJbmNoYXIsIGk7CisgICAgRFdPUkQJbFN0eWxlOworICAgIGludAkJZGxnd2lkdGggPSAwOworICAgIGludAkJZGxnaGVpZ2h0OworICAgIGludAkJZWRpdGJveGhlaWdodDsKKyAgICBpbnQJCWhvcml6V2lkdGg7CisgICAgaW50CQltc2doZWlnaHQ7CisgICAgY2hhcl91CSpwc3RhcnQ7CisgICAgY2hhcl91CSpwZW5kOworICAgIGNoYXJfdQkqdGJ1ZmZlcjsKKyAgICBSRUNUCXJlY3Q7CisgICAgSFdORAlod25kOworICAgIEhEQwkJaGRjOworICAgIEhGT05UCW9sZEZvbnQ7CisgICAgVEVYVE1FVFJJQwlmb250SW5mbzsKKyAgICBpbnQJCWZvbnRIZWlnaHQ7CisgICAgaW50CQl0ZXh0V2lkdGgsIG1pbkJ1dHRvbldpZHRoLCBtZXNzYWdlV2lkdGg7CisgICAgaW50CQltYXhEaWFsb2dXaWR0aDsKKyAgICBpbnQJCXZlcnRpY2FsOworICAgIGludAkJZGxnUGFkZGluZ1g7CisgICAgaW50CQlkbGdQYWRkaW5nWTsKKyAgICBIR0xPQkFMCWhnbGJEbGdUZW1wOworCisjaWZuZGVmIE5PX0NPTlNPTEUKKyAgICAvKiBEb24ndCBvdXRwdXQgYW55dGhpbmcgaW4gc2lsZW50IG1vZGUgKCJleCAtcyIpICovCisgICAgaWYgKHNpbGVudF9tb2RlKQorCXJldHVybiBkZmx0YnV0dG9uOyAgIC8qIHJldHVybiBkZWZhdWx0IG9wdGlvbiAqLworI2VuZGlmCisKKyAgICAvKiBJZiB0aGVyZSBpcyBubyB3aW5kb3cgeWV0LCBvcGVuIGl0LiAqLworICAgIGlmIChzX2h3bmQgPT0gTlVMTCAmJiBndWlfbWNoX2luaXQoKSA9PSBGQUlMKQorCXJldHVybiBkZmx0YnV0dG9uOworCisgICAgaWYgKCh0eXBlIDwgMCkgfHwgKHR5cGUgPiBWSU1fTEFTVF9UWVBFKSkKKwl0eXBlID0gMDsKKworICAgIC8qIGFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciBkaWFsb2cgdGVtcGxhdGUgKi8KKyAgICAvKiBUT0RPIHNob3VsZCBjb21wdXRlIHRoaXMgcmVhbGx5Ki8KKworICAgIGhnbGJEbGdUZW1wID0gR2xvYmFsQWxsb2MoR0hORCwgIERMR19BTExPQ19TSVpFKTsKKyAgICBpZiAoaGdsYkRsZ1RlbXAgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICBwID0gKExQV09SRCkgR2xvYmFsTG9jayhoZ2xiRGxnVGVtcCk7CisKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qCisgICAgICogbWFrZSBhIGNvcHkgb2YgJ2J1dHRvbnMnIHRvIGZpZGRsZSB3aXRoIGl0LiAgY29tcGxpZXIgZ3JpenpsZXMgYmVjYXVzZQorICAgICAqIHZpbV9zdHJzYXZlKCkgZG9lc24ndCB0YWtlIGEgY29uc3QgYXJnICh3aHkgbm90PyksIHNvIGNhc3QgYXdheSB0aGUKKyAgICAgKiBjb25zdC4KKyAgICAgKi8KKyAgICB0YnVmZmVyID0gdmltX3N0cnNhdmUoYnV0dG9ucyk7CisgICAgaWYgKHRidWZmZXIgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAtLWRmbHRidXR0b247ICAgLyogQ2hhbmdlIGZyb20gb25lLWJhc2VkIHRvIHplcm8tYmFzZWQgKi8KKworICAgIC8qIENvdW50IGJ1dHRvbnMgKi8KKyAgICBudW1CdXR0b25zID0gMTsKKyAgICBmb3IgKGkgPSAwOyB0YnVmZmVyW2ldICE9ICdcMCc7IGkrKykKKyAgICB7CisJaWYgKHRidWZmZXJbaV0gPT0gRExHX0JVVFRPTl9TRVApCisJICAgIG51bUJ1dHRvbnMrKzsKKyAgICB9CisgICAgaWYgKGRmbHRidXR0b24gPj0gbnVtQnV0dG9ucykKKwlkZmx0YnV0dG9uID0gMDsKKworICAgIC8qIEFsbG9jYXRlIGFycmF5IHRvIGhvbGQgdGhlIHdpZHRoIG9mIGVhY2ggYnV0dG9uICovCisgICAgYnV0dG9uV2lkdGhzID0gKGludCAqKSBsYWxsb2MobnVtQnV0dG9ucyAqIHNpemVvZihpbnQpLCBUUlVFKTsKKyAgICBpZiAoYnV0dG9uV2lkdGhzID09IE5VTEwpCisJcmV0dXJuIC0xOworCisgICAgLyogQWxsb2NhdGUgYXJyYXkgdG8gaG9sZCB0aGUgWCBwb3NpdGlvbiBvZiBlYWNoIGJ1dHRvbiAqLworICAgIGJ1dHRvblBvc2l0aW9ucyA9IChpbnQgKikgbGFsbG9jKG51bUJ1dHRvbnMgKiBzaXplb2YoaW50KSwgVFJVRSk7CisgICAgaWYgKGJ1dHRvblBvc2l0aW9ucyA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIGhvdyBiaWcgdGhlIGRpYWxvZyBtdXN0IGJlLgorICAgICAqLworICAgIGh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CisgICAgaGRjID0gR2V0V2luZG93REMoaHduZCk7CisgICAgb2xkRm9udCA9IFNlbGVjdEZvbnQoaGRjLCBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCkpOworICAgIGRsZ1BhZGRpbmdYID0gRExHX09MRF9TVFlMRV9QQURESU5HX1g7CisgICAgZGxnUGFkZGluZ1kgPSBETEdfT0xEX1NUWUxFX1BBRERJTkdfWTsKKworICAgIEdldFRleHRNZXRyaWNzKGhkYywgJmZvbnRJbmZvKTsKKyAgICBmb250SGVpZ2h0ID0gZm9udEluZm8udG1IZWlnaHQ7CisKKyAgICAvKiBNaW5pbXVtIHdpZHRoIGZvciBob3Jpem9udGFsIGJ1dHRvbiAqLworICAgIG1pbkJ1dHRvbldpZHRoID0gR2V0VGV4dFdpZHRoKGhkYywgIkNhbmNlbCIsIDYpOworCisgICAgLyogTWF4aW11bSB3aWR0aCBvZiBhIGRpYWxvZywgaWYgcG9zc2libGUgKi8KKyAgICBHZXRXaW5kb3dSZWN0KHNfaHduZCwgJnJlY3QpOworICAgIG1heERpYWxvZ1dpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdAorCQkgICAgIC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSAqIDI7CisgICAgaWYgKG1heERpYWxvZ1dpZHRoIDwgRExHX01JTl9NQVhfV0lEVEgpCisJbWF4RGlhbG9nV2lkdGggPSBETEdfTUlOX01BWF9XSURUSDsKKworICAgIC8qIFNldCBkbGd3aWR0aCB0byB3aWR0aCBvZiBtZXNzYWdlICovCisgICAgcHN0YXJ0ID0gbWVzc2FnZTsKKyAgICBtZXNzYWdlV2lkdGggPSAwOworICAgIG1zZ2hlaWdodCA9IDA7CisgICAgZG8KKyAgICB7CisJcGVuZCA9IHZpbV9zdHJjaHIocHN0YXJ0LCBETEdfQlVUVE9OX1NFUCk7CisJaWYgKHBlbmQgPT0gTlVMTCkKKwkgICAgcGVuZCA9IHBzdGFydCArIFNUUkxFTihwc3RhcnQpOwkvKiBMYXN0IGxpbmUgb2YgbWVzc2FnZS4gKi8KKwltc2doZWlnaHQgKz0gZm9udEhlaWdodDsKKwl0ZXh0V2lkdGggPSBHZXRUZXh0V2lkdGgoaGRjLCBwc3RhcnQsIHBlbmQgLSBwc3RhcnQpOworCWlmICh0ZXh0V2lkdGggPiBtZXNzYWdlV2lkdGgpCisJICAgIG1lc3NhZ2VXaWR0aCA9IHRleHRXaWR0aDsKKwlwc3RhcnQgPSBwZW5kICsgMTsKKyAgICB9IHdoaWxlICgqcGVuZCAhPSBOVUwpOworICAgIGRsZ3dpZHRoID0gbWVzc2FnZVdpZHRoOworCisgICAgLyogQWRkIHdpZHRoIG9mIGljb24gdG8gZGxnd2lkdGgsIGFuZCBzb21lIHNwYWNlICovCisgICAgZGxnd2lkdGggKz0gRExHX0lDT05fV0lEVEggKyAzICogZGxnUGFkZGluZ1g7CisKKyAgICBpZiAobXNnaGVpZ2h0IDwgRExHX0lDT05fSEVJR0hUKQorCW1zZ2hlaWdodCA9IERMR19JQ09OX0hFSUdIVDsKKworICAgIC8qCisgICAgICogQ2hlY2sgYnV0dG9uIG5hbWVzLiAgQSBsb25nIG9uZSB3aWxsIG1ha2UgdGhlIGRpYWxvZyB3aWRlci4KKyAgICAgKi8KKwkgdmVydGljYWwgPSAodmltX3N0cmNocihwX2dvLCBHT19WRVJUSUNBTCkgIT0gTlVMTCk7CisgICAgaWYgKCF2ZXJ0aWNhbCkKKyAgICB7CisJLy8gUGxhY2UgYnV0dG9ucyBob3Jpem9udGFsbHkgaWYgdGhleSBmaXQuCisJaG9yaXpXaWR0aCA9IGRsZ1BhZGRpbmdYOworCXBzdGFydCA9IHRidWZmZXI7CisJaSA9IDA7CisJZG8KKwl7CisJICAgIHBlbmQgPSB2aW1fc3RyY2hyKHBzdGFydCwgRExHX0JVVFRPTl9TRVApOworCSAgICBpZiAocGVuZCA9PSBOVUxMKQorCQlwZW5kID0gcHN0YXJ0ICsgU1RSTEVOKHBzdGFydCk7CS8vIExhc3QgYnV0dG9uIG5hbWUuCisJICAgIHRleHRXaWR0aCA9IEdldFRleHRXaWR0aChoZGMsIHBzdGFydCwgcGVuZCAtIHBzdGFydCk7CisJICAgIGlmICh0ZXh0V2lkdGggPCBtaW5CdXR0b25XaWR0aCkKKwkJdGV4dFdpZHRoID0gbWluQnV0dG9uV2lkdGg7CisJICAgIHRleHRXaWR0aCArPSBkbGdQYWRkaW5nWDsJICAgIC8qIFBhZGRpbmcgd2l0aGluIGJ1dHRvbiAqLworCSAgICBidXR0b25XaWR0aHNbaV0gPSB0ZXh0V2lkdGg7CisJICAgIGJ1dHRvblBvc2l0aW9uc1tpKytdID0gaG9yaXpXaWR0aDsKKwkgICAgaG9yaXpXaWR0aCArPSB0ZXh0V2lkdGggKyBkbGdQYWRkaW5nWDsgLyogUGFkIGJldHdlZW4gYnV0dG9ucyAqLworCSAgICBwc3RhcnQgPSBwZW5kICsgMTsKKwl9IHdoaWxlICgqcGVuZCAhPSBOVUwpOworCisJaWYgKGhvcml6V2lkdGggPiBtYXhEaWFsb2dXaWR0aCkKKwkgICAgdmVydGljYWwgPSBUUlVFOwkvLyBUb28gd2lkZSB0byBmaXQgb24gdGhlIHNjcmVlbi4KKwllbHNlIGlmIChob3JpeldpZHRoID4gZGxnd2lkdGgpCisJICAgIGRsZ3dpZHRoID0gaG9yaXpXaWR0aDsKKyAgICB9CisKKyAgICBpZiAodmVydGljYWwpCisgICAgeworCS8vIFN0YWNrIGJ1dHRvbnMgdmVydGljYWxseS4KKwlwc3RhcnQgPSB0YnVmZmVyOworCWRvCisJeworCSAgICBwZW5kID0gdmltX3N0cmNocihwc3RhcnQsIERMR19CVVRUT05fU0VQKTsKKwkgICAgaWYgKHBlbmQgPT0gTlVMTCkKKwkJcGVuZCA9IHBzdGFydCArIFNUUkxFTihwc3RhcnQpOwkvLyBMYXN0IGJ1dHRvbiBuYW1lLgorCSAgICB0ZXh0V2lkdGggPSBHZXRUZXh0V2lkdGgoaGRjLCBwc3RhcnQsIHBlbmQgLSBwc3RhcnQpOworCSAgICB0ZXh0V2lkdGggKz0gZGxnUGFkZGluZ1g7CQkvKiBQYWRkaW5nIHdpdGhpbiBidXR0b24gKi8KKwkgICAgdGV4dFdpZHRoICs9IERMR19WRVJUX1BBRERJTkdfWCAqIDI7IC8qIFBhZGRpbmcgYXJvdW5kIGJ1dHRvbiAqLworCSAgICBpZiAodGV4dFdpZHRoID4gZGxnd2lkdGgpCisJCWRsZ3dpZHRoID0gdGV4dFdpZHRoOworCSAgICBwc3RhcnQgPSBwZW5kICsgMTsKKwl9IHdoaWxlICgqcGVuZCAhPSBOVUwpOworICAgIH0KKworICAgIGlmIChkbGd3aWR0aCA8IERMR19NSU5fV0lEVEgpCisJZGxnd2lkdGggPSBETEdfTUlOX1dJRFRIOwkvKiBEb24ndCBhbGxvdyBhIHJlYWxseSB0aGluIGRpYWxvZyEqLworCisgICAgLyogc3RhcnQgdG8gZmlsbCBpbiB0aGUgZGxndGVtcGxhdGUgaW5mb3JtYXRpb24uICBhZGRyZXNzaW5nIGJ5IFdPUkRzICovCisgICAgbFN0eWxlID0gRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19WSVNJQkxFIDsKKworICAgIGFkZF9sb25nKGxTdHlsZSk7CisgICAgcG51bWl0ZW1zID0gcDsJLypzYXZlIHdoZXJlIHRoZSBudW1iZXIgb2YgaXRlbXMgbXVzdCBiZSBzdG9yZWQqLworICAgIGFkZF9ieXRlKDApOwkvLyBOdW1iZXJPZkl0ZW1zKHdpbGwgY2hhbmdlIGxhdGVyKQorICAgIGFkZF93b3JkKDEwKTsJLy8geAorICAgIGFkZF93b3JkKDEwKTsJLy8geQorICAgIGFkZF93b3JkKFBpeGVsVG9EaWFsb2dYKGRsZ3dpZHRoKSk7CisKKyAgICAvLyBEaWFsb2cgaGVpZ2h0LgorICAgIGlmICh2ZXJ0aWNhbCkKKwlkbGdoZWlnaHQgPSBtc2doZWlnaHQgKyAyICogZGxnUGFkZGluZ1kgKworCQkJICAgICAgRExHX1ZFUlRfUEFERElOR19ZICsgMiAqIGZvbnRIZWlnaHQgKiBudW1CdXR0b25zOworICAgIGVsc2UKKwlkbGdoZWlnaHQgPSBtc2doZWlnaHQgKyAzICogZGxnUGFkZGluZ1kgKyAyICogZm9udEhlaWdodDsKKworICAgIC8vIERpYWxvZyBuZWVkcyB0byBiZSB0YWxsZXIgaWYgY29udGFpbnMgYW4gZWRpdCBib3guCisgICAgZWRpdGJveGhlaWdodCA9IGZvbnRIZWlnaHQgKyBkbGdQYWRkaW5nWSArIDQgKiBETEdfVkVSVF9QQURESU5HX1k7CisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorCWRsZ2hlaWdodCArPSBlZGl0Ym94aGVpZ2h0OworCisgICAgYWRkX3dvcmQoUGl4ZWxUb0RpYWxvZ1koZGxnaGVpZ2h0KSk7CisKKyAgICBhZGRfYnl0ZSgwKTsJLy9tZW51CisgICAgYWRkX2J5dGUoMCk7CS8vY2xhc3MKKworICAgIC8qIGNvcHkgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgKi8KKyAgICBhZGRfc3RyaW5nKHRpdGxlID8gdGl0bGUgOiAoIlZpbSJWSU1fVkVSU0lPTl9NRURJVU0pKTsKKworICAgIGJ1dHRvbllwb3MgPSBtc2doZWlnaHQgKyAyICogZGxnUGFkZGluZ1k7CisKKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisJYnV0dG9uWXBvcyArPSBlZGl0Ym94aGVpZ2h0OworCisgICAgcHN0YXJ0ID0gdGJ1ZmZlcjsgLy9kZmx0X3RleHQKKyAgICBob3JpeldpZHRoID0gKGRsZ3dpZHRoIC0gaG9yaXpXaWR0aCkgLyAyOwkvKiBOb3cgaXQncyBYIG9mZnNldCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdXR0b25zOyBpKyspCisgICAgeworCS8qIGdldCBlbmQgb2YgdGhpcyBidXR0b24uICovCisJZm9yICgJcGVuZCA9IHBzdGFydDsKKwkJKnBlbmQgJiYgKCpwZW5kICE9IERMR19CVVRUT05fU0VQKTsKKwkJcGVuZCsrKQorCSAgICA7CisKKwlpZiAoKnBlbmQpCisJICAgICpwZW5kID0gJ1wwJzsKKworCS8qCisJICogTk9URToKKwkgKiBzZXR0aW5nIHRoZSBCU19ERUZQVVNIQlVUVE9OIHN0eWxlIGRvZXNuJ3Qgd29yayBiZWNhdXNlIFdpbmRvd3Mgc2V0cworCSAqIHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgdGFiLWFibGUgYnV0dG9uIGFuZCBpbiBzbyBkb2luZyBtYWtlcyB0aGF0CisJICogdGhlIGRlZmF1bHQhISBHcnJyLiAgV29ya2Fyb3VuZDogTWFrZSB0aGUgZGVmYXVsdCBidXR0b24gdGhlIG9ubHkKKwkgKiBvbmUgd2l0aCBXU19UQUJTVE9QIHN0eWxlLiBNZWFucyB1c2VyIGNhbid0IHRhYiBiZXR3ZWVuIGJ1dHRvbnMsIGJ1dAorCSAqIGhlL3NoZSBjYW4gdXNlIGFycm93IGtleXMuCisJICoKKwkgKiBOT1RFIChUaG9yZSk6IFNldHRpbmcgQlNfREVGUFVTSEJVVFRPTiB3b3JrcyBmaW5lIHdoZW4gaXQncyB0aGUKKwkgKiBmaXJzdCBvbmUsIHNvIEkgY2hhbmdlZCB0aGUgY29ycmVjdCBidXR0b24gdG8gYmUgdGhpcyBzdHlsZS4gVGhpcworCSAqIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdoZW4gYW4gZWRpdCBib3ggaXMgYWRkZWQsIHdlIG5lZWQgYSBidXR0b24gdG8KKwkgKiBiZSBkZWZhdWx0LiAgVGhlIGVkaXQgYm94IHdpbGwgYmUgdGhlIGRlZmF1bHQgY29udHJvbCwgYW5kIHdoZW4gdGhlCisJICogdXNlciBwcmVzc2VzIGVudGVyIGZyb20gdGhlIGVkaXQgYm94IHdlIHdhbnQgdGhlIGRlZmF1bHQgYnV0dG9uIHRvCisJICogYmUgcHJlc3NlZC4KKwkgKi8KKwlpZiAodmVydGljYWwpCisJeworCSAgICBwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsCisJCSAgICAoKGkgPT0gZGZsdGJ1dHRvbiB8fCBkZmx0YnV0dG9uIDwgMCkgJiYgdGV4dGZpZWxkICE9IE5VTEwKKwkJCSAgICA/ICBCU19ERUZQVVNIQlVUVE9OIDogQlNfUFVTSEJVVFRPTikgfCBXU19UQUJTVE9QLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1goRExHX1ZFUlRfUEFERElOR19YKSwKKwkJICAgIFBpeGVsVG9EaWFsb2dZKGJ1dHRvbllwb3MgLyogVEJLICovCisJCQkJICAgKyAyICogZm9udEhlaWdodCAqIGkpLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1goZGxnd2lkdGggLSAyICogRExHX1ZFUlRfUEFERElOR19YKSwKKwkJICAgIChXT1JEKShQaXhlbFRvRGlhbG9nWSgyICogZm9udEhlaWdodCkgLSAxKSwKKwkJICAgIChXT1JEKShJRENBTkNFTCArIDEgKyBpKSwgKEJZVEUpMHg4MCwgcHN0YXJ0KTsKKwl9CisJZWxzZQorCXsKKwkgICAgcCA9IGFkZF9kaWFsb2dfZWxlbWVudChwLAorCQkgICAgKChpID09IGRmbHRidXR0b24gfHwgZGZsdGJ1dHRvbiA8IDApICYmIHRleHRmaWVsZCAhPSBOVUxMCisJCQkgICAgID8gQlNfREVGUFVTSEJVVFRPTiA6IEJTX1BVU0hCVVRUT04pIHwgV1NfVEFCU1RPUCwKKwkJICAgIFBpeGVsVG9EaWFsb2dYKGhvcml6V2lkdGggKyBidXR0b25Qb3NpdGlvbnNbaV0pLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1koYnV0dG9uWXBvcyksIC8qIFRCSyAqLworCQkgICAgUGl4ZWxUb0RpYWxvZ1goYnV0dG9uV2lkdGhzW2ldKSwKKwkJICAgIChXT1JEKShQaXhlbFRvRGlhbG9nWSgyICogZm9udEhlaWdodCkgLSAxKSwKKwkJICAgIChXT1JEKShJRENBTkNFTCArIDEgKyBpKSwgKEJZVEUpMHg4MCwgcHN0YXJ0KTsKKwl9CisKKwlwc3RhcnQgPSBwZW5kICsgMTsJLypuZXh0IGJ1dHRvbiovCisKKyAgICB9CisgICAgKnBudW1pdGVtcyArPSBudW1CdXR0b25zOworCisgICAgLyogVmltIGljb24gKi8KKyAgICBwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsIFNTX0lDT04sCisJICAgIFBpeGVsVG9EaWFsb2dYKGRsZ1BhZGRpbmdYKSwKKwkgICAgUGl4ZWxUb0RpYWxvZ1koZGxnUGFkZGluZ1kpLAorCSAgICBQaXhlbFRvRGlhbG9nWChETEdfSUNPTl9XSURUSCksCisJICAgIFBpeGVsVG9EaWFsb2dZKERMR19JQ09OX0hFSUdIVCksCisJICAgIERMR19OT05CVVRUT05fQ09OVFJPTCArIDAsIChCWVRFKTB4ODIsCisJICAgICZkbGdfaWNvbnNbdHlwZV0pOworCisKKyAgICAvKiBEaWFsb2cgbWVzc2FnZSAqLworICAgIHAgPSBhZGRfZGlhbG9nX2VsZW1lbnQocCwgU1NfTEVGVCwKKwkgICAgUGl4ZWxUb0RpYWxvZ1goMiAqIGRsZ1BhZGRpbmdYICsgRExHX0lDT05fV0lEVEgpLAorCSAgICBQaXhlbFRvRGlhbG9nWShkbGdQYWRkaW5nWSksCisJICAgIChXT1JEKShQaXhlbFRvRGlhbG9nWChtZXNzYWdlV2lkdGgpICsgMSksCisJICAgIFBpeGVsVG9EaWFsb2dZKG1zZ2hlaWdodCksCisJICAgIERMR19OT05CVVRUT05fQ09OVFJPTCArIDEsIChCWVRFKTB4ODIsIG1lc3NhZ2UpOworCisgICAgLyogRWRpdCBib3ggKi8KKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCXAgPSBhZGRfZGlhbG9nX2VsZW1lbnQocCwgRVNfTEVGVCB8IEVTX0FVVE9IU0NST0xMIHwgV1NfVEFCU1RPUCB8IFdTX0JPUkRFUiwKKwkJUGl4ZWxUb0RpYWxvZ1goMiAqIGRsZ1BhZGRpbmdYKSwKKwkJUGl4ZWxUb0RpYWxvZ1koMiAqIGRsZ1BhZGRpbmdZICsgbXNnaGVpZ2h0KSwKKwkJUGl4ZWxUb0RpYWxvZ1goZGxnd2lkdGggLSA0ICogZGxnUGFkZGluZ1gpLAorCQlQaXhlbFRvRGlhbG9nWShmb250SGVpZ2h0ICsgZGxnUGFkZGluZ1kpLAorCQlETEdfTk9OQlVUVE9OX0NPTlRST0wgKyAyLCAoQllURSkweDgxLCB0ZXh0ZmllbGQpOworCSpwbnVtaXRlbXMgKz0gMTsKKyAgICB9CisKKyAgICAqcG51bWl0ZW1zICs9IDI7CisKKyAgICBTZWxlY3RGb250KGhkYywgb2xkRm9udCk7CisgICAgUmVsZWFzZURDKGh3bmQsIGhkYyk7CisgICAgZHAgPSBNYWtlUHJvY0luc3RhbmNlKChGQVJQUk9DKWRpYWxvZ19jYWxsYmFjaywgc19oaW5zdCk7CisKKworICAgIC8qIExldCB0aGUgZGlhbG9nX2NhbGxiYWNrKCkgZnVuY3Rpb24ga25vdyB3aGljaCBidXR0b24gdG8gbWFrZSBkZWZhdWx0CisgICAgICogSWYgd2UgaGF2ZSBhbiBlZGl0IGJveCwgbWFrZSB0aGF0IHRoZSBkZWZhdWx0LiBXZSBhbHNvIG5lZWQgdG8gdGVsbAorICAgICAqIGRpYWxvZ19jYWxsYmFjaygpIGlmIHRoaXMgZGlhbG9nIGNvbnRhaW5zIGFuIGVkaXQgYm94IG9yIG5vdC4gV2UgZG8KKyAgICAgKiB0aGlzIGJ5IHNldHRpbmcgc190ZXh0ZmllbGQgaWYgaXQgZG9lcy4KKyAgICAgKi8KKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisgICAgeworCWRpYWxvZ19kZWZhdWx0X2J1dHRvbiA9IERMR19OT05CVVRUT05fQ09OVFJPTCArIDI7CisJc190ZXh0ZmllbGQgPSB0ZXh0ZmllbGQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZGlhbG9nX2RlZmF1bHRfYnV0dG9uID0gSURDQU5DRUwgKyAxICsgZGZsdGJ1dHRvbjsKKwlzX3RleHRmaWVsZCA9IE5VTEw7CisgICAgfQorCisgICAgLypzaG93IHRoZSBkaWFsb2cgYm94IG1vZGFsbHkgYW5kIGdldCBhIHJldHVybiB2YWx1ZSovCisgICAgbmNoYXIgPSBEaWFsb2dCb3hJbmRpcmVjdCgKKwkgICAgc19oaW5zdCwKKwkgICAgKEhHTE9CQUwpIGhnbGJEbGdUZW1wLAorCSAgICBzX2h3bmQsCisJICAgIChETEdQUk9DKWRwKTsKKworICAgIEZyZWVQcm9jSW5zdGFuY2UoIGRwICk7CisgICAgR2xvYmFsVW5sb2NrKGhnbGJEbGdUZW1wKTsKKyAgICBHbG9iYWxGcmVlKGhnbGJEbGdUZW1wKTsKKyAgICB2aW1fZnJlZSh0YnVmZmVyKTsKKyAgICB2aW1fZnJlZShidXR0b25XaWR0aHMpOworICAgIHZpbV9mcmVlKGJ1dHRvblBvc2l0aW9ucyk7CisKKworICAgIHJldHVybiBuY2hhcjsKK30KKworLyoKKyAqIFB1dCBhIHNpbXBsZSBlbGVtZW50IChiYXNpYyBjbGFzcykgb250byBhIGRpYWxvZyB0ZW1wbGF0ZSBpbiBtZW1vcnkuCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBuZXh0IGl0ZW0gc2hvdWxkIGJlIGFkZGVkLgorICoKKyAqIHBhcmFtZXRlcnM6CisgKiAgbFN0eWxlID0gYWRkaXRpb25hbCBzdHlsZSBmbGFncworICogIHgseSA9IHggJiB5IHBvc2l0aW9ucyBJTiBESUFMT0cgVU5JVFMKKyAqICB3LGggPSB3aWR0aCBhbmQgaGVpZ2h0IElOIERJQUxPRyBVTklUUworICogIElkCT0gSUQgdXNlZCBpbiBtZXNzYWdlcworICogIGNsc3MgID0gY2xhc3MgSUQsIGUuZyAweDgwIGZvciBhIGJ1dHRvbiwgMHg4MiBmb3IgYSBzdGF0aWMKKyAqICBjYXB0aW9uID0gdXN1YWxseSB0ZXh0IG9yIHJlc291cmNlIG5hbWUKKyAqCisgKiAgVE9ETzogdXNlIHRoZSBsZW5ndGggaW5mb3JtYXRpb24gbm90ZWQgaGVyZSB0byBlbmFibGUgdGhlIGRpYWxvZyBjcmVhdGlvbgorICogIHJvdXRpbmVzIHRvIHdvcmsgb3V0IG1vcmUgZXhhY3RseSBob3cgbXVjaCBtZW1vcnkgdGhleSBuZWVkIHRvIGFsbG9jLgorICovCisgICAgc3RhdGljIExQV09SRAorYWRkX2RpYWxvZ19lbGVtZW50KAorICAgIExQV09SRCBwLAorICAgIERXT1JEIGxTdHlsZSwKKyAgICBXT1JEIHgsCisgICAgV09SRCB5LAorICAgIFdPUkQgdywKKyAgICBXT1JEIGgsCisgICAgV09SRCBJZCwKKyAgICBCWVRFIGNsc3MsCisgICAgY29uc3QgY2hhciAqY2FwdGlvbikKK3sKKworICAgIGxTdHlsZSA9IGxTdHlsZSB8IFdTX1ZJU0lCTEUgfCBXU19DSElMRDsKKworICAgIGFkZF93b3JkKHgpOworICAgIGFkZF93b3JkKHkpOworICAgIGFkZF93b3JkKHcpOworICAgIGFkZF93b3JkKGgpOworICAgIGFkZF93b3JkKElkKTsKKyAgICBhZGRfbG9uZyhsU3R5bGUpOworICAgIGFkZF9ieXRlKGNsc3MpOworICAgIGlmICgoKGxTdHlsZSAmIFNTX0lDT04pICE9IDApICYmIChjbHNzID09IDB4ODIpKQorICAgIHsKKwkvKiBVc2UgcmVzb3VyY2UgSUQgKi8KKwlhZGRfYnl0ZSgweGZmKTsKKwlhZGRfYnl0ZSgqY2FwdGlvbik7CisgICAgfQorICAgIGVsc2UKKwlhZGRfc3RyaW5nKGNhcHRpb24pOworCisgICAgYWRkX2J5dGUoMCk7ICAgIC8vIyBvZiBleHRyYSBieXRlcyBmb2xsb3dpbmcKKworCisgICAgcmV0dXJuIHA7Cit9CisKKyN1bmRlZiBhZGRfYnl0ZQorI3VuZGVmIGFkZF9zdHJpbmcKKyN1bmRlZiBhZGRfbG9uZworI3VuZGVmIGFkZF93b3JkCisKKyNlbmRpZiAvKiBGRUFUX0dVSV9ESUFMT0cgKi8KKworICAgIHN0YXRpYyB2b2lkCitnZXRfZGlhbG9nX2ZvbnRfbWV0cmljcyh2b2lkKQoreworICAgIERXT1JECSAgICBkbGdGb250U2l6ZTsKKwlkbGdGb250U2l6ZSA9IEdldERpYWxvZ0Jhc2VVbml0cygpOwkvKiBmYWxsIGJhY2sgdG8gYmlnIG9sZCBzeXN0ZW0qLworCXNfZGxnZm50d2lkdGggPSBMT1dPUkQoZGxnRm9udFNpemUpOworCXNfZGxnZm50aGVpZ2h0ID0gSElXT1JEKGRsZ0ZvbnRTaXplKTsKK30KKworCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisjaW5jbHVkZSAiZ3VpX3czfjEuaCIKKy8qCisgKiBDcmVhdGUgdGhlIHRvb2xiYXIsIGluaXRpYWxseSB1bnBvcHVsYXRlZC4KKyAqICAoanVzdCBsaWtlIHRoZSBtZW51LCB0aGVyZSBhcmUgbm8gZGVmYXVsdHMsIGl0J3MgYWxsCisgKiAgc2V0IHVwIHRocm91Z2ggbWVudS52aW0pCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdGlhbGlzZV90b29sYmFyKHZvaWQpCit7CisgICAgc190b29sYmFyaHduZCA9IENyZWF0ZVRvb2xiYXIoCisJCSAgICBzX2h3bmQsCisJCSAgICBXU19DSElMRCB8IFdTX1ZJU0lCTEUsCisJCSAgICBDTURfVEJfQkFTRSwgLyo8dm4+Ki8KKwkJICAgIDMxLAkJCS8vbnVtYmVyIG9mIGltYWdlcyBpbiBpbml0YWwgYml0bWFwCisJCSAgICBzX2hpbnN0LAorCQkgICAgSURSX1RPT0xCQVIxLAkvLyBpZCBvZiBpbml0aWFsIGJpdG1hcAorCQkgICAgTlVMTCwKKwkJICAgIDAJCQkvLyBpbml0aWFsIG51bWJlciBvZiBidXR0b25zCisJCSAgICApOworCisgICAgZ3VpX21jaF9zaG93X3Rvb2xiYXIodmltX3N0cmNocihwX2dvLCBHT19UT09MQkFSKSAhPSBOVUxMKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX09MRSkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTWFrZSB0aGUgR1VJIHdpbmRvdyBjb21lIHRvIHRoZSBmb3JlZ3JvdW5kLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCh2b2lkKQoreworICAgIGlmIChJc0ljb25pYyhzX2h3bmQpKQorCSBTZW5kTWVzc2FnZShzX2h3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX1JFU1RPUkUsIDApOworICAgIFNldEFjdGl2ZVdpbmRvdyhzX2h3bmQpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3VpX3czMi5jIGIvc3JjL2d1aV93MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjA3OTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV93MzIuYwpAQCAtMCwwICsxLDQwNzcgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCQlHVUkgc3VwcG9ydCBieSBSb2JlcnQgV2ViYgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIFdpbmRvd3MgR1VJLgorICoKKyAqIEdVSSBzdXBwb3J0IGZvciBNaWNyb3NvZnQgV2luZG93cy4gIFdpbjMyIGluaXRpYWxseTsgbWF5YmUgV2luMTYgbGF0ZXIKKyAqCisgKiBHZW9yZ2UgVi4gUmVpbGx5IDxnZW9yZ2VAcmVpbGx5Lm9yZz4gd3JvdGUgdGhlIG9yaWdpbmFsIFdpbjMyIEdVSS4KKyAqIFJvYmVydCBXZWJiIHJld29ya2VkIGl0IHRvIHVzZSB0aGUgZXhpc3RpbmcgR1VJIHN0dWZmIGFuZCBhZGRlZCBtZW51LAorICogc2Nyb2xsYmFycywgZXRjLgorICoKKyAqIE5vdGU6IENsaXBib2FyZCBzdHVmZiwgZm9yIGN1dHRpbmcgYW5kIHBhc3RpbmcgdGV4dCB0byBvdGhlciB3aW5kb3dzLCBpcyBpbgorICogb3Nfd2luMzIuYy4JKEl0IGNhbiBhbHNvIGJlIGRvbmUgZnJvbSB0aGUgdGVybWluYWwgdmVyc2lvbikuCisgKgorICogVE9ETzogU29tZSBvZiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlcyBvdWdodCB0byBiZSB1cGRhdGVkIGZvciBXaW42NDsKKyAqIGUuZy4sIHJlcGxhY2UgTE9ORyB3aXRoIExPTkdfUFRSLCBldGMuCisgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBuZXcgaW4gV2luZG93cyBNRS9YUCwgb25seSBkZWZpbmVkIGluIHJlY2VudCBjb21waWxlcnMuCisgKi8KKyNpZm5kZWYgSEFORExFX1dNX1hCVVRUT05VUAorIyBkZWZpbmUgSEFORExFX1dNX1hCVVRUT05VUChod25kLCB3UGFyYW0sIGxQYXJhbSwgZm4pIFwKKyAgICgoZm4pKChod25kKSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9XTV9YQlVUVE9ORE9XTgorIyBkZWZpbmUgSEFORExFX1dNX1hCVVRUT05ET1dOKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgKChmbikoKGh3bmQpLCBGQUxTRSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9XTV9YQlVUVE9OREJMQ0xLCisjIGRlZmluZSBIQU5ETEVfV01fWEJVVFRPTkRCTENMSyhod25kLCB3UGFyYW0sIGxQYXJhbSwgZm4pIFwKKyAgICgoZm4pKChod25kKSwgVFJVRSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlIHRoZSBjb21tb24gc3R1ZmYgZm9yIE1TLVdpbmRvd3MgR1VJLgorICovCisjaW5jbHVkZSAiZ3VpX3c0OC5jIgorCisjaWZkZWYgRkVBVF9YUE1fVzMyCisjIGluY2x1ZGUgInhwbV93MzIuaCIKKyNlbmRpZgorCisjaWZkZWYgUFJPVE8KKyMgZGVmaW5lIFdJTkFQSQorI2VuZGlmCisKKyNpZmRlZiBfX01JTkdXMzJfXworLyoKKyAqIEFkZCBhIGxvdCBvZiBtaXNzaW5nIGRlZmluZXMuCisgKiBUaGV5IGFyZSBub3QgYWx3YXlzIG1pc3NpbmcsIHdlIG5lZWQgdGhlICNpZm5kZWYncy4KKyAqLworIyBpZm5kZWYgX2NkZWNsCisjICBkZWZpbmUgX2NkZWNsCisjIGVuZGlmCisjIGlmbmRlZiBJc01pbmltaXplZAorIyAgZGVmaW5lICAgICBJc01pbmltaXplZChod25kKQkJSXNJY29uaWMoaHduZCkKKyMgZW5kaWYKKyMgaWZuZGVmIElzTWF4aW1pemVkCisjICBkZWZpbmUgICAgIElzTWF4aW1pemVkKGh3bmQpCQlJc1pvb21lZChod25kKQorIyBlbmRpZgorIyBpZm5kZWYgU2VsZWN0Rm9udAorIyAgZGVmaW5lICAgICBTZWxlY3RGb250KGhkYywgaGZvbnQpICAoKEhGT05UKVNlbGVjdE9iamVjdCgoaGRjKSwgKEhHRElPQkopKEhGT05UKShoZm9udCkpKQorIyBlbmRpZgorIyBpZm5kZWYgR2V0U3RvY2tCcnVzaAorIyAgZGVmaW5lICAgICBHZXRTdG9ja0JydXNoKGkpICAgICAoKEhCUlVTSClHZXRTdG9ja09iamVjdChpKSkKKyMgZW5kaWYKKyMgaWZuZGVmIERlbGV0ZUJydXNoCisjICBkZWZpbmUgICAgIERlbGV0ZUJydXNoKGhicikgICAgIERlbGV0ZU9iamVjdCgoSEdESU9CSikoSEJSVVNIKShoYnIpKQorIyBlbmRpZgorCisjIGlmbmRlZiBIQU5ETEVfV01fUkJVVFRPTkRCTENMSworIyAgZGVmaW5lIEhBTkRMRV9XTV9SQlVUVE9OREJMQ0xLKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgVFJVRSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX01CVVRUT05VUAorIyAgZGVmaW5lIEhBTkRMRV9XTV9NQlVUVE9OVVAoaHduZCwgd1BhcmFtLCBsUGFyYW0sIGZuKSBcCisgICAgKChmbikoKGh3bmQpLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSwgKGludCkoc2hvcnQpSElXT1JEKGxQYXJhbSksIChVSU5UKSh3UGFyYW0pKSwgMEwpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fTUJVVFRPTkRCTENMSworIyAgZGVmaW5lIEhBTkRMRV9XTV9NQlVUVE9OREJMQ0xLKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgVFJVRSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX0xCVVRUT05EQkxDTEsKKyMgIGRlZmluZSBIQU5ETEVfV01fTEJVVFRPTkRCTENMSyhod25kLCB3UGFyYW0sIGxQYXJhbSwgZm4pIFwKKyAgICAoKGZuKSgoaHduZCksIFRSVUUsIChpbnQpKHNob3J0KUxPV09SRChsUGFyYW0pLCAoaW50KShzaG9ydClISVdPUkQobFBhcmFtKSwgKFVJTlQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9SQlVUVE9ORE9XTgorIyAgZGVmaW5lIEhBTkRMRV9XTV9SQlVUVE9ORE9XTihod25kLCB3UGFyYW0sIGxQYXJhbSwgZm4pIFwKKyAgICAoKGZuKSgoaHduZCksIEZBTFNFLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSwgKGludCkoc2hvcnQpSElXT1JEKGxQYXJhbSksIChVSU5UKSh3UGFyYW0pKSwgMEwpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fTU9VU0VNT1ZFCisjICBkZWZpbmUgSEFORExFX1dNX01PVVNFTU9WRShod25kLCB3UGFyYW0sIGxQYXJhbSwgZm4pIFwKKyAgICAoKGZuKSgoaHduZCksIChpbnQpKHNob3J0KUxPV09SRChsUGFyYW0pLCAoaW50KShzaG9ydClISVdPUkQobFBhcmFtKSwgKFVJTlQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9SQlVUVE9OVVAKKyMgIGRlZmluZSBIQU5ETEVfV01fUkJVVFRPTlVQKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX01CVVRUT05ET1dOCisjICBkZWZpbmUgSEFORExFX1dNX01CVVRUT05ET1dOKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgRkFMU0UsIChpbnQpKHNob3J0KUxPV09SRChsUGFyYW0pLCAoaW50KShzaG9ydClISVdPUkQobFBhcmFtKSwgKFVJTlQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9MQlVUVE9OVVAKKyMgIGRlZmluZSBIQU5ETEVfV01fTEJVVFRPTlVQKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSksIChpbnQpKHNob3J0KUhJV09SRChsUGFyYW0pLCAoVUlOVCkod1BhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX0xCVVRUT05ET1dOCisjICBkZWZpbmUgSEFORExFX1dNX0xCVVRUT05ET1dOKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgRkFMU0UsIChpbnQpKHNob3J0KUxPV09SRChsUGFyYW0pLCAoaW50KShzaG9ydClISVdPUkQobFBhcmFtKSwgKFVJTlQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9TWVNDSEFSCisjICBkZWZpbmUgSEFORExFX1dNX1NZU0NIQVIoaHduZCwgd1BhcmFtLCBsUGFyYW0sIGZuKSBcCisgICAgKChmbikoKGh3bmQpLCAoVENIQVIpKHdQYXJhbSksIChpbnQpKHNob3J0KUxPV09SRChsUGFyYW0pKSwgMEwpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fQUNUSVZBVEVBUFAKKyMgIGRlZmluZSBIQU5ETEVfV01fQUNUSVZBVEVBUFAoaHduZCwgd1BhcmFtLCBsUGFyYW0sIGZuKSBcCisgICAgKChmbikoKGh3bmQpLCAoQk9PTCkod1BhcmFtKSwgKERXT1JEKShsUGFyYW0pKSwgMEwpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fV0lORE9XUE9TQ0hBTkdJTkcKKyMgIGRlZmluZSBIQU5ETEVfV01fV0lORE9XUE9TQ0hBTkdJTkcoaHduZCwgd1BhcmFtLCBsUGFyYW0sIGZuKSBcCisgICAgKExSRVNVTFQpKERXT1JEKShCT09MKShmbikoKGh3bmQpLCAoTFBXSU5ET1dQT1MpKGxQYXJhbSkpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fVlNDUk9MTAorIyAgZGVmaW5lIEhBTkRMRV9XTV9WU0NST0xMKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKEhXTkQpKGxQYXJhbSksIChVSU5UKShMT1dPUkQod1BhcmFtKSksICAoaW50KShzaG9ydClISVdPUkQod1BhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX1NFVEZPQ1VTCisjICBkZWZpbmUgSEFORExFX1dNX1NFVEZPQ1VTKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKEhXTkQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9LSUxMRk9DVVMKKyMgIGRlZmluZSBIQU5ETEVfV01fS0lMTEZPQ1VTKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKEhXTkQpKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9IU0NST0xMCisjICBkZWZpbmUgSEFORExFX1dNX0hTQ1JPTEwoaHduZCwgd1BhcmFtLCBsUGFyYW0sIGZuKSBcCisgICAgKChmbikoKGh3bmQpLCAoSFdORCkobFBhcmFtKSwgKFVJTlQpKExPV09SRCh3UGFyYW0pKSwgKGludCkoc2hvcnQpSElXT1JEKHdQYXJhbSkpLCAwTCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBTkRMRV9XTV9EUk9QRklMRVMKKyMgIGRlZmluZSBIQU5ETEVfV01fRFJPUEZJTEVTKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKEhEUk9QKSh3UGFyYW0pKSwgMEwpCisjIGVuZGlmCisjIGlmbmRlZiBIQU5ETEVfV01fQ0hBUgorIyAgZGVmaW5lIEhBTkRMRV9XTV9DSEFSKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKFRDSEFSKSh3UGFyYW0pLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX1NZU0RFQURDSEFSCisjICBkZWZpbmUgSEFORExFX1dNX1NZU0RFQURDSEFSKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKFRDSEFSKSh3UGFyYW0pLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSksIDBMKQorIyBlbmRpZgorIyBpZm5kZWYgSEFORExFX1dNX0RFQURDSEFSCisjICBkZWZpbmUgSEFORExFX1dNX0RFQURDSEFSKGh3bmQsIHdQYXJhbSwgbFBhcmFtLCBmbikgXAorICAgICgoZm4pKChod25kKSwgKFRDSEFSKSh3UGFyYW0pLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSksIDBMKQorIyBlbmRpZgorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisKKworLyogU29tZSBwYXJhbWV0ZXJzIGZvciB0ZWFyb2ZmIG1lbnVzLiAgQWxsIGluIHBpeGVscy4gKi8KKyNkZWZpbmUgVEVBUk9GRl9QQURESU5HX1gJMgorI2RlZmluZSBURUFST0ZGX0JVVFRPTl9QQURfWAk4CisjZGVmaW5lIFRFQVJPRkZfTUlOX1dJRFRICTIwMAorI2RlZmluZSBURUFST0ZGX1NVQk1FTlVfTEFCRUwJIj4+IgorI2RlZmluZSBURUFST0ZGX0NPTFVNTl9QQURESU5HCTMJLy8gIyBzcGFjZXMgdG8gcGFkIGNvbHVtbiB3aXRoLgorCisKKy8qIEZvciB0aGUgSW50ZWxsaW1vdXNlOiAqLworI2lmbmRlZiBXTV9NT1VTRVdIRUVMCisjZGVmaW5lIFdNX01PVVNFV0hFRUwJMHgyMGEKKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUX0JFVkFMCisjIGRlZmluZSBJRF9CRVZBTF9UT09MVElQICAgMjAwCisjIGRlZmluZSBCRVZBTF9URVhUX0xFTgkgICAgTUFYUEFUSEwKKworc3RhdGljIHZvaWQgbWFrZV90b29sdGlwIF9fQVJHUygoQmFsbG9vbkV2YWwgKmJldmFsLCBjaGFyICp0ZXh0LCBQT0lOVCBwdCkpOworc3RhdGljIHZvaWQgZGVsZXRlX3Rvb2x0aXAgX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwpKTsKK3N0YXRpYyBWT0lEIENBTExCQUNLIEJldmFsVGltZXJQcm9jIF9fQVJHUygoSFdORCBod25kLCBVSU5UIHVNc2csIFVJTlQgaWRFdmVudCwgRFdPUkQgZHdUaW1lKSk7CisKK3N0YXRpYyBCYWxsb29uRXZhbCAgKmN1cl9iZXZhbCA9IE5VTEw7CitzdGF0aWMgVUlOVAkgICAgQmV2YWxUaW1lcklkID0gMDsKK3N0YXRpYyBEV09SRAkgICAgTGFzdEFjdGl2aXR5ID0gMDsKKyNlbmRpZgorCisvKiBMb2NhbCB2YXJpYWJsZXM6ICovCisKKyNpZmRlZiBGRUFUX01FTlUKK3N0YXRpYyBVSU5UCXNfbWVudV9pZCA9IDEwMDsKKworLyoKKyAqIFVzZSB0aGUgc3lzdGVtIGZvbnQgZm9yIGRpYWxvZ3MgYW5kIHRlYXItb2ZmIG1lbnVzLiAgUmVtb3ZlIHRoaXMgbGluZSB0bworICogdXNlIERMR19GT05UX05BTUUuCisgKi8KKyMgZGVmaW5lIFVTRV9TWVNNRU5VX0ZPTlQKKyNlbmRpZgorCisjZGVmaW5lIFZJTV9OQU1FCSJ2aW0iCisjZGVmaW5lIFZJTV9DTEFTUwkiVmltIgorI2RlZmluZSBWSU1fQ0xBU1NXCUwiVmltIgorCisvKiBJbml0aWFsIHNpemUgZm9yIHRoZSBkaWFsb2cgdGVtcGxhdGUuICBGb3IgZ3VpX21jaF9kaWFsb2coKSBpdCdzIGZpeGVkLAorICogdGh1cyB0aGVyZSBzaG91bGQgYmUgcm9vbSBmb3IgZXZlcnkgZGlhbG9nLiAgRm9yIHRlYXJvZmZzIGl0J3MgbWFkZSBiaWdnZXIKKyAqIHdoZW4gbmVlZGVkLiAqLworI2RlZmluZSBETEdfQUxMT0NfU0laRSAxNiAqIDEwMjQKKworLyoKKyAqIHN0dWZmIGZvciBkaWFsb2dzLCBtZW51cywgdGVhcm9mZnMgZXRjLgorICovCitzdGF0aWMgTFJFU1VMVCBBUElFTlRSWSBkaWFsb2dfY2FsbGJhY2soSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworc3RhdGljIExSRVNVTFQgQVBJRU5UUlkgdGVhcm9mZl9jYWxsYmFjayhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7CitzdGF0aWMgUFdPUkQKK2FkZF9kaWFsb2dfZWxlbWVudCgKKwlQV09SRCBwLAorCURXT1JEIGxTdHlsZSwKKwlXT1JEIHgsCisJV09SRCB5LAorCVdPUkQgdywKKwlXT1JEIGgsCisJV09SRCBJZCwKKwlXT1JEIGNsc3MsCisJY29uc3QgY2hhciAqY2FwdGlvbik7CitzdGF0aWMgTFBXT1JEIGxwd0FsaWduKExQV09SRCk7CitzdGF0aWMgaW50IG5Db3B5QW5zaVRvV2lkZUNoYXIoTFBXT1JELCBMUFNUUik7CitzdGF0aWMgdm9pZCBndWlfbWNoX3RlYXJvZmYoY2hhcl91ICp0aXRsZSwgdmltbWVudV9UICptZW51LCBpbnQgaW5pdFgsIGludCBpbml0WSk7CitzdGF0aWMgdm9pZCBnZXRfZGlhbG9nX2ZvbnRfbWV0cmljcyh2b2lkKTsKKworc3RhdGljIGludCBkaWFsb2dfZGVmYXVsdF9idXR0b24gPSAtMTsKKworLyogSW50ZWxsaW1vdXNlIHN1cHBvcnQgKi8KK3N0YXRpYyBpbnQgbW91c2Vfc2Nyb2xsX2xpbmVzID0gMDsKK3N0YXRpYyBVSU5UIG1zaF9tc2dtb3VzZXdoZWVsID0gMDsKKworc3RhdGljIGludAlzX3VzZW5ld2xvb2s7CSAgICAvKiBlbXVsYXRlIFc5NS9OVDQgbm9uLWJvbGQgZGlhbG9ncyAqLworI2lmZGVmIEZFQVRfVE9PTEJBUgorc3RhdGljIHZvaWQgaW5pdGlhbGlzZV90b29sYmFyKHZvaWQpOworc3RhdGljIGludCBnZXRfdG9vbGJhcl9iaXRtYXAodmltbWVudV9UICptZW51KTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURV9JTUUKK3N0YXRpYyBMUkVTVUxUIF9PbkltZUNvbXBvc2l0aW9uKEhXTkQgaHduZCwgV1BBUkFNIGRiY3MsIExQQVJBTSBwYXJhbSk7CitzdGF0aWMgY2hhcl91ICpHZXRSZXN1bHRTdHIoSFdORCBod25kLCBpbnQgR0NTLCBpbnQgKmxlbnApOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX01CWVRFX0lNRSkgJiYgZGVmaW5lZChEWU5BTUlDX0lNRSkKKyMgaWZkZWYgTk9JTUUKK3R5cGVkZWYgc3RydWN0IHRhZ0NPTVBPU0lUSU9ORk9STSB7CisgICAgRFdPUkQgZHdTdHlsZTsKKyAgICBQT0lOVCBwdEN1cnJlbnRQb3M7CisgICAgUkVDVCAgcmNBcmVhOworfSBDT01QT1NJVElPTkZPUk0sICpQQ09NUE9TSVRJT05GT1JNLCBORUFSICpOUENPTVBPU0lUSU9ORk9STSwgRkFSICpMUENPTVBPU0lUSU9ORk9STTsKK3R5cGVkZWYgSEFORExFIEhJTUM7CisjIGVuZGlmCisKK0hJTlNUQU5DRSBoTGliSW1tID0gTlVMTDsKK0xPTkcgKFdJTkFQSSAqcEltbUdldENvbXBvc2l0aW9uU3RyaW5nQSkoSElNQywgRFdPUkQsIExQVk9JRCwgRFdPUkQpOworTE9ORyAoV0lOQVBJICpwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdXKShISU1DLCBEV09SRCwgTFBWT0lELCBEV09SRCk7CitISU1DIChXSU5BUEkgKnBJbW1HZXRDb250ZXh0KShIV05EKTsKK0hJTUMgKFdJTkFQSSAqcEltbUFzc29jaWF0ZUNvbnRleHQpKEhXTkQsIEhJTUMpOworQk9PTCAoV0lOQVBJICpwSW1tUmVsZWFzZUNvbnRleHQpKEhXTkQsIEhJTUMpOworQk9PTCAoV0lOQVBJICpwSW1tR2V0T3BlblN0YXR1cykoSElNQyk7CitCT09MIChXSU5BUEkgKnBJbW1TZXRPcGVuU3RhdHVzKShISU1DLCBCT09MKTsKK0JPT0wgKFdJTkFQSSAqcEltbUdldENvbXBvc2l0aW9uRm9udCkoSElNQywgTFBMT0dGT05UQSk7CitCT09MIChXSU5BUEkgKnBJbW1TZXRDb21wb3NpdGlvbkZvbnQpKEhJTUMsIExQTE9HRk9OVEEpOworQk9PTCAoV0lOQVBJICpwSW1tU2V0Q29tcG9zaXRpb25XaW5kb3cpKEhJTUMsIExQQ09NUE9TSVRJT05GT1JNKTsKK0JPT0wgKFdJTkFQSSAqcEltbUdldENvbnZlcnNpb25TdGF0dXMpKEhJTUMsIExQRFdPUkQsIExQRFdPUkQpOworc3RhdGljIHZvaWQgZHluX2ltbV9sb2FkKHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIHBJbW1HZXRDb21wb3NpdGlvblN0cmluZ0EgSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBCisjIGRlZmluZSBwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdXIEltbUdldENvbXBvc2l0aW9uU3RyaW5nVworIyBkZWZpbmUgcEltbUdldENvbnRleHQJCSAgSW1tR2V0Q29udGV4dAorIyBkZWZpbmUgcEltbUFzc29jaWF0ZUNvbnRleHQJICBJbW1Bc3NvY2lhdGVDb250ZXh0CisjIGRlZmluZSBwSW1tUmVsZWFzZUNvbnRleHQJICBJbW1SZWxlYXNlQ29udGV4dAorIyBkZWZpbmUgcEltbUdldE9wZW5TdGF0dXMJICBJbW1HZXRPcGVuU3RhdHVzCisjIGRlZmluZSBwSW1tU2V0T3BlblN0YXR1cwkgIEltbVNldE9wZW5TdGF0dXMKKyMgZGVmaW5lIHBJbW1HZXRDb21wb3NpdGlvbkZvbnQgICBJbW1HZXRDb21wb3NpdGlvbkZvbnRBCisjIGRlZmluZSBwSW1tU2V0Q29tcG9zaXRpb25Gb250ICAgSW1tU2V0Q29tcG9zaXRpb25Gb250QQorIyBkZWZpbmUgcEltbVNldENvbXBvc2l0aW9uV2luZG93IEltbVNldENvbXBvc2l0aW9uV2luZG93CisjIGRlZmluZSBwSW1tR2V0Q29udmVyc2lvblN0YXR1cyAgSW1tR2V0Q29udmVyc2lvblN0YXR1cworI2VuZGlmCisKKyNpZm5kZWYgRVRPX0lHTk9SRUxBTkdVQUdFCisjIGRlZmluZSBFVE9fSUdOT1JFTEFOR1VBR0UgIDB4MTAwMAorI2VuZGlmCisKKy8qIG11bHRpIG1vbml0b3Igc3VwcG9ydCAqLwordHlwZWRlZiBzdHJ1Y3QgX01PTklUT1JJTkZPc3RydWN0Cit7CisgICAgRFdPUkQgY2JTaXplOworICAgIFJFQ1QgcmNNb25pdG9yOworICAgIFJFQ1QgcmNXb3JrOworICAgIERXT1JEIGR3RmxhZ3M7Cit9IF9NT05JVE9SSU5GTzsKKwordHlwZWRlZiBIQU5ETEUgX0hNT05JVE9SOwordHlwZWRlZiBfSE1PTklUT1IgKFdJTkFQSSAqVE1vbml0b3JGcm9tV2luZG93KShIV05ELCBEV09SRCk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqVEdldE1vbml0b3JJbmZvKShfSE1PTklUT1IsIF9NT05JVE9SSU5GTyAqKTsKKworc3RhdGljIFRNb25pdG9yRnJvbVdpbmRvdyAgIHBNb25pdG9yRnJvbVdpbmRvdyA9IE5VTEw7CitzdGF0aWMgVEdldE1vbml0b3JJbmZvCSAgICBwR2V0TW9uaXRvckluZm8gPSBOVUxMOworc3RhdGljIEhBTkRMRQkJICAgIHVzZXIzMl9saWIgPSBOVUxMOworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworaW50IFdTSW5pdGlhbGl6ZWQgPSBGQUxTRTsgLyogV2luU29jayBpcyBpbml0aWFsaXplZCAqLworI2VuZGlmCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MgTlQgMy54IG9yIFdpbjMycywgYm90aCBvZiB3aGljaCBoYXZlCisgKiBsZXNzIGZhbmN5IEdVSSBBUElzLgorICovCisgICAgc3RhdGljIGludAoraXNfd2lubnRfMyh2b2lkKQoreworICAgIHJldHVybiAoKG9zX3ZlcnNpb24uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVAorCQkmJiBvc192ZXJzaW9uLmR3TWFqb3JWZXJzaW9uID09IDMpCisJICAgIHx8IChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJzKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luMzJzLgorICovCisgICAgaW50CitndWlfaXNfd2luMzJzKHZvaWQpCit7CisgICAgcmV0dXJuIChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJzKTsKK30KKworI2lmZGVmIEZFQVRfTUVOVQorLyoKKyAqIEZpZ3VyZSBvdXQgaG93IGhpZ2ggdGhlIG1lbnUgYmFyIGlzIGF0IHRoZSBtb21lbnQuCisgKi8KKyAgICBzdGF0aWMgaW50CitndWlfbXN3aW5fZ2V0X21lbnVfaGVpZ2h0KAorICAgIGludAkgICAgZml4X3dpbmRvdykJICAgIC8qIElmIFRSVUUsIHJlc2l6ZSB3aW5kb3cgaWYgbWVudSBoZWlnaHQgY2hhbmdlZCAqLworeworICAgIHN0YXRpYyBpbnQJb2xkX21lbnVfaGVpZ2h0ID0gLTE7CisKKyAgICBSRUNUICAgIHJjMSwgcmMyOworICAgIGludAkgICAgbnVtOworICAgIGludAkgICAgbWVudV9oZWlnaHQ7CisKKyAgICBpZiAoZ3VpLm1lbnVfaXNfYWN0aXZlKQorCW51bSA9IEdldE1lbnVJdGVtQ291bnQoc19tZW51QmFyKTsKKyAgICBlbHNlCisJbnVtID0gMDsKKworICAgIGlmIChudW0gPT0gMCkKKwltZW51X2hlaWdodCA9IDA7CisgICAgZWxzZQorICAgIHsKKwlpZiAoaXNfd2lubnRfMygpKQkvKiBmb3IgTlQgMy54eCAqLworCXsKKwkgICAgaWYgKGd1aS5zdGFydGluZykKKwkJbWVudV9oZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZTUVOVSk7CisJICAgIGVsc2UKKwkgICAgeworCQlSRUNUIHIxLCByMjsKKwkJaW50IGZyYW1laHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpOworCQlpbnQgY2FwaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTik7CisKKwkJLyogZ2V0IHdpbmRvdyByZWN0IG9mIHNfaHduZAorCQkgKiBnZXQgY2xpZW50IHJlY3Qgb2Ygc19od25kCisJCSAqIGdldCBjYXAgaGVpZ2h0CisJCSAqIHN1YnRyYWN0IGZyb20gd2luZG93IHJlY3QsIHRoZSBzdW0gb2YgY2xpZW50IGhlaWdodCwKKwkJICogKGlmIG5vdCBtYXhpbWl6ZWQpZnJhbWUgdGhpY2tuZXNzLCBhbmQgY2FwdGlvbiBoZWlnaHQuCisJCSAqLworCQlHZXRXaW5kb3dSZWN0KHNfaHduZCwgJnIxKTsKKwkJR2V0Q2xpZW50UmVjdChzX2h3bmQsICZyMik7CisJCW1lbnVfaGVpZ2h0ID0gcjEuYm90dG9tIC0gcjEudG9wIC0gKHIyLmJvdHRvbSAtIHIyLnRvcAorCQkJCSArIDIgKiBmcmFtZWh0ICogKCFJc1pvb21lZChzX2h3bmQpKSArIGNhcGh0KTsKKwkgICAgfQorCX0KKwllbHNlCQkJLyogd2luOTUgYW5kIHZhcmlhbnRzIChOVCA0LjAsIEkgZ3Vlc3MpICovCisJeworCSAgICAvKgorCSAgICAgKiBJbiBjYXNlICdsaW5lcycgaXMgc2V0IGluIF92aW1yYy9fZ3ZpbXJjIHdpbmRvdyB3aWR0aCBkb2Vzbid0CisJICAgICAqIHNlZW0gdG8gaGF2ZSBiZWVuIHNldCB5ZXQsIHNvIG1lbnUgd3JhcHMgaW4gZGVmYXVsdCB3aW5kb3cKKwkgICAgICogd2lkdGggd2hpY2ggaXMgdmVyeSBuYXJyb3cuICBJbnN0ZWFkIGp1c3QgcmV0dXJuIGhlaWdodCBvZiBhCisJICAgICAqIHNpbmdsZSBtZW51IGl0ZW0uICBXaWxsIHN0aWxsIGJlIHdyb25nIHdoZW4gdGhlIG1lbnUgcmVhbGx5CisJICAgICAqIHNob3VsZCB3cmFwIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLgorCSAgICAgKi8KKwkgICAgR2V0TWVudUl0ZW1SZWN0KHNfaHduZCwgc19tZW51QmFyLCAwLCAmcmMxKTsKKwkgICAgaWYgKGd1aS5zdGFydGluZykKKwkJbWVudV9oZWlnaHQgPSByYzEuYm90dG9tIC0gcmMxLnRvcCArIDE7CisJICAgIGVsc2UKKwkgICAgeworCQlHZXRNZW51SXRlbVJlY3Qoc19od25kLCBzX21lbnVCYXIsIG51bSAtIDEsICZyYzIpOworCQltZW51X2hlaWdodCA9IHJjMi5ib3R0b20gLSByYzEudG9wICsgMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZml4X3dpbmRvdyAmJiBtZW51X2hlaWdodCAhPSBvbGRfbWVudV9oZWlnaHQpCisgICAgeworCW9sZF9tZW51X2hlaWdodCA9IG1lbnVfaGVpZ2h0OworCWd1aV9zZXRfc2hlbGxzaXplKEZBTFNFLCBGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIG1lbnVfaGVpZ2h0OworfQorI2VuZGlmIC8qRkVBVF9NRU5VKi8KKworCisvKgorICogU2V0dXAgZm9yIHRoZSBJbnRlbGxpbW91c2UKKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X21vdXNlX3doZWVsKHZvaWQpCit7CisKKyNpZm5kZWYgU1BJX0dFVFdIRUVMU0NST0xMTElORVMKKyMgZGVmaW5lIFNQSV9HRVRXSEVFTFNDUk9MTExJTkVTICAgIDEwNAorI2VuZGlmCisKKyNkZWZpbmUgVk1PVVNFWl9DTEFTU05BTUUgICJNb3VzZVoiCQkvKiBoaWRkZW4gd2hlZWwgd2luZG93IGNsYXNzICovCisjZGVmaW5lIFZNT1VTRVpfVElUTEUgICAgICAiTWFnZWxsYW4gTVNXSEVFTCIJLyogaGlkZGVuIHdoZWVsIHdpbmRvdyB0aXRsZSAqLworI2RlZmluZSBWTVNIX01PVVNFV0hFRUwgICAgIk1TV0hFRUxfUk9MTE1TRyIKKyNkZWZpbmUgVk1TSF9TQ1JPTExfTElORVMgICJNU0hfU0NST0xMX0xJTkVTX01TRyIKKworICAgIEhXTkQgaGRsX21zd2hlZWw7CisgICAgVUlOVCBtc2hfbXNnc2Nyb2xsbGluZXM7CisKKyAgICBtc2hfbXNnbW91c2V3aGVlbCA9IDA7CisgICAgbW91c2Vfc2Nyb2xsX2xpbmVzID0gMzsJLyogcmVhc29uYWJsZSBkZWZhdWx0ICovCisKKyAgICBpZiAoKG9zX3ZlcnNpb24uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVAorCQkmJiBvc192ZXJzaW9uLmR3TWFqb3JWZXJzaW9uID49IDQpCisJICAgIHx8IChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUworCQkmJiAoKG9zX3ZlcnNpb24uZHdNYWpvclZlcnNpb24gPT0gNAorCQkJJiYgb3NfdmVyc2lvbi5kd01pbm9yVmVyc2lvbiA+PSAxMCkKKwkJICAgIHx8IG9zX3ZlcnNpb24uZHdNYWpvclZlcnNpb24gPj0gNSkpKQorICAgIHsKKwkvKiBpZiBOVCA0LjArIChvciBXaW45OCkgZ2V0IHNjcm9sbCBsaW5lcyBkaXJlY3RseSBmcm9tIHN5c3RlbSAqLworCVN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVRXSEVFTFNDUk9MTExJTkVTLCAwLAorCQkmbW91c2Vfc2Nyb2xsX2xpbmVzLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAob3NfdmVyc2lvbi5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MKKwkgICAgfHwgKG9zX3ZlcnNpb24uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVAorCQkmJiBvc192ZXJzaW9uLmR3TWFqb3JWZXJzaW9uIDwgNCkpCisgICAgewkvKgorCSAqIElmIFdpbjk1IG9yIE5UIDMuNTEsCisJICogdHJ5IHRvIGZpbmQgdGhlIGhpZGRlbiBwb2ludDMyIHdpbmRvdy4KKwkgKi8KKwloZGxfbXN3aGVlbCA9IEZpbmRXaW5kb3coVk1PVVNFWl9DTEFTU05BTUUsIFZNT1VTRVpfVElUTEUpOworCWlmIChoZGxfbXN3aGVlbCkKKwl7CisJICAgIG1zaF9tc2dzY3JvbGxsaW5lcyA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShWTVNIX1NDUk9MTF9MSU5FUyk7CisJICAgIGlmIChtc2hfbXNnc2Nyb2xsbGluZXMpCisJICAgIHsKKwkJbW91c2Vfc2Nyb2xsX2xpbmVzID0gKGludClTZW5kTWVzc2FnZShoZGxfbXN3aGVlbCwKKwkJCW1zaF9tc2dzY3JvbGxsaW5lcywgMCwgMCk7CisJCW1zaF9tc2dtb3VzZXdoZWVsICA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShWTVNIX01PVVNFV0hFRUwpOworCSAgICB9CisJfQorICAgIH0KK30KKworCisvKiBJbnRlbGxpbW91c2Ugd2hlZWwgaGFuZGxlciAqLworICAgIHN0YXRpYyB2b2lkCitfT25Nb3VzZVdoZWVsKAorICAgIEhXTkQgaHduZCwKKyAgICBzaG9ydCB6RGVsdGEpCit7CisvKiBUcmVhdCBhIG1vdXNlIHdoZWVsIGV2ZW50IGFzIGlmIGl0IHdlcmUgYSBzY3JvbGwgcmVxdWVzdCAqLworICAgIGludCBpOworICAgIGludCBzaXplOworICAgIEhXTkQgaHduZEN0bDsKKworICAgIGlmIChjdXJ3aW4tPndfc2Nyb2xsYmFyc1tTQkFSX1JJR0hUXS5pZCAhPSAwKQorICAgIHsKKwlod25kQ3RsID0gY3Vyd2luLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0uaWQ7CisJc2l6ZSA9IGN1cndpbi0+d19zY3JvbGxiYXJzW1NCQVJfUklHSFRdLnNpemU7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cndpbi0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uaWQgIT0gMCkKKyAgICB7CisJaHduZEN0bCA9IGN1cndpbi0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uaWQ7CisJc2l6ZSA9IGN1cndpbi0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uc2l6ZTsKKyAgICB9CisgICAgZWxzZQorCXJldHVybjsKKworICAgIHNpemUgPSBjdXJ3aW4tPndfaGVpZ2h0OworICAgIGlmIChtb3VzZV9zY3JvbGxfbGluZXMgPT0gMCkKKwlpbml0X21vdXNlX3doZWVsKCk7CisKKyAgICBpZiAobW91c2Vfc2Nyb2xsX2xpbmVzID4gMAorCSAgICAmJiBtb3VzZV9zY3JvbGxfbGluZXMgPCAoc2l6ZSA+IDIgPyBzaXplIC0gMiA6IDEpKQorICAgIHsKKwlmb3IgKGkgPSBtb3VzZV9zY3JvbGxfbGluZXM7IGkgPiAwOyAtLWkpCisJICAgIF9PblNjcm9sbChod25kLCBod25kQ3RsLCB6RGVsdGEgPj0gMCA/IFNCX0xJTkVVUCA6IFNCX0xJTkVET1dOLCAwKTsKKyAgICB9CisgICAgZWxzZQorCV9PblNjcm9sbChod25kLCBod25kQ3RsLCB6RGVsdGEgPj0gMCA/IFNCX1BBR0VVUCA6IFNCX1BBR0VET1dOLCAwKTsKK30KKworI2lmIDAJLyogZGlzYWJsZWQsIGEgZ2FwIGFwcGVhcnMgYmVsb3cgYW5kIGJlc2lkZSB0aGUgd2luZG93LCBhbmQgdGhlIHdpbmRvdworCSAgIGNhbiBiZSBtb3ZlZCAoaW4gYSBzdHJhbmdlIHdheSkgKi8KKy8qCisgKiBFdmVuIHRob3VnaCB3ZSBoYXZlIF9EdXJpbmdTaXppbmcoKSB3aGljaCBtYWtlcyB0aGUgcnViYmVyIGJhbmQgYSB2YWxpZAorICogc2l6ZSwgd2UgbmVlZCB0aGlzIGZvciB3aGVuIHRoZSB1c2VyIG1heGltaXNlcyB0aGUgd2luZG93LgorICogVE9ETzogRG9lc24ndCBzZWVtIHRvIGFkanVzdCB0aGUgd2lkdGggdGhvdWdoIGZvciBzb21lIHJlYXNvbi4KKyAqLworICAgIHN0YXRpYyBCT09MCitfT25XaW5kb3dQb3NDaGFuZ2luZygKKyAgICBIV05EIGh3bmQsCisgICAgTFBXSU5ET1dQT1MgbHB3cG9zKQoreworICAgIFJFQ1QgICAgd29ya2FyZWFfcmVjdDsKKworICAgIGlmICghKGxwd3Bvcy0+ZmxhZ3MgJiBTV1BfTk9TSVpFKSkKKyAgICB7CisJaWYgKElzTWF4aW1pemVkKGh3bmQpCisJCSYmIChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUworCQkgICAgfHwgKG9zX3ZlcnNpb24uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVAorCQkJJiYgb3NfdmVyc2lvbi5kd01ham9yVmVyc2lvbiA+PSA0KSkpCisJeworCSAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbyhTUElfR0VUV09SS0FSRUEsIDAsICZ3b3JrYXJlYV9yZWN0LCAwKTsKKwkgICAgbHB3cG9zLT54ID0gd29ya2FyZWFfcmVjdC5sZWZ0OworCSAgICBscHdwb3MtPnkgPSB3b3JrYXJlYV9yZWN0LnRvcDsKKwkgICAgbHB3cG9zLT5jeCA9IHdvcmthcmVhX3JlY3QucmlnaHQgLSB3b3JrYXJlYV9yZWN0LmxlZnQ7CisJICAgIGxwd3Bvcy0+Y3kgPSB3b3JrYXJlYV9yZWN0LmJvdHRvbSAtIHdvcmthcmVhX3JlY3QudG9wOworCX0KKwlndWlfbXN3aW5fZ2V0X3ZhbGlkX2RpbWVuc2lvbnMobHB3cG9zLT5jeCwgbHB3cG9zLT5jeSwKKwkJCQkgICAgICZscHdwb3MtPmN4LCAmbHB3cG9zLT5jeSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBzdGF0aWMgdm9pZAorX09uV2luZG93UG9zQ2hhbmdlZCgKKyAgICBIV05EIGh3bmQsCisgICAgY29uc3QgTFBXSU5ET1dQT1MgbHB3cG9zKQoreworICAgIHN0YXRpYyBpbnQgeCA9IDAsIHkgPSAwLCBjeCA9IDAsIGN5ID0gMDsKKworICAgIGlmIChXU0luaXRpYWxpemVkICYmIChscHdwb3MtPnggIT0geCB8fCBscHdwb3MtPnkgIT0geQorCQkJCSAgICAgfHwgbHB3cG9zLT5jeCAhPSBjeCB8fCBscHdwb3MtPmN5ICE9IGN5KSkKKyAgICB7CisJeCA9IGxwd3Bvcy0+eDsKKwl5ID0gbHB3cG9zLT55OworCWN4ID0gbHB3cG9zLT5jeDsKKwljeSA9IGxwd3Bvcy0+Y3k7CisJbmV0YmVhbnNfZnJhbWVfbW92ZWQoeCwgeSk7CisgICAgfQorICAgIC8qIEFsbG93IHRvIHNlbmQgV01fU0laRSBhbmQgV01fTU9WRSAqLworICAgIEZPUldBUkRfV01fV0lORE9XUE9TQ0hBTkdFRChod25kLCBscHdwb3MsIE15V2luZG93UHJvYyk7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyBpbnQKK19EdXJpbmdTaXppbmcoCisgICAgSFdORCBod25kLAorICAgIFVJTlQgZndTaWRlLAorICAgIExQUkVDVCBscHJjKQoreworICAgIGludAkgICAgdywgaDsKKyAgICBpbnQJICAgIHZhbGlkX3csIHZhbGlkX2g7CisgICAgaW50CSAgICB3X29mZnNldCwgaF9vZmZzZXQ7CisKKyAgICB3ID0gbHByYy0+cmlnaHQgLSBscHJjLT5sZWZ0OworICAgIGggPSBscHJjLT5ib3R0b20gLSBscHJjLT50b3A7CisgICAgZ3VpX21zd2luX2dldF92YWxpZF9kaW1lbnNpb25zKHcsIGgsICZ2YWxpZF93LCAmdmFsaWRfaCk7CisgICAgd19vZmZzZXQgPSB3IC0gdmFsaWRfdzsKKyAgICBoX29mZnNldCA9IGggLSB2YWxpZF9oOworCisgICAgaWYgKGZ3U2lkZSA9PSBXTVNaX0xFRlQgfHwgZndTaWRlID09IFdNU1pfVE9QTEVGVAorCQkJICAgIHx8IGZ3U2lkZSA9PSBXTVNaX0JPVFRPTUxFRlQpCisJbHByYy0+bGVmdCArPSB3X29mZnNldDsKKyAgICBlbHNlIGlmIChmd1NpZGUgPT0gV01TWl9SSUdIVCB8fCBmd1NpZGUgPT0gV01TWl9UT1BSSUdIVAorCQkJICAgIHx8IGZ3U2lkZSA9PSBXTVNaX0JPVFRPTVJJR0hUKQorCWxwcmMtPnJpZ2h0IC09IHdfb2Zmc2V0OworCisgICAgaWYgKGZ3U2lkZSA9PSBXTVNaX1RPUCB8fCBmd1NpZGUgPT0gV01TWl9UT1BMRUZUCisJCQkgICAgfHwgZndTaWRlID09IFdNU1pfVE9QUklHSFQpCisJbHByYy0+dG9wICs9IGhfb2Zmc2V0OworICAgIGVsc2UgaWYgKGZ3U2lkZSA9PSBXTVNaX0JPVFRPTSB8fCBmd1NpZGUgPT0gV01TWl9CT1RUT01MRUZUCisJCQkgICAgfHwgZndTaWRlID09IFdNU1pfQk9UVE9NUklHSFQpCisJbHByYy0+Ym90dG9tIC09IGhfb2Zmc2V0OworICAgIHJldHVybiBUUlVFOworfQorCisKKworICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLCitfV25kUHJvYygKKyAgICBIV05EIGh3bmQsCisgICAgVUlOVCB1TXNnLAorICAgIFdQQVJBTSB3UGFyYW0sCisgICAgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICAvKgorICAgIFRSQUNFKCJXbmRQcm9jOiBod25kID0gJTA4eCwgbXNnID0gJXgsIHdQYXJhbSA9ICV4LCBsUGFyYW0gPSAleFxuIiwKKwkgIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAqLworCisgICAgSGFuZGxlTW91c2VIaWRlKHVNc2csIGxQYXJhbSk7CisKKyAgICBzX3VNc2cgPSB1TXNnOworICAgIHNfd1BhcmFtID0gd1BhcmFtOworICAgIHNfbFBhcmFtID0gbFBhcmFtOworCisgICAgc3dpdGNoICh1TXNnKQorICAgIHsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0RFQURDSEFSLAlfT25EZWFkQ2hhcik7CisJSEFORExFX01TRyhod25kLCBXTV9TWVNERUFEQ0hBUiwgX09uRGVhZENoYXIpOworCS8qIEhBTkRMRV9NU0coaHduZCwgV01fQUNUSVZBVEUsICAgIF9PbkFjdGl2YXRlKTsgKi8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0NMT1NFLAlfT25DbG9zZSk7CisJLyogSEFORExFX01TRyhod25kLCBXTV9DT01NQU5ELAlfT25Db21tYW5kKTsgKi8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0RFU1RST1ksCV9PbkRlc3Ryb3kpOworCUhBTkRMRV9NU0coaHduZCwgV01fRFJPUEZJTEVTLAlfT25Ecm9wRmlsZXMpOworCUhBTkRMRV9NU0coaHduZCwgV01fSFNDUk9MTCwJX09uU2Nyb2xsKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0tJTExGT0NVUywJX09uS2lsbEZvY3VzKTsKKyNpZmRlZiBGRUFUX01FTlUKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0NPTU1BTkQsCV9Pbk1lbnUpOworI2VuZGlmCisJLyogSEFORExFX01TRyhod25kLCBXTV9NT1ZFLAkgICAgX09uTW92ZSk7ICovCisJLyogSEFORExFX01TRyhod25kLCBXTV9OQ0FDVElWQVRFLCAgX09uTkNBY3RpdmF0ZSk7ICovCisJSEFORExFX01TRyhod25kLCBXTV9TRVRGT0NVUywJX09uU2V0Rm9jdXMpOworCUhBTkRMRV9NU0coaHduZCwgV01fU0laRSwJX09uU2l6ZSk7CisJLyogSEFORExFX01TRyhod25kLCBXTV9TWVNDT01NQU5ELCAgX09uU3lzQ29tbWFuZCk7ICovCisJLyogSEFORExFX01TRyhod25kLCBXTV9TWVNLRVlET1dOLCAgX09uQWx0S2V5KTsgKi8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1ZTQ1JPTEwsCV9PblNjcm9sbCk7CisJLy8gSEFORExFX01TRyhod25kLCBXTV9XSU5ET1dQT1NDSEFOR0lORywJX09uV2luZG93UG9zQ2hhbmdpbmcpOworCUhBTkRMRV9NU0coaHduZCwgV01fQUNUSVZBVEVBUFAsIF9PbkFjdGl2YXRlQXBwKTsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsIF9PbldpbmRvd1Bvc0NoYW5nZWQpOworI2VuZGlmCisKKyAgICBjYXNlIFdNX1FVRVJZRU5EU0VTU0lPTjoJLyogU3lzdGVtIHdhbnRzIHRvIGdvIGRvd24uICovCisJZ3VpX3NoZWxsX2Nsb3NlZCgpOwkvKiBXaWxsIGV4aXQgd2hlbiBubyBjaGFuZ2VkIGJ1ZmZlcnMuICovCisJcmV0dXJuIEZBTFNFOwkJLyogRG8gTk9UIGFsbG93IHN5c3RlbSB0byBnbyBkb3duLiAqLworCisgICAgY2FzZSBXTV9FTkRTRVNTSU9OOgorCWlmICh3UGFyYW0pCS8qIHN5c3RlbSBvbmx5IHJlYWxseSBnb2VzIGRvd24gd2hlbiB3UGFyYW0gaXMgVFJVRSAqLworCSAgICBfT25FbmRTZXNzaW9uKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX0NIQVI6CisJLyogRG9uJ3QgdXNlIEhBTkRMRV9NU0coKSBmb3IgV01fQ0hBUiwgaXQgdHJ1bmNhdGVzIHdQYXJhbSB0byBhIHNpbmdsZQorCSAqIGJ5dGUgd2hpbGUgd2Ugd2FudCB0aGUgVVRGLTE2IGNoYXJhY3RlciB2YWx1ZS4gKi8KKwlfT25DaGFyKGh3bmQsIHdQYXJhbSwgKGludCkoc2hvcnQpTE9XT1JEKGxQYXJhbSkpOworCXJldHVybiAwTDsKKworICAgIGNhc2UgV01fU1lTQ0hBUjoKKwkvKgorCSAqIGlmICd3aW5hbHRrZXlzJyBpcyAibm8iLCBvciBpdCdzICJtZW51IiBhbmQgaXQncyBub3QgYSBtZW51CisJICogc2hvcnRjdXQga2V5LCBoYW5kbGUgbGlrZSBhIHR5cGVkIEFMVCBrZXksIG90aGVyd2lzZSBjYWxsIFdpbmRvd3MKKwkgKiBBTFQga2V5IGhhbmRsaW5nLgorCSAqLworI2lmZGVmIEZFQVRfTUVOVQorCWlmICgJIWd1aS5tZW51X2lzX2FjdGl2ZQorCQl8fCBwX3dha1swXSA9PSAnbicKKwkJfHwgKHBfd2FrWzBdID09ICdtJyAmJiAhZ3VpX2lzX21lbnVfc2hvcnRjdXQoKGludCl3UGFyYW0pKQorCQkpCisjZW5kaWYKKwl7CisJICAgIF9PblN5c0NoYXIoaHduZCwgd1BhcmFtLCAoaW50KShzaG9ydClMT1dPUkQobFBhcmFtKSk7CisJICAgIHJldHVybiAwTDsKKwl9CisjaWZkZWYgRkVBVF9NRU5VCisJZWxzZQorCSAgICByZXR1cm4gTXlXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyNlbmRpZgorCisgICAgY2FzZSBXTV9TWVNLRVlVUDoKKyNpZmRlZiBGRUFUX01FTlUKKwkvKiBUaGlzIHVzZWQgdG8gYmUgZG9uZSBvbmx5IHdoZW4gbWVudSBpcyBhY3RpdmU6IEFMVCBrZXkgaXMgdXNlZCBmb3IKKwkgKiB0aGF0LiAgQnV0IHRoYXQgY2F1c2VkIHByb2JsZW1zIHdoZW4gbWVudSBpcyBkaXNhYmxlZCBhbmQgdXNpbmcKKwkgKiBBbHQtVGFiLUVzYzogZ2V0IGludG8gYSBzdHJhbmdlIHN0YXRlIHdoZXJlIG5vIG1vdXNlLW1vdmVkIGV2ZW50cworCSAqIGFyZSByZWNlaXZlZCwgbW91c2UgcG9pbnRlciByZW1haW5zIGhpZGRlbi4gKi8KKwlyZXR1cm4gTXlXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKKworICAgIGNhc2UgV01fU0laSU5HOgkvKiBIQU5ETEVfTVNHIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgdGhpcyBvbmUgKi8KKwlyZXR1cm4gX0R1cmluZ1NpemluZyhod25kLCAoVUlOVCl3UGFyYW0sIChMUFJFQ1QpbFBhcmFtKTsKKworICAgIGNhc2UgV01fTU9VU0VXSEVFTDoKKwlfT25Nb3VzZVdoZWVsKGh3bmQsIEhJV09SRCh3UGFyYW0pKTsKKwlicmVhazsKKworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIGNhc2UgV01fTk9USUZZOgorCXN3aXRjaCAoKChMUE5NSERSKSBsUGFyYW0pLT5jb2RlKQorCXsKKwkgICAgY2FzZSBUVE5fTkVFRFRFWFQ6CisJCXsKKwkJICAgIExQVE9PTFRJUFRFWFQJbHB0dHQ7CisJCSAgICBVSU5UCQlpZEJ1dHRvbjsKKwkJICAgIGludAkJCWlkeDsKKwkJICAgIHZpbW1lbnVfVAkJKnBNZW51OworCisJCSAgICBscHR0dCA9IChMUFRPT0xUSVBURVhUKWxQYXJhbTsKKwkJICAgIGlkQnV0dG9uID0gKFVJTlQpIGxwdHR0LT5oZHIuaWRGcm9tOworCQkgICAgcE1lbnUgPSBndWlfbXN3aW5fZmluZF9tZW51KHJvb3RfbWVudSwgaWRCdXR0b24pOworCQkgICAgaWYgKHBNZW51KQorCQkgICAgeworCQkJaWR4ID0gTUVOVV9JTkRFWF9USVA7CisJCQlpZiAocE1lbnUtPnN0cmluZ3NbaWR4XSkKKwkJCXsKKwkJCSAgICBscHR0dC0+aGluc3QgPSBOVUxMOyAgLyogc3RyaW5nLCBub3QgcmVzb3VyY2UgKi8KKwkJCSAgICBscHR0dC0+bHBzelRleHQgPSBwTWVudS0+c3RyaW5nc1tpZHhdOworCQkJfQorCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwl9CisJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1FTlVISU5UUykgJiYgZGVmaW5lZChGRUFUX01FTlUpCisgICAgY2FzZSBXTV9NRU5VU0VMRUNUOgorCWlmICgoKFVJTlQpIEhJV09SRCh3UGFyYW0pCisJCSAgICAmICgweGZmZmYgXiAoTUZfTU9VU0VTRUxFQ1QgKyBNRl9CSVRNQVAgKyBNRl9QT1BVUCkpKQorCQk9PSBNRl9ISUxJVEUKKwkJJiYgKFN0YXRlICYgQ01ETElORSkgPT0gMCkKKwl7CisJICAgIFVJTlQJaWRCdXR0b247CisJICAgIHZpbW1lbnVfVAkqcE1lbnU7CisJICAgIHN0YXRpYyBpbnQJZGlkX21lbnVfdGlwID0gRkFMU0U7CisKKwkgICAgaWYgKGRpZF9tZW51X3RpcCkKKwkgICAgeworCQltc2dfY2xyX2NtZGxpbmUoKTsKKwkJc2V0Y3Vyc29yKCk7CisJCW91dF9mbHVzaCgpOworCQlkaWRfbWVudV90aXAgPSBGQUxTRTsKKwkgICAgfQorCisJICAgIGlkQnV0dG9uID0gKFVJTlQpTE9XT1JEKHdQYXJhbSk7CisJICAgIHBNZW51ID0gZ3VpX21zd2luX2ZpbmRfbWVudShyb290X21lbnUsIGlkQnV0dG9uKTsKKwkgICAgaWYgKHBNZW51ICE9IE5VTEwgJiYgcE1lbnUtPnN0cmluZ3NbTUVOVV9JTkRFWF9USVBdICE9IDAKKwkJICAgICYmIEdldE1lbnVTdGF0ZShzX21lbnVCYXIsIHBNZW51LT5pZCwgTUZfQllDT01NQU5EKSAhPSAtMSkKKwkgICAgeworCQltc2cocE1lbnUtPnN0cmluZ3NbTUVOVV9JTkRFWF9USVBdKTsKKwkJc2V0Y3Vyc29yKCk7CisJCW91dF9mbHVzaCgpOworCQlkaWRfbWVudV90aXAgPSBUUlVFOworCSAgICB9CisJfQorCWJyZWFrOworI2VuZGlmCisgICAgY2FzZSBXTV9OQ0hJVFRFU1Q6CisJeworCSAgICBMUkVTVUxUCXJlc3VsdDsKKwkgICAgaW50CQl4LCB5OworCSAgICBpbnQJCXhQb3MgPSBHRVRfWF9MUEFSQU0obFBhcmFtKTsKKworCSAgICByZXN1bHQgPSBNeVdpbmRvd1Byb2MoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICBpZiAocmVzdWx0ID09IEhUQ0xJRU5UKQorCSAgICB7CisJCWd1aV9tY2hfZ2V0X3dpbnBvcygmeCwgJnkpOworCQl4UG9zIC09IHg7CisKKwkJaWYgKHhQb3MgPCA0OCkgLyogPFZOPiBUT0RPIHNob3VsZCB1c2Ugc3lzdGVtIG1ldHJpYz8gKi8KKwkJICAgIHJldHVybiBIVEJPVFRPTUxFRlQ7CisJCWVsc2UKKwkJICAgIHJldHVybiBIVEJPVFRPTVJJR0hUOworCSAgICB9CisJICAgIGVsc2UKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogYnJlYWs7IG5vdHJlYWNoZWQgKi8KKworI2lmZGVmIEZFQVRfTUJZVEVfSU1FCisgICAgY2FzZSBXTV9JTUVfTk9USUZZOgorCWlmICghX09uSW1lTm90aWZ5KGh3bmQsIChEV09SRCl3UGFyYW0sIChEV09SRClsUGFyYW0pKQorCSAgICByZXR1cm4gTXlXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX0lNRV9DT01QT1NJVElPTjoKKwlpZiAoIV9PbkltZUNvbXBvc2l0aW9uKGh3bmQsIHdQYXJhbSwgbFBhcmFtKSkKKwkgICAgcmV0dXJuIE15V2luZG93UHJvYyhod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisJaWYgKHVNc2cgPT0gbXNoX21zZ21vdXNld2hlZWwgJiYgbXNoX21zZ21vdXNld2hlZWwgIT0gMCkKKwl7ICAgLyogaGFuZGxlIE1TSF9NT1VTRVdIRUVMIG1lc3NhZ2VzIGZvciBJbnRlbGxpbW91c2UgKi8KKwkgICAgX09uTW91c2VXaGVlbChod25kLCBISVdPUkQod1BhcmFtKSk7CisJICAgIGJyZWFrOworCX0KKyNpZmRlZiBNU1dJTl9GSU5EX1JFUExBQ0UKKwllbHNlCisJaWYgKHVNc2cgPT0gc19maW5kcmVwX21zZyAmJiBzX2ZpbmRyZXBfbXNnICE9IDApCisJeworCSAgICBfT25GaW5kUmVwbCgpOworCX0KKyNlbmRpZgorCXJldHVybiBNeVdpbmRvd1Byb2MoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvKgorICogRW5kIG9mIGNhbGwtYmFjayByb3V0aW5lcworICovCisKKy8qIHBhcmVudCB3aW5kb3csIGlmIHNwZWNpZmllZCB3aXRoIC1QICovCitIV05EIHZpbV9wYXJlbnRfaHduZCA9IE5VTEw7CisKKyAgICBzdGF0aWMgQk9PTCBDQUxMQkFDSworRmluZFdpbmRvd1RpdGxlKEhXTkQgaHduZCwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBjaGFyCWJ1ZlsyMDQ4XTsKKyAgICBjaGFyCSp0aXRsZSA9IChjaGFyICopbFBhcmFtOworCisgICAgaWYgKEdldFdpbmRvd1RleHQoaHduZCwgYnVmLCBzaXplb2YoYnVmKSkpCisgICAgeworCWlmIChzdHJzdHIoYnVmLCB0aXRsZSkgIT0gTlVMTCkKKwl7CisJICAgIC8qIEZvdW5kIGl0LiAgU3RvcmUgdGhlIHdpbmRvdyByZWYuIGFuZCBxdWl0IHNlYXJjaGluZy4gKi8KKwkgICAgdmltX3BhcmVudF9od25kID0gRmluZFdpbmRvd0V4KGh3bmQsIE5VTEwsICJNRElDbGllbnQiLCBOVUxMKTsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CS8qIGNvbnRpbnVlIHNlYXJjaGluZyAqLworfQorCisvKgorICogSW52b2tlZCBmb3IgJy1QICJ0aXRsZSInIGFyZ3VtZW50OiBzZWFyY2ggZm9yIHBhcmVudCBhcHBsaWNhdGlvbiB0byBvcGVuCisgKiBvdXIgd2luZG93IGluLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfcGFyZW50KGNoYXIgKnRpdGxlKQoreworICAgIEVudW1XaW5kb3dzKEZpbmRXaW5kb3dUaXRsZSwgKExQQVJBTSl0aXRsZSk7CisgICAgaWYgKHZpbV9wYXJlbnRfaHduZCA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKCJFNjcxOiBDYW5ub3QgZmluZCB3aW5kb3cgdGl0bGUgXCIlc1wiIiksIHRpdGxlKTsKKwltY2hfZXhpdCgyKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorb2xlX2Vycm9yKGNoYXIgKmFyZykKK3sKKyAgICBFTVNHMihfKCJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIpLAorCQkJCQkJCQkJIGFyZyk7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgR1VJIHJlbGF0ZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gIEFueSBhcmd1bWVudHMgdXNlZCBhcmUKKyAqIGRlbGV0ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgorICovCisgICAgdm9pZAorZ3VpX21jaF9wcmVwYXJlKGludCAqYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50CQlzaWxlbnQgPSBGQUxTRTsKKyAgICBpbnQJCWlkeDsKKworICAgIC8qIENoZWNrIGZvciBzcGVjaWFsIE9MRSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyAqLworICAgIGlmICgoKmFyZ2MgPT0gMiB8fCAqYXJnYyA9PSAzKSAmJiAoYXJndlsxXVswXSA9PSAnLScgfHwgYXJndlsxXVswXSA9PSAnLycpKQorICAgIHsKKwkvKiBDaGVjayBmb3IgYSAiLXNpbGVudCIgYXJndW1lbnQgZmlyc3QuICovCisJaWYgKCphcmdjID09IDMgJiYgU1RSSUNNUChhcmd2WzFdICsgMSwgInNpbGVudCIpID09IDAKKwkJJiYgKGFyZ3ZbMl1bMF0gPT0gJy0nIHx8IGFyZ3ZbMl1bMF0gPT0gJy8nKSkKKwl7CisJICAgIHNpbGVudCA9IFRSVUU7CisJICAgIGlkeCA9IDI7CisJfQorCWVsc2UKKwkgICAgaWR4ID0gMTsKKworCS8qIFJlZ2lzdGVyIFZpbSBhcyBhbiBPTEUgQXV0b21hdGlvbiBzZXJ2ZXIgKi8KKwlpZiAoU1RSSUNNUChhcmd2W2lkeF0gKyAxLCAicmVnaXN0ZXIiKSA9PSAwKQorCXsKKyNpZmRlZiBGRUFUX09MRQorCSAgICBSZWdpc3Rlck1lKHNpbGVudCk7CisJICAgIG1jaF9leGl0KDApOworI2Vsc2UKKwkgICAgaWYgKCFzaWxlbnQpCisJCW9sZV9lcnJvcigicmVnaXN0ZXIiKTsKKwkgICAgbWNoX2V4aXQoMik7CisjZW5kaWYKKwl9CisKKwkvKiBVbnJlZ2lzdGVyIFZpbSBhcyBhbiBPTEUgQXV0b21hdGlvbiBzZXJ2ZXIgKi8KKwlpZiAoU1RSSUNNUChhcmd2W2lkeF0gKyAxLCAidW5yZWdpc3RlciIpID09IDApCisJeworI2lmZGVmIEZFQVRfT0xFCisJICAgIFVucmVnaXN0ZXJNZSghc2lsZW50KTsKKwkgICAgbWNoX2V4aXQoMCk7CisjZWxzZQorCSAgICBpZiAoIXNpbGVudCkKKwkJb2xlX2Vycm9yKCJ1bnJlZ2lzdGVyIik7CisJICAgIG1jaF9leGl0KDIpOworI2VuZGlmCisJfQorCisJLyogSWdub3JlIGFuIC1lbWJlZGRpbmcgYXJndW1lbnQuIEl0IGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlCisJICogYXBwbGljYXRpb24gd2FudHMgdG8gdHJlYXQgdGhlIGNhc2Ugd2hlbiBpdCBpcyBzdGFydGVkIG1hbnVhbGx5CisJICogZGlmZmVyZW50bHkgZnJvbSB0aGUgY2FzZSB3aGVyZSBpdCBpcyBzdGFydGVkIHZpYSBhdXRvbWF0aW9uIChhbmQKKwkgKiB3ZSBkb24ndCkuCisJICovCisJaWYgKFNUUklDTVAoYXJndltpZHhdICsgMSwgImVtYmVkZGluZyIpID09IDApCisJeworI2lmZGVmIEZFQVRfT0xFCisJICAgICphcmdjID0gMTsKKyNlbHNlCisJICAgIG9sZV9lcnJvcigiZW1iZWRkaW5nIik7CisJICAgIG1jaF9leGl0KDIpOworI2VuZGlmCisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfT0xFCisgICAgeworCWludAliRG9SZXN0YXJ0ID0gRkFMU0U7CisKKwlJbml0T0xFKCZiRG9SZXN0YXJ0KTsKKwkvKiBhdXRvbWF0aWNhbGx5IGV4aXQgYWZ0ZXIgcmVnaXN0ZXJpbmcgKi8KKwlpZiAoYkRvUmVzdGFydCkKKwkgICAgbWNoX2V4aXQoMCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICB7CisJLyogc3RvbGVuIGZyb20gZ3VpX3gxMS54ICovCisJaW50IGFyZzsKKworCWZvciAoYXJnID0gMTsgYXJnIDwgKmFyZ2M7IGFyZysrKQorCSAgICBpZiAoc3RybmNtcCgiLW5iIiwgYXJndlthcmddLCAzKSA9PSAwKQorCSAgICB7CisJCXVzaW5nTmV0YmVhbnMrKzsKKwkJbmV0YmVhbnNBcmcgPSBhcmd2W2FyZ107CisJCW1jaF9tZW1tb3ZlKCZhcmd2W2FyZ10sICZhcmd2W2FyZyArIDFdLAorCQkJCQkgICAgKC0tKmFyZ2MgLSBhcmcpICogc2l6ZW9mKGNoYXIgKikpOworCQlhcmd2WyphcmdjXSA9IE5VTEw7CisJCWJyZWFrOwkvKiBlbm91Z2g/ICovCisJICAgIH0KKworCWlmICh1c2luZ05ldGJlYW5zKQorCXsKKwkgICAgV1NBREFUQSB3c2FEYXRhOworCSAgICBpbnQgd3NhZXJyOworCisJICAgIC8qIEluaXQgV2luU29jayAqLworCSAgICB3c2FlcnIgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDIsIDIpLCAmd3NhRGF0YSk7CisJICAgIGlmICh3c2FlcnIgPT0gMCkKKwkJV1NJbml0aWFsaXplZCA9IFRSVUU7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogZ2V0IHRoZSBPUyB2ZXJzaW9uIGluZm8gKi8KKyAgICBvc192ZXJzaW9uLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yob3NfdmVyc2lvbik7CisgICAgR2V0VmVyc2lvbkV4KCZvc192ZXJzaW9uKTsgLyogdGhpcyBjYWxsIHdvcmtzIG9uIFdpbjMycywgV2luOTUgYW5kIFdpbk5UICovCisKKyAgICAvKiB0cnkgYW5kIGxvYWQgdGhlIHVzZXIzMi5kbGwgbGlicmFyeSBhbmQgZ2V0IHRoZSBlbnRyeSBwb2ludHMgZm9yCisgICAgICogbXVsdGktbW9uaXRvci1zdXBwb3J0LiAqLworICAgIGlmICgodXNlcjMyX2xpYiA9IExvYWRMaWJyYXJ5KCJVc2VyMzIuZGxsIikpICE9IE5VTEwpCisgICAgeworCXBNb25pdG9yRnJvbVdpbmRvdyA9IChUTW9uaXRvckZyb21XaW5kb3cpR2V0UHJvY0FkZHJlc3ModXNlcjMyX2xpYiwKKwkJCQkJCQkgIk1vbml0b3JGcm9tV2luZG93Iik7CisKKwkvKiB0aGVyZSBhcmUgLi4uQSBhbmQgLi4uVyB2ZXJzaW9uIG9mIEdldE1vbml0b3JJbmZvIC0gbG9va2luZyBhdAorCSAqIHdpbnVzZXIuaCwgdGhleSBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZGVjbGFyYXRpb24uICovCisJcEdldE1vbml0b3JJbmZvID0gKFRHZXRNb25pdG9ySW5mbylHZXRQcm9jQWRkcmVzcyh1c2VyMzJfbGliLAorCQkJCQkJCSAgIkdldE1vbml0b3JJbmZvQSIpOworICAgIH0KK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIEdVSS4JQ3JlYXRlIGFsbCB0aGUgd2luZG93cywgc2V0IHVwIGFsbCB0aGUgY2FsbC1iYWNrcworICogZXRjLgorICovCisgICAgaW50CitndWlfbWNoX2luaXQodm9pZCkKK3sKKyAgICBjb25zdCBjaGFyIHN6VmltV25kQ2xhc3NbXSA9IFZJTV9DTEFTUzsKKyAgICBjb25zdCBjaGFyIHN6VGV4dEFyZWFDbGFzc1tdID0gIlZpbVRleHRBcmVhIjsKKyAgICBXTkRDTEFTUyB3bmRjbGFzczsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY29uc3QgV0NIQVIgc3pWaW1XbmRDbGFzc1dbXSA9IFZJTV9DTEFTU1c7CisgICAgV05EQ0xBU1NXIHduZGNsYXNzdzsKKyNlbmRpZgorI2lmZGVmIEdMT0JBTF9JTUUKKyAgICBBVE9NCWF0b207CisjZW5kaWYKKworICAgIC8qIERpc3BsYXkgYW55IHBlbmRpbmcgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBkaXNwbGF5X2Vycm9ycygpOworCisgICAgLyogUmV0dXJuIGhlcmUgaWYgdGhlIHdpbmRvdyB3YXMgYWxyZWFkeSBvcGVuZWQgKGhhcHBlbnMgd2hlbgorICAgICAqIGd1aV9tY2hfZGlhbG9nKCkgaXMgY2FsbGVkIGVhcmx5KS4gKi8KKyAgICBpZiAoc19od25kICE9IE5VTEwpCisJcmV0dXJuIE9LOworCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSB0ZWFyb2ZmIGJpdG1hcAorICAgICAqLworI2lmZGVmIEZFQVRfVEVBUk9GRgorICAgIHNfaHRlYXJiaXRtYXAgPSBMb2FkQml0bWFwKHNfaGluc3QsICJJREJfVEVBUk9GRiIpOworI2VuZGlmCisKKyAgICBndWkuc2Nyb2xsYmFyX3dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOworICAgIGd1aS5zY3JvbGxiYXJfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOworI2lmZGVmIEZFQVRfTUVOVQorICAgIGd1aS5tZW51X2hlaWdodCA9IDA7CS8qIFdpbmRvd3MgdGFrZXMgY2FyZSBvZiB0aGlzICovCisjZW5kaWYKKyAgICBndWkuYm9yZGVyX3dpZHRoID0gMDsKKworICAgIHNfYnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKEdldFN5c0NvbG9yKENPTE9SX0JUTkZBQ0UpKTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBGaXJzdCB0cnkgdXNpbmcgdGhlIHdpZGUgdmVyc2lvbiwgc28gdGhhdCB3ZSBjYW4gdXNlIGFueSB0aXRsZS4KKyAgICAgKiBPdGhlcndpc2Ugb25seSBjaGFyYWN0ZXJzIGluIHRoZSBhY3RpdmUgY29kZXBhZ2Ugd2lsbCB3b3JrLiAqLworICAgIGlmIChHZXRDbGFzc0luZm9XKHNfaGluc3QsIHN6VmltV25kQ2xhc3NXLCAmd25kY2xhc3N3KSA9PSAwKQorICAgIHsKKwl3bmRjbGFzc3cuc3R5bGUgPSAwOworCXduZGNsYXNzdy5scGZuV25kUHJvYyA9IF9XbmRQcm9jOworCXduZGNsYXNzdy5jYkNsc0V4dHJhID0gMDsKKwl3bmRjbGFzc3cuY2JXbmRFeHRyYSA9IDA7CisJd25kY2xhc3N3LmhJbnN0YW5jZSA9IHNfaGluc3Q7CisJd25kY2xhc3N3LmhJY29uID0gTG9hZEljb24od25kY2xhc3N3LmhJbnN0YW5jZSwgIklEUl9WSU0iKTsKKwl3bmRjbGFzc3cuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKKwl3bmRjbGFzc3cuaGJyQmFja2dyb3VuZCA9IHNfYnJ1c2g7CisJd25kY2xhc3N3Lmxwc3pNZW51TmFtZSA9IE5VTEw7CisJd25kY2xhc3N3Lmxwc3pDbGFzc05hbWUgPSBzelZpbVduZENsYXNzVzsKKworCWlmICgoCisjaWZkZWYgR0xPQkFMX0lNRQorCQkgICAgYXRvbSA9CisjZW5kaWYKKwkJICAgIFJlZ2lzdGVyQ2xhc3NXKCZ3bmRjbGFzc3cpKSA9PSAwKQorCXsKKwkgICAgaWYgKEdldExhc3RFcnJvcigpICE9IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQlyZXR1cm4gRkFJTDsKKworCSAgICAvKiBNdXN0IGJlIFdpbmRvd3MgOTgsIGZhbGwgYmFjayB0byBub24td2lkZSBmdW5jdGlvbi4gKi8KKwl9CisJZWxzZQorCSAgICB3aWRlX1dpbmRvd1Byb2MgPSBUUlVFOworICAgIH0KKworICAgIGlmICghd2lkZV9XaW5kb3dQcm9jKQorI2VuZGlmCisKKyAgICBpZiAoR2V0Q2xhc3NJbmZvKHNfaGluc3QsIHN6VmltV25kQ2xhc3MsICZ3bmRjbGFzcykgPT0gMCkKKyAgICB7CisJd25kY2xhc3Muc3R5bGUgPSAwOworCXduZGNsYXNzLmxwZm5XbmRQcm9jID0gX1duZFByb2M7CisJd25kY2xhc3MuY2JDbHNFeHRyYSA9IDA7CisJd25kY2xhc3MuY2JXbmRFeHRyYSA9IDA7CisJd25kY2xhc3MuaEluc3RhbmNlID0gc19oaW5zdDsKKwl3bmRjbGFzcy5oSWNvbiA9IExvYWRJY29uKHduZGNsYXNzLmhJbnN0YW5jZSwgIklEUl9WSU0iKTsKKwl3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOworCXduZGNsYXNzLmhickJhY2tncm91bmQgPSBzX2JydXNoOworCXduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7CisJd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHN6VmltV25kQ2xhc3M7CisKKwlpZiAoKAorI2lmZGVmIEdMT0JBTF9JTUUKKwkJICAgIGF0b20gPQorI2VuZGlmCisJCSAgICBSZWdpc3RlckNsYXNzKCZ3bmRjbGFzcykpID09IDApCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKworICAgIGlmICh2aW1fcGFyZW50X2h3bmQgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9UUllfRVhDRVBUCisJX190cnkKKwl7CisjZW5kaWYKKwkgICAgLyogT3BlbiBpbnNpZGUgdGhlIHNwZWNpZmllZCBwYXJlbnQgd2luZG93LgorCSAgICAgKiBUT0RPOiBsYXN0IGFyZ3VtZW50IHNob3VsZCBwb2ludCB0byBhIENMSUVOVENSRUFURVNUUlVDVAorCSAgICAgKiBzdHJ1Y3R1cmUuICovCisJICAgIHNfaHduZCA9IENyZWF0ZVdpbmRvd0V4KAorCQlXU19FWF9NRElDSElMRCwKKwkJc3pWaW1XbmRDbGFzcywgIlZpbSBNU1dpbmRvd3MgR1VJIiwKKwkJV1NfT1ZFUkxBUFBFRFdJTkRPVyB8IFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgMHhDMDAwLAorCQlndWlfd2luX3ggPT0gLTEgPyBDV19VU0VERUZBVUxUIDogZ3VpX3dpbl94LAorCQlndWlfd2luX3kgPT0gLTEgPyBDV19VU0VERUZBVUxUIDogZ3VpX3dpbl95LAorCQkxMDAsCQkJCS8qIEFueSB2YWx1ZSB3aWxsIGRvICovCisJCTEwMCwJCQkJLyogQW55IHZhbHVlIHdpbGwgZG8gKi8KKwkJdmltX3BhcmVudF9od25kLCBOVUxMLAorCQlzX2hpbnN0LCBOVUxMKTsKKyNpZmRlZiBIQVZFX1RSWV9FWENFUFQKKwl9CisJX19leGNlcHQoRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUikKKwl7CisJICAgIC8qIE5PUCAqLworCX0KKyNlbmRpZgorCWlmIChzX2h3bmQgPT0gTlVMTCkKKwl7CisJICAgIEVNU0coXygiRTY3MjogVW5hYmxlIHRvIG9wZW4gd2luZG93IGluc2lkZSBNREkgYXBwbGljYXRpb24iKSk7CisJICAgIG1jaF9leGl0KDIpOworCX0KKyAgICB9CisgICAgZWxzZQorCS8qIE9wZW4gdG9wbGV2ZWwgd2luZG93LiAqLworCXNfaHduZCA9IENyZWF0ZVdpbmRvdygKKwkgICAgc3pWaW1XbmRDbGFzcywgIlZpbSBNU1dpbmRvd3MgR1VJIiwKKwkgICAgV1NfT1ZFUkxBUFBFRFdJTkRPVywKKwkgICAgZ3VpX3dpbl94ID09IC0xID8gQ1dfVVNFREVGQVVMVCA6IGd1aV93aW5feCwKKwkgICAgZ3VpX3dpbl95ID09IC0xID8gQ1dfVVNFREVGQVVMVCA6IGd1aV93aW5feSwKKwkgICAgMTAwLAkJCQkvKiBBbnkgdmFsdWUgd2lsbCBkbyAqLworCSAgICAxMDAsCQkJCS8qIEFueSB2YWx1ZSB3aWxsIGRvICovCisJICAgIE5VTEwsIE5VTEwsCisJICAgIHNfaGluc3QsIE5VTEwpOworCisgICAgaWYgKHNfaHduZCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisjaWZkZWYgR0xPQkFMX0lNRQorICAgIGdsb2JhbF9pbWVfaW5pdChhdG9tLCBzX2h3bmQpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX01CWVRFX0lNRSkgJiYgZGVmaW5lZChEWU5BTUlDX0lNRSkKKyAgICBkeW5faW1tX2xvYWQoKTsKKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIHRoZSB0ZXh0IGFyZWEgd2luZG93ICovCisgICAgaWYgKEdldENsYXNzSW5mbyhzX2hpbnN0LCBzelRleHRBcmVhQ2xhc3MsICZ3bmRjbGFzcykgPT0gMCkKKyAgICB7CisJd25kY2xhc3Muc3R5bGUgPSBDU19PV05EQzsKKwl3bmRjbGFzcy5scGZuV25kUHJvYyA9IF9UZXh0QXJlYVduZFByb2M7CisJd25kY2xhc3MuY2JDbHNFeHRyYSA9IDA7CisJd25kY2xhc3MuY2JXbmRFeHRyYSA9IDA7CisJd25kY2xhc3MuaEluc3RhbmNlID0gc19oaW5zdDsKKwl3bmRjbGFzcy5oSWNvbiA9IE5VTEw7CisJd25kY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKKwl3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gTlVMTDsKKwl3bmRjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOworCXduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBzelRleHRBcmVhQ2xhc3M7CisKKwlpZiAoUmVnaXN0ZXJDbGFzcygmd25kY2xhc3MpID09IDApCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKyAgICBzX3RleHRBcmVhID0gQ3JlYXRlV2luZG93RXgoCisJV1NfRVhfQ0xJRU5URURHRSwKKwlzelRleHRBcmVhQ2xhc3MsICJWaW0gdGV4dCBhcmVhIiwKKwlXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDAsIDAsCisJMTAwLAkJCQkvKiBBbnkgdmFsdWUgd2lsbCBkbyBmb3Igbm93ICovCisJMTAwLAkJCQkvKiBBbnkgdmFsdWUgd2lsbCBkbyBmb3Igbm93ICovCisJc19od25kLCBOVUxMLAorCXNfaGluc3QsIE5VTEwpOworCisgICAgaWYgKHNfdGV4dEFyZWEgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfTUVOVQorICAgIHNfbWVudUJhciA9IENyZWF0ZU1lbnUoKTsKKyNlbmRpZgorICAgIHNfaGRjID0gR2V0REMoc190ZXh0QXJlYSk7CisKKyNpZmRlZiBNU1dJTjE2X0ZBU1RURVhUCisgICAgU2V0QmtNb2RlKHNfaGRjLCBPUEFRVUUpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBEcmFnQWNjZXB0RmlsZXMoc19od25kLCBUUlVFKTsKKyNlbmRpZgorCisgICAgLyogRG8gd2UgbmVlZCB0byBib3RoZXIgd2l0aCB0aGlzPyAqLworICAgIC8qIG1fZk1vdXNlQXZhaWwgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX01PVVNFUFJFU0VOVCk7ICovCisKKyAgICAvKiBHZXQgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9ycyBmcm9tIHRoZSBzeXN0ZW0gKi8KKyAgICBndWlfbWNoX2RlZl9jb2xvcnMoKTsKKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZyb20gdGhlICJOb3JtYWwiIGdyb3VwIChzZXQgaW4gc3ludGF4LmMgb3IgaW4gYSB2aW1yYworICAgICAqIGZpbGUpICovCisgICAgc2V0X25vcm1hbF9jb2xvcnMoKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhhdCBub25lIG9mIHRoZSBjb2xvcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAqIFRoZW4gc3RvcmUgdGhlIGN1cnJlbnQgdmFsdWVzIGFzIHRoZSBkZWZhdWx0cy4KKyAgICAgKi8KKyAgICBndWlfY2hlY2tfY29sb3JzKCk7CisgICAgZ3VpLmRlZl9ub3JtX3BpeGVsID0gZ3VpLm5vcm1fcGl4ZWw7CisgICAgZ3VpLmRlZl9iYWNrX3BpeGVsID0gZ3VpLmJhY2tfcGl4ZWw7CisKKyAgICAvKiBHZXQgdGhlIGNvbG9ycyBmb3IgdGhlIGhpZ2hsaWdodCBncm91cHMgKGd1aV9jaGVja19jb2xvcnMoKSBtaWdodCBoYXZlCisgICAgICogY2hhbmdlZCB0aGVtKSAqLworICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOworCisgICAgLyoKKyAgICAgKiBTdGFydCBvdXQgYnkgYWRkaW5nIHRoZSBjb25maWd1cmVkIGJvcmRlciB3aWR0aCBpbnRvIHRoZSBib3JkZXIgb2Zmc2V0CisgICAgICovCisgICAgZ3VpLmJvcmRlcl9vZmZzZXQgPSBndWkuYm9yZGVyX3dpZHRoICsgMjsJLypDTElFTlQgRURHRSovCisKKyAgICAvKgorICAgICAqIFNldCB1cCBmb3IgSW50ZWxsaW1vdXNlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBpbml0X21vdXNlX3doZWVsKCk7CisKKyAgICAvKgorICAgICAqIGNvbXB1dGUgYSBjb3VwbGUgb2YgbWV0cmljcyB1c2VkIGZvciB0aGUgZGlhbG9ncworICAgICAqLworICAgIGdldF9kaWFsb2dfZm9udF9tZXRyaWNzKCk7CisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIHRvb2xiYXIKKyAgICAgKi8KKyAgICBpbml0aWFsaXNlX3Rvb2xiYXIoKTsKKyNlbmRpZgorI2lmZGVmIE1TV0lOX0ZJTkRfUkVQTEFDRQorICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGlhbG9nIGJveCBzdHVmZgorICAgICAqLworICAgIHNfZmluZHJlcF9tc2cgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UoRklORE1TR1NUUklORyk7CisKKyAgICAvKiBJbml0aWFsaXNlIHRoZSBzdHJ1Y3QgKi8KKyAgICBzX2ZpbmRyZXBfc3RydWN0LmxTdHJ1Y3RTaXplID0gc2l6ZW9mKHNfZmluZHJlcF9zdHJ1Y3QpOworICAgIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJGaW5kV2hhdCA9IGFsbG9jKE1TV0lOX0ZSX0JVRlNJWkUpOworICAgIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJGaW5kV2hhdFswXSA9IE5VTDsKKyAgICBzX2ZpbmRyZXBfc3RydWN0Lmxwc3RyUmVwbGFjZVdpdGggPSBhbGxvYyhNU1dJTl9GUl9CVUZTSVpFKTsKKyAgICBzX2ZpbmRyZXBfc3RydWN0Lmxwc3RyUmVwbGFjZVdpdGhbMF0gPSBOVUw7CisgICAgc19maW5kcmVwX3N0cnVjdC53RmluZFdoYXRMZW4gPSBNU1dJTl9GUl9CVUZTSVpFOworICAgIHNfZmluZHJlcF9zdHJ1Y3Qud1JlcGxhY2VXaXRoTGVuID0gTVNXSU5fRlJfQlVGU0laRTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIGlmICh1c2luZ05ldGJlYW5zKQorCW5ldGJlYW5zX3czMl9jb25uZWN0KCk7CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuLCB0YWtpbmcgcG9zaXRpb24gb24gbXVsdGlwbGUgbW9uaXRvcnMgaW50bworICogYWNjb3VudCAoaWYgc3VwcG9ydGVkKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitnZXRfd29ya19hcmVhKFJFQ1QgKnNwaV9yZWN0KQoreworICAgIF9ITU9OSVRPUgkgICAgbW9uOworICAgIF9NT05JVE9SSU5GTyAgICBtb25pbmZvOworCisgICAgLyogdXNlIHRoZXNlIGZ1bmN0aW9ucyBvbmx5IGlmIGF2YWlsYWJsZSAqLworICAgIGlmIChwTW9uaXRvckZyb21XaW5kb3cgIT0gTlVMTCAmJiBwR2V0TW9uaXRvckluZm8gIT0gTlVMTCkKKyAgICB7CisJLyogd29yayBvdXQgd2hpY2ggbW9uaXRvciB0aGUgd2luZG93IGlzIG9uLCBhbmQgZ2V0ICppdCdzKiB3b3JrIGFyZWEgKi8KKwltb24gPSBwTW9uaXRvckZyb21XaW5kb3coc19od25kLCAxIC8qTU9OSVRPUl9ERUZBVUxUVE9QUklNQVJZKi8pOworCWlmIChtb24gIT0gTlVMTCkKKwl7CisJICAgIG1vbmluZm8uY2JTaXplID0gc2l6ZW9mKF9NT05JVE9SSU5GTyk7CisJICAgIGlmIChwR2V0TW9uaXRvckluZm8obW9uLCAmbW9uaW5mbykpCisJICAgIHsKKwkJKnNwaV9yZWN0ID0gbW9uaW5mby5yY1dvcms7CisJCXJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgLyogdGhpcyBpcyB0aGUgb2xkIG1ldGhvZC4uLiAqLworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVRXT1JLQVJFQSwgMCwgc3BpX3JlY3QsIDApOworfQorCisvKgorICogU2V0IHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2hlbGxzaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwlpbnQgbWluX3dpZHRoLCBpbnQgbWluX2hlaWdodCwgaW50IGJhc2Vfd2lkdGgsIGludCBiYXNlX2hlaWdodCkKK3sKKyAgICBSRUNUCXdvcmthcmVhX3JlY3Q7CisgICAgaW50CQl3aW5fd2lkdGgsIHdpbl9oZWlnaHQ7CisgICAgaW50CQl3aW5feHBvcywgd2luX3lwb3M7CisgICAgV0lORE9XUExBQ0VNRU5UIHduZHBsOworCisgICAgLyogdHJ5IHRvIGtlZXAgd2luZG93IGNvbXBsZXRlbHkgb24gc2NyZWVuICovCisgICAgLyogZ2V0IHNpemUgb2YgdGhlIHNjcmVlbiB3b3JrIGFyZWEgKGV4Y2x1ZGVzIHRhc2tiYXIsIGFwcGJhcnMpICovCisgICAgZ2V0X3dvcmtfYXJlYSgmd29ya2FyZWFfcmVjdCk7CisKKyAgICAvKiBnZXQgY3VycmVudCBwb3Npc2lvbiBvZiBvdXIgd2luZG93ICovCisgICAgd25kcGwubGVuZ3RoID0gc2l6ZW9mKFdJTkRPV1BMQUNFTUVOVCk7CisgICAgR2V0V2luZG93UGxhY2VtZW50KHNfaHduZCwgJnduZHBsKTsKKworICAgIC8qIFJlc2l6aW5nIGEgbWF4aW1pemVkIHdpbmRvdyBsb29rcyB2ZXJ5IHN0cmFuZ2UsIHVuem9vbSBpdCBmaXJzdC4KKyAgICAgKiBCdXQgZG9uJ3QgZG8gaXQgd2hlbiBzdGlsbCBzdGFydGluZyB1cCwgaXQgbWF5IGhhdmUgYmVlbiByZXF1ZXN0ZWQgaW4KKyAgICAgKiB0aGUgc2hvcnRjdXQuICovCisgICAgaWYgKHduZHBsLnNob3dDbWQgPT0gU1dfU0hPV01BWElNSVpFRCAmJiBzdGFydGluZyA9PSAwKQorICAgIHsKKwlTaG93V2luZG93KHNfaHduZCwgU1dfU0hPV05PUk1BTCk7CisJLyogTmVlZCB0byBnZXQgdGhlIHNldHRpbmdzIG9mIHRoZSBub3JtYWwgd2luZG93LiAqLworCUdldFdpbmRvd1BsYWNlbWVudChzX2h3bmQsICZ3bmRwbCk7CisgICAgfQorCisgICAgd2luX3hwb3MgPSB3bmRwbC5yY05vcm1hbFBvc2l0aW9uLmxlZnQ7CisgICAgd2luX3lwb3MgPSB3bmRwbC5yY05vcm1hbFBvc2l0aW9uLnRvcDsKKworICAgIC8qIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIG91dHNpZGUgb2YgdGhlIHdpbmRvdyAqLworICAgIHdpbl93aWR0aCA9IHdpZHRoICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSAqIDI7CisgICAgd2luX2hlaWdodCA9IGhlaWdodCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSkgKiAyCisJCQkrIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKQorI2lmZGVmIEZFQVRfTUVOVQorCQkJKyBndWlfbXN3aW5fZ2V0X21lbnVfaGVpZ2h0KEZBTFNFKQorI2VuZGlmCisJCQk7CisKKyAgICAvKiBpZiB0aGUgd2luZG93IGlzIGdvaW5nIG9mZiB0aGUgc2NyZWVuLCBtb3ZlIGl0IG9uIHRvIHRoZSBzY3JlZW4gKi8KKyAgICBpZiAod2luX3hwb3MgKyB3aW5fd2lkdGggPiB3b3JrYXJlYV9yZWN0LnJpZ2h0KQorCXdpbl94cG9zID0gd29ya2FyZWFfcmVjdC5yaWdodCAtIHdpbl93aWR0aDsKKworICAgIGlmICh3aW5feHBvcyA8IHdvcmthcmVhX3JlY3QubGVmdCkKKwl3aW5feHBvcyA9IHdvcmthcmVhX3JlY3QubGVmdDsKKworICAgIGlmICh3aW5feXBvcyArIHdpbl9oZWlnaHQgPiB3b3JrYXJlYV9yZWN0LmJvdHRvbSkKKwl3aW5feXBvcyA9IHdvcmthcmVhX3JlY3QuYm90dG9tIC0gd2luX2hlaWdodDsKKworICAgIGlmICh3aW5feXBvcyA8IHdvcmthcmVhX3JlY3QudG9wKQorCXdpbl95cG9zID0gd29ya2FyZWFfcmVjdC50b3A7CisKKyAgICAvKiBXaGVuIHRoZSB0YXNrYmFyIGlzIHBsYWNlZCBvbiB0aGUgbGVmdCBvciB0b3Agb2YgdGhlIHNjcmVlbiwKKyAgICAgKiBTZXRXaW5kb3dQbGFjZW1lbnQoKSBhZGRzIGl0cyB3aWR0aCBvciBoZWlnaHQgYXV0b21hdGljYWxseSwgY29tcGVuc2F0ZQorICAgICAqIGZvciB0aGF0LiAgV2hlbiB0aGUgb2Zmc2V0IGlzIG92ZXIgNDAwIGl0J3MgcHJvYmFibHkgc29tZXRoaW5nIGVsc2UsCisgICAgICogc2tpcCBpdCB0aGVuIChqdXN0IGluIGNhc2UpLiAqLworICAgIGlmICh3b3JrYXJlYV9yZWN0LmxlZnQgPiAwICYmIHdvcmthcmVhX3JlY3QubGVmdCA8IDQwMCkKKwl3aW5feHBvcyAtPSB3b3JrYXJlYV9yZWN0LmxlZnQ7CisgICAgaWYgKHdvcmthcmVhX3JlY3QudG9wID4gMCAmJiB3b3JrYXJlYV9yZWN0LnRvcCA8IDQwMCkKKwl3aW5feXBvcyAtPSB3b3JrYXJlYV9yZWN0LnRvcDsKKworICAgIHduZHBsLnJjTm9ybWFsUG9zaXRpb24ubGVmdCA9IHdpbl94cG9zOworICAgIHduZHBsLnJjTm9ybWFsUG9zaXRpb24ucmlnaHQgPSB3aW5feHBvcyArIHdpbl93aWR0aDsKKyAgICB3bmRwbC5yY05vcm1hbFBvc2l0aW9uLnRvcCA9IHdpbl95cG9zOworICAgIHduZHBsLnJjTm9ybWFsUG9zaXRpb24uYm90dG9tID0gd2luX3lwb3MgKyB3aW5faGVpZ2h0OworCisgICAgLyogc2V0IHdpbmRvdyBwb3NpdGlvbiAtIHdlIHNob3VsZCB1c2UgU2V0V2luZG93UGxhY2VtZW50IHJhdGhlciB0aGFuCisgICAgICogU2V0V2luZG93UG9zIGFzIHRoZSBNU0ROIGRvY3Mgc2F5IHRoZSBjb29yZCBzeXN0ZW1zIHJldHVybmVkIGJ5CisgICAgICogdGhlc2UgdHdvIGFyZSBub3QgY29tcGF0aWJsZS4gKi8KKyAgICBTZXRXaW5kb3dQbGFjZW1lbnQoc19od25kLCAmd25kcGwpOworCisgICAgU2V0QWN0aXZlV2luZG93KHNfaHduZCk7CisgICAgU2V0Rm9jdXMoc19od25kKTsKKworI2lmZGVmIEZFQVRfTUVOVQorICAgIC8qIE1lbnUgbWF5IHdyYXAgZGlmZmVyZW50bHkgbm93ICovCisgICAgZ3VpX21zd2luX2dldF9tZW51X2hlaWdodCghZ3VpLnN0YXJ0aW5nKTsKKyNlbmRpZgorfQorCisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoCisgICAgc2Nyb2xsYmFyX1QgKnNiLAorICAgIGxvbmcJdmFsLAorICAgIGxvbmcJc2l6ZSwKKyAgICBsb25nCW1heCkKK3sKKyAgICBTQ1JPTExJTkZPCWluZm87CisKKyAgICBzYi0+c2Nyb2xsX3NoaWZ0ID0gMDsKKyAgICB3aGlsZSAobWF4ID4gMzI3NjcpCisgICAgeworCW1heCA9IChtYXggKyAxKSA+PiAxOworCXZhbCAgPj49IDE7CisJc2l6ZSA+Pj0gMTsKKwkrK3NiLT5zY3JvbGxfc2hpZnQ7CisgICAgfQorCisgICAgaWYgKHNiLT5zY3JvbGxfc2hpZnQgPiAwKQorCSsrc2l6ZTsKKworICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKGluZm8pOworICAgIGluZm8uZk1hc2sgPSBTSUZfUE9TIHwgU0lGX1JBTkdFIHwgU0lGX1BBR0U7CisgICAgaW5mby5uUG9zID0gdmFsOworICAgIGluZm8ubk1pbiA9IDA7CisgICAgaW5mby5uTWF4ID0gbWF4OworICAgIGluZm8ublBhZ2UgPSBzaXplOworICAgIFNldFNjcm9sbEluZm8oc2ItPmlkLCBTQl9DVEwsICZpbmZvLCBUUlVFKTsKK30KKworCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIGd1aS5jdXJyRm9udCA9IGZvbnQ7Cit9CisKKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvcmVncm91bmQgY29sb3IuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mZ19jb2xvcihndWljb2xvcl9UIGNvbG9yKQoreworICAgIGd1aS5jdXJyRmdDb2xvciA9IGNvbG9yOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgYmFja2dyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCit7CisgICAgZ3VpLmN1cnJCZ0NvbG9yID0gY29sb3I7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoRkVBVF9NQllURV9JTUUpCisvKgorICogTXVsdGktYnl0ZSBoYW5kbGluZywgb3JpZ2luYWxseSBieSBTdW5nLUhvb24gQmFlay4KKyAqIEZpcnN0IHN0YXRpYyBmdW5jdGlvbnMgKG5vIHByb3RvdHlwZXMgZ2VuZXJhdGVkKS4KKyAqLworI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGltZS5oPiAgIC8qIEFwcGFyZW50bHkgbm90IG5lZWRlZCBmb3IgQ3lnd2luLCBNaW5nVyBvciBCb3JsYW5kLiAqLworI2VuZGlmCisjaW5jbHVkZSA8aW1tLmg+CisKKy8qCisgKiBkaXNwbGF5IGNvbXBvc2l0aW9uIHN0cmluZyhrb3JlYW4pCisgKi8KKyAgICBzdGF0aWMgdm9pZAorRGlzcGxheUNvbXBTdHJpbmdPcGFxdWUoY2hhcl91ICpzLCBpbnQgbGVuKQoreworICAgIGludCBPbGRCa01vZGUgPSBHZXRCa01vZGUoc19oZGMpOworCisgICAgU2V0QmtNb2RlKHNfaGRjLCBPUEFRVUUpOworICAgIGd1aV9vdXRzdHJfbm93cmFwKHMsIGxlbiwgR1VJX01PTl9UUlNfQ1VSU09SLAorCQkJCQkgICAgIChndWljb2xvcl9UKTAsIChndWljb2xvcl9UKTAsIDApOworICAgIFNldEJrTW9kZShzX2hkYywgT2xkQmtNb2RlKTsKK30KKworLyoKKyAqIGhhbmRsZSBXTV9JTUVfTk9USUZZIG1lc3NhZ2UKKyAqLworICAgIHN0YXRpYyBMUkVTVUxUCitfT25JbWVOb3RpZnkoSFdORCBoV25kLCBEV09SRCBkd0NvbW1hbmQsIERXT1JEIGR3RGF0YSkKK3sKKyAgICBMUkVTVUxUIGxSZXN1bHQgPSAwOworICAgIEhJTUMgaEltYzsKKworICAgIGlmICghcEltbUdldENvbnRleHQgfHwgKGhJbWMgPSBwSW1tR2V0Q29udGV4dChoV25kKSkgPT0gKEhJTUMpMCkKKwlyZXR1cm4gbFJlc3VsdDsKKyAgICBzd2l0Y2ggKGR3Q29tbWFuZCkKKyAgICB7CisJY2FzZSBJTU5fU0VUT1BFTlNUQVRVUzoKKwkgICAgaWYgKHBJbW1HZXRPcGVuU3RhdHVzKGhJbWMpKQorCSAgICB7CisJCXBJbW1TZXRDb21wb3NpdGlvbkZvbnQoaEltYywgJm5vcm1fbG9nZm9udCk7CisJCWltX3NldF9wb3NpdGlvbihndWkucm93LCBndWkuY29sKTsKKworCQkvKiBEaXNhYmxlIGxhbmdtYXAgKi8KKwkJU3RhdGUgJj0gfkxBTkdNQVA7CisJCWlmIChTdGF0ZSAmIElOU0VSVCkKKwkJeworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfS0VZTUFQKQorCQkgICAgLyogVW5zaG93biAna2V5bWFwJyBpbiBzdGF0dXMgbGluZXMgKi8KKwkJICAgIGlmIChjdXJidWYtPmJfcF9pbWluc2VydCA9PSBCX0lNT0RFX0xNQVApCisJCSAgICB7CisJCQkvKiBTYXZlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJaW50IG9sZF9yb3cgPSBndWkucm93OworCQkJaW50IG9sZF9jb2wgPSBndWkuY29sOworCisJCQkvLyBUaGlzIG11c3QgYmUgY2FsbGVkIGhlcmUgYmVmb3JlCisJCQkvLyBzdGF0dXNfcmVkcmF3X2N1cmJ1ZigpLCBvdGhlcndpc2UgdGhlIG1vZGUKKwkJCS8vIG1lc3NhZ2UgbWF5IGFwcGVhciBpbiB0aGUgd3JvbmcgcG9zaXRpb24uCisJCQlzaG93bW9kZSgpOworCQkJc3RhdHVzX3JlZHJhd19jdXJidWYoKTsKKwkJCXVwZGF0ZV9zY3JlZW4oMCk7CisJCQkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJZ3VpLnJvdyA9IG9sZF9yb3c7CisJCQlndWkuY29sID0gb2xkX2NvbDsKKwkJICAgIH0KKyNlbmRpZgorCQl9CisJICAgIH0KKwkgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCSAgICBsUmVzdWx0ID0gMDsKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHBJbW1SZWxlYXNlQ29udGV4dChoV25kLCBoSW1jKTsKKyAgICByZXR1cm4gbFJlc3VsdDsKK30KKworICAgIHN0YXRpYyBMUkVTVUxUCitfT25JbWVDb21wb3NpdGlvbihIV05EIGh3bmQsIFdQQVJBTSBkYmNzLCBMUEFSQU0gcGFyYW0pCit7CisgICAgY2hhcl91CSpyZXQ7CisgICAgaW50CQlsZW47CisKKyAgICBpZiAoKHBhcmFtICYgR0NTX1JFU1VMVFNUUikgPT0gMCkgLyogQ29tcG9zaXRpb24gdW5maW5pc2hlZC4gKi8KKwlyZXR1cm4gMDsKKworICAgIHJldCA9IEdldFJlc3VsdFN0cihod25kLCBHQ1NfUkVTVUxUU1RSLCAmbGVuKTsKKyAgICBpZiAocmV0ICE9IE5VTEwpCisgICAgeworCWFkZF90b19pbnB1dF9idWZfY3NpKHJldCwgbGVuKTsKKwl2aW1fZnJlZShyZXQpOworCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIGdldCB0aGUgY3VycmVudCBjb21wb3NpdGlvbiBzdHJpbmcsIGluIFVDUy0yOyAqbGVucCBpcyB0aGUgbnVtYmVyIG9mCisgKiAqbGVucCBpcyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KKyAqLworICAgIHN0YXRpYyBzaG9ydF91ICoKK0dldENvbXBvc2l0aW9uU3RyaW5nX2luVUNTMihISU1DIGhJTUMsIERXT1JEIEdDUywgaW50ICpsZW5wKQoreworICAgIExPTkcJICAgIHJldDsKKyAgICBMUFdTVFIJICAgIHdidWYgPSBOVUxMOworICAgIGNoYXJfdQkgICAgKmJ1ZjsKKworICAgIGlmICghcEltbUdldENvbnRleHQpCisJcmV0dXJuIE5VTEw7IC8qIG5vIGltbTMyLmRsbCAqLworCisgICAgLyogVHJ5IFVuaWNvZGU7IHRoaXMnbGwgYWx3YXlzIHdvcmsgb24gTlQgcmVnYXJkbGVzcyBvZiBjb2RlcGFnZS4gKi8KKyAgICByZXQgPSBwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdXKGhJTUMsIEdDUywgTlVMTCwgMCk7CisgICAgaWYgKHJldCA9PSAwKQorCXJldHVybiBOVUxMOyAvKiBlbXB0eSAqLworCisgICAgaWYgKHJldCA+IDApCisgICAgeworCS8qIEFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHBsdXMgc3BhY2UgZm9yIHRoZSBOVUwgY2hhcmFjdGVyLiAqLworCXdidWYgPSAoTFBXU1RSKWFsbG9jKHJldCArIHNpemVvZihXQ0hBUikpOworCWlmICh3YnVmICE9IE5VTEwpCisJeworCSAgICBwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdXKGhJTUMsIEdDUywgd2J1ZiwgcmV0KTsKKwkgICAgKmxlbnAgPSByZXQgLyBzaXplb2YoV0NIQVIpOworCX0KKwlyZXR1cm4gKHNob3J0X3UgKil3YnVmOworICAgIH0KKworICAgIC8qIHJldCA8IDA7IHdlIGdvdCBhbiBlcnJvciwgc28gdHJ5IHRoZSBBTlNJIHZlcnNpb24uICBUaGlzJ2xsIHdvcmsKKyAgICAgKiBvbiA5eC9NRSwgYnV0IG9ubHkgaWYgdGhlIGNvZGVwYWdlIGhhcHBlbnMgdG8gYmUgc2V0IHRvIHdoYXRldmVyCisgICAgICogd2UncmUgaW5wdXR0aW5nLiAqLworICAgIHJldCA9IHBJbW1HZXRDb21wb3NpdGlvblN0cmluZ0EoaElNQywgR0NTLCBOVUxMLCAwKTsKKyAgICBpZiAocmV0IDw9IDApCisJcmV0dXJuIE5VTEw7IC8qIGVtcHR5IG9yIGVycm9yICovCisKKyAgICBidWYgPSBhbGxvYyhyZXQpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBKGhJTUMsIEdDUywgYnVmLCByZXQpOworCisgICAgLyogY29udmVydCBmcm9tIGNvZGVwYWdlIHRvIFVDUy0yICovCisgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcl9hbGxvYyhHZXRBQ1AoKSwgMCwgYnVmLCByZXQsICZ3YnVmLCBsZW5wKTsKKyAgICB2aW1fZnJlZShidWYpOworCisgICAgcmV0dXJuIChzaG9ydF91ICopd2J1ZjsKK30KKworLyoKKyAqIHZvaWQgR2V0UmVzdWx0U3RyKCkKKyAqCisgKiBUaGlzIGhhbmRsZXMgV01fSU1FX0NPTVBPU0lUSU9OIHdpdGggR0NTX1JFU1VMVFNUUiBmbGFnIG9uLgorICogZ2V0IGNvbXBsZXRlIGNvbXBvc2l0aW9uIHN0cmluZworICovCisgICAgc3RhdGljIGNoYXJfdSAqCitHZXRSZXN1bHRTdHIoSFdORCBod25kLCBpbnQgR0NTLCBpbnQgKmxlbnApCit7CisgICAgSElNQwloSU1DOwkJLyogSW5wdXQgY29udGV4dCBoYW5kbGUuICovCisgICAgc2hvcnRfdQkqYnVmID0gTlVMTDsKKyAgICBjaGFyX3UJKmNvbnZidWYgPSBOVUxMOworCisgICAgaWYgKCFwSW1tR2V0Q29udGV4dCB8fCAoaElNQyA9IHBJbW1HZXRDb250ZXh0KGh3bmQpKSA9PSAoSElNQykwKQorCXJldHVybiBOVUxMOworCisgICAgLyogUmVhZHMgaW4gdGhlIGNvbXBvc2l0aW9uIHN0cmluZy4gKi8KKyAgICBidWYgPSBHZXRDb21wb3NpdGlvblN0cmluZ19pblVDUzIoaElNQywgR0NTLCBsZW5wKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBjb252YnVmID0gdWNzMl90b19lbmMoYnVmLCBsZW5wKTsKKyAgICBwSW1tUmVsZWFzZUNvbnRleHQoaHduZCwgaElNQyk7CisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gY29udmJ1ZjsKK30KKyNlbmRpZgorCisvKiBGb3IgZ2xvYmFsIGZ1bmN0aW9ucyB3ZSBuZWVkIHByb3RvdHlwZXMuICovCisjaWYgKGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChGRUFUX01CWVRFX0lNRSkpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBzZXQgZm9udCB0byBJTS4KKyAqLworICAgIHZvaWQKK2ltX3NldF9mb250KExPR0ZPTlQgKmxmKQoreworICAgIEhJTUMgaEltYzsKKworICAgIGlmIChwSW1tR2V0Q29udGV4dCAmJiAoaEltYyA9IHBJbW1HZXRDb250ZXh0KHNfaHduZCkpICE9IChISU1DKTApCisgICAgeworCXBJbW1TZXRDb21wb3NpdGlvbkZvbnQoaEltYywgbGYpOworCXBJbW1SZWxlYXNlQ29udGV4dChzX2h3bmQsIGhJbWMpOworICAgIH0KK30KKworLyoKKyAqIE5vdGlmeSBjdXJzb3IgcG9zaXRpb24gdG8gSU0uCisgKi8KKyAgICB2b2lkCitpbV9zZXRfcG9zaXRpb24oaW50IHJvdywgaW50IGNvbCkKK3sKKyAgICBISU1DIGhJbWM7CisKKyAgICBpZiAocEltbUdldENvbnRleHQgJiYgKGhJbWMgPSBwSW1tR2V0Q29udGV4dChzX2h3bmQpKSAhPSAoSElNQykwKQorICAgIHsKKwlDT01QT1NJVElPTkZPUk0JY2ZzOworCisJY2ZzLmR3U3R5bGUgPSBDRlNfUE9JTlQ7CisJY2ZzLnB0Q3VycmVudFBvcy54ID0gRklMTF9YKGNvbCk7CisJY2ZzLnB0Q3VycmVudFBvcy55ID0gRklMTF9ZKHJvdyk7CisJTWFwV2luZG93UG9pbnRzKHNfdGV4dEFyZWEsIHNfaHduZCwgJmNmcy5wdEN1cnJlbnRQb3MsIDEpOworCXBJbW1TZXRDb21wb3NpdGlvbldpbmRvdyhoSW1jLCAmY2ZzKTsKKworCXBJbW1SZWxlYXNlQ29udGV4dChzX2h3bmQsIGhJbWMpOworICAgIH0KK30KKworLyoKKyAqIFNldCBJTSBzdGF0dXMgb24gKCJhY3RpdmUiIGlzIFRSVUUpIG9yIG9mZiAoImFjdGl2ZSIgaXMgRkFMU0UpLgorICovCisgICAgdm9pZAoraW1fc2V0X2FjdGl2ZShpbnQgYWN0aXZlKQoreworICAgIEhJTUMJaEltYzsKKyAgICBzdGF0aWMgSElNQwloSW1jT2xkID0gKEhJTUMpMDsKKworICAgIGlmIChwSW1tR2V0Q29udGV4dCkJICAgIC8qIGlmIE5VTEwgaW1tMzIuZGxsIHdhc24ndCBsb2FkZWQgKHlldCkgKi8KKyAgICB7CisJaWYgKHBfaW1kaXNhYmxlKQorCXsKKwkgICAgaWYgKGhJbWNPbGQgPT0gKEhJTUMpMCkKKwkgICAgeworCQloSW1jT2xkID0gcEltbUdldENvbnRleHQoc19od25kKTsKKwkJaWYgKGhJbWNPbGQpCisJCSAgICBwSW1tQXNzb2NpYXRlQ29udGV4dChzX2h3bmQsIChISU1DKTApOworCSAgICB9CisJICAgIGFjdGl2ZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChoSW1jT2xkICE9IChISU1DKTApCisJeworCSAgICBwSW1tQXNzb2NpYXRlQ29udGV4dChzX2h3bmQsIGhJbWNPbGQpOworCSAgICBoSW1jT2xkID0gKEhJTUMpMDsKKwl9CisKKwloSW1jID0gcEltbUdldENvbnRleHQoc19od25kKTsKKwlpZiAoaEltYykKKwl7CisJICAgIHBJbW1TZXRPcGVuU3RhdHVzKGhJbWMsIGFjdGl2ZSk7CisJICAgIHBJbW1SZWxlYXNlQ29udGV4dChzX2h3bmQsIGhJbWMpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBHZXQgSU0gc3RhdHVzLiAgV2hlbiBJTSBpcyBvbiwgcmV0dXJuIG5vdCAwLiAgRWxzZSByZXR1cm4gMC4KKyAqLworICAgIGludAoraW1fZ2V0X3N0YXR1cygpCit7CisgICAgaW50CQlzdGF0dXMgPSAwOworICAgIEhJTUMJaEltYzsKKworICAgIGlmIChwSW1tR2V0Q29udGV4dCAmJiAoaEltYyA9IHBJbW1HZXRDb250ZXh0KHNfaHduZCkpICE9IChISU1DKTApCisgICAgeworCXN0YXR1cyA9IHBJbW1HZXRPcGVuU3RhdHVzKGhJbWMpID8gMSA6IDA7CisJcEltbVJlbGVhc2VDb250ZXh0KHNfaHduZCwgaEltYyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBGRUFUX01CWVRFICYmIEZFQVRfTUJZVEVfSU1FICovCisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKEZFQVRfTUJZVEVfSU1FKSAmJiBkZWZpbmVkKEdMT0JBTF9JTUUpCisvKiBXaW4zMiB3aXRoIEdMT0JBTCBJTUUgKi8KKworLyoKKyAqIE5vdGlmeSBjdXJzb3IgcG9zaXRpb24gdG8gSU0uCisgKi8KKyAgICB2b2lkCitpbV9zZXRfcG9zaXRpb24oaW50IHJvdywgaW50IGNvbCkKK3sKKyAgICAvKiBXaW4zMiB3aXRoIEdMT0JBTCBJTUUgKi8KKyAgICBQT0lOVCBwOworCisgICAgcC54ID0gRklMTF9YKGNvbCk7CisgICAgcC55ID0gRklMTF9ZKHJvdyk7CisgICAgTWFwV2luZG93UG9pbnRzKHNfdGV4dEFyZWEsIHNfaHduZCwgJnAsIDEpOworICAgIGdsb2JhbF9pbWVfc2V0X3Bvc2l0aW9uKCZwKTsKK30KKworLyoKKyAqIFNldCBJTSBzdGF0dXMgb24gKCJhY3RpdmUiIGlzIFRSVUUpIG9yIG9mZiAoImFjdGl2ZSIgaXMgRkFMU0UpLgorICovCisgICAgdm9pZAoraW1fc2V0X2FjdGl2ZShpbnQgYWN0aXZlKQoreworICAgIGdsb2JhbF9pbWVfc2V0X3N0YXR1cyhhY3RpdmUpOworfQorCisvKgorICogR2V0IElNIHN0YXR1cy4gIFdoZW4gSU0gaXMgb24sIHJldHVybiBub3QgMC4gIEVsc2UgcmV0dXJuIDAuCisgKi8KKyAgICBpbnQKK2ltX2dldF9zdGF0dXMoKQoreworICAgIHJldHVybiBnbG9iYWxfaW1lX2dldF9zdGF0dXMoKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorLyoKKyAqIFdoYXQgaXMgdGhpcyBmb3I/ICBJbiB0aGUgY2FzZSB3aGVyZSB5b3UgYXJlIHVzaW5nIFdpbjk4IG9yIFdpbjJLIG9yIGxhdGVyLAorICogYW5kIHlvdSBhcmUgdXNpbmcgYSBIZWJyZXcgZm9udCAob3IgQXJhYmljISksIFdpbmRvd3MgZG9lcyB5b3UgYSBmYXZvciBhbmQKKyAqIHJldmVyc2VzIHRoZSBzdHJpbmcgc2VudCB0byB0aGUgVGV4dE91dC4uLiBmYW1pbHkuICBUaGlzIHN1Y2tzLCBiZWNhdXNlIHdlCisgKiBnbyB0byBhIGxvdCBvZiBlZmZvcnQgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLCBhbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEKKyAqIHdheSB0byB0ZWxsIFdpbmRibG93cyBub3QgdG8gZG8gdGhpcyEKKyAqCisgKiBUaGUgc2hvcnQgb2YgaXQgaXMgdGhhdCB0aGlzICdSZXZPdXQnIG9ubHkgZ2V0cyBjYWxsZWQgaWYgeW91IGFyZSBydW5uaW5nCisgKiBvbmUgb2YgdGhlIG5ldywgImltcHJvdmVkIiBNUyBPU2VzLCBhbmQgb25seSBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4KKyAqICdyaWdodGxlZnQnIG1vZGUuICBJdCBtYWtlcyBkaXNwbGF5IHRha2UgKnNsaWdodGx5KiBsb25nZXIsIGJ1dCBub3QKKyAqIG5vdGljZWFibHkgc28uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorUmV2T3V0KCBIREMgc19oZGMsCisJaW50IGNvbCwKKwlpbnQgcm93LAorCVVJTlQgZm9wdGlvbnMsCisJQ09OU1QgUkVDVCAqcGNsaXByZWN0LAorCUxQQ1RTVFIgdGV4dCwKKwlVSU5UIGxlbiwKKwlDT05TVCBJTlQgKnBhZGRpbmcpCit7CisgICAgaW50CQlpeDsKKyAgICBzdGF0aWMgaW50CXNwZWNpYWwgPSAtMTsKKworICAgIGlmIChzcGVjaWFsID09IC0xKQorICAgIHsKKwkvKiBDaGVjayB3aW5kb3dzIHZlcnNpb246IHNwZWNpYWwgdHJlYXRtZW50IGlzIG5lZWRlZCBpZiBpdCBpcyBOVCA1IG9yCisJICogV2luOTggb3IgaGlnaGVyLiAqLworCWlmICAoKG9zX3ZlcnNpb24uZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVAorCQkgICAgJiYgb3NfdmVyc2lvbi5kd01ham9yVmVyc2lvbiA+PSA1KQorCQl8fCAob3NfdmVyc2lvbi5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MKKwkJICAgICYmIChvc192ZXJzaW9uLmR3TWFqb3JWZXJzaW9uID4gNAorCQkJfHwgKG9zX3ZlcnNpb24uZHdNYWpvclZlcnNpb24gPT0gNAorCQkJICAgICYmIG9zX3ZlcnNpb24uZHdNaW5vclZlcnNpb24gPiAwKSkpKQorCSAgICBzcGVjaWFsID0gMTsKKwllbHNlCisJICAgIHNwZWNpYWwgPSAwOworICAgIH0KKworICAgIGlmIChzcGVjaWFsKQorCWZvciAoaXggPSAwOyBpeCA8IChpbnQpbGVuOyArK2l4KQorCSAgICBFeHRUZXh0T3V0KHNfaGRjLCBjb2wgKyBURVhUX1goaXgpLCByb3csIGZvcHRpb25zLAorCQkJCQkgICAgcGNsaXByZWN0LCB0ZXh0ICsgaXgsIDEsIHBhZGRpbmcpOworICAgIGVsc2UKKwlFeHRUZXh0T3V0KHNfaGRjLCBjb2wsIHJvdywgZm9wdGlvbnMsIHBjbGlwcmVjdCwgdGV4dCwgbGVuLCBwYWRkaW5nKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3N0cmluZygKKyAgICBpbnQJCXJvdywKKyAgICBpbnQJCWNvbCwKKyAgICBjaGFyX3UJKnRleHQsCisgICAgaW50CQlsZW4sCisgICAgaW50CQlmbGFncykKK3sKKyAgICBzdGF0aWMgaW50CSpwYWRkaW5nID0gTlVMTDsKKyAgICBzdGF0aWMgaW50CXBhZF9zaXplID0gMDsKKyAgICBpbnQJCWk7CisgICAgY29uc3QgUkVDVAkqcGNsaXByZWN0ID0gTlVMTDsKKyAgICBVSU5UCWZvcHRpb25zID0gMDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgc3RhdGljIFdDSEFSICp1bmljb2RlYnVmID0gTlVMTDsKKyAgICBzdGF0aWMgaW50ICAgKnVuaWNvZGVwZHkgPSBOVUxMOworICAgIGludAkJdW5pYnVmbGVuID0gMDsKKyAgICBpbnQJCW4gPSAwOworI2VuZGlmCisgICAgSFBFTglocGVuLCBvbGRfcGVuOworICAgIGludAkJeTsKKworI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisgICAgLyoKKyAgICAgKiBJdGFsaWMgYW5kIGJvbGQgdGV4dCBzZWVtcyB0byBoYXZlIGFuIGV4dHJhIHJvdyBvZiBwaXhlbHMgYXQgdGhlIGJvdHRvbQorICAgICAqIChiZWxvdyB3aGVyZSB0aGUgYm90dG9tIG9mIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlKS4gIElmIHdlIGRyYXcgdGhlCisgICAgICogY2hhcmFjdGVycyB3aXRoIGEgc29saWQgYmFja2dyb3VuZCwgdGhlIHRvcCByb3cgb2YgcGl4ZWxzIGluIHRoZQorICAgICAqIGNoYXJhY3RlciBiZWxvdyB3aWxsIGJlIG92ZXJ3cml0dGVuLiAgV2UgY2FuIGZpeCB0aGlzIGJ5IGZpbGxpbmcgaW4gdGhlCisgICAgICogYmFja2dyb3VuZCBvdXJzZWx2ZXMsIHRvIHRoZSBjb3JyZWN0IGNoYXJhY3RlciBwcm9wb3J0aW9ucywgYW5kIHRoZW4KKyAgICAgKiB3cml0aW5nIHRoZSBjaGFyYWN0ZXIgaW4gdHJhbnNwYXJlbnQgbW9kZS4gIFN0aWxsIGhhdmUgYSBwcm9ibGVtIHdoZW4KKyAgICAgKiB0aGUgY2hhcmFjdGVyIGlzICJfIiwgd2hpY2ggZ2V0cyB3cml0dGVuIG9uIHRvIHRoZSBjaGFyYWN0ZXIgYmVsb3cuCisgICAgICogTmV3IGZpeDogc2V0IGd1aS5jaGFyX2FzY2VudCB0byAtMS4gIFRoaXMgc2hpZnRzIGFsbCBjaGFyYWN0ZXJzIHVwIG9uZQorICAgICAqIHBpeGVsIGluIHRoZWlyIHNsb3RzLCB3aGljaCBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBib3R0b20gcm93IG9mCisgICAgICogcGl4ZWxzLglXZSBzdGlsbCBuZWVkIHRoaXMgY29kZSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgdG9wIHJvdyBvZiBwaXhlbHMKKyAgICAgKiBiZWNvbWVzIGEgcHJvYmxlbS4gLSB3ZWJiLgorICAgICAqLworICAgIHN0YXRpYyBIQlJVU0gJaGJyX2NhY2hlWzJdID0ge05VTEwsIE5VTEx9OworICAgIHN0YXRpYyBndWljb2xvcl9UCWJydXNoX2NvbG9yWzJdID0ge0lOVkFMQ09MT1IsIElOVkFMQ09MT1J9OworICAgIHN0YXRpYyBpbnQJCWJydXNoX2xydSA9IDA7CisgICAgSEJSVVNICQloYnI7CisgICAgUkVDVAkJcmM7CisKKyAgICBpZiAoIShmbGFncyAmIERSQVdfVFJBTlNQKSkKKyAgICB7CisJLyoKKwkgKiBDbGVhciBiYWNrZ3JvdW5kIGZpcnN0LgorCSAqIE5vdGU6IEZpbGxSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCisJICovCisJcmMubGVmdCA9IEZJTExfWChjb2wpOworCXJjLnRvcCA9IEZJTExfWShyb3cpOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50IGNlbGxfbGVuID0gMDsKKworCSAgICAvKiBDb21wdXRlIHRoZSBsZW5ndGggaW4gZGlzcGxheSBjZWxscy4gKi8KKwkgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbiArPSBNQl9CWVRFMkxFTih0ZXh0W25dKSkKKwkJY2VsbF9sZW4gKz0gKCptYl9wdHIyY2VsbHMpKHRleHQgKyBuKTsKKwkgICAgcmMucmlnaHQgPSBGSUxMX1goY29sICsgY2VsbF9sZW4pOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgcmMucmlnaHQgPSBGSUxMX1goY29sICsgbGVuKTsKKwlyYy5ib3R0b20gPSBGSUxMX1kocm93ICsgMSk7CisKKwkvKiBDYWNoZSB0aGUgY3JlYXRlZCBicnVzaCwgdGhhdCBzYXZlcyBhIGxvdCBvZiB0aW1lLiAgV2UgbmVlZCB0d286CisJICogb25lIGZvciBjdXJzb3IgYmFja2dyb3VuZCBhbmQgb25lIGZvciB0aGUgbm9ybWFsIGJhY2tncm91bmQuICovCisJaWYgKGd1aS5jdXJyQmdDb2xvciA9PSBicnVzaF9jb2xvclswXSkKKwl7CisJICAgIGhiciA9IGhicl9jYWNoZVswXTsKKwkgICAgYnJ1c2hfbHJ1ID0gMTsKKwl9CisJZWxzZSBpZiAoZ3VpLmN1cnJCZ0NvbG9yID09IGJydXNoX2NvbG9yWzFdKQorCXsKKwkgICAgaGJyID0gaGJyX2NhY2hlWzFdOworCSAgICBicnVzaF9scnUgPSAwOworCX0KKwllbHNlCisJeworCSAgICBpZiAoaGJyX2NhY2hlW2JydXNoX2xydV0gIT0gTlVMTCkKKwkJRGVsZXRlQnJ1c2goaGJyX2NhY2hlW2JydXNoX2xydV0pOworCSAgICBoYnJfY2FjaGVbYnJ1c2hfbHJ1XSA9IENyZWF0ZVNvbGlkQnJ1c2goZ3VpLmN1cnJCZ0NvbG9yKTsKKwkgICAgYnJ1c2hfY29sb3JbYnJ1c2hfbHJ1XSA9IGd1aS5jdXJyQmdDb2xvcjsKKwkgICAgaGJyID0gaGJyX2NhY2hlW2JydXNoX2xydV07CisJICAgIGJydXNoX2xydSA9ICFicnVzaF9scnU7CisJfQorCUZpbGxSZWN0KHNfaGRjLCAmcmMsIGhicik7CisKKwlTZXRCa01vZGUoc19oZGMsIFRSQU5TUEFSRU5UKTsKKworCS8qCisJICogV2hlbiBkcmF3aW5nIGJsb2NrIGN1cnNvciwgcHJldmVudCBpbnZlcnRlZCBjaGFyYWN0ZXIgc3BpbGxpbmcKKwkgKiBvdmVyIGNoYXJhY3RlciBjZWxsIChjYW4gaGFwcGVuIHdpdGggYm9sZC9pdGFsaWMpCisJICovCisJaWYgKGZsYWdzICYgRFJBV19DVVJTT1IpCisJeworCSAgICBwY2xpcHJlY3QgPSAmcmM7CisJICAgIGZvcHRpb25zID0gRVRPX0NMSVBQRUQ7CisJfQorICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd3JpdGUgdGhlIGNoYXJhY3RlcnMgaW4gb3BhcXVlIG1vZGUsIGJ1dAorICAgICAqIHdoZW4gdGhlIHRleHQgaXMgbm90IGV4YWN0bHkgdGhlIHNhbWUgcHJvcG9ydGlvbnMgYXMgbm9ybWFsIHRleHQsIHRvbworICAgICAqIGJpZyBvciB0b28gbGl0dGxlIGEgcmVjdGFuZ2xlIGdldHMgZHJhd24gZm9yIHRoZSBiYWNrZ3JvdW5kLgorICAgICAqLworICAgIFNldEJrTW9kZShzX2hkYywgT1BBUVVFKTsKKyAgICBTZXRCa0NvbG9yKHNfaGRjLCBndWkuY3VyckJnQ29sb3IpOworI2VuZGlmCisgICAgU2V0VGV4dENvbG9yKHNfaGRjLCBndWkuY3VyckZnQ29sb3IpOworICAgIFNlbGVjdEZvbnQoc19oZGMsIGd1aS5jdXJyRm9udCk7CisKKyAgICBpZiAocGFkX3NpemUgIT0gQ29sdW1ucyB8fCBwYWRkaW5nID09IE5VTEwgfHwgcGFkZGluZ1swXSAhPSBndWkuY2hhcl93aWR0aCkKKyAgICB7CisJdmltX2ZyZWUocGFkZGluZyk7CisJcGFkX3NpemUgPSBDb2x1bW5zOworCisJcGFkZGluZyA9IChpbnQgKilhbGxvYyhwYWRfc2l6ZSAqIHNpemVvZihpbnQpKTsKKwlpZiAocGFkZGluZyAhPSBOVUxMKQorCSAgICBmb3IgKGkgPSAwOyBpIDwgcGFkX3NpemU7IGkrKykKKwkJcGFkZGluZ1tpXSA9IGd1aS5jaGFyX3dpZHRoOworICAgIH0KKworICAgIC8qIE9uIE5ULCB0ZWxsIHRoZSBmb250IHJlbmRlcmVyIG5vdCB0byAiaGVscCIgdXMgd2l0aCBIZWJyZXcgYW5kIEFyYWJpYworICAgICAqIHRleHQuICBUaGlzIGRvZXNuJ3Qgd29yayBpbiA5eCwgc28gd2UgaGF2ZSB0byBkZWFsIHdpdGggaXQgbWFudWFsbHkgb24KKyAgICAgKiB0aG9zZSBzeXN0ZW1zLiAqLworICAgIGlmIChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpCisJZm9wdGlvbnMgfD0gRVRPX0lHTk9SRUxBTkdVQUdFOworCisgICAgLyoKKyAgICAgKiBXZSBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhZGRpbmcgYXJndW1lbnQgYmVjYXVzZSBpdGFsaWMgYW5kIGJvbGQgdmVyc2lvbnMKKyAgICAgKiBvZiBmaXhlZC13aWR0aCBmb250cyBhcmUgb2Z0ZW4gb25lIHBpeGVsIG9yIHNvIHdpZGVyIHRoYW4gdGhlaXIgbm9ybWFsCisgICAgICogdmVyc2lvbnMuCisgICAgICogTm8gY2hlY2sgZm9yIERSQVdfQk9MRCwgV2luZG93cyB3aWxsIGhhdmUgZG9uZSBpdCBhbHJlYWR5LgorICAgICAqLworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgVVRGLTggY2hhcmFjdGVycy4gIElmIG5vdCwgdXNlIG5vcm1hbCB0ZXh0CisgICAgICogb3V0cHV0IHRvIHNwZWVkIHVwIG91dHB1dC4gKi8KKyAgICBpZiAoZW5jX3V0ZjgpCisJZm9yIChuID0gMDsgbiA8IGxlbjsgKytuKQorCSAgICBpZiAodGV4dFtuXSA+PSAweDgwKQorCQlicmVhazsKKworICAgIC8qIENoZWNrIGlmIHRoZSBVbmljb2RlIGJ1ZmZlciBleGlzdHMgYW5kIGlzIGJpZyBlbm91Z2guICBDcmVhdGUgaXQKKyAgICAgKiB3aXRoIHRoZSBzYW1lIGxlbmd0IGFzIHRoZSBtdWx0aS1ieXRlIHN0cmluZywgdGhlIG51bWJlciBvZiB3aWRlCisgICAgICogY2hhcmFjdGVycyBpcyBhbHdheXMgZXF1YWwgb3Igc21hbGxlci4gKi8KKyAgICBpZiAoKGVuY191dGY4IHx8IChlbmNfY29kZXBhZ2UgPiAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlKSkKKwkgICAgJiYgKHVuaWNvZGVidWYgPT0gTlVMTCB8fCBsZW4gPiB1bmlidWZsZW4pKQorICAgIHsKKwl2aW1fZnJlZSh1bmljb2RlYnVmKTsKKwl1bmljb2RlYnVmID0gKFdDSEFSICopYWxsb2MobGVuICogc2l6ZW9mKFdDSEFSKSk7CisKKwl2aW1fZnJlZSh1bmljb2RlcGR5KTsKKwl1bmljb2RlcGR5ID0gKGludCAqKWFsbG9jKGxlbiAqIHNpemVvZihpbnQpKTsKKworCXVuaWJ1ZmxlbiA9IGxlbjsKKyAgICB9CisKKyAgICBpZiAoZW5jX3V0ZjggJiYgbiA8IGxlbiAmJiB1bmljb2RlYnVmICE9IE5VTEwpCisgICAgeworCS8qIE91dHB1dCBVVEYtOCBjaGFyYWN0ZXJzLiAgQ2FsbGVyIGhhcyBhbHJlYWR5IHNlcGFyYXRlZAorCSAqIGNvbXBvc2luZyBjaGFyYWN0ZXJzLiAqLworCWludAkJaSA9IDA7CisJaW50CQljbGVuOwkvKiBzdHJpbmcgbGVuZ3RoIHVwIHRvIGNvbXBvc2luZyBjaGFyICovCisJaW50CQljZWxsczsJLyogY2VsbCB3aWR0aCBvZiBzdHJpbmcgdXAgdG8gY29tcG9zaW5nIGNoYXIgKi8KKwlpbnQJCWN3OwkvKiB3aWR0aCBvZiBjdXJyZW50IGNlbGwgKi8KKworCWNlbGxzID0gMDsKKwlmb3IgKGNsZW4gPSAwOyBpIDwgbGVuOyApCisJeworCSAgICB1bmljb2RlYnVmW2NsZW5dID0gdXRmX3B0cjJjaGFyKHRleHQgKyBpKTsKKwkgICAgY3cgPSB1dGZfY2hhcjJjZWxscyh1bmljb2RlYnVmW2NsZW5dKTsKKwkgICAgaWYgKGN3ID4gMikJCS8qIGRvbid0IHVzZSA0IGZvciB1bnByaW50YWJsZSBjaGFyICovCisJCWN3ID0gMTsKKwkgICAgaWYgKHVuaWNvZGVwZHkgIT0gTlVMTCkKKwkgICAgeworCQkvKiBVc2UgdW5pY29kZXBkeSB0byBtYWtlIGNoYXJhY3RlcnMgZml0IGFzIHdlIGV4cGVjdCwgZXZlbgorCQkgKiB3aGVuIHRoZSBmb250IHVzZXMgZGlmZmVyZW50IHdpZHRocyAoZS5nLiwgYm9sZCBjaGFyYWN0ZXIKKwkJICogaXMgd2lkZXIpLiAgKi8KKwkJdW5pY29kZXBkeVtjbGVuXSA9IGN3ICogZ3VpLmNoYXJfd2lkdGg7CisJICAgIH0KKwkgICAgY2VsbHMgKz0gY3c7CisJICAgIGkgKz0gdXRmY19wdHIybGVuX2NoZWNrX2xlbih0ZXh0ICsgaSwgbGVuIC0gaSk7CisJICAgICsrY2xlbjsKKwl9CisJRXh0VGV4dE91dFcoc19oZGMsIFRFWFRfWChjb2wpLCBURVhUX1kocm93KSwKKwkJCSAgICAgZm9wdGlvbnMsIHBjbGlwcmVjdCwgdW5pY29kZWJ1ZiwgY2xlbiwgdW5pY29kZXBkeSk7CisJbGVuID0gY2VsbHM7CS8qIHVzZWQgZm9yIHVuZGVybGluaW5nICovCisgICAgfQorICAgIGVsc2UgaWYgKGVuY19jb2RlcGFnZSA+IDAgJiYgKGludClHZXRBQ1AoKSAhPSBlbmNfY29kZXBhZ2UpCisgICAgeworCS8qIElmIHdlIHdhbnQgdG8gZGlzcGxheSBjb2RlcGFnZSBkYXRhLCBhbmQgdGhlIGN1cnJlbnQgQ1AgaXMgbm90IHRoZQorCSAqIEFOU0kgb25lLCB3ZSBuZWVkIHRvIGdvIHZpYSBVbmljb2RlLiAqLworCWlmICh1bmljb2RlYnVmICE9IE5VTEwpCisJeworCSAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGVuY19jb2RlcGFnZSwKKwkJCU1CX1BSRUNPTVBPU0VELAorCQkJKGNoYXIgKil0ZXh0LCBsZW4sCisJCQkoTFBXU1RSKXVuaWNvZGVidWYsIHVuaWJ1Zmxlbik7CisJICAgIGlmIChsZW4gIT0gMCkKKwkJRXh0VGV4dE91dFcoc19oZGMsIFRFWFRfWChjb2wpLCBURVhUX1kocm93KSwKKwkJCSAgICAgIGZvcHRpb25zLCBwY2xpcHJlY3QsIHVuaWNvZGVidWYsIGxlbiwgTlVMTCk7CisJfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkvKiBJZiB3ZSBjYW4ndCB1c2UgRVRPX0lHTk9SRUxBTkdVQUdFLCB3ZSBjYW4ndCB0ZWxsIFdpbmRvd3Mgbm90IHRvCisJICogbWVzcyB1cCBSTCB0ZXh0LCBzbyB3ZSBoYXZlIHRvIGRyYXcgaXQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci4KKwkgKiBPbmx5IGRvIHRoaXMgaWYgUkwgaXMgb24sIHNpbmNlIGl0J3Mgc2xvdy4gKi8KKwlpZiAoY3Vyd2luLT53X3BfcmwgJiYgIShmb3B0aW9ucyAmIEVUT19JR05PUkVMQU5HVUFHRSkpCisJICAgIFJldk91dChzX2hkYywgVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpLAorCQkJIGZvcHRpb25zLCBwY2xpcHJlY3QsIChjaGFyICopdGV4dCwgbGVuLCBwYWRkaW5nKTsKKwllbHNlCisjZW5kaWYKKwkgICAgRXh0VGV4dE91dChzX2hkYywgVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpLAorCQkJIGZvcHRpb25zLCBwY2xpcHJlY3QsIChjaGFyICopdGV4dCwgbGVuLCBwYWRkaW5nKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkKKyAgICB7CisJaHBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgZ3VpLmN1cnJGZ0NvbG9yKTsKKwlvbGRfcGVuID0gU2VsZWN0T2JqZWN0KHNfaGRjLCBocGVuKTsKKwkvKiBXaGVuIHBfbGluZXNwYWNlIGlzIDAsIG92ZXJ3cml0ZSB0aGUgYm90dG9tIHJvdyBvZiBwaXhlbHMuCisJICogT3RoZXJ3aXNlIHB1dCB0aGUgbGluZSBqdXN0IGJlbG93IHRoZSBjaGFyYWN0ZXIuICovCisJeSA9IEZJTExfWShyb3cgKyAxKSAtIDE7CisjaWZuZGVmIE1TV0lOMTZfRkFTVFRFWFQKKwlpZiAocF9saW5lc3BhY2UgPiAxKQorCSAgICB5IC09IHBfbGluZXNwYWNlIC0gMTsKKyNlbmRpZgorCU1vdmVUb0V4KHNfaGRjLCBGSUxMX1goY29sKSwgeSwgTlVMTCk7CisJLyogTm90ZTogTGluZVRvKCkgZXhjbHVkZXMgdGhlIGxhc3QgcGl4ZWwgaW4gdGhlIGxpbmUuICovCisJTGluZVRvKHNfaGRjLCBGSUxMX1goY29sICsgbGVuKSwgeSk7CisJRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChzX2hkYywgb2xkX3BlbikpOworICAgIH0KK30KKworCisvKgorICogT3V0cHV0IHJvdXRpbmVzLgorICovCisKKy8qIEZsdXNoIGFueSBvdXRwdXQgdG8gdGhlIHNjcmVlbiAqLworICAgIHZvaWQKK2d1aV9tY2hfZmx1c2godm9pZCkKK3sKKyMgICBpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgICAvKgorICAgICAqIFRoZSBHZGlGbHVzaCBkZWNsYXJhdGlvbiAoaW4gQm9ybGFuZCBDIDUuMDEgPHdpbmdkaS5oPikgaXMgbm90IGEKKyAgICAgKiBwcm90b3R5cGUgZGVjbGFyYXRpb24uCisgICAgICogVGhlIGNvbXBpbGVyIGNvbXBsYWlucyBpZiBfX3N0ZGNhbGwgaXMgbm90IHVzZWQgaW4gYm90aCBkZWNsYXJhdGlvbnMuCisgICAgICovCisgICAgQk9PTCAgX19zdGRjYWxsIEdkaUZsdXNoKHZvaWQpOworIyAgIGVuZGlmCisKKyAgICBHZGlGbHVzaCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK2NsZWFyX3JlY3QoUkVDVCAqcmNwKQoreworICAgIEhCUlVTSCAgaGJyOworCisgICAgaGJyID0gQ3JlYXRlU29saWRCcnVzaChndWkuYmFja19waXhlbCk7CisgICAgRmlsbFJlY3Qoc19oZGMsIHJjcCwgaGJyKTsKKyAgICBEZWxldGVCcnVzaChoYnIpOworfQorCisKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBBZGQgYSBzdWIgbWVudSB0byB0aGUgbWVudSBiYXIuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2FkZF9tZW51KAorICAgIHZpbW1lbnVfVAkqbWVudSwKKyAgICBpbnQJCXBvcykKK3sKKyAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKKworICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBDcmVhdGVQb3B1cE1lbnUoKTsKKyAgICBtZW51LT5pZCA9IHNfbWVudV9pZCsrOworCisgICAgaWYgKG1lbnVfaXNfbWVudWJhcihtZW51LT5uYW1lKSkKKyAgICB7CisJaWYgKGlzX3dpbm50XzMoKSkKKwl7CisJICAgIEluc2VydE1lbnUoKHBhcmVudCA9PSBOVUxMKSA/IHNfbWVudUJhciA6IHBhcmVudC0+c3VibWVudV9pZCwKKwkJICAgIChVSU5UKXBvcywgTUZfUE9QVVAgfCBNRl9TVFJJTkcgfCBNRl9CWVBPU0lUSU9OLAorCQkgICAgKFVJTlQpbWVudS0+c3VibWVudV9pZCwgKExQQ1RTVFIpIG1lbnUtPm5hbWUpOworCX0KKwllbHNlCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgV0NIQVIJKnduID0gTlVMTDsKKwkgICAgaW50CQluOworCisJICAgIGlmIChlbmNfY29kZXBhZ2UgPj0gMCAmJiAoaW50KUdldEFDUCgpICE9IGVuY19jb2RlcGFnZSkKKwkgICAgeworCQkvKiAnZW5jb2RpbmcnIGRpZmZlcnMgZnJvbSBhY3RpdmUgY29kZXBhZ2U6IGNvbnZlcnQgbWVudSBuYW1lCisJCSAqIGFuZCB1c2Ugd2lkZSBmdW5jdGlvbiAqLworCQl3biA9IGVuY190b191Y3MyKG1lbnUtPm5hbWUsIE5VTEwpOworCQlpZiAod24gIT0gTlVMTCkKKwkJeworCQkgICAgTUVOVUlURU1JTkZPVwlpbmZvdzsKKworCQkgICAgaW5mb3cuY2JTaXplID0gc2l6ZW9mKGluZm93KTsKKwkJICAgIGluZm93LmZNYXNrID0gTUlJTV9EQVRBIHwgTUlJTV9UWVBFIHwgTUlJTV9JRAorCQkJCQkJCSAgICAgICB8IE1JSU1fU1VCTUVOVTsKKwkJICAgIGluZm93LmR3SXRlbURhdGEgPSAoRFdPUkQpbWVudTsKKwkJICAgIGluZm93LndJRCA9IG1lbnUtPmlkOworCQkgICAgaW5mb3cuZlR5cGUgPSBNRlRfU1RSSU5HOworCQkgICAgaW5mb3cuZHdUeXBlRGF0YSA9IHduOworCQkgICAgaW5mb3cuY2NoID0gd2NzbGVuKHduKTsKKwkJICAgIGluZm93LmhTdWJNZW51ID0gbWVudS0+c3VibWVudV9pZDsKKwkJICAgIG4gPSBJbnNlcnRNZW51SXRlbVcoKHBhcmVudCA9PSBOVUxMKQorCQkJCQkgICAgPyBzX21lbnVCYXIgOiBwYXJlbnQtPnN1Ym1lbnVfaWQsCisJCQkJCSAgICAoVUlOVClwb3MsIFRSVUUsICZpbmZvdyk7CisJCSAgICB2aW1fZnJlZSh3bik7CisJCSAgICBpZiAobiA9PSAwICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQkJLyogRmFpbGVkLCB0cnkgdXNpbmcgbm9uLXdpZGUgZnVuY3Rpb24uICovCisJCQl3biA9IE5VTEw7CisJCX0KKwkgICAgfQorCisJICAgIGlmICh3biA9PSBOVUxMKQorI2VuZGlmCisJICAgIHsKKwkJTUVOVUlURU1JTkZPCWluZm87CisKKwkJaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CisJCWluZm8uZk1hc2sgPSBNSUlNX0RBVEEgfCBNSUlNX1RZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVUJNRU5VOworCQlpbmZvLmR3SXRlbURhdGEgPSAoRFdPUkQpbWVudTsKKwkJaW5mby53SUQgPSBtZW51LT5pZDsKKwkJaW5mby5mVHlwZSA9IE1GVF9TVFJJTkc7CisJCWluZm8uZHdUeXBlRGF0YSA9IChMUFRTVFIpbWVudS0+bmFtZTsKKwkJaW5mby5jY2ggPSAoVUlOVClTVFJMRU4obWVudS0+bmFtZSk7CisJCWluZm8uaFN1Yk1lbnUgPSBtZW51LT5zdWJtZW51X2lkOworCQlJbnNlcnRNZW51SXRlbSgocGFyZW50ID09IE5VTEwpCisJCQkJCT8gc19tZW51QmFyIDogcGFyZW50LT5zdWJtZW51X2lkLAorCQkJCQkoVUlOVClwb3MsIFRSVUUsICZpbmZvKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBGaXggd2luZG93IHNpemUgaWYgbWVudSBtYXkgaGF2ZSB3cmFwcGVkICovCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorCWd1aV9tc3dpbl9nZXRfbWVudV9oZWlnaHQoIWd1aS5zdGFydGluZyk7CisjaWZkZWYgRkVBVF9URUFST0ZGCisgICAgZWxzZSBpZiAoSXNXaW5kb3cocGFyZW50LT50ZWFyb2ZmX2hhbmRsZSkpCisJcmVidWlsZF90ZWFyb2ZmKHBhcmVudCk7CisjZW5kaWYKK30KKworICAgIHZvaWQKK2d1aV9tY2hfc2hvd19wb3B1cG1lbnUodmltbWVudV9UICptZW51KQoreworICAgIFBPSU5UIG1wOworCisgICAgKHZvaWQpR2V0Q3Vyc29yUG9zKChMUFBPSU5UKSZtcCk7CisgICAgZ3VpX21jaF9zaG93X3BvcHVwbWVudV9hdChtZW51LCAoaW50KW1wLngsIChpbnQpbXAueSk7Cit9CisKKyAgICB2b2lkCitndWlfbWFrZV9wb3B1cChjaGFyX3UgKnBhdGhfbmFtZSkKK3sKKyAgICB2aW1tZW51X1QJKm1lbnUgPSBndWlfZmluZF9tZW51KHBhdGhfbmFtZSk7CisKKyAgICBpZiAobWVudSAhPSBOVUxMKQorICAgIHsKKwlQT0lOVAlwOworCisJLyogRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgY3Vyc29yICovCisJR2V0RENPcmdFeChzX2hkYywgJnApOworCWlmIChjdXJ3aW4gIT0gTlVMTCkKKwl7CisJICAgIHAueCArPSBURVhUX1goV19XSU5DT0woY3Vyd2luKSArIGN1cndpbi0+d193Y29sICsgMSk7CisJICAgIHAueSArPSBURVhUX1koV19XSU5ST1coY3Vyd2luKSArIGN1cndpbi0+d193cm93ICsgMSk7CisJfQorCW1zZ19zY3JvbGwgPSBGQUxTRTsKKwlndWlfbWNoX3Nob3dfcG9wdXBtZW51X2F0KG1lbnUsIChpbnQpcC54LCAoaW50KXAueSk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1RFQVJPRkYpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogR2l2ZW4gYSBtZW51IGRlc2NyaXB0b3IsIGUuZy4gIkZpbGUuTmV3IiwgZmluZCBpdCBpbiB0aGUgbWVudSBoaWVyYXJjaHkgYW5kCisgKiBjcmVhdGUgaXQgYXMgYSBwc2V1ZG8tInRlYXJvZmYgbWVudSIuCisgKi8KKyAgICB2b2lkCitndWlfbWFrZV90ZWFyb2ZmKGNoYXJfdSAqcGF0aF9uYW1lKQoreworICAgIHZpbW1lbnVfVAkqbWVudSA9IGd1aV9maW5kX21lbnUocGF0aF9uYW1lKTsKKworICAgIC8qIEZvdW5kIHRoZSBtZW51LCBzbyB0ZWFyIGl0IG9mZi4gKi8KKyAgICBpZiAobWVudSAhPSBOVUxMKQorCWd1aV9tY2hfdGVhcm9mZihtZW51LT5kbmFtZSwgbWVudSwgMHhmZmZmTCwgMHhmZmZmTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEFkZCBhIG1lbnUgaXRlbSB0byBhIG1lbnUKKyAqLworICAgIHZvaWQKK2d1aV9tY2hfYWRkX21lbnVfaXRlbSgKKyAgICB2aW1tZW51X1QJKm1lbnUsCisgICAgaW50CQlpZHgpCit7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CisKKyAgICBtZW51LT5pZCA9IHNfbWVudV9pZCsrOworICAgIG1lbnUtPnN1Ym1lbnVfaWQgPSBOVUxMOworCisjaWZkZWYgRkVBVF9URUFST0ZGCisgICAgaWYgKFNUUk5DTVAobWVudS0+bmFtZSwgVEVBUl9TVFJJTkcsIFRFQVJfTEVOKSA9PSAwKQorICAgIHsKKwlJbnNlcnRNZW51KHBhcmVudC0+c3VibWVudV9pZCwgKFVJTlQpaWR4LCBNRl9CSVRNQVB8TUZfQllQT1NJVElPTiwKKwkJKFVJTlQpbWVudS0+aWQsIChMUENUU1RSKSBzX2h0ZWFyYml0bWFwKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgaWYgKG1lbnVfaXNfdG9vbGJhcihwYXJlbnQtPm5hbWUpKQorICAgIHsKKwlUQkJVVFRPTiBuZXd0YjsKKworCXZpbV9tZW1zZXQoJm5ld3RiLCAwLCBzaXplb2YobmV3dGIpKTsKKwlpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+bmFtZSkpCisJeworCSAgICBuZXd0Yi5pQml0bWFwID0gMDsKKwkgICAgbmV3dGIuZnNTdHlsZSA9IFRCU1RZTEVfU0VQOworCX0KKwllbHNlCisJeworCSAgICBuZXd0Yi5pQml0bWFwID0gZ2V0X3Rvb2xiYXJfYml0bWFwKG1lbnUpOworCSAgICBuZXd0Yi5mc1N0eWxlID0gVEJTVFlMRV9CVVRUT047CisJfQorCW5ld3RiLmlkQ29tbWFuZCA9IG1lbnUtPmlkOworCW5ld3RiLmZzU3RhdGUgPSBUQlNUQVRFX0VOQUJMRUQ7CisJbmV3dGIuaVN0cmluZyA9IDA7CisJU2VuZE1lc3NhZ2Uoc190b29sYmFyaHduZCwgVEJfSU5TRVJUQlVUVE9OLCAoV1BBUkFNKWlkeCwKKwkJCQkJCQkgICAgIChMUEFSQU0pJm5ld3RiKTsKKwltZW51LT5zdWJtZW51X2lkID0gKEhNRU5VKS0xOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCVdDSEFSCSp3biA9IE5VTEw7CisJaW50CW47CisKKwlpZiAoZW5jX2NvZGVwYWdlID49IDAgJiYgKGludClHZXRBQ1AoKSAhPSBlbmNfY29kZXBhZ2UpCisJeworCSAgICAvKiAnZW5jb2RpbmcnIGRpZmZlcnMgZnJvbSBhY3RpdmUgY29kZXBhZ2U6IGNvbnZlcnQgbWVudSBpdGVtIG5hbWUKKwkgICAgICogYW5kIHVzZSB3aWRlIGZ1bmN0aW9uICovCisJICAgIHduID0gZW5jX3RvX3VjczIobWVudS0+bmFtZSwgTlVMTCk7CisJICAgIGlmICh3biAhPSBOVUxMKQorCSAgICB7CisJCW4gPSBJbnNlcnRNZW51VyhwYXJlbnQtPnN1Ym1lbnVfaWQsIChVSU5UKWlkeCwKKwkJCShtZW51X2lzX3NlcGFyYXRvcihtZW51LT5uYW1lKQorCQkJCSA/IE1GX1NFUEFSQVRPUiA6IE1GX1NUUklORykgfCBNRl9CWVBPU0lUSU9OLAorCQkJKFVJTlQpbWVudS0+aWQsIHduKTsKKwkJdmltX2ZyZWUod24pOworCQlpZiAobiA9PSAwICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQkgICAgLyogRmFpbGVkLCB0cnkgdXNpbmcgbm9uLXdpZGUgZnVuY3Rpb24uICovCisJCSAgICB3biA9IE5VTEw7CisJICAgIH0KKwl9CisJaWYgKHduID09IE5VTEwpCisjZW5kaWYKKwkgICAgSW5zZXJ0TWVudShwYXJlbnQtPnN1Ym1lbnVfaWQsIChVSU5UKWlkeCwKKwkJKG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPm5hbWUpID8gTUZfU0VQQVJBVE9SIDogTUZfU1RSSU5HKQorCQkJCQkJCSAgICAgIHwgTUZfQllQT1NJVElPTiwKKwkJKFVJTlQpbWVudS0+aWQsIChMUENUU1RSKW1lbnUtPm5hbWUpOworI2lmZGVmIEZFQVRfVEVBUk9GRgorCWlmIChJc1dpbmRvdyhwYXJlbnQtPnRlYXJvZmZfaGFuZGxlKSkKKwkgICAgcmVidWlsZF90ZWFyb2ZmKHBhcmVudCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBEZXN0cm95IHRoZSBtYWNoaW5lIHNwZWNpZmljIG1lbnUgd2lkZ2V0LgorICovCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X21lbnUodmltbWVudV9UICptZW51KQoreworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIC8qCisgICAgICogaXMgdGhpcyBhIHRvb2xiYXIgYnV0dG9uPworICAgICAqLworICAgIGlmIChtZW51LT5zdWJtZW51X2lkID09IChITUVOVSktMSkKKyAgICB7CisJaW50IGlCdXR0b247CisKKwlpQnV0dG9uID0gKGludClTZW5kTWVzc2FnZShzX3Rvb2xiYXJod25kLCBUQl9DT01NQU5EVE9JTkRFWCwKKwkJCQkJCQkgKFdQQVJBTSltZW51LT5pZCwgMCk7CisJU2VuZE1lc3NhZ2Uoc190b29sYmFyaHduZCwgVEJfREVMRVRFQlVUVE9OLCAoV1BBUkFNKWlCdXR0b24sIDApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJaWYgKG1lbnUtPnBhcmVudCAhPSBOVUxMCisJCSYmIG1lbnVfaXNfcG9wdXAobWVudS0+cGFyZW50LT5kbmFtZSkKKwkJJiYgbWVudS0+cGFyZW50LT5zdWJtZW51X2lkICE9IE5VTEwpCisJICAgIFJlbW92ZU1lbnUobWVudS0+cGFyZW50LT5zdWJtZW51X2lkLCBtZW51LT5pZCwgTUZfQllDT01NQU5EKTsKKwllbHNlCisJICAgIFJlbW92ZU1lbnUoc19tZW51QmFyLCBtZW51LT5pZCwgTUZfQllDT01NQU5EKTsKKwlpZiAobWVudS0+c3VibWVudV9pZCAhPSBOVUxMKQorCSAgICBEZXN0cm95TWVudShtZW51LT5zdWJtZW51X2lkKTsKKyNpZmRlZiBGRUFUX1RFQVJPRkYKKwlpZiAoSXNXaW5kb3cobWVudS0+dGVhcm9mZl9oYW5kbGUpKQorCSAgICBEZXN0cm95V2luZG93KG1lbnUtPnRlYXJvZmZfaGFuZGxlKTsKKwlpZiAobWVudS0+cGFyZW50ICE9IE5VTEwKKwkJJiYgbWVudS0+cGFyZW50LT5jaGlsZHJlbiAhPSBOVUxMCisJCSYmIElzV2luZG93KG1lbnUtPnBhcmVudC0+dGVhcm9mZl9oYW5kbGUpKQorCXsKKwkgICAgLyogVGhpcyBtZW51IG11c3Qgbm90IHNob3cgdXAgd2hlbiByZWJ1aWxkaW5nIHRoZSB0ZWFyb2ZmIHdpbmRvdy4gKi8KKwkgICAgbWVudS0+bW9kZXMgPSAwOworCSAgICByZWJ1aWxkX3RlYXJvZmYobWVudS0+cGFyZW50KTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX1RFQVJPRkYKKyAgICBzdGF0aWMgdm9pZAorcmVidWlsZF90ZWFyb2ZmKHZpbW1lbnVfVCAqbWVudSkKK3sKKyAgICAvKmhhY2tpc2gqLworICAgIGNoYXJfdQl0YnVmWzEyOF07CisgICAgUkVDVAl0cmVjdDsKKyAgICBSRUNUCXJjdDsKKyAgICBSRUNUCXJvY3Q7CisgICAgaW50CQl4LCB5OworCisgICAgSFdORCB0aHduZCA9IG1lbnUtPnRlYXJvZmZfaGFuZGxlOworCisgICAgR2V0V2luZG93VGV4dCh0aHduZCwgdGJ1ZiwgMTI3KTsKKyAgICBpZiAoR2V0V2luZG93UmVjdCh0aHduZCwgJnRyZWN0KQorCSAgICAmJiBHZXRXaW5kb3dSZWN0KHNfaHduZCwgJnJjdCkKKwkgICAgJiYgR2V0Q2xpZW50UmVjdChzX2h3bmQsICZyb2N0KSkKKyAgICB7CisJeCA9IHRyZWN0LmxlZnQgLSByY3QubGVmdDsKKwl5ID0gKHRyZWN0LnRvcCAtICByY3QuYm90dG9tICArIHJvY3QuYm90dG9tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl4ID0geSA9IDB4ZmZmZkw7CisgICAgfQorICAgIERlc3Ryb3lXaW5kb3codGh3bmQpOworICAgIGlmIChtZW51LT5jaGlsZHJlbiAhPSBOVUxMKQorICAgIHsKKwlndWlfbWNoX3RlYXJvZmYodGJ1ZiwgbWVudSwgeCwgeSk7CisJaWYgKElzV2luZG93KG1lbnUtPnRlYXJvZmZfaGFuZGxlKSkKKwkgICAgKHZvaWQpIFNldFdpbmRvd1BvcyhtZW51LT50ZWFyb2ZmX2hhbmRsZSwKKwkJCQlOVUxMLAorCQkJCShpbnQpdHJlY3QubGVmdCwKKwkJCQkoaW50KXRyZWN0LnRvcCwKKwkJCQkwLCAwLAorCQkJCVNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSk7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfVEVBUk9GRiAqLworCisvKgorICogTWFrZSBhIG1lbnUgZWl0aGVyIGdyZXkgb3Igbm90IGdyZXkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleSgKKyAgICB2aW1tZW51X1QJKm1lbnUsCisgICAgaW50CSAgICBncmV5KQoreworI2lmZGVmIEZFQVRfVE9PTEJBUgorICAgIC8qCisgICAgICogaXMgdGhpcyBhIHRvb2xiYXIgYnV0dG9uPworICAgICAqLworICAgIGlmIChtZW51LT5zdWJtZW51X2lkID09IChITUVOVSktMSkKKyAgICB7CisJU2VuZE1lc3NhZ2Uoc190b29sYmFyaHduZCwgVEJfRU5BQkxFQlVUVE9OLAorCSAgICAoV1BBUkFNKW1lbnUtPmlkLCAoTFBBUkFNKSBNQUtFTE9ORygoZ3JleSA/IEZBTFNFIDogVFJVRSksIDApICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChncmV5KQorCUVuYWJsZU1lbnVJdGVtKHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgICAgZWxzZQorCUVuYWJsZU1lbnVJdGVtKHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCB8IE1GX0VOQUJMRUQpOworCisjaWZkZWYgRkVBVF9URUFST0ZGCisgICAgaWYgKChtZW51LT5wYXJlbnQgIT0gTlVMTCkgJiYgKElzV2luZG93KG1lbnUtPnBhcmVudC0+dGVhcm9mZl9oYW5kbGUpKSkKKyAgICB7CisJV09SRCBtZW51SUQ7CisJSFdORCBtZW51SGFuZGxlOworCisJLyoKKwkgKiBBIHRlYXJvZmYgYnV0dG9uIGhhcyBjaGFuZ2VkIHN0YXRlLgorCSAqLworCWlmIChtZW51LT5jaGlsZHJlbiA9PSBOVUxMKQorCSAgICBtZW51SUQgPSAoV09SRCkobWVudS0+aWQpOworCWVsc2UKKwkgICAgbWVudUlEID0gKFdPUkQpKChEV09SRCkobWVudS0+c3VibWVudV9pZCkgfCAoRFdPUkQpMHg4MDAwKTsKKwltZW51SGFuZGxlID0gR2V0RGxnSXRlbShtZW51LT5wYXJlbnQtPnRlYXJvZmZfaGFuZGxlLCBtZW51SUQpOworCWlmIChtZW51SGFuZGxlKQorCSAgICBFbmFibGVXaW5kb3cobWVudUhhbmRsZSwgIWdyZXkpOworCisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGRUFUX01FTlUgKi8KKworCisvKiBkZWZpbmUgc29tZSBtYWNyb3MgdXNlZCB0byBtYWtlIHRoZSBkaWFsb2d1ZSBjcmVhdGlvbiBtb3JlIHJlYWRhYmxlICovCisKKyNkZWZpbmUgYWRkX3N0cmluZyhzKSBzdHJjcHkoKExQU1RSKXAsIHMpOyAoTFBTVFIpcCArPSAoc3RybGVuKChMUFNUUilwKSArIDEpCisjZGVmaW5lIGFkZF93b3JkKHgpCQkqcCsrID0gKHgpCisjZGVmaW5lIGFkZF9ieXRlKHgpCQkqKChMUFNUUilwKSsrID0gKHgpCisjZGVmaW5lIGFkZF9sb25nKHgpCQkqKChMUERXT1JEKXApKysgPSAoeCkKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHN0dWZmIGZvciBkaWFsb2dzCisgKi8KKworLyoKKyAqIFRoZSBjYWxsYmFjayByb3V0aW5lIHVzZWQgYnkgYWxsIHRoZSBkaWFsb2dzLiAgVmVyeSBzaW1wbGUuICBGaXJzdCwKKyAqIGFja25vd2xlZGdlcyB0aGUgSU5JVERJQUxPRyBtZXNzYWdlIHNvIHRoYXQgV2luZG93cyBrbm93cyB0byBkbyBzdGFuZGFyZAorICogZGlhbG9nIHN0dWZmIChSZXR1cm4gPSBkZWZhdWx0LCBFc2MgPSBjYW5jZWwuLi4uKSBTZWNvbmQsIGlmIGEgYnV0dG9uIGlzCisgKiBwcmVzc2VkLCByZXR1cm4gdGhhdCBidXR0b24ncyBJRCAtIElEQ0FOQ0VMICgyKSwgd2hpY2ggaXMgdGhlIGJ1dHRvbidzCisgKiBudW1iZXIuCisgKi8KKyAgICBzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSworZGlhbG9nX2NhbGxiYWNrKAorICAgIEhXTkQgaHduZCwKKyAgICBVSU5UIG1lc3NhZ2UsCisgICAgV1BBUkFNIHdQYXJhbSwKKyAgICBMUEFSQU0gbFBhcmFtKQoreworICAgIGlmIChtZXNzYWdlID09IFdNX0lOSVRESUFMT0cpCisgICAgeworCUNlbnRlcldpbmRvdyhod25kLCBHZXRXaW5kb3coaHduZCwgR1dfT1dORVIpKTsKKwkvKiBTZXQgZm9jdXMgdG8gdGhlIGRpYWxvZy4gIFNldCB0aGUgZGVmYXVsdCBidXR0b24sIGlmIHNwZWNpZmllZC4gKi8KKwkodm9pZClTZXRGb2N1cyhod25kKTsKKwlpZiAoZGlhbG9nX2RlZmF1bHRfYnV0dG9uID4gSURDQU5DRUwpCisJICAgICh2b2lkKVNldEZvY3VzKEdldERsZ0l0ZW0oaHduZCwgZGlhbG9nX2RlZmF1bHRfYnV0dG9uKSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChtZXNzYWdlID09IFdNX0NPTU1BTkQpCisgICAgeworCWludAlidXR0b24gPSBMT1dPUkQod1BhcmFtKTsKKworCS8qIERvbid0IGVuZCB0aGUgZGlhbG9nIGlmIHNvbWV0aGluZyB3YXMgc2VsZWN0ZWQgdGhhdCB3YXMKKwkgKiBub3QgYSBidXR0b24uCisJICovCisJaWYgKGJ1dHRvbiA+PSBETEdfTk9OQlVUVE9OX0NPTlRST0wpCisJICAgIHJldHVybiBUUlVFOworCisJLyogSWYgdGhlIGVkaXQgYm94IGV4aXN0cywgY29weSB0aGUgc3RyaW5nLiAqLworCWlmIChzX3RleHRmaWVsZCAhPSBOVUxMKQorCSAgICBHZXREbGdJdGVtVGV4dChod25kLCBETEdfTk9OQlVUVE9OX0NPTlRST0wgKyAyLAorCQkJCQkJCSBzX3RleHRmaWVsZCwgSU9TSVpFKTsKKworCS8qCisJICogTmVlZCB0byBjaGVjayBmb3IgSURPSyBiZWNhdXNlIGlmIHRoZSB1c2VyIGp1c3QgaGl0cyBSZXR1cm4gdG8KKwkgKiBhY2NlcHQgdGhlIGRlZmF1bHQgdmFsdWUsIHNvbWUgcmVhc29uIHRoaXMgaXMgd2hhdCB3ZSBnZXQuCisJICovCisJaWYgKGJ1dHRvbiA9PSBJRE9LKQorCXsKKwkgICAgaWYgKGRpYWxvZ19kZWZhdWx0X2J1dHRvbiA+IElEQ0FOQ0VMKQorCQlFbmREaWFsb2coaHduZCwgZGlhbG9nX2RlZmF1bHRfYnV0dG9uKTsKKwl9CisJZWxzZQorCSAgICBFbmREaWFsb2coaHduZCwgYnV0dG9uIC0gSURDQU5DRUwpOworCXJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICgobWVzc2FnZSA9PSBXTV9TWVNDT01NQU5EKSAmJiAod1BhcmFtID09IFNDX0NMT1NFKSkKKyAgICB7CisJRW5kRGlhbG9nKGh3bmQsIDApOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBkaWFsb2cgZHluYW1pY2FsbHkgZnJvbSB0aGUgcGFyYW1ldGVyIHN0cmluZ3MuCisgKiB0eXBlCQk9IHR5cGUgb2YgZGlhbG9nIChxdWVzdGlvbiwgYWxlcnQsIGV0Yy4pCisgKiB0aXRsZQk9IGRpYWxvZyB0aXRsZS4gbWF5IGJlIE5VTEwgZm9yIGRlZmF1bHQgdGl0bGUuCisgKiBtZXNzYWdlCT0gdGV4dCB0byBkaXNwbGF5LiBEaWFsb2cgc2l6ZXMgdG8gYWNjb21tb2RhdGUgaXQuCisgKiBidXR0b25zCT0gJ1xuJyBzZXBhcmF0ZWQgbGlzdCBvZiBidXR0b24gY2FwdGlvbnMsIGRlZmF1bHQgZmlyc3QuCisgKiBkZmx0YnV0dG9uCT0gbnVtYmVyIG9mIGRlZmF1bHQgYnV0dG9uLgorICoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIDEgaWYgdGhlIGZpcnN0IGJ1dHRvbiBpcyBwcmVzc2VkLAorICoJCQkyIGZvciB0aGUgc2Vjb25kLCBldGMuCisgKgorICoJCQkwIGluZGljYXRlcyBFc2Mgd2FzIHByZXNzZWQuCisgKgkJCS0xIGZvciB1bmV4cGVjdGVkIGVycm9yCisgKgorICogSWYgc3R1YmJpbmcgb3V0IHRoaXMgZm4sIHJldHVybiAxLgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyX3UgKmRsZ19pY29uc1tdID0gLyogbXVzdCBtYXRjaCBuYW1lcyBpbiByZXNvdXJjZSBmaWxlICovCit7CisgICAgIklEUl9WSU0iLAorICAgICJJRFJfVklNX0VSUk9SIiwKKyAgICAiSURSX1ZJTV9BTEVSVCIsCisgICAgIklEUl9WSU1fSU5GTyIsCisgICAgIklEUl9WSU1fUVVFU1RJT04iCit9OworCisjaWZkZWYgVVNFX1NZU01FTlVfRk9OVAorLyoKKyAqIEdldCBNZW51IEZvbnQuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2d1aV93MzJfZ2V0X21lbnVfZm9udChMT0dGT05UICpsZikKK3sKKyAgICBOT05DTElFTlRNRVRSSUNTIG5tOworCisgICAgbm0uY2JTaXplID0gc2l6ZW9mKE5PTkNMSUVOVE1FVFJJQ1MpOworICAgIGlmICghU3lzdGVtUGFyYW1ldGVyc0luZm8oCisJICAgIFNQSV9HRVROT05DTElFTlRNRVRSSUNTLAorCSAgICBzaXplb2YoTk9OQ0xJRU5UTUVUUklDUyksCisJICAgICZubSwKKwkgICAgMCkpCisJcmV0dXJuIEZBSUw7CisgICAgKmxmID0gbm0ubGZNZW51Rm9udDsKKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYKKworICAgIGludAorZ3VpX21jaF9kaWFsb2coCisgICAgaW50CQkgdHlwZSwKKyAgICBjaGFyX3UJKnRpdGxlLAorICAgIGNoYXJfdQkqbWVzc2FnZSwKKyAgICBjaGFyX3UJKmJ1dHRvbnMsCisgICAgaW50CQkgZGZsdGJ1dHRvbiwKKyAgICBjaGFyX3UJKnRleHRmaWVsZCkKK3sKKyAgICBXT1JECSpwLCAqcGRsZ3RlbXBsYXRlLCAqcG51bWl0ZW1zOworICAgIGludAkJbnVtQnV0dG9uczsKKyAgICBpbnQJCSpidXR0b25XaWR0aHMsICpidXR0b25Qb3NpdGlvbnM7CisgICAgaW50CQlidXR0b25ZcG9zOworICAgIGludAkJbmNoYXIsIGk7CisgICAgRFdPUkQJbFN0eWxlOworICAgIGludAkJZGxnd2lkdGggPSAwOworICAgIGludAkJZGxnaGVpZ2h0OworICAgIGludAkJZWRpdGJveGhlaWdodDsKKyAgICBpbnQJCWhvcml6V2lkdGggPSAwOworICAgIGludAkJbXNnaGVpZ2h0OworICAgIGNoYXJfdQkqcHN0YXJ0OworICAgIGNoYXJfdQkqcGVuZDsKKyAgICBjaGFyX3UJKnRidWZmZXI7CisgICAgUkVDVAlyZWN0OworICAgIEhXTkQJaHduZDsKKyAgICBIREMJCWhkYzsKKyAgICBIRk9OVAlmb250LCBvbGRGb250OworICAgIFRFWFRNRVRSSUMJZm9udEluZm87CisgICAgaW50CQlmb250SGVpZ2h0OworICAgIGludAkJdGV4dFdpZHRoLCBtaW5CdXR0b25XaWR0aCwgbWVzc2FnZVdpZHRoOworICAgIGludAkJbWF4RGlhbG9nV2lkdGg7CisgICAgaW50CQl2ZXJ0aWNhbDsKKyAgICBpbnQJCWRsZ1BhZGRpbmdYOworICAgIGludAkJZGxnUGFkZGluZ1k7CisjaWZkZWYgVVNFX1NZU01FTlVfRk9OVAorICAgIExPR0ZPTlQJbGZTeXNtZW51OworICAgIGludAkJdXNlX2xmU3lzbWVudSA9IEZBTFNFOworI2VuZGlmCisKKyNpZm5kZWYgTk9fQ09OU09MRQorICAgIC8qIERvbid0IG91dHB1dCBhbnl0aGluZyBpbiBzaWxlbnQgbW9kZSAoImV4IC1zIikgKi8KKyAgICBpZiAoc2lsZW50X21vZGUpCisJcmV0dXJuIGRmbHRidXR0b247ICAgLyogcmV0dXJuIGRlZmF1bHQgb3B0aW9uICovCisjZW5kaWYKKworICAgIC8qIElmIHRoZXJlIGlzIG5vIHdpbmRvdyB5ZXQsIG9wZW4gaXQuICovCisgICAgaWYgKHNfaHduZCA9PSBOVUxMICYmIGd1aV9tY2hfaW5pdCgpID09IEZBSUwpCisJcmV0dXJuIGRmbHRidXR0b247CisKKyAgICBpZiAoKHR5cGUgPCAwKSB8fCAodHlwZSA+IFZJTV9MQVNUX1RZUEUpKQorCXR5cGUgPSAwOworCisgICAgLyogYWxsb2NhdGUgc29tZSBtZW1vcnkgZm9yIGRpYWxvZyB0ZW1wbGF0ZSAqLworICAgIC8qIFRPRE8gc2hvdWxkIGNvbXB1dGUgdGhpcyByZWFsbHkqLworICAgIHBkbGd0ZW1wbGF0ZSA9IHAgPSAoUFdPUkQpTG9jYWxBbGxvYyhMUFRSLCBETEdfQUxMT0NfU0laRSk7CisKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qCisgICAgICogbWFrZSBhIGNvcHkgb2YgJ2J1dHRvbnMnIHRvIGZpZGRsZSB3aXRoIGl0LiAgY29tcGxpZXIgZ3JpenpsZXMgYmVjYXVzZQorICAgICAqIHZpbV9zdHJzYXZlKCkgZG9lc24ndCB0YWtlIGEgY29uc3QgYXJnICh3aHkgbm90PyksIHNvIGNhc3QgYXdheSB0aGUKKyAgICAgKiBjb25zdC4KKyAgICAgKi8KKyAgICB0YnVmZmVyID0gdmltX3N0cnNhdmUoYnV0dG9ucyk7CisgICAgaWYgKHRidWZmZXIgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAtLWRmbHRidXR0b247ICAgLyogQ2hhbmdlIGZyb20gb25lLWJhc2VkIHRvIHplcm8tYmFzZWQgKi8KKworICAgIC8qIENvdW50IGJ1dHRvbnMgKi8KKyAgICBudW1CdXR0b25zID0gMTsKKyAgICBmb3IgKGkgPSAwOyB0YnVmZmVyW2ldICE9ICdcMCc7IGkrKykKKyAgICB7CisJaWYgKHRidWZmZXJbaV0gPT0gRExHX0JVVFRPTl9TRVApCisJICAgIG51bUJ1dHRvbnMrKzsKKyAgICB9CisgICAgaWYgKGRmbHRidXR0b24gPj0gbnVtQnV0dG9ucykKKwlkZmx0YnV0dG9uID0gLTE7CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIHRoZSB3aWR0aCBvZiBlYWNoIGJ1dHRvbiAqLworICAgIGJ1dHRvbldpZHRocyA9IChpbnQgKikgbGFsbG9jKG51bUJ1dHRvbnMgKiBzaXplb2YoaW50KSwgVFJVRSk7CisgICAgaWYgKGJ1dHRvbldpZHRocyA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qIEFsbG9jYXRlIGFycmF5IHRvIGhvbGQgdGhlIFggcG9zaXRpb24gb2YgZWFjaCBidXR0b24gKi8KKyAgICBidXR0b25Qb3NpdGlvbnMgPSAoaW50ICopIGxhbGxvYyhudW1CdXR0b25zICogc2l6ZW9mKGludCksIFRSVUUpOworICAgIGlmIChidXR0b25Qb3NpdGlvbnMgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBob3cgYmlnIHRoZSBkaWFsb2cgbXVzdCBiZS4KKyAgICAgKi8KKyAgICBod25kID0gR2V0RGVza3RvcFdpbmRvdygpOworICAgIGhkYyA9IEdldFdpbmRvd0RDKGh3bmQpOworI2lmZGVmIFVTRV9TWVNNRU5VX0ZPTlQKKyAgICBpZiAoZ3VpX3czMl9nZXRfbWVudV9mb250KCZsZlN5c21lbnUpID09IE9LKQorICAgIHsKKwlmb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KCZsZlN5c21lbnUpOworCXVzZV9sZlN5c21lbnUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICBmb250ID0gQ3JlYXRlRm9udCgtRExHX0ZPTlRfUE9JTlRfU0laRSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJICAgICAgVkFSSUFCTEVfUElUQ0ggLCBETEdfRk9OVF9OQU1FKTsKKyAgICBpZiAoc191c2VuZXdsb29rKQorICAgIHsKKwlvbGRGb250ID0gU2VsZWN0Rm9udChoZGMsIGZvbnQpOworCWRsZ1BhZGRpbmdYID0gRExHX1BBRERJTkdfWDsKKwlkbGdQYWRkaW5nWSA9IERMR19QQURESU5HX1k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJb2xkRm9udCA9IFNlbGVjdEZvbnQoaGRjLCBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCkpOworCWRsZ1BhZGRpbmdYID0gRExHX09MRF9TVFlMRV9QQURESU5HX1g7CisJZGxnUGFkZGluZ1kgPSBETEdfT0xEX1NUWUxFX1BBRERJTkdfWTsKKyAgICB9CisgICAgR2V0VGV4dE1ldHJpY3MoaGRjLCAmZm9udEluZm8pOworICAgIGZvbnRIZWlnaHQgPSBmb250SW5mby50bUhlaWdodDsKKworICAgIC8qIE1pbmltdW0gd2lkdGggZm9yIGhvcml6b250YWwgYnV0dG9uICovCisgICAgbWluQnV0dG9uV2lkdGggPSBHZXRUZXh0V2lkdGgoaGRjLCAiQ2FuY2VsIiwgNik7CisKKyAgICAvKiBNYXhpbXVtIHdpZHRoIG9mIGEgZGlhbG9nLCBpZiBwb3NzaWJsZSAqLworICAgIEdldFdpbmRvd1JlY3Qoc19od25kLCAmcmVjdCk7CisgICAgbWF4RGlhbG9nV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0CisJCSAgICAgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlJBTUUpICogMjsKKyAgICBpZiAobWF4RGlhbG9nV2lkdGggPCBETEdfTUlOX01BWF9XSURUSCkKKwltYXhEaWFsb2dXaWR0aCA9IERMR19NSU5fTUFYX1dJRFRIOworCisgICAgLyogU2V0IGRsZ3dpZHRoIHRvIHdpZHRoIG9mIG1lc3NhZ2UgKi8KKyAgICBwc3RhcnQgPSBtZXNzYWdlOworICAgIG1lc3NhZ2VXaWR0aCA9IDA7CisgICAgbXNnaGVpZ2h0ID0gMDsKKyAgICBkbworICAgIHsKKwlwZW5kID0gdmltX3N0cmNocihwc3RhcnQsIERMR19CVVRUT05fU0VQKTsKKwlpZiAocGVuZCA9PSBOVUxMKQorCSAgICBwZW5kID0gcHN0YXJ0ICsgU1RSTEVOKHBzdGFydCk7CS8qIExhc3QgbGluZSBvZiBtZXNzYWdlLiAqLworCW1zZ2hlaWdodCArPSBmb250SGVpZ2h0OworCXRleHRXaWR0aCA9IEdldFRleHRXaWR0aChoZGMsIHBzdGFydCwgKGludCkocGVuZCAtIHBzdGFydCkpOworCWlmICh0ZXh0V2lkdGggPiBtZXNzYWdlV2lkdGgpCisJICAgIG1lc3NhZ2VXaWR0aCA9IHRleHRXaWR0aDsKKwlwc3RhcnQgPSBwZW5kICsgMTsKKyAgICB9IHdoaWxlICgqcGVuZCAhPSBOVUwpOworICAgIGRsZ3dpZHRoID0gbWVzc2FnZVdpZHRoOworCisgICAgLyogQWRkIHdpZHRoIG9mIGljb24gdG8gZGxnd2lkdGgsIGFuZCBzb21lIHNwYWNlICovCisgICAgZGxnd2lkdGggKz0gRExHX0lDT05fV0lEVEggKyAzICogZGxnUGFkZGluZ1g7CisKKyAgICBpZiAobXNnaGVpZ2h0IDwgRExHX0lDT05fSEVJR0hUKQorCW1zZ2hlaWdodCA9IERMR19JQ09OX0hFSUdIVDsKKworICAgIC8qCisgICAgICogQ2hlY2sgYnV0dG9uIG5hbWVzLiAgQSBsb25nIG9uZSB3aWxsIG1ha2UgdGhlIGRpYWxvZyB3aWRlci4KKyAgICAgKi8KKyAgICB2ZXJ0aWNhbCA9ICh2aW1fc3RyY2hyKHBfZ28sIEdPX1ZFUlRJQ0FMKSAhPSBOVUxMKTsKKyAgICBpZiAoIXZlcnRpY2FsKQorICAgIHsKKwkvLyBQbGFjZSBidXR0b25zIGhvcml6b250YWxseSBpZiB0aGV5IGZpdC4KKwlob3JpeldpZHRoID0gZGxnUGFkZGluZ1g7CisJcHN0YXJ0ID0gdGJ1ZmZlcjsKKwlpID0gMDsKKwlkbworCXsKKwkgICAgcGVuZCA9IHZpbV9zdHJjaHIocHN0YXJ0LCBETEdfQlVUVE9OX1NFUCk7CisJICAgIGlmIChwZW5kID09IE5VTEwpCisJCXBlbmQgPSBwc3RhcnQgKyBTVFJMRU4ocHN0YXJ0KTsJLy8gTGFzdCBidXR0b24gbmFtZS4KKwkgICAgdGV4dFdpZHRoID0gR2V0VGV4dFdpZHRoKGhkYywgcHN0YXJ0LCAoaW50KShwZW5kIC0gcHN0YXJ0KSk7CisJICAgIGlmICh0ZXh0V2lkdGggPCBtaW5CdXR0b25XaWR0aCkKKwkJdGV4dFdpZHRoID0gbWluQnV0dG9uV2lkdGg7CisJICAgIHRleHRXaWR0aCArPSBkbGdQYWRkaW5nWDsJICAgIC8qIFBhZGRpbmcgd2l0aGluIGJ1dHRvbiAqLworCSAgICBidXR0b25XaWR0aHNbaV0gPSB0ZXh0V2lkdGg7CisJICAgIGJ1dHRvblBvc2l0aW9uc1tpKytdID0gaG9yaXpXaWR0aDsKKwkgICAgaG9yaXpXaWR0aCArPSB0ZXh0V2lkdGggKyBkbGdQYWRkaW5nWDsgLyogUGFkIGJldHdlZW4gYnV0dG9ucyAqLworCSAgICBwc3RhcnQgPSBwZW5kICsgMTsKKwl9IHdoaWxlICgqcGVuZCAhPSBOVUwpOworCisJaWYgKGhvcml6V2lkdGggPiBtYXhEaWFsb2dXaWR0aCkKKwkgICAgdmVydGljYWwgPSBUUlVFOwkvLyBUb28gd2lkZSB0byBmaXQgb24gdGhlIHNjcmVlbi4KKwllbHNlIGlmIChob3JpeldpZHRoID4gZGxnd2lkdGgpCisJICAgIGRsZ3dpZHRoID0gaG9yaXpXaWR0aDsKKyAgICB9CisKKyAgICBpZiAodmVydGljYWwpCisgICAgeworCS8vIFN0YWNrIGJ1dHRvbnMgdmVydGljYWxseS4KKwlwc3RhcnQgPSB0YnVmZmVyOworCWRvCisJeworCSAgICBwZW5kID0gdmltX3N0cmNocihwc3RhcnQsIERMR19CVVRUT05fU0VQKTsKKwkgICAgaWYgKHBlbmQgPT0gTlVMTCkKKwkJcGVuZCA9IHBzdGFydCArIFNUUkxFTihwc3RhcnQpOwkvLyBMYXN0IGJ1dHRvbiBuYW1lLgorCSAgICB0ZXh0V2lkdGggPSBHZXRUZXh0V2lkdGgoaGRjLCBwc3RhcnQsIChpbnQpKHBlbmQgLSBwc3RhcnQpKTsKKwkgICAgdGV4dFdpZHRoICs9IGRsZ1BhZGRpbmdYOwkJLyogUGFkZGluZyB3aXRoaW4gYnV0dG9uICovCisJICAgIHRleHRXaWR0aCArPSBETEdfVkVSVF9QQURESU5HX1ggKiAyOyAvKiBQYWRkaW5nIGFyb3VuZCBidXR0b24gKi8KKwkgICAgaWYgKHRleHRXaWR0aCA+IGRsZ3dpZHRoKQorCQlkbGd3aWR0aCA9IHRleHRXaWR0aDsKKwkgICAgcHN0YXJ0ID0gcGVuZCArIDE7CisJfSB3aGlsZSAoKnBlbmQgIT0gTlVMKTsKKyAgICB9CisKKyAgICBpZiAoZGxnd2lkdGggPCBETEdfTUlOX1dJRFRIKQorCWRsZ3dpZHRoID0gRExHX01JTl9XSURUSDsJLyogRG9uJ3QgYWxsb3cgYSByZWFsbHkgdGhpbiBkaWFsb2chKi8KKworICAgIC8qIHN0YXJ0IHRvIGZpbGwgaW4gdGhlIGRsZ3RlbXBsYXRlIGluZm9ybWF0aW9uLiAgYWRkcmVzc2luZyBieSBXT1JEcyAqLworICAgIGlmIChzX3VzZW5ld2xvb2spCisJbFN0eWxlID0gRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfERTXzNETE9PS3wgV1NfVklTSUJMRSB8RFNfU0VURk9OVDsKKyAgICBlbHNlCisJbFN0eWxlID0gRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfERTXzNETE9PS3wgV1NfVklTSUJMRTsKKworICAgIGFkZF9sb25nKGxTdHlsZSk7CisgICAgYWRkX2xvbmcoMCk7CS8vIChsRXh0ZW5kZWRTdHlsZSkKKyAgICBwbnVtaXRlbXMgPSBwOwkvKnNhdmUgd2hlcmUgdGhlIG51bWJlciBvZiBpdGVtcyBtdXN0IGJlIHN0b3JlZCovCisgICAgYWRkX3dvcmQoMCk7CS8vIE51bWJlck9mSXRlbXMod2lsbCBjaGFuZ2UgbGF0ZXIpCisgICAgYWRkX3dvcmQoMTApOwkvLyB4CisgICAgYWRkX3dvcmQoMTApOwkvLyB5CisgICAgYWRkX3dvcmQoUGl4ZWxUb0RpYWxvZ1goZGxnd2lkdGgpKTsJLy8gY3gKKworICAgIC8vIERpYWxvZyBoZWlnaHQuCisgICAgaWYgKHZlcnRpY2FsKQorCWRsZ2hlaWdodCA9IG1zZ2hlaWdodCArIDIgKiBkbGdQYWRkaW5nWSArCisJCQkgICAgICBETEdfVkVSVF9QQURESU5HX1kgKyAyICogZm9udEhlaWdodCAqIG51bUJ1dHRvbnM7CisgICAgZWxzZQorCWRsZ2hlaWdodCA9IG1zZ2hlaWdodCArIDMgKiBkbGdQYWRkaW5nWSArIDIgKiBmb250SGVpZ2h0OworCisgICAgLy8gRGlhbG9nIG5lZWRzIHRvIGJlIHRhbGxlciBpZiBjb250YWlucyBhbiBlZGl0IGJveC4KKyAgICBlZGl0Ym94aGVpZ2h0ID0gZm9udEhlaWdodCArIGRsZ1BhZGRpbmdZICsgNCAqIERMR19WRVJUX1BBRERJTkdfWTsKKyAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCisJZGxnaGVpZ2h0ICs9IGVkaXRib3hoZWlnaHQ7CisKKyAgICBhZGRfd29yZChQaXhlbFRvRGlhbG9nWShkbGdoZWlnaHQpKTsKKworICAgIGFkZF93b3JkKDApOwkvLyBNZW51CisgICAgYWRkX3dvcmQoMCk7CS8vIENsYXNzCisKKyAgICAvKiBjb3B5IHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nICovCisgICAgbmNoYXIgPSBuQ29weUFuc2lUb1dpZGVDaGFyKHAsICh0aXRsZSA/CisJCQkJICAgIChMUFNUUil0aXRsZSA6CisJCQkJICAgIChMUFNUUikoIlZpbSAiVklNX1ZFUlNJT05fTUVESVVNKSkpOworICAgIHAgKz0gbmNoYXI7CisKKyAgICBpZiAoc191c2VuZXdsb29rKQorICAgIHsKKwkvKiBkbyB0aGUgZm9udCwgc2luY2UgRFNfM0RMT09LIGRvZXNuJ3Qgd29yayBwcm9wZXJseSAqLworI2lmZGVmIFVTRV9TWVNNRU5VX0ZPTlQKKwlpZiAodXNlX2xmU3lzbWVudSkKKwl7CisJICAgIC8qIHBvaW50IHNpemUgKi8KKwkgICAgKnArKyA9IC1NdWxEaXYobGZTeXNtZW51LmxmSGVpZ2h0LCA3MiwKKwkJICAgIEdldERldmljZUNhcHMoaGRjLCBMT0dQSVhFTFNZKSk7CisJICAgIG5jaGFyID0gbkNvcHlBbnNpVG9XaWRlQ2hhcihwLCBURVhUKGxmU3lzbWVudS5sZkZhY2VOYW1lKSk7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkgICAgKnArKyA9IERMR19GT05UX1BPSU5UX1NJWkU7CQkvLyBwb2ludCBzaXplCisJICAgIG5jaGFyID0gbkNvcHlBbnNpVG9XaWRlQ2hhcihwLCBURVhUKERMR19GT05UX05BTUUpKTsKKwl9CisJcCArPSBuY2hhcjsKKyAgICB9CisKKyAgICBidXR0b25ZcG9zID0gbXNnaGVpZ2h0ICsgMiAqIGRsZ1BhZGRpbmdZOworCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorCWJ1dHRvbllwb3MgKz0gZWRpdGJveGhlaWdodDsKKworICAgIHBzdGFydCA9IHRidWZmZXI7CisgICAgaWYgKCF2ZXJ0aWNhbCkKKwlob3JpeldpZHRoID0gKGRsZ3dpZHRoIC0gaG9yaXpXaWR0aCkgLyAyOwkvKiBOb3cgaXQncyBYIG9mZnNldCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1CdXR0b25zOyBpKyspCisgICAgeworCS8qIGdldCBlbmQgb2YgdGhpcyBidXR0b24uICovCisJZm9yICgJcGVuZCA9IHBzdGFydDsKKwkJKnBlbmQgJiYgKCpwZW5kICE9IERMR19CVVRUT05fU0VQKTsKKwkJcGVuZCsrKQorCSAgICA7CisKKwlpZiAoKnBlbmQpCisJICAgICpwZW5kID0gJ1wwJzsKKworCS8qCisJICogb2xkIE5PVEU6CisJICogc2V0dGluZyB0aGUgQlNfREVGUFVTSEJVVFRPTiBzdHlsZSBkb2Vzbid0IHdvcmsgYmVjYXVzZSBXaW5kb3dzIHNldHMKKwkgKiB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IHRhYi1hYmxlIGJ1dHRvbiBhbmQgaW4gc28gZG9pbmcgbWFrZXMgdGhhdAorCSAqIHRoZSBkZWZhdWx0ISEgR3Jyci4gIFdvcmthcm91bmQ6IE1ha2UgdGhlIGRlZmF1bHQgYnV0dG9uIHRoZSBvbmx5CisJICogb25lIHdpdGggV1NfVEFCU1RPUCBzdHlsZS4gTWVhbnMgdXNlciBjYW4ndCB0YWIgYmV0d2VlbiBidXR0b25zLCBidXQKKwkgKiBoZS9zaGUgY2FuIHVzZSBhcnJvdyBrZXlzLgorCSAqCisJICogbmV3IE5PVEU6IEJTX0RFRlBVU0hCVVRUT04gaXMgcmVxdWlyZWQgdG8gYmUgYWJsZSB0byBzZWxlY3QgdGhlCisJICogcmlnaHQgYnV0dHVuIHdoZW4gaGl0dGluZyA8RW50ZXI+LiAgRS5nLiwgZm9yIHRoZSAiOmNvbmZpcm0gcXVpdCIKKwkgKiBkaWFsb2cuICBBbHNvIG5lZWRlZCBmb3Igd2hlbiB0aGUgdGV4dGZpZWxkIGlzIHRoZSBkZWZhdWx0IGNvbnRyb2wuCisJICogSXQgYXBwZWFycyB0byB3b3JrIG5vdyAocGVyaGFwcyBub3Qgb24gV2luOTU/KS4KKwkgKi8KKwlpZiAodmVydGljYWwpCisJeworCSAgICBwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsCisJCSAgICAoaSA9PSBkZmx0YnV0dG9uCisJCQkgICAgPyBCU19ERUZQVVNIQlVUVE9OIDogQlNfUFVTSEJVVFRPTikgfCBXU19UQUJTVE9QLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1goRExHX1ZFUlRfUEFERElOR19YKSwKKwkJICAgIFBpeGVsVG9EaWFsb2dZKGJ1dHRvbllwb3MgLyogVEJLICovCisJCQkJICAgKyAyICogZm9udEhlaWdodCAqIGkpLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1goZGxnd2lkdGggLSAyICogRExHX1ZFUlRfUEFERElOR19YKSwKKwkJICAgIChXT1JEKShQaXhlbFRvRGlhbG9nWSgyICogZm9udEhlaWdodCkgLSAxKSwKKwkJICAgIChXT1JEKShJRENBTkNFTCArIDEgKyBpKSwgKFdPUkQpMHgwMDgwLCBwc3RhcnQpOworCX0KKwllbHNlCisJeworCSAgICBwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsCisJCSAgICAoaSA9PSBkZmx0YnV0dG9uCisJCQkgICAgPyBCU19ERUZQVVNIQlVUVE9OIDogQlNfUFVTSEJVVFRPTikgfCBXU19UQUJTVE9QLAorCQkgICAgUGl4ZWxUb0RpYWxvZ1goaG9yaXpXaWR0aCArIGJ1dHRvblBvc2l0aW9uc1tpXSksCisJCSAgICBQaXhlbFRvRGlhbG9nWShidXR0b25ZcG9zKSwgLyogVEJLICovCisJCSAgICBQaXhlbFRvRGlhbG9nWChidXR0b25XaWR0aHNbaV0pLAorCQkgICAgKFdPUkQpKFBpeGVsVG9EaWFsb2dZKDIgKiBmb250SGVpZ2h0KSAtIDEpLAorCQkgICAgKFdPUkQpKElEQ0FOQ0VMICsgMSArIGkpLCAoV09SRCkweDAwODAsIHBzdGFydCk7CisJfQorCXBzdGFydCA9IHBlbmQgKyAxOwkvKm5leHQgYnV0dG9uKi8KKyAgICB9CisgICAgKnBudW1pdGVtcyArPSBudW1CdXR0b25zOworCisgICAgLyogVmltIGljb24gKi8KKyAgICBwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsIFNTX0lDT04sCisJICAgIFBpeGVsVG9EaWFsb2dYKGRsZ1BhZGRpbmdYKSwKKwkgICAgUGl4ZWxUb0RpYWxvZ1koZGxnUGFkZGluZ1kpLAorCSAgICBQaXhlbFRvRGlhbG9nWChETEdfSUNPTl9XSURUSCksCisJICAgIFBpeGVsVG9EaWFsb2dZKERMR19JQ09OX0hFSUdIVCksCisJICAgIERMR19OT05CVVRUT05fQ09OVFJPTCArIDAsIChXT1JEKTB4MDA4MiwKKwkgICAgZGxnX2ljb25zW3R5cGVdKTsKKworICAgIC8qIERpYWxvZyBtZXNzYWdlICovCisgICAgcCA9IGFkZF9kaWFsb2dfZWxlbWVudChwLCBTU19MRUZULAorCSAgICBQaXhlbFRvRGlhbG9nWCgyICogZGxnUGFkZGluZ1ggKyBETEdfSUNPTl9XSURUSCksCisJICAgIFBpeGVsVG9EaWFsb2dZKGRsZ1BhZGRpbmdZKSwKKwkgICAgKFdPUkQpKFBpeGVsVG9EaWFsb2dYKG1lc3NhZ2VXaWR0aCkgKyAxKSwKKwkgICAgUGl4ZWxUb0RpYWxvZ1kobXNnaGVpZ2h0KSwKKwkgICAgRExHX05PTkJVVFRPTl9DT05UUk9MICsgMSwgKFdPUkQpMHgwMDgyLCBtZXNzYWdlKTsKKworICAgIC8qIEVkaXQgYm94ICovCisgICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQorICAgIHsKKwlwID0gYWRkX2RpYWxvZ19lbGVtZW50KHAsIEVTX0xFRlR8RVNfQVVUT0hTQ1JPTEx8V1NfVEFCU1RPUHxXU19CT1JERVIsCisJCVBpeGVsVG9EaWFsb2dYKDIgKiBkbGdQYWRkaW5nWCksCisJCVBpeGVsVG9EaWFsb2dZKDIgKiBkbGdQYWRkaW5nWSArIG1zZ2hlaWdodCksCisJCVBpeGVsVG9EaWFsb2dYKGRsZ3dpZHRoIC0gNCAqIGRsZ1BhZGRpbmdYKSwKKwkJUGl4ZWxUb0RpYWxvZ1koZm9udEhlaWdodCArIGRsZ1BhZGRpbmdZKSwKKwkJRExHX05PTkJVVFRPTl9DT05UUk9MICsgMiwgKFdPUkQpMHgwMDgxLCB0ZXh0ZmllbGQpOworCSpwbnVtaXRlbXMgKz0gMTsKKyAgICB9CisKKyAgICAqcG51bWl0ZW1zICs9IDI7CisKKyAgICBTZWxlY3RGb250KGhkYywgb2xkRm9udCk7CisgICAgRGVsZXRlT2JqZWN0KGZvbnQpOworICAgIFJlbGVhc2VEQyhod25kLCBoZGMpOworCisgICAgLyogTGV0IHRoZSBkaWFsb2dfY2FsbGJhY2soKSBmdW5jdGlvbiBrbm93IHdoaWNoIGJ1dHRvbiB0byBtYWtlIGRlZmF1bHQKKyAgICAgKiBJZiB3ZSBoYXZlIGFuIGVkaXQgYm94LCBtYWtlIHRoYXQgdGhlIGRlZmF1bHQuIFdlIGFsc28gbmVlZCB0byB0ZWxsCisgICAgICogZGlhbG9nX2NhbGxiYWNrKCkgaWYgdGhpcyBkaWFsb2cgY29udGFpbnMgYW4gZWRpdCBib3ggb3Igbm90LiBXZSBkbworICAgICAqIHRoaXMgYnkgc2V0dGluZyBzX3RleHRmaWVsZCBpZiBpdCBkb2VzLgorICAgICAqLworICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKKyAgICB7CisJZGlhbG9nX2RlZmF1bHRfYnV0dG9uID0gRExHX05PTkJVVFRPTl9DT05UUk9MICsgMjsKKwlzX3RleHRmaWVsZCA9IHRleHRmaWVsZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlkaWFsb2dfZGVmYXVsdF9idXR0b24gPSBJRENBTkNFTCArIDEgKyBkZmx0YnV0dG9uOworCXNfdGV4dGZpZWxkID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBzaG93IHRoZSBkaWFsb2cgYm94IG1vZGFsbHkgYW5kIGdldCBhIHJldHVybiB2YWx1ZSAqLworICAgIG5jaGFyID0gKGludClEaWFsb2dCb3hJbmRpcmVjdCgKKwkgICAgc19oaW5zdCwKKwkgICAgKExQRExHVEVNUExBVEUpcGRsZ3RlbXBsYXRlLAorCSAgICBzX2h3bmQsCisJICAgIChETEdQUk9DKWRpYWxvZ19jYWxsYmFjayk7CisKKyAgICBMb2NhbEZyZWUoTG9jYWxIYW5kbGUocGRsZ3RlbXBsYXRlKSk7CisgICAgdmltX2ZyZWUodGJ1ZmZlcik7CisgICAgdmltX2ZyZWUoYnV0dG9uV2lkdGhzKTsKKyAgICB2aW1fZnJlZShidXR0b25Qb3NpdGlvbnMpOworCisgICAgLyogRm9jdXMgYmFjayB0byBvdXIgd2luZG93IChmb3Igd2hlbiBNREkgaXMgdXNlZCkuICovCisgICAgKHZvaWQpU2V0Rm9jdXMoc19od25kKTsKKworICAgIHJldHVybiBuY2hhcjsKK30KKworI2VuZGlmIC8qIEZFQVRfR1VJX0RJQUxPRyAqLworLyoKKyAqIFB1dCBhIHNpbXBsZSBlbGVtZW50IChiYXNpYyBjbGFzcykgb250byBhIGRpYWxvZyB0ZW1wbGF0ZSBpbiBtZW1vcnkuCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBuZXh0IGl0ZW0gc2hvdWxkIGJlIGFkZGVkLgorICoKKyAqIHBhcmFtZXRlcnM6CisgKiAgbFN0eWxlID0gYWRkaXRpb25hbCBzdHlsZSBmbGFncworICoJCShiZSBjYXJlZnVsLCBOVDMuNTEgJiBXaW4zMnMgd2lsbCBpZ25vcmUgdGhlIG5ldyBvbmVzKQorICogIHgseSA9IHggJiB5IHBvc2l0aW9ucyBJTiBESUFMT0cgVU5JVFMKKyAqICB3LGggPSB3aWR0aCBhbmQgaGVpZ2h0IElOIERJQUxPRyBVTklUUworICogIElkICA9IElEIHVzZWQgaW4gbWVzc2FnZXMKKyAqICBjbHNzICA9IGNsYXNzIElELCBlLmcgMHgwMDgwIGZvciBhIGJ1dHRvbiwgMHgwMDgyIGZvciBhIHN0YXRpYworICogIGNhcHRpb24gPSB1c3VhbGx5IHRleHQgb3IgcmVzb3VyY2UgbmFtZQorICoKKyAqICBUT0RPOiB1c2UgdGhlIGxlbmd0aCBpbmZvcm1hdGlvbiBub3RlZCBoZXJlIHRvIGVuYWJsZSB0aGUgZGlhbG9nIGNyZWF0aW9uCisgKiAgcm91dGluZXMgdG8gd29yayBvdXQgbW9yZSBleGFjdGx5IGhvdyBtdWNoIG1lbW9yeSB0aGV5IG5lZWQgdG8gYWxsb2MuCisgKi8KKyAgICBzdGF0aWMgUFdPUkQKK2FkZF9kaWFsb2dfZWxlbWVudCgKKyAgICBQV09SRCBwLAorICAgIERXT1JEIGxTdHlsZSwKKyAgICBXT1JEIHgsCisgICAgV09SRCB5LAorICAgIFdPUkQgdywKKyAgICBXT1JEIGgsCisgICAgV09SRCBJZCwKKyAgICBXT1JEIGNsc3MsCisgICAgY29uc3QgY2hhciAqY2FwdGlvbikKK3sKKyAgICBpbnQgbmNoYXI7CisKKyAgICBwID0gbHB3QWxpZ24ocCk7CS8qIEFsaWduIHRvIGR3b3JkIGJvdW5kYXJ5Ki8KKyAgICBsU3R5bGUgPSBsU3R5bGUgfCBXU19WSVNJQkxFIHwgV1NfQ0hJTEQ7CisgICAgKnArKyA9IExPV09SRChsU3R5bGUpOworICAgICpwKysgPSBISVdPUkQobFN0eWxlKTsKKyAgICAqcCsrID0gMDsJCS8vIExPV09SRCAobEV4dGVuZGVkU3R5bGUpCisgICAgKnArKyA9IDA7CQkvLyBISVdPUkQgKGxFeHRlbmRlZFN0eWxlKQorICAgICpwKysgPSB4OworICAgICpwKysgPSB5OworICAgICpwKysgPSB3OworICAgICpwKysgPSBoOworICAgICpwKysgPSBJZDsJCS8vOSBvciAxMCB3b3JkcyBpbiBhbGwKKworICAgICpwKysgPSAoV09SRCkweGZmZmY7CisgICAgKnArKyA9IGNsc3M7CQkJLy8yIG1vcmUgaGVyZQorCisgICAgbmNoYXIgPSBuQ29weUFuc2lUb1dpZGVDaGFyKHAsIChMUFNUUiljYXB0aW9uKTsgLy9zdHJsZW4oY2FwdGlvbikrMQorICAgIHAgKz0gbmNoYXI7CisKKyAgICAqcCsrID0gMDsgIC8vIGFkdmFuY2UgcG9pbnRlciBvdmVyIG5FeHRyYVN0dWZmIFdPUkQgICAtIDIgbW9yZQorCisgICAgcmV0dXJuIHA7CS8vdG90YWwgPSAxNSsgKHN0cmxlbihjYXB0aW9uKSkgd29yZHMKKwkJLy8JICAgPSAzMCArIDIoc3RybGVuKGNhcHRpb24pIGJ5dGVzIHJlcWQKK30KKworCisvKgorICogSGVscGVyIHJvdXRpbmUuICBUYWtlIGFuIGlucHV0IHBvaW50ZXIsIHJldHVybiBjbG9zZXN0IHBvaW50ZXIgdGhhdCBpcworICogYWxpZ25lZCBvbiBhIERXT1JEICg0IGJ5dGUpIGJvdW5kYXJ5LiAgVGFrZW4gZnJvbSB0aGUgV2luMzJTREsgc2FtcGxlcy4KKyAqLworICAgIHN0YXRpYyBMUFdPUkQKK2xwd0FsaWduKAorICAgIExQV09SRCBscEluKQoreworICAgIFVMT05HIHVsOworCisgICAgdWwgPSAoVUxPTkcpbHBJbjsKKyAgICB1bCArPSAzOworICAgIHVsID4+PSAyOworICAgIHVsIDw8PSAyOworICAgIHJldHVybiAoTFBXT1JEKXVsOworfQorCisvKgorICogSGVscGVyIHJvdXRpbmUuICBUYWtlcyBzZWNvbmQgcGFyYW1ldGVyIGFzIEFuc2kgc3RyaW5nLCBjb3BpZXMgaXQgdG8gZmlyc3QKKyAqIHBhcmFtZXRlciBhcyB3aWRlIGNoYXJhY3RlciAoMTYtYml0cyAvIGNoYXIpIHN0cmluZywgYW5kIHJldHVybnMgaW50ZWdlcgorICogbnVtYmVyIG9mIHdpZGUgY2hhcmFjdGVycyAod29yZHMpIGluIHN0cmluZyAoaW5jbHVkaW5nIHRoZSB0cmFpbGluZyB3aWRlCisgKiBjaGFyIE5VTEwpLiAgUGFydGx5IHRha2VuIGZyb20gdGhlIFdpbjMyU0RLIHNhbXBsZXMuCisgKi8KKyAgICBzdGF0aWMgaW50CituQ29weUFuc2lUb1dpZGVDaGFyKAorICAgIExQV09SRCBscFdDU3RyLAorICAgIExQU1RSIGxwQW5zaUluKQoreworICAgIGludAkJbkNoYXIgPSAwOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWxlbiA9IGxzdHJsZW4obHBBbnNpSW4pICsgMTsJLyogaW5jbHVkZSBOVUwgY2hhcmFjdGVyICovCisgICAgaW50CQlpOworICAgIFdDSEFSCSp3bjsKKworICAgIGlmIChlbmNfY29kZXBhZ2UgPT0gMCAmJiAoaW50KUdldEFDUCgpICE9IGVuY19jb2RlcGFnZSkKKyAgICB7CisJLyogTm90IGEgY29kZXBhZ2UsIHVzZSBvdXIgb3duIGNvbnZlcnNpb24gZnVuY3Rpb24uICovCisJd24gPSBlbmNfdG9fdWNzMihscEFuc2lJbiwgTlVMTCk7CisJaWYgKHduICE9IE5VTEwpCisJeworCSAgICB3Y3NjcHkobHBXQ1N0ciwgd24pOworCSAgICBuQ2hhciA9IHdjc2xlbih3bikgKyAxOworCSAgICB2aW1fZnJlZSh3bik7CisJfQorICAgIH0KKyAgICBpZiAobkNoYXIgPT0gMCkKKwkvKiBVc2UgV2luMzIgY29udmVyc2lvbiBmdW5jdGlvbi4gKi8KKwluQ2hhciA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoCisJCWVuY19jb2RlcGFnZSA+IDAgPyBlbmNfY29kZXBhZ2UgOiBDUF9BQ1AsCisJCU1CX1BSRUNPTVBPU0VELAorCQlscEFuc2lJbiwgbGVuLAorCQlscFdDU3RyLCBsZW4pOworICAgIGZvciAoaSA9IDA7IGkgPCBuQ2hhcjsgKytpKQorCWlmIChscFdDU3RyW2ldID09IChXT1JEKSdcdCcpCS8qIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyAqLworCSAgICBscFdDU3RyW2ldID0gKFdPUkQpJyAnOworI2Vsc2UKKyAgICBkbworICAgIHsKKwlpZiAoKmxwQW5zaUluID09ICdcdCcpCisJICAgICpscFdDU3RyKysgPSAoV09SRCknICc7CisJZWxzZQorCSAgICAqbHBXQ1N0cisrID0gKFdPUkQpKmxwQW5zaUluOworCW5DaGFyKys7CisgICAgfSB3aGlsZSAoKmxwQW5zaUluKyspOworI2VuZGlmCisKKyAgICByZXR1cm4gbkNoYXI7Cit9CisKKworI2lmZGVmIEZFQVRfVEVBUk9GRgorLyoKKyAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYWxsIHRoZSBtb2RlbGVzcyBkaWFsb2dzIHRoYXQgbWFrZSB1cCB0aGUKKyAqICJ0ZWFyb2ZmIG1lbnVzIiBWZXJ5IHNpbXBsZSAtIGZvcndhcmQgYnV0dG9uIHByZXNzZXMgKHRvIGZvb2wgVmltIGludG8KKyAqIHRoaW5raW5nIGl0cyBtZW51cyBoYXZlIGJlZW4gY2xpY2tlZCksIGFuZCBnbyBhd2F5IHdoZW4gY2xvc2VkLgorICovCisgICAgc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sKK3RlYXJvZmZfY2FsbGJhY2soCisgICAgSFdORCBod25kLAorICAgIFVJTlQgbWVzc2FnZSwKKyAgICBXUEFSQU0gd1BhcmFtLAorICAgIExQQVJBTSBsUGFyYW0pCit7CisgICAgaWYgKG1lc3NhZ2UgPT0gV01fSU5JVERJQUxPRykKKwlyZXR1cm4gKFRSVUUpOworCisgICAgLyogTWF5IHNob3cgdGhlIG1vdXNlIHBvaW50ZXIgYWdhaW4uICovCisgICAgSGFuZGxlTW91c2VIaWRlKG1lc3NhZ2UsIGxQYXJhbSk7CisKKyAgICBpZiAobWVzc2FnZSA9PSBXTV9DT01NQU5EKQorICAgIHsKKwlpZiAoKFdPUkQpKExPV09SRCh3UGFyYW0pKSAmIDB4ODAwMCkKKwl7CisJICAgIFBPSU5UICAgbXA7CisJICAgIFJFQ1QgICAgcmVjdDsKKworCSAgICBpZiAoR2V0Q3Vyc29yUG9zKCZtcCkgJiYgR2V0V2luZG93UmVjdChod25kLCAmcmVjdCkpCisJICAgIHsKKwkJKHZvaWQpVHJhY2tQb3B1cE1lbnUoCisJCQkgKEhNRU5VKShMT1dPUkQod1BhcmFtKSBeIDB4ODAwMCksCisJCQkgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAorCQkJIChpbnQpcmVjdC5yaWdodCAtIDgsCisJCQkgKGludCltcC55LAorCQkJIChpbnQpMCwJICAgIC8qcmVzZXJ2ZWQgcGFyYW0qLworCQkJIHNfaHduZCwKKwkJCSBOVUxMKTsKKwkJLyoKKwkJICogTk9URTogVGhlIHBvcC11cCBtZW51IGNhbiBlYXQgdGhlIG1vdXNlIHVwIGV2ZW50LgorCQkgKiBXZSBkZWFsIHdpdGggdGhpcyBpbiBub3JtYWwuYy4KKwkJICovCisJICAgIH0KKwl9CisJZWxzZQorCSAgICAvKiBQYXNzIG9uIG1lc3NhZ2VzIHRvIHRoZSBtYWluIFZpbSB3aW5kb3cgKi8KKwkgICAgUG9zdE1lc3NhZ2Uoc19od25kLCBXTV9DT01NQU5ELCBMT1dPUkQod1BhcmFtKSwgMCk7CisJLyoKKwkgKiBHaXZlIG1haW4gd2luZG93IHRoZSBmb2N1cyBiYWNrOiB0aGlzIGlzIHNvIGFmdGVyCisJICogY2hvb3NpbmcgYSB0ZWFyb2ZmIGJ1dHRvbiB5b3UgY2FuIHN0YXJ0IHR5cGluZyBhZ2FpbgorCSAqIHN0cmFpZ2h0IGF3YXkuCisJICovCisJKHZvaWQpU2V0Rm9jdXMoc19od25kKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKChtZXNzYWdlID09IFdNX1NZU0NPTU1BTkQpICYmICh3UGFyYW0gPT0gU0NfQ0xPU0UpKQorICAgIHsKKwlEZXN0cm95V2luZG93KGh3bmQpOworCXJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qIFdoZW4gbW92ZWQgYXJvdW5kLCBnaXZlIG1haW4gd2luZG93IHRoZSBmb2N1cyBiYWNrLiAqLworICAgIGlmIChtZXNzYWdlID09IFdNX0VYSVRTSVpFTU9WRSkKKwkodm9pZClTZXRBY3RpdmVXaW5kb3coc19od25kKTsKKworICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBEZWNpZGUgd2hldGhlciB0byB1c2UgdGhlICJuZXcgbG9vayIgKHNtYWxsLCBub24tYm9sZCBmb250KSBvciB0aGUgIm9sZAorICogbG9vayIgKGJpZywgY2xhbmt5IGZvbnQpIGZvciBkaWFsb2dzLCBhbmQgd29yayBvdXQgYSBmZXcgdmFsdWVzIGZvciB1c2UKKyAqIGxhdGVyIGFjY29yZGluZ2x5LgorICovCisgICAgc3RhdGljIHZvaWQKK2dldF9kaWFsb2dfZm9udF9tZXRyaWNzKHZvaWQpCit7CisgICAgSERDCQkgICAgaGRjOworICAgIEhGT05UCSAgICBoZm9udFRvb2xzID0gMDsKKyAgICBEV09SRAkgICAgZGxnRm9udFNpemU7CisgICAgU0laRQkgICAgc2l6ZTsKKyNpZmRlZiBVU0VfU1lTTUVOVV9GT05UCisgICAgTE9HRk9OVAkgICAgbGZTeXNtZW51OworI2VuZGlmCisKKyAgICBzX3VzZW5ld2xvb2sgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogRm9yIE5UMy41MSBhbmQgV2luMzJzLCB3ZSBzdGljayB3aXRoIHRoZSBvbGQgbG9vaworICAgICAqIGJlY2F1c2UgaXQgbWF0Y2hlcyBldmVyeXRoaW5nIGVsc2UuCisgICAgICovCisgICAgaWYgKCFpc193aW5udF8zKCkpCisgICAgeworI2lmZGVmIFVTRV9TWVNNRU5VX0ZPTlQKKwlpZiAoZ3VpX3czMl9nZXRfbWVudV9mb250KCZsZlN5c21lbnUpID09IE9LKQorCSAgICBoZm9udFRvb2xzID0gQ3JlYXRlRm9udEluZGlyZWN0KCZsZlN5c21lbnUpOworCWVsc2UKKyNlbmRpZgorCWhmb250VG9vbHMgPSBDcmVhdGVGb250KC1ETEdfRk9OVF9QT0lOVF9TSVpFLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCTAsIDAsIDAsIDAsIFZBUklBQkxFX1BJVENIICwgRExHX0ZPTlRfTkFNRSk7CisKKwlpZiAoaGZvbnRUb29scykKKwl7CisJICAgIGhkYyA9IEdldERDKHNfaHduZCk7CisJICAgIFNlbGVjdE9iamVjdChoZGMsIGhmb250VG9vbHMpOworCSAgICAvKgorCSAgICAgKiBHZXRUZXh0TWV0cmljcygpIGRvZXNuJ3QgcmV0dXJuIHRoZSByaWdodCB2YWx1ZSBpbgorCSAgICAgKiB0bUF2ZUNoYXJXaWR0aCwgc28gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBkaWFsb2cgYmFzZSB1bml0cworCSAgICAgKiBvdXJzZWx2ZXMuCisJICAgICAqLworCSAgICBHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLAorCQkgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkgICAgNTIsICZzaXplKTsKKwkgICAgUmVsZWFzZURDKHNfaHduZCwgaGRjKTsKKworCSAgICBzX2RsZ2ZudHdpZHRoID0gKFdPUkQpKChzaXplLmN4IC8gMjYgKyAxKSAvIDIpOworCSAgICBzX2RsZ2ZudGhlaWdodCA9IChXT1JEKXNpemUuY3k7CisJICAgIHNfdXNlbmV3bG9vayA9IFRSVUU7CisJfQorICAgIH0KKworICAgIGlmICghc191c2VuZXdsb29rKQorICAgIHsKKwlkbGdGb250U2l6ZSA9IEdldERpYWxvZ0Jhc2VVbml0cygpOwkvKiBmYWxsIGJhY2sgdG8gYmlnIG9sZCBzeXN0ZW0qLworCXNfZGxnZm50d2lkdGggPSBMT1dPUkQoZGxnRm9udFNpemUpOworCXNfZGxnZm50aGVpZ2h0ID0gSElXT1JEKGRsZ0ZvbnRTaXplKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgZGVmaW5lZChGRUFUX1RFQVJPRkYpCisvKgorICogQ3JlYXRlIGEgcHNldWRvLSJ0ZWFyb2ZmIG1lbnUiIGJhc2VkIG9uIHRoZSBjaGlsZAorICogaXRlbXMgb2YgYSBnaXZlbiBtZW51IHBvaW50ZXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX21jaF90ZWFyb2ZmKAorICAgIGNoYXJfdQkqdGl0bGUsCisgICAgdmltbWVudV9UCSptZW51LAorICAgIGludAkJaW5pdFgsCisgICAgaW50CQlpbml0WSkKK3sKKyAgICBXT1JECSpwLCAqcGRsZ3RlbXBsYXRlLCAqcG51bWl0ZW1zLCAqcHRydWVoZWlnaHQ7CisgICAgaW50CQl0ZW1wbGF0ZV9sZW47CisgICAgaW50CQluY2hhciwgdGV4dFdpZHRoLCBzdWJtZW51V2lkdGg7CisgICAgRFdPUkQJbFN0eWxlOworICAgIERXT1JECWxFeHRlbmRlZFN0eWxlOworICAgIFdPUkQJZGxnd2lkdGg7CisgICAgV09SRAltZW51SUQ7CisgICAgdmltbWVudV9UCSpwbWVudTsKKyAgICB2aW1tZW51X1QJKnRoZV9tZW51ID0gbWVudTsKKyAgICBIV05ECWh3bmQ7CisgICAgSERDCQloZGM7CisgICAgSEZPTlQJZm9udCwgb2xkRm9udDsKKyAgICBpbnQJCWNvbCwgc3BhY2VXaWR0aCwgbGVuOworICAgIGludAkJY29sdW1uV2lkdGhzWzJdOworICAgIGNoYXJfdQkqbGFiZWwsICp0ZXh0OworICAgIGludAkJYWNMZW4gPSAwOworICAgIGludAkJbmFtZUxlbjsKKyAgICBpbnQJCXBhZGRpbmcwLCBwYWRkaW5nMSwgcGFkZGluZzIgPSAwOworICAgIGludAkJc2VwUGFkZGluZz0wOworI2lmZGVmIFVTRV9TWVNNRU5VX0ZPTlQKKyAgICBMT0dGT05UCWxmU3lzbWVudTsKKyAgICBpbnQJCXVzZV9sZlN5c21lbnUgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGlzIG1lbnUgaXMgYWxyZWFkeSB0b3JuIG9mZiwgbW92ZSBpdCB0byB0aGUgbW91c2UgcG9zaXRpb24uCisgICAgICovCisgICAgaWYgKElzV2luZG93KG1lbnUtPnRlYXJvZmZfaGFuZGxlKSkKKyAgICB7CisJUE9JTlQgbXA7CisJaWYgKEdldEN1cnNvclBvcygoTFBQT0lOVCkmbXApKQorCXsKKwkgICAgU2V0V2luZG93UG9zKG1lbnUtPnRlYXJvZmZfaGFuZGxlLCBOVUxMLCBtcC54LCBtcC55LCAwLCAwLAorCQkgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9TSVpFIHwgU1dQX05PWk9SREVSKTsKKwl9CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIGEgbmV3IHRlYXJvZmYuCisgICAgICovCisgICAgaWYgKCp0aXRsZSA9PSBNTlVfSElEREVOX0NIQVIpCisJdGl0bGUrKzsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgZGlhbG9nIHRlbXBsYXRlLiAgSXQncyBtYWRlIGJpZ2dlciB3aGVuCisgICAgICogbmVlZGVkLiAqLworICAgIHRlbXBsYXRlX2xlbiA9IERMR19BTExPQ19TSVpFOworICAgIHBkbGd0ZW1wbGF0ZSA9IHAgPSAoV09SRCAqKUxvY2FsQWxsb2MoTFBUUiwgdGVtcGxhdGVfbGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CisgICAgaGRjID0gR2V0V2luZG93REMoaHduZCk7CisjaWZkZWYgVVNFX1NZU01FTlVfRk9OVAorICAgIGlmIChndWlfdzMyX2dldF9tZW51X2ZvbnQoJmxmU3lzbWVudSkgPT0gT0spCisgICAgeworCWZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QoJmxmU3lzbWVudSk7CisJdXNlX2xmU3lzbWVudSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGZvbnQgPSBDcmVhdGVGb250KC1ETEdfRk9OVF9QT0lOVF9TSVpFLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkgICAgICBWQVJJQUJMRV9QSVRDSCAsIERMR19GT05UX05BTUUpOworICAgIGlmIChzX3VzZW5ld2xvb2spCisJb2xkRm9udCA9IFNlbGVjdEZvbnQoaGRjLCBmb250KTsKKyAgICBlbHNlCisJb2xkRm9udCA9IFNlbGVjdEZvbnQoaGRjLCBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCkpOworCisgICAgLyogQ2FsY3VsYXRlIHdpZHRoIG9mIGEgc2luZ2xlIHNwYWNlLiAgVXNlZCBmb3IgcGFkZGluZyBjb2x1bW5zIHRvIHRoZQorICAgICAqIHJpZ2h0IHdpZHRoLiAqLworICAgIHNwYWNlV2lkdGggPSBHZXRUZXh0V2lkdGgoaGRjLCAiICIsIDEpOworCisgICAgLyogRmlndXJlIG91dCBtYXggd2lkdGggb2YgdGhlIHRleHQgY29sdW1uLCB0aGUgYWNjZWxlcmF0b3IgY29sdW1uIGFuZCB0aGUKKyAgICAgKiBvcHRpb25hbCBzdWJtZW51IGNvbHVtbi4gKi8KKyAgICBzdWJtZW51V2lkdGggPSAwOworICAgIGZvciAoY29sID0gMDsgY29sIDwgMjsgY29sKyspCisgICAgeworCWNvbHVtbldpZHRoc1tjb2xdID0gMDsKKwlmb3IgKHBtZW51ID0gbWVudS0+Y2hpbGRyZW47IHBtZW51ICE9IE5VTEw7IHBtZW51ID0gcG1lbnUtPm5leHQpCisJeworCSAgICAvKiBVc2UgImRuYW1lIiBoZXJlIHRvIGNvbXB1dGUgdGhlIHdpZHRoIG9mIHRoZSB2aXNpYmxlIHRleHQuICovCisJICAgIHRleHQgPSAoY29sID09IDApID8gcG1lbnUtPmRuYW1lIDogcG1lbnUtPmFjdGV4dDsKKwkgICAgaWYgKHRleHQgIT0gTlVMTCAmJiAqdGV4dCAhPSBOVUwpCisJICAgIHsKKwkJdGV4dFdpZHRoID0gR2V0VGV4dFdpZHRoRW5jKGhkYywgdGV4dCwgKGludClTVFJMRU4odGV4dCkpOworCQlpZiAodGV4dFdpZHRoID4gY29sdW1uV2lkdGhzW2NvbF0pCisJCSAgICBjb2x1bW5XaWR0aHNbY29sXSA9IHRleHRXaWR0aDsKKwkgICAgfQorCSAgICBpZiAocG1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCisJCXN1Ym1lbnVXaWR0aCA9IFRFQVJPRkZfQ09MVU1OX1BBRERJTkcgKiBzcGFjZVdpZHRoOworCX0KKyAgICB9CisgICAgaWYgKGNvbHVtbldpZHRoc1sxXSA9PSAwKQorICAgIHsKKwkvKiBubyBhY2NlbGVyYXRvcnMgKi8KKwlpZiAoc3VibWVudVdpZHRoICE9IDApCisJICAgIGNvbHVtbldpZHRoc1swXSArPSBzdWJtZW51V2lkdGg7CisJZWxzZQorCSAgICBjb2x1bW5XaWR0aHNbMF0gKz0gc3BhY2VXaWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiB0aGVyZSBpcyBhbiBhY2NlbGVyYXRvciBjb2x1bW4gKi8KKwljb2x1bW5XaWR0aHNbMF0gKz0gVEVBUk9GRl9DT0xVTU5fUEFERElORyAqIHNwYWNlV2lkdGg7CisJY29sdW1uV2lkdGhzWzFdICs9IHN1Ym1lbnVXaWR0aDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyBmaW5kIHRoZSB0b3RhbCB3aWR0aCBvZiBvdXIgJ21lbnUnLgorICAgICAqLworICAgIHRleHRXaWR0aCA9IGNvbHVtbldpZHRoc1swXSArIGNvbHVtbldpZHRoc1sxXTsKKyAgICBpZiAoc3VibWVudVdpZHRoICE9IDApCisgICAgeworCXN1Ym1lbnVXaWR0aCA9IEdldFRleHRXaWR0aChoZGMsIFRFQVJPRkZfU1VCTUVOVV9MQUJFTCwKKwkJCQkJICAoaW50KVNUUkxFTihURUFST0ZGX1NVQk1FTlVfTEFCRUwpKTsKKwl0ZXh0V2lkdGggKz0gc3VibWVudVdpZHRoOworICAgIH0KKyAgICBkbGd3aWR0aCA9IEdldFRleHRXaWR0aEVuYyhoZGMsIHRpdGxlLCAoaW50KVNUUkxFTih0aXRsZSkpOworICAgIGlmICh0ZXh0V2lkdGggPiBkbGd3aWR0aCkKKwlkbGd3aWR0aCA9IHRleHRXaWR0aDsKKyAgICBkbGd3aWR0aCArPSAyICogVEVBUk9GRl9QQURESU5HX1ggKyBURUFST0ZGX0JVVFRPTl9QQURfWDsKKworICAgIC8qIFc5NSBjYW4ndCBkbyB0aGluIGRpYWxvZ3MsIHRoZXkgbG9vayB2LiB3ZWlyZCEgKi8KKyAgICBpZiAobWNoX3dpbmRvd3M5NSgpICYmIGRsZ3dpZHRoIDwgVEVBUk9GRl9NSU5fV0lEVEgpCisJZGxnd2lkdGggPSBURUFST0ZGX01JTl9XSURUSDsKKworICAgIC8qIHN0YXJ0IHRvIGZpbGwgaW4gdGhlIGRsZ3RlbXBsYXRlIGluZm9ybWF0aW9uLiAgYWRkcmVzc2luZyBieSBXT1JEcyAqLworICAgIGlmIChzX3VzZW5ld2xvb2spCisJbFN0eWxlID0gRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT058IFdTX1NZU01FTlUgfERTX1NFVEZPTlR8IFdTX1ZJU0lCTEU7CisgICAgZWxzZQorCWxTdHlsZSA9IERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRTsKKworICAgIGxFeHRlbmRlZFN0eWxlID0gV1NfRVhfVE9PTFdJTkRPV3xXU19FWF9TVEFUSUNFREdFOworICAgICpwKysgPSBMT1dPUkQobFN0eWxlKTsKKyAgICAqcCsrID0gSElXT1JEKGxTdHlsZSk7CisgICAgKnArKyA9IExPV09SRChsRXh0ZW5kZWRTdHlsZSk7CisgICAgKnArKyA9IEhJV09SRChsRXh0ZW5kZWRTdHlsZSk7CisgICAgcG51bWl0ZW1zID0gcDsJLyogc2F2ZSB3aGVyZSB0aGUgbnVtYmVyIG9mIGl0ZW1zIG11c3QgYmUgc3RvcmVkICovCisgICAgKnArKyA9IDA7CQkvLyBOdW1iZXJPZkl0ZW1zKHdpbGwgY2hhbmdlIGxhdGVyKQorICAgIGlmIChpbml0WCA9PSAweGZmZmZMKQorCSpwKysgPSBQaXhlbFRvRGlhbG9nWChndWlfbWNoX2dldF9tb3VzZV94KCkpOyAvLyB4CisgICAgZWxzZQorCSpwKysgPSBQaXhlbFRvRGlhbG9nWChpbml0WCk7IC8vIHgKKyAgICBpZiAoaW5pdFkgPT0gMHhmZmZmTCkKKwkqcCsrID0gUGl4ZWxUb0RpYWxvZ1koZ3VpX21jaF9nZXRfbW91c2VfeSgpKTsgLy8geQorICAgIGVsc2UKKwkqcCsrID0gUGl4ZWxUb0RpYWxvZ1koaW5pdFkpOyAvLyB5CisgICAgKnArKyA9IFBpeGVsVG9EaWFsb2dYKGRsZ3dpZHRoKTsgICAgLy8gY3gKKyAgICBwdHJ1ZWhlaWdodCA9IHA7CisgICAgKnArKyA9IDA7CQkvLyBkaWFsb2cgaGVpZ2h0OiBjaGFuZ2VkIGxhdGVyIGFueXdheQorICAgICpwKysgPSAwOwkJLy8gTWVudQorICAgICpwKysgPSAwOwkJLy8gQ2xhc3MKKworICAgIC8qIGNvcHkgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgKi8KKyAgICBuY2hhciA9IG5Db3B5QW5zaVRvV2lkZUNoYXIocCwgKCgqdGl0bGUpCisJCQkJICAgID8gKExQU1RSKXRpdGxlCisJCQkJICAgIDogKExQU1RSKSgiVmltICJWSU1fVkVSU0lPTl9NRURJVU0pKSk7CisgICAgcCArPSBuY2hhcjsKKworICAgIGlmIChzX3VzZW5ld2xvb2spCisgICAgeworCS8qIGRvIHRoZSBmb250LCBzaW5jZSBEU18zRExPT0sgZG9lc24ndCB3b3JrIHByb3Blcmx5ICovCisjaWZkZWYgVVNFX1NZU01FTlVfRk9OVAorCWlmICh1c2VfbGZTeXNtZW51KQorCXsKKwkgICAgLyogcG9pbnQgc2l6ZSAqLworCSAgICAqcCsrID0gLU11bERpdihsZlN5c21lbnUubGZIZWlnaHQsIDcyLAorCQkgICAgR2V0RGV2aWNlQ2FwcyhoZGMsIExPR1BJWEVMU1kpKTsKKwkgICAgbmNoYXIgPSBuQ29weUFuc2lUb1dpZGVDaGFyKHAsIFRFWFQobGZTeXNtZW51LmxmRmFjZU5hbWUpKTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICAqcCsrID0gRExHX0ZPTlRfUE9JTlRfU0laRTsJCS8vIHBvaW50IHNpemUKKwkgICAgbmNoYXIgPSBuQ29weUFuc2lUb1dpZGVDaGFyIChwLCBURVhUKERMR19GT05UX05BTUUpKTsKKwl9CisJcCArPSBuY2hhcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExvb3Agb3ZlciBhbGwgdGhlIGl0ZW1zIGluIHRoZSBtZW51LgorICAgICAqIEJ1dCBza2lwIG92ZXIgdGhlIHRlYXJiYXIuCisgICAgICovCisgICAgaWYgKFNUUkNNUChtZW51LT5jaGlsZHJlbi0+bmFtZSwgVEVBUl9TVFJJTkcpID09IDApCisJbWVudSA9IG1lbnUtPmNoaWxkcmVuLT5uZXh0OworICAgIGVsc2UKKwltZW51ID0gbWVudS0+Y2hpbGRyZW47CisgICAgZm9yICggOyBtZW51ICE9IE5VTEw7IG1lbnUgPSBtZW51LT5uZXh0KQorICAgIHsKKwlpZiAobWVudS0+bW9kZXMgPT0gMCkJLyogdGhpcyBtZW51IGhhcyBqdXN0IGJlZW4gZGVsZXRlZCAqLworCSAgICBjb250aW51ZTsKKwlpZiAobWVudV9pc19zZXBhcmF0b3IobWVudS0+ZG5hbWUpKQorCXsKKwkgICAgc2VwUGFkZGluZyArPSAzOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSBzdGlsbCBpcyBwbGVudHkgb2Ygcm9vbSBpbiB0aGUgdGVtcGxhdGUuICBNYWtlIGl0CisJICogbGFyZ2VyIHdoZW4gbmVlZGVkLiAqLworCWlmICgoKGNoYXIgKilwIC0gKGNoYXIgKilwZGxndGVtcGxhdGUpICsgMTAwMCA+IHRlbXBsYXRlX2xlbikKKwl7CisJICAgIFdPUkQgICAgKm5ld3A7CisKKwkgICAgbmV3cCA9IChXT1JEICopTG9jYWxBbGxvYyhMUFRSLCB0ZW1wbGF0ZV9sZW4gKyA0MDk2KTsKKwkgICAgaWYgKG5ld3AgIT0gTlVMTCkKKwkgICAgeworCQl0ZW1wbGF0ZV9sZW4gKz0gNDA5NjsKKwkJbWNoX21lbW1vdmUobmV3cCwgcGRsZ3RlbXBsYXRlLAorCQkJCQkgICAgKGNoYXIgKilwIC0gKGNoYXIgKilwZGxndGVtcGxhdGUpOworCQlwID0gbmV3cCArIChwIC0gcGRsZ3RlbXBsYXRlKTsKKwkJcG51bWl0ZW1zID0gbmV3cCArIChwbnVtaXRlbXMgLSBwZGxndGVtcGxhdGUpOworCQlwdHJ1ZWhlaWdodCA9IG5ld3AgKyAocHRydWVoZWlnaHQgLSBwZGxndGVtcGxhdGUpOworCQlMb2NhbEZyZWUoTG9jYWxIYW5kbGUocGRsZ3RlbXBsYXRlKSk7CisJCXBkbGd0ZW1wbGF0ZSA9IG5ld3A7CisJICAgIH0KKwl9CisKKwkvKiBGaWd1cmUgb3V0IG1pbmltYWwgbGVuZ3RoIG9mIHRoaXMgbWVudSBsYWJlbC4gIFVzZSAibmFtZSIgZm9yIHRoZQorCSAqIGFjdHVhbCB0ZXh0LCAiZG5hbWUiIGZvciBlc3RpbWF0aW5nIHRoZSBkaXNwbGF5ZWQgc2l6ZS4gICJuYW1lIgorCSAqIGhhcyAiJmEiIGZvciBtbmVtb25pYyBhbmQgaW5jbHVkZXMgdGhlIGFjY2VsZXJhdG9yLiAqLworCWxlbiA9IG5hbWVMZW4gPSAoaW50KVNUUkxFTihtZW51LT5uYW1lKTsKKwlwYWRkaW5nMCA9IChjb2x1bW5XaWR0aHNbMF0gLSBHZXRUZXh0V2lkdGhFbmMoaGRjLCBtZW51LT5kbmFtZSwKKwkJCQkgICAgICAoaW50KVNUUkxFTihtZW51LT5kbmFtZSkpKSAvIHNwYWNlV2lkdGg7CisJbGVuICs9IHBhZGRpbmcwOworCisJaWYgKG1lbnUtPmFjdGV4dCAhPSBOVUxMKQorCXsKKwkgICAgYWNMZW4gPSAoaW50KVNUUkxFTihtZW51LT5hY3RleHQpOworCSAgICBsZW4gKz0gYWNMZW47CisJICAgIHRleHRXaWR0aCA9IEdldFRleHRXaWR0aEVuYyhoZGMsIG1lbnUtPmFjdGV4dCwgYWNMZW4pOworCX0KKwllbHNlCisJICAgIHRleHRXaWR0aCA9IDA7CisJcGFkZGluZzEgPSAoY29sdW1uV2lkdGhzWzFdIC0gdGV4dFdpZHRoKSAvIHNwYWNlV2lkdGg7CisJbGVuICs9IHBhZGRpbmcxOworCisJaWYgKG1lbnUtPmNoaWxkcmVuID09IE5VTEwpCisJeworCSAgICBwYWRkaW5nMiA9IHN1Ym1lbnVXaWR0aCAvIHNwYWNlV2lkdGg7CisJICAgIGxlbiArPSBwYWRkaW5nMjsKKwkgICAgbWVudUlEID0gKFdPUkQpKG1lbnUtPmlkKTsKKwl9CisJZWxzZQorCXsKKwkgICAgbGVuICs9IChpbnQpU1RSTEVOKFRFQVJPRkZfU1VCTUVOVV9MQUJFTCk7CisJICAgIG1lbnVJRCA9IChXT1JEKSgoRFdPUkQpKG1lbnUtPnN1Ym1lbnVfaWQpIHwgKERXT1JEKTB4ODAwMCk7CisJfQorCisJLyogQWxsb2NhdGUgbWVudSBsYWJlbCBhbmQgZmlsbCBpdCBpbiAqLworCXRleHQgPSBsYWJlbCA9IGFsbG9jKCh1bnNpZ25lZClsZW4gKyAxKTsKKwlpZiAobGFiZWwgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisKKwlTVFJOQ1BZKHRleHQsIG1lbnUtPm5hbWUsIG5hbWVMZW4pOworCXRleHRbbmFtZUxlbl0gPSBOVUw7CisJdGV4dCA9IHZpbV9zdHJjaHIodGV4dCwgVEFCKTsJICAgIC8qIHN0b3AgYXQgVEFCIGJlZm9yZSBhY3RleHQgKi8KKwlpZiAodGV4dCA9PSBOVUxMKQorCSAgICB0ZXh0ID0gbGFiZWwgKyBuYW1lTGVuOwkgICAgLyogbm8gYWN0ZXh0LCB1c2Ugd2hvbGUgbmFtZSAqLworCXdoaWxlIChwYWRkaW5nMC0tID4gMCkKKwkgICAgKnRleHQrKyA9ICcgJzsKKwlpZiAobWVudS0+YWN0ZXh0ICE9IE5VTEwpCisJeworCSAgICBTVFJOQ1BZKHRleHQsIG1lbnUtPmFjdGV4dCwgYWNMZW4pOworCSAgICB0ZXh0ICs9IGFjTGVuOworCX0KKwl3aGlsZSAocGFkZGluZzEtLSA+IDApCisJICAgICp0ZXh0KysgPSAnICc7CisJaWYgKG1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCisJeworCSAgICBTVFJDUFkodGV4dCwgVEVBUk9GRl9TVUJNRU5VX0xBQkVMKTsKKwkgICAgdGV4dCArPSBTVFJMRU4oVEVBUk9GRl9TVUJNRU5VX0xBQkVMKTsKKwl9CisJZWxzZQorCXsKKwkgICAgd2hpbGUgKHBhZGRpbmcyLS0gPiAwKQorCQkqdGV4dCsrID0gJyAnOworCX0KKwkqdGV4dCA9IE5VTDsKKworCS8qCisJICogQlNfTEVGVCB3aWxsIGp1c3QgYmUgaWdub3JlZCBvbiBXaW4zMnMvTlQzLjV4IC0gb24KKwkgKiBXOTUvTlQ0IGl0IG1ha2VzIHRoZSB0ZWFyLW9mZiBsb29rIG1vcmUgbGlrZSBhIG1lbnUuCisJICovCisJcCA9IGFkZF9kaWFsb2dfZWxlbWVudChwLAorCQlCU19QVVNIQlVUVE9OfEJTX0xFRlQsCisJCShXT1JEKVBpeGVsVG9EaWFsb2dYKFRFQVJPRkZfUEFERElOR19YKSwKKwkJKFdPUkQpKHNlcFBhZGRpbmcgKyAxICsgMTMgKiAoKnBudW1pdGVtcykpLAorCQkoV09SRClQaXhlbFRvRGlhbG9nWChkbGd3aWR0aCAtIDIgKiBURUFST0ZGX1BBRERJTkdfWCksCisJCShXT1JEKTEyLAorCQltZW51SUQsIChXT1JEKTB4MDA4MCwgbGFiZWwpOworCXZpbV9mcmVlKGxhYmVsKTsKKwkoKnBudW1pdGVtcykrKzsKKyAgICB9CisKKyAgICAqcHRydWVoZWlnaHQgPSAoV09SRCkoc2VwUGFkZGluZyArIDEgKyAxMyAqICgqcG51bWl0ZW1zKSk7CisKKworICAgIC8qIHNob3cgbW9kZWxlc3NseSAqLworICAgIHRoZV9tZW51LT50ZWFyb2ZmX2hhbmRsZSA9IENyZWF0ZURpYWxvZ0luZGlyZWN0KAorCSAgICBzX2hpbnN0LAorCSAgICAoTFBETEdURU1QTEFURSlwZGxndGVtcGxhdGUsCisJICAgIHNfaHduZCwKKwkgICAgKERMR1BST0MpdGVhcm9mZl9jYWxsYmFjayk7CisKKyAgICBMb2NhbEZyZWUoTG9jYWxIYW5kbGUocGRsZ3RlbXBsYXRlKSk7CisgICAgU2VsZWN0Rm9udChoZGMsIG9sZEZvbnQpOworICAgIERlbGV0ZU9iamVjdChmb250KTsKKyAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKKworICAgIC8qCisgICAgICogUmVhc3NlcnQgb3Vyc2VsdmVzIGFzIHRoZSBhY3RpdmUgd2luZG93LiAgVGhpcyBpcyBzbyB0aGF0IGFmdGVyIGNyZWF0aW5nCisgICAgICogYSB0ZWFyb2ZmLCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gY2xpY2sgd2l0aCB0aGUgbW91c2UganVzdCB0byBzdGFydAorICAgICAqIHR5cGluZyBhZ2FpbiEKKyAgICAgKi8KKyAgICAodm9pZClTZXRBY3RpdmVXaW5kb3coc19od25kKTsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgcmlnaHQgYnV0dG9ucyBhcmUgZW5hYmxlZCAqLworICAgIGZvcmNlX21lbnVfdXBkYXRlID0gVFJVRTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisjaW5jbHVkZSAiZ3VpX3czMl9yYy5oIgorCisvKiBUaGlzIG5vdCBkZWZpbmVkIGluIG9sZGVyIFNES3MgKi8KKyMgaWZuZGVmIFRCU1RZTEVfRkxBVAorIyAgZGVmaW5lIFRCU1RZTEVfRkxBVAkJMHgwODAwCisjIGVuZGlmCisKKy8qCisgKiBDcmVhdGUgdGhlIHRvb2xiYXIsIGluaXRpYWxseSB1bnBvcHVsYXRlZC4KKyAqICAoanVzdCBsaWtlIHRoZSBtZW51LCB0aGVyZSBhcmUgbm8gZGVmYXVsdHMsIGl0J3MgYWxsCisgKiAgc2V0IHVwIHRocm91Z2ggbWVudS52aW0pCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdGlhbGlzZV90b29sYmFyKHZvaWQpCit7CisgICAgSW5pdENvbW1vbkNvbnRyb2xzKCk7CisgICAgc190b29sYmFyaHduZCA9IENyZWF0ZVRvb2xiYXJFeCgKKwkJICAgIHNfaHduZCwKKwkJICAgIFdTX0NISUxEIHwgVEJTVFlMRV9UT09MVElQUyB8IFRCU1RZTEVfRkxBVCwKKwkJICAgIDQwMDAsCQkvL2FueSBvbGQgYmlnIG51bWJlcgorCQkgICAgMzEsCQkJLy9udW1iZXIgb2YgaW1hZ2VzIGluIGluaXRhbCBiaXRtYXAKKwkJICAgIHNfaGluc3QsCisJCSAgICBJRFJfVE9PTEJBUjEsCS8vIGlkIG9mIGluaXRpYWwgYml0bWFwCisJCSAgICBOVUxMLAorCQkgICAgMCwJCQkvLyBpbml0aWFsIG51bWJlciBvZiBidXR0b25zCisJCSAgICBUT09MQkFSX0JVVFRPTl9XSURUSCwgLy9hcGkgZ3VpZGUgaXMgd3JvbmchCisJCSAgICBUT09MQkFSX0JVVFRPTl9IRUlHSFQsCisJCSAgICBUT09MQkFSX0JVVFRPTl9XSURUSCwKKwkJICAgIFRPT0xCQVJfQlVUVE9OX0hFSUdIVCwKKwkJICAgIHNpemVvZihUQkJVVFRPTikKKwkJICAgICk7CisKKyAgICBndWlfbWNoX3Nob3dfdG9vbGJhcih2aW1fc3RyY2hyKHBfZ28sIEdPX1RPT0xCQVIpICE9IE5VTEwpOworfQorCisgICAgc3RhdGljIGludAorZ2V0X3Rvb2xiYXJfYml0bWFwKHZpbW1lbnVfVCAqbWVudSkKK3sKKyAgICBpbnQgaSA9IC0xOworCisgICAgLyoKKyAgICAgKiBDaGVjayB1c2VyIGJpdG1hcHMgZmlyc3QsIHVubGVzcyBidWlsdGluIGlzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBpZiAoIWlzX3dpbm50XzMoKSAmJiAhbWVudS0+aWNvbl9idWlsdGluKQorICAgIHsKKwljaGFyX3UgZm5hbWVbTUFYUEFUSExdOworCUhBTkRMRSBoYml0bWFwID0gTlVMTDsKKworCWlmIChtZW51LT5pY29uZmlsZSAhPSBOVUxMKQorCXsKKwkgICAgZ3VpX2ZpbmRfaWNvbmZpbGUobWVudS0+aWNvbmZpbGUsIGZuYW1lLCAiYm1wIik7CisJICAgIGhiaXRtYXAgPSBMb2FkSW1hZ2UoCisJCQlOVUxMLAorCQkJZm5hbWUsCisJCQlJTUFHRV9CSVRNQVAsCisJCQlUT09MQkFSX0JVVFRPTl9XSURUSCwKKwkJCVRPT0xCQVJfQlVUVE9OX0hFSUdIVCwKKwkJCUxSX0xPQURGUk9NRklMRSB8CisJCQlMUl9MT0FETUFQM0RDT0xPUlMKKwkJCSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgTG9hZEltYWdlIGNhbGwgZmFpbGVkLCBvciB0aGUgImljb249IiBmaWxlCisJICogZGlkbid0IGV4aXN0IG9yIHdhc24ndCBzcGVjaWZpZWQsIHRyeSB0aGUgbWVudSBuYW1lCisJICovCisJaWYgKGhiaXRtYXAgPT0gTlVMTAorCQkmJiAoZ3VpX2ZpbmRfYml0bWFwKG1lbnUtPm5hbWUsIGZuYW1lLCAiYm1wIikgPT0gT0spKQorCSAgICBoYml0bWFwID0gTG9hZEltYWdlKAorCQkgICAgTlVMTCwKKwkJICAgIGZuYW1lLAorCQkgICAgSU1BR0VfQklUTUFQLAorCQkgICAgVE9PTEJBUl9CVVRUT05fV0lEVEgsCisJCSAgICBUT09MQkFSX0JVVFRPTl9IRUlHSFQsCisJCSAgICBMUl9MT0FERlJPTUZJTEUgfAorCQkgICAgTFJfTE9BRE1BUDNEQ09MT1JTCisJCSk7CisKKwlpZiAoaGJpdG1hcCAhPSBOVUxMKQorCXsKKwkgICAgVEJBRERCSVRNQVAgdGJBZGRCaXRtYXA7CisKKwkgICAgdGJBZGRCaXRtYXAuaEluc3QgPSBOVUxMOworCSAgICB0YkFkZEJpdG1hcC5uSUQgPSAoVUlOVCloYml0bWFwOworCisJICAgIGkgPSAoaW50KVNlbmRNZXNzYWdlKHNfdG9vbGJhcmh3bmQsIFRCX0FEREJJVE1BUCwKKwkJCSAgICAoV1BBUkFNKTEsIChMUEFSQU0pJnRiQWRkQml0bWFwKTsKKwkgICAgLyogaSB3aWxsIGJlIHNldCB0byAtMSBpZiBpdCBmYWlscyAqLworCX0KKyAgICB9CisgICAgaWYgKGkgPT0gLTEgJiYgbWVudS0+aWNvbmlkeCA+PSAwICYmIG1lbnUtPmljb25pZHggPCBUT09MQkFSX0JJVE1BUF9DT1VOVCkKKwlpID0gbWVudS0+aWNvbmlkeDsKKworICAgIHJldHVybiBpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfT0xFKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBNYWtlIHRoZSBHVUkgd2luZG93IGNvbWUgdG8gdGhlIGZvcmVncm91bmQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb3JlZ3JvdW5kKHZvaWQpCit7CisgICAgaWYgKElzSWNvbmljKHNfaHduZCkpCisJIFNlbmRNZXNzYWdlKHNfaHduZCwgV01fU1lTQ09NTUFORCwgU0NfUkVTVE9SRSwgMCk7CisgICAgU2V0Rm9yZWdyb3VuZFdpbmRvdyhzX2h3bmQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEVfSU1FKSAmJiBkZWZpbmVkKERZTkFNSUNfSU1FKQorICAgIHN0YXRpYyB2b2lkCitkeW5faW1tX2xvYWQodm9pZCkKK3sKKyAgICBoTGliSW1tID0gTG9hZExpYnJhcnkoImltbTMyLmRsbCIpOworICAgIGlmIChoTGliSW1tID09IE5VTEwpCisJcmV0dXJuOworCisgICAgcEltbUdldENvbXBvc2l0aW9uU3RyaW5nQQorCSAgICA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoaExpYkltbSwgIkltbUdldENvbXBvc2l0aW9uU3RyaW5nQSIpOworICAgIHBJbW1HZXRDb21wb3NpdGlvblN0cmluZ1cKKwkgICAgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhMaWJJbW0sICJJbW1HZXRDb21wb3NpdGlvblN0cmluZ1ciKTsKKyAgICBwSW1tR2V0Q29udGV4dAorCSAgICA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoaExpYkltbSwgIkltbUdldENvbnRleHQiKTsKKyAgICBwSW1tQXNzb2NpYXRlQ29udGV4dAorCSAgICA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoaExpYkltbSwgIkltbUFzc29jaWF0ZUNvbnRleHQiKTsKKyAgICBwSW1tUmVsZWFzZUNvbnRleHQKKwkgICAgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhMaWJJbW0sICJJbW1SZWxlYXNlQ29udGV4dCIpOworICAgIHBJbW1HZXRPcGVuU3RhdHVzCisJICAgID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoTGliSW1tLCAiSW1tR2V0T3BlblN0YXR1cyIpOworICAgIHBJbW1TZXRPcGVuU3RhdHVzCisJICAgID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoTGliSW1tLCAiSW1tU2V0T3BlblN0YXR1cyIpOworICAgIHBJbW1HZXRDb21wb3NpdGlvbkZvbnQKKwkgICAgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhMaWJJbW0sICJJbW1HZXRDb21wb3NpdGlvbkZvbnRBIik7CisgICAgcEltbVNldENvbXBvc2l0aW9uRm9udAorCSAgICA9ICh2b2lkICopR2V0UHJvY0FkZHJlc3MoaExpYkltbSwgIkltbVNldENvbXBvc2l0aW9uRm9udEEiKTsKKyAgICBwSW1tU2V0Q29tcG9zaXRpb25XaW5kb3cKKwkgICAgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhMaWJJbW0sICJJbW1TZXRDb21wb3NpdGlvbldpbmRvdyIpOworICAgIHBJbW1HZXRDb252ZXJzaW9uU3RhdHVzCisJICAgID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoTGliSW1tLCAiSW1tR2V0Q29udmVyc2lvblN0YXR1cyIpOworCisgICAgaWYgKCAgICAgICBwSW1tR2V0Q29tcG9zaXRpb25TdHJpbmdBID09IE5VTEwKKwkgICAgfHwgcEltbUdldENvbXBvc2l0aW9uU3RyaW5nVyA9PSBOVUxMCisJICAgIHx8IHBJbW1HZXRDb250ZXh0ID09IE5VTEwKKwkgICAgfHwgcEltbUFzc29jaWF0ZUNvbnRleHQgPT0gTlVMTAorCSAgICB8fCBwSW1tUmVsZWFzZUNvbnRleHQgPT0gTlVMTAorCSAgICB8fCBwSW1tR2V0T3BlblN0YXR1cyA9PSBOVUxMCisJICAgIHx8IHBJbW1TZXRPcGVuU3RhdHVzID09IE5VTEwKKwkgICAgfHwgcEltbUdldENvbXBvc2l0aW9uRm9udCA9PSBOVUxMCisJICAgIHx8IHBJbW1TZXRDb21wb3NpdGlvbkZvbnQgPT0gTlVMTAorCSAgICB8fCBwSW1tU2V0Q29tcG9zaXRpb25XaW5kb3cgPT0gTlVMTAorCSAgICB8fCBwSW1tR2V0Q29udmVyc2lvblN0YXR1cyA9PSBOVUxMKQorICAgIHsKKwlGcmVlTGlicmFyeShoTGliSW1tKTsKKwloTGliSW1tID0gTlVMTDsKKwlwSW1tR2V0Q29udGV4dCA9IE5VTEw7CisJcmV0dXJuOworICAgIH0KKworICAgIHJldHVybjsKK30KKworIyBpZiAwCS8qIG5vdCB1c2VkICovCisgICAgaW50CitkeW5faW1tX3VubG9hZCh2b2lkKQoreworICAgIGlmICghaExpYkltbSkKKwlyZXR1cm4gRkFMU0U7CisgICAgRnJlZUxpYnJhcnkoaExpYkltbSk7CisgICAgaExpYkltbSA9IE5VTEw7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjIGVuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1NJR05fSUNPTlMpIHx8IGRlZmluZWQoUFJPVE8pCisKKyMgaWZkZWYgRkVBVF9YUE1fVzMyCisjICBkZWZpbmUgSU1BR0VfWFBNICAgMTAwCisjIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9zaWduaWNvbl90Cit7CisgICAgSEFORExFCWhJbWFnZTsKKyAgICBVSU5UCXVUeXBlOworI2lmZGVmIEZFQVRfWFBNX1czMgorICAgIEhBTkRMRQloU2hhcGU7CS8qIE1hc2sgYml0bWFwIGhhbmRsZSAqLworI2VuZGlmCit9IHNpZ25pY29uX3Q7CisKKyAgICB2b2lkCitndWlfbWNoX2RyYXdzaWduKHJvdywgY29sLCB0eXBlbnIpCisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7CisgICAgaW50CQl0eXBlbnI7Cit7CisgICAgc2lnbmljb25fdCAqc2lnbjsKKyAgICBpbnQgeCwgeSwgdywgaDsKKworICAgIGlmICghZ3VpLmluX3VzZSB8fCAoc2lnbiA9IChzaWduaWNvbl90ICopc2lnbl9nZXRfaW1hZ2UodHlwZW5yKSkgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICB4ID0gVEVYVF9YKGNvbCk7CisgICAgeSA9IFRFWFRfWShyb3cpOworICAgIHcgPSBndWkuY2hhcl93aWR0aCAqIDI7CisgICAgaCA9IGd1aS5jaGFyX2hlaWdodDsKKyAgICBzd2l0Y2ggKHNpZ24tPnVUeXBlKQorICAgIHsKKwljYXNlIElNQUdFX0JJVE1BUDoKKwkgICAgeworCQlIREMgaGRjTWVtOworCQlIQklUTUFQIGhibXBPbGQ7CisKKwkJaGRjTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDKHNfaGRjKTsKKwkJaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGNNZW0sIHNpZ24tPmhJbWFnZSk7CisJCUJpdEJsdChzX2hkYywgeCwgeSwgdywgaCwgaGRjTWVtLCAwLCAwLCBTUkNDT1BZKTsKKwkJU2VsZWN0T2JqZWN0KGhkY01lbSwgaGJtcE9sZCk7CisJCURlbGV0ZURDKGhkY01lbSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBJTUFHRV9JQ09OOgorCWNhc2UgSU1BR0VfQ1VSU09SOgorCSAgICBEcmF3SWNvbkV4KHNfaGRjLCB4LCB5LCAoSElDT04pc2lnbi0+aEltYWdlLCB3LCBoLCAwLCBOVUxMLCBESV9OT1JNQUwpOworCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX1hQTV9XMzIKKwljYXNlIElNQUdFX1hQTToKKwkgICAgeworCQlIREMgaGRjTWVtOworCQlIQklUTUFQIGhibXBPbGQ7CisKKwkJaGRjTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDKHNfaGRjKTsKKwkJaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGNNZW0sIHNpZ24tPmhTaGFwZSk7CisJCS8qIE1ha2UgaG9sZSAqLworCQlCaXRCbHQoc19oZGMsIHgsIHksIHcsIGgsIGhkY01lbSwgMCwgMCwgU1JDQU5EKTsKKworCQlTZWxlY3RPYmplY3QoaGRjTWVtLCBzaWduLT5oSW1hZ2UpOworCQkvKiBQYWludCBzaWduICovCisJCUJpdEJsdChzX2hkYywgeCwgeSwgdywgaCwgaGRjTWVtLCAwLCAwLCBTUkNQQUlOVCk7CisJCVNlbGVjdE9iamVjdChoZGNNZW0sIGhibXBPbGQpOworCQlEZWxldGVEQyhoZGNNZW0pOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK2Nsb3NlX3NpZ25pY29uX2ltYWdlKHNpZ25pY29uX3QgKnNpZ24pCit7CisgICAgaWYgKHNpZ24pCisJc3dpdGNoIChzaWduLT51VHlwZSkKKwl7CisJICAgIGNhc2UgSU1BR0VfQklUTUFQOgorCQlEZWxldGVPYmplY3QoKEhHRElPQkopc2lnbi0+aEltYWdlKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgSU1BR0VfQ1VSU09SOgorCQlEZXN0cm95Q3Vyc29yKChIQ1VSU09SKXNpZ24tPmhJbWFnZSk7CisJCWJyZWFrOworCSAgICBjYXNlIElNQUdFX0lDT046CisJCURlc3Ryb3lJY29uKChISUNPTilzaWduLT5oSW1hZ2UpOworCQlicmVhazsKKyNpZmRlZiBGRUFUX1hQTV9XMzIKKwkgICAgY2FzZSBJTUFHRV9YUE06CisJCURlbGV0ZU9iamVjdCgoSEJJVE1BUClzaWduLT5oSW1hZ2UpOworCQlEZWxldGVPYmplY3QoKEhCSVRNQVApc2lnbi0+aFNoYXBlKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKKyAgICB2b2lkICoKK2d1aV9tY2hfcmVnaXN0ZXJfc2lnbihzaWduZmlsZSkKKyAgICBjaGFyX3UJKnNpZ25maWxlOworeworICAgIHNpZ25pY29uX3QJc2lnbiwgKnBzaWduOworICAgIGNoYXJfdQkqZXh0OworCisgICAgaWYgKGlzX3dpbm50XzMoKSkKKyAgICB7CisJRU1TRyhfKGVfc2lnbmRhdGEpKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaWduLmhJbWFnZSA9IE5VTEw7CisgICAgZXh0ID0gc2lnbmZpbGUgKyBTVFJMRU4oc2lnbmZpbGUpIC0gNDsgLyogZ2V0IGV4dGVudGlvbiAqLworICAgIGlmIChleHQgPiBzaWduZmlsZSkKKyAgICB7CisJaW50IGRvX2xvYWQgPSAxOworCisJaWYgKCFTVFJJQ01QKGV4dCwgIi5ibXAiKSkKKwkgICAgc2lnbi51VHlwZSA9ICBJTUFHRV9CSVRNQVA7CisJZWxzZSBpZiAoIVNUUklDTVAoZXh0LCAiLmljbyIpKQorCSAgICBzaWduLnVUeXBlID0gIElNQUdFX0lDT047CisJZWxzZSBpZiAoIVNUUklDTVAoZXh0LCAiLmN1ciIpIHx8ICFTVFJJQ01QKGV4dCwgIi5hbmkiKSkKKwkgICAgc2lnbi51VHlwZSA9ICBJTUFHRV9DVVJTT1I7CisJZWxzZQorCSAgICBkb19sb2FkID0gMDsKKworCWlmIChkb19sb2FkKQorCSAgICBzaWduLmhJbWFnZSA9IChIQU5ETEUpTG9hZEltYWdlKE5VTEwsIHNpZ25maWxlLCBzaWduLnVUeXBlLAorCQkgICAgZ3VpLmNoYXJfd2lkdGggKiAyLCBndWkuY2hhcl9oZWlnaHQsCisJCSAgICBMUl9MT0FERlJPTUZJTEUgfCBMUl9DUkVBVEVESUJTRUNUSU9OKTsKKyNpZmRlZiBGRUFUX1hQTV9XMzIKKwlpZiAoIVNUUklDTVAoZXh0LCAiLnhwbSIpKQorCXsKKwkgICAgc2lnbi51VHlwZSA9IElNQUdFX1hQTTsKKwkgICAgTG9hZFhwbUltYWdlKHNpZ25maWxlLCAoSEJJVE1BUCAqKSZzaWduLmhJbWFnZSwgKEhCSVRNQVAgKikmc2lnbi5oU2hhcGUpOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIHBzaWduID0gTlVMTDsKKyAgICBpZiAoc2lnbi5oSW1hZ2UgJiYgKHBzaWduID0gKHNpZ25pY29uX3QgKilhbGxvYyhzaXplb2Yoc2lnbmljb25fdCkpKQorCQkJCQkJCQkgICAgICAhPSBOVUxMKQorCSpwc2lnbiA9IHNpZ247CisKKyAgICBpZiAoIXBzaWduKQorICAgIHsKKwlpZiAoc2lnbi5oSW1hZ2UpCisJICAgIGNsb3NlX3NpZ25pY29uX2ltYWdlKCZzaWduKTsKKwlFTVNHKF8oZV9zaWduZGF0YSkpOworICAgIH0KKyAgICByZXR1cm4gKHZvaWQgKilwc2lnbjsKKworfQorCisgICAgdm9pZAorZ3VpX21jaF9kZXN0cm95X3NpZ24oc2lnbikKKyAgICB2b2lkICpzaWduOworeworICAgIGlmIChzaWduKQorICAgIHsKKwljbG9zZV9zaWduaWNvbl9pbWFnZSgoc2lnbmljb25fdCAqKXNpZ24pOworCXZpbV9mcmVlKHNpZ24pOworICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9CRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKworLyogQkFMTE9PTi1FVkFMIElNUExFTUVOVEFUSU9OIEZPUiBXSU5ET1dTLgorICogIEFkZGVkIGJ5IFNlcmdleSBLaG9yZXYKKyAqCisgKiBUaGUgb25seSByZXVzZWQgdGhpbmcgaXMgZ3VpX2JldmFsLmggYW5kIGd1aV9tY2hfZ2V0X2JldmFsX2luZm8oKQorICogZnJvbSBndWlfYmV2YWwuYyAobm90ZSBpdCB1c2VzIHggYW5kIHkgb2YgdGhlIEJhbGxvb25FdmFsIHN0cnVjdAorICogdG8gZ2V0IGN1cnJlbnQgbW91c2UgcG9zaXRpb24pLgorICoKKyAqIFRyeWluZyB0byB1c2UgYXMgbW9yZSBXaW5kb3dzIHNlcnZpY2VzIGFzIHBvc3NpYmxlLCBhbmQgYXMgbGVzcworICogSUUgdmVyc2lvbiBhcyBwb3NzaWJsZSA6KSkuCisgKgorICogMSkgRG9uJ3QgY3JlYXRlIFRvb2xUaXAgaW4gZ3VpX21jaF9jcmVhdGVfYmV2YWxfYXJlYSwgb25seSBpbml0aWFsaXplCisgKiBCYWxsb29uRXZhbCBzdHJ1Y3QuCisgKiAyKSBFbmFibGUvRGlzYWJsZSBzaW1wbHkgY3JlYXRlL2tpbGwgQmFsbG9vbkV2YWwgVGltZXIKKyAqIDMpIFdoZW4gdGhlcmUgd2FzIGVub3VnaCBpbmFjdGl2aXR5LCB0aW1lciBwcm9jZWR1cmUgcG9zdHMKKyAqIGFzeW5jIHJlcXVlc3QgdG8gZGVidWdnZXIKKyAqIDQpIGd1aV9tY2hfcG9zdF9iYWxsb29uIChpbnZva2VkIGZyb20gbmV0YmVhbnMuYykgY3JlYXRlcyB0b29sdGlwIGNvbnRyb2wKKyAqIGFuZCBwZXJmb3JtcyBzb21lIGFjdGlvbnMgdG8gc2hvdyBpdCBBU0FQCisgKiA1KSBXTV9OT1RPRlk6VFROX1BPUCBkZXN0cm95cyBjcmVhdGVkIHRvb2x0aXAKKyAqLworCisgICAgc3RhdGljIHZvaWQKK21ha2VfdG9vbHRpcChiZXZhbCwgdGV4dCwgcHQpCisgICAgQmFsbG9vbkV2YWwgKmJldmFsOworICAgIGNoYXIgKnRleHQ7CisgICAgUE9JTlQgcHQ7Cit7CisgICAgVE9PTElORk8JdGk7CisKKyAgICBiZXZhbC0+YmFsbG9vbiA9IENyZWF0ZVdpbmRvd0V4KFdTX0VYX1RPUE1PU1QsIFRPT0xUSVBTX0NMQVNTLAorCSAgICBOVUxMLCBXU19QT1BVUCB8IFRUU19OT1BSRUZJWCB8IFRUU19BTFdBWVNUSVAsCisJICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCisJICAgIGJldmFsLT50YXJnZXQsIE5VTEwsIHNfaGluc3QsIE5VTEwpOworCisgICAgU2V0V2luZG93UG9zKGJldmFsLT5iYWxsb29uLCBIV05EX1RPUE1PU1QsIDAsIDAsIDAsIDAsCisJICAgIFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUpOworCisgICAgdGkuY2JTaXplID0gc2l6ZW9mKFRPT0xJTkZPKTsKKyAgICB0aS51RmxhZ3MgPSBUVEZfU1VCQ0xBU1M7CisgICAgdGkuaHduZCA9IGJldmFsLT50YXJnZXQ7CisgICAgdGkuaGluc3QgPSAwOyAvKiBEb24ndCB1c2Ugc3RyaW5nIHJlc291cmNlcyAqLworICAgIHRpLnVJZCA9IElEX0JFVkFMX1RPT0xUSVA7CisgICAgdGkubHBzelRleHQgPSB0ZXh0OworCisgICAgLyogTGltaXQgYmFsbG9vbmV2YWwgYm91bmRpbmcgcmVjdCB0byBDdXJzb3JQb3MgbmVpZ2hib3VyaG9vZCAqLworICAgIHRpLnJlY3QubGVmdCA9IHB0LnggLSAzOworICAgIHRpLnJlY3QudG9wID0gcHQueSAtIDM7CisgICAgdGkucmVjdC5yaWdodCA9IHB0LnggKyAzOworICAgIHRpLnJlY3QuYm90dG9tID0gcHQueSArIDM7CisKKyAgICBTZW5kTWVzc2FnZShiZXZhbC0+YmFsbG9vbiwgVFRNX0FERFRPT0wsIDAsIChMUEFSQU0pJnRpKTsKKyAgICAvKiBNYWtlIHRvb2x0aXAgYXBwZWFyIHNvb25lciAqLworICAgIFNlbmRNZXNzYWdlKGJldmFsLT5iYWxsb29uLCBUVE1fU0VUREVMQVlUSU1FLCBUVERUX0lOSVRJQUwsIDEwKTsKKyAgICAvKgorICAgICAqIEhBQ0s6IGZvcmNlIHRvb2x0aXAgdG8gYXBwZWFyLCBiZWNhdXNlIGl0J2xsIG5vdCBhcHBlYXIgdW50aWwKKyAgICAgKiBmaXJzdCBtb3VzZSBtb3ZlLiBEKm1uIE0kCisgICAgICovCisgICAgbW91c2VfZXZlbnQoTU9VU0VFVkVOVEZfTU9WRSwgMSwgMSwgMCwgMCk7CisgICAgbW91c2VfZXZlbnQoTU9VU0VFVkVOVEZfTU9WRSwgKERXT1JEKS0xLCAoRFdPUkQpLTEsIDAsIDApOworfQorCisgICAgc3RhdGljIHZvaWQKK2RlbGV0ZV90b29sdGlwKGJldmFsKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK3sKKyAgICBEZXN0cm95V2luZG93KGJldmFsLT5iYWxsb29uKTsKK30KKworICAgIHN0YXRpYyBWT0lEIENBTExCQUNLCitCZXZhbFRpbWVyUHJvYyhod25kLCB1TXNnLCBpZEV2ZW50LCBkd1RpbWUpCisgICAgSFdORCAgICBod25kOworICAgIFVJTlQgICAgdU1zZzsKKyAgICBVSU5UICAgIGlkRXZlbnQ7CisgICAgRFdPUkQgICBkd1RpbWU7Cit7CisgICAgUE9JTlQJcHQ7CisgICAgUkVDVAlyZWN0OworCisgICAgaWYgKGN1cl9iZXZhbCA9PSBOVUxMIHx8IGN1cl9iZXZhbC0+c2hvd1N0YXRlID09IFNoU19TSE9XSU5HIHx8ICFwX2JldmFsKQorCXJldHVybjsKKworICAgIEdldEN1cnNvclBvcygmcHQpOworICAgIGlmIChXaW5kb3dGcm9tUG9pbnQocHQpICE9IHNfdGV4dEFyZWEpCisJcmV0dXJuOworCisgICAgU2NyZWVuVG9DbGllbnQoc190ZXh0QXJlYSwgJnB0KTsKKyAgICBHZXRDbGllbnRSZWN0KHNfdGV4dEFyZWEsICZyZWN0KTsKKyAgICBpZiAoIVB0SW5SZWN0KCZyZWN0LCBwdCkpCisJcmV0dXJuOworCisgICAgaWYgKExhc3RBY3Rpdml0eSA+IDAKKwkgICAgJiYgKGR3VGltZSAtIExhc3RBY3Rpdml0eSkgPj0gKERXT1JEKXBfYmRsYXkKKwkgICAgJiYgKGN1cl9iZXZhbC0+c2hvd1N0YXRlICE9IFNoU19QRU5ESU5HCisJCXx8IGFicyhjdXJfYmV2YWwtPnggLSBwdC54KSA+IDMKKwkJfHwgYWJzKGN1cl9iZXZhbC0+eSAtIHB0LnkpID4gMykpCisgICAgeworCS8qIFBvaW50ZXIgcmVzdGluZyBpbiBvbmUgcGxhY2UgbG9uZyBlbm91Z2gsIGl0J3MgdGltZSB0byBzaG93CisJICogdGhlIHRvb2x0aXAuICovCisJY3VyX2JldmFsLT5zaG93U3RhdGUgPSBTaFNfUEVORElORzsKKwljdXJfYmV2YWwtPnggPSBwdC54OworCWN1cl9iZXZhbC0+eSA9IHB0Lnk7CisKKwlUUkFDRTAoIkJldmFsVGltZXJQcm9jOiBzZW5kaW5nIHJlcXVlc3QiKTsKKworCWlmIChjdXJfYmV2YWwtPm1zZ0NCICE9IE5VTEwpCisJICAgICgqY3VyX2JldmFsLT5tc2dDQikoY3VyX2JldmFsLCAwKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2Rpc2FibGVfYmV2YWxfYXJlYShiZXZhbCkKKyAgICBCYWxsb29uRXZhbAkqYmV2YWw7Cit7CisgICAgVFJBQ0UwKCJndWlfbWNoX2Rpc2FibGVfYmV2YWxfYXJlYSB7e3siKTsKKyAgICBLaWxsVGltZXIoc190ZXh0QXJlYSwgQmV2YWxUaW1lcklkKTsKKyAgICBUUkFDRTAoImd1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhIH19fSIpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9lbmFibGVfYmV2YWxfYXJlYShiZXZhbCkKKyAgICBCYWxsb29uRXZhbAkqYmV2YWw7Cit7CisgICAgVFJBQ0UwKCJndWlfbWNoX2VuYWJsZV9iZXZhbF9hcmVhIHx8fCIpOworICAgIGlmIChiZXZhbCA9PSBOVUxMKQorCXJldHVybjsKKyAgICBUUkFDRTAoImd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEge3t7Iik7CisgICAgQmV2YWxUaW1lcklkID0gU2V0VGltZXIoc190ZXh0QXJlYSwgMCwgcF9iZGxheSAvIDIsIChUSU1FUlBST0MpQmV2YWxUaW1lclByb2MpOworICAgIFRSQUNFMCgiZ3VpX21jaF9lbmFibGVfYmV2YWxfYXJlYSB9fX0iKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfcG9zdF9iYWxsb29uKGJldmFsLCBtZXNnKQorICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKKyAgICBjaGFyX3UJKm1lc2c7Cit7CisgICAgUE9JTlQgICBwdDsKKyAgICBUUkFDRTAoImd1aV9tY2hfcG9zdF9iYWxsb29uIHt7eyIpOworICAgIGlmIChiZXZhbC0+c2hvd1N0YXRlID09IFNoU19TSE9XSU5HKQorCXJldHVybjsKKyAgICBHZXRDdXJzb3JQb3MoJnB0KTsKKyAgICBTY3JlZW5Ub0NsaWVudChzX3RleHRBcmVhLCAmcHQpOworCisgICAgaWYgKGFicyhiZXZhbC0+eCAtIHB0LngpIDwgMyAmJiBhYnMoYmV2YWwtPnkgLSBwdC55KSA8IDMpCisJLyogY3Vyc29yIGlzIHN0aWxsIGhlcmUgKi8KKyAgICB7CisJZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEoY3VyX2JldmFsKTsKKwliZXZhbC0+c2hvd1N0YXRlID0gU2hTX1NIT1dJTkc7CisJbWFrZV90b29sdGlwKGJldmFsLCBtZXNnLCBwdCk7CisgICAgfQorICAgIFRSQUNFMCgiZ3VpX21jaF9wb3N0X2JhbGxvb24gfX19Iik7Cit9CisKKyAgICBCYWxsb29uRXZhbCAqCitndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKHRhcmdldCwgbWVzZywgbWVzZ0NCLCBjbGllbnREYXRhKQorICAgIHZvaWQJKnRhcmdldDsJLyogaWdub3JlZCwgYWx3YXlzIHVzZSBzX3RleHRBcmVhICovCisgICAgY2hhcl91CSptZXNnOworICAgIHZvaWQJKCptZXNnQ0IpX19BUkdTKChCYWxsb29uRXZhbCAqLCBpbnQpKTsKKyAgICB2b2lkCSpjbGllbnREYXRhOworeworICAgIC8qIHBhcnRpYWxseSBzdG9sZW4gZnJvbSBndWlfYmV2YWwuYyAqLworICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKKworICAgIGlmIChtZXNnICE9IE5VTEwgJiYgbWVzZ0NCICE9IE5VTEwpCisgICAgeworCUVNU0coXygiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYmV2YWwgPSAoQmFsbG9vbkV2YWwgKilhbGxvYyhzaXplb2YoQmFsbG9vbkV2YWwpKTsKKyAgICBpZiAoYmV2YWwgIT0gTlVMTCkKKyAgICB7CisJYmV2YWwtPnRhcmdldCA9IHNfdGV4dEFyZWE7CisJYmV2YWwtPmJhbGxvb24gPSBOVUxMOworCisJYmV2YWwtPnNob3dTdGF0ZSA9IFNoU19ORVVUUkFMOworCWJldmFsLT54ID0gMDsKKwliZXZhbC0+eSA9IDA7CisJYmV2YWwtPm1zZyA9IG1lc2c7CisJYmV2YWwtPm1zZ0NCID0gbWVzZ0NCOworCWJldmFsLT5jbGllbnREYXRhID0gY2xpZW50RGF0YTsKKworCUluaXRDb21tb25Db250cm9scygpOworCisJY3VyX2JldmFsID0gYmV2YWw7CisKKwlpZiAocF9iZXZhbCkKKwkgICAgZ3VpX21jaF9lbmFibGVfYmV2YWxfYXJlYShiZXZhbCk7CisKKyAgICB9CisgICAgcmV0dXJuIGJldmFsOworfQorCisgICAgc3RhdGljIHZvaWQKK0hhbmRsZV9XTV9Ob3RpZnkoaHduZCwgcG5taCkKKyAgICBIV05EIGh3bmQ7CisgICAgTFBOTUhEUiBwbm1oOworeworICAgIGlmIChwbm1oLT5pZEZyb20gIT0gSURfQkVWQUxfVE9PTFRJUCkgLyogaXQgaXMgbm90IG91ciB0b29sdGlwICovCisJcmV0dXJuOworCisgICAgaWYgKGN1cl9iZXZhbCAhPSBOVUxMKQorICAgIHsKKwlpZiAocG5taC0+Y29kZSA9PSBUVE5fU0hPVykKKwl7CisJICAgIFRSQUNFMCgiVFROX1NIT1cge3t7Iik7CisJICAgIFRSQUNFMCgiVFROX1NIT1cgfX19Iik7CisJfQorCWVsc2UgaWYgKHBubWgtPmNvZGUgPT0gVFROX1BPUCkgLyogQmVmb3JlIHRvb2x0aXAgZGlzYXBwZWFyICovCisJeworCSAgICBUUkFDRTAoIlRUTl9QT1Age3t7Iik7CisJICAgIGRlbGV0ZV90b29sdGlwKGN1cl9iZXZhbCk7CisJICAgIGd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEoY3VyX2JldmFsKTsKKwkgICAgVFJBQ0UwKCJUVE5fUE9QIH19fSIpOworCisJICAgIGN1cl9iZXZhbC0+c2hvd1N0YXRlID0gU2hTX05FVVRSQUw7CisJfQorICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitUcmFja1VzZXJBY3Rpdml0eShVSU5UIHVNc2cpCit7CisgICAgaWYgKCh1TXNnID49IFdNX01PVVNFRklSU1QgJiYgdU1zZyA8PSBXTV9NT1VTRUxBU1QpCisJICAgIHx8ICh1TXNnID49IFdNX0tFWUZJUlNUICYmIHVNc2cgPD0gV01fS0VZTEFTVCkpCisJTGFzdEFjdGl2aXR5ID0gR2V0VGlja0NvdW50KCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfYmV2YWxfYXJlYShiZXZhbCkKKyAgICBCYWxsb29uRXZhbAkqYmV2YWw7Cit7CisgICAgdmltX2ZyZWUoYmV2YWwpOworfQorI2VuZGlmIC8qIEZFQVRfQkVWQUwgKi8KKworI2lmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFdlIGhhdmUgbXVsdGlwbGUgc2lnbnMgdG8gZHJhdyBhdCB0aGUgc2FtZSBsb2NhdGlvbi4gRHJhdyB0aGUKKyAqIG11bHRpLXNpZ24gaW5kaWNhdG9yIChkb3duLWFycm93KSBpbnN0ZWFkLiBUaGlzIGlzIHRoZSBXaW4zMiB2ZXJzaW9uLgorICovCisgICAgdm9pZAorbmV0YmVhbnNfZHJhd19tdWx0aXNpZ25faW5kaWNhdG9yKGludCByb3cpCit7CisgICAgaW50IGk7CisgICAgaW50IHk7CisgICAgaW50IHg7CisKKyAgICB4ID0gMDsKKyAgICB5ID0gVEVYVF9ZKHJvdyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3VpLmNoYXJfaGVpZ2h0IC0gMzsgaSsrKQorCVNldFBpeGVsKHNfaGRjLCB4KzIsIHkrKywgZ3VpLmN1cnJGZ0NvbG9yKTsKKworICAgIFNldFBpeGVsKHNfaGRjLCB4KzAsIHksIGd1aS5jdXJyRmdDb2xvcik7CisgICAgU2V0UGl4ZWwoc19oZGMsIHgrMiwgeSwgZ3VpLmN1cnJGZ0NvbG9yKTsKKyAgICBTZXRQaXhlbChzX2hkYywgeCs0LCB5KyssIGd1aS5jdXJyRmdDb2xvcik7CisgICAgU2V0UGl4ZWwoc19oZGMsIHgrMSwgeSwgZ3VpLmN1cnJGZ0NvbG9yKTsKKyAgICBTZXRQaXhlbChzX2hkYywgeCsyLCB5LCBndWkuY3VyckZnQ29sb3IpOworICAgIFNldFBpeGVsKHNfaGRjLCB4KzMsIHkrKywgZ3VpLmN1cnJGZ0NvbG9yKTsKKyAgICBTZXRQaXhlbChzX2hkYywgeCsyLCB5LCBndWkuY3VyckZnQ29sb3IpOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2d1aV93MzJfcmMuaCBiL3NyYy9ndWlfdzMyX3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwZDc3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfdzMyX3JjLmgKQEAgLTAsMCArMSw4IEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IFNjcmlwdDEucmMKKy8vCisjZGVmaW5lIElEUl9UT09MQkFSMQkJCTEwMQorLy8jZGVmaW5lIElEX1RCX0JMT0IJCQkgIDQwMDAxCisvLyNkZWZpbmUgSURfVEJfQ0lSQ0xFCQkJICA0MDAwMgorCmRpZmYgLS1naXQgYS9zcmMvZ3VpX3c0OC5jIGIvc3JjL2d1aV93NDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFjMWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2d1aV93NDguYwpAQCAtMCwwICsxLDM0MDIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCQlHVUkgc3VwcG9ydCBieSBSb2JlcnQgV2ViYgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIGd1aV93NDguYzogIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBpbiBndWlfdzE2LmMgYW5kIGd1aV93MzIuYy4KKyAqCisgKiBHVUkgc3VwcG9ydCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgKFdpbjE2ICsgV2luMzIgPSBXaW40OCA6LSkKKyAqCisgKiBUaGUgY29tYmluZWQgZWZmb3J0cyBvZjoKKyAqIEdlb3JnZSBWLiBSZWlsbHkgPGdlb3JnZUByZWlsbHkub3JnPgorICogUm9iZXJ0IFdlYmIKKyAqIFZpbmNlIE5lZ3JpCisgKiAuLi5hbmQgY29udHJpYnV0aW9ucyBmcm9tIG1hbnkgb3RoZXJzCisgKgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCS8qIHVzZWQgYnkgZGlhbG9nIGJveCByb3V0aW5lIGZvciBkZWZhdWx0IHRpdGxlICovCisjaWZkZWYgREVCVUcKKyMgaW5jbHVkZSA8dGNoYXIuaD4KKyNlbmRpZgorI2lmbmRlZiBfX01JTkdXMzJfXworIyBpbmNsdWRlIDxzaGVsbGFwaS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoRkVBVF9CRVZBTCkKKyMgaW5jbHVkZSA8Y29tbWN0cmwuaD4KKyNlbmRpZgorI2lmZGVmIFdJTjE2CisjIGluY2x1ZGUgPGNvbW1kbGcuaD4KKyMgaW5jbHVkZSA8c2hlbGxhcGkuaD4KKyMgaWZkZWYgV0lOMTZfM0RMT09LCisjICBpbmNsdWRlIDxjdGwzZC5oPgorIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93c3guaD4KKworI2lmZGVmIEdMT0JBTF9JTUUKKyMgaW5jbHVkZSAiZ2xibF9pbWUuaCIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NRU5VCisjIGRlZmluZSBNRU5VSElOVFMJCS8qIHNob3cgbWVudSBoaW50cyBpbiBjb21tYW5kIGxpbmUgKi8KKyNlbmRpZgorCisvKiBTb21lIHBhcmFtZXRlcnMgZm9yIGRpYWxvZyBib3hlcy4gIEFsbCBpbiBwaXhlbHMuICovCisjZGVmaW5lIERMR19QQURESU5HX1gJCTEwCisjZGVmaW5lIERMR19QQURESU5HX1kJCTEwCisjZGVmaW5lIERMR19PTERfU1RZTEVfUEFERElOR19YCTUKKyNkZWZpbmUgRExHX09MRF9TVFlMRV9QQURESU5HX1kJNQorI2RlZmluZSBETEdfVkVSVF9QQURESU5HX1gJNAkvKiBGb3IgdmVydGljYWwgYnV0dG9ucyAqLworI2RlZmluZSBETEdfVkVSVF9QQURESU5HX1kJNAorI2RlZmluZSBETEdfSUNPTl9XSURUSAkJMzQKKyNkZWZpbmUgRExHX0lDT05fSEVJR0hUCQkzNAorI2RlZmluZSBETEdfTUlOX1dJRFRICQkxNTAKKyNkZWZpbmUgRExHX0ZPTlRfTkFNRQkJIk1TIFNhbnMgU2VyaWYiCisjZGVmaW5lIERMR19GT05UX1BPSU5UX1NJWkUJOAorI2RlZmluZSBETEdfTUlOX01BWF9XSURUSAk0MDAKKworI2RlZmluZSBETEdfTk9OQlVUVE9OX0NPTlRST0wJNTAwMAkvKiBGaXJzdCBJRCBvZiBub24tYnV0dG9uIGNvbnRyb2xzICovCisKKyNpZm5kZWYgV01fWEJVVFRPTkRPV04gLyogRm9yIFdpbjJLIC8gd2luTUUgT05MWSAqLworIyBkZWZpbmUgV01fWEJVVFRPTkRPV04JCTB4MDIwQgorIyBkZWZpbmUgV01fWEJVVFRPTlVQCQkweDAyMEMKKyMgZGVmaW5lIFdNX1hCVVRUT05EQkxDTEsJMHgwMjBECisjIGRlZmluZSBNS19YQlVUVE9OMQkJMHgwMDIwCisjIGRlZmluZSBNS19YQlVUVE9OMgkJMHgwMDQwCisjZW5kaWYKKworI2lmZGVmIFBST1RPCisvKgorICogRGVmaW5lIGEgZmV3IHRoaW5ncyBmb3IgZ2VuZXJhdGluZyBwcm90b3R5cGVzLiAgVGhpcyBpcyBqdXN0IHRvIGF2b2lkCisgKiBzeW50YXggZXJyb3JzLCB0aGUgZGVmaW5lcyBkbyBub3QgbmVlZCB0byBiZSBjb3JyZWN0LgorICovCisjIGRlZmluZSBBUElFTlRSWQorIyBkZWZpbmUgQ0FMTEJBQ0sKKyMgZGVmaW5lIENPTlNUCisjIGRlZmluZSBGQVIKKyMgZGVmaW5lIE5FQVIKKyMgZGVmaW5lIF9jZGVjbAordHlwZWRlZiBpbnQgQk9PTDsKK3R5cGVkZWYgaW50IEJZVEU7Cit0eXBlZGVmIGludCBEV09SRDsKK3R5cGVkZWYgaW50IFdDSEFSOwordHlwZWRlZiBpbnQgRU5VTUxPR0ZPTlQ7Cit0eXBlZGVmIGludCBGSU5EUkVQTEFDRTsKK3R5cGVkZWYgaW50IEhBTkRMRTsKK3R5cGVkZWYgaW50IEhCSVRNQVA7Cit0eXBlZGVmIGludCBIQlJVU0g7Cit0eXBlZGVmIGludCBIRFJPUDsKK3R5cGVkZWYgaW50IElOVDsKK3R5cGVkZWYgaW50IExPR0ZPTlRbXTsKK3R5cGVkZWYgaW50IExQQVJBTTsKK3R5cGVkZWYgaW50IExQQ1JFQVRFU1RSVUNUOwordHlwZWRlZiBpbnQgTFBDU1RSOwordHlwZWRlZiBpbnQgTFBDVFNUUjsKK3R5cGVkZWYgaW50IExQUkVDVDsKK3R5cGVkZWYgaW50IExQU1RSOwordHlwZWRlZiBpbnQgTFBXSU5ET1dQT1M7Cit0eXBlZGVmIGludCBMUFdPUkQ7Cit0eXBlZGVmIGludCBMUkVTVUxUOworIyB1bmRlZiBNU0cKK3R5cGVkZWYgaW50IE1TRzsKK3R5cGVkZWYgaW50IE5FV1RFWFRNRVRSSUM7Cit0eXBlZGVmIGludCBPU1ZFUlNJT05JTkZPOwordHlwZWRlZiBpbnQgUFdPUkQ7Cit0eXBlZGVmIGludCBSRUNUOwordHlwZWRlZiBpbnQgVUlOVDsKK3R5cGVkZWYgaW50IFdPUkQ7Cit0eXBlZGVmIGludCBXUEFSQU07Cit0eXBlZGVmIGludCBQT0lOVDsKK3R5cGVkZWYgdm9pZCAqSElOU1RBTkNFOwordHlwZWRlZiB2b2lkICpITUVOVTsKK3R5cGVkZWYgdm9pZCAqSFdORDsKK3R5cGVkZWYgdm9pZCAqSERDOwordHlwZWRlZiB2b2lkIFZPSUQ7Cit0eXBlZGVmIGludCBMUE5NSERSOwordHlwZWRlZiBpbnQgTE9ORzsKKyNlbmRpZgorCisjaWZuZGVmIEdFVF9YX0xQQVJBTQorIyBkZWZpbmUgR0VUX1hfTFBBUkFNKGxwKSAoKGludCkoc2hvcnQpTE9XT1JEKGxwKSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfT25QYWludCggSFdORCBod25kKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3JlY3QoUkVDVCAqcmNwKTsKK3N0YXRpYyBpbnQgZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChpbnQgZml4X3dpbmRvdyk7CisKK3N0YXRpYyBXT1JECQlzX2RsZ2ZudGhlaWdodDsJCS8qIGhlaWdodCBvZiB0aGUgZGlhbG9nIGZvbnQgKi8KK3N0YXRpYyBXT1JECQlzX2RsZ2ZudHdpZHRoOwkJLyogd2lkdGggb2YgdGhlIGRpYWxvZyBmb250ICovCisKKyNpZmRlZiBGRUFUX01FTlUKK3N0YXRpYyBITUVOVQkJc19tZW51QmFyID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEVBUk9GRgorc3RhdGljIHZvaWQgcmVidWlsZF90ZWFyb2ZmKHZpbW1lbnVfVCAqbWVudSk7CitzdGF0aWMgSEJJVE1BUAlzX2h0ZWFyYml0bWFwOwkgICAgLyogYml0bWFwIHVzZWQgdG8gaW5kaWNhdGUgdGVhcm9mZiAqLworI2VuZGlmCisKKy8qIEZsYWcgdGhhdCBpcyBzZXQgd2hpbGUgcHJvY2Vzc2luZyBhIG1lc3NhZ2UgdGhhdCBtdXN0IG5vdCBiZSBpbnRlcnVwdGVkIGJ5CisgKiBwcm9jZXNzaW5nIGFub3RoZXIgbWVzc2FnZS4gKi8KK3N0YXRpYyBpbnQJCXNfYnVzeV9wcm9jZXNzaW5nID0gRkFMU0U7CisKK3N0YXRpYyBpbnQJCWRlc3Ryb3lpbmcgPSBGQUxTRTsJLyogY2FsbCBEZXN0cm95V2luZG93KCkgb3Vyc2VsdmVzICovCisKKyNpZmRlZiBNU1dJTl9GSU5EX1JFUExBQ0UKK3N0YXRpYyBVSU5UCQlzX2ZpbmRyZXBfbXNnID0gMDsJLyogc2V0IGluIGd1aV93WzE2LzMyXS5jICovCitzdGF0aWMgRklORFJFUExBQ0UJc19maW5kcmVwX3N0cnVjdDsKK3N0YXRpYyBIV05ECQlzX2ZpbmRyZXBfaHduZCA9IE5VTEw7CitzdGF0aWMgaW50CQlzX2ZpbmRyZXBfaXNfZmluZDsJLyogVFJVRSBmb3IgZmluZCBkaWFsb2csIEZBTFNFCisJCQkJCQkgICBmb3IgZmluZC9yZXBsYWNlIGRpYWxvZyAqLworI2VuZGlmCisKK3N0YXRpYyBISU5TVEFOQ0UJc19oaW5zdCA9IE5VTEw7CisjaWYgIWRlZmluZWQoRkVBVF9TTklGRikgJiYgIWRlZmluZWQoRkVBVF9HVUkpCitzdGF0aWMKKyNlbmRpZgorSFdORAkJCXNfaHduZCA9IE5VTEw7CitzdGF0aWMgSERDCQlzX2hkYyA9IE5VTEw7CitzdGF0aWMgSEJSVVNICXNfYnJ1c2ggPSBOVUxMOworCisjaWZkZWYgRkVBVF9UT09MQkFSCitzdGF0aWMgSFdORAkJc190b29sYmFyaHduZCA9IE5VTEw7CisjZW5kaWYKKworc3RhdGljIFdQQVJBTQkJc193UGFyYW0gPSAwOworc3RhdGljIExQQVJBTQkJc19sUGFyYW0gPSAwOworCitzdGF0aWMgSFdORAkJc190ZXh0QXJlYSA9IE5VTEw7CitzdGF0aWMgVUlOVAkJc191TXNnID0gMDsKKworc3RhdGljIGNoYXJfdQkJKnNfdGV4dGZpZWxkOyAvKiBVc2VkIGJ5IGRpYWxvZ3MgdG8gcGFzcyBiYWNrIHN0cmluZ3MgKi8KKworc3RhdGljIGludAkJc19uZWVkX2FjdGl2YXRlID0gRkFMU0U7CisKKy8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IHdoZW4gd2FpdGluZyBmb3IgYW4gZXZlbnQsIHdoaWNoIGlzIHRoZSBvbmx5IG1vbWVudAorICogc2Nyb2xsYmFyIGRyYWdnaW5nIGNhbiBiZSBkb25lIGRpcmVjdGx5LiAgSXQncyBub3QgYWxsb3dlZCB3aGlsZSBjb21tYW5kcworICogYXJlIGV4ZWN1dGVkLCBiZWNhdXNlIGl0IG1heSBtb3ZlIHRoZSBjdXJzb3IgYW5kIHRoYXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQKKyAqIHByb2JsZW1zIChlLmcuLCB3aGlsZSAiOnMiIGlzIHdvcmtpbmcpLgorICovCitzdGF0aWMgaW50IGFsbG93X3Njcm9sbGJhciA9IEZBTFNFOworCisjaWZkZWYgR0xPQkFMX0lNRQorIyBkZWZpbmUgTXlUcmFuc2xhdGVNZXNzYWdlKHgpIGdsb2JhbF9pbWVfVHJhbnNsYXRlTWVzc2FnZSh4KQorI2Vsc2UKKyMgZGVmaW5lIE15VHJhbnNsYXRlTWVzc2FnZSh4KSBUcmFuc2xhdGVNZXNzYWdlKHgpCisjZW5kaWYKKworI2lmIChkZWZpbmVkKFdJTjMyNjQpICYmIGRlZmluZWQoRkVBVF9NQllURSkpIHx8IGRlZmluZWQoR0xPQkFMX0lNRSkKKyAgLyogdXNlIG9mIFdpbmRvd1Byb2MgZGVwZW5kcyBvbiB3aWRlX1dpbmRvd1Byb2MgKi8KKyMgZGVmaW5lIE15V2luZG93UHJvYyB2aW1fV2luZG93UHJvYworI2Vsc2UKKyAgLyogdXNlIG9yZGluYXJ5IFdpbmRvd1Byb2MgKi8KKyMgZGVmaW5lIE15V2luZG93UHJvYyBEZWZXaW5kb3dQcm9jCisjZW5kaWYKKworZXh0ZXJuIGludCBjdXJyZW50X2ZvbnRfaGVpZ2h0OwkgICAgLyogdGhpcyBpcyBpbiBvc19tc3dpbi5jICovCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBVSU5UICAgIGtleV9zeW07CisgICAgY2hhcl91ICB2aW1fY29kZTA7CisgICAgY2hhcl91ICB2aW1fY29kZTE7Cit9IHNwZWNpYWxfa2V5c1tdID0KK3sKKyAgICB7VktfVVAsCQknaycsICd1J30sCisgICAge1ZLX0RPV04sCQknaycsICdkJ30sCisgICAge1ZLX0xFRlQsCQknaycsICdsJ30sCisgICAge1ZLX1JJR0hULAkJJ2snLCAncid9LAorCisgICAge1ZLX0YxLAkJJ2snLCAnMSd9LAorICAgIHtWS19GMiwJCSdrJywgJzInfSwKKyAgICB7VktfRjMsCQknaycsICczJ30sCisgICAge1ZLX0Y0LAkJJ2snLCAnNCd9LAorICAgIHtWS19GNSwJCSdrJywgJzUnfSwKKyAgICB7VktfRjYsCQknaycsICc2J30sCisgICAge1ZLX0Y3LAkJJ2snLCAnNyd9LAorICAgIHtWS19GOCwJCSdrJywgJzgnfSwKKyAgICB7VktfRjksCQknaycsICc5J30sCisgICAge1ZLX0YxMCwJCSdrJywgJzsnfSwKKworICAgIHtWS19GMTEsCQknRicsICcxJ30sCisgICAge1ZLX0YxMiwJCSdGJywgJzInfSwKKyAgICB7VktfRjEzLAkJJ0YnLCAnMyd9LAorICAgIHtWS19GMTQsCQknRicsICc0J30sCisgICAge1ZLX0YxNSwJCSdGJywgJzUnfSwKKyAgICB7VktfRjE2LAkJJ0YnLCAnNid9LAorICAgIHtWS19GMTcsCQknRicsICc3J30sCisgICAge1ZLX0YxOCwJCSdGJywgJzgnfSwKKyAgICB7VktfRjE5LAkJJ0YnLCAnOSd9LAorICAgIHtWS19GMjAsCQknRicsICdBJ30sCisKKyAgICB7VktfRjIxLAkJJ0YnLCAnQid9LAorI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIHtWS19QQVVTRSwJCSdGJywgJ0InfSwJLyogUGF1c2UgPT0gRjIxIChzZWUgZ3VpX2d0a194MTEuYykgKi8KKyNlbmRpZgorICAgIHtWS19GMjIsCQknRicsICdDJ30sCisgICAge1ZLX0YyMywJCSdGJywgJ0QnfSwKKyAgICB7VktfRjI0LAkJJ0YnLCAnRSd9LAkvKiB3aW51c2VyLmggZGVmaW5lcyB1cCB0byBGMjQgKi8KKworICAgIHtWS19IRUxQLAkJJyUnLCAnMSd9LAorICAgIHtWS19CQUNLLAkJJ2snLCAnYid9LAorICAgIHtWS19JTlNFUlQsCQknaycsICdJJ30sCisgICAge1ZLX0RFTEVURSwJCSdrJywgJ0QnfSwKKyAgICB7VktfSE9NRSwJCSdrJywgJ2gnfSwKKyAgICB7VktfRU5ELAkJJ0AnLCAnNyd9LAorICAgIHtWS19QUklPUiwJCSdrJywgJ1AnfSwKKyAgICB7VktfTkVYVCwJCSdrJywgJ04nfSwKKyAgICB7VktfUFJJTlQsCQknJScsICc5J30sCisgICAge1ZLX0FERCwJCSdLJywgJzYnfSwKKyAgICB7VktfU1VCVFJBQ1QsCSdLJywgJzcnfSwKKyAgICB7VktfRElWSURFLAkJJ0snLCAnOCd9LAorICAgIHtWS19NVUxUSVBMWSwJJ0snLCAnOSd9LAorICAgIHtWS19TRVBBUkFUT1IsCSdLJywgJ0EnfSwJLyogS2V5cGFkIEVudGVyICovCisgICAge1ZLX0RFQ0lNQUwsCSdLJywgJ0InfSwKKworICAgIHtWS19OVU1QQUQwLAknSycsICdDJ30sCisgICAge1ZLX05VTVBBRDEsCSdLJywgJ0QnfSwKKyAgICB7VktfTlVNUEFEMiwJJ0snLCAnRSd9LAorICAgIHtWS19OVU1QQUQzLAknSycsICdGJ30sCisgICAge1ZLX05VTVBBRDQsCSdLJywgJ0cnfSwKKyAgICB7VktfTlVNUEFENSwJJ0snLCAnSCd9LAorICAgIHtWS19OVU1QQUQ2LAknSycsICdJJ30sCisgICAge1ZLX05VTVBBRDcsCSdLJywgJ0onfSwKKyAgICB7VktfTlVNUEFEOCwJJ0snLCAnSyd9LAorICAgIHtWS19OVU1QQUQ5LAknSycsICdMJ30sCisKKyAgICAvKiBLZXlzIHRoYXQgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBhbnkgbW9kaWZpZXIgd2l0aDogKi8KKyAgICB7VktfU1BBQ0UsCQknICcsIE5VTH0sCisgICAge1ZLX1RBQiwJCVRBQiwgTlVMfSwKKyAgICB7VktfRVNDQVBFLAkJRVNDLCBOVUx9LAorICAgIHtOTCwJCU5MLCBOVUx9LAorICAgIHtDQVIsCQlDQVIsIE5VTH0sCisKKyAgICAvKiBFbmQgb2YgbGlzdCBtYXJrZXI6ICovCisgICAgezAsCQkJMCwgMH0KK307CisKKy8qIExvY2FsIHZhcmlhYmxlcyAqLworc3RhdGljIGludAkJc19idXR0b25fcGVuZGluZyA9IC0xOworc3RhdGljIGludAkJc194X3BlbmRpbmc7CitzdGF0aWMgaW50CQlzX3lfcGVuZGluZzsKK3N0YXRpYyBVSU5UCQlzX2tGbGFnc19wZW5kaW5nOworc3RhdGljIFVJTlQJCXNfd2FpdF90aW1lciA9IDA7ICAgLyogVGltZXIgZm9yIGdldCBjaGFyIGZyb20gdXNlciAqLworc3RhdGljIGludAkJc190aW1lZF9vdXQgPSBGQUxTRTsKK3N0YXRpYyBpbnQJCWRlYWRfa2V5ID0gMDsJLyogMCAtIG5vIGRlYWQga2V5LCAxIC0gZGVhZCBrZXkgcHJlc3NlZCAqLworCisjaWZkZWYgV0lOMzI2NAorc3RhdGljIE9TVkVSU0lPTklORk8gb3NfdmVyc2lvbjsgICAgLyogbGlrZSBpdCBzYXlzLiAgSW5pdCBpbiBndWlfbWNoX2luaXQoKSAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0JFVkFMCisvKiBiYWxsb29uLWV2YWwgV01fTk9USUZZX0hBTkRMRVIgKi8KK3N0YXRpYyB2b2lkIEhhbmRsZV9XTV9Ob3RpZnkgX19BUkdTKChIV05EIGh3bmQsIExQTk1IRFIgcG5taCkpOworc3RhdGljIHZvaWQgVHJhY2tVc2VyQWN0aXZpdHkgX19BUkdTKChVSU5UIHVNc2cpKTsKKyNlbmRpZgorCisvKgorICogRm9yIGNvbnRyb2wgSU1FLgorICovCisjaWZkZWYgRkVBVF9NQllURQorIyBpZmRlZiBVU0VfSU1fQ09OVFJPTAorc3RhdGljIExPR0ZPTlQgbm9ybV9sb2dmb250OworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFX0lNRQorc3RhdGljIExSRVNVTFQgX09uSW1lTm90aWZ5KEhXTkQgaFduZCwgRFdPUkQgZHdDb21tYW5kLCBEV09SRCBkd0RhdGEpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworLyoKKyAqIFByaW50IG91dCB0aGUgbGFzdCBXaW5kb3dzIGVycm9yIG1lc3NhZ2UKKyAqLworICAgIHN0YXRpYyB2b2lkCitwcmludF93aW5kb3dzX2Vycm9yKHZvaWQpCit7CisgICAgTFBWT0lEICBscE1zZ0J1ZjsKKworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisJCSAgTlVMTCwgR2V0TGFzdEVycm9yKCksCisJCSAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisJCSAgKExQVFNUUikgJmxwTXNnQnVmLCAwLCBOVUxMKTsKKyAgICBUUkFDRTEoIkVycm9yOiAlc1xuIiwgbHBNc2dCdWYpOworICAgIExvY2FsRnJlZShscE1zZ0J1Zik7Cit9CisjZW5kaWYgLyogREVCVUcgKi8KKworLyoKKyAqIEN1cnNvciBibGluayBmdW5jdGlvbnMuCisgKgorICogVGhpcyBpcyBhIHNpbXBsZSBzdGF0ZSBtYWNoaW5lOgorICogQkxJTktfTk9ORQlub3QgYmxpbmtpbmcgYXQgYWxsCisgKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KKyAqIEJMSU5LX09OCWJsaW5raW5nLCBjdXJzb3IgaXMgc2hvd24KKyAqLworCisjZGVmaW5lIEJMSU5LX05PTkUgIDAKKyNkZWZpbmUgQkxJTktfT0ZGICAgMQorI2RlZmluZSBCTElOS19PTiAgICAyCisKK3N0YXRpYyBpbnQJCWJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK3N0YXRpYyBsb25nX3UJCWJsaW5rX3dhaXR0aW1lID0gNzAwOworc3RhdGljIGxvbmdfdQkJYmxpbmtfb250aW1lID0gNDAwOworc3RhdGljIGxvbmdfdQkJYmxpbmtfb2ZmdGltZSA9IDI1MDsKK3N0YXRpYyBVSU5UCQlibGlua190aW1lciA9IDA7CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9ibGlua2luZyhsb25nIHdhaXQsIGxvbmcgb24sIGxvbmcgb2ZmKQoreworICAgIGJsaW5rX3dhaXR0aW1lID0gd2FpdDsKKyAgICBibGlua19vbnRpbWUgPSBvbjsKKyAgICBibGlua19vZmZ0aW1lID0gb2ZmOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBWT0lEIENBTExCQUNLCitfT25CbGlua1RpbWVyKAorICAgIEhXTkQgaHduZCwKKyAgICBVSU5UIHVNc2csCisgICAgVUlOVCBpZEV2ZW50LAorICAgIERXT1JEIGR3VGltZSkKK3sKKyAgICBNU0cgbXNnOworCisgICAgLyoKKyAgICBUUkFDRTIoIkdvdCB0aW1lciBldmVudCwgaWQgJWQsIGJsaW5rX3RpbWVyICVkXG4iLCBpZEV2ZW50LCBibGlua190aW1lcik7CisgICAgKi8KKworICAgIEtpbGxUaW1lcihOVUxMLCBpZEV2ZW50KTsKKworICAgIC8qIEVhdCBzcHVyaW91cyBXTV9USU1FUiBtZXNzYWdlcyAqLworICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLCBod25kLCBXTV9USU1FUiwgV01fVElNRVIsIFBNX1JFTU9WRSkpCisJOworCisgICAgaWYgKGJsaW5rX3N0YXRlID09IEJMSU5LX09OKQorICAgIHsKKwlndWlfdW5kcmF3X2N1cnNvcigpOworCWJsaW5rX3N0YXRlID0gQkxJTktfT0ZGOworCWJsaW5rX3RpbWVyID0gKFVJTlQpIFNldFRpbWVyKE5VTEwsIDAsIChVSU5UKWJsaW5rX29mZnRpbWUsCisJCQkJCQkgICAgKFRJTUVSUFJPQylfT25CbGlua1RpbWVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlibGlua190aW1lciA9IChVSU5UKSBTZXRUaW1lcihOVUxMLCAwLCAoVUlOVClibGlua19vbnRpbWUsCisJCQkJCQkJIChUSU1FUlBST0MpX09uQmxpbmtUaW1lcik7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK2d1aV9tc3dpbl9ybV9ibGlua190aW1lcih2b2lkKQoreworICAgIE1TRyBtc2c7CisKKyAgICBpZiAoYmxpbmtfdGltZXIgIT0gMCkKKyAgICB7CisJS2lsbFRpbWVyKE5VTEwsIGJsaW5rX3RpbWVyKTsKKwkvKiBFYXQgc3B1cmlvdXMgV01fVElNRVIgbWVzc2FnZXMgKi8KKwl3aGlsZSAoUGVla01lc3NhZ2UoJm1zZywgc19od25kLCBXTV9USU1FUiwgV01fVElNRVIsIFBNX1JFTU9WRSkpCisJICAgIDsKKwlibGlua190aW1lciA9IDA7CisgICAgfQorfQorCisvKgorICogU3RvcCB0aGUgY3Vyc29yIGJsaW5raW5nLiAgU2hvdyB0aGUgY3Vyc29yIGlmIGl0IHdhc24ndCBzaG93bi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RvcF9ibGluayh2b2lkKQoreworICAgIGd1aV9tc3dpbl9ybV9ibGlua190aW1lcigpOworICAgIGlmIChibGlua19zdGF0ZSA9PSBCTElOS19PRkYpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKKyAqIHdhaXRpbmcgdGltZSBhbmQgc2hvd3MgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RhcnRfYmxpbmsodm9pZCkKK3sKKyAgICBndWlfbXN3aW5fcm1fYmxpbmtfdGltZXIoKTsKKworICAgIC8qIE9ubHkgc3dpdGNoIGJsaW5raW5nIG9uIGlmIG5vbmUgb2YgdGhlIHRpbWVzIGlzIHplcm8gKi8KKyAgICBpZiAoYmxpbmtfd2FpdHRpbWUgJiYgYmxpbmtfb250aW1lICYmIGJsaW5rX29mZnRpbWUgJiYgZ3VpLmluX2ZvY3VzKQorICAgIHsKKwlibGlua190aW1lciA9IChVSU5UKVNldFRpbWVyKE5VTEwsIDAsIChVSU5UKWJsaW5rX3dhaXR0aW1lLAorCQkJCQkJICAgIChUSU1FUlBST0MpX09uQmxpbmtUaW1lcik7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgfQorfQorCisvKgorICogQ2FsbC1iYWNrIHJvdXRpbmVzLgorICovCisKKyAgICBzdGF0aWMgVk9JRCBDQUxMQkFDSworX09uVGltZXIoCisgICAgSFdORCBod25kLAorICAgIFVJTlQgdU1zZywKKyAgICBVSU5UIGlkRXZlbnQsCisgICAgRFdPUkQgZHdUaW1lKQoreworICAgIE1TRyBtc2c7CisKKyAgICAvKgorICAgIFRSQUNFMigiR290IHRpbWVyIGV2ZW50LCBpZCAlZCwgc193YWl0X3RpbWVyICVkXG4iLCBpZEV2ZW50LCBzX3dhaXRfdGltZXIpOworICAgICovCisgICAgS2lsbFRpbWVyKE5VTEwsIGlkRXZlbnQpOworICAgIHNfdGltZWRfb3V0ID0gVFJVRTsKKworICAgIC8qIEVhdCBzcHVyaW91cyBXTV9USU1FUiBtZXNzYWdlcyAqLworICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLCBod25kLCBXTV9USU1FUiwgV01fVElNRVIsIFBNX1JFTU9WRSkpCisJOworICAgIGlmIChpZEV2ZW50ID09IHNfd2FpdF90aW1lcikKKwlzX3dhaXRfdGltZXIgPSAwOworfQorCisgICAgc3RhdGljIHZvaWQKK19PbkRlYWRDaGFyKAorICAgIEhXTkQgaHduZCwKKyAgICBVSU5UIGNoLAorICAgIGludCBjUmVwZWF0KQoreworICAgIGRlYWRfa2V5ID0gMTsKK30KKworLyoKKyAqIENvbnZlcnQgVW5pY29kZSBjaGFyYWN0ZXIgImNoIiB0byBieXRlcyBpbiAic3RyaW5nW3NsZW5dIi4KKyAqIFJldHVybiB0aGUgbGVuZ3RoLgorICovCisgICAgc3RhdGljIGludAorY2hhcl90b19zdHJpbmcoaW50IGNoLCBjaGFyX3UgKnN0cmluZywgaW50IHNsZW4pCit7CisgICAgaW50CQlsZW47CisgICAgaW50CQlpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBXQ0hBUgl3c3RyaW5nWzJdOworICAgIGNoYXJfdQkqd3MgPSBOVUxMOzsKKworICAgIC8qICJjaCIgaXMgYSBVVEYtMTYgY2hhcmFjdGVyLiAgQ29udmVydCBpdCB0byBhIHN0cmluZyBvZiBieXRlcy4gIFdoZW4KKyAgICAgKiAiZW5jX2NvZGVwYWdlIiBpcyBub24temVybyB1c2UgdGhlIHN0YW5kYXJkIFdpbjMyIGZ1bmN0aW9uLCBvdGhlcndpc2UKKyAgICAgKiB1c2Ugb3VyIG93biBjb252ZXJzaW9uIGZ1bmN0aW9uIChlLmcuLCBmb3IgVVRGLTgpLiAqLworICAgIHdzdHJpbmdbMF0gPSBjaDsKKyAgICBpZiAoZW5jX2NvZGVwYWdlID4gMCkKKwlsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKGVuY19jb2RlcGFnZSwgMCwgd3N0cmluZywgMSwgc3RyaW5nLCBzbGVuLAorCQkJCQkJCQkgICAgIDAsIE5VTEwpOworICAgIGVsc2UKKyAgICB7CisJbGVuID0gMTsKKwl3cyA9IHVjczJfdG9fZW5jKHdzdHJpbmcsICZsZW4pOworCWlmICh3cyA9PSBOVUxMKQorCSAgICBsZW4gPSAwOworCWVsc2UKKwl7CisJICAgIGlmIChsZW4gPiBzbGVuKQkvKiBqdXN0IGluIGNhc2UgKi8KKwkJbGVuID0gc2xlbjsKKwkgICAgbWNoX21lbW1vdmUoc3RyaW5nLCB3cywgbGVuKTsKKwkgICAgdmltX2ZyZWUod3MpOworCX0KKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKQorI2VuZGlmCisgICAgeworCXN0cmluZ1swXSA9IGNoOworCWxlbiA9IDE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCWlmIChzdHJpbmdbaV0gPT0gQ1NJICYmIGxlbiA8PSBzbGVuIC0gMikKKwl7CisJICAgIC8qIEluc2VydCBDU0kgYXMgS19DU0kuICovCisJICAgIG1jaF9tZW1tb3ZlKHN0cmluZyArIGkgKyAzLCBzdHJpbmcgKyBpICsgMSwgbGVuIC0gaSAtIDEpOworCSAgICBzdHJpbmdbKytpXSA9IEtTX0VYVFJBOworCSAgICBzdHJpbmdbKytpXSA9IChpbnQpS0VfQ1NJOworCSAgICBsZW4gKz0gMjsKKwl9CisKKyAgICByZXR1cm4gbGVuOworfQorCisvKgorICogS2V5IGhpdCwgYWRkIGl0IHRvIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorX09uQ2hhcigKKyAgICBIV05EIGh3bmQsCisgICAgVUlOVCBjaCwKKyAgICBpbnQgY1JlcGVhdCkKK3sKKyAgICBjaGFyX3UJc3RyaW5nWzQwXTsKKyAgICBpbnQJCWxlbiA9IDA7CisKKyAgICBsZW4gPSBjaGFyX3RvX3N0cmluZyhjaCwgc3RyaW5nLCA0MCk7CisgICAgaWYgKGxlbiA9PSAxICYmIHN0cmluZ1swXSA9PSBDdHJsX0MgJiYgY3RybF9jX2ludGVycnVwdHMpCisgICAgeworCXRyYXNoX2lucHV0X2J1ZigpOworCWdvdF9pbnQgPSBUUlVFOworICAgIH0KKworICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCBsZW4pOworfQorCisvKgorICogQWx0LUtleSBoaXQsIGFkZCBpdCB0byB0aGUgaW5wdXQgYnVmZmVyLgorICovCisgICAgc3RhdGljIHZvaWQKK19PblN5c0NoYXIoCisgICAgSFdORCBod25kLAorICAgIFVJTlQgY2NoLAorICAgIGludCBjUmVwZWF0KQoreworICAgIGNoYXJfdQlzdHJpbmdbNDBdOyAvKiBFbm91Z2ggZm9yIG11bHRpYnl0ZSBjaGFyYWN0ZXIgKi8KKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCW1vZGlmaWVyczsKKyAgICBpbnQJCWNoID0gY2NoOyAgIC8qIHNwZWNpYWwga2V5cyBhcmUgbmVnYXRpdmUgKi8KKworICAgIC8qIFRSQUNFKCJPblN5c0NoYXIoJWQsICVjKVxuIiwgY2gsIGNoKTsgKi8KKworICAgIC8qIE9LLCB3ZSBoYXZlIGEgY2hhcmFjdGVyIGtleSAoZ2l2ZW4gYnkgY2gpIHdoaWNoIHdhcyBlbnRlcmVkIHdpdGggdGhlCisgICAgICogQUxUIGtleSBwcmVzc2VkLiBFZywgaWYgdGhlIHVzZXIgcHJlc3NlcyBBbHQtQSwgdGhlbiBjaCA9PSAnQScuIE5vdGUKKyAgICAgKiB0aGF0IHRoZSBzeXN0ZW0gZGlzdGluZ3Vpc2hlcyBBbHQtYSBhbmQgQWx0LUEgKEFsdC1TaGlmdC1hIHVubGVzcworICAgICAqIENBUFNMT0NLIGlzIHByZXNzZWQpIGF0IHRoaXMgcG9pbnQuCisgICAgICovCisgICAgbW9kaWZpZXJzID0gTU9EX01BU0tfQUxUOworICAgIGlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApCisJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworICAgIGlmIChHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMCkKKwltb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKKworICAgIGNoID0gc2ltcGxpZnlfa2V5KGNoLCAmbW9kaWZpZXJzKTsKKyAgICAvKiByZW1vdmUgdGhlIFNISUZUIG1vZGlmaWVyIGZvciBrZXlzIHdoZXJlIGl0J3MgYWxyZWFkeSBpbmNsdWRlZCwgZS5nLiwKKyAgICAgKiAnKCcgYW5kICcqJyAqLworICAgIGlmIChjaCA8IDB4MTAwICYmICFpc2FscGhhKGNoKSAmJiBpc3ByaW50KGNoKSkKKwltb2RpZmllcnMgJj0gfk1PRF9NQVNLX1NISUZUOworCisgICAgLyogSW50ZXJwcmV0IHRoZSBBTFQga2V5IGFzIG1ha2luZyB0aGUga2V5IE1FVEEsIGluY2x1ZGUgU0hJRlQsIGV0Yy4gKi8KKyAgICBjaCA9IGV4dHJhY3RfbW9kaWZpZXJzKGNoLCAmbW9kaWZpZXJzKTsKKyAgICBpZiAoY2ggPT0gQ1NJKQorCWNoID0gS19DU0k7CisKKyAgICBsZW4gPSAwOworICAgIGlmIChtb2RpZmllcnMpCisgICAgeworCXN0cmluZ1tsZW4rK10gPSBDU0k7CisJc3RyaW5nW2xlbisrXSA9IEtTX01PRElGSUVSOworCXN0cmluZ1tsZW4rK10gPSBtb2RpZmllcnM7CisgICAgfQorCisgICAgaWYgKElTX1NQRUNJQUwoKGludCljaCkpCisgICAgeworCXN0cmluZ1tsZW4rK10gPSBDU0k7CisJc3RyaW5nW2xlbisrXSA9IEtfU0VDT05EKChpbnQpY2gpOworCXN0cmluZ1tsZW4rK10gPSBLX1RISVJEKChpbnQpY2gpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIEFsdGhvdWdoIHRoZSBkb2N1bWVudGF0aW9uIGlzbid0IGNsZWFyIGFib3V0IGl0LCB3ZSBhc3N1bWUgImNoIiBpcworCSAqIGEgVW5pY29kZSBjaGFyYWN0ZXIuICovCisJbGVuICs9IGNoYXJfdG9fc3RyaW5nKGNoLCBzdHJpbmcgKyBsZW4sIDQwIC0gbGVuKTsKKyAgICB9CisKKyAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgbGVuKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitfT25Nb3VzZUV2ZW50KAorICAgIGludCBidXR0b24sCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgaW50IHJlcGVhdGVkX2NsaWNrLAorICAgIFVJTlQga2V5RmxhZ3MpCit7CisgICAgaW50IHZpbV9tb2RpZmllcnMgPSAweDA7CisKKyAgICBpZiAoa2V5RmxhZ3MgJiBNS19TSElGVCkKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX1NISUZUOworICAgIGlmIChrZXlGbGFncyAmIE1LX0NPTlRST0wpCisJdmltX21vZGlmaWVycyB8PSBNT1VTRV9DVFJMOworICAgIGlmIChHZXRLZXlTdGF0ZShWS19NRU5VKSAmIDB4ODAwMCkKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKKworICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KGJ1dHRvbiwgeCwgeSwgcmVwZWF0ZWRfY2xpY2ssIHZpbV9tb2RpZmllcnMpOworfQorCisgICAgc3RhdGljIHZvaWQKK19Pbk1vdXNlQnV0dG9uRG93bigKKyAgICBIV05EIGh3bmQsCisgICAgQk9PTCBmRG91YmxlQ2xpY2ssCisgICAgaW50IHgsCisgICAgaW50IHksCisgICAgVUlOVCBrZXlGbGFncykKK3sKKyAgICBzdGF0aWMgTE9ORwlzX3ByZXZUaW1lID0gMDsKKworICAgIExPTkcgICAgY3VycmVudFRpbWUgPSBHZXRNZXNzYWdlVGltZSgpOworICAgIGludAkgICAgYnV0dG9uID0gLTE7CisgICAgaW50CSAgICByZXBlYXRlZF9jbGljazsKKworICAgIC8qIEdpdmUgbWFpbiB3aW5kb3cgdGhlIGZvY3VzOiB0aGlzIGlzIHNvIHRoZSBjdXJzb3IgaXNuJ3QgaG9sbG93LiAqLworICAgICh2b2lkKVNldEZvY3VzKHNfaHduZCk7CisKKyAgICBpZiAoc191TXNnID09IFdNX0xCVVRUT05ET1dOIHx8IHNfdU1zZyA9PSBXTV9MQlVUVE9OREJMQ0xLKQorCWJ1dHRvbiA9IE1PVVNFX0xFRlQ7CisgICAgZWxzZSBpZiAoc191TXNnID09IFdNX01CVVRUT05ET1dOIHx8IHNfdU1zZyA9PSBXTV9NQlVUVE9OREJMQ0xLKQorCWJ1dHRvbiA9IE1PVVNFX01JRERMRTsKKyAgICBlbHNlIGlmIChzX3VNc2cgPT0gV01fUkJVVFRPTkRPV04gfHwgc191TXNnID09IFdNX1JCVVRUT05EQkxDTEspCisJYnV0dG9uID0gTU9VU0VfUklHSFQ7CisjaWZuZGVmIFdJTjE2IC8qPFZOPiovCisgICAgZWxzZSBpZiAoc191TXNnID09IFdNX1hCVVRUT05ET1dOIHx8IHNfdU1zZyA9PSBXTV9YQlVUVE9OREJMQ0xLKQorICAgIHsKKyNpZm5kZWYgR0VUX1hCVVRUT05fV1BBUkFNCisjIGRlZmluZSBHRVRfWEJVVFRPTl9XUEFSQU0od1BhcmFtKQkoSElXT1JEKHdQYXJhbSkpCisjZW5kaWYKKwlidXR0b24gPSAoKEdFVF9YQlVUVE9OX1dQQVJBTShzX3dQYXJhbSkgPT0gMSkgPyBNT1VTRV9YMSA6IE1PVVNFX1gyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc191TXNnID09IFdNX0NBUFRVUkVDSEFOR0VEKQorICAgIHsKKwkvKiBvbiBXOTUvTlQ0LCBzb21laG93IHlvdSBnZXQgaW4gaGVyZSB3aXRoIGFuIG9kZCBNc2cKKwkgKiBpZiB5b3UgcHJlc3Mgb25lIGJ1dHRvbiB3aGlsZSBob2xkaW5nIGRvd24gdGhlIG90aGVyLi4qLworCWlmIChzX2J1dHRvbl9wZW5kaW5nID09IE1PVVNFX0xFRlQpCisJICAgIGJ1dHRvbiA9IE1PVVNFX1JJR0hUOworCWVsc2UKKwkgICAgYnV0dG9uID0gTU9VU0VfTEVGVDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoYnV0dG9uID49IDApCisgICAgeworCXJlcGVhdGVkX2NsaWNrID0gKChpbnQpKGN1cnJlbnRUaW1lIC0gc19wcmV2VGltZSkgPCBwX21vdXNldCk7CisKKwkvKgorCSAqIEhvbGRpbmcgZG93biB0aGUgbGVmdCBhbmQgcmlnaHQgYnV0dG9ucyBzaW11bGF0ZXMgcHVzaGluZyB0aGUgbWlkZGxlCisJICogYnV0dG9uLgorCSAqLworCWlmIChyZXBlYXRlZF9jbGljayAmJgorCQkoKGJ1dHRvbiA9PSBNT1VTRV9MRUZUICYmIHNfYnV0dG9uX3BlbmRpbmcgPT0gTU9VU0VfUklHSFQpIHx8CisJCSAoYnV0dG9uID09IE1PVVNFX1JJR0hUICYmIHNfYnV0dG9uX3BlbmRpbmcgPT0gTU9VU0VfTEVGVCkpKQorCXsKKwkgICAgLyoKKwkgICAgICogSG1tLCBndWkuYyB3aWxsIGlnbm9yZSBtb3JlIHRoYW4gb25lIGJ1dHRvbiBkb3duIGF0IGEgdGltZSwgc28KKwkgICAgICogcHJldGVuZCB3ZSBsZXQgZ28gb2YgaXQgZmlyc3QuCisJICAgICAqLworCSAgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9SRUxFQVNFLCB4LCB5LCBGQUxTRSwgMHgwKTsKKwkgICAgYnV0dG9uID0gTU9VU0VfTUlERExFOworCSAgICByZXBlYXRlZF9jbGljayA9IEZBTFNFOworCSAgICBzX2J1dHRvbl9wZW5kaW5nID0gLTE7CisJICAgIF9Pbk1vdXNlRXZlbnQoYnV0dG9uLCB4LCB5LCByZXBlYXRlZF9jbGljaywga2V5RmxhZ3MpOworCX0KKwllbHNlIGlmICgocmVwZWF0ZWRfY2xpY2spCisJCXx8IChtb3VzZV9tb2RlbF9wb3B1cCgpICYmIChidXR0b24gPT0gTU9VU0VfUklHSFQpKSkKKwl7CisJICAgIGlmIChzX2J1dHRvbl9wZW5kaW5nID4gLTEpCisJICAgIHsKKwkJICAgIF9Pbk1vdXNlRXZlbnQoc19idXR0b25fcGVuZGluZywgeCwgeSwgRkFMU0UsIGtleUZsYWdzKTsKKwkJICAgIHNfYnV0dG9uX3BlbmRpbmcgPSAtMTsKKwkgICAgfQorCSAgICAvKiBUUkFDRSgiQnV0dG9uIGRvd24gYXQgeCAlZCwgeSAlZFxuIiwgeCwgeSk7ICovCisJICAgIF9Pbk1vdXNlRXZlbnQoYnV0dG9uLCB4LCB5LCByZXBlYXRlZF9jbGljaywga2V5RmxhZ3MpOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcmVzcyAoaS5lLiBub3QgYSBtdWx0aXBsZSBjbGljaykgZG9uJ3QKKwkgICAgICogYWN0aW9uIGltbWVkaWF0ZWx5LCBidXQgc3RvcmUgYW5kIHdhaXQgZm9yOgorCSAgICAgKiBpKSBidXR0b24tdXAKKwkgICAgICogaWkpIG1vdXNlIG1vdmUKKwkgICAgICogaWlpKSBhbm90aGVyIGJ1dHRvbiBwcmVzcworCSAgICAgKiBiZWZvcmUgdXNpbmcgaXQuCisJICAgICAqIFRoaXMgZW5hYmxlcyB1cyB0byBtYWtlIGxlZnQrcmlnaHQgc2ltdWxhdGUgbWlkZGxlIGJ1dHRvbiwKKwkgICAgICogd2l0aG91dCBsZWZ0IG9yIHJpZ2h0IGJlaW5nIGFjdGlvbmVkIGZpcnN0LiAgVGhlIHNpZGUtZWZmZWN0IGlzCisJICAgICAqIHRoYXQgaWYgeW91IGNsaWNrIGFuZCBob2xkIHRoZSBtb3VzZSB3aXRob3V0IGRyYWdnaW5nLCB0aGUKKwkgICAgICogY3Vyc29yIGRvZXNuJ3QgbW92ZSB1bnRpbCB5b3UgcmVsZWFzZSB0aGUgYnV0dG9uLiBJbiBwcmFjdGljZQorCSAgICAgKiB0aGlzIGlzIGhhcmRseSBhIHByb2JsZW0uCisJICAgICAqLworCSAgICBzX2J1dHRvbl9wZW5kaW5nID0gYnV0dG9uOworCSAgICBzX3hfcGVuZGluZyA9IHg7CisJICAgIHNfeV9wZW5kaW5nID0geTsKKwkgICAgc19rRmxhZ3NfcGVuZGluZyA9IGtleUZsYWdzOworCX0KKworCXNfcHJldlRpbWUgPSBjdXJyZW50VGltZTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorX09uTW91c2VNb3ZlT3JSZWxlYXNlKAorICAgIEhXTkQgaHduZCwKKyAgICBpbnQgeCwKKyAgICBpbnQgeSwKKyAgICBVSU5UIGtleUZsYWdzKQoreworICAgIGludCBidXR0b247CisKKyAgICBpZiAoc19idXR0b25fcGVuZGluZyA+IC0xKQorICAgIHsKKwkvKiBEZWxheWVkIGFjdGlvbiBmb3IgbW91c2UgZG93biBldmVudCAqLworCV9Pbk1vdXNlRXZlbnQoc19idXR0b25fcGVuZGluZywgc194X3BlbmRpbmcsCisJCQlzX3lfcGVuZGluZywgRkFMU0UsIHNfa0ZsYWdzX3BlbmRpbmcpOworCXNfYnV0dG9uX3BlbmRpbmcgPSAtMTsKKyAgICB9CisgICAgaWYgKHNfdU1zZyA9PSBXTV9NT1VTRU1PVkUpCisgICAgeworCS8qCisJICogSXQncyBvbmx5IGEgTU9VU0VfRFJBRyBpZiBvbmUgb3IgbW9yZSBtb3VzZSBidXR0b25zIGFyZSBiZWluZyBoZWxkCisJICogZG93bi4KKwkgKi8KKwlpZiAoIShrZXlGbGFncyAmIChNS19MQlVUVE9OIHwgTUtfTUJVVFRPTiB8IE1LX1JCVVRUT04KKwkJCQkJCXwgTUtfWEJVVFRPTjEgfCBNS19YQlVUVE9OMikpKQorCXsKKwkgICAgZ3VpX21vdXNlX21vdmVkKHgsIHkpOworCSAgICByZXR1cm47CisJfQorCisJLyoKKwkgKiBXaGlsZSBidXR0b24gaXMgZG93biwga2VlcCBncmFiYmluZyBtb3VzZSBtb3ZlIGV2ZW50cyB3aGVuCisJICogdGhlIG1vdXNlIGdvZXMgb3V0c2lkZSB0aGUgd2luZG93CisJICovCisJU2V0Q2FwdHVyZShzX3RleHRBcmVhKTsKKwlidXR0b24gPSBNT1VTRV9EUkFHOworCS8qIFRSQUNFKCIgIG1vdmUgYXQgeCAlZCwgeSAlZFxuIiwgeCwgeSk7ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUmVsZWFzZUNhcHR1cmUoKTsKKwlidXR0b24gPSBNT1VTRV9SRUxFQVNFOworCS8qIFRSQUNFKCIgIHVwIGF0IHggJWQsIHkgJWRcbiIsIHgsIHkpOyAqLworICAgIH0KKworICAgIF9Pbk1vdXNlRXZlbnQoYnV0dG9uLCB4LCB5LCBGQUxTRSwga2V5RmxhZ3MpOworfQorCisjaWZkZWYgRkVBVF9NRU5VCisvKgorICogRmluZCB0aGUgdmltbWVudV9UIHdpdGggdGhlIGdpdmVuIGlkCisgKi8KKyAgICBzdGF0aWMgdmltbWVudV9UICoKK2d1aV9tc3dpbl9maW5kX21lbnUoCisgICAgdmltbWVudV9UCSpwTWVudSwKKyAgICBpbnQJCWlkKQoreworICAgIHZpbW1lbnVfVAkqcENoaWxkTWVudTsKKworICAgIHdoaWxlIChwTWVudSkKKyAgICB7CisJaWYgKHBNZW51LT5pZCA9PSAoVUlOVClpZCkKKwkgICAgYnJlYWs7CisJaWYgKHBNZW51LT5jaGlsZHJlbiAhPSBOVUxMKQorCXsKKwkgICAgcENoaWxkTWVudSA9IGd1aV9tc3dpbl9maW5kX21lbnUocE1lbnUtPmNoaWxkcmVuLCBpZCk7CisJICAgIGlmIChwQ2hpbGRNZW51KQorCSAgICB7CisJCXBNZW51ID0gcENoaWxkTWVudTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJcE1lbnUgPSBwTWVudS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHBNZW51OworfQorCisgICAgc3RhdGljIHZvaWQKK19Pbk1lbnUoCisgICAgSFdORAlod25kLAorICAgIGludAkJaWQsCisgICAgSFdORAlod25kQ3RsLAorICAgIFVJTlQJY29kZU5vdGlmeSkKK3sKKyAgICB2aW1tZW51X1QJKnBNZW51OworCisgICAgcE1lbnUgPSBndWlfbXN3aW5fZmluZF9tZW51KHJvb3RfbWVudSwgaWQpOworICAgIGlmIChwTWVudSkKKwlndWlfbWVudV9jYihwTWVudSk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1TV0lOX0ZJTkRfUkVQTEFDRQorLyoKKyAqIEhhbmRsZSBhIEZpbmQvUmVwbGFjZSB3aW5kb3cgbWVzc2FnZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitfT25GaW5kUmVwbCh2b2lkKQoreworICAgIGludAkgICAgZmxhZ3MgPSAwOworICAgIGludAkgICAgZG93bjsKKworICAgIGlmIChzX2ZpbmRyZXBfc3RydWN0LkZsYWdzICYgRlJfRElBTE9HVEVSTSkKKwkvKiBHaXZlIG1haW4gd2luZG93IHRoZSBmb2N1cyBiYWNrLiAqLworCSh2b2lkKVNldEZvY3VzKHNfaHduZCk7CisKKyAgICBpZiAoc19maW5kcmVwX3N0cnVjdC5GbGFncyAmIEZSX0ZJTkRORVhUKQorICAgIHsKKwlmbGFncyA9IEZSRF9GSU5ETkVYVDsKKworCS8qIEdpdmUgbWFpbiB3aW5kb3cgdGhlIGZvY3VzIGJhY2s6IHRoaXMgaXMgc28gdGhlIGN1cnNvciBpc24ndAorCSAqIGhvbGxvdy4gKi8KKwkodm9pZClTZXRGb2N1cyhzX2h3bmQpOworICAgIH0KKyAgICBlbHNlIGlmIChzX2ZpbmRyZXBfc3RydWN0LkZsYWdzICYgRlJfUkVQTEFDRSkKKyAgICB7CisJZmxhZ3MgPSBGUkRfUkVQTEFDRTsKKworCS8qIEdpdmUgbWFpbiB3aW5kb3cgdGhlIGZvY3VzIGJhY2s6IHRoaXMgaXMgc28gdGhlIGN1cnNvciBpc24ndAorCSAqIGhvbGxvdy4gKi8KKwkodm9pZClTZXRGb2N1cyhzX2h3bmQpOworICAgIH0KKyAgICBlbHNlIGlmIChzX2ZpbmRyZXBfc3RydWN0LkZsYWdzICYgRlJfUkVQTEFDRUFMTCkKKyAgICB7CisJZmxhZ3MgPSBGUkRfUkVQTEFDRUFMTDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgIT0gMCkKKyAgICB7CisJLyogQ2FsbCB0aGUgZ2VuZXJpYyBHVUkgZnVuY3Rpb24gdG8gZG8gdGhlIGFjdHVhbCB3b3JrLiAqLworCWlmIChzX2ZpbmRyZXBfc3RydWN0LkZsYWdzICYgRlJfV0hPTEVXT1JEKQorCSAgICBmbGFncyB8PSBGUkRfV0hPTEVfV09SRDsKKwlpZiAoc19maW5kcmVwX3N0cnVjdC5GbGFncyAmIEZSX01BVENIQ0FTRSkKKwkgICAgZmxhZ3MgfD0gRlJEX01BVENIX0NBU0U7CisJZG93biA9IChzX2ZpbmRyZXBfc3RydWN0LkZsYWdzICYgRlJfRE9XTikgIT0gMDsKKwlndWlfZG9fZmluZHJlcGwoZmxhZ3MsIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJGaW5kV2hhdCwKKwkJCQkgICAgIHNfZmluZHJlcF9zdHJ1Y3QubHBzdHJSZXBsYWNlV2l0aCwgZG93bik7CisgICAgfQorfQorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAorSGFuZGxlTW91c2VIaWRlKFVJTlQgdU1zZywgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBzdGF0aWMgTFBBUkFNIGxhc3RfbFBhcmFtID0gMEw7CisKKyAgICAvKiBXZSBzb21ldGltZXMgZ2V0IGEgbW91c2Vtb3ZlIHdoZW4gdGhlIG1vdXNlIGRpZG4ndCBtb3ZlLi4uICovCisgICAgaWYgKHVNc2cgPT0gV01fTU9VU0VNT1ZFKQorICAgIHsKKwlpZiAobFBhcmFtID09IGxhc3RfbFBhcmFtKQorCSAgICByZXR1cm47CisJbGFzdF9sUGFyYW0gPSBsUGFyYW07CisgICAgfQorCisgICAgLyogSGFuZGxlIHNwZWNpYWxseSwgdG8gY2VudHJhbGlzZSBjb2RpbmcuIFdlIG5lZWQgdG8gYmUgc3VyZSB3ZSBjYXRjaCBhbGwKKyAgICAgKiBwb3NzaWJsZSBldmVudHMgd2hpY2ggc2hvdWxkIGNhdXNlIHVzIHRvIHJlc3RvcmUgdGhlIGN1cnNvciAoYXMgaXQgaXMgYQorICAgICAqIHNoYXJlZCByZXNvdXJjZSwgd2UgdGFrZSBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBpdCkuCisgICAgICovCisgICAgc3dpdGNoICh1TXNnKQorICAgIHsKKyAgICBjYXNlIFdNX0tFWVVQOgorICAgIGNhc2UgV01fQ0hBUjoKKwkvKgorCSAqIGJsYW5rIG91dCB0aGUgcG9pbnRlciBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAocF9taCkKKwkgICAgZ3VpX21jaF9tb3VzZWhpZGUoVFJVRSk7CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX1NZU0tFWVVQOgkgLyogc2hvdyB0aGUgcG9pbnRlciB3aGVuIGEgc3lzdGVtLWtleSBpcyBwcmVzc2VkICovCisgICAgY2FzZSBXTV9TWVNDSEFSOgorICAgIGNhc2UgV01fTU9VU0VNT1ZFOgkgLyogc2hvdyB0aGUgcG9pbnRlciBvbiBhbnkgbW91c2UgYWN0aW9uICovCisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKyAgICBjYXNlIFdNX01CVVRUT05ET1dOOgorICAgIGNhc2UgV01fTUJVVFRPTlVQOgorICAgIGNhc2UgV01fUkJVVFRPTkRPV046CisgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisgICAgY2FzZSBXTV9YQlVUVE9ORE9XTjoKKyAgICBjYXNlIFdNX1hCVVRUT05VUDoKKyAgICBjYXNlIFdNX05DTU9VU0VNT1ZFOgorICAgIGNhc2UgV01fTkNMQlVUVE9ORE9XTjoKKyAgICBjYXNlIFdNX05DTEJVVFRPTlVQOgorICAgIGNhc2UgV01fTkNNQlVUVE9ORE9XTjoKKyAgICBjYXNlIFdNX05DTUJVVFRPTlVQOgorICAgIGNhc2UgV01fTkNSQlVUVE9ORE9XTjoKKyAgICBjYXNlIFdNX05DUkJVVFRPTlVQOgorICAgIGNhc2UgV01fS0lMTEZPQ1VTOgorCS8qCisJICogaWYgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGhpZGRlbiwgdGhlbiB3ZSBzaG91bGQgc2hvdyBpdC4KKwkgKi8KKwlndWlfbWNoX21vdXNlaGlkZShGQUxTRSk7CisJYnJlYWs7CisgICAgfQorfQorCisgICAgc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sKK19UZXh0QXJlYVduZFByb2MoCisgICAgSFdORCBod25kLAorICAgIFVJTlQgdU1zZywKKyAgICBXUEFSQU0gd1BhcmFtLAorICAgIExQQVJBTSBsUGFyYW0pCit7CisgICAgLyoKKyAgICBUUkFDRSgiVGV4dEFyZWFXbmRQcm9jOiBod25kID0gJTA4eCwgbXNnID0gJXgsIHdQYXJhbSA9ICV4LCBsUGFyYW0gPSAleFxuIiwKKwkgIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAqLworCisgICAgSGFuZGxlTW91c2VIaWRlKHVNc2csIGxQYXJhbSk7CisKKyAgICBzX3VNc2cgPSB1TXNnOworICAgIHNfd1BhcmFtID0gd1BhcmFtOworICAgIHNfbFBhcmFtID0gbFBhcmFtOworCisjaWZkZWYgRkVBVF9CRVZBTAorICAgIFRyYWNrVXNlckFjdGl2aXR5KHVNc2cpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKHVNc2cpCisgICAgeworCUhBTkRMRV9NU0coaHduZCwgV01fTEJVVFRPTkRCTENMSyxfT25Nb3VzZUJ1dHRvbkRvd24pOworCUhBTkRMRV9NU0coaHduZCwgV01fTEJVVFRPTkRPV04sX09uTW91c2VCdXR0b25Eb3duKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX0xCVVRUT05VUCwJX09uTW91c2VNb3ZlT3JSZWxlYXNlKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX01CVVRUT05EQkxDTEssX09uTW91c2VCdXR0b25Eb3duKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX01CVVRUT05ET1dOLF9Pbk1vdXNlQnV0dG9uRG93bik7CisJSEFORExFX01TRyhod25kLCBXTV9NQlVUVE9OVVAsCV9Pbk1vdXNlTW92ZU9yUmVsZWFzZSk7CisJSEFORExFX01TRyhod25kLCBXTV9NT1VTRU1PVkUsCV9Pbk1vdXNlTW92ZU9yUmVsZWFzZSk7CisJSEFORExFX01TRyhod25kLCBXTV9QQUlOVCwJX09uUGFpbnQpOworCUhBTkRMRV9NU0coaHduZCwgV01fUkJVVFRPTkRCTENMSyxfT25Nb3VzZUJ1dHRvbkRvd24pOworCUhBTkRMRV9NU0coaHduZCwgV01fUkJVVFRPTkRPV04sX09uTW91c2VCdXR0b25Eb3duKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1JCVVRUT05VUCwJX09uTW91c2VNb3ZlT3JSZWxlYXNlKTsKKyNpZm5kZWYgV0lOMTYgLyo8Vk4+Ki8KKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1hCVVRUT05EQkxDTEssX09uTW91c2VCdXR0b25Eb3duKTsKKwlIQU5ETEVfTVNHKGh3bmQsIFdNX1hCVVRUT05ET1dOLF9Pbk1vdXNlQnV0dG9uRG93bik7CisJSEFORExFX01TRyhod25kLCBXTV9YQlVUVE9OVVAsCV9Pbk1vdXNlTW92ZU9yUmVsZWFzZSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQkVWQUwKKwljYXNlIFdNX05PVElGWTogSGFuZGxlX1dNX05vdGlmeShod25kLCAoTFBOTUhEUilsUGFyYW0pOworCSAgICByZXR1cm4gVFJVRTsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gTXlXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9Cit9CisKKyNpZiAoZGVmaW5lZChXSU4zMjY0KSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpKSBcCisJfHwgZGVmaW5lZChHTE9CQUxfSU1FKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKyMgaWZkZWYgUFJPVE8KK3R5cGVkZWYgaW50IFdJTkFQSTsKKyMgZW5kaWYKKworICAgIExSRVNVTFQgV0lOQVBJCit2aW1fV2luZG93UHJvYyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyMgaWZkZWYgR0xPQkFMX0lNRQorICAgIHJldHVybiBnbG9iYWxfaW1lX0RlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworIyBlbHNlCisgICAgaWYgKHdpZGVfV2luZG93UHJvYykKKwlyZXR1cm4gRGVmV2luZG93UHJvY1coaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kIGNvbG9yIGhhcyBiZWVuIGNoYW5nZWQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX25ld19jb2xvcnModm9pZCkKK3sKKyAgICAvKiBub3RoaW5nIHRvIGRvPyAqLworfQorCisvKgorICogU2V0IHRoZSBjb2xvcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RlZl9jb2xvcnMoKQoreworICAgIGd1aS5ub3JtX3BpeGVsID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XVEVYVCk7CisgICAgZ3VpLmJhY2tfcGl4ZWwgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1cpOworICAgIGd1aS5kZWZfbm9ybV9waXhlbCA9IGd1aS5ub3JtX3BpeGVsOworICAgIGd1aS5kZWZfYmFja19waXhlbCA9IGd1aS5iYWNrX3BpeGVsOworfQorCisvKgorICogT3BlbiB0aGUgR1VJIHdpbmRvdyB3aGljaCB3YXMgY3JlYXRlZCBieSBhIGNhbGwgdG8gZ3VpX21jaF9pbml0KCkuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfb3Blbih2b2lkKQoreworI2lmbmRlZiBTV19TSE9XREVGQVVMVAorIyBkZWZpbmUgU1dfU0hPV0RFRkFVTFQgMTAJLyogQm9ybGFuZCA1LjAgZG9lc24ndCBoYXZlIGl0ICovCisjZW5kaWYKKyAgICAvKiBBY3R1YWxseSBvcGVuIHRoZSB3aW5kb3csIGlmIG5vdCBhbHJlYWR5IHZpc2libGUKKyAgICAgKiAobWF5IGJlIGRvbmUgYWxyZWFkeSBpbiBndWlfbWNoX3NldF9zaGVsbHNpemUpICovCisgICAgaWYgKCFJc1dpbmRvd1Zpc2libGUoc19od25kKSkKKwlTaG93V2luZG93KHNfaHduZCwgU1dfU0hPV0RFRkFVTFQpOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X3dpbnBvcyhpbnQgKngsIGludCAqeSkKK3sKKyAgICBSRUNUICAgIHJlY3Q7CisKKyAgICBHZXRXaW5kb3dSZWN0KHNfaHduZCwgJnJlY3QpOworICAgICp4ID0gcmVjdC5sZWZ0OworICAgICp5ID0gcmVjdC50b3A7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3cgdG8gdGhlIGdpdmVuCisgKiBjb29yZGluYXRlcy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCit7CisgICAgU2V0V2luZG93UG9zKHNfaHduZCwgTlVMTCwgeCwgeSwgMCwgMCwKKwkJIFNXUF9OT1pPUkRFUiB8IFNXUF9OT1NJWkUgfCBTV1BfTk9BQ1RJVkFURSk7Cit9CisgICAgdm9pZAorZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBzdGF0aWMgaW50IG9sZHggPSAwOworICAgIHN0YXRpYyBpbnQgb2xkeSA9IDA7CisKKyAgICBTZXRXaW5kb3dQb3Moc190ZXh0QXJlYSwgTlVMTCwgeCwgeSwgdywgaCwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUpOworCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgaWYgKHZpbV9zdHJjaHIocF9nbywgR09fVE9PTEJBUikgIT0gTlVMTCkKKwlTZW5kTWVzc2FnZShzX3Rvb2xiYXJod25kLCBXTV9TSVpFLAorCQkoV1BBUkFNKTAsIChMUEFSQU0pKHcgKyAoKGxvbmcpKFRPT0xCQVJfQlVUVE9OX0hFSUdIVCs4KTw8MTYpKSk7CisjZW5kaWYKKyAgICAvKiBXaGVuIHNpZGUgc2Nyb2xsIGJhciBpcyB1bnNob3duLCB0aGUgc2l6ZSBvZiB3aW5kb3cgd2lsbCBjaGFuZ2UuCisgICAgICogdGhlbiwgdGhlIHRleHQgYXJlYSBtb3ZlIGxlZnQgb3IgcmlnaHQuIHRodXMgY2xpZW50IHJlY3Qgc2hvdWxkIGJlCisgICAgICogZm9yY2VseSByZWRyYXcuIChZYXN1aGlybyBNYXRzdW1vdG8pICovCisgICAgaWYgKG9sZHggIT0geCB8fCBvbGR5ICE9IHkpCisgICAgeworCUludmFsaWRhdGVSZWN0KHNfaHduZCwgTlVMTCwgRkFMU0UpOworCW9sZHggPSB4OworCW9sZHkgPSB5OworICAgIH0KKworfQorCisKKy8qCisgKiBTY3JvbGxiYXIgc3R1ZmY6CisgKi8KKworICAgIHZvaWQKK2d1aV9tY2hfZW5hYmxlX3Njcm9sbGJhcigKKyAgICBzY3JvbGxiYXJfVCAgICAgKnNiLAorICAgIGludAkJICAgIGZsYWcpCit7CisgICAgU2hvd1Njcm9sbEJhcihzYi0+aWQsIFNCX0NUTCwgZmxhZyk7CisKKyAgICAvKiBUT0RPOiBXaGVuIHRoZSB3aW5kb3cgaXMgbWF4aW1pemVkLCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IHN0YXlzIHRoZQorICAgICAqIHNhbWUsIHRodXMgdGhlIHNpemUgb2YgdGhlIHRleHQgYXJlYSBjaGFuZ2VzLiAgT24gV2luOTggaXQncyBPSywgb24gV2luCisgICAgICogTlQgNC4wIGl0J3Mgbm90Li4uICovCit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zKAorICAgIHNjcm9sbGJhcl9UICpzYiwKKyAgICBpbnQJCXgsCisgICAgaW50CQl5LAorICAgIGludAkJdywKKyAgICBpbnQJCWgpCit7CisgICAgU2V0V2luZG93UG9zKHNiLT5pZCwgTlVMTCwgeCwgeSwgdywgaCwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfU0hPV1dJTkRPVyk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoCisgICAgc2Nyb2xsYmFyX1QgKnNiLAorICAgIGludAkJb3JpZW50KQkvKiBTQkFSX1ZFUlQgb3IgU0JBUl9IT1JJWiAqLworeworICAgIHNiLT5pZCA9IENyZWF0ZVdpbmRvdygKKwkiU0NST0xMQkFSIiwgIlNjcm9sbGJhciIsCisJV1NfQ0hJTEQgfCAoKG9yaWVudCA9PSBTQkFSX1ZFUlQpID8gU0JTX1ZFUlQgOiBTQlNfSE9SWiksIDAsIDAsCisJMTAsCQkJCS8qIEFueSB2YWx1ZSB3aWxsIGRvIGZvciBub3cgKi8KKwkxMCwJCQkJLyogQW55IHZhbHVlIHdpbGwgZG8gZm9yIG5vdyAqLworCXNfaHduZCwgTlVMTCwKKwlzX2hpbnN0LCBOVUxMKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHNjcm9sbGJhciB3aXRoIHRoZSBnaXZlbiBod25kLgorICovCisJIHN0YXRpYyBzY3JvbGxiYXJfVCAqCitndWlfbXN3aW5fZmluZF9zY3JvbGxiYXIoSFdORCBod25kKQoreworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChndWkuYm90dG9tX3NiYXIuaWQgPT0gaHduZCkKKwlyZXR1cm4gJmd1aS5ib3R0b21fc2JhcjsKKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0uaWQgPT0gaHduZCkKKwkgICAgcmV0dXJuICZ3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF07CisJaWYgKHdwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0uaWQgPT0gaHduZCkKKwkgICAgcmV0dXJuICZ3cC0+d19zY3JvbGxiYXJzW1NCQVJfUklHSFRdOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdldCB0aGUgY2hhcmFjdGVyIHNpemUgb2YgYSBmb250LgorICovCisgICAgc3RhdGljIHZvaWQKK0dldEZvbnRTaXplKEd1aUZvbnQgZm9udCkKK3sKKyAgICBIV05EICAgIGh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CisgICAgSERDCSAgICBoZGMgPSBHZXRXaW5kb3dEQyhod25kKTsKKyAgICBIRk9OVCAgIGhmbnRPbGQgPSBTZWxlY3RGb250KGhkYywgKEhGT05UKWZvbnQpOworICAgIFRFWFRNRVRSSUMgdG07CisKKyAgICBHZXRUZXh0TWV0cmljcyhoZGMsICZ0bSk7CisgICAgZ3VpLmNoYXJfd2lkdGggPSB0bS50bUF2ZUNoYXJXaWR0aCArIHRtLnRtT3Zlcmhhbmc7CisKKyAgICBndWkuY2hhcl9oZWlnaHQgPSB0bS50bUhlaWdodAorI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisJKyBwX2xpbmVzcGFjZQorI2VuZGlmCisJOworCisgICAgU2VsZWN0Rm9udChoZGMsIGhmbnRPbGQpOworCisgICAgUmVsZWFzZURDKGh3bmQsIGhkYyk7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfYWRqdXN0X2NoYXJzaXplKHZvaWQpCit7CisgICAgR2V0Rm9udFNpemUoZ3VpLm5vcm1fZm9udCk7CisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIEd1aUZvbnQKK2dldF9mb250X2hhbmRsZShMT0dGT05UICpsZikKK3sKKyAgICBIRk9OVCAgIGZvbnQgPSBOVUxMOworCisgICAgLyogTG9hZCB0aGUgZm9udCAqLworICAgIGZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QobGYpOworCisgICAgaWYgKGZvbnQgPT0gTlVMTCkKKwlyZXR1cm4gTk9GT05UOworCisgICAgcmV0dXJuIChHdWlGb250KWZvbnQ7Cit9CisKKyAgICBzdGF0aWMgaW50CitwaXhlbHNfdG9fcG9pbnRzKGludCBwaXhlbHMsIGludCB2ZXJ0aWNhbCkKK3sKKyAgICBpbnQJCXBvaW50czsKKyAgICBIV05ECWh3bmQ7CisgICAgSERDCQloZGM7CisKKyAgICBod25kID0gR2V0RGVza3RvcFdpbmRvdygpOworICAgIGhkYyA9IEdldFdpbmRvd0RDKGh3bmQpOworCisgICAgcG9pbnRzID0gTXVsRGl2KHBpeGVscywgNzIsCisJCSAgICBHZXREZXZpY2VDYXBzKGhkYywgdmVydGljYWwgPyBMT0dQSVhFTFNZIDogTE9HUElYRUxTWCkpOworCisgICAgUmVsZWFzZURDKGh3bmQsIGhkYyk7CisKKyAgICByZXR1cm4gcG9pbnRzOworfQorCisgICAgR3VpRm9udAorZ3VpX21jaF9nZXRfZm9udCgKKyAgICBjaGFyX3UJKm5hbWUsCisgICAgaW50CQlnaXZlRXJyb3JJZk1pc3NpbmcpCit7CisgICAgTE9HRk9OVAlsZjsKKyAgICBHdWlGb250CWZvbnQ7CisKKyAgICBnZXRfbG9nZm9udCgmbGYsIG5hbWUsIE5VTEwpOworICAgIGZvbnQgPSBnZXRfZm9udF9oYW5kbGUoJmxmKTsKKyAgICBpZiAoZm9udCA9PSBOT0ZPTlQgJiYgZ2l2ZUVycm9ySWZNaXNzaW5nKQorCUVNU0cyKF8oZV9mb250KSwgbmFtZSk7CisgICAgcmV0dXJuIGZvbnQ7Cit9CisgICAgdm9pZAorZ3VpX21jaF9mcmVlX2ZvbnQoR3VpRm9udCBmb250KQoreworICAgIGlmIChmb250KQorCURlbGV0ZU9iamVjdCgoSEZPTlQpZm9udCk7Cit9CisKKyAgICBzdGF0aWMgaW50CitoZXhfZGlnaXQoaW50IGMpCit7CisgICAgaWYgKFZJTV9JU0RJR0lUKGMpKQorCXJldHVybiBjIC0gJzAnOworICAgIGMgPSBUT0xPV0VSX0FTQyhjKTsKKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJcmV0dXJuIGMgLSAnYScgKyAxMDsKKyAgICByZXR1cm4gLTEwMDA7Cit9CisvKgorICogUmV0dXJuIHRoZSBQaXhlbCB2YWx1ZSAoY29sb3IpIGZvciB0aGUgZ2l2ZW4gY29sb3IgbmFtZS4KKyAqIFJldHVybiBJTlZBTENPTE9SIGZvciBlcnJvci4KKyAqLworICAgIGd1aWNvbG9yX1QKK2d1aV9tY2hfZ2V0X2NvbG9yKGNoYXJfdSAqbmFtZSkKK3sKKyAgICB0eXBlZGVmIHN0cnVjdCBndWljb2xvcl90VGFibGUKKyAgICB7CisJY2hhcgkgICAgKm5hbWU7CisJQ09MT1JSRUYgICAgY29sb3I7CisgICAgfSBndWljb2xvcl90VGFibGU7CisKKyAgICBzdGF0aWMgZ3VpY29sb3JfdFRhYmxlIHRhYmxlW10gPQorICAgIHsKKwl7IkJsYWNrIiwJCVJHQigweDAwLCAweDAwLCAweDAwKX0sCisJeyJEYXJrR3JheSIsCQlSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LAorCXsiRGFya0dyZXkiLAkJUkdCKDB4ODAsIDB4ODAsIDB4ODApfSwKKwl7IkdyYXkiLAkJUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkdyZXkiLAkJUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwKKwl7IkxpZ2h0R3JheSIsCQlSR0IoMHhFMCwgMHhFMCwgMHhFMCl9LAorCXsiTGlnaHRHcmV5IiwJCVJHQigweEUwLCAweEUwLCAweEUwKX0sCisJeyJXaGl0ZSIsCQlSR0IoMHhGRiwgMHhGRiwgMHhGRil9LAorCXsiRGFya1JlZCIsCQlSR0IoMHg4MCwgMHgwMCwgMHgwMCl9LAorCXsiUmVkIiwJCQlSR0IoMHhGRiwgMHgwMCwgMHgwMCl9LAorCXsiTGlnaHRSZWQiLAkJUkdCKDB4RkYsIDB4QTAsIDB4QTApfSwKKwl7IkRhcmtCbHVlIiwJCVJHQigweDAwLCAweDAwLCAweDgwKX0sCisJeyJCbHVlIiwJCVJHQigweDAwLCAweDAwLCAweEZGKX0sCisJeyJMaWdodEJsdWUiLAkJUkdCKDB4QTAsIDB4QTAsIDB4RkYpfSwKKwl7IkRhcmtHcmVlbiIsCQlSR0IoMHgwMCwgMHg4MCwgMHgwMCl9LAorCXsiR3JlZW4iLAkJUkdCKDB4MDAsIDB4RkYsIDB4MDApfSwKKwl7IkxpZ2h0R3JlZW4iLAkJUkdCKDB4QTAsIDB4RkYsIDB4QTApfSwKKwl7IkRhcmtDeWFuIiwJCVJHQigweDAwLCAweDgwLCAweDgwKX0sCisJeyJDeWFuIiwJCVJHQigweDAwLCAweEZGLCAweEZGKX0sCisJeyJMaWdodEN5YW4iLAkJUkdCKDB4QTAsIDB4RkYsIDB4RkYpfSwKKwl7IkRhcmtNYWdlbnRhIiwJCVJHQigweDgwLCAweDAwLCAweDgwKX0sCisJeyJNYWdlbnRhIiwJCVJHQigweEZGLCAweDAwLCAweEZGKX0sCisJeyJMaWdodE1hZ2VudGEiLAlSR0IoMHhGRiwgMHhBMCwgMHhGRil9LAorCXsiQnJvd24iLAkJUkdCKDB4ODAsIDB4NDAsIDB4NDApfSwKKwl7IlllbGxvdyIsCQlSR0IoMHhGRiwgMHhGRiwgMHgwMCl9LAorCXsiTGlnaHRZZWxsb3ciLAkJUkdCKDB4RkYsIDB4RkYsIDB4QTApfSwKKwl7IkRhcmtZZWxsb3ciLAkJUkdCKDB4QkIsIDB4QkIsIDB4MDApfSwKKwl7IlNlYUdyZWVuIiwJCVJHQigweDJFLCAweDhCLCAweDU3KX0sCisJeyJPcmFuZ2UiLAkJUkdCKDB4RkYsIDB4QTUsIDB4MDApfSwKKwl7IlB1cnBsZSIsCQlSR0IoMHhBMCwgMHgyMCwgMHhGMCl9LAorCXsiU2xhdGVCbHVlIiwJCVJHQigweDZBLCAweDVBLCAweENEKX0sCisJeyJWaW9sZXQiLAkJUkdCKDB4RUUsIDB4ODIsIDB4RUUpfSwKKyAgICB9OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgU3lzQ29sb3JUYWJsZQorICAgIHsKKwljaGFyCSAgICAqbmFtZTsKKwlpbnQJICAgIGNvbG9yOworICAgIH0gU3lzQ29sb3JUYWJsZTsKKworICAgIHN0YXRpYyBTeXNDb2xvclRhYmxlIHN5c190YWJsZVtdID0KKyAgICB7CisjaWZkZWYgV0lOMzI2NAorCXsiU1lTXzNEREtTSEFET1ciLCBDT0xPUl8zRERLU0hBRE9XfSwKKwl7IlNZU18zREhJTElHSFQiLCBDT0xPUl8zREhJTElHSFR9LAorI2lmbmRlZiBfX01JTkdXMzJfXworCXsiU1lTXzNESElHSExJR0hUIiwgQ09MT1JfM0RISUdITElHSFR9LAorI2VuZGlmCisJeyJTWVNfQlROSElMSUdIVCIsIENPTE9SX0JUTkhJTElHSFR9LAorCXsiU1lTX0JUTkhJR0hMSUdIVCIsIENPTE9SX0JUTkhJR0hMSUdIVH0sCisJeyJTWVNfM0RMSUdIVCIsIENPTE9SXzNETElHSFR9LAorCXsiU1lTXzNEU0hBRE9XIiwgQ09MT1JfM0RTSEFET1d9LAorCXsiU1lTX0RFU0tUT1AiLCBDT0xPUl9ERVNLVE9QfSwKKwl7IlNZU19JTkZPQksiLCBDT0xPUl9JTkZPQkt9LAorCXsiU1lTX0lORk9URVhUIiwgQ09MT1JfSU5GT1RFWFR9LAorCXsiU1lTXzNERkFDRSIsIENPTE9SXzNERkFDRX0sCisjZW5kaWYKKwl7IlNZU19CVE5GQUNFIiwgQ09MT1JfQlRORkFDRX0sCisJeyJTWVNfQlROU0hBRE9XIiwgQ09MT1JfQlROU0hBRE9XfSwKKwl7IlNZU19BQ1RJVkVCT1JERVIiLCBDT0xPUl9BQ1RJVkVCT1JERVJ9LAorCXsiU1lTX0FDVElWRUNBUFRJT04iLCBDT0xPUl9BQ1RJVkVDQVBUSU9OfSwKKwl7IlNZU19BUFBXT1JLU1BBQ0UiLCBDT0xPUl9BUFBXT1JLU1BBQ0V9LAorCXsiU1lTX0JBQ0tHUk9VTkQiLCBDT0xPUl9CQUNLR1JPVU5EfSwKKwl7IlNZU19CVE5URVhUIiwgQ09MT1JfQlROVEVYVH0sCisJeyJTWVNfQ0FQVElPTlRFWFQiLCBDT0xPUl9DQVBUSU9OVEVYVH0sCisJeyJTWVNfR1JBWVRFWFQiLCBDT0xPUl9HUkFZVEVYVH0sCisJeyJTWVNfSElHSExJR0hUIiwgQ09MT1JfSElHSExJR0hUfSwKKwl7IlNZU19ISUdITElHSFRURVhUIiwgQ09MT1JfSElHSExJR0hUVEVYVH0sCisJeyJTWVNfSU5BQ1RJVkVCT1JERVIiLCBDT0xPUl9JTkFDVElWRUJPUkRFUn0sCisJeyJTWVNfSU5BQ1RJVkVDQVBUSU9OIiwgQ09MT1JfSU5BQ1RJVkVDQVBUSU9OfSwKKwl7IlNZU19JTkFDVElWRUNBUFRJT05URVhUIiwgQ09MT1JfSU5BQ1RJVkVDQVBUSU9OVEVYVH0sCisJeyJTWVNfTUVOVSIsIENPTE9SX01FTlV9LAorCXsiU1lTX01FTlVURVhUIiwgQ09MT1JfTUVOVVRFWFR9LAorCXsiU1lTX1NDUk9MTEJBUiIsIENPTE9SX1NDUk9MTEJBUn0sCisJeyJTWVNfV0lORE9XIiwgQ09MT1JfV0lORE9XfSwKKwl7IlNZU19XSU5ET1dGUkFNRSIsIENPTE9SX1dJTkRPV0ZSQU1FfSwKKwl7IlNZU19XSU5ET1dURVhUIiwgQ09MT1JfV0lORE9XVEVYVH0KKyAgICB9OworCisgICAgaW50CQkgICAgciwgZywgYjsKKyAgICBpbnQJCSAgICBpOworCisgICAgaWYgKG5hbWVbMF0gPT0gJyMnICYmIHN0cmxlbihuYW1lKSA9PSA3KQorICAgIHsKKwkvKiBOYW1lIGlzIGluICIjcnJnZ2JiIiBmb3JtYXQgKi8KKwlyID0gaGV4X2RpZ2l0KG5hbWVbMV0pICogMTYgKyBoZXhfZGlnaXQobmFtZVsyXSk7CisJZyA9IGhleF9kaWdpdChuYW1lWzNdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNF0pOworCWIgPSBoZXhfZGlnaXQobmFtZVs1XSkgKiAxNiArIGhleF9kaWdpdChuYW1lWzZdKTsKKwlpZiAociA8IDAgfHwgZyA8IDAgfHwgYiA8IDApCisJICAgIHJldHVybiBJTlZBTENPTE9SOworCXJldHVybiBSR0IociwgZywgYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogQ2hlY2sgaWYgdGhlIG5hbWUgaXMgb25lIG9mIHRoZSBjb2xvcnMgd2Uga25vdyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGFibGUpIC8gc2l6ZW9mKHRhYmxlWzBdKTsgaSsrKQorCSAgICBpZiAoU1RSSUNNUChuYW1lLCB0YWJsZVtpXS5uYW1lKSA9PSAwKQorCQlyZXR1cm4gdGFibGVbaV0uY29sb3I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcnkgdG8gbG9vayB1cCBhIHN5c3RlbSBjb2xvdXIuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzeXNfdGFibGUpIC8gc2l6ZW9mKHN5c190YWJsZVswXSk7IGkrKykKKwlpZiAoU1RSSUNNUChuYW1lLCBzeXNfdGFibGVbaV0ubmFtZSkgPT0gMCkKKwkgICAgcmV0dXJuIEdldFN5c0NvbG9yKHN5c190YWJsZVtpXS5jb2xvcik7CisKKyAgICAvKgorICAgICAqIExhc3QgYXR0ZW1wdC4gTG9vayBpbiB0aGUgZmlsZSAiJFZJTVJVTlRJTUUvcmdiLnR4dCIuCisgICAgICovCisgICAgeworI2RlZmluZSBMSU5FX0xFTiAxMDAKKwlGSUxFCSpmZDsKKwljaGFyCWxpbmVbTElORV9MRU5dOworCWNoYXJfdQkqZm5hbWU7CisKKwlmbmFtZSA9IGV4cGFuZF9lbnZfc2F2ZSgoY2hhcl91ICopIiRWSU1SVU5USU1FL3JnYi50eHQiKTsKKwlpZiAoZm5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisKKwlmZCA9IGZvcGVuKChjaGFyICopZm5hbWUsICJydCIpOworCXZpbV9mcmVlKGZuYW1lKTsKKwlpZiAoZmQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIElOVkFMQ09MT1I7CisKKwl3aGlsZSAoIWZlb2YoZmQpKQorCXsKKwkgICAgaW50CSAgICBsZW47CisJICAgIGludAkgICAgcG9zOworCSAgICBjaGFyICAgICpjb2xvcjsKKworCSAgICBmZ2V0cyhsaW5lLCBMSU5FX0xFTiwgZmQpOworCSAgICBsZW4gPSAoaW50KVNUUkxFTihsaW5lKTsKKworCSAgICBpZiAobGVuIDw9IDEgfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJY29udGludWU7CisKKwkgICAgbGluZVtsZW4tMV0gPSAnXDAnOworCisJICAgIGkgPSBzc2NhbmYobGluZSwgIiVkICVkICVkICVuIiwgJnIsICZnLCAmYiwgJnBvcyk7CisJICAgIGlmIChpICE9IDMpCisJCWNvbnRpbnVlOworCisJICAgIGNvbG9yID0gbGluZSArIHBvczsKKworCSAgICBpZiAoU1RSSUNNUChjb2xvciwgbmFtZSkgPT0gMCkKKwkgICAgeworCQlmY2xvc2UoZmQpOworCQlyZXR1cm4gKGd1aWNvbG9yX1QpIFJHQihyLCBnLCBiKTsKKwkgICAgfQorCX0KKworCWZjbG9zZShmZCk7CisgICAgfQorCisgICAgcmV0dXJuIElOVkFMQ09MT1I7Cit9CisvKgorICogUmV0dXJuIE9LIGlmIHRoZSBrZXkgd2l0aCB0aGUgdGVybWNhcCBuYW1lICJuYW1lIiBpcyBzdXBwb3J0ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaGFza2V5KGNoYXJfdSAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEgIT0gTlVMOyBpKyspCisJaWYgKG5hbWVbMF0gPT0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMCAmJgorCQkJCQkgbmFtZVsxXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxKQorCSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2JlZXAodm9pZCkKK3sKKyAgICBNZXNzYWdlQmVlcChNQl9PSyk7Cit9CisvKgorICogSW52ZXJ0IGEgcmVjdGFuZ2xlIGZyb20gcm93IHIsIGNvbHVtbiBjLCBmb3IgbnIgcm93cyBhbmQgbmMgY29sdW1ucy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZSgKKyAgICBpbnQJICAgIHIsCisgICAgaW50CSAgICBjLAorICAgIGludAkgICAgbnIsCisgICAgaW50CSAgICBuYykKK3sKKyAgICBSRUNUICAgIHJjOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBJbnZlcnRSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCisgICAgICovCisgICAgcmMubGVmdCA9IEZJTExfWChjKTsKKyAgICByYy50b3AgPSBGSUxMX1kocik7CisgICAgcmMucmlnaHQgPSByYy5sZWZ0ICsgbmMgKiBndWkuY2hhcl93aWR0aDsKKyAgICByYy5ib3R0b20gPSByYy50b3AgKyBuciAqIGd1aS5jaGFyX2hlaWdodDsKKyAgICBJbnZlcnRSZWN0KHNfaGRjLCAmcmMpOworfQorCisvKgorICogSWNvbmlmeSB0aGUgR1VJIHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaWNvbmlmeSh2b2lkKQoreworICAgIFNob3dXaW5kb3coc19od25kLCBTV19NSU5JTUlaRSk7Cit9CisKKy8qCisgKiBEcmF3IGEgY3Vyc29yIHdpdGhvdXQgZm9jdXMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RyYXdfaG9sbG93X2N1cnNvcihndWljb2xvcl9UIGNvbG9yKQoreworICAgIEhCUlVTSCAgaGJyOworICAgIFJFQ1QgICAgcmM7CisKKyAgICAvKgorICAgICAqIE5vdGU6IEZyYW1lUmVjdCgpIGV4Y2x1ZGVzIHJpZ2h0IGFuZCBib3R0b20gb2YgcmVjdGFuZ2xlLgorICAgICAqLworICAgIHJjLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCk7CisgICAgcmMudG9wID0gRklMTF9ZKGd1aS5yb3cpOworICAgIHJjLnJpZ2h0ID0gcmMubGVmdCArIGd1aS5jaGFyX3dpZHRoOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAobWJfbGVmdGhhbHZlKGd1aS5yb3csIGd1aS5jb2wpKQorCXJjLnJpZ2h0ICs9IGd1aS5jaGFyX3dpZHRoOworI2VuZGlmCisgICAgcmMuYm90dG9tID0gcmMudG9wICsgZ3VpLmNoYXJfaGVpZ2h0OworICAgIGhiciA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3IpOworICAgIEZyYW1lUmVjdChzX2hkYywgJnJjLCBoYnIpOworICAgIERlbGV0ZUJydXNoKGhicik7Cit9CisvKgorICogRHJhdyBwYXJ0IG9mIGEgY3Vyc29yLCAidyIgcGl4ZWxzIHdpZGUsIGFuZCAiaCIgcGl4ZWxzIGhpZ2gsIHVzaW5nCisgKiBjb2xvciAiY29sb3IiLgorICovCisgICAgdm9pZAorZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKAorICAgIGludAkJdywKKyAgICBpbnQJCWgsCisgICAgZ3VpY29sb3JfVAljb2xvcikKK3sKKyAgICBIQlJVU0gJaGJyOworICAgIFJFQ1QJcmM7CisKKyAgICAvKgorICAgICAqIE5vdGU6IEZpbGxSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCisgICAgICovCisgICAgcmMubGVmdCA9CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJLyogdmVydGljYWwgbGluZSBzaG91bGQgYmUgb24gdGhlIHJpZ2h0IG9mIGN1cnJlbnQgcG9pbnQgKi8KKwkJQ1VSU09SX0JBUl9SSUdIVCA/IEZJTExfWChndWkuY29sICsgMSkgLSB3IDoKKyNlbmRpZgorCQkgICAgRklMTF9YKGd1aS5jb2wpOworICAgIHJjLnRvcCA9IEZJTExfWShndWkucm93KSArIGd1aS5jaGFyX2hlaWdodCAtIGg7CisgICAgcmMucmlnaHQgPSByYy5sZWZ0ICsgdzsKKyAgICByYy5ib3R0b20gPSByYy50b3AgKyBoOworICAgIGhiciA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3IpOworICAgIEZpbGxSZWN0KHNfaGRjLCAmcmMsIGhicik7CisgICAgRGVsZXRlQnJ1c2goaGJyKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBzaW5nbGUgV2luZG93cyBtZXNzYWdlLgorICogSWYgb25lIGlzIG5vdCBhdmFpbGFibGUgd2UgaGFuZyB1bnRpbCBvbmUgaXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJvY2Vzc19tZXNzYWdlKHZvaWQpCit7CisgICAgTVNHCQltc2c7CisgICAgVUlOVAl2ayA9IDA7CQkvKiBWaXJ0dWFsIGtleSAqLworICAgIGNoYXJfdQlzdHJpbmdbNDBdOworICAgIGludAkJaTsKKyAgICBpbnQJCW1vZGlmaWVycyA9IDA7CisgICAgaW50CQlrZXk7CisKKyAgICBHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApOworCisjaWZkZWYgRkVBVF9PTEUKKyAgICAvKiBMb29rIGFmdGVyIE9MRSBBdXRvbWF0aW9uIGNvbW1hbmRzICovCisgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX09MRSkKKyAgICB7CisJY2hhcl91ICpzdHIgPSAoY2hhcl91ICopbXNnLmxQYXJhbTsKKwlhZGRfdG9faW5wdXRfYnVmKHN0ciwgKGludClTVFJMRU4oc3RyKSk7CisJdmltX2ZyZWUoc3RyKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBpZiAobXNnLm1lc3NhZ2UgPT0gV01fTkVUQkVBTlMpCisgICAgeworCW1lc3NhZ2VGcm9tTmV0YmVhbnNXMzIoKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgaWYgKHNuaWZmX3JlcXVlc3Rfd2FpdGluZyAmJiB3YW50X3NuaWZmX3JlcXVlc3QpCisgICAgeworCXN0YXRpYyBjaGFyX3UgYnl0ZXNbM10gPSB7Q1NJLCAoY2hhcl91KUtTX0VYVFJBLCAoY2hhcl91KUtFX1NOSUZGfTsKKwlhZGRfdG9faW5wdXRfYnVmKGJ5dGVzLCAzKTsgLyogS19TTklGRiAqLworCXNuaWZmX3JlcXVlc3Rfd2FpdGluZyA9IDA7CisJd2FudF9zbmlmZl9yZXF1ZXN0ID0gMDsKKwkvKiByZXF1ZXN0IGlzIGhhbmRsZWQgaW4gbm9ybWFsLmMgKi8KKyAgICB9CisgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX1VTRVIpCisJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBNU1dJTl9GSU5EX1JFUExBQ0UKKyAgICAvKiBEb24ndCBwcm9jZXNzIG1lc3NhZ2VzIHVzZWQgYnkgdGhlIGRpYWxvZyAqLworICAgIGlmIChzX2ZpbmRyZXBfaHduZCAhPSBOVUxMICYmIElzRGlhbG9nTWVzc2FnZShzX2ZpbmRyZXBfaHduZCwgJm1zZykpCisgICAgeworCUhhbmRsZU1vdXNlSGlkZShtc2cubWVzc2FnZSwgbXNnLmxQYXJhbSk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCdzIGEgc3BlY2lhbCBrZXkgdGhhdCB3ZSByZWNvZ25pc2UuICBJZiBub3QsIGNhbGwKKyAgICAgKiBUcmFuc2xhdGVNZXNzYWdlKCkuCisgICAgICovCisgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04gfHwgbXNnLm1lc3NhZ2UgPT0gV01fU1lTS0VZRE9XTikKKyAgICB7CisJdmsgPSAoaW50KSBtc2cud1BhcmFtOworCS8qIGhhbmRsZSBrZXkgYWZ0ZXIgZGVhZCBrZXksIGJ1dCBpZ25vcmUgc2hpZnQsIGFsdCBhbmQgY29udHJvbCAqLworCWlmIChkZWFkX2tleSAmJiB2ayAhPSBWS19TSElGVCAmJiB2ayAhPSBWS19NRU5VICYmIHZrICE9IFZLX0NPTlRST0wpCisJeworCSAgICBkZWFkX2tleSA9IDA7CisJICAgIC8qIGhhbmRsZSBub24tYWxwaGFiZXRpYyBrZXlzIChvbmVzIHRoYXQgaG9wZWZ1bGx5IGNhbm5vdCBnZW5lcmF0ZQorCSAgICAgKiB1bWxhdXQtY2hhcmFjdGVycyksIHVubGVzcyB3aGVuIGNvbnRyb2wgaXMgZG93biAqLworCSAgICBpZiAodmsgPCAnQScgfHwgdmsgPiAnWicgfHwgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwKSkKKwkgICAgeworCQlNU0cgZG07CisKKwkJZG0ubWVzc2FnZSA9IG1zZy5tZXNzYWdlOworCQlkbS5od25kID0gbXNnLmh3bmQ7CisJCWRtLndQYXJhbSA9IFZLX1NQQUNFOworCQlNeVRyYW5zbGF0ZU1lc3NhZ2UoJmRtKTsJLyogZ2VuZXJhdGUgZGVhZCBjaGFyYWN0ZXIgKi8KKwkJaWYgKHZrICE9IFZLX1NQQUNFKSAvKiBhbmQgc2VuZCBjdXJyZW50IGNoYXJhY3RlciBvbmNlIG1vcmUgKi8KKwkJICAgIFBvc3RNZXNzYWdlKG1zZy5od25kLCBtc2cubWVzc2FnZSwgbXNnLndQYXJhbSwgbXNnLmxQYXJhbSk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKworCS8qIENoZWNrIGZvciBDVFJMLUJSRUFLICovCisJaWYgKHZrID09IFZLX0NBTkNFTCkKKwl7CisJICAgIHRyYXNoX2lucHV0X2J1ZigpOworCSAgICBnb3RfaW50ID0gVFJVRTsKKwkgICAgc3RyaW5nWzBdID0gQ3RybF9DOworCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMSk7CisJfQorCisJZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gMDsgaSsrKQorCXsKKwkgICAgLyogaWdub3JlIFZLX1NQQUNFIHdoZW4gQUxUIGtleSBwcmVzc2VkOiBzeXN0ZW0gbWVudSAqLworCSAgICBpZiAoc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0gdmsKKwkJICAgICYmICh2ayAhPSBWS19TUEFDRSB8fCAhKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKSkpCisJICAgIHsKKyNpZmRlZiBGRUFUX01FTlUKKwkJLyogQ2hlY2sgZm9yIDxGMTA+OiBXaW5kb3dzIHNlbGVjdHMgdGhlIG1lbnUuICBJZ25vcmUgaXQgd2hlbgorCQkgKiAnd2luYWx0a2V5cycgaXMgInllcyIgb3IgIm1lbnUiICovCisJCWlmICh2ayA9PSBWS19GMTAKKwkJCSYmIGd1aS5tZW51X2lzX2FjdGl2ZQorCQkJJiYgKCpwX3dhayA9PSAneScgfHwgKnBfd2FrID09ICdtJykpCisJCSAgICBicmVhazsKKyNlbmRpZgorCQlpZiAoR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwKQorCQkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCQkvKgorCQkgKiBEb24ndCB1c2UgY2Fwcy1sb2NrIGFzIHNoaWZ0LCBiZWNhdXNlIHRoZXNlIGFyZSBzcGVjaWFsIGtleXMKKwkJICogYmVpbmcgY29uc2lkZXJlZCBoZXJlLCBhbmQgd2Ugb25seSB3YW50IGxldHRlcnMgdG8gZ2V0CisJCSAqIHNoaWZ0ZWQgLS0gd2ViYgorCQkgKi8KKwkJLyoKKwkJaWYgKEdldEtleVN0YXRlKFZLX0NBUElUQUwpICYgMHgwMDAxKQorCQkgICAgbW9kaWZpZXJzIF49IE1PRF9NQVNLX1NISUZUOworCQkqLworCQlpZiAoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDApCisJCSAgICBtb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKKwkJaWYgKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKQorCQkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0FMVDsKKworCQlpZiAoc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSA9PSBOVUwpCisJCSAgICBrZXkgPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwOworCQllbHNlCisJCSAgICBrZXkgPSBUT19TUEVDSUFMKHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTAsCisJCQkJCQkgICBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxKTsKKwkJa2V5ID0gc2ltcGxpZnlfa2V5KGtleSwgJm1vZGlmaWVycyk7CisJCWlmIChrZXkgPT0gQ1NJKQorCQkgICAga2V5ID0gS19DU0k7CisKKwkJaWYgKG1vZGlmaWVycykKKwkJeworCQkgICAgc3RyaW5nWzBdID0gQ1NJOworCQkgICAgc3RyaW5nWzFdID0gS1NfTU9ESUZJRVI7CisJCSAgICBzdHJpbmdbMl0gPSBtb2RpZmllcnM7CisJCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMyk7CisJCX0KKworCQlpZiAoSVNfU1BFQ0lBTChrZXkpKQorCQl7CisJCSAgICBzdHJpbmdbMF0gPSBDU0k7CisJCSAgICBzdHJpbmdbMV0gPSBLX1NFQ09ORChrZXkpOworCQkgICAgc3RyaW5nWzJdID0gS19USElSRChrZXkpOworCQkgICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcsIDMpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaW50CWxlbjsKKworCQkgICAgLyogSGFuZGxlICJrZXkiIGFzIGEgVW5pY29kZSBjaGFyYWN0ZXIuICovCisJCSAgICBsZW4gPSBjaGFyX3RvX3N0cmluZyhrZXksIHN0cmluZywgNDApOworCQkgICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcsIGxlbik7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltID09IDApCisJeworCSAgICAvKiBTb21lIGtleXMgbmVlZCBDLVMtIHdoZXJlIHRoZXkgc2hvdWxkIG9ubHkgbmVlZCBDLS4KKwkgICAgICogSWdub3JlIDB4ZmYsIFdpbmRvd3MgWFAgc2VuZHMgaXQgd2hlbiBOVU1MT0NLIGhhcyBjaGFuZ2VkIHNpbmNlCisJICAgICAqIHN5c3RlbSBzdGFydHVwIChIZWxtdXQgU3RpZWdsZXIsIDIwMDMgT2N0IDMpLiAqLworCSAgICBpZiAodmsgIT0gMHhmZgorCQkgICAgJiYgKEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYgMHg4MDAwKQorCQkgICAgJiYgIShHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApCisJCSAgICAmJiAhKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKSkKKwkgICAgeworCQkvKiBDVFJMLTYgaXMgJ14nOyBKYXBhbmVzZSBrZXlib2FyZCBtYXBzICdeJyB0byB2ayA9PSAweERFICovCisJCWlmICh2ayA9PSAnNicgfHwgTWFwVmlydHVhbEtleSh2aywgMikgPT0gKFVJTlQpJ14nKQorCQl7CisJCSAgICBzdHJpbmdbMF0gPSBDdHJsX0hBVDsKKwkJICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAxKTsKKwkJfQorCQkvKiB2ayA9PSAweEJEIEFaRVJUWSBmb3IgQ1RSTC0nLScsIGJ1dCBDVFJMLVsgZm9yICogUVdFUlRZISAqLworCQllbHNlIGlmICh2ayA9PSAweEJEKQkvKiBRV0VSVFkgZm9yIENUUkwtJy0nICovCisJCXsKKwkJICAgIHN0cmluZ1swXSA9IEN0cmxfXzsKKwkJICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCAxKTsKKwkJfQorCQkvKiBDVFJMLTIgaXMgJ0AnOyBKYXBhbmVzZSBrZXlib2FyZCBtYXBzICdAJyB0byB2ayA9PSAweEMwICovCisJCWVsc2UgaWYgKHZrID09ICcyJyB8fCBNYXBWaXJ0dWFsS2V5KHZrLCAyKSA9PSAoVUlOVCknQCcpCisJCXsKKwkJICAgIHN0cmluZ1swXSA9IEN0cmxfQVQ7CisJCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgMSk7CisJCX0KKwkJZWxzZQorCQkgICAgTXlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCSAgICB9CisJICAgIGVsc2UKKwkJTXlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCX0KKyAgICB9CisjaWZkZWYgRkVBVF9NQllURV9JTUUKKyAgICBlbHNlIGlmIChtc2cubWVzc2FnZSA9PSBXTV9JTUVfTk9USUZZKQorCV9PbkltZU5vdGlmeShtc2cuaHduZCwgKERXT1JEKW1zZy53UGFyYW0sIChEV09SRCltc2cubFBhcmFtKTsKKyAgICBlbHNlIGlmIChtc2cubWVzc2FnZSA9PSBXTV9LRVlVUCAmJiBpbV9nZXRfc3RhdHVzKCkpCisJLyogYWRkZWQgZm9yIG5vbi1NUyBJTUUgKFlhc3VoaXJvIE1hdHN1bW90bykgKi8KKwlNeVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChGRUFUX01CWVRFX0lNRSkgJiYgZGVmaW5lZChHTE9CQUxfSU1FKQorLyogR0lNRV9URVNUICovCisgICAgZWxzZSBpZiAobXNnLm1lc3NhZ2UgPT0gV01fSU1FX1NUQVJUQ09NUE9TSVRJT04pCisgICAgeworCVBPSU5UIHBvaW50OworCisJZ2xvYmFsX2ltZV9zZXRfZm9udCgmbm9ybV9sb2dmb250KTsKKwlwb2ludC54ID0gRklMTF9YKGd1aS5jb2wpOworCXBvaW50LnkgPSBGSUxMX1koZ3VpLnJvdyk7CisJTWFwV2luZG93UG9pbnRzKHNfdGV4dEFyZWEsIHNfaHduZCwgJnBvaW50LCAxKTsKKwlnbG9iYWxfaW1lX3NldF9wb3NpdGlvbigmcG9pbnQpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NRU5VCisgICAgLyogQ2hlY2sgZm9yIDxGMTA+OiBXaW5kb3dzIHNlbGVjdHMgdGhlIG1lbnUuICBEb24ndCBsZXQgV2luZG93cyBoYW5kbGUgaXQKKyAgICAgKiB3aGVuICd3aW5hbHRrZXlzJyBpcyAibm8iICovCisgICAgaWYgKHZrICE9IFZLX0YxMCB8fCAqcF93YWsgIT0gJ24nKQorI2VuZGlmCisJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworfQorCisvKgorICogQ2F0Y2ggdXAgd2l0aCBhbnkgcXVldWVkIGV2ZW50cy4gIFRoaXMgbWF5IHB1dCBrZXlib2FyZCBpbnB1dCBpbnRvIHRoZQorICogaW5wdXQgYnVmZmVyLCBjYWxsIHJlc2l6ZSBjYWxsLWJhY2tzLCB0cmlnZ2VyIHRpbWVycyBldGMuICBJZiB0aGVyZSBpcworICogbm90aGluZyBpbiB0aGUgZXZlbnQgcXVldWUgKCYgbm8gdGltZXJzIHBlbmRpbmcpLCB0aGVuIHdlIHJldHVybgorICogaW1tZWRpYXRlbHkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3VwZGF0ZSh2b2lkKQoreworICAgIE1TRwkgICAgbXNnOworCisgICAgaWYgKCFzX2J1c3lfcHJvY2Vzc2luZykKKwl3aGlsZSAoUGVla01lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fTk9SRU1PVkUpCisJCQkJCQkgICYmICF2aW1faXNfaW5wdXRfYnVmX2Z1bGwoKSkKKwkgICAgcHJvY2Vzc19tZXNzYWdlKCk7Cit9CisKKy8qCisgKiBHVUkgaW5wdXQgcm91dGluZSBjYWxsZWQgYnkgZ3VpX3dhaXRfZm9yX2NoYXJzKCkuICBXYWl0cyBmb3IgYSBjaGFyYWN0ZXIKKyAqIGZyb20gdGhlIGtleWJvYXJkLgorICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCisgKiAgd3RpbWUgPT0gMAkgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICogIHd0aW1lID4gMAkgICAgV2FpdCB3dGltZSBtaWxsaXNlY29uZHMgZm9yIGEgY2hhcmFjdGVyLgorICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKKyAqIG9yIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitndWlfbWNoX3dhaXRfZm9yX2NoYXJzKGludCB3dGltZSkKK3sKKyAgICBNU0cJCW1zZzsKKyAgICBpbnQJCWZvY3VzOworCisgICAgc190aW1lZF9vdXQgPSBGQUxTRTsKKworICAgIGlmICh3dGltZSA+IDApCisgICAgeworCS8qIERvbid0IGRvIGFueXRoaW5nIHdoaWxlIHByb2Nlc3NpbmcgYSAoc2Nyb2xsKSBtZXNzYWdlLiAqLworCWlmIChzX2J1c3lfcHJvY2Vzc2luZykKKwkgICAgcmV0dXJuIEZBSUw7CisJc193YWl0X3RpbWVyID0gKFVJTlQpU2V0VGltZXIoTlVMTCwgMCwgKFVJTlQpd3RpbWUsCisJCQkJCQkJIChUSU1FUlBST0MpX09uVGltZXIpOworICAgIH0KKworICAgIGFsbG93X3Njcm9sbGJhciA9IFRSVUU7CisKKyAgICBmb2N1cyA9IGd1aS5pbl9mb2N1czsKKyAgICB3aGlsZSAoIXNfdGltZWRfb3V0KQorICAgIHsKKwkvKiBTdG9wIG9yIHN0YXJ0IGJsaW5raW5nIHdoZW4gZm9jdXMgY2hhbmdlcyAqLworCWlmIChndWkuaW5fZm9jdXMgIT0gZm9jdXMpCisJeworCSAgICBpZiAoZ3VpLmluX2ZvY3VzKQorCQlndWlfbWNoX3N0YXJ0X2JsaW5rKCk7CisJICAgIGVsc2UKKwkJZ3VpX21jaF9zdG9wX2JsaW5rKCk7CisJICAgIGZvY3VzID0gZ3VpLmluX2ZvY3VzOworCX0KKworCWlmIChzX25lZWRfYWN0aXZhdGUpCisJeworI2lmZGVmIFdJTjMyCisJICAgICh2b2lkKVNldEZvcmVncm91bmRXaW5kb3coc19od25kKTsKKyNlbHNlCisJICAgICh2b2lkKVNldEFjdGl2ZVdpbmRvdyhzX2h3bmQpOworI2VuZGlmCisJICAgIHNfbmVlZF9hY3RpdmF0ZSA9IEZBTFNFOworCX0KKworCS8qCisJICogRG9uJ3QgdXNlIGd1aV9tY2hfdXBkYXRlKCkgYmVjYXVzZSB0aGVuIHdlIHdpbGwgc3Bpbi1sb2NrIHVudGlsIGEKKwkgKiBjaGFyIGFycml2ZXMsIGluc3RlYWQgd2UgdXNlIEdldE1lc3NhZ2UoKSB0byBoYW5nIHVudGlsIGFuCisJICogZXZlbnQgYXJyaXZlcy4gIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGlucHV0X2J1Zl9mdWxsIGJlY2F1c2Ugd2UgYXJlCisJICogcmV0dXJuaW5nIGFzIHNvb24gYXMgaXQgY29udGFpbnMgYSBzaW5nbGUgY2hhciAtLSB3ZWJiCisJICovCisJcHJvY2Vzc19tZXNzYWdlKCk7CisKKwlpZiAoaW5wdXRfYXZhaWxhYmxlKCkpCisJeworCSAgICBpZiAoc193YWl0X3RpbWVyICE9IDAgJiYgIXNfdGltZWRfb3V0KQorCSAgICB7CisJCUtpbGxUaW1lcihOVUxMLCBzX3dhaXRfdGltZXIpOworCisJCS8qIEVhdCBzcHVyaW91cyBXTV9USU1FUiBtZXNzYWdlcyAqLworCQl3aGlsZSAoUGVla01lc3NhZ2UoJm1zZywgc19od25kLCBXTV9USU1FUiwgV01fVElNRVIsIFBNX1JFTU9WRSkpCisJCSAgICA7CisJCXNfd2FpdF90aW1lciA9IDA7CisJICAgIH0KKwkgICAgYWxsb3dfc2Nyb2xsYmFyID0gRkFMU0U7CisJICAgIHJldHVybiBPSzsKKwl9CisgICAgfQorICAgIGFsbG93X3Njcm9sbGJhciA9IEZBTFNFOworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogQ2xlYXIgYSByZWN0YW5ndWxhciByZWdpb24gb2YgdGhlIHNjcmVlbiBmcm9tIHRleHQgcG9zIChyb3cxLCBjb2wxKSB0bworICogKHJvdzIsIGNvbDIpIGluY2x1c2l2ZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfY2xlYXJfYmxvY2soCisgICAgaW50CQlyb3cxLAorICAgIGludAkJY29sMSwKKyAgICBpbnQJCXJvdzIsCisgICAgaW50CQljb2wyKQoreworICAgIFJFQ1QJcmM7CisKKyAgICAvKgorICAgICAqIENsZWFyIG9uZSBleHRyYSBwaXhlbCBhdCB0aGUgZmFyIHJpZ2h0LCBmb3Igd2hlbiBib2xkIGNoYXJhY3RlcnMgaGF2ZQorICAgICAqIHNwaWxsZWQgb3ZlciB0byB0aGUgd2luZG93IGJvcmRlci4KKyAgICAgKiBOb3RlOiBGaWxsUmVjdCgpIGV4Y2x1ZGVzIHJpZ2h0IGFuZCBib3R0b20gb2YgcmVjdGFuZ2xlLgorICAgICAqLworICAgIHJjLmxlZnQgPSBGSUxMX1goY29sMSk7CisgICAgcmMudG9wID0gRklMTF9ZKHJvdzEpOworICAgIHJjLnJpZ2h0ID0gRklMTF9YKGNvbDIgKyAxKSArIChjb2wyID09IENvbHVtbnMgLSAxKTsKKyAgICByYy5ib3R0b20gPSBGSUxMX1kocm93MiArIDEpOworICAgIGNsZWFyX3JlY3QoJnJjKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB3aG9sZSB0ZXh0IHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfY2xlYXJfYWxsKHZvaWQpCit7CisgICAgUkVDVCAgICByYzsKKworICAgIHJjLmxlZnQgPSAwOworICAgIHJjLnRvcCA9IDA7CisgICAgcmMucmlnaHQgPSBDb2x1bW5zICogZ3VpLmNoYXJfd2lkdGggKyAyICogZ3VpLmJvcmRlcl93aWR0aDsKKyAgICByYy5ib3R0b20gPSBSb3dzICogZ3VpLmNoYXJfaGVpZ2h0ICsgMiAqIGd1aS5ib3JkZXJfd2lkdGg7CisgICAgY2xlYXJfcmVjdCgmcmMpOworfQorLyoKKyAqIE1lbnUgc3R1ZmYuCisgKi8KKworICAgIHZvaWQKK2d1aV9tY2hfZW5hYmxlX21lbnUoaW50IGZsYWcpCit7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgU2V0TWVudShzX2h3bmQsIGZsYWcgPyBzX21lbnVCYXIgOiBOVUxMKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfbWVudV9wb3MoCisgICAgaW50CSAgICB4LAorICAgIGludAkgICAgeSwKKyAgICBpbnQJICAgIHcsCisgICAgaW50CSAgICBoKQoreworICAgIC8qIEl0IHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHBsYWNlIGFueXdheSAqLworfQorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTWFrZSBtZW51IGl0ZW0gaGlkZGVuIG9yIG5vdCBoaWRkZW4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbWVudV9oaWRkZW4oCisgICAgdmltbWVudV9UCSptZW51LAorICAgIGludAkJaGlkZGVuKQoreworICAgIC8qCisgICAgICogVGhpcyBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudC4gIEhtbSwganVzdCBncmV5IHRoZSBtZW51IGl0ZW1zIGZvciBub3cuCisgICAgICovCisgICAgLyoKKyAgICBpZiAoaGlkZGVuKQorCUVuYWJsZU1lbnVJdGVtKHNfbWVudUJhciwgbWVudS0+aWQsIE1GX0JZQ09NTUFORCB8IE1GX0RJU0FCTEVEKTsKKyAgICBlbHNlCisJRW5hYmxlTWVudUl0ZW0oc19tZW51QmFyLCBtZW51LT5pZCwgTUZfQllDT01NQU5EIHwgTUZfRU5BQkxFRCk7CisgICAgKi8KKyAgICBndWlfbWNoX21lbnVfZ3JleShtZW51LCBoaWRkZW4pOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIG1lbnVzIHRvIGdyZXkvaGlkZGVuIG9yIG5vdC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19tZW51YmFyKHZvaWQpCit7CisgICAgRHJhd01lbnVCYXIoc19od25kKTsKK30KKyNlbmRpZiAvKkZFQVRfTUVOVSovCisKKyNpZm5kZWYgUFJPVE8KK3ZvaWQKKyNpZmRlZiBWSU1ETEwKK19leHBvcnQKKyNlbmRpZgorX2NkZWNsCitTYXZlSW5zdChISU5TVEFOQ0UgaEluc3QpCit7CisgICAgc19oaW5zdCA9IGhJbnN0OworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiBhIHBpeGVsIGFzIGEgbG9uZy4KKyAqLworICAgIGxvbmdfdQorZ3VpX21jaF9nZXRfcmdiKGd1aWNvbG9yX1QgcGl4ZWwpCit7CisgICAgcmV0dXJuIChHZXRSVmFsdWUocGl4ZWwpIDw8IDE2KSArIChHZXRHVmFsdWUocGl4ZWwpIDw8IDgpCisJCQkJCQkJICAgKyBHZXRCVmFsdWUocGl4ZWwpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoUFJPVE8pCisvKiBDb252ZXJ0IHBpeGVscyBpbiBYIHRvIGRpYWxvZyB1bml0cyAqLworICAgIHN0YXRpYyBXT1JECitQaXhlbFRvRGlhbG9nWChpbnQgbnVtUGl4ZWxzKQoreworICAgIHJldHVybiAoV09SRCkoKG51bVBpeGVscyAqIDQpIC8gc19kbGdmbnR3aWR0aCk7Cit9CisKKy8qIENvbnZlcnQgcGl4ZWxzIGluIFkgdG8gZGlhbG9nIHVuaXRzICovCisgICAgc3RhdGljIFdPUkQKK1BpeGVsVG9EaWFsb2dZKGludCBudW1QaXhlbHMpCit7CisgICAgcmV0dXJuIChXT1JEKSgobnVtUGl4ZWxzICogOCkgLyBzX2RsZ2ZudGhlaWdodCk7Cit9CisKKy8qIFJldHVybiB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBnaXZlbiB0ZXh0IGluIHRoZSBnaXZlbiBEQy4gKi8KKyAgICBzdGF0aWMgaW50CitHZXRUZXh0V2lkdGgoSERDIGhkYywgY2hhcl91ICpzdHIsIGludCBsZW4pCit7CisgICAgU0laRSAgICBzaXplOworCisgICAgR2V0VGV4dEV4dGVudFBvaW50KGhkYywgc3RyLCBsZW4sICZzaXplKTsKKyAgICByZXR1cm4gc2l6ZS5jeDsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qCisgKiBSZXR1cm4gdGhlIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgZ2l2ZW4gdGV4dCBpbiB0aGUgZ2l2ZW4gREMsIHRha2luZyBjYXJlCisgKiBvZiAnZW5jb2RpbmcnIHRvIGFjdGl2ZSBjb2RlcGFnZSBjb252ZXJzaW9uLgorICovCisgICAgc3RhdGljIGludAorR2V0VGV4dFdpZHRoRW5jKEhEQyBoZGMsIGNoYXJfdSAqc3RyLCBpbnQgbGVuKQoreworICAgIFNJWkUJc2l6ZTsKKyAgICBXQ0hBUgkqd3N0cjsKKyAgICBpbnQJCW47CisgICAgaW50CQl3bGVuID0gbGVuOworCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlKQorICAgIHsKKwkvKiAnZW5jb2RpbmcnIGRpZmZlcnMgZnJvbSBhY3RpdmUgY29kZXBhZ2U6IGNvbnZlcnQgdGV4dCBhbmQgdXNlIHdpZGUKKwkgKiBmdW5jdGlvbiAqLworCXdzdHIgPSBlbmNfdG9fdWNzMihzdHIsICZ3bGVuKTsKKwlpZiAod3N0ciAhPSBOVUxMKQorCXsKKwkgICAgbiA9IEdldFRleHRFeHRlbnRQb2ludFcoaGRjLCB3c3RyLCB3bGVuLCAmc2l6ZSk7CisJICAgIHZpbV9mcmVlKHdzdHIpOworCSAgICBpZiAobikKKwkJcmV0dXJuIHNpemUuY3g7CisJfQorICAgIH0KKworICAgIHJldHVybiBHZXRUZXh0V2lkdGgoaGRjLCBzdHIsIGxlbik7Cit9CisjZWxzZQorIyBkZWZpbmUgR2V0VGV4dFdpZHRoRW5jKGgsIHMsIGwpIEdldFRleHRXaWR0aCgoaCksIChzKSwgKGwpKQorI2VuZGlmCisKKy8qCisgKiBBIHF1aWNrIGxpdHRsZSByb3V0aW5lIHRoYXQgd2lsbCBjZW50ZXIgb25lIHdpbmRvdyBvdmVyIGFub3RoZXIsIGhhbmR5IGZvcgorICogZGlhbG9nIGJveGVzLiAgVGFrZW4gZnJvbSB0aGUgV2luMzJTREsgc2FtcGxlcy4KKyAqLworICAgIHN0YXRpYyBCT09MCitDZW50ZXJXaW5kb3coCisgICAgSFdORCBod25kQ2hpbGQsCisgICAgSFdORCBod25kUGFyZW50KQoreworICAgIFJFQ1QgICAgckNoaWxkLCByUGFyZW50OworICAgIGludCAgICAgd0NoaWxkLCBoQ2hpbGQsIHdQYXJlbnQsIGhQYXJlbnQ7CisgICAgaW50ICAgICB3U2NyZWVuLCBoU2NyZWVuLCB4TmV3LCB5TmV3OworICAgIEhEQyAgICAgaGRjOworCisgICAgR2V0V2luZG93UmVjdChod25kQ2hpbGQsICZyQ2hpbGQpOworICAgIHdDaGlsZCA9IHJDaGlsZC5yaWdodCAtIHJDaGlsZC5sZWZ0OworICAgIGhDaGlsZCA9IHJDaGlsZC5ib3R0b20gLSByQ2hpbGQudG9wOworCisgICAgLyogSWYgVmltIGlzIG1pbmltaXplZCBwdXQgdGhlIHdpbmRvdyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uICovCisgICAgaWYgKElzTWluaW1pemVkKGh3bmRQYXJlbnQpKQorICAgIHsKKyNpZmRlZiBXSU4xNgorCXJQYXJlbnQubGVmdCA9IDA7CisJclBhcmVudC50b3AgPSAwOworCXJQYXJlbnQucmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKwlyUGFyZW50LmJvdHRvbSA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGVUxMU0NSRUVOKTsKKyNlbHNlCisJU3lzdGVtUGFyYW1ldGVyc0luZm8oU1BJX0dFVFdPUktBUkVBLCAwLCAmclBhcmVudCwgMCk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorCUdldFdpbmRvd1JlY3QoaHduZFBhcmVudCwgJnJQYXJlbnQpOworICAgIHdQYXJlbnQgPSByUGFyZW50LnJpZ2h0IC0gclBhcmVudC5sZWZ0OworICAgIGhQYXJlbnQgPSByUGFyZW50LmJvdHRvbSAtIHJQYXJlbnQudG9wOworCisgICAgaGRjID0gR2V0REMoaHduZENoaWxkKTsKKyAgICB3U2NyZWVuID0gR2V0RGV2aWNlQ2FwcyAoaGRjLCBIT1JaUkVTKTsKKyAgICBoU2NyZWVuID0gR2V0RGV2aWNlQ2FwcyAoaGRjLCBWRVJUUkVTKTsKKyAgICBSZWxlYXNlREMoaHduZENoaWxkLCBoZGMpOworCisgICAgeE5ldyA9IHJQYXJlbnQubGVmdCArICgod1BhcmVudCAtIHdDaGlsZCkgLzIpOworICAgIGlmICh4TmV3IDwgMCkKKyAgICB7CisJeE5ldyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCh4TmV3K3dDaGlsZCkgPiB3U2NyZWVuKQorICAgIHsKKwl4TmV3ID0gd1NjcmVlbiAtIHdDaGlsZDsKKyAgICB9CisKKyAgICB5TmV3ID0gclBhcmVudC50b3AJKyAoKGhQYXJlbnQgLSBoQ2hpbGQpIC8yKTsKKyAgICBpZiAoeU5ldyA8IDApCisJeU5ldyA9IDA7CisgICAgZWxzZSBpZiAoKHlOZXcraENoaWxkKSA+IGhTY3JlZW4pCisJeU5ldyA9IGhTY3JlZW4gLSBoQ2hpbGQ7CisKKyAgICByZXR1cm4gU2V0V2luZG93UG9zKGh3bmRDaGlsZCwgTlVMTCwgeE5ldywgeU5ldywgMCwgMCwKKwkJCQkJCSAgIFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIpOworfQorI2VuZGlmIC8qIEZFQVRfR1VJX0RJQUxPRyAqLworCit2b2lkCitndWlfbWNoX2FjdGl2YXRlX3dpbmRvdyh2b2lkKQoreworICAgICh2b2lkKVNldEFjdGl2ZVdpbmRvdyhzX2h3bmQpOworfQorCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZ3VpX21jaF9zaG93X3Rvb2xiYXIoaW50IHNob3dpdCkKK3sKKyAgICBpZiAoc190b29sYmFyaHduZCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChzaG93aXQpCisJU2hvd1dpbmRvdyhzX3Rvb2xiYXJod25kLCBTV19TSE9XKTsKKyAgICBlbHNlCisJU2hvd1dpbmRvdyhzX3Rvb2xiYXJod25kLCBTV19ISURFKTsKK30KKworLyogVGhlbiBudW1iZXIgb2YgYml0bWFwcyBpcyBmaXhlZC4gIEV4aXQgaXMgbWlzc2luZyEgKi8KKyNkZWZpbmUgVE9PTEJBUl9CSVRNQVBfQ09VTlQgMzEKKworI2VuZGlmCisKKy8qCisgKiAiOnNpbWFsdCIgY29tbWFuZC4KKyAqLworICAgIHZvaWQKK2V4X3NpbWFsdChleGFyZ19UICplYXApCit7CisgICAgY2hhcl91ICprZXlzID0gZWFwLT5hcmc7CisKKyAgICBQb3N0TWVzc2FnZShzX2h3bmQsIFdNX1NZU0NPTU1BTkQsIChXUEFSQU0pU0NfS0VZTUVOVSwgKExQQVJBTSkwKTsKKyAgICB3aGlsZSAoKmtleXMpCisgICAgeworCWlmICgqa2V5cyA9PSAnficpCisJICAgICprZXlzID0gJyAnOwkgICAgLyogZm9yIHNob3dpbmcgc3lzdGVtIG1lbnUgKi8KKwlQb3N0TWVzc2FnZShzX2h3bmQsIFdNX0NIQVIsIChXUEFSQU0pKmtleXMsIChMUEFSQU0pMCk7CisJa2V5cysrOworICAgIH0KK30KKworLyoKKyAqIENyZWF0ZSB0aGUgZmluZCAmIHJlcGxhY2UgZGlhbG9ncy4KKyAqIFlvdSBjYW4ndCBoYXZlIGJvdGggYXQgb25jZTogIjpmaW5kIiB3aGVuIHJlcGxhY2UgaXMgc2hvd2luZywgZGVzdHJveXMKKyAqIHRoZSByZXBsYWNlIGRpYWxvZyBmaXJzdCwgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICovCisjaWZkZWYgTVNXSU5fRklORF9SRVBMQUNFCisgICAgc3RhdGljIHZvaWQKK2luaXRpYWxpc2VfZmluZHJlcChjaGFyX3UgKmluaXRpYWxfc3RyaW5nKQoreworICAgIGludAkJd3dvcmQgPSBGQUxTRTsKKyAgICBpbnQJCW1jYXNlID0gIXBfaWM7CisgICAgY2hhcl91CSplbnRyeV90ZXh0OworCisgICAgLyogR2V0IHRoZSBzZWFyY2ggc3RyaW5nIHRvIHVzZS4gKi8KKyAgICBlbnRyeV90ZXh0ID0gZ2V0X2ZpbmRfZGlhbG9nX3RleHQoaW5pdGlhbF9zdHJpbmcsICZ3d29yZCwgJm1jYXNlKTsKKworICAgIHNfZmluZHJlcF9zdHJ1Y3QuaHduZE93bmVyID0gc19od25kOworICAgIHNfZmluZHJlcF9zdHJ1Y3QuRmxhZ3MgPSBGUl9ET1dOOworICAgIGlmIChtY2FzZSkKKwlzX2ZpbmRyZXBfc3RydWN0LkZsYWdzIHw9IEZSX01BVENIQ0FTRTsKKyAgICBpZiAod3dvcmQpCisJc19maW5kcmVwX3N0cnVjdC5GbGFncyB8PSBGUl9XSE9MRVdPUkQ7CisgICAgaWYgKGVudHJ5X3RleHQgIT0gTlVMTCAmJiAqZW50cnlfdGV4dCAhPSBOVUwpCisgICAgeworCVNUUk5DUFkoc19maW5kcmVwX3N0cnVjdC5scHN0ckZpbmRXaGF0LCBlbnRyeV90ZXh0LAorCQkJCQkgICAgICAgc19maW5kcmVwX3N0cnVjdC53RmluZFdoYXRMZW4pOworCXNfZmluZHJlcF9zdHJ1Y3QubHBzdHJGaW5kV2hhdFtzX2ZpbmRyZXBfc3RydWN0LndGaW5kV2hhdExlbiAtIDFdID0gTlVMOworCXNfZmluZHJlcF9zdHJ1Y3QubHBzdHJSZXBsYWNlV2l0aFswXSA9IE5VTDsKKyAgICB9CisgICAgdmltX2ZyZWUoZW50cnlfdGV4dCk7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2d1aV9tY2hfZmluZF9kaWFsb2coZXhhcmdfVCAqZWFwKQoreworI2lmZGVmIE1TV0lOX0ZJTkRfUkVQTEFDRQorICAgIGlmIChzX2ZpbmRyZXBfbXNnICE9IDApCisgICAgeworCWlmIChJc1dpbmRvdyhzX2ZpbmRyZXBfaHduZCkgJiYgIXNfZmluZHJlcF9pc19maW5kKQorCSAgICBEZXN0cm95V2luZG93KHNfZmluZHJlcF9od25kKTsKKworCWlmICghSXNXaW5kb3coc19maW5kcmVwX2h3bmQpKQorCXsKKwkgICAgaW5pdGlhbGlzZV9maW5kcmVwKGVhcC0+YXJnKTsKKwkgICAgc19maW5kcmVwX2h3bmQgPSBGaW5kVGV4dCgoTFBGSU5EUkVQTEFDRSkgJnNfZmluZHJlcF9zdHJ1Y3QpOworCX0KKworCSh2b2lkKVNldFdpbmRvd1RleHQoc19maW5kcmVwX2h3bmQsCisJCSAgICAgICAoTFBDU1RSKV8oIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiKSk7CisJKHZvaWQpU2V0Rm9jdXMoc19maW5kcmVwX2h3bmQpOworCisJc19maW5kcmVwX2lzX2ZpbmQgPSBUUlVFOworICAgIH0KKyNlbmRpZgorfQorCisKKyAgICB2b2lkCitndWlfbWNoX3JlcGxhY2VfZGlhbG9nKGV4YXJnX1QgKmVhcCkKK3sKKyNpZmRlZiBNU1dJTl9GSU5EX1JFUExBQ0UKKyAgICBpZiAoc19maW5kcmVwX21zZyAhPSAwKQorICAgIHsKKwlpZiAoSXNXaW5kb3coc19maW5kcmVwX2h3bmQpICYmIHNfZmluZHJlcF9pc19maW5kKQorCSAgICBEZXN0cm95V2luZG93KHNfZmluZHJlcF9od25kKTsKKworCWlmICghSXNXaW5kb3coc19maW5kcmVwX2h3bmQpKQorCXsKKwkgICAgaW5pdGlhbGlzZV9maW5kcmVwKGVhcC0+YXJnKTsKKwkgICAgc19maW5kcmVwX2h3bmQgPSBSZXBsYWNlVGV4dCgoTFBGSU5EUkVQTEFDRSkgJnNfZmluZHJlcF9zdHJ1Y3QpOworCX0KKworCSh2b2lkKVNldFdpbmRvd1RleHQoc19maW5kcmVwX2h3bmQsCisJCSAgICAoTFBDU1RSKV8oIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiKSk7CisJKHZvaWQpU2V0Rm9jdXMoc19maW5kcmVwX2h3bmQpOworCisJc19maW5kcmVwX2lzX2ZpbmQgPSBGQUxTRTsKKyAgICB9CisjZW5kaWYKK30KKworCisvKgorICogU2V0IHZpc2liaWxpdHkgb2YgdGhlIHBvaW50ZXIuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21vdXNlaGlkZShpbnQgaGlkZSkKK3sKKyAgICBpZiAoaGlkZSAhPSBndWkucG9pbnRlcl9oaWRkZW4pCisgICAgeworCVNob3dDdXJzb3IoIWhpZGUpOworCWd1aS5wb2ludGVyX2hpZGRlbiA9IGhpZGU7CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9NRU5VCisgICAgc3RhdGljIHZvaWQKK2d1aV9tY2hfc2hvd19wb3B1cG1lbnVfYXQodmltbWVudV9UICptZW51LCBpbnQgeCwgaW50IHkpCit7CisgICAgLyogVW5oaWRlIHRoZSBtb3VzZSwgd2UgZG9uJ3QgZ2V0IG1vdmUgZXZlbnRzIGhlcmUuICovCisgICAgZ3VpX21jaF9tb3VzZWhpZGUoRkFMU0UpOworCisgICAgKHZvaWQpVHJhY2tQb3B1cE1lbnUoCisJKEhNRU5VKW1lbnUtPnN1Ym1lbnVfaWQsCisJVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAorCXgsIHksCisJKGludCkwLAkgICAgLypyZXNlcnZlZCBwYXJhbSovCisJc19od25kLAorCU5VTEwpOworICAgIC8qCisgICAgICogTk9URTogVGhlIHBvcC11cCBtZW51IGNhbiBlYXQgdGhlIG1vdXNlIHVwIGV2ZW50LgorICAgICAqIFdlIGRlYWwgd2l0aCB0aGlzIGluIG5vcm1hbC5jLgorICAgICAqLworfQorI2VuZGlmCisKKy8qCisgKiBHb3QgYSBtZXNzYWdlIHdoZW4gdGhlIHN5c3RlbSB3aWxsIGdvIGRvd24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorX09uRW5kU2Vzc2lvbih2b2lkKQoreworICAgIGdldG91dF9wcmVzZXJ2ZV9tb2RpZmllZCgxKTsKK30KKworLyoKKyAqIEdldCB0aGlzIG1lc3NhZ2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIGNyb3NzIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyCisgKiBvZiBhIFdpbmRvd3M5NSB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorX09uQ2xvc2UoCisgICAgSFdORCBod25kKQoreworICAgIGd1aV9zaGVsbF9jbG9zZWQoKTsKK30KKworLyoKKyAqIEdldCBhIG1lc3NhZ2Ugd2hlbiB0aGUgd2luZG93IGlzIGJlaW5nIGRlc3Ryb3llZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitfT25EZXN0cm95KAorICAgIEhXTkQgaHduZCkKK3sKKyNpZmRlZiBXSU4xNl8zRExPT0sKKyAgICBDdGwzZFVucmVnaXN0ZXIoc19oaW5zdCk7CisjZW5kaWYKKyAgICBpZiAoIWRlc3Ryb3lpbmcpCisJX09uQ2xvc2UoaHduZCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorX09uUGFpbnQoCisgICAgSFdORCBod25kKQoreworICAgIGlmICghSXNNaW5pbWl6ZWQoaHduZCkpCisgICAgeworCVBBSU5UU1RSVUNUIHBzOworCisJb3V0X2ZsdXNoKCk7CSAgICAvKiBtYWtlIHN1cmUgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKwkodm9pZClCZWdpblBhaW50KGh3bmQsICZwcyk7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJLyogcHJldmVudCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgZnJvbSBtaXNwcmludGluZyBvbiBhbiBpbnZhbGlkCisJICogcmVjdGFuZ2xlICovCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIFJFQ1QgcmVjdDsKKworCSAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKwkgICAgcHMucmNQYWludC5sZWZ0ID0gcmVjdC5sZWZ0OworCSAgICBwcy5yY1BhaW50LnJpZ2h0ID0gcmVjdC5yaWdodDsKKwl9CisjZW5kaWYKKworCWlmICghSXNSZWN0RW1wdHkoJnBzLnJjUGFpbnQpKQorCSAgICBndWlfcmVkcmF3KHBzLnJjUGFpbnQubGVmdCwgcHMucmNQYWludC50b3AsCisJCSAgICBwcy5yY1BhaW50LnJpZ2h0IC0gcHMucmNQYWludC5sZWZ0ICsgMSwKKwkJICAgIHBzLnJjUGFpbnQuYm90dG9tIC0gcHMucmNQYWludC50b3AgKyAxKTsKKwlFbmRQYWludChod25kLCAmcHMpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitfT25TaXplKAorICAgIEhXTkQgaHduZCwKKyAgICBVSU5UIHN0YXRlLAorICAgIGludCBjeCwKKyAgICBpbnQgY3kpCit7CisgICAgaWYgKCFJc01pbmltaXplZChod25kKSkKKyAgICB7CisJZ3VpX3Jlc2l6ZV9zaGVsbChjeCwgY3kpOworCisjaWZkZWYgRkVBVF9NRU5VCisJLyogTWVudSBiYXIgbWF5IHdyYXAgZGlmZmVyZW50bHkgbm93ICovCisJZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChUUlVFKTsKKyNlbmRpZgorICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitfT25TZXRGb2N1cygKKyAgICBIV05EIGh3bmQsCisgICAgSFdORCBod25kT2xkRm9jdXMpCit7CisgICAgZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKKyAgICAodm9pZClNeVdpbmRvd1Byb2MoaHduZCwgV01fU0VURk9DVVMsIChXUEFSQU0paHduZE9sZEZvY3VzLCAwKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitfT25LaWxsRm9jdXMoCisgICAgSFdORCBod25kLAorICAgIEhXTkQgaHduZE5ld0ZvY3VzKQoreworICAgIGd1aV9mb2N1c19jaGFuZ2UoRkFMU0UpOworICAgICh2b2lkKU15V2luZG93UHJvYyhod25kLCBXTV9LSUxMRk9DVVMsIChXUEFSQU0paHduZE5ld0ZvY3VzLCAwKTsKK30KKworLyoKKyAqIEdldCBhIG1lc3NhZ2Ugd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiYWNrIHRvIHZpbQorICovCisjaWZkZWYgV0lOMTYKKyAgICBzdGF0aWMgQk9PTAorI2Vsc2UKKyAgICBzdGF0aWMgTFJFU1VMVAorI2VuZGlmCitfT25BY3RpdmF0ZUFwcCgKKyAgICBIV05EIGh3bmQsCisgICAgQk9PTCBmQWN0aXZhdGUsCisjaWZkZWYgV0lOMTYKKyAgICBIVEFTSyBkd1RocmVhZElkCisjZWxzZQorICAgIERXT1JEIGR3VGhyZWFkSWQKKyNlbmRpZgorCSkKK3sKKyAgICAvKiB3ZSBjYWxsIGd1aV9mb2N1c19jaGFuZ2UoKSBpbiBfT25TZXRGb2N1cygpICovCisgICAgLyogZ3VpX2ZvY3VzX2NoYW5nZSgoaW50KWZBY3RpdmF0ZSk7ICovCisgICAgcmV0dXJuIE15V2luZG93UHJvYyhod25kLCBXTV9BQ1RJVkFURUFQUCwgZkFjdGl2YXRlLCAoRFdPUkQpZHdUaHJlYWRJZCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNjcm9sbGJhcl9UICpzYikKK3sKKyAgICBEZXN0cm95V2luZG93KHNiLT5pZCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCBjdXJyZW50IHggbW91c2UgY29vcmRpbmF0ZSBpbiB0ZXh0IHdpbmRvdy4KKyAqIFJldHVybiAtMSB3aGVuIHVua25vd24uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3godm9pZCkKK3sKKyAgICBSRUNUIHJjdDsKKyAgICBQT0lOVCBtcDsKKworICAgICh2b2lkKUdldFdpbmRvd1JlY3Qoc190ZXh0QXJlYSwgJnJjdCk7CisgICAgKHZvaWQpR2V0Q3Vyc29yUG9zKChMUFBPSU5UKSZtcCk7CisgICAgcmV0dXJuIChpbnQpKG1wLnggLSByY3QubGVmdCk7Cit9CisKKy8qCisgKiBHZXQgY3VycmVudCB5IG1vdXNlIGNvb3JkaW5hdGUgaW4gdGV4dCB3aW5kb3cuCisgKiBSZXR1cm4gLTEgd2hlbiB1bmtub3duLgorICovCisgICAgaW50CitndWlfbWNoX2dldF9tb3VzZV95KHZvaWQpCit7CisgICAgUkVDVCByY3Q7CisgICAgUE9JTlQgbXA7CisKKyAgICAodm9pZClHZXRXaW5kb3dSZWN0KHNfdGV4dEFyZWEsICZyY3QpOworICAgICh2b2lkKUdldEN1cnNvclBvcygoTFBQT0lOVCkmbXApOworICAgIHJldHVybiAoaW50KShtcC55IC0gcmN0LnRvcCk7Cit9CisKKy8qCisgKiBNb3ZlIG1vdXNlIHBvaW50ZXIgdG8gY2hhcmFjdGVyIGF0ICh4LCB5KS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0bW91c2UoaW50IHgsIGludCB5KQoreworICAgIFJFQ1QgcmN0OworCisgICAgKHZvaWQpR2V0V2luZG93UmVjdChzX3RleHRBcmVhLCAmcmN0KTsKKyAgICAodm9pZClTZXRDdXJzb3JQb3MoeCArIGd1aS5ib3JkZXJfb2Zmc2V0ICsgcmN0LmxlZnQsCisJCSAgICAgICB5ICsgZ3VpLmJvcmRlcl9vZmZzZXQgKyByY3QudG9wKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfbXN3aW5fZ2V0X3ZhbGlkX2RpbWVuc2lvbnMoCisgICAgaW50IHcsCisgICAgaW50IGgsCisgICAgaW50ICp2YWxpZF93LAorICAgIGludCAqdmFsaWRfaCkKK3sKKyAgICBpbnQJICAgIGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0OworCisgICAgYmFzZV93aWR0aCA9IGd1aV9nZXRfYmFzZV93aWR0aCgpCisJKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlJBTUUpICogMjsKKyAgICBiYXNlX2hlaWdodCA9IGd1aV9nZXRfYmFzZV9oZWlnaHQoKQorCSsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSAqIDIKKwkrIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKQorI2lmZGVmIEZFQVRfTUVOVQorCSsgZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChGQUxTRSkKKyNlbmRpZgorCTsKKyAgICAqdmFsaWRfdyA9IGJhc2Vfd2lkdGggKworCQkgICAgKCh3IC0gYmFzZV93aWR0aCkgLyBndWkuY2hhcl93aWR0aCkgKiBndWkuY2hhcl93aWR0aDsKKyAgICAqdmFsaWRfaCA9IGJhc2VfaGVpZ2h0ICsKKwkJICAgICgoaCAtIGJhc2VfaGVpZ2h0KSAvIGd1aS5jaGFyX2hlaWdodCkgKiBndWkuY2hhcl9oZWlnaHQ7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucyhpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKQoreworCisgICAgKnNjcmVlbl93ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZVTExTQ1JFRU4pCisJICAgICAgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlJBTUUpICogMjsKKyAgICAvKiBGSVhNRTogZGlydHkgdHJpY2s6IEJlY2F1c2UgdGhlIGd1aV9nZXRfYmFzZV9oZWlnaHQoKSBkb2Vzbid0IGluY2x1ZGUKKyAgICAgKiB0aGUgbWVudWJhciBmb3IgTVN3aW4sIHdlIHN1YnRyYWN0IGl0IGZyb20gdGhlIHNjcmVlbiBoZWlnaHQsIHNvIHRoYXQKKyAgICAgKiB0aGUgd2luZG93IHNpemUgY2FuIGJlIG1hZGUgdG8gZml0IG9uIHRoZSBzY3JlZW4uICovCisgICAgKnNjcmVlbl9oID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZVTExTQ1JFRU4pCisJICAgICAgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpICogMgorI2lmZGVmIEZFQVRfTUVOVQorCSAgICAgIC0gZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChGQUxTRSkKKyNlbmRpZgorCSAgICAgIDsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZmxhc2goaW50IG1zZWMpCit7CisgICAgUkVDVCAgICByYzsKKworICAgIC8qCisgICAgICogTm90ZTogSW52ZXJ0UmVjdCgpIGV4Y2x1ZGVzIHJpZ2h0IGFuZCBib3R0b20gb2YgcmVjdGFuZ2xlLgorICAgICAqLworICAgIHJjLmxlZnQgPSAwOworICAgIHJjLnRvcCA9IDA7CisgICAgcmMucmlnaHQgPSBndWkubnVtX2NvbHMgKiBndWkuY2hhcl93aWR0aDsKKyAgICByYy5ib3R0b20gPSBndWkubnVtX3Jvd3MgKiBndWkuY2hhcl9oZWlnaHQ7CisgICAgSW52ZXJ0UmVjdChzX2hkYywgJnJjKTsKKyAgICBndWlfbWNoX2ZsdXNoKCk7CQkJLyogbWFrZSBzdXJlIGl0J3MgZGlzcGxheWVkICovCisKKyAgICB1aV9kZWxheSgobG9uZyltc2VjLCBUUlVFKTsJLyogd2FpdCBmb3IgYSBmZXcgbXNlYyAqLworCisgICAgSW52ZXJ0UmVjdChzX2hkYywgJnJjKTsKK30KKworLyoKKyAqIFJldHVybiBmbGFncyB1c2VkIGZvciBzY3JvbGxpbmcuCisgKiBUaGUgU1dfSU5WQUxJREFURSBpcyByZXF1aXJlZCB3aGVuIHBhcnQgb2YgdGhlIHdpbmRvdyBpcyBjb3ZlcmVkIG9yCisgKiBvZmYtc2NyZWVuLiBSZWZlciB0byBNUyBLQiBRNzUyMzYuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfc2Nyb2xsX2ZsYWdzKHZvaWQpCit7CisgICAgSFdORAlod25kOworICAgIFJFQ1QJcmNWaW0sIHJjT3RoZXIsIHJjRGVzdDsKKworICAgIEdldFdpbmRvd1JlY3Qoc19od25kLCAmcmNWaW0pOworICAgIGZvciAoaHduZCA9IHNfaHduZDsgKGh3bmQgPSBHZXRXaW5kb3coaHduZCwgR1dfSFdORFBSRVYpKSAhPSAoSFdORCkwOyApCisJaWYgKElzV2luZG93VmlzaWJsZShod25kKSkKKwl7CisJICAgIEdldFdpbmRvd1JlY3QoaHduZCwgJnJjT3RoZXIpOworCSAgICBpZiAoSW50ZXJzZWN0UmVjdCgmcmNEZXN0LCAmcmNWaW0sICZyY090aGVyKSkKKwkJcmV0dXJuIFNXX0lOVkFMSURBVEU7CisJfQorICAgIHJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgdXAgYW55CisgKiB0ZXh0IGZ1cnRoZXIgZG93biB3aXRoaW4gdGhlIHNjcm9sbCByZWdpb24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RlbGV0ZV9saW5lcygKKyAgICBpbnQJICAgIHJvdywKKyAgICBpbnQJICAgIG51bV9saW5lcykKK3sKKyAgICBSRUNUCXJjOworCisgICAgcmMubGVmdCA9IEZJTExfWChndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0KTsKKyAgICByYy5yaWdodCA9IEZJTExfWChndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCArIDEpOworICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOworICAgIHJjLmJvdHRvbSA9IEZJTExfWShndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgKyAxKTsKKworICAgIFNjcm9sbFdpbmRvd0V4KHNfdGV4dEFyZWEsIDAsIC1udW1fbGluZXMgKiBndWkuY2hhcl9oZWlnaHQsCisJCQkJICAgICZyYywgJnJjLCBOVUxMLCBOVUxMLCBnZXRfc2Nyb2xsX2ZsYWdzKCkpOworCisgICAgVXBkYXRlV2luZG93KHNfdGV4dEFyZWEpOworICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgdG8gYXZvaWQgdGhlIGN1cnNvciBkaXNhcHBlYXJpbmcgd2hlbgorICAgICAqIHNjcm9sbGluZyBzdWNoIHRoYXQgdGhlIGN1cnNvciBlbmRzIHVwIGluIHRoZSB0b3AtbGVmdCBjaGFyYWN0ZXIgb24KKyAgICAgKiB0aGUgc2NyZWVuLi4uICAgQnV0IHdoeT8gIChXZWJiKSAqLworICAgIC8qIEl0J3MgcHJvYmFibHkgZml4ZWQgYnkgZGlzYWJsaW5nIGRyYXdpbmcgdGhlIGN1cnNvciB3aGlsZSBzY3JvbGxpbmcuICovCisgICAgLyogZ3VpLmN1cnNvcl9pc192YWxpZCA9IEZBTFNFOyAqLworCisgICAgZ3VpX2NsZWFyX2Jsb2NrKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCAtIG51bV9saW5lcyArIDEsCisJCQkJCQkgICAgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKKwlndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKK30KKworLyoKKyAqIEluc2VydCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzIGJlZm9yZSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgZG93biBhbnkKKyAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfaW5zZXJ0X2xpbmVzKAorICAgIGludAkJcm93LAorICAgIGludAkJbnVtX2xpbmVzKQoreworICAgIFJFQ1QJcmM7CisKKyAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOworICAgIHJjLnJpZ2h0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ICsgMSk7CisgICAgcmMudG9wID0gRklMTF9ZKHJvdyk7CisgICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOworICAgIC8qIFRoZSBTV19JTlZBTElEQVRFIGlzIHJlcXVpcmVkIHdoZW4gcGFydCBvZiB0aGUgd2luZG93IGlzIGNvdmVyZWQgb3IKKyAgICAgKiBvZmYtc2NyZWVuLiAgSG93IGRvIHdlIGF2b2lkIGl0IHdoZW4gaXQncyBub3QgbmVlZGVkPyAqLworICAgIFNjcm9sbFdpbmRvd0V4KHNfdGV4dEFyZWEsIDAsIG51bV9saW5lcyAqIGd1aS5jaGFyX2hlaWdodCwKKwkJCQkgICAgJnJjLCAmcmMsIE5VTEwsIE5VTEwsIGdldF9zY3JvbGxfZmxhZ3MoKSk7CisKKyAgICBVcGRhdGVXaW5kb3coc190ZXh0QXJlYSk7CisKKyAgICBndWlfY2xlYXJfYmxvY2socm93LCBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAorCQkJCXJvdyArIG51bV9saW5lcyAtIDEsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKK30KKworCisgICAgdm9pZAorZ3VpX21jaF9leGl0KGludCByYykKK3sKKyAgICBSZWxlYXNlREMoc190ZXh0QXJlYSwgc19oZGMpOworICAgIERlbGV0ZU9iamVjdChzX2JydXNoKTsKKworI2lmZGVmIEZFQVRfVEVBUk9GRgorICAgIC8qIFVubG9hZCB0aGUgdGVhcm9mZiBiaXRtYXAgKi8KKyAgICAodm9pZClEZWxldGVPYmplY3QoKEhHRElPQkopc19odGVhcmJpdG1hcCk7CisjZW5kaWYKKworICAgIC8qIERlc3Ryb3kgb3VyIHdpbmRvdyAoaWYgd2UgaGF2ZSBvbmUpLiAqLworICAgIGlmIChzX2h3bmQgIT0gTlVMTCkKKyAgICB7CisJZGVzdHJveWluZyA9IFRSVUU7CS8qIGlnbm9yZSBXTV9ERVNUUk9ZIG1lc3NhZ2Ugbm93ICovCisJRGVzdHJveVdpbmRvdyhzX2h3bmQpOworICAgIH0KKworI2lmZGVmIEdMT0JBTF9JTUUKKyAgICBnbG9iYWxfaW1lX2VuZCgpOworI2VuZGlmCit9CisKKy8qCisgKiBJbml0aWFsaXNlIHZpbSB0byB1c2UgdGhlIGZvbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4JUmV0dXJuIEZBSUwgaWYgdGhlIGZvbnQKKyAqIGNvdWxkIG5vdCBiZSBsb2FkZWQsIE9LIG90aGVyd2lzZS4KKyAqLworICAgIGludAorZ3VpX21jaF9pbml0X2ZvbnQoY2hhcl91ICpmb250X25hbWUsIGludCBmb250c2V0KQoreworICAgIExPR0ZPTlQJbGY7CisgICAgR3VpRm9udAlmb250ID0gTk9GT05UOworCisgICAgLyogTG9hZCB0aGUgZm9udCAqLworICAgIGlmIChnZXRfbG9nZm9udCgmbGYsIGZvbnRfbmFtZSwgTlVMTCkpCisJZm9udCA9IGdldF9mb250X2hhbmRsZSgmbGYpOworICAgIGlmIChmb250ID09IE5PRk9OVCkKKwlyZXR1cm4gRkFJTDsKKyAgICBpZiAoZm9udF9uYW1lID09IE5VTEwpCisJZm9udF9uYW1lID0gbGYubGZGYWNlTmFtZTsKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEVfSU1FKSB8fCBkZWZpbmVkKEdMT0JBTF9JTUUpCisgICAgbm9ybV9sb2dmb250ID0gbGY7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFX0lNRQorICAgIGltX3NldF9mb250KCZsZik7CisjZW5kaWYKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkubm9ybV9mb250KTsKKyAgICBndWkubm9ybV9mb250ID0gZm9udDsKKyAgICBjdXJyZW50X2ZvbnRfaGVpZ2h0ID0gbGYubGZIZWlnaHQ7CisgICAgR2V0Rm9udFNpemUoZm9udCk7CisgICAgaGxfc2V0X2ZvbnRfbmFtZShsZi5sZkZhY2VOYW1lKTsKKworICAgIC8qIFdoZW4gc2V0dGluZyAnZ3VpZm9udCcgdG8gIioiIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0dWFsIGZvbnQgbmFtZS4gKi8KKyAgICBpZiAoU1RSQ01QKGZvbnRfbmFtZSwgIioiKSA9PSAwICYmIFNUUkNNUChwX2d1aWZvbnQsICIqIikgPT0gMCkKKyAgICB7CisJY2hhcgkgICAgKmNoYXJzZXRfbmFtZTsKKwljaGFyX3UJICAgICpwOworCisJY2hhcnNldF9uYW1lID0gY2hhcnNldF9pZDJuYW1lKChpbnQpbGYubGZDaGFyU2V0KTsKKwlwID0gYWxsb2MoKHVuc2lnbmVkKShzdHJsZW4obGYubGZGYWNlTmFtZSkgKyAyMAorCQkgICAgKyAoY2hhcnNldF9uYW1lID09IE5VTEwgPyAwIDogc3RybGVuKGNoYXJzZXRfbmFtZSkgKyAyKSkpOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICAvKiBtYWtlIGEgbm9ybWFsIGZvbnQgc3RyaW5nIG91dCBvZiB0aGUgbGYgdGhpbmc6Ki8KKwkgICAgc3ByaW50ZigoY2hhciAqKXAsICIlczpoJWQiLCBsZi5sZkZhY2VOYW1lLCBwaXhlbHNfdG9fcG9pbnRzKAorCQkJIGxmLmxmSGVpZ2h0IDwgMCA/IC1sZi5sZkhlaWdodCA6IGxmLmxmSGVpZ2h0LCBUUlVFKSk7CisJICAgIHZpbV9mcmVlKHBfZ3VpZm9udCk7CisJICAgIHBfZ3VpZm9udCA9IHA7CisJICAgIHdoaWxlICgqcCkKKwkgICAgeworCQlpZiAoKnAgPT0gJyAnKQorCQkgICAgKnAgPSAnXyc7CisJCSsrcDsKKwkgICAgfQorI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisJICAgIGlmIChsZi5sZkl0YWxpYykKKwkJU1RSQ0FUKHAsICI6aSIpOworCSAgICBpZiAobGYubGZXZWlnaHQgPj0gRldfQk9MRCkKKwkJU1RSQ0FUKHAsICI6YiIpOworI2VuZGlmCisJICAgIGlmIChsZi5sZlVuZGVybGluZSkKKwkJU1RSQ0FUKHAsICI6dSIpOworCSAgICBpZiAobGYubGZTdHJpa2VPdXQpCisJCVNUUkNBVChwLCAiOnMiKTsKKwkgICAgaWYgKGNoYXJzZXRfbmFtZSAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNBVChwLCAiOmMiKTsKKwkJU1RSQ0FUKHAsIGNoYXJzZXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgfQorCisjaWZuZGVmIE1TV0lOMTZfRkFTVFRFWFQKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkuaXRhbF9mb250KTsKKyAgICBndWkuaXRhbF9mb250ID0gTk9GT05UOworICAgIGd1aV9tY2hfZnJlZV9mb250KGd1aS5ib2xkX2ZvbnQpOworICAgIGd1aS5ib2xkX2ZvbnQgPSBOT0ZPTlQ7CisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLmJvbGRpdGFsX2ZvbnQpOworICAgIGd1aS5ib2xkaXRhbF9mb250ID0gTk9GT05UOworCisgICAgaWYgKCFsZi5sZkl0YWxpYykKKyAgICB7CisJbGYubGZJdGFsaWMgPSBUUlVFOworCWd1aS5pdGFsX2ZvbnQgPSBnZXRfZm9udF9oYW5kbGUoJmxmKTsKKwlsZi5sZkl0YWxpYyA9IEZBTFNFOworICAgIH0KKyAgICBpZiAobGYubGZXZWlnaHQgPCBGV19CT0xEKQorICAgIHsKKwlsZi5sZldlaWdodCA9IEZXX0JPTEQ7CisJZ3VpLmJvbGRfZm9udCA9IGdldF9mb250X2hhbmRsZSgmbGYpOworCWlmICghbGYubGZJdGFsaWMpCisJeworCSAgICBsZi5sZkl0YWxpYyA9IFRSVUU7CisJICAgIGd1aS5ib2xkaXRhbF9mb250ID0gZ2V0X2ZvbnRfaGFuZGxlKCZsZik7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIEdVSSB3aW5kb3cgaXMgbWF4aW1pemVkLCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfbWF4aW1pemVkKCkKK3sKKyAgICByZXR1cm4gSXNab29tZWQoc19od25kKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBmb250IGNoYW5nZWQgd2hpbGUgdGhlIHdpbmRvdyBpcyBtYXhpbWl6ZWQuICBDb21wdXRlIHRoZQorICogbmV3IFJvd3MgYW5kIENvbHVtbnMuICBUaGlzIGlzIGxpa2UgcmVzaXppbmcgdGhlIHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbmV3Zm9udCgpCit7CisgICAgUkVDVAlyZWN0OworCisgICAgR2V0V2luZG93UmVjdChzX2h3bmQsICZyZWN0KTsKKyAgICBndWlfcmVzaXplX3NoZWxsKHJlY3QucmlnaHQgLSByZWN0LmxlZnQKKwkJCS0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSAqIDIsCisJCSAgICAgcmVjdC5ib3R0b20gLSByZWN0LnRvcAorCQkJLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpICogMgorCQkJLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikKKyNpZmRlZiBGRUFUX01FTlUKKwkJCS0gZ3VpX21zd2luX2dldF9tZW51X2hlaWdodChGQUxTRSkKKyNlbmRpZgorCSAgICApOworfQorCisvKgorICogU2V0IHRoZSB3aW5kb3cgdGl0bGUKKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0dGl0bGUoCisgICAgY2hhcl91ICAqdGl0bGUsCisgICAgY2hhcl91ICAqaWNvbikKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKHRpdGxlICE9IE5VTEwgJiYgZW5jX2NvZGVwYWdlID49IDAgJiYgZW5jX2NvZGVwYWdlICE9IChpbnQpR2V0QUNQKCkpCisgICAgeworCVdDSEFSCSp3YnVmOworCWludAluOworCisJLyogQ29udmVydCB0aGUgdGl0bGUgZnJvbSAnZW5jb2RpbmcnIHRvIHVjczIuICovCisJd2J1ZiA9IChXQ0hBUiAqKWVuY190b191Y3MyKHRpdGxlLCBOVUxMKTsKKwlpZiAod2J1ZiAhPSBOVUxMKQorCXsKKwkgICAgbiA9IFNldFdpbmRvd1RleHRXKHNfaHduZCwgd2J1Zik7CisJICAgIHZpbV9mcmVlKHdidWYpOworCSAgICBpZiAobiAhPSAwIHx8IEdldExhc3RFcnJvcigpICE9IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQlyZXR1cm47CisJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwl9CisgICAgfQorI2VuZGlmCisgICAgU2V0V2luZG93VGV4dChzX2h3bmQsIChMUENTVFIpKHRpdGxlID09IE5VTEwgPyAiVklNIiA6IChjaGFyICopdGl0bGUpKTsKK30KKworI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQorLyogVGFibGUgZm9yIHNoYXBlIElEQ3MuICBLZWVwIGluIHN5bmMgd2l0aCB0aGUgbXNoYXBlX25hbWVzW10gdGFibGUgaW4KKyAqIG1pc2MyLmMhICovCitzdGF0aWMgTFBDU1RSIG1zaGFwZV9pZGNzW10gPQoreworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfQVJST1cpLAkJLyogYXJyb3cgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoMCksCQkJLyogYmxhbmsgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX0lCRUFNKSwJCS8qIGJlYW0gKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX1NJWkVOUyksCS8qIHVwZG93biAqLworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfU0laRU5TKSwJLyogdWRzaXppbmcgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX1NJWkVXRSksCS8qIGxlZnRyaWdodCAqLworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfU0laRVdFKSwJLyogbHJzaXppbmcgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX1dBSVQpLAkJLyogYnVzeSAqLworI2lmZGVmIFdJTjMyNjQKKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX05PKSwJCS8qIG5vICovCisjZWxzZQorICAgIE1BS0VJTlRSRVNPVVJDRShJRENfSUNPTiksCQkvKiBubyAqLworI2VuZGlmCisgICAgTUFLRUlOVFJFU09VUkNFKElEQ19BUlJPVyksCQkvKiBjcm9zc2hhaXIgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX0FSUk9XKSwJCS8qIGhhbmQxICovCisgICAgTUFLRUlOVFJFU09VUkNFKElEQ19BUlJPVyksCQkvKiBoYW5kMiAqLworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfQVJST1cpLAkJLyogcGVuY2lsICovCisgICAgTUFLRUlOVFJFU09VUkNFKElEQ19BUlJPVyksCQkvKiBxdWVzdGlvbiAqLworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfQVJST1cpLAkJLyogcmlnaHQtYXJyb3cgKi8KKyAgICBNQUtFSU5UUkVTT1VSQ0UoSURDX1VQQVJST1cpLAkvKiB1cC1hcnJvdyAqLworICAgIE1BS0VJTlRSRVNPVVJDRShJRENfQVJST1cpCQkvKiBsYXN0IG9uZSAqLworfTsKKworICAgIHZvaWQKK21jaF9zZXRfbW91c2Vfc2hhcGUoaW50IHNoYXBlKQoreworICAgIExQQ1NUUiBpZGM7CisKKyAgICBpZiAoc2hhcGUgPT0gTVNIQVBFX0hJREUpCisJU2hvd0N1cnNvcihGQUxTRSk7CisgICAgZWxzZQorICAgIHsKKwlpZiAoc2hhcGUgPj0gTVNIQVBFX05VTUJFUkVEKQorCSAgICBpZGMgPSBNQUtFSU5UUkVTT1VSQ0UoSURDX0FSUk9XKTsKKwllbHNlCisJICAgIGlkYyA9IG1zaGFwZV9pZGNzW3NoYXBlXTsKKyNpZmRlZiBfV0lONjQKKwlTZXRDbGFzc0xvbmdQdHIoc190ZXh0QXJlYSwgR0NMUF9IQ1VSU09SLCAoTE9OR19QVFIpTG9hZEN1cnNvcihOVUxMLCBpZGMpKTsKKyNlbHNlCisjIGlmZGVmIFdJTjMyCisJU2V0Q2xhc3NMb25nKHNfdGV4dEFyZWEsIEdDTF9IQ1VSU09SLCAoTE9ORylMb2FkQ3Vyc29yKE5VTEwsIGlkYykpOworIyBlbHNlCisJU2V0Q2xhc3NXb3JkKHNfdGV4dEFyZWEsIEdDV19IQ1VSU09SLCAoV09SRClMb2FkQ3Vyc29yKE5VTEwsIGlkYykpOworIyBlbmRpZgorI2VuZGlmCisJaWYgKCFwX21oKQorCXsKKwkgICAgUE9JTlQgbXA7CisKKwkgICAgLyogU2V0IHRoZSBwb3NpdGlvbiB0byBtYWtlIGl0IHJlZHJhd24gd2l0aCB0aGUgbmV3IHNoYXBlLiAqLworCSAgICAodm9pZClHZXRDdXJzb3JQb3MoKExQUE9JTlQpJm1wKTsKKwkgICAgKHZvaWQpU2V0Q3Vyc29yUG9zKG1wLngsIG1wLnkpOworCSAgICBTaG93Q3Vyc29yKFRSVUUpOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQlJPV1NFCisvKgorICogVGhlIGZpbGUgYnJvd3NlciBleGlzdHMgaW4gdHdvIHZlcnNpb25zOiB3aXRoICJXIiB1c2VzIHdpZGUgY2hhcmFjdGVycywKKyAqIHdpdGhvdXQgIlciIHRoZSBjdXJyZW50IGNvZGVwYWdlLiAgV2hlbiBGRUFUX01CWVRFIGlzIGRlZmluZWQgYW5kIG9uCisgKiBXaW5kb3dzIE5ULzIwMDAvWFAgdGhlICJXIiBmdW5jdGlvbnMgYXJlIHVzZWQuCisgKi8KKworIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkKKy8qCisgKiBXaWRlIHZlcnNpb24gb2YgY29udmVydF9maWx0ZXIoKS4gIEtlZXAgaW4gc3luYyEKKyAqLworICAgIHN0YXRpYyBXQ0hBUiAqCitjb252ZXJ0X2ZpbHRlclcoY2hhcl91ICpzKQoreworICAgIFdDSEFSCSpyZXM7CisgICAgdW5zaWduZWQJc19sZW4gPSAodW5zaWduZWQpU1RSTEVOKHMpOworICAgIHVuc2lnbmVkCWk7CisKKyAgICByZXMgPSAoV0NIQVIgKilhbGxvYygoc19sZW4gKyAzKSAqIHNpemVvZihXQ0hBUikpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IHNfbGVuOyArK2kpCisJICAgIGlmIChzW2ldID09ICdcdCcgfHwgc1tpXSA9PSAnXG4nKQorCQlyZXNbaV0gPSAnXDAnOworCSAgICBlbHNlCisJCXJlc1tpXSA9IHNbaV07CisJcmVzW3NfbGVuXSA9IE5VTDsKKwkvKiBBZGQgdHdvIGV4dHJhIE5VTHMgdG8gbWFrZSBzdXJlIGl0J3MgcHJvcGVybHkgdGVybWluYXRlZC4gKi8KKwlyZXNbc19sZW4gKyAxXSA9IE5VTDsKKwlyZXNbc19sZW4gKyAyXSA9IE5VTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFdpZGUgdmVyc2lvbiBvZiBndWlfbWNoX2Jyb3dzZSgpLiAgS2VlcCBpbiBzeW5jIQorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitndWlfbWNoX2Jyb3dzZVcoCisJaW50IHNhdmluZywKKwljaGFyX3UgKnRpdGxlLAorCWNoYXJfdSAqZGZsdCwKKwljaGFyX3UgKmV4dCwKKwljaGFyX3UgKmluaXRkaXIsCisJY2hhcl91ICpmaWx0ZXIpCit7CisgICAgLyogV2UgYWx3YXlzIHVzZSB0aGUgd2lkZSBmdW5jdGlvbi4gIFRoaXMgbWVhbnMgZW5jX3RvX3VjczIoKSBtdXN0IHdvcmssCisgICAgICogb3RoZXJ3aXNlIGl0IGZhaWxzIG1pc2VyYWJseSEgKi8KKyAgICBPUEVORklMRU5BTUVXCWZpbGVTdHJ1Y3Q7CisgICAgV0NIQVIJCWZpbGVCdWZbTUFYUEFUSExdOworICAgIFdDSEFSCQkqd3A7CisgICAgaW50CQkJaTsKKyAgICBXQ0hBUgkJKnRpdGxlcCA9IE5VTEw7CisgICAgV0NIQVIJCSpleHRwID0gTlVMTDsKKyAgICBXQ0hBUgkJKmluaXRkaXJwID0gTlVMTDsKKyAgICBXQ0hBUgkJKmZpbHRlcnA7CisgICAgY2hhcl91CQkqcDsKKworICAgIGlmIChkZmx0ID09IE5VTEwpCisJZmlsZUJ1ZlswXSA9IE5VTDsKKyAgICBlbHNlCisgICAgeworCXdwID0gZW5jX3RvX3VjczIoZGZsdCwgTlVMTCk7CisJaWYgKHdwID09IE5VTEwpCisJICAgIGZpbGVCdWZbMF0gPSBOVUw7CisJZWxzZQorCXsKKwkgICAgZm9yIChpID0gMDsgd3BbaV0gIT0gTlVMICYmIGkgPCBNQVhQQVRITCAtIDE7ICsraSkKKwkJZmlsZUJ1ZltpXSA9IHdwW2ldOworCSAgICBmaWxlQnVmW2ldID0gTlVMOworCSAgICB2aW1fZnJlZSh3cCk7CisJfQorICAgIH0KKworICAgIC8qIENvbnZlcnQgdGhlIGZpbHRlciB0byBXaW5kb3dzIGZvcm1hdC4gKi8KKyAgICBmaWx0ZXJwID0gY29udmVydF9maWx0ZXJXKGZpbHRlcik7CisKKyAgICBtZW1zZXQoJmZpbGVTdHJ1Y3QsIDAsIHNpemVvZihPUEVORklMRU5BTUVXKSk7CisjaWZkZWYgT1BFTkZJTEVOQU1FX1NJWkVfVkVSU0lPTl80MDAKKyAgICAvKiBiZSBjb21wYXRpYmxlIHdpdGggV2luZG93cyBOVCA0LjAgKi8KKyAgICAvKiBUT0RPOiB3aGF0IHRvIHVzZSBmb3IgT1BFTkZJTEVOQU1FVz8/PyAqLworICAgIGZpbGVTdHJ1Y3QubFN0cnVjdFNpemUgPSBzaXplb2YoT1BFTkZJTEVOQU1FX1NJWkVfVkVSU0lPTl80MDApOworI2Vsc2UKKyAgICBmaWxlU3RydWN0LmxTdHJ1Y3RTaXplID0gc2l6ZW9mKGZpbGVTdHJ1Y3QpOworI2VuZGlmCisKKyAgICBpZiAodGl0bGUgIT0gTlVMTCkKKwl0aXRsZXAgPSBlbmNfdG9fdWNzMih0aXRsZSwgTlVMTCk7CisgICAgZmlsZVN0cnVjdC5scHN0clRpdGxlID0gdGl0bGVwOworCisgICAgaWYgKGV4dCAhPSBOVUxMKQorCWV4dHAgPSBlbmNfdG9fdWNzMihleHQsIE5VTEwpOworICAgIGZpbGVTdHJ1Y3QubHBzdHJEZWZFeHQgPSBleHRwOworCisgICAgZmlsZVN0cnVjdC5scHN0ckZpbGUgPSBmaWxlQnVmOworICAgIGZpbGVTdHJ1Y3Qubk1heEZpbGUgPSBNQVhQQVRITDsKKyAgICBmaWxlU3RydWN0Lmxwc3RyRmlsdGVyID0gZmlsdGVycDsKKyAgICBmaWxlU3RydWN0Lmh3bmRPd25lciA9IHNfaHduZDsJCS8qIG1haW4gVmltIHdpbmRvdyBpcyBvd25lciovCisgICAgLyogaGFzIGFuIGluaXRpYWwgZGlyIGJlZW4gc3BlY2lmaWVkPyAqLworICAgIGlmIChpbml0ZGlyICE9IE5VTEwgJiYgKmluaXRkaXIgIT0gTlVMKQorICAgIHsKKwkvKiBNdXN0IGhhdmUgYmFja3NsYXNoZXMgaGVyZSwgbm8gbWF0dGVyIHdoYXQgJ3NoZWxsc2xhc2gnIHNheXMgKi8KKwlpbml0ZGlycCA9IGVuY190b191Y3MyKGluaXRkaXIsIE5VTEwpOworCWlmIChpbml0ZGlycCAhPSBOVUxMKQorCXsKKwkgICAgZm9yICh3cCA9IGluaXRkaXJwOyAqd3AgIT0gTlVMOyArK3dwKQorCQlpZiAoKndwID09ICcvJykKKwkJICAgICp3cCA9ICdcXCc7CisJfQorCWZpbGVTdHJ1Y3QubHBzdHJJbml0aWFsRGlyID0gaW5pdGRpcnA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUT0RPOiBBbGxvdyBzZWxlY3Rpb24gb2YgbXVsdGlwbGUgZmlsZXMuICBOZWVkcyBhbm90aGVyIGFyZyB0byB0aGlzCisgICAgICogZnVuY3Rpb24gdG8gYXNrIGZvciBpdCwgYW5kIG5lZWQgdG8gdXNlIE9GTl9BTExPV01VTFRJU0VMRUNUIGJlbG93LgorICAgICAqIEFsc28sIHNob3VsZCB3ZSB1c2UgT0ZOX0ZJTEVNVVNURVhJU1Qgd2hlbiBvcGVuaW5nPyAgVmltIGNhbiBlZGl0IG9uCisgICAgICogZmlsZXMgdGhhdCBkb24ndCBleGlzdCB5ZXQsIHNvIEkgaGF2ZW4ndCBwdXQgaXQgaW4uICBXaGF0IGFib3V0CisgICAgICogT0ZOX1BBVEhNVVNURVhJU1Q/CisgICAgICogRG9uJ3QgdXNlIE9GTl9PVkVSV1JJVEVQUk9NUFQsIFZpbSBoYXMgaXRzIG93biAiOmNvbmZpcm0iIGRpYWxvZy4KKyAgICAgKi8KKyAgICBmaWxlU3RydWN0LkZsYWdzID0gKE9GTl9OT0NIQU5HRURJUiB8IE9GTl9QQVRITVVTVEVYSVNUIHwgT0ZOX0hJREVSRUFET05MWSk7CisjaWZkZWYgRkVBVF9TSE9SVENVVAorICAgIGlmIChjdXJidWYtPmJfcF9iaW4pCisJZmlsZVN0cnVjdC5GbGFncyB8PSBPRk5fTk9ERVJFRkVSRU5DRUxJTktTOworI2VuZGlmCisgICAgaWYgKHNhdmluZykKKyAgICB7CisJaWYgKCFHZXRTYXZlRmlsZU5hbWVXKCZmaWxlU3RydWN0KSkKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKCFHZXRPcGVuRmlsZU5hbWVXKCZmaWxlU3RydWN0KSkKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdmltX2ZyZWUoZmlsdGVycCk7CisgICAgdmltX2ZyZWUoaW5pdGRpcnApOworICAgIHZpbV9mcmVlKHRpdGxlcCk7CisgICAgdmltX2ZyZWUoZXh0cCk7CisKKyAgICAvKiBDb252ZXJ0IGZyb20gVUNTMiB0byAnZW5jb2RpbmcnLiAqLworICAgIHAgPSB1Y3MyX3RvX2VuYyhmaWxlQnVmLCBOVUxMKTsKKyAgICBpZiAocCAhPSBOVUxMKQorCS8qIHdoZW4gb3V0IG9mIG1lbW9yeSB3ZSBnZXQgZ2FyYmFnZSBmb3Igbm9uLUFTQ0lJIGNoYXJzICovCisJU1RSQ1BZKGZpbGVCdWYsIHApOworICAgIHZpbV9mcmVlKHApOworCisgICAgLyogR2l2ZSBmb2N1cyBiYWNrIHRvIG1haW4gd2luZG93ICh3aGVuIHVzaW5nIE1ESSkuICovCisgICAgU2V0Rm9jdXMoc19od25kKTsKKworICAgIC8qIFNob3J0ZW4gdGhlIGZpbGUgbmFtZSBpZiBwb3NzaWJsZSAqLworICAgIG1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKTsKKyAgICBwID0gc2hvcnRlbl9mbmFtZSgoY2hhcl91ICopZmlsZUJ1ZiwgSU9idWZmKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXAgPSAoY2hhcl91ICopZmlsZUJ1ZjsKKyAgICByZXR1cm4gdmltX3N0cnNhdmUocCk7Cit9CisjIGVuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworCisvKgorICogQ29udmVydCB0aGUgc3RyaW5nIHMgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIGEgZmlsdGVyIHN0cmluZyBieSByZXBsYWNpbmcKKyAqIHRoZSBcdCBhbmQgXG4gZGVsaW1ldGVycyB3aXRoIFwwLgorICogUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZyBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIEtlZXAgaW4gc3luYyB3aXRoIGNvbnZlcnRfZmlsdGVyVygpIGFib3ZlIQorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjb252ZXJ0X2ZpbHRlcihjaGFyX3UgKnMpCit7CisgICAgY2hhcl91CSpyZXM7CisgICAgdW5zaWduZWQJc19sZW4gPSAodW5zaWduZWQpU1RSTEVOKHMpOworICAgIHVuc2lnbmVkCWk7CisKKyAgICByZXMgPSBhbGxvYyhzX2xlbiArIDMpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IHNfbGVuOyArK2kpCisJICAgIGlmIChzW2ldID09ICdcdCcgfHwgc1tpXSA9PSAnXG4nKQorCQlyZXNbaV0gPSAnXDAnOworCSAgICBlbHNlCisJCXJlc1tpXSA9IHNbaV07CisJcmVzW3NfbGVuXSA9IE5VTDsKKwkvKiBBZGQgdHdvIGV4dHJhIE5VTHMgdG8gbWFrZSBzdXJlIGl0J3MgcHJvcGVybHkgdGVybWluYXRlZC4gKi8KKwlyZXNbc19sZW4gKyAxXSA9IE5VTDsKKwlyZXNbc19sZW4gKyAyXSA9IE5VTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFBvcCBvcGVuIGEgZmlsZSBicm93c2VyIGFuZCByZXR1cm4gdGhlIGZpbGUgc2VsZWN0ZWQsIGluIGFsbG9jYXRlZCBtZW1vcnksCisgKiBvciBOVUxMIGlmIENhbmNlbCBpcyBoaXQuCisgKiAgc2F2aW5nICAtIFRSVUUgaWYgdGhlIGZpbGUgd2lsbCBiZSBzYXZlZCB0bywgRkFMU0UgaWYgaXQgd2lsbCBiZSBvcGVuZWQuCisgKiAgdGl0bGUgICAtIFRpdGxlIG1lc3NhZ2UgZm9yIHRoZSBmaWxlIGJyb3dzZXIgZGlhbG9nLgorICogIGRmbHQgICAgLSBEZWZhdWx0IG5hbWUgb2YgZmlsZS4KKyAqICBleHQgICAgIC0gRGVmYXVsdCBleHRlbnNpb24gdG8gYmUgYWRkZWQgdG8gZmlsZXMgd2l0aG91dCBleHRlbnNpb25zLgorICogIGluaXRkaXIgLSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gb3BlbiB0aGUgYnJvd3NlciAoTlVMTCA9IGN1cnJlbnQgZGlyKQorICogIGZpbHRlciAgLSBGaWx0ZXIgZm9yIG1hdGNoZWQgZmlsZXMgdG8gY2hvb3NlIGZyb20uCisgKgorICogS2VlcCBpbiBzeW5jIHdpdGggZ3VpX21jaF9icm93c2VXKCkgYWJvdmUhCisgKi8KKyAgICBjaGFyX3UgKgorZ3VpX21jaF9icm93c2UoCisJaW50IHNhdmluZywKKwljaGFyX3UgKnRpdGxlLAorCWNoYXJfdSAqZGZsdCwKKwljaGFyX3UgKmV4dCwKKwljaGFyX3UgKmluaXRkaXIsCisJY2hhcl91ICpmaWx0ZXIpCit7CisgICAgT1BFTkZJTEVOQU1FCWZpbGVTdHJ1Y3Q7CisgICAgY2hhcl91CQlmaWxlQnVmW01BWFBBVEhMXTsKKyAgICBjaGFyX3UJCSppbml0ZGlycCA9IE5VTEw7CisgICAgY2hhcl91CQkqZmlsdGVycDsKKyAgICBjaGFyX3UJCSpwOworCisjIGlmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChXSU4zMjY0KQorICAgIGlmIChvc192ZXJzaW9uLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpCisJcmV0dXJuIGd1aV9tY2hfYnJvd3NlVyhzYXZpbmcsIHRpdGxlLCBkZmx0LCBleHQsIGluaXRkaXIsIGZpbHRlcik7CisjIGVuZGlmCisKKyAgICBpZiAoZGZsdCA9PSBOVUxMKQorCWZpbGVCdWZbMF0gPSBOVUw7CisgICAgZWxzZQorICAgIHsKKwlTVFJOQ1BZKGZpbGVCdWYsIGRmbHQsIE1BWFBBVEhMIC0gMSk7CisJZmlsZUJ1ZltNQVhQQVRITCAtIDFdID0gTlVMOworICAgIH0KKworICAgIC8qIENvbnZlcnQgdGhlIGZpbHRlciB0byBXaW5kb3dzIGZvcm1hdC4gKi8KKyAgICBmaWx0ZXJwID0gY29udmVydF9maWx0ZXIoZmlsdGVyKTsKKworICAgIG1lbXNldCgmZmlsZVN0cnVjdCwgMCwgc2l6ZW9mKE9QRU5GSUxFTkFNRSkpOworI2lmZGVmIE9QRU5GSUxFTkFNRV9TSVpFX1ZFUlNJT05fNDAwCisgICAgLyogYmUgY29tcGF0aWJsZSB3aXRoIFdpbmRvd3MgTlQgNC4wICovCisgICAgZmlsZVN0cnVjdC5sU3RydWN0U2l6ZSA9IHNpemVvZihPUEVORklMRU5BTUVfU0laRV9WRVJTSU9OXzQwMCk7CisjZWxzZQorICAgIGZpbGVTdHJ1Y3QubFN0cnVjdFNpemUgPSBzaXplb2YoZmlsZVN0cnVjdCk7CisjZW5kaWYKKworICAgIGZpbGVTdHJ1Y3QubHBzdHJUaXRsZSA9IHRpdGxlOworICAgIGZpbGVTdHJ1Y3QubHBzdHJEZWZFeHQgPSBleHQ7CisKKyAgICBmaWxlU3RydWN0Lmxwc3RyRmlsZSA9IGZpbGVCdWY7CisgICAgZmlsZVN0cnVjdC5uTWF4RmlsZSA9IE1BWFBBVEhMOworICAgIGZpbGVTdHJ1Y3QubHBzdHJGaWx0ZXIgPSBmaWx0ZXJwOworICAgIGZpbGVTdHJ1Y3QuaHduZE93bmVyID0gc19od25kOwkJLyogbWFpbiBWaW0gd2luZG93IGlzIG93bmVyKi8KKyAgICAvKiBoYXMgYW4gaW5pdGlhbCBkaXIgYmVlbiBzcGVjaWZpZWQ/ICovCisgICAgaWYgKGluaXRkaXIgIT0gTlVMTCAmJiAqaW5pdGRpciAhPSBOVUwpCisgICAgeworCS8qIE11c3QgaGF2ZSBiYWNrc2xhc2hlcyBoZXJlLCBubyBtYXR0ZXIgd2hhdCAnc2hlbGxzbGFzaCcgc2F5cyAqLworCWluaXRkaXJwID0gdmltX3N0cnNhdmUoaW5pdGRpcik7CisJaWYgKGluaXRkaXJwICE9IE5VTEwpCisJICAgIGZvciAocCA9IGluaXRkaXJwOyAqcCAhPSBOVUw7ICsrcCkKKwkJaWYgKCpwID09ICcvJykKKwkJICAgICpwID0gJ1xcJzsKKwlmaWxlU3RydWN0Lmxwc3RySW5pdGlhbERpciA9IGluaXRkaXJwOworICAgIH0KKworICAgIC8qCisgICAgICogVE9ETzogQWxsb3cgc2VsZWN0aW9uIG9mIG11bHRpcGxlIGZpbGVzLiAgTmVlZHMgYW5vdGhlciBhcmcgdG8gdGhpcworICAgICAqIGZ1bmN0aW9uIHRvIGFzayBmb3IgaXQsIGFuZCBuZWVkIHRvIHVzZSBPRk5fQUxMT1dNVUxUSVNFTEVDVCBiZWxvdy4KKyAgICAgKiBBbHNvLCBzaG91bGQgd2UgdXNlIE9GTl9GSUxFTVVTVEVYSVNUIHdoZW4gb3BlbmluZz8gIFZpbSBjYW4gZWRpdCBvbgorICAgICAqIGZpbGVzIHRoYXQgZG9uJ3QgZXhpc3QgeWV0LCBzbyBJIGhhdmVuJ3QgcHV0IGl0IGluLiAgV2hhdCBhYm91dAorICAgICAqIE9GTl9QQVRITVVTVEVYSVNUPworICAgICAqIERvbid0IHVzZSBPRk5fT1ZFUldSSVRFUFJPTVBULCBWaW0gaGFzIGl0cyBvd24gIjpjb25maXJtIiBkaWFsb2cuCisgICAgICovCisgICAgZmlsZVN0cnVjdC5GbGFncyA9IChPRk5fTk9DSEFOR0VESVIgfCBPRk5fUEFUSE1VU1RFWElTVCB8IE9GTl9ISURFUkVBRE9OTFkpOworI2lmZGVmIEZFQVRfU0hPUlRDVVQKKyAgICBpZiAoY3VyYnVmLT5iX3BfYmluKQorCWZpbGVTdHJ1Y3QuRmxhZ3MgfD0gT0ZOX05PREVSRUZFUkVOQ0VMSU5LUzsKKyNlbmRpZgorICAgIGlmIChzYXZpbmcpCisgICAgeworCWlmICghR2V0U2F2ZUZpbGVOYW1lKCZmaWxlU3RydWN0KSkKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKCFHZXRPcGVuRmlsZU5hbWUoJmZpbGVTdHJ1Y3QpKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aW1fZnJlZShmaWx0ZXJwKTsKKyAgICB2aW1fZnJlZShpbml0ZGlycCk7CisKKyAgICAvKiBHaXZlIGZvY3VzIGJhY2sgdG8gbWFpbiB3aW5kb3cgKHdoZW4gdXNpbmcgTURJKS4gKi8KKyAgICBTZXRGb2N1cyhzX2h3bmQpOworCisgICAgLyogU2hvcnRlbiB0aGUgZmlsZSBuYW1lIGlmIHBvc3NpYmxlICovCisgICAgbWNoX2Rpcm5hbWUoSU9idWZmLCBJT1NJWkUpOworICAgIHAgPSBzaG9ydGVuX2ZuYW1lKChjaGFyX3UgKilmaWxlQnVmLCBJT2J1ZmYpOworICAgIGlmIChwID09IE5VTEwpCisJcCA9IChjaGFyX3UgKilmaWxlQnVmOworICAgIHJldHVybiB2aW1fc3Ryc2F2ZShwKTsKK30KKyNlbmRpZiAvKiBGRUFUX0JST1dTRSAqLworCisgICAgc3RhdGljIHZvaWQKK19PbkRyb3BGaWxlcygKKyAgICBIV05EIGh3bmQsCisgICAgSERST1AgaERyb3ApCit7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisjaWZkZWYgV0lOMzI2NAorIyBkZWZpbmUgQlVGUEFUSExFTiBfTUFYX1BBVEgKKyMgZGVmaW5lIERSQUdRVkFMIDB4RkZGRkZGRkYKKyNlbHNlCisjIGRlZmluZSBCVUZQQVRITEVOIE1BWFBBVEhMCisjIGRlZmluZSBEUkFHUVZBTCAweEZGRkYKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBXQ0hBUiAgIHdzekZpbGVbQlVGUEFUSExFTl07CisjZW5kaWYKKyAgICBjaGFyICAgIHN6RmlsZVtCVUZQQVRITEVOXTsKKyAgICBVSU5UICAgIGNGaWxlcyA9IERyYWdRdWVyeUZpbGUoaERyb3AsIERSQUdRVkFMLCBOVUxMLCAwKTsKKyAgICBVSU5UICAgIGk7CisgICAgY2hhcl91ICAqKmZuYW1lczsKKyAgICBQT0lOVCAgIHB0OworICAgIGludF91ICAgbW9kaWZpZXJzID0gMDsKKworICAgIC8qIFRSQUNFKCJfT25Ecm9wRmlsZXM6ICVkIGZpbGVzIGRyb3BwZWRcbiIsIGNGaWxlcyk7ICovCisKKyAgICAvKiBPYnRhaW4gZHJvcHBlZCBwb3NpdGlvbiAqLworICAgIERyYWdRdWVyeVBvaW50KGhEcm9wLCAmcHQpOworICAgIE1hcFdpbmRvd1BvaW50cyhzX2h3bmQsIHNfdGV4dEFyZWEsICZwdCwgMSk7CisKKyMgaWZkZWYgRkVBVF9WSVNVQUwKKyAgICByZXNldF9WSXN1YWwoKTsKKyMgZW5kaWYKKworICAgIGZuYW1lcyA9IChjaGFyX3UgKiopYWxsb2MoY0ZpbGVzICogc2l6ZW9mKGNoYXJfdSAqKSk7CisKKyAgICBpZiAoZm5hbWVzICE9IE5VTEwpCisJZm9yIChpID0gMDsgaSA8IGNGaWxlczsgKytpKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChEcmFnUXVlcnlGaWxlVyhoRHJvcCwgaSwgd3N6RmlsZSwgQlVGUEFUSExFTikgPiAwKQorCQlmbmFtZXNbaV0gPSB1Y3MyX3RvX2VuYyh3c3pGaWxlLCBOVUxMKTsKKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJRHJhZ1F1ZXJ5RmlsZShoRHJvcCwgaSwgc3pGaWxlLCBCVUZQQVRITEVOKTsKKwkJZm5hbWVzW2ldID0gdmltX3N0cnNhdmUoc3pGaWxlKTsKKwkgICAgfQorCX0KKworICAgIERyYWdGaW5pc2goaERyb3ApOworCisgICAgaWYgKGZuYW1lcyAhPSBOVUxMKQorICAgIHsKKwlpZiAoKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMCkgIT0gMCkKKwkgICAgbW9kaWZpZXJzIHw9IE1PVVNFX1NISUZUOworCWlmICgoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDApICE9IDApCisJICAgIG1vZGlmaWVycyB8PSBNT1VTRV9DVFJMOworCWlmICgoR2V0S2V5U3RhdGUoVktfTUVOVSkgJiAweDgwMDApICE9IDApCisJICAgIG1vZGlmaWVycyB8PSBNT1VTRV9BTFQ7CisKKwlndWlfaGFuZGxlX2Ryb3AocHQueCwgcHQueSwgbW9kaWZpZXJzLCBmbmFtZXMsIGNGaWxlcyk7CisKKwlzX25lZWRfYWN0aXZhdGUgPSBUUlVFOworICAgIH0KKyNlbmRpZgorfQorCisgICAgc3RhdGljIGludAorX09uU2Nyb2xsKAorICAgIEhXTkQgaHduZCwKKyAgICBIV05EIGh3bmRDdGwsCisgICAgVUlOVCBjb2RlLAorICAgIGludCBwb3MpCit7CisgICAgc3RhdGljIFVJTlQJcHJldl9jb2RlID0gMDsgICAvKiBjb2RlIG9mIHByZXZpb3VzIGNhbGwgKi8KKyAgICBzY3JvbGxiYXJfVCAqc2IsICpzYl9pbmZvOworICAgIGxvbmcJdmFsOworICAgIGludAkJZHJhZ2dpbmcgPSBGQUxTRTsKKyAgICBpbnQJCWRvbnRfc2Nyb2xsX3NhdmUgPSBkb250X3Njcm9sbDsKKyNpZm5kZWYgV0lOMzI2NAorICAgIGludAkJblBvczsKKyNlbHNlCisgICAgU0NST0xMSU5GTwlzaTsKKworICAgIHNpLmNiU2l6ZSA9IHNpemVvZihzaSk7CisgICAgc2kuZk1hc2sgPSBTSUZfUE9TOworI2VuZGlmCisKKyAgICBzYiA9IGd1aV9tc3dpbl9maW5kX3Njcm9sbGJhcihod25kQ3RsKTsKKyAgICBpZiAoc2IgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKworICAgIGlmIChzYi0+d3AgIT0gTlVMTCkJCS8qIExlZnQgb3IgcmlnaHQgc2Nyb2xsYmFyICovCisgICAgeworCS8qCisJICogQ2FyZWZ1bDogbmVlZCB0byBnZXQgc2Nyb2xsYmFyIGluZm8gb3V0IG9mIGZpcnN0IChsZWZ0KSBzY3JvbGxiYXIKKwkgKiBmb3Igd2luZG93LCBidXQga2VlcCByZWFsIHNjcm9sbGJhciB0b28gYmVjYXVzZSB3ZSBtdXN0IHBhc3MgaXQgdG8KKwkgKiBndWlfZHJhZ19zY3JvbGxiYXIoKS4KKwkgKi8KKwlzYl9pbmZvID0gJnNiLT53cC0+d19zY3JvbGxiYXJzWzBdOworICAgIH0KKyAgICBlbHNlCSAgICAvKiBCb3R0b20gc2Nyb2xsYmFyICovCisJc2JfaW5mbyA9IHNiOworICAgIHZhbCA9IHNiX2luZm8tPnZhbHVlOworCisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKwljYXNlIFNCX1RIVU1CVFJBQ0s6CisJICAgIHZhbCA9IHBvczsKKwkgICAgZHJhZ2dpbmcgPSBUUlVFOworCSAgICBpZiAoc2ItPnNjcm9sbF9zaGlmdCA+IDApCisJCXZhbCA8PD0gc2ItPnNjcm9sbF9zaGlmdDsKKwkgICAgYnJlYWs7CisJY2FzZSBTQl9MSU5FRE9XTjoKKwkgICAgdmFsKys7CisJICAgIGJyZWFrOworCWNhc2UgU0JfTElORVVQOgorCSAgICB2YWwtLTsKKwkgICAgYnJlYWs7CisJY2FzZSBTQl9QQUdFRE9XTjoKKwkgICAgdmFsICs9IChzYl9pbmZvLT5zaXplID4gMiA/IHNiX2luZm8tPnNpemUgLSAyIDogMSk7CisJICAgIGJyZWFrOworCWNhc2UgU0JfUEFHRVVQOgorCSAgICB2YWwgLT0gKHNiX2luZm8tPnNpemUgPiAyID8gc2JfaW5mby0+c2l6ZSAtIDIgOiAxKTsKKwkgICAgYnJlYWs7CisJY2FzZSBTQl9UT1A6CisJICAgIHZhbCA9IDA7CisJICAgIGJyZWFrOworCWNhc2UgU0JfQk9UVE9NOgorCSAgICB2YWwgPSBzYl9pbmZvLT5tYXg7CisJICAgIGJyZWFrOworCWNhc2UgU0JfRU5EU0NST0xMOgorCSAgICBpZiAocHJldl9jb2RlID09IFNCX1RIVU1CVFJBQ0spCisJICAgIHsKKwkJLyoKKwkJICogInBvcyIgb25seSBnaXZlcyB1cyAxNi1iaXQgZGF0YS4gIEluIGNhc2Ugb2YgbGFyZ2UgZmlsZSwKKwkJICogdXNlIEdldFNjcm9sbFBvcygpIHdoaWNoIHJldHVybnMgMzItYml0LiAgVW5mb3J0dW5hdGVseSBpdAorCQkgKiBpcyBub3QgdmFsaWQgd2hpbGUgdGhlIHNjcm9sbGJhciBpcyBiZWluZyBkcmFnZ2VkLgorCQkgKi8KKwkJdmFsID0gR2V0U2Nyb2xsUG9zKGh3bmRDdGwsIFNCX0NUTCk7CisJCWlmIChzYi0+c2Nyb2xsX3NoaWZ0ID4gMCkKKwkJICAgIHZhbCA8PD0gc2ItPnNjcm9sbF9zaGlmdDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIC8qIFRSQUNFKCJVbmtub3duIHNjcm9sbGJhciBldmVudCAlZFxuIiwgY29kZSk7ICovCisJICAgIHJldHVybiAwOworICAgIH0KKyAgICBwcmV2X2NvZGUgPSBjb2RlOworCisjaWZkZWYgV0lOMzI2NAorICAgIHNpLm5Qb3MgPSAoc2ItPnNjcm9sbF9zaGlmdCA+IDApID8gdmFsID4+IHNiLT5zY3JvbGxfc2hpZnQgOiB2YWw7CisgICAgU2V0U2Nyb2xsSW5mbyhod25kQ3RsLCBTQl9DVEwsICZzaSwgVFJVRSk7CisjZWxzZQorICAgIG5Qb3MgPSAoc2ItPnNjcm9sbF9zaGlmdCA+IDApID8gdmFsID4+IHNiLT5zY3JvbGxfc2hpZnQgOiB2YWw7CisgICAgU2V0U2Nyb2xsUG9zKGh3bmRDdGwsIFNCX0NUTCwgblBvcywgVFJVRSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2hlbiBtb3ZpbmcgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIsIG1vdmUgdGhlIG90aGVyIHZlcnRpY2FsIHNjcm9sbGJhciB0b28uCisgICAgICovCisgICAgaWYgKHNiLT53cCAhPSBOVUxMKQorICAgIHsKKwlzY3JvbGxiYXJfVCAqc2JhID0gc2ItPndwLT53X3Njcm9sbGJhcnM7CisJSFdORCAgICBpZCA9IHNiYVsgKHNiID09IHNiYSArIFNCQVJfTEVGVCkgPyBTQkFSX1JJR0hUIDogU0JBUl9MRUZUXS5pZDsKKworI2lmZGVmIFdJTjMyNjQKKwlTZXRTY3JvbGxJbmZvKGlkLCBTQl9DVEwsICZzaSwgVFJVRSk7CisjZWxzZQorCVNldFNjcm9sbFBvcyhpZCwgU0JfQ1RMLCBuUG9zLCBUUlVFKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIERvbid0IGxldCB1cyBiZSBpbnRlcnJ1cHRlZCBoZXJlIGJ5IGFub3RoZXIgbWVzc2FnZS4gKi8KKyAgICBzX2J1c3lfcHJvY2Vzc2luZyA9IFRSVUU7CisKKyAgICAvKiBXaGVuICJhbGxvd19zY3JvbGxiYXIiIGlzIEZBTFNFIHN0aWxsIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG5ldworICAgICAqIHBvc2l0aW9uLCBidXQgZG9uJ3QgYWN0dWFsbHkgc2Nyb2xsIGJ5IHNldHRpbmcgImRvbnRfc2Nyb2xsIi4gKi8KKyAgICBkb250X3Njcm9sbCA9ICFhbGxvd19zY3JvbGxiYXI7CisKKyAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbCwgZHJhZ2dpbmcpOworCisgICAgc19idXN5X3Byb2Nlc3NpbmcgPSBGQUxTRTsKKyAgICBkb250X3Njcm9sbCA9IGRvbnRfc2Nyb2xsX3NhdmU7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICogVXNlICJwcm9nIiBhcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBhbmQgImNtZGxpbmUiIGFzIHRoZSBhcmd1bWVudHMuCisgKiBDb3B5IHRoZSBhcmd1bWVudHMgdG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5jbHVkaW5nIHByb2dyYW0gbmFtZSkuCisgKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGFyZ3VtZW50cyBpbiAiYXJndnAiLgorICogUmV0dXJuIHBvaW50ZXIgdG8gYnVmZmVyIGluICJ0b2ZyZWUiLgorICogUmV0dXJucyB6ZXJvIHdoZW4gb3V0IG9mIG1lbW9yeS4KKyAqLworICAgIGludAorZ2V0X2NtZF9hcmdzKGNoYXIgKnByb2csIGNoYXIgKmNtZGxpbmUsIGNoYXIgKioqYXJndnAsIGNoYXIgKip0b2ZyZWUpCit7CisgICAgaW50CQlpOworICAgIGNoYXIJKnA7CisgICAgY2hhcgkqcHJvZ3A7CisgICAgY2hhcgkqcG5ldyA9IE5VTEw7CisgICAgY2hhcgkqbmV3Y21kbGluZTsKKyAgICBpbnQJCWlucXVvdGU7CisgICAgaW50CQlhcmdjOworICAgIGNoYXIJKiphcmd2ID0gTlVMTDsKKyAgICBpbnQJCXJvdW5kOworCisgICAgLyogSGFuZGxlIHRoZSBwcm9ncmFtIG5hbWUuICBSZW1vdmUgdGhlICIuZXhlIiBleHRlbnNpb24sIGFuZCBmaW5kIHRoZSAxc3QKKyAgICAgKiBub24tc3BhY2UuICovCisgICAgcCA9IHN0cnJjaHIocHJvZywgJy4nKTsKKyAgICBpZiAocCAhPSBOVUxMKQorCSpwID0gTlVMOworICAgIGZvciAocHJvZ3AgPSBwcm9nOyAqcHJvZ3AgPT0gJyAnOyArK3Byb2dwKQorCTsKKworICAgIC8qIFRoZSBjb21tYW5kIGxpbmUgaXMgY29waWVkIHRvIGFsbG9jYXRlZCBtZW1vcnksIHNvIHRoYXQgd2UgY2FuIGNoYW5nZQorICAgICAqIGl0LiAgQWRkIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcsIHRoZSBzZXBhcmF0aW5nIE5VTCBhbmQgYSB0ZXJtaW5hdGluZworICAgICAqIE5VTC4gKi8KKyAgICBuZXdjbWRsaW5lID0gbWFsbG9jKFNUUkxFTihjbWRsaW5lKSArIFNUUkxFTihwcm9ncCkgKyAyKTsKKyAgICBpZiAobmV3Y21kbGluZSA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgLyoKKyAgICAgKiBGaXJzdCByb3VuZDogY291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKCJwbmV3IiA9PSBOVUxMKS4KKyAgICAgKiBTZWNvbmQgcm91bmQ6IHByb2R1Y2UgdGhlIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKyAgICB7CisJLyogRmlyc3QgYXJndW1lbnQgaXMgdGhlIHByb2dyYW0gbmFtZS4gKi8KKwlpZiAocG5ldyAhPSBOVUxMKQorCXsKKwkgICAgYXJndlswXSA9IHBuZXc7CisJICAgIHN0cmNweShwbmV3LCBwcm9ncCk7CisJICAgIHBuZXcgKz0gc3RybGVuKHBuZXcpOworCSAgICAqcG5ldysrID0gTlVMOworCX0KKworCS8qCisJICogSXNvbGF0ZSBlYWNoIGFyZ3VtZW50IGFuZCBwdXQgaXQgaW4gYXJndltdLgorCSAqLworCXAgPSBjbWRsaW5lOworCWFyZ2MgPSAxOworCXdoaWxlICgqcCAhPSBOVUwpCisJeworCSAgICBpbnF1b3RlID0gRkFMU0U7CisJICAgIGlmIChwbmV3ICE9IE5VTEwpCisJCWFyZ3ZbYXJnY10gPSBwbmV3OworCSAgICArK2FyZ2M7CisJICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKGlucXVvdGUgfHwgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnKSkpCisJICAgIHsKKwkJLyogQmFja3NsYXNoZXMgYXJlIG9ubHkgc3BlY2lhbCB3aGVuIGZvbGxvd2VkIGJ5IGEgZG91YmxlCisJCSAqIHF1b3RlLiAqLworCQlpID0gc3Ryc3BuKHAsICJcXCIpOworCQlpZiAocFtpXSA9PSAnIicpCisJCXsKKwkJICAgIC8qIEhhbHZlIHRoZSBudW1iZXIgb2YgYmFja3NsYXNoZXMuICovCisJCSAgICBpZiAoaSA+IDEgJiYgcG5ldyAhPSBOVUxMKQorCQkgICAgeworCQkJbWVtc2V0KHBuZXcsICdcXCcsIGkgLyAyKTsKKwkJCXBuZXcgKz0gaSAvIDI7CisJCSAgICB9CisKKwkJICAgIC8qIEV2ZW4gbnIgb2YgYmFja3NsYXNoZXMgdG9nZ2xlcyBxdW90aW5nLCB1bmV2ZW4gY29waWVzCisJCSAgICAgKiB0aGUgZG91YmxlIHF1b3RlLiAqLworCQkgICAgaWYgKChpICYgMSkgPT0gMCkKKwkJCWlucXVvdGUgPSAhaW5xdW90ZTsKKwkJICAgIGVsc2UgaWYgKHBuZXcgIT0gTlVMTCkKKwkJCSpwbmV3KysgPSAnIic7CisJCSAgICBwICs9IGkgKyAxOworCQl9CisJCWVsc2UgaWYgKGkgPiAwKQorCQl7CisJCSAgICAvKiBDb3B5IHNwYW4gb2YgYmFja3NsYXNoZXMgdW5tb2RpZmllZC4gKi8KKwkJICAgIGlmIChwbmV3ICE9IE5VTEwpCisJCSAgICB7CisJCQltZW1zZXQocG5ldywgJ1xcJywgaSk7CisJCQlwbmV3ICs9IGk7CisJCSAgICB9CisJCSAgICBwICs9IGk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBpZiAocG5ldyAhPSBOVUxMKQorCQkJKnBuZXcrKyA9ICpwOworCQkgICAgKytwOworCQl9CisJICAgIH0KKworCSAgICBpZiAocG5ldyAhPSBOVUwpCisJCSpwbmV3KysgPSBOVUw7CisJICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJKytwOwkJICAgIC8qIGFkdmFuY2UgdW50aWwgYSBub24tc3BhY2UgKi8KKwl9CisKKwlpZiAocm91bmQgPT0gMSkKKwl7CisJICAgIGFyZ3YgPSAoY2hhciAqKiltYWxsb2MoKGFyZ2MgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwkgICAgaWYgKGFyZ3YgPT0gTlVMTCApCisJCXJldHVybiAwOwkJICAgLyogbWFsbG9jIGVycm9yICovCisJICAgIHBuZXcgPSBuZXdjbWRsaW5lOworCX0KKyAgICB9CisKKyAgICBhcmd2W2FyZ2NdID0gTlVMTDsJCS8qIE5VTEwtdGVybWluYXRlZCBsaXN0ICovCisKKyAgICAqYXJndnAgPSBhcmd2OworICAgIHJldHVybiBhcmdjOworfQpkaWZmIC0tZ2l0IGEvc3JjL2d1aV94MTEuYyBiL3NyYy9ndWlfeDExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4N2UwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWlfeDExLmMKQEAgLTAsMCArMSwzNzQ4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKy8qCisgKiBDb21tb24gY29kZSBmb3IgdGhlIE1vdGlmIGFuZCBBdGhlbmEgR1VJLgorICogTm90IHVzZWQgZm9yIEdUSy4KKyAqLworCisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorI2luY2x1ZGUgPFgxMS9TdHJpbmdEZWZzLmg+CisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2luY2x1ZGUgPFgxMS9TaGVsbC5oPgorI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyoKKyAqIEZvciBXb3Jrc2hvcCBYcG1QLmggaXMgcHJlZmVycmVkLCBiZWNhdXNlIGl0IG1ha2VzIHRoZSBzaWducyBkcmF3biB3aXRoIGEKKyAqIHRyYW5zcGFyZW50IGJhY2tncm91bmQgaW5zdGVhZCBvZiBibGFjay4KKyAqLworI2lmIGRlZmluZWQoSEFWRV9YTV9YUE1QX0gpICYmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIFwKKwkmJiAoIWRlZmluZWQoSEFWRV9YMTFfWFBNX0gpIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApKQorIyBpbmNsdWRlIDxYbS9YcG1QLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1gxMV9YUE1fSAorIyAgaW5jbHVkZSA8WDExL3hwbS5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisjIGlmZGVmIFhfTE9DQUxFCisjICBpbmNsdWRlIDxYMTEvWGxvY2FsZS5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxsb2NhbGUuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YMTFfU1VOS0VZU1lNX0gKKyMgaW5jbHVkZSA8WDExL1N1bmtleXN5bS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1gxMV9YTVVfRURJVFJFU19ICisjIGluY2x1ZGUgPFgxMS9YbXUvRWRpdHJlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0JFVkFMX1RJUAorIyBpbmNsdWRlICJndWlfYmV2YWwuaCIKKyNlbmRpZgorCisjZGVmaW5lIFZJTV9OQU1FCSJ2aW0iCisjZGVmaW5lIFZJTV9DTEFTUwkiVmltIgorCisvKiBEZWZhdWx0IHJlc291cmNlIHZhbHVlcyAqLworI2RlZmluZSBERkxUX0ZPTlQJCSI3eDEzIgorI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisjIGRlZmluZSBERkxUX01FTlVfRk9OVAkJWHREZWZhdWx0Rm9udFNldAorI2Vsc2UKKyMgZGVmaW5lIERGTFRfTUVOVV9GT05UCQlYdERlZmF1bHRGb250CisjZW5kaWYKKyNkZWZpbmUgREZMVF9UT09MVElQX0ZPTlQJWHREZWZhdWx0Rm9udFNldAorCisjaWZkZWYgRkVBVF9HVUlfQVRIRU5BCisjIGRlZmluZSBERkxUX01FTlVfQkdfQ09MT1IJImdyYXk3NyIKKyMgZGVmaW5lIERGTFRfTUVOVV9GR19DT0xPUgkiYmxhY2siCisjIGRlZmluZSBERkxUX1NDUk9MTF9CR19DT0xPUgkiZ3JheTYwIgorIyBkZWZpbmUgREZMVF9TQ1JPTExfRkdfQ09MT1IJImdyYXk3NyIKKyMgZGVmaW5lIERGTFRfVE9PTFRJUF9CR19DT0xPUgkiI2ZmZmZmZmZmOTE5MSIKKyMgZGVmaW5lIERGTFRfVE9PTFRJUF9GR19DT0xPUgkiIzAwMDAwMDAwMDAwMCIKKyNlbHNlCisvKiB1c2UgdGhlIGRlZmF1bHQgKENERSkgY29sb3JzICovCisjIGRlZmluZSBERkxUX01FTlVfQkdfQ09MT1IJIiIKKyMgZGVmaW5lIERGTFRfTUVOVV9GR19DT0xPUgkiIgorIyBkZWZpbmUgREZMVF9TQ1JPTExfQkdfQ09MT1IJIiIKKyMgZGVmaW5lIERGTFRfU0NST0xMX0ZHX0NPTE9SCSIiCisjIGRlZmluZSBERkxUX1RPT0xUSVBfQkdfQ09MT1IJIiNmZmZmZmZmZjkxOTEiCisjIGRlZmluZSBERkxUX1RPT0xUSVBfRkdfQ09MT1IJIiMwMDAwMDAwMDAwMDAiCisjZW5kaWYKKworV2lkZ2V0IHZpbVNoZWxsID0gKFdpZGdldCkwOworCitzdGF0aWMgQXRvbSAgIHdtX2F0b21zWzJdOwkvKiBXaW5kb3cgTWFuYWdlciBBdG9tcyAqLworI2RlZmluZSBERUxFVEVfV0lORE9XX0lEWCAwCS8qIGluZGV4IGluIHdtX2F0b21zW10gZm9yIFdNX0RFTEVURV9XSU5ET1cgKi8KKyNkZWZpbmUgU0FWRV9ZT1VSU0VMRl9JRFggMQkvKiBpbmRleCBpbiB3bV9hdG9tc1tdIGZvciBXTV9TQVZFX1lPVVJTRUxGICovCisKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisvKgorICogV2UgZWl0aGVyIGRyYXcgd2l0aCBhIGZvbnRzZXQgKHdoZW4gY3VycmVudF9mb250c2V0ICE9IE5VTEwpIG9yIHdpdGggYQorICogbm9ybWFsIGZvbnQgKGN1cnJlbnRfZm9udHNldCA9PSBOVUxMLCB1c2UgZ3VpLnRleHRfZ2MgYW5kIGd1aS5iYWNrX2djKS4KKyAqLworc3RhdGljIFhGb250U2V0IGN1cnJlbnRfZm9udHNldCA9IE5VTEw7CisKKyNkZWZpbmUgWERyYXdTdHJpbmcoZHB5LCB3aW4sIGdjLCB4LCB5LCBzdHIsIG4pIFwKKwlkbyBcCisJeyBcCisJICAgIGlmIChjdXJyZW50X2ZvbnRzZXQgIT0gTlVMTCkgXAorCQlYbWJEcmF3U3RyaW5nKGRweSwgd2luLCBjdXJyZW50X2ZvbnRzZXQsIGdjLCB4LCB5LCBzdHIsIG4pOyBcCisJICAgIGVsc2UgXAorCQlYRHJhd1N0cmluZyhkcHksIHdpbiwgZ2MsIHgsIHksIHN0ciwgbik7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFhEcmF3U3RyaW5nMTYoZHB5LCB3aW4sIGdjLCB4LCB5LCBzdHIsIG4pIFwKKwlkbyBcCisJeyBcCisJICAgIGlmIChjdXJyZW50X2ZvbnRzZXQgIT0gTlVMTCkgXAorCQlYd2NEcmF3U3RyaW5nKGRweSwgd2luLCBjdXJyZW50X2ZvbnRzZXQsIGdjLCB4LCB5LCAod2NoYXJfdCAqKXN0ciwgbik7IFwKKwkgICAgZWxzZSBcCisJCVhEcmF3U3RyaW5nMTYoZHB5LCB3aW4sIGdjLCB4LCB5LCBzdHIsIG4pOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBjaGVja19mb250c2V0X3Nhbml0eSBfX0FSR1MoKFhGb250U2V0IGZzKSk7CitzdGF0aWMgaW50IGZvbnRzZXRfd2lkdGggX19BUkdTKChYRm9udFNldCBmcykpOworc3RhdGljIGludCBmb250c2V0X2FzY2VudCBfX0FSR1MoKFhGb250U2V0IGZzKSk7CisjZW5kaWYKKworc3RhdGljIGd1aWNvbG9yX1QJcHJldl9mZ19jb2xvciA9IElOVkFMQ09MT1I7CitzdGF0aWMgZ3VpY29sb3JfVAlwcmV2X2JnX2NvbG9yID0gSU5WQUxDT0xPUjsKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpICYmIGRlZmluZWQoRkVBVF9NRU5VKQorc3RhdGljIFhCdXR0b25QcmVzc2VkRXZlbnQgbGFzdF9tb3VzZV9ldmVudDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGZpbmRfY2xvc2VzdF9jb2xvciBfX0FSR1MoKENvbG9ybWFwIGNvbG9ybWFwLCBYQ29sb3IgKmNvbG9yUHRyKSk7CitzdGF0aWMgdm9pZCBndWlfeDExX3RpbWVyX2NiIF9fQVJHUygoWHRQb2ludGVyIHRpbWVkX291dCwgWHRJbnRlcnZhbElkICppbnRlcnZhbF9pZCkpOworc3RhdGljIHZvaWQgZ3VpX3gxMV92aXNpYmlsaXR5X2NiIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBkdWQsIFhFdmVudCAqZXZlbnQsIEJvb2xlYW4gKmR1bSkpOworc3RhdGljIHZvaWQgZ3VpX3gxMV9leHBvc2VfY2IgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGR1ZCwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqZHVtKSk7CitzdGF0aWMgdm9pZCBndWlfeDExX3Jlc2l6ZV93aW5kb3dfY2IgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGR1ZCwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqZHVtKSk7CitzdGF0aWMgdm9pZCBndWlfeDExX2ZvY3VzX2NoYW5nZV9jYiBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgZGF0YSwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqZHVtKSk7CitzdGF0aWMgdm9pZCBndWlfeDExX2VudGVyX2NiIF9fQVJHUygoV2lkZ2V0IHcsIFh0UG9pbnRlciBkYXRhLCBYRXZlbnQgKmV2ZW50LCBCb29sZWFuICpkdW0pKTsKK3N0YXRpYyB2b2lkIGd1aV94MTFfbGVhdmVfY2IgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGRhdGEsIFhFdmVudCAqZXZlbnQsIEJvb2xlYW4gKmR1bSkpOworc3RhdGljIHZvaWQgZ3VpX3gxMV9tb3VzZV9jYiBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgZGF0YSwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqZHVtKSk7CisjaWZkZWYgRkVBVF9TTklGRgorc3RhdGljIHZvaWQgZ3VpX3gxMV9zbmlmZl9yZXF1ZXN0X2NiIF9fQVJHUygoWHRQb2ludGVyIGNsb3N1cmUsIGludCAqc291cmNlLCBYdElucHV0SWQgKmlkKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGd1aV94MTFfY2hlY2tfY29weV9hcmVhIF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCitzdGF0aWMgdm9pZCBndWlfeDExX3NlbmRfZXZlbnRfaGFuZGxlciBfX0FSR1MoKFdpZGdldCwgWHRQb2ludGVyLCBYRXZlbnQgKiwgQm9vbGVhbiAqKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGd1aV94MTFfd21fcHJvdG9jb2xfaGFuZGxlciBfX0FSR1MoKFdpZGdldCwgWHRQb2ludGVyLCBYRXZlbnQgKiwgQm9vbGVhbiAqKSk7CitzdGF0aWMgdm9pZCBndWlfeDExX2JsaW5rX2NiIF9fQVJHUygoWHRQb2ludGVyIHRpbWVkX291dCwgWHRJbnRlcnZhbElkICppbnRlcnZhbF9pZCkpOworc3RhdGljIEN1cnNvciBndWlfeDExX2NyZWF0ZV9ibGFua19tb3VzZSBfX0FSR1MoKHZvaWQpKTsKKworCisvKgorICogS2V5Y29kZXMgcmVjb2duaXplZCBieSB2aW0uCisgKiBOT1RFOiB3aGVuIGNoYW5naW5nIHRoaXMsIHRoZSB0YWJsZSBpbiBndWlfZ3RrX3gxMS5jIHByb2JhYmx5IG5lZWRzIHRoZQorICogc2FtZSBjaGFuZ2UhCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BlY2lhbGtleQoreworICAgIEtleVN5bSAga2V5X3N5bTsKKyAgICBjaGFyX3UgIHZpbV9jb2RlMDsKKyAgICBjaGFyX3UgIHZpbV9jb2RlMTsKK30gc3BlY2lhbF9rZXlzW10gPQoreworICAgIHtYS19VcCwJCSdrJywgJ3UnfSwKKyAgICB7WEtfRG93biwJCSdrJywgJ2QnfSwKKyAgICB7WEtfTGVmdCwJCSdrJywgJ2wnfSwKKyAgICB7WEtfUmlnaHQsCQknaycsICdyJ30sCisKKyAgICB7WEtfRjEsCQknaycsICcxJ30sCisgICAge1hLX0YyLAkJJ2snLCAnMid9LAorICAgIHtYS19GMywJCSdrJywgJzMnfSwKKyAgICB7WEtfRjQsCQknaycsICc0J30sCisgICAge1hLX0Y1LAkJJ2snLCAnNSd9LAorICAgIHtYS19GNiwJCSdrJywgJzYnfSwKKyAgICB7WEtfRjcsCQknaycsICc3J30sCisgICAge1hLX0Y4LAkJJ2snLCAnOCd9LAorICAgIHtYS19GOSwJCSdrJywgJzknfSwKKyAgICB7WEtfRjEwLAkJJ2snLCAnOyd9LAorCisgICAge1hLX0YxMSwJCSdGJywgJzEnfSwKKyAgICB7WEtfRjEyLAkJJ0YnLCAnMid9LAorICAgIHtYS19GMTMsCQknRicsICczJ30sCisgICAge1hLX0YxNCwJCSdGJywgJzQnfSwKKyAgICB7WEtfRjE1LAkJJ0YnLCAnNSd9LAorICAgIHtYS19GMTYsCQknRicsICc2J30sCisgICAge1hLX0YxNywJCSdGJywgJzcnfSwKKyAgICB7WEtfRjE4LAkJJ0YnLCAnOCd9LAorICAgIHtYS19GMTksCQknRicsICc5J30sCisgICAge1hLX0YyMCwJCSdGJywgJ0EnfSwKKworICAgIHtYS19GMjEsCQknRicsICdCJ30sCisgICAge1hLX0YyMiwJCSdGJywgJ0MnfSwKKyAgICB7WEtfRjIzLAkJJ0YnLCAnRCd9LAorICAgIHtYS19GMjQsCQknRicsICdFJ30sCisgICAge1hLX0YyNSwJCSdGJywgJ0YnfSwKKyAgICB7WEtfRjI2LAkJJ0YnLCAnRyd9LAorICAgIHtYS19GMjcsCQknRicsICdIJ30sCisgICAge1hLX0YyOCwJCSdGJywgJ0knfSwKKyAgICB7WEtfRjI5LAkJJ0YnLCAnSid9LAorICAgIHtYS19GMzAsCQknRicsICdLJ30sCisKKyAgICB7WEtfRjMxLAkJJ0YnLCAnTCd9LAorICAgIHtYS19GMzIsCQknRicsICdNJ30sCisgICAge1hLX0YzMywJCSdGJywgJ04nfSwKKyAgICB7WEtfRjM0LAkJJ0YnLCAnTyd9LAorICAgIHtYS19GMzUsCQknRicsICdQJ30sCS8qIGtleXN5bWRlZi5oIGRlZmluZXMgdXAgdG8gRjM1ICovCisjaWZkZWYgU3VuWEtfRjM2CisgICAge1N1blhLX0YzNiwJCSdGJywgJ1EnfSwKKyAgICB7U3VuWEtfRjM3LAkJJ0YnLCAnUid9LAorI2VuZGlmCisKKyAgICB7WEtfSGVscCwJCSclJywgJzEnfSwKKyAgICB7WEtfVW5kbywJCScmJywgJzgnfSwKKyAgICB7WEtfQmFja1NwYWNlLAknaycsICdiJ30sCisgICAge1hLX0luc2VydCwJCSdrJywgJ0knfSwKKyAgICB7WEtfRGVsZXRlLAkJJ2snLCAnRCd9LAorICAgIHtYS19Ib21lLAkJJ2snLCAnaCd9LAorICAgIHtYS19FbmQsCQknQCcsICc3J30sCisgICAge1hLX1ByaW9yLAkJJ2snLCAnUCd9LAorICAgIHtYS19OZXh0LAkJJ2snLCAnTid9LAorICAgIHtYS19QcmludCwJCSclJywgJzknfSwKKworICAgIC8qIEtleXBhZCBrZXlzOiAqLworI2lmZGVmIFhLX0tQX0xlZnQKKyAgICB7WEtfS1BfTGVmdCwJJ2snLCAnbCd9LAorICAgIHtYS19LUF9SaWdodCwJJ2snLCAncid9LAorICAgIHtYS19LUF9VcCwJCSdrJywgJ3UnfSwKKyAgICB7WEtfS1BfRG93biwJJ2snLCAnZCd9LAorICAgIHtYS19LUF9JbnNlcnQsCUtTX0VYVFJBLCAoY2hhcl91KUtFX0tJTlN9LAorICAgIHtYS19LUF9EZWxldGUsCUtTX0VYVFJBLCAoY2hhcl91KUtFX0tERUx9LAorICAgIHtYS19LUF9Ib21lLAknSycsICcxJ30sCisgICAge1hLX0tQX0VuZCwJCSdLJywgJzQnfSwKKyAgICB7WEtfS1BfUHJpb3IsCSdLJywgJzMnfSwKKyAgICB7WEtfS1BfTmV4dCwJJ0snLCAnNSd9LAorCisgICAge1hLX0tQX0FkZCwJCSdLJywgJzYnfSwKKyAgICB7WEtfS1BfU3VidHJhY3QsCSdLJywgJzcnfSwKKyAgICB7WEtfS1BfRGl2aWRlLAknSycsICc4J30sCisgICAge1hLX0tQX011bHRpcGx5LAknSycsICc5J30sCisgICAge1hLX0tQX0VudGVyLAknSycsICdBJ30sCisgICAge1hLX0tQX0RlY2ltYWwsCSdLJywgJ0InfSwKKworICAgIHtYS19LUF8wLAkJJ0snLCAnQyd9LAorICAgIHtYS19LUF8xLAkJJ0snLCAnRCd9LAorICAgIHtYS19LUF8yLAkJJ0snLCAnRSd9LAorICAgIHtYS19LUF8zLAkJJ0snLCAnRid9LAorICAgIHtYS19LUF80LAkJJ0snLCAnRyd9LAorICAgIHtYS19LUF81LAkJJ0snLCAnSCd9LAorICAgIHtYS19LUF82LAkJJ0snLCAnSSd9LAorICAgIHtYS19LUF83LAkJJ0snLCAnSid9LAorICAgIHtYS19LUF84LAkJJ0snLCAnSyd9LAorICAgIHtYS19LUF85LAkJJ0snLCAnTCd9LAorI2VuZGlmCisKKyAgICAvKiBFbmQgb2YgbGlzdCBtYXJrZXI6ICovCisgICAgeyhLZXlTeW0pMCwJICAgIDAsIDB9Cit9OworCisjZGVmaW5lIFh0TmJvbGRGb250CQkiYm9sZEZvbnQiCisjZGVmaW5lIFh0Q0JvbGRGb250CQkiQm9sZEZvbnQiCisjZGVmaW5lIFh0Tml0YWxpY0ZvbnQJCSJpdGFsaWNGb250IgorI2RlZmluZSBYdENJdGFsaWNGb250CQkiSXRhbGljRm9udCIKKyNkZWZpbmUgWHROYm9sZEl0YWxpY0ZvbnQJImJvbGRJdGFsaWNGb250IgorI2RlZmluZSBYdENCb2xkSXRhbGljRm9udAkiQm9sZEl0YWxpY0ZvbnQiCisjZGVmaW5lIFh0TnNjcm9sbGJhcldpZHRoCSJzY3JvbGxiYXJXaWR0aCIKKyNkZWZpbmUgWHRDU2Nyb2xsYmFyV2lkdGgJIlNjcm9sbGJhcldpZHRoIgorI2RlZmluZSBYdE5tZW51SGVpZ2h0CQkibWVudUhlaWdodCIKKyNkZWZpbmUgWHRDTWVudUhlaWdodAkJIk1lbnVIZWlnaHQiCisjZGVmaW5lIFh0Tm1lbnVGb250CQkibWVudUZvbnQiCisjZGVmaW5lIFh0Q01lbnVGb250CQkiTWVudUZvbnQiCisjZGVmaW5lIFh0Tm1lbnVGb250U2V0CQkibWVudUZvbnRTZXQiCisjZGVmaW5lIFh0Q01lbnVGb250U2V0CQkiTWVudUZvbnRTZXQiCisKKworLyogUmVzb3VyY2VzIGZvciBzZXR0aW5nIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBvZiBtZW51cyAqLworI2RlZmluZSBYdE5tZW51QmFja2dyb3VuZAkibWVudUJhY2tncm91bmQiCisjZGVmaW5lIFh0Q01lbnVCYWNrZ3JvdW5kCSJNZW51QmFja2dyb3VuZCIKKyNkZWZpbmUgWHRObWVudUZvcmVncm91bmQJIm1lbnVGb3JlZ3JvdW5kIgorI2RlZmluZSBYdENNZW51Rm9yZWdyb3VuZAkiTWVudUZvcmVncm91bmQiCisKKy8qIFJlc291cmNlcyBmb3Igc2V0dGluZyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgb2Ygc2Nyb2xsYmFycyAqLworI2RlZmluZSBYdE5zY3JvbGxCYWNrZ3JvdW5kCSJzY3JvbGxCYWNrZ3JvdW5kIgorI2RlZmluZSBYdENTY3JvbGxCYWNrZ3JvdW5kCSJTY3JvbGxCYWNrZ3JvdW5kIgorI2RlZmluZSBYdE5zY3JvbGxGb3JlZ3JvdW5kCSJzY3JvbGxGb3JlZ3JvdW5kIgorI2RlZmluZSBYdENTY3JvbGxGb3JlZ3JvdW5kCSJTY3JvbGxGb3JlZ3JvdW5kIgorCisvKiBSZXNvdXJjZXMgZm9yIHNldHRpbmcgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIHRvb2x0aXAgKi8KKyNkZWZpbmUgWHROdG9vbHRpcEJhY2tncm91bmQJInRvb2x0aXBCYWNrZ3JvdW5kIgorI2RlZmluZSBYdENUb29sdGlwQmFja2dyb3VuZAkiVG9vbHRpcEJhY2tncm91bmQiCisjZGVmaW5lIFh0TnRvb2x0aXBGb3JlZ3JvdW5kCSJ0b29sdGlwRm9yZWdyb3VuZCIKKyNkZWZpbmUgWHRDVG9vbHRpcEZvcmVncm91bmQJIlRvb2x0aXBGb3JlZ3JvdW5kIgorI2RlZmluZSBYdE50b29sdGlwRm9udAkJInRvb2x0aXBGb250IgorI2RlZmluZSBYdENUb29sdGlwRm9udAkJIlRvb2x0aXBGb250IgorCisvKgorICogWCBSZXNvdXJjZXM6CisgKi8KK3N0YXRpYyBYdFJlc291cmNlIHZpbV9yZXNvdXJjZXNbXSA9Cit7CisgICAgeworCVh0TmZvcmVncm91bmQsCisJWHRDRm9yZWdyb3VuZCwKKwlYdFJQaXhlbCwKKwlzaXplb2YoUGl4ZWwpLAorCVh0T2Zmc2V0T2YoZ3VpX1QsIGRlZl9ub3JtX3BpeGVsKSwKKwlYdFJTdHJpbmcsCisJWHREZWZhdWx0Rm9yZWdyb3VuZAorICAgIH0sCisgICAgeworCVh0TmJhY2tncm91bmQsCisJWHRDQmFja2dyb3VuZCwKKwlYdFJQaXhlbCwKKwlzaXplb2YoUGl4ZWwpLAorCVh0T2Zmc2V0T2YoZ3VpX1QsIGRlZl9iYWNrX3BpeGVsKSwKKwlYdFJTdHJpbmcsCisJWHREZWZhdWx0QmFja2dyb3VuZAorICAgIH0sCisgICAgeworCVh0TmZvbnQsCisJWHRDRm9udCwKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKFN0cmluZyAqKSwKKwlYdE9mZnNldE9mKGd1aV9ULCByc3JjX2ZvbnRfbmFtZSksCisJWHRSSW1tZWRpYXRlLAorCVh0RGVmYXVsdEZvbnQKKyAgICB9LAorICAgIHsKKwlYdE5ib2xkRm9udCwKKwlYdENCb2xkRm9udCwKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKFN0cmluZyAqKSwKKwlYdE9mZnNldE9mKGd1aV9ULCByc3JjX2JvbGRfZm9udF9uYW1lKSwKKwlYdFJJbW1lZGlhdGUsCisJIiIKKyAgICB9LAorICAgIHsKKwlYdE5pdGFsaWNGb250LAorCVh0Q0l0YWxpY0ZvbnQsCisJWHRSU3RyaW5nLAorCXNpemVvZihTdHJpbmcgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19pdGFsX2ZvbnRfbmFtZSksCisJWHRSSW1tZWRpYXRlLAorCSIiCisgICAgfSwKKyAgICB7CisJWHROYm9sZEl0YWxpY0ZvbnQsCisJWHRDQm9sZEl0YWxpY0ZvbnQsCisJWHRSU3RyaW5nLAorCXNpemVvZihTdHJpbmcgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19ib2xkaXRhbF9mb250X25hbWUpLAorCVh0UkltbWVkaWF0ZSwKKwkiIgorICAgIH0sCisgICAgeworCVh0Tmdlb21ldHJ5LAorCVh0Q0dlb21ldHJ5LAorCVh0UlN0cmluZywKKwlzaXplb2YoU3RyaW5nICopLAorCVh0T2Zmc2V0T2YoZ3VpX1QsIGdlb20pLAorCVh0UkltbWVkaWF0ZSwKKwkiIgorICAgIH0sCisgICAgeworCVh0TnJldmVyc2VWaWRlbywKKwlYdENSZXZlcnNlVmlkZW8sCisJWHRSQm9vbCwKKwlzaXplb2YoQm9vbCksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19yZXZfdmlkZW8pLAorCVh0UkltbWVkaWF0ZSwKKwkoWHRQb2ludGVyKUZhbHNlCisgICAgfSwKKyAgICB7CisJWHROYm9yZGVyV2lkdGgsCisJWHRDQm9yZGVyV2lkdGgsCisJWHRSSW50LAorCXNpemVvZihpbnQpLAorCVh0T2Zmc2V0T2YoZ3VpX1QsIGJvcmRlcl93aWR0aCksCisJWHRSSW1tZWRpYXRlLAorCShYdFBvaW50ZXIpMgorICAgIH0sCisgICAgeworCVh0TnNjcm9sbGJhcldpZHRoLAorCVh0Q1Njcm9sbGJhcldpZHRoLAorCVh0UkludCwKKwlzaXplb2YoaW50KSwKKwlYdE9mZnNldE9mKGd1aV9ULCBzY3JvbGxiYXJfd2lkdGgpLAorCVh0UkltbWVkaWF0ZSwKKwkoWHRQb2ludGVyKVNCX0RFRkFVTFRfV0lEVEgKKyAgICB9LAorI2lmZGVmIEZFQVRfTUVOVQorIyBpZmRlZiBGRUFUX0dVSV9BVEhFTkEJCS8qIHdpdGggTW90aWYgdGhlIGhlaWdodCBpcyBhbHdheXMgY29tcHV0ZWQgKi8KKyAgICB7CisJWHRObWVudUhlaWdodCwKKwlYdENNZW51SGVpZ2h0LAorCVh0UkludCwKKwlzaXplb2YoaW50KSwKKwlYdE9mZnNldE9mKGd1aV9ULCBtZW51X2hlaWdodCksCisJWHRSSW1tZWRpYXRlLAorCShYdFBvaW50ZXIpTUVOVV9ERUZBVUxUX0hFSUdIVAkgICAgLyogU2hvdWxkIGZpZ3VyZSBvdXQgYXQgcnVuIHRpbWUgKi8KKyAgICB9LAorIyBlbmRpZgorICAgIHsKKyMgaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwlYdE5tZW51Rm9udFNldCwKKwlYdENNZW51Rm9udFNldCwKKyNlbHNlCisJWHRObWVudUZvbnQsCisJWHRDTWVudUZvbnQsCisjZW5kaWYKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKGNoYXIgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19tZW51X2ZvbnRfbmFtZSksCisJWHRSU3RyaW5nLAorCURGTFRfTUVOVV9GT05UCisgICAgfSwKKyNlbmRpZgorICAgIHsKKwlYdE5tZW51Rm9yZWdyb3VuZCwKKwlYdENNZW51Rm9yZWdyb3VuZCwKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKGNoYXIgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19tZW51X2ZnX25hbWUpLAorCVh0UlN0cmluZywKKwlERkxUX01FTlVfRkdfQ09MT1IKKyAgICB9LAorICAgIHsKKwlYdE5tZW51QmFja2dyb3VuZCwKKwlYdENNZW51QmFja2dyb3VuZCwKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKGNoYXIgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19tZW51X2JnX25hbWUpLAorCVh0UlN0cmluZywKKwlERkxUX01FTlVfQkdfQ09MT1IKKyAgICB9LAorICAgIHsKKwlYdE5zY3JvbGxGb3JlZ3JvdW5kLAorCVh0Q1Njcm9sbEZvcmVncm91bmQsCisJWHRSU3RyaW5nLAorCXNpemVvZihjaGFyICopLAorCVh0T2Zmc2V0T2YoZ3VpX1QsIHJzcmNfc2Nyb2xsX2ZnX25hbWUpLAorCVh0UlN0cmluZywKKwlERkxUX1NDUk9MTF9GR19DT0xPUgorICAgIH0sCisgICAgeworCVh0TnNjcm9sbEJhY2tncm91bmQsCisJWHRDU2Nyb2xsQmFja2dyb3VuZCwKKwlYdFJTdHJpbmcsCisJc2l6ZW9mKGNoYXIgKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19zY3JvbGxfYmdfbmFtZSksCisJWHRSU3RyaW5nLAorCURGTFRfU0NST0xMX0JHX0NPTE9SCisgICAgfSwKKyNpZmRlZiBGRUFUX0JFVkFMCisgICAgeworCVh0TnRvb2x0aXBGb3JlZ3JvdW5kLAorCVh0Q1Rvb2x0aXBGb3JlZ3JvdW5kLAorCVh0UlN0cmluZywKKwlzaXplb2YoY2hhciAqKSwKKwlYdE9mZnNldE9mKGd1aV9ULCByc3JjX3Rvb2x0aXBfZmdfbmFtZSksCisJWHRSU3RyaW5nLAorCURGTFRfVE9PTFRJUF9GR19DT0xPUgorICAgIH0sCisgICAgeworCVh0TnRvb2x0aXBCYWNrZ3JvdW5kLAorCVh0Q1Rvb2x0aXBCYWNrZ3JvdW5kLAorCVh0UlN0cmluZywKKwlzaXplb2YoY2hhciAqKSwKKwlYdE9mZnNldE9mKGd1aV9ULCByc3JjX3Rvb2x0aXBfYmdfbmFtZSksCisJWHRSU3RyaW5nLAorCURGTFRfVE9PTFRJUF9CR19DT0xPUgorICAgIH0sCisgICAgeworCVh0TnRvb2x0aXBGb250LAorCVh0Q1Rvb2x0aXBGb250LAorCVh0UlN0cmluZywKKwlzaXplb2YoY2hhciAqKSwKKwlYdE9mZnNldE9mKGd1aV9ULCByc3JjX3Rvb2x0aXBfZm9udF9uYW1lKSwKKwlYdFJTdHJpbmcsCisJREZMVF9UT09MVElQX0ZPTlQKKyAgICB9LAorICAgIC8qIFRoaXMgb25lIGlzbid0IHJlYWxseSBuZWVkZWQsIGtlZXAgZm9yIFN1biBXb3Jrc2hvcD8gKi8KKyAgICB7CisJImJhbGxvb25FdmFsRm9udFNldCIsCisJWHRDRm9udFNldCwKKwlYdFJGb250U2V0LAorCXNpemVvZihYRm9udFNldCksCisJWHRPZmZzZXRPZihndWlfVCwgdG9vbHRpcF9mb250c2V0KSwKKwlYdFJJbW1lZGlhdGUsCisJKFh0UG9pbnRlcilOT0ZPTlRTRVQKKyAgICB9LAorI2VuZGlmIC8qIEZFQVRfQkVWQUwgKi8KKyNpZmRlZiBGRUFUX1hJTQorICAgIHsKKwkicHJlZWRpdFR5cGUiLAorCSJQcmVlZGl0VHlwZSIsCisJWHRSU3RyaW5nLAorCXNpemVvZihjaGFyKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19wcmVlZGl0X3R5cGVfbmFtZSksCisJWHRSU3RyaW5nLAorCShYdFBvaW50ZXIpIk92ZXJUaGVTcG90LE9mZlRoZVNwb3QsUm9vdCIKKyAgICB9LAorICAgIHsKKwkiaW5wdXRNZXRob2QiLAorCSJJbnB1dE1ldGhvZCIsCisJWHRSU3RyaW5nLAorCXNpemVvZihjaGFyKiksCisJWHRPZmZzZXRPZihndWlfVCwgcnNyY19pbnB1dF9tZXRob2QpLAorCVh0UlN0cmluZywKKwlOVUxMCisgICAgfSwKKyNlbmRpZiAvKiBGRUFUX1hJTSAqLworfTsKKworLyoKKyAqIFRoaXMgdGFibGUgaG9sZHMgYWxsIHRoZSBYIEdVSSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbGxvd2VkLiAgVGhpcyBpbmNsdWRlcworICogdGhlIHN0YW5kYXJkIG9uZXMgc28gdGhhdCB3ZSBjYW4gc2tpcCB0aGVtIHdoZW4gdmltIGlzIHN0YXJ0ZWQgd2l0aG91dCB0aGUKKyAqIEdVSSAoYnV0IHRoZSBHVUkgbWlnaHQgc3RhcnQgdXAgbGF0ZXIpLgorICogV2hlbiBjaGFuZ2luZyB0aGlzLCBhbHNvIHVwZGF0ZSBkb2MvdmltX2d1aS50eHQgYW5kIHRoZSB1c2FnZSBtZXNzYWdlISEhCisgKi8KK3N0YXRpYyBYcm1PcHRpb25EZXNjUmVjIGNtZGxpbmVfb3B0aW9uc1tdID0KK3sKKyAgICAvKiBXZSBoYW5kbGUgdGhlc2Ugb3B0aW9ucyBvdXJzZWx2ZXMgKi8KKyAgICB7Ii1iZyIsCQkiLmJhY2tncm91bmQiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyAgICB7Ii1iYWNrZ3JvdW5kIiwJIi5iYWNrZ3JvdW5kIiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItZmciLAkJIi5mb3JlZ3JvdW5kIiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItZm9yZWdyb3VuZCIsCSIuZm9yZWdyb3VuZCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLWZuIiwJCSIuZm9udCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLWZvbnQiLAkJIi5mb250IiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItYm9sZGZvbnQiLAkiLmJvbGRGb250IiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItaXRhbGljZm9udCIsCSIuaXRhbGljRm9udCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLWdlb20iLAkJIi5nZW9tZXRyeSIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLWdlb21ldHJ5IiwJIi5nZW9tZXRyeSIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLXJldmVyc2UiLAkiKnJldmVyc2VWaWRlbyIsICAgIFhybW9wdGlvbk5vQXJnLAkiVHJ1ZSJ9LAorICAgIHsiLXJ2IiwJCSIqcmV2ZXJzZVZpZGVvIiwgICAgWHJtb3B0aW9uTm9BcmcsCSJUcnVlIn0sCisgICAgeyIrcmV2ZXJzZSIsCSIqcmV2ZXJzZVZpZGVvIiwgICAgWHJtb3B0aW9uTm9BcmcsCSJGYWxzZSJ9LAorICAgIHsiK3J2IiwJCSIqcmV2ZXJzZVZpZGVvIiwgICAgWHJtb3B0aW9uTm9BcmcsCSJGYWxzZSJ9LAorICAgIHsiLWRpc3BsYXkiLAkiLmRpc3BsYXkiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyAgICB7Ii1pY29uaWMiLAkJIippY29uaWMiLAkgICAgWHJtb3B0aW9uTm9BcmcsCSJUcnVlIn0sCisgICAgeyItbmFtZSIsCQkiLm5hbWUiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyAgICB7Ii1idyIsCQkiLmJvcmRlcldpZHRoIiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItYm9yZGVyd2lkdGgiLAkiLmJvcmRlcldpZHRoIiwJICAgIFhybW9wdGlvblNlcEFyZywJTlVMTH0sCisgICAgeyItc3ciLAkJIi5zY3JvbGxiYXJXaWR0aCIsICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLXNjcm9sbGJhcndpZHRoIiwJIi5zY3JvbGxiYXJXaWR0aCIsICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLW1oIiwJCSIubWVudUhlaWdodCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLW1lbnVoZWlnaHQiLAkiLm1lbnVIZWlnaHQiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyNpZmRlZiBGT05UU0VUX0FMV0FZUworICAgIHsiLW1mIiwJCSIubWVudUZvbnRTZXQiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyAgICB7Ii1tZW51Zm9udCIsCSIubWVudUZvbnRTZXQiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyAgICB7Ii1tZW51Zm9udHNldCIsCSIubWVudUZvbnRTZXQiLAkgICAgWHJtb3B0aW9uU2VwQXJnLAlOVUxMfSwKKyNlbHNlCisgICAgeyItbWYiLAkJIi5tZW51Rm9udCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorICAgIHsiLW1lbnVmb250IiwJIi5tZW51Rm9udCIsCSAgICBYcm1vcHRpb25TZXBBcmcsCU5VTEx9LAorI2VuZGlmCisgICAgeyIteHJtIiwJCU5VTEwsCQkgICAgWHJtb3B0aW9uUmVzQXJnLAlOVUxMfQorfTsKKworc3RhdGljIGludCBndWlfYXJnYyA9IDA7CitzdGF0aWMgY2hhciAqKmd1aV9hcmd2ID0gTlVMTDsKKworLyoKKyAqIENhbGwtYmFjayByb3V0aW5lcy4KKyAqLworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitndWlfeDExX3RpbWVyX2NiKHRpbWVkX291dCwgaW50ZXJ2YWxfaWQpCisgICAgWHRQb2ludGVyCSAgICB0aW1lZF9vdXQ7CisgICAgWHRJbnRlcnZhbElkICAgICppbnRlcnZhbF9pZDsKK3sKKyAgICAqKChpbnQgKil0aW1lZF9vdXQpID0gVFJVRTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3gxMV92aXNpYmlsaXR5X2NiKHcsIGR1ZCwgZXZlbnQsIGR1bSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJZHVkOworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgQm9vbGVhbgkqZHVtOworeworICAgIGlmIChldmVudC0+dHlwZSAhPSBWaXNpYmlsaXR5Tm90aWZ5KQorCXJldHVybjsKKworICAgIGd1aS52aXNpYmlsaXR5ID0gZXZlbnQtPnh2aXNpYmlsaXR5LnN0YXRlOworCisgICAgLyoKKyAgICAgKiBXaGVuIHdlIGRvIGFuIFhDb3B5QXJlYSgpLCBhbmQgdGhlIHdpbmRvdyBpcyBwYXJ0aWFsbHkgb2JzY3VyZWQsIHdlIHdhbnQKKyAgICAgKiB0byByZWNlaXZlIGFuIGV2ZW50IHRvIHRlbGwgdXMgd2hldGhlciBpdCB3b3JrZWQgb3Igbm90LgorICAgICAqLworICAgIFhTZXRHcmFwaGljc0V4cG9zdXJlcyhndWkuZHB5LCBndWkudGV4dF9nYywKKwkgICAgZ3VpLnZpc2liaWxpdHkgIT0gVmlzaWJpbGl0eVVub2JzY3VyZWQpOworCisgICAgLyogVGhpcyBpcyBuZWVkZWQgZm9yIHdoZW4gcmVkcmF3aW5nIGlzIHNsb3cuICovCisgICAgZ3VpX21jaF91cGRhdGUoKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3gxMV9leHBvc2VfY2IodywgZHVkLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcglkdWQ7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpkdW07Cit7CisgICAgWEV4cG9zZUV2ZW50CSpnZXZlbnQ7CisgICAgaW50CQkJbmV3X3g7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUgIT0gRXhwb3NlKQorCXJldHVybjsKKworICAgIG91dF9mbHVzaCgpOwkgICAgLyogbWFrZSBzdXJlIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisKKyAgICBnZXZlbnQgPSAoWEV4cG9zZUV2ZW50ICopZXZlbnQ7CisgICAgZ3VpX3JlZHJhdyhnZXZlbnQtPngsIGdldmVudC0+eSwgZ2V2ZW50LT53aWR0aCwgZ2V2ZW50LT5oZWlnaHQpOworCisgICAgbmV3X3ggPSBGSUxMX1goMCk7CisKKyAgICAvKiBDbGVhciB0aGUgYm9yZGVyIGFyZWFzIGlmIG5lZWRlZCAqLworICAgIGlmIChnZXZlbnQtPnggPCBuZXdfeCkKKwlYQ2xlYXJBcmVhKGd1aS5kcHksIGd1aS53aWQsIDAsIDAsIG5ld194LCAwLCBGYWxzZSk7CisgICAgaWYgKGdldmVudC0+eSA8IEZJTExfWSgwKSkKKwlYQ2xlYXJBcmVhKGd1aS5kcHksIGd1aS53aWQsIDAsIDAsIDAsIEZJTExfWSgwKSwgRmFsc2UpOworICAgIGlmIChnZXZlbnQtPnggPiBGSUxMX1goQ29sdW1ucykpCisJWENsZWFyQXJlYShndWkuZHB5LCBndWkud2lkLCBGSUxMX1goKGludClDb2x1bW5zKSwgMCwgMCwgMCwgRmFsc2UpOworICAgIGlmIChnZXZlbnQtPnkgPiBGSUxMX1koUm93cykpCisJWENsZWFyQXJlYShndWkuZHB5LCBndWkud2lkLCAwLCBGSUxMX1koKGludClSb3dzKSwgMCwgMCwgRmFsc2UpOworCisgICAgLyogVGhpcyBpcyBuZWVkZWQgZm9yIHdoZW4gcmVkcmF3aW5nIGlzIHNsb3cuICovCisgICAgZ3VpX21jaF91cGRhdGUoKTsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgfHwgZGVmaW5lZChGRUFUX1NVTl9XT1JLU0hPUCkpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqCVRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIFhSZWN0YW5nbGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQKKyAqCXgseSBjb29yZGluYXRlcyBhbmQgaGVpZ2h0LCB3aWR0aCBzbyB0aGF0IGFuIFh0VmFTZXRWYWx1ZXMgdG8KKyAqCXRoZSBzYW1lIHNoZWxsIG9mIHRob3NlIHJlc291cmNlcyB3aWxsIHJlc3RvcmUgdGhlIHdpbmRvdyB0byBpdHMKKyAqCWZvcm1hciBwb3NpdGlvbiBhbmQgZGltZW5zaW9ucy4KKyAqCisgKglOb3RlOiBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsLCBpbiB3aGljaCBjYXNlIHRoZSBYUmVjdGFuZ2xlIHdpbGwKKyAqCWJlIHVuY2hhbmdlZC4gIEJlIHN1cmUgdG8gaGF2ZSB0aGUgWFJlY3RhbmdsZSBzZXQgd2l0aCB0aGUKKyAqCXByb3BlciB2YWx1ZXMgZm9yIGEgZmFpbGVkIGNvbmRpdGlvbiBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAqCWZ1bmN0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK3NoZWxsUmVjdGFuZ2xlKFdpZGdldCBzaGVsbCwgWFJlY3RhbmdsZSAqcikKK3sKKyAgICBXaW5kb3cJCXJvb3R3LCBzaGVsbHcsIGNoaWxkLCBwYXJlbnR3OworICAgIGludAkJCWFic3gsIGFic3k7CisgICAgWFdpbmRvd0F0dHJpYnV0ZXMJYTsKKyAgICBXaW5kb3cJCSpjaGlsZHJlbjsKKyAgICB1bnNpZ25lZCBpbnQJY2hpbGRyZW5Db3VudDsKKworICAgIHNoZWxsdyA9IFh0V2luZG93KHNoZWxsKTsKKyAgICBpZiAoc2hlbGx3ID09IDApCisJcmV0dXJuOworICAgIGZvciAoOzspCisgICAgeworCVhRdWVyeVRyZWUoWHREaXNwbGF5KHNoZWxsKSwgc2hlbGx3LCAmcm9vdHcsICZwYXJlbnR3LAorCQkJCQkJICAgJmNoaWxkcmVuLCAmY2hpbGRyZW5Db3VudCk7CisJWEZyZWUoY2hpbGRyZW4pOworCWlmIChwYXJlbnR3ID09IHJvb3R3KQorCSAgICBicmVhazsKKwlzaGVsbHcgPSBwYXJlbnR3OworICAgIH0KKyAgICBYR2V0V2luZG93QXR0cmlidXRlcyhYdERpc3BsYXkoc2hlbGwpLCBzaGVsbHcsICZhKTsKKyAgICBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoWHREaXNwbGF5KHNoZWxsKSwgc2hlbGx3LCBhLnJvb3QsIDAsIDAsCisJCQkJCQkJJmFic3gsICZhYnN5LCAmY2hpbGQpOworICAgIHItPnggPSBhYnN4OworICAgIHItPnkgPSBhYnN5OworICAgIFh0VmFHZXRWYWx1ZXMoc2hlbGwsIFhtTmhlaWdodCwgJnItPmhlaWdodCwgWG1Od2lkdGgsICZyLT53aWR0aCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3gxMV9yZXNpemVfd2luZG93X2NiKHcsIGR1ZCwgZXZlbnQsIGR1bSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJZHVkOworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgQm9vbGVhbgkqZHVtOworeworICAgIHN0YXRpYyBpbnQgbGFzdFdpZHRoLCBsYXN0SGVpZ2h0OworCisgICAgaWYgKGV2ZW50LT50eXBlICE9IENvbmZpZ3VyZU5vdGlmeSkKKwlyZXR1cm47CisKKyAgICBpZiAoZXZlbnQtPnhjb25maWd1cmUud2lkdGggIT0gbGFzdFdpZHRoCisJICAgIHx8IGV2ZW50LT54Y29uZmlndXJlLmhlaWdodCAhPSBsYXN0SGVpZ2h0KQorICAgIHsKKwlsYXN0V2lkdGggPSBldmVudC0+eGNvbmZpZ3VyZS53aWR0aDsKKwlsYXN0SGVpZ2h0ID0gZXZlbnQtPnhjb25maWd1cmUuaGVpZ2h0OworCWd1aV9yZXNpemVfc2hlbGwoZXZlbnQtPnhjb25maWd1cmUud2lkdGgsIGV2ZW50LT54Y29uZmlndXJlLmhlaWdodAorI2lmZGVmIEZFQVRfWElNCisJCQkJCQktIHhpbV9nZXRfc3RhdHVzX2FyZWFfaGVpZ2h0KCkKKyNlbmRpZgorCQkgICAgICk7CisgICAgfQorI2lmZGVmIEZFQVRfU1VOX1dPUktTSE9QCisgICAgaWYgKHVzaW5nU3VuV29ya1Nob3ApCisgICAgeworCVhSZWN0YW5nbGUgIHJlYzsKKworCXNoZWxsUmVjdGFuZ2xlKHcsICZyZWMpOworCXdvcmtzaG9wX2ZyYW1lX21vdmVkKHJlYy54LCByZWMueSwgcmVjLndpZHRoLCByZWMuaGVpZ2h0KTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBpZiAodXNpbmdOZXRiZWFucykKKyAgICB7CisJWFJlY3RhbmdsZSAgcmVjOworCisJc2hlbGxSZWN0YW5nbGUodywgJnJlYyk7CisJbmV0YmVhbnNfZnJhbWVfbW92ZWQocmVjLngsIHJlYy55KTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX1hJTQorICAgIHhpbV9zZXRfcHJlZWRpdCgpOworI2VuZGlmCit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2d1aV94MTFfZm9jdXNfY2hhbmdlX2NiKHcsIGRhdGEsIGV2ZW50LCBkdW0pCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCWRhdGE7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpkdW07Cit7CisgICAgZ3VpX2ZvY3VzX2NoYW5nZShldmVudC0+dHlwZSA9PSBGb2N1c0luKTsKK30KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3gxMV9lbnRlcl9jYih3LCBkYXRhLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcglkYXRhOworICAgIFhFdmVudAkqZXZlbnQ7CisgICAgQm9vbGVhbgkqZHVtOworeworICAgIGd1aV9mb2N1c19jaGFuZ2UoVFJVRSk7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2d1aV94MTFfbGVhdmVfY2IodywgZGF0YSwgZXZlbnQsIGR1bSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKmR1bTsKK3sKKyAgICBndWlfZm9jdXNfY2hhbmdlKEZBTFNFKTsKK30KKworI2lmIGRlZmluZWQoWF9IQVZFX1VURjhfU1RSSU5HKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCisjIGlmIFhfSEFWRV9VVEY4X1NUUklORworIyAgZGVmaW5lIFVTRV9VVEY4TE9PS1VQCisjIGVuZGlmCisjZW5kaWYKKworLyogQVJHU1VTRUQgKi8KKyAgICB2b2lkCitndWlfeDExX2tleV9oaXRfY2IodywgZHVkLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcglkdWQ7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpkdW07Cit7CisgICAgWEtleVByZXNzZWRFdmVudAkqZXZfcHJlc3M7CisjaWZkZWYgRkVBVF9YSU0KKyAgICBjaGFyX3UJCXN0cmluZzJbMjU2XTsKKyAgICBjaGFyX3UJCXN0cmluZ19zaG9ydGJ1ZlsyNTZdOworICAgIGNoYXJfdQkJKnN0cmluZyA9IHN0cmluZ19zaG9ydGJ1ZjsKKyAgICBCb29sZWFuCQlzdHJpbmdfYWxsb2NlZCA9IEZhbHNlOworICAgIFN0YXR1cwkJc3RhdHVzOworI2Vsc2UKKyAgICBjaGFyX3UJCXN0cmluZ1s0XSwgc3RyaW5nMlszXTsKKyNlbmRpZgorICAgIEtleVN5bQkJa2V5X3N5bSwga2V5X3N5bTI7CisgICAgaW50CQkJbGVuLCBsZW4yOworICAgIGludAkJCWk7CisgICAgaW50CQkJbW9kaWZpZXJzOworICAgIGludAkJCWtleTsKKworICAgIGV2X3ByZXNzID0gKFhLZXlQcmVzc2VkRXZlbnQgKilldmVudDsKKworI2lmZGVmIEZFQVRfWElNCisgICAgaWYgKHhpYykKKyAgICB7CisjIGlmZGVmIFVTRV9VVEY4TE9PS1VQCisJLyogWEZyZWU4NiA0LjAuMiBvciBuZXdlcjogQmUgYWJsZSB0byBnZXQgVVRGLTggY2hhcmFjdGVycyBldmVuIHdoZW4KKwkgKiB0aGUgbG9jYWxlIGlzbid0IHV0Zi04LiAqLworCWlmIChlbmNfdXRmOCkKKwkgICAgbGVuID0gWHV0ZjhMb29rdXBTdHJpbmcoeGljLCBldl9wcmVzcywgKGNoYXIgKilzdHJpbmcsCisJCQkJICBzaXplb2Yoc3RyaW5nX3Nob3J0YnVmKSwgJmtleV9zeW0sICZzdGF0dXMpOworCWVsc2UKKyMgZW5kaWYKKwkgICAgbGVuID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZfcHJlc3MsIChjaGFyICopc3RyaW5nLAorCQkJCSAgc2l6ZW9mKHN0cmluZ19zaG9ydGJ1ZiksICZrZXlfc3ltLCAmc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKKwl7CisJICAgIHN0cmluZyA9IChjaGFyX3UgKilYdE1hbGxvYyhsZW4gKyAxKTsKKwkgICAgc3RyaW5nX2FsbG9jZWQgPSBUcnVlOworIyBpZmRlZiBVU0VfVVRGOExPT0tVUAorCSAgICAvKiBYRnJlZTg2IDQuMC4yIG9yIG5ld2VyOiBCZSBhYmxlIHRvIGdldCBVVEYtOCBjaGFyYWN0ZXJzIGV2ZW4KKwkgICAgICogd2hlbiB0aGUgbG9jYWxlIGlzbid0IHV0Zi04LiAgKi8KKwkgICAgaWYgKGVuY191dGY4KQorCQlsZW4gPSBYdXRmOExvb2t1cFN0cmluZyh4aWMsIGV2X3ByZXNzLCAoY2hhciAqKXN0cmluZywKKwkJCQkJCSAgICAgIGxlbiwgJmtleV9zeW0sICZzdGF0dXMpOworCSAgICBlbHNlCisjIGVuZGlmCisJCWxlbiA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2X3ByZXNzLCAoY2hhciAqKXN0cmluZywKKwkJCQkJCSAgICAgIGxlbiwgJmtleV9zeW0sICZzdGF0dXMpOworCX0KKwlpZiAoc3RhdHVzID09IFhMb29rdXBOb25lIHx8IHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCisJICAgIGtleV9zeW0gPSBYS19Wb2lkU3ltYm9sOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkvKiBEbyBjb252ZXJzaW9uIGZyb20gJ3Rlcm1lbmNvZGluZycgdG8gJ2VuY29kaW5nJy4gIFdoZW4gdXNpbmcKKwkgKiBYdXRmOExvb2t1cFN0cmluZygpIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZS4gKi8KKwlpZiAobGVuID4gMCAmJiBpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FCisjICBpZmRlZiBVU0VfVVRGOExPT0tVUAorCQkmJiAhZW5jX3V0ZjgKKyMgIGVuZGlmCisJCSkKKwl7CisJICAgIGludAkJbWF4bGVuID0gbGVuICogNCArIDQwOyAgLyogZ3Vlc3NlZCAqLworCSAgICBjaGFyX3UJKnAgPSAoY2hhcl91ICopWHRNYWxsb2MobWF4bGVuKTsKKworCSAgICBtY2hfbWVtbW92ZShwLCBzdHJpbmcsIGxlbik7CisJICAgIGlmIChzdHJpbmdfYWxsb2NlZCkKKwkJWHRGcmVlKChjaGFyICopc3RyaW5nKTsKKwkgICAgc3RyaW5nID0gcDsKKwkgICAgc3RyaW5nX2FsbG9jZWQgPSBUcnVlOworCSAgICBsZW4gPSBjb252ZXJ0X2lucHV0KHAsIGxlbiwgbWF4bGVuKTsKKwl9CisjIGVuZGlmCisKKwkvKiBUcmFuc2xhdGUgQ1NJIHRvIEtfQ1NJLCBvdGhlcndpc2UgaXQgY291bGQgYmUgcmVjb2duaXplZCBhcyB0aGUKKwkgKiBzdGFydCBvZiBhIHNwZWNpYWwga2V5LiAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkgICAgaWYgKHN0cmluZ1tpXSA9PSBDU0kpCisJICAgIHsKKwkJY2hhcl91CSpwID0gKGNoYXJfdSAqKVh0TWFsbG9jKGxlbiArIDMpOworCisJCW1jaF9tZW1tb3ZlKHAsIHN0cmluZywgaSArIDEpOworCQlwW2kgKyAxXSA9IEtTX0VYVFJBOworCQlwW2kgKyAyXSA9IChpbnQpS0VfQ1NJOworCQltY2hfbWVtbW92ZShwICsgaSArIDMsIHN0cmluZyArIGkgKyAxLCBsZW4gLSBpKTsKKwkJaWYgKHN0cmluZ19hbGxvY2VkKQorCQkgICAgWHRGcmVlKChjaGFyICopc3RyaW5nKTsKKwkJc3RyaW5nID0gcDsKKwkJc3RyaW5nX2FsbG9jZWQgPSBUcnVlOworCQlpICs9IDI7CisJCWxlbiArPSAyOworCSAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWxlbiA9IFhMb29rdXBTdHJpbmcoZXZfcHJlc3MsIChjaGFyICopc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSwKKwkJJmtleV9zeW0sIE5VTEwpOworCisjaWZkZWYgU3VuWEtfRjM2CisgICAgLyoKKyAgICAqIFRoZXNlIGtleXMgaGF2ZSBib2d1cyBsb29rdXAgc3RyaW5ncywgYW5kIHRyYXBwaW5nIHRoZW0gaGVyZSBpcworICAgICogZWFzaWVyIHRoYW4gdHJ5aW5nIHRvIFhSZWJpbmRLZXlzeW0oKSBvbiB0aGVtIHdpdGggZXZlcnkgcG9zc2libGUKKyAgICAqIGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVycy4KKyAgICAqLworICAgIGlmIChrZXlfc3ltID09IFN1blhLX0YzNiB8fCBrZXlfc3ltID09IFN1blhLX0YzNykKKwlsZW4gPSAwOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisgICAgaWYgKChrZXlfc3ltID09IFhLX3NwYWNlKSAmJiAoZXZfcHJlc3MtPnN0YXRlICYgU2hpZnRNYXNrKSkKKyAgICB7CisJaGFuZ3VsX2lucHV0X3N0YXRlX3RvZ2dsZSgpOworCWdvdG8gdGhlZW5kOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGtleV9zeW0gPT0gWEtfc3BhY2UpCisJc3RyaW5nWzBdID0gJyAnOwkvKiBPdGhlcndpc2UgQ3RybC1TcGFjZSBkb2Vzbid0IHdvcmsgKi8KKworICAgIC8qCisgICAgICogT25seSBvbiBzb21lIG1hY2hpbmVzIF5fIHJlcXVpcmVzIEN0cmwrU2hpZnQrbWludXMuICBGb3IgY29uc2lzdGVuY3ksCisgICAgICogYWxsb3cganVzdCBDdHJsK21pbnVzIHRvby4KKyAgICAgKi8KKyAgICBpZiAoa2V5X3N5bSA9PSBYS19taW51cyAmJiAoZXZfcHJlc3MtPnN0YXRlICYgQ29udHJvbE1hc2spKQorCXN0cmluZ1swXSA9IEN0cmxfXzsKKworI2lmZGVmIFhLX0lTT19MZWZ0X1RhYgorICAgIC8qIHdoeSBkbyB3ZSBnZXQgWEtfSVNPX0xlZnRfVGFiIGluc3RlYWQgb2YgWEtfVGFiIGZvciBzaGlmdC10YWI/ICovCisgICAgaWYgKGtleV9zeW0gPT0gWEtfSVNPX0xlZnRfVGFiKQorICAgIHsKKwlrZXlfc3ltID0gWEtfVGFiOworCXN0cmluZ1swXSA9IFRBQjsKKwlsZW4gPSAxOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ2hlY2sgZm9yIEFsdC9NZXRhIGtleSAoTW9kMU1hc2spLCBidXQgbm90IGZvciBhIEJTLCBERUwgb3IgY2hhcmFjdGVyCisgICAgICogdGhhdCBhbHJlYWR5IGhhcyB0aGUgOHRoIGJpdCBzZXQuICBBbmQgbm90IHdoZW4gdXNpbmcgYSBkb3VibGUtYnl0ZQorICAgICAqIGVuY29kaW5nLCBzZXR0aW5nIHRoZSA4dGggYml0IG1heSBtYWtlIGl0IHRoZSBsZWFkIGJ5dGUgb2YgYQorICAgICAqIGRvdWJsZS1ieXRlIGNoYXJhY3Rlci4gKi8KKyAgICBpZiAobGVuID09IDEKKwkgICAgJiYgKGV2X3ByZXNzLT5zdGF0ZSAmIE1vZDFNYXNrKQorCSAgICAmJiAhKGtleV9zeW0gPT0gWEtfQmFja1NwYWNlIHx8IGtleV9zeW0gPT0gWEtfRGVsZXRlKQorCSAgICAmJiAoc3RyaW5nWzBdICYgMHg4MCkgPT0gMAorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgJiYgIWVuY19kYmNzCisjZW5kaWYKKwkgICAgKQorICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikKKwkvKiBJZ25vcmUgQUxUIGtleXMgd2hlbiB0aGV5IGFyZSB1c2VkIGZvciB0aGUgbWVudSBvbmx5ICovCisJaWYgKGd1aS5tZW51X2lzX2FjdGl2ZQorCQkmJiAocF93YWtbMF0gPT0gJ3knCisJCSAgICB8fCAocF93YWtbMF0gPT0gJ20nICYmIGd1aV9pc19tZW51X3Nob3J0Y3V0KHN0cmluZ1swXSkpKSkKKwkgICAgZ290byB0aGVlbmQ7CisjZW5kaWYKKwkvKgorCSAqIEJlZm9yZSB3ZSBzZXQgdGhlIDh0aCBiaXQsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBkb2Vzbid0CisJICogYWxyZWFkeSBoYXZlIGEgbWFwcGluZyBkZWZpbmVkIGZvciB0aGlzIHNlcXVlbmNlLiBXZSBkZXRlcm1pbmUgdGhpcworCSAqIGJ5IGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgaW5wdXQgd291bGQgYmUgdGhlIHNhbWUgd2l0aG91dCB0aGUKKwkgKiBBbHQvTWV0YSBrZXkuCisJICogRG9uJ3QgZG8gdGhpcyBmb3IgPFMtTS1UYWI+LCB0aGF0IHNob3VsZCBiZWNvbWUgS19TX1RBQiB3aXRoIEFMVC4KKwkgKi8KKwlldl9wcmVzcy0+c3RhdGUgJj0gfk1vZDFNYXNrOworCWxlbjIgPSBYTG9va3VwU3RyaW5nKGV2X3ByZXNzLCAoY2hhciAqKXN0cmluZzIsIHNpemVvZihzdHJpbmcyKSwKKwkJCQkJCQkgICAgICZrZXlfc3ltMiwgTlVMTCk7CisJaWYgKGtleV9zeW0yID09IFhLX3NwYWNlKQorCSAgICBzdHJpbmcyWzBdID0gJyAnOwkgICAgLyogT3RoZXJ3aXNlIE1ldGEtQ3RybC1TcGFjZSBkb2Vzbid0IHdvcmsgKi8KKwlpZiAoCSAgIGxlbjIgPT0gMQorCQkmJiBzdHJpbmdbMF0gPT0gc3RyaW5nMlswXQorCQkmJiAhKGtleV9zeW0gPT0gWEtfVGFiICYmIChldl9wcmVzcy0+c3RhdGUgJiBTaGlmdE1hc2spKSkKKwl7CisJICAgIHN0cmluZ1swXSB8PSAweDgwOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGVuY191dGY4KSAvKiBjb252ZXJ0IHRvIHV0Zi04ICovCisJICAgIHsKKwkJc3RyaW5nWzFdID0gc3RyaW5nWzBdICYgMHhiZjsKKwkJc3RyaW5nWzBdID0gKCh1bnNpZ25lZClzdHJpbmdbMF0gPj4gNikgKyAweGMwOworCQlpZiAoc3RyaW5nWzFdID09IENTSSkKKwkJeworCQkgICAgc3RyaW5nWzJdID0gS1NfRVhUUkE7CisJCSAgICBzdHJpbmdbM10gPSAoaW50KUtFX0NTSTsKKwkJICAgIGxlbiA9IDQ7CisJCX0KKwkJZWxzZQorCQkgICAgbGVuID0gMjsKKwkgICAgfQorI2VuZGlmCisJfQorCWVsc2UKKwkgICAgZXZfcHJlc3MtPnN0YXRlIHw9IE1vZDFNYXNrOworICAgIH0KKworICAgIGlmIChsZW4gPT0gMSAmJiBzdHJpbmdbMF0gPT0gQ1NJKQorICAgIHsKKwlzdHJpbmdbMV0gPSBLU19FWFRSQTsKKwlzdHJpbmdbMl0gPSAoaW50KUtFX0NTSTsKKwlsZW4gPSAtMzsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3Igc3BlY2lhbCBrZXlzLiAgQWxzbyBkbyB0aGlzIHdoZW4gbGVuID09IDEgKGtleSBoYXMgYW4gQVNDSUkKKyAgICAgKiB2YWx1ZSkgdG8gZGV0ZWN0IGJhY2tzcGFjZSwgZGVsZXRlIGFuZCBrZXlwYWQga2V5cy4gKi8KKyAgICBpZiAobGVuID09IDAgfHwgbGVuID09IDEpCisgICAgeworCWZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IChLZXlTeW0pMDsgaSsrKQorCXsKKwkgICAgaWYgKHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltID09IGtleV9zeW0pCisJICAgIHsKKwkJc3RyaW5nWzBdID0gQ1NJOworCQlzdHJpbmdbMV0gPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwOworCQlzdHJpbmdbMl0gPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxOworCQlsZW4gPSAtMzsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogVW5yZWNvZ25pc2VkIGtleSBpcyBpZ25vcmVkLiAqLworICAgIGlmIChsZW4gPT0gMCkKKwlnb3RvIHRoZWVuZDsKKworICAgIC8qIFNwZWNpYWwga2V5cyAoYW5kIGEgZmV3IG90aGVycykgbWF5IGhhdmUgbW9kaWZpZXJzLiAgQWxzbyB3aGVuIHVzaW5nIGEKKyAgICAgKiBkb3VibGUtYnl0ZSBlbmNvZGluZyAoY2FuJ3Qgc2V0IHRoZSA4dGggYml0KS4gKi8KKyAgICBpZiAobGVuID09IC0zIHx8IGtleV9zeW0gPT0gWEtfc3BhY2UgfHwga2V5X3N5bSA9PSBYS19UYWIKKwkgICAgfHwga2V5X3N5bSA9PSBYS19SZXR1cm4gfHwga2V5X3N5bSA9PSBYS19MaW5lZmVlZAorCSAgICB8fCBrZXlfc3ltID09IFhLX0VzY2FwZQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgKGVuY19kYmNzICYmIGxlbiA9PSAxICYmIChldl9wcmVzcy0+c3RhdGUgJiBNb2QxTWFzaykpCisjZW5kaWYKKyAgICAgICApCisgICAgeworCW1vZGlmaWVycyA9IDA7CisJaWYgKGV2X3ByZXNzLT5zdGF0ZSAmIFNoaWZ0TWFzaykKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCWlmIChldl9wcmVzcy0+c3RhdGUgJiBDb250cm9sTWFzaykKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CisJaWYgKGV2X3ByZXNzLT5zdGF0ZSAmIE1vZDFNYXNrKQorCSAgICBtb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOworCisJLyoKKwkgKiBGb3Igc29tZSBrZXlzIGEgc2hpZnQgbW9kaWZpZXIgaXMgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIga2V5CisJICogY29kZS4KKwkgKi8KKwlpZiAobGVuID09IC0zKQorCSAgICBrZXkgPSBUT19TUEVDSUFMKHN0cmluZ1sxXSwgc3RyaW5nWzJdKTsKKwllbHNlCisJICAgIGtleSA9IHN0cmluZ1swXTsKKwlrZXkgPSBzaW1wbGlmeV9rZXkoa2V5LCAmbW9kaWZpZXJzKTsKKwlpZiAoa2V5ID09IENTSSkKKwkgICAga2V5ID0gS19DU0k7CisJaWYgKElTX1NQRUNJQUwoa2V5KSkKKwl7CisJICAgIHN0cmluZ1swXSA9IENTSTsKKwkgICAgc3RyaW5nWzFdID0gS19TRUNPTkQoa2V5KTsKKwkgICAgc3RyaW5nWzJdID0gS19USElSRChrZXkpOworCSAgICBsZW4gPSAzOworCX0KKwllbHNlCisJeworCSAgICBzdHJpbmdbMF0gPSBrZXk7CisJICAgIGxlbiA9IDE7CisJfQorCisJaWYgKG1vZGlmaWVycyAhPSAwKQorCXsKKwkgICAgc3RyaW5nMlswXSA9IENTSTsKKwkgICAgc3RyaW5nMlsxXSA9IEtTX01PRElGSUVSOworCSAgICBzdHJpbmcyWzJdID0gbW9kaWZpZXJzOworCSAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZzIsIDMpOworCX0KKyAgICB9CisKKyAgICBpZiAobGVuID09IDEgJiYgKChzdHJpbmdbMF0gPT0gQ3RybF9DICYmIGN0cmxfY19pbnRlcnJ1cHRzKQorI2lmZGVmIFVOSVgKKwkgICAgfHwgKGludHJfY2hhciAhPSAwICYmIHN0cmluZ1swXSA9PSBpbnRyX2NoYXIpCisjZW5kaWYKKwkgICAgKSkKKyAgICB7CisJdHJhc2hfaW5wdXRfYnVmKCk7CisJZ290X2ludCA9IFRSVUU7CisgICAgfQorCisgICAgYWRkX3RvX2lucHV0X2J1ZihzdHJpbmcsIGxlbik7CisKKyAgICAvKgorICAgICAqIGJsYW5rIG91dCB0aGUgcG9pbnRlciBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocF9taCkKKwlndWlfbWNoX21vdXNlaGlkZShUUlVFKTsKKworI2lmIGRlZmluZWQoRkVBVF9CRVZBTF9USVApCisgICAgeworCUJhbGxvb25FdmFsICpiZTsKKworCWlmICgoYmUgPSBndWlfbWNoX2N1cnJlbnRseV9zaG93aW5nX2JldmFsKCkpICE9IE5VTEwpCisJICAgIGd1aV9tY2hfdW5wb3N0X2JhbGxvb24oYmUpOworICAgIH0KKyNlbmRpZgordGhlZW5kOgorICAgIHt9CSAgICAvKiBzb21lIGNvbXBpbGVycyBuZWVkIGEgc3RhdGVtZW50IGhlcmUgKi8KKyNpZmRlZiBGRUFUX1hJTQorICAgIGlmIChzdHJpbmdfYWxsb2NlZCkKKwlYdEZyZWUoKGNoYXIgKilzdHJpbmcpOworI2VuZGlmCit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2d1aV94MTFfbW91c2VfY2IodywgZHVkLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcglkdWQ7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpkdW07Cit7CisgICAgc3RhdGljIFh0SW50ZXJ2YWxJZCB0aW1lciA9IChYdEludGVydmFsSWQpMDsKKyAgICBzdGF0aWMgaW50CXRpbWVkX291dCA9IFRSVUU7CisKKyAgICBpbnQJCWJ1dHRvbjsKKyAgICBpbnQJCXJlcGVhdGVkX2NsaWNrID0gRkFMU0U7CisgICAgaW50CQl4LCB5OworICAgIGludF91CXhfbW9kaWZpZXJzOworICAgIGludF91CXZpbV9tb2RpZmllcnM7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gTW90aW9uTm90aWZ5KQorICAgIHsKKwkvKiBHZXQgdGhlIGxhdGVzdCBwb3NpdGlvbiwgYXZvaWRzIGxhZ2dpbmcgYmVoaW5kIG9uIGEgZHJhZy4gKi8KKwl4ID0gZXZlbnQtPnhtb3Rpb24ueDsKKwl5ID0gZXZlbnQtPnhtb3Rpb24ueTsKKwl4X21vZGlmaWVycyA9IGV2ZW50LT54bW90aW9uLnN0YXRlOworCWJ1dHRvbiA9ICh4X21vZGlmaWVycyAmIChCdXR0b24xTWFzayB8IEJ1dHRvbjJNYXNrIHwgQnV0dG9uM01hc2spKQorCQk/IE1PVVNFX0RSQUcgOiAnICc7CisKKwkvKgorCSAqIGlmIG91ciBwb2ludGVyIGlzIGN1cnJlbnRseSBoaWRkZW4sIHRoZW4gd2Ugc2hvdWxkIHNob3cgaXQuCisJICovCisJZ3VpX21jaF9tb3VzZWhpZGUoRkFMU0UpOworCisJaWYgKGJ1dHRvbiAhPSBNT1VTRV9EUkFHKQkvKiBqdXN0IG1vdmluZyB0aGUgcm9kZW50ICovCisJeworI2lmZGVmIEZFQVRfTUVOVQorCSAgICBpZiAoZHVkKQkJCS8qIG1vdmVkIGluIHZpbUZvcm0gKi8KKwkJeSAtPSBndWkubWVudV9oZWlnaHQ7CisjZW5kaWYKKwkgICAgZ3VpX21vdXNlX21vdmVkKHgsIHkpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCXggPSBldmVudC0+eGJ1dHRvbi54OworCXkgPSBldmVudC0+eGJ1dHRvbi55OworCWlmIChldmVudC0+dHlwZSA9PSBCdXR0b25QcmVzcykKKwl7CisJICAgIC8qIEhhbmRsZSBtdWx0aXBsZSBjbGlja3MgKi8KKwkgICAgaWYgKCF0aW1lZF9vdXQpCisJICAgIHsKKwkJWHRSZW1vdmVUaW1lT3V0KHRpbWVyKTsKKwkJcmVwZWF0ZWRfY2xpY2sgPSBUUlVFOworCSAgICB9CisJICAgIHRpbWVkX291dCA9IEZBTFNFOworCSAgICB0aW1lciA9IFh0QXBwQWRkVGltZU91dChhcHBfY29udGV4dCwgKGxvbmdfdSlwX21vdXNldCwKKwkJCWd1aV94MTFfdGltZXJfY2IsICZ0aW1lZF9vdXQpOworCSAgICBzd2l0Y2ggKGV2ZW50LT54YnV0dG9uLmJ1dHRvbikKKwkgICAgeworCQljYXNlIEJ1dHRvbjE6CWJ1dHRvbiA9IE1PVVNFX0xFRlQ7CWJyZWFrOworCQljYXNlIEJ1dHRvbjI6CWJ1dHRvbiA9IE1PVVNFX01JRERMRTsJYnJlYWs7CisJCWNhc2UgQnV0dG9uMzoJYnV0dG9uID0gTU9VU0VfUklHSFQ7CWJyZWFrOworCQljYXNlIEJ1dHRvbjQ6CWJ1dHRvbiA9IE1PVVNFXzQ7CWJyZWFrOworCQljYXNlIEJ1dHRvbjU6CWJ1dHRvbiA9IE1PVVNFXzU7CWJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgcmV0dXJuOwkvKiBVbmtub3duIGJ1dHRvbiAqLworCSAgICB9CisJfQorCWVsc2UgaWYgKGV2ZW50LT50eXBlID09IEJ1dHRvblJlbGVhc2UpCisJICAgIGJ1dHRvbiA9IE1PVVNFX1JFTEVBU0U7CisJZWxzZQorCSAgICByZXR1cm47CS8qIFVua25vd24gbW91c2UgZXZlbnQgdHlwZSAqLworCisJeF9tb2RpZmllcnMgPSBldmVudC0+eGJ1dHRvbi5zdGF0ZTsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkKKwlsYXN0X21vdXNlX2V2ZW50ID0gZXZlbnQtPnhidXR0b247CisjZW5kaWYKKyAgICB9CisKKyAgICB2aW1fbW9kaWZpZXJzID0gMHgwOworICAgIGlmICh4X21vZGlmaWVycyAmIFNoaWZ0TWFzaykKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX1NISUZUOworICAgIGlmICh4X21vZGlmaWVycyAmIENvbnRyb2xNYXNrKQorCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiAoeF9tb2RpZmllcnMgJiBNb2QxTWFzaykJICAgIC8qIEFsdCBvciBNZXRhIGtleSAqLworCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQUxUOworCisgICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQoYnV0dG9uLCB4LCB5LCByZXBlYXRlZF9jbGljaywgdmltX21vZGlmaWVycyk7Cit9CisKKyNpZmRlZiBGRUFUX1NOSUZGCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitndWlfeDExX3NuaWZmX3JlcXVlc3RfY2IoY2xvc3VyZSwgc291cmNlLCBpZCkKKyAgICBYdFBvaW50ZXIJY2xvc3VyZTsKKyAgICBpbnQJCSpzb3VyY2U7CisgICAgWHRJbnB1dElkCSppZDsKK3sKKyAgICBzdGF0aWMgY2hhcl91IGJ5dGVzWzNdID0ge0NTSSwgKGludClLU19FWFRSQSwgKGludClLRV9TTklGRn07CisKKyAgICBhZGRfdG9faW5wdXRfYnVmKGJ5dGVzLCAzKTsKK30KKyNlbmRpZgorCisvKgorICogRW5kIG9mIGNhbGwtYmFjayByb3V0aW5lcworICovCisKKy8qCisgKiBQYXJzZSB0aGUgR1VJIHJlbGF0ZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gIEFueSBhcmd1bWVudHMgdXNlZCBhcmUKKyAqIGRlbGV0ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgorICovCisgICAgdm9pZAorZ3VpX21jaF9wcmVwYXJlKGFyZ2MsIGFyZ3YpCisgICAgaW50CSAgICAqYXJnYzsKKyAgICBjaGFyICAgICoqYXJndjsKK3sKKyAgICBpbnQJICAgIGFyZzsKKyAgICBpbnQJICAgIGk7CisKKyAgICAvKgorICAgICAqIE1vdmUgYWxsIHRoZSBlbnRyaWVzIGluIGFyZ3Ygd2hpY2ggYXJlIHJlbGV2YW50IHRvIFggaW50byBndWlfYXJndi4KKyAgICAgKi8KKyAgICBndWlfYXJnYyA9IDA7CisgICAgZ3VpX2FyZ3YgPSAoY2hhciAqKilsYWxsb2MoKGxvbmdfdSkoKmFyZ2MgKiBzaXplb2YoY2hhciAqKSksIEZBTFNFKTsKKyAgICBpZiAoZ3VpX2FyZ3YgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgZ3VpX2FyZ3ZbZ3VpX2FyZ2MrK10gPSBhcmd2WzBdOworICAgIGFyZyA9IDE7CisgICAgd2hpbGUgKGFyZyA8ICphcmdjKQorICAgIHsKKwkvKiBMb29rIGZvciBhcmd2W2FyZ10gaW4gY21kbGluZV9vcHRpb25zW10gdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgWHROdW1iZXIoY21kbGluZV9vcHRpb25zKTsgaSsrKQorCSAgICBpZiAoc3RyY21wKGFyZ3ZbYXJnXSwgY21kbGluZV9vcHRpb25zW2ldLm9wdGlvbikgPT0gMCkKKwkJYnJlYWs7CisKKwlpZiAoaSA8IFh0TnVtYmVyKGNtZGxpbmVfb3B0aW9ucykpCisJeworCSAgICAvKiBSZW1lbWJlciBmaW5kaW5nICItcnYiIG9yICItcmV2ZXJzZSIgKi8KKwkgICAgaWYgKHN0cmNtcCgiLXJ2IiwgYXJndlthcmddKSA9PSAwCisJCSAgICB8fCBzdHJjbXAoIi1yZXZlcnNlIiwgYXJndlthcmddKSA9PSAwKQorCQlmb3VuZF9yZXZlcnNlX2FyZyA9IFRSVUU7CisJICAgIGVsc2UgaWYgKChzdHJjbXAoIi1mbiIsIGFyZ3ZbYXJnXSkgPT0gMAorCQkJfHwgc3RyY21wKCItZm9udCIsIGFyZ3ZbYXJnXSkgPT0gMCkKKwkJICAgICYmIGFyZyArIDEgPCAqYXJnYykKKwkJZm9udF9hcmd1bWVudCA9IGFyZ3ZbYXJnICsgMV07CisKKwkgICAgLyogRm91bmQgbWF0Y2ggaW4gdGFibGUsIHNvIG1vdmUgaXQgaW50byBndWlfYXJndiAqLworCSAgICBndWlfYXJndltndWlfYXJnYysrXSA9IGFyZ3ZbYXJnXTsKKwkgICAgaWYgKC0tKmFyZ2MgPiBhcmcpCisJICAgIHsKKwkJbWNoX21lbW1vdmUoJmFyZ3ZbYXJnXSwgJmFyZ3ZbYXJnICsgMV0sICgqYXJnYyAtIGFyZykKKwkJCQkJCSAgICAqIHNpemVvZihjaGFyICopKTsKKwkJaWYgKGNtZGxpbmVfb3B0aW9uc1tpXS5hcmdLaW5kICE9IFhybW9wdGlvbk5vQXJnKQorCQl7CisJCSAgICAvKiBNb3ZlIHRoZSBvcHRpb25zIGFyZ3VtZW50IGFzIHdlbGwgKi8KKwkJICAgIGd1aV9hcmd2W2d1aV9hcmdjKytdID0gYXJndlthcmddOworCQkgICAgaWYgKC0tKmFyZ2MgPiBhcmcpCisJCQltY2hfbWVtbW92ZSgmYXJndlthcmddLCAmYXJndlthcmcgKyAxXSwgKCphcmdjIC0gYXJnKQorCQkJCQkJCSAgICAqIHNpemVvZihjaGFyICopKTsKKwkJfQorCSAgICB9CisJICAgIGFyZ3ZbKmFyZ2NdID0gTlVMTDsKKwl9CisJZWxzZQorI2lmZGVmIEZFQVRfU1VOX1dPUktTSE9QCisJICAgIGlmIChzdHJjbXAoIi13cyIsIGFyZ3ZbYXJnXSkgPT0gMCkKKwl7CisJICAgIHVzaW5nU3VuV29ya1Nob3ArKzsKKwkgICAgcF9hY2QgPSBUUlVFOworCSAgICBndWkuZG9mb3JrID0gRkFMU0U7CS8qIGRvbid0IGZvcmsoKSB3aGVuIHN0YXJ0aW5nIEdVSSAqLworCSAgICBtY2hfbWVtbW92ZSgmYXJndlthcmddLCAmYXJndlthcmcgKyAxXSwKKwkJCQkJICAgICgtLSphcmdjIC0gYXJnKSAqIHNpemVvZihjaGFyICopKTsKKwkgICAgYXJndlsqYXJnY10gPSBOVUxMOworIyBpZmRlZiBXU0RFQlVHCisJICAgIHdzZGVidWdfd2FpdChXVF9FTlYgfCBXVF9XQUlUIHwgV1RfU1RPUCwgIlNQUk9fR1ZJTV9XQUlUIiwgMjApOworCSAgICB3c2RlYnVnX2xvZ19pbml0KCJTUFJPX0dWSU1fREVCVUciLCAiU1BST19HVklNX0RMRVZFTCIpOworIyBlbmRpZgorCX0KKwllbHNlCisjZW5kaWYKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkgICAgaWYgKHN0cm5jbXAoIi1uYiIsIGFyZ3ZbYXJnXSwgMykgPT0gMCkKKwl7CisJICAgIHVzaW5nTmV0YmVhbnMrKzsKKwkgICAgZ3VpLmRvZm9yayA9IEZBTFNFOwkvKiBkb24ndCBmb3JrKCkgd2hlbiBzdGFydGluZyBHVUkgKi8KKwkgICAgbmV0YmVhbnNBcmcgPSBhcmd2W2FyZ107CisJICAgIG1jaF9tZW1tb3ZlKCZhcmd2W2FyZ10sICZhcmd2W2FyZyArIDFdLAorCQkJCQkgICAgKC0tKmFyZ2MgLSBhcmcpICogc2l6ZW9mKGNoYXIgKikpOworCSAgICBhcmd2WyphcmdjXSA9IE5VTEw7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBhcmcrKzsKKyAgICB9Cit9CisKKyNpZm5kZWYgWHRTcGVjaWZpY2F0aW9uUmVsZWFzZQorIyBkZWZpbmUgQ0FSRElOQUwgKENhcmRpbmFsICopCisjZWxzZQorIyBpZiBYdFNwZWNpZmljYXRpb25SZWxlYXNlID09IDQKKyMgZGVmaW5lIENBUkRJTkFMIChDYXJkaW5hbCAqKQorIyBlbHNlCisjIGRlZmluZSBDQVJESU5BTCAoaW50ICopCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlmIHRoZSBHVUkgY2FuIGJlIHN0YXJ0ZWQuICBDYWxsZWQgYmVmb3JlIGd2aW1yYyBpcyBzb3VyY2VkLgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaW5pdF9jaGVjaygpCit7CisjaWZkZWYgRkVBVF9YSU0KKyAgICBYdFNldExhbmd1YWdlUHJvYyhOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorICAgIG9wZW5fYXBwX2NvbnRleHQoKTsKKyAgICBpZiAoYXBwX2NvbnRleHQgIT0gTlVMTCkKKwlndWkuZHB5ID0gWHRPcGVuRGlzcGxheShhcHBfY29udGV4dCwgMCwgVklNX05BTUUsIFZJTV9DTEFTUywKKwkgICAgY21kbGluZV9vcHRpb25zLCBYdE51bWJlcihjbWRsaW5lX29wdGlvbnMpLAorCSAgICBDQVJESU5BTCAmZ3VpX2FyZ2MsIGd1aV9hcmd2KTsKKworICAgIGlmIChhcHBfY29udGV4dCA9PSBOVUxMIHx8IGd1aS5kcHkgPT0gTlVMTCkKKyAgICB7CisJZ3VpLmR5aW5nID0gVFJVRTsKKwlFTVNHKF8oZV9vcGVuZGlzcCkpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKworI2lmZGVmIFVTRV9YU01QCisvKgorICogSGFuZGxlIFhTTVAgcHJvY2Vzc2luZywgZGUtcmVnaXN0ZXJpbmcgdGhlIGF0dGFjaG1lbnQgdXBvbiBlcnJvcgorICovCitzdGF0aWMgWHRJbnB1dElkIF94c21wX3h0aW5wdXRpZDsKKworc3RhdGljIHZvaWQgbG9jYWxfeHNtcF9oYW5kbGVfcmVxdWVzdHMgX19BUkdTKChYdFBvaW50ZXIgYywgaW50ICpzLCBYdElucHV0SWQgKmkpKTsKKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2xvY2FsX3hzbXBfaGFuZGxlX3JlcXVlc3RzKGMsIHMsIGkpCisgICAgWHRQb2ludGVyCWM7CisgICAgaW50CQkqczsKKyAgICBYdElucHV0SWQJKmk7Cit7CisgICAgaWYgKHhzbXBfaGFuZGxlX3JlcXVlc3RzKCkgPT0gRkFJTCkKKwlYdFJlbW92ZUlucHV0KF94c21wX3h0aW5wdXRpZCk7Cit9CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGlzZSB0aGUgWCBHVUkuICBDcmVhdGUgYWxsIHRoZSB3aW5kb3dzLCBzZXQgdXAgYWxsIHRoZSBjYWxsLWJhY2tzIGV0Yy4KKyAqIFJldHVybnMgT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgd2hlbiB0aGUgR1VJIGNhbid0IGJlIHN0YXJ0ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfaW5pdCgpCit7CisgICAgWHRHQ01hc2sJZ2NfbWFzazsKKyAgICBYR0NWYWx1ZXMJZ2NfdmFsczsKKyAgICBpbnQJCXgsIHksIG1hc2s7CisgICAgdW5zaWduZWQJdywgaDsKKworI2lmIDAKKyAgICAvKiBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgc3luY2hyb25vdXMgbW9kZSBmb3IgZGVidWdnaW5nICovCisgICAgWFN5bmNocm9uaXplKGd1aS5kcHksIFRydWUpOworI2VuZGlmCisKKyAgICB2aW1TaGVsbCA9IFh0VmFBcHBDcmVhdGVTaGVsbChWSU1fTkFNRSwgVklNX0NMQVNTLAorCSAgICBhcHBsaWNhdGlvblNoZWxsV2lkZ2V0Q2xhc3MsIGd1aS5kcHksIE5VTEwpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIHJlc291cmNlcworICAgICAqLworICAgIFh0VmFHZXRBcHBsaWNhdGlvblJlc291cmNlcyh2aW1TaGVsbCwgKFh0UG9pbnRlcikmZ3VpLAorCXZpbV9yZXNvdXJjZXMsIFh0TnVtYmVyKHZpbV9yZXNvdXJjZXMpLCBOVUxMKTsKKworICAgIGd1aS5zY3JvbGxiYXJfaGVpZ2h0ID0gZ3VpLnNjcm9sbGJhcl93aWR0aDsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBjb2xvcnMgb3Vyc2VsdmVzLiAgVXNpbmcgdGhlIGF1dG9tYXRpYyBjb252ZXJzaW9uIGRvZXNuJ3QKKyAgICAgKiBoYW5kbGUgbG9va2luZyBmb3IgYXBwcm94aW1hdGUgY29sb3JzLgorICAgICAqLworICAgIC8qIE5PVEU6IFRoZXNlIG5leHQgZmV3IGxpbmVzIGFyZSBhbiBleGFjdCBkdXBsaWNhdGUgb2YgZ3VpX2F0aGVuYS5jJ3MKKyAgICAgKiBndWlfbWNoX2RlZl9jb2xvcnMoKS4gIFdoeT8KKyAgICAgKi8KKyAgICBndWkubWVudV9mZ19waXhlbCA9IGd1aV9nZXRfY29sb3IoKGNoYXJfdSAqKWd1aS5yc3JjX21lbnVfZmdfbmFtZSk7CisgICAgZ3VpLm1lbnVfYmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY19tZW51X2JnX25hbWUpOworICAgIGd1aS5zY3JvbGxfZmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY19zY3JvbGxfZmdfbmFtZSk7CisgICAgZ3VpLnNjcm9sbF9iZ19waXhlbCA9IGd1aV9nZXRfY29sb3IoKGNoYXJfdSAqKWd1aS5yc3JjX3Njcm9sbF9iZ19uYW1lKTsKKyNpZmRlZiBGRUFUX0JFVkFMCisgICAgZ3VpLnRvb2x0aXBfZmdfcGl4ZWwgPSBndWlfZ2V0X2NvbG9yKChjaGFyX3UgKilndWkucnNyY190b29sdGlwX2ZnX25hbWUpOworICAgIGd1aS50b29sdGlwX2JnX3BpeGVsID0gZ3VpX2dldF9jb2xvcigoY2hhcl91ICopZ3VpLnJzcmNfdG9vbHRpcF9iZ19uYW1lKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpICYmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKQorICAgIC8qIElmIHRoZSBtZW51IGhlaWdodCB3YXMgc2V0LCBkb24ndCBjaGFuZ2UgaXQgYXQgcnVudGltZSAqLworICAgIGlmIChndWkubWVudV9oZWlnaHQgIT0gTUVOVV9ERUZBVUxUX0hFSUdIVCkKKwlndWkubWVudV9oZWlnaHRfZml4ZWQgPSBUUlVFOworI2VuZGlmCisKKyAgICAvKiBTZXQgZGVmYXVsdCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG91cnMgKi8KKyAgICBndWkubm9ybV9waXhlbCA9IGd1aS5kZWZfbm9ybV9waXhlbDsKKyAgICBndWkuYmFja19waXhlbCA9IGd1aS5kZWZfYmFja19waXhlbDsKKworICAgIC8qIENoZWNrIGlmIHJldmVyc2UgdmlkZW8gbmVlZHMgdG8gYmUgYXBwbGllZCAob24gU3VuIGl0J3MgZG9uZSBieSBYKSAqLworICAgIGlmIChndWkucnNyY19yZXZfdmlkZW8gJiYgZ3VpX2dldF9saWdodG5lc3MoZ3VpLmJhY2tfcGl4ZWwpCisJCQkJCSAgPiBndWlfZ2V0X2xpZ2h0bmVzcyhndWkubm9ybV9waXhlbCkpCisgICAgeworCWd1aS5ub3JtX3BpeGVsID0gZ3VpLmRlZl9iYWNrX3BpeGVsOworCWd1aS5iYWNrX3BpeGVsID0gZ3VpLmRlZl9ub3JtX3BpeGVsOworCWd1aS5kZWZfbm9ybV9waXhlbCA9IGd1aS5ub3JtX3BpeGVsOworCWd1aS5kZWZfYmFja19waXhlbCA9IGd1aS5iYWNrX3BpeGVsOworICAgIH0KKworICAgIC8qIEdldCB0aGUgY29sb3JzIGZyb20gdGhlICJOb3JtYWwiLCAiVG9vbHRpcCIsICJTY3JvbGxiYXIiIGFuZCAiTWVudSIKKyAgICAgKiBncm91cCAoc2V0IGluIHN5bnRheC5jIG9yIGluIGEgdmltcmMgZmlsZSkgKi8KKyAgICBzZXRfbm9ybWFsX2NvbG9ycygpOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGJhY2tncm91bmQgY29sb3IKKyAgICAgKi8KKyAgICBndWlfY2hlY2tfY29sb3JzKCk7CisKKyAgICAvKgorICAgICAqIFNldCB1cCB0aGUgR0NzLglUaGUgZm9udCBhdHRyaWJ1dGVzIHdpbGwgYmUgc2V0IGluIGd1aV9pbml0X2ZvbnQoKS4KKyAgICAgKi8KKyAgICBnY19tYXNrID0gR0NGb3JlZ3JvdW5kIHwgR0NCYWNrZ3JvdW5kOworICAgIGdjX3ZhbHMuZm9yZWdyb3VuZCA9IGd1aS5ub3JtX3BpeGVsOworICAgIGdjX3ZhbHMuYmFja2dyb3VuZCA9IGd1aS5iYWNrX3BpeGVsOworICAgIGd1aS50ZXh0X2djID0gWHRHZXRHQyh2aW1TaGVsbCwgZ2NfbWFzaywgJmdjX3ZhbHMpOworCisgICAgZ2NfdmFscy5mb3JlZ3JvdW5kID0gZ3VpLmJhY2tfcGl4ZWw7CisgICAgZ2NfdmFscy5iYWNrZ3JvdW5kID0gZ3VpLm5vcm1fcGl4ZWw7CisgICAgZ3VpLmJhY2tfZ2MgPSBYdEdldEdDKHZpbVNoZWxsLCBnY19tYXNrLCAmZ2NfdmFscyk7CisKKyAgICBnY19tYXNrIHw9IEdDRnVuY3Rpb247CisgICAgZ2NfdmFscy5mb3JlZ3JvdW5kID0gZ3VpLm5vcm1fcGl4ZWwgXiBndWkuYmFja19waXhlbDsKKyAgICBnY192YWxzLmJhY2tncm91bmQgPSBndWkubm9ybV9waXhlbCBeIGd1aS5iYWNrX3BpeGVsOworICAgIGdjX3ZhbHMuZnVuY3Rpb24gICA9IEdYeG9yOworICAgIGd1aS5pbnZlcnRfZ2MgPSBYdEdldEdDKHZpbVNoZWxsLCBnY19tYXNrLCAmZ2NfdmFscyk7CisKKyAgICBndWkudmlzaWJpbGl0eSA9IFZpc2liaWxpdHlVbm9ic2N1cmVkOworICAgIHgxMV9zZXR1cF9hdG9tcyhndWkuZHB5KTsKKworICAgIGlmIChndWlfd2luX3ggIT0gLTEgJiYgZ3VpX3dpbl95ICE9IC0xKQorCWd1aV9tY2hfc2V0X3dpbnBvcyhndWlfd2luX3gsIGd1aV93aW5feSk7CisKKyAgICAvKiBOb3cgYWRhcHQgdGhlIHN1cHBsaWVkKD8pIGdlb21ldHJ5LXNldHRpbmdzICovCisgICAgLyogQWRkZWQgYnkgS2pldGlsIEphY29ic2VuIDxramV0aWxqYUBzdHVkLmNzLnVpdC5ubz4gKi8KKyAgICBpZiAoZ3VpLmdlb20gIT0gTlVMTCAmJiAqZ3VpLmdlb20gIT0gTlVMKQorICAgIHsKKwltYXNrID0gWFBhcnNlR2VvbWV0cnkoKGNoYXIgKilndWkuZ2VvbSwgJngsICZ5LCAmdywgJmgpOworCWlmIChtYXNrICYgV2lkdGhWYWx1ZSkKKwkgICAgQ29sdW1ucyA9IHc7CisJaWYgKG1hc2sgJiBIZWlnaHRWYWx1ZSkKKwkgICAgUm93cyA9IGg7CisJLyoKKwkgKiBTZXQgdGhlICh4LHkpIHBvc2l0aW9uIG9mIHRoZSBtYWluIHdpbmRvdyBvbmx5IGlmIHNwZWNpZmllZCBpbiB0aGUKKwkgKiB1c2VycyBnZW9tZXRyeSwgc28gd2UgZ2V0IGdvb2QgZGVmYXVsdHMgd2hlbiB0aGV5IGRvbid0LiBUaGlzIG5lZWRzCisJICogdG8gYmUgZG9uZSBiZWZvcmUgdGhlIHNoZWxsIGlzIHBvcHBlZCB1cC4KKwkgKi8KKwlpZiAobWFzayAmIChYVmFsdWV8WVZhbHVlKSkKKwkgICAgWHRWYVNldFZhbHVlcyh2aW1TaGVsbCwgWHROZ2VvbWV0cnksIGd1aS5nZW9tLCBOVUxMKTsKKyAgICB9CisKKyAgICBndWlfeDExX2NyZWF0ZV93aWRnZXRzKCk7CisKKyAgIC8qCisgICAgKiBBZGQgYW4gaWNvbiB0byBWaW0gKE1hcmNlbCBEb3ViZW46IDExIE1heSAxOTk4KS4KKyAgICAqLworICAgIGlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX0lDT04pICE9IE5VTEwpCisgICAgeworI2lmbmRlZiBIQVZFX1hQTQorIyBpbmNsdWRlICJ2aW1faWNvbi54Ym0iCisjIGluY2x1ZGUgInZpbV9tYXNrLnhibSIKKworCUFyZwlhcmdbMl07CisKKwlYdFNldEFyZyhhcmdbMF0sIFh0Tmljb25QaXhtYXAsCisJCVhDcmVhdGVCaXRtYXBGcm9tRGF0YShndWkuZHB5LAorCQkgICAgRGVmYXVsdFJvb3RXaW5kb3coZ3VpLmRweSksCisJCSAgICAoY2hhciAqKXZpbV9pY29uX2JpdHMsCisJCSAgICB2aW1faWNvbl93aWR0aCwKKwkJICAgIHZpbV9pY29uX2hlaWdodCkpOworCVh0U2V0QXJnKGFyZ1sxXSwgWHROaWNvbk1hc2ssCisJCVhDcmVhdGVCaXRtYXBGcm9tRGF0YShndWkuZHB5LAorCQkgICAgRGVmYXVsdFJvb3RXaW5kb3coZ3VpLmRweSksCisJCSAgICAoY2hhciAqKXZpbV9tYXNrX2ljb25fYml0cywKKwkJICAgIHZpbV9tYXNrX2ljb25fd2lkdGgsCisJCSAgICB2aW1fbWFza19pY29uX2hlaWdodCkpOworCVh0U2V0VmFsdWVzKHZpbVNoZWxsLCBhcmcsIChDYXJkaW5hbCkyKTsKKyNlbHNlCisvKiBVc2UgUGl4bWFwcywgbG9va2luZyBtdWNoIG5pY2VyLiAqLworCisvKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgaGVyZSwgeW91IHN0aWxsIG5lZWQgdG8gdW5wYWNrIHRoZSBydW50aW1lCisgKiBhcmNoaXZlISAqLworIyBpZmRlZiBtYWdpY2sKKyMgIHVuZGVmIG1hZ2ljaworIyBlbmRpZgorIyBkZWZpbmUgbWFnaWNrIHZpbTMyeDMyCisjIGluY2x1ZGUgIi4uL3J1bnRpbWUvdmltMzJ4MzIueHBtIgorIyB1bmRlZiBtYWdpY2sKKyMgZGVmaW5lIG1hZ2ljayB2aW0xNngxNgorIyBpbmNsdWRlICIuLi9ydW50aW1lL3ZpbTE2eDE2LnhwbSIKKyMgdW5kZWYgbWFnaWNrCisjIGRlZmluZSBtYWdpY2sgdmltNDh4NDgKKyMgaW5jbHVkZSAiLi4vcnVudGltZS92aW00OHg0OC54cG0iCisjIHVuZGVmIG1hZ2ljaworCisgICAgc3RhdGljIFBpeG1hcAlpY29uID0gMDsKKyAgICBzdGF0aWMgUGl4bWFwCWljb25fbWFzayA9IDA7CisgICAgc3RhdGljIGNoYXIJCSoqbWFnaWNrID0gdmltMzJ4MzI7CisgICAgV2luZG93CQlyb290X3dpbmRvdzsKKyAgICBYSWNvblNpemUJCSpzaXplOworICAgIGludAkJCW51bWJlcl9zaXplczsKKyAgICBEaXNwbGF5CQkqZHNwOworICAgIFNjcmVlbgkJKnNjcjsKKyAgICBYcG1BdHRyaWJ1dGVzCWF0dHI7CisgICAgQ29sb3JtYXAJCWNtYXA7CisKKyAgICAvKgorICAgICAqIEFkanVzdCB0aGUgaWNvbiB0byB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGFjdHVhbCB3aW5kb3cgbWFuYWdlci4KKyAgICAgKi8KKyAgICByb290X3dpbmRvdyA9IFhSb290V2luZG93T2ZTY3JlZW4oWHRTY3JlZW4odmltU2hlbGwpKTsKKyAgICBpZiAoWEdldEljb25TaXplcyhYdERpc3BsYXkodmltU2hlbGwpLCByb290X3dpbmRvdywKKwkJCQkJCSAgICZzaXplLCAmbnVtYmVyX3NpemVzKSAhPSAwKQorICAgIHsKKworCWlmIChudW1iZXJfc2l6ZXMgPiAwKQorCXsKKwkgICAgaWYgKHNpemUtPm1heF9oZWlnaHQgPj0gNDggJiYgc2l6ZS0+bWF4X2hlaWdodCA+PSA0OCkKKwkJbWFnaWNrID0gdmltNDh4NDg7CisJICAgIGVsc2UgaWYgKHNpemUtPm1heF9oZWlnaHQgPj0gMzIgJiYgc2l6ZS0+bWF4X2hlaWdodCA+PSAzMikKKwkJbWFnaWNrID0gdmltMzJ4MzI7CisJICAgIGVsc2UgaWYgKHNpemUtPm1heF9oZWlnaHQgPj0gMTYgJiYgc2l6ZS0+bWF4X2hlaWdodCA+PSAxNikKKwkJbWFnaWNrID0gdmltMTZ4MTY7CisJfQorICAgIH0KKworICAgIGRzcCA9IFh0RGlzcGxheSh2aW1TaGVsbCk7CisgICAgc2NyID0gWHRTY3JlZW4odmltU2hlbGwpOworCisgICAgY21hcCA9IERlZmF1bHRDb2xvcm1hcChkc3AsIERlZmF1bHRTY3JlZW4oZHNwKSk7CisgICAgWHRWYVNldFZhbHVlcyh2aW1TaGVsbCwgWHROY29sb3JtYXAsIGNtYXAsIE5VTEwpOworCisgICAgYXR0ci52YWx1ZW1hc2sgPSAwTDsKKyAgICBhdHRyLnZhbHVlbWFzayA9IFhwbUNsb3NlbmVzcyB8IFhwbVJldHVyblBpeGVscyB8IFhwbUNvbG9ybWFwIHwgWHBtRGVwdGg7CisgICAgYXR0ci5jbG9zZW5lc3MgPSA2NTUzNTsJLyogYWNjdXJhY3kgaXNuJ3QgY3J1Y2lhbCAqLworICAgIGF0dHIuY29sb3JtYXAgPSBjbWFwOworICAgIGF0dHIuZGVwdGggPSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzY3IpOworCisgICAgaWYgKCFpY29uKQorCVhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhKGRzcCwgcm9vdF93aW5kb3csIG1hZ2ljaywgJmljb24sCisJCQkJCQkJICAgJmljb25fbWFzaywgJmF0dHIpOworCisjIGlmZGVmIEZFQVRfR1VJX0FUSEVOQQorICAgIFh0VmFTZXRWYWx1ZXModmltU2hlbGwsIFh0Tmljb25QaXhtYXAsIGljb24sIFh0Tmljb25NYXNrLCBpY29uX21hc2ssIE5VTEwpOworIyBlbHNlCisgICAgWHRWYVNldFZhbHVlcyh2aW1TaGVsbCwgWG1OaWNvblBpeG1hcCwgaWNvbiwgWG1OaWNvbk1hc2ssIGljb25fbWFzaywgTlVMTCk7CisjIGVuZGlmCisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoZ3VpLmNvbG9yX2FwcHJveCkKKwlFTVNHKF8oIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiKSk7CisKKyNpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorICAgIGlmICh1c2luZ1N1bldvcmtTaG9wKQorCXdvcmtzaG9wX2Nvbm5lY3QoYXBwX2NvbnRleHQpOworI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKHVzaW5nTmV0YmVhbnMpCisJbmV0YmVhbnNfWHRfY29ubmVjdChhcHBfY29udGV4dCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQkVWQUwKKyAgICBndWlfaW5pdF90b29sdGlwX2ZvbnQoKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUVOVQorICAgIGd1aV9pbml0X21lbnVfZm9udCgpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfWFNNUAorICAgIC8qIEF0dGFjaCBsaXN0ZW5lciBvbiBJQ0UgY29ubmVjdGlvbiAqLworICAgIGlmICgtMSAhPSB4c21wX2ljZWZkKQorCV94c21wX3h0aW5wdXRpZCA9IFh0QXBwQWRkSW5wdXQoYXBwX2NvbnRleHQsIHhzbXBfaWNlZmQsCisJCShYdFBvaW50ZXIpWHRJbnB1dFJlYWRNYXNrLCBsb2NhbF94c21wX2hhbmRsZV9yZXF1ZXN0cywgTlVMTCk7CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBHVUkgZmFpbHMgYWZ0ZXIgY2FsbGluZyBndWlfbWNoX2luaXQoKS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdW5pbml0KCkKK3sKKyAgICBndWlfeDExX2Rlc3Ryb3lfd2lkZ2V0cygpOworI2lmbmRlZiBMRVNTVElGX1ZFUlNJT04KKyAgICBYdENsb3NlRGlzcGxheShndWkuZHB5KTsKKyNlbmRpZgorICAgIGd1aS5kcHkgPSBOVUxMOworICAgIHZpbVNoZWxsID0gKFdpZGdldCkwOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBjb2xvciBoYXMgYmVlbiBjaGFuZ2VkLgorICovCisgICAgdm9pZAorZ3VpX21jaF9uZXdfY29sb3JzKCkKK3sKKyAgICBsb25nX3UJZ2NfbWFzazsKKyAgICBYR0NWYWx1ZXMJZ2NfdmFsczsKKworICAgIGdjX21hc2sgPSBHQ0ZvcmVncm91bmQgfCBHQ0JhY2tncm91bmQ7CisgICAgZ2NfdmFscy5mb3JlZ3JvdW5kID0gZ3VpLm5vcm1fcGl4ZWw7CisgICAgZ2NfdmFscy5iYWNrZ3JvdW5kID0gZ3VpLmJhY2tfcGl4ZWw7CisgICAgaWYgKGd1aS50ZXh0X2djICE9IE5VTEwpCisJWENoYW5nZUdDKGd1aS5kcHksIGd1aS50ZXh0X2djLCBnY19tYXNrLCAmZ2NfdmFscyk7CisKKyAgICBnY192YWxzLmZvcmVncm91bmQgPSBndWkuYmFja19waXhlbDsKKyAgICBnY192YWxzLmJhY2tncm91bmQgPSBndWkubm9ybV9waXhlbDsKKyAgICBpZiAoZ3VpLmJhY2tfZ2MgIT0gTlVMTCkKKwlYQ2hhbmdlR0MoZ3VpLmRweSwgZ3VpLmJhY2tfZ2MsIGdjX21hc2ssICZnY192YWxzKTsKKworICAgIGdjX21hc2sgfD0gR0NGdW5jdGlvbjsKKyAgICBnY192YWxzLmZvcmVncm91bmQgPSBndWkubm9ybV9waXhlbCBeIGd1aS5iYWNrX3BpeGVsOworICAgIGdjX3ZhbHMuYmFja2dyb3VuZCA9IGd1aS5ub3JtX3BpeGVsIF4gZ3VpLmJhY2tfcGl4ZWw7CisgICAgZ2NfdmFscy5mdW5jdGlvbiAgID0gR1h4b3I7CisgICAgaWYgKGd1aS5pbnZlcnRfZ2MgIT0gTlVMTCkKKwlYQ2hhbmdlR0MoZ3VpLmRweSwgZ3VpLmludmVydF9nYywgZ2NfbWFzaywgJmdjX3ZhbHMpOworCisgICAgZ3VpX3gxMV9zZXRfYmFja19jb2xvcigpOworfQorCisvKgorICogT3BlbiB0aGUgR1VJIHdpbmRvdyB3aGljaCB3YXMgY3JlYXRlZCBieSBhIGNhbGwgdG8gZ3VpX21jaF9pbml0KCkuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfb3BlbigpCit7CisgICAgLyogQWN0dWFsbHkgb3BlbiB0aGUgd2luZG93ICovCisgICAgWHRQb3B1cCh2aW1TaGVsbCwgWHRHcmFiTm9uZSk7CisKKyAgICBndWkud2lkID0gZ3VpX3gxMV9nZXRfd2lkKCk7CisgICAgZ3VpLmJsYW5rX3BvaW50ZXIgPSBndWlfeDExX2NyZWF0ZV9ibGFua19tb3VzZSgpOworCisgICAgLyoKKyAgICAgKiBBZGQgYSBjYWxsYmFjayBmb3IgdGhlIENsb3NlIGl0ZW0gb24gdGhlIHdpbmRvdyBtYW5hZ2VycyBtZW51LCBhbmQgdGhlCisgICAgICogc2F2ZS15b3Vyc2VsZiBldmVudC4KKyAgICAgKi8KKyAgICB3bV9hdG9tc1tTQVZFX1lPVVJTRUxGX0lEWF0gPQorCQkJICAgICAgWEludGVybkF0b20oZ3VpLmRweSwgIldNX1NBVkVfWU9VUlNFTEYiLCBGYWxzZSk7CisgICAgd21fYXRvbXNbREVMRVRFX1dJTkRPV19JRFhdID0KKwkJCSAgICAgIFhJbnRlcm5BdG9tKGd1aS5kcHksICJXTV9ERUxFVEVfV0lORE9XIiwgRmFsc2UpOworICAgIFhTZXRXTVByb3RvY29scyhndWkuZHB5LCBYdFdpbmRvdyh2aW1TaGVsbCksIHdtX2F0b21zLCAyKTsKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih2aW1TaGVsbCwgTm9FdmVudE1hc2ssIFRydWUsIGd1aV94MTFfd21fcHJvdG9jb2xfaGFuZGxlciwKKwkJCQkJCQkgICAgIE5VTEwpOworI2lmZGVmIEhBVkVfWDExX1hNVV9FRElUUkVTX0gKKyAgICAvKgorICAgICAqIEVuYWJsZSBlZGl0cmVzIHByb3RvY29sIChzZWUgIm1hbiBlZGl0cmVzIikuCisgICAgICogVXN1YWxseSB3aWxsIG5lZWQgdG8gYWRkIC1sWG11IHRvIHRoZSBsaW5rZXIgbGluZSBhcyB3ZWxsLgorICAgICAqLworICAgIFh0QWRkRXZlbnRIYW5kbGVyKHZpbVNoZWxsLCAoRXZlbnRNYXNrKTAsIFRydWUsIF9YRWRpdFJlc0NoZWNrTWVzc2FnZXMsCisJICAgIChYdFBvaW50ZXIpTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisgICAgaWYgKHNlcnZlck5hbWUgPT0gTlVMTCAmJiBzZXJ2ZXJEZWxheWVkU3RhcnROYW1lICE9IE5VTEwpCisgICAgeworCS8qIFRoaXMgaXMgYSA6Z3VpIGNvbW1hbmQgaW4gYSBwbGFpbiB2aW0gd2l0aCBubyBwcmV2aW91cyBzZXJ2ZXIgKi8KKwljb21tV2luZG93ID0gWHRXaW5kb3codmltU2hlbGwpOworCSh2b2lkKXNlcnZlclJlZ2lzdGVyTmFtZShndWkuZHB5LCBzZXJ2ZXJEZWxheWVkU3RhcnROYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIENhbm5vdCBoYW5kbGUgIndpZGdldC1sZXNzIiB3aW5kb3dzIHdpdGggWHRQcm9jZXNzRXZlbnQoKSB3ZSdsbAorCSAqIGhhdmUgdG8gY2hhbmdlIHRoZSAic2VydmVyIiByZWdpc3RyYXRpb24gdG8gdGhhdCBvZiB0aGUgbWFpbiB3aW5kb3cKKwkgKiBJZiB3ZSBoYXZlIG5vdCByZWdpc3RlcmVkIGEgbmFtZSB5ZXQsIHJlbWVtYmVyIHRoZSB3aW5kb3cKKwkgKi8KKwlzZXJ2ZXJDaGFuZ2VSZWdpc3RlcmVkV2luZG93KGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSk7CisgICAgfQorICAgIFh0QWRkRXZlbnRIYW5kbGVyKHZpbVNoZWxsLCBQcm9wZXJ0eUNoYW5nZU1hc2ssIEZhbHNlLAorCQkgICAgICBndWlfeDExX3NlbmRfZXZlbnRfaGFuZGxlciwgTlVMTCk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChGRUFUX01FTlUpICYmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKQorICAgIC8qIFRoZSBBdGhlbmEgR1VJIG5lZWRzIHRoaXMgYWdhaW4gYWZ0ZXIgb3BlbmluZyB0aGUgd2luZG93ICovCisgICAgZ3VpX3Bvc2l0aW9uX21lbnUoKTsKKyMgaWZkZWYgRkVBVF9UT09MQkFSCisgICAgZ3VpX21jaF9zZXRfdG9vbGJhcl9wb3MoMCwgZ3VpLm1lbnVfaGVpZ2h0LCBndWkubWVudV93aWR0aCwKKwkJCSAgICBndWkudG9vbGJhcl9oZWlnaHQpOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAvKiBHZXQgdGhlIGNvbG9ycyBmb3IgdGhlIGhpZ2hsaWdodCBncm91cHMgKGd1aV9jaGVja19jb2xvcnMoKSBtaWdodCBoYXZlCisgICAgICogY2hhbmdlZCB0aGVtKSAqLworICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOwkJLyogcmUtaW5pdCBjb2xvcnMgYW5kIGZvbnRzICovCisKKyNpZmRlZiBGRUFUX0hBTkdVTElOCisgICAgaGFuZ3VsX2tleWJvYXJkX3NldCgpOworI2VuZGlmCisjaWZkZWYgRkVBVF9YSU0KKyAgICB4aW1faW5pdCgpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TVU5fV09SS1NIT1AKKyAgICB3b3Jrc2hvcF9wb3N0aW5pdCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQkVWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29udmVydCB0aGUgdG9vbHRpcCBmb250c2V0IG5hbWUgdG8gYW4gWEZvbnRTZXQuCisgKi8KKyAgICB2b2lkCitndWlfaW5pdF90b29sdGlwX2ZvbnQoKQoreworICAgIFhybVZhbHVlIGZyb20sIHRvOworCisgICAgZnJvbS5hZGRyID0gKGNoYXIgKilndWkucnNyY190b29sdGlwX2ZvbnRfbmFtZTsKKyAgICBmcm9tLnNpemUgPSBzdHJsZW4oZnJvbS5hZGRyKTsKKyAgICB0by5hZGRyID0gKFh0UG9pbnRlcikmZ3VpLnRvb2x0aXBfZm9udHNldDsKKyAgICB0by5zaXplID0gc2l6ZW9mKFhGb250U2V0KTsKKworICAgIGlmIChYdENvbnZlcnRBbmRTdG9yZSh2aW1TaGVsbCwgWHRSU3RyaW5nLCAmZnJvbSwgWHRSRm9udFNldCwgJnRvKSA9PSBGYWxzZSkKKyAgICB7CisJLyogRmFpbGVkLiBXaGF0IHRvIGRvPyAqLworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKiBDb252ZXJ0IHRoZSBtZW51IGZvbnQvZm9udHNldCBuYW1lIHRvIGFuIFhGb250U3RydWN0L1hGb250c2V0ICovCisgICAgdm9pZAorZ3VpX2luaXRfbWVudV9mb250KCkKK3sKKyAgICBYcm1WYWx1ZSBmcm9tLCB0bzsKKworI2lmZGVmIEZPTlRTRVRfQUxXQVlTCisgICAgZnJvbS5hZGRyID0gKGNoYXIgKilndWkucnNyY19tZW51X2ZvbnRfbmFtZTsKKyAgICBmcm9tLnNpemUgPSBzdHJsZW4oZnJvbS5hZGRyKTsKKyAgICB0by5hZGRyID0gKFh0UG9pbnRlcikmZ3VpLm1lbnVfZm9udHNldDsKKyAgICB0by5zaXplID0gc2l6ZW9mKEd1aUZvbnRzZXQpOworCisgICAgaWYgKFh0Q29udmVydEFuZFN0b3JlKHZpbVNoZWxsLCBYdFJTdHJpbmcsICZmcm9tLCBYdFJGb250U2V0LCAmdG8pID09IEZhbHNlKQorICAgIHsKKwkvKiBGYWlsZWQuIFdoYXQgdG8gZG8/ICovCisgICAgfQorI2Vsc2UKKyAgICBmcm9tLmFkZHIgPSAoY2hhciAqKWd1aS5yc3JjX21lbnVfZm9udF9uYW1lOworICAgIGZyb20uc2l6ZSA9IHN0cmxlbihmcm9tLmFkZHIpOworICAgIHRvLmFkZHIgPSAoWHRQb2ludGVyKSZndWkubWVudV9mb250OworICAgIHRvLnNpemUgPSBzaXplb2YoR3VpRm9udCk7CisKKyAgICBpZiAoWHRDb252ZXJ0QW5kU3RvcmUodmltU2hlbGwsIFh0UlN0cmluZywgJmZyb20sIFh0UkZvbnRTdHJ1Y3QsICZ0bykgPT0gRmFsc2UpCisgICAgeworCS8qIEZhaWxlZC4gV2hhdCB0byBkbz8gKi8KKyAgICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitndWlfbWNoX2V4aXQocmMpCisgICAgaW50CQlyYzsKK3sKKyNpZiAwCisgICAgLyogTGVzc3RpZiBnaXZlcyBhbiBlcnJvciBtZXNzYWdlIGhlcmUsIGFuZCBzbyBkb2VzIFNvbGFyaXMuICBUaGUgbWFuIHBhZ2UKKyAgICAgKiBzYXlzIHRoYXQgdGhpcyBpc24ndCBuZWVkZWQgd2hlbiBleGl0aW5nLCBzbyBqdXN0IHNraXAgaXQuICovCisgICAgWHRDbG9zZURpc3BsYXkoZ3VpLmRweSk7CisjZW5kaWYKK30KKworLyoKKyAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgorICovCisgICAgaW50CitndWlfbWNoX2dldF93aW5wb3MoeCwgeSkKKyAgICBpbnQJCSp4LCAqeTsKK3sKKyAgICBEaW1lbnNpb24JeHBvcywgeXBvczsKKworICAgIFh0VmFHZXRWYWx1ZXModmltU2hlbGwsCisJWHROeCwJJnhwb3MsCisJWHROeSwJJnlwb3MsCisJTlVMTCk7CisgICAgKnggPSB4cG9zOworICAgICp5ID0geXBvczsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvdyB0byB0aGUgZ2l2ZW4KKyAqIGNvb3JkaW5hdGVzLgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfd2lucG9zKHgsIHkpCisgICAgaW50CQl4LCB5OworeworICAgIFh0VmFTZXRWYWx1ZXModmltU2hlbGwsCisJWHROeCwJeCwKKwlYdE55LAl5LAorCU5VTEwpOworfQorCisgICAgdm9pZAorZ3VpX21jaF9zZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIG1pbl93aWR0aCwgbWluX2hlaWdodCwKKwkJICAgIGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0KQorICAgIGludAkJd2lkdGg7CisgICAgaW50CQloZWlnaHQ7CisgICAgaW50CQltaW5fd2lkdGg7CisgICAgaW50CQltaW5faGVpZ2h0OworICAgIGludAkJYmFzZV93aWR0aDsKKyAgICBpbnQJCWJhc2VfaGVpZ2h0OworeworICAgIFh0VmFTZXRWYWx1ZXModmltU2hlbGwsCisJWHROd2lkdGhJbmMsCWd1aS5jaGFyX3dpZHRoLAorCVh0TmhlaWdodEluYywJZ3VpLmNoYXJfaGVpZ2h0LAorI2lmIGRlZmluZWQoWHRTcGVjaWZpY2F0aW9uUmVsZWFzZSkgJiYgWHRTcGVjaWZpY2F0aW9uUmVsZWFzZSA+PSA0CisJWHROYmFzZVdpZHRoLAliYXNlX3dpZHRoLAorCVh0TmJhc2VIZWlnaHQsCWJhc2VfaGVpZ2h0LAorI2VuZGlmCisJWHRObWluV2lkdGgsCW1pbl93aWR0aCwKKwlYdE5taW5IZWlnaHQsCW1pbl9oZWlnaHQsCisJWHROd2lkdGgsCXdpZHRoLAorI2lmZGVmIEZFQVRfWElNCisJWHROaGVpZ2h0LAloZWlnaHQgKyB4aW1fZ2V0X3N0YXR1c19hcmVhX2hlaWdodCgpLAorI2Vsc2UKKwlYdE5oZWlnaHQsCWhlaWdodCwKKyNlbmRpZgorCU5VTEwpOworfQorCisvKgorICogQWxsb3cgMTAgcGl4ZWxzIGZvciBob3Jpem9udGFsIGJvcmRlcnMsIDMwIGZvciB2ZXJ0aWNhbCBib3JkZXJzLgorICogSXMgdGhlcmUgbm8gd2F5IGluIFggdG8gZmluZCBvdXQgaG93IHdpZGUgdGhlIGJvcmRlcnMgcmVhbGx5IGFyZT8KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKHNjcmVlbl93LCBzY3JlZW5faCkKKyAgICBpbnQJICAgICpzY3JlZW5fdzsKKyAgICBpbnQJICAgICpzY3JlZW5faDsKK3sKKyAgICAqc2NyZWVuX3cgPSBEaXNwbGF5V2lkdGgoZ3VpLmRweSwgRGVmYXVsdFNjcmVlbihndWkuZHB5KSkgLSAxMDsKKyAgICAqc2NyZWVuX2ggPSBEaXNwbGF5SGVpZ2h0KGd1aS5kcHksIERlZmF1bHRTY3JlZW4oZ3VpLmRweSkpIC0gcF9naHI7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHZpbSB0byB1c2UgdGhlIGZvbnQgImZvbnRfbmFtZSIuICBJZiBpdCdzIE5VTEwsIHBpY2sgYSBkZWZhdWx0CisgKiBmb250LgorICogSWYgImZvbnRzZXQiIGlzIFRSVUUsIGxvYWQgdGhlICJmb250X25hbWUiIGFzIGEgZm9udHNldC4KKyAqIFJldHVybiBGQUlMIGlmIHRoZSBmb250IGNvdWxkIG5vdCBiZSBsb2FkZWQsIE9LIG90aGVyd2lzZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgaW50CitndWlfbWNoX2luaXRfZm9udChmb250X25hbWUsIGRvX2ZvbnRzZXQpCisgICAgY2hhcl91CSpmb250X25hbWU7CisgICAgaW50CQlkb19mb250c2V0OworeworICAgIFhGb250U3RydWN0CSpmb250ID0gTlVMTDsKKworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBYRm9udFNldAlmb250c2V0ID0gTlVMTDsKKworICAgIGlmIChkb19mb250c2V0KQorICAgIHsKKwkvKiBJZiAnZ3VpZm9udHNldCcgaXMgc2V0LCBWSU0gdHJlYXRzIGFsbCBmb250IHNwZWNpZmljYXRpb25zIGFzIGlmCisJICogdGhleSB3ZXJlIGZvbnRzZXRzLCBhbmQgJ2d1aWZvbnRzZXQnIGJlY29tZXMgdGhlIGRlZmF1bHQuICovCisJaWYgKGZvbnRfbmFtZSAhPSBOVUxMKQorCXsKKwkgICAgZm9udHNldCA9IChYRm9udFNldClndWlfbWNoX2dldF9mb250c2V0KGZvbnRfbmFtZSwgRkFMU0UsIFRSVUUpOworCSAgICBpZiAoZm9udHNldCA9PSBOVUxMKQorCQlyZXR1cm4gRkFJTDsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlpZiAoZm9udF9uYW1lID09IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBJZiBub25lIG9mIHRoZSBmb250cyBpbiAnZm9udCcgY291bGQgYmUgbG9hZGVkLCB0cnkgdGhlIG9uZSBzZXQKKwkgICAgICogaW4gdGhlIFggcmVzb3VyY2UsIGFuZCBmaW5hbGx5IGp1c3QgdHJ5IHVzaW5nIERGTFRfRk9OVCwgd2hpY2gKKwkgICAgICogd2lsbCBob3BlZnVsbHkgYWx3YXlzIGJlIHRoZXJlLgorCSAgICAgKi8KKwkgICAgZm9udF9uYW1lID0gZ3VpLnJzcmNfZm9udF9uYW1lOworCSAgICBmb250ID0gKFhGb250U3RydWN0ICopZ3VpX21jaF9nZXRfZm9udChmb250X25hbWUsIEZBTFNFKTsKKwkgICAgaWYgKGZvbnQgPT0gTlVMTCkKKwkJZm9udF9uYW1lID0gKGNoYXJfdSAqKURGTFRfRk9OVDsKKwl9CisJaWYgKGZvbnQgPT0gTlVMTCkKKwkgICAgZm9udCA9IChYRm9udFN0cnVjdCAqKWd1aV9tY2hfZ2V0X2ZvbnQoZm9udF9uYW1lLCBGQUxTRSk7CisJaWYgKGZvbnQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLm5vcm1fZm9udCk7CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGd1aV9tY2hfZnJlZV9mb250c2V0KGd1aS5mb250c2V0KTsKKworICAgIGlmIChmb250c2V0ICE9IE5VTEwpCisgICAgeworCWd1aS5ub3JtX2ZvbnQgPSBOT0ZPTlQ7CisJZ3VpLmZvbnRzZXQgPSAoR3VpRm9udHNldClmb250c2V0OworCWd1aS5jaGFyX3dpZHRoID0gZm9udHNldF93aWR0aChmb250c2V0KTsKKwlndWkuY2hhcl9oZWlnaHQgPSBmb250c2V0X2hlaWdodChmb250c2V0KSArIHBfbGluZXNwYWNlOworCWd1aS5jaGFyX2FzY2VudCA9IGZvbnRzZXRfYXNjZW50KGZvbnRzZXQpICsgcF9saW5lc3BhY2UgLyAyOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJZ3VpLm5vcm1fZm9udCA9IChHdWlGb250KWZvbnQ7CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCWd1aS5mb250c2V0ID0gTk9GT05UU0VUOworI2VuZGlmCisJZ3VpLmNoYXJfd2lkdGggPSBmb250LT5tYXhfYm91bmRzLndpZHRoOworCWd1aS5jaGFyX2hlaWdodCA9IGZvbnQtPmFzY2VudCArIGZvbnQtPmRlc2NlbnQgKyBwX2xpbmVzcGFjZTsKKwlndWkuY2hhcl9hc2NlbnQgPSBmb250LT5hc2NlbnQgKyBwX2xpbmVzcGFjZSAvIDI7CisgICAgfQorCisgICAgaGxfc2V0X2ZvbnRfbmFtZShmb250X25hbWUpOworCisgICAgLyoKKyAgICAgKiBUcnkgdG8gbG9hZCBvdGhlciBmb250cyBmb3IgYm9sZCwgaXRhbGljLCBhbmQgYm9sZC1pdGFsaWMuCisgICAgICogV2Ugc2hvdWxkIGFsc28gdHJ5IHRvIHdvcmsgb3V0IHdoYXQgZm9udCB0byB1c2UgZm9yIHRoZXNlIHdoZW4gdGhleSBhcmUKKyAgICAgKiBub3Qgc3BlY2lmaWVkIGJ5IFggcmVzb3VyY2VzLCBidXQgd2UgZG9uJ3QgeWV0LgorICAgICAqLworICAgIGlmIChmb250X25hbWUgPT0gZ3VpLnJzcmNfZm9udF9uYW1lKQorICAgIHsKKwlpZiAoZ3VpLmJvbGRfZm9udCA9PSBOT0ZPTlQKKwkJJiYgZ3VpLnJzcmNfYm9sZF9mb250X25hbWUgIT0gTlVMTAorCQkmJiAqZ3VpLnJzcmNfYm9sZF9mb250X25hbWUgIT0gTlVMKQorCSAgICBndWkuYm9sZF9mb250ID0gZ3VpX21jaF9nZXRfZm9udChndWkucnNyY19ib2xkX2ZvbnRfbmFtZSwgRkFMU0UpOworCWlmIChndWkuaXRhbF9mb250ID09IE5PRk9OVAorCQkmJiBndWkucnNyY19pdGFsX2ZvbnRfbmFtZSAhPSBOVUxMCisJCSYmICpndWkucnNyY19pdGFsX2ZvbnRfbmFtZSAhPSBOVUwpCisJICAgIGd1aS5pdGFsX2ZvbnQgPSBndWlfbWNoX2dldF9mb250KGd1aS5yc3JjX2l0YWxfZm9udF9uYW1lLCBGQUxTRSk7CisJaWYgKGd1aS5ib2xkaXRhbF9mb250ID09IE5PRk9OVAorCQkmJiBndWkucnNyY19ib2xkaXRhbF9mb250X25hbWUgIT0gTlVMTAorCQkmJiAqZ3VpLnJzcmNfYm9sZGl0YWxfZm9udF9uYW1lICE9IE5VTCkKKwkgICAgZ3VpLmJvbGRpdGFsX2ZvbnQgPSBndWlfbWNoX2dldF9mb250KGd1aS5yc3JjX2JvbGRpdGFsX2ZvbnRfbmFtZSwKKwkJCQkJCQkJICAgICAgIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBXaGVuIG5vdCB1c2luZyB0aGUgZm9udCBzcGVjaWZpZWQgYnkgdGhlIHJlc291cmNlcywgYWxzbyBkb24ndCB1c2UKKwkgKiB0aGUgYm9sZC9pdGFsaWMgZm9udHMsIG90aGVyd2lzZSBzZXR0aW5nICdndWlmb250JyB3aWxsIGxvb2sgdmVyeQorCSAqIHN0cmFuZ2UuICovCisJaWYgKGd1aS5ib2xkX2ZvbnQgIT0gTk9GT05UKQorCXsKKwkgICAgWEZyZWVGb250KGd1aS5kcHksIChYRm9udFN0cnVjdCAqKWd1aS5ib2xkX2ZvbnQpOworCSAgICBndWkuYm9sZF9mb250ID0gTk9GT05UOworCX0KKwlpZiAoZ3VpLml0YWxfZm9udCAhPSBOT0ZPTlQpCisJeworCSAgICBYRnJlZUZvbnQoZ3VpLmRweSwgKFhGb250U3RydWN0ICopZ3VpLml0YWxfZm9udCk7CisJICAgIGd1aS5pdGFsX2ZvbnQgPSBOT0ZPTlQ7CisJfQorCWlmIChndWkuYm9sZGl0YWxfZm9udCAhPSBOT0ZPTlQpCisJeworCSAgICBYRnJlZUZvbnQoZ3VpLmRweSwgKFhGb250U3RydWN0ICopZ3VpLmJvbGRpdGFsX2ZvbnQpOworCSAgICBndWkuYm9sZGl0YWxfZm9udCA9IE5PRk9OVDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogR2V0IGEgZm9udCBzdHJ1Y3R1cmUgZm9yIGhpZ2hsaWdodGluZy4KKyAqLworICAgIEd1aUZvbnQKK2d1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgZ2l2ZUVycm9ySWZNaXNzaW5nKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKK3sKKyAgICBYRm9udFN0cnVjdAkqZm9udDsKKworICAgIGlmICghZ3VpLmluX3VzZSB8fCBuYW1lID09IE5VTEwpICAgIC8qIGNhbid0IGRvIHRoaXMgd2hlbiBHVUkgbm90IHJ1bm5pbmcgKi8KKwlyZXR1cm4gTk9GT05UOworCisgICAgZm9udCA9IFhMb2FkUXVlcnlGb250KGd1aS5kcHksIChjaGFyICopbmFtZSk7CisKKyAgICBpZiAoZm9udCA9PSBOVUxMKQorICAgIHsKKwlpZiAoZ2l2ZUVycm9ySWZNaXNzaW5nKQorCSAgICBFTVNHMihfKGVfZm9udCksIG5hbWUpOworCXJldHVybiBOT0ZPTlQ7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoIkZvbnQgSW5mb3JtYXRpb24gZm9yICclcyc6XG4iLCBuYW1lKTsKKyAgICBwcmludGYoIiAgdyA9ICVkLCBoID0gJWQsIGFzY2VudCA9ICVkLCBkZXNjZW50ID0gJWRcbiIsCisJICAgZm9udC0+bWF4X2JvdW5kcy53aWR0aCwgZm9udC0+YXNjZW50ICsgZm9udC0+ZGVzY2VudCwKKwkgICBmb250LT5hc2NlbnQsIGZvbnQtPmRlc2NlbnQpOworICAgIHByaW50ZigiICBtYXggYXNjZW50ID0gJWQsIG1heCBkZXNjZW50ID0gJWQsIG1heCBoID0gJWRcbiIsCisJICAgZm9udC0+bWF4X2JvdW5kcy5hc2NlbnQsIGZvbnQtPm1heF9ib3VuZHMuZGVzY2VudCwKKwkgICBmb250LT5tYXhfYm91bmRzLmFzY2VudCArIGZvbnQtPm1heF9ib3VuZHMuZGVzY2VudCk7CisgICAgcHJpbnRmKCIgIG1pbiBsYmVhcmluZyA9ICVkLCBtaW4gcmJlYXJpbmcgPSAlZFxuIiwKKwkgICBmb250LT5taW5fYm91bmRzLmxiZWFyaW5nLCBmb250LT5taW5fYm91bmRzLnJiZWFyaW5nKTsKKyAgICBwcmludGYoIiAgbWF4IGxiZWFyaW5nID0gJWQsIG1heCByYmVhcmluZyA9ICVkXG4iLAorCSAgIGZvbnQtPm1heF9ib3VuZHMubGJlYXJpbmcsIGZvbnQtPm1heF9ib3VuZHMucmJlYXJpbmcpOworICAgIHByaW50ZigiICBsZWZ0aW5rID0gJWQsIHJpZ2h0aW5rID0gJWRcbiIsCisJICAgKGZvbnQtPm1pbl9ib3VuZHMubGJlYXJpbmcgPCAwKSwKKwkgICAoZm9udC0+bWF4X2JvdW5kcy5yYmVhcmluZyA+IGZvbnQtPm1heF9ib3VuZHMud2lkdGgpKTsKKyAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKworICAgIGlmIChmb250LT5tYXhfYm91bmRzLndpZHRoICE9IGZvbnQtPm1pbl9ib3VuZHMud2lkdGgpCisgICAgeworCUVNU0cyKF8oZV9mb250d2lkdGgpLCBuYW1lKTsKKwlYRnJlZUZvbnQoZ3VpLmRweSwgZm9udCk7CisJcmV0dXJuIE5PRk9OVDsKKyAgICB9CisgICAgcmV0dXJuIChHdWlGb250KWZvbnQ7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfYWRqdXN0X2NoYXJzaXplKCkKK3sKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgaWYgKGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVCkKKyAgICB7CisJZ3VpLmNoYXJfaGVpZ2h0ID0gZm9udHNldF9oZWlnaHQoKFhGb250U2V0KWd1aS5mb250c2V0KSArIHBfbGluZXNwYWNlOworCWd1aS5jaGFyX2FzY2VudCA9IGZvbnRzZXRfYXNjZW50KChYRm9udFNldClndWkuZm9udHNldCkKKwkJCQkJCQkgICAgKyBwX2xpbmVzcGFjZSAvIDI7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlYRm9udFN0cnVjdCAqZm9udCA9IChYRm9udFN0cnVjdCAqKWd1aS5ub3JtX2ZvbnQ7CisKKwlndWkuY2hhcl9oZWlnaHQgPSBmb250LT5hc2NlbnQgKyBmb250LT5kZXNjZW50ICsgcF9saW5lc3BhY2U7CisJZ3VpLmNoYXJfYXNjZW50ID0gZm9udC0+YXNjZW50ICsgcF9saW5lc3BhY2UgLyAyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb250LgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9udChmb250KQorICAgIEd1aUZvbnQJZm9udDsKK3sKKyAgICBzdGF0aWMgRm9udAlwcmV2X2ZvbnQgPSAoRm9udCktMTsKKyAgICBGb250CWZpZCA9ICgoWEZvbnRTdHJ1Y3QgKilmb250KS0+ZmlkOworCisgICAgaWYgKGZpZCAhPSBwcmV2X2ZvbnQpCisgICAgeworCVhTZXRGb250KGd1aS5kcHksIGd1aS50ZXh0X2djLCBmaWQpOworCVhTZXRGb250KGd1aS5kcHksIGd1aS5iYWNrX2djLCBmaWQpOworCXByZXZfZm9udCA9IGZpZDsKKwlndWkuY2hhcl9hc2NlbnQgPSAoKFhGb250U3RydWN0ICopZm9udCktPmFzY2VudCArIHBfbGluZXNwYWNlIC8gMjsKKyAgICB9CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGN1cnJlbnRfZm9udHNldCA9IChYRm9udFNldClOVUxMOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfWEZPTlRTRVQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udHNldC4KKyAqIEFkanVzdCB0aGUgYXNjZW50LCBpbiBjYXNlIGl0J3MgZGlmZmVyZW50LgorICovCisgICAgdm9pZAorZ3VpX21jaF9zZXRfZm9udHNldChmb250c2V0KQorICAgIEd1aUZvbnRzZXQJZm9udHNldDsKK3sKKyAgICBjdXJyZW50X2ZvbnRzZXQgPSAoWEZvbnRTZXQpZm9udHNldDsKKyAgICBndWkuY2hhcl9hc2NlbnQgPSBmb250c2V0X2FzY2VudChjdXJyZW50X2ZvbnRzZXQpICsgcF9saW5lc3BhY2UgLyAyOworfQorI2VuZGlmCisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIHR3byBmb250cyBnaXZlbiBhcmUgZXF1aXZhbGVudC4KKyAqLworICAgIGludAorZ3VpX21jaF9zYW1lX2ZvbnQoZjEsIGYyKQorICAgIEd1aUZvbnQJZjE7CisgICAgR3VpRm9udAlmMjsKK3sKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgaWYgKGd1aS5mb250c2V0ICE9IE5VTEwpCisJcmV0dXJuIGYxID09IGYyOworICAgIGVsc2UKKyNlbmRpZgorICAgIHJldHVybiAoKFhGb250U3RydWN0ICopZjEpLT5maWQgPT0gKChYRm9udFN0cnVjdCAqKWYyKS0+ZmlkOworfQorI2VuZGlmCisKKy8qCisgKiBJZiBhIGZvbnQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQsIGZyZWUgaXRzIHN0cnVjdHVyZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZnJlZV9mb250KGZvbnQpCisgICAgR3VpRm9udAlmb250OworeworICAgIGlmIChmb250ICE9IE5PRk9OVCkKKwlYRnJlZUZvbnQoZ3VpLmRweSwgKFhGb250U3RydWN0ICopZm9udCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfWEZPTlRTRVQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogSWYgYSBmb250c2V0IGlzIG5vdCBnb2luZyB0byBiZSB1c2VkLCBmcmVlIGl0cyBzdHJ1Y3R1cmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ZyZWVfZm9udHNldChmb250c2V0KQorICAgIEd1aUZvbnRzZXQJZm9udHNldDsKK3sKKyAgICBpZiAoZm9udHNldCAhPSBOT0ZPTlRTRVQpCisJWEZyZWVGb250U2V0KGd1aS5kcHksIChYRm9udFNldClmb250c2V0KTsKK30KKworLyoKKyAqIExvYWQgdGhlIGZvbnRzZXQgIm5hbWUiLgorICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb250c2V0LCBvciBOT0ZPTlRTRVQgd2hlbiBmYWlsaW5nLgorICovCisgICAgR3VpRm9udHNldAorZ3VpX21jaF9nZXRfZm9udHNldChuYW1lLCBnaXZlRXJyb3JJZk1pc3NpbmcsIGZpeGVkX3dpZHRoKQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKKyAgICBpbnQJCWZpeGVkX3dpZHRoOworeworICAgIFhGb250U2V0CWZvbnRzZXQ7CisgICAgY2hhcgkqKm1pc3NpbmcsICpkZWZfc3RyOworICAgIGludAkJbnVtX21pc3Npbmc7CisKKyAgICBpZiAoIWd1aS5pbl91c2UgfHwgbmFtZSA9PSBOVUxMKQorCXJldHVybiBOT0ZPTlRTRVQ7CisKKyAgICBmb250c2V0ID0gWENyZWF0ZUZvbnRTZXQoZ3VpLmRweSwgKGNoYXIgKiluYW1lLCAmbWlzc2luZywgJm51bV9taXNzaW5nLAorCQkJICAgICAmZGVmX3N0cik7CisgICAgaWYgKG51bV9taXNzaW5nID4gMCkKKyAgICB7CisJaW50IGk7CisKKwlpZiAoZ2l2ZUVycm9ySWZNaXNzaW5nKQorCXsKKwkgICAgRU1TRzIoXygiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiKSwgbmFtZSk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWlzc2luZzsgaSsrKQorCQlFTVNHMigiJXMiLCBtaXNzaW5nW2ldKTsKKwl9CisJWEZyZWVTdHJpbmdMaXN0KG1pc3NpbmcpOworICAgIH0KKworICAgIGlmIChmb250c2V0ID09IE5VTEwpCisgICAgeworCWlmIChnaXZlRXJyb3JJZk1pc3NpbmcpCisJICAgIEVNU0cyKF8oZV9mb250c2V0KSwgbmFtZSk7CisJcmV0dXJuIE5PRk9OVFNFVDsKKyAgICB9CisKKyAgICBpZiAoZml4ZWRfd2lkdGggJiYgY2hlY2tfZm9udHNldF9zYW5pdHkoZm9udHNldCkgPT0gRkFJTCkKKyAgICB7CisJWEZyZWVGb250U2V0KGd1aS5kcHksIGZvbnRzZXQpOworCXJldHVybiBOT0ZPTlRTRVQ7CisgICAgfQorICAgIHJldHVybiAoR3VpRm9udHNldClmb250c2V0OworfQorCisvKgorICogQ2hlY2sgaWYgZm9udHNldCAiZnMiIGlzIGZpeGVkIHdpZHRoLgorICovCisgICAgc3RhdGljIGludAorY2hlY2tfZm9udHNldF9zYW5pdHkoZnMpCisgICAgWEZvbnRTZXQgZnM7Cit7CisgICAgWEZvbnRTdHJ1Y3QJKip4ZnM7CisgICAgY2hhcgkqKmZvbnRfbmFtZTsKKyAgICBpbnQJCWZuOworICAgIGNoYXIJKmJhc2VfbmFtZTsKKyAgICBpbnQJCWk7CisgICAgaW50CQltaW5fd2lkdGg7CisgICAgaW50CQltaW5fZm9udF9pZHggPSAwOworCisgICAgYmFzZV9uYW1lID0gWEJhc2VGb250TmFtZUxpc3RPZkZvbnRTZXQoZnMpOworICAgIGZuID0gWEZvbnRzT2ZGb250U2V0KGZzLCAmeGZzLCAmZm9udF9uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZm47IGkrKykKKyAgICB7CisJaWYgKHhmc1tpXS0+bWF4X2JvdW5kcy53aWR0aCAhPSB4ZnNbaV0tPm1pbl9ib3VuZHMud2lkdGgpCisJeworCSAgICBFTVNHMihfKCJFMjUyOiBGb250c2V0IG5hbWU6ICVzIiksIGJhc2VfbmFtZSk7CisJICAgIEVNU0cyKF8oIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiKSwgZm9udF9uYW1lW2ldKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorICAgIH0KKyAgICAvKiBzY2FuIGJhc2UgZm9udCB3aWR0aCAqLworICAgIG1pbl93aWR0aCA9IDMyNzY3OworICAgIGZvciAoaSA9IDA7IGkgPCBmbjsgaSsrKQorICAgIHsKKwlpZiAoeGZzW2ldLT5tYXhfYm91bmRzLndpZHRoPG1pbl93aWR0aCkKKwl7CisJICAgIG1pbl93aWR0aCA9IHhmc1tpXS0+bWF4X2JvdW5kcy53aWR0aDsKKwkgICAgbWluX2ZvbnRfaWR4ID0gaTsKKwl9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBmbjsgaSsrKQorICAgIHsKKwlpZiAoCSAgIHhmc1tpXS0+bWF4X2JvdW5kcy53aWR0aCAhPSAyICogbWluX3dpZHRoCisJCSYmIHhmc1tpXS0+bWF4X2JvdW5kcy53aWR0aCAhPSBtaW5fd2lkdGgpCisJeworCSAgICBFTVNHMihfKCJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iKSwgYmFzZV9uYW1lKTsKKwkgICAgRU1TRzIoXygiRm9udDA6ICVzXG4iKSwgZm9udF9uYW1lW21pbl9mb250X2lkeF0pOworCSAgICBFTVNHMihfKCJGb250MTogJXNcbiIpLCBmb250X25hbWVbaV0pOworCSAgICBFTVNHTihfKCJGb250JWxkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iKSwgaSk7CisJICAgIEVNU0dOKF8oIkZvbnQwIHdpZHRoOiAlbGRcbiIpLCB4ZnNbbWluX2ZvbnRfaWR4XS0+bWF4X2JvdW5kcy53aWR0aCk7CisJICAgIEVNU0dOKF8oIkZvbnQxIHdpZHRoOiAlbGRcblxuIiksIHhmc1tpXS0+bWF4X2JvdW5kcy53aWR0aCk7CisJICAgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisgICAgLyogaXQgc2VlbXMgb2suIEdvb2QgTHVjayEhICovCisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIGludAorZm9udHNldF93aWR0aChmcykKKyAgICBYRm9udFNldCBmczsKK3sKKyAgICByZXR1cm4gWG1iVGV4dEVzY2FwZW1lbnQoZnMsICJWaW0iLCAzKSAvIDM7Cit9CisKKyAgICBpbnQKK2ZvbnRzZXRfaGVpZ2h0KGZzKQorICAgIFhGb250U2V0IGZzOworeworICAgIFhGb250U2V0RXh0ZW50cyAqZXh0ZW50czsKKworICAgIGV4dGVudHMgPSBYRXh0ZW50c09mRm9udFNldChmcyk7CisgICAgcmV0dXJuIGV4dGVudHMtPm1heF9sb2dpY2FsX2V4dGVudC5oZWlnaHQ7Cit9CisKKyNpZiAoZGVmaW5lZChGT05UU0VUX0FMV0FZUykgJiYgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIFwKKwkgICAgJiYgZGVmaW5lZChGRUFUX01FTlUpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBoZWlnaHQgYXJvdW5kIHRoZSBhY3R1YWwgZ2x5cGggaW1hZ2Ugb2YgYWxsCisgKiBjaGFyYWN0ZXJzIGluIGFsbCBmb250cyBvZiB0aGUgZm9udHNldC4KKyAqLworICAgIGludAorZm9udHNldF9oZWlnaHQyKGZzKQorICAgIFhGb250U2V0IGZzOworeworICAgIFhGb250U2V0RXh0ZW50cyAqZXh0ZW50czsKKworICAgIGV4dGVudHMgPSBYRXh0ZW50c09mRm9udFNldChmcyk7CisgICAgcmV0dXJuIGV4dGVudHMtPm1heF9pbmtfZXh0ZW50LmhlaWdodDsKK30KKyNlbmRpZgorCisvKiBOT1QgVVNFRCBZRVQKKyAgICBzdGF0aWMgaW50Citmb250c2V0X2Rlc2NlbnQoZnMpCisgICAgWEZvbnRTZXQgZnM7Cit7CisgICAgWEZvbnRTZXRFeHRlbnRzICpleHRlbnRzOworCisgICAgZXh0ZW50cyA9IFhFeHRlbnRzT2ZGb250U2V0IChmcyk7CisgICAgcmV0dXJuIGV4dGVudHMtPm1heF9sb2dpY2FsX2V4dGVudC5oZWlnaHQgKyBleHRlbnRzLT5tYXhfbG9naWNhbF9leHRlbnQueTsKK30KKyovCisKKyAgICBzdGF0aWMgaW50Citmb250c2V0X2FzY2VudChmcykKKyAgICBYRm9udFNldCBmczsKK3sKKyAgICBYRm9udFNldEV4dGVudHMgKmV4dGVudHM7CisKKyAgICBleHRlbnRzID0gWEV4dGVudHNPZkZvbnRTZXQoZnMpOworICAgIHJldHVybiAtZXh0ZW50cy0+bWF4X2xvZ2ljYWxfZXh0ZW50Lnk7Cit9CisKKyNlbmRpZiAvKiBGRUFUX1hGT05UU0VUICovCisKKy8qCisgKiBSZXR1cm4gdGhlIFBpeGVsIHZhbHVlIChjb2xvcikgZm9yIHRoZSBnaXZlbiBjb2xvciBuYW1lLgorICogUmV0dXJuIElOVkFMQ09MT1IgZm9yIGVycm9yLgorICovCisgICAgZ3VpY29sb3JfVAorZ3VpX21jaF9nZXRfY29sb3IocmVxbmFtZSkKKyAgICBjaGFyX3UgKnJlcW5hbWU7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqbmFtZSA9IHJlcW5hbWU7CisgICAgQ29sb3JtYXAJY29sb3JtYXA7CisgICAgWENvbG9yICAgICAgY29sb3I7CisgICAgc3RhdGljIGNoYXIgKih2aW1uYW1lc1tdWzJdKSA9CisgICAgeworCS8qIEEgbnVtYmVyIG9mIGNvbG9ycyB0aGF0IHNvbWUgWDExIHN5c3RlbXMgZG9uJ3QgaGF2ZSAqLworCXsiTGlnaHRSZWQiLAkiI0ZGQkJCQiJ9LAorCXsiTGlnaHRHcmVlbiIsCSIjODhGRjg4In0sCisJeyJMaWdodE1hZ2VudGEiLCIjRkZCQkZGIn0sCisJeyJEYXJrQ3lhbiIsCSIjMDA4ODg4In0sCisJeyJEYXJrQmx1ZSIsCSIjMDAwMEJCIn0sCisJeyJEYXJrUmVkIiwJIiNCQjAwMDAifSwKKwl7IkRhcmtNYWdlbnRhIiwJIiNCQjAwQkIifSwKKwl7IkRhcmtHcmV5IiwJIiNCQkJCQkIifSwKKwl7IkRhcmtZZWxsb3ciLAkiI0JCQkIwMCJ9LAorCXtOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICAvKiBjYW4ndCBkbyB0aGlzIHdoZW4gR1VJIG5vdCBydW5uaW5nICovCisgICAgaWYgKCFndWkuaW5fdXNlIHx8ICpyZXFuYW1lID09IE5VTCkKKwlyZXR1cm4gSU5WQUxDT0xPUjsKKworICAgIGNvbG9ybWFwID0gRGVmYXVsdENvbG9ybWFwKGd1aS5kcHksIFhEZWZhdWx0U2NyZWVuKGd1aS5kcHkpKTsKKworICAgIC8qIERvIHRoaXMgdHdpY2UgaWYgdGhlIG5hbWUgaXNuJ3QgcmVjb2duaXplZC4gKi8KKyAgICB3aGlsZSAobmFtZSAhPSBOVUxMKQorICAgIHsKKwlpID0gWFBhcnNlQ29sb3IoZ3VpLmRweSwgY29sb3JtYXAsIChjaGFyICopbmFtZSwgJmNvbG9yKTsKKworI2lmIGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkKKwlpZiAoaSA9PSAwKQorCXsKKwkgICAgY2hhciAqb2xkOworCisJICAgIC8qIFRoZSBYMTEgc3lzdGVtIGlzIHRyeWluZyB0byByZXNvbHZlIG5hbWVkIGNvbG9ycyBvbmx5IGJ5IG5hbWVzCisJICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlIGxhbmd1YWdlLiAgQnV0IFZpbSBzY3JpcHRzCisJICAgICAqIHVzdWFsbHkgY29udGFpbiB0aGUgRW5nbGlzaCBjb2xvciBuYW1lcy4gIFRoZXJlZm9yZSB3ZSBoYXZlIHRvCisJICAgICAqIHRyeSBhIHNlY29uZCB0aW1lIGhlcmUgd2l0aCB0aGUgbmF0aXZlICJDIiBsb2NhbGUgc2V0LgorCSAgICAgKiBIb3BlZnVsbHksIHJlc3RvcmluZyB0aGUgb2xkIGxvY2FsZSB0aGlzIHdheSB3b3JrcyBvbiBhbGwKKwkgICAgICogc3lzdGVtcy4uLgorCSAgICAgKi8KKwkgICAgb2xkID0gc2V0bG9jYWxlKExDX0FMTCwgTlVMTCk7CisJICAgIGlmIChvbGQgIT0gTlVMTCAmJiBTVFJDTVAob2xkLCAiQyIpICE9IDApCisJICAgIHsKKwkJb2xkID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopb2xkKTsKKwkJc2V0bG9jYWxlKExDX0FMTCwgIkMiKTsKKwkJaSA9IFhQYXJzZUNvbG9yKGd1aS5kcHksIGNvbG9ybWFwLCAoY2hhciAqKW5hbWUsICZjb2xvcik7CisJCXNldGxvY2FsZShMQ19BTEwsIG9sZCk7CisJCXZpbV9mcmVlKG9sZCk7CisJICAgIH0KKwl9CisjZW5kaWYKKwlpZiAoaSAhPSAwICYmIChYQWxsb2NDb2xvcihndWkuZHB5LCBjb2xvcm1hcCwgJmNvbG9yKSAhPSAwCisJCSAgICB8fCBmaW5kX2Nsb3Nlc3RfY29sb3IoY29sb3JtYXAsICZjb2xvcikgPT0gT0spKQorCSAgICByZXR1cm4gKGd1aWNvbG9yX1QpY29sb3IucGl4ZWw7CisKKwkvKiBjaGVjayBmb3IgYSBmZXcgYnVpbHRpbiBuYW1lcyAqLworCWZvciAoaSA9IDA7IDsgKytpKQorCXsKKwkgICAgaWYgKHZpbW5hbWVzW2ldWzBdID09IE5VTEwpCisJICAgIHsKKwkJbmFtZSA9IE5VTEw7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChTVFJJQ01QKG5hbWUsIHZpbW5hbWVzW2ldWzBdKSA9PSAwKQorCSAgICB7CisJCW5hbWUgPSAoY2hhcl91ICopdmltbmFtZXNbaV1bMV07CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiBJTlZBTENPTE9SOworfQorCisvKgorICogRmluZCBjbG9zZXN0IGNvbG9yIGZvciAiY29sb3JQdHIiIGluICJjb2xvcm1hcCIuICBzZXQgImNvbG9yUHRyIiB0byB0aGUKKyAqIHJlc3VsdGluZyBjb2xvci4KKyAqIEJhc2VkIG9uIGEgc2ltaWxhciBmdW5jdGlvbiBpbiBUQ0wuCisgKiBSZXR1cm4gRkFJTCBpZiBub3QgYWJsZSB0byBmaW5kIG9yIGFsbG9jYXRlIGEgY29sb3IuCisgKi8KKyAgICBzdGF0aWMgaW50CitmaW5kX2Nsb3Nlc3RfY29sb3IoY29sb3JtYXAsIGNvbG9yUHRyKQorICAgIENvbG9ybWFwCWNvbG9ybWFwOworICAgIFhDb2xvcgkqY29sb3JQdHI7Cit7CisgICAgZG91YmxlCXRtcCwgZGlzdGFuY2UsIGNsb3Nlc3REaXN0YW5jZTsKKyAgICBpbnQJCWksIGNsb3Nlc3QsIG51bUZvdW5kLCBjbWFwX3NpemU7CisgICAgWENvbG9yCSpjb2xvcnRhYmxlOworICAgIFhWaXN1YWxJbmZvCXRlbXBsYXRlLCAqdmlzSW5mb1B0cjsKKworICAgIHRlbXBsYXRlLnZpc3VhbGlkID0gWFZpc3VhbElERnJvbVZpc3VhbChEZWZhdWx0VmlzdWFsKGd1aS5kcHksCisJCQkJCQkgICAgWERlZmF1bHRTY3JlZW4oZ3VpLmRweSkpKTsKKyAgICB2aXNJbmZvUHRyID0gWEdldFZpc3VhbEluZm8oZ3VpLmRweSwgKGxvbmcpVmlzdWFsSURNYXNrLAorCQkJCQkJCSZ0ZW1wbGF0ZSwgJm51bUZvdW5kKTsKKyAgICBpZiAobnVtRm91bmQgPCAxKQorCS8qIEZpbmRDbG9zZXN0Q29sb3IgY291bGRuJ3QgbG9va3VwIHZpc3VhbCAqLworCXJldHVybiBGQUlMOworCisgICAgY21hcF9zaXplID0gdmlzSW5mb1B0ci0+Y29sb3JtYXBfc2l6ZTsKKyAgICBYRnJlZSgoY2hhciAqKXZpc0luZm9QdHIpOworICAgIGNvbG9ydGFibGUgPSAoWENvbG9yICopYWxsb2MoKHVuc2lnbmVkKShjbWFwX3NpemUgKiBzaXplb2YoWENvbG9yKSkpOworICAgIGlmICghY29sb3J0YWJsZSkKKwlyZXR1cm4gRkFJTDsgIC8qIG91dCBvZiBtZW1vcnkgKi8KKworICAgIGZvciAoaSA9IDA7IGkgIDwgY21hcF9zaXplOyBpKyspCisJY29sb3J0YWJsZVtpXS5waXhlbCA9ICh1bnNpZ25lZCBsb25nKWk7CisgICAgWFF1ZXJ5Q29sb3JzIChndWkuZHB5LCBjb2xvcm1hcCwgY29sb3J0YWJsZSwgY21hcF9zaXplKTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgY29sb3IgdGhhdCBiZXN0IGFwcHJveGltYXRlcyB0aGUgZGVzaXJlZCBvbmUsIHRoZW4KKyAgICAgKiB0cnkgdG8gYWxsb2NhdGUgdGhhdCBjb2xvci4gIElmIHRoYXQgZmFpbHMsIGl0IG11c3QgbWVhbiB0aGF0CisgICAgICogdGhlIGNvbG9yIHdhcyByZWFkLXdyaXRlIChzbyB3ZSBjYW4ndCB1c2UgaXQsIHNpbmNlIGl0J3Mgb3duZXIKKyAgICAgKiBtaWdodCBjaGFuZ2UgaXQpIG9yIGVsc2UgaXQgd2FzIGFscmVhZHkgZnJlZWQuICBUcnkgYWdhaW4sCisgICAgICogb3ZlciBhbmQgb3ZlciBhZ2FpbiwgdW50aWwgc29tZXRoaW5nIHN1Y2NlZWRzLgorICAgICAqLworICAgIGNsb3Nlc3REaXN0YW5jZSA9IDFlMzA7CisgICAgY2xvc2VzdCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGNtYXBfc2l6ZTsgaSsrKQorICAgIHsKKwkvKgorCSAqIFVzZSBFdWNsaWRlYW4gZGlzdGFuY2UgaW4gUkdCIHNwYWNlLCB3ZWlnaHRlZCBieSBZIChvZiBZSVEpCisJICogYXMgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbjsgIHRoaXMgYWNjb3VudHMgZm9yIGRpZmZlcmVuY2VzCisJICogaW4gdGhlIGNvbG9yIHNlbnNpdGl2aXR5IG9mIHRoZSBleWUuCisJICovCisJdG1wID0gLjMwICogKCgoaW50KWNvbG9yUHRyLT5yZWQpIC0gKGludCljb2xvcnRhYmxlW2ldLnJlZCk7CisJZGlzdGFuY2UgPSB0bXAgKiB0bXA7CisJdG1wID0gLjYxICogKCgoaW50KWNvbG9yUHRyLT5ncmVlbikgLSAoaW50KWNvbG9ydGFibGVbaV0uZ3JlZW4pOworCWRpc3RhbmNlICs9IHRtcCAqIHRtcDsKKwl0bXAgPSAuMTEgKiAoKChpbnQpY29sb3JQdHItPmJsdWUpIC0gKGludCljb2xvcnRhYmxlW2ldLmJsdWUpOworCWRpc3RhbmNlICs9IHRtcCAqIHRtcDsKKwlpZiAoZGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpCisJeworCSAgICBjbG9zZXN0ID0gaTsKKwkgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7CisJfQorICAgIH0KKworICAgIGlmIChYQWxsb2NDb2xvcihndWkuZHB5LCBjb2xvcm1hcCwgJmNvbG9ydGFibGVbY2xvc2VzdF0pICE9IDApCisgICAgeworCWd1aS5jb2xvcl9hcHByb3ggPSBUUlVFOworCSpjb2xvclB0ciA9IGNvbG9ydGFibGVbY2xvc2VzdF07CisgICAgfQorCisgICAgZnJlZShjb2xvcnRhYmxlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcikKKyAgICBndWljb2xvcl9UCWNvbG9yOworeworICAgIGlmIChjb2xvciAhPSBwcmV2X2ZnX2NvbG9yKQorICAgIHsKKwlYU2V0Rm9yZWdyb3VuZChndWkuZHB5LCBndWkudGV4dF9nYywgKFBpeGVsKWNvbG9yKTsKKwlwcmV2X2ZnX2NvbG9yID0gY29sb3I7CisgICAgfQorfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRleHQgYmFja2dyb3VuZCBjb2xvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2JnX2NvbG9yKGNvbG9yKQorICAgIGd1aWNvbG9yX1QJY29sb3I7Cit7CisgICAgaWYgKGNvbG9yICE9IHByZXZfYmdfY29sb3IpCisgICAgeworCVhTZXRCYWNrZ3JvdW5kKGd1aS5kcHksIGd1aS50ZXh0X2djLCAoUGl4ZWwpY29sb3IpOworCXByZXZfYmdfY29sb3IgPSBjb2xvcjsKKyAgICB9Cit9CisKKy8qCisgKiBjcmVhdGUgYSBtb3VzZSBwb2ludGVyIHRoYXQgaXMgYmxhbmsKKyAqLworICAgIHN0YXRpYyBDdXJzb3IKK2d1aV94MTFfY3JlYXRlX2JsYW5rX21vdXNlKCkKK3sKKyAgICBQaXhtYXAgYmxhbmtfcGl4bWFwID0gWENyZWF0ZVBpeG1hcChndWkuZHB5LCBndWkud2lkLCAxLCAxLCAxKTsKKyAgICBHQyBnYyA9IFhDcmVhdGVHQyhndWkuZHB5LCBibGFua19waXhtYXAsICh1bnNpZ25lZCBsb25nKTAsIChYR0NWYWx1ZXMqKTApOworICAgIFhEcmF3UG9pbnQoZ3VpLmRweSwgYmxhbmtfcGl4bWFwLCBnYywgMCwgMCk7CisgICAgWEZyZWVHQyhndWkuZHB5LCBnYyk7CisgICAgcmV0dXJuIFhDcmVhdGVQaXhtYXBDdXJzb3IoZ3VpLmRweSwgYmxhbmtfcGl4bWFwLCBibGFua19waXhtYXAsCisJICAgIChYQ29sb3IqKSZndWkubm9ybV9waXhlbCwgKFhDb2xvciopJmd1aS5ub3JtX3BpeGVsLCAwLCAwKTsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19zdHJpbmcocm93LCBjb2wsIHMsIGxlbiwgZmxhZ3MpCisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7CisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworICAgIGludAkJZmxhZ3M7Cit7CisgICAgaW50CQkJY2VsbHMgPSBsZW47CisjaWZkZWYgRkVBVF9NQllURQorICAgIHN0YXRpYyBYQ2hhcjJiCSpidWYgPSBOVUxMOworICAgIHN0YXRpYyBpbnQJCWJ1ZmxlbiA9IDA7CisgICAgY2hhcl91CQkqcDsKKyAgICBpbnQJCQl3bGVuID0gMDsKKyAgICBpbnQJCQljOworCisgICAgaWYgKGVuY191dGY4KQorICAgIHsKKwkvKiBDb252ZXJ0IFVURi04IGJ5dGUgc2VxdWVuY2UgdG8gMTYgYml0IGNoYXJhY3RlcnMgZm9yIHRoZSBYCisJICogZnVuY3Rpb25zLiAgTmVlZCBhIGJ1ZmZlciBmb3IgdGhlIDE2IGJpdCBjaGFyYWN0ZXJzLiAgS2VlcCBpdAorCSAqIGJldHdlZW4gY2FsbHMsIGJlY2F1c2UgYWxsb2NhdGluZyBpdCBlYWNoIHRpbWUgaXMgc2xvdy4gKi8KKwlpZiAoYnVmbGVuIDwgbGVuKQorCXsKKwkgICAgWHRGcmVlKChjaGFyICopYnVmKTsKKwkgICAgYnVmID0gKFhDaGFyMmIgKilYdE1hbGxvYyhsZW4gKiBzaXplb2YoWENoYXIyYikpOworCSAgICBidWZsZW4gPSBsZW47CisJfQorCXAgPSBzOworCWNlbGxzID0gMDsKKwl3aGlsZSAocCA8IHMgKyBsZW4pCisJeworCSAgICBjID0gdXRmX3B0cjJjaGFyKHApOworCSAgICBpZiAoYyA+PSAweDEwMDAwKQkvKiBzaG93IGNoYXJzID4gMHhmZmZmIGFzID8gKi8KKwkJYyA9IDB4YmY7CisJICAgIGJ1Zlt3bGVuXS5ieXRlMSA9ICh1bnNpZ25lZCljID4+IDg7CisJICAgIGJ1Zlt3bGVuXS5ieXRlMiA9IGM7CisJICAgICsrd2xlbjsKKwkgICAgY2VsbHMgKz0gdXRmX2NoYXIyY2VsbHMoYyk7CisJICAgIHAgKz0gdXRmX3B0cjJsZW5fY2hlY2socCk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChoYXNfbWJ5dGUpCisgICAgeworCWNlbGxzID0gMDsKKwlmb3IgKHAgPSBzOyBwIDwgcyArIGxlbjsgKQorCXsKKwkgICAgY2VsbHMgKz0gcHRyMmNlbGxzKHApOworCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJfQorICAgIH0KKworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgaWYgKGN1cnJlbnRfZm9udHNldCAhPSBOVUxMKQorICAgIHsKKwkvKiBTZXR1cCBhIGNsaXAgcmVjdGFuZ2xlIHRvIGF2b2lkIHNwaWxsaW5nIG92ZXIgaW4gdGhlIG5leHQgb3IKKwkgKiBwcmV2aW91cyBsaW5lLiAgVGhpcyBpcyBhcHBhcmVudGx5IG5lZWRlZCBmb3Igc29tZSBmb250cyB3aGljaCBhcmUKKwkgKiB1c2VkIGluIGEgZm9udHNldC4gKi8KKwlYUmVjdGFuZ2xlCWNsaXA7CisKKwljbGlwLnggPSAwOworCWNsaXAueSA9IDA7CisJY2xpcC5oZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQ7CisJY2xpcC53aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogY2VsbHMgKyAxOworCVhTZXRDbGlwUmVjdGFuZ2xlcyhndWkuZHB5LCBndWkudGV4dF9nYywgRklMTF9YKGNvbCksIEZJTExfWShyb3cpLAorCQkmY2xpcCwgMSwgVW5zb3J0ZWQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGZsYWdzICYgRFJBV19UUkFOU1ApCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoZW5jX3V0ZjgpCisJICAgIFhEcmF3U3RyaW5nMTYoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIFRFWFRfWChjb2wpLAorCQkgICAgVEVYVF9ZKHJvdyksIGJ1Ziwgd2xlbik7CisJZWxzZQorI2VuZGlmCisJICAgIFhEcmF3U3RyaW5nKGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCBURVhUX1goY29sKSwKKwkJICAgIFRFWFRfWShyb3cpLCAoY2hhciAqKXMsIGxlbik7CisgICAgfQorICAgIGVsc2UgaWYgKHBfbGluZXNwYWNlICE9IDAKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJICAgIHx8IGN1cnJlbnRfZm9udHNldCAhPSBOVUxMCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlYU2V0Rm9yZWdyb3VuZChndWkuZHB5LCBndWkudGV4dF9nYywgcHJldl9iZ19jb2xvcik7CisJWEZpbGxSZWN0YW5nbGUoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIEZJTExfWChjb2wpLAorCQlGSUxMX1kocm93KSwgZ3VpLmNoYXJfd2lkdGggKiBjZWxscywgZ3VpLmNoYXJfaGVpZ2h0KTsKKwlYU2V0Rm9yZWdyb3VuZChndWkuZHB5LCBndWkudGV4dF9nYywgcHJldl9mZ19jb2xvcik7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChlbmNfdXRmOCkKKwkgICAgWERyYXdTdHJpbmcxNihndWkuZHB5LCBndWkud2lkLCBndWkudGV4dF9nYywgVEVYVF9YKGNvbCksCisJCSAgICBURVhUX1kocm93KSwgYnVmLCB3bGVuKTsKKwllbHNlCisjZW5kaWYKKwkgICAgWERyYXdTdHJpbmcoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIFRFWFRfWChjb2wpLAorCQkgICAgVEVYVF9ZKHJvdyksIChjaGFyICopcywgbGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBYbWJEcmF3SW1hZ2VTdHJpbmcgaGFzIGJ1ZywgZG9uJ3QgdXNlIGl0IGZvciBmb250c2V0LiAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoZW5jX3V0ZjgpCisJICAgIFhEcmF3SW1hZ2VTdHJpbmcxNihndWkuZHB5LCBndWkud2lkLCBndWkudGV4dF9nYywgVEVYVF9YKGNvbCksCisJCSAgICBURVhUX1kocm93KSwgYnVmLCB3bGVuKTsKKwllbHNlCisjZW5kaWYKKwkgICAgWERyYXdJbWFnZVN0cmluZyhndWkuZHB5LCBndWkud2lkLCBndWkudGV4dF9nYywgVEVYVF9YKGNvbCksCisJCSAgICBURVhUX1kocm93KSwgKGNoYXIgKilzLCBsZW4pOworICAgIH0KKworICAgIC8qIEJvbGQgdHJpY2s6IGRyYXcgdGhlIHRleHQgYWdhaW4gd2l0aCBhIG9uZS1waXhlbCBvZmZzZXQuICovCisgICAgaWYgKGZsYWdzICYgRFJBV19CT0xEKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4KQorCSAgICBYRHJhd1N0cmluZzE2KGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCBURVhUX1goY29sKSArIDEsCisJCSAgICBURVhUX1kocm93KSwgYnVmLCB3bGVuKTsKKwllbHNlCisjZW5kaWYKKwkgICAgWERyYXdTdHJpbmcoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIFRFWFRfWChjb2wpICsgMSwKKwkJICAgIFRFWFRfWShyb3cpLCAoY2hhciAqKXMsIGxlbik7CisgICAgfQorCisgICAgLyogVW5kZXJsaW5lOiBkcmF3IGEgbGluZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBjaGFyYWN0ZXIgY2VsbC4gKi8KKyAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkKKwlYRHJhd0xpbmUoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIEZJTExfWChjb2wpLAorCSAgICAgRklMTF9ZKHJvdyArIDEpIC0gMSwgRklMTF9YKGNvbCArIGNlbGxzKSAtIDEsIEZJTExfWShyb3cgKyAxKSAtIDEpOworCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGlmIChjdXJyZW50X2ZvbnRzZXQgIT0gTlVMTCkKKwlYU2V0Q2xpcE1hc2soZ3VpLmRweSwgZ3VpLnRleHRfZ2MsIE5vbmUpOworI2VuZGlmCit9CisKKy8qCisgKiBSZXR1cm4gT0sgaWYgdGhlIGtleSB3aXRoIHRoZSB0ZXJtY2FwIG5hbWUgIm5hbWUiIGlzIHN1cHBvcnRlZC4KKyAqLworICAgIGludAorZ3VpX21jaF9oYXNrZXkobmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOworeworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gKEtleVN5bSkwOyBpKyspCisJaWYgKG5hbWVbMF0gPT0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMCAmJgorCQkJCQkgbmFtZVsxXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxKQorCSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHRleHQgd2luZG93LWlkIGFuZCBkaXNwbGF5LiAgT25seSByZXF1aXJlZCBmb3IgWC1iYXNlZCBHVUkncworICovCisgICAgaW50CitndWlfZ2V0X3gxMV93aW5kaXMod2luLCBkaXMpCisgICAgV2luZG93ICAqd2luOworICAgIERpc3BsYXkgKipkaXM7Cit7CisgICAgKndpbiA9IFh0V2luZG93KHZpbVNoZWxsKTsKKyAgICAqZGlzID0gZ3VpLmRweTsKKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2JlZXAoKQoreworICAgIFhCZWxsKGd1aS5kcHksIDApOworfQorCisgICAgdm9pZAorZ3VpX21jaF9mbGFzaChtc2VjKQorICAgIGludAkJbXNlYzsKK3sKKyAgICAvKiBEbyBhIHZpc3VhbCBiZWVwIGJ5IHJldmVyc2luZyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgKi8KKyAgICBYRmlsbFJlY3RhbmdsZShndWkuZHB5LCBndWkud2lkLCBndWkuaW52ZXJ0X2djLCAwLCAwLAorCSAgICBGSUxMX1goKGludClDb2x1bW5zKSArIGd1aS5ib3JkZXJfb2Zmc2V0LAorCSAgICBGSUxMX1koKGludClSb3dzKSArIGd1aS5ib3JkZXJfb2Zmc2V0KTsKKyAgICBYU3luYyhndWkuZHB5LCBGYWxzZSk7CisgICAgdWlfZGVsYXkoKGxvbmcpbXNlYywgVFJVRSk7CS8qIHdhaXQgZm9yIGEgZmV3IG1zZWMgKi8KKyAgICBYRmlsbFJlY3RhbmdsZShndWkuZHB5LCBndWkud2lkLCBndWkuaW52ZXJ0X2djLCAwLCAwLAorCSAgICBGSUxMX1goKGludClDb2x1bW5zKSArIGd1aS5ib3JkZXJfb2Zmc2V0LAorCSAgICBGSUxMX1koKGludClSb3dzKSArIGd1aS5ib3JkZXJfb2Zmc2V0KTsKK30KKworLyoKKyAqIEludmVydCBhIHJlY3RhbmdsZSBmcm9tIHJvdyByLCBjb2x1bW4gYywgZm9yIG5yIHJvd3MgYW5kIG5jIGNvbHVtbnMuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2ludmVydF9yZWN0YW5nbGUociwgYywgbnIsIG5jKQorICAgIGludAkgICAgcjsKKyAgICBpbnQJICAgIGM7CisgICAgaW50CSAgICBucjsKKyAgICBpbnQJICAgIG5jOworeworICAgIFhGaWxsUmVjdGFuZ2xlKGd1aS5kcHksIGd1aS53aWQsIGd1aS5pbnZlcnRfZ2MsCisJRklMTF9YKGMpLCBGSUxMX1kociksIChuYykgKiBndWkuY2hhcl93aWR0aCwgKG5yKSAqIGd1aS5jaGFyX2hlaWdodCk7Cit9CisKKy8qCisgKiBJY29uaWZ5IHRoZSBHVUkgd2luZG93LgorICovCisgICAgdm9pZAorZ3VpX21jaF9pY29uaWZ5KCkKK3sKKyAgICBYSWNvbmlmeVdpbmRvdyhndWkuZHB5LCBYdFdpbmRvdyh2aW1TaGVsbCksIERlZmF1bHRTY3JlZW4oZ3VpLmRweSkpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQnJpbmcgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCkKK3sKKyAgICBYTWFwUmFpc2VkKGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGNvbG9yKQorICAgIGd1aWNvbG9yX1QgY29sb3I7Cit7CisgICAgaW50CQl3ID0gMTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAobWJfbGVmdGhhbHZlKGd1aS5yb3csIGd1aS5jb2wpKQorCXcgPSAyOworI2VuZGlmCisgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOworICAgIFhEcmF3UmVjdGFuZ2xlKGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCBGSUxMX1goZ3VpLmNvbCksCisJICAgIEZJTExfWShndWkucm93KSwgdyAqIGd1aS5jaGFyX3dpZHRoIC0gMSwgZ3VpLmNoYXJfaGVpZ2h0IC0gMSk7Cit9CisKKy8qCisgKiBEcmF3IHBhcnQgb2YgYSBjdXJzb3IsICJ3IiBwaXhlbHMgd2lkZSwgYW5kICJoIiBwaXhlbHMgaGlnaCwgdXNpbmcKKyAqIGNvbG9yICJjb2xvciIuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IodywgaCwgY29sb3IpCisgICAgaW50CQl3OworICAgIGludAkJaDsKKyAgICBndWljb2xvcl9UCWNvbG9yOworeworICAgIGd1aV9tY2hfc2V0X2ZnX2NvbG9yKGNvbG9yKTsKKworICAgIFhGaWxsUmVjdGFuZ2xlKGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJICAgIC8qIHZlcnRpY2FsIGxpbmUgc2hvdWxkIGJlIG9uIHRoZSByaWdodCBvZiBjdXJyZW50IHBvaW50ICovCisJICAgIENVUlNPUl9CQVJfUklHSFQgPyBGSUxMX1goZ3VpLmNvbCArIDEpIC0gdyA6CisjZW5kaWYKKwkJRklMTF9YKGd1aS5jb2wpLAorCSAgICBGSUxMX1koZ3VpLnJvdykgKyBndWkuY2hhcl9oZWlnaHQgLSBoLAorCSAgICB3LCBoKTsKK30KKworLyoKKyAqIENhdGNoIHVwIHdpdGggYW55IHF1ZXVlZCBYIGV2ZW50cy4gIFRoaXMgbWF5IHB1dCBrZXlib2FyZCBpbnB1dCBpbnRvIHRoZQorICogaW5wdXQgYnVmZmVyLCBjYWxsIHJlc2l6ZSBjYWxsLWJhY2tzLCB0cmlnZ2VyIHRpbWVycyBldGMuICBJZiB0aGVyZSBpcworICogbm90aGluZyBpbiB0aGUgWCBldmVudCBxdWV1ZSAoJiBubyB0aW1lcnMgcGVuZGluZyksIHRoZW4gd2UgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdXBkYXRlKCkKK3sKKyAgICBYdElucHV0TWFzayBtYXNrLCBkZXNpcmVkOworCisjaWZkZWYgQUxUX1hfSU5QVVQKKyAgICBpZiAoc3VwcHJlc3NfYWx0ZXJuYXRlX2lucHV0KQorCWRlc2lyZWQgPSAoWHRJTVhFdmVudCB8IFh0SU1UaW1lcik7CisgICAgZWxzZQorI2VuZGlmCisJZGVzaXJlZCA9IChYdElNQWxsKTsKKyAgICB3aGlsZSAoKG1hc2sgPSBYdEFwcFBlbmRpbmcoYXBwX2NvbnRleHQpKSAmJiAobWFzayAmIGRlc2lyZWQpCisJICAgICYmICF2aW1faXNfaW5wdXRfYnVmX2Z1bGwoKSkKKwlYdEFwcFByb2Nlc3NFdmVudChhcHBfY29udGV4dCwgZGVzaXJlZCk7Cit9CisKKy8qCisgKiBHVUkgaW5wdXQgcm91dGluZSBjYWxsZWQgYnkgZ3VpX3dhaXRfZm9yX2NoYXJzKCkuICBXYWl0cyBmb3IgYSBjaGFyYWN0ZXIKKyAqIGZyb20gdGhlIGtleWJvYXJkLgorICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCisgKiAgd3RpbWUgPT0gMAkgICAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICogIHd0aW1lID4gMAkgICAgV2FpdCB3dGltZSBtaWxsaXNlY29uZHMgZm9yIGEgY2hhcmFjdGVyLgorICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKKyAqIG9yIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitndWlfbWNoX3dhaXRfZm9yX2NoYXJzKHd0aW1lKQorICAgIGxvbmcgICAgd3RpbWU7Cit7CisgICAgaW50CQkgICAgZm9jdXM7CisKKyAgICAvKgorICAgICAqIE1ha2UgdGhpcyBzdGF0aWMsIGluIGNhc2UgZ3VpX3gxMV90aW1lcl9jYiBpcyBjYWxsZWQgYWZ0ZXIgbGVhdmluZworICAgICAqIHRoaXMgZnVuY3Rpb24gKG90aGVyd2lzZSBhIHJhbmRvbSB2YWx1ZSBvbiB0aGUgc3RhY2sgbWF5IGJlIGNoYW5nZWQpLgorICAgICAqLworICAgIHN0YXRpYyBpbnQJICAgIHRpbWVkX291dDsKKyAgICBYdEludGVydmFsSWQgICAgdGltZXIgPSAoWHRJbnRlcnZhbElkKTA7CisgICAgWHRJbnB1dE1hc2sJICAgIGRlc2lyZWQ7CisjaWZkZWYgRkVBVF9TTklGRgorICAgIHN0YXRpYyBpbnQJICAgIHNuaWZmX29uID0gMDsKKyAgICBzdGF0aWMgWHRJbnB1dElkIHNuaWZmX2lucHV0X2lkID0gMDsKKyNlbmRpZgorCisgICAgdGltZWRfb3V0ID0gRkFMU0U7CisKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgaWYgKHNuaWZmX29uICYmICF3YW50X3NuaWZmX3JlcXVlc3QpCisgICAgeworCWlmIChzbmlmZl9pbnB1dF9pZCkKKwkgICAgWHRSZW1vdmVJbnB1dChzbmlmZl9pbnB1dF9pZCk7CisJc25pZmZfb24gPSAwOworICAgIH0KKyAgICBlbHNlIGlmICghc25pZmZfb24gJiYgd2FudF9zbmlmZl9yZXF1ZXN0KQorICAgIHsKKwlzbmlmZl9pbnB1dF9pZCA9IFh0QXBwQWRkSW5wdXQoYXBwX2NvbnRleHQsIGZkX2Zyb21fc25pZmYsCisJCSAgICAgKFh0UG9pbnRlcilYdElucHV0UmVhZE1hc2ssIGd1aV94MTFfc25pZmZfcmVxdWVzdF9jYiwgMCk7CisJc25pZmZfb24gPSAxOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHd0aW1lID4gMCkKKwl0aW1lciA9IFh0QXBwQWRkVGltZU91dChhcHBfY29udGV4dCwgKGxvbmdfdSl3dGltZSwgZ3VpX3gxMV90aW1lcl9jYiwKKwkJCQkJCQkJICAmdGltZWRfb3V0KTsKKworICAgIGZvY3VzID0gZ3VpLmluX2ZvY3VzOworI2lmZGVmIEFMVF9YX0lOUFVUCisgICAgaWYgKHN1cHByZXNzX2FsdGVybmF0ZV9pbnB1dCkKKwlkZXNpcmVkID0gKFh0SU1YRXZlbnQgfCBYdElNVGltZXIpOworICAgIGVsc2UKKyNlbmRpZgorCWRlc2lyZWQgPSAoWHRJTUFsbCk7CisgICAgd2hpbGUgKCF0aW1lZF9vdXQpCisgICAgeworCS8qIFN0b3Agb3Igc3RhcnQgYmxpbmtpbmcgd2hlbiBmb2N1cyBjaGFuZ2VzICovCisJaWYgKGd1aS5pbl9mb2N1cyAhPSBmb2N1cykKKwl7CisJICAgIGlmIChndWkuaW5fZm9jdXMpCisJCWd1aV9tY2hfc3RhcnRfYmxpbmsoKTsKKwkgICAgZWxzZQorCQlndWlfbWNoX3N0b3BfYmxpbmsoKTsKKwkgICAgZm9jdXMgPSBndWkuaW5fZm9jdXM7CisJfQorCisJLyoKKwkgKiBEb24ndCB1c2UgZ3VpX21jaF91cGRhdGUoKSBiZWNhdXNlIHRoZW4gd2Ugd2lsbCBzcGluLWxvY2sgdW50aWwgYQorCSAqIGNoYXIgYXJyaXZlcywgaW5zdGVhZCB3ZSB1c2UgWHRBcHBQcm9jZXNzRXZlbnQoKSB0byBoYW5nIHVudGlsIGFuCisJICogZXZlbnQgYXJyaXZlcy4gIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGlucHV0X2J1Zl9mdWxsIGJlY2F1c2Ugd2UgYXJlCisJICogcmV0dXJuaW5nIGFzIHNvb24gYXMgaXQgY29udGFpbnMgYSBzaW5nbGUgY2hhci4gIE5vdGUgdGhhdAorCSAqIFh0QXBwTmV4dEV2ZW50KCkgbWF5IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgd2lsbCBub3QgcmV0dXJuIGFmdGVyIGEKKwkgKiB0aW1lciBldmVudCBoYXMgYXJyaXZlZCAtLSB3ZWJiCisJICovCisJWHRBcHBQcm9jZXNzRXZlbnQoYXBwX2NvbnRleHQsIGRlc2lyZWQpOworCisJaWYgKGlucHV0X2F2YWlsYWJsZSgpKQorCXsKKwkgICAgaWYgKHRpbWVyICE9IChYdEludGVydmFsSWQpMCAmJiAhdGltZWRfb3V0KQorCQlYdFJlbW92ZVRpbWVPdXQodGltZXIpOworCSAgICByZXR1cm4gT0s7CisJfQorICAgIH0KKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIE91dHB1dCByb3V0aW5lcy4KKyAqLworCisvKiBGbHVzaCBhbnkgb3V0cHV0IHRvIHRoZSBzY3JlZW4gKi8KKyAgICB2b2lkCitndWlfbWNoX2ZsdXNoKCkKK3sKKyAgICBYRmx1c2goZ3VpLmRweSk7Cit9CisKKy8qCisgKiBDbGVhciBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aGUgc2NyZWVuIGZyb20gdGV4dCBwb3MgKHJvdzEsIGNvbDEpIHRvCisgKiAocm93MiwgY29sMikgaW5jbHVzaXZlLgorICovCisgICAgdm9pZAorZ3VpX21jaF9jbGVhcl9ibG9jayhyb3cxLCBjb2wxLCByb3cyLCBjb2wyKQorICAgIGludAkJcm93MTsKKyAgICBpbnQJCWNvbDE7CisgICAgaW50CQlyb3cyOworICAgIGludAkJY29sMjsKK3sKKyAgICBpbnQJCXg7CisKKyAgICB4ID0gRklMTF9YKGNvbDEpOworCisgICAgLyogQ2xlYXIgb25lIGV4dHJhIHBpeGVsIGF0IHRoZSBmYXIgcmlnaHQsIGZvciB3aGVuIGJvbGQgY2hhcmFjdGVycyBoYXZlCisgICAgICogc3BpbGxlZCBvdmVyIHRvIHRoZSBuZXh0IGNvbHVtbi4gKi8KKyAgICBYRmlsbFJlY3RhbmdsZShndWkuZHB5LCBndWkud2lkLCBndWkuYmFja19nYywgeCwgRklMTF9ZKHJvdzEpLAorCSAgICAoY29sMiAtIGNvbDEgKyAxKSAqIGd1aS5jaGFyX3dpZHRoICsgKGNvbDIgPT0gQ29sdW1ucyAtIDEpLAorCSAgICAocm93MiAtIHJvdzEgKyAxKSAqIGd1aS5jaGFyX2hlaWdodCk7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX2NsZWFyX2FsbCgpCit7CisgICAgWENsZWFyQXJlYShndWkuZHB5LCBndWkud2lkLCAwLCAwLCAwLCAwLCBGYWxzZSk7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGdpdmVuIG51bWJlciBvZiBsaW5lcyBmcm9tIHRoZSBnaXZlbiByb3csIHNjcm9sbGluZyB1cCBhbnkKKyAqIHRleHQgZnVydGhlciBkb3duIHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfZGVsZXRlX2xpbmVzKHJvdywgbnVtX2xpbmVzKQorICAgIGludAkgICAgcm93OworICAgIGludAkgICAgbnVtX2xpbmVzOworeworICAgIGlmIChndWkudmlzaWJpbGl0eSA9PSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZCkKKwlyZXR1cm47CSAgICAvKiBDYW4ndCBzZWUgdGhlIHdpbmRvdyAqLworCisgICAgLyogY29weSBvbmUgZXh0cmEgcGl4ZWwgYXQgdGhlIGZhciByaWdodCwgZm9yIHdoZW4gYm9sZCBoYXMgc3BpbGxlZAorICAgICAqIG92ZXIgKi8KKyAgICBYQ29weUFyZWEoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsCisJRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpLCBGSUxMX1kocm93ICsgbnVtX2xpbmVzKSwKKwlndWkuY2hhcl93aWR0aCAqIChndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCAtIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQgKyAxKQorCQkJICAgICAgICsgKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0ID09IENvbHVtbnMgLSAxKSwKKwlndWkuY2hhcl9oZWlnaHQgKiAoZ3VpLnNjcm9sbF9yZWdpb25fYm90IC0gcm93IC0gbnVtX2xpbmVzICsgMSksCisJRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpLCBGSUxMX1kocm93KSk7CisKKyAgICBndWlfY2xlYXJfYmxvY2soZ3VpLnNjcm9sbF9yZWdpb25fYm90IC0gbnVtX2xpbmVzICsgMSwKKwkJCQkJCSAgICAgICBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAorCQkJICBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QsIGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0KTsKKyAgICBndWlfeDExX2NoZWNrX2NvcHlfYXJlYSgpOworfQorCisvKgorICogSW5zZXJ0IHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgYmVmb3JlIHRoZSBnaXZlbiByb3csIHNjcm9sbGluZyBkb3duIGFueQorICogZm9sbG93aW5nIHRleHQgd2l0aGluIHRoZSBzY3JvbGwgcmVnaW9uLgorICovCisgICAgdm9pZAorZ3VpX21jaF9pbnNlcnRfbGluZXMocm93LCBudW1fbGluZXMpCisgICAgaW50CSAgICByb3c7CisgICAgaW50CSAgICBudW1fbGluZXM7Cit7CisgICAgaWYgKGd1aS52aXNpYmlsaXR5ID09IFZpc2liaWxpdHlGdWxseU9ic2N1cmVkKQorCXJldHVybjsJICAgIC8qIENhbid0IHNlZSB0aGUgd2luZG93ICovCisKKyAgICAvKiBjb3B5IG9uZSBleHRyYSBwaXhlbCBhdCB0aGUgZmFyIHJpZ2h0LCBmb3Igd2hlbiBib2xkIGhhcyBzcGlsbGVkCisgICAgICogb3ZlciAqLworICAgIFhDb3B5QXJlYShndWkuZHB5LCBndWkud2lkLCBndWkud2lkLCBndWkudGV4dF9nYywKKwlGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCksIEZJTExfWShyb3cpLAorCWd1aS5jaGFyX3dpZHRoICogKGd1aS5zY3JvbGxfcmVnaW9uX3JpZ2h0IC0gZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCArIDEpCisJCQkgICAgICAgKyAoZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgPT0gQ29sdW1ucyAtIDEpLAorCWd1aS5jaGFyX2hlaWdodCAqIChndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSByb3cgLSBudW1fbGluZXMgKyAxKSwKKwlGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCksIEZJTExfWShyb3cgKyBudW1fbGluZXMpKTsKKworICAgIGd1aV9jbGVhcl9ibG9jayhyb3csIGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQsCisJCQkJcm93ICsgbnVtX2xpbmVzIC0gMSwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOworICAgIGd1aV94MTFfY2hlY2tfY29weV9hcmVhKCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlZ2lvbiByZXZlYWxlZCBieSBzY3JvbGxpbmcgdXAvZG93bi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfeDExX2NoZWNrX2NvcHlfYXJlYSgpCit7CisgICAgWEV2ZW50CQkgICAgZXZlbnQ7CisgICAgWEdyYXBoaWNzRXhwb3NlRXZlbnQgICAgKmdldmVudDsKKworICAgIGlmIChndWkudmlzaWJpbGl0eSAhPSBWaXNpYmlsaXR5UGFydGlhbGx5T2JzY3VyZWQpCisJcmV0dXJuOworCisgICAgWEZsdXNoKGd1aS5kcHkpOworCisgICAgLyogV2FpdCB0byBjaGVjayB3aGV0aGVyIHRoZSBzY3JvbGwgd29ya2VkIG9yIG5vdCAqLworICAgIGZvciAoOzspCisgICAgeworCWlmIChYQ2hlY2tUeXBlZEV2ZW50KGd1aS5kcHksIE5vRXhwb3NlLCAmZXZlbnQpKQorCSAgICByZXR1cm47CS8qIFRoZSBzY3JvbGwgd29ya2VkLiAqLworCisJaWYgKFhDaGVja1R5cGVkRXZlbnQoZ3VpLmRweSwgR3JhcGhpY3NFeHBvc2UsICZldmVudCkpCisJeworCSAgICBnZXZlbnQgPSAoWEdyYXBoaWNzRXhwb3NlRXZlbnQgKikmZXZlbnQ7CisJICAgIGd1aV9yZWRyYXcoZ2V2ZW50LT54LCBnZXZlbnQtPnksIGdldmVudC0+d2lkdGgsIGdldmVudC0+aGVpZ2h0KTsKKwkgICAgaWYgKGdldmVudC0+Y291bnQgPT0gMCkKKwkJcmV0dXJuOwkJLyogVGhpcyB3YXMgdGhlIGxhc3QgZXhwb3NlIGV2ZW50ICovCisJfQorCVhTeW5jKGd1aS5kcHksIEZhbHNlKTsKKyAgICB9Cit9CisKKy8qCisgKiBYIFNlbGVjdGlvbiBzdHVmZiwgZm9yIGN1dHRpbmcgYW5kIHBhc3RpbmcgdGV4dCB0byBvdGhlciB3aW5kb3dzLgorICovCisKKyAgICB2b2lkCitjbGlwX21jaF9sb3NlX3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisgICAgY2xpcF94MTFfbG9zZV9zZWxlY3Rpb24odmltU2hlbGwsIGNiZCk7Cit9CisKKyAgICBpbnQKK2NsaXBfbWNoX293bl9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZAkqY2JkOworeworICAgIHJldHVybiBjbGlwX3gxMV9vd25fc2VsZWN0aW9uKHZpbVNoZWxsLCBjYmQpOworfQorCisgICAgdm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZAkqY2JkOworeworICAgIGNsaXBfeDExX3JlcXVlc3Rfc2VsZWN0aW9uKHZpbVNoZWxsLCBndWkuZHB5LCBjYmQpOworfQorCisgICAgdm9pZAorY2xpcF9tY2hfc2V0X3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisgICAgY2xpcF94MTFfc2V0X3NlbGVjdGlvbihjYmQpOworfQorCisjaWYgZGVmaW5lZChGRUFUX01FTlUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTWVudSBzdHVmZi4KKyAqLworCisvKgorICogTWFrZSBhIG1lbnUgZWl0aGVyIGdyZXkgb3Igbm90IGdyZXkuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfZ3JleShtZW51LCBncmV5KQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCWdyZXk7Cit7CisgICAgaWYgKG1lbnUtPmlkICE9IChXaWRnZXQpMCkKKyAgICB7CisJZ3VpX21jaF9tZW51X2hpZGRlbihtZW51LCBGYWxzZSk7CisJaWYgKGdyZXkKKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorCQl8fCAhbWVudS0+c2Vuc2l0aXZlCisjZW5kaWYKKwkJKQorCSAgICBYdFNldFNlbnNpdGl2ZShtZW51LT5pZCwgRmFsc2UpOworCWVsc2UKKwkgICAgWHRTZXRTZW5zaXRpdmUobWVudS0+aWQsIFRydWUpOworICAgIH0KK30KKworLyoKKyAqIE1ha2UgbWVudSBpdGVtIGhpZGRlbiBvciBub3QgaGlkZGVuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX21lbnVfaGlkZGVuKG1lbnUsIGhpZGRlbikKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQloaWRkZW47Cit7CisgICAgaWYgKG1lbnUtPmlkICE9IChXaWRnZXQpMCkKKyAgICB7CisJaWYgKGhpZGRlbikKKwkgICAgWHRVbm1hbmFnZUNoaWxkKG1lbnUtPmlkKTsKKwllbHNlCisJICAgIFh0TWFuYWdlQ2hpbGQobWVudS0+aWQpOworICAgIH0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNldHRpbmcgYWxsIHRoZSBtZW51cyB0byBncmV5L2hpZGRlbiBvciBub3QuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX2RyYXdfbWVudWJhcigpCit7CisgICAgLyogTm90aGluZyB0byBkbyBpbiBYICovCit9CisKKy8qIEFSR1NVU0VEICovCisgICAgdm9pZAorZ3VpX3gxMV9tZW51X2NiKHcsIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCisgICAgV2lkZ2V0CXc7CisgICAgWHRQb2ludGVyCWNsaWVudF9kYXRhLCBjYWxsX2RhdGE7Cit7CisgICAgZ3VpX21lbnVfY2IoKHZpbW1lbnVfVCAqKWNsaWVudF9kYXRhKTsKK30KKworI2VuZGlmIC8qIEZFQVRfTUVOVSAqLworCisKKworLyoKKyAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHdpbmRvdyBjbG9zZWQuCVdvcmtzIGxpa2UgIjpxYSIuCisgKiBTaG91bGQgcHV0IHVwIGEgcmVxdWVzdGVyIQorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX3gxMV93bV9wcm90b2NvbF9oYW5kbGVyKHcsIGNsaWVudF9kYXRhLCBldmVudCwgZHVtKQorICAgIFdpZGdldAl3OworICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYRXZlbnQJKmV2ZW50OworICAgIEJvb2xlYW4JKmR1bTsKK3sKKyAgICAvKgorICAgICAqIE9ubHkgZGVhbCB3aXRoIENsaWVudCBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBpZiAoZXZlbnQtPnR5cGUgIT0gQ2xpZW50TWVzc2FnZSkKKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIFRoZSBXTV9TQVZFX1lPVVJTRUxGIGV2ZW50IGFycml2ZXMgd2hlbiB0aGUgd2luZG93IG1hbmFnZXIgd2FudHMgdG8KKyAgICAgKiBleGl0LiAgVGhhdCBjYW4gYmUgY2FuY2VsbGVkIHRob3VnaCwgdGh1cyBWaW0gc2hvdWxkbid0IGV4aXQgaGVyZS4KKyAgICAgKiBKdXN0IHN5bmMgb3VyIHN3YXAgZmlsZXMuCisgICAgICovCisgICAgaWYgKCgoWENsaWVudE1lc3NhZ2VFdmVudCAqKWV2ZW50KS0+ZGF0YS5sWzBdID09CisJCQkJCQkgIHdtX2F0b21zW1NBVkVfWU9VUlNFTEZfSURYXSkKKyAgICB7CisJb3V0X2ZsdXNoKCk7CisJbWxfc3luY19hbGwoRkFMU0UsIEZBTFNFKTsJLyogcHJlc2VydmUgYWxsIHN3YXAgZmlsZXMgKi8KKworCS8qIFNldCB0aGUgd2luZG93J3MgV01fQ09NTUFORCBwcm9wZXJ0eSwgdG8gbGV0IHRoZSB3aW5kb3cgbWFuYWdlcgorCSAqIGtub3cgd2UgYXJlIGRvbmUgc2F2aW5nIG91cnNlbHZlcy4gIFdlIGRvbid0IHdhbnQgdG8gYmUgcmVzdGFydGVkLAorCSAqIHRodXMgc2V0IGFyZ3YgdG8gTlVMTC4gKi8KKwlYU2V0Q29tbWFuZChndWkuZHB5LCBYdFdpbmRvdyh2aW1TaGVsbCksIE5VTEwsIDApOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKChYQ2xpZW50TWVzc2FnZUV2ZW50ICopZXZlbnQpLT5kYXRhLmxbMF0gIT0KKwkJCQkJCSAgd21fYXRvbXNbREVMRVRFX1dJTkRPV19JRFhdKQorCXJldHVybjsKKworICAgIGd1aV9zaGVsbF9jbG9zZWQoKTsKK30KKworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisvKgorICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcHJvcGVydHkgY2hhbmdlZC4gQ2hlY2sgZm9yIGluY29taW5nIGNvbW1hbmRzCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitndWlfeDExX3NlbmRfZXZlbnRfaGFuZGxlcih3LCBjbGllbnRfZGF0YSwgZXZlbnQsIGR1bSkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJY2xpZW50X2RhdGE7CisgICAgWEV2ZW50CSpldmVudDsKKyAgICBCb29sZWFuCSpkdW07Cit7CisgICAgWFByb3BlcnR5RXZlbnQgKmUgPSAoWFByb3BlcnR5RXZlbnQgKikgZXZlbnQ7CisKKyAgICBpZiAoZS0+dHlwZSA9PSBQcm9wZXJ0eU5vdGlmeSAmJiBlLT53aW5kb3cgPT0gY29tbVdpbmRvdworCSAgICAmJiBlLT5hdG9tID09IGNvbW1Qcm9wZXJ0eSAmJiAgZS0+c3RhdGUgPT0gUHJvcGVydHlOZXdWYWx1ZSkKKyAgICB7CisJc2VydmVyRXZlbnRQcm9jKGd1aS5kcHksIGV2ZW50KTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIEN1cnNvciBibGluayBmdW5jdGlvbnMuCisgKgorICogVGhpcyBpcyBhIHNpbXBsZSBzdGF0ZSBtYWNoaW5lOgorICogQkxJTktfTk9ORQlub3QgYmxpbmtpbmcgYXQgYWxsCisgKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KKyAqIEJMSU5LX09OCWJsaW5raW5nLCBjdXJzb3IgaXMgc2hvd24KKyAqLworCisjZGVmaW5lIEJMSU5LX05PTkUgIDAKKyNkZWZpbmUgQkxJTktfT0ZGICAgMQorI2RlZmluZSBCTElOS19PTiAgICAyCisKK3N0YXRpYyBpbnQJCWJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK3N0YXRpYyBsb25nX3UJCWJsaW5rX3dhaXR0aW1lID0gNzAwOworc3RhdGljIGxvbmdfdQkJYmxpbmtfb250aW1lID0gNDAwOworc3RhdGljIGxvbmdfdQkJYmxpbmtfb2ZmdGltZSA9IDI1MDsKK3N0YXRpYyBYdEludGVydmFsSWQJYmxpbmtfdGltZXIgPSAoWHRJbnRlcnZhbElkKTA7CisKKyAgICB2b2lkCitndWlfbWNoX3NldF9ibGlua2luZyh3YWl0dGltZSwgb24sIG9mZikKKyAgICBsb25nICAgIHdhaXR0aW1lLCBvbiwgb2ZmOworeworICAgIGJsaW5rX3dhaXR0aW1lID0gd2FpdHRpbWU7CisgICAgYmxpbmtfb250aW1lID0gb247CisgICAgYmxpbmtfb2ZmdGltZSA9IG9mZjsKK30KKworLyoKKyAqIFN0b3AgdGhlIGN1cnNvciBibGlua2luZy4gIFNob3cgdGhlIGN1cnNvciBpZiBpdCB3YXNuJ3Qgc2hvd24uCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3N0b3BfYmxpbmsoKQoreworICAgIGlmIChibGlua190aW1lciAhPSAoWHRJbnRlcnZhbElkKTApCisgICAgeworCVh0UmVtb3ZlVGltZU91dChibGlua190aW1lcik7CisJYmxpbmtfdGltZXIgPSAoWHRJbnRlcnZhbElkKTA7CisgICAgfQorICAgIGlmIChibGlua19zdGF0ZSA9PSBCTElOS19PRkYpCisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGJsaW5rX3N0YXRlID0gQkxJTktfTk9ORTsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKKyAqIHdhaXRpbmcgdGltZSBhbmQgc2hvd3MgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc3RhcnRfYmxpbmsoKQoreworICAgIGlmIChibGlua190aW1lciAhPSAoWHRJbnRlcnZhbElkKTApCisJWHRSZW1vdmVUaW1lT3V0KGJsaW5rX3RpbWVyKTsKKyAgICAvKiBPbmx5IHN3aXRjaCBibGlua2luZyBvbiBpZiBub25lIG9mIHRoZSB0aW1lcyBpcyB6ZXJvICovCisgICAgaWYgKGJsaW5rX3dhaXR0aW1lICYmIGJsaW5rX29udGltZSAmJiBibGlua19vZmZ0aW1lICYmIGd1aS5pbl9mb2N1cykKKyAgICB7CisJYmxpbmtfdGltZXIgPSBYdEFwcEFkZFRpbWVPdXQoYXBwX2NvbnRleHQsIGJsaW5rX3dhaXR0aW1lLAorCQkJCQkJICAgICAgZ3VpX3gxMV9ibGlua19jYiwgTlVMTCk7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgfQorfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitndWlfeDExX2JsaW5rX2NiKHRpbWVkX291dCwgaW50ZXJ2YWxfaWQpCisgICAgWHRQb2ludGVyCSAgICB0aW1lZF9vdXQ7CisgICAgWHRJbnRlcnZhbElkICAgICppbnRlcnZhbF9pZDsKK3sKKyAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT04pCisgICAgeworCWd1aV91bmRyYXdfY3Vyc29yKCk7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PRkY7CisJYmxpbmtfdGltZXIgPSBYdEFwcEFkZFRpbWVPdXQoYXBwX2NvbnRleHQsIGJsaW5rX29mZnRpbWUsCisJCQkJCQkgICAgICBndWlfeDExX2JsaW5rX2NiLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisJYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKKwlibGlua190aW1lciA9IFh0QXBwQWRkVGltZU91dChhcHBfY29udGV4dCwgYmxpbmtfb250aW1lLAorCQkJCQkJICAgICAgZ3VpX3gxMV9ibGlua19jYiwgTlVMTCk7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIHRoZSBSR0IgdmFsdWUgb2YgYSBwaXhlbCBhcyBhIGxvbmcuCisgKi8KKyAgICBsb25nX3UKK2d1aV9tY2hfZ2V0X3JnYihwaXhlbCkKKyAgICBndWljb2xvcl9UCXBpeGVsOworeworICAgIFhDb2xvcgl4YzsKKyAgICBDb2xvcm1hcAljb2xvcm1hcDsKKworICAgIGNvbG9ybWFwID0gRGVmYXVsdENvbG9ybWFwKGd1aS5kcHksIFhEZWZhdWx0U2NyZWVuKGd1aS5kcHkpKTsKKyAgICB4Yy5waXhlbCA9IHBpeGVsOworICAgIFhRdWVyeUNvbG9yKGd1aS5kcHksIGNvbG9ybWFwLCAmeGMpOworCisgICAgcmV0dXJuICgoeGMucmVkICYgMHhmZjAwKSA8PCA4KSArICh4Yy5ncmVlbiAmIDB4ZmYwMCkKKwkJCQkJCSAgICsgKCh1bnNpZ25lZCl4Yy5ibHVlID4+IDgpOworfQorCisvKgorICogQWRkIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMuCisgKi8KKyAgICB2b2lkCitndWlfeDExX2NhbGxiYWNrcyh0ZXh0QXJlYSwgdmltRm9ybSkKKyAgICBXaWRnZXQgdGV4dEFyZWE7CisgICAgV2lkZ2V0IHZpbUZvcm07Cit7CisgICAgWHRBZGRFdmVudEhhbmRsZXIodGV4dEFyZWEsIFZpc2liaWxpdHlDaGFuZ2VNYXNrLCBGQUxTRSwKKwlndWlfeDExX3Zpc2liaWxpdHlfY2IsIChYdFBvaW50ZXIpMCk7CisKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih0ZXh0QXJlYSwgRXhwb3N1cmVNYXNrLCBGQUxTRSwgZ3VpX3gxMV9leHBvc2VfY2IsCisJKFh0UG9pbnRlcikwKTsKKworICAgIFh0QWRkRXZlbnRIYW5kbGVyKHZpbVNoZWxsLCBTdHJ1Y3R1cmVOb3RpZnlNYXNrLCBGQUxTRSwKKwlndWlfeDExX3Jlc2l6ZV93aW5kb3dfY2IsIChYdFBvaW50ZXIpMCk7CisKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih2aW1TaGVsbCwgRm9jdXNDaGFuZ2VNYXNrLCBGQUxTRSwgZ3VpX3gxMV9mb2N1c19jaGFuZ2VfY2IsCisJKFh0UG9pbnRlcikwKTsKKyAgICAvKgorICAgICAqIE9ubHkgaW5zdGFsbCB0aGVzZSBlbnRlci9sZWF2ZSBjYWxsYmFja3Mgd2hlbiAncCcgaW4gJ2d1aW9wdGlvbnMnLgorICAgICAqIE9ubHkgbmVlZGVkIGZvciBzb21lIHdpbmRvdyBtYW5hZ2Vycy4KKyAgICAgKi8KKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19QT0lOVEVSKSAhPSBOVUxMKQorICAgIHsKKwlYdEFkZEV2ZW50SGFuZGxlcih2aW1TaGVsbCwgTGVhdmVXaW5kb3dNYXNrLCBGQUxTRSwgZ3VpX3gxMV9sZWF2ZV9jYiwKKwkgICAgKFh0UG9pbnRlcikwKTsKKwlYdEFkZEV2ZW50SGFuZGxlcih0ZXh0QXJlYSwgTGVhdmVXaW5kb3dNYXNrLCBGQUxTRSwgZ3VpX3gxMV9sZWF2ZV9jYiwKKwkgICAgKFh0UG9pbnRlcikwKTsKKwlYdEFkZEV2ZW50SGFuZGxlcih0ZXh0QXJlYSwgRW50ZXJXaW5kb3dNYXNrLCBGQUxTRSwgZ3VpX3gxMV9lbnRlcl9jYiwKKwkgICAgKFh0UG9pbnRlcikwKTsKKwlYdEFkZEV2ZW50SGFuZGxlcih2aW1TaGVsbCwgRW50ZXJXaW5kb3dNYXNrLCBGQUxTRSwgZ3VpX3gxMV9lbnRlcl9jYiwKKwkgICAgKFh0UG9pbnRlcikwKTsKKyAgICB9CisKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih2aW1Gb3JtLCBLZXlQcmVzc01hc2ssIEZBTFNFLCBndWlfeDExX2tleV9oaXRfY2IsCisJKFh0UG9pbnRlcikwKTsKKyAgICBYdEFkZEV2ZW50SGFuZGxlcih0ZXh0QXJlYSwgS2V5UHJlc3NNYXNrLCBGQUxTRSwgZ3VpX3gxMV9rZXlfaGl0X2NiLAorCShYdFBvaW50ZXIpMCk7CisKKyAgICAvKiBnZXQgcG9pbnRlciBtb3ZlZCBldmVudHMgZnJvbSBzY3JvbGxiYXIsIG5lZWRlZCBmb3IgJ21vdXNlZm9jdXMnICovCisgICAgWHRBZGRFdmVudEhhbmRsZXIodmltRm9ybSwgUG9pbnRlck1vdGlvbk1hc2ssCisJRkFMU0UsIGd1aV94MTFfbW91c2VfY2IsIChYdFBvaW50ZXIpMSk7CisgICAgWHRBZGRFdmVudEhhbmRsZXIodGV4dEFyZWEsIEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwKKwkJCQkJIEJ1dHRvbk1vdGlvbk1hc2sgfCBQb2ludGVyTW90aW9uTWFzaywKKwlGQUxTRSwgZ3VpX3gxMV9tb3VzZV9jYiwgKFh0UG9pbnRlcikwKTsKK30KKworLyoKKyAqIEdldCBjdXJyZW50IHkgbW91c2UgY29vcmRpbmF0ZSBpbiB0ZXh0IHdpbmRvdy4KKyAqIFJldHVybiAtMSB3aGVuIHVua25vd24uCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3goKQoreworICAgIGludAkJcm9vdHgsIHJvb3R5LCB3aW54LCB3aW55OworICAgIFdpbmRvdwlyb290LCBjaGlsZDsKKyAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgIGlmIChndWkud2lkICYmIFhRdWVyeVBvaW50ZXIoZ3VpLmRweSwgZ3VpLndpZCwgJnJvb3QsICZjaGlsZCwKKwkJCQkJICZyb290eCwgJnJvb3R5LCAmd2lueCwgJndpbnksICZtYXNrKSkKKwlyZXR1cm4gd2lueDsKKyAgICByZXR1cm4gLTE7Cit9CisKKyAgICBpbnQKK2d1aV9tY2hfZ2V0X21vdXNlX3koKQoreworICAgIGludAkJcm9vdHgsIHJvb3R5LCB3aW54LCB3aW55OworICAgIFdpbmRvdwlyb290LCBjaGlsZDsKKyAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgIGlmIChndWkud2lkICYmIFhRdWVyeVBvaW50ZXIoZ3VpLmRweSwgZ3VpLndpZCwgJnJvb3QsICZjaGlsZCwKKwkJCQkJICZyb290eCwgJnJvb3R5LCAmd2lueCwgJndpbnksICZtYXNrKSkKKwlyZXR1cm4gd2lueTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyAgICB2b2lkCitndWlfbWNoX3NldG1vdXNlKHgsIHkpCisgICAgaW50CQl4OworICAgIGludAkJeTsKK3sKKyAgICBpZiAoZ3VpLndpZCkKKwlYV2FycFBvaW50ZXIoZ3VpLmRweSwgKFdpbmRvdykwLCBndWkud2lkLCAwLCAwLCAwLCAwLCB4LCB5KTsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfR1VJX01PVElGKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgWEJ1dHRvblByZXNzZWRFdmVudCAqCitndWlfeDExX2dldF9sYXN0X21vdXNlX2V2ZW50KCkKK3sKKyAgICByZXR1cm4gJmxhc3RfbW91c2VfZXZlbnQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9TSUdOX0lDT05TKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKiBTaWducyBhcmUgY3VycmVudGx5IGFsd2F5cyAyIGNoYXJzIHdpZGUuICBIb3BlZnVsbHkgdGhlIGZvbnQgaXMgYmlnIGVub3VnaAorICogdG8gcHJvdmlkZSByb29tIGZvciB0aGUgYml0bWFwISAqLworIyBkZWZpbmUgU0lHTl9XSURUSCAoZ3VpLmNoYXJfd2lkdGggKiAyKQorCisjaWYgMAkvKiBub3QgdXNlZCAqLworICAgIHZvaWQKK2d1aV9tY2hfY2xlYXJzaWduKHJvdykKKyAgICBpbnQJCXJvdzsKK3sKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlYQ2xlYXJBcmVhKGd1aS5kcHksIGd1aS53aWQsIDAsIFRFWFRfWShyb3cpIC0gZ3VpLmNoYXJfaGVpZ2h0LAorCQlTSUdOX1dJRFRILCBndWkuY2hhcl9oZWlnaHQsIEZBTFNFKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZ3VpX21jaF9kcmF3c2lnbihyb3csIGNvbCwgdHlwZW5yKQorICAgIGludAkJcm93OworICAgIGludAkJY29sOworICAgIGludAkJdHlwZW5yOworeworICAgIFhJbWFnZQkqc2lnbjsKKworICAgIGlmIChndWkuaW5fdXNlICYmIChzaWduID0gKFhJbWFnZSAqKXNpZ25fZ2V0X2ltYWdlKHR5cGVucikpICE9IE5VTEwpCisgICAgeworCVhDbGVhckFyZWEoZ3VpLmRweSwgZ3VpLndpZCwgVEVYVF9YKGNvbCksIFRFWFRfWShyb3cpIC0gc2lnbi0+aGVpZ2h0LAorCQlTSUdOX1dJRFRILCBndWkuY2hhcl9oZWlnaHQsIEZBTFNFKTsKKwlYUHV0SW1hZ2UoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIHNpZ24sIDAsIDAsCisJCVRFWFRfWChjb2wpICsgKFNJR05fV0lEVEggLSBzaWduLT53aWR0aCkgLyAyLAorCQlURVhUX1kocm93KSAtIHNpZ24tPmhlaWdodCwKKwkJc2lnbi0+d2lkdGgsIHNpZ24tPmhlaWdodCk7CisgICAgfQorfQorCisgICAgdm9pZCAqCitndWlfbWNoX3JlZ2lzdGVyX3NpZ24oc2lnbmZpbGUpCisgICAgY2hhcl91CSAgICAqc2lnbmZpbGU7Cit7CisgICAgWHBtQXR0cmlidXRlcyAgIGF0dHJzOworICAgIFhJbWFnZQkgICAgKnNpZ247CisgICAgaW50CQkgICAgc3RhdHVzOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgY29sb3Igc3Vic3RpdHV0aW9uIHRhYmxlLgorICAgICAqLworICAgIHNpZ24gPSBOVUxMOworICAgIGlmIChzaWduZmlsZVswXSAhPSBOVUwgJiYgc2lnbmZpbGVbMF0gIT0gJy0nKQorICAgIHsKKwlzaWduID0gKFhJbWFnZSAqKWFsbG9jKHNpemVvZihYSW1hZ2UpKTsKKwlpZiAoc2lnbiAhPSBOVUxMKQorCXsKKwkgICAgWHBtQ29sb3JTeW1ib2wgY29sb3JbNV0gPQorCSAgICB7CisJCXsibm9uZSIsIE5VTEwsIDB9LAorCQl7Imljb25Db2xvcjEiLCBOVUxMLCAwfSwKKwkJeyJib3R0b21TaGFkb3dDb2xvciIsIE5VTEwsIDB9LAorCQl7InRvcFNoYWRvd0NvbG9yIiwgTlVMTCwgMH0sCisJCXsic2VsZWN0Q29sb3IiLCBOVUxMLCAwfQorCSAgICB9OworCSAgICBhdHRycy52YWx1ZW1hc2sgPSBYcG1Db2xvclN5bWJvbHM7CisJICAgIGF0dHJzLm51bXN5bWJvbHMgPSAyOworCSAgICBhdHRycy5jb2xvcnN5bWJvbHMgPSBjb2xvcjsKKwkgICAgYXR0cnMuY29sb3JzeW1ib2xzWzBdLnBpeGVsID0gZ3VpLmJhY2tfcGl4ZWw7CisJICAgIGF0dHJzLmNvbG9yc3ltYm9sc1sxXS5waXhlbCA9IGd1aS5ub3JtX3BpeGVsOworCSAgICBzdGF0dXMgPSBYcG1SZWFkRmlsZVRvSW1hZ2UoZ3VpLmRweSwgKGNoYXIgKilzaWduZmlsZSwKKwkJCQkJCQkgJnNpZ24sIE5VTEwsICZhdHRycyk7CisKKwkgICAgaWYgKHN0YXR1cyA9PSAwKQorCSAgICB7CisJCS8qIFNpZ24gd2lkdGggaXMgZml4ZWQgYXQgdHdvIGNvbHVtbnMgbm93LgorCQlpZiAoc2lnbi0+d2lkdGggPiBndWkuc2lnbl93aWR0aCkKKwkJICAgIGd1aS5zaWduX3dpZHRoID0gc2lnbi0+d2lkdGggKyA4OyAqLworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQl2aW1fZnJlZShzaWduKTsKKwkJc2lnbiA9IE5VTEw7CisJCUVNU0coXyhlX3NpZ25kYXRhKSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuICh2b2lkICopc2lnbjsKK30KKworICAgIHZvaWQKK2d1aV9tY2hfZGVzdHJveV9zaWduKHNpZ24pCisgICAgdm9pZCAqc2lnbjsKK3sKKyAgICBYRnJlZSgoKFhJbWFnZSAqKXNpZ24pLT5kYXRhKTsKKyAgICB2aW1fZnJlZShzaWduKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKy8qIFRoZSBsYXN0IHNldCBtb3VzZSBwb2ludGVyIHNoYXBlIGlzIHJlbWVtYmVyZWQsIHRvIGJlIHVzZWQgd2hlbiBpdCBnb2VzCisgKiBmcm9tIGhpZGRlbiB0byBub3QgaGlkZGVuLiAqLworc3RhdGljIGludCBsYXN0X3NoYXBlID0gMDsKKyNlbmRpZgorCisvKgorICogVXNlIHRoZSBibGFuayBtb3VzZSBwb2ludGVyIG9yIG5vdC4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfbW91c2VoaWRlKGhpZGUpCisgICAgaW50CQloaWRlOwkvKiBUUlVFID0gdXNlIGJsYW5rIHB0ciwgRkFMU0UgPSB1c2UgcGFyZW50IHB0ciAqLworeworICAgIGlmIChndWkucG9pbnRlcl9oaWRkZW4gIT0gaGlkZSkKKyAgICB7CisJZ3VpLnBvaW50ZXJfaGlkZGVuID0gaGlkZTsKKwlpZiAoaGlkZSkKKwkgICAgWERlZmluZUN1cnNvcihndWkuZHB5LCBndWkud2lkLCBndWkuYmxhbmtfcG9pbnRlcik7CisJZWxzZQorI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQorCSAgICBtY2hfc2V0X21vdXNlX3NoYXBlKGxhc3Rfc2hhcGUpOworI2Vsc2UKKwkgICAgWFVuZGVmaW5lQ3Vyc29yKGd1aS5kcHksIGd1aS53aWQpOworI2VuZGlmCisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX01PVVNFU0hBUEUpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qIFRhYmxlIGZvciBzaGFwZSBJRHMuICBLZWVwIGluIHN5bmMgd2l0aCB0aGUgbXNoYXBlX25hbWVzW10gdGFibGUgaW4KKyAqIG1pc2MyLmMhICovCitzdGF0aWMgaW50IG1zaGFwZV9pZHNbXSA9Cit7CisgICAgWENfbGVmdF9wdHIsCQkvKiBhcnJvdyAqLworICAgIDAsCQkJCS8qIGJsYW5rICovCisgICAgWENfeHRlcm0sCQkJLyogYmVhbSAqLworICAgIFhDX3NiX3ZfZG91YmxlX2Fycm93LAkvKiB1cGRvd24gKi8KKyAgICBYQ19zaXppbmcsCQkJLyogdWRzaXppbmcgKi8KKyAgICBYQ19zYl9oX2RvdWJsZV9hcnJvdywJLyogbGVmdHJpZ2h0ICovCisgICAgWENfc2l6aW5nLAkJCS8qIGxyc2l6aW5nICovCisgICAgWENfd2F0Y2gsCQkJLyogYnVzeSAqLworICAgIFhDX1hfY3Vyc29yLAkJLyogbm8gKi8KKyAgICBYQ19jcm9zc2hhaXIsCQkvKiBjcm9zc2hhaXIgKi8KKyAgICBYQ19oYW5kMSwJCQkvKiBoYW5kMSAqLworICAgIFhDX2hhbmQyLAkJCS8qIGhhbmQyICovCisgICAgWENfcGVuY2lsLAkJCS8qIHBlbmNpbCAqLworICAgIFhDX3F1ZXN0aW9uX2Fycm93LAkJLyogcXVlc3Rpb24gKi8KKyAgICBYQ19yaWdodF9wdHIsCQkvKiByaWdodC1hcnJvdyAqLworICAgIFhDX2NlbnRlcl9wdHIsCQkvKiB1cC1hcnJvdyAqLworICAgIFhDX2xlZnRfcHRyCQkJLyogbGFzdCBvbmUgKi8KK307CisKKyAgICB2b2lkCittY2hfc2V0X21vdXNlX3NoYXBlKHNoYXBlKQorICAgIGludAlzaGFwZTsKK3sKKyAgICBpbnQJICAgIGlkOworCisgICAgaWYgKCFndWkuaW5fdXNlKQorCXJldHVybjsKKworICAgIGlmIChzaGFwZSA9PSBNU0hBUEVfSElERSB8fCBndWkucG9pbnRlcl9oaWRkZW4pCisJWERlZmluZUN1cnNvcihndWkuZHB5LCBndWkud2lkLCBndWkuYmxhbmtfcG9pbnRlcik7CisgICAgZWxzZQorICAgIHsKKwlpZiAoc2hhcGUgPj0gTVNIQVBFX05VTUJFUkVEKQorCXsKKwkgICAgaWQgPSBzaGFwZSAtIE1TSEFQRV9OVU1CRVJFRDsKKwkgICAgaWYgKGlkID49IFhDX251bV9nbHlwaHMpCisJCWlkID0gWENfbGVmdF9wdHI7CisJICAgIGVsc2UKKwkJaWQgJj0gfjE7CS8qIHRoZXkgYXJlIGFsd2F5cyBldmVuICh3aHk/KSAqLworCX0KKwllbHNlCisJICAgIGlkID0gbXNoYXBlX2lkc1tzaGFwZV07CisKKwlYRGVmaW5lQ3Vyc29yKGd1aS5kcHksIGd1aS53aWQsIFhDcmVhdGVGb250Q3Vyc29yKGd1aS5kcHksIGlkKSk7CisgICAgfQorICAgIGlmIChzaGFwZSAhPSBNU0hBUEVfSElERSkKKwlsYXN0X3NoYXBlID0gc2hhcGU7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEljb25zIHVzZWQgYnkgdGhlIHRvb2xiYXIgY29kZS4KKyAqLworI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbmV3LnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX29wZW4ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfY2xvc2UueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc2F2ZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9wcmludC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9jdXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfY29weS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9wYXN0ZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9maW5kLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2ZpbmRfbmV4dC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9maW5kX3ByZXYueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfZmluZF9oZWxwLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2V4aXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfdW5kby54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9yZWRvLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2hlbHAueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWFjcm8ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWFrZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9zYXZlX2FsbC54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9qdW1wLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2N0YWdzLnhwbSIKKyNpbmNsdWRlICIuLi9waXhtYXBzL3RiX2xvYWRfc2Vzc2lvbi54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl9zYXZlX3Nlc3Npb24ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbmV3X3Nlc3Npb24ueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfYmxhbmsueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWF4aW1pemUueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc3BsaXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWluaW1pemUueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfc2hlbGwueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfcmVwbGFjZS54cG0iCisjaW5jbHVkZSAiLi4vcGl4bWFwcy90Yl92c3BsaXQueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWF4d2lkdGgueHBtIgorI2luY2x1ZGUgIi4uL3BpeG1hcHMvdGJfbWlud2lkdGgueHBtIgorCisvKgorICogVGhvc2UgYXJlIHRoZSBwaXhtYXBzIHVzZWQgZm9yIHRoZSBkZWZhdWx0IGJ1dHRvbnMuCisgKi8KK3N0YXRpYyBjaGFyICoqKGJ1aWx0X2luX3BpeG1hcHNbXSkgPQoreworICAgIHRiX25ld194cG0sCisgICAgdGJfb3Blbl94cG0sCisgICAgdGJfc2F2ZV94cG0sCisgICAgdGJfdW5kb194cG0sCisgICAgdGJfcmVkb194cG0sCisgICAgdGJfY3V0X3hwbSwKKyAgICB0Yl9jb3B5X3hwbSwKKyAgICB0Yl9wYXN0ZV94cG0sCisgICAgdGJfcHJpbnRfeHBtLAorICAgIHRiX2hlbHBfeHBtLAorICAgIHRiX2ZpbmRfeHBtLAorICAgIHRiX3NhdmVfYWxsX3hwbSwKKyAgICB0Yl9zYXZlX3Nlc3Npb25feHBtLAorICAgIHRiX25ld19zZXNzaW9uX3hwbSwKKyAgICB0Yl9sb2FkX3Nlc3Npb25feHBtLAorICAgIHRiX21hY3JvX3hwbSwKKyAgICB0Yl9yZXBsYWNlX3hwbSwKKyAgICB0Yl9jbG9zZV94cG0sCisgICAgdGJfbWF4aW1pemVfeHBtLAorICAgIHRiX21pbmltaXplX3hwbSwKKyAgICB0Yl9zcGxpdF94cG0sCisgICAgdGJfc2hlbGxfeHBtLAorICAgIHRiX2ZpbmRfcHJldl94cG0sCisgICAgdGJfZmluZF9uZXh0X3hwbSwKKyAgICB0Yl9maW5kX2hlbHBfeHBtLAorICAgIHRiX21ha2VfeHBtLAorICAgIHRiX2p1bXBfeHBtLAorICAgIHRiX2N0YWdzX3hwbSwKKyAgICB0Yl92c3BsaXRfeHBtLAorICAgIHRiX21heHdpZHRoX3hwbSwKKyAgICB0Yl9taW53aWR0aF94cG0sCisgICAgdGJfZXhpdF94cG0KK307CisKK3N0YXRpYyB2b2lkIGNyZWF0ZVhwbUltYWdlcyBfX0FSR1MoKGNoYXJfdSAqcGF0aCwgY2hhciAqKnhwbSwgUGl4bWFwICpzZW4sIFBpeG1hcCAqaW5zZW4pKTsKKworLyoKKyAqIEFsbG9jYXRlZCBhIHBpeG1hcCBmb3IgdG9vbGJhciBtZW51ICJtZW51Ii4KKyAqIFJldHVybiBpbiAic2VuIiBhbmQgImluc2VuIi4gICJpbnNlbiIgY2FuIGJlIE5VTEwuCisgKi8KKyAgICB2b2lkCitnZXRfdG9vbGJhcl9waXhtYXAobWVudSwgc2VuLCBpbnNlbikKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgUGl4bWFwCSpzZW47CisgICAgUGl4bWFwCSppbnNlbjsKK3sKKyAgICBjaGFyX3UJYnVmW01BWFBBVEhMXTsJCS8qIGJ1ZmZlciBzdG9yaW5nIGV4cGFuZGVkIHBhdGhuYW1lICovCisgICAgY2hhcgkqKnhwbSA9IE5VTEw7CQkvKiB4cG0gYXJyYXkgKi8KKworICAgIGJ1ZlswXSA9IE5VTDsJCQkvKiBzdGFydCB3aXRoIE5VTEwgcGF0aCAqLworCisgICAgaWYgKG1lbnUtPmljb25maWxlICE9IE5VTEwpCisgICAgeworCS8qIFVzZSB0aGUgImljb249IiAgYXJndW1lbnQuICovCisJZ3VpX2ZpbmRfaWNvbmZpbGUobWVudS0+aWNvbmZpbGUsIGJ1ZiwgInhwbSIpOworCWNyZWF0ZVhwbUltYWdlcyhidWYsIE5VTEwsIHNlbiwgaW5zZW4pOworCisJLyogSWYgaXQgZmFpbGVkLCB0cnkgdXNpbmcgdGhlIG1lbnUgbmFtZS4gKi8KKwlpZiAoKnNlbiA9PSAoUGl4bWFwKTAgJiYgZ3VpX2ZpbmRfYml0bWFwKG1lbnUtPm5hbWUsIGJ1ZiwgInhwbSIpID09IE9LKQorCSAgICBjcmVhdGVYcG1JbWFnZXMoYnVmLCBOVUxMLCBzZW4sIGluc2VuKTsKKwlpZiAoKnNlbiAhPSAoUGl4bWFwKTApCisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWVudS0+aWNvbl9idWlsdGluIHx8IGd1aV9maW5kX2JpdG1hcChtZW51LT5uYW1lLCBidWYsICJ4cG0iKSA9PSBGQUlMKQorICAgIHsKKwlpZiAobWVudS0+aWNvbmlkeCA+PSAwICYmIG1lbnUtPmljb25pZHgKKwkJICAgPCAoc2l6ZW9mKGJ1aWx0X2luX3BpeG1hcHMpIC8gc2l6ZW9mKGJ1aWx0X2luX3BpeG1hcHNbMF0pKSkKKwkgICAgeHBtID0gYnVpbHRfaW5fcGl4bWFwc1ttZW51LT5pY29uaWR4XTsKKwllbHNlCisJICAgIHhwbSA9IHRiX2JsYW5rX3hwbTsKKyAgICB9CisKKyAgICBpZiAoeHBtICE9IE5VTEwgfHwgYnVmWzBdICE9IE5VTCkKKwljcmVhdGVYcG1JbWFnZXMoYnVmLCB4cG0sIHNlbiwgaW5zZW4pOworfQorCisvKiBJbmRpY2VzIGZvciBuYW1lZCBjb2xvcnMgKi8KKyNkZWZpbmUgQkFDS0dST1VORAkwCisjZGVmaW5lIEZPUkVHUk9VTkQJMQorI2RlZmluZSBCT1RUT01fU0hBRE9XCTIKKyNkZWZpbmUgVE9QX1NIQURPVwkzCisjZGVmaW5lIEhJR0hMSUdIVAk0CisKKy8qCisgKiBSZWFkIGFuIFhwbSBmaWxlLCBkb2luZyBjb2xvciBzdWJzdGl0dXRpb25zIGZvciB0aGUgZm9yZWdyb3VuZCBhbmQKKyAqIGJhY2tncm91bmQgY29sb3JzLiBJZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIGEgY29sb3IgeHBtIGZpbGUsCisgKiBkcm9wIGJhY2sgYW5kIHJlYWQgdGhlIG1vbm9jaHJvbWUgZmlsZS4gSWYgc3VjY2Vzc2Z1bCwgY3JlYXRlIHRoZQorICogaW5zZW5zaXRpdmUgUGl4bWFwIHRvby4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjcmVhdGVYcG1JbWFnZXMocGF0aCwgeHBtLCBzZW4sIGluc2VuKQorICAgIGNoYXJfdQkqcGF0aDsKKyAgICBjaGFyCSoqeHBtOworICAgIFBpeG1hcAkqc2VuOworICAgIFBpeG1hcAkqaW5zZW47CSAgICAvKiBjYW4gYmUgTlVMTCAqLworeworICAgIFdpbmRvdwlyb290V2luZG93OworICAgIFhwbUF0dHJpYnV0ZXMgYXR0cnM7CisgICAgWHBtQ29sb3JTeW1ib2wgY29sb3JbNV0gPQorICAgIHsKKwl7Im5vbmUiLCAibm9uZSIsIDB9LAorCXsiaWNvbkNvbG9yMSIsIE5VTEwsIDB9LAorCXsiYm90dG9tU2hhZG93Q29sb3IiLCBOVUxMLCAwfSwKKwl7InRvcFNoYWRvd0NvbG9yIiwgTlVMTCwgMH0sCisJeyJzZWxlY3RDb2xvciIsIE5VTEwsIDB9CisgICAgfTsKKyAgICBpbnQJCXNjcmVlbk51bTsKKyAgICBpbnQJCXN0YXR1czsKKyAgICBQaXhtYXAJbWFzazsKKyAgICBQaXhtYXAJbWFwOworCisgICAgZ3VpX21jaF9nZXRfdG9vbGJhcl9jb2xvcnMoCisJICAgICZjb2xvcltCQUNLR1JPVU5EXS5waXhlbCwKKwkgICAgJmNvbG9yW0ZPUkVHUk9VTkRdLnBpeGVsLAorCSAgICAmY29sb3JbQk9UVE9NX1NIQURPV10ucGl4ZWwsCisJICAgICZjb2xvcltUT1BfU0hBRE9XXS5waXhlbCwKKwkgICAgJmNvbG9yW0hJR0hMSUdIVF0ucGl4ZWwpOworCisgICAgLyogU2V0dXAgdGhlIGNvbG9yIHN1YnNpdGl0dXRpb24gdGFibGUgKi8KKyAgICBhdHRycy52YWx1ZW1hc2sgPSBYcG1Db2xvclN5bWJvbHM7CisgICAgYXR0cnMuY29sb3JzeW1ib2xzID0gY29sb3I7CisgICAgYXR0cnMubnVtc3ltYm9scyA9IDU7CisKKyAgICBzY3JlZW5OdW0gPSBEZWZhdWx0U2NyZWVuKGd1aS5kcHkpOworICAgIHJvb3RXaW5kb3cgPSBSb290V2luZG93KGd1aS5kcHksIHNjcmVlbk51bSk7CisKKyAgICAvKiBDcmVhdGUgdGhlICJzZW5zaXRpdmUiIHBpeG1hcCAqLworICAgIGlmICh4cG0gIT0gTlVMTCkKKwlzdGF0dXMgPSBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YShndWkuZHB5LCByb290V2luZG93LCB4cG0sCisJCQkJCQkJICZtYXAsICZtYXNrLCAmYXR0cnMpOworICAgIGVsc2UKKwlzdGF0dXMgPSBYcG1SZWFkRmlsZVRvUGl4bWFwKGd1aS5kcHksIHJvb3RXaW5kb3csIChjaGFyICopcGF0aCwKKwkJCQkJCQkgJm1hcCwgJm1hc2ssICZhdHRycyk7CisgICAgaWYgKHN0YXR1cyA9PSBYcG1TdWNjZXNzICYmIG1hcCAhPSAwKQorICAgIHsKKwlYR0NWYWx1ZXMgICBnY3ZhbHVlczsKKwlHQwkgICAgYmFja19nYzsKKwlHQwkgICAgbWFza19nYzsKKworCS8qIE5lZWQgdG8gY3JlYXRlIG5ldyBQaXhtYXBzIHdpdGggdGhlIG1hc2sgYXBwbGllZC4gKi8KKwlnY3ZhbHVlcy5mb3JlZ3JvdW5kID0gY29sb3JbQkFDS0dST1VORF0ucGl4ZWw7CisJYmFja19nYyA9IFhDcmVhdGVHQyhndWkuZHB5LCBtYXAsIEdDRm9yZWdyb3VuZCwgJmdjdmFsdWVzKTsKKwltYXNrX2djID0gWENyZWF0ZUdDKGd1aS5kcHksIG1hcCwgR0NGb3JlZ3JvdW5kLCAmZ2N2YWx1ZXMpOworCVhTZXRDbGlwTWFzayhndWkuZHB5LCBtYXNrX2djLCBtYXNrKTsKKworCS8qIENyZWF0ZSB0aGUgInNlbnNpdGl2ZSIgcGl4bWFwLiAqLworCSpzZW4gPSBYQ3JlYXRlUGl4bWFwKGd1aS5kcHksIHJvb3RXaW5kb3csCisJCSBhdHRycy53aWR0aCwgYXR0cnMuaGVpZ2h0LAorCQkgRGVmYXVsdERlcHRoKGd1aS5kcHksIHNjcmVlbk51bSkpOworCVhGaWxsUmVjdGFuZ2xlKGd1aS5kcHksICpzZW4sIGJhY2tfZ2MsIDAsIDAsCisJCWF0dHJzLndpZHRoLCBhdHRycy5oZWlnaHQpOworCVhDb3B5QXJlYShndWkuZHB5LCBtYXAsICpzZW4sIG1hc2tfZ2MsIDAsIDAsCisJCWF0dHJzLndpZHRoLCBhdHRycy5oZWlnaHQsIDAsIDApOworCisjaWZkZWYgRkVBVF9HVUlfTU9USUYJLyogbm90IHVzZWQgZm9yIEF0aGVuYSAqLworCWlmIChpbnNlbiAhPSBOVUxMKQorCXsKKwkgICAgaW50CQl4LCB5OworCSAgICBpbnQJCXN0YXJ0WDsKKworCSAgICAvKiBDcmVhdGUgdGhlICJpbnNlbnNpdGl2ZSIgcGl4bWFwLiAgSXQncyBhIGNvcHkgb2YgdGhlICJzZW5zaXRpdmUiCisJICAgICAqIHBpeG1hcCB3aXRoIGhhbGYgdGhlIHBpeGVscyBzZXQgdG8gdGhlIGJhY2tncm91bmQgY29sb3IuICovCisJICAgICppbnNlbiA9IFhDcmVhdGVQaXhtYXAoZ3VpLmRweSwgcm9vdFdpbmRvdywKKwkJICAgIGF0dHJzLndpZHRoLCBhdHRycy5oZWlnaHQsCisJCSAgICBEZWZhdWx0RGVwdGgoZ3VpLmRweSwgc2NyZWVuTnVtKSk7CisJICAgIFhDb3B5QXJlYShndWkuZHB5LCAqc2VuLCAqaW5zZW4sIGJhY2tfZ2MsIDAsIDAsCisJCSAgICBhdHRycy53aWR0aCwgYXR0cnMuaGVpZ2h0LCAwLCAwKTsKKwkgICAgZm9yICh5ID0gMDsgeSA8IGF0dHJzLmhlaWdodDsgeSsrKQorCSAgICB7CisJCWlmICh5ICUgMiA9PSAwKQorCQkgICAgc3RhcnRYID0gMDsKKwkJZWxzZQorCQkgICAgc3RhcnRYID0gMTsKKwkJZm9yICh4ID0gc3RhcnRYOyB4IDwgYXR0cnMud2lkdGg7IHggKz0gMikKKwkJICAgIFhEcmF3UG9pbnQoZ3VpLmRweSwgKmluc2VuLCBiYWNrX2djLCB4LCB5KTsKKwkgICAgfQorCisJfQorI2VuZGlmCisJWEZyZWVHQyhndWkuZHB5LCBiYWNrX2djKTsKKwlYRnJlZUdDKGd1aS5kcHksIG1hc2tfZ2MpOworCVhGcmVlUGl4bWFwKGd1aS5kcHksIG1hcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJKnNlbiA9IDA7CisJaWYgKGluc2VuICE9IE5VTEwpCisJICAgICppbnNlbiA9IDA7CisgICAgfQorCisgICAgWHBtRnJlZUF0dHJpYnV0ZXMoJmF0dHJzKTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNldCB0aGUgYmFsbG9vbi1ldmFsIHVzZWQgZm9yIHRoZSB0b29sdGlwIG9mIGEgdG9vbGJhciBtZW51IGl0ZW0uCisgKiBUaGUgY2hlY2sgZm9yIGEgbm9uLXRvb2xiYXIgaXRlbSB3YXMgYWRkZWQsIGJlY2F1c2UgdGhlcmUgaXMgYSBjcmFzaCB3aGVuCisgKiBwYXNzaW5nIGEgbm9ybWFsIG1lbnUgaXRlbSBoZXJlLiAgQ2FuJ3QgZXhwbGFpbiB0aGF0LCBidXQgYmV0dGVyIGF2b2lkIGl0LgorICovCisgICAgdm9pZAorZ3VpX21jaF9tZW51X3NldF90aXAobWVudSkKKyAgICB2aW1tZW51X1QJKm1lbnU7Cit7CisgICAgaWYgKG1lbnUtPmlkICE9IE5VTEwgJiYgbWVudS0+cGFyZW50ICE9IE5VTEwKKwkJCQkgICAgICAgJiYgbWVudV9pc190b29sYmFyKG1lbnUtPnBhcmVudC0+bmFtZSkpCisgICAgeworCS8qIEFsd2F5cyBkZXN0cm95IGFuZCBjcmVhdGUgdGhlIGJhbGxvb24sIGluIGNhc2UgdGhlIHN0cmluZyB3YXMKKwkgKiBjaGFuZ2VkLiAqLworCWlmIChtZW51LT50aXAgIT0gTlVMTCkKKwl7CisJICAgIGd1aV9tY2hfZGVzdHJveV9iZXZhbF9hcmVhKG1lbnUtPnRpcCk7CisJICAgIG1lbnUtPnRpcCA9IE5VTEw7CisJfQorCWlmIChtZW51LT5zdHJpbmdzW01FTlVfSU5ERVhfVElQXSAhPSBOVUxMKQorCSAgICBtZW51LT50aXAgPSBndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKAorCQkgICAgbWVudS0+aWQsCisJCSAgICBtZW51LT5zdHJpbmdzW01FTlVfSU5ERVhfVElQXSwKKwkJICAgIE5VTEwsCisJCSAgICBOVUxMKTsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9ndWl3MTZyYy5oIGIvc3JjL2d1aXcxNnJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1NTIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ndWl3MTZyYy5oCkBAIC0wLDAgKzEsMTcgQEAKKworI2RlZmluZQlJRFJfVklNIDE1MAorCisjZGVmaW5lIElEUl9WSU1fRVJST1IJMTUxCisjZGVmaW5lIElEUl9WSU1fQUxFUlQJMTUyCisjZGVmaW5lIElEUl9WSU1fSU5GTwkxNTMKKyNkZWZpbmUgSURSX1ZJTV9RVUVTVElPTiAxNTQKKworI2RlZmluZSBJRFJfSUNPQlVERFlCQVNFCQkJMjAwCisKKyNkZWZpbmUgSURSX0lDT0JVRERZX0RFRjEJCQkoSURSX0lDT0JVRERZQkFTRSArIDMpCisjZGVmaW5lIElEUl9JQ09CVUREWV9ERUYyCQkJKElEUl9JQ09CVUREWUJBU0UgKyAwKQorI2RlZmluZSBJRFJfSUNPQlVERFlfREVGMwkJCShJRFJfSUNPQlVERFlCQVNFICsgMSkKKyNkZWZpbmUgSURSX0lDT0JVRERZX0RFRjQJCQkoSURSX0lDT0JVRERZQkFTRSArIDIpCisKKyNkZWZpbmUgSURSX0lDT0JVRERZX0dSSU4JCQkoSURSX0lDT0JVRERZQkFTRSArIDQpCisjZGVmaW5lIElEUl9JQ09CVUREWV9BTEFSTQkJCShJRFJfSUNPQlVERFlCQVNFICsgNSkKZGlmZiAtLWdpdCBhL3NyYy9ndmltLmV4ZS5tbmYgYi9zcmMvZ3ZpbS5leGUubW5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzU4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ3ZpbS5leGUubW5mCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4KKyAgPGFzc2VtYmx5SWRlbnRpdHkKKyAgICBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9Ilg4NiIKKyAgICB2ZXJzaW9uPSI2LjIuMC4wIgorICAgIHR5cGU9IndpbjMyIgorICAgIG5hbWU9IlZpbSIKKyAgLz4KKyAgPGRlc2NyaXB0aW9uPlZpIEltcHJvdmVkIC0gQSBUZXh0IEVkaXRvcjwvZGVzY3JpcHRpb24+CisgIDxkZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxhc3NlbWJseUlkZW50aXR5CisgICAgICAgIHR5cGU9IndpbjMyIgorICAgICAgICBuYW1lPSJNaWNyb3NvZnQuV2luZG93cy5Db21tb24tQ29udHJvbHMiCisgICAgICAgIHZlcnNpb249IjYuMC4wLjAiCisgICAgICAgIHB1YmxpY0tleVRva2VuPSI2NTk1YjY0MTQ0Y2NmMWRmIgorICAgICAgICBsYW5ndWFnZT0iKiIKKyAgICAgICAgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJYODYiCisgICAgICAvPgorICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgIDwvZGVwZW5kZW5jeT4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9zcmMvaGFuZ3VsaW4uYyBiL3NyYy9oYW5ndWxpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTE2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGFuZ3VsaW4uYwpAQCAtMCwwICsxLDE2MjEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWZuZGVmIEhBTkdVTF9ERUZBVUxUX0tFWUJPQVJECisjIGRlZmluZSBIQU5HVUxfREVGQVVMVF9LRVlCT0FSRCAzCisjZW5kaWYKKworI2RlZmluZSBBVVRPTUFUQV9ORVcJCTAKKyNkZWZpbmUgQVVUT01BVEFfQ09SUkVDVAkxCisjZGVmaW5lIEFVVE9NQVRBX1NQRUNJQUwJMgorI2RlZmluZSBBVVRPTUFUQV9DT1JSRUNUX05FVwkzCisjZGVmaW5lIEFVVE9NQVRBX0VSUk9SCQk0CisjZGVmaW5lIEFVVE9NQVRBX05VTEwJCTUKKworI2RlZmluZSBGX0YJMHgxCS8qIMPKvLogKGluaXRpYWwgc291bmQpICovCisjZGVmaW5lIEZfTQkweDIJLyogwd+8uiAobWVkaWFsIHZvd2VsKSAqLworI2RlZmluZSBGX0wJMHg0CS8qIMG+vLogKGZpbmFsIGNvbnNvbmFudCkgKi8KKyNkZWZpbmUgRl9BCTB4OAkvKiBBU0NJSSAqLworI2RlZmluZSBGX05VTEwgMQorI2RlZmluZSBNX05VTEwgMgorI2RlZmluZSBMX05VTEwgMQorCitzdGF0aWMgaW50IGhhbmd1bF9pbnB1dF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IGY9Rl9OVUxMLCBtPU1fTlVMTCwgbD1MX05VTEw7CitzdGF0aWMgaW50IHNwPTA7CitzdGF0aWMgY2hhcl91IHN0YWNrWzIwXSA9IHswfTsKK3N0YXRpYyBpbnQgbGFzdF9sID0gLTEsIGxhc3RfbGwgPSAtMTsKK3N0YXRpYyBpbnQgaGFuZ3VsX2tleWJvYXJkX3R5cGUgPSBIQU5HVUxfREVGQVVMVF9LRVlCT0FSRDsKKworc3RhdGljIHZvaWQgY29udmVydF9rc190b18zIF9fQVJHUygoY29uc3QgY2hhcl91ICpzcmMsIGludCAqZnAsIGludCAqbXAsIGludCAqbHApKTsKK3N0YXRpYyBpbnQgY29udmVydF8zX3RvX2tzIF9fQVJHUygoaW50IGZ2LCBpbnQgbXYsIGludCBsdiwgY2hhcl91ICpkZXMpKTsKK3N0YXRpYyBpbnQgaGFuZ3VsX2F1dG9tYXRhMiBfX0FSR1MoKGNoYXJfdSAqYnVmLCB1bnNpZ25lZCBpbnQgKmMpKTsKK3N0YXRpYyBpbnQgaGFuZ3VsX2F1dG9tYXRhMyBfX0FSR1MoKGNoYXJfdSAqYnVmLCB1bnNpZ25lZCBpbnQgKmMpKTsKKworI2RlZmluZSBwdXNoKHgpCSB7c3RhY2tbIHNwKysgXSA9ICooeCk7IHN0YWNrW3NwKytdID0gKigoeCkrMSk7fQorI2RlZmluZSBwb3AoeCkJIHsqKCh4KSArIDEpID0gc3RhY2tbLS1zcF07ICooeCkgPSBzdGFja1stLXNwXTt9CisjZGVmaW5lIHF1ZXJ5KHgpIHsqKCh4KSArIDEpID0gc3RhY2tbc3AgLSAxXTsgKih4KSA9IHN0YWNrW3NwIC0gMl07fQorCisjZGVmaW5lIGNvbnZlcnRfM190b19jb2RlIGNvbnZlcnRfM190b19rcworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKiAzILn6vcTA2sbHwLsgwKfH0SC358a+ICAoUm91dGluZXMgZm9yIDMgYnVsc2lrIGtleWJvYXJkKSAqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMyC5+r3Ev6G8rSDA2sbHILqvyK8gKDMgYnVsc2lrIGtleWJvYXJkIGNvbnZlcnNpb24pICovCisKK3N0YXRpYyBjaGFyX3UgdmFsdWVfdGFibGVfZm9yXzNbXSA9Cit7CisgICAgMjQgICwgJyInICwgJyMnICwgJyQnICwgJyUnICwgJyYnICwJLyogISAiICMgJCAlICYgKi8KKyAgICAxOCAgLCAnKCcgLCAnKScgLCAnKicgLCAnKycgLCAnLCcgLAkvKiAnICggKSAqICsgLCAqLworICAgICctJyAsICcuJyAsIDEzICAsIDE3ICAsIDI5ICAsIDIyICAsCS8qIC0gLiAvIDAgMSAyICovCisgICAgMTkgICwgMTkgICwgMjYgICwgNSAgICwgMTIgICwgMjggICwJLyogMyA0IDUgNiA3IDggKi8KKyAgICAyMCAgLCAnOicgLCA5ICAgLCAnMicgLCAnPScgLCAnMycgLAkvKiA5IDogOyA8ID0gPiAqLworICAgICc/JyAsICdAJyAsIDggICAsICchJyAsIDExICAsIDEwICAsCS8qID8gQCBBIEIgQyBEICovCisgICAgMjYgICwgMyAgICwgJy8nICwgMzkgICwgJzgnICwgJzQnICwJLyogRSBGIEcgSCBJIEogKi8KKyAgICAnNScgLCAnNicgLCAnMScgLCAnMCcgLCAnOScgLCAnPicgLAkvKiBLIEwgTSBOIE8gUCAqLworICAgIDI4ICAsIDYgICAsIDcgICAsICc7JyAsICc3JyAsIDE2ICAsCS8qIFEgUiBTIFQgVSBWICovCisgICAgMjcgICwgMjAgICwgJzwnICwgMjUgICwgJ1snICwgOTIgICwJLyogVyBYIFkgWiBbIFwgKi8KKyAgICAnXScgLCAnXicgLCAnXycgLCAnYCcgLCAyMyAgLCAyMCAgLAkvKiBdIF4gXyBgIGEgYiAqLworICAgIDEwICAsIDI5ICAsIDExICAsIDMgICAsIDI3ICAsIDQgICAsCS8qIGMgZCBlIGYgZyBoICovCisgICAgOCAgICwgMTMgICwgMiAgICwgMTQgICwgMjAgICwgMTEgICwJLyogaSBqIGsgbCBtIG4gKi8KKyAgICAxNiAgLCAxOSAgLCAyMSAgLCA0ICAgLCA1ICAgLCA3ICAgLAkvKiBvIHAgcSByIHMgdCAqLworICAgIDUgICAsIDEzICAsIDkgICAsIDIgICAsIDcgICAsIDE3ICAsCS8qIHUgdiB3IHggeSB6ICovCit9OworCitzdGF0aWMgc2hvcnRfdSBraW5kX3RhYmxlX2Zvcl8zW10gPQoreworICAgIEZfTCwgRl9BLCBGX0EsIEZfQSwgRl9BLCBGX0EsCS8qICEgIiAjICQgJSAmICovCisgICAgRl9GLCBGX0EsIEZfQSwgRl9BLCBGX0EsIEZfQSwJLyogJyAoICkgKiArICwgKi8KKyAgICBGX0EsIEZfQSwgRl9NLCBGX0YsIEZfTCwgRl9MLAkvKiAtIC4gLyAwIDEgMiAqLworICAgIEZfTCwgRl9NLCBGX00sIEZfTSwgRl9NLCBGX00sCS8qIDMgNCA1IDYgNyA4ICovCisgICAgRl9NLCBGX0EsIEZfRiwgRl9BLCBGX0EsIEZfQSwJLyogOSA6IDsgPCA9ID4gKi8KKyAgICBGX0EsIEZfQSwgRl9MLCBGX0EsIEZfTCwgRl9MLAkvKiA/IEAgQSBCIEMgRCAqLworICAgIEZfTCwgRl9MLCBGX0EsIEZfQSwgRl9BLCBGX0EsCS8qIEUgRiBHIEggSSBKICovCisgICAgRl9BLCBGX0EsIEZfQSwgRl9BLCBGX0EsIEZfQSwJLyogSyBMIE0gTiBPIFAgKi8KKyAgICBGX0wsIEZfTSwgRl9MLCBGX0EsIEZfQSwgRl9MLAkvKiBRIFIgUyBUIFUgViAqLworICAgIEZfTCwgRl9MLCBGX0EsIEZfTCwgRl9BLCBGX0EsCS8qIFcgWCBZIFogWyBcICovCisgICAgRl9BLCBGX0EsIEZfQSwgRl9BLCBGX0wsIEZfTSwJLyogXSBeIF8gYCBhIGIgKi8KKyAgICBGX00sIEZfTSwgRl9NLCBGX00sIEZfTSwgRl9GLAkvKiBjIGQgZSBmIGcgaCAqLworICAgIEZfRiwgRl9GLCBGX0YsIEZfRiwgRl9GLCBGX0YsCS8qIGkgaiBrIGwgbSBuICovCisgICAgRl9GLCBGX0YsIEZfTCwgRl9NLCBGX0wsIEZfTSwJLyogbyBwIHEgciBzIHQgKi8KKyAgICBGX0YsIEZfTSwgRl9MLCBGX0wsIEZfRiwgRl9MLAkvKiB1IHYgdyB4IHkgeiAqLworfTsKKworLyogMyC5+r3Ev6G8rSAox/bA58PKvLosIMDUt8K/tbmuKSAtPiC6ucfVw8q8uiDDs7iuCisgKiAzIGJ1bHNpazogKGN1cnJlbnQgaW5pdGlhbCBzb3VuZCwgaW5wdXQgZW5nbGlzaCkgLT4gY29tcG91bmQgaW5pdGlhbCBzb3VuZC4KKyAqLworCisgICAgc3RhdGljIGludAorY29tZmNvbjModiwgYykKKyAgICBpbnQJdjsKKyAgICBpbnQgYzsKK3sKKyAgICBpZiAodiA9PSAyICYmIGMgPT0gMikKKwlyZXR1cm4gMzsKKyAgICBpZiAodiA9PSA1ICYmIGMgPT0gNSkKKwlyZXR1cm4gNjsKKyAgICBpZiAodiA9PSA5ICYmIGMgPT0gOSkKKwlyZXR1cm4gMTA7CisgICAgaWYgKHYgPT0gMTEgJiYgYyA9PSAxMSkKKwlyZXR1cm4gMTI7CisgICAgaWYgKHYgPT0gMTQgJiYgYyA9PSAxNCkKKwlyZXR1cm4gMTU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIDMgufq9xL+hvK0gKMf2wOe48MC9LCDA1LfCIL+1ua4pIC0+ILq5x9UguPDAvSDDs7iuCisgKiAzIGJ1bHNpazogKGN1cnJlbnQgdm93ZWwsIGlucHV0IGVuZ2xpc2gpIC0+IGNvbXBvdW5kIHZvd2VsLgorICovCisKKyAgICBzdGF0aWMgaW50Citjb212b3czKHYsIGMpCisgICAgaW50IHY7CisgICAgaW50IGM7Cit7CisgICAgc3dpdGNoICh2KQorICAgIHsKKwljYXNlIDEzOgkJCQkJLyogpMcgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgMzoJCQkJCS8qIKTHpL8gKi8KKwkJICAgIHJldHVybiAxNDsKKwkJY2FzZSA0OgkJCQkJLyogpMekwCAqLworCQkgICAgcmV0dXJuIDE1OworCQljYXNlIDI5OgkJCQkvKiCkx6TTICovCisJCSAgICByZXR1cm4gMTg7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDIwOgkJCQkJLyogpMwgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgNzoJCQkJCS8qIKTMpMMgKi8KKwkJICAgIHJldHVybiAyMTsKKwkJY2FzZSAxMDoJCQkJLyogpMykxCAqLworCQkgICAgcmV0dXJuIDIyOworCQljYXNlIDI5OgkJCQkvKiCkzKTTICovCisJCSAgICByZXR1cm4gMjM7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLyogMyC5+r3EIMDaxsfAuiCk0aTTILChIMDWwLi5x7fOIC4uLiAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogMyC5+r3Ev6G8rSAox/bA5yC53sSnLCC/tbmuwNogwNS3wikgLT4gud7EpworICogMyBidWxzaWs6IChjdXJyZW50IHByb3AoPyksIGlucHV0IGVuZ2xpc2gpIC0+IHByb3AoPykuCisgKiBJIHdhbnQgdG8gc2F5LCB0aGUgJ3Byb3AnIGlzIHNpbWlsYXIgdG8gJ2ZpbmFsIGNvbnNvbmFudCcsIGJ1dCBub3Qgdm93ZWwuCisgKiAoSSBjYW5ub3QgZmluZCB0aGUgcmVhbCBlbmdsaXNoIGZyb20gbXkgZGljdGlvbmFyeS4gU29ycnkhKQorICogVklNOiBWID0gaW5pdGlhbCBzb3VuZCwgSSA9IG1lZGlhbCB2b3dlbCwgTSA9IGZpbmFsIGNvbnNvbmFudC4KKyAqLworCisgICAgc3RhdGljIGludAorY29tY29uMyhrLCBjKQorICAgIGludCBrOworICAgIGludCBjOworeworICAgIHN3aXRjaCAoaykKKyAgICB7CisJY2FzZSAyOgkJCQkJCS8qIKShICovCisJICAgIHN3aXRjaCAoYykgeworCQljYXNlIDI6CisJCSAgICByZXR1cm4gMzsJCQkJLyogpKGkoSAqLworCQljYXNlIDIxOgorCQkgICAgcmV0dXJuIDQ7CQkJCS8qIKShpLUgKi8KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgNToJCQkJCQkvKiCkpCAqLworCSAgICBzd2l0Y2ggKGMpIHsKKwkJY2FzZSAyNDoJCQkJLyogpKSkuCAqLworCQkgICAgcmV0dXJuIDY7CisJCWNhc2UgMjk6CisJCSAgICByZXR1cm4gNzsJCQkJLyogpKSkviAqLworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSA5OgkJCQkJCS8qIKSpICovCisJICAgIHN3aXRjaCAoYykgeworCQljYXNlIDI6CQkJCQkvKiCkqaShICovCisJCSAgICByZXR1cm4gMTA7CisJCWNhc2UgMTc6CQkJCS8qIKSppLEgKi8KKwkJICAgIHJldHVybiAxMTsKKwkJY2FzZSAxOToJCQkJLyogpKmksiAqLworCQkgICAgcmV0dXJuIDEyOworCQljYXNlIDIxOgkJCQkvKiCkqaS1ICovCisJCSAgICByZXR1cm4gMTM7CisJCWNhc2UgMjc6CQkJCS8qIKSppLwgKi8KKwkJICAgIHJldHVybiAxNDsKKwkJY2FzZSAyODoJCQkJLyogpKmkvSAqLworCQkgICAgcmV0dXJuIDE1OworCQljYXNlIDI5OgkJCQkvKiCkqaS+ICovCisJCSAgICByZXR1cm4gMTY7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDE5OgorCSAgICBzd2l0Y2ggKGMpIHsKKwkJY2FzZSAyMToJCQkJLyogpLKktSAqLworCQkgICAgcmV0dXJuIDIwOworCSAgICB9CisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqIDIgufq9xMDaxsfAuyDAp8fRILfnxr4gIChSb3V0aW5lcyBmb3IgMiBidWxzaWsga2V5Ym9hcmQpICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhdGljIGludAora2luZF90YWJsZV9mb3JfMihjKQorICAgIGludCBjOworeworICAgIHN0YXRpYyBjaGFyX3UgdGFibGVbXSA9CisgICAgeworICAgICAvKiBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzICovCisJMCwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwKKyAgICAgLyogdCwgdSwgdiwgdywgeCwgeSwgeiAqLworCTAsIDEsIDAsIDAsIDAsIDEsIDAKKyAgICB9OworCisgICAgaWYgKGMgPD0gJ1onKQorCWMgLT0gJ0EnOworICAgIGVsc2UKKwljIC09ICdhJzsKKworICAgIHJldHVybiB0YWJsZVtjXTsKK30KKworLyogMiC5+r3Ev6G8rSC/tbmuwNogLT4gwbbH1cf8IMPKvLoguq/IrworICogKDIgYnVsc2lrOiBjb252ZXJzaW9uIGVuZ2xpc2ggY2hhci4gdG8gaW5pdGlhbCBzb3VuZCBvZiBjb21wb3VuZCB0eXBlKQorICogsOGw+jogw8q8usDMIL7GtM+46SAwIChJZiBpdCBpcyBub3QgaW5pdGlhbCBzb3VuZCwgcmV0dXJuIDApLgorICovCisgICAgc3RhdGljIGludAorZmNvbihjKQorICAgIGludCBjOworeworICAgIHN0YXRpYyBjaGFyX3UgdGFibGVbXSA9CisgICAgeworCS8qRSAqLyA2ICwgLypGICovIDAgLCAvKkcgKi8gMCAsIC8qSCAqLyAwICwgLypJICovIDAgLCAvKkogKi8gMCAsIC8qSyAqLyAwICwKKwkvKkwgKi8gMCAsIC8qTSAqLyAwICwgLypOICovIDAgLCAvKk8gKi8gMCAsIC8qUCAqLyAwICwgLypRICovIDEwLCAvKlIgKi8gMyAsCisJLypTICovIDAgLCAvKlQgKi8gMTIsIC8qVSAqLyAwICwgLypWICovIDAgLCAvKlcgKi8gMTUsIC8qWCAqLyAwICwgLypZICovIDAgLAorCS8qWiAqLyAwICwgLypbICovIDAgLCAvKlwgKi8gMCAsIC8qXSAqLyAwICwgLypeICovIDAgLCAvKl8gKi8gMCAsIC8qYCAqLyAwICwKKwkvKmEgKi8gOCAsIC8qYiAqLyAwICwgLypjICovIDE2LCAvKmQgKi8gMTMsIC8qZSAqLyA1ICwgLypmICovIDcgLCAvKmcgKi8gMjAsCisJLypoICovIDAgLCAvKmkgKi8gMCAsIC8qaiAqLyAwICwgLyprICovIDAgLCAvKmwgKi8gMCAsIC8qbSAqLyAwICwgLypuICovIDAgLAorCS8qbyAqLyAwICwgLypwICovIDAgLCAvKnEgKi8gOSAsIC8qciAqLyAyICwgLypzICovIDQgLCAvKnQgKi8gMTEsIC8qdSAqLyAwICwKKwkvKnYgKi8gMTksIC8qdyAqLyAxNCwgLyp4ICovIDE4LCAvKnkgKi8gMCAsIC8qeiAqLyAxNworICAgIH07CisKKyAgICBpZiAoYyA8ICdFJyB8fCBjID4gJ3onKQorCXJldHVybiAwOworICAgIHJldHVybiB0YWJsZVtjIC0gJ0UnXTsKK30KKworLyogMiC5+r3Ev6G8rSC/tbmuwNogLT4gwd+8uiC6r8ivCisgKiAoMiBidWxzaWs6IGNvbnZlcnNpb24gZW5nbGlzaCBjaGFyLiB0byBtZWRpYWwgdm93ZWwpCisgKiCw4bD6OiDB37y6wMwgvsa0z7jpIDAgKElmIGl0IGlzIG5vdCBtZWRpYWwgdm93ZWwsIHJldHVybiAwKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3ZvdyhjKQorICAgIGludCBjOworeworICAgIHN0YXRpYyBjaGFyX3UgdGFibGVbXSA9CisgICAgeworCS8qTyAqLyA2ICwgLypQICovIDEyLCAvKlEgKi8gMCAsIC8qUiAqLyAwICwgLypTICovIDAgLCAvKlQgKi8gMCAsIC8qVSAqLyAwICwKKwkvKlYgKi8gMCAsIC8qVyAqLyAwICwgLypYICovIDAgLCAvKlkgKi8gMCAsIC8qWiAqLyAwICwgLypbICovIDAgLCAvKlwgKi8gMCAsCisJLypdICovIDAgLCAvKl4gKi8gMCAsIC8qXyAqLyAwICwgLypgICovIDAgLCAvKmEgKi8gMCAsIC8qYiAqLyAyNiwgLypjICovIDAgLAorCS8qZCAqLyAwICwgLyplICovIDAgLCAvKmYgKi8gMCAsIC8qZyAqLyAwICwgLypoICovIDEzLCAvKmkgKi8gNSAsIC8qaiAqLyA3ICwKKwkvKmsgKi8gMyAsIC8qbCAqLyAyOSwgLyptICovIDI3LCAvKm4gKi8gMjAsIC8qbyAqLyA0ICwgLypwICovIDEwLCAvKnEgKi8gMCAsCisJLypyICovIDAgLCAvKnMgKi8gMCAsIC8qdCAqLyAwICwgLyp1ICovIDExLCAvKnYgKi8gMCAsIC8qdyAqLyAwICwgLyp4ICovIDAgLAorCS8qeSAqLyAxOX07CisKKyAgICBpZiAoYyA8ICdPJyB8fCBjID4gJ3knKQorCXJldHVybiAwOworICAgIHJldHVybiB0YWJsZVtjIC0gJ08nXTsKK30KKworLyogMrn6vcS/obytIL+1ua7A2iAtPiC53sSnILqvyK8KKyAqICgyIGJ1bHNpazogY29udmVyc2lvbiBlbmdsaXNoIGNoYXIuIHRvIHByb3ApCisgKiCw4bD6OiC53sSnwMwgvsa0z7jpIDAgKElmIG5vdCBwcm9wLCByZXR1cm4gMCkKKyAqLworICAgIHN0YXRpYyBpbnQKK2xjb24oYykKKyAgICBpbnQgYzsKK3sKKyAgICBzdGF0aWMgY2hhcl91IHRhYmxlW10gPQorICAgIHsKKwkvKlIgKi8gMyAsIC8qUyAqLyAwICwgLypUICovIDIyLCAvKlUgKi8gMCAsIC8qViAqLyAwICwgLypXICovIDAgLCAvKlggKi8gMCAsCisJLypZICovIDAgLCAvKlogKi8gMCAsIC8qWyAqLyAwICwgLypcICovIDAgLCAvKl0gKi8gMCAsIC8qXiAqLyAwICwgLypfICovIDAgLAorCS8qYCAqLyAwICwgLyphICovIDE3LCAvKmIgKi8gMCAsIC8qYyAqLyAyNSwgLypkICovIDIzLCAvKmUgKi8gOCAsIC8qZiAqLyA5ICwKKwkvKmcgKi8gMjksIC8qaCAqLyAwICwgLyppICovIDAgLCAvKmogKi8gMCAsIC8qayAqLyAwICwgLypsICovIDAgLCAvKm0gKi8gMCAsCisJLypuICovIDAgLCAvKm8gKi8gMCAsIC8qcCAqLyAwICwgLypxICovIDE5LCAvKnIgKi8gMiAsIC8qcyAqLyA1ICwgLyp0ICovIDIxLAorCS8qdSAqLyAwICwgLyp2ICovIDI4LCAvKncgKi8gMjQsIC8qeCAqLyAyNywgLyp5ICovIDAgLCAvKnogKi8gMjYKKyAgICB9OworCisgICAgaWYgKGMgPCAnUicgfHwgYyA+ICd6JykKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gdGFibGVbYyAtICdSJ107Cit9CisKKy8qIDIgufq9xL+hvK0gKMf2wOcgud7Epywgv7W5rsDaIMDUt8IpIC0+ILnexKcguq/IrworICogKDIgYnVsc2lrOiBjb252ZXJzaW9uIChjdXJyLiBwcm9wLCBpbnB1dCBlbmdsaXNoKSB0byBwcm9wKQorICovCisKKyAgICBzdGF0aWMgaW50Citjb21jb24yKGssIGMpCisgICAgaW50IGs7CisgICAgaW50IGM7Cit7CisgICAgc3dpdGNoIChrKQorICAgIHsKKwljYXNlIDI6CQkJCQkvKiCkoSAqLworCSAgICBzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndCc6CisJCSAgICByZXR1cm4gNDsJCQkvKiCkoaS1ICovCisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDU6CQkJCQkvKiCkpCAqLworCSAgICBzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndyc6CQkJLyogpKSkuCAqLworCQkgICAgcmV0dXJuIDY7CisJCWNhc2UgJ2cnOgkJCS8qIKSkpL4gKi8KKwkJICAgIHJldHVybiA3OworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSA5OgkJCQkJLyogpKkgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgJ3InOgkJCS8qIKSppKEgKi8KKwkJICAgIHJldHVybiAxMDsKKwkJY2FzZSAnYSc6CQkJLyogpKmksSAqLworCQkgICAgcmV0dXJuIDExOworCQljYXNlICdxJzoJCQkvKiCkqaSyICovCisJCSAgICByZXR1cm4gMTI7CisJCWNhc2UgJ3QnOgkJCS8qIKSppLUgKi8KKwkJICAgIHJldHVybiAxMzsKKwkJY2FzZSAneCc6CQkJLyogpKmkvCAqLworCQkgICAgcmV0dXJuIDE0OworCQljYXNlICd2JzoJCQkvKiCkqaS9ICovCisJCSAgICByZXR1cm4gMTU7CisJCWNhc2UgJ2cnOgkJCS8qIKSppL4gKi8KKwkJICAgIHJldHVybiAxNjsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgMTk6CQkJCS8qIKSyICovCisJICAgIHN3aXRjaCAoYykgeworCQljYXNlICd0JzoJCQkvKiCksqS1ICovCisJCSAgICByZXR1cm4gMjA7CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAyufq9xL+hvK0gKMf2wOcgwd+8uiwgv7W5riDA1LfCKSAtPiDB37y6ILqvyK8KKyAqICgyIGJ1bHNpazogY29udmVyc2lvbiAoY3Vyci4gbWVkaWFsIHZvd2VsLCBpbnB1dCBlbmdsaXNoKSB0byBtZWRpYWwKKyAqIHZvd2VsKQorICovCisKKyAgICBzdGF0aWMgaW50Citjb212b3cyKHYsIGMpCisgICAgaW50IHY7CisgICAgaW50IGM7Cit7CisgICAgc3dpdGNoICh2KQorICAgIHsKKwljYXNlIDEzOgkJCQkJLyogpMcgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgJ2snOgkJCQkvKiCkx6S/ICovCisJCSAgICByZXR1cm4gMTQ7CisJCWNhc2UgJ28nOgkJCQkvKiCkx6TAICovCisJCSAgICByZXR1cm4gMTU7CisJCWNhc2UgJ2wnOgkJCQkvKiCkx6TTICovCisJCSAgICByZXR1cm4gMTg7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDIwOgkJCQkJLyogpMwgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgJ2onOgkJCQkvKiCkzKTDICovCisJCSAgICByZXR1cm4gMjE7CisJCWNhc2UgJ3AnOgkJCQkvKiCkzKTEICovCisJCSAgICByZXR1cm4gMjI7CisJCWNhc2UgJ2wnOgkJCQkvKiCkzKTTICovCisJCSAgICByZXR1cm4gMjM7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDI3OgkJCQkJLyogpNEgKi8KKwkgICAgc3dpdGNoIChjKSB7CisJCWNhc2UgJ2wnOgkJCQkvKiCk0aTTICovCisJCSAgICByZXR1cm4gMjg7CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisgICAgaW50CitoYW5ndWxfaW5wdXRfc3RhdGVfZ2V0KCkKK3sKKyAgICByZXR1cm4gaGFuZ3VsX2lucHV0X3N0YXRlOworfQorCisgICAgdm9pZAoraGFuZ3VsX2lucHV0X3N0YXRlX3NldChzdGF0ZSkKKyAgICBpbnQgc3RhdGU7Cit7CisgICAgaGFuZ3VsX2lucHV0X3N0YXRlID0gc3RhdGU7CisgICAgaGFuZ3VsX2lucHV0X2NsZWFyKCk7Cit9CisKKyAgICBpbnQKK2ltX2dldF9zdGF0dXMoKQoreworICAgIHJldHVybiBoYW5ndWxfaW5wdXRfc3RhdGVfZ2V0KCk7Cit9CisKKyAgICB2b2lkCitoYW5ndWxfaW5wdXRfc3RhdGVfdG9nZ2xlKCkKK3sKKyAgICBpZiAoaGFuZ3VsX2lucHV0X3N0YXRlX2dldCgpKQorICAgIHsKKwloYW5ndWxfaW5wdXRfc3RhdGVfc2V0KDApOworCWlmIChjb21wb3NpbmdfaGFuZ3VsKQorCXsKKwkgICAgcHVzaF9yYXdfa2V5KGNvbXBvc2luZ19oYW5ndWxfYnVmZmVyLCAyKTsKKwkgICAgY29tcG9zaW5nX2hhbmd1bCA9IDA7CisJfQorICAgIH0KKyAgICBlbHNlCisJaGFuZ3VsX2lucHV0X3N0YXRlX3NldCgxKTsKKworICAgIGlmIChzaG93bW9kZSgpKQorICAgIHsKKwlzZXRjdXJzb3IoKTsKKwlvdXRfZmx1c2goKTsKKyAgICB9CisKKyAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7Cit9CisKKyAgICBzdGF0aWMgaW50CitoYW5ndWxfYXV0b21hdGEyKGJ1ZiwgYykKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50X3UgICAqYzsKK3sKKyAgICBpbnQgdCx0MjsKKworICAgIGlmICgqYyA9PSBCUykKKyAgICB7CisJaWYgKHNwID09IDApCisJICAgIHJldHVybiBBVVRPTUFUQV9TUEVDSUFMOworCWVsc2UgaWYgKHNwIDwgNCkKKwl7CisJICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworCSAgICByZXR1cm4gQVVUT01BVEFfTlVMTDsKKwl9CisJcG9wKGJ1Zik7CisJcXVlcnkoYnVmKTsKKwljb252ZXJ0X2tzX3RvXzMoYnVmLCAmZiwgJm0sICZsKTsKKwlsYXN0X2wgPSBsYXN0X2xsOworCWxhc3RfbGwgPSAtMTsKKwlyZXR1cm4gQVVUT01BVEFfQ09SUkVDVDsKKyAgICB9CisgICAgaWYgKCghKCpjID49ICdBJyAmJiAqYyA8PSAnWicpKSAmJiAoISgqYyA+PSAnYScgJiYgKmMgPD0gJ3onKSkpCisgICAgeworCWhhbmd1bF9pbnB1dF9jbGVhcigpOworCXJldHVybiBBVVRPTUFUQV9TUEVDSUFMOworICAgIH0KKyAgICB0ID0gKmM7CisgICAgc3dpdGNoIChraW5kX3RhYmxlX2Zvcl8yKHQpKQorICAgIHsKKwljYXNlIDA6IC8qIMDawL0gKGNvbnNvbmFudCkgKi8KKwkgICAgaWYgKGYgPT0gRl9OVUxMKQorCSAgICB7CisJCWlmIChtICE9IE1fTlVMTCkKKwkJICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworCQlmID0gZmNvbih0KTsKKwkJY29udmVydF8zX3RvX2NvZGUoZiwgTV9OVUxMLCBMX05VTEwsIGJ1Zik7CisJCXB1c2goYnVmKTsKKwkJbGFzdF9sbCA9IGxhc3RfbCA9IC0xOworCQlyZXR1cm4gQVVUT01BVEFfTkVXOworCSAgICB9CisJICAgIGlmIChtID09IE1fTlVMTCkKKwkJcmV0dXJuIEFVVE9NQVRBX0VSUk9SOworCSAgICBpZiAobCA9PSBMX05VTEwpCisJICAgIHsKKwkJdDIgPSBsY29uKHQpOworCQlpZiAoIXQyKSAgICAvKiC53sSnwLi3ziDA+8fVx8/B9r7KtNkgKGNhbm5vdCB1c2UgaXQgYXMgYSBwcm9wKSAqLworCQl7CisJCSAgICBoYW5ndWxfaW5wdXRfY2xlYXIoKTsKKwkJICAgIGxhc3RfbGwgPSBsYXN0X2wgPSAtMTsKKwkJICAgIGYgPSBmY29uKHQpOworCQkgICAgY29udmVydF8zX3RvX2NvZGUoZiwgbSwgbCwgYnVmKTsKKwkJICAgIHB1c2goYnVmKTsKKwkJICAgIHJldHVybiBBVVRPTUFUQV9ORVc7CisJCX0KKwkJaWYgKDIgPT0gY29udmVydF8zX3RvX2NvZGUoZiwgbSwgdDIsIGJ1ZikpCisJCXsKKwkJICAgIGxhc3RfbGwgPSAtMTsKKwkJICAgIGxhc3RfbCA9IHQ7CisJCSAgICBsID0gdDI7CisJCSAgICBwdXNoKGJ1Zik7CisJCSAgICByZXR1cm4gQVVUT01BVEFfQ09SUkVDVDsKKwkJfQorCQllbHNlCS8qILnexKfAuLfOIL6yt8HHz7+0wLizqiBjb2Rlv6Egvvi0wiCx28DawMy02SAqLworCQl7CS8qIGNhbm5vdCBmaW5kIHN1Y2ggYSBwcm9wIGluIHRoZSBjb2RlIHRhYmxlICovCisJCSAgICBsYXN0X2xsID0gbGFzdF9sID0gLTE7CisJCSAgICBoYW5ndWxfaW5wdXRfY2xlYXIoKTsKKwkJICAgIGYgPSBmY29uKHQpOworCQkgICAgY29udmVydF8zX3RvX2NvZGUoZiwgbSwgbCwgYnVmKTsKKwkJICAgIHB1c2goYnVmKTsKKwkJICAgIHJldHVybiBBVVRPTUFUQV9ORVc7CisJCX0KKwkgICAgfQorCSAgICAvKiDDyiDB3yDBvry6wMwguPC1ziCwrsPfvu7BriDA1rTZCisJICAgICAqIEkgaGF2ZSBhbGwgdGhlICdpbml0aWFsIHNvdW5kJyBhbmQgJ21lZGlhbCB2b3dlbCcgYW5kICdmaW5hbAorCSAgICAgKiBjb25zb25hbnQnLgorCSAgICAgKi8KKwkgICAgdDIgPSBjb21jb24yKGwsIHQpOworCSAgICBpZiAodDIpCisJICAgIHsKKwkJaWYgKDIgPT0gY29udmVydF8zX3RvX2NvZGUoZiwgbSwgdDIsIGJ1ZikpCisJCXsKKwkJICAgIGwgPSB0MjsKKwkJICAgIGxhc3RfbGwgPSBsYXN0X2w7CisJCSAgICBsYXN0X2wgPSB0OworCQkgICAgcHVzaChidWYpOworCQkgICAgcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1Q7CisJCX0KKwkgICAgfQorCSAgICBsYXN0X2xsID0gbGFzdF9sID0gLTE7CisJICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworCSAgICBmID0gZmNvbih0KTsKKwkgICAgY29udmVydF8zX3RvX2NvZGUoZiwgbSwgbCwgYnVmKTsKKwkgICAgcHVzaChidWYpOworCSAgICByZXR1cm4gQVVUT01BVEFfTkVXOworCisJY2FzZSAxOgorCSAgICBpZiAoZiA9PSBGX05VTEwpCisJICAgIHsKKwkJaGFuZ3VsX2lucHV0X2NsZWFyKCk7CisJCW0gPSB2b3codCk7CisJCWNvbnZlcnRfM190b19jb2RlIChmLCBtLCBMX05VTEwsIGJ1Zik7CisJCXB1c2ggKGJ1Zik7CisJCWxhc3RfbGwgPSBsYXN0X2wgPSAtMTsKKwkJcmV0dXJuIEFVVE9NQVRBX05FVzsKKwkgICAgfQorCSAgICBpZiAobSA9PSBNX05VTEwpCisJICAgIHsKKwkJbSA9IHZvdyh0KTsKKwkJaWYgKDIgPT0gY29udmVydF8zX3RvX2NvZGUoZiwgbSwgTF9OVUxMLCBidWYpKQorCQl7CisJCSAgICBsYXN0X2xsID0gbGFzdF9sID0gLTE7CisJCSAgICBwdXNoKGJ1Zik7CisJCSAgICByZXR1cm4gQVVUT01BVEFfQ09SUkVDVDsKKwkJfQorCQltID0gTV9OVUxMOworCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CisJICAgIH0KKwkgICAgaWYgKGwgPT0gTF9OVUxMKQorCSAgICB7CisJCXQyID0gY29tdm93MihtLCB0KTsKKwkJaWYgKHQyKQorCQl7CisJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCB0MiwgTF9OVUxMLCBidWYpKQorCQkJcmV0dXJuIEFVVE9NQVRBX0VSUk9SOworCisJCSAgICBtID0gdDI7CisJCSAgICBwdXNoKGJ1Zik7CisJCSAgICBsYXN0X2xsID0gbGFzdF9sID0gLTE7CisJCSAgICByZXR1cm4gQVVUT01BVEFfQ09SUkVDVDsKKwkJfQorCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CisJICAgIH0KKwkgICAgcG9wKGJ1Zik7CisJICAgIHBvcChidWYpOworCSAgICBzcCA9IDA7CisJICAgIGlmIChsYXN0X2wgPT0gLTEpCisJICAgIHsKKwkJLyogwL0uLi4gwMyw1CDHyr/kx8+zqj8/IChIbW0uLi4gSXMgaXQgbmVlZGVkPykgKi8KKwkJY29udmVydF9rc190b18zKGJ1ZiwgJmYsICZtLCAmbCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWNoYXJfdSB0bXBbM107CisJCWYgPSBmY29uKGxhc3RfbCk7CisJCWNvbnZlcnRfM190b19jb2RlIChmLCBNX05VTEwsIExfTlVMTCwgdG1wKTsKKwkJcHVzaCAodG1wKTsKKwkgICAgfQorCSAgICBtID0gdm93KHQpOworCSAgICBsID0gTF9OVUxMOworCSAgICBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCBsLCBidWYgKyAyKTsKKwkgICAgcHVzaChidWYgKyAyKTsKKwkgICAgcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1RfTkVXOworCisJZGVmYXVsdDoKKwkgICAgRU1TRyhfKCJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiKSk7CisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQVVUT01BVEFfRVJST1I7IC8qIFJyRWVBYUxsTGxZeSBFZVJyUnJPb1JyICovCit9CisKKyAgICBzdGF0aWMgaW50CitoYW5ndWxfYXV0b21hdGEzKGJ1ZiwgYykKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50X3UgICAqYzsKK3sKKyAgICBpbnQgdCwgdDI7CisKKyAgICBpZiAoKmMgPj0gJyEnICYmICpjIDw9ICd6JykKKyAgICB7CisJKmMgLT0gJyEnOworCXQgPSB2YWx1ZV90YWJsZV9mb3JfM1sqY107CisJc3dpdGNoIChraW5kX3RhYmxlX2Zvcl8zWypjXSkKKwl7CisJICAgIGNhc2UgRl9GOiAvKiDDyry6ua7A2iAoY2hhci4gb2YgYW4gaW5pdGlhbCBzb3VuZCkgKi8KKwkJaWYgKG0gIT0gTV9OVUxMIHx8IHNwID09IDApCisJCXsKKwkJICAgIC8qIMPKvLrAzCC68b76sMWzqiC02cC9ILHbwNoguPDAuLHiIL3DwNsKKwkJICAgICAqIEVtcHR5ICdpbml0aWFsIHNvdW5kJywgc28gc3RhcnRpbmcgYXV0b21hdGEuCisJCSAgICAgKi8KKwkJICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworCQkgICAgZiA9IHQ7CisJCSAgICBjb252ZXJ0XzNfdG9fY29kZShmLCBNX05VTEwsIExfTlVMTCwgYnVmKTsKKwkJICAgIHB1c2goYnVmKTsKKwkJICAgIHJldHVybiBBVVRPTUFUQV9ORVc7CisJCX0KKwkJaWYgKCh0MiA9IGNvbWZjb24zKGYsdCkpICE9IDApCS8qILq5wNrAvSAoZG91YmxlPyBjb25zb25hbnQpICovCisJCXsKKwkJICAgIGY9dDI7CisJCSAgICBjb252ZXJ0XzNfdG9fY29kZShmLCBNX05VTEwsIExfTlVMTCwgYnVmKTsKKwkJICAgIHB1c2goYnVmKTsKKwkJICAgIHJldHVybiBBVVRPTUFUQV9DT1JSRUNUOworCQl9CisJCXJldHVybiBBVVRPTUFUQV9FUlJPUjsKKworCSAgICBjYXNlIEZfTToJLyoguPDAvSAodm93ZWwpICovCisJCWlmIChtID09IE1fTlVMTCkKKwkJeworCQkgICAgaWYgKDIgIT0gY29udmVydF8zX3RvX2NvZGUoZiwgdCwgTF9OVUxMLGJ1ZikpCisJCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CisKKwkJICAgIG0gPSB0OworCQkgICAgcHVzaChidWYpOworCQkgICAgaWYgKGYgPT0gRl9OVUxMKQorCQkJcmV0dXJuIEFVVE9NQVRBX05FVzsKKwkJICAgIGVsc2UKKwkJCXJldHVybiBBVVRPTUFUQV9DT1JSRUNUOworCQl9CisJCWlmICgodDIgPSBjb212b3czKG0sdCkpKSAgICAvKiC6ubjwwL0gKGEgZGlwaHRob25nKSAqLworCQl7CisJCSAgICBtID0gdDI7CisJCSAgICBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCBMX05VTEwsIGJ1Zik7CisJCSAgICBwdXNoKGJ1Zik7CisJCSAgICByZXR1cm4gQVVUT01BVEFfQ09SUkVDVDsKKwkJfQorCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CisKKwkgICAgY2FzZSBGX0w6CS8qILnexKcgKHByb3A/KSAqLworCQlpZiAobSA9PSBNX05VTEwpCisJCSAgICByZXR1cm4gQVVUT01BVEFfRVJST1I7IC8qIMHfvLq++LTCIMG+vLogKi8KKwkJaWYgKGwgPT0gTF9OVUxMKQorCQl7CisJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCB0LCBidWYpKQorCQkgICAgeworCQkJbCA9IExfTlVMTDsKKwkJCXJldHVybiBBVVRPTUFUQV9FUlJPUjsKKwkJICAgIH0KKwkJICAgIHB1c2goYnVmKTsKKwkJICAgIGwgPSB0OworCQkgICAgcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1Q7CisJCX0KKwkJaWYgKCh0MiA9IGNvbWNvbjMobCx0KSkgIT0gMCkJLyogurkgud7EpyA/PyAoZG91YmxlIHByb3A/KSAqLworCQl7CisJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCB0MiwgYnVmKSkKKwkJCXJldHVybiBBVVRPTUFUQV9FUlJPUjsKKworCQkgICAgcHVzaChidWYpOworCQkgICAgbCA9IHQyOworCQkgICAgcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1Q7CisJCX0KKwkJcmV0dXJuIEFVVE9NQVRBX0VSUk9SOworCisJICAgIGNhc2UgRl9BOiAvKiDGr7z2ua7A2rOqILz9wNogKHNwZWNpYWwgY2hhci4gb3IgbnVtYmVyKSAqLworCQloYW5ndWxfaW5wdXRfY2xlYXIoKTsKKwkJKmMgPSB0OworCQlyZXR1cm4gQVVUT01BVEFfU1BFQ0lBTDsKKwl9CisgICAgfQorICAgIGlmICgqYyA9PSBCUykKKyAgICB7CisJaWYgKHNwID49IDQpCisJeworCSAgICBwb3AoYnVmKTsKKwkgICAgcG9wKGJ1Zik7CisJICAgIGNvbnZlcnRfa3NfdG9fMyhidWYsICZmLCAmbSwgJmwpOworCSAgICBwdXNoKGJ1Zik7CisJICAgIHJldHVybiBBVVRPTUFUQV9DT1JSRUNUOworCX0KKwllbHNlIGlmIChzcCA9PSAwKQorCXsKKwkgICAgcmV0dXJuIEFVVE9NQVRBX1NQRUNJQUw7CisJfQorCWVsc2UKKwl7CisJICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworCSAgICByZXR1cm4gQVVUT01BVEFfTlVMTDsKKwl9CisgICAgfQorICAgIGhhbmd1bF9pbnB1dF9jbGVhcigpOworICAgIHJldHVybiBBVVRPTUFUQV9TUEVDSUFMOworfQorCisgICAgdm9pZAoraGFuZ3VsX2tleWJvYXJkX3NldCgpCit7CisgICAgaW50CSAgICBrZXlib2FyZDsKKyAgICBjaGFyICAgICpzOworCisgICAgaGFuZ3VsX2lucHV0X2NsZWFyKCk7CisKKyAgICBpZiAoKHMgPSBnZXRlbnYoIlZJTV9LRVlCT0FSRCIpKSA9PSBOVUxMKQorCXMgPSBnZXRlbnYoIkhBTkdVTF9LRVlCT0FSRF9UWVBFIik7CisKKyAgICBpZiAocykKKyAgICB7CisJaWYgKCpzID09ICcyJykKKwkgICAga2V5Ym9hcmQgPSAyOworCWVsc2UKKwkgICAga2V5Ym9hcmQgPSAzOworCWhhbmd1bF9rZXlib2FyZF90eXBlID0ga2V5Ym9hcmQ7CisgICAgfQorfQorCisgICAgaW50CitoYW5ndWxfaW5wdXRfcHJvY2VzcyhzLCBsZW4pCisgICAgY2hhcl91ICAqczsKKyAgICBpbnQJICAgIGxlbjsKK3sKKyAgICBpbnQgbjsKKyAgICB1bnNpZ25lZCBpbnQgYzsKKyAgICBjaGFyX3UgaGFuYnVmWzIwXTsKKworICAgIGlmIChsZW4gPT0gMSkKKwkvKiBub3JtYWwga2V5IHByZXNzICovCisJYyA9ICpzOworICAgIGVsc2UgaWYgKGxlbiA9PSAzICYmIHNbMF0gPT0gQ1NJICYmIHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ2InKQorICAgIHsKKwkvKiBiYWNrc3BhY2UgKi8KKwlpZiAoY29tcG9zaW5nX2hhbmd1bCkKKwkgICAgYyA9IEN0cmxfSDsKKwllbHNlCisJICAgIHJldHVybiBsZW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGNvbXBvc2luZ19oYW5ndWwpCisJICAgIHB1c2hfcmF3X2tleShjb21wb3NpbmdfaGFuZ3VsX2J1ZmZlciwgMik7CisJaGFuZ3VsX2lucHV0X2NsZWFyKCk7CisJY29tcG9zaW5nX2hhbmd1bCA9IDA7CisJcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBpZiAoaGFuZ3VsX2tleWJvYXJkX3R5cGUgPT0gMikKKwluID0gaGFuZ3VsX2F1dG9tYXRhMihoYW5idWYsICZjKTsKKyAgICBlbHNlCisJbiA9IGhhbmd1bF9hdXRvbWF0YTMoaGFuYnVmLCAmYyk7CisKKyAgICBpZiAobiA9PSBBVVRPTUFUQV9DT1JSRUNUKQorICAgIHsKKwlTVFJOQ1BZKGNvbXBvc2luZ19oYW5ndWxfYnVmZmVyLCBoYW5idWYsIDIpOworCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAobiA9PSBBVVRPTUFUQV9ORVcpCisgICAgeworCWlmIChjb21wb3NpbmdfaGFuZ3VsKQorCSAgICBwdXNoX3Jhd19rZXkoY29tcG9zaW5nX2hhbmd1bF9idWZmZXIsIDIpOworCVNUUk5DUFkoY29tcG9zaW5nX2hhbmd1bF9idWZmZXIsIGhhbmJ1ZiwgMik7CisJY29tcG9zaW5nX2hhbmd1bCA9IDE7CisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChuID09IEFVVE9NQVRBX0NPUlJFQ1RfTkVXKQorICAgIHsKKwlpZiAoY29tcG9zaW5nX2hhbmd1bCkKKwkgICAgcHVzaF9yYXdfa2V5KGhhbmJ1ZiwgMik7CisJU1RSTkNQWShjb21wb3NpbmdfaGFuZ3VsX2J1ZmZlciwgaGFuYnVmKzIsIDIpOworCWNvbXBvc2luZ19oYW5ndWwgPSAxOworCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAobiA9PSBBVVRPTUFUQV9OVUxMKQorICAgIHsKKwljb21wb3NpbmdfaGFuZ3VsID0gMDsKKwlndWlfcmVkcmF3X2Jsb2NrKGd1aS5jdXJzb3Jfcm93LCBndWkuY3Vyc29yX2NvbCwKKwkJCSBndWkuY3Vyc29yX3JvdywgZ3VpLmN1cnNvcl9jb2wgKyAxLAorCQkJIEdVSV9NT05fTk9DTEVBUik7CisJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChuID09IEFVVE9NQVRBX1NQRUNJQUwpCisgICAgeworCWlmIChjb21wb3NpbmdfaGFuZ3VsKQorCXsKKwkgICAgcHVzaF9yYXdfa2V5KGNvbXBvc2luZ19oYW5ndWxfYnVmZmVyLCAyKTsKKwkgICAgY29tcG9zaW5nX2hhbmd1bCA9IDA7CisJfQorCSpzID0gYzsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA9PSBBVVRPTUFUQV9FUlJPUikKKyAgICB7CisJdmltX2JlZXAoKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworICAgIHZvaWQKK2hhbmd1bF9pbnB1dF9jbGVhcigpCit7CisgICAgc3AgPSAwOworICAgIGYgPSBGX05VTEw7CisgICAgbSA9IE1fTlVMTDsKKyAgICBsID0gTF9OVUxMOworfQorCisjZGVmaW5lIGhhbl9pbmRleChoLCBsKQkoKChoKS0weGIwKSooMHhmZi0weGExKSsoKGwpLTB4YTEpKQorCitzdGF0aWMgY29uc3QgY2hhcl91IGtzX3RhYmxlMVtdWzNdID0KK3sKKyAgICB7ICAyLCAgMywgIDF9LCB7ICAyLCAgMywgIDJ9LCB7ICAyLCAgMywgIDV9LCB7ICAyLCAgMywgIDh9LAorICAgIHsgIDIsICAzLCAgOX0sIHsgIDIsICAzLCAxMH0sIHsgIDIsICAzLCAxMX0sIHsgIDIsICAzLCAxN30sCisgICAgeyAgMiwgIDMsIDE5fSwgeyAgMiwgIDMsIDIwfSwgeyAgMiwgIDMsIDIxfSwgeyAgMiwgIDMsIDIyfSwKKyAgICB7ICAyLCAgMywgMjN9LCB7ICAyLCAgMywgMjR9LCB7ICAyLCAgMywgMjV9LCB7ICAyLCAgMywgMjd9LAorICAgIHsgIDIsICAzLCAyOH0sIHsgIDIsICAzLCAyOX0sIHsgIDIsICA0LCAgMX0sIHsgIDIsICA0LCAgMn0sCisgICAgeyAgMiwgIDQsICA1fSwgeyAgMiwgIDQsICA5fSwgeyAgMiwgIDQsIDE3fSwgeyAgMiwgIDQsIDE5fSwKKyAgICB7ICAyLCAgNCwgMjF9LCB7ICAyLCAgNCwgMjJ9LCB7ICAyLCAgNCwgMjN9LCB7ICAyLCAgNSwgIDF9LAorICAgIHsgIDIsICA1LCAgMn0sIHsgIDIsICA1LCAgNX0sIHsgIDIsICA1LCAgOX0sIHsgIDIsICA1LCAyMX0sCisgICAgeyAgMiwgIDUsIDIzfSwgeyAgMiwgIDYsICAxfSwgeyAgMiwgIDYsICA1fSwgeyAgMiwgIDYsICA5fSwKKyAgICB7ICAyLCAgNywgIDF9LCB7ICAyLCAgNywgIDJ9LCB7ICAyLCAgNywgIDV9LCB7ICAyLCAgNywgIDh9LAorICAgIHsgIDIsICA3LCAgOX0sIHsgIDIsICA3LCAxMX0sIHsgIDIsICA3LCAxN30sIHsgIDIsICA3LCAxOX0sCisgICAgeyAgMiwgIDcsIDIxfSwgeyAgMiwgIDcsIDIyfSwgeyAgMiwgIDcsIDIzfSwgeyAgMiwgIDcsIDI0fSwKKyAgICB7ICAyLCAgNywgMjd9LCB7ICAyLCAgNywgMjh9LCB7ICAyLCAgNywgMjl9LCB7ICAyLCAxMCwgIDF9LAorICAgIHsgIDIsIDEwLCAgNX0sIHsgIDIsIDEwLCAgOX0sIHsgIDIsIDEwLCAxN30sIHsgIDIsIDEwLCAxOX0sCisgICAgeyAgMiwgMTAsIDIxfSwgeyAgMiwgMTAsIDIyfSwgeyAgMiwgMTAsIDIzfSwgeyAgMiwgMTEsICAxfSwKKyAgICB7ICAyLCAxMSwgIDJ9LCB7ICAyLCAxMSwgIDN9LCB7ICAyLCAxMSwgIDV9LCB7ICAyLCAxMSwgIDh9LAorICAgIHsgIDIsIDExLCAgOX0sIHsgIDIsIDExLCAxN30sIHsgIDIsIDExLCAxOX0sIHsgIDIsIDExLCAyMX0sCisgICAgeyAgMiwgMTEsIDIyfSwgeyAgMiwgMTEsIDIzfSwgeyAgMiwgMTEsIDI3fSwgeyAgMiwgMTIsICAxfSwKKyAgICB7ICAyLCAxMiwgIDV9LCB7ICAyLCAxMiwgIDl9LCB7ICAyLCAxMiwgMTl9LCB7ICAyLCAxMiwgMjF9LAorICAgIHsgIDIsIDEzLCAgMX0sIHsgIDIsIDEzLCAgMn0sIHsgIDIsIDEzLCAgNX0sIHsgIDIsIDEzLCAgOH0sCisgICAgeyAgMiwgMTMsICA5fSwgeyAgMiwgMTMsIDExfSwgeyAgMiwgMTMsIDEzfSwgeyAgMiwgMTMsIDE2fSwKKyAgICB7ICAyLCAxMywgMTd9LCB7ICAyLCAxMywgMTl9LCB7ICAyLCAxMywgMjF9LCB7ICAyLCAxMywgMjN9LAorICAgIHsgIDIsIDEzLCAyNH0sIHsgIDIsIDE0LCAgMX0sIHsgIDIsIDE0LCAgMn0sIHsgIDIsIDE0LCAgNX0sCisgICAgeyAgMiwgMTQsICA5fSwgeyAgMiwgMTQsIDExfSwgeyAgMiwgMTQsIDE3fSwgeyAgMiwgMTQsIDE5fSwKKyAgICB7ICAyLCAxNCwgMjF9LCB7ICAyLCAxNCwgMjN9LCB7ICAyLCAxNSwgIDF9LCB7ICAyLCAxNSwgIDV9LAorICAgIHsgIDIsIDE1LCAgOX0sIHsgIDIsIDE1LCAxOX0sIHsgIDIsIDE1LCAyMn0sIHsgIDIsIDE1LCAyM30sCisgICAgeyAgMiwgMTgsICAxfSwgeyAgMiwgMTgsICAyfSwgeyAgMiwgMTgsICA1fSwgeyAgMiwgMTgsICA5fSwKKyAgICB7ICAyLCAxOCwgMTd9LCB7ICAyLCAxOCwgMTl9LCB7ICAyLCAxOCwgMjF9LCB7ICAyLCAxOCwgMjN9LAorICAgIHsgIDIsIDE5LCAgMX0sIHsgIDIsIDE5LCAgNX0sIHsgIDIsIDE5LCAgOX0sIHsgIDIsIDE5LCAxOX0sCisgICAgeyAgMiwgMTksIDIxfSwgeyAgMiwgMjAsICAxfSwgeyAgMiwgMjAsICAyfSwgeyAgMiwgMjAsICA1fSwKKyAgICB7ICAyLCAyMCwgIDh9LCB7ICAyLCAyMCwgIDl9LCB7ICAyLCAyMCwgMTB9LCB7ICAyLCAyMCwgMTF9LAorICAgIHsgIDIsIDIwLCAxNn0sIHsgIDIsIDIwLCAxN30sIHsgIDIsIDIwLCAxOX0sIHsgIDIsIDIwLCAyMX0sCisgICAgeyAgMiwgMjAsIDIzfSwgeyAgMiwgMjAsIDI0fSwgeyAgMiwgMjEsICAxfSwgeyAgMiwgMjEsICAyfSwKKyAgICB7ICAyLCAyMSwgIDV9LCB7ICAyLCAyMSwgIDl9LCB7ICAyLCAyMSwgMjJ9LCB7ICAyLCAyMSwgMjN9LAorICAgIHsgIDIsIDIyLCAgMX0sIHsgIDIsIDIyLCAyMX0sIHsgIDIsIDIzLCAgMX0sIHsgIDIsIDIzLCAgMn0sCisgICAgeyAgMiwgMjMsICA1fSwgeyAgMiwgMjMsICA5fSwgeyAgMiwgMjMsIDE3fSwgeyAgMiwgMjMsIDE5fSwKKyAgICB7ICAyLCAyMywgMjF9LCB7ICAyLCAyNiwgIDF9LCB7ICAyLCAyNiwgIDV9LCB7ICAyLCAyNiwgIDl9LAorICAgIHsgIDIsIDI3LCAgMX0sIHsgIDIsIDI3LCAgMn0sIHsgIDIsIDI3LCAgNX0sIHsgIDIsIDI3LCAgOH0sCisgICAgeyAgMiwgMjcsICA5fSwgeyAgMiwgMjcsIDEwfSwgeyAgMiwgMjcsIDE3fSwgeyAgMiwgMjcsIDE5fSwKKyAgICB7ICAyLCAyNywgMjF9LCB7ICAyLCAyNywgMjN9LCB7ICAyLCAyOCwgIDF9LCB7ICAyLCAyOSwgIDF9LAorICAgIHsgIDIsIDI5LCAgMn0sIHsgIDIsIDI5LCAgNX0sIHsgIDIsIDI5LCAgOH0sIHsgIDIsIDI5LCAgOX0sCisgICAgeyAgMiwgMjksIDExfSwgeyAgMiwgMjksIDE3fSwgeyAgMiwgMjksIDE5fSwgeyAgMiwgMjksIDIxfSwKKyAgICB7ICAyLCAyOSwgMjN9LCB7ICAyLCAyOSwgMjR9LCB7ICAyLCAyOSwgMjh9LCB7ICAzLCAgMywgIDF9LAorICAgIHsgIDMsICAzLCAgMn0sIHsgIDMsICAzLCAgM30sIHsgIDMsICAzLCAgNX0sIHsgIDMsICAzLCAgOX0sCisgICAgeyAgMywgIDMsIDExfSwgeyAgMywgIDMsIDE3fSwgeyAgMywgIDMsIDE5fSwgeyAgMywgIDMsIDIxfSwKKyAgICB7ICAzLCAgMywgMjJ9LCB7ICAzLCAgMywgMjN9LCB7ICAzLCAgMywgMjd9LCB7ICAzLCAgNCwgIDF9LAorICAgIHsgIDMsICA0LCAgMn0sIHsgIDMsICA0LCAgNX0sIHsgIDMsICA0LCAgOX0sIHsgIDMsICA0LCAxN30sCisgICAgeyAgMywgIDQsIDE5fSwgeyAgMywgIDQsIDIxfSwgeyAgMywgIDQsIDIyfSwgeyAgMywgIDQsIDIzfSwKKyAgICB7ICAzLCAgNSwgIDF9LCB7ICAzLCAgNSwgIDJ9LCB7ICAzLCAgNSwgIDl9LCB7ICAzLCAgNywgIDF9LAorICAgIHsgIDMsICA3LCAgMn0sIHsgIDMsICA3LCAgM30sIHsgIDMsICA3LCAgNX0sIHsgIDMsICA3LCAgOX0sCisgICAgeyAgMywgIDcsIDE3fSwgeyAgMywgIDcsIDE5fSwgeyAgMywgIDcsIDIxfSwgeyAgMywgIDcsIDIyfSwKKyAgICB7ICAzLCAgNywgMjN9LCB7ICAzLCAxMCwgIDF9LCB7ICAzLCAxMCwgIDJ9LCB7ICAzLCAxMCwgIDV9LAorICAgIHsgIDMsIDEwLCAxN30sIHsgIDMsIDEwLCAyMX0sIHsgIDMsIDEwLCAyM30sIHsgIDMsIDExLCAgMX0sCisgICAgeyAgMywgMTEsICA1fSwgeyAgMywgMTEsICA5fSwgeyAgMywgMTEsIDIxfSwgeyAgMywgMTEsIDIyfSwKKyAgICB7ICAzLCAxMSwgMjd9LCB7ICAzLCAxMiwgIDF9LCB7ICAzLCAxMywgIDF9LCB7ICAzLCAxMywgIDJ9LAorICAgIHsgIDMsIDEzLCAgNX0sIHsgIDMsIDEzLCAgN30sIHsgIDMsIDEzLCAgOX0sIHsgIDMsIDEzLCAxN30sCisgICAgeyAgMywgMTMsIDE5fSwgeyAgMywgMTMsIDIxfSwgeyAgMywgMTMsIDIzfSwgeyAgMywgMTMsIDI0fSwKKyAgICB7ICAzLCAxMywgMjV9LCB7ICAzLCAxNCwgIDF9LCB7ICAzLCAxNCwgIDJ9LCB7ICAzLCAxNCwgIDl9LAorICAgIHsgIDMsIDE0LCAyMn0sIHsgIDMsIDE0LCAyM30sIHsgIDMsIDE1LCAgMX0sIHsgIDMsIDE1LCAgMn0sCisgICAgeyAgMywgMTUsIDIzfSwgeyAgMywgMTgsICAxfSwgeyAgMywgMTgsICA1fSwgeyAgMywgMTgsICA5fSwKKyAgICB7ICAzLCAxOCwgMTd9LCB7ICAzLCAxOCwgMTl9LCB7ICAzLCAxOCwgMjN9LCB7ICAzLCAxOSwgIDF9LAorICAgIHsgIDMsIDIwLCAgMX0sIHsgIDMsIDIwLCAgMn0sIHsgIDMsIDIwLCAgNX0sIHsgIDMsIDIwLCAgOX0sCisgICAgeyAgMywgMjAsIDE2fSwgeyAgMywgMjAsIDE3fSwgeyAgMywgMjAsIDE5fSwgeyAgMywgMjAsIDIxfSwKKyAgICB7ICAzLCAyMCwgMjN9LCB7ICAzLCAyMCwgMjR9LCB7ICAzLCAyMSwgIDF9LCB7ICAzLCAyMSwgIDl9LAorICAgIHsgIDMsIDIxLCAyMn0sIHsgIDMsIDIxLCAyM30sIHsgIDMsIDIyLCAgMX0sIHsgIDMsIDIyLCAgMn0sCisgICAgeyAgMywgMjIsICA1fSwgeyAgMywgMjIsICA5fSwgeyAgMywgMjIsIDE3fSwgeyAgMywgMjIsIDE5fSwKKyAgICB7ICAzLCAyMiwgMjJ9LCB7ICAzLCAyMywgIDF9LCB7ICAzLCAyMywgIDV9LCB7ICAzLCAyMywgIDl9LAorICAgIHsgIDMsIDIzLCAxN30sIHsgIDMsIDIzLCAxOX0sIHsgIDMsIDI2LCAgMX0sIHsgIDMsIDI3LCAgMX0sCisgICAgeyAgMywgMjcsICAyfSwgeyAgMywgMjcsICA1fSwgeyAgMywgMjcsICA3fSwgeyAgMywgMjcsICA5fSwKKyAgICB7ICAzLCAyNywgMTF9LCB7ICAzLCAyNywgMTZ9LCB7ICAzLCAyNywgMTd9LCB7ICAzLCAyNywgMTl9LAorICAgIHsgIDMsIDI3LCAyMX0sIHsgIDMsIDI3LCAyM30sIHsgIDMsIDI3LCAyN30sIHsgIDMsIDI5LCAgMX0sCisgICAgeyAgMywgMjksICAyfSwgeyAgMywgMjksICA1fSwgeyAgMywgMjksICA5fSwgeyAgMywgMjksIDE3fSwKKyAgICB7ICAzLCAyOSwgMTl9LCB7ICAzLCAyOSwgMjF9LCB7ICAzLCAyOSwgMjN9LCB7ICA0LCAgMywgIDF9LAorICAgIHsgIDQsICAzLCAgMn0sIHsgIDQsICAzLCAgM30sIHsgIDQsICAzLCAgNX0sIHsgIDQsICAzLCAgOH0sCisgICAgeyAgNCwgIDMsICA5fSwgeyAgNCwgIDMsIDEwfSwgeyAgNCwgIDMsIDExfSwgeyAgNCwgIDMsIDE3fSwKKyAgICB7ICA0LCAgMywgMTl9LCB7ICA0LCAgMywgMjF9LCB7ICA0LCAgMywgMjJ9LCB7ICA0LCAgMywgMjN9LAorICAgIHsgIDQsICAzLCAyNH0sIHsgIDQsICAzLCAyNX0sIHsgIDQsICAzLCAyN30sIHsgIDQsICAzLCAyOX0sCisgICAgeyAgNCwgIDQsICAxfSwgeyAgNCwgIDQsICAyfSwgeyAgNCwgIDQsICA1fSwgeyAgNCwgIDQsICA5fSwKKyAgICB7ICA0LCAgNCwgMTd9LCB7ICA0LCAgNCwgMTl9LCB7ICA0LCAgNCwgMjF9LCB7ICA0LCAgNCwgMjJ9LAorICAgIHsgIDQsICA0LCAyM30sIHsgIDQsICA1LCAgMX0sIHsgIDQsICA1LCAgMn0sIHsgIDQsICA1LCAgNX0sCisgICAgeyAgNCwgIDUsICA5fSwgeyAgNCwgIDUsIDE3fSwgeyAgNCwgIDUsIDIzfSwgeyAgNCwgIDcsICAxfSwKKyAgICB7ICA0LCAgNywgIDJ9LCB7ICA0LCAgNywgIDR9LCB7ICA0LCAgNywgIDV9LCB7ICA0LCAgNywgIDl9LAorICAgIHsgIDQsICA3LCAxMX0sIHsgIDQsICA3LCAxMn0sIHsgIDQsICA3LCAxN30sIHsgIDQsICA3LCAxOX0sCisgICAgeyAgNCwgIDcsIDIxfSwgeyAgNCwgIDcsIDIyfSwgeyAgNCwgIDcsIDIzfSwgeyAgNCwgIDcsIDI5fSwKKyAgICB7ICA0LCAxMCwgIDF9LCB7ICA0LCAxMCwgIDJ9LCB7ICA0LCAxMCwgIDV9LCB7ICA0LCAxMCwgIDl9LAorICAgIHsgIDQsIDEwLCAxN30sIHsgIDQsIDEwLCAxOX0sIHsgIDQsIDEwLCAyMX0sIHsgIDQsIDEwLCAyMn0sCisgICAgeyAgNCwgMTAsIDIzfSwgeyAgNCwgMTEsICAxfSwgeyAgNCwgMTEsICAyfSwgeyAgNCwgMTEsICA1fSwKKyAgICB7ICA0LCAxMSwgIDl9LCB7ICA0LCAxMSwgMTd9LCB7ICA0LCAxMSwgMTl9LCB7ICA0LCAxMSwgMjJ9LAorICAgIHsgIDQsIDExLCAyM30sIHsgIDQsIDExLCAyNn0sIHsgIDQsIDEyLCAgMX0sIHsgIDQsIDEyLCAgNX0sCisgICAgeyAgNCwgMTMsICAxfSwgeyAgNCwgMTMsICAyfSwgeyAgNCwgMTMsICA1fSwgeyAgNCwgMTMsICA5fSwKKyAgICB7ICA0LCAxMywgMTF9LCB7ICA0LCAxMywgMTd9LCB7ICA0LCAxMywgMTl9LCB7ICA0LCAxMywgMjF9LAorICAgIHsgIDQsIDEzLCAyM30sIHsgIDQsIDEzLCAyOH0sIHsgIDQsIDEzLCAyOX0sIHsgIDQsIDE0LCAgMX0sCisgICAgeyAgNCwgMTQsICA1fSwgeyAgNCwgMTQsICA5fSwgeyAgNCwgMTQsIDIyfSwgeyAgNCwgMTgsICAxfSwKKyAgICB7ICA0LCAxOCwgIDV9LCB7ICA0LCAxOCwgIDl9LCB7ICA0LCAxOCwgMTd9LCB7ICA0LCAxOCwgMTl9LAorICAgIHsgIDQsIDE4LCAyMX0sIHsgIDQsIDE5LCAgMX0sIHsgIDQsIDE5LCAgMn0sIHsgIDQsIDE5LCAgNX0sCisgICAgeyAgNCwgMTksICA5fSwgeyAgNCwgMTksIDE5fSwgeyAgNCwgMTksIDIxfSwgeyAgNCwgMTksIDIzfSwKKyAgICB7ICA0LCAyMCwgIDF9LCB7ICA0LCAyMCwgIDJ9LCB7ICA0LCAyMCwgIDV9LCB7ICA0LCAyMCwgIDh9LAorICAgIHsgIDQsIDIwLCAgOX0sIHsgIDQsIDIwLCAxN30sIHsgIDQsIDIwLCAxOX0sIHsgIDQsIDIwLCAyMX0sCisgICAgeyAgNCwgMjAsIDIzfSwgeyAgNCwgMjEsICAxfSwgeyAgNCwgMjEsIDIyfSwgeyAgNCwgMjIsICAxfSwKKyAgICB7ICA0LCAyMywgIDF9LCB7ICA0LCAyMywgIDV9LCB7ICA0LCAyMywgIDl9LCB7ICA0LCAyMywgMTd9LAorICAgIHsgIDQsIDIzLCAxOX0sIHsgIDQsIDI2LCAgMX0sIHsgIDQsIDI2LCAgMn0sIHsgIDQsIDI2LCAgOX0sCisgICAgeyAgNCwgMjYsIDE3fSwgeyAgNCwgMjYsIDE5fSwgeyAgNCwgMjYsIDIzfSwgeyAgNCwgMjcsICAxfSwKKyAgICB7ICA0LCAyNywgIDJ9LCB7ICA0LCAyNywgIDV9LCB7ICA0LCAyNywgIDl9LCB7ICA0LCAyNywgMTB9LAorICAgIHsgIDQsIDI3LCAxMX0sIHsgIDQsIDI3LCAxN30sIHsgIDQsIDI3LCAxOX0sIHsgIDQsIDI3LCAyMX0sCisgICAgeyAgNCwgMjcsIDIzfSwgeyAgNCwgMjcsIDI0fSwgeyAgNCwgMjcsIDI4fSwgeyAgNCwgMjgsICAxfSwKKyAgICB7ICA0LCAyOCwgIDV9LCB7ICA0LCAyOCwgIDl9LCB7ICA0LCAyOSwgIDF9LCB7ICA0LCAyOSwgIDJ9LAorICAgIHsgIDQsIDI5LCAgNX0sIHsgIDQsIDI5LCAgOX0sIHsgIDQsIDI5LCAxMX0sIHsgIDQsIDI5LCAxN30sCisgICAgeyAgNCwgMjksIDE5fSwgeyAgNCwgMjksIDIxfSwgeyAgNCwgMjksIDIzfSwgeyAgNCwgMjksIDI4fSwKKyAgICB7ICA1LCAgMywgIDF9LCB7ICA1LCAgMywgIDJ9LCB7ICA1LCAgMywgIDN9LCB7ICA1LCAgMywgIDV9LAorICAgIHsgIDUsICAzLCAgOH0sIHsgIDUsICAzLCAgOX0sIHsgIDUsICAzLCAxMH0sIHsgIDUsICAzLCAxMX0sCisgICAgeyAgNSwgIDMsIDEyfSwgeyAgNSwgIDMsIDE2fSwgeyAgNSwgIDMsIDE3fSwgeyAgNSwgIDMsIDE5fSwKKyAgICB7ICA1LCAgMywgMjF9LCB7ICA1LCAgMywgMjJ9LCB7ICA1LCAgMywgMjN9LCB7ICA1LCAgMywgMjR9LAorICAgIHsgIDUsICAzLCAyNX0sIHsgIDUsICAzLCAyOX0sIHsgIDUsICA0LCAgMX0sIHsgIDUsICA0LCAgMn0sCisgICAgeyAgNSwgIDQsICA1fSwgeyAgNSwgIDQsICA5fSwgeyAgNSwgIDQsIDE3fSwgeyAgNSwgIDQsIDE5fSwKKyAgICB7ICA1LCAgNCwgMjF9LCB7ICA1LCAgNCwgMjJ9LCB7ICA1LCAgNCwgMjN9LCB7ICA1LCAgNSwgIDF9LAorICAgIHsgIDUsICA3LCAgMX0sIHsgIDUsICA3LCAgMn0sIHsgIDUsICA3LCAgM30sIHsgIDUsICA3LCAgNX0sCisgICAgeyAgNSwgIDcsICA4fSwgeyAgNSwgIDcsICA5fSwgeyAgNSwgIDcsIDExfSwgeyAgNSwgIDcsIDEyfSwKKyAgICB7ICA1LCAgNywgMTd9LCB7ICA1LCAgNywgMTl9LCB7ICA1LCAgNywgMjF9LCB7ICA1LCAgNywgMjN9LAorICAgIHsgIDUsICA3LCAyNX0sIHsgIDUsICA3LCAyOH0sIHsgIDUsIDEwLCAgMX0sIHsgIDUsIDEwLCAgMn0sCisgICAgeyAgNSwgMTAsICA1fSwgeyAgNSwgMTAsICA5fSwgeyAgNSwgMTAsIDE3fSwgeyAgNSwgMTAsIDE5fSwKKyAgICB7ICA1LCAxMCwgMjF9LCB7ICA1LCAxMCwgMjJ9LCB7ICA1LCAxMCwgMjN9LCB7ICA1LCAxMSwgIDF9LAorICAgIHsgIDUsIDExLCAgNX0sIHsgIDUsIDExLCAgOX0sIHsgIDUsIDExLCAyMn0sIHsgIDUsIDExLCAyM30sCisgICAgeyAgNSwgMTIsICAxfSwgeyAgNSwgMTIsICA1fSwgeyAgNSwgMTMsICAxfSwgeyAgNSwgMTMsICAyfSwKKyAgICB7ICA1LCAxMywgIDV9LCB7ICA1LCAxMywgIDh9LCB7ICA1LCAxMywgIDl9LCB7ICA1LCAxMywgMTF9LAorICAgIHsgIDUsIDEzLCAxM30sIHsgIDUsIDEzLCAxN30sIHsgIDUsIDEzLCAxOX0sIHsgIDUsIDEzLCAyMX0sCisgICAgeyAgNSwgMTMsIDIzfSwgeyAgNSwgMTMsIDI1fSwgeyAgNSwgMTMsIDI3fSwgeyAgNSwgMTQsICAxfSwKKyAgICB7ICA1LCAxNCwgIDV9LCB7ICA1LCAxNCwgIDl9LCB7ICA1LCAxNSwgIDF9LCB7ICA1LCAxNSwgMjJ9LAorICAgIHsgIDUsIDE4LCAgMX0sIHsgIDUsIDE4LCAgNX0sIHsgIDUsIDE4LCAgOX0sIHsgIDUsIDE4LCAxN30sCisgICAgeyAgNSwgMTgsIDE5fSwgeyAgNSwgMTgsIDIxfSwgeyAgNSwgMTksICAxfSwgeyAgNSwgMjAsICAxfSwKKyAgICB7ICA1LCAyMCwgIDJ9LCB7ICA1LCAyMCwgIDV9LCB7ICA1LCAyMCwgIDl9LCB7ICA1LCAyMCwgMTd9LAorICAgIHsgIDUsIDIwLCAxOX0sIHsgIDUsIDIwLCAyMX0sIHsgIDUsIDIwLCAyM30sIHsgIDUsIDIxLCAgMX0sCisgICAgeyAgNSwgMjEsIDIyfSwgeyAgNSwgMjIsICAxfSwgeyAgNSwgMjIsIDIzfSwgeyAgNSwgMjMsICAxfSwKKyAgICB7ICA1LCAyMywgIDV9LCB7ICA1LCAyMywgIDl9LCB7ICA1LCAyMywgMTl9LCB7ICA1LCAyMywgMjF9LAorICAgIHsgIDUsIDIzLCAyM30sIHsgIDUsIDI2LCAgMX0sIHsgIDUsIDI2LCAgNX0sIHsgIDUsIDI2LCAgOX0sCisgICAgeyAgNSwgMjYsIDE3fSwgeyAgNSwgMjYsIDIzfSwgeyAgNSwgMjcsICAxfSwgeyAgNSwgMjcsICAyfSwKKyAgICB7ICA1LCAyNywgIDV9LCB7ICA1LCAyNywgIDh9LCB7ICA1LCAyNywgIDl9LCB7ICA1LCAyNywgMTF9LAorICAgIHsgIDUsIDI3LCAxN30sIHsgIDUsIDI3LCAxOX0sIHsgIDUsIDI3LCAyMX0sIHsgIDUsIDI3LCAyM30sCisgICAgeyAgNSwgMjgsICAxfSwgeyAgNSwgMjksICAxfSwgeyAgNSwgMjksICAyfSwgeyAgNSwgMjksICA1fSwKKyAgICB7ICA1LCAyOSwgIDh9LCB7ICA1LCAyOSwgIDl9LCB7ICA1LCAyOSwgMTd9LCB7ICA1LCAyOSwgMTl9LAorICAgIHsgIDUsIDI5LCAyMX0sIHsgIDUsIDI5LCAyMn0sIHsgIDUsIDI5LCAyM30sIHsgIDUsIDI5LCAyNH0sCisgICAgeyAgNiwgIDMsICAxfSwgeyAgNiwgIDMsICAyfSwgeyAgNiwgIDMsICA1fSwgeyAgNiwgIDMsICA5fSwKKyAgICB7ICA2LCAgMywgMTd9LCB7ICA2LCAgMywgMTl9LCB7ICA2LCAgMywgMjF9LCB7ICA2LCAgMywgMjJ9LAorICAgIHsgIDYsICAzLCAyM30sIHsgIDYsICAzLCAyOX0sIHsgIDYsICA0LCAgMX0sIHsgIDYsICA0LCAgMn0sCisgICAgeyAgNiwgIDQsICA1fSwgeyAgNiwgIDQsICA5fSwgeyAgNiwgIDQsIDE3fSwgeyAgNiwgIDQsIDE5fSwKKyAgICB7ICA2LCAgNCwgMjF9LCB7ICA2LCAgNCwgMjJ9LCB7ICA2LCAgNCwgMjN9LCB7ICA2LCAgNywgIDF9LAorICAgIHsgIDYsICA3LCAgMn0sIHsgIDYsICA3LCAgNX0sIHsgIDYsICA3LCAgOX0sIHsgIDYsICA3LCAxMX0sCisgICAgeyAgNiwgIDcsIDEyfSwgeyAgNiwgIDcsIDE3fSwgeyAgNiwgIDcsIDE5fSwgeyAgNiwgIDcsIDIxfSwKKyAgICB7ICA2LCAgNywgMjJ9LCB7ICA2LCAgNywgMjN9LCB7ICA2LCAgNywgMjl9LCB7ICA2LCAxMCwgIDF9LAorICAgIHsgIDYsIDEwLCAgMn0sIHsgIDYsIDEwLCAgNX0sIHsgIDYsIDEwLCAgOX0sIHsgIDYsIDEwLCAxN30sCisgICAgeyAgNiwgMTAsIDE5fSwgeyAgNiwgMTAsIDIxfSwgeyAgNiwgMTAsIDIyfSwgeyAgNiwgMTAsIDIzfSwKKyAgICB7ICA2LCAxMSwgIDF9LCB7ICA2LCAxMSwgMjJ9LCB7ICA2LCAxMywgIDF9LCB7ICA2LCAxMywgIDJ9LAorICAgIHsgIDYsIDEzLCAgNX0sIHsgIDYsIDEzLCAgOX0sIHsgIDYsIDEzLCAyM30sIHsgIDYsIDE0LCAgMX0sCisgICAgeyAgNiwgMTQsICA5fSwgeyAgNiwgMTUsICAxfSwgeyAgNiwgMTgsICAxfSwgeyAgNiwgMTgsICA1fSwKKyAgICB7ICA2LCAyMCwgIDF9LCB7ICA2LCAyMCwgIDJ9LCB7ICA2LCAyMCwgIDV9LCB7ICA2LCAyMCwgIDl9LAorICAgIHsgIDYsIDIwLCAxNn0sIHsgIDYsIDIwLCAxN30sIHsgIDYsIDIwLCAyM30sIHsgIDYsIDIyLCAgMX0sCisgICAgeyAgNiwgMjMsICAxfSwgeyAgNiwgMjMsICA1fSwgeyAgNiwgMjMsICA5fSwgeyAgNiwgMjMsIDE3fSwKKyAgICB7ICA2LCAyMywgMTl9LCB7ICA2LCAyMywgMjN9LCB7ICA2LCAyNywgIDF9LCB7ICA2LCAyNywgIDJ9LAorICAgIHsgIDYsIDI3LCAgNX0sIHsgIDYsIDI3LCAgOH0sIHsgIDYsIDI3LCAgOX0sIHsgIDYsIDI3LCAxN30sCisgICAgeyAgNiwgMjcsIDE5fSwgeyAgNiwgMjcsIDIxfSwgeyAgNiwgMjgsICAxfSwgeyAgNiwgMjgsICA1fSwKKyAgICB7ICA2LCAyOCwgIDl9LCB7ICA2LCAyOCwgMTd9LCB7ICA2LCAyOCwgMTl9LCB7ICA2LCAyOSwgIDF9LAorICAgIHsgIDYsIDI5LCAgNX0sIHsgIDYsIDI5LCAgOX0sIHsgIDYsIDI5LCAxN30sIHsgIDYsIDI5LCAxOX0sCisgICAgeyAgNiwgMjksIDIxfSwgeyAgNiwgMjksIDIzfSwgeyAgNywgIDMsICAxfSwgeyAgNywgIDMsICAyfSwKKyAgICB7ICA3LCAgMywgIDV9LCB7ICA3LCAgMywgIDl9LCB7ICA3LCAgMywgMTd9LCB7ICA3LCAgMywgMTl9LAorICAgIHsgIDcsICAzLCAyMX0sIHsgIDcsICAzLCAyMn0sIHsgIDcsICAzLCAyM30sIHsgIDcsICAzLCAyNH0sCisgICAgeyAgNywgIDMsIDI4fSwgeyAgNywgIDMsIDI5fSwgeyAgNywgIDQsICAxfSwgeyAgNywgIDQsICAyfSwKKyAgICB7ICA3LCAgNCwgIDV9LCB7ICA3LCAgNCwgIDl9LCB7ICA3LCAgNCwgMTd9LCB7ICA3LCAgNCwgMTl9LAorICAgIHsgIDcsICA0LCAyMX0sIHsgIDcsICA0LCAyMn0sIHsgIDcsICA0LCAyM30sIHsgIDcsICA1LCAgMX0sCisgICAgeyAgNywgIDUsICAyfSwgeyAgNywgIDUsICA1fSwgeyAgNywgIDUsIDIxfSwgeyAgNywgIDUsIDIzfSwKKyAgICB7ICA3LCAgNywgIDF9LCB7ICA3LCAgNywgIDJ9LCB7ICA3LCAgNywgIDV9LCB7ICA3LCAgNywgIDl9LAorICAgIHsgIDcsICA3LCAxN30sIHsgIDcsICA3LCAxOX0sIHsgIDcsICA3LCAyMX0sIHsgIDcsICA3LCAyMn0sCisgICAgeyAgNywgIDcsIDIzfSwgeyAgNywgIDcsIDI5fSwgeyAgNywgMTAsICAxfSwgeyAgNywgMTAsICAyfSwKKyAgICB7ICA3LCAxMCwgIDV9LCB7ICA3LCAxMCwgIDl9LCB7ICA3LCAxMCwgMTd9LCB7ICA3LCAxMCwgMTl9LAorICAgIHsgIDcsIDEwLCAyMX0sIHsgIDcsIDEwLCAyM30sIHsgIDcsIDExLCAgMX0sIHsgIDcsIDExLCAgMn0sCisgICAgeyAgNywgMTEsICA1fSwgeyAgNywgMTEsICA5fSwgeyAgNywgMTEsIDE3fSwgeyAgNywgMTEsIDE5fSwKKyAgICB7ICA3LCAxMSwgMjF9LCB7ICA3LCAxMSwgMjJ9LCB7ICA3LCAxMSwgMjN9LCB7ICA3LCAxMiwgIDF9LAorICAgIHsgIDcsIDEyLCAgNX0sIHsgIDcsIDEyLCAxOX0sIHsgIDcsIDEyLCAyMX0sIHsgIDcsIDEzLCAgMX0sCisgICAgeyAgNywgMTMsICAyfSwgeyAgNywgMTMsICA1fSwgeyAgNywgMTMsICA5fSwgeyAgNywgMTMsIDE3fSwKKyAgICB7ICA3LCAxMywgMTl9LCB7ICA3LCAxMywgMjF9LCB7ICA3LCAxMywgMjN9LCB7ICA3LCAxNCwgIDF9LAorICAgIHsgIDcsIDE0LCAgNX0sIHsgIDcsIDE0LCAyM30sIHsgIDcsIDE1LCAyMn0sIHsgIDcsIDE4LCAgMX0sCisgICAgeyAgNywgMTgsICA1fSwgeyAgNywgMTgsICA5fSwgeyAgNywgMTgsIDE3fSwgeyAgNywgMTgsIDE5fSwKKyAgICB7ICA3LCAxOCwgMjF9LCB7ICA3LCAxOCwgMjN9LCB7ICA3LCAxOSwgIDF9LCB7ICA3LCAxOSwgIDV9LAorICAgIHsgIDcsIDE5LCAgOX0sIHsgIDcsIDE5LCAxOX0sIHsgIDcsIDE5LCAyMX0sIHsgIDcsIDE5LCAyM30sCisgICAgeyAgNywgMjAsICAxfSwgeyAgNywgMjAsICAyfSwgeyAgNywgMjAsICA1fSwgeyAgNywgMjAsICA5fSwKKyAgICB7ICA3LCAyMCwgMTd9LCB7ICA3LCAyMCwgMTl9LCB7ICA3LCAyMCwgMjF9LCB7ICA3LCAyMCwgMjN9LAorICAgIHsgIDcsIDIxLCAgMX0sIHsgIDcsIDIxLCAyMn0sIHsgIDcsIDIyLCAgMX0sIHsgIDcsIDIzLCAgMX0sCisgICAgeyAgNywgMjMsICAyfSwgeyAgNywgMjMsICA1fSwgeyAgNywgMjMsICA5fSwgeyAgNywgMjMsIDE3fSwKKyAgICB7ICA3LCAyMywgMjF9LCB7ICA3LCAyMywgMjN9LCB7ICA3LCAyNiwgIDF9LCB7ICA3LCAyNiwgIDJ9LAorICAgIHsgIDcsIDI2LCAgNX0sIHsgIDcsIDI2LCAgOX0sIHsgIDcsIDI2LCAxN30sIHsgIDcsIDI2LCAxOX0sCisgICAgeyAgNywgMjYsIDIxfSwgeyAgNywgMjYsIDIzfSwgeyAgNywgMjcsICAxfSwgeyAgNywgMjcsICAyfSwKKyAgICB7ICA3LCAyNywgIDV9LCB7ICA3LCAyNywgIDl9LCB7ICA3LCAyNywgMTd9LCB7ICA3LCAyNywgMTl9LAorICAgIHsgIDcsIDI3LCAyMX0sIHsgIDcsIDI3LCAyM30sIHsgIDcsIDI3LCAyNH0sIHsgIDcsIDI3LCAyN30sCisgICAgeyAgNywgMjcsIDI4fSwgeyAgNywgMjksICAxfSwgeyAgNywgMjksICAyfSwgeyAgNywgMjksICA1fSwKKyAgICB7ICA3LCAyOSwgIDl9LCB7ICA3LCAyOSwgMTd9LCB7ICA3LCAyOSwgMTl9LCB7ICA3LCAyOSwgMjF9LAorICAgIHsgIDcsIDI5LCAyM30sIHsgIDgsICAzLCAgMX0sIHsgIDgsICAzLCAgMn0sIHsgIDgsICAzLCAgNX0sCisgICAgeyAgOCwgIDMsICA3fSwgeyAgOCwgIDMsICA4fSwgeyAgOCwgIDMsICA5fSwgeyAgOCwgIDMsIDEwfSwKKyAgICB7ICA4LCAgMywgMTF9LCB7ICA4LCAgMywgMTd9LCB7ICA4LCAgMywgMTl9LCB7ICA4LCAgMywgMjF9LAorICAgIHsgIDgsICAzLCAyM30sIHsgIDgsICAzLCAyNH0sIHsgIDgsICAzLCAyN30sIHsgIDgsICAzLCAyOX0sCisgICAgeyAgOCwgIDQsICAxfSwgeyAgOCwgIDQsICAyfSwgeyAgOCwgIDQsICA1fSwgeyAgOCwgIDQsICA5fSwKKyAgICB7ICA4LCAgNCwgMTd9LCB7ICA4LCAgNCwgMTl9LCB7ICA4LCAgNCwgMjF9LCB7ICA4LCAgNCwgMjJ9LAorICAgIHsgIDgsICA0LCAyM30sIHsgIDgsICA0LCAyNH0sIHsgIDgsICA1LCAgMX0sIHsgIDgsICA1LCAgMn0sCisgICAgeyAgOCwgIDUsICA5fSwgeyAgOCwgIDUsIDIzfSwgeyAgOCwgIDcsICAxfSwgeyAgOCwgIDcsICAyfSwKKyAgICB7ICA4LCAgNywgIDV9LCB7ICA4LCAgNywgIDl9LCB7ICA4LCAgNywgMTF9LCB7ICA4LCAgNywgMTd9LAorICAgIHsgIDgsICA3LCAxOX0sIHsgIDgsICA3LCAyMX0sIHsgIDgsICA3LCAyM30sIHsgIDgsICA3LCAyNH0sCisgICAgeyAgOCwgIDcsIDI5fSwgeyAgOCwgMTAsICAxfSwgeyAgOCwgMTAsICAyfSwgeyAgOCwgMTAsICA1fSwKKyAgICB7ICA4LCAxMCwgIDl9LCB7ICA4LCAxMCwgMTd9LCB7ICA4LCAxMCwgMTl9LCB7ICA4LCAxMCwgMjF9LAorICAgIHsgIDgsIDEwLCAyMn0sIHsgIDgsIDEwLCAyM30sIHsgIDgsIDExLCAgMX0sIHsgIDgsIDExLCAgMn0sCisgICAgeyAgOCwgMTEsICA1fSwgeyAgOCwgMTEsICA5fSwgeyAgOCwgMTEsIDIxfSwgeyAgOCwgMTEsIDIyfSwKKyAgICB7ICA4LCAxMSwgMjN9LCB7ICA4LCAxMSwgMjV9LCB7ICA4LCAxMiwgIDF9LCB7ICA4LCAxMywgIDF9LAorICAgIHsgIDgsIDEzLCAgMn0sIHsgIDgsIDEzLCAgNH0sIHsgIDgsIDEzLCAgNX0sIHsgIDgsIDEzLCAgOX0sCisgICAgeyAgOCwgMTMsIDExfSwgeyAgOCwgMTMsIDE3fSwgeyAgOCwgMTMsIDE5fSwgeyAgOCwgMTMsIDIxfSwKKyAgICB7ICA4LCAxMywgMjN9LCB7ICA4LCAxNCwgIDF9LCB7ICA4LCAxNCwgIDV9LCB7ICA4LCAxNCwgMjJ9LAorICAgIHsgIDgsIDE0LCAyM30sIHsgIDgsIDE4LCAgMX0sIHsgIDgsIDE4LCAgNX0sIHsgIDgsIDE4LCAgOX0sCisgICAgeyAgOCwgMTgsIDE5fSwgeyAgOCwgMTgsIDIxfSwgeyAgOCwgMTgsIDIzfSwgeyAgOCwgMTksICAxfSwKKyAgICB7ICA4LCAxOSwgIDV9LCB7ICA4LCAxOSwgIDl9LCB7ICA4LCAxOSwgMTl9LCB7ICA4LCAxOSwgMjF9LAorICAgIHsgIDgsIDIwLCAgMX0sIHsgIDgsIDIwLCAgMn0sIHsgIDgsIDIwLCAgM30sIHsgIDgsIDIwLCAgNX0sCisgICAgeyAgOCwgMjAsICA4fSwgeyAgOCwgMjAsICA5fSwgeyAgOCwgMjAsIDEwfSwgeyAgOCwgMjAsIDExfSwKKyAgICB7ICA4LCAyMCwgMTd9LCB7ICA4LCAyMCwgMTl9LCB7ICA4LCAyMCwgMjF9LCB7ICA4LCAyMCwgMjN9LAorICAgIHsgIDgsIDIwLCAyN30sIHsgIDgsIDIwLCAyOX0sIHsgIDgsIDIxLCAgMX0sIHsgIDgsIDIxLCAgNX0sCisgICAgeyAgOCwgMjEsICA5fSwgeyAgOCwgMjEsIDE5fSwgeyAgOCwgMjEsIDIxfSwgeyAgOCwgMjIsICAxfSwKKyAgICB7ICA4LCAyMywgIDF9LCB7ICA4LCAyMywgIDV9LCB7ICA4LCAyMywgIDl9LCB7ICA4LCAyNiwgIDF9LAorICAgIHsgIDgsIDI2LCAgNX0sIHsgIDgsIDI2LCAgOX0sIHsgIDgsIDI2LCAxN30sIHsgIDgsIDI2LCAyMX0sCisgICAgeyAgOCwgMjcsICAxfSwgeyAgOCwgMjcsICA1fSwgeyAgOCwgMjcsICA5fSwgeyAgOCwgMjcsIDE3fSwKKyAgICB7ICA4LCAyNywgMjF9LCB7ICA4LCAyOSwgIDF9LCB7ICA4LCAyOSwgIDJ9LCB7ICA4LCAyOSwgIDV9LAorICAgIHsgIDgsIDI5LCAgOH0sIHsgIDgsIDI5LCAgOX0sIHsgIDgsIDI5LCAxMX0sIHsgIDgsIDI5LCAxN30sCisgICAgeyAgOCwgMjksIDE5fSwgeyAgOCwgMjksIDIxfSwgeyAgOCwgMjksIDIyfSwgeyAgOCwgMjksIDIzfSwKKyAgICB7ICA4LCAyOSwgMjV9LCB7ICA4LCAyOSwgMjd9LCB7ICA5LCAgMywgIDF9LCB7ICA5LCAgMywgIDJ9LAorICAgIHsgIDksICAzLCAgM30sIHsgIDksICAzLCAgNH0sIHsgIDksICAzLCAgNX0sIHsgIDksICAzLCAgOH0sCisgICAgeyAgOSwgIDMsICA5fSwgeyAgOSwgIDMsIDEwfSwgeyAgOSwgIDMsIDExfSwgeyAgOSwgIDMsIDEyfSwKKyAgICB7ICA5LCAgMywgMTd9LCB7ICA5LCAgMywgMTl9LCB7ICA5LCAgMywgMjF9LCB7ICA5LCAgMywgMjN9LAorICAgIHsgIDksICAzLCAyN30sIHsgIDksICA0LCAgMX0sIHsgIDksICA0LCAgMn0sIHsgIDksICA0LCAgNX0sCisgICAgeyAgOSwgIDQsICA5fSwgeyAgOSwgIDQsIDE3fSwgeyAgOSwgIDQsIDE5fSwgeyAgOSwgIDQsIDIxfSwKKyAgICB7ICA5LCAgNCwgMjJ9LCB7ICA5LCAgNCwgMjN9LCB7ICA5LCAgNCwgMjd9LCB7ICA5LCAgNSwgIDF9LAorICAgIHsgIDksICA1LCAgMn0sIHsgIDksICA1LCAgNX0sIHsgIDksICA1LCAxOX0sIHsgIDksICA3LCAgMX0sCisgICAgeyAgOSwgIDcsICAyfSwgeyAgOSwgIDcsICA1fSwgeyAgOSwgIDcsICA4fSwgeyAgOSwgIDcsICA5fSwKKyAgICB7ICA5LCAgNywgMTF9LCB7ICA5LCAgNywgMTd9LCB7ICA5LCAgNywgMTl9LCB7ICA5LCAgNywgMjF9LAorICAgIHsgIDksICA3LCAyM30sIHsgIDksICA3LCAyNH0sIHsgIDksIDEwLCAgMX0sIHsgIDksIDEwLCAgMn0sCisgICAgeyAgOSwgMTAsICA1fSwgeyAgOSwgMTAsICA4fSwgeyAgOSwgMTAsICA5fSwgeyAgOSwgMTAsIDE3fSwKKyAgICB7ICA5LCAxMCwgMTl9LCB7ICA5LCAxMCwgMjF9LCB7ICA5LCAxMCwgMjJ9LCB7ICA5LCAxMCwgMjN9LAorICAgIHsgIDksIDExLCAgMX0sIHsgIDksIDExLCAgMn0sIHsgIDksIDExLCAgNX0sIHsgIDksIDExLCAgOX0sCisgICAgeyAgOSwgMTEsIDE5fSwgeyAgOSwgMTEsIDIxfSwgeyAgOSwgMTEsIDIyfSwgeyAgOSwgMTEsIDIzfSwKKyAgICB7ICA5LCAxMSwgMjd9LCB7ICA5LCAxMiwgIDF9LCB7ICA5LCAxMiwgIDV9LCB7ICA5LCAxMywgIDF9LAorICAgIHsgIDksIDEzLCAgMn0sIHsgIDksIDEzLCAgM30sIHsgIDksIDEzLCAgNX0sIHsgIDksIDEzLCAgOX0sCisgICAgeyAgOSwgMTMsIDE3fSwgeyAgOSwgMTMsIDE5fSwgeyAgOSwgMTMsIDIxfSwgeyAgOSwgMTMsIDIzfSwKKyAgICB7ICA5LCAxNCwgIDF9LCB7ICA5LCAxNCwgIDV9LCB7ICA5LCAxNCwgMjJ9LCB7ICA5LCAxNSwgIDF9LAorICAgIHsgIDksIDE1LCAyMn0sIHsgIDksIDE4LCAgMX0sIHsgIDksIDE4LCAgMn0sIHsgIDksIDE4LCAgNX0sCisgICAgeyAgOSwgMTgsICA5fSwgeyAgOSwgMTgsIDE3fSwgeyAgOSwgMTgsIDE5fSwgeyAgOSwgMTksICAxfSwKKyAgICB7ICA5LCAxOSwgIDV9LCB7ICA5LCAyMCwgIDF9LCB7ICA5LCAyMCwgIDJ9LCB7ICA5LCAyMCwgIDV9LAorICAgIHsgIDksIDIwLCAgOH0sIHsgIDksIDIwLCAgOX0sIHsgIDksIDIwLCAxMH0sIHsgIDksIDIwLCAxMX0sCisgICAgeyAgOSwgMjAsIDE3fSwgeyAgOSwgMjAsIDE5fSwgeyAgOSwgMjAsIDIxfSwgeyAgOSwgMjAsIDIzfSwKKyAgICB7ICA5LCAyMCwgMjd9LCB7ICA5LCAyMCwgMjh9LCB7ICA5LCAyMSwgIDF9LCB7ICA5LCAyMSwgIDl9LAorICAgIHsgIDksIDIxLCAyMn0sIHsgIDksIDIyLCAgMX0sIHsgIDksIDIzLCAgMX0sIHsgIDksIDIzLCAgMn0sCisgICAgeyAgOSwgMjMsICA1fSwgeyAgOSwgMjMsICA5fSwgeyAgOSwgMjMsIDIzfSwgeyAgOSwgMjYsICAxfSwKKyAgICB7ICA5LCAyNiwgIDV9LCB7ICA5LCAyNiwgIDl9LCB7ICA5LCAyNiwgMTd9LCB7ICA5LCAyNiwgMjF9LAorICAgIHsgIDksIDI2LCAyM30sIHsgIDksIDI3LCAgMX0sIHsgIDksIDI3LCAgMn0sIHsgIDksIDI3LCAgNX0sCisgICAgeyAgOSwgMjcsICA5fSwgeyAgOSwgMjcsIDE3fSwgeyAgOSwgMjcsIDE5fSwgeyAgOSwgMjcsIDIxfSwKKyAgICB7ICA5LCAyOSwgIDF9LCB7ICA5LCAyOSwgIDJ9LCB7ICA5LCAyOSwgIDV9LCB7ICA5LCAyOSwgIDl9LAorICAgIHsgIDksIDI5LCAxMX0sIHsgIDksIDI5LCAxN30sIHsgIDksIDI5LCAxOX0sIHsgIDksIDI5LCAyMX0sCisgICAgeyAgOSwgMjksIDIzfSwgeyAgOSwgMjksIDI0fSwgeyAgOSwgMjksIDI1fSwgeyAxMCwgIDMsICAxfSwKKyAgICB7IDEwLCAgMywgIDJ9LCB7IDEwLCAgMywgIDV9LCB7IDEwLCAgMywgIDl9LCB7IDEwLCAgMywgMTF9LAorICAgIHsgMTAsICAzLCAxN30sIHsgMTAsICAzLCAxOX0sIHsgMTAsICAzLCAyMX0sIHsgMTAsICAzLCAyMn0sCisgICAgeyAxMCwgIDMsIDIzfSwgeyAxMCwgIDMsIDI5fSwgeyAxMCwgIDQsICAxfSwgeyAxMCwgIDQsICAyfSwKKyAgICB7IDEwLCAgNCwgIDV9LCB7IDEwLCAgNCwgIDl9LCB7IDEwLCAgNCwgMTd9LCB7IDEwLCAgNCwgMTl9LAorICAgIHsgMTAsICA0LCAyMX0sIHsgMTAsICA0LCAyMn0sIHsgMTAsICA0LCAyM30sIHsgMTAsICA1LCAgMX0sCisgICAgeyAxMCwgIDUsICAyfSwgeyAxMCwgIDUsIDE3fSwgeyAxMCwgIDcsICAxfSwgeyAxMCwgIDcsICAyfSwKKyAgICB7IDEwLCAgNywgIDV9LCB7IDEwLCAgNywgIDh9LCB7IDEwLCAgNywgIDl9LCB7IDEwLCAgNywgMTd9LAorICAgIHsgMTAsICA3LCAyMX0sIHsgMTAsICA3LCAyMn0sIHsgMTAsICA3LCAyM30sIHsgMTAsIDEwLCAgMX0sCisgICAgeyAxMCwgMTAsIDIzfSwgeyAxMCwgMTEsICAxfSwgeyAxMCwgMTEsICAyfSwgeyAxMCwgMTEsIDE3fSwKKyAgICB7IDEwLCAxMSwgMTl9LCB7IDEwLCAxMSwgMjF9LCB7IDEwLCAxMSwgMjJ9LCB7IDEwLCAxMSwgMjN9LAorICAgIHsgMTAsIDEzLCAgMX0sIHsgMTAsIDEzLCAgMn0sIHsgMTAsIDEzLCAgNX0sIHsgMTAsIDEzLCAgOX0sCisgICAgeyAxMCwgMTMsIDE3fSwgeyAxMCwgMTMsIDE5fSwgeyAxMCwgMTMsIDIzfSwgeyAxMCwgMTgsICAxfSwKKyAgICB7IDEwLCAxOSwgIDF9LCB7IDEwLCAxOSwgMjN9LCB7IDEwLCAyMCwgIDF9LCB7IDEwLCAyMCwgIDJ9LAorICAgIHsgMTAsIDIwLCAgNX0sIHsgMTAsIDIwLCAgOX0sIHsgMTAsIDIwLCAxN30sIHsgMTAsIDIwLCAyMX0sCisgICAgeyAxMCwgMjAsIDIzfSwgeyAxMCwgMjYsICAxfSwgeyAxMCwgMjYsIDIzfSwgeyAxMCwgMjcsICAxfSwKKyAgICB7IDEwLCAyNywgIDV9LCB7IDEwLCAyNywgIDl9LCB7IDEwLCAyNywgMTd9LCB7IDEwLCAyNywgMTl9LAorICAgIHsgMTAsIDI5LCAgMX0sIHsgMTAsIDI5LCAgMn0sIHsgMTAsIDI5LCAgNX0sIHsgMTAsIDI5LCAgOX0sCisgICAgeyAxMCwgMjksIDE3fSwgeyAxMCwgMjksIDE5fSwgeyAxMCwgMjksIDIxfSwgeyAxMCwgMjksIDIzfSwKKyAgICB7IDExLCAgMywgIDF9LCB7IDExLCAgMywgIDJ9LCB7IDExLCAgMywgIDR9LCB7IDExLCAgMywgIDV9LAorICAgIHsgMTEsICAzLCAgOH0sIHsgMTEsICAzLCAgOX0sIHsgMTEsICAzLCAxMH0sIHsgMTEsICAzLCAxMX0sCisgICAgeyAxMSwgIDMsIDE3fSwgeyAxMSwgIDMsIDE5fSwgeyAxMSwgIDMsIDIxfSwgeyAxMSwgIDMsIDIyfSwKKyAgICB7IDExLCAgMywgMjN9LCB7IDExLCAgMywgMjd9LCB7IDExLCAgNCwgIDF9LCB7IDExLCAgNCwgIDJ9LAorICAgIHsgMTEsICA0LCAgNX0sIHsgMTEsICA0LCAgOX0sIHsgMTEsICA0LCAxN30sIHsgMTEsICA0LCAxOX0sCisgICAgeyAxMSwgIDQsIDIxfSwgeyAxMSwgIDQsIDIyfSwgeyAxMSwgIDQsIDIzfSwgeyAxMSwgIDUsICAxfSwKKyAgICB7IDExLCAgNSwgIDJ9LCB7IDExLCAgNSwgIDV9LCB7IDExLCAgNSwgIDl9LCB7IDExLCAgNSwgMTd9LAorICAgIHsgMTEsICA1LCAxOX0sIHsgMTEsICA1LCAyMX0sIHsgMTEsICA1LCAyM30sIHsgMTEsICA2LCAgMX0sCisgICAgeyAxMSwgIDYsICA1fSwgeyAxMSwgIDYsICA5fSwgeyAxMSwgIDYsIDE3fSwgeyAxMSwgIDYsIDIzfSwKKyAgICB7IDExLCAgNywgIDF9LCB7IDExLCAgNywgIDJ9LCB7IDExLCAgNywgIDN9LCB7IDExLCAgNywgIDR9LAorICAgIHsgMTEsICA3LCAgNX0sIHsgMTEsICA3LCAgOH0sIHsgMTEsICA3LCAgOX0sIHsgMTEsICA3LCAxMX0sCisgICAgeyAxMSwgIDcsIDEyfSwgeyAxMSwgIDcsIDE3fSwgeyAxMSwgIDcsIDE5fSwgeyAxMSwgIDcsIDIxfSwKKyAgICB7IDExLCAgNywgMjJ9LCB7IDExLCAgNywgMjN9LCB7IDExLCAgNywgMjh9LCB7IDExLCAxMCwgIDF9LAorICAgIHsgMTEsIDEwLCAgMn0sIHsgMTEsIDEwLCAgNX0sIHsgMTEsIDEwLCAgOX0sIHsgMTEsIDEwLCAxN30sCisgICAgeyAxMSwgMTAsIDE5fSwgeyAxMSwgMTAsIDIxfSwgeyAxMSwgMTAsIDIyfSwgeyAxMSwgMTAsIDIzfSwKKyAgICB7IDExLCAxMSwgIDF9LCB7IDExLCAxMSwgIDJ9LCB7IDExLCAxMSwgIDV9LCB7IDExLCAxMSwgIDl9LAorICAgIHsgMTEsIDExLCAxN30sIHsgMTEsIDExLCAxOX0sIHsgMTEsIDExLCAyMX0sIHsgMTEsIDExLCAyMn0sCisgICAgeyAxMSwgMTEsIDIzfSwgeyAxMSwgMTIsICAxfSwgeyAxMSwgMTIsICA1fSwgeyAxMSwgMTIsICA5fSwKKyAgICB7IDExLCAxMiwgMjN9LCB7IDExLCAxMywgIDF9LCB7IDExLCAxMywgIDJ9LCB7IDExLCAxMywgIDN9LAorICAgIHsgMTEsIDEzLCAgNX0sIHsgMTEsIDEzLCAgOX0sIHsgMTEsIDEzLCAxMX0sIHsgMTEsIDEzLCAxN30sCisgICAgeyAxMSwgMTMsIDE5fSwgeyAxMSwgMTMsIDIxfSwgeyAxMSwgMTMsIDIzfSwgeyAxMSwgMTMsIDI3fSwKKyAgICB7IDExLCAxNCwgIDF9LCB7IDExLCAxNCwgIDJ9LCB7IDExLCAxNCwgIDV9LCB7IDExLCAxNCwgIDl9LAorICAgIHsgMTEsIDE0LCAyM30sIHsgMTEsIDE1LCAgMX0sIHsgMTEsIDE1LCAgNX0sIHsgMTEsIDE1LCAgOX0sCisgICAgeyAxMSwgMTUsIDE3fSwgeyAxMSwgMTUsIDIxfSwgeyAxMSwgMTUsIDIyfSwgeyAxMSwgMTgsICAxfSwKKyAgICB7IDExLCAxOCwgIDV9LCB7IDExLCAxOCwgIDl9LCB7IDExLCAxOCwgMTd9LCB7IDExLCAxOCwgMTl9LAorICAgIHsgMTEsIDE4LCAyMX0sIHsgMTEsIDE5LCAgMX0sIHsgMTEsIDE5LCAgMn0sIHsgMTEsIDE5LCAgNX0sCisgICAgeyAxMSwgMTksICA5fSwgeyAxMSwgMTksIDE3fSwgeyAxMSwgMTksIDE5fSwgeyAxMSwgMTksIDIxfSwKKyAgICB7IDExLCAxOSwgMjN9LCB7IDExLCAyMCwgIDF9LCB7IDExLCAyMCwgIDJ9LCB7IDExLCAyMCwgIDV9LAorICAgIHsgMTEsIDIwLCAgOH0sIHsgMTEsIDIwLCAgOX0sIHsgMTEsIDIwLCAxN30sIHsgMTEsIDIwLCAxOX0sCisgICAgeyAxMSwgMjAsIDIxfSwgeyAxMSwgMjAsIDIzfSwgeyAxMSwgMjAsIDI1fSwgeyAxMSwgMjAsIDI3fSwKKyAgICB7IDExLCAyMCwgMjh9LCB7IDExLCAyMSwgIDF9LCB7IDExLCAyMSwgMjJ9LCB7IDExLCAyMiwgIDF9LAorICAgIHsgMTEsIDIyLCAgMn0sIHsgMTEsIDIyLCAgNX0sIHsgMTEsIDIyLCAgOX0sIHsgMTEsIDIyLCAxN30sCisgICAgeyAxMSwgMjIsIDIzfSwgeyAxMSwgMjMsICAxfSwgeyAxMSwgMjMsICAyfSwgeyAxMSwgMjMsICA1fSwKKyAgICB7IDExLCAyMywgIDl9LCB7IDExLCAyMywgMTd9LCB7IDExLCAyMywgMTl9LCB7IDExLCAyMywgMjF9LAorICAgIHsgMTEsIDIzLCAyM30sIHsgMTEsIDI2LCAgMX0sIHsgMTEsIDI2LCAgMn0sIHsgMTEsIDI2LCAgOX0sCisgICAgeyAxMSwgMjYsIDE3fSwgeyAxMSwgMjYsIDIxfSwgeyAxMSwgMjYsIDIzfSwgeyAxMSwgMjcsICAxfSwKKyAgICB7IDExLCAyNywgIDJ9LCB7IDExLCAyNywgIDV9LCB7IDExLCAyNywgIDl9LCB7IDExLCAyNywgMTB9LAorICAgIHsgMTEsIDI3LCAxN30sIHsgMTEsIDI3LCAxOX0sIHsgMTEsIDI3LCAyMX0sIHsgMTEsIDI3LCAyM30sCisgICAgeyAxMSwgMjksICAxfSwgeyAxMSwgMjksICAyfSwgeyAxMSwgMjksICA1fSwgeyAxMSwgMjksICA4fSwKKyAgICB7IDExLCAyOSwgIDl9LCB7IDExLCAyOSwgMTZ9LCB7IDExLCAyOSwgMTd9LCB7IDExLCAyOSwgMTl9LAorICAgIHsgMTEsIDI5LCAyMX0sIHsgMTEsIDI5LCAyM30sIHsgMTEsIDI5LCAyOH0sIHsgMTIsICAzLCAgMX0sCisgICAgeyAxMiwgIDMsICAyfSwgeyAxMiwgIDMsICA0fSwgeyAxMiwgIDMsICA1fSwgeyAxMiwgIDMsICA5fSwKKyAgICB7IDEyLCAgMywgMTd9LCB7IDEyLCAgMywgMTl9LCB7IDEyLCAgMywgMjJ9LCB7IDEyLCAgMywgMjN9LAorICAgIHsgMTIsICAzLCAyOX0sIHsgMTIsICA0LCAgMX0sIHsgMTIsICA0LCAgMn0sIHsgMTIsICA0LCAgNX0sCisgICAgeyAxMiwgIDQsICA5fSwgeyAxMiwgIDQsIDE3fSwgeyAxMiwgIDQsIDE5fSwgeyAxMiwgIDQsIDIyfSwKKyAgICB7IDEyLCAgNCwgMjN9LCB7IDEyLCAgNSwgMjN9LCB7IDEyLCAgNywgIDF9LCB7IDEyLCAgNywgIDJ9LAorICAgIHsgMTIsICA3LCAgNX0sIHsgMTIsICA3LCAgOX0sIHsgMTIsICA3LCAxMX0sIHsgMTIsICA3LCAxN30sCisgICAgeyAxMiwgIDcsIDE5fSwgeyAxMiwgIDcsIDIyfSwgeyAxMiwgIDcsIDIzfSwgeyAxMiwgMTAsICAxfSwKKyAgICB7IDEyLCAxMCwgIDV9LCB7IDEyLCAxMCwgIDl9LCB7IDEyLCAxMiwgIDV9LCB7IDEyLCAxMywgIDF9LAorICAgIHsgMTIsIDEzLCAgMn0sIHsgMTIsIDEzLCAgNX0sIHsgMTIsIDEzLCAgOH0sIHsgMTIsIDEzLCAgOX0sCisgICAgeyAxMiwgMTMsIDExfSwgeyAxMiwgMTMsIDE3fSwgeyAxMiwgMTMsIDE5fSwgeyAxMiwgMTMsIDIzfSwKKyAgICB7IDEyLCAxNCwgIDF9LCB7IDEyLCAxNCwgIDJ9LCB7IDEyLCAxNCwgIDV9LCB7IDEyLCAxNCwgMjJ9LAorICAgIHsgMTIsIDE1LCAgMX0sIHsgMTIsIDE1LCAyMn0sIHsgMTIsIDE4LCAgMX0sIHsgMTIsIDE4LCAgNX0sCisgICAgeyAxMiwgMTgsICA5fSwgeyAxMiwgMTgsIDE3fSwgeyAxMiwgMTgsIDE5fSwgeyAxMiwgMTksICAxfSwKKyAgICB7IDEyLCAyMCwgIDF9LCB7IDEyLCAyMCwgIDJ9LCB7IDEyLCAyMCwgIDV9LCB7IDEyLCAyMCwgIDl9LAorICAgIHsgMTIsIDIwLCAxN30sIHsgMTIsIDIwLCAxOX0sIHsgMTIsIDIwLCAyM30sIHsgMTIsIDIxLCAgMX0sCisgICAgeyAxMiwgMjEsIDIyfSwgeyAxMiwgMjIsICAxfSwgeyAxMiwgMjMsICAxfSwgeyAxMiwgMjMsICA1fSwKKyAgICB7IDEyLCAyNiwgMjN9LCB7IDEyLCAyNywgIDF9LCB7IDEyLCAyNywgIDJ9LCB7IDEyLCAyNywgIDV9LAorICAgIHsgMTIsIDI3LCAgOX0sIHsgMTIsIDI3LCAxMX0sIHsgMTIsIDI3LCAxNn0sIHsgMTIsIDI3LCAxN30sCisgICAgeyAxMiwgMjcsIDE5fSwgeyAxMiwgMjgsICAxfSwgeyAxMiwgMjgsICA1fSwgeyAxMiwgMjgsICA5fSwKKyAgICB7IDEyLCAyOCwgMTd9LCB7IDEyLCAyOSwgIDF9LCB7IDEyLCAyOSwgIDJ9LCB7IDEyLCAyOSwgIDV9LAorICAgIHsgMTIsIDI5LCAgOX0sIHsgMTIsIDI5LCAxN30sIHsgMTIsIDI5LCAxOX0sIHsgMTIsIDI5LCAyMX0sCisgICAgeyAxMiwgMjksIDIzfSwgeyAxMywgIDMsICAxfSwgeyAxMywgIDMsICAyfSwgeyAxMywgIDMsICA1fSwKKyAgICB7IDEzLCAgMywgIDZ9LCB7IDEzLCAgMywgIDd9LCB7IDEzLCAgMywgIDl9LCB7IDEzLCAgMywgMTB9LAorICAgIHsgMTMsICAzLCAxMX0sIHsgMTMsICAzLCAxNn0sIHsgMTMsICAzLCAxN30sIHsgMTMsICAzLCAxOX0sCisgICAgeyAxMywgIDMsIDIxfSwgeyAxMywgIDMsIDIyfSwgeyAxMywgIDMsIDIzfSwgeyAxMywgIDMsIDI3fSwKKyAgICB7IDEzLCAgMywgMjh9LCB7IDEzLCAgNCwgIDF9LCB7IDEzLCAgNCwgIDJ9LCB7IDEzLCAgNCwgIDV9LAorICAgIHsgMTMsICA0LCAgOX0sIHsgMTMsICA0LCAxN30sIHsgMTMsICA0LCAxOX0sIHsgMTMsICA0LCAyMX0sCisgICAgeyAxMywgIDQsIDIyfSwgeyAxMywgIDQsIDIzfSwgeyAxMywgIDUsICAxfSwgeyAxMywgIDUsICAyfSwKKyAgICB7IDEzLCAgNSwgIDV9LCB7IDEzLCAgNSwgIDl9LCB7IDEzLCAgNSwgMTJ9LCB7IDEzLCAgNSwgMTd9LAorICAgIHsgMTMsICA1LCAxOX0sIHsgMTMsICA1LCAyMX0sIHsgMTMsICA1LCAyM30sIHsgMTMsICA1LCAyN30sCisgICAgeyAxMywgIDUsIDI5fSwgeyAxMywgIDYsICAxfSwgeyAxMywgIDYsICA1fSwgeyAxMywgIDYsICA5fSwKKyAgICB7IDEzLCAgNiwgMTl9LCB7IDEzLCAgNywgIDF9LCB7IDEzLCAgNywgIDJ9LCB7IDEzLCAgNywgIDV9LAorICAgIHsgMTMsICA3LCAgNn0sIHsgMTMsICA3LCAgOH0sIHsgMTMsICA3LCAgOX0sIHsgMTMsICA3LCAxMH0sCisgICAgeyAxMywgIDcsIDExfSwgeyAxMywgIDcsIDE3fSwgeyAxMywgIDcsIDE5fSwgeyAxMywgIDcsIDIwfSwKKyAgICB7IDEzLCAgNywgMjF9LCB7IDEzLCAgNywgMjJ9LCB7IDEzLCAgNywgMjN9LCB7IDEzLCAgNywgMjR9LAorICAgIHsgMTMsICA3LCAyNn0sIHsgMTMsICA3LCAyOH0sIHsgMTMsIDEwLCAgMX0sIHsgMTMsIDEwLCAgMn0sCisgICAgeyAxMywgMTAsICA1fSwgeyAxMywgMTAsICA5fSwgeyAxMywgMTAsIDE3fSwgeyAxMywgMTAsIDE5fSwKKyAgICB7IDEzLCAxMCwgMjF9LCB7IDEzLCAxMCwgMjN9LCB7IDEzLCAxMSwgIDF9LCB7IDEzLCAxMSwgIDJ9LAorICAgIHsgMTMsIDExLCAgM30sIHsgMTMsIDExLCAgNX0sIHsgMTMsIDExLCAgOX0sIHsgMTMsIDExLCAxMX0sCisgICAgeyAxMywgMTEsIDEyfSwgeyAxMywgMTEsIDE3fSwgeyAxMywgMTEsIDE5fSwgeyAxMywgMTEsIDIwfSwKKyAgICB7IDEzLCAxMSwgMjF9LCB7IDEzLCAxMSwgMjJ9LCB7IDEzLCAxMSwgMjN9LCB7IDEzLCAxMSwgMjd9LAorICAgIHsgMTMsIDExLCAyOH0sIHsgMTMsIDExLCAyOX0sIHsgMTMsIDEyLCAgMX0sIHsgMTMsIDEyLCAgNX0sCisgICAgeyAxMywgMTIsICA5fSwgeyAxMywgMTIsIDE3fSwgeyAxMywgMTIsIDE5fSwgeyAxMywgMTIsIDIxfSwKKyAgICB7IDEzLCAxMiwgMjJ9LCB7IDEzLCAxMywgIDF9LCB7IDEzLCAxMywgIDJ9LCB7IDEzLCAxMywgIDV9LAorICAgIHsgMTMsIDEzLCAgOX0sIHsgMTMsIDEzLCAxMH0sIHsgMTMsIDEzLCAxMX0sIHsgMTMsIDEzLCAxM30sCisgICAgeyAxMywgMTMsIDE2fSwgeyAxMywgMTMsIDE3fSwgeyAxMywgMTMsIDE5fSwgeyAxMywgMTMsIDIxfSwKKyAgICB7IDEzLCAxMywgMjN9LCB7IDEzLCAxMywgMjV9LCB7IDEzLCAxNCwgIDF9LCB7IDEzLCAxNCwgIDJ9LAorICAgIHsgMTMsIDE0LCAgNX0sIHsgMTMsIDE0LCAgOX0sIHsgMTMsIDE0LCAxN30sIHsgMTMsIDE0LCAxOX0sCisgICAgeyAxMywgMTQsIDIxfSwgeyAxMywgMTQsIDIyfSwgeyAxMywgMTQsIDIzfSwgeyAxMywgMTUsICAxfSwKKyAgICB7IDEzLCAxNSwgIDJ9LCB7IDEzLCAxNSwgIDV9LCB7IDEzLCAxNSwgMTd9LCB7IDEzLCAxNSwgMjF9LAorICAgIHsgMTMsIDE1LCAyM30sIHsgMTMsIDE4LCAgMX0sIHsgMTMsIDE4LCAgMn0sIHsgMTMsIDE4LCAgNX0sCisgICAgeyAxMywgMTgsICA5fSwgeyAxMywgMTgsIDE3fSwgeyAxMywgMTgsIDE5fSwgeyAxMywgMTgsIDIxfSwKKyAgICB7IDEzLCAxOCwgMjN9LCB7IDEzLCAxOSwgIDF9LCB7IDEzLCAxOSwgIDJ9LCB7IDEzLCAxOSwgIDV9LAorICAgIHsgMTMsIDE5LCAgOX0sIHsgMTMsIDE5LCAxN30sIHsgMTMsIDE5LCAxOX0sIHsgMTMsIDE5LCAyMX0sCisgICAgeyAxMywgMTksIDIzfSwgeyAxMywgMjAsICAxfSwgeyAxMywgMjAsICAyfSwgeyAxMywgMjAsICA1fSwKKyAgICB7IDEzLCAyMCwgIDl9LCB7IDEzLCAyMCwgMTB9LCB7IDEzLCAyMCwgMTF9LCB7IDEzLCAyMCwgMTd9LAorICAgIHsgMTMsIDIwLCAxOX0sIHsgMTMsIDIwLCAyMX0sIHsgMTMsIDIwLCAyM30sIHsgMTMsIDIxLCAgMX0sCisgICAgeyAxMywgMjEsICAyfSwgeyAxMywgMjEsICA1fSwgeyAxMywgMjEsICA5fSwgeyAxMywgMjEsIDE3fSwKKyAgICB7IDEzLCAyMSwgMTl9LCB7IDEzLCAyMSwgMjJ9LCB7IDEzLCAyMSwgMjN9LCB7IDEzLCAyMiwgIDF9LAorICAgIHsgMTMsIDIyLCAgMn0sIHsgMTMsIDIyLCAgNX0sIHsgMTMsIDIyLCAgOX0sIHsgMTMsIDIyLCAxN30sCisgICAgeyAxMywgMjIsIDE5fSwgeyAxMywgMjIsIDIzfSwgeyAxMywgMjMsICAxfSwgeyAxMywgMjMsICAyfSwKKyAgICB7IDEzLCAyMywgIDV9LCB7IDEzLCAyMywgIDl9LCB7IDEzLCAyMywgMTd9LCB7IDEzLCAyMywgMTl9LAorICAgIHsgMTMsIDIzLCAyMX0sIHsgMTMsIDIzLCAyM30sIHsgMTMsIDI2LCAgMX0sIHsgMTMsIDI2LCAgMn0sCisgICAgeyAxMywgMjYsICA1fSwgeyAxMywgMjYsICA5fSwgeyAxMywgMjYsIDE3fSwgeyAxMywgMjYsIDE5fSwKKyAgICB7IDEzLCAyNiwgMjF9LCB7IDEzLCAyNiwgMjN9LCB7IDEzLCAyNiwgMjV9LCB7IDEzLCAyNywgIDF9LAorICAgIHsgMTMsIDI3LCAgMn0sIHsgMTMsIDI3LCAgNX0sIHsgMTMsIDI3LCAgOX0sIHsgMTMsIDI3LCAxNX0sCisgICAgeyAxMywgMjcsIDE3fSwgeyAxMywgMjcsIDE5fSwgeyAxMywgMjcsIDIxfSwgeyAxMywgMjcsIDIzfSwKKyAgICB7IDEzLCAyNywgMjR9LCB7IDEzLCAyNywgMjV9LCB7IDEzLCAyNywgMjZ9LCB7IDEzLCAyNywgMjd9LAorICAgIHsgMTMsIDI3LCAyOH0sIHsgMTMsIDI3LCAyOX0sIHsgMTMsIDI4LCAgMX0sIHsgMTMsIDI4LCAgNX0sCisgICAgeyAxMywgMjgsICA5fSwgeyAxMywgMjgsIDE3fSwgeyAxMywgMjgsIDIxfSwgeyAxMywgMjksICAxfSwKKyAgICB7IDEzLCAyOSwgIDJ9LCB7IDEzLCAyOSwgIDV9LCB7IDEzLCAyOSwgIDl9LCB7IDEzLCAyOSwgMTB9LAorICAgIHsgMTMsIDI5LCAxMX0sIHsgMTMsIDI5LCAxNn0sIHsgMTMsIDI5LCAxN30sIHsgMTMsIDI5LCAxOX0sCisgICAgeyAxMywgMjksIDIxfSwgeyAxMywgMjksIDIyfSwgeyAxMywgMjksIDIzfSwgeyAxMywgMjksIDI0fSwKKyAgICB7IDEzLCAyOSwgMjh9LCB7IDE0LCAgMywgIDF9LCB7IDE0LCAgMywgIDJ9LCB7IDE0LCAgMywgIDV9LAorICAgIHsgMTQsICAzLCAgN30sIHsgMTQsICAzLCAgOH0sIHsgMTQsICAzLCAgOX0sIHsgMTQsICAzLCAxMX0sCisgICAgeyAxNCwgIDMsIDE3fSwgeyAxNCwgIDMsIDE5fSwgeyAxNCwgIDMsIDIxfSwgeyAxNCwgIDMsIDIyfSwKKyAgICB7IDE0LCAgMywgMjN9LCB7IDE0LCAgMywgMjR9LCB7IDE0LCAgNCwgIDF9LCB7IDE0LCAgNCwgIDJ9LAorICAgIHsgMTQsICA0LCAgNX0sIHsgMTQsICA0LCAgOX0sIHsgMTQsICA0LCAxN30sIHsgMTQsICA0LCAxOX0sCisgICAgeyAxNCwgIDQsIDIxfSwgeyAxNCwgIDQsIDIyfSwgeyAxNCwgIDQsIDIzfSwgeyAxNCwgIDUsICAxfSwKKyAgICB7IDE0LCAgNSwgIDJ9LCB7IDE0LCAgNSwgIDV9LCB7IDE0LCAgNSwgIDd9LCB7IDE0LCAgNSwgIDl9LAorICAgIHsgMTQsICA1LCAxN30sIHsgMTQsICA1LCAyM30sIHsgMTQsICA2LCAgMX0sIHsgMTQsICA2LCAgNX0sCisgICAgeyAxNCwgIDYsICA5fSwgeyAxNCwgIDcsICAxfSwgeyAxNCwgIDcsICAyfSwgeyAxNCwgIDcsICA1fSwKKyAgICB7IDE0LCAgNywgIDl9LCB7IDE0LCAgNywgMTF9LCB7IDE0LCAgNywgMTd9LCB7IDE0LCAgNywgMTl9LAorICAgIHsgMTQsICA3LCAyMX0sIHsgMTQsICA3LCAyM30sIHsgMTQsICA3LCAyNH0sIHsgMTQsIDEwLCAgMX0sCisgICAgeyAxNCwgMTAsICAyfSwgeyAxNCwgMTAsICA1fSwgeyAxNCwgMTAsICA5fSwgeyAxNCwgMTAsIDE3fSwKKyAgICB7IDE0LCAxMCwgMTl9LCB7IDE0LCAxMCwgMjF9LCB7IDE0LCAxMCwgMjN9LCB7IDE0LCAxMSwgIDF9LAorICAgIHsgMTQsIDExLCAgNX0sIHsgMTQsIDExLCAgOX0sIHsgMTQsIDExLCAxN30sIHsgMTQsIDExLCAxOX0sCisgICAgeyAxNCwgMTEsIDIyfSwgeyAxNCwgMTEsIDIzfSwgeyAxNCwgMTIsICAxfSwgeyAxNCwgMTMsICAxfSwKKyAgICB7IDE0LCAxMywgIDJ9LCB7IDE0LCAxMywgIDV9LCB7IDE0LCAxMywgIDl9LCB7IDE0LCAxMywgMTF9LAorICAgIHsgMTQsIDEzLCAxN30sIHsgMTQsIDEzLCAxOX0sIHsgMTQsIDEzLCAyMX0sIHsgMTQsIDEzLCAyM30sCisgICAgeyAxNCwgMTMsIDI0fSwgeyAxNCwgMTMsIDI1fSwgeyAxNCwgMTMsIDI5fSwgeyAxNCwgMTQsICAxfSwKKyAgICB7IDE0LCAxNCwgIDJ9LCB7IDE0LCAxNCwgIDl9LCB7IDE0LCAxNCwgMTl9LCB7IDE0LCAxNCwgMjF9LAorICAgIHsgMTQsIDE0LCAyM30sIHsgMTQsIDE1LCAgMX0sIHsgMTQsIDE1LCAyMn0sIHsgMTQsIDE1LCAyM30sCisgICAgeyAxNCwgMTgsICAxfSwgeyAxNCwgMTgsICA1fSwgeyAxNCwgMTgsICA5fSwgeyAxNCwgMTgsIDE3fSwKKyAgICB7IDE0LCAxOCwgMTl9LCB7IDE0LCAxOCwgMjF9LCB7IDE0LCAxOCwgMjN9LCB7IDE0LCAxOSwgIDF9LAorICAgIHsgMTQsIDE5LCAgMn0sIHsgMTQsIDE5LCAgNX0sIHsgMTQsIDE5LCAyM30sIHsgMTQsIDIwLCAgMX0sCisgICAgeyAxNCwgMjAsICAyfSwgeyAxNCwgMjAsICA1fSwgeyAxNCwgMjAsICA5fSwgeyAxNCwgMjAsIDEwfSwKKyAgICB7IDE0LCAyMCwgMTF9LCB7IDE0LCAyMCwgMTd9LCB7IDE0LCAyMCwgMTl9LCB7IDE0LCAyMCwgMjF9LAorICAgIHsgMTQsIDIwLCAyM30sIHsgMTQsIDIxLCAgMX0sIHsgMTQsIDIxLCAyMn0sIHsgMTQsIDIyLCAgMX0sCisgICAgeyAxNCwgMjMsICAxfSwgeyAxNCwgMjMsICAyfSwgeyAxNCwgMjMsICA1fSwgeyAxNCwgMjMsICA5fSwKKyAgICB7IDE0LCAyMywgMTd9LCB7IDE0LCAyMywgMTl9LCB7IDE0LCAyMywgMjF9LCB7IDE0LCAyNiwgIDF9LAorICAgIHsgMTQsIDI2LCAgNX0sIHsgMTQsIDI2LCAgOX0sIHsgMTQsIDI2LCAxN30sIHsgMTQsIDI3LCAgMX0sCisgICAgeyAxNCwgMjcsICAyfSwgeyAxNCwgMjcsICA1fSwgeyAxNCwgMjcsICA5fSwgeyAxNCwgMjcsIDE3fSwKKyAgICB7IDE0LCAyNywgMTl9LCB7IDE0LCAyNywgMjF9LCB7IDE0LCAyNywgMjN9LCB7IDE0LCAyOSwgIDF9LAorICAgIHsgMTQsIDI5LCAgMn0sIHsgMTQsIDI5LCAgNX0sIHsgMTQsIDI5LCAgOH0sIHsgMTQsIDI5LCAgOX0sCisgICAgeyAxNCwgMjksIDExfSwgeyAxNCwgMjksIDE3fSwgeyAxNCwgMjksIDE5fSwgeyAxNCwgMjksIDIxfSwKKyAgICB7IDE0LCAyOSwgMjN9LCB7IDE0LCAyOSwgMjR9LCB7IDE0LCAyOSwgMjd9LCB7IDE0LCAyOSwgMjh9LAorICAgIHsgMTUsICAzLCAgMX0sIHsgMTUsICAzLCAgMn0sIHsgMTUsICAzLCAgNX0sIHsgMTUsICAzLCAgN30sCisgICAgeyAxNSwgIDMsICA5fSwgeyAxNSwgIDMsIDEyfSwgeyAxNSwgIDMsIDE3fSwgeyAxNSwgIDMsIDE5fSwKKyAgICB7IDE1LCAgMywgMjF9LCB7IDE1LCAgMywgMjJ9LCB7IDE1LCAgMywgMjN9LCB7IDE1LCAgNCwgIDF9LAorICAgIHsgMTUsICA0LCAgMn0sIHsgMTUsICA0LCAgNX0sIHsgMTUsICA0LCAgOX0sIHsgMTUsICA0LCAxN30sCisgICAgeyAxNSwgIDQsIDE5fSwgeyAxNSwgIDQsIDIxfSwgeyAxNSwgIDQsIDIyfSwgeyAxNSwgIDQsIDIzfSwKKyAgICB7IDE1LCAgNSwgIDF9LCB7IDE1LCAgNSwgIDV9LCB7IDE1LCAgNSwgMjN9LCB7IDE1LCAgNywgIDF9LAorICAgIHsgMTUsICA3LCAgMn0sIHsgMTUsICA3LCAgNX0sIHsgMTUsICA3LCAgOX0sIHsgMTUsICA3LCAxN30sCisgICAgeyAxNSwgIDcsIDE5fSwgeyAxNSwgIDcsIDIxfSwgeyAxNSwgIDcsIDIyfSwgeyAxNSwgIDcsIDIzfSwKKyAgICB7IDE1LCAxMCwgIDF9LCB7IDE1LCAxMCwgMjN9LCB7IDE1LCAxMSwgIDF9LCB7IDE1LCAxMSwgMjJ9LAorICAgIHsgMTUsIDEzLCAgMX0sIHsgMTUsIDEzLCAgMn0sIHsgMTUsIDEzLCAgNX0sIHsgMTUsIDEzLCAgOX0sCisgICAgeyAxNSwgMTMsIDE3fSwgeyAxNSwgMTMsIDE5fSwgeyAxNSwgMTMsIDIxfSwgeyAxNSwgMTMsIDIzfSwKKyAgICB7IDE1LCAxMywgMjV9LCB7IDE1LCAxNCwgIDF9LCB7IDE1LCAxNCwgIDJ9LCB7IDE1LCAxNCwgIDl9LAorICAgIHsgMTUsIDE0LCAyMn0sIHsgMTUsIDE1LCAgMX0sIHsgMTUsIDE1LCAyMn0sIHsgMTUsIDE4LCAgMX0sCisgICAgeyAxNSwgMTgsICA1fSwgeyAxNSwgMTgsICA5fSwgeyAxNSwgMTgsIDE3fSwgeyAxNSwgMTgsIDE5fSwKKyAgICB7IDE1LCAxOSwgMjN9LCB7IDE1LCAyMCwgIDF9LCB7IDE1LCAyMCwgIDJ9LCB7IDE1LCAyMCwgIDV9LAorICAgIHsgMTUsIDIwLCAgOX0sIHsgMTUsIDIwLCAxN30sIHsgMTUsIDIwLCAxOX0sIHsgMTUsIDIwLCAyM30sCisgICAgeyAxNSwgMjEsICAxfSwgeyAxNSwgMjEsIDIyfSwgeyAxNSwgMjEsIDIzfSwgeyAxNSwgMjMsICAxfSwKKyAgICB7IDE1LCAyNiwgIDF9LCB7IDE1LCAyNywgIDF9LCB7IDE1LCAyNywgMTd9LCB7IDE1LCAyNywgMjF9LAorICAgIHsgMTUsIDI3LCAyM30sIHsgMTUsIDI5LCAgMX0sIHsgMTUsIDI5LCAgMn0sIHsgMTUsIDI5LCAgNX0sCisgICAgeyAxNSwgMjksICA5fSwgeyAxNSwgMjksIDE3fSwgeyAxNSwgMjksIDE5fSwgeyAxNSwgMjksIDIzfSwKKyAgICB7IDE1LCAyOSwgMjR9LCB7IDE1LCAyOSwgMjl9LCB7IDE2LCAgMywgIDF9LCB7IDE2LCAgMywgIDJ9LAorICAgIHsgMTYsICAzLCAgNX0sIHsgMTYsICAzLCAgN30sIHsgMTYsICAzLCAgOX0sIHsgMTYsICAzLCAxN30sCisgICAgeyAxNiwgIDMsIDE5fSwgeyAxNiwgIDMsIDIxfSwgeyAxNiwgIDMsIDIyfSwgeyAxNiwgIDMsIDIzfSwKKyAgICB7IDE2LCAgMywgMjR9LCB7IDE2LCAgNCwgIDF9LCB7IDE2LCAgNCwgIDJ9LCB7IDE2LCAgNCwgIDV9LAorICAgIHsgMTYsICA0LCAgOX0sIHsgMTYsICA0LCAxN30sIHsgMTYsICA0LCAxOX0sIHsgMTYsICA0LCAyMX0sCisgICAgeyAxNiwgIDQsIDIyfSwgeyAxNiwgIDQsIDIzfSwgeyAxNiwgIDUsICAxfSwgeyAxNiwgIDUsICA1fSwKKyAgICB7IDE2LCAgNSwgIDd9LCB7IDE2LCAgNSwgIDl9LCB7IDE2LCAgNSwgMTd9LCB7IDE2LCAgNSwgMjN9LAorICAgIHsgMTYsICA3LCAgMX0sIHsgMTYsICA3LCAgMn0sIHsgMTYsICA3LCAgNX0sIHsgMTYsICA3LCAgOX0sCisgICAgeyAxNiwgIDcsIDE3fSwgeyAxNiwgIDcsIDE5fSwgeyAxNiwgIDcsIDIxfSwgeyAxNiwgIDcsIDIyfSwKKyAgICB7IDE2LCAgNywgMjN9LCB7IDE2LCAxMCwgIDF9LCB7IDE2LCAxMCwgIDJ9LCB7IDE2LCAxMCwgIDV9LAorICAgIHsgMTYsIDEwLCAgOX0sIHsgMTYsIDEwLCAxN30sIHsgMTYsIDEwLCAxOX0sIHsgMTYsIDEwLCAyMX0sCisgICAgeyAxNiwgMTAsIDIzfSwgeyAxNiwgMTEsICAxfSwgeyAxNiwgMTEsICA1fSwgeyAxNiwgMTEsIDIyfSwKKyAgICB7IDE2LCAxMiwgIDF9LCB7IDE2LCAxMiwgIDV9LCB7IDE2LCAxMiwgMjN9LCB7IDE2LCAxMywgIDF9LAorICAgIHsgMTYsIDEzLCAgMn0sIHsgMTYsIDEzLCAgNX0sIHsgMTYsIDEzLCAgOX0sIHsgMTYsIDEzLCAxN30sCisgICAgeyAxNiwgMTMsIDE5fSwgeyAxNiwgMTMsIDIxfSwgeyAxNiwgMTMsIDIzfSwgeyAxNiwgMTQsICAxfSwKKyAgICB7IDE2LCAxNCwgIDV9LCB7IDE2LCAxNCwgIDl9LCB7IDE2LCAxNCwgMjN9LCB7IDE2LCAxOCwgIDF9LAorICAgIHsgMTYsIDE4LCAgNX0sIHsgMTYsIDE4LCAgOX0sIHsgMTYsIDE4LCAxN30sIHsgMTYsIDE4LCAxOX0sCisgICAgeyAxNiwgMTgsIDIxfSwgeyAxNiwgMTgsIDIzfSwgeyAxNiwgMTksICAxfSwgeyAxNiwgMTksIDE3fSwKKyAgICB7IDE2LCAyMCwgIDF9LCB7IDE2LCAyMCwgIDJ9LCB7IDE2LCAyMCwgIDV9LCB7IDE2LCAyMCwgIDl9LAorICAgIHsgMTYsIDIwLCAxN30sIHsgMTYsIDIwLCAxOX0sIHsgMTYsIDIwLCAyMX0sIHsgMTYsIDIwLCAyM30sCisgICAgeyAxNiwgMjEsICAxfSwgeyAxNiwgMjEsIDIyfSwgeyAxNiwgMjIsICAxfSwgeyAxNiwgMjIsICA1fSwKKyAgICB7IDE2LCAyMywgIDF9LCB7IDE2LCAyMywgIDV9LCB7IDE2LCAyMywgIDl9LCB7IDE2LCAyMywgMTd9LAorICAgIHsgMTYsIDIzLCAxOX0sIHsgMTYsIDIzLCAyMX0sIHsgMTYsIDIzLCAyM30sIHsgMTYsIDI2LCAgMX0sCisgICAgeyAxNiwgMjYsICA1fSwgeyAxNiwgMjYsICA5fSwgeyAxNiwgMjYsIDE3fSwgeyAxNiwgMjYsIDIzfSwKKyAgICB7IDE2LCAyNywgIDF9LCB7IDE2LCAyNywgIDJ9LCB7IDE2LCAyNywgIDV9LCB7IDE2LCAyNywgIDl9LAorICAgIHsgMTYsIDI3LCAxN30sIHsgMTYsIDI3LCAxOX0sIHsgMTYsIDI3LCAyMX0sIHsgMTYsIDI3LCAyM30sCisgICAgeyAxNiwgMjksICAxfSwgeyAxNiwgMjksICAyfSwgeyAxNiwgMjksICA1fSwgeyAxNiwgMjksICA4fSwKKyAgICB7IDE2LCAyOSwgIDl9LCB7IDE2LCAyOSwgMTB9LCB7IDE2LCAyOSwgMTd9LCB7IDE2LCAyOSwgMTl9LAorICAgIHsgMTYsIDI5LCAyMX0sIHsgMTYsIDI5LCAyM30sIHsgMTcsICAzLCAgMX0sIHsgMTcsICAzLCAgMn0sCisgICAgeyAxNywgIDMsICA1fSwgeyAxNywgIDMsICA5fSwgeyAxNywgIDMsIDE3fSwgeyAxNywgIDMsIDE5fSwKKyAgICB7IDE3LCAgMywgMjF9LCB7IDE3LCAgMywgMjN9LCB7IDE3LCAgNCwgIDF9LCB7IDE3LCAgNCwgIDJ9LAorICAgIHsgMTcsICA0LCAgNX0sIHsgMTcsICA0LCAgOX0sIHsgMTcsICA0LCAxN30sIHsgMTcsICA0LCAxOX0sCisgICAgeyAxNywgIDQsIDIxfSwgeyAxNywgIDQsIDIyfSwgeyAxNywgIDQsIDIzfSwgeyAxNywgIDUsICAxfSwKKyAgICB7IDE3LCAgNSwgIDJ9LCB7IDE3LCAgNSwgMjN9LCB7IDE3LCAgNywgIDF9LCB7IDE3LCAgNywgIDJ9LAorICAgIHsgMTcsICA3LCAgNX0sIHsgMTcsICA3LCAgOH0sIHsgMTcsICA3LCAgOX0sIHsgMTcsICA3LCAxN30sCisgICAgeyAxNywgIDcsIDE5fSwgeyAxNywgIDcsIDIxfSwgeyAxNywgIDcsIDIyfSwgeyAxNywgIDcsIDIzfSwKKyAgICB7IDE3LCAxMCwgIDF9LCB7IDE3LCAxMCwgIDJ9LCB7IDE3LCAxMCwgIDV9LCB7IDE3LCAxMCwgIDl9LAorICAgIHsgMTcsIDEwLCAxN30sIHsgMTcsIDEwLCAxOX0sIHsgMTcsIDEwLCAyMX0sIHsgMTcsIDEwLCAyM30sCisgICAgeyAxNywgMTEsICAxfSwgeyAxNywgMTEsICA1fSwgeyAxNywgMTEsICA5fSwgeyAxNywgMTEsIDE3fSwKKyAgICB7IDE3LCAxMSwgMTl9LCB7IDE3LCAxMSwgMjF9LCB7IDE3LCAxMSwgMjJ9LCB7IDE3LCAxMSwgMjN9LAorICAgIHsgMTcsIDEyLCAgMX0sIHsgMTcsIDEzLCAgMX0sIHsgMTcsIDEzLCAgMn0sIHsgMTcsIDEzLCAgNX0sCisgICAgeyAxNywgMTMsICA5fSwgeyAxNywgMTMsIDE3fSwgeyAxNywgMTMsIDE5fSwgeyAxNywgMTMsIDIxfSwKKyAgICB7IDE3LCAxMywgMjN9LCB7IDE3LCAxNCwgIDF9LCB7IDE3LCAxNCwgIDJ9LCB7IDE3LCAxNCwgIDV9LAorICAgIHsgMTcsIDE0LCAgOX0sIHsgMTcsIDE0LCAxN30sIHsgMTcsIDE0LCAyM30sIHsgMTcsIDE1LCAgMX0sCisgICAgeyAxNywgMTUsIDIzfSwgeyAxNywgMTgsICAxfSwgeyAxNywgMTgsICA5fSwgeyAxNywgMTksICAxfSwKKyAgICB7IDE3LCAyMCwgIDF9LCB7IDE3LCAyMCwgIDJ9LCB7IDE3LCAyMCwgIDV9LCB7IDE3LCAyMCwgIDl9LAorICAgIHsgMTcsIDIwLCAxN30sIHsgMTcsIDIwLCAxOX0sIHsgMTcsIDIwLCAyMX0sIHsgMTcsIDIwLCAyM30sCisgICAgeyAxNywgMjEsICAxfSwgeyAxNywgMjEsICA1fSwgeyAxNywgMjEsICA5fSwgeyAxNywgMjEsIDIzfSwKKyAgICB7IDE3LCAyMiwgIDF9LCB7IDE3LCAyMiwgMjN9LCB7IDE3LCAyMywgIDF9LCB7IDE3LCAyMywgIDJ9LAorICAgIHsgMTcsIDIzLCAgNX0sIHsgMTcsIDIzLCAgOX0sIHsgMTcsIDIzLCAxN30sIHsgMTcsIDIzLCAxOX0sCisgICAgeyAxNywgMjMsIDIxfSwgeyAxNywgMjMsIDIzfSwgeyAxNywgMjYsICAxfSwgeyAxNywgMjYsICA1fSwKKyAgICB7IDE3LCAyNiwgIDl9LCB7IDE3LCAyNiwgMTd9LCB7IDE3LCAyNywgIDF9LCB7IDE3LCAyNywgIDJ9LAorICAgIHsgMTcsIDI3LCAgNX0sIHsgMTcsIDI3LCAgOX0sIHsgMTcsIDI3LCAxN30sIHsgMTcsIDI3LCAxOX0sCisgICAgeyAxNywgMjcsIDIzfSwgeyAxNywgMjksICAxfSwgeyAxNywgMjksICAyfSwgeyAxNywgMjksICA1fSwKKyAgICB7IDE3LCAyOSwgIDl9LCB7IDE3LCAyOSwgMTd9LCB7IDE3LCAyOSwgMTl9LCB7IDE3LCAyOSwgMjF9LAorICAgIHsgMTcsIDI5LCAyM30sIHsgMTgsICAzLCAgMX0sIHsgMTgsICAzLCAgMn0sIHsgMTgsICAzLCAgNX0sCisgICAgeyAxOCwgIDMsICA5fSwgeyAxOCwgIDMsIDEwfSwgeyAxOCwgIDMsIDE3fSwgeyAxOCwgIDMsIDE5fSwKKyAgICB7IDE4LCAgMywgMjF9LCB7IDE4LCAgMywgMjJ9LCB7IDE4LCAgMywgMjN9LCB7IDE4LCAgNCwgIDF9LAorICAgIHsgMTgsICA0LCAgMn0sIHsgMTgsICA0LCAgNX0sIHsgMTgsICA0LCAgOX0sIHsgMTgsICA0LCAxN30sCisgICAgeyAxOCwgIDQsIDE5fSwgeyAxOCwgIDQsIDIxfSwgeyAxOCwgIDQsIDIyfSwgeyAxOCwgIDQsIDIzfSwKKyAgICB7IDE4LCAgNSwgIDF9LCB7IDE4LCAgNSwgMjN9LCB7IDE4LCAgNywgIDF9LCB7IDE4LCAgNywgIDJ9LAorICAgIHsgMTgsICA3LCAgNX0sIHsgMTgsICA3LCAgOX0sIHsgMTgsICA3LCAxMX0sIHsgMTgsICA3LCAxN30sCisgICAgeyAxOCwgIDcsIDE5fSwgeyAxOCwgIDcsIDIxfSwgeyAxOCwgIDcsIDIyfSwgeyAxOCwgIDcsIDIzfSwKKyAgICB7IDE4LCAxMCwgIDF9LCB7IDE4LCAxMCwgIDJ9LCB7IDE4LCAxMCwgIDV9LCB7IDE4LCAxMCwgIDl9LAorICAgIHsgMTgsIDEwLCAxN30sIHsgMTgsIDEwLCAxOX0sIHsgMTgsIDEwLCAyMX0sIHsgMTgsIDEwLCAyM30sCisgICAgeyAxOCwgMTEsICAxfSwgeyAxOCwgMTEsICA1fSwgeyAxOCwgMTEsIDIyfSwgeyAxOCwgMTIsICAxfSwKKyAgICB7IDE4LCAxMiwgIDV9LCB7IDE4LCAxMywgIDF9LCB7IDE4LCAxMywgIDJ9LCB7IDE4LCAxMywgIDV9LAorICAgIHsgMTgsIDEzLCAgOX0sIHsgMTgsIDEzLCAxN30sIHsgMTgsIDEzLCAxOX0sIHsgMTgsIDEzLCAyMX0sCisgICAgeyAxOCwgMTMsIDIzfSwgeyAxOCwgMTMsIDI4fSwgeyAxOCwgMTQsICAxfSwgeyAxOCwgMTQsICA1fSwKKyAgICB7IDE4LCAxNSwgIDF9LCB7IDE4LCAxOCwgIDF9LCB7IDE4LCAxOCwgIDV9LCB7IDE4LCAxOCwgMjF9LAorICAgIHsgMTgsIDE4LCAyM30sIHsgMTgsIDE5LCAgMX0sIHsgMTgsIDIwLCAgMX0sIHsgMTgsIDIwLCAgMn0sCisgICAgeyAxOCwgMjAsICA1fSwgeyAxOCwgMjAsICA5fSwgeyAxOCwgMjAsIDE3fSwgeyAxOCwgMjAsIDE5fSwKKyAgICB7IDE4LCAyMCwgMjF9LCB7IDE4LCAyMCwgMjN9LCB7IDE4LCAyMSwgIDF9LCB7IDE4LCAyMSwgMjJ9LAorICAgIHsgMTgsIDIyLCAgMX0sIHsgMTgsIDIzLCAgMX0sIHsgMTgsIDIzLCAgMn0sIHsgMTgsIDIzLCAgNX0sCisgICAgeyAxOCwgMjMsICA5fSwgeyAxOCwgMjMsIDE3fSwgeyAxOCwgMjMsIDE5fSwgeyAxOCwgMjMsIDIzfSwKKyAgICB7IDE4LCAyNiwgIDF9LCB7IDE4LCAyNiwgIDV9LCB7IDE4LCAyNiwgIDl9LCB7IDE4LCAyNiwgMTd9LAorICAgIHsgMTgsIDI2LCAyM30sIHsgMTgsIDI3LCAgMX0sIHsgMTgsIDI3LCAgMn0sIHsgMTgsIDI3LCAgNX0sCisgICAgeyAxOCwgMjcsICA4fSwgeyAxOCwgMjcsICA5fSwgeyAxOCwgMjcsIDExfSwgeyAxOCwgMjcsIDE3fSwKKyAgICB7IDE4LCAyNywgMTl9LCB7IDE4LCAyNywgMjF9LCB7IDE4LCAyOCwgIDF9LCB7IDE4LCAyOCwgIDV9LAorICAgIHsgMTgsIDI4LCAgOX0sIHsgMTgsIDI4LCAxN30sIHsgMTgsIDI4LCAxOX0sIHsgMTgsIDI5LCAgMX0sCisgICAgeyAxOCwgMjksICAyfSwgeyAxOCwgMjksICA1fSwgeyAxOCwgMjksICA5fSwgeyAxOCwgMjksIDE3fSwKKyAgICB7IDE4LCAyOSwgMTl9LCB7IDE4LCAyOSwgMjF9LCB7IDE4LCAyOSwgMjN9LCB7IDE5LCAgMywgIDF9LAorICAgIHsgMTksICAzLCAgMn0sIHsgMTksICAzLCAgM30sIHsgMTksICAzLCAgNX0sIHsgMTksICAzLCAgOX0sCisgICAgeyAxOSwgIDMsIDExfSwgeyAxOSwgIDMsIDE3fSwgeyAxOSwgIDMsIDE5fSwgeyAxOSwgIDMsIDIxfSwKKyAgICB7IDE5LCAgMywgMjJ9LCB7IDE5LCAgMywgMjN9LCB7IDE5LCAgMywgMjd9LCB7IDE5LCAgNCwgIDF9LAorICAgIHsgMTksICA0LCAgMn0sIHsgMTksICA0LCAgNX0sIHsgMTksICA0LCAgOX0sIHsgMTksICA0LCAxN30sCisgICAgeyAxOSwgIDQsIDE5fSwgeyAxOSwgIDQsIDIxfSwgeyAxOSwgIDQsIDIyfSwgeyAxOSwgIDQsIDIzfSwKKyAgICB7IDE5LCAgNSwgIDF9LCB7IDE5LCAgNSwgIDJ9LCB7IDE5LCAgNywgIDF9LCB7IDE5LCAgNywgIDJ9LAorICAgIHsgMTksICA3LCAgNX0sIHsgMTksICA3LCAgOX0sIHsgMTksICA3LCAxN30sIHsgMTksICA3LCAxOX0sCisgICAgeyAxOSwgIDcsIDIxfSwgeyAxOSwgIDcsIDIyfSwgeyAxOSwgIDcsIDIzfSwgeyAxOSwgMTAsICAxfSwKKyAgICB7IDE5LCAxMCwgIDJ9LCB7IDE5LCAxMCwgIDV9LCB7IDE5LCAxMCwgIDl9LCB7IDE5LCAxMCwgMTd9LAorICAgIHsgMTksIDEwLCAxOX0sIHsgMTksIDEwLCAyMX0sIHsgMTksIDEwLCAyM30sIHsgMTksIDExLCAgMX0sCisgICAgeyAxOSwgMTEsICA1fSwgeyAxOSwgMTEsICA5fSwgeyAxOSwgMTEsIDE3fSwgeyAxOSwgMTEsIDE5fSwKKyAgICB7IDE5LCAxMSwgMjJ9LCB7IDE5LCAxMSwgMjN9LCB7IDE5LCAxMiwgIDF9LCB7IDE5LCAxMiwgIDl9LAorICAgIHsgMTksIDEyLCAxOX0sIHsgMTksIDEyLCAyMX0sIHsgMTksIDEzLCAgMX0sIHsgMTksIDEzLCAgMn0sCisgICAgeyAxOSwgMTMsICA1fSwgeyAxOSwgMTMsICA5fSwgeyAxOSwgMTMsIDE3fSwgeyAxOSwgMTMsIDE5fSwKKyAgICB7IDE5LCAxMywgMjF9LCB7IDE5LCAxMywgMjN9LCB7IDE5LCAxNCwgIDF9LCB7IDE5LCAxNCwgMjN9LAorICAgIHsgMTksIDE4LCAgMX0sIHsgMTksIDE4LCAgNX0sIHsgMTksIDE5LCAgMX0sIHsgMTksIDE5LCAgNX0sCisgICAgeyAxOSwgMTksICA5fSwgeyAxOSwgMTksIDE5fSwgeyAxOSwgMTksIDIxfSwgeyAxOSwgMjAsICAxfSwKKyAgICB7IDE5LCAyMCwgIDJ9LCB7IDE5LCAyMCwgIDV9LCB7IDE5LCAyMCwgIDh9LCB7IDE5LCAyMCwgIDl9LAorICAgIHsgMTksIDIwLCAxMX0sIHsgMTksIDIwLCAxN30sIHsgMTksIDIwLCAxOX0sIHsgMTksIDIwLCAyMX0sCisgICAgeyAxOSwgMjAsIDIzfSwgeyAxOSwgMjEsICAxfSwgeyAxOSwgMjEsIDIzfSwgeyAxOSwgMjMsICAxfSwKKyAgICB7IDE5LCAyMywgIDV9LCB7IDE5LCAyMywgIDl9LCB7IDE5LCAyMywgMTd9LCB7IDE5LCAyMywgMjF9LAorICAgIHsgMTksIDI2LCAgMX0sIHsgMTksIDI2LCAgNX0sIHsgMTksIDI2LCAgOX0sIHsgMTksIDI2LCAxN30sCisgICAgeyAxOSwgMjYsIDIxfSwgeyAxOSwgMjYsIDIzfSwgeyAxOSwgMjcsICAxfSwgeyAxOSwgMjcsICA1fSwKKyAgICB7IDE5LCAyNywgIDl9LCB7IDE5LCAyNywgMTd9LCB7IDE5LCAyNywgMTl9LCB7IDE5LCAyNywgMjF9LAorICAgIHsgMTksIDI5LCAgMX0sIHsgMTksIDI5LCAgMn0sIHsgMTksIDI5LCAgNX0sIHsgMTksIDI5LCAgOX0sCisgICAgeyAxOSwgMjksIDE3fSwgeyAxOSwgMjksIDE5fSwgeyAxOSwgMjksIDIxfSwgeyAxOSwgMjksIDIzfSwKKyAgICB7IDIwLCAgMywgIDF9LCB7IDIwLCAgMywgIDJ9LCB7IDIwLCAgMywgIDV9LCB7IDIwLCAgMywgIDl9LAorICAgIHsgMjAsICAzLCAxNH0sIHsgMjAsICAzLCAxN30sIHsgMjAsICAzLCAxOX0sIHsgMjAsICAzLCAyMX0sCisgICAgeyAyMCwgIDMsIDIzfSwgeyAyMCwgIDQsICAxfSwgeyAyMCwgIDQsICAyfSwgeyAyMCwgIDQsICA1fSwKKyAgICB7IDIwLCAgNCwgIDl9LCB7IDIwLCAgNCwgMTd9LCB7IDIwLCAgNCwgMTl9LCB7IDIwLCAgNCwgMjF9LAorICAgIHsgMjAsICA0LCAyMn0sIHsgMjAsICA0LCAyM30sIHsgMjAsICA1LCAgMX0sIHsgMjAsICA1LCAyM30sCisgICAgeyAyMCwgIDcsICAxfSwgeyAyMCwgIDcsICAyfSwgeyAyMCwgIDcsICA1fSwgeyAyMCwgIDcsICA5fSwKKyAgICB7IDIwLCAgNywgMTF9LCB7IDIwLCAgNywgMTd9LCB7IDIwLCAgNywgMTl9LCB7IDIwLCAgNywgMjF9LAorICAgIHsgMjAsICA3LCAyM30sIHsgMjAsIDEwLCAgMX0sIHsgMjAsIDEwLCAgMn0sIHsgMjAsIDEwLCAgNX0sCisgICAgeyAyMCwgMTAsICA5fSwgeyAyMCwgMTAsIDE3fSwgeyAyMCwgMTAsIDE5fSwgeyAyMCwgMTAsIDIxfSwKKyAgICB7IDIwLCAxMCwgMjN9LCB7IDIwLCAxMSwgIDF9LCB7IDIwLCAxMSwgIDJ9LCB7IDIwLCAxMSwgIDV9LAorICAgIHsgMjAsIDExLCAgOX0sIHsgMjAsIDExLCAxN30sIHsgMjAsIDExLCAxOX0sIHsgMjAsIDExLCAyMX0sCisgICAgeyAyMCwgMTEsIDIyfSwgeyAyMCwgMTEsIDIzfSwgeyAyMCwgMTIsICAxfSwgeyAyMCwgMTIsICA1fSwKKyAgICB7IDIwLCAxMiwgIDl9LCB7IDIwLCAxMiwgMTl9LCB7IDIwLCAxMywgIDF9LCB7IDIwLCAxMywgIDJ9LAorICAgIHsgMjAsIDEzLCAgNX0sIHsgMjAsIDEzLCAgOX0sIHsgMjAsIDEzLCAxNH0sIHsgMjAsIDEzLCAxN30sCisgICAgeyAyMCwgMTMsIDE5fSwgeyAyMCwgMTMsIDIxfSwgeyAyMCwgMTMsIDIzfSwgeyAyMCwgMTMsIDI3fSwKKyAgICB7IDIwLCAxNCwgIDF9LCB7IDIwLCAxNCwgIDJ9LCB7IDIwLCAxNCwgIDV9LCB7IDIwLCAxNCwgIDl9LAorICAgIHsgMjAsIDE0LCAyMX0sIHsgMjAsIDE0LCAyM30sIHsgMjAsIDE1LCAgMX0sIHsgMjAsIDE1LCAgMn0sCisgICAgeyAyMCwgMTUsICA1fSwgeyAyMCwgMTUsIDIxfSwgeyAyMCwgMTUsIDIzfSwgeyAyMCwgMTgsICAxfSwKKyAgICB7IDIwLCAxOCwgIDJ9LCB7IDIwLCAxOCwgIDV9LCB7IDIwLCAxOCwgIDl9LCB7IDIwLCAxOCwgMTl9LAorICAgIHsgMjAsIDE4LCAyMX0sIHsgMjAsIDE4LCAyM30sIHsgMjAsIDE5LCAgMX0sIHsgMjAsIDE5LCAgNX0sCisgICAgeyAyMCwgMTksICA5fSwgeyAyMCwgMTksIDE5fSwgeyAyMCwgMTksIDIxfSwgeyAyMCwgMjAsICAxfSwKKyAgICB7IDIwLCAyMCwgIDJ9LCB7IDIwLCAyMCwgIDV9LCB7IDIwLCAyMCwgIDl9LCB7IDIwLCAyMCwgMTR9LAorICAgIHsgMjAsIDIwLCAxN30sIHsgMjAsIDIwLCAyMX0sIHsgMjAsIDIwLCAyM30sIHsgMjAsIDIxLCAgMX0sCisgICAgeyAyMCwgMjEsICA1fSwgeyAyMCwgMjEsICA5fSwgeyAyMCwgMjEsIDE3fSwgeyAyMCwgMjEsIDIzfSwKKyAgICB7IDIwLCAyMiwgIDF9LCB7IDIwLCAyMiwgIDJ9LCB7IDIwLCAyMiwgIDV9LCB7IDIwLCAyMiwgIDl9LAorICAgIHsgMjAsIDIyLCAyM30sIHsgMjAsIDIzLCAgMX0sIHsgMjAsIDIzLCAgMn0sIHsgMjAsIDIzLCAgNX0sCisgICAgeyAyMCwgMjMsICA5fSwgeyAyMCwgMjMsIDE3fSwgeyAyMCwgMjMsIDE5fSwgeyAyMCwgMjMsIDIxfSwKKyAgICB7IDIwLCAyMywgMjN9LCB7IDIwLCAyNiwgIDF9LCB7IDIwLCAyNiwgIDJ9LCB7IDIwLCAyNiwgIDV9LAorICAgIHsgMjAsIDI2LCAgOX0sIHsgMjAsIDI2LCAxN30sIHsgMjAsIDI2LCAyMX0sIHsgMjAsIDI2LCAyM30sCisgICAgeyAyMCwgMjcsICAxfSwgeyAyMCwgMjcsICAyfSwgeyAyMCwgMjcsICA1fSwgeyAyMCwgMjcsICA3fSwKKyAgICB7IDIwLCAyNywgIDh9LCB7IDIwLCAyNywgIDl9LCB7IDIwLCAyNywgMTB9LCB7IDIwLCAyNywgMTd9LAorICAgIHsgMjAsIDI3LCAxOX0sIHsgMjAsIDI3LCAyMX0sIHsgMjAsIDI3LCAyM30sIHsgMjAsIDI3LCAyN30sCisgICAgeyAyMCwgMjgsICAxfSwgeyAyMCwgMjgsICA1fSwgeyAyMCwgMjgsICA5fSwgeyAyMCwgMjgsIDE3fSwKKyAgICB7IDIwLCAyOCwgMTl9LCB7IDIwLCAyOCwgMjN9LCB7IDIwLCAyOSwgIDF9LCB7IDIwLCAyOSwgIDJ9LAorICAgIHsgMjAsIDI5LCAgNX0sIHsgMjAsIDI5LCAgOX0sIHsgMjAsIDI5LCAxN30sIHsgMjAsIDI5LCAxOX0sCisgICAgeyAyMCwgMjksIDIxfSwgeyAyMCwgMjksIDIzfSwKK307CisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGtzX3RhYmxlMltdWzRdID0KK3sKKyAgICB7MHhhNGJmLCAgMSwgIDMsICAxfSwgIHsweGE0YzAsICAxLCAgNCwgIDF9LAorICAgIHsweGE0YzEsICAxLCAgNSwgIDF9LCAgezB4YTRjMiwgIDEsICA2LCAgMX0sCisgICAgezB4YTRjMywgIDEsICA3LCAgMX0sICB7MHhhNGM0LCAgMSwgMTAsICAxfSwKKyAgICB7MHhhNGM1LCAgMSwgMTEsICAxfSwgIHsweGE0YzYsICAxLCAxMiwgIDF9LAorICAgIHsweGE0YzcsICAxLCAxMywgIDF9LCAgezB4YTRjOCwgIDEsIDE0LCAgMX0sCisgICAgezB4YTRjOSwgIDEsIDE1LCAgMX0sICB7MHhhNGNhLCAgMSwgMTgsICAxfSwKKyAgICB7MHhhNGNiLCAgMSwgMTksICAxfSwgIHsweGE0Y2MsICAxLCAyMCwgIDF9LAorICAgIHsweGE0Y2QsICAxLCAyMSwgIDF9LCAgezB4YTRjZSwgIDEsIDIyLCAgMX0sCisgICAgezB4YTRjZiwgIDEsIDIzLCAgMX0sICB7MHhhNGQwLCAgMSwgMjYsICAxfSwKKyAgICB7MHhhNGQxLCAgMSwgMjcsICAxfSwgIHsweGE0ZDIsICAxLCAyOCwgIDF9LAorICAgIHsweGE0ZDMsICAxLCAyOSwgIDF9LCAgezB4YTRhMSwgIDIsICAyLCAgMX0sCisgICAgezB4YTRhMiwgIDMsICAyLCAgMX0sICB7MHhhNGE0LCAgNCwgIDIsICAxfSwKKyAgICB7MHhhNGE3LCAgNSwgIDIsICAxfSwgIHsweGE0YTgsICA2LCAgMiwgIDF9LAorICAgIHsweGE0YTksICA3LCAgMiwgIDF9LCAgezB4YTRiMSwgIDgsICAyLCAgMX0sCisgICAgezB4YTRiMiwgIDksICAyLCAgMX0sICB7MHhhNGIzLCAxMCwgIDIsICAxfSwKKyAgICB7MHhhNGI1LCAxMSwgIDIsICAxfSwgIHsweGE0YjYsIDEyLCAgMiwgIDF9LAorICAgIHsweGE0YjcsIDEzLCAgMiwgIDF9LCAgezB4YTRiOCwgMTQsICAyLCAgMX0sCisgICAgezB4YTRiOSwgMTUsICAyLCAgMX0sICB7MHhhNGJhLCAxNiwgIDIsICAxfSwKKyAgICB7MHhhNGJiLCAxNywgIDIsICAxfSwgIHsweGE0YmMsIDE4LCAgMiwgIDF9LAorICAgIHsweGE0YmQsIDE5LCAgMiwgIDF9LCAgezB4YTRiZSwgMjAsICAyLCAgMX0sCit9OworCisvKiDBtsfVx/wgw8q8uiAtIL/PvLrH/CCzucDaILqvyK8KKyAqIGNvbnZlcnNpb246IGluaXRpYWwgc291bmQgb2YgY29tcG91bmQgdHlwZSAtID8/PyBvZiBjb21wbGV0aW9uIHR5cGUKKyAqLworCitzdGF0aWMgY29uc3QgY2hhcl91IGpvaGFiX2Zjb25fdG9fd2FuW10gPQoreworICAgIDAsCisgICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhNCwgMHhhNywgICAgLyogKMOkv/IpLKShLKSiLKSkLKSnICovCisgICAgMHhhOCwgMHhhOSwgMHhiMSwgMHhiMiwgMHhiMywgICAgLyogpKgspKkspLEspLIspLMgKi8KKyAgICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAgICAvKiCktSyktiyktyykuCykuSAqLworICAgIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUgICAgIC8qIKS6LKS7LKS8LKS9LKS+ICovCit9OworCisvKiDBtsfVx/wgwd+8uiAtPiC/z7y6x/wgs7nA2iC6r8ivCisgKiBjb252ZXJzaW9uOiBtZWRpYWwgdm93ZWwgb2YgY29tcG91bmQgdHlwZSAtID8/PyBvZiBjb21wbGV0aW9uIHR5cGUKKyAqLworCitzdGF0aWMgY29uc3QgY2hhcl91IGpvaGFiX3Zvd190b193YW5bXSA9Cit7CisgICAgMCwgMCwKKyAgICAweGQ0LCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAkvKiAow6S/8ikspL8spMAspMEspMIspMMgKi8KKyAgICAwLCAwLAorICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIC8qIKTELKTFLKTGLKTHLKTHpL8spMekwCAqLworICAgIDAsIDAsCisgICAgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogpMek0yykyyykzCykzKTDLKTMpMQspMyk0yAqLworICAgIDAsIDAsCisgICAgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMwkgICAgIC8qIKTQLKTRLKTRpNMspNMgKi8KK307CisKKy8qIMG2x9XH/CDBvry6IC0+IL/PvLrH/CCzucDaILqvyK8KKyAqIGNvbnZlcnNpb246IGZpbmFsIGNvbnNvbmFudCBvZiBjb21wb3VuZCB0eXBlIC0gPz8/IG9mIGNvbXBsZXRpb24gdHlwZQorICovCisKK3N0YXRpYyBjb25zdCBjaGFyX3Ugam9oYWJfbGNvbl90b193YW5bXSA9Cit7CisgICAgMCwKKyAgICAweGQ0LCAweGExLCAweGEyLCAweGEzLCAweGE0LCAgICAvKiAow6S/8iksIKShLCCkoiwgpKGktSwgpKQgKi8KKyAgICAweGE1LCAweGE2LCAweGE3LCAweGE5LCAweGFhLCAgICAvKiCkpKS4LCCkpKS+LCCkpywgpKksIKSppKEgKi8KKyAgICAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAgICAvKiCkqaSxLCCkqaSyLCCkqaS1LCCkqaS8LCCkqaS9ICovCisgICAgMHhiMCwgMHhiMSwgMCwgICAgMHhiMiwgMHhiNCwgICAgLyogpKmkviwgpLEsIDAsIKSyLCCksqS1ICovCisgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiYSwgICAgLyogpLUsIKS2LCCktywgpLgsIKS6ICovCisgICAgMHhiYiwgMHhiYywgMHhiZCwgMHhiZQkgICAgIC8qIKS7LCCkvCwgpL0sIKS+ICovCit9OworCisgICAgc3RhdGljIHZvaWQKK2NvbnZlcnRfa3NfdG9fMyhzcmMsIGZwLCBtcCwgbHApCisgICAgY29uc3QgY2hhcl91ICAgICpzcmM7CisgICAgaW50CQkgICAgKmZwOworICAgIGludAkJICAgICptcDsKKyAgICBpbnQJCSAgICAqbHA7Cit7CisgICAgaW50IGggPSAqc3JjOworICAgIGludCBsb3cgPSAqKHNyYyArIDEpOworICAgIGludCBjOworICAgIGludCBpOworCisgICAgaWYgKChpID0gaGFuX2luZGV4KGgsIGxvdykpID49IDAKKwkmJiBpIDwgc2l6ZW9mKGtzX3RhYmxlMSkvc2l6ZW9mKGtzX3RhYmxlMVswXSkpCisgICAgeworCSpmcCA9IGtzX3RhYmxlMVtpXVswXTsKKwkqbXAgPSBrc190YWJsZTFbaV1bMV07CisJKmxwID0ga3NfdGFibGUxW2ldWzJdOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWMgPSAoaCA8PCA4KSB8IGxvdzsKKwlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKKwkgICAgaWYgKGtzX3RhYmxlMltpXVswXSA9PSBjKQorCSAgICB7CisJCSpmcCA9IGtzX3RhYmxlMltpXVsxXTsKKwkJKm1wID0ga3NfdGFibGUyW2ldWzJdOworCQkqbHAgPSBrc190YWJsZTJbaV1bM107CisJCXJldHVybjsKKwkgICAgfQorCSpmcCA9IDB4ZmY7CS8qILHXt6HHyCDE2rXlIChncmFwaGljIGNvZGUpICovCisJKm1wID0gaDsKKwkqbHAgPSBsb3c7CisgICAgfQorfQorCisgICAgc3RhdGljIGludAorY29udmVydF8zX3RvX2tzKGZ2LCBtdiwgbHYsIGRlcykKKyAgICBpbnQJICAgIGZ2OworICAgIGludAkgICAgbXY7CisgICAgaW50CSAgICBsdjsKKyAgICBjaGFyX3UgICpkZXM7Cit7CisgICAgY2hhcl91IGtleVszXTsKKyAgICByZWdpc3RlciBpbnQgaGksIGxvLCBtaSA9IDAsIHJlc3VsdCwgZm91bmQ7CisKKyAgICBpZiAoZnYgPT0gMHhmZikKKyAgICB7CisJZGVzWzBdID0gbXY7CisJZGVzWzFdID0gbHY7CisJcmV0dXJuIDI7CisgICAgfQorICAgIGtleVswXSA9IGZ2OworICAgIGtleVsxXSA9IG12OworICAgIGtleVsyXSA9IGx2OworICAgIGxvID0gMDsKKyAgICBoaSA9IHNpemVvZihrc190YWJsZTEpLzMgLSAxOworICAgIGZvdW5kID0gMDsKKyAgICB3aGlsZSAobG8gKyAxIDwgaGkpCisgICAgeworCW1pID0gKGxvICsgaGkpLzI7CisJcmVzdWx0ID0gU1RSTkNNUChrc190YWJsZTFbbWldLCBrZXksIDMpOworCWlmIChyZXN1bHQgPT0gMCkKKwl7CisJICAgIGZvdW5kID0gMTsKKwkgICAgYnJlYWs7CisJfQorCWVsc2UgaWYgKHJlc3VsdCA+IDApCisJICAgIGhpID0gbWk7CisJZWxzZQorCSAgICBsbyA9IG1pOworICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgIHsKKwlpZiAoIVNUUk5DTVAoa3NfdGFibGUxW2xvXSwga2V5LCAzKSkKKwl7CisJICAgIGZvdW5kID0gMTsKKwkgICAgbWkgPSBsbzsKKwl9CisJaWYgKCFTVFJOQ01QKGtzX3RhYmxlMVtoaV0sIGtleSwgMykpCisJeworCSAgICBmb3VuZCA9IDE7CisJICAgIG1pID0gaGk7CisJfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgIHsKKwlmb3IgKG1pID0gMDsgbWkgPCA0MDsgbWkrKykKKwkgICAgaWYgKGtzX3RhYmxlMlttaV1bMV0gPT0gZnYgJiYga3NfdGFibGUyW21pXVsyXSA9PSBtdiAmJgorCQlrc190YWJsZTJbbWldWzNdID09IGx2KQorCSAgICB7CisJCWRlc1swXSA9ICh1bnNpZ25lZCkoa3NfdGFibGUyW21pXVswXSkgPj4gODsKKwkJZGVzWzFdID0ga3NfdGFibGUyW21pXVswXTsKKwkJcmV0dXJuIDI7CS8qIGZvdW5kICovCisJICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlkZXNbMF0gPSBtaSAvICgweGZmLTB4YTEpICsgMHhiMDsKKwlkZXNbMV0gPSBtaSAlICgweGZmLTB4YTEpICsgMHhhMTsKKwlyZXR1cm4gMjsJCS8qIGZvdW5kICovCisgICAgfQorCisgICAgLyogv8+8usf8IMelv6Egvvi02S4gYGBLUyBDIDU2MDEgLSAxOTkyIMGkurggsbPIr7/rILrOyKMgx9i8sycnCisgICAgICogMy4zIMD9v6EgvLO47bXIILnmuf3AuLfOIGVuY29kaW5nIMfRtNkuCisgICAgICovCisKKyAgICAqZGVzKysgPSAweGE0OwkJICAgICAvKiDDpL/yICovCisgICAgKmRlcysrID0gMHhkNDsKKyAgICAqZGVzKysgPSAweGE0OwkJICAgICAvKiCzucDatMIguPC1ziBhNCDH4L+hIMDWtNkuICovCisgICAgKmRlcysrID0gam9oYWJfZmNvbl90b193YW5bZnZdOworICAgICpkZXMrKyA9IDB4YTQ7CisgICAgKmRlcysrID0gam9oYWJfdm93X3RvX3dhblttdl07CisgICAgKmRlcysrID0gMHhhNDsKKyAgICAqZGVzKysgPSBqb2hhYl9sY29uX3RvX3dhbltsdl07CisgICAgcmV0dXJuIDg7Cit9CmRpZmYgLS1naXQgYS9zcmMvaWZfY3Njb3BlLmMgYi9zcmMvaWZfY3Njb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjM2RlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9jc2NvcGUuYwpAQCAtMCwwICsxLDIyNzAgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogQ1NDT1BFIHN1cHBvcnQgZm9yIFZpbSBhZGRlZCBieSBBbmR5IEthaG4gPGthaG5AemszLmRlYy5jb20+CisgKiBQb3J0ZWQgdG8gV2luMzIgYnkgU2VyZ2V5IEtob3JldiA8a2hvcmV2QHNvZnRsYWIucnU+CisgKgorICogVGhlIGJhc2ljIGlkZWEvc3RydWN0dXJlIG9mIGNzY29wZSBmb3IgVmltIHdhcyBib3Jyb3dlZCBmcm9tIE52aS4gIFRoZXJlCisgKiBtaWdodCBiZSBhIGZldyBsaW5lcyBvZiBjb2RlIHRoYXQgbG9vayBzaW1pbGFyIHRvIHdoYXQgTnZpIGhhcy4KKyAqCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZiBkZWZpbmVkKEZFQVRfQ1NDT1BFKSB8fCBkZWZpbmVkKFBST1RPKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmIGRlZmluZWQoVU5JWCkKKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbHNlCisgICAgLyogbm90IFVOSVgsIG11c3QgYmUgV0lOMzIgKi8KKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaW5jbHVkZSA8cHJvY2Vzcy5oPgorIyBkZWZpbmUgU1RESU5fRklMRU5PICAgIDAKKyMgZGVmaW5lIFNURE9VVF9GSUxFTk8gICAxCisjIGRlZmluZSBTVERFUlJfRklMRU5PICAgMgorIyBkZWZpbmUgcGlwZShmZHMpIF9waXBlKGZkcywgMjU2LCBPX1RFWFR8T19OT0lOSEVSSVQpCisjZW5kaWYKKyNpbmNsdWRlICJpZl9jc2NvcGUuaCIKKworc3RhdGljIHZvaWQJICAgIGNzX3VzYWdlX21zZyBfX0FSR1MoKGNzaWRfZSB4KSk7CitzdGF0aWMgaW50CSAgICBjc19hZGQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCSAgICBjc19zdGF0X2Vtc2cgX19BUkdTKChjaGFyICpmbmFtZSkpOworc3RhdGljIGludAkgICAgY3NfYWRkX2NvbW1vbiBfX0FSR1MoKGNoYXIgKiwgY2hhciAqLCBjaGFyICopKTsKK3N0YXRpYyBpbnQJICAgIGNzX2NoZWNrX2Zvcl9jb25uZWN0aW9ucyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQJICAgIGNzX2NoZWNrX2Zvcl90YWdzIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludAkgICAgY3NfY250X2Nvbm5lY3Rpb25zIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQJICAgIGNzX3JlYWRpbmdfZW1zZyBfX0FSR1MoKGludCBpZHgpKTsKK3N0YXRpYyBpbnQJICAgIGNzX2NudF9tYXRjaGVzIF9fQVJHUygoaW50IGlkeCkpOworc3RhdGljIGNoYXIgKgkgICAgY3NfY3JlYXRlX2NtZCBfX0FSR1MoKGNoYXIgKmNzb3B0aW9uLCBjaGFyICpwYXR0ZXJuKSk7CitzdGF0aWMgaW50CSAgICBjc19jcmVhdGVfY29ubmVjdGlvbiBfX0FSR1MoKGludCBpKSk7CitzdGF0aWMgdm9pZAkgICAgZG9fY3Njb3BlX2dlbmVyYWwgX19BUkdTKChleGFyZ19UICplYXAsIGludCBtYWtlX3NwbGl0KSk7CitzdGF0aWMgdm9pZAkgICAgY3NfZmlsZV9yZXN1bHRzIF9fQVJHUygoRklMRSAqLCBpbnQgKikpOworc3RhdGljIHZvaWQJICAgIGNzX2ZpbGxfcmVzdWx0cyBfX0FSR1MoKGNoYXIgKiwgaW50ICwgaW50ICosIGNoYXIgKioqLAorCQkJY2hhciAqKiosIGludCAqKSk7CitzdGF0aWMgaW50CSAgICBjc19maW5kIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitzdGF0aWMgaW50CSAgICBjc19maW5kX2NvbW1vbiBfX0FSR1MoKGNoYXIgKm9wdCwgY2hhciAqcGF0LCBpbnQsIGludCApKTsKK3N0YXRpYyBpbnQJICAgIGNzX2hlbHAgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyB2b2lkCSAgICBjc19pbml0IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQJICAgIGNsZWFyX2NzaW5mbyBfX0FSR1MoKGludCBpKSk7CitzdGF0aWMgaW50CSAgICBjc19pbnNlcnRfZmlsZWxpc3QgX19BUkdTKChjaGFyICosIGNoYXIgKiwgY2hhciAqLAorCQkJc3RydWN0IHN0YXQgKikpOworc3RhdGljIGludAkgICAgY3Nfa2lsbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIHZvaWQJICAgIGNzX2tpbGxfZXhlY3V0ZSBfX0FSR1MoKGludCwgY2hhciAqKSk7CitzdGF0aWMgY3NjbWRfVCAqICAgIGNzX2xvb2t1cF9jbWQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3N0YXRpYyBjaGFyICoJICAgIGNzX21ha2VfdmltX3N0eWxlX21hdGNoZXMgX19BUkdTKChjaGFyICosIGNoYXIgKiwKKwkJCWNoYXIgKiwgY2hhciAqKSk7CitzdGF0aWMgY2hhciAqCSAgICBjc19tYW5hZ2VfbWF0Y2hlcyBfX0FSR1MoKGNoYXIgKiosIGNoYXIgKiosIGludCwgbWNtZF9lKSk7CitzdGF0aWMgY2hhciAqCSAgICBjc19wYXJzZV9yZXN1bHRzIF9fQVJHUygoaW50IGNudW1iZXIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUsIGNoYXIgKipjb250ZXh0LCBjaGFyICoqbGluZW51bWJlciwgY2hhciAqKnNlYXJjaCkpOworc3RhdGljIGNoYXIgKgkgICAgY3NfcGF0aGNvbXBvbmVudHMgX19BUkdTKChjaGFyICpwYXRoKSk7CitzdGF0aWMgdm9pZAkgICAgY3NfcHJpbnRfdGFnc19wcml2IF9fQVJHUygoY2hhciAqKiwgY2hhciAqKiwgaW50KSk7CitzdGF0aWMgaW50CSAgICBjc19yZWFkX3Byb21wdCBfX0FSR1MoKGludCApKTsKK3N0YXRpYyB2b2lkCSAgICBjc19yZWxlYXNlX2NzcCBfX0FSR1MoKGludCwgaW50IGZyZWVmbnBwKSk7CitzdGF0aWMgaW50CSAgICBjc19yZXNldCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworc3RhdGljIGNoYXIgKgkgICAgY3NfcmVzb2x2ZV9maWxlIF9fQVJHUygoaW50LCBjaGFyICopKTsKK3N0YXRpYyBpbnQJICAgIGNzX3Nob3cgX19BUkdTKChleGFyZ19UICplYXApKTsKKworCitzdGF0aWMgY3NpbmZvX1QJICAgIGNzaW5mb1tDU0NPUEVfTUFYX0NPTk5FQ1RJT05TXTsKK3N0YXRpYyBjc2NtZF9UCSAgICBjc19jbWRzW10gPQoreworICAgIHsgImFkZCIsCWNzX2FkZCwKKwkJTl8oIkFkZCBhIG5ldyBkYXRhYmFzZSIpLCAgICAgImFkZCBmaWxlfGRpciBbcHJlLXBhdGhdIFtmbGFnc10iLCAwIH0sCisgICAgeyAiZmluZCIsCWNzX2ZpbmQsCisJCU5fKCJRdWVyeSBmb3IgYSBwYXR0ZXJuIiksICAgIEZJTkRfVVNBR0UsIDEgfSwKKyAgICB7ICJoZWxwIiwJY3NfaGVscCwKKwkJTl8oIlNob3cgdGhpcyBtZXNzYWdlIiksICAgICAgImhlbHAiLCAwIH0sCisgICAgeyAia2lsbCIsCWNzX2tpbGwsCisJCU5fKCJLaWxsIGEgY29ubmVjdGlvbiIpLCAgICAgICJraWxsICMiLCAwIH0sCisgICAgeyAicmVzZXQiLAljc19yZXNldCwKKwkJTl8oIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiKSwgInJlc2V0IiwgMCB9LAorICAgIHsgInNob3ciLAljc19zaG93LAorCQlOXygiU2hvdyBjb25uZWN0aW9ucyIpLCAgICAgICAic2hvdyIsIDAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworICAgIHN0YXRpYyB2b2lkCitjc191c2FnZV9tc2coeCkKKyAgICBjc2lkX2UgeDsKK3sKKyAgICAodm9pZClFTVNHMihfKCJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiKSwgY3NfY21kc1soaW50KXhdLnVzYWdlKTsKK30KKworLyoKKyAqIFBSSVZBVEU6IGRvX2NzY29wZV9nZW5lcmFsCisgKgorICogZmluZCB0aGUgY29tbWFuZCwgcHJpbnQgaGVscCBpZiBpbnZhbGlkLCBhbmQgdGhlIHRoZW4gY2FsbCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBmdW5jdGlvbiwKKyAqIGNhbGxlZCBmcm9tIGRvX2NzY29wZSBhbmQgZG9fc2NzY29wZQorICovCisgICAgc3RhdGljIHZvaWQKK2RvX2NzY29wZV9nZW5lcmFsKGVhcCwgbWFrZV9zcGxpdCkKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQltYWtlX3NwbGl0OyAvKiB3aGV0aGVyIHRvIHNwbGl0IHdpbmRvdyAqLworeworICAgIGNzY21kX1QgKmNtZHA7CisKKyAgICBjc19pbml0KCk7CisgICAgaWYgKChjbWRwID0gY3NfbG9va3VwX2NtZChlYXApKSA9PSBOVUxMKQorICAgIHsKKwljc19oZWxwKGVhcCk7CisJcmV0dXJuOworICAgIH0KKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGlmIChtYWtlX3NwbGl0KQorICAgIHsKKwlpZiAoIWNtZHAtPmNhbnNwbGl0KQorCXsKKwkgICAgKHZvaWQpTVNHX1BVVFMoXygiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIikpOworCSAgICByZXR1cm47CisJfQorCXBvc3Rwb25lZF9zcGxpdCA9IC0xOworCXBvc3Rwb25lZF9zcGxpdF9mbGFncyA9IGNtZG1vZC5zcGxpdDsKKyAgICB9CisjZW5kaWYKKworICAgIGNtZHAtPmZ1bmMoZWFwKTsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHBvc3Rwb25lZF9zcGxpdF9mbGFncyA9IDA7CisjZW5kaWYKK30KKworLyoKKyAqIFBVQkxJQzogZG9fY3Njb3BlCisgKi8KKyAgICB2b2lkCitkb19jc2NvcGUoZWFwKQorICAgIGV4YXJnX1QgKmVhcDsKK3sKKyAgICBkb19jc2NvcGVfZ2VuZXJhbChlYXAsIEZBTFNFKTsKK30KKworLyoKKyAqIFBVQkxJQzogZG9fc2NzY29wZQorICoKKyAqIHNhbWUgYXMgZG9fY3Njb3BlLCBidXQgc3BsaXRzIHdpbmRvdywgdG9vLgorICovCisgICAgdm9pZAorZG9fc2NzY29wZShlYXApCisgICAgZXhhcmdfVCAqZWFwOworeworICAgIGRvX2NzY29wZV9nZW5lcmFsKGVhcCwgVFJVRSk7Cit9CisKKy8qCisgKiBQVUJMSUM6IGRvX2NzdGFnCisgKgorICovCisgICAgdm9pZAorZG9fY3N0YWcoZWFwKQorICAgIGV4YXJnX1QgKmVhcDsKK3sKKyAgICBpbnQgcmV0ID0gRkFMU0U7CisKKyAgICBjc19pbml0KCk7CisKKyAgICBpZiAoZWFwLT5hcmcgPT0gTlVMTCB8fCBzdHJsZW4oKGNvbnN0IGNoYXIgKikoZWFwLT5hcmcpKSA9PSAwKQorICAgIHsKKwkodm9pZClFTVNHKF8oIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBfY3N0bykKKyAgICB7CisgICAgY2FzZSAwIDoKKwlpZiAoY3NfY2hlY2tfZm9yX2Nvbm5lY3Rpb25zKCkpCisJeworCSAgICByZXQgPSBjc19maW5kX2NvbW1vbigiZyIsIChjaGFyICopKGVhcC0+YXJnKSwgZWFwLT5mb3JjZWl0LCBGQUxTRSk7CisJICAgIGlmIChyZXQgPT0gRkFMU0UpCisJICAgIHsKKwkJY3NfZnJlZV90YWdzKCk7CisJCWlmIChtc2dfY29sKQorCQkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisKKwkJaWYgKGNzX2NoZWNrX2Zvcl90YWdzKCkpCisJCSAgICByZXQgPSBkb190YWcoZWFwLT5hcmcsIERUX0pVTVAsIDAsIGVhcC0+Zm9yY2VpdCwgRkFMU0UpOworCSAgICB9CisJfQorCWVsc2UgaWYgKGNzX2NoZWNrX2Zvcl90YWdzKCkpCisJeworCSAgICByZXQgPSBkb190YWcoZWFwLT5hcmcsIERUX0pVTVAsIDAsIGVhcC0+Zm9yY2VpdCwgRkFMU0UpOworCX0KKwlicmVhazsKKyAgICBjYXNlIDEgOgorCWlmIChjc19jaGVja19mb3JfdGFncygpKQorCXsKKwkgICAgcmV0ID0gZG9fdGFnKGVhcC0+YXJnLCBEVF9KVU1QLCAwLCBlYXAtPmZvcmNlaXQsIEZBTFNFKTsKKwkgICAgaWYgKHJldCA9PSBGQUxTRSkKKwkgICAgeworCQlpZiAobXNnX2NvbCkKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCisJCWlmIChjc19jaGVja19mb3JfY29ubmVjdGlvbnMoKSkKKwkJeworCQkgICAgcmV0ID0gY3NfZmluZF9jb21tb24oImciLCAoY2hhciAqKShlYXAtPmFyZyksIGVhcC0+Zm9yY2VpdCwKKwkJCQkJIEZBTFNFKTsKKwkJICAgIGlmIChyZXQgPT0gRkFMU0UpCisJCQljc19mcmVlX3RhZ3MoKTsKKwkJfQorCSAgICB9CisJfQorCWVsc2UgaWYgKGNzX2NoZWNrX2Zvcl9jb25uZWN0aW9ucygpKQorCXsKKwkgICAgcmV0ID0gY3NfZmluZF9jb21tb24oImciLCAoY2hhciAqKShlYXAtPmFyZyksIGVhcC0+Zm9yY2VpdCwgRkFMU0UpOworCSAgICBpZiAocmV0ID09IEZBTFNFKQorCQljc19mcmVlX3RhZ3MoKTsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdCA6CisJYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFyZXQpCisgICAgeworCSh2b2lkKUVNU0coXygiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiKSk7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKwlnX2RvX3RhZ3ByZXZpZXcgPSAwOworI2VuZGlmCisgICAgfQorCit9IC8qIGRvX2NzY29wZSAqLworCisKKy8qCisgKiBQVUJMSUM6IGNzX2ZpbmQKKyAqCisgKiB0aGlzIHNpbXVsYXRlcyBhIHZpbV9mZ2V0cygpLCBidXQgZm9yIGNzY29wZSwgcmV0dXJucyB0aGUgbmV4dCBsaW5lCisgKiBmcm9tIHRoZSBjc2NvcGUgb3V0cHV0LiAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gZmluZF90YWdzKCkKKyAqCisgKiByZXR1cm5zIFRSVUUgaWYgZW9mLCBGQUxTRSBvdGhlcndpc2UKKyAqLworICAgIGludAorY3NfZmdldHMoYnVmLCBzaXplKQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJc2l6ZTsKK3sKKyAgICBjaGFyICpwOworCisgICAgaWYgKChwID0gY3NfbWFuYWdlX21hdGNoZXMoTlVMTCwgTlVMTCwgLTEsIEdldCkpID09IE5VTEwpCisJcmV0dXJuIFRSVUU7CisKKyAgICBpZiAoKGludClzdHJsZW4ocCkgPiBzaXplKQorICAgIHsKKwlzdHJuY3B5KChjaGFyICopYnVmLCBwLCBzaXplIC0gMSk7CisJYnVmW3NpemVdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorCSh2b2lkKXN0cmNweSgoY2hhciAqKWJ1ZiwgcCk7CisKKyAgICByZXR1cm4gRkFMU0U7Cit9IC8qIGNzX2ZnZXRzICovCisKKworLyoKKyAqIFBVQkxJQzogY3NfZnJlZV90YWdzCisgKgorICogY2FsbGVkIG9ubHkgZnJvbSBkb190YWcoKSwgd2hlbiBwb3BwaW5nIHRoZSB0YWcgc3RhY2sKKyAqLworICAgIHZvaWQKK2NzX2ZyZWVfdGFncygpCit7CisgICAgY3NfbWFuYWdlX21hdGNoZXMoTlVMTCwgTlVMTCwgLTEsIEZyZWUpOworfQorCisKKy8qCisgKiBQVUJMSUM6IGNzX3ByaW50X3RhZ3MKKyAqCisgKiBjYWxsZWQgZnJvbSBkb190YWcoKQorICovCisgICAgdm9pZAorY3NfcHJpbnRfdGFncygpCit7CisgICAgY3NfbWFuYWdlX21hdGNoZXMoTlVMTCwgTlVMTCwgLTEsIFByaW50KTsKK30KKworCisvKgorICogImNzY29wZV9jb25uZWN0aW9uKFt7bnVtfSAsIHtkYnBhdGh9IFssIHtwcmVwZW5kfV1dKSIgZnVuY3Rpb24KKyAqCisgKgkJQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgfGNzY29wZXwgY29ubmVjdGlvbi4gIElmIG5vCisgKgkJcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zOgorICoKKyAqCQkwLCBpZiBjc2NvcGUgd2FzIG5vdCBhdmFpbGFibGUgKG5vdCBjb21waWxlZCBpbiksIG9yIGlmIHRoZXJlCisgKgkJYXJlIG5vIGNzY29wZSBjb25uZWN0aW9uczsgb3IKKyAqCQkxLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY3Njb3BlIGNvbm5lY3Rpb24uCisgKgorICoJCUlmIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgdmFsdWUgb2Yge251bX0KKyAqCQlkZXRlcm1pbmVzIGhvdyBleGlzdGVuY2Ugb2YgYSBjc2NvcGUgY29ubmVjdGlvbiBpcyBjaGVja2VkOgorICoKKyAqCQl7bnVtfQlEZXNjcmlwdGlvbiBvZiBleGlzdGVuY2UgY2hlY2sKKyAqCQktLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkwCVNhbWUgYXMgbm8gcGFyYW1ldGVycyAoZS5nLiwgImNzY29wZV9jb25uZWN0aW9uKCkiKS4KKyAqCQkxCUlnbm9yZSB7cHJlcGVuZH0sIGFuZCB1c2UgcGFydGlhbCBzdHJpbmcgbWF0Y2hlcyBmb3IKKyAqCQkJe2RicGF0aH0uCisgKgkJMglJZ25vcmUge3ByZXBlbmR9LCBhbmQgdXNlIGV4YWN0IHN0cmluZyBtYXRjaGVzIGZvcgorICoJCQl7ZGJwYXRofS4KKyAqCQkzCVVzZSB7cHJlcGVuZH0sIHVzZSBwYXJ0aWFsIHN0cmluZyBtYXRjaGVzIGZvciBib3RoCisgKgkJCXtkYnBhdGh9IGFuZCB7cHJlcGVuZH0uCisgKgkJNAlVc2Uge3ByZXBlbmR9LCB1c2UgZXhhY3Qgc3RyaW5nIG1hdGNoZXMgZm9yIGJvdGgKKyAqCQkJe2RicGF0aH0gYW5kIHtwcmVwZW5kfS4KKyAqCisgKgkJTm90ZTogQWxsIHN0cmluZyBjb21wYXJpc29ucyBhcmUgY2FzZSBzZW5zaXRpdmUhCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK2NzX2Nvbm5lY3Rpb24obnVtLCBkYnBhdGgsIHBwYXRoKQorICAgIGludCBudW07CisgICAgY2hhcl91ICpkYnBhdGg7CisgICAgY2hhcl91ICpwcGF0aDsKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChudW0gPCAwIHx8IG51bSA+IDQgfHwgKG51bSA+IDAgJiYgIWRicGF0aCkpCisJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpID0gMDsgaSA8IENTQ09QRV9NQVhfQ09OTkVDVElPTlM7IGkrKykKKyAgICB7CisJaWYgKCFjc2luZm9baV0uZm5hbWUpCisJICAgIGNvbnRpbnVlOworCisJaWYgKG51bSA9PSAwKQorCSAgICByZXR1cm4gVFJVRTsKKworCXN3aXRjaCAobnVtKQorCXsKKwljYXNlIDE6CisJICAgIGlmIChzdHJzdHIoY3NpbmZvW2ldLmZuYW1lLCAoY2hhciAqKWRicGF0aCkpCisJCXJldHVybiBUUlVFOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIGlmIChzdHJjbXAoY3NpbmZvW2ldLmZuYW1lLCAoY2hhciAqKWRicGF0aCkgPT0gMCkKKwkJcmV0dXJuIFRSVUU7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgaWYgKHN0cnN0cihjc2luZm9baV0uZm5hbWUsIChjaGFyICopZGJwYXRoKQorCQkgICAgJiYgKCghcHBhdGggJiYgIWNzaW5mb1tpXS5wcGF0aCkKKwkJCXx8IChwcGF0aAorCQkJICAgICYmIGNzaW5mb1tpXS5wcGF0aAorCQkJICAgICYmIHN0cnN0cihjc2luZm9baV0ucHBhdGgsIChjaGFyICopcHBhdGgpKSkpCisJCXJldHVybiBUUlVFOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIGlmICgoc3RyY21wKGNzaW5mb1tpXS5mbmFtZSwgKGNoYXIgKilkYnBhdGgpID09IDApCisJCSAgICAmJiAoKCFwcGF0aCAmJiAhY3NpbmZvW2ldLnBwYXRoKQorCQkJfHwgKHBwYXRoCisJCQkgICAgJiYgY3NpbmZvW2ldLnBwYXRoCisJCQkgICAgJiYgKHN0cmNtcChjc2luZm9baV0ucHBhdGgsIChjaGFyICopcHBhdGgpID09IDApKSkpCisJCXJldHVybiBUUlVFOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfSAvKiBjc19jb25uZWN0aW9uICovCisjZW5kaWYKKworCisvKgorICogUFJJVkFURSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUFJJVkFURTogY3NfYWRkCisgKgorICogYWRkIGNzY29wZSBkYXRhYmFzZSBvciBhIGRpcmVjdG9yeSBuYW1lICh0byBsb29rIGZvciBjc2NvcGUub3V0KQorICogdGhlIHRoZSBjc2NvcGUgY29ubmVjdGlvbiBsaXN0CisgKgorICogTUFYUEFUSEwgMjU2CisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAorY3NfYWRkKGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY2hhciAqZm5hbWUsICpwcGF0aCwgKmZsYWdzID0gTlVMTDsKKworICAgIGlmICgoZm5hbWUgPSBzdHJ0b2soKGNoYXIgKilOVUxMLCAoY29uc3QgY2hhciAqKSIgIikpID09IE5VTEwpCisgICAgeworCWNzX3VzYWdlX21zZyhBZGQpOworCXJldHVybiBDU0NPUEVfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKChwcGF0aCA9IHN0cnRvaygoY2hhciAqKU5VTEwsIChjb25zdCBjaGFyICopIiAiKSkgIT0gTlVMTCkKKwlmbGFncyA9IHN0cnRvaygoY2hhciAqKU5VTEwsIChjb25zdCBjaGFyICopIiAiKTsKKworICAgIHJldHVybiBjc19hZGRfY29tbW9uKGZuYW1lLCBwcGF0aCwgZmxhZ3MpOworfQorCisgICAgc3RhdGljIHZvaWQKK2NzX3N0YXRfZW1zZyhmbmFtZSkKKyAgICBjaGFyICpmbmFtZTsKK3sKKyAgICBjaGFyICpzdGF0X2Vtc2cgPSBfKCJFNTYzOiBzdGF0KCVzKSBlcnJvcjogJWQiKTsKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKWFsbG9jKCh1bnNpZ25lZClzdHJsZW4oc3RhdF9lbXNnKSArIE1BWFBBVEhMICsgMTApOworCisgICAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIHsKKwkodm9pZClzcHJpbnRmKGJ1Ziwgc3RhdF9lbXNnLCBmbmFtZSwgZXJybm8pOworCSh2b2lkKUVNU0coYnVmKTsKKwl2aW1fZnJlZShidWYpOworICAgIH0KKyAgICBlbHNlCisJKHZvaWQpRU1TRyhfKCJFNTYzOiBzdGF0IGVycm9yIikpOworfQorCisKKy8qCisgKiBQUklWQVRFOiBjc19hZGRfY29tbW9uCisgKgorICogdGhlIGNvbW1vbiByb3V0aW5lIHRvIGFkZCBhIG5ldyBjc2NvcGUgY29ubmVjdGlvbi4gIGNhbGxlZCBieQorICogY3NfYWRkKCkgYW5kIGNzX3Jlc2V0KCkuICBpIHJlYWxseSBkb24ndCBsaWtlIHRvIGRvIHRoaXMsIGJ1dCB0aGlzCisgKiByb3V0aW5lIHVzZXMgYSBudW1iZXIgb2YgZ290byBzdGF0ZW1lbnRzLgorICovCisgICAgc3RhdGljIGludAorY3NfYWRkX2NvbW1vbihhcmcxLCBhcmcyLCBmbGFncykKKyAgICBjaGFyICphcmcxOwkgICAgLyogZmlsZW5hbWUgLSBtYXkgY29udGFpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyAgICBjaGFyICphcmcyOwkgICAgLyogcHJlcGVuZCBwYXRoIC0gbWF5IGNvbnRhaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisgICAgY2hhciAqZmxhZ3M7Cit7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKmZuYW1lID0gTlVMTDsKKyAgICBjaGFyICpmbmFtZTIgPSBOVUxMOworICAgIGNoYXIgKnBwYXRoID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIC8qIGdldCB0aGUgZmlsZW5hbWUgKGFyZzEpLCBleHBhbmQgaXQsIGFuZCB0cnkgdG8gc3RhdCBpdCAqLworICAgIGlmICgoZm5hbWUgPSAoY2hhciAqKWFsbG9jKE1BWFBBVEhMKzEpKSA9PSBOVUxMKQorCWdvdG8gYWRkX2VycjsKKworICAgIGV4cGFuZF9lbnYoKGNoYXJfdSAqKWFyZzEsIChjaGFyX3UgKilmbmFtZSwgTUFYUEFUSEwpOworICAgIHJldCA9IHN0YXQoZm5hbWUsICZzdGF0YnVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CitzdGF0ZXJyOgorCWlmIChwX2NzdmVyYm9zZSkKKwkgICAgY3Nfc3RhdF9lbXNnKGZuYW1lKTsKKwlnb3RvIGFkZF9lcnI7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBwcmVwZW5kIHBhdGggKGFyZzIpLCBleHBhbmQgaXQsIGFuZCB0cnkgdG8gc3RhdCBpdCAqLworICAgIGlmIChhcmcyICE9IE5VTEwpCisgICAgeworCXN0cnVjdCBzdGF0IHN0YXRidWYyOworCisJaWYgKChwcGF0aCA9IChjaGFyICopYWxsb2MoTUFYUEFUSEwrMSkpID09IE5VTEwpCisJICAgIGdvdG8gYWRkX2VycjsKKworCWV4cGFuZF9lbnYoKGNoYXJfdSAqKWFyZzIsIChjaGFyX3UgKilwcGF0aCwgTUFYUEFUSEwpOworCXJldCA9IHN0YXQocHBhdGgsICZzdGF0YnVmMik7CisJaWYgKHJldCA8IDApCisJICAgIGdvdG8gc3RhdGVycjsKKyAgICB9CisKKyAgICAvKiBpZiBmaWxlbmFtZSBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBjc2NvcGUgZGF0YWJhc2UgbmFtZSB0byBpdCAqLworICAgIGlmICgoc3RhdGJ1Zi5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKQorICAgIHsKKwlmbmFtZTIgPSAoY2hhciAqKWFsbG9jKHN0cmxlbihDU0NPUEVfREJGSUxFKSArIHN0cmxlbihmbmFtZSkgKyAyKTsKKwlpZiAoZm5hbWUyID09IE5VTEwpCisJICAgIGdvdG8gYWRkX2VycjsKKworCXdoaWxlIChmbmFtZVtzdHJsZW4oZm5hbWUpLTFdID09ICcvJworI2lmZGVmIFdJTjMyCisJCXx8IGZuYW1lW3N0cmxlbihmbmFtZSktMV0gPT0gJ1xcJworI2VuZGlmCisJCSkKKwl7CisJICAgIGZuYW1lW3N0cmxlbihmbmFtZSktMV0gPSAnXDAnOworCSAgICBpZiAoc3RybGVuKGZuYW1lKSA9PSAwKQorCQlicmVhazsKKwl9CisJaWYgKGZuYW1lWzBdID09ICdcMCcpCisJICAgICh2b2lkKXNwcmludGYoZm5hbWUyLCAiLyVzIiwgQ1NDT1BFX0RCRklMRSk7CisJZWxzZQorCSAgICAodm9pZClzcHJpbnRmKGZuYW1lMiwgIiVzLyVzIiwgZm5hbWUsIENTQ09QRV9EQkZJTEUpOworCisJcmV0ID0gc3RhdChmbmFtZTIsICZzdGF0YnVmKTsKKwlpZiAocmV0IDwgMCkKKwl7CisJICAgIGlmIChwX2NzdmVyYm9zZSkKKwkJY3Nfc3RhdF9lbXNnKGZuYW1lMik7CisJICAgIGdvdG8gYWRkX2VycjsKKwl9CisKKwlpID0gY3NfaW5zZXJ0X2ZpbGVsaXN0KGZuYW1lMiwgcHBhdGgsIGZsYWdzLCAmc3RhdGJ1Zik7CisgICAgfQorI2lmIGRlZmluZWQoVU5JWCkKKyAgICBlbHNlIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkgfHwgU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKQorI2Vsc2UKKwkvKiBzdWJzdGl0dXRlIGRlZmluZSBTX0lTUkVHIGZyb20gb3NfdW5peC5oICovCisgICAgZWxzZSBpZiAoKChzdGF0YnVmLnN0X21vZGUpICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2VuZGlmCisgICAgeworCWkgPSBjc19pbnNlcnRfZmlsZWxpc3QoZm5hbWUsIHBwYXRoLCBmbGFncywgJnN0YXRidWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChwX2NzdmVyYm9zZSkKKwkgICAgKHZvaWQpRU1TRzIoCisJCV8oIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIpLAorCQlmbmFtZSk7CisJZ290byBhZGRfZXJyOworICAgIH0KKworICAgIGlmIChpICE9IC0xKQorICAgIHsKKwlpZiAoY3NfY3JlYXRlX2Nvbm5lY3Rpb24oaSkgPT0gQ1NDT1BFX0ZBSUxVUkUKKwkJfHwgY3NfcmVhZF9wcm9tcHQoaSkgPT0gQ1NDT1BFX0ZBSUxVUkUpCisJeworCSAgICBjc19yZWxlYXNlX2NzcChpLCBUUlVFKTsKKwkgICAgZ290byBhZGRfZXJyOworCX0KKworCWlmIChwX2NzdmVyYm9zZSkKKwl7CisJICAgIG1zZ19jbHJfZW9zKCk7CisJICAgICh2b2lkKXNtc2dfYXR0cihobF9hdHRyKEhMRl9SKSwKKwkJCSAgICAoY2hhcl91ICopXygiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIiksCisJCQkgICAgY3NpbmZvW2ldLmZuYW1lKTsKKwl9CisgICAgfQorCisgICAgdmltX2ZyZWUoZm5hbWUpOworICAgIHZpbV9mcmVlKGZuYW1lMik7CisgICAgdmltX2ZyZWUocHBhdGgpOworICAgIHJldHVybiBDU0NPUEVfU1VDQ0VTUzsKKworYWRkX2VycjoKKyAgICB2aW1fZnJlZShmbmFtZTIpOworICAgIHZpbV9mcmVlKGZuYW1lKTsKKyAgICB2aW1fZnJlZShwcGF0aCk7CisgICAgcmV0dXJuIENTQ09QRV9GQUlMVVJFOworfSAvKiBjc19hZGRfY29tbW9uICovCisKKworICAgIHN0YXRpYyBpbnQKK2NzX2NoZWNrX2Zvcl9jb25uZWN0aW9ucygpCit7CisgICAgcmV0dXJuIChjc19jbnRfY29ubmVjdGlvbnMoKSA+IDApOworfSAvKiBjc19jaGVja19mb3JfY29ubmVjdGlvbnMgKi8KKworCisgICAgc3RhdGljIGludAorY3NfY2hlY2tfZm9yX3RhZ3MoKQoreworICAgIHJldHVybiAocF90YWdzWzBdICE9IE5VTCAmJiBjdXJidWYtPmJfcF90YWdzICE9IE5VTCk7Cit9IC8qIGNzX2NoZWNrX2Zvcl90YWdzICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX2NudF9jb25uZWN0aW9ucworICoKKyAqIGNvdW50IHRoZSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zCisgKi8KKyAgICBzdGF0aWMgaW50Citjc19jbnRfY29ubmVjdGlvbnMoKQoreworICAgIHNob3J0IGk7CisgICAgc2hvcnQgY250ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDU0NPUEVfTUFYX0NPTk5FQ1RJT05TOyBpKyspCisgICAgeworCWlmIChjc2luZm9baV0uZm5hbWUgIT0gTlVMTCkKKwkgICAgY250Kys7CisgICAgfQorICAgIHJldHVybiBjbnQ7Cit9IC8qIGNzX2NudF9jb25uZWN0aW9ucyAqLworCisgICAgc3RhdGljIHZvaWQKK2NzX3JlYWRpbmdfZW1zZyhpZHgpCisgICAgaW50IGlkeDsJLyogY29ubmVjdGlvbiBpbmRleCAqLworeworICAgIEVNU0dOKF8oIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWxkIiksIGlkeCk7Cit9CisKKyNkZWZpbmUJQ1NSRUFEX0JVRlNJWkUJMjA0OAorLyoKKyAqIFBSSVZBVEU6IGNzX2NudF9tYXRjaGVzCisgKgorICogY291bnQgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvciBhIGdpdmVuIGNzY29wZSBjb25uZWN0aW9uLgorICovCisgICAgc3RhdGljIGludAorY3NfY250X21hdGNoZXMoaWR4KQorICAgIGludCBpZHg7Cit7CisgICAgY2hhciAqc3RvazsKKyAgICBjaGFyICpidWY7CisgICAgaW50IG5saW5lczsKKworICAgIGJ1ZiA9IChjaGFyICopYWxsb2MoQ1NSRUFEX0JVRlNJWkUpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoIWZnZXRzKGJ1ZiwgQ1NSRUFEX0JVRlNJWkUsIGNzaW5mb1tpZHhdLmZyX2ZwKSkKKwl7CisJICAgIGlmIChmZW9mKGNzaW5mb1tpZHhdLmZyX2ZwKSkKKwkJZXJybm8gPSBFSU87CisKKwkgICAgY3NfcmVhZGluZ19lbXNnKGlkeCk7CisKKwkgICAgdmltX2ZyZWUoYnVmKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCS8qCisJICogSWYgdGhlIGRhdGFiYXNlIGlzIG91dCBvZiBkYXRlLCBvciB0aGVyZSdzIHNvbWUgb3RoZXIgcHJvYmxlbSwKKwkgKiBjc2NvcGUgd2lsbCBvdXRwdXQgZXJyb3IgbWVzc2FnZXMgYmVmb3JlIHRoZSBudW1iZXItb2YtbGluZXMgb3V0cHV0LgorCSAqIERpc3BsYXkvZGlzY2FyZCBhbnkgb3V0cHV0IHRoYXQgZG9lc24ndCBtYXRjaCB3aGF0IHdlIHdhbnQuCisJICovCisJaWYgKChzdG9rID0gc3RydG9rKGJ1ZiwgKGNvbnN0IGNoYXIgKikiICIpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlpZiAoc3RyY21wKChjb25zdCBjaGFyICopc3RvaywgImNzY29wZToiKSkKKwkgICAgY29udGludWU7CisKKwlpZiAoKHN0b2sgPSBzdHJ0b2soTlVMTCwgKGNvbnN0IGNoYXIgKikiICIpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlubGluZXMgPSBhdG9pKHN0b2spOworCWlmIChubGluZXMgPCAwKQorCXsKKwkgICAgbmxpbmVzID0gMDsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKChzdG9rID0gc3RydG9rKE5VTEwsIChjb25zdCBjaGFyICopIiAiKSkgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilzdG9rLCAibGluZXMiLCA1KSkKKwkgICAgY29udGludWU7CisKKwlicmVhazsKKyAgICB9CisKKyAgICB2aW1fZnJlZShidWYpOworICAgIHJldHVybiBubGluZXM7Cit9IC8qIGNzX2NudF9tYXRjaGVzICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX2NyZWF0ZV9jbWQKKyAqCisgKiBDcmVhdGVzIHRoZSBhY3R1YWwgY3Njb3BlIGNvbW1hbmQgcXVlcnkgZnJvbSB3aGF0IHRoZSB1c2VyIGVudGVyZWQuCisgKi8KKyAgICBzdGF0aWMgY2hhciAqCitjc19jcmVhdGVfY21kKGNzb3B0aW9uLCBwYXR0ZXJuKQorICAgIGNoYXIgKmNzb3B0aW9uOworICAgIGNoYXIgKnBhdHRlcm47Cit7CisgICAgY2hhciAqY21kOworICAgIHNob3J0IHNlYXJjaDsKKworICAgIHN3aXRjaCAoY3NvcHRpb25bMF0pCisgICAgeworICAgIGNhc2UgJzAnIDogY2FzZSAncycgOgorCXNlYXJjaCA9IDA7CisJYnJlYWs7CisgICAgY2FzZSAnMScgOiBjYXNlICdnJyA6CisJc2VhcmNoID0gMTsKKwlicmVhazsKKyAgICBjYXNlICcyJyA6IGNhc2UgJ2QnIDoKKwlzZWFyY2ggPSAyOworCWJyZWFrOworICAgIGNhc2UgJzMnIDogY2FzZSAnYycgOgorCXNlYXJjaCA9IDM7CisJYnJlYWs7CisgICAgY2FzZSAnNCcgOiBjYXNlICd0JyA6CisJc2VhcmNoID0gNDsKKwlicmVhazsKKyAgICBjYXNlICc2JyA6IGNhc2UgJ2UnIDoKKwlzZWFyY2ggPSA2OworCWJyZWFrOworICAgIGNhc2UgJzcnIDogY2FzZSAnZicgOgorCXNlYXJjaCA9IDc7CisJYnJlYWs7CisgICAgY2FzZSAnOCcgOiBjYXNlICdpJyA6CisJc2VhcmNoID0gODsKKwlicmVhazsKKyAgICBkZWZhdWx0IDoKKwkodm9pZClFTVNHKF8oIkU1NjE6IHVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIikpOworCWNzX3VzYWdlX21zZyhGaW5kKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGNtZCA9IChjaGFyICopYWxsb2Moc3RybGVuKHBhdHRlcm4pICsgMikpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAodm9pZClzcHJpbnRmKGNtZCwgIiVkJXMiLCBzZWFyY2gsIHBhdHRlcm4pOworCisgICAgcmV0dXJuIGNtZDsKK30gLyogY3NfY3JlYXRlX2NtZCAqLworCisKKy8qCisgKiBQUklWQVRFOiBjc19jcmVhdGVfY29ubmVjdGlvbgorICoKKyAqIFRoaXMgcGllY2Ugb2YgY29kZSB3YXMgdGFrZW4vYWRhcHRlZCBmcm9tIG52aS4gIGRvIHdlIG5lZWQgdG8gYWRkCisgKiB0aGUgQlNEIGxpY2Vuc2Ugbm90aWNlPworICovCisgICAgc3RhdGljIGludAorY3NfY3JlYXRlX2Nvbm5lY3Rpb24oaSkKKyAgICBpbnQgaTsKK3sKKyAgICBpbnQgdG9fY3NbMl0sIGZyb21fY3NbMl0sIGxlbjsKKyAgICBjaGFyICpwcm9nLCAqY21kLCAqcHBhdGggPSBOVUxMOworI2lmbmRlZiBVTklYCisgICAgaW50IGluX3NhdmUsIG91dF9zYXZlLCBlcnJfc2F2ZTsKKyAgICBpbnQgcGg7CisjIGlmZGVmIEZFQVRfR1VJCisgICAgSFdORCBhY3RpdmV3bmQgPSBOVUxMOworICAgIEhXTkQgY29uc29sZXduZCA9IE5VTEw7CisjIGVuZGlmCisjZW5kaWYKKworICAgIC8qCisgICAgICogQ3Njb3BlIHJlYWRzIGZyb20gdG9fY3NbMF0gYW5kIHdyaXRlcyB0byBmcm9tX2NzWzFdOyB2aSByZWFkcyBmcm9tCisgICAgICogZnJvbV9jc1swXSBhbmQgd3JpdGVzIHRvIHRvX2NzWzFdLgorICAgICAqLworICAgIHRvX2NzWzBdID0gdG9fY3NbMV0gPSBmcm9tX2NzWzBdID0gZnJvbV9jc1sxXSA9IC0xOworICAgIGlmIChwaXBlKHRvX2NzKSA8IDAgfHwgcGlwZShmcm9tX2NzKSA8IDApCisgICAgeworCSh2b2lkKUVNU0coXygiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiKSk7CitlcnJfY2xvc2luZzoKKwlpZiAodG9fY3NbMF0gIT0gLTEpCisJICAgICh2b2lkKWNsb3NlKHRvX2NzWzBdKTsKKwlpZiAodG9fY3NbMV0gIT0gLTEpCisJICAgICh2b2lkKWNsb3NlKHRvX2NzWzFdKTsKKwlpZiAoZnJvbV9jc1swXSAhPSAtMSkKKwkgICAgKHZvaWQpY2xvc2UoZnJvbV9jc1swXSk7CisJaWYgKGZyb21fY3NbMV0gIT0gLTEpCisJICAgICh2b2lkKWNsb3NlKGZyb21fY3NbMV0pOworCXJldHVybiBDU0NPUEVfRkFJTFVSRTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFVOSVgpCisgICAgc3dpdGNoIChjc2luZm9baV0ucGlkID0gZm9yaygpKQorICAgIHsKKyAgICBjYXNlIC0xOgorCSh2b2lkKUVNU0coXygiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIpKTsKKwlnb3RvIGVycl9jbG9zaW5nOworICAgIGNhc2UgMDoJCQkJLyogY2hpbGQ6IHJ1biBjc2NvcGUuICovCisjZWxzZQorCWluX3NhdmUgPSBkdXAoU1RESU5fRklMRU5PKTsKKwlvdXRfc2F2ZSA9IGR1cChTVERPVVRfRklMRU5PKTsKKwllcnJfc2F2ZSA9IGR1cChTVERFUlJfRklMRU5PKTsKKyNlbmRpZgorCWlmIChkdXAyKHRvX2NzWzBdLCBTVERJTl9GSUxFTk8pID09IC0xKQorCSAgICBQRVJST1IoImNzX2NyZWF0ZV9jb25uZWN0aW9uIDEiKTsKKwlpZiAoZHVwMihmcm9tX2NzWzFdLCBTVERPVVRfRklMRU5PKSA9PSAtMSkKKwkgICAgUEVSUk9SKCJjc19jcmVhdGVfY29ubmVjdGlvbiAyIik7CisJaWYgKGR1cDIoZnJvbV9jc1sxXSwgU1RERVJSX0ZJTEVOTykgPT0gLTEpCisJICAgIFBFUlJPUigiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gMyIpOworCisJLyogY2xvc2UgdW51c2VkICovCisjaWYgZGVmaW5lZChVTklYKQorCSh2b2lkKWNsb3NlKHRvX2NzWzFdKTsKKwkodm9pZCljbG9zZShmcm9tX2NzWzBdKTsKKyNlbHNlCisJLyogT24gd2luMzIgd2UgbXVzdCBjbG9zZSBvcHBvc2l0ZSBlbmRzIGJlY2F1c2Ugd2UgYXJlIHRoZSBwYXJlbnQgKi8KKwkodm9pZCljbG9zZSh0b19jc1swXSk7CisJdG9fY3NbMF0gPSAtMTsKKwkodm9pZCljbG9zZShmcm9tX2NzWzFdKTsKKwlmcm9tX2NzWzFdID0gLTE7CisjZW5kaWYKKwkvKiBleHBhbmQgdGhlIGNzY29wZSBleGVjIGZvciBlbnYgdmFyJ3MgKi8KKwlpZiAoKHByb2cgPSAoY2hhciAqKWFsbG9jKE1BWFBBVEhMICsgMSkpID09IE5VTEwpCisJeworI2lmZGVmIFVOSVgKKwkgICAgcmV0dXJuIENTQ09QRV9GQUlMVVJFOworI2Vsc2UKKwkgICAgZ290byBlcnJfY2xvc2luZzsKKyNlbmRpZgorCX0KKwlleHBhbmRfZW52KChjaGFyX3UgKilwX2NzcHJnLCAoY2hhcl91ICopcHJvZywgTUFYUEFUSEwpOworCisJLyogYWxsb2Mgc3BhY2UgdG8gaG9sZCB0aGUgY3Njb3BlIGNvbW1hbmQgKi8KKwlsZW4gPSBzdHJsZW4ocHJvZykgKyBzdHJsZW4oY3NpbmZvW2ldLmZuYW1lKSArIDMyOworCWlmIChjc2luZm9baV0ucHBhdGgpCisJeworCSAgICAvKiBleHBhbmQgdGhlIHByZXBlbmQgcGF0aCBmb3IgZW52IHZhcidzICovCisJICAgIGlmICgocHBhdGggPSAoY2hhciAqKWFsbG9jKE1BWFBBVEhMICsgMSkpID09IE5VTEwpCisJICAgIHsKKwkJdmltX2ZyZWUocHJvZyk7CisjaWZkZWYgVU5JWAorCQlyZXR1cm4gQ1NDT1BFX0ZBSUxVUkU7CisjZWxzZQorCQlnb3RvIGVycl9jbG9zaW5nOworI2VuZGlmCisJICAgIH0KKwkgICAgZXhwYW5kX2VudigoY2hhcl91ICopY3NpbmZvW2ldLnBwYXRoLCAoY2hhcl91ICopcHBhdGgsIE1BWFBBVEhMKTsKKworCSAgICBsZW4gKz0gc3RybGVuKHBwYXRoKTsKKwl9CisKKwlpZiAoY3NpbmZvW2ldLmZsYWdzKQorCSAgICBsZW4gKz0gc3RybGVuKGNzaW5mb1tpXS5mbGFncyk7CisKKwlpZiAoKGNtZCA9IChjaGFyICopYWxsb2MobGVuKSkgPT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKHByb2cpOworCSAgICB2aW1fZnJlZShwcGF0aCk7CisjaWZkZWYgVU5JWAorCSAgICByZXR1cm4gQ1NDT1BFX0ZBSUxVUkU7CisjZWxzZQorCSAgICBnb3RvIGVycl9jbG9zaW5nOworI2VuZGlmCisJfQorCisJLyogcnVuIHRoZSBjc2NvcGUgY29tbWFuZDsgaXMgdGhlcmUgZXhlY2wgZm9yIG5vbi11bml4IHN5c3RlbXM/ICovCisjaWYgZGVmaW5lZChVTklYKQorCSh2b2lkKXNwcmludGYoY21kLCAiZXhlYyAlcyAtZGwgLWYgJXMiLCBwcm9nLCBjc2luZm9baV0uZm5hbWUpOworI2Vsc2UKKwkodm9pZClzcHJpbnRmKGNtZCwgIiVzIC1kbCAtZiAlcyIsIHByb2csIGNzaW5mb1tpXS5mbmFtZSk7CisjZW5kaWYKKwlpZiAoY3NpbmZvW2ldLnBwYXRoICE9IE5VTEwpCisJeworCSAgICAodm9pZClzdHJjYXQoY21kLCAiIC1QIik7CisJICAgICh2b2lkKXN0cmNhdChjbWQsIGNzaW5mb1tpXS5wcGF0aCk7CisJfQorCWlmIChjc2luZm9baV0uZmxhZ3MgIT0gTlVMTCkKKwl7CisJICAgICh2b2lkKXN0cmNhdChjbWQsICIgIik7CisJICAgICh2b2lkKXN0cmNhdChjbWQsIGNzaW5mb1tpXS5mbGFncyk7CisJfQorIyBpZmRlZiBVTklYCisgICAgICAvKiBvbiBXaW4zMiB3ZSBzdGlsbCBuZWVkIHByb2cgKi8KKwl2aW1fZnJlZShwcm9nKTsKKyMgZW5kaWYKKwl2aW1fZnJlZShwcGF0aCk7CisKKyNpZiBkZWZpbmVkKFVOSVgpCisJaWYgKGV4ZWNsKCIvYmluL3NoIiwgInNoIiwgIi1jIiwgY21kLCBOVUxMKSA9PSAtMSkKKwkgICAgUEVSUk9SKF8oImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIikpOworCisJZXhpdCgxMjcpOworCS8qIE5PVFJFQUNIRUQgKi8KKyAgICBkZWZhdWx0OgkvKiBwYXJlbnQuICovCisjZWxzZQorIyBpZmRlZiBGRUFUX0dVSQorCWFjdGl2ZXduZCA9IEdldEZvcmVncm91bmRXaW5kb3coKTsgLyogb24gd2luOXggY3Njb3BlIHN0ZWFscyBmb2N1cyAqLworCS8qIERpcnR5IGhhY2sgdG8gaGlkZSBhbm5veWluZyBjb25zb2xlIHdpbmRvdyAqLworCWlmIChBbGxvY0NvbnNvbGUoKSkKKwl7CisJICAgIGNoYXIgKnRpdGxlOworCSAgICB0aXRsZSA9IChjaGFyICopYWxsb2MoMTAyNCk7CisJICAgIGlmICh0aXRsZSA9PSBOVUxMKQorCQlGcmVlQ29uc29sZSgpOworCSAgICBlbHNlCisJICAgIHsKKwkJR2V0Q29uc29sZVRpdGxlKHRpdGxlLCAxMDI0KTsgLyogc2F2ZSBmb3IgZnV0dXJlIHJlc3RvcmUgKi8KKwkJU2V0Q29uc29sZVRpdGxlKAorCQkgICAgIkdWSU1DU3s1NDk5NDIxQi1DQkVGLTQ1YjAtODVFRi0zODE2N0ZERUE1QzV9R1ZJTUNTIik7CisJCVNsZWVwKDQwKTsgLyogYXMgc3RhdGVkIGluIE1TIEtCIHdlIG11c3Qgd2FpdCA0MCBtcyAqLworCQljb25zb2xld25kID0gRmluZFdpbmRvdyhOVUxMLAorCQkJIkdWSU1DU3s1NDk5NDIxQi1DQkVGLTQ1YjAtODVFRi0zODE2N0ZERUE1QzV9R1ZJTUNTIik7CisJCWlmIChjb25zb2xld25kICE9IE5VTEwpCisJCSAgICBTaG93V2luZG93KGNvbnNvbGV3bmQsIFNXX0hJREUpOworCQlTZXRDb25zb2xlVGl0bGUodGl0bGUpOworCQl2aW1fZnJlZSh0aXRsZSk7CisJICAgIH0KKwl9CisjIGVuZGlmCisJLyogTWF5IGJlIHVzZSAmc2hlbGwsICZzaGVsbHF1b3RlIGV0YyAqLworIyBpZmRlZiBfX0JPUkxBTkRDX18KKwkvKiBCQ0MgNS41IHVzZXMgYSBkaWZmZXJlbnQgZnVuY3Rpb24gbmFtZSBmb3Igc3Bhd25scCAqLworCXBoID0gc3Bhd25scChQX05PV0FJVCwgcHJvZywgY21kLCBOVUxMKTsKKyMgZWxzZQorCXBoID0gX3NwYXdubHAoX1BfTk9XQUlULCBwcm9nLCBjbWQsIE5VTEwpOworIyBlbmRpZgorCXZpbV9mcmVlKHByb2cpOworCXZpbV9mcmVlKGNtZCk7CisjIGlmZGVmIEZFQVRfR1VJCisJLyogRGlydHkgaGFjayBwYXJ0IHR3byAqLworCWlmIChhY3RpdmV3bmQgIT0gTlVMTCkKKwkgICAgLyogcmVzdG9yaW5nIGZvY3VzICovCisJICAgIFNldEZvcmVncm91bmRXaW5kb3coYWN0aXZld25kKTsKKwlpZiAoY29uc29sZXduZCAhPSBOVUxMKQorCSAgICBGcmVlQ29uc29sZSgpOworCisjIGVuZGlmCisJaWYgKHBoID09IC0xKQorCXsKKwkgICAgUEVSUk9SKF8oImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIikpOworCSAgICAodm9pZClFTVNHKF8oIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIpKTsKKwkgICAgZ290byBlcnJfY2xvc2luZzsKKwl9CisJLyogZWxzZSAqLworCWNzaW5mb1tpXS5waWQgPSAwOworCWNzaW5mb1tpXS5oUHJvYyA9IChIQU5ETEUpcGg7CisKKyNlbmRpZiAvKiAhVU5JWCAqLworCS8qCisJICogU2F2ZSB0aGUgZmlsZSBkZXNjcmlwdG9ycyBmb3IgbGF0ZXIgZHVwbGljYXRpb24sIGFuZAorCSAqIHJlb3BlbiBhcyBzdHJlYW1zLgorCSAqLworCWlmICgoY3NpbmZvW2ldLnRvX2ZwID0gZmRvcGVuKHRvX2NzWzFdLCAidyIpKSA9PSBOVUxMKQorCSAgICBQRVJST1IoXygiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIikpOworCWlmICgoY3NpbmZvW2ldLmZyX2ZwID0gZmRvcGVuKGZyb21fY3NbMF0sICJyIikpID09IE5VTEwpCisJICAgIFBFUlJPUihfKCJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiKSk7CisKKyNpZiBkZWZpbmVkKFVOSVgpCisJLyogY2xvc2UgdW51c2VkICovCisJKHZvaWQpY2xvc2UodG9fY3NbMF0pOworCSh2b2lkKWNsb3NlKGZyb21fY3NbMV0pOworCisJYnJlYWs7CisgICAgfQorI2Vsc2UKKwkvKiByZXN0b3JlIHN0ZGhhbmRsZXMgKi8KKyAgICBkdXAyKGluX3NhdmUsIFNURElOX0ZJTEVOTyk7CisgICAgZHVwMihvdXRfc2F2ZSwgU1RET1VUX0ZJTEVOTyk7CisgICAgZHVwMihlcnJfc2F2ZSwgU1RERVJSX0ZJTEVOTyk7CisgICAgY2xvc2UoaW5fc2F2ZSk7CisgICAgY2xvc2Uob3V0X3NhdmUpOworICAgIGNsb3NlKGVycl9zYXZlKTsKKyNlbmRpZgorICAgIHJldHVybiBDU0NPUEVfU1VDQ0VTUzsKK30gLyogY3NfY3JlYXRlX2Nvbm5lY3Rpb24gKi8KKworCisvKgorICogUFJJVkFURTogY3NfZmluZAorICoKKyAqIHF1ZXJ5IGNzY29wZSB1c2luZyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLiAgcGFyc2UgdGhlIG91dHB1dCBhbmQgdXNlIHRzZWxlY3QKKyAqIHRvIGFsbG93IGNob2ljZXMuICBsaWtlIE52aSwgY3JlYXRlcyBhIHBpcGUgdG8gc2VuZCB0by9mcm9tIHF1ZXJ5L2NzY29wZS4KKyAqCisgKiByZXR1cm5zIFRSVUUgaWYgd2UganVtcCB0byBhIHRhZyBvciBhYm9ydCwgRkFMU0UgaWYgbm90LgorICovCisgICAgc3RhdGljIGludAorY3NfZmluZChlYXApCisgICAgZXhhcmdfVCAqZWFwOworeworICAgIGNoYXIgKm9wdCwgKnBhdDsKKworICAgIGlmIChjc19jaGVja19mb3JfY29ubmVjdGlvbnMoKSA9PSBGQUxTRSkKKyAgICB7CisJKHZvaWQpRU1TRyhfKCJFNTY3OiBubyBjc2NvcGUgY29ubmVjdGlvbnMiKSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgob3B0ID0gc3RydG9rKChjaGFyICopTlVMTCwgKGNvbnN0IGNoYXIgKikiICIpKSA9PSBOVUxMKQorICAgIHsKKwljc191c2FnZV9tc2coRmluZCk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBhdCA9IG9wdCArIHN0cmxlbihvcHQpICsgMTsKKyAgICBpZiAocGF0ID09IE5VTEwgfHwgKHBhdCAhPSBOVUxMICYmIHBhdFswXSA9PSAnXDAnKSkKKyAgICB7CisJY3NfdXNhZ2VfbXNnKEZpbmQpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gY3NfZmluZF9jb21tb24ob3B0LCBwYXQsIGVhcC0+Zm9yY2VpdCwgVFJVRSk7Cit9IC8qIGNzX2ZpbmQgKi8KKworCisvKgorICogUFJJVkFURTogY3NfZmluZF9jb21tb24KKyAqCisgKiBjb21tb24gY29kZSBmb3IgY3Njb3BlIGZpbmQsIHNoYXJlZCBieSBjc19maW5kKCkgYW5kIGRvX2NzdGFnKCkKKyAqLworICAgIHN0YXRpYyBpbnQKK2NzX2ZpbmRfY29tbW9uKG9wdCwgcGF0LCBmb3JjZWl0LCB2ZXJib3NlKQorICAgIGNoYXIgKm9wdDsKKyAgICBjaGFyICpwYXQ7CisgICAgaW50IGZvcmNlaXQ7CisgICAgaW50IHZlcmJvc2U7Cit7CisgICAgaW50IGk7CisgICAgY2hhciAqY21kOworICAgIGNoYXIgKiptYXRjaGVzLCAqKmNvbnRleHRzOworICAgIGludCBudW1tYXRjaGVzW0NTQ09QRV9NQVhfQ09OTkVDVElPTlNdLCB0b3RtYXRjaGVzLCBtYXRjaGVkOworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKyAgICBjaGFyIGNtZGxldHRlcjsKKyAgICBjaGFyICpxZnBvczsKKyNlbmRpZgorCisgICAgLyogY3JlYXRlIHRoZSBhY3R1YWwgY29tbWFuZCB0byBzZW5kIHRvIGNzY29wZSAqLworICAgIGNtZCA9IGNzX2NyZWF0ZV9jbWQob3B0LCBwYXQpOworICAgIGlmIChjbWQgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBzZW5kIHF1ZXJ5IHRvIGFsbCBvcGVuIGNvbm5lY3Rpb25zLCB0aGVuIGNvdW50IHRoZSB0b3RhbCBudW1iZXIKKyAgICAgKiBvZiBtYXRjaGVzIHNvIHdlIGNhbiBhbGxvYyBtYXRjaGVzcCBhbGwgaW4gb25lIHN3ZWxsIGZvb3AKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaSsrKQorCW51bW1hdGNoZXNbaV0gPSAwOworICAgIHRvdG1hdGNoZXMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBDU0NPUEVfTUFYX0NPTk5FQ1RJT05TOyBpKyspCisgICAgeworCWlmIChjc2luZm9baV0uZm5hbWUgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkvKiBzZW5kIGNtZCB0byBjc2NvcGUgKi8KKwkodm9pZClmcHJpbnRmKGNzaW5mb1tpXS50b19mcCwgIiVzXG4iLCBjbWQpOworCSh2b2lkKWZmbHVzaChjc2luZm9baV0udG9fZnApOworCisJbnVtbWF0Y2hlc1tpXSA9IGNzX2NudF9tYXRjaGVzKGkpOworCisJaWYgKG51bW1hdGNoZXNbaV0gPiAtMSkKKwkgICAgdG90bWF0Y2hlcyArPSBudW1tYXRjaGVzW2ldOworCisJaWYgKG51bW1hdGNoZXNbaV0gPT0gMCkKKwkgICAgKHZvaWQpY3NfcmVhZF9wcm9tcHQoaSk7CisgICAgfQorICAgIHZpbV9mcmVlKGNtZCk7CisKKyAgICBpZiAodG90bWF0Y2hlcyA9PSAwKQorICAgIHsKKwljaGFyICpuZiA9IF8oIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIpOworCWNoYXIgKmJ1ZjsKKworCWlmICghdmVyYm9zZSkKKwkgICAgcmV0dXJuIEZBTFNFOworCisJYnVmID0gKGNoYXIgKilhbGxvYyhzdHJsZW4ob3B0KSArIHN0cmxlbihwYXQpICsgc3RybGVuKG5mKSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICAodm9pZClFTVNHKG5mKTsKKwllbHNlCisJeworCSAgICBzcHJpbnRmKGJ1ZiwgbmYsIG9wdCwgcGF0KTsKKwkgICAgKHZvaWQpRU1TRyhidWYpOworCSAgICB2aW1fZnJlZShidWYpOworCX0KKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorICAgIC8qIGdldCBjbWQgbGV0dGVyICovCisgICAgc3dpdGNoIChvcHRbMF0pCisgICAgeworICAgIGNhc2UgJzAnIDoKKwljbWRsZXR0ZXIgPSAncyc7CisJYnJlYWs7CisgICAgY2FzZSAnMScgOgorCWNtZGxldHRlciA9ICdnJzsKKwlicmVhazsKKyAgICBjYXNlICcyJyA6CisJY21kbGV0dGVyID0gJ2QnOworCWJyZWFrOworICAgIGNhc2UgJzMnIDoKKwljbWRsZXR0ZXIgPSAnYyc7CisJYnJlYWs7CisgICAgY2FzZSAnNCcgOgorCWNtZGxldHRlciA9ICd0JzsKKwlicmVhazsKKyAgICBjYXNlICc2JyA6CisJY21kbGV0dGVyID0gJ2UnOworCWJyZWFrOworICAgIGNhc2UgJzcnIDoKKwljbWRsZXR0ZXIgPSAnZic7CisJYnJlYWs7CisgICAgY2FzZSAnOCcgOgorCWNtZGxldHRlciA9ICdpJzsKKwlicmVhazsKKyAgICBkZWZhdWx0IDoKKwljbWRsZXR0ZXIgPSBvcHRbMF07CisgICAgfQorCisgICAgcWZwb3MgPSAoY2hhciAqKXZpbV9zdHJjaHIocF9jc3FmLCBjbWRsZXR0ZXIpOworICAgIGlmIChxZnBvcyAhPSBOVUxMKQorICAgIHsKKwlxZnBvcysrOworCS8qIG5leHQgc3ltYm9sIG11c3QgYmUgKyBvciAtICovCisJaWYgKHN0cmNocihDU1FGX0ZMQUdTLCAqcWZwb3MpID09IE5VTEwpCisJeworCSAgICBjaGFyICpuZiA9IF8oIkU0Njk6IGludmFsaWQgY3Njb3BlcXVpY2tmaXggZmxhZyAlYyBmb3IgJWMiKTsKKwkgICAgY2hhciAqYnVmID0gKGNoYXIgKilhbGxvYyhzdHJsZW4obmYpKTsKKworCSAgICAvKiBzdHJsZW4gd2lsbCBiZSBlbm91Z2ggYmVjYXVzZSB3ZSB1c2UgY2hhcnMgKi8KKwkgICAgaWYgKGJ1ZiAhPSBOVUxMKQorCSAgICB7CisJCXNwcmludGYoYnVmLCBuZiwgKnFmcG9zLCAqKHFmcG9zLTEpKTsKKwkJKHZvaWQpRU1TRyhidWYpOworCQl2aW1fZnJlZShidWYpOworCSAgICB9CisJICAgIHJldHVybiBGQUxTRTsKKwl9CisgICAgfQorICAgIGlmIChxZnBvcyAhPSBOVUxMICYmICpxZnBvcyAhPSAnMCcgJiYgdG90bWF0Y2hlcyA+IDEpCisgICAgeworCS8qIGZpbGwgZXJyb3IgbGlzdCAqLworCUZJTEUgKmY7CisJY2hhcl91ICp0bXAgPSB2aW1fdGVtcG5hbWUoJ2MnKTsKKworCWYgPSBmb3BlbigoY2hhciAqKXRtcCwgInciKTsKKwljc19maWxlX3Jlc3VsdHMoZiwgbnVtbWF0Y2hlcyk7CisJZmNsb3NlKGYpOworCS8qICctJyBzdGFydHMgYSBuZXcgZXJyb3IgbGlzdCAqLworCWlmIChxZl9pbml0KHRtcCwgKGNoYXJfdSAqKSIlZiUqXFx0JWwlKlxcdCVtIiwgKnFmcG9zID09ICctJykgPiAwKQorCXsKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIGlmIChwb3N0cG9uZWRfc3BsaXQgIT0gMCkKKwkgICAgeworCQl3aW5fc3BsaXQocG9zdHBvbmVkX3NwbGl0ID4gMCA/IHBvc3Rwb25lZF9zcGxpdCA6IDAsCisJCQkJCQkgICAgICAgcG9zdHBvbmVkX3NwbGl0X2ZsYWdzKTsKKyMgIGlmZGVmIEZFQVRfU0NST0xMQklORAorCQljdXJ3aW4tPndfcF9zY2IgPSBGQUxTRTsKKyMgIGVuZGlmCisJCXBvc3Rwb25lZF9zcGxpdCA9IDA7CisJICAgIH0KKyMgZW5kaWYKKwkgICAgcWZfanVtcCgwLCAwLCBmb3JjZWl0KTsKKwl9CisJbWNoX3JlbW92ZSh0bXApOworCXZpbV9mcmVlKHRtcCk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBGRUFUX1FVSUNLRklYICovCisgICAgeworCS8qIHJlYWQgb3V0cHV0ICovCisJY3NfZmlsbF9yZXN1bHRzKChjaGFyICopcGF0LCB0b3RtYXRjaGVzLCBudW1tYXRjaGVzLCAmbWF0Y2hlcywKKwkJCQkJCQkgJmNvbnRleHRzLCAmbWF0Y2hlZCk7CisJaWYgKG1hdGNoZXMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBTFNFOworCisJKHZvaWQpY3NfbWFuYWdlX21hdGNoZXMobWF0Y2hlcywgY29udGV4dHMsIHRvdG1hdGNoZXMsIFN0b3JlKTsKKworCXJldHVybiBkb190YWcoKGNoYXJfdSAqKXBhdCwgRFRfQ1NDT1BFLCAwLCBmb3JjZWl0LCB2ZXJib3NlKTsKKyAgICB9CisKK30gLyogY3NfZmluZF9jb21tb24gKi8KKworLyoKKyAqIFBSSVZBVEU6IGNzX2hlbHAKKyAqCisgKiBwcmludCBoZWxwCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAorY3NfaGVscChlYXApCisgICAgZXhhcmdfVCAqZWFwOworeworICAgIGNzY21kX1QgKmNtZHAgPSBjc19jbWRzOworCisgICAgKHZvaWQpTVNHX1BVVFMoXygiY3Njb3BlIGNvbW1hbmRzOlxuIikpOworICAgIHdoaWxlIChjbWRwLT5uYW1lICE9IE5VTEwpCisgICAgeworCSh2b2lkKXNtc2coKGNoYXJfdSAqKV8oIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIiksCisJCQkJICAgICAgY21kcC0+bmFtZSwgXyhjbWRwLT5oZWxwKSwgY21kcC0+dXNhZ2UpOworCWlmIChzdHJjbXAoY21kcC0+bmFtZSwgImZpbmQiKSA9PSAwKQorCSAgICBNU0dfUFVUUyhGSU5EX0hFTFApOworCWNtZHArKzsKKyAgICB9CisKKyAgICB3YWl0X3JldHVybihUUlVFKTsKKyAgICByZXR1cm4gMDsKK30gLyogY3NfaGVscCAqLworCisKKy8qCisgKiBQUklWQVRFOiBjc19pbml0CisgKgorICogaW5pdGlhbGl6ZSBjc2NvcGUgc3RydWN0dXJlIGlmIG5vdCBhbHJlYWR5CisgKi8KKyAgICBzdGF0aWMgdm9pZAorY3NfaW5pdCgpCit7CisgICAgc2hvcnQgaTsKKyAgICBzdGF0aWMgaW50IGluaXRfYWxyZWFkeSA9IEZBTFNFOworCisgICAgaWYgKGluaXRfYWxyZWFkeSkKKwlyZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaSsrKQorCWNsZWFyX2NzaW5mbyhpKTsKKworICAgIGluaXRfYWxyZWFkeSA9IFRSVUU7Cit9IC8qIGNzX2luaXQgKi8KKworICAgIHN0YXRpYyB2b2lkCitjbGVhcl9jc2luZm8oaSkKKyAgICBpbnQJICAgIGk7Cit7CisgICAgY3NpbmZvW2ldLmZuYW1lICA9IE5VTEw7CisgICAgY3NpbmZvW2ldLnBwYXRoICA9IE5VTEw7CisgICAgY3NpbmZvW2ldLmZsYWdzICA9IE5VTEw7CisjaWYgZGVmaW5lZChVTklYKQorICAgIGNzaW5mb1tpXS5zdF9kZXYgPSAoZGV2X3QpMDsKKyAgICBjc2luZm9baV0uc3RfaW5vID0gKGlub190KTA7CisjZWxzZQorICAgIGNzaW5mb1tpXS5uVm9sdW1lID0gMDsKKyAgICBjc2luZm9baV0ubkluZGV4SGlnaCA9IDA7CisgICAgY3NpbmZvW2ldLm5JbmRleExvdyA9IDA7CisjZW5kaWYKKyAgICBjc2luZm9baV0ucGlkICAgID0gLTE7CisgICAgY3NpbmZvW2ldLmZyX2ZwICA9IE5VTEw7CisgICAgY3NpbmZvW2ldLnRvX2ZwICA9IE5VTEw7Cit9CisKKyNpZm5kZWYgVU5JWAorc3RhdGljIGNoYXIgKkdldFdpbjMyRXJyb3IgX19BUkdTKCh2b2lkKSk7CisKKyAgICBzdGF0aWMgY2hhciAqCitHZXRXaW4zMkVycm9yKCkKK3sKKyAgICBjaGFyICptc2cgPSBOVUxMOworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSfEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorCSAgICBOVUxMLCBHZXRMYXN0RXJyb3IoKSwgMCwgKExQU1RSKSZtc2csIDAsIE5VTEwpOworICAgIGlmIChtc2cgIT0gTlVMTCkKKyAgICB7CisJLyogcmVtb3ZlIHRyYWlsaW5nIFxyXG4gKi8KKwljaGFyICpwY3JsZiA9IHN0cnN0cihtc2csICJcclxuIik7CisJaWYgKHBjcmxmICE9IE5VTEwpCisJICAgICpwY3JsZiA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKy8qCisgKiBQUklWQVRFOiBjc19pbnNlcnRfZmlsZWxpc3QKKyAqCisgKiBpbnNlcnQgYSBuZXcgY3Njb3BlIGRhdGFiYXNlIGZpbGVuYW1lIGludG8gdGhlIGZpbGVsaXN0CisgKi8KKyAgICBzdGF0aWMgaW50Citjc19pbnNlcnRfZmlsZWxpc3QoZm5hbWUsIHBwYXRoLCBmbGFncywgc2IpCisgICAgY2hhciAqZm5hbWU7CisgICAgY2hhciAqcHBhdGg7CisgICAgY2hhciAqZmxhZ3M7CisgICAgc3RydWN0IHN0YXQgKnNiOworeworICAgIHNob3J0CWksIGo7CisjaWZuZGVmIFVOSVgKKyAgICBIQU5ETEUJaEZpbGU7CisgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gYmhmaTsKKworICAgIHZpbV9tZW1zZXQoJmJoZmksIDAsIHNpemVvZihiaGZpKSk7CisgICAgLyogT24gd2luZG93cyA5eCBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZSBkb2Vzbid0IHdvcmssIHNvIHNraXAgaXQgKi8KKyAgICBpZiAoIW1jaF93aW5kb3dzOTUoKSkKKyAgICB7CisJaEZpbGUgPSBDcmVhdGVGaWxlKGZuYW1lLCBGSUxFX1JFQURfQVRUUklCVVRFUywgMCwgTlVMTCwgT1BFTl9FWElTVElORywKKwkJCQkJCSBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwl7CisJICAgIGlmIChwX2NzdmVyYm9zZSkKKwkgICAgeworCQljaGFyICpjYW50X21zZyA9IF8oIkU2MjU6IGNhbm5vdCBvcGVuIGNzY29wZSBkYXRhYmFzZTogJXMiKTsKKwkJY2hhciAqd2lubXNnID0gR2V0V2luMzJFcnJvcigpOworCisJCWlmICh3aW5tc2cgIT0gTlVMTCkKKwkJeworCQkgICAgKHZvaWQpRU1TRzIoY2FudF9tc2csIHdpbm1zZyk7CisJCSAgICBMb2NhbEZyZWUod2lubXNnKTsKKwkJfQorCQllbHNlCisJCSAgICAvKiBzdWJzdCBmaWxlbmFtZSBpZiBjYW4ndCBnZXQgZXJyb3IgdGV4dCAqLworCQkgICAgKHZvaWQpRU1TRzIoY2FudF9tc2csIGZuYW1lKTsKKwkgICAgfQorCSAgICByZXR1cm4gLTE7CisJfQorCWlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaEZpbGUsICZiaGZpKSkKKwl7CisJICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKwkgICAgaWYgKHBfY3N2ZXJib3NlKQorCQkodm9pZClFTVNHKF8oIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIikpOworCSAgICByZXR1cm4gLTE7CisJfQorCUNsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGkgPSAtMTsgLyogY2FuIGJlIHNldCB0byB0aGUgaW5kZXggb2YgYW4gZW1wdHkgaXRlbSBpbiBjc2luZm8gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaisrKQorICAgIHsKKwlpZiAoY3NpbmZvW2pdLmZuYW1lICE9IE5VTEwKKyNpZiBkZWZpbmVkKFVOSVgpCisJICAgICYmIGNzaW5mb1tqXS5zdF9kZXYgPT0gc2ItPnN0X2RldiAmJiBjc2luZm9bal0uc3RfaW5vID09IHNiLT5zdF9pbm8KKyNlbHNlCisJICAgIC8qIGNvbXBhcmUgcGF0aG5hbWVzIGZpcnN0ICovCisJICAgICYmICgoZnVsbHBhdGhjbXAoY3NpbmZvW2pdLmZuYW1lLCBmbmFtZSwgRkFMU0UpICYgRlBDX1NBTUUpCisJCS8qIGlmIG5vdCBXaW5kb3dzIDl4LCB0ZXN0IGluZGV4IGZpbGUgYXRyaWJ1dGVzIHRvbyAqLworCQl8fCAoIW1jaF93aW5kb3dzOTUoKQorCQkgICAgJiYgY3NpbmZvW2pdLm5Wb2x1bWUgPT0gYmhmaS5kd1ZvbHVtZVNlcmlhbE51bWJlcgorCQkgICAgJiYgY3NpbmZvW2pdLm5JbmRleEhpZ2ggPT0gYmhmaS5uRmlsZUluZGV4SGlnaAorCQkgICAgJiYgY3NpbmZvW2pdLm5JbmRleExvdyA9PSBiaGZpLm5GaWxlSW5kZXhMb3cpKQorI2VuZGlmCisJICAgICkKKwl7CisJICAgIGlmIChwX2NzdmVyYm9zZSkKKwkJKHZvaWQpRU1TRyhfKCJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIpKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCWlmIChjc2luZm9bal0uZm5hbWUgPT0gTlVMTCAmJiBpID09IC0xKQorCSAgICBpID0gajsgLyogcmVtZW1iZXIgZmlyc3QgZW1wdHkgZW50cnkgKi8KKyAgICB9CisKKyAgICBpZiAoaSA9PSAtMSkKKyAgICB7CisJaWYgKHBfY3N2ZXJib3NlKQorCSAgICAodm9pZClFTVNHKF8oIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIikpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKGNzaW5mb1tpXS5mbmFtZSA9IChjaGFyICopYWxsb2Moc3RybGVuKGZuYW1lKSsxKSkgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAodm9pZClzdHJjcHkoY3NpbmZvW2ldLmZuYW1lLCAoY29uc3QgY2hhciAqKWZuYW1lKTsKKworICAgIGlmIChwcGF0aCAhPSBOVUxMKQorICAgIHsKKwlpZiAoKGNzaW5mb1tpXS5wcGF0aCA9IChjaGFyICopYWxsb2Moc3RybGVuKHBwYXRoKSArIDEpKSA9PSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUoY3NpbmZvW2ldLmZuYW1lKTsKKwkgICAgY3NpbmZvW2ldLmZuYW1lID0gTlVMTDsKKwkgICAgcmV0dXJuIC0xOworCX0KKwkodm9pZClzdHJjcHkoY3NpbmZvW2ldLnBwYXRoLCAoY29uc3QgY2hhciAqKXBwYXRoKTsKKyAgICB9IGVsc2UKKwljc2luZm9baV0ucHBhdGggPSBOVUxMOworCisgICAgaWYgKGZsYWdzICE9IE5VTEwpCisgICAgeworCWlmICgoY3NpbmZvW2ldLmZsYWdzID0gKGNoYXIgKilhbGxvYyhzdHJsZW4oZmxhZ3MpICsgMSkpID09IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShjc2luZm9baV0uZm5hbWUpOworCSAgICB2aW1fZnJlZShjc2luZm9baV0ucHBhdGgpOworCSAgICBjc2luZm9baV0uZm5hbWUgPSBOVUxMOworCSAgICBjc2luZm9baV0ucHBhdGggPSBOVUxMOworCSAgICByZXR1cm4gLTE7CisJfQorCSh2b2lkKXN0cmNweShjc2luZm9baV0uZmxhZ3MsIChjb25zdCBjaGFyICopZmxhZ3MpOworICAgIH0gZWxzZQorCWNzaW5mb1tpXS5mbGFncyA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKFVOSVgpCisgICAgY3NpbmZvW2ldLnN0X2RldiA9IHNiLT5zdF9kZXY7CisgICAgY3NpbmZvW2ldLnN0X2lubyA9IHNiLT5zdF9pbm87CisKKyNlbHNlCisgICAgY3NpbmZvW2ldLm5Wb2x1bWUgPSBiaGZpLmR3Vm9sdW1lU2VyaWFsTnVtYmVyOworICAgIGNzaW5mb1tpXS5uSW5kZXhMb3cgPSBiaGZpLm5GaWxlSW5kZXhMb3c7CisgICAgY3NpbmZvW2ldLm5JbmRleEhpZ2ggPSBiaGZpLm5GaWxlSW5kZXhIaWdoOworI2VuZGlmCisgICAgcmV0dXJuIGk7Cit9IC8qIGNzX2luc2VydF9maWxlbGlzdCAqLworCisKKy8qCisgKiBQUklWQVRFOiBjc19sb29rdXBfY21kCisgKgorICogZmluZCBjc2NvcGUgY29tbWFuZCBpbiBjb21tYW5kIHRhYmxlCisgKi8KKyAgICBzdGF0aWMgY3NjbWRfVCAqCitjc19sb29rdXBfY21kKGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY3NjbWRfVCAqY21kcDsKKyAgICBjaGFyICpzdG9rOworICAgIHNpemVfdCBsZW47CisKKyAgICBpZiAoZWFwLT5hcmcgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICgoc3RvayA9IHN0cnRvaygoY2hhciAqKShlYXAtPmFyZyksIChjb25zdCBjaGFyICopIiAiKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGxlbiA9IHN0cmxlbihzdG9rKTsKKyAgICBmb3IgKGNtZHAgPSBjc19jbWRzOyBjbWRwLT5uYW1lICE9IE5VTEw7ICsrY21kcCkKKyAgICB7CisJaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKikoc3RvayksIGNtZHAtPm5hbWUsIGxlbikgPT0gMCkKKwkgICAgcmV0dXJuIChjbWRwKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9IC8qIGNzX2xvb2t1cF9jbWQgKi8KKworCisvKgorICogUFJJVkFURTogY3Nfa2lsbAorICoKKyAqIG51a2UgZW0KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50Citjc19raWxsKGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY2hhciAqc3RvazsKKyAgICBzaG9ydCBpOworCisgICAgaWYgKChzdG9rID0gc3RydG9rKChjaGFyICopTlVMTCwgKGNvbnN0IGNoYXIgKikiICIpKSA9PSBOVUxMKQorICAgIHsKKwljc191c2FnZV9tc2coS2lsbCk7CisJcmV0dXJuIENTQ09QRV9GQUlMVVJFOworICAgIH0KKworICAgIC8qIG9ubHkgc2luZ2xlIGRpZ2l0IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbnRlZ2VycyBhcmUgYWxsb3dlZCAqLworICAgIGlmICgoc3RybGVuKHN0b2spIDwgMiAmJiBWSU1fSVNESUdJVCgoaW50KShzdG9rWzBdKSkpCisJICAgIHx8IChzdHJsZW4oc3RvaykgPCAzICYmIHN0b2tbMF0gPT0gJy0nCisJCQkJCSAgICAgICYmIFZJTV9JU0RJR0lUKChpbnQpKHN0b2tbMV0pKSkpCisJaSA9IGF0b2koc3Rvayk7CisgICAgZWxzZQorICAgIHsKKwkvKiBJdCBtdXN0IGJlIHBhcnQgb2YgYSBuYW1lLiAgV2Ugd2lsbCB0cnkgdG8gZmluZCBhIG1hdGNoCisJICogd2l0aGluIGFsbCB0aGUgbmFtZXMgaW4gdGhlIGNzaW5mbyBkYXRhIHN0cnVjdHVyZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBDU0NPUEVfTUFYX0NPTk5FQ1RJT05TOyBpKyspCisJeworCSAgICBpZiAoY3NpbmZvW2ldLmZuYW1lICE9IE5VTEwgJiYgc3Ryc3RyKGNzaW5mb1tpXS5mbmFtZSwgc3RvaykpCisJCWJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoKGkgPj0gQ1NDT1BFX01BWF9DT05ORUNUSU9OUyB8fCBpIDwgLTEgfHwgY3NpbmZvW2ldLmZuYW1lID09IE5VTEwpCisJICAgICYmIGkgIT0gLTEpCisgICAgeworCWlmIChwX2NzdmVyYm9zZSkKKwkgICAgKHZvaWQpRU1TRzIoXygiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIiksIHN0b2spOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChpID09IC0xKQorCXsKKwkgICAgZm9yIChpID0gMDsgaSA8IENTQ09QRV9NQVhfQ09OTkVDVElPTlM7IGkrKykKKwkgICAgeworCQlpZiAoY3NpbmZvW2ldLmZuYW1lKQorCQkgICAgY3Nfa2lsbF9leGVjdXRlKGksIGNzaW5mb1tpXS5mbmFtZSk7CisJICAgIH0KKwl9CisJZWxzZQorCSAgICBjc19raWxsX2V4ZWN1dGUoaSwgc3Rvayk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8qIGNzX2tpbGwgKi8KKworCisvKgorICogUFJJVkFURTogY3Nfa2lsbF9leGVjdXRlCisgKgorICogQWN0dWFsbHkga2lsbHMgYSBzcGVjaWZpYyBjc2NvcGUgY29ubmVjdGlvbi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjc19raWxsX2V4ZWN1dGUoaSwgY25hbWUpCisgICAgaW50IGk7CSAgICAvKiBjc2NvcGUgdGFibGUgaW5kZXggKi8KKyAgICBjaGFyICpjbmFtZTsgICAgLyogY3Njb3BlIGRhdGFiYXNlIG5hbWUgKi8KK3sKKyAgICBpZiAocF9jc3ZlcmJvc2UpCisgICAgeworCW1zZ19jbHJfZW9zKCk7CisJKHZvaWQpc21zZ19hdHRyKGhsX2F0dHIoSExGX1IpIHwgTVNHX0hJU1QsCisJCShjaGFyX3UgKilfKCJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiKSwgY25hbWUpOworICAgIH0KKyAgICBjc19yZWxlYXNlX2NzcChpLCBUUlVFKTsKK30KKworCisvKgorICogUFJJVkFURTogY3NfbWFrZV92aW1fc3R5bGVfbWF0Y2hlcworICoKKyAqIGNvbnZlcnQgdGhlIGNzY29wZSBvdXRwdXQgaW50byBpbnRvIGEgY3RhZ3Mgc3R5bGUgZW50cnkgKGFzIG1pZ2h0IGJlIGZvdW5kCisgKiBpbiBhIGN0YWdzIHRhZ3MgZmlsZSkuICB0aGVyZSdzIG9uZSBjYXRjaCB0aG91Z2g6IGNzY29wZSBkb2Vzbid0IHRlbGwgeW91CisgKiB0aGUgdHlwZSBvZiB0aGUgdGFnIHlvdSBhcmUgbG9va2luZyBmb3IuICBmb3IgZXhhbXBsZSwgaW4gRGFycmVuIEhpZWJlcnQncworICogY3RhZ3MgKHRoZSBvbmUgdGhhdCBjb21lcyB3aXRoIHZpbSksICNkZWZpbmUncyB1c2UgYSBsaW5lIG51bWJlciB0byBmaW5kIHRoZQorICogdGFnIGluIGEgZmlsZSB3aGlsZSBmdW5jdGlvbiBkZWZpbml0aW9ucyB1c2UgYSByZWdleHAgc2VhcmNoIHBhdHRlcm4uCisgKgorICogaSdtIGdvaW5nIHRvIGFsd2F5cyB1c2UgdGhlIGxpbmUgbnVtYmVyIGJlY2F1c2UgY3Njb3BlIGRvZXMgc29tZXRoaW5nCisgKiBxdWlya3kgKGFuZCBwcm9iYWJseSBvdGhlciB0aGluZ3MgaSBkb24ndCBrbm93IGFib3V0KToKKyAqCisgKiAgICAgaWYgeW91IGhhdmUgIiMgIGRlZmluZSIgaW4geW91ciBzb3VyY2UgZmlsZSwgd2hpY2ggaXMKKyAqICAgICBwZXJmZWN0bHkgbGVnYWwsIGNzY29wZSB0aGlua3MgeW91IGhhdmUgIiNkZWZpbmUiLiAgdGhpcworICogICAgIHdpbGwgcmVzdWx0IGluIGEgZmFpbGVkIHJlZ2V4cCBzZWFyY2guIDooCisgKgorICogYmVzaWRlcywgZXZlbiBpZiB0aGlzIHBhcnRpY3VsYXIgY2FzZSBkaWRuJ3QgaGFwcGVuLCB0aGUgc2VhcmNoIHBhdHRlcm4KKyAqIHdvdWxkIHN0aWxsIGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gZXNjYXBlIGFsbCB0aGUgc3BlY2lhbCByZWd1bGFyIGV4cHJlc3Npb24KKyAqIGNoYXJhY3RlcnMgdG8gY29tcGx5IHdpdGggY3RhZ3MgZm9ybWF0dGluZy4KKyAqLworICAgIHN0YXRpYyBjaGFyICoKK2NzX21ha2VfdmltX3N0eWxlX21hdGNoZXMoZm5hbWUsIHNsbm8sIHNlYXJjaCwgdGFnc3RyKQorICAgIGNoYXIgKmZuYW1lOworICAgIGNoYXIgKnNsbm87CisgICAgY2hhciAqc2VhcmNoOworICAgIGNoYXIgKnRhZ3N0cjsKK3sKKyAgICAvKiB2aW0gc3R5bGUgaXMgY3RhZ3M6CisgICAgICoKKyAgICAgKgkgICAgPHRhZ3N0cj5cdDxmaWxlbmFtZT5cdDxsaW5lbnVtX29yX3NlYXJjaD4iXHQ8ZXh0cmE+CisgICAgICoKKyAgICAgKiBidXQgYXMgbWVudGlvbmVkIGFib3ZlLCB3ZSdsbCBhbHdheXMgdXNlIHRoZSBsaW5lIG51bWJlciBhbmQKKyAgICAgKiBwdXQgdGhlIHNlYXJjaCBwYXR0ZXJuIChpZiBvbmUgZXhpc3RzKSBhcyAiZXh0cmEiCisgICAgICoKKyAgICAgKiBidWYgaXMgdXNlZCBhcyBwYXJ0IG9mIHZpbSdzIG1ldGhvZCBvZiBoYW5kbGluZyB0YWdzLCBhbmQKKyAgICAgKiAoaSB0aGluaykgdmltIGZyZWVzIGl0IHdoZW4geW91IHBvcCB5b3VyIHRhZ3MgYW5kIGdldCByZXBsYWNlZAorICAgICAqIGJ5IG5ldyBvbmVzIG9uIHRoZSB0YWcgc3RhY2suCisgICAgICovCisgICAgY2hhciAqYnVmOworICAgIGludCBhbXQ7CisKKyAgICBpZiAoc2VhcmNoICE9IE5VTEwpCisgICAgeworCWFtdCA9IHN0cmxlbihmbmFtZSkgKyBzdHJsZW4oc2xubykgKyBzdHJsZW4odGFnc3RyKSArIHN0cmxlbihzZWFyY2gpKzY7CisJaWYgKChidWYgPSAoY2hhciAqKWFsbG9jKGFtdCkpID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCisJKHZvaWQpc3ByaW50ZihidWYsICIlc1x0JXNcdCVzO1wiXHQlcyIsIHRhZ3N0ciwgZm5hbWUsIHNsbm8sIHNlYXJjaCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJYW10ID0gc3RybGVuKGZuYW1lKSArIHN0cmxlbihzbG5vKSArIHN0cmxlbih0YWdzdHIpICsgNTsKKwlpZiAoKGJ1ZiA9IChjaGFyICopYWxsb2MoYW10KSkgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwkodm9pZClzcHJpbnRmKGJ1ZiwgIiVzXHQlc1x0JXM7XCIiLCB0YWdzdHIsIGZuYW1lLCBzbG5vKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfSAvKiBjc19tYWtlX3ZpbV9zdHlsZV9tYXRjaGVzICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX21hbmFnZV9tYXRjaGVzCisgKgorICogdGhpcyBpcyBraW5kIG9mIGhva2V5LCBidXQgaSBkb24ndCBzZWUgYW4gZWFzeSB3YXkgcm91bmQgdGhpcy4uCisgKgorICogU3RvcmU6IGtlZXAgYSBwdHIgdG8gdGhlIChtYWxsb2MnZCkgbWVtb3J5IG9mIG1hdGNoZXMgb3JpZ2luYWxseQorICogZ2VuZXJhdGVkIGZyb20gY3NfZmluZCgpLiAgdGhlIG1hdGNoZXMgYXJlIG9yaWdpbmFsbHkgbGluZXMgZGlyZWN0bHkKKyAqIGZyb20gY3Njb3BlIG91dHB1dCwgYnV0IHRyYW5zZm9ybWVkIHRvIGxvb2sgbGlrZSBzb21ldGhpbmcgb3V0IG9mIGEKKyAqIGN0YWdzLiAgc2VlIGNzX21ha2VfdmltX3N0eWxlX21hdGNoZXMgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBHZXQ6IHVzZWQgb25seSBmcm9tIGNzX2ZnZXRzKCksIHRoaXMgc2ltdWxhdGVzIGEgdmltX2ZnZXRzKCkgdG8gcmV0dXJuCisgKiB0aGUgbmV4dCBsaW5lIGZyb20gdGhlIGNzY29wZSBvdXRwdXQuICBpdCBiYXNpY2FsbHkga2VlcHMgdHJhY2sgb2Ygd2hpY2gKKyAqIGxpbmVzIGhhdmUgYmVlbiAidXNlZCIgYW5kIHJldHVybnMgdGhlIG5leHQgb25lLgorICoKKyAqIEZyZWU6IGZyZWVzIHVwIGV2ZXJ5dGhpbmcgYW5kIHJlc2V0cworICoKKyAqIFByaW50OiBwcmludHMgdGhlIHRhZ3MKKyAqLworICAgIHN0YXRpYyBjaGFyICoKK2NzX21hbmFnZV9tYXRjaGVzKG1hdGNoZXMsIGNvbnRleHRzLCB0b3RtYXRjaGVzLCBjbWQpCisgICAgY2hhciAqKm1hdGNoZXM7CisgICAgY2hhciAqKmNvbnRleHRzOworICAgIGludCB0b3RtYXRjaGVzOworICAgIG1jbWRfZSBjbWQ7Cit7CisgICAgc3RhdGljIGNoYXIgKiptcCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKipjcCA9IE5VTEw7CisgICAgc3RhdGljIGludCBjbnQgPSAtMTsKKyAgICBzdGF0aWMgaW50IG5leHQgPSAtMTsKKyAgICBjaGFyICpwID0gTlVMTDsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIFN0b3JlOgorCWFzc2VydChtYXRjaGVzICE9IE5VTEwpOworCWFzc2VydCh0b3RtYXRjaGVzID4gMCk7CisJaWYgKG1wICE9IE5VTEwgfHwgY3AgIT0gTlVMTCkKKwkgICAgKHZvaWQpY3NfbWFuYWdlX21hdGNoZXMoTlVMTCwgTlVMTCwgLTEsIEZyZWUpOworCW1wID0gbWF0Y2hlczsKKwljcCA9IGNvbnRleHRzOworCWNudCA9IHRvdG1hdGNoZXM7CisJbmV4dCA9IDA7CisJYnJlYWs7CisgICAgY2FzZSBHZXQ6CisJaWYgKG5leHQgPj0gY250KQorCSAgICByZXR1cm4gTlVMTDsKKworCXAgPSBtcFtuZXh0XTsKKwluZXh0Kys7CisJYnJlYWs7CisgICAgY2FzZSBGcmVlOgorCWlmIChtcCAhPSBOVUxMKQorCXsKKwkgICAgaWYgKGNudCA+IDApCisJCXdoaWxlIChjbnQtLSkKKwkJeworCQkgICAgdmltX2ZyZWUobXBbY250XSk7CisJCSAgICBpZiAoY3AgIT0gTlVMTCkKKwkJCXZpbV9mcmVlKGNwW2NudF0pOworCQl9CisJICAgIHZpbV9mcmVlKG1wKTsKKwkgICAgdmltX2ZyZWUoY3ApOworCX0KKwltcCA9IE5VTEw7CisJY3AgPSBOVUxMOworCWNudCA9IDA7CisJbmV4dCA9IDA7CisJYnJlYWs7CisgICAgY2FzZSBQcmludDoKKwljc19wcmludF90YWdzX3ByaXYobXAsIGNwLCBjbnQpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CS8qIHNob3VsZCBub3QgcmVhY2ggaGVyZSAqLworCSh2b2lkKUVNU0coXygiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9IC8qIGNzX21hbmFnZV9tYXRjaGVzICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX3BhcnNlX3Jlc3VsdHMKKyAqCisgKiBwYXJzZSBjc2NvcGUgb3V0cHV0CisgKi8KKyAgICBzdGF0aWMgY2hhciAqCitjc19wYXJzZV9yZXN1bHRzKGNudW1iZXIsIGJ1ZiwgYnVmc2l6ZSwgY29udGV4dCwgbGluZW51bWJlciwgc2VhcmNoKQorICAgIGludCBjbnVtYmVyOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmc2l6ZTsKKyAgICBjaGFyICoqY29udGV4dDsKKyAgICBjaGFyICoqbGluZW51bWJlcjsKKyAgICBjaGFyICoqc2VhcmNoOworeworICAgIGludCBjaDsKKyAgICBjaGFyICpwOworICAgIGNoYXIgKm5hbWU7CisKKyAgICBpZiAoZmdldHMoYnVmLCBidWZzaXplLCBjc2luZm9bY251bWJlcl0uZnJfZnApID09IE5VTEwpCisgICAgeworCWlmIChmZW9mKGNzaW5mb1tjbnVtYmVyXS5mcl9mcCkpCisJICAgIGVycm5vID0gRUlPOworCisJY3NfcmVhZGluZ19lbXNnKGNudW1iZXIpOworCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisJLyogSWYgdGhlIGxpbmUncyB0b28gbG9uZyBmb3IgdGhlIGJ1ZmZlciwgZGlzY2FyZCBpdC4gKi8KKyAgICBpZiAoKHAgPSBzdHJjaHIoYnVmLCAnXG4nKSkgPT0gTlVMTCkKKyAgICB7CisJd2hpbGUgKChjaCA9IGdldGMoY3NpbmZvW2NudW1iZXJdLmZyX2ZwKSkgIT0gRU9GICYmIGNoICE9ICdcbicpCisJICAgIDsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKnAgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBjc2NvcGUgb3V0cHV0IGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAqCisgICAgICoJPGZpbGVuYW1lPiA8Y29udGV4dD4gPGxpbmUgbnVtYmVyPiA8cGF0dGVybj4KKyAgICAgKi8KKyAgICBpZiAoKG5hbWUgPSBzdHJ0b2soKGNoYXIgKilidWYsIChjb25zdCBjaGFyICopIiAiKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKCpjb250ZXh0ID0gc3RydG9rKE5VTEwsIChjb25zdCBjaGFyICopIiAiKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKCpsaW5lbnVtYmVyID0gc3RydG9rKE5VTEwsIChjb25zdCBjaGFyICopIiAiKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICAqc2VhcmNoID0gKmxpbmVudW1iZXIgKyBzdHJsZW4oKmxpbmVudW1iZXIpICsgMTsJLyogKzEgdG8gc2tpcCBcMCAqLworCisgICAgLyogLS0tIG52aSAtLS0KKyAgICAgKiBJZiB0aGUgZmlsZSBpcyBvbGRlciB0aGFuIHRoZSBjc2NvcGUgZGF0YWJhc2UsIHRoYXQgaXMsCisgICAgICogdGhlIGRhdGFiYXNlIHdhcyBidWlsdCBzaW5jZSB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCwKKyAgICAgKiBvciB0aGVyZSB3YXNuJ3QgYSBzZWFyY2ggc3RyaW5nLCB1c2UgdGhlIGxpbmUgbnVtYmVyLgorICAgICAqLworICAgIGlmIChzdHJjbXAoKnNlYXJjaCwgIjx1bmtub3duPiIpID09IDApCisJKnNlYXJjaCA9IE5VTEw7CisKKyAgICBuYW1lID0gY3NfcmVzb2x2ZV9maWxlKGNudW1iZXIsIG5hbWUpOworICAgIHJldHVybiBuYW1lOworfQorCisvKgorICogUFJJVkFURTogY3NfZmlsZV9yZXN1bHRzCisgKgorICogd3JpdGUgY3Njb3BlIGZpbmQgcmVzdWx0cyB0byBmaWxlCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY3NfZmlsZV9yZXN1bHRzKGYsIG51bW1hdGNoZXNfYSkKKyAgICBGSUxFICpmOworICAgIGludCAqbnVtbWF0Y2hlc19hOworeworICAgIGludCBpLCBqOworICAgIGNoYXIgKmJ1ZjsKKyAgICBjaGFyICpzZWFyY2gsICpzbG5vOworICAgIGNoYXIgKmZ1bGxuYW1lOworICAgIGNoYXIgKmNudHg7CisgICAgY2hhciAqY29udGV4dDsKKworICAgIGJ1ZiA9IChjaGFyICopYWxsb2MoQ1NSRUFEX0JVRlNJWkUpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaSsrKQorICAgIHsKKwlpZiAobnVtbWF0Y2hlc19hW2ldIDwgMSkKKwkgICAgY29udGludWU7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtbWF0Y2hlc19hW2ldOyBqKyspCisJeworCSAgIGlmICgoZnVsbG5hbWU9Y3NfcGFyc2VfcmVzdWx0cyhpLCBidWYsIENTUkVBRF9CVUZTSVpFLCAmY250eCwKKwkJCSAgICZzbG5vLCAmc2VhcmNoKSk9PU5VTEwpCisJICAgICAgIGNvbnRpbnVlOworCisJICAgY29udGV4dCA9IChjaGFyICopYWxsb2Moc3RybGVuKGNudHgpKzUpOworCSAgIGlmIChjb250ZXh0PT1OVUxMKQorCSAgICAgICBjb250aW51ZTsKKworCSAgIGlmIChzdHJjbXAoY250eCwgIjxnbG9iYWw+Iik9PTApCisJICAgICAgIHN0cmNweShjb250ZXh0LCAiPDxnbG9iYWw+PiIpOworCSAgIGVsc2UKKwkgICAgICAgc3ByaW50Zihjb250ZXh0LCAiPDwlcz4+IiwgY250eCk7CisKKwkgICBpZiAoc2VhcmNoPT1OVUxMKQorCSAgICAgICBmcHJpbnRmKGYsICIlc1x0JXNcdCVzXG4iLCBmdWxsbmFtZSwgc2xubywgY29udGV4dCk7CisJICAgZWxzZQorCSAgICAgICBmcHJpbnRmKGYsICIlc1x0JXNcdCVzICVzXG4iLCBmdWxsbmFtZSwgc2xubywgY29udGV4dCwgc2VhcmNoKTsKKworCSAgIHZpbV9mcmVlKGNvbnRleHQpOworCSAgIHZpbV9mcmVlKGZ1bGxuYW1lKTsKKwl9IC8qIGZvciBhbGwgbWF0Y2hlcyAqLworCisJKHZvaWQpY3NfcmVhZF9wcm9tcHQoaSk7CisKKyAgICB9IC8qIGZvciBhbGwgY3Njb3BlIGNvbm5lY3Rpb25zICovCisgICAgdmltX2ZyZWUoYnVmKTsKK30KKworLyoKKyAqIFBSSVZBVEU6IGNzX2ZpbGxfcmVzdWx0cworICoKKyAqIGdldCBwYXJzZWQgY3Njb3BlIG91dHB1dCBhbmQgY2FsbHMgY3NfbWFrZV92aW1fc3R5bGVfbWF0Y2hlcyB0byBjb252ZXJ0CisgKiBpbnRvIGN0YWdzIGZvcm1hdAorICovCisgICAgc3RhdGljIHZvaWQKK2NzX2ZpbGxfcmVzdWx0cyh0YWdzdHIsIHRvdG1hdGNoZXMsIG51bW1hdGNoZXNfYSwgbWF0Y2hlc19wLCBjbnR4dHNfcCwgbWF0Y2hlZCkKKyAgICBjaGFyICp0YWdzdHI7CisgICAgaW50IHRvdG1hdGNoZXM7CisgICAgaW50ICpudW1tYXRjaGVzX2E7CisgICAgY2hhciAqKiptYXRjaGVzX3A7CisgICAgY2hhciAqKipjbnR4dHNfcDsKKyAgICBpbnQgKm1hdGNoZWQ7Cit7CisgICAgaW50IGksIGo7CisgICAgY2hhciAqYnVmOworICAgIGNoYXIgKnNlYXJjaCwgKnNsbm87CisgICAgaW50IHRvdHNvZmFyID0gMDsKKyAgICBjaGFyICoqbWF0Y2hlcyA9IE5VTEw7CisgICAgY2hhciAqKmNudHh0cyA9IE5VTEw7CisgICAgY2hhciAqZnVsbG5hbWU7CisgICAgY2hhciAqY250eDsKKworICAgIGFzc2VydCh0b3RtYXRjaGVzID4gMCk7CisKKyAgICBidWYgPSAoY2hhciAqKWFsbG9jKENTUkVBRF9CVUZTSVpFKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKChtYXRjaGVzID0gKGNoYXIgKiopYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiB0b3RtYXRjaGVzKSkgPT0gTlVMTCkKKwlnb3RvIHBhcnNlX291dDsKKyAgICBpZiAoKGNudHh0cyA9IChjaGFyICoqKWFsbG9jKHNpemVvZihjaGFyICopICogdG90bWF0Y2hlcykpID09IE5VTEwpCisJZ290byBwYXJzZV9vdXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaSsrKQorICAgIHsKKwlpZiAobnVtbWF0Y2hlc19hW2ldIDwgMSkKKwkgICAgY29udGludWU7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtbWF0Y2hlc19hW2ldOyBqKyspCisJeworCSAgIGlmICgoZnVsbG5hbWUgPSBjc19wYXJzZV9yZXN1bHRzKGksIGJ1ZiwgQ1NSRUFEX0JVRlNJWkUsICZjbnR4LAorCQkJICAgJnNsbm8sICZzZWFyY2gpKSA9PSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICBtYXRjaGVzW3RvdHNvZmFyXSA9IGNzX21ha2VfdmltX3N0eWxlX21hdGNoZXMoZnVsbG5hbWUsIHNsbm8sCisJCQkJCQkJICBzZWFyY2gsIHRhZ3N0cik7CisKKwkgICAgdmltX2ZyZWUoZnVsbG5hbWUpOworCisJICAgIGlmIChzdHJjbXAoY250eCwgIjxnbG9iYWw+IikgPT0gMCkKKwkJY250eHRzW3RvdHNvZmFyXSA9IE5VTEw7CisJICAgIGVsc2UKKwkJLyogbm90ZTogaWYgdmltX3N0cnNhdmUgcmV0dXJucyBOVUxMLCB0aGVuIHRoZSBjb250ZXh0CisJCSAqIHdpbGwgYmUgIjxnbG9iYWw+Iiwgd2hpY2ggaXMgbWlzbGVhZGluZy4KKwkJICovCisJCWNudHh0c1t0b3Rzb2Zhcl0gPSAoY2hhciAqKXZpbV9zdHJzYXZlKChjaGFyX3UgKiljbnR4KTsKKworCSAgICBpZiAobWF0Y2hlc1t0b3Rzb2Zhcl0gIT0gTlVMTCkKKwkJdG90c29mYXIrKzsKKworCX0gLyogZm9yIGFsbCBtYXRjaGVzICovCisKKwkodm9pZCljc19yZWFkX3Byb21wdChpKTsKKworICAgIH0gLyogZm9yIGFsbCBjc2NvcGUgY29ubmVjdGlvbnMgKi8KKworcGFyc2Vfb3V0OgorICAgICptYXRjaGVkID0gdG90c29mYXI7CisgICAgKm1hdGNoZXNfcCA9IG1hdGNoZXM7CisgICAgKmNudHh0c19wID0gY250eHRzOworICAgIHZpbV9mcmVlKGJ1Zik7Cit9IC8qIGNzX2ZpbGxfcmVzdWx0cyAqLworCisKKy8qIGdldCB0aGUgcmVxdWVzdGVkIHBhdGggY29tcG9uZW50cyAqLworICAgIHN0YXRpYyBjaGFyICoKK2NzX3BhdGhjb21wb25lbnRzKHBhdGgpCisgICAgY2hhcgkqcGF0aDsKK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcgkqczsKKworICAgIGlmIChwX2NzcGMgPT0gMCkKKwlyZXR1cm4gcGF0aDsKKworICAgIHMgPSBwYXRoICsgc3RybGVuKHBhdGgpIC0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9jc3BjOyArK2kpCisJd2hpbGUgKHMgPiBwYXRoICYmICotLXMgIT0gJy8nCisjaWZkZWYgV0lOMzIKKwkJJiYgKi0tcyAhPSAnXFwnCisjZW5kaWYKKwkJKQorCSAgICA7CisgICAgaWYgKChzID4gcGF0aCAmJiAqcyA9PSAnLycpCisjaWZkZWYgV0lOMzIKKwl8fCAocyA+IHBhdGggJiYgKnMgPT0gJ1xcJykKKyNlbmRpZgorCSAgICApCisJKytzOworICAgIHJldHVybiBzOworfQorCisvKgorICogUFJJVkFURTogY3NfcHJpbnRfdGFnc19wcml2CisgKgorICogY2FsbGVkIGZyb20gY3NfbWFuYWdlX21hdGNoZXMoKQorICovCisgICAgc3RhdGljIHZvaWQKK2NzX3ByaW50X3RhZ3NfcHJpdihtYXRjaGVzLCBjbnR4dHMsIG51bV9tYXRjaGVzKQorICAgIGNoYXIgKiptYXRjaGVzOworICAgIGNoYXIgKipjbnR4dHM7CisgICAgaW50IG51bV9tYXRjaGVzOworeworICAgIGNoYXIJKmJ1ZiA9IE5VTEw7CisgICAgaW50CQlidWZzaXplID0gMDsgLyogVHJhY2sgYXZhaWxhYmxlIGJ1ZnNpemUgKi8KKyAgICBpbnQJCW5ld3NpemUgPSAwOworICAgIGNoYXIJKnB0YWc7CisgICAgY2hhcgkqZm5hbWUsICpsbm8sICpleHRyYSwgKnRidWY7CisgICAgaW50CQlpLCBpZHgsIG51bTsKKyAgICBjaGFyCSpnbG9iYWxjbnR4ID0gIkdMT0JBTCI7CisgICAgY2hhcgkqY250eGZvcm1hdCA9ICIgPDwlcz4+IjsKKyAgICBjaGFyCSpjb250ZXh0OworICAgIGNoYXIJKmNzdGFnX21zZyA9IF8oIkNzY29wZSB0YWc6ICVzIik7CisgICAgY2hhcgkqY3NmbXRfc3RyID0gIiU0ZCAlNnMgICI7CisKKyAgICBhc3NlcnQgKG51bV9tYXRjaGVzID4gMCk7CisKKyAgICBpZiAoKHRidWYgPSAoY2hhciAqKWFsbG9jKHN0cmxlbihtYXRjaGVzWzBdKSArIDEpKSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIHN0cmNweSh0YnVmLCBtYXRjaGVzWzBdKTsKKyAgICBwdGFnID0gc3RydG9rKHRidWYsICJcdCIpOworCisgICAgbmV3c2l6ZSA9IHN0cmxlbihjc3RhZ19tc2cpICsgc3RybGVuKHB0YWcpOworICAgIGJ1ZiA9IChjaGFyICopYWxsb2MobmV3c2l6ZSk7CisgICAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIHsKKwlidWZzaXplID0gbmV3c2l6ZTsKKwkodm9pZClzcHJpbnRmKGJ1ZiwgY3N0YWdfbXNnLCBwdGFnKTsKKwlNU0dfUFVUU19BVFRSKGJ1ZiwgaGxfYXR0cihITEZfVCkpOworICAgIH0KKworICAgIHZpbV9mcmVlKHRidWYpOworCisgICAgTVNHX1BVVFNfQVRUUihfKCJcbiAgICMgICBsaW5lIiksIGhsX2F0dHIoSExGX1QpKTsgICAgLyogc3RybGVuIGlzIDcgKi8KKyAgICBtc2dfYWR2YW5jZShtc2dfY29sICsgMik7CisgICAgTVNHX1BVVFNfQVRUUihfKCJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iKSwgaGxfYXR0cihITEZfVCkpOworCisgICAgbnVtID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7IGkrKykKKyAgICB7CisJaWR4ID0gaTsKKworCS8qIGlmIHdlIHJlYWxseSB3YW50ZWQgdG8sIHdlIGNvdWxkIGF2b2lkIHRoaXMgbWFsbG9jIGFuZCBzdHJjcHkKKwkgKiBieSBwYXJzaW5nIG1hdGNoZXNbaV0gb24gdGhlIGZseSBhbmQgcGxhY2luZyBzdHVmZiBpbnRvIGJ1ZgorCSAqIGRpcmVjdGx5LCBidXQgdGhhdCdzIHRvbyBtdWNoIG9mIGEgaGFzc2xlCisJICovCisJaWYgKCh0YnVmID0gKGNoYXIgKilhbGxvYyhzdHJsZW4obWF0Y2hlc1tpZHhdKSArIDEpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwkodm9pZClzdHJjcHkodGJ1ZiwgbWF0Y2hlc1tpZHhdKTsKKworCWlmICgoZm5hbWUgPSBzdHJ0b2sodGJ1ZiwgKGNvbnN0IGNoYXIgKikiXHQiKSkgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJaWYgKChmbmFtZSA9IHN0cnRvayhOVUxMLCAoY29uc3QgY2hhciAqKSJcdCIpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlpZiAoKGxubyA9IHN0cnRvayhOVUxMLCAoY29uc3QgY2hhciAqKSJcdCIpKSA9PSBOVUxMKQorCXsKKwkgICAgLyogaWYgTlVMTCwgdGhlbiBubyAiZXh0cmEiLCBhbHRob3VnaCBpbiBjc2NvcGUncyBjYXNlLCB0aGVyZQorCSAgICAgKiBzaG91bGQgYWx3YXlzIGJlICJleHRyYSIuCisJICAgICAqLworCSAgICBleHRyYSA9IE5VTEw7CisJfQorCisJZXh0cmEgPSBsbm8gKyBzdHJsZW4obG5vKSArIDE7CisKKwlsbm9bc3RybGVuKGxubyktMl0gPSAnXDAnOyAgLyogaWdub3JlIDsiIGF0IHRoZSBlbmQgKi8KKworCS8qIGhvcGVmdWxseSAnbnVtJyAobnVtIG9mIG1hdGNoZXMpIHdpbGwgYmUgbGVzcyB0aGFuIDEwXjE2ICovCisJbmV3c2l6ZSA9IHN0cmxlbihjc2ZtdF9zdHIpICsgMTYgKyBzdHJsZW4obG5vKTsKKwlpZiAoYnVmc2l6ZSA8IG5ld3NpemUpCisJeworCSAgICBidWYgPSAoY2hhciAqKXZpbV9yZWFsbG9jKGJ1ZiwgbmV3c2l6ZSk7CisJICAgIGlmIChidWYgPT0gTlVMTCkKKwkJYnVmc2l6ZSA9IDA7CisJICAgIGVsc2UKKwkJYnVmc2l6ZSA9IG5ld3NpemU7CisJfQorCWlmIChidWYgIT0gTlVMTCkKKwl7CisJICAgIC8qIGNzZm10X3N0ciA9ICIlNGQgJTZzICAiOyAqLworCSAgICAodm9pZClzcHJpbnRmKGJ1ZiwgY3NmbXRfc3RyLCBudW0sIGxubyk7CisJICAgIE1TR19QVVRTX0FUVFIoYnVmLCBobF9hdHRyKEhMRl9DTSkpOworCX0KKwlNU0dfUFVUU19MT05HX0FUVFIoY3NfcGF0aGNvbXBvbmVudHMoZm5hbWUpLCBobF9hdHRyKEhMRl9DTSkpOworCisJLyogY29tcHV0ZSB0aGUgcmVxdWlyZWQgc3BhY2UgZm9yIHRoZSBjb250ZXh0ICovCisJaWYgKGNudHh0c1tpZHhdICE9IE5VTEwpCisJICAgIGNvbnRleHQgPSBjbnR4dHNbaWR4XTsKKwllbHNlCisJICAgIGNvbnRleHQgPSBnbG9iYWxjbnR4OworCW5ld3NpemUgPSBzdHJsZW4oY29udGV4dCkgKyBzdHJsZW4oY250eGZvcm1hdCk7CisKKwlpZiAoYnVmc2l6ZSA8IG5ld3NpemUpCisJeworCSAgICBidWYgPSAoY2hhciAqKXZpbV9yZWFsbG9jKGJ1ZiwgbmV3c2l6ZSk7CisJICAgIGlmIChidWYgPT0gTlVMTCkKKwkJYnVmc2l6ZSA9IDA7CisJICAgIGVsc2UKKwkJYnVmc2l6ZSA9IG5ld3NpemU7CisJfQorCWlmIChidWYgIT0gTlVMTCkKKwl7CisJICAgICh2b2lkKXNwcmludGYoYnVmLCBjbnR4Zm9ybWF0LCBjb250ZXh0KTsKKworCSAgICAvKiBwcmludCB0aGUgY29udGV4dCBvbmx5IGlmIGl0IGZpdHMgb24gdGhlIHNhbWUgbGluZSAqLworCSAgICBpZiAobXNnX2NvbCArIChpbnQpc3RybGVuKGJ1ZikgPj0gKGludClDb2x1bW5zKQorCQltc2dfcHV0Y2hhcignXG4nKTsKKwkgICAgbXNnX2FkdmFuY2UoMTIpOworCSAgICBNU0dfUFVUU19MT05HKGJ1Zik7CisJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCX0KKwlpZiAoZXh0cmEgIT0gTlVMTCkKKwl7CisJICAgIG1zZ19hZHZhbmNlKDEzKTsKKwkgICAgTVNHX1BVVFNfTE9ORyhleHRyYSk7CisJfQorCisJdmltX2ZyZWUodGJ1Zik7IC8qIG9ubHkgYWZ0ZXIgcHJpbnRpbmcgZXh0cmEgZHVlIHRvIHN0cnRvayB1c2UgKi8KKworCWlmIChtc2dfY29sKQorCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKworCXVpX2JyZWFrY2hlY2soKTsKKwlpZiAoZ290X2ludCkKKwl7CisJICAgIGdvdF9pbnQgPSBGQUxTRTsJLyogZG9uJ3QgcHJpbnQgYW55IG1vcmUgbWF0Y2hlcyAqLworCSAgICBicmVhazsKKwl9CisKKwludW0rKzsKKyAgICB9IC8qIGZvciBhbGwgbWF0Y2hlcyAqLworCisgICAgdmltX2ZyZWUoYnVmKTsKK30gLyogY3NfcHJpbnRfdGFnc19wcml2ICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX3JlYWRfcHJvbXB0CisgKgorICogcmVhZCBhIGNzY29wZSBwcm9tcHQgKGJhc2ljYWxseSwgc2tpcCBvdmVyIHRoZSAiPj4gIikKKyAqLworICAgIHN0YXRpYyBpbnQKK2NzX3JlYWRfcHJvbXB0KGkpCisgICAgaW50IGk7Cit7CisgICAgaW50CQljaDsKKyAgICBjaGFyCSpidWYgPSBOVUxMOyAvKiBidWZmZXIgZm9yIHBvc3NpYmxlIGVycm9yIG1lc3NhZ2UgZnJvbSBjc2NvcGUgKi8KKyAgICBpbnQJCWJ1ZnBvcyA9IDA7CisgICAgY2hhcgkqY3NfZW1zZzsKKyAgICBpbnQJCW1heGxlbjsKKyAgICBzdGF0aWMgY2hhciAqZXByb21wdCA9ICJQcmVzcyB0aGUgUkVUVVJOIGtleSB0byBjb250aW51ZToiOworICAgIGludAkJZXByb21wdGxlbiA9IHN0cmxlbihlcHJvbXB0KTsKKyAgICBpbnQJCW47CisKKyAgICBjc19lbXNnID0gXygiRTYwOTogQ3Njb3BlIGVycm9yOiAlcyIpOworICAgIC8qIGNvbXB1dGUgbWF4aW11bSBhbGxvd2VkIGxlbiBmb3IgQ3Njb3BlIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBtYXhsZW4gPSAoaW50KShJT1NJWkUgLSBzdHJsZW4oY3NfZW1zZykpOworCisgICAgZm9yICg7OykKKyAgICB7CisJd2hpbGUgKChjaCA9IGdldGMoY3NpbmZvW2ldLmZyX2ZwKSkgIT0gRU9GICYmIGNoICE9IENTQ09QRV9QUk9NUFRbMF0pCisJICAgIC8qIGlmIHRoZXJlIGlzIHJvb20gYW5kIGNoYXIgaXMgcHJpbnRhYmxlICovCisJICAgIGlmIChidWZwb3MgPCBtYXhsZW4gLSAxICYmIHZpbV9pc3ByaW50YyhjaCkpCisJICAgIHsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSAvKiBsYXp5IGJ1ZmZlciBhbGxvY2F0aW9uICovCisJCSAgICBidWYgPSAoY2hhciAqKWFsbG9jKG1heGxlbik7CisJCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQkgICAgLyogYXBwZW5kIGNoYXJhY3RlciB0byB0aGUgbWVzc2FnZSAqLworCQkgICAgYnVmW2J1ZnBvcysrXSA9IGNoOworCQkgICAgYnVmW2J1ZnBvc10gPSBOVUw7CisJCSAgICBpZiAoYnVmcG9zID49IGVwcm9tcHRsZW4KKwkJCSAgICAmJiBzdHJjbXAoJmJ1ZltidWZwb3MgLSBlcHJvbXB0bGVuXSwgZXByb21wdCkgPT0gMCkKKwkJICAgIHsKKwkJCS8qIHJlbW92ZSBlcHJvbXB0IGZyb20gYnVmICovCisJCQlidWZbYnVmcG9zIC0gZXByb21wdGxlbl0gPSBOVUw7CisKKwkJCS8qIHByaW50IG1lc3NhZ2UgdG8gdXNlciAqLworCQkJKHZvaWQpRU1TRzIoY3NfZW1zZywgYnVmKTsKKworCQkJLyogc2VuZCBSRVRVUk4gdG8gY3Njb3BlICovCisJCQkodm9pZClwdXRjKCdcbicsIGNzaW5mb1tpXS50b19mcCk7CisJCQkodm9pZClmZmx1c2goY3NpbmZvW2ldLnRvX2ZwKTsKKworCQkJLyogY2xlYXIgYnVmICovCisJCQlidWZwb3MgPSAwOworCQkJYnVmW2J1ZnBvc10gPSBOVUw7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJZm9yIChuID0gMDsgbiA8IChpbnQpc3RybGVuKENTQ09QRV9QUk9NUFQpOyArK24pCisJeworCSAgICBpZiAobiA+IDApCisJCWNoID0gZ2V0Yyhjc2luZm9baV0uZnJfZnApOworCSAgICBpZiAoY2ggPT0gRU9GKQorCSAgICB7CisJCVBFUlJPUigiY3NfcmVhZF9wcm9tcHQgRU9GIik7CisJCWlmIChidWYgIT0gTlVMTCAmJiBidWZbMF0gIT0gTlVMKQorCQkgICAgKHZvaWQpRU1TRzIoY3NfZW1zZywgYnVmKTsKKwkJZWxzZSBpZiAocF9jc3ZlcmJvc2UpCisJCSAgICBjc19yZWFkaW5nX2Vtc2coaSk7IC8qIGRvbid0IGhhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLworCQljc19yZWxlYXNlX2NzcChpLCBUUlVFKTsKKwkJdmltX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIENTQ09QRV9GQUlMVVJFOworCSAgICB9CisKKwkgICAgaWYgKGNoICE9IENTQ09QRV9QUk9NUFRbbl0pCisJICAgIHsKKwkJY2ggPSBFT0Y7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYgKGNoID09IEVPRikKKwkgICAgY29udGludWU7CSAgICAvKiBkaWRuJ3QgZmluZCB0aGUgcHJvbXB0ICovCisJYnJlYWs7CQkgICAgLyogZGlkIGZpbmQgdGhlIHByb21wdCAqLworICAgIH0KKworICAgIHZpbV9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIENTQ09QRV9TVUNDRVNTOworfQorCisKKy8qCisgKiBQUklWQVRFOiBjc19yZWxlYXNlX2NzcAorICoKKyAqIGRvZXMgdGhlIGFjdHVhbCBmcmVlJ2luZyBmb3IgdGhlIGNzIHB0ciB3aXRoIGFuIG9wdGlvbmFsIGZsYWcgb2Ygd2hldGhlcgorICogb3Igbm90IHRvIGZyZWUgdGhlIGZpbGVuYW1lLiAgY2FsbGVkIGJ5IGNzX2tpbGwgYW5kIGNzX3Jlc2V0LgorICovCisgICAgc3RhdGljIHZvaWQKK2NzX3JlbGVhc2VfY3NwKGksIGZyZWVmbnBwKQorICAgIGludCBpOworICAgIGludCBmcmVlZm5wcDsKK3sKKyNpZiBkZWZpbmVkKFVOSVgpCisgICAgaW50IHBzdGF0OworI2Vsc2UKKyAgICAvKgorICAgICAqIFRyeWluZyB0byBleGl0IG5vcm1hbGx5IChub3Qgc3VyZSB3aGV0aGVyIGl0IGlzIGZpdCB0byBVTklYIGNzY29wZQorICAgICAqLworICAgIGlmIChjc2luZm9baV0udG9fZnAgIT0gTlVMTCkKKyAgICB7CisJKHZvaWQpZnB1dHMoInFcbiIsIGNzaW5mb1tpXS50b19mcCk7CisJKHZvaWQpZmZsdXNoKGNzaW5mb1tpXS50b19mcCk7CisgICAgfQorICAgIC8qIGdpdmUgY3Njb3BlIGNoYW5jZSB0byBleGl0IG5vcm1hbGx5ICovCisgICAgaWYgKGNzaW5mb1tpXS5oUHJvYyA+IDAKKwkgICAgJiYgV2FpdEZvclNpbmdsZU9iamVjdChjc2luZm9baV0uaFByb2MsIDEwMDApID09IFdBSVRfVElNRU9VVCkKKwlUZXJtaW5hdGVQcm9jZXNzKGNzaW5mb1tpXS5oUHJvYywgMCk7CisjZW5kaWYKKworICAgIGlmIChjc2luZm9baV0uZnJfZnAgIT0gTlVMTCkKKwkodm9pZClmY2xvc2UoY3NpbmZvW2ldLmZyX2ZwKTsKKyAgICBpZiAoY3NpbmZvW2ldLnRvX2ZwICE9IE5VTEwpCisJKHZvaWQpZmNsb3NlKGNzaW5mb1tpXS50b19mcCk7CisKKyAgICAvKgorICAgICAqIFNhZmV0eSBjaGVjazogSWYgdGhlIFBJRCB3b3VsZCBiZSB6ZXJvIGhlcmUsIHRoZSBlbnRpcmUgWCBzZXNzaW9uIHdvdWxkCisgICAgICogYmUga2lsbGVkLiAgLTEgYW5kIDEgYXJlIGRhbmdlcm91cyBhcyB3ZWxsLgorICAgICAqLworI2lmIGRlZmluZWQoVU5JWCkKKyAgICBpZiAoY3NpbmZvW2ldLnBpZCA+IDEpCisgICAgeworCWtpbGwoY3NpbmZvW2ldLnBpZCwgU0lHVEVSTSk7CisJKHZvaWQpd2FpdHBpZChjc2luZm9baV0ucGlkLCAmcHN0YXQsIDApOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGZyZWVmbnBwKQorICAgIHsKKwl2aW1fZnJlZShjc2luZm9baV0uZm5hbWUpOworCXZpbV9mcmVlKGNzaW5mb1tpXS5wcGF0aCk7CisJdmltX2ZyZWUoY3NpbmZvW2ldLmZsYWdzKTsKKyAgICB9CisKKyAgICBjbGVhcl9jc2luZm8oaSk7Cit9IC8qIGNzX3JlbGVhc2VfY3NwICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX3Jlc2V0CisgKgorICogY2FsbHMgY3Nfa2lsbCBvbiBhbGwgY3Njb3BlIGNvbm5lY3Rpb25zIHRoZW4gcmVpbml0cworICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2NzX3Jlc2V0KGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY2hhcgkqKmRibGlzdCA9IE5VTEwsICoqcHBsaXN0ID0gTlVMTCwgKipmbGxpc3QgPSBOVUxMOworICAgIGludAlpOworICAgIGNoYXIgYnVmWzhdOyAvKiBmb3Igc3ByaW50ZiAiICgjJWQpIiAqLworCisgICAgLyogbWFsbG9jIG91ciBkYiBhbmQgcHBhdGggbGlzdCAqLworICAgIGRibGlzdCA9IChjaGFyICoqKWFsbG9jKENTQ09QRV9NQVhfQ09OTkVDVElPTlMgKiBzaXplb2YoY2hhciAqKSk7CisgICAgcHBsaXN0ID0gKGNoYXIgKiopYWxsb2MoQ1NDT1BFX01BWF9DT05ORUNUSU9OUyAqIHNpemVvZihjaGFyICopKTsKKyAgICBmbGxpc3QgPSAoY2hhciAqKilhbGxvYyhDU0NPUEVfTUFYX0NPTk5FQ1RJT05TICogc2l6ZW9mKGNoYXIgKikpOworICAgIGlmIChkYmxpc3QgPT0gTlVMTCB8fCBwcGxpc3QgPT0gTlVMTCB8fCBmbGxpc3QgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoZGJsaXN0KTsKKwl2aW1fZnJlZShwcGxpc3QpOworCXZpbV9mcmVlKGZsbGlzdCk7CisJcmV0dXJuIENTQ09QRV9GQUlMVVJFOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBDU0NPUEVfTUFYX0NPTk5FQ1RJT05TOyBpKyspCisgICAgeworCWRibGlzdFtpXSA9IGNzaW5mb1tpXS5mbmFtZTsKKwlwcGxpc3RbaV0gPSBjc2luZm9baV0ucHBhdGg7CisJZmxsaXN0W2ldID0gY3NpbmZvW2ldLmZsYWdzOworCWlmIChjc2luZm9baV0uZm5hbWUgIT0gTlVMTCkKKwkgICAgY3NfcmVsZWFzZV9jc3AoaSwgRkFMU0UpOworICAgIH0KKworICAgIC8qIHJlYnVpbGQgdGhlIGNzY29wZSBjb25uZWN0aW9uIGxpc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1NDT1BFX01BWF9DT05ORUNUSU9OUzsgaSsrKQorICAgIHsKKwlpZiAoZGJsaXN0W2ldICE9IE5VTEwpCisJeworCSAgICBjc19hZGRfY29tbW9uKGRibGlzdFtpXSwgcHBsaXN0W2ldLCBmbGxpc3RbaV0pOworCSAgICBpZiAocF9jc3ZlcmJvc2UpCisJICAgIHsKKwkJLyogZG9udCcgdXNlIHNtc2dfYXR0ciBiZWNhdXNlIHdhbnQgdG8gZGlzcGxheQorCQkgKiBjb25uZWN0aW9uIG51bWJlciBpbiB0aGUgc2FtZSBsaW5lIGFzCisJCSAqICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UuLi4iCisJCSAqLworCQlzcHJpbnRmKGJ1ZiwgIiAoIyVkKSIsIGkpOworCQlNU0dfUFVUU19BVFRSKGJ1ZiwgaGxfYXR0cihITEZfUikpOworCSAgICB9CisJfQorCXZpbV9mcmVlKGRibGlzdFtpXSk7CisJdmltX2ZyZWUocHBsaXN0W2ldKTsKKwl2aW1fZnJlZShmbGxpc3RbaV0pOworICAgIH0KKyAgICB2aW1fZnJlZShkYmxpc3QpOworICAgIHZpbV9mcmVlKHBwbGlzdCk7CisgICAgdmltX2ZyZWUoZmxsaXN0KTsKKworICAgIGlmIChwX2NzdmVyYm9zZSkKKwlNU0dfQVRUUihfKCJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIpLCBobF9hdHRyKEhMRl9SKSB8IE1TR19ISVNUKTsKKyAgICByZXR1cm4gQ1NDT1BFX1NVQ0NFU1M7Cit9IC8qIGNzX3Jlc2V0ICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX3Jlc29sdmVfZmlsZQorICoKKyAqIGNvbnN0cnVjdCB0aGUgZnVsbCBwYXRobmFtZSB0byBhIGZpbGUgZm91bmQgaW4gdGhlIGNzY29wZSBkYXRhYmFzZS4KKyAqIChQcmVwZW5kcyBwcGF0aCwgaWYgdGhlcmUgaXMgb25lIGFuZCBpZiBpdCdzIG5vdCBhbHJlYWR5IHByZXBlbmRlZCwKKyAqIG90aGVyd2lzZSBqdXN0IHVzZXMgdGhlIG5hbWUgZm91bmQuKQorICoKKyAqIHdlIG5lZWQgdG8gcHJlcGVuZCB0aGUgcHJlZml4IGJlY2F1c2Ugb24gc29tZSBjc2NvcGUncyAoZS5nLiwgdGhlIG9uZSB0aGF0CisgKiBzaGlwcyB3aXRoIFNvbGFyaXMgMi42KSwgdGhlIG91dHB1dCBuZXZlciBoYXMgdGhlIHByZWZpeCBwcmVwZW5kZWQuCisgKiBjb250cmFzdCB0aGlzIHdpdGggbXkgZGV2ZWxvcG1lbnQgc3lzdGVtIChEaWdpdGFsIFVuaXgpLCB3aGljaCBkb2VzLgorICovCisgICAgc3RhdGljIGNoYXIgKgorY3NfcmVzb2x2ZV9maWxlKGksIG5hbWUpCisgICAgaW50IGk7CisgICAgY2hhciAqbmFtZTsKK3sKKyAgICBjaGFyICpmdWxsbmFtZTsKKyAgICBpbnQgbGVuOworCisgICAgLyoKKyAgICAgKiBwcGF0aCBpcyBmcmVlZCB3aGVuIHdlIGRlc3Ryb3kgdGhlIGNzY29wZSBjb25uZWN0aW9uLgorICAgICAqIGZ1bGxuYW1lIGlzIGZyZWVkIGFmdGVyIGNzX21ha2VfdmltX3N0eWxlX21hdGNoZXMsIGFmdGVyIGl0J3MgYmVlbgorICAgICAqIGNvcGllZCBpbnRvIHRoZSB0YWcgYnVmZmVyIHVzZWQgYnkgdmltCisgICAgICovCisgICAgbGVuID0gc3RybGVuKG5hbWUpICsgMjsKKyAgICBpZiAoY3NpbmZvW2ldLnBwYXRoICE9IE5VTEwpCisJbGVuICs9IHN0cmxlbihjc2luZm9baV0ucHBhdGgpOworCisgICAgaWYgKChmdWxsbmFtZSA9IChjaGFyICopYWxsb2MobGVuKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogbm90ZS9leGFtcGxlOiB0aGlzIHdvbid0IHdvcmsgaWYgdGhlIGNzY29wZSBvdXRwdXQgYWxyZWFkeSBzdGFydHMKKyAgICAgKiAiLi4vLi4iIGFuZCB0aGUgcHJlZml4IHBhdGggaXMgYWxzbyAiLi4vLi4iLiAgaWYgc29tZXRoaW5nIGxpa2UgdGhpcworICAgICAqIGhhcHBlbnMsIHlvdSBhcmUgc2NyZXdlZCB1cCBhbmQgbmVlZCB0byBmaXggaG93IHlvdSdyZSB1c2luZyBjc2NvcGUuCisgICAgICovCisgICAgaWYgKGNzaW5mb1tpXS5wcGF0aCAhPSBOVUxMICYmCisJKHN0cm5jbXAobmFtZSwgY3NpbmZvW2ldLnBwYXRoLCBzdHJsZW4oY3NpbmZvW2ldLnBwYXRoKSkgIT0gMCkgJiYKKwkobmFtZVswXSAhPSAnLycpCisjaWZkZWYgV0lOMzIKKwkmJiBuYW1lWzBdICE9ICdcXCcgJiYgbmFtZVsxXSAhPSAnOicKKyNlbmRpZgorCSkKKwkodm9pZClzcHJpbnRmKGZ1bGxuYW1lLCAiJXMvJXMiLCBjc2luZm9baV0ucHBhdGgsIG5hbWUpOworICAgIGVsc2UKKwkodm9pZClzcHJpbnRmKGZ1bGxuYW1lLCAiJXMiLCBuYW1lKTsKKworICAgIHJldHVybiBmdWxsbmFtZTsKK30gLyogY3NfcmVzb2x2ZV9maWxlICovCisKKworLyoKKyAqIFBSSVZBVEU6IGNzX3Nob3cKKyAqCisgKiBzaG93IGFsbCBjc2NvcGUgY29ubmVjdGlvbnMKKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50Citjc19zaG93KGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgc2hvcnQgaTsKKyAgICBpZiAoY3NfY250X2Nvbm5lY3Rpb25zKCkgPT0gMCkKKwlNU0dfUFVUUyhfKCJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIpKTsKKyAgICBlbHNlCisgICAgeworCU1TR19QVVRTX0FUVFIoCisJICAgIF8oIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIpLAorCSAgICBobF9hdHRyKEhMRl9UKSk7CisJZm9yIChpID0gMDsgaSA8IENTQ09QRV9NQVhfQ09OTkVDVElPTlM7IGkrKykKKwl7CisJICAgIGlmIChjc2luZm9baV0uZm5hbWUgPT0gTlVMTCkKKwkJY29udGludWU7CisKKwkgICAgaWYgKGNzaW5mb1tpXS5wcGF0aCAhPSBOVUxMKQorCQkodm9pZClzbXNnKChjaGFyX3UgKikiJTJkICUtNWxkICAlLTM0cyAgJS0zMnMiLAorCQkgICAgaSwgKGxvbmcpY3NpbmZvW2ldLnBpZCwgY3NpbmZvW2ldLmZuYW1lLCBjc2luZm9baV0ucHBhdGgpOworCSAgICBlbHNlCisJCSh2b2lkKXNtc2coKGNoYXJfdSAqKSIlMmQgJS01bGQgICUtMzRzICA8bm9uZT4iLAorCQkJICAgaSwgKGxvbmcpY3NpbmZvW2ldLnBpZCwgY3NpbmZvW2ldLmZuYW1lKTsKKwl9CisgICAgfQorCisgICAgd2FpdF9yZXR1cm4oVFJVRSk7CisgICAgcmV0dXJuIENTQ09QRV9TVUNDRVNTOworfSAvKiBjc19zaG93ICovCisKKyNlbmRpZgkvKiBGRUFUX0NTQ09QRSAqLworCisvKiB0aGUgZW5kICovCmRpZmYgLS1naXQgYS9zcmMvaWZfY3Njb3BlLmggYi9zcmMvaWZfY3Njb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxNDlkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9jc2NvcGUuaApAQCAtMCwwICsxLDk2IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIENTQ09QRSBzdXBwb3J0IGZvciBWaW0gYWRkZWQgYnkgQW5keSBLYWhuIDxrYWhuQHprMy5kZWMuY29tPgorICogUG9ydGVkIHRvIFdpbjMyIGJ5IFNlcmdleSBLaG9yZXYgPGtob3JldkBzb2Z0bGFiLnJ1PgorICoKKyAqIFRoZSBiYXNpYyBpZGVhL3N0cnVjdHVyZSBvZiBjc2NvcGUgZm9yIFZpbSB3YXMgYm9ycm93ZWQgZnJvbSBOdmkuCisgKiBUaGVyZSBtaWdodCBiZSBhIGZldyBsaW5lcyBvZiBjb2RlIHRoYXQgbG9vayBzaW1pbGFyIHRvIHdoYXQgTnZpCisgKiBoYXMuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBhbmQgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSBhbm5veWluZworICogQlNEIGxpY2Vuc2UsIHRoZW4gc3VlIG1lOyBJJ20gbm90IHdvcnRoIG11Y2ggYW55d2F5LgorICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQ1NDT1BFKSB8fCBkZWZpbmVkKFBST1RPKQorCisjaWYgZGVmaW5lZChVTklYKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogcGlkX3QgKi8KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgkJLyogZGV2X3QsIGlub190ICovCisjZWxpZiBkZWZpbmVkIChXSU4zMikKKyMgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGVuZGlmCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjZGVmaW5lIENTQ09QRV9TVUNDRVNTCQkwCisjZGVmaW5lIENTQ09QRV9GQUlMVVJFCQktMQorI2RlZmluZSBDU0NPUEVfTUFYX0NPTk5FQ1RJT05TCTggICAvKiB5b3UgYWN0dWFsbHkgbmVlZCBtb3JlPyAqLworCisjZGVmaW5lCUNTQ09QRV9EQkZJTEUJCSJjc2NvcGUub3V0IgorI2RlZmluZQlDU0NPUEVfUFJPTVBUCQkiPj4gIgorI2RlZmluZQlDU0NPUEVfUVVFUklFUwkJInNnZGN0IGVmaSIKKworLyoKKyAqIHMgMG5hbWUJRmluZCB0aGlzIEMgc3ltYm9sCisgKiBnIDFuYW1lCUZpbmQgdGhpcyBkZWZpbml0aW9uCisgKiBkIDJuYW1lCUZpbmQgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uCisgKiBjIDNuYW1lCUZpbmQgZnVuY3Rpb25zIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogdCA0c3RyaW5nCWZpbmQgdGV4dCBzdHJpbmcgKGNzY29wZSAxMi45KQorICogdCA0bmFtZQlGaW5kIGFzc2lnbm1lbnRzIHRvIChjc2NvcGUgMTMuMykKKyAqICAgNXBhdHRlcm4JY2hhbmdlIHBhdHRlcm4gLS0gTk9UIFVTRUQKKyAqIGUgNnBhdHRlcm4JRmluZCB0aGlzIGVncmVwIHBhdHRlcm4KKyAqIGYgN25hbWUJRmluZCB0aGlzIGZpbGUKKyAqIGkgOG5hbWUJRmluZCBmaWxlcyAjaW5jbHVkaW5nIHRoaXMgZmlsZQorICovCisjZGVmaW5lCUZJTkRfVVNBR0UgImZpbmQgY3xkfGV8ZnxnfGl8c3x0IG5hbWUiCisjZGVmaW5lIEZJTkRfSEVMUCAiXG5cCisgICAgICAgYzogRmluZCBmdW5jdGlvbnMgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cCisgICAgICAgZDogRmluZCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoaXMgZnVuY3Rpb25cblwKKyAgICAgICBlOiBGaW5kIHRoaXMgZWdyZXAgcGF0dGVyblxuXAorICAgICAgIGY6IEZpbmQgdGhpcyBmaWxlXG5cCisgICAgICAgZzogRmluZCB0aGlzIGRlZmluaXRpb25cblwKKyAgICAgICBpOiBGaW5kIGZpbGVzICNpbmNsdWRpbmcgdGhpcyBmaWxlXG5cCisgICAgICAgczogRmluZCB0aGlzIEMgc3ltYm9sXG5cCisgICAgICAgdDogRmluZCBhc3NpZ25tZW50cyB0b1xuIgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICogIG5hbWU7CisgICAgaW50ICAgICAoKmZ1bmMpIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisgICAgY2hhciAqICBoZWxwOworICAgIGNoYXIgKiAgdXNhZ2U7CisgICAgaW50CSAgICBjYW5zcGxpdDsJCS8qIGlmIHN1cHBvcnRzIHNwbGl0dGluZyB3aW5kb3cgKi8KK30gY3NjbWRfVDsKKwordHlwZWRlZiBzdHJ1Y3QgY3NpIHsKKyAgICBjaGFyICoJICAgIGZuYW1lOwkvKiBjc2NvcGUgZGIgbmFtZSAqLworICAgIGNoYXIgKgkgICAgcHBhdGg7CS8qIHBhdGggdG8gcHJlcGVuZCAodGhlIC1QIG9wdGlvbikgKi8KKyAgICBjaGFyICoJICAgIGZsYWdzOwkvKiBhZGRpdGlvbmFsIGNzY29wZSBmbGFncy9vcHRpb25zIChlLmcsIC1wMikgKi8KKyNpZiBkZWZpbmVkKFVOSVgpCisgICAgcGlkX3QJICAgIHBpZDsJLyogUElEIG9mIHRoZSBjb25uZWN0ZWQgY3Njb3BlIHByb2Nlc3MuICovCisgICAgZGV2X3QJICAgIHN0X2RldjsJLyogSUQgb2YgZGV2IGNvbnRhaW5pbmcgY3Njb3BlIGRiICovCisgICAgaW5vX3QJICAgIHN0X2lubzsJLyogaW5vZGUgbnVtYmVyIG9mIGNzY29wZSBkYiAqLworI2VsaWYgZGVmaW5lZChXSU4zMikKKyAgICBpbnQJICAgIHBpZDsJLyogQ2FuJ3QgZ2V0IHBpZCBzbyBzZXQgaXQgdG8gMCA7KSAqLworICAgIEhBTkRMRQkgICAgaFByb2M7CS8qIGNzY29wZSBwcm9jZXNzIGhhbmRsZSAqLworICAgIERXT1JECSAgICBuVm9sdW1lOwkvKiBWb2x1bWUgc2VyaWFsIG51bWJlciwgaW5zdGVhZCBvZiBzdF9kZXYgKi8KKyAgICBEV09SRAkgICAgbkluZGV4SGlnaDsJLyogc3RfaW5vIGhhcyBubyBtZWFuaW5nIGluIHRoZSBXaW5kb3dzICovCisgICAgRFdPUkQJICAgIG5JbmRleExvdzsKKyNlbmRpZgorCisgICAgRklMRSAqCSAgICBmcl9mcDsJLyogZnJvbSBjc2NvcGU6IEZJTEUuICovCisgICAgRklMRSAqCSAgICB0b19mcDsJLyogdG8gY3Njb3BlOiBGSUxFLiAqLworfSBjc2luZm9fVDsKKwordHlwZWRlZiBlbnVtIHsgQWRkLCBGaW5kLCBIZWxwLCBLaWxsLCBSZXNldCwgU2hvdyB9IGNzaWRfZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTdG9yZSwKKyAgICBHZXQsCisgICAgRnJlZSwKKyAgICBQcmludAorfSBtY21kX2U7CisKKworI2VuZGlmCS8qIEZFQVRfQ1NDT1BFICovCisKKy8qIHRoZSBlbmQgKi8KZGlmZiAtLWdpdCBhL3NyYy9pZl9vbGUuY3BwIGIvc3JjL2lmX29sZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1N2YxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9vbGUuY3BwCkBAIC0wLDAgKzEsNzc4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworI2lmIGRlZmluZWQoRkVBVF9PTEUpICYmIGRlZmluZWQoRkVBVF9HVUlfVzMyKQorLyoKKyAqIE9MRSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogU2VlIG9zX21zd2luLmMgZm9yIHRoZSBjbGllbnQgc2lkZS4KKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG9sZWF1dG8uaD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAidmltLmgiCitleHRlcm4gSFdORCBzX2h3bmQ7CitleHRlcm4gSFdORCB2aW1fcGFyZW50X2h3bmQ7Cit9CisKKyNpbmNsdWRlICJpZl9vbGUuaCIJLy8gSW50ZXJmYWNlIGRlZmluaXRpb25zCisjaW5jbHVkZSAiaWlkX29sZS5jIgkvLyBVVUlEIGRlZmluaXRpb25zIChjb21waWxlIGhlcmUpCisKKy8qIFN1cHBseSBmdW5jdGlvbiBwcm90b3R5cGUgdG8gd29yayBhcm91bmQgYnVnIGluIE1pbmd3IG9sZWF1dG8uaCBoZWFkZXIgKi8KKyNpZmRlZiBfX01JTkdXMzJfXworV0lOT0xFQVVUQVBJIFVuUmVnaXN0ZXJUeXBlTGliKFJFRkdVSUQgbGliSUQsIFdPUkQgd1Zlck1ham9yLAorCSAgICBXT1JEIHdWZXJNaW5vciwgTENJRCBsY2lkLCBTWVNLSU5EIHN5c2tpbmQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIDEuIEludGVybmFsIGRlZmluaXRpb25zIGZvciB0aGlzIGZpbGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjbGFzcyBDVmltOworY2xhc3MgQ1ZpbUNGOworCisvKiBJbnRlcm5hbCBkYXRhICovCisvLyBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVnaXN0ZXJlZCBjbGFzcyBmYWN0b3J5CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjZl9pZCA9IDA7CisKKy8vIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW5uaW5nIGFwcGxpY2F0aW9uIG9iamVjdAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBwX2lkID0gMDsKKworLy8gVGhlIHNpbmdsZSBnbG9iYWwgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGZhY3RvcnkKK3N0YXRpYyBDVmltQ0YgKmNmID0gMDsKKworLy8gVGhlIHNpbmdsZSBnbG9iYWwgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIG9iamVjdAorc3RhdGljIENWaW0gKmFwcCA9IDA7CisKKy8qIEdVSURzLCB2ZXJzaW9ucyBhbmQgdHlwZSBsaWJyYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIE1ZQ0xTSUQgQ0xTSURfVmltCisjZGVmaW5lIE1ZTElCSUQgTElCSURfVmltCisjZGVmaW5lIE1ZSUlEIElJRF9JVmltCisKKyNkZWZpbmUgTUFKT1JWRVIgMQorI2RlZmluZSBNSU5PUlZFUiAwCisjZGVmaW5lIExPQ0FMRSAweDA0MDkKKworI2RlZmluZSBNWU5BTUUgIlZpbSIKKyNkZWZpbmUgTVlQUk9HSUQgIlZpbS5BcHBsaWNhdGlvbi4xIgorI2RlZmluZSBNWVZJUFJPR0lEICJWaW0uQXBwbGljYXRpb24iCisKKyNkZWZpbmUgTUFYX0NMU0lEX0xFTiAxMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgMi4gVGhlIGFwcGxpY2F0aW9uIG9iamVjdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluaXRpb24KKyAqIC0tLS0tLS0tLS0KKyAqLworCitjbGFzcyBDVmltIDogcHVibGljIElWaW0KK3sKK3B1YmxpYzoKKyAgICB+Q1ZpbSgpOworICAgIHN0YXRpYyBDVmltICpDcmVhdGUoaW50KiBwYkRvUmVzdGFydCk7CisKKyAgICAvLyBJVW5rbm93biBtZW1iZXJzCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShSRUZJSUQgcmlpZCwgdm9pZCAqKiBwcHYpOworICAgIFNURE1FVEhPRF8odW5zaWduZWQgbG9uZywgQWRkUmVmKSh2b2lkKTsKKyAgICBTVERNRVRIT0RfKHVuc2lnbmVkIGxvbmcsIFJlbGVhc2UpKHZvaWQpOworCisgICAgLy8gSURpc3BhdGNoIG1lbWJlcnMKKyAgICBTVERNRVRIT0QoR2V0VHlwZUluZm9Db3VudCkoVUlOVCAqcENvdW50KTsKKyAgICBTVERNRVRIT0QoR2V0VHlwZUluZm8pKFVJTlQgaVR5cGVJbmZvLCBMQ0lELCBJVHlwZUluZm8gKipwcElUeXBlSW5mbyk7CisgICAgU1RETUVUSE9EKEdldElEc09mTmFtZXMpKGNvbnN0IElJRCYgaWlkLCBPTEVDSEFSKiogbmFtZXMsIFVJTlQgbiwgTENJRCwgRElTUElEICpkaXNwaWRzKTsKKyAgICBTVERNRVRIT0QoSW52b2tlKShESVNQSUQgbWVtYmVyLCBjb25zdCBJSUQmIGlpZCwgTENJRCwgV09SRCBmbGFncywgRElTUFBBUkFNUyAqZGlzcHBhcmFtcywgVkFSSUFOVCAqcmVzdWx0LCBFWENFUElORk8gKmV4Y2VwaW5mbywgVUlOVCAqYXJnZXJyKTsKKworICAgIC8vIElWaW0gbWVtYmVycworICAgIFNURE1FVEhPRChTZW5kS2V5cykoQlNUUiBrZXlzKTsKKyAgICBTVERNRVRIT0QoRXZhbCkoQlNUUiBleHByLCBCU1RSICpyZXN1bHQpOworICAgIFNURE1FVEhPRChTZXRGb3JlZ3JvdW5kKSh2b2lkKTsKKyAgICBTVERNRVRIT0QoR2V0SHduZCkoVUlOVCogcmVzdWx0KTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25zdHJ1Y3RvciBpcyBwcml2YXRlIC0gY3JlYXRlIHVzaW5nIENWaW06OkNyZWF0ZSgpCisgICAgQ1ZpbSgpIDogcmVmKDApLCB0eXBlaW5mbygwKSB7fTsKKworICAgIC8vIFJlZmVyZW5jZSBjb3VudAorICAgIHVuc2lnbmVkIGxvbmcgcmVmOworCisgICAgLy8gVGhlIG9iamVjdCdzIFR5cGVJbmZvCisgICAgSVR5cGVJbmZvICp0eXBlaW5mbzsKK307CisKKy8qIEltcGxlbWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLQorICovCisKK0NWaW0gKkNWaW06OkNyZWF0ZShpbnQqIHBiRG9SZXN0YXJ0KQoreworICAgIEhSRVNVTFQgaHI7CisgICAgQ1ZpbSAqbWUgPSAwOworICAgIElUeXBlTGliICp0eXBlbGliID0gMDsKKyAgICBJVHlwZUluZm8gKnR5cGVpbmZvID0gMDsKKworICAgICpwYkRvUmVzdGFydCA9IEZBTFNFOworCisgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3QKKyAgICBtZSA9IG5ldyBDVmltKCk7CisgICAgaWYgKG1lID09IE5VTEwpCisgICAgeworCU1lc3NhZ2VCb3goMCwgIkNhbm5vdCBjcmVhdGUgYXBwbGljYXRpb24gb2JqZWN0IiwgIlZpbSBJbml0aWFsaXNhdGlvbiIsIDApOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIExvYWQgdGhlIHR5cGUgbGlicmFyeSBmcm9tIHRoZSByZWdpc3RyeQorICAgIGhyID0gTG9hZFJlZ1R5cGVMaWIoTVlMSUJJRCwgMSwgMCwgMHgwMCwgJnR5cGVsaWIpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlIS0VZIGhLZXk7CisKKwkvLyBDaGVjayB3ZSBjYW4gd3JpdGUgdG8gdGhlIHJlZ2lzdHJ5LgorCS8vIFJlZ0NyZWF0ZUtleUV4IHN1Y2NlZWRzIGV2ZW4gaWYga2V5IGV4aXN0cy4gVy5CcmlzY29lIFcySyAyMDAyMTAxMQorCWlmIChSZWdDcmVhdGVLZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwgTVlWSVBST0dJRCwgMCwgTlVMTCwKKwkJICBSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsICZoS2V5LCBOVUxMKSkKKwl7CisJICAgIGRlbGV0ZSBtZTsKKwkgICAgcmV0dXJuIE5VTEw7IC8vIFVuYWJsZSB0byB3cml0ZSB0byByZWdpc3RyeS4gUXVpZXRseSBmYWlsLgorCX0KKwlSZWdDbG9zZUtleShoS2V5KTsKKworCWlmIChNZXNzYWdlQm94KDAsICJDYW5ub3QgbG9hZCByZWdpc3RlcmVkIHR5cGUgbGlicmFyeS5cbkRvIHlvdSB3YW50IHRvIHJlZ2lzdGVyIFZpbSBub3c/IiwKKwkJICAgICJWaW0gSW5pdGlhbGlzYXRpb24iLCBNQl9ZRVNOTyB8IE1CX0lDT05RVUVTVElPTikgIT0gSURZRVMpCisJeworCSAgICBkZWxldGUgbWU7CisJICAgIHJldHVybiBOVUxMOworCX0KKworCVJlZ2lzdGVyTWUoRkFMU0UpOworCisJLy8gTG9hZCB0aGUgdHlwZSBsaWJyYXJ5IGZyb20gdGhlIHJlZ2lzdHJ5CisJaHIgPSBMb2FkUmVnVHlwZUxpYihNWUxJQklELCAxLCAwLCAweDAwLCAmdHlwZWxpYik7CisJaWYgKEZBSUxFRChocikpCisJeworCSAgICBNZXNzYWdlQm94KDAsICJZb3UgbXVzdCByZXN0YXJ0IFZpbSBpbiBvcmRlciBmb3IgdGhlIHJlZ2lzdHJhdGlvbiB0byB0YWtlIGVmZmVjdC4iLAorCQkJCQkJICAgICAiVmltIEluaXRpYWxpc2F0aW9uIiwgMCk7CisJICAgICpwYkRvUmVzdGFydCA9IFRSVUU7CisJICAgIGRlbGV0ZSBtZTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIC8vIEdldCB0aGUgdHlwZSBpbmZvIG9mIHRoZSB2dGFibGUgaW50ZXJmYWNlCisgICAgaHIgPSB0eXBlbGliLT5HZXRUeXBlSW5mb09mR3VpZChNWUlJRCwgJnR5cGVpbmZvKTsKKyAgICB0eXBlbGliLT5SZWxlYXNlKCk7CisKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICB7CisJTWVzc2FnZUJveCgwLCAiQ2Fubm90IGdldCBpbnRlcmZhY2UgdHlwZSBpbmZvcm1hdGlvbiIsCisJCQkJCQkgICAgICJWaW0gSW5pdGlhbGlzYXRpb24iLCAwKTsKKwlkZWxldGUgbWU7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gU2F2ZSB0aGUgdHlwZSBpbmZvcm1hdGlvbgorICAgIG1lLT50eXBlaW5mbyA9IHR5cGVpbmZvOworICAgIHJldHVybiBtZTsKK30KKworQ1ZpbTo6fkNWaW0oKQoreworICAgIGlmICh0eXBlaW5mbyAmJiB2aW1fcGFyZW50X2h3bmQgPT0gTlVMTCkKKwl0eXBlaW5mby0+UmVsZWFzZSgpOworfQorCitTVERNRVRIT0RJTVAKK0NWaW06OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkICoqcHB2KQoreworICAgIGlmIChJc0VxdWFsSUlEKHJpaWQsIElJRF9JVW5rbm93bikgfHwgSXNFcXVhbElJRChyaWlkLCBJSURfSURpc3BhdGNoKSB8fCBJc0VxdWFsSUlEKHJpaWQsIE1ZSUlEKSkKKyAgICB7CisJQWRkUmVmKCk7CisJKnBwdiA9IHRoaXM7CisJcmV0dXJuIFNfT0s7CisgICAgfQorCisgICAgKnBwdiA9IDA7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9CisKK1NURE1FVEhPRElNUF8oVUxPTkcpCitDVmltOjpBZGRSZWYoKQoreworICAgIHJldHVybiArK3JlZjsKK30KKworU1RETUVUSE9ESU1QXyhVTE9ORykKK0NWaW06OlJlbGVhc2UoKQoreworICAgIC8vIERvbid0IGRlbGV0ZSB0aGUgb2JqZWN0IHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8sIGFzIHRoZXJlCisgICAgLy8gaXMgb25seSBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvYmplY3QsIGFuZCBpdHMgbGlmZXRpbWUgaXMgY29udHJvbGxlZCBieQorICAgIC8vIHRoZSBydW5uaW5nIGluc3RhbmNlLCBub3QgYnkgaXRzIHJlZmVyZW5jZSBjb3VudC4KKyAgICBpZiAocmVmID4gMCkKKwktLXJlZjsKKyAgICByZXR1cm4gcmVmOworfQorCitTVERNRVRIT0RJTVAKK0NWaW06OkdldFR5cGVJbmZvQ291bnQoVUlOVCAqcENvdW50KQoreworICAgICpwQ291bnQgPSAxOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NWaW06OkdldFR5cGVJbmZvKFVJTlQgaVR5cGVJbmZvLCBMQ0lELCBJVHlwZUluZm8gKipwcElUeXBlSW5mbykKK3sKKyAgICAqcHBJVHlwZUluZm8gPSAwOworCisgICAgaWYgKGlUeXBlSW5mbyAhPSAwKQorCXJldHVybiBESVNQX0VfQkFESU5ERVg7CisKKyAgICB0eXBlaW5mby0+QWRkUmVmKCk7CisgICAgKnBwSVR5cGVJbmZvID0gdHlwZWluZm87CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUAorQ1ZpbTo6R2V0SURzT2ZOYW1lcygKKwljb25zdCBJSUQmIGlpZCwKKwlPTEVDSEFSKiogbmFtZXMsCisJVUlOVCBuLAorCUxDSUQsCisJRElTUElEICpkaXNwaWRzKQoreworICAgIGlmIChpaWQgIT0gSUlEX05VTEwpCisJcmV0dXJuIERJU1BfRV9VTktOT1dOSU5URVJGQUNFOworCisgICAgcmV0dXJuIHR5cGVpbmZvLT5HZXRJRHNPZk5hbWVzKG5hbWVzLCBuLCBkaXNwaWRzKTsKK30KKworU1RETUVUSE9ESU1QCitDVmltOjpJbnZva2UoCisJRElTUElEIG1lbWJlciwKKwljb25zdCBJSUQmIGlpZCwKKwlMQ0lELAorCVdPUkQgZmxhZ3MsCisJRElTUFBBUkFNUyAqZGlzcHBhcmFtcywKKwlWQVJJQU5UICpyZXN1bHQsCisJRVhDRVBJTkZPICpleGNlcGluZm8sCisJVUlOVCAqYXJnZXJyKQoreworICAgIGlmIChpaWQgIT0gSUlEX05VTEwpCisJcmV0dXJuIERJU1BfRV9VTktOT1dOSU5URVJGQUNFOworCisgICAgOjpTZXRFcnJvckluZm8oMCwgTlVMTCk7CisgICAgcmV0dXJuIHR5cGVpbmZvLT5JbnZva2Uoc3RhdGljX2Nhc3Q8SURpc3BhdGNoKj4odGhpcyksCisJCQkgICAgbWVtYmVyLCBmbGFncywgZGlzcHBhcmFtcywKKwkJCSAgICByZXN1bHQsIGV4Y2VwaW5mbywgYXJnZXJyKTsKK30KKworU1RETUVUSE9ESU1QCitDVmltOjpHZXRId25kKFVJTlQqIHJlc3VsdCkKK3sKKyAgICAqcmVzdWx0ID0gKFVJTlQpIHNfaHduZDsKKyAgICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDVmltOjpTZXRGb3JlZ3JvdW5kKHZvaWQpCit7CisgICAgLyogTWFrZSB0aGUgVmltIHdpbmRvdyBjb21lIHRvIHRoZSBmb3JlZ3JvdW5kICovCisgICAgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpOworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NWaW06OlNlbmRLZXlzKEJTVFIga2V5cykKK3sKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBjaGFyX3UgKnN0cjsKKyAgICBjaGFyX3UgKnB0cjsKKworICAgIC8qIEdldCBhIHN1aXRhYmxlIGJ1ZmZlciAqLworICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBrZXlzLCAtMSwgMCwgMCwgMCwgMCk7CisgICAgYnVmZmVyID0gKGNoYXIgKilhbGxvYyhsZW4rMSk7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwga2V5cywgLTEsIGJ1ZmZlciwgbGVuLCAwLCAwKTsKKworICAgIGlmIChsZW4gPT0gMCkKKyAgICB7CisJdmltX2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gRV9JTlZBTElEQVJHOworICAgIH0KKworICAgIC8qIFRyYW5zbGF0ZSBrZXkgY29kZXMgbGlrZSA8RXNjPiAqLworICAgIHN0ciA9IHJlcGxhY2VfdGVybWNvZGVzKChjaGFyX3UgKilidWZmZXIsICZwdHIsIEZBTFNFLCBUUlVFKTsKKworICAgIC8qIElmIHB0ciB3YXMgc2V0LCB0aGVuIGEgbmV3IGJ1ZmZlciB3YXMgYWxsb2NhdGVkLAorICAgICAqIHNvIHdlIGNhbiBmcmVlIHRoZSBvbGQgb25lLgorICAgICAqLworICAgIGlmIChwdHIpCisJdmltX2ZyZWUoKGNoYXJfdSAqKShidWZmZXIpKTsKKworICAgIC8qIFJlamVjdCBzdHJpbmdzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUgaW5wdXQgYnVmZmVyLiBBbGxvdyAxMCBieXRlcworICAgICAqIHNwYWNlIHRvIGNvdmVyIGZvciB0aGUgKHJlbW90ZSkgcG9zc2liaWxpdHkgdGhhdCBjaGFyYWN0ZXJzIG1heSBlbnRlcgorICAgICAqIHRoZSBpbnB1dCBidWZmZXIgYmV0d2VlbiBub3cgYW5kIHdoZW4gdGhlIFdNX09MRSBtZXNzYWdlIGlzIGFjdHVhbGx5CisgICAgICogcHJvY2Vzc2VkLiBJZiBtb3JlIHRoYXQgMTAgY2hhcmFjdGVycyBlbnRlciB0aGUgaW5wdXQgYnVmZmVyIGluIHRoYXQKKyAgICAgKiB0aW1lLCB0aGUgV01fT0xFIHByb2Nlc3Npbmcgd2lsbCBzaW1wbHkgZmFpbCB0byBpbnNlcnQgdGhlIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgaWYgKChpbnQpKFNUUkxFTihzdHIpKSA+ICh2aW1fZnJlZV9pbl9pbnB1dF9idWYoKSAtIDEwKSkKKyAgICB7CisJdmltX2ZyZWUoc3RyKTsKKwlyZXR1cm4gRV9JTlZBTElEQVJHOworICAgIH0KKworICAgIC8qIFBhc3MgdGhlIHN0cmluZyB0byB0aGUgbWFpbiBpbnB1dCBsb29wLiBUaGUgbWVtb3J5IHdpbGwgYmUgZnJlZWQgd2hlbgorICAgICAqIHRoZSBtZXNzYWdlIGlzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBQb3N0TWVzc2FnZShOVUxMLCBXTV9PTEUsIDAsIChMUEFSQU0pc3RyKTsKKworICAgIHJldHVybiBTX09LOworfQorCitTVERNRVRIT0RJTVAKK0NWaW06OkV2YWwoQlNUUiBleHByLCBCU1RSICpyZXN1bHQpCit7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgaW50IGxlbjsKKyAgICBjaGFyICpidWZmZXI7CisgICAgY2hhciAqc3RyOworICAgIHdjaGFyX3QgKndfYnVmZmVyOworCisgICAgLyogR2V0IGEgc3VpdGFibGUgYnVmZmVyICovCisgICAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGV4cHIsIC0xLCAwLCAwLCAwLCAwKTsKKyAgICBpZiAobGVuID09IDApCisJcmV0dXJuIEVfSU5WQUxJREFSRzsKKworICAgIGJ1ZmZlciA9IChjaGFyICopYWxsb2MoKHVuc2lnbmVkKWxlbik7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICAvKiBDb252ZXJ0IHRoZSAod2lkZSBjaGFyYWN0ZXIpIGV4cHJlc3Npb24gdG8gYW4gQVNDSUkgc3RyaW5nICovCisgICAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGV4cHIsIC0xLCBidWZmZXIsIGxlbiwgMCwgMCk7CisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybiBFX0lOVkFMSURBUkc7CisKKyAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAqLworICAgICsrZW1zZ19za2lwOworICAgIHN0ciA9IChjaGFyICopZXZhbF90b19zdHJpbmcoKGNoYXJfdSAqKWJ1ZmZlciwgTlVMTCk7CisgICAgLS1lbXNnX3NraXA7CisgICAgdmltX2ZyZWUoYnVmZmVyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisJcmV0dXJuIEVfRkFJTDsKKworICAgIC8qIENvbnZlcnQgdGhlIHJlc3VsdCB0byB3aWRlIGNoYXJhY3RlcnMgKi8KKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyX2FsbG9jKENQX0FDUCwgMCwgc3RyLCAtMSwgJndfYnVmZmVyLCAmbGVuKTsKKyAgICB2aW1fZnJlZShzdHIpOworICAgIGlmICh3X2J1ZmZlciA9PSBOVUxMKQorCXJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgaWYgKGxlbiA9PSAwKQorICAgIHsKKwl2aW1fZnJlZSh3X2J1ZmZlcik7CisJcmV0dXJuIEVfRkFJTDsKKyAgICB9CisKKyAgICAvKiBTdG9yZSB0aGUgcmVzdWx0ICovCisgICAgKnJlc3VsdCA9IFN5c0FsbG9jU3RyaW5nKHdfYnVmZmVyKTsKKyAgICB2aW1fZnJlZSh3X2J1ZmZlcik7CisKKyAgICByZXR1cm4gU19PSzsKKyNlbHNlCisgICAgcmV0dXJuIEVfTk9USU1QTDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAzLiBUaGUgY2xhc3MgZmFjdG9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluaXRpb24KKyAqIC0tLS0tLS0tLS0KKyAqLworCitjbGFzcyBDVmltQ0YgOiBwdWJsaWMgSUNsYXNzRmFjdG9yeQoreworcHVibGljOgorICAgIHN0YXRpYyBDVmltQ0YgKkNyZWF0ZSgpOworCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShSRUZJSUQgcmlpZCwgdm9pZCAqKiBwcHYpOworICAgIFNURE1FVEhPRF8odW5zaWduZWQgbG9uZywgQWRkUmVmKSh2b2lkKTsKKyAgICBTVERNRVRIT0RfKHVuc2lnbmVkIGxvbmcsIFJlbGVhc2UpKHZvaWQpOworICAgIFNURE1FVEhPRChDcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnB1bmtPdXRlciwgUkVGSUlEIHJpaWQsIHZvaWQgKiogcHB2KTsKKyAgICBTVERNRVRIT0QoTG9ja1NlcnZlcikoQk9PTCBsb2NrKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25zdHJ1Y3RvciBpcyBwcml2YXRlIC0gY3JlYXRlIHZpYSBDcmVhdGUoKQorICAgIENWaW1DRigpIDogcmVmKDApIHt9OworCisgICAgLy8gUmVmZXJlbmNlIGNvdW50CisgICAgdW5zaWduZWQgbG9uZyByZWY7Cit9OworCisvKiBJbXBsZW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0KKyAqLworCitDVmltQ0YgKkNWaW1DRjo6Q3JlYXRlKCkKK3sKKyAgICBDVmltQ0YgKm1lID0gbmV3IENWaW1DRigpOworCisgICAgaWYgKG1lID09IE5VTEwpCisJTWVzc2FnZUJveCgwLCAiQ2Fubm90IGNyZWF0ZSBjbGFzcyBmYWN0b3J5IiwgIlZpbSBJbml0aWFsaXNhdGlvbiIsIDApOworCisgICAgcmV0dXJuIG1lOworfQorCitTVERNRVRIT0RJTVAKK0NWaW1DRjo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQgKipwcHYpCit7CisgICAgaWYgKElzRXF1YWxJSUQocmlpZCwgSUlEX0lVbmtub3duKSB8fCBJc0VxdWFsSUlEKHJpaWQsIElJRF9JQ2xhc3NGYWN0b3J5KSkKKyAgICB7CisJQWRkUmVmKCk7CisJKnBwdiA9IHRoaXM7CisJcmV0dXJuIFNfT0s7CisgICAgfQorCisgICAgKnBwdiA9IDA7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9CisKK1NURE1FVEhPRElNUF8oVUxPTkcpCitDVmltQ0Y6OkFkZFJlZigpCit7CisgICAgcmV0dXJuICsrcmVmOworfQorCitTVERNRVRIT0RJTVBfKFVMT05HKQorQ1ZpbUNGOjpSZWxlYXNlKCkKK3sKKyAgICAvLyBEb24ndCBkZWxldGUgdGhlIG9iamVjdCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLCBhcyB0aGVyZQorICAgIC8vIGlzIG9ubHkgYSBzaW5nbGUgYXBwbGljYXRpb24gb2JqZWN0LCBhbmQgaXRzIGxpZmV0aW1lIGlzIGNvbnRyb2xsZWQgYnkKKyAgICAvLyB0aGUgcnVubmluZyBpbnN0YW5jZSwgbm90IGJ5IGl0cyByZWZlcmVuY2UgY291bnQuCisgICAgaWYgKHJlZiA+IDApCisJLS1yZWY7CisgICAgcmV0dXJuIHJlZjsKK30KKworU1RETUVUSE9ESU1QCitDVmltQ0Y6OkNyZWF0ZUluc3RhbmNlKElVbmtub3duICpwdW5rT3V0ZXIsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2KQoreworICAgIHJldHVybiBhcHAtPlF1ZXJ5SW50ZXJmYWNlKHJpaWQsIHBwdik7Cit9CisKK1NURE1FVEhPRElNUAorQ1ZpbUNGOjpMb2NrU2VydmVyKEJPT0wgbG9jaykKK3sKKyAgICByZXR1cm4gU19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgNC4gUmVnaXN0cnkgbWFuaXB1bGF0aW9uIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBJbnRlcm5hbCB1c2Ugb25seQorc3RhdGljIHZvaWQgU2V0S2V5QW5kVmFsdWUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogc3Via2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBHVUlEdG9jaGFyKGNvbnN0IEdVSUQmIGd1aWQsIGNoYXIqIEdVSUQsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgUmVjdXJzaXZlRGVsZXRlS2V5KEhLRVkgaEtleVBhcmVudCwgY29uc3QgY2hhciogY2hpbGQpOworc3RhdGljIGNvbnN0IGludCBHVUlEX1NUUklOR19TSVpFID0gMzk7CisKKy8vIFJlZ2lzdGVyIHRoZSBjb21wb25lbnQgaW4gdGhlIHJlZ2lzdHJ5CisvLyBXaGVuICJzaWxlbnQiIGlzIFRSVUUgZG9uJ3QgZ2l2ZSBhbnkgbWVzc2FnZXMuCisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3Rlck1lKGludCBzaWxlbnQpCit7CisgICAgQk9PTCBvayA9IFRSVUU7CisKKyAgICAvLyBHZXQgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0dXAgY29tbWFuZAorICAgIGNoYXIgbW9kdWxlW01BWF9QQVRIXTsKKworICAgIDo6R2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgbW9kdWxlLCBNQVhfUEFUSCk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGZpcnN0IChxdWlldGx5KQorICAgIFVucmVnaXN0ZXJNZShGQUxTRSk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBDTFNJRCBpbnRvIGEgY2hhcgorICAgIGNoYXIgY2xzaWRbR1VJRF9TVFJJTkdfU0laRV07CisgICAgR1VJRHRvY2hhcihNWUNMU0lELCBjbHNpZCwgc2l6ZW9mKGNsc2lkKSk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBMSUJJRCBpbnRvIGEgY2hhcgorICAgIGNoYXIgbGliaWRbR1VJRF9TVFJJTkdfU0laRV07CisgICAgR1VJRHRvY2hhcihNWUxJQklELCBsaWJpZCwgc2l6ZW9mKGxpYmlkKSk7CisKKyAgICAvLyBCdWlsZCB0aGUga2V5IENMU0lEXFx7Li4ufQorICAgIGNoYXIgS2V5W01BWF9DTFNJRF9MRU5dOworICAgIHN0cmNweShLZXksICJDTFNJRFxcIik7CisgICAgc3RyY2F0KEtleSwgY2xzaWQpOworCisgICAgLy8gQWRkIHRoZSBDTFNJRCB0byB0aGUgcmVnaXN0cnkKKyAgICBTZXRLZXlBbmRWYWx1ZShLZXksIE5VTEwsIE1ZTkFNRSk7CisgICAgU2V0S2V5QW5kVmFsdWUoS2V5LCAiTG9jYWxTZXJ2ZXIzMiIsIG1vZHVsZSk7CisgICAgU2V0S2V5QW5kVmFsdWUoS2V5LCAiUHJvZ0lEIiwgTVlQUk9HSUQpOworICAgIFNldEtleUFuZFZhbHVlKEtleSwgIlZlcnNpb25JbmRlcGVuZGVudFByb2dJRCIsIE1ZVklQUk9HSUQpOworICAgIFNldEtleUFuZFZhbHVlKEtleSwgIlR5cGVMaWIiLCBsaWJpZCk7CisKKyAgICAvLyBBZGQgdGhlIHZlcnNpb24taW5kZXBlbmRlbnQgUHJvZ0lEIHN1YmtleSB1bmRlciBIS0VZX0NMQVNTRVNfUk9PVAorICAgIFNldEtleUFuZFZhbHVlKE1ZVklQUk9HSUQsIE5VTEwsIE1ZTkFNRSk7CisgICAgU2V0S2V5QW5kVmFsdWUoTVlWSVBST0dJRCwgIkNMU0lEIiwgY2xzaWQpOworICAgIFNldEtleUFuZFZhbHVlKE1ZVklQUk9HSUQsICJDdXJWZXIiLCBNWVBST0dJRCk7CisKKyAgICAvLyBBZGQgdGhlIHZlcnNpb25lZCBQcm9nSUQgc3Via2V5IHVuZGVyIEhLRVlfQ0xBU1NFU19ST09UCisgICAgU2V0S2V5QW5kVmFsdWUoTVlQUk9HSUQsIE5VTEwsIE1ZTkFNRSk7CisgICAgU2V0S2V5QW5kVmFsdWUoTVlQUk9HSUQsICJDTFNJRCIsIGNsc2lkKTsKKworICAgIHdjaGFyX3Qgd19tb2R1bGVbTUFYX1BBVEhdOworICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBtb2R1bGUsIC0xLCB3X21vZHVsZSwgTUFYX1BBVEgpOworCisgICAgSVR5cGVMaWIgKnR5cGVsaWIgPSBOVUxMOworICAgIGlmIChMb2FkVHlwZUxpYih3X21vZHVsZSwgJnR5cGVsaWIpICE9IFNfT0spCisgICAgeworCWlmICghc2lsZW50KQorCSAgICBNZXNzYWdlQm94KDAsICJDYW5ub3QgbG9hZCB0eXBlIGxpYnJhcnkgdG8gcmVnaXN0ZXIiLAorCQkJCQkJICAgICAgICJWaW0gUmVnaXN0cmF0aW9uIiwgMCk7CisJb2sgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoUmVnaXN0ZXJUeXBlTGliKHR5cGVsaWIsIHdfbW9kdWxlLCBOVUxMKSAhPSBTX09LKQorCXsKKwkgICAgaWYgKCFzaWxlbnQpCisJCU1lc3NhZ2VCb3goMCwgIkNhbm5vdCByZWdpc3RlciB0eXBlIGxpYnJhcnkiLAorCQkJCQkJICAgICAgICJWaW0gUmVnaXN0cmF0aW9uIiwgMCk7CisJICAgIG9rID0gRkFMU0U7CisJfQorCXR5cGVsaWItPlJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBpZiAob2sgJiYgIXNpbGVudCkKKwlNZXNzYWdlQm94KDAsICJSZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseSIsICJWaW0iLCAwKTsKK30KKworLy8gUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgcmVnaXN0cnkKKy8vCisvLyBOb3RlOiBUaGVyZSBpcyBsaXR0bGUgZXJyb3IgY2hlY2tpbmcgaW4gdGhpcyBjb2RlLCB0byBhbGxvdyBpbmNvbXBsZXRlCisvLyBvciBmYWlsZWQgcmVnaXN0cmF0aW9ucyB0byBiZSB1bmRvbmUuCitleHRlcm4gIkMiIHZvaWQgVW5yZWdpc3Rlck1lKGludCBiTm90aWZ5VXNlcikKK3sKKyAgICAvLyBVbnJlZ2lzdGVyIHRoZSB0eXBlIGxpYnJhcnkKKyAgICBJVHlwZUxpYiAqdHlwZWxpYjsKKyAgICBpZiAoU1VDQ0VFREVEKExvYWRSZWdUeXBlTGliKE1ZTElCSUQsIE1BSk9SVkVSLCBNSU5PUlZFUiwgTE9DQUxFLCAmdHlwZWxpYikpKQorICAgIHsKKwlUTElCQVRUUiAqdGxhOworCWlmIChTVUNDRUVERUQodHlwZWxpYi0+R2V0TGliQXR0cigmdGxhKSkpCisJeworCSAgICBVblJlZ2lzdGVyVHlwZUxpYih0bGEtPmd1aWQsIHRsYS0+d01ham9yVmVyTnVtLCB0bGEtPndNaW5vclZlck51bSwKKwkJCSAgICAgIHRsYS0+bGNpZCwgdGxhLT5zeXNraW5kKTsKKwkgICAgdHlwZWxpYi0+UmVsZWFzZVRMaWJBdHRyKHRsYSk7CisJfQorCXR5cGVsaWItPlJlbGVhc2UoKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHRoZSBDTFNJRCBpbnRvIGEgY2hhcgorICAgIGNoYXIgY2xzaWRbR1VJRF9TVFJJTkdfU0laRV07CisgICAgR1VJRHRvY2hhcihNWUNMU0lELCBjbHNpZCwgc2l6ZW9mKGNsc2lkKSk7CisKKyAgICAvLyBCdWlsZCB0aGUga2V5IENMU0lEXFx7Li4ufQorICAgIGNoYXIgS2V5W01BWF9DTFNJRF9MRU5dOworICAgIHN0cmNweShLZXksICJDTFNJRFxcIik7CisgICAgc3RyY2F0KEtleSwgY2xzaWQpOworCisgICAgLy8gRGVsZXRlIHRoZSBDTFNJRCBLZXkgLSBDTFNJRFx7Li4ufQorICAgIFJlY3Vyc2l2ZURlbGV0ZUtleShIS0VZX0NMQVNTRVNfUk9PVCwgS2V5KTsKKworICAgIC8vIERlbGV0ZSB0aGUgdmVyc2lvbi1pbmRlcGVuZGVudCBQcm9nSUQgS2V5CisgICAgUmVjdXJzaXZlRGVsZXRlS2V5KEhLRVlfQ0xBU1NFU19ST09ULCBNWVZJUFJPR0lEKTsKKworICAgIC8vIERlbGV0ZSB0aGUgUHJvZ0lEIGtleQorICAgIFJlY3Vyc2l2ZURlbGV0ZUtleShIS0VZX0NMQVNTRVNfUk9PVCwgTVlQUk9HSUQpOworCisgICAgaWYgKGJOb3RpZnlVc2VyKQorCU1lc3NhZ2VCb3goMCwgIlVucmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkiLCAiVmltIiwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBDb252ZXJ0IGEgR1VJRCB0byBhIGNoYXIgc3RyaW5nCitzdGF0aWMgdm9pZCBHVUlEdG9jaGFyKGNvbnN0IEdVSUQmIGd1aWQsIGNoYXIqIEdVSUQsIGludCBsZW5ndGgpCit7CisgICAgLy8gR2V0IHdpZGUgc3RyaW5nIHZlcnNpb24KKyAgICBMUE9MRVNUUiB3R1VJRCA9IE5VTEw7CisgICAgU3RyaW5nRnJvbUNMU0lEKGd1aWQsICZ3R1VJRCk7CisKKyAgICAvLyBDb3ZlcnQgZnJvbSB3aWRlIGNoYXJhY3RlcnMgdG8gbm9uLXdpZGUKKyAgICB3Y3N0b21icyhHVUlELCB3R1VJRCwgbGVuZ3RoKTsKKworICAgIC8vIEZyZWUgbWVtb3J5CisgICAgQ29UYXNrTWVtRnJlZSh3R1VJRCk7Cit9CisKKy8vIERlbGV0ZSBhIGtleSBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kZW50cworc3RhdGljIHZvaWQgUmVjdXJzaXZlRGVsZXRlS2V5KEhLRVkgaEtleVBhcmVudCwgY29uc3QgY2hhciogY2hpbGQpCit7CisgICAgLy8gT3BlbiB0aGUgY2hpbGQKKyAgICBIS0VZIGhLZXlDaGlsZDsKKyAgICBMT05HIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChoS2V5UGFyZW50LCBjaGlsZCwgMCwgS0VZX0FMTF9BQ0NFU1MsICZoS2V5Q2hpbGQpOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKwlyZXR1cm47CisKKyAgICAvLyBFbnVtZXJhdGUgYWxsIG9mIHRoZSBkZWNlbmRlbnRzIG9mIHRoaXMgY2hpbGQKKyAgICBGSUxFVElNRSB0aW1lOworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIERXT1JEIHNpemUgPSAxMDI0OworCisgICAgd2hpbGUgKFJlZ0VudW1LZXlFeChoS2V5Q2hpbGQsIDAsIGJ1ZmZlciwgJnNpemUsIE5VTEwsCisJCQlOVUxMLCBOVUxMLCAmdGltZSkgPT0gU19PSykKKyAgICB7CisJLy8gRGVsZXRlIHRoZSBkZWNlbmRlbnRzIG9mIHRoaXMgY2hpbGQKKwlSZWN1cnNpdmVEZWxldGVLZXkoaEtleUNoaWxkLCBidWZmZXIpOworCXNpemUgPSAyNTY7CisgICAgfQorCisgICAgLy8gQ2xvc2UgdGhlIGNoaWxkCisgICAgUmVnQ2xvc2VLZXkoaEtleUNoaWxkKTsKKworICAgIC8vIERlbGV0ZSB0aGlzIGNoaWxkCisgICAgUmVnRGVsZXRlS2V5KGhLZXlQYXJlbnQsIGNoaWxkKTsKK30KKworLy8gQ3JlYXRlIGEga2V5IGFuZCBzZXQgaXRzIHZhbHVlCitzdGF0aWMgdm9pZCBTZXRLZXlBbmRWYWx1ZShjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHN1YmtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisgICAgSEtFWSBoS2V5OworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworCisgICAgc3RyY3B5KGJ1ZmZlciwga2V5KTsKKworICAgIC8vIEFkZCBzdWJrZXkgbmFtZSB0byBidWZmZXIuCisgICAgaWYgKHN1YmtleSkKKyAgICB7CisJc3RyY2F0KGJ1ZmZlciwgIlxcIik7CisJc3RyY2F0KGJ1ZmZlciwgc3Via2V5KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYW5kIG9wZW4ga2V5IGFuZCBzdWJrZXkuCisgICAgbG9uZyByZXN1bHQgPSBSZWdDcmVhdGVLZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwKKwkJCQkgYnVmZmVyLAorCQkJCSAwLCBOVUxMLCBSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwKKwkJCQkgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsCisJCQkJICZoS2V5LCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisJcmV0dXJuOworCisgICAgLy8gU2V0IHRoZSB2YWx1ZQorICAgIGlmICh2YWx1ZSkKKwlSZWdTZXRWYWx1ZUV4KGhLZXksIE5VTEwsIDAsIFJFR19TWiwgKEJZVEUgKil2YWx1ZSwKKwkJICAgICAgKERXT1JEKVNUUkxFTih2YWx1ZSkrMSk7CisKKyAgICBSZWdDbG9zZUtleShoS2V5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgNS4gT0xFIEluaXRpYWxpc2F0aW9uIGFuZCBzaHV0ZG93biBwcm9jZXNzaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiAiQyIgdm9pZCBJbml0T0xFKGludCogcGJEb1Jlc3RhcnQpCit7CisgICAgSFJFU1VMVCBocjsKKworICAgICpwYkRvUmVzdGFydCA9IEZBTFNFOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgT0xFIGxpYnJhcmllcworICAgIGhyID0gT2xlSW5pdGlhbGl6ZShOVUxMKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICB7CisJTWVzc2FnZUJveCgwLCAiQ2Fubm90IGluaXRpYWxpc2UgT0xFIiwgIlZpbSBJbml0aWFsaXNhdGlvbiIsIDApOworCWdvdG8gZXJyb3IwOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0CisgICAgYXBwID0gQ1ZpbTo6Q3JlYXRlKHBiRG9SZXN0YXJ0KTsKKyAgICBpZiAoYXBwID09IE5VTEwpCisJZ290byBlcnJvcjE7CisKKyAgICAvLyBDcmVhdGUgdGhlIGNsYXNzIGZhY3RvcnkKKyAgICBjZiA9IENWaW1DRjo6Q3JlYXRlKCk7CisgICAgaWYgKGNmID09IE5VTEwpCisJZ290byBlcnJvcjE7CisKKyAgICAvLyBSZWdpc3RlciB0aGUgY2xhc3MgZmFjdG9yeQorICAgIGhyID0gQ29SZWdpc3RlckNsYXNzT2JqZWN0KAorCU1ZQ0xTSUQsCisJY2YsCisJQ0xTQ1RYX0xPQ0FMX1NFUlZFUiwKKwlSRUdDTFNfTVVMVElQTEVVU0UsCisJJmNmX2lkKTsKKworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlNZXNzYWdlQm94KDAsICJDYW5ub3QgcmVnaXN0ZXIgY2xhc3MgZmFjdG9yeSIsICJWaW0gSW5pdGlhbGlzYXRpb24iLCAwKTsKKwlnb3RvIGVycm9yMTsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGFzIGFjdGl2ZQorICAgIGhyID0gUmVnaXN0ZXJBY3RpdmVPYmplY3QoCisJYXBwLAorCU1ZQ0xTSUQsCisJTlVMTCwKKwkmYXBwX2lkKTsKKworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlNZXNzYWdlQm94KDAsICJDYW5ub3QgcmVnaXN0ZXIgYXBwbGljYXRpb24gb2JqZWN0IiwgIlZpbSBJbml0aWFsaXNhdGlvbiIsIDApOworCWdvdG8gZXJyb3IxOworICAgIH0KKworICAgIHJldHVybjsKKworICAgIC8vIEVycm9yczogdGlkeSB1cCBhcyBtdWNoIGFzIG5lZWRlZCBhbmQgcmV0dXJuCitlcnJvcjE6CisgICAgVW5pbml0T0xFKCk7CitlcnJvcjA6CisgICAgcmV0dXJuOworfQorCitleHRlcm4gIkMiIHZvaWQgVW5pbml0T0xFKCkKK3sKKyAgICAvLyBVbnJlZ2lzdGVyIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QKKyAgICBpZiAoYXBwX2lkKQorICAgIHsKKwlSZXZva2VBY3RpdmVPYmplY3QoYXBwX2lkLCBOVUxMKTsKKwlhcHBfaWQgPSAwOworICAgIH0KKworICAgIC8vIFVucmVnaXN0ZXIgdGhlIGNsYXNzIGZhY3RvcnkKKyAgICBpZiAoY2ZfaWQpCisgICAgeworCUNvUmV2b2tlQ2xhc3NPYmplY3QoY2ZfaWQpOworCWNmX2lkID0gMDsKKyAgICB9CisKKyAgICAvLyBTaHV0IGRvd24gdGhlIE9MRSBsaWJyYXJpZXMKKyAgICBPbGVVbmluaXRpYWxpemUoKTsKKworICAgIC8vIERlbGV0ZSB0aGUgYXBwbGljYXRpb24gb2JqZWN0CisgICAgaWYgKGFwcCkKKyAgICB7CisJZGVsZXRlIGFwcDsKKwlhcHAgPSBOVUxMOworICAgIH0KKworICAgIC8vIERlbGV0ZSB0aGUgY2xhc3MgZmFjdG9yeQorICAgIGlmIChjZikKKyAgICB7CisJZGVsZXRlIGNmOworCWNmID0gTlVMTDsKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9PTEUgKi8KZGlmZiAtLWdpdCBhL3NyYy9pZl9vbGUuaCBiL3NyYy9pZl9vbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDE5MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lmX29sZS5oCkBAIC0wLDAgKzEsMjg5IEBACisvKiB0aGlzIEFMV0FZUyBHRU5FUkFURUQgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlcmZhY2VzICovCisKKworLyogRmlsZSBjcmVhdGVkIGJ5IE1JREwgY29tcGlsZXIgdmVyc2lvbiAzLjAxLjc1ICovCisvKiBhdCBXZWQgSnVuIDA2IDE4OjIwOjM3IDIwMDEKKyAqLworLyogQ29tcGlsZXIgc2V0dGluZ3MgZm9yIC5caWZfb2xlLmlkbDoKKyAgICBPcyAoT3B0TGV2PXMpLCBXMSwgWnA4LCBlbnY9V2luMzIsIG1zX2V4dCwgY19leHQKKyAgICBlcnJvciBjaGVja3M6IG5vbmUKKyovCisvL0BATUlETF9GSUxFX0hFQURJTkcoICApCisjaW5jbHVkZSAicnBjLmgiCisjaW5jbHVkZSAicnBjbmRyLmgiCisjaWZuZGVmIENPTV9OT19XSU5ET1dTX0gKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAib2xlMi5oIgorI2VuZGlmIC8qQ09NX05PX1dJTkRPV1NfSCovCisKKyNpZm5kZWYgX19pZl9vbGVfaF9fCisjZGVmaW5lIF9faWZfb2xlX2hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyJ7CisjZW5kaWYKKworLyogRm9yd2FyZCBEZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBfX0lWaW1fRldEX0RFRklORURfXworI2RlZmluZSBfX0lWaW1fRldEX0RFRklORURfXwordHlwZWRlZiBpbnRlcmZhY2UgSVZpbSBJVmltOworI2VuZGlmCS8qIF9fSVZpbV9GV0RfREVGSU5FRF9fICovCisKKworI2lmbmRlZiBfX1ZpbV9GV0RfREVGSU5FRF9fCisjZGVmaW5lIF9fVmltX0ZXRF9ERUZJTkVEX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGNsYXNzIFZpbSBWaW07CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgVmltIFZpbTsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYJLyogX19WaW1fRldEX0RFRklORURfXyAqLworCisKKy8qIGhlYWRlciBmaWxlcyBmb3IgaW1wb3J0ZWQgZmlsZXMgKi8KKyNpbmNsdWRlICJvYWlkbC5oIgorCit2b2lkIF9fUlBDX0ZBUiAqIF9fUlBDX1VTRVIgTUlETF91c2VyX2FsbG9jYXRlKHNpemVfdCk7Cit2b2lkIF9fUlBDX1VTRVIgTUlETF91c2VyX2ZyZWUoIHZvaWQgX19SUENfRkFSICogKTsKKworI2lmbmRlZiBfX0lWaW1fSU5URVJGQUNFX0RFRklORURfXworI2RlZmluZSBfX0lWaW1fSU5URVJGQUNFX0RFRklORURfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhdGVkIGhlYWRlciBmb3IgaW50ZXJmYWNlOiBJVmltCisgKiBhdCBXZWQgSnVuIDA2IDE4OjIwOjM3IDIwMDEKKyAqIHVzaW5nIE1JREwgMy4wMS43NQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBbb2xlYXV0b21hdGlvbl1bZHVhbF1bdW5pcXVlXVtoZWxwc3RyaW5nXVt1dWlkXVtvYmplY3RdICovCisKKworCitFWFRFUk5fQyBjb25zdCBJSUQgSUlEX0lWaW07CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChDSU5URVJGQUNFKQorCisgICAgaW50ZXJmYWNlIERFQ0xTUEVDX1VVSUQoIjBGMEJGQUUyLTRDOTAtMTFkMS04MkQ3LTAwMDRBQzM2ODUxOSIpCisgICAgSVZpbSA6IHB1YmxpYyBJRGlzcGF0Y2gKKyAgICB7CisgICAgcHVibGljOgorCXZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZW5kS2V5cygKKwkgICAgLyogW2luXSAqLyBCU1RSIGtleXMpID0gMDsKKworCXZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBFdmFsKAorCSAgICAvKiBbaW5dICovIEJTVFIgZXhwciwKKwkgICAgLyogW3JldHZhbF1bb3V0XSAqLyBCU1RSIF9fUlBDX0ZBUiAqcmVzdWx0KSA9IDA7CisKKwl2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU2V0Rm9yZWdyb3VuZCggdm9pZCkgPSAwOworCisJdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIEdldEh3bmQoCisJICAgIC8qIFtyZXR2YWxdW291dF0gKi8gVUlOVCBfX1JQQ19GQVIgKnJlc3VsdCkgPSAwOworCisgICAgfTsKKworI2Vsc2UJLyogQyBzdHlsZSBpbnRlcmZhY2UgKi8KKworICAgIHR5cGVkZWYgc3RydWN0IElWaW1WdGJsCisgICAgeworCUJFR0lOX0lOVEVSRkFDRQorCisJSFJFU1VMVCAoIFNURE1FVEhPRENBTExUWVBFIF9fUlBDX0ZBUiAqUXVlcnlJbnRlcmZhY2UgKSgKKwkgICAgSVZpbSBfX1JQQ19GQVIgKiBUaGlzLAorCSAgICAvKiBbaW5dICovIFJFRklJRCByaWlkLAorCSAgICAvKiBbaWlkX2lzXVtvdXRdICovIHZvaWQgX19SUENfRkFSICpfX1JQQ19GQVIgKnBwdk9iamVjdCk7CisKKwlVTE9ORyAoIFNURE1FVEhPRENBTExUWVBFIF9fUlBDX0ZBUiAqQWRkUmVmICkoCisJICAgIElWaW0gX19SUENfRkFSICogVGhpcyk7CisKKwlVTE9ORyAoIFNURE1FVEhPRENBTExUWVBFIF9fUlBDX0ZBUiAqUmVsZWFzZSApKAorCSAgICBJVmltIF9fUlBDX0ZBUiAqIFRoaXMpOworCisJSFJFU1VMVCAoIFNURE1FVEhPRENBTExUWVBFIF9fUlBDX0ZBUiAqR2V0VHlwZUluZm9Db3VudCApKAorCSAgICBJVmltIF9fUlBDX0ZBUiAqIFRoaXMsCisJICAgIC8qIFtvdXRdICovIFVJTlQgX19SUENfRkFSICpwY3RpbmZvKTsKKworCUhSRVNVTFQgKCBTVERNRVRIT0RDQUxMVFlQRSBfX1JQQ19GQVIgKkdldFR5cGVJbmZvICkoCisJICAgIElWaW0gX19SUENfRkFSICogVGhpcywKKwkgICAgLyogW2luXSAqLyBVSU5UIGlUSW5mbywKKwkgICAgLyogW2luXSAqLyBMQ0lEIGxjaWQsCisJICAgIC8qIFtvdXRdICovIElUeXBlSW5mbyBfX1JQQ19GQVIgKl9fUlBDX0ZBUiAqcHBUSW5mbyk7CisKKwlIUkVTVUxUICggU1RETUVUSE9EQ0FMTFRZUEUgX19SUENfRkFSICpHZXRJRHNPZk5hbWVzICkoCisJICAgIElWaW0gX19SUENfRkFSICogVGhpcywKKwkgICAgLyogW2luXSAqLyBSRUZJSUQgcmlpZCwKKwkgICAgLyogW3NpemVfaXNdW2luXSAqLyBMUE9MRVNUUiBfX1JQQ19GQVIgKnJnc3pOYW1lcywKKwkgICAgLyogW2luXSAqLyBVSU5UIGNOYW1lcywKKwkgICAgLyogW2luXSAqLyBMQ0lEIGxjaWQsCisJICAgIC8qIFtzaXplX2lzXVtvdXRdICovIERJU1BJRCBfX1JQQ19GQVIgKnJnRGlzcElkKTsKKworCS8qIFtsb2NhbF0gKi8gSFJFU1VMVCAoIFNURE1FVEhPRENBTExUWVBFIF9fUlBDX0ZBUiAqSW52b2tlICkoCisJICAgIElWaW0gX19SUENfRkFSICogVGhpcywKKwkgICAgLyogW2luXSAqLyBESVNQSUQgZGlzcElkTWVtYmVyLAorCSAgICAvKiBbaW5dICovIFJFRklJRCByaWlkLAorCSAgICAvKiBbaW5dICovIExDSUQgbGNpZCwKKwkgICAgLyogW2luXSAqLyBXT1JEIHdGbGFncywKKwkgICAgLyogW291dF1baW5dICovIERJU1BQQVJBTVMgX19SUENfRkFSICpwRGlzcFBhcmFtcywKKwkgICAgLyogW291dF0gKi8gVkFSSUFOVCBfX1JQQ19GQVIgKnBWYXJSZXN1bHQsCisJICAgIC8qIFtvdXRdICovIEVYQ0VQSU5GTyBfX1JQQ19GQVIgKnBFeGNlcEluZm8sCisJICAgIC8qIFtvdXRdICovIFVJTlQgX19SUENfRkFSICpwdUFyZ0Vycik7CisKKwlIUkVTVUxUICggU1RETUVUSE9EQ0FMTFRZUEUgX19SUENfRkFSICpTZW5kS2V5cyApKAorCSAgICBJVmltIF9fUlBDX0ZBUiAqIFRoaXMsCisJICAgIC8qIFtpbl0gKi8gQlNUUiBrZXlzKTsKKworCUhSRVNVTFQgKCBTVERNRVRIT0RDQUxMVFlQRSBfX1JQQ19GQVIgKkV2YWwgKSgKKwkgICAgSVZpbSBfX1JQQ19GQVIgKiBUaGlzLAorCSAgICAvKiBbaW5dICovIEJTVFIgZXhwciwKKwkgICAgLyogW3JldHZhbF1bb3V0XSAqLyBCU1RSIF9fUlBDX0ZBUiAqcmVzdWx0KTsKKworCUhSRVNVTFQgKCBTVERNRVRIT0RDQUxMVFlQRSBfX1JQQ19GQVIgKlNldEZvcmVncm91bmQgKSgKKwkgICAgSVZpbSBfX1JQQ19GQVIgKiBUaGlzKTsKKworCUhSRVNVTFQgKCBTVERNRVRIT0RDQUxMVFlQRSBfX1JQQ19GQVIgKkdldEh3bmQgKSgKKwkgICAgSVZpbSBfX1JQQ19GQVIgKiBUaGlzLAorCSAgICAvKiBbcmV0dmFsXVtvdXRdICovIFVJTlQgX19SUENfRkFSICpyZXN1bHQpOworCisJRU5EX0lOVEVSRkFDRQorICAgIH0gSVZpbVZ0Ymw7CisKKyAgICBpbnRlcmZhY2UgSVZpbQorICAgIHsKKwlDT05TVF9WVEJMIHN0cnVjdCBJVmltVnRibCBfX1JQQ19GQVIgKmxwVnRibDsKKyAgICB9OworCisjaWZkZWYgQ09CSk1BQ1JPUworCisKKyNkZWZpbmUgSVZpbV9RdWVyeUludGVyZmFjZShUaGlzLHJpaWQscHB2T2JqZWN0KQlcCisgICAgKFRoaXMpLT5scFZ0YmwgLT4gUXVlcnlJbnRlcmZhY2UoVGhpcyxyaWlkLHBwdk9iamVjdCkKKworI2RlZmluZSBJVmltX0FkZFJlZihUaGlzKQlcCisgICAgKFRoaXMpLT5scFZ0YmwgLT4gQWRkUmVmKFRoaXMpCisKKyNkZWZpbmUgSVZpbV9SZWxlYXNlKFRoaXMpCVwKKyAgICAoVGhpcyktPmxwVnRibCAtPiBSZWxlYXNlKFRoaXMpCisKKworI2RlZmluZSBJVmltX0dldFR5cGVJbmZvQ291bnQoVGhpcyxwY3RpbmZvKQlcCisgICAgKFRoaXMpLT5scFZ0YmwgLT4gR2V0VHlwZUluZm9Db3VudChUaGlzLHBjdGluZm8pCisKKyNkZWZpbmUgSVZpbV9HZXRUeXBlSW5mbyhUaGlzLGlUSW5mbyxsY2lkLHBwVEluZm8pCVwKKyAgICAoVGhpcyktPmxwVnRibCAtPiBHZXRUeXBlSW5mbyhUaGlzLGlUSW5mbyxsY2lkLHBwVEluZm8pCisKKyNkZWZpbmUgSVZpbV9HZXRJRHNPZk5hbWVzKFRoaXMscmlpZCxyZ3N6TmFtZXMsY05hbWVzLGxjaWQscmdEaXNwSWQpCVwKKyAgICAoVGhpcyktPmxwVnRibCAtPiBHZXRJRHNPZk5hbWVzKFRoaXMscmlpZCxyZ3N6TmFtZXMsY05hbWVzLGxjaWQscmdEaXNwSWQpCisKKyNkZWZpbmUgSVZpbV9JbnZva2UoVGhpcyxkaXNwSWRNZW1iZXIscmlpZCxsY2lkLHdGbGFncyxwRGlzcFBhcmFtcyxwVmFyUmVzdWx0LHBFeGNlcEluZm8scHVBcmdFcnIpCVwKKyAgICAoVGhpcyktPmxwVnRibCAtPiBJbnZva2UoVGhpcyxkaXNwSWRNZW1iZXIscmlpZCxsY2lkLHdGbGFncyxwRGlzcFBhcmFtcyxwVmFyUmVzdWx0LHBFeGNlcEluZm8scHVBcmdFcnIpCisKKworI2RlZmluZSBJVmltX1NlbmRLZXlzKFRoaXMsa2V5cykJXAorICAgIChUaGlzKS0+bHBWdGJsIC0+IFNlbmRLZXlzKFRoaXMsa2V5cykKKworI2RlZmluZSBJVmltX0V2YWwoVGhpcyxleHByLHJlc3VsdCkJXAorICAgIChUaGlzKS0+bHBWdGJsIC0+IEV2YWwoVGhpcyxleHByLHJlc3VsdCkKKworI2RlZmluZSBJVmltX1NldEZvcmVncm91bmQoVGhpcykJXAorICAgIChUaGlzKS0+bHBWdGJsIC0+IFNldEZvcmVncm91bmQoVGhpcykKKworI2RlZmluZSBJVmltX0dldEh3bmQoVGhpcyxyZXN1bHQpCVwKKyAgICAoVGhpcyktPmxwVnRibCAtPiBHZXRId25kKFRoaXMscmVzdWx0KQorCisjZW5kaWYgLyogQ09CSk1BQ1JPUyAqLworCisKKyNlbmRpZgkvKiBDIHN0eWxlIGludGVyZmFjZSAqLworCisKKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBJVmltX1NlbmRLZXlzX1Byb3h5KAorICAgIElWaW0gX19SUENfRkFSICogVGhpcywKKyAgICAvKiBbaW5dICovIEJTVFIga2V5cyk7CisKKwordm9pZCBfX1JQQ19TVFVCIElWaW1fU2VuZEtleXNfU3R1YigKKyAgICBJUnBjU3R1YkJ1ZmZlciAqVGhpcywKKyAgICBJUnBjQ2hhbm5lbEJ1ZmZlciAqX3BScGNDaGFubmVsQnVmZmVyLAorICAgIFBSUENfTUVTU0FHRSBfcFJwY01lc3NhZ2UsCisgICAgRFdPUkQgKl9wZHdTdHViUGhhc2UpOworCisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgSVZpbV9FdmFsX1Byb3h5KAorICAgIElWaW0gX19SUENfRkFSICogVGhpcywKKyAgICAvKiBbaW5dICovIEJTVFIgZXhwciwKKyAgICAvKiBbcmV0dmFsXVtvdXRdICovIEJTVFIgX19SUENfRkFSICpyZXN1bHQpOworCisKK3ZvaWQgX19SUENfU1RVQiBJVmltX0V2YWxfU3R1YigKKyAgICBJUnBjU3R1YkJ1ZmZlciAqVGhpcywKKyAgICBJUnBjQ2hhbm5lbEJ1ZmZlciAqX3BScGNDaGFubmVsQnVmZmVyLAorICAgIFBSUENfTUVTU0FHRSBfcFJwY01lc3NhZ2UsCisgICAgRFdPUkQgKl9wZHdTdHViUGhhc2UpOworCisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgSVZpbV9TZXRGb3JlZ3JvdW5kX1Byb3h5KAorICAgIElWaW0gX19SUENfRkFSICogVGhpcyk7CisKKwordm9pZCBfX1JQQ19TVFVCIElWaW1fU2V0Rm9yZWdyb3VuZF9TdHViKAorICAgIElScGNTdHViQnVmZmVyICpUaGlzLAorICAgIElScGNDaGFubmVsQnVmZmVyICpfcFJwY0NoYW5uZWxCdWZmZXIsCisgICAgUFJQQ19NRVNTQUdFIF9wUnBjTWVzc2FnZSwKKyAgICBEV09SRCAqX3Bkd1N0dWJQaGFzZSk7CisKKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBJVmltX0dldEh3bmRfUHJveHkoCisgICAgSVZpbSBfX1JQQ19GQVIgKiBUaGlzLAorICAgIC8qIFtyZXR2YWxdW291dF0gKi8gVUlOVCBfX1JQQ19GQVIgKnJlc3VsdCk7CisKKwordm9pZCBfX1JQQ19TVFVCIElWaW1fR2V0SHduZF9TdHViKAorICAgIElScGNTdHViQnVmZmVyICpUaGlzLAorICAgIElScGNDaGFubmVsQnVmZmVyICpfcFJwY0NoYW5uZWxCdWZmZXIsCisgICAgUFJQQ19NRVNTQUdFIF9wUnBjTWVzc2FnZSwKKyAgICBEV09SRCAqX3Bkd1N0dWJQaGFzZSk7CisKKworCisjZW5kaWYJLyogX19JVmltX0lOVEVSRkFDRV9ERUZJTkVEX18gKi8KKworCisKKyNpZm5kZWYgX19WaW1fTElCUkFSWV9ERUZJTkVEX18KKyNkZWZpbmUgX19WaW1fTElCUkFSWV9ERUZJTkVEX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyYXRlZCBoZWFkZXIgZm9yIGxpYnJhcnk6IFZpbQorICogYXQgV2VkIEp1biAwNiAxODoyMDozNyAyMDAxCisgKiB1c2luZyBNSURMIDMuMDEuNzUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogW3ZlcnNpb25dW2hlbHBzdHJpbmddW3V1aWRdICovCisKKworCitFWFRFUk5fQyBjb25zdCBJSUQgTElCSURfVmltOworCisjaWZkZWYgX19jcGx1c3BsdXMKK0VYVEVSTl9DIGNvbnN0IENMU0lEIENMU0lEX1ZpbTsKKworY2xhc3MgREVDTFNQRUNfVVVJRCgiMEYwQkZBRTEtNEM5MC0xMWQxLTgyRDctMDAwNEFDMzY4NTE5IikKK1ZpbTsKKyNlbmRpZgorI2VuZGlmIC8qIF9fVmltX0xJQlJBUllfREVGSU5FRF9fICovCisKKy8qIEFkZGl0aW9uYWwgUHJvdG90eXBlcyBmb3IgQUxMIGludGVyZmFjZXMgKi8KKwordW5zaWduZWQgbG9uZwkJICBfX1JQQ19VU0VSICBCU1RSX1VzZXJTaXplKAkgdW5zaWduZWQgbG9uZyBfX1JQQ19GQVIgKiwgdW5zaWduZWQgbG9uZwkgICAgICwgQlNUUiBfX1JQQ19GQVIgKiApOwordW5zaWduZWQgY2hhciBfX1JQQ19GQVIgKiBfX1JQQ19VU0VSICBCU1RSX1VzZXJNYXJzaGFsKCAgdW5zaWduZWQgbG9uZyBfX1JQQ19GQVIgKiwgdW5zaWduZWQgY2hhciBfX1JQQ19GQVIgKiwgQlNUUiBfX1JQQ19GQVIgKiApOwordW5zaWduZWQgY2hhciBfX1JQQ19GQVIgKiBfX1JQQ19VU0VSICBCU1RSX1VzZXJVbm1hcnNoYWwodW5zaWduZWQgbG9uZyBfX1JQQ19GQVIgKiwgdW5zaWduZWQgY2hhciBfX1JQQ19GQVIgKiwgQlNUUiBfX1JQQ19GQVIgKiApOwordm9pZAkJCSAgX19SUENfVVNFUiAgQlNUUl9Vc2VyRnJlZSgJIHVuc2lnbmVkIGxvbmcgX19SUENfRkFSICosIEJTVFIgX19SUENfRkFSICogKTsKKworLyogZW5kIG9mIEFkZGl0aW9uYWwgUHJvdG90eXBlcyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9pZl9vbGUuaWRsIGIvc3JjL2lmX29sZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjZGUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9vbGUuaWRsCkBAIC0wLDAgKzEsNDUgQEAKKy8vIGlmX29sZS5pZGwgLSBJREwgc291cmNlIGZvciB0aGUgVmltIE9MRSBBdXRvbWF0aW9uIGludGVyZmFjZQorLy8KKy8vIFByb2Nlc3NlZCBieSB0aGUgSURMIGNvbXBpbGVyIChNSURMKSB0byBnZW5lcmF0ZSB0aGUgdHlwZSBsaWJyYXJ5CisvLyAoVmltLnRsYikuCisvLworLy8gQ29tbWFuZCBsaW5lOgorLy8gICBNSURMIC9wcm94eSBudWwgL2lpZCBpaWRfb2xlLmMgL2ggaWZfb2xlLmggL3RsYiB2aW0udGxiIGlmX29sZS5pZGwKKworWworCW9iamVjdCwKKwl1dWlkKDBGMEJGQUUyLTRDOTAtMTFkMS04MkQ3LTAwMDRBQzM2ODUxOSksICAvLyBJSURfSVZpbQorCWhlbHBzdHJpbmcoIklWaW0iKSwKKwlwb2ludGVyX2RlZmF1bHQodW5pcXVlKSwKKwlkdWFsLAorCW9sZWF1dG9tYXRpb24KK10KK2ludGVyZmFjZSBJVmltIDogSURpc3BhdGNoCit7CisJaW1wb3J0ICJvYWlkbC5pZGwiOworCUhSRVNVTFQgU2VuZEtleXMoW2luXUJTVFIga2V5cyk7CisJSFJFU1VMVCBFdmFsKFtpbl1CU1RSIGV4cHIsIFtvdXQsIHJldHZhbF1CU1RSKiByZXN1bHQpOworCUhSRVNVTFQgU2V0Rm9yZWdyb3VuZCh2b2lkKTsKKwlIUkVTVUxUIEdldEh3bmQoW291dCwgcmV0dmFsXVVJTlQqIHJlc3VsdCk7Cit9OworCisvLyBDb21wb25lbnQgYW5kIHR5cGUgbGlicmFyeSBkZWZpbml0aW9ucworWworCXV1aWQoMEYwQkZBRTAtNEM5MC0xMWQxLTgyRDctMDAwNEFDMzY4NTE5KSwJCS8vIExJQklEX1ZpbQorCWhlbHBzdHJpbmcoIlZpbSBPTEUgSW50ZXJmYWNlIDEuMSBUeXBlIExpYnJhcnkiKSwKKwl2ZXJzaW9uKDEuMSkKK10KK2xpYnJhcnkgVmltCit7CisJaW1wb3J0bGliKCJzdGRvbGUzMi50bGIiKTsKKworCS8vIENvbXBvbmVudAorCVsKKwkJdXVpZCgwRjBCRkFFMS00QzkwLTExZDEtODJENy0wMDA0QUMzNjg1MTkpLCAgLy8gQ0xTSURfVmltCisJCWhlbHBzdHJpbmcoIlZpbSBPTEUgSW50ZXJmYWNlIikKKwldCisJY29jbGFzcyBWaW0KKwl7CisJCVtkZWZhdWx0XSBpbnRlcmZhY2UgSVZpbTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL3NyYy9pZl9wZXJsLnhzIGIvc3JjL2lmX3BlcmwueHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MDhlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9wZXJsLnhzCkBAIC0wLDAgKzEsMTE1MCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKy8qCisgKiBpZl9wZXJsLnhzOiBNYWluIGNvZGUgZm9yIFBlcmwgaW50ZXJmYWNlIHN1cHBvcnQuCisgKgkJTW9zdGx5IHdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZS4KKyAqLworCisjZGVmaW5lIF9tZW1vcnlfaAkvKiBhdm9pZCBtZW1zZXQgcmVkZWNsYXJhdGlvbiAqLworI2RlZmluZSBJTl9QRVJMX0ZJTEUJLyogZG9uJ3QgaW5jbHVkZSBpZl9wZXJsLnBybyBmcm9tIHByb3RvLmggKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisKKy8qCisgKiBXb3JrIGFyb3VuZCBjbGFzaGVzIGJldHdlZW4gUGVybCBhbmQgVmltIG5hbWVzcGFjZS4JcHJvdG8uaCBkb2Vzbid0CisgKiBpbmNsdWRlIGlmX3BlcmwucHJvIGFuZCBwZXJsc2Zpby5wcm8gd2hlbiBJTl9QRVJMX0ZJTEUgaXMgZGVmaW5lZCwgYmVjYXVzZQorICogd2UgbmVlZCB0aGUgQ1YgdHlwZWRlZi4gIHByb3RvLmggY2FuJ3QgYmUgbW92ZWQgdG8gYWZ0ZXIgaW5jbHVkaW5nCisgKiBpZl9wZXJsLmgsIGJlY2F1c2Ugd2UgZ2V0IGFsbCBzb3J0cyBvZiBuYW1lIGNsYXNoZXMgdGhlbi4KKyAqLworI2lmbmRlZiBQUk9UTworI2lmbmRlZiBfX01JTkdXMzJfXworIyBpbmNsdWRlICJwcm90by9pZl9wZXJsLnBybyIKKyMgaW5jbHVkZSAicHJvdG8vaWZfcGVybHNmaW8ucHJvIgorI2VuZGlmCisjZW5kaWYKKworLyogUGVybCBjb21wYXRpYmlsaXR5IHN0dWZmLiBUaGlzIHNob3VsZCBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisgKiB2ZXJzaW9ucyBvZiBQZXJsLgorICovCisKKyNpZm5kZWYgUEVSTF9WRVJTSU9OCisjICAgIGluY2x1ZGUgPHBhdGNobGV2ZWwuaD4KKyMgICAgZGVmaW5lIFBFUkxfUkVWSVNJT04gICA1CisjICAgIGRlZmluZSBQRVJMX1ZFUlNJT04gICAgUEFUQ0hMRVZFTAorIyAgICBkZWZpbmUgUEVSTF9TVUJWRVJTSU9OIFNVQlZFUlNJT04KKyNlbmRpZgorCisjaWZuZGVmIHBUSFgKKyMgICAgZGVmaW5lIHBUSFggdm9pZAorIyAgICBkZWZpbmUgcFRIWF8KKyNlbmRpZgorCisjaWZuZGVmIEVYVEVSTl9DCisjIGRlZmluZSBFWFRFUk5fQworI2VuZGlmCisKKy8qIENvbXBhdGliaWxpdHkgaGFja3Mgb3ZlciAqLworCitzdGF0aWMgUGVybEludGVycHJldGVyICpwZXJsX2ludGVycCA9IE5VTEw7CitzdGF0aWMgdm9pZCB4c19pbml0IF9fQVJHUygocFRIWCkpOworc3RhdGljIHZvaWQgVklNX2luaXQgX19BUkdTKCh2b2lkKSk7CitFWFRFUk5fQyB2b2lkIGJvb3RfRHluYUxvYWRlciBfX0FSR1MoKHBUSFhfIENWKikpOworCisvKgorICogRm9yIGR5bmFtaWMgbGlua2VkIHBlcmwuIChXaW5kb3dzKQorICovCisjaWYgZGVmaW5lZChEWU5BTUlDX1BFUkwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogV3JhcHBlciBkZWZpbmVzCisgKi8KKyMgZGVmaW5lIHBlcmxfYWxsb2MgZGxsX3BlcmxfYWxsb2MKKyMgZGVmaW5lIHBlcmxfY29uc3RydWN0IGRsbF9wZXJsX2NvbnN0cnVjdAorIyBkZWZpbmUgcGVybF9wYXJzZSBkbGxfcGVybF9wYXJzZQorIyBkZWZpbmUgcGVybF9ydW4gZGxsX3BlcmxfcnVuCisjIGRlZmluZSBwZXJsX2Rlc3RydWN0IGRsbF9wZXJsX2Rlc3RydWN0CisjIGRlZmluZSBwZXJsX2ZyZWUgZGxsX3BlcmxfZnJlZQorIyBkZWZpbmUgUGVybF9nZXRfY29udGV4dCBkbGxfUGVybF9nZXRfY29udGV4dAorIyBkZWZpbmUgUGVybF9jcm9hayBkbGxfUGVybF9jcm9haworIyBpZm5kZWYgUFJPVE8KKyMgIGRlZmluZSBQZXJsX2Nyb2FrX25vY29udGV4dCBkbGxfUGVybF9jcm9ha19ub2NvbnRleHQKKyMgIGRlZmluZSBQZXJsX2NhbGxfYXJndiBkbGxfUGVybF9jYWxsX2FyZ3YKKyMgIGRlZmluZSBQZXJsX2NhbGxfcHYgZGxsX1BlcmxfY2FsbF9wdgorIyAgZGVmaW5lIFBlcmxfZXZhbF9zdiBkbGxfUGVybF9ldmFsX3N2CisjICBkZWZpbmUgUGVybF9nZXRfc3YgZGxsX1BlcmxfZ2V0X3N2CisjICBkZWZpbmUgUGVybF9ldmFsX3B2IGRsbF9QZXJsX2V2YWxfcHYKKyMgIGRlZmluZSBQZXJsX2NhbGxfbWV0aG9kIGRsbF9QZXJsX2NhbGxfbWV0aG9kCisjIGVuZGlmCisjIGRlZmluZSBQZXJsX2Rvd2FudGFycmF5IGRsbF9QZXJsX2Rvd2FudGFycmF5CisjIGRlZmluZSBQZXJsX2ZyZWVfdG1wcyBkbGxfUGVybF9mcmVlX3RtcHMKKyMgZGVmaW5lIFBlcmxfZ3Zfc3Rhc2hwdiBkbGxfUGVybF9ndl9zdGFzaHB2CisjIGRlZmluZSBQZXJsX21hcmtzdGFja19ncm93IGRsbF9QZXJsX21hcmtzdGFja19ncm93CisjIGRlZmluZSBQZXJsX21nX2ZpbmQgZGxsX1BlcmxfbWdfZmluZAorIyBkZWZpbmUgUGVybF9uZXdYUyBkbGxfUGVybF9uZXdYUworIyBkZWZpbmUgUGVybF9uZXdTViBkbGxfUGVybF9uZXdTVgorIyBkZWZpbmUgUGVybF9uZXdTVml2IGRsbF9QZXJsX25ld1NWaXYKKyMgZGVmaW5lIFBlcmxfbmV3U1ZwdiBkbGxfUGVybF9uZXdTVnB2CisjIGRlZmluZSBQZXJsX3BvcF9zY29wZSBkbGxfUGVybF9wb3Bfc2NvcGUKKyMgZGVmaW5lIFBlcmxfcHVzaF9zY29wZSBkbGxfUGVybF9wdXNoX3Njb3BlCisjIGRlZmluZSBQZXJsX3NhdmVfaW50IGRsbF9QZXJsX3NhdmVfaW50CisjIGRlZmluZSBQZXJsX3N0YWNrX2dyb3cgZGxsX1Blcmxfc3RhY2tfZ3JvdworIyBkZWZpbmUgUGVybF9zZXRfY29udGV4dCBkbGxfUGVybF9zZXRfY29udGV4dAorIyBkZWZpbmUgUGVybF9zdl8yYm9vbCBkbGxfUGVybF9zdl8yYm9vbAorIyBkZWZpbmUgUGVybF9zdl8yaXYgZGxsX1Blcmxfc3ZfMml2CisjIGRlZmluZSBQZXJsX3N2XzJtb3J0YWwgZGxsX1Blcmxfc3ZfMm1vcnRhbAorIyBpZiAoUEVSTF9SRVZJU0lPTiA9PSA1KSAmJiAoUEVSTF9WRVJTSU9OID49IDgpCisjICBkZWZpbmUgUGVybF9zdl8ycHZfZmxhZ3MgZGxsX1Blcmxfc3ZfMnB2X2ZsYWdzCisjICBkZWZpbmUgUGVybF9zdl8ycHZfbm9sZW4gZGxsX1Blcmxfc3ZfMnB2X25vbGVuCisjIGVsc2UKKyMgIGRlZmluZSBQZXJsX3N2XzJwdiBkbGxfUGVybF9zdl8ycHYKKyMgZW5kaWYKKyMgZGVmaW5lIFBlcmxfc3ZfYmxlc3MgZGxsX1Blcmxfc3ZfYmxlc3MKKyMgaWYgKFBFUkxfUkVWSVNJT04gPT0gNSkgJiYgKFBFUkxfVkVSU0lPTiA+PSA4KQorIyAgZGVmaW5lIFBlcmxfc3ZfY2F0cHZuX2ZsYWdzIGRsbF9QZXJsX3N2X2NhdHB2bl9mbGFncworIyBlbHNlCisjICBkZWZpbmUgUGVybF9zdl9jYXRwdm4gZGxsX1Blcmxfc3ZfY2F0cHZuCisjIGVuZGlmCisjIGRlZmluZSBQZXJsX3N2X2ZyZWUgZGxsX1Blcmxfc3ZfZnJlZQorIyBkZWZpbmUgUGVybF9zdl9pc2EgZGxsX1Blcmxfc3ZfaXNhCisjIGRlZmluZSBQZXJsX3N2X21hZ2ljIGRsbF9QZXJsX3N2X21hZ2ljCisjIGRlZmluZSBQZXJsX3N2X3NldGl2IGRsbF9QZXJsX3N2X3NldGl2CisjIGRlZmluZSBQZXJsX3N2X3NldHB2IGRsbF9QZXJsX3N2X3NldHB2CisjIGRlZmluZSBQZXJsX3N2X3NldHB2biBkbGxfUGVybF9zdl9zZXRwdm4KKyMgaWYgKFBFUkxfUkVWSVNJT04gPT0gNSkgJiYgKFBFUkxfVkVSU0lPTiA+PSA4KQorIyAgZGVmaW5lIFBlcmxfc3Zfc2V0c3ZfZmxhZ3MgZGxsX1Blcmxfc3Zfc2V0c3ZfZmxhZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBlcmxfc3Zfc2V0c3YgZGxsX1Blcmxfc3Zfc2V0c3YKKyMgZW5kaWYKKyMgZGVmaW5lIFBlcmxfc3ZfdXBncmFkZSBkbGxfUGVybF9zdl91cGdyYWRlCisjIGRlZmluZSBQZXJsX1RzdGFja19zcF9wdHIgZGxsX1BlcmxfVHN0YWNrX3NwX3B0cgorIyBkZWZpbmUgUGVybF9Ub3BfcHRyIGRsbF9QZXJsX1RvcF9wdHIKKyMgZGVmaW5lIFBlcmxfVHN0YWNrX2Jhc2VfcHRyIGRsbF9QZXJsX1RzdGFja19iYXNlX3B0cgorIyBkZWZpbmUgUGVybF9Uc3RhY2tfbWF4X3B0ciBkbGxfUGVybF9Uc3RhY2tfbWF4X3B0cgorIyBkZWZpbmUgUGVybF9UdG1wc19peF9wdHIgZGxsX1BlcmxfVHRtcHNfaXhfcHRyCisjIGRlZmluZSBQZXJsX1R0bXBzX2Zsb29yX3B0ciBkbGxfUGVybF9UdG1wc19mbG9vcl9wdHIKKyMgZGVmaW5lIFBlcmxfVG1hcmtzdGFja19wdHJfcHRyIGRsbF9QZXJsX1RtYXJrc3RhY2tfcHRyX3B0cgorIyBkZWZpbmUgUGVybF9UbWFya3N0YWNrX21heF9wdHIgZGxsX1BlcmxfVG1hcmtzdGFja19tYXhfcHRyCisjIGRlZmluZSBQZXJsX1RTdl9wdHIgZGxsX1BlcmxfVFN2X3B0cgorIyBkZWZpbmUgUGVybF9UWHB2X3B0ciBkbGxfUGVybF9UWHB2X3B0cgorIyBkZWZpbmUgUGVybF9UbmFfcHRyIGRsbF9QZXJsX1RuYV9wdHIKKyMgZGVmaW5lIFBlcmxfSWRlZmd2X3B0ciBkbGxfUGVybF9JZGVmZ3ZfcHRyCisjIGRlZmluZSBQZXJsX0llcnJndl9wdHIgZGxsX1BlcmxfSWVycmd2X3B0cgorIyBkZWZpbmUgUGVybF9Jc3ZfeWVzX3B0ciBkbGxfUGVybF9Jc3ZfeWVzX3B0cgorIyBkZWZpbmUgYm9vdF9EeW5hTG9hZGVyIGRsbF9ib290X0R5bmFMb2FkZXIKKworI2lmbmRlZiBEWU5BTUlDX1BFUkwgLyoganVzdCBnZW5lcmF0aW5nIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgaW50IEhBTkRMRTsKK3R5cGVkZWYgaW50IFhTSU5JVF90OwordHlwZWRlZiBpbnQgWFNVQkFERFJfdDsKKyNlbmRpZgorCisvKgorICogRGVjbGFyZSBIQU5ETEUgZm9yIHBlcmwuZGxsIGFuZCBmdW5jdGlvbiBwb2ludGVycy4KKyAqLworc3RhdGljIEhBTkRMRSBoUGVybExpYiA9IE5VTEw7CisKK3N0YXRpYyBQZXJsSW50ZXJwcmV0ZXIqICgqcGVybF9hbGxvYykoKTsKK3N0YXRpYyB2b2lkICgqcGVybF9jb25zdHJ1Y3QpKFBlcmxJbnRlcnByZXRlciopOworc3RhdGljIHZvaWQgKCpwZXJsX2Rlc3RydWN0KShQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyB2b2lkICgqcGVybF9mcmVlKShQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBpbnQgKCpwZXJsX3J1bikoUGVybEludGVycHJldGVyKik7CitzdGF0aWMgaW50ICgqcGVybF9wYXJzZSkoUGVybEludGVycHJldGVyKiwgWFNJTklUX3QsIGludCwgY2hhcioqLCBjaGFyKiopOworc3RhdGljIHZvaWQqICgqUGVybF9nZXRfY29udGV4dCkodm9pZCk7CitzdGF0aWMgdm9pZCAoKlBlcmxfY3JvYWspKHBUSFhfIGNvbnN0IGNoYXIqLCAuLi4pIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCAoKlBlcmxfY3JvYWtfbm9jb250ZXh0KShjb25zdCBjaGFyKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIEkzMiAoKlBlcmxfZG93YW50YXJyYXkpKHBUSFgpOworc3RhdGljIHZvaWQgKCpQZXJsX2ZyZWVfdG1wcykocFRIWCk7CitzdGF0aWMgSFYqICgqUGVybF9ndl9zdGFzaHB2KShwVEhYXyBjb25zdCBjaGFyKiwgSTMyKTsKK3N0YXRpYyB2b2lkICgqUGVybF9tYXJrc3RhY2tfZ3JvdykocFRIWCk7CitzdGF0aWMgTUFHSUMqICgqUGVybF9tZ19maW5kKShwVEhYXyBTViosIGludCk7CitzdGF0aWMgQ1YqICgqUGVybF9uZXdYUykocFRIWF8gY2hhciosIFhTVUJBRERSX3QsIGNoYXIqKTsKK3N0YXRpYyBTViogKCpQZXJsX25ld1NWKShwVEhYXyBTVFJMRU4pOworc3RhdGljIFNWKiAoKlBlcmxfbmV3U1ZpdikocFRIWF8gSVYpOworc3RhdGljIFNWKiAoKlBlcmxfbmV3U1ZwdikocFRIWF8gY29uc3QgY2hhciosIFNUUkxFTik7CitzdGF0aWMgSTMyICgqUGVybF9jYWxsX2FyZ3YpKHBUSFhfIGNvbnN0IGNoYXIqLCBJMzIsIGNoYXIqKik7CitzdGF0aWMgSTMyICgqUGVybF9jYWxsX3B2KShwVEhYXyBjb25zdCBjaGFyKiwgSTMyKTsKK3N0YXRpYyBJMzIgKCpQZXJsX2V2YWxfc3YpKHBUSFhfIFNWKiwgSTMyKTsKK3N0YXRpYyBTViogKCpQZXJsX2dldF9zdikocFRIWF8gY29uc3QgY2hhciosIEkzMik7CitzdGF0aWMgU1YqICgqUGVybF9ldmFsX3B2KShwVEhYXyBjb25zdCBjaGFyKiwgSTMyKTsKK3N0YXRpYyBTViogKCpQZXJsX2NhbGxfbWV0aG9kKShwVEhYXyBjb25zdCBjaGFyKiwgSTMyKTsKK3N0YXRpYyB2b2lkICgqUGVybF9wb3Bfc2NvcGUpKHBUSFgpOworc3RhdGljIHZvaWQgKCpQZXJsX3B1c2hfc2NvcGUpKHBUSFgpOworc3RhdGljIHZvaWQgKCpQZXJsX3NhdmVfaW50KShwVEhYXyBpbnQqKTsKK3N0YXRpYyBTVioqICgqUGVybF9zdGFja19ncm93KShwVEhYXyBTVioqLCBTVioqcCwgaW50KTsKK3N0YXRpYyBTVioqICgqUGVybF9zZXRfY29udGV4dCkodm9pZCopOworc3RhdGljIGJvb2wgKCpQZXJsX3N2XzJib29sKShwVEhYXyBTViopOworc3RhdGljIElWICgqUGVybF9zdl8yaXYpKHBUSFhfIFNWKik7CitzdGF0aWMgU1YqICgqUGVybF9zdl8ybW9ydGFsKShwVEhYXyBTViopOworI2lmIChQRVJMX1JFVklTSU9OID09IDUpICYmIChQRVJMX1ZFUlNJT04gPj0gOCkKK3N0YXRpYyBjaGFyKiAoKlBlcmxfc3ZfMnB2X2ZsYWdzKShwVEhYXyBTViosIFNUUkxFTiosIEkzMik7CitzdGF0aWMgY2hhciogKCpQZXJsX3N2XzJwdl9ub2xlbikocFRIWF8gU1YqKTsKKyNlbHNlCitzdGF0aWMgY2hhciogKCpQZXJsX3N2XzJwdikocFRIWF8gU1YqLCBTVFJMRU4qKTsKKyNlbmRpZgorc3RhdGljIFNWKiAoKlBlcmxfc3ZfYmxlc3MpKHBUSFhfIFNWKiwgSFYqKTsKKyNpZiAoUEVSTF9SRVZJU0lPTiA9PSA1KSAmJiAoUEVSTF9WRVJTSU9OID49IDgpCitzdGF0aWMgdm9pZCAoKlBlcmxfc3ZfY2F0cHZuX2ZsYWdzKShwVEhYXyBTViogLCBjb25zdCBjaGFyKiwgU1RSTEVOLCBJMzIpOworI2Vsc2UKK3N0YXRpYyB2b2lkICgqUGVybF9zdl9jYXRwdm4pKHBUSFhfIFNWKiwgY29uc3QgY2hhciosIFNUUkxFTik7CisjZW5kaWYKK3N0YXRpYyB2b2lkICgqUGVybF9zdl9mcmVlKShwVEhYXyBTViopOworc3RhdGljIGludCAoKlBlcmxfc3ZfaXNhKShwVEhYXyBTViosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkICgqUGVybF9zdl9tYWdpYykocFRIWF8gU1YqLCBTViosIGludCwgY29uc3QgY2hhciosIEkzMik7CitzdGF0aWMgdm9pZCAoKlBlcmxfc3Zfc2V0aXYpKHBUSFhfIFNWKiwgSVYpOworc3RhdGljIHZvaWQgKCpQZXJsX3N2X3NldHB2KShwVEhYXyBTViosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkICgqUGVybF9zdl9zZXRwdm4pKHBUSFhfIFNWKiwgY29uc3QgY2hhciosIFNUUkxFTik7CisjaWYgKFBFUkxfUkVWSVNJT04gPT0gNSkgJiYgKFBFUkxfVkVSU0lPTiA+PSA4KQorc3RhdGljIHZvaWQgKCpQZXJsX3N2X3NldHN2X2ZsYWdzKShwVEhYXyBTViosIFNWKiwgSTMyKTsKKyNlbHNlCitzdGF0aWMgdm9pZCAoKlBlcmxfc3Zfc2V0c3YpKHBUSFhfIFNWKiwgU1YqKTsKKyNlbmRpZgorc3RhdGljIGJvb2wgKCpQZXJsX3N2X3VwZ3JhZGUpKHBUSFhfIFNWKiwgVTMyKTsKK3N0YXRpYyBTVioqKiAoKlBlcmxfVHN0YWNrX3NwX3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgT1AqKiAoKlBlcmxfVG9wX3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgU1YqKiogKCpQZXJsX1RzdGFja19iYXNlX3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgU1YqKiogKCpQZXJsX1RzdGFja19tYXhfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBJMzIqICgqUGVybF9UdG1wc19peF9wdHIpKHJlZ2lzdGVyIFBlcmxJbnRlcnByZXRlciopOworc3RhdGljIEkzMiogKCpQZXJsX1R0bXBzX2Zsb29yX3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgSTMyKiogKCpQZXJsX1RtYXJrc3RhY2tfcHRyX3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgSTMyKiogKCpQZXJsX1RtYXJrc3RhY2tfbWF4X3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgU1YqKiAoKlBlcmxfVFN2X3B0cikocmVnaXN0ZXIgUGVybEludGVycHJldGVyKik7CitzdGF0aWMgWFBWKiogKCpQZXJsX1RYcHZfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBTVFJMRU4qICgqUGVybF9UbmFfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBHVioqICgqUGVybF9JZGVmZ3ZfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBHVioqICgqUGVybF9JZXJyZ3ZfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyBTViogKCpQZXJsX0lzdl95ZXNfcHRyKShyZWdpc3RlciBQZXJsSW50ZXJwcmV0ZXIqKTsKK3N0YXRpYyB2b2lkICgqYm9vdF9EeW5hTG9hZGVyKV8oKHBUSFhfIENWKikpOworCisKKy8qCisgKiBUYWJsZSBvZiBuYW1lIHRvIGZ1bmN0aW9uIHBvaW50ZXIgb2YgcGVybC4KKyAqLworI2RlZmluZSBQRVJMX1BST0MgRkFSUFJPQworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciogbmFtZTsKKyAgICBQRVJMX1BST0MqIHB0cjsKK30gcGVybF9mdW5jbmFtZV90YWJsZVtdID0geworICAgIHsicGVybF9hbGxvYyIsIChQRVJMX1BST0MqKSZwZXJsX2FsbG9jfSwKKyAgICB7InBlcmxfY29uc3RydWN0IiwgKFBFUkxfUFJPQyopJnBlcmxfY29uc3RydWN0fSwKKyAgICB7InBlcmxfZGVzdHJ1Y3QiLCAoUEVSTF9QUk9DKikmcGVybF9kZXN0cnVjdH0sCisgICAgeyJwZXJsX2ZyZWUiLCAoUEVSTF9QUk9DKikmcGVybF9mcmVlfSwKKyAgICB7InBlcmxfcnVuIiwgKFBFUkxfUFJPQyopJnBlcmxfcnVufSwKKyAgICB7InBlcmxfcGFyc2UiLCAoUEVSTF9QUk9DKikmcGVybF9wYXJzZX0sCisgICAgeyJQZXJsX2dldF9jb250ZXh0IiwgKFBFUkxfUFJPQyopJlBlcmxfZ2V0X2NvbnRleHR9LAorICAgIHsiUGVybF9jcm9hayIsIChQRVJMX1BST0MqKSZQZXJsX2Nyb2FrfSwKKyAgICB7IlBlcmxfY3JvYWtfbm9jb250ZXh0IiwgKFBFUkxfUFJPQyopJlBlcmxfY3JvYWtfbm9jb250ZXh0fSwKKyAgICB7IlBlcmxfZG93YW50YXJyYXkiLCAoUEVSTF9QUk9DKikmUGVybF9kb3dhbnRhcnJheX0sCisgICAgeyJQZXJsX2ZyZWVfdG1wcyIsIChQRVJMX1BST0MqKSZQZXJsX2ZyZWVfdG1wc30sCisgICAgeyJQZXJsX2d2X3N0YXNocHYiLCAoUEVSTF9QUk9DKikmUGVybF9ndl9zdGFzaHB2fSwKKyAgICB7IlBlcmxfbWFya3N0YWNrX2dyb3ciLCAoUEVSTF9QUk9DKikmUGVybF9tYXJrc3RhY2tfZ3Jvd30sCisgICAgeyJQZXJsX21nX2ZpbmQiLCAoUEVSTF9QUk9DKikmUGVybF9tZ19maW5kfSwKKyAgICB7IlBlcmxfbmV3WFMiLCAoUEVSTF9QUk9DKikmUGVybF9uZXdYU30sCisgICAgeyJQZXJsX25ld1NWIiwgKFBFUkxfUFJPQyopJlBlcmxfbmV3U1Z9LAorICAgIHsiUGVybF9uZXdTVml2IiwgKFBFUkxfUFJPQyopJlBlcmxfbmV3U1Zpdn0sCisgICAgeyJQZXJsX25ld1NWcHYiLCAoUEVSTF9QUk9DKikmUGVybF9uZXdTVnB2fSwKKyAgICB7IlBlcmxfY2FsbF9hcmd2IiwgKFBFUkxfUFJPQyopJlBlcmxfY2FsbF9hcmd2fSwKKyAgICB7IlBlcmxfY2FsbF9wdiIsIChQRVJMX1BST0MqKSZQZXJsX2NhbGxfcHZ9LAorICAgIHsiUGVybF9ldmFsX3N2IiwgKFBFUkxfUFJPQyopJlBlcmxfZXZhbF9zdn0sCisgICAgeyJQZXJsX2dldF9zdiIsIChQRVJMX1BST0MqKSZQZXJsX2dldF9zdn0sCisgICAgeyJQZXJsX2V2YWxfcHYiLCAoUEVSTF9QUk9DKikmUGVybF9ldmFsX3B2fSwKKyAgICB7IlBlcmxfY2FsbF9tZXRob2QiLCAoUEVSTF9QUk9DKikmUGVybF9jYWxsX21ldGhvZH0sCisgICAgeyJQZXJsX3BvcF9zY29wZSIsIChQRVJMX1BST0MqKSZQZXJsX3BvcF9zY29wZX0sCisgICAgeyJQZXJsX3B1c2hfc2NvcGUiLCAoUEVSTF9QUk9DKikmUGVybF9wdXNoX3Njb3BlfSwKKyAgICB7IlBlcmxfc2F2ZV9pbnQiLCAoUEVSTF9QUk9DKikmUGVybF9zYXZlX2ludH0sCisgICAgeyJQZXJsX3N0YWNrX2dyb3ciLCAoUEVSTF9QUk9DKikmUGVybF9zdGFja19ncm93fSwKKyAgICB7IlBlcmxfc2V0X2NvbnRleHQiLCAoUEVSTF9QUk9DKikmUGVybF9zZXRfY29udGV4dH0sCisgICAgeyJQZXJsX3N2XzJib29sIiwgKFBFUkxfUFJPQyopJlBlcmxfc3ZfMmJvb2x9LAorICAgIHsiUGVybF9zdl8yaXYiLCAoUEVSTF9QUk9DKikmUGVybF9zdl8yaXZ9LAorICAgIHsiUGVybF9zdl8ybW9ydGFsIiwgKFBFUkxfUFJPQyopJlBlcmxfc3ZfMm1vcnRhbH0sCisjaWYgKFBFUkxfUkVWSVNJT04gPT0gNSkgJiYgKFBFUkxfVkVSU0lPTiA+PSA4KQorICAgIHsiUGVybF9zdl8ycHZfZmxhZ3MiLCAoUEVSTF9QUk9DKikmUGVybF9zdl8ycHZfZmxhZ3N9LAorICAgIHsiUGVybF9zdl8ycHZfbm9sZW4iLCAoUEVSTF9QUk9DKikmUGVybF9zdl8ycHZfbm9sZW59LAorI2Vsc2UKKyAgICB7IlBlcmxfc3ZfMnB2IiwgKFBFUkxfUFJPQyopJlBlcmxfc3ZfMnB2fSwKKyNlbmRpZgorICAgIHsiUGVybF9zdl9ibGVzcyIsIChQRVJMX1BST0MqKSZQZXJsX3N2X2JsZXNzfSwKKyNpZiAoUEVSTF9SRVZJU0lPTiA9PSA1KSAmJiAoUEVSTF9WRVJTSU9OID49IDgpCisgICAgeyJQZXJsX3N2X2NhdHB2bl9mbGFncyIsIChQRVJMX1BST0MqKSZQZXJsX3N2X2NhdHB2bl9mbGFnc30sCisjZWxzZQorICAgIHsiUGVybF9zdl9jYXRwdm4iLCAoUEVSTF9QUk9DKikmUGVybF9zdl9jYXRwdm59LAorI2VuZGlmCisgICAgeyJQZXJsX3N2X2ZyZWUiLCAoUEVSTF9QUk9DKikmUGVybF9zdl9mcmVlfSwKKyAgICB7IlBlcmxfc3ZfaXNhIiwgKFBFUkxfUFJPQyopJlBlcmxfc3ZfaXNhfSwKKyAgICB7IlBlcmxfc3ZfbWFnaWMiLCAoUEVSTF9QUk9DKikmUGVybF9zdl9tYWdpY30sCisgICAgeyJQZXJsX3N2X3NldGl2IiwgKFBFUkxfUFJPQyopJlBlcmxfc3Zfc2V0aXZ9LAorICAgIHsiUGVybF9zdl9zZXRwdiIsIChQRVJMX1BST0MqKSZQZXJsX3N2X3NldHB2fSwKKyAgICB7IlBlcmxfc3Zfc2V0cHZuIiwgKFBFUkxfUFJPQyopJlBlcmxfc3Zfc2V0cHZufSwKKyNpZiAoUEVSTF9SRVZJU0lPTiA9PSA1KSAmJiAoUEVSTF9WRVJTSU9OID49IDgpCisgICAgeyJQZXJsX3N2X3NldHN2X2ZsYWdzIiwgKFBFUkxfUFJPQyopJlBlcmxfc3Zfc2V0c3ZfZmxhZ3N9LAorI2Vsc2UKKyAgICB7IlBlcmxfc3Zfc2V0c3YiLCAoUEVSTF9QUk9DKikmUGVybF9zdl9zZXRzdn0sCisjZW5kaWYKKyAgICB7IlBlcmxfc3ZfdXBncmFkZSIsIChQRVJMX1BST0MqKSZQZXJsX3N2X3VwZ3JhZGV9LAorICAgIHsiUGVybF9Uc3RhY2tfc3BfcHRyIiwgKFBFUkxfUFJPQyopJlBlcmxfVHN0YWNrX3NwX3B0cn0sCisgICAgeyJQZXJsX1RvcF9wdHIiLCAoUEVSTF9QUk9DKikmUGVybF9Ub3BfcHRyfSwKKyAgICB7IlBlcmxfVHN0YWNrX2Jhc2VfcHRyIiwgKFBFUkxfUFJPQyopJlBlcmxfVHN0YWNrX2Jhc2VfcHRyfSwKKyAgICB7IlBlcmxfVHN0YWNrX21heF9wdHIiLCAoUEVSTF9QUk9DKikmUGVybF9Uc3RhY2tfbWF4X3B0cn0sCisgICAgeyJQZXJsX1R0bXBzX2l4X3B0ciIsIChQRVJMX1BST0MqKSZQZXJsX1R0bXBzX2l4X3B0cn0sCisgICAgeyJQZXJsX1R0bXBzX2Zsb29yX3B0ciIsIChQRVJMX1BST0MqKSZQZXJsX1R0bXBzX2Zsb29yX3B0cn0sCisgICAgeyJQZXJsX1RtYXJrc3RhY2tfcHRyX3B0ciIsIChQRVJMX1BST0MqKSZQZXJsX1RtYXJrc3RhY2tfcHRyX3B0cn0sCisgICAgeyJQZXJsX1RtYXJrc3RhY2tfbWF4X3B0ciIsIChQRVJMX1BST0MqKSZQZXJsX1RtYXJrc3RhY2tfbWF4X3B0cn0sCisgICAgeyJQZXJsX1RTdl9wdHIiLCAoUEVSTF9QUk9DKikmUGVybF9UU3ZfcHRyfSwKKyAgICB7IlBlcmxfVFhwdl9wdHIiLCAoUEVSTF9QUk9DKikmUGVybF9UWHB2X3B0cn0sCisgICAgeyJQZXJsX1RuYV9wdHIiLCAoUEVSTF9QUk9DKikmUGVybF9UbmFfcHRyfSwKKyAgICB7IlBlcmxfSWRlZmd2X3B0ciIsIChQRVJMX1BST0MqKSZQZXJsX0lkZWZndl9wdHJ9LAorICAgIHsiUGVybF9JZXJyZ3ZfcHRyIiwgKFBFUkxfUFJPQyopJlBlcmxfSWVycmd2X3B0cn0sCisgICAgeyJQZXJsX0lzdl95ZXNfcHRyIiwgKFBFUkxfUFJPQyopJlBlcmxfSXN2X3llc19wdHJ9LAorICAgIHsiYm9vdF9EeW5hTG9hZGVyIiwgKFBFUkxfUFJPQyopJmJvb3RfRHluYUxvYWRlcn0sCisgICAgeyIiLCBOVUxMfSwKK307CisKKy8qCisgKiBNYWtlIGFsbCBydW50aW1lLWxpbmtzIG9mIHBlcmwuCisgKgorICogMS4gR2V0IG1vZHVsZSBoYW5kbGUgdXNpbmcgTG9hZExpYnJhcnlFeC4KKyAqIDIuIEdldCBwb2ludGVyIHRvIHBlcmwgZnVuY3Rpb24gYnkgR2V0UHJvY0FkZHJlc3MuCisgKiAzLiBSZXBlYXQgMiwgdW50aWwgZ2V0IGFsbCBmdW5jdGlvbnMgd2lsbCBiZSB1c2VkLgorICoKKyAqIFBhcmFtZXRlciAnbGlibmFtZScgcHJvdmlkZXMgbmFtZSBvZiBETEwuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3BlcmxfcnVudGltZV9saW5rX2luaXQoY2hhciAqbGlibmFtZSwgaW50IHZlcmJvc2UpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoaFBlcmxMaWIgIT0gTlVMTCkKKwlyZXR1cm4gT0s7CisgICAgaWYgKCEoaFBlcmxMaWIgPSBMb2FkTGlicmFyeUV4KGxpYm5hbWUsIE5VTEwsIDApKSkKKyAgICB7CisJaWYgKHZlcmJvc2UpCisJICAgIEVNU0cyKF8oIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiKSwgbGlibmFtZSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IHBlcmxfZnVuY25hbWVfdGFibGVbaV0ucHRyOyArK2kpCisgICAgeworCWlmICghKCpwZXJsX2Z1bmNuYW1lX3RhYmxlW2ldLnB0ciA9IEdldFByb2NBZGRyZXNzKGhQZXJsTGliLAorCQkJcGVybF9mdW5jbmFtZV90YWJsZVtpXS5uYW1lKSkpCisJeworCSAgICBGcmVlTGlicmFyeShoUGVybExpYik7CisJICAgIGhQZXJsTGliID0gTlVMTDsKKwkgICAgaWYgKHZlcmJvc2UpCisJCUVNU0cyKF8oZV9sb2FkZnVuYyksIHBlcmxfZnVuY25hbWVfdGFibGVbaV0ubmFtZSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogSWYgcnVudGltZS1saW5rLXBlcmwoRExMKSB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgcmV0dXJuIFRSVUUuCisgKiBUaGVyZSB3ZXJlIG5vIERMTCBsb2FkZWQsIHJldHVybiBGQUxTRS4KKyAqLworICAgIGludAorcGVybF9lbmFibGVkKHZlcmJvc2UpCisgICAgaW50CQl2ZXJib3NlOworeworICAgIHJldHVybiBwZXJsX3J1bnRpbWVfbGlua19pbml0KERZTkFNSUNfUEVSTF9ETEwsIHZlcmJvc2UpID09IE9LOworfQorI2VuZGlmIC8qIERZTkFNSUNfUEVSTCAqLworCisvKgorICogcGVybF9pbml0KCk6IGluaXRpYWxpemUgcGVybCBpbnRlcnByZXRlcgorICogV2UgaGF2ZSB0byBjYWxsIHBlcmxfcGFyc2UgdG8gaW5pdGlhbGl6ZSBzb21lIHN0cnVjdHVyZXMsCisgKiB0aGVyZSdzIG5vdGhpbmcgdG8gYWN0dWFsbHkgcGFyc2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcGVybF9pbml0KCkKK3sKKyAgICBjaGFyCSpib290YXJnc1tdID0geyAiVkkiLCBOVUxMIH07CisgICAgc3RhdGljIGNoYXIgKmFyZ3NbXSA9IHsgIiIsICItZSIsICIiIH07CisKKyAgICBwZXJsX2ludGVycCA9IHBlcmxfYWxsb2MoKTsKKyAgICBwZXJsX2NvbnN0cnVjdChwZXJsX2ludGVycCk7CisgICAgcGVybF9wYXJzZShwZXJsX2ludGVycCwgeHNfaW5pdCwgMywgYXJncywgMCk7CisgICAgcGVybF9jYWxsX2FyZ3YoIlZJTTo6Ym9vdHN0cmFwIiwgKGxvbmcpR19ESVNDQVJELCBib290YXJncyk7CisgICAgVklNX2luaXQoKTsKKyNpZmRlZiBVU0VfU0ZJTworICAgIHNmZGlzYyhQZXJsSU9fc3Rkb3V0KCksIHNmZGNuZXd2aW0oKSk7CisgICAgc2ZkaXNjKFBlcmxJT19zdGRlcnIoKSwgc2ZkY25ld3ZpbSgpKTsKKyAgICBzZnNldGJ1ZihQZXJsSU9fc3Rkb3V0KCksIE5VTEwsIDApOworICAgIHNmc2V0YnVmKFBlcmxJT19zdGRlcnIoKSwgTlVMTCwgMCk7CisjZW5kaWYKK30KKworLyoKKyAqIHBlcmxfZW5kKCk6IGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcworICovCisgICAgdm9pZAorcGVybF9lbmQoKQoreworICAgIGlmIChwZXJsX2ludGVycCkKKyAgICB7CisJcGVybF9ydW4ocGVybF9pbnRlcnApOworCXBlcmxfZGVzdHJ1Y3QocGVybF9pbnRlcnApOworCXBlcmxfZnJlZShwZXJsX2ludGVycCk7CisJcGVybF9pbnRlcnAgPSBOVUxMOworICAgIH0KKyNpZmRlZiBEWU5BTUlDX1BFUkwKKyAgICBpZiAoaFBlcmxMaWIpCisgICAgeworCUZyZWVMaWJyYXJ5KGhQZXJsTGliKTsKKwloUGVybExpYiA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBtc2dfc3BsaXQoKTogc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1lc3NhZ2UgaGFuZGxpbmcgcm91dGluZXMKKyAqIHNwbGl0IGF0ICdcbicgZmlyc3QgdGhvdWdoLgorICovCisgICAgdm9pZAorbXNnX3NwbGl0KHMsIGF0dHIpCisgICAgY2hhcl91CSpzOworICAgIGludAkJYXR0cjsJLyogaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgKi8KK3sKKyAgICBjaGFyICpuZXh0OworICAgIGNoYXIgKnRva2VuID0gKGNoYXIgKilzOworCisgICAgd2hpbGUgKChuZXh0ID0gc3RyY2hyKHRva2VuLCAnXG4nKSkpCisgICAgeworCSpuZXh0KysgPSAnXDAnOwkJCS8qIHJlcGxhY2UgXG4gd2l0aCBcMCAqLworCW1zZ19hdHRyKChjaGFyX3UgKil0b2tlbiwgYXR0cik7CisJdG9rZW4gPSBuZXh0OworICAgIH0KKyAgICBpZiAoKnRva2VuKQorCW1zZ19hdHRyKChjaGFyX3UgKil0b2tlbiwgYXR0cik7Cit9CisKKyNpZm5kZWYgRkVBVF9FVkFMCisvKgorICogVGhpcyBzdHViIGlzIG5lZWRlZCBiZWNhdXNlIGFuICIjaWZkZWYgRkVBVF9FVkFMIiBhcm91bmQgRXZhbCgpIGRvZXNuJ3QKKyAqIHdvcmsgcHJvcGVybHkuCisgKi8KKyAgICBjaGFyX3UgKgorZXZhbF90b19zdHJpbmcoYXJnLCBuZXh0Y21kKQorICAgIGNoYXJfdQkqYXJnOworICAgIGNoYXJfdQkqKm5leHRjbWQ7Cit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZSBhIG5ldyByZWZlcmVuY2UgdG8gYW4gU1YgcG9pbnRpbmcgdG8gdGhlIFNDUiBzdHJ1Y3R1cmUKKyAqIFRoZSBwZXJsX3ByaXZhdGUgcGFydCBvZiB0aGUgU0NSIHN0cnVjdHVyZSBwb2ludHMgdG8gdGhlIFNWLAorICogc28gdGhlcmUgY2FuIG9ubHkgYmUgb25lIHN1Y2ggU1YgZm9yIGEgcGFydGljdWxhciBTQ1Igc3RydWN0dXJlLgorICogV2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGdvbmUgKERFU1RST1kgaXMgY2FsbGVkKSwKKyAqIHBlcmxfcHJpdmF0ZSBpcyByZXNldDsgV2hlbiB0aGUgc2NyZWVuIGdvZXMgYXdheSBiZWZvcmUKKyAqIGFsbCByZWZlcmVuY2VzIGFyZSBnb25lLCB0aGUgdmFsdWUgb2YgdGhlIFNWIGlzIHJlc2V0OworICogYW55IHN1YnNlcXVlbnQgdXNlIG9mIGFueSBvZiB0aG9zZSByZWZlcmVuY2Ugd2lsbCBwcm9kdWNlCisgKiBhIHdhcm5pbmcuIChzZWUgdHlwZW1hcCkKKyAqLworI2RlZmluZSBuZXdBTllydihUWVBFLCBUTkFNRSkJCQkJCVwKK3N0YXRpYyBTViAqCQkJCQkJCVwKK25ldyAjIyBUTkFNRSAjIyBydihydiwgcHRyKQkJCQkJXAorICAgIFNWICpydjsJCQkJCQkJXAorICAgIFRZUEUgKnB0cjsJCQkJCQkJXAorewkJCQkJCQkJXAorICAgIHN2X3VwZ3JhZGUocnYsIFNWdF9SVik7CQkJCQlcCisgICAgaWYgKCFwdHItPnBlcmxfcHJpdmF0ZSkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisJcHRyLT5wZXJsX3ByaXZhdGUgPSBuZXdTVigwKTsJCQkJXAorCXN2X3NldGl2KHB0ci0+cGVybF9wcml2YXRlLCAoSVYpcHRyKTsJCQlcCisgICAgfQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJXAorCVN2UkVGQ05UX2luYyhwdHItPnBlcmxfcHJpdmF0ZSk7CQkJXAorICAgIFN2UlYocnYpID0gcHRyLT5wZXJsX3ByaXZhdGU7CQkJCVwKKyAgICBTdlJPS19vbihydik7CQkJCQkJXAorICAgIHJldHVybiBzdl9ibGVzcyhydiwgZ3Zfc3Rhc2hwdigiVkkiICNUTkFNRSwgVFJVRSkpOwkJXAorfQorCituZXdBTllydih3aW5fVCwgV0lOKQorbmV3QU5ZcnYoYnVmX1QsIEJVRikKKworLyoKKyAqIHBlcmxfd2luX2ZyZWUKKyAqCVJlbW92ZSBhbGwgcmVmZW5jZXMgdG8gdGhlIHdpbmRvdyB0byBiZSBkZXN0cm95ZWQKKyAqLworICAgIHZvaWQKK3Blcmxfd2luX2ZyZWUod3ApCisgICAgd2luX1QgKndwOworeworICAgIGlmICh3cC0+cGVybF9wcml2YXRlKQorCXN2X3NldGl2KChTViAqKXdwLT5wZXJsX3ByaXZhdGUsIDApOworICAgIHJldHVybjsKK30KKworICAgIHZvaWQKK3BlcmxfYnVmX2ZyZWUoYnApCisgICAgYnVmX1QgKmJwOworeworICAgIGlmIChicC0+cGVybF9wcml2YXRlKQorCXN2X3NldGl2KChTViAqKWJwLT5wZXJsX3ByaXZhdGUsIDApOworICAgIHJldHVybjsKK30KKworI2lmbmRlZiBQUk9UTworIyBpZiAoUEVSTF9SRVZJU0lPTiA9PSA1KSAmJiAoUEVSTF9WRVJTSU9OID49IDgpCitJMzIgY3VyX3ZhbChwVEhYXyBJViBpdiwgU1YgKnN2KTsKKyMgZWxzZQorSTMyIGN1cl92YWwoSVYgaXYsIFNWICpzdik7CisjZW5kaWYKKworLyoKKyAqIEhhbmRsZXIgZm9yIHRoZSBtYWdpYyB2YXJpYWJsZXMgJG1haW46OmN1cndpbiBhbmQgJG1haW46OmN1cmJ1Zi4KKyAqIFRoZSBoYW5kbGVyIGlzIHB1dCBpbnRvIHRoZSBtYWdpYyB2dGJsIGZvciB0aGVzZSB2YXJpYWJsZXMuCisgKiAoVGhpcyBpcyBlZmZlY3RpdmVseSBhIEMtbGV2ZWwgZXF1aXZhbGVudCBvZiBhIHRpZWQgdmFyaWFibGUpLgorICogVGhlcmUgaXMgbm8gInNldCIgZnVuY3Rpb24gYXMgdGhlIHZhcmlhYmxlcyBhcmUgcmVhZC1vbmx5LgorICovCisjIGlmIChQRVJMX1JFVklTSU9OID09IDUpICYmIChQRVJMX1ZFUlNJT04gPj0gOCkKK0kzMiBjdXJfdmFsKHBUSFhfIElWIGl2LCBTViAqc3YpCisjIGVsc2UKK0kzMiBjdXJfdmFsKElWIGl2LCBTViAqc3YpCisjIGVuZGlmCit7CisgICAgU1YgKnJ2OworICAgIGlmIChpdiA9PSAwKQorCXJ2ID0gbmV3V0lOcnYobmV3U1YoMCksIGN1cndpbik7CisgICAgZWxzZQorCXJ2ID0gbmV3QlVGcnYobmV3U1YoMCksIGN1cmJ1Zik7CisgICAgc3Zfc2V0c3Yoc3YsIHJ2KTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhUFJPVE8gKi8KKworc3RydWN0IHVmdW5jcyBjd19mdW5jcyA9IHsgY3VyX3ZhbCwgMCwgMCB9Oworc3RydWN0IHVmdW5jcyBjYl9mdW5jcyA9IHsgY3VyX3ZhbCwgMCwgMSB9OworCisvKgorICogVklNX2luaXQoKTogVmltLXNwZWNpZmljIGluaXRpYWxpc2F0aW9uLgorICogTWFrZSB0aGUgbWFnaWNhbCBtYWluOjpjdXJ3aW4gYW5kIG1haW46OmN1cmJ1ZiB2YXJpYWJsZXMKKyAqLworICAgIHN0YXRpYyB2b2lkCitWSU1faW5pdCgpCit7CisgICAgc3RhdGljIGNoYXIgY3dbXSA9ICJtYWluOjpjdXJ3aW4iOworICAgIHN0YXRpYyBjaGFyIGNiW10gPSAibWFpbjo6Y3VyYnVmIjsKKyAgICBTViAqc3Y7CisKKyAgICBzdiA9IHBlcmxfZ2V0X3N2KGN3LCBUUlVFKTsKKyAgICBzdl9tYWdpYyhzdiwgTlVMTCwgJ1UnLCAoY2hhciAqKSZjd19mdW5jcywgc2l6ZW9mKGN3X2Z1bmNzKSk7CisgICAgU3ZSRUFET05MWV9vbihzdik7CisKKyAgICBzdiA9IHBlcmxfZ2V0X3N2KGNiLCBUUlVFKTsKKyAgICBzdl9tYWdpYyhzdiwgTlVMTCwgJ1UnLCAoY2hhciAqKSZjYl9mdW5jcywgc2l6ZW9mKGNiX2Z1bmNzKSk7CisgICAgU3ZSRUFET05MWV9vbihzdik7CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBTYWZlIGNvbXBhcnRtZW50LgorICAgICAqIEl0IHNob3VsZG4ndCBiZSBhIGZhdGFsIGVycm9yIGlmIHRoZSBTYWZlIG1vZHVsZSBpcyBtaXNzaW5nLgorICAgICAqIFhYWDogT25seSBzaGFyZXMgdGhlICdNc2cnIHJvdXRpbmUgKHdoaWNoIGhhcyB0byBiZSBjYWxsZWQKKyAgICAgKiBsaWtlICdNc2coLi4uKScpLgorICAgICAqLworICAgICh2b2lkKXBlcmxfZXZhbF9wdiggImlmICggZXZhbCggJ3JlcXVpcmUgU2FmZScgKSApIHsgJFZJTTo6c2FmZSA9IFNhZmUtPm5ldygpOyAkVklNOjpzYWZlLT5zaGFyZV9mcm9tKCAnVklNJywgWydNc2cnXSApOyB9IiwgR19ESVNDQVJEIHwgR19WT0lEICk7CisKK30KKworI2lmZGVmIERZTkFNSUNfUEVSTAorc3RhdGljIGNoYXIgKmVfbm9wZXJsID0gTl8oIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iKTsKKyNlbmRpZgorCisvKgorICogIjpwZXJsIgorICovCisgICAgdm9pZAorZXhfcGVybChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXIJKmVycjsKKyAgICBjaGFyCSpzY3JpcHQ7CisgICAgU1RSTEVOCWxlbmd0aDsKKyAgICBTVgkJKnN2OworICAgIFNWCQkqc2FmZTsKKworICAgIHNjcmlwdCA9IChjaGFyICopc2NyaXB0X2dldChlYXAsIGVhcC0+YXJnKTsKKyAgICBpZiAoZWFwLT5za2lwKQorICAgIHsKKwl2aW1fZnJlZShzY3JpcHQpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAocGVybF9pbnRlcnAgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgRFlOQU1JQ19QRVJMCisJaWYgKCFwZXJsX2VuYWJsZWQoVFJVRSkpCisJeworCSAgICBFTVNHKF8oZV9ub3BlcmwpKTsKKwkgICAgdmltX2ZyZWUoc2NyaXB0KTsKKwkgICAgcmV0dXJuOworCX0KKyNlbmRpZgorCXBlcmxfaW5pdCgpOworICAgIH0KKworICAgIHsKKyAgICBkU1A7CisgICAgRU5URVI7CisgICAgU0FWRVRNUFM7CisKKyAgICBpZiAoc2NyaXB0ID09IE5VTEwpCisJc3YgPSBuZXdTVnB2KChjaGFyICopZWFwLT5hcmcsIDApOworICAgIGVsc2UKKyAgICB7CisJc3YgPSBuZXdTVnB2KHNjcmlwdCwgMCk7CisJdmltX2ZyZWUoc2NyaXB0KTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKyAgICBpZiAoc2FuZGJveCkKKyAgICB7CisJaWYgKChzYWZlID0gcGVybF9nZXRfc3YoICJWSU06OnNhZmUiLCBGQUxTRSApKSA9PSBOVUxMIHx8ICFTdlRSVUUoc2FmZSkpCisJICAgIEVNU0coXygiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIikpOworCWVsc2UKKwl7CisJICAgIFBVU0hNQVJLKFNQKTsKKwkgICAgWFBVU0hzKHNhZmUpOworCSAgICBYUFVTSHMoc3YpOworCSAgICBQVVRCQUNLOworCSAgICBwZXJsX2NhbGxfbWV0aG9kKCJyZXZhbCIsIEdfRElTQ0FSRCk7CisJfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlwZXJsX2V2YWxfc3Yoc3YsIEdfRElTQ0FSRCB8IEdfTk9BUkdTKTsKKworICAgIFN2UkVGQ05UX2RlYyhzdik7CisKKyAgICBlcnIgPSBTdlBWKEd2U1YoUExfZXJyZ3YpLCBsZW5ndGgpOworCisgICAgRlJFRVRNUFM7CisgICAgTEVBVkU7CisKKyAgICBpZiAoIWxlbmd0aCkKKwlyZXR1cm47CisKKyAgICBtc2dfc3BsaXQoKGNoYXJfdSAqKWVyciwgaGlnaGxpZ2h0X2F0dHJbSExGX0VdKTsKKyAgICByZXR1cm47CisgICAgfQorfQorCisgICAgc3RhdGljIGludAorcmVwbGFjZV9saW5lKGxpbmUsIGVuZCkKKyAgICBsaW5lbnJfVAkqbGluZSwgKmVuZDsKK3sKKyAgICBjaGFyICpzdHI7CisKKyAgICBpZiAoU3ZPSyhHdlNWKFBMX2RlZmd2KSkpCisgICAgeworCXN0ciA9IFN2UFYoR3ZTVihQTF9kZWZndiksIFBMX25hKTsKKwltbF9yZXBsYWNlKCpsaW5lLCAoY2hhcl91ICopc3RyLCAxKTsKKwljaGFuZ2VkX2J5dGVzKCpsaW5lLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwltbF9kZWxldGUoKmxpbmUsIEZBTFNFKTsKKwlkZWxldGVkX2xpbmVzX21hcmsoKmxpbmUsIDFMKTsKKwktLSgqZW5kKTsKKwktLSgqbGluZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqICI6cGVybGRvIi4KKyAqLworICAgIHZvaWQKK2V4X3BlcmxkbyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIFNUUkxFTglsZW5ndGg7CisgICAgU1YJCSpzdjsKKyAgICBjaGFyCSpzdHI7CisgICAgbGluZW5yX1QJaTsKKworICAgIGlmIChidWZlbXB0eSgpKQorCXJldHVybjsKKworICAgIGlmIChwZXJsX2ludGVycCA9PSBOVUxMKQorICAgIHsKKyNpZmRlZiBEWU5BTUlDX1BFUkwKKwlpZiAoIXBlcmxfZW5hYmxlZChUUlVFKSkKKwl7CisJICAgIEVNU0coXyhlX25vcGVybCkpOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCisJcGVybF9pbml0KCk7CisgICAgfQorICAgIHsKKyAgICBkU1A7CisgICAgbGVuZ3RoID0gc3RybGVuKChjaGFyICopZWFwLT5hcmcpOworICAgIHN2ID0gbmV3U1YobGVuZ3RoICsgc2l6ZW9mKCJzdWIgVklNOjpwZXJsZG8geyIpLTEgKyAxKTsKKyAgICBzdl9zZXRwdm4oc3YsICJzdWIgVklNOjpwZXJsZG8geyIsIHNpemVvZigic3ViIFZJTTo6cGVybGRvIHsiKS0xKTsKKyAgICBzdl9jYXRwdm4oc3YsIChjaGFyICopZWFwLT5hcmcsIGxlbmd0aCk7CisgICAgc3ZfY2F0cHZuKHN2LCAifSIsIDEpOworICAgIHBlcmxfZXZhbF9zdihzdiwgR19ESVNDQVJEIHwgR19OT0FSR1MpOworICAgIFN2UkVGQ05UX2RlYyhzdik7CisgICAgc3RyID0gU3ZQVihHdlNWKFBMX2Vycmd2KSwgbGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoKQorCWdvdG8gZXJyOworCisgICAgaWYgKHVfc2F2ZShlYXAtPmxpbmUxIC0gMSwgZWFwLT5saW5lMiArIDEpICE9IE9LKQorCXJldHVybjsKKworICAgIEVOVEVSOworICAgIFNBVkVUTVBTOworICAgIGZvciAoaSA9IGVhcC0+bGluZTE7IGkgPD0gZWFwLT5saW5lMjsgaSsrKQorICAgIHsKKwlzdl9zZXRwdihHdlNWKFBMX2RlZmd2KSwoY2hhciAqKW1sX2dldChpKSk7CisJUFVTSE1BUksoc3ApOworCXBlcmxfY2FsbF9wdigiVklNOjpwZXJsZG8iLCBHX1NDQUxBUiB8IEdfRVZBTCk7CisJc3RyID0gU3ZQVihHdlNWKFBMX2Vycmd2KSwgbGVuZ3RoKTsKKwlpZiAobGVuZ3RoKQorCSAgICBicmVhazsKKwlTUEFHQUlOOworCWlmIChTdlRSVUV4KFBPUHMpKQorCXsKKwkgICAgaWYgKHJlcGxhY2VfbGluZSgmaSwgJmVhcC0+bGluZTIpICE9IE9LKQorCSAgICB7CisJCVBVVEJBQ0s7CisJCWJyZWFrOworCSAgICB9CisJfQorCVBVVEJBQ0s7CisgICAgfQorICAgIEZSRUVUTVBTOworICAgIExFQVZFOworICAgIGNoZWNrX2N1cnNvcigpOworICAgIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKyAgICBpZiAoIWxlbmd0aCkKKwlyZXR1cm47CisKK2VycjoKKyAgICBtc2dfc3BsaXQoKGNoYXJfdSAqKXN0ciwgaGlnaGxpZ2h0X2F0dHJbSExGX0VdKTsKKyAgICByZXR1cm47CisgICAgfQorfQorCitYUyhYU19WSU1fTXNnKTsKK1hTKFhTX1ZJTV9TZXRPcHRpb24pOworWFMoWFNfVklNX0RvQ29tbWFuZCk7CitYUyhYU19WSU1fRXZhbCk7CitYUyhYU19WSU1fQnVmZmVycyk7CitYUyhYU19WSU1fV2luZG93cyk7CitYUyhYU19WSVdJTl9ERVNUUk9ZKTsKK1hTKFhTX1ZJV0lOX0J1ZmZlcik7CitYUyhYU19WSVdJTl9TZXRIZWlnaHQpOworWFMoWFNfVklXSU5fQ3Vyc29yKTsKK1hTKFhTX1ZJQlVGX0RFU1RST1kpOworWFMoWFNfVklCVUZfTmFtZSk7CitYUyhYU19WSUJVRl9OdW1iZXIpOworWFMoWFNfVklCVUZfQ291bnQpOworWFMoWFNfVklCVUZfR2V0KTsKK1hTKFhTX1ZJQlVGX1NldCk7CitYUyhYU19WSUJVRl9EZWxldGUpOworWFMoWFNfVklCVUZfQXBwZW5kKTsKK1hTKGJvb3RfVklNKTsKKworICAgIHN0YXRpYyB2b2lkCit4c19pbml0KHBUSFgpCit7CisgICAgY2hhciAqZmlsZSA9IF9fRklMRV9fOworCisgICAgLyogRHluYUxvYWRlciBpcyBhIHNwZWNpYWwgY2FzZSAqLworICAgIG5ld1hTKCJEeW5hTG9hZGVyOjpib290X0R5bmFMb2FkZXIiLCBib290X0R5bmFMb2FkZXIsIGZpbGUpOworICAgIG5ld1hTKCJWSU06OmJvb3RzdHJhcCIsIGJvb3RfVklNLCBmaWxlKTsKK30KKwordHlwZWRlZiB3aW5fVCAqCVZJV0lOOwordHlwZWRlZiBidWZfVCAqCVZJQlVGOworCitNT0RVTEUgPSBWSU0JICAgIFBBQ0tBR0UgPSBWSU0KKwordm9pZAorTXNnKHRleHQsIGhsPU5VTEwpCisgICAgY2hhcgkqdGV4dDsKKyAgICBjaGFyCSpobDsKKworICAgIFBSRUlOSVQ6CisgICAgaW50CQlhdHRyOworICAgIGludAkJaWQ7CisKKyAgICBQUENPREU6CisgICAgaWYgKHRleHQgIT0gTlVMTCkKKyAgICB7CisJYXR0ciA9IDA7CisJaWYgKGhsICE9IE5VTEwpCisJeworCSAgICBpZCA9IHN5bl9uYW1lMmlkKChjaGFyX3UgKilobCk7CisJICAgIGlmIChpZCAhPSAwKQorCQlhdHRyID0gc3luX2lkMmF0dHIoaWQpOworCX0KKwltc2dfc3BsaXQoKGNoYXJfdSAqKXRleHQsIGF0dHIpOworICAgIH0KKwordm9pZAorU2V0T3B0aW9uKGxpbmUpCisgICAgY2hhciAqbGluZTsKKworICAgIFBQQ09ERToKKyAgICBpZiAobGluZSAhPSBOVUxMKQorCWRvX3NldCgoY2hhcl91ICopbGluZSwgMCk7CisgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworCit2b2lkCitEb0NvbW1hbmQobGluZSkKKyAgICBjaGFyICpsaW5lOworCisgICAgUFBDT0RFOgorICAgIGlmIChsaW5lICE9IE5VTEwpCisJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKWxpbmUpOworCit2b2lkCitFdmFsKHN0cikKKyAgICBjaGFyICpzdHI7CisKKyAgICBQUkVJTklUOgorCWNoYXJfdSAqdmFsdWU7CisgICAgUFBDT0RFOgorCXZhbHVlID0gZXZhbF90b19zdHJpbmcoKGNoYXJfdSAqKXN0ciwgKGNoYXJfdSoqKTApOworCWlmICh2YWx1ZSA9PSBOVUxMKQorCXsKKwkgICAgWFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZpdigwKSkpOworCSAgICBYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVnB2KCIiLCAwKSkpOworCX0KKwllbHNlCisJeworCSAgICBYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVml2KDEpKSk7CisJICAgIFhQVVNIcyhzdl8ybW9ydGFsKG5ld1NWcHYoKGNoYXIgKil2YWx1ZSwgMCkpKTsKKwkgICAgdmltX2ZyZWUodmFsdWUpOworCX0KKwordm9pZAorQnVmZmVycyguLi4pCisKKyAgICBQUkVJTklUOgorICAgIGJ1Zl9UICp2aW1idWY7CisgICAgaW50IGksIGI7CisKKyAgICBQUENPREU6CisgICAgaWYgKGl0ZW1zID09IDApCisgICAgeworCWlmIChHSU1NRSA9PSBHX1NDQUxBUikKKwl7CisJICAgIGkgPSAwOworCSAgICBmb3IgKHZpbWJ1ZiA9IGZpcnN0YnVmOyB2aW1idWY7IHZpbWJ1ZiA9IHZpbWJ1Zi0+Yl9uZXh0KQorCQkrK2k7CisKKwkgICAgWFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZpdihpKSkpOworCX0KKwllbHNlCisJeworCSAgICBmb3IgKHZpbWJ1ZiA9IGZpcnN0YnVmOyB2aW1idWY7IHZpbWJ1ZiA9IHZpbWJ1Zi0+Yl9uZXh0KQorCQlYUFVTSHMobmV3QlVGcnYobmV3U1YoMCksIHZpbWJ1ZikpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7IGkrKykKKwl7CisJICAgIFNWICpzdiA9IFNUKGkpOworCSAgICBpZiAoU3ZJT0soc3YpKQorCQliID0gU3ZJVihTVChpKSk7CisJICAgIGVsc2UKKwkgICAgeworCQljaGFyX3UgKnBhdDsKKwkJU1RSTEVOIGxlbjsKKworCQlwYXQgPSAoY2hhcl91ICopU3ZQVihzdiwgbGVuKTsKKwkJKytlbXNnX29mZjsKKwkJYiA9IGJ1Zmxpc3RfZmluZHBhdChwYXQsIHBhdCtsZW4sIEZBTFNFLCBGQUxTRSk7CisJCS0tZW1zZ19vZmY7CisJICAgIH0KKworCSAgICBpZiAoYiA+PSAwKQorCSAgICB7CisJCXZpbWJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKGIpOworCQlpZiAodmltYnVmKQorCQkgICAgWFBVU0hzKG5ld0JVRnJ2KG5ld1NWKDApLCB2aW1idWYpKTsKKwkgICAgfQorCX0KKyAgICB9CisKK3ZvaWQKK1dpbmRvd3MoLi4uKQorCisgICAgUFJFSU5JVDoKKyAgICB3aW5fVCAgICp2aW13aW47CisgICAgaW50CSAgICBpLCB3OworCisgICAgUFBDT0RFOgorICAgIGlmIChpdGVtcyA9PSAwKQorICAgIHsKKwlpZiAoR0lNTUUgPT0gR19TQ0FMQVIpCisJICAgIFhQVVNIcyhzdl8ybW9ydGFsKG5ld1NWaXYod2luX2NvdW50KCkpKSk7CisJZWxzZQorCXsKKwkgICAgZm9yICh2aW13aW4gPSBmaXJzdHdpbjsgdmltd2luICE9IE5VTEw7IHZpbXdpbiA9IFdfTkVYVCh2aW13aW4pKQorCQlYUFVTSHMobmV3V0lOcnYobmV3U1YoMCksIHZpbXdpbikpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7IGkrKykKKwl7CisJICAgIHcgPSBTdklWKFNUKGkpKTsKKwkgICAgdmltd2luID0gd2luX2ZpbmRfbnIodyk7CisJICAgIGlmICh2aW13aW4pCisJCVhQVVNIcyhuZXdXSU5ydihuZXdTVigwKSwgdmltd2luKSk7CisJfQorICAgIH0KKworTU9EVUxFID0gVklNCSAgICBQQUNLQUdFID0gVklXSU4KKwordm9pZAorREVTVFJPWSh3aW4pCisgICAgVklXSU4gd2luCisKKyAgICBDT0RFOgorICAgIGlmICh3aW5fdmFsaWQod2luKSkKKwl3aW4tPnBlcmxfcHJpdmF0ZSA9IDA7CisKK1NWICoKK0J1ZmZlcih3aW4pCisgICAgVklXSU4gd2luCisKKyAgICBDT0RFOgorICAgIGlmICghd2luX3ZhbGlkKHdpbikpCisJd2luID0gY3Vyd2luOworICAgIFJFVFZBTCA9IG5ld0JVRnJ2KG5ld1NWKDApLCB3aW4tPndfYnVmZmVyKTsKKyAgICBPVVRQVVQ6CisgICAgUkVUVkFMCisKK3ZvaWQKK1NldEhlaWdodCh3aW4sIGhlaWdodCkKKyAgICBWSVdJTiB3aW4KKyAgICBpbnQgaGVpZ2h0OworCisgICAgUFJFSU5JVDoKKyAgICB3aW5fVCAqc2F2ZXdpbjsKKworICAgIFBQQ09ERToKKyAgICBpZiAoIXdpbl92YWxpZCh3aW4pKQorCXdpbiA9IGN1cndpbjsKKyAgICBzYXZld2luID0gY3Vyd2luOworICAgIGN1cndpbiA9IHdpbjsKKyAgICB3aW5fc2V0aGVpZ2h0KGhlaWdodCk7CisgICAgY3Vyd2luID0gc2F2ZXdpbjsKKwordm9pZAorQ3Vyc29yKHdpbiwgLi4uKQorICAgIFZJV0lOIHdpbgorCisgICAgUFBDT0RFOgorICAgIGlmKGl0ZW1zID09IDEpCisgICAgeworICAgICAgRVhURU5EKHNwLCAyKTsKKyAgICAgIGlmICghd2luX3ZhbGlkKHdpbikpCisJICB3aW4gPSBjdXJ3aW47CisgICAgICBQVVNIcyhzdl8ybW9ydGFsKG5ld1NWaXYod2luLT53X2N1cnNvci5sbnVtKSkpOworICAgICAgUFVTSHMoc3ZfMm1vcnRhbChuZXdTVml2KHdpbi0+d19jdXJzb3IuY29sKSkpOworICAgIH0KKyAgICBlbHNlIGlmKGl0ZW1zID09IDMpCisgICAgeworICAgICAgaW50IGxudW0sIGNvbDsKKworICAgICAgaWYgKCF3aW5fdmFsaWQod2luKSkKKwkgIHdpbiA9IGN1cndpbjsKKyAgICAgIGxudW0gPSBTdklWKFNUKDEpKTsKKyAgICAgIGNvbCA9IFN2SVYoU1QoMikpOworICAgICAgd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKyAgICAgIHdpbi0+d19jdXJzb3IuY29sID0gY29sOworICAgICAgY2hlY2tfY3Vyc29yKCk7CQkgICAgLyogcHV0IGN1cnNvciBvbiBhbiBleGlzdGluZyBsaW5lICovCisgICAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CisgICAgfQorCitNT0RVTEUgPSBWSU0JICAgIFBBQ0tBR0UgPSBWSUJVRgorCit2b2lkCitERVNUUk9ZKHZpbWJ1ZikKKyAgICBWSUJVRiB2aW1idWY7CisKKyAgICBDT0RFOgorICAgIGlmIChidWZfdmFsaWQodmltYnVmKSkKKwl2aW1idWYtPnBlcmxfcHJpdmF0ZSA9IDA7CisKK3ZvaWQKK05hbWUodmltYnVmKQorICAgIFZJQlVGIHZpbWJ1ZjsKKworICAgIFBQQ09ERToKKyAgICBpZiAoIWJ1Zl92YWxpZCh2aW1idWYpKQorCXZpbWJ1ZiA9IGN1cmJ1ZjsKKyAgICAvKiBObyBmaWxlIG5hbWUgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgKi8KKyAgICBpZiAodmltYnVmLT5iX2ZuYW1lID09IE5VTEwpCisJWFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZwdigiIiwgMCkpKTsKKyAgICBlbHNlCisJWFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZwdigoY2hhciAqKXZpbWJ1Zi0+Yl9mbmFtZSwgMCkpKTsKKwordm9pZAorTnVtYmVyKHZpbWJ1ZikKKyAgICBWSUJVRiB2aW1idWY7CisKKyAgICBQUENPREU6CisgICAgaWYgKCFidWZfdmFsaWQodmltYnVmKSkKKwl2aW1idWYgPSBjdXJidWY7CisgICAgWFBVU0hzKHN2XzJtb3J0YWwobmV3U1Zpdih2aW1idWYtPmJfZm51bSkpKTsKKwordm9pZAorQ291bnQodmltYnVmKQorICAgIFZJQlVGIHZpbWJ1ZjsKKworICAgIFBQQ09ERToKKyAgICBpZiAoIWJ1Zl92YWxpZCh2aW1idWYpKQorCXZpbWJ1ZiA9IGN1cmJ1ZjsKKyAgICBYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVml2KHZpbWJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KSkpOworCit2b2lkCitHZXQodmltYnVmLCAuLi4pCisgICAgVklCVUYgdmltYnVmOworCisgICAgUFJFSU5JVDoKKyAgICBjaGFyX3UgKmxpbmU7CisgICAgaW50IGk7CisgICAgbG9uZyBsbnVtOworICAgIFBQQ09ERToKKyAgICBpZiAoYnVmX3ZhbGlkKHZpbWJ1ZikpCisgICAgeworCWZvciAoaSA9IDE7IGkgPCBpdGVtczsgaSsrKQorCXsKKwkgICAgbG51bSA9IFN2SVYoU1QoaSkpOworCSAgICBpZiAobG51bSA+IDAgJiYgbG51bSA8PSB2aW1idWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgeworCQlsaW5lID0gbWxfZ2V0X2J1Zih2aW1idWYsIGxudW0sIEZBTFNFKTsKKwkJWFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZwdigoY2hhciAqKWxpbmUsIDApKSk7CisJICAgIH0KKwl9CisgICAgfQorCit2b2lkCitTZXQodmltYnVmLCAuLi4pCisgICAgVklCVUYgdmltYnVmOworCisgICAgUFJFSU5JVDoKKyAgICBpbnQgaTsKKyAgICBsb25nIGxudW07CisgICAgY2hhciAqbGluZTsKKyAgICBidWZfVCAqc2F2ZWJ1ZjsKKyAgICBQUENPREU6CisgICAgaWYgKGJ1Zl92YWxpZCh2aW1idWYpKQorICAgIHsKKwlpZiAoaXRlbXMgPCAzKQorCSAgICBjcm9haygiVXNhZ2U6IFZJQlVGOjpTZXQodmltYnVmLCBsbnVtLCBAbGluZXMpIik7CisKKwlsbnVtID0gU3ZJVihTVCgxKSk7CisJZm9yKGkgPSAyOyBpIDwgaXRlbXM7IGkrKywgbG51bSsrKQorCXsKKwkgICAgbGluZSA9IFN2UFYoU1QoaSksUExfbmEpOworCSAgICBpZiAobG51bSA+IDAgJiYgbG51bSA8PSB2aW1idWYtPmJfbWwubWxfbGluZV9jb3VudCAmJiBsaW5lICE9IE5VTEwpCisJICAgIHsKKwkJc2F2ZWJ1ZiA9IGN1cmJ1ZjsKKwkJY3VyYnVmID0gdmltYnVmOworCQlpZiAodV9zYXZlc3ViKGxudW0pID09IE9LKQorCQl7CisJCSAgICBtbF9yZXBsYWNlKGxudW0sIChjaGFyX3UgKilsaW5lLCBUUlVFKTsKKwkJICAgIGNoYW5nZWRfYnl0ZXMobG51bSwgMCk7CisJCX0KKwkJY3VyYnVmID0gc2F2ZWJ1ZjsKKwkgICAgfQorCX0KKyAgICB9CisKK3ZvaWQKK0RlbGV0ZSh2aW1idWYsIC4uLikKKyAgICBWSUJVRiB2aW1idWY7CisKKyAgICBQUkVJTklUOgorICAgIGxvbmcgaSwgbG51bSA9IDAsIGNvdW50ID0gMDsKKyAgICBidWZfVCAqc2F2ZWJ1ZjsKKyAgICBQUENPREU6CisgICAgaWYgKGJ1Zl92YWxpZCh2aW1idWYpKQorICAgIHsKKwlpZiAoaXRlbXMgPT0gMikKKwl7CisJICAgIGxudW0gPSBTdklWKFNUKDEpKTsKKwkgICAgY291bnQgPSAxOworCX0KKwllbHNlIGlmIChpdGVtcyA9PSAzKQorCXsKKwkgICAgbG51bSA9IFN2SVYoU1QoMSkpOworCSAgICBjb3VudCA9IDEgKyBTdklWKFNUKDIpKSAtIGxudW07CisJICAgIGlmKGNvdW50ID09IDApCisJCWNvdW50ID0gMTsKKwkgICAgaWYoY291bnQgPCAwKQorCSAgICB7CisJCWxudW0gLT0gY291bnQ7CisJCWNvdW50ID0gLWNvdW50OworCSAgICB9CisJfQorCWlmIChpdGVtcyA+PSAyKQorCXsKKwkgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJICAgIHsKKwkJaWYgKGxudW0gPiAwICYmIGxudW0gPD0gdmltYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCXsKKwkJICAgIHNhdmVidWYgPSBjdXJidWY7CisJCSAgICBjdXJidWYgPSB2aW1idWY7CisJCSAgICBpZiAodV9zYXZlZGVsKGxudW0sIDEpID09IE9LKQorCQkgICAgeworCQkJbWxfZGVsZXRlKGxudW0sIDApOworCQkJZGVsZXRlZF9saW5lc19tYXJrKGxudW0sIDFMKTsKKwkJCWlmIChzYXZlYnVmID09IGN1cmJ1ZikKKwkJCSAgICBjaGVja19jdXJzb3IoKTsKKwkJICAgIH0KKwkJICAgIGN1cmJ1ZiA9IHNhdmVidWY7CisJCSAgICB1cGRhdGVfY3VyYnVmKFZBTElEKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKwordm9pZAorQXBwZW5kKHZpbWJ1ZiwgLi4uKQorICAgIFZJQlVGIHZpbWJ1ZjsKKworICAgIFBSRUlOSVQ6CisgICAgaW50CQlpOworICAgIGxvbmcJbG51bTsKKyAgICBjaGFyCSpsaW5lOworICAgIGJ1Zl9UCSpzYXZlYnVmOworICAgIFBQQ09ERToKKyAgICBpZiAoYnVmX3ZhbGlkKHZpbWJ1ZikpCisgICAgeworCWlmIChpdGVtcyA8IDMpCisJICAgIGNyb2FrKCJVc2FnZTogVklCVUY6OkFwcGVuZCh2aW1idWYsIGxudW0sIEBsaW5lcykiKTsKKworCWxudW0gPSBTdklWKFNUKDEpKTsKKwlmb3IgKGkgPSAyOyBpIDwgaXRlbXM7IGkrKywgbG51bSsrKQorCXsKKwkgICAgbGluZSA9IFN2UFYoU1QoaSksUExfbmEpOworCSAgICBpZiAobG51bSA+PSAwICYmIGxudW0gPD0gdmltYnVmLT5iX21sLm1sX2xpbmVfY291bnQgJiYgbGluZSAhPSBOVUxMKQorCSAgICB7CisJCXNhdmVidWYgPSBjdXJidWY7CisJCWN1cmJ1ZiA9IHZpbWJ1ZjsKKwkJaWYgKHVfaW5zc3ViKGxudW0gKyAxKSA9PSBPSykKKwkJeworCQkgICAgbWxfYXBwZW5kKGxudW0sIChjaGFyX3UgKilsaW5lLCAoY29sbnJfVCkwLCBGQUxTRSk7CisJCSAgICBhcHBlbmRlZF9saW5lc19tYXJrKGxudW0sIDFMKTsKKwkJfQorCQljdXJidWYgPSBzYXZlYnVmOworCQl1cGRhdGVfY3VyYnVmKFZBTElEKTsKKwkgICAgfQorCX0KKyAgICB9CisKZGlmZiAtLWdpdCBhL3NyYy9pZl9wZXJsc2Zpby5jIGIvc3JjL2lmX3BlcmxzZmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMWI5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9wZXJsc2Zpby5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKy8qCisgKiBpZl9wZXJsc2Zpby5jOiBTcGVjaWFsIEkvTyBmdW5jdGlvbnMgZm9yIFBlcmwgaW50ZXJmYWNlLgorICovCisKKyNkZWZpbmUgX21lbW9yeV9oCS8qIGF2b2lkIG1lbXNldCByZWRlY2xhcmF0aW9uICovCisjZGVmaW5lIElOX1BFUkxfRklMRQkvKiBkb24ndCBpbmNsdWRlIGlmX3BlcmwucHJvIGZyb20gcHJvdC5oICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmIGRlZmluZWQoVVNFX1NGSU8pIHx8IGRlZmluZWQoUFJPVE8pCisKKyNpZm5kZWYgVVNFX1NGSU8JLyoganVzdCBnZW5lcmF0aW5nIHByb3RvdHlwZXMgKi8KKyMgZGVmaW5lIFNmaW9fdCBpbnQKKyMgZGVmaW5lIFNmZGlzY190IGludAorI2VuZGlmCisKKyNkZWZpbmUgTklMKHR5cGUpCSgodHlwZSkwKQorCisgICAgc3RhdGljIGludAorc2Z2aW13cml0ZShmLCBidWYsIG4sIGRpc2MpCisgICAgU2Zpb190CSAgICAqZjsJCS8qIHN0cmVhbSBpbnZvbHZlZCAqLworICAgIGNoYXIJICAgICpidWY7CS8qIGJ1ZmZlciB0byByZWFkIGZyb20gKi8KKyAgICBpbnQJCSAgICBuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisgICAgU2ZkaXNjX3QJICAgICpkaXNjOwkvKiBkaXNjaXBsaW5lICovCit7CisgICAgY2hhcl91ICpzdHI7CisKKyAgICBzdHIgPSB2aW1fc3RybnNhdmUoKGNoYXJfdSAqKWJ1Ziwgbik7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorCXJldHVybiAwOworICAgIG1zZ19zcGxpdCgoY2hhciAqKXN0cik7CisgICAgdmltX2ZyZWUoc3RyKTsKKworICAgIHJldHVybiBuOworfQorCisvKgorICogc2ZkY25ld252aSAtLQorICogIENyZWF0ZSBWaW0gZGlzY2lwbGluZQorICovCisgICAgU2ZkaXNjX3QgKgorc2ZkY25ld3ZpbSgpCit7CisgICAgU2ZkaXNjX3QJKmRpc2M7CisKKyAgICBkaXNjID0gKFNmZGlzY190ICopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihTZmRpc2NfdCkpOworICAgIGlmIChkaXNjID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBkaXNjLT5yZWFkZiA9IChTZnJlYWRfZilOVUxMOworICAgIGRpc2MtPndyaXRlZiA9IHNmdmltd3JpdGU7CisgICAgZGlzYy0+c2Vla2YgPSAoU2ZzZWVrX2YpTlVMTDsKKyAgICBkaXNjLT5leGNlcHRmID0gKFNmZXhjZXB0X2YpTlVMTDsKKworICAgIHJldHVybiBkaXNjOworfQorCisjZW5kaWYgLyogVVNFX1NGSU8gKi8KZGlmZiAtLWdpdCBhL3NyYy9pZl9weXRob24uYyBiL3NyYy9pZl9weXRob24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM0MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lmX3B5dGhvbi5jCkBAIC0wLDAgKzEsMjgwNyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIFB5dGhvbiBleHRlbnNpb25zIGJ5IFBhdWwgTW9vcmUuCisgKiBDaGFuZ2VzIGZvciBVbml4IGJ5IERhdmlkIExlb25hcmQuCisgKgorICogVGhpcyBjb25zaXN0cyBvZiBmb3VyIHBhcnRzOgorICogMS4gUHl0aG9uIGludGVycHJldGVyIG1haW4gcHJvZ3JhbQorICogMi4gUHl0aG9uIG91dHB1dCBzdHJlYW06IHdyaXRlcyBvdXRwdXQgdmlhIFtlXW1zZygpLgorICogMy4gSW1wbGVtZW50YXRpb24gb2YgdGhlIFZpbSBtb2R1bGUgZm9yIFB5dGhvbgorICogNC4gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBWaW0gYW5kIFB5dGhvbi4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBQeXRob24uaCBkZWZpbmVzIF9QT1NJWF9USFJFQURTIGl0c2VsZiAoaWYgbmVlZGVkKSAqLworI2lmZGVmIF9QT1NJWF9USFJFQURTCisjIHVuZGVmIF9QT1NJWF9USFJFQURTCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkIChIQVZFX0ZDTlRMX0gpCisjIHVuZGVmIEhBVkVfRkNOVExfSAorI2VuZGlmCisKKyNpZmRlZiBfREVCVUcKKyMgdW5kZWYgX0RFQlVHCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1REQVJHX0gKKyMgdW5kZWYgSEFWRV9TVERBUkdfSAkvKiBQeXRob24ncyBjb25maWcuaCBkZWZpbmVzIGl0IGFzIHdlbGwuICovCisjZW5kaWYKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2lmIGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyMgaW5jbHVkZSAibWFjZ2x1ZS5oIgorIyBpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisjZW5kaWYKKyN1bmRlZiBtYWluIC8qIERlZmluZWQgaW4gcHl0aG9uLmggLSBhYXJnaCAqLworI3VuZGVmIEhBVkVfRkNOVExfSCAvKiBDbGFzaCB3aXRoIG9zX3dpbjMyLmggKi8KKworI2lmICFkZWZpbmVkKEZFQVRfUFlUSE9OKSAmJiBkZWZpbmVkKFBST1RPKQorLyogVXNlIHRoaXMgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBwcm90b3R5cGVzIHdpdGhvdXQgcHl0aG9uIGJlaW5nIHVzZWQuICovCisjIGRlZmluZSBQeU9iamVjdCBpbnQKKyMgZGVmaW5lIFB5VGhyZWFkU3RhdGUgaW50CisjIGRlZmluZSBQeVR5cGVPYmplY3QgaW50CitzdHJ1Y3QgUHlNZXRob2REZWYgeyBpbnQgYTsgfTsKKyMgZGVmaW5lIFB5U2VxdWVuY2VNZXRob2RzIGludAorI2VuZGlmCisKKy8qIFBhcnNlciBmbGFncyAqLworI2RlZmluZSBzaW5nbGVfaW5wdXQJMjU2CisjZGVmaW5lIGZpbGVfaW5wdXQJMjU3CisjZGVmaW5lIGV2YWxfaW5wdXQJMjU4CisKKyNpZiBkZWZpbmVkKFBZX1ZFUlNJT05fSEVYKSAmJiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMEYwCisgIC8qIFB5dGhvbiAyLjM6IGNhbiBpbnZva2UgIjpweXRob24iIHJlY3Vyc2l2ZWx5LiAqLworIyBkZWZpbmUgUFlfQ0FOX1JFQ1VSU0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChEWU5BTUlDX1BZVEhPTikgfHwgZGVmaW5lZChQUk9UTykKKyMgaWZuZGVmIERZTkFNSUNfUFlUSE9OCisjICBkZWZpbmUgSElOU1RBTkNFIGludAkJLyogZm9yIGdlbmVyYXRpbmcgcHJvdG90eXBlcyAqLworIyBlbmRpZgorCisvKgorICogV3JhcHBlciBkZWZpbmVzCisgKi8KKyMgZGVmaW5lIFB5QXJnX1BhcnNlIGRsbF9QeUFyZ19QYXJzZQorIyBkZWZpbmUgUHlBcmdfUGFyc2VUdXBsZSBkbGxfUHlBcmdfUGFyc2VUdXBsZQorIyBkZWZpbmUgUHlEaWN0X1NldEl0ZW1TdHJpbmcgZGxsX1B5RGljdF9TZXRJdGVtU3RyaW5nCisjIGRlZmluZSBQeUVycl9CYWRBcmd1bWVudCBkbGxfUHlFcnJfQmFkQXJndW1lbnQKKyMgZGVmaW5lIFB5RXJyX0NsZWFyIGRsbF9QeUVycl9DbGVhcgorIyBkZWZpbmUgUHlFcnJfTm9NZW1vcnkgZGxsX1B5RXJyX05vTWVtb3J5CisjIGRlZmluZSBQeUVycl9PY2N1cnJlZCBkbGxfUHlFcnJfT2NjdXJyZWQKKyMgZGVmaW5lIFB5RXJyX1NldE5vbmUgZGxsX1B5RXJyX1NldE5vbmUKKyMgZGVmaW5lIFB5RXJyX1NldFN0cmluZyBkbGxfUHlFcnJfU2V0U3RyaW5nCisjIGRlZmluZSBQeUV2YWxfSW5pdFRocmVhZHMgZGxsX1B5RXZhbF9Jbml0VGhyZWFkcworIyBkZWZpbmUgUHlFdmFsX1Jlc3RvcmVUaHJlYWQgZGxsX1B5RXZhbF9SZXN0b3JlVGhyZWFkCisjIGRlZmluZSBQeUV2YWxfU2F2ZVRocmVhZCBkbGxfUHlFdmFsX1NhdmVUaHJlYWQKKyMgaWZkZWYgUFlfQ0FOX1JFQ1VSU0UKKyMgIGRlZmluZSBQeUdJTFN0YXRlX0Vuc3VyZSBkbGxfUHlHSUxTdGF0ZV9FbnN1cmUKKyMgIGRlZmluZSBQeUdJTFN0YXRlX1JlbGVhc2UgZGxsX1B5R0lMU3RhdGVfUmVsZWFzZQorIyBlbmRpZgorIyBkZWZpbmUgUHlJbnRfQXNMb25nIGRsbF9QeUludF9Bc0xvbmcKKyMgZGVmaW5lIFB5SW50X0Zyb21Mb25nIGRsbF9QeUludF9Gcm9tTG9uZworIyBkZWZpbmUgUHlJbnRfVHlwZSAoKmRsbF9QeUludF9UeXBlKQorIyBkZWZpbmUgUHlMaXN0X0dldEl0ZW0gZGxsX1B5TGlzdF9HZXRJdGVtCisjIGRlZmluZSBQeUxpc3RfTmV3IGRsbF9QeUxpc3RfTmV3CisjIGRlZmluZSBQeUxpc3RfU2V0SXRlbSBkbGxfUHlMaXN0X1NldEl0ZW0KKyMgZGVmaW5lIFB5TGlzdF9TaXplIGRsbF9QeUxpc3RfU2l6ZQorIyBkZWZpbmUgUHlMaXN0X1R5cGUgKCpkbGxfUHlMaXN0X1R5cGUpCisjIGRlZmluZSBQeUltcG9ydF9JbXBvcnRNb2R1bGUgZGxsX1B5SW1wb3J0X0ltcG9ydE1vZHVsZQorIyBkZWZpbmUgUHlEaWN0X0dldEl0ZW1TdHJpbmcgZGxsX1B5RGljdF9HZXRJdGVtU3RyaW5nCisjIGRlZmluZSBQeU1vZHVsZV9HZXREaWN0IGRsbF9QeU1vZHVsZV9HZXREaWN0CisjIGRlZmluZSBQeVJ1bl9TaW1wbGVTdHJpbmcgZGxsX1B5UnVuX1NpbXBsZVN0cmluZworIyBkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmcgZGxsX1B5U3RyaW5nX0FzU3RyaW5nCisjIGRlZmluZSBQeVN0cmluZ19Gcm9tU3RyaW5nIGRsbF9QeVN0cmluZ19Gcm9tU3RyaW5nCisjIGRlZmluZSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSBkbGxfUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUKKyMgZGVmaW5lIFB5U3RyaW5nX1NpemUgZGxsX1B5U3RyaW5nX1NpemUKKyMgZGVmaW5lIFB5U3RyaW5nX1R5cGUgKCpkbGxfUHlTdHJpbmdfVHlwZSkKKyMgZGVmaW5lIFB5U3lzX1NldE9iamVjdCBkbGxfUHlTeXNfU2V0T2JqZWN0CisjIGRlZmluZSBQeVN5c19TZXRBcmd2IGRsbF9QeVN5c19TZXRBcmd2CisjIGRlZmluZSBQeVR5cGVfVHlwZSAoKmRsbF9QeVR5cGVfVHlwZSkKKyMgZGVmaW5lIFB5X0J1aWxkVmFsdWUgZGxsX1B5X0J1aWxkVmFsdWUKKyMgZGVmaW5lIFB5X0ZpbmRNZXRob2QgZGxsX1B5X0ZpbmRNZXRob2QKKyMgZGVmaW5lIFB5X0luaXRNb2R1bGU0IGRsbF9QeV9Jbml0TW9kdWxlNAorIyBkZWZpbmUgUHlfSW5pdGlhbGl6ZSBkbGxfUHlfSW5pdGlhbGl6ZQorIyBkZWZpbmUgX1B5T2JqZWN0X05ldyBkbGxfX1B5T2JqZWN0X05ldworIyBkZWZpbmUgX1B5X05vbmVTdHJ1Y3QgKCpkbGxfX1B5X05vbmVTdHJ1Y3QpCisjIGRlZmluZSBQeU9iamVjdF9Jbml0IGRsbF9fUHlPYmplY3RfSW5pdAorIyBpZiBkZWZpbmVkKFBZX1ZFUlNJT05fSEVYKSAmJiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDIwMDAwCisjICBkZWZpbmUgUHlUeXBlX0lzU3VidHlwZSBkbGxfUHlUeXBlX0lzU3VidHlwZQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFBZX1ZFUlNJT05fSEVYKSAmJiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwCisjICBkZWZpbmUgUHlPYmplY3RfTWFsbG9jIGRsbF9QeU9iamVjdF9NYWxsb2MKKyMgIGRlZmluZSBQeU9iamVjdF9GcmVlIGRsbF9QeU9iamVjdF9GcmVlCisjIGVuZGlmCisKKy8qCisgKiBQb2ludGVycyBmb3IgZHluYW1pYyBsaW5rCisgKi8KK3N0YXRpYyBpbnQoKmRsbF9QeUFyZ19QYXJzZSkoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOworc3RhdGljIGludCgqZGxsX1B5QXJnX1BhcnNlVHVwbGUpKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKK3N0YXRpYyBpbnQoKmRsbF9QeURpY3RfU2V0SXRlbVN0cmluZykoUHlPYmplY3QgKmRwLCBjaGFyICprZXksIFB5T2JqZWN0ICppdGVtKTsKK3N0YXRpYyBpbnQoKmRsbF9QeUVycl9CYWRBcmd1bWVudCkodm9pZCk7CitzdGF0aWMgdm9pZCgqZGxsX1B5RXJyX0NsZWFyKSh2b2lkKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeUVycl9Ob01lbW9yeSkodm9pZCk7CitzdGF0aWMgUHlPYmplY3QqKCpkbGxfUHlFcnJfT2NjdXJyZWQpKHZvaWQpOworc3RhdGljIHZvaWQoKmRsbF9QeUVycl9TZXROb25lKShQeU9iamVjdCAqKTsKK3N0YXRpYyB2b2lkKCpkbGxfUHlFcnJfU2V0U3RyaW5nKShQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQoKmRsbF9QeUV2YWxfSW5pdFRocmVhZHMpKHZvaWQpOworc3RhdGljIHZvaWQoKmRsbF9QeUV2YWxfUmVzdG9yZVRocmVhZCkoUHlUaHJlYWRTdGF0ZSAqKTsKK3N0YXRpYyBQeVRocmVhZFN0YXRlKigqZGxsX1B5RXZhbF9TYXZlVGhyZWFkKSh2b2lkKTsKKyMgaWZkZWYgUFlfQ0FOX1JFQ1VSU0UKK3N0YXRpYyBQeUdJTFN0YXRlX1NUQVRFCSgqZGxsX1B5R0lMU3RhdGVfRW5zdXJlKSh2b2lkKTsKK3N0YXRpYyB2b2lkICgqZGxsX1B5R0lMU3RhdGVfUmVsZWFzZSkoUHlHSUxTdGF0ZV9TVEFURSk7CisjZW5kaWYKK3N0YXRpYyBsb25nKCpkbGxfUHlJbnRfQXNMb25nKShQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeUludF9Gcm9tTG9uZykobG9uZyk7CitzdGF0aWMgUHlUeXBlT2JqZWN0KiBkbGxfUHlJbnRfVHlwZTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeUxpc3RfR2V0SXRlbSkoUHlPYmplY3QgKiwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeUxpc3RfTmV3KShpbnQgc2l6ZSk7CitzdGF0aWMgaW50KCpkbGxfUHlMaXN0X1NldEl0ZW0pKFB5T2JqZWN0ICosIGludCwgUHlPYmplY3QgKik7CitzdGF0aWMgaW50KCpkbGxfUHlMaXN0X1NpemUpKFB5T2JqZWN0ICopOworc3RhdGljIFB5VHlwZU9iamVjdCogZGxsX1B5TGlzdF9UeXBlOworc3RhdGljIFB5T2JqZWN0KigqZGxsX1B5SW1wb3J0X0ltcG9ydE1vZHVsZSkoY29uc3QgY2hhciAqKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeURpY3RfR2V0SXRlbVN0cmluZykoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeU1vZHVsZV9HZXREaWN0KShQeU9iamVjdCAqKTsKK3N0YXRpYyBpbnQoKmRsbF9QeVJ1bl9TaW1wbGVTdHJpbmcpKGNoYXIgKik7CitzdGF0aWMgY2hhciooKmRsbF9QeVN0cmluZ19Bc1N0cmluZykoUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QqKCpkbGxfUHlTdHJpbmdfRnJvbVN0cmluZykoY29uc3QgY2hhciAqKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSkoY29uc3QgY2hhciAqLCBpbnQpOworc3RhdGljIGludCgqZGxsX1B5U3RyaW5nX1NpemUpKFB5T2JqZWN0ICopOworc3RhdGljIFB5VHlwZU9iamVjdCogZGxsX1B5U3RyaW5nX1R5cGU7CitzdGF0aWMgaW50KCpkbGxfUHlTeXNfU2V0T2JqZWN0KShjaGFyICosIFB5T2JqZWN0ICopOworc3RhdGljIGludCgqZGxsX1B5U3lzX1NldEFyZ3YpKGludCwgY2hhciAqKik7CitzdGF0aWMgUHlUeXBlT2JqZWN0KiBkbGxfUHlUeXBlX1R5cGU7CitzdGF0aWMgUHlPYmplY3QqKCpkbGxfUHlfQnVpbGRWYWx1ZSkoY2hhciAqLCAuLi4pOworc3RhdGljIFB5T2JqZWN0KigqZGxsX1B5X0ZpbmRNZXRob2QpKHN0cnVjdCBQeU1ldGhvZERlZltdLCBQeU9iamVjdCAqLCBjaGFyICopOworc3RhdGljIFB5T2JqZWN0KigqZGxsX1B5X0luaXRNb2R1bGU0KShjaGFyICosIHN0cnVjdCBQeU1ldGhvZERlZiAqLCBjaGFyICosIFB5T2JqZWN0ICosIGludCk7CitzdGF0aWMgdm9pZCgqZGxsX1B5X0luaXRpYWxpemUpKHZvaWQpOworc3RhdGljIFB5T2JqZWN0KigqZGxsX19QeU9iamVjdF9OZXcpKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCooKmRsbF9fUHlPYmplY3RfSW5pdCkoUHlPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0KiBkbGxfX1B5X05vbmVTdHJ1Y3Q7CisjIGlmIGRlZmluZWQoUFlfVkVSU0lPTl9IRVgpICYmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAKK3N0YXRpYyBpbnQgKCpkbGxfUHlUeXBlX0lzU3VidHlwZSkoUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChQWV9WRVJTSU9OX0hFWCkgJiYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMAorc3RhdGljIHZvaWQqICgqZGxsX1B5T2JqZWN0X01hbGxvYykoc2l6ZV90KTsKK3N0YXRpYyB2b2lkICgqZGxsX1B5T2JqZWN0X0ZyZWUpKHZvaWQqKTsKKyMgZW5kaWYKKworc3RhdGljIEhJTlNUQU5DRSBoaW5zdFB5dGhvbiA9IDA7IC8qIEluc3RhbmNlIG9mIHB5dGhvbi5kbGwgKi8KKworLyogSW1wb3J0ZWQgZXhjZXB0aW9uIG9iamVjdHMgKi8KK3N0YXRpYyBQeU9iamVjdCAqaW1wX1B5RXhjX0F0dHJpYnV0ZUVycm9yOworc3RhdGljIFB5T2JqZWN0ICppbXBfUHlFeGNfSW5kZXhFcnJvcjsKK3N0YXRpYyBQeU9iamVjdCAqaW1wX1B5RXhjX0tleWJvYXJkSW50ZXJydXB0Oworc3RhdGljIFB5T2JqZWN0ICppbXBfUHlFeGNfVHlwZUVycm9yOworc3RhdGljIFB5T2JqZWN0ICppbXBfUHlFeGNfVmFsdWVFcnJvcjsKKworIyBkZWZpbmUgUHlFeGNfQXR0cmlidXRlRXJyb3IgaW1wX1B5RXhjX0F0dHJpYnV0ZUVycm9yCisjIGRlZmluZSBQeUV4Y19JbmRleEVycm9yIGltcF9QeUV4Y19JbmRleEVycm9yCisjIGRlZmluZSBQeUV4Y19LZXlib2FyZEludGVycnVwdCBpbXBfUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQKKyMgZGVmaW5lIFB5RXhjX1R5cGVFcnJvciBpbXBfUHlFeGNfVHlwZUVycm9yCisjIGRlZmluZSBQeUV4Y19WYWx1ZUVycm9yIGltcF9QeUV4Y19WYWx1ZUVycm9yCisKKy8qCisgKiBUYWJsZSBvZiBuYW1lIHRvIGZ1bmN0aW9uIHBvaW50ZXIgb2YgcHl0aG9uLgorICovCisjIGRlZmluZSBQWVRIT05fUFJPQyBGQVJQUk9DCitzdGF0aWMgc3RydWN0Cit7CisgICAgY2hhciAqbmFtZTsKKyAgICBQWVRIT05fUFJPQyAqcHRyOworfSBweXRob25fZnVuY25hbWVfdGFibGVbXSA9Cit7CisgICAgeyJQeUFyZ19QYXJzZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUFyZ19QYXJzZX0sCisgICAgeyJQeUFyZ19QYXJzZVR1cGxlIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5QXJnX1BhcnNlVHVwbGV9LAorICAgIHsiUHlEaWN0X1NldEl0ZW1TdHJpbmciLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlEaWN0X1NldEl0ZW1TdHJpbmd9LAorICAgIHsiUHlFcnJfQmFkQXJndW1lbnQiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlFcnJfQmFkQXJndW1lbnR9LAorICAgIHsiUHlFcnJfQ2xlYXIiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlFcnJfQ2xlYXJ9LAorICAgIHsiUHlFcnJfTm9NZW1vcnkiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlFcnJfTm9NZW1vcnl9LAorICAgIHsiUHlFcnJfT2NjdXJyZWQiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlFcnJfT2NjdXJyZWR9LAorICAgIHsiUHlFcnJfU2V0Tm9uZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUVycl9TZXROb25lfSwKKyAgICB7IlB5RXJyX1NldFN0cmluZyIsIChQWVRIT05fUFJPQyopJmRsbF9QeUVycl9TZXRTdHJpbmd9LAorICAgIHsiUHlFdmFsX0luaXRUaHJlYWRzIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5RXZhbF9Jbml0VGhyZWFkc30sCisgICAgeyJQeUV2YWxfUmVzdG9yZVRocmVhZCIsIChQWVRIT05fUFJPQyopJmRsbF9QeUV2YWxfUmVzdG9yZVRocmVhZH0sCisgICAgeyJQeUV2YWxfU2F2ZVRocmVhZCIsIChQWVRIT05fUFJPQyopJmRsbF9QeUV2YWxfU2F2ZVRocmVhZH0sCisjIGlmZGVmIFBZX0NBTl9SRUNVUlNFCisgICAgeyJQeUdJTFN0YXRlX0Vuc3VyZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUdJTFN0YXRlX0Vuc3VyZX0sCisgICAgeyJQeUdJTFN0YXRlX1JlbGVhc2UiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlHSUxTdGF0ZV9SZWxlYXNlfSwKKyMgZW5kaWYKKyAgICB7IlB5SW50X0FzTG9uZyIsIChQWVRIT05fUFJPQyopJmRsbF9QeUludF9Bc0xvbmd9LAorICAgIHsiUHlJbnRfRnJvbUxvbmciLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlJbnRfRnJvbUxvbmd9LAorICAgIHsiUHlJbnRfVHlwZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUludF9UeXBlfSwKKyAgICB7IlB5TGlzdF9HZXRJdGVtIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5TGlzdF9HZXRJdGVtfSwKKyAgICB7IlB5TGlzdF9OZXciLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlMaXN0X05ld30sCisgICAgeyJQeUxpc3RfU2V0SXRlbSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUxpc3RfU2V0SXRlbX0sCisgICAgeyJQeUxpc3RfU2l6ZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUxpc3RfU2l6ZX0sCisgICAgeyJQeUxpc3RfVHlwZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeUxpc3RfVHlwZX0sCisgICAgeyJQeUltcG9ydF9JbXBvcnRNb2R1bGUiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlJbXBvcnRfSW1wb3J0TW9kdWxlfSwKKyAgICB7IlB5RGljdF9HZXRJdGVtU3RyaW5nIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5RGljdF9HZXRJdGVtU3RyaW5nfSwKKyAgICB7IlB5TW9kdWxlX0dldERpY3QiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlNb2R1bGVfR2V0RGljdH0sCisgICAgeyJQeVJ1bl9TaW1wbGVTdHJpbmciLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlSdW5fU2ltcGxlU3RyaW5nfSwKKyAgICB7IlB5U3RyaW5nX0FzU3RyaW5nIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5U3RyaW5nX0FzU3RyaW5nfSwKKyAgICB7IlB5U3RyaW5nX0Zyb21TdHJpbmciLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlTdHJpbmdfRnJvbVN0cmluZ30sCisgICAgeyJQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZX0sCisgICAgeyJQeVN0cmluZ19TaXplIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5U3RyaW5nX1NpemV9LAorICAgIHsiUHlTdHJpbmdfVHlwZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeVN0cmluZ19UeXBlfSwKKyAgICB7IlB5U3lzX1NldE9iamVjdCIsIChQWVRIT05fUFJPQyopJmRsbF9QeVN5c19TZXRPYmplY3R9LAorICAgIHsiUHlTeXNfU2V0QXJndiIsIChQWVRIT05fUFJPQyopJmRsbF9QeVN5c19TZXRBcmd2fSwKKyAgICB7IlB5VHlwZV9UeXBlIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5VHlwZV9UeXBlfSwKKyAgICB7IlB5X0J1aWxkVmFsdWUiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlfQnVpbGRWYWx1ZX0sCisgICAgeyJQeV9GaW5kTWV0aG9kIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5X0ZpbmRNZXRob2R9LAorICAgIHsiUHlfSW5pdE1vZHVsZTQiLCAoUFlUSE9OX1BST0MqKSZkbGxfUHlfSW5pdE1vZHVsZTR9LAorICAgIHsiUHlfSW5pdGlhbGl6ZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeV9Jbml0aWFsaXplfSwKKyAgICB7Il9QeU9iamVjdF9OZXciLCAoUFlUSE9OX1BST0MqKSZkbGxfX1B5T2JqZWN0X05ld30sCisgICAgeyJQeU9iamVjdF9Jbml0IiwgKFBZVEhPTl9QUk9DKikmZGxsX19QeU9iamVjdF9Jbml0fSwKKyAgICB7Il9QeV9Ob25lU3RydWN0IiwgKFBZVEhPTl9QUk9DKikmZGxsX19QeV9Ob25lU3RydWN0fSwKKyMgaWYgZGVmaW5lZChQWV9WRVJTSU9OX0hFWCkgJiYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorICAgIHsiUHlUeXBlX0lzU3VidHlwZSIsIChQWVRIT05fUFJPQyopJmRsbF9QeVR5cGVfSXNTdWJ0eXBlfSwKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChQWV9WRVJTSU9OX0hFWCkgJiYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMAorICAgIHsiUHlPYmplY3RfTWFsbG9jIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5T2JqZWN0X01hbGxvY30sCisgICAgeyJQeU9iamVjdF9GcmVlIiwgKFBZVEhPTl9QUk9DKikmZGxsX1B5T2JqZWN0X0ZyZWV9LAorIyBlbmRpZgorICAgIHsiIiwgTlVMTH0sCit9OworCisvKgorICogRnJlZSBweXRob24uZGxsCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZW5kX2R5bmFtaWNfcHl0aG9uKHZvaWQpCit7CisgICAgaWYgKGhpbnN0UHl0aG9uKQorICAgIHsKKwlGcmVlTGlicmFyeShoaW5zdFB5dGhvbik7CisJaGluc3RQeXRob24gPSAwOworICAgIH0KK30KKworLyoKKyAqIExvYWQgbGlicmFyeSBhbmQgZ2V0IGFsbCBwb2ludGVycy4KKyAqIFBhcmFtZXRlciAnbGlibmFtZScgcHJvdmlkZXMgbmFtZSBvZiBETEwuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3B5dGhvbl9ydW50aW1lX2xpbmtfaW5pdChjaGFyICpsaWJuYW1lLCBpbnQgdmVyYm9zZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChoaW5zdFB5dGhvbikKKwlyZXR1cm4gT0s7CisgICAgaGluc3RQeXRob24gPSBMb2FkTGlicmFyeShsaWJuYW1lKTsKKyAgICBpZiAoIWhpbnN0UHl0aG9uKQorICAgIHsKKwlpZiAodmVyYm9zZSkKKwkgICAgRU1TRzIoXyhlX2xvYWRsaWIpLCBsaWJuYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBweXRob25fZnVuY25hbWVfdGFibGVbaV0ucHRyOyArK2kpCisgICAgeworCWlmICgoKnB5dGhvbl9mdW5jbmFtZV90YWJsZVtpXS5wdHIgPSBHZXRQcm9jQWRkcmVzcyhoaW5zdFB5dGhvbiwKKwkJCXB5dGhvbl9mdW5jbmFtZV90YWJsZVtpXS5uYW1lKSkgPT0gTlVMTCkKKwl7CisJICAgIEZyZWVMaWJyYXJ5KGhpbnN0UHl0aG9uKTsKKwkgICAgaGluc3RQeXRob24gPSAwOworCSAgICBpZiAodmVyYm9zZSkKKwkJRU1TRzIoXyhlX2xvYWRmdW5jKSwgcHl0aG9uX2Z1bmNuYW1lX3RhYmxlW2ldLm5hbWUpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIElmIHB5dGhvbiBpcyBlbmFibGVkICh0aGVyZSBpcyBpbnN0YWxsZWQgcHl0aG9uIG9uIFdpbmRvd3Mgc3lzdGVtKSByZXR1cm4KKyAqIFRSVUUsIGVsc2UgRkFMU0UuCisgKi8KKyAgICBpbnQKK3B5dGhvbl9lbmFibGVkKHZlcmJvc2UpCisgICAgaW50CQl2ZXJib3NlOworeworICAgIHJldHVybiBweXRob25fcnVudGltZV9saW5rX2luaXQoRFlOQU1JQ19QWVRIT05fRExMLCB2ZXJib3NlKSA9PSBPSzsKK30KKworLyogTG9hZCB0aGUgc3RhbmRhcmQgUHl0aG9uIGV4Y2VwdGlvbnMgLSBkb24ndCBpbXBvcnQgdGhlIHN5bWJvbHMgZnJvbSB0aGUKKyAqIERMTCwgYXMgdGhpcyBjYW4gY2F1c2UgZXJyb3JzIChpbXBvcnRpbmcgZGF0YSBzeW1ib2xzIGlzIG5vdCByZWxpYWJsZSkuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9leGNlcHRpb25zIF9fQVJHUygodm9pZCkpOworCisgICAgc3RhdGljIHZvaWQKK2dldF9leGNlcHRpb25zKCkKK3sKKyAgICBQeU9iamVjdCAqZXhtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImV4Y2VwdGlvbnMiKTsKKyAgICBQeU9iamVjdCAqZXhkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChleG1vZCk7CisgICAgaW1wX1B5RXhjX0F0dHJpYnV0ZUVycm9yID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZXhkaWN0LCAiQXR0cmlidXRlRXJyb3IiKTsKKyAgICBpbXBfUHlFeGNfSW5kZXhFcnJvciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGV4ZGljdCwgIkluZGV4RXJyb3IiKTsKKyAgICBpbXBfUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhleGRpY3QsICJLZXlib2FyZEludGVycnVwdCIpOworICAgIGltcF9QeUV4Y19UeXBlRXJyb3IgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhleGRpY3QsICJUeXBlRXJyb3IiKTsKKyAgICBpbXBfUHlFeGNfVmFsdWVFcnJvciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGV4ZGljdCwgIlZhbHVlRXJyb3IiKTsKKyAgICBQeV9YSU5DUkVGKGltcF9QeUV4Y19BdHRyaWJ1dGVFcnJvcik7CisgICAgUHlfWElOQ1JFRihpbXBfUHlFeGNfSW5kZXhFcnJvcik7CisgICAgUHlfWElOQ1JFRihpbXBfUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOworICAgIFB5X1hJTkNSRUYoaW1wX1B5RXhjX1R5cGVFcnJvcik7CisgICAgUHlfWElOQ1JFRihpbXBfUHlFeGNfVmFsdWVFcnJvcik7CisgICAgUHlfWERFQ1JFRihleG1vZCk7Cit9CisjZW5kaWYgLyogRFlOQU1JQ19QWVRIT04gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworCitzdGF0aWMgdm9pZCBEb1B5dGhvbkNvbW1hbmQoZXhhcmdfVCAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBSYW5nZVN0YXJ0Oworc3RhdGljIGludCBSYW5nZUVuZDsKKworc3RhdGljIHZvaWQgUHl0aG9uSU9fRmx1c2godm9pZCk7CitzdGF0aWMgaW50IFB5dGhvbklPX0luaXQodm9pZCk7CitzdGF0aWMgaW50IFB5dGhvbk1vZF9Jbml0KHZvaWQpOworCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIHZpbS9weXRob24gaW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqR2V0QnVmZmVyTGluZShidWZfVCAqLCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpHZXRCdWZmZXJMaW5lTGlzdChidWZfVCAqLCBpbnQsIGludCk7CisKK3N0YXRpYyBpbnQgU2V0QnVmZmVyTGluZShidWZfVCAqLCBpbnQsIFB5T2JqZWN0ICosIGludCAqKTsKK3N0YXRpYyBpbnQgU2V0QnVmZmVyTGluZUxpc3QoYnVmX1QgKiwgaW50LCBpbnQsIFB5T2JqZWN0ICosIGludCAqKTsKK3N0YXRpYyBpbnQgSW5zZXJ0QnVmZmVyTGluZXMoYnVmX1QgKiwgaW50LCBQeU9iamVjdCAqLCBpbnQgKik7CisKK3N0YXRpYyBQeU9iamVjdCAqTGluZVRvU3RyaW5nKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgY2hhciAqU3RyaW5nVG9MaW5lKFB5T2JqZWN0ICopOworCitzdGF0aWMgaW50IFZpbUVycm9yQ2hlY2sodm9pZCk7CisKKyNkZWZpbmUgUHlFcnJfU2V0VmltKHN0cikgUHlFcnJfU2V0U3RyaW5nKFZpbUVycm9yLCBzdHIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDEuIFB5dGhvbiBpbnRlcnByZXRlciBtYWluIHByb2dyYW0uCisgKi8KKworc3RhdGljIGludCBpbml0aWFsaXNlZCA9IDA7CisKKyNpZiBQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDA3IC8qIFB5dGhvbiAxLjQgKi8KK3R5cGVkZWYgUHlPYmplY3QgUHlUaHJlYWRTdGF0ZTsKKyNlbmRpZiAvKiBQeXRob24gMS40ICovCisKKyNpZm5kZWYgUFlfQ0FOX1JFQ1VSU0UKK3N0YXRpYyBQeVRocmVhZFN0YXRlKiBzYXZlZF9weXRob25fdGhyZWFkID0gTlVMTDsKKworLyoKKyAqIFN1c3BlbmQgYSB0aHJlYWQgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgb3RoZXIgdGhyZWFkcyBhcmUgYWxsb3dlZCB0bworICogcnVuLgorICovCitzdGF0aWMgdm9pZCBQeXRob25fU2F2ZVRocmVhZCh2b2lkKQoreworICAgIHNhdmVkX3B5dGhvbl90aHJlYWQgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworfQorCisvKgorICogUmVzdG9yZSBhIHRocmVhZCBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3YWl0cyBmb3Igb3RoZXIgdGhyZWFkcyB0bworICogYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIFB5dGhvbl9SZXN0b3JlVGhyZWFkKHZvaWQpCit7CisgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoc2F2ZWRfcHl0aG9uX3RocmVhZCk7CisgICAgc2F2ZWRfcHl0aG9uX3RocmVhZCA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIG9idGFpbiBhIGxvY2sgb24gdGhlIFZpbSBkYXRhIHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHZvaWQgUHl0aG9uX0xvY2tfVmltKHZvaWQpCit7Cit9CisKKy8qCisgKiByZWxlYXNlIGEgbG9jayBvbiB0aGUgVmltIGRhdGEgc3RydWN0dXJlcworICovCitzdGF0aWMgdm9pZCBQeXRob25fUmVsZWFzZV9WaW0odm9pZCkKK3sKK30KKworICAgIHZvaWQKK3B5dGhvbl9lbmQoKQoreworI2lmZGVmIERZTkFNSUNfUFlUSE9OCisgICAgZW5kX2R5bmFtaWNfcHl0aG9uKCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyBpbnQKK1B5dGhvbl9Jbml0KHZvaWQpCit7CisgICAgaWYgKCFpbml0aWFsaXNlZCkKKyAgICB7CisjaWZkZWYgRFlOQU1JQ19QWVRIT04KKwlpZiAoIXB5dGhvbl9lbmFibGVkKFRSVUUpKQorCXsKKwkgICAgRU1TRyhfKCJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iKSk7CisJICAgIGdvdG8gZmFpbDsKKwl9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKwlQeV9Jbml0aWFsaXplKCk7CisjZWxzZQorCVB5TWFjX0luaXRpYWxpemUoKTsKKyNlbmRpZgorCS8qIGluaXRpYWxpc2UgdGhyZWFkcyAqLworCVB5RXZhbF9Jbml0VGhyZWFkcygpOworCisjaWZkZWYgRFlOQU1JQ19QWVRIT04KKwlnZXRfZXhjZXB0aW9ucygpOworI2VuZGlmCisKKwlpZiAoUHl0aG9uSU9fSW5pdCgpKQorCSAgICBnb3RvIGZhaWw7CisKKwlpZiAoUHl0aG9uTW9kX0luaXQoKSkKKwkgICAgZ290byBmYWlsOworCisjaWZuZGVmIFBZX0NBTl9SRUNVUlNFCisJLyogdGhlIGZpcnN0IHB5dGhvbiB0aHJlYWQgaXMgdmltJ3MgKi8KKwlQeXRob25fU2F2ZVRocmVhZCgpOworI2VuZGlmCisKKwlpbml0aWFsaXNlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgLyogV2UgY2FsbCBQeXRob25JT19GbHVzaCgpIGhlcmUgdG8gcHJpbnQgYW55IFB5dGhvbiBlcnJvcnMuCisgICAgICogVGhpcyBpcyBPSywgYXMgaXQgaXMgcG9zc2libGUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV2ZW4KKyAgICAgKiBpZiBQeXRob25JT19Jbml0KCkgaGFzIG5vdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IChpdCB3aWxsCisgICAgICogbm90IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZSkuCisgICAgICovCisgICAgUHl0aG9uSU9fRmx1c2goKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBFeHRlcm5hbCBpbnRlcmZhY2UKKyAqLworICAgIHN0YXRpYyB2b2lkCitEb1B5dGhvbkNvbW1hbmQoZXhhcmdfVCAqZWFwLCBjb25zdCBjaGFyICpjbWQpCit7CisjaWZkZWYgUFlfQ0FOX1JFQ1VSU0UKKyAgICBQeUdJTFN0YXRlX1NUQVRFCXB5Z2lsc3RhdGU7CisjZWxzZQorICAgIHN0YXRpYyBpbnQJCXJlY3Vyc2l2ZSA9IDA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1BQ09TKSAmJiAhZGVmaW5lZChNQUNPU19YX1VOSVgpCisgICAgR3JhZlB0cgkJb2xkUG9ydDsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkKKyAgICBjaGFyCQkqc2F2ZWRfbG9jYWxlOworI2VuZGlmCisKKyNpZm5kZWYgUFlfQ0FOX1JFQ1VSU0UKKyAgICBpZiAocmVjdXJzaXZlKQorICAgIHsKKwlFTVNHKF8oIkU2NTk6IENhbm5vdCBpbnZva2UgUHl0aG9uIHJlY3Vyc2l2ZWx5IikpOworCXJldHVybjsKKyAgICB9CisgICAgKytyZWN1cnNpdmU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyAgICBHZXRQb3J0KCZvbGRQb3J0KTsKKyAgICAvKiBDaGVjayBpZiB0aGUgUHl0aG9uIGxpYnJhcnkgaXMgYXZhaWxhYmxlICovCisgICAgaWYgKChQdHIpUHlNYWNfSW5pdGlhbGl6ZSA9PSAoUHRyKWtVbnJlc29sdmVkQ0ZyYWdTeW1ib2xBZGRyZXNzKQorCWdvdG8gdGhlZW5kOworI2VuZGlmCisgICAgaWYgKFB5dGhvbl9Jbml0KCkpCisJZ290byB0aGVlbmQ7CisKKyAgICBSYW5nZVN0YXJ0ID0gZWFwLT5saW5lMTsKKyAgICBSYW5nZUVuZCA9IGVhcC0+bGluZTI7CisgICAgUHl0aG9uX1JlbGVhc2VfVmltKCk7CSAgICAvKiBsZWF2ZSB2aW0gKi8KKworI2lmIGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkKKyAgICAvKiBQeXRob24gb25seSB3b3JrcyBwcm9wZXJseSB3aGVuIHRoZSBMQ19OVU1FUklDIGxvY2FsZSBpcyAiQyIuICovCisgICAgc2F2ZWRfbG9jYWxlID0gc2V0bG9jYWxlKExDX05VTUVSSUMsIE5VTEwpOworICAgIGlmIChzYXZlZF9sb2NhbGUgPT0gTlVMTCB8fCBTVFJDTVAoc2F2ZWRfbG9jYWxlLCAiQyIpID09IDApCisJc2F2ZWRfbG9jYWxlID0gTlVMTDsKKyAgICBlbHNlCisgICAgeworCS8qIE5lZWQgdG8gbWFrZSBhIGNvcHksIHZhbHVlIG1heSBjaGFuZ2Ugd2hlbiBzZXR0aW5nIG5ldyBsb2NhbGUuICovCisJc2F2ZWRfbG9jYWxlID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopc2F2ZWRfbG9jYWxlKTsKKwkodm9pZClzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFBZX0NBTl9SRUNVUlNFCisgICAgcHlnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisjZWxzZQorICAgIFB5dGhvbl9SZXN0b3JlVGhyZWFkKCk7CSAgICAvKiBlbnRlciBweXRob24gKi8KKyNlbmRpZgorCisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKChjaGFyICopKGNtZCkpOworCisjaWZkZWYgUFlfQ0FOX1JFQ1VSU0UKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UocHlnaWxzdGF0ZSk7CisjZWxzZQorICAgIFB5dGhvbl9TYXZlVGhyZWFkKCk7CSAgICAvKiBsZWF2ZSBweXRob24gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX0xPQ0FMRV9IKSB8fCBkZWZpbmVkKFhfTE9DQUxFKQorICAgIGlmIChzYXZlZF9sb2NhbGUgIT0gTlVMTCkKKyAgICB7CisJKHZvaWQpc2V0bG9jYWxlKExDX05VTUVSSUMsIHNhdmVkX2xvY2FsZSk7CisJdmltX2ZyZWUoc2F2ZWRfbG9jYWxlKTsKKyAgICB9CisjZW5kaWYKKworICAgIFB5dGhvbl9Mb2NrX1ZpbSgpOwkJICAgIC8qIGVudGVyIHZpbSAqLworICAgIFB5dGhvbklPX0ZsdXNoKCk7CisjaWYgZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoTUFDT1NfWF9VTklYKQorICAgIFNldFBvcnQob2xkUG9ydCk7CisjZW5kaWYKKwordGhlZW5kOgorI2lmbmRlZiBQWV9DQU5fUkVDVVJTRQorICAgIC0tcmVjdXJzaXZlOworI2VuZGlmCisgICAgcmV0dXJuOwkgICAgLyoga2VlcHMgbGludCBoYXBweSAqLworfQorCisvKgorICogIjpweXRob24iCisgKi8KKyAgICB2b2lkCitleF9weXRob24oZXhhcmdfVCAqZWFwKQoreworICAgIGNoYXJfdSAqc2NyaXB0OworCisgICAgc2NyaXB0ID0gc2NyaXB0X2dldChlYXAsIGVhcC0+YXJnKTsKKyAgICBpZiAoIWVhcC0+c2tpcCkKKyAgICB7CisJaWYgKHNjcmlwdCA9PSBOVUxMKQorCSAgICBEb1B5dGhvbkNvbW1hbmQoZWFwLCAoY2hhciAqKWVhcC0+YXJnKTsKKwllbHNlCisJICAgIERvUHl0aG9uQ29tbWFuZChlYXAsIChjaGFyICopc2NyaXB0KTsKKyAgICB9CisgICAgdmltX2ZyZWUoc2NyaXB0KTsKK30KKworI2RlZmluZSBCVUZGRVJfU0laRSAxMDI0CisKKy8qCisgKiAiOnB5ZmlsZSIKKyAqLworICAgIHZvaWQKK2V4X3B5ZmlsZShleGFyZ19UICplYXApCit7CisgICAgc3RhdGljIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBjb25zdCBjaGFyICpmaWxlID0gKGNoYXIgKillYXAtPmFyZzsKKyAgICBjaGFyICpwOworCisgICAgLyogSGF2ZSB0byBkbyBpdCBsaWtlIHRoaXMuIFB5UnVuX1NpbXBsZUZpbGUgcmVxdWlyZXMgeW91IHRvIHBhc3MgYQorICAgICAqIHN0ZGlvIGZpbGUgcG9pbnRlciwgYnV0IFZpbSBhbmQgdGhlIFB5dGhvbiBETEwgYXJlIGNvbXBpbGVkIHdpdGgKKyAgICAgKiBkaWZmZXJlbnQgb3B0aW9ucyB1bmRlciBXaW5kb3dzLCBtZWFuaW5nIHRoYXQgc3RkaW8gcG9pbnRlcnMgYXJlbid0CisgICAgICogY29tcGF0aWJsZSBiZXR3ZWVuIHRoZSB0d28uIFl1ay4KKyAgICAgKgorICAgICAqIFB1dCB0aGUgc3RyaW5nICJleGVjZmlsZSgnZmlsZScpIiBpbnRvIGJ1ZmZlci4gQnV0LCB3ZSBuZWVkIHRvCisgICAgICogZXNjYXBlIGFueSBiYWNrc2xhc2hlcyBvciBzaW5nbGUgcXVvdGVzIGluIHRoZSBmaWxlIG5hbWUsIHNvIHRoYXQKKyAgICAgKiBQeXRob24gd29uJ3QgbWFuZ2xlIHRoZSBmaWxlIG5hbWUuCisgICAgICovCisgICAgc3RyY3B5KGJ1ZmZlciwgImV4ZWNmaWxlKCciKTsKKyAgICBwID0gYnVmZmVyICsgMTA7IC8qIHNpemUgb2YgImV4ZWNmaWxlKCciICovCisKKyAgICB3aGlsZSAoKmZpbGUgJiYgcCA8IGJ1ZmZlciArIChCVUZGRVJfU0laRSAtIDMpKQorICAgIHsKKwlpZiAoKmZpbGUgPT0gJ1xcJyB8fCAqZmlsZSA9PSAnXCcnKQorCSAgICAqcCsrID0gJ1xcJzsKKwkqcCsrID0gKmZpbGUrKzsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluaXNoIHRoZSBmaWxlIG5hbWUsIHdlIGhpdCBhIGJ1ZmZlciBvdmVyZmxvdyAqLworICAgIGlmICgqZmlsZSAhPSAnXDAnKQorCXJldHVybjsKKworICAgIC8qIFB1dCBpbiB0aGUgdGVybWluYXRpbmcgIicpIiBhbmQgYSBudWxsICovCisgICAgKnArKyA9ICdcJyc7CisgICAgKnArKyA9ICcpJzsKKyAgICAqcCsrID0gJ1wwJzsKKworICAgIC8qIEV4ZWN1dGUgdGhlIGZpbGUgKi8KKyAgICBEb1B5dGhvbkNvbW1hbmQoZWFwLCBidWZmZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAyLiBQeXRob24gb3V0cHV0IHN0cmVhbTogd3JpdGVzIG91dHB1dCB2aWEgW2VdbXNnKCkuCisgKi8KKworLyogSW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCisgKi8KKworc3RhdGljIFB5T2JqZWN0ICpPdXRwdXRHZXRhdHRyKFB5T2JqZWN0ICosIGNoYXIgKik7CitzdGF0aWMgaW50IE91dHB1dFNldGF0dHIoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKTsKKworc3RhdGljIFB5T2JqZWN0ICpPdXRwdXRXcml0ZShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqT3V0cHV0V3JpdGVsaW5lcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwordHlwZWRlZiB2b2lkICgqd3JpdGVmbikoY2hhcl91ICopOworc3RhdGljIHZvaWQgd3JpdGVyKHdyaXRlZm4gZm4sIGNoYXJfdSAqc3RyLCBpbnQgbik7CisKKy8qIE91dHB1dCBvYmplY3QgZGVmaW5pdGlvbgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgc29mdHNwYWNlOworICAgIGxvbmcgZXJyb3I7Cit9IE91dHB1dE9iamVjdDsKKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBPdXRwdXRNZXRob2RzW10gPSB7CisgICAgLyogbmFtZSwJICAgIGZ1bmN0aW9uLAkJY2FsbGluZywgICAgZG9jdW1lbnRhdGlvbiAqLworICAgIHsid3JpdGUiLAkgICAgT3V0cHV0V3JpdGUsCTEsCSAgICAiIiB9LAorICAgIHsid3JpdGVsaW5lcyIsICBPdXRwdXRXcml0ZWxpbmVzLAkxLAkgICAgIiIgfSwKKyAgICB7IE5VTEwsCSAgICBOVUxMLAkJMCwJICAgIE5VTEwgfQorfTsKKworc3RhdGljIFB5VHlwZU9iamVjdCBPdXRwdXRUeXBlID0geworCVB5T2JqZWN0X0hFQURfSU5JVCgwKQorCTAsCisJIm1lc3NhZ2UiLAorCXNpemVvZihPdXRwdXRPYmplY3QpLAorCTAsCisKKwkoZGVzdHJ1Y3RvcikgMCwKKwkocHJpbnRmdW5jKSAwLAorCShnZXRhdHRyZnVuYykgT3V0cHV0R2V0YXR0ciwKKwkoc2V0YXR0cmZ1bmMpIE91dHB1dFNldGF0dHIsCisJKGNtcGZ1bmMpIDAsCisJKHJlcHJmdW5jKSAwLAorCisJMCwgLyogYXMgbnVtYmVyICovCisJMCwgLyogYXMgc2VxdWVuY2UgKi8KKwkwLCAvKiBhcyBtYXBwaW5nICovCisKKwkoaGFzaGZ1bmMpIDAsCisJKHRlcm5hcnlmdW5jKSAwLAorCShyZXByZnVuYykgMAorfTsKKworLyoqKioqKioqKioqKiovCisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorT3V0cHV0R2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAoc3RyY21wKG5hbWUsICJzb2Z0c3BhY2UiKSA9PSAwKQorCXJldHVybiBQeUludF9Gcm9tTG9uZygoKE91dHB1dE9iamVjdCAqKShzZWxmKSktPnNvZnRzcGFjZSk7CisKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChPdXRwdXRNZXRob2RzLCBzZWxmLCBuYW1lKTsKK30KKworICAgIHN0YXRpYyBpbnQKK091dHB1dFNldGF0dHIoUHlPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2YWwpCit7CisgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBfKCJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiKSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzdHJjbXAobmFtZSwgInNvZnRzcGFjZSIpID09IDApCisgICAgeworCWlmICghUHlJbnRfQ2hlY2sodmFsKSkgeworCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBfKCJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIikpOworCSAgICByZXR1cm4gLTE7CisJfQorCisJKChPdXRwdXRPYmplY3QgKikoc2VsZikpLT5zb2Z0c3BhY2UgPSBQeUludF9Bc0xvbmcodmFsKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIF8oImludmFsaWQgYXR0cmlidXRlIikpOworICAgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKiovCisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorT3V0cHV0V3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCBsZW47CisgICAgY2hhciAqc3RyOworICAgIGludCBlcnJvciA9ICgoT3V0cHV0T2JqZWN0ICopKHNlbGYpKS0+ZXJyb3I7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJnN0ciwgJmxlbikpCisJcmV0dXJuIE5VTEw7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHl0aG9uX0xvY2tfVmltKCk7CisgICAgd3JpdGVyKCh3cml0ZWZuKShlcnJvciA/IGVtc2cgOiBtc2cpLCAoY2hhcl91ICopc3RyLCBsZW4pOworICAgIFB5dGhvbl9SZWxlYXNlX1ZpbSgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorT3V0cHV0V3JpdGVsaW5lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IG47CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IGVycm9yID0gKChPdXRwdXRPYmplY3QgKikoc2VsZikpLT5lcnJvcjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZsaXN0KSkKKwlyZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYobGlzdCk7CisKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgeworCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIF8oIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiKSk7CisJUHlfREVDUkVGKGxpc3QpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIG4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisgICAgeworCVB5T2JqZWN0ICpsaW5lID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisJY2hhciAqc3RyOworCWludCBsZW47CisKKwlpZiAoIVB5QXJnX1BhcnNlKGxpbmUsICJzIyIsICZzdHIsICZsZW4pKSB7CisJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIF8oIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiKSk7CisJICAgIFB5X0RFQ1JFRihsaXN0KTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCVB5dGhvbl9Mb2NrX1ZpbSgpOworCXdyaXRlcigod3JpdGVmbikoZXJyb3IgPyBlbXNnIDogbXNnKSwgKGNoYXJfdSAqKXN0ciwgbGVuKTsKKwlQeXRob25fUmVsZWFzZV9WaW0oKTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qIE91dHB1dCBidWZmZXIgbWFuYWdlbWVudAorICovCisKK3N0YXRpYyBjaGFyX3UgKmJ1ZmZlciA9IE5VTEw7CitzdGF0aWMgaW50IGJ1ZmZlcl9sZW4gPSAwOworc3RhdGljIGludCBidWZmZXJfc2l6ZSA9IDA7CisKK3N0YXRpYyB3cml0ZWZuIG9sZF9mbiA9IE5VTEw7CisKKyAgICBzdGF0aWMgdm9pZAorYnVmZmVyX2Vuc3VyZShpbnQgbikKK3sKKyAgICBpbnQgbmV3X3NpemU7CisgICAgY2hhcl91ICpuZXdfYnVmZmVyOworCisgICAgaWYgKG4gPCBidWZmZXJfc2l6ZSkKKwlyZXR1cm47CisKKyAgICBuZXdfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICAgIHdoaWxlIChuZXdfc2l6ZSA8IG4pCisJbmV3X3NpemUgKz0gODA7CisKKyAgICBpZiAobmV3X3NpemUgIT0gYnVmZmVyX3NpemUpCisgICAgeworCW5ld19idWZmZXIgPSBhbGxvYygodW5zaWduZWQpbmV3X3NpemUpOworCWlmIChuZXdfYnVmZmVyID09IE5VTEwpCisJICAgIHJldHVybjsKKworCWlmIChidWZmZXIpCisJeworCSAgICBtZW1jcHkobmV3X2J1ZmZlciwgYnVmZmVyLCBidWZmZXJfbGVuKTsKKwkgICAgdmltX2ZyZWUoYnVmZmVyKTsKKwl9CisKKwlidWZmZXIgPSBuZXdfYnVmZmVyOworCWJ1ZmZlcl9zaXplID0gbmV3X3NpemU7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK1B5dGhvbklPX0ZsdXNoKHZvaWQpCit7CisgICAgaWYgKG9sZF9mbiAmJiBidWZmZXJfbGVuKQorICAgIHsKKwlidWZmZXJbYnVmZmVyX2xlbl0gPSAwOworCW9sZF9mbihidWZmZXIpOworICAgIH0KKworICAgIGJ1ZmZlcl9sZW4gPSAwOworfQorCisgICAgc3RhdGljIHZvaWQKK3dyaXRlcih3cml0ZWZuIGZuLCBjaGFyX3UgKnN0ciwgaW50IG4pCit7CisgICAgY2hhcl91ICpwdHI7CisKKyAgICBpZiAoZm4gIT0gb2xkX2ZuICYmIG9sZF9mbiAhPSBOVUxMKQorCVB5dGhvbklPX0ZsdXNoKCk7CisKKyAgICBvbGRfZm4gPSBmbjsKKworICAgIHdoaWxlIChuID4gMCAmJiAocHRyID0gbWVtY2hyKHN0ciwgJ1xuJywgbikpICE9IE5VTEwpCisgICAgeworCWludCBsZW4gPSBwdHIgLSBzdHI7CisKKwlidWZmZXJfZW5zdXJlKGJ1ZmZlcl9sZW4gKyBsZW4gKyAxKTsKKworCW1lbWNweShidWZmZXIgKyBidWZmZXJfbGVuLCBzdHIsIGxlbik7CisJYnVmZmVyX2xlbiArPSBsZW47CisJYnVmZmVyW2J1ZmZlcl9sZW5dID0gMDsKKwlmbihidWZmZXIpOworCXN0ciA9IHB0ciArIDE7CisJbiAtPSBsZW4gKyAxOworCWJ1ZmZlcl9sZW4gPSAwOworICAgIH0KKworICAgIC8qIFB1dCB0aGUgcmVtYWluaW5nIHRleHQgaW50byB0aGUgYnVmZmVyIGZvciBsYXRlciBwcmludGluZyAqLworICAgIGJ1ZmZlcl9lbnN1cmUoYnVmZmVyX2xlbiArIG4gKyAxKTsKKyAgICBtZW1jcHkoYnVmZmVyICsgYnVmZmVyX2xlbiwgc3RyLCBuKTsKKyAgICBidWZmZXJfbGVuICs9IG47Cit9CisKKy8qKioqKioqKioqKioqKiovCisKK3N0YXRpYyBPdXRwdXRPYmplY3QgT3V0cHV0ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJk91dHB1dFR5cGUpCisgICAgMCwKKyAgICAwCit9OworCitzdGF0aWMgT3V0cHV0T2JqZWN0IEVycm9yID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJk91dHB1dFR5cGUpCisgICAgMCwKKyAgICAxCit9OworCisgICAgc3RhdGljIGludAorUHl0aG9uSU9fSW5pdCh2b2lkKQoreworICAgIC8qIEZpeHVwcy4uLiAqLworICAgIE91dHB1dFR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKworICAgIFB5U3lzX1NldE9iamVjdCgic3Rkb3V0IiwgKFB5T2JqZWN0ICopKCZPdXRwdXQpKTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZGVyciIsIChQeU9iamVjdCAqKSgmRXJyb3IpKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgIHsKKwlFTVNHKF8oIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIikpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogMy4gSW1wbGVtZW50YXRpb24gb2YgdGhlIFZpbSBtb2R1bGUgZm9yIFB5dGhvbgorICovCisKKy8qIFZpbSBtb2R1bGUgLSBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgUHlPYmplY3QgKlZpbUVycm9yOworCitzdGF0aWMgUHlPYmplY3QgKlZpbUNvbW1hbmQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKlZpbUV2YWwoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKy8qIFdpbmRvdyB0eXBlIC0gSW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHdpbl9UCSp3aW47Cit9CitXaW5kb3dPYmplY3Q7CisKKyNkZWZpbmUgSU5WQUxJRF9XSU5ET1dfVkFMVUUgKCh3aW5fVCAqKSgtMSkpCisKKyNkZWZpbmUgV2luZG93VHlwZV9DaGVjayhvYmopICgob2JqKS0+b2JfdHlwZSA9PSAmV2luZG93VHlwZSkKKworc3RhdGljIFB5T2JqZWN0ICpXaW5kb3dOZXcod2luX1QgKik7CisKK3N0YXRpYyB2b2lkIFdpbmRvd0Rlc3RydWN0b3IoUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKldpbmRvd0dldGF0dHIoUHlPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgV2luZG93U2V0YXR0cihQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICpXaW5kb3dSZXByKFB5T2JqZWN0ICopOworCisvKiBCdWZmZXIgdHlwZSAtIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBidWZfVCAqYnVmOworfQorQnVmZmVyT2JqZWN0OworCisjZGVmaW5lIElOVkFMSURfQlVGRkVSX1ZBTFVFICgoYnVmX1QgKikoLTEpKQorCisjZGVmaW5lIEJ1ZmZlclR5cGVfQ2hlY2sob2JqKSAoKG9iaiktPm9iX3R5cGUgPT0gJkJ1ZmZlclR5cGUpCisKK3N0YXRpYyBQeU9iamVjdCAqQnVmZmVyTmV3IChidWZfVCAqKTsKKworc3RhdGljIHZvaWQgQnVmZmVyRGVzdHJ1Y3RvcihQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqQnVmZmVyR2V0YXR0cihQeU9iamVjdCAqLCBjaGFyICopOworc3RhdGljIFB5T2JqZWN0ICpCdWZmZXJSZXByKFB5T2JqZWN0ICopOworCitzdGF0aWMgaW50IEJ1ZmZlckxlbmd0aChQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqQnVmZmVySXRlbShQeU9iamVjdCAqLCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpCdWZmZXJTbGljZShQeU9iamVjdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IEJ1ZmZlckFzc0l0ZW0oUHlPYmplY3QgKiwgaW50LCBQeU9iamVjdCAqKTsKK3N0YXRpYyBpbnQgQnVmZmVyQXNzU2xpY2UoUHlPYmplY3QgKiwgaW50LCBpbnQsIFB5T2JqZWN0ICopOworCitzdGF0aWMgUHlPYmplY3QgKkJ1ZmZlckFwcGVuZChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqQnVmZmVyTWFyayhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqQnVmZmVyUmFuZ2UoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKy8qIExpbmUgcmFuZ2UgdHlwZSAtIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBCdWZmZXJPYmplY3QgKmJ1ZjsKKyAgICBpbnQgc3RhcnQ7CisgICAgaW50IGVuZDsKK30KK1JhbmdlT2JqZWN0OworCisjZGVmaW5lIFJhbmdlVHlwZV9DaGVjayhvYmopICgob2JqKS0+b2JfdHlwZSA9PSAmUmFuZ2VUeXBlKQorCitzdGF0aWMgUHlPYmplY3QgKlJhbmdlTmV3KGJ1Zl9UICosIGludCwgaW50KTsKKworc3RhdGljIHZvaWQgUmFuZ2VEZXN0cnVjdG9yKFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICpSYW5nZUdldGF0dHIoUHlPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBQeU9iamVjdCAqUmFuZ2VSZXByKFB5T2JqZWN0ICopOworCitzdGF0aWMgaW50IFJhbmdlTGVuZ3RoKFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICpSYW5nZUl0ZW0oUHlPYmplY3QgKiwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCAqUmFuZ2VTbGljZShQeU9iamVjdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IFJhbmdlQXNzSXRlbShQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOworc3RhdGljIGludCBSYW5nZUFzc1NsaWNlKFB5T2JqZWN0ICosIGludCwgaW50LCBQeU9iamVjdCAqKTsKKworc3RhdGljIFB5T2JqZWN0ICpSYW5nZUFwcGVuZChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworLyogV2luZG93IGxpc3QgdHlwZSAtIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgV2luTGlzdExlbmd0aChQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqV2luTGlzdEl0ZW0oUHlPYmplY3QgKiwgaW50KTsKKworLyogQnVmZmVyIGxpc3QgdHlwZSAtIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgQnVmTGlzdExlbmd0aChQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqQnVmTGlzdEl0ZW0oUHlPYmplY3QgKiwgaW50KTsKKworLyogQ3VycmVudCBvYmplY3RzIHR5cGUgLSBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIFB5T2JqZWN0ICpDdXJyZW50R2V0YXR0cihQeU9iamVjdCAqLCBjaGFyICopOworc3RhdGljIGludCBDdXJyZW50U2V0YXR0cihQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopOworCisvKiBWaW0gbW9kdWxlIC0gRGVmaW5pdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFZpbU1ldGhvZHNbXSA9IHsKKyAgICAvKiBuYW1lLAkgICAgIGZ1bmN0aW9uLAkJY2FsbGluZywgICAgZG9jdW1lbnRhdGlvbiAqLworICAgIHsiY29tbWFuZCIsCSAgICAgVmltQ29tbWFuZCwJMSwJICAgICIiIH0sCisgICAgeyJldmFsIiwJICAgICBWaW1FdmFsLAkJMSwJICAgICIiIH0sCisgICAgeyBOVUxMLAkgICAgIE5VTEwsCQkwLAkgICAgTlVMTCB9Cit9OworCisvKiBWaW0gbW9kdWxlIC0gSW1wbGVtZW50YXRpb24KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK1ZpbUNvbW1hbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmNtZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmNtZCkpCisJcmV0dXJuIE5VTEw7CisKKyAgICBQeUVycl9DbGVhcigpOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5dGhvbl9Mb2NrX1ZpbSgpOworCisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKWNtZCk7CisgICAgdXBkYXRlX3NjcmVlbihWQUxJRCk7CisKKyAgICBQeXRob25fUmVsZWFzZV9WaW0oKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKFZpbUVycm9yQ2hlY2soKSkKKwlyZXN1bHQgPSBOVUxMOworICAgIGVsc2UKKwlyZXN1bHQgPSBQeV9Ob25lOworCisgICAgUHlfWElOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBQeU9iamVjdCAqCitWaW1FdmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBjaGFyCSpleHByOworICAgIGNoYXIJKnN0cjsKKyAgICBQeU9iamVjdAkqcmVzdWx0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmV4cHIpKQorCXJldHVybiBOVUxMOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5dGhvbl9Mb2NrX1ZpbSgpOworICAgIHN0ciA9IChjaGFyICopZXZhbF90b19zdHJpbmcoKGNoYXJfdSAqKWV4cHIsIE5VTEwpOworICAgIFB5dGhvbl9SZWxlYXNlX1ZpbSgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgeworCVB5RXJyX1NldFZpbShfKCJpbnZhbGlkIGV4cHJlc3Npb24iKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgicyIsIHN0cik7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHl0aG9uX0xvY2tfVmltKCk7CisgICAgdmltX2ZyZWUoc3RyKTsKKyAgICBQeXRob25fUmVsZWFzZV9WaW0oKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgICAgUHlFcnJfU2V0VmltKF8oImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKiBDb21tb24gcm91dGluZXMgZm9yIGJ1ZmZlcnMgYW5kIGxpbmUgcmFuZ2VzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyAgICBzdGF0aWMgaW50CitDaGVja0J1ZmZlcihCdWZmZXJPYmplY3QgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmJ1ZiA9PSBJTlZBTElEX0JVRkZFUl9WQUxVRSkKKyAgICB7CisJUHlFcnJfU2V0VmltKF8oImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiKSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK1JCSXRlbShCdWZmZXJPYmplY3QgKnNlbGYsIGludCBuLCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgaWYgKENoZWNrQnVmZmVyKHNlbGYpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKG4gPCAwIHx8IG4gPiBlbmQgLSBzdGFydCkKKyAgICB7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsIF8oImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIpKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gR2V0QnVmZmVyTGluZShzZWxmLT5idWYsIG4rc3RhcnQpOworfQorCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK1JCU2xpY2UoQnVmZmVyT2JqZWN0ICpzZWxmLCBpbnQgbG8sIGludCBoaSwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgIGludCBzaXplOworCisgICAgaWYgKENoZWNrQnVmZmVyKHNlbGYpKQorCXJldHVybiBOVUxMOworCisgICAgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKworICAgIGlmIChsbyA8IDApCisJbG8gPSAwOworICAgIGVsc2UgaWYgKGxvID4gc2l6ZSkKKwlsbyA9IHNpemU7CisgICAgaWYgKGhpIDwgMCkKKwloaSA9IDA7CisgICAgaWYgKGhpIDwgbG8pCisJaGkgPSBsbzsKKyAgICBlbHNlIGlmIChoaSA+IHNpemUpCisJaGkgPSBzaXplOworCisgICAgcmV0dXJuIEdldEJ1ZmZlckxpbmVMaXN0KHNlbGYtPmJ1ZiwgbG8rc3RhcnQsIGhpK3N0YXJ0KTsKK30KKworICAgIHN0YXRpYyBpbnQKK1JCQXNzSXRlbShCdWZmZXJPYmplY3QgKnNlbGYsIGludCBuLCBQeU9iamVjdCAqdmFsLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCAqbmV3X2VuZCkKK3sKKyAgICBpbnQgbGVuX2NoYW5nZTsKKworICAgIGlmIChDaGVja0J1ZmZlcihzZWxmKSkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAobiA8IDAgfHwgbiA+IGVuZCAtIHN0YXJ0KQorICAgIHsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgXygibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIikpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoU2V0QnVmZmVyTGluZShzZWxmLT5idWYsIG4rc3RhcnQsIHZhbCwgJmxlbl9jaGFuZ2UpID09IEZBSUwpCisJcmV0dXJuIC0xOworCisgICAgaWYgKG5ld19lbmQpCisJKm5ld19lbmQgPSBlbmQgKyBsZW5fY2hhbmdlOworCisgICAgcmV0dXJuIDA7Cit9CisKKyAgICBzdGF0aWMgaW50CitSQkFzc1NsaWNlKEJ1ZmZlck9iamVjdCAqc2VsZiwgaW50IGxvLCBpbnQgaGksIFB5T2JqZWN0ICp2YWwsIGludCBzdGFydCwgaW50IGVuZCwgaW50ICpuZXdfZW5kKQoreworICAgIGludCBzaXplOworICAgIGludCBsZW5fY2hhbmdlOworCisgICAgLyogU2VsZiBtdXN0IGJlIGEgdmFsaWQgYnVmZmVyICovCisgICAgaWYgKENoZWNrQnVmZmVyKHNlbGYpKQorCXJldHVybiAtMTsKKworICAgIC8qIFNvcnQgb3V0IHRoZSBzbGljZSByYW5nZSAqLworICAgIHNpemUgPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICBpZiAobG8gPCAwKQorCWxvID0gMDsKKyAgICBlbHNlIGlmIChsbyA+IHNpemUpCisJbG8gPSBzaXplOworICAgIGlmIChoaSA8IDApCisJaGkgPSAwOworICAgIGlmIChoaSA8IGxvKQorCWhpID0gbG87CisgICAgZWxzZSBpZiAoaGkgPiBzaXplKQorCWhpID0gc2l6ZTsKKworICAgIGlmIChTZXRCdWZmZXJMaW5lTGlzdChzZWxmLT5idWYsIGxvK3N0YXJ0LCBoaStzdGFydCwgdmFsLCAmbGVuX2NoYW5nZSkgPT0gRkFJTCkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAobmV3X2VuZCkKKwkqbmV3X2VuZCA9IGVuZCArIGxlbl9jaGFuZ2U7CisKKyAgICByZXR1cm4gMDsKK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitSQkFwcGVuZChCdWZmZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCAqbmV3X2VuZCkKK3sKKyAgICBQeU9iamVjdCAqbGluZXM7CisgICAgaW50IGxlbl9jaGFuZ2U7CisgICAgaW50IG1heDsKKyAgICBpbnQgbjsKKworICAgIGlmIChDaGVja0J1ZmZlcihzZWxmKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIG1heCA9IG4gPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZsaW5lcywgJm4pKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKG4gPCAwIHx8IG4gPiBtYXgpCisgICAgeworCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBfKCJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKEluc2VydEJ1ZmZlckxpbmVzKHNlbGYtPmJ1ZiwgbiArIHN0YXJ0IC0gMSwgbGluZXMsICZsZW5fY2hhbmdlKSA9PSBGQUlMKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKG5ld19lbmQpCisJKm5ld19lbmQgPSBlbmQgKyBsZW5fY2hhbmdlOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisKKy8qIEJ1ZmZlciBvYmplY3QgLSBEZWZpbml0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgQnVmZmVyTWV0aG9kc1tdID0geworICAgIC8qIG5hbWUsCSAgICBmdW5jdGlvbiwJCWNhbGxpbmcsICAgIGRvY3VtZW50YXRpb24gKi8KKyAgICB7ImFwcGVuZCIsCSAgICBCdWZmZXJBcHBlbmQsCTEsCSAgICAiIiB9LAorICAgIHsibWFyayIsCSAgICBCdWZmZXJNYXJrLAkJMSwJICAgICIiIH0sCisgICAgeyJyYW5nZSIsCSAgICBCdWZmZXJSYW5nZSwJMSwJICAgICIiIH0sCisgICAgeyBOVUxMLAkgICAgTlVMTCwJCTAsCSAgICBOVUxMIH0KK307CisKK3N0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBCdWZmZXJBc1NlcSA9IHsKKyAgICAoaW5xdWlyeSkJCUJ1ZmZlckxlbmd0aCwJICAgIC8qIHNxX2xlbmd0aCwgICAgbGVuKHgpICAgKi8KKyAgICAoYmluYXJ5ZnVuYykJMCwgLyogQnVmZmVyQ29uY2F0LCAqLwkgICAgIC8qIHNxX2NvbmNhdCwgICAgeCt5ICAgICAgKi8KKyAgICAoaW50YXJnZnVuYykJMCwgLyogQnVmZmVyUmVwZWF0LCAqLwkgICAgIC8qIHNxX3JlcGVhdCwgICAgeCpuICAgICAgKi8KKyAgICAoaW50YXJnZnVuYykJQnVmZmVySXRlbSwJICAgIC8qIHNxX2l0ZW0sICAgICAgeFtpXSAgICAgKi8KKyAgICAoaW50aW50YXJnZnVuYykJQnVmZmVyU2xpY2UsCSAgICAvKiBzcV9zbGljZSwgICAgIHhbaTpqXSAgICovCisgICAgKGludG9iamFyZ3Byb2MpCUJ1ZmZlckFzc0l0ZW0sCSAgICAvKiBzcV9hc3NfaXRlbSwgIHhbaV09diAgICovCisgICAgKGludGludG9iamFyZ3Byb2MpCUJ1ZmZlckFzc1NsaWNlLCAgICAgLyogc3FfYXNzX3NsaWNlLCB4W2k6al09diAqLworfTsKKworc3RhdGljIFB5VHlwZU9iamVjdCBCdWZmZXJUeXBlID0geworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgwKQorICAgIDAsCisgICAgImJ1ZmZlciIsCisgICAgc2l6ZW9mKEJ1ZmZlck9iamVjdCksCisgICAgMCwKKworICAgIChkZXN0cnVjdG9yKSAgICBCdWZmZXJEZXN0cnVjdG9yLAkvKiB0cF9kZWFsbG9jLAlyZWZjb3VudD09MCAgKi8KKyAgICAocHJpbnRmdW5jKSAgICAgMCwJCQkvKiB0cF9wcmludCwJcHJpbnQgeCAgICAgICovCisgICAgKGdldGF0dHJmdW5jKSAgIEJ1ZmZlckdldGF0dHIsCS8qIHRwX2dldGF0dHIsCXguYXR0cgkgICAgICovCisgICAgKHNldGF0dHJmdW5jKSAgIDAsCQkJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgQnVmZmVyUmVwciwJCS8qIHRwX3JlcHIsCWB4YCwgcHJpbnQgeCAqLworCisgICAgMCwJCSAgICAvKiBhcyBudW1iZXIgKi8KKyAgICAmQnVmZmVyQXNTZXEsICAgLyogYXMgc2VxdWVuY2UgKi8KKyAgICAwLAkJICAgIC8qIGFzIG1hcHBpbmcgKi8KKworICAgIChoYXNoZnVuYykgMCwJCQkvKiB0cF9oYXNoLCBkaWN0KHgpICovCisgICAgKHRlcm5hcnlmdW5jKSAwLAkJCS8qIHRwX2NhbGwsIHgoKSAgICAgKi8KKyAgICAocmVwcmZ1bmMpIDAsCQkJLyogdHBfc3RyLCAgc3RyKHgpICAqLworfTsKKworLyogQnVmZmVyIG9iamVjdCAtIEltcGxlbWVudGF0aW9uCisgKi8KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitCdWZmZXJOZXcoYnVmX1QgKmJ1ZikKK3sKKyAgICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBkZWxldGlvbiBvZiBidWZmZXJzIHVuZGVybmVhdGggdXMuCisgICAgICogSWYgd2UgYWRkIGEgInB5dGhvbl9yZWYiIGZpZWxkIHRvIHRoZSBidWZfVCBzdHJ1Y3R1cmUsCisgICAgICogdGhlbiB3ZSBjYW4gZ2V0IGF0IGl0IGluIGJ1Zl9mcmVlYWxsKCkgaW4gdmltLiBXZSB0aGVuCisgICAgICogbmVlZCB0byBjcmVhdGUgb25seSBPTkUgUHl0aG9uIG9iamVjdCBwZXIgYnVmZmVyIC0gaWYKKyAgICAgKiB3ZSB0cnkgdG8gY3JlYXRlIGEgc2Vjb25kLCBqdXN0IElOQ1JFRiB0aGUgZXhpc3Rpbmcgb25lCisgICAgICogYW5kIHJldHVybiBpdC4gVGhlIChzaW5nbGUpIFB5dGhvbiBvYmplY3QgcmVmZXJyaW5nIHRvCisgICAgICogdGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gInB5dGhvbl9yZWYiLgorICAgICAqIFF1ZXN0aW9uOiB3aGF0IHRvIGRvIG9uIGEgYnVmX2ZyZWVhbGwoKS4gV2UnbGwgcHJvYmFibHkKKyAgICAgKiBoYXZlIHRvIGVpdGhlciBkZWxldGUgdGhlIFB5dGhvbiBvYmplY3QgKERFQ1JFRiBpdCB0bworICAgICAqIHplcm8gLSBhIGJhZCBpZGVhLCBhcyBpdCBsZWF2ZXMgZGFuZ2xpbmcgcmVmcyEpIG9yCisgICAgICogc2V0IHRoZSBidWZfVCAqIHZhbHVlIHRvIGFuIGludmFsaWQgdmFsdWUgKC0xPyksIHdoaWNoCisgICAgICogbWVhbnMgd2UgbmVlZCBjaGVja3MgaW4gYWxsIGFjY2VzcyBmdW5jdGlvbnMuLi4gQmFoLgorICAgICAqLworCisgICAgQnVmZmVyT2JqZWN0ICpzZWxmOworCisgICAgaWYgKGJ1Zi0+cHl0aG9uX3JlZikKKyAgICB7CisJc2VsZiA9IGJ1Zi0+cHl0aG9uX3JlZjsKKwlQeV9JTkNSRUYoc2VsZik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc2VsZiA9IFB5T2JqZWN0X05FVyhCdWZmZXJPYmplY3QsICZCdWZmZXJUeXBlKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwlzZWxmLT5idWYgPSBidWY7CisJYnVmLT5weXRob25fcmVmID0gc2VsZjsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopKHNlbGYpOworfQorCisgICAgc3RhdGljIHZvaWQKK0J1ZmZlckRlc3RydWN0b3IoUHlPYmplY3QgKnNlbGYpCit7CisgICAgQnVmZmVyT2JqZWN0ICp0aGlzID0gKEJ1ZmZlck9iamVjdCAqKShzZWxmKTsKKworICAgIGlmICh0aGlzLT5idWYgJiYgdGhpcy0+YnVmICE9IElOVkFMSURfQlVGRkVSX1ZBTFVFKQorCXRoaXMtPmJ1Zi0+cHl0aG9uX3JlZiA9IE5VTEw7CisKKyAgICBQeU1lbV9ERUwoc2VsZik7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorQnVmZmVyR2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICBCdWZmZXJPYmplY3QgKnRoaXMgPSAoQnVmZmVyT2JqZWN0ICopKHNlbGYpOworCisgICAgaWYgKENoZWNrQnVmZmVyKHRoaXMpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKHN0cmNtcChuYW1lLCAibmFtZSIpID09IDApCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLHRoaXMtPmJ1Zi0+Yl9mZm5hbWUpOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAibnVtYmVyIikgPT0gMCkKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsdGhpcy0+YnVmLT5iX2ZudW0pOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCJfX21lbWJlcnNfXyIpID09IDApCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIltzc10iLCAibmFtZSIsICJudW1iZXIiKTsKKyAgICBlbHNlCisJcmV0dXJuIFB5X0ZpbmRNZXRob2QoQnVmZmVyTWV0aG9kcywgc2VsZiwgbmFtZSk7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorQnVmZmVyUmVwcihQeU9iamVjdCAqc2VsZikKK3sKKyAgICBzdGF0aWMgY2hhciByZXByWzUwXTsKKyAgICBCdWZmZXJPYmplY3QgKnRoaXMgPSAoQnVmZmVyT2JqZWN0ICopKHNlbGYpOworCisgICAgaWYgKHRoaXMtPmJ1ZiA9PSBJTlZBTElEX0JVRkZFUl9WQUxVRSkKKyAgICB7CisJc3ByaW50ZihyZXByLCBfKCI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iKSwgKGxvbmcpKHNlbGYpKTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXByKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaGFyICpuYW1lID0gKGNoYXIgKil0aGlzLT5idWYtPmJfZm5hbWU7CisJaW50IGxlbjsKKworCWlmIChuYW1lID09IE5VTEwpCisJICAgIG5hbWUgPSAiIjsKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpZiAobGVuID4gMzUpCisJICAgIG5hbWUgPSBuYW1lICsgKDM1IC0gbGVuKTsKKworCXNwcmludGYocmVwciwgIjxidWZmZXIgJXMlcz4iLCBsZW4gPiAzNSA/ICIuLi4iIDogIiIsIG5hbWUpOworCisJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVwcik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhdGljIGludAorQnVmZmVyTGVuZ3RoKFB5T2JqZWN0ICpzZWxmKQoreworICAgIC8qIEhPVyBETyBXRSBTSUdOQUwgQU4gRVJST1IgRlJPTSBUSElTIEZVTkNUSU9OPyAqLworICAgIGlmIChDaGVja0J1ZmZlcigoQnVmZmVyT2JqZWN0ICopKHNlbGYpKSkKKwlyZXR1cm4gLTE7IC8qID8/PyAqLworCisgICAgcmV0dXJuICgoKEJ1ZmZlck9iamVjdCAqKShzZWxmKSktPmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KTsKK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitCdWZmZXJJdGVtKFB5T2JqZWN0ICpzZWxmLCBpbnQgbikKK3sKKyAgICByZXR1cm4gUkJJdGVtKChCdWZmZXJPYmplY3QgKikoc2VsZiksIG4sIDEsCisJCSAgKGludCkoKEJ1ZmZlck9iamVjdCAqKShzZWxmKSktPmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KTsKK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitCdWZmZXJTbGljZShQeU9iamVjdCAqc2VsZiwgaW50IGxvLCBpbnQgaGkpCit7CisgICAgcmV0dXJuIFJCU2xpY2UoKEJ1ZmZlck9iamVjdCAqKShzZWxmKSwgbG8sIGhpLCAxLAorCQkgICAoaW50KSgoQnVmZmVyT2JqZWN0ICopKHNlbGYpKS0+YnVmLT5iX21sLm1sX2xpbmVfY291bnQpOworfQorCisgICAgc3RhdGljIGludAorQnVmZmVyQXNzSXRlbShQeU9iamVjdCAqc2VsZiwgaW50IG4sIFB5T2JqZWN0ICp2YWwpCit7CisgICAgcmV0dXJuIFJCQXNzSXRlbSgoQnVmZmVyT2JqZWN0ICopKHNlbGYpLCBuLCB2YWwsIDEsCisJCSAgICAgKGludCkoKEJ1ZmZlck9iamVjdCAqKShzZWxmKSktPmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LAorCQkgICAgIE5VTEwpOworfQorCisgICAgc3RhdGljIGludAorQnVmZmVyQXNzU2xpY2UoUHlPYmplY3QgKnNlbGYsIGludCBsbywgaW50IGhpLCBQeU9iamVjdCAqdmFsKQoreworICAgIHJldHVybiBSQkFzc1NsaWNlKChCdWZmZXJPYmplY3QgKikoc2VsZiksIGxvLCBoaSwgdmFsLCAxLAorCQkgICAgICAoaW50KSgoQnVmZmVyT2JqZWN0ICopKHNlbGYpKS0+YnVmLT5iX21sLm1sX2xpbmVfY291bnQsCisJCSAgICAgIE5VTEwpOworfQorCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK0J1ZmZlckFwcGVuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgcmV0dXJuIFJCQXBwZW5kKChCdWZmZXJPYmplY3QgKikoc2VsZiksIGFyZ3MsIDEsCisJCSAgICAoaW50KSgoQnVmZmVyT2JqZWN0ICopKHNlbGYpKS0+YnVmLT5iX21sLm1sX2xpbmVfY291bnQsCisJCSAgICBOVUxMKTsKK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitCdWZmZXJNYXJrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBwb3NfVAkqcG9zcDsKKyAgICBjaGFyCW1hcms7CisgICAgYnVmX1QJKmN1cmJ1Zl9zYXZlOworCisgICAgaWYgKENoZWNrQnVmZmVyKChCdWZmZXJPYmplY3QgKikoc2VsZikpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjIiwgJm1hcmspKQorCXJldHVybiBOVUxMOworCisgICAgY3VyYnVmX3NhdmUgPSBjdXJidWY7CisgICAgY3VyYnVmID0gKChCdWZmZXJPYmplY3QgKikoc2VsZikpLT5idWY7CisgICAgcG9zcCA9IGdldG1hcmsobWFyaywgRkFMU0UpOworICAgIGN1cmJ1ZiA9IGN1cmJ1Zl9zYXZlOworCisgICAgaWYgKHBvc3AgPT0gTlVMTCkKKyAgICB7CisJUHlFcnJfU2V0VmltKF8oImludmFsaWQgbWFyayBuYW1lIikpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENrZWNrIGZvciBrZXlib2FyZCBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoVmltRXJyb3JDaGVjaygpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKHBvc3AtPmxudW0gPD0gMCkKKyAgICB7CisJLyogT3IgcmFpc2UgYW4gZXJyb3I/ICovCisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworICAgIH0KKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgKGxvbmcpKHBvc3AtPmxudW0pLCAobG9uZykocG9zcC0+Y29sKSk7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorQnVmZmVyUmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCBzdGFydDsKKyAgICBpbnQgZW5kOworCisgICAgaWYgKENoZWNrQnVmZmVyKChCdWZmZXJPYmplY3QgKikoc2VsZikpKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZzdGFydCwgJmVuZCkpCisJcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUmFuZ2VOZXcoKChCdWZmZXJPYmplY3QgKikoc2VsZikpLT5idWYsIHN0YXJ0LCBlbmQpOworfQorCisvKiBMaW5lIHJhbmdlIG9iamVjdCAtIERlZmluaXRpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBSYW5nZU1ldGhvZHNbXSA9IHsKKyAgICAvKiBuYW1lLAkgICAgZnVuY3Rpb24sCQljYWxsaW5nLCAgICBkb2N1bWVudGF0aW9uICovCisgICAgeyJhcHBlbmQiLAkgICAgUmFuZ2VBcHBlbmQsCTEsCSAgICAiIiB9LAorICAgIHsgTlVMTCwJICAgIE5VTEwsCQkwLAkgICAgTlVMTCB9Cit9OworCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgUmFuZ2VBc1NlcSA9IHsKKyAgICAoaW5xdWlyeSkJCVJhbmdlTGVuZ3RoLAkgICAgLyogc3FfbGVuZ3RoLCAgICBsZW4oeCkgICAqLworICAgIChiaW5hcnlmdW5jKQkwLCAvKiBSYW5nZUNvbmNhdCwgKi8JICAgICAvKiBzcV9jb25jYXQsICAgIHgreSAgICAgICovCisgICAgKGludGFyZ2Z1bmMpCTAsIC8qIFJhbmdlUmVwZWF0LCAqLwkgICAgIC8qIHNxX3JlcGVhdCwgICAgeCpuICAgICAgKi8KKyAgICAoaW50YXJnZnVuYykJUmFuZ2VJdGVtLAkgICAgLyogc3FfaXRlbSwgICAgICB4W2ldICAgICAqLworICAgIChpbnRpbnRhcmdmdW5jKQlSYW5nZVNsaWNlLAkgICAgLyogc3Ffc2xpY2UsICAgICB4W2k6al0gICAqLworICAgIChpbnRvYmphcmdwcm9jKQlSYW5nZUFzc0l0ZW0sCSAgICAvKiBzcV9hc3NfaXRlbSwgIHhbaV09diAgICovCisgICAgKGludGludG9iamFyZ3Byb2MpCVJhbmdlQXNzU2xpY2UsCSAgICAvKiBzcV9hc3Nfc2xpY2UsIHhbaTpqXT12ICovCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IFJhbmdlVHlwZSA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoMCkKKyAgICAwLAorICAgICJyYW5nZSIsCisgICAgc2l6ZW9mKFJhbmdlT2JqZWN0KSwKKyAgICAwLAorCisgICAgKGRlc3RydWN0b3IpICAgIFJhbmdlRGVzdHJ1Y3RvciwJLyogdHBfZGVhbGxvYywJcmVmY291bnQ9PTAgICovCisgICAgKHByaW50ZnVuYykgICAgIDAsCQkJLyogdHBfcHJpbnQsCXByaW50IHggICAgICAqLworICAgIChnZXRhdHRyZnVuYykgICBSYW5nZUdldGF0dHIsCS8qIHRwX2dldGF0dHIsCXguYXR0cgkgICAgICovCisgICAgKHNldGF0dHJmdW5jKSAgIDAsCQkJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgUmFuZ2VSZXByLAkJLyogdHBfcmVwciwJYHhgLCBwcmludCB4ICovCisKKyAgICAwLAkJICAgIC8qIGFzIG51bWJlciAqLworICAgICZSYW5nZUFzU2VxLCAgICAvKiBhcyBzZXF1ZW5jZSAqLworICAgIDAsCQkgICAgLyogYXMgbWFwcGluZyAqLworCisgICAgKGhhc2hmdW5jKSAwLAkJCS8qIHRwX2hhc2gsIGRpY3QoeCkgKi8KKyAgICAodGVybmFyeWZ1bmMpIDAsCQkJLyogdHBfY2FsbCwgeCgpICAgICAqLworICAgIChyZXByZnVuYykgMCwJCQkvKiB0cF9zdHIsICBzdHIoeCkgICovCit9OworCisvKiBMaW5lIHJhbmdlIG9iamVjdCAtIEltcGxlbWVudGF0aW9uCisgKi8KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitSYW5nZU5ldyhidWZfVCAqYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgQnVmZmVyT2JqZWN0ICpidWZyOworICAgIFJhbmdlT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoUmFuZ2VPYmplY3QsICZSYW5nZVR5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBidWZyID0gKEJ1ZmZlck9iamVjdCAqKUJ1ZmZlck5ldyhidWYpOworICAgIGlmIChidWZyID09IE5VTEwpCisgICAgeworCVB5TWVtX0RFTChzZWxmKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGJ1ZnIpOworCisgICAgc2VsZi0+YnVmID0gYnVmcjsKKyAgICBzZWxmLT5zdGFydCA9IHN0YXJ0OworICAgIHNlbGYtPmVuZCA9IGVuZDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKikoc2VsZik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorUmFuZ2VEZXN0cnVjdG9yKFB5T2JqZWN0ICpzZWxmKQoreworICAgIFB5X0RFQ1JFRigoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+YnVmKTsKKyAgICBQeU1lbV9ERUwoc2VsZik7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorUmFuZ2VHZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIGlmIChzdHJjbXAobmFtZSwgInN0YXJ0IikgPT0gMCkKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsKChSYW5nZU9iamVjdCAqKShzZWxmKSktPnN0YXJ0IC0gMSk7CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJlbmQiKSA9PSAwKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+ZW5kIC0gMSk7CisgICAgZWxzZQorCXJldHVybiBQeV9GaW5kTWV0aG9kKFJhbmdlTWV0aG9kcywgc2VsZiwgbmFtZSk7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorUmFuZ2VSZXByKFB5T2JqZWN0ICpzZWxmKQoreworICAgIHN0YXRpYyBjaGFyIHJlcHJbNzVdOworICAgIFJhbmdlT2JqZWN0ICp0aGlzID0gKFJhbmdlT2JqZWN0ICopKHNlbGYpOworCisgICAgaWYgKHRoaXMtPmJ1Zi0+YnVmID09IElOVkFMSURfQlVGRkVSX1ZBTFVFKQorICAgIHsKKwlzcHJpbnRmKHJlcHIsICI8cmFuZ2Ugb2JqZWN0IChmb3IgZGVsZXRlZCBidWZmZXIpIGF0ICU4bFg+IiwKKwkJCQkJCQkJKGxvbmcpKHNlbGYpKTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXByKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaGFyICpuYW1lID0gKGNoYXIgKil0aGlzLT5idWYtPmJ1Zi0+Yl9mbmFtZTsKKwlpbnQgbGVuOworCisJaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgbmFtZSA9ICIiOworCWxlbiA9IHN0cmxlbihuYW1lKTsKKworCWlmIChsZW4gPiA0NSkKKwkgICAgbmFtZSA9IG5hbWUgKyAoNDUgLSBsZW4pOworCisJc3ByaW50ZihyZXByLCAiPHJhbmdlICVzJXMgKCVkOiVkKT4iLAorCQlsZW4gPiA0NSA/ICIuLi4iIDogIiIsIG5hbWUsCisJCXRoaXMtPnN0YXJ0LCB0aGlzLT5lbmQpOworCisJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVwcik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKi8KKworICAgIHN0YXRpYyBpbnQKK1JhbmdlTGVuZ3RoKFB5T2JqZWN0ICpzZWxmKQoreworICAgIC8qIEhPVyBETyBXRSBTSUdOQUwgQU4gRVJST1IgRlJPTSBUSElTIEZVTkNUSU9OPyAqLworICAgIGlmIChDaGVja0J1ZmZlcigoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+YnVmKSkKKwlyZXR1cm4gLTE7IC8qID8/PyAqLworCisgICAgcmV0dXJuICgoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+ZW5kIC0gKChSYW5nZU9iamVjdCAqKShzZWxmKSktPnN0YXJ0ICsgMSk7Cit9CisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorUmFuZ2VJdGVtKFB5T2JqZWN0ICpzZWxmLCBpbnQgbikKK3sKKyAgICByZXR1cm4gUkJJdGVtKCgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5idWYsIG4sCisJCSAgKChSYW5nZU9iamVjdCAqKShzZWxmKSktPnN0YXJ0LAorCQkgICgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5lbmQpOworfQorCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK1JhbmdlU2xpY2UoUHlPYmplY3QgKnNlbGYsIGludCBsbywgaW50IGhpKQoreworICAgIHJldHVybiBSQlNsaWNlKCgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5idWYsIGxvLCBoaSwKKwkJICAgKChSYW5nZU9iamVjdCAqKShzZWxmKSktPnN0YXJ0LAorCQkgICAoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+ZW5kKTsKK30KKworICAgIHN0YXRpYyBpbnQKK1JhbmdlQXNzSXRlbShQeU9iamVjdCAqc2VsZiwgaW50IG4sIFB5T2JqZWN0ICp2YWwpCit7CisgICAgcmV0dXJuIFJCQXNzSXRlbSgoKFJhbmdlT2JqZWN0ICopKHNlbGYpKS0+YnVmLCBuLCB2YWwsCisJCSAgICAgKChSYW5nZU9iamVjdCAqKShzZWxmKSktPnN0YXJ0LAorCQkgICAgICgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5lbmQsCisJCSAgICAgJigoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5lbmQpOworfQorCisgICAgc3RhdGljIGludAorUmFuZ2VBc3NTbGljZShQeU9iamVjdCAqc2VsZiwgaW50IGxvLCBpbnQgaGksIFB5T2JqZWN0ICp2YWwpCit7CisgICAgcmV0dXJuIFJCQXNzU2xpY2UoKChSYW5nZU9iamVjdCAqKShzZWxmKSktPmJ1ZiwgbG8sIGhpLCB2YWwsCisJCSAgICAgICgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5zdGFydCwKKwkJICAgICAgKChSYW5nZU9iamVjdCAqKShzZWxmKSktPmVuZCwKKwkJICAgICAgJigoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5lbmQpOworfQorCisgICAgc3RhdGljIFB5T2JqZWN0ICoKK1JhbmdlQXBwZW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICByZXR1cm4gUkJBcHBlbmQoKChSYW5nZU9iamVjdCAqKShzZWxmKSktPmJ1ZiwgYXJncywKKwkJICAgICgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5zdGFydCwKKwkJICAgICgoUmFuZ2VPYmplY3QgKikoc2VsZikpLT5lbmQsCisJCSAgICAmKChSYW5nZU9iamVjdCAqKShzZWxmKSktPmVuZCk7Cit9CisKKy8qIEJ1ZmZlciBsaXN0IG9iamVjdCAtIERlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECit9CitCdWZMaXN0T2JqZWN0OworCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgQnVmTGlzdEFzU2VxID0geworICAgIChpbnF1aXJ5KQkJQnVmTGlzdExlbmd0aCwJICAgIC8qIHNxX2xlbmd0aCwgICAgbGVuKHgpICAgKi8KKyAgICAoYmluYXJ5ZnVuYykJMCwJCSAgICAvKiBzcV9jb25jYXQsICAgIHgreSAgICAgICovCisgICAgKGludGFyZ2Z1bmMpCTAsCQkgICAgLyogc3FfcmVwZWF0LCAgICB4Km4gICAgICAqLworICAgIChpbnRhcmdmdW5jKQlCdWZMaXN0SXRlbSwJICAgIC8qIHNxX2l0ZW0sICAgICAgeFtpXSAgICAgKi8KKyAgICAoaW50aW50YXJnZnVuYykJMCwJCSAgICAvKiBzcV9zbGljZSwgICAgIHhbaTpqXSAgICovCisgICAgKGludG9iamFyZ3Byb2MpCTAsCQkgICAgLyogc3FfYXNzX2l0ZW0sICB4W2ldPXYgICAqLworICAgIChpbnRpbnRvYmphcmdwcm9jKQkwLAkJICAgIC8qIHNxX2Fzc19zbGljZSwgeFtpOmpdPXYgKi8KK307CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgQnVmTGlzdFR5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKDApCisgICAgMCwKKyAgICAiYnVmZmVyIGxpc3QiLAorICAgIHNpemVvZihCdWZMaXN0T2JqZWN0KSwKKyAgICAwLAorCisgICAgKGRlc3RydWN0b3IpICAgIDAsCQkJLyogdHBfZGVhbGxvYywJcmVmY291bnQ9PTAgICovCisgICAgKHByaW50ZnVuYykgICAgIDAsCQkJLyogdHBfcHJpbnQsCXByaW50IHggICAgICAqLworICAgIChnZXRhdHRyZnVuYykgICAwLAkJCS8qIHRwX2dldGF0dHIsCXguYXR0cgkgICAgICovCisgICAgKHNldGF0dHJmdW5jKSAgIDAsCQkJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgMCwJCQkvKiB0cF9yZXByLAlgeGAsIHByaW50IHggKi8KKworICAgIDAsCQkgICAgLyogYXMgbnVtYmVyICovCisgICAgJkJ1Zkxpc3RBc1NlcSwgIC8qIGFzIHNlcXVlbmNlICovCisgICAgMCwJCSAgICAvKiBhcyBtYXBwaW5nICovCisKKyAgICAoaGFzaGZ1bmMpIDAsCQkJLyogdHBfaGFzaCwgZGljdCh4KSAqLworICAgICh0ZXJuYXJ5ZnVuYykgMCwJCQkvKiB0cF9jYWxsLCB4KCkgICAgICovCisgICAgKHJlcHJmdW5jKSAwLAkJCS8qIHRwX3N0ciwgIHN0cih4KSAgKi8KK307CisKKy8qIEJ1ZmZlciBsaXN0IG9iamVjdCAtIEltcGxlbWVudGF0aW9uCisgKi8KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGludAorQnVmTGlzdExlbmd0aChQeU9iamVjdCAqc2VsZikKK3sKKyAgICBidWZfVAkqYiA9IGZpcnN0YnVmOworICAgIGludAkJbiA9IDA7CisKKyAgICB3aGlsZSAoYikKKyAgICB7CisJKytuOworCWIgPSBiLT5iX25leHQ7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBQeU9iamVjdCAqCitCdWZMaXN0SXRlbShQeU9iamVjdCAqc2VsZiwgaW50IG4pCit7CisgICAgYnVmX1QgKmI7CisKKyAgICBmb3IgKGIgPSBmaXJzdGJ1ZjsgYjsgYiA9IGItPmJfbmV4dCwgLS1uKQorICAgIHsKKwlpZiAobiA9PSAwKQorCSAgICByZXR1cm4gQnVmZmVyTmV3KGIpOworICAgIH0KKworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCBfKCJubyBzdWNoIGJ1ZmZlciIpKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogV2luZG93IG9iamVjdCAtIERlZmluaXRpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBXaW5kb3dNZXRob2RzW10gPSB7CisgICAgLyogbmFtZSwJICAgIGZ1bmN0aW9uLAkJY2FsbGluZywgICAgZG9jdW1lbnRhdGlvbiAqLworICAgIHsgTlVMTCwJICAgIE5VTEwsCQkwLAkgICAgTlVMTCB9Cit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IFdpbmRvd1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKDApCisgICAgMCwKKyAgICAid2luZG93IiwKKyAgICBzaXplb2YoV2luZG93T2JqZWN0KSwKKyAgICAwLAorCisgICAgKGRlc3RydWN0b3IpICAgIFdpbmRvd0Rlc3RydWN0b3IsCS8qIHRwX2RlYWxsb2MsCXJlZmNvdW50PT0wICAqLworICAgIChwcmludGZ1bmMpICAgICAwLAkJCS8qIHRwX3ByaW50LAlwcmludCB4ICAgICAgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpICAgV2luZG93R2V0YXR0ciwJLyogdHBfZ2V0YXR0ciwJeC5hdHRyCSAgICAgKi8KKyAgICAoc2V0YXR0cmZ1bmMpICAgV2luZG93U2V0YXR0ciwJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgV2luZG93UmVwciwJCS8qIHRwX3JlcHIsCWB4YCwgcHJpbnQgeCAqLworCisgICAgMCwJCSAgICAvKiBhcyBudW1iZXIgKi8KKyAgICAwLAkJICAgIC8qIGFzIHNlcXVlbmNlICovCisgICAgMCwJCSAgICAvKiBhcyBtYXBwaW5nICovCisKKyAgICAoaGFzaGZ1bmMpIDAsCQkJLyogdHBfaGFzaCwgZGljdCh4KSAqLworICAgICh0ZXJuYXJ5ZnVuYykgMCwJCQkvKiB0cF9jYWxsLCB4KCkgICAgICovCisgICAgKHJlcHJmdW5jKSAwLAkJCS8qIHRwX3N0ciwgIHN0cih4KSAgKi8KK307CisKKy8qIFdpbmRvdyBvYmplY3QgLSBJbXBsZW1lbnRhdGlvbgorICovCisKKyAgICBzdGF0aWMgUHlPYmplY3QgKgorV2luZG93TmV3KHdpbl9UICp3aW4pCit7CisgICAgLyogV2UgbmVlZCB0byBoYW5kbGUgZGVsZXRpb24gb2Ygd2luZG93cyB1bmRlcm5lYXRoIHVzLgorICAgICAqIElmIHdlIGFkZCBhICJweXRob25fcmVmIiBmaWVsZCB0byB0aGUgd2luX1Qgc3RydWN0dXJlLAorICAgICAqIHRoZW4gd2UgY2FuIGdldCBhdCBpdCBpbiB3aW5fZnJlZSgpIGluIHZpbS4gV2UgdGhlbgorICAgICAqIG5lZWQgdG8gY3JlYXRlIG9ubHkgT05FIFB5dGhvbiBvYmplY3QgcGVyIHdpbmRvdyAtIGlmCisgICAgICogd2UgdHJ5IHRvIGNyZWF0ZSBhIHNlY29uZCwganVzdCBJTkNSRUYgdGhlIGV4aXN0aW5nIG9uZQorICAgICAqIGFuZCByZXR1cm4gaXQuIFRoZSAoc2luZ2xlKSBQeXRob24gb2JqZWN0IHJlZmVycmluZyB0bworICAgICAqIHRoZSB3aW5kb3cgaXMgc3RvcmVkIGluICJweXRob25fcmVmIi4KKyAgICAgKiBPbiBhIHdpbl9mcmVlKCkgd2Ugc2V0IHRoZSBQeXRob24gb2JqZWN0J3Mgd2luX1QqIGZpZWxkCisgICAgICogdG8gYW4gaW52YWxpZCB2YWx1ZS4gV2UgdHJhcCBhbGwgdXNlcyBvZiBhIHdpbmRvdworICAgICAqIG9iamVjdCwgYW5kIHJlamVjdCB0aGVtIGlmIHRoZSB3aW5fVCogZmllbGQgaXMgaW52YWxpZC4KKyAgICAgKi8KKworICAgIFdpbmRvd09iamVjdCAqc2VsZjsKKworICAgIGlmICh3aW4tPnB5dGhvbl9yZWYpCisgICAgeworCXNlbGYgPSB3aW4tPnB5dGhvbl9yZWY7CisJUHlfSU5DUkVGKHNlbGYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXNlbGYgPSBQeU9iamVjdF9ORVcoV2luZG93T2JqZWN0LCAmV2luZG93VHlwZSk7CisJaWYgKHNlbGYgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJc2VsZi0+d2luID0gd2luOworCXdpbi0+cHl0aG9uX3JlZiA9IHNlbGY7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKShzZWxmKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitXaW5kb3dEZXN0cnVjdG9yKFB5T2JqZWN0ICpzZWxmKQoreworICAgIFdpbmRvd09iamVjdCAqdGhpcyA9IChXaW5kb3dPYmplY3QgKikoc2VsZik7CisKKyAgICBpZiAodGhpcy0+d2luICYmIHRoaXMtPndpbiAhPSBJTlZBTElEX1dJTkRPV19WQUxVRSkKKwl0aGlzLT53aW4tPnB5dGhvbl9yZWYgPSBOVUxMOworCisgICAgUHlNZW1fREVMKHNlbGYpOworfQorCisgICAgc3RhdGljIGludAorQ2hlY2tXaW5kb3coV2luZG93T2JqZWN0ICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aW4gPT0gSU5WQUxJRF9XSU5ET1dfVkFMVUUpCisgICAgeworCVB5RXJyX1NldFZpbShfKCJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IikpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitXaW5kb3dHZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIFdpbmRvd09iamVjdCAqdGhpcyA9IChXaW5kb3dPYmplY3QgKikoc2VsZik7CisKKyAgICBpZiAoQ2hlY2tXaW5kb3codGhpcykpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3RyY21wKG5hbWUsICJidWZmZXIiKSA9PSAwKQorCXJldHVybiAoUHlPYmplY3QgKilCdWZmZXJOZXcodGhpcy0+d2luLT53X2J1ZmZlcik7CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjdXJzb3IiKSA9PSAwKQorICAgIHsKKwlwb3NfVCAqcG9zID0gJnRoaXMtPndpbi0+d19jdXJzb3I7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsKSIsIChsb25nKShwb3MtPmxudW0pLCAobG9uZykocG9zLT5jb2wpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJoZWlnaHQiKSA9PSAwKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpKHRoaXMtPndpbi0+d19oZWlnaHQpKTsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAid2lkdGgiKSA9PSAwKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpKFdfV0lEVEgodGhpcy0+d2luKSkpOworI2VuZGlmCisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsIl9fbWVtYmVyc19fIikgPT0gMCkKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW3Nzc10iLCAiYnVmZmVyIiwgImN1cnNvciIsICJoZWlnaHQiKTsKKyAgICBlbHNlCisJcmV0dXJuIFB5X0ZpbmRNZXRob2QoV2luZG93TWV0aG9kcywgc2VsZiwgbmFtZSk7Cit9CisKKyAgICBzdGF0aWMgaW50CitXaW5kb3dTZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdmFsKQoreworICAgIFdpbmRvd09iamVjdCAqdGhpcyA9IChXaW5kb3dPYmplY3QgKikoc2VsZik7CisKKyAgICBpZiAoQ2hlY2tXaW5kb3codGhpcykpCisJcmV0dXJuIC0xOworCisgICAgaWYgKHN0cmNtcChuYW1lLCAiYnVmZmVyIikgPT0gMCkKKyAgICB7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXygicmVhZG9ubHkgYXR0cmlidXRlIikpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjdXJzb3IiKSA9PSAwKQorICAgIHsKKwlsb25nIGxudW07CisJbG9uZyBjb2w7CisKKwlpZiAoIVB5QXJnX1BhcnNlKHZhbCwgIihsbCkiLCAmbG51bSwgJmNvbCkpCisJICAgIHJldHVybiAtMTsKKworCWlmIChsbnVtIDw9IDAgfHwgbG51bSA+IHRoaXMtPndpbi0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisJICAgIFB5RXJyX1NldFZpbShfKCJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiKSk7CisJICAgIHJldHVybiAtMTsKKwl9CisKKwkvKiBDaGVjayBmb3Iga2V5Ym9hcmQgaW50ZXJydXB0cyAqLworCWlmIChWaW1FcnJvckNoZWNrKCkpCisJICAgIHJldHVybiAtMTsKKworCS8qIE5PIENIRUNLIE9OIENPTFVNTiAtIFNFRU1TIE5PVCBUTyBNQVRURVIgKi8KKworCXRoaXMtPndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJdGhpcy0+d2luLT53X2N1cnNvci5jb2wgPSBjb2w7CisJdXBkYXRlX3NjcmVlbihWQUxJRCk7CisKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJoZWlnaHQiKSA9PSAwKQorICAgIHsKKwlpbnQJaGVpZ2h0OworCXdpbl9UCSpzYXZld2luOworCisJaWYgKCFQeUFyZ19QYXJzZSh2YWwsICJpIiwgJmhlaWdodCkpCisJICAgIHJldHVybiAtMTsKKworI2lmZGVmIEZFQVRfR1VJCisJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCXNhdmV3aW4gPSBjdXJ3aW47CisJY3Vyd2luID0gdGhpcy0+d2luOworCXdpbl9zZXRoZWlnaHQoaGVpZ2h0KTsKKwljdXJ3aW4gPSBzYXZld2luOworCisJLyogQ2hlY2sgZm9yIGtleWJvYXJkIGludGVycnVwdHMgKi8KKwlpZiAoVmltRXJyb3JDaGVjaygpKQorCSAgICByZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKKyAgICB9CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIndpZHRoIikgPT0gMCkKKyAgICB7CisJaW50CXdpZHRoOworCXdpbl9UCSpzYXZld2luOworCisJaWYgKCFQeUFyZ19QYXJzZSh2YWwsICJpIiwgJndpZHRoKSkKKwkgICAgcmV0dXJuIC0xOworCisjaWZkZWYgRkVBVF9HVUkKKwluZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisJc2F2ZXdpbiA9IGN1cndpbjsKKwljdXJ3aW4gPSB0aGlzLT53aW47CisJd2luX3NldHdpZHRoKHdpZHRoKTsKKwljdXJ3aW4gPSBzYXZld2luOworCisJLyogQ2hlY2sgZm9yIGtleWJvYXJkIGludGVycnVwdHMgKi8KKwlpZiAoVmltRXJyb3JDaGVjaygpKQorCSAgICByZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgeworCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisJcmV0dXJuIC0xOworICAgIH0KK30KKworICAgIHN0YXRpYyBQeU9iamVjdCAqCitXaW5kb3dSZXByKFB5T2JqZWN0ICpzZWxmKQoreworICAgIHN0YXRpYyBjaGFyIHJlcHJbNTBdOworICAgIFdpbmRvd09iamVjdCAqdGhpcyA9IChXaW5kb3dPYmplY3QgKikoc2VsZik7CisKKyAgICBpZiAodGhpcy0+d2luID09IElOVkFMSURfV0lORE9XX1ZBTFVFKQorICAgIHsKKwlzcHJpbnRmKHJlcHIsIF8oIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iKSwgKGxvbmcpKHNlbGYpKTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXByKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpbnQJaSA9IDA7CisJd2luX1QJKnc7CisKKwlmb3IgKHcgPSBmaXJzdHdpbjsgdyAhPSBOVUxMICYmIHcgIT0gdGhpcy0+d2luOyB3ID0gV19ORVhUKHcpKQorCSAgICArK2k7CisKKwlpZiAodyA9PSBOVUxMKQorCSAgICBzcHJpbnRmKHJlcHIsIF8oIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iKSwgKGxvbmcpKHNlbGYpKTsKKwllbHNlCisJICAgIHNwcmludGYocmVwciwgXygiPHdpbmRvdyAlZD4iKSwgaSk7CisKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXByKTsKKyAgICB9Cit9CisKKy8qIFdpbmRvdyBsaXN0IG9iamVjdCAtIERlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECit9CitXaW5MaXN0T2JqZWN0OworCitzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgV2luTGlzdEFzU2VxID0geworICAgIChpbnF1aXJ5KQkJV2luTGlzdExlbmd0aCwJICAgIC8qIHNxX2xlbmd0aCwgICAgbGVuKHgpICAgKi8KKyAgICAoYmluYXJ5ZnVuYykJMCwJCSAgICAvKiBzcV9jb25jYXQsICAgIHgreSAgICAgICovCisgICAgKGludGFyZ2Z1bmMpCTAsCQkgICAgLyogc3FfcmVwZWF0LCAgICB4Km4gICAgICAqLworICAgIChpbnRhcmdmdW5jKQlXaW5MaXN0SXRlbSwJICAgIC8qIHNxX2l0ZW0sICAgICAgeFtpXSAgICAgKi8KKyAgICAoaW50aW50YXJnZnVuYykJMCwJCSAgICAvKiBzcV9zbGljZSwgICAgIHhbaTpqXSAgICovCisgICAgKGludG9iamFyZ3Byb2MpCTAsCQkgICAgLyogc3FfYXNzX2l0ZW0sICB4W2ldPXYgICAqLworICAgIChpbnRpbnRvYmphcmdwcm9jKQkwLAkJICAgIC8qIHNxX2Fzc19zbGljZSwgeFtpOmpdPXYgKi8KK307CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgV2luTGlzdFR5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKDApCisgICAgMCwKKyAgICAid2luZG93IGxpc3QiLAorICAgIHNpemVvZihXaW5MaXN0T2JqZWN0KSwKKyAgICAwLAorCisgICAgKGRlc3RydWN0b3IpICAgIDAsCQkJLyogdHBfZGVhbGxvYywJcmVmY291bnQ9PTAgICovCisgICAgKHByaW50ZnVuYykgICAgIDAsCQkJLyogdHBfcHJpbnQsCXByaW50IHggICAgICAqLworICAgIChnZXRhdHRyZnVuYykgICAwLAkJCS8qIHRwX2dldGF0dHIsCXguYXR0cgkgICAgICovCisgICAgKHNldGF0dHJmdW5jKSAgIDAsCQkJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgMCwJCQkvKiB0cF9yZXByLAlgeGAsIHByaW50IHggKi8KKworICAgIDAsCQkgICAgLyogYXMgbnVtYmVyICovCisgICAgJldpbkxpc3RBc1NlcSwgIC8qIGFzIHNlcXVlbmNlICovCisgICAgMCwJCSAgICAvKiBhcyBtYXBwaW5nICovCisKKyAgICAoaGFzaGZ1bmMpIDAsCQkJLyogdHBfaGFzaCwgZGljdCh4KSAqLworICAgICh0ZXJuYXJ5ZnVuYykgMCwJCQkvKiB0cF9jYWxsLCB4KCkgICAgICovCisgICAgKHJlcHJmdW5jKSAwLAkJCS8qIHRwX3N0ciwgIHN0cih4KSAgKi8KK307CisKKy8qIFdpbmRvdyBsaXN0IG9iamVjdCAtIEltcGxlbWVudGF0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBpbnQKK1dpbkxpc3RMZW5ndGgoUHlPYmplY3QgKnNlbGYpCit7CisgICAgd2luX1QJKncgPSBmaXJzdHdpbjsKKyAgICBpbnQJCW4gPSAwOworCisgICAgd2hpbGUgKHcpCisgICAgeworCSsrbjsKKwl3ID0gV19ORVhUKHcpOworICAgIH0KKworICAgIHJldHVybiBuOworfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgUHlPYmplY3QgKgorV2luTGlzdEl0ZW0oUHlPYmplY3QgKnNlbGYsIGludCBuKQoreworICAgIHdpbl9UICp3OworCisgICAgZm9yICh3ID0gZmlyc3R3aW47IHc7IHcgPSBXX05FWFQodyksIC0tbikKKwlpZiAobiA9PSAwKQorCSAgICByZXR1cm4gV2luZG93TmV3KHcpOworCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsIF8oIm5vIHN1Y2ggd2luZG93IikpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBDdXJyZW50IGl0ZW1zIG9iamVjdCAtIERlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECit9CitDdXJyZW50T2JqZWN0OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IEN1cnJlbnRUeXBlID0geworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgwKQorICAgIDAsCisgICAgImN1cnJlbnQgZGF0YSIsCisgICAgc2l6ZW9mKEN1cnJlbnRPYmplY3QpLAorICAgIDAsCisKKyAgICAoZGVzdHJ1Y3RvcikgICAgMCwJCQkvKiB0cF9kZWFsbG9jLAlyZWZjb3VudD09MCAgKi8KKyAgICAocHJpbnRmdW5jKSAgICAgMCwJCQkvKiB0cF9wcmludCwJcHJpbnQgeCAgICAgICovCisgICAgKGdldGF0dHJmdW5jKSAgIEN1cnJlbnRHZXRhdHRyLAkvKiB0cF9nZXRhdHRyLAl4LmF0dHIJICAgICAqLworICAgIChzZXRhdHRyZnVuYykgICBDdXJyZW50U2V0YXR0ciwJLyogdHBfc2V0YXR0ciwJeC5hdHRyPXYgICAgICovCisgICAgKGNtcGZ1bmMpCSAgICAwLAkJCS8qIHRwX2NvbXBhcmUsCXg+eQkgICAgICovCisgICAgKHJlcHJmdW5jKQkgICAgMCwJCQkvKiB0cF9yZXByLAlgeGAsIHByaW50IHggKi8KKworICAgIDAsCQkgICAgLyogYXMgbnVtYmVyICovCisgICAgMCwJCSAgICAvKiBhcyBzZXF1ZW5jZSAqLworICAgIDAsCQkgICAgLyogYXMgbWFwcGluZyAqLworCisgICAgKGhhc2hmdW5jKSAwLAkJCS8qIHRwX2hhc2gsIGRpY3QoeCkgKi8KKyAgICAodGVybmFyeWZ1bmMpIDAsCQkJLyogdHBfY2FsbCwgeCgpICAgICAqLworICAgIChyZXByZnVuYykgMCwJCQkvKiB0cF9zdHIsICBzdHIoeCkgICovCit9OworCisvKiBDdXJyZW50IGl0ZW1zIG9iamVjdCAtIEltcGxlbWVudGF0aW9uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBQeU9iamVjdCAqCitDdXJyZW50R2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAoc3RyY21wKG5hbWUsICJidWZmZXIiKSA9PSAwKQorCXJldHVybiAoUHlPYmplY3QgKilCdWZmZXJOZXcoY3VyYnVmKTsKKyAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIndpbmRvdyIpID09IDApCisJcmV0dXJuIChQeU9iamVjdCAqKVdpbmRvd05ldyhjdXJ3aW4pOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAibGluZSIpID09IDApCisJcmV0dXJuIEdldEJ1ZmZlckxpbmUoY3VyYnVmLCAoaW50KWN1cndpbi0+d19jdXJzb3IubG51bSk7CisgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJyYW5nZSIpID09IDApCisJcmV0dXJuIFJhbmdlTmV3KGN1cmJ1ZiwgUmFuZ2VTdGFydCwgUmFuZ2VFbmQpOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCJfX21lbWJlcnNfXyIpID09IDApCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIltzc3NzXSIsICJidWZmZXIiLCAid2luZG93IiwgImxpbmUiLCAicmFuZ2UiKTsKKyAgICBlbHNlCisgICAgeworCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgaW50CitDdXJyZW50U2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQoreworICAgIGlmIChzdHJjbXAobmFtZSwgImxpbmUiKSA9PSAwKQorICAgIHsKKwlpZiAoU2V0QnVmZmVyTGluZShjdXJidWYsIChpbnQpY3Vyd2luLT53X2N1cnNvci5sbnVtLCB2YWx1ZSwgTlVMTCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIC0xOworCisJcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKwlyZXR1cm4gLTE7CisgICAgfQorfQorCisvKiBFeHRlcm5hbCBpbnRlcmZhY2UKKyAqLworCisgICAgdm9pZAorcHl0aG9uX2J1ZmZlcl9mcmVlKGJ1Zl9UICpidWYpCit7CisgICAgaWYgKGJ1Zi0+cHl0aG9uX3JlZikKKyAgICB7CisJQnVmZmVyT2JqZWN0ICpicCA9IGJ1Zi0+cHl0aG9uX3JlZjsKKwlicC0+YnVmID0gSU5WQUxJRF9CVUZGRVJfVkFMVUU7CisJYnVmLT5weXRob25fcmVmID0gTlVMTDsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitweXRob25fd2luZG93X2ZyZWUod2luX1QgKndpbikKK3sKKyAgICBpZiAod2luLT5weXRob25fcmVmKQorICAgIHsKKwlXaW5kb3dPYmplY3QgKndwID0gd2luLT5weXRob25fcmVmOworCXdwLT53aW4gPSBJTlZBTElEX1dJTkRPV19WQUxVRTsKKwl3aW4tPnB5dGhvbl9yZWYgPSBOVUxMOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgQnVmTGlzdE9iamVjdCBUaGVCdWZmZXJMaXN0ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJkJ1Zkxpc3RUeXBlKQorfTsKKworc3RhdGljIFdpbkxpc3RPYmplY3QgVGhlV2luZG93TGlzdCA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZXaW5MaXN0VHlwZSkKK307CisKK3N0YXRpYyBDdXJyZW50T2JqZWN0IFRoZUN1cnJlbnQgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmQ3VycmVudFR5cGUpCit9OworCisgICAgc3RhdGljIGludAorUHl0aG9uTW9kX0luaXQodm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbW9kOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIHN0YXRpYyBjaGFyICooYXJndlsyXSkgPSB7IiIsIE5VTEx9OworCisgICAgLyogRml4dXBzLi4uICovCisgICAgQnVmZmVyVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFJhbmdlVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFdpbmRvd1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBCdWZMaXN0VHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFdpbkxpc3RUeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ3VycmVudFR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKworICAgIC8qIFNldCBzeXMuYXJndltdIHRvIGF2b2lkIGEgY3Jhc2ggaW4gd2FybigpLiAqLworICAgIFB5U3lzX1NldEFyZ3YoMSwgYXJndik7CisKKyAgICBtb2QgPSBQeV9Jbml0TW9kdWxlKCJ2aW0iLCBWaW1NZXRob2RzKTsKKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOworCisgICAgVmltRXJyb3IgPSBQeV9CdWlsZFZhbHVlKCJzIiwgInZpbS5lcnJvciIpOworCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImVycm9yIiwgVmltRXJyb3IpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJidWZmZXJzIiwgKFB5T2JqZWN0ICopKCZUaGVCdWZmZXJMaXN0KSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImN1cnJlbnQiLCAoUHlPYmplY3QgKikoJlRoZUN1cnJlbnQpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAid2luZG93cyIsIChQeU9iamVjdCAqKSgmVGhlV2luZG93TGlzdCkpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiA0LiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdGhlIGludGVyZmFjZSBiZXR3ZWVuIFZpbSBhbmQgUHl0aG9uLgorICovCisKKy8qIEdldCBhIGxpbmUgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gVGhlIGxpbmUgbnVtYmVyIGlzCisgKiBpbiBWaW0gZm9ybWF0ICgxLWJhc2VkKS4gVGhlIGxpbmUgaXMgcmV0dXJuZWQgYXMgYSBQeXRob24KKyAqIHN0cmluZyBvYmplY3QuCisgKi8KKyAgICBzdGF0aWMgUHlPYmplY3QgKgorR2V0QnVmZmVyTGluZShidWZfVCAqYnVmLCBpbnQgbikKK3sKKyAgICByZXR1cm4gTGluZVRvU3RyaW5nKChjaGFyICopbWxfZ2V0X2J1ZihidWYsIChsaW5lbnJfVCluLCBGQUxTRSkpOworfQorCisvKiBHZXQgYSBsaXN0IG9mIGxpbmVzIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuIFRoZSBsaW5lIG51bWJlcnMKKyAqIGFyZSBpbiBWaW0gZm9ybWF0ICgxLWJhc2VkKS4gVGhlIHJhbmdlIGlzIGZyb20gbG8gdXAgdG8sIGJ1dCBub3QKKyAqIGluY2x1ZGluZywgaGkuIFRoZSBsaXN0IGlzIHJldHVybmVkIGFzIGEgUHl0aG9uIGxpc3Qgb2Ygc3RyaW5nIG9iamVjdHMuCisgKi8KKyAgICBzdGF0aWMgUHlPYmplY3QgKgorR2V0QnVmZmVyTGluZUxpc3QoYnVmX1QgKmJ1ZiwgaW50IGxvLCBpbnQgaGkpCit7CisgICAgaW50IGk7CisgICAgaW50IG4gPSBoaSAtIGxvOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhuKTsKKworICAgIGlmIChsaXN0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorICAgIHsKKwlQeU9iamVjdCAqc3RyID0gTGluZVRvU3RyaW5nKChjaGFyICopbWxfZ2V0X2J1ZihidWYsIChsaW5lbnJfVCkobG8raSksIEZBTFNFKSk7CisKKwkvKiBFcnJvciBjaGVjayAtIHdhcyB0aGUgUHl0aG9uIHN0cmluZyBjcmVhdGlvbiBPSz8gKi8KKwlpZiAoc3RyID09IE5VTEwpCisJeworCSAgICBQeV9ERUNSRUYobGlzdCk7CisJICAgIHJldHVybiBOVUxMOworCX0KKworCS8qIFNldCB0aGUgbGlzdCBpdGVtICovCisJaWYgKFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHN0cikpCisJeworCSAgICBQeV9ERUNSRUYoc3RyKTsKKwkgICAgUHlfREVDUkVGKGxpc3QpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgLyogVGhlIG93bmVyc2hpcCBvZiB0aGUgUHl0aG9uIGxpc3QgaXMgcGFzc2VkIHRvIHRoZSBjYWxsZXIgKGllLAorICAgICAqIHRoZSBjYWxsZXIgc2hvdWxkIFB5X0RFQ1JFRigpIHRoZSBvYmplY3Qgd2hlbiBpdCBpcyBmaW5pc2hlZAorICAgICAqIHdpdGggaXQpLgorICAgICAqLworCisgICAgcmV0dXJuIGxpc3Q7Cit9CisKKy8qCisgKiBDaGVjayBpZiBkZWxldGluZyBsaW5lcyBtYWRlIHRoZSBjdXJzb3IgcG9zaXRpb24gaW52YWxpZC4KKyAqIENoYW5nZWQgdGhlIGxpbmVzIGZyb20gImxvIiB0byAiaGkiIGFuZCBhZGRlZCAiZXh0cmEiIGxpbmVzIChuZWdhdGl2ZSBpZgorICogZGVsZXRlZCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHlfZml4X2N1cnNvcihpbnQgbG8sIGludCBoaSwgaW50IGV4dHJhKQoreworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPj0gbG8pCisgICAgeworCS8qIEFkanVzdCB0aGUgY3Vyc29yIHBvc2l0aW9uIGlmIGl0J3MgaW4vYWZ0ZXIgdGhlIGNoYW5nZWQKKwkgKiBsaW5lcy4gKi8KKwlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID49IGhpKQorCXsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtICs9IGV4dHJhOworCSAgICBjaGVja19jdXJzb3JfY29sKCk7CisJfQorCWVsc2UgaWYgKGV4dHJhIDwgMCkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxvOworCSAgICBjaGVja19jdXJzb3IoKTsKKwl9CisJY2hhbmdlZF9jbGluZV9iZWZfY3VycygpOworICAgIH0KKyAgICBpbnZhbGlkYXRlX2JvdGxpbmUoKTsKK30KKworLyogUmVwbGFjZSBhIGxpbmUgaW4gdGhlIHNwZWNpZmllZCBidWZmZXIuIFRoZSBsaW5lIG51bWJlciBpcworICogaW4gVmltIGZvcm1hdCAoMS1iYXNlZCkuIFRoZSByZXBsYWNlbWVudCBsaW5lIGlzIGdpdmVuIGFzCisgKiBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiBUaGUgb2JqZWN0IGlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5CisgKiBhbmQgY29ycmVjdCBmb3JtYXQuIEVycm9ycyBhcmUgcmV0dXJuZWQgYXMgYSB2YWx1ZSBvZiBGQUlMLgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSyBvbiBzdWNjZXNzLgorICogSWYgT0sgaXMgcmV0dXJuZWQgYW5kIGxlbl9jaGFuZ2UgaXMgbm90IE5VTEwsICpsZW5fY2hhbmdlCisgKiBpcyBzZXQgdG8gdGhlIGNoYW5nZSBpbiB0aGUgYnVmZmVyIGxlbmd0aC4KKyAqLworICAgIHN0YXRpYyBpbnQKK1NldEJ1ZmZlckxpbmUoYnVmX1QgKmJ1ZiwgaW50IG4sIFB5T2JqZWN0ICpsaW5lLCBpbnQgKmxlbl9jaGFuZ2UpCit7CisgICAgLyogRmlyc3Qgb2YgYWxsLCB3ZSBjaGVjayB0aGUgdGhwZSBvZiB0aGUgc3VwcGxpZWQgUHl0aG9uIG9iamVjdC4KKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6CisgICAgICoJICAxLiBOVUxMLCBvciBOb25lIC0gdGhpcyBpcyBhIGRlbGV0aW9uLgorICAgICAqCSAgMi4gQSBzdHJpbmcJICAgLSB0aGlzIGlzIGEgcmVwbGFjZW1lbnQuCisgICAgICoJICAzLiBBbnl0aGluZyBlbHNlIC0gdGhpcyBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBpZiAobGluZSA9PSBQeV9Ob25lIHx8IGxpbmUgPT0gTlVMTCkKKyAgICB7CisJYnVmX1QgKnNhdmVidWYgPSBjdXJidWY7CisKKwlQeUVycl9DbGVhcigpOworCWN1cmJ1ZiA9IGJ1ZjsKKworCWlmICh1X3NhdmVkZWwoKGxpbmVucl9UKW4sIDFMKSA9PSBGQUlMKQorCSAgICBQeUVycl9TZXRWaW0oXygiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIpKTsKKwllbHNlIGlmIChtbF9kZWxldGUoKGxpbmVucl9UKW4sIEZBTFNFKSA9PSBGQUlMKQorCSAgICBQeUVycl9TZXRWaW0oXygiY2Fubm90IGRlbGV0ZSBsaW5lIikpOworCWVsc2UKKwl7CisJICAgIGRlbGV0ZWRfbGluZXNfbWFyaygobGluZW5yX1QpbiwgMUwpOworCSAgICBpZiAoYnVmID09IGN1cndpbi0+d19idWZmZXIpCisJCXB5X2ZpeF9jdXJzb3IobiwgbiArIDEsIC0xKTsKKwl9CisKKwljdXJidWYgPSBzYXZlYnVmOworCisJaWYgKFB5RXJyX09jY3VycmVkKCkgfHwgVmltRXJyb3JDaGVjaygpKQorCSAgICByZXR1cm4gRkFJTDsKKworCWlmIChsZW5fY2hhbmdlKQorCSAgICAqbGVuX2NoYW5nZSA9IC0xOworCisJcmV0dXJuIE9LOworICAgIH0KKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhsaW5lKSkKKyAgICB7CisJY2hhciAqc2F2ZSA9IFN0cmluZ1RvTGluZShsaW5lKTsKKwlidWZfVCAqc2F2ZWJ1ZiA9IGN1cmJ1ZjsKKworCWlmIChzYXZlID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCisJLyogV2UgZG8gbm90IG5lZWQgdG8gZnJlZSAic2F2ZSIgaWYgbWxfcmVwbGFjZSgpIGNvbnN1bWVzIGl0LiAqLworCVB5RXJyX0NsZWFyKCk7CisJY3VyYnVmID0gYnVmOworCisJaWYgKHVfc2F2ZXN1YigobGluZW5yX1QpbikgPT0gRkFJTCkKKwl7CisJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIikpOworCSAgICB2aW1fZnJlZShzYXZlKTsKKwl9CisJZWxzZSBpZiAobWxfcmVwbGFjZSgobGluZW5yX1QpbiwgKGNoYXJfdSAqKXNhdmUsIEZBTFNFKSA9PSBGQUlMKQorCXsKKwkgICAgUHlFcnJfU2V0VmltKF8oImNhbm5vdCByZXBsYWNlIGxpbmUiKSk7CisJICAgIHZpbV9mcmVlKHNhdmUpOworCX0KKwllbHNlCisJICAgIGNoYW5nZWRfYnl0ZXMoKGxpbmVucl9UKW4sIDApOworCisJY3VyYnVmID0gc2F2ZWJ1ZjsKKworCWlmIChQeUVycl9PY2N1cnJlZCgpIHx8IFZpbUVycm9yQ2hlY2soKSkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAobGVuX2NoYW5nZSkKKwkgICAgKmxlbl9jaGFuZ2UgPSAwOworCisJcmV0dXJuIE9LOworICAgIH0KKyAgICBlbHNlCisgICAgeworCVB5RXJyX0JhZEFyZ3VtZW50KCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorfQorCisvKiBSZXBsYWNlIGEgcmFuZ2Ugb2YgbGluZXMgaW4gdGhlIHNwZWNpZmllZCBidWZmZXIuIFRoZSBsaW5lIG51bWJlcnMgYXJlIGluCisgKiBWaW0gZm9ybWF0ICgxLWJhc2VkKS4gVGhlIHJhbmdlIGlzIGZyb20gbG8gdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBoaS4KKyAqIFRoZSByZXBsYWNlbWVudCBsaW5lcyBhcmUgZ2l2ZW4gYXMgYSBQeXRob24gbGlzdCBvZiBzdHJpbmcgb2JqZWN0cy4gVGhlCisgKiBsaXN0IGlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGFuZCBjb3JyZWN0IGZvcm1hdC4gRXJyb3JzIGFyZSByZXR1cm5lZCBhcyBhCisgKiB2YWx1ZSBvZiBGQUlMLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBPSyBvbiBzdWNjZXNzLgorICogSWYgT0sgaXMgcmV0dXJuZWQgYW5kIGxlbl9jaGFuZ2UgaXMgbm90IE5VTEwsICpsZW5fY2hhbmdlCisgKiBpcyBzZXQgdG8gdGhlIGNoYW5nZSBpbiB0aGUgYnVmZmVyIGxlbmd0aC4KKyAqLworICAgIHN0YXRpYyBpbnQKK1NldEJ1ZmZlckxpbmVMaXN0KGJ1Zl9UICpidWYsIGludCBsbywgaW50IGhpLCBQeU9iamVjdCAqbGlzdCwgaW50ICpsZW5fY2hhbmdlKQoreworICAgIC8qIEZpcnN0IG9mIGFsbCwgd2UgY2hlY2sgdGhlIHRocGUgb2YgdGhlIHN1cHBsaWVkIFB5dGhvbiBvYmplY3QuCisgICAgICogVGhlcmUgYXJlIHRocmVlIGNhc2VzOgorICAgICAqCSAgMS4gTlVMTCwgb3IgTm9uZSAtIHRoaXMgaXMgYSBkZWxldGlvbi4KKyAgICAgKgkgIDIuIEEgbGlzdAkgICAtIHRoaXMgaXMgYSByZXBsYWNlbWVudC4KKyAgICAgKgkgIDMuIEFueXRoaW5nIGVsc2UgLSB0aGlzIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIGlmIChsaXN0ID09IFB5X05vbmUgfHwgbGlzdCA9PSBOVUxMKQorICAgIHsKKwlpbnQJaTsKKwlpbnQJbiA9IGhpIC0gbG87CisJYnVmX1QJKnNhdmVidWYgPSBjdXJidWY7CisKKwlQeUVycl9DbGVhcigpOworCWN1cmJ1ZiA9IGJ1ZjsKKworCWlmICh1X3NhdmVkZWwoKGxpbmVucl9UKWxvLCAobG9uZyluKSA9PSBGQUlMKQorCSAgICBQeUVycl9TZXRWaW0oXygiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIpKTsKKwllbHNlCisJeworCSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCSAgICB7CisJCWlmIChtbF9kZWxldGUoKGxpbmVucl9UKWxvLCBGQUxTRSkgPT0gRkFJTCkKKwkJeworCQkgICAgUHlFcnJfU2V0VmltKF8oImNhbm5vdCBkZWxldGUgbGluZSIpKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgZGVsZXRlZF9saW5lc19tYXJrKChsaW5lbnJfVClsbywgKGxvbmcpaSk7CisKKwkgICAgaWYgKGJ1ZiA9PSBjdXJ3aW4tPndfYnVmZmVyKQorCQlweV9maXhfY3Vyc29yKGxvLCBoaSwgLW4pOworCX0KKworCWN1cmJ1ZiA9IHNhdmVidWY7CisKKwlpZiAoUHlFcnJfT2NjdXJyZWQoKSB8fCBWaW1FcnJvckNoZWNrKCkpCisJICAgIHJldHVybiBGQUlMOworCisJaWYgKGxlbl9jaGFuZ2UpCisJICAgICpsZW5fY2hhbmdlID0gLW47CisKKwlyZXR1cm4gT0s7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayhsaXN0KSkKKyAgICB7CisJaW50CWk7CisJaW50CW5ld19sZW4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKKwlpbnQJb2xkX2xlbiA9IGhpIC0gbG87CisJaW50CWV4dHJhID0gMDsJLyogbGluZXMgYWRkZWQgdG8gdGV4dCwgY2FuIGJlIG5lZ2F0aXZlICovCisJY2hhcgkqKmFycmF5OworCWJ1Zl9UCSpzYXZlYnVmOworCisJaWYgKG5ld19sZW4gPT0gMCkJLyogYXZvaWQgYWxsb2NhdGluZyB6ZXJvIGJ5dGVzICovCisJICAgIGFycmF5ID0gTlVMTDsKKwllbHNlCisJeworCSAgICBhcnJheSA9IChjaGFyICoqKWFsbG9jKCh1bnNpZ25lZCkobmV3X2xlbiAqIHNpemVvZihjaGFyICopKSk7CisJICAgIGlmIChhcnJheSA9PSBOVUxMKQorCSAgICB7CisJCVB5RXJyX05vTWVtb3J5KCk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ld19sZW47ICsraSkKKwl7CisJICAgIFB5T2JqZWN0ICpsaW5lID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisKKwkgICAgYXJyYXlbaV0gPSBTdHJpbmdUb0xpbmUobGluZSk7CisJICAgIGlmIChhcnJheVtpXSA9PSBOVUxMKQorCSAgICB7CisJCXdoaWxlIChpKQorCQkgICAgdmltX2ZyZWUoYXJyYXlbLS1pXSk7CisJCXZpbV9mcmVlKGFycmF5KTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwl9CisKKwlzYXZlYnVmID0gY3VyYnVmOworCisJUHlFcnJfQ2xlYXIoKTsKKwljdXJidWYgPSBidWY7CisKKwlpZiAodV9zYXZlKChsaW5lbnJfVCkobG8tMSksIChsaW5lbnJfVCloaSkgPT0gRkFJTCkKKwkgICAgUHlFcnJfU2V0VmltKF8oImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iKSk7CisKKwkvKiBJZiB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXMgcmVkdWNpbmcgKGllLCBuZXdfbGVuIDwgb2xkX2xlbikgd2UKKwkgKiBuZWVkIHRvIGRlbGV0ZSBzb21lIG9sZF9sZW4uIFdlIGRvIHRoaXMgYXQgdGhlIHN0YXJ0LCBieQorCSAqIHJlcGVhdGVkbHkgZGVsZXRpbmcgbGluZSAibG8iLgorCSAqLworCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbGVuIC0gbmV3X2xlbjsgKytpKQorCQlpZiAobWxfZGVsZXRlKChsaW5lbnJfVClsbywgRkFMU0UpID09IEZBSUwpCisJCXsKKwkJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3QgZGVsZXRlIGxpbmUiKSk7CisJCSAgICBicmVhazsKKwkJfQorCSAgICBleHRyYSAtPSBpOworCX0KKworCS8qIEZvciBhcyBsb25nIGFzIHBvc3NpYmxlLCByZXBsYWNlIHRoZSBleGlzdGluZyBvbGRfbGVuIHdpdGggdGhlCisJICogbmV3IG9sZF9sZW4uIFRoaXMgaXMgYSBtb3JlIGVmZmljaWVudCBvcGVyYXRpb24sIGFzIGl0IHJlcXVpcmVzCisJICogbGVzcyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZy4KKwkgKi8KKwlpZiAoIVB5RXJyX09jY3VycmVkKCkpCisJeworCSAgICBmb3IgKGkgPSAwOyBpIDwgb2xkX2xlbiAmJiBpIDwgbmV3X2xlbjsgKytpKQorCQlpZiAobWxfcmVwbGFjZSgobGluZW5yX1QpKGxvK2kpLCAoY2hhcl91ICopYXJyYXlbaV0sIEZBTFNFKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCQl7CisJCSAgICBQeUVycl9TZXRWaW0oXygiY2Fubm90IHJlcGxhY2UgbGluZSIpKTsKKwkJICAgIGJyZWFrOworCQl9CisJfQorCWVsc2UKKwkgICAgaSA9IDA7CisKKwkvKiBOb3cgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IHRoZSByZW1haW5pbmcgbmV3IG9sZF9sZW4uIElmIHdlIGRvLCB3ZQorCSAqIG11c3QgZnJlZSB0aGUgc3RyaW5ncyBhcyB3ZSBmaW5pc2ggd2l0aCB0aGVtICh3ZSBjYW4ndCBwYXNzIHRoZQorCSAqIHJlc3BvbnNpYmlsaXR5IHRvIHZpbSBpbiB0aGlzIGNhc2UpLgorCSAqLworCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKKwl7CisJICAgIHdoaWxlIChpIDwgbmV3X2xlbikKKwkgICAgeworCQlpZiAobWxfYXBwZW5kKChsaW5lbnJfVCkobG8gKyBpIC0gMSksCisJCQkJCShjaGFyX3UgKilhcnJheVtpXSwgMCwgRkFMU0UpID09IEZBSUwpCisJCXsKKwkJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3QgaW5zZXJ0IGxpbmUiKSk7CisJCSAgICBicmVhazsKKwkJfQorCQl2aW1fZnJlZShhcnJheVtpXSk7CisJCSsraTsKKwkJKytleHRyYTsKKwkgICAgfQorCX0KKworCS8qIEZyZWUgYW55IGxlZnQtb3ZlciBvbGRfbGVuLCBhcyBhIHJlc3VsdCBvZiBhbiBlcnJvciAqLworCXdoaWxlIChpIDwgbmV3X2xlbikKKwl7CisJICAgIHZpbV9mcmVlKGFycmF5W2ldKTsKKwkgICAgKytpOworCX0KKworCS8qIEZyZWUgdGhlIGFycmF5IG9mIG9sZF9sZW4uIEFsbCBvZiBpdHMgY29udGVudHMgaGF2ZSBub3cKKwkgKiBiZWVuIGRlYWx0IHdpdGggKGVpdGhlciBmcmVlZCwgb3IgdGhlIHJlc3BvbnNpYmlsaXR5IHBhc3NlZAorCSAqIHRvIHZpbS4KKwkgKi8KKwl2aW1fZnJlZShhcnJheSk7CisKKwkvKiBBZGp1c3QgbWFya3MuIEludmFsaWRhdGUgYW55IHdoaWNoIGxpZSBpbiB0aGUKKwkgKiBjaGFuZ2VkIHJhbmdlLCBhbmQgbW92ZSBhbnkgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyLgorCSAqLworCW1hcmtfYWRqdXN0KChsaW5lbnJfVClsbywgKGxpbmVucl9UKShoaSAtIDEpLAorCQkJCQkJICAobG9uZylNQVhMTlVNLCAobG9uZylleHRyYSk7CisJY2hhbmdlZF9saW5lcygobGluZW5yX1QpbG8sIDAsIChsaW5lbnJfVCloaSwgKGxvbmcpZXh0cmEpOworCisJaWYgKGJ1ZiA9PSBjdXJ3aW4tPndfYnVmZmVyKQorCSAgICBweV9maXhfY3Vyc29yKGxvLCBoaSwgZXh0cmEpOworCisJY3VyYnVmID0gc2F2ZWJ1ZjsKKworCWlmIChQeUVycl9PY2N1cnJlZCgpIHx8IFZpbUVycm9yQ2hlY2soKSkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAobGVuX2NoYW5nZSkKKwkgICAgKmxlbl9jaGFuZ2UgPSBuZXdfbGVuIC0gb2xkX2xlbjsKKworCXJldHVybiBPSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlQeUVycl9CYWRBcmd1bWVudCgpOworCXJldHVybiBGQUlMOworICAgIH0KK30KKworLyogSW5zZXJ0IGEgbnVtYmVyIG9mIGxpbmVzIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIgYWZ0ZXIgdGhlIHNwZWNpZmVkIGxpbmUuCisgKiBUaGUgbGluZSBudW1iZXIgaXMgaW4gVmltIGZvcm1hdCAoMS1iYXNlZCkuIFRoZSBsaW5lcyB0byBiZSBpbnNlcnRlZCBhcmUKKyAqIGdpdmVuIGFzIGEgUHl0aG9uIGxpc3Qgb2Ygc3RyaW5nIG9iamVjdHMgb3IgYXMgYSBzaW5nbGUgc3RyaW5nLiBUaGUgbGluZXMKKyAqIHRvIGJlIGFkZGVkIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eSBhbmQgY29ycmVjdCBmb3JtYXQuIEVycm9ycyBhcmUKKyAqIHJldHVybmVkIGFzIGEgdmFsdWUgb2YgRkFJTC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgT0sgb24gc3VjY2Vzcy4KKyAqIElmIE9LIGlzIHJldHVybmVkIGFuZCBsZW5fY2hhbmdlIGlzIG5vdCBOVUxMLCAqbGVuX2NoYW5nZQorICogaXMgc2V0IHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGJ1ZmZlciBsZW5ndGguCisgKi8KKyAgICBzdGF0aWMgaW50CitJbnNlcnRCdWZmZXJMaW5lcyhidWZfVCAqYnVmLCBpbnQgbiwgUHlPYmplY3QgKmxpbmVzLCBpbnQgKmxlbl9jaGFuZ2UpCit7CisgICAgLyogRmlyc3Qgb2YgYWxsLCB3ZSBjaGVjayB0aGUgdHlwZSBvZiB0aGUgc3VwcGxpZWQgUHl0aG9uIG9iamVjdC4KKyAgICAgKiBJdCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbGlzdCwgb3IgdGhlIGNhbGwgaXMgaW4gZXJyb3IuCisgICAgICovCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGxpbmVzKSkKKyAgICB7CisJY2hhcgkqc3RyID0gU3RyaW5nVG9MaW5lKGxpbmVzKTsKKwlidWZfVAkqc2F2ZWJ1ZjsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlzYXZlYnVmID0gY3VyYnVmOworCisJUHlFcnJfQ2xlYXIoKTsKKwljdXJidWYgPSBidWY7CisKKwlpZiAodV9zYXZlKChsaW5lbnJfVCluLCAobGluZW5yX1QpKG4rMSkpID09IEZBSUwpCisJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIikpOworCWVsc2UgaWYgKG1sX2FwcGVuZCgobGluZW5yX1QpbiwgKGNoYXJfdSAqKXN0ciwgMCwgRkFMU0UpID09IEZBSUwpCisJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3QgaW5zZXJ0IGxpbmUiKSk7CisJZWxzZQorCSAgICBhcHBlbmRlZF9saW5lc19tYXJrKChsaW5lbnJfVCluLCAxTCk7CisKKwl2aW1fZnJlZShzdHIpOworCWN1cmJ1ZiA9IHNhdmVidWY7CisJdXBkYXRlX3NjcmVlbihWQUxJRCk7CisKKwlpZiAoUHlFcnJfT2NjdXJyZWQoKSB8fCBWaW1FcnJvckNoZWNrKCkpCisJICAgIHJldHVybiBGQUlMOworCisJaWYgKGxlbl9jaGFuZ2UpCisJICAgICpsZW5fY2hhbmdlID0gMTsKKworCXJldHVybiBPSzsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGxpbmVzKSkKKyAgICB7CisJaW50CWk7CisJaW50CXNpemUgPSBQeUxpc3RfU2l6ZShsaW5lcyk7CisJY2hhcgkqKmFycmF5OworCWJ1Zl9UCSpzYXZlYnVmOworCisJYXJyYXkgPSAoY2hhciAqKilhbGxvYygodW5zaWduZWQpKHNpemUgKiBzaXplb2YoY2hhciAqKSkpOworCWlmIChhcnJheSA9PSBOVUxMKQorCXsKKwkgICAgUHlFcnJfTm9NZW1vcnkoKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkKKwl7CisJICAgIFB5T2JqZWN0ICpsaW5lID0gUHlMaXN0X0dldEl0ZW0obGluZXMsIGkpOworCSAgICBhcnJheVtpXSA9IFN0cmluZ1RvTGluZShsaW5lKTsKKworCSAgICBpZiAoYXJyYXlbaV0gPT0gTlVMTCkKKwkgICAgeworCQl3aGlsZSAoaSkKKwkJICAgIHZpbV9mcmVlKGFycmF5Wy0taV0pOworCQl2aW1fZnJlZShhcnJheSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJfQorCisJc2F2ZWJ1ZiA9IGN1cmJ1ZjsKKworCVB5RXJyX0NsZWFyKCk7CisJY3VyYnVmID0gYnVmOworCisJaWYgKHVfc2F2ZSgobGluZW5yX1QpbiwgKGxpbmVucl9UKShuICsgMSkpID09IEZBSUwpCisJICAgIFB5RXJyX1NldFZpbShfKCJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIikpOworCWVsc2UKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisJICAgIHsKKwkJaWYgKG1sX2FwcGVuZCgobGluZW5yX1QpKG4gKyBpKSwKKwkJCQkJKGNoYXJfdSAqKWFycmF5W2ldLCAwLCBGQUxTRSkgPT0gRkFJTCkKKwkJeworCQkgICAgUHlFcnJfU2V0VmltKF8oImNhbm5vdCBpbnNlcnQgbGluZSIpKTsKKworCQkgICAgLyogRnJlZSB0aGUgcmVzdCBvZiB0aGUgbGluZXMgKi8KKwkJICAgIHdoaWxlIChpIDwgc2l6ZSkKKwkJCXZpbV9mcmVlKGFycmF5W2krK10pOworCisJCSAgICBicmVhazsKKwkJfQorCQl2aW1fZnJlZShhcnJheVtpXSk7CisJICAgIH0KKwkgICAgaWYgKGkgPiAwKQorCQlhcHBlbmRlZF9saW5lc19tYXJrKChsaW5lbnJfVCluLCAobG9uZylpKTsKKwl9CisKKwkvKiBGcmVlIHRoZSBhcnJheSBvZiBsaW5lcy4gQWxsIG9mIGl0cyBjb250ZW50cyBoYXZlIG5vdworCSAqIGJlZW4gZnJlZWQuCisJICovCisJdmltX2ZyZWUoYXJyYXkpOworCisJY3VyYnVmID0gc2F2ZWJ1ZjsKKwl1cGRhdGVfc2NyZWVuKFZBTElEKTsKKworCWlmIChQeUVycl9PY2N1cnJlZCgpIHx8IFZpbUVycm9yQ2hlY2soKSkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAobGVuX2NoYW5nZSkKKwkgICAgKmxlbl9jaGFuZ2UgPSBzaXplOworCisJcmV0dXJuIE9LOworICAgIH0KKyAgICBlbHNlCisgICAgeworCVB5RXJyX0JhZEFyZ3VtZW50KCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorfQorCisvKiBDb252ZXJ0IGEgVmltIGxpbmUgaW50byBhIFB5dGhvbiBzdHJpbmcuCisgKiBBbGwgaW50ZXJuYWwgbmV3bGluZXMgYXJlIHJlcGxhY2VkIGJ5IG51bGwgY2hhcmFjdGVycy4KKyAqCisgKiBPbiBlcnJvcnMsIHRoZSBQeXRob24gZXhjZXB0aW9uIGRhdGEgaXMgc2V0LCBhbmQgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworICAgIHN0YXRpYyBQeU9iamVjdCAqCitMaW5lVG9TdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IGxlbiA9IHN0cmxlbihzdHIpOworICAgIGNoYXIgKnA7CisKKyAgICAvKiBBbGxvY2F0ZSBhbiBQeXRob24gc3RyaW5nIG9iamVjdCwgd2l0aCB1bmluaXRpYWxpc2VkIGNvbnRlbnRzLiBXZQorICAgICAqIG11c3QgZG8gaXQgdGhpcyB3YXksIHNvIHRoYXQgd2UgY2FuIG1vZGlmeSB0aGUgc3RyaW5nIGluIHBsYWNlCisgICAgICogbGF0ZXIuIFNlZSB0aGUgUHl0aG9uIHNvdXJjZSwgT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOworCisgICAgd2hpbGUgKCpzdHIpCisgICAgeworCWlmICgqc3RyID09ICdcbicpCisJICAgICpwID0gJ1wwJzsKKwllbHNlCisJICAgICpwID0gKnN0cjsKKworCSsrcDsKKwkrK3N0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBDb252ZXJ0IGEgUHl0aG9uIHN0cmluZyBpbnRvIGEgVmltIGxpbmUuCisgKgorICogVGhlIHJlc3VsdCBpcyBpbiBhbGxvY2F0ZWQgbWVtb3J5LiBBbGwgaW50ZXJuYWwgbnVsbHMgYXJlIHJlcGxhY2VkIGJ5CisgKiBuZXdsaW5lIGNoYXJhY3RlcnMuIEl0IGlzIGFuIGVycm9yIGZvciB0aGUgc3RyaW5nIHRvIGNvbnRhaW4gbmV3bGluZQorICogY2hhcmFjdGVycy4KKyAqCisgKiBPbiBlcnJvcnMsIHRoZSBQeXRob24gZXhjZXB0aW9uIGRhdGEgaXMgc2V0LCBhbmQgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworICAgIHN0YXRpYyBjaGFyICoKK1N0cmluZ1RvTGluZShQeU9iamVjdCAqb2JqKQoreworICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICBjaGFyICpzYXZlOworICAgIGludCBsZW47CisgICAgaW50IGk7CisKKyAgICBpZiAob2JqID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG9iaikpCisgICAgeworCVB5RXJyX0JhZEFyZ3VtZW50KCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKKyAgICBsZW4gPSBQeVN0cmluZ19TaXplKG9iaik7CisKKyAgICAvKiBFcnJvciBjaGVja2luZzogU3RyaW5nIG11c3Qgbm90IGNvbnRhaW4gbmV3bGluZXMsIGFzIHdlCisgICAgICogYXJlIHJlcGxhY2luZyBhIHNpbmdsZSBsaW5lLCBhbmQgd2UgbXVzdCByZXBsYWNlIGl0IHdpdGgKKyAgICAgKiBhIHNpbmdsZSBsaW5lLgorICAgICAqLworICAgIGlmIChtZW1jaHIoc3RyLCAnXG4nLCBsZW4pKQorICAgIHsKKwlQeUVycl9TZXRWaW0oXygic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIikpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHN0cmluZywgd2l0aCBpbnRlcm5hbCBudWxscyByZXBsYWNlZCBieQorICAgICAqIG5ld2xpbmUgY2hhcmFjdGVycywgYXMgaXMgdGhlIHZpbSBjb252ZW50aW9uLgorICAgICAqLworICAgIHNhdmUgPSAoY2hhciAqKWFsbG9jKCh1bnNpZ25lZCkobGVuKzEpKTsKKyAgICBpZiAoc2F2ZSA9PSBOVUxMKQorICAgIHsKKwlQeUVycl9Ob01lbW9yeSgpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICB7CisJaWYgKHN0cltpXSA9PSAnXDAnKQorCSAgICBzYXZlW2ldID0gJ1xuJzsKKwllbHNlCisJICAgIHNhdmVbaV0gPSBzdHJbaV07CisgICAgfQorCisgICAgc2F2ZVtpXSA9ICdcMCc7CisKKyAgICByZXR1cm4gc2F2ZTsKK30KKworLyogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBWaW0gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQsIG9yIGEga2V5Ym9hcmQKKyAqIGludGVycnVwdCBoYXMgYmVlbiBkZXRlY3RlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK1ZpbUVycm9yQ2hlY2sodm9pZCkKK3sKKyAgICBpZiAoZ290X2ludCkKKyAgICB7CisJUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKGRpZF9lbXNnICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgIHsKKwlQeUVycl9TZXROb25lKFZpbUVycm9yKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBEb24ndCBnZW5lcmF0ZSBhIHByb3RvdHlwZSBmb3IgdGhlIG5leHQgZnVuY3Rpb24sIGl0IGdlbmVyYXRlcyBhbiBlcnJvciBvbgorICogbmV3ZXIgUHl0aG9uIHZlcnNpb25zLiAqLworI2lmIFBZVEhPTl9BUElfVkVSU0lPTiA8IDEwMDcgLyogUHl0aG9uIDEuNCAqLyAmJiAhZGVmaW5lZChQUk9UTykKKworICAgIGNoYXIgKgorUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCkKK3sKKyAgICByZXR1cm4gInZpbSI7Cit9CisjZW5kaWYgLyogUHl0aG9uIDEuNCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2lmX3J1YnkuYyBiL3NyYy9pZl9ydWJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmNTA0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pZl9ydWJ5LmMKQEAgLTAsMCArMSw4NjggQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqIFJ1YnkgaW50ZXJmYWNlIGJ5IFNodWdvIE1hZWRhLgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9XSU4zMgorIyBpZiAhZGVmaW5lZChEWU5BTUlDX1JVQllfVkVSKSB8fCAoRFlOQU1JQ19SVUJZX1ZFUiA8IDE4KQorIyAgIGRlZmluZSBOVAorIyBlbmRpZgorIyBpZm5kZWYgRFlOQU1JQ19SVUJZCisjICBkZWZpbmUgSU1QT1JUIC8qIEZvciBzdGF0aWMgZGxsIHVzYWdlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSAqLworIyAgZGVmaW5lIFJVQllFWFRFUk4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgUlVCWUVYVEVSTgorIyBkZWZpbmUgUlVCWUVYVEVSTiBleHRlcm4KKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0cmlja3kuICBJbiBydWJ5LmggdGhlcmUgaXMgKGlubGluZSkgZnVuY3Rpb24gcmJfY2xhc3Nfb2YoKQorICogZGVmaW5pdGlvbi4gIFRoaXMgZnVuY3Rpb24gdXNlIHRoZXNlIHZhcmlhYmxlcy4gIEJ1dCB3ZSB3YW50IGZ1bmN0aW9uIHRvCisgKiB1c2UgZGxsXyogdmFyaWFibGVzLgorICovCisjaWZkZWYgRFlOQU1JQ19SVUJZCisjIGRlZmluZSByYl9jRmFsc2VDbGFzcwkJKCpkbGxfcmJfY0ZhbHNlQ2xhc3MpCisjIGRlZmluZSByYl9jRml4bnVtCQkoKmRsbF9yYl9jRml4bnVtKQorIyBkZWZpbmUgcmJfY05pbENsYXNzCQkoKmRsbF9yYl9jTmlsQ2xhc3MpCisjIGRlZmluZSByYl9jU3ltYm9sCQkoKmRsbF9yYl9jU3ltYm9sKQorIyBkZWZpbmUgcmJfY1RydWVDbGFzcwkJKCpkbGxfcmJfY1RydWVDbGFzcykKKyMgaWYgZGVmaW5lZChEWU5BTUlDX1JVQllfVkVSKSAmJiBEWU5BTUlDX1JVQllfVkVSID49IDE4CisvKgorICogT24gdmVyIDEuOCwgYWxsIFJ1YnkgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCB3aXRoICJfX2RlY2xzcGNlKGRsbGltcG9ydCkiCisgKiBpbiBydWJ5LmguICBCdXQgaXQgY2F1c2UgdHJvdWJsZSBmb3IgdGhlc2UgdmFyaWFibGVzLCBiZWNhdXNlIGl0IGlzCisgKiBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIFdoZW4gZGVmaW5lZCB0aGlzIFJVQllfRVhQT1JUIGl0IG1vZGlmaWVkIHRvCisgKiAiZXh0ZXJuIiBhbmQgYmUgYWJsZSB0byBhdm9pZCB0aGlzIHByb2JsZW0uCisgKi8KKyMgIGRlZmluZSBSVUJZX0VYUE9SVAorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxydWJ5Lmg+CisKKyN1bmRlZiBFWFRFUk4KKyN1bmRlZiBfCisKKy8qIFRfREFUQSBkZWZpbmVkIGJvdGggYnkgUnVieSBhbmQgTWFjIGhlYWRlciBmaWxlcywgaGFjayBhcm91bmQgaXQuLi4gKi8KKyNpZmRlZiBGRUFUX0dVSV9NQUMKKyMgZGVmaW5lIF9fT1BFTlRSQU5TUE9SVF9fCisjIGRlZmluZSBfX09QRU5UUkFOU1BPUlRQUk9UT0NPTF9fCisjIGRlZmluZSBfX09QRU5UUkFOU1BPUlRQUk9WSURFUlNfXworI2VuZGlmCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZiBkZWZpbmVkKFBST1RPKSAmJiAhZGVmaW5lZChGRUFUX1JVQlkpCisvKiBEZWZpbmUgdGhlc2UgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKyMgZGVmaW5lIFZBTFVFIGludAorIyBkZWZpbmUgUlVCWV9EQVRBX0ZVTkMgaW50CisjZW5kaWYKKworc3RhdGljIGludCBydWJ5X2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyBWQUxVRSBvYmp0Ymw7CisKK3N0YXRpYyBWQUxVRSBtVklNOworc3RhdGljIFZBTFVFIGNCdWZmZXI7CitzdGF0aWMgVkFMVUUgY1ZpbVdpbmRvdzsKK3N0YXRpYyBWQUxVRSBlRGVsZXRlZEJ1ZmZlckVycm9yOworc3RhdGljIFZBTFVFIGVEZWxldGVkV2luZG93RXJyb3I7CisKK3N0YXRpYyBpbnQgZW5zdXJlX3J1YnlfaW5pdGlhbGl6ZWQodm9pZCk7CitzdGF0aWMgdm9pZCBlcnJvcl9wcmludChpbnQpOworc3RhdGljIHZvaWQgcnVieV9pb19pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcnVieV92aW1faW5pdCh2b2lkKTsKKworI2lmIGRlZmluZWQoRFlOQU1JQ19SVUJZKSB8fCBkZWZpbmVkKFBST1RPKQorI2lmZGVmIFBST1RPCisjIGRlZmluZSBISU5TVEFOQ0UgaW50CQkvKiBmb3IgZ2VuZXJhdGluZyBwcm90b3R5cGVzICovCisjZW5kaWYKKworLyoKKyAqIFdyYXBwZXIgZGVmaW5lcworICovCisjZGVmaW5lIHJiX2Fzc29jX25ldwkJCWRsbF9yYl9hc3NvY19uZXcKKyNkZWZpbmUgcmJfY09iamVjdAkJCSgqZGxsX3JiX2NPYmplY3QpCisjZGVmaW5lIHJiX2NoZWNrX3R5cGUJCQlkbGxfcmJfY2hlY2tfdHlwZQorI2RlZmluZSByYl9jbGFzc19wYXRoCQkJZGxsX3JiX2NsYXNzX3BhdGgKKyNkZWZpbmUgcmJfZGF0YV9vYmplY3RfYWxsb2MJCWRsbF9yYl9kYXRhX29iamVjdF9hbGxvYworI2RlZmluZSByYl9kZWZpbmVfY2xhc3NfdW5kZXIJCWRsbF9yYl9kZWZpbmVfY2xhc3NfdW5kZXIKKyNkZWZpbmUgcmJfZGVmaW5lX2NvbnN0CQkJZGxsX3JiX2RlZmluZV9jb25zdAorI2RlZmluZSByYl9kZWZpbmVfZ2xvYmFsX2Z1bmN0aW9uCWRsbF9yYl9kZWZpbmVfZ2xvYmFsX2Z1bmN0aW9uCisjZGVmaW5lIHJiX2RlZmluZV9tZXRob2QJCWRsbF9yYl9kZWZpbmVfbWV0aG9kCisjZGVmaW5lIHJiX2RlZmluZV9tb2R1bGUJCWRsbF9yYl9kZWZpbmVfbW9kdWxlCisjZGVmaW5lIHJiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24JZGxsX3JiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24KKyNkZWZpbmUgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QJZGxsX3JiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kCisjZGVmaW5lIHJiX2RlZmluZV92aXJ0dWFsX3ZhcmlhYmxlCWRsbF9yYl9kZWZpbmVfdmlydHVhbF92YXJpYWJsZQorI2RlZmluZSByYl9zdGRvdXQJCQkoKmRsbF9yYl9zdGRvdXQpCisjZGVmaW5lIHJiX2VBcmdFcnJvcgkJCSgqZGxsX3JiX2VBcmdFcnJvcikKKyNkZWZpbmUgcmJfZUluZGV4RXJyb3IJCQkoKmRsbF9yYl9lSW5kZXhFcnJvcikKKyNkZWZpbmUgcmJfZVJ1bnRpbWVFcnJvcgkJKCpkbGxfcmJfZVJ1bnRpbWVFcnJvcikKKyNkZWZpbmUgcmJfZVN0YW5kYXJkRXJyb3IJCSgqZGxsX3JiX2VTdGFuZGFyZEVycm9yKQorI2RlZmluZSByYl9ldmFsX3N0cmluZ19wcm90ZWN0CQlkbGxfcmJfZXZhbF9zdHJpbmdfcHJvdGVjdAorI2RlZmluZSByYl9nbG9iYWxfdmFyaWFibGUJCWRsbF9yYl9nbG9iYWxfdmFyaWFibGUKKyNkZWZpbmUgcmJfaGFzaF9hc2V0CQkJZGxsX3JiX2hhc2hfYXNldAorI2RlZmluZSByYl9oYXNoX25ldwkJCWRsbF9yYl9oYXNoX25ldworI2RlZmluZSByYl9pbnNwZWN0CQkJZGxsX3JiX2luc3BlY3QKKyNkZWZpbmUgcmJfaW50MmludW0JCQlkbGxfcmJfaW50MmludW0KKyNkZWZpbmUgcmJfbGFzdGxpbmVfZ2V0CQkJZGxsX3JiX2xhc3RsaW5lX2dldAorI2RlZmluZSByYl9sYXN0bGluZV9zZXQJCQlkbGxfcmJfbGFzdGxpbmVfc2V0CisjZGVmaW5lIHJiX2xvYWRfcHJvdGVjdAkJCWRsbF9yYl9sb2FkX3Byb3RlY3QKKyNkZWZpbmUgcmJfbnVtMmxvbmcJCQlkbGxfcmJfbnVtMmxvbmcKKyNkZWZpbmUgcmJfbnVtMnVsb25nCQkJZGxsX3JiX251bTJ1bG9uZworI2RlZmluZSByYl9vYmpfYWxsb2MJCQlkbGxfcmJfb2JqX2FsbG9jCisjZGVmaW5lIHJiX29ial9hc19zdHJpbmcJCWRsbF9yYl9vYmpfYXNfc3RyaW5nCisjZGVmaW5lIHJiX29ial9pZAkJCWRsbF9yYl9vYmpfaWQKKyNkZWZpbmUgcmJfcmFpc2UJCQlkbGxfcmJfcmFpc2UKKyNkZWZpbmUgcmJfc3RyMmNzdHIJCQlkbGxfcmJfc3RyMmNzdHIKKyNkZWZpbmUgcmJfc3RyX2NhdAkJCWRsbF9yYl9zdHJfY2F0CisjZGVmaW5lIHJiX3N0cl9jb25jYXQJCQlkbGxfcmJfc3RyX2NvbmNhdAorI2RlZmluZSByYl9zdHJfbmV3CQkJZGxsX3JiX3N0cl9uZXcKKyNkZWZpbmUgcmJfc3RyX25ldzIJCQlkbGxfcmJfc3RyX25ldzIKKyNkZWZpbmUgcnVieV9lcnJpbmZvCQkJKCpkbGxfcnVieV9lcnJpbmZvKQorI2RlZmluZSBydWJ5X2luaXQJCQlkbGxfcnVieV9pbml0CisjZGVmaW5lIHJ1YnlfaW5pdF9sb2FkcGF0aAkJZGxsX3J1YnlfaW5pdF9sb2FkcGF0aAorI2lmIGRlZmluZWQoRFlOQU1JQ19SVUJZX1ZFUikgJiYgRFlOQU1JQ19SVUJZX1ZFUiA+PSAxOAorIyBkZWZpbmUgcmJfdzMyX3NucHJpbnRmCQlkbGxfcmJfdzMyX3NucHJpbnRmCisjZW5kaWYKKworLyoKKyAqIFBvaW50ZXJzIGZvciBkeW5hbWljIGxpbmsKKyAqLworc3RhdGljIFZBTFVFICgqZGxsX3JiX2Fzc29jX25ldykgKFZBTFVFLCBWQUxVRSk7CitzdGF0aWMgVkFMVUUgKmRsbF9yYl9jRmFsc2VDbGFzczsKK3N0YXRpYyBWQUxVRSAqZGxsX3JiX2NGaXhudW07CitzdGF0aWMgVkFMVUUgKmRsbF9yYl9jTmlsQ2xhc3M7CitzdGF0aWMgVkFMVUUgKmRsbF9yYl9jT2JqZWN0Oworc3RhdGljIFZBTFVFICpkbGxfcmJfY1N5bWJvbDsKK3N0YXRpYyBWQUxVRSAqZGxsX3JiX2NUcnVlQ2xhc3M7CitzdGF0aWMgdm9pZCAoKmRsbF9yYl9jaGVja190eXBlKSAoVkFMVUUsaW50KTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9jbGFzc19wYXRoKSAoVkFMVUUpOworc3RhdGljIFZBTFVFICgqZGxsX3JiX2RhdGFfb2JqZWN0X2FsbG9jKSAoVkFMVUUsIHZvaWQqLCBSVUJZX0RBVEFfRlVOQywgUlVCWV9EQVRBX0ZVTkMpOworc3RhdGljIFZBTFVFICgqZGxsX3JiX2RlZmluZV9jbGFzc191bmRlcikgKFZBTFVFLCBjb25zdCBjaGFyKiwgVkFMVUUpOworc3RhdGljIHZvaWQgKCpkbGxfcmJfZGVmaW5lX2NvbnN0KSAoVkFMVUUsY29uc3QgY2hhciosVkFMVUUpOworc3RhdGljIHZvaWQgKCpkbGxfcmJfZGVmaW5lX2dsb2JhbF9mdW5jdGlvbikgKGNvbnN0IGNoYXIqLFZBTFVFKCopKCksaW50KTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2RlZmluZV9tZXRob2QpIChWQUxVRSxjb25zdCBjaGFyKixWQUxVRSgqKSgpLGludCk7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfZGVmaW5lX21vZHVsZSkgKGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24pIChWQUxVRSxjb25zdCBjaGFyKixWQUxVRSgqKSgpLGludCk7CitzdGF0aWMgdm9pZCAoKmRsbF9yYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZCkgKFZBTFVFLGNvbnN0IGNoYXIqLFZBTFVFKCopKCksaW50KTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2RlZmluZV92aXJ0dWFsX3ZhcmlhYmxlKSAoY29uc3QgY2hhciosVkFMVUUoKikoKSx2b2lkKCopKCkpOworc3RhdGljIFZBTFVFICpkbGxfcmJfc3Rkb3V0Oworc3RhdGljIFZBTFVFICpkbGxfcmJfZUFyZ0Vycm9yOworc3RhdGljIFZBTFVFICpkbGxfcmJfZUluZGV4RXJyb3I7CitzdGF0aWMgVkFMVUUgKmRsbF9yYl9lUnVudGltZUVycm9yOworc3RhdGljIFZBTFVFICpkbGxfcmJfZVN0YW5kYXJkRXJyb3I7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfZXZhbF9zdHJpbmdfcHJvdGVjdCkgKGNvbnN0IGNoYXIqLCBpbnQqKTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2dsb2JhbF92YXJpYWJsZSkgKFZBTFVFKik7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfaGFzaF9hc2V0KSAoVkFMVUUsIFZBTFVFLCBWQUxVRSk7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfaGFzaF9uZXcpICh2b2lkKTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9pbnNwZWN0KSAoVkFMVUUpOworc3RhdGljIFZBTFVFICgqZGxsX3JiX2ludDJpbnVtKSAobG9uZyk7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfaW50MmludW0pIChsb25nKTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9sYXN0bGluZV9nZXQpICh2b2lkKTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2xhc3RsaW5lX3NldCkgKFZBTFVFKTsKK3N0YXRpYyB2b2lkICgqZGxsX3JiX2xvYWRfcHJvdGVjdCkgKFZBTFVFLCBpbnQsIGludCopOworc3RhdGljIGxvbmcgKCpkbGxfcmJfbnVtMmxvbmcpIChWQUxVRSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAoKmRsbF9yYl9udW0ydWxvbmcpIChWQUxVRSk7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfb2JqX2FsbG9jKSAoVkFMVUUpOworc3RhdGljIFZBTFVFICgqZGxsX3JiX29ial9hc19zdHJpbmcpIChWQUxVRSk7CitzdGF0aWMgVkFMVUUgKCpkbGxfcmJfb2JqX2lkKSAoVkFMVUUpOworc3RhdGljIHZvaWQgKCpkbGxfcmJfcmFpc2UpIChWQUxVRSwgY29uc3QgY2hhciosIC4uLik7CitzdGF0aWMgY2hhciAqKCpkbGxfcmJfc3RyMmNzdHIpIChWQUxVRSxpbnQqKTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9zdHJfY2F0KSAoVkFMVUUsIGNvbnN0IGNoYXIqLCBsb25nKTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9zdHJfY29uY2F0KSAoVkFMVUUsIFZBTFVFKTsKK3N0YXRpYyBWQUxVRSAoKmRsbF9yYl9zdHJfbmV3KSAoY29uc3QgY2hhciosIGxvbmcpOworc3RhdGljIFZBTFVFICgqZGxsX3JiX3N0cl9uZXcyKSAoY29uc3QgY2hhciopOworc3RhdGljIFZBTFVFICpkbGxfcnVieV9lcnJpbmZvOworc3RhdGljIHZvaWQgKCpkbGxfcnVieV9pbml0KSAodm9pZCk7CitzdGF0aWMgdm9pZCAoKmRsbF9ydWJ5X2luaXRfbG9hZHBhdGgpICh2b2lkKTsKKyNpZiBkZWZpbmVkKERZTkFNSUNfUlVCWV9WRVIpICYmIERZTkFNSUNfUlVCWV9WRVIgPj0gMTgKK3N0YXRpYyBpbnQgKCpkbGxfcmJfdzMyX3NucHJpbnRmKShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgLi4uKTsKKyNlbmRpZgorCitzdGF0aWMgSElOU1RBTkNFIGhpbnN0UnVieSA9IDA7IC8qIEluc3RhbmNlIG9mIHJ1YnkuZGxsICovCisKKy8qCisgKiBUYWJsZSBvZiBuYW1lIHRvIGZ1bmN0aW9uIHBvaW50ZXIgb2YgcHl0aG9uLgorICovCisjZGVmaW5lIFJVQllfUFJPQyBGQVJQUk9DCitzdGF0aWMgc3RydWN0Cit7CisgICAgY2hhciAqbmFtZTsKKyAgICBSVUJZX1BST0MgKnB0cjsKK30gcnVieV9mdW5jbmFtZV90YWJsZVtdID0KK3sKKyAgICB7InJiX2Fzc29jX25ldyIsIChSVUJZX1BST0MqKSZkbGxfcmJfYXNzb2NfbmV3fSwKKyAgICB7InJiX2NGYWxzZUNsYXNzIiwgKFJVQllfUFJPQyopJmRsbF9yYl9jRmFsc2VDbGFzc30sCisgICAgeyJyYl9jRml4bnVtIiwgKFJVQllfUFJPQyopJmRsbF9yYl9jRml4bnVtfSwKKyAgICB7InJiX2NOaWxDbGFzcyIsIChSVUJZX1BST0MqKSZkbGxfcmJfY05pbENsYXNzfSwKKyAgICB7InJiX2NPYmplY3QiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2NPYmplY3R9LAorICAgIHsicmJfY1N5bWJvbCIsIChSVUJZX1BST0MqKSZkbGxfcmJfY1N5bWJvbH0sCisgICAgeyJyYl9jVHJ1ZUNsYXNzIiwgKFJVQllfUFJPQyopJmRsbF9yYl9jVHJ1ZUNsYXNzfSwKKyAgICB7InJiX2NoZWNrX3R5cGUiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2NoZWNrX3R5cGV9LAorICAgIHsicmJfY2xhc3NfcGF0aCIsIChSVUJZX1BST0MqKSZkbGxfcmJfY2xhc3NfcGF0aH0sCisgICAgeyJyYl9kYXRhX29iamVjdF9hbGxvYyIsIChSVUJZX1BST0MqKSZkbGxfcmJfZGF0YV9vYmplY3RfYWxsb2N9LAorICAgIHsicmJfZGVmaW5lX2NsYXNzX3VuZGVyIiwgKFJVQllfUFJPQyopJmRsbF9yYl9kZWZpbmVfY2xhc3NfdW5kZXJ9LAorICAgIHsicmJfZGVmaW5lX2NvbnN0IiwgKFJVQllfUFJPQyopJmRsbF9yYl9kZWZpbmVfY29uc3R9LAorICAgIHsicmJfZGVmaW5lX2dsb2JhbF9mdW5jdGlvbiIsIChSVUJZX1BST0MqKSZkbGxfcmJfZGVmaW5lX2dsb2JhbF9mdW5jdGlvbn0sCisgICAgeyJyYl9kZWZpbmVfbWV0aG9kIiwgKFJVQllfUFJPQyopJmRsbF9yYl9kZWZpbmVfbWV0aG9kfSwKKyAgICB7InJiX2RlZmluZV9tb2R1bGUiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2RlZmluZV9tb2R1bGV9LAorICAgIHsicmJfZGVmaW5lX21vZHVsZV9mdW5jdGlvbiIsIChSVUJZX1BST0MqKSZkbGxfcmJfZGVmaW5lX21vZHVsZV9mdW5jdGlvbn0sCisgICAgeyJyYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZCIsIChSVUJZX1BST0MqKSZkbGxfcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2R9LAorICAgIHsicmJfZGVmaW5lX3ZpcnR1YWxfdmFyaWFibGUiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2RlZmluZV92aXJ0dWFsX3ZhcmlhYmxlfSwKKyAgICB7InJiX3N0ZG91dCIsIChSVUJZX1BST0MqKSZkbGxfcmJfc3Rkb3V0fSwKKyAgICB7InJiX2VBcmdFcnJvciIsIChSVUJZX1BST0MqKSZkbGxfcmJfZUFyZ0Vycm9yfSwKKyAgICB7InJiX2VJbmRleEVycm9yIiwgKFJVQllfUFJPQyopJmRsbF9yYl9lSW5kZXhFcnJvcn0sCisgICAgeyJyYl9lUnVudGltZUVycm9yIiwgKFJVQllfUFJPQyopJmRsbF9yYl9lUnVudGltZUVycm9yfSwKKyAgICB7InJiX2VTdGFuZGFyZEVycm9yIiwgKFJVQllfUFJPQyopJmRsbF9yYl9lU3RhbmRhcmRFcnJvcn0sCisgICAgeyJyYl9ldmFsX3N0cmluZ19wcm90ZWN0IiwgKFJVQllfUFJPQyopJmRsbF9yYl9ldmFsX3N0cmluZ19wcm90ZWN0fSwKKyAgICB7InJiX2dsb2JhbF92YXJpYWJsZSIsIChSVUJZX1BST0MqKSZkbGxfcmJfZ2xvYmFsX3ZhcmlhYmxlfSwKKyAgICB7InJiX2hhc2hfYXNldCIsIChSVUJZX1BST0MqKSZkbGxfcmJfaGFzaF9hc2V0fSwKKyAgICB7InJiX2hhc2hfbmV3IiwgKFJVQllfUFJPQyopJmRsbF9yYl9oYXNoX25ld30sCisgICAgeyJyYl9pbnNwZWN0IiwgKFJVQllfUFJPQyopJmRsbF9yYl9pbnNwZWN0fSwKKyAgICB7InJiX2ludDJpbnVtIiwgKFJVQllfUFJPQyopJmRsbF9yYl9pbnQyaW51bX0sCisgICAgeyJyYl9sYXN0bGluZV9nZXQiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2xhc3RsaW5lX2dldH0sCisgICAgeyJyYl9sYXN0bGluZV9zZXQiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2xhc3RsaW5lX3NldH0sCisgICAgeyJyYl9sb2FkX3Byb3RlY3QiLCAoUlVCWV9QUk9DKikmZGxsX3JiX2xvYWRfcHJvdGVjdH0sCisgICAgeyJyYl9udW0ybG9uZyIsIChSVUJZX1BST0MqKSZkbGxfcmJfbnVtMmxvbmd9LAorICAgIHsicmJfbnVtMnVsb25nIiwgKFJVQllfUFJPQyopJmRsbF9yYl9udW0ydWxvbmd9LAorICAgIHsicmJfb2JqX2FsbG9jIiwgKFJVQllfUFJPQyopJmRsbF9yYl9vYmpfYWxsb2N9LAorICAgIHsicmJfb2JqX2FzX3N0cmluZyIsIChSVUJZX1BST0MqKSZkbGxfcmJfb2JqX2FzX3N0cmluZ30sCisgICAgeyJyYl9vYmpfaWQiLCAoUlVCWV9QUk9DKikmZGxsX3JiX29ial9pZH0sCisgICAgeyJyYl9yYWlzZSIsIChSVUJZX1BST0MqKSZkbGxfcmJfcmFpc2V9LAorICAgIHsicmJfc3RyMmNzdHIiLCAoUlVCWV9QUk9DKikmZGxsX3JiX3N0cjJjc3RyfSwKKyAgICB7InJiX3N0cl9jYXQiLCAoUlVCWV9QUk9DKikmZGxsX3JiX3N0cl9jYXR9LAorICAgIHsicmJfc3RyX2NvbmNhdCIsIChSVUJZX1BST0MqKSZkbGxfcmJfc3RyX2NvbmNhdH0sCisgICAgeyJyYl9zdHJfbmV3IiwgKFJVQllfUFJPQyopJmRsbF9yYl9zdHJfbmV3fSwKKyAgICB7InJiX3N0cl9uZXcyIiwgKFJVQllfUFJPQyopJmRsbF9yYl9zdHJfbmV3Mn0sCisgICAgeyJydWJ5X2VycmluZm8iLCAoUlVCWV9QUk9DKikmZGxsX3J1YnlfZXJyaW5mb30sCisgICAgeyJydWJ5X2luaXQiLCAoUlVCWV9QUk9DKikmZGxsX3J1YnlfaW5pdH0sCisgICAgeyJydWJ5X2luaXRfbG9hZHBhdGgiLCAoUlVCWV9QUk9DKikmZGxsX3J1YnlfaW5pdF9sb2FkcGF0aH0sCisjaWYgZGVmaW5lZChEWU5BTUlDX1JVQllfVkVSKSAmJiBEWU5BTUlDX1JVQllfVkVSID49IDE4CisgICAgeyJyYl93MzJfc25wcmludGYiLCAoUlVCWV9QUk9DKikmZGxsX3JiX3czMl9zbnByaW50Zn0sCisjZW5kaWYKKyAgICB7IiIsIE5VTEx9LAorfTsKKworLyoKKyAqIEZyZWUgcnVieS5kbGwKKyAqLworICAgIHN0YXRpYyB2b2lkCitlbmRfZHluYW1pY19ydWJ5KCkKK3sKKyAgICBpZiAoaGluc3RSdWJ5KQorICAgIHsKKwlGcmVlTGlicmFyeShoaW5zdFJ1YnkpOworCWhpbnN0UnVieSA9IDA7CisgICAgfQorfQorCisvKgorICogTG9hZCBsaWJyYXJ5IGFuZCBnZXQgYWxsIHBvaW50ZXJzLgorICogUGFyYW1ldGVyICdsaWJuYW1lJyBwcm92aWRlcyBuYW1lIG9mIERMTC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorcnVieV9ydW50aW1lX2xpbmtfaW5pdChjaGFyICpsaWJuYW1lLCBpbnQgdmVyYm9zZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChoaW5zdFJ1YnkpCisJcmV0dXJuIE9LOworICAgIGhpbnN0UnVieSA9IExvYWRMaWJyYXJ5KGxpYm5hbWUpOworICAgIGlmICghaGluc3RSdWJ5KQorICAgIHsKKwlpZiAodmVyYm9zZSkKKwkgICAgRU1TRzIoXyhlX2xvYWRsaWIpLCBsaWJuYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBydWJ5X2Z1bmNuYW1lX3RhYmxlW2ldLnB0cjsgKytpKQorICAgIHsKKwlpZiAoISgqcnVieV9mdW5jbmFtZV90YWJsZVtpXS5wdHIgPSBHZXRQcm9jQWRkcmVzcyhoaW5zdFJ1YnksCisJCQlydWJ5X2Z1bmNuYW1lX3RhYmxlW2ldLm5hbWUpKSkKKwl7CisJICAgIEZyZWVMaWJyYXJ5KGhpbnN0UnVieSk7CisJICAgIGhpbnN0UnVieSA9IDA7CisJICAgIGlmICh2ZXJib3NlKQorCQlFTVNHMihfKGVfbG9hZGZ1bmMpLCBydWJ5X2Z1bmNuYW1lX3RhYmxlW2ldLm5hbWUpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIElmIHJ1YnkgaXMgZW5hYmxlZCAodGhlcmUgaXMgaW5zdGFsbGVkIHJ1Ynkgb24gV2luZG93cyBzeXN0ZW0pIHJldHVybiBUUlVFLAorICogZWxzZSBGQUxTRS4KKyAqLworICAgIGludAorcnVieV9lbmFibGVkKHZlcmJvc2UpCisgICAgaW50CQl2ZXJib3NlOworeworICAgIHJldHVybiBydWJ5X3J1bnRpbWVfbGlua19pbml0KERZTkFNSUNfUlVCWV9ETEwsIHZlcmJvc2UpID09IE9LOworfQorI2VuZGlmIC8qIGRlZmluZWQoRFlOQU1JQ19SVUJZKSB8fCBkZWZpbmVkKFBST1RPKSAqLworCisgICAgdm9pZAorcnVieV9lbmQoKQoreworI2lmZGVmIERZTkFNSUNfUlVCWQorICAgIGVuZF9keW5hbWljX3J1YnkoKTsKKyNlbmRpZgorfQorCit2b2lkIGV4X3J1YnkoZXhhcmdfVCAqZWFwKQoreworICAgIGludCBzdGF0ZTsKKyAgICBjaGFyICpzY3JpcHQgPSBOVUxMOworCisgICAgc2NyaXB0ID0gc2NyaXB0X2dldChlYXAsIGVhcC0+YXJnKTsKKyAgICBpZiAoIWVhcC0+c2tpcCAmJiBlbnN1cmVfcnVieV9pbml0aWFsaXplZCgpKQorICAgIHsKKwlpZiAoc2NyaXB0ID09IE5VTEwpCisJICAgIHJiX2V2YWxfc3RyaW5nX3Byb3RlY3QoKGNoYXIgKillYXAtPmFyZywgJnN0YXRlKTsKKwllbHNlCisJICAgIHJiX2V2YWxfc3RyaW5nX3Byb3RlY3Qoc2NyaXB0LCAmc3RhdGUpOworCWlmIChzdGF0ZSkKKwkgICAgZXJyb3JfcHJpbnQoc3RhdGUpOworICAgIH0KKyAgICB2aW1fZnJlZShzY3JpcHQpOworfQorCit2b2lkIGV4X3J1YnlkbyhleGFyZ19UICplYXApCit7CisgICAgaW50IHN0YXRlOworICAgIGxpbmVucl9UIGk7CisKKyAgICBpZiAoZW5zdXJlX3J1YnlfaW5pdGlhbGl6ZWQoKSkKKyAgICB7CisJaWYgKHVfc2F2ZShlYXAtPmxpbmUxIC0gMSwgZWFwLT5saW5lMiArIDEpICE9IE9LKQorCSAgICByZXR1cm47CisJZm9yIChpID0gZWFwLT5saW5lMTsgaSA8PSBlYXAtPmxpbmUyOyBpKyspIHsKKwkgICAgVkFMVUUgbGluZSwgb2xkbGluZTsKKworCSAgICBsaW5lID0gb2xkbGluZSA9IHJiX3N0cl9uZXcyKG1sX2dldChpKSk7CisJICAgIHJiX2xhc3RsaW5lX3NldChsaW5lKTsKKwkgICAgcmJfZXZhbF9zdHJpbmdfcHJvdGVjdCgoY2hhciAqKSBlYXAtPmFyZywgJnN0YXRlKTsKKwkgICAgaWYgKHN0YXRlKSB7CisJCWVycm9yX3ByaW50KHN0YXRlKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbGluZSA9IHJiX2xhc3RsaW5lX2dldCgpOworCSAgICBpZiAoIU5JTF9QKGxpbmUpKSB7CisJCWlmIChUWVBFKGxpbmUpICE9IFRfU1RSSU5HKSB7CisJCSAgICBFTVNHKCJFMjY1OiAkXyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFN0cmluZyIpOworCQkgICAgcmV0dXJuOworCQl9CisJCW1sX3JlcGxhY2UoaSwgKGNoYXJfdSAqKSBTVFIyQ1NUUihsaW5lKSwgMSk7CisJCWNoYW5nZWQoKTsKKyNpZmRlZiBTWU5UQVhfSEwKKwkJc3luX2NoYW5nZWQoaSk7IC8qIHJlY29tcHV0ZSBzeW50YXggaGwuIGZvciB0aGlzIGxpbmUgKi8KKyNlbmRpZgorCSAgICB9CisJfQorCWNoZWNrX2N1cnNvcigpOworCXVwZGF0ZV9jdXJidWYoTk9UX1ZBTElEKTsKKyAgICB9Cit9CisKK3ZvaWQgZXhfcnVieWZpbGUoZXhhcmdfVCAqZWFwKQoreworICAgIGludCBzdGF0ZTsKKworICAgIGlmIChlbnN1cmVfcnVieV9pbml0aWFsaXplZCgpKQorICAgIHsKKwlyYl9sb2FkX3Byb3RlY3QocmJfc3RyX25ldzIoKGNoYXIgKikgZWFwLT5hcmcpLCAwLCAmc3RhdGUpOworCWlmIChzdGF0ZSkgZXJyb3JfcHJpbnQoc3RhdGUpOworICAgIH0KK30KKwordm9pZCBydWJ5X2J1ZmZlcl9mcmVlKGJ1Zl9UICpidWYpCit7CisgICAgaWYgKGJ1Zi0+cnVieV9yZWYpIHsKKwlyYl9oYXNoX2FzZXQob2JqdGJsLCByYl9vYmpfaWQoKFZBTFVFKSBidWYtPnJ1YnlfcmVmKSwgUW5pbCk7CisJUkRBVEEoYnVmLT5ydWJ5X3JlZiktPmRhdGEgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBydWJ5X3dpbmRvd19mcmVlKHdpbl9UICp3aW4pCit7CisgICAgaWYgKHdpbi0+cnVieV9yZWYpIHsKKwlyYl9oYXNoX2FzZXQob2JqdGJsLCByYl9vYmpfaWQoKFZBTFVFKSB3aW4tPnJ1YnlfcmVmKSwgUW5pbCk7CisJUkRBVEEod2luLT5ydWJ5X3JlZiktPmRhdGEgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBlbnN1cmVfcnVieV9pbml0aWFsaXplZCh2b2lkKQoreworICAgIGlmICghcnVieV9pbml0aWFsaXplZCkKKyAgICB7CisjaWZkZWYgRFlOQU1JQ19SVUJZCisJaWYgKHJ1YnlfZW5hYmxlZChUUlVFKSkKKwl7CisjZW5kaWYKKwkgICAgcnVieV9pbml0KCk7CisJICAgIHJ1YnlfaW5pdF9sb2FkcGF0aCgpOworCSAgICBydWJ5X2lvX2luaXQoKTsKKwkgICAgcnVieV92aW1faW5pdCgpOworCSAgICBydWJ5X2luaXRpYWxpemVkID0gMTsKKyNpZmRlZiBEWU5BTUlDX1JVQlkKKwl9CisJZWxzZQorCXsKKwkgICAgRU1TRyhfKCJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIikpOworCSAgICByZXR1cm4gMDsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIHJ1YnlfaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yX3ByaW50KGludCBzdGF0ZSkKK3sKKyNpZm5kZWYgRFlOQU1JQ19SVUJZCisgICAgUlVCWUVYVEVSTiBWQUxVRSBydWJ5X2VycmluZm87CisjZW5kaWYKKyAgICBWQUxVRSBlY2xhc3M7CisgICAgVkFMVUUgZWluZm87CisgICAgY2hhciBidWZmW0JVRlNJWl07CisKKyNkZWZpbmUgVEFHX1JFVFVSTgkweDEKKyNkZWZpbmUgVEFHX0JSRUFLCTB4MgorI2RlZmluZSBUQUdfTkVYVAkweDMKKyNkZWZpbmUgVEFHX1JFVFJZCTB4NAorI2RlZmluZSBUQUdfUkVETwkweDUKKyNkZWZpbmUgVEFHX1JBSVNFCTB4NgorI2RlZmluZSBUQUdfVEhST1cJMHg3CisjZGVmaW5lIFRBR19GQVRBTAkweDgKKyNkZWZpbmUgVEFHX01BU0sJMHhmCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBUQUdfUkVUVVJOOgorCUVNU0coIkUyNjc6IHVuZXhwZWN0ZWQgcmV0dXJuIik7CisJYnJlYWs7CisgICAgY2FzZSBUQUdfTkVYVDoKKwlFTVNHKCJFMjY4OiB1bmV4cGVjdGVkIG5leHQiKTsKKwlicmVhazsKKyAgICBjYXNlIFRBR19CUkVBSzoKKwlFTVNHKCJFMjY5OiB1bmV4cGVjdGVkIGJyZWFrIik7CisJYnJlYWs7CisgICAgY2FzZSBUQUdfUkVETzoKKwlFTVNHKCJFMjcwOiB1bmV4cGVjdGVkIHJlZG8iKTsKKwlicmVhazsKKyAgICBjYXNlIFRBR19SRVRSWToKKwlFTVNHKCJFMjcxOiByZXRyeSBvdXRzaWRlIG9mIHJlc2N1ZSBjbGF1c2UiKTsKKwlicmVhazsKKyAgICBjYXNlIFRBR19SQUlTRToKKyAgICBjYXNlIFRBR19GQVRBTDoKKwllY2xhc3MgPSBDTEFTU19PRihydWJ5X2VycmluZm8pOworCWVpbmZvID0gcmJfb2JqX2FzX3N0cmluZyhydWJ5X2VycmluZm8pOworCWlmIChlY2xhc3MgPT0gcmJfZVJ1bnRpbWVFcnJvciAmJiBSU1RSSU5HKGVpbmZvKS0+bGVuID09IDApIHsKKwkgICAgRU1TRygiRTI3MjogdW5oYW5kbGVkIGV4Y2VwdGlvbiIpOworCX0KKwllbHNlIHsKKwkgICAgVkFMVUUgZXBhdGg7CisJICAgIGNoYXIgKnA7CisKKwkgICAgZXBhdGggPSByYl9jbGFzc19wYXRoKGVjbGFzcyk7CisJICAgIHNucHJpbnRmKGJ1ZmYsIEJVRlNJWiwgIiVzOiAlcyIsCisJCSAgICAgUlNUUklORyhlcGF0aCktPnB0ciwgUlNUUklORyhlaW5mbyktPnB0cik7CisJICAgIHAgPSBzdHJjaHIoYnVmZiwgJ1xuJyk7CisJICAgIGlmIChwKSAqcCA9ICdcMCc7CisJICAgIEVNU0coYnVmZik7CisJfQorCWJyZWFrOworICAgIGRlZmF1bHQ6CisJc25wcmludGYoYnVmZiwgQlVGU0laLCBfKCJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIiksIHN0YXRlKTsKKwlFTVNHKGJ1ZmYpOworCWJyZWFrOworICAgIH0KK30KKworc3RhdGljIFZBTFVFIHZpbV9tZXNzYWdlKFZBTFVFIHNlbGYsIFZBTFVFIHN0cikKK3sKKyAgICBjaGFyICpidWZmLCAqcDsKKworICAgIHN0ciA9IHJiX29ial9hc19zdHJpbmcoc3RyKTsKKyAgICBidWZmID0gQUxMT0NBX04oY2hhciwgUlNUUklORyhzdHIpLT5sZW4pOworICAgIHN0cmNweShidWZmLCBSU1RSSU5HKHN0ciktPnB0cik7CisgICAgcCA9IHN0cmNocihidWZmLCAnXG4nKTsKKyAgICBpZiAocCkgKnAgPSAnXDAnOworICAgIE1TRyhidWZmKTsKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFIHZpbV9zZXRfb3B0aW9uKFZBTFVFIHNlbGYsIFZBTFVFIHN0cikKK3sKKyAgICBkb19zZXQoKGNoYXJfdSAqKVNUUjJDU1RSKHN0ciksIDApOworICAgIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFIHZpbV9jb21tYW5kKFZBTFVFIHNlbGYsIFZBTFVFIHN0cikKK3sKKyAgICBkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopU1RSMkNTVFIoc3RyKSk7CisgICAgcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyBWQUxVRSB2aW1fZXZhbHVhdGUoVkFMVUUgc2VsZiwgVkFMVUUgc3RyKQoreworI2lmZGVmIEZFQVRfRVZBTAorICAgIGNoYXJfdSAqdmFsdWUgPSBldmFsX3RvX3N0cmluZygoY2hhcl91ICopU1RSMkNTVFIoc3RyKSwgTlVMTCk7CisKKyAgICBpZiAodmFsdWUpCisgICAgeworCVZBTFVFIHZhbCA9IHJiX3N0cl9uZXcyKHZhbHVlKTsKKwl2aW1fZnJlZSh2YWx1ZSk7CisJcmV0dXJuIHZhbDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyBWQUxVRSBidWZmZXJfbmV3KGJ1Zl9UICpidWYpCit7CisgICAgaWYgKGJ1Zi0+cnVieV9yZWYpIHsKKwlyZXR1cm4gKFZBTFVFKSBidWYtPnJ1YnlfcmVmOworICAgIH0KKyAgICBlbHNlIHsKKwlWQUxVRSBvYmogPSBEYXRhX1dyYXBfU3RydWN0KGNCdWZmZXIsIDAsIDAsIGJ1Zik7CisJYnVmLT5ydWJ5X3JlZiA9ICh2b2lkICopIG9iajsKKwlyYl9oYXNoX2FzZXQob2JqdGJsLCByYl9vYmpfaWQob2JqKSwgb2JqKTsKKwlyZXR1cm4gb2JqOworICAgIH0KK30KKworc3RhdGljIGJ1Zl9UICpnZXRfYnVmKFZBTFVFIG9iaikKK3sKKyAgICBidWZfVCAqYnVmOworCisgICAgRGF0YV9HZXRfU3RydWN0KG9iaiwgYnVmX1QsIGJ1Zik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCXJiX3JhaXNlKGVEZWxldGVkQnVmZmVyRXJyb3IsICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIik7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9zX2N1cnJlbnQoKQoreworICAgIHJldHVybiBidWZmZXJfbmV3KGN1cmJ1Zik7Cit9CisKK3N0YXRpYyBWQUxVRSBidWZmZXJfc19jb3VudCgpCit7CisgICAgYnVmX1QgKmI7CisgICAgaW50IG4gPSAwOworCisgICAgZm9yIChiID0gZmlyc3RidWY7IGI7IGIgPSBiLT5iX25leHQpIG4rKzsKKyAgICByZXR1cm4gSU5UMk5VTShuKTsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9zX2FyZWYoVkFMVUUgc2VsZiwgVkFMVUUgbnVtKQoreworICAgIGJ1Zl9UICpiOworICAgIGludCBuID0gTlVNMklOVChudW0pOworCisgICAgZm9yIChiID0gZmlyc3RidWY7IGI7IGIgPSBiLT5iX25leHQsIC0tbikgeworCWlmIChuID09IDApCisJICAgIHJldHVybiBidWZmZXJfbmV3KGIpOworICAgIH0KKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9uYW1lKFZBTFVFIHNlbGYpCit7CisgICAgYnVmX1QgKmJ1ZiA9IGdldF9idWYoc2VsZik7CisKKyAgICByZXR1cm4gYnVmLT5iX2ZmbmFtZSA/IHJiX3N0cl9uZXcyKGJ1Zi0+Yl9mZm5hbWUpIDogUW5pbDsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9udW1iZXIoVkFMVUUgc2VsZikKK3sKKyAgICBidWZfVCAqYnVmID0gZ2V0X2J1ZihzZWxmKTsKKworICAgIHJldHVybiBJTlQyTlVNKGJ1Zi0+Yl9mbnVtKTsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9jb3VudChWQUxVRSBzZWxmKQoreworICAgIGJ1Zl9UICpidWYgPSBnZXRfYnVmKHNlbGYpOworCisgICAgcmV0dXJuIElOVDJOVU0oYnVmLT5iX21sLm1sX2xpbmVfY291bnQpOworfQorCitzdGF0aWMgVkFMVUUgYnVmZmVyX2FyZWYoVkFMVUUgc2VsZiwgVkFMVUUgbnVtKQoreworICAgIGJ1Zl9UICpidWYgPSBnZXRfYnVmKHNlbGYpOworICAgIGxvbmcgbiA9IE5VTTJMT05HKG51bSk7CisKKyAgICBpZiAobiA+IDAgJiYgbiA8PSBidWYtPmJfbWwubWxfbGluZV9jb3VudCkgeworCWNoYXIgKmxpbmUgPSBtbF9nZXRfYnVmKGJ1ZiwgbiwgRkFMU0UpOworCXJldHVybiBsaW5lID8gcmJfc3RyX25ldzIobGluZSkgOiBRbmlsOworICAgIH0KKyAgICBlbHNlIHsKKwlyYl9yYWlzZShyYl9lSW5kZXhFcnJvciwgImluZGV4ICVkIG91dCBvZiBidWZmZXIiLCBuKTsKKwlyZXR1cm4gUW5pbDsgLyogRm9yIHN0b3Agd2FybmluZyAqLworICAgIH0KK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9hc2V0KFZBTFVFIHNlbGYsIFZBTFVFIG51bSwgVkFMVUUgc3RyKQoreworICAgIGJ1Zl9UICpidWYgPSBnZXRfYnVmKHNlbGYpOworICAgIGJ1Zl9UICpzYXZlYnVmID0gY3VyYnVmOworICAgIGNoYXIgKmxpbmUgPSBTVFIyQ1NUUihzdHIpOworICAgIGxvbmcgbiA9IE5VTTJMT05HKG51bSk7CisKKyAgICBpZiAobiA+IDAgJiYgbiA8PSBidWYtPmJfbWwubWxfbGluZV9jb3VudCAmJiBsaW5lICE9IE5VTEwpIHsKKwljdXJidWYgPSBidWY7CisJaWYgKHVfc2F2ZXN1YihuKSA9PSBPSykgeworCSAgICBtbF9yZXBsYWNlKG4sIChjaGFyX3UgKikgbGluZSwgVFJVRSk7CisJICAgIGNoYW5nZWQoKTsKKyNpZmRlZiBTWU5UQVhfSEwKKwkgICAgc3luX2NoYW5nZWQobik7IC8qIHJlY29tcHV0ZSBzeW50YXggaGwuIGZvciB0aGlzIGxpbmUgKi8KKyNlbmRpZgorCX0KKwljdXJidWYgPSBzYXZlYnVmOworCXVwZGF0ZV9jdXJidWYoTk9UX1ZBTElEKTsKKyAgICB9CisgICAgZWxzZSB7CisJcmJfcmFpc2UocmJfZUluZGV4RXJyb3IsICJpbmRleCAlZCBvdXQgb2YgYnVmZmVyIiwgbik7CisJcmV0dXJuIFFuaWw7IC8qIEZvciBzdG9wIHdhcm5pbmcgKi8KKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9kZWxldGUoVkFMVUUgc2VsZiwgVkFMVUUgbnVtKQoreworICAgIGJ1Zl9UICpidWYgPSBnZXRfYnVmKHNlbGYpOworICAgIGJ1Zl9UICpzYXZlYnVmID0gY3VyYnVmOworICAgIGxvbmcgbiA9IE5VTTJMT05HKG51bSk7CisKKyAgICBpZiAobiA+IDAgJiYgbiA8PSBidWYtPmJfbWwubWxfbGluZV9jb3VudCkgeworCWN1cmJ1ZiA9IGJ1ZjsKKwlpZiAodV9zYXZlZGVsKG4sIDEpID09IE9LKSB7CisJICAgIG1hcmtfYWRqdXN0KG4sIG4sIE1BWExOVU0sIC0xKTsKKwkgICAgbWxfZGVsZXRlKG4sIDApOworCSAgICBjaGFuZ2VkKCk7CisJfQorCWN1cmJ1ZiA9IHNhdmVidWY7CisJdXBkYXRlX2N1cmJ1ZihOT1RfVkFMSUQpOworICAgIH0KKyAgICBlbHNlIHsKKwlyYl9yYWlzZShyYl9lSW5kZXhFcnJvciwgImluZGV4ICVkIG91dCBvZiBidWZmZXIiLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyBWQUxVRSBidWZmZXJfYXBwZW5kKFZBTFVFIHNlbGYsIFZBTFVFIG51bSwgVkFMVUUgc3RyKQoreworICAgIGJ1Zl9UICpidWYgPSBnZXRfYnVmKHNlbGYpOworICAgIGJ1Zl9UICpzYXZlYnVmID0gY3VyYnVmOworICAgIGNoYXIgKmxpbmUgPSBTVFIyQ1NUUihzdHIpOworICAgIGxvbmcgbiA9IE5VTTJMT05HKG51bSk7CisKKyAgICBpZiAobiA+PSAwICYmIG4gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQgJiYgbGluZSAhPSBOVUxMKSB7CisJY3VyYnVmID0gYnVmOworCWlmICh1X2luc3N1YihuICsgMSkgPT0gT0spIHsKKwkgICAgbWFya19hZGp1c3QobiArIDEsIE1BWExOVU0sIDFMLCAwTCk7CisJICAgIG1sX2FwcGVuZChuLCAoY2hhcl91ICopIGxpbmUsIChjb2xucl9UKSAwLCBGQUxTRSk7CisJICAgIGNoYW5nZWQoKTsKKwl9CisJY3VyYnVmID0gc2F2ZWJ1ZjsKKwl1cGRhdGVfY3VyYnVmKE5PVF9WQUxJRCk7CisgICAgfQorICAgIGVsc2UgeworCXJiX3JhaXNlKHJiX2VJbmRleEVycm9yLCAiaW5kZXggJWQgb3V0IG9mIGJ1ZmZlciIsIG4pOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgVkFMVUUgd2luZG93X25ldyh3aW5fVCAqd2luKQoreworICAgIGlmICh3aW4tPnJ1YnlfcmVmKSB7CisJcmV0dXJuIChWQUxVRSkgd2luLT5ydWJ5X3JlZjsKKyAgICB9CisgICAgZWxzZSB7CisJVkFMVUUgb2JqID0gRGF0YV9XcmFwX1N0cnVjdChjVmltV2luZG93LCAwLCAwLCB3aW4pOworCXdpbi0+cnVieV9yZWYgPSAodm9pZCAqKSBvYmo7CisJcmJfaGFzaF9hc2V0KG9ianRibCwgcmJfb2JqX2lkKG9iaiksIG9iaik7CisJcmV0dXJuIG9iajsKKyAgICB9Cit9CisKK3N0YXRpYyB3aW5fVCAqZ2V0X3dpbihWQUxVRSBvYmopCit7CisgICAgd2luX1QgKndpbjsKKworICAgIERhdGFfR2V0X1N0cnVjdChvYmosIHdpbl9ULCB3aW4pOworICAgIGlmICh3aW4gPT0gTlVMTCkKKwlyYl9yYWlzZShlRGVsZXRlZFdpbmRvd0Vycm9yLCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIpOworICAgIHJldHVybiB3aW47Cit9CisKK3N0YXRpYyBWQUxVRSB3aW5kb3dfc19jdXJyZW50KCkKK3sKKyAgICByZXR1cm4gd2luZG93X25ldyhjdXJ3aW4pOworfQorCitzdGF0aWMgVkFMVUUgd2luZG93X3NfY291bnQoKQoreworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3OworICAgIGludCBuID0gMDsKKworICAgIGZvciAodyA9IGZpcnN0d2luOyB3OyB3ID0gdy0+d19uZXh0KQorCW4rKzsKKyAgICByZXR1cm4gSU5UMk5VTShuKTsKKyNlbHNlCisgICAgcmV0dXJuIElOVDJOVU0oMSk7CisjZW5kaWYKK30KKworc3RhdGljIFZBTFVFIHdpbmRvd19zX2FyZWYoVkFMVUUgc2VsZiwgVkFMVUUgbnVtKQoreworICAgIHdpbl9UICp3OworICAgIGludCBuID0gTlVNMklOVChudW0pOworCisjaWZuZGVmIEZFQVRfV0lORE9XUworICAgIHcgPSBjdXJ3aW47CisjZWxzZQorICAgIGZvciAodyA9IGZpcnN0d2luOyB3ICE9IE5VTEw7IHcgPSB3LT53X25leHQsIC0tbikKKyNlbmRpZgorCWlmIChuID09IDApCisJICAgIHJldHVybiB3aW5kb3dfbmV3KHcpOworICAgIHJldHVybiBRbmlsOworfQorCitzdGF0aWMgVkFMVUUgd2luZG93X2J1ZmZlcihWQUxVRSBzZWxmKQoreworICAgIHdpbl9UICp3aW4gPSBnZXRfd2luKHNlbGYpOworCisgICAgcmV0dXJuIGJ1ZmZlcl9uZXcod2luLT53X2J1ZmZlcik7Cit9CisKK3N0YXRpYyBWQUxVRSB3aW5kb3dfaGVpZ2h0KFZBTFVFIHNlbGYpCit7CisgICAgd2luX1QgKndpbiA9IGdldF93aW4oc2VsZik7CisKKyAgICByZXR1cm4gSU5UMk5VTSh3aW4tPndfaGVpZ2h0KTsKK30KKworc3RhdGljIFZBTFVFIHdpbmRvd19zZXRfaGVpZ2h0KFZBTFVFIHNlbGYsIFZBTFVFIGhlaWdodCkKK3sKKyAgICB3aW5fVCAqd2luID0gZ2V0X3dpbihzZWxmKTsKKyAgICB3aW5fVCAqc2F2ZXdpbiA9IGN1cndpbjsKKworICAgIGN1cndpbiA9IHdpbjsKKyAgICB3aW5fc2V0aGVpZ2h0KE5VTTJJTlQoaGVpZ2h0KSk7CisgICAgY3Vyd2luID0gc2F2ZXdpbjsKKyAgICByZXR1cm4gaGVpZ2h0OworfQorCitzdGF0aWMgVkFMVUUgd2luZG93X2N1cnNvcihWQUxVRSBzZWxmKQoreworICAgIHdpbl9UICp3aW4gPSBnZXRfd2luKHNlbGYpOworCisgICAgcmV0dXJuIHJiX2Fzc29jX25ldyhJTlQyTlVNKHdpbi0+d19jdXJzb3IubG51bSksIElOVDJOVU0od2luLT53X2N1cnNvci5jb2wpKTsKK30KKworc3RhdGljIFZBTFVFIHdpbmRvd19zZXRfY3Vyc29yKFZBTFVFIHNlbGYsIFZBTFVFIHBvcykKK3sKKyAgICBWQUxVRSBsbnVtLCBjb2w7CisgICAgd2luX1QgKndpbiA9IGdldF93aW4oc2VsZik7CisKKyAgICBDaGVja19UeXBlKHBvcywgVF9BUlJBWSk7CisgICAgaWYgKFJBUlJBWShwb3MpLT5sZW4gIT0gMikKKwlyYl9yYWlzZShyYl9lQXJnRXJyb3IsICJhcnJheSBsZW5ndGggbXVzdCBiZSAyIik7CisgICAgbG51bSA9IFJBUlJBWShwb3MpLT5wdHJbMF07CisgICAgY29sID0gUkFSUkFZKHBvcyktPnB0clsxXTsKKyAgICB3aW4tPndfY3Vyc29yLmxudW0gPSBOVU0yTE9ORyhsbnVtKTsKKyAgICB3aW4tPndfY3Vyc29yLmNvbCA9IE5VTTJVSU5UKGNvbCk7CisgICAgY2hlY2tfY3Vyc29yKCk7CQkgICAgLyogcHV0IGN1cnNvciBvbiBhbiBleGlzdGluZyBsaW5lICovCisgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworICAgIHJldHVybiBRbmlsOworfQorCitzdGF0aWMgVkFMVUUgZl9wKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBpbnQgaTsKKyAgICBWQUxVRSBzdHIgPSByYl9zdHJfbmV3KCIiLCAwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwlpZiAoaSA+IDApIHJiX3N0cl9jYXQoc3RyLCAiLCAiLCAyKTsKKwlyYl9zdHJfY29uY2F0KHN0ciwgcmJfaW5zcGVjdChhcmd2W2ldKSk7CisgICAgfQorICAgIE1TRyhSU1RSSU5HKHN0ciktPnB0cik7CisgICAgcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyB2b2lkIHJ1YnlfaW9faW5pdCh2b2lkKQoreworI2lmbmRlZiBEWU5BTUlDX1JVQlkKKyAgICBSVUJZRVhURVJOIFZBTFVFIHJiX3N0ZG91dDsKKyNlbmRpZgorCisgICAgcmJfc3Rkb3V0ID0gcmJfb2JqX2FsbG9jKHJiX2NPYmplY3QpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKHJiX3N0ZG91dCwgIndyaXRlIiwgdmltX21lc3NhZ2UsIDEpOworICAgIHJiX2RlZmluZV9nbG9iYWxfZnVuY3Rpb24oInAiLCBmX3AsIC0xKTsKK30KKworc3RhdGljIHZvaWQgcnVieV92aW1faW5pdCh2b2lkKQoreworICAgIG9ianRibCA9IHJiX2hhc2hfbmV3KCk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZvYmp0YmwpOworCisgICAgbVZJTSA9IHJiX2RlZmluZV9tb2R1bGUoIlZJTSIpOworICAgIHJiX2RlZmluZV9jb25zdChtVklNLCAiVkVSU0lPTl9NQUpPUiIsIElOVDJOVU0oVklNX1ZFUlNJT05fTUFKT1IpKTsKKyAgICByYl9kZWZpbmVfY29uc3QobVZJTSwgIlZFUlNJT05fTUlOT1IiLCBJTlQyTlVNKFZJTV9WRVJTSU9OX01JTk9SKSk7CisgICAgcmJfZGVmaW5lX2NvbnN0KG1WSU0sICJWRVJTSU9OX0JVSUxEIiwgSU5UMk5VTShWSU1fVkVSU0lPTl9CVUlMRCkpOworICAgIHJiX2RlZmluZV9jb25zdChtVklNLCAiVkVSU0lPTl9QQVRDSExFVkVMIiwgSU5UMk5VTShWSU1fVkVSU0lPTl9QQVRDSExFVkVMKSk7CisgICAgcmJfZGVmaW5lX2NvbnN0KG1WSU0sICJWRVJTSU9OX1NIT1JUIiwgcmJfc3RyX25ldzIoVklNX1ZFUlNJT05fU0hPUlQpKTsKKyAgICByYl9kZWZpbmVfY29uc3QobVZJTSwgIlZFUlNJT05fTUVESVVNIiwgcmJfc3RyX25ldzIoVklNX1ZFUlNJT05fTUVESVVNKSk7CisgICAgcmJfZGVmaW5lX2NvbnN0KG1WSU0sICJWRVJTSU9OX0xPTkciLCByYl9zdHJfbmV3MihWSU1fVkVSU0lPTl9MT05HKSk7CisgICAgcmJfZGVmaW5lX2NvbnN0KG1WSU0sICJWRVJTSU9OX0xPTkdfREFURSIsIHJiX3N0cl9uZXcyKFZJTV9WRVJTSU9OX0xPTkdfREFURSkpOworICAgIHJiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24obVZJTSwgIm1lc3NhZ2UiLCB2aW1fbWVzc2FnZSwgMSk7CisgICAgcmJfZGVmaW5lX21vZHVsZV9mdW5jdGlvbihtVklNLCAic2V0X29wdGlvbiIsIHZpbV9zZXRfb3B0aW9uLCAxKTsKKyAgICByYl9kZWZpbmVfbW9kdWxlX2Z1bmN0aW9uKG1WSU0sICJjb21tYW5kIiwgdmltX2NvbW1hbmQsIDEpOworICAgIHJiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24obVZJTSwgImV2YWx1YXRlIiwgdmltX2V2YWx1YXRlLCAxKTsKKworICAgIGVEZWxldGVkQnVmZmVyRXJyb3IgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIobVZJTSwgIkRlbGV0ZWRCdWZmZXJFcnJvciIsCisJCQkJCQlyYl9lU3RhbmRhcmRFcnJvcik7CisgICAgZURlbGV0ZWRXaW5kb3dFcnJvciA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtVklNLCAiRGVsZXRlZFdpbmRvd0Vycm9yIiwKKwkJCQkJCXJiX2VTdGFuZGFyZEVycm9yKTsKKworICAgIGNCdWZmZXIgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIobVZJTSwgIkJ1ZmZlciIsIHJiX2NPYmplY3QpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKGNCdWZmZXIsICJjdXJyZW50IiwgYnVmZmVyX3NfY3VycmVudCwgMCk7CisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QoY0J1ZmZlciwgImNvdW50IiwgYnVmZmVyX3NfY291bnQsIDApOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKGNCdWZmZXIsICJbXSIsIGJ1ZmZlcl9zX2FyZWYsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY0J1ZmZlciwgIm5hbWUiLCBidWZmZXJfbmFtZSwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjQnVmZmVyLCAibnVtYmVyIiwgYnVmZmVyX251bWJlciwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjQnVmZmVyLCAiY291bnQiLCBidWZmZXJfY291bnQsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QoY0J1ZmZlciwgImxlbmd0aCIsIGJ1ZmZlcl9jb3VudCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjQnVmZmVyLCAiW10iLCBidWZmZXJfYXJlZiwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjQnVmZmVyLCAiW109IiwgYnVmZmVyX2FzZXQsIDIpOworICAgIHJiX2RlZmluZV9tZXRob2QoY0J1ZmZlciwgImRlbGV0ZSIsIGJ1ZmZlcl9kZWxldGUsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY0J1ZmZlciwgImFwcGVuZCIsIGJ1ZmZlcl9hcHBlbmQsIDIpOworCisgICAgY1ZpbVdpbmRvdyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtVklNLCAiV2luZG93IiwgcmJfY09iamVjdCk7CisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QoY1ZpbVdpbmRvdywgImN1cnJlbnQiLCB3aW5kb3dfc19jdXJyZW50LCAwKTsKKyAgICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChjVmltV2luZG93LCAiY291bnQiLCB3aW5kb3dfc19jb3VudCwgMCk7CisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QoY1ZpbVdpbmRvdywgIltdIiwgd2luZG93X3NfYXJlZiwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjVmltV2luZG93LCAiYnVmZmVyIiwgd2luZG93X2J1ZmZlciwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjVmltV2luZG93LCAiaGVpZ2h0Iiwgd2luZG93X2hlaWdodCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjVmltV2luZG93LCAiaGVpZ2h0PSIsIHdpbmRvd19zZXRfaGVpZ2h0LCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNWaW1XaW5kb3csICJjdXJzb3IiLCB3aW5kb3dfY3Vyc29yLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNWaW1XaW5kb3csICJjdXJzb3I9Iiwgd2luZG93X3NldF9jdXJzb3IsIDEpOworCisgICAgcmJfZGVmaW5lX3ZpcnR1YWxfdmFyaWFibGUoIiRjdXJidWYiLCBidWZmZXJfc19jdXJyZW50LCAwKTsKKyAgICByYl9kZWZpbmVfdmlydHVhbF92YXJpYWJsZSgiJGN1cndpbiIsIHdpbmRvd19zX2N1cnJlbnQsIDApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2lmX3NuaWZmLmMgYi9zcmMvaWZfc25pZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2IwYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lmX3NuaWZmLmMKQEAgLTAsMCArMSwxMjEwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIGlmX3NuaWZmLmMgSW50ZXJmYWNlIGJldHdlZW4gVmltIGFuZCBTTmlGRisKKyAqCisgKiAkSWQkCisgKgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgV0lOMzIKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyMgaW5jbHVkZSA8cHJvY2Vzcy5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZWxzZQorIyBpZmRlZiBGRUFUX0dVSV9YMTEKKyMgIGluY2x1ZGUgImd1aV94MTEucHJvIgorIyBlbmRpZgorIyBpbmNsdWRlICJvc191bml4eC5oIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgc25pZmZlbWFjc19waWQ7CisKK2ludCBmZF9mcm9tX3NuaWZmOworaW50IHNuaWZmX2Nvbm5lY3RlZCA9IDA7CitpbnQgc25pZmZfcmVxdWVzdF93YWl0aW5nID0gMDsKK2ludCB3YW50X3NuaWZmX3JlcXVlc3QgPSAwOworCisjZGVmaW5lIE1BWF9SRVFVRVNUX0xFTiA1MTIKKworI2RlZmluZSBORUVEX1NZTUJPTAkyCisjZGVmaW5lIEVNUFRZX1NZTUJPTAk0CisjZGVmaW5lIE5FRURfRklMRQk4CisjZGVmaW5lIFNJTEVOVAkJMTYKKyNkZWZpbmUgRElTQ09OTkVDVAkzMgorI2RlZmluZSBDT05ORUNUCQk2NAorCisjZGVmaW5lIFJRX05PTkUJCTAKKyNkZWZpbmUgUlFfU0lNUExFCTEKKyNkZWZpbmUgUlFfQ09OVEVYVAlORUVEX0ZJTEUgKyBORUVEX1NZTUJPTAorI2RlZmluZSBSUV9TQ09OVEVYVAlORUVEX0ZJTEUgKyBORUVEX1NZTUJPTCArIEVNUFRZX1NZTUJPTAorI2RlZmluZSBSUV9OT1NZTUJPTAlORUVEX0ZJTEUKKyNkZWZpbmUgUlFfU0lMRU5UCVJRX05PU1lNQk9MICsgU0lMRU5UCisjZGVmaW5lIFJRX0NPTk5FQ1QJUlFfTk9ORSArIENPTk5FQ1QKKyNkZWZpbmUgUlFfRElTQ09OTkVDVAlSUV9TSU1QTEUgKyBESVNDT05ORUNUCisKK3N0cnVjdCBzbl9jbWQKK3sKKyAgICBjaGFyICpjbWRfbmFtZTsKKyAgICBjaGFyIGNtZF9jb2RlOworICAgIGNoYXIgKmNtZF9tc2c7CisgICAgaW50ICBjbWRfdHlwZTsKK307CisKK3N0cnVjdCBzbl9jbWRfbGlzdAoreworICAgIHN0cnVjdCBzbl9jbWQqIHNuaWZmX2NtZDsKKyAgICBzdHJ1Y3Qgc25fY21kX2xpc3QqIG5leHRfY21kOworfTsKKworc3RhdGljIHN0cnVjdCBzbl9jbWQgc25pZmZfY21kc1tdID0KK3sKKyAgICB7ICJ0b2dnbGUiLAkJJ2UnLCBOXygiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iKSxSUV9TQ09OVEVYVCB9LAorICAgIHsgInN1cGVyY2xhc3MiLAkncycsIE5fKCJTaG93IGJhc2UgY2xhc3Mgb2YiKSwJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJvdmVycmlkZGVuIiwJJ20nLCBOXygiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIpLFJRX1NDT05URVhUIH0sCisgICAgeyAicmV0cmlldmUtZmlsZSIsCSdyJywgTl8oIlJldHJpZXZlIGZyb20gZmlsZSIpLAkJUlFfQ09OVEVYVCB9LAorICAgIHsgInJldHJpZXZlLXByb2plY3QiLCdwJywgTl8oIlJldHJpZXZlIGZyb20gcHJvamVjdCIpLAlSUV9DT05URVhUIH0sCisgICAgeyAicmV0cmlldmUtYWxsLXByb2plY3RzIiwKKwkJCSdQJywgTl8oIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIiksCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJyZXRyaWV2ZS1uZXh0IiwJJ1InLCBOXygiUmV0cmlldmUiKSwJUlFfQ09OVEVYVCB9LAorICAgIHsgImdvdG8tc3ltYm9sIiwJJ2cnLCBOXygiU2hvdyBzb3VyY2Ugb2YiKSwJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJmaW5kLXN5bWJvbCIsCSdmJywgTl8oIkZpbmQgc3ltYm9sIiksCQkJUlFfQ09OVEVYVCB9LAorICAgIHsgImJyb3dzZS1jbGFzcyIsCSd3JywgTl8oIkJyb3dzZSBjbGFzcyIpLAkJUlFfQ09OVEVYVCB9LAorICAgIHsgImhpZXJhcmNoeSIsCSd0JywgTl8oIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IiksCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJyZXN0ci1oaWVyIiwJJ1QnLCBOXygiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIpLFJRX0NPTlRFWFQgfSwKKyAgICB7ICJ4cmVmLXRvIiwJJ3gnLCBOXygiWHJlZiByZWZlcnMgdG8iKSwJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJ4cmVmLWJ5IiwJJ1gnLCBOXygiWHJlZiByZWZlcnJlZCBieSIpLAkJUlFfQ09OVEVYVCB9LAorICAgIHsgInhyZWYtaGFzIiwJJ2MnLCBOXygiWHJlZiBoYXMgYSIpLAkJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJ4cmVmLXVzZWQtYnkiLAknQycsIE5fKCJYcmVmIHVzZWQgYnkiKSwJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJzaG93LWRvY3UiLAknZCcsIE5fKCJTaG93IGRvY3Ugb2YiKSwJCVJRX0NPTlRFWFQgfSwKKyAgICB7ICJnZW4tZG9jdSIsCSdEJywgTl8oIkdlbmVyYXRlIGRvY3UgZm9yIiksCQlSUV9DT05URVhUIH0sCisgICAgeyAiY29ubmVjdCIsCSd5JywgTlVMTCwJCQkJUlFfQ09OTkVDVCB9LAorICAgIHsgImRpc2Nvbm5lY3QiLAkncScsIE5VTEwsCQkJCVJRX0RJU0NPTk5FQ1QgfSwKKyAgICB7ICJmb250LWluZm8iLAkneicsIE5VTEwsCQkJCVJRX1NJTEVOVCB9LAorICAgIHsgInVwZGF0ZSIsCQkndScsIE5VTEwsCQkJCVJRX1NJTEVOVCB9LAorICAgIHsgTlVMTCwJCSdcMCcsIE5VTEwsIDB9Cit9OworCisKK3N0YXRpYyBjaGFyICpTbmlmZkVtYWNzWzJdID0geyJzbmlmZmVtYWNzIiwgKGNoYXIgKilOVUxMfTsgIC8qIFllcywgRW1hY3MhICovCitzdGF0aWMgaW50IGZkX3RvX3NuaWZmOworc3RhdGljIGludCBzbmlmZl93aWxsX2Rpc2Nvbm5lY3QgPSAwOworc3RhdGljIGNoYXIgbXNnX3NuaWZmX2Rpc2Nvbm5lY3RbXSA9IE5fKCJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gJFBBVEgpLlxuIik7CitzdGF0aWMgY2hhciBzbmlmZl9ycV9zZXBbXSA9ICIgIjsKK3N0YXRpYyBzdHJ1Y3Qgc25fY21kX2xpc3QgKnNuaWZmX2NtZF9leHQgPSBOVUxMOworCisvKiBJbml0aWFsaXppbmcgdmltIGNvbW1hbmRzCisgKiBleGVjdXRlZCBlYWNoIHRpbWUgdmltIGNvbm5lY3RzIHRvIFNuaWZmCisgKi8KK3N0YXRpYyBjaGFyICppbml0X2NtZHNbXT0geworICAgICJhdWdyb3VwIHNuaWZmIiwKKyAgICAiYXV0b2NtZCBCdWZXcml0ZVBvc3QgKiBzbmlmZiB1cGRhdGUiLAorICAgICJhdXRvY21kIEJ1ZlJlYWRQb3N0ICogc25pZmYgZm9udC1pbmZvIiwKKyAgICAiYXV0b2NtZCBWaW1MZWF2ZSAqIHNuaWZmIGRpc2Nvbm5lY3QiLAorICAgICJhdWdyb3VwIEVORCIsCisKKyAgICAibGV0IGc6c25pZmZfY29ubmVjdGVkID0gMSIsCisKKyAgICAiaWYgISBleGlzdHMoJ2c6c25pZmZfbWFwcGluZ3Nfc291cmNlZCcpfCIKKwkiaWYgISBleGlzdHMoJ2c6c25pZmZfbWFwcGluZ3MnKXwiCisJICAgICJpZiBleGlzdHMoJyRTTklGRl9ESVI0Jyl8IgorCQkibGV0IGc6c25pZmZfbWFwcGluZ3M9JyRTTklGRl9ESVI0L2NvbmZpZy9pbnRlZ3JhdGlvbnMvdmltL3NuaWZmLnZpbSd8IgorCSAgICAiZWxzZXwiCisJCSJsZXQgZzpzbmlmZl9tYXBwaW5ncz0nJFNOSUZGX0RJUi9jb25maWcvc25pZmYudmltJ3wiCisJICAgICJlbmRpZnwiCisJImVuZGlmfCIKKwkibGV0IGc6c25pZmZfbWFwcGluZ3M9ZXhwYW5kKGc6c25pZmZfbWFwcGluZ3MpfCIKKwkiaWYgZmlsZXJlYWRhYmxlKGc6c25pZmZfbWFwcGluZ3MpfCIKKwkgICAgImV4ZWN1dGUgJ3NvdXJjZScgZzpzbmlmZl9tYXBwaW5nc3wiCisJICAgICJsZXQgZzpzbmlmZl9tYXBwaW5nc19zb3VyY2VkPTF8IgorCSJlbmRpZnwiCisgICAgImVuZGlmIiwKKworICAgIE5VTEwKK307CisKKy8qLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBDb25uZWN0VG9TbmlmZkVtYWNzIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgc25pZmZfY29ubmVjdCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIEhhbmRsZVNuaWZmUmVxdWVzdCBfX0FSR1MoKGNoYXIqIGJ1ZmZlcikpOworc3RhdGljIGludCBnZXRfcmVxdWVzdCBfX0FSR1MoKGludCBmZCwgY2hhciAqYnVmLCBpbnQgbWF4bGVuKSk7CitzdGF0aWMgdm9pZCBXcml0ZVRvU25pZmYgX19BUkdTKChjaGFyICpzdHIpKTsKK3N0YXRpYyB2b2lkIFNlbmRSZXF1ZXN0IF9fQVJHUygoc3RydWN0IHNuX2NtZCAqY29tbWFuZCwgY2hhciogc3ltYm9sKSk7CitzdGF0aWMgdm9pZCB2aV9tc2cgX19BUkdTKChjaGFyICopKTsKK3N0YXRpYyB2b2lkIHZpX2Vycm9yX21zZyBfX0FSR1MoKGNoYXIgKikpOworc3RhdGljIGNoYXIgKnZpX3N5bWJvbF91bmRlcl9jdXJzb3IgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB2aV9vcGVuX2ZpbGUgX19BUkdTKChjaGFyICopKTsKK3N0YXRpYyBjaGFyICp2aV9idWZmZXJfbmFtZSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBidWZfVCAqdmlfZmluZF9idWZmZXIgX19BUkdTKChjaGFyICopKTsKK3N0YXRpYyB2b2lkIHZpX2V4ZWNfY21kIF9fQVJHUygoY2hhciAqKSk7CitzdGF0aWMgdm9pZCB2aV9zZXRfY3Vyc29yX3BvcyBfX0FSR1MoKGxvbmcgY2hhcl9ucikpOworc3RhdGljIGxvbmcgdmlfY3Vyc29yX3BvcyBfX0FSR1MoKHZvaWQpKTsKKworLyogZGVidWcgdHJhY2UgKi8KKyNpZiAwCitzdGF0aWMgRklMRSogX3RyYWNlZmlsZSA9IE5VTEw7CisjZGVmaW5lIFNOSUZGX1RSQUNFX09QRU4oZmlsZSkgaWYgKCFfdHJhY2VmaWxlKSBfdHJhY2VmaWxlID0gZm9wZW4oZmlsZSwgInciKQorI2RlZmluZSBTTklGRl9UUkFDRShtc2cpIGZwcmludGYoX3RyYWNlZmlsZSwgbXNnKTsgZmZsdXNoKF90cmFjZWZpbGUpOworI2RlZmluZSBTTklGRl9UUkFDRTEobXNnLCBhcmcpIGZwcmludGYoX3RyYWNlZmlsZSwgbXNnLGFyZyk7IGZmbHVzaChfdHJhY2VmaWxlKTsKKyNkZWZpbmUgU05JRkZfVFJBQ0VfQ0xPU0UgZmNsb3NlKF90cmFjZWZpbGUpOyBfdHJhY2VmaWxlPU5VTEw7CisjZWxzZQorI2RlZmluZSBTTklGRl9UUkFDRV9PUEVOKGZpbGUpCisjZGVmaW5lIFNOSUZGX1RSQUNFKG1zZykKKyNkZWZpbmUgU05JRkZfVFJBQ0UxKG1zZywgYXJnKQorI2RlZmluZSBTTklGRl9UUkFDRV9DTE9TRQorI2VuZGlmCisKKy8qLS0tLS0tLS0gV2luZG93cyBPbmx5IERlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgV0lOMzIKKworc3RhdGljIGludCAgc25pZmZfcmVxdWVzdF9wcm9jZXNzZWQ9MTsKK3N0YXRpYyBIQU5ETEUgc25pZmZlbWFjc19oYW5kbGU9TlVMTDsKK3N0YXRpYyBIQU5ETEUgcmVhZHRocmVhZF9oYW5kbGU9TlVMTDsKK3N0YXRpYyBIQU5ETEUgaGFuZGxlX3RvX3NuaWZmPU5VTEw7CitzdGF0aWMgSEFORExFIGhhbmRsZV9mcm9tX3NuaWZmPU5VTEw7CisKK3N0cnVjdCBzbmlmZkJ1Zk5vZGUKK3sKKyAgICBzdHJ1Y3Qgc25pZmZCdWZOb2RlICpuZXh0OworICAgIGludCAgICBidWZMZW47CisgICAgY2hhciAgIGJ1ZltNQVhfUkVRVUVTVF9MRU5dOworfTsKK3N0YXRpYyBzdHJ1Y3Qgc25pZmZCdWZOb2RlICpzbmlmZkJ1ZlN0YXJ0PU5VTEw7CitzdGF0aWMgc3RydWN0IHNuaWZmQnVmTm9kZSAqc25pZmZCdWZFbmQ9TlVMTDsKK3N0YXRpYyBIQU5ETEUgaEJ1ZmZlck11dGV4PU5VTEw7CisKKyMgaWZkZWYgRkVBVF9HVUlfVzMyCisgICAgZXh0ZXJuIEhXTkQgc19od25kOyAgICAgICAvKiBndmltJ3MgV2luZG93IGhhbmRsZSAqLworIyBlbmRpZgorLyoKKyAqIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgV2luZG93cyBwb3J0IG9ubHkKKyAqLworCisgICAgc3RhdGljIEhBTkRMRQorRXhlY3V0ZURldGFjaGVkUHJvZ3JhbShjaGFyICpzekJpbmFyeSwgY2hhciAqc3pDbWRMaW5lLAorICAgIEhBTkRMRSBoU3RkSW5wdXQsIEhBTkRMRSBoU3RkT3V0cHV0KQoreworICAgIEJPT0wgYlJlc3VsdDsKKyAgICBEV09SRCBuRXJyb3I7CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBhUHJvY2Vzc0luZm9ybWF0aW9uOworICAgIFBST0NFU1NfSU5GT1JNQVRJT04gKnBQcm9jZXNzSW5mb3JtYXRpb249ICZhUHJvY2Vzc0luZm9ybWF0aW9uOworICAgIFNUQVJUVVBJTkZPIGFTdGFydHVwSW5mbzsKKyAgICBTVEFSVFVQSU5GTyAqcFN0YXJ0dXBJbmZvPSAmYVN0YXJ0dXBJbmZvOworICAgIERXT1JEIGR3Q3JlYXRpb25GbGFncz0gMDsKKyAgICBjaGFyIHN6UGF0aFs1MTJdOworICAgIEhJTlNUQU5DRSBoUmVzdWx0OworCisgICAgaFJlc3VsdCA9IEZpbmRFeGVjdXRhYmxlKHN6QmluYXJ5LCAiLiIsIHN6UGF0aCk7CisgICAgaWYgKChpbnQpaFJlc3VsdCA8PSAzMikKKyAgICB7CisJLyogY2FuJ3QgZmluZCB0aGUgZXhlIGZpbGUgKi8KKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBaZXJvTWVtb3J5KHBTdGFydHVwSW5mbywgc2l6ZW9mKCpwU3RhcnR1cEluZm8pKTsKKyAgICBwU3RhcnR1cEluZm8tPmR3RmxhZ3M9IFNUQVJURl9VU0VTSE9XV0lORE9XfFNUQVJURl9VU0VTVERIQU5ETEVTOworICAgIHBTdGFydHVwSW5mby0+aFN0ZElucHV0ID0gaFN0ZElucHV0OworICAgIHBTdGFydHVwSW5mby0+aFN0ZE91dHB1dCA9IGhTdGRPdXRwdXQ7CisgICAgcFN0YXJ0dXBJbmZvLT53U2hvd1dpbmRvdz0gU1dfSElERTsKKyAgICBwU3RhcnR1cEluZm8tPmNiID0gc2l6ZW9mKFNUQVJUVVBJTkZPKTsKKworICAgIGJSZXN1bHQ9IENyZWF0ZVByb2Nlc3MoCisJc3pQYXRoLAorCXN6Q21kTGluZSwKKwlOVUxMLCAgICAvKiBzZWN1cml0eSBhdHRyIGZvciBwcm9jZXNzICovCisJTlVMTCwgICAgLyogc2VjdXJpdHkgYXR0ciBmb3IgcHJpbWFyeSB0aHJlYWQgKi8KKwlUUlVFLCAgICAvKiBETyBpbmhlcml0IHN0ZGluIGFuZCBzdGRvdXQgKi8KKwlkd0NyZWF0aW9uRmxhZ3MsIC8qIGNyZWF0aW9uIGZsYWdzICovCisJTlVMTCwgICAgLyogZW52aXJvbm1lbnQgKi8KKwkiLiIsICAgIC8qIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJcFN0YXJ0dXBJbmZvLCAgIC8qIHN0YXJ0dXAgaW5mbzogTlVMTCBjcmFzaGVzICAqLworCXBQcm9jZXNzSW5mb3JtYXRpb24gLyogcHJvY2VzcyBpbmZvcm1hdGlvbjogTlVMTCBjcmFzaGVzICovCisgICAgKTsKKyAgICBuRXJyb3I9IEdldExhc3RFcnJvcigpOworICAgIGlmIChiUmVzdWx0KQorICAgIHsKKwlDbG9zZUhhbmRsZShwUHJvY2Vzc0luZm9ybWF0aW9uLT5oVGhyZWFkKTsKKwlDbG9zZUhhbmRsZShoU3RkSW5wdXQpOworCUNsb3NlSGFuZGxlKGhTdGRPdXRwdXQpOworCXJldHVybihwUHJvY2Vzc0luZm9ybWF0aW9uLT5oUHJvY2Vzcyk7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4oTlVMTCk7Cit9CisKKy8qCisgKiB3cml0ZSB0byB0aGUgaW50ZXJuYWwgVGhyZWFkIC8gVGhyZWFkIGNvbW11bmljYXRpb25zIGJ1ZmZlci4KKyAqIFJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGVsc2UuCisgKi8KKyAgICBzdGF0aWMgQk9PTAord3JpdGVUb0J1ZmZlcihjaGFyICptc2csIGludCBsZW4pCit7CisgICAgRFdPUkQgZHdXYWl0UmVzdWx0OyAgICAgLyogUmVxdWVzdCBvd25lcnNoaXAgb2YgbXV0ZXguICovCisgICAgc3RydWN0IHNuaWZmQnVmTm9kZSAqYm47CisgICAgaW50IGJuU2l6ZTsKKworICAgIFNOSUZGX1RSQUNFMSgid3JpdGVUb0J1ZmZlciAlZFxuIiwgbGVuKTsKKyAgICBiblNpemUgPSBzaXplb2Yoc3RydWN0IHNuaWZmQnVmTm9kZSkgLSBNQVhfUkVRVUVTVF9MRU4gKyBsZW4gKyAxOworICAgIGlmIChiblNpemUgPCAxMjgpIGJuU2l6ZSA9IDEyODsgLyogbWluaW11bSBsZW5ndGggdG8gYXZvaWQgZnJhZ21lbnRhdGlvbiAqLworICAgIGJuID0gKHN0cnVjdCBzbmlmZkJ1Zk5vZGUgKiltYWxsb2MoYm5TaXplKTsKKyAgICBpZiAoIWJuKQorCXJldHVybiBGQUxTRTsKKworICAgIG1lbWNweShibi0+YnVmLCBtc2csIGxlbik7CisgICAgYm4tPmJ1ZltsZW5dPSdcMCc7ICAgIC8qIHRlcm1pbmF0ZSBDU3RyaW5nIGZvciBhZGRlZCBzYWZldHkgKi8KKyAgICBibi0+bmV4dCA9IE5VTEw7CisgICAgYm4tPmJ1ZkxlbiA9IGxlbjsKKyAgICAvKiBub3csIGFjcXVpcmUgYSBNdXRleCBmb3IgYWRkaW5nIHRoZSBzdHJpbmcgdG8gb3VyIGxpbmtlZCBsaXN0ICovCisgICAgZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCgKKwloQnVmZmVyTXV0ZXgsICAgLyogaGFuZGxlIG9mIG11dGV4ICovCisJMTAwMEwpOyAgIC8qIG9uZS1zZWNvbmQgdGltZS1vdXQgaW50ZXJ2YWwgKi8KKyAgICBpZiAoZHdXYWl0UmVzdWx0ID09IFdBSVRfT0JKRUNUXzApCisgICAgeworCS8qIFRoZSB0aHJlYWQgZ290IG11dGV4IG93bmVyc2hpcC4gKi8KKwlpZiAoc25pZmZCdWZFbmQpCisJeworCSAgICBzbmlmZkJ1ZkVuZC0+bmV4dCA9IGJuOworCSAgICBzbmlmZkJ1ZkVuZCA9IGJuOworCX0KKwllbHNlCisJICAgIHNuaWZmQnVmU3RhcnQgPSBzbmlmZkJ1ZkVuZCA9IGJuOworCS8qIFJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoZSBtdXRleCBvYmplY3QuICovCisJaWYgKCEgUmVsZWFzZU11dGV4KGhCdWZmZXJNdXRleCkpCisJeworCSAgICAvKiBEZWFsIHdpdGggZXJyb3IuICovCisJfQorCXJldHVybiBUUlVFOworICAgIH0KKworICAgIC8qIENhbm5vdCBnZXQgbXV0ZXggb3duZXJzaGlwIGR1ZSB0byB0aW1lLW91dCBvciBtdXRleCBvYmplY3QgYWJhbmRvbmVkLiAqLworICAgIGZyZWUoYm4pOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIHJlYWQgZnJvbSB0aGUgaW50ZXJuYWwgVGhyZWFkIC8gVGhyZWFkIGNvbW11bmljYXRpb25zIGJ1ZmZlci4KKyAqIFJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGVsc2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitSZWFkRnJvbUJ1ZmZlcihjaGFyICpidWYsIGludCBtYXhsZW4pCit7CisgICAgRFdPUkQgZHdXYWl0UmVzdWx0OyAgICAgLyogUmVxdWVzdCBvd25lcnNoaXAgb2YgbXV0ZXguICovCisgICAgaW50ICAgdGhlTGVuOworICAgIHN0cnVjdCBzbmlmZkJ1Zk5vZGUgKmJuOworCisgICAgZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCgKKwloQnVmZmVyTXV0ZXgsICAgLyogaGFuZGxlIG9mIG11dGV4ICovCisJMTAwMEwpOwkJLyogb25lLXNlY29uZCB0aW1lLW91dCBpbnRlcnZhbCAqLworICAgIGlmIChkd1dhaXRSZXN1bHQgPT0gV0FJVF9PQkpFQ1RfMCkKKyAgICB7CisJaWYgKCFzbmlmZkJ1ZlN0YXJ0KQorCXsKKwkgICAgLyogYWxsIHBlbmRpbmcgUmVxdWVzdHMgUHJvY2Vzc2VkICovCisJICAgIHRoZUxlbiA9IDA7CisJfQorCWVsc2UKKwl7CisJICAgIGJuID0gc25pZmZCdWZTdGFydDsKKwkgICAgdGhlTGVuID0gYm4tPmJ1ZkxlbjsKKwkgICAgU05JRkZfVFJBQ0UxKCJSZWFkRnJvbUJ1ZmZlciAlZFxuIiwgdGhlTGVuKTsKKwkgICAgaWYgKHRoZUxlbiA+PSBtYXhsZW4pCisJICAgIHsKKwkJLyogbm90aWZ5IHRoZSB1c2VyIG9mIGJ1ZmZlciBvdmVyZmxvdz8gKi8KKwkJdGhlTGVuID0gbWF4bGVuLTE7CisJICAgIH0KKwkgICAgbWVtY3B5KGJ1ZiwgYm4tPmJ1ZiwgdGhlTGVuKTsKKwkgICAgYnVmW3RoZUxlbl0gPSAnXDAnOworCSAgICBpZiAoISAoc25pZmZCdWZTdGFydCA9IGJuLT5uZXh0KSkKKwkgICAgeworCQlzbmlmZkJ1ZkVuZCA9IE5VTEw7CisJCXNuaWZmX3JlcXVlc3RfcHJvY2Vzc2VkID0gMTsKKwkgICAgfQorCSAgICBmcmVlKGJuKTsKKwl9CisJaWYgKCEgUmVsZWFzZU11dGV4KGhCdWZmZXJNdXRleCkpCisJeworCSAgICAvKiBEZWFsIHdpdGggZXJyb3IuICovCisJfQorCXJldHVybiB0aGVMZW47CisgICAgfQorCisgICAgLyogQ2Fubm90IGdldCBtdXRleCBvd25lcnNoaXAgZHVlIHRvIHRpbWUtb3V0IG9yIG11dGV4IG9iamVjdCBhYmFuZG9uZWQuICovCisgICAgcmV0dXJuIC0xOworfQorCisvKiBvbiBXaW4zMiwgYSBzZXBhcmF0ZSBUaHJlYWQgcmVhZHMgdGhlIGlucHV0IHBpcGUuIGdldF9yZXF1ZXN0IGlzIG5vdCBuZWVkZWQgaGVyZS4gKi8KKyAgICBzdGF0aWMgdm9pZCBfX2NkZWNsCitTbmlmZkVtYWNzUmVhZFRocmVhZCh2b2lkICpkdW1teSkKK3sKKyAgICBzdGF0aWMgY2hhcglSZWFkVGhyZWFkQnVmZmVyW01BWF9SRVFVRVNUX0xFTl07CisgICAgaW50CQlSZWFkVGhyZWFkTGVuPTA7CisgICAgaW50CQlyZXN1bHQ9MDsKKyAgICBpbnQJCW1zZ0xlbj0wOworICAgIGNoYXIJKm1zZ1N0YXJ0LCAqbXNnQ3VyOworCisgICAgU05JRkZfVFJBQ0UoImJlZ2luIHRocmVhZFxuIik7CisgICAgLyogUmVhZCBmcm9tIHRoZSBwaXBlIHRvIFNuaWZmRW1hY3MgKi8KKyAgICB3aGlsZSAoc25pZmZfY29ubmVjdGVkKQorICAgIHsKKwlpZiAoIVJlYWRGaWxlKGhhbmRsZV9mcm9tX3NuaWZmLAorCQlSZWFkVGhyZWFkQnVmZmVyICsgUmVhZFRocmVhZExlbiwgICAgLyogYWNrbm93bGVkZ2UgcmVzdCBpbiBidWZmZXIgKi8KKwkJTUFYX1JFUVVFU1RfTEVOIC0gUmVhZFRocmVhZExlbiwKKwkJJnJlc3VsdCwKKwkJTlVMTCkpCisJeworCSAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKwkgICAgcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHJlc3VsdCA8IDApCisJeworCSAgICAvKiBwcm9iYWJseSBzbmlmZmVtYWNzIGRpZWQuLi4gbG9nIHRoZSBFcnJvcj8gKi8KKwkgICAgc25pZmZfZGlzY29ubmVjdCgxKTsKKwl9CisJZWxzZSBpZiAocmVzdWx0ID4gMCkKKwl7CisJICAgIFJlYWRUaHJlYWRMZW4gKz0gcmVzdWx0LTE7ICAgLyogdG90YWwgbGVuZ3RoIG9mIHZhbGlkIGNoYXJzICovCisJICAgIGZvcihtc2dDdXI9bXNnU3RhcnQ9UmVhZFRocmVhZEJ1ZmZlcjsgUmVhZFRocmVhZExlbiA+IDA7IG1zZ0N1cisrLCBSZWFkVGhyZWFkTGVuLS0pCisJICAgIHsKKwkJaWYgKCptc2dDdXIgPT0gJ1wwJyB8fCAqbXNnQ3VyID09ICdccicgfHwgKm1zZ0N1ciA9PSAnXG4nKQorCQl7CisJCSAgICBtc2dMZW4gPSBtc2dDdXItbXNnU3RhcnQ7IC8qIGRvbid0IGFkZCB0aGUgQ1IvTEYgY2hhcnMgKi8KKwkJICAgIGlmIChtc2dMZW4gPiAwKQorCQkJd3JpdGVUb0J1ZmZlcihtc2dTdGFydCwgbXNnTGVuKTsKKwkJICAgIG1zZ1N0YXJ0ID0gbXNnQ3VyICsgMTsgLyogb3Zlci1yZWFkIHNpbmdsZSBDUi9MRiBjaGFycyAqLworCQl9CisJICAgIH0KKworCS8qIG1vdmUgaW5jb21wbGV0ZSBtZXNzYWdlIHRvIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KKwlSZWFkVGhyZWFkTGVuID0gbXNnQ3VyIC0gbXNnU3RhcnQ7CisJaWYgKFJlYWRUaHJlYWRMZW4gPiAwKQorCSAgICBtY2hfbWVtbW92ZShSZWFkVGhyZWFkQnVmZmVyLCBtc2dTdGFydCwgUmVhZFRocmVhZExlbik7CisKKwlpZiAoc25pZmZfcmVxdWVzdF9wcm9jZXNzZWQpCisJeworCSAgICAvKiBub3RpZnkgb3RoZXJzIHRoYXQgbmV3IGRhdGEgaGFzIGFycml2ZWQgKi8KKwkgICAgc25pZmZfcmVxdWVzdF9wcm9jZXNzZWQgPSAwOworCSAgICBzbmlmZl9yZXF1ZXN0X3dhaXRpbmcgPSAxOworI2lmZGVmIEZFQVRfR1VJX1czMgorCSAgICBQb3N0TWVzc2FnZShzX2h3bmQsIFdNX1VTRVIsIChXUEFSQU0pMCwgKExQQVJBTSkwKTsKKyNlbmRpZgorCSAgICB9CisJfQorICAgIH0KKyAgICBTTklGRl9UUkFDRSgiZW5kIHRocmVhZFxuIik7Cit9CisjZW5kaWYgLyogV0lOMzIgKi8KKy8qLS0tLS0tLS0gRW5kIG9mIFdpbmRvd3MgT25seSBEZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBQcm9jZXNzU25pZmZSZXF1ZXN0cworICogRnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZyb20gb3V0c2lkZQorICogdG8gcHJvY2VzcyB0aGUgd2FpdGluZyBzbmlmZiByZXF1ZXN0cworICovCisgICAgdm9pZAorUHJvY2Vzc1NuaWZmUmVxdWVzdHMoKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZltNQVhfUkVRVUVTVF9MRU5dOworICAgIGludCBsZW47CisKKyAgICB3aGlsZSAoc25pZmZfY29ubmVjdGVkKQorICAgIHsKKyNpZmRlZiBXSU4zMgorCWxlbiA9IFJlYWRGcm9tQnVmZmVyKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworI2Vsc2UKKwlsZW4gPSBnZXRfcmVxdWVzdChmZF9mcm9tX3NuaWZmLCBidWYsIHNpemVvZihidWYpKTsKKyNlbmRpZgorCWlmIChsZW4gPCAwKQorCXsKKwkgICAgdmlfZXJyb3JfbXNnKF8oIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIikpOworCSAgICBzbmlmZl9kaXNjb25uZWN0KDEpOworCSAgICBicmVhazsKKwl9CisJZWxzZSBpZiAobGVuID4gMCkKKwkgICAgSGFuZGxlU25pZmZSZXF1ZXN0KCBidWYgKTsKKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzbmlmZl93aWxsX2Rpc2Nvbm5lY3QpCS8qIE5vdyB0aGUgbGFzdCBtc2cgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisJc25pZmZfZGlzY29ubmVjdCgxKTsKK30KKworICAgIHN0YXRpYyBzdHJ1Y3Qgc25fY21kICoKK2ZpbmRfc25pZmZfY21kKGNtZCkKKyAgICBjaGFyICpjbWQ7Cit7CisgICAgc3RydWN0IHNuX2NtZCAqc25pZmZfY21kID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyBzbmlmZl9jbWRzW2ldLmNtZF9uYW1lOyBpKyspCisgICAgeworCWlmICghc3RyY21wKGNtZCwgc25pZmZfY21kc1tpXS5jbWRfbmFtZSkpCisJeworCSAgICBzbmlmZl9jbWQgPSAmc25pZmZfY21kc1tpXTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoIXNuaWZmX2NtZCkKKyAgICB7CisJc3RydWN0IHNuX2NtZF9saXN0ICpsaXN0ID0gc25pZmZfY21kX2V4dDsKKwl3aGlsZShsaXN0KQorCXsKKwkgICAgaWYgKCFzdHJjbXAoY21kLCBsaXN0LT5zbmlmZl9jbWQtPmNtZF9uYW1lKSkKKwkgICAgeworCQlzbmlmZl9jbWQgPSBsaXN0LT5zbmlmZl9jbWQ7CisJCWJyZWFrOworCSAgICB9CisJICAgIGxpc3QgPSBsaXN0LT5uZXh0X2NtZDsKKwl9CisgICAgfQorICAgIHJldHVybiBzbmlmZl9jbWQ7Cit9CisKKyAgICBzdGF0aWMgaW50CithZGRfc25pZmZfY21kKGNtZCwgZGVmLCBtc2cpCisgICAgY2hhciAqY21kOworICAgIGNoYXIgKmRlZjsKKyAgICBjaGFyICptc2c7Cit7CisgICAgaW50IHJjID0gMDsKKyAgICBpZiAoZGVmICE9IE5VTEwgJiYgZGVmWzBdICE9IE5VTCAmJiBmaW5kX3NuaWZmX2NtZChjbWQpID09IE5VTEwpCisgICAgeworCXN0cnVjdCBzbl9jbWRfbGlzdCAqbGlzdCA9IHNuaWZmX2NtZF9leHQ7CisJc3RydWN0IHNuX2NtZCAqc25pZmZfY21kID0gKHN0cnVjdCBzbl9jbWQqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNuX2NtZCkpOworCXN0cnVjdCBzbl9jbWRfbGlzdCAqY21kX25vZGUgPSAoc3RydWN0IHNuX2NtZF9saXN0KiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9jbWRfbGlzdCkpOworCWludCBycV90eXBlID0gMDsKKworCS8qIHVuZXNjYXBlIG1lc3NhZ2UgdGV4dCAqLworCWNoYXIgKnAgPSBtc2c7CisJY2hhciAqZW5kID0gcCtzdHJsZW4obXNnKTsKKwl3aGlsZSgqcCkKKwl7CisJICAgIGlmICgqcCA9PSAnXFwnKQorCQltY2hfbWVtbW92ZShwLHArMSxlbmQtcCk7CisJICAgIHArKzsKKwl9CisJU05JRkZfVFJBQ0UxKCJyZXF1ZXN0IG5hbWUgPSAlc1xuIixjbWQpOworCVNOSUZGX1RSQUNFMSgicmVxdWVzdCBkZWYgPSAlc1xuIixkZWYpOworCVNOSUZGX1RSQUNFMSgicmVxdWVzdCBtc2cgPSAlc1xuIixtc2cpOworCisJd2hpbGUobGlzdCAmJiBsaXN0LT5uZXh0X2NtZCkKKwkgICAgbGlzdCA9IGxpc3QtPm5leHRfY21kOworCWlmICghbGlzdCkKKwkgICAgc25pZmZfY21kX2V4dCA9IGNtZF9ub2RlOworCWVsc2UKKwkgICAgbGlzdC0+bmV4dF9jbWQgPSBjbWRfbm9kZTsKKworCXNuaWZmX2NtZC0+Y21kX25hbWUgPSBjbWQ7CisJc25pZmZfY21kLT5jbWRfY29kZSA9IGRlZlswXTsKKwlzbmlmZl9jbWQtPmNtZF9tc2cgPSBtc2c7CisJc3dpdGNoKGRlZlsxXSkKKwl7CisJICAgIGNhc2UgJ2YnOgorCQlycV90eXBlID0gUlFfTk9TWU1CT0w7CisJCWJyZWFrOworCSAgICBjYXNlICdzJzoKKwkJcnFfdHlwZSA9IFJRX0NPTlRFWFQ7CisJCWJyZWFrOworCSAgICBjYXNlICdTJzoKKwkJcnFfdHlwZSA9IFJRX1NDT05URVhUOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcnFfdHlwZSA9IFJRX1NJTVBMRTsKKwkJYnJlYWs7CisJfQorCXNuaWZmX2NtZC0+Y21kX3R5cGUgPSBycV90eXBlOworCWNtZF9ub2RlLT5zbmlmZl9jbWQgPSBzbmlmZl9jbWQ7CisJY21kX25vZGUtPm5leHRfY21kID0gTlVMTDsKKwlyYyA9IDE7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogZXhfc25pZmYKKyAqIEhhbmRsZSAiOnNuaWZmIiBjb21tYW5kCisgKi8KKyAgICB2b2lkCitleF9zbmlmZihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91ICpzeW1ib2wgPSBOVUxMOworICAgIGNoYXJfdSAqY21kID0gTlVMTDsKKworICAgIFNOSUZGX1RSQUNFX09QRU4oImlmX3NuaWZmLmxvZyIpOworICAgIGlmIChlbmRzX2V4Y21kKCphcmcpKQkvKiBubyByZXF1ZXN0OiBwcmludCBhdmFpbGFibGUgY29tbWFuZHMgKi8KKyAgICB7CisJaW50IGk7CisJbXNnX3N0YXJ0KCk7CisJbXNnX291dHRyYW5zX2F0dHIoKGNoYXJfdSAqKSItLSBTTmlGRisgY29tbWFuZHMgLS0iLCBobF9hdHRyKEhMRl9UKSk7CisJZm9yKGk9MDsgc25pZmZfY21kc1tpXS5jbWRfbmFtZTsgaSsrKQorCXsKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJICAgIG1zZ19vdXR0cmFucygoY2hhcl91ICopIjpzbmlmZiAiKTsKKwkgICAgbXNnX291dHRyYW5zKChjaGFyX3UgKilzbmlmZl9jbWRzW2ldLmNtZF9uYW1lKTsKKwl9CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJbXNnX291dHRyYW5zKChjaGFyX3UgKilfKCJTTmlGRisgaXMgY3VycmVudGx5ICIpKTsKKwlpZiAoIXNuaWZmX2Nvbm5lY3RlZCkKKwkgICAgbXNnX291dHRyYW5zKChjaGFyX3UgKilfKCJub3QgIikpOworCW1zZ19vdXR0cmFucygoY2hhcl91ICopXygiY29ubmVjdGVkIikpOworCW1zZ19lbmQoKTsKKyAgICB9CisgICAgZWxzZQkvKiBleHRyYWN0IGNvbW1hbmQgbmFtZSBhbmQgc3ltYm9sIGlmIHByZXNlbnQgKi8KKyAgICB7CisJc3ltYm9sID0gc2tpcHRvd2hpdGUoYXJnKTsKKwljbWQgID0gdmltX3N0cm5zYXZlKGFyZywgKGludCkoc3ltYm9sLWFyZykpOworCXN5bWJvbCA9IHNraXB3aGl0ZShzeW1ib2wpOworCWlmIChlbmRzX2V4Y21kKCpzeW1ib2wpKQorCSAgICBzeW1ib2wgPSBOVUxMOworCWlmICghc3RyY21wKChjaGFyICopY21kLCAiYWRkY21kIikpCisJeworCSAgICBjaGFyX3UgKmRlZiA9IHNraXB0b3doaXRlKHN5bWJvbCk7CisJICAgIGNoYXJfdSAqbmFtZSA9IHZpbV9zdHJuc2F2ZShzeW1ib2wsIChpbnQpKGRlZi1zeW1ib2wpKTsKKwkgICAgY2hhcl91ICptc2c7CisJICAgIGRlZiA9IHNraXB3aGl0ZShkZWYpOworCSAgICBtc2cgPSBza2lwdG93aGl0ZShkZWYpOworCSAgICBkZWYgPSB2aW1fc3RybnNhdmUoZGVmLCAoaW50KShtc2ctZGVmKSk7CisJICAgIG1zZyA9IHNraXB3aGl0ZShtc2cpOworCSAgICBpZiAoZW5kc19leGNtZCgqbXNnKSkKKwkJbXNnID0gdmltX3N0cnNhdmUobmFtZSk7CisJICAgIGVsc2UKKwkJbXNnID0gdmltX3N0cm5zYXZlKG1zZywgKGludCkoc2tpcHRvd2hpdGVfZXNjKG1zZyktbXNnKSk7CisJICAgIGlmICghYWRkX3NuaWZmX2NtZCgoY2hhciopbmFtZSwgKGNoYXIqKWRlZiwgKGNoYXIqKW1zZykpCisJICAgIHsKKwkJdmltX2ZyZWUobXNnKTsKKwkJdmltX2ZyZWUoZGVmKTsKKwkJdmltX2ZyZWUobmFtZSk7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgc3RydWN0IHNuX2NtZCogc25pZmZfY21kID0gZmluZF9zbmlmZl9jbWQoKGNoYXIqKWNtZCk7CisJICAgIGlmIChzbmlmZl9jbWQpCisJCVNlbmRSZXF1ZXN0KHNuaWZmX2NtZCwgKGNoYXIgKilzeW1ib2wpOworCSAgICBlbHNlCisJCUVNU0cyKF8oIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIiksIGNtZCk7CisJfQorCXZpbV9mcmVlKGNtZCk7CisgICAgfQorfQorCisKKyAgICBzdGF0aWMgdm9pZAorc25pZmZfY29ubmVjdCgpCit7CisgICAgaWYgKHNuaWZmX2Nvbm5lY3RlZCkKKwlyZXR1cm47CisgICAgaWYgKENvbm5lY3RUb1NuaWZmRW1hY3MoKSkKKwl2aV9lcnJvcl9tc2coXygiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiKSk7CisgICAgZWxzZQorICAgIHsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGluaXRfY21kc1tpXTsgaSsrKQorCSAgICB2aV9leGVjX2NtZChpbml0X2NtZHNbaV0pOworICAgIH0KK30KKworICAgIHZvaWQKK3NuaWZmX2Rpc2Nvbm5lY3QoaW1tZWRpYXRlbHkpCisgICAgaW50IGltbWVkaWF0ZWx5OworeworICAgIGlmICghc25pZmZfY29ubmVjdGVkKQorCXJldHVybjsKKyAgICBpZiAoaW1tZWRpYXRlbHkpCisgICAgeworCXZpX2V4ZWNfY21kKCJhdWdyb3VwIHNuaWZmIik7CisJdmlfZXhlY19jbWQoImF1ISIpOworCXZpX2V4ZWNfY21kKCJhdWdyb3VwIEVORCIpOworCXZpX2V4ZWNfY21kKCJ1bmxldCBnOnNuaWZmX2Nvbm5lY3RlZCIpOworCXNuaWZmX2Nvbm5lY3RlZCA9IDA7CisJd2FudF9zbmlmZl9yZXF1ZXN0ID0gMDsKKwlzbmlmZl93aWxsX2Rpc2Nvbm5lY3QgPSAwOworI2lmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5pbl91c2UpCisJICAgIGd1aV9tY2hfd2FpdF9mb3JfY2hhcnMoMEwpOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKwl3aGlsZShzbmlmZkJ1ZlN0YXJ0ICE9IE5VTEwpCisJeworCSAgICBzdHJ1Y3Qgc25pZmZCdWZOb2RlICpub2RlID0gc25pZmZCdWZTdGFydDsKKwkgICAgc25pZmZCdWZTdGFydCA9IHNuaWZmQnVmU3RhcnQtPm5leHQ7CisJICAgIGZyZWUobm9kZSk7CisJfQorCXNuaWZmQnVmU3RhcnQgPSBzbmlmZkJ1ZkVuZCA9IE5VTEw7CisJc25pZmZfcmVxdWVzdF9wcm9jZXNzZWQgPSAxOworCUNsb3NlSGFuZGxlKGhhbmRsZV90b19zbmlmZik7CisJQ2xvc2VIYW5kbGUoaGFuZGxlX2Zyb21fc25pZmYpOworCVdhaXRGb3JTaW5nbGVPYmplY3Qoc25pZmZlbWFjc19oYW5kbGUsIDEwMDBMKTsKKwlDbG9zZUhhbmRsZShzbmlmZmVtYWNzX2hhbmRsZSk7CisJc25pZmZlbWFjc19oYW5kbGUgPSBOVUxMOworCVdhaXRGb3JTaW5nbGVPYmplY3QocmVhZHRocmVhZF9oYW5kbGUsIDEwMDBMKTsKKwlyZWFkdGhyZWFkX2hhbmRsZSA9IE5VTEw7CisJQ2xvc2VIYW5kbGUoaEJ1ZmZlck11dGV4KTsKKwloQnVmZmVyTXV0ZXggPSBOVUxMOworCVNOSUZGX1RSQUNFX0NMT1NFOworI2Vsc2UKKwljbG9zZShmZF90b19zbmlmZik7CisJY2xvc2UoZmRfZnJvbV9zbmlmZik7CisJd2FpdChOVUxMKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJTjMyCisJX3NsZWVwKDIpOworCWlmICghc25pZmZfcmVxdWVzdF9wcm9jZXNzZWQpCisJICAgIFByb2Nlc3NTbmlmZlJlcXVlc3RzKCk7CisjZWxzZQorCXNsZWVwKDIpOwkJICAgIC8qIEluY29taW5nIG1zZyBjb3VsZCBkaXN0dXJiIGVkaXQgKi8KKyNlbmRpZgorCXNuaWZmX3dpbGxfZGlzY29ubmVjdCA9IDE7ICAvKiBXZSBleHBlY3QgZGlzY29ubmVjdCBtc2cgaW4gMiBzZWNzICovCisgICAgfQorfQorCisKKy8qIENvbm5lY3RUb1NuaWZmRW1hY3MKKyAqIENvbm5lY3QgdG8gU25pZmY6IHJldHVybnMgMSBvbiBlcnJvcgorICovCisgICAgc3RhdGljIGludAorQ29ubmVjdFRvU25pZmZFbWFjcygpCit7CisjaWZkZWYgV0lOMzIJCS8qIFdpbmRvd3MgVmVyc2lvbiBvZiB0aGUgQ29kZSAqLworICAgIEhBTkRMRSBUb1NuaWZmRW1hY3NbMl0sIEZyb21TbmlmZkVtYWNzWzJdOworICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7CisKKyAgICBzYS5uTGVuZ3RoID0gc2l6ZW9mKHNhKTsKKyAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9IE5VTEw7CisgICAgc2EuYkluaGVyaXRIYW5kbGUgPSBUUlVFOworCisgICAgaWYgKCEgQ3JlYXRlUGlwZSgmVG9TbmlmZkVtYWNzWzBdLCAmVG9TbmlmZkVtYWNzWzFdLCAmc2EsIDApKQorCXJldHVybiAxOworICAgIGlmICghIENyZWF0ZVBpcGUoJkZyb21TbmlmZkVtYWNzWzBdLCAmRnJvbVNuaWZmRW1hY3NbMV0sICZzYSwgMCkpCisJcmV0dXJuIDE7CisKKyAgICBzbmlmZmVtYWNzX2hhbmRsZSA9IEV4ZWN1dGVEZXRhY2hlZFByb2dyYW0oU25pZmZFbWFjc1swXSwgU25pZmZFbWFjc1swXSwKKwlUb1NuaWZmRW1hY3NbMF0sIEZyb21TbmlmZkVtYWNzWzFdKTsKKworICAgIGlmIChzbmlmZmVtYWNzX2hhbmRsZSkKKyAgICB7CisJaGFuZGxlX3RvX3NuaWZmICA9IFRvU25pZmZFbWFjc1sxXTsKKwloYW5kbGVfZnJvbV9zbmlmZiA9IEZyb21TbmlmZkVtYWNzWzBdOworCXNuaWZmX2Nvbm5lY3RlZCA9IDE7CisJaEJ1ZmZlck11dGV4ID0gQ3JlYXRlTXV0ZXgoCisJICAgIE5VTEwsCQkJLyogbm8gc2VjdXJpdHkgYXR0cmlidXRlcyAqLworCSAgICBGQUxTRSwJCQkvKiBpbml0aWFsbHkgbm90IG93bmVkICovCisJICAgICJTbmlmZlJlYWRCdWZmZXJNdXRleCIpOyAgICAvKiBuYW1lIG9mIG11dGV4ICovCisJaWYgKGhCdWZmZXJNdXRleCA9PSBOVUxMKQorCXsKKwkgICAgLyogQ2hlY2sgZm9yIGVycm9yLiAqLworCX0KKwlyZWFkdGhyZWFkX2hhbmRsZSA9IChIQU5ETEUpX2JlZ2ludGhyZWFkKFNuaWZmRW1hY3NSZWFkVGhyZWFkLCAwLCBOVUxMKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBlcnJvciBpbiBzcGF3bigpICovCisJcmV0dXJuIDE7CisgICAgfQorCisjZWxzZQkJLyogVU5JWCBWZXJzaW9uIG9mIHRoZSBDb2RlICovCisgICAgaW50IFRvU25pZmZFbWFjc1syXSwgRnJvbVNuaWZmRW1hY3NbMl07CisKKyAgICBwaXBlKFRvU25pZmZFbWFjcyk7CisgICAgcGlwZShGcm9tU25pZmZFbWFjcyk7CisKKyAgICAvKiBmb3JrICovCisgICAgaWYgKChzbmlmZmVtYWNzX3BpZD1mb3JrKCkpID09IDApCisgICAgeworCS8qIGNoaWxkICovCisKKwkvKiBwcmVwYXJlIGNvbW11bmljYXRpb24gcGlwZXMgKi8KKwljbG9zZShUb1NuaWZmRW1hY3NbMV0pOworCWNsb3NlKEZyb21TbmlmZkVtYWNzWzBdKTsKKworCWR1cDIoVG9TbmlmZkVtYWNzWzBdLGZpbGVubyhzdGRpbikpOyAgIC8qIHdyaXRlIHRvIFRvU25pZmZFbWFjc1sxXSAqLworCWR1cDIoRnJvbVNuaWZmRW1hY3NbMV0sZmlsZW5vKHN0ZG91dCkpOy8qIHJlYWQgZnJvbSBGcm9tU25pZmZFbWFjc1swXSAqLworCisJY2xvc2UoVG9TbmlmZkVtYWNzWzBdKTsKKwljbG9zZShGcm9tU25pZmZFbWFjc1sxXSk7CisKKwkvKiBzdGFydCBzbmlmZmVtYWNzICovCisJZXhlY3ZwIChTbmlmZkVtYWNzWzBdLCBTbmlmZkVtYWNzKTsKKwl7CisvKgkgICAgRklMRSAqb3V0ID0gZmRvcGVuKEZyb21TbmlmZkVtYWNzWzFdLCAidyIpOyAqLworCSAgICBzbGVlcCgxKTsKKwkgICAgZnB1dHMoXyhtc2dfc25pZmZfZGlzY29ubmVjdCksIHN0ZG91dCk7CisJICAgIGZmbHVzaChzdGRvdXQpOworCSAgICBzbGVlcCgzKTsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkJZ3VpX2V4aXQoMSk7CisjZW5kaWYKKwkgICAgZXhpdCgxKTsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKHNuaWZmZW1hY3NfcGlkID4gMCkKKyAgICB7CisJLyogcGFyZW50IHByb2Nlc3MgKi8KKwljbG9zZShUb1NuaWZmRW1hY3NbMF0pOworCWZkX3RvX3NuaWZmICA9IFRvU25pZmZFbWFjc1sxXTsKKwljbG9zZShGcm9tU25pZmZFbWFjc1sxXSk7CisJZmRfZnJvbV9zbmlmZiA9IEZyb21TbmlmZkVtYWNzWzBdOworCXNuaWZmX2Nvbm5lY3RlZCA9IDE7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgICAvKiBlcnJvciBpbiBmb3JrKCkgKi8KKwlyZXR1cm4gMTsKKyNlbmRpZgkJLyogVU5JWCBWZXJzaW9uIG9mIHRoZSBDb2RlICovCit9CisKKworLyogSGFuZGxlU25pZmZSZXF1ZXN0CisgKiBIYW5kbGUgb25lIHJlcXVlc3QgZnJvbSBTTmlGRisKKyAqLworICAgIHN0YXRpYyB2b2lkCitIYW5kbGVTbmlmZlJlcXVlc3QoYnVmZmVyKQorICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgICBjaGFyIFZJQ29tbWFuZFtNQVhfUkVRVUVTVF9MRU5dOworICAgIGNoYXIgY29tbWFuZDsKKyAgICBjaGFyICphcmd1bWVudHM7CisgICAgY2hhciAqdG9rZW47CisgICAgY2hhciAqYXJndlszXTsKKyAgICBpbnQgYXJnYyA9IDA7CisgICAgYnVmX1QgICpidWY7CisKKyAgICBjb25zdCBjaGFyICpTZXRUYWIgICAgID0gInNldCB0YWJzdG9wPSVkIjsKKyAgICBjb25zdCBjaGFyICpTZWxlY3RCdWYgID0gImJ1ZiAlcyI7CisgICAgY29uc3QgY2hhciAqRGVsZXRlQnVmICA9ICJiZCAlcyI7CisgICAgY29uc3QgY2hhciAqVW5sb2FkQnVmICA9ICJidW4gJXMiOworICAgIGNvbnN0IGNoYXIgKkdvdG9MaW5lICAgPSAiJWQiOworCisgICAgY29tbWFuZCAgID0gYnVmZmVyWzBdOworICAgIGFyZ3VtZW50cyA9ICZidWZmZXJbMV07CisgICAgdG9rZW4gPSBzdHJ0b2soYXJndW1lbnRzLCBzbmlmZl9ycV9zZXApOworICAgIHdoaWxlKGFyZ2MgPDMpCisgICAgeworCWlmICh0b2tlbikKKwl7CisJICAgIGFyZ3ZbYXJnY10gPSAoY2hhciopdmltX3N0cnNhdmUoKGNoYXJfdSAqKXRva2VuKTsKKwkgICAgdG9rZW4gPSBzdHJ0b2soMCwgc25pZmZfcnFfc2VwKTsKKwl9CisJZWxzZQorCSAgICBhcmd2W2FyZ2NdID0gc3RyZHVwKCIiKTsKKwlhcmdjKys7CisgICAgfQorCisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKwljYXNlICdvJyA6ICAvKiB2aXNpdCBmaWxlIGF0IGNoYXIgcG9zICovCisJY2FzZSAnTycgOiAgLyogdmlzaXQgZmlsZSBhdCBsaW5lIG51bWJlciAqLworCXsKKwkgICAgY2hhciAqZmlsZSA9IGFyZ3ZbMF07CisJICAgIGludCBwb3NpdGlvbiA9IGF0b2koYXJndlsxXSk7CisKKwkgICAgYnVmID0gdmlfZmluZF9idWZmZXIoZmlsZSk7CisJICAgIHNldHBjbWFyaygpOyAgICAgIC8qIGluc2VydCBjdXJyZW50IHBvcyBpbiBqdW1wIGxpc3QgW21hcmsuY10qLworCSAgICBpZiAoIWJ1ZikKKwkJdmlfb3Blbl9maWxlKGZpbGUpOworCSAgICBlbHNlIGlmIChidWYhPWN1cmJ1ZikKKwkgICAgeworCQlzcHJpbnRmKFZJQ29tbWFuZCwgU2VsZWN0QnVmLCBmaWxlKTsKKwkJdmlfZXhlY19jbWQoVklDb21tYW5kKTsKKwkgICAgfQorCSAgICBpZiAoY29tbWFuZCA9PSAnbycpCisJCXZpX3NldF9jdXJzb3JfcG9zKChsb25nKXBvc2l0aW9uKTsKKwkgICAgZWxzZQorCSAgICB7CisJCXNwcmludGYoVklDb21tYW5kLCBHb3RvTGluZSwgKGludClwb3NpdGlvbik7CisJCXZpX2V4ZWNfY21kKFZJQ29tbWFuZCk7CisJICAgIH0KKwkgICAgY2hlY2twY21hcmsoKTsJLyogW21hcmsuY10gKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1gxMSkgfHwgZGVmaW5lZChGRUFUX0dVSV9XMzIpCisJICAgIGlmIChndWkuaW5fdXNlICYmICFndWkuaW5fZm9jdXMpICAvKiBSYWlzZSBWaW0gV2luZG93ICovCisJICAgIHsKKyMgaWZkZWYgRkVBVF9HVUlfVzMyCisJCVNldEZvcmVncm91bmRXaW5kb3coc19od25kKTsKKyMgZWxzZQorCQlleHRlcm4gV2lkZ2V0IHZpbVNoZWxsOworCisJCVhTZXRJbnB1dEZvY3VzKGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSwgUmV2ZXJ0VG9Ob25lLAorCQkJQ3VycmVudFRpbWUpOworCQlYUmFpc2VXaW5kb3coZ3VpLmRweSwgWHRXaW5kb3codmltU2hlbGwpKTsKKyMgZW5kaWYKKwkgICAgfQorI2VuZGlmCisJICAgIGJyZWFrOworCX0KKwljYXNlICdwJyA6ICAvKiBwYXRoIG9mIGZpbGUgaGFzIGNoYW5nZWQgKi8KKwkgICAgLyogd2hlbiBjaGFuZ2luZyBmcm9tIHNoYXJlZCB0byBwcml2YXRlIFdTIChjaGVja291dCkgKi8KKwl7CisJICAgIGNoYXIgKmZpbGUgPSBhcmd2WzBdOworCSAgICBjaGFyICpuZXdfcGF0aCA9IGFyZ3ZbMV07CisKKwkgICAgYnVmID0gdmlfZmluZF9idWZmZXIoZmlsZSk7CisJICAgIGlmIChidWYgJiYgIWJ1Zi0+Yl9jaGFuZ2VkKSAvKiBkZWxldGUgYnVmZmVyIG9ubHkgaWYgbm90IG1vZGlmaWVkICovCisJICAgIHsKKwkJc3ByaW50ZihWSUNvbW1hbmQsIERlbGV0ZUJ1ZiwgZmlsZSk7CisJCXZpX2V4ZWNfY21kKFZJQ29tbWFuZCk7CisJICAgIH0KKwkgICAgdmlfb3Blbl9maWxlKG5ld19wYXRoKTsKKwkgICAgYnJlYWs7CisJfQorCWNhc2UgJ3cnIDogIC8qIHdyaXRhYmlsaXR5IGhhcyBjaGFuZ2VkICovCisJICAgIC8qIFNuaWZmIHNlbmRzIHJlcXVlc3QgdHdpY2UsCisJICAgICAqIGJ1dCBvbmx5IHRoZSBsYXN0IG9uZSBpcyB0aGUgcmlnaHQgb25lICovCisJeworCSAgICBjaGFyICpmaWxlID0gYXJndlswXTsKKwkgICAgaW50IHdyaXRhYmxlID0gYXRvaShhcmd2WzFdKTsKKworCSAgICBidWYgPSB2aV9maW5kX2J1ZmZlcihmaWxlKTsKKwkgICAgaWYgKGJ1ZikKKwkgICAgeworCQlidWYtPmJfcF9ybyA9ICF3cml0YWJsZTsKKwkJaWYgKGJ1ZiAhPSBjdXJidWYpCisJCXsKKwkJICAgIGJ1Zi0+Yl9mbGFncyB8PSBCRl9DSEVDS19STyArIEJGX05FVkVSTE9BREVEOworCQkgICAgaWYgKHdyaXRhYmxlICYmICFidWYtPmJfY2hhbmdlZCkKKwkJICAgIHsKKwkJCXNwcmludGYoVklDb21tYW5kLCBVbmxvYWRCdWYsIGZpbGUpOworCQkJdmlfZXhlY19jbWQoVklDb21tYW5kKTsKKwkJICAgIH0KKwkJfQorCQllbHNlIGlmICh3cml0YWJsZSAmJiAhYnVmLT5iX2NoYW5nZWQpCisJCXsKKwkJICAgIHZpX2V4ZWNfY21kKCJlIik7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJY2FzZSAnaCcgOiAgLyogaGlnaGxpZ2h0IGluZm8gKi8KKwkgICAgYnJlYWs7ICAvKiBub3QgaW1wbGVtZW50ZWQgKi8KKworCWNhc2UgJ3QnIDogIC8qIFNldCB0YWIgd2lkdGggKi8KKwl7CisJICAgIGludCB0YWJfd2lkdGggPSBhdG9pKGFyZ3ZbMV0pOworCisJICAgIGlmICh0YWJfd2lkdGggPiAwICYmIHRhYl93aWR0aCA8PSAxNikKKwkgICAgeworCQlzcHJpbnRmKFZJQ29tbWFuZCwgU2V0VGFiLCB0YWJfd2lkdGgpOworCQl2aV9leGVjX2NtZChWSUNvbW1hbmQpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwljYXNlICd8JzoKKwl7CisJICAgIC8qIGNoYW5nZSB0aGUgcmVxdWVzdCBzZXBhcmF0b3IgKi8KKwkgICAgc25pZmZfcnFfc2VwWzBdID0gYXJndW1lbnRzWzBdOworCSAgICAvKiBlY2hvIHRoZSByZXF1ZXN0ICovCisJICAgIFdyaXRlVG9TbmlmZihidWZmZXIpOworCSAgICBicmVhazsKKwl9CisJY2FzZSAnQScgOiAgLyogV2FybmluZy9JbmZvIG1zZyAqLworCSAgICB2aV9tc2coYXJndW1lbnRzKTsKKwkgICAgaWYgKCFzdHJuY21wKGFyZ3VtZW50cywgIkRpc2Nvbm5lY3RlZCIsIDEyKSkgLyogIkRpc2Nvbm5lY3RlZCAuLi4iICovCisJCXNuaWZmX2Rpc2Nvbm5lY3QoMSk7CS8qIHVuZXhwZWN0ZWQgZGlzY29ubmVjdGlvbiAqLworCSAgICBicmVhazsKKwljYXNlICdhJyA6ICAvKiBFcnJvciBtc2cgKi8KKwkgICAgdmlfZXJyb3JfbXNnKGFyZ3VtZW50cyk7CisJICAgIGlmICghc3RybmNtcChhcmd1bWVudHMsICJDYW5ub3QgY29ubmVjdCIsIDE0KSkgLyogIkNhbm5vdCBjb25uZWN0IC4uLiIgKi8KKwkJc25pZmZfZGlzY29ubmVjdCgxKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0IDoKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlKGFyZ2MpCisJdmltX2ZyZWUoYXJndlstLWFyZ2NdKTsKK30KKworCisjaWZuZGVmIFdJTjMyCisvKiBnZXRfcmVxdWVzdAorICogcmVhZCBzdHJpbmcgZnJvbSBmZCB1cCB0byBuZXh0IG5ld2xpbmUgKGV4Y2x1ZGluZyB0aGUgbmwpLAorICogcmV0dXJucyAgbGVuZ3RoIG9mIHN0cmluZworICoJICAgIDAgaWYgbm8gZGF0YSBhdmFpbGFibGUgb3Igbm8gY29tcGxldGUgbGluZQorICoJICAgPDAgb24gZXJyb3IKKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9yZXF1ZXN0KGZkLCBidWYsIG1heGxlbikKKyAgICBpbnQJCWZkOworICAgIGNoYXIJKmJ1ZjsKKyAgICBpbnQJCW1heGxlbjsKK3sKKyAgICBzdGF0aWMgY2hhcglpbmJ1ZlsxMDI0XTsKKyAgICBzdGF0aWMgaW50CXBvcyA9IDAsIGJ5dGVzID0gMDsKKyAgICBpbnQJCWxlbjsKKyNpZmRlZiBIQVZFX1NFTEVDVAorICAgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgICAgZmRfc2V0CXJmZHM7CisKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9TRVQoZmQsICZyZmRzKTsKKyAgICB0dmFsLnR2X3NlYyAgPSAwOworICAgIHR2YWwudHZfdXNlYyA9IDA7CisjZWxzZQorICAgIHN0cnVjdCBwb2xsZmQgZmRzOworCisgICAgZmRzLmZkID0gZmQ7CisgICAgZmRzLmV2ZW50cyA9IFBPTExJTjsKKyNlbmRpZgorCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBtYXhsZW47IGxlbisrKQorICAgIHsKKwlpZiAocG9zID49IGJ5dGVzKQkgICAgLyogZW5kIG9mIGJ1ZmZlciByZWFjaGVkPyAqLworCXsKKyNpZmRlZiBIQVZFX1NFTEVDVAorCSAgICBpZiAoc2VsZWN0KGZkICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dmFsKSA+IDApCisjZWxzZQorCQlpZiAocG9sbCgmZmRzLCAxLCAwKSA+IDApCisjZW5kaWYKKwkJeworCQkgICAgcG9zID0gMDsKKwkJICAgIGJ5dGVzID0gcmVhZChmZCwgaW5idWYsIHNpemVvZihpbmJ1ZikpOworCQkgICAgaWYgKGJ5dGVzIDw9IDApCisJCQlyZXR1cm4gYnl0ZXM7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBwb3MgPSBwb3MtbGVuOworCQkgICAgYnVmWzBdID0gJ1wwJzsKKwkJICAgIHJldHVybiAwOworCQl9CisJfQorCWlmICgoYnVmW2xlbl0gPSBpbmJ1Zltwb3MrK10pID09J1xuJykKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuOworfQorI2VuZGlmICAgICAvKiBXSU4zMiAqLworCisKKyAgICBzdGF0aWMgdm9pZAorU2VuZFJlcXVlc3QoY29tbWFuZCwgc3ltYm9sKQorICAgIHN0cnVjdCBzbl9jbWQgKmNvbW1hbmQ7CisgICAgY2hhciAqc3ltYm9sOworeworICAgIGludAkJY21kX3R5cGUgPSBjb21tYW5kLT5jbWRfdHlwZTsKKyAgICBzdGF0aWMgY2hhciBjbWRzdHJbTUFYX1JFUVVFU1RfTEVOXTsKKyAgICBzdGF0aWMgY2hhciBtc2d0eHRbTUFYX1JFUVVFU1RfTEVOXTsKKyAgICBjaGFyCSpidWZmZXJfbmFtZSA9IE5VTEw7CisKKyAgICBpZiAoY21kX3R5cGUgPT0gUlFfQ09OTkVDVCkKKyAgICB7CisJc25pZmZfY29ubmVjdCgpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKCFzbmlmZl9jb25uZWN0ZWQgJiYgIShjbWRfdHlwZSAmIFNJTEVOVCkpCisgICAgeworCXZpX2Vycm9yX21zZyhfKCJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKGNtZF90eXBlICYgTkVFRF9GSUxFKQorICAgIHsKKwlpZiAoIWN1cmJ1Zi0+Yl9zbmlmZikKKwl7CisJICAgIGlmICghKGNtZF90eXBlICYgU0lMRU5UKSkKKwkJdmlfZXJyb3JfbXNnKF8oIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiKSk7CisJICAgIHJldHVybjsKKwl9CisJYnVmZmVyX25hbWUgPSB2aV9idWZmZXJfbmFtZSgpOworCWlmIChidWZmZXJfbmFtZSA9PSBOVUxMKQorCSAgICByZXR1cm47CisJaWYgKGNtZF90eXBlICYgTkVFRF9TWU1CT0wpCisJeworCSAgICBpZiAoY21kX3R5cGUgJiBFTVBUWV9TWU1CT0wpCisJCXN5bWJvbCA9ICIgIjsKKwkgICAgZWxzZSBpZiAoIXN5bWJvbCAmJiAhKHN5bWJvbCA9IHZpX3N5bWJvbF91bmRlcl9jdXJzb3IoKSkpCisJCXJldHVybjsJICAgIC8qIGVycm9yIG1zZyBhbHJlYWR5IGRpc3BsYXllZCAqLworCX0KKworCWlmIChzeW1ib2wpCisJICAgIHNwcmludGYoY21kc3RyLCAiJWMlcyVzJWxkJXMlc1xuIiwKKwkJY29tbWFuZC0+Y21kX2NvZGUsCisJCWJ1ZmZlcl9uYW1lLAorCQlzbmlmZl9ycV9zZXAsCisJCXZpX2N1cnNvcl9wb3MoKSwKKwkJc25pZmZfcnFfc2VwLAorCQlzeW1ib2wKKwkgICAgKTsKKwllbHNlCisJICAgIHNwcmludGYoY21kc3RyLCAiJWMlc1xuIiwgY29tbWFuZC0+Y21kX2NvZGUsIGJ1ZmZlcl9uYW1lKTsKKyAgICB9CisgICAgZWxzZSAgICAvKiBzaW1wbGUgcmVxdWVzdCAqLworICAgIHsKKwljbWRzdHJbMF0gPSBjb21tYW5kLT5jbWRfY29kZTsKKwljbWRzdHJbMV0gPSAnXG4nOworCWNtZHN0clsyXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChjb21tYW5kLT5jbWRfbXNnICYmICEoY21kX3R5cGUgJiBTSUxFTlQpKQorICAgIHsKKwlpZiAoKGNtZF90eXBlICYgTkVFRF9TWU1CT0wpICYmICEoY21kX3R5cGUgJiBFTVBUWV9TWU1CT0wpKQorCXsKKwkgICAgc3ByaW50Zihtc2d0eHQsICIlczogJXMiLCBfKGNvbW1hbmQtPmNtZF9tc2cpLCBzeW1ib2wpOworCSAgICB2aV9tc2cobXNndHh0KTsKKwl9CisJZWxzZQorCSAgICB2aV9tc2coXyhjb21tYW5kLT5jbWRfbXNnKSk7CisgICAgfQorICAgIFdyaXRlVG9TbmlmZihjbWRzdHIpOworICAgIGlmIChjbWRfdHlwZSAmIERJU0NPTk5FQ1QpCisJc25pZmZfZGlzY29ubmVjdCgwKTsKK30KKworCisKKyAgICBzdGF0aWMgdm9pZAorV3JpdGVUb1NuaWZmKHN0cikKKyAgICBjaGFyICpzdHI7Cit7CisgICAgaW50IGJ5dGVzOworI2lmZGVmIFdJTjMyCisgICAgaWYgKCEgV3JpdGVGaWxlKGhhbmRsZV90b19zbmlmZiwgc3RyLCBzdHJsZW4oc3RyKSwgJmJ5dGVzLCBOVUxMKSkKKyAgICB7CisJRFdPUkQgZXJyPUdldExhc3RFcnJvcigpOworCWJ5dGVzID0gLTE7CisgICAgfQorI2Vsc2UKKyAgICBieXRlcyA9IHdyaXRlKGZkX3RvX3NuaWZmLCBzdHIsIHN0cmxlbihzdHIpKTsKKyNlbmRpZgorICAgIGlmIChieXRlczwwKQorICAgIHsKKwl2aV9tc2coXygiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIikpOworCXNuaWZmX2Rpc2Nvbm5lY3QoMSk7CisgICAgfQorfQorCisvKi0tLS0tLS0tIHZpbSBoZWxwaW5nIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBzdGF0aWMgdm9pZAordmlfbXNnKHN0cikKKyAgICBjaGFyICpzdHI7Cit7CisgICAgaWYgKHN0ciAhPSBOVUxMICYmICpzdHIgIT0gTlVMKQorCU1TRygoY2hhcl91ICopc3RyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCit2aV9lcnJvcl9tc2coc3RyKQorICAgIGNoYXIgKnN0cjsKK3sKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgKnN0ciAhPSBOVUwpCisJRU1TRygoY2hhcl91ICopc3RyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCit2aV9vcGVuX2ZpbGUoZm5hbWUpCisgICAgY2hhciAqZm5hbWU7Cit7CisgICAgKytub193YWl0X3JldHVybjsKKyAgICBkb19lY21kKDAsIChjaGFyX3UgKilmbmFtZSwgTlVMTCwgTlVMTCwgRUNNRF9PTkUsIEVDTURfSElERStFQ01EX09MREJVRik7CisgICAgY3VyYnVmLT5iX3NuaWZmID0gVFJVRTsKKyAgICAtLW5vX3dhaXRfcmV0dXJuOwkJCQkJLyogW2V4X2RvY21kLmNdICovCit9CisKKyAgICBzdGF0aWMgYnVmX1QgKgordmlfZmluZF9idWZmZXIoZm5hbWUpCisgICAgY2hhciAqZm5hbWU7Cit7CQkJICAgIC8qIGRlcml2ZWQgZnJvbSBidWZsaXN0X2ZpbmRuYW1lKCkgW2J1ZmZlci5jXSAqLworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJaWYgKGJ1Zi0+Yl9zZm5hbWUgIT0gTlVMTCAmJiBmbmFtZWNtcChmbmFtZSwgYnVmLT5iX3NmbmFtZSkgPT0gMCkKKwkgICAgcmV0dXJuIChidWYpOworICAgIHJldHVybiBOVUxMOworfQorCisKKyAgICBzdGF0aWMgY2hhciAqCit2aV9zeW1ib2xfdW5kZXJfY3Vyc29yKCkKK3sKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyCSpzeW1ib2xwOworICAgIGNoYXIJKnA7CisgICAgc3RhdGljIGNoYXIgc25pZmZfc3ltYm9sWzI1Nl07CisKKyAgICBsZW4gPSBmaW5kX2lkZW50X3VuZGVyX2N1cnNvcigoY2hhcl91ICoqKSZzeW1ib2xwLCBGSU5EX0lERU5UKTsKKyAgICAvKiBbbm9ybWFsLmNdICovCisgICAgaWYgKGxlbiA8PSAwKQorCXJldHVybiBOVUxMOworICAgIGZvciAocD1zbmlmZl9zeW1ib2w7IGxlbjsgbGVuLS0pCisJKnArKyA9ICpzeW1ib2xwKys7CisgICAgKnAgPSAnXDAnOworICAgIHJldHVybiBzbmlmZl9zeW1ib2w7Cit9CisKKworICAgIHN0YXRpYyBjaGFyICoKK3ZpX2J1ZmZlcl9uYW1lKCkKK3sKKyAgICByZXR1cm4gKGNoYXIgKiljdXJidWYtPmJfc2ZuYW1lOworfQorCisgICAgc3RhdGljIHZvaWQKK3ZpX2V4ZWNfY21kKHZpY21kKQorICAgIGNoYXIgKnZpY21kOworeworICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKil2aWNtZCk7ICAvKiBbZXhfZG9jbWQuY10gKi8KK30KKworLyoKKyAqIFNldCBjdXJzb3Igb24gY2hhcmFjdGVyIHBvc2l0aW9uCisgKiBkZXJpdmVkIGZyb20gY3Vyc29yX3Bvc19pbmZvKCkgW2J1ZmZlci5jXQorICovCisgICAgc3RhdGljIHZvaWQKK3ZpX3NldF9jdXJzb3JfcG9zKGNoYXJfcG9zKQorICAgIGxvbmcgY2hhcl9wb3M7Cit7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBsb25nCWNoYXJfY291bnQgPSAxOyAgLyogZmlyc3QgcG9zaXRpb24gPSAxICovCisgICAgaW50CQlsaW5lX3NpemU7CisgICAgaW50CQllb2xfc2l6ZTsKKworICAgIGlmIChjaGFyX3BvcyA9PSAwKQorICAgIHsKKwljaGFyX3BvcyA9IDE7CisgICAgfQorICAgIGlmIChnZXRfZmlsZWZvcm1hdChjdXJidWYpID09IEVPTF9ET1MpCisJZW9sX3NpemUgPSAyOworICAgIGVsc2UKKwllb2xfc2l6ZSA9IDE7CisgICAgZm9yIChsbnVtID0gMTsgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsgKytsbnVtKQorICAgIHsKKwlsaW5lX3NpemUgPSBTVFJMRU4obWxfZ2V0KGxudW0pKSArIGVvbF9zaXplOworCWlmIChjaGFyX2NvdW50K2xpbmVfc2l6ZSA+IGNoYXJfcG9zKSBicmVhazsKKwljaGFyX2NvdW50ICs9IGxpbmVfc2l6ZTsKKyAgICB9CisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCAgPSBjaGFyX3BvcyAtIGNoYXJfY291bnQ7Cit9CisKKyAgICBzdGF0aWMgbG9uZwordmlfY3Vyc29yX3BvcygpCit7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBsb25nCWNoYXJfY291bnQ9MTsgIC8qIHNuaWZmIHN0YXJ0cyB3aXRoIHBvcyAxICovCisgICAgaW50CQlsaW5lX3NpemU7CisgICAgaW50CQllb2xfc2l6ZTsKKworICAgIGlmIChjdXJidWYtPmJfcF90eCkKKwllb2xfc2l6ZSA9IDI7CisgICAgZWxzZQorCWVvbF9zaXplID0gMTsKKyAgICBmb3IgKGxudW0gPSAxOyBsbnVtIDwgY3Vyd2luLT53X2N1cnNvci5sbnVtOyArK2xudW0pCisgICAgeworCWxpbmVfc2l6ZSA9IFNUUkxFTihtbF9nZXQobG51bSkpICsgZW9sX3NpemU7CisJY2hhcl9jb3VudCArPSBsaW5lX3NpemU7CisgICAgfQorICAgIHJldHVybiBjaGFyX2NvdW50ICsgY3Vyd2luLT53X2N1cnNvci5jb2w7Cit9CmRpZmYgLS1naXQgYS9zcmMvaWZfc25pZmYuaCBiL3NyYy9pZl9zbmlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaWZfc25pZmYuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogaWZfc25pZmYuaCBJbnRlcmZhY2UgYmV0d2VlbiBWaW0gYW5kIFNOaUZGKworICoKKyAqICRJZCQKKyAqLworCisjaWZuZGVmIF9faWZfc25pZmZfaF9fCisjZGVmaW5lIF9faWZfc25pZmZfaF9fCisKK2V4dGVybiBpbnQgIHdhbnRfc25pZmZfcmVxdWVzdDsKK2V4dGVybiBpbnQgIHNuaWZmX3JlcXVlc3Rfd2FpdGluZzsKK2V4dGVybiBpbnQgIHNuaWZmX2Nvbm5lY3RlZDsKK2V4dGVybiBpbnQgIGZkX2Zyb21fc25pZmY7CitleHRlcm4gdm9pZCBzbmlmZl9kaXNjb25uZWN0IF9fQVJHUygoaW50IGltbWVkaWF0ZWx5KSk7CitleHRlcm4gdm9pZCBQcm9jZXNzU25pZmZSZXF1ZXN0cyBfX0FSR1MoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGV4X3NuaWZmIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2lmX3RjbC5jIGIvc3JjL2lmX3RjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaWZfdGNsLmMKQEAgLTAsMCArMSwyMTE4IEBACisvKiB2aTpzZXQgdHM9OCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBUY2wgZXh0ZW5zaW9ucyBieSBJbmdvIFdpbGtlbiA8SW5nby5XaWxrZW5AaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlPgorICogTGFzdCBtb2RpZmljYXRpb246IFdlZCBNYXkgMTAgMjE6Mjg6NDQgQ0VTVCAyMDAwCisgKiBSZXF1aXJlcyBUY2wgOC4wIG9yIGhpZ2hlci4KKyAqCisgKiAgVmFyaWFibGVzOgorICogIDo6dmltOjpjdXJyZW50KGJ1ZmZlcikJIyBOYW1lIG9mIGJ1ZmZlciBjb21tYW5kIGZvciBjdXJyZW50IGJ1ZmZlci4KKyAqICA6OnZpbTo6Y3VycmVudCh3aW5kb3cpCSMgTmFtZSBvZiB3aW5kb3cgY29tbWFuZCBmb3IgY3VycmVudCB3aW5kb3cuCisgKiAgOjp2aW06OnJhbmdlKHN0YXJ0KQkJIyBTdGFydCBvZiBjdXJyZW50IHJhbmdlIChsaW5lIG51bWJlcikuCisgKiAgOjp2aW06OnJhbmdlKGVuZCkJCSMgRW5kIG9mIGN1cnJlbnQgcmFuZ2UgKGxpbmUgbnVtYmVyKS4KKyAqICA6OnZpbTo6bGJhc2UJCSMgU3RhcnQgb2YgbGluZS9jb2x1bW4gbnVtYmVycyAoMSBvciAwKS4KKyAqCisgKiAgQ29tbWFuZHM6CisgKiAgOjp2aW06OmNvbW1hbmQge2NtZH0JIyBFeGVjdXRlIGV4IGNvbW1hbmQge2NtZH0uCisgKiAgOjp2aW06Om9wdGlvbiB7b3B0fSBbdmFsXQkjIEdldC9TZXQgb3B0aW9uIHtvcHR9LgorICogIDo6dmltOjpleHByIHtleHByfQkJIyBFdmFsdWF0ZSB7ZXhwcn0gdXNpbmcgdmltJ3MgZXZhbHVhdG9yLgorICogIDo6dmltOjpiZWVwCQkJIyBHdWVzcy4KKyAqCisgKiAgc2V0IGJ1ZiBbOjp2aW06OmJ1ZmZlciB7bn1dCSMgQ3JlYXRlIFRjbCBjb21tYW5kIGZvciBidWZmZXIgTi4KKyAqICBzZXQgYmwgWzo6dmltOjpidWZmZXIgbGlzdF0gIyBHZXQgbGlzdCBvZiBUY2wgY29tbWFuZHMgb2YgYWxsIGJ1ZmZlcnMuCisgKiAgOjp2aW06OmJ1ZmZlciBleGlzdHMge259CSMgVHJ1ZSBpZiBidWZmZXIge259IGV4aXN0cy4KKyAqCisgKiAgc2V0IHdsIFs6OnZpbTo6d2luZG93IGxpc3RdICMgR2V0IGxpc3Qgb2YgVGNsIGNvbW1hbmRzIG9mIGFsbCB3aW5kb3dzLgorICoKKyAqICBzZXQgbiBbJHdpbiBoZWlnaHRdCQkjIFJlcG9ydCB3aW5kb3cgaGVpZ2h0LgorICogICR3aW4gaGVpZ2h0IHtufQkJIyBTZXQgd2luZG93IGhlaWdodCB0byB7bn0uCisgKiAgYXJyYXkgc2V0IHBvcyBbJHdpbiBjdXJzb3JdICMgR2V0IGN1cnNvciBwb3NpdGlvbi4KKyAqICAkd2luIGN1cnNvciB7cm93fSB7Y29sfQkjIFNldCBjdXJzb3IgcG9zaXRpb24uCisgKiAgJHdpbiBjdXJzb3IgcG9zCQkjIFNldCBjdXJzb3IgcG9zaXRpb24gZnJvbSBhcnJheSB2YXIgInBvcyIKKyAqICAkd2luIGRlbGNtZCB7Y21kfQkJIyBSZWdpc3RlciBjYWxsYmFjayBjb21tYW5kIGZvciBjbG9zZWQgd2luZG93LgorICogICR3aW4gb3B0aW9uIHtvcHR9IFt2YWxdCSMgR2V0L1NldCB2aW0gb3B0aW9uIGluIGNvbnRleHQgb2YgJHdpbi4KKyAqICAkd2luIGNvbW1hbmQge2NtZH0JCSMgRXhlY3V0ZSBleCBjb21tYW5kIGluIGNvbnRleHQgb2YgJHdpbi4KKyAqICAkd2luIGV4cHIge2V4cHJ9CQkjIEV2YWx1YXRlIHZpbSBleHByZXNzaW9uIGluIGNvbnRleHQgb2YgJHdpbi4KKyAqICBzZXQgYnVmIFskd2luIGJ1ZmZlcl0JIyBDcmVhdGUgVGNsIGNvbW1hbmQgZm9yIHdpbmRvdydzIGJ1ZmZlci4KKyAqCisgKiAgJGJ1ZiBuYW1lCQkJIyBSZXBvcnRzIGZpbGUgbmFtZSBpbiBidWZmZXIuCisgKiAgJGJ1ZiBudW1iZXIJCQkjIFJlcG9ydHMgYnVmZmVyIG51bWJlci4KKyAqICBzZXQgbCBbJGJ1ZiBnZXQge259XQkjIEdldCBidWZmZXIgbGluZSB7bn0gYXMgYSBzdHJpbmcuCisgKiAgc2V0IEwgWyRidWYgZ2V0IHtufSB7bX1dCSMgR2V0IGxpbmVzIHtufSB0aHJvdWdoIHttfSBhcyBhIGxpc3QuCisgKiAgJGJ1ZiBjb3VudAkJCSMgUmVwb3J0cyBudW1iZXIgb2YgbGluZXMgaW4gYnVmZmVyLgorICogICRidWYgbGFzdAkJCSMgUmVwb3J0cyBudW1iZXIgb2YgbGFzdCBsaW5lIGluIGJ1ZmZlci4KKyAqICAkYnVmIGRlbGV0ZSB7bn0JCSMgRGVsZXRlIGxpbmUge259LgorICogICRidWYgZGVsZXRlIHtufSB7bX0JCSMgRGVsZXRlIGxpbmVzIHtufSB0aHJvdWdoIHttfS4KKyAqICAkYnVmIHNldCB7bn0ge2x9CQkjIFNldCBsaW5lIHtufSB0byBzdHJpbmcge2x9LgorICogICRidWYgc2V0IHtufSB7bX0ge0x9CSMgU2V0IGxpbmVzIHtufSB0aHJvdWdoIHttfSBmcm9tIGxpc3Qge0x9LgorICoJCQkJIyBEZWxldGUvaW5zZXJ0cyBsaW5lcyBhcyBhcHByb3ByaWF0ZS4KKyAqICAkYnVmIG9wdGlvbiB7b3B0fSBbdmFsXQkjIEdldC9TZXQgdmltIG9wdGlvbiBpbiBjb250ZXh0IG9mICRidWYuCisgKiAgJGJ1ZiBjb21tYW5kIHtjbWR9CQkjIEV4ZWN1dGUgZXggY29tbWFuZCBpbiBjb250ZXh0IG9mICRidWYKKyAqICAkYnVmIGV4cHIge2NtZH0JCSMgRXZhbHVhdGUgdmltIGV4cHJlc3Npb24gaW4gY29udGV4dCBvZiAkYnVmLgorICogIGFycmF5IHNldCBwb3MgWyRidWYgbWFyayB7bX1dICAgIyBHZXQgcG9zaXRpb24gb2YgbWFyay4KKyAqICAkYnVmIGFwcGVuZCB7bn0ge3N0cn0JIyBBcHBlbmQgc3RyaW5nIHtzdHJ9IHRvIGJ1ZmZlcixhZnRlciBsaW5lIHtufS4KKyAqICAkYnVmIGluc2VydCB7bn0ge3N0cn0JIyBJbnNlcnQgc3RyaW5nIHtzdHJ9IGluIGJ1ZmZlciBhcyBsaW5lIHtufS4KKyAqICAkYnVmIGRlbGNtZCB7Y21kfQkJIyBSZWdpc3RlciBjYWxsYmFjayBjb21tYW5kIGZvciBkZWxldGVkIGJ1ZmZlci4KKyAqICBzZXQgd2wgWyRidWYgd2luZG93c10JIyBHZXQgbGlzdCBvZiBUY2wgY29tbWFuZHMgZm9yIGFsbCB3aW5kb3dzIG9mCisgKgkJCQkjIHRoaXMgYnVmZmVyLgorVE9ETzoKKyAqICA6OnZpbTo6YnVmZmVyIG5ldwkJIyAgIGNyZWF0ZSBuZXcgYnVmZmVyICsgVGNsIGNvbW1hbmQKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisjdW5kZWYgRVhURVJOCQkJLyogdGNsLmggZGVmaW5lcyBpdCB0b28gKi8KKworI2lmZGVmIERZTkFNSUNfVENMCisjIGRlZmluZSBVU0VfVENMX1NUVUJTIC8qIHVzZSB0Y2wncyBzdHVicyBtZWNoYW5pc20gKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8dGNsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBUY2xfSW50ZXJwICppbnRlcnA7CisgICAgaW50IHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQ7CisgICAgaW50IGxiYXNlOworICAgIGNoYXIgKmN1cmJ1ZiwgKmN1cndpbjsKK30gdGNsX2luZm87CisKK3N0YXRpYyB0Y2xfaW5mbyB0Y2xpbmZvID0geyBOVUxMLCAwLCAwLCAwLCBOVUxMLCBOVUxMIH07CisKKyNkZWZpbmUgVkFSX1JBTkdFMQkiOjp2aW06OnJhbmdlKHN0YXJ0KSIKKyNkZWZpbmUgVkFSX1JBTkdFMgkiOjp2aW06OnJhbmdlKGJlZ2luKSIKKyNkZWZpbmUgVkFSX1JBTkdFMwkiOjp2aW06OnJhbmdlKGVuZCkiCisjZGVmaW5lIFZBUl9DVVJCVUYJIjo6dmltOjpjdXJyZW50KGJ1ZmZlcikiCisjZGVmaW5lIFZBUl9DVVJXSU4JIjo6dmltOjpjdXJyZW50KHdpbmRvdykiCisjZGVmaW5lIFZBUl9MQkFTRQkiOjp2aW06OmxiYXNlIgorI2RlZmluZSBWQVJfQ1VSTElORQkibGluZSIKKyNkZWZpbmUgVkFSX0NVUkxOVU0JImxudW0iCisjZGVmaW5lIFZBUk5BTUVfU0laRQk2NAorCisjZGVmaW5lIHJvdzJ0Y2woeCkgICgoeCkgLSAodGNsaW5mby5sYmFzZT09MCkpCisjZGVmaW5lIHJvdzJ2aW0oeCkgICgoeCkgKyAodGNsaW5mby5sYmFzZT09MCkpCisjZGVmaW5lIGNvbDJ0Y2woeCkgICgoeCkgKyAodGNsaW5mby5sYmFzZSE9MCkpCisjZGVmaW5lIGNvbDJ2aW0oeCkgICgoeCkgLSAodGNsaW5mby5sYmFzZSE9MCkpCisKKworI2RlZmluZSBWSU1PVVQJKChDbGllbnREYXRhKTEpCisjZGVmaW5lIFZJTUVSUgkoKENsaWVudERhdGEpMikKKworLyoKKyAqICBMaXN0IG9mIFRjbCBpbnRlcnByZXRlcnMgd2hvIHJlZmVyZW5jZSBhIHZpbSB3aW5kb3cgb3IgYnVmZmVyLgorICogIEVhY2ggYnVmZmVyIGFuZCB3aW5kb3cgaGFzIGl0J3Mgb3duIGxpc3QgaW4gdGhlIHRjbF9yZWYgc3RydWN0IG1lbWJlci4KKyAqICBXZSBuZWVkIHRoaXMgYmVjYXVzZSBUY2wgY2FuIGNyZWF0ZSBzdWItaW50ZXJwcmV0ZXJzIHdpdGggdGhlICJpbnRlcnAiCisgKiAgY29tbWFuZCwgYW5kIGVhY2ggaW50ZXJwcmV0ZXIgY2FuIHJlZmVyZW5jZSBhbGwgd2luZG93cyBhbmQgYnVmZmVycy4KKyAqLworc3RydWN0IHJlZgoreworICAgIHN0cnVjdCByZWYJKm5leHQ7CisKKyAgICBUY2xfSW50ZXJwCSppbnRlcnA7CisgICAgVGNsX0NvbW1hbmQgY21kOwkgICAgLyogVGNsIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoaXMgb2JqZWN0ICovCisgICAgVGNsX09iagkqZGVsY21kOyAgICAvKiBUY2wgY29tbWFuZCB0byBjYWxsIHdoZW4gb2JqZWN0IGlzIGJlaW5nIGRlbC4gKi8KKyAgICB2b2lkCSp2aW1vYmo7ICAgIC8qIFZpbSB3aW5kb3cgb3IgYnVmZmVyICh3aW5fVCogb3IgYnVmX1QqKSAqLworfTsKK3N0YXRpYyBjaGFyICogdGNsZ2V0YnVmZmVyIF9BTlNJX0FSR1NfKChUY2xfSW50ZXJwICppbnRlcnAsIGJ1Zl9UICpidWYpKTsKK3N0YXRpYyBjaGFyICogdGNsZ2V0d2luZG93IF9BTlNJX0FSR1NfKChUY2xfSW50ZXJwICppbnRlcnAsIHdpbl9UICp3aW4pKTsKK3N0YXRpYyBpbnQgdGNsc2V0ZGVsY21kIF9BTlNJX0FSR1NfKChUY2xfSW50ZXJwICppbnRlcnAsIHN0cnVjdCByZWYgKnJlZmxpc3QsIHZvaWQgKnZpbW9iaiwgVGNsX09iaiAqZGVsY21kKSk7CitzdGF0aWMgaW50IHRjbGdldGxpbmVudW0gX0FOU0lfQVJHU18gKChUY2xfSW50ZXJwICppbnRlcnAsIFRjbF9PYmogKm9iaiwgaW50ICp2YWx1ZVAsIGJ1Zl9UICpidWYpKTsKK3N0YXRpYyB3aW5fVCAqdGNsZmluZHdpbiBfQU5TSV9BUkdTXyAoKGJ1Zl9UICpidWYpKTsKK3N0YXRpYyBpbnQgdGNsZG9leGNvbW1hbmQgX0FOU0lfQVJHU18gKChUY2xfSW50ZXJwICppbnRlcnAsIGludCBvYmpjLCBUY2xfT2JqICpDT05TVCBvYmp2W10sIGludCBvYmpuKSk7CitzdGF0aWMgaW50IHRjbHNldG9wdGlvbiBfQU5TSV9BUkdTXyAoKFRjbF9JbnRlcnAgKmludGVycCwgaW50IG9iamMsIFRjbF9PYmogKkNPTlNUIG9ianZbXSwgaW50IG9iam4pKTsKK3N0YXRpYyBpbnQgdGNsdmltZXhwciBfQU5TSV9BUkdTXyAoKFRjbF9JbnRlcnAgKmludGVycCwgaW50IG9iamMsIFRjbF9PYmogKkNPTlNUIG9ianZbXSwgaW50IG9iam4pKTsKK3N0YXRpYyB2b2lkIHRjbGRlbHRoaXNpbnRlcnAgX0FOU0lfQVJHU18gKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgdmltZXJyb3IgX0FOU0lfQVJHU18oKFRjbF9JbnRlcnAgKmludGVycCkpOworc3RhdGljIHZvaWQgdGNsbXNnIF9BTlNJX0FSR1NfKChjaGFyICp0ZXh0KSk7CitzdGF0aWMgdm9pZCB0Y2xlcnJtc2cgX0FOU0lfQVJHU18oKGNoYXIgKnRleHQpKTsKK3N0YXRpYyB2b2lkIHRjbHVwZGF0ZXZhcnMgX0FOU0lfQVJHU18oKHZvaWQpKTsKKworc3RhdGljIHN0cnVjdCByZWYgcmVmc2RlbGV0ZWQ7CS8qIGR1bW15IG9iamVjdCBmb3IgZGVsZXRlZCByZWYgbGlzdCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRDTCBpbnRlcmZhY2UgbWFuYWdlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKERZTkFNSUNfVENMKSB8fCBkZWZpbmVkKFBST1RPKQorIyBpZm5kZWYgRFlOQU1JQ19UQ0xfRExMCisjICBkZWZpbmUgRFlOQU1JQ19UQ0xfRExMICJ0Y2w4My5kbGwiCisjIGVuZGlmCisjIGlmbmRlZiBEWU5BTUlDX1RDTF9WRVIKKyMgIGRlZmluZSBEWU5BTUlDX1RDTF9WRVIgIjguMyIKKyMgZW5kaWYKKworIyBpZm5kZWYgIERZTkFNSUNfVENMIC8qIEp1c3QgZ2VuZXJhdGluZyBwcm90b3R5cGVzICovCit0eXBlZGVmIGludCBIQU5ETEU7CisjIGVuZGlmCisKKy8qCisgKiBEZWNsYXJlIEhBTkRMRSBmb3IgcGVybC5kbGwgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLgorICovCitzdGF0aWMgSEFORExFIGhUY2xMaWIgPSBOVUxMOworVGNsX0ludGVycCogKCpkbGxfVGNsX0NyZWF0ZUludGVycCkoKTsKKworLyoKKyAqIFRhYmxlIG9mIG5hbWUgdG8gZnVuY3Rpb24gcG9pbnRlciBvZiB0Y2wuCisgKi8KKyNkZWZpbmUgVENMX1BST0MgRkFSUFJPQworc3RhdGljIHN0cnVjdCB7CisgICAgY2hhciogbmFtZTsKKyAgICBUQ0xfUFJPQyogcHRyOworfSB0Y2xfZnVuY25hbWVfdGFibGVbXSA9IHsKKyAgICB7IlRjbF9DcmVhdGVJbnRlcnAiLCAoVENMX1BST0MqKSZkbGxfVGNsX0NyZWF0ZUludGVycH0sCisgICAge05VTEwsIE5VTEx9LAorfTsKKworLyoKKyAqIE1ha2UgYWxsIHJ1bnRpbWUtbGlua3Mgb2YgdGNsLgorICoKKyAqIDEuIEdldCBtb2R1bGUgaGFuZGxlIHVzaW5nIExvYWRMaWJyYXJ5RXguCisgKiAyLiBHZXQgcG9pbnRlciB0byBwZXJsIGZ1bmN0aW9uIGJ5IEdldFByb2NBZGRyZXNzLgorICogMy4gUmVwZWF0IDIsIHVudGlsIGdldCBhbGwgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZC4KKyAqCisgKiBQYXJhbWV0ZXIgJ2xpYm5hbWUnIHByb3ZpZGVzIG5hbWUgb2YgRExMLgorICogUmV0dXJuIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50Cit0Y2xfcnVudGltZV9saW5rX2luaXQoY2hhciAqbGlibmFtZSwgaW50IHZlcmJvc2UpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoaFRjbExpYikKKwlyZXR1cm4gT0s7CisgICAgaWYgKCEoaFRjbExpYiA9IExvYWRMaWJyYXJ5RXgobGlibmFtZSwgTlVMTCwgMCkpKQorICAgIHsKKwlpZiAodmVyYm9zZSkKKwkgICAgRU1TRzIoXyhlX2xvYWRsaWIpLCBsaWJuYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgdGNsX2Z1bmNuYW1lX3RhYmxlW2ldLnB0cjsgKytpKQorICAgIHsKKwlpZiAoISgqdGNsX2Z1bmNuYW1lX3RhYmxlW2ldLnB0ciA9IEdldFByb2NBZGRyZXNzKGhUY2xMaWIsCisJCQl0Y2xfZnVuY25hbWVfdGFibGVbaV0ubmFtZSkpKQorCXsKKwkgICAgRnJlZUxpYnJhcnkoaFRjbExpYik7CisJICAgIGhUY2xMaWIgPSBOVUxMOworCSAgICBpZiAodmVyYm9zZSkKKwkJRU1TRzIoXyhlX2xvYWRmdW5jKSwgdGNsX2Z1bmNuYW1lX3RhYmxlW2ldLm5hbWUpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKERZTkFNSUNfVENMKSB8fCBkZWZpbmVkKFBST1RPKSAqLworCisjaWZkZWYgRFlOQU1JQ19UQ0wKK3N0YXRpYyBjaGFyICpmaW5kX2V4ZWN1dGFibGVfYXJnID0gTlVMTDsKKyNlbmRpZgorCisgICAgdm9pZAordmltX3RjbF9pbml0KGFyZykKKyAgICBjaGFyCSphcmc7Cit7CisjaWZuZGVmIERZTkFNSUNfVENMCisgICAgVGNsX0ZpbmRFeGVjdXRhYmxlKGFyZyk7CisjZWxzZQorICAgIGZpbmRfZXhlY3V0YWJsZV9hcmcgPSBhcmc7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRFlOQU1JQ19UQ0wpIHx8IGRlZmluZWQoUFJPVE8pCisKK3N0YXRpYyBpbnQgc3R1YnNfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBUQ0wgaW50ZXJmYWNlIGNhbiBiZSB1c2VkLgorICovCisgICAgaW50Cit0Y2xfZW5hYmxlZCh2ZXJib3NlKQorICAgIGludAkJdmVyYm9zZTsKK3sKKyAgICBpZiAoIXN0dWJzX2luaXRpYWxpemVkICYmIGZpbmRfZXhlY3V0YWJsZV9hcmcgIT0gTlVMTAorCSAgICAmJiB0Y2xfcnVudGltZV9saW5rX2luaXQoRFlOQU1JQ19UQ0xfRExMLCB2ZXJib3NlKSA9PSBPSykKKyAgICB7CisJVGNsX0ludGVycCAqaW50ZXJwOworCisJaWYgKGludGVycCA9IGRsbF9UY2xfQ3JlYXRlSW50ZXJwKCkpCisJeworCSAgICBpZiAoVGNsX0luaXRTdHVicyhpbnRlcnAsIERZTkFNSUNfVENMX1ZFUiwgMCkpCisJICAgIHsKKwkJVGNsX0ZpbmRFeGVjdXRhYmxlKGZpbmRfZXhlY3V0YWJsZV9hcmcpOworCQlUY2xfRGVsZXRlSW50ZXJwKGludGVycCk7CisJCXN0dWJzX2luaXRpYWxpemVkID0gVFJVRTsKKwkgICAgfQorCSAgICAvKiBGSVhNRTogV2hlbiBUY2xfSW5pdFN0dWJzKCkgd2FzIGZhaWxlZCwgaG93IGRlbGV0ZSBpbnRlcnA/ICovCisJfQorICAgIH0KKyAgICByZXR1cm4gc3R1YnNfaW5pdGlhbGl6ZWQ7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK3RjbF9lbmQoKQoreworI2lmZGVmIERZTkFNSUNfVENMCisgICAgaWYgKGhUY2xMaWIpCisgICAgeworCUZyZWVMaWJyYXJ5KGhUY2xMaWIpOworCWhUY2xMaWIgPSBOVUxMOworICAgIH0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUY2wgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUmVwbGFjZSBzdGFuZGFyZCAiZXhpdCIgYW5kICJjYXRjaCIgY29tbWFuZHMuCisgKgorICogVGhpcyBpcyBhIGRlc2lnbiBmbGF3IGluIFRjbCAtICB0aGUgc3RhbmRhcmQgImV4aXQiIGNvbW1hbmQganVzdCBjYWxscworICogZXhpdCgpIGFuZCBraWxscyB0aGUgYXBwbGljYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIFRDTF9FWElUIHRvIHRoZQorICogYXBwLCB3aGljaCB0aGVuIGRlY2lkZXMgaWYgaXQgd2FudHMgdG8gdGVybWluYXRlIG9yIG5vdC4gIEluIG91ciBjYXNlLAorICogd2UganVzdCBkZWxldGUgdGhlIFRjbCBpbnRlcnByZXRlciAoYW5kIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCB0aGUgbmV4dAorICogOnRjbCBjb21tYW5kKS4KKyAqLworI2RlZmluZSBUQ0xfRVhJVAk1CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAorZXhpdGNtZChkdW1teSwgaW50ZXJwLCBvYmpjLCBvYmp2KQorICAgIENsaWVudERhdGEgZHVtbXk7CisgICAgVGNsX0ludGVycCAqaW50ZXJwOworICAgIGludCBvYmpjOworICAgIFRjbF9PYmogKkNPTlNUIG9ianZbXTsKK3sKKyAgICBpbnQgdmFsdWUgPSAwOworCisgICAgc3dpdGNoIChvYmpjKQorICAgIHsKKwljYXNlIDI6CisJICAgIGlmIChUY2xfR2V0SW50RnJvbU9iaihpbnRlcnAsIG9ianZbMV0sICZ2YWx1ZSkgIT0gVENMX09LKQorCQlicmVhazsKKwkgICAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDE6CisJICAgIFRjbF9TZXRPYmpSZXN1bHQoaW50ZXJwLCBUY2xfTmV3SW50T2JqKHZhbHVlKSk7CisJICAgIHJldHVybiBUQ0xfRVhJVDsKKwlkZWZhdWx0OgorCSAgICBUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2JqdiwgIj9yZXR1cm5Db2RlPyIpOworICAgIH0KKyAgICByZXR1cm4gVENMX0VSUk9SOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2NhdGNoY21kKGR1bW15LCBpbnRlcnAsIG9iamMsIG9ianYpCisgICAgQ2xpZW50RGF0YQlkdW1teTsKKyAgICBUY2xfSW50ZXJwCSppbnRlcnA7CisgICAgaW50CQlvYmpjOworICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXTsKK3sKKyAgICBjaGFyICAgICp2YXJuYW1lID0gTlVMTDsKKyAgICBpbnQJICAgIHJlc3VsdDsKKworICAgIHN3aXRjaCAob2JqYykKKyAgICB7CisJY2FzZSAzOgorCSAgICB2YXJuYW1lID0gVGNsX0dldFN0cmluZ0Zyb21PYmoob2JqdlsyXSwgTlVMTCk7CisJICAgIC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSAyOgorCSAgICBUY2xfUmVzZXRSZXN1bHQoaW50ZXJwKTsKKwkgICAgVGNsX0FsbG93RXhjZXB0aW9ucyhpbnRlcnApOworCSAgICByZXN1bHQgPSBUY2xfRXZhbE9iaihpbnRlcnAsIG9ianZbMV0pOworCSAgICBpZiAocmVzdWx0ID09IFRDTF9FWElUKQorCQlyZXR1cm4gcmVzdWx0OworCSAgICBpZiAodmFybmFtZSkKKwkgICAgeworCQlpZiAoVGNsX1NldFZhcihpbnRlcnAsIHZhcm5hbWUsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSwgMCkgPT0gTlVMTCkKKwkJeworCQkgICAgVGNsX1NldFJlc3VsdChpbnRlcnAsICJjb3VsZG4ndCBzYXZlIGNvbW1hbmQgcmVzdWx0IGluIHZhcmlhYmxlIiwgVENMX1NUQVRJQyk7CisJCSAgICByZXR1cm4gVENMX0VSUk9SOworCQl9CisJICAgIH0KKwkgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIFRjbF9OZXdJbnRPYmoocmVzdWx0KSk7CisJICAgIHJldHVybiBUQ0xfT0s7CisJZGVmYXVsdDoKKwkgICAgVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDEsIG9ianYsICJjb21tYW5kID92YXJOYW1lPyIpOworICAgIH0KKyAgICByZXR1cm4gVENMX0VSUk9SOworfQorCisvKgorICogICI6OnZpbTo6YmVlcCIgLSB3aGF0IFZpW21dIGRvZXMgYmVzdCA6LSkKKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50CitiZWVwY21kKGR1bW15LCBpbnRlcnAsIG9iamMsIG9ianYpCisgICAgQ2xpZW50RGF0YSBkdW1teTsKKyAgICBUY2xfSW50ZXJwICppbnRlcnA7CisgICAgaW50IG9iamM7CisgICAgVGNsX09iaiAqQ09OU1Qgb2JqdltdOworeworICAgIGlmIChvYmpjICE9IDEpCisgICAgeworCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAxLCBvYmp2LCBOVUxMKTsKKwlyZXR1cm4gVENMX0VSUk9SOworICAgIH0KKyAgICB2aW1fYmVlcCgpOworICAgIHJldHVybiBUQ0xfT0s7Cit9CisKKy8qCisgKiAgIjo6dmltOjpidWZmZXIgbGlzdCIgLSBjcmVhdGUgYSBsaXN0IG9mIGJ1ZmZlciBjb21tYW5kcy4KKyAqICAiOjp2aW06OmJ1ZmZmZXIge059IiAtIGNyZWF0ZSBidWZmZXIgY29tbWFuZCBmb3IgYnVmZmVyIE4uCisgKiAgIjo6dmltOjpidWZmZXIgbmV3IiAtIGNyZWF0ZSBhIG5ldyBidWZmZXIgKG5vdCBpbXBsZW1lbnRlZCkKKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50CitidWZmZXJjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKKyAgICBDbGllbnREYXRhIGR1bW15OworICAgIFRjbF9JbnRlcnAgKmludGVycDsKKyAgICBpbnQgb2JqYzsKKyAgICBUY2xfT2JqICpDT05TVCBvYmp2W107Cit7CisgICAgY2hhcgkqbmFtZTsKKyAgICBidWZfVAkqYnVmOworICAgIFRjbF9PYmoJKnJlc29iajsKKyAgICBpbnQJCWVyciwgbiwgaWR4OworCisgICAgZW51bSB7QkNNRF9FWElTVFMsIEJDTURfTElTVH07CisgICAgc3RhdGljIGNoYXIgKmJjbWRvcHRpb25zW10gPQorICAgIHsKKwkiZXhpc3RzIiwgImxpc3QiLCAoY2hhciAqKTAKKyAgICB9OworCisgICAgaWYgKG9iamMgPCAyKQorICAgIHsKKwlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2JqdiwgIm9wdGlvbiIpOworCXJldHVybiBUQ0xfRVJST1I7CisgICAgfQorICAgIGVyciA9IFRjbF9HZXRJbnRGcm9tT2JqKGludGVycCwgb2JqdlsxXSwgJm4pOworICAgIGlmIChlcnIgPT0gVENMX09LKQorICAgIHsKKwlpZiAob2JqYyAhPSAyKQorCXsKKwkgICAgVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDEsIG9ianYsICJidWZOdW1iZXIiKTsKKwkgICAgcmV0dXJuIFRDTF9FUlJPUjsKKwl9CisJZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCXsKKwkgICAgaWYgKGJ1Zi0+Yl9mbnVtID09IG4pCisJICAgIHsKKwkJbmFtZSA9IHRjbGdldGJ1ZmZlcihpbnRlcnAsIGJ1Zik7CisJCWlmIChuYW1lID09IE5VTEwpCisJCSAgICByZXR1cm4gVENMX0VSUk9SOworCQlUY2xfU2V0UmVzdWx0KGludGVycCwgbmFtZSwgVENMX1ZPTEFUSUxFKTsKKwkJcmV0dXJuIFRDTF9PSzsKKwkgICAgfQorCX0KKwlUY2xfU2V0UmVzdWx0KGludGVycCwgXygiaW52YWxpZCBidWZmZXIgbnVtYmVyIiksIFRDTF9TVEFUSUMpOworCXJldHVybiBUQ0xfRVJST1I7CisgICAgfQorICAgIFRjbF9SZXNldFJlc3VsdChpbnRlcnApOyAvKiBjbGVhciBlcnJvciBmcm9tIFRjbF9HZXRJbnRGcm9tT2JqICovCisKKyAgICBlcnIgPSBUY2xfR2V0SW5kZXhGcm9tT2JqKGludGVycCwgb2JqdlsxXSwgYmNtZG9wdGlvbnMsICJvcHRpb24iLCAwLCAmaWR4KTsKKyAgICBpZiAoZXJyICE9IFRDTF9PSykKKwlyZXR1cm4gZXJyOworICAgIHN3aXRjaCAoaWR4KQorICAgIHsKKwljYXNlIEJDTURfTElTVDoKKwkgICAgaWYgKG9iamMgIT0gMikKKwkgICAgeworCQlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMiwgb2JqdiwgIiIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwkgICAgeworCQluYW1lID0gdGNsZ2V0YnVmZmVyKGludGVycCwgYnVmKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkKKwkJeworCQkgICAgZXJyID0gVENMX0VSUk9SOworCQkgICAgYnJlYWs7CisJCX0KKwkJVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCBuYW1lKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgQkNNRF9FWElTVFM6CisJICAgIGlmIChvYmpjICE9IDMpCisJICAgIHsKKwkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDIsIG9ianYsICJidWZOdW1iZXIiKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICBlcnIgPSBUY2xfR2V0SW50RnJvbU9iaihpbnRlcnAsIG9ianZbMl0sICZuKTsKKwkgICAgaWYgKGVyciA9PSBUQ0xfT0spCisJICAgIHsKKwkJYnVmID0gYnVmbGlzdF9maW5kbnIobik7CisJCXJlc29iaiA9IFRjbF9OZXdJbnRPYmooYnVmICE9IE5VTEwpOworCQlUY2xfU2V0T2JqUmVzdWx0KGludGVycCwgcmVzb2JqKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJub3QgaW1wbGVtZW50ZWQgeWV0IiksIFRDTF9TVEFUSUMpOworCSAgICBlcnIgPSBUQ0xfRVJST1I7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiAiOjp2aW06OndpbmRvdyBsaXN0IiAtIGNyZWF0ZSBsaXN0IG9mIHdpbmRvdyBjb21tYW5kcy4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50Cit3aW5kb3djbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKKyAgICBDbGllbnREYXRhCWR1bW15OworICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworeworICAgIGNoYXIJKndoYXQsICpzdHJpbmc7CisgICAgd2luX1QJKndpbjsKKworICAgIGlmIChvYmpjICE9IDIpCisgICAgeworCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAxLCBvYmp2LCAib3B0aW9uIik7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisgICAgd2hhdCA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKG9ianZbMV0sIE5VTEwpOworICAgIGlmIChzdHJjbXAod2hhdCwgImxpc3QiKSA9PSAwKQorICAgIHsKKwlGT1JfQUxMX1dJTkRPV1Mod2luKQorCXsKKwkgICAgc3RyaW5nID0gdGNsZ2V0d2luZG93KGludGVycCwgd2luKTsKKwkgICAgaWYgKHN0cmluZyA9PSBOVUxMKQorCQlyZXR1cm4gVENMX0VSUk9SOworCSAgICBUY2xfQXBwZW5kRWxlbWVudChpbnRlcnAsIHN0cmluZyk7CisJfQorCXJldHVybiBUQ0xfT0s7CisgICAgfQorICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJ1bmtub3duIG9wdGlvbiIpLCBUQ0xfU1RBVElDKTsKKyAgICByZXR1cm4gVENMX0VSUk9SOworfQorCisvKgorICogZmxhZ3MgZm9yIGJ1ZnNlbGZjbWQgYW5kIHdpbnNlbGZjbWQgdG8gaW5kaWNhdGUgb3V0c3RhbmRpbmcgYWN0aW9ucy4KKyAqLworI2RlZmluZSBGTF9VUERBVEVfU0NSRUVOCSgxPDwwKQorI2RlZmluZSBGTF9VUERBVEVfQ1VSQlVGCSgxPDwxKQorI2RlZmluZSBGTF9BREpVU1RfQ1VSU09SCSgxPDwyKQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBidWZmZXIgY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitidWZzZWxmY21kKHJlZiwgaW50ZXJwLCBvYmpjLCBvYmp2KQorICAgIENsaWVudERhdGEJcmVmOworICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworeworICAgIGludAkJb3B0LCBlcnIsIGlkeCwgZmxhZ3M7CisgICAgaW50CQl2YWwxLCB2YWwyLCBuLCBpOworICAgIGJ1Zl9UCSpidWYsICpzYXZlYnVmOworICAgIHdpbl9UCSp3aW4sICpzYXZld2luOworICAgIFRjbF9PYmoJKnJlc29iajsKKyAgICBwb3NfVAkqcG9zOworICAgIGNoYXIJKmxpbmU7CisKKyAgICBlbnVtCisgICAgeworCUJVRl9BUFBFTkQsIEJVRl9DT01NQU5ELCBCVUZfQ09VTlQsIEJVRl9ERUxDTUQsIEJVRl9ERUxFVEUsIEJVRl9FWFBSLAorCUJVRl9HRVQsIEJVRl9JTlNFUlQsIEJVRl9MQVNULCBCVUZfTUFSSywgQlVGX05BTUUsIEJVRl9OVU1CRVIsCisJQlVGX09QVElPTiwgQlVGX1NFVCwgQlVGX1dJTkRPV1MKKyAgICB9OworICAgIHN0YXRpYyBjaGFyICpidWZvcHRpb25zW10gPQorICAgIHsKKwkiYXBwZW5kIiwgImNvbW1hbmQiLCAiY291bnQiLCAiZGVsY21kIiwgImRlbGV0ZSIsICJleHByIiwKKwkiZ2V0IiwgImluc2VydCIsICJsYXN0IiwgIm1hcmsiLCAibmFtZSIsICJudW1iZXIiLAorCSJvcHRpb24iLCAic2V0IiwgIndpbmRvd3MiLCAoY2hhciAqKTAKKyAgICB9OworCisgICAgaWYgKG9iamMgPCAyKQorICAgIHsKKwlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2JqdiwgIm9wdGlvbiA/YXJnIC4uLj8iKTsKKwlyZXR1cm4gVENMX0VSUk9SOworICAgIH0KKworICAgIGVyciA9IFRjbF9HZXRJbmRleEZyb21PYmooaW50ZXJwLCBvYmp2WzFdLCBidWZvcHRpb25zLCAib3B0aW9uIiwgMCwgJmlkeCk7CisgICAgaWYgKGVyciAhPSBUQ0xfT0spCisJcmV0dXJuIGVycjsKKworICAgIGJ1ZiA9IChidWZfVCAqKSgoc3RydWN0IHJlZiAqKXJlZiktPnZpbW9iajsKKyAgICBzYXZlYnVmID0gY3VyYnVmOyAgY3VyYnVmID0gYnVmOworICAgIHNhdmV3aW4gPSBjdXJ3aW47ICBjdXJ3aW4gPSB0Y2xmaW5kd2luKGJ1Zik7CisgICAgZmxhZ3MgPSAwOworICAgIG9wdCA9IDA7CisKKyAgICBzd2l0Y2ggKGlkeCkKKyAgICB7CisJY2FzZSBCVUZfQ09NTUFORDoKKwkgICAgZXJyID0gdGNsZG9leGNvbW1hbmQoaW50ZXJwLCBvYmpjLCBvYmp2LCAyKTsKKwkgICAgZmxhZ3MgfD0gRkxfVVBEQVRFX1NDUkVFTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9PUFRJT046CisJICAgIGVyciA9IHRjbHNldG9wdGlvbihpbnRlcnAsIG9iamMsIG9ianYsIDIpOworCSAgICBmbGFncyB8PSBGTF9VUERBVEVfU0NSRUVOOworCSAgICBicmVhazsKKworCWNhc2UgQlVGX0VYUFI6CisJICAgIGVyciA9IHRjbHZpbWV4cHIoaW50ZXJwLCBvYmpjLCBvYmp2LCAyKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9OQU1FOgorCSAgICAvKgorCSAgICAgKglHZXQgZmlsZW5hbWUgb2YgYnVmZmVyLgorCSAgICAgKi8KKwkgICAgaWYgKG9iamMgIT0gMikKKwkgICAgeworCQlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMiwgb2JqdiwgTlVMTCk7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGJ1Zi0+Yl9mZm5hbWUpCisJCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCAoY2hhciAqKWJ1Zi0+Yl9mZm5hbWUsIFRDTF9WT0xBVElMRSk7CisJICAgIGVsc2UKKwkJVGNsX1NldFJlc3VsdChpbnRlcnAsICIiLCBUQ0xfU1RBVElDKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9MQVNUOgorCSAgICAvKgorCSAgICAgKiBHZXQgbGluZSBudW1iZXIgb2YgbGFzdCBsaW5lLgorCSAgICAgKi8KKwkgICAgb3B0ID0gMTsKKwkgICAgLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIEJVRl9DT1VOVDoKKwkgICAgLyoKKwkgICAgICogR2V0IG51bWJlciBvZiBsaW5lcyBpbiBidWZmZXIuCisJICAgICAqLworCSAgICBpZiAob2JqYyAhPSAyKQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCBOVUxMKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICB2YWwxID0gKGludClidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgaWYgKG9wdCkKKwkJdmFsMSA9IHJvdzJ0Y2wodmFsMSk7CisKKwkgICAgcmVzb2JqID0gVGNsX05ld0ludE9iaih2YWwxKTsKKwkgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIHJlc29iaik7CisJICAgIGJyZWFrOworCisJY2FzZSBCVUZfTlVNQkVSOgorCSAgICAvKgorCSAgICAgKiBHZXQgYnVmZmVyJ3MgbnVtYmVyLgorCSAgICAgKi8KKwkgICAgaWYgKG9iamMgIT0gMikKKwkgICAgeworCQlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMiwgb2JqdiwgTlVMTCk7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgcmVzb2JqID0gVGNsX05ld0ludE9iaigoaW50KWJ1Zi0+Yl9mbnVtKTsKKwkgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIHJlc29iaik7CisJICAgIGJyZWFrOworCisJY2FzZSBCVUZfR0VUOgorCSAgICBpZiAob2JqYyAhPSAzICYmIG9iamMgIT0gNCkKKwkgICAgeworCQlUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMiwgb2JqdiwgImxpbmVOdW1iZXIgP2xpbmVOdW1iZXI/Iik7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZXJyID0gdGNsZ2V0bGluZW51bShpbnRlcnAsIG9ianZbMl0sICZ2YWwxLCBidWYpOworCSAgICBpZiAoZXJyICE9IFRDTF9PSykKKwkJYnJlYWs7CisJICAgIGlmIChvYmpjID09IDQpCisJICAgIHsKKwkJZXJyID0gdGNsZ2V0bGluZW51bShpbnRlcnAsIG9ianZbM10sICZ2YWwyLCBidWYpOworCQlpZiAoZXJyICE9IFRDTF9PSykKKwkJICAgIGJyZWFrOworCQlpZiAodmFsMSA+IHZhbDIpCisJCXsKKwkJICAgIG4gPSB2YWwxOyB2YWwxID0gdmFsMjsgdmFsMiA9IG47CisJCX0KKwkJVGNsX1Jlc2V0UmVzdWx0KGludGVycCk7CisKKwkJZm9yIChuID0gdmFsMTsgbiA8PSB2YWwyICYmIGVyciA9PSBUQ0xfT0s7IG4rKykKKwkJeworCQkgICAgbGluZSA9IChjaGFyICopbWxfZ2V0X2J1ZihidWYsIChsaW5lbnJfVCluLCBGQUxTRSk7CisJCSAgICBpZiAobGluZSkKKwkJCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCwgbGluZSk7CisJCSAgICBlbHNlCisJCQllcnIgPSBUQ0xfRVJST1I7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIHsgIC8qIG9iamMgPT0gMyAqLworCQlsaW5lID0gKGNoYXIgKiltbF9nZXRfYnVmKGJ1ZiwgKGxpbmVucl9UKXZhbDEsIEZBTFNFKTsKKwkJVGNsX1NldFJlc3VsdChpbnRlcnAsIGxpbmUsIFRDTF9WT0xBVElMRSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9TRVQ6CisJICAgIGlmIChvYmpjICE9IDQgJiYgb2JqYyAhPSA1KQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAzLCBvYmp2LCAibGluZU51bWJlciA/bGluZU51bWJlcj8gc3RyaW5nT3JMaXN0Iik7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZXJyID0gdGNsZ2V0bGluZW51bShpbnRlcnAsIG9ianZbMl0sICZ2YWwxLCBidWYpOworCSAgICBpZiAoZXJyICE9IFRDTF9PSykKKwkJcmV0dXJuIFRDTF9FUlJPUjsKKwkgICAgaWYgKG9iamMgPT0gNCkKKwkgICAgeworCQkvKgorCQkgKiAgUmVwbGFjZSBvbmUgbGluZSB3aXRoIGEgc3RyaW5nLgorCQkgKgkkYnVmIHNldCB7bn0ge3N0cmluZ30KKwkJICovCisJCWxpbmUgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihvYmp2WzNdLCBOVUxMKTsKKwkJaWYgKHVfc2F2ZXN1YigobGluZW5yX1QpdmFsMSkgIT0gT0spCisJCXsKKwkJICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIiksIFRDTF9TVEFUSUMpOworCQkgICAgZXJyID0gVENMX0VSUk9SOworCQl9CisJCWVsc2UKKwkJaWYgKG1sX3JlcGxhY2UoKGxpbmVucl9UKXZhbDEsIChjaGFyX3UgKilsaW5lLCBUUlVFKSAhPSBPSykKKwkJeworCQkgICAgVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImNhbm5vdCByZXBsYWNlIGxpbmUiKSwgVENMX1NUQVRJQyk7CisJCSAgICBlcnIgPSBUQ0xfRVJST1I7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjaGFuZ2VkX2J5dGVzKChsaW5lbnJfVCl2YWwxLCAwKTsKKwkJICAgIGZsYWdzIHw9IEZMX1VQREFURV9DVVJCVUY7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qCisJCSAqIFJlcGxhY2Ugc2V2ZXJhbCBsaW5lcyB3aXRoIHRoZSBlbGVtZW50cyBvZiBhIFRjbCBsaXN0LgorCQkgKgkkYnVmIHNldCB7bn0ge219IHtsaXN0fQorCQkgKiBJZiB0aGUgbGlzdCBjb250YWlucyBtb3JlIHRoYW4ge219LXtufSsxIGVsZW1lbnRzLCB0aGV5CisJCSAqIGFyZSAqIGluc2VydGVkIGFmdGVyIGxpbmUge219LiAgSWYgdGhlIGxpc3QgY29udGFpbnMgZmV3ZXIKKwkJICogZWxlbWVudHMsICogdGhlIGxpbmVzIGZyb20ge259K2xlbmd0aCh7bGlzdH0pIHRocm91Z2gge219CisJCSAqIGFyZSBkZWxldGVkLgorCQkgKi8KKwkJaW50CSAgICBsYzsKKwkJVGNsX09iagkgICAgKipsdjsKKworCQllcnIgPSB0Y2xnZXRsaW5lbnVtKGludGVycCwgb2JqdlszXSwgJnZhbDIsIGJ1Zik7CisJCWlmIChlcnIgIT0gVENMX09LKQorCQkgICAgYnJlYWs7CisJCWVyciA9IFRjbF9MaXN0T2JqR2V0RWxlbWVudHMoaW50ZXJwLCBvYmp2WzRdLCAmbGMsICZsdik7CisJCWlmIChlcnIgIT0gVENMX09LKQorCQkgICAgYnJlYWs7CisJCWlmICh2YWwxID4gdmFsMikKKwkJeworCQkgICAgbiA9IHZhbDE7CisJCSAgICB2YWwxID0gdmFsMjsKKwkJICAgIHZhbDIgPSBuOworCQl9CisKKwkJbiA9IHZhbDE7CisJCWlmICh1X3NhdmUoKGxpbmVucl9UKSh2YWwxIC0gMSksIChsaW5lbnJfVCkodmFsMiArIDEpKSAhPSBPSykKKwkJeworCQkgICAgVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iKSwKKwkJCQkJCQkJICBUQ0xfU1RBVElDKTsKKwkJICAgIGVyciA9IFRDTF9FUlJPUjsKKwkJICAgIGJyZWFrOworCQl9CisJCWZsYWdzIHw9IEZMX1VQREFURV9DVVJCVUY7CisKKwkJZm9yIChpID0gMDsgaSA8IGxjICYmIG4gPD0gdmFsMjsgaSsrKQorCQl7CisJCSAgICBsaW5lID0gVGNsX0dldFN0cmluZ0Zyb21PYmoobHZbaV0sIE5VTEwpOworCQkgICAgaWYgKG1sX3JlcGxhY2UoKGxpbmVucl9UKW4sIChjaGFyX3UgKilsaW5lLCBUUlVFKSAhPSBPSykKKwkJCWdvdG8gc2V0TGlzdEVycm9yOworCQkgICAgKytuOworCQl9CisJCWlmIChpIDwgbGMpCisJCXsKKwkJICAgIC8qIGFwcGVuZCBsaW5lcyAqLworCQkgICAgZG8KKwkJICAgIHsKKwkJCWxpbmUgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihsdltpXSwgTlVMTCk7CisJCQlpZiAobWxfYXBwZW5kKChsaW5lbnJfVCkobiAtIDEpLAorCQkJCQkgICAgICAoY2hhcl91ICopbGluZSwgMCwgRkFMU0UpICE9IE9LKQorCQkJICAgIGdvdG8gc2V0TGlzdEVycm9yOworCQkJKytuOworCQkJKytpOworCQkgICAgfSB3aGlsZSAoaSA8IGxjKTsKKwkJfQorCQllbHNlIGlmIChuIDw9IHZhbDIpCisJCXsKKwkJICAgIC8qIGRpZCBub3QgcmVwbGFjZSBhbGwgbGluZXMsIGRlbGV0ZSAqLworCQkgICAgaSA9IG47CisJCSAgICBkbworCQkgICAgeworCQkJaWYgKG1sX2RlbGV0ZSgobGluZW5yX1QpaSwgRkFMU0UpICE9IE9LKQorCQkJICAgIGdvdG8gc2V0TGlzdEVycm9yOworCQkJKytuOworCQkgICAgfSB3aGlsZSAobiA8PSB2YWwyKTsKKwkJfQorCQlsYyAtPSB2YWwyIC0gdmFsMSArIDE7CS8qIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXBsYWNlZCAqLworCQltYXJrX2FkanVzdCgobGluZW5yX1QpdmFsMSwgKGxpbmVucl9UKXZhbDIsIChsb25nKU1BWExOVU0sCisJCQkJCQkJCSAgICAobG9uZylsYyk7CisJCWNoYW5nZWRfbGluZXMoKGxpbmVucl9UKXZhbDEsIDAsIChsaW5lbnJfVCl2YWwyICsgMSwgKGxvbmcpbGMpOworCQlicmVhazsKKyAgICBzZXRMaXN0RXJyb3I6CisJCXVfdW5kbygxKTsgIC8qID8/PyAqLworCQlUY2xfU2V0UmVzdWx0KGludGVycCwgXygiY2Fubm90IHNldCBsaW5lKHMpIiksIFRDTF9TVEFUSUMpOworCQllcnIgPSBUQ0xfRVJST1I7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9ERUxFVEU6CisJICAgIGlmIChvYmpjICE9IDMgICYmICBvYmpjICE9IDQpCisJICAgIHsKKwkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDMsIG9ianYsICJsaW5lTnVtYmVyID9saW5lTnVtYmVyPyIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVyciA9IHRjbGdldGxpbmVudW0oaW50ZXJwLCBvYmp2WzJdLCAmdmFsMSwgYnVmKTsKKwkgICAgaWYgKGVyciAhPSBUQ0xfT0spCisJCWJyZWFrOworCSAgICB2YWwyID0gdmFsMTsKKwkgICAgaWYgKG9iamMgPT0gNCkKKwkgICAgeworCQllcnIgPSB0Y2xnZXRsaW5lbnVtKGludGVycCwgb2JqdlszXSwgJnZhbDIsIGJ1Zik7CisJCWlmIChlcnIgIT0gVENMX09LKQorCQkgICAgcmV0dXJuIGVycjsKKwkJaWYgKHZhbDEgPiB2YWwyKQorCQl7CisJCSAgICBpID0gdmFsMTsgdmFsMSA9IHZhbDI7IHZhbDIgPSBpOworCQl9CisJICAgIH0KKwkgICAgbiA9IHZhbDIgLSB2YWwxICsgMTsKKwkgICAgaWYgKHVfc2F2ZWRlbCgobGluZW5yX1QpdmFsMSwgKGxvbmcpbikgIT0gT0spCisJICAgIHsKKwkJVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iKSwKKwkJCQkJCQkJICBUQ0xfU1RBVElDKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCSAgICB7CisJCW1sX2RlbGV0ZSgobGluZW5yX1QpdmFsMSwgRkFMU0UpOworCQllcnIgPSB2aW1lcnJvcihpbnRlcnApOworCQlpZiAoZXJyICE9IFRDTF9PSykKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmIChpID4gMCkKKwkJZGVsZXRlZF9saW5lc19tYXJrKChsaW5lbnJfVCl2YWwxLCAobG9uZylpKTsKKwkgICAgZmxhZ3MgfD0gRkxfQURKVVNUX0NVUlNPUnxGTF9VUERBVEVfU0NSRUVOOworCSAgICBicmVhazsKKworCWNhc2UgQlVGX01BUks6CisJICAgIGlmIChvYmpjICE9IDMpCisJICAgIHsKKwkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDIsIG9ianYsICJtYXJrTmFtZSIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGxpbmUgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihvYmp2WzJdLCBOVUxMKTsKKworCSAgICBwb3MgPSBOVUxMOworCSAgICBpZiAobGluZVswXSAhPSAnXDAnICAmJiAgbGluZVsxXSA9PSAnXDAnKQorCSAgICB7CisJCXBvcyA9IGdldG1hcmsobGluZVswXSwgRkFMU0UpOworCSAgICB9CisJICAgIGlmIChwb3MgPT0gTlVMTCkKKwkgICAgeworCQlUY2xfU2V0UmVzdWx0KGludGVycCwgXygiaW52YWxpZCBtYXJrIG5hbWUiKSwgVENMX1NUQVRJQyk7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZXJyID0gdmltZXJyb3IoaW50ZXJwKTsKKwkgICAgaWYgKGVyciAhPSBUQ0xfT0spCisJCWJyZWFrOworCSAgICBpZiAocG9zLT5sbnVtIDw9IDApCisJICAgIHsKKwkJVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oIm1hcmsgbm90IHNldCIpLCBUQ0xfU1RBVElDKTsKKwkJZXJyID0gVENMX0VSUk9SOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQljaGFyIHJidWZbNjRdOworCQlzcHJpbnRmKHJidWYsIF8oInJvdyAlZCBjb2x1bW4gJWQiKSwgKGludClyb3cydGNsKHBvcy0+bG51bSksIChpbnQpY29sMnRjbChwb3MtPmNvbCkpOworCQlUY2xfU2V0UmVzdWx0KGludGVycCwgcmJ1ZiwgVENMX1ZPTEFUSUxFKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgQlVGX0lOU0VSVDoKKwkgICAgb3B0ID0gMTsKKwkgICAgLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIEJVRl9BUFBFTkQ6CisJICAgIGlmIChvYmpjICE9IDQpCisJICAgIHsKKwkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDIsIG9ianYsICJsaW5lTnVtIHRleHQiKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICBlcnIgPSB0Y2xnZXRsaW5lbnVtKGludGVycCwgb2JqdlsyXSwgJnZhbDEsIGJ1Zik7CisJICAgIGlmIChlcnIgIT0gVENMX09LKQorCQlicmVhazsKKwkgICAgaWYgKG9wdCkKKwkJLS12YWwxOworCSAgICBpZiAodV9zYXZlKChsaW5lbnJfVCl2YWwxLCAobGluZW5yX1QpKHZhbDErMSkpICE9IE9LKQorCSAgICB7CisJCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIiksIFRDTF9TVEFUSUMpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgbGluZSA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKG9ianZbM10sIE5VTEwpOworCSAgICBpZiAobWxfYXBwZW5kKChsaW5lbnJfVCl2YWwxLCAoY2hhcl91ICopbGluZSwgMCwgRkFMU0UpICE9IE9LKQorCSAgICB7CisJCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIiksIFRDTF9TVEFUSUMpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGFwcGVuZGVkX2xpbmVzX21hcmsoKGxpbmVucl9UKXZhbDEsIDFMKTsKKwkgICAgZmxhZ3MgfD0gRkxfVVBEQVRFX1NDUkVFTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEJVRl9XSU5ET1dTOgorCSAgICAvKgorCSAgICAgKiBSZXR1cm4gbGlzdCBvZiB3aW5kb3cgY29tbWFuZHMuCisJICAgICAqLworCSAgICBpZiAob2JqYyAhPSAyKQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCBOVUxMKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICBUY2xfUmVzZXRSZXN1bHQoaW50ZXJwKTsKKwkgICAgRk9SX0FMTF9XSU5ET1dTKHdpbikKKwkgICAgeworCQlpZiAod2luLT53X2J1ZmZlciA9PSBidWYpCisJCXsKKwkJICAgIGxpbmUgPSB0Y2xnZXR3aW5kb3coaW50ZXJwLCB3aW4pOworCQkgICAgaWYgKGxpbmUgIT0gTlVMTCkKKwkJCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCwgbGluZSk7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQllcnIgPSBUQ0xfRVJST1I7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBCVUZfREVMQ01EOgorCSAgICAvKgorCSAgICAgKiBSZWdpc3RlciBkZWxldGlvbiBjYWxsYmFjay4KKwkgICAgICogVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgY2FsbGJhY2tzCisJICAgICAqLworCSAgICBpZiAob2JqYyAhPSAzKQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCAiY29tbWFuZCIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVyciA9IHRjbHNldGRlbGNtZChpbnRlcnAsIGJ1Zi0+dGNsX3JlZiwgKHZvaWQgKilidWYsIG9ianZbMl0pOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJub3QgaW1wbGVtZW50ZWQgeWV0IiksIFRDTF9TVEFUSUMpOworCSAgICBlcnIgPSBUQ0xfRVJST1I7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRkxfVVBEQVRFX0NVUkJVRikKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisgICAgY3VyYnVmID0gc2F2ZWJ1ZjsKKyAgICBjdXJ3aW4gPSBzYXZld2luOworICAgIGlmIChmbGFncyAmIEZMX0FESlVTVF9DVVJTT1IpCisJY2hlY2tfY3Vyc29yKCk7CisgICAgaWYgKGZsYWdzICYgKEZMX1VQREFURV9TQ1JFRU4gfCBGTF9VUERBVEVfQ1VSQlVGKSkKKwl1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB3aW5kb3cgY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgaW50Cit3aW5zZWxmY21kKHJlZiwgaW50ZXJwLCBvYmpjLCBvYmp2KQorICAgIENsaWVudERhdGEJcmVmOworICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworeworICAgIGludAkJZXJyLCBpZHgsIGZsYWdzOworICAgIGludAkJdmFsMSwgdmFsMjsKKyAgICBUY2xfT2JqCSpyZXNvYmo7CisgICAgd2luX1QJKnNhdmV3aW4sICp3aW47CisgICAgYnVmX1QJKnNhdmVidWY7CisgICAgY2hhcgkqc3RyOworCisgICAgZW51bQorICAgIHsKKwlXSU5fQlVGRkVSLCBXSU5fQ09NTUFORCwgV0lOX0NVUlNPUiwgV0lOX0RFTENNRCwgV0lOX0VYUFIsCisJV0lOX0hFSUdIVCwgV0lOX09QVElPTgorICAgIH07CisgICAgc3RhdGljIGNoYXIgKndpbm9wdGlvbnNbXSA9CisgICAgeworCSJidWZmZXIiLCAiY29tbWFuZCIsICJjdXJzb3IiLCAiZGVsY21kIiwgImV4cHIiLAorCSJoZWlnaHQiLCAib3B0aW9uIiwgKGNoYXIgKikwCisgICAgfTsKKworICAgIGlmIChvYmpjIDwgMikKKyAgICB7CisJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDEsIG9ianYsICJvcHRpb24gP2FyZyAuLi4/Iik7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisKKyAgICBlcnIgPSBUY2xfR2V0SW5kZXhGcm9tT2JqKGludGVycCwgb2JqdlsxXSwgd2lub3B0aW9ucywgIm9wdGlvbiIsIDAsICAmaWR4KTsKKyAgICBpZiAoZXJyICE9IFRDTF9PSykKKwlyZXR1cm4gVENMX0VSUk9SOworCisgICAgd2luID0gKHdpbl9UICopKChzdHJ1Y3QgcmVmICopcmVmKS0+dmltb2JqOworICAgIHNhdmV3aW4gPSBjdXJ3aW47ICBjdXJ3aW4gPSB3aW47CisgICAgc2F2ZWJ1ZiA9IGN1cmJ1ZjsgIGN1cmJ1ZiA9IHdpbi0+d19idWZmZXI7CisgICAgZmxhZ3MgPSAwOworCisgICAgc3dpdGNoIChpZHgpCisgICAgeworCWNhc2UgV0lOX09QVElPTjoKKwkgICAgZXJyID0gdGNsc2V0b3B0aW9uKGludGVycCwgb2JqYywgb2JqdiwgMik7CisJICAgIGZsYWdzIHw9IEZMX1VQREFURV9TQ1JFRU47CisJICAgIGJyZWFrOworCisJY2FzZSBXSU5fQ09NTUFORDoKKwkgICAgZXJyID0gdGNsZG9leGNvbW1hbmQoaW50ZXJwLCBvYmpjLCBvYmp2LCAyKTsKKwkgICAgZmxhZ3MgfD0gRkxfVVBEQVRFX1NDUkVFTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIFdJTl9FWFBSOgorCSAgICBlcnIgPSB0Y2x2aW1leHByKGludGVycCwgb2JqYywgb2JqdiwgMik7CisJICAgIGJyZWFrOworCisJY2FzZSBXSU5fSEVJR0hUOgorCSAgICBpZiAob2JqYyA9PSAzKQorCSAgICB7CisJCWVyciA9IFRjbF9HZXRJbnRGcm9tT2JqKGludGVycCwgb2JqdlsyXSwgJnZhbDEpOworCQlpZiAoZXJyICE9IFRDTF9PSykKKwkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfR1VJCisJCW5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKwkJd2luX3NldGhlaWdodCh2YWwxKTsKKwkJZXJyID0gdmltZXJyb3IoaW50ZXJwKTsKKwkJaWYgKGVyciAhPSBUQ0xfT0spCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIGlmIChvYmpjICE9IDIpCisJICAgIHsKKwkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIDIsIG9ianYsICI/dmFsdWU/Iik7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICByZXNvYmogPSBUY2xfTmV3SW50T2JqKChpbnQpKHdpbi0+d19oZWlnaHQpKTsKKwkgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIHJlc29iaik7CisJICAgIGJyZWFrOworCisJY2FzZSBXSU5fQlVGRkVSOgorCSAgICBpZiAob2JqYyAhPSAyKQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCBOVUxMKTsKKwkJZXJyID0gVENMX0VSUk9SOworCQlicmVhazsKKwkgICAgfQorCSAgICBzdHIgPSB0Y2xnZXRidWZmZXIoaW50ZXJwLCB3aW4tPndfYnVmZmVyKTsKKwkgICAgaWYgKHN0cikKKwkJVGNsX1NldFJlc3VsdChpbnRlcnAsIHN0ciwgVENMX1ZPTEFUSUxFKTsKKwkgICAgZWxzZQorCQllcnIgPSBUQ0xfRVJST1I7CisJICAgIGJyZWFrOworCisJY2FzZSBXSU5fREVMQ01EOgorCSAgICBpZiAob2JqYyAhPSAzKQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCAiY29tbWFuZCIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVyciA9IHRjbHNldGRlbGNtZChpbnRlcnAsIHdpbi0+dGNsX3JlZiwgKHZvaWQgKil3aW4sIG9ianZbMl0pOworCSAgICBicmVhazsKKworCWNhc2UgV0lOX0NVUlNPUjoKKwkgICAgaWYgKG9iamMgPiA0KQorCSAgICB7CisJCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCAyLCBvYmp2LCAiP2FyZzEgP2FyZzI/PyIpOworCQllcnIgPSBUQ0xfRVJST1I7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChvYmpjID09IDIpCisJICAgIHsKKwkJY2hhciBidWZbNjRdOworCQlzcHJpbnRmKGJ1ZiwgXygicm93ICVkIGNvbHVtbiAlZCIpLCAoaW50KXJvdzJ0Y2wod2luLT53X2N1cnNvci5sbnVtKSwgKGludCljb2wydGNsKHdpbi0+d19jdXJzb3IuY29sKSk7CisJCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBidWYsIFRDTF9WT0xBVElMRSk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKG9iamMgPT0gMykKKwkgICAgeworCQlUY2xfT2JqICpwYXJ0LCAqdmFyOworCisJCXBhcnQgPSBUY2xfTmV3U3RyaW5nT2JqKCJyb3ciLCAtMSk7CisJCXZhciA9IFRjbF9PYmpHZXRWYXIyKGludGVycCwgb2JqdlsyXSwgcGFydCwgVENMX0xFQVZFX0VSUl9NU0cpOworCQlpZiAodmFyID09IE5VTEwpCisJCXsKKwkJICAgIGVyciA9IFRDTF9FUlJPUjsKKwkJICAgIGJyZWFrOworCQl9CisJCWVyciA9IHRjbGdldGxpbmVudW0oaW50ZXJwLCB2YXIsICZ2YWwxLCB3aW4tPndfYnVmZmVyKTsKKwkJaWYgKGVyciAhPSBUQ0xfT0spCisJCSAgICBicmVhazsKKwkJcGFydCA9IFRjbF9OZXdTdHJpbmdPYmooImNvbHVtbiIsIC0xKTsKKwkJdmFyID0gVGNsX09iakdldFZhcjIoaW50ZXJwLCBvYmp2WzJdLCBwYXJ0LCBUQ0xfTEVBVkVfRVJSX01TRyk7CisJCWlmICh2YXIgPT0gTlVMTCkKKwkJeworCQkgICAgZXJyID0gVENMX0VSUk9SOworCQkgICAgYnJlYWs7CisJCX0KKwkJZXJyID0gVGNsX0dldEludEZyb21PYmooaW50ZXJwLCB2YXIsICZ2YWwyKTsKKwkJaWYgKGVyciAhPSBUQ0xfT0spCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBlbHNlIHsgIC8qIG9iamMgPT0gNCAqLworCQllcnIgPSB0Y2xnZXRsaW5lbnVtKGludGVycCwgb2JqdlsyXSwgJnZhbDEsIHdpbi0+d19idWZmZXIpOworCQlpZiAoZXJyICE9IFRDTF9PSykKKwkJICAgIGJyZWFrOworCQllcnIgPSBUY2xfR2V0SW50RnJvbU9iaihpbnRlcnAsIG9ianZbM10sICZ2YWwyKTsKKwkJaWYgKGVyciAhPSBUQ0xfT0spCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICAvKiBUT0RPOiBzaG91bGQgY2hlY2sgY29sdW1uICovCisJICAgIHdpbi0+d19jdXJzb3IubG51bSA9IHZhbDE7CisJICAgIHdpbi0+d19jdXJzb3IuY29sID0gY29sMnZpbSh2YWwyKTsKKwkgICAgZmxhZ3MgfD0gRkxfVVBEQVRFX1NDUkVFTjsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBUY2xfU2V0UmVzdWx0KGludGVycCwgXygibm90IGltcGxlbWVudGVkIHlldCIpLCBUQ0xfU1RBVElDKTsKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgY3Vyd2luID0gc2F2ZXdpbjsKKyAgICBjdXJidWYgPSBzYXZlYnVmOworICAgIGlmIChmbGFncyAmIEZMX1VQREFURV9TQ1JFRU4pCisJdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworCisgICAgcmV0dXJuIGVycjsKK30KKworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2NvbW1hbmRjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKKyAgICBDbGllbnREYXRhCWR1bW15OworICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworeworICAgIGludAkJZXJyOworCisgICAgZXJyID0gdGNsZG9leGNvbW1hbmQoaW50ZXJwLCBvYmpjLCBvYmp2LCAxKTsKKyAgICB1cGRhdGVfc2NyZWVuKFZBTElEKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK29wdGlvbmNtZChkdW1teSwgaW50ZXJwLCBvYmpjLCBvYmp2KQorICAgIENsaWVudERhdGEJZHVtbXk7CisgICAgVGNsX0ludGVycAkqaW50ZXJwOworICAgIGludAkJb2JqYzsKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W107Cit7CisgICAgaW50CQllcnI7CisKKyAgICBlcnIgPSB0Y2xzZXRvcHRpb24oaW50ZXJwLCBvYmpjLCBvYmp2LCAxKTsKKyAgICB1cGRhdGVfc2NyZWVuKFZBTElEKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2V4cHJjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKKyAgICBDbGllbnREYXRhCWR1bW15OworICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworeworICAgIHJldHVybiB0Y2x2aW1leHByKGludGVycCwgb2JqYywgb2JqdiwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBUY2wgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogR2V0IGEgbGluZSBudW1iZXIgZnJvbSAnb2JqJyBhbmQgY29udmVydCBpdCB0byB2aW0ncyByYW5nZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3RjbGdldGxpbmVudW0oaW50ZXJwLCBvYmosIHZhbHVlUCwgYnVmKQorICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBUY2xfT2JqCSpvYmo7CisgICAgaW50CQkqdmFsdWVQOworICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaW50IGVyciwgaTsKKworICAgIGVudW0geyBMTl9CRUdJTiwgTE5fQk9UVE9NLCBMTl9FTkQsIExOX0ZJUlNULCBMTl9MQVNULCBMTl9TVEFSVCwgTE5fVE9QIH07CisKKyAgICBzdGF0aWMgY2hhciAqa2V5d1tdID0KKyAgICB7CisJImJlZ2luIiwgImJvdHRvbSIsICJlbmQiLCAiZmlyc3QiLCAibGFzdCIsICJzdGFydCIsICJ0b3AiLCAoY2hhciAqKTAKKyAgICB9OworCisgICAgZXJyID0gVGNsX0dldEluZGV4RnJvbU9iaihpbnRlcnAsIG9iaiwga2V5dywgIiIsIDAsICZpKTsKKyAgICBpZiAoZXJyID09IFRDTF9PSykKKyAgICB7CisJc3dpdGNoIChpKQorCXsKKwkgICAgY2FzZSBMTl9CRUdJTjoKKwkgICAgY2FzZSBMTl9GSVJTVDoKKwkgICAgY2FzZSBMTl9TVEFSVDoKKwkgICAgY2FzZSBMTl9UT1A6CisJCSp2YWx1ZVAgPSAxOworCQlicmVhazsKKwkgICAgY2FzZSBMTl9CT1RUT006CisJICAgIGNhc2UgTE5fRU5EOgorCSAgICBjYXNlIExOX0xBU1Q6CisJCSp2YWx1ZVAgPSBidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBUQ0xfT0s7CisgICAgfQorICAgIFRjbF9SZXNldFJlc3VsdChpbnRlcnApOworCisgICAgZXJyID0gVGNsX0dldEludEZyb21PYmooaW50ZXJwLCBvYmosICZpKTsKKyAgICBpZiAoZXJyICE9IFRDTF9PSykKKwlyZXR1cm4gZXJyOworICAgIGkgPSByb3cydmltKGkpOworICAgIGlmIChpIDwgMSAgfHwgIGkgPiBidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIpLCBUQ0xfU1RBVElDKTsKKwlyZXR1cm4gVENMX0VSUk9SOworICAgIH0KKyAgICAqdmFsdWVQID0gaTsKKyAgICByZXR1cm4gVENMX09LOworfQorCisvKgorICogRmluZCB0aGUgZmlyc3Qgd2luZG93IGluIHRoZSB3aW5kb3cgbGlzdCB0aGF0IGRpc3BsYXlzIHRoZSBidWZmZXIuCisgKi8KKyAgICBzdGF0aWMgd2luX1QgKgordGNsZmluZHdpbihidWYpCisgICAgYnVmX1QgKmJ1ZjsKK3sKKyAgICB3aW5fVCAqd2luOworCisgICAgRk9SX0FMTF9XSU5ET1dTKHdpbikKKyAgICB7CisJaWYgKHdpbi0+d19idWZmZXIgPT0gYnVmKQorCSAgICByZXR1cm4gd2luOworICAgIH0KKyAgICByZXR1cm4gY3Vyd2luOyAgLyoga2VlcCBjdXJyZW50IHdpbmRvdyBjb250ZXh0ICovCit9CisKKy8qCisgKiBEby1pdC1hbGwgZnVuY3Rpb24gZm9yICI6OnZpbTo6Y29tbWFuZCIsICIkYnVmIGNvbW1hbmQiIGFuZCAiJHdpbiBjb21tYW5kIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK3RjbGRvZXhjb21tYW5kKGludGVycCwgb2JqYywgb2Jqdiwgb2JqbikKKyAgICBUY2xfSW50ZXJwCSppbnRlcnA7CisgICAgaW50CQlvYmpjOworICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXTsKKyAgICBpbnQJCW9iam47Cit7CisgICAgdGNsX2luZm8Jc2F2ZWluZm87CisgICAgaW50CQllcnIsIGZsYWcsIG5vYmpzOworICAgIGNoYXIJKmFyZzsKKworICAgIG5vYmpzID0gb2JqYyAtIG9iam47CisgICAgaWYgKG5vYmpzIDwgMSB8fCBub2JqcyA+IDIpCisgICAgeworCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCBvYmpuLCBvYmp2LCAiPy1xdWlldD8gZXhDb21tYW5kIik7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisKKyAgICBmbGFnID0gMDsKKyAgICBpZiAobm9ianMgPT0gMikKKyAgICB7CisJYXJnID0gVGNsX0dldFN0cmluZ0Zyb21PYmoob2JqdltvYmpuXSwgTlVMTCk7CisJaWYgKHN0cmNtcChhcmcsICItcXVpZXQiKSA9PSAwKQorCSAgICBmbGFnID0gMTsKKwllbHNlCisJeworCSAgICBUY2xfUmVzZXRSZXN1bHQoaW50ZXJwKTsKKwkgICAgVGNsX0FwcGVuZFJlc3VsdChpbnRlcnAsIF8oInVua25vd24gZmxhZzogIiksIGFyZywgKGNoYXIgKikwKTsKKwkgICAgcmV0dXJuIFRDTF9FUlJPUjsKKwl9CisJKytvYmpuOworICAgIH0KKworICAgIG1lbWNweSgmc2F2ZWluZm8sICZ0Y2xpbmZvLCBzaXplb2YodGNsX2luZm8pKTsKKyAgICB0Y2xpbmZvLmludGVycCA9IE5VTEw7CisgICAgdGNsaW5mby5jdXJ3aW4gPSBOVUxMOworICAgIHRjbGluZm8uY3VyYnVmID0gTlVMTDsKKworICAgIGFyZyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKG9ianZbb2Jqbl0sIE5VTEwpOworICAgIGlmIChmbGFnKQorCSsrZW1zZ19vZmY7CisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKWFyZyk7CisgICAgaWYgKGZsYWcpCisJLS1lbXNnX29mZjsKKyAgICBlcnIgPSB2aW1lcnJvcihpbnRlcnApOworCisgICAgLyogSWYgdGhlIGV4IGNvbW1hbmQgY3JlYXRlZCBhIG5ldyBUY2wgaW50ZXJwcmV0ZXIsIHJlbW92ZSBpdCAqLworICAgIGlmICh0Y2xpbmZvLmludGVycCkKKwl0Y2xkZWx0aGlzaW50ZXJwKCk7CisgICAgbWVtY3B5KCZ0Y2xpbmZvLCAmc2F2ZWluZm8sIHNpemVvZih0Y2xfaW5mbykpOworICAgIHRjbHVwZGF0ZXZhcnMoKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBEby1pdC1hbGwgZnVuY3Rpb24gZm9yICI6OnZpbTo6b3B0aW9uIiwgIiRidWYgb3B0aW9uIiBhbmQgIiR3aW4gb3B0aW9uIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK3RjbHNldG9wdGlvbihpbnRlcnAsIG9iamMsIG9ianYsIG9iam4pCisgICAgVGNsX0ludGVycAkqaW50ZXJwOworICAgIGludAkJb2JqYzsKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W107CisgICAgaW50CQlvYmpuOworeworICAgIGludAkJZXJyLCBub2JqcywgaWR4OworICAgIGNoYXJfdQkqb3B0aW9uOworICAgIGludAkJaXNudW07CisgICAgbG9uZwlsdmFsOworICAgIGNoYXJfdQkqc3ZhbDsKKyAgICBUY2xfT2JqCSpyZXNvYmo7CisKKyAgICBlbnVtIHsgT1BUX09GRiwgT1BUX09OLCBPUFRfVE9HR0xFIH07CisgICAgc3RhdGljIGNoYXIgKm9wdGt3W10gPSB7ICJvZmYiLCAib24iLCAidG9nZ2xlIiwgKGNoYXIgKikwIH07CisKKyAgICBub2JqcyA9IG9iamMgLSBvYmpuOworICAgIGlmIChub2JqcyAhPSAxICYmIG5vYmpzICE9IDIpCisgICAgeworCVRjbF9Xcm9uZ051bUFyZ3MoaW50ZXJwLCBvYmpuLCBvYmp2LCAidmltT3B0aW9uID92YWx1ZT8iKTsKKwlyZXR1cm4gVENMX0VSUk9SOworICAgIH0KKworICAgIG9wdGlvbiA9IChjaGFyX3UgKilUY2xfR2V0U3RyaW5nRnJvbU9iaihvYmp2W29iam5dLCBOVUxMKTsKKyAgICArK29iam47CisgICAgaXNudW0gPSBnZXRfb3B0aW9uX3ZhbHVlKG9wdGlvbiwgJmx2YWwsICZzdmFsLCAwKTsKKyAgICBlcnIgPSBUQ0xfT0s7CisgICAgc3dpdGNoIChpc251bSkKKyAgICB7CisJY2FzZSAwOgorCSAgICBUY2xfU2V0UmVzdWx0KGludGVycCwgKGNoYXIgKilzdmFsLCBUQ0xfVk9MQVRJTEUpOworCSAgICB2aW1fZnJlZShzdmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICByZXNvYmogPSBUY2xfTmV3TG9uZ09iaihsdmFsKTsKKwkgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIHJlc29iaik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJ1bmtub3duIHZpbU9wdGlvbiIpLCBUQ0xfU1RBVElDKTsKKwkgICAgcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKG5vYmpzID09IDIpCisgICAgeworCWlmIChpc251bSkKKwl7CisJICAgIHN2YWwgPSBOVUxMOyAgICAvKiBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCisJICAgIGVyciA9IFRjbF9HZXRJbmRleEZyb21PYmooaW50ZXJwLCBvYmp2W29iam5dLCBvcHRrdywgIiIsIDAsICZpZHgpOworCSAgICBpZiAoZXJyICE9IFRDTF9PSykKKwkgICAgeworCQlUY2xfUmVzZXRSZXN1bHQoaW50ZXJwKTsKKwkJZXJyID0gVGNsX0dldExvbmdGcm9tT2JqKGludGVycCwgb2JqdltvYmpuXSwgJmx2YWwpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgc3dpdGNoIChpZHgpCisJICAgIHsKKwkJY2FzZSBPUFRfT046CisJCSAgICBsdmFsID0gMTsKKwkJICAgIGJyZWFrOworCQljYXNlIE9QVF9PRkY6CisJCSAgICBsdmFsID0gMDsKKwkJICAgIGJyZWFrOworCQljYXNlIE9QVF9UT0dHTEU6CisJCSAgICBsdmFsID0gIWx2YWw7CisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIHN2YWwgPSAoY2hhcl91ICopVGNsX0dldFN0cmluZ0Zyb21PYmoob2JqdltvYmpuXSwgTlVMTCk7CisJaWYgKGVyciA9PSBUQ0xfT0spCisJeworCSAgICBzZXRfb3B0aW9uX3ZhbHVlKG9wdGlvbiwgbHZhbCwgc3ZhbCwgT1BUX0xPQ0FMKTsKKwkgICAgZXJyID0gdmltZXJyb3IoaW50ZXJwKTsKKwl9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBEby1pdC1hbGwgZnVuY3Rpb24gZm9yICI6OnZpbTo6ZXhwciIsICIkYnVmIGV4cHIiIGFuZCAiJHdpbiBleHByIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK3RjbHZpbWV4cHIoaW50ZXJwLCBvYmpjLCBvYmp2LCBvYmpuKQorICAgIFRjbF9JbnRlcnAJKmludGVycDsKKyAgICBpbnQJCW9iamM7CisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworICAgIGludAkJb2JqbjsKK3sKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBjaGFyCSpleHByLCAqc3RyOworI2VuZGlmCisgICAgaW50CQllcnI7CisKKyAgICBpZiAob2JqYyAtIG9iam4gIT0gMSkKKyAgICB7CisJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsIG9iam4sIG9ianYsICJ2aW1FeHByIik7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBleHByID0gVGNsX0dldFN0cmluZ0Zyb21PYmoob2JqdltvYmpuXSwgTlVMTCk7CisgICAgc3RyID0gKGNoYXIgKilldmFsX3RvX3N0cmluZygoY2hhcl91ICopZXhwciwgTlVMTCk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJpbnZhbGlkIGV4cHJlc3Npb24iKSwgVENMX1NUQVRJQyk7CisgICAgZWxzZQorCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBzdHIsIFRDTF9WT0xBVElMRSk7CisgICAgZXJyID0gdmltZXJyb3IoaW50ZXJwKTsKKyNlbHNlCisgICAgVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIpLCBUQ0xfU1RBVElDKTsKKyAgICBlcnIgPSBUQ0xfRVJST1I7CisjZW5kaWYKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgaW50ZXJuYWwgdmltIGVycm9ycy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3ZpbWVycm9yKGludGVycCkKKyAgICBUY2xfSW50ZXJwICppbnRlcnA7Cit7CisgICAgaWYgKGdvdF9pbnQpCisgICAgeworCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJrZXlib2FyZCBpbnRlcnJ1cHQiKSwgVENMX1NUQVRJQyk7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZSBpZiAoZGlkX2Vtc2cpCisgICAgeworCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJ2aW0gZXJyb3IiKSwgVENMX1NUQVRJQyk7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFRDTF9PSzsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgcmVmZXJlbmNlIGxpc3RzOgorICogICBkZWxyZWYoKSAtIGNhbGxiYWNrIGZvciBUY2wncyBEZWxldGVDb21tYW5kCisgKiAgIHRjbGdldHJlZigpIC0gZmluZC9jcmVhdGUgVGNsIGNvbW1hbmQgZm9yIGEgd2luX1QqIG9yIGJ1Zl9UKiBvYmplY3QKKyAqICAgdGNsZ2V0d2luZG93KCkgLSB3aW5kb3cgZnJvbnRlbmQgZm9yIHRjbGdldHJlZigpCisgKiAgIHRjbGdldGJ1ZmZlcigpIC0gYnVmZmVyIGZyb250ZW5kIGZvciB0Y2xnZXRyZWYoKQorICogICB0Y2xzZXRkZWxjbWQoKSAtIGFkZCBUY2wgY2FsbGJhY2sgY29tbWFuZCB0byBhIHZpbSBvYmplY3QKKyAqLworICAgIHN0YXRpYyB2b2lkCitkZWxyZWYoY3JlZikKKyAgICBDbGllbnREYXRhIGNyZWY7Cit7CisgICAgc3RydWN0IHJlZiAqcmVmID0gKHN0cnVjdCByZWYgKiljcmVmOworCisgICAgaWYgKHJlZi0+ZGVsY21kKQorICAgIHsKKwlUY2xfRGVjclJlZkNvdW50KHJlZi0+ZGVsY21kKTsKKwlyZWYtPmRlbGNtZCA9IE5VTEw7CisgICAgfQorICAgIHJlZi0+aW50ZXJwID0gTlVMTDsKK30KKworICAgIHN0YXRpYyBjaGFyICoKK3RjbGdldHJlZihpbnRlcnAsIHJlZnN0YXJ0UCwgcHJlZml4LCB2aW1vYmosIHByb2MpCisgICAgVGNsX0ludGVycAkqaW50ZXJwOworICAgIHZvaWQJKipyZWZzdGFydFA7CS8qIHB0ciB0byB0Y2xfcmVmIG1lbWJlciBvZiB3aW5fVC9idWZfVCBzdHJ1Y3QgKi8KKyAgICBjaGFyCSpwcmVmaXg7CS8qICJ3aW4iIG9yICJidWYiICovCisgICAgdm9pZAkqdmltb2JqOwkvKiB3aW5fVCogb3IgYnVmX1QqICovCisgICAgVGNsX09iakNtZFByb2MgKnByb2M7CS8qIHdpbnNlbGZjbWQgb3IgYnVmc2VsZmNtZCAqLworeworICAgIHN0cnVjdCByZWYgKnJlZiwgKnVudXNlZCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgbmFtZVtWQVJOQU1FX1NJWkVdOworICAgIFRjbF9Db21tYW5kIGNtZDsKKworICAgIHJlZiA9IChzdHJ1Y3QgcmVmICopKCpyZWZzdGFydFApOworICAgIGlmIChyZWYgPT0gJnJlZnNkZWxldGVkKQorICAgIHsKKwlUY2xfU2V0UmVzdWx0KGludGVycCwgXygiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIiksIFRDTF9TVEFUSUMpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHdoaWxlIChyZWYgIT0gTlVMTCkKKyAgICB7CisJaWYgKHJlZi0+aW50ZXJwID09IGludGVycCkKKwkgICAgYnJlYWs7CisJaWYgKHJlZi0+aW50ZXJwID09IE5VTEwpCisJICAgIHVudXNlZCA9IHJlZjsKKwlyZWYgPSByZWYtPm5leHQ7CisgICAgfQorCisgICAgaWYgKHJlZikKKwlzcHJpbnRmKG5hbWUsICI6OnZpbTo6JXMiLCBUY2xfR2V0Q29tbWFuZE5hbWUoaW50ZXJwLCByZWYtPmNtZCkpOworICAgIGVsc2UKKyAgICB7CisJaWYgKHVudXNlZCkKKwkgICAgcmVmID0gdW51c2VkOworCWVsc2UKKwl7CisJICAgIHJlZiA9IChzdHJ1Y3QgcmVmICopVGNsX0FsbG9jKHNpemVvZihzdHJ1Y3QgcmVmKSk7CisjaWYgMAkvKiBUY2xfQWxsb2MgZWl0aGVyIHN1Y2NlZWRzIG9yIGRvZXMgbm90IHJldHVybiAqLworCSAgICBpZiAoIXJlZikKKwkgICAgeworCQlUY2xfU2V0UmVzdWx0KGludGVycCwgIm91dCBvZiBtZW1vcnkiLCBUQ0xfU1RBVElDKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKyNlbmRpZgorCSAgICByZWYtPmludGVycCA9IE5VTEw7CisJICAgIHJlZi0+bmV4dCA9IChzdHJ1Y3QgcmVmICopKCpyZWZzdGFydFApOworCSAgICAoKnJlZnN0YXJ0UCkgPSAodm9pZCAqKXJlZjsKKwl9CisKKwkvKiBUaGlzIG1pZ2h0IGJyZWFrIG9uIHNvbWUgZXhvdGljIHN5c3RlbXMuLi4gKi8KKwlzcHJpbnRmKG5hbWUsICI6OnZpbTo6JXNfJWx4IiwgcHJlZml4LCAodW5zaWduZWQgbG9uZyl2aW1vYmopOworCWNtZCA9IFRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgbmFtZSwgcHJvYywKKwkgICAgKENsaWVudERhdGEpcmVmLCAoVGNsX0NtZERlbGV0ZVByb2MgKilkZWxyZWYpOworCWlmICghY21kKQorCSAgICByZXR1cm4gTlVMTDsKKworCXJlZi0+aW50ZXJwID0gaW50ZXJwOworCXJlZi0+Y21kID0gY21kOworCXJlZi0+ZGVsY21kID0gTlVMTDsKKwlyZWYtPnZpbW9iaiA9IHZpbW9iajsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKyAgICBzdGF0aWMgY2hhciAqCit0Y2xnZXR3aW5kb3coaW50ZXJwLCB3aW4pCisgICAgVGNsX0ludGVycAkqaW50ZXJwOworICAgIHdpbl9UCSp3aW47Cit7CisgICAgcmV0dXJuIHRjbGdldHJlZihpbnRlcnAsICYod2luLT50Y2xfcmVmKSwgIndpbiIsICh2b2lkICopd2luLCB3aW5zZWxmY21kKTsKK30KKworICAgIHN0YXRpYyBjaGFyICoKK3RjbGdldGJ1ZmZlcihpbnRlcnAsIGJ1ZikKKyAgICBUY2xfSW50ZXJwCSppbnRlcnA7CisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICByZXR1cm4gdGNsZ2V0cmVmKGludGVycCwgJihidWYtPnRjbF9yZWYpLCAiYnVmIiwgKHZvaWQgKilidWYsIGJ1ZnNlbGZjbWQpOworfQorCisgICAgc3RhdGljIGludAordGNsc2V0ZGVsY21kKGludGVycCwgcmVmbGlzdCwgdmltb2JqLCBkZWxjbWQpCisgICAgVGNsX0ludGVycAkqaW50ZXJwOworICAgIHN0cnVjdCByZWYJKnJlZmxpc3Q7CisgICAgdm9pZAkqdmltb2JqOworICAgIFRjbF9PYmoJKmRlbGNtZDsKK3sKKyAgICBpZiAocmVmbGlzdCA9PSAmcmVmc2RlbGV0ZWQpCisgICAgeworCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBfKCJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiKSwgVENMX1NUQVRJQyk7CisJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CisKKyAgICB3aGlsZSAocmVmbGlzdCAhPSBOVUxMKQorICAgIHsKKwlpZiAocmVmbGlzdC0+aW50ZXJwID09IGludGVycCAmJiByZWZsaXN0LT52aW1vYmogPT0gdmltb2JqKQorCXsKKwkgICAgaWYgKHJlZmxpc3QtPmRlbGNtZCkKKwkJVGNsX0RlY3JSZWZDb3VudChyZWZsaXN0LT5kZWxjbWQpOworCSAgICBUY2xfSW5jclJlZkNvdW50KGRlbGNtZCk7CisJICAgIHJlZmxpc3QtPmRlbGNtZCA9IGRlbGNtZDsKKwkgICAgcmV0dXJuIFRDTF9PSzsKKwl9CisJcmVmbGlzdCA9IHJlZmxpc3QtPm5leHQ7CisgICAgfQorICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/ICovCisgICAgRU1TRyhfKCJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciKSk7CisgICAgVGNsX1NldFJlc3VsdChpbnRlcnAsIF8oImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiKSwgVENMX1NUQVRJQyk7CisgICAgcmV0dXJuIFRDTF9FUlJPUjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEkvTyBDaGFubmVsCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50CitjaGFubmVsX2Nsb3NlKGluc3RhbmNlLCBpbnRlcnApCisgICAgQ2xpZW50RGF0YQlpbnN0YW5jZTsKKyAgICBUY2xfSW50ZXJwCSppbnRlcnA7Cit7CisgICAgaW50CQllcnIgPSAwOworCisgICAgLyogY3VycmVudGx5IGRvZXMgbm90aGluZyAqLworCisgICAgaWYgKGluc3RhbmNlICE9IFZJTU9VVCAmJiBpbnN0YW5jZSAhPSBWSU1FUlIpCisgICAgeworCVRjbF9TZXRFcnJubyhFQkFERik7CisJZXJyID0gRUJBREY7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAorY2hhbm5lbF9pbnB1dChpbnN0YW5jZSwgYnVmLCBidWZzaXosIGVycnB0cikKKyAgICBDbGllbnREYXRhCWluc3RhbmNlOworICAgIGNoYXIJKmJ1ZjsKKyAgICBpbnQJCWJ1ZnNpejsKKyAgICBpbnQJCSplcnJwdHI7Cit7CisKKyAgICAvKiBpbnB1dCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAqLworCisgICAgVGNsX1NldEVycm5vKEVJTlZBTCk7CisgICAgaWYgKGVycnB0cikKKwkqZXJycHRyID0gRUlOVkFMOworICAgIHJldHVybiAtMTsKK30KKworICAgIHN0YXRpYyBpbnQKK2NoYW5uZWxfb3V0cHV0KGluc3RhbmNlLCBidWYsIGJ1ZnNpeiwgZXJycHRyKQorICAgIENsaWVudERhdGEJaW5zdGFuY2U7CisgICAgY2hhcgkqYnVmOworICAgIGludAkJYnVmc2l6OworICAgIGludAkJKmVycnB0cjsKK3sKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCXJlc3VsdDsKKworICAgIC8qIFRoZSBidWZmZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgMC10ZXJtaW5hdGVkLCBhbmQgd2UgZG9uJ3QgaWYKKyAgICAgKiB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byBhZGQgYSAnXDAnLiAgU28gd2UgaGF2ZSB0byBjcmVhdGUgYSBjb3B5CisgICAgICogb2YgdGhlIGJ1ZmZlci4uLgorICAgICAqLworICAgIHN0ciA9IHZpbV9zdHJuc2F2ZSgoY2hhcl91ICopYnVmLCBidWZzaXopOworICAgIGlmICghc3RyKQorICAgIHsKKwlUY2xfU2V0RXJybm8oRU5PTUVNKTsKKwlpZiAoZXJycHRyKQorCSAgICAqZXJycHRyID0gRU5PTUVNOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBidWZzaXo7CisgICAgaWYgKGluc3RhbmNlID09IFZJTU9VVCkKKwl0Y2xtc2coKGNoYXIgKilzdHIpOworICAgIGVsc2UKKyAgICBpZiAoaW5zdGFuY2UgPT0gVklNRVJSKQorCXRjbGVycm1zZygoY2hhciAqKXN0cik7CisgICAgZWxzZQorICAgIHsKKwlUY2xfU2V0RXJybm8oRUJBREYpOworCWlmIChlcnJwdHIpCisJICAgICplcnJwdHIgPSBFQkFERjsKKwlyZXN1bHQgPSAtMTsKKyAgICB9CisgICAgdmltX2ZyZWUoc3RyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitjaGFubmVsX3dhdGNoKGluc3RhbmNlLCBtYXNrKQorICAgIENsaWVudERhdGEJaW5zdGFuY2U7CisgICAgaW50CQltYXNrOworeworICAgIFRjbF9TZXRFcnJubyhFSU5WQUwpOworfQorCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK2NoYW5uZWxfZ2V0aGFuZGxlKGluc3RhbmNlLCBkaXJlY3Rpb24sIGhhbmRsZXB0cikKKyAgICBDbGllbnREYXRhCWluc3RhbmNlOworICAgIGludAkJZGlyZWN0aW9uOworICAgIENsaWVudERhdGEJKmhhbmRsZXB0cjsKK3sKKyAgICBUY2xfU2V0RXJybm8oRUlOVkFMKTsKKyAgICByZXR1cm4gRUlOVkFMOworfQorCisKK3N0YXRpYyBUY2xfQ2hhbm5lbFR5cGUgY2hhbm5lbF90eXBlID0KK3sKKyAgICAidmltbWVzc2FnZSIsCisgICAgTlVMTCwgICAvKiBibG9ja21vZGUgKi8KKyAgICBjaGFubmVsX2Nsb3NlLAorICAgIGNoYW5uZWxfaW5wdXQsCisgICAgY2hhbm5lbF9vdXRwdXQsCisgICAgTlVMTCwgICAvKiBzZWVrICovCisgICAgTlVMTCwgICAvKiBzZXQgb3B0aW9uICovCisgICAgTlVMTCwgICAvKiBnZXQgb3B0aW9uICovCisgICAgY2hhbm5lbF93YXRjaCwKKyAgICBjaGFubmVsX2dldGhhbmRsZQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgSW50ZXJmYWNlIHRvIHZpbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGF0aWMgdm9pZAordGNsdXBkYXRldmFycygpCit7CisgICAgY2hhciB2YXJuYW1lW1ZBUk5BTUVfU0laRV07CS8qIG11c3QgYmUgd3JpdGVhYmxlICovCisgICAgY2hhciAqbmFtZTsKKworICAgIHN0cmNweSh2YXJuYW1lLCBWQVJfUkFOR0UxKTsKKyAgICBUY2xfVXBkYXRlTGlua2VkVmFyKHRjbGluZm8uaW50ZXJwLCB2YXJuYW1lKTsKKyAgICBzdHJjcHkodmFybmFtZSwgVkFSX1JBTkdFMik7CisgICAgVGNsX1VwZGF0ZUxpbmtlZFZhcih0Y2xpbmZvLmludGVycCwgdmFybmFtZSk7CisgICAgc3RyY3B5KHZhcm5hbWUsIFZBUl9SQU5HRTMpOworICAgIFRjbF9VcGRhdGVMaW5rZWRWYXIodGNsaW5mby5pbnRlcnAsIHZhcm5hbWUpOworCisgICAgc3RyY3B5KHZhcm5hbWUsIFZBUl9MQkFTRSk7CisgICAgVGNsX1VwZGF0ZUxpbmtlZFZhcih0Y2xpbmZvLmludGVycCwgdmFybmFtZSk7CisKKyAgICBuYW1lID0gdGNsZ2V0YnVmZmVyKHRjbGluZm8uaW50ZXJwLCBjdXJidWYpOworICAgIHN0cmNweSh0Y2xpbmZvLmN1cmJ1ZiwgbmFtZSk7CisgICAgc3RyY3B5KHZhcm5hbWUsIFZBUl9DVVJCVUYpOworICAgIFRjbF9VcGRhdGVMaW5rZWRWYXIodGNsaW5mby5pbnRlcnAsIHZhcm5hbWUpOworCisgICAgbmFtZSA9IHRjbGdldHdpbmRvdyh0Y2xpbmZvLmludGVycCwgY3Vyd2luKTsKKyAgICBzdHJjcHkodGNsaW5mby5jdXJ3aW4sIG5hbWUpOworICAgIHN0cmNweSh2YXJuYW1lLCBWQVJfQ1VSV0lOKTsKKyAgICBUY2xfVXBkYXRlTGlua2VkVmFyKHRjbGluZm8uaW50ZXJwLCB2YXJuYW1lKTsKK30KKworCisgICAgc3RhdGljIGludAordGNsaW5pdChlYXApCisgICAgZXhhcmdfVCAqZWFwOworeworICAgIGNoYXIgdmFybmFtZVtWQVJOQU1FX1NJWkVdOwkvKiBUY2xfTGlua1ZhciByZXF1aXJlcyB3cml0ZWFibGUgdmFybmFtZSAqLworICAgIGNoYXIgKm5hbWU7CisKKyNpZmRlZiBEWU5BTUlDX1RDTAorICAgIGlmICghdGNsX2VuYWJsZWQoVFJVRSkpCisgICAgeworCUVNU0coXygiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIikpOworCXJldHVybiBGQUlMOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCF0Y2xpbmZvLmludGVycCkKKyAgICB7CisJVGNsX0ludGVycCAqaW50ZXJwOworCXN0YXRpYyBUY2xfQ2hhbm5lbCBjaDEsIGNoMjsKKworCS8qIHJlcGxhY2Ugc3Rkb3V0IGFuZCBzdGRlcnIgKi8KKwljaDEgPSBUY2xfQ3JlYXRlQ2hhbm5lbCgmY2hhbm5lbF90eXBlLCAidmltb3V0IiwgVklNT1VULCBUQ0xfV1JJVEFCTEUpOworCWNoMiA9IFRjbF9DcmVhdGVDaGFubmVsKCZjaGFubmVsX3R5cGUsICJ2aW1lcnIiLCBWSU1FUlIsIFRDTF9XUklUQUJMRSk7CisJVGNsX1NldFN0ZENoYW5uZWwoY2gxLCBUQ0xfU1RET1VUKTsKKwlUY2xfU2V0U3RkQ2hhbm5lbChjaDIsIFRDTF9TVERFUlIpOworCisJaW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOworCVRjbF9QcmVzZXJ2ZShpbnRlcnApOworCWlmIChUY2xfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikKKwl7CisJICAgIFRjbF9SZWxlYXNlKGludGVycCk7CisJICAgIFRjbF9EZWxldGVJbnRlcnAoaW50ZXJwKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorI2lmIDAKKwkvKiBWSU0gc3VyZSBpcyBpbnRlcmFjdGl2ZSAqLworCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOworI2VuZGlmCisKKwlUY2xfU2V0Q2hhbm5lbE9wdGlvbihpbnRlcnAsIGNoMSwgIi1idWZmZXJpbmciLCAibGluZSIpOworCVRjbF9TZXRDaGFubmVsT3B0aW9uKGludGVycCwgY2gyLCAiLWJ1ZmZlcmluZyIsICJsaW5lIik7CisKKwkvKiByZXBsYWNlIHNvbWUgc3RhbmRhcmQgVGNsIGNvbW1hbmRzICovCisJVGNsX0RlbGV0ZUNvbW1hbmQoaW50ZXJwLCAiZXhpdCIpOworCVRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgImV4aXQiLCBleGl0Y21kLAorCSAgICAoQ2xpZW50RGF0YSlOVUxMLCAoVGNsX0NtZERlbGV0ZVByb2MgKilOVUxMKTsKKwlUY2xfRGVsZXRlQ29tbWFuZChpbnRlcnAsICJjYXRjaCIpOworCVRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgImNhdGNoIiwgY2F0Y2hjbWQsCisJICAgIChDbGllbnREYXRhKU5VTEwsIChUY2xfQ21kRGVsZXRlUHJvYyAqKU5VTEwpOworCisJLyogbmV3IGNvbW1hbmRzLCBpbiA6OnZpbSBuYW1lc3BhY2UgKi8KKwlUY2xfQ3JlYXRlT2JqQ29tbWFuZChpbnRlcnAsICI6OnZpbTo6YnVmZmVyIiwgYnVmZmVyY21kLAorCSAgICAoQ2xpZW50RGF0YSlOVUxMLCAoVGNsX0NtZERlbGV0ZVByb2MgKilOVUxMKTsKKwlUY2xfQ3JlYXRlT2JqQ29tbWFuZChpbnRlcnAsICI6OnZpbTo6d2luZG93Iiwgd2luZG93Y21kLAorCSAgIChDbGllbnREYXRhKU5VTEwsIChUY2xfQ21kRGVsZXRlUHJvYyAqKU5VTEwpOworCVRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgIjo6dmltOjpjb21tYW5kIiwgY29tbWFuZGNtZCwKKwkgICAoQ2xpZW50RGF0YSlOVUxMLCAoVGNsX0NtZERlbGV0ZVByb2MgKilOVUxMKTsKKwlUY2xfQ3JlYXRlT2JqQ29tbWFuZChpbnRlcnAsICI6OnZpbTo6YmVlcCIsIGJlZXBjbWQsCisJICAgKENsaWVudERhdGEpTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopTlVMTCk7CisJVGNsX0NyZWF0ZU9iakNvbW1hbmQoaW50ZXJwLCAiOjp2aW06Om9wdGlvbiIsIG9wdGlvbmNtZCwKKwkgICAoQ2xpZW50RGF0YSlOVUxMLCAoVGNsX0NtZERlbGV0ZVByb2MgKilOVUxMKTsKKwlUY2xfQ3JlYXRlT2JqQ29tbWFuZChpbnRlcnAsICI6OnZpbTo6ZXhwciIsIGV4cHJjbWQsCisJICAgKENsaWVudERhdGEpTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopTlVMTCk7CisKKwkvKiAibGJhc2UiIHZhcmlhYmxlICovCisJdGNsaW5mby5sYmFzZSA9IDE7CisJc3RyY3B5KHZhcm5hbWUsIFZBUl9MQkFTRSk7CisJVGNsX0xpbmtWYXIoaW50ZXJwLCB2YXJuYW1lLCAoY2hhciAqKSZ0Y2xpbmZvLmxiYXNlLCBUQ0xfTElOS19JTlQpOworCisJLyogInJhbmdlIiB2YXJpYWJsZSAqLworCXRjbGluZm8ucmFuZ2Vfc3RhcnQgPSBlYXAtPmxpbmUxOworCXN0cmNweSh2YXJuYW1lLCBWQVJfUkFOR0UxKTsKKwlUY2xfTGlua1ZhcihpbnRlcnAsIHZhcm5hbWUsIChjaGFyICopJnRjbGluZm8ucmFuZ2Vfc3RhcnQsIFRDTF9MSU5LX0lOVHxUQ0xfTElOS19SRUFEX09OTFkpOworCXN0cmNweSh2YXJuYW1lLCBWQVJfUkFOR0UyKTsKKwlUY2xfTGlua1ZhcihpbnRlcnAsIHZhcm5hbWUsIChjaGFyICopJnRjbGluZm8ucmFuZ2Vfc3RhcnQsIFRDTF9MSU5LX0lOVHxUQ0xfTElOS19SRUFEX09OTFkpOworCXRjbGluZm8ucmFuZ2VfZW5kICAgPSBlYXAtPmxpbmUyOworCXN0cmNweSh2YXJuYW1lLCBWQVJfUkFOR0UzKTsKKwlUY2xfTGlua1ZhcihpbnRlcnAsIHZhcm5hbWUsIChjaGFyICopJnRjbGluZm8ucmFuZ2VfZW5kLCBUQ0xfTElOS19JTlR8VENMX0xJTktfUkVBRF9PTkxZKTsKKworCS8qICJjdXJyZW50IiB2YXJpYWJsZSAqLworCXRjbGluZm8uY3VyYnVmID0gVGNsX0FsbG9jKFZBUk5BTUVfU0laRSk7CisJdGNsaW5mby5jdXJ3aW4gPSBUY2xfQWxsb2MoVkFSTkFNRV9TSVpFKTsKKwluYW1lID0gdGNsZ2V0YnVmZmVyKGludGVycCwgY3VyYnVmKTsKKwlzdHJjcHkodGNsaW5mby5jdXJidWYsIG5hbWUpOworCXN0cmNweSh2YXJuYW1lLCBWQVJfQ1VSQlVGKTsKKwlUY2xfTGlua1ZhcihpbnRlcnAsIHZhcm5hbWUsIChjaGFyICopJnRjbGluZm8uY3VyYnVmLCBUQ0xfTElOS19TVFJJTkd8VENMX0xJTktfUkVBRF9PTkxZKTsKKwluYW1lID0gdGNsZ2V0d2luZG93KGludGVycCwgY3Vyd2luKTsKKwlzdHJjcHkodGNsaW5mby5jdXJ3aW4sIG5hbWUpOworCXN0cmNweSh2YXJuYW1lLCBWQVJfQ1VSV0lOKTsKKwlUY2xfTGlua1ZhcihpbnRlcnAsIHZhcm5hbWUsIChjaGFyICopJnRjbGluZm8uY3Vyd2luLCBUQ0xfTElOS19TVFJJTkd8VENMX0xJTktfUkVBRF9PTkxZKTsKKworCXRjbGluZm8uaW50ZXJwID0gaW50ZXJwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIEludGVycHJldGVyIGFscmVhZHkgZXhpc3RzLCBqdXN0IHVwZGF0ZSB2YXJpYWJsZXMgKi8KKwl0Y2xpbmZvLnJhbmdlX3N0YXJ0ID0gcm93MnRjbChlYXAtPmxpbmUxKTsKKwl0Y2xpbmZvLnJhbmdlX2VuZCA9IHJvdzJ0Y2woZWFwLT5saW5lMik7CisJdGNsdXBkYXRldmFycygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordGNsZXJybXNnKHRleHQpCisgICAgY2hhciAqdGV4dDsKK3sKKyAgICBjaGFyICpuZXh0OworCisgICAgd2hpbGUgKChuZXh0PXN0cmNocih0ZXh0LCAnXG4nKSkpCisgICAgeworCSpuZXh0KysgPSAnXDAnOworCUVNU0codGV4dCk7CisJdGV4dCA9IG5leHQ7CisgICAgfQorICAgIGlmICgqdGV4dCkKKwlFTVNHKHRleHQpOworfQorCisgICAgc3RhdGljIHZvaWQKK3RjbG1zZyh0ZXh0KQorICAgIGNoYXIgKnRleHQ7Cit7CisgICAgY2hhciAqbmV4dDsKKworICAgIHdoaWxlICgobmV4dD1zdHJjaHIodGV4dCwgJ1xuJykpKQorICAgIHsKKwkqbmV4dCsrID0gJ1wwJzsKKwlNU0codGV4dCk7CisJdGV4dCA9IG5leHQ7CisgICAgfQorICAgIGlmICgqdGV4dCkKKwlNU0codGV4dCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordGNsZGVsdGhpc2ludGVycCgpCit7CisgICAgaWYgKCFUY2xfSW50ZXJwRGVsZXRlZCh0Y2xpbmZvLmludGVycCkpCisJVGNsX0RlbGV0ZUludGVycCh0Y2xpbmZvLmludGVycCk7CisgICAgVGNsX1JlbGVhc2UodGNsaW5mby5pbnRlcnApOworICAgIC8qIFRoZSBpbnRlcnByZXRlciBpcyBub3cgZ2V0cyBkZWxldGVkLiAgQWxsIHJlZ2lzdGVyZWQgY29tbWFuZHMgKGVzcC4KKyAgICAgKiB3aW5kb3cgYW5kIGJ1ZmZlciBjb21tYW5kcykgYXJlIGRlbGV0ZWQsIHRyaWdnZXJpbmcgdGhlaXIgZGVsZXRpb24KKyAgICAgKiBjYWxsYmFjaywgd2hpY2ggZGVsZXRlcyBhbGwgcmVmcyBwb2ludGluZyB0byB0aGlzIGludGVycHJldGVyLgorICAgICAqIFdlIGNvdWxkIGdhcmJhZ2UtY29sbGVjdCB0aGUgdW51c2VkIHJlZiBzdHJ1Y3RzIGluIGFsbCB3aW5kb3dzIGFuZAorICAgICAqIGJ1ZmZlcnMsIGJ1dCB1bmxlc3MgdGhlIHVzZXIgY3JlYXRlcyBodW5kcmVkcyBvZiBzdWItaW50ZXJwcmV0ZXJzCisgICAgICogYWxsIHJlZmVyaW5nIHRvIGxvdHMgb2Ygd2luZG93cyBhbmQgYnVmZmVycywgdGhpcyBpcyBoYXJkbHkgd29ydGgKKyAgICAgKiB0aGUgZWZmb3J0LiAgVW51c2VkIHJlZnMgYXJlIHJlY3ljbGVkIGJ5IG90aGVyIGludGVycHJldGVycywgYW5kCisgICAgICogYWxsIHJlZnMgYXJlIGZyZWUnZCB3aGVuIHRoZSB3aW5kb3cvYnVmZmVyIGdldHMgY2xvc2VkIGJ5IHZpbS4KKyAgICAgKi8KKworICAgIHRjbGluZm8uaW50ZXJwID0gTlVMTDsKKyAgICBUY2xfRnJlZSh0Y2xpbmZvLmN1cmJ1Zik7CisgICAgVGNsX0ZyZWUodGNsaW5mby5jdXJ3aW4pOworICAgIHRjbGluZm8uY3VyYnVmID0gdGNsaW5mby5jdXJ3aW4gPSBOVUxMOworfQorCisgICAgc3RhdGljIGludAordGNsZXhpdChlcnJvcikKKyAgICBpbnQgZXJyb3I7Cit7CisgICAgaW50IG5ld2VyciA9IE9LOworCisgICAgaWYgKGVycm9yID09IFRDTF9FWElUICkKKyAgICB7CisJaW50IHJldHZhbDsKKwljaGFyIGJ1ZlszMl07CisJVGNsX09iaiAqcm9iajsKKworCXJvYmogPSBUY2xfR2V0T2JqUmVzdWx0KHRjbGluZm8uaW50ZXJwKTsKKwlpZiggVGNsX0dldEludEZyb21PYmoodGNsaW5mby5pbnRlcnAsIHJvYmosICZyZXR2YWwpICE9IFRDTF9PSyApCisJeworCSAgICBFTVNHKF8oIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIikpOworCSAgICBuZXdlcnIgPSBGQUlMOworCX0KKwllbHNlCisJeworCSAgICBzcHJpbnRmKGJ1ZiwgIkU1NzI6IGV4aXQgY29kZSAlZCIsIHJldHZhbCk7CisJICAgIHRjbGVycm1zZyhidWYpOworCSAgICBpZiAocmV0dmFsID09IDAgKQorCSAgICB7CisJCWRpZF9lbXNnID0gMDsKKwkJbmV3ZXJyID0gT0s7CisJICAgIH0KKwkgICAgZWxzZQorCQluZXdlcnIgPSBGQUlMOworCX0KKworCXRjbGRlbHRoaXNpbnRlcnAoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljaGFyICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBUY2xfR2V0U3RyaW5nUmVzdWx0KHRjbGluZm8uaW50ZXJwKTsKKwlpZiAoZXJyb3IgPT0gVENMX09LKQorCXsKKwkgICAgdGNsbXNnKHJlc3VsdCk7CisJICAgIG5ld2VyciA9IE9LOworCX0KKwllbHNlCisJeworCSAgICB0Y2xlcnJtc2cocmVzdWx0KTsKKwkgICAgbmV3ZXJyID0gRkFJTDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIG5ld2VycjsKK30KKworLyoKKyAqICI6dGNsIgorICovCisgICAgdm9pZAorZXhfdGNsKGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY2hhcl91CSpzY3JpcHQ7CisgICAgaW50CQllcnI7CisKKyAgICBzY3JpcHQgPSBzY3JpcHRfZ2V0KGVhcCwgZWFwLT5hcmcpOworICAgIGlmICghZWFwLT5za2lwKQorICAgIHsKKwllcnIgPSB0Y2xpbml0KGVhcCk7CisJaWYgKGVyciA9PSBPSykKKwl7CisJICAgIFRjbF9BbGxvd0V4Y2VwdGlvbnModGNsaW5mby5pbnRlcnApOworCSAgICBpZiAoc2NyaXB0ID09IE5VTEwpCisJCWVyciA9IFRjbF9FdmFsKHRjbGluZm8uaW50ZXJwLCAoY2hhciAqKWVhcC0+YXJnKTsKKwkgICAgZWxzZQorCQllcnIgPSBUY2xfRXZhbCh0Y2xpbmZvLmludGVycCwgKGNoYXIgKilzY3JpcHQpOworCSAgICBlcnIgPSB0Y2xleGl0KGVycik7CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShzY3JpcHQpOworfQorCisvKgorICogIjp0Y2xmaWxlIgorICovCisgICAgdm9pZAorZXhfdGNsZmlsZShlYXApCisgICAgZXhhcmdfVCAqZWFwOworeworICAgIGNoYXIgKmZpbGUgPSAoY2hhciAqKWVhcC0+YXJnOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB0Y2xpbml0KGVhcCk7CisgICAgaWYgKGVyciA9PSBPSykKKyAgICB7CisJVGNsX0FsbG93RXhjZXB0aW9ucyh0Y2xpbmZvLmludGVycCk7CisJZXJyID0gVGNsX0V2YWxGaWxlKHRjbGluZm8uaW50ZXJwLCBmaWxlKTsKKwllcnIgPSB0Y2xleGl0KGVycik7CisgICAgfQorfQorCisvKgorICogIjp0Y2xkbyIKKyAqLworICAgIHZvaWQKK2V4X3RjbGRvKGVhcCkKKyAgICBleGFyZ19UICplYXA7Cit7CisgICAgY2hhcgkqc2NyaXB0LCAqbGluZTsKKyAgICBpbnQJCWVyciwgcnMsIHJlLCBsbnVtOworICAgIGNoYXIJdmFyX2xudW1bVkFSTkFNRV9TSVpFXTsgLyogbXVzdCBiZSB3cml0ZWFibGUgbWVtb3J5ICovCisgICAgY2hhcgl2YXJfbGluZVtWQVJOQU1FX1NJWkVdOworICAgIGxpbmVucl9UCWZpcnN0X2xpbmUgPSAwOworICAgIGxpbmVucl9UCWxhc3RfbGluZSA9IDA7CisKKyAgICBycyA9IGVhcC0+bGluZTE7CisgICAgcmUgPSBlYXAtPmxpbmUyOworICAgIHNjcmlwdCA9IChjaGFyICopZWFwLT5hcmc7CisgICAgc3RyY3B5KHZhcl9sbnVtLCBWQVJfQ1VSTE5VTSk7CisgICAgc3RyY3B5KHZhcl9saW5lLCBWQVJfQ1VSTElORSk7CisKKyAgICBlcnIgPSB0Y2xpbml0KGVhcCk7CisgICAgaWYgKGVyciAhPSBPSykKKwlyZXR1cm47CisKKyAgICBsbnVtID0gcm93MnRjbChycyk7CisgICAgVGNsX0xpbmtWYXIodGNsaW5mby5pbnRlcnAsIHZhcl9sbnVtLCAoY2hhciAqKSZsbnVtLCBUQ0xfTElOS19JTlR8VENMX0xJTktfUkVBRF9PTkxZKTsKKyAgICBlcnIgPSBUQ0xfT0s7CisgICAgaWYgKHVfc2F2ZSgobGluZW5yX1QpKHJzLTEpLCAobGluZW5yX1QpKHJlKzEpKSAhPSBPSykKKyAgICB7CisJVGNsX1NldFJlc3VsdCh0Y2xpbmZvLmludGVycCwgXygiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIpLCBUQ0xfU1RBVElDKTsKKwllcnIgPSBUQ0xfRVJST1I7CisgICAgfQorICAgIHdoaWxlIChlcnIgPT0gVENMX09LICAmJiAgcnMgPD0gcmUpCisgICAgeworCWxpbmUgPSAoY2hhciAqKW1sX2dldF9idWYoY3VyYnVmLCAobGluZW5yX1QpcnMsIEZBTFNFKTsKKwlpZiAoIWxpbmUpCisJeworCSAgICBUY2xfU2V0UmVzdWx0KHRjbGluZm8uaW50ZXJwLCBfKCJjYW5ub3QgZ2V0IGxpbmUiKSwgVENMX1NUQVRJQyk7CisJICAgIGVyciA9IFRDTF9FUlJPUjsKKwkgICAgYnJlYWs7CisJfQorCVRjbF9TZXRWYXIodGNsaW5mby5pbnRlcnAsIHZhcl9saW5lLCBsaW5lLCAwKTsKKwlUY2xfQWxsb3dFeGNlcHRpb25zKHRjbGluZm8uaW50ZXJwKTsKKwllcnIgPSBUY2xfRXZhbCh0Y2xpbmZvLmludGVycCwgc2NyaXB0KTsKKwlpZiAoZXJyICE9IFRDTF9PSykKKwkgICAgYnJlYWs7CisJbGluZSA9IFRjbF9HZXRWYXIodGNsaW5mby5pbnRlcnAsIHZhcl9saW5lLCAwKTsKKwlpZiAobGluZSkKKwl7CisJICAgIGlmIChtbF9yZXBsYWNlKChsaW5lbnJfVClycywgKGNoYXJfdSAqKWxpbmUsIFRSVUUpICE9IE9LKQorCSAgICB7CisJCVRjbF9TZXRSZXN1bHQodGNsaW5mby5pbnRlcnAsIF8oImNhbm5vdCByZXBsYWNlIGxpbmUiKSwgVENMX1NUQVRJQyk7CisJCWVyciA9IFRDTF9FUlJPUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGZpcnN0X2xpbmUgPT0gMCkKKwkJZmlyc3RfbGluZSA9IHJzOworCSAgICBsYXN0X2xpbmUgPSByczsKKwl9CisJKytyczsKKwkrK2xudW07CisJVGNsX1VwZGF0ZUxpbmtlZFZhcih0Y2xpbmZvLmludGVycCwgdmFyX2xudW0pOworICAgIH0KKyAgICBpZiAoZmlyc3RfbGluZSkKKwljaGFuZ2VkX2xpbmVzKGZpcnN0X2xpbmUsIDAsIGxhc3RfbGluZSArIDEsIChsb25nKTApOworCisgICAgVGNsX1Vuc2V0VmFyKHRjbGluZm8uaW50ZXJwLCB2YXJfbGluZSwgMCk7CisgICAgVGNsX1VubGlua1Zhcih0Y2xpbmZvLmludGVycCwgdmFyX2xudW0pOworICAgIGlmIChlcnIgPT0gVENMX09LKQorCVRjbF9SZXNldFJlc3VsdCh0Y2xpbmZvLmludGVycCk7CisKKyAgICAodm9pZCl0Y2xleGl0KGVycik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordGNsZGVsYWxscmVmcyhyZWYpCisgICAgc3RydWN0IHJlZiAqcmVmOworeworICAgIHN0cnVjdCByZWYJKm5leHQ7CisgICAgaW50CQllcnI7CisgICAgY2hhcgkqcmVzdWx0OworCisgICAgd2hpbGUgKHJlZiAhPSBOVUxMKQorICAgIHsKKwluZXh0ID0gcmVmLT5uZXh0OworCWlmIChyZWYtPmludGVycCkKKwl7CisJICAgIGlmIChyZWYtPmRlbGNtZCkKKwkgICAgeworCQllcnIgPSBUY2xfR2xvYmFsRXZhbE9iaihyZWYtPmludGVycCwgcmVmLT5kZWxjbWQpOworCQlpZiAoZXJyICE9IFRDTF9PSykKKwkJeworCQkgICAgcmVzdWx0ID0gVGNsX0dldFN0cmluZ1Jlc3VsdChyZWYtPmludGVycCk7CisJCSAgICBpZiAocmVzdWx0KQorCQkJdGNsZXJybXNnKHJlc3VsdCk7CisJCX0KKwkJVGNsX0RlY3JSZWZDb3VudChyZWYtPmRlbGNtZCk7CisJCXJlZi0+ZGVsY21kID0gTlVMTDsKKwkgICAgfQorCSAgICBUY2xfRGVsZXRlQ29tbWFuZEZyb21Ub2tlbihyZWYtPmludGVycCwgcmVmLT5jbWQpOworCX0KKwlUY2xfRnJlZSgoY2hhciAqKXJlZik7CisJcmVmID0gbmV4dDsKKyAgICB9Cit9CisKKyAgICB2b2lkCit0Y2xfYnVmZmVyX2ZyZWUoYnVmKQorICAgIGJ1Zl9UICpidWY7Cit7CisgICAgc3RydWN0IHJlZiAqcmVmbGlzdDsKKworI2lmZGVmIERZTkFNSUNfVENMCisgICAgaWYgKCFzdHVic19pbml0aWFsaXplZCkJLyogTm90IHVzaW5nIFRjbCwgbm90aGluZyB0byBkby4gKi8KKwlyZXR1cm47CisjZW5kaWYKKworICAgIHJlZmxpc3QgPSAoc3RydWN0IHJlZiopKGJ1Zi0+dGNsX3JlZik7CisgICAgaWYgKHJlZmxpc3QgIT0gJnJlZnNkZWxldGVkKQorICAgIHsKKwlidWYtPnRjbF9yZWYgPSAodm9pZCAqKSZyZWZzZGVsZXRlZDsKKwl0Y2xkZWxhbGxyZWZzKHJlZmxpc3QpOworCWJ1Zi0+dGNsX3JlZiA9IE5VTEw7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAordGNsX3dpbmRvd19mcmVlKHdpbikKKyAgICB3aW5fVCAqd2luOworeworICAgIHN0cnVjdCByZWYgKnJlZmxpc3Q7CisKKyNpZmRlZiBEWU5BTUlDX1RDTAorICAgIGlmICghc3R1YnNfaW5pdGlhbGl6ZWQpCS8qIE5vdCB1c2luZyBUY2wsIG5vdGhpbmcgdG8gZG8uICovCisJcmV0dXJuOworI2VuZGlmCisKKyAgICByZWZsaXN0ID0gKHN0cnVjdCByZWYqKSh3aW4tPnRjbF9yZWYpOworICAgIGlmIChyZWZsaXN0ICE9ICZyZWZzZGVsZXRlZCkKKyAgICB7CisJd2luLT50Y2xfcmVmID0gKHZvaWQgKikmcmVmc2RlbGV0ZWQ7CisJdGNsZGVsYWxscmVmcyhyZWZsaXN0KTsKKwl3aW4tPnRjbF9yZWYgPSBOVUxMOworICAgIH0KK30KKyNlbmRpZgorCisvKiBUaGUgRW5kICovCmRpZmYgLS1naXQgYS9zcmMvaWZfeGNtZHNydi5jIGIvc3JjL2lmX3hjbWRzcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODIxMzllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lmX3hjbWRzcnYuYwpAQCAtMCwwICsxLDE0NDEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqIFggY29tbWFuZCBzZXJ2ZXIgYnkgRmxlbW1pbmcgTWFkc2VuCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICoKKyAqIGlmX3hjbWRzcnYuYzogRnVuY3Rpb25zIGZvciBwYXNzaW5nIGNvbW1hbmRzIHRocm91Z2ggYW4gWDExIGRpc3BsYXkuCisgKgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKSB8fCBkZWZpbmVkKFBST1RPKQorCisjIGlmZGVmIEZFQVRfWDExCisjICBpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjICBpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKEhBVkVfU1lTX1NFTEVDVF9IKSAmJiBcCisJKCFkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkgfHwgZGVmaW5lZChTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUpKQorIyAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyBlbmRpZgorCisjIGlmbmRlZiBIQVZFX1NFTEVDVAorIyAgaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjICAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBIQVZFX1BPTExfSAorIyAgICBpbmNsdWRlIDxwb2xsLmg+CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgcHJvY2VkdXJlcyB0aGF0IGltcGxlbWVudCB0aGUgY29tbWFuZCBzZXJ2ZXIgZnVuY3Rpb25hbGl0eQorICogb2YgVmltIHdoZW4gaW4gY29udGFjdCB3aXRoIGFuIFgxMSBzZXJ2ZXIuCisgKgorICogQWRhcHRlZCBmcm9tIFRDTC9USydzIHNlbmQgY29tbWFuZCAgaW4gdGtTZW5kLmMgb2YgdGhlIHRrIDMuNiBkaXN0cmlidXRpb24uCisgKiBBZGFwdGVkIGZvciB1c2UgaW4gVmltIGJ5IEZsZW1taW5nIE1hZHNlbi4gUHJvdG9jb2wgY2hhbmdlZCB0byB0aGF0IG9mIHRrIDQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgd2l0aG91dCB3cml0dGVuIGFncmVlbWVudCBhbmQgd2l0aG91dAorICogbGljZW5zZSBvciByb3lhbHR5IGZlZXMsIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0d28gcGFyYWdyYXBocyBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCisgKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgVEhFIFVOSVZFUlNJVFkgT0YKKyAqIENBTElGT1JOSUEgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIFVOSVZFUlNJVFkgT0YgQ0FMSUZPUk5JQSBIQVMgTk8gT0JMSUdBVElPTiBUTworICogUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICovCisKKworLyoKKyAqIFdoZW4gYSByZXN1bHQgaXMgYmVpbmcgYXdhaXRlZCBmcm9tIGEgc2VudCBjb21tYW5kLCBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBpcyBwcmVzZW50IG9uIGEgbGlzdCBvZiBhbGwgb3V0c3RhbmRpbmcKKyAqIHNlbnQgY29tbWFuZHMuICBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0cnVjdHVyZSBpcyB1c2VkIHRvCisgKiBwcm9jZXNzIHRoZSByZXN1bHQgd2hlbiBpdCBhcnJpdmVzLiAgWW91J3JlIHByb2JhYmx5IHdvbmRlcmluZworICogaG93IHRoZXJlIGNvdWxkIGV2ZXIgYmUgbXVsdGlwbGUgb3V0c3RhbmRpbmcgc2VudCBjb21tYW5kcy4KKyAqIFRoaXMgY291bGQgaGFwcGVuIGlmIFZpbSBpbnN0YW5jZXMgaW52b2tlIGVhY2ggb3RoZXIgcmVjdXJzaXZlbHkuCisgKiBJdCdzIHVubGlrZWx5LCBidXQgcG9zc2libGUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUGVuZGluZ0NvbW1hbmQKK3sKKyAgICBpbnQJICAgIHNlcmlhbDsJLyogU2VyaWFsIG51bWJlciBleHBlY3RlZCBpbiByZXN1bHQuICovCisgICAgaW50CSAgICBjb2RlOwkvKiBSZXN1bHQgQ29kZS4gMCBpcyBPSyAqLworICAgIGNoYXJfdSAgKnJlc3VsdDsJLyogU3RyaW5nIHJlc3VsdCBmb3IgY29tbWFuZCAobWFsbG9jJ2VkKS4KKwkJCSAqIE5VTEwgbWVhbnMgY29tbWFuZCBzdGlsbCBwZW5kaW5nLiAqLworICAgIHN0cnVjdCBQZW5kaW5nQ29tbWFuZCAqbmV4dFB0cjsKKwkJCS8qIE5leHQgaW4gbGlzdCBvZiBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMuCisJCQkgKiBOVUxMIG1lYW5zIGVuZCBvZiBsaXN0LiAqLworfSBQZW5kaW5nQ29tbWFuZDsKKworc3RhdGljIFBlbmRpbmdDb21tYW5kICpwZW5kaW5nQ29tbWFuZHMgPSBOVUxMOworCQkJCS8qIExpc3Qgb2YgYWxsIGNvbW1hbmRzIGN1cnJlbnRseQorCQkJCSAqIGJlaW5nIHdhaXRlZCBmb3IuICovCisKKy8qCisgKiBUaGUgaW5mb3JtYXRpb24gYmVsb3cgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcworICogZHVyaW5nICJzZW5kIiBjb21tYW5kcy4gIEVhY2ggcHJvY2VzcyBrZWVwcyBhIHByaXZhdGUgd2luZG93LCBuZXZlcgorICogZXZlbiBtYXBwZWQsIHdpdGggb25lIHByb3BlcnR5LCAiQ29tbSIuICBXaGVuIGEgY29tbWFuZCBpcyBzZW50IHRvCisgKiBhbiBpbnRlcnByZXRlciwgdGhlIGNvbW1hbmQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvbW0gcHJvcGVydHkgb2YgdGhlCisgKiBjb21tdW5pY2F0aW9uIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVycCdzIHByb2Nlc3MuICBTaW1pbGFybHksCisgKiB3aGVuIGEgcmVzdWx0IGlzIHJldHVybmVkIGZyb20gYSBzZW50IGNvbW1hbmQsIGl0IGlzIGFsc28gYXBwZW5kZWQKKyAqIHRvIHRoZSBjb21tIHByb3BlcnR5LgorICoKKyAqIEVhY2ggY29tbWFuZCBhbmQgZWFjaCByZXN1bHQgdGFrZXMgdGhlIGZvcm0gb2YgQVNDSUkgdGV4dC4gIEZvciBhCisgKiBjb21tYW5kLCB0aGUgdGV4dCBjb25zaXN0cyBvZiBhIG51bCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgc2V2ZXJhbAorICogbnVsLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5ncy4gIFRoZSBmaXJzdCBzdHJpbmcgY29uc2lzdHMgb2YgdGhlCisgKiBzaW5nbGUgbGV0dGVyICJjIiBmb3IgYW4gZXhwcmVzc2lvbiwgb3IgImsiIGZvciBrZXlzdHJva2VzLiAgU3Vic2VxdWVudAorICogc3RyaW5ncyBoYXZlIHRoZSBmb3JtICJvcHRpb24gdmFsdWUiIHdoZXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUKKyAqIHN1cHBvcnRlZDoKKyAqCisgKiAtciBjb21tV2luZG93IHNlcmlhbAorICoKKyAqCVRoaXMgb3B0aW9uIG1lYW5zIHRoYXQgYSByZXNwb25zZSBzaG91bGQgYmUgc2VudCB0byB0aGUgd2luZG93CisgKgl3aG9zZSBYIGlkZW50aWZpZXIgaXMgImNvbW1XaW5kb3ciIChpbiBoZXgpLCBhbmQgdGhlIHJlc3BvbnNlIHNob3VsZAorICoJYmUgaWRlbnRpZmllZCB3aXRoIHRoZSBzZXJpYWwgbnVtYmVyIGdpdmVuIGJ5ICJzZXJpYWwiIChpbiBkZWNpbWFsKS4KKyAqCUlmIHRoaXMgb3B0aW9uIGlzbid0IHNwZWNpZmllZCB0aGVuIHRoZSBzZW5kIGlzIGFzeW5jaHJvbm91cyBhbmQKKyAqCW5vIHJlc3BvbnNlIGlzIHNlbnQuCisgKgorICogLW4gbmFtZQorICoJIk5hbWUiIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3Igd2hpY2ggdGhlIGNvbW1hbmQgaXMKKyAqCWludGVuZGVkLiAgVGhpcyBvcHRpb24gbXVzdCBiZSBwcmVzZW50LgorICoKKyAqIC1zIHNjcmlwdAorICoJIlNjcmlwdCIgaXMgdGhlIHNjcmlwdCB0byBiZSBleGVjdXRlZC4gIFRoaXMgb3B0aW9uIG11c3QgYmUKKyAqCXByZXNlbnQuICBUYWtlbiBhcyBhIHNlcmllcyBvZiBrZXlzdHJva2VzIGluIGEgImsiIGNvbW1hbmQgd2hlcmUKKyAqCTxLZXk+J3MgYXJlIGV4cGFuZGVkCisgKgorICogVGhlIG9wdGlvbnMgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIuICBUaGUgLW4gYW5kIC1zIG9wdGlvbnMgbXVzdCBiZQorICogcHJlc2VudCwgYnV0IC1yIG1heSBiZSBvbWl0dGVkIGZvciBhc3luY2hyb25vdXMgUlBDcy4gIEZvciBjb21wYXRpYmlsaXR5CisgKiB3aXRoIGZ1dHVyZSByZWxlYXNlcyB0aGF0IG1heSBhZGQgbmV3IGZlYXR1cmVzLCB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbAorICogb3B0aW9ucyBwcmVzZW50OyAgYXMgbG9uZyBhcyB0aGV5IHN0YXJ0IHdpdGggYSAiLSIgY2hhcmFjdGVyLCB0aGV5IHdpbGwKKyAqIGJlIGlnbm9yZWQuCisgKgorICogQSByZXN1bHQgYWxzbyBjb25zaXN0cyBvZiBhIHplcm8gY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IHNldmVyYWwgbnVsbC0KKyAqIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5ncy4gIFRoZSBmaXJzdCBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIHNpbmdsZQorICogbGV0dGVyICJyIi4gIFN1YnNlcXVlbnQgc3RyaW5ncyBoYXZlIHRoZSBmb3JtICJvcHRpb24gdmFsdWUiIHdoZXJlCisgKiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKiAtcyBzZXJpYWwKKyAqCUlkZW50aWZpZXMgdGhlIGNvbW1hbmQgZm9yIHdoaWNoIHRoaXMgaXMgdGhlIHJlc3VsdC4gIEl0IGlzIHRoZQorICoJc2FtZSBhcyB0aGUgInNlcmlhbCIgZmllbGQgZnJvbSB0aGUgLXMgb3B0aW9uIGluIHRoZSBjb21tYW5kLiAgVGhpcworICoJb3B0aW9uIG11c3QgYmUgcHJlc2VudC4KKyAqCisgKiAtciByZXN1bHQKKyAqCSJSZXN1bHQiIGlzIHRoZSByZXN1bHQgc3RyaW5nIGZvciB0aGUgc2NyaXB0LCB3aGljaCBtYXkgYmUgZWl0aGVyCisgKglhIHJlc3VsdCBvciBhbiBlcnJvciBtZXNzYWdlLiAgSWYgdGhpcyBmaWVsZCBpcyBvbWl0dGVkIHRoZW4gaXQKKyAqCWRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4KKyAqCisgKiAtYyBjb2RlCisgKgkwOiBmb3IgT0suIFRoaXMgaXMgdGhlIGRlZmF1bHQuCisgKgkxOiBmb3IgZXJyb3I6IFJlc3VsdCBpcyB0aGUgbGFzdCBlcnJvcgorICoKKyAqIC1pIGVycm9ySW5mbworICogLWUgZXJyb3JDb2RlCisgKglOb3QgYXBwbGljYWJsZSBmb3IgVmltCisgKgorICogT3B0aW9ucyBtYXkgYXBwZWFyIGluIGFueSBvcmRlciwgYW5kIG9ubHkgdGhlIC1zIG9wdGlvbiBtdXN0IGJlCisgKiBwcmVzZW50LiAgQXMgd2l0aCBjb21tYW5kcywgdGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgb3B0aW9ucyBiZXNpZGVzCisgKiB0aGVzZTsgIHVua25vd24gb3B0aW9ucyBhcmUgaWdub3JlZC4KKyAqLworCisvKgorICogTWF4aW11bSBzaXplIHByb3BlcnR5IHRoYXQgY2FuIGJlIHJlYWQgYXQgb25lIHRpbWUgYnkKKyAqIHRoaXMgbW9kdWxlOgorICovCisKKyNkZWZpbmUgTUFYX1BST1BfV09SRFMgMTAwMDAwCisKK3N0cnVjdCBTZXJ2ZXJSZXBseQoreworICAgIFdpbmRvdyAgaWQ7CisgICAgZ2FycmF5X1Qgc3RyaW5nczsKK307CitzdGF0aWMgZ2FycmF5X1Qgc2VydmVyUmVwbHkgPSB7IDAsIDAsIDAsIDAsIDAgfTsKK2VudW0gU2VydmVyUmVwbHlPcCB7IFNST1BfRmluZCwgU1JPUF9BZGQsIFNST1BfRGVsZXRlIH07CisKK3R5cGVkZWYgaW50ICgqRW5kQ29uZCkgX19BUkdTKCh2b2lkICopKTsKKworLyoKKyAqIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBwcm9jZWR1cmVzIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlOgorICovCisKK3N0YXRpYyBXaW5kb3cJTG9va3VwTmFtZSBfX0FSR1MoKERpc3BsYXkgKmRweSwgY2hhcl91ICpuYW1lLCBpbnQgZGVsZXRlLCBjaGFyX3UgKipsb29zZSkpOworc3RhdGljIGludAlTZW5kSW5pdCBfX0FSR1MoKERpc3BsYXkgKmRweSkpOworc3RhdGljIGludAlEb1JlZ2lzdGVyTmFtZSBfX0FSR1MoKERpc3BsYXkgKmRweSwgY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgdm9pZAlEZWxldGVBbnlMaW5nZXJlciBfX0FSR1MoKERpc3BsYXkgKmRweSwgV2luZG93IHcpKTsKK3N0YXRpYyBpbnQJR2V0UmVnUHJvcCBfX0FSR1MoKERpc3BsYXkgKmRweSwgY2hhcl91ICoqcmVnUHJvcHAsIGxvbmdfdSAqbnVtSXRlbXNwLCBpbnQgZG9tc2cpKTsKK3N0YXRpYyBpbnQJV2FpdEZvclBlbmQgX19BUkdTKCh2b2lkICpwKSk7CitzdGF0aWMgaW50CVdhaXRGb3JSZXBseSBfX0FSR1MoKHZvaWQgKnApKTsKK3N0YXRpYyBpbnQJV2luZG93VmFsaWQgX19BUkdTKChEaXNwbGF5ICpkcHksIFdpbmRvdyB3KSk7CitzdGF0aWMgdm9pZAlTZXJ2ZXJXYWl0IF9fQVJHUygoRGlzcGxheSAqZHB5LCBXaW5kb3cgdywgRW5kQ29uZCBlbmRDb25kLCB2b2lkICplbmREYXRhLCBpbnQgbG9jYWxMb29wLCBpbnQgc2Vjb25kcykpOworc3RhdGljIHN0cnVjdCBTZXJ2ZXJSZXBseSAqU2VydmVyUmVwbHlGaW5kIF9fQVJHUygoV2luZG93IHcsIGVudW0gU2VydmVyUmVwbHlPcCBvcCkpOworc3RhdGljIGludAlBcHBlbmRQcm9wQ2FyZWZ1bGx5IF9fQVJHUygoRGlzcGxheSAqZGlzcGxheSwgV2luZG93IHdpbmRvdywgQXRvbSBwcm9wZXJ0eSwgY2hhcl91ICp2YWx1ZSwgaW50IGxlbmd0aCkpOworc3RhdGljIGludAl4X2Vycm9yX2NoZWNrIF9fQVJHUygoRGlzcGxheSAqZHB5LCBYRXJyb3JFdmVudCAqZXJyb3JfZXZlbnQpKTsKK3N0YXRpYyBpbnQJSXNTZXJpYWxOYW1lIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CisKKy8qIFByaXZhdGUgdmFyaWFibGVzIGZvciB0aGUgInNlcnZlciIgZnVuY3Rpb25hbGl0eSAqLworc3RhdGljIEF0b20JcmVnaXN0cnlQcm9wZXJ0eSA9IE5vbmU7CitzdGF0aWMgQXRvbQl2aW1Qcm9wZXJ0eSA9IE5vbmU7CitzdGF0aWMgaW50CWdvdF94X2Vycm9yID0gRkFMU0U7CisKK3N0YXRpYyBjaGFyX3UJKmVtcHR5X3Byb3AgPSAoY2hhcl91ICopIiI7CS8qIGVtcHR5IEdldFJlZ1Byb3AoKSByZXN1bHQgKi8KKworLyoKKyAqIEFzc29jaWF0ZSBhbiBBU0NJSSBuYW1lIHdpdGggVmltLiAgVHJ5IHJlYWwgaGFyZCB0byBnZXQgYSB1bmlxdWUgb25lLgorICogUmV0dXJucyBGQUlMIG9yIE9LLgorICovCisgICAgaW50CitzZXJ2ZXJSZWdpc3Rlck5hbWUoZHB5LCBuYW1lKQorICAgIERpc3BsYXkJKmRweTsJCS8qIGRpc3BsYXkgdG8gcmVnaXN0ZXIgd2l0aCAqLworICAgIGNoYXJfdQkqbmFtZTsJCS8qIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSAqLworeworICAgIGludAkJaTsKKyAgICBpbnQJCXJlczsKKyAgICBjaGFyX3UJKnAgPSBOVUxMOworCisgICAgcmVzID0gRG9SZWdpc3Rlck5hbWUoZHB5LCBuYW1lKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICB7CisJaSA9IDE7CisJZG8KKwl7CisJICAgIGlmIChyZXMgPCAtMSB8fCBpID49IDEwMDApCisJICAgIHsKKwkJTVNHX0FUVFIoXygiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIpLAorCQkJCQkJCSAgICAgIGhsX2F0dHIoSExGX1cpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgaWYgKHAgPT0gTlVMTCkKKwkJcCA9IGFsbG9jKFNUUkxFTihuYW1lKSArIDEwKTsKKwkgICAgaWYgKHAgPT0gTlVMTCkKKwkgICAgeworCQlyZXMgPSAtMTA7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIHNwcmludGYoKGNoYXIgKilwLCAiJXMlZCIsIG5hbWUsIGkrKyk7CisJICAgIHJlcyA9IERvUmVnaXN0ZXJOYW1lKGRweSwgcCk7CisJfQorCXdoaWxlIChyZXMgPCAwKQorCSAgICA7CisJdmltX2ZyZWUocCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworICAgIHN0YXRpYyBpbnQKK0RvUmVnaXN0ZXJOYW1lKGRweSwgbmFtZSkKKyAgICBEaXNwbGF5CSpkcHk7CisgICAgY2hhcl91CSpuYW1lOworeworICAgIFdpbmRvdwl3OworICAgIFhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7CisjZGVmaW5lIE1BWF9OQU1FX0xFTkdUSCAxMDAKKyAgICBjaGFyX3UJcHJvcEluZm9bTUFYX05BTUVfTEVOR1RIICsgMjBdOworCisgICAgaWYgKGNvbW1Qcm9wZXJ0eSA9PSBOb25lKQorICAgIHsKKwlpZiAoU2VuZEluaXQoZHB5KSA8IDApCisJICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGUgbmFtZSBpcyB1bmlxdWUsIGFuZCBhcHBlbmQgaW5mbyBhYm91dCBpdCB0bworICAgICAqIHRoZSByZWdpc3RyeSBwcm9wZXJ0eS4gIEl0J3MgaW1wb3J0YW50IHRvIGxvY2sgdGhlIHNlcnZlcgorICAgICAqIGhlcmUgdG8gcHJldmVudCBjb25mbGljdGluZyBjaGFuZ2VzIHRvIHRoZSByZWdpc3RyeSBwcm9wZXJ0eS4KKyAgICAgKiBXQVJOSU5HOiBEbyBub3Qgc3RlcCB0aHJvdWdoIHRoaXMgd2hpbGUgZGVidWdnaW5nLCBpdCB3aWxsIGhhbmd1cCB0aGUgWAorICAgICAqIHNlcnZlciEKKyAgICAgKi8KKyAgICBYR3JhYlNlcnZlcihkcHkpOworICAgIHcgPSBMb29rdXBOYW1lKGRweSwgbmFtZSwgRkFMU0UsIE5VTEwpOworICAgIGlmICh3ICE9IChXaW5kb3cpMCkKKyAgICB7CisJU3RhdHVzCQlzdGF0dXM7CisJaW50CQlkdW1teUludDsKKwl1bnNpZ25lZCBpbnQJZHVtbXlVbnM7CisJV2luZG93CQlkdW1teVdpbjsKKworCS8qCisJICogVGhlIG5hbWUgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQuICBTZWUgaWYgdGhlIGNvbW1XaW5kb3cKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgZXhpc3RzLiAgSWYgbm90LCBvciBpZiB0aGUgY29tbVdpbmRvdworCSAqIGlzICpvdXIqIGNvbW1XaW5kb3csIHRoZW4ganVzdCB1bnJlZ2lzdGVyIHRoZSBvbGQgbmFtZSAodGhpcworCSAqIGNvdWxkIGhhcHBlbiBpZiBhbiBhcHBsaWNhdGlvbiBkaWVzIHdpdGhvdXQgY2xlYW5pbmcgdXAgdGhlCisJICogcmVnaXN0cnkpLgorCSAqLworCW9sZF9oYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcih4X2Vycm9yX2NoZWNrKTsKKwlzdGF0dXMgPSBYR2V0R2VvbWV0cnkoZHB5LCB3LCAmZHVtbXlXaW4sICZkdW1teUludCwgJmR1bW15SW50LAorCQkJCSAgJmR1bW15VW5zLCAmZHVtbXlVbnMsICZkdW1teVVucywgJmR1bW15VW5zKTsKKwkodm9pZClYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKKwlpZiAoc3RhdHVzICE9IFN1Y2Nlc3MgJiYgdyAhPSBjb21tV2luZG93KQorCXsKKwkgICAgWFVuZ3JhYlNlcnZlcihkcHkpOworCSAgICBYRmx1c2goZHB5KTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwkodm9pZClMb29rdXBOYW1lKGRweSwgbmFtZSwgLypkZWxldGU9Ki9UUlVFLCBOVUxMKTsKKyAgICB9CisgICAgc3ByaW50ZigoY2hhciAqKXByb3BJbmZvLCAiJXggJS4qcyIsIChpbnRfdSljb21tV2luZG93LAorCQkJCQkJICAgICAgIE1BWF9OQU1FX0xFTkdUSCwgbmFtZSk7CisgICAgb2xkX2hhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHhfZXJyb3JfY2hlY2spOworICAgIGdvdF94X2Vycm9yID0gRkFMU0U7CisgICAgWENoYW5nZVByb3BlcnR5KGRweSwgUm9vdFdpbmRvdyhkcHksIDApLCByZWdpc3RyeVByb3BlcnR5LCBYQV9TVFJJTkcsIDgsCisJCSAgICBQcm9wTW9kZUFwcGVuZCwgcHJvcEluZm8sIFNUUkxFTihwcm9wSW5mbykgKyAxKTsKKyAgICBYVW5ncmFiU2VydmVyKGRweSk7CisgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgKHZvaWQpWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7CisKKyAgICBpZiAoIWdvdF94X2Vycm9yKQorICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwlzZXRfdmltX3Zhcl9zdHJpbmcoVlZfU0VORF9TRVJWRVIsIG5hbWUsIC0xKTsKKyNlbmRpZgorCXNlcnZlck5hbWUgPSB2aW1fc3Ryc2F2ZShuYW1lKTsKKyNpZmRlZiBGRUFUX1RJVExFCisJbmVlZF9tYWtldGl0bGUgPSBUUlVFOworI2VuZGlmCisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMjsKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2xlYW4gb3V0IG5ldyBJRCBmcm9tIHJlZ2lzdHJ5IGFuZCBzZXQgaXQgYXMgY29tbSB3aW4uCisgKiBDaGFuZ2UgYW55IHJlZ2lzdGVyZWQgd2luZG93IElELgorICovCisgICAgdm9pZAorc2VydmVyQ2hhbmdlUmVnaXN0ZXJlZFdpbmRvdyhkcHksIG5ld3dpbikKKyAgICBEaXNwbGF5CSpkcHk7CQkvKiBEaXNwbGF5IHRvIHJlZ2lzdGVyIHdpdGggKi8KKyAgICBXaW5kb3cJbmV3d2luOwkJLyogUmUtcmVnaXN0ZXIgdG8gdGhpcyBJRCAqLworeworICAgIGNoYXJfdQlwcm9wSW5mb1tNQVhfTkFNRV9MRU5HVEggKyAyMF07CisKKyAgICBjb21tV2luZG93ID0gbmV3d2luOworCisgICAgLyogQWx3YXlzIGNhbGwgU2VuZEluaXQoKSBoZXJlLCB0byBtYWtlIHN1cmUgY29tbVdpbmRvdyBpcyBtYXJrZWQgYXMgYSBWaW0KKyAgICAgKiB3aW5kb3cuICovCisgICAgaWYgKFNlbmRJbml0KGRweSkgPCAwKQorCXJldHVybjsKKworICAgIC8qIFdBUk5JTkc6IERvIG5vdCBzdGVwIHRocm91Z2ggdGhpcyB3aGlsZSBkZWJ1Z2dpbmcsIGl0IHdpbGwgaGFuZ3VwIHRoZSBYCisgICAgICogc2VydmVyISAqLworICAgIFhHcmFiU2VydmVyKGRweSk7CisgICAgRGVsZXRlQW55TGluZ2VyZXIoZHB5LCBuZXd3aW4pOworICAgIGlmIChzZXJ2ZXJOYW1lICE9IE5VTEwpCisgICAgeworCS8qIFJlaW5zZXJ0IG5hbWUgaWYgd2Ugd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCSh2b2lkKUxvb2t1cE5hbWUoZHB5LCBzZXJ2ZXJOYW1lLCAvKmRlbGV0ZT0qL1RSVUUsIE5VTEwpOworCXNwcmludGYoKGNoYXIgKilwcm9wSW5mbywgIiV4ICUuKnMiLAorCQkoaW50X3UpbmV3d2luLCBNQVhfTkFNRV9MRU5HVEgsIHNlcnZlck5hbWUpOworCVhDaGFuZ2VQcm9wZXJ0eShkcHksIFJvb3RXaW5kb3coZHB5LCAwKSwgcmVnaXN0cnlQcm9wZXJ0eSwgWEFfU1RSSU5HLCA4LAorCQkJUHJvcE1vZGVBcHBlbmQsIChjaGFyX3UgKilwcm9wSW5mbywKKwkJCVNUUkxFTihwcm9wSW5mbykgKyAxKTsKKyAgICB9CisgICAgWFVuZ3JhYlNlcnZlcihkcHkpOworfQorI2VuZGlmCisKKy8qCisgKiBTZW5kIHRvIGFuIGluc3RhbmNlIG9mIFZpbSB2aWEgdGhlIFggZGlzcGxheS4KKyAqIFJldHVybnMgMCBmb3IgT0ssIG5lZ2F0aXZlIGZvciBhbiBlcnJvci4KKyAqLworICAgIGludAorc2VydmVyU2VuZFRvVmltKGRweSwgbmFtZSwgY21kLCAgcmVzdWx0LCBzZXJ2ZXIsIGFzRXhwciwgbG9jYWxMb29wLCBzaWxlbnQpCisgICAgRGlzcGxheQkqZHB5OwkJCS8qIFdoZXJlIHRvIHNlbmQuICovCisgICAgY2hhcl91CSpuYW1lOwkJCS8qIFdoZXJlIHRvIHNlbmQuICovCisgICAgY2hhcl91CSpjbWQ7CQkJLyogV2hhdCB0byBzZW5kLiAqLworICAgIGNoYXJfdQkqKnJlc3VsdDsJCS8qIFJlc3VsdCBvZiBldmFsJ2VkIGV4cHJlc3Npb24gKi8KKyAgICBXaW5kb3cJKnNlcnZlcjsJCS8qIEFjdHVhbCBJRCBvZiByZWNlaXZpbmcgYXBwICovCisgICAgQm9vbAlhc0V4cHI7CQkJLyogSW50ZXJwcmV0IGFzIGtleXN0cm9rZXMgb3IgZXhwciA/ICovCisgICAgQm9vbAlsb2NhbExvb3A7CQkvKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgYnV0IHJlc3VsdCAqLworICAgIGludAkJc2lsZW50OwkJCS8qIGRvbid0IGNvbXBsYWluIGFib3V0IG5vIHNlcnZlciAqLworeworICAgIFdpbmRvdwkgICAgdzsKKyAgICBjaGFyX3UJICAgICpwcm9wZXJ0eTsKKyAgICBpbnQJCSAgICBsZW5ndGg7CisgICAgaW50CQkgICAgcmVzOworICAgIHN0YXRpYyBpbnQJICAgIHNlcmlhbCA9IDA7CS8qIFJ1bm5pbmcgY291bnQgb2Ygc2VudCBjb21tYW5kcy4KKwkJCQkgKiBVc2VkIHRvIGdpdmUgZWFjaCBjb21tYW5kIGEKKwkJCQkgKiBkaWZmZXJlbnQgc2VyaWFsIG51bWJlci4gKi8KKyAgICBQZW5kaW5nQ29tbWFuZCAgcGVuZGluZzsKKyAgICBjaGFyX3UJICAgICpsb29zZW5hbWUgPSBOVUxMOworCisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCSpyZXN1bHQgPSBOVUxMOworICAgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gTlVMKQorCW5hbWUgPSAoY2hhcl91ICopIkdWSU0iOyAgICAvKiB1c2UgYSBkZWZhdWx0IG5hbWUgKi8KKworICAgIGlmIChjb21tUHJvcGVydHkgPT0gTm9uZSAmJiBkcHkgIT0gTlVMTCkKKyAgICB7CisJaWYgKFNlbmRJbml0KGRweSkgPCAwKQorCSAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogRXhlY3V0ZSBsb2NhbGx5IGlmIG5vIGRpc3BsYXkgb3IgdGFyZ2V0IGlzIG91cnNlbHZlcyAqLworICAgIGlmIChkcHkgPT0gTlVMTCB8fCAoc2VydmVyTmFtZSAhPSBOVUxMICYmIFNUUklDTVAobmFtZSwgc2VydmVyTmFtZSkgPT0gMCkpCisgICAgeworCWlmIChhc0V4cHIpCisJeworCSAgICBjaGFyX3UgKnJldDsKKworCSAgICByZXQgPSBldmFsX2NsaWVudF9leHByX3RvX3N0cmluZyhjbWQpOworCSAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisJICAgIHsKKwkJaWYgKHJldCA9PSBOVUxMKQorCQkgICAgKnJlc3VsdCA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKilfKGVfaW52ZXhwcm1zZykpOworCQllbHNlCisJCSAgICAqcmVzdWx0ID0gcmV0OworCSAgICB9CisJICAgIGVsc2UKKwkJdmltX2ZyZWUocmV0KTsKKwkgICAgcmV0dXJuIHJldCA9PSBOVUxMID8gLTEgOiAwOworCX0KKwllbHNlCisJICAgIHNlcnZlcl90b19pbnB1dF9idWYoY21kKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEJpbmQgdGhlIHNlcnZlciBuYW1lIHRvIGEgY29tbXVuaWNhdGlvbiB3aW5kb3cuCisgICAgICoKKyAgICAgKiBGaW5kIGFueSBzdXJ2aXZvciB3aXRoIGEgc2VyaWFsbm8gYXR0YWNoZWQgdG8gdGhlIG5hbWUgaWYgdGhlCisgICAgICogb3JpZ2luYWwgcmVnaXN0cmFudCBvZiB0aGUgd2FudGVkIG5hbWUgaXMgbm8gbG9uZ2VyIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBEZWxldGUgYW55IGxpbmdlcmluZyBuYW1lcyBmcm9tIGRlYWQgZWRpdG9ycy4KKyAgICAgKi8KKyAgICB3aGlsZSAoVFJVRSkKKyAgICB7CisJdyA9IExvb2t1cE5hbWUoZHB5LCBuYW1lLCBGQUxTRSwgJmxvb3NlbmFtZSk7CisJLyogQ2hlY2sgdGhhdCB0aGUgd2luZG93IGlzIGhvdCAqLworCWlmICh3ICE9IE5vbmUpCisJeworCSAgICBpZiAoIVdpbmRvd1ZhbGlkKGRweSwgdykpCisJICAgIHsKKwkJTG9va3VwTmFtZShkcHksIGxvb3NlbmFtZSA/IGxvb3NlbmFtZSA6IG5hbWUsCisJCQkgICAvKkRFTEVURT0qL1RSVUUsIE5VTEwpOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgaWYgKHcgPT0gTm9uZSkKKyAgICB7CisJaWYgKCFzaWxlbnQpCisJICAgIEVNU0cyKF8oZV9ub3NlcnZlciksIG5hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAobG9vc2VuYW1lICE9IE5VTEwpCisJbmFtZSA9IGxvb3NlbmFtZTsKKyAgICBpZiAoc2VydmVyICE9IE5VTEwpCisJKnNlcnZlciA9IHc7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIGNvbW1hbmQgdG8gdGFyZ2V0IGludGVycHJldGVyIGJ5IGFwcGVuZGluZyBpdCB0byB0aGUKKyAgICAgKiBjb21tIHdpbmRvdyBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aW5kb3cuCisgICAgICovCisgICAgbGVuZ3RoID0gU1RSTEVOKG5hbWUpICsgU1RSTEVOKGNtZCkgKyAxMDsKKyAgICBwcm9wZXJ0eSA9IChjaGFyX3UgKilhbGxvYygodW5zaWduZWQpIGxlbmd0aCArIDMwKTsKKworICAgIHNwcmludGYoKGNoYXIgKilwcm9wZXJ0eSwgIiVjJWMlYy1uICVzJWMtcyAlcyIsCisJCSAgICAgIDAsIGFzRXhwciA/ICdjJyA6ICdrJywgMCwgbmFtZSwgMCwgY21kKTsKKyAgICBpZiAobmFtZSA9PSBsb29zZW5hbWUpCisJdmltX2ZyZWUobG9vc2VuYW1lKTsKKyAgICAvKiBBZGQgYSBiYWNrIHJlZmVyZW5jZSB0byBvdXIgY29tbSB3aW5kb3cgKi8KKyAgICBzZXJpYWwrKzsKKyAgICBzcHJpbnRmKChjaGFyICopcHJvcGVydHkgKyBsZW5ndGgsICIlYy1yICV4ICVkIiwKKwkJCQkJCTAsIChpbnRfdSljb21tV2luZG93LCBzZXJpYWwpOworICAgIGxlbmd0aCArPSBTVFJMRU4ocHJvcGVydHkgKyBsZW5ndGggKyAxKSArIDE7CisKKyAgICByZXMgPSBBcHBlbmRQcm9wQ2FyZWZ1bGx5KGRweSwgdywgY29tbVByb3BlcnR5LCBwcm9wZXJ0eSwgbGVuZ3RoICsgMSk7CisgICAgdmltX2ZyZWUocHJvcGVydHkpOworICAgIGlmIChyZXMgPCAwKQorICAgIHsKKwlFTVNHKF8oIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iKSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghYXNFeHByKSAvKiBUaGVyZSBpcyBubyBhbnN3ZXIgZm9yIHRoaXMgLSBLZXlzIGFyZSBzZW50IGFzeW5jICovCisJcmV0dXJuIDA7CisKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgd2UncmUgd2FpdGluZyBmb3IgYSBjb21tYW5kIHRvCisgICAgICogY29tcGxldGUgKHRoaXMgaXMgbmVlZGVkIGJ5IFNlbmRFdmVudFByb2MgYW5kIGJ5CisgICAgICogQXBwZW5kRXJyb3JQcm9jIHRvIHBhc3MgYmFjayB0aGUgY29tbWFuZCdzIHJlc3VsdHMpLgorICAgICAqLworICAgIHBlbmRpbmcuc2VyaWFsID0gc2VyaWFsOworICAgIHBlbmRpbmcuY29kZSA9IDA7CisgICAgcGVuZGluZy5yZXN1bHQgPSBOVUxMOworICAgIHBlbmRpbmcubmV4dFB0ciA9IHBlbmRpbmdDb21tYW5kczsKKyAgICBwZW5kaW5nQ29tbWFuZHMgPSAmcGVuZGluZzsKKworICAgIFNlcnZlcldhaXQoZHB5LCB3LCBXYWl0Rm9yUGVuZCwgJnBlbmRpbmcsIGxvY2FsTG9vcCwgNjAwKTsKKworICAgIC8qCisgICAgICogVW5yZWdpc3RlciB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBlbmRpbmcgY29tbWFuZAorICAgICAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBpZiAocGVuZGluZ0NvbW1hbmRzID09ICZwZW5kaW5nKQorCXBlbmRpbmdDb21tYW5kcyA9IHBlbmRpbmcubmV4dFB0cjsKKyAgICBlbHNlCisgICAgeworCVBlbmRpbmdDb21tYW5kICpwY1B0cjsKKworCWZvciAocGNQdHIgPSBwZW5kaW5nQ29tbWFuZHM7IHBjUHRyICE9IE5VTEw7IHBjUHRyID0gcGNQdHItPm5leHRQdHIpCisJICAgIGlmIChwY1B0ci0+bmV4dFB0ciA9PSAmcGVuZGluZykKKwkgICAgeworCQlwY1B0ci0+bmV4dFB0ciA9IHBlbmRpbmcubmV4dFB0cjsKKwkJYnJlYWs7CisJICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCSpyZXN1bHQgPSBwZW5kaW5nLnJlc3VsdDsKKyAgICBlbHNlCisJdmltX2ZyZWUocGVuZGluZy5yZXN1bHQpOworCisgICAgcmV0dXJuIHBlbmRpbmcuY29kZSA9PSAwID8gMCA6IC0xOworfQorCisgICAgc3RhdGljIGludAorV2FpdEZvclBlbmQocCkKKyAgICB2b2lkICAgICpwOworeworICAgIFBlbmRpbmdDb21tYW5kICpwZW5kaW5nID0gKFBlbmRpbmdDb21tYW5kICopIHA7CisgICAgcmV0dXJuIHBlbmRpbmctPnJlc3VsdCAhPSBOVUxMOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgd2luZG93ICJ3IiBleGlzdHMgYW5kIGhhcyBhICJWaW0iIHByb3BlcnR5IG9uIGl0LgorICovCisgICAgc3RhdGljIGludAorV2luZG93VmFsaWQoZHB5LCB3KQorICAgIERpc3BsYXkgICAgICpkcHk7CisgICAgV2luZG93CXc7Cit7CisgICAgWEVycm9ySGFuZGxlciAgIG9sZF9oYW5kbGVyOworICAgIEF0b20JICAgICpwbGlzdDsKKyAgICBpbnQJCSAgICBudW1Qcm9wOworICAgIGludAkJICAgIGk7CisKKyAgICBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoeF9lcnJvcl9jaGVjayk7CisgICAgZ290X3hfZXJyb3IgPSAwOworICAgIHBsaXN0ID0gWExpc3RQcm9wZXJ0aWVzKGRweSwgdywgJm51bVByb3ApOworICAgIFhTeW5jKGRweSwgRmFsc2UpOworICAgIFhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOworICAgIGlmIChwbGlzdCA9PSBOVUxMIHx8IGdvdF94X2Vycm9yKQorCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wOyBpKyspCisJaWYgKHBsaXN0W2ldID09IHZpbVByb3BlcnR5KQorCXsKKwkgICAgWEZyZWUocGxpc3QpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgWEZyZWUocGxpc3QpOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIEVudGVyIGEgbG9vcCBwcm9jZXNzaW5nIFggZXZlbnRzICYgcG9sbGluZyBjaGFycyB1bnRpbCB3ZSBzZWUgYSByZXN1bHQKKyAqLworICAgIHN0YXRpYyB2b2lkCitTZXJ2ZXJXYWl0KGRweSwgdywgZW5kQ29uZCwgZW5kRGF0YSwgbG9jYWxMb29wLCBzZWNvbmRzKQorICAgIERpc3BsYXkJKmRweTsKKyAgICBXaW5kb3cJdzsKKyAgICBFbmRDb25kCWVuZENvbmQ7CisgICAgdm9pZAkqZW5kRGF0YTsKKyAgICBpbnQJCWxvY2FsTG9vcDsKKyAgICBpbnQJCXNlY29uZHM7Cit7CisgICAgdGltZV90CSAgICBzdGFydDsKKyAgICB0aW1lX3QJICAgIG5vdzsKKyAgICB0aW1lX3QJICAgIGxhc3RDaGsgPSAwOworICAgIFhFdmVudAkgICAgZXZlbnQ7CisgICAgWFByb3BlcnR5RXZlbnQgKmUgPSAoWFByb3BlcnR5RXZlbnQgKikmZXZlbnQ7CisjICAgZGVmaW5lIFNFTkRfTVNFQ19QT0xMIDUwCisKKyAgICB0aW1lKCZzdGFydCk7CisgICAgd2hpbGUgKGVuZENvbmQoZW5kRGF0YSkgPT0gMCkKKyAgICB7CisJdGltZSgmbm93KTsKKwlpZiAoc2Vjb25kcyA+PSAwICYmIChub3cgLSBzdGFydCkgPj0gc2Vjb25kcykKKwkgICAgYnJlYWs7CisJaWYgKG5vdyAhPSBsYXN0Q2hrKQorCXsKKwkgICAgbGFzdENoayA9IG5vdzsKKwkgICAgaWYgKCFXaW5kb3dWYWxpZChkcHksIHcpKQorCQlicmVhazsKKwkgICAgLyoKKwkgICAgICogU29tZXRpbWVzIHRoZSBQcm9wZXJ0eUNoYW5nZSBldmVudCBkb2Vzbid0IGNvbWUuCisJICAgICAqIFRoaXMgY2FuIGJlIHNlZW4gaW4gZWc6IHZpbSAtYyAnZWNobyByZW1vdGVfZXhwcigiZ3ZpbSIsICIzKzIiKScKKwkgICAgICovCisJICAgIHNlcnZlckV2ZW50UHJvYyhkcHksIE5VTEwpOworCX0KKwlpZiAobG9jYWxMb29wKQorCXsKKwkgICAgLyogSnVzdCBsb29rIG91dCBmb3IgdGhlIGFuc3dlciB3aXRob3V0IGNhbGxpbmcgYmFjayBpbnRvIFZpbSAqLworI2lmbmRlZiBIQVZFX1NFTEVDVAorCSAgICBzdHJ1Y3QgcG9sbGZkICAgZmRzOworCisJICAgIGZkcy5mZCA9IENvbm5lY3Rpb25OdW1iZXIoZHB5KTsKKwkgICAgZmRzLmV2ZW50cyA9IFBPTExJTjsKKwkgICAgaWYgKHBvbGwoJmZkcywgMSwgU0VORF9NU0VDX1BPTEwpIDwgMCkKKwkJYnJlYWs7CisjZWxzZQorCSAgICBmZF9zZXQJICAgIGZkczsKKwkgICAgc3RydWN0IHRpbWV2YWwgIHR2OworCisJICAgIHR2LnR2X3NlYyA9IDA7CisJICAgIHR2LnR2X3VzZWMgPSAgU0VORF9NU0VDX1BPTEwgKiAxMDAwOworCSAgICBGRF9aRVJPKCZmZHMpOworCSAgICBGRF9TRVQoQ29ubmVjdGlvbk51bWJlcihkcHkpLCAmZmRzKTsKKwkgICAgaWYgKHNlbGVjdChDb25uZWN0aW9uTnVtYmVyKGRweSkgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpIDwgMCkKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgd2hpbGUgKFhFdmVudHNRdWV1ZWQoZHB5LCBRdWV1ZWRBZnRlclJlYWRpbmcpID4gMCkKKwkgICAgeworCQlYTmV4dEV2ZW50KGRweSwgJmV2ZW50KTsKKwkJaWYgKGV2ZW50LnR5cGUgPT0gUHJvcGVydHlOb3RpZnkgJiYgZS0+d2luZG93ID09IGNvbW1XaW5kb3cpCisJCSAgICBzZXJ2ZXJFdmVudFByb2MoZHB5LCAmZXZlbnQpOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChnb3RfaW50KQorCQlicmVhazsKKwkgICAgdWlfZGVsYXkoKGxvbmcpU0VORF9NU0VDX1BPTEwsIFRSVUUpOworCSAgICB1aV9icmVha2NoZWNrKCk7CisJfQorICAgIH0KK30KKworCisvKgorICogRmV0Y2ggYSBsaXN0IG9mIGFsbCB0aGUgVmltIGluc3RhbmNlIG5hbWVzIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUKKyAqIGRpc3BsYXkuCisgKgorICogUmV0dXJucyBhIG5ld2xpbmUgc2VwYXJhdGVkIGxpc3QgaW4gYWxsb2NhdGVkIG1lbW9yeSBvciBOVUxMLgorICovCisgICAgY2hhcl91ICoKK3NlcnZlckdldFZpbU5hbWVzKGRweSkKKyAgICBEaXNwbGF5CSpkcHk7Cit7CisgICAgY2hhcl91CSpyZWdQcm9wOworICAgIGNoYXJfdQkqZW50cnk7CisgICAgY2hhcl91CSpwOworICAgIGxvbmdfdQludW1JdGVtczsKKyAgICBpbnRfdQl3OworICAgIGdhcnJheV9UCWdhOworCisgICAgaWYgKHJlZ2lzdHJ5UHJvcGVydHkgPT0gTm9uZSkKKyAgICB7CisJaWYgKFNlbmRJbml0KGRweSkgPCAwKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ2FfaW5pdDIoJmdhLCAxLCAxMDApOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSByZWdpc3RyeSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBpZiAoR2V0UmVnUHJvcChkcHksICZyZWdQcm9wLCAmbnVtSXRlbXMsIFRSVUUpID09IEZBSUwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIFNjYW4gYWxsIG9mIHRoZSBuYW1lcyBvdXQgb2YgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIGdhX2luaXQyKCZnYSwgMSwgMTAwKTsKKyAgICBmb3IgKHAgPSByZWdQcm9wOyAocCAtIHJlZ1Byb3ApIDwgbnVtSXRlbXM7IHArKykKKyAgICB7CisJZW50cnkgPSBwOworCXdoaWxlICgqcCAhPSAwICYmICFpc3NwYWNlKCpwKSkKKwkgICAgcCsrOworCWlmICgqcCAhPSAwKQorCXsKKwkgICAgdyA9IE5vbmU7CisJICAgIHNzY2FuZigoY2hhciAqKWVudHJ5LCAiJXgiLCAmdyk7CisJICAgIGlmIChXaW5kb3dWYWxpZChkcHksIChXaW5kb3cpdykpCisJICAgIHsKKwkJZ2FfY29uY2F0KCZnYSwgcCArIDEpOworCQlnYV9jb25jYXQoJmdhLCAoY2hhcl91ICopIlxuIik7CisJICAgIH0KKwkgICAgd2hpbGUgKCpwICE9IDApCisJCXArKzsKKwl9CisgICAgfQorICAgIGlmIChyZWdQcm9wICE9IGVtcHR5X3Byb3ApCisJWEZyZWUocmVnUHJvcCk7CisgICAgcmV0dXJuIGdhLmdhX2RhdGE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlcGx5IHN0dWZmCisgKi8KKworICAgIHN0YXRpYyBzdHJ1Y3QgU2VydmVyUmVwbHkgKgorU2VydmVyUmVwbHlGaW5kKHcsIG9wKQorICAgIFdpbmRvdyAgdzsKKyAgICBlbnVtIFNlcnZlclJlcGx5T3Agb3A7Cit7CisgICAgc3RydWN0IFNlcnZlclJlcGx5ICpwOworICAgIHN0cnVjdCBTZXJ2ZXJSZXBseSBlOworICAgIGludAkJaTsKKworICAgIHAgPSAoc3RydWN0IFNlcnZlclJlcGx5ICopIHNlcnZlclJlcGx5LmdhX2RhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IHNlcnZlclJlcGx5LmdhX2xlbjsgaSsrLCBwKyspCisJaWYgKHAtPmlkID09IHcpCisJICAgIGJyZWFrOworICAgIGlmIChpID49IHNlcnZlclJlcGx5LmdhX2xlbikKKwlwID0gTlVMTDsKKworICAgIGlmIChwID09IE5VTEwgJiYgb3AgPT0gU1JPUF9BZGQpCisgICAgeworCWlmIChzZXJ2ZXJSZXBseS5nYV9ncm93c2l6ZSA9PSAwKQorCSAgICBnYV9pbml0Migmc2VydmVyUmVwbHksIHNpemVvZihzdHJ1Y3QgU2VydmVyUmVwbHkpLCAxKTsKKwlpZiAoZ2FfZ3Jvdygmc2VydmVyUmVwbHksIDEpID09IE9LKQorCXsKKwkgICAgcCA9ICgoc3RydWN0IFNlcnZlclJlcGx5ICopIHNlcnZlclJlcGx5LmdhX2RhdGEpCisJCSsgc2VydmVyUmVwbHkuZ2FfbGVuOworCSAgICBlLmlkID0gdzsKKwkgICAgZ2FfaW5pdDIoJmUuc3RyaW5ncywgMSwgMTAwKTsKKwkgICAgbWVtY3B5KHAsICZlLCBzaXplb2YoZSkpOworCSAgICBzZXJ2ZXJSZXBseS5nYV9sZW4rKzsKKwkgICAgc2VydmVyUmVwbHkuZ2Ffcm9vbS0tOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAocCAhPSBOVUxMICYmIG9wID09IFNST1BfRGVsZXRlKQorICAgIHsKKwlnYV9jbGVhcigmcC0+c3RyaW5ncyk7CisJbWNoX21lbW1vdmUocCwgcCArIDEsIChzZXJ2ZXJSZXBseS5nYV9sZW4gLSBpIC0gMSkgKiBzaXplb2YoKnApKTsKKwlzZXJ2ZXJSZXBseS5nYV9sZW4tLTsKKwlzZXJ2ZXJSZXBseS5nYV9yb29tKys7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBDb252ZXJ0IHN0cmluZyB0byB3aW5kb3dpZC4KKyAqIElzc3VlIGFuIGVycm9yIGlmIHRoZSBpZCBpcyBpbnZhbGlkLgorICovCisgICAgV2luZG93CitzZXJ2ZXJTdHJUb1dpbihzdHIpCisgICAgY2hhcl91ICAqc3RyOworeworICAgIHVuc2lnbmVkICBpZCA9IE5vbmU7CisKKyAgICBzc2NhbmYoKGNoYXIgKilzdHIsICIweCV4IiwgJmlkKTsKKyAgICBpZiAoaWQgPT0gTm9uZSkKKwlFTVNHMihfKCJFNTczOiBJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIpLCBzdHIpOworCisgICAgcmV0dXJuIChXaW5kb3cpaWQ7Cit9CisKKy8qCisgKiBTZW5kIGEgcmVwbHkgc3RyaW5nIHRvIGNsaWVudCB3aXRoIGlkICJuYW1lIi4KKyAqIFJldHVybiAtMSBpZiB0aGUgd2luZG93IGlzIGludmFsaWQuCisgKi8KKyAgICBpbnQKK3NlcnZlclNlbmRSZXBseShuYW1lLCBzdHIpCisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqc3RyOworeworICAgIGNoYXJfdQkqcHJvcGVydHk7CisgICAgaW50CQlsZW5ndGg7CisgICAgaW50CQlyZXM7CisgICAgRGlzcGxheQkqZHB5ID0gWF9ESVNQTEFZOworICAgIFdpbmRvdwl3aW4gPSBzZXJ2ZXJTdHJUb1dpbihuYW1lKTsKKworICAgIGlmIChjb21tUHJvcGVydHkgPT0gTm9uZSkKKyAgICB7CisJaWYgKFNlbmRJbml0KGRweSkgPCAwKQorCSAgICByZXR1cm4gLTI7CisgICAgfQorICAgIGlmICghV2luZG93VmFsaWQoZHB5LCB3aW4pKQorCXJldHVybiAtMTsKKworICAgIGxlbmd0aCA9IFNUUkxFTihzdHIpICsgNzsKKyAgICBpZiAoKHByb3BlcnR5ID0gKGNoYXJfdSAqKWFsbG9jKCh1bnNpZ25lZCkgbGVuZ3RoICsgMzApKSAhPSBOVUxMKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopcHJvcGVydHksICIlYyVjJWMtbiAlcyVjLXcgJXgiLAorCQkJICAwLCAnbicsIDAsIHN0ciwgMCwgKHVuc2lnbmVkIGludCljb21tV2luZG93KTsKKwlsZW5ndGggKz0gU1RSTEVOKHByb3BlcnR5ICsgbGVuZ3RoKTsKKwlyZXMgPSBBcHBlbmRQcm9wQ2FyZWZ1bGx5KGRweSwgd2luLCBjb21tUHJvcGVydHksIHByb3BlcnR5LCBsZW5ndGggKyAxKTsKKwl2aW1fZnJlZShwcm9wZXJ0eSk7CisJcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisgICAgc3RhdGljIGludAorV2FpdEZvclJlcGx5KHApCisgICAgdm9pZCAgICAqcDsKK3sKKyAgICBXaW5kb3cgICp3ID0gKFdpbmRvdyAqKSBwOworICAgIHJldHVybiBTZXJ2ZXJSZXBseUZpbmQoKncsIFNST1BfRmluZCkgIT0gTlVMTDsKK30KKworLyoKKyAqIFdhaXQgZm9yIHJlcGxpZXMgZnJvbSBpZCAod2luKQorICogUmV0dXJuIDAgYW5kIHRoZSBtYWxsb2MnZWQgc3RyaW5nIHdoZW4gYSByZXBseSBpcyBhdmFpbGFibGUuCisgKiBSZXR1cm4gLTEgaWYgdGhlIHdpbmRvdyBiZWNvbWVzIGludmFsaWQgd2hpbGUgd2FpdGluZy4KKyAqLworICAgIGludAorc2VydmVyUmVhZFJlcGx5KGRweSwgd2luLCBzdHIsIGxvY2FsTG9vcCkKKyAgICBEaXNwbGF5CSpkcHk7CisgICAgV2luZG93CXdpbjsKKyAgICBjaGFyX3UJKipzdHI7CisgICAgaW50CQlsb2NhbExvb3A7Cit7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpzOworICAgIHN0cnVjdAlTZXJ2ZXJSZXBseSAqcDsKKworICAgIFNlcnZlcldhaXQoZHB5LCB3aW4sIFdhaXRGb3JSZXBseSwgJndpbiwgbG9jYWxMb29wLCAtMSk7CisKKyAgICBpZiAoKHAgPSBTZXJ2ZXJSZXBseUZpbmQod2luLCBTUk9QX0ZpbmQpKSAhPSBOVUxMICYmIHAtPnN0cmluZ3MuZ2FfbGVuID4gMCkKKyAgICB7CisJKnN0ciA9IHZpbV9zdHJzYXZlKHAtPnN0cmluZ3MuZ2FfZGF0YSk7CisJbGVuID0gU1RSTEVOKCpzdHIpICsgMTsKKwlpZiAobGVuIDwgcC0+c3RyaW5ncy5nYV9sZW4pCisJeworCSAgICBzID0gKGNoYXJfdSAqKSBwLT5zdHJpbmdzLmdhX2RhdGE7CisJICAgIG1jaF9tZW1tb3ZlKHMsIHMgKyBsZW4sIHAtPnN0cmluZ3MuZ2FfbGVuIC0gbGVuKTsKKwkgICAgcC0+c3RyaW5ncy5nYV9yb29tICs9IGxlbjsKKwkgICAgcC0+c3RyaW5ncy5nYV9sZW4gLT0gbGVuOworCX0KKwllbHNlCisJeworCSAgICAvKiBMYXN0IHN0cmluZyByZWFkLiAgUmVtb3ZlIGZyb20gbGlzdCAqLworCSAgICBnYV9jbGVhcigmcC0+c3RyaW5ncyk7CisJICAgIFNlcnZlclJlcGx5RmluZCh3aW4sIFNST1BfRGVsZXRlKTsKKwl9CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIENoZWNrIGZvciByZXBsaWVzIGZyb20gaWQgKHdpbikuCisgKiBSZXR1cm4gVFJVRSBhbmQgYSBub24tbWFsbG9jJ2VkIHN0cmluZyBpZiB0aGVyZSBpcy4gIEVsc2UgcmV0dXJuIEZBTFNFLgorICovCisgICAgaW50CitzZXJ2ZXJQZWVrUmVwbHkoZHB5LCB3aW4sIHN0cikKKyAgICBEaXNwbGF5ICpkcHk7CisgICAgV2luZG93IHdpbjsKKyAgICBjaGFyX3UgKipzdHI7Cit7CisgICAgc3RydWN0IFNlcnZlclJlcGx5ICpwOworCisgICAgaWYgKChwID0gU2VydmVyUmVwbHlGaW5kKHdpbiwgU1JPUF9GaW5kKSkgIT0gTlVMTCAmJiBwLT5zdHJpbmdzLmdhX2xlbiA+IDApCisgICAgeworCWlmIChzdHIgIT0gTlVMTCkKKwkgICAgKnN0ciA9IHAtPnN0cmluZ3MuZ2FfZGF0YTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFXaW5kb3dWYWxpZChkcHksIHdpbikpCisJcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGZvciBzZW5kaW5nIGNvbW1hbmRzIGFuZCByZWNlaXZpbmcKKyAqIHJlc3VsdHMuCisgKi8KKyAgICBzdGF0aWMgaW50CitTZW5kSW5pdChkcHkpCisgICAgRGlzcGxheSAqZHB5OworeworICAgIFhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgd2luZG93IHVzZWQgZm9yIGNvbW11bmljYXRpb24sIGFuZCBzZXQgdXAgYW4KKyAgICAgKiBldmVudCBoYW5kbGVyIGZvciBpdC4KKyAgICAgKi8KKyAgICBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoeF9lcnJvcl9jaGVjayk7CisgICAgZ290X3hfZXJyb3IgPSBGQUxTRTsKKworICAgIGlmIChjb21tUHJvcGVydHkgPT0gTm9uZSkKKwljb21tUHJvcGVydHkgPSBYSW50ZXJuQXRvbShkcHksICJDb21tIiwgRmFsc2UpOworICAgIGlmICh2aW1Qcm9wZXJ0eSA9PSBOb25lKQorCXZpbVByb3BlcnR5ID0gWEludGVybkF0b20oZHB5LCAiVmltIiwgRmFsc2UpOworICAgIGlmIChyZWdpc3RyeVByb3BlcnR5ID09IE5vbmUpCisJcmVnaXN0cnlQcm9wZXJ0eSA9IFhJbnRlcm5BdG9tKGRweSwgIlZpbVJlZ2lzdHJ5IiwgRmFsc2UpOworCisgICAgaWYgKGNvbW1XaW5kb3cgPT0gTm9uZSkKKyAgICB7CisJY29tbVdpbmRvdyA9IFhDcmVhdGVTaW1wbGVXaW5kb3coZHB5LCBYRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwKKwkJCQlnZXRwaWQoKSwgMCwgMTAsIDEwLCAwLAorCQkJCVdoaXRlUGl4ZWwoZHB5LCBEZWZhdWx0U2NyZWVuKGRweSkpLAorCQkJCVdoaXRlUGl4ZWwoZHB5LCBEZWZhdWx0U2NyZWVuKGRweSkpKTsKKwlYU2VsZWN0SW5wdXQoZHB5LCBjb21tV2luZG93LCBQcm9wZXJ0eUNoYW5nZU1hc2spOworCS8qIFdBUk5JTkc6IERvIG5vdCBzdGVwIHRocm91Z2ggdGhpcyB3aGlsZSBkZWJ1Z2dpbmcsIGl0IHdpbGwgaGFuZ3VwCisJICogdGhlIFggc2VydmVyISAqLworCVhHcmFiU2VydmVyKGRweSk7CisJRGVsZXRlQW55TGluZ2VyZXIoZHB5LCBjb21tV2luZG93KTsKKwlYVW5ncmFiU2VydmVyKGRweSk7CisgICAgfQorCisgICAgLyogTWFrZSB3aW5kb3cgcmVjb2duaXphYmxlIGFzIGEgdmltIHdpbmRvdyAqLworICAgIFhDaGFuZ2VQcm9wZXJ0eShkcHksIGNvbW1XaW5kb3csIHZpbVByb3BlcnR5LCBYQV9TVFJJTkcsCisJCSAgICA4LCBQcm9wTW9kZVJlcGxhY2UsIChjaGFyX3UgKilWSU1fVkVSU0lPTl9TSE9SVCwKKwkJCShpbnQpU1RSTEVOKFZJTV9WRVJTSU9OX1NIT1JUKSArIDEpOworCisgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgKHZvaWQpWFNldEVycm9ySGFuZGxlcihvbGRfaGFuZGxlcik7CisKKyAgICByZXR1cm4gZ290X3hfZXJyb3IgPyAtMSA6IDA7Cit9CisKKy8qCisgKiBHaXZlbiBhIHNlcnZlciBuYW1lLCBzZWUgaWYgdGhlIG5hbWUgZXhpc3RzIGluIHRoZSByZWdpc3RyeSBmb3IgYQorICogcGFydGljdWxhciBkaXNwbGF5LgorICoKKyAqIElmIHRoZSBnaXZlbiBuYW1lIGlzIHJlZ2lzdGVyZWQsIHJldHVybiB0aGUgSUQgb2YgdGhlIHdpbmRvdyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBuYW1lLiAgSWYgdGhlIG5hbWUgaXNuJ3QgcmVnaXN0ZXJlZCwgdGhlbiByZXR1cm4gMC4KKyAqCisgKiBTaWRlIGVmZmVjdHM6CisgKglJZiB0aGUgcmVnaXN0cnkgcHJvcGVydHkgaXMgaW1wcm9wZXJseSBmb3JtZWQsIHRoZW4gaXQgaXMgZGVsZXRlZC4KKyAqCUlmICJkZWxldGUiIGlzIG5vbi16ZXJvLCB0aGVuIGlmIHRoZSBuYW1lZCBzZXJ2ZXIgaXMgZm91bmQgaXQgaXMKKyAqCXJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cnkgcHJvcGVydHkuCisgKi8KKyAgICBzdGF0aWMgV2luZG93CitMb29rdXBOYW1lKGRweSwgbmFtZSwgZGVsZXRlLCBsb29zZSkKKyAgICBEaXNwbGF5CSpkcHk7CSAgICAvKiBEaXNwbGF5IHdob3NlIHJlZ2lzdHJ5IHRvIGNoZWNrLiAqLworICAgIGNoYXJfdQkqbmFtZTsJICAgIC8qIE5hbWUgb2YgYSBzZXJ2ZXIuICovCisgICAgaW50CQlkZWxldGU7CSAgICAvKiBJZiBub24temVybywgZGVsZXRlIGluZm8gYWJvdXQgbmFtZS4gKi8KKyAgICBjaGFyX3UJKipsb29zZTsgICAgLyogRG8gYW5vdGhlciBzZWFyY2ggbWF0Y2hpbmcgLTk5OSBpZiBub3QgZm91bmQKKwkJCSAgICAgICBSZXR1cm4gcmVzdWx0IGhlcmUgaWYgYSBtYXRjaCBpcyBmb3VuZCAqLworeworICAgIGNoYXJfdQkqcmVnUHJvcCwgKmVudHJ5OworICAgIGNoYXJfdQkqcDsKKyAgICBsb25nX3UJbnVtSXRlbXM7CisgICAgaW50X3UJcmV0dXJuVmFsdWU7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIHJlZ2lzdHJ5IHByb3BlcnR5LgorICAgICAqLworICAgIGlmIChHZXRSZWdQcm9wKGRweSwgJnJlZ1Byb3AsICZudW1JdGVtcywgRkFMU0UpID09IEZBSUwpCisJcmV0dXJuIDA7CisKKyAgICAvKgorICAgICAqIFNjYW4gdGhlIHByb3BlcnR5IGZvciB0aGUgZGVzaXJlZCBuYW1lLgorICAgICAqLworICAgIHJldHVyblZhbHVlID0gKGludF91KU5vbmU7CisgICAgZW50cnkgPSBOVUxMOwkvKiBOb3QgbmVlZGVkLCBidXQgZWxpbWluYXRlcyBjb21waWxlciB3YXJuaW5nLiAqLworICAgIGZvciAocCA9IHJlZ1Byb3A7IChwIC0gcmVnUHJvcCkgPCBudW1JdGVtczsgKQorICAgIHsKKwllbnRyeSA9IHA7CisJd2hpbGUgKCpwICE9IDAgJiYgIWlzc3BhY2UoKnApKQorCSAgICBwKys7CisJaWYgKCpwICE9IDAgJiYgU1RSSUNNUChuYW1lLCBwICsgMSkgPT0gMCkKKwl7CisJICAgIHNzY2FuZigoY2hhciAqKWVudHJ5LCAiJXgiLCAmcmV0dXJuVmFsdWUpOworCSAgICBicmVhazsKKwl9CisJd2hpbGUgKCpwICE9IDApCisJICAgIHArKzsKKwlwKys7CisgICAgfQorCisgICAgaWYgKGxvb3NlICE9IE5VTEwgJiYgcmV0dXJuVmFsdWUgPT0gKGludF91KU5vbmUgJiYgIUlzU2VyaWFsTmFtZShuYW1lKSkKKyAgICB7CisJZm9yIChwID0gcmVnUHJvcDsgKHAgLSByZWdQcm9wKSA8IG51bUl0ZW1zOyApCisJeworCSAgICBlbnRyeSA9IHA7CisJICAgIHdoaWxlICgqcCAhPSAwICYmICFpc3NwYWNlKCpwKSkKKwkJcCsrOworCSAgICBpZiAoKnAgIT0gMCAmJiBJc1NlcmlhbE5hbWUocCArIDEpCisJCSAgICAmJiBTVFJOSUNNUChuYW1lLCBwICsgMSwgU1RSTEVOKG5hbWUpKSA9PSAwKQorCSAgICB7CisJCXNzY2FuZigoY2hhciAqKWVudHJ5LCAiJXgiLCAmcmV0dXJuVmFsdWUpOworCQkqbG9vc2UgPSB2aW1fc3Ryc2F2ZShwICsgMSk7CisJCWJyZWFrOworCSAgICB9CisJICAgIHdoaWxlICgqcCAhPSAwKQorCQlwKys7CisJICAgIHArKzsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWxldGUgdGhlIHByb3BlcnR5LCBpZiB0aGF0IGlzIGRlc2lyZWQgKGNvcHkgZG93biB0aGUKKyAgICAgKiByZW1haW5kZXIgb2YgdGhlIHJlZ2lzdHJ5IHByb3BlcnR5IHRvIG92ZXJsYXkgdGhlIGRlbGV0ZWQKKyAgICAgKiBpbmZvLCB0aGVuIHJld3JpdGUgdGhlIHByb3BlcnR5KS4KKyAgICAgKi8KKyAgICBpZiAoZGVsZXRlICYmIHJldHVyblZhbHVlICE9IChpbnRfdSlOb25lKQorICAgIHsKKwlpbnQgY291bnQ7CisKKwl3aGlsZSAoKnAgIT0gMCkKKwkgICAgcCsrOworCXArKzsKKwljb3VudCA9IG51bUl0ZW1zIC0gKHAgLSByZWdQcm9wKTsKKwlpZiAoY291bnQgPiAwKQorCSAgICBtZW1jcHkoZW50cnksIHAsIGNvdW50KTsKKwlYQ2hhbmdlUHJvcGVydHkoZHB5LCBSb290V2luZG93KGRweSwgMCksIHJlZ2lzdHJ5UHJvcGVydHksIFhBX1NUUklORywKKwkJCTgsIFByb3BNb2RlUmVwbGFjZSwgcmVnUHJvcCwKKwkJCShpbnQpKG51bUl0ZW1zIC0gKHAgLSBlbnRyeSkpKTsKKwlYU3luYyhkcHksIEZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAocmVnUHJvcCAhPSBlbXB0eV9wcm9wKQorCVhGcmVlKHJlZ1Byb3ApOworICAgIHJldHVybiAoV2luZG93KXJldHVyblZhbHVlOworfQorCisvKgorICogRGVsZXRlIGFueSBsaW5nZXJpbmcgb2NjdXJlbmNlcyBvZiB3aW5kb3cgaWQuICBXZSBwcm9taXNlIHRoYXQgYW55CisgKiBvY2N1cmVuY2VzIGlzIG5vdCBvdXJzIHNpbmNlIGl0IGlzIG5vdCB5ZXQgcHV0IGludG8gdGhlIHJlZ2lzdHJ5IChieSB1cykKKyAqCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICogMS4gVGhlcmUgaXMgYW4gb2xkIHdpbmRvd2lkIGZvciBhbiBleGl0J2VkIHZpbSBpbiB0aGUgcmVnaXN0cnkKKyAqIDIuIFdlIGdldCB0aGF0IGlkIGZvciBvdXIgY29tbVdpbmRvdyBidXQgb25seSB3YW50IHRvIHNlbmQsIG5vdCByZWdpc3Rlci4KKyAqIDMuIFRoZSB3aW5kb3cgd2lsbCBtaXN0YWtlbmx5IGJlIHJlZ2FyZGVkIHZhbGlkIGJlY2F1c2Ugb2Ygb3duIGNvbW1XaW5kb3cKKyAqLworICAgIHN0YXRpYyB2b2lkCitEZWxldGVBbnlMaW5nZXJlcihkcHksIHdpbikKKyAgICBEaXNwbGF5CSpkcHk7CS8qIERpc3BsYXkgd2hvc2UgcmVnaXN0cnkgdG8gY2hlY2suICovCisgICAgV2luZG93CXdpbjsJLyogV2luZG93IHRvIHJlbW92ZSAqLworeworICAgIGNoYXJfdQkqcmVnUHJvcCwgKmVudHJ5ID0gTlVMTDsKKyAgICBjaGFyX3UJKnA7CisgICAgbG9uZ191CW51bUl0ZW1zOworICAgIFdpbmRvdwl3d2luOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSByZWdpc3RyeSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBpZiAoR2V0UmVnUHJvcChkcHksICZyZWdQcm9wLCAmbnVtSXRlbXMsIEZBTFNFKSA9PSBGQUlMKQorCXJldHVybjsKKworICAgIC8qIFNjYW4gdGhlIHByb3BlcnR5IGZvciB0aGUgd2luZG93IGlkLiAgKi8KKyAgICBmb3IgKHAgPSByZWdQcm9wOyAocCAtIHJlZ1Byb3ApIDwgbnVtSXRlbXM7ICkKKyAgICB7CisJaWYgKCpwICE9IDApCisJeworCSAgICBzc2NhbmYoKGNoYXIgKilwLCAiJXgiLCAoaW50X3UgKikmd3dpbik7CisJICAgIGlmICh3d2luID09IHdpbikKKwkgICAgeworCQlpbnQgbGFzdEhhbGY7CisKKwkJLyogQ29weSBkb3duIHRoZSByZW1haW5kZXIgdG8gZGVsZXRlIGVudHJ5ICovCisJCWVudHJ5ID0gcDsKKwkJd2hpbGUgKCpwICE9IDApCisJCSAgICBwKys7CisJCXArKzsKKwkJbGFzdEhhbGYgPSBudW1JdGVtcyAtIChwIC0gcmVnUHJvcCk7CisJCWlmIChsYXN0SGFsZiA+IDApCisJCSAgICBtZW1jcHkoZW50cnksIHAsIGxhc3RIYWxmKTsKKwkJbnVtSXRlbXMgPSAoZW50cnkgLSByZWdQcm9wKSArIGxhc3RIYWxmOworCQlwID0gZW50cnk7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCXdoaWxlICgqcCAhPSAwKQorCSAgICBwKys7CisJcCsrOworICAgIH0KKworICAgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKwlYQ2hhbmdlUHJvcGVydHkoZHB5LCBSb290V2luZG93KGRweSwgMCksIHJlZ2lzdHJ5UHJvcGVydHksCisJCQlYQV9TVFJJTkcsIDgsIFByb3BNb2RlUmVwbGFjZSwgcmVnUHJvcCwKKwkJCShpbnQpKHAgLSByZWdQcm9wKSk7CisJWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgfQorCisgICAgaWYgKHJlZ1Byb3AgIT0gZW1wdHlfcHJvcCkKKwlYRnJlZShyZWdQcm9wKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIHJlZ2lzdHJ5IHByb3BlcnR5LiAgRGVsZXRlIGl0IHdoZW4gaXQncyBmb3JtYXR0ZWQgd3JvbmcuCisgKiBSZXR1cm4gdGhlIHByb3BlcnR5IGluICJyZWdQcm9wcCIuICAiZW1wdHlfcHJvcCIgaXMgdXNlZCB3aGVuIGl0IGRvZXNuJ3QKKyAqIGV4aXN0IHlldC4KKyAqIFJldHVybiBPSyB3aGVuIHN1Y2Nlc3NmdWwuCisgKi8KKyAgICBzdGF0aWMgaW50CitHZXRSZWdQcm9wKGRweSwgcmVnUHJvcHAsIG51bUl0ZW1zcCwgZG9tc2cpCisgICAgRGlzcGxheQkqZHB5OworICAgIGNoYXJfdQkqKnJlZ1Byb3BwOworICAgIGxvbmdfdQkqbnVtSXRlbXNwOworICAgIGludAkJZG9tc2c7CQkvKiBXaGVuIFRSVUUgZ2l2ZSBlcnJvciBtZXNzYWdlLiAqLworeworICAgIGludAkJcmVzdWx0LCBhY3R1YWxGb3JtYXQ7CisgICAgbG9uZ191CWJ5dGVzQWZ0ZXI7CisgICAgQXRvbQlhY3R1YWxUeXBlOworCisgICAgKnJlZ1Byb3BwID0gTlVMTDsKKyAgICByZXN1bHQgPSBYR2V0V2luZG93UHJvcGVydHkoZHB5LCBSb290V2luZG93KGRweSwgMCksIHJlZ2lzdHJ5UHJvcGVydHksIDBMLAorCQkJCShsb25nKU1BWF9QUk9QX1dPUkRTLCBGYWxzZSwKKwkJCQlYQV9TVFJJTkcsICZhY3R1YWxUeXBlLAorCQkJCSZhY3R1YWxGb3JtYXQsIG51bUl0ZW1zcCwgJmJ5dGVzQWZ0ZXIsCisJCQkJcmVnUHJvcHApOworCisgICAgaWYgKGFjdHVhbFR5cGUgPT0gTm9uZSkKKyAgICB7CisJLyogTm8gcHJvcCB5ZXQuIExvZ2ljYWxseSBlcXVhbCB0byB0aGUgZW1wdHkgbGlzdCAqLworCSpudW1JdGVtc3AgPSAwOworCSpyZWdQcm9wcCA9IGVtcHR5X3Byb3A7CisJcmV0dXJuIE9LOworICAgIH0KKworICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBpcyBpbXByb3Blcmx5IGZvcm1lZCwgdGhlbiBkZWxldGUgaXQuICovCisgICAgaWYgKHJlc3VsdCAhPSBTdWNjZXNzIHx8IGFjdHVhbEZvcm1hdCAhPSA4IHx8IGFjdHVhbFR5cGUgIT0gWEFfU1RSSU5HKQorICAgIHsKKwlpZiAoKnJlZ1Byb3BwICE9IE5VTEwpCisJICAgIFhGcmVlKCpyZWdQcm9wcCk7CisJWERlbGV0ZVByb3BlcnR5KGRweSwgUm9vdFdpbmRvdyhkcHksIDApLCByZWdpc3RyeVByb3BlcnR5KTsKKwlpZiAoZG9tc2cpCisJICAgIEVNU0coXygiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIikpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIGJ5IHRoZSB2YXJvdXMgWCBldmVudCBsb29wcyB0aHJvdWdob3V0IFZpbXMgd2hlbgorICogYSBwcm9wZXJ0eSBjaGFuZ2VzIG9uIHRoZSBjb21tdW5pY2F0aW9uIHdpbmRvdy4gIFRoaXMgcHJvY2VkdXJlIHJlYWRzIHRoZQorICogcHJvcGVydHkgYW5kIGhhbmRsZXMgY29tbWFuZCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLgorICovCisgICAgdm9pZAorc2VydmVyRXZlbnRQcm9jKGRweSwgZXZlbnRQdHIpCisgICAgRGlzcGxheQkqZHB5OworICAgIFhFdmVudAkqZXZlbnRQdHI7CQkvKiBJbmZvcm1hdGlvbiBhYm91dCBldmVudC4gKi8KK3sKKyAgICBjaGFyX3UJKnByb3BJbmZvOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXJlc3VsdCwgYWN0dWFsRm9ybWF0LCBjb2RlOworICAgIGxvbmdfdQludW1JdGVtcywgYnl0ZXNBZnRlcjsKKyAgICBBdG9tCWFjdHVhbFR5cGU7CisKKyAgICBpZiAoZXZlbnRQdHIgIT0gTlVMTCkKKyAgICB7CisJaWYgKGV2ZW50UHRyLT54cHJvcGVydHkuYXRvbSAhPSBjb21tUHJvcGVydHkKKwkJfHwgZXZlbnRQdHItPnhwcm9wZXJ0eS5zdGF0ZSAhPSBQcm9wZXJ0eU5ld1ZhbHVlKQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBjb21tIHByb3BlcnR5IGFuZCBkZWxldGUgaXQuCisgICAgICovCisgICAgcHJvcEluZm8gPSBOVUxMOworICAgIHJlc3VsdCA9IFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIGNvbW1XaW5kb3csIGNvbW1Qcm9wZXJ0eSwgMEwsCisJCQkJKGxvbmcpTUFYX1BST1BfV09SRFMsIFRydWUsCisJCQkJWEFfU1RSSU5HLCAmYWN0dWFsVHlwZSwKKwkJCQkmYWN0dWFsRm9ybWF0LCAmbnVtSXRlbXMsICZieXRlc0FmdGVyLAorCQkJCSZwcm9wSW5mbyk7CisKKyAgICAvKiBJZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCBvciBpcyBpbXByb3Blcmx5IGZvcm1lZCB0aGVuIGlnbm9yZSBpdC4gKi8KKyAgICBpZiAocmVzdWx0ICE9IFN1Y2Nlc3MgfHwgYWN0dWFsVHlwZSAhPSBYQV9TVFJJTkcgfHwgYWN0dWFsRm9ybWF0ICE9IDgpCisgICAgeworCWlmIChwcm9wSW5mbyAhPSBOVUxMKQorCSAgICBYRnJlZShwcm9wSW5mbyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogU2V2ZXJhbCBjb21tYW5kcyBhbmQgcmVzdWx0cyBjb3VsZCBhcnJpdmUgaW4gdGhlIHByb3BlcnR5IGF0CisgICAgICogb25lIHRpbWU7ICBlYWNoIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBvdXRlciBsb29wIGhhbmRsZXMgYQorICAgICAqIHNpbmdsZSBjb21tYW5kIG9yIHJlc3VsdC4KKyAgICAgKi8KKyAgICBmb3IgKHAgPSBwcm9wSW5mbzsgKHAgLSBwcm9wSW5mbykgPCBudW1JdGVtczsgKQorICAgIHsKKwkvKgorCSAqIElnbm9yZSBsZWFkaW5nIE5VTHM7IGVhY2ggY29tbWFuZCBvciByZXN1bHQgc3RhcnRzIHdpdGggYQorCSAqIE5VTCBzbyB0aGF0IG5vIG1hdHRlciBob3cgYmFkbHkgZm9ybWVkIGEgcHJlY2VkaW5nIGNvbW1hbmQKKwkgKiBpcywgd2UnbGwgYmUgYWJsZSB0byB0ZWxsIHRoYXQgYSBuZXcgY29tbWFuZC9yZXN1bHQgaXMKKwkgKiBzdGFydGluZy4KKwkgKi8KKwlpZiAoKnAgPT0gMCkKKwl7CisJICAgIHArKzsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCgqcCA9PSAnYycgfHwgKnAgPT0gJ2snKSAmJiAocFsxXSA9PSAwKSkKKwl7CisJICAgIFdpbmRvdwlyZXNXaW5kb3c7CisJICAgIGNoYXJfdQkqbmFtZSwgKnNjcmlwdCwgKnNlcmlhbCwgKmVuZCwgKnJlczsKKwkgICAgQm9vbAlhc0tleXMgPSAqcCA9PSAnayc7CisJICAgIGdhcnJheV9UCXJlcGx5OworCisJICAgIC8qCisJICAgICAqIFRoaXMgaXMgYW4gaW5jb21pbmcgY29tbWFuZCBmcm9tIHNvbWUgb3RoZXIgYXBwbGljYXRpb24uCisJICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgb2YgaXRzIG9wdGlvbnMuICBTdG9wIHdoZW4gd2UgcmVhY2gKKwkgICAgICogdGhlIGVuZCBvZiB0aGUgcHJvcGVydHkgb3Igc29tZXRoaW5nIHRoYXQgZG9lc24ndCBsb29rCisJICAgICAqIGxpa2UgYW4gb3B0aW9uLgorCSAgICAgKi8KKwkgICAgcCArPSAyOworCSAgICBuYW1lID0gTlVMTDsKKwkgICAgcmVzV2luZG93ID0gTm9uZTsKKwkgICAgc2VyaWFsID0gKGNoYXJfdSAqKSIiOworCSAgICBzY3JpcHQgPSBOVUxMOworCSAgICB3aGlsZSAocCAtIHByb3BJbmZvIDwgbnVtSXRlbXMgJiYgKnAgPT0gJy0nKQorCSAgICB7CisJCXN3aXRjaCAocFsxXSkKKwkJeworCQkgICAgY2FzZSAncic6CisJCQllbmQgPSBza2lwd2hpdGUocCArIDIpOworCQkJcmVzV2luZG93ID0gMDsKKwkJCXdoaWxlICh2aW1faXN4ZGlnaXQoKmVuZCkpCisJCQl7CisJCQkgICAgcmVzV2luZG93ID0gMTYgKiByZXNXaW5kb3cgKyAobG9uZ191KWhleDJucigqZW5kKTsKKwkJCSAgICArK2VuZDsKKwkJCX0KKwkJCWlmIChlbmQgPT0gcCArIDIgfHwgKmVuZCAhPSAnICcpCisJCQkgICAgcmVzV2luZG93ID0gTm9uZTsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBwID0gc2VyaWFsID0gZW5kICsgMTsKKwkJCSAgICBjbGllbnRXaW5kb3cgPSByZXNXaW5kb3c7IC8qIFJlbWVtYmVyIGluIGdsb2JhbCAqLworCQkJfQorCQkJYnJlYWs7CisJCSAgICBjYXNlICduJzoKKwkJCWlmIChwWzJdID09ICcgJykKKwkJCSAgICBuYW1lID0gcCArIDM7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ3MnOgorCQkJaWYgKHBbMl0gPT0gJyAnKQorCQkJICAgIHNjcmlwdCA9IHAgKyAzOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKCpwICE9IDApCisJCSAgICBwKys7CisJCXArKzsKKwkgICAgfQorCisJICAgIGlmIChzY3JpcHQgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisJCWNvbnRpbnVlOworCisJICAgIC8qCisJICAgICAqIEluaXRpYWxpemUgdGhlIHJlc3VsdCBwcm9wZXJ0eSwgc28gdGhhdCB3ZSdyZSByZWFkeSBhdCBhbnkKKwkgICAgICogdGltZSBpZiB3ZSBuZWVkIHRvIHJldHVybiBhbiBlcnJvci4KKwkgICAgICovCisJICAgIGlmIChyZXNXaW5kb3cgIT0gTm9uZSkKKwkgICAgeworCQlnYV9pbml0MigmcmVwbHksIDEsIDEwMCk7CisJCWdhX2dyb3coJnJlcGx5LCA1MCk7CisJCXNwcmludGYocmVwbHkuZ2FfZGF0YSwgIiVjciVjLXMgJXMlYy1yICIsIDAsIDAsIHNlcmlhbCwgMCk7CisJCXJlcGx5LmdhX2xlbiA9IDEwICsgU1RSTEVOKHNlcmlhbCk7CisJCXJlcGx5LmdhX3Jvb20gLT0gcmVwbHkuZ2FfbGVuOworCSAgICB9CisJICAgIHJlcyA9IE5VTEw7CisJICAgIGlmIChzZXJ2ZXJOYW1lICE9IE5VTEwgJiYgU1RSSUNNUChuYW1lLCBzZXJ2ZXJOYW1lKSA9PSAwKQorCSAgICB7CisJCWlmIChhc0tleXMpCisJCSAgICBzZXJ2ZXJfdG9faW5wdXRfYnVmKHNjcmlwdCk7CisJCWVsc2UKKwkJICAgIHJlcyA9IGV2YWxfY2xpZW50X2V4cHJfdG9fc3RyaW5nKHNjcmlwdCk7CisJICAgIH0KKwkgICAgaWYgKHJlc1dpbmRvdyAhPSBOb25lKQorCSAgICB7CisJCWlmIChyZXMgIT0gTlVMTCkKKwkJICAgIGdhX2NvbmNhdCgmcmVwbHksIHJlcyk7CisJCWVsc2UgaWYgKGFzS2V5cyA9PSAwKQorCQl7CisJCSAgICBnYV9jb25jYXQoJnJlcGx5LCAoY2hhcl91ICopXyhlX2ludmV4cHJtc2cpKTsKKwkJICAgIGdhX2FwcGVuZCgmcmVwbHksIDApOworCQkgICAgZ2FfY29uY2F0KCZyZXBseSwgKGNoYXJfdSAqKSItYyAxIik7CisJCX0KKwkJZ2FfYXBwZW5kKCZyZXBseSwgMCk7CisJCSh2b2lkKUFwcGVuZFByb3BDYXJlZnVsbHkoZHB5LCByZXNXaW5kb3csIGNvbW1Qcm9wZXJ0eSwKKwkJCQkJICAgcmVwbHkuZ2FfZGF0YSwgcmVwbHkuZ2FfbGVuKTsKKwkgICAgfQorCSAgICB2aW1fZnJlZShyZXMpOworCX0KKwllbHNlIGlmICgqcCA9PSAncicgJiYgcFsxXSA9PSAwKQorCXsKKwkgICAgaW50CSAgICBzZXJpYWwsIGdvdFNlcmlhbDsKKwkgICAgY2hhcl91ICAqcmVzOworCSAgICBQZW5kaW5nQ29tbWFuZCAqcGNQdHI7CisKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyBhIHJlcGx5IHRvIHNvbWUgY29tbWFuZCB0aGF0IHdlIHNlbnQgb3V0LiAgSXRlcmF0ZQorCSAgICAgKiBvdmVyIGFsbCBvZiBpdHMgb3B0aW9ucy4gIFN0b3Agd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQorCSAgICAgKiBwcm9wZXJ0eSBvciBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBhbiBvcHRpb24uCisJICAgICAqLworCSAgICBwICs9IDI7CisJICAgIGdvdFNlcmlhbCA9IDA7CisJICAgIHJlcyA9IChjaGFyX3UgKikiIjsKKwkgICAgY29kZSA9IDA7CisJICAgIHdoaWxlICgocC1wcm9wSW5mbykgPCBudW1JdGVtcyAmJiAqcCA9PSAnLScpCisJICAgIHsKKwkJc3dpdGNoIChwWzFdKQorCQl7CisJCSAgICBjYXNlICdyJzoKKwkJCWlmIChwWzJdID09ICcgJykKKwkJCSAgICByZXMgPSBwICsgMzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAncyc6CisJCQlpZiAoc3NjYW5mKChjaGFyICopcCArIDIsICIgJWQiLCAmc2VyaWFsKSA9PSAxKQorCQkJICAgIGdvdFNlcmlhbCA9IDE7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ2MnOgorCQkJaWYgKHNzY2FuZigoY2hhciAqKXAgKyAyLCAiICVkIiwgJmNvZGUpICE9IDEpCisJCQkgICAgY29kZSA9IDA7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoKnAgIT0gMCkKKwkJICAgIHArKzsKKwkJcCsrOworCSAgICB9CisKKwkgICAgaWYgKCFnb3RTZXJpYWwpCisJCWNvbnRpbnVlOworCisJICAgIC8qCisJICAgICAqIEdpdmUgdGhlIHJlc3VsdCBpbmZvcm1hdGlvbiB0byBhbnlvbmUgd2hvJ3MKKwkgICAgICogd2FpdGluZyBmb3IgaXQuCisJICAgICAqLworCSAgICBmb3IgKHBjUHRyID0gcGVuZGluZ0NvbW1hbmRzOyBwY1B0ciAhPSBOVUxMOyBwY1B0ciA9IHBjUHRyLT5uZXh0UHRyKQorCSAgICB7CisJCWlmIChzZXJpYWwgIT0gcGNQdHItPnNlcmlhbCB8fCBwY1B0ci0+cmVzdWx0ICE9IE5VTEwpCisJCSAgICBjb250aW51ZTsKKworCQlwY1B0ci0+Y29kZSA9IGNvZGU7CisJCWlmIChyZXMgIT0gTlVMTCkKKwkJICAgIHBjUHRyLT5yZXN1bHQgPSB2aW1fc3Ryc2F2ZShyZXMpOworCQllbHNlCisJCSAgICBwY1B0ci0+cmVzdWx0ID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSIiKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoKnAgPT0gJ24nICYmIHBbMV0gPT0gMCkKKwl7CisJICAgIFdpbmRvdwl3aW4gPSAwOworCSAgICB1bnNpZ25lZCBpbnQgdTsKKwkgICAgaW50CQlnb3RXaW5kb3c7CisJICAgIGNoYXJfdQkqc3RyOworCSAgICBjaGFyX3UJd2luc3RyWzMwXTsKKwkgICAgc3RydWN0CVNlcnZlclJlcGx5ICpyOworCisJICAgIC8qCisJICAgICAqIFRoaXMgaXMgYSAobilvdGlmaWNhdGlvbi4gIFNlbnQgd2l0aCBzZXJ2ZXJyZXBseV9zZW5kIGluIFZpbUwuCisJICAgICAqIEV4ZWN1dGUgYW55IGF1dG9jb21tYW5kIGFuZCBzYXZlIGl0IGZvciBsYXRlciByZXRyaWV2YWwKKwkgICAgICovCisJICAgIHAgKz0gMjsKKwkgICAgZ290V2luZG93ID0gMDsKKwkgICAgc3RyID0gKGNoYXJfdSAqKSIiOworCSAgICB3aGlsZSAoKHAtcHJvcEluZm8pIDwgbnVtSXRlbXMgJiYgKnAgPT0gJy0nKQorCSAgICB7CisJCXN3aXRjaCAocFsxXSkKKwkJeworCQkgICAgY2FzZSAnbic6CisJCQlpZiAocFsyXSA9PSAnICcpCisJCQkgICAgc3RyID0gcCArIDM7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ3cnOgorCQkJaWYgKHNzY2FuZigoY2hhciAqKXAgKyAyLCAiICV4IiwgJnUpID09IDEpCisJCQl7CisJCQkgICAgd2luID0gdTsKKwkJCSAgICBnb3RXaW5kb3cgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKCpwICE9IDApCisJCSAgICBwKys7CisJCXArKzsKKwkgICAgfQorCisJICAgIGlmICghZ290V2luZG93KQorCQljb250aW51ZTsKKwkgICAgaWYgKChyID0gU2VydmVyUmVwbHlGaW5kKHdpbiwgU1JPUF9BZGQpKSAhPSBOVUxMKQorCSAgICB7CisJCWdhX2NvbmNhdCgmKHItPnN0cmluZ3MpLCBzdHIpOworCQlnYV9hcHBlbmQoJihyLT5zdHJpbmdzKSwgMCk7CisJICAgIH0KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgc3ByaW50ZigoY2hhciAqKXdpbnN0ciwgIjB4JXgiLCAodW5zaWduZWQgaW50KXdpbik7CisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1JFTU9URVJFUExZLCB3aW5zdHIsIHN0ciwgVFJVRSwgY3VyYnVmKTsKKyNlbmRpZgorCisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIERpZG4ndCByZWNvZ25pemUgdGhpcyB0aGluZy4gIEp1c3Qgc2tpcCB0aHJvdWdoIHRoZSBuZXh0CisJICAgICAqIG51bGwgY2hhcmFjdGVyIGFuZCB0cnkgYWdhaW4uCisJICAgICAqIEV2ZW4gaWYgd2UgZ2V0IGFuICdyJyhlcGx5KSB3ZSB3aWxsIHRocm93IGl0IGF3YXkgYXMgd2UKKwkgICAgICogbmV2ZXIgc3BlY2lmeSAoYW5kIHRodXMgZXhwZWN0KSBvbmUKKwkgICAgICovCisJICAgIHdoaWxlICgqcCAhPSAwKQorCQlwKys7CisJICAgIHArKzsKKwl9CisgICAgfQorICAgIFhGcmVlKHByb3BJbmZvKTsKK30KKworLyoKKyAqIEFwcGVuZCBhIGdpdmVuIHByb3BlcnR5IHRvIGEgZ2l2ZW4gd2luZG93LCBidXQgc2V0IHVwIGFuIFggZXJyb3IgaGFuZGxlciBzbworICogdGhhdCBpZiB0aGUgYXBwZW5kIGZhaWxzIHRoaXMgcHJvY2VkdXJlIGNhbiByZXR1cm4gYW4gZXJyb3IgY29kZSByYXRoZXIKKyAqIHRoYW4gaGF2aW5nIFhsaWIgcGFuaWMuCisgKiBSZXR1cm46IDAgZm9yIE9LLCAtMSBmb3IgZXJyb3IKKyAqLworICAgIHN0YXRpYyBpbnQKK0FwcGVuZFByb3BDYXJlZnVsbHkoZHB5LCB3aW5kb3csIHByb3BlcnR5LCB2YWx1ZSwgbGVuZ3RoKQorICAgIERpc3BsYXkJKmRweTsJCS8qIERpc3BsYXkgb24gd2hpY2ggdG8gb3BlcmF0ZS4gKi8KKyAgICBXaW5kb3cJd2luZG93OwkJLyogV2luZG93IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIG1vZGlmaWVkLiAqLworICAgIEF0b20JcHJvcGVydHk7CS8qIE5hbWUgb2YgcHJvcGVydHkuICovCisgICAgY2hhcl91CSp2YWx1ZTsJCS8qIENoYXJhY3RlcnMgIHRvIGFwcGVuZCB0byBwcm9wZXJ0eS4gKi8KKyAgICBpbnQJCWxlbmd0aDsJCS8qIEhvdyBtdWNoIHRvIGFwcGVuZCAqLworeworICAgIFhFcnJvckhhbmRsZXIgb2xkX2hhbmRsZXI7CisKKyAgICBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoeF9lcnJvcl9jaGVjayk7CisgICAgZ290X3hfZXJyb3IgPSBGQUxTRTsKKyAgICBYQ2hhbmdlUHJvcGVydHkoZHB5LCB3aW5kb3csIHByb3BlcnR5LCBYQV9TVFJJTkcsIDgsCisJCQkJCSAgICAgICBQcm9wTW9kZUFwcGVuZCwgdmFsdWUsIGxlbmd0aCk7CisgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgKHZvaWQpIFhTZXRFcnJvckhhbmRsZXIob2xkX2hhbmRsZXIpOworICAgIHJldHVybiBnb3RfeF9lcnJvciA/IC0xIDogMDsKK30KKworCisvKgorICogQW5vdGhlciBYIEVycm9yIGhhbmRsZXIsIGp1c3QgdXNlZCB0byBjaGVjayBmb3IgZXJyb3JzLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK3hfZXJyb3JfY2hlY2soZHB5LCBlcnJvcl9ldmVudCkKKyAgICBEaXNwbGF5CSpkcHk7CisgICAgWEVycm9yRXZlbnQJKmVycm9yX2V2ZW50OworeworICAgIGdvdF94X2Vycm9yID0gVFJVRTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmICJzdHIiIGxvb2tzIGxpa2UgaXQgaGFkIGEgc2VyaWFsIG51bWJlciBhcHBlbmRlZC4KKyAqIEFjdHVhbGx5IGp1c3QgY2hlY2tzIGlmIHRoZSBuYW1lIGVuZHMgaW4gYSBkaWdpdC4KKyAqLworICAgIHN0YXRpYyBpbnQKK0lzU2VyaWFsTmFtZShzdHIpCisgICAgY2hhcl91CSpzdHI7Cit7CisgICAgaW50IGxlbiA9IFNUUkxFTihzdHIpOworCisgICAgcmV0dXJuIChsZW4gPiAxICYmIHZpbV9pc2RpZ2l0KHN0cltsZW4gLSAxXSkpOworfQorI2VuZGlmCS8qIEZFQVRfQ0xJRU5UU0VSVkVSICovCmRpZmYgLS1naXQgYS9zcmMvaWlkX29sZS5jIGIvc3JjL2lpZF9vbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRlMjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2lpZF9vbGUuYwpAQCAtMCwwICsxLDUwIEBACisvKiB0aGlzIGZpbGUgY29udGFpbnMgdGhlIGFjdHVhbCBkZWZpbml0aW9ucyBvZiAqLworLyogdGhlIElJRHMgYW5kIENMU0lEcyAqLworCisvKiBsaW5rIHRoaXMgZmlsZSBpbiB3aXRoIHRoZSBzZXJ2ZXIgYW5kIGFueSBjbGllbnRzICovCisKKworLyogRmlsZSBjcmVhdGVkIGJ5IE1JREwgY29tcGlsZXIgdmVyc2lvbiAzLjAwLjQ0ICovCisvKiBhdCBTYXQgSmFuIDAzIDE2OjM0OjU1IDE5OTgKKyAqLworLyogQ29tcGlsZXIgc2V0dGluZ3MgZm9yIGlmX29sZS5pZGw6CisgICAgT3MgKE9wdExldj1zKSwgVzEsIFpwOCwgZW52PVdpbjMyLCBtc19leHQsIGNfZXh0CisgICAgZXJyb3IgY2hlY2tzOiBub25lCisqLworLy9AQE1JRExfRklMRV9IRUFESU5HKCAgKQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMieworI2VuZGlmCisKKworI2lmbmRlZiBfX0lJRF9ERUZJTkVEX18KKyNkZWZpbmUgX19JSURfREVGSU5FRF9fCisKK3R5cGVkZWYgc3RydWN0IF9JSUQKK3sKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgdW5zaWduZWQgc2hvcnQgczE7CisgICAgdW5zaWduZWQgc2hvcnQgczI7CisgICAgdW5zaWduZWQgY2hhciAgY1s4XTsKK30gSUlEOworCisjZW5kaWYgLy8gX19JSURfREVGSU5FRF9fCisKKyNpZm5kZWYgQ0xTSURfREVGSU5FRAorI2RlZmluZSBDTFNJRF9ERUZJTkVECit0eXBlZGVmIElJRCBDTFNJRDsKKyNlbmRpZiAvLyBDTFNJRF9ERUZJTkVECisKK2NvbnN0IElJRCBJSURfSVZpbSA9IHsweDBGMEJGQUUyLDB4NEM5MCwweDExZDEsezB4ODIsMHhENywweDAwLDB4MDQsMHhBQywweDM2LDB4ODUsMHgxOX19OworCisKK2NvbnN0IElJRCBMSUJJRF9WaW0gPSB7MHgwRjBCRkFFMCwweDRDOTAsMHgxMWQxLHsweDgyLDB4RDcsMHgwMCwweDA0LDB4QUMsMHgzNiwweDg1LDB4MTl9fTsKKworCitjb25zdCBDTFNJRCBDTFNJRF9WaW0gPSB7MHgwRjBCRkFFMSwweDRDOTAsMHgxMWQxLHsweDgyLDB4RDcsMHgwMCwweDA0LDB4QUMsMHgzNiwweDg1LDB4MTl9fTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvaW5mcGxpc3QueG1sIGIvc3JjL2luZnBsaXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJhNWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luZnBsaXN0LnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSB2aW06c2V0IHRzPTIgc3RzPTIgc3c9MiB0dz0wOiAtLT4KKzwhRE9DVFlQRSBwbGlzdCBTWVNURU0gImZpbGU6Ly9sb2NhbGhvc3QvU3lzdGVtL0xpYnJhcnkvRFREcy9Qcm9wZXJ0eUxpc3QuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIwLjkiPgorCTxkaWN0PgorCisJCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwkJPHN0cmluZz42LjA8L3N0cmluZz4KKworCQk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCQk8c3RyaW5nPkFQUF9FWEU8L3N0cmluZz4KKwkJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwkJPHN0cmluZz5BUFBfTkFNRTwvc3RyaW5nPgorCQk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwkJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJCTxzdHJpbmc+QVBQX1ZFUjwvc3RyaW5nPgorCQk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJCTxzdHJpbmc+QVBQX1ZFUjwvc3RyaW5nPgorCQk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJCTxzdHJpbmc+VklNITwvc3RyaW5nPgorCisJCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCQk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwkJPGtleT5DU1Jlc291cmNlc0ZpbGVNYXBwZWQ8L2tleT4KKwkJPHRydWUvPgorCQk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwkJPHN0cmluZz5JQ09OX0FQUDwvc3RyaW5nPgorCisJCTxrZXk+Q0ZCdW5kbGVEb2N1bWVudFR5cGVzPC9rZXk+CisJCTxhcnJheT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0ZCdW5kbGVUeXBlRXh0ZW5zaW9uczwva2V5PgorCQkJCTxhcnJheT4KKwkJCQkJPHN0cmluZz4qPC9zdHJpbmc+CisJCQkJPC9hcnJheT4KKwkJCQk8a2V5PkNGQnVuZGxlVHlwZUljb25GaWxlPC9rZXk+CisJCQkJPHN0cmluZz5kb2MtdHh0LmljbnM8L3N0cmluZz4KKwkJCQk8a2V5PkNGQnVuZGxlVHlwZU5hbWU8L2tleT4KKwkJCQk8c3RyaW5nPk5TU3RyaW5nUGJvYXJkVHlwZTwvc3RyaW5nPgorCQkJCTxrZXk+Q0ZCdW5kbGVUeXBlT1NUeXBlczwva2V5PgorCQkJCTxhcnJheT4KKwkJCQkJPHN0cmluZz4qKioqPC9zdHJpbmc+CisJCQkJPC9hcnJheT4KKwkJCQk8a2V5PkNGQnVuZGxlVHlwZVJvbGU8L2tleT4KKwkJCQk8c3RyaW5nPkVkaXRvcjwvc3RyaW5nPgorCQkJPC9kaWN0PgorCQk8L2FycmF5PgorCisJPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL3NyYy9pbnRlZ3JhdGlvbi5jIGIvc3JjL2ludGVncmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhOWRlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbnRlZ3JhdGlvbi5jCkBAIC0wLDAgKzEsMTE5OCBAQAorLyogdmk6c2V0IHRzPTggc3c9ODoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoJCQlWaXN1YWwgV29ya3Nob3AgaW50ZWdyYXRpb24gYnkgR29yZG9uIFByaWV1cgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogSW50ZWdyYXRpb24gd2l0aCBTdW4gV29ya3Nob3AuCisgKgorICogVGhpcyBmaWxlIHNob3VsZCBub3QgY2hhbmdlIG11Y2gsIGl0J3MgYWxzbyB1c2VkIGJ5IG90aGVyIGVkaXRvcnMgdGhhdAorICogY29ubmVjdCB0byBXb3Jrc2hvcC4gIENvbnNpZGVyIGNoYW5naW5nIHdvcmtzaG9wLmMgaW5zdGVhZC4KKyAqLworLyoKKy0+IGNvbnNpZGVyIHVzaW5nIE1ha2VTZWxlY3Rpb25WaXNpYmxlIGluc3RlYWQgb2YgZ290b0xpbmUgaGFja3MKKyAgIHRvIHNob3cgdGhlIGxpbmUgcHJvcGVybHkKKyAgICAgLT4gY29uc2lkZXIgdXNpbmcgZ2x1ZSBpbnN0ZWFkIG9mIG91ciBvd24gbWVzc2FnZSB3cmFwcGluZyBmdW5jdGlvbnMKKwkoYnV0IGNhbiBvbmx5IHVzZSBnbHVlIGlmIHdlIGRvbid0IGhhdmUgdG8gZGlzdHJpYnV0ZSBzb3VyY2UpCisqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBJTkVUX1NPQ0tFVFMKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEhBVkVfTElCR0VOX0gKKyMgaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYbS9YbS5oPgorI2luY2x1ZGUgPFhtL0F0b21NZ3IuaD4KKyNpbmNsdWRlIDxYbS9QdXNoQi5oPgorCisjaWZkZWYgSEFWRV9YMTFfWFBNX0gKKyMgaW5jbHVkZSA8WDExL3hwbS5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9YTV9YUE1QX0gKKyMgIGluY2x1ZGUgPFhtL1hwbVAuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VVElMX0RFQlVHX0gKKyMgaW5jbHVkZSA8dXRpbC9kZWJ1Zy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VVElMX01TR0kxOE5fSAorIyBpbmNsdWRlIDx1dGlsL21zZ2kxOG4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiaW50ZWdyYXRpb24uaCIJLyogPEVkaXRQbHVnaW4vaW50ZWdyYXRpb24uaD4gKi8KKyNpZmRlZiBIQVZFX0ZSQU1FX0gKKyMgaW5jbHVkZSA8ZnJhbWUuaD4KKyNlbmRpZgorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpICAgIChhKSA+IChiKSA/IChhKSA6IChiKQorI2VuZGlmCisKKyNpZm5kZWYgTk9DQVRHRVRTCisjIGRlZmluZSBOT0NBVEdFVFMoeCkgeAorI2VuZGlmCisKKy8qIEZ1bmN0aW9ucyBwcml2YXRlIHRvIHRoaXMgZmlsZSAqLworc3RhdGljIHZvaWQgd29ya3Nob3BfY29ubmVjdGlvbl9jbG9zZWQodm9pZCk7CitzdGF0aWMgdm9pZCBtZXNzYWdlRnJvbUVzZXJ2ZShYdFBvaW50ZXIgY2xpZW50RGF0YSwgaW50ICpOT1RVU0VEMSwgWHRJbnB1dElkICpOT1RVU0VEMik7CitzdGF0aWMgdm9pZCB3b3Jrc2hvcF9kaXNjb25uZWN0KHZvaWQpOworc3RhdGljIHZvaWQgd29ya3Nob3Bfc2Vuc2l0aXZpdHkoaW50IG51bSwgY2hhciAqdGFibGUpOworc3RhdGljIHZvaWQgYWRqdXN0X3NpZ25fbmFtZShjaGFyICpmaWxlbmFtZSk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX21lbnVJdGVtKGNoYXIgKik7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3Rvb2xiYXJCdXR0b24oY2hhciAqKTsKK3N0YXRpYyB2b2lkIHdvcmtzaG9wX3NldF9vcHRpb25fZmlyc3QoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworCisKKyNkZWZpbmUgQ01EQlVGU0laCTIwNDgKKworI2lmZGVmIERFQlVHCitzdGF0aWMgRklMRSAqZGZkOworc3RhdGljIHZvaWQgcGxkZWJ1ZyhjaGFyICosIC4uLik7CitzdGF0aWMgdm9pZCB1bnJlY29nbmlzZWRfbWVzc2FnZShjaGFyICopOworCisjZGVmaW5lIEhBTkRMRV9FUlJPUlMoY21kKQllbHNlIHVucmVjb2duaXNlZF9tZXNzYWdlKGNtZCk7CisjZWxzZQorI2RlZmluZSBIQU5ETEVfRVJST1JTKGNtZCkKKyNlbmRpZgorCisvKgorICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIHByb3RvY29sIGJldHdlZW4gYW4gZWRpdG9yIGFuZCBlc2VydmUuCisgKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQgd2hlbiB0aGUgcHJvdG9jb2wKKyAqIGlzIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUJUFJPVE9DT0xfVkVSU0lPTgkiNC4wLjAiCisKK3N0YXRpYyBpbnQgc2QgPSAtMTsKK3N0YXRpYyBYdElucHV0SWQgaW5wdXRIYW5kbGVyOwkJLyogQ29va2llIGZvciBpbnB1dCAqLworCitCb29sZWFuIHNhdmVfZmlsZXMgPSBUcnVlOwkJLyogV2hlbiB0cnVlLCBzYXZlIGFsbCBmaWxlcyBiZWZvcmUgYnVpbGQgYWN0aW9ucyAqLworCit2b2lkCit3b3Jrc2hvcF9jb25uZWN0aW9uX2Nsb3NlZCh2b2lkKQoreworCS8qCisJICogc29ja2V0IGNsb3NlZCBvbiBvdGhlciBlbmQKKwkgKi8KKwlYdFJlbW92ZUlucHV0KGlucHV0SGFuZGxlcik7CisJaW5wdXRIYW5kbGVyID0gMDsKKwlzZCA9IC0xOworfQorCisJc3RhdGljIGNoYXIgKgorZ2V0Q29tbWFuZCh2b2lkKQoreworCWludAkgbGVuOwkJLyogbGVuZ3RoIG9mIHRoaXMgY29tbWFuZCAqLworCWNoYXIJIGxlbmJ1Zls3XTsJLyogZ2V0IHRoZSBsZW5ndGggc3RyaW5nIGhlcmUgKi8KKwljaGFyCSpuZXdjYjsJCS8qIHVzZWQgdG8gcmVhbGxvYyBjbWRidWYgKi8KKwlzdGF0aWMgY2hhcgkqY21kYnVmOy8qIGdldCB0aGUgY29tbWFuZCBzdHJpbmcgaGVyZSAqLworCXN0YXRpYyBpbnQJIGNic2l6ZTsvKiBzaXplIG9mIGNtZGJ1ZiAqLworCisJaWYgKChsZW4gPSByZWFkKHNkLCAmbGVuYnVmLCA2KSkgPT0gNikgeworCQlsZW5idWZbNl0gPSAwOyAvKiBUZXJtaW5hdGUgYnVmZmVyIHN1Y2ggdGhhdCBhdG9pKCkgd29ya3MgcmlnaHQgKi8KKwkJbGVuID0gYXRvaShsZW5idWYpOworCQlpZiAoY2JzaXplIDwgKGxlbiArIDEpKSB7CisJCQluZXdjYiA9IChjaGFyICopIHJlYWxsb2MoY21kYnVmLAorCQkJICAgIE1BWCgobGVuICsgMjU2KSwgQ01EQlVGU0laKSk7CisJCQlpZiAobmV3Y2IgIT0gTlVMTCkgeworCQkJCWNtZGJ1ZiA9IG5ld2NiOworCQkJCWNic2l6ZSA9IE1BWCgobGVuICsgMjU2KSwgQ01EQlVGU0laKTsKKwkJCX0KKwkJfQorCQlpZiAoY2JzaXplID49IGxlbiAmJiAobGVuID0gcmVhZChzZCwgY21kYnVmLCBsZW4pKSA+IDApIHsKKwkJCWNtZGJ1ZltsZW5dID0gMDsKKwkJCXJldHVybiBjbWRidWY7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChsZW4gPT0gMCkgeyAvKiBFT0YgKi8KKwkJCXdvcmtzaG9wX2Nvbm5lY3Rpb25fY2xvc2VkKCk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCit9CisKKy8qQVJHU1VTRUQqLwordm9pZAorbWVzc2FnZUZyb21Fc2VydmUoWHRQb2ludGVyIGNsaWVudERhdGEsIGludCAqTk9UVVNFRDEsIFh0SW5wdXRJZCAqTk9UVVNFRDIpCit7CisJY2hhcgkqY21kOwkJLyogdGhlIDFzdCB3b3JkIG9mIHRoZSBjb21tYW5kICovCisKKwljbWQgPSBnZXRDb21tYW5kKCk7CisJaWYgKGNtZCA9PSBOVUxMKSB7CisJCS8qIFdlJ3JlIGJlaW5nIHNodXQgZG93biBieSBlc2VydmUgYW5kIHRoZSAicXVpdCIgbWVzc2FnZQorCQkgKiBkaWRuJ3QgYXJyaXZlIGJlZm9yZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gZ290IGNsb3NlZCAqLworCQlyZXR1cm47CisJfQorI2lmZGVmIERFQlVHCisJcGxkZWJ1ZygiJXNcbiIsIGNtZCk7CisjZW5kaWYKKwlzd2l0Y2ggKCpjbWQpIHsKKwljYXNlICdhJzoKKwkJaWYgKGNtZFsxXSA9PSAnYycgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoImFjayAiKSwgNCkgPT0gMCkgeworCQkJaW50IGFja051bTsKKwkJCWNoYXIgYnVmWzIwXTsKKworCQkJYWNrTnVtID0gYXRvaSgmY21kWzRdKTsKKwkJCXNwcmludGYoYnVmLCBOT0NBVEdFVFMoImFjayAlZFxuIiksIGFja051bSk7CisJCQl3cml0ZShzZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsCisJCSAgICBOT0NBVEdFVFMoImFkZE1hcmtUeXBlICIpLCAxMikgPT0gMCkgeworCQkJaW50IGlkeDsKKwkJCWNoYXIgKmNvbG9yOworCQkJY2hhciAqc2lnbjsKKworCQkJaWR4ID0gYXRvaShzdHJ0b2soJmNtZFsxMl0sICIgIikpOworCQkJY29sb3IgID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwkJCXNpZ24gID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwkJCS8qIFNraXAgc3BhY2UgdGhhdCBzZXBhcmF0ZXMgbmFtZXMgKi8KKwkJCWlmIChjb2xvcikgeworCQkJCWNvbG9yKys7CisJCQl9CisJCQlpZiAoc2lnbikgeworCQkJCXNpZ24rKzsKKwkJCX0KKwkJCS8qIENoYW5nZSBzaWduIG5hbWUgdG8gYWNjb21vZGF0ZSBhIGRpZmZlcmVudCBzaXplPyAqLworCQkJYWRqdXN0X3NpZ25fbmFtZShzaWduKTsKKwkJCXdvcmtzaG9wX2FkZF9tYXJrX3R5cGUoaWR4LCBjb2xvciwgc2lnbik7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ2InOgorCQlpZiAoc3RybmNtcChjbWQsCisJCSAgICBOT0NBVEdFVFMoImJhbGxvb24gIiksIDgpID09IDApIHsKKwkJCWNoYXIgKnRpcDsKKworCQkJdGlwICA9IHN0cnRvaygmY21kWzhdLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJCQl3b3Jrc2hvcF9zaG93X2JhbGxvb25fdGlwKHRpcCk7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ2MnOgorCQlpZiAoc3RybmNtcChjbWQsCisJCSAgICBOT0NBVEdFVFMoImNoYW5nZU1hcmtUeXBlICIpLCAxNSkgPT0gMCkgeworCQkJY2hhciAqZmlsZTsKKwkJCWludCBtYXJrSWQ7CisJCQlpbnQgdHlwZTsKKworCQkJZmlsZSAgPSBzdHJ0b2soJmNtZFsxNV0sICIgIik7CisJCQltYXJrSWQgPSBhdG9pKHN0cnRvayhOVUxMLCAiICIpKTsKKwkJCXR5cGUgPSBhdG9pKHN0cnRvayhOVUxMLCAiICIpKTsKKwkJCXdvcmtzaG9wX2NoYW5nZV9tYXJrX3R5cGUoZmlsZSwgbWFya0lkLCB0eXBlKTsKKwkJfQorCQlIQU5ETEVfRVJST1JTKGNtZCk7CisJCWJyZWFrOworCisJY2FzZSAnZCc6CisJCWlmIChzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJkZWxldGVNYXJrICIpLCAxMSkgPT0gMCkgeworCQkJY2hhciAqZmlsZTsKKwkJCWludCBtYXJrSWQ7CisKKwkJCWZpbGUgID0gc3RydG9rKCZjbWRbMTFdLCAiICIpOworCQkJbWFya0lkID0gYXRvaShzdHJ0b2soTlVMTCwgIiAiKSk7CisJCQl3b3Jrc2hvcF9kZWxldGVfbWFyayhmaWxlLCBtYXJrSWQpOworCQl9CisJCUhBTkRMRV9FUlJPUlMoY21kKTsKKwkJYnJlYWs7CisKKwljYXNlICdmJzoKKwkJaWYgKGNtZFsxXSA9PSAnbycgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoImZvb3Rlck1zZyAiKSwgMTApID09IDApIHsKKwkJCWludCBzZXZlcml0eTsKKwkJCWNoYXIgKm1lc3NhZ2U7CisKKwkJCXNldmVyaXR5ID0KKwkJCSAgICBhdG9pKHN0cnRvaygmY21kWzEwXSwgIiAiKSk7CisJCQltZXNzYWdlID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKworCQkJd29ya3Nob3BfZm9vdGVyX21lc3NhZ2UobWVzc2FnZSwgc2V2ZXJpdHkpOworCQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLAorCQkgICAgTk9DQVRHRVRTKCJmcm9udEZpbGUgIiksIDEwKSA9PSAwKSB7CisJCQljaGFyICpmaWxlOworCisJCQlmaWxlICA9IHN0cnRvaygmY21kWzEwXSwgIiAiKTsKKwkJCXdvcmtzaG9wX2Zyb250X2ZpbGUoZmlsZSk7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ2cnOgorCQlpZiAoY21kWzFdID09ICdlJyAmJgorCQkgICAgc3RybmNtcChjbWQsIE5PQ0FUR0VUUygiZ2V0TWFya0xpbmUgIiksIDEyKSA9PSAwKSB7CisJCQljaGFyICpmaWxlOworCQkJaW50IG1hcmtpZDsKKwkJCWludCBsaW5lOworCQkJY2hhciBidWZbMTAwXTsKKworCQkJZmlsZSAgPSBzdHJ0b2soJmNtZFsxMl0sICIgIik7CisJCQltYXJraWQgPSBhdG9pKHN0cnRvayhOVUxMLCAiICIpKTsKKwkJCWxpbmUgPSB3b3Jrc2hvcF9nZXRfbWFya19saW5lbm8oZmlsZSwgbWFya2lkKTsKKwkJCXNwcmludGYoYnVmLCBOT0NBVEdFVFMoIm1hcmtMaW5lICVzICVkICVkXG4iKSwKKwkJCSAgICBmaWxlLCBtYXJraWQsIGxpbmUpOworCQkJd3JpdGUoc2QsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQl9IGVsc2UgaWYgKGNtZFsxXSA9PSAnbycgJiYgY21kWzRdID09ICdMJyAmJgorCQkgICAgc3RybmNtcChjbWQsIE5PQ0FUR0VUUygiZ290b0xpbmUgIiksIDkpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisJCQlpbnQgbGluZW5vOworCisJCQlmaWxlICA9IHN0cnRvaygmY21kWzldLCAiICIpOworCQkJbGluZW5vID0gYXRvaShzdHJ0b2soTlVMTCwgIiAiKSk7CisJCQl3b3Jrc2hvcF9nb3RvX2xpbmUoZmlsZSwgbGluZW5vKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwKKwkJICAgIE5PQ0FUR0VUUygiZ290b01hcmsgIiksIDkpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisJCQlpbnQgbWFya0lkOworCQkJY2hhciAqbWVzc2FnZTsKKworCQkJZmlsZSAgPSBzdHJ0b2soJmNtZFs5XSwgIiAiKTsKKwkJCW1hcmtJZCA9IGF0b2koc3RydG9rKE5VTEwsICIgIikpOworCQkJbWVzc2FnZSA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJCQl3b3Jrc2hvcF9nb3RvX21hcmsoZmlsZSwgbWFya0lkLCBtZXNzYWdlKTsKKyNpZmRlZiBOT0hBTkRTX1NVUFBPUlRfRlVOQ1RJT05TCisJCX0gZWxzZSBpZiAoc3RyY21wKGNtZCwgTk9DQVRHRVRTKCJnZXRDdXJyZW50RmlsZSIpKSA9PSAwKSB7CisJCQljaGFyICpmID0gd29ya3Nob3BfdGVzdF9nZXRjdXJyZW50ZmlsZSgpOworCQkJY2hhciBidWZmZXJbMipNQVhQQVRITEVOXTsKKwkJCXNwcmludGYoYnVmZmVyLCBOT0NBVEdFVFMoImN1cnJlbnRGaWxlICVkICVzIiksCisJCQkJZiA/IHN0cmxlbihmKSA6IDAsIGYgPyBmIDogIiIpOworCQkJd29ya3Nob3Bfc2VuZF9tZXNzYWdlKGJ1ZmZlcik7CisJCX0gZWxzZSBpZiAoc3RyY21wKGNtZCwgTk9DQVRHRVRTKCJnZXRDdXJzb3JSb3ciKSkgPT0gMCkgeworCQkJaW50IHJvdyA9IHdvcmtzaG9wX3Rlc3RfZ2V0Y3Vyc29ycm93KCk7CisJCQljaGFyIGJ1ZmZlclsyKk1BWFBBVEhMRU5dOworCQkJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygiY3Vyc29yUm93ICVkIiksIHJvdyk7CisJCQl3b3Jrc2hvcF9zZW5kX21lc3NhZ2UoYnVmZmVyKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoY21kLCBOT0NBVEdFVFMoImdldEN1cnNvckNvbCIpKSA9PSAwKSB7CisJCQlpbnQgY29sID0gd29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jjb2woKTsKKwkJCWNoYXIgYnVmZmVyWzIqTUFYUEFUSExFTl07CisJCQlzcHJpbnRmKGJ1ZmZlciwgTk9DQVRHRVRTKCJjdXJzb3JDb2wgJWQiKSwgY29sKTsKKwkJCXdvcmtzaG9wX3NlbmRfbWVzc2FnZShidWZmZXIpOworCQl9IGVsc2UgaWYgKHN0cmNtcChjbWQsIE5PQ0FUR0VUUygiZ2V0Q3Vyc29yUm93VGV4dCIpKSA9PSAwKSB7CisJCQljaGFyICp0ID0gd29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jyb3d0ZXh0KCk7CisJCQljaGFyIGJ1ZmZlclsyKk1BWFBBVEhMRU5dOworCQkJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygiY3Vyc29yUm93VGV4dCAlZCAlcyIpLAorCQkJCXQgPyBzdHJsZW4odCkgOiAwLCB0ID8gdCA6ICIiKTsKKwkJCXdvcmtzaG9wX3NlbmRfbWVzc2FnZShidWZmZXIpOworCQl9IGVsc2UgaWYgKHN0cmNtcChjbWQsIE5PQ0FUR0VUUygiZ2V0U2VsZWN0ZWRUZXh0IikpID09IDApIHsKKwkJCWNoYXIgKnQgPSB3b3Jrc2hvcF90ZXN0X2dldHNlbGVjdGVkdGV4dCgpOworCQkJY2hhciBidWZmZXJbMipNQVhQQVRITEVOXTsKKwkJCXNwcmludGYoYnVmZmVyLCBOT0NBVEdFVFMoInNlbGVjdGVkVGV4dCAlZCAlcyIpLAorCQkJCXQgPyBzdHJsZW4odCkgOiAwLCB0ID8gdCA6ICIiKTsKKwkJCXdvcmtzaG9wX3NlbmRfbWVzc2FnZShidWZmZXIpOworI2VuZGlmCisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ2wnOgorCQlpZiAoc3RybmNtcChjbWQsIE5PQ0FUR0VUUygibG9hZEZpbGUgIiksIDkpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisJCQlpbnQgbGluZTsKKwkJCWNoYXIgKmZyYW1laWQ7CisKKwkJCWZpbGUgID0gc3RydG9rKCZjbWRbOV0sICIgIik7CisJCQlsaW5lID0gYXRvaShzdHJ0b2soTlVMTCwgIiAiKSk7CisJCQlmcmFtZWlkID0gc3RydG9rKE5VTEwsICIgIik7CisJCQl3b3Jrc2hvcF9sb2FkX2ZpbGUoZmlsZSwgbGluZSwgZnJhbWVpZCk7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ20nOgkJCS8qIE1lbnUsIG1pbmltaXplLCBtYXhpbWl6ZSAqLworCQlpZiAoY21kWzFdID09ICdlJyAmJiBjbWRbNF0gPT0gJ0InICYmCisJCSAgICBzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJtZW51QmVnaW4gIiksIDEwKSA9PSAwKSB7CisJCQl3b3Jrc2hvcF9tZW51X2JlZ2luKCZjbWRbMTBdKTsKKwkJfSBlbHNlIGlmIChjbWRbMV0gPT0gJ2UnICYmIGNtZFs0XSA9PSAnSScgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoIm1lbnVJdGVtICIpLCA5KSA9PSAwKSB7CisJCQlwcm9jZXNzX21lbnVJdGVtKGNtZCk7CisJCX0gZWxzZSBpZiAoY21kWzFdID09ICdlJyAmJiBjbWRbNF0gPT0gJ0UnICYmCisJCSAgICBzdHJjbXAoY21kLCBOT0NBVEdFVFMoIm1lbnVFbmQiKSkgPT0gMCkgeworCQkJd29ya3Nob3BfbWVudV9lbmQoKTsKKwkJfSBlbHNlIGlmIChjbWRbMV0gPT0gJ2EnICYmCisJCSAgICBzdHJjbXAoY21kLCBOT0NBVEdFVFMoIm1heGltaXplIikpID09IDApIHsKKwkJCXdvcmtzaG9wX21heGltaXplKCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKGNtZCwgTk9DQVRHRVRTKCJtaW5pbWl6ZSIpKSA9PSAwKSB7CisJCQl3b3Jrc2hvcF9taW5pbWl6ZSgpOworCQl9CisJCUhBTkRMRV9FUlJPUlMoY21kKTsKKwkJYnJlYWs7CisKKwljYXNlICdvJzoKKwkJaWYgKGNtZFsxXSA9PSAncCcgJiYKKwkJICAgIHN0cmNtcChjbWQsIE5PQ0FUR0VUUygib3B0aW9uIikpKSB7CisJCQljaGFyICpuYW1lOworCQkJY2hhciAqdmFsdWU7CisKKwkJCW5hbWUgID0gc3RydG9rKCZjbWRbN10sICIgIik7CisJCQl2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOworCQkJd29ya3Nob3Bfc2V0X29wdGlvbl9maXJzdChuYW1lLCB2YWx1ZSk7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ3AnOgorCQlpZiAoc3RyY21wKGNtZCwgTk9DQVRHRVRTKCJwaW5nIikpID09IDApIHsKKyNpZiAwCisJCQlpbnQgcGluZ051bTsKKworCQkJcGluZ051bSA9IGF0b2koJmNtZFs1XSk7CisJCQl3b3Jrc2hvcF9zZW5kX2FjayhhY2tOdW0pOworCQkJV0hBVCBETyBJIERPIEhFUkU/CisjZW5kaWYKKwkJfQorCQlIQU5ETEVfRVJST1JTKGNtZCk7CisJCWJyZWFrOworCisJY2FzZSAncSc6CisJCWlmIChzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJxdWl0IiksIDQpID09IDApIHsKKworCQkJLyogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uIEl0J3MgaW1wb3J0YW50IHRvIGRvCisJCQkgKiB0aGF0IG5vdywgc2luY2Ugd29ya3Nob3BfcXVpdCBtaWdodCBiZQorCQkJICogbG9va2luZyBhdCBvcGVuIGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQorCQkJICogaGF2ZSBtb2RpZmllZCBvbmUgb2YgdGhlIGZpbGVzIHdpdGhvdXQKKwkJCSAqIHNhdmluZywgTkVkaXQgd2lsbCBhc2sgeW91IHdoYXQgeW91IHdhbnQgdG8KKwkJCSAqIGRvLCBhbmQgc3BpbiBsb29wIGJ5IGNhbGxpbmcKKwkJCSAqIFh0QXBwUHJvY2Vzc0V2ZW50IHdoaWxlIHdhaXRpbmcgZm9yIHlvdXIKKwkJCSAqIHJlcGx5LiBJbiB0aGlzIGNhc2UsIGlmIHdlIHN0aWxsIGhhdmUgYW4KKwkJCSAqIGlucHV0IGhhbmRsZXIgYW5kIHRoZSBzb2NrZXQgaGFzIGJlZW4KKwkJCSAqIGNsb3NlZCBvbiB0aGUgb3RoZXIgc2lkZSB3aGVuIGVzZXJ2ZQorCQkJICogZXhwaXJlZCwgd2Ugd2lsbCBoYW5nIGluIElvV2FpdC4KKwkJCSAqLworCQkJd29ya3Nob3BfZGlzY29ubmVjdCgpOworCisJCQl3b3Jrc2hvcF9xdWl0KCk7CisJCX0KKwkJSEFORExFX0VSUk9SUyhjbWQpOworCQlicmVhazsKKworCWNhc2UgJ3InOgorCQlpZiAoY21kWzFdID09ICdlJyAmJgorCQkgICAgc3RybmNtcChjbWQsIE5PQ0FUR0VUUygicmVsb2FkRmlsZSAiKSwgMTEpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisJCQlpbnQgbGluZTsKKworCQkJZmlsZSAgPSBzdHJ0b2soJmNtZFsxMV0sICIgIik7CisJCQlsaW5lID0gYXRvaShzdHJ0b2soTlVMTCwgIiAiKSk7CisJCQl3b3Jrc2hvcF9yZWxvYWRfZmlsZShmaWxlLCBsaW5lKTsKKwkJfQorCQlIQU5ETEVfRVJST1JTKGNtZCk7CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCWlmIChjbWRbMV0gPT0gJ2UnICYmIGNtZFsyXSA9PSAndCcgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoInNldE1hcmsgIiksIDgpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisJCQlpbnQgbGluZTsKKwkJCWludCBtYXJrSWQ7CisJCQlpbnQgdHlwZTsKKworCQkJZmlsZSAgPSBzdHJ0b2soJmNtZFs4XSwgIiAiKTsKKwkJCWxpbmUgPSBhdG9pKHN0cnRvayhOVUxMLCAiICIpKTsKKwkJCW1hcmtJZCA9IGF0b2koc3RydG9rKE5VTEwsICIgIikpOworCQkJdHlwZSA9IGF0b2koc3RydG9rKE5VTEwsICIgIikpOworCQkJd29ya3Nob3Bfc2V0X21hcmsoZmlsZSwgbGluZSwgbWFya0lkLCB0eXBlKTsKKwkJfSBlbHNlIGlmIChjbWRbMV0gPT0gJ2gnICYmCisJCSAgICBzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJzaG93RmlsZSAiKSwgOSkgPT0gMCkgeworCQkJd29ya3Nob3Bfc2hvd19maWxlKCZjbWRbOV0pOworCQl9IGVsc2UgaWYgKGNtZFsxXSA9PSAndScgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoInN1Yk1lbnUgIiksIDgpID09IDApIHsKKwkJCWNoYXIgKmxhYmVsOworCisJCQlsYWJlbCAgPSBzdHJ0b2soJmNtZFs4XSwgTk9DQVRHRVRTKCJcMDAxIikpOworCQkJd29ya3Nob3Bfc3VibWVudV9iZWdpbihsYWJlbCk7CisJCX0gZWxzZSBpZiAoY21kWzFdID09ICd1JyAmJgorCQkgICAgc3RyY21wKGNtZCwgTk9DQVRHRVRTKCJzdWJNZW51RW5kIikpID09IDApIHsKKwkJCXdvcmtzaG9wX3N1Ym1lbnVfZW5kKCk7CisJCX0gZWxzZSBpZiAoY21kWzFdID09ICdlJyAmJiBjbWRbMl0gPT0gJ24nICYmCisJCSAgICBzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJzZW5zaXRpdml0eSAiKSwgMTIpID09IDApIHsKKwkJCWludCBudW07CisJCQljaGFyICpicmFja2V0OworCQkJY2hhciAqdGFibGU7CisKKwkJCW51bSA9IGF0b2koc3RydG9rKCZjbWRbMTJdLCAiICIpKTsKKwkJCWJyYWNrZXQgPSBzdHJ0b2soTlVMTCwgIiAiKTsKKwkJCWlmICgqYnJhY2tldCAhPSAnWycpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgTk9DQVRHRVRTKCJQYXJzaW5nICIKKwkJCQkgICAgImVycm9yIGZvciBzZW5zaXRpdml0eVxuIikpOworCQkJfSBlbHNlIHsKKwkJCQl0YWJsZSA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIl0iKSk7CisJCQkJd29ya3Nob3Bfc2Vuc2l0aXZpdHkobnVtLCB0YWJsZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoY21kWzFdID09ICdlJyAmJiBjbWRbMl0gPT0gJ24nICYmIGNtZFszXSA9PSAnZCcgJiYKKwkJCSAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoInNlbmRWZXJiICIpLCA5KSA9PSAwKSB7CisJCQkvKiBTZW5kIHRoZSBnaXZlbiB2ZXJiIGJhY2sgKHVzZWQgZm9yIHRoZQorCQkJICogZGVidWcubGluZW5vIGNhbGxiYWNrIChzdWNoIHRoYXQgb3RoZXIgdG9vbHMKKwkJCSAqIGNhbiBvYnRhaW4gdGhlIHBvc2l0aW9uIGNvb3JkaW5hdGVzIG9yIHRoZQorCQkJICogc2VsZWN0aW9uKSAqLworCQkJY2hhciAqdmVyYjsKKworCQkJdmVyYiA9IHN0cnRvaygmY21kWzldLCAiICIpOworCQkJd29ya3Nob3BfcGVyZm9ybV92ZXJiKHZlcmIsIE5VTEwpOworCQl9IGVsc2UgaWYgKGNtZFsxXSA9PSAnYScgJiYKKwkJICAgIHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoInNhdmVGaWxlICIpLCA5KSA9PSAwKSB7CisJCQl3b3Jrc2hvcF9zYXZlX2ZpbGUoJmNtZFs5XSk7CisjaWZkZWYgTk9IQU5EU19TVVBQT1JUX0ZVTkNUSU9OUworCQl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCBOT0NBVEdFVFMoInNhdmVTZW5zaXRpdml0eSAiKSwgMTYpID09IDApIHsKKwkJCWNoYXIgKmZpbGU7CisKKwkJCWZpbGUgID0gc3RydG9rKCZjbWRbMTZdLCAiICIpOworCQkJd29ya3Nob3Bfc2F2ZV9zZW5zaXRpdml0eShmaWxlKTsKKyNlbmRpZgorCQl9CisJCUhBTkRMRV9FUlJPUlMoY21kKTsKKwkJYnJlYWs7CisKKwljYXNlICd0JzoJCQkvKiBUb29sYmFyICovCisJCWlmIChjbWRbOF0gPT0gJ2UnICYmCisJCSAgICBzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJ0b29sYmFyQmVnaW4iKSwgMTIpID09IDApIHsKKwkJCXdvcmtzaG9wX3Rvb2xiYXJfYmVnaW4oKTsKKwkJfSBlbHNlIGlmIChjbWRbOF0gPT0gJ3UnICYmCisJCSAgICBzdHJuY21wKGNtZCwgTk9DQVRHRVRTKCJ0b29sYmFyQnV0dG9uIiksIDEzKSA9PSAwKSB7CisJCQlwcm9jZXNzX3Rvb2xiYXJCdXR0b24oY21kKTsKKwkJfSBlbHNlIGlmIChjbWRbN10gPT0gJ0UnICYmCisJCSAgICBzdHJjbXAoY21kLCBOT0NBVEdFVFMoInRvb2xiYXJFbmQiKSkgPT0gMCkgeworCQkJd29ya3Nob3BfdG9vbGJhcl9lbmQoKTsKKwkJfQorCQlIQU5ETEVfRVJST1JTKGNtZCk7CisJCWJyZWFrOworCisjaWZkZWYgREVCVUcKKwlkZWZhdWx0OgorCQl1bnJlY29nbmlzZWRfbWVzc2FnZShjbWQpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfbWVudUl0ZW0oCisJY2hhcgkqY21kKQoreworCWNoYXIgKmxhYmVsICA9IHN0cnRvaygmY21kWzldLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJY2hhciAqdmVyYiAgPSBzdHJ0b2soTlVMTCwgTk9DQVRHRVRTKCJcMDAxIikpOworCWNoYXIgKmFjYyA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJY2hhciAqYWNjVGV4dCAgPSBzdHJ0b2soTlVMTCwgTk9DQVRHRVRTKCJcMDAxIikpOworCWNoYXIgKm5hbWUgID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwljaGFyICpzZW5zZSAgPSBzdHJ0b2soTlVMTCwgTk9DQVRHRVRTKCJcbiIpKTsKKwljaGFyICpmaWxlcG9zICA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlxuIikpOworCWlmICgqYWNjID09ICctJykgeworCQlhY2MgPSBOVUxMOworCX0KKwlpZiAoKmFjY1RleHQgPT0gJy0nKSB7CisJCWFjY1RleHQgPSBOVUxMOworCX0KKwl3b3Jrc2hvcF9tZW51X2l0ZW0obGFiZWwsIHZlcmIsIGFjYywgYWNjVGV4dCwgbmFtZSwgZmlsZXBvcywgc2Vuc2UpOworCit9CisKKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfdG9vbGJhckJ1dHRvbigKKwljaGFyCSpjbWQpCQkJLyogYnV0dG9uIGRlZmluaXRpb24gKi8KK3sKKwljaGFyICpsYWJlbCAgPSBzdHJ0b2soJmNtZFsxNF0sIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwljaGFyICp2ZXJiICA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJY2hhciAqc2Vuc2VWZXJiICA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlwwMDEiKSk7CisJY2hhciAqZmlsZXBvcyAgPSBzdHJ0b2soTlVMTCwgTk9DQVRHRVRTKCJcMDAxIikpOworCWNoYXIgKmhlbHAgID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwljaGFyICpzZW5zZSAgPSBzdHJ0b2soTlVMTCwgTk9DQVRHRVRTKCJcMDAxIikpOworCWNoYXIgKmZpbGUgID0gc3RydG9rKE5VTEwsIE5PQ0FUR0VUUygiXDAwMSIpKTsKKwljaGFyICpsZWZ0ICA9IHN0cnRvayhOVUxMLCBOT0NBVEdFVFMoIlxuIikpOworCisJaWYgKCFzdHJjbXAobGFiZWwsIE5PQ0FUR0VUUygiLSIpKSkgeworCQlsYWJlbCA9IE5VTEw7CisJfQorCWlmICghc3RyY21wKGhlbHAsIE5PQ0FUR0VUUygiLSIpKSkgeworCQloZWxwID0gTlVMTDsKKwl9CisJaWYgKCFzdHJjbXAoZmlsZSwgTk9DQVRHRVRTKCItIikpKSB7CisJCWZpbGUgPSBOVUxMOworCX0KKwlpZiAoIXN0cmNtcChzZW5zZVZlcmIsIE5PQ0FUR0VUUygiLSIpKSkgeworCQlzZW5zZVZlcmIgPSBOVUxMOworCX0KKwl3b3Jrc2hvcF90b29sYmFyX2J1dHRvbihsYWJlbCwgdmVyYiwgc2Vuc2VWZXJiLCBmaWxlcG9zLCBoZWxwLAorCQkJCXNlbnNlLCBmaWxlLCBsZWZ0KTsKK30KKworCisjaWZkZWYgREVCVUcKK3ZvaWQKK3VucmVjb2duaXNlZF9tZXNzYWdlKAorCWNoYXIJKmNtZCkKK3sKKwlwbGRlYnVnKCJVbnJlY29nbmlzZWQgZXNlcnZlIG1lc3NhZ2U6XG5cdCVzXG4iLCBjbWQpOworCS8qIGFib3J0KCk7ICovCit9CisjZW5kaWYKKworCisvKiBDaGFuZ2Ugc2lnbiBuYW1lIHRvIGFjY29tb2RhdGUgYSBkaWZmZXJlbnQgc2l6ZToKKyAqIENyZWF0ZSB0aGUgZmlsZW5hbWUgYmFzZWQgb24gdGhlIGhlaWdodC4gVGhlIGZpbGVuYW1lIGZvcm1hdAorICogb2YgbXVsdGlzaXplIGljb25zIGFyZToKKyAqICAgIHgueHBtICAgOiBsYXJnZXN0IGljb24KKyAqICAgIHgxLnhwbSAgOiBzbWFsbGVyIGljb24KKyAqICAgIHgyLnhwbSAgOiBzbWFsbGVzdCBpY29uICovCisJdm9pZAorYWRqdXN0X3NpZ25fbmFtZShjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpzOworCXN0YXRpYyBpbnQgZm9udFNpemUgPSAtMTsKKworCWlmIChmb250U2l6ZSA9PSAtMSkKKwkJZm9udFNpemUgPSB3b3Jrc2hvcF9nZXRfZm9udF9oZWlnaHQoKTsKKwlpZiAoZm9udFNpemUgPT0gMCkKKwkJcmV0dXJuOworCWlmIChmaWxlbmFtZVswXSA9PSAnLScpCisJCXJldHVybjsKKworCS8qIFRoaXMgaXMgdWdseTogbGF0ZXIgd2Ugc2hvdWxkIGluc3RlYWQgcGFzcyB0aGUgZm9udGhlaWdodCBvdmVyCisJICogdG8gZXNlcnZlIG9uIHN0YXJ0dXAgYW5kIGxldCBlc2VydmUganVzdCBzZW5kIHRoZSByaWdodCBmaWxlbmFtZXMKKwkgKiB0byB1cyBpbiB0aGUgZmlyc3QgcGxhY2UKKworCSAqIEkga25vdyB0aGF0IHRoZSBmaWxlbmFtZSB3aWxsIGVuZCB3aXRoIDEueHBtIChzZWUKKwkgKiBHdWlFZGl0b3IuY2NgTGlzcFByaW50U2lnbiBpZiB5b3Ugd29uZGVyIHdoeSkgKi8KKwlzID0gZmlsZW5hbWUrc3RybGVuKGZpbGVuYW1lKS01OworCWlmIChmb250U2l6ZSA8PSAxMSkKKwkJc3RyY3B5KHMsICIyLnhwbSIpOworCWVsc2UgaWYgKGZvbnRTaXplIDw9IDE1KQorCQlzdHJjcHkocywgIjEueHBtIik7CisJZWxzZQorCQlzdHJjcHkocywgIi54cG0iKTsKK30KKworLyogV2VyZSB3ZSBpbnZva2VkIGJ5IFdvcmtTaG9wPyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGVhcmx5IGR1cmluZyBzdGFydHVwCisgICBpZiB5b3Ugd2FudCB0byBkbyB0aGluZ3MgZGlmZmVyZW50bHkgaWYgdGhlIGVkaXRvciBpcyBzdGFydGVkIHN0YW5kYWxvbmUKKyAgIG9yIGluIFdvcmtTaG9wIG1vZGUuIEZvciBleGFtcGxlLCBpbiBzdGFuZGFsb25lIG1vZGUgeW91IG1heSBub3Qgd2FudCB0bworICAgYWRkIGEgZm9vdGVyL21lc3NhZ2UgYXJlYSBvciBhIHNpZ24gZ3V0dGVyLiAqLworaW50Cit3b3Jrc2hvcF9pbnZva2VkKCkKK3sKKwlzdGF0aWMgaW50IHJlc3VsdCA9IC0xOworCWlmIChyZXN1bHQgPT0gLTEpIHsKKwkJcmVzdWx0ID0gKGdldGVudihOT0NBVEdFVFMoIlNQUk9fRURJVE9SX1NPQ0tFVCIpKSAhPSBOVUxMKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogQ29ubmVjdCBiYWNrIHRvIGVzZXJ2ZSAqLwordm9pZAl3b3Jrc2hvcF9jb25uZWN0KFh0QXBwQ29udGV4dCBjb250ZXh0KQoreworI2lmZGVmIElORVRfU09DS0VUUworCXN0cnVjdCBzb2NrYWRkcl9pbglzZXJ2ZXI7CisJc3RydWN0IGhvc3RlbnQgKglob3N0OworCWludAkJCXBvcnQ7CisjZWxzZQorCXN0cnVjdCBzb2NrYWRkcl91bglzZXJ2ZXI7CisjZW5kaWYKKwljaGFyCQkJYnVmWzMyXTsKKwljaGFyICoJCQlhZGRyZXNzOworI2lmZGVmIERFQlVHCisJY2hhcgkJCSpmaWxlOworI2VuZGlmCisKKwlhZGRyZXNzID0gZ2V0ZW52KE5PQ0FUR0VUUygiU1BST19FRElUT1JfU09DS0VUIikpOworCWlmIChhZGRyZXNzID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIElORVRfU09DS0VUUworCXBvcnQgPSBhdG9pKGFkZHJlc3MpOworCisJaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisJCVBFUlJPUihOT0NBVEdFVFMoIndvcmtzaG9wX2Nvbm5lY3QiKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIHNlcnZlciBpbnRlcm5ldCBhZGRyZXNzIGFuZCBwdXQgaW50byBhZGRyIHN0cnVjdHVyZSAqLworCS8qIGZpbGwgaW4gdGhlIHNvY2tldCBhZGRyZXNzIHN0cnVjdHVyZSBhbmQgY29ubmVjdCB0byBzZXJ2ZXIgKi8KKwltZW1zZXQoKGNoYXIgKikmc2VydmVyLCAnXDAnLCBzaXplb2Yoc2VydmVyKSk7CisJc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNlcnZlci5zaW5fcG9ydCA9IHBvcnQ7CisJaWYgKChob3N0ID0gZ2V0aG9zdGJ5bmFtZShOT0NBVEdFVFMoImxvY2FsaG9zdCIpKSkgPT0gTlVMTCkgeworCQlQRVJST1IoTk9DQVRHRVRTKCJnZXRob3N0YnluYW1lIikpOworCQlzZCA9IC0xOworCQlyZXR1cm47CisJfQorCW1lbWNweSgoY2hhciAqKSZzZXJ2ZXIuc2luX2FkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2Vsc2UKKwlpZiAoKHNkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpIHsKKwkJUEVSUk9SKE5PQ0FUR0VUUygid29ya3Nob3BfY29ubmVjdCIpKTsKKwkJcmV0dXJuOworCX0KKworCXNlcnZlci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwlzdHJjcHkoc2VydmVyLnN1bl9wYXRoLCBhZGRyZXNzKTsKKyNlbmRpZgorCS8qIENvbm5lY3QgdG8gc2VydmVyICovCisJaWYgKGNvbm5lY3Qoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyLCBzaXplb2Yoc2VydmVyKSkpIHsKKwkJaWYgKGVycm5vID09IEVDT05OUkVGVVNFRCkgeworCQkJY2xvc2Uoc2QpOworI2lmZGVmIElORVRfU09DS0VUUworCQkJaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisJCQkJUEVSUk9SKE5PQ0FUR0VUUygid29ya3Nob3BfY29ubmVjdCIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisjZWxzZQorCQkJaWYgKChzZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisJCQkJUEVSUk9SKE5PQ0FUR0VUUygid29ya3Nob3BfY29ubmVjdCIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisjZW5kaWYKKwkJCWlmIChjb25uZWN0KHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlciwKKwkJCQkJCXNpemVvZihzZXJ2ZXIpKSkgeworCQkJCVBFUlJPUihOT0NBVEdFVFMoIndvcmtzaG9wX2Nvbm5lY3QiKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlQRVJST1IoTk9DQVRHRVRTKCJ3b3Jrc2hvcF9jb25uZWN0IikpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogdGVsbCBub3RpZmllciB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBiZWluZyBjYWxsZWQKKwkgKiB3aGVuIHRoZXJlIGlzIGlucHV0IG9uIHRoZSBlZGl0b3IgY29ubmVjdGlvbiBzb2NrZXQKKwkgKi8KKwlpbnB1dEhhbmRsZXIgPSBYdEFwcEFkZElucHV0KGNvbnRleHQsIHNkLCAoWHRQb2ludGVyKSBYdElucHV0UmVhZE1hc2ssCisJCQkJICAgICBtZXNzYWdlRnJvbUVzZXJ2ZSwgTlVMTCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGZpbGUgPSBnZXRlbnYoTk9DQVRHRVRTKCJTUFJPX1BMVUdJTl9ERUJVRyIpKSkgIT0gTlVMTCkgeworCQljaGFyIGJ1ZltCVUZTSVpdOworCisJCXVubGluayhmaWxlKTsKKwkJc3ByaW50ZihidWYsICJkYXRlID4gJXMiLCBmaWxlKTsKKwkJc3lzdGVtKGJ1Zik7CisJCWRmZCA9IGZvcGVuKGZpbGUsICJhIik7CisJfSBlbHNlIHsKKwkJZGZkID0gTlVMTDsKKwl9CisjZW5kaWYKKworCXNwcmludGYoYnVmLCBOT0NBVEdFVFMoImNvbm5lY3RlZCAlcyAlcyAlc1xuIiksCisJCXdvcmtzaG9wX2dldF9lZGl0b3JfbmFtZSgpLAorCQlQUk9UT0NPTF9WRVJTSU9OLAorCQl3b3Jrc2hvcF9nZXRfZWRpdG9yX3ZlcnNpb24oKSk7CisJd3JpdGUoc2QsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCisJc3ByaW50ZihidWYsIE5PQ0FUR0VUUygiYWNrIDFcbiIpKTsKKwl3cml0ZShzZCwgYnVmLCBzdHJsZW4oYnVmKSk7Cit9CisKK3ZvaWQJd29ya3Nob3BfZGlzY29ubmVjdCgpCit7CisJLyogUHJvYmFibHkgbmVlZCB0byBzZW5kIHNvbWUgbWVzc2FnZSBoZXJlICovCisKKwkvKgorCSAqIHNvY2tldCBjbG9zZWQgb24gb3RoZXIgZW5kCisJICovCisJWHRSZW1vdmVJbnB1dChpbnB1dEhhbmRsZXIpOworCWNsb3NlKHNkKTsKKwlpbnB1dEhhbmRsZXIgPSAwOworCXNkID0gLTE7CisKK30KKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogU2V0IGljb24gZm9yIHRoZSB3aW5kb3cgKi8KK3ZvaWQKK3dvcmtzaG9wX3NldF9pY29uKERpc3BsYXkgKmRpc3BsYXksIFdpZGdldCBzaGVsbCwgY2hhciAqKnhwbWRhdGEsCisJCSAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCVBpeGVsCQliZ1BpeGVsOworCVhwbUF0dHJpYnV0ZXMgICB4cG1BdHRyaWJ1dGVzOworCVhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7CisJV2luZG93CQlpY29uV2luZG93OworCWludAkJZGVwdGg7CisJaW50CQlzY3JlZW5OdW07CisJUGl4bWFwCQlwaXhtYXA7CisKKwkvKiBDcmVhdGUgdGhlIHBpeG1hcC9pY29uIHdpbmRvdyB3aGljaCBpcyBzaG93biB3aGVuIHlvdQorCSAqIGljb25pZnkgdGhlIHNjY3Mgdmlld2VyCisJICogVGhpcyBjb2RlIHNuaXBwZWQgd2FzIGFkYXB0ZWQgZnJvbSBTdW4gV29ya1Nob3AncyBzb3VyY2UgYmFzZSwKKwkgKiBzZXRJY29uLmNjLgorCSAqLworCVh0VmFHZXRWYWx1ZXMoc2hlbGwsIFhtTmJhY2tncm91bmQsICZiZ1BpeGVsLCBOVUxMKTsKKwlzY3JlZW5OdW0gPSBYU2NyZWVuTnVtYmVyT2ZTY3JlZW4oWHRTY3JlZW4oc2hlbGwpKTsKKwlkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuTnVtKTsKKwl4cG1BdHRyaWJ1dGVzLnZhbHVlbWFzayA9IFhwbUNvbG9yU3ltYm9sczsKKwl4cG1BdHRyaWJ1dGVzLm51bXN5bWJvbHMgPSAxOworCXhwbUF0dHJpYnV0ZXMuY29sb3JzeW1ib2xzID0KKwkgICAgKFhwbUNvbG9yU3ltYm9sICopWHRNYWxsb2Moc2l6ZW9mIChYcG1Db2xvclN5bWJvbCkgKgorCSAgICB4cG1BdHRyaWJ1dGVzLm51bXN5bWJvbHMpOworCXhwbUF0dHJpYnV0ZXMuY29sb3JzeW1ib2xzWzBdLm5hbWUgPSBOT0NBVEdFVFMoIkJnQ29sb3IiKTsKKwl4cG1BdHRyaWJ1dGVzLmNvbG9yc3ltYm9sc1swXS52YWx1ZSA9IE5VTEw7CisJeHBtQXR0cmlidXRlcy5jb2xvcnN5bWJvbHNbMF0ucGl4ZWwgPSBiZ1BpeGVsOworCWlmIChYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YShkaXNwbGF5LAorCSAgICBSb290V2luZG93KGRpc3BsYXksIHNjcmVlbk51bSksIHhwbWRhdGEsICZwaXhtYXAsCisJICAgIE5VTEwsICZ4cG1BdHRyaWJ1dGVzKSA+PSAwKSB7CisJCWF0dHIuYmFja2dyb3VuZF9waXhtYXAgPSBwaXhtYXA7CisJCWljb25XaW5kb3cgPSBYQ3JlYXRlV2luZG93KGRpc3BsYXksIFJvb3RXaW5kb3coZGlzcGxheSwKKwkJICAgIHNjcmVlbk51bSksIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIGRlcHRoLAorCQkJCSh1bnNpZ25lZCBpbnQpQ29weUZyb21QYXJlbnQsCisJCSAgICBDb3B5RnJvbVBhcmVudCwgQ1dCYWNrUGl4bWFwLCAmYXR0cik7CisKKwkJWHRWYVNldFZhbHVlcyhzaGVsbCwKKwkJICAgIFh0Tmljb25XaW5kb3csIGljb25XaW5kb3csIE5VTEwpOworCX0KKwlYdEZyZWUoKGNoYXIgKil4cG1BdHRyaWJ1dGVzLmNvbG9yc3ltYm9scyk7Cit9CisKKy8qIE1pbmltaXplIGFuZCBtYXhpbWl6ZSBzaGVsbHMuIEZyb20gbGlidXRpbCdzIHNoZWxsLmNjLiAqLworCisvKiB1dGlsaXR5IGZ1bmN0aW9ucyBmcm9tIGxpYnV0aWwncyBzaGVsbC5jYyAqLworc3RhdGljIEJvb2xlYW4KK2lzV2luZG93TWFwcGVkKERpc3BsYXkgKmRpc3BsYXksIFdpbmRvdyB3aW4pCit7CisJWFdpbmRvd0F0dHJpYnV0ZXMgd2luQXR0cnM7CisJWEdldFdpbmRvd0F0dHJpYnV0ZXMoZGlzcGxheSwKKwkJCSAgICAgd2luLAorCQkJICAgICAmd2luQXR0cnMpOworCWlmICh3aW5BdHRycy5tYXBfc3RhdGUgPT0gSXNWaWV3YWJsZSkgeworCQlyZXR1cm4oVHJ1ZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuKEZhbHNlKTsKKwl9Cit9CisKK3N0YXRpYyBCb29sZWFuCitpc01hcHBlZChXaWRnZXQgd2lkZ2V0KQoreworCWlmICh3aWRnZXQgPT0gTlVMTCkgeworCQlyZXR1cm4oRmFsc2UpOworCX0KKworCWlmIChYdElzUmVhbGl6ZWQod2lkZ2V0KSA9PSBGYWxzZSkgeworCQlyZXR1cm4oRmFsc2UpOworCX0KKworCXJldHVybihpc1dpbmRvd01hcHBlZChYdERpc3BsYXkod2lkZ2V0KSwgWHRXaW5kb3cod2lkZ2V0KSkpOworfQorCitzdGF0aWMgQm9vbGVhbgord2lkZ2V0SXNJY29uaWZpZWQoCisJV2lkZ2V0CQkgdykKK3sKKwlBdG9tCQkgd21fc3RhdGU7CisJQXRvbQkJIGFjdF90eXBlOwkJLyogYWN0dWFsIEF0b20gdHlwZSByZXR1cm5lZCAqLworCWludAkJIGFjdF9mbXQ7CQkvKiBhY3R1YWwgZm9ybWF0IHJldHVybmVkICovCisJdV9sb25nCQkgbml0ZW1zX3JldDsJCS8qIG51bWJlciBvZiBpdGVtcyByZXR1cm5lZCAqLworCXVfbG9uZwkJIGJ5dGVzX2FmdGVyOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyAqLworCXVfbG9uZwkJKnByb3BlcnR5OwkJLyogYWN0dWFsIHByb3BlcnR5IHJldHVybmVkICovCisKKwkvKgorCSAqIElmIGEgd2luZG93IGlzIGljb25pZmllZCBpdHMgV01fU1RBVEUgaXMgc2V0IHRvIEljb25pY1N0YXRlLiBTZWUKKwkgKiBJQ0NDTSBWZXJzaW9uIDIuMCwgc2VjdGlvbiA0LjEuMy4xIGZvciBtb3JlIGRldGFpbHMuCisJICovCisKKwl3bV9zdGF0ZSA9IFhtSW50ZXJuQXRvbShYdERpc3BsYXkodyksIE5PQ0FUR0VUUygiV01fU1RBVEUiKSwgRmFsc2UpOworCWlmIChYdFdpbmRvdyh3KSAhPSAwKSB7CQkJLyogb25seSBjaGVjayBpZiB3aW5kb3cgZXhpc3RzISAqLworCQlYR2V0V2luZG93UHJvcGVydHkoWHREaXNwbGF5KHcpLCBYdFdpbmRvdyh3KSwgd21fc3RhdGUsIDBMLCAyTCwKKwkJICAgIEZhbHNlLCBBbnlQcm9wZXJ0eVR5cGUsICZhY3RfdHlwZSwgJmFjdF9mbXQsICZuaXRlbXNfcmV0LAorCQkgICAgJmJ5dGVzX2FmdGVyLCAodV9jaGFyICoqKSAmcHJvcGVydHkpOworCQlpZiAobml0ZW1zX3JldCA9PSAyICYmIHByb3BlcnR5WzBdID09IEljb25pY1N0YXRlKSB7CisJCQlyZXR1cm4gVHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBGYWxzZTsKKworfSAgICAvKiBlbmQgd2lkZ2V0SXNJY29uaWZpZWQgKi8KKwordm9pZAord29ya3Nob3BfbWluaW1pemVfc2hlbGwoV2lkZ2V0IHNoZWxsKQoreworCWlmIChzaGVsbCAhPSBOVUxMICYmCisJICAgIFh0SXNPYmplY3Qoc2hlbGwpICYmCisJICAgIFh0SXNSZWFsaXplZChzaGVsbCkgPT0gVHJ1ZSkgeworCQlpZiAoaXNNYXBwZWQoc2hlbGwpID09IFRydWUpIHsKKwkJCVhJY29uaWZ5V2luZG93KFh0RGlzcGxheShzaGVsbCksIFh0V2luZG93KHNoZWxsKSwKKwkJCSAgICAgICBYU2NyZWVuTnVtYmVyT2ZTY3JlZW4oWHRTY3JlZW4oc2hlbGwpKSk7CisJCX0KKwkJWHRWYVNldFZhbHVlcyhzaGVsbCwKKwkJCSAgICAgIFhtTmljb25pYywgVHJ1ZSwKKwkJCSAgICAgIE5VTEwpOworCX0KK30KKwordm9pZCB3b3Jrc2hvcF9tYXhpbWl6ZV9zaGVsbChXaWRnZXQgc2hlbGwpCit7CisJaWYgKHNoZWxsICE9IE5VTEwgJiYKKwkgICAgWHRJc1JlYWxpemVkKHNoZWxsKSA9PSBUcnVlICYmCisJICAgIHdpZGdldElzSWNvbmlmaWVkKHNoZWxsKSA9PSBUcnVlICYmCisJICAgIGlzTWFwcGVkKHNoZWxsKSA9PSBGYWxzZSkgeworCQlYdE1hcFdpZGdldChzaGVsbCk7CisJCS8qIFRoaXMgdXNlZCB0byBiZQorCQkgICAgIFh0UG9wZG93bihzaGVsbCk7CisJCSAgICAgWHRQb3B1cChzaGVsbCwgWHRHcmFiTm9uZSk7CisJCSAgIEhvd2V2ZXIsIEkgZm91bmQgdGhhdCB0aGF0IHdvdWxkIGRyb3AgYW55IHRyYW5zaWVudAorCQkgICB3aW5kb3dzIHRoYXQgaGFkIGJlZW4gaWNvbmlmaWVkIHdpdGggdGhlIHdpbmRvdy4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSBJQ0NDTSwgWHRNYXBXaWRnZXQgc2hvdWxkIGJlIHVzZWQKKwkJICAgdG8gYnJpbmcgYSB3aW5kb3cgZnJvbSBJY29uaWMgdG8gTm9ybWFsIHN0YXRlLgorCQkgICBIb3dldmVyLCBSaWNoIE1hdXJpIGRpZCBhIGxvdCBvZiB3b3JrIG9uIHRoaXMgZHVyaW5nCisJCSAgIEJhcnQsIGFuZCBmb3VuZCB0aGF0IFh0UG9wRG93bixYdFBvcHVwIHdhcyByZXF1aXJlZAorCQkgICB0byBmaXggc2V2ZXJhbCBidWdzIGludm9sdmluZyBtdWx0aXBsZSBDREUgd29ya3NwYWNlcy4KKwkJICAgSSd2ZSB0ZXN0ZWQgaXQgbm93IGFuZCB0aGluZ3Mgc2VlbSB0byB3b3JrIGZpbmUgYnV0CisJCSAgIEknbSBsZWF2aW5nIHRoaXMgbm90ZSBmb3IgaGlzdG9yeSBpbiBjYXNlIHRoaXMgbmVlZHMKKwkJICAgdG8gYmUgcmV2aXNpdGVkLgorCQkqLworCX0KK30KKworCitCb29sZWFuIHdvcmtzaG9wX2dldF93aWR0aF9oZWlnaHQoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpCit7CisJc3RhdGljIGludAl3aWQgPSAwOworCXN0YXRpYyBpbnQJaGd0ID0gMDsKKwlzdGF0aWMgQm9vbGVhbglmaXJzdFRpbWUgPSBUcnVlOworCXN0YXRpYyBCb29sZWFuCXN1Y2Nlc3MgPSBGYWxzZTsKKworCWlmIChmaXJzdFRpbWUpIHsKKwkJY2hhcgkqc2V0dGluZ3M7CisKKwkJc2V0dGluZ3MgPSBnZXRlbnYoTk9DQVRHRVRTKCJTUFJPX0dVSV9XSURUSF9IRUlHSFQiKSk7CisJCWlmIChzZXR0aW5ncyAhPSBOVUxMKSB7CisJCQl3aWQgPSBhdG9pKHNldHRpbmdzKTsKKwkJCXNldHRpbmdzID0gc3RycmNocihzZXR0aW5ncywgJzonKTsKKwkJCWlmIChzZXR0aW5ncysrICE9IE5VTEwpIHsKKwkJCQloZ3QgPSBhdG9pKHNldHRpbmdzKTsKKwkJCX0KKwkJCWlmICh3aWQgPiAwICYmIGhndCA+IDApIHsKKwkJCQlzdWNjZXNzID0gVHJ1ZTsKKwkJCX0KKwkJCWZpcnN0VGltZSA9IEZhbHNlOworCQl9CisJfQorCisJaWYgKHN1Y2Nlc3MpIHsKKwkJKndpZHRoID0gd2lkOworCQkqaGVpZ2h0ID0gaGd0OworCX0KKwlyZXR1cm4gc3VjY2VzczsKK30KKworCitCb29sZWFuIHdvcmtzaG9wX2dldF9yb3dzX2NvbHMoaW50ICpyb3dzLCBpbnQgKmNvbHMpCit7CisJc3RhdGljIGludAlyID0gMDsKKwlzdGF0aWMgaW50CWMgPSAwOworCXN0YXRpYyBCb29sZWFuCWZpcnN0VGltZSA9IFRydWU7CisJc3RhdGljIEJvb2xlYW4Jc3VjY2VzcyA9IEZhbHNlOworCisJaWYgKGZpcnN0VGltZSkgeworCQljaGFyCSpzZXR0aW5nczsKKworCQlzZXR0aW5ncyA9IGdldGVudihOT0NBVEdFVFMoIlNQUk9fR1VJX1JPV1NfQ09MUyIpKTsKKwkJaWYgKHNldHRpbmdzICE9IE5VTEwpIHsKKwkJCXIgPSBhdG9pKHNldHRpbmdzKTsKKwkJCXNldHRpbmdzID0gc3RycmNocihzZXR0aW5ncywgJzonKTsKKwkJCWlmIChzZXR0aW5ncysrICE9IE5VTEwpIHsKKwkJCQljID0gYXRvaShzZXR0aW5ncyk7CisJCQl9CisJCQlpZiAociA+IDAgJiYgYyA+IDApIHsKKwkJCQlzdWNjZXNzID0gVHJ1ZTsKKwkJCX0KKwkJCWZpcnN0VGltZSA9IEZhbHNlOworCQl9CisJfQorCisJaWYgKHN1Y2Nlc3MpIHsKKwkJKnJvd3MgPSByOworCQkqY29scyA9IGM7CisJfQorCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICogVG9vbGJhciBjb2RlCisgKi8KKwordm9pZCB3b3Jrc2hvcF9zZW5zaXRpdml0eShpbnQgbnVtLCBjaGFyICp0YWJsZSkKK3sKKwkvKiBidWlsZCB1cCBhIHZlcmIgdGFibGUgKi8KKwlWZXJiU2Vuc2UgKnZzOworCWludCBpOworCWNoYXIgKnM7CisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gNTAwKSkgeworCQlyZXR1cm47CisJfQorCisJdnMgPSAoVmVyYlNlbnNlICopbWFsbG9jKChudW0rMSkqc2l6ZW9mKFZlcmJTZW5zZSkpOworCisJLyogUG9pbnQgdG8gdGhlIGluZGl2aWR1YWwgbmFtZXMgKGRlc3Ryb3lzIHRoZSB0YWJsZSBzdHJpbmcsIGJ1dAorCSAqIHRoYXQncyBva2F5IC0tIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBkdXBsaWNhdGluZyBzdHJpbmdzKSAqLworCXMgPSB0YWJsZTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJd2hpbGUgKCpzID09ICcgJykgeworCQkJcysrOworCQl9CisJCXZzW2ldLnZlcmIgPSBzOworCQl3aGlsZSAoKnMgJiYgKCpzICE9ICcgJykgJiYgKCpzICE9ICdcMDAxJykpIHsKKwkJCXMrKzsKKwkJfQorCQlpZiAoKnMgPT0gMCkgeworCQkJdnNbaV0udmVyYiA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKnMgPT0gJ1wwMDEnKSB7CisJCQkqcyA9IDA7CisJCQlzKys7CisJCX0KKwkJKnMgPSAwOworCQlzKys7CisJCXdoaWxlICgqcyA9PSAnICcpIHsKKwkJCXMrKzsKKwkJfQorCQlpZiAoKnMgPT0gJzEnKSB7CisJCQl2c1tpXS5zZW5zZSA9IDE7CisJCX0gZWxzZSB7CisJCQl2c1tpXS5zZW5zZSA9IDA7CisJCX0KKwkJcysrOworCX0KKwl2c1tpXS52ZXJiID0gTlVMTDsKKworCXdvcmtzaG9wX2ZyYW1lX3NlbnNpdGl2aXRpZXModnMpOworCisJZnJlZSh2cyk7Cit9CisKKy8qCisgKiBPcHRpb25zIGNvZGUKKyAqLworLyogU2V0IGFuIGVkaXRvciBvcHRpb24uCisgKiBJR05PUkUgYW4gb3B0aW9uIGlmIHlvdSBkbyBub3QgcmVjb2duaXplIGl0LgorICovCit2b2lkIHdvcmtzaG9wX3NldF9vcHRpb25fZmlyc3QoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpCit7CisJLyogQ3VycmVudGx5IHZhbHVlIGNhbiBvbmx5IGJlIG9uL29mZi4gVGhpcyBtYXkgY2hhbmdlIGxhdGVyIChmb3IKKwkgKiBleGFtcGxlIHRvIHNldCBhbiBvcHRpb24gbGlrZSAiYmFsbG9vbiBldmFsdWF0ZSBkZWxheSIsIGJ1dAorCSAqIGZvciBub3cganVzdCBjb252ZXJ0IGl0IGludG8gYSBib29sZWFuICovCisJQm9vbGVhbiBvbiA9ICFzdHJjbXAodmFsdWUsICJvbiIpOworCisJaWYgKCFzdHJjbXAobmFtZSwgIndvcmtzaG9wa2V5cyIpKSB7CisJCXdvcmtzaG9wX2hvdGtleXMob24pOworCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2F2ZWZpbGVzIikpIHsKKwkJc2F2ZV9maWxlcyA9IG9uOworCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYmFsbG9vbiIpKSB7CisJCXdvcmtzaG9wX2JhbGxvb25fbW9kZShvbik7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJiYWxsb29uZGVsYXkiKSkgeworCQlpbnQgZGVsYXkgPSBhdG9pKHZhbHVlKTsKKwkJLyogU2hvdWxkIEkgdmFsaWRhdGUgdGhlIG51bWJlciBoZXJlPz8gKi8KKwkJd29ya3Nob3BfYmFsbG9vbl9kZWxheShkZWxheSk7CisJfSBlbHNlIHsKKwkJLyogTGV0IGVkaXRvciBpbnRlcnByZXQgaXQgKi8KKwkJd29ya3Nob3Bfc2V0X29wdGlvbihuYW1lLCB2YWx1ZSk7CisJfQorfQorCisKKworLyoKKyAqIFNlbmQgaW5mb3JtYXRpb24gdG8gZXNlcnZlIG9uIGNlcnRhaW4gZWRpdG9yIGV2ZW50cworICogWW91IG11c3QgbWFrZSBzdXJlIHRoZXNlIGFyZSBjYWxsZWQgd2hlbiBuZWNlc3NhcnkKKyAqLworCit2b2lkIHdvcmtzaG9wX2ZpbGVfY2xvc2VkKGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgYnVmZmVyWzIqTUFYUEFUSExFTl07CisJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygiZGVsZXRlZEZpbGUgJXNcbiIpLCBmaWxlbmFtZSk7CisJd3JpdGUoc2QsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworfQorCit2b2lkIHdvcmtzaG9wX2ZpbGVfY2xvc2VkX2xpbmVubyhjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKK3sKKwljaGFyIGJ1ZmZlclsyKk1BWFBBVEhMRU5dOworCXNwcmludGYoYnVmZmVyLCBOT0NBVEdFVFMoImRlbGV0ZWRGaWxlICVzICVkXG4iKSwgZmlsZW5hbWUsIGxpbmVubyk7CisJd3JpdGUoc2QsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworfQorCit2b2lkIHdvcmtzaG9wX2ZpbGVfb3BlbmVkKGNoYXIgKmZpbGVuYW1lLCBpbnQgcmVhZE9ubHkpCit7CisJY2hhciBidWZmZXJbMipNQVhQQVRITEVOXTsKKwlzcHJpbnRmKGJ1ZmZlciwgTk9DQVRHRVRTKCJsb2FkZWRGaWxlICVzICVkXG4iKSwgZmlsZW5hbWUsIHJlYWRPbmx5KTsKKwl3cml0ZShzZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Cit9CisKKwordm9pZCB3b3Jrc2hvcF9maWxlX3NhdmVkKGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgYnVmZmVyWzIqTUFYUEFUSExFTl07CisJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygic2F2ZWRGaWxlICVzXG4iKSwgZmlsZW5hbWUpOworCXdyaXRlKHNkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworCS8qIExldCBlZGl0b3IgcmVwb3J0IGFueSBtb3ZlZCBtYXJrcyB0aGF0IHRoZSBlc2VydmUgY2xpZW50CisJICogc2hvdWxkIGRlYWwgd2l0aCAoZm9yIGV4YW1wbGUsIG1vdmluZyBsb2NhdGlvbi1iYXNlZCBicmVha3BvaW50cykgKi8KKwl3b3Jrc2hvcF9tb3ZlZF9tYXJrcyhmaWxlbmFtZSk7Cit9CisKK3ZvaWQgd29ya3Nob3BfbW92ZV9tYXJrKGNoYXIgKmZpbGVuYW1lLCBpbnQgbWFya0lkLCBpbnQgbmV3TGluZW5vKQoreworCWNoYXIgYnVmZmVyWzIqTUFYUEFUSExFTl07CisJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygibW92ZU1hcmsgJXMgJWQgJWRcbiIpLCBmaWxlbmFtZSwgbWFya0lkLCBuZXdMaW5lbm8pOworCXdyaXRlKHNkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKwordm9pZCB3b3Jrc2hvcF9maWxlX21vZGlmaWVkKGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgYnVmZmVyWzIqTUFYUEFUSExFTl07CisJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygibW9kaWZpZWRGaWxlICVzXG4iKSwgZmlsZW5hbWUpOworCXdyaXRlKHNkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKwordm9pZCB3b3Jrc2hvcF9mcmFtZV9tb3ZlZChpbnQgbmV3X3gsIGludCBuZXdfeSwgaW50IG5ld193LCBpbnQgbmV3X2gpCit7CisJY2hhciBidWZmZXJbMjAwXTsKKworCWlmIChzZCA+PSAwKQorCXsKKwkJc3ByaW50ZihidWZmZXIsIE5PQ0FUR0VUUygiZnJhbWVBdCAlZCAlZCAlZCAlZFxuIiksCisJCQkJbmV3X3gsIG5ld195LCBuZXdfdywgbmV3X2gpOworCQl3cml0ZShzZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisJfQorfQorCisvKiBBIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciBoYXMgYmVlbiBwdXNoZWQuCisgKiBDbGllbnRkYXRhIGlzIGEgcG9pbnRlciB1c2VkIGJ5IHRoZSBlZGl0b3IgY29kZSB0byBmaWd1cmUgb3V0IHRoZQorICogcG9zaXRpb25zIGZvciB0aGlzIHRvb2xiYXIgKHByb2JhYmx5IGJ5IHN0b3JpbmcgYSB3aW5kb3cgcG9pbnRlciwKKyAqIGFuZCB0aGVuIGZldGNoaW5nIHRoZSBjdXJyZW50IGJ1ZmZlciBmb3IgdGhhdCB3aW5kb3cgYW5kIGxvb2tpbmcgdXAKKyAqIGN1cnNvciBhbmQgc2VsZWN0aW9uIHBvc2l0aW9ucyBldGMuKSAqLwordm9pZCB3b3Jrc2hvcF9wZXJmb3JtX3ZlcmIoY2hhciAqdmVyYiwgdm9pZCAqY2xpZW50RGF0YSkKK3sKKwljaGFyICpmaWxlbmFtZTsKKwlpbnQgY3VyTGluZTsKKwlpbnQgY3VyQ29sOworCWludCBzZWxTdGFydExpbmU7CisJaW50IHNlbFN0YXJ0Q29sOworCWludCBzZWxFbmRMaW5lOworCWludCBzZWxFbmRDb2w7CisJaW50IHNlbExlbmd0aDsKKwljaGFyICpzZWxlY3Rpb247CisKKwljaGFyIGJ1ZlsyKk1BWFBBVEhMRU5dOworLyogTGF0ZXI6IG5lZWRzRmlsZVBvcyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgbmVlZCB0byBmZXRjaCBhbGwgdGhpcworICogaW5mbyBmb3IgdGhpcyB2ZXJiLi4uIGZvciBub3csIGhvd2V2ZXIsIGl0IGxvb2tzIGFzIGlmCisgKiBlc2VydmUgcGFyc2luZyByb3V0aW5lcyBkZXBlbmQgb24gaXQgYWx3YXlzIGJlaW5nIHByZXNlbnQgKi8KKworCWlmICh3b3Jrc2hvcF9nZXRfcG9zaXRpb25zKGNsaWVudERhdGEsCisJCQkJICAgJmZpbGVuYW1lLAorCQkJCSAgICZjdXJMaW5lLAorCQkJCSAgICZjdXJDb2wsCisJCQkJICAgJnNlbFN0YXJ0TGluZSwKKwkJCQkgICAmc2VsU3RhcnRDb2wsCisJCQkJICAgJnNlbEVuZExpbmUsCisJCQkJICAgJnNlbEVuZENvbCwKKwkJCQkgICAmc2VsTGVuZ3RoLAorCQkJCSAgICZzZWxlY3Rpb24pKSB7CisJCWlmIChzZWxlY3Rpb24gPT0gTlVMTCkgeworCQkJc2VsZWN0aW9uID0gTk9DQVRHRVRTKCIiKTsKKwkJfQorCisJCS8qIFNob3VsZCBJIHNhdmUgdGhlIGZpbGVzPz8/IFRoaXMgaXMgY3VycmVudGx5IGRvbmUgYnkgY2hlY2tpbmcKKwkJICAgaWYgdGhlIHZlcmIgaXMgb25lIG9mIGEgZmV3IHJlY29nbml6ZWQgb25lcy4gTGF0ZXIgd2UgY2FuIHBhc3MKKwkJICAgdGhpcyBsaXN0IGZyb20gZXNlcnZlIHRvIHRoZSBlZGl0b3IgKGl0J3MgY3VycmVudGx5IGhhcmRjb2RlZCBpbgorCQkgICB2aSBhbmQgZW1hY3MgYXMgd2VsbCkuICovCisJCWlmIChzYXZlX2ZpbGVzKSB7CisJCQlpZiAoIXN0cmNtcCh2ZXJiLCAiYnVpbGQuYnVpbGQiKSB8fCAhc3RyY21wKHZlcmIsICJidWlsZC5idWlsZC1maWxlIikgfHwKKwkJCSAgICAhc3RyY21wKHZlcmIsICJkZWJ1Zy5maXgiKSB8fCAhc3RyY21wKHZlcmIsICJkZWJ1Zy5maXgtYWxsIikpIHsKKwkJCQl3b3Jrc2hvcF9zYXZlX2ZpbGVzKCk7CisJCQl9CisJCX0KKworCQlzcHJpbnRmKGJ1ZiwgTk9DQVRHRVRTKCJ0b29sVmVyYiAlcyAlcyAlZCwlZCAlZCwlZCAlZCwlZCAlZCAlc1xuIiksCisJCQl2ZXJiLAorCQkJZmlsZW5hbWUsCisJCQljdXJMaW5lLCBjdXJDb2wsCisJCQlzZWxTdGFydExpbmUsIHNlbFN0YXJ0Q29sLAorCQkJc2VsRW5kTGluZSwgc2VsRW5kQ29sLAorCQkJc2VsTGVuZ3RoLAorCQkJc2VsZWN0aW9uKTsKKwkJd3JpdGUoc2QsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQlpZiAoKnNlbGVjdGlvbikgeworCQkJZnJlZShzZWxlY3Rpb24pOworCQl9CisJfQorfQorCisvKiBTZW5kIGEgbWVzc2FnZSB0byBlc2VydmUgKi8KK3ZvaWQgd29ya3Nob3Bfc2VuZF9tZXNzYWdlKGNoYXIgKmJ1ZikKK3sKKwl3cml0ZShzZCwgYnVmLCBzdHJsZW4oYnVmKSk7Cit9CisKKy8qIFNvbWUgbWV0aG9kcywgbGlrZSBjdXJyZW50RmlsZSwgY3Vyc29yUG9zLCBldGMuIGFyZSBtaXNzaW5nIGhlcmUuCisgKiBCdXQgaXQgbG9va3MgbGlrZSB0aGVzZSBhcmUgdXNlZCBmb3IgTm9IYW5kcyB0ZXN0aW5nIG9ubHkgc28gd2UKKyAqIHdvbid0IGJvdGhlciByZXF1aXJpbmcgZWRpdG9ycyB0byBpbXBsZW1lbnQgdGhlc2UKKyAqLworCisKKyNpZmRlZiBERUJVRworCit2b2lkCitwbGRlYnVnKAorCWNoYXIJCSpmbXQsCS8qIGEgcHJpbnRmIHN0eWxlIGZvcm1hdCBsaW5lICovCisJLi4uKQoreworCXZhX2xpc3QJCSBhcDsKKworCWlmIChkZmQgIT0gTlVMTCkgeworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJdmZwcmludGYoZGZkLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJZmZsdXNoKGRmZCk7CisJfQorCit9ICAgIC8qIGVuZCBwbGRlYnVnICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2ludGVncmF0aW9uLmggYi9zcmMvaW50ZWdyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM2ODdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ludGVncmF0aW9uLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJVmlzdWFsIFdvcmtzaG9wIGludGVncmF0aW9uIGJ5IEdvcmRvbiBQcmlldXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisvKgorICBUSElTIElTIEFOIFVOU1RBQkxFIElOVEVSRkFDRSEgSXQgaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5CisgIGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMsIHBvc3NpYmx5IGJyZWFraW5nIGNvbXBhdGliaWxpdHkhCisqLworCisjaWZuZGVmIF9JTlRFR1JBVElPTl9ICisjZGVmaW5lIF9JTlRFR1JBVElPTl9ICisKKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjaW5jbHVkZSA8WG0vWG0uaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRW5hYmxlIE5vSGFuZHMgdGVzdCBzdXBwb3J0IGZ1bmN0aW9ucy4gRGVmaW5lIHRoaXMgb25seSBpZiB5b3Ugd2FudCB0bworICAgY29tcGlsZSBpbiBzdXBwb3J0IGluIHRoZSBlZGl0b3Igc3VjaCB0aGF0IGl0IGNhbiBiZSBydW4gdW5kZXIKKyAgIHRoZSBXb3JrU2hvcCB0ZXN0IHN1aXRlLiAqLworI2lmbmRlZiBOT0hBTkRTX1NVUFBPUlRfRlVOQ1RJT05TCisjZGVmaW5lIE5PSEFORFNfU1VQUE9SVF9GVU5DVElPTlMKKyNlbmRpZgorCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgaGFzIHRocmVlIHBhcnRzLgorICogMS4gRnVuY3Rpb25zIHlvdSBuZWVkIHRvIGltcGxlbWVudDsgdGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgaW50ZWdyYXRpb24KKyAqICAgIGxpYnJhcnkKKyAqIDIuIEZ1bmN0aW9ucyB5b3UgbmVlZCB0byBjYWxsIHdoZW4gY2VydGFpbiBldmVudHMgaGFwcGVuIGluIHRoZSBlZGl0b3I7CisgKiAgICB0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0aW9uIGxpYnJhcnkKKyAqIDMuIFV0aWxpdHkgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBpbnRlZ3JhdGlvbiBsaWJyYXJ5OyB0aGVzZSBtYWtlCisgKgkgIHRhc2sgMSBhIGJpdCBlYXNpZXIuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGVkaXRvcgorICogaW50ZWdyYXRpb24gY29kZSAoYW5kIHdpbGwgYmUgZWRpdG9yLXNwZWNpZmljKS4gUGxlYXNlIHNlZSB0aGUKKyAqIHNhbXBsZSB3b3Jrc2hvcC5jIGZpbGUgZm9yIGNvbW1lbnRzIGV4cGxhaW5pbmcgd2hhdCBlYWNoIGZ1bmN0aW9ucworICogbmVlZHMgdG8gZG8sIHdoYXQgdGhlIGFyZ3VtZW50cyBtZWFuLCBldGMuCisgKi8KKworLyoKKyAqIFRoaXMgc3RyaW5nIGlzIHJlY29nbml6ZWQgYnkgZXNlcnZlIGFuZCBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UuCisgKiBUaGlzIGlzIGhvdyB0aGUgZWRpdG9yIGRldGVjdHMgdGhhdCBpdCBpcyB0YWxraW5nIHRvIE5FZGl0IGluc3RlYWQKKyAqIG9mIFZpbSwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIGZyb20gdGhlIGVkaXRvci4KKyAqIEV4YW1wbGVzOiAibmVkaXQiLCAiZ3ZpbSIKKyAqLworY2hhciAqd29ya3Nob3BfZ2V0X2VkaXRvcl9uYW1lKCk7CisKKy8qCisgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgZWRpdG9yLgorICogVGhpcyBudW1iZXIgaXMgY29tbXVuaWNhdGVkIGFsb25nIHdpdGggdGhlIHByb3RvY29sCisgKiB2ZXJzaW9uIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAqIEV4YW1wbGVzOiAiNS4wLjIiLCAiMTkuMyIKKyAqLworY2hhciAqd29ya3Nob3BfZ2V0X2VkaXRvcl92ZXJzaW9uKCk7CisKKworLyogR290byBhIGdpdmVuIGxpbmUgaW4gYSBnaXZlbiBmaWxlICovCit2b2lkIHdvcmtzaG9wX2dvdG9fbGluZShjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubyk7CisKKworLyogU2V0IG1hcmsgaW4gYSBnaXZlbiBmaWxlICovCit2b2lkIHdvcmtzaG9wX3NldF9tYXJrKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBpbnQgbWFya0lkLCBpbnQgdHlwZSk7CisKKworLyogQ2hhbmdlIG1hcmsgdHlwZSAoZm9yIGV4YW1wbGUgZnJvbSBjdXJyZW50LXBjIHRvIHBjLWFuZC1icmVha3BvaW50KSAqLwordm9pZCB3b3Jrc2hvcF9jaGFuZ2VfbWFya190eXBlKGNoYXIgKmZpbGVuYW1lLCBpbnQgbWFya0lkLCBpbnQgdHlwZSk7CisKKy8qCisgKiBHb3RvIHRoZSBnaXZlbiBtYXJrIGluIGEgZmlsZSAoZS5nLiBzaG93IGl0KS4KKyAqIElmIG1lc3NhZ2UgaXMgbm90IG51bGwsIGRpc3BsYXkgaXQgaW4gdGhlIGZvb3Rlci4KKyAqLworCit2b2lkIHdvcmtzaG9wX2dvdG9fbWFyayhjaGFyICpmaWxlbmFtZSwgaW50IG1hcmtJZCwgY2hhciAqbWVzc2FnZSk7CisKKworLyogRGVsZXRlIG1hcmsgKi8KK3ZvaWQgd29ya3Nob3BfZGVsZXRlX21hcmsoY2hhciAqZmlsZW5hbWUsIGludCBtYXJrSWQpOworCisvKiBCZWdpbi9lbmQgcGFpciBvZiBtZXNzYWdlcyBpbmRpY2F0aW5nIHRoYXQgYSBzZXJpZXMgb2YgX3NldF9tYXJrIGFuZAorICogX2RlbGV0ZV9tYXJrIG1lc3NhZ2VzIHdpbGwgYmUgc2VudC4gVGhpcyBjYW4vc2hvdWxkIGJlIHVzZWQgdG8gc3VwcHJlc3MgZ3VpCisgKiByZWRyYXdzIGJldHdlZW4gdGhlIGJlZ2luIGFuZCBlbmQgbWVzc2FnZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugc3dpdGNoCisgKiB0byBhIGhlYWRlcmZpbGUgdGhhdCBoYXMgYSBjbGFzcyBicmVha3BvaW50IHNldCwgdGhlcmUgbWF5IGJlIGh1bmRyZWRzCisgKiBvZiBtYXJrcyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQuIFlvdSBkb24ndCB3YW50IHRvIHJlZnJlc2ggdGhlIGd1aSBmb3IgZWFjaAorICogYWRkZWQgc2lnbiwgeW91IHdhbnQgdG8gd2FpdCB1bnRpbCB0aGUgZmluYWwgZW5kIG1lc3NhZ2UuCisgKi8KK3ZvaWQgd29ya3Nob3BfbWFya19iYXRjaF9iZWdpbigpOwordm9pZCB3b3Jrc2hvcF9tYXJrX2JhdGNoX2VuZCgpOworCisKKy8qIExvYWQgYSBnaXZlbiBmaWxlIGludG8gdGhlIFdvcmtTaG9wIGJ1ZmZlci4gImZyYW1laWQiIGlzIGEgdG9rZW4gc3RyaW5nCisgKiB0aGF0IGlkZW50aWZpZXMgd2hpY2ggZnJhbWUgdGhlIGZpbGUgd291bGQgbGlrZSB0byBiZSBsb2FkZWQgaW50by4gVGhpcworICogd2lsbCB1c3VhbGx5IGJlIG51bGwsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgZnJhbWUuCisgKiBIb3dldmVyLCBpZiBmcmFtZWlkIGlzIG5vdCBudWxsLCB5b3UgbmVlZCB0byBmaW5kIGEgZnJhbWUgdGhhdCBoYXMgdGhpcworICogZnJhbWVpZCwgYW5kIHJlcGxhY2UgdGhlIGZpbGUgaW4gdGhhdCBmcmFtZS4gRmluYWxseSwgaWYgdGhlIGZyYW1laWQgaXMKKyAqIG9uZSB5b3UgaGF2ZW4ndCBzZWVuIGJlZm9yZSwgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgZnJhbWUgZm9yIHRoaXMgZmlsZS4KKyAqIE5vdGUgdGhhdCAiZnJhbWVpZCIgaXMgYSBzdHJpbmcgdmFsdWUsIG5vdCBqdXN0IGFuIG9wYXF1ZSBwb2ludGVyLCBzbworICogeW91IHNob3VsZCB1c2Ugc3RyY21wIHJhdGhlciB0aGFuID09IHdoZW4gdGVzdGluZyBmb3IgZXF1YWxpdHkuCisgKi8KK3ZvaWQgd29ya3Nob3BfbG9hZF9maWxlKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZSwgY2hhciAqZnJhbWVpZCk7CisKKworLyogUmVsb2FkIHRoZSBXb3JrU2hvcCBidWZmZXIgKi8KK3ZvaWQgd29ya3Nob3BfcmVsb2FkX2ZpbGUoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lKTsKKworCisvKiBTaG93IHRoZSBnaXZlbiBmaWxlICovCit2b2lkIHdvcmtzaG9wX3Nob3dfZmlsZShjaGFyICpmaWxlbmFtZSk7CisKKworLyogRnJvbnQgdGhlIGdpdmVuIGZpbGUgKi8KK3ZvaWQgd29ya3Nob3BfZnJvbnRfZmlsZShjaGFyICpmaWxlbmFtZSk7CisKKworLyogU2F2ZSB0aGUgZ2l2ZW4gZmlsZSAgKi8KK3ZvaWQgd29ya3Nob3Bfc2F2ZV9maWxlKGNoYXIgKmZpbGVuYW1lKTsKKworLyogU2F2ZSBhbGwgV29ya1Nob3AgZWRpdGVkIGZpbGVzLiBZb3UgY2FuIGFzayB1c2VyIGFib3V0IG1vZGlmaWVkIGZpbGVzCisgKiBhbmQgc2tpcCBzYXZpbmcgYW55IGZpbGVzIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0byBzYXZlLgorICogVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gdGhlIHVzZXIgaXNzdWVzIGEgYnVpbGQsIGEgZml4LAorICogZXRjLiAoYW5kIGFsc28gaWYgeW91IHNlbGVjdCAiU2F2ZSBBbGwiIGZyb20gdGhlIEZpbGUgbWVudSA6LSkKKyAqLwordm9pZCB3b3Jrc2hvcF9zYXZlX2ZpbGVzKCk7CisKKy8qIFNob3cgYSBtZXNzYWdlIGluIGFsbCBmb290ZXJzLgorICAgU2V2ZXJpdHkgY3VycmVudGx5IGlzIG5vdCBkZWZpbmVkLiAqLwordm9pZCB3b3Jrc2hvcF9mb290ZXJfbWVzc2FnZShjaGFyICptZXNzYWdlLCBpbnQgc2V2ZXJpdHkpOworCisvKiBNaW5pbWl6ZSBhbGwgd2luZG93cyAqLwordm9pZCB3b3Jrc2hvcF9taW5pbWl6ZSgpOworCisKKy8qIE1heGltaXplIGFsbCB3aW5kb3dzICovCit2b2lkIHdvcmtzaG9wX21heGltaXplKCk7CisKKworLyoKKyAqIENyZWF0ZSBhIG5ldyBtYXJrIHR5cGUsIGFzc2lnbiBpdCBhIGdpdmVuIGluZGV4LCBhIGdpdmVuIHRleHRiYWNrZ3JvdW5kCisgKiBjb2xvciwgYW5kIGEgZ2l2ZW4gbGVmdC1tYXJnaW4gc2lnbiAod2hlcmUgc2lnbiBpcyBhIGZpbGVuYW1lIHRvIGFuCisgKiAueHBtIGZpbGUpCisgKi8KK3ZvaWQgd29ya3Nob3BfYWRkX21hcmtfdHlwZShpbnQgaWR4LCBjaGFyICpjb2xvcnNwZWMsIGNoYXIgKnNpZ24pOworCisKKy8qIEdldCBtYXJrIGxpbmUgbnVtYmVyICovCitpbnQgd29ya3Nob3BfZ2V0X21hcmtfbGluZW5vKGNoYXIgKmZpbGVuYW1lLCBpbnQgbWFya0lkKTsKKworCisvKiBFeGl0IGVkaXRvcjsgc2F2ZSBjb25maXJtYXRpb24gZGlhbG9ncyBhcmUgb2theSAqLwordm9pZCB3b3Jrc2hvcF9xdWl0KCk7CisKKy8qIFNldCBhbiBlZGl0b3Igb3B0aW9uLgorICogRm9yIGV4YW1wbGUsIG5hbWU9InN5bnRheCIsdmFsdWU9Im9uIiB3b3VsZCBlbmFibGUgc3ludGF4IGhpZ2hsaWdodGluZy4KKyAqIFRoZSBjdXJyZW50bHkgZGVmaW5lZCBvcHRpb25zIGFyZToKKyAqICAgIGxpbmVubwkJe29uLG9mZn0Jc2hvdyBsaW5lIG51bWJlcnMKKyAqICAgIHN5bnRheAkJe29uLG9mZn0JaGlnaGxpZ2h0IHN5bnRheAorICogICAgcGFyZW50aGVzZXMJe29uLG9mZn0Jc2hvdyBtYXRjaGluZyBwYXJlbnRoZXNlcworICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBpbnRlcnByZXRlZCBieSB0aGUgbGlicmFyeSBmb3IgeW91IChzbyB5b3UKKyAqIHdpbGwgbmV2ZXIgc2VlIHRoZSBtZXNzYWdlLiBIb3dldmVyLCB0aGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgeW91CisgKiB0byBwcm92aWRlIGNlcnRhaW4gY2FsbGJhY2tzLCBsaWtlIHJlc3RvcmUgaG90a2V5cyBvciBzYXZlIGFsbCBmaWxlcy4KKyAqIFRoZXNlIGFyZSBkb2N1bWVudGVkIHNlcGFyYXRlbHkpLgorICogICAgd29ya3Nob3BrZXlzCXtvbixvZmZ9CXNldCB3b3Jrc2hvcCBob3RrZXlzCisgKiAgICBzYXZlZmlsZXMJCXtvbixvZmZ9CXNhdmUgYWxsIGZpbGVzIGJlZm9yZSBpc3N1aW5nIGEgYnVpbGQKKyAqICAgIGJhbGxvb24JCXtvbixvZmZ9CWVuYWJsZS9kaXNhYmxlIGJhbGxvb24gZXZhbHVhdGUKKyAqCisgKiBJR05PUkUgYW4gb3B0aW9uIGlmIHlvdSBkbyBub3QgcmVjb2duaXplIGl0LgorICovCit2b2lkIHdvcmtzaG9wX3NldF9vcHRpb24oY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworCisvKgorICogKFNlZSB3b3Jrc2hvcF9hZGRfZnJhbWUgZmlyc3QuKSBUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBlZGl0b3IKKyAqIHRoYXQgdGhlIGZyYW1lIGZvciB0aGUgZ2l2ZW4gd2luZG93IChpbmRpY2F0ZWQgYnkgImZyYW1lIiwgd2hpY2gKKyAqIHdhcyBzdXBwbGllZCBieSB0aGUgZWRpdG9yIGluIHdvcmtzaG9wX2FkZF9mcmFtZSkgaGFzIGJlZW4gY3JlYXRlZC4KKyAqIFRoaXMgY2FuIGhhcHBlbiBtdWNoIGxhdGVyIHRoYW4gdGhlIHdvcmtzaG9wX2FkZF9mcmFtZSBtZXNzYWdlLCBzaW5jZQorICogb2Z0ZW4gYSB3aW5kb3cgaXMgY3JlYXRlZCBvbiBlZGl0b3Igc3RhcnR1cCwgd2hpbGUgdGhlIGZyYW1lIGRlc2NyaXB0aW9uCisgKiBpcyBwYXNzZWQgb3ZlciBmcm9tIGVzZXJ2ZSBtdWNoIGxhdGVyLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLgorICogVGhpcyBnaXZlcyB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIGtpY2sgaXRzIEdVSSB0byBzaG93IHRoZSBmcmFtZQorICogcHJvcGVybHk7IHR5cGljYWxseSB5b3UnbGwgdW5tYW5hZ2UgYW5kIHJlbWFuYWdlIHRoZSBwYXJlbnQgd2lkZ2V0IHRvCisgKiBmb3JjZSBhIGdlb21ldHJ5IHJlY2FsY3VsYXRpb24uCisgKi8KKwordm9pZCB3b3Jrc2hvcF9yZWNvbmZpZ3VyZV9mcmFtZSh2b2lkICpmcmFtZSk7CisKKworLyogQXJlIHRoZXJlIGFueSBtb3ZlZCBtYXJrcz8gSWYgc28sIGNhbGwgd29ya3Nob3BfbW92ZV9tYXJrIG9uCisgKiBlYWNoIG9mIHRoZW0gbm93LiBUaGlzIGlzIGhvdyBlc2VydmUgY2FuIGZpbmQgb3V0IGlmIGZvciBleGFtcGxlCisgKiBicmVha3BvaW50cyBoYXZlIG1vdmVkIHdoZW4gYSBwcm9ncmFtIGhhcyBiZWVuIHJlY29tcGlsZWQgYW5kCisgKiByZWxvYWRlZCBpbnRvIGRieC4KKyAqLwordm9pZCB3b3Jrc2hvcF9tb3ZlZF9tYXJrcyhjaGFyICpmaWxlbmFtZSk7CisKKworLyogQSBidXR0b24gaW4gdGhlIHRvb2xiYXIgaGFzIGJlZW4gcHVzaGVkLiAiZnJhbWUiIGlzIHByb3ZpZGVkCisgKiB3aGljaCBzaG91bGQgbGV0IHlvdSBkZXRlcm1pbmUgd2hpY2ggdG9vbGJhciBoYWQgYSBidXR0b24gcHVzaGVkCisgKiAoeW91IHN1cHBsaWVkIHRoaXMgY2xpZW50RGF0YSB3aGVuIHlvdSBjcmVhdGVkIGEgdG9vbGJhcikuIEZyb20KKyAqIHRoaXMgeW91IHNob3VsZCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSB0aGUgb3BlcmF0aW9uCisgKiBhcHBsaWVzIHRvLCBhbmQgZm9yIHRoYXQgd2luZG93IHRoZSBjdXJzb3IgbGluZSBhbmQgY29sdW1uLAorICogc2VsZWN0aW9uIGJlZ2luIGxpbmUgYW5kIGNvbHVtbiwgc2VsZWN0aW9uIGVuZCBsaW5lIGFuZCBjb2x1bW4sCisgKiBzZWxlY3Rpb24gdGV4dCBhbmQgc2VsZWN0aW9uIHRleHQgbGVuZ3RoLiBUaGUgY29sdW1uIG51bWJlcnMgYXJlCisgKiBjdXJyZW50bHkgdW51c2VkIGJ1dCBpbXBsZW1lbnQgaXQgYW55d2F5IGluIGNhc2Ugd2UgZGVjaWRlIHRvIHVzZQorICogdGhlbSBpbiB0aGUgZnV0dXJlLgorICogTm90ZSB0aGF0IGZyYW1lIGNhbiBiZSBOVUxMLiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgcGljaworICogYSBkZWZhdWx0IHdpbmRvdyB0byB0cmFuc2xhdGUgY29vcmRpbmF0ZXMgZm9yIChpZGVhbGx5LCB0aGUKKyAqIGxhc3Qgd2luZG93IHRoZSB1c2VyIGhhcyBvcGVyYXRlZCBvbi4pIFRoaXMgd2lsbCBiZSB0aGUgY2FzZSB3aGVuCisgKiB0aGUgdXNlciBjbGlja3Mgb24gYSBDdXN0b20gQnV0dG9uIHByb2dyYW1tZWQgdG8gdGFrZSB0aGUgY3VycmVudAorICogbGluZSBudW1iZXIgYXMgYW4gYXJndW1lbnQuIEhlcmUgaXQncyBhbWJpZ3VvdXMgd2hpY2ggYnVmZmVyCisgKiB0byB1c2UsIHNvIHlvdSBuZWVkIHRvIHBpY2sgb25lLgorICogKEludGVyZmFjZSBjb25zaWRlcmF0aW9uOiBQZXJoYXBzIHdlIGluc3RlYWQgc2hvdWxkIGFkZCBzbWFydHMKKyAqIGludG8gdGhlIGxpYnJhcnkgc3VjaCB0aGF0IHdlIHJlbWVtYmVyIHdoaWNoIGZyYW1lIHBvaW50ZXIKKyAqIHdlIGxhc3Qgbm90aWNlZCAoZS5nLiBsYXN0IGNhbGwgdG8gZ2V0X3Bvc2l0aW9ucywgb3IgcGVyaGFwcworICogbGFzdCBhZGRfZnJhbWUpIGFuZCB0aGVuIHBhc3MgdGhhdCBpbnN0ZWFkPyBGb3IgZXhhbXBsZSwgd2UgY291bGQKKyAqIGhhdmUgYWxsIHdvcmtzaG9wIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBjbGllbnREYXRhIHdoZW4gcGFzc2VkCisgKiB0aGUgZmlsZW5hbWUgKG9yIGFkZCBhIGZpbGVuYW1lLXRvLWNsaWVudERhdGEgY29udmVydGVyPykgYW5kIHRoZW4KKyAqIHJlbWVtYmVyIHRoZSBsYXN0IGZpbGVuYW1lL2NsaWVudERhdGEgdXNlZC4KKyAqLworaW50IHdvcmtzaG9wX2dldF9wb3NpdGlvbnModm9pZCAqZnJhbWUsCisJCQkgICBjaGFyICoqZmlsZW5hbWUsCisJCQkgICBpbnQgKmN1ckxpbmUsCisJCQkgICBpbnQgKmN1ckNvbCwKKwkJCSAgIGludCAqc2VsU3RhcnRMaW5lLAorCQkJICAgaW50ICpzZWxTdGFydENvbCwKKwkJCSAgIGludCAqc2VsRW5kTGluZSwKKwkJCSAgIGludCAqc2VsRW5kQ29sLAorCQkJICAgaW50ICpzZWxMZW5ndGgsCisJCQkgICBjaGFyICoqc2VsZWN0aW9uKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBoZWlnaHQgb2YgYSBjaGFyYWN0ZXIKKyAqIGluIHRoZSB0ZXh0IGRpc3BsYXkuIFRoaXMgaXMgdXNlZCB0byBwaWNrIG91dCBhIHN1aXRhYmxlIHNpemUKKyAqIGZvciB0aGUgc2lnbnMgdG8gbWF0Y2ggdGhlIHRleHQgKGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhyZWUKKyAqIHNpemVzKS4gSWYgeW91IGp1c3QgcmV0dXJuIDAsIFdvcmtTaG9wIHdpbGwgdXNlIHRoZSBkZWZhdWx0CisgKiBzaWduIHNpemUuIChVc2UgWG1TdHJpbmdFeHRlbnQgb24gY2hhcmFjdGVyICJBIiB0byBnZXQgdGhlIGhlaWdodC4pCisgKi8KKworaW50IHdvcmtzaG9wX2dldF9mb250X2hlaWdodCh2b2lkKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXF1ZXN0cyB0aGF0IHlvdSByZWdpc3RlciB0aGUgZ2l2ZW4KKyAqIGhvdGtleSBhcyBhIGtleWJvYXJkIGFjY2VsZXJhdG9yIGZvciBhbGwgZnJhbWVzLiBXaGVuZXZlciB0aGUKKyAqIGhvdGtleSBpcyBwcmVzc2VkLCB5b3Ugc2hvdWxkIGludm9rZSAgd29ya3Nob3BfaG90a2V5X3ByZXNzZWQKKyAqIGFuZCBwYXNzIHRoZSBjdXJyZW50IGZyYW1lIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQgYXMgd2VsbCBhcworICogdGhlIGNsaWVudERhdGEgcG9pbnRlciBwYXNzZWQgaW4gdG8gdGhpcyBmdW5jdGlvbi4KKyAqIFRoZSByZW1vdmUgZnVuY3Rpb24gdW5yZWdpc3RlcnMgdGhlIGhvdGtleS4KKyAqLwordm9pZCB3b3Jrc2hvcF9yZWdpc3Rlcl9ob3RrZXkoTW9kaWZpZXJzIG1vZGlmaWVycywgS2V5U3ltIGtleXN5bSwKKwkJCSAgICAgIHZvaWQgKmNsaWVudERhdGEpOwordm9pZCB3b3Jrc2hvcF91bnJlZ2lzdGVyX2hvdGtleShNb2RpZmllcnMgbW9kaWZpZXJzLCBLZXlTeW0ga2V5c3ltLAorCQkJCXZvaWQgKmNsaWVudERhdGEpOworCisKKworCisvKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG5vdGlmeSBlc2VydmUgb2YgaW1wb3J0YW50IGVkaXRvciBldmVudHMsCisgKiBzdWNoIGFzIGZpbGVzIGJlaW5nIG1vZGlmaWVkLCBmaWxlcyBiZWluZyBzYXZlZCwgZXRjLiBZb3UgbXVzdAorICogc3ByaW5rbGUgeW91ciBlZGl0b3IgY29kZSB3aXRoIGNhbGxzIHRvIHRoZXNlLiBGb3IgZXhhbXBsZSwgd2hlbmV2ZXIKKyAqIGEgZmlsZSBpcyBtb2RpZmllZCAod2VsbCwgd2hlbiBpdHMgcmVhZC1vbmx5IHN0YXR1cyBjaGFuZ2VzIHRvIG1vZGlmaWVkKSwKKyAqIGNhbGwgd29ya3Nob3BfZmlsZV9tb2RpZmllZCgpLgorICoKKyAqLworCisKKworLyogQ29ubmVjdCB3aXRoIGVzZXJ2ZS4gQWRkIHRoaXMgY2FsbCBhZnRlciB5b3UgZWRpdG9yIGluaXRpYWxpemF0aW9uCisgKiBpcyBkb25lLCByaWdodCBiZWZvcmUgZW50ZXJpbmcgdGhlIGV2ZW50IGxvb3Agb3IgYmxvY2tpbmcgb24gaW5wdXQuCisgKiBUaGlzIHdpbGwgc2V0IHVwIGEgc29ja2V0IGNvbm5lY3Rpb24gd2l0aCBlc2VydmUuCisgKi8KK3ZvaWQgd29ya3Nob3BfY29ubmVjdChYdEFwcENvbnRleHQgY29udGV4dCk7CisKKy8qIEEgZmlsZSBoYXMgYmVlbiBvcGVuZWQuICovCit2b2lkIHdvcmtzaG9wX2ZpbGVfb3BlbmVkKGNoYXIgKmZpbGVuYW1lLCBpbnQgcmVhZE9ubHkpOworCisKKy8qIEEgZmlsZSBoYXMgYmVlbiBzYXZlZC4gRGVzcGl0ZSBpdHMgbmFtZSwgZXNlcnZlIGFsc28gdXNlcyB0aGlzCisgKiBtZXNzYWdlIHRvIG1lYW4gYSBmaWxlIGhhcyBiZWVuIHJldmVydGVkIG9yIHVubW9kaWZpZWQuCisgKi8KK3ZvaWQgd29ya3Nob3BfZmlsZV9zYXZlZChjaGFyICpmaWxlbmFtZSk7CisKKworLyogQSBmaWxlIGhhcyBiZWVuIGNsb3NlZCAqLwordm9pZCB3b3Jrc2hvcF9maWxlX2Nsb3NlZChjaGFyICpmaWxlbmFtZSk7CisKKy8qIExpa2Ugd29ya3Nob3BfZmlsZV9jbG9zZWQsIGJ1dCBhbHNvIGluZm9ybSBlc2VydmUgd2hhdCBsaW5lIHRoZQorICAgY3Vyc29yIHdhcyBvbiB3aGVuIHlvdSBsZWZ0IHRoZSBmaWxlLiBUaGF0IHdheSBlc2VydmUgY2FuIHB1dCB5b3UKKyAgIGJhY2sgd2hlcmUgeW91IGxlZnQgb2ZmIHdoZW4geW91IHJldHVybiB0byB0aGlzIGZpbGUuICovCit2b2lkIHdvcmtzaG9wX2ZpbGVfY2xvc2VkX2xpbmVubyhjaGFyICpmaWxlbmFtZSwgaW50IGxpbmUpOworCisvKiBBIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgKi8KK3ZvaWQgd29ya3Nob3BfZmlsZV9tb2RpZmllZChjaGFyICpmaWxlbmFtZSk7CisKKworLyoKKyAqIEEgbWFyayBoYXMgYmVlbiBtb3ZlZC4gT25seSBjYWxsIHRoaXMgYXMgYSByZXNwb25zZSB0bworICogYSB3b3Jrc2hvcF9tb3ZlZF9tYXJrcyByZXF1ZXN0IGNhbGwuCisgKi8KK3ZvaWQgd29ya3Nob3BfbW92ZV9tYXJrKGNoYXIgKmZpbGVuYW1lLCBpbnQgbWFya0lkLCBpbnQgbmV3TGluZW5vKTsKKworLyogVGVsbCB0aGUgaW50ZWdyYXRpb24gbGlicmFyeSBhYm91dCBhIG5ldyBmcmFtZSBiZWluZyBhZGRlZC4KKyAqIFN1cHBseSBhIGZvcm0gZm9yIHRoZSB0b29sYmFyLCBhIGxhYmVsIGZvciB0aGUgZm9vdGVyLCBhbmQgYW4KKyAqIFhtUHVsbGRvd24gbWVudSBmb3IgdGhlIFdvcmtTaG9wIG1lbnUgdG8gYXR0YWNoIHRvLiBUb3AgYW5kIGJvdHRvbQorICogYXJlIHRoZSB3aWRnZXRzIGFib3ZlIGFuZCBiZWxvdyB0aGUgdG9vbGJhciBmb3JtIHdpZGdldCwgaWYKKyAqIGFueS4gQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4geW91IGNyZWF0ZSBhIG5ldyB3aW5kb3cuIEl0IHJldHVybnMgYQorICogdm9pZCAqLCBhIGhhbmRsZSB3aGljaCB5b3Ugc2hvdWxkIGtlZXAgYW5kIHJldHVybiB3aGVuIHlvdSBkZWxldGUKKyAqIHRoZSB3aW5kb3cgd2l0aCB3b3Jrc2hvcF9kZWxldGVfdG9vbGJhci4gIFRoZSAiZm9vdGVyIiBhcmd1bWVudAorICogcG9pbnRzIHRvIGEgTGFiZWwgd2lkZ2V0IHRoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBhIHN0YXR1cworICogbWVzc2FnZSBhcmVhLCBhbmQgIm1lbnUiIChpZiBhbnkpIHBvaW50cyB0byBhbiBNZW51IHdpZGdldCB0aGF0CisgKiBzaG91bGQgY29udGFpbiBhIFdvcmtTaG9wIG1lbnUuICBDbGllbnRkYXRhIGlzIGEgcG9pbnRlciB3aGljaCBpcworICogb25seSB1c2VkIGJ5IHRoZSBlZGl0b3IuIEl0IHdpbGwgdHlwaWNhbGx5IGJlIGEgcG9pbnRlciB0byB0aGUKKyAqIHdpbmRvdyBvYmplY3QgdGhhdCB0aGUgdG9vbGJhciBpcyBwbGFjZWQgaW4uIElmIHlvdSBoYXZlIG11bHRpcGxlCisgKiB3aW5kb3dzLCB5b3UgbmVlZCB0byB1c2UgdGhpcyBwb2ludGVyIHRvIGZpZ3VyZSBvdXQgd2hpY2ggd2luZG93CisgKiAoYW5kIHRodXMgY29ycmVzcG9uZGluZyBidWZmZXIpIHRoZSB1c2VyIGhhcyBjbGlja2VkIG9uIHRvIHJlc3BvbmQKKyAqIHRvIHRoZSB3b3Jrc2hvcF9nZXRfcG9zaXRpb25zIG1lc3NhZ2UuCisgKiBFYWNoIGZyYW1lJ3MgY2xpZW50RGF0YSAoImZyYW1lIikgc2hvdWxkIGJlIHVuaXF1ZS4KKyAqLwordm9pZCAqd29ya3Nob3BfYWRkX2ZyYW1lKHZvaWQgKmZyYW1lLCBXaWRnZXQgZm9ybSwKKwkJCSAgIFdpZGdldCB0b3AsIFdpZGdldCBib3R0b20sIFdpZGdldCBmb290ZXIsCisJCQkgICBXaWRnZXQgbWVudSk7CisKKy8qIERlbGV0ZSBhIHdpbmRvdy9mcmFtZS4gQ2FsbCB0aGlzIHdoZW4gYW4gZWRpdG9yIHdpbmRvdyBpcyBiZWluZyBkZWxldGVkLiAqLwordm9pZCB3b3Jrc2hvcF9kZWxldGVfZnJhbWUodm9pZCAqaGFuZGxlKTsKKworLyogQWRkIGEgYmFsbG9vbiBldmFsdWF0ZSB0ZXh0IGFyZWEuICJmcmFtZSIgaXMgdXNlZCB0aGUgc2FtZSB3YXkKKyAqIGFzIGluIHdvcmtzaG9wX2FkZF9mcmFtZS4gVGhpcyBjYWxsIGlzIG5vdCBwYXJ0IG9mIHdvcmtzaG9wX2FkZF9mcmFtZSBiZWNhdXNlCisgKiBhIGZyYW1lIGNhbiBoYXZlIG11bHRpcGxlIHRvb2x0aXAgYXJlYXMgKHR5cGljYWxseSwgYW4gZWRpdG9yIGZyYW1lIHRoYXQKKyAqIGlzIHNwbGl0IHNob3dpbmcgbXVsdGlwbGUgYnVmZmVycyB3aWxsIGhhdmUgYSBzZXBhcmF0ZSB0b29sdGlwIGFyZWEgZm9yCisgKiBlYWNoIHRleHQgd2lkZ2V0LiBFYWNoIHN1Y2ggYXJlYSBpcyBjYWxsZWQgYSAid2luZG93IiAoY29uc2lzdGVudCB3aXRoCisgKiBYRW1hY3MgdGVybWlub2xvZ3kpLiBTZXBhcmF0ZSB0aGVzZSBieSB0aGUgd2luZG93IGFyZ3VtZW50IGlmIG5lY2Vzc2FyeS4KKyAqIFlvdSB3aWxsIG5lZWQgdG8gaW1wbGVtZW50IHdvcmtzaG9wX2dldF9iYWxsb29uX3RleHQgc3VjaCB0aGF0IGl0IHVzZXMKKyAqIHRoZXNlIHR3byBhcmd1bWVudHMgdG8gZGVyaXZlIHRoZSBmaWxlLCBsaW5lIGV0Yy4gZm9yIHRoZSB0aXAuCisgKiBDYWxsIHRoZSByZW1vdmUgZnVuY3Rpb24gaWYgeW91IGRlbGV0ZSB0aGlzIGFyZWEgc3VjaCB0aGF0IHRoZSBpbnRlZ3JhdGlvbgorICogbGlicmFyeSBjYW4gdXBkYXRlIGl0c2VsZi4gWW91IG11c3QgY2FsbCB3b3Jrc2hvcF9hZGRfZnJhbWUgYmVmb3JlIHlvdQorICogY2FsbCBhZGRfYmFsbG9vbl9ldmFsX2FyZWEsIGFuZCB5b3UgbXVzdCBwYXNzIHRoZSBzYW1lIGZyYW1lIHBvaW50ZXIuCisgKi8KK3ZvaWQgd29ya3Nob3BfYWRkX2JhbGxvb25fZXZhbF9hcmVhKHZvaWQgKmZyYW1lLCB2b2lkICp3aW5kb3csIFdpZGdldCB3aWRnZXQpOwordm9pZCB3b3Jrc2hvcF9yZW1vdmVfYmFsbG9vbl9ldmFsX2FyZWEodm9pZCAqZnJhbWUsIHZvaWQgKndpbmRvdywgV2lkZ2V0IHdpZGdldCk7CisKKworLyogRm9yIGEgZ2l2ZW4gbW91c2UgcG9zaXRpb24gaW5zaWRlIHRoZSBiYWxsb29uIGFyZWEgKHBhc3NlZCBhcyB4LHkpLAorICogcmV0dXJuIHRoZSBiYWxsb29uIHRleHQgdG8gYmUgZXZhbHVhdGVkLiBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvczoKKyAqIElmIHRoZSBwb3NpdGlvbiBpcyBpbnNpZGUgdGhlIHNlbGVjdGlvbiwgcmV0dXJuIHRoZSBzZWxlY3Rpb24KKyAqIHN0cmluZy4gIEVsc2UsIHJldHVybiB0aGUgZnVsbCBsaW5lIChvciBwb3NzaWJseSB0aGUgZnVsbCBsaW5lIHVwCisgKiB0byB0aGUgbGFzdCBzZW1pY29sb24gKHRoYXQncyBUQkQpLCBhbG9uZyB3aXRoIGFuIGluZGV4IHBvaW50aW5nIHRvCisgKiB3aGVyZSB3aGljaCBjaGFyYWN0ZXIgdGhlIG1vdXNlIGlzIG92ZXIuCisgKiBJZiB3ZSBoYXZlIHRoZSBzZWxlY3Rpb24tc2NlbmFyaW8sIHNldCBtb3VzZUluZGV4IHRvIC0xIHRvIGluZGljYXRlCisgKiB0aGF0IG5vIGF1dG9leHBhbnNpb24gc2hvdWxkIG9jY3VyIGJ1dCB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkCisgKiBiZSBldmFsdWF0ZWQgYXMgaXMuCisgKgorICogWFhYIERvZXMgZGJ4IG5lZWQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlLCBsaWtlIHRoZSBmaWxlbmFtZSBhbmQgbGluZQorICogbnVtYmVyIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBsYW5ndWFnZSBhbmQgc2NvcGUgdG8gYmUKKyAqIHVzZWQgZHVyaW5nIGV2YWx1YXRpb24/PyBPciBzaG91bGQgaXQganVzdCB3b3JrIGxpa2UgdGhlIHA9IGJ1dHRvbgorICogKHdoZXJlIHRoZSBjdXJyZW50IHNjb3BlIGFuZCBsYW5ndWFnZSBpcyB1c2VkLCBldmVuIGlmIHlvdSBhcmUKKyAqIHBvaW50aW5nIGF0IGEgZGlmZmVyZW50IGZpbGUgd2l0aCBhIGRpZmZlcmVudCBzY29wZSkgPworICovCitpbnQgd29ya3Nob3BfZ2V0X2JhbGxvb25fdGV4dChQb3NpdGlvbiB4LCBQb3NpdGlvbiB5LAorCQkJICAgICAgdm9pZCAqZnJhbWUsCisJCQkgICAgICB2b2lkICp3aW5kb3csCisJCQkgICAgICBjaGFyICoqZmlsZW5hbWUsCisJCQkgICAgICBpbnQgKmxpbmUsCisJCQkgICAgICBjaGFyICoqdGV4dCwKKwkJCSAgICAgIGludCAqbW91c2VJbmRleCk7CisKKworLyogV2luZG93IHNpemUgYW5kIGxvY2F0aW9uCisgKiBXb3JrU2hvcCB3aWxsIGF0dGVtcHQgdG8gcmVzdG9yZSB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgYSBzaW5nbGUKKyAqIGVkaXRvciBmcmFtZS4gRm9yIHZpLCB0aGlzIHdpbmRvdyBpcyBkZXNpZ25hdGVkIGFzIHRoZSAicmV1c2FibGUiIG9uZS4KKyAqIFlvdSBjYW4gaW1wbGVtZW50IHlvdXIgb3duIHNjaGVtZSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggd2luZG93IHlvdQorICogd2FudCB0byBhc3NvY2lhdGUgd2l0aCBXb3JrU2hvcC4gV2hlbmV2ZXIgdGhlIHNpemUgYW5kIGxvY2F0aW9uIG9mCisgKiB0aGlzIHdpbmRvdyBpcyBjaGFuZ2VkLCBjYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbm90aWZ5IGVzZXJ2ZS4KKyAqIExpa2Ugd29ya3Nob3BfaW52b2tlZCwgdGhpcyBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgd29ya3Nob3BfY29ubmVjdCgpCisgKiBjYWxsLgorICovCit2b2lkIHdvcmtzaG9wX2ZyYW1lX21vdmVkKGludCBuZXdfeCwgaW50IG5ld195LCBpbnQgbmV3X3csIGludCBuZXdfaCk7CitCb29sZWFuIHdvcmtzaG9wX2dldF93aWR0aF9oZWlnaHQoaW50ICosIGludCAqKTsKK0Jvb2xlYW4gd29ya3Nob3BfZ2V0X3Jvd3NfY29scyhpbnQgKiwgaW50ICopOworCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIHdoZW4geW91IHByZXNzIGEgaG90a2V5CisgKiBzZXQgdXAgYnkgd29ya3Nob3BfcmVnaXN0ZXJfaG90a2V5LiBQYXNzIHRoZSBjbGllbnREYXRhCisgKiB0byBpdCB0aGF0IHdhcyBnaXZlbiB0byB5b3Ugd2l0aCB3b3Jrc2hvcF9yZWdpc3Rlcl9ob3RrZXkuCisqLwordm9pZCB3b3Jrc2hvcF9ob3RrZXlfcHJlc3NlZCh2b2lkICpmcmFtZSwgdm9pZCAqY2xpZW50RGF0YSk7CisKKworCisKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKiBUaGVzZSBwcm92aWRlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzaW1wbGlmeSBpbXBsZW1lbnRpbmcgc29tZQorICogb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucy4KKyAqCisgKi8KKworLyogV2VyZSB3ZSBpbnZva2VkIGJ5IFdvcmtTaG9wPyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGVhcmx5IGR1cmluZyBzdGFydHVwCisgKiBpZiB5b3Ugd2FudCB0byBkbyB0aGluZ3MgZGlmZmVyZW50bHkgaWYgdGhlIGVkaXRvciBpcyBzdGFydGVkIHN0YW5kYWxvbmUKKyAqIG9yIGluIFdvcmtTaG9wIG1vZGUuIEZvciBleGFtcGxlLCBpbiBzdGFuZGFsb25lIG1vZGUgeW91IG1heSBub3Qgd2FudCB0bworICogYWRkIGEgZm9vdGVyL21lc3NhZ2UgYXJlYSBvciBhIHNpZ24gZ3V0dGVyLgorICovCitpbnQgd29ya3Nob3BfaW52b2tlZCh2b2lkKTsKKworLyoKKyAqU2V0IHRoZSBkZXNrdG9wIGljb24gb2YgdGhlIGN1cnJlbnQgc2hlbGwgdG8gdGhlIGdpdmVuIHhwbSBpY29uLgorICogU3RhbmRhcmQgV29ya1Nob3AgZGVza3RvcCBpY29ucyBzaG91bGQgYmUgNDh4NDguCisgKi8KKwordm9pZCB3b3Jrc2hvcF9zZXRfaWNvbihEaXNwbGF5ICpkaXNwbGF5LCBXaWRnZXQgc2hlbGwsIGNoYXIgKip4cG1kYXRhLAorCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworCisvKiBNaW5pbWl6ZSAoaWNvbmlmeSkgdGhlIGdpdmVuIHNoZWxsICovCit2b2lkIHdvcmtzaG9wX21pbmltaXplX3NoZWxsKFdpZGdldCBzaGVsbCk7CisKKy8qIE1heGltaXplIChkZWljb25pZnkpIHRoZSBnaXZlbiBzaGVsbCAqLwordm9pZCB3b3Jrc2hvcF9tYXhpbWl6ZV9zaGVsbChXaWRnZXQgc2hlbGwpOworCisvKiBDYWxsZWQgYnkgZnJhbWUuY2MgLS0gZWRpdG9yIHNob3VsZG4ndCBjYWxsIHRoaXMgZGlyZWN0bHkuCisgKiBQZXJoYXBzIHdlIG5lZWQgYW4gaW50ZWdyYXRpb25QLmggZmlsZSA/ICovCit2b2lkIHdvcmtzaG9wX3BlcmZvcm1fdmVyYihjaGFyICp2ZXJiLCB2b2lkICpjbGllbnREYXRhKTsKK3ZvaWQgd29ya3Nob3Bfc2VuZF9tZXNzYWdlKGNoYXIgKmJ1Zik7CisKKworI2lmZGVmIE5PSEFORFNfU1VQUE9SVF9GVU5DVElPTlMKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gcnVuIHRoZSBXb3JrU2hvcCB0ZXN0c3VpdGUKKyAqIHdpdGggdGhpcyBlZGl0b3IuIFlvdSBkb24ndCBuZWVkIHRvIGltcGxlbWVudCB0aGVzZSB1bmxlc3MgeW91CisgKiBpbnRlbmQgZm9yIHlvdXIgZWRpdG9yIHRvIGJlIHJ1biBieSBXb3Jrc2hvcCdzIHRlc3RzdWl0ZS4KKyAqIGdldGN1cnNvcnJvdyBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgdG9wIG9mCisgKiB0aGUgd2luZG93IHRoZSBjdXJzb3IgaXM7IHNpbWlsYXJseSBmb3IgZ2V0Y3Vyc29yY29sLgorICovCitjaGFyICp3b3Jrc2hvcF90ZXN0X2dldGN1cnJlbnRmaWxlKCk7CitpbnQgd29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jyb3coKTsKK2ludCB3b3Jrc2hvcF90ZXN0X2dldGN1cnNvcmNvbCgpOworY2hhciAqd29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jyb3d0ZXh0KCk7CitjaGFyICp3b3Jrc2hvcF90ZXN0X2dldHNlbGVjdGVkdGV4dCgpOworI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3QgdXNlZCB0byBzZXQvdW5zZXQgdGhlIHNlbnNpdGl2aXR5IG9mIHZlcmJzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhcgkJKnZlcmI7CisJQm9vbGVhbgkJc2Vuc2U7Cit9IFZlcmJTZW5zZTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfSU5URUdSQVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tleW1hcC5oIGIvc3JjL2tleW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjBkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2V5bWFwLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBGb3IgTVNET1Mgc29tZSBrZXlzIHByb2R1Y2UgY29kZXMgbGFyZ2VyIHRoYW4gMHhmZi4gVGhleSBhcmUgc3BsaXQgaW50byB0d28KKyAqIGNoYXJzLCB0aGUgZmlyc3Qgb25lIGlzIEtfTlVMIChzYW1lIHZhbHVlIHVzZWQgaW4gdGVybS5oKS4KKyAqLworI2RlZmluZSBLX05VTAkJCSgweGNlKQkvKiBmb3IgTVNET1M6IHNwZWNpYWwga2V5IGZvbGxvd3MgKi8KKworLyoKKyAqIEtleWNvZGUgZGVmaW5pdGlvbnMgZm9yIHNwZWNpYWwga2V5cy4KKyAqCisgKiBBbnkgc3BlY2lhbCBrZXkgY29kZSBzZXF1ZW5jZXMgYXJlIHJlcGxhY2VkIGJ5IHRoZXNlIGNvZGVzLgorICovCisKKy8qCisgKiBLX1NQRUNJQUwgaXMgdGhlIGZpcnN0IGJ5dGUgb2YgYSBzcGVjaWFsIGtleSBjb2RlIGFuZCBpcyBhbHdheXMgZm9sbG93ZWQgYnkKKyAqIHR3byBieXRlcy4KKyAqIFRoZSBzZWNvbmQgYnl0ZSBjYW4gaGF2ZSBhbnkgdmFsdWUuIEFTQ0lJIGlzIHVzZWQgZm9yIG5vcm1hbCB0ZXJtY2FwCisgKiBlbnRyaWVzLCAweDgwIGFuZCBoaWdoZXIgZm9yIHNwZWNpYWwga2V5cywgc2VlIGJlbG93LgorICogVGhlIHRoaXJkIGJ5dGUgaXMgZ3VhcmFudGVlZCB0byBiZSBiZXR3ZWVuIDB4MDIgYW5kIDB4N2YuCisgKi8KKworI2RlZmluZSBLX1NQRUNJQUwJCSgweDgwKQorCisvKgorICogUG9zaXRpdmUgY2hhcmFjdGVycyBhcmUgIm5vcm1hbCIgY2hhcmFjdGVycy4KKyAqIE5lZ2F0aXZlIGNoYXJhY3RlcnMgYXJlIHNwZWNpYWwga2V5IGNvZGVzLiAgT25seSBjaGFyYWN0ZXJzIGJlbG93IC0weDIwMAorICogYXJlIHVzZWQgdG8gc28gdGhhdCB0aGUgYWJzb2x1dGUgdmFsdWUgY2FuJ3QgYmUgbWlzdGFrZW4gZm9yIGEgc2luZ2xlLWJ5dGUKKyAqIGNoYXJhY3Rlci4KKyAqLworI2RlZmluZSBJU19TUEVDSUFMKGMpCQkoKGMpIDwgMCkKKworLyoKKyAqIENoYXJhY3RlcnMgMHgwMTAwIC0gMHgwMWZmIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIGFiYnJldmlhdGlvbnMuCisgKiBNdWx0aS1ieXRlIGNoYXJhY3RlcnMgYWxzbyBoYXZlIEFCQlJfT0ZGIGFkZGVkLCB0aHVzIGFyZSBhYm92ZSAweDAyMDAuCisgKi8KKyNkZWZpbmUgQUJCUl9PRkYJCTB4MTAwCisKKy8qCisgKiBOVUwgY2Fubm90IGJlIGluIHRoZSBpbnB1dCBzdHJpbmcsIHRoZXJlZm9yZSBpdCBpcyByZXBsYWNlZCBieQorICoJS19TUEVDSUFMICAgS1NfWkVSTwlLRV9GSUxMRVIKKyAqLworI2RlZmluZSBLU19aRVJPCQkJMjU1CisKKy8qCisgKiBLX1NQRUNJQUwgY2Fubm90IGJlIGluIHRoZSBpbnB1dCBzdHJpbmcsIHRoZXJlZm9yZSBpdCBpcyByZXBsYWNlZCBieQorICoJS19TUEVDSUFMICAgS1NfU1BFQ0lBTAlLRV9GSUxMRVIKKyAqLworI2RlZmluZSBLU19TUEVDSUFMCQkyNTQKKworLyoKKyAqIEtTX0VYVFJBIGlzIHVzZWQgZm9yIGtleXMgdGhhdCBoYXZlIG5vIHRlcm1jYXAgbmFtZQorICoJS19TUEVDSUFMICAgS1NfRVhUUkEJS0VfeHh4CisgKi8KKyNkZWZpbmUgS1NfRVhUUkEJCTI1MworCisvKgorICogS1NfTU9ESUZJRVIgaXMgdXNlZCB3aGVuIGEgbW9kaWZpZXIgaXMgZ2l2ZW4gZm9yIGEgKHNwZWNpYWwpIGtleQorICoJS19TUEVDSUFMICAgS1NfTU9ESUZJRVIJYml0bWFzaworICovCisjZGVmaW5lIEtTX01PRElGSUVSCQkyNTIKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIGZvciB0aGUgR1VJCisgKglLX1NQRUNJQUwgICBLU194eHgJS0VfRklMTEVSCisgKi8KKyNkZWZpbmUgS1NfTU9VU0UJCTI1MQorI2RlZmluZSBLU19NRU5VCQkJMjUwCisjZGVmaW5lIEtTX1ZFUl9TQ1JPTExCQVIJMjQ5CisjZGVmaW5lIEtTX0hPUl9TQ1JPTExCQVIJMjQ4CisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCBmb3IgREVDIG1vdXNlCisgKi8KKyNkZWZpbmUgS1NfTkVUVEVSTV9NT1VTRQkyNDcKKyNkZWZpbmUgS1NfREVDX01PVVNFCQkyNDYKKworLyoKKyAqIFVzZWQgZm9yIHN3aXRjaGluZyBTZWxlY3QgbW9kZSBiYWNrIG9uIGFmdGVyIGEgbWFwcGluZyBvciBtZW51LgorICovCisjZGVmaW5lIEtTX1NFTEVDVAkJMjQ1CisjZGVmaW5lIEtfU0VMRUNUX1NUUklORwkJKGNoYXJfdSAqKSJcMjAwXDM2NVgiCisKKy8qCisgKiBVc2VkIGZvciB0ZWFyaW5nIG9mZiBhIG1lbnUuCisgKi8KKyNkZWZpbmUgS1NfVEVBUk9GRgkJMjQ0CisKKy8qIHVzZWQgZm9yIEpTQiB0ZXJtIG1vdXNlICovCisjZGVmaW5lIEtTX0pTQlRFUk1fTU9VU0UJMjQzCisKKy8qIHVzZWQgYSB0ZXJtY2FwIGVudHJ5IHRoYXQgcHJvZHVjZXMgYSBub3JtYWwgY2hhcmFjdGVyICovCisjZGVmaW5lIEtTX0tFWQkJCTI0MgorCisvKiBVc2VkIGZvciB0aGUgcW54IHB0ZXJtIG1vdXNlICovCisjZGVmaW5lIEtTX1BURVJNX01PVVNFCQkyNDEKKworLyoKKyAqIEZpbGxlciB1c2VkIGFmdGVyIEtTX1NQRUNJQUwgYW5kIG90aGVycworICovCisjZGVmaW5lIEtFX0ZJTExFUgkJKCdYJykKKworLyoKKyAqIHRyYW5zbGF0aW9uIG9mIHRocmVlIGJ5dGUgY29kZSAiS19TUEVDSUFMIGEgYiIgaW50byBpbnQgIktfeHh4IiBhbmQgYmFjaworICovCisjZGVmaW5lIFRFUk1DQVAyS0VZKGEsIGIpCSgtKChhKSArICgoaW50KShiKSA8PCA4KSkpCisjZGVmaW5lIEtFWTJURVJNQ0FQMCh4KQkJKCgtKHgpKSAmIDB4ZmYpCisjZGVmaW5lIEtFWTJURVJNQ0FQMSh4KQkJKCgodW5zaWduZWQpKC0oeCkpID4+IDgpICYgMHhmZikKKworLyoKKyAqIGdldCBzZWNvbmQgb3IgdGhpcmQgYnl0ZSB3aGVuIHRyYW5zbGF0aW5nIHNwZWNpYWwga2V5IGNvZGUgaW50byB0aHJlZSBieXRlcworICovCisjZGVmaW5lIEtfU0VDT05EKGMpCSgoYykgPT0gS19TUEVDSUFMID8gS1NfU1BFQ0lBTCA6IChjKSA9PSBOVUwgPyBLU19aRVJPIDogS0VZMlRFUk1DQVAwKGMpKQorCisjZGVmaW5lIEtfVEhJUkQoYykJKCgoYykgPT0gS19TUEVDSUFMIHx8IChjKSA9PSBOVUwpID8gS0VfRklMTEVSIDogS0VZMlRFUk1DQVAxKGMpKQorCisvKgorICogZ2V0IHNpbmdsZSBpbnQgY29kZSBmcm9tIHNlY29uZCBieXRlIGFmdGVyIEtfU1BFQ0lBTAorICovCisjZGVmaW5lIFRPX1NQRUNJQUwoYSwgYikgICAgKChhKSA9PSBLU19TUEVDSUFMID8gS19TUEVDSUFMIDogKGEpID09IEtTX1pFUk8gPyBLX1pFUk8gOiBURVJNQ0FQMktFWShhLCBiKSkKKworLyoKKyAqIENvZGVzIGZvciBrZXlzIHRoYXQgZG8gbm90IGhhdmUgYSB0ZXJtY2FwIG5hbWUuCisgKgorICogS19TUEVDSUFMIEtTX0VYVFJBIEtFX3h4eAorICovCitlbnVtIGtleV9leHRyYQoreworICAgIEtFX05BTUUgPSAzCQkvKiBuYW1lIG9mIHRoaXMgdGVybWluYWwgZW50cnkgKi8KKworICAgICwgS0VfU19VUAkJLyogc2hpZnQtdXAgKi8KKyAgICAsIEtFX1NfRE9XTgkJLyogc2hpZnQtZG93biAqLworCisgICAgLCBLRV9TX0YxCQkvKiBzaGlmdGVkIGZ1bmN0aW9uIGtleXMgKi8KKyAgICAsIEtFX1NfRjIKKyAgICAsIEtFX1NfRjMKKyAgICAsIEtFX1NfRjQKKyAgICAsIEtFX1NfRjUKKyAgICAsIEtFX1NfRjYKKyAgICAsIEtFX1NfRjcKKyAgICAsIEtFX1NfRjgKKyAgICAsIEtFX1NfRjkKKyAgICAsIEtFX1NfRjEwCisKKyAgICAsIEtFX1NfRjExCisgICAgLCBLRV9TX0YxMgorICAgICwgS0VfU19GMTMKKyAgICAsIEtFX1NfRjE0CisgICAgLCBLRV9TX0YxNQorICAgICwgS0VfU19GMTYKKyAgICAsIEtFX1NfRjE3CisgICAgLCBLRV9TX0YxOAorICAgICwgS0VfU19GMTkKKyAgICAsIEtFX1NfRjIwCisKKyAgICAsIEtFX1NfRjIxCisgICAgLCBLRV9TX0YyMgorICAgICwgS0VfU19GMjMKKyAgICAsIEtFX1NfRjI0CisgICAgLCBLRV9TX0YyNQorICAgICwgS0VfU19GMjYKKyAgICAsIEtFX1NfRjI3CisgICAgLCBLRV9TX0YyOAorICAgICwgS0VfU19GMjkKKyAgICAsIEtFX1NfRjMwCisKKyAgICAsIEtFX1NfRjMxCisgICAgLCBLRV9TX0YzMgorICAgICwgS0VfU19GMzMKKyAgICAsIEtFX1NfRjM0CisgICAgLCBLRV9TX0YzNQorICAgICwgS0VfU19GMzYKKyAgICAsIEtFX1NfRjM3CisKKyAgICAsIEtFX01PVVNFCQkvKiBtb3VzZSBldmVudCBzdGFydCAqLworCisvKgorICogU3ltYm9scyBmb3IgcHNldWRvIGtleXMgd2hpY2ggYXJlIHRyYW5zbGF0ZWQgZnJvbSB0aGUgcmVhbCBrZXkgc3ltYm9scworICogYWJvdmUuCisgKi8KKyAgICAsIEtFX0xFRlRNT1VTRQkvKiBMZWZ0IG1vdXNlIGJ1dHRvbiBjbGljayAqLworICAgICwgS0VfTEVGVERSQUcJLyogRHJhZyB3aXRoIGxlZnQgbW91c2UgYnV0dG9uIGRvd24gKi8KKyAgICAsIEtFX0xFRlRSRUxFQVNFCS8qIExlZnQgbW91c2UgYnV0dG9uIHJlbGVhc2UgKi8KKyAgICAsIEtFX01JRERMRU1PVVNFCS8qIE1pZGRsZSBtb3VzZSBidXR0b24gY2xpY2sgKi8KKyAgICAsIEtFX01JRERMRURSQUcJLyogRHJhZyB3aXRoIG1pZGRsZSBtb3VzZSBidXR0b24gZG93biAqLworICAgICwgS0VfTUlERExFUkVMRUFTRQkvKiBNaWRkbGUgbW91c2UgYnV0dG9uIHJlbGVhc2UgKi8KKyAgICAsIEtFX1JJR0hUTU9VU0UJLyogUmlnaHQgbW91c2UgYnV0dG9uIGNsaWNrICovCisgICAgLCBLRV9SSUdIVERSQUcJLyogRHJhZyB3aXRoIHJpZ2h0IG1vdXNlIGJ1dHRvbiBkb3duICovCisgICAgLCBLRV9SSUdIVFJFTEVBU0UJLyogUmlnaHQgbW91c2UgYnV0dG9uIHJlbGVhc2UgKi8KKworICAgICwgS0VfSUdOT1JFCQkvKiBJZ25vcmVkIG1vdXNlIGRyYWcvcmVsZWFzZSAqLworCisgICAgLCBLRV9UQUIJCS8qIHVuc2hpZnRlZCBUQUIga2V5ICovCisgICAgLCBLRV9TX1RBQl9PTEQJLyogc2hpZnRlZCBUQUIga2V5IChubyBsb25nZXIgdXNlZCkgKi8KKworICAgICwgS0VfU05JRkYJCS8qIFNOaUZGKyBpbnB1dCB3YWl0aW5nICovCisKKyAgICAsIEtFX1hGMQkJLyogZXh0cmEgdnQxMDAgZnVuY3Rpb24ga2V5cyBmb3IgeHRlcm0gKi8KKyAgICAsIEtFX1hGMgorICAgICwgS0VfWEYzCisgICAgLCBLRV9YRjQKKyAgICAsIEtFX1hFTkQJCS8qIGV4dHJhICh2dDEwMCkgZW5kIGtleSBmb3IgeHRlcm0gKi8KKyAgICAsIEtFX1hIT01FCQkvKiBleHRyYSAodnQxMDApIGhvbWUga2V5IGZvciB4dGVybSAqLworCisgICAgLCBLRV9MRUZUTU9VU0VfTk0JLyogbm9uLW1hcHBhYmxlIExlZnQgbW91c2UgYnV0dG9uIGNsaWNrICovCisgICAgLCBLRV9MRUZUUkVMRUFTRV9OTQkvKiBub24tbWFwcGFibGUgbGVmdCBtb3VzZSBidXR0b24gcmVsZWFzZSAqLworCisgICAgLCBLRV9TX1hGMQkJLyogZXh0cmEgdnQxMDAgc2hpZnRlZCBmdW5jdGlvbiBrZXlzIGZvciB4dGVybSAqLworICAgICwgS0VfU19YRjIKKyAgICAsIEtFX1NfWEYzCisgICAgLCBLRV9TX1hGNAorCisgICAgLCBLRV9NT1VTRURPV04JLyogc2Nyb2xsIHdoZWVsIHBzZXVkby1idXR0b24gRG93biAqLworICAgICwgS0VfTU9VU0VVUAkJLyogc2Nyb2xsIHdoZWVsIHBzZXVkby1idXR0b24gVXAgKi8KKworICAgICwgS0VfS0lOUwkJLyoga2V5cGFkIEluc2VydCBrZXkgKi8KKyAgICAsIEtFX0tERUwJCS8qIGtleXBhZCBEZWxldGUga2V5ICovCisKKyAgICAsIEtFX0NTSQkJLyogQ1NJIHR5cGVkIGRpcmVjdGx5ICovCisgICAgLCBLRV9TTlIJCS8qIDxTTlI+ICovCisgICAgLCBLRV9QTFVHCQkvKiA8UGx1Zz4gKi8KKyAgICAsIEtFX0NNRFdJTgkJLyogb3BlbiBjb21tYW5kLWxpbmUgd2luZG93IGZyb20gQ29tbWFuZC1saW5lIE1vZGUgKi8KKworICAgICwgS0VfQ19MRUZUCQkvKiBjb250cm9sLWxlZnQgKi8KKyAgICAsIEtFX0NfUklHSFQJLyogY29udHJvbC1yaWdodCAqLworICAgICwgS0VfQ19IT01FCQkvKiBjb250cm9sLWhvbWUgKi8KKyAgICAsIEtFX0NfRU5ECQkvKiBjb250cm9sLWVuZCAqLworCisgICAgLCBLRV9YMU1PVVNFCS8qIFgxL1gyIG1vdXNlLWJ1dHRvbnMgKi8KKyAgICAsIEtFX1gxRFJBRworICAgICwgS0VfWDFSRUxFQVNFCisgICAgLCBLRV9YMk1PVVNFCisgICAgLCBLRV9YMkRSQUcKKyAgICAsIEtFX1gyUkVMRUFTRQorCisgICAgLCBLRV9EUk9QCQkvKiBEbkQgZGF0YSBpcyBhdmFpbGFibGUgKi8KK307CisKKy8qCisgKiB0aGUgdGhyZWUgYnl0ZSBjb2RlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgZm9sbG93aW5nIGludCB3aGVuIHVzaW5nIHZnZXRjKCkKKyAqLworI2RlZmluZSBLX1pFUk8JCVRFUk1DQVAyS0VZKEtTX1pFUk8sIEtFX0ZJTExFUikKKworI2RlZmluZSBLX1VQCQlURVJNQ0FQMktFWSgnaycsICd1JykKKyNkZWZpbmUgS19ET1dOCQlURVJNQ0FQMktFWSgnaycsICdkJykKKyNkZWZpbmUgS19MRUZUCQlURVJNQ0FQMktFWSgnaycsICdsJykKKyNkZWZpbmUgS19SSUdIVAkJVEVSTUNBUDJLRVkoJ2snLCAncicpCisjZGVmaW5lIEtfU19VUAkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfVVApCisjZGVmaW5lIEtfU19ET1dOCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0RPV04pCisjZGVmaW5lIEtfU19MRUZUCVRFUk1DQVAyS0VZKCcjJywgJzQnKQorI2RlZmluZSBLX0NfTEVGVAlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfQ19MRUZUKQorI2RlZmluZSBLX1NfUklHSFQJVEVSTUNBUDJLRVkoJyUnLCAnaScpCisjZGVmaW5lIEtfQ19SSUdIVAlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfQ19SSUdIVCkKKyNkZWZpbmUgS19TX0hPTUUJVEVSTUNBUDJLRVkoJyMnLCAnMicpCisjZGVmaW5lIEtfQ19IT01FCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9DX0hPTUUpCisjZGVmaW5lIEtfU19FTkQJCVRFUk1DQVAyS0VZKCcqJywgJzcnKQorI2RlZmluZSBLX0NfRU5ECQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfQ19FTkQpCisjZGVmaW5lIEtfVEFCCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfVEFCKQorI2RlZmluZSBLX1NfVEFCCQlURVJNQ0FQMktFWSgnaycsICdCJykKKworLyogZXh0cmEgc2V0IG9mIGZ1bmN0aW9uIGtleXMgRjEtRjQsIGZvciB2dDEwMCBjb21wYXRpYmxlIHh0ZXJtICovCisjZGVmaW5lIEtfWEYxCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfWEYxKQorI2RlZmluZSBLX1hGMgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1hGMikKKyNkZWZpbmUgS19YRjMJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YRjMpCisjZGVmaW5lIEtfWEY0CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfWEY0KQorCisjZGVmaW5lIEtfRjEJCVRFUk1DQVAyS0VZKCdrJywgJzEnKQkvKiBmdW5jdGlvbiBrZXlzICovCisjZGVmaW5lIEtfRjIJCVRFUk1DQVAyS0VZKCdrJywgJzInKQorI2RlZmluZSBLX0YzCQlURVJNQ0FQMktFWSgnaycsICczJykKKyNkZWZpbmUgS19GNAkJVEVSTUNBUDJLRVkoJ2snLCAnNCcpCisjZGVmaW5lIEtfRjUJCVRFUk1DQVAyS0VZKCdrJywgJzUnKQorI2RlZmluZSBLX0Y2CQlURVJNQ0FQMktFWSgnaycsICc2JykKKyNkZWZpbmUgS19GNwkJVEVSTUNBUDJLRVkoJ2snLCAnNycpCisjZGVmaW5lIEtfRjgJCVRFUk1DQVAyS0VZKCdrJywgJzgnKQorI2RlZmluZSBLX0Y5CQlURVJNQ0FQMktFWSgnaycsICc5JykKKyNkZWZpbmUgS19GMTAJCVRFUk1DQVAyS0VZKCdrJywgJzsnKQorCisjZGVmaW5lIEtfRjExCQlURVJNQ0FQMktFWSgnRicsICcxJykKKyNkZWZpbmUgS19GMTIJCVRFUk1DQVAyS0VZKCdGJywgJzInKQorI2RlZmluZSBLX0YxMwkJVEVSTUNBUDJLRVkoJ0YnLCAnMycpCisjZGVmaW5lIEtfRjE0CQlURVJNQ0FQMktFWSgnRicsICc0JykKKyNkZWZpbmUgS19GMTUJCVRFUk1DQVAyS0VZKCdGJywgJzUnKQorI2RlZmluZSBLX0YxNgkJVEVSTUNBUDJLRVkoJ0YnLCAnNicpCisjZGVmaW5lIEtfRjE3CQlURVJNQ0FQMktFWSgnRicsICc3JykKKyNkZWZpbmUgS19GMTgJCVRFUk1DQVAyS0VZKCdGJywgJzgnKQorI2RlZmluZSBLX0YxOQkJVEVSTUNBUDJLRVkoJ0YnLCAnOScpCisjZGVmaW5lIEtfRjIwCQlURVJNQ0FQMktFWSgnRicsICdBJykKKworI2RlZmluZSBLX0YyMQkJVEVSTUNBUDJLRVkoJ0YnLCAnQicpCisjZGVmaW5lIEtfRjIyCQlURVJNQ0FQMktFWSgnRicsICdDJykKKyNkZWZpbmUgS19GMjMJCVRFUk1DQVAyS0VZKCdGJywgJ0QnKQorI2RlZmluZSBLX0YyNAkJVEVSTUNBUDJLRVkoJ0YnLCAnRScpCisjZGVmaW5lIEtfRjI1CQlURVJNQ0FQMktFWSgnRicsICdGJykKKyNkZWZpbmUgS19GMjYJCVRFUk1DQVAyS0VZKCdGJywgJ0cnKQorI2RlZmluZSBLX0YyNwkJVEVSTUNBUDJLRVkoJ0YnLCAnSCcpCisjZGVmaW5lIEtfRjI4CQlURVJNQ0FQMktFWSgnRicsICdJJykKKyNkZWZpbmUgS19GMjkJCVRFUk1DQVAyS0VZKCdGJywgJ0onKQorI2RlZmluZSBLX0YzMAkJVEVSTUNBUDJLRVkoJ0YnLCAnSycpCisKKyNkZWZpbmUgS19GMzEJCVRFUk1DQVAyS0VZKCdGJywgJ0wnKQorI2RlZmluZSBLX0YzMgkJVEVSTUNBUDJLRVkoJ0YnLCAnTScpCisjZGVmaW5lIEtfRjMzCQlURVJNQ0FQMktFWSgnRicsICdOJykKKyNkZWZpbmUgS19GMzQJCVRFUk1DQVAyS0VZKCdGJywgJ08nKQorI2RlZmluZSBLX0YzNQkJVEVSTUNBUDJLRVkoJ0YnLCAnUCcpCisjZGVmaW5lIEtfRjM2CQlURVJNQ0FQMktFWSgnRicsICdRJykKKyNkZWZpbmUgS19GMzcJCVRFUk1DQVAyS0VZKCdGJywgJ1InKQorCisvKiBleHRyYSBzZXQgb2Ygc2hpZnRlZCBmdW5jdGlvbiBrZXlzIEYxLUY0LCBmb3IgdnQxMDAgY29tcGF0aWJsZSB4dGVybSAqLworI2RlZmluZSBLX1NfWEYxCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19YRjEpCisjZGVmaW5lIEtfU19YRjIJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX1hGMikKKyNkZWZpbmUgS19TX1hGMwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfWEYzKQorI2RlZmluZSBLX1NfWEY0CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19YRjQpCisKKyNkZWZpbmUgS19TX0YxCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMSkJLyogc2hpZnRlZCBmdW5jLiBrZXlzICovCisjZGVmaW5lIEtfU19GMgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjIpCisjZGVmaW5lIEtfU19GMwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjMpCisjZGVmaW5lIEtfU19GNAkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjQpCisjZGVmaW5lIEtfU19GNQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjUpCisjZGVmaW5lIEtfU19GNgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjYpCisjZGVmaW5lIEtfU19GNwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjcpCisjZGVmaW5lIEtfU19GOAkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjgpCisjZGVmaW5lIEtfU19GOQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjkpCisjZGVmaW5lIEtfU19GMTAJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YxMCkKKworI2RlZmluZSBLX1NfRjExCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMTEpCisjZGVmaW5lIEtfU19GMTIJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YxMikKKyNkZWZpbmUgS19TX0YxMwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjEzKQorI2RlZmluZSBLX1NfRjE0CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMTQpCisjZGVmaW5lIEtfU19GMTUJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YxNSkKKyNkZWZpbmUgS19TX0YxNgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjE2KQorI2RlZmluZSBLX1NfRjE3CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMTcpCisjZGVmaW5lIEtfU19GMTgJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YxOCkKKyNkZWZpbmUgS19TX0YxOQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjE5KQorI2RlZmluZSBLX1NfRjIwCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMjApCisKKyNkZWZpbmUgS19TX0YyMQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjIxKQorI2RlZmluZSBLX1NfRjIyCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMjIpCisjZGVmaW5lIEtfU19GMjMJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YyMykKKyNkZWZpbmUgS19TX0YyNAkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjI0KQorI2RlZmluZSBLX1NfRjI1CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMjUpCisjZGVmaW5lIEtfU19GMjYJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YyNikKKyNkZWZpbmUgS19TX0YyNwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjI3KQorI2RlZmluZSBLX1NfRjI4CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMjgpCisjZGVmaW5lIEtfU19GMjkJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YyOSkKKyNkZWZpbmUgS19TX0YzMAkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjMwKQorCisjZGVmaW5lIEtfU19GMzEJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YzMSkKKyNkZWZpbmUgS19TX0YzMgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjMyKQorI2RlZmluZSBLX1NfRjMzCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMzMpCisjZGVmaW5lIEtfU19GMzQJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YzNCkKKyNkZWZpbmUgS19TX0YzNQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NfRjM1KQorI2RlZmluZSBLX1NfRjM2CQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfU19GMzYpCisjZGVmaW5lIEtfU19GMzcJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TX0YzNykKKworI2RlZmluZSBLX0hFTFAJCVRFUk1DQVAyS0VZKCclJywgJzEnKQorI2RlZmluZSBLX1VORE8JCVRFUk1DQVAyS0VZKCcmJywgJzgnKQorCisjZGVmaW5lIEtfQlMJCVRFUk1DQVAyS0VZKCdrJywgJ2InKQorCisjZGVmaW5lIEtfSU5TCQlURVJNQ0FQMktFWSgnaycsICdJJykKKyNkZWZpbmUgS19LSU5TCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfS0lOUykKKyNkZWZpbmUgS19ERUwJCVRFUk1DQVAyS0VZKCdrJywgJ0QnKQorI2RlZmluZSBLX0tERUwJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9LREVMKQorI2RlZmluZSBLX0hPTUUJCVRFUk1DQVAyS0VZKCdrJywgJ2gnKQorI2RlZmluZSBLX0tIT01FCQlURVJNQ0FQMktFWSgnSycsICcxJykJLyoga2V5cGFkIGhvbWUgKHVwcGVyIGxlZnQpICovCisjZGVmaW5lIEtfWEhPTUUJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YSE9NRSkKKyNkZWZpbmUgS19FTkQJCVRFUk1DQVAyS0VZKCdAJywgJzcnKQorI2RlZmluZSBLX0tFTkQJCVRFUk1DQVAyS0VZKCdLJywgJzQnKQkvKiBrZXlwYWQgZW5kIChsb3dlciBsZWZ0KSAqLworI2RlZmluZSBLX1hFTkQJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YRU5EKQorI2RlZmluZSBLX1BBR0VVUAlURVJNQ0FQMktFWSgnaycsICdQJykKKyNkZWZpbmUgS19QQUdFRE9XTglURVJNQ0FQMktFWSgnaycsICdOJykKKyNkZWZpbmUgS19LUEFHRVVQCVRFUk1DQVAyS0VZKCdLJywgJzMnKQkvKiBrZXlwYWQgcGFnZXVwICh1cHBlciBSLikgKi8KKyNkZWZpbmUgS19LUEFHRURPV04JVEVSTUNBUDJLRVkoJ0snLCAnNScpCS8qIGtleXBhZCBwYWdlZG93biAobG93ZXIgUi4pICovCisKKyNkZWZpbmUgS19LUExVUwkJVEVSTUNBUDJLRVkoJ0snLCAnNicpCS8qIGtleXBhZCBwbHVzICovCisjZGVmaW5lIEtfS01JTlVTCVRFUk1DQVAyS0VZKCdLJywgJzcnKQkvKiBrZXlwYWQgbWludXMgKi8KKyNkZWZpbmUgS19LRElWSURFCVRFUk1DQVAyS0VZKCdLJywgJzgnKQkvKiBrZXlwYWQgLyAqLworI2RlZmluZSBLX0tNVUxUSVBMWQlURVJNQ0FQMktFWSgnSycsICc5JykJLyoga2V5cGFkICogKi8KKyNkZWZpbmUgS19LRU5URVIJVEVSTUNBUDJLRVkoJ0snLCAnQScpCS8qIGtleXBhZCBFbnRlciAqLworI2RlZmluZSBLX0tQT0lOVAlURVJNQ0FQMktFWSgnSycsICdCJykJLyoga2V5cGFkIC4gKi8KKworI2RlZmluZSBLX0swCQlURVJNQ0FQMktFWSgnSycsICdDJykJLyoga2V5cGFkIDAgKi8KKyNkZWZpbmUgS19LMQkJVEVSTUNBUDJLRVkoJ0snLCAnRCcpCS8qIGtleXBhZCAxICovCisjZGVmaW5lIEtfSzIJCVRFUk1DQVAyS0VZKCdLJywgJ0UnKQkvKiBrZXlwYWQgMiAqLworI2RlZmluZSBLX0szCQlURVJNQ0FQMktFWSgnSycsICdGJykJLyoga2V5cGFkIDMgKi8KKyNkZWZpbmUgS19LNAkJVEVSTUNBUDJLRVkoJ0snLCAnRycpCS8qIGtleXBhZCA0ICovCisjZGVmaW5lIEtfSzUJCVRFUk1DQVAyS0VZKCdLJywgJ0gnKQkvKiBrZXlwYWQgNSAqLworI2RlZmluZSBLX0s2CQlURVJNQ0FQMktFWSgnSycsICdJJykJLyoga2V5cGFkIDYgKi8KKyNkZWZpbmUgS19LNwkJVEVSTUNBUDJLRVkoJ0snLCAnSicpCS8qIGtleXBhZCA3ICovCisjZGVmaW5lIEtfSzgJCVRFUk1DQVAyS0VZKCdLJywgJ0snKQkvKiBrZXlwYWQgOCAqLworI2RlZmluZSBLX0s5CQlURVJNQ0FQMktFWSgnSycsICdMJykJLyoga2V5cGFkIDkgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHJlY29nbml6ZSBhIGtleXBhZCBrZXkgdGhhdCBkb2VzIGhhdmUgYW4gQVNDSUkgZXF1aXZhbGVudC4KKyAqIFNpbmNlIHRoZSB2YWx1ZXMgYXJlIG5lZ2F0aXZlLCBpdCdzIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICovCisjZGVmaW5lIEZJUlNUX0tFWVBBRAlLX0s5CisjZGVmaW5lIExBU1RfS0VZUEFECUtfS1BMVVMKKworI2RlZmluZSBLX01PVVNFCQlURVJNQ0FQMktFWShLU19NT1VTRSwgS0VfRklMTEVSKQorI2RlZmluZSBLX01FTlUJCVRFUk1DQVAyS0VZKEtTX01FTlUsIEtFX0ZJTExFUikKKyNkZWZpbmUgS19WRVJfU0NST0xMQkFSCVRFUk1DQVAyS0VZKEtTX1ZFUl9TQ1JPTExCQVIsIEtFX0ZJTExFUikKKyNkZWZpbmUgS19IT1JfU0NST0xMQkFSICAgVEVSTUNBUDJLRVkoS1NfSE9SX1NDUk9MTEJBUiwgS0VfRklMTEVSKQorCisjZGVmaW5lIEtfTkVUVEVSTV9NT1VTRQlURVJNQ0FQMktFWShLU19ORVRURVJNX01PVVNFLCBLRV9GSUxMRVIpCisjZGVmaW5lIEtfREVDX01PVVNFCVRFUk1DQVAyS0VZKEtTX0RFQ19NT1VTRSwgS0VfRklMTEVSKQorI2RlZmluZSBLX0pTQlRFUk1fTU9VU0UJVEVSTUNBUDJLRVkoS1NfSlNCVEVSTV9NT1VTRSwgS0VfRklMTEVSKQorI2RlZmluZSBLX1BURVJNX01PVVNFCVRFUk1DQVAyS0VZKEtTX1BURVJNX01PVVNFLCBLRV9GSUxMRVIpCisKKyNkZWZpbmUgS19TRUxFQ1QJVEVSTUNBUDJLRVkoS1NfU0VMRUNULCBLRV9GSUxMRVIpCisjZGVmaW5lIEtfVEVBUk9GRglURVJNQ0FQMktFWShLU19URUFST0ZGLCBLRV9GSUxMRVIpCisKKy8qCisgKiBTeW1ib2xzIGZvciBwc2V1ZG8ga2V5cyB3aGljaCBhcmUgdHJhbnNsYXRlZCBmcm9tIHRoZSByZWFsIGtleSBzeW1ib2xzCisgKiBhYm92ZS4KKyAqLworI2RlZmluZSBLX0xFRlRNT1VTRQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfTEVGVE1PVVNFKQorI2RlZmluZSBLX0xFRlRNT1VTRV9OTQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfTEVGVE1PVVNFX05NKQorI2RlZmluZSBLX0xFRlREUkFHCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9MRUZURFJBRykKKyNkZWZpbmUgS19MRUZUUkVMRUFTRQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfTEVGVFJFTEVBU0UpCisjZGVmaW5lIEtfTEVGVFJFTEVBU0VfTk0gVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX0xFRlRSRUxFQVNFX05NKQorI2RlZmluZSBLX01JRERMRU1PVVNFCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9NSURETEVNT1VTRSkKKyNkZWZpbmUgS19NSURETEVEUkFHCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9NSURETEVEUkFHKQorI2RlZmluZSBLX01JRERMRVJFTEVBU0UJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX01JRERMRVJFTEVBU0UpCisjZGVmaW5lIEtfUklHSFRNT1VTRQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfUklHSFRNT1VTRSkKKyNkZWZpbmUgS19SSUdIVERSQUcJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1JJR0hURFJBRykKKyNkZWZpbmUgS19SSUdIVFJFTEVBU0UJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1JJR0hUUkVMRUFTRSkKKyNkZWZpbmUgS19YMU1PVVNFICAgICAgIFRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YMU1PVVNFKQorI2RlZmluZSBLX1gxTU9VU0UgICAgICAgVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1gxTU9VU0UpCisjZGVmaW5lIEtfWDFEUkFHCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YMURSQUcpCisjZGVmaW5lIEtfWDFSRUxFQVNFICAgICBURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfWDFSRUxFQVNFKQorI2RlZmluZSBLX1gyTU9VU0UgICAgICAgVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1gyTU9VU0UpCisjZGVmaW5lIEtfWDJEUkFHCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9YMkRSQUcpCisjZGVmaW5lIEtfWDJSRUxFQVNFICAgICBURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfWDJSRUxFQVNFKQorCisjZGVmaW5lIEtfSUdOT1JFCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9JR05PUkUpCisKKyNkZWZpbmUgS19TTklGRgkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1NOSUZGKQorCisjZGVmaW5lIEtfTU9VU0VET1dOCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9NT1VTRURPV04pCisjZGVmaW5lIEtfTU9VU0VVUAlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfTU9VU0VVUCkKKworI2RlZmluZSBLX0NTSQkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX0NTSSkKKyNkZWZpbmUgS19TTlIJCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9TTlIpCisjZGVmaW5lIEtfUExVRwkJVEVSTUNBUDJLRVkoS1NfRVhUUkEsIEtFX1BMVUcpCisjZGVmaW5lIEtfQ01EV0lOCVRFUk1DQVAyS0VZKEtTX0VYVFJBLCBLRV9DTURXSU4pCisKKyNkZWZpbmUgS19EUk9QCQlURVJNQ0FQMktFWShLU19FWFRSQSwgS0VfRFJPUCkKKworLyogQml0cyBmb3IgbW9kaWZpZXIgbWFzayAqLworLyogMHgwMSBjYW5ub3QgYmUgdXNlZCwgYmVjYXVzZSB0aGUgbW9kaWZpZXIgbXVzdCBiZSAweDAyIG9yIGhpZ2hlciAqLworI2RlZmluZSBNT0RfTUFTS19TSElGVAkgICAgMHgwMgorI2RlZmluZSBNT0RfTUFTS19DVFJMCSAgICAweDA0CisjZGVmaW5lIE1PRF9NQVNLX0FMVAkgICAgMHgwOAkvKiBha2EgTUVUQSAqLworI2RlZmluZSBNT0RfTUFTS18yQ0xJQ0sJICAgIDB4MTAJLyogdXNlIE1PRF9NQVNLX01VTFRJX0NMSUNLICovCisjZGVmaW5lIE1PRF9NQVNLXzNDTElDSwkgICAgMHgyMAkvKiB1c2UgTU9EX01BU0tfTVVMVElfQ0xJQ0sgKi8KKyNkZWZpbmUgTU9EX01BU0tfNENMSUNLCSAgICAweDMwCS8qIHVzZSBNT0RfTUFTS19NVUxUSV9DTElDSyAqLworI2lmZGVmIE1BQ09TCisjIGRlZmluZSBNT0RfTUFTS19DTUQJICAgICAweDgwCisjZW5kaWYKKworI2RlZmluZSBNT0RfTUFTS19NVUxUSV9DTElDSwkoTU9EX01BU0tfMkNMSUNLfE1PRF9NQVNLXzNDTElDS3xNT0RfTUFTS180Q0xJQ0spCisKKy8qCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHNwZWNpYWwga2V5IG5hbWUsIGluY2x1ZGluZyBtb2RpZmllcnMuCisgKiBDdXJyZW50IGxvbmdlc3QgaXMgPE0tQy1TLTQtTWlkZGxlUmVsZWFzZT4gKGxlbmd0aCBpbmNsdWRlcyAnPCcgYW5kICc+JykuCisgKi8KKyNkZWZpbmUgTUFYX0tFWV9OQU1FX0xFTiAgICAyMworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIHNwZWNpYWwga2V5IGV2ZW50IGFzIHRva2Vucy4gIFRoaXMgaW5jbHVkZXMgbW9kaWZpZXJzLgorICogVGhlIGxvbmdlc3QgZXZlbnQgaXMgc29tZXRoaW5nIGxpa2UgPE0tQy1TLTQtTGVmdERyYWc+IHdoaWNoIHdvdWxkIGJlIHRoZQorICogZm9sbG93aW5nIHN0cmluZyBvZiB0b2tlbnM6CisgKgorICogPEtfU1BFQ0lBTD4gPEtTX01PRElGSUVSPiBiaXRtYXNrIDxLX1NQRUNJQUw+IDxLU19FWFRSQT4gPEtUX0xFRlREUkFHPi4KKyAqCisgKiBUaGlzIGlzIGEgdG90YWwgb2YgNiB0b2tlbnMsIGFuZCBpcyBjdXJyZW50bHkgdGhlIGxvbmdlc3Qgb25lIHBvc3NpYmxlLgorICovCisjZGVmaW5lIE1BWF9LRVlfQ09ERV9MRU4gICAgNgpkaWZmIC0tZ2l0IGEvc3JjL2xpbmsuMzkwIGIvc3JjL2xpbmsuMzkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGluay4zOTAKQEAgLTAsMCArMSw3IEBACitzJS1sWGV4dCAgKiUlZworcyUtbFhtdSAgKiUlZworcyUtbFhtICAqJS91c3IvbGliL1htLnggJWcKK3MlLWxYMTEgIColL3Vzci9saWIvWDExLnggJWcKK3MlLWxYdCAgKiUlZworcyUtbFNNICAqJS91c3IvbGliL1NNLnggJWcKK3MlLWxJQ0UgIColL3Vzci9saWIvSUNFLnggJWcKZGlmZiAtLWdpdCBhL3NyYy9saW5rLnNoIGIvc3JjL2xpbmsuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGM5YzRhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saW5rLnNoCkBAIC0wLDAgKzEsMTM2IEBACisjISAvYmluL3NoCisjCisjIGxpbmsuc2ggLS0gdHJ5IGxpbmtpbmcgVmltIHdpdGggZGlmZmVyZW50IHNldHMgb2YgbGlicmFyaWVzLCBmaW5kaW5nIHRoZQorIyBtaW5pbWFsIHNldCBmb3IgZmFzdGVzdCBzdGFydHVwLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBjb25maWd1cmUgYWRkcyBhIGZldworIyBsaWJyYXJpZXMgd2hlbiB0aGV5IGV4aXN0LCBidXQgdGhpcyBkb2Vzbid0IG1lYW4gdGhleSBhcmUgbmVlZGVkIGZvciBWaW0uCisjCisjICAgICAgQXV0aG9yOiBCcmFtIE1vb2xlbmFhcgorIyBMYXN0IGNoYW5nZTogMjAwNCBBcHIgMDUKKyMKKyMgV2FybmluZzogVGhpcyBmYWlscyBtaXNlcmFibHkgaWYgdGhlIGxpbmtlciBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBjb2RlIQorIworIyBPdGhlcndpc2UgdGhpcyBzY3JpcHQgaXMgZmFpbC1zYWZlLCBmYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZ1bGwgbGluaworIyBjb21tYW5kIGlmIGFueXRoaW5nIGZhaWxzLgorCitlY2hvICIkTElOSyAiID5saW5rLmNtZAorZXhpdF92YWx1ZT0wCisKKyMKKyMgSWYgYXV0by9saW5rLnNlZCBhbHJlYWR5IGV4aXN0cywgdXNlIGl0LiAgV2UgYXNzdW1lIGEgcHJldmlvdXMgcnVuIG9mCisjIGxpbmsuc2ggaGFzIGZvdW5kIHRoZSBjb3JyZWN0IHNldCBvZiBsaWJyYXJpZXMuCisjCitpZiB0ZXN0IC1mIGF1dG8vbGluay5zZWQ7IHRoZW4KKyAgZWNobyAibGluay5zaDogVGhlIGZpbGUgJ2F1dG8vbGluay5zZWQnIGV4aXN0cywgd2hpY2ggaXMgZ29pbmcgdG8gYmUgdXNlZCBub3cuIgorICBlY2hvICJsaW5rLnNoOiBJZiBsaW5raW5nIGZhaWxzLCB0cnkgZGVsZXRpbmcgdGhlIGF1dG8vbGluay5zZWQgZmlsZS4iCisgIGVjaG8gImxpbmsuc2g6IElmIHRoaXMgZmFpbHMgdG9vLCB0cnkgY3JlYXRpbmcgYW4gZW1wdHkgYXV0by9saW5rLnNlZCBmaWxlLiIKK2Vsc2UKKworIyBJZiBsaW5raW5nIHdvcmtzIHdpdGggdGhlIGZ1bGwgbGluayBjb21tYW5kLCB0cnkgcmVtb3Zpbmcgc29tZSBsaWJyYXJpZXMsCisjIHRoYXQgYXJlIGtub3duIG5vdCB0byBiZSBuZWVkZWQgb24gYXQgbGVhc3Qgb25lIHN5c3RlbS4KKyMgUmVtb3ZlIGF1dG8vcGF0aGRlZi5jIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmsgY29tbWFuZCBhbmQgY29tcGlsZSBpdCBhZ2Fpbi4KKyMgVGhlcmUgaXMgYSBsb29wIHRvIHJlbW92ZSBsaWJyYXJpZXMgdGhhdCBhcHBlYXIgc2V2ZXJhbCB0aW1lcy4KKyMKKyMgTm90ZXM6CisjIC0gQ2FuJ3QgcmVtb3ZlIFhleHQ7IEl0IGxpbmtzIGZpbmUgYnV0IHdpbGwgZ2l2ZSBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgZ3ZpbQorIyAgIHdpdGggTW90aWYuCisjIC0gRG9uJ3QgcmVtb3ZlIHRoZSBsYXN0IC1sbTogT24gSFAtVVggVmltIGxpbmtzIE9LIGJ1dCBjcmFzaGVzIHdoZW4gdGhlIEdUSworIyAgIEdVSSBpcyBzdGFydGVkLCBiZWNhdXNlIHRoZSAiZmxvb3IiIHN5bWJvbCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCisjCisgIGNhdCBsaW5rLmNtZAorICBpZiBzaCBsaW5rLmNtZDsgdGhlbgorICAgIHRvdWNoIGF1dG8vbGluay5zZWQKKyAgICBjcCBsaW5rLmNtZCBsaW5raXQuc2gKKyAgICBmb3IgbGlibmFtZSBpbiBTTSBJQ0UgbnNsIGRuZXQgZG5ldF9zdHViIGluZXQgc29ja2V0IGRpciBlbGYgaWNvbnYgWHQgWG11IFhwIFhwbSBYMTEgWGRtY3AgeCB3IGRsIHB0aHJlYWQgdGhyZWFkIHJlYWRsaW5lIG0gcGVybCBjcnlwdCBhdHRyOyBkbworICAgICAgY29udD15ZXMKKyAgICAgIHdoaWxlIHRlc3QgLW4gIiRjb250IjsgZG8KKyAgICAgICAgaWYgZ3JlcCAibCRsaWJuYW1lICIgbGlua2l0LnNoID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgbGluazEuc2VkOyB0aGVuCisgICAgICAgICAgICBlY2hvICJsaW5rLnNoOiBPSywgbGlua2luZyB3b3JrcywgbGV0J3MgdHJ5IHJlbW92aW5nIGEgZmV3IGxpYnJhcmllcy4iCisgICAgICAgICAgICBlY2hvICJsaW5rLnNoOiBTZWUgYXV0by9saW5rLmxvZyBmb3IgZGV0YWlscy4iCisgICAgICAgICAgICBybSAtZiBhdXRvL2xpbmsubG9nCisgICAgICAgICAgZmkKKyAgICAgICAgICBlY2hvICJzLy1sJGxpYm5hbWUgICovLyIgPmxpbmsxLnNlZAorICAgICAgICAgIHNlZCAtZiBhdXRvL2xpbmsuc2VkIDxsaW5rLmNtZCA+bGlua2l0Mi5zaAorICAgICAgICAgIHNlZCAtZiBsaW5rMS5zZWQgPGxpbmtpdDIuc2ggPmxpbmtpdC5zaAorICAgICAgICAgICMga2VlcCB0aGUgbGFzdCAtbG0KKyAgICAgICAgICBpZiB0ZXN0ICRsaWJuYW1lICE9ICJtIiB8fCBncmVwICJsbSAiIGxpbmtpdC5zaCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICBlY2hvICJsaW5rLnNoOiBUcnlpbmcgdG8gcmVtb3ZlIHRoZSAkbGlibmFtZSBsaWJyYXJ5Li4uIgorICAgICAgICAgICAgY2F0IGxpbmtpdC5zaCA+PmF1dG8vbGluay5sb2cKKyAgICAgICAgICAgICMgUmVkaXJlY3QgdGhpcyBsaW5rIG91dHB1dCwgaXQgbWF5IGNvbnRhaW4gZXJyb3IgbWVzc2FnZXMgd2hpY2gKKyAgICAgICAgICAgICMgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgICAgICBpZiBzaCBsaW5raXQuc2ggPj5hdXRvL2xpbmsubG9nIDI+JjE7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAibGluay5zaDogV2UgZG9uJ3QgbmVlZCB0aGUgJGxpYm5hbWUgbGlicmFyeSEiCisgICAgICAgICAgICAgIGNhdCBsaW5rMS5zZWQgPj5hdXRvL2xpbmsuc2VkCisgICAgICAgICAgICAgIHJtIC1mIGF1dG8vcGF0aGRlZi5jCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gImxpbmsuc2g6IFdlIERPIG5lZWQgdGhlICRsaWJuYW1lIGxpYnJhcnkuIgorICAgICAgICAgICAgICBjb250PQorICAgICAgICAgICAgICBjcCBsaW5rLmNtZCBsaW5raXQuc2gKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udD0KKyAgICAgICAgICAgIGNwIGxpbmsuY21kIGxpbmtpdC5zaAorICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250PQorICAgICAgICAgIGNwIGxpbmsuY21kIGxpbmtpdC5zaAorICAgICAgICBmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICBpZiB0ZXN0ICEgLWYgYXV0by9wYXRoZGVmLmM7IHRoZW4KKyAgICAgICRNQUtFIG9iamVjdHMvcGF0aGRlZi5vCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgbGluazEuc2VkOyB0aGVuCisgICAgICBlY2hvICJsaW5rLnNoOiBMaW5rZWQgZmluZSwgbm8gbGlicmFyaWVzIGNhbiBiZSByZW1vdmVkIgorICAgICAgdG91Y2ggbGluazMuc2VkCisgICAgZmkKKyAgZWxzZQorICAgIGV4aXRfdmFsdWU9JD8KKyAgZmkKK2ZpCisKKyMKKyMgTm93IGRvIHRoZSByZWFsIGxpbmtpbmcuCisjCitpZiB0ZXN0IC1zIGF1dG8vbGluay5zZWQ7IHRoZW4KKyAgZWNobyAibGluay5zaDogVXNpbmcgYXV0by9saW5rLnNlZCBmaWxlIHRvIHJlbW92ZSBhIGZldyBsaWJyYXJpZXMiCisgIHNlZCAtZiBhdXRvL2xpbmsuc2VkIDxsaW5rLmNtZCA+bGlua2l0LnNoCisgIGNhdCBsaW5raXQuc2gKKyAgaWYgc2ggbGlua2l0LnNoOyB0aGVuCisgICAgZXhpdF92YWx1ZT0wCisgICAgZWNobyAibGluay5zaDogTGlua2VkIGZpbmUgd2l0aCBhIGZldyBsaWJyYXJpZXMgcmVtb3ZlZCIKKyAgZWxzZQorICAgIGV4aXRfdmFsdWU9JD8KKyAgICBlY2hvICJsaW5rLnNoOiBMaW5raW5nIGZhaWxlZCwgbWFraW5nIGF1dG8vbGluay5zZWQgZW1wdHkgYW5kIHRyeWluZyBhZ2FpbiIKKyAgICBtdiAtZiBhdXRvL2xpbmsuc2VkIGxpbmsyLnNlZAorICAgIHRvdWNoIGF1dG8vbGluay5zZWQKKyAgICBybSAtZiBhdXRvL3BhdGhkZWYuYworICAgICRNQUtFIG9iamVjdHMvcGF0aGRlZi5vCisgIGZpCitmaQoraWYgdGVzdCAtZiBhdXRvL2xpbmsuc2VkIC1hICEgLXMgYXV0by9saW5rLnNlZCAtYSAhIC1mIGxpbmszLnNlZDsgdGhlbgorICBlY2hvICJsaW5rLnNoOiBVc2luZyB1bm1vZGlmaWVkIGxpbmsgY29tbWFuZCIKKyAgY2F0IGxpbmsuY21kCisgIGlmIHNoIGxpbmsuY21kOyB0aGVuCisgICAgZXhpdF92YWx1ZT0wCisgICAgZWNobyAibGluay5zaDogTGlua2VkIE9LIgorICBlbHNlCisgICAgZXhpdF92YWx1ZT0kPworICAgIGlmIHRlc3QgLWYgbGluazIuc2VkOyB0aGVuCisgICAgICBlY2hvICJsaW5rLnNoOiBMaW5raW5nIGRvZXNuJ3Qgd29yayBhdCBhbGwsIHJlbW92aW5nIGF1dG8vbGluay5zZWQiCisgICAgICBybSAtZiBhdXRvL2xpbmsuc2VkCisgICAgZmkKKyAgZmkKK2ZpCisKKyMKKyMgY2xlYW51cAorIworcm0gLWYgbGluay5jbWQgbGlua2l0LnNoIGxpbmsxLnNlZCBsaW5rMi5zZWQgbGluazMuc2VkIGxpbmtpdDIuc2gKKworIworIyByZXR1cm4gYW4gZXJyb3IgY29kZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZworIworZXhpdCAkZXhpdF92YWx1ZQorCisjIHZpbTpzZXQgc3c9MiBldDoKZGlmZiAtLWdpdCBhL3NyYy9tYWNyb3MuaCBiL3NyYy9tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJiMzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hY3Jvcy5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogbWFjcm9zLmg6IG1hY3JvIGRlZmluaXRpb25zIGZvciBvZnRlbiB1c2VkIGNvZGUKKyAqLworCisvKgorICogcGNoYXIobHAsIGMpIC0gcHV0IGNoYXJhY3RlciAnYycgYXQgcG9zaXRpb24gJ2xwJworICovCisjZGVmaW5lIHBjaGFyKGxwLCBjKSAoKihtbF9nZXRfYnVmKGN1cmJ1ZiwgKGxwKS5sbnVtLCBUUlVFKSArIChscCkuY29sKSA9IChjKSkKKworLyoKKyAqIFBvc2l0aW9uIGNvbXBhcmlzb25zCisgKi8KKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisjIGRlZmluZSBsdChhLCBiKSAoKChhKS5sbnVtICE9IChiKS5sbnVtKSBcCisJCSAgID8gKGEpLmxudW0gPCAoYikubG51bSBcCisJCSAgIDogKGEpLmNvbCAhPSAoYikuY29sIFwKKwkJICAgICAgID8gKGEpLmNvbCA8IChiKS5jb2wgXAorCQkgICAgICAgOiAoYSkuY29sYWRkIDwgKGIpLmNvbGFkZCkKKyMgZGVmaW5lIGx0cChhLCBiKSAoKChhKS0+bG51bSAhPSAoYiktPmxudW0pIFwKKwkJICAgPyAoYSktPmxudW0gPCAoYiktPmxudW0gXAorCQkgICA6IChhKS0+Y29sICE9IChiKS0+Y29sIFwKKwkJICAgICAgID8gKGEpLT5jb2wgPCAoYiktPmNvbCBcCisJCSAgICAgICA6IChhKS0+Y29sYWRkIDwgKGIpLT5jb2xhZGQpCisjIGRlZmluZSBlcXVhbHBvcyhhLCBiKSAoKChhKS5sbnVtID09IChiKS5sbnVtKSAmJiAoKGEpLmNvbCA9PSAoYikuY29sKSAmJiAoKGEpLmNvbGFkZCA9PSAoYikuY29sYWRkKSkKKyNlbHNlCisjIGRlZmluZSBsdChhLCBiKSAoKChhKS5sbnVtICE9IChiKS5sbnVtKSBcCisJCSAgID8gKChhKS5sbnVtIDwgKGIpLmxudW0pIDogKChhKS5jb2wgPCAoYikuY29sKSkKKyMgZGVmaW5lIGx0cChhLCBiKSAoKChhKS0+bG51bSAhPSAoYiktPmxudW0pIFwKKwkJICAgPyAoKGEpLT5sbnVtIDwgKGIpLT5sbnVtKSA6ICgoYSktPmNvbCA8IChiKS0+Y29sKSkKKyMgZGVmaW5lIGVxdWFscG9zKGEsIGIpICgoKGEpLmxudW0gPT0gKGIpLmxudW0pICYmICgoYSkuY29sID09IChiKS5jb2wpKQorI2VuZGlmCisKKyNkZWZpbmUgbHRvcmVxKGEsIGIpIChsdChhLCBiKSB8fCBlcXVhbHBvcyhhLCBiKSkKKworLyoKKyAqIGxpbmVlbXB0eSgpIC0gcmV0dXJuIFRSVUUgaWYgdGhlIGxpbmUgaXMgZW1wdHkKKyAqLworI2RlZmluZSBsaW5lZW1wdHkocCkgKCptbF9nZXQocCkgPT0gTlVMKQorCisvKgorICogYnVmZW1wdHkoKSAtIHJldHVybiBUUlVFIGlmIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBlbXB0eQorICovCisjZGVmaW5lIGJ1ZmVtcHR5KCkgKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID09IDEgJiYgKm1sX2dldCgobGluZW5yX1QpMSkgPT0gTlVMKQorCisvKgorICogdG91cHBlcigpIGFuZCB0b2xvd2VyKCkgdGhhdCB1c2UgdGhlIGN1cnJlbnQgbG9jYWxlLgorICogT24gc29tZSBzeXN0ZW1zIHRvdXBwZXIoKS90b2xvd2VyKCkgb25seSB3b3JrIG9uIGxvd2VyL3VwcGVyY2FzZSBjaGFyYWN0ZXJzCisgKiBDYXJlZnVsOiBPbmx5IGNhbGwgVE9VUFBFUl9MT0MoKSBhbmQgVE9MT1dFUl9MT0MoKSB3aXRoIGEgY2hhcmFjdGVyIGluIHRoZQorICogcmFuZ2UgMCAtIDI1NS4gIHRvdXBwZXIoKS90b2xvd2VyKCkgb24gc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZSBvdGhlcnMuCisgKiBOb3RlOiBmb3IgVVRGLTggdXNlIHV0Zl90b3VwcGVyKCkgYW5kIHV0Zl90b2xvd2VyKCkuCisgKi8KKyNpZmRlZiBNU1dJTgorIyAgZGVmaW5lIFRPVVBQRVJfTE9DKGMpCXRvdXBwZXJfdGFiWyhjKSAmIDI1NV0KKyMgIGRlZmluZSBUT0xPV0VSX0xPQyhjKQl0b2xvd2VyX3RhYlsoYykgJiAyNTVdCisjZWxzZQorIyBpZmRlZiBCUk9LRU5fVE9VUFBFUgorIyAgZGVmaW5lIFRPVVBQRVJfTE9DKGMpCShpc2xvd2VyKGMpID8gdG91cHBlcihjKSA6IChjKSkKKyMgIGRlZmluZSBUT0xPV0VSX0xPQyhjKQkoaXN1cHBlcihjKSA/IHRvbG93ZXIoYykgOiAoYykpCisjIGVsc2UKKyMgIGRlZmluZSBUT1VQUEVSX0xPQwkJdG91cHBlcgorIyAgZGVmaW5lIFRPTE9XRVJfTE9DCQl0b2xvd2VyCisjIGVuZGlmCisjZW5kaWYKKworLyogdG91cHBlcigpIGFuZCB0b2xvd2VyKCkgZm9yIEFTQ0lJIG9ubHkgYW5kIGlnbm9yZSB0aGUgY3VycmVudCBsb2NhbGUuICovCisjaWZkZWYgRUJDRElDCisjIGRlZmluZSBUT1VQUEVSX0FTQyhjKQkoaXNsb3dlcihjKSA/IHRvdXBwZXIoYykgOiAoYykpCisjIGRlZmluZSBUT0xPV0VSX0FTQyhjKQkoaXN1cHBlcihjKSA/IHRvbG93ZXIoYykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgVE9VUFBFUl9BU0MoYykJKCgoYykgPCAnYScgfHwgKGMpID4gJ3onKSA/IChjKSA6IChjKSAtICgnYScgLSAnQScpKQorIyBkZWZpbmUgVE9MT1dFUl9BU0MoYykJKCgoYykgPCAnQScgfHwgKGMpID4gJ1onKSA/IChjKSA6IChjKSArICgnYScgLSAnQScpKQorI2VuZGlmCisKKy8qCisgKiBNQl9JU0xPV0VSKCkgYW5kIE1CX0lTVVBQRVIoKSBhcmUgdG8gYmUgdXNlZCBvbiBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuICBCdXQKKyAqIGRvbid0IHVzZSB0aGVtIGZvciBuZWdhdGl2ZSB2YWx1ZXMuCisgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisjIGRlZmluZSBNQl9JU0xPV0VSKGMpCShlbmNfdXRmOCAmJiAoYykgPiAweDgwID8gdXRmX2lzbG93ZXIoYykgOiAoaGFzX21ieXRlICYmIGMgPiAyNTUgPyBGQUxTRSA6IGlzbG93ZXIoYykpKQorIyBkZWZpbmUgTUJfSVNVUFBFUihjKQkoZW5jX3V0ZjggJiYgKGMpID4gMHg4MCA/IHV0Zl9pc3VwcGVyKGMpIDogKGhhc19tYnl0ZSAmJiBjID4gMjU1ID8gRkFMU0UgOiBpc3VwcGVyKGMpKSkKKyMgZGVmaW5lIE1CX1RPTE9XRVIoYykJKGVuY191dGY4ICYmIChjKSA+IDB4ODAgPyB1dGZfdG9sb3dlcihjKSA6IChoYXNfbWJ5dGUgJiYgYyA+IDI1NSA/IGMgOiBUT0xPV0VSX0xPQyhjKSkpCisjIGRlZmluZSBNQl9UT1VQUEVSKGMpCShlbmNfdXRmOCAmJiAoYykgPiAweDgwID8gdXRmX3RvdXBwZXIoYykgOiAoaGFzX21ieXRlICYmIGMgPiAyNTUgPyBjIDogVE9VUFBFUl9MT0MoYykpKQorI2Vsc2UKKyMgZGVmaW5lIE1CX0lTTE9XRVIoYykJaXNsb3dlcihjKQorIyBkZWZpbmUgTUJfSVNVUFBFUihjKQlpc3VwcGVyKGMpCisjIGRlZmluZSBNQl9UT0xPV0VSKGMpCVRPTE9XRVJfTE9DKGMpCisjIGRlZmluZSBNQl9UT1VQUEVSKGMpCVRPVVBQRVJfTE9DKGMpCisjZW5kaWYKKworLyogTGlrZSBpc2FscGhhKCkgYnV0IHJlamVjdCBub24tQVNDSUkgY2hhcmFjdGVycy4gIENhbid0IGJlIHVzZWQgd2l0aCBhCisgKiBzcGVjaWFsIGtleSAobmVnYXRpdmUgdmFsdWUpLiAqLworI2lmZGVmIEVCQ0RJQworIyBkZWZpbmUgQVNDSUlfSVNBTFBIQShjKSBpc2FscGhhKGMpCisjIGRlZmluZSBBU0NJSV9JU0FMTlVNKGMpIGlzYWxudW0oYykKKyMgZGVmaW5lIEFTQ0lJX0lTTE9XRVIoYykgaXNsb3dlcihjKQorIyBkZWZpbmUgQVNDSUlfSVNVUFBFUihjKSBpc3VwcGVyKGMpCisjZWxzZQorIyBkZWZpbmUgQVNDSUlfSVNBTFBIQShjKSAoKGMpIDwgMHg3ZiAmJiBpc2FscGhhKGMpKQorIyBkZWZpbmUgQVNDSUlfSVNBTE5VTShjKSAoKGMpIDwgMHg3ZiAmJiBpc2FsbnVtKGMpKQorIyBkZWZpbmUgQVNDSUlfSVNMT1dFUihjKSAoKGMpIDwgMHg3ZiAmJiBpc2xvd2VyKGMpKQorIyBkZWZpbmUgQVNDSUlfSVNVUFBFUihjKSAoKGMpIDwgMHg3ZiAmJiBpc3VwcGVyKGMpKQorI2VuZGlmCisKKy8qIFVzZSBvdXIgb3duIGlzZGlnaXQoKSByZXBsYWNlbWVudCwgYmVjYXVzZSBvbiBNUy1XaW5kb3dzIGlzZGlnaXQoKSByZXR1cm5zCisgKiBub24temVybyBmb3Igc3VwZXJzY3JpcHQgMS4gIEFsc28gYXZvaWRzIHRoYXQgaXNkaWdpdCgpIGNyYXNoZXMgZm9yIG51bWJlcnMKKyAqIGJlbG93IDAgYW5kIGFib3ZlIDI1NS4gIEZvciBjb21wbGljYXRlZCBhcmd1bWVudHMgYW5kIGluL2RlY3JlbWVudCB1c2UKKyAqIHZpbV9pc2RpZ2l0KCkgaW5zdGVhZC4gKi8KKyNkZWZpbmUgVklNX0lTRElHSVQoYykgKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKworLyogbWFjcm8gdmVyc2lvbiBvZiBjaGFydGFiKCkuCisgKiBPbmx5IHdvcmtzIHdpdGggdmFsdWVzIDAtMjU1IQorICogRG9lc24ndCB3b3JrIGZvciBVVEYtOCBtb2RlIHdpdGggY2hhcnMgPj0gMHg4MC4gKi8KKyNkZWZpbmUgQ0hBUlNJWkUoYykJKGNoYXJ0YWJbY10gJiBDVF9DRUxMX01BU0spCisKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKy8qCisgKiBBZGp1c3QgY2hhcnMgaW4gYSBsYW5ndWFnZSBhY2NvcmRpbmcgdG8gJ2xhbmdtYXAnIG9wdGlvbi4KKyAqIE5PVEUgdGhhdCB0aGVyZSBpcyBOTyBvdmVyaGVhZCBpZiAnbGFuZ21hcCcgaXMgbm90IHNldDsgYnV0IGV2ZW4KKyAqIHdoZW4gc2V0IHdlIG9ubHkgaGF2ZSB0byBkbyAyIGlmcyBhbmQgYW4gYXJyYXkgbG9va3VwLgorICogRG9uJ3QgYXBwbHkgJ2xhbmdtYXAnIGlmIHRoZSBjaGFyYWN0ZXIgY29tZXMgZnJvbSB0aGUgU3R1ZmYgYnVmZmVyLgorICogVGhlIGRvLXdoaWxlIGlzIGp1c3QgdG8gaWdub3JlIGEgJzsnIGFmdGVyIHRoZSBtYWNyby4KKyAqLworIyBkZWZpbmUgTEFOR01BUF9BREpVU1QoYywgY29uZGl0aW9uKSBkbyB7IFwKKwlpZiAoKnBfbGFuZ21hcCAmJiAoY29uZGl0aW9uKSAmJiAhS2V5U3R1ZmZlZCAmJiAoYykgPj0gMCAmJiAoYykgPCAyNTYpIFwKKwkgICAgYyA9IGxhbmdtYXBfbWFwY2hhcltjXTsgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIHZpbV9pc2JyZWFrKCkgaXMgdXNlZCB2ZXJ5IG9mdGVuIGlmICdsaW5lYnJlYWsnIGlzIHNldCwgdXNlIGEgbWFjcm8gdG8gbWFrZQorICogaXQgd29yayBmYXN0LgorICovCisjZGVmaW5lIHZpbV9pc2JyZWFrKGMpIChicmVha2F0X2ZsYWdzWyhjaGFyX3UpKGMpXSkKKworLyoKKyAqIE9uIFZNUyBmaWxlIG5hbWVzIGFyZSBkaWZmZXJlbnQgYW5kIHJlcXVpcmUgYSB0cmFuc2xhdGlvbi4KKyAqIE9uIHRoZSBNYWMgb3BlbigpIGhhcyBvbmx5IHR3byBhcmd1bWVudHMuCisgKi8KKyNpZmRlZiBWTVMKKyMgZGVmaW5lIG1jaF9hY2Nlc3MobiwgcCkJYWNjZXNzKHZtc19maXhmaWxlbmFtZShuKSwgKHApKQorCQkJCS8qIHNlZSBtY2hfb3BlbigpIGNvbW1lbnQgKi8KKyMgZGVmaW5lIG1jaF9mb3BlbihuLCBwKQlmb3Blbih2bXNfZml4ZmlsZW5hbWUobiksIChwKSkKKyMgZGVmaW5lIG1jaF9mc3RhdChuLCBwKQlmc3RhdCh2bXNfZml4ZmlsZW5hbWUobiksIChwKSkKKwkvKiBWTVMgZG9lcyBub3QgaGF2ZSBsc3RhdCgpICovCisjIGRlZmluZSBtY2hfc3RhdChuLCBwKQkJc3RhdCh2bXNfZml4ZmlsZW5hbWUobiksIChwKSkKKyNlbHNlCisjIGlmbmRlZiBXSU4zMgorIyAgIGRlZmluZSBtY2hfYWNjZXNzKG4sIHApCWFjY2VzcygobiksIChwKSkKKyMgZW5kaWYKKyMgaWYgIShkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkpCisjICBkZWZpbmUgbWNoX2ZvcGVuKG4sIHApCWZvcGVuKChuKSwgKHApKQorIyBlbmRpZgorIyBkZWZpbmUgbWNoX2ZzdGF0KG4sIHApCWZzdGF0KChuKSwgKHApKQorIyBkZWZpbmUgbWNoX2xzdGF0KG4sIHApCWxzdGF0KChuKSwgKHApKQorIyBpZmRlZiBNU1dJTgkvKiBoYXMgaXQncyBvd24gbWNoX3N0YXQoKSBmdW5jdGlvbiAqLworIyAgZGVmaW5lIG1jaF9zdGF0KG4sIHApCXZpbV9zdGF0KChuKSwgKHApKQorIyBlbHNlCisjICBpZmRlZiBTVEFUX0lHTk9SRVNfU0xBU0gKKyAgICAvKiBPbiBTb2xhcmlzIHN0YXQoKSBhY2NlcHRzICJmaWxlLyIgYXMgaWYgaXQgd2FzICJmaWxlIi4gIFJldHVybiAtMSBpZgorICAgICAqIHRoZSBuYW1lIGVuZHMgaW4gIi8iIGFuZCBpdCdzIG5vdCBhIGRpcmVjdG9yeS4gKi8KKyMgICBkZWZpbmUgbWNoX3N0YXQobiwgcCkJKGlsbGVnYWxfc2xhc2gobikgPyAtMSA6IHN0YXQoKG4pLCAocCkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBtY2hfc3RhdChuLCBwKQlzdGF0KChuKSwgKHApKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUFDT1NfQ0xBU1NJQworLyogTWFjT1MgY2xhc3NpYyBkb2Vzbid0IHN1cHBvcnQgcGVybSBidXQgTWFjT1MgWCBkb2VzLiAqLworIyBkZWZpbmUgbWNoX29wZW4obiwgbSwgcCkJb3BlbigobiksIChtKSkKKyNlbHNlCisjIGlmZGVmIFZNUworLyoKKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGZvcmNlIHNvbWUgcmVjb3JkIGZvcm1hdCB3aXRoOgorICogIyAgZGVmaW5lIG1jaF9vcGVuKG4sIG0sIHApIG9wZW4odm1zX2ZpeGZpbGVuYW1lKG4pLCAobSksIChwKSksICJyYXQ9Y3IiLCAicmZtPXN0bWxmIiwgIm1ycz0wIikKKyAqIGJ1dCBpdCBpcyBub3QgcmVjb21lbmRlZCwgYmVjYXVzZSBpdCBjYW4gZGVzdHJveSBpbmRleGVzIGV0Yy4KKyAqLworIyAgZGVmaW5lIG1jaF9vcGVuKG4sIG0sIHApCW9wZW4odm1zX2ZpeGZpbGVuYW1lKG4pLCAobSksIChwKSkKKyMgZWxzZQorIyAgaWYgIShkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkpCisjICAgZGVmaW5lIG1jaF9vcGVuKG4sIG0sIHApCW9wZW4oKG4pLCAobSksIChwKSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogbWNoX29wZW5fcncoKTogaW52b2tlIG1jaF9vcGVuKCkgd2l0aCB0aGlyZCBhcmd1bWVudCBmb3IgdXNlciBSL1cuICovCisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgIC8qIG9wZW4gaW4gcnctLS0tLS0tIG1vZGUgKi8KKyMgZGVmaW5lIG1jaF9vcGVuX3J3KG4sIGYpCW1jaF9vcGVuKChuKSwgKGYpLCAobW9kZV90KTA2MDApCisjZWxzZQorIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE9TMikgIC8qIG9wZW4gcmVhZC93cml0ZSAqLworIyAgZGVmaW5lIG1jaF9vcGVuX3J3KG4sIGYpCW1jaF9vcGVuKChuKSwgKGYpLCBTX0lSRUFEIHwgU19JV1JJVEUpCisjIGVsc2UKKyMgIGRlZmluZSBtY2hfb3Blbl9ydyhuLCBmKQltY2hfb3BlbigobiksIChmKSwgMCkKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogRW5jcnlwdGlvbiBtYWNyb3MuICBNb2hzaW4gQWhtZWQsIG1vc2hAc2FzaS5jb20gOTgtMDktMjQKKyAqIEJhc2VkIG9uIHppcC9jcnlwdCBzb3VyY2VzLgorICovCisKKyNpZmRlZiBGRUFUX0NSWVBUCisKKyNpZm5kZWYgX19NSU5HVzMyX18KKyMgZGVmaW5lIFBXTEVOIDgwCisjZW5kaWYKKworLyogZW5jb2RlIGJ5dGUgYywgdXNpbmcgdGVtcCB0LiAgV2FybmluZzogYyBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gKi8KKyMgZGVmaW5lIFpFTkNPREUoYywgdCkgICh0ID0gZGVjcnlwdF9ieXRlKCksIHVwZGF0ZV9rZXlzKGMpLCB0XihjKSkKKworLyogZGVjb2RlIGJ5dGUgYyBpbiBwbGFjZSAqLworIyBkZWZpbmUgWkRFQ09ERShjKSAgIHVwZGF0ZV9rZXlzKGMgXj0gZGVjcnlwdF9ieXRlKCkpCisKKyNlbmRpZgorCisjaWZkZWYgU1RBUlRVUFRJTUUKKyMgZGVmaW5lIFRJTUVfTVNHKHMpIHRpbWVfbXNnKHMsIE5VTEwpCisjZWxzZQorIyBkZWZpbmUgVElNRV9NU0cocykKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorIyBkZWZpbmUgUkVQTEFDRV9OT1JNQUwocykgKCgocykgJiBSRVBMQUNFX0ZMQUcpICYmICEoKHMpICYgVlJFUExBQ0VfRkxBRykpCisjZWxzZQorIyBkZWZpbmUgUkVQTEFDRV9OT1JNQUwocykgKChzKSAmIFJFUExBQ0VfRkxBRykKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BUkFCSUMKKyMgZGVmaW5lIFVURl9DT01QT1NJTkdMSUtFKHAxLCBwMikgIHV0Zl9jb21wb3NpbmdsaWtlKChwMSksIChwMikpCisjZWxzZQorIyBkZWZpbmUgVVRGX0NPTVBPU0lOR0xJS0UocDEsIHAyKSAgdXRmX2lzY29tcG9zaW5nKHV0Zl9wdHIyY2hhcihwMikpCisjZW5kaWYKKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgLyogV2hldGhlciB0byBkcmF3IHRoZSB2ZXJ0aWNhbCBiYXIgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNlbGwuICovCisjIGRlZmluZSBDVVJTT1JfQkFSX1JJR0hUIChjdXJ3aW4tPndfcF9ybCAmJiAoIShTdGF0ZSAmIENNRExJTkUpIHx8IGNtZG1zZ19ybCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9tYWluLmFhcCBiL3NyYy9tYWluLmFhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDkwYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4uYWFwCkBAIC0wLDAgKzEsMTAxNCBAQAorIyBBLUEtUCByZWNpcGUgZm9yIGJ1aWxkaW5nIFZpbQorIworIyBUaGVyZSBhcmUgbm8gdXNlciBjaG9pY2VzIGluIGhlcmUhCisjIFB1dCBjb25maWd1cmUgYXJndW1lbnRzIGluIHRoZSBmaWxlIGNvbmZpZy5hcmcuCisjIExhdGVyIHRoZXJlIHdpbGwgYmUgYSBjb25maWcudHh0IGZpbGUgdGhhdCBjb250YWlucyBleGFtcGxlcyBhbmQKKyMgZXhwbGFuYXRpb25zLgorIworIyBPcHRpb25hbCBhcmd1bWVudHM6CisjICBQUkVGSVg9ZGlyCQlPdmVycnVsZXMgdGhlIGluc3RhbGwgZGlyZWN0b3J5LgorIwkJCUNhbiBiZSBzcGVjaWZpZWQgd2hlbiBpbnN0YWxsaW5nIG9ubHkuCisjCQkJRXhhbXBsZTogYWFwIGluc3RhbGwgUFJFRklYPSRIT01FCisjCisKKyMgU2tpcCB0aGUgY29uZmlndXJlIHN0dWZmIHdoZW4gImxpbmsuc2giIGlzIGV4ZWN1dGluZyB0aGlzIHJlY2lwZSByZWN1cnNpdmVseQorIyB0byBidWlsZCBwYXRoZGVmLmMgb3Igbm90IGJ1aWxkaW5nIHNvbWV0aGluZyBhbmQgYXV0by9jb25maWcuYWFwIGRvZXMgZXhpc3QuCitAaWYgKChfbm8uVEFSR0VUQVJHICE9ICJwYXRoZGVmIiBhbmQgaGFzX2J1aWxkX3RhcmdldCgpKQorQAlvciBub3Qgb3MucGF0aC5leGlzdHMoImF1dG8vY29uZmlnLmFhcCIpKToKKworICAgICMKKyAgICAjIEEgVSBUIE8gQyBPIE4gRgorICAgICMKKworICAgICMgUnVuIGF1dG9jb25mIHdoZW4gY29uZmlndXJlLmluIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxhc3QgcnVuLgorICAgICMgVGhpcyBpcyBza2lwcGVkIHdoZW4gdGhlIHNpZ25hdHVyZXMgaW4gIm15c2lnbiIgYXJlIHVwLXRvLWRhdGUuICBXaGVuCisgICAgIyB0aGVyZSBpcyBubyBhdXRvY29uZiBwcm9ncmFtIHNraXAgdGhpcyAodGhlIHNpZ25hdHVyZSBpcyBvZnRlbiB0aGUgb25seQorICAgICMgdGhpbmcgdGhhdCdzIG91dGRhdGVkKQorICAgIGF1dG8vY29uZmlndXJlIHtzaWduZmlsZSA9IG15c2lnbn0gOiBjb25maWd1cmUuaW4KKwlAaWYgbm90IHByb2dyYW1fcGF0aCgiYXV0b2NvbmYiKToKKwkgICAgOnByaW50IENhbid0IGZpbmQgYXV0b2NvbmYsIHVzaW5nIGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisJQGVsc2U6CisgICAgICAgICAgICAjIE1vdmUgY29uZmlndXJlIGFzaWRlLCBhdXRvY29uZiB3b3VsZCBvdmVyd3JpdGUgaXQKKyAgICAgICAgICAgIDptb3ZlIHtleGlzdH0gY29uZmlndXJlIGNvbmZpZ3VyZS5zYXZlCisgICAgICAgICAgICA6c3lzIGF1dG9jb25mCisgICAgICAgICAgICA6Y2F0IGNvbmZpZ3VyZSB8IDpldmFsIHJlLnN1YignXFwuL2NvbmZpZy5sb2cnLCAnYXV0by9jb25maWcubG9nJywgc3RkaW4pID4hIGF1dG8vY29uZmlndXJlCisgICAgICAgICAgICA6Y2htb2QgNzU1IGF1dG8vY29uZmlndXJlCisgICAgICAgICAgICA6bW92ZSBjb25maWd1cmUuc2F2ZSBjb25maWd1cmUKKyAgICAgICAgICAgIDpkZWwge2ZvcmNlfSBhdXRvL2NvbmZpZy5jYWNoZSBhdXRvL2NvbmZpZy5zdGF0dXMKKworICAgICMgQ2hhbmdlIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHByb2R1Y2UgY29uZmlnLmFhcCBpbnN0ZWFkIG9mIGNvbmZpZy5tay4KKyAgICBhdXRvL2NvbmZpZ3VyZS5hYXAgOiBhdXRvL2NvbmZpZ3VyZQorCTpwcmludCBBZGp1c3RpbmcgYXV0by9jb25maWd1cmUgZm9yIEEtQS1QLgorCTpjYXQgYXV0by9jb25maWd1cmUgfCA6ZXZhbCByZS5zdWIoImNvbmZpZy5tayIsICJjb25maWcuYWFwIiwgc3RkaW4pCisJCQkJCQkJPiEgYXV0by9jb25maWd1cmUuYWFwCisJOmNobW9kIDc1NSBhdXRvL2NvbmZpZ3VyZS5hYXAKKworICAgICMgVGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlcyB0aGUgZGlyZWN0b3J5IHdoZXJlIGl0J3MgbG9jYXRlZCwgdXNlIGEgbGluay4KKyAgICBjb25maWd1cmUuYWFwOiAge2J1aWxkY2hlY2s9fQorCTpzeXMgbG4gLXMgYXV0by9jb25maWd1cmUuYWFwIGNvbmZpZ3VyZS5hYXAKKworICAgICMgRGVwZW5kZW5jeTogcnVuIGNvbmZpZ3VyZS5hYXAgdG8gdXBkYXRlIGNvbmZpZy5oIGFuZCBjb25maWcuYWFwIGluIHRoZQorICAgICMgImF1dG8iIGRpcmVjdG9yeS4KKyAgICBjb25maWcge3ZpcnR1YWx9IGF1dG8vY29uZmlnLmggYXV0by9jb25maWcuYWFwIDoKKwkJCSBhdXRvL2NvbmZpZ3VyZS5hYXAgY29uZmlndXJlLmFhcAorCQkJIGNvbmZpZy5hcmcgY29uZmlnLmguaW4gY29uZmlnLmFhcC5pbgorCTpzeXMgQ09ORklHX1NUQVRVUz1hdXRvL2NvbmZpZy5zdGF0dXMKKyAgICAgICAgICAgICAgICAuL2NvbmZpZ3VyZS5hYXAgYGZpbGUyc3RyaW5nKCJjb25maWcuYXJnIilgCisgICAgICAgICAgICAgICAgICAgIC0tY2FjaGUtZmlsZT1hdXRvL2NvbmZpZy5jYWNoZQorCisgICAgIyBDb25maWd1cmUgYXJndW1lbnRzOiBjcmVhdGUgYW4gZW1wdHkgImNvbmZpZy5hcmciIGZpbGUgd2hlbiBpdHMgbWlzc2luZworICAgIGNvbmZpZy5hcmc6CisJOnRvdWNoIHtleGlzdH0gY29uZmlnLmFyZworCisgICAgIyAiYXV0by9jb25maWcuYWFwIiBjb250YWlucyBhIGxvdCBvZiBzZXR0aW5ncywgc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUKKyAgICAjIGV4ZWN1dGFibGUgIlRhcmdldCIuCisgICAgIyBGaXJzdCB1cGRhdGUgaXQsIGZvcmNlZnVsbHkgaWYgdGhlICJyZWNvbmZpZyIgdGFyZ2V0IHdhcyB1c2VkLgorICAgIEBpZiBfbm8uVEFSR0VUQVJHICE9ICJjb21tZW50IiBhbmQgX25vLlRBUkdFVEFSRyAhPSAibWFrZSI6CisJQGlmICJyZWNvbmZpZyIgaW4gdmFyMmxpc3QoX25vLlRBUkdFVEFSRyk6CisJICAgIDpkZWwge2ZvcmNlfSBhdXRvL2NvbmZpZy5jYWNoZSBhdXRvL2NvbmZpZy5zdGF0dXMKKwkgICAgOnVwZGF0ZSB7Zm9yY2V9IGF1dG8vY29uZmlnLmFhcAorCUBlbHNlOgorCSAgICA6dXBkYXRlIGF1dG8vY29uZmlnLmFhcAorCisjIEluY2x1ZGUgdGhlIHJlY2lwZSB0aGF0IGF1dG9jb25mIGdlbmVyYXRlZC4KKzppbmNsdWRlIGF1dG8vY29uZmlnLmFhcAorCisjIEEgIlBSRUZJWD1kaXIiIGFyZ3VtZW50IG92ZXJydWxlcyB0aGUgdmFsdWUgb2YgJHByZWZpeAorQGlmIF9uby5nZXQoIlBSRUZJWCIpOgorICAgIHByZWZpeCA9ICRQUkVGSVgKKworIyBEb24ndCB3YW50ICJ+LyIgaW4gcHJlZml4LgorcHJlZml4ID0gYG9zLnBhdGguZXhwYW5kdXNlcihwcmVmaXgpYAorCisjCisjIEcgVSBJICB2YXJpYW50CisjCisjIFRoZSBHVUkgaXMgc2VsZWN0ZWQgYnkgY29uZmlndXJlLCBhIGxvdCBvZiBvdGhlciB0aGluZ3MgZGVwZW5kIG9uIGl0LgorIworOnZhcmlhbnQgR1VJCisgICAgR1RLCisJR1VJX1NSQwkJPSBndWkuYyBndWlfZ3RrLmMgZ3VpX2d0a194MTEuYyBwdHkuYyBndWlfYmV2YWwuYworCQkJICAgIGd1aV9ndGtfZi5jCisJR1VJX09CSgkJJD0gJEJESVIvZ3VpLm8gJEJESVIvZ3VpX2d0ay5vICRCRElSL2d1aV9ndGtfeDExLm8KKwkJCSAgICAkQkRJUi9wdHkubyAkQkRJUi9ndWlfZ3RrX2YubworCUdVSV9ERUZTCT0gLURGRUFUX0dVSV9HVEsgJE5BUlJPV19QUk9UTworCUdVSV9JUEFUSAk9ICRHVUlfSU5DX0xPQworCUdVSV9MSUJTX0RJUgk9ICRHVUlfTElCX0xPQworCUdVSV9MSUJTMQk9CisJR1VJX0xJQlMyCT0gJEdUS19MSUJOQU1FCisJR1VJX1RBUkdFVFMJPSBpbnN0YWxsZ2xpbmtzCisJR1VJX01BTl9UQVJHRVRTCT0gaW5zdGFsbGdoZWxwbGlua3MKKwlHVUlfVEVTVFRBUkdFVAk9IGd1aQorICAgIE1PVElGCisJR1VJX1NSQwkJPSBndWkuYyBndWlfbW90aWYuYyBndWlfeDExLmMgcHR5LmMgZ3VpX2JldmFsLmMKKwlHVUlfT0JKCQkkPSAkQkRJUi9ndWkubyAkQkRJUi9ndWlfbW90aWYubyAkQkRJUi9ndWlfeDExLm8KKwkJCSAgICAkQkRJUi9wdHkubyAkQkRJUi9ndWlfYmV2YWwubworCUdVSV9ERUZTCT0gLURGRUFUX0dVSV9NT1RJRiAkTkFSUk9XX1BST1RPCisJR1VJX0lQQVRICT0gJEdVSV9JTkNfTE9DCisJR1VJX0xJQlNfRElSCT0gJEdVSV9MSUJfTE9DCisJR1VJX0xJQlMxCT0KKwlHVUlfTElCUzIJPSAkTU9USUZfTElCTkFNRSAtbFh0CisJR1VJX1RBUkdFVFMJPSBpbnN0YWxsZ2xpbmtzCisJR1VJX01BTl9UQVJHRVRTCT0gaW5zdGFsbGdoZWxwbGlua3MKKwlHVUlfVEVTVFRBUkdFVAk9IGd1aQorICAgIEFUSEVOQQorCSMgWEFXX0xJQiBldCBhbC4gY2FuIGJlIG92ZXJydWxlZCB0byB1c2UgWGF3M2Qgd2lkZ2V0cworCVhBV19MSUIJCT89IC1sWGF3CisJR1VJX1NSQwkJPSAgZ3VpLmMgZ3VpX2F0aGVuYS5jIGd1aV94MTEuYyBwdHkuYyBndWlfYmV2YWwuYyBcCisJCQkgICAgZ3VpX2F0X3NiLmMgZ3VpX2F0X2ZzLmMKKwlHVUlfT0JKCQkkPSAkQkRJUi9ndWkubyAkQkRJUi9ndWlfYXRoZW5hLm8gJEJESVIvZ3VpX3gxMS5vIFwKKwkJCSAgICAkQkRJUi9wdHkubyAkQkRJUi9ndWlfYmV2YWwubyBcCisJCQkgICAgJEJESVIvZ3VpX2F0X3NiLm8gJEJESVIvZ3VpX2F0X2ZzLm8KKwlHVUlfREVGUwk9IC1ERkVBVF9HVUlfQVRIRU5BICROQVJST1dfUFJPVE8KKwlHVUlfSVBBVEgJPSAkR1VJX0lOQ19MT0MKKwlHVUlfTElCU19ESVIJPSAkR1VJX0xJQl9MT0MKKwlHVUlfTElCUzEJPSAkWEFXX0xJQgorCUdVSV9MSUJTMgk9IC1sWHQKKwlHVUlfVEFSR0VUUwk9IGluc3RhbGxnbGlua3MKKwlHVUlfTUFOX1RBUkdFVFMJPSBpbnN0YWxsZ2hlbHBsaW5rcworCUdVSV9URVNUVEFSR0VUCT0gZ3VpCisgICAgTkVYVEFXCisJIyBYQVdfTElCIGV0IGFsLiBjYW4gYmUgb3ZlcnJ1bGVkIHRvIHVzZSBYYXczZCB3aWRnZXRzCisJWEFXX0xJQgkJPz0gLWxYYXcKKwlHVUlfU1JDCQk9ICBndWkuYyBndWlfYXRoZW5hLmMgZ3VpX3gxMS5jIHB0eS5jIGd1aV9iZXZhbC5jCisJCQkgICAgZ3VpX2F0X2ZzLmMKKwlHVUlfT0JKCQkkPSAkQkRJUi9ndWkubyAkQkRJUi9ndWlfYXRoZW5hLm8gJEJESVIvZ3VpX3gxMS5vCisJCQkgICAgJEJESVIvcHR5Lm8gJEJESVIvZ3VpX2JldmFsLm8gJEJESVIvZ3VpX2F0X2ZzLm8KKwlHVUlfREVGUwk9IC1ERkVBVF9HVUlfQVRIRU5BIC1ERkVBVF9HVUlfTkVYVEFXICROQVJST1dfUFJPVE8KKwlHVUlfSVBBVEgJPSAkR1VJX0lOQ19MT0MKKwlHVUlfTElCU19ESVIJPSAkR1VJX0xJQl9MT0MKKwlHVUlfTElCUzEJPSAkTkVYVEFXX0xJQgorCUdVSV9MSUJTMgk9IC1sWHQKKwlHVUlfVEFSR0VUUwk9IGluc3RhbGxnbGlua3MKKwlHVUlfTUFOX1RBUkdFVFMJPSBpbnN0YWxsZ2hlbHBsaW5rcworCUdVSV9URVNUVEFSR0VUCT0gZ3VpCisgICAgQkVPU0dVSQorCUdVSV9TUkMJCT0gZ3VpLmMgZ3VpX2Jlb3MuY2MgcHR5LmMKKwlHVUlfT0JKCQk9ICRCRElSL2d1aS5vICRCRElSL2d1aV9iZW9zLm8gICRCRElSL3B0eS5vCisJR1VJX0RFRlMJPSAtREZFQVRfR1VJX0JFT1MKKwlHVUlfSVBBVEgJPQorCUdVSV9MSUJTX0RJUgk9CisJR1VJX0xJQlMxCT0gLWxiZSAtbHJvb3QKKwlHVUlfTElCUzIJPQorCUdVSV9UQVJHRVRTCT0gaW5zdGFsbGdsaW5rcworCUdVSV9NQU5fVEFSR0VUUwk9IGluc3RhbGxnaGVscGxpbmtzCisJR1VJX1RFU1RUQVJHRVQJPSBndWkKKyAgICBQSE9UT05HVUkKKwlHVUlfU1JDCQk9IGd1aS5jIGd1aV9waG90b24uYyBwdHkuYworCUdVSV9PQkoJCT0gJEJESVIvZ3VpLm8gJEJESVIvZ3VpX3Bob3Rvbi5vICRCRElSL3B0eS5vCisJR1VJX0RFRlMJPSAtREZFQVRfR1VJX1BIT1RPTgorCUdVSV9JUEFUSAk9CisJR1VJX0xJQlNfRElSCT0KKwlHVUlfTElCUzEJPSAtbHBoIC1scGhleGxpYgorCUdVSV9MSUJTMgk9CisJR1VJX1RBUkdFVFMJPSBpbnN0YWxsZ2xpbmtzCisJR1VJX01BTl9UQVJHRVRTCT0gaW5zdGFsbGdoZWxwbGlua3MKKwlHVUlfVEVTVFRBUkdFVAk9IGd1aQorICAgICoKKwlHVUlfU1JDCQk9CisJR1VJX09CSgkJPQorCUdVSV9ERUZTCT0KKwlHVUlfSVBBVEgJPQorCUdVSV9MSUJTX0RJUgk9CisJR1VJX0xJQlMxCT0KKwlHVUlfTElCUzIJPQorCUdVSV9UQVJHRVRTCT0KKwlHVUlfTUFOX1RBUkdFVFMJPQorCUdVSV9URVNUVEFSR0VUCT0KKworCitQUkVfREVGUyA9IC1JcHJvdG8gLUkuICRERUZTICRHVUlfREVGUyAkR1VJX0lQQVRIICRDUFBGTEFHUyAkPyhFWFRSQV9JUEFUSFMpCitQT1NUX0RFRlMgPSAkWF9DRkxBR1MgJFBFUkxfQ0ZMQUdTICRQWVRIT05fQ0ZMQUdTICRUQ0xfQ0ZMQUdTICRSVUJZX0NGTEFHUyAkPyhFWFRSQV9ERUZTKQorQ0ZMQUdTID0gJFBSRV9ERUZTICRDT05GX0NGTEFHUyAkPyhQUk9GSUxFX0NGTEFHUykgJFBPU1RfREVGUworQ1BQRkxBR1MgPQorCitBTExfTElCX0RJUlMgPSAkR1VJX0xJQlNfRElSICRYX0xJQlNfRElSCitMREZMQUdTID0gJEFMTF9MSUJfRElSUyAkQ09ORl9MREZMQUdTCitMSUJTID0gJEdVSV9MSUJTMSAkR1VJX1hfTElCUyAkR1VJX0xJQlMyICRYX1BSRV9MSUJTICRYX0xJQlMgJFhfRVhUUkFfTElCUyAkQ09ORl9MSUJTICQ/KEVYVFJBX0xJQlMpICRQRVJMX0xJQlMgJFBZVEhPTl9MSUJTICRUQ0xfTElCUyAkUlVCWV9MSUJTICQ/KFBST0ZJTEVfTElCUykKKworVGFyZ2V0ID0gJFZJTU5BTUUKKworIyByZWNvbmZpZyB0YXJnZXQgYWxzbyBidWlsZHMgVmltIChyZWNvbmZpZ3VyYXRpb24gaXMgaGFuZGxlZCBhYm92ZSkuCityZWNvbmZpZyB7dmlydHVhbH06ICRUYXJnZXQKKworCisjIEV4ZWN1dGUgdGhlIHRlc3Qgc2NyaXB0cy4gIFJ1biB0aGVzZSBhZnRlciBjb21waWxpbmcgVmltLCBiZWZvcmUgaW5zdGFsbGluZy4KKyMKKyMgVGhpcyB3aWxsIHByb2R1Y2UgYSBsb3Qgb2YgZ2FyYmFnZSBvbiB5b3VyIHNjcmVlbiwgaW5jbHVkaW5nIGEgZmV3IGVycm9yCisjIG1lc3NhZ2VzLiAgRG9uJ3Qgd29ycnkgYWJvdXQgdGhhdC4KKyMgSWYgdGhlcmUgaXMgYSByZWFsIGVycm9yLCB0aGVyZSB3aWxsIGJlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuICJ0ZXN0Lm91dCIgYW5kCisjIGEgInRlc3Q5OS5vayIgZmlsZS4KKyMgSWYgZXZlcnl0aGluZyBpcyBhbGxyaWdodCwgdGhlIGZpbmFsIG1lc3NhZ2Ugd2lsbCBiZSAiQUxMIERPTkUiLgorIwordGVzdCBjaGVjazoKKyAgICBWaW1Qcm9nID0gLi4vJFRhcmdldAorICAgIDpleGVjdXRlIHRlc3RkaXIvbWFpbi5hYXAgJEdVSV9URVNUVEFSR0VUCisKK3Rlc3RjbGVhbiB7dmlydHVhbH06CisgICAgOmRlbCB7Zm9yY2V9IHRlc3RkaXIvKi5vdXQgdGVzdGRpci90ZXN0LmxvZworCisKKyMgV2hlbiBubyBmZXRjaCB0YXJnZXQgZXhpc3RzIHdlIGFyZSBub3QgYSBjaGlsZCBvZiB0aGUgLi4vbWFpbi5hYXAgcmVjaXBlLAorIyBVc2UgLi4vbWFpbi5hYXAgdG8gZG8gdGhlIGZldGNoaW5nLgorIyAtLS0gSWYgeW91IGdldCBhbiBlcnJvciBoZXJlIGZvciB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLCB5b3UgbmVlZCB0bworIyAgICAgdXBkYXRlIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBBLUEtUC4KK0BpZiBub3QgaGFzX3RhcmdldCgiZmV0Y2giKToKKyAgICBmZXRjaDoKKwk6ZXhlY3V0ZSAuLi9tYWluLmFhcCBmZXRjaAorCisKKyMgQWxsIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBpbGVkLgorIyBTb21lIGFyZSBvcHRpb25hbCBhbmQgZGVwZW5kIG9uIGNvbmZpZ3VyZS4KKyMgInZlcnNpb24uYyIgaXMgbWlzc2luZywgaXQncyBhbHdheXMgY29tcGlsZWQgKHNlZSBiZWxvdykuCitTb3VyY2UgPQorCWJ1ZmZlci5jCisJY2hhcnNldC5jCisJZGlmZi5jCisJZGlncmFwaC5jCisJZWRpdC5jCisJZXZhbC5jCisJZXhfY21kcy5jCisJZXhfY21kczIuYworCWV4X2RvY21kLmMKKwlleF9ldmFsLmMKKwlleF9nZXRsbi5jCisJZmlsZWlvLmMKKwlmb2xkLmMKKwlnZXRjaGFyLmMKKwlpZl9jc2NvcGUuYworCWlmX3hjbWRzcnYuYworCW1haW4uYworCW1hcmsuYworCW1lbWZpbGUuYworCW1lbWxpbmUuYworCW1lbnUuYworCW1lc3NhZ2UuYworCW1pc2MxLmMKKwltaXNjMi5jCisJbW92ZS5jCisJbWJ5dGUuYworCW5vcm1hbC5jCisJb3BzLmMKKwlvcHRpb24uYworCW9zX3VuaXguYworCWF1dG8vcGF0aGRlZi5jCisJcXVpY2tmaXguYworCXJlZ2V4cC5jCisJc2NyZWVuLmMKKwlzZWFyY2guYworCXN5bnRheC5jCisJdGFnLmMKKwl0ZXJtLmMKKwl1aS5jCisJdW5kby5jCisJd2luZG93LmMKKwkkT1NfRVhUUkFfU1JDCisJJEdVSV9TUkMKKwkkSEFOR1VMSU5fU1JDCisJJFBFUkxfU1JDCisJJE5FVEJFQU5TX1NSQworCSRQWVRIT05fU1JDCisJJFRDTF9TUkMKKwkkUlVCWV9TUkMKKwkkU05JRkZfU1JDCisJJFdPUktTSE9QX1NSQworCisjIFRPRE86IG1ha2UgaXMgc3RpbGwgdXNlZCBmb3Igc3ViZGlyZWN0b3JpZXMsIG5lZWQgdG8gd3JpdGUgYSByZWNpcGUuCitNQUtFID89IG1ha2UKKworYWxsOiAkVGFyZ2V0CisKKyMgVGhpcyBkZXBlbmRlbmN5IGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGF1dG8vb3NkZWYuaCBiZWZvcmUgYXV0b21hdGljCisjIGRlcGVuZGVuY2llcyBhcmUgZ2VuZXJhdGVkLgorJFNvdXJjZSB2ZXJzaW9uLmMgOiBhdXRvL29zZGVmLmgKKworIyBOZWVkIHRvIG1lbnRpb24gdGhhdCB0aGUgdGFyZ2V0IGFsc28gZGVwZW5kcyBvbiB2ZXJzaW9uLmMsIHNpbmNlIGl0J3Mgbm90CisjIGlubHVkZWQgaW4gJFNvdXJjZQorJFRhcmdldCA6IHZlcnNpb24uYworCisjIFNvbWUgc291cmNlcyBhcmUgdG8gYmUgZm91bmQgaW4gdGhlICJhdXRvIiBkaXJlY3RvcnkuCitTUkNQQVRIICs9IGF1dG8KKworIyBXaGVuIGJ1aWxkaW5nIFZpbSBhbHdheXMgY29tcGlsZSB2ZXJzaW9uLmMgdG8gZ2V0IHRoZSB0aW1lc3RhbXAuCis6ZmlsZXR5cGUKKyAgICBkZWNsYXJlIG15X3Byb2cKKzphdHRyIHtmaWxldHlwZSA9IG15X3Byb2d9ICRUYXJnZXQKKworOnByb2dyYW0gJFRhcmdldCA6ICRTb3VyY2UKKworOmFjdGlvbiBidWlsZCBteV9wcm9nIG9iamVjdAorCXZlcnNpb25fb2JqID0gYHNyYzJvYmooInZlcnNpb24uYyIpYAorCTpkbyBjb21waWxlIHt0YXJnZXQgPSAkdmVyc2lvbl9vYmp9IHZlcnNpb24uYworCSM6ZG8gYnVpbGQge3RhcmdldCA9ICR0YXJnZXQge2ZpbGV0eXBlID0gcHJvZ3JhbX19ICRzb3VyY2UgJHZlcnNpb25fb2JqCisJbGlua19zZWQgPSAkQkRJUi9saW5rLnNlZAorCUBpZiBvcy5wYXRoLmV4aXN0cyhsaW5rX3NlZCk6CisJICAgIDptb3ZlIHtmb3JjZX0gJGxpbmtfc2VkIGF1dG8vbGluay5zZWQKKwlAZWxzZToKKwkgICAgOmRlbCB7Zm9yY2V9IGF1dG8vbGluay5zZWQKKwk6dXBkYXRlIGxpbmsyLnNoCisJOnN5cyBMSU5LPSIkPyhQVVJJRlkpICQ/KFNIUlBFTlYpICRDQyAkTERGTEFHUyBcCisJCS1vICR0YXJnZXQgJHNvdXJjZSAkdmVyc2lvbl9vYmogJExJQlMiIFwKKwkJTUFLRT0iYWFwIiBzaCAuL2xpbmsyLnNoCisJOmNvcHkge2ZvcmNlfSBhdXRvL2xpbmsuc2VkICRCRElSL2xpbmsuc2VkCisKKyMgImxpbmsuc2giIG11c3QgYmUgbW9kaWZpZWQgZm9yIEEtQS1QCitsaW5rMi5zaCA6IGxpbmsuc2gKKyAgICA6cHJpbnQgQWRqdXN0aW5nICQtc291cmNlIGZvciBBLUEtUC4KKyAgICA6Y2F0ICRzb3VyY2UgfCA6ZXZhbCByZS5zdWIoIm9iamVjdHMvcGF0aGRlZi5vIiwgInBhdGhkZWYiLCBzdGRpbikKKwkJCQkJCQkJICAgICAgPiEgJHRhcmdldAorCit4eGQveHhkJEVYRVNVRjogeHhkL3h4ZC5jCisgICAgOnN5cyBjZCB4eGQ7IENDPSIkQ0MiIENGTEFHUz0iJENQUEZMQUdTICRDRkxBR1MiIFwKKwkgICAgJE1BS0UgLWYgTWFrZWZpbGUKKworIyBCdWlsZCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgaWYgdGhleSB3ZXJlIHVucGFja2VkLgorIyBHZW5lcmF0ZSB0aGUgY29udmVydGVkIC5tbyBmaWxlcyBzZXBhcmF0ZWx5LCBpdCdzIG5vIHByb2JsZW0gaWYgdGhpcyBmYWlscy4KK2xhbmd1YWdlcyB7dmlydHVhbH06CisJQGlmIF9uby5NQUtFTU86CisJICAgIDpzeXMgY2QgJFBPRElSOyBDQz0iJENDIiAkTUFLRSBwcmVmaXg9JERFU1RESVIkcHJlZml4CisJICAgIEB0cnk6CisJCTpzeXMgY2QgJFBPRElSOyBDQz0iJENDIiAkTUFLRSBwcmVmaXg9JERFU1RESVIkcHJlZml4IGNvbnZlcnRlZAorCSAgICBAZXhjZXB0OgorCQk6cHJpbnQgR2VuZXJhdGVkIGNvbnZlcnRlZCBsYW5ndWFnZSBmaWxlcyBmYWlsZWQsIGNvbnRpbnVpbmcKKworIyBVcGRhdGUgdGhlICoucG8gZmlsZXMgZm9yIGNoYW5nZXMgaW4gdGhlIHNvdXJjZXMuICBPbmx5IHJ1biBtYW51YWxseS4KK3VwZGF0ZS1wbyB7dmlydHVhbH06CisJY2QgJFBPRElSOyBDQz0iJENDIiAkTUFLRSBwcmVmaXg9JERFU1RESVIkcHJlZml4IHVwZGF0ZS1wbworCithdXRvL2lmX3BlcmwuYzogaWZfcGVybC54cworCTpzeXMgJFBFUkwgLWUgJ3VubGVzcyAoICQkXSA+PSA1LjAwNSApIHsgZm9yIChxdyhuYSBkZWZndiBlcnJndikpIHsgcHJpbnQgIiNkZWZpbmUgUExfJCRfICQkX1xuIiB9fScgPiAkdGFyZ2V0CisJOnN5cyAkUEVSTCAkUEVSTExJQi9FeHRVdGlscy94c3VicHAgLXByb3RvdHlwZXMgLXR5cGVtYXAgXAorCSAgICAkUEVSTExJQi9FeHRVdGlscy90eXBlbWFwIGlmX3BlcmwueHMgPj4gJHRhcmdldAorCithdXRvL29zZGVmLmg6IGF1dG8vY29uZmlnLmggb3NkZWYuc2ggb3NkZWYxLmguaW4gb3NkZWYyLmguaW4KKwk6c3lzIENDPSIkQ0MgJENGTEFHUyIgc3JjZGlyPSRzcmNkaXIgc2ggJHNyY2Rpci9vc2RlZi5zaAorCitwYXRoZGVmIHt2aXJ0dWFsfSA6ICRCRElSL2F1dG8vcGF0aGRlZiRPQkpTVUYKKworYXV0by9wYXRoZGVmLmM6IGF1dG8vY29uZmlnLmFhcAorCTpwcmludCBDcmVhdGluZyAkdGFyZ2V0CisJOnByaW50ID4hICR0YXJnZXQgLyogcGF0aGRlZi5jICovCisJOnByaW50ID4+ICR0YXJnZXQgLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBtYWluLmFhcCAqLworCTpwcmludCA+PiAkdGFyZ2V0IC8qIERPIE5PVCBFRElUISAgQ2hhbmdlIG1haW4uYWFwIG9ubHkuICovCisJOnByaW50ID4+ICR0YXJnZXQgJCNpbmNsdWRlICJ2aW0uaCIKKwk6cHJpbnQgPj4gJHRhcmdldCBjaGFyX3UgKmRlZmF1bHRfdmltX2RpciA9IChjaGFyX3UgKikiJFZJTVJDTE9DIjsKKwk6cHJpbnQgPj4gJHRhcmdldCBjaGFyX3UgKmRlZmF1bHRfdmltcnVudGltZV9kaXIgPSAoY2hhcl91ICopIiQ/VklNUlVOVElNRURJUiI7CisJOnByaW50ID4+ICR0YXJnZXQgY2hhcl91ICphbGxfY2ZsYWdzID0gKGNoYXJfdSAqKSIkQ0MgLWMgLUkkc3JjZGlyICRDRkxBR1MiOworCWxpbmtjbWQgPSAkQ0MgJExERkxBR1MgLW8gJFZJTVRBUkdFVCAkTElCUworCWxpbmtfc2VkID0gJEJESVIvbGluay5zZWQKKwlAaWYgb3MucGF0aC5leGlzdHMobGlua19zZWQpOgorCSAgICAjIGZpbHRlciAkbGlua2NtZCB0aHJvdWdoICRCRElSL2xpbmsuc2VkCisJICAgIDpwcmludCAkbGlua2NtZCB8IDpzeXNldmFsIHNlZCAtZiAkbGlua19zZWQgfCA6ZXZhbCByZS5zdWIoIlxuIiwgIiIsIHN0ZGluKSB8IDphc3NpZ24gbGlua2NtZAorCTpwcmludCA+PiAkdGFyZ2V0IGNoYXJfdSAqYWxsX2xmbGFncyA9IChjaGFyX3UgKikiJGxpbmtjbWQiOworCUBpZiBfbm8uZ2V0KCJDT01QSUxFREJZIik6CisJICAgIHdobyA9ICRDT01QSUxFREJZCisJICAgIHdoZXJlID0gJycKKwlAZWxzZToKKwkgICAgOnN5c2V2YWwgd2hvYW1pIHwgOmV2YWwgcmUuc3ViKCJcbiIsICIiLCBzdGRpbikgfCA6YXNzaWduIHdobworCisJICAgIDpzeXNldmFsIGhvc3RuYW1lIHwgOmV2YWwgcmUuc3ViKCJcbiIsICIiLCBzdGRpbikgfCA6YXNzaWduIHdoZXJlCisJOnByaW50ID4+ICR0YXJnZXQgY2hhcl91ICpjb21waWxlZF91c2VyID0gKGNoYXJfdSAqKSIkd2hvIjsKKwk6cHJpbnQgPj4gJHRhcmdldCBjaGFyX3UgKmNvbXBpbGVkX3N5cyA9IChjaGFyX3UgKikiJHdoZXJlIjsKKworCisjIyMgTmFtZXMgb2YgdGhlIHByb2dyYW1zIGFuZCB0YXJnZXRzCitWSU1UQVJHRVQJPSAkVklNTkFNRSRFWEVTVUYKK0VYVEFSR0VUCT0gJEVYTkFNRSRMTktTVUYKK1ZJRVdUQVJHRVQJPSAkVklFV05BTUUkTE5LU1VGCitHVklNTkFNRQk9IGckVklNTkFNRQorR1ZJTVRBUkdFVAk9ICRHVklNTkFNRSRMTktTVUYKK0dWSUVXTkFNRQk9IGckVklFV05BTUUKK0dWSUVXVEFSR0VUCT0gJEdWSUVXTkFNRSRMTktTVUYKK1JWSU1OQU1FCT0gciRWSU1OQU1FCitSVklNVEFSR0VUCT0gJFJWSU1OQU1FJExOS1NVRgorUlZJRVdOQU1FCT0gciRWSUVXTkFNRQorUlZJRVdUQVJHRVQJPSAkUlZJRVdOQU1FJExOS1NVRgorUkdWSU1OQU1FCT0gciRHVklNTkFNRQorUkdWSU1UQVJHRVQJPSAkUkdWSU1OQU1FJExOS1NVRgorUkdWSUVXTkFNRQk9IHIkR1ZJRVdOQU1FCitSR1ZJRVdUQVJHRVQJPSAkUkdWSUVXTkFNRSRMTktTVUYKK1ZJTURJRkZOQU1FCT0gJChWSU1OQU1FKWRpZmYKK0dWSU1ESUZGTkFNRQk9IGckVklNRElGRk5BTUUKK1ZJTURJRkZUQVJHRVQJPSAkVklNRElGRk5BTUUkTE5LU1VGCitHVklNRElGRlRBUkdFVAk9ICRHVklNRElGRk5BTUUkTE5LU1VGCitFVklNTkFNRQk9IGUkVklNTkFNRQorRVZJTVRBUkdFVAk9ICRFVklNTkFNRSRMTktTVUYKK0VWSUVXTkFNRQk9IGUkVklFV05BTUUKK0VWSUVXVEFSR0VUCT0gJEVWSUVXTkFNRSRMTktTVUYKKworIyMjIE5hbWVzIG9mIHRoZSB0b29scyB0aGF0IGFyZSBhbHNvIG1hZGUKK1RPT0xTID0geHhkL3h4ZCRFWEVTVUYKKworIyBSb290IG9mIHRoZSBpbnN0YWxsYXRpb24gdHJlZS4gIEVtcHR5IGZvciBhIG5vcm1hbCBpbnN0YWxsLCBzZXQgdG8gYW4KKyMgZXhpc3RpbmcgcGF0aCB0byBpbnN0YWxsIGludG8gYSBzcGVjaWFsIHBsYWNlIChmb3IgZ2VuZXJhdGluZyBhIHBhY2thZ2UpLgorREVTVERJUiA/PQorCisjIyMgTG9jYXRpb24gb2YgbWFuIHBhZ2VzCitNQU5TVUJESVIgPSAkTUFORElSL21hbjEKKworIyMjIExvY2F0aW9uIG9mIFZpbSBmaWxlcyAoc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGNoYW5nZWQsIGFuZAorIyMjIHNvbWUgdGhpbmdzIG1pZ2h0IG5vdCB3b3JrIHdoZW4gdGhleSBhcmUgY2hhbmdlZCEpCitWSU1ESVIgPSAvdmltCitAciA9IHJlLmNvbXBpbGUoJy4qVklNX1ZFUlNJT05fTk9ET1RcXHMqIih2aW1cXGRcXGRbXiJdKikiLionLCByZS5TKQorVklNUlRESVIgPSAvYHIubWF0Y2gob3BlbigidmVyc2lvbi5oIikucmVhZCgpKS5ncm91cCgxKWAKK0hFTFBTVUJESVIgPSAvZG9jCitDT0xTVUJESVIgPSAvY29sb3JzCitTWU5TVUJESVIgPSAvc3ludGF4CitJTkRTVUJESVIgPSAvaW5kZW50CitQTFVHU1VCRElSID0gL3BsdWdpbgorRlRQTFVHU1VCRElSID0gL2Z0cGx1Z2luCitMQU5HU1VCRElSID0gL2xhbmcKK0NPTVBTVUJESVIgPSAvY29tcGlsZXIKK0tNQVBTVUJESVIgPSAva2V5bWFwCitNQUNST1NVQkRJUiA9IC9tYWNyb3MKK1RPT0xTU1VCRElSID0gL3Rvb2xzCitUVVRPUlNVQkRJUiA9IC90dXRvcgorUFJJTlRTVUJESVIgPSAvcHJpbnQKK1BPRElSID0gcG8KKworIyMjIFZJTUxPQwljb21tb24gcm9vdCBvZiB0aGUgVmltIGZpbGVzIChhbGwgdmVyc2lvbnMpCisjIyMgVklNUlRMT0MJY29tbW9uIHJvb3Qgb2YgdGhlIHJ1bnRpbWUgVmltIGZpbGVzICh0aGlzIHZlcnNpb24pCisjIyMgVklNUkNMT0MJY29tcGlsZWQtaW4gbG9jYXRpb24gZm9yIGdsb2JhbCBbZ112aW1yYyBmaWxlcyAoYWxsIHZlcnNpb25zKQorIyMjIFZJTVJVTlRJTUVESVIgIGNvbXBpbGVkLWluIGxvY2F0aW9uIGZvciBydW50aW1lIGZpbGVzIChvcHRpb25hbCkKKyMjIyBIRUxQU1VCTE9DCWxvY2F0aW9uIGZvciBoZWxwIGZpbGVzCisjIyMgQ09MU1VCTE9DCWxvY2F0aW9uIGZvciBjb2xvcnNjaGVtZSBmaWxlcworIyMjIFNZTlNVQkxPQwlsb2NhdGlvbiBmb3Igc3ludGF4IGZpbGVzCisjIyMgSU5EU1VCTE9DCWxvY2F0aW9uIGZvciBpbmRlbnQgZmlsZXMKKyMjIyBQTFVHU1VCTE9DCWxvY2F0aW9uIGZvciBzdGFuZGFyZCBwbHVnaW4gZmlsZXMKKyMjIyBGVFBMVUdTVUJMT0MgIGxvY2F0aW9uIGZvciBmdHBsdWdpbiBmaWxlcworIyMjIExBTkdTVUJMT0MJbG9jYXRpb24gZm9yIGxhbmd1YWdlIGZpbGVzCisjIyMgQ09NUFNVQkxPQwlsb2NhdGlvbiBmb3IgY29tcGlsZXIgZmlsZXMKKyMjIyBLTUFQU1VCTE9DCWxvY2F0aW9uIGZvciBrZXltYXAgZmlsZXMKKyMjIyBNQUNST1NVQkxPQwlsb2NhdGlvbiBmb3IgbWFjcm8gZmlsZXMKKyMjIyBUT09MU1NVQkxPQwlsb2NhdGlvbiBmb3IgdG9vbHMgZmlsZXMKKyMjIyBUVVRPUlNVQkxPQwlsb2NhdGlvbiBmb3IgdHV0b3IgZmlsZXMKKyMjIyBQUklOVFNVQkxPQwlsb2NhdGlvbiBmb3IgcHJpbnQgZmlsZXMKKyMjIyBTQ1JJUFRMT0MJbG9jYXRpb24gZm9yIHNjcmlwdCBmaWxlcyAobWVudS52aW0sIGJ1Z3JlcG9ydC52aW0sIC4uKQorIyMjIFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGVtIHNvbWV3aGVyZSBlbHNlLgorIyMjIEVkaXQgZmVhdHVyZS5oIGZvciBjb21waWxlLXRpbWUgc2V0dGluZ3MuCitWSU1MT0MJCT0gJERBVEFESVIkVklNRElSCitWSU1SVExPQwk9ICREQVRBRElSJFZJTURJUiRWSU1SVERJUgorVklNUkNMT0MJPSAkVklNTE9DCitIRUxQU1VCTE9DCT0gJFZJTVJUTE9DJEhFTFBTVUJESVIKK0NPTFNVQkxPQwk9ICRWSU1SVExPQyRDT0xTVUJESVIKK1NZTlNVQkxPQwk9ICRWSU1SVExPQyRTWU5TVUJESVIKK0lORFNVQkxPQwk9ICRWSU1SVExPQyRJTkRTVUJESVIKK1BMVUdTVUJMT0MJPSAkVklNUlRMT0MkUExVR1NVQkRJUgorRlRQTFVHU1VCTE9DCT0gJFZJTVJUTE9DJEZUUExVR1NVQkRJUgorTEFOR1NVQkxPQwk9ICRWSU1SVExPQyRMQU5HU1VCRElSCitDT01QU1VCTE9DCT0gJFZJTVJUTE9DJENPTVBTVUJESVIKK0tNQVBTVUJMT0MJPSAkVklNUlRMT0MkS01BUFNVQkRJUgorTUFDUk9TVUJMT0MJPSAkVklNUlRMT0MkTUFDUk9TVUJESVIKK1RPT0xTU1VCTE9DCT0gJFZJTVJUTE9DJFRPT0xTU1VCRElSCitUVVRPUlNVQkxPQwk9ICRWSU1SVExPQyRUVVRPUlNVQkRJUgorUFJJTlRTVUJMT0MJPSAkVklNUlRMT0MkUFJJTlRTVUJESVIKK1NDUklQVExPQwk9ICRWSU1SVExPQworCisjIyMgT25seSBzZXQgVklNUlVOVElNRURJUiB3aGVuIFZJTVJUTE9DIGlzIHNldCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBhbmQKKyMjIyB0aGUgcnVudGltZSBkaXJlY3RvcnkgaXMgbm90IGJlbG93IGl0LgorI1ZJTVJVTlRJTUVESVIgPSAkVklNUlRMT0MKKworIyMjIE5hbWUgb2YgdGhlIGV2aW0gZmlsZSB0YXJnZXQuCitFVklNX0ZJTEUJPSAkREVTVERJUiRTQ1JJUFRMT0MvZXZpbS52aW0KK01TV0lOX0ZJTEUJPSAkREVTVERJUiRTQ1JJUFRMT0MvbXN3aW4udmltCisKKyMjIyBOYW1lIG9mIHRoZSBtZW51IGZpbGUgdGFyZ2V0LgorU1lTX01FTlVfRklMRQk9ICRERVNURElSJFNDUklQVExPQy9tZW51LnZpbQorU1lTX1NZTk1FTlVfRklMRSA9ICRERVNURElSJFNDUklQVExPQy9zeW5tZW51LnZpbQorU1lTX0RFTE1FTlVfRklMRSA9ICRERVNURElSJFNDUklQVExPQy9kZWxtZW51LnZpbQorCisjIyMgTmFtZSBvZiB0aGUgYnVncmVwb3J0IGZpbGUgdGFyZ2V0LgorU1lTX0JVR1JfRklMRQk9ICRERVNURElSJFNDUklQVExPQy9idWdyZXBvcnQudmltCisKKyMjIyBOYW1lIG9mIHRoZSBmaWxlIHR5cGUgZGV0ZWN0aW9uIGZpbGUgdGFyZ2V0LgorU1lTX0ZJTEVUWVBFX0ZJTEUgPSAkREVTVERJUiRTQ1JJUFRMT0MvZmlsZXR5cGUudmltCisKKyMjIyBOYW1lIG9mIHRoZSBmaWxlIHR5cGUgZGV0ZWN0aW9uIGZpbGUgdGFyZ2V0LgorU1lTX0ZUT0ZGX0ZJTEUJPSAkREVTVERJUiRTQ1JJUFRMT0MvZnRvZmYudmltCisKKyMjIyBOYW1lIG9mIHRoZSBmaWxlIHR5cGUgZGV0ZWN0aW9uIHNjcmlwdCBmaWxlIHRhcmdldC4KK1NZU19TQ1JJUFRTX0ZJTEUgPSAkREVTVERJUiRTQ1JJUFRMT0Mvc2NyaXB0cy52aW0KKworIyMjIE5hbWUgb2YgdGhlIGZ0cGx1Z2luLW9uIGZpbGUgdGFyZ2V0LgorU1lTX0ZUUExVR0lOX0ZJTEUgPSAkREVTVERJUiRTQ1JJUFRMT0MvZnRwbHVnaW4udmltCisKKyMjIyBOYW1lIG9mIHRoZSBmdHBsdWdpbi1vZmYgZmlsZSB0YXJnZXQuCitTWVNfRlRQTFVHT0ZfRklMRSA9ICRERVNURElSJFNDUklQVExPQy9mdHBsdWdvZi52aW0KKworIyMjIE5hbWUgb2YgdGhlIGluZGVudC1vbiBmaWxlIHRhcmdldC4KK1NZU19JTkRFTlRfRklMRSA9ICRERVNURElSJFNDUklQVExPQy9pbmRlbnQudmltCisKKyMjIyBOYW1lIG9mIHRoZSBpbmRlbnQtb2ZmIGZpbGUgdGFyZ2V0LgorU1lTX0lORE9GRl9GSUxFID0gJERFU1RESVIkU0NSSVBUTE9DL2luZG9mZi52aW0KKworIyMjIE5hbWUgb2YgdGhlIG9wdGlvbiB3aW5kb3cgc2NyaXB0IGZpbGUgdGFyZ2V0LgorU1lTX09QVFdJTl9GSUxFID0gJERFU1RESVIkU0NSSVBUTE9DL29wdHdpbi52aW0KKworIyMjIFBlcm1pc3Npb25zIGZvciBiaW5hcmllcworQklOTU9EID0gNzU1CisKKyMjIyBQZXJtaXNzaW9ucyBmb3IgbWFuIHBhZ2UKK01BTk1PRCA9IDY0NAorCisjIyMgUGVybWlzc2lvbnMgZm9yIGhlbHAgZmlsZXMKK0hFTFBNT0QgPSA2NDQKKworIyMjIFBlcm1pc3Npb25zIGZvciBQZXJsIGFuZCBzaGVsbCBzY3JpcHRzCitTQ1JJUFRNT0QgPSA3NTUKKworIyMjIFBlcm1pc3Npb24gZm9yIFZpbSBzY3JpcHQgZmlsZXMgKG1lbnUudmltLCBidWdyZXBvcnQudmltLCAuLikKK1ZJTVNDUklQVE1PRCA9IDY0NAorCisjIyMgUGVybWlzc2lvbnMgZm9yIGFsbCBkaXJlY3RvcmllcyB0aGF0IGFyZSBjcmVhdGVkCitESVJNT0QgPSA3NTUKKworIyMjIFBlcm1pc3Npb25zIGZvciBhbGwgb3RoZXIgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZAorRklMRU1PRCA9IDY0NAorCisjIFdoZXJlIHRvIGNvcHkgdGhlIG1hbiBhbmQgaGVscCBmaWxlcyBmcm9tCitIRUxQU09VUkNFID0gLi4vcnVudGltZS9kb2MKKworIyBXaGVyZSB0byBjb3B5IHRoZSBzY3JpcHQgZmlsZXMgZnJvbSAobWVudSwgYnVncmVwb3J0KQorU0NSSVBUU09VUkNFID0gLi4vcnVudGltZQorCisjIFdoZXJlIHRvIGNvcHkgdGhlIGNvbG9yc2NoZW1lIGZpbGVzIGZyb20KK0NPTFNPVVJDRSA9IC4uL3J1bnRpbWUvY29sb3JzCisKKyMgV2hlcmUgdG8gY29weSB0aGUgc3ludGF4IGZpbGVzIGZyb20KK1NZTlNPVVJDRSA9IC4uL3J1bnRpbWUvc3ludGF4CisKKyMgV2hlcmUgdG8gY29weSB0aGUgaW5kZW50IGZpbGVzIGZyb20KK0lORFNPVVJDRSA9IC4uL3J1bnRpbWUvaW5kZW50CisKKyMgV2hlcmUgdG8gY29weSB0aGUgc3RhbmRhcmQgcGx1Z2luIGZpbGVzIGZyb20KK1BMVUdTT1VSQ0UgPSAuLi9ydW50aW1lL3BsdWdpbgorCisjIFdoZXJlIHRvIGNvcHkgdGhlIGZ0cGx1Z2luIGZpbGVzIGZyb20KK0ZUUExVR1NPVVJDRSA9IC4uL3J1bnRpbWUvZnRwbHVnaW4KKworIyBXaGVyZSB0byBjb3B5IHRoZSBtYWNybyBmaWxlcyBmcm9tCitNQUNST1NPVVJDRSA9IC4uL3J1bnRpbWUvbWFjcm9zCisKKyMgV2hlcmUgdG8gY29weSB0aGUgdG9vbHMgZmlsZXMgZnJvbQorVE9PTFNTT1VSQ0UgPSAuLi9ydW50aW1lL3Rvb2xzCisKKyMgV2hlcmUgdG8gY29weSB0aGUgdHV0b3IgZmlsZXMgZnJvbQorVFVUT1JTT1VSQ0UgPSAuLi9ydW50aW1lL3R1dG9yCisKKyMgV2hlcmUgdG8gbG9vayBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMKK0xBTkdTT1VSQ0UgPSAuLi9ydW50aW1lL2xhbmcKKworIyBXaGVyZSB0byBsb29rIGZvciBjb21waWxlciBmaWxlcworQ09NUFNPVVJDRSA9IC4uL3J1bnRpbWUvY29tcGlsZXIKKworIyBXaGVyZSB0byBsb29rIGZvciBrZXltYXAgZmlsZXMKK0tNQVBTT1VSQ0UgPSAuLi9ydW50aW1lL2tleW1hcAorCisjIFdoZXJlIHRvIGxvb2sgZm9yIHByaW50IHJlc291cmNlIGZpbGVzCitQUklOVFNPVVJDRSA9IC4uL3J1bnRpbWUvcHJpbnQKKworIyBhYmJyZXZpYXRpb25zCitERVNUX0JJTiA9ICRERVNURElSJEJJTkRJUgorREVTVF9WSU0gPSAkREVTVERJUiRWSU1MT0MKK0RFU1RfUlQgPSAkREVTVERJUiRWSU1SVExPQworREVTVF9IRUxQID0gJERFU1RESVIkSEVMUFNVQkxPQworREVTVF9DT0wgPSAkREVTVERJUiRDT0xTVUJMT0MKK0RFU1RfU1lOID0gJERFU1RESVIkU1lOU1VCTE9DCitERVNUX0lORCA9ICRERVNURElSJElORFNVQkxPQworREVTVF9QTFVHID0gJERFU1RESVIkUExVR1NVQkxPQworREVTVF9GVFAgPSAkREVTVERJUiRGVFBMVUdTVUJMT0MKK0RFU1RfTEFORyA9ICRERVNURElSJExBTkdTVUJMT0MKK0RFU1RfQ09NUCA9ICRERVNURElSJENPTVBTVUJMT0MKK0RFU1RfS01BUCA9ICRERVNURElSJEtNQVBTVUJMT0MKK0RFU1RfTUFDUk8gPSAkREVTVERJUiRNQUNST1NVQkxPQworREVTVF9UT09MUyA9ICRERVNURElSJFRPT0xTU1VCTE9DCitERVNUX1RVVE9SID0gJERFU1RESVIkVFVUT1JTVUJMT0MKK0RFU1RfU0NSSVBUID0gJERFU1RESVIkU0NSSVBUTE9DCitERVNUX1BSSU5UID0gJERFU1RESVIkUFJJTlRTVUJMT0MKK0RFU1RfTUFOID0gJERFU1RESVIkTUFOU1VCRElSCisKKyMgVGhlc2UgYXJlIGRpcmVjdG9yaWVzLCBjcmVhdGUgdGhlbSB3aGVuIG5lZWRlZC4KKzphdHRyIHtkaXJlY3RvcnkgPSAkRElSTU9EfSAkREVTVF9CSU4gJERFU1RfVklNICRERVNUX1JUICRERVNUX0hFTFAgJERFU1RfQ09MCisJCSRERVNUX1NZTiAkREVTVF9JTkQgJERFU1RfUExVRyAkREVTVF9GVFAgJERFU1RfTEFORworCQkkREVTVF9DT01QICRERVNUX0tNQVAgJERFU1RfTUFDUk8gJERFU1RfVE9PTFMgJERFU1RfVFVUT1IKKwkJJERFU1RfU0NSSVBUICRERVNUX1BSSU5UICRERVNUX01BTgorCisjCisjIEkgTiBTIFQgQSBMIEwKKyMKK2luc3RhbGw6CisgICAgQGlmIG5vdCBvcy5wYXRoLmlzZGlyKF9uby5ERVNUX0JJTik6CisgICAgICAgIEB0cnk6CisgICAgICAgICAgICA6bWtkaXIgJERFU1RfQklOCisgICAgICAgIEBleGNlcHQ6CisgICAgICAgIEAgICBwYXNzCisgICAgQGlmIG9zLmFjY2Vzcyhfbm8uREVTVF9CSU4sIG9zLldfT0spOgorICAgICAgICAjIEJpbiBkaXJlY3RvcnkgaXMgd3JpdGFibGUsIGluc3RhbGwgZGlyZWN0bHkuCisgICAgICAgIDp1cGRhdGUgaW5zdGFsbHZpbSBpbnN0YWxsdG9vbHMgaW5zdGFsbC1sYW5ndWFnZXMgaW5zdGFsbC1pY29ucworICAgIEBlbHNlOgorICAgICAgICAjIEJpbiBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLCBuZWVkIHRvIGJlY29tZSByb290LgorCTpwcmludCBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5ICIkREVTVF9CSU4iIGlzIG5vdCB3cml0YWJsZS4KKwk6cHJpbnQgSWYgdGhpcyBpcyB0aGUgd3JvbmcgZGlyZWN0b3J5LCB1c2UgUFJFRklYIHRvIHNwZWNpZnkgYW5vdGhlciBvbmUuCisgICAgICAgIDpwcmludCBPdGhlcndpc2UsIHR5cGUgdGhlIHJvb3QgcGFzc3dvcmQgdG8gY29udGludWUgaW5zdGFsbGluZy4KKyAgICAgICAgOmFzcm9vdCAkQUFQIGluc3RhbGwKKworaW5zdGFsbHZpbSB7dmlydHVhbH06IGluc3RhbGx2aW1iaW4gaW5zdGFsbHJ1bnRpbWUgaW5zdGFsbGxpbmtzIFwKKwkJCWluc3RhbGxoZWxwbGlua3MgaW5zdGFsbG1hY3JvcyBpbnN0YWxsdHV0b3IKKworaW5zdGFsbHZpbWJpbiB7dmlydHVhbH17Zm9yY2V9OiAkVGFyZ2V0ICRERVNUX0JJTgorCWV4ZSA9ICRERVNUX0JJTi8kVklNVEFSR0VUCisJQGlmIG9zLnBhdGguZXhpc3RzKGV4ZSk6CisJICAgICMgTW92ZSB0aGUgb2xkIGV4ZWN1dGFibGUgYXNpZGUgYW5kIGRlbGV0ZSBpdC4gIEFueSBvdGhlciBtZXRob2QKKwkgICAgIyBtYXkgY2F1c2UgYSBjcmFzaCBpZiB0aGUgZXhlY3V0YWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZC4KKwkgICAgOm1vdmUge2ZvcmNlfSAkZXhlICQoZXhlKS5ybQorCSAgICA6ZGVsIHtmb3JjZX0gJChleGUpLnJtCisJOmNvcHkgJFZJTVRBUkdFVCAkREVTVF9CSU4KKwk6ZG8gc3RyaXAgJGV4ZQorCTpjaG1vZCAkQklOTU9EICRERVNUX0JJTi8kVklNVEFSR0VUCisjIG1heSBjcmVhdGUgYSBsaW5rIHRvIHRoZSBuZXcgZXhlY3V0YWJsZSBmcm9tIC91c3IvYmluL3ZpCisJQGlmIF9uby5nZXQoIkxJTktJVCIpOgorCSAgICA6c3lzICRMSU5LSVQKKworIyBpbnN0YWxsIHRoZSBoZWxwIGZpbGVzOyBmaXJzdCBhZGp1c3QgdGhlIGNvbnRlbnRzIGZvciB0aGUgbG9jYXRpb24KK2luc3RhbGxydW50aW1lIHt2aXJ0dWFsfXtmb3JjZX06ICRIRUxQU09VUkNFL3ZpbS4xICRERVNUX01BTiAkREVTVF9WSU0KKwkJJERFU1RfUlQgJERFU1RfSEVMUCAkREVTVF9DT0wgJERFU1RfU1lOICRERVNUX0lORAorCQkkREVTVF9GVFAgJERFU1RfUExVRyAkREVTVF9UVVRPUiAkREVTVF9DT01QICRERVNUX1BSSU5UCisJOnByaW50IGdlbmVyYXRpbmcgJERFU1RfTUFOLyQoVklNTkFNRSkuMQorCTpjYXQgJEhFTFBTT1VSQ0UvdmltLjEgfAorCQk6ZXZhbCByZS5zdWIoIi91c3IvbG9jYWwvbGliL3ZpbSIsIF9uby5WSU1MT0MsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi9kb2MiLCBfbm8uSEVMUFNVQkxPQywgc3RkaW4pIHwKKwkJOmV2YWwgcmUuc3ViKF9uby5WSU1MT0MgKyAiL3N5bnRheCIsIF9uby5TWU5TVUJMT0MsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi90dXRvciIsIF9uby5UVVRPUlNVQkxPQywgc3RkaW4pIHwKKwkJOmV2YWwgcmUuc3ViKF9uby5WSU1MT0MgKyAiL3ZpbXJjIiwKKwkJCQkJICAgICAgIF9uby5WSU1SQ0xPQyArICIvdmltcmMiLCBzdGRpbikgfAorCQk6ZXZhbCByZS5zdWIoX25vLlZJTUxPQyArICIvZ3ZpbXJjIiwKKwkJCQkJICAgICAgX25vLlZJTVJDTE9DICsgIi9ndmltcmMiLCBzdGRpbikgfAorCQk6ZXZhbCByZS5zdWIoX25vLlZJTUxPQyArICIvbWVudS52aW0iLAorCQkJCQkgICBfbm8uU0NSSVBUTE9DICsgIi9tZW51LnZpbSIsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi9idWdyZXBvcnQudmltIiwKKwkJCQkgICAgICBfbm8uU0NSSVBUTE9DICsgIi9idWdyZXBvcnQudmltIiwgc3RkaW4pIHwKKwkJOmV2YWwgcmUuc3ViKF9uby5WSU1MT0MgKyAiL2ZpbGV0eXBlLnZpbSIsCisJCQkJICAgICAgIF9uby5TQ1JJUFRMT0MgKyAiL2ZpbGV0eXBlLnZpbSIsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi9mdG9mZi52aW0iLAorCQkJCQkgIF9uby5TQ1JJUFRMT0MgKyAiL2Z0b2ZmLnZpbSIsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi9zY3JpcHRzLnZpbSIsCisJCQkJCV9uby5TQ1JJUFRMT0MgKyAiL3NjcmlwdHMudmltIiwgc3RkaW4pIHwKKwkJOmV2YWwgcmUuc3ViKF9uby5WSU1MT0MgKyAiL29wdHdpbi52aW0iLAorCQkJCQkgX25vLlNDUklQVExPQyArICIvb3B0d2luLnZpbSIsIHN0ZGluKSB8CisJCTpldmFsIHJlLnN1Yihfbm8uVklNTE9DICsgIi9cXCoucHMiLAorCQkJCQkJIF9uby5TQ1JJUFRMT0MgKyAiLyoucHMiLCBzdGRpbikKKwkJPiEgJERFU1RfTUFOLyQoVklNTkFNRSkuMQorCTpjaG1vZCAkTUFOTU9EICRERVNUX01BTi8kKFZJTU5BTUUpLjEKKworCTpwcmludCBnZW5lcmF0aW5nICRERVNUX01BTi8kKFZJTU5BTUUpdHV0b3IuMQorCTpjYXQgJEhFTFBTT1VSQ0UvdmltdHV0b3IuMSB8CisJCTpldmFsIHJlLnN1YigiL3Vzci9sb2NhbC9saWIvdmltIiwgX25vLlZJTUxPQywgc3RkaW4pIHwKKwkJOmV2YWwgcmUuc3ViKF9uby5WSU1MT0MgKyAiL3R1dG9yIiwgX25vLlRVVE9SU1VCTE9DLCBzdGRpbikKKwkJPiEgJERFU1RfTUFOLyQoVklNTkFNRSl0dXRvci4xCisJOmNobW9kICRNQU5NT0QgJERFU1RfTUFOLyQoVklNTkFNRSl0dXRvci4xCisKKwk6Y29weSAkSEVMUFNPVVJDRS92aW1kaWZmLjEgJERFU1RfTUFOLyQoVklNRElGRk5BTUUpLjEKKwk6Y2htb2QgJE1BTk1PRCAkREVTVF9NQU4vJChWSU1ESUZGTkFNRSkuMQorCisJOnByaW50IGdlbmVyYXRpbmcgJERFU1RfTUFOLyQoRVZJTU5BTUUpLjEKKwk6Y2F0ICRIRUxQU09VUkNFL2V2aW0uMSB8CisJCTpldmFsIHJlLnN1YigiL3Vzci9sb2NhbC9saWIvdmltIiwgX25vLlNDUklQVExPQywgc3RkaW4pCisJCT4hICRERVNUX01BTi8kKEVWSU1OQU1FKS4xCisJOmNobW9kICRNQU5NT0QgJERFU1RfTUFOLyQoRVZJTU5BTUUpLjEKKworICAgICAgICA6Y2QgJEhFTFBTT1VSQ0UKKyAgICAgICAgQHRyeToKKyAgICAgICAgICAgIFhUUkEgPSBgZ2xvYi5nbG9iKCIqLj8/eCIpYCBgZ2xvYi5nbG9iKCJ0YWdzLT8/IilgCisgICAgICAgIEBleGNlcHQ6CisgICAgICAgICAgICBYVFJBID0gICAgICAgIyBJdCdzIE9LIGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgorCTpjb3B5ICoudHh0IHRhZ3MgJFhUUkEgJERFU1RfSEVMUAorICAgICAgICA6Y2QgLQorICAgICAgICA6Y2QgJERFU1RfSEVMUAorCTpjaG1vZCAkSEVMUE1PRCAqLnR4dCB0YWdzICRYVFJBCisgICAgICAgIDpjZCAtCisJOmNvcHkgICRIRUxQU09VUkNFLyoucGwgJERFU1RfSEVMUAorCTpjaG1vZCAkU0NSSVBUTU9EICRERVNUX0hFTFAvKi5wbAorIyBpbnN0YWxsIHRoZSBtZW51IGZpbGVzCisJOmNvcHkgJFNDUklQVFNPVVJDRS9tZW51LnZpbSAkU1lTX01FTlVfRklMRQorCTpjaG1vZCAkVklNU0NSSVBUTU9EICRTWVNfTUVOVV9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9zeW5tZW51LnZpbSAkU1lTX1NZTk1FTlVfRklMRQorCTpjaG1vZCAkVklNU0NSSVBUTU9EICRTWVNfU1lOTUVOVV9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9kZWxtZW51LnZpbSAkU1lTX0RFTE1FTlVfRklMRQorCTpjaG1vZCAkVklNU0NSSVBUTU9EICRTWVNfREVMTUVOVV9GSUxFCisjIGluc3RhbGwgdGhlIGV2aW0gZmlsZQorCTpjb3B5ICRTQ1JJUFRTT1VSQ0UvbXN3aW4udmltICRNU1dJTl9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJE1TV0lOX0ZJTEUKKwk6Y29weSAkU0NSSVBUU09VUkNFL2V2aW0udmltICRFVklNX0ZJTEUKKwk6Y2htb2QgJFZJTVNDUklQVE1PRCAkRVZJTV9GSUxFCisjIGluc3RhbGwgdGhlIGJ1Z3JlcG9ydCBmaWxlCisJOmNvcHkgJFNDUklQVFNPVVJDRS9idWdyZXBvcnQudmltICRTWVNfQlVHUl9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJFNZU19CVUdSX0ZJTEUKKyMgaW5zdGFsbCB0aGUgZXhhbXBsZSB2aW1yYyBmaWxlcworCTpjb3B5ICRTQ1JJUFRTT1VSQ0UvdmltcmNfZXhhbXBsZS52aW0gJERFU1RfU0NSSVBUCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJERFU1RfU0NSSVBUL3ZpbXJjX2V4YW1wbGUudmltCisJOmNvcHkgJFNDUklQVFNPVVJDRS9ndmltcmNfZXhhbXBsZS52aW0gJERFU1RfU0NSSVBUCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJERFU1RfU0NSSVBUL2d2aW1yY19leGFtcGxlLnZpbQorIyBpbnN0YWxsIHRoZSBmaWxlIHR5cGUgZGV0ZWN0aW9uIGZpbGVzCisJOmNvcHkgJFNDUklQVFNPVVJDRS9maWxldHlwZS52aW0gJFNZU19GSUxFVFlQRV9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJFNZU19GSUxFVFlQRV9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9mdG9mZi52aW0gJFNZU19GVE9GRl9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJFNZU19GVE9GRl9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9zY3JpcHRzLnZpbSAkU1lTX1NDUklQVFNfRklMRQorCTpjaG1vZCAkVklNU0NSSVBUTU9EICRTWVNfU0NSSVBUU19GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9mdHBsdWdpbi52aW0gJFNZU19GVFBMVUdJTl9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJFNZU19GVFBMVUdJTl9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9mdHBsdWdvZi52aW0gJFNZU19GVFBMVUdPRl9GSUxFCisJOmNobW9kICRWSU1TQ1JJUFRNT0QgJFNZU19GVFBMVUdPRl9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9pbmRlbnQudmltICRTWVNfSU5ERU5UX0ZJTEUKKwk6Y2htb2QgJFZJTVNDUklQVE1PRCAkU1lTX0lOREVOVF9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9pbmRvZmYudmltICRTWVNfSU5ET0ZGX0ZJTEUKKwk6Y2htb2QgJFZJTVNDUklQVE1PRCAkU1lTX0lORE9GRl9GSUxFCisJOmNvcHkgJFNDUklQVFNPVVJDRS9vcHR3aW4udmltICRTWVNfT1BUV0lOX0ZJTEUKKwk6Y2htb2QgJFZJTVNDUklQVE1PRCAkU1lTX09QVFdJTl9GSUxFCisjIGluc3RhbGwgdGhlIHByaW50IHJlc291cmNlIGZpbGVzCisJOmNvcHkgJFBSSU5UU09VUkNFLyoucHMgJERFU1RfUFJJTlQKKwk6Y2htb2QgJEZJTEVNT0QgJERFU1RfUFJJTlQvKi5wcworIyBpbnN0YWxsIHRoZSBjb2xvcnNjaGVtZSBmaWxlcworCTpjb3B5ICRDT0xTT1VSQ0UvKi52aW0gJENPTFNPVVJDRS9SRUFETUUudHh0ICRERVNUX0NPTAorCTpjaG1vZCAkSEVMUE1PRCAkREVTVF9DT0wvKi52aW0gJERFU1RfQ09ML1JFQURNRS50eHQKKyMgaW5zdGFsbCB0aGUgc3ludGF4IGZpbGVzCisJOmNvcHkgJFNZTlNPVVJDRS8qLnZpbSAkU1lOU09VUkNFL1JFQURNRS50eHQgJERFU1RfU1lOCisJOmNobW9kICRIRUxQTU9EICRERVNUX1NZTi8qLnZpbSAkREVTVF9TWU4vUkVBRE1FLnR4dAorIyBpbnN0YWxsIHRoZSBpbmRlbnQgZmlsZXMKKwk6Y29weSAkSU5EU09VUkNFLyoudmltICRJTkRTT1VSQ0UvUkVBRE1FLnR4dCAkREVTVF9JTkQKKwk6Y2htb2QgJEhFTFBNT0QgJERFU1RfSU5ELyoudmltCisjIGluc3RhbGwgdGhlIHN0YW5kYXJkIHBsdWdpbiBmaWxlcworCTpjb3B5ICRQTFVHU09VUkNFLyoudmltICRQTFVHU09VUkNFL1JFQURNRS50eHQgJERFU1RfUExVRworCTpjaG1vZCAkSEVMUE1PRCAkREVTVF9QTFVHLyoudmltICRERVNUX1BMVUcvUkVBRE1FLnR4dAorIyBpbnN0YWxsIHRoZSBmdHBsdWdpbiBmaWxlcworCTpjb3B5ICRGVFBMVUdTT1VSQ0UvKi52aW0gJEZUUExVR1NPVVJDRS9SRUFETUUudHh0ICRERVNUX0ZUUAorCTpjaG1vZCAkSEVMUE1PRCAkREVTVF9GVFAvKi52aW0gJERFU1RfRlRQL1JFQURNRS50eHQKKyMgaW5zdGFsbCB0aGUgY29tcGlsZXIgZmlsZXMKKwk6Y29weSAkQ09NUFNPVVJDRS8qLnZpbSAkQ09NUFNPVVJDRS9SRUFETUUudHh0ICRERVNUX0NPTVAKKwk6Y2htb2QgJEhFTFBNT0QgJERFU1RfQ09NUC8qLnZpbSAkREVTVF9DT01QL1JFQURNRS50eHQKKworaW5zdGFsbG1hY3JvcyB7dmlydHVhbH17Zm9yY2V9OiAkTUFDUk9TT1VSQ0UgJERFU1RfVklNICRERVNUX1JUICRERVNUX01BQ1JPCisJOmNvcHkge3JlY3Vyc2l2ZX17Zm9yY2V9ICRNQUNST1NPVVJDRS8qICRERVNUX01BQ1JPCisJIyBEZWxldGUgYW55IENWUyBhbmQgQUFQRElSIGRpcmVjdG9yaWVzLgorCSMgVXNlIHRoZSAiOnRyZWUiIGNvbW1hbmQgaWYgcG9zc2libGUuICBJdCB3YXMgYWRkZWQgbGF0ZXIsIGZhbGwgYmFjaworCSMgdG8gdXNpbmcgImZpbmQiIHdoZW4gaXQgZG9lc24ndCB3b3JrLgorCUB0cnk6CisJICAgOnRyZWUgJERFU1RfTUFDUk8ge2Rpcm5hbWUgPSBDVlN9CisJICAgICAgOmRlbCB7cmVjdXJzaXZlfSAkbmFtZQorCSAgIDp0cmVlICRERVNUX01BQ1JPIHtkaXJuYW1lID0gQUFQRElSfQorCSAgICAgIDpkZWwge3JlY3Vyc2l2ZX0gJG5hbWUKKwkgICA6dHJlZSAkREVTVF9NQUNSTyB7ZGlybmFtZSA9IC4qfQorCSAgICAgIDpjaG1vZCAkRElSTU9EICRuYW1lCisJICAgOnRyZWUgJERFU1RfTUFDUk8ge2ZpbGVuYW1lID0gLip9CisJICAgICAgOmNobW9kICRGSUxFTU9EICRuYW1lCisJQGV4Y2VwdDoKKwlAICBvaywgY3ZzZGlycyA9IHJlZGlyX3N5c3RlbSgnZmluZCAlcyAtbmFtZSBDVlMgLXByaW50JyAlIF9uby5ERVNUX01BQ1JPKQorCUAgIGlmIG9rIGFuZCBjdnNkaXJzOgorCSAgICAgOmRlbCB7cmVjdXJzaXZlfSAkY3ZzZGlycworCSAgIDpzeXMgY2htb2QgJERJUk1PRCBgYGZpbmQgJERFU1RfTUFDUk8gLXR5cGUgZCAtcHJpbnRgYAorCSAgIDpzeXMgY2htb2QgJEZJTEVNT0QgYGBmaW5kICRERVNUX01BQ1JPIC10eXBlIGYgLXByaW50YGAKKwk6Y2htb2QgJFNDUklQVE1PRCAkREVTVF9NQUNSTy9sZXNzLnNoCisKKyMgaW5zdGFsbCB0aGUgdHV0b3IgZmlsZXMKK2luc3RhbGx0dXRvciB7dmlydHVhbH17Zm9yY2V9OiAkVFVUT1JTT1VSQ0UgJERFU1RfVklNICRERVNUX1JUICRERVNUX1RVVE9SCisJOmNvcHkgdmltdHV0b3IgJERFU1RfQklOLyQoVklNTkFNRSl0dXRvcgorCTpjaG1vZCAkU0NSSVBUTU9EICRERVNUX0JJTi8kKFZJTU5BTUUpdHV0b3IKKwk6Y29weSAkVFVUT1JTT1VSQ0UvdHV0b3IqICRUVVRPUlNPVVJDRS9SRUFETUUqICRERVNUX1RVVE9SCisJOmNobW9kICRIRUxQTU9EICRERVNUX1RVVE9SLyoKKworIyBpbnN0YWxsIGhlbHBlciBwcm9ncmFtIHh4ZAoraW5zdGFsbHRvb2xzIHt2aXJ0dWFsfXtmb3JjZX06ICRUT09MUyAkREVTVF9CSU4gJERFU1RfTUFOIFwKKwkJJFRPT0xTU09VUkNFICRERVNUX1ZJTSAkREVTVF9SVCAkREVTVF9UT09MUworCXh4ZCA9ICRERVNUX0JJTi94eGQkRVhFU1VGCisJQGlmIG9zLnBhdGguZXhpc3RzKHh4ZCk6CisJICA6bW92ZSB7Zm9yY2V9ICR4eGQgJCh4eGQpLnJtCisJICA6ZGVsICQoeHhkKS5ybQorCTpjb3B5IHh4ZC94eGQkRVhFU1VGICRERVNUX0JJTgorCTpkbyBzdHJpcCAkREVTVF9CSU4veHhkJEVYRVNVRgorCTpjaG1vZCAkQklOTU9EICRERVNUX0JJTi94eGQkRVhFU1VGCisJOmNvcHkgJEhFTFBTT1VSQ0UveHhkLjEgJERFU1RfTUFOCisJOmNobW9kICRNQU5NT0QgJERFU1RfTUFOL3h4ZC4xCisjIGluc3RhbGwgdGhlIHJ1bnRpbWUgdG9vbHMKKwlAdHJ5OgorCUAgIGlmIGFhcF9oYXMoIjp0cmVlIik6CisJICAgICAgIyBOZXcgbWV0aG9kOiBjb3B5IGV2ZXJ5dGhpbmcgYW5kIGRlbGV0ZSBDVlMgYW5kIEFBUERJUiBkaXJzCisJICAgICAgOmNvcHkge3JlY3Vyc2l2ZX0gJFRPT0xTU09VUkNFLyogJERFU1RfVE9PTFMKKwkgICAgICA6dHJlZSAkREVTVF9UT09MUyB7ZGlybmFtZSA9IENWU30KKwkJIDpkZWxldGUge3JlY3Vyc2l2ZX0gJG5hbWUKKwkgICAgICA6dHJlZSAkREVTVF9UT09MUyB7ZGlybmFtZSA9IEFBUERJUn0KKwkJIDpkZWxldGUge3JlY3Vyc2l2ZX0gJG5hbWUKKwlAZXhjZXB0OgorCSAgICAjIE9sZCBtZXRob2Q6IGNvcHkgb25seSBzcGVjaWZpYyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJICAgIDpjb3B5IHtyZWN1cnNpdmV9ICRUT09MU1NPVVJDRS9SRUFETUUudHh0ICRUT09MU1NPVVJDRS9bYS16XSogJERFU1RfVE9PTFMKKwk6Y2htb2QgJEZJTEVNT0QgJERFU1RfVE9PTFMvKgorIyByZXBsYWNlIHRoZSBwYXRoIGluIHNvbWUgdG9vbHMKKwk6cHJvZ3NlYXJjaCBwZXJscGF0aCBwZXJsCisJQGlmIHBlcmxwYXRoOgorCSAgICA6Y2F0ICRUT09MU1NPVVJDRS9lZm1fcGVybC5wbCB8CisJCSAgICA6ZXZhbCByZS5zdWIoIi91c3IvYmluL3BlcmwiLCBwZXJscGF0aCwgc3RkaW4pCisJCSAgICA+ISAkREVTVF9UT09MUy9lZm1fcGVybC5wbAorCUBlbHNlOgorCSAgICA6Y29weSAkVE9PTFNTT1VSQ0UvZWZtX3BlcmwucGwgJERFU1RfVE9PTFMKKworCTpwcm9nc2VhcmNoIGF3a3BhdGggbmF3ayBnYXdrIGF3aworCUBpZiBhd2twYXRoOgorCSAgICA6Y2F0ICRUT09MU1NPVVJDRS9tdmUuYXdrIHwKKwkJICAgIDpldmFsIHJlLnN1YigiL3Vzci9iaW4vbmF3ayIsIGF3a3BhdGgsIHN0ZGluKQorCQkgICAgPiEgJERFU1RfVE9PTFMvbXZlLmF3aworCUBlbHNlOgorCSAgICA6Y29weSAkVE9PTFNTT1VSQ0UvbXZlLmF3ayAkREVTVF9UT09MUworCisJOnN5cyBjaG1vZCAkU0NSSVBUTU9EIGBgZ3JlcCAtbCAiXiMhIiAkREVTVF9UT09MUy8qYGAKKworIyBpbnN0YWxsIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcywgaWYgdGhleSB3ZXJlIHVucGFja2VkCitpbnN0YWxsLWxhbmd1YWdlcyB7dmlydHVhbH17Zm9yY2V9OiBsYW5ndWFnZXMgJERFU1RfTEFORyAkREVTVF9LTUFQCisJQGlmIF9uby5NQUtFTU86CisJICAgOnN5cyBjZCAkUE9ESVI7ICRNQUtFIHByZWZpeD0kREVTVERJUiRwcmVmaXggXAorCQkgICAgTE9DQUxFRElSPSRERVNUX0xBTkcgSU5TVEFMTF9EQVRBPWNwIEZJTEVNT0Q9JEZJTEVNT0QgaW5zdGFsbAorCUBpZiBvcy5wYXRoLmV4aXN0cyhfbm8uTEFOR1NPVVJDRSk6CisJICAgOnByaW50IGluc3RhbGxpbmcgbGFuZ3VhZ2UgZmlsZXMKKwkgICA6Y29weSAkTEFOR1NPVVJDRS9SRUFETUUudHh0ICRMQU5HU09VUkNFLyoudmltICRERVNUX0xBTkcKKwkgICA6Y2htb2QgJEZJTEVNT0QgJERFU1RfTEFORy8qLnZpbQorCUBpZiBvcy5wYXRoLmV4aXN0cyhfbm8uS01BUFNPVVJDRSk6CisJICAgOmNvcHkgJEtNQVBTT1VSQ0UvUkVBRE1FLnR4dCAkS01BUFNPVVJDRS8qLnZpbSAkREVTVF9LTUFQCisJICAgOmNobW9kICRGSUxFTU9EICRERVNUX0tNQVAvKi52aW0KKworIyBpbnN0YWxsIHRoZSBpY29ucyBmb3IgS0RFLCBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhbmQgdGhlIGljb24gZG9lc24ndC4KK0lDT040OFBBVEggPSAkREVTVERJUiREQVRBRElSL2ljb25zL2hpY29sb3IvNDh4NDgvYXBwcworSUNPTjMyUEFUSCA9ICRERVNURElSJERBVEFESVIvaWNvbnMvbG9jb2xvci8zMngzMi9hcHBzCitJQ09OMTZQQVRIID0gJERFU1RESVIkREFUQURJUi9pY29ucy9sb2NvbG9yLzE2eDE2L2FwcHMKK0tERVBBVEggPSAkSE9NRS8ua2RlL3NoYXJlL2ljb25zCitpbnN0YWxsLWljb25zIHt2aXJ0dWFsfToKKwlncCA9ICRJQ09ONDhQQVRIL2d2aW0ucG5nCisJQGlmIG9zLnBhdGguaXNkaXIoX25vLklDT040OFBBVEgpIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoZ3ApOgorCSAgIDpjb3B5ICRTQ1JJUFRTT1VSQ0UvdmltNDh4NDgucG5nICRncAorCWdwID0gJElDT04zMlBBVEgvZ3ZpbS5wbmcKKwlAaWYgb3MucGF0aC5pc2Rpcihfbm8uSUNPTjMyUEFUSCkgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhncCk6CisJICAgOmNvcHkgJFNDUklQVFNPVVJDRS92aW0zMngzMi5wbmcgJGdwCisJZ3AgPSAkSUNPTjE2UEFUSC9ndmltLnBuZworCUBpZiBvcy5wYXRoLmlzZGlyKF9uby5JQ09OMTZQQVRIKSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGdwKToKKwkgICA6Y29weSAkU0NSSVBUU09VUkNFL3ZpbTE2eDE2LnBuZyAkZ3AKKworCiskSEVMUFNPVVJDRS92aW0uMSAkTUFDUk9TT1VSQ0UgJFRPT0xTU09VUkNFOgorCUBpZiBub3Qgb3MucGF0aC5leGlzdHMoX25vLlRPT0xTU09VUkNFKToKKwkgICAgOnByaW50IFJ1bnRpbWUgZmlsZXMgbm90IGZvdW5kLgorCSAgICA6ZXJyb3IgWW91IG5lZWQgdG8gdW5wYWNrIHRoZSBydW50aW1lIGFyY2hpdmUgYmVmb3JlIHJ1bm5pbmcgIm1ha2UgaW5zdGFsbCIuCisKKyMgY3JlYXRlIGxpbmtzIGZyb20gdmFyaW91cyBuYW1lcyB0byB2aW0uICBUaGlzIGlzIG9ubHkgZG9uZSB3aGVuIHRoZSBsaW5rcworIyAob3IgZXhlY3V0YWJsZXMgd2l0aCB0aGUgc2FtZSBuYW1lKSBkb24ndCBleGlzdCB5ZXQuCitpbnN0YWxsbGlua3Mge3ZpcnR1YWx9OiAkR1VJX1RBUkdFVFMgXAorCQkJJERFU1RfQklOLyRFWFRBUkdFVCBcCisJCQkkREVTVF9CSU4vJFZJRVdUQVJHRVQgXAorCQkJJERFU1RfQklOLyRSVklNVEFSR0VUIFwKKwkJCSRERVNUX0JJTi8kUlZJRVdUQVJHRVQgXAorCQkJJElOU1RBTExWSU1ESUZGCisKK2luc3RhbGxnbGlua3Mge3ZpcnR1YWx9OiAkREVTVF9CSU4vJEdWSU1UQVJHRVQgXAorCQkJJERFU1RfQklOLyRHVklFV1RBUkdFVCBcCisJCQkkREVTVF9CSU4vJFJHVklNVEFSR0VUIFwKKwkJCSRERVNUX0JJTi8kUkdWSUVXVEFSR0VUIFwKKwkJCSRERVNUX0JJTi8kRVZJTVRBUkdFVCBcCisJCQkkREVTVF9CSU4vJEVWSUVXVEFSR0VUIFwKKwkJCSRJTlNUQUxMR1ZJTURJRkYKKworaW5zdGFsbHZpbWRpZmYge3ZpcnR1YWx9OiAkREVTVF9CSU4vJFZJTURJRkZUQVJHRVQKK2luc3RhbGxndmltZGlmZiB7dmlydHVhbH06ICRERVNUX0JJTi8kR1ZJTURJRkZUQVJHRVQKKworIyBUaGVzZSBkZXBlbmRlbmNpZXMgdXNlIGFuIGVtcHR5IGJ1aWxkY2hlY2sgc28gdGhhdCB0aGV5IGFyZSBvbmx5IGRvbmUgd2hlbgorIyB0aGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuCiskREVTVF9CSU4vJEVYVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkRVhUQVJHRVQKKworJERFU1RfQklOLyRWSUVXVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkVklFV1RBUkdFVAorCiskREVTVF9CSU4vJEdWSU1UQVJHRVQ6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfQklOOyBsbiAtcyAkVklNVEFSR0VUICRHVklNVEFSR0VUCisKKyRERVNUX0JJTi8kR1ZJRVdUQVJHRVQ6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfQklOOyBsbiAtcyAkVklNVEFSR0VUICRHVklFV1RBUkdFVAorCiskREVTVF9CSU4vJFJWSU1UQVJHRVQ6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfQklOOyBsbiAtcyAkVklNVEFSR0VUICRSVklNVEFSR0VUCisKKyRERVNUX0JJTi8kUlZJRVdUQVJHRVQ6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfQklOOyBsbiAtcyAkVklNVEFSR0VUICRSVklFV1RBUkdFVAorCiskREVTVF9CSU4vJFJHVklNVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkUkdWSU1UQVJHRVQKKworJERFU1RfQklOLyRSR1ZJRVdUQVJHRVQ6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfQklOOyBsbiAtcyAkVklNVEFSR0VUICRSR1ZJRVdUQVJHRVQKKworJERFU1RfQklOLyRWSU1ESUZGVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkVklNRElGRlRBUkdFVAorCiskREVTVF9CSU4vJEdWSU1ESUZGVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkR1ZJTURJRkZUQVJHRVQKKworJERFU1RfQklOLyRFVklNVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkRVZJTVRBUkdFVAorCiskREVTVF9CSU4vJEVWSUVXVEFSR0VUOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX0JJTjsgbG4gLXMgJFZJTVRBUkdFVCAkRVZJRVdUQVJHRVQKKworIyBjcmVhdGUgbGlua3MgZm9yIHRoZSBtYW51YWwgcGFnZXMgd2l0aCB2YXJpb3VzIG5hbWVzIHRvIHZpbS4JVGhpcyBpcyBvbmx5CisjIGRvbmUgd2hlbiB0aGUgbGlua3MgKG9yIG1hbnBhZ2VzIHdpdGggdGhlIHNhbWUgbmFtZSkgZG9uJ3QgZXhpc3QgeWV0LgoraW5zdGFsbGhlbHBsaW5rcyB7dmlydHVhbH06ICRHVUlfTUFOX1RBUkdFVFMgXAorCQkJJERFU1RfTUFOLyQoRVhOQU1FKS4xIFwKKwkJCSRERVNUX01BTi8kKFZJRVdOQU1FKS4xIFwKKwkJCSRERVNUX01BTi8kKFJWSU1OQU1FKS4xIFwKKwkJCSRERVNUX01BTi8kKFJWSUVXTkFNRSkuMQorCitpbnN0YWxsZ2hlbHBsaW5rcyB7dmlydHVhbH06ICRERVNUX01BTi8kKEdWSU1OQU1FKS4xIFwKKwkJCSRERVNUX01BTi8kKEdWSUVXTkFNRSkuMSBcCisJCQkkREVTVF9NQU4vJChSR1ZJTU5BTUUpLjEgXAorCQkJJERFU1RfTUFOLyQoUkdWSUVXTkFNRSkuMSBcCisJCQkkREVTVF9NQU4vJChHVklNRElGRk5BTUUpLjEgXAorCQkJJERFU1RfTUFOLyQoRVZJRVdOQU1FKS4xCisKKyRERVNUX01BTi8kKEVYTkFNRSkuMToge2J1aWxkY2hlY2sgPSB9CisgICAgOnN5cyBjZCAkREVTVF9NQU47IGxuIC1zICQoVklNTkFNRSkuMSAkKEVYTkFNRSkuMQorCiskREVTVF9NQU4vJChWSUVXTkFNRSkuMToge2J1aWxkY2hlY2sgPSB9CisgICAgOnN5cyBjZCAkREVTVF9NQU47IGxuIC1zICQoVklNTkFNRSkuMSAkKFZJRVdOQU1FKS4xCisKKyRERVNUX01BTi8kKEdWSU1OQU1FKS4xOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX01BTjsgbG4gLXMgJChWSU1OQU1FKS4xICQoR1ZJTU5BTUUpLjEKKworJERFU1RfTUFOLyQoR1ZJRVdOQU1FKS4xOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX01BTjsgbG4gLXMgJChWSU1OQU1FKS4xICQoR1ZJRVdOQU1FKS4xCisKKyRERVNUX01BTi8kKFJWSU1OQU1FKS4xOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX01BTjsgbG4gLXMgJChWSU1OQU1FKS4xICQoUlZJTU5BTUUpLjEKKworJERFU1RfTUFOLyQoUlZJRVdOQU1FKS4xOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX01BTjsgbG4gLXMgJChWSU1OQU1FKS4xICQoUlZJRVdOQU1FKS4xCisKKyRERVNUX01BTi8kKFJHVklNTkFNRSkuMToge2J1aWxkY2hlY2sgPSB9CisgICAgOnN5cyBjZCAkREVTVF9NQU47IGxuIC1zICQoVklNTkFNRSkuMSAkKFJHVklNTkFNRSkuMQorCiskREVTVF9NQU4vJChSR1ZJRVdOQU1FKS4xOiB7YnVpbGRjaGVjayA9IH0KKyAgICA6c3lzIGNkICRERVNUX01BTjsgbG4gLXMgJChWSU1OQU1FKS4xICQoUkdWSUVXTkFNRSkuMQorCiskREVTVF9NQU4vJChHVklNRElGRk5BTUUpLjE6IHtidWlsZGNoZWNrID0gfQorICAgIDpzeXMgY2QgJERFU1RfTUFOOyBsbiAtcyAkKFZJTURJRkZOQU1FKS4xICQoR1ZJTURJRkZOQU1FKS4xCisKKyRERVNUX01BTi8kKEVWSUVXTkFNRSkuMToge2J1aWxkY2hlY2sgPSB9CisgICAgOnN5cyBjZCAkREVTVF9NQU47IGxuIC1zICQoRVZJTU5BTUUpLjEgJChFVklFV05BTUUpLjEKKworIworIyBVIE4gSSBOIFMgVCBBIEwgTAorIwordW5pbnN0YWxsIHt2aXJ0dWFsfXtmb3JjZX06IHVuaW5zdGFsbF9ydW50aW1lCisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX0JJTi8kVklNVEFSR0VUCisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX01BTi8kKFZJTU5BTUUpLjEgJERFU1RfTUFOLyQoVklNTkFNRSl0dXRvci4xCisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX0JJTi92aW10dXRvcgorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9CSU4veHhkJEVYRVNVRiAkREVTVF9NQU4veHhkLjEKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfQklOLyRFWFRBUkdFVCAkREVTVF9CSU4vJFZJRVdUQVJHRVQKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfQklOLyRHVklNVEFSR0VUICRERVNUX0JJTi8kR1ZJRVdUQVJHRVQKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfQklOLyRSVklNVEFSR0VUICRERVNUX0JJTi8kUlZJRVdUQVJHRVQKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfQklOLyRSR1ZJTVRBUkdFVCAkREVTVF9CSU4vJFJHVklFV1RBUkdFVAorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9CSU4vJFZJTURJRkZUQVJHRVQgJERFU1RfQklOLyRHVklNRElGRlRBUkdFVAorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9CSU4vJEVWSU1UQVJHRVQgJERFU1RfQklOLyRFVklFV1RBUkdFVAorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9NQU4vJChFWE5BTUUpLjEgJERFU1RfTUFOLyQoVklFV05BTUUpLjEKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfTUFOLyQoR1ZJTU5BTUUpLjEgJERFU1RfTUFOLyQoR1ZJRVdOQU1FKS4xCisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX01BTi8kKFJWSU1OQU1FKS4xICRERVNUX01BTi8kKFJWSUVXTkFNRSkuMQorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9NQU4vJChSR1ZJTU5BTUUpLjEgJERFU1RfTUFOLyQoUkdWSUVXTkFNRSkuMQorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9NQU4vJChWSU1ESUZGTkFNRSkuMSAkREVTVF9NQU4vJChHVklNRElGRk5BTUUpLjEKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfTUFOLyQoRVZJTU5BTUUpLjEgJERFU1RfTUFOLyQoRVZJRVdOQU1FKS4xCisKKyMgTm90ZTogImRlbGRpciIgd2lsbCBmYWlsIGlmIGFueSBmaWxlcyB3ZXJlIGFkZGVkIGFmdGVyICJtYWtlIGluc3RhbGwiLCB0aGF0CisjIGlzIGludGVudGlvbmFsbHk6IEtlZXAgZmlsZXMgdGhlIHVzZXIgYWRkZWQuCit1bmluc3RhbGxfcnVudGltZSB7dmlydHVhbH17Zm9yY2V9OgorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9IRUxQLyoudHh0ICRERVNUX0hFTFAvdGFncyAkREVTVF9IRUxQLyoucGwKKyAgICA6ZGVsIHtmb3JjZX0gJFNZU19NRU5VX0ZJTEUgJFNZU19TWU5NRU5VX0ZJTEUgJFNZU19ERUxNRU5VX0ZJTEUKKyAgICA6ZGVsIHtmb3JjZX0gJFNZU19CVUdSX0ZJTEUgJEVWSU1fRklMRSAkTVNXSU5fRklMRQorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9TQ1JJUFQvZ3ZpbXJjX2V4YW1wbGUudmltICRERVNUX1NDUklQVC92aW1yY19leGFtcGxlLnZpbQorICAgIDpkZWwge2ZvcmNlfSAkU1lTX0ZJTEVUWVBFX0ZJTEUgJFNZU19GVE9GRl9GSUxFICRTWVNfU0NSSVBUU19GSUxFCisgICAgOmRlbCB7Zm9yY2V9ICRTWVNfSU5ET0ZGX0ZJTEUgJFNZU19JTkRFTlRfRklMRQorICAgIDpkZWwge2ZvcmNlfSAkU1lTX0ZUUExVR09GX0ZJTEUgJFNZU19GVFBMVUdJTl9GSUxFCisgICAgOmRlbCB7Zm9yY2V9ICRTWVNfT1BUV0lOX0ZJTEUKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfQ09MLyoudmltICRERVNUX0NPTC9SRUFETUUudHh0CisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX1NZTi8qLnZpbSAkREVTVF9TWU4vUkVBRE1FLnR4dAorICAgIDpkZWwge2ZvcmNlfSAkREVTVF9JTkQvKi52aW0gJERFU1RfSU5EL1JFQURNRS50eHQKKyAgICA6ZGVsIHtmb3JjZX0gJERFU1RfUFJJTlQvKi5wcworICAgIDpkZWwge2ZvcmNlfXtyZWN1cnNpdmV9ICRERVNUX01BQ1JPCisgICAgOmRlbCB7Zm9yY2V9e3JlY3Vyc2l2ZX0gJERFU1RfVFVUT1IKKyAgICA6ZGVsIHtmb3JjZX17cmVjdXJzaXZlfSAkREVTVF9UT09MUworICAgIDpkZWwge2ZvcmNlfXtyZWN1cnNpdmV9ICRERVNUX0xBTkcKKyAgICA6ZGVsIHtmb3JjZX17cmVjdXJzaXZlfSAkREVTVF9LTUFQCisgICAgOmRlbCB7Zm9yY2V9e3JlY3Vyc2l2ZX0gJERFU1RfQ09NUAorICAgIDpkZWxkaXIge2ZvcmNlfSAkREVTVF9IRUxQICRERVNUX0NPTCAkREVTVF9TWU4gJERFU1RfSU5ECisgICAgOmRlbCB7Zm9yY2V9e3JlY3Vyc2l2ZX0gJERFU1RfRlRQLyoudmltICRERVNUX0ZUUC9SRUFETUUudHh0CisgICAgOmRlbCB7Zm9yY2V9ICRERVNUX1BMVUcvKi52aW0gJERFU1RfUExVRy9SRUFETUUudHh0CisgICAgOmRlbGRpciB7Zm9yY2V9ICRERVNUX0ZUUCAkREVTVF9QTFVHICRERVNUX1BSSU5UICRERVNUX1JUCisjCVRoaXMgd2lsbCBmYWlsIHdoZW4gb3RoZXIgVmltIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQsIG5vIHdvcnJpZXMuCisgICAgQHRyeToKKwk6ZGVsZGlyICRERVNUX1ZJTQorICAgIEBleGNlcHQ6CisJOnByaW50IENhbm5vdCBkZWxldGUgJERFU1RfVklNCisKKworIyB2aW06IHN0cz00IHN3PTQgOgpkaWZmIC0tZ2l0IGEvc3JjL21hcmsuYyBiL3NyYy9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiODAwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYXJrLmMKQEAgLTAsMCArMSwxNjE3IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBtYXJrLmM6IGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBtYXJrcyBhbmQganVtcGluZyB0byB0aGVtCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIG1haW50YWluIGFuZCBtYW5pcHVsYXRlIG1hcmtzLgorICovCisKKy8qCisgKiBJZiBhIG5hbWVkIGZpbGUgbWFyaydzIGxudW0gaXMgbm9uLXplcm8sIGl0IGlzIHZhbGlkLgorICogSWYgYSBuYW1lZCBmaWxlIG1hcmsncyBmbnVtIGlzIG5vbi16ZXJvLCBpdCBpcyBmb3IgYW4gZXhpc3RpbmcgYnVmZmVyLAorICogb3RoZXJ3aXNlIGl0IGlzIGZyb20gLnZpbWluZm8gYW5kIG5hbWVkZm1bbl0uZm5hbWUgaXMgdGhlIGZpbGUgbmFtZS4KKyAqIFRoZXJlIGFyZSBtYXJrcyAnQSAtICdaIChzZXQgYnkgdXNlcikgYW5kICcwIHRvICc5IChzZXQgd2hlbiB3cml0aW5nCisgKiB2aW1pbmZvKS4KKyAqLworI2RlZmluZSBFWFRSQV9NQVJLUyAxMAkJCQkJLyogbWFya3MgMC05ICovCitzdGF0aWMgeGZtYXJrX1QgbmFtZWRmbVtOTUFSS1MgKyBFWFRSQV9NQVJLU107CQkvKiBtYXJrcyB3aXRoIGZpbGUgbnIgKi8KKworc3RhdGljIHZvaWQgZm5hbWUyZm51bSBfX0FSR1MoKHhmbWFya19UICpmbSkpOworc3RhdGljIHZvaWQgZm1hcmtzX2NoZWNrX29uZSBfX0FSR1MoKHhmbWFya19UICpmbSwgY2hhcl91ICpuYW1lLCBidWZfVCAqYnVmKSk7CitzdGF0aWMgY2hhcl91ICptYXJrX2xpbmUgX19BUkdTKChwb3NfVCAqbXAsIGludCBsZWFkX2xlbikpOworc3RhdGljIHZvaWQgc2hvd19vbmVfbWFyayBfX0FSR1MoKGludCwgY2hhcl91ICosIHBvc19UICosIGNoYXJfdSAqLCBpbnQgY3VycmVudCkpOworI2lmZGVmIEZFQVRfSlVNUExJU1QKK3N0YXRpYyB2b2lkIGNsZWFudXBfanVtcGxpc3QgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZJTUlORk8KK3N0YXRpYyB2b2lkIHdyaXRlX29uZV9maWxlbWFyayBfX0FSR1MoKEZJTEUgKmZwLCB4Zm1hcmtfVCAqZm0sIGludCBjMSwgaW50IGMyKSk7CisjZW5kaWYKKworLyoKKyAqIFNldCBuYW1lZCBtYXJrICdjJyBhdCBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKyAqIFJldHVybnMgT0sgb24gc3VjY2VzcywgRkFJTCBpZiBiYWQgbmFtZSBnaXZlbi4KKyAqLworICAgIGludAorc2V0bWFyayhjKQorICAgIGludAkJYzsKK3sKKyAgICBpbnQJCWk7CisKKyAgICAvKiBDaGVjayBmb3IgYSBzcGVjaWFsIGtleSAobWF5IGNhdXNlIGlzbG93ZXIoKSB0byBjcmFzaCkuICovCisgICAgaWYgKGMgPCAwKQorCXJldHVybiBGQUlMOworCisgICAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICdgJykKKyAgICB7CisJc2V0cGNtYXJrKCk7CisJLyoga2VlcCBpdCBldmVuIHdoZW4gdGhlIGN1cnNvciBkb2Vzbid0IG1vdmUgKi8KKwljdXJ3aW4tPndfcHJldl9wY21hcmsgPSBjdXJ3aW4tPndfcGNtYXJrOworCXJldHVybiBPSzsKKyAgICB9CisKKyAgICAvKiBBbGxvdyBzZXR0aW5nICdbIGFuZCAnXSBmb3IgYW4gYXV0b2NvbW1hbmQgdGhhdCBzaW11bGF0ZXMgcmVhZGluZyBhCisgICAgICogZmlsZS4gKi8KKyAgICBpZiAoYyA9PSAnWycpCisgICAgeworCWN1cmJ1Zi0+Yl9vcF9zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJcmV0dXJuIE9LOworICAgIH0KKyAgICBpZiAoYyA9PSAnXScpCisgICAgeworCWN1cmJ1Zi0+Yl9vcF9lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOworCXJldHVybiBPSzsKKyAgICB9CisKKyNpZm5kZWYgRUJDRElDCisgICAgaWYgKGMgPiAneicpCSAgICAvKiBzb21lIGlzbG93ZXIoKSBhbmQgaXN1cHBlcigpIGNhbm5vdCBoYW5kbGUKKwkJCQljaGFyYWN0ZXJzIGFib3ZlIDEyNyAqLworCXJldHVybiBGQUlMOworI2VuZGlmCisgICAgaWYgKGlzbG93ZXIoYykpCisgICAgeworCWkgPSBjIC0gJ2EnOworCWN1cmJ1Zi0+Yl9uYW1lZG1baV0gPSBjdXJ3aW4tPndfY3Vyc29yOworCXJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKGlzdXBwZXIoYykpCisgICAgeworCWkgPSBjIC0gJ0EnOworCW5hbWVkZm1baV0uZm1hcmsubWFyayA9IGN1cndpbi0+d19jdXJzb3I7CisJbmFtZWRmbVtpXS5mbWFyay5mbnVtID0gY3VyYnVmLT5iX2ZudW07CisJdmltX2ZyZWUobmFtZWRmbVtpXS5mbmFtZSk7CisJbmFtZWRmbVtpXS5mbmFtZSA9IE5VTEw7CisJcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFNldCB0aGUgcHJldmlvdXMgY29udGV4dCBtYXJrIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCBhZGQgaXQgdG8gdGhlCisgKiBqdW1wIGxpc3QuCisgKi8KKyAgICB2b2lkCitzZXRwY21hcmsoKQoreworI2lmZGVmIEZFQVRfSlVNUExJU1QKKyAgICBpbnQJCWk7CisgICAgeGZtYXJrX1QJKmZtOworI2VuZGlmCisjaWZkZWYgSlVNUExJU1RfUk9UQVRFCisgICAgeGZtYXJrX1QJdGVtcG1hcms7CisjZW5kaWYKKworICAgIC8qIGZvciA6Z2xvYmFsIHRoZSBtYXJrIGlzIHNldCBvbmx5IG9uY2UgKi8KKyAgICBpZiAoZ2xvYmFsX2J1c3kgfHwgbGlzdGNtZF9idXN5IHx8IGNtZG1vZC5rZWVwanVtcHMpCisJcmV0dXJuOworCisgICAgY3Vyd2luLT53X3ByZXZfcGNtYXJrID0gY3Vyd2luLT53X3BjbWFyazsKKyAgICBjdXJ3aW4tPndfcGNtYXJrID0gY3Vyd2luLT53X2N1cnNvcjsKKworI2lmZGVmIEZFQVRfSlVNUExJU1QKKyMgaWZkZWYgSlVNUExJU1RfUk9UQVRFCisgICAgLyoKKyAgICAgKiBJZiBsYXN0IHVzZWQgZW50cnkgaXMgbm90IGF0IHRoZSB0b3AsIHB1dCBpdCBhdCB0aGUgdG9wIGJ5IHJvdGF0aW5nCisgICAgICogdGhlIHN0YWNrIHVudGlsIGl0IGlzICh0aGUgbmV3ZXIgZW50cmllcyB3aWxsIGJlIGF0IHRoZSBib3R0b20pLgorICAgICAqIEtlZXAgb25lIGVudHJ5ICh0aGUgbGFzdCB1c2VkIG9uZSkgYXQgdGhlIHRvcC4KKyAgICAgKi8KKyAgICBpZiAoY3Vyd2luLT53X2p1bXBsaXN0aWR4IDwgY3Vyd2luLT53X2p1bXBsaXN0bGVuKQorCSsrY3Vyd2luLT53X2p1bXBsaXN0aWR4OworICAgIHdoaWxlIChjdXJ3aW4tPndfanVtcGxpc3RpZHggPCBjdXJ3aW4tPndfanVtcGxpc3RsZW4pCisgICAgeworCXRlbXBtYXJrID0gY3Vyd2luLT53X2p1bXBsaXN0W2N1cndpbi0+d19qdW1wbGlzdGxlbiAtIDFdOworCWZvciAoaSA9IGN1cndpbi0+d19qdW1wbGlzdGxlbiAtIDE7IGkgPiAwOyAtLWkpCisJICAgIGN1cndpbi0+d19qdW1wbGlzdFtpXSA9IGN1cndpbi0+d19qdW1wbGlzdFtpIC0gMV07CisJY3Vyd2luLT53X2p1bXBsaXN0WzBdID0gdGVtcG1hcms7CisJKytjdXJ3aW4tPndfanVtcGxpc3RpZHg7CisgICAgfQorIyBlbmRpZgorCisgICAgLyogSWYganVtcGxpc3QgaXMgZnVsbDogcmVtb3ZlIG9sZGVzdCBlbnRyeSAqLworICAgIGlmICgrK2N1cndpbi0+d19qdW1wbGlzdGxlbiA+IEpVTVBMSVNUU0laRSkKKyAgICB7CisJY3Vyd2luLT53X2p1bXBsaXN0bGVuID0gSlVNUExJU1RTSVpFOworCXZpbV9mcmVlKGN1cndpbi0+d19qdW1wbGlzdFswXS5mbmFtZSk7CisJZm9yIChpID0gMTsgaSA8IEpVTVBMSVNUU0laRTsgKytpKQorCSAgICBjdXJ3aW4tPndfanVtcGxpc3RbaSAtIDFdID0gY3Vyd2luLT53X2p1bXBsaXN0W2ldOworICAgIH0KKyAgICBjdXJ3aW4tPndfanVtcGxpc3RpZHggPSBjdXJ3aW4tPndfanVtcGxpc3RsZW47CisgICAgZm0gPSAmY3Vyd2luLT53X2p1bXBsaXN0W2N1cndpbi0+d19qdW1wbGlzdGxlbiAtIDFdOworCisgICAgZm0tPmZtYXJrLm1hcmsgPSBjdXJ3aW4tPndfcGNtYXJrOworICAgIGZtLT5mbWFyay5mbnVtID0gY3VyYnVmLT5iX2ZudW07CisgICAgZm0tPmZuYW1lID0gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogVG8gY2hhbmdlIGNvbnRleHQsIGNhbGwgc2V0cGNtYXJrKCksIHRoZW4gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0bworICogd2hlcmUgZXZlciwgdGhlbiBjYWxsIGNoZWNrcGNtYXJrKCkuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcHJldmlvdXMKKyAqIGNvbnRleHQgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgdGhlIGN1cnNvciBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaW5lLgorICogSWYgcGNtYXJrIHdhcyBkZWxldGVkICh3aXRoICJkRyIpIHRoZSBwcmV2aW91cyBtYXJrIGlzIHJlc3RvcmVkLgorICovCisgICAgdm9pZAorY2hlY2twY21hcmsoKQoreworICAgIGlmIChjdXJ3aW4tPndfcHJldl9wY21hcmsubG51bSAhPSAwCisJICAgICYmIChlcXVhbHBvcyhjdXJ3aW4tPndfcGNtYXJrLCBjdXJ3aW4tPndfY3Vyc29yKQorCQl8fCBjdXJ3aW4tPndfcGNtYXJrLmxudW0gPT0gMCkpCisgICAgeworCWN1cndpbi0+d19wY21hcmsgPSBjdXJ3aW4tPndfcHJldl9wY21hcms7CisJY3Vyd2luLT53X3ByZXZfcGNtYXJrLmxudW0gPSAwOwkJLyogU2hvdyBpdCBoYXMgYmVlbiBjaGVja2VkICovCisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX0pVTVBMSVNUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIG1vdmUgImNvdW50IiBwb3NpdGlvbnMgaW4gdGhlIGp1bXAgbGlzdCAoY291bnQgbWF5IGJlIG5lZ2F0aXZlKQorICovCisgICAgcG9zX1QgKgorbW92ZW1hcmsoY291bnQpCisgICAgaW50IGNvdW50OworeworICAgIHBvc19UCSpwb3M7CisgICAgeGZtYXJrX1QJKmptcDsKKworICAgIGNsZWFudXBfanVtcGxpc3QoKTsKKworICAgIGlmIChjdXJ3aW4tPndfanVtcGxpc3RsZW4gPT0gMCkJICAgIC8qIG5vdGhpbmcgdG8ganVtcCB0byAqLworCXJldHVybiAocG9zX1QgKilOVUxMOworCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKGN1cndpbi0+d19qdW1wbGlzdGlkeCArIGNvdW50IDwgMAorCQl8fCBjdXJ3aW4tPndfanVtcGxpc3RpZHggKyBjb3VudCA+PSBjdXJ3aW4tPndfanVtcGxpc3RsZW4pCisJICAgIHJldHVybiAocG9zX1QgKilOVUxMOworCisJLyoKKwkgKiBpZiBmaXJzdCBDVFJMLU8gb3IgQ1RSTC1JIGNvbW1hbmQgYWZ0ZXIgYSBqdW1wLCBhZGQgY3Vyc29yIHBvc2l0aW9uCisJICogdG8gbGlzdC4gIENhcmVmdWw6IElmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIChDVFJMLU8gaW1taWRpYXRlbHkgYWZ0ZXIKKwkgKiBzdGFydGluZyBWaW0gb24gYSBmaWxlKSwgYW5vdGhlciBlbnRyeSBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuCisJICovCisJaWYgKGN1cndpbi0+d19qdW1wbGlzdGlkeCA9PSBjdXJ3aW4tPndfanVtcGxpc3RsZW4pCisJeworCSAgICBzZXRwY21hcmsoKTsKKwkgICAgLS1jdXJ3aW4tPndfanVtcGxpc3RpZHg7CS8qIHNraXAgdGhlIG5ldyBlbnRyeSAqLworCSAgICBpZiAoY3Vyd2luLT53X2p1bXBsaXN0aWR4ICsgY291bnQgPCAwKQorCQlyZXR1cm4gKHBvc19UICopTlVMTDsKKwl9CisKKwljdXJ3aW4tPndfanVtcGxpc3RpZHggKz0gY291bnQ7CisKKwlqbXAgPSBjdXJ3aW4tPndfanVtcGxpc3QgKyBjdXJ3aW4tPndfanVtcGxpc3RpZHg7CisJaWYgKGptcC0+Zm1hcmsuZm51bSA9PSAwKQorCSAgICBmbmFtZTJmbnVtKGptcCk7CisJaWYgKGptcC0+Zm1hcmsuZm51bSAhPSBjdXJidWYtPmJfZm51bSkKKwl7CisJICAgIC8qIGp1bXAgdG8gb3RoZXIgZmlsZSAqLworCSAgICBpZiAoYnVmbGlzdF9maW5kbnIoam1wLT5mbWFyay5mbnVtKSA9PSBOVUxMKQorCSAgICB7CQkJCQkgICAgIC8qIFNraXAgdGhpcyBvbmUgLi4gKi8KKwkJY291bnQgKz0gY291bnQgPCAwID8gLTEgOiAxOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoYnVmbGlzdF9nZXRmaWxlKGptcC0+Zm1hcmsuZm51bSwgam1wLT5mbWFyay5tYXJrLmxudW0sCisJCQkJCQkJICAgIDAsIEZBTFNFKSA9PSBGQUlMKQorCQlyZXR1cm4gKHBvc19UICopTlVMTDsKKwkgICAgLyogU2V0IGxudW0gYWdhaW4sIGF1dG9jb21tYW5kcyBteSBoYXZlIGNoYW5nZWQgaXQgKi8KKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGptcC0+Zm1hcmsubWFyazsKKwkgICAgcG9zID0gKHBvc19UICopLTE7CisJfQorCWVsc2UKKwkgICAgcG9zID0gJihqbXAtPmZtYXJrLm1hcmspOworCXJldHVybiBwb3M7CisgICAgfQorfQorCisvKgorICogTW92ZSAiY291bnQiIHBvc2l0aW9ucyBpbiB0aGUgY2hhbmdlbGlzdCAoY291bnQgbWF5IGJlIG5lZ2F0aXZlKS4KKyAqLworICAgIHBvc19UICoKK21vdmVjaGFuZ2VsaXN0KGNvdW50KQorICAgIGludAkJY291bnQ7Cit7CisgICAgaW50CQluOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuID09IDApCSAgICAvKiBub3RoaW5nIHRvIGp1bXAgdG8gKi8KKwlyZXR1cm4gKHBvc19UICopTlVMTDsKKworICAgIG4gPSBjdXJ3aW4tPndfY2hhbmdlbGlzdGlkeDsKKyAgICBpZiAobiArIGNvdW50IDwgMCkKKyAgICB7CisJaWYgKG4gPT0gMCkKKwkgICAgcmV0dXJuIChwb3NfVCAqKU5VTEw7CisJbiA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKG4gKyBjb3VudCA+PSBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbikKKyAgICB7CisJaWYgKG4gPT0gY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW4gLSAxKQorCSAgICByZXR1cm4gKHBvc19UICopTlVMTDsKKwluID0gY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW4gLSAxOworICAgIH0KKyAgICBlbHNlCisJbiArPSBjb3VudDsKKyAgICBjdXJ3aW4tPndfY2hhbmdlbGlzdGlkeCA9IG47CisgICAgcmV0dXJuIGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0ICsgbjsKK30KKyNlbmRpZgorCisvKgorICogRmluZCBtYXJrICJjIi4KKyAqIFJldHVybnM6CisgKiAtIHBvaW50ZXIgdG8gcG9zX1QgaWYgZm91bmQuICBsbnVtIGlzIDAgd2hlbiBtYXJrIG5vdCBzZXQsIC0xIHdoZW4gbWFyayBpcworICogICBpbiBhbm90aGVyIGZpbGUgd2hpY2ggY2FuJ3QgYmUgZ290dGVuLiAoY2FsbGVyIG5lZWRzIHRvIGNoZWNrIGxudW0hKQorICogLSBOVUxMIGlmIHRoZXJlIGlzIG5vIG1hcmsgY2FsbGVkICdjJy4KKyAqIC0gLTEgaWYgbWFyayBpcyBpbiBvdGhlciBmaWxlIGFuZCBqdW1wZWQgdGhlcmUgKG9ubHkgaWYgY2hhbmdlZmlsZSBpcyBUUlVFKQorICovCisgICAgcG9zX1QgKgorZ2V0bWFyayhjLCBjaGFuZ2VmaWxlKQorICAgIGludAkJYzsKKyAgICBpbnQJCWNoYW5nZWZpbGU7CQkvKiBhbGxvd2VkIHRvIGVkaXQgYW5vdGhlciBmaWxlICovCit7CisgICAgcG9zX1QJCSpwb3NwOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgcG9zX1QJCSpzdGFydHAsICplbmRwOworI2VuZGlmCisgICAgc3RhdGljIHBvc19UCXBvc19jb3B5OworCisgICAgcG9zcCA9IE5VTEw7CisKKyAgICAvKiBDaGVjayBmb3Igc3BlY2lhbCBrZXksIGNhbid0IGJlIGEgbWFyayBuYW1lIGFuZCBtaWdodCBjYXVzZSBpc2xvd2VyKCkKKyAgICAgKiB0byBjcmFzaC4gKi8KKyAgICBpZiAoYyA8IDApCisJcmV0dXJuIHBvc3A7CisjaWZuZGVmIEVCQ0RJQworICAgIGlmIChjID4gJ34nKQkJCS8qIGNoZWNrIGZvciBpc2xvd2VyKCkvaXN1cHBlcigpICovCisJOworICAgIGVsc2UKKyNlbmRpZgorCWlmIChjID09ICdcJycgfHwgYyA9PSAnYCcpCS8qIHByZXZpb3VzIGNvbnRleHQgbWFyayAqLworICAgIHsKKwlwb3NfY29weSA9IGN1cndpbi0+d19wY21hcms7CS8qIG5lZWQgdG8gbWFrZSBhIGNvcHkgYmVjYXVzZSAqLworCXBvc3AgPSAmcG9zX2NvcHk7CQkvKiAgIHdfcGNtYXJrIG1heSBiZSBjaGFuZ2VkIHNvb24gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoYyA9PSAnIicpCQkJLyogdG8gcG9zIHdoZW4gbGVhdmluZyBidWZmZXIgKi8KKwlwb3NwID0gJihjdXJidWYtPmJfbGFzdF9jdXJzb3IpOworICAgIGVsc2UgaWYgKGMgPT0gJ14nKQkJCS8qIHRvIHdoZXJlIEluc2VydCBtb2RlIHN0b3BwZWQgKi8KKwlwb3NwID0gJihjdXJidWYtPmJfbGFzdF9pbnNlcnQpOworICAgIGVsc2UgaWYgKGMgPT0gJy4nKQkJCS8qIHRvIHdoZXJlIGxhc3QgY2hhbmdlIHdhcyBtYWRlICovCisJcG9zcCA9ICYoY3VyYnVmLT5iX2xhc3RfY2hhbmdlKTsKKyAgICBlbHNlIGlmIChjID09ICdbJykJCQkvKiB0byBzdGFydCBvZiBwcmV2aW91cyBvcGVyYXRvciAqLworCXBvc3AgPSAmKGN1cmJ1Zi0+Yl9vcF9zdGFydCk7CisgICAgZWxzZSBpZiAoYyA9PSAnXScpCQkJLyogdG8gZW5kIG9mIHByZXZpb3VzIG9wZXJhdG9yICovCisJcG9zcCA9ICYoY3VyYnVmLT5iX29wX2VuZCk7CisgICAgZWxzZSBpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpCS8qIHRvIHByZXZpb3VzL25leHQgcGFyYWdyYXBoICovCisgICAgeworCXBvc19UCXBvczsKKwlvcGFyZ19UCW9hOworCWludAlzbGNiID0gbGlzdGNtZF9idXN5OworCisJcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwlsaXN0Y21kX2J1c3kgPSBUUlVFOwkgICAgLyogYXZvaWQgdGhhdCAnJyBpcyBjaGFuZ2VkICovCisJaWYgKGZpbmRwYXIoJm9hLCBjID09ICd9JyA/IEZPUldBUkQgOiBCQUNLV0FSRCwgMUwsIE5VTCwgRkFMU0UpKQorCXsKKwkgICAgcG9zX2NvcHkgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBwb3NwID0gJnBvc19jb3B5OworCX0KKwljdXJ3aW4tPndfY3Vyc29yID0gcG9zOworCWxpc3RjbWRfYnVzeSA9IHNsY2I7CisgICAgfQorICAgIGVsc2UgaWYgKGMgPT0gJygnIHx8IGMgPT0gJyknKQkvKiB0byBwcmV2aW91cy9uZXh0IHNlbnRlbmNlICovCisgICAgeworCXBvc19UCXBvczsKKwlpbnQJc2xjYiA9IGxpc3RjbWRfYnVzeTsKKworCXBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisJbGlzdGNtZF9idXN5ID0gVFJVRTsJICAgIC8qIGF2b2lkIHRoYXQgJycgaXMgY2hhbmdlZCAqLworCWlmIChmaW5kc2VudChjID09ICcpJyA/IEZPUldBUkQgOiBCQUNLV0FSRCwgMUwpKQorCXsKKwkgICAgcG9zX2NvcHkgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBwb3NwID0gJnBvc19jb3B5OworCX0KKwljdXJ3aW4tPndfY3Vyc29yID0gcG9zOworCWxpc3RjbWRfYnVzeSA9IHNsY2I7CisgICAgfQorI2lmZGVmIEZFQVRfVklTVUFMCisgICAgZWxzZSBpZiAoYyA9PSAnPCcgfHwgYyA9PSAnPicpCS8qIHN0YXJ0L2VuZCBvZiB2aXN1YWwgYXJlYSAqLworICAgIHsKKwlzdGFydHAgPSAmY3VyYnVmLT5iX3Zpc3VhbF9zdGFydDsKKwllbmRwID0gJmN1cmJ1Zi0+Yl92aXN1YWxfZW5kOworCWlmICgoYyA9PSAnPCcpID09IGx0KCpzdGFydHAsICplbmRwKSkKKwkgICAgcG9zcCA9IHN0YXJ0cDsKKwllbHNlCisJICAgIHBvc3AgPSBlbmRwOworCS8qCisJICogRm9yIFZpc3VhbCBsaW5lIG1vZGUsIHNldCBtYXJrIGF0IGJlZ2luIG9yIGVuZCBvZiBsaW5lCisJICovCisJaWYgKGN1cmJ1Zi0+Yl92aXN1YWxfbW9kZSA9PSAnVicpCisJeworCSAgICBwb3NfY29weSA9ICpwb3NwOworCSAgICBwb3NwID0gJnBvc19jb3B5OworCSAgICBpZiAoYyA9PSAnPCcpCisJCXBvc19jb3B5LmNvbCA9IDA7CisJICAgIGVsc2UKKwkJcG9zX2NvcHkuY29sID0gTUFYQ09MOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgcG9zX2NvcHkuY29sYWRkID0gMDsKKyNlbmRpZgorCX0KKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmIChBU0NJSV9JU0xPV0VSKGMpKQkJLyogbm9ybWFsIG5hbWVkIG1hcmsgKi8KKyAgICB7CisJcG9zcCA9ICYoY3VyYnVmLT5iX25hbWVkbVtjIC0gJ2EnXSk7CisgICAgfQorICAgIGVsc2UgaWYgKEFTQ0lJX0lTVVBQRVIoYykgfHwgVklNX0lTRElHSVQoYykpCS8qIG5hbWVkIGZpbGUgbWFyayAqLworICAgIHsKKwlpZiAoVklNX0lTRElHSVQoYykpCisJICAgIGMgPSBjIC0gJzAnICsgTk1BUktTOworCWVsc2UKKwkgICAgYyAtPSAnQSc7CisJcG9zcCA9ICYobmFtZWRmbVtjXS5mbWFyay5tYXJrKTsKKworCWlmIChuYW1lZGZtW2NdLmZtYXJrLmZudW0gPT0gMCkKKwkgICAgZm5hbWUyZm51bSgmbmFtZWRmbVtjXSk7CisJaWYgKG5hbWVkZm1bY10uZm1hcmsuZm51bSAhPSBjdXJidWYtPmJfZm51bSkKKwl7CisJICAgIHBvc3AgPSAmcG9zX2NvcHk7CisKKwkgICAgLyogbWFyayBpcyBpbiBhbm90aGVyIGZpbGUgKi8KKwkgICAgaWYgKG5hbWVkZm1bY10uZm1hcmsubWFyay5sbnVtICE9IDAKKwkJCQkgICAgICAgJiYgY2hhbmdlZmlsZSAmJiBuYW1lZGZtW2NdLmZtYXJrLmZudW0pCisJICAgIHsKKwkJaWYgKGJ1Zmxpc3RfZ2V0ZmlsZShuYW1lZGZtW2NdLmZtYXJrLmZudW0sCisJCQkJICAgICAgKGxpbmVucl9UKTEsIEdFVEZfU0VUTUFSSywgRkFMU0UpID09IE9LKQorCQl7CisJCSAgICAvKiBTZXQgdGhlIGxudW0gbm93LCBhdXRvY29tbWFuZHMgY291bGQgaGF2ZSBjaGFuZ2VkIGl0ICovCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gbmFtZWRmbVtjXS5mbWFyay5tYXJrOworCQkgICAgcmV0dXJuIChwb3NfVCAqKS0xOworCQl9CisJCXBvc19jb3B5LmxudW0gPSAtMTsJLyogY2FuJ3QgZ2V0IGZpbGUgKi8KKwkgICAgfQorCSAgICBlbHNlCisJCXBvc19jb3B5LmxudW0gPSAwOwkvKiBtYXJrIGV4aXN0cywgYnV0IGlzIG5vdCB2YWxpZCBpbgorCQkJCQkgICBjdXJyZW50IGJ1ZmZlciAqLworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcG9zcDsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgdGhlIG5leHQgbmFtZWQgbWFyayBpbiB0aGUgY3VycmVudCBmaWxlLgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBwb3NfVCBvZiB0aGUgbmV4dCBtYXJrIG9yIE5VTEwgaWYgbm8gbWFyayBpcyBmb3VuZC4KKyAqLworICAgIHBvc19UICoKK2dldG5leHRtYXJrKHN0YXJ0cG9zLCBkaXIsIGJlZ2luX2xpbmUpCisgICAgcG9zX1QJKnN0YXJ0cG9zOwkvKiB3aGVyZSB0byBzdGFydCAqLworICAgIGludAkJZGlyOwkvKiBkaXJlY3Rpb24gZm9yIHNlYXJjaCAqLworICAgIGludAkJYmVnaW5fbGluZTsKK3sKKyAgICBpbnQJCWk7CisgICAgcG9zX1QJKnJlc3VsdCA9IE5VTEw7CisgICAgcG9zX1QJcG9zOworCisgICAgcG9zID0gKnN0YXJ0cG9zOworCisgICAgLyogV2hlbiBzZWFyY2hpbmcgYmFja3dhcmQgYW5kIGxlYXZpbmcgdGhlIGN1cnNvciBvbiB0aGUgZmlyc3Qgbm9uLWJsYW5rLAorICAgICAqIHBvc2l0aW9uIG11c3QgYmUgaW4gYSBwcmV2aW91cyBsaW5lLgorICAgICAqIFdoZW4gc2VhcmNoaW5nIGZvcndhcmQgYW5kIGxlYXZpbmcgdGhlIGN1cnNvciBvbiB0aGUgZmlyc3Qgbm9uLWJsYW5rLAorICAgICAqIHBvc2l0aW9uIG11c3QgYmUgaW4gYSBuZXh0IGxpbmUuICovCisgICAgaWYgKGRpciA9PSBCQUNLV0FSRCAmJiBiZWdpbl9saW5lKQorCXBvcy5jb2wgPSAwOworICAgIGVsc2UgaWYgKGRpciA9PSBGT1JXQVJEICYmIGJlZ2luX2xpbmUpCisJcG9zLmNvbCA9IE1BWENPTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOTUFSS1M7IGkrKykKKyAgICB7CisJaWYgKGN1cmJ1Zi0+Yl9uYW1lZG1baV0ubG51bSA+IDApCisJeworCSAgICBpZiAoZGlyID09IEZPUldBUkQpCisJICAgIHsKKwkJaWYgKChyZXN1bHQgPT0gTlVMTCB8fCBsdChjdXJidWYtPmJfbmFtZWRtW2ldLCAqcmVzdWx0KSkKKwkJCSYmIGx0KHBvcywgY3VyYnVmLT5iX25hbWVkbVtpXSkpCisJCSAgICByZXN1bHQgPSAmY3VyYnVmLT5iX25hbWVkbVtpXTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKChyZXN1bHQgPT0gTlVMTCB8fCBsdCgqcmVzdWx0LCBjdXJidWYtPmJfbmFtZWRtW2ldKSkKKwkJCSYmIGx0KGN1cmJ1Zi0+Yl9uYW1lZG1baV0sIHBvcykpCisJCSAgICByZXN1bHQgPSAmY3VyYnVmLT5iX25hbWVkbVtpXTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRm9yIGFuIHh0ZW5kZWQgZmlsZW1hcms6IHNldCB0aGUgZm51bSBmcm9tIHRoZSBmbmFtZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgbWFya3Mgb2J0YWluZWQgZnJvbSB0aGUgLnZpbWluZm8gZmlsZS4gIEl0J3MgcG9zdHBvbmVkCisgKiB1bnRpbCB0aGUgbWFyayBpcyB1c2VkIHRvIGF2b2lkIGEgbG9uZyBzdGFydHVwIGRlbGF5LgorICovCisgICAgc3RhdGljIHZvaWQKK2ZuYW1lMmZudW0oZm0pCisgICAgeGZtYXJrX1QJKmZtOworeworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChmbS0+Zm5hbWUgIT0gTlVMTCkKKyAgICB7CisJLyoKKwkgKiBGaXJzdCBleHBhbmQgIn4vIiBpbiB0aGUgZmlsZSBuYW1lIHRvIHRoZSBob21lIGRpcmVjdG9yeS4KKwkgKiBUcnkgdG8gc2hvcnRlbiB0aGUgZmlsZSBuYW1lLgorCSAqLworCWV4cGFuZF9lbnYoZm0tPmZuYW1lLCBOYW1lQnVmZiwgTUFYUEFUSEwpOworCW1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKTsKKwlwID0gc2hvcnRlbl9mbmFtZShOYW1lQnVmZiwgSU9idWZmKTsKKworCS8qIGJ1Zmxpc3RfbmV3KCkgd2lsbCBjYWxsIGZtYXJrc19jaGVja19uYW1lcygpICovCisJKHZvaWQpYnVmbGlzdF9uZXcoTmFtZUJ1ZmYsIHAsIChsaW5lbnJfVCkxLCAwKTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBhbGwgZmlsZSBtYXJrcyBmb3IgYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBuYW1lIGluIGJ1Zi4KKyAqIE1heSByZXBsYWNlIHRoZSBuYW1lIHdpdGggYW4gZm51bS4KKyAqIFVzZWQgZm9yIG1hcmtzIHRoYXQgY29tZSBmcm9tIHRoZSAudmltaW5mbyBmaWxlLgorICovCisgICAgdm9pZAorZm1hcmtzX2NoZWNrX25hbWVzKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCWk7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIHdpbl9UCSp3cDsKKyNlbmRpZgorCisgICAgaWYgKGJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBuYW1lID0gaG9tZV9yZXBsYWNlX3NhdmUoYnVmLCBidWYtPmJfZmZuYW1lKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOTUFSS1MgKyBFWFRSQV9NQVJLUzsgKytpKQorCWZtYXJrc19jaGVja19vbmUoJm5hbWVkZm1baV0sIG5hbWUsIGJ1Zik7CisKKyNpZmRlZiBGRUFUX0pVTVBMSVNUCisgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgd3AtPndfanVtcGxpc3RsZW47ICsraSkKKwkgICAgZm1hcmtzX2NoZWNrX29uZSgmd3AtPndfanVtcGxpc3RbaV0sIG5hbWUsIGJ1Zik7CisgICAgfQorI2VuZGlmCisKKyAgICB2aW1fZnJlZShuYW1lKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitmbWFya3NfY2hlY2tfb25lKGZtLCBuYW1lLCBidWYpCisgICAgeGZtYXJrX1QJKmZtOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBidWZfVAkqYnVmOworeworICAgIGlmIChmbS0+Zm1hcmsuZm51bSA9PSAwCisJICAgICYmIGZtLT5mbmFtZSAhPSBOVUxMCisJICAgICYmIGZuYW1lY21wKG5hbWUsIGZtLT5mbmFtZSkgPT0gMCkKKyAgICB7CisJZm0tPmZtYXJrLmZudW0gPSBidWYtPmJfZm51bTsKKwl2aW1fZnJlZShmbS0+Zm5hbWUpOworCWZtLT5mbmFtZSA9IE5VTEw7CisgICAgfQorfQorCisvKgorICogQ2hlY2sgYSBpZiBhIHBvc2l0aW9uIGZyb20gYSBtYXJrIGlzIHZhbGlkLgorICogR2l2ZSBhbmQgZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIEZBSUwgaWYgbm90LgorICovCisgICAgaW50CitjaGVja19tYXJrKHBvcykKKyAgICBwb3NfVCAgICAqcG9zOworeworICAgIGlmIChwb3MgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfdW1hcmspKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgaWYgKHBvcy0+bG51bSA8PSAwKQorICAgIHsKKwkvKiBsbnVtIGlzIG5lZ2F0aXZlIGlmIG1hcmsgaXMgaW4gYW5vdGhlciBmaWxlIGNhbiBjYW4ndCBnZXQgdGhhdAorCSAqIGZpbGUsIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBnaXZlIHRoZW4uICovCisJaWYgKHBvcy0+bG51bSA9PSAwKQorCSAgICBFTVNHKF8oZV9tYXJrbm90c2V0KSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGlmIChwb3MtPmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKyAgICB7CisJRU1TRyhfKGVfbWFya2ludmFsKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGNscmFsbG1hcmtzKCkgLSBjbGVhciBhbGwgbWFya3MgaW4gdGhlIGJ1ZmZlciAnYnVmJworICoKKyAqIFVzZWQgbWFpbmx5IHdoZW4gdHJhc2hpbmcgdGhlIGVudGlyZSBidWZmZXIgZHVyaW5nICI6ZSIgdHlwZSBjb21tYW5kcworICovCisgICAgdm9pZAorY2xyYWxsbWFya3MoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgc3RhdGljIGludAkJaSA9IC0xOworCisgICAgaWYgKGkgPT0gLTEpCS8qIGZpcnN0IGNhbGwgZXZlcjogaW5pdGlhbGl6ZSAqLworCWZvciAoaSA9IDA7IGkgPCBOTUFSS1MgKyAxOyBpKyspCisJeworCSAgICBuYW1lZGZtW2ldLmZtYXJrLm1hcmsubG51bSA9IDA7CisJICAgIG5hbWVkZm1baV0uZm5hbWUgPSBOVUxMOworCX0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOTUFSS1M7IGkrKykKKwlidWYtPmJfbmFtZWRtW2ldLmxudW0gPSAwOworICAgIGJ1Zi0+Yl9vcF9zdGFydC5sbnVtID0gMDsJCS8qIHN0YXJ0L2VuZCBvcCBtYXJrIGNsZWFyZWQgKi8KKyAgICBidWYtPmJfb3BfZW5kLmxudW0gPSAwOworICAgIGJ1Zi0+Yl9sYXN0X2N1cnNvci5sbnVtID0gMTsJLyogJyIgbWFyayBjbGVhcmVkICovCisgICAgYnVmLT5iX2xhc3RfY3Vyc29yLmNvbCA9IDA7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGJ1Zi0+Yl9sYXN0X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgYnVmLT5iX2xhc3RfaW5zZXJ0LmxudW0gPSAwOwkvKiAnXiBtYXJrIGNsZWFyZWQgKi8KKyAgICBidWYtPmJfbGFzdF9jaGFuZ2UubG51bSA9IDA7CS8qICcuIG1hcmsgY2xlYXJlZCAqLworI2lmZGVmIEZFQVRfSlVNUExJU1QKKyAgICBidWYtPmJfY2hhbmdlbGlzdGxlbiA9IDA7CisjZW5kaWYKK30KKworLyoKKyAqIEdldCBuYW1lIG9mIGZpbGUgZnJvbSBhIGZpbGVtYXJrLgorICogV2hlbiBpdCdzIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwgcmV0dXJuIHRoZSB0ZXh0IGF0IHRoZSBtYXJrLgorICogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nLgorICovCisgICAgY2hhcl91ICoKK2ZtX2dldG5hbWUoZm1hcmssIGxlYWRfbGVuKQorICAgIGZtYXJrX1QJKmZtYXJrOworICAgIGludAkJbGVhZF9sZW47Cit7CisgICAgaWYgKGZtYXJrLT5mbnVtID09IGN1cmJ1Zi0+Yl9mbnVtKQkJICAgIC8qIGN1cnJlbnQgYnVmZmVyICovCisJcmV0dXJuIG1hcmtfbGluZSgmKGZtYXJrLT5tYXJrKSwgbGVhZF9sZW4pOworICAgIHJldHVybiBidWZsaXN0X25yMm5hbWUoZm1hcmstPmZudW0sIEZBTFNFLCBUUlVFKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbGluZSBhdCBtYXJrICJtcCIuICBUcnVuY2F0ZSB0byBmaXQgaW4gd2luZG93LgorICogVGhlIHJldHVybmVkIHN0cmluZyBoYXMgYmVlbiBhbGxvY2F0ZWQuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK21hcmtfbGluZShtcCwgbGVhZF9sZW4pCisgICAgcG9zX1QJKm1wOworICAgIGludAkJbGVhZF9sZW47Cit7CisgICAgY2hhcl91CSpzLCAqcDsKKyAgICBpbnQJCWxlbjsKKworICAgIGlmIChtcC0+bG51bSA9PSAwIHx8IG1wLT5sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJcmV0dXJuIHZpbV9zdHJzYXZlKChjaGFyX3UgKikiLWludmFsaWQtIik7CisgICAgcyA9IHZpbV9zdHJuc2F2ZShza2lwd2hpdGUobWxfZ2V0KG1wLT5sbnVtKSksIChpbnQpQ29sdW1ucyk7CisgICAgaWYgKHMgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICAvKiBUcnVuY2F0ZSB0aGUgbGluZSB0byBmaXQgaXQgaW4gdGhlIHdpbmRvdyAqLworICAgIGxlbiA9IDA7CisgICAgZm9yIChwID0gczsgKnAgIT0gTlVMOyArK3ApCisgICAgeworCWxlbiArPSBwdHIyY2VsbHMocCk7CisJaWYgKGxlbiA+PSBDb2x1bW5zIC0gbGVhZF9sZW4pCisJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOworI2VuZGlmCisgICAgfQorICAgICpwID0gTlVMOworICAgIHJldHVybiBzOworfQorCisvKgorICogcHJpbnQgdGhlIG1hcmtzCisgKi8KKyAgICB2b2lkCitkb19tYXJrcyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIGlmIChhcmcgIT0gTlVMTCAmJiAqYXJnID09IE5VTCkKKwlhcmcgPSBOVUxMOworCisgICAgc2hvd19vbmVfbWFyaygnXCcnLCBhcmcsICZjdXJ3aW4tPndfcGNtYXJrLCBOVUxMLCBUUlVFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTk1BUktTOyArK2kpCisJc2hvd19vbmVfbWFyayhpICsgJ2EnLCBhcmcsICZjdXJidWYtPmJfbmFtZWRtW2ldLCBOVUxMLCBUUlVFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTk1BUktTICsgRVhUUkFfTUFSS1M7ICsraSkKKyAgICB7CisJaWYgKG5hbWVkZm1baV0uZm1hcmsuZm51bSAhPSAwKQorCSAgICBuYW1lID0gZm1fZ2V0bmFtZSgmbmFtZWRmbVtpXS5mbWFyaywgMTUpOworCWVsc2UKKwkgICAgbmFtZSA9IG5hbWVkZm1baV0uZm5hbWU7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwl7CisJICAgIHNob3dfb25lX21hcmsoaSA+PSBOTUFSS1MgPyBpIC0gTk1BUktTICsgJzAnIDogaSArICdBJywKKwkJICAgIGFyZywgJm5hbWVkZm1baV0uZm1hcmsubWFyaywgbmFtZSwKKwkJICAgIG5hbWVkZm1baV0uZm1hcmsuZm51bSA9PSBjdXJidWYtPmJfZm51bSk7CisJICAgIGlmIChuYW1lZGZtW2ldLmZtYXJrLmZudW0gIT0gMCkKKwkJdmltX2ZyZWUobmFtZSk7CisJfQorICAgIH0KKyAgICBzaG93X29uZV9tYXJrKCciJywgYXJnLCAmY3VyYnVmLT5iX2xhc3RfY3Vyc29yLCBOVUxMLCBUUlVFKTsKKyAgICBzaG93X29uZV9tYXJrKCdbJywgYXJnLCAmY3VyYnVmLT5iX29wX3N0YXJ0LCBOVUxMLCBUUlVFKTsKKyAgICBzaG93X29uZV9tYXJrKCddJywgYXJnLCAmY3VyYnVmLT5iX29wX2VuZCwgTlVMTCwgVFJVRSk7CisgICAgc2hvd19vbmVfbWFyaygnXicsIGFyZywgJmN1cmJ1Zi0+Yl9sYXN0X2luc2VydCwgTlVMTCwgVFJVRSk7CisgICAgc2hvd19vbmVfbWFyaygnLicsIGFyZywgJmN1cmJ1Zi0+Yl9sYXN0X2NoYW5nZSwgTlVMTCwgVFJVRSk7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBzaG93X29uZV9tYXJrKCc8JywgYXJnLCAmY3VyYnVmLT5iX3Zpc3VhbF9zdGFydCwgTlVMTCwgVFJVRSk7CisgICAgc2hvd19vbmVfbWFyaygnPicsIGFyZywgJmN1cmJ1Zi0+Yl92aXN1YWxfZW5kLCBOVUxMLCBUUlVFKTsKKyNlbmRpZgorICAgIHNob3dfb25lX21hcmsoLTEsIGFyZywgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisgICAgc3RhdGljIHZvaWQKK3Nob3dfb25lX21hcmsoYywgYXJnLCBwLCBuYW1lLCBjdXJyZW50KQorICAgIGludAkJYzsKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBwb3NfVAkqcDsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQljdXJyZW50OwkvKiBpbiBjdXJyZW50IGZpbGUgKi8KK3sKKyAgICBzdGF0aWMgaW50CWRpZF90aXRsZSA9IEZBTFNFOworICAgIGludAkJbXVzdGZyZWUgPSBGQUxTRTsKKworICAgIGlmIChjID09IC0xKQkJCSAgICAvKiBmaW5pc2ggdXAgKi8KKyAgICB7CisJaWYgKGRpZF90aXRsZSkKKwkgICAgZGlkX3RpdGxlID0gRkFMU0U7CisJZWxzZQorCXsKKwkgICAgaWYgKGFyZyA9PSBOVUxMKQorCQlNU0coXygiTm8gbWFya3Mgc2V0IikpOworCSAgICBlbHNlCisJCUVNU0cyKF8oIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIpLCBhcmcpOworCX0KKyAgICB9CisgICAgLyogZG9uJ3Qgb3V0cHV0IGFueXRoaW5nIGlmICdxJyB0eXBlZCBhdCAtLW1vcmUtLSBwcm9tcHQgKi8KKyAgICBlbHNlIGlmICghZ290X2ludAorCSAgICAmJiAoYXJnID09IE5VTEwgfHwgdmltX3N0cmNocihhcmcsIGMpICE9IE5VTEwpCisJICAgICYmIHAtPmxudW0gIT0gMCkKKyAgICB7CisJaWYgKCFkaWRfdGl0bGUpCisJeworCSAgICAvKiBIaWdobGlnaHQgdGl0bGUgKi8KKwkgICAgTVNHX1BVVFNfVElUTEUoXygiXG5tYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiKSk7CisJICAgIGRpZF90aXRsZSA9IFRSVUU7CisJfQorCW1zZ19wdXRjaGFyKCdcbicpOworCWlmICghZ290X2ludCkKKwl7CisJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsICIgJWMgJTZsZCAlNGQgIiwgYywgcC0+bG51bSwgcC0+Y29sKTsKKwkgICAgbXNnX291dHRyYW5zKElPYnVmZik7CisJICAgIGlmIChuYW1lID09IE5VTEwgJiYgY3VycmVudCkKKwkgICAgeworCQluYW1lID0gbWFya19saW5lKHAsIDE1KTsKKwkJbXVzdGZyZWUgPSBUUlVFOworCSAgICB9CisJICAgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJbXNnX291dHRyYW5zX2F0dHIobmFtZSwgY3VycmVudCA/IGhsX2F0dHIoSExGX0QpIDogMCk7CisJCWlmIChtdXN0ZnJlZSkKKwkJICAgIHZpbV9mcmVlKG5hbWUpOworCSAgICB9CisJfQorCW91dF9mbHVzaCgpOwkJICAgIC8qIHNob3cgb25lIGxpbmUgYXQgYSB0aW1lICovCisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX0pVTVBMSVNUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHByaW50IHRoZSBqdW1wbGlzdAorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitleF9qdW1wcyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKm5hbWU7CisKKyAgICBjbGVhbnVwX2p1bXBsaXN0KCk7CisgICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCisgICAgTVNHX1BVVFNfVElUTEUoXygiXG4ganVtcCBsaW5lICBjb2wgZmlsZS90ZXh0IikpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdXJ3aW4tPndfanVtcGxpc3RsZW4gJiYgIWdvdF9pbnQ7ICsraSkKKyAgICB7CisJaWYgKGN1cndpbi0+d19qdW1wbGlzdFtpXS5mbWFyay5tYXJrLmxudW0gIT0gMCkKKwl7CisJICAgIGlmIChjdXJ3aW4tPndfanVtcGxpc3RbaV0uZm1hcmsuZm51bSA9PSAwKQorCQlmbmFtZTJmbnVtKCZjdXJ3aW4tPndfanVtcGxpc3RbaV0pOworCSAgICBuYW1lID0gZm1fZ2V0bmFtZSgmY3Vyd2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLCAxNik7CisJICAgIGlmIChuYW1lID09IE5VTEwpCSAgICAvKiBmaWxlIG5hbWUgbm90IGF2YWlsYWJsZSAqLworCQljb250aW51ZTsKKworCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKwkgICAgaWYgKGdvdF9pbnQpCisJCWJyZWFrOworCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAiJWMgJTJkICU1bGQgJTRkICIsCisJCWkgPT0gY3Vyd2luLT53X2p1bXBsaXN0aWR4ID8gJz4nIDogJyAnLAorCQlpID4gY3Vyd2luLT53X2p1bXBsaXN0aWR4ID8gaSAtIGN1cndpbi0+d19qdW1wbGlzdGlkeAorCQkJCQkgIDogY3Vyd2luLT53X2p1bXBsaXN0aWR4IC0gaSwKKwkJY3Vyd2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLm1hcmsubG51bSwKKwkJY3Vyd2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLm1hcmsuY29sKTsKKwkgICAgbXNnX291dHRyYW5zKElPYnVmZik7CisJICAgIG1zZ19vdXR0cmFuc19hdHRyKG5hbWUsCisJCQkgICAgY3Vyd2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLmZudW0gPT0gY3VyYnVmLT5iX2ZudW0KKwkJCQkJCQk/IGhsX2F0dHIoSExGX0QpIDogMCk7CisJICAgIHZpbV9mcmVlKG5hbWUpOworCSAgICB1aV9icmVha2NoZWNrKCk7CisJfQorCW91dF9mbHVzaCgpOworICAgIH0KKyAgICBpZiAoY3Vyd2luLT53X2p1bXBsaXN0aWR4ID09IGN1cndpbi0+d19qdW1wbGlzdGxlbikKKwlNU0dfUFVUUygiXG4+Iik7Cit9CisKKy8qCisgKiBwcmludCB0aGUgY2hhbmdlbGlzdAorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitleF9jaGFuZ2VzKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqbmFtZTsKKworICAgIC8qIEhpZ2hsaWdodCB0aXRsZSAqLworICAgIE1TR19QVVRTX1RJVExFKF8oIlxuY2hhbmdlIGxpbmUgIGNvbCB0ZXh0IikpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuICYmICFnb3RfaW50OyArK2kpCisgICAgeworCWlmIChjdXJidWYtPmJfY2hhbmdlbGlzdFtpXS5sbnVtICE9IDApCisJeworCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKwkgICAgaWYgKGdvdF9pbnQpCisJCWJyZWFrOworCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAiJWMgJTNkICU1bGQgJTRkICIsCisJCSAgICBpID09IGN1cndpbi0+d19jaGFuZ2VsaXN0aWR4ID8gJz4nIDogJyAnLAorCQkgICAgaSA+IGN1cndpbi0+d19jaGFuZ2VsaXN0aWR4ID8gaSAtIGN1cndpbi0+d19jaGFuZ2VsaXN0aWR4CisJCQkJCQk6IGN1cndpbi0+d19jaGFuZ2VsaXN0aWR4IC0gaSwKKwkJICAgIChsb25nKWN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0W2ldLmxudW0sCisJCSAgICBjdXJidWYtPmJfY2hhbmdlbGlzdFtpXS5jb2wpOworCSAgICBtc2dfb3V0dHJhbnMoSU9idWZmKTsKKwkgICAgbmFtZSA9IG1hcmtfbGluZSgmY3VyYnVmLT5iX2NoYW5nZWxpc3RbaV0sIDE3KTsKKwkgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIG1zZ19vdXR0cmFuc19hdHRyKG5hbWUsIGhsX2F0dHIoSExGX0QpKTsKKwkgICAgdmltX2ZyZWUobmFtZSk7CisJICAgIHVpX2JyZWFrY2hlY2soKTsKKwl9CisJb3V0X2ZsdXNoKCk7CisgICAgfQorICAgIGlmIChjdXJ3aW4tPndfY2hhbmdlbGlzdGlkeCA9PSBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbikKKwlNU0dfUFVUUygiXG4+Iik7Cit9CisjZW5kaWYKKworI2RlZmluZSBvbmVfYWRqdXN0KGFkZCkgXAorICAgIHsgXAorCWxwID0gYWRkOyBcCisJaWYgKCpscCA+PSBsaW5lMSAmJiAqbHAgPD0gbGluZTIpIFwKKwl7IFwKKwkgICAgaWYgKGFtb3VudCA9PSBNQVhMTlVNKSBcCisJCSpscCA9IDA7IFwKKwkgICAgZWxzZSBcCisJCSpscCArPSBhbW91bnQ7IFwKKwl9IFwKKwllbHNlIGlmIChhbW91bnRfYWZ0ZXIgJiYgKmxwID4gbGluZTIpIFwKKwkgICAgKmxwICs9IGFtb3VudF9hZnRlcjsgXAorICAgIH0KKworLyogZG9uJ3QgZGVsZXRlIHRoZSBsaW5lLCBqdXN0IHB1dCBhdCBmaXJzdCBkZWxldGVkIGxpbmUgKi8KKyNkZWZpbmUgb25lX2FkanVzdF9ub2RlbChhZGQpIFwKKyAgICB7IFwKKwlscCA9IGFkZDsgXAorCWlmICgqbHAgPj0gbGluZTEgJiYgKmxwIDw9IGxpbmUyKSBcCisJeyBcCisJICAgIGlmIChhbW91bnQgPT0gTUFYTE5VTSkgXAorCQkqbHAgPSBsaW5lMTsgXAorCSAgICBlbHNlIFwKKwkJKmxwICs9IGFtb3VudDsgXAorCX0gXAorCWVsc2UgaWYgKGFtb3VudF9hZnRlciAmJiAqbHAgPiBsaW5lMikgXAorCSAgICAqbHAgKz0gYW1vdW50X2FmdGVyOyBcCisgICAgfQorCisvKgorICogQWRqdXN0IG1hcmtzIGJldHdlZW4gbGluZTEgYW5kIGxpbmUyIChpbmNsdXNpdmUpIHRvIG1vdmUgJ2Ftb3VudCcgbGluZXMuCisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdlZF8qKCksIGFwcGVuZGVkX2xpbmVzKCkgb3IgZGVsZXRlZF9saW5lcygpLgorICogTWF5IGJlIGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgY2hhbmdpbmcgdGhlIHRleHQuCisgKiBXaGVuIGRlbGV0aW5nIGxpbmVzIGxpbmUxIHRvIGxpbmUyLCB1c2UgYW4gJ2Ftb3VudCcgb2YgTUFYTE5VTTogVGhlIG1hcmtzCisgKiB3aXRoaW4gdGhpcyByYW5nZSBhcmUgbWFkZSBpbnZhbGlkLgorICogSWYgJ2Ftb3VudF9hZnRlcicgaXMgbm9uLXplcm8gYWRqdXN0IG1hcmtzIGFmdGVyIGxpbmUyLgorICogRXhhbXBsZTogRGVsZXRlIGxpbmVzIDM0IGFuZCAzNTogbWFya19hZGp1c3QoMzQsIDM1LCBNQVhMTlVNLCAtMik7CisgKiBFeGFtcGxlOiBJbnNlcnQgdHdvIGxpbmVzIGJlbG93IDU1OiBtYXJrX2FkanVzdCg1NiwgTUFYTE5VTSwgMiwgMCk7CisgKgkJCQkgICBvcjogbWFya19hZGp1c3QoNTYsIDU1LCBNQVhMTlVNLCAyKTsKKyAqLworICAgIHZvaWQKK21hcmtfYWRqdXN0KGxpbmUxLCBsaW5lMiwgYW1vdW50LCBhbW91bnRfYWZ0ZXIpCisgICAgbGluZW5yX1QJbGluZTE7CisgICAgbGluZW5yX1QJbGluZTI7CisgICAgbG9uZwlhbW91bnQ7CisgICAgbG9uZwlhbW91bnRfYWZ0ZXI7Cit7CisgICAgaW50CQlpOworICAgIGludAkJZm51bSA9IGN1cmJ1Zi0+Yl9mbnVtOworICAgIGxpbmVucl9UCSpscDsKKyAgICB3aW5fVAkqd2luOworCisgICAgaWYgKGxpbmUyIDwgbGluZTEgJiYgYW1vdW50X2FmdGVyID09IDBMKQkgICAgLyogbm90aGluZyB0byBkbyAqLworCXJldHVybjsKKworICAgIGlmICghY21kbW9kLmxvY2ttYXJrcykKKyAgICB7CisJLyogbmFtZWQgbWFya3MsIGxvd2VyIGNhc2UgYW5kIHVwcGVyIGNhc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTk1BUktTOyBpKyspCisJeworCSAgICBvbmVfYWRqdXN0KCYoY3VyYnVmLT5iX25hbWVkbVtpXS5sbnVtKSk7CisJICAgIGlmIChuYW1lZGZtW2ldLmZtYXJrLmZudW0gPT0gZm51bSkKKwkJb25lX2FkanVzdF9ub2RlbCgmKG5hbWVkZm1baV0uZm1hcmsubWFyay5sbnVtKSk7CisJfQorCWZvciAoaSA9IE5NQVJLUzsgaSA8IE5NQVJLUyArIEVYVFJBX01BUktTOyBpKyspCisJeworCSAgICBpZiAobmFtZWRmbVtpXS5mbWFyay5mbnVtID09IGZudW0pCisJCW9uZV9hZGp1c3Rfbm9kZWwoJihuYW1lZGZtW2ldLmZtYXJrLm1hcmsubG51bSkpOworCX0KKworCS8qIGxhc3QgSW5zZXJ0IHBvc2l0aW9uICovCisJb25lX2FkanVzdCgmKGN1cmJ1Zi0+Yl9sYXN0X2luc2VydC5sbnVtKSk7CisKKwkvKiBsYXN0IGNoYW5nZSBwb3NpdGlvbiAqLworCW9uZV9hZGp1c3QoJihjdXJidWYtPmJfbGFzdF9jaGFuZ2UubG51bSkpOworCisjaWZkZWYgRkVBVF9KVU1QTElTVAorCS8qIGxpc3Qgb2YgY2hhbmdlIHBvc2l0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbjsgKytpKQorCSAgICBvbmVfYWRqdXN0X25vZGVsKCYoY3VyYnVmLT5iX2NoYW5nZWxpc3RbaV0ubG51bSkpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCS8qIFZpc3VhbCBhcmVhICovCisJb25lX2FkanVzdF9ub2RlbCgmKGN1cmJ1Zi0+Yl92aXN1YWxfc3RhcnQubG51bSkpOworCW9uZV9hZGp1c3Rfbm9kZWwoJihjdXJidWYtPmJfdmlzdWFsX2VuZC5sbnVtKSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkvKiBxdWlja2ZpeCBtYXJrcyAqLworCXFmX21hcmtfYWRqdXN0KGxpbmUxLCBsaW5lMiwgYW1vdW50LCBhbW91bnRfYWZ0ZXIpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NJR05TCisJc2lnbl9tYXJrX2FkanVzdChsaW5lMSwgbGluZTIsIGFtb3VudCwgYW1vdW50X2FmdGVyKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIHByZXZpb3VzIGNvbnRleHQgbWFyayAqLworICAgIG9uZV9hZGp1c3QoJihjdXJ3aW4tPndfcGNtYXJrLmxudW0pKTsKKworICAgIC8qIHByZXZpb3VzIHBjbWFyayAqLworICAgIG9uZV9hZGp1c3QoJihjdXJ3aW4tPndfcHJldl9wY21hcmsubG51bSkpOworCisgICAgLyogc2F2ZWQgY3Vyc29yIGZvciBmb3JtYXR0aW5nICovCisgICAgaWYgKHNhdmVkX2N1cnNvci5sbnVtICE9IDApCisJb25lX2FkanVzdF9ub2RlbCgmKHNhdmVkX2N1cnNvci5sbnVtKSk7CisKKyAgICAvKgorICAgICAqIEFkanVzdCBpdGVtcyBpbiBhbGwgd2luZG93cyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBGT1JfQUxMX1dJTkRPV1Mod2luKQorICAgIHsKKyNpZmRlZiBGRUFUX0pVTVBMSVNUCisJaWYgKCFjbWRtb2QubG9ja21hcmtzKQorCSAgICAvKiBNYXJrcyBpbiB0aGUganVtcGxpc3QuICBXaGVuIGRlbGV0aW5nIGxpbmVzLCB0aGlzIG1heSBjcmVhdGUKKwkgICAgICogZHVwbGljYXRlIG1hcmtzIGluIHRoZSBqdW1wbGlzdCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIuICovCisJICAgIGZvciAoaSA9IDA7IGkgPCB3aW4tPndfanVtcGxpc3RsZW47ICsraSkKKwkJaWYgKHdpbi0+d19qdW1wbGlzdFtpXS5mbWFyay5mbnVtID09IGZudW0pCisJCSAgICBvbmVfYWRqdXN0X25vZGVsKCYod2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLm1hcmsubG51bSkpOworI2VuZGlmCisKKwlpZiAod2luLT53X2J1ZmZlciA9PSBjdXJidWYpCisJeworCSAgICBpZiAoIWNtZG1vZC5sb2NrbWFya3MpCisJCS8qIG1hcmtzIGluIHRoZSB0YWcgc3RhY2sgKi8KKwkJZm9yIChpID0gMDsgaSA8IHdpbi0+d190YWdzdGFja2xlbjsgaSsrKQorCQkgICAgaWYgKHdpbi0+d190YWdzdGFja1tpXS5mbWFyay5mbnVtID09IGZudW0pCisJCQlvbmVfYWRqdXN0X25vZGVsKCYod2luLT53X3RhZ3N0YWNrW2ldLmZtYXJrLm1hcmsubG51bSkpOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgLyogdGhlIGRpc3BsYXllZCBWaXN1YWwgYXJlYSAqLworCSAgICBpZiAod2luLT53X29sZF9jdXJzb3JfbG51bSAhPSAwKQorCSAgICB7CisJCW9uZV9hZGp1c3Rfbm9kZWwoJih3aW4tPndfb2xkX2N1cnNvcl9sbnVtKSk7CisJCW9uZV9hZGp1c3Rfbm9kZWwoJih3aW4tPndfb2xkX3Zpc3VhbF9sbnVtKSk7CisJICAgIH0KKyNlbmRpZgorCisJICAgIC8qIHRvcGxpbmUgYW5kIGN1cnNvciBwb3NpdGlvbiBmb3Igd2luZG93cyB3aXRoIHRoZSBzYW1lIGJ1ZmZlcgorCSAgICAgKiBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHdpbmRvdyAqLworCSAgICBpZiAod2luICE9IGN1cndpbikKKwkgICAgeworCQlpZiAod2luLT53X3RvcGxpbmUgPj0gbGluZTEgJiYgd2luLT53X3RvcGxpbmUgPD0gbGluZTIpCisJCXsKKwkJICAgIGlmIChhbW91bnQgPT0gTUFYTE5VTSkJICAgIC8qIHRvcGxpbmUgaXMgZGVsZXRlZCAqLworCQkgICAgeworCQkJaWYgKGxpbmUxIDw9IDEpCisJCQkgICAgd2luLT53X3RvcGxpbmUgPSAxOworCQkJZWxzZQorCQkJICAgIHdpbi0+d190b3BsaW5lID0gbGluZTEgLSAxOworCQkgICAgfQorCQkgICAgZWxzZQkJLyoga2VlcCB0b3BsaW5lIG9uIHRoZSBzYW1lIGxpbmUgKi8KKwkJCXdpbi0+d190b3BsaW5lICs9IGFtb3VudDsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIHdpbi0+d190b3BmaWxsID0gMDsKKyNlbmRpZgorCQl9CisJCWVsc2UgaWYgKGFtb3VudF9hZnRlciAmJiB3aW4tPndfdG9wbGluZSA+IGxpbmUyKQorCQl7CisJCSAgICB3aW4tPndfdG9wbGluZSArPSBhbW91bnRfYWZ0ZXI7CisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICB3aW4tPndfdG9wZmlsbCA9IDA7CisjZW5kaWYKKwkJfQorCQlpZiAod2luLT53X2N1cnNvci5sbnVtID49IGxpbmUxICYmIHdpbi0+d19jdXJzb3IubG51bSA8PSBsaW5lMikKKwkJeworCQkgICAgaWYgKGFtb3VudCA9PSBNQVhMTlVNKSAvKiBsaW5lIHdpdGggY3Vyc29yIGlzIGRlbGV0ZWQgKi8KKwkJICAgIHsKKwkJCWlmIChsaW5lMSA8PSAxKQorCQkJICAgIHdpbi0+d19jdXJzb3IubG51bSA9IDE7CisJCQllbHNlCisJCQkgICAgd2luLT53X2N1cnNvci5sbnVtID0gbGluZTEgLSAxOworCQkJd2luLT53X2N1cnNvci5jb2wgPSAwOworCQkgICAgfQorCQkgICAgZWxzZQkJLyoga2VlcCBjdXJzb3Igb24gdGhlIHNhbWUgbGluZSAqLworCQkJd2luLT53X2N1cnNvci5sbnVtICs9IGFtb3VudDsKKwkJfQorCQllbHNlIGlmIChhbW91bnRfYWZ0ZXIgJiYgd2luLT53X2N1cnNvci5sbnVtID4gbGluZTIpCisJCSAgICB3aW4tPndfY3Vyc29yLmxudW0gKz0gYW1vdW50X2FmdGVyOworCSAgICB9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgLyogYWRqdXN0IGZvbGRzICovCisJICAgIGZvbGRNYXJrQWRqdXN0KHdpbiwgbGluZTEsIGxpbmUyLCBhbW91bnQsIGFtb3VudF9hZnRlcik7CisjZW5kaWYKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9ESUZGCisgICAgLyogYWRqdXN0IGRpZmZzICovCisgICAgZGlmZl9tYXJrX2FkanVzdChsaW5lMSwgbGluZTIsIGFtb3VudCwgYW1vdW50X2FmdGVyKTsKKyNlbmRpZgorfQorCisvKiBUaGlzIGNvZGUgaXMgdXNlZCBvZnRlbiwgbmVlZHMgdG8gYmUgZmFzdC4gKi8KKyNkZWZpbmUgY29sX2FkanVzdChwcCkgXAorICAgIHsgXAorCXBvc3AgPSBwcDsgXAorCWlmIChwb3NwLT5sbnVtID09IGxudW0gJiYgcG9zcC0+Y29sID49IG1pbmNvbCkgXAorCXsgXAorCSAgICBwb3NwLT5sbnVtICs9IGxudW1fYW1vdW50OyBcCisJICAgIGlmIChjb2xfYW1vdW50IDwgMCAmJiBwb3NwLT5jb2wgPD0gKGNvbG5yX1QpLWNvbF9hbW91bnQpIFwKKwkJcG9zcC0+Y29sID0gMDsgXAorCSAgICBlbHNlIFwKKwkJcG9zcC0+Y29sICs9IGNvbF9hbW91bnQ7IFwKKwl9IFwKKyAgICB9CisKKy8qCisgKiBBZGp1c3QgbWFya3MgaW4gbGluZSAibG51bSIgYXQgY29sdW1uICJtaW5jb2wiIGFuZCBmdXJ0aGVyOiBhZGQKKyAqICJsbnVtX2Ftb3VudCIgdG8gdGhlIGxpbmUgbnVtYmVyIGFuZCBhZGQgImNvbF9hbW91bnQiIHRvIHRoZSBjb2x1bW4KKyAqIHBvc2l0aW9uLgorICovCisgICAgdm9pZAorbWFya19jb2xfYWRqdXN0KGxudW0sIG1pbmNvbCwgbG51bV9hbW91bnQsIGNvbF9hbW91bnQpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjb2xucl9UCW1pbmNvbDsKKyAgICBsb25nCWxudW1fYW1vdW50OworICAgIGxvbmcJY29sX2Ftb3VudDsKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQlmbnVtID0gY3VyYnVmLT5iX2ZudW07CisgICAgd2luX1QJKndpbjsKKyAgICBwb3NfVAkqcG9zcDsKKworICAgIGlmICgoY29sX2Ftb3VudCA9PSAwTCAmJiBsbnVtX2Ftb3VudCA9PSAwTCkgfHwgY21kbW9kLmxvY2ttYXJrcykKKwlyZXR1cm47IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAgIC8qIG5hbWVkIG1hcmtzLCBsb3dlciBjYXNlIGFuZCB1cHBlciBjYXNlICovCisgICAgZm9yIChpID0gMDsgaSA8IE5NQVJLUzsgaSsrKQorICAgIHsKKwljb2xfYWRqdXN0KCYoY3VyYnVmLT5iX25hbWVkbVtpXSkpOworCWlmIChuYW1lZGZtW2ldLmZtYXJrLmZudW0gPT0gZm51bSkKKwkgICAgY29sX2FkanVzdCgmKG5hbWVkZm1baV0uZm1hcmsubWFyaykpOworICAgIH0KKyAgICBmb3IgKGkgPSBOTUFSS1M7IGkgPCBOTUFSS1MgKyBFWFRSQV9NQVJLUzsgaSsrKQorICAgIHsKKwlpZiAobmFtZWRmbVtpXS5mbWFyay5mbnVtID09IGZudW0pCisJICAgIGNvbF9hZGp1c3QoJihuYW1lZGZtW2ldLmZtYXJrLm1hcmspKTsKKyAgICB9CisKKyAgICAvKiBsYXN0IEluc2VydCBwb3NpdGlvbiAqLworICAgIGNvbF9hZGp1c3QoJihjdXJidWYtPmJfbGFzdF9pbnNlcnQpKTsKKworICAgIC8qIGxhc3QgY2hhbmdlIHBvc2l0aW9uICovCisgICAgY29sX2FkanVzdCgmKGN1cmJ1Zi0+Yl9sYXN0X2NoYW5nZSkpOworCisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIC8qIGxpc3Qgb2YgY2hhbmdlIHBvc2l0aW9ucyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbjsgKytpKQorCWNvbF9hZGp1c3QoJihjdXJidWYtPmJfY2hhbmdlbGlzdFtpXSkpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIFZpc3VhbCBhcmVhICovCisgICAgY29sX2FkanVzdCgmKGN1cmJ1Zi0+Yl92aXN1YWxfc3RhcnQpKTsKKyAgICBjb2xfYWRqdXN0KCYoY3VyYnVmLT5iX3Zpc3VhbF9lbmQpKTsKKyNlbmRpZgorCisgICAgLyogcHJldmlvdXMgY29udGV4dCBtYXJrICovCisgICAgY29sX2FkanVzdCgmKGN1cndpbi0+d19wY21hcmspKTsKKworICAgIC8qIHByZXZpb3VzIHBjbWFyayAqLworICAgIGNvbF9hZGp1c3QoJihjdXJ3aW4tPndfcHJldl9wY21hcmspKTsKKworICAgIC8qIHNhdmVkIGN1cnNvciBmb3IgZm9ybWF0dGluZyAqLworICAgIGNvbF9hZGp1c3QoJnNhdmVkX2N1cnNvcik7CisKKyAgICAvKgorICAgICAqIEFkanVzdCBpdGVtcyBpbiBhbGwgd2luZG93cyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBGT1JfQUxMX1dJTkRPV1Mod2luKQorICAgIHsKKyNpZmRlZiBGRUFUX0pVTVBMSVNUCisJLyogbWFya3MgaW4gdGhlIGp1bXBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IHdpbi0+d19qdW1wbGlzdGxlbjsgKytpKQorCSAgICBpZiAod2luLT53X2p1bXBsaXN0W2ldLmZtYXJrLmZudW0gPT0gZm51bSkKKwkJY29sX2FkanVzdCgmKHdpbi0+d19qdW1wbGlzdFtpXS5mbWFyay5tYXJrKSk7CisjZW5kaWYKKworCWlmICh3aW4tPndfYnVmZmVyID09IGN1cmJ1ZikKKwl7CisJICAgIC8qIG1hcmtzIGluIHRoZSB0YWcgc3RhY2sgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IHdpbi0+d190YWdzdGFja2xlbjsgaSsrKQorCQlpZiAod2luLT53X3RhZ3N0YWNrW2ldLmZtYXJrLmZudW0gPT0gZm51bSkKKwkJICAgIGNvbF9hZGp1c3QoJih3aW4tPndfdGFnc3RhY2tbaV0uZm1hcmsubWFyaykpOworCisJICAgIC8qIGN1cnNvciBwb3NpdGlvbiBmb3Igb3RoZXIgd2luZG93cyB3aXRoIHRoZSBzYW1lIGJ1ZmZlciAqLworCSAgICBpZiAod2luICE9IGN1cndpbikKKwkJY29sX2FkanVzdCgmd2luLT53X2N1cnNvcik7CisJfQorICAgIH0KK30KKworI2lmZGVmIEZFQVRfSlVNUExJU1QKKy8qCisgKiBXaGVuIGRlbGV0aW5nIGxpbmVzLCB0aGlzIG1heSBjcmVhdGUgZHVwbGljYXRlIG1hcmtzIGluIHRoZQorICoganVtcGxpc3QuIFRoZXkgd2lsbCBiZSByZW1vdmVkIGhlcmUgZm9yIHRoZSBjdXJyZW50IHdpbmRvdy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjbGVhbnVwX2p1bXBsaXN0KCkKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICBmcm9tLCB0bzsKKworICAgIHRvID0gMDsKKyAgICBmb3IgKGZyb20gPSAwOyBmcm9tIDwgY3Vyd2luLT53X2p1bXBsaXN0bGVuOyArK2Zyb20pCisgICAgeworCWlmIChjdXJ3aW4tPndfanVtcGxpc3RpZHggPT0gZnJvbSkKKwkgICAgY3Vyd2luLT53X2p1bXBsaXN0aWR4ID0gdG87CisJZm9yIChpID0gZnJvbSArIDE7IGkgPCBjdXJ3aW4tPndfanVtcGxpc3RsZW47ICsraSkKKwkgICAgaWYgKGN1cndpbi0+d19qdW1wbGlzdFtpXS5mbWFyay5mbnVtCisJCQkJCT09IGN1cndpbi0+d19qdW1wbGlzdFtmcm9tXS5mbWFyay5mbnVtCisJCSAgICAmJiBjdXJ3aW4tPndfanVtcGxpc3RbZnJvbV0uZm1hcmsuZm51bSAhPSAwCisJCSAgICAmJiBjdXJ3aW4tPndfanVtcGxpc3RbaV0uZm1hcmsubWFyay5sbnVtCisJCQkJICA9PSBjdXJ3aW4tPndfanVtcGxpc3RbZnJvbV0uZm1hcmsubWFyay5sbnVtKQorCQlicmVhazsKKwlpZiAoaSA+PSBjdXJ3aW4tPndfanVtcGxpc3RsZW4pCSAgICAvKiBubyBkdXBsaWNhdGUgKi8KKwkgICAgY3Vyd2luLT53X2p1bXBsaXN0W3RvKytdID0gY3Vyd2luLT53X2p1bXBsaXN0W2Zyb21dOworCWVsc2UKKwkgICAgdmltX2ZyZWUoY3Vyd2luLT53X2p1bXBsaXN0W2Zyb21dLmZuYW1lKTsKKyAgICB9CisgICAgaWYgKGN1cndpbi0+d19qdW1wbGlzdGlkeCA9PSBjdXJ3aW4tPndfanVtcGxpc3RsZW4pCisJY3Vyd2luLT53X2p1bXBsaXN0aWR4ID0gdG87CisgICAgY3Vyd2luLT53X2p1bXBsaXN0bGVuID0gdG87Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29weSB0aGUganVtcGxpc3QgZnJvbSB3aW5kb3cgImZyb20iIHRvIHdpbmRvdyAidG8iLgorICovCisgICAgdm9pZAorY29weV9qdW1wbGlzdChmcm9tLCB0bykKKyAgICB3aW5fVAkqZnJvbTsKKyAgICB3aW5fVAkqdG87Cit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyb20tPndfanVtcGxpc3RsZW47ICsraSkKKyAgICB7CisJdG8tPndfanVtcGxpc3RbaV0gPSBmcm9tLT53X2p1bXBsaXN0W2ldOworCWlmIChmcm9tLT53X2p1bXBsaXN0W2ldLmZuYW1lICE9IE5VTEwpCisJICAgIHRvLT53X2p1bXBsaXN0W2ldLmZuYW1lID0gdmltX3N0cnNhdmUoZnJvbS0+d19qdW1wbGlzdFtpXS5mbmFtZSk7CisgICAgfQorICAgIHRvLT53X2p1bXBsaXN0bGVuID0gZnJvbS0+d19qdW1wbGlzdGxlbjsKKyAgICB0by0+d19qdW1wbGlzdGlkeCA9IGZyb20tPndfanVtcGxpc3RpZHg7Cit9CisKKy8qCisgKiBGcmVlIGl0ZW1zIGluIHRoZSBqdW1wbGlzdCBvZiB3aW5kb3cgIndwIi4KKyAqLworICAgIHZvaWQKK2ZyZWVfanVtcGxpc3Qod3ApCisgICAgd2luX1QJKndwOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3cC0+d19qdW1wbGlzdGxlbjsgKytpKQorCXZpbV9mcmVlKHdwLT53X2p1bXBsaXN0W2ldLmZuYW1lKTsKK30KKyMgZW5kaWYKKyNlbmRpZiAvKiBGRUFUX0pVTVBMSVNUICovCisKKyAgICB2b2lkCitzZXRfbGFzdF9jdXJzb3Iod2luKQorICAgIHdpbl9UCSp3aW47Cit7CisgICAgd2luLT53X2J1ZmZlci0+Yl9sYXN0X2N1cnNvciA9IHdpbi0+d19jdXJzb3I7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVklNSU5GTykgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK3JlYWRfdmltaW5mb19maWxlbWFyayh2aXJwLCBmb3JjZSkKKyAgICB2aXJfVAkqdmlycDsKKyAgICBpbnQJCWZvcmNlOworeworICAgIGNoYXJfdQkqc3RyOworICAgIHhmbWFya19UCSpmbTsKKyAgICBpbnQJCWk7CisKKyAgICAvKiBXZSBvbmx5IGdldCBoZXJlIGlmIGxpbmVbMF0gPT0gJ1wnJyBvciAnLScuCisgICAgICogSWxsZWdhbCBtYXJrIG5hbWVzIGFyZSBpZ25vcmVkIChmb3IgZnV0dXJlIGV4cGFuc2lvbikuICovCisgICAgc3RyID0gdmlycC0+dmlyX2xpbmUgKyAxOworICAgIGlmICgKKyNpZm5kZWYgRUJDRElDCisJICAgICpzdHIgPD0gMTI3ICYmCisjZW5kaWYKKwkgICAgKCgqdmlycC0+dmlyX2xpbmUgPT0gJ1wnJyAmJiAoVklNX0lTRElHSVQoKnN0cikgfHwgaXN1cHBlcigqc3RyKSkpCisJICAgICB8fCAoKnZpcnAtPnZpcl9saW5lID09ICctJyAmJiAqc3RyID09ICdcJycpKSkKKyAgICB7CisJaWYgKCpzdHIgPT0gJ1wnJykKKwl7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorCSAgICAvKiBJZiB0aGUganVtcGxpc3QgaXNuJ3QgZnVsbCBpbnNlcnQgZm1hcmsgYXMgb2xkZXN0IGVudHJ5ICovCisJICAgIGlmIChjdXJ3aW4tPndfanVtcGxpc3RsZW4gPT0gSlVNUExJU1RTSVpFKQorCQlmbSA9IE5VTEw7CisJICAgIGVsc2UKKwkgICAgeworCQlmb3IgKGkgPSBjdXJ3aW4tPndfanVtcGxpc3RsZW47IGkgPiAwOyAtLWkpCisJCSAgICBjdXJ3aW4tPndfanVtcGxpc3RbaV0gPSBjdXJ3aW4tPndfanVtcGxpc3RbaSAtIDFdOworCQkrK2N1cndpbi0+d19qdW1wbGlzdGlkeDsKKwkJKytjdXJ3aW4tPndfanVtcGxpc3RsZW47CisJCWZtID0gJmN1cndpbi0+d19qdW1wbGlzdFswXTsKKwkJZm0tPmZtYXJrLm1hcmsubG51bSA9IDA7CisJCWZtLT5mbmFtZSA9IE5VTEw7CisJICAgIH0KKyNlbHNlCisJICAgIGZtID0gTlVMTDsKKyNlbmRpZgorCX0KKwllbHNlIGlmIChWSU1fSVNESUdJVCgqc3RyKSkKKwkgICAgZm0gPSAmbmFtZWRmbVsqc3RyIC0gJzAnICsgTk1BUktTXTsKKwllbHNlCisJICAgIGZtID0gJm5hbWVkZm1bKnN0ciAtICdBJ107CisJaWYgKGZtICE9IE5VTEwgJiYgKGZtLT5mbWFyay5tYXJrLmxudW0gPT0gMCB8fCBmb3JjZSkpCisJeworCSAgICBzdHIgPSBza2lwd2hpdGUoc3RyICsgMSk7CisJICAgIGZtLT5mbWFyay5tYXJrLmxudW0gPSBnZXRkaWdpdHMoJnN0cik7CisJICAgIHN0ciA9IHNraXB3aGl0ZShzdHIpOworCSAgICBmbS0+Zm1hcmsubWFyay5jb2wgPSBnZXRkaWdpdHMoJnN0cik7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBmbS0+Zm1hcmsubWFyay5jb2xhZGQgPSAwOworI2VuZGlmCisJICAgIGZtLT5mbWFyay5mbnVtID0gMDsKKwkgICAgc3RyID0gc2tpcHdoaXRlKHN0cik7CisJICAgIHZpbV9mcmVlKGZtLT5mbmFtZSk7CisJICAgIGZtLT5mbmFtZSA9IHZpbWluZm9fcmVhZHN0cmluZyh2aXJwLCAoaW50KShzdHIgLSB2aXJwLT52aXJfbGluZSksCisJCQkJCQkJCSAgICAgICBGQUxTRSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gdmltX2ZnZXRzKHZpcnAtPnZpcl9saW5lLCBMU0laRSwgdmlycC0+dmlyX2ZkKTsKK30KKworICAgIHZvaWQKK3dyaXRlX3ZpbWluZm9fZmlsZW1hcmtzKGZwKQorICAgIEZJTEUJKmZwOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgYnVmX1QJKmJ1ZjsKKyAgICB4Zm1hcmtfVAkqZm07CisKKyAgICBpZiAoZ2V0X3ZpbWluZm9fcGFyYW1ldGVyKCdmJykgPT0gMCkKKwlyZXR1cm47CisKKyAgICBmcHJpbnRmKGZwLCBfKCJcbiMgRmlsZSBtYXJrczpcbiIpKTsKKworICAgIC8qCisgICAgICogRmluZCBhIG1hcmsgdGhhdCBpcyB0aGUgc2FtZSBmaWxlIGFuZCBwb3NpdGlvbiBhcyB0aGUgY3Vyc29yLgorICAgICAqIFRoYXQgb25lLCBvciBlbHNlIHRoZSBsYXN0IG9uZSBpcyBkZWxldGVkLgorICAgICAqIE1vdmUgJzAgdG8gJzEsICcxIHRvICcyLCBldGMuIHVudGlsIHRoZSBtYXRjaGluZyBvbmUgb3IgJzkKKyAgICAgKiBTZXQgJzAgbWFyayB0byBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMICYmICFyZW1vdmFibGUoY3VyYnVmLT5iX2ZmbmFtZSkpCisgICAgeworCW5hbWUgPSBidWZsaXN0X25yMm5hbWUoY3VyYnVmLT5iX2ZudW0sIFRSVUUsIEZBTFNFKTsKKwlmb3IgKGkgPSBOTUFSS1M7IGkgPCBOTUFSS1MgKyBFWFRSQV9NQVJLUyAtIDE7ICsraSkKKwkgICAgaWYgKG5hbWVkZm1baV0uZm1hcmsubWFyay5sbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bQorCQkgICAgJiYgKG5hbWVkZm1baV0uZm5hbWUgPT0gTlVMTAorCQkJICAgID8gbmFtZWRmbVtpXS5mbWFyay5mbnVtID09IGN1cmJ1Zi0+Yl9mbnVtCisJCQkgICAgOiAobmFtZSAhPSBOVUxMCisJCQkJICAgICYmIFNUUkNNUChuYW1lLCBuYW1lZGZtW2ldLmZuYW1lKSA9PSAwKSkpCisJCWJyZWFrOworCXZpbV9mcmVlKG5hbWUpOworCisJdmltX2ZyZWUobmFtZWRmbVtpXS5mbmFtZSk7CisJZm9yICggOyBpID4gTk1BUktTOyAtLWkpCisJICAgIG5hbWVkZm1baV0gPSBuYW1lZGZtW2kgLSAxXTsKKwluYW1lZGZtW05NQVJLU10uZm1hcmsubWFyayA9IGN1cndpbi0+d19jdXJzb3I7CisJbmFtZWRmbVtOTUFSS1NdLmZtYXJrLmZudW0gPSBjdXJidWYtPmJfZm51bTsKKwluYW1lZGZtW05NQVJLU10uZm5hbWUgPSBOVUxMOworICAgIH0KKworICAgIC8qIFdyaXRlIHRoZSBmaWxlbWFya3MgJzAgLSAnOSBhbmQgJ0EgLSAnWiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOTUFSS1MgKyBFWFRSQV9NQVJLUzsgaSsrKQorCXdyaXRlX29uZV9maWxlbWFyayhmcCwgJm5hbWVkZm1baV0sICdcJycsCisJCQkJICAgICBpIDwgTk1BUktTID8gaSArICdBJyA6IGkgLSBOTUFSS1MgKyAnMCcpOworCisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIC8qIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nICovCisgICAgZnByaW50ZihmcCwgXygiXG4jIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIikpOworICAgIHNldHBjbWFyaygpOwkvKiBhZGQgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gKi8KKyAgICBjbGVhbnVwX2p1bXBsaXN0KCk7CisgICAgZm9yIChmbSA9ICZjdXJ3aW4tPndfanVtcGxpc3RbY3Vyd2luLT53X2p1bXBsaXN0bGVuIC0gMV07CisJCQkJCSAgIGZtID49ICZjdXJ3aW4tPndfanVtcGxpc3RbMF07IC0tZm0pCisgICAgeworCWlmIChmbS0+Zm1hcmsuZm51bSA9PSAwCisJCXx8ICgoYnVmID0gYnVmbGlzdF9maW5kbnIoZm0tPmZtYXJrLmZudW0pKSAhPSBOVUxMCisJCSAgICAmJiAhcmVtb3ZhYmxlKGJ1Zi0+Yl9mZm5hbWUpKSkKKwkgICAgd3JpdGVfb25lX2ZpbGVtYXJrKGZwLCBmbSwgJy0nLCAnXCcnKTsKKyAgICB9CisjZW5kaWYKK30KKworICAgIHN0YXRpYyB2b2lkCit3cml0ZV9vbmVfZmlsZW1hcmsoZnAsIGZtLCBjMSwgYzIpCisgICAgRklMRQkqZnA7CisgICAgeGZtYXJrX1QJKmZtOworICAgIGludAkJYzE7CisgICAgaW50CQljMjsKK3sKKyAgICBjaGFyX3UJKm5hbWU7CisKKyAgICBpZiAoZm0tPmZtYXJrLm1hcmsubG51bSA9PSAwKQkvKiBub3Qgc2V0ICovCisJcmV0dXJuOworCisgICAgaWYgKGZtLT5mbWFyay5mbnVtICE9IDApCQkvKiB0aGVyZSBpcyBhIGJ1ZmZlciAqLworCW5hbWUgPSBidWZsaXN0X25yMm5hbWUoZm0tPmZtYXJrLmZudW0sIFRSVUUsIEZBTFNFKTsKKyAgICBlbHNlCisJbmFtZSA9IGZtLT5mbmFtZTsJCS8qIHVzZSBuYW1lIGZyb20gLnZpbWluZm8gKi8KKyAgICBpZiAobmFtZSAhPSBOVUxMICYmICpuYW1lICE9IE5VTCkKKyAgICB7CisJZnByaW50ZihmcCwgIiVjJWMgICVsZCAgJWxkICAiLCBjMSwgYzIsIChsb25nKWZtLT5mbWFyay5tYXJrLmxudW0sCisJCQkJCQkgICAgKGxvbmcpZm0tPmZtYXJrLm1hcmsuY29sKTsKKwl2aW1pbmZvX3dyaXRlc3RyaW5nKGZwLCBuYW1lKTsKKyAgICB9CisKKyAgICBpZiAoZm0tPmZtYXJrLmZudW0gIT0gMCkKKwl2aW1fZnJlZShuYW1lKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBvbiByZW1vdmFibGUgbWVkaWEgKGRlcGVuZGluZyBvbiAndmltaW5mbycpLgorICovCisgICAgaW50CityZW1vdmFibGUobmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOworeworICAgIGNoYXJfdSAgKnA7CisgICAgY2hhcl91ICBwYXJ0WzUxXTsKKyAgICBpbnQJICAgIHJldHZhbCA9IEZBTFNFOworCisgICAgbmFtZSA9IGhvbWVfcmVwbGFjZV9zYXZlKE5VTEwsIG5hbWUpOworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworCWZvciAocCA9IHBfdmltaW5mbzsgKnA7ICkKKwl7CisJICAgIGNvcHlfb3B0aW9uX3BhcnQoJnAsIHBhcnQsIDUxLCAiLCAiKTsKKwkgICAgaWYgKHBhcnRbMF0gPT0gJ3InCisJCQkmJiBNQl9TVFJOSUNNUChwYXJ0ICsgMSwgbmFtZSwgU1RSTEVOKHBhcnQgKyAxKSkgPT0gMCkKKwkgICAgeworCQlyZXR2YWwgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCX0KKwl2aW1fZnJlZShuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfb25lX21hcmsgX19BUkdTKChGSUxFICpmcF9vdXQsIGludCBjLCBwb3NfVCAqcG9zKSk7CisKKy8qCisgKiBXcml0ZSBhbGwgdGhlIG5hbWVkIG1hcmtzIGZvciBhbGwgYnVmZmVycy4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgZm9yIHdoaWNoIG1hcmtzIGhhdmUgYmVlbiB3cml0dGVuLgorICovCisgICAgaW50Cit3cml0ZV92aW1pbmZvX21hcmtzKGZwX291dCkKKyAgICBGSUxFCSpmcF9vdXQ7Cit7CisgICAgaW50CQljb3VudDsKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJaXNfbWFya19zZXQ7CisgICAgaW50CQlpOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHdpbl9UCSp3aW47CisKKyAgICAvKgorICAgICAqIFNldCBiX2xhc3RfY3Vyc29yIGZvciB0aGUgYWxsIGJ1ZmZlcnMgdGhhdCBoYXZlIGEgd2luZG93LgorICAgICAqLworICAgIGZvciAod2luID0gZmlyc3R3aW47IHdpbiAhPSBOVUxMOyB3aW4gPSB3aW4tPndfbmV4dCkKKwlzZXRfbGFzdF9jdXJzb3Iod2luKTsKKyNlbHNlCisJc2V0X2xhc3RfY3Vyc29yKGN1cndpbik7CisjZW5kaWYKKworICAgIGZwcmludGYoZnBfb3V0LCBfKCJcbiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIikpOworICAgIGNvdW50ID0gMDsKKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisgICAgeworCS8qCisJICogT25seSB3cml0ZSBzb21ldGhpbmcgaWYgYnVmZmVyIGhhcyBiZWVuIGxvYWRlZCBhbmQgYXQgbGVhc3Qgb25lCisJICogbWFyayBpcyBzZXQuCisJICovCisJaWYgKGJ1Zi0+Yl9tYXJrc19yZWFkKQorCXsKKwkgICAgaWYgKGJ1Zi0+Yl9sYXN0X2N1cnNvci5sbnVtICE9IDApCisJCWlzX21hcmtfc2V0ID0gVFJVRTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlzX21hcmtfc2V0ID0gRkFMU0U7CisJCWZvciAoaSA9IDA7IGkgPCBOTUFSS1M7IGkrKykKKwkJICAgIGlmIChidWYtPmJfbmFtZWRtW2ldLmxudW0gIT0gMCkKKwkJICAgIHsKKwkJCWlzX21hcmtfc2V0ID0gVFJVRTsKKwkJCWJyZWFrOworCQkgICAgfQorCSAgICB9CisJICAgIGlmIChpc19tYXJrX3NldCAmJiBidWYtPmJfZmZuYW1lICE9IE5VTEwKKwkJICAgICAgJiYgYnVmLT5iX2ZmbmFtZVswXSAhPSBOVUwgJiYgIXJlbW92YWJsZShidWYtPmJfZmZuYW1lKSkKKwkgICAgeworCQlob21lX3JlcGxhY2UoTlVMTCwgYnVmLT5iX2ZmbmFtZSwgSU9idWZmLCBJT1NJWkUsIFRSVUUpOworCQlmcHJpbnRmKGZwX291dCwgIlxuPiAiKTsKKwkJdmltaW5mb193cml0ZXN0cmluZyhmcF9vdXQsIElPYnVmZik7CisJCXdyaXRlX29uZV9tYXJrKGZwX291dCwgJyInLCAmYnVmLT5iX2xhc3RfY3Vyc29yKTsKKwkJd3JpdGVfb25lX21hcmsoZnBfb3V0LCAnXicsICZidWYtPmJfbGFzdF9pbnNlcnQpOworCQl3cml0ZV9vbmVfbWFyayhmcF9vdXQsICcuJywgJmJ1Zi0+Yl9sYXN0X2NoYW5nZSk7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorCQkvKiBjaGFuZ2VsaXN0IHBvc2l0aW9ucyBhcmUgc3RvcmVkIG9sZGVzdCBmaXJzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5iX2NoYW5nZWxpc3RsZW47ICsraSkKKwkJICAgIHdyaXRlX29uZV9tYXJrKGZwX291dCwgJysnLCAmYnVmLT5iX2NoYW5nZWxpc3RbaV0pOworI2VuZGlmCisJCWZvciAoaSA9IDA7IGkgPCBOTUFSS1M7IGkrKykKKwkJICAgIHdyaXRlX29uZV9tYXJrKGZwX291dCwgJ2EnICsgaSwgJmJ1Zi0+Yl9uYW1lZG1baV0pOworCQljb3VudCsrOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworICAgIHN0YXRpYyB2b2lkCit3cml0ZV9vbmVfbWFyayhmcF9vdXQsIGMsIHBvcykKKyAgICBGSUxFCSpmcF9vdXQ7CisgICAgaW50CQljOworICAgIHBvc19UCSpwb3M7Cit7CisgICAgaWYgKHBvcy0+bG51bSAhPSAwKQorCWZwcmludGYoZnBfb3V0LCAiXHQlY1x0JWxkXHQlZFxuIiwgYywgKGxvbmcpcG9zLT5sbnVtLCAoaW50KXBvcy0+Y29sKTsKK30KKworLyoKKyAqIEhhbmRsZSBtYXJrcyBpbiB0aGUgdmltaW5mbyBmaWxlOgorICogZnBfb3V0ID09IE5VTEwgICByZWFkIG1hcmtzIGZvciBjdXJyZW50IGJ1ZmZlciBvbmx5CisgKiBmcF9vdXQgIT0gTlVMTCAgIGNvcHkgbWFya3MgZm9yIGJ1ZmZlcnMgbm90IGluIGJ1ZmZlciBsaXN0CisgKi8KKyAgICB2b2lkCitjb3B5X3ZpbWluZm9fbWFya3ModmlycCwgZnBfb3V0LCBjb3VudCwgZW9mKQorICAgIHZpcl9UCSp2aXJwOworICAgIEZJTEUJKmZwX291dDsKKyAgICBpbnQJCWNvdW50OworICAgIGludAkJZW9mOworeworICAgIGNoYXJfdQkqbGluZSA9IHZpcnAtPnZpcl9saW5lOworICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQludW1fbWFya2VkX2ZpbGVzOworICAgIGludAkJbG9hZF9tYXJrczsKKyAgICBpbnQJCWNvcHlfbWFya3Nfb3V0OworICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpuYW1lX2J1ZjsKKyAgICBwb3NfVAlwb3M7CisKKyAgICBpZiAoKG5hbWVfYnVmID0gYWxsb2MoTFNJWkUpKSA9PSBOVUxMKQorCXJldHVybjsKKyAgICAqbmFtZV9idWYgPSBOVUw7CisgICAgbnVtX21hcmtlZF9maWxlcyA9IGdldF92aW1pbmZvX3BhcmFtZXRlcignXCcnKTsKKyAgICB3aGlsZSAoIWVvZiAmJiAoY291bnQgPCBudW1fbWFya2VkX2ZpbGVzIHx8IGZwX291dCA9PSBOVUxMKSkKKyAgICB7CisJaWYgKGxpbmVbMF0gIT0gJz4nKQorCXsKKwkgICAgaWYgKGxpbmVbMF0gIT0gJ1xuJyAmJiBsaW5lWzBdICE9ICdccicgJiYgbGluZVswXSAhPSAnIycpCisJICAgIHsKKwkJaWYgKHZpbWluZm9fZXJyb3IoIkU1NzY6ICIsIF8oIk1pc3NpbmcgJz4nIiksIGxpbmUpKQorCQkgICAgYnJlYWs7CS8qIHRvbyBtYW55IGVycm9ycywgcmV0dXJuIG5vdyAqLworCSAgICB9CisJICAgIGVvZiA9IHZpbV9mZ2V0cyhsaW5lLCBMU0laRSwgdmlycC0+dmlyX2ZkKTsKKwkgICAgY29udGludWU7CQkvKiBTa2lwIHRoaXMgZHVkIGxpbmUgKi8KKwl9CisKKwkvKgorCSAqIEhhbmRsZSBsb25nIGxpbmUgYW5kIHRyYW5zbGF0ZSBlc2NhcGVkIGNoYXJhY3RlcnMuCisJICogRmluZCBmaWxlIG5hbWUsIHNldCBzdHIgdG8gc3RhcnQuCisJICogSWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlIHNwYWNlLgorCSAqLworCXN0ciA9IHNraXB3aGl0ZShsaW5lICsgMSk7CisJc3RyID0gdmltaW5mb19yZWFkc3RyaW5nKHZpcnAsIChpbnQpKHN0ciAtIHZpcnAtPnZpcl9saW5lKSwgRkFMU0UpOworCWlmIChzdHIgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJcCA9IHN0ciArIFNUUkxFTihzdHIpOworCXdoaWxlIChwICE9IHN0ciAmJiAoKnAgPT0gTlVMIHx8IHZpbV9pc3NwYWNlKCpwKSkpCisJICAgIHAtLTsKKwlpZiAoKnApCisJICAgIHArKzsKKwkqcCA9IE5VTDsKKworCS8qCisJICogSWYgZnBfb3V0ID09IE5VTEwsIGxvYWQgbWFya3MgZm9yIGN1cnJlbnQgYnVmZmVyLgorCSAqIElmIGZwX291dCAhPSBOVUxMLCBjb3B5IG1hcmtzIGZvciBidWZmZXJzIG5vdCBpbiBidWZsaXN0LgorCSAqLworCWxvYWRfbWFya3MgPSBjb3B5X21hcmtzX291dCA9IEZBTFNFOworCWlmIChmcF9vdXQgPT0gTlVMTCkKKwl7CisJICAgIGlmIChjdXJidWYtPmJfZmZuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJaWYgKCpuYW1lX2J1ZiA9PSBOVUwpCSAgICAvKiBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlICovCisJCSAgICBob21lX3JlcGxhY2UoTlVMTCwgY3VyYnVmLT5iX2ZmbmFtZSwgbmFtZV9idWYsIExTSVpFLCBUUlVFKTsKKwkJaWYgKGZuYW1lY21wKHN0ciwgbmFtZV9idWYpID09IDApCisJCSAgICBsb2FkX21hcmtzID0gVFJVRTsKKwkgICAgfQorCX0KKwllbHNlIC8qIGZwX291dCAhPSBOVUxMICovCisJeworCSAgICAvKiBUaGlzIGlzIHNsb3cgaWYgdGhlcmUgYXJlIG1hbnkgYnVmZmVycyEhICovCisJICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwkJaWYgKGJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTCkKKwkJeworCQkgICAgaG9tZV9yZXBsYWNlKE5VTEwsIGJ1Zi0+Yl9mZm5hbWUsIG5hbWVfYnVmLCBMU0laRSwgVFJVRSk7CisJCSAgICBpZiAoZm5hbWVjbXAoc3RyLCBuYW1lX2J1ZikgPT0gMCkKKwkJCWJyZWFrOworCQl9CisKKwkgICAgLyoKKwkgICAgICogY29weSBtYXJrcyBpZiB0aGUgYnVmZmVyIGhhcyBub3QgYmVlbiBsb2FkZWQKKwkgICAgICovCisJICAgIGlmIChidWYgPT0gTlVMTCB8fCAhYnVmLT5iX21hcmtzX3JlYWQpCisJICAgIHsKKwkJY29weV9tYXJrc19vdXQgPSBUUlVFOworCQlmcHV0cygiXG4+ICIsIGZwX291dCk7CisJCXZpbWluZm9fd3JpdGVzdHJpbmcoZnBfb3V0LCBzdHIpOworCQljb3VudCsrOworCSAgICB9CisJfQorCXZpbV9mcmVlKHN0cik7CisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJcG9zLmNvbGFkZCA9IDA7CisjZW5kaWYKKwl3aGlsZSAoIShlb2YgPSB2aW1pbmZvX3JlYWRsaW5lKHZpcnApKSAmJiBsaW5lWzBdID09IFRBQikKKwl7CisJICAgIGlmIChsb2FkX21hcmtzKQorCSAgICB7CisJCWlmIChsaW5lWzFdICE9IE5VTCkKKwkJeworCQkgICAgc3NjYW5mKChjaGFyICopbGluZSArIDIsICIlbGQgJXUiLCAmcG9zLmxudW0sICZwb3MuY29sKTsKKwkJICAgIHN3aXRjaCAobGluZVsxXSkKKwkJICAgIHsKKwkJCWNhc2UgJyInOiBjdXJidWYtPmJfbGFzdF9jdXJzb3IgPSBwb3M7IGJyZWFrOworCQkJY2FzZSAnXic6IGN1cmJ1Zi0+Yl9sYXN0X2luc2VydCA9IHBvczsgYnJlYWs7CisJCQljYXNlICcuJzogY3VyYnVmLT5iX2xhc3RfY2hhbmdlID0gcG9zOyBicmVhazsKKwkJCWNhc2UgJysnOgorI2lmZGVmIEZFQVRfSlVNUExJU1QKKwkJCQkgIC8qIGNoYW5nZWxpc3QgcG9zaXRpb25zIGFyZSBzdG9yZWQgb2xkZXN0CisJCQkJICAgKiBmaXJzdCAqLworCQkJCSAgaWYgKGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuID09IEpVTVBMSVNUU0laRSkKKwkJCQkgICAgICAvKiBsaXN0IGlzIGZ1bGwsIHJlbW92ZSBvbGRlc3QgZW50cnkgKi8KKwkJCQkgICAgICBtY2hfbWVtbW92ZShjdXJidWYtPmJfY2hhbmdlbGlzdCwKKwkJCQkJICAgIGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0ICsgMSwKKwkJCQkJICAgIHNpemVvZihwb3NfVCkgKiAoSlVNUExJU1RTSVpFIC0gMSkpOworCQkJCSAgZWxzZQorCQkJCSAgICAgICsrY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW47CisJCQkJICBjdXJidWYtPmJfY2hhbmdlbGlzdFsKKwkJCQkJICAgY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW4gLSAxXSA9IHBvczsKKyNlbmRpZgorCQkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OiAgaWYgKChpID0gbGluZVsxXSAtICdhJykgPj0gMCAmJiBpIDwgTk1BUktTKQorCQkJCSAgICAgIGN1cmJ1Zi0+Yl9uYW1lZG1baV0gPSBwb3M7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmIChjb3B5X21hcmtzX291dCkKKwkJZnB1dHMoKGNoYXIgKilsaW5lLCBmcF9vdXQpOworCX0KKwlpZiAobG9hZF9tYXJrcykKKwl7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorCSAgICB3aW5fVAkqd3A7CisKKwkgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorCSAgICB7CisJCWlmICh3cC0+d19idWZmZXIgPT0gY3VyYnVmKQorCQkgICAgd3AtPndfY2hhbmdlbGlzdGlkeCA9IGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuOworCSAgICB9CisjZW5kaWYKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShuYW1lX2J1Zik7Cit9CisjZW5kaWYgLyogRkVBVF9WSU1JTkZPICovCmRpZmYgLS1naXQgYS9zcmMvbWJ5dGUuYyBiL3NyYy9tYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTMxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWJ5dGUuYwpAQCAtMCwwICsxLDU4MzMgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqIE11bHRpYnl0ZSBleHRlbnNpb25zIHBhcnRseSBieSBTdW5nLUhvb24gQmFlaworICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIG1ieXRlLmM6IENvZGUgc3BlY2lmaWNhbGx5IGZvciBoYW5kbGluZyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCisgKgorICogVGhlIGVuY29kaW5nIHVzZWQgaW4gdGhlIGNvcmUgaXMgc2V0IHdpdGggJ2VuY29kaW5nJy4gIFdoZW4gJ2VuY29kaW5nJyBpcworICogY2hhbmdlZCwgdGhlIGZvbGxvd2luZyBmb3VyIHZhcmlhYmxlcyBhcmUgc2V0IChmb3Igc3BlZWQpLgorICogQ3VycmVudGx5IHRoZXNlIHR5cGVzIG9mIGNoYXJhY3RlciBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZDoKKyAqCisgKiAiZW5jX2RiY3MiCSAgICBXaGVuIG5vbi16ZXJvIGl0IHRlbGxzIHRoZSB0eXBlIG9mIGRvdWJsZSBieXRlIGNoYXJhY3RlcgorICoJCSAgICBlbmNvZGluZyAoQ2hpbmVzZSwgS29yZWFuLCBKYXBhbmVzZSwgZXRjLikuCisgKgkJICAgIFRoZSBjZWxsIHdpZHRoIG9uIHRoZSBkaXNwbGF5IGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAqCQkgICAgYnl0ZXMuICAoZXhjZXB0aW9uOiBEQkNTX0pQTlUgd2l0aCBmaXJzdCBieXRlIDB4OGUpCisgKgkJICAgIFJlY29nbml6aW5nIHRoZSBmaXJzdCBvciBzZWNvbmQgYnl0ZSBpcyBkaWZmaWN1bHQsIGl0CisgKgkJICAgIHJlcXVpcmVzIGNoZWNraW5nIGEgYnl0ZSBzZXF1ZW5jZSBmcm9tIHRoZSBzdGFydC4KKyAqICJlbmNfdXRmOCIJICAgIFdoZW4gVFJVRSB1c2UgVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04IGVuY29kaW5nLgorICoJCSAgICBUaGUgY2VsbCB3aWR0aCBvbiB0aGUgZGlzcGxheSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGZyb20KKyAqCQkgICAgdGhlIGNoYXJhY3RlciB2YWx1ZS4KKyAqCQkgICAgUmVjb2duaXppbmcgYnl0ZXMgaXMgZWFzeTogMHh4eC54eHh4IGlzIGEgc2luZ2xlLWJ5dGUKKyAqCQkgICAgY2hhciwgMTB4eC54eHh4IGlzIGEgdHJhaWxpbmcgYnl0ZSwgMTF4eC54eHh4IGlzIGEgbGVhZGluZworICoJCSAgICBieXRlIG9mIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKgkJICAgIFRvIG1ha2UgdGhpbmdzIGNvbXBsaWNhdGVkLCB1cCB0byB0d28gY29tcG9zaW5nIGNoYXJhY3RlcnMKKyAqCQkgICAgYXJlIGFsbG93ZWQuICBUaGVzZSBhcmUgZHJhd24gb24gdG9wIG9mIHRoZSBmaXJzdCBjaGFyLgorICoJCSAgICBGb3IgbW9zdCBlZGl0aW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyB3aXRoIGNvbXBvc2luZworICoJCSAgICBjaGFyYWN0ZXJzIGluY2x1ZGVkIGlzIGNvbnNpZGVyZWQgdG8gYmUgb25lIGNoYXJhY3Rlci4KKyAqICJlbmNfdW5pY29kZSIgICAgV2hlbiAyIHVzZSAxNi1iaXQgVW5pY29kZSBjaGFyYWN0ZXJzIChvciBVVEYtMTYpLgorICoJCSAgICBXaGVuIDQgdXNlIDMyLWJ1dCBVbmljb2RlIGNoYXJhY3RlcnMuCisgKgkJICAgIEludGVybmFsbHkgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFVURi04IGVuY29kaW5nIHRvCisgKgkJICAgIGF2b2lkIE5VTCBieXRlcy4gIENvbnZlcnNpb24gaGFwcGVucyB3aGVuIGRvaW5nIEkvTy4KKyAqCQkgICAgImVuY191dGY4IiB3aWxsIGFsc28gYmUgVFJVRS4KKyAqCisgKiAiaGFzX21ieXRlIiBpcyBzZXQgd2hlbiAiZW5jX2RiY3MiIG9yICJlbmNfdXRmOCIgaXMgbm9uLXplcm8uCisgKgorICogSWYgbm9uZSBvZiB0aGVzZSBpcyBUUlVFLCA4LWJpdCBieXRlcyBhcmUgdXNlZCBmb3IgYSBjaGFyYWN0ZXIuICBUaGUKKyAqIGVuY29kaW5nIGlzbid0IGN1cnJlbnRseSBzcGVjaWZpZWQgKFRPRE8pLgorICoKKyAqICdlbmNvZGluZycgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGluIHRoZSBjb3JlLiAgVGhpcyBpcyBpbiByZWdpc3RlcnMsCisgKiB0ZXh0IG1hbmlwdWxhdGlvbiwgYnVmZmVycywgZXRjLiAgQ29udmVyc2lvbiBoYXMgdG8gYmUgZG9uZSB3aGVuIGNoYXJhY3RlcnMKKyAqIGluIGFub3RoZXIgZW5jb2RpbmcgYXJlIHJlY2VpdmVkIG9yIHNlbmQ6CisgKgorICoJCSAgICAgICBjbGlwYm9hcmQKKyAqCQkJICAgXgorICoJCQkgICB8ICgyKQorICoJCQkgICBWCisgKgkJICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAqCSAgICAgICgxKSAgfAkJICAgfCAoMykKKyAqICBrZXlib2FyZCAtLS0tLT58CSBjb3JlCSAgIHwtLS0tLT4gZGlzcGxheQorICoJCSAgIHwJCSAgIHwKKyAqCQkgICArLS0tLS0tLS0tLS0tLS0tKworICoJCQkgICBeCisgKgkJCSAgIHwgKDQpCisgKgkJCSAgIFYKKyAqCQkJIGZpbGUKKyAqCisgKiAoMSkgVHlwZWQgY2hhcmFjdGVycyBhcnJpdmUgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLiAgQ29udmVyc2lvbiBpcyB0byBiZQorICogICAgIGRvbmUgd2hlbiAnZW5jb2RpbmcnIGlzIGRpZmZlcmVudCBmcm9tICd0ZXJtZW5jb2RpbmcnLgorICogKDIpIFRleHQgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB3aXRoIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgd2l0aAorICogICAgICdlbmNvZGluZycuICBJZiB0aGlzIGlzIG5vdCBzdWZmaWNpZW50LCBzeXN0ZW0tc3BlY2lmaWMgY29udmVyc2lvbgorICogICAgIG1pZ2h0IGJlIHJlcXVpcmVkLgorICogKDMpIEZvciB0aGUgR1VJIHRoZSBjb3JyZWN0IGZvbnQgbXVzdCBiZSBzZWxlY3RlZCwgbm8gY29udmVyc2lvbiBkb25lLgorICogICAgIE90aGVyd2lzZSwgY29udmVyc2lvbiBpcyB0byBiZSBkb25lIHdoZW4gJ2VuY29kaW5nJyBkaWZmZXJzIGZyb20KKyAqICAgICAndGVybWVuY29kaW5nJy4gIChEaWZmZXJlbnQgaW4gdGhlIEdUSysgMiBwb3J0IC0tICd0ZXJtZW5jb2RpbmcnCisgKiAgICAgaXMgYWx3YXlzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBhbmQgbXVzdCBhbHdheXMgYmUgc2V0IHRvCisgKiAgICAgInV0Zi04Ii4gIGd1aV9tY2hfaW5pdCgpIGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5LikKKyAqICg0KSBUaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgaXMgc3BlY2lmaWVkIHdpdGggJ2ZpbGVlbmNvZGluZycuICBDb252ZXJzaW9uCisgKiAgICAgaXMgdG8gYmUgZG9uZSB3aGVuIGl0J3MgZGlmZmVyZW50IGZyb20gJ2VuY29kaW5nJy4KKyAqCisgKiBUaGUgdmltaW5mbyBmaWxlIGlzIGEgc3BlY2lhbCBjYXNlOiBPbmx5IHRleHQgaXMgY29udmVydGVkLCBub3QgZmlsZSBuYW1lcy4KKyAqIFZpbSBzY3JpcHRzIG1heSBjb250YWluIGFuICI6ZW5jb2RpbmciIGNvbW1hbmQuICBUaGlzIGhhcyBhbiBlZmZlY3QgZm9yCisgKiBzb21lIGNvbW1hbmRzLCBsaWtlICI6bWVudXRyYW5zIgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIFdJTjMyVU5JWAorIyBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpZmRlZiBXSU4zMgorIyAgdW5kZWYgV0lOMzIJICAgIC8qIFNvbWUgd2luZG93cy5oIGRlZmluZSBXSU4zMiwgd2UgZG9uJ3Qgd2FudCB0aGF0IGhlcmUuICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoV0lOMzJVTklYKSkgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjIGluY2x1ZGUgPHdpbm5scy5oPgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9YMTEKKyMgaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2VuZGlmCisjaWZkZWYgWF9MT0NBTEUKKyNpbmNsdWRlIDxYMTEvWGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKyMgaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KKyMgaWZkZWYgV0lOMzI2NAorIyAgaW5jbHVkZSA8Z2RrL2dka3dpbjMyLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGdkay9nZGt4Lmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfV0NIQVJfSAorIyBpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmCisKKyNpZiAwCisvKiBUaGlzIGhhcyBiZWVuIGRpc2FibGVkLCBiZWNhdXNlIHNldmVyYWwgcGVvcGxlIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggdGhlCisgKiB3Y3dpZHRoKCkgYW5kIGlzd3ByaW50KCkgbGlicmFyeSBmdW5jdGlvbnMsIGVzcC4gZm9yIEhlYnJldy4gKi8KKyMgaWZkZWYgX19TVERDX0lTT18xMDY0Nl9fCisjICBkZWZpbmUgVVNFX1dDSEFSX0ZVTkNUSU9OUworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisKK3N0YXRpYyBpbnQgZW5jX2Nhbm9uX3NlYXJjaCBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworc3RhdGljIGludCBkYmNzX2NoYXIybGVuIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQgZGJjc19jaGFyMmJ5dGVzIF9fQVJHUygoaW50IGMsIGNoYXJfdSAqYnVmKSk7CitzdGF0aWMgaW50IGRiY3NfcHRyMmxlbl9jaGVjayBfX0FSR1MoKGNoYXJfdSAqcCkpOworc3RhdGljIGludCBkYmNzX2NoYXIyY2VsbHMgX19BUkdTKChpbnQgYykpOworc3RhdGljIGludCBkYmNzX3B0cjJjaGFyIF9fQVJHUygoY2hhcl91ICpwKSk7CisKKy8qIExvb2t1cCB0YWJsZSB0byBxdWlja2x5IGdldCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGEgVVRGLTggY2hhcmFjdGVyIGZyb20KKyAqIHRoZSBmaXJzdCBieXRlIG9mIGEgVVRGLTggc3RyaW5nLiAgQnl0ZXMgd2hpY2ggYXJlIGlsbGVnYWwgd2hlbiB1c2VkIGFzIHRoZQorICogZmlyc3QgYnl0ZSBoYXZlIGEgb25lLCBiZWNhdXNlIHRoZXNlIHdpbGwgYmUgdXNlZCBzZXBhcmF0ZWx5LiAqLworc3RhdGljIGNoYXIgdXRmOGxlbl90YWJbMjU2XSA9Cit7CisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLypib2d1cyovCisgICAgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKmJvZ3VzKi8KKyAgICAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisgICAgMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDQsNCw0LDQsNSw1LDUsNSw2LDYsMSwxLAorfTsKKworLyoKKyAqIFhJTSBvZnRlbiBjYXVzZXMgdHJvdWJsZS4gIERlZmluZSBYSU1fREVCVUcgdG8gZ2V0IGEgbG9nIG9mIFhJTSBjYWxsYmFja3MKKyAqIGluIHRoZSAieGltLmxvZyIgZmlsZS4KKyAqLworLyogI2RlZmluZSBYSU1fREVCVUcgKi8KKyNpZmRlZiBYSU1fREVCVUcKKyAgICBzdGF0aWMgdm9pZAoreGltX2xvZyhjaGFyICpzLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdsaXN0OworICAgIHN0YXRpYyBGSUxFICpmZCA9IE5VTEw7CisKKyAgICBpZiAoZmQgPT0gKEZJTEUgKiktMSkKKwlyZXR1cm47CisgICAgaWYgKGZkID09IE5VTEwpCisgICAgeworCWZkID0gZm9wZW4oInhpbS5sb2ciLCAidyIpOworCWlmIChmZCA9PSBOVUxMKQorCXsKKwkgICAgRU1TRygiQ2Fubm90IG9wZW4geGltLmxvZyIpOworCSAgICBmZCA9IChGSUxFICopLTE7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgdmFfc3RhcnQoYXJnbGlzdCwgcyk7CisgICAgdmZwcmludGYoZmQsIHMsIGFyZ2xpc3QpOworICAgIHZhX2VuZChhcmdsaXN0KTsKK30KKyNlbmRpZgorCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2Fub25pY2FsIGVuY29kaW5nIG5hbWVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgorICogImlzby04ODU5LW4iIGlzIGhhbmRsZWQgYnkgZW5jX2Nhbm9uaXplKCkgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QKK3sgICBjaGFyICpuYW1lOwkJaW50IHByb3A7CQlpbnQgY29kZXBhZ2U7fQorZW5jX2Nhbm9uX3RhYmxlW10gPQoreworI2RlZmluZSBJRFhfTEFUSU5fMQkwCisgICAgeyJsYXRpbjEiLAkJRU5DXzhCSVQgKyBFTkNfTEFUSU4xLAkxMjUyfSwKKyNkZWZpbmUgSURYX0lTT18yCTEKKyAgICB7Imlzby04ODU5LTIiLAlFTkNfOEJJVCwJCTB9LAorI2RlZmluZSBJRFhfSVNPXzMJMgorICAgIHsiaXNvLTg4NTktMyIsCUVOQ184QklULAkJMH0sCisjZGVmaW5lIElEWF9JU09fNAkzCisgICAgeyJpc28tODg1OS00IiwJRU5DXzhCSVQsCQkwfSwKKyNkZWZpbmUgSURYX0lTT181CTQKKyAgICB7Imlzby04ODU5LTUiLAlFTkNfOEJJVCwJCTB9LAorI2RlZmluZSBJRFhfSVNPXzYJNQorICAgIHsiaXNvLTg4NTktNiIsCUVOQ184QklULAkJMH0sCisjZGVmaW5lIElEWF9JU09fNwk2CisgICAgeyJpc28tODg1OS03IiwJRU5DXzhCSVQsCQkwfSwKKyNkZWZpbmUgSURYX0NQMTI1NQk3CisgICAgeyJjcDEyNTUiLAkJRU5DXzhCSVQsCQkxMjU1fSwgLyogY2xvc2UgdG8gaXNvLTg4NTktOCAqLworI2RlZmluZSBJRFhfSVNPXzgJOAorICAgIHsiaXNvLTg4NTktOCIsCUVOQ184QklULAkJMH0sCisjZGVmaW5lIElEWF9JU09fOQk5CisgICAgeyJpc28tODg1OS05IiwJRU5DXzhCSVQsCQkwfSwKKyNkZWZpbmUgSURYX0lTT18xMAkxMAorICAgIHsiaXNvLTg4NTktMTAiLAlFTkNfOEJJVCwJCTB9LAorI2RlZmluZSBJRFhfSVNPXzExCTExCisgICAgeyJpc28tODg1OS0xMSIsCUVOQ184QklULAkJMH0sCisjZGVmaW5lIElEWF9JU09fMTMJMTIKKyAgICB7Imlzby04ODU5LTEzIiwJRU5DXzhCSVQsCQkwfSwKKyNkZWZpbmUgSURYX0lTT18xNAkxMworICAgIHsiaXNvLTg4NTktMTQiLAlFTkNfOEJJVCwJCTB9LAorI2RlZmluZSBJRFhfSVNPXzE1CTE0CisgICAgeyJpc28tODg1OS0xNSIsCUVOQ184QklULAkJMH0sCisjZGVmaW5lIElEWF9LT0k4X1IJMTUKKyAgICB7ImtvaTgtciIsCQlFTkNfOEJJVCwJCTB9LAorI2RlZmluZSBJRFhfS09JOF9VCTE2CisgICAgeyJrb2k4LXUiLAkJRU5DXzhCSVQsCQkwfSwKKyNkZWZpbmUgSURYX1VURjgJMTcKKyAgICB7InV0Zi04IiwJCUVOQ19VTklDT0RFLAkJMH0sCisjZGVmaW5lIElEWF9VQ1MyCTE4CisgICAgeyJ1Y3MtMiIsCQlFTkNfVU5JQ09ERSArIEVOQ19FTkRJQU5fQiArIEVOQ18yQllURSwgMH0sCisjZGVmaW5lIElEWF9VQ1MyTEUJMTkKKyAgICB7InVjcy0ybGUiLAkJRU5DX1VOSUNPREUgKyBFTkNfRU5ESUFOX0wgKyBFTkNfMkJZVEUsIDB9LAorI2RlZmluZSBJRFhfVVRGMTYJMjAKKyAgICB7InV0Zi0xNiIsCQlFTkNfVU5JQ09ERSArIEVOQ19FTkRJQU5fQiArIEVOQ18yV09SRCwgMH0sCisjZGVmaW5lIElEWF9VVEYxNkxFCTIxCisgICAgeyJ1dGYtMTZsZSIsCUVOQ19VTklDT0RFICsgRU5DX0VORElBTl9MICsgRU5DXzJXT1JELCAwfSwKKyNkZWZpbmUgSURYX1VDUzQJMjIKKyAgICB7InVjcy00IiwJCUVOQ19VTklDT0RFICsgRU5DX0VORElBTl9CICsgRU5DXzRCWVRFLCAwfSwKKyNkZWZpbmUgSURYX1VDUzRMRQkyMworICAgIHsidWNzLTRsZSIsCQlFTkNfVU5JQ09ERSArIEVOQ19FTkRJQU5fTCArIEVOQ180QllURSwgMH0sCisjZGVmaW5lIElEWF9ERUJVRwkyNAorICAgIHsiZGVidWciLAkJRU5DX0RCQ1MsCQlEQkNTX0RFQlVHfSwKKyNkZWZpbmUgSURYX0NQOTMyCTI1CisgICAgeyJjcDkzMiIsCQlFTkNfREJDUywJCURCQ1NfSlBOfSwKKyNkZWZpbmUgSURYX0NQOTQ5CTI2CisgICAgeyJjcDk0OSIsCQlFTkNfREJDUywJCURCQ1NfS09SfSwKKyNkZWZpbmUgSURYX0NQOTM2CTI3CisgICAgeyJjcDkzNiIsCQlFTkNfREJDUywJCURCQ1NfQ0hTfSwKKyNkZWZpbmUgSURYX0NQOTUwCTI4CisgICAgeyJjcDk1MCIsCQlFTkNfREJDUywJCURCQ1NfQ0hUfSwKKyNkZWZpbmUgSURYX0VVQ19KUAkyOQorICAgIHsiZXVjLWpwIiwJCUVOQ19EQkNTLAkJREJDU19KUE5VfSwKKyNkZWZpbmUgSURYX1NKSVMJMzAKKyAgICB7InNqaXMiLAkJRU5DX0RCQ1MsCQlEQkNTX0pQTn0sCisjZGVmaW5lIElEWF9FVUNfS1IJMzEKKyAgICB7ImV1Yy1rciIsCQlFTkNfREJDUywJCURCQ1NfS09SVX0sCisjZGVmaW5lIElEWF9FVUNfQ04JMzIKKyAgICB7ImV1Yy1jbiIsCQlFTkNfREJDUywJCURCQ1NfQ0hTVX0sCisjZGVmaW5lIElEWF9FVUNfVFcJMzMKKyAgICB7ImV1Yy10dyIsCQlFTkNfREJDUywJCURCQ1NfQ0hUVX0sCisjZGVmaW5lIElEWF9CSUc1CTM0CisgICAgeyJiaWc1IiwJCUVOQ19EQkNTLAkJREJDU19DSFR9LAorI2RlZmluZSBJRFhfQ1AxMjUxCTM1CisgICAgeyJjcDEyNTEiLAkJRU5DXzhCSVQsCQkxMjUxfSwKKyNkZWZpbmUgSURYX01BQ1JPTUFOCTM2CisgICAgeyJtYWNyb21hbiIsCUVOQ184QklUICsgRU5DX01BQ1JPTUFOLCAwfSwKKyNkZWZpbmUgSURYX0NPVU5UCTM3Cit9OworCisvKgorICogQWxpYXNlcyBmb3IgZW5jb2RpbmcgbmFtZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QKK3sgICBjaGFyICpuYW1lOwkJaW50IGNhbm9uO30KK2VuY19hbGlhc190YWJsZVtdID0KK3sKKyAgICB7ImFuc2kiLAkJSURYX0xBVElOXzF9LAorICAgIHsiaXNvLTg4NTktMSIsCUlEWF9MQVRJTl8xfSwKKyAgICB7ImxhdGluMiIsCQlJRFhfSVNPXzJ9LAorICAgIHsibGF0aW4zIiwJCUlEWF9JU09fM30sCisgICAgeyJsYXRpbjQiLAkJSURYX0lTT180fSwKKyAgICB7ImN5cmlsbGljIiwJSURYX0lTT181fSwKKyAgICB7ImFyYWJpYyIsCQlJRFhfSVNPXzZ9LAorICAgIHsiZ3JlZWsiLAkJSURYX0lTT183fSwKKyNpZmRlZiBXSU4zMjY0CisgICAgeyJoZWJyZXciLAkJSURYX0NQMTI1NX0sCisjZWxzZQorICAgIHsiaGVicmV3IiwJCUlEWF9JU09fOH0sCisjZW5kaWYKKyAgICB7ImxhdGluNSIsCQlJRFhfSVNPXzl9LAorICAgIHsidHVya2lzaCIsCQlJRFhfSVNPXzl9LCAvKiA/ICovCisgICAgeyJsYXRpbjYiLAkJSURYX0lTT18xMH0sCisgICAgeyJub3JkaWMiLAkJSURYX0lTT18xMH0sIC8qID8gKi8KKyAgICB7InRoYWkiLAkJSURYX0lTT18xMX0sIC8qID8gKi8KKyAgICB7ImxhdGluNyIsCQlJRFhfSVNPXzEzfSwKKyAgICB7ImxhdGluOCIsCQlJRFhfSVNPXzE0fSwKKyAgICB7ImxhdGluOSIsCQlJRFhfSVNPXzE1fSwKKyAgICB7InV0ZjgiLAkJSURYX1VURjh9LAorICAgIHsidW5pY29kZSIsCQlJRFhfVUNTMn0sCisgICAgeyJ1Y3MyIiwJCUlEWF9VQ1MyfSwKKyAgICB7InVjczJiZSIsCQlJRFhfVUNTMn0sCisgICAgeyJ1Y3MtMmJlIiwJCUlEWF9VQ1MyfSwKKyAgICB7InVjczJsZSIsCQlJRFhfVUNTMkxFfSwKKyAgICB7InV0ZjE2IiwJCUlEWF9VVEYxNn0sCisgICAgeyJ1dGYxNmJlIiwJCUlEWF9VVEYxNn0sCisgICAgeyJ1dGYtMTZiZSIsCUlEWF9VVEYxNn0sCisgICAgeyJ1dGYxNmxlIiwJCUlEWF9VVEYxNkxFfSwKKyAgICB7InVjczQiLAkJSURYX1VDUzR9LAorICAgIHsidWNzNGJlIiwJCUlEWF9VQ1M0fSwKKyAgICB7InVjcy00YmUiLAkJSURYX1VDUzR9LAorICAgIHsidWNzNGxlIiwJCUlEWF9VQ1M0TEV9LAorICAgIHsiOTMyIiwJCUlEWF9DUDkzMn0sCisgICAgeyI5NDkiLAkJSURYX0NQOTQ5fSwKKyAgICB7IjkzNiIsCQlJRFhfQ1A5MzZ9LAorICAgIHsiOTUwIiwJCUlEWF9DUDk1MH0sCisgICAgeyJldWNqcCIsCQlJRFhfRVVDX0pQfSwKKyAgICB7InVuaXgtamlzIiwJSURYX0VVQ19KUH0sCisgICAgeyJ1amlzIiwJCUlEWF9FVUNfSlB9LAorICAgIHsic2hpZnQtamlzIiwJSURYX1NKSVN9LAorICAgIHsiZXVja3IiLAkJSURYX0VVQ19LUn0sCisgICAgeyI1NjAxIiwJCUlEWF9FVUNfS1J9LAkvKiBTdW46IEtTIEMgNTYwMSAqLworICAgIHsiZXVjY24iLAkJSURYX0VVQ19DTn0sCisgICAgeyJnYjIzMTIiLAkJSURYX0VVQ19DTn0sCisgICAgeyJldWN0dyIsCQlJRFhfRVVDX1RXfSwKKyNpZiBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoV0lOMzJVTklYKSB8fCBkZWZpbmVkKE1BQ09TKQorICAgIHsiamFwYW4iLAkJSURYX0NQOTMyfSwKKyAgICB7ImtvcmVhIiwJCUlEWF9DUDk0OX0sCisgICAgeyJwcmMiLAkJSURYX0NQOTM2fSwKKyAgICB7ImNoaW5lc2UiLAkJSURYX0NQOTM2fSwKKyAgICB7InRhaXdhbiIsCQlJRFhfQ1A5NTB9LAorICAgIHsiYmlnNSIsCQlJRFhfQ1A5NTB9LAorI2Vsc2UKKyAgICB7ImphcGFuIiwJCUlEWF9FVUNfSlB9LAorICAgIHsia29yZWEiLAkJSURYX0VVQ19LUn0sCisgICAgeyJwcmMiLAkJSURYX0VVQ19DTn0sCisgICAgeyJjaGluZXNlIiwJCUlEWF9FVUNfQ059LAorICAgIHsidGFpd2FuIiwJCUlEWF9FVUNfVFd9LAorICAgIHsiY3A5NTAiLAkJSURYX0JJRzV9LAorICAgIHsiOTUwIiwJCUlEWF9CSUc1fSwKKyNlbmRpZgorICAgIHsibWFjIiwJCUlEWF9NQUNST01BTn0sCisgICAge05VTEwsCQkwfQorfTsKKworI2lmbmRlZiBDUF9VVEY4CisjIGRlZmluZSBDUF9VVEY4IDY1MDAxCS8qIG1hZ2ljIG51bWJlciBmcm9tIHdpbm5scy5oICovCisjZW5kaWYKKworLyoKKyAqIEZpbmQgZW5jb2RpbmcgIm5hbWUiIGluIHRoZSBsaXN0IG9mIGNhbm9uaWNhbCBlbmNvZGluZyBuYW1lcy4KKyAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLgorICovCisgICAgc3RhdGljIGludAorZW5jX2Nhbm9uX3NlYXJjaChuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSURYX0NPVU5UOyArK2kpCisJaWYgKFNUUkNNUChuYW1lLCBlbmNfY2Fub25fdGFibGVbaV0ubmFtZSkgPT0gMCkKKwkgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEZpbmQgY2Fub25pY2FsIGVuY29kaW5nICJuYW1lIiBpbiB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0cyBwcm9wZXJ0aWVzLgorICogUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4KKyAqLworICAgIGludAorZW5jX2Nhbm9uX3Byb3BzKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKworICAgIGkgPSBlbmNfY2Fub25fc2VhcmNoKG5hbWUpOworICAgIGlmIChpID49IDApCisJcmV0dXJuIGVuY19jYW5vbl90YWJsZVtpXS5wcm9wOworI2lmZGVmIFdJTjMyNjQKKyAgICBpZiAobmFtZVswXSA9PSAnYycgJiYgbmFtZVsxXSA9PSAncCcgJiYgVklNX0lTRElHSVQobmFtZVsyXSkpCisgICAgeworCUNQSU5GTwljcGluZm87CisKKwkvKiBHZXQgaW5mbyBvbiB0aGlzIGNvZGVwYWdlIHRvIGZpbmQgb3V0IHdoYXQgaXQgaXMuICovCisJaWYgKEdldENQSW5mbyhhdG9pKG5hbWUgKyAyKSwgJmNwaW5mbykgIT0gMCkKKwl7CisJICAgIGlmIChjcGluZm8uTWF4Q2hhclNpemUgPT0gMSkgLyogc29tZSBzaW5nbGUtYnl0ZSBlbmNvZGluZyAqLworCQlyZXR1cm4gRU5DXzhCSVQ7CisJICAgIGlmIChjcGluZm8uTWF4Q2hhclNpemUgPT0gMgorCQkgICAgJiYgKGNwaW5mby5MZWFkQnl0ZVswXSAhPSAwIHx8IGNwaW5mby5MZWFkQnl0ZVsxXSAhPSAwKSkKKwkJLyogbXVzdCBiZSBhIERCQ1MgZW5jb2RpbmcgKi8KKwkJcmV0dXJuIEVOQ19EQkNTOworCX0KKwlyZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoU1RSTkNNUChuYW1lLCAiMmJ5dGUtIiwgNikgPT0gMCkKKwlyZXR1cm4gRU5DX0RCQ1M7CisgICAgaWYgKFNUUk5DTVAobmFtZSwgIjhiaXQtIiwgNSkgPT0gMCB8fCBTVFJOQ01QKG5hbWUsICJpc28tODg1OS0iLCA5KSA9PSAwKQorCXJldHVybiBFTkNfOEJJVDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB1cCBmb3IgdXNpbmcgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgorICogQ2FsbGVkIGluIHRocmVlIGNhc2VzOgorICogLSBieSBtYWluKCkgdG8gaW5pdGlhbGl6ZSAocF9lbmMgPT0gTlVMTCkKKyAqIC0gYnkgc2V0X2luaXRfMSgpIGFmdGVyICdlbmNvZGluZycgd2FzIHNldCB0byBpdHMgZGVmYXVsdC4KKyAqIC0gYnkgZG9fc2V0KCkgd2hlbiAnZW5jb2RpbmcnIGhhcyBiZWVuIHNldC4KKyAqIHBfZW5jIG11c3QgaGF2ZSBiZWVuIHBhc3NlZCB0aHJvdWdoIGVuY19jYW5vbml6ZSgpIGFscmVhZHkuCisgKiBTZXRzIHRoZSAiZW5jX3VuaWNvZGUiLCAiZW5jX3V0ZjgiLCAiZW5jX2RiY3MiIGFuZCAiaGFzX21ieXRlIiBmbGFncy4KKyAqIEZpbGxzIG1iX2J5dGVsZW5fdGFiW10gYW5kIHJldHVybnMgTlVMTCB3aGVuIHRoZXJlIGFyZSBubyBwcm9ibGVtcy4KKyAqIFdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nOiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGRvZXNuJ3QgY2hhbmdlCisgKiBhbnl0aGluZy4KKyAqLworICAgIGNoYXJfdSAqCittYl9pbml0KCkKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQlpZHg7CisgICAgaW50CQluOworICAgIGludAkJZW5jX2RiY3NfbmV3ID0gMDsKKyNpZiBkZWZpbmVkKFVTRV9JQ09OVikgJiYgIWRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoV0lOMzJVTklYKSBcCisJJiYgIWRlZmluZWQoTUFDT1MpCisjIGRlZmluZSBMRU5fRlJPTV9DT05WCisgICAgdmltY29udl9UCXZpbWNvbnY7CisgICAgY2hhcl91CSpwOworI2VuZGlmCisKKyAgICBpZiAocF9lbmMgPT0gTlVMTCkKKyAgICB7CisJLyogSnVzdCBzdGFydGluZyB1cDogc2V0IHRoZSB3aG9sZSB0YWJsZSB0byBvbmUncy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpCisJICAgIG1iX2J5dGVsZW5fdGFiW2ldID0gMTsKKwlpbnB1dF9jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CisJaW5wdXRfY29udi52Y19mYWN0b3IgPSAxOworCW91dHB1dF9jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZkZWYgV0lOMzI2NAorICAgIGlmIChwX2VuY1swXSA9PSAnYycgJiYgcF9lbmNbMV0gPT0gJ3AnICYmIFZJTV9JU0RJR0lUKHBfZW5jWzJdKSkKKyAgICB7CisJQ1BJTkZPCWNwaW5mbzsKKworCS8qIEdldCBpbmZvIG9uIHRoaXMgY29kZXBhZ2UgdG8gZmluZCBvdXQgd2hhdCBpdCBpcy4gKi8KKwlpZiAoR2V0Q1BJbmZvKGF0b2kocF9lbmMgKyAyKSwgJmNwaW5mbykgIT0gMCkKKwl7CisJICAgIGlmIChjcGluZm8uTWF4Q2hhclNpemUgPT0gMSkKKwkgICAgeworCQkvKiBzb21lIHNpbmdsZS1ieXRlIGVuY29kaW5nICovCisJCWVuY191bmljb2RlID0gMDsKKwkJZW5jX3V0ZjggPSBGQUxTRTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChjcGluZm8uTWF4Q2hhclNpemUgPT0gMgorCQkgICAgJiYgKGNwaW5mby5MZWFkQnl0ZVswXSAhPSAwIHx8IGNwaW5mby5MZWFkQnl0ZVsxXSAhPSAwKSkKKwkgICAgeworCQkvKiBtdXN0IGJlIGEgREJDUyBlbmNvZGluZywgY2hlY2sgYmVsb3cgKi8KKwkJZW5jX2RiY3NfbmV3ID0gYXRvaShwX2VuYyArIDIpOworCSAgICB9CisJICAgIGVsc2UKKwkJZ290byBjb2RlcGFnZV9pbnZhbGlkOworCX0KKwllbHNlIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikKKwl7Citjb2RlcGFnZV9pbnZhbGlkOgorCSAgICByZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIpOworCX0KKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmIChTVFJOQ01QKHBfZW5jLCAiOGJpdC0iLCA1KSA9PSAwCisJICAgIHx8IFNUUk5DTVAocF9lbmMsICJpc28tODg1OS0iLCA5KSA9PSAwKQorICAgIHsKKwkvKiBBY2NlcHQgYW55ICI4Yml0LSIgb3IgImlzby04ODU5LSIgbmFtZS4gKi8KKwllbmNfdW5pY29kZSA9IDA7CisJZW5jX3V0ZjggPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RSTkNNUChwX2VuYywgIjJieXRlLSIsIDYpID09IDApCisgICAgeworI2lmZGVmIFdJTjMyNjQKKwkvKiBXaW5kb3dzOiBhY2NlcHQgb25seSB2YWxpZCBjb2RlcGFnZSBudW1iZXJzLCBjaGVjayBiZWxvdy4gKi8KKwlpZiAocF9lbmNbNl0gIT0gJ2MnIHx8IHBfZW5jWzddICE9ICdwJworCQkJCSAgICAgIHx8IChlbmNfZGJjc19uZXcgPSBhdG9pKHBfZW5jICsgOCkpID09IDApCisJICAgIHJldHVybiBlX2ludmFyZzsKKyNlbHNlCisJLyogVW5peDogYWNjZXB0IGFueSAiMmJ5dGUtIiBuYW1lLCBhc3N1bWUgY3VycmVudCBsb2NhbGUuICovCisJZW5jX2RiY3NfbmV3ID0gREJDU18yQllURTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICgoaWR4ID0gZW5jX2Nhbm9uX3NlYXJjaChwX2VuYykpID49IDApCisgICAgeworCWkgPSBlbmNfY2Fub25fdGFibGVbaWR4XS5wcm9wOworCWlmIChpICYgRU5DX1VOSUNPREUpCisJeworCSAgICAvKiBVbmljb2RlICovCisJICAgIGVuY191dGY4ID0gVFJVRTsKKwkgICAgaWYgKGkgJiAoRU5DXzJCWVRFIHwgRU5DXzJXT1JEKSkKKwkJZW5jX3VuaWNvZGUgPSAyOworCSAgICBlbHNlIGlmIChpICYgRU5DXzRCWVRFKQorCQllbmNfdW5pY29kZSA9IDQ7CisJICAgIGVsc2UKKwkJZW5jX3VuaWNvZGUgPSAwOworCX0KKwllbHNlIGlmIChpICYgRU5DX0RCQ1MpCisJeworCSAgICAvKiAyYnl0ZSwgaGFuZGxlIGJlbG93ICovCisJICAgIGVuY19kYmNzX25ldyA9IGVuY19jYW5vbl90YWJsZVtpZHhdLmNvZGVwYWdlOworCX0KKwllbHNlCisJeworCSAgICAvKiBNdXN0IGJlIDgtYml0LiAqLworCSAgICBlbmNfdW5pY29kZSA9IDA7CisJICAgIGVuY191dGY4ID0gRkFMU0U7CisJfQorICAgIH0KKyAgICBlbHNlICAgIC8qIERvbid0IGtub3cgd2hhdCBlbmNvZGluZyB0aGlzIGlzLCByZWplY3QgaXQuICovCisJcmV0dXJuIGVfaW52YXJnOworCisgICAgaWYgKGVuY19kYmNzX25ldyAhPSAwKQorICAgIHsKKyNpZmRlZiBXSU4zMjY0CisJLyogQ2hlY2sgaWYgdGhlIERCQ1MgY29kZSBwYWdlIGlzIE9LLiAqLworCWlmICghSXNWYWxpZENvZGVQYWdlKGVuY19kYmNzX25ldykpCisJICAgIGdvdG8gY29kZXBhZ2VfaW52YWxpZDsKKyNlbmRpZgorCWVuY191bmljb2RlID0gMDsKKwllbmNfdXRmOCA9IEZBTFNFOworICAgIH0KKyAgICBlbmNfZGJjcyA9IGVuY19kYmNzX25ldzsKKyAgICBoYXNfbWJ5dGUgPSAoZW5jX2RiY3MgIT0gMCB8fCBlbmNfdXRmOCk7CisKKyNpZmRlZiBXSU4zMjY0CisgICAgZW5jX2NvZGVwYWdlID0gZW5jbmFtZTJjb2RlcGFnZShwX2VuYyk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycy4KKyAgICAgKi8KKyAgICBpZiAoZW5jX3V0ZjgpCisgICAgeworCW1iX3B0cjJsZW5fY2hlY2sgPSB1dGZjX3B0cjJsZW5fY2hlY2s7CisJbWJfY2hhcjJsZW4gPSB1dGZfY2hhcjJsZW47CisJbWJfY2hhcjJieXRlcyA9IHV0Zl9jaGFyMmJ5dGVzOworCW1iX3B0cjJjZWxscyA9IHV0Zl9wdHIyY2VsbHM7CisJbWJfY2hhcjJjZWxscyA9IHV0Zl9jaGFyMmNlbGxzOworCW1iX29mZjJjZWxscyA9IHV0Zl9vZmYyY2VsbHM7CisJbWJfcHRyMmNoYXIgPSB1dGZfcHRyMmNoYXI7CisJbWJfaGVhZF9vZmYgPSB1dGZfaGVhZF9vZmY7CisgICAgfQorICAgIGVsc2UgaWYgKGVuY19kYmNzICE9IDApCisgICAgeworCW1iX3B0cjJsZW5fY2hlY2sgPSBkYmNzX3B0cjJsZW5fY2hlY2s7CisJbWJfY2hhcjJsZW4gPSBkYmNzX2NoYXIybGVuOworCW1iX2NoYXIyYnl0ZXMgPSBkYmNzX2NoYXIyYnl0ZXM7CisJbWJfcHRyMmNlbGxzID0gZGJjc19wdHIyY2VsbHM7CisJbWJfY2hhcjJjZWxscyA9IGRiY3NfY2hhcjJjZWxsczsKKwltYl9vZmYyY2VsbHMgPSBkYmNzX29mZjJjZWxsczsKKwltYl9wdHIyY2hhciA9IGRiY3NfcHRyMmNoYXI7CisJbWJfaGVhZF9vZmYgPSBkYmNzX2hlYWRfb2ZmOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW1iX3B0cjJsZW5fY2hlY2sgPSBsYXRpbl9wdHIybGVuX2NoZWNrOworCW1iX2NoYXIybGVuID0gbGF0aW5fY2hhcjJsZW47CisJbWJfY2hhcjJieXRlcyA9IGxhdGluX2NoYXIyYnl0ZXM7CisJbWJfcHRyMmNlbGxzID0gbGF0aW5fcHRyMmNlbGxzOworCW1iX2NoYXIyY2VsbHMgPSBsYXRpbl9jaGFyMmNlbGxzOworCW1iX29mZjJjZWxscyA9IGxhdGluX29mZjJjZWxsczsKKwltYl9wdHIyY2hhciA9IGxhdGluX3B0cjJjaGFyOworCW1iX2hlYWRfb2ZmID0gbGF0aW5faGVhZF9vZmY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaWxsIHRoZSBtYl9ieXRlbGVuX3RhYltdIGZvciBNQl9CWVRFMkxFTigpLgorICAgICAqLworI2lmZGVmIExFTl9GUk9NX0NPTlYKKyAgICAvKiBXaGVuICdlbmNvZGluZycgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlIG1ibGVuKCkgd29uJ3QKKyAgICAgKiB3b3JrLiAgVXNlIGNvbnZlcnNpb24gdG8gInV0Zi04IiBpbnN0ZWFkLiAqLworICAgIHZpbWNvbnYudmNfdHlwZSA9IENPTlZfTk9ORTsKKyAgICBpZiAoZW5jX2RiY3MpCisgICAgeworCXAgPSBlbmNfbG9jYWxlKCk7CisJaWYgKHAgPT0gTlVMTCB8fCBTVFJDTVAocCwgcF9lbmMpICE9IDApCisJeworCSAgICBjb252ZXJ0X3NldHVwKCZ2aW1jb252LCBwX2VuYywgKGNoYXJfdSAqKSJ1dGYtOCIpOworCSAgICB2aW1jb252LnZjX2ZhaWwgPSBUUlVFOworCX0KKwl2aW1fZnJlZShwKTsKKyAgICB9CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKKyAgICB7CisJLyogT3VyIG93biBmdW5jdGlvbiB0byByZWxpYWJseSBjaGVjayB0aGUgbGVuZ3RoIG9mIFVURi04IGNoYXJhY3RlcnMsCisJICogaW5kZXBlbmRlbnQgb2YgbWJsZW4oKS4gKi8KKwlpZiAoZW5jX3V0ZjgpCisJICAgIG4gPSB1dGY4bGVuX3RhYltpXTsKKwllbHNlIGlmIChlbmNfZGJjcyA9PSAwKQorCSAgICBuID0gMTsKKwllbHNlCisJeworI2lmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChXSU4zMlVOSVgpCisJICAgIC8qIGVuY19kYmNzIGlzIHNldCBieSBzZXR0aW5nICdmaWxlZW5jb2RpbmcnLiAgSXQgYmVjb21lcyBhIFdpbmRvd3MKKwkgICAgICogQ29kZVBhZ2UgaWRlbnRpZmllciwgd2hpY2ggd2UgY2FuIHBhc3MgZGlyZWN0bHkgaW4gdG8gV2luZG93cworCSAgICAgKiBBUEkgKi8KKwkgICAgbiA9IElzREJDU0xlYWRCeXRlRXgoZW5jX2RiY3MsIChCWVRFKWkpID8gMiA6IDE7CisjZWxzZQorIyBpZmRlZiBNQUNPUworCSAgICAvKgorCSAgICAgKiBpZiBtYmxlbigpIGlzIG5vdCBhdmFpbGFibGUsIGNoYXJhY3RlciB3aGljaCBNU0IgaXMgdHVybmVkIG9uCisJICAgICAqIGFyZSB0cmVhdGVkIGFzIGxlYWRpbmcgYnl0ZSBjaGFyYWN0ZXIuIChub3RlIDogVGhpcyBhc3N1bXB0aW9uCisJICAgICAqIGlzIG5vdCBhbHdheXMgdHJ1ZS4pCisJICAgICAqLworCSAgICBuID0gKGkgJiAweDgwKSA/IDIgOiAxOworIyBlbHNlCisJICAgIGNoYXIgYnVmW01CX01BWEJZVEVTXTsKKyMgaWZkZWYgWF9MT0NBTEUKKyMgIGlmbmRlZiBtYmxlbgorIyAgIGRlZmluZSBtYmxlbiBfWG1ibGVuCisjICBlbmRpZgorIyBlbmRpZgorCSAgICBpZiAoaSA9PSBOVUwpCS8qIGp1c3QgaW4gY2FzZSBtYmxlbigpIGNhbid0IGhhbmRsZSAiIiAqLworCQluID0gMTsKKwkgICAgZWxzZQorCSAgICB7CisJCWJ1ZlswXSA9IGk7CisJCWJ1ZlsxXSA9IDA7CisjaWZkZWYgTEVOX0ZST01fQ09OVgorCQlpZiAodmltY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIHN0cmluZ19jb252ZXJ0KCkgc2hvdWxkIGZhaWwgd2hlbiBjb252ZXJ0aW5nIHRoZSBmaXJzdAorCQkgICAgICogYnl0ZSBvZiBhIGRvdWJsZS1ieXRlIGNoYXJhY3Rlci4KKwkJICAgICAqLworCQkgICAgcCA9IHN0cmluZ19jb252ZXJ0KCZ2aW1jb252LCAoY2hhcl91ICopYnVmLCBOVUxMKTsKKwkJICAgIGlmIChwICE9IE5VTEwpCisJCSAgICB7CisJCQl2aW1fZnJlZShwKTsKKwkJCW4gPSAxOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJbiA9IDI7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBtYmxlbigpIHNob3VsZCByZXR1cm4gLTEgZm9yIGludmFsaWQgKG1lYW5zIHRoZSBsZWFkaW5nCisJCSAgICAgKiBtdWx0aWJ5dGUpIGNoYXJhY3Rlci4gIEhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgcGxhdGZvcm1zCisJCSAgICAgKiB3aGVyZSBtYmxlbigpIHJldHVybnMgMCBmb3IgaW52YWxpZCBjaGFyYWN0ZXIuCisJCSAgICAgKiBUaGVyZWZvcmUsIGZvbGxvd2luZyBjb25kaXRpb24gaW5jbHVkZXMgMC4KKwkJICAgICAqLworCQkgICAgaWYgKG1ibGVuKGJ1ZiwgKHNpemVfdCkxKSA8PSAwKQorCQkJbiA9IDI7CisJCSAgICBlbHNlCisJCQluID0gMTsKKwkJfQorCSAgICB9CisjIGVuZGlmCisjZW5kaWYKKwl9CisKKwltYl9ieXRlbGVuX3RhYltpXSA9IG47CisgICAgfQorCisjaWZkZWYgTEVOX0ZST01fQ09OVgorICAgIGNvbnZlcnRfc2V0dXAoJnZpbWNvbnYsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyAgICAvKiBUaGUgY2VsbCB3aWR0aCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gKi8KKyAgICAodm9pZClpbml0X2NoYXJ0YWIoKTsKKworICAgIC8qIFdoZW4gZW5jX3V0ZjggaXMgc2V0IG9yIHJlc2V0LCAoZGUpYWxsb2NhdGUgU2NyZWVuTGluZXNVQ1tdICovCisgICAgc2NyZWVuYWxsb2MoRkFMU0UpOworCisgICAgLyogV2hlbiB1c2luZyBVbmljb2RlLCBzZXQgZGVmYXVsdCBmb3IgJ2ZpbGVlbmNvZGluZ3MnLiAqLworICAgIGlmIChlbmNfdXRmOCAmJiAhb3B0aW9uX3dhc19zZXQoKGNoYXJfdSAqKSJmZW5jcyIpKQorCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopImZlbmNzIiwgLTEsCisJCQkJIChjaGFyX3UgKikidWNzLWJvbSx1dGYtOCxsYXRpbjEiLCBPUFRfRlJFRSk7CisjaWYgZGVmaW5lZChIQVZFX0JJTkRfVEVYVERPTUFJTl9DT0RFU0VUKSAmJiBkZWZpbmVkKEZFQVRfR0VUVEVYVCkKKyAgICAvKiBHTlUgZ2V0dGV4dCAwLjEwLjM3IHN1cHBvcnRzIHRoaXMgZmVhdHVyZTogc2V0IHRoZSBjb2Rlc2V0IHVzZWQgZm9yCisgICAgICogdHJhbnNsYXRlZCBtZXNzYWdlcyBpbmRlcGVuZGVudGx5IGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlLiAqLworICAgICh2b2lkKWJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KFZJTVBBQ0tBR0UsCisJCQkJCSAgZW5jX3V0ZjggPyAidXRmLTgiIDogKGNoYXIgKilwX2VuYyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qIEZpcmUgYW4gYXV0b2NvbW1hbmQgdG8gbGV0IHBlb3BsZSBkbyBjdXN0b20gZm9udCBzZXR1cC4gVGhpcyBtdXN0IGJlCisgICAgICogYWZ0ZXIgVmltIGhhcyBiZWVuIHNldHVwIGZvciB0aGUgbmV3IGVuY29kaW5nLiAqLworICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0VOQ09ESU5HQ0hBTkdFRCwgTlVMTCwgKGNoYXJfdSAqKSIiLCBGQUxTRSwgY3VyYnVmKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEJPTSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyOgorICogMCAtIG5vIEJPTQorICogMiAtIFVDUy0yIG9yIFVURi0xNiBCT00KKyAqIDQgLSBVQ1MtNCBCT00KKyAqIDMgLSBVVEYtOCBCT00KKyAqLworICAgIGludAorYm9tYl9zaXplKCkKK3sKKyAgICBpbnQgbiA9IDA7CisKKyAgICBpZiAoY3VyYnVmLT5iX3BfYm9tYiAmJiAhY3VyYnVmLT5iX3BfYmluKQorICAgIHsKKwlpZiAoKmN1cmJ1Zi0+Yl9wX2ZlbmMgPT0gTlVMKQorCXsKKwkgICAgaWYgKGVuY191dGY4KQorCSAgICB7CisJCWlmIChlbmNfdW5pY29kZSAhPSAwKQorCQkgICAgbiA9IGVuY191bmljb2RlOworCQllbHNlCisJCSAgICBuID0gMzsKKwkgICAgfQorCX0KKwllbHNlIGlmIChTVFJDTVAoY3VyYnVmLT5iX3BfZmVuYywgInV0Zi04IikgPT0gMCkKKwkgICAgbiA9IDM7CisJZWxzZSBpZiAoU1RSTkNNUChjdXJidWYtPmJfcF9mZW5jLCAidWNzLTIiLCA1KSA9PSAwCisJCXx8IFNUUk5DTVAoY3VyYnVmLT5iX3BfZmVuYywgInV0Zi0xNiIsIDYpID09IDApCisJICAgIG4gPSAyOworCWVsc2UgaWYgKFNUUk5DTVAoY3VyYnVmLT5iX3BfZmVuYywgInVjcy00IiwgNSkgPT0gMCkKKwkgICAgbiA9IDQ7CisgICAgfQorICAgIHJldHVybiBuOworfQorCisvKgorICogR2V0IGNsYXNzIG9mIHBvaW50ZXI6CisgKiAwIGZvciBibGFuayBvciBOVUwKKyAqIDEgZm9yIHB1bmN0dWF0aW9uCisgKiAyIGZvciBhbiAoQVNDSUkpIHdvcmQgY2hhcmFjdGVyCisgKiA+MiBmb3Igb3RoZXIgd29yZCBjaGFyYWN0ZXJzCisgKi8KKyAgICBpbnQKK21iX2dldF9jbGFzcyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpZiAoTUJfQllURTJMRU4ocFswXSkgPT0gMSkKKyAgICB7CisJaWYgKHBbMF0gPT0gTlVMIHx8IHZpbV9pc3doaXRlKHBbMF0pKQorCSAgICByZXR1cm4gMDsKKwlpZiAodmltX2lzd29yZGMocFswXSkpCisJICAgIHJldHVybiAyOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBwWzBdICE9IE5VTCAmJiBwWzFdICE9IE5VTCkKKwlyZXR1cm4gZGJjc19jbGFzcyhwWzBdLCBwWzFdKTsKKyAgICBpZiAoZW5jX3V0ZjgpCisJcmV0dXJuIHV0Zl9jbGFzcyh1dGZfcHRyMmNoYXIocCkpOworICAgIHJldHVybiAwOworfQorCisvKgorICogR2V0IGNsYXNzIG9mIGEgZG91YmxlLWJ5dGUgY2hhcmFjdGVyLiAgVGhpcyBhbHdheXMgcmV0dXJucyAzIG9yIGJpZ2dlci4KKyAqIFRPRE86IFNob3VsZCByZXR1cm4gMSBmb3IgcHVuY3R1YXRpb24uCisgKi8KKyAgICBpbnQKK2RiY3NfY2xhc3MobGVhZCwgdHJhaWwpCisgICAgdW5zaWduZWQJbGVhZDsKKyAgICB1bnNpZ25lZAl0cmFpbDsKK3sKKyAgICBzd2l0Y2ggKGVuY19kYmNzKQorICAgIHsKKwkvKiBwbGVhc2UgYWRkIGNsYXNzZnkgcm91dGluZSBmb3IgeW91ciBsYW5ndWFnZSBpbiBoZXJlICovCisKKwljYXNlIERCQ1NfSlBOVToJLyogPyAqLworCWNhc2UgREJDU19KUE46CisJICAgIHsKKwkJLyogSklTIGNvZGUgY2xhc3NpZmljYXRpb24gKi8KKwkJdW5zaWduZWQgY2hhciBsYiA9IGxlYWQ7CisJCXVuc2lnbmVkIGNoYXIgdGIgPSB0cmFpbDsKKworCQkvKiBjb252ZXJ0IHByb2Nlc3MgY29kZSB0byBKSVMgKi8KKyMgaWYgZGVmaW5lZChXSU4zMjY0KSB8fCBkZWZpbmVkKFdJTjMyVU5JWCkgfHwgZGVmaW5lZChNQUNPUykKKwkJLyogcHJvY2VzcyBjb2RlIGlzIFNKSVMgKi8KKwkJaWYgKGxiIDw9IDB4OWYpCisJCSAgICBsYiA9IChsYiAtIDB4ODEpICogMiArIDB4MjE7CisJCWVsc2UKKwkJICAgIGxiID0gKGxiIC0gMHhjMSkgKiAyICsgMHgyMTsKKwkJaWYgKHRiIDw9IDB4N2UpCisJCSAgICB0YiAtPSAweDFmOworCQllbHNlIGlmICh0YiA8PSAweDllKQorCQkgICAgdGIgLT0gMHgyMDsKKwkJZWxzZQorCQl7CisJCSAgICB0YiAtPSAweDdlOworCQkgICAgbGIgKz0gMTsKKwkJfQorIyBlbHNlCisJCS8qCisJCSAqIFhYWDogQ29kZSBwYWdlIGlkZW50aWZpY2F0aW9uIGNhbiBub3QgdXNlIHdpdGggYWxsCisJCSAqCSAgICBzeXN0ZW0hIFNvLCBzb21lIG90aGVyIGVuY29kaW5nIGluZm9ybWF0aW9uCisJCSAqCSAgICB3aWxsIGJlIG5lZWRlZC4KKwkJICoJICAgIEluIGphcGFuZXNlOiBTSklTLEVVQyxVTklDT0RFLChKSVMpCisJCSAqCSAgICBOb3RlIHRoYXQgSklTLWNvZGUgc3lzdGVtIGRvbid0IHVzZSBhcworCQkgKgkgICAgcHJvY2VzcyBjb2RlIGluIG1vc3Qgc3lzdGVtIGJlY2F1c2UgaXQgdXNlcworCQkgKgkgICAgZXNjYXBlIHNlcXVlbmNlcyhKSVMgaXMgY29udGV4dCBkZXBlbmQgZW5jb2RpbmcpLgorCQkgKi8KKwkJLyogYXNzdW1lIHByb2Nlc3MgY29kZSBpcyBKQVBBTkVTRS1FVUMgKi8KKwkJbGIgJj0gMHg3ZjsKKwkJdGIgJj0gMHg3ZjsKKyMgZW5kaWYKKwkJLyogZXhjZXB0aW9ucyAqLworCQlzd2l0Y2ggKGxiIDw8IDggfCB0YikKKwkJeworCQkgICAgY2FzZSAweDIxMjE6IC8qIFpFTktBS1Ugc3BhY2UgKi8KKwkJCXJldHVybiAwOworCQkgICAgY2FzZSAweDIxMjI6IC8qIEtVLVRFTiAoSmFwYW5lc2UgY29tbWEpICovCisJCSAgICBjYXNlIDB4MjEyMzogLyogVE9VLVRFTiAoSmFwYW5lc2UgcGVyaW9kKSAqLworCQkgICAgY2FzZSAweDIxMjQ6IC8qIFpFTktBS1UgY29tbWEgKi8KKwkJICAgIGNhc2UgMHgyMTI1OiAvKiBaRU5LQUtVIHBlcmlvZCAqLworCQkJcmV0dXJuIDE7CisJCSAgICBjYXNlIDB4MjEzYzogLyogcHJvbG9uZ2Vkc291bmQgaGFuZGxlZCBhcyBLQVRBS0FOQSAqLworCQkJcmV0dXJuIDEzOworCQl9CisJCS8qIHNpZXZlZCBieSBLVSBjb2RlICovCisJCXN3aXRjaCAobGIpCisJCXsKKwkJICAgIGNhc2UgMHgyMToKKwkJICAgIGNhc2UgMHgyMjoKKwkJCS8qIHNwZWNpYWwgc3ltYm9scyAqLworCQkJcmV0dXJuIDEwOworCQkgICAgY2FzZSAweDIzOgorCQkJLyogYWxwaGEtbnVtZXJpYyAqLworCQkJcmV0dXJuIDExOworCQkgICAgY2FzZSAweDI0OgorCQkJLyogaGlyYWdhbmEgKi8KKwkJCXJldHVybiAxMjsKKwkJICAgIGNhc2UgMHgyNToKKwkJCS8qIGthdGFrYW5hICovCisJCQlyZXR1cm4gMTM7CisJCSAgICBjYXNlIDB4MjY6CisJCQkvKiBncmVlayAqLworCQkJcmV0dXJuIDE0OworCQkgICAgY2FzZSAweDI3OgorCQkJLyogcnVzc2lhbiAqLworCQkJcmV0dXJuIDE1OworCQkgICAgY2FzZSAweDI4OgorCQkJLyogbGluZXMgKi8KKwkJCXJldHVybiAxNjsKKwkJICAgIGRlZmF1bHQ6CisJCQkvKiBrYW5qaSAqLworCQkJcmV0dXJuIDE3OworCQl9CisJICAgIH0KKworCWNhc2UgREJDU19LT1JVOgkvKiA/ICovCisJY2FzZSBEQkNTX0tPUjoKKwkgICAgeworCQkvKiBLUyBjb2RlIGNsYXNzaWZpY2F0aW9uICovCisJCXVuc2lnbmVkIGNoYXIgYzEgPSBsZWFkOworCQl1bnNpZ25lZCBjaGFyIGMyID0gdHJhaWw7CisKKwkJLyoKKwkJICogMjAgOiBIYW5ndWwKKwkJICogMjEgOiBIYW5qYQorCQkgKiAyMiA6IFN5bWJvbHMKKwkJICogMjMgOiBBbHBoYS1udW1lcmljL1JvbWFuIExldHRlciAoRnVsbCB3aWR0aCkKKwkJICogMjQgOiBIYW5ndWwgTGV0dGVyKEFscGhhYmV0KQorCQkgKiAyNSA6IFJvbWFuIE51bWVyYWwvR3JlZWsgTGV0dGVyCisJCSAqIDI2IDogQm94IERyYXdpbmdzCisJCSAqIDI3IDogVW5pdCBTeW1ib2xzCisJCSAqIDI4IDogQ2lyY2xlZC9QYXJlbnRoZXNpemVkIExldHRlcgorCQkgKiAyOSA6IEhpcmlnYW5hL0thdGFrYW5hCisJCSAqIDMwIDogQ3lyaWxsaWMgTGV0dGVyCisJCSAqLworCisJCWlmIChjMSA+PSAweEIwICYmIGMxIDw9IDB4QzgpCisJCSAgICAvKiBIYW5ndWwgKi8KKwkJICAgIHJldHVybiAyMDsKKyNpZiBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoV0lOMzJVTklYKQorCQllbHNlIGlmIChjMSA8PSAweEEwIHx8IGMyIDw9IDB4QTApCisJCSAgICAvKiBFeHRlbmRlZCBIYW5ndWwgUmVnaW9uIDogTVMgVUhDKFVuaWZpZWQgSGFuZ3VsIENvZGUpICovCisJCSAgICAvKiBjMTogMHg4MS0weEEwIHdpdGggYzI6IDB4NDEtMHg1QSwgMHg2MS0weDdBLCAweDgxLTB4RkUKKwkJICAgICAqIGMxOiAweEExLTB4QzYgd2l0aCBjMjogMHg0MS0weDVBLCAweDYxLTB4N0EsIDB4ODEtMHhBMAorCQkgICAgICovCisJCSAgICByZXR1cm4gMjA7CisjZW5kaWYKKworCQllbHNlIGlmIChjMSA+PSAweENBICYmIGMxIDw9IDB4RkQpCisJCSAgICAvKiBIYW5qYSAqLworCQkgICAgcmV0dXJuIDIxOworCQllbHNlIHN3aXRjaCAoYzEpCisJCXsKKwkJICAgIGNhc2UgMHhBMToKKwkJICAgIGNhc2UgMHhBMjoKKwkJCS8qIFN5bWJvbHMgKi8KKwkJCXJldHVybiAyMjsKKwkJICAgIGNhc2UgMHhBMzoKKwkJCS8qIEFscGhhLW51bWVyaWMgKi8KKwkJCXJldHVybiAyMzsKKwkJICAgIGNhc2UgMHhBNDoKKwkJCS8qIEhhbmd1bCBMZXR0ZXIoQWxwaGFiZXQpICovCisJCQlyZXR1cm4gMjQ7CisJCSAgICBjYXNlIDB4QTU6CisJCQkvKiBSb21hbiBOdW1lcmFsL0dyZWVrIExldHRlciAqLworCQkJcmV0dXJuIDI1OworCQkgICAgY2FzZSAweEE2OgorCQkJLyogQm94IERyYXdpbmdzICovCisJCQlyZXR1cm4gMjY7CisJCSAgICBjYXNlIDB4QTc6CisJCQkvKiBVbml0IFN5bWJvbHMgKi8KKwkJCXJldHVybiAyNzsKKwkJICAgIGNhc2UgMHhBODoKKwkJICAgIGNhc2UgMHhBOToKKwkJCWlmIChjMiA8PSAweEFGKQorCQkJICAgIHJldHVybiAyNTsgIC8qIFJvbWFuIExldHRlciAqLworCQkJZWxzZSBpZiAoYzIgPj0gMHhGNikKKwkJCSAgICByZXR1cm4gMjI7ICAvKiBTeW1ib2xzICovCisJCQllbHNlCisJCQkgICAgLyogQ2lyY2xlZC9QYXJlbnRoZXNpemVkIExldHRlciAqLworCQkJICAgIHJldHVybiAyODsKKwkJICAgIGNhc2UgMHhBQToKKwkJICAgIGNhc2UgMHhBQjoKKwkJCS8qIEhpcmlnYW5hL0thdGFrYW5hICovCisJCQlyZXR1cm4gMjk7CisJCSAgICBjYXNlIDB4QUM6CisJCQkvKiBDeXJpbGxpYyBMZXR0ZXIgKi8KKwkJCXJldHVybiAzMDsKKwkJfQorCSAgICB9CisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAzOworfQorCisvKgorICogbWJfY2hhcjJsZW4oKSBmdW5jdGlvbiBwb2ludGVyLgorICogUmV0dXJuIGxlbmd0aCBpbiBieXRlcyBvZiBjaGFyYWN0ZXIgImMiLgorICogUmV0dXJucyAxIGZvciBhIHNpbmdsZS1ieXRlIGNoYXJhY3Rlci4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK2xhdGluX2NoYXIybGVuKGMpCisgICAgaW50CQljOworeworICAgIHJldHVybiAxOworfQorCisgICAgc3RhdGljIGludAorZGJjc19jaGFyMmxlbihjKQorICAgIGludAkJYzsKK3sKKyAgICBpZiAoYyA+PSAweDEwMCkKKwlyZXR1cm4gMjsKKyAgICByZXR1cm4gMTsKK30KKworLyoKKyAqIG1iX2NoYXIyYnl0ZXMoKSBmdW5jdGlvbiBwb2ludGVyLgorICogQ29udmVydCBhIGNoYXJhY3RlciB0byBpdHMgYnl0ZXMuCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggaW4gYnl0ZXMuCisgKi8KKyAgICBpbnQKK2xhdGluX2NoYXIyYnl0ZXMoYywgYnVmKQorICAgIGludAkJYzsKKyAgICBjaGFyX3UJKmJ1ZjsKK3sKKyAgICBidWZbMF0gPSBjOworICAgIHJldHVybiAxOworfQorCisgICAgc3RhdGljIGludAorZGJjc19jaGFyMmJ5dGVzKGMsIGJ1ZikKKyAgICBpbnQJCWM7CisgICAgY2hhcl91CSpidWY7Cit7CisgICAgaWYgKGMgPj0gMHgxMDApCisgICAgeworCWJ1ZlswXSA9ICh1bnNpZ25lZCljID4+IDg7CisJYnVmWzFdID0gYzsKKwlyZXR1cm4gMjsKKyAgICB9CisgICAgYnVmWzBdID0gYzsKKyAgICByZXR1cm4gMTsKK30KKworLyoKKyAqIG1iX3B0cjJsZW5fY2hlY2soKSBmdW5jdGlvbiBwb2ludGVyLgorICogR2V0IGJ5dGUgbGVuZ3RoIG9mIGNoYXJhY3RlciBhdCAiKnAiIGJ1dCBzdG9wIGF0IGEgTlVMLgorICogRm9yIFVURi04IHRoaXMgaW5jbHVkZXMgZm9sbG93aW5nIGNvbXBvc2luZyBjaGFyYWN0ZXJzLgorICogUmV0dXJucyAwIHdoZW4gKnAgaXMgTlVMLgorICoKKyAqLworICAgIGludAorbGF0aW5fcHRyMmxlbl9jaGVjayhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICByZXR1cm4gTUJfQllURTJMRU4oKnApOworfQorCisgICAgc3RhdGljIGludAorZGJjc19wdHIybGVuX2NoZWNrKHApCisgICAgY2hhcl91CSpwOworeworICAgIGludAkJbGVuOworCisgICAgLyogQ2hlY2sgaWYgc2Vjb25kIGJ5dGUgaXMgbm90IG1pc3NpbmcuICovCisgICAgbGVuID0gTUJfQllURTJMRU4oKnApOworICAgIGlmIChsZW4gPT0gMiAmJiBwWzFdID09IE5VTCkKKwlsZW4gPSAxOworICAgIHJldHVybiBsZW47Cit9CisKK3N0cnVjdCBpbnRlcnZhbAoreworICAgIHVuc2lnbmVkIHNob3J0IGZpcnN0OworICAgIHVuc2lnbmVkIHNob3J0IGxhc3Q7Cit9Oworc3RhdGljIGludCBpbnRhYmxlIF9fQVJHUygoc3RydWN0IGludGVydmFsICp0YWJsZSwgc2l6ZV90IHNpemUsIGludCBjKSk7CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiYyIgaXMgaW4gInRhYmxlW3NpemUgLyBzaXplb2Yoc3RydWN0IGludGVydmFsKV0iLgorICovCisgICAgc3RhdGljIGludAoraW50YWJsZSh0YWJsZSwgc2l6ZSwgYykKKyAgICBzdHJ1Y3QgaW50ZXJ2YWwJKnRhYmxlOworICAgIHNpemVfdAkJc2l6ZTsKKyAgICBpbnQJCQljOworeworICAgIGludCBtaWQsIGJvdCwgdG9wOworCisgICAgLyogZmlyc3QgcXVpY2sgY2hlY2sgZm9yIExhdGluMSBldGMuIGNoYXJhY3RlcnMgKi8KKyAgICBpZiAoYyA8IHRhYmxlWzBdLmZpcnN0KQorCXJldHVybiBGQUxTRTsKKworICAgIC8qIGJpbmFyeSBzZWFyY2ggaW4gdGFibGUgKi8KKyAgICBib3QgPSAwOworICAgIHRvcCA9IHNpemUgLyBzaXplb2Yoc3RydWN0IGludGVydmFsKSAtIDE7CisgICAgd2hpbGUgKHRvcCA+PSBib3QpCisgICAgeworCW1pZCA9IChib3QgKyB0b3ApIC8gMjsKKwlpZiAodGFibGVbbWlkXS5sYXN0IDwgYykKKwkgICAgYm90ID0gbWlkICsgMTsKKwllbHNlIGlmICh0YWJsZVttaWRdLmZpcnN0ID4gYykKKwkgICAgdG9wID0gbWlkIC0gMTsKKwllbHNlCisJICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBGb3IgVVRGLTggY2hhcmFjdGVyICJjIiByZXR1cm4gMiBmb3IgYSBkb3VibGUtd2lkdGggY2hhcmFjdGVyLCAxIGZvciBvdGhlcnMuCisgKiBSZXR1cm5zIDQgb3IgNiBmb3IgYW4gdW5wcmludGFibGUgY2hhcmFjdGVyLgorICogSXMgb25seSBjb3JyZWN0IGZvciBjaGFyYWN0ZXJzID49IDB4ODAuCisgKiBXaGVuIHBfYW1idyBpcyAiZG91YmxlIiwgcmV0dXJuIDIgZm9yIGEgY2hhcmFjdGVyIHdpdGggRWFzdCBBc2lhbiBXaWR0aAorICogY2xhc3MgJ0EnKG1iaWd1b3VzKS4KKyAqLworICAgIGludAordXRmX2NoYXIyY2VsbHMoYykKKyAgICBpbnQJCWM7Cit7CisgICAgLyogc29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyBvZiBFYXN0IEFzaWFuIEFtYmlndW91cworICAgICAqIGNoYXJhY3RlcnMsIGdlbmVyYXRlZCB3aXRoOgorICAgICAqICJ1bmlzZXQgK1dJRFRILUEgLWNhdD1NZSAtY2F0PU1uIC1jYXQ9Q2YgYyIgKi8KKyAgICBzdGF0aWMgc3RydWN0IGludGVydmFsIGFtYmlndW91c1tdID0geworCXsweDAwQTEsIDB4MDBBMX0sIHsweDAwQTQsIDB4MDBBNH0sIHsweDAwQTcsIDB4MDBBOH0sCisJezB4MDBBQSwgMHgwMEFBfSwgezB4MDBBRSwgMHgwMEFFfSwgezB4MDBCMCwgMHgwMEI0fSwKKwl7MHgwMEI2LCAweDAwQkF9LCB7MHgwMEJDLCAweDAwQkZ9LCB7MHgwMEM2LCAweDAwQzZ9LAorCXsweDAwRDAsIDB4MDBEMH0sIHsweDAwRDcsIDB4MDBEOH0sIHsweDAwREUsIDB4MDBFMX0sCisJezB4MDBFNiwgMHgwMEU2fSwgezB4MDBFOCwgMHgwMEVBfSwgezB4MDBFQywgMHgwMEVEfSwKKwl7MHgwMEYwLCAweDAwRjB9LCB7MHgwMEYyLCAweDAwRjN9LCB7MHgwMEY3LCAweDAwRkF9LAorCXsweDAwRkMsIDB4MDBGQ30sIHsweDAwRkUsIDB4MDBGRX0sIHsweDAxMDEsIDB4MDEwMX0sCisJezB4MDExMSwgMHgwMTExfSwgezB4MDExMywgMHgwMTEzfSwgezB4MDExQiwgMHgwMTFCfSwKKwl7MHgwMTI2LCAweDAxMjd9LCB7MHgwMTJCLCAweDAxMkJ9LCB7MHgwMTMxLCAweDAxMzN9LAorCXsweDAxMzgsIDB4MDEzOH0sIHsweDAxM0YsIDB4MDE0Mn0sIHsweDAxNDQsIDB4MDE0NH0sCisJezB4MDE0OCwgMHgwMTRCfSwgezB4MDE0RCwgMHgwMTREfSwgezB4MDE1MiwgMHgwMTUzfSwKKwl7MHgwMTY2LCAweDAxNjd9LCB7MHgwMTZCLCAweDAxNkJ9LCB7MHgwMUNFLCAweDAxQ0V9LAorCXsweDAxRDAsIDB4MDFEMH0sIHsweDAxRDIsIDB4MDFEMn0sIHsweDAxRDQsIDB4MDFENH0sCisJezB4MDFENiwgMHgwMUQ2fSwgezB4MDFEOCwgMHgwMUQ4fSwgezB4MDFEQSwgMHgwMURBfSwKKwl7MHgwMURDLCAweDAxREN9LCB7MHgwMjUxLCAweDAyNTF9LCB7MHgwMjYxLCAweDAyNjF9LAorCXsweDAyQzQsIDB4MDJDNH0sIHsweDAyQzcsIDB4MDJDN30sIHsweDAyQzksIDB4MDJDQn0sCisJezB4MDJDRCwgMHgwMkNEfSwgezB4MDJEMCwgMHgwMkQwfSwgezB4MDJEOCwgMHgwMkRCfSwKKwl7MHgwMkRELCAweDAyRER9LCB7MHgwMkRGLCAweDAyREZ9LCB7MHgwMzkxLCAweDAzQTF9LAorCXsweDAzQTMsIDB4MDNBOX0sIHsweDAzQjEsIDB4MDNDMX0sIHsweDAzQzMsIDB4MDNDOX0sCisJezB4MDQwMSwgMHgwNDAxfSwgezB4MDQxMCwgMHgwNDRGfSwgezB4MDQ1MSwgMHgwNDUxfSwKKwl7MHgyMDEwLCAweDIwMTB9LCB7MHgyMDEzLCAweDIwMTZ9LCB7MHgyMDE4LCAweDIwMTl9LAorCXsweDIwMUMsIDB4MjAxRH0sIHsweDIwMjAsIDB4MjAyMn0sIHsweDIwMjQsIDB4MjAyN30sCisJezB4MjAzMCwgMHgyMDMwfSwgezB4MjAzMiwgMHgyMDMzfSwgezB4MjAzNSwgMHgyMDM1fSwKKwl7MHgyMDNCLCAweDIwM0J9LCB7MHgyMDNFLCAweDIwM0V9LCB7MHgyMDc0LCAweDIwNzR9LAorCXsweDIwN0YsIDB4MjA3Rn0sIHsweDIwODEsIDB4MjA4NH0sIHsweDIwQUMsIDB4MjBBQ30sCisJezB4MjEwMywgMHgyMTAzfSwgezB4MjEwNSwgMHgyMTA1fSwgezB4MjEwOSwgMHgyMTA5fSwKKwl7MHgyMTEzLCAweDIxMTN9LCB7MHgyMTE2LCAweDIxMTZ9LCB7MHgyMTIxLCAweDIxMjJ9LAorCXsweDIxMjYsIDB4MjEyNn0sIHsweDIxMkIsIDB4MjEyQn0sIHsweDIxNTMsIDB4MjE1NH0sCisJezB4MjE1QiwgMHgyMTVFfSwgezB4MjE2MCwgMHgyMTZCfSwgezB4MjE3MCwgMHgyMTc5fSwKKwl7MHgyMTkwLCAweDIxOTl9LCB7MHgyMUI4LCAweDIxQjl9LCB7MHgyMUQyLCAweDIxRDJ9LAorCXsweDIxRDQsIDB4MjFENH0sIHsweDIxRTcsIDB4MjFFN30sIHsweDIyMDAsIDB4MjIwMH0sCisJezB4MjIwMiwgMHgyMjAzfSwgezB4MjIwNywgMHgyMjA4fSwgezB4MjIwQiwgMHgyMjBCfSwKKwl7MHgyMjBGLCAweDIyMEZ9LCB7MHgyMjExLCAweDIyMTF9LCB7MHgyMjE1LCAweDIyMTV9LAorCXsweDIyMUEsIDB4MjIxQX0sIHsweDIyMUQsIDB4MjIyMH0sIHsweDIyMjMsIDB4MjIyM30sCisJezB4MjIyNSwgMHgyMjI1fSwgezB4MjIyNywgMHgyMjJDfSwgezB4MjIyRSwgMHgyMjJFfSwKKwl7MHgyMjM0LCAweDIyMzd9LCB7MHgyMjNDLCAweDIyM0R9LCB7MHgyMjQ4LCAweDIyNDh9LAorCXsweDIyNEMsIDB4MjI0Q30sIHsweDIyNTIsIDB4MjI1Mn0sIHsweDIyNjAsIDB4MjI2MX0sCisJezB4MjI2NCwgMHgyMjY3fSwgezB4MjI2QSwgMHgyMjZCfSwgezB4MjI2RSwgMHgyMjZGfSwKKwl7MHgyMjgyLCAweDIyODN9LCB7MHgyMjg2LCAweDIyODd9LCB7MHgyMjk1LCAweDIyOTV9LAorCXsweDIyOTksIDB4MjI5OX0sIHsweDIyQTUsIDB4MjJBNX0sIHsweDIyQkYsIDB4MjJCRn0sCisJezB4MjMxMiwgMHgyMzEyfSwgezB4MjQ2MCwgMHgyNEU5fSwgezB4MjRFQiwgMHgyNTRCfSwKKwl7MHgyNTUwLCAweDI1NzN9LCB7MHgyNTgwLCAweDI1OEZ9LCB7MHgyNTkyLCAweDI1OTV9LAorCXsweDI1QTAsIDB4MjVBMX0sIHsweDI1QTMsIDB4MjVBOX0sIHsweDI1QjIsIDB4MjVCM30sCisJezB4MjVCNiwgMHgyNUI3fSwgezB4MjVCQywgMHgyNUJEfSwgezB4MjVDMCwgMHgyNUMxfSwKKwl7MHgyNUM2LCAweDI1Qzh9LCB7MHgyNUNCLCAweDI1Q0J9LCB7MHgyNUNFLCAweDI1RDF9LAorCXsweDI1RTIsIDB4MjVFNX0sIHsweDI1RUYsIDB4MjVFRn0sIHsweDI2MDUsIDB4MjYwNn0sCisJezB4MjYwOSwgMHgyNjA5fSwgezB4MjYwRSwgMHgyNjBGfSwgezB4MjYxNCwgMHgyNjE1fSwKKwl7MHgyNjFDLCAweDI2MUN9LCB7MHgyNjFFLCAweDI2MUV9LCB7MHgyNjQwLCAweDI2NDB9LAorCXsweDI2NDIsIDB4MjY0Mn0sIHsweDI2NjAsIDB4MjY2MX0sIHsweDI2NjMsIDB4MjY2NX0sCisJezB4MjY2NywgMHgyNjZBfSwgezB4MjY2QywgMHgyNjZEfSwgezB4MjY2RiwgMHgyNjZGfSwKKwl7MHgyNzNELCAweDI3M0R9LCB7MHgyNzc2LCAweDI3N0Z9LCB7MHhFMDAwLCAweEY4RkZ9LAorCXsweEZGRkQsIDB4RkZGRH0sIC8qIHsweEYwMDAwLCAweEZGRkZEfSwgezB4MTAwMDAwLCAweDEwRkZGRH0gKi8KKyAgICB9OworCisgICAgaWYgKGMgPj0gMHgxMDApCisgICAgeworI2lmZGVmIFVTRV9XQ0hBUl9GVU5DVElPTlMKKwkvKgorCSAqIEFzc3VtZSB0aGUgbGlicmFyeSBmdW5jdGlvbiB3Y3dpZHRoKCkgd29ya3MgYmV0dGVyIHRoYW4gb3VyIG93bgorCSAqIHN0dWZmLiAgSXQgc2hvdWxkIHJldHVybiAxIGZvciBhbWJpZ3VvdXMgd2lkdGggY2hhcnMhCisJICovCisJaW50CW4gPSB3Y3dpZHRoKGMpOworCisJaWYgKG4gPCAwKQorCSAgICByZXR1cm4gNjsJCS8qIHVucHJpbnRhYmxlLCBkaXNwbGF5cyA8eHh4eD4gKi8KKwlpZiAobiA+IDEpCisJICAgIHJldHVybiBuOworI2Vsc2UKKwlpZiAoIXV0Zl9wcmludGFibGUoYykpCisJICAgIHJldHVybiA2OwkJLyogdW5wcmludGFibGUsIGRpc3BsYXlzIDx4eHh4PiAqLworCWlmIChjID49IDB4MTEwMAorCSAgICAmJiAoYyA8PSAweDExNWYJCQkvKiBIYW5ndWwgSmFtbyAqLworCQl8fCBjID09IDB4MjMyOQorCQl8fCBjID09IDB4MjMyYQorCQl8fCAoYyA+PSAweDJlODAgJiYgYyA8PSAweGE0Y2YKKwkJICAgICYmIGMgIT0gMHgzMDNmKQkJLyogQ0pLIC4uLiBZaSAqLworCQl8fCAoYyA+PSAweGFjMDAgJiYgYyA8PSAweGQ3YTMpCS8qIEhhbmd1bCBTeWxsYWJsZXMgKi8KKwkJfHwgKGMgPj0gMHhmOTAwICYmIGMgPD0gMHhmYWZmKQkvKiBDSksgQ29tcGF0aWJpbGl0eQorCQkJCQkJICAgSWRlb2dyYXBocyAqLworCQl8fCAoYyA+PSAweGZlMzAgJiYgYyA8PSAweGZlNmYpCS8qIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisJCXx8IChjID49IDB4ZmYwMCAmJiBjIDw9IDB4ZmY2MCkJLyogRnVsbHdpZHRoIEZvcm1zICovCisJCXx8IChjID49IDB4ZmZlMCAmJiBjIDw9IDB4ZmZlNikKKwkJfHwgKGMgPj0gMHgyMDAwMCAmJiBjIDw9IDB4MmZmZmQpCisJCXx8IChjID49IDB4MzAwMDAgJiYgYyA8PSAweDNmZmZkKSkpCisJICAgIHJldHVybiAyOworI2VuZGlmCisgICAgfQorCisgICAgLyogQ2hhcmFjdGVycyBiZWxvdyAweDEwMCBhcmUgaW5mbHVlbmNlZCBieSAnaXNwcmludCcgb3B0aW9uICovCisgICAgZWxzZSBpZiAoYyA+PSAweDgwICYmICF2aW1faXNwcmludGMoYykpCisJcmV0dXJuIDQ7CQkvKiB1bnByaW50YWJsZSwgZGlzcGxheXMgPHh4PiAqLworCisgICAgaWYgKGMgPj0gMHg4MCAmJiAqcF9hbWJ3ID09ICdkJyAmJiBpbnRhYmxlKGFtYmlndW91cywgc2l6ZW9mKGFtYmlndW91cyksIGMpKQorCXJldHVybiAyOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBtYl9wdHIyY2VsbHMoKSBmdW5jdGlvbiBwb2ludGVyLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGlzcGxheSBjZWxscyBjaGFyYWN0ZXIgYXQgIipwIiBvY2N1cGllcy4KKyAqIFRoaXMgZG9lc24ndCB0YWtlIGNhcmUgb2YgdW5wcmludGFibGUgY2hhcmFjdGVycywgdXNlIHB0cjJjZWxscygpIGZvciB0aGF0LgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK2xhdGluX3B0cjJjZWxscyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICByZXR1cm4gMTsKK30KKworICAgIGludAordXRmX3B0cjJjZWxscyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpbnQJCWM7CisKKyAgICAvKiBOZWVkIHRvIGNvbnZlcnQgdG8gYSB3aWRlIGNoYXJhY3Rlci4gKi8KKyAgICBpZiAoKnAgPj0gMHg4MCkKKyAgICB7CisJYyA9IHV0Zl9wdHIyY2hhcihwKTsKKwkvKiBBbiBpbGxlZ2FsIGJ5dGUgaXMgZGlzcGxheWVkIGFzIDx4eD4uICovCisJaWYgKHV0Zl9wdHIybGVuX2NoZWNrKHApID09IDEgfHwgYyA9PSBOVUwpCisJICAgIHJldHVybiA0OworCS8qIElmIHRoZSBjaGFyIGlzIEFTQ0lJIGl0IG11c3QgYmUgYW4gb3Zlcmxvbmcgc2VxdWVuY2UuICovCisJaWYgKGMgPCAweDgwKQorCSAgICByZXR1cm4gY2hhcjJjZWxscyhjKTsKKwlyZXR1cm4gdXRmX2NoYXIyY2VsbHMoYyk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisgICAgaW50CitkYmNzX3B0cjJjZWxscyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICAvKiBOdW1iZXIgb2YgY2VsbHMgaXMgZXF1YWwgdG8gbnVtYmVyIG9mIGJ5dGVzLCBleGNlcHQgZm9yIGV1Yy1qcCB3aGVuCisgICAgICogdGhlIGZpcnN0IGJ5dGUgaXMgMHg4ZS4gKi8KKyAgICBpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmICpwID09IDB4OGUpCisJcmV0dXJuIDE7CisgICAgcmV0dXJuIE1CX0JZVEUyTEVOKCpwKTsKK30KKworLyoKKyAqIG1iX2NoYXIyY2VsbHMoKSBmdW5jdGlvbiBwb2ludGVyLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGlzcGxheSBjZWxscyBjaGFyYWN0ZXIgImMiIG9jY3VwaWVzLgorICogT25seSB0YWtlcyBjYXJlIG9mIG11bHRpLWJ5dGUgY2hhcnMsIG5vdCAiXkMiIGFuZCBzdWNoLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK2xhdGluX2NoYXIyY2VsbHMoYykKKyAgICBpbnQJCWM7Cit7CisgICAgcmV0dXJuIDE7Cit9CisKKyAgICBzdGF0aWMgaW50CitkYmNzX2NoYXIyY2VsbHMoYykKKyAgICBpbnQJCWM7Cit7CisgICAgLyogTnVtYmVyIG9mIGNlbGxzIGlzIGVxdWFsIHRvIG51bWJlciBvZiBieXRlcywgZXhjZXB0IGZvciBldWMtanAgd2hlbgorICAgICAqIHRoZSBmaXJzdCBieXRlIGlzIDB4OGUuICovCisgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiAoKHVuc2lnbmVkKWMgPj4gOCkgPT0gMHg4ZSkKKwlyZXR1cm4gMTsKKyAgICAvKiB1c2UgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICByZXR1cm4gTUJfQllURTJMRU4oKHVuc2lnbmVkKWMgPj4gOCk7Cit9CisKKy8qCisgKiBtYl9vZmYyY2VsbHMoKSBmdW5jdGlvbiBwb2ludGVyLgorICogUmV0dXJuIG51bWJlciBvZiBkaXNwbGF5IGNlbGxzIGZvciBjaGFyIGF0IFNjcmVlbkxpbmVzW29mZl0uCisgKiBDYWxsZXIgbXVzdCBtYWtlIHN1cmUgIm9mZiIgYW5kICJvZmYgKyAxIiBhcmUgdmFsaWQhCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGludAorbGF0aW5fb2ZmMmNlbGxzKG9mZikKKyAgICB1bnNpZ25lZAlvZmY7Cit7CisgICAgcmV0dXJuIDE7Cit9CisKKyAgICBpbnQKK2RiY3Nfb2ZmMmNlbGxzKG9mZikKKyAgICB1bnNpZ25lZAlvZmY7Cit7CisgICAgLyogTnVtYmVyIG9mIGNlbGxzIGlzIGVxdWFsIHRvIG51bWJlciBvZiBieXRlcywgZXhjZXB0IGZvciBldWMtanAgd2hlbgorICAgICAqIHRoZSBmaXJzdCBieXRlIGlzIDB4OGUuICovCisgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBTY3JlZW5MaW5lc1tvZmZdID09IDB4OGUpCisJcmV0dXJuIDE7CisgICAgcmV0dXJuIE1CX0JZVEUyTEVOKFNjcmVlbkxpbmVzW29mZl0pOworfQorCisgICAgaW50Cit1dGZfb2ZmMmNlbGxzKG9mZikKKyAgICB1bnNpZ25lZAlvZmY7Cit7CisgICAgcmV0dXJuIFNjcmVlbkxpbmVzW29mZiArIDFdID09IDAgPyAyIDogMTsKK30KKworLyoKKyAqIG1iX3B0cjJjaGFyKCkgZnVuY3Rpb24gcG9pbnRlci4KKyAqIENvbnZlcnQgYSBieXRlIHNlcXVlbmNlIGludG8gYSBjaGFyYWN0ZXIuCisgKi8KKyAgICBpbnQKK2xhdGluX3B0cjJjaGFyKHApCisgICAgY2hhcl91CSpwOworeworICAgIHJldHVybiAqcDsKK30KKworICAgIHN0YXRpYyBpbnQKK2RiY3NfcHRyMmNoYXIocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaWYgKE1CX0JZVEUyTEVOKCpwKSA+IDEgJiYgcFsxXSAhPSBOVUwpCisJcmV0dXJuIChwWzBdIDw8IDgpICsgcFsxXTsKKyAgICByZXR1cm4gKnA7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgVVRGLTggYnl0ZSBzZXF1ZW5jZSB0byBhIHdpZGUgY2hhcmFjdGVyLgorICogSWYgdGhlIHNlcXVlbmNlIGlzIGlsbGVnYWwgb3IgdHJ1bmNhdGVkIGJ5IGEgTlVMIHRoZSBmaXJzdCBieXRlIGlzCisgKiByZXR1cm5lZC4KKyAqIERvZXMgbm90IGluY2x1ZGUgY29tcG9zaW5nIGNoYXJhY3RlcnMsIG9mIGNvdXJzZS4KKyAqLworICAgIGludAordXRmX3B0cjJjaGFyKHApCisgICAgY2hhcl91CSpwOworeworICAgIGludAkJbGVuOworCisgICAgaWYgKHBbMF0gPCAweDgwKQkvKiBiZSBxdWljayBmb3IgQVNDSUkgKi8KKwlyZXR1cm4gcFswXTsKKworICAgIGxlbiA9IHV0ZjhsZW5fdGFiW3BbMF1dOworICAgIGlmICgocFsxXSAmIDB4YzApID09IDB4ODApCisgICAgeworCWlmIChsZW4gPT0gMikKKwkgICAgcmV0dXJuICgocFswXSAmIDB4MWYpIDw8IDYpICsgKHBbMV0gJiAweDNmKTsKKwlpZiAoKHBbMl0gJiAweGMwKSA9PSAweDgwKQorCXsKKwkgICAgaWYgKGxlbiA9PSAzKQorCQlyZXR1cm4gKChwWzBdICYgMHgwZikgPDwgMTIpICsgKChwWzFdICYgMHgzZikgPDwgNikKKwkJICAgICsgKHBbMl0gJiAweDNmKTsKKwkgICAgaWYgKChwWzNdICYgMHhjMCkgPT0gMHg4MCkKKwkgICAgeworCQlpZiAobGVuID09IDQpCisJCSAgICByZXR1cm4gKChwWzBdICYgMHgwNykgPDwgMTgpICsgKChwWzFdICYgMHgzZikgPDwgMTIpCisJCQkrICgocFsyXSAmIDB4M2YpIDw8IDYpICsgKHBbM10gJiAweDNmKTsKKwkJaWYgKChwWzRdICYgMHhjMCkgPT0gMHg4MCkKKwkJeworCQkgICAgaWYgKGxlbiA9PSA1KQorCQkJcmV0dXJuICgocFswXSAmIDB4MDMpIDw8IDI0KSArICgocFsxXSAmIDB4M2YpIDw8IDE4KQorCQkJICAgICsgKChwWzJdICYgMHgzZikgPDwgMTIpICsgKChwWzNdICYgMHgzZikgPDwgNikKKwkJCSAgICArIChwWzRdICYgMHgzZik7CisJCSAgICBpZiAoKHBbNV0gJiAweGMwKSA9PSAweDgwICYmIGxlbiA9PSA2KQorCQkJcmV0dXJuICgocFswXSAmIDB4MDEpIDw8IDMwKSArICgocFsxXSAmIDB4M2YpIDw8IDI0KQorCQkJICAgICsgKChwWzJdICYgMHgzZikgPDwgMTgpICsgKChwWzNdICYgMHgzZikgPDwgMTIpCisJCQkgICAgKyAoKHBbNF0gJiAweDNmKSA8PCA2KSArIChwWzVdICYgMHgzZik7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgLyogSWxsZWdhbCB2YWx1ZSwganVzdCByZXR1cm4gdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICByZXR1cm4gcFswXTsKK30KKworLyoKKyAqIEdldCBjaGFyYWN0ZXIgYXQgKipwcCBhbmQgYWR2YW5jZSAqcHAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICogTm90ZTogY29tcG9zaW5nIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQhCisgKi8KKyAgICBpbnQKK21iX3B0cjJjaGFyX2FkdihwcCkKKyAgICBjaGFyX3UJKipwcDsKK3sKKyAgICBpbnQJCWM7CisKKyAgICBjID0gKCptYl9wdHIyY2hhcikoKnBwKTsKKyAgICAqcHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKSgqcHApOworICAgIHJldHVybiBjOworfQorCisjaWYgZGVmaW5lZChGRUFUX0FSQUJJQykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggQXJhYmljIGNvbWJpbmluZyBjaGFyYWN0ZXJzLgorICogTm90ZTogdGhlc2UgYXJlIE5PVCByZWFsbHkgY29tcG9zaW5nIGNoYXJhY3RlcnMhCisgKi8KKyAgICBpbnQKK2FyYWJpY19jb21iaW5lKG9uZSwgdHdvKQorICAgIGludAkJb25lOwkgICAgLyogZmlyc3QgY2hhcmFjdGVyICovCisgICAgaW50CQl0d287CSAgICAvKiBjaGFyYWN0ZXIganVzdCBhZnRlciAib25lIiAqLworeworICAgIGlmIChvbmUgPT0gYV9MQU0pCisJcmV0dXJuIGFyYWJpY19tYXljb21iaW5lKHR3byk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY2hhcmFjdGVyIHRoYXQgY291bGQgYmUgcmVnYXJkZWQgYXMgYW4KKyAqIEFyYWJpYyBjb21iaW5pbmcgY2hhcmFjdGVyLCBuZWVkIHRvIGNoZWNrIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoaXMuCisgKi8KKyAgICBpbnQKK2FyYWJpY19tYXljb21iaW5lKHR3bykKKyAgICBpbnQJCXR3bzsKK3sKKyAgICBpZiAocF9hcnNoYXBlICYmICFwX3RiaWRpKQorCXJldHVybiAodHdvID09IGFfQUxFRl9NQUREQQorCQkgICAgfHwgdHdvID09IGFfQUxFRl9IQU1aQV9BQk9WRQorCQkgICAgfHwgdHdvID09IGFfQUxFRl9IQU1aQV9CRUxPVworCQkgICAgfHwgdHdvID09IGFfQUxFRik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIGNoYXJhY3RlciBwb2ludGVkIHRvIGJ5ICJwMiIgaXMgYSBjb21wb3NpbmcgY2hhcmFjdGVyIHdoZW4gaXQKKyAqIGNvbWVzIGFmdGVyICJwMSIuICBGb3IgQXJhYmljIHNvbWV0aW1lcyAiYWIiIGlzIHJlcGxhY2VkIHdpdGggImMiLCB3aGljaAorICogYmVoYXZlcyBsaWtlIGEgY29tcG9zaW5nIGNoYXJhY3Rlci4KKyAqLworICAgIGludAordXRmX2NvbXBvc2luZ2xpa2UocDEsIHAyKQorICAgIGNoYXJfdQkqcDE7CisgICAgY2hhcl91CSpwMjsKK3sKKyAgICBpbnQJCWMyOworCisgICAgYzIgPSB1dGZfcHRyMmNoYXIocDIpOworICAgIGlmICh1dGZfaXNjb21wb3NpbmcoYzIpKQorCXJldHVybiBUUlVFOworICAgIGlmICghYXJhYmljX21heWNvbWJpbmUoYzIpKQorCXJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gYXJhYmljX2NvbWJpbmUodXRmX3B0cjJjaGFyKHAxKSwgYzIpOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGEgVVRGLTggYnl0ZSBzdHJpbmcgdG8gYSB3aWRlIGNoYXJhcmFjdGVyLiAgQWxzbyBnZXQgdXAgdG8gdHdvCisgKiBjb21wb3NpbmcgY2hhcmFjdGVycy4KKyAqLworICAgIGludAordXRmY19wdHIyY2hhcihwLCBwMSwgcDIpCisgICAgY2hhcl91CSpwOworICAgIGludAkJKnAxOwkvKiByZXR1cm46IGZpcnN0IGNvbXBvc2luZyBjaGFyIG9yIDAgKi8KKyAgICBpbnQJCSpwMjsJLyogcmV0dXJuOiBzZWNvbmQgY29tcG9zaW5nIGNoYXIgb3IgMCAqLworeworICAgIGludAkJbGVuOworICAgIGludAkJYzsKKyAgICBpbnQJCWNjOworCisgICAgYyA9IHV0Zl9wdHIyY2hhcihwKTsKKyAgICBsZW4gPSB1dGZfcHRyMmxlbl9jaGVjayhwKTsKKyAgICAvKiBPbmx5IGFjY2VwdCBhIGNvbXBvc2luZyBjaGFyIHdoZW4gdGhlIGZpcnN0IGNoYXIgaXNuJ3QgaWxsZWdhbC4gKi8KKyAgICBpZiAoKGxlbiA+IDEgfHwgKnAgPCAweDgwKQorCSAgICAmJiBwW2xlbl0gPj0gMHg4MAorCSAgICAmJiBVVEZfQ09NUE9TSU5HTElLRShwLCBwICsgbGVuKSkKKyAgICB7CisJKnAxID0gdXRmX3B0cjJjaGFyKHAgKyBsZW4pOworCWxlbiArPSB1dGZfcHRyMmxlbl9jaGVjayhwICsgbGVuKTsKKwlpZiAocFtsZW5dID49IDB4ODAgJiYgdXRmX2lzY29tcG9zaW5nKGNjID0gdXRmX3B0cjJjaGFyKHAgKyBsZW4pKSkKKwkgICAgKnAyID0gY2M7CisJZWxzZQorCSAgICAqcDIgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCSpwMSA9IDA7CisJKnAyID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGM7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgVVRGLTggYnl0ZSBzdHJpbmcgdG8gYSB3aWRlIGNoYXJhcmFjdGVyLiAgQWxzbyBnZXQgdXAgdG8gdHdvCisgKiBjb21wb3NpbmcgY2hhcmFjdGVycy4gIFVzZSBubyBtb3JlIHRoYW4gcFttYXhsZW5dLgorICovCisgICAgaW50Cit1dGZjX3B0cjJjaGFyX2xlbihwLCBwMSwgcDIsIG1heGxlbikKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQkqcDE7CS8qIHJldHVybjogZmlyc3QgY29tcG9zaW5nIGNoYXIgb3IgMCAqLworICAgIGludAkJKnAyOwkvKiByZXR1cm46IHNlY29uZCBjb21wb3NpbmcgY2hhciBvciAwICovCisgICAgaW50CQltYXhsZW47Cit7CisgICAgaW50CQlsZW47CisgICAgaW50CQljOworICAgIGludAkJY2M7CisKKyAgICBjID0gdXRmX3B0cjJjaGFyKHApOworICAgIGxlbiA9IHV0Zl9wdHIybGVuX2NoZWNrX2xlbihwLCBtYXhsZW4pOworICAgIC8qIE9ubHkgYWNjZXB0IGEgY29tcG9zaW5nIGNoYXIgd2hlbiB0aGUgZmlyc3QgY2hhciBpc24ndCBpbGxlZ2FsLiAqLworICAgIGlmICgobGVuID4gMSB8fCAqcCA8IDB4ODApCisJICAgICYmIGxlbiA8IG1heGxlbgorCSAgICAmJiBwW2xlbl0gPj0gMHg4MAorCSAgICAmJiBVVEZfQ09NUE9TSU5HTElLRShwLCBwICsgbGVuKSkKKyAgICB7CisJKnAxID0gdXRmX3B0cjJjaGFyKHAgKyBsZW4pOworCWxlbiArPSB1dGZfcHRyMmxlbl9jaGVja19sZW4ocCArIGxlbiwgbWF4bGVuIC0gbGVuKTsKKwlpZiAobGVuIDwgbWF4bGVuCisJCSYmIHBbbGVuXSA+PSAweDgwCisJCSYmIHV0Zl9pc2NvbXBvc2luZyhjYyA9IHV0Zl9wdHIyY2hhcihwICsgbGVuKSkpCisJICAgICpwMiA9IGNjOworCWVsc2UKKwkgICAgKnAyID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkqcDEgPSAwOworCSpwMiA9IDA7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorICogQ29udmVydCB0aGUgY2hhcmFjdGVyIGF0IHNjcmVlbiBwb3NpdGlvbiAib2ZmIiB0byBhIHNlcXVlbmNlIG9mIGJ5dGVzLgorICogSW5jbHVkZXMgdGhlIGNvbXBvc2luZyBjaGFyYWN0ZXJzLgorICogImJ1ZiIgbXVzdCBhdCBsZWFzdCBoYXZlIHRoZSBsZW5ndGggTUJfTUFYQllURVMuCisgKiBSZXR1cm5zIHRoZSBwcm9kdWNlZCBudW1iZXIgb2YgYnl0ZXMuCisgKi8KKyAgICBpbnQKK3V0ZmNfY2hhcjJieXRlcyhvZmYsIGJ1ZikKKyAgICBpbnQJCW9mZjsKKyAgICBjaGFyX3UJKmJ1ZjsKK3sKKyAgICBpbnQJCWxlbjsKKworICAgIGxlbiA9IHV0Zl9jaGFyMmJ5dGVzKFNjcmVlbkxpbmVzVUNbb2ZmXSwgYnVmKTsKKyAgICBpZiAoU2NyZWVuTGluZXNDMVtvZmZdICE9IDApCisgICAgeworCWxlbiArPSB1dGZfY2hhcjJieXRlcyhTY3JlZW5MaW5lc0MxW29mZl0sIGJ1ZiArIGxlbik7CisJaWYgKFNjcmVlbkxpbmVzQzJbb2ZmXSAhPSAwKQorCSAgICBsZW4gKz0gdXRmX2NoYXIyYnl0ZXMoU2NyZWVuTGluZXNDMltvZmZdLCBidWYgKyBsZW4pOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCisvKgorICogR2V0IHRoZSBsZW5ndGggb2YgYSBVVEYtOCBieXRlIHNlcXVlbmNlLCBub3QgaW5jbHVkaW5nIGFueSBmb2xsb3dpbmcKKyAqIGNvbXBvc2luZyBjaGFyYWN0ZXJzLgorICogUmV0dXJucyAwIGZvciAiIi4KKyAqIFJldHVybnMgMSBmb3IgYW4gaWxsZWdhbCBieXRlIHNlcXVlbmNlLgorICovCisgICAgaW50Cit1dGZfcHRyMmxlbl9jaGVjayhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoKnAgPT0gTlVMKQorCXJldHVybiAwOworICAgIGxlbiA9IHV0ZjhsZW5fdGFiWypwXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyArK2kpCisJaWYgKChwW2ldICYgMHhjMCkgIT0gMHg4MCkKKwkgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFJldHVybiBsZW5ndGggb2YgVVRGLTggY2hhcmFjdGVyLCBvYnRhaW5lZCBmcm9tIHRoZSBmaXJzdCBieXRlLgorICogImIiIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUhCisgKi8KKyAgICBpbnQKK3V0Zl9ieXRlMmxlbihiKQorICAgIGludAkJYjsKK3sKKyAgICByZXR1cm4gdXRmOGxlbl90YWJbYl07Cit9CisKKy8qCisgKiBHZXQgdGhlIGxlbmd0aCBvZiBVVEYtOCBieXRlIHNlcXVlbmNlICJwW3NpemVdIi4gIERvZXMgbm90IGluY2x1ZGUgYW55CisgKiBmb2xsb3dpbmcgY29tcG9zaW5nIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIDEgZm9yICIiLgorICogUmV0dXJucyAxIGZvciBhbiBpbGxlZ2FsIGJ5dGUgc2VxdWVuY2UuCisgKiBSZXR1cm5zIG51bWJlciA+ICJzaXplIiBmb3IgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlLgorICovCisgICAgaW50Cit1dGZfcHRyMmxlbl9jaGVja19sZW4ocCwgc2l6ZSkKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlzaXplOworeworICAgIGludAkJbGVuOworICAgIGludAkJaTsKKworICAgIGlmICgqcCA9PSBOVUwpCisJcmV0dXJuIDE7CisgICAgbGVuID0gdXRmOGxlbl90YWJbKnBdOworICAgIGlmIChsZW4gPiBzaXplKQorCXJldHVybiBsZW47CS8qIGluY29tcGxldGUgYnl0ZSBzZXF1ZW5jZS4gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyArK2kpCisJaWYgKChwW2ldICYgMHhjMCkgIT0gMHg4MCkKKwkgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgY2hhcmFjdGVyIGF0ICJwIiB0YWtlcy4KKyAqIFRoaXMgaW5jbHVkZXMgZm9sbG93aW5nIGNvbXBvc2luZyBjaGFyYWN0ZXJzLgorICovCisgICAgaW50Cit1dGZjX3B0cjJsZW5fY2hlY2socCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaW50CQlsZW47CisjaWZkZWYgRkVBVF9BUkFCSUMKKyAgICBpbnQJCXByZXZsZW47CisjZW5kaWYKKworICAgIGlmICgqcCA9PSBOVUwpCisJcmV0dXJuIDA7CisgICAgaWYgKHBbMF0gPCAweDgwICYmIHBbMV0gPCAweDgwKQkvKiBiZSBxdWljayBmb3IgQVNDSUkgKi8KKwlyZXR1cm4gMTsKKworICAgIC8qIFNraXAgb3ZlciBmaXJzdCBVVEYtOCBjaGFyLCBzdG9wcGluZyBhdCBhIE5VTCBieXRlLiAqLworICAgIGxlbiA9IHV0Zl9wdHIybGVuX2NoZWNrKHApOworCisgICAgLyogQ2hlY2sgZm9yIGlsbGVnYWwgYnl0ZS4gKi8KKyAgICBpZiAobGVuID09IDEgJiYgcFswXSA+PSAweDgwKQorCXJldHVybiAxOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgY29tcG9zaW5nIGNoYXJhY3RlcnMuICBXZSBjYW4gaGFuZGxlIG9ubHkgdGhlIGZpcnN0IHR3bywgYnV0CisgICAgICogc2tpcCBhbGwgb2YgdGhlbSAob3RoZXJ3aXNlIHRoZSBjdXJzb3Igd291bGQgZ2V0IHN0dWNrKS4KKyAgICAgKi8KKyNpZmRlZiBGRUFUX0FSQUJJQworICAgIHByZXZsZW4gPSAwOworI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKHBbbGVuXSA8IDB4ODAgfHwgIVVURl9DT01QT1NJTkdMSUtFKHAgKyBwcmV2bGVuLCBwICsgbGVuKSkKKwkgICAgcmV0dXJuIGxlbjsKKworCS8qIFNraXAgb3ZlciBjb21wb3NpbmcgY2hhciAqLworI2lmZGVmIEZFQVRfQVJBQklDCisJcHJldmxlbiA9IGxlbjsKKyNlbmRpZgorCWxlbiArPSB1dGZfcHRyMmxlbl9jaGVjayhwICsgbGVuKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIGNoYXJhY3RlciBhdCAicFtzaXplXSIKKyAqIHRha2VzLiAgVGhpcyBpbmNsdWRlcyBmb2xsb3dpbmcgY29tcG9zaW5nIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIDEgZm9yIGFuIGlsbGVnYWwgY2hhciBvciBhbiBpbmNvbXBsZXRlIGJ5dGUgc2VxdWVuY2UuCisgKi8KKyAgICBpbnQKK3V0ZmNfcHRyMmxlbl9jaGVja19sZW4ocCwgc2l6ZSkKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlzaXplOworeworICAgIGludAkJbGVuOworI2lmZGVmIEZFQVRfQVJBQklDCisgICAgaW50CQlwcmV2bGVuOworI2VuZGlmCisKKyAgICBpZiAoKnAgPT0gTlVMKQorCXJldHVybiAwOworICAgIGlmIChwWzBdIDwgMHg4MCAmJiAoc2l6ZSA9PSAxIHx8IHBbMV0gPCAweDgwKSkgLyogYmUgcXVpY2sgZm9yIEFTQ0lJICovCisJcmV0dXJuIDE7CisKKyAgICAvKiBTa2lwIG92ZXIgZmlyc3QgVVRGLTggY2hhciwgc3RvcHBpbmcgYXQgYSBOVUwgYnl0ZS4gKi8KKyAgICBsZW4gPSB1dGZfcHRyMmxlbl9jaGVja19sZW4ocCwgc2l6ZSk7CisKKyAgICAvKiBDaGVjayBmb3IgaWxsZWdhbCBieXRlIGFuZCBpbmNvbXBsZXRlIGJ5dGUgc2VxdWVuY2UuICovCisgICAgaWYgKChsZW4gPT0gMSAmJiBwWzBdID49IDB4ODApIHx8IGxlbiA+IHNpemUpCisJcmV0dXJuIDE7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBjb21wb3NpbmcgY2hhcmFjdGVycy4gIFdlIGNhbiBoYW5kbGUgb25seSB0aGUgZmlyc3QgdHdvLCBidXQKKyAgICAgKiBza2lwIGFsbCBvZiB0aGVtIChvdGhlcndpc2UgdGhlIGN1cnNvciB3b3VsZCBnZXQgc3R1Y2spLgorICAgICAqLworI2lmZGVmIEZFQVRfQVJBQklDCisgICAgcHJldmxlbiA9IDA7CisjZW5kaWYKKyAgICB3aGlsZSAobGVuIDwgc2l6ZSkKKyAgICB7CisJaWYgKHBbbGVuXSA8IDB4ODAgfHwgIVVURl9DT01QT1NJTkdMSUtFKHAgKyBwcmV2bGVuLCBwICsgbGVuKSkKKwkgICAgYnJlYWs7CisKKwkvKiBTa2lwIG92ZXIgY29tcG9zaW5nIGNoYXIgKi8KKyNpZmRlZiBGRUFUX0FSQUJJQworCXByZXZsZW4gPSBsZW47CisjZW5kaWYKKwlsZW4gKz0gdXRmX3B0cjJsZW5fY2hlY2tfbGVuKHAgKyBsZW4sIHNpemUgLSBsZW4pOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIFVURi04IGVuY29kaW5nIG9mIGNoYXJhY3RlciAiYyIgdGFrZXMuCisgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgY29tcG9zaW5nIGNoYXJhY3RlcnMuCisgKi8KKyAgICBpbnQKK3V0Zl9jaGFyMmxlbihjKQorICAgIGludAkJYzsKK3sKKyAgICBpZiAoYyA8IDB4ODApCisJcmV0dXJuIDE7CisgICAgaWYgKGMgPCAweDgwMCkKKwlyZXR1cm4gMjsKKyAgICBpZiAoYyA8IDB4MTAwMDApCisJcmV0dXJuIDM7CisgICAgaWYgKGMgPCAweDIwMDAwMCkKKwlyZXR1cm4gNDsKKyAgICBpZiAoYyA8IDB4NDAwMDAwMCkKKwlyZXR1cm4gNTsKKyAgICByZXR1cm4gNjsKK30KKworLyoKKyAqIENvbnZlcnQgVW5pY29kZSBjaGFyYWN0ZXIgImMiIHRvIFVURi04IHN0cmluZyBpbiAiYnVmW10iLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGNvbXBvc2luZyBjaGFyYWN0ZXJzLgorICovCisgICAgaW50Cit1dGZfY2hhcjJieXRlcyhjLCBidWYpCisgICAgaW50CQljOworICAgIGNoYXJfdQkqYnVmOworeworICAgIGlmIChjIDwgMHg4MCkJCS8qIDcgYml0cyAqLworICAgIHsKKwlidWZbMF0gPSBjOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoYyA8IDB4ODAwKQkJLyogMTEgYml0cyAqLworICAgIHsKKwlidWZbMF0gPSAweGMwICsgKCh1bnNpZ25lZCljID4+IDYpOworCWJ1ZlsxXSA9IDB4ODAgKyAoYyAmIDB4M2YpOworCXJldHVybiAyOworICAgIH0KKyAgICBpZiAoYyA8IDB4MTAwMDApCQkvKiAxNiBiaXRzICovCisgICAgeworCWJ1ZlswXSA9IDB4ZTAgKyAoKHVuc2lnbmVkKWMgPj4gMTIpOworCWJ1ZlsxXSA9IDB4ODAgKyAoKCh1bnNpZ25lZCljID4+IDYpICYgMHgzZik7CisJYnVmWzJdID0gMHg4MCArIChjICYgMHgzZik7CisJcmV0dXJuIDM7CisgICAgfQorICAgIGlmIChjIDwgMHgyMDAwMDApCQkvKiAyMSBiaXRzICovCisgICAgeworCWJ1ZlswXSA9IDB4ZjAgKyAoKHVuc2lnbmVkKWMgPj4gMTgpOworCWJ1ZlsxXSA9IDB4ODAgKyAoKCh1bnNpZ25lZCljID4+IDEyKSAmIDB4M2YpOworCWJ1ZlsyXSA9IDB4ODAgKyAoKCh1bnNpZ25lZCljID4+IDYpICYgMHgzZik7CisJYnVmWzNdID0gMHg4MCArIChjICYgMHgzZik7CisJcmV0dXJuIDQ7CisgICAgfQorICAgIGlmIChjIDwgMHg0MDAwMDAwKQkJLyogMjYgYml0cyAqLworICAgIHsKKwlidWZbMF0gPSAweGY4ICsgKCh1bnNpZ25lZCljID4+IDI0KTsKKwlidWZbMV0gPSAweDgwICsgKCgodW5zaWduZWQpYyA+PiAxOCkgJiAweDNmKTsKKwlidWZbMl0gPSAweDgwICsgKCgodW5zaWduZWQpYyA+PiAxMikgJiAweDNmKTsKKwlidWZbM10gPSAweDgwICsgKCgodW5zaWduZWQpYyA+PiA2KSAmIDB4M2YpOworCWJ1Zls0XSA9IDB4ODAgKyAoYyAmIDB4M2YpOworCXJldHVybiA1OworICAgIH0KKwkJCQkvKiAzMSBiaXRzICovCisgICAgYnVmWzBdID0gMHhmYyArICgodW5zaWduZWQpYyA+PiAzMCk7CisgICAgYnVmWzFdID0gMHg4MCArICgoKHVuc2lnbmVkKWMgPj4gMjQpICYgMHgzZik7CisgICAgYnVmWzJdID0gMHg4MCArICgoKHVuc2lnbmVkKWMgPj4gMTgpICYgMHgzZik7CisgICAgYnVmWzNdID0gMHg4MCArICgoKHVuc2lnbmVkKWMgPj4gMTIpICYgMHgzZik7CisgICAgYnVmWzRdID0gMHg4MCArICgoKHVuc2lnbmVkKWMgPj4gNikgJiAweDNmKTsKKyAgICBidWZbNV0gPSAweDgwICsgKGMgJiAweDNmKTsKKyAgICByZXR1cm4gNjsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJjIiBpcyBhIGNvbXBvc2luZyBVVEYtOCBjaGFyYWN0ZXIuICBUaGlzIG1lYW5zIGl0IHdpbGwgYmUKKyAqIGRyYXduIG9uIHRvcCBvZiB0aGUgcHJlY2VkaW5nIGNoYXJhY3Rlci4KKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNYXJrdXMgS3Vobi4KKyAqLworICAgIGludAordXRmX2lzY29tcG9zaW5nKGMpCisgICAgaW50CQljOworeworICAgIC8qIHNvcnRlZCBsaXN0IG9mIG5vbi1vdmVybGFwcGluZyBpbnRlcnZhbHMgKi8KKyAgICBzdGF0aWMgc3RydWN0IGludGVydmFsIGNvbWJpbmluZ1tdID0KKyAgICB7CisJezB4MDMwMCwgMHgwMzRmfSwgezB4MDM2MCwgMHgwMzZmfSwgezB4MDQ4MywgMHgwNDg2fSwgezB4MDQ4OCwgMHgwNDg5fSwKKwl7MHgwNTkxLCAweDA1YTF9LCB7MHgwNWEzLCAweDA1Yjl9LCB7MHgwNWJiLCAweDA1YmR9LCB7MHgwNWJmLCAweDA1YmZ9LAorCXsweDA1YzEsIDB4MDVjMn0sIHsweDA1YzQsIDB4MDVjNH0sIHsweDA2MTAsIDB4MDYxNX0sIHsweDA2NGIsIDB4MDY1OH0sCisJezB4MDY3MCwgMHgwNjcwfSwgezB4MDZkNiwgMHgwNmRjfSwgezB4MDZkZSwgMHgwNmU0fSwgezB4MDZlNywgMHgwNmU4fSwKKwl7MHgwNmVhLCAweDA2ZWR9LCB7MHgwNzExLCAweDA3MTF9LCB7MHgwNzMwLCAweDA3NGF9LCB7MHgwN2E2LCAweDA3YjB9LAorCXsweDA5MDEsIDB4MDkwM30sIHsweDA5M2MsIDB4MDkzY30sIHsweDA5M2UsIDB4MDk0ZH0sIHsweDA5NTEsIDB4MDk1NH0sCisJezB4MDk2MiwgMHgwOTYzfSwgezB4MDk4MSwgMHgwOTgzfSwgezB4MDliYywgMHgwOWJjfSwgezB4MDliZSwgMHgwOWM0fSwKKwl7MHgwOWM3LCAweDA5Yzh9LCB7MHgwOWNiLCAweDA5Y2R9LCB7MHgwOWQ3LCAweDA5ZDd9LCB7MHgwOWUyLCAweDA5ZTN9LAorCXsweDBhMDEsIDB4MGEwM30sIHsweDBhM2MsIDB4MGEzY30sIHsweDBhM2UsIDB4MGE0Mn0sIHsweDBhNDcsIDB4MGE0OH0sCisJezB4MGE0YiwgMHgwYTRkfSwgezB4MGE3MCwgMHgwYTcxfSwgezB4MGE4MSwgMHgwYTgzfSwgezB4MGFiYywgMHgwYWJjfSwKKwl7MHgwYWJlLCAweDBhYzV9LCB7MHgwYWM3LCAweDBhYzl9LCB7MHgwYWNiLCAweDBhY2R9LCB7MHgwYWUyLCAweDBhZTN9LAorCXsweDBiMDEsIDB4MGIwM30sIHsweDBiM2MsIDB4MGIzY30sIHsweDBiM2UsIDB4MGI0M30sIHsweDBiNDcsIDB4MGI0OH0sCisJezB4MGI0YiwgMHgwYjRkfSwgezB4MGI1NiwgMHgwYjU3fSwgezB4MGI4MiwgMHgwYjgyfSwgezB4MGJiZSwgMHgwYmMyfSwKKwl7MHgwYmM2LCAweDBiYzh9LCB7MHgwYmNhLCAweDBiY2R9LCB7MHgwYmQ3LCAweDBiZDd9LCB7MHgwYzAxLCAweDBjMDN9LAorCXsweDBjM2UsIDB4MGM0NH0sIHsweDBjNDYsIDB4MGM0OH0sIHsweDBjNGEsIDB4MGM0ZH0sIHsweDBjNTUsIDB4MGM1Nn0sCisJezB4MGM4MiwgMHgwYzgzfSwgezB4MGNiYywgMHgwY2JjfSwgezB4MGNiZSwgMHgwY2M0fSwgezB4MGNjNiwgMHgwY2M4fSwKKwl7MHgwY2NhLCAweDBjY2R9LCB7MHgwY2Q1LCAweDBjZDZ9LCB7MHgwZDAyLCAweDBkMDN9LCB7MHgwZDNlLCAweDBkNDN9LAorCXsweDBkNDYsIDB4MGQ0OH0sIHsweDBkNGEsIDB4MGQ0ZH0sIHsweDBkNTcsIDB4MGQ1N30sIHsweDBkODIsIDB4MGQ4M30sCisJezB4MGRjYSwgMHgwZGNhfSwgezB4MGRjZiwgMHgwZGQ0fSwgezB4MGRkNiwgMHgwZGQ2fSwgezB4MGRkOCwgMHgwZGRmfSwKKwl7MHgwZGYyLCAweDBkZjN9LCB7MHgwZTMxLCAweDBlMzF9LCB7MHgwZTM0LCAweDBlM2F9LCB7MHgwZTQ3LCAweDBlNGV9LAorCXsweDBlYjEsIDB4MGViMX0sIHsweDBlYjQsIDB4MGViOX0sIHsweDBlYmIsIDB4MGViY30sIHsweDBlYzgsIDB4MGVjZH0sCisJezB4MGYxOCwgMHgwZjE5fSwgezB4MGYzNSwgMHgwZjM1fSwgezB4MGYzNywgMHgwZjM3fSwgezB4MGYzOSwgMHgwZjM5fSwKKwl7MHgwZjNlLCAweDBmM2Z9LCB7MHgwZjcxLCAweDBmODR9LCB7MHgwZjg2LCAweDBmODd9LCB7MHgwZjkwLCAweDBmOTd9LAorCXsweDBmOTksIDB4MGZiY30sIHsweDBmYzYsIDB4MGZjNn0sIHsweDEwMmMsIDB4MTAzMn0sIHsweDEwMzYsIDB4MTAzOX0sCisJezB4MTA1NiwgMHgxMDU5fSwgezB4MTcxMiwgMHgxNzE0fSwgezB4MTczMiwgMHgxNzM0fSwgezB4MTc1MiwgMHgxNzUzfSwKKwl7MHgxNzcyLCAweDE3NzN9LCB7MHgxN2I2LCAweDE3ZDN9LCB7MHgxN2RkLCAweDE3ZGR9LCB7MHgxODBiLCAweDE4MGR9LAorCXsweDE4YTksIDB4MThhOX0sIHsweDE5MjAsIDB4MTkyYn0sIHsweDE5MzAsIDB4MTkzYn0sIHsweDIwZDAsIDB4MjBlYX0sCisJezB4MzAyYSwgMHgzMDJmfSwgezB4MzA5OSwgMHgzMDlhfSwgezB4ZmIxZSwgMHhmYjFlfSwgezB4ZmUwMCwgMHhmZTBmfSwKKwl7MHhmZTIwLCAweGZlMjN9LAorICAgIH07CisKKyAgICByZXR1cm4gaW50YWJsZShjb21iaW5pbmcsIHNpemVvZihjb21iaW5pbmcpLCBjKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGZvciBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbiBhIG5vcm1hbCB3YXkuCisgKiBPbmx5IGZvciBjaGFyYWN0ZXJzIG9mIDB4MTAwIGFuZCBhYm92ZSEKKyAqLworICAgIGludAordXRmX3ByaW50YWJsZShjKQorICAgIGludAkJYzsKK3sKKyNpZmRlZiBVU0VfV0NIQVJfRlVOQ1RJT05TCisgICAgLyoKKyAgICAgKiBBc3N1bWUgdGhlIGlzd3ByaW50KCkgbGlicmFyeSBmdW5jdGlvbiB3b3JrcyBiZXR0ZXIgdGhhbiBvdXIgb3duIHN0dWZmLgorICAgICAqLworICAgIHJldHVybiBpc3dwcmludChjKTsKKyNlbHNlCisgICAgLyogU29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscy4KKyAgICAgKiAweGQ4MDAtMHhkZmZmIGlzIHJlc2VydmVkIGZvciBVVEYtMTYsIGFjdHVhbGx5IGlsbGVnYWwuICovCisgICAgc3RhdGljIHN0cnVjdCBpbnRlcnZhbCBub25wcmludFtdID0KKyAgICB7CisJezB4MDcwZiwgMHgwNzBmfSwgezB4MTgwYiwgMHgxODBlfSwgezB4MjAwYiwgMHgyMDBmfSwgezB4MjAyYSwgMHgyMDJlfSwKKwl7MHgyMDZhLCAweDIwNmZ9LCB7MHhkODAwLCAweGRmZmZ9LCB7MHhmZWZmLCAweGZlZmZ9LCB7MHhmZmY5LCAweGZmZmJ9LAorCXsweGZmZmUsIDB4ZmZmZn0KKyAgICB9OworCisgICAgcmV0dXJuICFpbnRhYmxlKG5vbnByaW50LCBzaXplb2Yobm9ucHJpbnQpLCBjKTsKKyNlbmRpZgorfQorCisvKgorICogR2V0IGNsYXNzIG9mIGEgVW5pY29kZSBjaGFyYWN0ZXIuCisgKiAwOiB3aGl0ZSBzcGFjZQorICogMTogcHVuY3R1YXRpb24KKyAqIDIgb3IgYmlnZ2VyOiBzb21lIGNsYXNzIG9mIHdvcmQgY2hhcmFjdGVyLgorICovCisgICAgaW50Cit1dGZfY2xhc3MoYykKKyAgICBpbnQJCWM7Cit7CisgICAgLyogc29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyAqLworICAgIHN0YXRpYyBzdHJ1Y3QgY2xpbnRlcnZhbAorICAgIHsKKwl1bnNpZ25lZCBzaG9ydCBmaXJzdDsKKwl1bnNpZ25lZCBzaG9ydCBsYXN0OworCXVuc2lnbmVkIHNob3J0IGNsYXNzOworICAgIH0gY2xhc3Nlc1tdID0KKyAgICB7CisJezB4MDM3ZSwgMHgwMzdlLCAxfSwJCS8qIEdyZWVrIHF1ZXN0aW9uIG1hcmsgKi8KKwl7MHgwMzg3LCAweDAzODcsIDF9LAkJLyogR3JlZWsgYW5vIHRlbGVpYSAqLworCXsweDA1NWEsIDB4MDU1ZiwgMX0sCQkvKiBBcm1lbmlhbiBwdW5jdHVhdGlvbiAqLworCXsweDA1ODksIDB4MDU4OSwgMX0sCQkvKiBBcm1lbmlhbiBmdWxsIHN0b3AgKi8KKwl7MHgwNWJlLCAweDA1YmUsIDF9LAorCXsweDA1YzAsIDB4MDVjMCwgMX0sCisJezB4MDVjMywgMHgwNWMzLCAxfSwKKwl7MHgwNWYzLCAweDA1ZjQsIDF9LAorCXsweDA2MGMsIDB4MDYwYywgMX0sCisJezB4MDYxYiwgMHgwNjFiLCAxfSwKKwl7MHgwNjFmLCAweDA2MWYsIDF9LAorCXsweDA2NmEsIDB4MDY2ZCwgMX0sCisJezB4MDZkNCwgMHgwNmQ0LCAxfSwKKwl7MHgwNzAwLCAweDA3MGQsIDF9LAkJLyogU3lyaWFjIHB1bmN0dWF0aW9uICovCisJezB4MDk2NCwgMHgwOTY1LCAxfSwKKwl7MHgwOTcwLCAweDA5NzAsIDF9LAorCXsweDBkZjQsIDB4MGRmNCwgMX0sCisJezB4MGU0ZiwgMHgwZTRmLCAxfSwKKwl7MHgwZTVhLCAweDBlNWIsIDF9LAorCXsweDBmMDQsIDB4MGYxMiwgMX0sCisJezB4MGYzYSwgMHgwZjNkLCAxfSwKKwl7MHgwZjg1LCAweDBmODUsIDF9LAorCXsweDEwNGEsIDB4MTA0ZiwgMX0sCQkvKiBNeWFubWFyIHB1bmN0dWF0aW9uICovCisJezB4MTBmYiwgMHgxMGZiLCAxfSwJCS8qIEdlb3JnaWFuIHB1bmN0dWF0aW9uICovCisJezB4MTM2MSwgMHgxMzY4LCAxfSwJCS8qIEV0aGlvcGljIHB1bmN0dWF0aW9uICovCisJezB4MTY2ZCwgMHgxNjZlLCAxfSwJCS8qIENhbmFkaWFuIFN5bC4gcHVuY3R1YXRpb24gKi8KKwl7MHgxNjgwLCAweDE2ODAsIDB9LAorCXsweDE2OWIsIDB4MTY5YywgMX0sCisJezB4MTZlYiwgMHgxNmVkLCAxfSwKKwl7MHgxNzM1LCAweDE3MzYsIDF9LAorCXsweDE3ZDQsIDB4MTdkYywgMX0sCQkvKiBLaG1lciBwdW5jdHVhdGlvbiAqLworCXsweDE4MDAsIDB4MTgwYSwgMX0sCQkvKiBNb25nb2xpYW4gcHVuY3R1YXRpb24gKi8KKwl7MHgyMDAwLCAweDIwMGIsIDB9LAkJLyogc3BhY2VzICovCisJezB4MjAwYywgMHgyMDI3LCAxfSwJCS8qIHB1bmN0dWF0aW9uIGFuZCBzeW1ib2xzICovCisJezB4MjAyOCwgMHgyMDI5LCAwfSwKKwl7MHgyMDJhLCAweDIwMmUsIDF9LAkJLyogcHVuY3R1YXRpb24gYW5kIHN5bWJvbHMgKi8KKwl7MHgyMDJmLCAweDIwMmYsIDB9LAorCXsweDIwMzAsIDB4MjA1ZSwgMX0sCQkvKiBwdW5jdHVhdGlvbiBhbmQgc3ltYm9scyAqLworCXsweDIwNWYsIDB4MjA1ZiwgMH0sCisJezB4MjA2MCwgMHgyN2ZmLCAxfSwJCS8qIHB1bmN0dWF0aW9uIGFuZCBzeW1ib2xzICovCisJezB4MjA3MCwgMHgyMDdmLCAweDIwNzB9LAkvKiBzdXBlcnNjcmlwdCAqLworCXsweDIwODAsIDB4MjA4ZiwgMHgyMDgwfSwJLyogc3Vic2NyaXB0ICovCisJezB4Mjk4MywgMHgyOTk4LCAxfSwKKwl7MHgyOWQ4LCAweDI5ZGIsIDF9LAorCXsweDI5ZmMsIDB4MjlmZCwgMX0sCisJezB4MzAwMCwgMHgzMDAwLCAwfSwJCS8qIGlkZW9ncmFwaGljIHNwYWNlICovCisJezB4MzAwMSwgMHgzMDIwLCAxfSwJCS8qIGlkZW9ncmFwaGljIHB1bmN0dWF0aW9uICovCisJezB4MzAzMCwgMHgzMDMwLCAxfSwKKwl7MHgzMDNkLCAweDMwM2QsIDF9LAorCXsweDMwNDAsIDB4MzA5ZiwgMHgzMDQwfSwJLyogSGlyYWdhbmEgKi8KKwl7MHgzMGEwLCAweDMwZmYsIDB4MzBhMH0sCS8qIEthdGFrYW5hICovCisJezB4MzMwMCwgMHg5ZmZmLCAweDRlMDB9LAkvKiBDSksgSWRlb2dyYXBocyAqLworCXsweGFjMDAsIDB4ZDdhMywgMHhhYzAwfSwJLyogSGFuZ3VsIFN5bGxhYmxlcyAqLworCXsweGY5MDAsIDB4ZmFmZiwgMHg0ZTAwfSwJLyogQ0pLIElkZW9ncmFwaHMgKi8KKwl7MHhmZDNlLCAweGZkM2YsIDF9LAorCXsweGZlMzAsIDB4ZmU2YiwgMX0sCQkvKiBwdW5jdHVhdGlvbiBmb3JtcyAqLworCXsweGZmMDAsIDB4ZmYwZiwgMX0sCQkvKiBoYWxmL2Z1bGx3aWR0aCBBU0NJSSAqLworCXsweGZmMWEsIDB4ZmYyMCwgMX0sCQkvKiBoYWxmL2Z1bGx3aWR0aCBBU0NJSSAqLworCXsweGZmM2IsIDB4ZmY0MCwgMX0sCQkvKiBoYWxmL2Z1bGx3aWR0aCBBU0NJSSAqLworCXsweGZmNWIsIDB4ZmY2NSwgMX0sCQkvKiBoYWxmL2Z1bGx3aWR0aCBBU0NJSSAqLworICAgIH07CisgICAgaW50IGJvdCA9IDA7CisgICAgaW50IHRvcCA9IHNpemVvZihjbGFzc2VzKSAvIHNpemVvZihzdHJ1Y3QgY2xpbnRlcnZhbCkgLSAxOworICAgIGludCBtaWQ7CisKKyAgICAvKiBGaXJzdCBxdWljayBjaGVjayBmb3IgTGF0aW4xIGNoYXJhY3RlcnMsIHVzZSAnaXNrZXl3b3JkJy4gKi8KKyAgICBpZiAoYyA8IDB4MTAwKQorICAgIHsKKwlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gTlVMKQorCSAgICByZXR1cm4gMDsJICAgIC8qIGJsYW5rICovCisJaWYgKHZpbV9pc3dvcmRjKGMpKQorCSAgICByZXR1cm4gMjsJICAgIC8qIHdvcmQgY2hhcmFjdGVyICovCisJcmV0dXJuIDE7CSAgICAvKiBwdW5jdHVhdGlvbiAqLworICAgIH0KKworICAgIC8qIGJpbmFyeSBzZWFyY2ggaW4gdGFibGUgKi8KKyAgICB3aGlsZSAodG9wID49IGJvdCkKKyAgICB7CisJbWlkID0gKGJvdCArIHRvcCkgLyAyOworCWlmIChjbGFzc2VzW21pZF0ubGFzdCA8IGMpCisJICAgIGJvdCA9IG1pZCArIDE7CisJZWxzZSBpZiAoY2xhc3Nlc1ttaWRdLmZpcnN0ID4gYykKKwkgICAgdG9wID0gbWlkIC0gMTsKKwllbHNlCisJICAgIHJldHVybiAoaW50KWNsYXNzZXNbbWlkXS5jbGFzczsKKyAgICB9CisKKyAgICAvKiBtb3N0IG90aGVyIGNoYXJhY3RlcnMgYXJlICJ3b3JkIiBjaGFyYWN0ZXJzICovCisgICAgcmV0dXJuIDI7Cit9CisKKy8qCisgKiBDb2RlIGZvciBVbmljb2RlIGNhc2UtZGVwZW5kZW50IG9wZXJhdGlvbnMuICBCYXNlZCBvbiBub3RlcyBpbgorICogaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvVU5JREFUQS9DYXNlRm9sZGluZy50eHQKKyAqIFRoaXMgY29kZSB1c2VzIHNpbXBsZSBjYXNlIGZvbGRpbmcsIG5vdCBmdWxsIGNhc2UgZm9sZGluZy4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBidWlsdCBieSBmb2xkRXh0cmFjdC5wbCA8IENhc2VGb2xkaW5nLnR4dCAuCisgKiBJdCBtdXN0IGJlIGluIG51bWVyaWMgb3JkZXIsIGJlY2F1c2Ugd2UgdXNlIGJpbmFyeSBzZWFyY2ggb24gaXQuCisgKiBBbiBlbnRyeSBzdWNoIGFzIHsweDQxLDB4NWEsMSwzMn0gbWVhbnMgdGhhdCBVQ1MtNCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZQorICogZnJvbSAweDQxIHRvIDB4NWEgaW5jbHVzaXZlLCBzdGVwcGluZyBieSAxLCBhcmUgZm9sZGVkIGJ5IGFkZGluZyAzMi4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCByYW5nZVN0YXJ0OworICAgIGludCByYW5nZUVuZDsKKyAgICBpbnQgc3RlcDsKKyAgICBpbnQgb2Zmc2V0OworfSBjb252ZXJ0U3RydWN0OworCitjb252ZXJ0U3RydWN0IGZvbGRDYXNlW10gPQoreworCXsweDQxLDB4NWEsMSwzMn0sIHsweGMwLDB4ZDYsMSwzMn0sIHsweGQ4LDB4ZGUsMSwzMn0sCisJezB4MTAwLDB4MTJlLDIsMX0sIHsweDEzMCwweDEzMCwtMSwtMTk5fSwgezB4MTMyLDB4MTM2LDIsMX0sCisJezB4MTM5LDB4MTQ3LDIsMX0sIHsweDE0YSwweDE3NiwyLDF9LCB7MHgxNzgsMHgxNzgsLTEsLTEyMX0sCisJezB4MTc5LDB4MTdkLDIsMX0sIHsweDE4MSwweDE4MSwtMSwyMTB9LCB7MHgxODIsMHgxODQsMiwxfSwKKwl7MHgxODYsMHgxODYsLTEsMjA2fSwgezB4MTg3LDB4MTg3LC0xLDF9LCB7MHgxODksMHgxOGEsMSwyMDV9LAorCXsweDE4YiwweDE4YiwtMSwxfSwgezB4MThlLDB4MThlLC0xLDc5fSwgezB4MThmLDB4MThmLC0xLDIwMn0sCisJezB4MTkwLDB4MTkwLC0xLDIwM30sIHsweDE5MSwweDE5MSwtMSwxfSwgezB4MTkzLDB4MTkzLC0xLDIwNX0sCisJezB4MTk0LDB4MTk0LC0xLDIwN30sIHsweDE5NiwweDE5NiwtMSwyMTF9LCB7MHgxOTcsMHgxOTcsLTEsMjA5fSwKKwl7MHgxOTgsMHgxOTgsLTEsMX0sIHsweDE5YywweDE5YywtMSwyMTF9LCB7MHgxOWQsMHgxOWQsLTEsMjEzfSwKKwl7MHgxOWYsMHgxOWYsLTEsMjE0fSwgezB4MWEwLDB4MWE0LDIsMX0sIHsweDFhNiwweDFhNiwtMSwyMTh9LAorCXsweDFhNywweDFhNywtMSwxfSwgezB4MWE5LDB4MWE5LC0xLDIxOH0sIHsweDFhYywweDFhYywtMSwxfSwKKwl7MHgxYWUsMHgxYWUsLTEsMjE4fSwgezB4MWFmLDB4MWFmLC0xLDF9LCB7MHgxYjEsMHgxYjIsMSwyMTd9LAorCXsweDFiMywweDFiNSwyLDF9LCB7MHgxYjcsMHgxYjcsLTEsMjE5fSwgezB4MWI4LDB4MWJjLDQsMX0sCisJezB4MWM0LDB4MWM0LC0xLDJ9LCB7MHgxYzUsMHgxYzUsLTEsMX0sIHsweDFjNywweDFjNywtMSwyfSwKKwl7MHgxYzgsMHgxYzgsLTEsMX0sIHsweDFjYSwweDFjYSwtMSwyfSwgezB4MWNiLDB4MWRiLDIsMX0sCisJezB4MWRlLDB4MWVlLDIsMX0sIHsweDFmMSwweDFmMSwtMSwyfSwgezB4MWYyLDB4MWY0LDIsMX0sCisJezB4MWY2LDB4MWY2LC0xLC05N30sIHsweDFmNywweDFmNywtMSwtNTZ9LCB7MHgxZjgsMHgyMWUsMiwxfSwKKwl7MHgyMjAsMHgyMjAsLTEsLTEzMH0sIHsweDIyMiwweDIzMiwyLDF9LCB7MHgzODYsMHgzODYsLTEsMzh9LAorCXsweDM4OCwweDM4YSwxLDM3fSwgezB4MzhjLDB4MzhjLC0xLDY0fSwgezB4MzhlLDB4MzhmLDEsNjN9LAorCXsweDM5MSwweDNhMSwxLDMyfSwgezB4M2EzLDB4M2FiLDEsMzJ9LCB7MHgzZDgsMHgzZWUsMiwxfSwKKwl7MHgzZjQsMHgzZjQsLTEsLTYwfSwgezB4M2Y3LDB4M2Y3LC0xLDF9LCB7MHgzZjksMHgzZjksLTEsLTd9LAorCXsweDNmYSwweDNmYSwtMSwxfSwgezB4NDAwLDB4NDBmLDEsODB9LCB7MHg0MTAsMHg0MmYsMSwzMn0sCisJezB4NDYwLDB4NDgwLDIsMX0sIHsweDQ4YSwweDRiZSwyLDF9LCB7MHg0YzEsMHg0Y2QsMiwxfSwKKwl7MHg0ZDAsMHg0ZjQsMiwxfSwgezB4NGY4LDB4NTAwLDgsMX0sIHsweDUwMiwweDUwZSwyLDF9LAorCXsweDUzMSwweDU1NiwxLDQ4fSwgezB4MWUwMCwweDFlOTQsMiwxfSwgezB4MWVhMCwweDFlZjgsMiwxfSwKKwl7MHgxZjA4LDB4MWYwZiwxLC04fSwgezB4MWYxOCwweDFmMWQsMSwtOH0sIHsweDFmMjgsMHgxZjJmLDEsLTh9LAorCXsweDFmMzgsMHgxZjNmLDEsLTh9LCB7MHgxZjQ4LDB4MWY0ZCwxLC04fSwgezB4MWY1OSwweDFmNWYsMiwtOH0sCisJezB4MWY2OCwweDFmNmYsMSwtOH0sIHsweDFmODgsMHgxZjhmLDEsLTh9LCB7MHgxZjk4LDB4MWY5ZiwxLC04fSwKKwl7MHgxZmE4LDB4MWZhZiwxLC04fSwgezB4MWZiOCwweDFmYjksMSwtOH0sIHsweDFmYmEsMHgxZmJiLDEsLTc0fSwKKwl7MHgxZmJjLDB4MWZiYywtMSwtOX0sIHsweDFmYzgsMHgxZmNiLDEsLTg2fSwgezB4MWZjYywweDFmY2MsLTEsLTl9LAorCXsweDFmZDgsMHgxZmQ5LDEsLTh9LCB7MHgxZmRhLDB4MWZkYiwxLC0xMDB9LCB7MHgxZmU4LDB4MWZlOSwxLC04fSwKKwl7MHgxZmVhLDB4MWZlYiwxLC0xMTJ9LCB7MHgxZmVjLDB4MWZlYywtMSwtN30sIHsweDFmZjgsMHgxZmY5LDEsLTEyOH0sCisJezB4MWZmYSwweDFmZmIsMSwtMTI2fSwgezB4MWZmYywweDFmZmMsLTEsLTl9LCB7MHgyMTI2LDB4MjEyNiwtMSwtNzUxN30sCisJezB4MjEyYSwweDIxMmEsLTEsLTgzODN9LCB7MHgyMTJiLDB4MjEyYiwtMSwtODI2Mn0sCisJezB4MjE2MCwweDIxNmYsMSwxNn0sIHsweDI0YjYsMHgyNGNmLDEsMjZ9LCB7MHhmZjIxLDB4ZmYzYSwxLDMyfSwKKwl7MHgxMDQwMCwweDEwNDI3LDEsNDB9Cit9OworCitzdGF0aWMgaW50IHV0Zl9jb252ZXJ0KGludCBhLCBjb252ZXJ0U3RydWN0IHRhYmxlW10sIGludCB0YWJsZVNpemUpOworCisvKgorICogR2VuZXJpYyBjb252ZXJzaW9uIGZ1bmN0aW9uIGZvciBjYXNlIG9wZXJhdGlvbnMuCisgKiBSZXR1cm4gdGhlIGNvbnZlcnRlZCBlcXVpdmFsZW50IG9mICJhIiwgd2hpY2ggaXMgYSBVQ1MtNCBjaGFyYWN0ZXIuICBVc2UKKyAqIHRoZSBnaXZlbiBjb252ZXJzaW9uICJ0YWJsZSIuICBVc2VzIGJpbmFyeSBzZWFyY2ggb24gInRhYmxlIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK3V0Zl9jb252ZXJ0KGEsIHRhYmxlLCB0YWJsZVNpemUpCisgICAgaW50CQkJYTsKKyAgICBjb252ZXJ0U3RydWN0CXRhYmxlW107CisgICAgaW50CQkJdGFibGVTaXplOworeworICAgIGludCBzdGFydCwgbWlkLCBlbmQ7IC8qIGluZGljZXMgaW50byB0YWJsZSAqLworCisgICAgc3RhcnQgPSAwOworICAgIGVuZCA9IHRhYmxlU2l6ZSAvIHNpemVvZihjb252ZXJ0U3RydWN0KTsKKyAgICB3aGlsZSAoc3RhcnQgPCBlbmQpCisgICAgeworCS8qIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KKwltaWQgPSAoZW5kICsgc3RhcnQpIC8yOworCWlmICh0YWJsZVttaWRdLnJhbmdlRW5kIDwgYSkKKwkgICAgc3RhcnQgPSBtaWQgKyAxOworCWVsc2UKKwkgICAgZW5kID0gbWlkOworICAgIH0KKyAgICBpZiAodGFibGVbc3RhcnRdLnJhbmdlU3RhcnQgPD0gYSAmJiBhIDw9IHRhYmxlW3N0YXJ0XS5yYW5nZUVuZAorCSAgICAmJiAoYSAtIHRhYmxlW3N0YXJ0XS5yYW5nZVN0YXJ0KSAlIHRhYmxlW3N0YXJ0XS5zdGVwID09IDApCisJcmV0dXJuIChhICsgdGFibGVbc3RhcnRdLm9mZnNldCk7CisgICAgZWxzZQorCXJldHVybiBhOworfQorCisvKgorICogUmV0dXJuIHRoZSBmb2xkZWQtY2FzZSBlcXVpdmFsZW50IG9mICJhIiwgd2hpY2ggaXMgYSBVQ1MtNCBjaGFyYWN0ZXIuICBVc2VzCisgKiBzaW1wbGUgY2FzZSBmb2xkaW5nLgorICovCisgICAgaW50Cit1dGZfZm9sZChhKQorICAgIGludAkJYTsKK3sKKyAgICByZXR1cm4gdXRmX2NvbnZlcnQoYSwgZm9sZENhc2UsIHNpemVvZihmb2xkQ2FzZSkpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyB0YWJsZXMgYXJlIGJ1aWx0IGJ5IHVwcGVyTG93ZXJFeHRyYWN0LnBsIDwgVW5pY29kZURhdGEudHh0IC4KKyAqIFRoZXkgbXVzdCBiZSBpbiBudW1lcmljIG9yZGVyLCBiZWNhdXNlIHdlIHVzZSBiaW5hcnkgc2VhcmNoIG9uIHRoZW0uCisgKiBBbiBlbnRyeSBzdWNoIGFzIHsweDQxLDB4NWEsMSwzMn0gbWVhbnMgdGhhdCBVQ1MtNCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZQorICogZnJvbSAweDQxIHRvIDB4NWEgaW5jbHVzaXZlLCBzdGVwcGluZyBieSAxLCBhcmUgc3dpdGNoZWQgdG8gbG93ZXIgKGZvcgorICogZXhhbXBsZSkgYnkgYWRkaW5nIDMyLgorICovCitjb252ZXJ0U3RydWN0IHRvTG93ZXJbXSA9Cit7CisJezB4NDEsMHg1YSwxLDMyfSwgezB4YzAsMHhkNiwxLDMyfSwgezB4ZDgsMHhkZSwxLDMyfSwKKwl7MHgxMDAsMHgxMmUsMiwxfSwgezB4MTMwLDB4MTMwLC0xLC0xOTl9LCB7MHgxMzIsMHgxMzYsMiwxfSwKKwl7MHgxMzksMHgxNDcsMiwxfSwgezB4MTRhLDB4MTc2LDIsMX0sIHsweDE3OCwweDE3OCwtMSwtMTIxfSwKKwl7MHgxNzksMHgxN2QsMiwxfSwgezB4MTgxLDB4MTgxLC0xLDIxMH0sIHsweDE4MiwweDE4NCwyLDF9LAorCXsweDE4NiwweDE4NiwtMSwyMDZ9LCB7MHgxODcsMHgxODcsLTEsMX0sIHsweDE4OSwweDE4YSwxLDIwNX0sCisJezB4MThiLDB4MThiLC0xLDF9LCB7MHgxOGUsMHgxOGUsLTEsNzl9LCB7MHgxOGYsMHgxOGYsLTEsMjAyfSwKKwl7MHgxOTAsMHgxOTAsLTEsMjAzfSwgezB4MTkxLDB4MTkxLC0xLDF9LCB7MHgxOTMsMHgxOTMsLTEsMjA1fSwKKwl7MHgxOTQsMHgxOTQsLTEsMjA3fSwgezB4MTk2LDB4MTk2LC0xLDIxMX0sIHsweDE5NywweDE5NywtMSwyMDl9LAorCXsweDE5OCwweDE5OCwtMSwxfSwgezB4MTljLDB4MTljLC0xLDIxMX0sIHsweDE5ZCwweDE5ZCwtMSwyMTN9LAorCXsweDE5ZiwweDE5ZiwtMSwyMTR9LCB7MHgxYTAsMHgxYTQsMiwxfSwgezB4MWE2LDB4MWE2LC0xLDIxOH0sCisJezB4MWE3LDB4MWE3LC0xLDF9LCB7MHgxYTksMHgxYTksLTEsMjE4fSwgezB4MWFjLDB4MWFjLC0xLDF9LAorCXsweDFhZSwweDFhZSwtMSwyMTh9LCB7MHgxYWYsMHgxYWYsLTEsMX0sIHsweDFiMSwweDFiMiwxLDIxN30sCisJezB4MWIzLDB4MWI1LDIsMX0sIHsweDFiNywweDFiNywtMSwyMTl9LCB7MHgxYjgsMHgxYmMsNCwxfSwKKwl7MHgxYzQsMHgxY2EsMywyfSwgezB4MWNkLDB4MWRiLDIsMX0sIHsweDFkZSwweDFlZSwyLDF9LAorCXsweDFmMSwweDFmMSwtMSwyfSwgezB4MWY0LDB4MWY0LC0xLDF9LCB7MHgxZjYsMHgxZjYsLTEsLTk3fSwKKwl7MHgxZjcsMHgxZjcsLTEsLTU2fSwgezB4MWY4LDB4MjFlLDIsMX0sIHsweDIyMCwweDIyMCwtMSwtMTMwfSwKKwl7MHgyMjIsMHgyMzIsMiwxfSwgezB4Mzg2LDB4Mzg2LC0xLDM4fSwgezB4Mzg4LDB4MzhhLDEsMzd9LAorCXsweDM4YywweDM4YywtMSw2NH0sIHsweDM4ZSwweDM4ZiwxLDYzfSwgezB4MzkxLDB4M2ExLDEsMzJ9LAorCXsweDNhMywweDNhYiwxLDMyfSwgezB4M2Q4LDB4M2VlLDIsMX0sIHsweDNmNCwweDNmNCwtMSwtNjB9LAorCXsweDNmNywweDNmNywtMSwxfSwgezB4M2Y5LDB4M2Y5LC0xLC03fSwgezB4M2ZhLDB4M2ZhLC0xLDF9LAorCXsweDQwMCwweDQwZiwxLDgwfSwgezB4NDEwLDB4NDJmLDEsMzJ9LCB7MHg0NjAsMHg0ODAsMiwxfSwKKwl7MHg0OGEsMHg0YmUsMiwxfSwgezB4NGMxLDB4NGNkLDIsMX0sIHsweDRkMCwweDRmNCwyLDF9LAorCXsweDRmOCwweDUwMCw4LDF9LCB7MHg1MDIsMHg1MGUsMiwxfSwgezB4NTMxLDB4NTU2LDEsNDh9LAorCXsweDFlMDAsMHgxZTk0LDIsMX0sIHsweDFlYTAsMHgxZWY4LDIsMX0sIHsweDFmMDgsMHgxZjBmLDEsLTh9LAorCXsweDFmMTgsMHgxZjFkLDEsLTh9LCB7MHgxZjI4LDB4MWYyZiwxLC04fSwgezB4MWYzOCwweDFmM2YsMSwtOH0sCisJezB4MWY0OCwweDFmNGQsMSwtOH0sIHsweDFmNTksMHgxZjVmLDIsLTh9LCB7MHgxZjY4LDB4MWY2ZiwxLC04fSwKKwl7MHgxZmI4LDB4MWZiOSwxLC04fSwgezB4MWZiYSwweDFmYmIsMSwtNzR9LCB7MHgxZmM4LDB4MWZjYiwxLC04Nn0sCisJezB4MWZkOCwweDFmZDksMSwtOH0sIHsweDFmZGEsMHgxZmRiLDEsLTEwMH0sIHsweDFmZTgsMHgxZmU5LDEsLTh9LAorCXsweDFmZWEsMHgxZmViLDEsLTExMn0sIHsweDFmZWMsMHgxZmVjLC0xLC03fSwgezB4MWZmOCwweDFmZjksMSwtMTI4fSwKKwl7MHgxZmZhLDB4MWZmYiwxLC0xMjZ9LCB7MHgyMTI2LDB4MjEyNiwtMSwtNzUxN30sIHsweDIxMmEsMHgyMTJhLC0xLC04MzgzfSwKKwl7MHgyMTJiLDB4MjEyYiwtMSwtODI2Mn0sIHsweGZmMjEsMHhmZjNhLDEsMzJ9LCB7MHgxMDQwMCwweDEwNDI3LDEsNDB9Cit9OworCitjb252ZXJ0U3RydWN0IHRvVXBwZXJbXSA9Cit7CisJezB4NjEsMHg3YSwxLC0zMn0sIHsweGI1LDB4YjUsLTEsNzQzfSwgezB4ZTAsMHhmNiwxLC0zMn0sCisJezB4ZjgsMHhmZSwxLC0zMn0sIHsweGZmLDB4ZmYsLTEsMTIxfSwgezB4MTAxLDB4MTJmLDIsLTF9LAorCXsweDEzMSwweDEzMSwtMSwtMjMyfSwgezB4MTMzLDB4MTM3LDIsLTF9LCB7MHgxM2EsMHgxNDgsMiwtMX0sCisJezB4MTRiLDB4MTc3LDIsLTF9LCB7MHgxN2EsMHgxN2UsMiwtMX0sIHsweDE3ZiwweDE3ZiwtMSwtMzAwfSwKKwl7MHgxODMsMHgxODUsMiwtMX0sIHsweDE4OCwweDE4Yyw0LC0xfSwgezB4MTkyLDB4MTkyLC0xLC0xfSwKKwl7MHgxOTUsMHgxOTUsLTEsOTd9LCB7MHgxOTksMHgxOTksLTEsLTF9LCB7MHgxOWUsMHgxOWUsLTEsMTMwfSwKKwl7MHgxYTEsMHgxYTUsMiwtMX0sIHsweDFhOCwweDFhZCw1LC0xfSwgezB4MWIwLDB4MWI0LDQsLTF9LAorCXsweDFiNiwweDFiOSwzLC0xfSwgezB4MWJkLDB4MWJkLC0xLC0xfSwgezB4MWJmLDB4MWJmLC0xLDU2fSwKKwl7MHgxYzUsMHgxYzYsMSwtMX0sIHsweDFjOCwweDFjOSwxLC0xfSwgezB4MWNiLDB4MWNjLDEsLTF9LAorCXsweDFjZSwweDFkYywyLC0xfSwgezB4MWRkLDB4MWRkLC0xLC03OX0sIHsweDFkZiwweDFlZiwyLC0xfSwKKwl7MHgxZjIsMHgxZjMsMSwtMX0sIHsweDFmNSwweDFmOSw0LC0xfSwgezB4MWZiLDB4MjFmLDIsLTF9LAorCXsweDIyMywweDIzMywyLC0xfSwgezB4MjUzLDB4MjUzLC0xLC0yMTB9LCB7MHgyNTQsMHgyNTQsLTEsLTIwNn0sCisJezB4MjU2LDB4MjU3LDEsLTIwNX0sIHsweDI1OSwweDI1OSwtMSwtMjAyfSwgezB4MjViLDB4MjViLC0xLC0yMDN9LAorCXsweDI2MCwweDI2MCwtMSwtMjA1fSwgezB4MjYzLDB4MjYzLC0xLC0yMDd9LCB7MHgyNjgsMHgyNjgsLTEsLTIwOX0sCisJezB4MjY5LDB4MjZmLDYsLTIxMX0sIHsweDI3MiwweDI3MiwtMSwtMjEzfSwgezB4Mjc1LDB4Mjc1LC0xLC0yMTR9LAorCXsweDI4MCwweDI4MywzLC0yMTh9LCB7MHgyODgsMHgyODgsLTEsLTIxOH0sIHsweDI4YSwweDI4YiwxLC0yMTd9LAorCXsweDI5MiwweDI5MiwtMSwtMjE5fSwgezB4M2FjLDB4M2FjLC0xLC0zOH0sIHsweDNhZCwweDNhZiwxLC0zN30sCisJezB4M2IxLDB4M2MxLDEsLTMyfSwgezB4M2MyLDB4M2MyLC0xLC0zMX0sIHsweDNjMywweDNjYiwxLC0zMn0sCisJezB4M2NjLDB4M2NjLC0xLC02NH0sIHsweDNjZCwweDNjZSwxLC02M30sIHsweDNkMCwweDNkMCwtMSwtNjJ9LAorCXsweDNkMSwweDNkMSwtMSwtNTd9LCB7MHgzZDUsMHgzZDUsLTEsLTQ3fSwgezB4M2Q2LDB4M2Q2LC0xLC01NH0sCisJezB4M2Q5LDB4M2VmLDIsLTF9LCB7MHgzZjAsMHgzZjAsLTEsLTg2fSwgezB4M2YxLDB4M2YxLC0xLC04MH0sCisJezB4M2YyLDB4M2YyLC0xLDd9LCB7MHgzZjUsMHgzZjUsLTEsLTk2fSwgezB4M2Y4LDB4M2ZiLDMsLTF9LAorCXsweDQzMCwweDQ0ZiwxLC0zMn0sIHsweDQ1MCwweDQ1ZiwxLC04MH0sIHsweDQ2MSwweDQ4MSwyLC0xfSwKKwl7MHg0OGIsMHg0YmYsMiwtMX0sIHsweDRjMiwweDRjZSwyLC0xfSwgezB4NGQxLDB4NGY1LDIsLTF9LAorCXsweDRmOSwweDUwMSw4LC0xfSwgezB4NTAzLDB4NTBmLDIsLTF9LCB7MHg1NjEsMHg1ODYsMSwtNDh9LAorCXsweDFlMDEsMHgxZTk1LDIsLTF9LCB7MHgxZTliLDB4MWU5YiwtMSwtNTl9LCB7MHgxZWExLDB4MWVmOSwyLC0xfSwKKwl7MHgxZjAwLDB4MWYwNywxLDh9LCB7MHgxZjEwLDB4MWYxNSwxLDh9LCB7MHgxZjIwLDB4MWYyNywxLDh9LAorCXsweDFmMzAsMHgxZjM3LDEsOH0sIHsweDFmNDAsMHgxZjQ1LDEsOH0sIHsweDFmNTEsMHgxZjU3LDIsOH0sCisJezB4MWY2MCwweDFmNjcsMSw4fSwgezB4MWY3MCwweDFmNzEsMSw3NH0sIHsweDFmNzIsMHgxZjc1LDEsODZ9LAorCXsweDFmNzYsMHgxZjc3LDEsMTAwfSwgezB4MWY3OCwweDFmNzksMSwxMjh9LCB7MHgxZjdhLDB4MWY3YiwxLDExMn0sCisJezB4MWY3YywweDFmN2QsMSwxMjZ9LCB7MHgxZjgwLDB4MWY4NywxLDh9LCB7MHgxZjkwLDB4MWY5NywxLDh9LAorCXsweDFmYTAsMHgxZmE3LDEsOH0sIHsweDFmYjAsMHgxZmIxLDEsOH0sIHsweDFmYjMsMHgxZmIzLC0xLDl9LAorCXsweDFmYmUsMHgxZmJlLC0xLC03MjA1fSwgezB4MWZjMywweDFmYzMsLTEsOX0sIHsweDFmZDAsMHgxZmQxLDEsOH0sCisJezB4MWZlMCwweDFmZTEsMSw4fSwgezB4MWZlNSwweDFmZTUsLTEsN30sIHsweDFmZjMsMHgxZmYzLC0xLDl9LAorCXsweGZmNDEsMHhmZjVhLDEsLTMyfSwgezB4MTA0MjgsMHgxMDQ0ZiwxLC00MH0KK307CisKKy8qCisgKiBSZXR1cm4gdGhlIHVwcGVyLWNhc2UgZXF1aXZhbGVudCBvZiAiYSIsIHdoaWNoIGlzIGEgVUNTLTQgY2hhcmFjdGVyLiAgVXNlCisgKiBzaW1wbGUgY2FzZSBmb2xkaW5nLgorICovCisgICAgaW50Cit1dGZfdG91cHBlcihhKQorICAgIGludAkJYTsKK3sKKyAgICAvKiBJZiAnY2FzZW1hcCcgY29udGFpbnMgImtlZXBhc2NpaSIgdXNlIEFTQ0lJIHN0eWxlIHRvdXBwZXIoKS4gKi8KKyAgICBpZiAoYSA8IDEyOCAmJiAoY21wX2ZsYWdzICYgQ01QX0tFRVBBU0NJSSkpCisJcmV0dXJuIFRPVVBQRVJfQVNDKGEpOworCisjaWYgZGVmaW5lZChIQVZFX1RPV1VQUEVSKSAmJiBkZWZpbmVkKF9fU1REQ19fSVNPXzEwNjQ2X18pCisgICAgLyogSWYgdG93dXBwZXIoKSBpcyBhdmFpbGJsZSBhbmQgaGFuZGxlcyBVbmljb2RlLCB1c2UgaXQuICovCisgICAgaWYgKCEoY21wX2ZsYWdzICYgQ01QX0lOVEVSTkFMKSkKKwlyZXR1cm4gdG93dXBwZXIoYSk7CisjZW5kaWYKKworICAgIC8qIEZvciBjaGFyYWN0ZXJzIGJlbG93IDEyOCB1c2UgbG9jYWxlIHNlbnNpdGl2ZSB0b3VwcGVyKCkuICovCisgICAgaWYgKGEgPCAxMjgpCisJcmV0dXJuIFRPVVBQRVJfTE9DKGEpOworCisgICAgLyogRm9yIGFueSBvdGhlciBjaGFyYWN0ZXJzIHVzZSB0aGUgYWJvdmUgbWFwcGluZyB0YWJsZS4gKi8KKyAgICByZXR1cm4gdXRmX2NvbnZlcnQoYSwgdG9VcHBlciwgc2l6ZW9mKHRvVXBwZXIpKTsKK30KKworICAgIGludAordXRmX2lzbG93ZXIoYSkKKyAgICBpbnQJCWE7Cit7CisgICAgcmV0dXJuICh1dGZfdG91cHBlcihhKSAhPSBhKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbG93ZXItY2FzZSBlcXVpdmFsZW50IG9mICJhIiwgd2hpY2ggaXMgYSBVQ1MtNCBjaGFyYWN0ZXIuICBVc2UKKyAqIHNpbXBsZSBjYXNlIGZvbGRpbmcuCisgKi8KKyAgICBpbnQKK3V0Zl90b2xvd2VyKGEpCisgICAgaW50CQlhOworeworICAgIC8qIElmICdjYXNlbWFwJyBjb250YWlucyAia2VlcGFzY2lpIiB1c2UgQVNDSUkgc3R5bGUgdG9sb3dlcigpLiAqLworICAgIGlmIChhIDwgMTI4ICYmIChjbXBfZmxhZ3MgJiBDTVBfS0VFUEFTQ0lJKSkKKwlyZXR1cm4gVE9MT1dFUl9BU0MoYSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfVE9XTE9XRVIpICYmIGRlZmluZWQoX19TVERDX19JU09fMTA2NDZfXykKKyAgICAvKiBJZiB0b3dsb3dlcigpIGlzIGF2YWlsYmxlIGFuZCBoYW5kbGVzIFVuaWNvZGUsIHVzZSBpdC4gKi8KKyAgICBpZiAoIShjbXBfZmxhZ3MgJiBDTVBfSU5URVJOQUwpKQorCXJldHVybiB0b3dsb3dlcihhKTsKKyNlbmRpZgorCisgICAgLyogRm9yIGNoYXJhY3RlcnMgYmVsb3cgMTI4IHVzZSBsb2NhbGUgc2Vuc2l0aXZlIHRvbG93ZXIoKS4gKi8KKyAgICBpZiAoYSA8IDEyOCkKKwlyZXR1cm4gVE9MT1dFUl9MT0MoYSk7CisKKyAgICAvKiBGb3IgYW55IG90aGVyIGNoYXJhY3RlcnMgdXNlIHRoZSBhYm92ZSBtYXBwaW5nIHRhYmxlLiAqLworICAgIHJldHVybiB1dGZfY29udmVydChhLCB0b0xvd2VyLCBzaXplb2YodG9Mb3dlcikpOworfQorCisgICAgaW50Cit1dGZfaXN1cHBlcihhKQorICAgIGludAkJYTsKK3sKKyAgICByZXR1cm4gKHV0Zl90b2xvd2VyKGEpICE9IGEpOworfQorCisvKgorICogVmVyc2lvbiBvZiBzdHJuaWNtcCgpIHRoYXQgaGFuZGxlcyBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCisgKiBOZWVkZWQgZm9yIEJpZzUsIFNqaWZ0LUpJUyBhbmQgVVRGLTggZW5jb2RpbmcuICBPdGhlciBEQkNTIGVuY29kaW5ncyBjYW4KKyAqIHByb2JhYmx5IHVzZSBzdHJuaWNtcCgpLCBiZWNhdXNlIHRoZXJlIGFyZSBubyBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZQorICogc2Vjb25kIGJ5dGUuCisgKiBSZXR1cm5zIHplcm8gaWYgczEgYW5kIHMyIGFyZSBlcXVhbCAoaWdub3JpbmcgY2FzZSksIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIHR3byBjaGFyYWN0ZXJzIG90aGVyd2lzZS4KKyAqLworICAgIGludAorbWJfc3RybmljbXAoczEsIHMyLCBuKQorICAgIGNoYXJfdQkqczEsICpzMjsKKyAgICBpbnQJCW47Cit7CisgICAgaW50CQlpLCBqLCBsOworICAgIGludAkJY2RpZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSBsKQorICAgIHsKKwlpZiAoczFbaV0gPT0gTlVMICYmIHMyW2ldID09IE5VTCkgICAvKiBib3RoIHN0cmluZ3MgZW5kICovCisJICAgIHJldHVybiAwOworCWlmIChlbmNfdXRmOCkKKwl7CisJICAgIGwgPSB1dGZfYnl0ZTJsZW4oczFbaV0pOworCSAgICBpZiAobCA+IG4gLSBpKQorCQlsID0gbiAtIGk7CQkgICAgLyogaW5jb21wbGV0ZSBjaGFyYWN0ZXIgKi8KKwkgICAgLyogQ2hlY2sgZGlyZWN0bHkgZmlyc3QsIGl0J3MgZmFzdGVyLiAqLworCSAgICBmb3IgKGogPSAwOyBqIDwgbDsgKytqKQorCQlpZiAoczFbaSArIGpdICE9IHMyW2kgKyBqXSkKKwkJICAgIGJyZWFrOworCSAgICBpZiAoaiA8IGwpCisJICAgIHsKKwkJLyogSWYgb25lIG9mIHRoZSB0d28gY2hhcmFjdGVycyBpcyBpbmNvbXBsZXRlIHJldHVybiAtMS4gKi8KKwkJaWYgKGkgKyB1dGZfYnl0ZTJsZW4oczFbaV0pID4gbiB8fCBpICsgdXRmX2J5dGUybGVuKHMyW2ldKSA+IG4pCisJCSAgICByZXR1cm4gLTE7CisJCWNkaWZmID0gdXRmX2ZvbGQodXRmX3B0cjJjaGFyKHMxICsgaSkpCisJCQkJCSAgICAgLSB1dGZfZm9sZCh1dGZfcHRyMmNoYXIoczIgKyBpKSk7CisJCWlmIChjZGlmZiAhPSAwKQorCQkgICAgcmV0dXJuIGNkaWZmOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMxICsgaSk7CisJICAgIGlmIChsIDw9IDEpCisJICAgIHsKKwkJLyogU2luZ2xlIGJ5dGU6IGZpcnN0IGNoZWNrIG5vcm1hbGx5LCB0aGVuIHdpdGggaWdub3JlIGNhc2UuICovCisJCWlmIChzMVtpXSAhPSBzMltpXSkKKwkJeworCQkgICAgY2RpZmYgPSBUT0xPV0VSX0xPQyhzMVtpXSkgLSBUT0xPV0VSX0xPQyhzMltpXSk7CisJCSAgICBpZiAoY2RpZmYgIT0gMCkKKwkJCXJldHVybiBjZGlmZjsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBGb3Igbm9uLVVuaWNvZGUgbXVsdGktYnl0ZSBkb24ndCBpZ25vcmUgY2FzZS4gKi8KKwkJaWYgKGwgPiBuIC0gaSkKKwkJICAgIGwgPSBuIC0gaTsKKwkJY2RpZmYgPSBTVFJOQ01QKHMxICsgaSwgczIgKyBpLCBsKTsKKwkJaWYgKGNkaWZmICE9IDApCisJCSAgICByZXR1cm4gY2RpZmY7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogImc4Ijogc2hvdyBieXRlcyBvZiB0aGUgVVRGLTggY2hhciB1bmRlciB0aGUgY3Vyc29yLiAgRG9lc24ndCBtYXR0ZXIgd2hhdAorICogJ2VuY29kaW5nJyBoYXMgYmVlbiBzZXQgdG8uCisgKi8KKyAgICB2b2lkCitzaG93X3V0ZjgoKQoreworICAgIGludAkJbGVuOworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWNsZW47CisgICAgaW50CQlpOworCisgICAgLyogR2V0IHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgY2hhciB1bmRlciB0aGUgY3Vyc29yLCBpbmNsdWRpbmcgY29tcG9zaW5nCisgICAgICogY2hhcmFjdGVycy4gKi8KKyAgICBsaW5lID0gbWxfZ2V0X2N1cnNvcigpOworICAgIGxlbiA9IHV0ZmNfcHRyMmxlbl9jaGVjayhsaW5lKTsKKyAgICBpZiAobGVuID09IDApCisgICAgeworCU1TRygiTlVMIik7CisJcmV0dXJuOworICAgIH0KKworICAgIElPYnVmZlswXSA9IE5VTDsKKyAgICBjbGVuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworCWlmIChjbGVuID09IDApCisJeworCSAgICAvKiBzdGFydCBvZiAoY29tcG9zaW5nKSBjaGFyYWN0ZXIsIGdldCBpdHMgbGVuZ3RoICovCisJICAgIGlmIChpID4gMCkKKwkJU1RSQ0FUKElPYnVmZiwgIisgIik7CisJICAgIGNsZW4gPSB1dGZfcHRyMmxlbl9jaGVjayhsaW5lICsgaSk7CisJfQorCXNwcmludGYoKGNoYXIgKilJT2J1ZmYgKyBTVFJMRU4oSU9idWZmKSwgIiUwMnggIiwgbGluZVtpXSk7CisJLS1jbGVuOworICAgIH0KKworICAgIG1zZyhJT2J1ZmYpOworfQorCisvKgorICogbWJfaGVhZF9vZmYoKSBmdW5jdGlvbiBwb2ludGVyLgorICogUmV0dXJuIG9mZnNldCBmcm9tICJwIiB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY2hhcmFjdGVyIGl0IHBvaW50cyBpbnRvLgorICogUmV0dXJucyAwIHdoZW4gYWxyZWFkeSBhdCB0aGUgZmlyc3QgYnl0ZSBvZiBhIGNoYXJhY3Rlci4KKyAqLworLypBUkdTVVNFRCovCisgICAgaW50CitsYXRpbl9oZWFkX29mZihiYXNlLCBwKQorICAgIGNoYXJfdQkqYmFzZTsKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgcmV0dXJuIDA7Cit9CisKKyAgICBpbnQKK2RiY3NfaGVhZF9vZmYoYmFzZSwgcCkKKyAgICBjaGFyX3UJKmJhc2U7CisgICAgY2hhcl91CSpwOworeworICAgIGNoYXJfdQkqcTsKKworICAgIC8qIEl0IGNhbid0IGJlIGEgdHJhaWxpbmcgYnl0ZSB3aGVuIG5vdCB1c2luZyBEQkNTLCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgICogc3RyaW5nIG9yIHRoZSBwcmV2aW91cyBieXRlIGNhbid0IHN0YXJ0IGEgZG91YmxlLWJ5dGUuICovCisgICAgaWYgKHAgPD0gYmFzZSB8fCBNQl9CWVRFMkxFTihwWy0xXSkgPT0gMSkKKwlyZXR1cm4gMDsKKworICAgIC8qIFRoaXMgaXMgc2xvdzogbmVlZCB0byBzdGFydCBhdCB0aGUgYmFzZSBhbmQgZ28gZm9yd2FyZCB1bnRpbCB0aGUKKyAgICAgKiBieXRlIHdlIGFyZSBsb29raW5nIGZvci4gIFJldHVybiAxIHdoZW4gd2Ugd2VudCBwYXN0IGl0LCAwIG90aGVyd2lzZS4gKi8KKyAgICBxID0gYmFzZTsKKyAgICB3aGlsZSAocSA8IHApCisJcSArPSBkYmNzX3B0cjJsZW5fY2hlY2socSk7CisgICAgcmV0dXJuIChxID09IHApID8gMCA6IDE7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTcGVjaWFsIHZlcnNpb24gb2YgZGJjc19oZWFkX29mZigpIHRoYXQgd29ya3MgZm9yIFNjcmVlbkxpbmVzW10sIHdoZXJlCisgKiBzaW5nbGUtd2lkdGggREJDU19KUE5VIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5LgorICovCisgICAgaW50CitkYmNzX3NjcmVlbl9oZWFkX29mZihiYXNlLCBwKQorICAgIGNoYXJfdQkqYmFzZTsKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgY2hhcl91CSpxOworCisgICAgLyogSXQgY2FuJ3QgYmUgYSB0cmFpbGluZyBieXRlIHdoZW4gbm90IHVzaW5nIERCQ1MsIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICAgKiBzdHJpbmcgb3IgdGhlIHByZXZpb3VzIGJ5dGUgY2FuJ3Qgc3RhcnQgYSBkb3VibGUtYnl0ZS4KKyAgICAgKiBGb3IgZXVjLWpwIGFuIDB4OGUgYnl0ZSBpbiB0aGUgcHJldmlvdXMgY2VsbCBhbHdheXMgbWVhbnMgd2UgaGF2ZSBhCisgICAgICogbGVhZCBieXRlIGluIHRoZSBjdXJyZW50IGNlbGwuICovCisgICAgaWYgKHAgPD0gYmFzZQorCSAgICB8fCAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmIHBbLTFdID09IDB4OGUpCisJICAgIHx8IE1CX0JZVEUyTEVOKHBbLTFdKSA9PSAxKQorCXJldHVybiAwOworCisgICAgLyogVGhpcyBpcyBzbG93OiBuZWVkIHRvIHN0YXJ0IGF0IHRoZSBiYXNlIGFuZCBnbyBmb3J3YXJkIHVudGlsIHRoZQorICAgICAqIGJ5dGUgd2UgYXJlIGxvb2tpbmcgZm9yLiAgUmV0dXJuIDEgd2hlbiB3ZSB3ZW50IHBhc3QgaXQsIDAgb3RoZXJ3aXNlLgorICAgICAqIEZvciBEQkNTX0pQTlUgbG9vayBvdXQgZm9yIDB4OGUsIHdoaWNoIG1lYW5zIHRoZSBzZWNvbmQgYnl0ZSBpcyBub3QKKyAgICAgKiBzdG9yZWQgYXMgdGhlIG5leHQgYnl0ZS4gKi8KKyAgICBxID0gYmFzZTsKKyAgICB3aGlsZSAocSA8IHApCisgICAgeworCWlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgKnEgPT0gMHg4ZSkKKwkgICAgKytxOworCWVsc2UKKwkgICAgcSArPSBkYmNzX3B0cjJsZW5fY2hlY2socSk7CisgICAgfQorICAgIHJldHVybiAocSA9PSBwKSA/IDAgOiAxOworfQorI2VuZGlmCisKKyAgICBpbnQKK3V0Zl9oZWFkX29mZihiYXNlLCBwKQorICAgIGNoYXJfdQkqYmFzZTsKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgY2hhcl91CSpxOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWM7CisjaWZkZWYgRkVBVF9BUkFCSUMKKyAgICBjaGFyX3UJKmo7CisjZW5kaWYKKworICAgIGlmICgqcCA8IDB4ODApCQkvKiBiZSBxdWljayBmb3IgQVNDSUkgKi8KKwlyZXR1cm4gMDsKKworICAgIC8qIFNraXAgYmFja3dhcmRzIG92ZXIgdHJhaWxpbmcgYnl0ZXM6IDEweHgueHh4eAorICAgICAqIFNraXAgYmFja3dhcmRzIGFnYWluIGlmIG9uIGEgY29tcG9zaW5nIGNoYXIuICovCisgICAgZm9yIChxID0gcDsgOyAtLXEpCisgICAgeworCS8qIE1vdmUgcyB0byB0aGUgbGFzdCBieXRlIG9mIHRoaXMgY2hhci4gKi8KKwlmb3IgKHMgPSBxOyAoc1sxXSAmIDB4YzApID09IDB4ODA7ICsrcykKKwkgICAgOworCS8qIE1vdmUgcSB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGlzIGNoYXIuICovCisJd2hpbGUgKHEgPiBiYXNlICYmICgqcSAmIDB4YzApID09IDB4ODApCisJICAgIC0tcTsKKwkvKiBDaGVjayBmb3IgaWxsZWdhbCBzZXF1ZW5jZS4gRG8gYWxsb3cgYW4gaWxsZWdhbCBieXRlIGFmdGVyIHdoZXJlIHdlCisJICogc3RhcnRlZC4gKi8KKwlpZiAodXRmOGxlbl90YWJbKnFdICE9IChpbnQpKHMgLSBxICsgMSkKKwkJCQkgICAgICAgJiYgdXRmOGxlbl90YWJbKnFdICE9IChpbnQpKHAgLSBxICsgMSkpCisJICAgIHJldHVybiAwOworCisJaWYgKHEgPD0gYmFzZSkKKwkgICAgYnJlYWs7CisKKwljID0gdXRmX3B0cjJjaGFyKHEpOworCWlmICh1dGZfaXNjb21wb3NpbmcoYykpCisJICAgIGNvbnRpbnVlOworCisjaWZkZWYgRkVBVF9BUkFCSUMKKwlpZiAoYXJhYmljX21heWNvbWJpbmUoYykpCisJeworCSAgICAvKiBBZHZhbmNlIHRvIGdldCBhIHNuZWFrLXBlYWsgYXQgdGhlIG5leHQgY2hhciAqLworCSAgICBqID0gcTsKKwkgICAgLS1qOworCSAgICAvKiBNb3ZlIGogdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhpcyBjaGFyLiAqLworCSAgICB3aGlsZSAoaiA+IGJhc2UgJiYgKCpqICYgMHhjMCkgPT0gMHg4MCkKKwkJLS1qOworCSAgICBpZiAoYXJhYmljX2NvbWJpbmUodXRmX3B0cjJjaGFyKGopLCBjKSkKKwkJY29udGludWU7CisJfQorI2VuZGlmCisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpKHAgLSBxKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gInAiIHRvIHRoZSBmaXJzdCBieXRlIG9mIGEgY2hhcmFjdGVyLiAgV2hlbiAicCIgaXMKKyAqIGF0IHRoZSBzdGFydCBvZiBhIGNoYXJhY3RlciAwIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIG9mZnNldCB0byB0aGUgbmV4dAorICogY2hhcmFjdGVyLiAgQ2FuIHN0YXJ0IGFueXdoZXJlIGluIGEgc3RyZWFtIG9mIGJ5dGVzLgorICovCisgICAgaW50CittYl9vZmZfbmV4dChiYXNlLCBwKQorICAgIGNoYXJfdQkqYmFzZTsKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaW50CQlpOworICAgIGludAkJajsKKworICAgIGlmIChlbmNfdXRmOCkKKyAgICB7CisJaWYgKCpwIDwgMHg4MCkJCS8qIGJlIHF1aWNrIGZvciBBU0NJSSAqLworCSAgICByZXR1cm4gMDsKKworCS8qIEZpbmQgdGhlIG5leHQgY2hhcmFjdGVyIHRoYXQgaXNuJ3QgMTB4eC54eHh4ICovCisJZm9yIChpID0gMDsgKHBbaV0gJiAweGMwKSA9PSAweDgwOyArK2kpCisJICAgIDsKKwlpZiAoaSA+IDApCisJeworCSAgICAvKiBDaGVjayBmb3IgaWxsZWdhbCBzZXF1ZW5jZS4gKi8KKwkgICAgZm9yIChqID0gMDsgcCAtIGogPiBiYXNlOyArK2opCisJCWlmICgocFstal0gJiAweGMwKSAhPSAweDgwKQorCQkgICAgYnJlYWs7CisJICAgIGlmICh1dGY4bGVuX3RhYltwWy1qXV0gIT0gaSArIGopCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaTsKKyAgICB9CisKKyAgICAvKiBPbmx5IG5lZWQgdG8gY2hlY2sgaWYgd2UncmUgb24gYSB0cmFpbCBieXRlLCBpdCBkb2Vzbid0IG1hdHRlciBpZiB3ZQorICAgICAqIHdhbnQgdGhlIG9mZnNldCB0byB0aGUgbmV4dCBvciBjdXJyZW50IGNoYXJhY3Rlci4gKi8KKyAgICByZXR1cm4gKCptYl9oZWFkX29mZikoYmFzZSwgcCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG9mZnNldCBmcm9tICJwIiB0byB0aGUgbGFzdCBieXRlIG9mIHRoZSBjaGFyYWN0ZXIgaXQgcG9pbnRzCisgKiBpbnRvLiAgQ2FuIHN0YXJ0IGFueXdoZXJlIGluIGEgc3RyZWFtIG9mIGJ5dGVzLgorICovCisgICAgaW50CittYl90YWlsX29mZihiYXNlLCBwKQorICAgIGNoYXJfdQkqYmFzZTsKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaW50CQlpOworICAgIGludAkJajsKKworICAgIGlmICgqcCA9PSBOVUwpCisJcmV0dXJuIDA7CisKKyAgICBpZiAoZW5jX3V0ZjgpCisgICAgeworCS8qIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIHRoYXQgaXMgMTB4eC54eHh4ICovCisJZm9yIChpID0gMDsgKHBbaSArIDFdICYgMHhjMCkgPT0gMHg4MDsgKytpKQorCSAgICA7CisJLyogQ2hlY2sgZm9yIGlsbGVnYWwgc2VxdWVuY2UuICovCisJZm9yIChqID0gMDsgcCAtIGogPiBiYXNlOyArK2opCisJICAgIGlmICgocFstal0gJiAweGMwKSAhPSAweDgwKQorCQlicmVhazsKKwlpZiAodXRmOGxlbl90YWJbcFstal1dICE9IGkgKyBqICsgMSkKKwkgICAgcmV0dXJuIDA7CisJcmV0dXJuIGk7CisgICAgfQorCisgICAgLyogSXQgY2FuJ3QgYmUgdGhlIGZpcnN0IGJ5dGUgaWYgYSBkb3VibGUtYnl0ZSB3aGVuIG5vdCB1c2luZyBEQkNTLCBhdCB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIHN0cmluZyBvciB0aGUgYnl0ZSBjYW4ndCBzdGFydCBhIGRvdWJsZS1ieXRlLiAqLworICAgIGlmIChlbmNfZGJjcyA9PSAwIHx8IHBbMV0gPT0gTlVMIHx8IE1CX0JZVEUyTEVOKCpwKSA9PSAxKQorCXJldHVybiAwOworCisgICAgLyogUmV0dXJuIDEgd2hlbiBvbiB0aGUgbGVhZCBieXRlLCAwIHdoZW4gb24gdGhlIHRhaWwgYnl0ZS4gKi8KKyAgICByZXR1cm4gMSAtIGRiY3NfaGVhZF9vZmYoYmFzZSwgcCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNwZWNpYWwgdmVyc2lvbiBvZiBtYl90YWlsX29mZigpIGZvciB1c2UgaW4gU2NyZWVuTGluZXNbXS4KKyAqLworICAgIGludAorZGJjc19zY3JlZW5fdGFpbF9vZmYoYmFzZSwgcCkKKyAgICBjaGFyX3UJKmJhc2U7CisgICAgY2hhcl91CSpwOworeworICAgIC8qIEl0IGNhbid0IGJlIHRoZSBmaXJzdCBieXRlIGlmIGEgZG91YmxlLWJ5dGUgd2hlbiBub3QgdXNpbmcgREJDUywgYXQgdGhlCisgICAgICogZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlIGJ5dGUgY2FuJ3Qgc3RhcnQgYSBkb3VibGUtYnl0ZS4KKyAgICAgKiBGb3IgZXVjLWpwIGFuIDB4OGUgYnl0ZSBhbHdheXMgbWVhbnMgd2UgaGF2ZSBhIGxlYWQgYnl0ZSBpbiB0aGUgY3VycmVudAorICAgICAqIGNlbGwuICovCisgICAgaWYgKCpwID09IE5VTCB8fCBwWzFdID09IE5VTAorCSAgICB8fCAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmICpwID09IDB4OGUpCisJICAgIHx8IE1CX0JZVEUyTEVOKCpwKSA9PSAxKQorCXJldHVybiAwOworCisgICAgLyogUmV0dXJuIDEgd2hlbiBvbiB0aGUgbGVhZCBieXRlLCAwIHdoZW4gb24gdGhlIHRhaWwgYnl0ZS4gKi8KKyAgICByZXR1cm4gMSAtIGRiY3Nfc2NyZWVuX2hlYWRfb2ZmKGJhc2UsIHApOworfQorI2VuZGlmCisKKy8qCisgKiBJZiB0aGUgY3Vyc29yIG1vdmVzIG9uIGFuIHRyYWlsIGJ5dGUsIHNldCB0aGUgY3Vyc29yIG9uIHRoZSBsZWFkIGJ5dGUuCisgKiBUaHVzIGl0IG1vdmVzIGxlZnQgaWYgbmVjZXNzYXJ5LgorICogUmV0dXJuIFRSVUUgd2hlbiB0aGUgY3Vyc29yIHdhcyBhZGp1c3RlZC4KKyAqLworICAgIHZvaWQKK21iX2FkanVzdF9jdXJzb3IoKQoreworICAgIG1iX2FkanVzdHBvcygmY3Vyd2luLT53X2N1cnNvcik7Cit9CisKKy8qCisgKiBBZGp1c3QgcG9zaXRpb24gIipscCIgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci4KKyAqIElmIGl0IHBvaW50cyB0byBhIHRhaWwgYnl0ZSBpdCdzIG1vdmVkIGJhY2t3YXJkcyB0byB0aGUgaGVhZCBieXRlLgorICovCisgICAgdm9pZAorbWJfYWRqdXN0cG9zKGxwKQorICAgIHBvc19UCSpscDsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAobHAtPmNvbCA+IDAKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJICAgIHx8IGxwLT5jb2xhZGQgPiAxCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlwID0gbWxfZ2V0KGxwLT5sbnVtKTsKKwlscC0+Y29sIC09ICgqbWJfaGVhZF9vZmYpKHAsIHAgKyBscC0+Y29sKTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJLyogUmVzZXQgImNvbGFkZCIgd2hlbiB0aGUgY3Vyc29yIHdvdWxkIGJlIG9uIHRoZSByaWdodCBoYWxmIG9mIGEKKwkgKiBkb3VibGUtd2lkZSBjaGFyYWN0ZXIuICovCisJaWYgKGxwLT5jb2xhZGQgPT0gMQorCQkmJiBwW2xwLT5jb2xdICE9IFRBQgorCQkmJiB2aW1faXNwcmludGMoKCptYl9wdHIyY2hhcikocCArIGxwLT5jb2wpKQorCQkmJiBwdHIyY2VsbHMocCArIGxwLT5jb2wpID4gMSkKKwkgICAgbHAtPmNvbGFkZCA9IDA7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYmVmb3JlICIqcCIsIGlmIHRoZXJlIGlzIG9uZS4KKyAqLworICAgIGNoYXJfdSAqCittYl9wcmV2cHRyKGxpbmUsIHApCisgICAgY2hhcl91ICpsaW5lOwkvKiBzdGFydCBvZiB0aGUgc3RyaW5nICovCisgICAgY2hhcl91ICpwOworeworICAgIGlmIChwID4gbGluZSkKKwlwID0gcCAtICgqbWJfaGVhZF9vZmYpKGxpbmUsIHAgLSAxKSAtIDE7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgInN0ciIuICBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgY291bnRzIGFzIG9uZS4KKyAqLworICAgIGludAorbWJfY2hhcmxlbihzdHIpCisgICAgY2hhcl91CSpzdHI7Cit7CisgICAgaW50IGNvdW50OworCisgICAgaWYgKHN0ciA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgZm9yIChjb3VudCA9IDA7ICpzdHIgIT0gTlVMOyBjb3VudCsrKQorCXN0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHN0cik7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBUcnkgdG8gdW4tZXNjYXBlIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKiBVc2VkIGZvciB0aGUgInRvIiBhbmQgImZyb20iIHBhcnQgb2YgYSBtYXBwaW5nLgorICogUmV0dXJuIHRoZSB1bi1lc2NhcGVkIHN0cmluZyBpZiBpdCBpcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLCBhbmQgYWR2YW5jZQorICogInBwIiB0byBqdXN0IGFmdGVyIHRoZSBieXRlcyB0aGF0IGZvcm1lZCBpdC4KKyAqIFJldHVybiBOVUxMIGlmIG5vIG11bHRpLWJ5dGUgY2hhciB3YXMgZm91bmQuCisgKi8KKyAgICBjaGFyX3UgKgorbWJfdW5lc2NhcGUocHApCisgICAgY2hhcl91ICoqcHA7Cit7CisgICAgc3RhdGljIGNoYXJfdQlidWZbTUJfTUFYQllURVMgKyAxXTsKKyAgICBpbnQJCQluLCBtID0gMDsKKyAgICBjaGFyX3UJCSpzdHIgPSAqcHA7CisKKyAgICAvKiBNdXN0IHRyYW5zbGF0ZSBLX1NQRUNJQUwgS1NfU1BFQ0lBTCBLRV9GSUxMRVIgdG8gS19TUEVDSUFMIGFuZCBDU0kKKyAgICAgKiBLU19FWFRSQSBLRV9DU0kgdG8gQ1NJLiAqLworICAgIGZvciAobiA9IDA7IHN0cltuXSAhPSBOVUwgJiYgbSA8PSBNQl9NQVhCWVRFUzsgKytuKQorICAgIHsKKwlpZiAoc3RyW25dID09IEtfU1BFQ0lBTAorCQkmJiBzdHJbbiArIDFdID09IEtTX1NQRUNJQUwKKwkJJiYgc3RyW24gKyAyXSA9PSBLRV9GSUxMRVIpCisJeworCSAgICBidWZbbSsrXSA9IEtfU1BFQ0lBTDsKKwkgICAgbiArPSAyOworCX0KKyMgaWZkZWYgRkVBVF9HVUkKKwllbHNlIGlmIChzdHJbbl0gPT0gQ1NJCisJCSYmIHN0cltuICsgMV0gPT0gS1NfRVhUUkEKKwkJJiYgc3RyW24gKyAyXSA9PSAoaW50KUtFX0NTSSkKKwl7CisJICAgIGJ1ZlttKytdID0gQ1NJOworCSAgICBuICs9IDI7CisJfQorIyBlbmRpZgorCWVsc2UgaWYgKHN0cltuXSA9PSBLX1NQRUNJQUwKKyMgaWZkZWYgRkVBVF9HVUkKKwkJfHwgc3RyW25dID09IENTSQorIyBlbmRpZgorCQkpCisJICAgIGJyZWFrOwkJLyogYSBzcGVjaWFsIGtleSBjYW4ndCBiZSBhIG11bHRpYnl0ZSBjaGFyICovCisJZWxzZQorCSAgICBidWZbbSsrXSA9IHN0cltuXTsKKwlidWZbbV0gPSBOVUw7CisKKwkvKiBSZXR1cm4gYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpZiBpdCdzIGZvdW5kLiAgQW4gaWxsZWdhbCBzZXF1ZW5jZQorCSAqIHdpbGwgcmVzdWx0IGluIGEgMSBoZXJlLiAqLworCWlmICgoKm1iX3B0cjJsZW5fY2hlY2spKGJ1ZikgPiAxKQorCXsKKwkgICAgKnBwID0gc3RyICsgbiArIDE7CisJICAgIHJldHVybiBidWY7CisJfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgYXQgInJvdyIvImNvbCIgb24gdGhlIHNjcmVlbiBpcyB0aGUgbGVmdCBzaWRlCisgKiBvZiBhIGRvdWJsZS13aWR0aCBjaGFyYWN0ZXIuCisgKiBDYWxsZXIgbXVzdCBtYWtlIHN1cmUgInJvdyIgYW5kICJjb2wiIGFyZSBub3QgaW52YWxpZCEKKyAqLworICAgIGludAorbWJfbGVmdGhhbHZlKHJvdywgY29sKQorICAgIGludAkgICAgcm93OworICAgIGludAkgICAgY29sOworeworI2lmZGVmIEZFQVRfSEFOR1VMSU4KKyAgICBpZiAoY29tcG9zaW5nX2hhbmd1bCkKKwlyZXR1cm4gVFJVRTsKKyNlbmRpZgorICAgIGlmIChlbmNfZGJjcyAhPSAwKQorCXJldHVybiBkYmNzX29mZjJjZWxscyhMaW5lT2Zmc2V0W3Jvd10gKyBjb2wpID4gMTsKKyAgICBpZiAoZW5jX3V0ZjgpCisJcmV0dXJuIChjb2wgKyAxIDwgQ29sdW1ucworCQkmJiBTY3JlZW5MaW5lc1tMaW5lT2Zmc2V0W3Jvd10gKyBjb2wgKyAxXSA9PSAwKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyMgaWYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkgfHwgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29ycmVjdCBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4sIGlmIGl0J3MgdGhlIHJpZ2h0IGhhbHZlIG9mIGEgZG91YmxlLXdpZGUKKyAqIGNoYXIgbW92ZSBpdCB0byB0aGUgbGVmdCBoYWx2ZS4gIFJldHVybnMgdGhlIGNvcnJlY3RlZCBjb2x1bW4uCisgKi8KKyAgICBpbnQKK21iX2ZpeF9jb2woY29sLCByb3cpCisgICAgaW50CQljb2w7CisgICAgaW50CQlyb3c7Cit7CisgICAgY29sID0gY2hlY2tfY29sKGNvbCk7CisgICAgcm93ID0gY2hlY2tfcm93KHJvdyk7CisgICAgaWYgKGhhc19tYnl0ZSAmJiBTY3JlZW5MaW5lcyAhPSBOVUxMICYmIGNvbCA+IDAKKwkgICAgJiYgKChlbmNfZGJjcworCQkgICAgJiYgU2NyZWVuTGluZXNbTGluZU9mZnNldFtyb3ddICsgY29sXSAhPSBOVUwKKwkJICAgICYmIGRiY3Nfc2NyZWVuX2hlYWRfb2ZmKFNjcmVlbkxpbmVzICsgTGluZU9mZnNldFtyb3ddLAorCQkJCQkgU2NyZWVuTGluZXMgKyBMaW5lT2Zmc2V0W3Jvd10gKyBjb2wpKQorCQl8fCAoZW5jX3V0ZjggJiYgU2NyZWVuTGluZXNbTGluZU9mZnNldFtyb3ddICsgY29sXSA9PSAwKSkpCisJLS1jb2w7CisgICAgcmV0dXJuIGNvbDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyBpbnQgZW5jX2FsaWFzX3NlYXJjaCBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworCisvKgorICogU2tpcCB0aGUgVmltIHNwZWNpZmljIGhlYWQgb2YgYSAnZW5jb2RpbmcnIG5hbWUuCisgKi8KKyAgICBjaGFyX3UgKgorZW5jX3NraXAocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaWYgKFNUUk5DTVAocCwgIjJieXRlLSIsIDYpID09IDApCisJcmV0dXJuIHAgKyA2OworICAgIGlmIChTVFJOQ01QKHAsICI4Yml0LSIsIDUpID09IDApCisJcmV0dXJuIHAgKyA1OworICAgIHJldHVybiBwOworfQorCisvKgorICogRmluZCB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIGVuY29kaW5nICJlbmMiLgorICogV2hlbiB0aGUgbmFtZSBpc24ndCByZWNvZ25pemVkLCByZXR1cm5zICJlbmMiIGl0c2VsZiwgYnV0IHdpdGggYWxsIGxvd2VyCisgKiBjYXNlIGNoYXJhY3RlcnMgYW5kICdfJyByZXBsYWNlZCB3aXRoICctJy4KKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZy4gIE5VTEwgZm9yIG91dC1vZi1tZW1vcnkuCisgKi8KKyAgICBjaGFyX3UgKgorZW5jX2Nhbm9uaXplKGVuYykKKyAgICBjaGFyX3UJKmVuYzsKK3sKKyAgICBjaGFyX3UJKnI7CisgICAgY2hhcl91CSpwLCAqczsKKyAgICBpbnQJCWk7CisKKyAgICAvKiBjb3B5ICJlbmMiIHRvIGFsbG9jdGVkIG1lbW9yeSwgd2l0aCByb29tIGZvciB0d28gJy0nICovCisgICAgciA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGVuYykgKyAzKSk7CisgICAgaWYgKHIgIT0gTlVMTCkKKyAgICB7CisJLyogTWFrZSBpdCBhbGwgbG93ZXIgY2FzZSBhbmQgcmVwbGFjZSAnXycgd2l0aCAnLScuICovCisJcCA9IHI7CisJZm9yIChzID0gZW5jOyAqcyAhPSBOVUw7ICsrcykKKwl7CisJICAgIGlmICgqcyA9PSAnXycpCisJCSpwKysgPSAnLSc7CisJICAgIGVsc2UKKwkJKnArKyA9IFRPTE9XRVJfQVNDKCpzKTsKKwl9CisJKnAgPSBOVUw7CisKKwkvKiBTa2lwICIyYnl0ZS0iIGFuZCAiOGJpdC0iLiAqLworCXAgPSBlbmNfc2tpcChyKTsKKworCS8qICJpc284ODU5IiAtPiAiaXNvLTg4NTkiICovCisJaWYgKFNUUk5DTVAocCwgImlzbzg4NTkiLCA3KSA9PSAwKQorCXsKKwkgICAgbWNoX21lbW1vdmUocCArIDQsIHAgKyAzLCBTVFJMRU4ocCArIDIpKTsKKwkgICAgcFszXSA9ICctJzsKKwl9CisKKwkvKiAiaXNvLTg4NTluIiAtPiAiaXNvLTg4NTktbiIgKi8KKwlpZiAoU1RSTkNNUChwLCAiaXNvLTg4NTkiLCA4KSA9PSAwICYmIHBbOF0gIT0gJy0nKQorCXsKKwkgICAgbWNoX21lbW1vdmUocCArIDksIHAgKyA4LCBTVFJMRU4ocCArIDcpKTsKKwkgICAgcFs4XSA9ICctJzsKKwl9CisKKwkvKiAibGF0aW4tTiIgLT4gImxhdGluTiIgKi8KKwlpZiAoU1RSTkNNUChwLCAibGF0aW4tIiwgNikgPT0gMCkKKwkgICAgbWNoX21lbW1vdmUocCArIDUsIHAgKyA2LCBTVFJMRU4ocCArIDUpKTsKKworCWlmIChlbmNfY2Fub25fc2VhcmNoKHApID49IDApCisJeworCSAgICAvKiBjYW5vbmljYWwgbmFtZSBjYW4gYmUgdXNlZCB1bm1vZGlmaWVkICovCisJICAgIGlmIChwICE9IHIpCisJCW1jaF9tZW1tb3ZlKHIsIHAsIFNUUkxFTihwKSArIDEpOworCX0KKwllbHNlIGlmICgoaSA9IGVuY19hbGlhc19zZWFyY2gocCkpID49IDApCisJeworCSAgICAvKiBhbGlhcyByZWNvZ25pemVkLCBnZXQgY2Fub25pY2FsIG5hbWUgKi8KKwkgICAgdmltX2ZyZWUocik7CisJICAgIHIgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopZW5jX2Nhbm9uX3RhYmxlW2ldLm5hbWUpOworCX0KKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIGFuIGVuY29kaW5nIGFsaWFzIG9mICJuYW1lIi4KKyAqIFJldHVybnMgLTEgd2hlbiBub3QgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgaW50CitlbmNfYWxpYXNfc2VhcmNoKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGVuY19hbGlhc190YWJsZVtpXS5uYW1lICE9IE5VTEw7ICsraSkKKwlpZiAoU1RSQ01QKG5hbWUsIGVuY19hbGlhc190YWJsZVtpXS5uYW1lKSA9PSAwKQorCSAgICByZXR1cm4gZW5jX2FsaWFzX3RhYmxlW2ldLmNhbm9uOworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQorCisjaWZkZWYgSEFWRV9MQU5HSU5GT19ICisjIGluY2x1ZGUgPGxhbmdpbmZvLmg+CisjZW5kaWYKKworLyoKKyAqIEdldCB0aGUgY2Fub25pY2FsaXplZCBlbmNvZGluZyBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgd2hlbiBzdWNjZXNzZnVsLCBOVUxMIHdoZW4gbm90LgorICovCisgICAgY2hhcl91ICoKK2VuY19sb2NhbGUoKQoreworI2lmbmRlZiBXSU4zMjY0CisgICAgY2hhcgkqczsKKyAgICBjaGFyCSpwOworICAgIGludAkJaTsKKyNlbmRpZgorICAgIGNoYXIJYnVmWzUwXTsKKyNpZmRlZiBXSU4zMjY0CisgICAgbG9uZwlhY3AgPSBHZXRBQ1AoKTsKKworICAgIGlmIChhY3AgPT0gMTIwMCkKKwlTVFJDUFkoYnVmLCAidWNzLTJsZSIpOworICAgIGVsc2UgaWYgKGFjcCA9PSAxMjUyKQorCVNUUkNQWShidWYsICJsYXRpbjEiKTsKKyAgICBlbHNlCisJc3ByaW50ZihidWYsICJjcCVsZCIsIGFjcCk7CisjZWxzZQorIyBpZmRlZiBIQVZFX05MX0xBTkdJTkZPX0NPREVTRVQKKyAgICBpZiAoKHMgPSBubF9sYW5naW5mbyhDT0RFU0VUKSkgPT0gTlVMTCB8fCAqcyA9PSBOVUwpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkKKwlpZiAoKHMgPSBzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKSA9PSBOVUxMIHx8ICpzID09IE5VTCkKKyMgZW5kaWYKKwkgICAgaWYgKChzID0gZ2V0ZW52KCJMQ19BTEwiKSkgPT0gTlVMTCB8fCAqcyA9PSBOVUwpCisJCWlmICgocyA9IGdldGVudigiTENfQ1RZUEUiKSkgPT0gTlVMTCB8fCAqcyA9PSBOVUwpCisJCSAgICBzID0gZ2V0ZW52KCJMQU5HIik7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8ICpzID09IE5VTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qIFRoZSBtb3N0IGdlbmVyaWMgbG9jYWxlIGZvcm1hdCBpczoKKyAgICAgKiBsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQorICAgICAqIElmIHRoZXJlIGlzIGEgJy4nIHJlbW92ZSB0aGUgcGFydCBiZWZvcmUgaXQuCisgICAgICogaWYgdGhlcmUgaXMgc29tZXRoaW5nIGFmdGVyIHRoZSBjb2Rlc2V0LCByZW1vdmUgaXQuCisgICAgICogTWFrZSB0aGUgbmFtZSBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgJ18nIHdpdGggJy0nLgorICAgICAqIEV4Y2VwdGlvbjogImphX0pQLkVVQyIgPT0gImV1Yy1qcCIsICJ6aF9DTi5FVUMiID0gImV1Yy1jbiIsCisgICAgICogImtvX0tSLkVVQyIgPT0gImV1Yy1rciIKKyAgICAgKi8KKyAgICBpZiAoKHAgPSAoY2hhciAqKXZpbV9zdHJjaHIoKGNoYXJfdSAqKXMsICcuJykpICE9IE5VTEwpCisgICAgeworCWlmIChwID4gcyArIDIgJiYgU1RSTklDTVAocCArIDEsICJFVUMiLCAzKSA9PSAwCisJCQkmJiAhaXNhbG51bSgoaW50KXBbNF0pICYmIHBbNF0gIT0gJy0nICYmIHBbLTNdID09ICdfJykKKwl7CisJICAgIC8qIGNvcHkgIlhZLkVVQyIgdG8gImV1Yy1YWSIgdG8gYnVmWzEwXSAqLworCSAgICBTVFJDUFkoYnVmICsgMTAsICJldWMtIik7CisJICAgIGJ1ZlsxNF0gPSBwWy0yXTsKKwkgICAgYnVmWzE1XSA9IHBbLTFdOworCSAgICBidWZbMTZdID0gMDsKKwkgICAgcyA9IGJ1ZiArIDEwOworCX0KKwllbHNlCisJICAgIHMgPSBwICsgMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgc1tpXSAhPSBOVUwgJiYgaSA8IHNpemVvZihidWYpIC0gMTsgKytpKQorICAgIHsKKwlpZiAoc1tpXSA9PSAnXycgfHwgc1tpXSA9PSAnLScpCisJICAgIGJ1ZltpXSA9ICctJzsKKwllbHNlIGlmIChpc2FsbnVtKChpbnQpc1tpXSkpCisJICAgIGJ1ZltpXSA9IFRPTE9XRVJfQVNDKHNbaV0pOworCWVsc2UKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGJ1ZltpXSA9IE5VTDsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVuY19jYW5vbml6ZSgoY2hhcl91ICopYnVmKTsKK30KKworI2lmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDb252ZXJ0IGFuIGVuY29kaW5nIG5hbWUgdG8gYW4gTVMtV2luZG93cyBjb2RlcGFnZS4KKyAqIFJldHVybnMgemVybyBpZiBubyBjb2RlcGFnZSBjYW4gYmUgZmlndXJlZCBvdXQuCisgKi8KKyAgICBpbnQKK2VuY25hbWUyY29kZXBhZ2UobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgaW50CQljcDsKKyAgICBjaGFyX3UJKnAgPSBuYW1lOworICAgIGludAkJaWR4OworCisgICAgaWYgKFNUUk5DTVAocCwgIjhiaXQtIiwgNSkgPT0gMCkKKwlwICs9IDU7CisgICAgZWxzZSBpZiAoU1RSTkNNUChwX2VuYywgIjJieXRlLSIsIDYpID09IDApCisJcCArPSA2OworCisgICAgaWYgKHBbMF0gPT0gJ2MnICYmIHBbMV0gPT0gJ3AnKQorCWNwID0gYXRvaShwICsgMik7CisgICAgZWxzZSBpZiAoKGlkeCA9IGVuY19jYW5vbl9zZWFyY2gocCkpID49IDApCisJY3AgPSBlbmNfY2Fub25fdGFibGVbaWR4XS5jb2RlcGFnZTsKKyAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgaWYgKElzVmFsaWRDb2RlUGFnZShjcCkpCisJcmV0dXJuIGNwOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyMgaWYgZGVmaW5lZChVU0VfSUNPTlYpIHx8IGRlZmluZWQoUFJPVE8pCisKK3N0YXRpYyBjaGFyX3UgKmljb252X3N0cmluZyBfX0FSR1MoKHZpbWNvbnZfVCAqdmNwLCBjaGFyX3UgKnN0ciwgaW50IHNsZW4sIGludCAqdW5jb252bGVucCkpOworCisvKgorICogQ2FsbCBpY29udl9vcGVuKCkgd2l0aCBhIGNoZWNrIGlmIGljb252KCkgd29ya3MgcHJvcGVybHkgKHRoZXJlIGFyZSBicm9rZW4KKyAqIHZlcnNpb25zKS4KKyAqIFJldHVybnMgKHZvaWQgKiktMSBpZiBmYWlsZWQuCisgKiAoc2hvdWxkIHJldHVybiBpY29udl90LCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBwcm90b3R5cGVzKS4KKyAqLworICAgIHZvaWQgKgorbXlfaWNvbnZfb3Blbih0bywgZnJvbSkKKyAgICBjaGFyX3UJKnRvOworICAgIGNoYXJfdQkqZnJvbTsKK3sKKyAgICBpY29udl90CWZkOworI2RlZmluZSBJQ09OVl9URVNUTEVOIDQwMAorICAgIGNoYXJfdQl0b2J1ZltJQ09OVl9URVNUTEVOXTsKKyAgICBjaGFyCSpwOworICAgIHNpemVfdAl0b2xlbjsKKyAgICBzdGF0aWMgaW50CWljb252X29rID0gLTE7CisKKyAgICBpZiAoaWNvbnZfb2sgPT0gRkFMU0UpCisJcmV0dXJuICh2b2lkICopLTE7CS8qIGRldGVjdGVkIGEgYnJva2VuIGljb252KCkgcHJldmlvdXNseSAqLworCisjaWZkZWYgRFlOQU1JQ19JQ09OVgorICAgIC8qIENoZWNrIGlmIHRoZSBpY29udi5kbGwgY2FuIGJlIGZvdW5kLiAqLworICAgIGlmICghaWNvbnZfZW5hYmxlZChUUlVFKSkKKwlyZXR1cm4gKHZvaWQgKiktMTsKKyNlbmRpZgorCisgICAgZmQgPSBpY29udl9vcGVuKChjaGFyICopZW5jX3NraXAodG8pLCAoY2hhciAqKWVuY19za2lwKGZyb20pKTsKKworICAgIGlmIChmZCAhPSAoaWNvbnZfdCktMSAmJiBpY29udl9vayA9PSAtMSkKKyAgICB7CisJLyoKKwkgKiBEbyBhIGR1bW15IGljb252KCkgY2FsbCB0byBjaGVjayBpZiBpdCBhY3R1YWxseSB3b3Jrcy4gIFRoZXJlIGlzIGEKKwkgKiB2ZXJzaW9uIG9mIGljb252KCkgb24gTGludXggdGhhdCBpcyBicm9rZW4uICBXZSBjYW4ndCBpZ25vcmUgaXQsCisJICogYmVjYXVzZSBpdCdzIHdpZGUtc3ByZWFkLiAgVGhlIHN5bXB0b21zIGFyZSB0aGF0IGFmdGVyIG91dHB1dHRpbmcKKwkgKiB0aGUgaW5pdGlhbCBzaGlmdCBzdGF0ZSB0aGUgInRvIiBwb2ludGVyIGlzIE5VTEwgYW5kIGNvbnZlcnNpb24KKwkgKiBzdG9wcyBmb3Igbm8gYXBwYXJlbnQgcmVhc29uIGFmdGVyIGFib3V0IDgxNjAgY2hhcmFjdGVycy4KKwkgKi8KKwlwID0gKGNoYXIgKil0b2J1ZjsKKwl0b2xlbiA9IElDT05WX1RFU1RMRU47CisJKHZvaWQpaWNvbnYoZmQsIE5VTEwsIE5VTEwsICZwLCAmdG9sZW4pOworCWlmIChwID09IE5VTEwpCisJeworCSAgICBpY29udl9vayA9IEZBTFNFOworCSAgICBpY29udl9jbG9zZShmZCk7CisJICAgIGZkID0gKGljb252X3QpLTE7CisJfQorCWVsc2UKKwkgICAgaWNvbnZfb2sgPSBUUlVFOworICAgIH0KKworICAgIHJldHVybiAodm9pZCAqKWZkOworfQorCisvKgorICogQ29udmVydCB0aGUgc3RyaW5nICJzdHJbc2xlbl0iIHdpdGggaWNvbnYoKS4KKyAqIElmICJ1bmNvbnZsZW5wIiBpcyBub3QgTlVMTCBoYW5kbGUgdGhlIHN0cmluZyBlbmRpbmcgaW4gYW4gaW5jb21wbGV0ZQorICogc2VxdWVuY2UgYW5kIHNldCAiKnVuY29udmxlbnAiIHRvIHRoZSBsZW5ndGggb2YgaXQuCisgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIGFsbG9jYXRlZCBtZW1vcnkuICBOVUxMIGZvciBhbiBlcnJvci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgoraWNvbnZfc3RyaW5nKHZjcCwgc3RyLCBzbGVuLCB1bmNvbnZsZW5wKQorICAgIHZpbWNvbnZfVAkqdmNwOworICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJc2xlbjsKKyAgICBpbnQJCSp1bmNvbnZsZW5wOworeworICAgIGNvbnN0IGNoYXIJKmZyb207CisgICAgc2l6ZV90CWZyb21sZW47CisgICAgY2hhcgkqdG87CisgICAgc2l6ZV90CXRvbGVuOworICAgIHNpemVfdAlsZW4gPSAwOworICAgIHNpemVfdAlkb25lID0gMDsKKyAgICBjaGFyX3UJKnJlc3VsdCA9IE5VTEw7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbDsKKworICAgIGZyb20gPSAoY2hhciAqKXN0cjsKKyAgICBmcm9tbGVuID0gc2xlbjsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAobGVuID09IDAgfHwgSUNPTlZfRVJSTk8gPT0gSUNPTlZfRTJCSUcpCisJeworCSAgICAvKiBBbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgbW9zdCBjb252ZXJzaW9ucy4gIFdoZW4gcmUtYWxsb2NhdGluZworCSAgICAgKiBpbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUuICovCisJICAgIGxlbiA9IGxlbiArIGZyb21sZW4gKiAyICsgNDA7CisJICAgIHAgPSBhbGxvYygodW5zaWduZWQpbGVuKTsKKwkgICAgaWYgKHAgIT0gTlVMTCAmJiBkb25lID4gMCkKKwkJbWNoX21lbW1vdmUocCwgcmVzdWx0LCBkb25lKTsKKwkgICAgdmltX2ZyZWUocmVzdWx0KTsKKwkgICAgcmVzdWx0ID0gcDsKKwkgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQkvKiBvdXQgb2YgbWVtb3J5ICovCisJCWJyZWFrOworCX0KKworCXRvID0gKGNoYXIgKilyZXN1bHQgKyBkb25lOworCXRvbGVuID0gbGVuIC0gZG9uZSAtIDI7CisJLyogQXZvaWQgYSB3YXJuaW5nIGZvciBzeXN0ZW1zIHdpdGggYSB3cm9uZyBpY29udigpIHByb3RvdHlwZSBieQorCSAqIGNhc3RpbmcgdGhlIHNlY29uZCBhcmd1bWVudCB0byB2b2lkICouICovCisJaWYgKGljb252KHZjcC0+dmNfZmQsICh2b2lkICopJmZyb20sICZmcm9tbGVuLCAmdG8sICZ0b2xlbikKKwkJCQkJCQkJIT0gKHNpemVfdCktMSkKKwl7CisJICAgIC8qIEZpbmlzaGVkLCBhcHBlbmQgYSBOVUwuICovCisJICAgICp0byA9IE5VTDsKKwkgICAgYnJlYWs7CisJfQorCisJLyogQ2hlY2sgYm90aCBJQ09OVl9FSU5WQUwgYW5kIEVJTlZBTCwgYmVjYXVzZSB0aGUgZHluYW1pY2FsbHkgbG9hZGVkCisJICogaWNvbnYgbGlicmFyeSBtYXkgdXNlIG9uZSBvZiB0aGVtLiAqLworCWlmICghdmNwLT52Y19mYWlsICYmIHVuY29udmxlbnAgIT0gTlVMTAorCQkmJiAoSUNPTlZfRVJSTk8gPT0gSUNPTlZfRUlOVkFMIHx8IElDT05WX0VSUk5PID09IEVJTlZBTCkpCisJeworCSAgICAvKiBIYW5kbGUgYW4gaW5jb21wbGV0ZSBzZXF1ZW5jZSBhdCB0aGUgZW5kLiAqLworCSAgICAqdG8gPSBOVUw7CisJICAgICp1bmNvbnZsZW5wID0gZnJvbWxlbjsKKwkgICAgYnJlYWs7CisJfQorCisJLyogQ2hlY2sgYm90aCBJQ09OVl9FSUxTRVEgYW5kIEVJTFNFUSwgYmVjYXVzZSB0aGUgZHluYW1pY2FsbHkgbG9hZGVkCisJICogaWNvbnYgbGlicmFyeSBtYXkgdXNlIG9uZSBvZiB0aGVtLiAqLworCWVsc2UgaWYgKCF2Y3AtPnZjX2ZhaWwKKwkJJiYgKElDT05WX0VSUk5PID09IElDT05WX0VJTFNFUSB8fCBJQ09OVl9FUlJOTyA9PSBFSUxTRVEKKwkJICAgIHx8IElDT05WX0VSUk5PID09IElDT05WX0VJTlZBTCB8fCBJQ09OVl9FUlJOTyA9PSBFSU5WQUwpKQorCXsKKwkgICAgLyogQ2FuJ3QgY29udmVydDogaW5zZXJ0IGEgJz8nIGFuZCBza2lwIGEgY2hhcmFjdGVyLiAgVGhpcyBhc3N1bWVzCisJICAgICAqIGNvbnZlcnNpb24gZnJvbSAnZW5jb2RpbmcnIHRvIHNvbWV0aGluZyBlbHNlLiAgSW4gb3RoZXIKKwkgICAgICogc2l0dWF0aW9ucyB3ZSBkb24ndCBrbm93IHdoYXQgdG8gc2tpcCBhbnl3YXkuICovCisJICAgICp0bysrID0gJz8nOworCSAgICBpZiAoKCptYl9wdHIyY2VsbHMpKChjaGFyX3UgKilmcm9tKSA+IDEpCisJCSp0bysrID0gJz8nOworCSAgICBsID0gKCptYl9wdHIybGVuX2NoZWNrKSgoY2hhcl91ICopZnJvbSk7CisJICAgIGZyb20gKz0gbDsKKwkgICAgZnJvbWxlbiAtPSBsOworCX0KKwllbHNlIGlmIChJQ09OVl9FUlJOTyAhPSBJQ09OVl9FMkJJRykKKwl7CisJICAgIC8qIGNvbnZlcnNpb24gZmFpbGVkICovCisJICAgIHZpbV9mcmVlKHJlc3VsdCk7CisJICAgIHJlc3VsdCA9IE5VTEw7CisJICAgIGJyZWFrOworCX0KKwkvKiBOb3QgZW5vdWdoIHJvb20gb3Igc2tpcHBpbmcgaWxsZWdhbCBzZXF1ZW5jZS4gKi8KKwlkb25lID0gdG8gLSAoY2hhciAqKXJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworIyAgaWYgZGVmaW5lZChEWU5BTUlDX0lDT05WKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIER5bmFtaWNhbGx5IGxvYWQgdGhlICJpY29udi5kbGwiIG9uIFdpbjMyLgorICovCisKKyNpZm5kZWYgRFlOQU1JQ19JQ09OVgkgICAgLyoganVzdCBnZW5lcmF0aW5nIHByb3RvdHlwZXMgKi8KKyMgZGVmaW5lIEhJTlNUQU5DRSBpbnQKKyNlbmRpZgorSElOU1RBTkNFIGhJY29udkRMTCA9IDA7CitISU5TVEFOQ0UgaE1zdmNydERMTCA9IDA7CisKKyMgIGlmbmRlZiBEWU5BTUlDX0lDT05WX0RMTAorIyAgIGRlZmluZSBEWU5BTUlDX0lDT05WX0RMTCAiaWNvbnYuZGxsIgorIyAgIGRlZmluZSBEWU5BTUlDX0lDT05WX0RMTF9BTFQgImxpYmljb252LmRsbCIKKyMgIGVuZGlmCisjICBpZm5kZWYgRFlOQU1JQ19NU1ZDUlRfRExMCisjICAgZGVmaW5lIERZTkFNSUNfTVNWQ1JUX0RMTCAibXN2Y3J0LmRsbCIKKyMgIGVuZGlmCisKKy8qCisgKiBUcnkgb3BlbmluZyB0aGUgaWNvbnYuZGxsIGFuZCByZXR1cm4gVFJVRSBpZiBpY29udigpIGNhbiBiZSB1c2VkLgorICovCisgICAgaW50CitpY29udl9lbmFibGVkKHZlcmJvc2UpCisgICAgaW50CQl2ZXJib3NlOworeworICAgIGlmIChoSWNvbnZETEwgIT0gMCAmJiBoTXN2Y3J0RExMICE9IDApCisJcmV0dXJuIFRSVUU7CisgICAgaEljb252RExMID0gTG9hZExpYnJhcnkoRFlOQU1JQ19JQ09OVl9ETEwpOworICAgIGlmIChoSWNvbnZETEwgPT0gMCkJCS8qIHNvbWV0aW1lcyBpdCdzIGNhbGxlZCBsaWJpY29udi5kbGwgKi8KKwloSWNvbnZETEwgPSBMb2FkTGlicmFyeShEWU5BTUlDX0lDT05WX0RMTF9BTFQpOworICAgIGlmIChoSWNvbnZETEwgIT0gMCkKKwloTXN2Y3J0RExMID0gTG9hZExpYnJhcnkoRFlOQU1JQ19NU1ZDUlRfRExMKTsKKyAgICBpZiAoaEljb252RExMID09IDAgfHwgaE1zdmNydERMTCA9PSAwKQorICAgIHsKKwkvKiBPbmx5IGdpdmUgdGhlIG1lc3NhZ2Ugd2hlbiAndmVyYm9zZScgaXMgc2V0LCBvdGhlcndpc2UgaXQgbWlnaHQgYmUKKwkgKiBkb25lIHdoZW5ldmVyIGEgY29udmVyc2lvbiBpcyBhdHRlbXB0ZWQuICovCisJaWYgKHZlcmJvc2UgJiYgcF92ZXJib3NlID4gMCkKKwkgICAgRU1TRzIoXyhlX2xvYWRsaWIpLAorCQkgICAgaEljb252RExMID09IDAgPyBEWU5BTUlDX0lDT05WX0RMTCA6IERZTkFNSUNfTVNWQ1JUX0RMTCk7CisJaWNvbnZfZW5kKCk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICooKEZBUlBST0MqKSZpY29udikJCT0gR2V0UHJvY0FkZHJlc3MoaEljb252RExMLCAibGliaWNvbnYiKTsKKyAgICAqKChGQVJQUk9DKikmaWNvbnZfb3BlbikJPSBHZXRQcm9jQWRkcmVzcyhoSWNvbnZETEwsICJsaWJpY29udl9vcGVuIik7CisgICAgKigoRkFSUFJPQyopJmljb252X2Nsb3NlKQk9IEdldFByb2NBZGRyZXNzKGhJY29udkRMTCwgImxpYmljb252X2Nsb3NlIik7CisgICAgKigoRkFSUFJPQyopJmljb252Y3RsKQk9IEdldFByb2NBZGRyZXNzKGhJY29udkRMTCwgImxpYmljb252Y3RsIik7CisgICAgKigoRkFSUFJPQyopJmljb252X2Vycm5vKQk9IEdldFByb2NBZGRyZXNzKGhNc3ZjcnRETEwsICJfZXJybm8iKTsKKyAgICBpZiAoaWNvbnYgPT0gTlVMTCB8fCBpY29udl9vcGVuID09IE5VTEwgfHwgaWNvbnZfY2xvc2UgPT0gTlVMTAorCSAgICB8fCBpY29udmN0bCA9PSBOVUxMIHx8IGljb252X2Vycm5vID09IE5VTEwpCisgICAgeworCWljb252X2VuZCgpOworCWlmICh2ZXJib3NlICYmIHBfdmVyYm9zZSA+IDApCisJICAgIEVNU0cyKF8oZV9sb2FkZnVuYyksICJmb3IgbGliaWNvbnYiKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisgICAgdm9pZAoraWNvbnZfZW5kKCkKK3sKKyAgICAvKiBEb24ndCB1c2UgaWNvbnYoKSB3aGVuIGlucHV0dGluZyBvciBvdXRwdXR0aW5nIGNoYXJhY3RlcnMuICovCisgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSA9PSBDT05WX0lDT05WKQorCWNvbnZlcnRfc2V0dXAoJmlucHV0X2NvbnYsIE5VTEwsIE5VTEwpOworICAgIGlmIChvdXRwdXRfY29udi52Y190eXBlID09IENPTlZfSUNPTlYpCisJY29udmVydF9zZXR1cCgmb3V0cHV0X2NvbnYsIE5VTEwsIE5VTEwpOworCisgICAgaWYgKGhJY29udkRMTCAhPSAwKQorCUZyZWVMaWJyYXJ5KGhJY29udkRMTCk7CisgICAgaWYgKGhNc3ZjcnRETEwgIT0gMCkKKwlGcmVlTGlicmFyeShoTXN2Y3J0RExMKTsKKyAgICBoSWNvbnZETEwgPSAwOworICAgIGhNc3ZjcnRETEwgPSAwOworfQorIyAgZW5kaWYgLyogRFlOQU1JQ19JQ09OViAqLworIyBlbmRpZiAvKiBVU0VfSUNPTlYgKi8KKworI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworI2lmIGRlZmluZWQoRkVBVF9YSU0pIHx8IGRlZmluZWQoUFJPVE8pCisKKyMgaWZkZWYgRkVBVF9HVUlfR1RLCitzdGF0aWMgaW50IHhpbV9oYXNfcHJlZWRpdGluZyBJTklUKD0gRkFMU0UpOyAgLyogSU0gY3VycmVudCBzdGF0dXMgKi8KKworLyoKKyAqIFNldCBwcmVlZGl0X3N0YXJ0X2NvbCB0byB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW5pdF9wcmVlZGl0X3N0YXJ0X2NvbCh2b2lkKQoreworICAgIGlmIChTdGF0ZSAmIENNRExJTkUpCisJcHJlZWRpdF9zdGFydF9jb2wgPSBjbWRsaW5lX2dldHZjb2xfY3Vyc29yKCk7CisgICAgZWxzZSBpZiAoY3Vyd2luICE9IE5VTEwpCisJZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmcHJlZWRpdF9zdGFydF9jb2wsIE5VTEwsIE5VTEwpOworICAgIC8qIFByZXZlbnQgdGhhdCBwcmVlZGl0aW5nIG1hcmtzIHRoZSBidWZmZXIgYXMgY2hhbmdlZC4gKi8KKyAgICB4aW1fY2hhbmdlZF93aGlsZV9wcmVlZGl0aW5nID0gY3VyYnVmLT5iX2NoYW5nZWQ7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChIQVZFX0dUSzIpICYmICFkZWZpbmVkKFBST1RPKQorCitzdGF0aWMgaW50IGltX2lzX2FjdGl2ZQkgICAgICAgPSBGQUxTRTsJLyogSU0gaXMgZW5hYmxlZCBmb3IgY3VycmVudCBtb2RlICAgICovCitzdGF0aWMgaW50IGltX3ByZWVkaXRfY3Vyc29yICAgPSAwOwkvKiBjdXJzb3Igb2Zmc2V0IGluIGNoYXJhY3RlcnMgICAgICAgKi8KK3N0YXRpYyBpbnQgaW1fcHJlZWRpdF90cmFpbGluZyA9IDA7CS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIGN1cnNvciAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbV9jb21taXRfaGFuZGxlcl9pZCAgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCAgaW1fYWN0aXZhdGVrZXlfa2V5dmFsID0gR0RLX1ZvaWRTeW1ib2w7CitzdGF0aWMgdW5zaWduZWQgaW50ICBpbV9hY3RpdmF0ZWtleV9zdGF0ZSAgPSAwOworCisgICAgdm9pZAoraW1fc2V0X2FjdGl2ZShpbnQgYWN0aXZlKQoreworICAgIGludCB3YXNfYWN0aXZlOworCisgICAgd2FzX2FjdGl2ZSA9ICEhaW1faXNfYWN0aXZlOworICAgIGltX2lzX2FjdGl2ZSA9IChhY3RpdmUgJiYgIXBfaW1kaXNhYmxlKTsKKworICAgIGlmIChpbV9pc19hY3RpdmUgIT0gd2FzX2FjdGl2ZSkKKwl4aW1fcmVzZXQoKTsKK30KKworICAgIHZvaWQKK3hpbV9zZXRfZm9jdXMoaW50IGZvY3VzKQoreworICAgIGlmICh4aWMgIT0gTlVMTCkKKyAgICB7CisJaWYgKGZvY3VzKQorCSAgICBndGtfaW1fY29udGV4dF9mb2N1c19pbih4aWMpOworCWVsc2UKKwkgICAgZ3RrX2ltX2NvbnRleHRfZm9jdXNfb3V0KHhpYyk7CisgICAgfQorfQorCisgICAgdm9pZAoraW1fc2V0X3Bvc2l0aW9uKGludCByb3csIGludCBjb2wpCit7CisgICAgaWYgKHhpYyAhPSBOVUxMKQorICAgIHsKKwlHZGtSZWN0YW5nbGUgYXJlYTsKKworCWFyZWEueCA9IEZJTExfWChjb2wpOworCWFyZWEueSA9IEZJTExfWShyb3cpOworCWFyZWEud2lkdGggID0gZ3VpLmNoYXJfd2lkdGggKiAobWJfbGVmdGhhbHZlKHJvdywgY29sKSA/IDIgOiAxKTsKKwlhcmVhLmhlaWdodCA9IGd1aS5jaGFyX2hlaWdodDsKKworCWd0a19pbV9jb250ZXh0X3NldF9jdXJzb3JfbG9jYXRpb24oeGljLCAmYXJlYSk7CisgICAgfQorfQorCisjICBpZiAwIHx8IGRlZmluZWQoUFJPVE8pIC8qIGFwcGFyZW50bHkgb25seSB1c2VkIGluIGd1aV94MTEuYyAqLworICAgIHZvaWQKK3hpbV9zZXRfcHJlZWRpdCh2b2lkKQoreworICAgIGltX3NldF9wb3NpdGlvbihndWkucm93LCBndWkuY29sKTsKK30KKyMgIGVuZGlmCisKKyAgICBzdGF0aWMgdm9pZAoraW1fYWRkX3RvX2lucHV0KGNoYXJfdSAqc3RyLCBpbnQgbGVuKQoreworICAgIC8qIENvbnZlcnQgZnJvbSAndGVybWVuY29kaW5nJyAoYWx3YXlzICJ1dGYtOCIpIHRvICdlbmNvZGluZycgKi8KKyAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKyAgICB7CisJc3RyID0gc3RyaW5nX2NvbnZlcnQoJmlucHV0X2NvbnYsIHN0ciwgJmxlbik7CisJZ19yZXR1cm5faWZfZmFpbChzdHIgIT0gTlVMTCk7CisgICAgfQorCisgICAgYWRkX3RvX2lucHV0X2J1Zl9jc2koc3RyLCBsZW4pOworCisgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJdmltX2ZyZWUoc3RyKTsKKworICAgIGlmIChwX21oKSAvKiBibGFuayBvdXQgdGhlIHBvaW50ZXIgaWYgbmVjZXNzYXJ5ICovCisJZ3VpX21jaF9tb3VzZWhpZGUoVFJVRSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW1fZGVsZXRlX3ByZWVkaXQodm9pZCkKK3sKKyAgICBjaGFyX3UgYnNrZXlbXSAgPSB7Q1NJLCAnaycsICdiJ307CisgICAgY2hhcl91IGRlbGtleVtdID0ge0NTSSwgJ2snLCAnRCd9OworCisgICAgaWYgKFN0YXRlICYgTk9STUFMKQorICAgIHsKKwlpbV9wcmVlZGl0X2N1cnNvciA9IDA7CisJcmV0dXJuOworICAgIH0KKyAgICBmb3IgKDsgaW1fcHJlZWRpdF9jdXJzb3IgPiAwOyAtLWltX3ByZWVkaXRfY3Vyc29yKQorCWFkZF90b19pbnB1dF9idWYoYnNrZXksIChpbnQpc2l6ZW9mKGJza2V5KSk7CisKKyAgICBmb3IgKDsgaW1fcHJlZWRpdF90cmFpbGluZyA+IDA7IC0taW1fcHJlZWRpdF90cmFpbGluZykKKwlhZGRfdG9faW5wdXRfYnVmKGRlbGtleSwgKGludClzaXplb2YoZGVsa2V5KSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW1fY29ycmVjdF9jdXJzb3IoaW50IG51bV9tb3ZlX2JhY2spCit7CisgICAgY2hhcl91IGJhY2trZXlbXSA9IHtDU0ksICdrJywgJ2wnfTsKKworICAgIGlmIChTdGF0ZSAmIE5PUk1BTCkKKwlyZXR1cm47CisjICBpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGlmICgoU3RhdGUgJiBDTURMSU5FKSA9PSAwICYmIGN1cndpbiAhPSBOVUxMICYmIGN1cndpbi0+d19wX3JsKQorCWJhY2trZXlbMl0gPSAncic7CisjICBlbmRpZgorICAgIGZvciAoOyBudW1fbW92ZV9iYWNrID4gMDsgLS1udW1fbW92ZV9iYWNrKQorCWFkZF90b19pbnB1dF9idWYoYmFja2tleSwgKGludClzaXplb2YoYmFja2tleSkpOworfQorCitzdGF0aWMgaW50IHhpbV9leHBlY3RlZF9jaGFyID0gTlVMOworc3RhdGljIGludCB4aW1faWdub3JlZF9jaGFyID0gRkFMU0U7CisKKy8qCisgKiBVcGRhdGUgdGhlIG1vZGUgYW5kIGN1cnNvciB3aGlsZSBpbiBhbiBJTSBjYWxsYmFjay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbV9zaG93X2luZm8odm9pZCkKK3sKKyAgICBpbnQJICAgIG9sZF92Z2V0Y19idXN5OworICAgIG9sZF92Z2V0Y19idXN5ID0gdmdldGNfYnVzeTsKKyAgICB2Z2V0Y19idXN5ID0gVFJVRTsKKyAgICBzaG93bW9kZSgpOworICAgIHZnZXRjX2J1c3kgPSBvbGRfdmdldGNfYnVzeTsKKyAgICBzZXRjdXJzb3IoKTsKKyAgICBvdXRfZmx1c2goKTsKK30KKworLyoKKyAqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBmaW5pc2hlZCBwcmVlZGl0aW5nLgorICogUHV0IHRoZSBmaW5hbCBzdHJpbmcgaW50byB0aGUgaW5wdXQgYnVmZmVyLgorICovCisvKkFSR1NVU0VEMCovCisgICAgc3RhdGljIHZvaWQKK2ltX2NvbW1pdF9jYihHdGtJTUNvbnRleHQgKmNvbnRleHQsIGNvbnN0IGdjaGFyICpzdHIsIGdwb2ludGVyIGRhdGEpCit7CisgICAgaW50CXNsZW4gPSAoaW50KVNUUkxFTihzdHIpOworICAgIGludAlhZGRfdG9faW5wdXQgPSBUUlVFOworICAgIGludAljbGVuOworICAgIGludAlsZW4gPSBzbGVuOworICAgIGludAljb21taXRfd2l0aF9wcmVlZGl0ID0gVFJVRTsKKyAgICBjaGFyX3UJKmltX3N0ciwgKnA7CisKKyNpZmRlZiBYSU1fREVCVUcKKyAgICB4aW1fbG9nKCJpbV9jb21taXRfY2IoKTogJXNcbiIsIHN0cik7CisjZW5kaWYKKworICAgIC8qIFRoZSBpbWhhbmd1bCBtb2R1bGUgZG9lc24ndCByZXNldCB0aGUgcHJlZWRpdCBzdHJpbmcgYmVmb3JlCisgICAgICogY29tbWl0dGluZy4gIENhbGwgaW1fZGVsZXRlX3ByZWVkaXQoKSB0byB3b3JrIGFyb3VuZCB0aGF0LiAqLworICAgIGltX2RlbGV0ZV9wcmVlZGl0KCk7CisKKyAgICAvKiBJbmRpY2F0ZSB0aGF0IHByZWVkaXRpbmcgaGFzIGZpbmlzaGVkLiAqLworICAgIGlmIChwcmVlZGl0X3N0YXJ0X2NvbCA9PSBNQVhDT0wpCisgICAgeworCWluaXRfcHJlZWRpdF9zdGFydF9jb2woKTsKKwljb21taXRfd2l0aF9wcmVlZGl0ID0gRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIHRoaW5nIHdoaWNoIHNldHRpbmcgInByZWVkaXRfc3RhcnRfY29sIiB0byBNQVhDT0wgbWVhbnMgdGhhdAorICAgICAqICJwcmVlZGl0X3N0YXJ0X2NvbCIgd2lsbCBiZSBzZXQgZm9yY2VseSB3aGVuIGNhbGxpbmcKKyAgICAgKiBwcmVlZGl0X2NoYW5nZWRfY2IoKSBuZXh0IHRpbWUuCisgICAgICogInByZWVkaXRfc3RhcnRfY29sIiBzaG91bGQgbm90IHJlc2V0IHdpdGggTUFYQ09MIG9uIHRoaXMgcGFydC4gVmltCisgICAgICogaXMgc2ltdWxhdGluZyB0aGUgcHJlZWRpdGluZyBieSB1c2luZyBhZGRfdG9faW5wdXRfc3RyKCkuIHdoZW4KKyAgICAgKiBwcmVlZGl0IGJlZ2luIGltbWVkaWF0ZWx5IGJlZm9yZSBjb21taXR0ZWQsIHRoZSB0eXBlYnVmIGlzIG5vdAorICAgICAqIGZsdXNoZWQgdG8gc2NyZWVuLCB0aGVuIGl0IGNhbid0IGdldCBjb3JyZWN0ICJwcmVlZGl0X3N0YXJ0X2NvbCIuCisgICAgICogVGh1cywgaXQgc2hvdWxkIGNhbGN1bGF0ZSB0aGUgY2VsbHMgYnkgYWRkaW5nIGNlbGxzIG9mIHRoZSBjb21taXR0ZWQKKyAgICAgKiBzdHJpbmcuICovCisgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisgICAgeworCWltX3N0ciA9IHN0cmluZ19jb252ZXJ0KCZpbnB1dF9jb252LCAoY2hhcl91ICopc3RyLCAmbGVuKTsKKwlnX3JldHVybl9pZl9mYWlsKGltX3N0ciAhPSBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorCWltX3N0ciA9IChjaGFyX3UgKilzdHI7CisgICAgY2xlbiA9IDA7CisgICAgZm9yIChwID0gaW1fc3RyOyBwIDwgaW1fc3RyICsgbGVuOyBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkpCisJY2xlbiArPSAoKm1iX3B0cjJjZWxscykocCk7CisgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJdmltX2ZyZWUoaW1fc3RyKTsKKyAgICBwcmVlZGl0X3N0YXJ0X2NvbCArPSBjbGVuOworCisgICAgLyogSXMgdGhpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCBtYXRjaGVzIGEga2V5cGFkIGtleSB0aGF0J3MganVzdAorICAgICAqIGJlZW4gcHJlc3NlZD8gIElmIHNvLCB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGVudGVyZWQgYXMgc3VjaCAtIGxldAorICAgICAqIHVzIGNhcnJ5IG9uIHByb2Nlc3NpbmcgdGhlIHJhdyBrZXljb2RlIHNvIHRoYXQgaXQgbWF5IGJlIHVzZWQgaW4KKyAgICAgKiBtYXBwaW5ncyBhcyA8a1NvbWV0aGluZz4uICovCisgICAgaWYgKHhpbV9leHBlY3RlZF9jaGFyICE9IE5VTCkKKyAgICB7CisJLyogV2UncmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBrZXlwYWQgb3Igb3RoZXIgc3BlY2lhbCBrZXkgKi8KKwlpZiAoc2xlbiA9PSAxICYmIHN0clswXSA9PSB4aW1fZXhwZWN0ZWRfY2hhcikKKwl7CisJICAgIC8qIEl0J3MgYSBtYXRjaCAtIGRvbid0IGRvIGl0IGhlcmUgKi8KKwkgICAgeGltX2lnbm9yZWRfY2hhciA9IFRSVUU7CisJICAgIGFkZF90b19pbnB1dCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCSAgICAvKiBOb3QgYSBtYXRjaCAqLworCSAgICB4aW1faWdub3JlZF9jaGFyID0gRkFMU0U7CisJfQorICAgIH0KKworICAgIGlmIChhZGRfdG9faW5wdXQpCisJaW1fYWRkX3RvX2lucHV0KChjaGFyX3UgKilzdHIsIHNsZW4pOworCisgICAgLyogSW5zZXJ0aW5nIGNoYXJzIHdoaWxlICJpbV9pc19hY3RpdmUiIGlzIHNldCBkb2VzIG5vdCBjYXVzZSBhIGNoYW5nZSBvZgorICAgICAqIGJ1ZmZlci4gIFdoZW4gdGhlIGNoYXJzIGFyZSBjb21taXR0ZWQgdGhlIGJ1ZmZlciBtdXN0IGJlIG1hcmtlZCBhcworICAgICAqIGNoYW5nZWQuICovCisgICAgaWYgKCFjb21taXRfd2l0aF9wcmVlZGl0KQorCXByZWVkaXRfc3RhcnRfY29sID0gTUFYQ09MOworCisgICAgLyogVGhpcyBmbGFnIGlzIHVzZWQgaW4gY2hhbmdlZCgpIGF0IG5leHQgY2FsbC4gKi8KKyAgICB4aW1fY2hhbmdlZF93aGlsZV9wcmVlZGl0aW5nID0gVFJVRTsKKworICAgIGlmIChndGtfbWFpbl9sZXZlbCgpID4gMCkKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIHN0YXJ0IHRvIHRoZSBwcmVlZGl0LgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAoraW1fcHJlZWRpdF9zdGFydF9jYihHdGtJTUNvbnRleHQgKmNvbnRleHQsIGdwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygiaW1fcHJlZWRpdF9zdGFydF9jYigpXG4iKTsKKyNlbmRpZgorCisgICAgaW1faXNfYWN0aXZlID0gVFJVRTsKKyAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGVuZCB0byB0aGUgcHJlZWRpdC4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK2ltX3ByZWVkaXRfZW5kX2NiKEd0a0lNQ29udGV4dCAqY29udGV4dCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBYSU1fREVCVUcKKyAgICB4aW1fbG9nKCJpbV9wcmVlZGl0X2VuZF9jYigpXG4iKTsKKyNlbmRpZgorICAgIGltX2RlbGV0ZV9wcmVlZGl0KCk7CisKKyAgICAvKiBJbmRpY2F0ZSB0aGF0IHByZWVkaXRpbmcgaGFzIGZpbmlzaGVkICovCisgICAgcHJlZWRpdF9zdGFydF9jb2wgPSBNQVhDT0w7CisgICAgeGltX2hhc19wcmVlZGl0aW5nID0gRkFMU0U7CisKKyAgICBpbV9pc19hY3RpdmUgPSBGQUxTRTsKKyAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CisgICAgaW1fc2hvd19pbmZvKCk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGNoYW5nZXMgdG8gdGhlIHByZWVkaXQgc3RyaW5nLiAgSWYgdGhlIHByZWVkaXQKKyAqIHN0cmluZyB3YXMgZW1wdHkgYmVmb3JlLCByZW1lbWJlciB0aGUgcHJlZWRpdCBzdGFydCBjb2x1bW4gc28gd2Uga25vdworICogd2hlcmUgdG8gYXBwbHkgZmVlZGJhY2sgYXR0cmlidXRlcy4gIERlbGV0ZSB0aGUgcHJldmlvdXMgcHJlZWRpdCBzdHJpbmcKKyAqIGlmIHRoZXJlIHdhcyBvbmUsIHNhdmUgdGhlIG5ldyBwcmVlZGl0IGN1cnNvciBvZmZzZXQsIGFuZCBwdXQgdGhlIG5ldworICogc3RyaW5nIGludG8gdGhlIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBUT0RPOiBUaGUgcHJhZ21hdGljICJwdXQgaW50byBpbnB1dCBidWZmZXIiIGFwcHJvYWNoIHVzZWQgaGVyZSBoYXMKKyAqICAgICAgIHNldmVyYWwgZnVuZGFtZW50YWwgcHJvYmxlbXM6CisgKgorICogLSBUaGUgY2hhcmFjdGVycyBpbiB0aGUgcHJlZWRpdCBzdHJpbmcgYXJlIHN1YmplY3QgdG8gcmVtYXBwaW5nLgorICogICBUaGF0J3MgYnJva2VuLCBvbmx5IHRoZSBmaW5hbGx5IGNvbW1pdHRlZCBzdHJpbmcgc2hvdWxkIGJlIHJlbWFwcGVkLgorICoKKyAqIC0gVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBpbnZvbHZlZDogIFRoZSByZXRyaWV2ZWQgdmFsdWUgZm9yIHRoZQorICogICBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB3aWxsIGJlIHdyb25nIGlmIGFueSB1bnByb2Nlc3NlZCBjaGFyYWN0ZXJzCisgKiAgIGFyZSBzdGlsbCBxdWV1ZWQgaW4gdGhlIGlucHV0IGJ1ZmZlci4KKyAqCisgKiAtIER1ZSB0byB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgZmlsZSBidWZmZXIgaW4gbWVtb3J5CisgKiAgIGFuZCBhbnkgdHlwZWQgY2hhcmFjdGVycywgaXQncyBwcmFjdGljYWxseSBpbXBvc3NpYmxlIHRvIGltcGxlbWVudCB0aGUKKyAqICAgInJldHJpZXZlX3N1cnJvdW5kaW5nIiBhbmQgImRlbGV0ZV9zdXJyb3VuZGluZyIgc2lnbmFscyByZWxpYWJseS4gIElNCisgKiAgIG1vZHVsZXMgZm9yIGxhbmd1YWdlcyBzdWNoIGFzIFRoYWkgYXJlIGxpa2VseSB0byByZWx5IG9uIHRoaXMgZmVhdHVyZQorICogICBmb3IgcHJvcGVyIG9wZXJhdGlvbi4KKyAqCisgKiBDb25jbHVzaW9uczogIEkgdGhpbmsgc3VwcG9ydCBmb3IgcHJlZWRpdGluZyBuZWVkcyB0byBiZSBtb3ZlZCB0byB0aGUKKyAqIGNvcmUgcGFydHMgb2YgVmltLiAgSWRlYWxseSwgdW50aWwgaXQgaGFzIGJlZW4gY29tbWl0dGVkLCB0aGUgcHJlZWRpdGluZworICogc3RyaW5nIHNob3VsZCBvbmx5IGJlIGRpc3BsYXllZCBhbmQgbm90IGFmZmVjdCB0aGUgYnVmZmVyIGNvbnRlbnQgYXQgYWxsLgorICogVGhlIHF1ZXN0aW9uIGhvdyB0byBkZWFsIHdpdGggdGhlIHN5bmNocm9uaXphdGlvbiBpc3N1ZSBzdGlsbCByZW1haW5zLgorICogQ2lyY3VtdmVudGluZyB0aGUgaW5wdXQgYnVmZmVyIGlzIHByb2JhYmx5IG5vdCBkZXNpcmFibGUuICBBbnl3YXksIEkgdGhpbmsKKyAqIGltcGxlbWVudGluZyAicmV0cmlldmVfc3Vycm91bmRpbmciIGlzIHRoZSBvbmx5IGhhcmQgcHJvYmxlbS4KKyAqCisgKiBPbmUgd2F5IHRvIHNvbHZlIGFsbCBvZiB0aGlzIGluIGEgY2xlYW4gbWFubmVyIHdvdWxkIGJlIHRvIHF1ZXVlIGFsbCBrZXkKKyAqIHByZXNzL3JlbGVhc2UgZXZlbnRzICJhcyBpcyIgaW4gdGhlIGlucHV0IGJ1ZmZlciwgYW5kIGFwcGx5IHRoZSBJTSBmaWx0ZXJpbmcKKyAqIGF0IHRoZSByZWNlaXZpbmcgZW5kIG9mIHRoZSBxdWV1ZS4gIFRoaXMsIGhvd2V2ZXIsIHdvdWxkIGhhdmUgYSByYXRoZXIgbGFyZ2UKKyAqIGltcGFjdCBvbiB0aGUgY29kZSBiYXNlLiAgSWYgdGhlcmUgaXMgYW4gZWFzeSB3YXkgdG8gZm9yY2UgcHJvY2Vzc2luZyBvZiBhbGwKKyAqIHJlbWFpbmluZyBpbnB1dCBmcm9tIHdpdGhpbiB0aGUgInJldHJpZXZlX3N1cnJvdW5kaW5nIiBzaWduYWwgaGFuZGxlciwgdGhpcworICogbWlnaHQgbm90IGJlIG5lY2Vzc2FyeS4gIEdvdHRhIGFzayBvbiB2aW0tZGV2IGZvciBvcGluaW9ucy4KKyAqLworLypBUkdTVVNFRDEqLworICAgIHN0YXRpYyB2b2lkCitpbV9wcmVlZGl0X2NoYW5nZWRfY2IoR3RrSU1Db250ZXh0ICpjb250ZXh0LCBncG9pbnRlciBkYXRhKQoreworICAgIGNoYXIgICAgKnByZWVkaXRfc3RyaW5nID0gTlVMTDsKKyAgICBpbnQJICAgIGN1cnNvcl9pbmRleCAgICA9IDA7CisgICAgaW50CSAgICBudW1fbW92ZV9iYWNrICAgPSAwOworICAgIGNoYXJfdSAgKnN0cjsKKyAgICBjaGFyX3UgICpwOworICAgIGludAkgICAgaTsKKworICAgIGd0a19pbV9jb250ZXh0X2dldF9wcmVlZGl0X3N0cmluZyhjb250ZXh0LAorCQkJCSAgICAgICZwcmVlZGl0X3N0cmluZywgTlVMTCwKKwkJCQkgICAgICAmY3Vyc29yX2luZGV4KTsKKworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coImltX3ByZWVkaXRfY2hhbmdlZF9jYigpOiAlc1xuIiwgcHJlZWRpdF9zdHJpbmcpOworI2VuZGlmCisKKyAgICBnX3JldHVybl9pZl9mYWlsKHByZWVkaXRfc3RyaW5nICE9IE5VTEwpOyAvKiBqdXN0IGluIGNhc2UgKi8KKworICAgIC8qIElmIHByZWVkaXRfc3RhcnRfY29sIGlzIE1BWENPTCBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAqLworICAgIGlmIChwcmVlZGl0X3N0YXJ0X2NvbCA9PSBNQVhDT0wgJiYgcHJlZWRpdF9zdHJpbmdbMF0gIT0gJ1wwJykKKyAgICB7CisJeGltX2hhc19wcmVlZGl0aW5nID0gVFJVRTsKKworCS8qIFVyZ2gsIHRoaXMgYnJlYWtzIGlmIHRoZSBpbnB1dCBidWZmZXIgaXNuJ3QgZW1wdHkgbm93ICovCisJaW5pdF9wcmVlZGl0X3N0YXJ0X2NvbCgpOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJzb3JfaW5kZXggPT0gMCAmJiBwcmVlZGl0X3N0cmluZ1swXSA9PSAnXDAnKQorICAgIHsKKwlpZiAocHJlZWRpdF9zdGFydF9jb2wgPT0gTUFYQ09MKQorCSAgICB4aW1faGFzX3ByZWVkaXRpbmcgPSBGQUxTRTsKKworCS8qIElmIGF0IHRoZSBzdGFydCBwb3NpdGlvbiAoYWZ0ZXIgdHlwaW5nIGJhY2tzcGFjZSkKKwkgKiBwcmVlZGl0X3N0YXJ0X2NvbCBtdXN0IGJlIHJlc2V0LiAqLworCXByZWVkaXRfc3RhcnRfY29sID0gTUFYQ09MOworICAgIH0KKworICAgIGltX2RlbGV0ZV9wcmVlZGl0KCk7CisKKyAgICAvKgorICAgICAqIENvbXB1dGUgdGhlIGVuZCBvZiB0aGUgcHJlZWRpdGluZyBhcmVhOiAicHJlZWRpdF9lbmRfY29sIi4KKyAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZ3RrX2ltX2NvbnRleHRfZ2V0X3ByZWVkaXRfc3RyaW5nKCksCisgICAgICogdGhlIGN1cnNvcl9wb3Mgb3V0cHV0IGFyZ3VtZW50IHJldHVybnMgdGhlIG9mZnNldCBpbiBieXRlcy4gIFRoaXMgaXMKKyAgICAgKiB1bmZvcnR1bmF0ZWx5IG5vdCB0cnVlIC0tIHJlYWwgbGlmZSBzaG93cyB0aGUgb2Zmc2V0IGlzIGluIGNoYXJhY3RlcnMsCisgICAgICogYW5kIHRoZSBHVEsrIHNvdXJjZSBjb2RlIGFncmVlcyB3aXRoIG1lLiAgV2lsbCBmaWxlIGEgYnVnIGxhdGVyLgorICAgICAqLworICAgIGlmIChwcmVlZGl0X3N0YXJ0X2NvbCAhPSBNQVhDT0wpCisJcHJlZWRpdF9lbmRfY29sID0gcHJlZWRpdF9zdGFydF9jb2w7CisgICAgc3RyID0gKGNoYXJfdSAqKXByZWVkaXRfc3RyaW5nOworICAgIGZvciAocCA9IHN0ciwgaSA9IDA7ICpwICE9IE5VTDsgcCArPSB1dGZfYnl0ZTJsZW4oKnApLCArK2kpCisgICAgeworCWludCBpc19jb21wb3Npbmc7CisKKwlpc19jb21wb3NpbmcgPSAoKCpwICYgMHg4MCkgIT0gMCAmJiB1dGZfaXNjb21wb3NpbmcodXRmX3B0cjJjaGFyKHApKSk7CisJLyoKKwkgKiBUaGVzZSBvZmZzZXRzIGFyZSB1c2VkIGFzIGNvdW50ZXJzIHdoZW4gZ2VuZXJhdGluZyA8QlM+IGFuZCA8RGVsPgorCSAqIHRvIGRlbGV0ZSB0aGUgcHJlZWRpdCBzdHJpbmcuICBTbyBkb24ndCBjb3VudCBjb21wb3NpbmcgY2hhcmFjdGVycworCSAqIHVubGVzcyAnZGVsY29tYmluZScgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoIWlzX2NvbXBvc2luZyB8fCBwX2RlY28pCisJeworCSAgICBpZiAoaSA8IGN1cnNvcl9pbmRleCkKKwkJKytpbV9wcmVlZGl0X2N1cnNvcjsKKwkgICAgZWxzZQorCQkrK2ltX3ByZWVkaXRfdHJhaWxpbmc7CisJfQorCWlmICghaXNfY29tcG9zaW5nICYmIGkgPj0gY3Vyc29yX2luZGV4KQorCXsKKwkgICAgLyogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBpbV9wcmVlZGl0X3RyYWlsaW5nLCBleGNlcHQKKwkgICAgICogY29tcG9zaW5nIGNoYXJhY3RlcnMgYXJlIG5vdCBjb3VudGVkIGV2ZW4gaWYgcF9kZWNvIGlzIHNldC4gKi8KKwkgICAgKytudW1fbW92ZV9iYWNrOworCX0KKwlpZiAocHJlZWRpdF9zdGFydF9jb2wgIT0gTUFYQ09MKQorCSAgICBwcmVlZGl0X2VuZF9jb2wgKz0gdXRmX3B0cjJjZWxscyhwKTsKKyAgICB9CisKKyAgICBpZiAocCA+IHN0cikKKyAgICB7CisJaW1fYWRkX3RvX2lucHV0KHN0ciwgKGludCkocCAtIHN0cikpOworCWltX2NvcnJlY3RfY3Vyc29yKG51bV9tb3ZlX2JhY2spOworICAgIH0KKworICAgIGdfZnJlZShwcmVlZGl0X3N0cmluZyk7CisKKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOworfQorCisvKgorICogVHJhbnNsYXRlIHRoZSBQYW5nbyBhdHRyaWJ1dGVzIGF0IGl0ZXIgdG8gVmltIGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzLgorICogSWdub3JlIGF0dHJpYnV0ZXMgbm90IHN1cHBvcnRlZCBieSBWaW0gaGlnaGxpZ2h0aW5nLiAgVGhpcyBzaG91bGRuJ3QgaGF2ZQorICogdG9vIG11Y2ggaW1wYWN0IC0tIHJpZ2h0IG5vdyB3ZSBoYW5kbGUgZXZlbiBtb3JlIGF0dHJpYnV0ZXMgdGhhbiBuZWNlc3NhcnkKKyAqIGZvciB0aGUgSU0gbW9kdWxlcyBJIHRlc3RlZCB3aXRoLgorICovCisgICAgc3RhdGljIGludAordHJhbnNsYXRlX3BhbmdvX2F0dHJpYnV0ZXMoUGFuZ29BdHRySXRlcmF0b3IgKml0ZXIpCit7CisgICAgUGFuZ29BdHRyaWJ1dGUgICphdHRyOworICAgIGludAkJICAgIGNoYXJfYXR0ciA9IEhMX05PUk1BTDsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX2l0ZXJhdG9yX2dldChpdGVyLCBQQU5HT19BVFRSX1VOREVSTElORSk7CisgICAgaWYgKGF0dHIgIT0gTlVMTCAmJiAoKFBhbmdvQXR0ckludCAqKWF0dHIpLT52YWx1ZQorCQkJCQkJICE9IChpbnQpUEFOR09fVU5ERVJMSU5FX05PTkUpCisJY2hhcl9hdHRyIHw9IEhMX1VOREVSTElORTsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX2l0ZXJhdG9yX2dldChpdGVyLCBQQU5HT19BVFRSX1dFSUdIVCk7CisgICAgaWYgKGF0dHIgIT0gTlVMTCAmJiAoKFBhbmdvQXR0ckludCAqKWF0dHIpLT52YWx1ZSA+PSAoaW50KVBBTkdPX1dFSUdIVF9CT0xEKQorCWNoYXJfYXR0ciB8PSBITF9CT0xEOworCisgICAgYXR0ciA9IHBhbmdvX2F0dHJfaXRlcmF0b3JfZ2V0KGl0ZXIsIFBBTkdPX0FUVFJfU1RZTEUpOworICAgIGlmIChhdHRyICE9IE5VTEwgJiYgKChQYW5nb0F0dHJJbnQgKilhdHRyKS0+dmFsdWUKKwkJCQkJCSAgICE9IChpbnQpUEFOR09fU1RZTEVfTk9STUFMKQorCWNoYXJfYXR0ciB8PSBITF9JVEFMSUM7CisKKyAgICBhdHRyID0gcGFuZ29fYXR0cl9pdGVyYXRvcl9nZXQoaXRlciwgUEFOR09fQVRUUl9CQUNLR1JPVU5EKTsKKyAgICBpZiAoYXR0ciAhPSBOVUxMKQorICAgIHsKKwljb25zdCBQYW5nb0NvbG9yICpjb2xvciA9ICYoKFBhbmdvQXR0ckNvbG9yICopYXR0ciktPmNvbG9yOworCisJLyogQXNzdW1lIGludmVyc2UgaWYgYmxhY2sgYmFja2dyb3VuZCBpcyByZXF1ZXN0ZWQgKi8KKwlpZiAoKGNvbG9yLT5yZWQgfCBjb2xvci0+Z3JlZW4gfCBjb2xvci0+Ymx1ZSkgPT0gMCkKKwkgICAgY2hhcl9hdHRyIHw9IEhMX0lOVkVSU0U7CisgICAgfQorCisgICAgcmV0dXJuIGNoYXJfYXR0cjsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBhdCBjb2x1bW4gY29sIGluIHRoZSBwcmVlZGl0IHN0cmluZy4KKyAqIFJldHVybiAtMSBpZiBub3QgaW4gcHJlZWRpdGluZyBtb2RlIG9yIGlmIGNvbCBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KKyAgICBpbnQKK2ltX2dldF9mZWVkYmFja19hdHRyKGludCBjb2wpCit7CisgICAgY2hhcgkgICAgKnByZWVkaXRfc3RyaW5nID0gTlVMTDsKKyAgICBQYW5nb0F0dHJMaXN0ICAgKmF0dHJfbGlzdAkgICAgPSBOVUxMOworICAgIGludAkJICAgIGNoYXJfYXR0cgkgICAgPSAtMTsKKworICAgIGlmICh4aWMgPT0gTlVMTCkKKwlyZXR1cm4gY2hhcl9hdHRyOworCisgICAgZ3RrX2ltX2NvbnRleHRfZ2V0X3ByZWVkaXRfc3RyaW5nKHhpYywgJnByZWVkaXRfc3RyaW5nLCAmYXR0cl9saXN0LCBOVUxMKTsKKworICAgIGlmIChwcmVlZGl0X3N0cmluZyAhPSBOVUxMICYmIGF0dHJfbGlzdCAhPSBOVUxMKQorICAgIHsKKwlpbnQgaW5kZXg7CisKKwkvKiBHZXQgdGhlIGJ5dGUgaW5kZXggYXMgdXNlZCBieSBQYW5nb0F0dHJJdGVyYXRvciAqLworCWZvciAoaW5kZXggPSAwOyBjb2wgPiAwICYmIHByZWVkaXRfc3RyaW5nW2luZGV4XSAhPSAnXDAnOyAtLWNvbCkKKwkgICAgaW5kZXggKz0gdXRmY19wdHIybGVuX2NoZWNrKChjaGFyX3UgKilwcmVlZGl0X3N0cmluZyArIGluZGV4KTsKKworCWlmIChwcmVlZGl0X3N0cmluZ1tpbmRleF0gIT0gJ1wwJykKKwl7CisJICAgIFBhbmdvQXR0ckl0ZXJhdG9yCSppdGVyOworCSAgICBpbnQJCQlzdGFydCwgZW5kOworCisJICAgIGNoYXJfYXR0ciA9IEhMX05PUk1BTDsKKwkgICAgaXRlciA9IHBhbmdvX2F0dHJfbGlzdF9nZXRfaXRlcmF0b3IoYXR0cl9saXN0KTsKKworCSAgICAvKiBFeHRyYWN0IGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIGZyb20gdGhlIGxpc3QuICovCisJICAgIGRvCisJICAgIHsKKwkJcGFuZ29fYXR0cl9pdGVyYXRvcl9yYW5nZShpdGVyLCAmc3RhcnQsICZlbmQpOworCisJCWlmIChpbmRleCA+PSBzdGFydCAmJiBpbmRleCA8IGVuZCkKKwkJICAgIGNoYXJfYXR0ciB8PSB0cmFuc2xhdGVfcGFuZ29fYXR0cmlidXRlcyhpdGVyKTsKKwkgICAgfQorCSAgICB3aGlsZSAocGFuZ29fYXR0cl9pdGVyYXRvcl9uZXh0KGl0ZXIpKTsKKworCSAgICBwYW5nb19hdHRyX2l0ZXJhdG9yX2Rlc3Ryb3koaXRlcik7CisJfQorICAgIH0KKworICAgIGlmIChhdHRyX2xpc3QgIT0gTlVMTCkKKwlwYW5nb19hdHRyX2xpc3RfdW5yZWYoYXR0cl9saXN0KTsKKyAgICBnX2ZyZWUocHJlZWRpdF9zdHJpbmcpOworCisgICAgcmV0dXJuIGNoYXJfYXR0cjsKK30KKworICAgIHZvaWQKK3hpbV9pbml0KHZvaWQpCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygieGltX2luaXQoKVxuIik7CisjZW5kaWYKKworICAgIGdfcmV0dXJuX2lmX2ZhaWwoZ3VpLmRyYXdhcmVhICE9IE5VTEwpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoZ3VpLmRyYXdhcmVhLT53aW5kb3cgIT0gTlVMTCk7CisKKyAgICB4aWMgPSBndGtfaW1fbXVsdGljb250ZXh0X25ldygpOworICAgIGdfb2JqZWN0X3JlZih4aWMpOworCisgICAgaW1fY29tbWl0X2hhbmRsZXJfaWQgPSBnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKHhpYyksICJjb21taXQiLAorCQkJCQkgICAgR19DQUxMQkFDSygmaW1fY29tbWl0X2NiKSwgTlVMTCk7CisgICAgZ19zaWduYWxfY29ubmVjdChHX09CSkVDVCh4aWMpLCAicHJlZWRpdF9jaGFuZ2VkIiwKKwkJICAgICBHX0NBTExCQUNLKCZpbV9wcmVlZGl0X2NoYW5nZWRfY2IpLCBOVUxMKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKHhpYyksICJwcmVlZGl0X3N0YXJ0IiwKKwkJICAgICBHX0NBTExCQUNLKCZpbV9wcmVlZGl0X3N0YXJ0X2NiKSwgTlVMTCk7CisgICAgZ19zaWduYWxfY29ubmVjdChHX09CSkVDVCh4aWMpLCAicHJlZWRpdF9lbmQiLAorCQkgICAgIEdfQ0FMTEJBQ0soJmltX3ByZWVkaXRfZW5kX2NiKSwgTlVMTCk7CisKKyAgICBndGtfaW1fY29udGV4dF9zZXRfY2xpZW50X3dpbmRvdyh4aWMsIGd1aS5kcmF3YXJlYS0+d2luZG93KTsKK30KKworICAgIHZvaWQKK2ltX3NodXRkb3duKHZvaWQpCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygiaW1fc2h1dGRvd24oKVxuIik7CisjZW5kaWYKKworICAgIGlmICh4aWMgIT0gTlVMTCkKKyAgICB7CisJZ3RrX2ltX2NvbnRleHRfZm9jdXNfb3V0KHhpYyk7CisJZ19vYmplY3RfdW5yZWYoeGljKTsKKwl4aWMgPSBOVUxMOworICAgIH0KKyAgICBpbV9pc19hY3RpdmUgPSBGQUxTRTsKKyAgICBpbV9jb21taXRfaGFuZGxlcl9pZCA9IDA7CisgICAgcHJlZWRpdF9zdGFydF9jb2wgPSBNQVhDT0w7CisgICAgeGltX2hhc19wcmVlZGl0aW5nID0gRkFMU0U7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBzdHJpbmcgYXJndW1lbnQgdG8ga2V5dmFsIGFuZCBzdGF0ZSBmb3IgR2RrRXZlbnRLZXkuCisgKiBJZiBzdHIgaXMgdmFsaWQgcmV0dXJuIFRSVUUsIG90aGVyd2lzZSBGQUxTRS4KKyAqCisgKiBTZWUgJ2ltYWN0aXZhdGVrZXknIGZvciBkb2N1bWVudGF0aW9uIG9mIHRoZSBmb3JtYXQuCisgKi8KKyAgICBzdGF0aWMgaW50CitpbV9zdHJpbmdfdG9fa2V5dmFsKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgaW50ICprZXl2YWwsIHVuc2lnbmVkIGludCAqc3RhdGUpCit7CisgICAgY29uc3QgY2hhcgkgICAgKm1vZHNfZW5kOworICAgIHVuc2lnbmVkCSAgICB0bXBfa2V5dmFsOworICAgIHVuc2lnbmVkCSAgICB0bXBfc3RhdGUgPSAwOworCisgICAgbW9kc19lbmQgPSBzdHJyY2hyKHN0ciwgJy0nKTsKKyAgICBtb2RzX2VuZCA9IChtb2RzX2VuZCAhPSBOVUxMKSA/IG1vZHNfZW5kICsgMSA6IHN0cjsKKworICAgIC8qIFBhcnNlIG1vZGlmaWVyIGtleXMgKi8KKyAgICB3aGlsZSAoc3RyIDwgbW9kc19lbmQpCisJc3dpdGNoICgqc3RyKyspCisJeworCSAgICBjYXNlICctJzoJCQkJCQkJYnJlYWs7CisJICAgIGNhc2UgJ1MnOiBjYXNlICdzJzogdG1wX3N0YXRlIHw9ICh1bnNpZ25lZClHREtfU0hJRlRfTUFTSzsJYnJlYWs7CisJICAgIGNhc2UgJ0wnOiBjYXNlICdsJzogdG1wX3N0YXRlIHw9ICh1bnNpZ25lZClHREtfTE9DS19NQVNLOwlicmVhazsKKwkgICAgY2FzZSAnQyc6IGNhc2UgJ2MnOiB0bXBfc3RhdGUgfD0gKHVuc2lnbmVkKUdES19DT05UUk9MX01BU0s7YnJlYWs7CisJICAgIGNhc2UgJzEnOgkJdG1wX3N0YXRlIHw9ICh1bnNpZ25lZClHREtfTU9EMV9NQVNLOwlicmVhazsKKwkgICAgY2FzZSAnMic6CQl0bXBfc3RhdGUgfD0gKHVuc2lnbmVkKUdES19NT0QyX01BU0s7CWJyZWFrOworCSAgICBjYXNlICczJzoJCXRtcF9zdGF0ZSB8PSAodW5zaWduZWQpR0RLX01PRDNfTUFTSzsJYnJlYWs7CisJICAgIGNhc2UgJzQnOgkJdG1wX3N0YXRlIHw9ICh1bnNpZ25lZClHREtfTU9ENF9NQVNLOwlicmVhazsKKwkgICAgY2FzZSAnNSc6CQl0bXBfc3RhdGUgfD0gKHVuc2lnbmVkKUdES19NT0Q1X01BU0s7CWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gRkFMU0U7CisJfQorCisgICAgdG1wX2tleXZhbCA9IGdka19rZXl2YWxfZnJvbV9uYW1lKHN0cik7CisKKyAgICBpZiAodG1wX2tleXZhbCA9PSAwIHx8IHRtcF9rZXl2YWwgPT0gR0RLX1ZvaWRTeW1ib2wpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGtleXZhbCAhPSBOVUxMKQorCSprZXl2YWwgPSB0bXBfa2V5dmFsOworICAgIGlmIChzdGF0ZSAhPSBOVUxMKQorCSpzdGF0ZSA9IHRtcF9zdGF0ZTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgcF9pbWFrIGlzIHZhbGlkLCBvdGhlcndpc2UgRkFMU0UuICBBcyBhIHNwZWNpYWwgY2FzZSwgYW4KKyAqIGVtcHR5IHN0cmluZyBpcyBhbHNvIHJlZ2FyZGVkIGFzIHZhbGlkLgorICoKKyAqIE5vdGU6IFRoZSBudW1lcmljYWwga2V5IHZhbHVlIG9mIHBfaW1hayBpcyBjYWNoZWQgaWYgaXQgd2FzIHZhbGlkOyB0aHVzCisgKiBib2xkbHkgYXNzdW1pbmcgaW1feGltX2lzdmFsaWRfaW1hY3RpdmF0ZSgpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aGVuZXZlcgorICogJ2ltYWsnIGNoYW5nZXMuICBUaGlzIGlzIGN1cnJlbnRseSB0aGUgY2FzZSBidXQgbm90IG9idmlvdXMgLS0gc2hvdWxkCisgKiBwcm9iYWJseSByZW5hbWUgdGhlIGZ1bmN0aW9uIGZvciBjbGFyaXR5LgorICovCisgICAgaW50CitpbV94aW1faXN2YWxpZF9pbWFjdGl2YXRlKHZvaWQpCit7CisgICAgaWYgKHBfaW1ha1swXSA9PSBOVUwpCisgICAgeworCWltX2FjdGl2YXRla2V5X2tleXZhbCA9IEdES19Wb2lkU3ltYm9sOworCWltX2FjdGl2YXRla2V5X3N0YXRlICA9IDA7CisJcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIGltX3N0cmluZ190b19rZXl2YWwoKGNvbnN0IGNoYXIgKilwX2ltYWssCisJCQkgICAgICAgJmltX2FjdGl2YXRla2V5X2tleXZhbCwKKwkJCSAgICAgICAmaW1fYWN0aXZhdGVrZXlfc3RhdGUpOworfQorCisgICAgc3RhdGljIHZvaWQKK2ltX3N5bnRoZXNpemVfa2V5cHJlc3ModW5zaWduZWQgaW50IGtleXZhbCwgdW5zaWduZWQgaW50IHN0YXRlKQoreworICAgIEdka0V2ZW50S2V5ICpldmVudDsKKworIyAgaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisgICAgZXZlbnQgPSAoR2RrRXZlbnRLZXkgKilnZGtfZXZlbnRfbmV3KEdES19LRVlfUFJFU1MpOworICAgIGdfb2JqZWN0X3JlZihndWkuZHJhd2FyZWEtPndpbmRvdyk7IC8qIHVucmVmZmVkIGJ5IGdka19ldmVudF9mcmVlKCkgKi8KKyMgIGVsc2UKKyAgICBldmVudCA9IChHZGtFdmVudEtleSAqKWdfbWFsbG9jMCgoZ3Vsb25nKXNpemVvZihHZGtFdmVudCkpOworICAgIGV2ZW50LT50eXBlID0gR0RLX0tFWV9QUkVTUzsKKyMgIGVuZGlmCisgICAgZXZlbnQtPndpbmRvdyA9IGd1aS5kcmF3YXJlYS0+d2luZG93OworICAgIGV2ZW50LT5zZW5kX2V2ZW50ID0gVFJVRTsKKyAgICBldmVudC0+dGltZSA9IEdES19DVVJSRU5UX1RJTUU7CisgICAgZXZlbnQtPnN0YXRlICA9IHN0YXRlOworICAgIGV2ZW50LT5rZXl2YWwgPSBrZXl2YWw7CisgICAgZXZlbnQtPmhhcmR3YXJlX2tleWNvZGUgPSAvKiBuZWVkZWQgZm9yIFhJTSAqLworCVhLZXlzeW1Ub0tleWNvZGUoR0RLX1dJTkRPV19YRElTUExBWShldmVudC0+d2luZG93KSwgKEtleVN5bSlrZXl2YWwpOworICAgIGV2ZW50LT5sZW5ndGggPSAwOworICAgIGV2ZW50LT5zdHJpbmcgPSBOVUxMOworCisgICAgZ3RrX2ltX2NvbnRleHRfZmlsdGVyX2tleXByZXNzKHhpYywgZXZlbnQpOworCisgICAgLyogRm9yIGNvbnNpc3RlbmN5LCBhbHNvIHNlbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVsZWFzZSBldmVudC4gKi8KKyAgICBldmVudC0+dHlwZSA9IEdES19LRVlfUkVMRUFTRTsKKyAgICBldmVudC0+c2VuZF9ldmVudCA9IEZBTFNFOworICAgIGd0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzcyh4aWMsIGV2ZW50KTsKKworIyAgaWZkZWYgSEFWRV9HVEtfTVVMVElIRUFECisgICAgZ2RrX2V2ZW50X2ZyZWUoKEdka0V2ZW50ICopZXZlbnQpOworIyAgZWxzZQorICAgIGdfZnJlZShldmVudCk7CisjICBlbmRpZgorfQorCisgICAgdm9pZAoreGltX3Jlc2V0KHZvaWQpCit7CisgICAgaWYgKHhpYyAhPSBOVUxMKQorICAgIHsKKwkvKgorCSAqIFRoZSB0aGlyZC1wYXJ0eSBpbWhhbmd1bCBtb2R1bGUgKGFuZCBtYXliZSBvdGhlcnMgdG9vKSBpZ25vcmVzCisJICogZ3RrX2ltX2NvbnRleHRfcmVzZXQoKSBvciBhdCBsZWFzdCBkb2Vzbid0IHJlc2V0IHRoZSBhY3RpdmUgc3RhdGUuCisJICogVGh1cyBzZW5kaW5nIGltYWN0aXZhdGVrZXkgd291bGQgdHVybiBpdCBvZmYgaWYgaXQgd2FzIG9uIGJlZm9yZSwKKwkgKiB3aGljaCBpcyBjbGVhcmx5IG5vdCB3aGF0IHdlIHdhbnQuICBGb3J0dW5hdGVseSB3ZSBjYW4gd29yayBhcm91bmQKKwkgKiB0aGF0IGZvciBpbWhhbmd1bCBieSBzZW5kaW5nIEdES19Fc2NhcGUsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQKKwkgKiB3b3JrcyB3aXRoIGFsbCBJTSBtb2R1bGVzIHRoYXQgc3VwcG9ydCBhbiBhY3RpdmF0aW9uIGtleSA6LworCSAqCisJICogQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gZGVzdHJveSB0aGUgSU0gY29udGV4dCBhbmQKKwkgKiByZWNyZWF0ZSBpdC4gIEJ1dCB0aGF0IG1lYW5zIGxvYWRpbmcvdW5sb2FkaW5nIHRoZSBJTSBtb2R1bGUgb24KKwkgKiBldmVyeSBtb2RlIHN3aXRjaCwgd2hpY2ggY2F1c2VzIGEgcXVpdGUgbm90aWNhYmxlIGRlbGF5IGV2ZW4gb24KKwkgKiBteSByYXRoZXIgZmFzdCBib3guLi4KKwkgKiAqCisJICogTW9yZW92ZXIsIHRoZXJlIGFyZSBzb21lIFhJTSB3aGljaCBjYW5ub3QgcmVzcG9uZCB0bworCSAqIGltX3N5bnRoZXNpemVfa2V5cHJlc3MoKS4gd2UgaG9wZSB0aGF0IHRoZXkgcmVzZXQgYnkKKwkgKiB4aW1fc2h1dGRvd24oKS4KKwkgKi8KKwlpZiAoaW1fYWN0aXZhdGVrZXlfa2V5dmFsICE9IEdES19Wb2lkU3ltYm9sICYmIGltX2lzX2FjdGl2ZSkKKwkgICAgaW1fc3ludGhlc2l6ZV9rZXlwcmVzcyhHREtfRXNjYXBlLCAwVSk7CisKKwlndGtfaW1fY29udGV4dF9yZXNldCh4aWMpOworCisJLyoKKwkgKiBIQUNLIGZvciBBbWk6IFRoaXMgc2VxdWVuY2Ugb2YgZnVuY3Rpb24gY2FsbHMgbWFrZXMgQW1pIGhhbmRsZQorCSAqIHRoZSBJTSByZXNldCBncmF0aW91c2x5LCB3aXRob3V0IGJyZWFraW5nIGxvYWRzIG9mIG90aGVyIHN0dWZmLgorCSAqIEl0IHNlZW1zIHRvIGZvcmNlIEVuZ2xpc2ggbW9kZSBhcyB3ZWxsLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2UKKwkgKiB3YW50IGJlY2F1c2UgaXQgbWFrZXMgdGhlIEFtaSBzdGF0dXMgZGlzcGxheSB3b3JrIHJlbGlhYmx5LgorCSAqLworCWd0a19pbV9jb250ZXh0X3NldF91c2VfcHJlZWRpdCh4aWMsIEZBTFNFKTsKKworCWlmIChwX2ltZGlzYWJsZSkKKwkgICAgaW1fc2h1dGRvd24oKTsKKwllbHNlCisJeworCSAgICBndGtfaW1fY29udGV4dF9zZXRfdXNlX3ByZWVkaXQoeGljLCBUUlVFKTsKKwkgICAgeGltX3NldF9mb2N1cyhndWkuaW5fZm9jdXMpOworCisJICAgIGlmIChpbV9hY3RpdmF0ZWtleV9rZXl2YWwgIT0gR0RLX1ZvaWRTeW1ib2wpCisJICAgIHsKKwkJaWYgKGltX2lzX2FjdGl2ZSkKKwkJeworCQkgICAgZ19zaWduYWxfaGFuZGxlcl9ibG9jayh4aWMsIGltX2NvbW1pdF9oYW5kbGVyX2lkKTsKKwkJICAgIGltX3N5bnRoZXNpemVfa2V5cHJlc3MoaW1fYWN0aXZhdGVrZXlfa2V5dmFsLAorCQkJCQkJICAgIGltX2FjdGl2YXRla2V5X3N0YXRlKTsKKwkJICAgIGdfc2lnbmFsX2hhbmRsZXJfdW5ibG9jayh4aWMsIGltX2NvbW1pdF9oYW5kbGVyX2lkKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpbV9zaHV0ZG93bigpOworCQl4aW1faW5pdCgpOworCQl4aW1fc2V0X2ZvY3VzKGd1aS5pbl9mb2N1cyk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHJlZWRpdF9zdGFydF9jb2wgPSBNQVhDT0w7CisgICAgeGltX2hhc19wcmVlZGl0aW5nID0gRkFMU0U7Cit9CisKKyAgICBpbnQKK3hpbV9xdWV1ZV9rZXlfcHJlc3NfZXZlbnQoR2RrRXZlbnRLZXkgKmV2ZW50LCBpbnQgZG93bikKK3sKKyAgICBpZiAoZG93bikKKyAgICB7CisJLyoKKwkgKiBXb3JrYXJvdW5kIEdUSzIgWElNICdmZWF0dXJlJyB0aGF0IGFsd2F5cyBjb252ZXJ0cyBrZXlwYWQga2V5cyB0bworCSAqIGNoYXJzLiwgZXZlbiB3aGVuIG5vdCBwYXJ0IG9mIGFuIElNIHNlcXVlbmNlIChyZWYuIGZlYXR1cmUgb2YKKwkgKiBnZGsvZ2Rra2V5dW5pLmMpLgorCSAqIEZsYWcgYW55IGtleXBhZCBrZXlzIHRoYXQgbWlnaHQgcmVwcmVzZW50IGEgc2luZ2xlIGNoYXIuCisJICogSWYgdGhpcyAob24gaXRzIG93biAtIGkuZS4sIG5vdCBwYXJ0IG9mIGFuIElNIHNlcXVlbmNlKSBpcworCSAqIGNvbW1pdHRlZCB3aGlsZSB3ZSdyZSBwcm9jZXNzaW5nIG9uZSBvZiB0aGVzZSBrZXlzLCB3ZSBjYW4gaWdub3JlCisJICogdGhhdCBjb21taXQgYW5kIGdvIGFoZWFkICYgcHJvY2VzcyBpdCBvdXJzZWx2ZXMuICBUaGF0IHdheSB3ZSBjYW4KKwkgKiBzdGlsbCBkaXN0aW5ndWlzaCBrZXlwYWQga2V5cyBmb3IgdXNlIGluIG1hcHBpbmdzLgorCSAqLworCXN3aXRjaCAoZXZlbnQtPmtleXZhbCkKKwl7CisJICAgIGNhc2UgR0RLX0tQX0FkZDogICAgICB4aW1fZXhwZWN0ZWRfY2hhciA9ICcrJzsgIGJyZWFrOworCSAgICBjYXNlIEdES19LUF9TdWJ0cmFjdDogeGltX2V4cGVjdGVkX2NoYXIgPSAnLSc7ICBicmVhazsKKwkgICAgY2FzZSBHREtfS1BfRGl2aWRlOiAgIHhpbV9leHBlY3RlZF9jaGFyID0gJy8nOyAgYnJlYWs7CisJICAgIGNhc2UgR0RLX0tQX011bHRpcGx5OiB4aW1fZXhwZWN0ZWRfY2hhciA9ICcqJzsgIGJyZWFrOworCSAgICBjYXNlIEdES19LUF9EZWNpbWFsOiAgeGltX2V4cGVjdGVkX2NoYXIgPSAnLic7ICBicmVhazsKKwkgICAgY2FzZSBHREtfS1BfRXF1YWw6ICAgIHhpbV9leHBlY3RlZF9jaGFyID0gJz0nOyAgYnJlYWs7CisJICAgIGNhc2UgR0RLX0tQXzA6CSAgeGltX2V4cGVjdGVkX2NoYXIgPSAnMCc7ICBicmVhazsKKwkgICAgY2FzZSBHREtfS1BfMToJICB4aW1fZXhwZWN0ZWRfY2hhciA9ICcxJzsgIGJyZWFrOworCSAgICBjYXNlIEdES19LUF8yOgkgIHhpbV9leHBlY3RlZF9jaGFyID0gJzInOyAgYnJlYWs7CisJICAgIGNhc2UgR0RLX0tQXzM6CSAgeGltX2V4cGVjdGVkX2NoYXIgPSAnMyc7ICBicmVhazsKKwkgICAgY2FzZSBHREtfS1BfNDoJICB4aW1fZXhwZWN0ZWRfY2hhciA9ICc0JzsgIGJyZWFrOworCSAgICBjYXNlIEdES19LUF81OgkgIHhpbV9leHBlY3RlZF9jaGFyID0gJzUnOyAgYnJlYWs7CisJICAgIGNhc2UgR0RLX0tQXzY6CSAgeGltX2V4cGVjdGVkX2NoYXIgPSAnNic7ICBicmVhazsKKwkgICAgY2FzZSBHREtfS1BfNzoJICB4aW1fZXhwZWN0ZWRfY2hhciA9ICc3JzsgIGJyZWFrOworCSAgICBjYXNlIEdES19LUF84OgkgIHhpbV9leHBlY3RlZF9jaGFyID0gJzgnOyAgYnJlYWs7CisJICAgIGNhc2UgR0RLX0tQXzk6CSAgeGltX2V4cGVjdGVkX2NoYXIgPSAnOSc7ICBicmVhazsKKwkgICAgZGVmYXVsdDoJCSAgeGltX2V4cGVjdGVkX2NoYXIgPSBOVUw7CisJfQorCXhpbV9pZ25vcmVkX2NoYXIgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gdHlwaW5nIGZGdFQsIFhJTSBtYXkgYmUgYWN0aXZhdGVkLiBUaHVzIGl0IG11c3QgcGFzcworICAgICAqIGd0a19pbV9jb250ZXh0X2ZpbHRlcl9rZXlwcmVzcygpIGluIE5vcm1hbCBtb2RlLgorICAgICAqIEFuZCB3aGlsZSBkb2luZyA6c2ggdG9vLgorICAgICAqLworICAgIGlmICh4aWMgIT0gTlVMTCAmJiAhcF9pbWRpc2FibGUKKwkJICAgICYmIChTdGF0ZSAmIChJTlNFUlQgfCBDTURMSU5FIHwgTk9STUFMIHwgRVhURVJOQ01EKSkgIT0gMCkKKyAgICB7CisJLyoKKwkgKiBGaWx0ZXIgJ2ltYWN0aXZhdGVrZXknIGFuZCBtYXAgaXQgdG8gQ1RSTC1eLiAgVGhpcyB3YXksIFZpbSBpcworCSAqIGFsd2F5cyBhd2FyZSBvZiB0aGUgY3VycmVudCBzdGF0dXMgb2YgSU0sIGFuZCBjYW4gZXZlbiBlbXVsYXRlCisJICogdGhlIGFjdGl2YXRpb24ga2V5IGZvciBtb2R1bGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBvbmUuCisJICovCisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gaW1fYWN0aXZhdGVrZXlfa2V5dmFsCisJICAgICAmJiAoZXZlbnQtPnN0YXRlICYgaW1fYWN0aXZhdGVrZXlfc3RhdGUpID09IGltX2FjdGl2YXRla2V5X3N0YXRlKQorCXsKKwkgICAgdW5zaWduZWQgaW50IHN0YXRlX21hc2s7CisKKwkgICAgLyogUmVxdWlyZSB0aGUgc3RhdGUgb2YgdGhlIDMgbW9zdCB1c2VkIG1vZGlmaWVycyB0byBtYXRjaCBleGFjdGx5LgorCSAgICAgKiBPdGhlcndpc2UgZS5nLiA8Uy1DLXNwYWNlPiB3b3VsZCBiZSB1bnVzYWJsZSBmb3Igb3RoZXIgcHVycG9zZXMKKwkgICAgICogaWYgdGhlIElNIGFjdGl2YXRlIGtleSBpcyA8Uy1zcGFjZT4uICovCisJICAgIHN0YXRlX21hc2sgID0gaW1fYWN0aXZhdGVrZXlfc3RhdGU7CisJICAgIHN0YXRlX21hc2sgfD0gKChpbnQpR0RLX1NISUZUX01BU0sgfCAoaW50KUdES19DT05UUk9MX01BU0sKKwkJCQkJCQl8IChpbnQpR0RLX01PRDFfTUFTSyk7CisKKwkgICAgaWYgKChldmVudC0+c3RhdGUgJiBzdGF0ZV9tYXNrKSAhPSBpbV9hY3RpdmF0ZWtleV9zdGF0ZSkKKwkJcmV0dXJuIEZBTFNFOworCisJICAgIC8qIERvbid0IHNlbmQgaXQgYSBzZWNvbmQgdGltZSBvbiBHREtfS0VZX1JFTEVBU0UuICovCisJICAgIGlmIChldmVudC0+dHlwZSAhPSBHREtfS0VZX1BSRVNTKQorCQlyZXR1cm4gVFJVRTsKKworCSAgICBpZiAobWFwX3RvX2V4aXN0c19tb2RlKChjaGFyX3UgKikiIiwgTEFOR01BUCkpCisJICAgIHsKKwkJaW1fc2V0X2FjdGl2ZShGQUxTRSk7CisKKwkJLyogIjpsbWFwIiBtYXBwaW5ncyBleGlzdHMsIHRvZ2dsZSB1c2Ugb2YgbWFwcGluZ3MuICovCisJCVN0YXRlIF49IExBTkdNQVA7CisJCWlmIChTdGF0ZSAmIExBTkdNQVApCisJCXsKKwkJICAgIGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0ID0gQl9JTU9ERV9OT05FOworCQkgICAgU3RhdGUgJj0gfkxBTkdNQVA7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjdXJidWYtPmJfcF9pbWluc2VydCA9IEJfSU1PREVfTE1BUDsKKwkJICAgIFN0YXRlIHw9IExBTkdNQVA7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKworCSAgICByZXR1cm4gZ3RrX2ltX2NvbnRleHRfZmlsdGVyX2tleXByZXNzKHhpYywgZXZlbnQpOworCX0KKworCS8qIERvbid0IGZpbHRlciBldmVudHMgdGhyb3VnaCB0aGUgSU0gY29udGV4dCBpZiBJTSBpc24ndCBhY3RpdmUKKwkgKiByaWdodCBub3cuICBVbmxpa2Ugd2l0aCBHVEsrIDEuMiB3ZSBjYW5ub3QgcmVseSBvbiB0aGUgSU0gbW9kdWxlCisJICogbm90IGRvaW5nIGFueXRoaW5nIGJlZm9yZSB0aGUgYWN0aXZhdGlvbiBrZXkgd2FzIHNlbnQuICovCisJaWYgKGltX2FjdGl2YXRla2V5X2tleXZhbCA9PSBHREtfVm9pZFN5bWJvbCB8fCBpbV9pc19hY3RpdmUpCisJeworCSAgICBpbnQgaW1yZXN1bHQgPSBndGtfaW1fY29udGV4dF9maWx0ZXJfa2V5cHJlc3MoeGljLCBldmVudCk7CisKKwkgICAgLyogU29tZSBYSU0gc2VuZCBmb2xsb3dpbmcgc2VxdWVuY2U6CisJICAgICAqIDEuIHByZWVkaXRlZCBzdHJpbmcuCisJICAgICAqIDIuIGNvbW1pdHRlZCBzdHJpbmcuCisJICAgICAqIDMuIGxpbmUgY2hhbmdlZCBrZXkuCisJICAgICAqIDQuIHByZWVkaXRlZCBzdHJpbmcuCisJICAgICAqIDUuIHJlbW92ZSBwcmVlZGl0ZWQgc3RyaW5nLgorCSAgICAgKiBpZiAzLCBWaW0gY2FuJ3QgbW92ZSBiYWNrIHRoZSBhYm92ZSBsaW5lIGZvciA1LgorCSAgICAgKiB0aHVzLCB0aGlzIHBhcnQgc2hvdWxkIG5vdCBwYXJzZSB0aGUga2V5LiAqLworCSAgICBpZiAoIWltcmVzdWx0ICYmIHByZWVkaXRfc3RhcnRfY29sICE9IE1BWENPTAorCQkJCQkgICAgICAgJiYgZXZlbnQtPmtleXZhbCA9PSBHREtfUmV0dXJuKQorCSAgICB7CisJCWltX3N5bnRoZXNpemVfa2V5cHJlc3MoR0RLX1JldHVybiwgMFUpOworCQlyZXR1cm4gRkFMU0U7CisJICAgIH0KKworCSAgICAvKiBJZiBYSU0gdHJpZWQgdG8gY29tbWl0IGEga2V5cGFkIGtleSBhcyBhIHNpbmdsZSBjaGFyLiwKKwkgICAgICogaWdub3JlIGl0IHNvIHdlIGNhbiB1c2UgdGhlIGtleXBhZCBrZXkgJ3JhdycsIGZvciBtYXBwaW5ncy4gKi8KKwkgICAgaWYgKHhpbV9leHBlY3RlZF9jaGFyICE9IE5VTCAmJiB4aW1faWdub3JlZF9jaGFyKQorCQkvKiBXZSBoYWQgYSBrZXlwYWQga2V5LCBhbmQgWElNIHRyaWVkIHRvIHRoaWV2ZSBpdCAqLworCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgLyogTm9ybWFsIHByb2Nlc3NpbmcgKi8KKwkgICAgcmV0dXJuIGltcmVzdWx0OworCX0KKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyAgICBpbnQKK2ltX2dldF9zdGF0dXModm9pZCkKK3sKKyAgICByZXR1cm4gaW1faXNfYWN0aXZlOworfQorCisjIGVsc2UgLyogIUhBVkVfR1RLMiAqLworCitzdGF0aWMgaW50CXhpbV9pc19hY3RpdmUgPSBGQUxTRTsgIC8qIFhJTSBzaG91bGQgYmUgYWN0aXZlIGluIHRoZSBjdXJyZW50CisJCQkJCSAgIG1vZGUgKi8KK3N0YXRpYyBpbnQJeGltX2hhc19mb2N1cyA9IEZBTFNFOwkvKiBYSU0gaXMgcmVhbGx5IGJlaW5nIHVzZWQgZm9yIFZpbSAqLworI2lmZGVmIEZFQVRfR1VJX1gxMQorc3RhdGljIFhJTVN0eWxlCWlucHV0X3N0eWxlOworc3RhdGljIGludAlzdGF0dXNfYXJlYV9lbmFibGVkID0gVFJVRTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfR1RLCisjIGlmZGVmIFdJTjMyNjQKKyMgIGluY2x1ZGUgPGdkay9nZGt3aW4zMi5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxnZGsvZ2RreC5oPgorIyBlbmRpZgorI2Vsc2UKKyMgaWZkZWYgUFJPVE8KKy8qIERlZmluZSBhIGZldyB0aGluZ3MgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBwcm90b3R5cGVzIHdoaWxlIG5vdCBjb25maWd1cmVkCisgKiBmb3IgR1RLLiAqLworIyAgZGVmaW5lIEdTTGlzdCBpbnQKKyMgIGRlZmluZSBnYm9vbGVhbiBpbnQKKyAgIHR5cGVkZWYgaW50IEdka0V2ZW50OworICAgdHlwZWRlZiBpbnQgR2RrRXZlbnRLZXk7CisjICBkZWZpbmUgR2RrSUMgaW50CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludAlwcmVlZGl0X2J1Zl9sZW4gPSAwOworc3RhdGljIGludAl4aW1fY2FuX3ByZWVkaXRpbmcgSU5JVCg9IEZBTFNFKTsJLyogWElNIGluIHNob3dtb2RlKCkgKi8KK3N0YXRpYyBpbnQJeGltX2lucHV0X3N0eWxlOworI2lmbmRlZiBGRUFUX0dVSV9HVEsKKyMgZGVmaW5lIGdib29sZWFuIGludAorI2VuZGlmCitzdGF0aWMgZ2Jvb2xlYW4JdXNlX3N0YXR1c19hcmVhID0gMDsKKworc3RhdGljIGludCBpbV94aW1fc3RyMmtleWNvZGUgX19BUkdTKCh1bnNpZ25lZCBpbnQgKmNvZGUsIHVuc2lnbmVkIGludCAqc3RhdGUpKTsKK3N0YXRpYyB2b2lkIGltX3hpbV9zZW5kX2V2ZW50X2ltYWN0aXZhdGUgX19BUkdTKCh2b2lkKSk7CisKKy8qCisgKiBDb252ZXJ0IHN0cmluZyB0byBrZXljb2RlIGFuZCBzdGF0ZSBmb3IgWEtleUV2ZW50LgorICogV2hlbiBzdHJpbmcgaXMgdmFsaWQgcmV0dXJuIE9LLCB3aGVuIGludmFsaWQgcmV0dXJuIEZBSUwuCisgKgorICogU2VlICdpbWFjdGl2YXRla2V5JyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZm9ybWF0LgorICovCisgICAgc3RhdGljIGludAoraW1feGltX3N0cjJrZXljb2RlKGNvZGUsIHN0YXRlKQorICAgIHVuc2lnbmVkIGludCAqY29kZTsKKyAgICB1bnNpZ25lZCBpbnQgKnN0YXRlOworeworICAgIGludAkJcmV0dmFsID0gT0s7CisgICAgaW50CQlsZW47CisgICAgdW5zaWduZWQJa2V5Y29kZSA9IDAsIGtleXN0YXRlID0gMDsKKyAgICBXaW5kb3cJd2luZG93OworICAgIERpc3BsYXkJKmRpc3BsYXk7CisgICAgY2hhcl91CSpmbGFnX2VuZDsKKyAgICBjaGFyX3UJKnN0cjsKKworICAgIGlmICgqcF9pbWFrICE9IE5VTCkKKyAgICB7CisJbGVuID0gU1RSTEVOKHBfaW1hayk7CisJZm9yIChmbGFnX2VuZCA9IHBfaW1hayArIGxlbiAtIDE7CisJCQkgICAgZmxhZ19lbmQgPiBwX2ltYWsgJiYgKmZsYWdfZW5kICE9ICctJzsgLS1mbGFnX2VuZCkKKwkgICAgOworCisJLyogUGFyc2UgbW9kaWZpZXIga2V5cyAqLworCWZvciAoc3RyID0gcF9pbWFrOyBzdHIgPCBmbGFnX2VuZDsgKytzdHIpCisJeworCSAgICBzd2l0Y2ggKCpzdHIpCisJICAgIHsKKwkJY2FzZSAncyc6IGNhc2UgJ1MnOgorCQkgICAga2V5c3RhdGUgfD0gU2hpZnRNYXNrOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ2wnOiBjYXNlICdMJzoKKwkJICAgIGtleXN0YXRlIHw9IExvY2tNYXNrOworCQkgICAgYnJlYWs7CisJCWNhc2UgJ2MnOiBjYXNlICdDJzoKKwkJICAgIGtleXN0YXRlIHw9IENvbnRyb2xNYXNrOworCQkgICAgYnJlYWs7CisJCWNhc2UgJzEnOgorCQkgICAga2V5c3RhdGUgfD0gTW9kMU1hc2s7CisJCSAgICBicmVhazsKKwkJY2FzZSAnMic6CisJCSAgICBrZXlzdGF0ZSB8PSBNb2QyTWFzazsKKwkJICAgIGJyZWFrOworCQljYXNlICczJzoKKwkJICAgIGtleXN0YXRlIHw9IE1vZDNNYXNrOworCQkgICAgYnJlYWs7CisJCWNhc2UgJzQnOgorCQkgICAga2V5c3RhdGUgfD0gTW9kNE1hc2s7CisJCSAgICBicmVhazsKKwkJY2FzZSAnNSc6CisJCSAgICBrZXlzdGF0ZSB8PSBNb2Q1TWFzazsKKwkJICAgIGJyZWFrOworCQljYXNlICctJzoKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgcmV0dmFsID0gRkFJTDsKKwkgICAgfQorCX0KKwlpZiAoKnN0ciA9PSAnLScpCisJICAgICsrc3RyOworCisJLyogR2V0IGtleWNvZGUgZnJvbSBzdHJpbmcuICovCisJZ3VpX2dldF94MTFfd2luZGlzKCZ3aW5kb3csICZkaXNwbGF5KTsKKwlpZiAoZGlzcGxheSkKKwkgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWFN0cmluZ1RvS2V5c3ltKChjaGFyICopc3RyKSk7CisJaWYgKGtleWNvZGUgPT0gMCkKKwkgICAgcmV0dmFsID0gRkFJTDsKKworCWlmIChjb2RlICE9IE5VTEwpCisJICAgICpjb2RlID0ga2V5Y29kZTsKKwlpZiAoc3RhdGUgIT0gTlVMTCkKKwkgICAgKnN0YXRlID0ga2V5c3RhdGU7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW1feGltX3NlbmRfZXZlbnRfaW1hY3RpdmF0ZSgpCit7CisgICAgLyogRm9yY2UgdHVybiBvbiBwcmVlZGl0IHN0YXRlIGJ5IHN5bXVsYXRlIGtleXByZXNzIGV2ZW50LgorICAgICAqIEtleWNvZGUgYW5kIHN0YXRlIGlzIHNwZWNpZmllZCBieSAnaW1hY3RpdmF0ZWtleScuCisgICAgICovCisgICAgWEtleUV2ZW50IGV2OworCisgICAgZ3VpX2dldF94MTFfd2luZGlzKCZldi53aW5kb3csICZldi5kaXNwbGF5KTsKKyAgICBldi5yb290ID0gUm9vdFdpbmRvdyhldi5kaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGV2LmRpc3BsYXkpKTsKKyAgICBldi5zdWJ3aW5kb3cgPSBOb25lOworICAgIGV2LnRpbWUgPSBDdXJyZW50VGltZTsKKyAgICBldi54ID0gMTsKKyAgICBldi55ID0gMTsKKyAgICBldi54X3Jvb3QgPSAxOworICAgIGV2Lnlfcm9vdCA9IDE7CisgICAgZXYuc2FtZV9zY3JlZW4gPSAxOworICAgIGV2LnR5cGUgPSBLZXlQcmVzczsKKyAgICBpZiAoaW1feGltX3N0cjJrZXljb2RlKCZldi5rZXljb2RlLCAmZXYuc3RhdGUpID09IE9LKQorCVhTZW5kRXZlbnQoZXYuZGlzcGxheSwgZXYud2luZG93LCAxLCBLZXlQcmVzc01hc2ssIChYRXZlbnQqKSZldik7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAnaW1hY3RpdmF0ZWtleScgaGFzIGEgdmFsaWQgdmFsdWUuCisgKi8KKyAgICBpbnQKK2ltX3hpbV9pc3ZhbGlkX2ltYWN0aXZhdGUoKQoreworICAgIHJldHVybiBpbV94aW1fc3RyMmtleWNvZGUoTlVMTCwgTlVMTCkgPT0gT0s7Cit9CisjZW5kaWYgLyogRkVBVF9HVUlfR1RLICovCisKKy8qCisgKiBTd2l0Y2ggdXNpbmcgWElNIG9uL29mZi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgY29kZSB0aGF0IGNoYW5nZXMgIlN0YXRlIi4KKyAqLworICAgIHZvaWQKK2ltX3NldF9hY3RpdmUoYWN0aXZlKQorICAgIGludAkJYWN0aXZlOworeworICAgIGlmICh4aWMgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAvKiBJZiAnaW1kaXNhYmxlJyBpcyBzZXQsIFhJTSBpcyBuZXZlciBhY3RpdmUuICovCisgICAgaWYgKHBfaW1kaXNhYmxlKQorCWFjdGl2ZSA9IEZBTFNFOworI2lmbmRlZiBGRUFUX0dVSV9HVEsKKyAgICBlbHNlIGlmIChpbnB1dF9zdHlsZSAmIFhJTVByZWVkaXRQb3NpdGlvbikKKwkvKiBUaGVyZSBpcyBhIHByb2JsZW0gaW4gc3dpdGNoaW5nIFhJTSBvZmYgd2hlbiBwcmVlZGl0aW5nIGlzIHVzZWQsCisJICogYW5kIGl0IGlzIG5vdCBjbGVhciBob3cgdGhpcyBjYW4gYmUgc29sdmVkLiAgRm9yIG5vdywga2VlcCBYSU0gb24KKwkgKiBhbGwgdGhlIHRpbWUsIGxpa2UgaXQgd2FzIGRvbmUgaW4gVmltIDUuOC4gKi8KKwlhY3RpdmUgPSBUUlVFOworI2VuZGlmCisKKyAgICAvKiBSZW1lbWJlciB0aGUgYWN0aXZlIHN0YXRlLCBpdCBpcyBuZWVkZWQgd2hlbiBWaW0gZ2V0cyBrZXlib2FyZCBmb2N1cy4gKi8KKyAgICB4aW1faXNfYWN0aXZlID0gYWN0aXZlOworCisjaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgLyogV2hlbiAnaW1hY3RpdmF0ZWtleScgaGFzIHZhbGlkIGtleS1zdHJpbmcsIHRyeSB0byBjb250cm9sIFhJTSBwcmVlZGl0CisgICAgICogc3RhdGUuICBXaGVuICdpbWFjdGl2YXRla2V5JyBoYXMgbm8gb3IgaW52YWxpZCBzdHJpbmcsIHRyeSBvbGQgWElNCisgICAgICogZm9jdXMgY29udHJvbC4KKyAgICAgKi8KKyAgICBpZiAoKnBfaW1hayAhPSBOVUwpCisgICAgeworCS8qIEJBU0lDIFNUUkFURUdZOgorCSAqIERlc3Ryb3kgb2xkIElucHV0IENvbnRleHQgKFhJQyksIGFuZCBjcmVhdGUgbmV3IG9uZS4gIE5ldyBYSUMKKwkgKiB3b3VsZCBoYXZlIGEgc3RhdGUgb2YgcHJlZWRpdCB0aGF0IGlzIG9mZi4gIFdoZW4gYXJndW1lbnQ6YWN0aXZlCisJICogaXMgZmFsc2UsIHRoYXQncyBhbGwuICBFbHNlIGFyZ3VtZW50OmFjdGl2ZSBpcyB0cnVlLCBzZW5kIGEga2V5CisJICogZXZlbnQgc3BlY2lmaWVkIGJ5ICdpbWFjdGl2YXRla2V5JyB0byBhY3RpdmF0ZSBYSU0gcHJlZWRpdCBzdGF0ZS4KKwkgKi8KKworCXhpbV9pc19hY3RpdmUgPSBUUlVFOyAvKiBEaXNhYmxlIG9sZCBYSU0gZm9jdXMgY29udHJvbCAqLworCS8qIElmIHdlIGNhbiBtb25pdG9yIHByZWVkaXQgc3RhdGUgd2l0aCBwcmVlZGl0IGNhbGxiYWNrIGZ1bmN0aW9ucywKKwkgKiB0cnkgbGVhc3QgY3JlYXRpb24gb2YgbmV3IFhJQy4KKwkgKi8KKwlpZiAoeGltX2lucHV0X3N0eWxlICYgKGludClHREtfSU1fUFJFRURJVF9DQUxMQkFDS1MpCisJeworCSAgICBpZiAoeGltX2Nhbl9wcmVlZGl0aW5nICYmICFhY3RpdmUpCisJICAgIHsKKwkJLyogRm9yY2UgdHVybiBvZmYgcHJlZWRpdCBzdGF0ZS4gIFdpdGggc29tZSBJTQorCQkgKiBpbXBsZW1lbnRhdGlvbnMsIHdlIGNhbm5vdCB0dXJuIG9mZiBwcmVlZGl0IHN0YXRlIGJ5CisJCSAqIHN5bXVsYXRlIGtleXByZXNzIGV2ZW50LiAgSXQgaXMgd2h5IHVzaW5nIHN1Y2ggYSBtZXRob2QKKwkJICogdGhhdCBkZXN0cm95IG9sZCBJQyAoaW5wdXQgY29udGV4dCksIGFuZCBjcmVhdGUgbmV3IG9uZS4KKwkJICogV2hlbiBjcmVhdGUgbmV3IElDLCBpdHMgcHJlZWRpdCBzdGF0ZSBpcyB1c3VhbGx5IG9mZi4KKwkJICovCisJCXhpbV9yZXNldCgpOworCQl4aW1fc2V0X2ZvY3VzKEZBTFNFKTsKKwkJZ2RrX2ljX2Rlc3Ryb3koeGljKTsKKwkJeGltX2luaXQoKTsKKwkJeGltX2Nhbl9wcmVlZGl0aW5nID0gRkFMU0U7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoIXhpbV9jYW5fcHJlZWRpdGluZyAmJiBhY3RpdmUpCisJCWltX3hpbV9zZW5kX2V2ZW50X2ltYWN0aXZhdGUoKTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogRmlyc3QsIGZvcmNlIGRlc3Ryb3kgb2xkIElDLCBhbmQgY3JlYXRlIG5ldyBvbmUuICBJdAorCSAgICAgKiBzeW11bGF0ZXMgInR1cm5pbmcgb2ZmIHByZWVkaXQgc3RhdGUiLgorCSAgICAgKi8KKwkgICAgeGltX3NldF9mb2N1cyhGQUxTRSk7CisJICAgIGdka19pY19kZXN0cm95KHhpYyk7CisJICAgIHhpbV9pbml0KCk7CisJICAgIHhpbV9jYW5fcHJlZWRpdGluZyA9IEZBTFNFOworCisJICAgIC8qIDJuZCwgd2hlbiByZXF1ZXN0ZWQgdG8gYWN0aXZhdGUgSU0sIHN5bXVsYXRlIHRoaXMgYnkgc2VuZGluZworCSAgICAgKiB0aGUgZXZlbnQuCisJICAgICAqLworCSAgICBpZiAoYWN0aXZlKQorCSAgICB7CisJCWltX3hpbV9zZW5kX2V2ZW50X2ltYWN0aXZhdGUoKTsKKwkJeGltX2Nhbl9wcmVlZGl0aW5nID0gVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyMgaWZuZGVmIFhJTVByZWVkaXRVbktub3duCisJLyogWDExUjUgZG9lc24ndCBoYXZlIHRoZXNlLCBpdCBsb29rcyBzYWZlIGVub3VnaCB0byBkZWZpbmUgaGVyZS4gKi8KKwl0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElNUHJlZWRpdFN0YXRlOworIyAgZGVmaW5lIFhJTVByZWVkaXRVbktub3duCTBMCisjICBkZWZpbmUgWElNUHJlZWRpdEVuYWJsZQkxTAorIyAgZGVmaW5lIFhJTVByZWVkaXREaXNhYmxlCSgxTDw8MSkKKyMgIGRlZmluZSBYTlByZWVkaXRTdGF0ZQkicHJlZWRpdFN0YXRlIgorIyBlbmRpZgorCVhJTVByZWVkaXRTdGF0ZSBwcmVlZGl0X3N0YXRlID0gWElNUHJlZWRpdFVuS25vd247CisJWFZhTmVzdGVkTGlzdCBwcmVlZGl0X2F0dHI7CisJWElDIHB4aWM7CisKKwlwcmVlZGl0X2F0dHIgPSBYVmFDcmVhdGVOZXN0ZWRMaXN0KDAsCisJCQkJWE5QcmVlZGl0U3RhdGUsICZwcmVlZGl0X3N0YXRlLAorCQkJCU5VTEwpOworCXB4aWMgPSAoKEdka0lDUHJpdmF0ZSAqKXhpYyktPnhpYzsKKworCWlmICghWEdldElDVmFsdWVzKHB4aWMsIFhOUHJlZWRpdEF0dHJpYnV0ZXMsIHByZWVkaXRfYXR0ciwgTlVMTCkpCisJeworCSAgICBYRnJlZShwcmVlZGl0X2F0dHIpOworCSAgICBwcmVlZGl0X2F0dHIgPSBYVmFDcmVhdGVOZXN0ZWRMaXN0KDAsCisJCQkJWE5QcmVlZGl0U3RhdGUsCisJCQkJYWN0aXZlID8gWElNUHJlZWRpdEVuYWJsZSA6IFhJTVByZWVkaXREaXNhYmxlLAorCQkJCU5VTEwpOworCSAgICBYU2V0SUNWYWx1ZXMocHhpYywgWE5QcmVlZGl0QXR0cmlidXRlcywgcHJlZWRpdF9hdHRyLCBOVUxMKTsKKwkgICAgeGltX2Nhbl9wcmVlZGl0aW5nID0gYWN0aXZlOworCSAgICB4aW1faXNfYWN0aXZlID0gYWN0aXZlOworCX0KKwlYRnJlZShwcmVlZGl0X2F0dHIpOworICAgIH0KKyAgICBpZiAoeGltX2lucHV0X3N0eWxlICYgWElNUHJlZWRpdENhbGxiYWNrcykKKyAgICB7CisJcHJlZWRpdF9idWZfbGVuID0gMDsKKwlpbml0X3ByZWVkaXRfc3RhcnRfY29sKCk7CisgICAgfQorI2Vsc2UKKyMgaWYgMAorCS8qIFdoZW4gaGFkIHRlc3RlZCBraW5wdXQyICsgY2FubmEgKyBBdGhlbmEgR1VJIHZlcnNpb24gd2l0aAorCSAqICdpbWFjdGl2YXRla2V5JyBpcyAicy1zcGFjZSIsIGltX3hpbV9zZW5kX2V2ZW50X2ltYWN0aXZhdGUoKSBkaWQgbm90CisJICogd29yayBjb3JyZWN0bHkuICBJdCBqdXN0IGluc2VydGVkIG9uZSBzcGFjZS4gIEkgZG9uJ3Qga25vdyB3aHkgd2UKKwkgKiBjb3VsZG4ndCBzd2l0Y2ggc3RhdGUgb2YgWElNIHByZWVkaXRpbmcuICBUaGlzIGlzIHJlYXNvbiB3aHkgdGhlc2UKKwkgKiBjb2RlcyBhcmUgY29tbWVudGVkIG91dC4KKwkgKi8KKwkvKiBGaXJzdCwgZm9yY2UgZGVzdHJveSBvbGQgSUMsIGFuZCBjcmVhdGUgbmV3IG9uZS4gIEl0IHN5bXVsYXRlcworCSAqICJ0dXJuaW5nIG9mZiBwcmVlZGl0IHN0YXRlIi4KKwkgKi8KKwl4aW1fc2V0X2ZvY3VzKEZBTFNFKTsKKwlYRGVzdHJveUlDKHhpYyk7CisJeGljID0gTlVMTDsKKwl4aW1faW5pdCgpOworCisJLyogMm5kLCB3aGVuIHJlcXVlc3RlZCB0byBhY3RpdmF0ZSBJTSwgc3ltdWxhdGUgdGhpcyBieSBzZW5kaW5nIHRoZQorCSAqIGV2ZW50LgorCSAqLworCWlmIChhY3RpdmUpCisJICAgIGltX3hpbV9zZW5kX2V2ZW50X2ltYWN0aXZhdGUoKTsKKyMgZW5kaWYKKyNlbmRpZgorICAgIHhpbV9zZXRfcHJlZWRpdCgpOworfQorCisvKgorICogQWRqdXN0IHVzaW5nIFhJTSBmb3IgZ2FpbmluZyBvciBsb3Npbmcga2V5Ym9hcmQgZm9jdXMuICBBbHNvIGNhbGxlZCB3aGVuCisgKiAieGltX2lzX2FjdGl2ZSIgY2hhbmdlcy4KKyAqLworICAgIHZvaWQKK3hpbV9zZXRfZm9jdXMoZm9jdXMpCisgICAgaW50CQlmb2N1czsKK3sKKyAgICBpZiAoeGljID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBYSU0gb25seSBnZXRzIGZvY3VzIHdoZW4gdGhlIFZpbSB3aW5kb3cgaGFzIGtleWJvYXJkIGZvY3VzIGFuZCBYSU0gaGFzCisgICAgICogYmVlbiBzZXQgYWN0aXZlIGZvciB0aGUgY3VycmVudCBtb2RlLgorICAgICAqLworICAgIGlmIChmb2N1cyAmJiB4aW1faXNfYWN0aXZlKQorICAgIHsKKwlpZiAoIXhpbV9oYXNfZm9jdXMpCisJeworCSAgICB4aW1faGFzX2ZvY3VzID0gVFJVRTsKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKwkgICAgZ2RrX2ltX2JlZ2luKHhpYywgZ3VpLmRyYXdhcmVhLT53aW5kb3cpOworI2Vsc2UKKwkgICAgWFNldElDRm9jdXMoeGljKTsKKyNlbmRpZgorCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoeGltX2hhc19mb2N1cykKKwl7CisJICAgIHhpbV9oYXNfZm9jdXMgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKwkgICAgZ2RrX2ltX2VuZCgpOworI2Vsc2UKKwkgICAgWFVuc2V0SUNGb2N1cyh4aWMpOworI2VuZGlmCisJfQorICAgIH0KK30KKworLypBUkdTVVNFRCovCisgICAgdm9pZAoraW1fc2V0X3Bvc2l0aW9uKHJvdywgY29sKQorICAgIGludAkJcm93OworICAgIGludAkJY29sOworeworICAgIHhpbV9zZXRfcHJlZWRpdCgpOworfQorCisvKgorICogU2V0IHRoZSBYSU0gdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgorICovCisgICAgdm9pZAoreGltX3NldF9wcmVlZGl0KCkKK3sKKyAgICBpZiAoeGljID09IE5VTEwpCisJcmV0dXJuOworCisgICAgeGltX3NldF9mb2N1cyhUUlVFKTsKKworI2lmZGVmIEZFQVRfR1VJX0dUSworICAgIGlmIChnZGtfaW1fcmVhZHkoKSkKKyAgICB7CisJaW50CQlhdHRybWFzazsKKwlHZGtJQ0F0dHIJKmF0dHI7CisKKwlpZiAoIXhpY19hdHRyKQorCSAgICByZXR1cm47CisKKwlhdHRyID0geGljX2F0dHI7CisJYXR0cm1hc2sgPSAwOworCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlpZiAoKHhpbV9pbnB1dF9zdHlsZSAmIChpbnQpR0RLX0lNX1BSRUVESVRfUE9TSVRJT04pCisJCSYmIGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVAorCQkmJiBndWkuZm9udHNldC0+dHlwZSA9PSBHREtfRk9OVF9GT05UU0VUKQorCXsKKwkgICAgaWYgKCF4aW1faGFzX2ZvY3VzKQorCSAgICB7CisJCWlmIChhdHRyLT5zcG90X2xvY2F0aW9uLnkgPj0gMCkKKwkJeworCQkgICAgYXR0ci0+c3BvdF9sb2NhdGlvbi54ID0gMDsKKwkJICAgIGF0dHItPnNwb3RfbG9jYXRpb24ueSA9IC0xMDA7CisJCSAgICBhdHRybWFzayB8PSAoaW50KUdES19JQ19TUE9UX0xPQ0FUSU9OOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWdpbnQJd2lkdGgsIGhlaWdodDsKKworCQlpZiAoYXR0ci0+c3BvdF9sb2NhdGlvbi54ICE9IFRFWFRfWChndWkuY29sKQorCQkgICAgfHwgYXR0ci0+c3BvdF9sb2NhdGlvbi55ICE9IFRFWFRfWShndWkucm93KSkKKwkJeworCQkgICAgYXR0ci0+c3BvdF9sb2NhdGlvbi54ID0gVEVYVF9YKGd1aS5jb2wpOworCQkgICAgYXR0ci0+c3BvdF9sb2NhdGlvbi55ID0gVEVYVF9ZKGd1aS5yb3cpOworCQkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfU1BPVF9MT0NBVElPTjsKKwkJfQorCisJCWdka193aW5kb3dfZ2V0X3NpemUoZ3VpLmRyYXdhcmVhLT53aW5kb3csICZ3aWR0aCwgJmhlaWdodCk7CisJCXdpZHRoIC09IDIgKiBndWkuYm9yZGVyX29mZnNldDsKKwkJaGVpZ2h0IC09IDIgKiBndWkuYm9yZGVyX29mZnNldDsKKwkJaWYgKHhpbV9pbnB1dF9zdHlsZSAmIChpbnQpR0RLX0lNX1NUQVRVU19BUkVBKQorCQkgICAgaGVpZ2h0IC09IGd1aS5jaGFyX2hlaWdodDsKKwkJaWYgKGF0dHItPnByZWVkaXRfYXJlYS53aWR0aCAhPSB3aWR0aAorCQkgICAgfHwgYXR0ci0+cHJlZWRpdF9hcmVhLmhlaWdodCAhPSBoZWlnaHQpCisJCXsKKwkJICAgIGF0dHItPnByZWVkaXRfYXJlYS54ID0gZ3VpLmJvcmRlcl9vZmZzZXQ7CisJCSAgICBhdHRyLT5wcmVlZGl0X2FyZWEueSA9IGd1aS5ib3JkZXJfb2Zmc2V0OworCQkgICAgYXR0ci0+cHJlZWRpdF9hcmVhLndpZHRoID0gd2lkdGg7CisJCSAgICBhdHRyLT5wcmVlZGl0X2FyZWEuaGVpZ2h0ID0gaGVpZ2h0OworCQkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9BUkVBOworCQl9CisKKwkJaWYgKGF0dHItPnByZWVkaXRfZm9udHNldCAhPSBndWkuY3VycmVudF9mb250KQorCQl7CisJCSAgICBhdHRyLT5wcmVlZGl0X2ZvbnRzZXQgPSBndWkuY3VycmVudF9mb250OworCQkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9GT05UU0VUOworCQl9CisJICAgIH0KKwl9CisjIGVuZGlmIC8qIEZFQVRfWEZPTlRTRVQgKi8KKworCWlmICh4aW1fZmdfY29sb3IgPT0gSU5WQUxDT0xPUikKKwl7CisJICAgIHhpbV9mZ19jb2xvciA9IGd1aS5kZWZfbm9ybV9waXhlbDsKKwkgICAgeGltX2JnX2NvbG9yID0gZ3VpLmRlZl9iYWNrX3BpeGVsOworCX0KKwlpZiAoYXR0ci0+cHJlZWRpdF9mb3JlZ3JvdW5kLnBpeGVsICE9IHhpbV9mZ19jb2xvcikKKwl7CisJICAgIGF0dHItPnByZWVkaXRfZm9yZWdyb3VuZC5waXhlbCA9IHhpbV9mZ19jb2xvcjsKKwkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9GT1JFR1JPVU5EOworCX0KKwlpZiAoYXR0ci0+cHJlZWRpdF9iYWNrZ3JvdW5kLnBpeGVsICE9IHhpbV9iZ19jb2xvcikKKwl7CisJICAgIGF0dHItPnByZWVkaXRfYmFja2dyb3VuZC5waXhlbCA9IHhpbV9iZ19jb2xvcjsKKwkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9CQUNLR1JPVU5EOworCX0KKworCWlmIChhdHRybWFzayAhPSAwKQorCSAgICBnZGtfaWNfc2V0X2F0dHIoeGljLCBhdHRyLCAoR2RrSUNBdHRyaWJ1dGVzVHlwZSlhdHRybWFzayk7CisgICAgfQorI2Vsc2UgLyogRkVBVF9HVUlfR1RLICovCisgICAgeworCVhWYU5lc3RlZExpc3QgYXR0cl9saXN0OworCVhSZWN0YW5nbGUgc3BvdF9hcmVhOworCVhQb2ludCBvdmVyX3Nwb3Q7CisJaW50IGxpbmVfc3BhY2U7CisKKwlpZiAoIXhpbV9oYXNfZm9jdXMpCisJeworCSAgICAvKiBoaWRlIFhJTSBjdXJzb3IgKi8KKwkgICAgb3Zlcl9zcG90LnggPSAwOworCSAgICBvdmVyX3Nwb3QueSA9IC0xMDA7IC8qIGFyYml0cmFyeSBpbnZpc2libGUgcG9zaXRpb24gKi8KKwkgICAgYXR0cl9saXN0ID0gKFhWYU5lc3RlZExpc3QpIFhWYUNyZWF0ZU5lc3RlZExpc3QoMCwKKwkJCQkJCQkgICAgWE5TcG90TG9jYXRpb24sCisJCQkJCQkJICAgICZvdmVyX3Nwb3QsCisJCQkJCQkJICAgIE5VTEwpOworCSAgICBYU2V0SUNWYWx1ZXMoeGljLCBYTlByZWVkaXRBdHRyaWJ1dGVzLCBhdHRyX2xpc3QsIE5VTEwpOworCSAgICBYRnJlZShhdHRyX2xpc3QpOworCSAgICByZXR1cm47CisJfQorCisJaWYgKGlucHV0X3N0eWxlICYgWElNUHJlZWRpdFBvc2l0aW9uKQorCXsKKwkgICAgaWYgKHhpbV9mZ19jb2xvciA9PSBJTlZBTENPTE9SKQorCSAgICB7CisJCXhpbV9mZ19jb2xvciA9IGd1aS5kZWZfbm9ybV9waXhlbDsKKwkJeGltX2JnX2NvbG9yID0gZ3VpLmRlZl9iYWNrX3BpeGVsOworCSAgICB9CisJICAgIG92ZXJfc3BvdC54ID0gVEVYVF9YKGd1aS5jb2wpOworCSAgICBvdmVyX3Nwb3QueSA9IFRFWFRfWShndWkucm93KTsKKwkgICAgc3BvdF9hcmVhLnggPSAwOworCSAgICBzcG90X2FyZWEueSA9IDA7CisJICAgIHNwb3RfYXJlYS5oZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQgKiBSb3dzOworCSAgICBzcG90X2FyZWEud2lkdGggID0gZ3VpLmNoYXJfd2lkdGggKiBDb2x1bW5zOworCSAgICBsaW5lX3NwYWNlID0gZ3VpLmNoYXJfaGVpZ2h0OworCSAgICBhdHRyX2xpc3QgPSAoWFZhTmVzdGVkTGlzdCkgWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLAorCQkJCQkgICAgWE5TcG90TG9jYXRpb24sICZvdmVyX3Nwb3QsCisJCQkJCSAgICBYTkZvcmVncm91bmQsIChQaXhlbCkgeGltX2ZnX2NvbG9yLAorCQkJCQkgICAgWE5CYWNrZ3JvdW5kLCAoUGl4ZWwpIHhpbV9iZ19jb2xvciwKKwkJCQkJICAgIFhOQXJlYSwgJnNwb3RfYXJlYSwKKwkJCQkJICAgIFhOTGluZVNwYWNlLCBsaW5lX3NwYWNlLAorCQkJCQkgICAgTlVMTCk7CisJICAgIGlmIChYU2V0SUNWYWx1ZXMoeGljLCBYTlByZWVkaXRBdHRyaWJ1dGVzLCBhdHRyX2xpc3QsIE5VTEwpKQorCQlFTVNHKF8oIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIikpOworCSAgICBYRnJlZShhdHRyX2xpc3QpOworCX0KKyAgICB9CisjZW5kaWYgLyogRkVBVF9HVUlfR1RLICovCit9CisKKy8qCisgKiBTZXQgdXAgdGhlIHN0YXR1cyBhcmVhLgorICoKKyAqIFRoaXMgc2hvdWxkIHVzZSBhIHNlcGFyYXRlIFdpZGdldCwgYnV0IHRoYXQgc2VlbXMgbm90IHBvc3NpYmxlLCBiZWNhdXNlCisgKiBwcmVlZGl0X2FyZWEgYW5kIHN0YXR1c19hcmVhIHNob3VsZCBiZSBzZXQgdG8gdGhlIHNhbWUgd2luZG93IGFzIGZvciB0aGUKKyAqIHRleHQgaW5wdXQuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIHN0YXR1cyBhcmVhIHBvbGx1dGVzIHRoZSB0ZXh0CisgKiB3aW5kb3cuLi4KKyAqLworICAgIHZvaWQKK3hpbV9zZXRfc3RhdHVzX2FyZWEoKQoreworICAgIGlmICh4aWMgPT0gTlVMTCkKKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKyMgaWYgZGVmaW5lZChGRUFUX1hGT05UU0VUKQorICAgIGlmICh1c2Vfc3RhdHVzX2FyZWEpCisgICAgeworCUdka0lDQXR0cgkqYXR0cjsKKwlpbnQJCXN0eWxlOworCWdpbnQJCXdpZHRoLCBoZWlnaHQ7CisJR3RrV2lkZ2V0CSp3aWRnZXQ7CisJaW50CQlhdHRybWFzazsKKworCWlmICgheGljX2F0dHIpCisJICAgIHJldHVybjsKKworCWF0dHIgPSB4aWNfYXR0cjsKKwlhdHRybWFzayA9IDA7CisJc3R5bGUgPSAoaW50KWdka19pY19nZXRfc3R5bGUoeGljKTsKKwlpZiAoKHN0eWxlICYgKGludClHREtfSU1fU1RBVFVTX01BU0spID09IChpbnQpR0RLX0lNX1NUQVRVU19BUkVBKQorCXsKKwkgICAgaWYgKGd1aS5mb250c2V0ICE9IE5PRk9OVFNFVAorCQkgICAgJiYgZ3VpLmZvbnRzZXQtPnR5cGUgPT0gR0RLX0ZPTlRfRk9OVFNFVCkKKwkgICAgeworCQl3aWRnZXQgPSBndWkubWFpbndpbjsKKwkJZ2RrX3dpbmRvd19nZXRfc2l6ZSh3aWRnZXQtPndpbmRvdywgJndpZHRoLCAmaGVpZ2h0KTsKKworCQlhdHRybWFzayB8PSAoaW50KUdES19JQ19TVEFUVVNfQVJFQTsKKwkJYXR0ci0+c3RhdHVzX2FyZWEueCA9IDA7CisJCWF0dHItPnN0YXR1c19hcmVhLnkgPSBoZWlnaHQgLSBndWkuY2hhcl9oZWlnaHQgLSAxOworCQlhdHRyLT5zdGF0dXNfYXJlYS53aWR0aCA9IHdpZHRoOworCQlhdHRyLT5zdGF0dXNfYXJlYS5oZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQ7CisJICAgIH0KKwl9CisJaWYgKGF0dHJtYXNrICE9IDApCisJICAgIGdka19pY19zZXRfYXR0cih4aWMsIGF0dHIsIChHZGtJQ0F0dHJpYnV0ZXNUeXBlKWF0dHJtYXNrKTsKKyAgICB9CisjIGVuZGlmCisjZWxzZQorICAgIHsKKwlYVmFOZXN0ZWRMaXN0IHByZWVkaXRfbGlzdCA9IDAsIHN0YXR1c19saXN0ID0gMCwgbGlzdCA9IDA7CisJWFJlY3RhbmdsZSBwcmVfYXJlYSwgc3RhdHVzX2FyZWE7CisKKwlpZiAoaW5wdXRfc3R5bGUgJiBYSU1TdGF0dXNBcmVhKQorCXsKKwkgICAgaWYgKGlucHV0X3N0eWxlICYgWElNUHJlZWRpdEFyZWEpCisJICAgIHsKKwkJWFJlY3RhbmdsZSAqbmVlZGVkX3JlY3Q7CisKKwkJLyogdG8gZ2V0IHN0YXR1c19hcmVhIHdpZHRoICovCisJCXN0YXR1c19saXN0ID0gWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLCBYTkFyZWFOZWVkZWQsCisJCQkJCQkgICZuZWVkZWRfcmVjdCwgTlVMTCk7CisJCVhHZXRJQ1ZhbHVlcyh4aWMsIFhOU3RhdHVzQXR0cmlidXRlcywgc3RhdHVzX2xpc3QsIE5VTEwpOworCQlYRnJlZShzdGF0dXNfbGlzdCk7CisKKwkJc3RhdHVzX2FyZWEud2lkdGggPSBuZWVkZWRfcmVjdC0+d2lkdGg7CisJICAgIH0KKwkgICAgZWxzZQorCQlzdGF0dXNfYXJlYS53aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogQ29sdW1uczsKKworCSAgICBzdGF0dXNfYXJlYS54ID0gMDsKKwkgICAgc3RhdHVzX2FyZWEueSA9IGd1aS5jaGFyX2hlaWdodCAqIFJvd3MgKyBndWkuYm9yZGVyX29mZnNldDsKKwkgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfQk9UVE9NXSkKKwkJc3RhdHVzX2FyZWEueSArPSBndWkuc2Nyb2xsYmFyX2hlaWdodDsKKyNpZmRlZiBGRUFUX01FTlUKKwkgICAgaWYgKGd1aS5tZW51X2lzX2FjdGl2ZSkKKwkJc3RhdHVzX2FyZWEueSArPSBndWkubWVudV9oZWlnaHQ7CisjZW5kaWYKKwkgICAgc3RhdHVzX2FyZWEuaGVpZ2h0ID0gZ3VpLmNoYXJfaGVpZ2h0OworCSAgICBzdGF0dXNfbGlzdCA9IFhWYUNyZWF0ZU5lc3RlZExpc3QoMCwgWE5BcmVhLCAmc3RhdHVzX2FyZWEsIE5VTEwpOworCX0KKwllbHNlCisJeworCSAgICBzdGF0dXNfYXJlYS54ID0gMDsKKwkgICAgc3RhdHVzX2FyZWEueSA9IGd1aS5jaGFyX2hlaWdodCAqIFJvd3MgKyBndWkuYm9yZGVyX29mZnNldDsKKwkgICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfQk9UVE9NXSkKKwkJc3RhdHVzX2FyZWEueSArPSBndWkuc2Nyb2xsYmFyX2hlaWdodDsKKyNpZmRlZiBGRUFUX01FTlUKKwkgICAgaWYgKGd1aS5tZW51X2lzX2FjdGl2ZSkKKwkJc3RhdHVzX2FyZWEueSArPSBndWkubWVudV9oZWlnaHQ7CisjZW5kaWYKKwkgICAgc3RhdHVzX2FyZWEud2lkdGggPSAwOworCSAgICBzdGF0dXNfYXJlYS5oZWlnaHQgPSBndWkuY2hhcl9oZWlnaHQ7CisJfQorCisJaWYgKGlucHV0X3N0eWxlICYgWElNUHJlZWRpdEFyZWEpICAgLyogb2ZmLXRoZS1zcG90ICovCisJeworCSAgICBwcmVfYXJlYS54ID0gc3RhdHVzX2FyZWEueCArIHN0YXR1c19hcmVhLndpZHRoOworCSAgICBwcmVfYXJlYS55ID0gZ3VpLmNoYXJfaGVpZ2h0ICogUm93cyArIGd1aS5ib3JkZXJfb2Zmc2V0OworCSAgICBwcmVfYXJlYS53aWR0aCA9IGd1aS5jaGFyX3dpZHRoICogQ29sdW1ucyAtIHByZV9hcmVhLng7CisJICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0JPVFRPTV0pCisJCXByZV9hcmVhLnkgKz0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQ7CisjaWZkZWYgRkVBVF9NRU5VCisJICAgIGlmIChndWkubWVudV9pc19hY3RpdmUpCisJCXByZV9hcmVhLnkgKz0gZ3VpLm1lbnVfaGVpZ2h0OworI2VuZGlmCisJICAgIHByZV9hcmVhLmhlaWdodCA9IGd1aS5jaGFyX2hlaWdodDsKKwkgICAgcHJlZWRpdF9saXN0ID0gWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLCBYTkFyZWEsICZwcmVfYXJlYSwgTlVMTCk7CisJfQorCWVsc2UgaWYgKGlucHV0X3N0eWxlICYgWElNUHJlZWRpdFBvc2l0aW9uKSAgIC8qIG92ZXItdGhlLXNwb3QgKi8KKwl7CisJICAgIHByZV9hcmVhLnggPSAwOworCSAgICBwcmVfYXJlYS55ID0gMDsKKwkgICAgcHJlX2FyZWEuaGVpZ2h0ID0gZ3VpLmNoYXJfaGVpZ2h0ICogUm93czsKKwkgICAgcHJlX2FyZWEud2lkdGggPSBndWkuY2hhcl93aWR0aCAqIENvbHVtbnM7CisJICAgIHByZWVkaXRfbGlzdCA9IFhWYUNyZWF0ZU5lc3RlZExpc3QoMCwgWE5BcmVhLCAmcHJlX2FyZWEsIE5VTEwpOworCX0KKworCWlmIChwcmVlZGl0X2xpc3QgJiYgc3RhdHVzX2xpc3QpCisJICAgIGxpc3QgPSBYVmFDcmVhdGVOZXN0ZWRMaXN0KDAsIFhOUHJlZWRpdEF0dHJpYnV0ZXMsIHByZWVkaXRfbGlzdCwKKwkJCQkgICAgICAgWE5TdGF0dXNBdHRyaWJ1dGVzLCBzdGF0dXNfbGlzdCwgTlVMTCk7CisJZWxzZSBpZiAocHJlZWRpdF9saXN0KQorCSAgICBsaXN0ID0gWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLCBYTlByZWVkaXRBdHRyaWJ1dGVzLCBwcmVlZGl0X2xpc3QsCisJCQkJICAgICAgIE5VTEwpOworCWVsc2UgaWYgKHN0YXR1c19saXN0KQorCSAgICBsaXN0ID0gWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLCBYTlN0YXR1c0F0dHJpYnV0ZXMsIHN0YXR1c19saXN0LAorCQkJCSAgICAgICBOVUxMKTsKKwllbHNlCisJICAgIGxpc3QgPSBOVUxMOworCisJaWYgKGxpc3QpCisJeworCSAgICBYU2V0SUNWYWx1ZXMoeGljLCBYTlZhTmVzdGVkTGlzdCwgbGlzdCwgTlVMTCk7CisJICAgIFhGcmVlKGxpc3QpOworCX0KKwlpZiAoc3RhdHVzX2xpc3QpCisJICAgIFhGcmVlKHN0YXR1c19saXN0KTsKKwlpZiAocHJlZWRpdF9saXN0KQorCSAgICBYRnJlZShwcmVlZGl0X2xpc3QpOworICAgIH0KKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKQorc3RhdGljIGNoYXIgZV94aW1bXSA9IE5fKCJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoUFJPVE8pCisjIGlmIGRlZmluZWQoWHRTcGVjaWZpY2F0aW9uUmVsZWFzZSkgJiYgWHRTcGVjaWZpY2F0aW9uUmVsZWFzZSA+PSA2ICYmICFkZWZpbmVkKHN1bikKKyMgIGRlZmluZSBVU0VfWDExUjZfWElNCisjIGVuZGlmCisKK3N0YXRpYyBpbnQgeGltX3JlYWxfaW5pdCBfX0FSR1MoKFdpbmRvdyB4MTFfd2luZG93LCBEaXNwbGF5ICp4MTFfZGlzcGxheSkpOworCisKKyNpZmRlZiBVU0VfWDExUjZfWElNCitzdGF0aWMgdm9pZCB4aW1faW5zdGFudGlhdGVfY2IgX19BUkdTKChEaXNwbGF5ICpkaXNwbGF5LCBYUG9pbnRlciBjbGllbnRfZGF0YSwgWFBvaW50ZXIJY2FsbF9kYXRhKSk7CitzdGF0aWMgdm9pZCB4aW1fZGVzdHJveV9jYiBfX0FSR1MoKFhJTSBpbSwgWFBvaW50ZXIgY2xpZW50X2RhdGEsIFhQb2ludGVyIGNhbGxfZGF0YSkpOworCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAoreGltX2luc3RhbnRpYXRlX2NiKGRpc3BsYXksIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCisgICAgRGlzcGxheQkqZGlzcGxheTsKKyAgICBYUG9pbnRlcgljbGllbnRfZGF0YTsKKyAgICBYUG9pbnRlcgljYWxsX2RhdGE7Cit7CisgICAgV2luZG93CXgxMV93aW5kb3c7CisgICAgRGlzcGxheQkqeDExX2Rpc3BsYXk7CisKKyNpZmRlZiBYSU1fREVCVUcKKyAgICB4aW1fbG9nKCJ4aW1faW5zdGFudGlhdGVfY2IoKVxuIik7CisjZW5kaWYKKworICAgIGd1aV9nZXRfeDExX3dpbmRpcygmeDExX3dpbmRvdywgJngxMV9kaXNwbGF5KTsKKyAgICBpZiAoZGlzcGxheSAhPSB4MTFfZGlzcGxheSkKKwlyZXR1cm47CisKKyAgICB4aW1fcmVhbF9pbml0KHgxMV93aW5kb3csIHgxMV9kaXNwbGF5KTsKKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgRkFMU0UpOworICAgIGlmICh4aWMgIT0gTlVMTCkKKwlYVW5yZWdpc3RlcklNSW5zdGFudGlhdGVDYWxsYmFjayh4MTFfZGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJIHhpbV9pbnN0YW50aWF0ZV9jYiwgTlVMTCk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit4aW1fZGVzdHJveV9jYihpbSwgY2xpZW50X2RhdGEsIGNhbGxfZGF0YSkKKyAgICBYSU0JCWltOworICAgIFhQb2ludGVyCWNsaWVudF9kYXRhOworICAgIFhQb2ludGVyCWNhbGxfZGF0YTsKK3sKKyAgICBXaW5kb3cJeDExX3dpbmRvdzsKKyAgICBEaXNwbGF5CSp4MTFfZGlzcGxheTsKKworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coInhpbV9kZXN0cm95X2NiKClcbiIpOworI2VuZGlmCisgICAgZ3VpX2dldF94MTFfd2luZGlzKCZ4MTFfd2luZG93LCAmeDExX2Rpc3BsYXkpOworCisgICAgeGljID0gTlVMTDsKKyAgICBzdGF0dXNfYXJlYV9lbmFibGVkID0gRkFMU0U7CisKKyAgICBndWlfc2V0X3NoZWxsc2l6ZShGQUxTRSwgRkFMU0UpOworCisgICAgWFJlZ2lzdGVySU1JbnN0YW50aWF0ZUNhbGxiYWNrKHgxMV9kaXNwbGF5LCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCSAgIHhpbV9pbnN0YW50aWF0ZV9jYiwgTlVMTCk7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK3hpbV9pbml0KCkKK3sKKyAgICBXaW5kb3cJeDExX3dpbmRvdzsKKyAgICBEaXNwbGF5CSp4MTFfZGlzcGxheTsKKworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coInhpbV9pbml0KClcbiIpOworI2VuZGlmCisKKyAgICBndWlfZ2V0X3gxMV93aW5kaXMoJngxMV93aW5kb3csICZ4MTFfZGlzcGxheSk7CisKKyAgICB4aWMgPSBOVUxMOworCisgICAgaWYgKHhpbV9yZWFsX2luaXQoeDExX3dpbmRvdywgeDExX2Rpc3BsYXkpKQorCXJldHVybjsKKworICAgIGd1aV9zZXRfc2hlbGxzaXplKEZBTFNFLCBGQUxTRSk7CisKKyNpZmRlZiBVU0VfWDExUjZfWElNCisgICAgWFJlZ2lzdGVySU1JbnN0YW50aWF0ZUNhbGxiYWNrKHgxMV9kaXNwbGF5LCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCSAgIHhpbV9pbnN0YW50aWF0ZV9jYiwgTlVMTCk7CisjZW5kaWYKK30KKworICAgIHN0YXRpYyBpbnQKK3hpbV9yZWFsX2luaXQoeDExX3dpbmRvdywgeDExX2Rpc3BsYXkpCisgICAgV2luZG93CXgxMV93aW5kb3c7CisgICAgRGlzcGxheQkqeDExX2Rpc3BsYXk7Cit7CisgICAgaW50CQlpOworICAgIGNoYXIJKnAsCisJCSpzLAorCQkqbnMsCisJCSplbmQsCisJCXRtcFsxMDI0XTsKKyNkZWZpbmUgSU1MRU5fTUFYIDQwCisgICAgY2hhcglidWZbSU1MRU5fTUFYICsgN107CisgICAgWElNCQl4aW0gPSBOVUxMOworICAgIFhJTVN0eWxlcwkqeGltX3N0eWxlczsKKyAgICBYSU1TdHlsZQl0aGlzX2lucHV0X3N0eWxlID0gMDsKKyAgICBCb29sZWFuCWZvdW5kOworICAgIFhQb2ludAlvdmVyX3Nwb3Q7CisgICAgWFZhTmVzdGVkTGlzdCBwcmVlZGl0X2xpc3QsIHN0YXR1c19saXN0OworCisgICAgaW5wdXRfc3R5bGUgPSAwOworICAgIHN0YXR1c19hcmVhX2VuYWJsZWQgPSBGQUxTRTsKKworICAgIGlmICh4aWMgIT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoZ3VpLnJzcmNfaW5wdXRfbWV0aG9kICE9IE5VTEwgJiYgKmd1aS5yc3JjX2lucHV0X21ldGhvZCAhPSBOVUwpCisgICAgeworCXN0cmNweSh0bXAsIGd1aS5yc3JjX2lucHV0X21ldGhvZCk7CisJZm9yIChucyA9IHMgPSB0bXA7IG5zICE9IE5VTEwgJiYgKnMgIT0gTlVMOykKKwl7CisJICAgIHMgPSAoY2hhciAqKXNraXB3aGl0ZSgoY2hhcl91ICopcyk7CisJICAgIGlmICgqcyA9PSBOVUwpCisJCWJyZWFrOworCSAgICBpZiAoKG5zID0gZW5kID0gc3RyY2hyKHMsICcsJykpID09IE5VTEwpCisJCWVuZCA9IHMgKyBzdHJsZW4ocyk7CisJICAgIHdoaWxlIChpc3NwYWNlKCgoY2hhcl91ICopZW5kKVstMV0pKQorCQllbmQtLTsKKwkgICAgKmVuZCA9IE5VTDsKKworCSAgICBpZiAoc3RybGVuKHMpIDw9IElNTEVOX01BWCkKKwkgICAgeworCQlzdHJjcHkoYnVmLCAiQGltPSIpOworCQlzdHJjYXQoYnVmLCBzKTsKKwkJaWYgKChwID0gWFNldExvY2FsZU1vZGlmaWVycyhidWYpKSAhPSBOVUxMICYmICpwICE9IE5VTAorCQkJJiYgKHhpbSA9IFhPcGVuSU0oeDExX2Rpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpKQorCQkJCQkJCQkgICAgICAhPSBOVUxMKQorCQkgICAgYnJlYWs7CisJICAgIH0KKworCSAgICBzID0gbnMgKyAxOworCX0KKyAgICB9CisKKyAgICBpZiAoeGltID09IE5VTEwgJiYgKHAgPSBYU2V0TG9jYWxlTW9kaWZpZXJzKCIiKSkgIT0gTlVMTCAmJiAqcCAhPSBOVUwpCisJeGltID0gWE9wZW5JTSh4MTFfZGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWZ1bCB0byBvYnRhaW4gY2hhcmFjdGVycyB0aHJvdWdoCisgICAgICogWG1iTG9va3VwU3RyaW5nKCkgd2l0aG91dCByZWFsbHkgdXNpbmcgYSBYSU0uICovCisgICAgaWYgKHhpbSA9PSBOVUxMICYmIChwID0gWFNldExvY2FsZU1vZGlmaWVycygiQGltPW5vbmUiKSkgIT0gTlVMTAorCQkJCQkJCQkgJiYgKnAgIT0gTlVMKQorCXhpbSA9IFhPcGVuSU0oeDExX2Rpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgaWYgKHhpbSA9PSBOVUxMKQorICAgIHsKKwkvKiBPbmx5IGdpdmUgdGhpcyBtZXNzYWdlIHdoZW4gdmVyYm9zZSBpcyBzZXQsIGJlY2F1c2UgdG9vIG1hbnkgcGVvcGxlCisJICogZ290IHRoaXMgbWVzc2FnZSB3aGVuIHRoZXkgZGlkbid0IHdhbnQgdG8gdXNlIGEgWElNLiAqLworCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICBFTVNHKF8oIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIpKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWZkZWYgVVNFX1gxMVI2X1hJTQorICAgIHsKKwlYSU1DYWxsYmFjayBkZXN0cm95X2NiOworCisJZGVzdHJveV9jYi5jYWxsYmFjayA9IHhpbV9kZXN0cm95X2NiOworCWRlc3Ryb3lfY2IuY2xpZW50X2RhdGEgPSBOVUxMOworCWlmIChYU2V0SU1WYWx1ZXMoeGltLCBYTkRlc3Ryb3lDYWxsYmFjaywgJmRlc3Ryb3lfY2IsIE5VTEwpKQorCSAgICBFTVNHKF8oIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIpKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChYR2V0SU1WYWx1ZXMoeGltLCBYTlF1ZXJ5SW5wdXRTdHlsZSwgJnhpbV9zdHlsZXMsIE5VTEwpIHx8ICF4aW1fc3R5bGVzKQorICAgIHsKKwlFTVNHKF8oIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIikpOworCVhDbG9zZUlNKHhpbSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZvdW5kID0gRmFsc2U7CisgICAgc3RyY3B5KHRtcCwgZ3VpLnJzcmNfcHJlZWRpdF90eXBlX25hbWUpOworICAgIGZvciAocyA9IHRtcDsgcyAmJiAhZm91bmQ7ICkKKyAgICB7CisJd2hpbGUgKCpzICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnMpKQorCSAgICBzKys7CisJaWYgKCEqcykKKwkgICAgYnJlYWs7CisJaWYgKChucyA9IGVuZCA9IHN0cmNocihzLCAnLCcpKSAhPSAwKQorCSAgICBucysrOworCWVsc2UKKwkgICAgZW5kID0gcyArIHN0cmxlbihzKTsKKwl3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqZW5kKSkKKwkgICAgZW5kLS07CisJKmVuZCA9ICdcMCc7CisKKwlpZiAoIXN0cmNtcChzLCAiT3ZlclRoZVNwb3QiKSkKKwkgICAgdGhpc19pbnB1dF9zdHlsZSA9IChYSU1QcmVlZGl0UG9zaXRpb24gfCBYSU1TdGF0dXNBcmVhKTsKKwllbHNlIGlmICghc3RyY21wKHMsICJPZmZUaGVTcG90IikpCisJICAgIHRoaXNfaW5wdXRfc3R5bGUgPSAoWElNUHJlZWRpdEFyZWEgfCBYSU1TdGF0dXNBcmVhKTsKKwllbHNlIGlmICghc3RyY21wKHMsICJSb290IikpCisJICAgIHRoaXNfaW5wdXRfc3R5bGUgPSAoWElNUHJlZWRpdE5vdGhpbmcgfCBYSU1TdGF0dXNOb3RoaW5nKTsKKworCWZvciAoaSA9IDA7ICh1bnNpZ25lZCBzaG9ydClpIDwgeGltX3N0eWxlcy0+Y291bnRfc3R5bGVzOyBpKyspCisJeworCSAgICBpZiAodGhpc19pbnB1dF9zdHlsZSA9PSB4aW1fc3R5bGVzLT5zdXBwb3J0ZWRfc3R5bGVzW2ldKQorCSAgICB7CisJCWZvdW5kID0gVHJ1ZTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKCFmb3VuZCkKKwkgICAgZm9yIChpID0gMDsgKHVuc2lnbmVkIHNob3J0KWkgPCB4aW1fc3R5bGVzLT5jb3VudF9zdHlsZXM7IGkrKykKKwkgICAgeworCQlpZiAoKHhpbV9zdHlsZXMtPnN1cHBvcnRlZF9zdHlsZXNbaV0gJiB0aGlzX2lucHV0X3N0eWxlKQorCQkJPT0gKHRoaXNfaW5wdXRfc3R5bGUgJiB+WElNU3RhdHVzQXJlYSkpCisJCXsKKwkJICAgIHRoaXNfaW5wdXRfc3R5bGUgJj0gflhJTVN0YXR1c0FyZWE7CisJCSAgICBmb3VuZCA9IFRydWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisKKwlzID0gbnM7CisgICAgfQorICAgIFhGcmVlKHhpbV9zdHlsZXMpOworCisgICAgaWYgKCFmb3VuZCkKKyAgICB7CisJLyogT25seSBnaXZlIHRoaXMgbWVzc2FnZSB3aGVuIHZlcmJvc2UgaXMgc2V0LCBiZWNhdXNlIHRvbyBtYW55IHBlb3BsZQorCSAqIGdvdCB0aGlzIG1lc3NhZ2Ugd2hlbiB0aGV5IGRpZG4ndCB3YW50IHRvIHVzZSBhIFhJTS4gKi8KKwlpZiAocF92ZXJib3NlID4gMCkKKwkgICAgRU1TRyhfKCJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIpKTsKKwlYQ2xvc2VJTSh4aW0pOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBvdmVyX3Nwb3QueCA9IFRFWFRfWChndWkuY29sKTsKKyAgICBvdmVyX3Nwb3QueSA9IFRFWFRfWShndWkucm93KTsKKyAgICBpbnB1dF9zdHlsZSA9IHRoaXNfaW5wdXRfc3R5bGU7CisKKyAgICAvKiBBIGNyYXNoIHdhcyByZXBvcnRlZCB3aGVuIHRyeWluZyB0byBwYXNzIGd1aS5ub3JtX2ZvbnQgYXMgWE5Gb250U2V0LAorICAgICAqIHRodXMgdGhhdCBoYXMgYmVlbiByZW1vdmVkLiAgSG9wZWZ1bGx5IHRoZSBkZWZhdWx0IHdvcmtzLi4uICovCisjaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIGlmIChndWkuZm9udHNldCAhPSBOT0ZPTlRTRVQpCisgICAgeworCXByZWVkaXRfbGlzdCA9IFhWYUNyZWF0ZU5lc3RlZExpc3QoMCwKKwkJCQlYTlNwb3RMb2NhdGlvbiwgJm92ZXJfc3BvdCwKKwkJCQlYTkZvcmVncm91bmQsIChQaXhlbClndWkuZGVmX25vcm1fcGl4ZWwsCisJCQkJWE5CYWNrZ3JvdW5kLCAoUGl4ZWwpZ3VpLmRlZl9iYWNrX3BpeGVsLAorCQkJCVhORm9udFNldCwgKFhGb250U2V0KWd1aS5mb250c2V0LAorCQkJCU5VTEwpOworCXN0YXR1c19saXN0ID0gWFZhQ3JlYXRlTmVzdGVkTGlzdCgwLAorCQkJCVhORm9yZWdyb3VuZCwgKFBpeGVsKWd1aS5kZWZfbm9ybV9waXhlbCwKKwkJCQlYTkJhY2tncm91bmQsIChQaXhlbClndWkuZGVmX2JhY2tfcGl4ZWwsCisJCQkJWE5Gb250U2V0LCAoWEZvbnRTZXQpZ3VpLmZvbnRzZXQsCisJCQkJTlVMTCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlwcmVlZGl0X2xpc3QgPSBYVmFDcmVhdGVOZXN0ZWRMaXN0KDAsCisJCQkJWE5TcG90TG9jYXRpb24sICZvdmVyX3Nwb3QsCisJCQkJWE5Gb3JlZ3JvdW5kLCAoUGl4ZWwpZ3VpLmRlZl9ub3JtX3BpeGVsLAorCQkJCVhOQmFja2dyb3VuZCwgKFBpeGVsKWd1aS5kZWZfYmFja19waXhlbCwKKwkJCQlOVUxMKTsKKwlzdGF0dXNfbGlzdCA9IFhWYUNyZWF0ZU5lc3RlZExpc3QoMCwKKwkJCQlYTkZvcmVncm91bmQsIChQaXhlbClndWkuZGVmX25vcm1fcGl4ZWwsCisJCQkJWE5CYWNrZ3JvdW5kLCAoUGl4ZWwpZ3VpLmRlZl9iYWNrX3BpeGVsLAorCQkJCU5VTEwpOworICAgIH0KKworICAgIHhpYyA9IFhDcmVhdGVJQyh4aW0sCisJCSAgICBYTklucHV0U3R5bGUsIGlucHV0X3N0eWxlLAorCQkgICAgWE5DbGllbnRXaW5kb3csIHgxMV93aW5kb3csCisJCSAgICBYTkZvY3VzV2luZG93LCBndWkud2lkLAorCQkgICAgWE5QcmVlZGl0QXR0cmlidXRlcywgcHJlZWRpdF9saXN0LAorCQkgICAgWE5TdGF0dXNBdHRyaWJ1dGVzLCBzdGF0dXNfbGlzdCwKKwkJICAgIE5VTEwpOworICAgIFhGcmVlKHN0YXR1c19saXN0KTsKKyAgICBYRnJlZShwcmVlZGl0X2xpc3QpOworICAgIGlmICh4aWMgIT0gTlVMTCkKKyAgICB7CisJaWYgKGlucHV0X3N0eWxlICYgWElNU3RhdHVzQXJlYSkKKwl7CisJICAgIHhpbV9zZXRfc3RhdHVzX2FyZWEoKTsKKwkgICAgc3RhdHVzX2FyZWFfZW5hYmxlZCA9IFRSVUU7CisJfQorCWVsc2UKKwkgICAgZ3VpX3NldF9zaGVsbHNpemUoRkFMU0UsIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlFTVNHKF8oZV94aW0pKTsKKwlYQ2xvc2VJTSh4aW0pOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIEZFQVRfR1VJX1gxMSAqLworCisjaWYgZGVmaW5lZChGRUFUX0dVSV9HVEspIHx8IGRlZmluZWQoUFJPVE8pCisKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorc3RhdGljIGNoYXIgZV9vdmVydGhlc3BvdFtdID0gTl8oIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIpOworIyBlbmRpZgorCisjIGlmZGVmIFBST1RPCit0eXBlZGVmIGludCBHZGtJQzsKKyMgZW5kaWYKKworICAgIHZvaWQKK3hpbV9kZWNpZGVfaW5wdXRfc3R5bGUoKQoreworICAgIC8qIEdES19JTV9TVEFUVVNfQ0FMTEJBQ0tTIHdhcyBkaXNhYmxlZCwgZW5hYmxlZCBpdCB0byBhbGxvdyBKYXBhbmVzZQorICAgICAqIE92ZXJUaGVTcG90LiAqLworICAgIGludCBzdXBwb3J0ZWRfc3R5bGUgPSAoaW50KUdES19JTV9QUkVFRElUX05PTkUgfAorCQkJCSAoaW50KUdES19JTV9QUkVFRElUX05PVEhJTkcgfAorCQkJCSAoaW50KUdES19JTV9QUkVFRElUX1BPU0lUSU9OIHwKKwkJCQkgKGludClHREtfSU1fUFJFRURJVF9DQUxMQkFDS1MgfAorCQkJCSAoaW50KUdES19JTV9TVEFUVVNfQ0FMTEJBQ0tTIHwKKwkJCQkgKGludClHREtfSU1fU1RBVFVTX0FSRUEgfAorCQkJCSAoaW50KUdES19JTV9TVEFUVVNfTk9ORSB8CisJCQkJIChpbnQpR0RLX0lNX1NUQVRVU19OT1RISU5HOworCisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygieGltX2RlY2lkZV9pbnB1dF9zdHlsZSgpXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKCFnZGtfaW1fcmVhZHkoKSkKKwl4aW1faW5wdXRfc3R5bGUgPSAwOworICAgIGVsc2UKKyAgICB7CisJaWYgKGd0a19tYWpvcl92ZXJzaW9uID4gMQorCQl8fCAoZ3RrX21ham9yX3ZlcnNpb24gPT0gMQorCQkgICAgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gMgorCQkJfHwgKGd0a19taW5vcl92ZXJzaW9uID09IDIgJiYgZ3RrX21pY3JvX3ZlcnNpb24gPj0gMykpKSkKKwkgICAgdXNlX3N0YXR1c19hcmVhID0gVFJVRTsKKwllbHNlCisJeworCSAgICBFTVNHKF8oIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIpKTsKKwkgICAgdXNlX3N0YXR1c19hcmVhID0gRkFMU0U7CisJfQorI2lmZGVmIEZFQVRfWEZPTlRTRVQKKwlpZiAoZ3VpLmZvbnRzZXQgPT0gTk9GT05UU0VUIHx8IGd1aS5mb250c2V0LT50eXBlICE9IEdES19GT05UX0ZPTlRTRVQpCisjZW5kaWYKKwkgICAgc3VwcG9ydGVkX3N0eWxlICY9IH4oKGludClHREtfSU1fUFJFRURJVF9QT1NJVElPTgorCQkJCQkJICAgfCAoaW50KUdES19JTV9TVEFUVVNfQVJFQSk7CisJaWYgKCF1c2Vfc3RhdHVzX2FyZWEpCisJICAgIHN1cHBvcnRlZF9zdHlsZSAmPSB+KGludClHREtfSU1fU1RBVFVTX0FSRUE7CisJeGltX2lucHV0X3N0eWxlID0gKGludClnZGtfaW1fZGVjaWRlX3N0eWxlKChHZGtJTVN0eWxlKXN1cHBvcnRlZF9zdHlsZSk7CisgICAgfQorfQorCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorcHJlZWRpdF9zdGFydF9jYnByb2MoWElDIHhpYywgWFBvaW50ZXIgY2xpZW50X2RhdGEsIFhQb2ludGVyIGNhbGxfZGF0YSkKK3sKKyNpZmRlZiBYSU1fREVCVUcKKyAgICB4aW1fbG9nKCJ4aW1fZGVjaWRlX2lucHV0X3N0eWxlKClcbiIpOworI2VuZGlmCisKKyAgICBkcmF3X2ZlZWRiYWNrID0gTlVMTDsKKyAgICB4aW1fY2FuX3ByZWVkaXRpbmcgPSBUUlVFOworICAgIHhpbV9oYXNfcHJlZWRpdGluZyA9IFRSVUU7CisgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGlmIChzaG93bW9kZSgpID4gMCkKKyAgICB7CisJc2V0Y3Vyc29yKCk7CisJb3V0X2ZsdXNoKCk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3hpbV9iYWNrX2RlbGV0ZShpbnQgbikKK3sKKyAgICBjaGFyX3Ugc3RyWzNdOworCisgICAgc3RyWzBdID0gQ1NJOworICAgIHN0clsxXSA9ICdrJzsKKyAgICBzdHJbMl0gPSAnYic7CisgICAgd2hpbGUgKG4tLSA+IDApCisJYWRkX3RvX2lucHV0X2J1ZihzdHIsIDMpOworfQorCitzdGF0aWMgR1NMaXN0ICprZXlfcHJlc3NfZXZlbnRfcXVldWUgPSBOVUxMOworc3RhdGljIGdib29sZWFuIHByb2Nlc3NpbmdfcXVldWVkX2V2ZW50ID0gRkFMU0U7CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitwcmVlZGl0X2RyYXdfY2Jwcm9jKFhJQyB4aWMsIFhQb2ludGVyIGNsaWVudF9kYXRhLCBYUG9pbnRlciBjYWxsX2RhdGEpCit7CisgICAgWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdCAqZHJhd19kYXRhOworICAgIFhJTVRleHQJKnRleHQ7CisgICAgY2hhcgkqc3JjOworICAgIEdTTGlzdAkqZXZlbnRfcXVldWU7CisKKyNpZmRlZiBYSU1fREVCVUcKKyAgICB4aW1fbG9nKCJwcmVlZGl0X2RyYXdfY2Jwcm9jKClcbiIpOworI2VuZGlmCisKKyAgICBkcmF3X2RhdGEgPSAoWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdCAqKSBjYWxsX2RhdGE7CisgICAgdGV4dCA9IChYSU1UZXh0ICopIGRyYXdfZGF0YS0+dGV4dDsKKworICAgIGlmICgodGV4dCA9PSBOVUxMICYmIGRyYXdfZGF0YS0+Y2hnX2xlbmd0aCA9PSBwcmVlZGl0X2J1Zl9sZW4pCisJCQkJCQkgICAgICB8fCBwcmVlZGl0X2J1Zl9sZW4gPT0gMCkKKyAgICB7CisJaW5pdF9wcmVlZGl0X3N0YXJ0X2NvbCgpOworCXZpbV9mcmVlKGRyYXdfZmVlZGJhY2spOworCWRyYXdfZmVlZGJhY2sgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZHJhd19kYXRhLT5jaGdfbGVuZ3RoID4gMCkKKyAgICB7CisJaW50IGJzX2NudDsKKworCWlmIChkcmF3X2RhdGEtPmNoZ19sZW5ndGggPiBwcmVlZGl0X2J1Zl9sZW4pCisJICAgIGJzX2NudCA9IHByZWVkaXRfYnVmX2xlbjsKKwllbHNlCisJICAgIGJzX2NudCA9IGRyYXdfZGF0YS0+Y2hnX2xlbmd0aDsKKwl4aW1fYmFja19kZWxldGUoYnNfY250KTsKKwlwcmVlZGl0X2J1Zl9sZW4gLT0gYnNfY250OworICAgIH0KKyAgICBpZiAodGV4dCAhPSBOVUxMKQorICAgIHsKKwlpbnQJCWxlbjsKKyNpZmRlZiBGRUFUX01CWVRFCisJY2hhcl91CQkqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQJbmZlZWRiYWNrID0gMDsKKyNlbmRpZgorCWNoYXJfdQkJKnB0cjsKKworCXNyYyA9IHRleHQtPnN0cmluZy5tdWx0aV9ieXRlOworCWlmIChzcmMgIT0gTlVMTCAmJiAhdGV4dC0+ZW5jb2RpbmdfaXNfd2NoYXIpCisJeworCSAgICBsZW4gPSBzdHJsZW4oc3JjKTsKKwkgICAgcHRyID0gKGNoYXJfdSAqKXNyYzsKKwkgICAgLyogQXZvaWQgdGhlIGVudGVyIGZvciBkZWNpc2lvbiAqLworCSAgICBpZiAoKnB0ciA9PSAnXG4nKQorCQlyZXR1cm47CisKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FCisJCSAgICAmJiAoYnVmID0gc3RyaW5nX2NvbnZlcnQoJmlucHV0X2NvbnYsCisJCQkJCQkgKGNoYXJfdSAqKXNyYywgJmxlbikpICE9IE5VTEwpCisJICAgIHsKKwkJLyogQ29udmVydGVkIGZyb20gJ3Rlcm1lbmNvZGluZycgdG8gJ2VuY29kaW5nJy4gKi8KKwkJYWRkX3RvX2lucHV0X2J1Zl9jc2koYnVmLCBsZW4pOworCQlwdHIgPSBidWY7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCWFkZF90b19pbnB1dF9idWZfY3NpKChjaGFyX3UgKilzcmMsIGxlbik7CisJICAgIC8qIEFkZCBjb3VudCBvZiBjaGFyYWN0ZXIgdG8gcHJlZWRpdF9idWZfbGVuICAqLworCSAgICB3aGlsZSAoKnB0ciAhPSBOVUwpCisJICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChkcmF3X2RhdGEtPnRleHQtPmZlZWRiYWNrICE9IE5VTEwpCisJCXsKKwkJICAgIGlmIChkcmF3X2ZlZWRiYWNrID09IE5VTEwpCisJCQlkcmF3X2ZlZWRiYWNrID0gKGNoYXIgKilhbGxvYyhkcmF3X2RhdGEtPmNoZ19maXJzdAorCQkJCQkJCSAgICAgICsgdGV4dC0+bGVuZ3RoKTsKKwkJICAgIGVsc2UKKwkJCWRyYXdfZmVlZGJhY2sgPSByZWFsbG9jKGRyYXdfZmVlZGJhY2ssCisJCQkJCSBkcmF3X2RhdGEtPmNoZ19maXJzdCArIHRleHQtPmxlbmd0aCk7CisJCSAgICBpZiAoZHJhd19mZWVkYmFjayAhPSBOVUxMKQorCQkgICAgeworCQkJZHJhd19mZWVkYmFja1tuZmVlZGJhY2sgKyBkcmF3X2RhdGEtPmNoZ19maXJzdF0KKwkJCQkgICAgICAgPSBkcmF3X2RhdGEtPnRleHQtPmZlZWRiYWNrW25mZWVkYmFja107CisJCQluZmVlZGJhY2srKzsKKwkJICAgIH0KKwkJfQorCQlpZiAoaGFzX21ieXRlKQorCQkgICAgcHRyICs9IG1iX3B0cjJsZW5fY2hlY2socHRyKTsKKwkJZWxzZQorI2VuZGlmCisJCSAgICBwdHIrKzsKKwkJcHJlZWRpdF9idWZfbGVuKys7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIHZpbV9mcmVlKGJ1Zik7CisjZW5kaWYKKwkgICAgcHJlZWRpdF9lbmRfY29sID0gTUFYQ09MOworCX0KKyAgICB9CisgICAgaWYgKHRleHQgIT0gTlVMTCB8fCBkcmF3X2RhdGEtPmNoZ19sZW5ndGggPiAwKQorICAgIHsKKwlldmVudF9xdWV1ZSA9IGtleV9wcmVzc19ldmVudF9xdWV1ZTsKKwlwcm9jZXNzaW5nX3F1ZXVlZF9ldmVudCA9IFRSVUU7CisJd2hpbGUgKGV2ZW50X3F1ZXVlICE9IE5VTEwgJiYgcHJvY2Vzc2luZ19xdWV1ZWRfZXZlbnQpCisJeworCSAgICBHZGtFdmVudCAqZXYgPSBldmVudF9xdWV1ZS0+ZGF0YTsKKworCSAgICBnYm9vbGVhbiAqcmV0OworCSAgICBndGtfc2lnbmFsX2VtaXRfYnlfbmFtZSgoR3RrT2JqZWN0KilndWkubWFpbndpbiwgImtleV9wcmVzc19ldmVudCIsCisJCQkJCQkJCSAgICBldiwgJnJldCk7CisJICAgIGdka19ldmVudF9mcmVlKGV2KTsKKwkgICAgZXZlbnRfcXVldWUgPSBldmVudF9xdWV1ZS0+bmV4dDsKKwl9CisJcHJvY2Vzc2luZ19xdWV1ZWRfZXZlbnQgPSBGQUxTRTsKKwlpZiAoa2V5X3ByZXNzX2V2ZW50X3F1ZXVlKQorCXsKKwkgICAgZ19zbGlzdF9mcmVlKGtleV9wcmVzc19ldmVudF9xdWV1ZSk7CisJICAgIGtleV9wcmVzc19ldmVudF9xdWV1ZSA9IE5VTEw7CisJfQorICAgIH0KKyAgICBpZiAoZ3RrX21haW5fbGV2ZWwoKSA+IDApCisJZ3RrX21haW5fcXVpdCgpOworfQorCisvKgorICogUmV0cmlldmUgdGhlIGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGF0IGNvbHVtbiBjb2wgaW4gdGhlIHByZWVkaXQgc3RyaW5nLgorICogUmV0dXJuIC0xIGlmIG5vdCBpbiBwcmVlZGl0aW5nIG1vZGUgb3IgaWYgY29sIGlzIG91dCBvZiByYW5nZS4KKyAqLworICAgIGludAoraW1fZ2V0X2ZlZWRiYWNrX2F0dHIoaW50IGNvbCkKK3sKKyAgICBpZiAoZHJhd19mZWVkYmFjayAhPSBOVUxMICYmIGNvbCA8IHByZWVkaXRfYnVmX2xlbikKKyAgICB7CisJaWYgKGRyYXdfZmVlZGJhY2tbY29sXSAmIFhJTVJldmVyc2UpCisJICAgIHJldHVybiBITF9JTlZFUlNFOworCWVsc2UgaWYgKGRyYXdfZmVlZGJhY2tbY29sXSAmIFhJTVVuZGVybGluZSkKKwkgICAgcmV0dXJuIEhMX1VOREVSTElORTsKKwllbHNlCisJICAgIHJldHVybiBobF9hdHRyKEhMRl9WKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitwcmVlZGl0X2NhcmV0X2NicHJvYyhYSUMgeGljLCBYUG9pbnRlciBjbGllbnRfZGF0YSwgWFBvaW50ZXIgY2FsbF9kYXRhKQoreworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coInByZWVkaXRfY2FyZXRfY2Jwcm9jKClcbiIpOworI2VuZGlmCit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCitwcmVlZGl0X2RvbmVfY2Jwcm9jKFhJQyB4aWMsIFhQb2ludGVyIGNsaWVudF9kYXRhLCBYUG9pbnRlciBjYWxsX2RhdGEpCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygicHJlZWRpdF9kb25lX2NicHJvYygpXG4iKTsKKyNlbmRpZgorCisgICAgdmltX2ZyZWUoZHJhd19mZWVkYmFjayk7CisgICAgZHJhd19mZWVkYmFjayA9IE5VTEw7CisgICAgeGltX2Nhbl9wcmVlZGl0aW5nID0gRkFMU0U7CisgICAgeGltX2hhc19wcmVlZGl0aW5nID0gRkFMU0U7CisgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworICAgIGlmIChzaG93bW9kZSgpID4gMCkKKyAgICB7CisJc2V0Y3Vyc29yKCk7CisJb3V0X2ZsdXNoKCk7CisgICAgfQorfQorCisgICAgdm9pZAoreGltX3Jlc2V0KHZvaWQpCit7CisgICAgY2hhciAqdGV4dDsKKworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coInhpbV9yZXNldCgpXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKHhpYyAhPSBOVUxMKQorICAgIHsKKwl0ZXh0ID0gWG1iUmVzZXRJQygoKEdka0lDUHJpdmF0ZSAqKXhpYyktPnhpYyk7CisJaWYgKHRleHQgIT0gTlVMTCAmJiAhKHhpbV9pbnB1dF9zdHlsZSAmIChpbnQpR0RLX0lNX1BSRUVESVRfQ0FMTEJBQ0tTKSkKKwkgICAgYWRkX3RvX2lucHV0X2J1Zl9jc2koKGNoYXJfdSAqKXRleHQsIHN0cmxlbih0ZXh0KSk7CisJZWxzZQorCSAgICBwcmVlZGl0X2J1Zl9sZW4gPSAwOworCWlmICh0ZXh0ICE9IE5VTEwpCisJICAgIFhGcmVlKHRleHQpOworICAgIH0KK30KKworLypBUkdTVVNFRCovCisgICAgaW50Cit4aW1fcXVldWVfa2V5X3ByZXNzX2V2ZW50KEdka0V2ZW50S2V5ICpldmVudCwgaW50IGRvd24pCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygieGltX3F1ZXVlX2tleV9wcmVzc19ldmVudCgpXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKHByZWVkaXRfYnVmX2xlbiA8PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAocHJvY2Vzc2luZ19xdWV1ZWRfZXZlbnQpCisJcHJvY2Vzc2luZ19xdWV1ZWRfZXZlbnQgPSBGQUxTRTsKKworICAgIGtleV9wcmVzc19ldmVudF9xdWV1ZSA9IGdfc2xpc3RfYXBwZW5kKGtleV9wcmVzc19ldmVudF9xdWV1ZSwKKwkJCQkJICAgZ2RrX2V2ZW50X2NvcHkoKEdka0V2ZW50ICopZXZlbnQpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3ByZWVkaXRfY2FsbGJhY2tfc2V0dXAoR2RrSUMgKmljKQoreworICAgIFhJQyB4eGljOworICAgIFhWYU5lc3RlZExpc3QgcHJlZWRpdF9hdHRyOworICAgIFhJTUNhbGxiYWNrIHByZWVkaXRfc3RhcnRfY2I7CisgICAgWElNQ2FsbGJhY2sgcHJlZWRpdF9kcmF3X2NiOworICAgIFhJTUNhbGxiYWNrIHByZWVkaXRfY2FyZXRfY2I7CisgICAgWElNQ2FsbGJhY2sgcHJlZWRpdF9kb25lX2NiOworCisgICAgeHhpYyA9ICgoR2RrSUNQcml2YXRlKil4aWMpLT54aWM7CisgICAgcHJlZWRpdF9zdGFydF9jYi5jYWxsYmFjayA9IChYSU1Qcm9jKXByZWVkaXRfc3RhcnRfY2Jwcm9jOworICAgIHByZWVkaXRfZHJhd19jYi5jYWxsYmFjayA9IChYSU1Qcm9jKXByZWVkaXRfZHJhd19jYnByb2M7CisgICAgcHJlZWRpdF9jYXJldF9jYi5jYWxsYmFjayA9IChYSU1Qcm9jKXByZWVkaXRfY2FyZXRfY2Jwcm9jOworICAgIHByZWVkaXRfZG9uZV9jYi5jYWxsYmFjayA9IChYSU1Qcm9jKXByZWVkaXRfZG9uZV9jYnByb2M7CisgICAgcHJlZWRpdF9hdHRyCisJPSBYVmFDcmVhdGVOZXN0ZWRMaXN0ICgwLAorCQkJICAgICAgIFhOUHJlZWRpdFN0YXJ0Q2FsbGJhY2ssICZwcmVlZGl0X3N0YXJ0X2NiLAorCQkJICAgICAgIFhOUHJlZWRpdERyYXdDYWxsYmFjaywgJnByZWVkaXRfZHJhd19jYiwKKwkJCSAgICAgICBYTlByZWVkaXRDYXJldENhbGxiYWNrLCAmcHJlZWRpdF9jYXJldF9jYiwKKwkJCSAgICAgICBYTlByZWVkaXREb25lQ2FsbGJhY2ssICZwcmVlZGl0X2RvbmVfY2IsCisJCQkgICAgICAgMCk7CisgICAgWFNldElDVmFsdWVzICh4eGljLCBYTlByZWVkaXRBdHRyaWJ1dGVzLCBwcmVlZGl0X2F0dHIsIDApOworICAgIFhGcmVlKHByZWVkaXRfYXR0cik7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCityZXNldF9zdGF0ZV9zZXR1cChHZGtJQyAqaWMpCit7CisjaWZkZWYgVVNFX1gxMVI2X1hJTQorICAgIC8qIGRvbid0IGNoYW5nZSB0aGUgaW5wdXQgY29udGV4dCB3aGVuIHdlIGNhbGwgcmVzZXQgKi8KKyAgICBYU2V0SUNWYWx1ZXMoKChHZGtJQ1ByaXZhdGUqKWljKS0+eGljLCBYTlJlc2V0U3RhdGUsIFhJTVByZXNlcnZlU3RhdGUsIDApOworI2VuZGlmCit9CisKKyAgICB2b2lkCit4aW1faW5pdCh2b2lkKQoreworI2lmZGVmIFhJTV9ERUJVRworICAgIHhpbV9sb2coInhpbV9pbml0KClcbiIpOworI2VuZGlmCisKKyAgICB4aWMgPSBOVUxMOworICAgIHhpY19hdHRyID0gTlVMTDsKKworICAgIGlmICghZ2RrX2ltX3JlYWR5KCkpCisgICAgeworCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICBFTVNHKF8oIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciKSk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHhpY19hdHRyID0gZ2RrX2ljX2F0dHJfbmV3KCkpICE9IE5VTEwpCisgICAgeworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKwlnaW50IHdpZHRoLCBoZWlnaHQ7CisjZW5kaWYKKwlpbnQJCW1hc2s7CisJR2RrQ29sb3JtYXAJKmNvbG9ybWFwOworCUdka0lDQXR0cgkqYXR0ciA9IHhpY19hdHRyOworCWludAkJYXR0cm1hc2sgPSAoaW50KUdES19JQ19BTExfUkVROworCUd0a1dpZGdldAkqd2lkZ2V0ID0gZ3VpLmRyYXdhcmVhOworCisJYXR0ci0+c3R5bGUgPSAoR2RrSU1TdHlsZSl4aW1faW5wdXRfc3R5bGU7CisJYXR0ci0+Y2xpZW50X3dpbmRvdyA9IGd1aS5tYWlud2luLT53aW5kb3c7CisKKwlpZiAoKGNvbG9ybWFwID0gZ3RrX3dpZGdldF9nZXRfY29sb3JtYXAod2lkZ2V0KSkgIT0KKwkgICAgZ3RrX3dpZGdldF9nZXRfZGVmYXVsdF9jb2xvcm1hcCgpKQorCXsKKwkgICAgYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9DT0xPUk1BUDsKKwkgICAgYXR0ci0+cHJlZWRpdF9jb2xvcm1hcCA9IGNvbG9ybWFwOworCX0KKwlhdHRybWFzayB8PSAoaW50KUdES19JQ19QUkVFRElUX0ZPUkVHUk9VTkQ7CisJYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9CQUNLR1JPVU5EOworCWF0dHItPnByZWVkaXRfZm9yZWdyb3VuZCA9IHdpZGdldC0+c3R5bGUtPmZnW0dUS19TVEFURV9OT1JNQUxdOworCWF0dHItPnByZWVkaXRfYmFja2dyb3VuZCA9IHdpZGdldC0+c3R5bGUtPmJhc2VbR1RLX1NUQVRFX05PUk1BTF07CisKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJaWYgKCh4aW1faW5wdXRfc3R5bGUgJiAoaW50KUdES19JTV9QUkVFRElUX01BU0spCisJCQkJCSAgICAgID09IChpbnQpR0RLX0lNX1BSRUVESVRfUE9TSVRJT04pCisJeworCSAgICBpZiAoZ3VpLmZvbnRzZXQgPT0gTk9GT05UU0VUCisJCSAgICB8fCBndWkuZm9udHNldC0+dHlwZSAhPSBHREtfRk9OVF9GT05UU0VUKQorCSAgICB7CisJCUVNU0coXyhlX292ZXJ0aGVzcG90KSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWdka193aW5kb3dfZ2V0X3NpemUod2lkZ2V0LT53aW5kb3csICZ3aWR0aCwgJmhlaWdodCk7CisKKwkJYXR0cm1hc2sgfD0gKGludClHREtfSUNfUFJFRURJVF9QT1NJVElPTl9SRVE7CisJCWF0dHItPnNwb3RfbG9jYXRpb24ueCA9IFRFWFRfWCgwKTsKKwkJYXR0ci0+c3BvdF9sb2NhdGlvbi55ID0gVEVYVF9ZKDApOworCQlhdHRyLT5wcmVlZGl0X2FyZWEueCA9IGd1aS5ib3JkZXJfb2Zmc2V0OworCQlhdHRyLT5wcmVlZGl0X2FyZWEueSA9IGd1aS5ib3JkZXJfb2Zmc2V0OworCQlhdHRyLT5wcmVlZGl0X2FyZWEud2lkdGggPSB3aWR0aCAtIDIqZ3VpLmJvcmRlcl9vZmZzZXQ7CisJCWF0dHItPnByZWVkaXRfYXJlYS5oZWlnaHQgPSBoZWlnaHQgLSAyKmd1aS5ib3JkZXJfb2Zmc2V0OworCQlhdHRyLT5wcmVlZGl0X2ZvbnRzZXQgPSBndWkuZm9udHNldDsKKwkgICAgfQorCX0KKworCWlmICgoeGltX2lucHV0X3N0eWxlICYgKGludClHREtfSU1fU1RBVFVTX01BU0spCisJCQkJCQkgICA9PSAoaW50KUdES19JTV9TVEFUVVNfQVJFQSkKKwl7CisJICAgIGlmIChndWkuZm9udHNldCA9PSBOT0ZPTlRTRVQKKwkJICAgIHx8IGd1aS5mb250c2V0LT50eXBlICE9IEdES19GT05UX0ZPTlRTRVQpCisJICAgIHsKKwkJRU1TRyhfKGVfb3ZlcnRoZXNwb3QpKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZ2RrX3dpbmRvd19nZXRfc2l6ZShndWkubWFpbndpbi0+d2luZG93LCAmd2lkdGgsICZoZWlnaHQpOworCQlhdHRybWFzayB8PSAoaW50KUdES19JQ19TVEFUVVNfQVJFQV9SRVE7CisJCWF0dHItPnN0YXR1c19hcmVhLnggPSAwOworCQlhdHRyLT5zdGF0dXNfYXJlYS55ID0gaGVpZ2h0IC0gZ3VpLmNoYXJfaGVpZ2h0IC0gMTsKKwkJYXR0ci0+c3RhdHVzX2FyZWEud2lkdGggPSB3aWR0aDsKKwkJYXR0ci0+c3RhdHVzX2FyZWEuaGVpZ2h0ID0gZ3VpLmNoYXJfaGVpZ2h0OworCQlhdHRyLT5zdGF0dXNfZm9udHNldCA9IGd1aS5mb250c2V0OworCSAgICB9CisJfQorCWVsc2UgaWYgKCh4aW1faW5wdXRfc3R5bGUgJiAoaW50KUdES19JTV9TVEFUVVNfTUFTSykKKwkJCQkJICAgICAgPT0gKGludClHREtfSU1fU1RBVFVTX0NBTExCQUNLUykKKwl7CisJICAgIC8qIEZJWE1FICovCisJfQorI2VuZGlmCisKKwl4aWMgPSBnZGtfaWNfbmV3KGF0dHIsIChHZGtJQ0F0dHJpYnV0ZXNUeXBlKWF0dHJtYXNrKTsKKworCWlmICh4aWMgPT0gTlVMTCkKKwkgICAgRU1TRyhfKGVfeGltKSk7CisJZWxzZQorCXsKKwkgICAgbWFzayA9IChpbnQpZ2RrX3dpbmRvd19nZXRfZXZlbnRzKHdpZGdldC0+d2luZG93KTsKKwkgICAgbWFzayB8PSAoaW50KWdka19pY19nZXRfZXZlbnRzKHhpYyk7CisJICAgIGdka193aW5kb3dfc2V0X2V2ZW50cyh3aWRnZXQtPndpbmRvdywgKEdka0V2ZW50TWFzayltYXNrKTsKKwkgICAgaWYgKHhpbV9pbnB1dF9zdHlsZSAmIChpbnQpR0RLX0lNX1BSRUVESVRfQ0FMTEJBQ0tTKQorCQlwcmVlZGl0X2NhbGxiYWNrX3NldHVwKHhpYyk7CisJICAgIHJlc2V0X3N0YXRlX3NldHVwKHhpYyk7CisJfQorICAgIH0KK30KKworICAgIHZvaWQKK2ltX3NodXRkb3duKHZvaWQpCit7CisjaWZkZWYgWElNX0RFQlVHCisgICAgeGltX2xvZygiaW1fc2h1dGRvd24oKVxuIik7CisjZW5kaWYKKworICAgIGlmICh4aWMgIT0gTlVMTCkKKyAgICB7CisJZ2RrX2ltX2VuZCgpOworCWdka19pY19kZXN0cm95KHhpYyk7CisJeGljID0gTlVMTDsKKyAgICB9CisgICAgeGltX2lzX2FjdGl2ZSA9IEZBTFNFOworICAgIHhpbV9jYW5fcHJlZWRpdGluZyA9IEZBTFNFOworICAgIHByZWVkaXRfc3RhcnRfY29sID0gTUFYQ09MOworICAgIHhpbV9oYXNfcHJlZWRpdGluZyA9IEZBTFNFOworfQorCisjZW5kaWYgLyogRkVBVF9HVUlfR1RLICovCisKKyAgICBpbnQKK3hpbV9nZXRfc3RhdHVzX2FyZWFfaGVpZ2h0KCkKK3sKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKyAgICBpZiAoeGltX2lucHV0X3N0eWxlICYgKGludClHREtfSU1fU1RBVFVTX0FSRUEpCisJcmV0dXJuIGd1aS5jaGFyX2hlaWdodDsKKyNlbHNlCisgICAgaWYgKHN0YXR1c19hcmVhX2VuYWJsZWQpCisJcmV0dXJuIGd1aS5jaGFyX2hlaWdodDsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKgorICogR2V0IElNIHN0YXR1cy4gIFdoZW4gSU0gaXMgb24sIHJldHVybiBUUlVFLiAgRWxzZSByZXR1cm4gRkFMU0UuCisgKiBGSVhNRTogVGhpcyBkb2Vzbid0IHdvcmsgY29ycmVjdGx5OiBIYXZpbmcgZm9jdXMgZG9lc24ndCBhbHdheXMgbWVhbiBYSU0gaXMKKyAqIGFjdGl2ZSwgd2hlbiBub3QgaGF2aW5nIGZvY3VzIFhJTSBtYXkgc3RpbGwgYmUgYWN0aXZlIChlLmcuLCB3aGVuIHVzaW5nIGEKKyAqIHRlYXItb2ZmIG1lbnUgaXRlbSkuCisgKi8KKyAgICBpbnQKK2ltX2dldF9zdGF0dXMoKQoreworIyAgaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgaWYgKHhpbV9pbnB1dF9zdHlsZSAmIChpbnQpR0RLX0lNX1BSRUVESVRfQ0FMTEJBQ0tTKQorCXJldHVybiB4aW1fY2FuX3ByZWVkaXRpbmc7CisjICBlbmRpZgorICAgIHJldHVybiB4aW1faGFzX2ZvY3VzOworfQorCisjIGVuZGlmIC8qICFIQVZFX0dUSzIgKi8KKworIyBpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK2ltX2lzX3ByZWVkaXRpbmcoKQoreworICAgIHJldHVybiB4aW1faGFzX3ByZWVkaXRpbmc7Cit9CisjIGVuZGlmCisjZW5kaWYgLyogRkVBVF9YSU0gKi8KKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIFNldHVwICJ2Y3AiIGZvciBjb252ZXJzaW9uIGZyb20gImZyb20iIHRvICJ0byIuCisgKiBUaGUgbmFtZXMgbXVzdCBoYXZlIGJlZW4gbWFkZSBjYW5vbmljYWwgd2l0aCBlbmNfY2Fub25pemUoKS4KKyAqIHZjcC0+dmNfdHlwZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCB0byBDT05WX05PTkUuCisgKiBOb3RlOiBjYW5ub3QgYmUgdXNlZCBmb3IgY29udmVyc2lvbiBmcm9tL3RvIHVjcy0yIGFuZCB1Y3MtNCAod2lsbCB1c2UgdXRmLTgKKyAqIGluc3RlYWQpLgorICogQWZ0ZXJ3YXJkcyBpbnZva2Ugd2l0aCAiZnJvbSIgYW5kICJ0byIgZXF1YWwgdG8gTlVMTCB0byBjbGVhbnVwLgorICogUmV0dXJuIEZBSUwgd2hlbiBjb252ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQsIE9LIG90aGVyd2lzZS4KKyAqLworICAgIGludAorY29udmVydF9zZXR1cCh2Y3AsIGZyb20sIHRvKQorICAgIHZpbWNvbnZfVAkqdmNwOworICAgIGNoYXJfdQkqZnJvbTsKKyAgICBjaGFyX3UJKnRvOworeworICAgIGludAkJZnJvbV9wcm9wOworICAgIGludAkJdG9fcHJvcDsKKworICAgIC8qIFJlc2V0IHRvIG5vIGNvbnZlcnNpb24uICovCisjIGlmZGVmIFVTRV9JQ09OVgorICAgIGlmICh2Y3AtPnZjX3R5cGUgPT0gQ09OVl9JQ09OViAmJiB2Y3AtPnZjX2ZkICE9IChpY29udl90KS0xKQorCWljb252X2Nsb3NlKHZjcC0+dmNfZmQpOworIyBlbmRpZgorICAgIHZjcC0+dmNfdHlwZSA9IENPTlZfTk9ORTsKKyAgICB2Y3AtPnZjX2ZhY3RvciA9IDE7CisgICAgdmNwLT52Y19mYWlsID0gRkFMU0U7CisKKyAgICAvKiBObyBjb252ZXJzaW9uIHdoZW4gb25lIG9mIHRoZSBuYW1lcyBpcyBlbXB0eSBvciB0aGV5IGFyZSBlcXVhbC4gKi8KKyAgICBpZiAoZnJvbSA9PSBOVUxMIHx8ICpmcm9tID09IE5VTCB8fCB0byA9PSBOVUxMIHx8ICp0byA9PSBOVUwKKwkJCQkJCSAgICAgfHwgU1RSQ01QKGZyb20sIHRvKSA9PSAwKQorCXJldHVybiBPSzsKKworICAgIGZyb21fcHJvcCA9IGVuY19jYW5vbl9wcm9wcyhmcm9tKTsKKyAgICB0b19wcm9wID0gZW5jX2Nhbm9uX3Byb3BzKHRvKTsKKyAgICBpZiAoKGZyb21fcHJvcCAmIEVOQ19MQVRJTjEpICYmICh0b19wcm9wICYgRU5DX1VOSUNPREUpKQorICAgIHsKKwkvKiBJbnRlcm5hbCBsYXRpbjEgLT4gdXRmLTggY29udmVyc2lvbi4gKi8KKwl2Y3AtPnZjX3R5cGUgPSBDT05WX1RPX1VURjg7CisJdmNwLT52Y19mYWN0b3IgPSAyOwkvKiB1cCB0byB0d2ljZSBhcyBsb25nICovCisgICAgfQorICAgIGVsc2UgaWYgKChmcm9tX3Byb3AgJiBFTkNfVU5JQ09ERSkgJiYgKHRvX3Byb3AgJiBFTkNfTEFUSU4xKSkKKyAgICB7CisJLyogSW50ZXJuYWwgdXRmLTggLT4gbGF0aW4xIGNvbnZlcnNpb24uICovCisJdmNwLT52Y190eXBlID0gQ09OVl9UT19MQVRJTjE7CisgICAgfQorI2lmZGVmIFdJTjMyNjQKKyAgICAvKiBXaW4zMi1zcGVjaWZpYyBjb2RlcGFnZSA8LT4gY29kZXBhZ2UgY29udmVyc2lvbiB3aXRob3V0IGljb252LiAqLworICAgIGVsc2UgaWYgKCgoZnJvbV9wcm9wICYgRU5DX1VOSUNPREUpIHx8IGVuY25hbWUyY29kZXBhZ2UoZnJvbSkgPiAwKQorCSAgICAmJiAoKHRvX3Byb3AgJiBFTkNfVU5JQ09ERSkgfHwgZW5jbmFtZTJjb2RlcGFnZSh0bykgPiAwKSkKKyAgICB7CisJdmNwLT52Y190eXBlID0gQ09OVl9DT0RFUEFHRTsKKwl2Y3AtPnZjX2ZhY3RvciA9IDI7CS8qIHVwIHRvIHR3aWNlIGFzIGxvbmcgKi8KKwl2Y3AtPnZjX2NwZnJvbSA9IChmcm9tX3Byb3AgJiBFTkNfVU5JQ09ERSkgPyAwIDogZW5jbmFtZTJjb2RlcGFnZShmcm9tKTsKKwl2Y3AtPnZjX2NwdG8gPSAodG9fcHJvcCAmIEVOQ19VTklDT0RFKSA/IDAgOiBlbmNuYW1lMmNvZGVwYWdlKHRvKTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBNQUNPU19YCisgICAgZWxzZSBpZiAoKGZyb21fcHJvcCAmIEVOQ19NQUNST01BTikgJiYgKHRvX3Byb3AgJiBFTkNfTEFUSU4xKSkKKyAgICB7CisJdmNwLT52Y190eXBlID0gQ09OVl9NQUNfTEFUSU4xOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJvbV9wcm9wICYgRU5DX01BQ1JPTUFOKSAmJiAodG9fcHJvcCAmIEVOQ19VTklDT0RFKSkKKyAgICB7CisJdmNwLT52Y190eXBlID0gQ09OVl9NQUNfVVRGODsKKwl2Y3AtPnZjX2ZhY3RvciA9IDI7CS8qIHVwIHRvIHR3aWNlIGFzIGxvbmcgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoKGZyb21fcHJvcCAmIEVOQ19MQVRJTjEpICYmICh0b19wcm9wICYgRU5DX01BQ1JPTUFOKSkKKyAgICB7CisJdmNwLT52Y190eXBlID0gQ09OVl9MQVRJTjFfTUFDOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJvbV9wcm9wICYgRU5DX1VOSUNPREUpICYmICh0b19wcm9wICYgRU5DX01BQ1JPTUFOKSkKKyAgICB7CisJdmNwLT52Y190eXBlID0gQ09OVl9VVEY4X01BQzsKKyAgICB9CisjZW5kaWYKKyMgaWZkZWYgVVNFX0lDT05WCisgICAgZWxzZQorICAgIHsKKwkvKiBVc2UgaWNvbnYoKSBmb3IgY29udmVyc2lvbi4gKi8KKwl2Y3AtPnZjX2ZkID0gKGljb252X3QpbXlfaWNvbnZfb3BlbigKKwkJKHRvX3Byb3AgJiBFTkNfVU5JQ09ERSkgPyAoY2hhcl91ICopInV0Zi04IiA6IHRvLAorCQkoZnJvbV9wcm9wICYgRU5DX1VOSUNPREUpID8gKGNoYXJfdSAqKSJ1dGYtOCIgOiBmcm9tKTsKKwlpZiAodmNwLT52Y19mZCAhPSAoaWNvbnZfdCktMSkKKwl7CisJICAgIHZjcC0+dmNfdHlwZSA9IENPTlZfSUNPTlY7CisJICAgIHZjcC0+dmNfZmFjdG9yID0gNDsJLyogY291bGQgYmUgbG9uZ2VyIHRvby4uLiAqLworCX0KKyAgICB9CisjIGVuZGlmCisgICAgaWYgKHZjcC0+dmNfdHlwZSA9PSBDT05WX05PTkUpCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChXSU4zMjY0KSBcCisJfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBEbyBjb252ZXJzaW9uIG9uIHR5cGVkIGlucHV0IGNoYXJhY3RlcnMgaW4tcGxhY2UuCisgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBhcmUgbm90IE5VTCB0ZXJtaW5hdGVkIQorICogUmV0dXJucyB0aGUgbGVuZ3RoIGFmdGVyIGNvbnZlcnNpb24uCisgKi8KKyAgICBpbnQKK2NvbnZlcnRfaW5wdXQocHRyLCBsZW4sIG1heGxlbikKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCW1heGxlbjsKK3sKKyAgICByZXR1cm4gY29udmVydF9pbnB1dF9zYWZlKHB0ciwgbGVuLCBtYXhsZW4sIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisKKy8qCisgKiBMaWtlIGNvbnZlcnRfaW5wdXQoKSwgYnV0IHdoZW4gdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlIGF0IHRoZQorICogZW5kIHJldHVybiB0aGF0IGFzIGFuIGFsbG9jYXRlZCBzdHJpbmcgaW4gInJlc3RwIiBhbmQgc2V0ICIqcmVzdGxlbnAiIHRvCisgKiB0aGUgbGVuZ3RoLiAgSWYgInJlc3RwIiBpcyBOVUxMIGl0IGlzIG5vdCB1c2VkLgorICovCisgICAgaW50Citjb252ZXJ0X2lucHV0X3NhZmUocHRyLCBsZW4sIG1heGxlbiwgcmVzdHAsIHJlc3RsZW5wKQorICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJbGVuOworICAgIGludAkJbWF4bGVuOworICAgIGNoYXJfdQkqKnJlc3RwOworICAgIGludAkJKnJlc3RsZW5wOworeworICAgIGNoYXJfdQkqZDsKKyAgICBpbnQJCWRsZW4gPSBsZW47CisgICAgaW50CQl1bmNvbnZlcnRsZW4gPSAwOworCisgICAgZCA9IHN0cmluZ19jb252ZXJ0X2V4dCgmaW5wdXRfY29udiwgcHRyLCAmZGxlbiwKKwkJCQkJcmVzdHAgPT0gTlVMTCA/IE5VTEwgOiAmdW5jb252ZXJ0bGVuKTsKKyAgICBpZiAoZCAhPSBOVUxMKQorICAgIHsKKwlpZiAoZGxlbiA8PSBtYXhsZW4pCisJeworCSAgICBpZiAodW5jb252ZXJ0bGVuID4gMCkKKwkgICAgeworCQkvKiBNb3ZlIHRoZSB1bmNvbnZlcnRlZCBjaGFyYWN0ZXJzIHRvIGFsbG9jYXRlZCBtZW1vcnkuICovCisJCSpyZXN0cCA9IGFsbG9jKHVuY29udmVydGxlbik7CisJCWlmICgqcmVzdHAgIT0gTlVMTCkKKwkJICAgIG1jaF9tZW1tb3ZlKCpyZXN0cCwgcHRyICsgbGVuIC0gdW5jb252ZXJ0bGVuLCB1bmNvbnZlcnRsZW4pOworCQkqcmVzdGxlbnAgPSB1bmNvbnZlcnRsZW47CisJICAgIH0KKwkgICAgbWNoX21lbW1vdmUocHRyLCBkLCBkbGVuKTsKKwl9CisJZWxzZQorCSAgICAvKiByZXN1bHQgaXMgdG9vIGxvbmcsIGtlZXAgdGhlIHVuY29udmVydGVkIHRleHQgKHRoZSBjYWxsZXIgbXVzdAorCSAgICAgKiBoYXZlIGRvbmUgc29tZXRoaW5nIHdyb25nISkgKi8KKwkgICAgZGxlbiA9IGxlbjsKKwl2aW1fZnJlZShkKTsKKyAgICB9CisgICAgcmV0dXJuIGRsZW47Cit9CisKKyNpZiBkZWZpbmVkKE1BQ09TX1gpCitzdGF0aWMgY2hhcl91ICptYWNfc3RyaW5nX2NvbnZlcnQgX19BUkdTKChjaGFyX3UgKnB0ciwgaW50IGxlbiwgaW50ICpsZW5wLCBpbnQgZmFpbF9vbl9lcnJvciwgQ0ZTdHJpbmdFbmNvZGluZyBmcm9tLCBDRlN0cmluZ0VuY29kaW5nIHRvLCBpbnQgKnVuY29udmxlbnApKTsKKworLyoKKyAqIEEgTWFjIHZlcnNpb24gb2Ygc3RyaW5nX2NvbnZlcnRfZXh0KCkgZm9yIHNwZWNpYWwgY2FzZXMuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK21hY19zdHJpbmdfY29udmVydChwdHIsIGxlbiwgbGVucCwgZmFpbF9vbl9lcnJvciwgZnJvbSwgdG8sIHVuY29udmxlbnApCisgICAgY2hhcl91CQkqcHRyOworICAgIGludAkJCWxlbjsKKyAgICBpbnQJCQkqbGVucDsKKyAgICBpbnQJCQlmYWlsX29uX2Vycm9yOworICAgIENGU3RyaW5nRW5jb2RpbmcJZnJvbTsKKyAgICBDRlN0cmluZ0VuY29kaW5nCXRvOworICAgIGludAkJCSp1bmNvbnZsZW5wOworeworICAgIGNoYXJfdQkJKnJldHZhbCwgKmQ7CisgICAgQ0ZTdHJpbmdSZWYJCWNmc3RyOworICAgIGludAkJCWJ1ZmxlbiwgaW4sIG91dCwgbCwgaTsKKworICAgIGlmICh1bmNvbnZsZW5wICE9IE5VTEwpCisJKnVuY29udmxlbnAgPSAwOworICAgIGNmc3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoTlVMTCwgcHRyLCBsZW4sIGZyb20sIDApOworICAgIC8qIFdoZW4gY29udmVyc2lvbiBmYWlsZWQsIHRyeSBleGNsdWRpbmcgYnl0ZXMgZnJvbSB0aGUgZW5kLCBoZWxwcyB3aGVuCisgICAgICogdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBieXRlIHNlcXVlbmNlLiAgT25seSBkbyB1cCB0byA2IGJ5dGVzIHRvIGF2b2lkCisgICAgICogbG9vcGluZyBhIGxvbmcgdGltZSB3aGVuIHRoZXJlIHJlYWxseSBpcyBzb21ldGhpbmcgdW5jb252ZXJ0YWJsZS4gKi8KKyAgICB3aGlsZSAoY2ZzdHIgPT0gTlVMTCAmJiB1bmNvbnZsZW5wICE9IE5VTEwgJiYgbGVuID4gMSAmJiAqdW5jb252bGVucCA8IDYpCisgICAgeworCS0tbGVuOworCSsrKnVuY29udmxlbnA7CisJY2ZzdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyhOVUxMLCBwdHIsIGxlbiwgZnJvbSwgMCk7CisgICAgfQorICAgIGlmIChjZnN0ciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIGlmICh0byA9PSBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpCisJYnVmbGVuID0gbGVuICogNiArIDE7CisgICAgZWxzZQorCWJ1ZmxlbiA9IGxlbiArIDE7CisgICAgcmV0dmFsID0gYWxsb2MoYnVmbGVuKTsKKyAgICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgeworCUNGUmVsZWFzZShjZnN0cik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghQ0ZTdHJpbmdHZXRDU3RyaW5nKGNmc3RyLCByZXR2YWwsIGJ1ZmxlbiwgdG8pKQorICAgIHsKKwlDRlJlbGVhc2UoY2ZzdHIpOworCWlmIChmYWlsX29uX2Vycm9yKQorCXsKKwkgICAgdmltX2ZyZWUocmV0dmFsKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisJLyogY29udmVyc2lvbiBmYWlsZWQgZm9yIHRoZSB3aG9sZSBzdHJpbmcsIGJ1dCBtYXliZSBpdCB3aWxsIHdvcmsKKwkgKiBmb3IgZWFjaCBjaGFyYWN0ZXIgKi8KKwlmb3IgKGQgPSByZXR2YWwsIGluID0gMCwgb3V0ID0gMDsgaW4gPCBsZW4gJiYgb3V0IDwgYnVmbGVuIC0gMTspCisJeworCSAgICBpZiAoZnJvbSA9PSBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpCisJCWwgPSB1dGZfcHRyMmxlbl9jaGVjayhwdHIgKyBpbik7CisJICAgIGVsc2UKKwkJbCA9IDE7CisJICAgIGNmc3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoTlVMTCwgcHRyICsgaW4sIGwsIGZyb20sIDApOworCSAgICBpZiAoY2ZzdHIgPT0gTlVMTCkKKwkgICAgeworCQkqZCsrID0gJz8nOworCQlvdXQrKzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKCFDRlN0cmluZ0dldENTdHJpbmcoY2ZzdHIsIGQsIGJ1ZmxlbiAtIG91dCwgdG8pKQorCQl7CisJCSAgICAqZCsrID0gJz8nOworCQkgICAgb3V0Kys7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBpID0gc3RybGVuKGQpOworCQkgICAgZCArPSBpOworCQkgICAgb3V0ICs9IGk7CisJCX0KKwkJQ0ZSZWxlYXNlKGNmc3RyKTsKKwkgICAgfQorCSAgICBpbiArPSBsOworCX0KKwkqZCA9IE5VTDsKKwlpZiAobGVucCAhPSBOVUxMKQorCSAgICAqbGVucCA9IG91dDsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICBDRlJlbGVhc2UoY2ZzdHIpOworICAgIGlmIChsZW5wICE9IE5VTEwpCisJKmxlbnAgPSBzdHJsZW4ocmV0dmFsKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IHRleHQgInB0clsqbGVucF0iIGFjY29yZGluZyB0byAidmNwIi4KKyAqIFJldHVybnMgdGhlIHJlc3VsdCBpbiBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBzZXRzICIqbGVucCIuCisgKiBXaGVuICJsZW5wIiBpcyBOVUxMLCB1c2UgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAqIElsbGVnYWwgY2hhcnMgYXJlIG9mdGVuIGNoYW5nZWQgdG8gIj8iLCB1bmxlc3MgdmNwLT52Y19mYWlsIGlzIHNldC4KKyAqIFdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcsIE5VTEwgaXMgcmV0dXJuZWQgYW5kICIqbGVucCIgaXMgdW5jaGFuZ2VkLgorICovCisgICAgY2hhcl91ICoKK3N0cmluZ19jb252ZXJ0KHZjcCwgcHRyLCBsZW5wKQorICAgIHZpbWNvbnZfVAkqdmNwOworICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJKmxlbnA7Cit7CisgICAgcmV0dXJuIHN0cmluZ19jb252ZXJ0X2V4dCh2Y3AsIHB0ciwgbGVucCwgTlVMTCk7Cit9CisKKy8qCisgKiBMaWtlIHN0cmluZ19jb252ZXJ0KCksIGJ1dCB3aGVuICJ1bmNvbnZsZW5wIiBpcyBub3QgTlVMTCBhbmQgdGhlcmUgYXJlIGlzCisgKiBhbiBpbmNvbXBsZXRlIHNlcXVlbmNlIGF0IHRoZSBlbmQgaXQgaXMgbm90IGNvbnZlcnRlZCBhbmQgIip1bmNvbnZsZW5wIiBpcworICogc2V0IHRvIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzLgorICovCisgICAgY2hhcl91ICoKK3N0cmluZ19jb252ZXJ0X2V4dCh2Y3AsIHB0ciwgbGVucCwgdW5jb252bGVucCkKKyAgICB2aW1jb252X1QJKnZjcDsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCSpsZW5wOworICAgIGludAkJKnVuY29udmxlbnA7Cit7CisgICAgY2hhcl91CSpyZXR2YWwgPSBOVUxMOworICAgIGNoYXJfdQkqZDsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWk7CisgICAgaW50CQlsOworICAgIGludAkJYzsKKworICAgIGlmIChsZW5wID09IE5VTEwpCisJbGVuID0gKGludClTVFJMRU4ocHRyKTsKKyAgICBlbHNlCisJbGVuID0gKmxlbnA7CisgICAgaWYgKGxlbiA9PSAwKQorCXJldHVybiB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIiIpOworCisgICAgc3dpdGNoICh2Y3AtPnZjX3R5cGUpCisgICAgeworCWNhc2UgQ09OVl9UT19VVEY4OgkvKiBsYXRpbjEgdG8gdXRmLTggY29udmVyc2lvbiAqLworCSAgICByZXR2YWwgPSBhbGxvYyhsZW4gKiAyICsgMSk7CisJICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGQgPSByZXR2YWw7CisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkgICAgeworCQlpZiAocHRyW2ldIDwgMHg4MCkKKwkJICAgICpkKysgPSBwdHJbaV07CisJCWVsc2UKKwkJeworCQkgICAgKmQrKyA9IDB4YzAgKyAoKHVuc2lnbmVkKXB0cltpXSA+PiA2KTsKKwkJICAgICpkKysgPSAweDgwICsgKHB0cltpXSAmIDB4M2YpOworCQl9CisJICAgIH0KKwkgICAgKmQgPSBOVUw7CisJICAgIGlmIChsZW5wICE9IE5VTEwpCisJCSpsZW5wID0gKGludCkoZCAtIHJldHZhbCk7CisJICAgIGJyZWFrOworCisJY2FzZSBDT05WX1RPX0xBVElOMToJLyogdXRmLTggdG8gbGF0aW4xIGNvbnZlcnNpb24gKi8KKwkgICAgcmV0dmFsID0gYWxsb2MobGVuICsgMSk7CisJICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGQgPSByZXR2YWw7CisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkgICAgeworCQlsID0gdXRmX3B0cjJsZW5fY2hlY2socHRyICsgaSk7CisJCWlmIChsID09IDApCisJCSAgICAqZCsrID0gTlVMOworCQllbHNlIGlmIChsID09IDEpCisJCXsKKwkJICAgIGlmICh1bmNvbnZsZW5wICE9IE5VTEwgJiYgdXRmOGxlbl90YWJbcHRyW2ldXSA+IGxlbiAtIGkpCisJCSAgICB7CisJCQkvKiBJbmNvbXBsZXRlIHNlcXVlbmNlIGF0IHRoZSBlbmQuICovCisJCQkqdW5jb252bGVucCA9IGxlbiAtIGk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgICpkKysgPSBwdHJbaV07CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjID0gdXRmX3B0cjJjaGFyKHB0ciArIGkpOworCQkgICAgaWYgKCF1dGZfaXNjb21wb3NpbmcoYykpCS8qIHNraXAgY29tcG9zaW5nIGNoYXJzICovCisJCSAgICB7CisJCQlpZiAoYyA8IDB4MTAwKQorCQkJICAgICpkKysgPSBjOworCQkJZWxzZSBpZiAodmNwLT52Y19mYWlsKQorCQkJeworCQkJICAgIHZpbV9mcmVlKHJldHZhbCk7CisJCQkgICAgcmV0dXJuIE5VTEw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgKmQrKyA9IDB4YmY7CisJCQkgICAgaWYgKHV0Zl9jaGFyMmNlbGxzKGMpID4gMSkKKwkJCQkqZCsrID0gJz8nOworCQkJfQorCQkgICAgfQorCQkgICAgaSArPSBsIC0gMTsKKwkJfQorCSAgICB9CisJICAgICpkID0gTlVMOworCSAgICBpZiAobGVucCAhPSBOVUxMKQorCQkqbGVucCA9IChpbnQpKGQgLSByZXR2YWwpOworCSAgICBicmVhazsKKworIyBpZmRlZiBNQUNPU19YCisJY2FzZSBDT05WX01BQ19MQVRJTjE6CisJICAgIHJldHZhbCA9IG1hY19zdHJpbmdfY29udmVydChwdHIsIGxlbiwgbGVucCwgdmNwLT52Y19mYWlsLAorCQkJCQlrQ0ZTdHJpbmdFbmNvZGluZ01hY1JvbWFuLAorCQkJCQlrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwKKwkJCQkJdW5jb252bGVucCk7CisJICAgIGJyZWFrOworCisJY2FzZSBDT05WX0xBVElOMV9NQUM6CisJICAgIHJldHZhbCA9IG1hY19zdHJpbmdfY29udmVydChwdHIsIGxlbiwgbGVucCwgdmNwLT52Y19mYWlsLAorCQkJCQlrQ0ZTdHJpbmdFbmNvZGluZ0lTT0xhdGluMSwKKwkJCQkJa0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiwKKwkJCQkJdW5jb252bGVucCk7CisJICAgIGJyZWFrOworCisJY2FzZSBDT05WX01BQ19VVEY4OgorCSAgICByZXR2YWwgPSBtYWNfc3RyaW5nX2NvbnZlcnQocHRyLCBsZW4sIGxlbnAsIHZjcC0+dmNfZmFpbCwKKwkJCQkJa0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbiwKKwkJCQkJa0NGU3RyaW5nRW5jb2RpbmdVVEY4LAorCQkJCQl1bmNvbnZsZW5wKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIENPTlZfVVRGOF9NQUM6CisJICAgIHJldHZhbCA9IG1hY19zdHJpbmdfY29udmVydChwdHIsIGxlbiwgbGVucCwgdmNwLT52Y19mYWlsLAorCQkJCQlrQ0ZTdHJpbmdFbmNvZGluZ1VURjgsCisJCQkJCWtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4sCisJCQkJCXVuY29udmxlbnApOworCSAgICBicmVhazsKKyMgZW5kaWYKKworIyBpZmRlZiBVU0VfSUNPTlYKKwljYXNlIENPTlZfSUNPTlY6CS8qIGNvbnZlcnNpb24gd2l0aCBvdXRwdXRfY29udi52Y19mZCAqLworCSAgICByZXR2YWwgPSBpY29udl9zdHJpbmcodmNwLCBwdHIsIGxlbiwgdW5jb252bGVucCk7CisJICAgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiBsZW5wICE9IE5VTEwpCisJCSpsZW5wID0gKGludClTVFJMRU4ocmV0dmFsKTsKKwkgICAgYnJlYWs7CisjIGVuZGlmCisjIGlmZGVmIFdJTjMyNjQKKwljYXNlIENPTlZfQ09ERVBBR0U6CQkvKiBjb2RlcGFnZSAtPiBjb2RlcGFnZSAqLworCXsKKwkgICAgaW50CQlyZXRsZW47CisJICAgIGludAkJdG1wX2xlbjsKKwkgICAgc2hvcnRfdQkqdG1wOworCisJICAgIC8qIDEuIGNvZGVwYWdlL1VURi04ICAtPiAgdWNzLTIuICovCisJICAgIGlmICh2Y3AtPnZjX2NwZnJvbSA9PSAwKQorCQl0bXBfbGVuID0gdXRmOF90b191Y3MyKHB0ciwgbGVuLCBOVUxMLCBOVUxMKTsKKwkgICAgZWxzZQorCQl0bXBfbGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcih2Y3AtPnZjX2NwZnJvbSwgMCwKKwkJCQkJCQkgICAgICBwdHIsIGxlbiwgMCwgMCk7CisJICAgIHRtcCA9IChzaG9ydF91ICopYWxsb2Moc2l6ZW9mKHNob3J0X3UpICogdG1wX2xlbik7CisJICAgIGlmICh0bXAgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGlmICh2Y3AtPnZjX2NwZnJvbSA9PSAwKQorCQl1dGY4X3RvX3VjczIocHRyLCBsZW4sIHRtcCwgdW5jb252bGVucCk7CisJICAgIGVsc2UKKwkJTXVsdGlCeXRlVG9XaWRlQ2hhcih2Y3AtPnZjX2NwZnJvbSwgMCwgcHRyLCBsZW4sIHRtcCwgdG1wX2xlbik7CisKKwkgICAgLyogMi4gdWNzLTIgIC0+ICBjb2RlcGFnZS9VVEYtOC4gKi8KKwkgICAgaWYgKHZjcC0+dmNfY3B0byA9PSAwKQorCQlyZXRsZW4gPSB1Y3MyX3RvX3V0ZjgodG1wLCB0bXBfbGVuLCBOVUxMKTsKKwkgICAgZWxzZQorCQlyZXRsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKHZjcC0+dmNfY3B0bywgMCwKKwkJCQkJCSAgICB0bXAsIHRtcF9sZW4sIDAsIDAsIDAsIDApOworCSAgICByZXR2YWwgPSBhbGxvYyhyZXRsZW4gKyAxKTsKKwkgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJCWlmICh2Y3AtPnZjX2NwdG8gPT0gMCkKKwkJICAgIHVjczJfdG9fdXRmOCh0bXAsIHRtcF9sZW4sIHJldHZhbCk7CisJCWVsc2UKKwkJICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUodmNwLT52Y19jcHRvLCAwLAorCQkJCQkgIHRtcCwgdG1wX2xlbiwgcmV0dmFsLCByZXRsZW4sIDAsIDApOworCQlyZXR2YWxbcmV0bGVuXSA9IE5VTDsKKwkJaWYgKGxlbnAgIT0gTlVMTCkKKwkJICAgICpsZW5wID0gcmV0bGVuOworCSAgICB9CisJICAgIHZpbV9mcmVlKHRtcCk7CisJICAgIGJyZWFrOworCX0KKyMgZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVtZmlsZS5jIGIvc3JjL21lbWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQxODMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21lbWZpbGUuYwpAQCAtMCwwICsxLDEzMTIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIG1lbWZpbGUuYzogQ29udGFpbnMgdGhlIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgYmxvY2tzIG9mIG1lbW9yeSB3aGljaCBjYW4KKyAqIGJlIHN0b3JlZCBpbiBhIGZpbGUuIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgc29ydCBvZiB2aXJ0dWFsIG1lbW9yeS4KKyAqCisgKiBBIG1lbWZpbGUgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBibG9ja3MuIFRoZSBibG9ja3MgbnVtYmVyZWQgZnJvbSAwCisgKiB1cHdhcmRzIGhhdmUgYmVlbiBhc3NpZ25lZCBhIHBsYWNlIGluIHRoZSBhY3R1YWwgZmlsZS4gVGhlIGJsb2NrIG51bWJlcgorICogaXMgZXF1YWwgdG8gdGhlIHBhZ2UgbnVtYmVyIGluIHRoZSBmaWxlLiBUaGUKKyAqIGJsb2NrcyB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgYXJlIGN1cnJlbnRseSBpbiBtZW1vcnkgb25seS4gVGhleSBjYW4gYmUKKyAqIGFzc2lnbmVkIGEgcGxhY2UgaW4gdGhlIGZpbGUgd2hlbiB0b28gbXVjaCBtZW1vcnkgaXMgYmVpbmcgdXNlZC4gQXQgdGhhdAorICogbW9tZW50IHRoZXkgZ2V0IGEgbmV3LCBwb3NpdGl2ZSwgbnVtYmVyLiBBIGxpc3QgaXMgdXNlZCBmb3IgdHJhbnNsYXRpb24gb2YKKyAqIG5lZ2F0aXZlIHRvIHBvc2l0aXZlIG51bWJlcnMuCisgKgorICogVGhlIHNpemUgb2YgYSBibG9jayBpcyBhIG11bHRpcGxlIG9mIGEgcGFnZSBzaXplLCBub3JtYWxseSB0aGUgcGFnZSBzaXplIG9mCisgKiB0aGUgZGV2aWNlIHRoZSBmaWxlIGlzIG9uLiBNb3N0IGJsb2NrcyBhcmUgMSBwYWdlIGxvbmcuIEEgQmxvY2sgb2YgbXVsdGlwbGUKKyAqIHBhZ2VzIGlzIHVzZWQgZm9yIGEgbGluZSB0aGF0IGRvZXMgbm90IGZpdCBpbiBhIHNpbmdsZSBwYWdlLgorICoKKyAqIEVhY2ggYmxvY2sgY2FuIGJlIGluIG1lbW9yeSBhbmQvb3IgaW4gYSBmaWxlLiBUaGUgYmxvY2sgc3RheXMgaW4gbWVtb3J5CisgKiBhcyBsb25nIGFzIGl0IGlzIGxvY2tlZC4gSWYgaXQgaXMgbm8gbG9uZ2VyIGxvY2tlZCBpdCBjYW4gYmUgc3dhcHBlZCBvdXQgdG8KKyAqIHRoZSBmaWxlLiBJdCBpcyBvbmx5IHdyaXR0ZW4gdG8gdGhlIGZpbGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZC4KKyAqCisgKiBVbmRlciBub3JtYWwgb3BlcmF0aW9uIHRoZSBmaWxlIGlzIGNyZWF0ZWQgd2hlbiBvcGVuaW5nIHRoZSBtZW1vcnkgZmlsZSBhbmQKKyAqIGRlbGV0ZWQgd2hlbiBjbG9zaW5nIHRoZSBtZW1vcnkgZmlsZS4gT25seSB3aXRoIHJlY292ZXJ5IGFuIGV4aXN0aW5nIG1lbW9yeQorICogZmlsZSBpcyBvcGVuZWQuCisgKi8KKworI2lmIGRlZmluZWQgTVNET1MgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjIGluY2x1ZGUgPGlvLmg+CS8qIGZvciBsc2VlaygpLCBtdXN0IGJlIGJlZm9yZSB2aW0uaCAqLworI2VuZGlmCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKy8qCisgKiBTb21lIHN5c3RlbXMgaGF2ZSB0aGUgcGFnZSBzaXplIGluIHN0YXRmcy5mX2JzaXplLCBzb21lIGluIHN0YXQuc3RfYmxrc2l6ZQorICovCisjaWZkZWYgSEFWRV9TVF9CTEtTSVpFCisjIGRlZmluZSBTVEFURlMgc3RhdAorIyBkZWZpbmUgRl9CU0laRSBzdF9ibGtzaXplCisjIGRlZmluZSBmc3RhdGZzKGZkLCBidWYsIGxlbiwgbnVsKSBtY2hfZnN0YXQoKGZkKSwgKGJ1ZikpCisjZWxzZQorIyBpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorIyAgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorIyAgZGVmaW5lIFNUQVRGUyBzdGF0ZnMKKyMgIGRlZmluZSBGX0JTSVpFIGZfYnNpemUKKyMgIGlmZGVmIF9fTUlOVF9fCQkvKiBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/ICovCisjICAgZGVmaW5lIGZzdGF0ZnMoZmQsIGJ1ZiwgbGVuLCBudWwpIG1jaF9mc3RhdCgoZmQpLCAoYnVmKSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIGZvciBBbWlnYSBEb3MgMi4weCB3ZSB1c2UgRmx1c2gKKyAqLworI2lmZGVmIEFNSUdBCisjIGlmZGVmIEZFQVRfQVJQCitleHRlcm4gaW50IGRvczI7CQkJLyogdGhpcyBpcyBpbiBvc19hbWlnYS5jICovCisjIGVuZGlmCisjIGlmZGVmIFNBU0MKKyMgIGluY2x1ZGUgPHByb3RvL2Rvcy5oPgorIyAgaW5jbHVkZSA8aW9zMS5oPgkJCS8qIGZvciBjaGt1ZmIoKSAqLworIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTUVNRklMRV9QQUdFX1NJWkUgNDA5NgkJLyogZGVmYXVsdCBwYWdlIHNpemUgKi8KKworc3RhdGljIGxvbmdfdQl0b3RhbF9tZW1fdXNlZCA9IDA7CS8qIHRvdGFsIG1lbW9yeSB1c2VkIGZvciBtZW1maWxlcyAqLworc3RhdGljIGludAlkb250X3JlbGVhc2UgPSBGQUxTRTsJLyogZG9uJ3QgcmVsZWFzZSBibG9ja3MgKi8KKworc3RhdGljIHZvaWQgbWZfaW5zX2hhc2ggX19BUkdTKChtZW1maWxlX1QgKiwgYmhkcl9UICopKTsKK3N0YXRpYyB2b2lkIG1mX3JlbV9oYXNoIF9fQVJHUygobWVtZmlsZV9UICosIGJoZHJfVCAqKSk7CitzdGF0aWMgYmhkcl9UICptZl9maW5kX2hhc2ggX19BUkdTKChtZW1maWxlX1QgKiwgYmxvY2tucl9UKSk7CitzdGF0aWMgdm9pZCBtZl9pbnNfdXNlZCBfX0FSR1MoKG1lbWZpbGVfVCAqLCBiaGRyX1QgKikpOworc3RhdGljIHZvaWQgbWZfcmVtX3VzZWQgX19BUkdTKChtZW1maWxlX1QgKiwgYmhkcl9UICopKTsKK3N0YXRpYyBiaGRyX1QgKm1mX3JlbGVhc2UgX19BUkdTKChtZW1maWxlX1QgKiwgaW50KSk7CitzdGF0aWMgYmhkcl9UICptZl9hbGxvY19iaGRyIF9fQVJHUygobWVtZmlsZV9UICosIGludCkpOworc3RhdGljIHZvaWQgbWZfZnJlZV9iaGRyIF9fQVJHUygoYmhkcl9UICopKTsKK3N0YXRpYyB2b2lkIG1mX2luc19mcmVlIF9fQVJHUygobWVtZmlsZV9UICosIGJoZHJfVCAqKSk7CitzdGF0aWMgYmhkcl9UICptZl9yZW1fZnJlZSBfX0FSR1MoKG1lbWZpbGVfVCAqKSk7CitzdGF0aWMgaW50ICBtZl9yZWFkIF9fQVJHUygobWVtZmlsZV9UICosIGJoZHJfVCAqKSk7CitzdGF0aWMgaW50ICBtZl93cml0ZSBfX0FSR1MoKG1lbWZpbGVfVCAqLCBiaGRyX1QgKikpOworc3RhdGljIGludCAgbWZfdHJhbnNfYWRkIF9fQVJHUygobWVtZmlsZV9UICosIGJoZHJfVCAqKSk7CitzdGF0aWMgdm9pZCBtZl9kb19vcGVuIF9fQVJHUygobWVtZmlsZV9UICosIGNoYXJfdSAqLCBpbnQpKTsKKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgZm9yIHVzaW5nIGEgbWVtZmlsZToKKyAqCisgKiBtZl9vcGVuKCkJICAgIG9wZW4gYSBuZXcgb3IgZXhpc3RpbmcgbWVtZmlsZQorICogbWZfb3Blbl9maWxlKCkgICBvcGVuIGEgc3dhcCBmaWxlIGZvciBhbiBleGlzdGluZyBtZW1maWxlCisgKiBtZl9jbG9zZSgpCSAgICBjbG9zZSAoYW5kIGRlbGV0ZSkgYSBtZW1maWxlCisgKiBtZl9uZXcoKQkgICAgY3JlYXRlIGEgbmV3IGJsb2NrIGluIGEgbWVtZmlsZSBhbmQgbG9jayBpdAorICogbWZfZ2V0KCkJICAgIGdldCBhbiBleGlzdGluZyBibG9jayBhbmQgbG9jayBpdAorICogbWZfcHV0KCkJICAgIHVubG9jayBhIGJsb2NrLCBtYXkgYmUgbWFya2VkIGZvciB3cml0aW5nCisgKiBtZl9mcmVlKCkJICAgIHJlbW92ZSBhIGJsb2NrCisgKiBtZl9zeW5jKCkJICAgIHN5bmMgY2hhbmdlZCBwYXJ0cyBvZiBtZW1maWxlIHRvIGRpc2sKKyAqIG1mX3JlbGVhc2VfYWxsKCkgcmVsZWFzZSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZQorICogbWZfdHJhbnNfZGVsKCkgICBtYXkgdHJhbnNsYXRlIG5lZ2F0aXZlIHRvIHBvc2l0aXZlIGJsb2NrIG51bWJlcgorICogbWZfZnVsbG5hbWUoKSAgICBtYWtlIGZpbGUgbmFtZSBmdWxsIHBhdGggKHVzZSBiZWZvcmUgZmlyc3QgOmNkKQorICovCisKKy8qCisgKiBPcGVuIGFuIGV4aXN0aW5nIG9yIG5ldyBtZW1vcnkgYmxvY2sgZmlsZS4KKyAqCisgKiAgZm5hbWU6CW5hbWUgb2YgZmlsZSB0byB1c2UgKE5VTEwgbWVhbnMgbm8gZmlsZSBhdCBhbGwpCisgKgkJTm90ZTogZm5hbWUgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkLCBpdCBpcyBub3QgY29waWVkIQorICoJCQlJZiBvcGVuaW5nIHRoZSBmaWxlIGZhaWxzLCBmbmFtZSBpcyBmcmVlZC4KKyAqICBmbGFnczoJZmxhZ3MgZm9yIG9wZW4oKSBjYWxsCisgKgorICogIElmIGZuYW1lICE9IE5VTEwgYW5kIGZpbGUgY2Fubm90IGJlIG9wZW5lZCwgZmFpbC4KKyAqCisgKiByZXR1cm4gdmFsdWU6IGlkZW50aWZpZXIgZm9yIHRoaXMgbWVtb3J5IGJsb2NrIGZpbGUuCisgKi8KKyAgICBtZW1maWxlX1QgKgorbWZfb3BlbihmbmFtZSwgZmxhZ3MpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCWZsYWdzOworeworICAgIG1lbWZpbGVfVAkJKm1mcDsKKyAgICBpbnQJCQlpOworICAgIG9mZl90CQlzaXplOworI2lmIGRlZmluZWQoU1RBVEZTKSAmJiBkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKF9fUU5YX18pCisjIGRlZmluZSBVU0VfRlNUQVRGUworICAgIHN0cnVjdCBTVEFURlMJc3RmOworI2VuZGlmCisKKyAgICBpZiAoKG1mcCA9IChtZW1maWxlX1QgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKG1lbWZpbGVfVCkpKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKGZuYW1lID09IE5VTEwpCSAgICAvKiBubyBmaWxlIGZvciB0aGlzIG1lbWZpbGUsIHVzZSBtZW1vcnkgb25seSAqLworICAgIHsKKwltZnAtPm1mX2ZuYW1lID0gTlVMTDsKKwltZnAtPm1mX2ZmbmFtZSA9IE5VTEw7CisJbWZwLT5tZl9mZCA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW1mX2RvX29wZW4obWZwLCBmbmFtZSwgZmxhZ3MpOwkvKiB0cnkgdG8gb3BlbiB0aGUgZmlsZSAqLworCisJLyogaWYgdGhlIGZpbGUgY2Fubm90IGJlIG9wZW5lZCwgcmV0dXJuIGhlcmUgKi8KKwlpZiAobWZwLT5tZl9mZCA8IDApCisJeworCSAgICB2aW1fZnJlZShtZnApOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgbWZwLT5tZl9mcmVlX2ZpcnN0ID0gTlVMTDsJCS8qIGZyZWUgbGlzdCBpcyBlbXB0eSAqLworICAgIG1mcC0+bWZfdXNlZF9maXJzdCA9IE5VTEw7CQkvKiB1c2VkIGxpc3QgaXMgZW1wdHkgKi8KKyAgICBtZnAtPm1mX3VzZWRfbGFzdCA9IE5VTEw7CisgICAgbWZwLT5tZl9kaXJ0eSA9IEZBTFNFOworICAgIG1mcC0+bWZfdXNlZF9jb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1FTUhBU0hTSVpFOyArK2kpCisgICAgeworCW1mcC0+bWZfaGFzaFtpXSA9IE5VTEw7CQkvKiBoYXNoIGxpc3RzIGFyZSBlbXB0eSAqLworCW1mcC0+bWZfdHJhbnNbaV0gPSBOVUxMOwkvKiB0cmFucyBsaXN0cyBhcmUgZW1wdHkgKi8KKyAgICB9CisgICAgbWZwLT5tZl9wYWdlX3NpemUgPSBNRU1GSUxFX1BBR0VfU0laRTsKKworI2lmZGVmIFVTRV9GU1RBVEZTCisgICAgLyoKKyAgICAgKiBUcnkgdG8gc2V0IHRoZSBwYWdlIHNpemUgZXF1YWwgdG8gdGhlIGJsb2NrIHNpemUgb2YgdGhlIGRldmljZS4KKyAgICAgKiBTcGVlZHMgdXAgSS9PIGEgbG90LgorICAgICAqIFdoZW4gcmVjb3ZlcmluZywgdGhlIGFjdHVhbCBibG9jayBzaXplIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gYmxvY2sgMAorICAgICAqIGluIG1sX3JlY292ZXIoKS4gIFRoZSBzaXplIHVzZWQgaGVyZSBtYXkgYmUgd3JvbmcsIHRoZXJlZm9yZQorICAgICAqIG1mX2Jsb2NrbnJfbWF4IG11c3QgYmUgcm91bmRlZCB1cC4KKyAgICAgKi8KKyAgICBpZiAobWZwLT5tZl9mZCA+PSAwCisJICAgICYmIGZzdGF0ZnMobWZwLT5tZl9mZCwgJnN0Ziwgc2l6ZW9mKHN0cnVjdCBzdGF0ZnMpLCAwKSA9PSAwCisJICAgICYmIHN0Zi5GX0JTSVpFID49IE1JTl9TV0FQX1BBR0VfU0laRQorCSAgICAmJiBzdGYuRl9CU0laRSA8PSBNQVhfU1dBUF9QQUdFX1NJWkUpCisJbWZwLT5tZl9wYWdlX3NpemUgPSBzdGYuRl9CU0laRTsKKyNlbmRpZgorCisgICAgaWYgKG1mcC0+bWZfZmQgPCAwIHx8IChmbGFncyAmIChPX1RSVU5DfE9fRVhDTCkpCisJCSAgICAgIHx8IChzaXplID0gbHNlZWsobWZwLT5tZl9mZCwgKG9mZl90KTBMLCBTRUVLX0VORCkpIDw9IDApCisJbWZwLT5tZl9ibG9ja25yX21heCA9IDA7CS8qIG5vIGZpbGUgb3IgZW1wdHkgZmlsZSAqLworICAgIGVsc2UKKwltZnAtPm1mX2Jsb2NrbnJfbWF4ID0gKGJsb2NrbnJfVCkoKHNpemUgKyBtZnAtPm1mX3BhZ2Vfc2l6ZSAtIDEpCisJCQkJCQkJIC8gbWZwLT5tZl9wYWdlX3NpemUpOworICAgIG1mcC0+bWZfYmxvY2tucl9taW4gPSAtMTsKKyAgICBtZnAtPm1mX25lZ19jb3VudCA9IDA7CisgICAgbWZwLT5tZl9pbmZpbGVfY291bnQgPSBtZnAtPm1mX2Jsb2NrbnJfbWF4OworICAgIG1mcC0+bWZfdXNlZF9jb3VudF9tYXggPSBwX21tICogMTAyNCAvIG1mcC0+bWZfcGFnZV9zaXplOworCisgICAgcmV0dXJuIG1mcDsKK30KKworLyoKKyAqIE9wZW4gYSBmaWxlIGZvciBhbiBleGlzdGluZyBtZW1maWxlLiAgVXNlZCB3aGVuIHVwZGF0ZWNvdW50IHNldCBmcm9tIDAgdG8KKyAqIHNvbWUgdmFsdWUuCisgKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmYWlscy4KKyAqICJmbmFtZSIgaXMgdGhlIG5hbWUgb2YgZmlsZSB0byB1c2UgKE5VTEwgbWVhbnMgbm8gZmlsZSBhdCBhbGwpCisgKiBOb3RlOiAiZm5hbWUiIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgaXQgaXMgbm90IGNvcGllZCEgIElmIG9wZW5pbmcgdGhlCisgKiBmaWxlIGZhaWxzLCAiZm5hbWUiIGlzIGZyZWVkLgorICoKKyAqIHJldHVybiB2YWx1ZTogRkFJTCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CittZl9vcGVuX2ZpbGUobWZwLCBmbmFtZSkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBjaGFyX3UJKmZuYW1lOworeworICAgIG1mX2RvX29wZW4obWZwLCBmbmFtZSwgT19SRFdSfE9fQ1JFQVR8T19FWENMKTsgLyogdHJ5IHRvIG9wZW4gdGhlIGZpbGUgKi8KKworICAgIGlmIChtZnAtPm1mX2ZkIDwgMCkKKwlyZXR1cm4gRkFJTDsKKworICAgIG1mcC0+bWZfZGlydHkgPSBUUlVFOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGNsb3NlIGEgbWVtb3J5IGZpbGUgYW5kIGRlbGV0ZSB0aGUgYXNzb2NpYXRlZCBmaWxlIGlmICdkZWxfZmlsZScgaXMgVFJVRQorICovCisgICAgdm9pZAorbWZfY2xvc2UobWZwLCBkZWxfZmlsZSkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBpbnQJCWRlbF9maWxlOworeworICAgIGJoZHJfVAkqaHAsICpuZXh0cDsKKyAgICBOUl9UUkFOUwkqdHAsICp0cG5leHQ7CisgICAgaW50CQlpOworCisgICAgaWYgKG1mcCA9PSBOVUxMKQkJICAgIC8qIHNhZmV0eSBjaGVjayAqLworCXJldHVybjsKKyAgICBpZiAobWZwLT5tZl9mZCA+PSAwKQorICAgIHsKKwlpZiAoY2xvc2UobWZwLT5tZl9mZCkgPCAwKQorCSAgICBFTVNHKF8oZV9zd2FwY2xvc2UpKTsKKyAgICB9CisgICAgaWYgKGRlbF9maWxlICYmIG1mcC0+bWZfZm5hbWUgIT0gTlVMTCkKKwltY2hfcmVtb3ZlKG1mcC0+bWZfZm5hbWUpOworCQkJCQkgICAgLyogZnJlZSBlbnRyaWVzIGluIHVzZWQgbGlzdCAqLworICAgIGZvciAoaHAgPSBtZnAtPm1mX3VzZWRfZmlyc3Q7IGhwICE9IE5VTEw7IGhwID0gbmV4dHApCisgICAgeworCXRvdGFsX21lbV91c2VkIC09IGhwLT5iaF9wYWdlX2NvdW50ICogbWZwLT5tZl9wYWdlX3NpemU7CisJbmV4dHAgPSBocC0+YmhfbmV4dDsKKwltZl9mcmVlX2JoZHIoaHApOworICAgIH0KKyAgICB3aGlsZSAobWZwLT5tZl9mcmVlX2ZpcnN0ICE9IE5VTEwpCSAgICAvKiBmcmVlIGVudHJpZXMgaW4gZnJlZSBsaXN0ICovCisJdmltX2ZyZWUobWZfcmVtX2ZyZWUobWZwKSk7CisgICAgZm9yIChpID0gMDsgaSA8IE1FTUhBU0hTSVpFOyArK2kpCSAgICAvKiBmcmVlIGVudHJpZXMgaW4gdHJhbnMgbGlzdHMgKi8KKwlmb3IgKHRwID0gbWZwLT5tZl90cmFuc1tpXTsgdHAgIT0gTlVMTDsgdHAgPSB0cG5leHQpCisJeworCSAgICB0cG5leHQgPSB0cC0+bnRfbmV4dDsKKwkgICAgdmltX2ZyZWUodHApOworCX0KKyAgICB2aW1fZnJlZShtZnAtPm1mX2ZuYW1lKTsKKyAgICB2aW1fZnJlZShtZnAtPm1mX2ZmbmFtZSk7CisgICAgdmltX2ZyZWUobWZwKTsKK30KKworLyoKKyAqIENsb3NlIHRoZSBzd2FwIGZpbGUgZm9yIGEgbWVtZmlsZS4gIFVzZWQgd2hlbiAnc3dhcGZpbGUnIGlzIHJlc2V0LgorICovCisgICAgdm9pZAorbWZfY2xvc2VfZmlsZShidWYsIGdldGxpbmVzKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlnZXRsaW5lczsJLyogZ2V0IGFsbCBsaW5lcyBpbnRvIG1lbW9yeT8gKi8KK3sKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgbWZwID0gYnVmLT5iX21sLm1sX21mcDsKKyAgICBpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tZl9mZCA8IDApCQkvKiBub3RoaW5nIHRvIGNsb3NlICovCisJcmV0dXJuOworCisgICAgaWYgKGdldGxpbmVzKQorICAgIHsKKwkvKiBnZXQgYWxsIGJsb2NrcyBpbiBtZW1vcnkgYnkgYWNjZXNzaW5nIGFsbCBsaW5lcyAoY2x1bXN5ISkgKi8KKwlkb250X3JlbGVhc2UgPSBUUlVFOworCWZvciAobG51bSA9IDE7IGxudW0gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7ICsrbG51bSkKKwkgICAgKHZvaWQpbWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKTsKKwlkb250X3JlbGVhc2UgPSBGQUxTRTsKKwkvKiBUT0RPOiBzaG91bGQgY2hlY2sgaWYgYWxsIGJsb2NrcyBhcmUgcmVhbGx5IGluIGNvcmUgKi8KKyAgICB9CisKKyAgICBpZiAoY2xvc2UobWZwLT5tZl9mZCkgPCAwKQkJCS8qIGNsb3NlIHRoZSBmaWxlICovCisJRU1TRyhfKGVfc3dhcGNsb3NlKSk7CisgICAgbWZwLT5tZl9mZCA9IC0xOworCisgICAgaWYgKG1mcC0+bWZfZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJbWNoX3JlbW92ZShtZnAtPm1mX2ZuYW1lKTsJCS8qIGRlbGV0ZSB0aGUgc3dhcCBmaWxlICovCisJdmltX2ZyZWUobWZwLT5tZl9mbmFtZSk7CisJdmltX2ZyZWUobWZwLT5tZl9mZm5hbWUpOworCW1mcC0+bWZfZm5hbWUgPSBOVUxMOworCW1mcC0+bWZfZmZuYW1lID0gTlVMTDsKKyAgICB9Cit9CisKKy8qCisgKiBTZXQgbmV3IHNpemUgZm9yIGEgbWVtZmlsZS4gIFVzZWQgd2hlbiBibG9jayAwIG9mIGEgc3dhcGZpbGUgaGFzIGJlZW4gcmVhZAorICogYW5kIHRoZSBzaXplIGl0IGluZGljYXRlcyBkaWZmZXJzIGZyb20gd2hhdCB3YXMgZ3Vlc3NlZC4KKyAqLworICAgIHZvaWQKK21mX25ld19wYWdlX3NpemUobWZwLCBuZXdfc2l6ZSkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICB1bnNpZ25lZAluZXdfc2l6ZTsKK3sKKyAgICAvKiBDb3JyZWN0IHRoZSBtZW1vcnkgdXNlZCBmb3IgYmxvY2sgMCB0byB0aGUgbmV3IHNpemUsIGJlY2F1c2UgaXQgd2lsbCBiZQorICAgICAqIGZyZWVkIHdpdGggdGhhdCBzaXplIGxhdGVyIG9uLiAqLworICAgIHRvdGFsX21lbV91c2VkICs9IG5ld19zaXplIC0gbWZwLT5tZl9wYWdlX3NpemU7CisgICAgbWZwLT5tZl9wYWdlX3NpemUgPSBuZXdfc2l6ZTsKK30KKworLyoKKyAqIGdldCBhIG5ldyBibG9jaworICoKKyAqICAgbmVnYXRpdmU6IFRSVUUgaWYgbmVnYXRpdmUgYmxvY2sgbnVtYmVyIGRlc2lyZWQgKGRhdGEgYmxvY2spCisgKi8KKyAgICBiaGRyX1QgKgorbWZfbmV3KG1mcCwgbmVnYXRpdmUsIHBhZ2VfY291bnQpCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgaW50CQluZWdhdGl2ZTsKKyAgICBpbnQJCXBhZ2VfY291bnQ7Cit7CisgICAgYmhkcl9UICAgICpocDsJICAgIC8qIG5ldyBiaGRyX1QgKi8KKyAgICBiaGRyX1QgICAgKmZyZWVwOwkgICAgLyogZmlyc3QgYmxvY2sgaW4gZnJlZSBsaXN0ICovCisgICAgY2hhcl91ICAqcDsKKworICAgIC8qCisgICAgICogSWYgd2UgcmVhY2hlZCB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgdXNlZCBtZW1vcnkgYmxvY2tzLCByZWxlYXNlIG9uZQorICAgICAqIElmIGEgYmhkcl9UIGlzIHJldHVybmVkLCB1c2UgaXQgYW5kIGFkanVzdCB0aGUgcGFnZV9jb3VudCBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgaHAgPSBtZl9yZWxlYXNlKG1mcCwgcGFnZV9jb3VudCk7CisKKy8qCisgKiBEZWNpZGUgb24gdGhlIG51bWJlciB0byB1c2U6CisgKiBJZiB0aGVyZSBpcyBhIGZyZWUgYmxvY2ssIHVzZSBpdHMgbnVtYmVyLgorICogT3RoZXJ3aXNlIHVzZSBtZl9ibG9ja19taW4gZm9yIGEgbmVnYXRpdmUgbnVtYmVyLCBtZl9ibG9ja19tYXggZm9yCisgKiBhIHBvc2l0aXZlIG51bWJlci4KKyAqLworICAgIGZyZWVwID0gbWZwLT5tZl9mcmVlX2ZpcnN0OworICAgIGlmICghbmVnYXRpdmUgJiYgZnJlZXAgIT0gTlVMTCAmJiBmcmVlcC0+YmhfcGFnZV9jb3VudCA+PSBwYWdlX2NvdW50KQorICAgIHsKKwkvKgorCSAqIElmIHRoZSBibG9jayBpbiB0aGUgZnJlZSBsaXN0IGhhcyBtb3JlIHBhZ2VzLCB0YWtlIG9ubHkgdGhlIG51bWJlcgorCSAqIG9mIHBhZ2VzIG5lZWRlZCBhbmQgYWxsb2NhdGUgYSBuZXcgYmhkcl9UIHdpdGggZGF0YQorCSAqCisJICogSWYgdGhlIG51bWJlciBvZiBwYWdlcyBtYXRjaGVzIGFuZCBtZl9yZWxlYXNlIGRpZCBub3QgcmV0dXJuIGEgYmhkcl9ULAorCSAqIHVzZSB0aGUgYmhkcl9UIGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgYWxsb2NhdGUgdGhlIGRhdGEKKwkgKgorCSAqIElmIHRoZSBudW1iZXIgb2YgcGFnZXMgbWF0Y2hlcyBhbmQgbWZfcmVsZWFzZSByZXR1cm5lZCBhIGJoZHJfVCwKKwkgKiBqdXN0IHVzZSB0aGUgbnVtYmVyIGFuZCBmcmVlIHRoZSBiaGRyX1QgZnJvbSB0aGUgZnJlZSBsaXN0CisJICovCisJaWYgKGZyZWVwLT5iaF9wYWdlX2NvdW50ID4gcGFnZV9jb3VudCkKKwl7CisJICAgIGlmIChocCA9PSBOVUxMICYmIChocCA9IG1mX2FsbG9jX2JoZHIobWZwLCBwYWdlX2NvdW50KSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJICAgIGhwLT5iaF9ibnVtID0gZnJlZXAtPmJoX2JudW07CisJICAgIGZyZWVwLT5iaF9ibnVtICs9IHBhZ2VfY291bnQ7CisJICAgIGZyZWVwLT5iaF9wYWdlX2NvdW50IC09IHBhZ2VfY291bnQ7CisJfQorCWVsc2UgaWYgKGhwID09IE5VTEwpCSAgICAvKiBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBibG9jayAqLworCXsKKwkgICAgaWYgKChwID0gKGNoYXJfdSAqKWFsbG9jKG1mcC0+bWZfcGFnZV9zaXplICogcGFnZV9jb3VudCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSAgICBocCA9IG1mX3JlbV9mcmVlKG1mcCk7CisJICAgIGhwLT5iaF9kYXRhID0gcDsKKwl9CisJZWxzZQkJICAgIC8qIHVzZSB0aGUgbnVtYmVyLCByZW1vdmUgZW50cnkgZnJvbSBmcmVlIGxpc3QgKi8KKwl7CisJICAgIGZyZWVwID0gbWZfcmVtX2ZyZWUobWZwKTsKKwkgICAgaHAtPmJoX2JudW0gPSBmcmVlcC0+YmhfYm51bTsKKwkgICAgdmltX2ZyZWUoZnJlZXApOworCX0KKyAgICB9CisgICAgZWxzZQkvKiBnZXQgYSBuZXcgbnVtYmVyICovCisgICAgeworCWlmIChocCA9PSBOVUxMICYmIChocCA9IG1mX2FsbG9jX2JoZHIobWZwLCBwYWdlX2NvdW50KSkgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJaWYgKG5lZ2F0aXZlKQorCXsKKwkgICAgaHAtPmJoX2JudW0gPSBtZnAtPm1mX2Jsb2NrbnJfbWluLS07CisJICAgIG1mcC0+bWZfbmVnX2NvdW50Kys7CisJfQorCWVsc2UKKwl7CisJICAgIGhwLT5iaF9ibnVtID0gbWZwLT5tZl9ibG9ja25yX21heDsKKwkgICAgbWZwLT5tZl9ibG9ja25yX21heCArPSBwYWdlX2NvdW50OworCX0KKyAgICB9CisgICAgaHAtPmJoX2ZsYWdzID0gQkhfTE9DS0VEIHwgQkhfRElSVFk7CS8qIG5ldyBibG9jayBpcyBhbHdheXMgZGlydHkgKi8KKyAgICBtZnAtPm1mX2RpcnR5ID0gVFJVRTsKKyAgICBocC0+YmhfcGFnZV9jb3VudCA9IHBhZ2VfY291bnQ7CisgICAgbWZfaW5zX3VzZWQobWZwLCBocCk7CisgICAgbWZfaW5zX2hhc2gobWZwLCBocCk7CisKKyAgICAvKgorICAgICAqIEluaXQgdGhlIGRhdGEgdG8gYWxsIHplcm8sIHRvIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLgorICAgICAqIFRoaXMgYWxzbyBhdm9pZHMgdGhhdCB0aGUgcGFzc3dkIGZpbGUgZW5kcyB1cCBpbiB0aGUgc3dhcCBmaWxlIQorICAgICAqLworICAgICh2b2lkKXZpbV9tZW1zZXQoKGNoYXIgKikoaHAtPmJoX2RhdGEpLCAwLCAoc2l6ZV90KW1mcC0+bWZfcGFnZV9zaXplKTsKKworICAgIHJldHVybiBocDsKK30KKworLyoKKyAqIGdldCBleGlzdGluZyBibG9jayAnbnInIHdpdGggJ3BhZ2VfY291bnQnIHBhZ2VzCisgKgorICogTm90ZTogVGhlIGNhbGxlciBzaG91bGQgZmlyc3QgY2hlY2sgYSBuZWdhdGl2ZSBuciB3aXRoIG1mX3RyYW5zX2RlbCgpCisgKi8KKyAgICBiaGRyX1QgKgorbWZfZ2V0KG1mcCwgbnIsIHBhZ2VfY291bnQpCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmxvY2tucl9UCW5yOworICAgIGludAkJcGFnZV9jb3VudDsKK3sKKyAgICBiaGRyX1QgICAgKmhwOworCQkJCQkJLyogZG9lc24ndCBleGlzdCAqLworICAgIGlmIChuciA+PSBtZnAtPm1mX2Jsb2NrbnJfbWF4IHx8IG5yIDw9IG1mcC0+bWZfYmxvY2tucl9taW4pCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIHNlZSBpZiBpdCBpcyBpbiB0aGUgY2FjaGUKKyAgICAgKi8KKyAgICBocCA9IG1mX2ZpbmRfaGFzaChtZnAsIG5yKTsKKyAgICBpZiAoaHAgPT0gTlVMTCkJLyogbm90IGluIHRoZSBoYXNoIGxpc3QgKi8KKyAgICB7CisJaWYgKG5yIDwgMCB8fCBuciA+PSBtZnAtPm1mX2luZmlsZV9jb3VudCkgICAvKiBjYW4ndCBiZSBpbiB0aGUgZmlsZSAqLworCSAgICByZXR1cm4gTlVMTDsKKworCS8qIGNvdWxkIGNoZWNrIGhlcmUgaWYgdGhlIGJsb2NrIGlzIGluIHRoZSBmcmVlIGxpc3QgKi8KKworCS8qCisJICogQ2hlY2sgaWYgd2UgbmVlZCB0byBmbHVzaCBhbiBleGlzdGluZyBibG9jay4KKwkgKiBJZiBzbywgdXNlIHRoYXQgYmxvY2suCisJICogSWYgbm90LCBhbGxvY2F0ZSBhIG5ldyBibG9jay4KKwkgKi8KKwlocCA9IG1mX3JlbGVhc2UobWZwLCBwYWdlX2NvdW50KTsKKwlpZiAoaHAgPT0gTlVMTCAmJiAoaHAgPSBtZl9hbGxvY19iaGRyKG1mcCwgcGFnZV9jb3VudCkpID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCisJaHAtPmJoX2JudW0gPSBucjsKKwlocC0+YmhfZmxhZ3MgPSAwOworCWhwLT5iaF9wYWdlX2NvdW50ID0gcGFnZV9jb3VudDsKKwlpZiAobWZfcmVhZChtZnAsIGhwKSA9PSBGQUlMKQkgICAgLyogY2Fubm90IHJlYWQgdGhlIGJsb2NrISAqLworCXsKKwkgICAgbWZfZnJlZV9iaGRyKGhwKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCW1mX3JlbV91c2VkKG1mcCwgaHApOwkvKiByZW1vdmUgZnJvbSBsaXN0LCBpbnNlcnQgaW4gZnJvbnQgYmVsb3cgKi8KKwltZl9yZW1faGFzaChtZnAsIGhwKTsKKyAgICB9CisKKyAgICBocC0+YmhfZmxhZ3MgfD0gQkhfTE9DS0VEOworICAgIG1mX2luc191c2VkKG1mcCwgaHApOwkvKiBwdXQgaW4gZnJvbnQgb2YgdXNlZCBsaXN0ICovCisgICAgbWZfaW5zX2hhc2gobWZwLCBocCk7CS8qIHB1dCBpbiBmcm9udCBvZiBoYXNoIGxpc3QgKi8KKworICAgIHJldHVybiBocDsKK30KKworLyoKKyAqIHJlbGVhc2UgdGhlIGJsb2NrICpocAorICoKKyAqICAgZGlydHk6IEJsb2NrIG11c3QgYmUgd3JpdHRlbiB0byBmaWxlIGxhdGVyCisgKiAgIGluZmlsZTogQmxvY2sgc2hvdWxkIGJlIGluIGZpbGUgKG5lZWRlZCBmb3IgcmVjb3ZlcnkpCisgKgorICogIG5vIHJldHVybiB2YWx1ZSwgZnVuY3Rpb24gY2Fubm90IGZhaWwKKyAqLworICAgIHZvaWQKK21mX3B1dChtZnAsIGhwLCBkaXJ0eSwgaW5maWxlKQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGJoZHJfVAkqaHA7CisgICAgaW50CQlkaXJ0eTsKKyAgICBpbnQJCWluZmlsZTsKK3sKKyAgICBpbnQJCWZsYWdzOworCisgICAgZmxhZ3MgPSBocC0+YmhfZmxhZ3M7CisKKyAgICBpZiAoKGZsYWdzICYgQkhfTE9DS0VEKSA9PSAwKQorCUVNU0coXygiRTI5MzogYmxvY2sgd2FzIG5vdCBsb2NrZWQiKSk7CisgICAgZmxhZ3MgJj0gfkJIX0xPQ0tFRDsKKyAgICBpZiAoZGlydHkpCisgICAgeworCWZsYWdzIHw9IEJIX0RJUlRZOworCW1mcC0+bWZfZGlydHkgPSBUUlVFOworICAgIH0KKyAgICBocC0+YmhfZmxhZ3MgPSBmbGFnczsKKyAgICBpZiAoaW5maWxlKQorCW1mX3RyYW5zX2FkZChtZnAsIGhwKTsJICAgIC8qIG1heSB0cmFuc2xhdGUgbmVnYXRpdmUgaW4gcG9zaXRpdmUgbnIgKi8KK30KKworLyoKKyAqIGJsb2NrICpocCBpcyBubyBsb25nZXIgaW4gdXNlZCwgbWF5IHB1dCBpdCBpbiB0aGUgZnJlZSBsaXN0IG9mIG1lbWZpbGUgKm1mcAorICovCisgICAgdm9pZAorbWZfZnJlZShtZnAsIGhwKQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGJoZHJfVAkqaHA7Cit7CisgICAgdmltX2ZyZWUoaHAtPmJoX2RhdGEpOwkvKiBmcmVlIHRoZSBtZW1vcnkgKi8KKyAgICBtZl9yZW1faGFzaChtZnAsIGhwKTsJLyogZ2V0ICpocCBvdXQgb2YgdGhlIGhhc2ggbGlzdCAqLworICAgIG1mX3JlbV91c2VkKG1mcCwgaHApOwkvKiBnZXQgKmhwIG91dCBvZiB0aGUgdXNlZCBsaXN0ICovCisgICAgaWYgKGhwLT5iaF9ibnVtIDwgMCkKKyAgICB7CisJdmltX2ZyZWUoaHApOwkJLyogZG9uJ3Qgd2FudCBuZWdhdGl2ZSBudW1iZXJzIGluIGZyZWUgbGlzdCAqLworCW1mcC0+bWZfbmVnX2NvdW50LS07CisgICAgfQorICAgIGVsc2UKKwltZl9pbnNfZnJlZShtZnAsIGhwKTsJLyogcHV0ICpocCBpbiB0aGUgZnJlZSBsaXN0ICovCit9CisKKyNpZiBkZWZpbmVkKF9fTU9SUEhPU19fKQorLyogZnVuY3Rpb24gaXMgbWlzc2luZyBpbiBNb3JwaE9TIGxpYm5peCB2ZXJzaW9uICovCitleHRlcm4gdW5zaWduZWQgbG9uZyAqX19zdGRmaWxlZGVzOworCisgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcKK2ZkdG9maChpbnQgZmlsZWRlc2NyaXB0b3IpCit7CisgICAgcmV0dXJuIF9fc3RkZmlsZWRlc1tmaWxlZGVzY3JpcHRvcl07Cit9CisjZW5kaWYKKworLyoKKyAqIFN5bmMgdGhlIG1lbW9yeSBmaWxlICptZnAgdG8gZGlzay4KKyAqIEZsYWdzOgorICogIE1GU19BTEwJSWYgbm90IGdpdmVuLCBibG9ja3Mgd2l0aCBuZWdhdGl2ZSBudW1iZXJzIGFyZSBub3Qgc3luY2VkLAorICoJCWV2ZW4gd2hlbiB0aGV5IGFyZSBkaXJ0eSEKKyAqICBNRlNfU1RPUAlTdG9wIHN5bmNpbmcgd2hlbiBhIGNoYXJhY3RlciBiZWNvbWVzIGF2YWlsYWJsZSwgYnV0IHN5bmMgYXQKKyAqCQlsZWFzdCBvbmUgYmxvY2suCisgKiAgTUZTX0ZMVVNICU1ha2Ugc3VyZSBidWZmZXJzIGFyZSBmbHVzaGVkIHRvIGRpc2ssIHNvIHRoZXkgd2lsbCBzdXJ2aXZlIGEKKyAqCQlzeXN0ZW0gY3Jhc2guCisgKiAgTUZTX1pFUk8JT25seSB3cml0ZSBibG9jayAwLgorICoKKyAqIFJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWZfc3luYyhtZnAsIGZsYWdzKQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGludAkJZmxhZ3M7Cit7CisgICAgaW50CQlzdGF0dXM7CisgICAgYmhkcl9UCSpocDsKKyNpZiBkZWZpbmVkKFNZTkNfRFVQX0NMT1NFKSAmJiAhZGVmaW5lZChNU0RPUykKKyAgICBpbnQJCWZkOworI2VuZGlmCisgICAgaW50CQlnb3RfaW50X3NhdmUgPSBnb3RfaW50OworCisgICAgaWYgKG1mcC0+bWZfZmQgPCAwKQkgICAgLyogdGhlcmUgaXMgbm8gZmlsZSwgbm90aGluZyB0byBkbyAqLworICAgIHsKKwltZnAtPm1mX2RpcnR5ID0gRkFMU0U7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyogT25seSBhIENUUkwtQyB3aGlsZSB3cml0aW5nIHdpbGwgYnJlYWsgdXMgaGVyZSwgbm90IG9uZSB0eXBlZAorICAgICAqIHByZXZpb3VzbHkuICovCisgICAgZ290X2ludCA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBzeW5jIGZyb20gbGFzdCB0byBmaXJzdCAobWF5IHJlZHVjZSB0aGUgcHJvYmFiaWxpdHkgb2YgYW4gaW5jb25zaXN0ZW50CisgICAgICogZmlsZSkgSWYgYSB3cml0ZSBmYWlscywgaXQgaXMgdmVyeSBsaWtlbHkgY2F1c2VkIGJ5IGEgZnVsbCBmaWxlc3lzdGVtLgorICAgICAqIFRoZW4gd2Ugb25seSB0cnkgdG8gd3JpdGUgYmxvY2tzIHdpdGhpbiB0aGUgZXhpc3RpbmcgZmlsZS4gSWYgdGhhdCBhbHNvCisgICAgICogZmFpbHMgdGhlbiB3ZSBnaXZlIHVwLgorICAgICAqLworICAgIHN0YXR1cyA9IE9LOworICAgIGZvciAoaHAgPSBtZnAtPm1mX3VzZWRfbGFzdDsgaHAgIT0gTlVMTDsgaHAgPSBocC0+YmhfcHJldikKKwlpZiAoKChmbGFncyAmIE1GU19BTEwpIHx8IGhwLT5iaF9ibnVtID49IDApCisJCSYmIChocC0+YmhfZmxhZ3MgJiBCSF9ESVJUWSkKKwkJJiYgKHN0YXR1cyA9PSBPSyB8fCAoaHAtPmJoX2JudW0gPj0gMAorCQkgICAgJiYgaHAtPmJoX2JudW0gPCBtZnAtPm1mX2luZmlsZV9jb3VudCkpKQorCXsKKwkgICAgaWYgKChmbGFncyAmIE1GU19aRVJPKSAmJiBocC0+YmhfYm51bSAhPSAwKQorCQljb250aW51ZTsKKwkgICAgaWYgKG1mX3dyaXRlKG1mcCwgaHApID09IEZBSUwpCisJICAgIHsKKwkJaWYgKHN0YXR1cyA9PSBGQUlMKQkvKiBkb3VibGUgZXJyb3I6IHF1aXQgc3luY2luZyAqLworCQkgICAgYnJlYWs7CisJCXN0YXR1cyA9IEZBSUw7CisJICAgIH0KKwkgICAgaWYgKGZsYWdzICYgTUZTX1NUT1ApCisJICAgIHsKKwkJLyogU3RvcCB3aGVuIGNoYXIgYXZhaWxhYmxlIG5vdy4gKi8KKwkJaWYgKHVpX2NoYXJfYXZhaWwoKSkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UKKwkJdWlfYnJlYWtjaGVjaygpOworCSAgICBpZiAoZ290X2ludCkKKwkJYnJlYWs7CisJfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgd2hvbGUgbGlzdCBpcyBmbHVzaGVkLCB0aGUgbWVtZmlsZSBpcyBub3QgZGlydHkgYW55bW9yZS4KKyAgICAgKiBJbiBjYXNlIG9mIGFuIGVycm9yIHRoaXMgZmxhZyBpcyBhbHNvIHNldCwgdG8gYXZvaWQgdHJ5aW5nIGFsbCB0aGUgdGltZS4KKyAgICAgKi8KKyAgICBpZiAoaHAgPT0gTlVMTCB8fCBzdGF0dXMgPT0gRkFJTCkKKwltZnAtPm1mX2RpcnR5ID0gRkFMU0U7CisKKyAgICBpZiAoKGZsYWdzICYgTUZTX0ZMVVNIKSAmJiAqcF9zd3MgIT0gTlVMKQorICAgIHsKKyNpZiBkZWZpbmVkKFVOSVgpCisjIGlmZGVmIEhBVkVfRlNZTkMKKwkvKgorCSAqIG1vc3QgVW5peGVzIGhhdmUgdGhlIHZlcnkgdXNlZnVsIGZzeW5jKCkgZnVuY3Rpb24sIGp1c3Qgd2hhdCB3ZSBuZWVkLgorCSAqIEhvd2V2ZXIsIHdpdGggT1MvMiBhbmQgRU1YIGl0IGlzIGFsc28gYXZhaWxhYmxlLCBidXQgdGhlcmUgYXJlCisJICogcmVwb3J0cyBvZiBiYWQgcHJvYmxlbXMgd2l0aCBpdCAoYSBidWcgaW4gSFBGUy5JRlMpLgorCSAqIFNvIHdlIGRpc2FibGUgdXNlIG9mIGl0IGhlcmUgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIGJlIHNtYXJ0CisJICogYW5kIGNoYW5nZXMgb3Nfb3MyX2NmZy5oLi4uIChldmVuIHRob3VnaCB0aGVyZSBpcyBubyBfX0VNWF9fIHRlc3QKKwkgKiBpbiB0aGUgI2lmLCBhcyBfX0VNWF9fIGRvZXMgbm90IGhhdmUgc3luYygpOyB3ZSBob3BlIGZvciBhIHRpbWVseQorCSAqIHN5bmMgZnJvbSB0aGUgc3lzdGVtIGl0c2VsZikuCisJICovCisjICBpZiBkZWZpbmVkKF9fRU1YX18pCisgICBlcnJvciAiRG9udCB1c2UgZnN5bmMgd2l0aCBFTVghIFJlYWQgZW14ZG9jLmRvYyBvciBlbXhmaXgwMS5kb2MgZm9yIGluZm8uIgorIyAgZW5kaWYKKwlpZiAoU1RSQ01QKHBfc3dzLCAiZnN5bmMiKSA9PSAwKQorCXsKKwkgICAgaWYgKGZzeW5jKG1mcC0+bWZfZmQpKQorCQlzdGF0dXMgPSBGQUlMOworCX0KKwllbHNlCisjIGVuZGlmCisJICAgIC8qIE9wZW5OVCBpcyBzdHJpY3RseSBQT1NJWCAoQmVuemluZ2VyKSAqLworCSAgICAvKiBUYW5kZW0vSGltYWxheWEgTlNLLU9TUyBkb2Vzbid0IGhhdmUgc3luYygpICovCisjIGlmIGRlZmluZWQoX19PUEVOTlQpIHx8IGRlZmluZWQoX19UQU5ERU0pCisJICAgIGZmbHVzaChOVUxMKTsKKyMgZWxzZQorCSAgICBzeW5jKCk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBWTVMKKwlpZiAoU1RSQ01QKHBfc3dzLCAiZnN5bmMiKSA9PSAwKQorCXsKKwkgICAgaWYgKGZzeW5jKG1mcC0+bWZfZmQpKQorCQlzdGF0dXMgPSBGQUlMOworCX0KKyNlbmRpZgorI2lmZGVmIE1TRE9TCisJaWYgKF9kb3NfY29tbWl0KG1mcC0+bWZfZmQpKQorCSAgICBzdGF0dXMgPSBGQUlMOworI2Vsc2UKKyMgaWZkZWYgU1lOQ19EVVBfQ0xPU0UKKwkvKgorCSAqIFdpbjMyIGlzIGEgYml0IG1vcmUgd29yazogRHVwbGljYXRlIHRoZSBmaWxlIGhhbmRsZSBhbmQgY2xvc2UgaXQuCisJICogVGhpcyBzaG91bGQgZmx1c2ggdGhlIGZpbGUgdG8gZGlzay4KKwkgKi8KKwlpZiAoKGZkID0gZHVwKG1mcC0+bWZfZmQpKSA+PSAwKQorCSAgICBjbG9zZShmZCk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBBTUlHQQorIyBpZmRlZiBfX0FST1NfXworCWlmIChmc3luYyhtZnAtPm1mX2ZkKSAhPSAwKQorCSAgICBzdGF0dXMgPSBGQUlMOworIyBlbHNlCisJLyoKKwkgKiBGbHVzaCgpIG9ubHkgZXhpc3RzIGZvciBBbWlnYURvcyAyLjAuCisJICogRm9yIDEuMyBpdCBzaG91bGQgYmUgZG9uZSB3aXRoIGNsb3NlKCkgKyBvcGVuKCksIGJ1dCB0aGVuIHRoZSByaXNrCisJICogaXMgdGhhdCB0aGUgb3BlbigpIG1heSBmYWlsIGFuZCBsb3NlIHRoZSBmaWxlLi4uLgorCSAqLworIyAgaWZkZWYgRkVBVF9BUlAKKwlpZiAoZG9zMikKKyMgIGVuZGlmCisjICBpZmRlZiBTQVNDCisJeworCSAgICBzdHJ1Y3QgVUZCICpmcCA9IGNoa3VmYihtZnAtPm1mX2ZkKTsKKworCSAgICBpZiAoZnAgIT0gTlVMTCkKKwkJRmx1c2goZnAtPnVmYmZoKTsKKwl9CisjICBlbHNlCisjICAgaWYgZGVmaW5lZChfRENDKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fTU9SUEhPU19fKQorCXsKKyMgICAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19NT1JQSE9TX18pCisJICAgIC8qIEhhdmUgZnVuY3Rpb24gKGluIGxpYm5peCBhdCBsZWFzdCksCisJICAgICAqIGJ1dCBhaW4ndCBnb3Qgbm8gcHJvdG90eXBlIGFueXdoZXJlLiAqLworCSAgICBleHRlcm4gdW5zaWduZWQgbG9uZyBmZHRvZmgoaW50IGZpbGVkZXNjcmlwdG9yKTsKKyMgICAgZW5kaWYKKwkgICAgQlBUUiBmaCA9IChCUFRSKWZkdG9maChtZnAtPm1mX2ZkKTsKKworCSAgICBpZiAoZmggIT0gMCkKKwkJRmx1c2goZmgpOworCX0KKyMgICBlbHNlIC8qIGFzc3VtZSBNYW54ICovCisJICAgIEZsdXNoKF9kZXZ0YWJbbWZwLT5tZl9mZF0uZmQpOworIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIEFNSUdBICovCisgICAgfQorCisgICAgZ290X2ludCB8PSBnb3RfaW50X3NhdmU7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogaW5zZXJ0IGJsb2NrICpocCBpbiBmcm9udCBvZiBoYXNobGlzdCBvZiBtZW1maWxlICptZnAKKyAqLworICAgIHN0YXRpYyB2b2lkCittZl9pbnNfaGFzaChtZnAsIGhwKQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGJoZHJfVAkqaHA7Cit7CisgICAgYmhkcl9UCSpoaHA7CisgICAgaW50CQloYXNoOworCisgICAgaGFzaCA9IE1FTUhBU0goaHAtPmJoX2JudW0pOworICAgIGhocCA9IG1mcC0+bWZfaGFzaFtoYXNoXTsKKyAgICBocC0+YmhfaGFzaF9uZXh0ID0gaGhwOworICAgIGhwLT5iaF9oYXNoX3ByZXYgPSBOVUxMOworICAgIGlmIChoaHAgIT0gTlVMTCkKKwloaHAtPmJoX2hhc2hfcHJldiA9IGhwOworICAgIG1mcC0+bWZfaGFzaFtoYXNoXSA9IGhwOworfQorCisvKgorICogcmVtb3ZlIGJsb2NrICpocCBmcm9tIGhhc2hsaXN0IG9mIG1lbWZpbGUgbGlzdCAqbWZwCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWZfcmVtX2hhc2gobWZwLCBocCkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBiaGRyX1QJKmhwOworeworICAgIGlmIChocC0+YmhfaGFzaF9wcmV2ID09IE5VTEwpCisJbWZwLT5tZl9oYXNoW01FTUhBU0goaHAtPmJoX2JudW0pXSA9IGhwLT5iaF9oYXNoX25leHQ7CisgICAgZWxzZQorCWhwLT5iaF9oYXNoX3ByZXYtPmJoX2hhc2hfbmV4dCA9IGhwLT5iaF9oYXNoX25leHQ7CisKKyAgICBpZiAoaHAtPmJoX2hhc2hfbmV4dCkKKwlocC0+YmhfaGFzaF9uZXh0LT5iaF9oYXNoX3ByZXYgPSBocC0+YmhfaGFzaF9wcmV2OworfQorCisvKgorICogbG9vayBpbiBoYXNoIGxpc3RzIG9mIG1lbWZpbGUgKm1mcCBmb3IgYmxvY2sgaGVhZGVyIHdpdGggbnVtYmVyICducicKKyAqLworICAgIHN0YXRpYyBiaGRyX1QgKgorbWZfZmluZF9oYXNoKG1mcCwgbnIpCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmxvY2tucl9UCW5yOworeworICAgIGJoZHJfVAkqaHA7CisKKyAgICBmb3IgKGhwID0gbWZwLT5tZl9oYXNoW01FTUhBU0gobnIpXTsgaHAgIT0gTlVMTDsgaHAgPSBocC0+YmhfaGFzaF9uZXh0KQorCWlmIChocC0+YmhfYm51bSA9PSBucikKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGhwOworfQorCisvKgorICogaW5zZXJ0IGJsb2NrICpocCBpbiBmcm9udCBvZiB1c2VkIGxpc3Qgb2YgbWVtZmlsZSAqbWZwCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWZfaW5zX3VzZWQobWZwLCBocCkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBiaGRyX1QJKmhwOworeworICAgIGhwLT5iaF9uZXh0ID0gbWZwLT5tZl91c2VkX2ZpcnN0OworICAgIG1mcC0+bWZfdXNlZF9maXJzdCA9IGhwOworICAgIGhwLT5iaF9wcmV2ID0gTlVMTDsKKyAgICBpZiAoaHAtPmJoX25leHQgPT0gTlVMTCkJICAgIC8qIGxpc3Qgd2FzIGVtcHR5LCBhZGp1c3QgbGFzdCBwb2ludGVyICovCisJbWZwLT5tZl91c2VkX2xhc3QgPSBocDsKKyAgICBlbHNlCisJaHAtPmJoX25leHQtPmJoX3ByZXYgPSBocDsKKyAgICBtZnAtPm1mX3VzZWRfY291bnQgKz0gaHAtPmJoX3BhZ2VfY291bnQ7CisgICAgdG90YWxfbWVtX3VzZWQgKz0gaHAtPmJoX3BhZ2VfY291bnQgKiBtZnAtPm1mX3BhZ2Vfc2l6ZTsKK30KKworLyoKKyAqIHJlbW92ZSBibG9jayAqaHAgZnJvbSB1c2VkIGxpc3Qgb2YgbWVtZmlsZSAqbWZwCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWZfcmVtX3VzZWQobWZwLCBocCkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBiaGRyX1QJKmhwOworeworICAgIGlmIChocC0+YmhfbmV4dCA9PSBOVUxMKQkgICAgLyogbGFzdCBibG9jayBpbiB1c2VkIGxpc3QgKi8KKwltZnAtPm1mX3VzZWRfbGFzdCA9IGhwLT5iaF9wcmV2OworICAgIGVsc2UKKwlocC0+YmhfbmV4dC0+YmhfcHJldiA9IGhwLT5iaF9wcmV2OworICAgIGlmIChocC0+YmhfcHJldiA9PSBOVUxMKQkgICAgLyogZmlyc3QgYmxvY2sgaW4gdXNlZCBsaXN0ICovCisJbWZwLT5tZl91c2VkX2ZpcnN0ID0gaHAtPmJoX25leHQ7CisgICAgZWxzZQorCWhwLT5iaF9wcmV2LT5iaF9uZXh0ID0gaHAtPmJoX25leHQ7CisgICAgbWZwLT5tZl91c2VkX2NvdW50IC09IGhwLT5iaF9wYWdlX2NvdW50OworICAgIHRvdGFsX21lbV91c2VkIC09IGhwLT5iaF9wYWdlX2NvdW50ICogbWZwLT5tZl9wYWdlX3NpemU7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGJsb2NrIGZyb20gdGhlIHVzZWQgbGlzdCBpZiB0aGUgbnVtYmVyCisgKiBvZiB1c2VkIG1lbW9yeSBibG9ja3MgZ2V0cyB0byBiaWcuCisgKgorICogUmV0dXJuIHRoZSBibG9jayBoZWFkZXIgdG8gdGhlIGNhbGxlciwgaW5jbHVkaW5nIHRoZSBtZW1vcnkgYmxvY2ssIHNvCisgKiBpdCBjYW4gYmUgcmUtdXNlZC4gTWFrZSBzdXJlIHRoZSBwYWdlX2NvdW50IGlzIHJpZ2h0LgorICovCisgICAgc3RhdGljIGJoZHJfVCAqCittZl9yZWxlYXNlKG1mcCwgcGFnZV9jb3VudCkKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBpbnQJCXBhZ2VfY291bnQ7Cit7CisgICAgYmhkcl9UCSpocDsKKyAgICBpbnQJCW5lZWRfcmVsZWFzZTsKKyAgICBidWZfVAkqYnVmOworCisgICAgLyogZG9uJ3QgcmVsZWFzZSB3aGlsZSBpbiBtZl9jbG9zZV9maWxlKCkgKi8KKyAgICBpZiAoZG9udF9yZWxlYXNlKQorCXJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAgKiBOZWVkIHRvIHJlbGVhc2UgYSBibG9jayBpZiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhpcyBtZW1maWxlIGlzCisgICAgICogaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gb3IgdG90YWwgbWVtb3J5IHVzZWQgaXMgb3ZlciAnbWF4bWVtdG90JworICAgICAqLworICAgIG5lZWRfcmVsZWFzZSA9ICgobWZwLT5tZl91c2VkX2NvdW50ID49IG1mcC0+bWZfdXNlZF9jb3VudF9tYXgpCisJCQkJICB8fCAodG90YWxfbWVtX3VzZWQgPj4gMTApID49IChsb25nX3UpcF9tbXQpOworCisgICAgLyoKKyAgICAgKiBUcnkgdG8gY3JlYXRlIGEgc3dhcCBmaWxlIGlmIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgaXMgZ2V0dGluZyB0b28KKyAgICAgKiBoaWdoLgorICAgICAqLworICAgIGlmIChtZnAtPm1mX2ZkIDwgMCAmJiBuZWVkX3JlbGVhc2UgJiYgcF91YykKKyAgICB7CisJLyogZmluZCBmb3Igd2hpY2ggYnVmZmVyIHRoaXMgbWVtZmlsZSBpcyAqLworCWZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwkgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9tZnAgPT0gbWZwKQorCQlicmVhazsKKwlpZiAoYnVmICE9IE5VTEwgJiYgYnVmLT5iX21heV9zd2FwKQorCSAgICBtbF9vcGVuX2ZpbGUoYnVmKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGRvbid0IHJlbGVhc2UgYSBibG9jayBpZgorICAgICAqCXRoZXJlIGlzIG5vIGZpbGUgZm9yIHRoaXMgbWVtZmlsZQorICAgICAqIG9yCisgICAgICoJdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHRoaXMgbWVtZmlsZSBpcyBsb3dlciB0aGFuIHRoZSBtYXhpbXVtCisgICAgICoJICBhbmQKKyAgICAgKgl0b3RhbCBtZW1vcnkgdXNlZCBpcyBub3QgdXAgdG8gJ21heG1lbXRvdCcKKyAgICAgKi8KKyAgICBpZiAobWZwLT5tZl9mZCA8IDAgfHwgIW5lZWRfcmVsZWFzZSkKKwlyZXR1cm4gTlVMTDsKKworICAgIGZvciAoaHAgPSBtZnAtPm1mX3VzZWRfbGFzdDsgaHAgIT0gTlVMTDsgaHAgPSBocC0+YmhfcHJldikKKwlpZiAoIShocC0+YmhfZmxhZ3MgJiBCSF9MT0NLRUQpKQorCSAgICBicmVhazsKKyAgICBpZiAoaHAgPT0gTlVMTCkJLyogbm90IGEgc2luZ2xlIG9uZSB0aGF0IGNhbiBiZSByZWxlYXNlZCAqLworCXJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgYmxvY2sgaXMgZGlydHksIHdyaXRlIGl0LgorICAgICAqIElmIHRoZSB3cml0ZSBmYWlscyB3ZSBkb24ndCBmcmVlIGl0LgorICAgICAqLworICAgIGlmICgoaHAtPmJoX2ZsYWdzICYgQkhfRElSVFkpICYmIG1mX3dyaXRlKG1mcCwgaHApID09IEZBSUwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBtZl9yZW1fdXNlZChtZnAsIGhwKTsKKyAgICBtZl9yZW1faGFzaChtZnAsIGhwKTsKKworICAgIC8qCisgICAgICogSWYgYSBiaGRyX1QgaXMgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYWdlX2NvdW50IG9mIGJoX2RhdGEgaXMKKyAgICAgKiByaWdodAorICAgICAqLworICAgIGlmIChocC0+YmhfcGFnZV9jb3VudCAhPSBwYWdlX2NvdW50KQorICAgIHsKKwl2aW1fZnJlZShocC0+YmhfZGF0YSk7CisJaWYgKChocC0+YmhfZGF0YSA9IGFsbG9jKG1mcC0+bWZfcGFnZV9zaXplICogcGFnZV9jb3VudCkpID09IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShocCk7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlocC0+YmhfcGFnZV9jb3VudCA9IHBhZ2VfY291bnQ7CisgICAgfQorICAgIHJldHVybiBocDsKK30KKworLyoKKyAqIHJlbGVhc2UgYXMgbWFueSBibG9ja3MgYXMgcG9zc2libGUKKyAqIFVzZWQgaW4gY2FzZSBvZiBvdXQgb2YgbWVtb3J5CisgKgorICogcmV0dXJuIFRSVUUgaWYgYW55IG1lbW9yeSB3YXMgcmVsZWFzZWQKKyAqLworICAgIGludAorbWZfcmVsZWFzZV9hbGwoKQoreworICAgIGJ1Zl9UCSpidWY7CisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmhkcl9UCSpocDsKKyAgICBpbnQJCXJldHZhbCA9IEZBTFNFOworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwltZnAgPSBidWYtPmJfbWwubWxfbWZwOworCWlmIChtZnAgIT0gTlVMTCkKKwl7CisJICAgIC8qIElmIG5vIHN3YXAgZmlsZSB5ZXQsIG1heSBvcGVuIG9uZSAqLworCSAgICBpZiAobWZwLT5tZl9mZCA8IDAgJiYgYnVmLT5iX21heV9zd2FwKQorCQltbF9vcGVuX2ZpbGUoYnVmKTsKKworCSAgICAvKiBvbmx5IGlmIHRoZXJlIGlzIGEgc3dhcGZpbGUgKi8KKwkgICAgaWYgKG1mcC0+bWZfZmQgPj0gMCkKKwkgICAgeworCQlmb3IgKGhwID0gbWZwLT5tZl91c2VkX2xhc3Q7IGhwICE9IE5VTEw7ICkKKwkJeworCQkgICAgaWYgKCEoaHAtPmJoX2ZsYWdzICYgQkhfTE9DS0VEKQorCQkJICAgICYmICghKGhwLT5iaF9mbGFncyAmIEJIX0RJUlRZKQorCQkJCXx8IG1mX3dyaXRlKG1mcCwgaHApICE9IEZBSUwpKQorCQkgICAgeworCQkJbWZfcmVtX3VzZWQobWZwLCBocCk7CisJCQltZl9yZW1faGFzaChtZnAsIGhwKTsKKwkJCW1mX2ZyZWVfYmhkcihocCk7CisJCQlocCA9IG1mcC0+bWZfdXNlZF9sYXN0OwkvKiByZS1zdGFydCwgbGlzdCB3YXMgY2hhbmdlZCAqLworCQkJcmV0dmFsID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCWhwID0gaHAtPmJoX3ByZXY7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYmxvY2sgaGVhZGVyIGFuZCBhIGJsb2NrIG9mIG1lbW9yeSBmb3IgaXQKKyAqLworICAgIHN0YXRpYyBiaGRyX1QgKgorbWZfYWxsb2NfYmhkcihtZnAsIHBhZ2VfY291bnQpCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgaW50CQlwYWdlX2NvdW50OworeworICAgIGJoZHJfVAkqaHA7CisKKyAgICBpZiAoKGhwID0gKGJoZHJfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoYmhkcl9UKSkpICE9IE5VTEwpCisgICAgeworCWlmICgoaHAtPmJoX2RhdGEgPSAoY2hhcl91ICopYWxsb2MobWZwLT5tZl9wYWdlX3NpemUgKiBwYWdlX2NvdW50KSkKKwkJCQkJCQkJICAgICAgPT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKGhwKTsJICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCisJICAgIHJldHVybiBOVUxMOworCX0KKwlocC0+YmhfcGFnZV9jb3VudCA9IHBhZ2VfY291bnQ7CisgICAgfQorICAgIHJldHVybiBocDsKK30KKworLyoKKyAqIEZyZWUgYSBibG9jayBoZWFkZXIgYW5kIHRoZSBibG9jayBvZiBtZW1vcnkgZm9yIGl0CisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWZfZnJlZV9iaGRyKGhwKQorICAgIGJoZHJfVAkqaHA7Cit7CisgICAgdmltX2ZyZWUoaHAtPmJoX2RhdGEpOworICAgIHZpbV9mcmVlKGhwKTsKK30KKworLyoKKyAqIGluc2VydCBlbnRyeSAqaHAgaW4gdGhlIGZyZWUgbGlzdAorICovCisgICAgc3RhdGljIHZvaWQKK21mX2luc19mcmVlKG1mcCwgaHApCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmhkcl9UCSpocDsKK3sKKyAgICBocC0+YmhfbmV4dCA9IG1mcC0+bWZfZnJlZV9maXJzdDsKKyAgICBtZnAtPm1mX2ZyZWVfZmlyc3QgPSBocDsKK30KKworLyoKKyAqIHJlbW92ZSB0aGUgZmlyc3QgZW50cnkgZnJvbSB0aGUgZnJlZSBsaXN0IGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0CisgKiBOb3RlOiBjYWxsZXIgbXVzdCBjaGVjayB0aGF0IG1mcC0+bWZfZnJlZV9maXJzdCBpcyBub3QgTlVMTCEKKyAqLworICAgIHN0YXRpYyBiaGRyX1QgKgorbWZfcmVtX2ZyZWUobWZwKQorICAgIG1lbWZpbGVfVAkqbWZwOworeworICAgIGJoZHJfVAkqaHA7CisKKyAgICBocCA9IG1mcC0+bWZfZnJlZV9maXJzdDsKKyAgICBtZnAtPm1mX2ZyZWVfZmlyc3QgPSBocC0+YmhfbmV4dDsKKyAgICByZXR1cm4gaHA7Cit9CisKKy8qCisgKiByZWFkIGEgYmxvY2sgZnJvbSBkaXNrCisgKgorICogUmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorbWZfcmVhZChtZnAsIGhwKQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGJoZHJfVAkqaHA7Cit7CisgICAgb2ZmX3QJb2Zmc2V0OworICAgIHVuc2lnbmVkCXBhZ2Vfc2l6ZTsKKyAgICB1bnNpZ25lZAlzaXplOworCisgICAgaWYgKG1mcC0+bWZfZmQgPCAwKQkgICAgLyogdGhlcmUgaXMgbm8gZmlsZSwgY2FuJ3QgcmVhZCAqLworCXJldHVybiBGQUlMOworCisgICAgcGFnZV9zaXplID0gbWZwLT5tZl9wYWdlX3NpemU7CisgICAgb2Zmc2V0ID0gKG9mZl90KXBhZ2Vfc2l6ZSAqIGhwLT5iaF9ibnVtOworICAgIHNpemUgPSBwYWdlX3NpemUgKiBocC0+YmhfcGFnZV9jb3VudDsKKyAgICBpZiAobHNlZWsobWZwLT5tZl9mZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KQorICAgIHsKKwlFTVNHKF8oIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGlmICgodW5zaWduZWQpdmltX3JlYWQobWZwLT5tZl9mZCwgaHAtPmJoX2RhdGEsIHNpemUpICE9IHNpemUpCisgICAgeworCUVNU0coXygiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIHdyaXRlIGEgYmxvY2sgdG8gZGlzaworICoKKyAqIFJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIHN0YXRpYyBpbnQKK21mX3dyaXRlKG1mcCwgaHApCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmhkcl9UCSpocDsKK3sKKyAgICBvZmZfdAlvZmZzZXQ7CSAgICAvKiBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKyAgICBibG9ja25yX1QJbnI7CSAgICAvKiBibG9jayBuciB3aGljaCBpcyBiZWluZyB3cml0dGVuICovCisgICAgYmhkcl9UCSpocDI7CisgICAgdW5zaWduZWQJcGFnZV9zaXplOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIGEgcGFnZSAqLworICAgIHVuc2lnbmVkCXBhZ2VfY291bnQ7IC8qIG51bWJlciBvZiBwYWdlcyB3cml0dGVuICovCisgICAgdW5zaWduZWQJc2l6ZTsJICAgIC8qIG51bWJlciBvZiBieXRlcyB3cml0dGVuICovCisKKyAgICBpZiAobWZwLT5tZl9mZCA8IDApCSAgICAvKiB0aGVyZSBpcyBubyBmaWxlLCBjYW4ndCB3cml0ZSAqLworCXJldHVybiBGQUlMOworCisgICAgaWYgKGhwLT5iaF9ibnVtIDwgMCkJLyogbXVzdCBhc3NpZ24gZmlsZSBibG9jayBudW1iZXIgKi8KKwlpZiAobWZfdHJhbnNfYWRkKG1mcCwgaHApID09IEZBSUwpCisJICAgIHJldHVybiBGQUlMOworCisgICAgcGFnZV9zaXplID0gbWZwLT5tZl9wYWdlX3NpemU7CisKKyAgICAvKgorICAgICAqIFdlIGRvbid0IHdhbnQgZ2FwcyBpbiB0aGUgZmlsZS4gV3JpdGUgdGhlIGJsb2NrcyBpbiBmcm9udCBvZiAqaHAKKyAgICAgKiB0byBleHRlbmQgdGhlIGZpbGUuCisgICAgICogSWYgYmxvY2sgJ21mX2luZmlsZV9jb3VudCcgaXMgbm90IGluIHRoZSBoYXNoIGxpc3QsIGl0IGhhcyBiZWVuCisgICAgICogZnJlZWQuIEZpbGwgdGhlIHNwYWNlIGluIHRoZSBmaWxlIHdpdGggZGF0YSBmcm9tIHRoZSBjdXJyZW50IGJsb2NrLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCW5yID0gaHAtPmJoX2JudW07CisJaWYgKG5yID4gbWZwLT5tZl9pbmZpbGVfY291bnQpCQkvKiBiZXlvbmQgZW5kIG9mIGZpbGUgKi8KKwl7CisJICAgIG5yID0gbWZwLT5tZl9pbmZpbGVfY291bnQ7CisJICAgIGhwMiA9IG1mX2ZpbmRfaGFzaChtZnAsIG5yKTsJLyogTlVMTCBjYXRjaGVkIGJlbG93ICovCisJfQorCWVsc2UKKwkgICAgaHAyID0gaHA7CisKKwlvZmZzZXQgPSAob2ZmX3QpcGFnZV9zaXplICogbnI7CisJaWYgKGxzZWVrKG1mcC0+bWZfZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkKKwl7CisJICAgIEVNU0coXygiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlpZiAoaHAyID09IE5VTEwpCSAgICAvKiBmcmVlZCBibG9jaywgZmlsbCB3aXRoIGR1bW15IGRhdGEgKi8KKwkgICAgcGFnZV9jb3VudCA9IDE7CisJZWxzZQorCSAgICBwYWdlX2NvdW50ID0gaHAyLT5iaF9wYWdlX2NvdW50OworCXNpemUgPSBwYWdlX3NpemUgKiBwYWdlX2NvdW50OworCWlmICgodW5zaWduZWQpdmltX3dyaXRlKG1mcC0+bWZfZmQsCisJICAgICAoaHAyID09IE5VTEwgPyBocCA6IGhwMiktPmJoX2RhdGEsIHNpemUpICE9IHNpemUpCisJeworCSAgICAvKgorCSAgICAgKiBBdm9pZCByZXBlYXRpbmcgdGhlIGVycm9yIG1lc3NhZ2UsIHRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUKKwkgICAgICogZGlzayBpcyBmdWxsLiBXZSBnaXZlIHRoZSBtZXNzYWdlIGFnYWluIG9ubHkgYWZ0ZXIgYSBzdWNjZXNmdWwKKwkgICAgICogd3JpdGUgb3Igd2hlbiBoaXR0aW5nIGEga2V5LiBXZSBrZWVwIG9uIHRyeWluZywgaW4gY2FzZSBzb21lCisJICAgICAqIHNwYWNlIGJlY29tZXMgYXZhaWxhYmxlLgorCSAgICAgKi8KKwkgICAgaWYgKCFkaWRfc3dhcHdyaXRlX21zZykKKwkJRU1TRyhfKCJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiKSk7CisJICAgIGRpZF9zd2Fwd3JpdGVfbXNnID0gVFJVRTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCWRpZF9zd2Fwd3JpdGVfbXNnID0gRkFMU0U7CisJaWYgKGhwMiAhPSBOVUxMKQkJICAgIC8qIHdyaXR0ZW4gYSBub24tZHVtbXkgYmxvY2sgKi8KKwkgICAgaHAyLT5iaF9mbGFncyAmPSB+QkhfRElSVFk7CisJCQkJCSAgICAvKiBhcHBlbmRlZCB0byB0aGUgZmlsZSAqLworCWlmIChuciArIChibG9ja25yX1QpcGFnZV9jb3VudCA+IG1mcC0+bWZfaW5maWxlX2NvdW50KQorCSAgICBtZnAtPm1mX2luZmlsZV9jb3VudCA9IG5yICsgcGFnZV9jb3VudDsKKwlpZiAobnIgPT0gaHAtPmJoX2JudW0pCQkgICAgLyogd3JpdHRlbiB0aGUgZGVzaXJlZCBibG9jayAqLworCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogTWFrZSBibG9jayBudW1iZXIgZm9yICpocCBwb3NpdGl2ZSBhbmQgYWRkIGl0IHRvIHRoZSB0cmFuc2xhdGlvbiBsaXN0CisgKgorICogUmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorbWZfdHJhbnNfYWRkKG1mcCwgaHApCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmhkcl9UCSpocDsKK3sKKyAgICBiaGRyX1QJKmZyZWVwOworICAgIGJsb2NrbnJfVAluZXdfYm51bTsKKyAgICBpbnQJCWhhc2g7CisgICAgTlJfVFJBTlMJKm5wOworICAgIGludAkJcGFnZV9jb3VudDsKKworICAgIGlmIChocC0+YmhfYm51bSA+PSAwKQkJICAgIC8qIGl0J3MgYWxyZWFkeSBwb3NpdGl2ZSAqLworCXJldHVybiBPSzsKKworICAgIGlmICgobnAgPSAoTlJfVFJBTlMgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKE5SX1RSQU5TKSkpID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKy8qCisgKiBnZXQgYSBuZXcgbnVtYmVyIGZvciB0aGUgYmxvY2suCisgKiBJZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgZnJlZSBsaXN0IGhhcyBzdWZmaWNpZW50IHBhZ2VzLCB1c2UgaXRzIG51bWJlcgorICogT3RoZXJ3aXNlIHVzZSBtZl9ibG9ja25yX21heC4KKyAqLworICAgIGZyZWVwID0gbWZwLT5tZl9mcmVlX2ZpcnN0OworICAgIHBhZ2VfY291bnQgPSBocC0+YmhfcGFnZV9jb3VudDsKKyAgICBpZiAoZnJlZXAgIT0gTlVMTCAmJiBmcmVlcC0+YmhfcGFnZV9jb3VudCA+PSBwYWdlX2NvdW50KQorICAgIHsKKwluZXdfYm51bSA9IGZyZWVwLT5iaF9ibnVtOworCS8qCisJICogSWYgdGhlIHBhZ2UgY291bnQgb2YgdGhlIGZyZWUgYmxvY2sgd2FzIGxhcmdlciwgcmVjdWRlIGl0LgorCSAqIElmIHRoZSBwYWdlIGNvdW50IG1hdGNoZXMsIHJlbW92ZSB0aGUgYmxvY2sgZnJvbSB0aGUgZnJlZSBsaXN0CisJICovCisJaWYgKGZyZWVwLT5iaF9wYWdlX2NvdW50ID4gcGFnZV9jb3VudCkKKwl7CisJICAgIGZyZWVwLT5iaF9ibnVtICs9IHBhZ2VfY291bnQ7CisJICAgIGZyZWVwLT5iaF9wYWdlX2NvdW50IC09IHBhZ2VfY291bnQ7CisJfQorCWVsc2UKKwl7CisJICAgIGZyZWVwID0gbWZfcmVtX2ZyZWUobWZwKTsKKwkgICAgdmltX2ZyZWUoZnJlZXApOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwluZXdfYm51bSA9IG1mcC0+bWZfYmxvY2tucl9tYXg7CisJbWZwLT5tZl9ibG9ja25yX21heCArPSBwYWdlX2NvdW50OworICAgIH0KKworICAgIG5wLT5udF9vbGRfYm51bSA9IGhwLT5iaF9ibnVtOwkgICAgLyogYWRqdXN0IG51bWJlciAqLworICAgIG5wLT5udF9uZXdfYm51bSA9IG5ld19ibnVtOworCisgICAgbWZfcmVtX2hhc2gobWZwLCBocCk7CQkgICAgLyogcmVtb3ZlIGZyb20gb2xkIGhhc2ggbGlzdCAqLworICAgIGhwLT5iaF9ibnVtID0gbmV3X2JudW07CisgICAgbWZfaW5zX2hhc2gobWZwLCBocCk7CQkgICAgLyogaW5zZXJ0IGluIG5ldyBoYXNoIGxpc3QgKi8KKworICAgIGhhc2ggPSBNRU1IQVNIKG5wLT5udF9vbGRfYm51bSk7CSAgICAvKiBpbnNlcnQgaW4gdHJhbnMgbGlzdCAqLworICAgIG5wLT5udF9uZXh0ID0gbWZwLT5tZl90cmFuc1toYXNoXTsKKyAgICBtZnAtPm1mX3RyYW5zW2hhc2hdID0gbnA7CisgICAgaWYgKG5wLT5udF9uZXh0ICE9IE5VTEwpCisJbnAtPm50X25leHQtPm50X3ByZXYgPSBucDsKKyAgICBucC0+bnRfcHJldiA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBMb29rdXAgYSB0cmFubGF0aW9uIGZyb20gdGhlIHRyYW5zIGxpc3RzIGFuZCBkZWxldGUgdGhlIGVudHJ5CisgKgorICogUmV0dXJuIHRoZSBwb3NpdGl2ZSBuZXcgbnVtYmVyIHdoZW4gZm91bmQsIHRoZSBvbGQgbnVtYmVyIHdoZW4gbm90IGZvdW5kCisgKi8KKyAgICBibG9ja25yX1QKK21mX3RyYW5zX2RlbChtZnAsIG9sZF9ucikKKyAgICBtZW1maWxlX1QJKm1mcDsKKyAgICBibG9ja25yX1QJb2xkX25yOworeworICAgIGludAkJaGFzaDsKKyAgICBOUl9UUkFOUwkqbnA7CisgICAgYmxvY2tucl9UCW5ld19ibnVtOworCisgICAgaGFzaCA9IE1FTUhBU0gob2xkX25yKTsKKyAgICBmb3IgKG5wID0gbWZwLT5tZl90cmFuc1toYXNoXTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+bnRfbmV4dCkKKwlpZiAobnAtPm50X29sZF9ibnVtID09IG9sZF9ucikKKwkgICAgYnJlYWs7CisgICAgaWYgKG5wID09IE5VTEwpCQkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gb2xkX25yOworCisgICAgbWZwLT5tZl9uZWdfY291bnQtLTsKKyAgICBuZXdfYm51bSA9IG5wLT5udF9uZXdfYm51bTsKKyAgICBpZiAobnAtPm50X3ByZXYgIT0gTlVMTCkJCS8qIHJlbW92ZSBlbnRyeSBmcm9tIHRoZSB0cmFucyBsaXN0ICovCisJbnAtPm50X3ByZXYtPm50X25leHQgPSBucC0+bnRfbmV4dDsKKyAgICBlbHNlCisJbWZwLT5tZl90cmFuc1toYXNoXSA9IG5wLT5udF9uZXh0OworICAgIGlmIChucC0+bnRfbmV4dCAhPSBOVUxMKQorCW5wLT5udF9uZXh0LT5udF9wcmV2ID0gbnAtPm50X3ByZXY7CisgICAgdmltX2ZyZWUobnApOworCisgICAgcmV0dXJuIG5ld19ibnVtOworfQorCisvKgorICogU2V0IG1mcC0+bWZfZmZuYW1lIGFjY29yZGluZyB0byBtZnAtPm1mX2ZuYW1lIGFuZCBzb21lIG90aGVyIHRoaW5ncy4KKyAqIE9ubHkgY2FsbGVkIHdoZW4gY3JlYXRpbmcgb3IgcmVuYW1pbmcgdGhlIHN3YXBmaWxlLglFaXRoZXIgd2F5IGl0J3MgYSBuZXcKKyAqIG5hbWUgc28gd2UgbXVzdCB3b3JrIG91dCB0aGUgZnVsbCBwYXRoIG5hbWUuCisgKi8KKyAgICB2b2lkCittZl9zZXRfZmZuYW1lKG1mcCkKKyAgICBtZW1maWxlX1QJKm1mcDsKK3sKKyAgICBtZnAtPm1mX2ZmbmFtZSA9IEZ1bGxOYW1lX3NhdmUobWZwLT5tZl9mbmFtZSwgRkFMU0UpOworfQorCisvKgorICogTWFrZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB1c2VkIGZvciB0aGUgbWVtZmlsZSBhIGZ1bGwgcGF0aC4KKyAqIFVzZWQgYmVmb3JlIGRvaW5nIGEgOmNkCisgKi8KKyAgICB2b2lkCittZl9mdWxsbmFtZShtZnApCisgICAgbWVtZmlsZV9UCSptZnA7Cit7CisgICAgaWYgKG1mcCAhPSBOVUxMICYmIG1mcC0+bWZfZm5hbWUgIT0gTlVMTCAmJiBtZnAtPm1mX2ZmbmFtZSAhPSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShtZnAtPm1mX2ZuYW1lKTsKKwltZnAtPm1mX2ZuYW1lID0gbWZwLT5tZl9mZm5hbWU7CisJbWZwLT5tZl9mZm5hbWUgPSBOVUxMOworICAgIH0KK30KKworLyoKKyAqIHJldHVybiBUUlVFIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNsYXRpb25zIHBlbmRpbmcgZm9yICdtZnAnCisgKi8KKyAgICBpbnQKK21mX25lZWRfdHJhbnMobWZwKQorICAgIG1lbWZpbGVfVAkqbWZwOworeworICAgIHJldHVybiAobWZwLT5tZl9mbmFtZSAhPSBOVUxMICYmIG1mcC0+bWZfbmVnX2NvdW50ID4gMCk7Cit9CisKKy8qCisgKiBPcGVuIGEgc3dhcCBmaWxlIGZvciBhIG1lbWZpbGUuCisgKiBUaGUgImZuYW1lIiBtdXN0IGJlIGluIGFsbG9jYXRlZCBtZW1vcnksIGFuZCBpcyBjb25zdW1lZCAoYWxzbyB3aGVuIGFuCisgKiBlcnJvciBvY2N1cnMpLgorICovCisgICAgc3RhdGljIHZvaWQKK21mX2RvX29wZW4obWZwLCBmbmFtZSwgZmxhZ3MpCisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCWZsYWdzOwkJLyogZmxhZ3MgZm9yIG9wZW4oKSAqLworeworI2lmZGVmIEhBVkVfTFNUQVQKKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKyNlbmRpZgorCisgICAgbWZwLT5tZl9mbmFtZSA9IGZuYW1lOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZ1bGwgcGF0aCBuYW1lIGJlZm9yZSB0aGUgb3BlbiwgYmVjYXVzZSB0aGlzIGlzCisgICAgICogbm90IHBvc3NpYmxlIGFmdGVyIHRoZSBvcGVuIG9uIHRoZSBBbWlnYS4KKyAgICAgKiBmbmFtZSBjYW5ub3QgYmUgTmFtZUJ1ZmYsIGJlY2F1c2UgaXQgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkLgorICAgICAqLworICAgIG1mX3NldF9mZm5hbWUobWZwKTsKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFJJU0NPUykKKyAgICAvKgorICAgICAqIEEgIjohY2QgZTp4eHgiIG1heSBjaGFuZ2UgdGhlIGRpcmVjdG9yeSB3aXRob3V0IHVzIGtub3duaW5nLCB1c2UgdGhlCisgICAgICogZnVsbCBwYXRobmFtZSBhbHdheXMuICBDYXJlZnVsOiBUaGlzIGZyZWVzIGZuYW1lIQorICAgICAqLworICAgIG1mX2Z1bGxuYW1lKG1mcCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTFNUQVQKKyAgICAvKgorICAgICAqIEV4dHJhIHNlY3VyaXR5IGNoZWNrOiBXaGVuIGNyZWF0aW5nIGEgc3dhcCBmaWxlIGl0IHJlYWxseSBzaG91bGRuJ3QKKyAgICAgKiBleGlzdCB5ZXQuICBJZiB0aGVyZSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gYXR0YWNrLgorICAgICAqLworICAgIGlmICgoZmxhZ3MgJiBPX0NSRUFUKSAmJiBtY2hfbHN0YXQoKGNoYXIgKiltZnAtPm1mX2ZuYW1lLCAmc2IpID49IDApCisgICAgeworCW1mcC0+bWZfZmQgPSAtMTsKKwlFTVNHKF8oIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIpKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qCisJICogdHJ5IHRvIG9wZW4gdGhlIGZpbGUKKwkgKi8KKwlmbGFncyB8PSBPX0VYVFJBOworI2lmZGVmIFdJTjMyCisJLyogUHJldmVudCBoYW5kbGUgaW5oZXJpdGFuY2UgdGhhdCBjYXVzZSBwcm9ibGVtcyB3aXRoIENzY29wZQorCSAqIChzd2FwIGZpbGUgbWF5IG5vdCBiZSBkZWxldGVkIGlmIGNzY29wZSBjb25uZWN0aW9uIHdhcyBvcGVuIGFmdGVyCisJICogdGhlIGZpbGUpICovCisJZmxhZ3MgfD0gT19OT0lOSEVSSVQ7CisjZW5kaWYKKwltZnAtPm1mX2ZkID0gbWNoX29wZW5fcncoKGNoYXIgKiltZnAtPm1mX2ZuYW1lLCBmbGFncyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCB1c2UgbWVtb3J5IG9ubHkKKyAgICAgKi8KKyAgICBpZiAobWZwLT5tZl9mZCA8IDApCisgICAgeworCXZpbV9mcmVlKG1mcC0+bWZfZm5hbWUpOworCXZpbV9mcmVlKG1mcC0+bWZfZmZuYW1lKTsKKwltZnAtPm1mX2ZuYW1lID0gTlVMTDsKKwltZnAtPm1mX2ZmbmFtZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKwltY2hfaGlkZShtZnAtPm1mX2ZuYW1lKTsgICAgLyogdHJ5IHNldHRpbmcgdGhlICdoaWRkZW4nIGZsYWcgKi8KK30KZGlmZiAtLWdpdCBhL3NyYy9tZW1saW5lLmMgYi9zcmMvbWVtbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTg2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVtbGluZS5jCkBAIC0wLDAgKzEsNDM3OCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKiBmb3IgZGVidWdnaW5nICovCisvKiAjZGVmaW5lIENIRUNLKGMsIHMpCWlmIChjKSBFTVNHKHMpICovCisjZGVmaW5lIENIRUNLKGMsIHMpCisKKy8qCisgKiBtZW1saW5lLmM6IENvbnRhaW5zIHRoZSBmdW5jdGlvbnMgZm9yIGFwcGVuZGluZywgZGVsZXRpbmcgYW5kIGNoYW5naW5nIHRoZQorICogdGV4dCBsaW5lcy4gVGhlIG1lbWZpbGUgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBibG9ja3MKKyAqIG9mIG1lbW9yeSwgYmFja2VkIHVwIGJ5IGEgZmlsZS4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5mb3JtYXRpb24gaXMgYSB0cmVlLgorICogVGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgYSBwb2ludGVyIGJsb2NrLiBUaGUgbGVhdmVzIG9mIHRoZSB0cmVlIGFyZSBkYXRhCisgKiBibG9ja3MuIEluIGJldHdlZW4gbWF5IGJlIHNldmVyYWwgbGF5ZXJzIG9mIHBvaW50ZXIgYmxvY2tzLCBmb3JtaW5nIGJyYW5jaGVzLgorICoKKyAqIFRocmVlIHR5cGVzIG9mIGJsb2NrcyBhcmUgdXNlZDoKKyAqIC0gQmxvY2sgbnIgMCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgcmVjb3ZlcnkKKyAqIC0gUG9pbnRlciBibG9ja3MgY29udGFpbiBsaXN0IG9mIHBvaW50ZXJzIHRvIG90aGVyIGJsb2Nrcy4KKyAqIC0gRGF0YSBibG9ja3MgY29udGFpbiB0aGUgYWN0dWFsIHRleHQuCisgKgorICogQmxvY2sgbnIgMCBjb250YWlucyB0aGUgYmxvY2swIHN0cnVjdHVyZSAoc2VlIGJlbG93KS4KKyAqCisgKiBCbG9jayBuciAxIGlzIHRoZSBmaXJzdCBwb2ludGVyIGJsb2NrLiBJdCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KKyAqIE90aGVyIHBvaW50ZXIgYmxvY2tzIGFyZSBicmFuY2hlcy4KKyAqCisgKiAgSWYgYSBsaW5lIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgc2luZ2xlIHBhZ2UsIHRoZSBibG9jayBjb250YWluaW5nIHRoYXQKKyAqICBsaW5lIGlzIG1hZGUgYmlnIGVub3VnaCB0byBob2xkIHRoZSBsaW5lLiBJdCBtYXkgc3BhbiBzZXZlcmFsIHBhZ2VzLgorICogIE90aGVyd2lzZSBhbGwgYmxvY2tzIGFyZSBvbmUgcGFnZS4KKyAqCisgKiAgQSBkYXRhIGJsb2NrIHRoYXQgd2FzIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRvIGVkaXQgYSBmaWxlIGFuZCB3YXMgbm90CisgKiAgY2hhbmdlZCBzaW5jZSB0aGVuLCBjYW4gaGF2ZSBhIG5lZ2F0aXZlIGJsb2NrIG51bWJlci4gVGhpcyBtZWFucyB0aGF0IGl0CisgKiAgaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCBhIHBsYWNlIGluIHRoZSBmaWxlLiBXaGVuIHJlY292ZXJpbmcsIHRoZSBsaW5lcworICogIGluIHRoaXMgZGF0YSBibG9jayBjYW4gYmUgcmVhZCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLiBXaGVuIHRoZSBibG9jayBpcworICogIGNoYW5nZWQgKGxpbmVzIGFwcGVuZGVkL2RlbGV0ZWQvY2hhbmdlZCkgb3Igd2hlbiBpdCBpcyBmbHVzaGVkIGl0IGdldHMgYQorICogIHBvc2l0aXZlIG51bWJlci4gVXNlIG1mX3RyYW5zX2RlbCgpIHRvIGdldCB0aGUgbmV3IG51bWJlciwgYmVmb3JlIGNhbGxpbmcKKyAqICBtZl9nZXQoKS4KKyAqLworCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjIGluY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKyNpZm5kZWYgVU5JWAkJLyogaXQncyBpbiBvc191bml4LmggZm9yIFVuaXggKi8KKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKyNpZmRlZiBTQVNDCisjIGluY2x1ZGUgPHByb3RvL2Rvcy5oPgkgICAgLyogZm9yIE9wZW4oKSBhbmQgQ2xvc2UoKSAqLworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGJsb2NrMAkJWkVST19CTDsgICAgLyogY29udGVudHMgb2YgdGhlIGZpcnN0IGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBwb2ludGVyX2Jsb2NrCVBUUl9CTDsJICAgIC8qIGNvbnRlbnRzIG9mIGEgcG9pbnRlciBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgZGF0YV9ibG9jawlEQVRBX0JMOyAgICAvKiBjb250ZW50cyBvZiBhIGRhdGEgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IHBvaW50ZXJfZW50cnkJUFRSX0VOOwkgICAgLyogYmxvY2svbGluZS1jb3VudCBwYWlyICovCisKKyNkZWZpbmUgREFUQV9JRAkgICAgKCgnZCcgPDwgOCkgKyAnYScpCSAgICAvKiBkYXRhIGJsb2NrIGlkICovCisjZGVmaW5lIFBUUl9JRAkgICAgKCgncCcgPDwgOCkgKyAndCcpCSAgICAvKiBwb2ludGVyIGJsb2NrIGlkICovCisjZGVmaW5lIEJMT0NLMF9JRDAgICdiJwkJCSAgICAvKiBibG9jayAwIGlkIDAgKi8KKyNkZWZpbmUgQkxPQ0swX0lEMSAgJzAnCQkJICAgIC8qIGJsb2NrIDAgaWQgMSAqLworCisvKgorICogcG9pbnRlciB0byBhIGJsb2NrLCB1c2VkIGluIGEgcG9pbnRlciBibG9jaworICovCitzdHJ1Y3QgcG9pbnRlcl9lbnRyeQoreworICAgIGJsb2NrbnJfVAlwZV9ibnVtOwkvKiBibG9jayBudW1iZXIgKi8KKyAgICBsaW5lbnJfVAlwZV9saW5lX2NvdW50OwkvKiBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBicmFuY2ggKi8KKyAgICBsaW5lbnJfVAlwZV9vbGRfbG51bTsJLyogbG51bSBmb3IgdGhpcyBibG9jayAoZm9yIHJlY292ZXJ5KSAqLworICAgIGludAkJcGVfcGFnZV9jb3VudDsJLyogbnVtYmVyIG9mIHBhZ2VzIGluIGJsb2NrIHBlX2JudW0gKi8KK307CisKKy8qCisgKiBBIHBvaW50ZXIgYmxvY2sgY29udGFpbnMgYSBsaXN0IG9mIGJyYW5jaGVzIGluIHRoZSB0cmVlLgorICovCitzdHJ1Y3QgcG9pbnRlcl9ibG9jaworeworICAgIHNob3J0X3UJcGJfaWQ7CQkvKiBJRCBmb3IgcG9pbnRlciBibG9jazogUFRSX0lEICovCisgICAgc2hvcnRfdQlwYl9jb3VudDsJLyogbnVtYmVyIG9mIHBvaW50ZXIgaW4gdGhpcyBibG9jayAqLworICAgIHNob3J0X3UJcGJfY291bnRfbWF4OwkvKiBtYXhpbXVtIHZhbHVlIGZvciBwYl9jb3VudCAqLworICAgIFBUUl9FTglwYl9wb2ludGVyWzFdOwkvKiBsaXN0IG9mIHBvaW50ZXJzIHRvIGJsb2NrcyAoYWN0dWFsbHkgbG9uZ2VyKQorCQkJCSAqIGZvbGxvd2VkIGJ5IGVtcHR5IHNwYWNlIHVudGlsIGVuZCBvZiBwYWdlICovCit9OworCisvKgorICogQSBkYXRhIGJsb2NrIGlzIGEgbGVhZiBpbiB0aGUgdHJlZS4KKyAqCisgKiBUaGUgdGV4dCBvZiB0aGUgbGluZXMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suIFRoZSB0ZXh0IG9mIHRoZSBmaXJzdCBsaW5lCisgKiBpbiB0aGUgYmxvY2sgaXMgcHV0IGF0IHRoZSBlbmQsIHRoZSB0ZXh0IG9mIHRoZSBzZWNvbmQgbGluZSBpbiBmcm9udCBvZiBpdCwKKyAqIGV0Yy4gVGh1cyB0aGUgb3JkZXIgb2YgdGhlIGxpbmVzIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgbGluZSBudW1iZXIuCisgKi8KK3N0cnVjdCBkYXRhX2Jsb2NrCit7CisgICAgc2hvcnRfdQlkYl9pZDsJCS8qIElEIGZvciBkYXRhIGJsb2NrOiBEQVRBX0lEICovCisgICAgdW5zaWduZWQJZGJfZnJlZTsJLyogZnJlZSBzcGFjZSBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZAlkYl90eHRfc3RhcnQ7CS8qIGJ5dGUgd2hlcmUgdGV4dCBzdGFydHMgKi8KKyAgICB1bnNpZ25lZAlkYl90eHRfZW5kOwkvKiBieXRlIGp1c3QgYWZ0ZXIgZGF0YSBibG9jayAqLworICAgIGxpbmVucl9UCWRiX2xpbmVfY291bnQ7CS8qIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGJsb2NrICovCisgICAgdW5zaWduZWQJZGJfaW5kZXhbMV07CS8qIGluZGV4IGZvciBzdGFydCBvZiBsaW5lIChhY3R1YWxseSBiaWdnZXIpCisJCQkJICogZm9sbG93ZWQgYnkgZW1wdHkgc3BhY2UgdXB0byBkYl90eHRfc3RhcnQKKwkJCQkgKiBmb2xsb3dlZCBieSB0aGUgdGV4dCBpbiB0aGUgbGluZXMgdW50aWwKKwkJCQkgKiBlbmQgb2YgcGFnZSAqLworfTsKKworLyoKKyAqIFRoZSBsb3cgYml0cyBvZiBkYl9pbmRleCBob2xkIHRoZSBhY3R1YWwgaW5kZXguIFRoZSB0b3Btb3N0IGJpdCBpcworICogdXNlZCBmb3IgdGhlIGdsb2JhbCBjb21tYW5kIHRvIGJlIGFibGUgdG8gbWFyayBhIGxpbmUuCisgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2xlYW4sIGJ1dCBvdGhlcndpc2UgdGhlcmUgd291bGQgYmUgYXQgbGVhc3Qgb25lIGV4dHJhCisgKiBieXRlIHVzZWQgZm9yIGVhY2ggbGluZS4KKyAqIFRoZSBtYXJrIGhhcyB0byBiZSBpbiB0aGlzIHBsYWNlIHRvIGtlZXAgaXQgd2l0aCB0aGUgY29ycmVjdCBsaW5lIHdoZW4gb3RoZXIKKyAqIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLgorICovCisjZGVmaW5lIERCX01BUktFRAkoKHVuc2lnbmVkKTEgPDwgKChzaXplb2YodW5zaWduZWQpICogOCkgLSAxKSkKKyNkZWZpbmUgREJfSU5ERVhfTUFTSwkofkRCX01BUktFRCkKKworI2RlZmluZSBJTkRFWF9TSVpFICAoc2l6ZW9mKHVuc2lnbmVkKSkJICAgIC8qIHNpemUgb2Ygb25lIGRiX2luZGV4IGVudHJ5ICovCisjZGVmaW5lIEhFQURFUl9TSVpFIChzaXplb2YoREFUQV9CTCkgLSBJTkRFWF9TSVpFKSAgLyogc2l6ZSBvZiBkYXRhIGJsb2NrIGhlYWRlciAqLworCisjZGVmaW5lIEIwX0ZOQU1FX1NJWkUJOTAwCisjZGVmaW5lIEIwX1VOQU1FX1NJWkUJNDAKKyNkZWZpbmUgQjBfSE5BTUVfU0laRQk0MAorLyoKKyAqIFJlc3RyaWN0IHRoZSBudW1iZXJzIHRvIDMyIGJpdHMsIG90aGVyd2lzZSBtb3N0IGNvbXBpbGVycyB3aWxsIGNvbXBsYWluLgorICogVGhpcyB3b24ndCBkZXRlY3QgYSA2NCBiaXQgbWFjaGluZSB0aGF0IG9ubHkgc3dhcHMgYSBieXRlIGluIHRoZSB0b3AgMzIKKyAqIGJpdHMsIGJ1dCB0aGF0IGlzIGNyYXp5IGFueXdheS4KKyAqLworI2RlZmluZSBCMF9NQUdJQ19MT05HCTB4MzAzMTMyMzNMCisjZGVmaW5lIEIwX01BR0lDX0lOVAkweDIwMjEyMjIzTAorI2RlZmluZSBCMF9NQUdJQ19TSE9SVAkweDEwMTExMjEzTAorI2RlZmluZSBCMF9NQUdJQ19DSEFSCTB4NTUKKworLyoKKyAqIEJsb2NrIHplcm8gaG9sZHMgYWxsIGluZm8gYWJvdXQgdGhlIHN3YXAgZmlsZS4KKyAqCisgKiBOT1RFOiBERUZJTklUSU9OIE9GIEJMT0NLIDAgU0hPVUxEIE5PVCBDSEFOR0UhIEl0IHdvdWxkIG1ha2UgYWxsIGV4aXN0aW5nCisgKiBzd2FwIGZpbGVzIHVudXNhYmxlIQorICoKKyAqIElmIHNpemUgb2YgYmxvY2swIGNoYW5nZXMgYW55d2F5LCBhZGp1c3QgTUlOX1NXQVBfUEFHRV9TSVpFIGluIHZpbS5oISEKKyAqCisgKiBUaGlzIGJsb2NrIGlzIGJ1aWx0IHVwIG9mIHNpbmdsZSBieXRlcywgdG8gbWFrZSBpdCBwb3J0YWJsZSBhY2Nyb3MKKyAqIGRpZmZlcmVudCBtYWNoaW5lcy4gYjBfbWFnaWNfKiBpcyB1c2VkIHRvIGNoZWNrIHRoZSBieXRlIG9yZGVyIGFuZCBzaXplIG9mCisgKiB2YXJpYWJsZXMsIGJlY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIHN3YXAgZmlsZSBpcyBub3QgcG9ydGFibGUuCisgKi8KK3N0cnVjdCBibG9jazAKK3sKKyAgICBjaGFyX3UJYjBfaWRbMl07CS8qIGlkIGZvciBibG9jayAwOiBCTE9DSzBfSUQwIGFuZCBCTE9DSzBfSUQxICovCisgICAgY2hhcl91CWIwX3ZlcnNpb25bMTBdOwkvKiBWaW0gdmVyc2lvbiBzdHJpbmcgKi8KKyAgICBjaGFyX3UJYjBfcGFnZV9zaXplWzRdOy8qIG51bWJlciBvZiBieXRlcyBwZXIgcGFnZSAqLworICAgIGNoYXJfdQliMF9tdGltZVs0XTsJLyogbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBmaWxlICovCisgICAgY2hhcl91CWIwX2lub1s0XTsJLyogaW5vZGUgb2YgYjBfZm5hbWUgKi8KKyAgICBjaGFyX3UJYjBfcGlkWzRdOwkvKiBwcm9jZXNzIGlkIG9mIGNyZWF0b3IgKG9yIDApICovCisgICAgY2hhcl91CWIwX3VuYW1lW0IwX1VOQU1FX1NJWkVdOyAvKiBuYW1lIG9mIHVzZXIgKHVpZCBpZiBubyBuYW1lKSAqLworICAgIGNoYXJfdQliMF9obmFtZVtCMF9ITkFNRV9TSVpFXTsgLyogaG9zdCBuYW1lIChpZiBpdCBoYXMgYSBuYW1lKSAqLworICAgIGNoYXJfdQliMF9mbmFtZVtCMF9GTkFNRV9TSVpFXTsgLyogbmFtZSBvZiBmaWxlIGJlaW5nIGVkaXRlZCAqLworICAgIGxvbmcJYjBfbWFnaWNfbG9uZzsJLyogY2hlY2sgZm9yIGJ5dGUgb3JkZXIgb2YgbG9uZyAqLworICAgIGludAkJYjBfbWFnaWNfaW50OwkvKiBjaGVjayBmb3IgYnl0ZSBvcmRlciBvZiBpbnQgKi8KKyAgICBzaG9ydAliMF9tYWdpY19zaG9ydDsJLyogY2hlY2sgZm9yIGJ5dGUgb3JkZXIgb2Ygc2hvcnQgKi8KKyAgICBjaGFyX3UJYjBfbWFnaWNfY2hhcjsJLyogY2hlY2sgZm9yIGxhc3QgY2hhciAqLworfTsKKyNkZWZpbmUgICBiMF9kaXJ0eSBiMF9mbmFtZVtCMF9GTkFNRV9TSVpFLTFdCisKKyNkZWZpbmUgU1RBQ0tfSU5DUgk1CS8qIG5yIG9mIGVudHJpZXMgYWRkZWQgdG8gbWxfc3RhY2sgYXQgYSB0aW1lICovCisKKy8qCisgKiBUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGZpcnN0IG1hcmsgbWF5IGJlIGlzIHJlbWVtYmVyZWQuCisgKiBJZiBpdCBpcyAwIHRoZXJlIGFyZSBubyBtYXJrcyBhdCBhbGwuCisgKiAoYWx3YXlzIHVzZWQgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBvbmx5LCBubyBidWZmZXIgY2hhbmdlIHBvc3NpYmxlIHdoaWxlCisgKiBleGVjdXRpbmcgYSBnbG9iYWwgY29tbWFuZCkuCisgKi8KK3N0YXRpYyBsaW5lbnJfVAlsb3dlc3RfbWFya2VkID0gMDsKKworLyoKKyAqIGFyZ3VtZW50cyBmb3IgbWxfZmluZF9saW5lKCkKKyAqLworI2RlZmluZSBNTF9ERUxFVEUJMHgxMQkgICAgLyogZGVsZXRlIGxpbmUgKi8KKyNkZWZpbmUgTUxfSU5TRVJUCTB4MTIJICAgIC8qIGluc2VydCBsaW5lICovCisjZGVmaW5lIE1MX0ZJTkQJCTB4MTMJICAgIC8qIGp1c3QgZmluZCB0aGUgbGluZSAqLworI2RlZmluZSBNTF9GTFVTSAkweDAyCSAgICAvKiBmbHVzaCBsb2NrZWQgYmxvY2sgKi8KKyNkZWZpbmUgTUxfU0lNUExFKHgpCSh4ICYgMHgxMCkgIC8qIERFTCwgSU5TIG9yIEZJTkQgKi8KKworc3RhdGljIHZvaWQgc2V0X2IwX2ZuYW1lIF9fQVJHUygoWkVST19CTCAqLCBidWZfVCAqYnVmKSk7CitzdGF0aWMgdGltZV90IHN3YXBmaWxlX2luZm8gX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIGludCByZWNvdl9maWxlX25hbWVzIF9fQVJHUygoY2hhcl91ICoqLCBjaGFyX3UgKiwgaW50IHByZXBlbmRfZG90KSk7CitzdGF0aWMgaW50IG1sX2FwcGVuZF9pbnQgX19BUkdTKChidWZfVCAqLCBsaW5lbnJfVCwgY2hhcl91ICosIGNvbG5yX1QsIGludCwgaW50KSk7CitzdGF0aWMgaW50IG1sX2RlbGV0ZV9pbnQgX19BUkdTKChidWZfVCAqLCBsaW5lbnJfVCwgaW50KSk7CitzdGF0aWMgY2hhcl91ICpmaW5kc3dhcG5hbWUgX19BUkdTKChidWZfVCAqLCBjaGFyX3UgKiosIGNoYXJfdSAqKSk7CitzdGF0aWMgdm9pZCBtbF9mbHVzaF9saW5lIF9fQVJHUygoYnVmX1QgKikpOworc3RhdGljIGJoZHJfVCAqbWxfbmV3X2RhdGEgX19BUkdTKChtZW1maWxlX1QgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyBiaGRyX1QgKm1sX25ld19wdHIgX19BUkdTKChtZW1maWxlX1QgKikpOworc3RhdGljIGJoZHJfVCAqbWxfZmluZF9saW5lIF9fQVJHUygoYnVmX1QgKiwgbGluZW5yX1QsIGludCkpOworc3RhdGljIGludCBtbF9hZGRfc3RhY2sgX19BUkdTKChidWZfVCAqKSk7CitzdGF0aWMgY2hhcl91ICptYWtlc3dhcG5hbWUgX19BUkdTKChidWZfVCAqLCBjaGFyX3UgKikpOworc3RhdGljIHZvaWQgbWxfbGluZWFkZCBfX0FSR1MoKGJ1Zl9UICosIGludCkpOworc3RhdGljIGludCBiMF9tYWdpY193cm9uZyBfX0FSR1MoKFpFUk9fQkwgKikpOworI2lmZGVmIENIRUNLX0lOT0RFCitzdGF0aWMgaW50IGZuYW1lY21wX2lubyBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKiwgbG9uZykpOworI2VuZGlmCitzdGF0aWMgdm9pZCBsb25nX3RvX2NoYXIgX19BUkdTKChsb25nLCBjaGFyX3UgKikpOworc3RhdGljIGxvbmcgY2hhcl90b19sb25nIF9fQVJHUygoY2hhcl91ICopKTsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoV0lOMzI2NCkKK3N0YXRpYyBjaGFyX3UgKm1ha2VfcGVyY2VudF9zd25hbWUgX19BUkdTKChjaGFyX3UgKmRpciwgY2hhcl91ICpuYW1lKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0JZVEVPRkYKK3N0YXRpYyB2b2lkIG1sX3VwZGF0ZWNodW5rIF9fQVJHUygoYnVmX1QgKmJ1ZiwgbG9uZyBsaW5lLCBsb25nIGxlbiwgaW50IHVwZHR5cGUpKTsKKyNlbmRpZgorCisvKgorICogb3BlbiBhIG5ldyBtZW1saW5lIGZvciAnY3VyYnVmJworICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWxfb3BlbigpCit7CisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgYmhkcl9UCSpocCA9IE5VTEw7CisgICAgWkVST19CTAkqYjBwOworICAgIFBUUl9CTAkqcHA7CisgICAgREFUQV9CTAkqZHA7CisKKy8qCisgKiBpbml0IGZpZWxkcyBpbiBtZW1saW5lIHN0cnVjdAorICovCisgICAgY3VyYnVmLT5iX21sLm1sX3N0YWNrX3NpemUgPSAwOwkvKiBubyBzdGFjayB5ZXQgKi8KKyAgICBjdXJidWYtPmJfbWwubWxfc3RhY2sgPSBOVUxMOwkvKiBubyBzdGFjayB5ZXQgKi8KKyAgICBjdXJidWYtPmJfbWwubWxfc3RhY2tfdG9wID0gMDsJLyogbm90aGluZyBpbiB0aGUgc3RhY2sgKi8KKyAgICBjdXJidWYtPmJfbWwubWxfbG9ja2VkID0gTlVMTDsJLyogbm8gY2FjaGVkIGJsb2NrICovCisgICAgY3VyYnVmLT5iX21sLm1sX2xpbmVfbG51bSA9IDA7CS8qIG5vIGNhY2hlZCBsaW5lICovCisjaWZkZWYgRkVBVF9CWVRFT0ZGCisgICAgY3VyYnVmLT5iX21sLm1sX2NodW5rc2l6ZSA9IE5VTEw7CisjZW5kaWYKKworLyoKKyAqIFdoZW4gJ3VwZGF0ZWNvdW50JyBpcyBub24temVybywgZmxhZyB0aGF0IGEgc3dhcCBmaWxlIG1heSBiZSBvcGVuZWQgbGF0ZXIuCisgKi8KKyAgICBpZiAocF91YyAmJiBjdXJidWYtPmJfcF9zd2YpCisJY3VyYnVmLT5iX21heV9zd2FwID0gVFJVRTsKKyAgICBlbHNlCisJY3VyYnVmLT5iX21heV9zd2FwID0gRkFMU0U7CisKKy8qCisgKiBPcGVuIHRoZSBtZW1maWxlLiAgTm8gc3dhcCBmaWxlIGlzIGNyZWF0ZWQgeWV0LgorICovCisgICAgbWZwID0gbWZfb3BlbihOVUxMLCAwKTsKKyAgICBpZiAobWZwID09IE5VTEwpCisJZ290byBlcnJvcjsKKworICAgIGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgPSBtZnA7CisgICAgY3VyYnVmLT5iX21sLm1sX2ZsYWdzID0gTUxfRU1QVFk7CisgICAgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPSAxOworCisjaWYgZGVmaW5lZChNU0RPUykgJiYgIWRlZmluZWQoREpHUFApCisgICAgLyogZm9yIDE2IGJpdCBNUy1ET1MgY3JlYXRlIGEgc3dhcGZpbGUgbm93LCBiZWNhdXNlIHdlIHJ1biBvdXQgb2YKKyAgICAgKiBtZW1vcnkgdmVyeSBxdWlja2x5ICovCisgICAgaWYgKHBfdWMgIT0gMCkKKwltbF9vcGVuX2ZpbGUoY3VyYnVmKTsKKyNlbmRpZgorCisvKgorICogZmlsbCBibG9jazAgc3RydWN0IGFuZCB3cml0ZSBwYWdlIDAKKyAqLworICAgIGlmICgoaHAgPSBtZl9uZXcobWZwLCBGQUxTRSwgMSkpID09IE5VTEwpCisJZ290byBlcnJvcjsKKyAgICBpZiAoaHAtPmJoX2JudW0gIT0gMCkKKyAgICB7CisJRU1TRyhfKCJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IikpOworCWdvdG8gZXJyb3I7CisgICAgfQorICAgIGIwcCA9IChaRVJPX0JMICopKGhwLT5iaF9kYXRhKTsKKworICAgIGIwcC0+YjBfaWRbMF0gPSBCTE9DSzBfSUQwOworICAgIGIwcC0+YjBfaWRbMV0gPSBCTE9DSzBfSUQxOworICAgIGIwcC0+YjBfZGlydHkgPSBjdXJidWYtPmJfY2hhbmdlZCA/IDB4NTUgOiAwOworICAgIGIwcC0+YjBfbWFnaWNfbG9uZyA9IChsb25nKUIwX01BR0lDX0xPTkc7CisgICAgYjBwLT5iMF9tYWdpY19pbnQgPSAoaW50KUIwX01BR0lDX0lOVDsKKyAgICBiMHAtPmIwX21hZ2ljX3Nob3J0ID0gKHNob3J0KUIwX01BR0lDX1NIT1JUOworICAgIGIwcC0+YjBfbWFnaWNfY2hhciA9IEIwX01BR0lDX0NIQVI7CisKKyAgICBTVFJOQ1BZKGIwcC0+YjBfdmVyc2lvbiwgIlZJTSAiLCA0KTsKKyAgICBTVFJOQ1BZKGIwcC0+YjBfdmVyc2lvbiArIDQsIFZlcnNpb24sIDYpOworICAgIHNldF9iMF9mbmFtZShiMHAsIGN1cmJ1Zik7CisgICAgbG9uZ190b19jaGFyKChsb25nKW1mcC0+bWZfcGFnZV9zaXplLCBiMHAtPmIwX3BhZ2Vfc2l6ZSk7CisgICAgKHZvaWQpZ2V0X3VzZXJfbmFtZShiMHAtPmIwX3VuYW1lLCBCMF9VTkFNRV9TSVpFKTsKKyAgICBiMHAtPmIwX3VuYW1lW0IwX1VOQU1FX1NJWkUgLSAxXSA9IE5VTDsKKyAgICBtY2hfZ2V0X2hvc3RfbmFtZShiMHAtPmIwX2huYW1lLCBCMF9ITkFNRV9TSVpFKTsKKyAgICBiMHAtPmIwX2huYW1lW0IwX0hOQU1FX1NJWkUgLSAxXSA9IE5VTDsKKyAgICBsb25nX3RvX2NoYXIobWNoX2dldF9waWQoKSwgYjBwLT5iMF9waWQpOworCisgICAgLyoKKyAgICAgKiBBbHdheXMgc3luYyBibG9jayBudW1iZXIgMCB0byBkaXNrLCBzbyB3ZSBjYW4gY2hlY2sgdGhlIGZpbGUgbmFtZSBpbgorICAgICAqIHRoZSBzd2FwIGZpbGUgaW4gZmluZHN3YXBuYW1lKCkuIERvbid0IGRvIHRoaXMgZm9yIGhlbHAgZmlsZXMgdGhvdWdoLgorICAgICAqIE9ubHkgd29ya3Mgd2hlbiB0aGVyZSdzIGEgc3dhcGZpbGUsIG90aGVyd2lzZSBpdCdzIGRvbmUgd2hlbiB0aGUgZmlsZQorICAgICAqIGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgbWZfcHV0KG1mcCwgaHAsIFRSVUUsIEZBTFNFKTsKKyAgICBpZiAoIWN1cmJ1Zi0+Yl9oZWxwKQorCSh2b2lkKW1mX3N5bmMobWZwLCAwKTsKKworLyoKKyAqIGZpbGwgaW4gcm9vdCBwb2ludGVyIGJsb2NrIGFuZCB3cml0ZSBwYWdlIDEKKyAqLworICAgIGlmICgoaHAgPSBtbF9uZXdfcHRyKG1mcCkpID09IE5VTEwpCisJZ290byBlcnJvcjsKKyAgICBpZiAoaHAtPmJoX2JudW0gIT0gMSkKKyAgICB7CisJRU1TRyhfKCJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IikpOworCWdvdG8gZXJyb3I7CisgICAgfQorICAgIHBwID0gKFBUUl9CTCAqKShocC0+YmhfZGF0YSk7CisgICAgcHAtPnBiX2NvdW50ID0gMTsKKyAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9ibnVtID0gMjsKKyAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9wYWdlX2NvdW50ID0gMTsKKyAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9vbGRfbG51bSA9IDE7CisgICAgcHAtPnBiX3BvaW50ZXJbMF0ucGVfbGluZV9jb3VudCA9IDE7ICAgIC8qIGxpbmUgY291bnQgYWZ0ZXIgaW5zZXJ0aW9uICovCisgICAgbWZfcHV0KG1mcCwgaHAsIFRSVUUsIEZBTFNFKTsKKworLyoKKyAqIGFsbG9jYXRlIGZpcnN0IGRhdGEgYmxvY2sgYW5kIGNyZWF0ZSBhbiBlbXB0eSBsaW5lIDEuCisgKi8KKyAgICBpZiAoKGhwID0gbWxfbmV3X2RhdGEobWZwLCBGQUxTRSwgMSkpID09IE5VTEwpCisJZ290byBlcnJvcjsKKyAgICBpZiAoaHAtPmJoX2JudW0gIT0gMikKKyAgICB7CisJRU1TRyhfKCJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IikpOworCWdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisgICAgZHAtPmRiX2luZGV4WzBdID0gLS1kcC0+ZGJfdHh0X3N0YXJ0OwkvKiBhdCBlbmQgb2YgYmxvY2sgKi8KKyAgICBkcC0+ZGJfZnJlZSAtPSAxICsgSU5ERVhfU0laRTsKKyAgICBkcC0+ZGJfbGluZV9jb3VudCA9IDE7CisgICAgKigoY2hhcl91ICopZHAgKyBkcC0+ZGJfdHh0X3N0YXJ0KSA9IE5VTDsJLyogZW10cHkgbGluZSAqLworCisgICAgcmV0dXJuIE9LOworCitlcnJvcjoKKyAgICBpZiAobWZwICE9IE5VTEwpCisgICAgeworCWlmIChocCkKKwkgICAgbWZfcHV0KG1mcCwgaHAsIEZBTFNFLCBGQUxTRSk7CisJbWZfY2xvc2UobWZwLCBUUlVFKTsJICAgIC8qIHdpbGwgYWxzbyBmcmVlKG1mcC0+bWZfZm5hbWUpICovCisgICAgfQorICAgIGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgPSBOVUxMOworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogbWxfc2V0bmFtZSgpIGlzIGNhbGxlZCB3aGVuIHRoZSBmaWxlIG5hbWUgb2YgImJ1ZiIgaGFzIGJlZW4gY2hhbmdlZC4KKyAqIEl0IG1heSByZW5hbWUgdGhlIHN3YXAgZmlsZS4KKyAqLworICAgIHZvaWQKK21sX3NldG5hbWUoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaW50CQlzdWNjZXNzID0gRkFMU0U7CisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBjaGFyX3UJKmRpcnA7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyAgICBjaGFyX3UJKnA7CisjZW5kaWYKKworICAgIG1mcCA9IGJ1Zi0+Yl9tbC5tbF9tZnA7CisgICAgaWYgKG1mcC0+bWZfZmQgPCAwKQkJICAgIC8qIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSB5ZXQgKi8KKyAgICB7CisJLyoKKwkgKiBXaGVuICd1cGRhdGVjb3VudCcgaXMgMCBhbmQgJ25vc3dhcGZpbGUnIHRoZXJlIGlzIG5vIHN3YXAgZmlsZS4KKwkgKiBGb3IgaGVscCBmaWxlcyB3ZSB3aWxsIG1ha2UgYSBzd2FwIGZpbGUgbm93LgorCSAqLworCWlmIChwX3VjICE9IDApCisJICAgIG1sX29wZW5fZmlsZShidWYpOwkgICAgLyogY3JlYXRlIGEgc3dhcCBmaWxlICovCisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogVHJ5IGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgJ2RpcmVjdG9yeScgb3B0aW9uLgorICAgICAqLworICAgIGRpcnAgPSBwX2RpcjsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoKmRpcnAgPT0gTlVMKQkgICAgLyogdHJpZWQgYWxsIGRpcmVjdG9yaWVzLCBmYWlsICovCisJICAgIGJyZWFrOworCWZuYW1lID0gZmluZHN3YXBuYW1lKGJ1ZiwgJmRpcnAsIG1mcC0+bWZfZm5hbWUpOyAvKiBhbGxvYydzIGZuYW1lICovCisJaWYgKGZuYW1lID09IE5VTEwpCSAgICAvKiBubyBmaWxlIG5hbWUgZm91bmQgZm9yIHRoaXMgZGlyICovCisJICAgIGNvbnRpbnVlOworCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKwkvKgorCSAqIFNldCBmdWxsIHBhdGhuYW1lIGZvciBzd2FwIGZpbGUgbm93LCBiZWNhdXNlIGEgIjohY2QgZGlyIiBtYXkKKwkgKiBjaGFuZ2UgZGlyZWN0b3J5IHdpdGhvdXQgdXMga25vd2luZyBpdC4KKwkgKi8KKwlwID0gRnVsbE5hbWVfc2F2ZShmbmFtZSwgRkFMU0UpOworCXZpbV9mcmVlKGZuYW1lKTsKKwlmbmFtZSA9IHA7CisJaWYgKGZuYW1lID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJLyogaWYgdGhlIGZpbGUgbmFtZSBpcyB0aGUgc2FtZSB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nICovCisJaWYgKGZuYW1lY21wKGZuYW1lLCBtZnAtPm1mX2ZuYW1lKSA9PSAwKQorCXsKKwkgICAgdmltX2ZyZWUoZm5hbWUpOworCSAgICBzdWNjZXNzID0gVFJVRTsKKwkgICAgYnJlYWs7CisJfQorCS8qIG5lZWQgdG8gY2xvc2UgdGhlIHN3YXAgZmlsZSBiZWZvcmUgcmVuYW1pbmcgKi8KKwlpZiAobWZwLT5tZl9mZCA+PSAwKQorCXsKKwkgICAgY2xvc2UobWZwLT5tZl9mZCk7CisJICAgIG1mcC0+bWZfZmQgPSAtMTsKKwl9CisKKwkvKiB0cnkgdG8gcmVuYW1lIHRoZSBzd2FwIGZpbGUgKi8KKwlpZiAodmltX3JlbmFtZShtZnAtPm1mX2ZuYW1lLCBmbmFtZSkgPT0gMCkKKwl7CisJICAgIHN1Y2Nlc3MgPSBUUlVFOworCSAgICB2aW1fZnJlZShtZnAtPm1mX2ZuYW1lKTsKKwkgICAgbWZwLT5tZl9mbmFtZSA9IGZuYW1lOworCSAgICB2aW1fZnJlZShtZnAtPm1mX2ZmbmFtZSk7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKwkgICAgbWZwLT5tZl9mZm5hbWUgPSBOVUxMOyAgLyogbWZfZm5hbWUgaXMgZnVsbCBwYXRobmFtZSBhbHJlYWR5ICovCisjZWxzZQorCSAgICBtZl9zZXRfZmZuYW1lKG1mcCk7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJfQorCXZpbV9mcmVlKGZuYW1lKTsJICAgIC8qIHRoaXMgZm5hbWUgZGlkbid0IHdvcmssIHRyeSBhbm90aGVyICovCisgICAgfQorCisgICAgaWYgKG1mcC0+bWZfZmQgPT0gLTEpCSAgICAvKiBuZWVkIHRvIChyZSlvcGVuIHRoZSBzd2FwIGZpbGUgKi8KKyAgICB7CisJbWZwLT5tZl9mZCA9IG1jaF9vcGVuKChjaGFyICopbWZwLT5tZl9mbmFtZSwgT19SRFdSIHwgT19FWFRSQSwgMCk7CisJaWYgKG1mcC0+bWZfZmQgPCAwKQorCXsKKwkgICAgLyogY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PyAqLworCSAgICBFTVNHKF8oIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIpKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgaWYgKCFzdWNjZXNzKQorCUVNU0coXygiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiKSk7Cit9CisKKy8qCisgKiBPcGVuIGEgZmlsZSBmb3IgdGhlIG1lbWZpbGUgZm9yIGFsbCBidWZmZXJzIHRoYXQgYXJlIG5vdCByZWFkb25seSBvciBoYXZlCisgKiBiZWVuIG1vZGlmaWVkLgorICogVXNlZCB3aGVuICd1cGRhdGVjb3VudCcgY2hhbmdlcyBmcm9tIHplcm8gdG8gbm9uLXplcm8uCisgKi8KKyAgICB2b2lkCittbF9vcGVuX2ZpbGVzKCkKK3sKKyAgICBidWZfVAkqYnVmOworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCWlmICghYnVmLT5iX3Bfcm8gfHwgYnVmLT5iX2NoYW5nZWQpCisJICAgIG1sX29wZW5fZmlsZShidWYpOworfQorCisvKgorICogT3BlbiBhIHN3YXAgZmlsZSBmb3IgYW4gZXhpc3RpbmcgbWVtZmlsZSwgaWYgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIHlldC4KKyAqIElmIHdlIGFyZSB1bmFibGUgdG8gZmluZCBhIGZpbGUgbmFtZSwgbWZfZm5hbWUgd2lsbCBiZSBOVUxMCisgKiBhbmQgdGhlIG1lbWZpbGUgd2lsbCBiZSBpbiBtZW1vcnkgb25seSAobm8gcmVjb3ZlcnkgcG9zc2libGUpLgorICovCisgICAgdm9pZAorbWxfb3Blbl9maWxlKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgY2hhcl91CSpkaXJwOworCisgICAgbWZwID0gYnVmLT5iX21sLm1sX21mcDsKKyAgICBpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tZl9mZCA+PSAwIHx8ICFidWYtPmJfcF9zd2YpCisJcmV0dXJuOwkJLyogbm90aGluZyB0byBkbyAqLworCisgICAgLyoKKyAgICAgKiBUcnkgYWxsIGRpcmVjdG9yaWVzIGluICdkaXJlY3RvcnknIG9wdGlvbi4KKyAgICAgKi8KKyAgICBkaXJwID0gcF9kaXI7CisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKCpkaXJwID09IE5VTCkKKwkgICAgYnJlYWs7CisJLyogVGhlcmUgaXMgYSBzbWFsbCBjaGFuY2UgdGhhdCBiZXR3ZWVuIGNob3NpbmcgdGhlIHN3YXAgZmlsZSBuYW1lIGFuZAorCSAqIGNyZWF0aW5nIGl0LCBhbm90aGVyIFZpbSBjcmVhdGVzIHRoZSBmaWxlLiAgSW4gdGhhdCBjYXNlIHRoZQorCSAqIGNyZWF0aW9uIHdpbGwgZmFpbCBhbmQgd2Ugd2lsbCB1c2UgYW5vdGhlciBkaXJlY3RvcnkuICovCisJZm5hbWUgPSBmaW5kc3dhcG5hbWUoYnVmLCAmZGlycCwgTlVMTCk7CS8qIGFsbG9jYXRlcyBmbmFtZSAqLworCWlmIChmbmFtZSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwlpZiAobWZfb3Blbl9maWxlKG1mcCwgZm5hbWUpID09IE9LKQkvKiBjb25zdW1lcyBmbmFtZSEgKi8KKwl7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChSSVNDT1MpCisJICAgIC8qCisJICAgICAqIHNldCBmdWxsIHBhdGhuYW1lIGZvciBzd2FwIGZpbGUgbm93LCBiZWNhdXNlIGEgIjohY2QgZGlyIiBtYXkKKwkgICAgICogY2hhbmdlIGRpcmVjdG9yeSB3aXRob3V0IHVzIGtub3dpbmcgaXQuCisJICAgICAqLworCSAgICBtZl9mdWxsbmFtZShtZnApOworI2VuZGlmCisJICAgIC8qIEZsdXNoIGJsb2NrIHplcm8sIHNvIG90aGVycyBjYW4gcmVhZCBpdCAqLworCSAgICBpZiAobWZfc3luYyhtZnAsIE1GU19aRVJPKSA9PSBPSykKKwkJYnJlYWs7CisJICAgIC8qIFdyaXRpbmcgYmxvY2sgMCBmYWlsZWQ6IGNsb3NlIHRoZSBmaWxlIGFuZCB0cnkgYW5vdGhlciBkaXIgKi8KKwkgICAgbWZfY2xvc2VfZmlsZShidWYsIEZBTFNFKTsKKwl9CisgICAgfQorCisgICAgaWYgKG1mcC0+bWZfZm5hbWUgPT0gTlVMTCkJCS8qIEZhaWxlZCEgKi8KKyAgICB7CisJbmVlZF93YWl0X3JldHVybiA9IFRSVUU7CS8qIGNhbGwgd2FpdF9yZXR1cm4gbGF0ZXIgKi8KKwkrK25vX3dhaXRfcmV0dXJuOworCSh2b2lkKUVNU0cyKF8oIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIiksCisJCSAgICBidWZfc3BuYW1lKGJ1ZikgIT0gTlVMTAorCQkJPyAoY2hhcl91ICopYnVmX3NwbmFtZShidWYpCisJCQk6IGJ1Zi0+Yl9mbmFtZSk7CisJLS1ub193YWl0X3JldHVybjsKKyAgICB9CisKKyAgICAvKiBkb24ndCB0cnkgdG8gb3BlbiBhIHN3YXAgZmlsZSBhZ2FpbiAqLworICAgIGJ1Zi0+Yl9tYXlfc3dhcCA9IEZBTFNFOworfQorCisvKgorICogSWYgc3RpbGwgbmVlZCB0byBjcmVhdGUgYSBzd2FwIGZpbGUsIGFuZCBzdGFydGluZyB0byBlZGl0IGEgbm90LXJlYWRvbmx5CisgKiBmaWxlLCBvciByZWFkaW5nIGludG8gYW4gZXhpc3RpbmcgYnVmZmVyLCBjcmVhdGUgYSBzd2FwIGZpbGUgbm93LgorICovCisgICAgdm9pZAorY2hlY2tfbmVlZF9zd2FwKG5ld2ZpbGUpCisgICAgaW50CSAgICBuZXdmaWxlOwkJLyogcmVhZGluZyBmaWxlIGludG8gbmV3IGJ1ZmZlciAqLworeworICAgIGlmIChjdXJidWYtPmJfbWF5X3N3YXAgJiYgKCFjdXJidWYtPmJfcF9ybyB8fCAhbmV3ZmlsZSkpCisJbWxfb3Blbl9maWxlKGN1cmJ1Zik7Cit9CisKKy8qCisgKiBDbG9zZSBtZW1saW5lIGZvciBidWZmZXIgJ2J1ZicuCisgKiBJZiAnZGVsX2ZpbGUnIGlzIFRSVUUsIGRlbGV0ZSB0aGUgc3dhcCBmaWxlCisgKi8KKyAgICB2b2lkCittbF9jbG9zZShidWYsIGRlbF9maWxlKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlkZWxfZmlsZTsKK3sKKyAgICBpZiAoYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKQkJLyogbm90IG9wZW4gKi8KKwlyZXR1cm47CisgICAgbWZfY2xvc2UoYnVmLT5iX21sLm1sX21mcCwgZGVsX2ZpbGUpOwkvKiBjbG9zZSB0aGUgLnN3cCBmaWxlICovCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gIT0gMCAmJiAoYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfTElORV9ESVJUWSkpCisJdmltX2ZyZWUoYnVmLT5iX21sLm1sX2xpbmVfcHRyKTsKKyAgICB2aW1fZnJlZShidWYtPmJfbWwubWxfc3RhY2spOworI2lmZGVmIEZFQVRfQllURU9GRgorICAgIHZpbV9mcmVlKGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUpOworICAgIGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgPSBOVUxMOworI2VuZGlmCisgICAgYnVmLT5iX21sLm1sX21mcCA9IE5VTEw7CisKKyAgICAvKiBSZXNldCB0aGUgInJlY292ZXJlZCIgZmxhZywgZ2l2ZSB0aGUgQVRURU5USU9OIHByb21wdCB0aGUgbmV4dCB0aW1lCisgICAgICogdGhpcyBidWZmZXIgaXMgbG9hZGVkLiAqLworICAgIGJ1Zi0+Yl9mbGFncyAmPSB+QkZfUkVDT1ZFUkVEOworfQorCisvKgorICogQ2xvc2UgYWxsIGV4aXN0aW5nIG1lbWxpbmVzIGFuZCBtZW1maWxlcy4KKyAqIE9ubHkgdXNlZCB3aGVuIGV4aXRpbmcuCisgKiBXaGVuICdkZWxfZmlsZScgaXMgVFJVRSwgZGVsZXRlIHRoZSBtZW1maWxlcy4KKyAqLworICAgIHZvaWQKK21sX2Nsb3NlX2FsbChkZWxfZmlsZSkKKyAgICBpbnQJCWRlbF9maWxlOworeworICAgIGJ1Zl9UCSpidWY7CisKKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJbWxfY2xvc2UoYnVmLCBkZWxfZmlsZSk7CisjaWZkZWYgVEVNUERJUk5BTUVTCisgICAgdmltX2RlbHRlbXBkaXIoKTsJICAgIC8qIGRlbGV0ZSBjcmVhdGVkIHRlbXAgZGlyZWN0b3J5ICovCisjZW5kaWYKK30KKworLyoKKyAqIENsb3NlIGFsbCBtZW1maWxlcyBmb3Igbm90IG1vZGlmaWVkIGJ1ZmZlcnMuCisgKiBPbmx5IHVzZSBqdXN0IGJlZm9yZSBleGl0aW5nIQorICovCisgICAgdm9pZAorbWxfY2xvc2Vfbm90bW9kKCkKK3sKKyAgICBidWZfVAkqYnVmOworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorCWlmICghYnVmSXNDaGFuZ2VkKGJ1ZikpCisJICAgIG1sX2Nsb3NlKGJ1ZiwgVFJVRSk7ICAgIC8qIGNsb3NlIGFsbCBub3QtbW9kaWZpZWQgYnVmZmVycyAqLworfQorCisvKgorICogVXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIC5zd3AgZmlsZS4KKyAqIFVzZWQgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiB3cml0dGVuLgorICovCisgICAgdm9pZAorbWxfdGltZXN0YW1wKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGJoZHJfVAkqaHA7CisgICAgWkVST19CTAkqYjBwOworCisgICAgbWZwID0gYnVmLT5iX21sLm1sX21mcDsKKworICAgIGlmIChtZnAgPT0gTlVMTCB8fCAoaHAgPSBtZl9nZXQobWZwLCAoYmxvY2tucl9UKTAsIDEpKSA9PSBOVUxMKQorCXJldHVybjsKKyAgICBiMHAgPSAoWkVST19CTCAqKShocC0+YmhfZGF0YSk7CisgICAgaWYgKGIwcC0+YjBfaWRbMF0gIT0gQkxPQ0swX0lEMCB8fCBiMHAtPmIwX2lkWzFdICE9IEJMT0NLMF9JRDEpCisJRU1TRyhfKCJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IikpOworICAgIGVsc2UKKwlzZXRfYjBfZm5hbWUoYjBwLCBidWYpOworICAgIG1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBXcml0ZSBmaWxlIG5hbWUgYW5kIHRpbWVzdGFtcCBpbnRvIGJsb2NrIDAgb2YgYSBzd2FwIGZpbGUuCisgKiBBbHNvIHNldCBidWYtPmJfbXRpbWUuCisgKiBEb24ndCB1c2UgTmFtZUJ1ZmZbXSEhIQorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9iMF9mbmFtZShiMHAsIGJ1ZikKKyAgICBaRVJPX0JMCSpiMHA7CisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKworICAgIGlmIChidWYtPmJfZmZuYW1lID09IE5VTEwpCisJYjBwLT5iMF9mbmFtZVswXSA9IE5VTDsKKyAgICBlbHNlCisgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoUklTQ09TKQorCS8qIHN5c3RlbXMgdGhhdCBjYW5ub3QgdHJhbnNsYXRlICJ+dXNlciIgYmFjayBpbnRvIGEgcGF0aDogY29weSB0aGUKKwkgKiBmaWxlIG5hbWUgdW5tb2RpZmllZCAqLworCVNUUk5DUFkoYjBwLT5iMF9mbmFtZSwgYnVmLT5iX2ZmbmFtZSwgQjBfRk5BTUVfU0laRSk7CisjZWxzZQorCXNpemVfdAlmbGVuLCB1bGVuOworCWNoYXJfdQl1bmFtZVtCMF9VTkFNRV9TSVpFXTsKKworCS8qCisJICogRm9yIGEgZmlsZSB1bmRlciB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgdXNlciwgd2UgdHJ5IHRvCisJICogcmVwbGFjZSB0aGUgaG9tZSBkaXJlY3RvcnkgcGF0aCB3aXRoICJ+dXNlciIuIFRoaXMgaGVscHMgd2hlbgorCSAqIGVkaXRpbmcgdGhlIHNhbWUgZmlsZSBvbiBkaWZmZXJlbnQgbWFjaGluZXMgb3ZlciBhIG5ldHdvcmsuCisJICogRmlyc3QgcmVwbGFjZSBob21lIGRpciBwYXRoIHdpdGggIn4vIiB3aXRoIGhvbWVfcmVwbGFjZSgpLgorCSAqIFRoZW4gaW5zZXJ0IHRoZSB1c2VyIG5hbWUgdG8gZ2V0ICJ+dXNlci8iLgorCSAqLworCWhvbWVfcmVwbGFjZShOVUxMLCBidWYtPmJfZmZuYW1lLCBiMHAtPmIwX2ZuYW1lLCBCMF9GTkFNRV9TSVpFLCBUUlVFKTsKKwlpZiAoYjBwLT5iMF9mbmFtZVswXSA9PSAnficpCisJeworCSAgICBmbGVuID0gU1RSTEVOKGIwcC0+YjBfZm5hbWUpOworCSAgICAvKiBJZiB0aGVyZSBpcyBubyB1c2VyIG5hbWUgb3IgaXQgaXMgdG9vIGxvbmcsIGRvbid0IHVzZSAifi8iICovCisJICAgIGlmIChnZXRfdXNlcl9uYW1lKHVuYW1lLCBCMF9VTkFNRV9TSVpFKSA9PSBGQUlMCisJCQkgfHwgKHVsZW4gPSBTVFJMRU4odW5hbWUpKSArIGZsZW4gPiBCMF9GTkFNRV9TSVpFIC0gMSkKKwkJU1RSTkNQWShiMHAtPmIwX2ZuYW1lLCBidWYtPmJfZmZuYW1lLCBCMF9GTkFNRV9TSVpFKTsKKwkgICAgZWxzZQorCSAgICB7CisJCW1jaF9tZW1tb3ZlKGIwcC0+YjBfZm5hbWUgKyB1bGVuICsgMSwgYjBwLT5iMF9mbmFtZSArIDEsIGZsZW4pOworCQltY2hfbWVtbW92ZShiMHAtPmIwX2ZuYW1lICsgMSwgdW5hbWUsIHVsZW4pOworCSAgICB9CisJfQorI2VuZGlmCisJaWYgKG1jaF9zdGF0KChjaGFyICopYnVmLT5iX2ZmbmFtZSwgJnN0KSA+PSAwKQorCXsKKwkgICAgbG9uZ190b19jaGFyKChsb25nKXN0LnN0X210aW1lLCBiMHAtPmIwX210aW1lKTsKKyNpZmRlZiBDSEVDS19JTk9ERQorCSAgICBsb25nX3RvX2NoYXIoKGxvbmcpc3Quc3RfaW5vLCBiMHAtPmIwX2lubyk7CisjZW5kaWYKKwkgICAgYnVmX3N0b3JlX3RpbWUoYnVmLCAmc3QsIGJ1Zi0+Yl9mZm5hbWUpOworCSAgICBidWYtPmJfbXRpbWVfcmVhZCA9IGJ1Zi0+Yl9tdGltZTsKKwl9CisJZWxzZQorCXsKKwkgICAgbG9uZ190b19jaGFyKDBMLCBiMHAtPmIwX210aW1lKTsKKyNpZmRlZiBDSEVDS19JTk9ERQorCSAgICBsb25nX3RvX2NoYXIoMEwsIGIwcC0+YjBfaW5vKTsKKyNlbmRpZgorCSAgICBidWYtPmJfbXRpbWUgPSAwOworCSAgICBidWYtPmJfbXRpbWVfcmVhZCA9IDA7CisJICAgIGJ1Zi0+Yl9vcmlnX3NpemUgPSAwOworCSAgICBidWYtPmJfb3JpZ19tb2RlID0gMDsKKwl9CisgICAgfQorfQorCisvKgorICogdHJ5IHRvIHJlY292ZXIgY3VyYnVmIGZyb20gdGhlIC5zd3AgZmlsZQorICovCisgICAgdm9pZAorbWxfcmVjb3ZlcigpCit7CisgICAgYnVmX1QJKmJ1ZiA9IE5VTEw7CisgICAgbWVtZmlsZV9UCSptZnAgPSBOVUxMOworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgYmhkcl9UCSpocCA9IE5VTEw7CisgICAgWkVST19CTAkqYjBwOworICAgIFBUUl9CTAkqcHA7CisgICAgREFUQV9CTAkqZHA7CisgICAgaW5mb3B0cl9UCSppcDsKKyAgICBibG9ja25yX1QJYm51bTsKKyAgICBpbnQJCXBhZ2VfY291bnQ7CisgICAgc3RydWN0IHN0YXQJb3JnX3N0YXQsIHN3cF9zdGF0OworICAgIGludAkJbGVuOworICAgIGludAkJZGlyZWN0bHk7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworICAgIGxvbmcJZXJyb3I7CisgICAgaW50CQljYW5ub3Rfb3BlbjsKKyAgICBsaW5lbnJfVAlsaW5lX2NvdW50OworICAgIGludAkJaGFzX2Vycm9yOworICAgIGludAkJaWR4OworICAgIGludAkJdG9wOworICAgIGludAkJdHh0X3N0YXJ0OworICAgIG9mZl90CXNpemU7CisgICAgaW50CQljYWxsZWRfZnJvbV9tYWluOworICAgIGludAkJc2VyaW91c19lcnJvciA9IFRSVUU7CisgICAgbG9uZwltdGltZTsKKyAgICBpbnQJCWF0dHI7CisKKyAgICByZWNvdmVyeW1vZGUgPSBUUlVFOworICAgIGNhbGxlZF9mcm9tX21haW4gPSAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKTsKKyAgICBhdHRyID0gaGxfYXR0cihITEZfRSk7CisvKgorICogSWYgdGhlIGZpbGUgbmFtZSBlbmRzIGluICIuc3c/IiB3ZSB1c2UgaXQgZGlyZWN0bHkuCisgKiBPdGhlcndpc2UgYSBzZWFyY2ggaXMgZG9uZSB0byBmaW5kIHRoZSBzd2FwIGZpbGUocykuCisgKi8KKyAgICBmbmFtZSA9IGN1cmJ1Zi0+Yl9mbmFtZTsKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCkJCSAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGZpbGUgbmFtZSAqLworCWZuYW1lID0gKGNoYXJfdSAqKSIiOworICAgIGxlbiA9IChpbnQpU1RSTEVOKGZuYW1lKTsKKyAgICBpZiAobGVuID49IDQgJiYKKyNpZiBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChSSVNDT1MpCisJICAgIFNUUk5JQ01QKGZuYW1lICsgbGVuIC0gNCwgIl9zdyIgLCAzKQorI2Vsc2UKKwkgICAgU1RSTklDTVAoZm5hbWUgKyBsZW4gLSA0LCAiLnN3IiAsIDMpCisjZW5kaWYKKwkJPT0gMCkKKyAgICB7CisJZGlyZWN0bHkgPSBUUlVFOworCWZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpOyAvKiBtYWtlIGEgY29weSBmb3IgbWZfb3BlbigpICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZGlyZWN0bHkgPSBGQUxTRTsKKworCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgc3dhcCBmaWxlcyAqLworCWxlbiA9IHJlY292ZXJfbmFtZXMoJmZuYW1lLCBGQUxTRSwgMCk7CisJaWYgKGxlbiA9PSAwKQkJICAgIC8qIG5vIHN3YXAgZmlsZXMgZm91bmQgKi8KKwl7CisJICAgIEVNU0cyKF8oIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiKSwgZm5hbWUpOworCSAgICBnb3RvIHRoZWVuZDsKKwl9CisJaWYgKGxlbiA9PSAxKQkJICAgIC8qIG9uZSBzd2FwIGZpbGUgZm91bmQsIHVzZSBpdCAqLworCSAgICBpID0gMTsKKwllbHNlCQkJICAgIC8qIHNldmVyYWwgc3dhcCBmaWxlcyBmb3VuZCwgY2hvb3NlICovCisJeworCSAgICAvKiBsaXN0IHRoZSBuYW1lcyBvZiB0aGUgc3dhcCBmaWxlcyAqLworCSAgICAodm9pZClyZWNvdmVyX25hbWVzKCZmbmFtZSwgVFJVRSwgMCk7CisJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCSAgICBNU0dfUFVUUyhfKCJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIikpOworCSAgICBpID0gZ2V0X251bWJlcihGQUxTRSk7CisJICAgIGlmIChpIDwgMSB8fCBpID4gbGVuKQorCQlnb3RvIHRoZWVuZDsKKwl9CisJLyogZ2V0IHRoZSBzd2FwIGZpbGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCAqLworCSh2b2lkKXJlY292ZXJfbmFtZXMoJmZuYW1lLCBGQUxTRSwgaSk7CisgICAgfQorICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCWdvdG8gdGhlZW5kOwkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKworICAgIC8qIFdoZW4gY2FsbGVkIGZyb20gbWFpbigpIHN0aWxsIG5lZWQgdG8gaW5pdGlhbGl6ZSBzdG9yYWdlIHN0cnVjdHVyZSAqLworICAgIGlmIChjYWxsZWRfZnJvbV9tYWluICYmIG1sX29wZW4oKSA9PSBGQUlMKQorCWdldG91dCgxKTsKKworLyoKKyAqIGFsbG9jYXRlIGEgYnVmZmVyIHN0cnVjdHVyZSAob25seSB0aGUgbWVtbGluZSBpbiBpdCBpcyByZWFsbHkgdXNlZCkKKyAqLworICAgIGJ1ZiA9IChidWZfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoYnVmX1QpKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGZuYW1lKTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisKKy8qCisgKiBpbml0IGZpZWxkcyBpbiBtZW1saW5lIHN0cnVjdAorICovCisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3NpemUgPSAwOwkvKiBubyBzdGFjayB5ZXQgKi8KKyAgICBidWYtPmJfbWwubWxfc3RhY2sgPSBOVUxMOwkJLyogbm8gc3RhY2sgeWV0ICovCisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IDA7CQkvKiBub3RoaW5nIGluIHRoZSBzdGFjayAqLworICAgIGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gPSAwOwkJLyogbm8gY2FjaGVkIGxpbmUgKi8KKyAgICBidWYtPmJfbWwubWxfbG9ja2VkID0gTlVMTDsJCS8qIG5vIGxvY2tlZCBibG9jayAqLworICAgIGJ1Zi0+Yl9tbC5tbF9mbGFncyA9IDA7CisKKy8qCisgKiBvcGVuIHRoZSBtZW1maWxlIGZyb20gdGhlIG9sZCBzd2FwIGZpbGUKKyAqLworICAgIHAgPSB2aW1fc3Ryc2F2ZShmbmFtZSk7CQkvKiBzYXZlIGZuYW1lIGZvciB0aGUgbWVzc2FnZQorCQkJCQkgICAobWZfb3BlbigpIG1heSBmcmVlIGZuYW1lKSAqLworICAgIG1mcCA9IG1mX29wZW4oZm5hbWUsIE9fUkRPTkxZKTsJLyogY29uc3VtZXMgZm5hbWUhICovCisgICAgaWYgKG1mcCA9PSBOVUxMIHx8IG1mcC0+bWZfZmQgPCAwKQorICAgIHsKKwlpZiAocCAhPSBOVUxMKQorCXsKKwkgICAgRU1TRzIoXygiRTMwNjogQ2Fubm90IG9wZW4gJXMiKSwgcCk7CisJICAgIHZpbV9mcmVlKHApOworCX0KKwlnb3RvIHRoZWVuZDsKKyAgICB9CisgICAgdmltX2ZyZWUocCk7CisgICAgYnVmLT5iX21sLm1sX21mcCA9IG1mcDsKKworICAgIC8qCisgICAgICogVGhlIHBhZ2Ugc2l6ZSBzZXQgaW4gbWZfb3BlbigpIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBwYWdlIHNpemUKKyAgICAgKiB1c2VkIGluIHRoZSBzd2FwIGZpbGUsIHdlIG11c3QgZ2V0IGl0IGZyb20gYmxvY2sgMC4gIEJ1dCB0byByZWFkIGJsb2NrCisgICAgICogMCB3ZSBuZWVkIGEgcGFnZSBzaXplLiAgVXNlIHRoZSBtaW5pbWFsIHNpemUgZm9yIGJsb2NrIDAgaGVyZSwgaXQgd2lsbAorICAgICAqIGJlIHNldCB0byB0aGUgcmVhbCB2YWx1ZSBiZWxvdy4KKyAgICAgKi8KKyAgICBtZnAtPm1mX3BhZ2Vfc2l6ZSA9IE1JTl9TV0FQX1BBR0VfU0laRTsKKworLyoKKyAqIHRyeSB0byByZWFkIGJsb2NrIDAKKyAqLworICAgIGlmICgoaHAgPSBtZl9nZXQobWZwLCAoYmxvY2tucl9UKTAsIDEpKSA9PSBOVUxMKQorICAgIHsKKwltc2dfc3RhcnQoKTsKKwlNU0dfUFVUU19BVFRSKF8oIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiKSwgYXR0ciB8IE1TR19ISVNUKTsKKwltc2dfb3V0dHJhbnNfYXR0cihtZnAtPm1mX2ZuYW1lLCBhdHRyIHwgTVNHX0hJU1QpOworCU1TR19QVVRTX0FUVFIoCisJICAgXygiXG5NYXliZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSBvciBWaW0gZGlkIG5vdCB1cGRhdGUgdGhlIHN3YXAgZmlsZS4iKSwKKwkJYXR0ciB8IE1TR19ISVNUKTsKKwltc2dfZW5kKCk7CisJZ290byB0aGVlbmQ7CisgICAgfQorICAgIGIwcCA9IChaRVJPX0JMICopKGhwLT5iaF9kYXRhKTsKKyAgICBpZiAoU1RSTkNNUChiMHAtPmIwX3ZlcnNpb24sICJWSU0gMy4wIiwgNykgPT0gMCkKKyAgICB7CisJbXNnX3N0YXJ0KCk7CisJbXNnX291dHRyYW5zX2F0dHIobWZwLT5tZl9mbmFtZSwgTVNHX0hJU1QpOworCU1TR19QVVRTX0FUVFIoXygiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIpLAorCQkJCQkJCQkgICAgTVNHX0hJU1QpOworCU1TR19QVVRTX0FUVFIoXygiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIpLCBNU0dfSElTVCk7CisJbXNnX2VuZCgpOworCWdvdG8gdGhlZW5kOworICAgIH0KKyAgICBpZiAoYjBwLT5iMF9pZFswXSAhPSBCTE9DSzBfSUQwIHx8IGIwcC0+YjBfaWRbMV0gIT0gQkxPQ0swX0lEMSkKKyAgICB7CisJRU1TRzIoXygiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIpLCBtZnAtPm1mX2ZuYW1lKTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisgICAgaWYgKGIwX21hZ2ljX3dyb25nKGIwcCkpCisgICAgeworCW1zZ19zdGFydCgpOworCW1zZ19vdXR0cmFuc19hdHRyKG1mcC0+bWZfZm5hbWUsIGF0dHIgfCBNU0dfSElTVCk7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKwlpZiAoU1RSTkNNUChiMHAtPmIwX2huYW1lLCAiUEMgIiwgMykgPT0gMCkKKwkgICAgTVNHX1BVVFNfQVRUUihfKCIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIiksCisJCQkJCQkJICAgICBhdHRyIHwgTVNHX0hJU1QpOworCWVsc2UKKyNlbmRpZgorCSAgICBNU0dfUFVUU19BVFRSKF8oIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIiksCisJCQkJCQkJICAgICBhdHRyIHwgTVNHX0hJU1QpOworCU1TR19QVVRTX0FUVFIoXygiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIiksIGF0dHIgfCBNU0dfSElTVCk7CisJLyogYXZvaWQgZ29pbmcgcGFzdCB0aGUgZW5kIG9mIGEgY3VycnVwdGVkIGhvc3RuYW1lICovCisJYjBwLT5iMF9mbmFtZVswXSA9IE5VTDsKKwlNU0dfUFVUU19BVFRSKGIwcC0+YjBfaG5hbWUsIGF0dHIgfCBNU0dfSElTVCk7CisJTVNHX1BVVFNfQVRUUihfKCIsXG5vciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIpLCBhdHRyIHwgTVNHX0hJU1QpOworCW1zZ19lbmQoKTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBJZiB3ZSBndWVzc2VkIHRoZSB3cm9uZyBwYWdlIHNpemUsIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogaGlnaGVzdCBibG9jayBudW1iZXIgaW4gdGhlIGZpbGUuCisgICAgICovCisgICAgaWYgKG1mcC0+bWZfcGFnZV9zaXplICE9ICh1bnNpZ25lZCljaGFyX3RvX2xvbmcoYjBwLT5iMF9wYWdlX3NpemUpKQorICAgIHsKKwltZl9uZXdfcGFnZV9zaXplKG1mcCwgKHVuc2lnbmVkKWNoYXJfdG9fbG9uZyhiMHAtPmIwX3BhZ2Vfc2l6ZSkpOworCWlmICgoc2l6ZSA9IGxzZWVrKG1mcC0+bWZfZmQsIChvZmZfdCkwTCwgU0VFS19FTkQpKSA8PSAwKQorCSAgICBtZnAtPm1mX2Jsb2NrbnJfbWF4ID0gMDsJICAgIC8qIG5vIGZpbGUgb3IgZW1wdHkgZmlsZSAqLworCWVsc2UKKwkgICAgbWZwLT5tZl9ibG9ja25yX21heCA9IChibG9ja25yX1QpKHNpemUgLyBtZnAtPm1mX3BhZ2Vfc2l6ZSk7CisJbWZwLT5tZl9pbmZpbGVfY291bnQgPSBtZnAtPm1mX2Jsb2NrbnJfbWF4OworICAgIH0KKworLyoKKyAqIElmIC5zd3AgZmlsZSBuYW1lIGdpdmVuIGRpcmVjdGx5LCB1c2UgbmFtZSBmcm9tIHN3YXAgZmlsZSBmb3IgYnVmZmVyLgorICovCisgICAgaWYgKGRpcmVjdGx5KQorICAgIHsKKwlleHBhbmRfZW52KGIwcC0+YjBfZm5hbWUsIE5hbWVCdWZmLCBNQVhQQVRITCk7CisJaWYgKHNldGZuYW1lKGN1cmJ1ZiwgTmFtZUJ1ZmYsIE5VTEwsIFRSVUUpID09IEZBSUwpCisJICAgIGdvdG8gdGhlZW5kOworICAgIH0KKworICAgIGhvbWVfcmVwbGFjZShOVUxMLCBtZnAtPm1mX2ZuYW1lLCBOYW1lQnVmZiwgTUFYUEFUSEwsIFRSVUUpOworICAgIG1zZ19zdHIoKGNoYXJfdSAqKV8oIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiKSwgTmFtZUJ1ZmYpOworCisgICAgaWYgKGJ1Zl9zcG5hbWUoY3VyYnVmKSAhPSBOVUxMKQorCVNUUkNQWShOYW1lQnVmZiwgYnVmX3NwbmFtZShjdXJidWYpKTsKKyAgICBlbHNlCisJaG9tZV9yZXBsYWNlKE5VTEwsIGN1cmJ1Zi0+Yl9mZm5hbWUsIE5hbWVCdWZmLCBNQVhQQVRITCwgVFJVRSk7CisgICAgbXNnX3N0cigoY2hhcl91ICopXygiT3JpZ2luYWwgZmlsZSBcIiVzXCIiKSwgTmFtZUJ1ZmYpOworICAgIG1zZ19wdXRjaGFyKCdcbicpOworCisvKgorICogY2hlY2sgZGF0ZSBvZiBzd2FwIGZpbGUgYW5kIG9yaWdpbmFsIGZpbGUKKyAqLworICAgIG10aW1lID0gY2hhcl90b19sb25nKGIwcC0+YjBfbXRpbWUpOworICAgIGlmIChjdXJidWYtPmJfZmZuYW1lICE9IE5VTEwKKwkgICAgJiYgbWNoX3N0YXQoKGNoYXIgKiljdXJidWYtPmJfZmZuYW1lLCAmb3JnX3N0YXQpICE9IC0xCisJICAgICYmICgobWNoX3N0YXQoKGNoYXIgKiltZnAtPm1mX2ZuYW1lLCAmc3dwX3N0YXQpICE9IC0xCisJCSAgICAmJiBvcmdfc3RhdC5zdF9tdGltZSA+IHN3cF9zdGF0LnN0X210aW1lKQorCQl8fCBvcmdfc3RhdC5zdF9tdGltZSAhPSBtdGltZSkpCisgICAgeworCUVNU0coXygiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiKSk7CisgICAgfQorICAgIG91dF9mbHVzaCgpOworICAgIG1mX3B1dChtZnAsIGhwLCBGQUxTRSwgRkFMU0UpOwkvKiByZWxlYXNlIGJsb2NrIDAgKi8KKyAgICBocCA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIE5vdyB0aGF0IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMgZ29pbmcgdG8gYmUgcmVjb3ZlcmVkLCBjbGVhciB0aGUKKyAgICAgKiBjb250ZW50cyBvZiB0aGUgY3VycmVudCBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKCEoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpKQorCW1sX2RlbGV0ZSgobGluZW5yX1QpMSwgRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBUcnkgcmVhZGluZyB0aGUgb3JpZ2luYWwgZmlsZSB0byBvYnRhaW4gdGhlIHZhbHVlcyBvZiAnZmlsZWZvcm1hdCcsCisgICAgICogJ2ZpbGVlbmNvZGluZycsIGV0Yy4gIElnbm9yZSBlcnJvcnMuICBUaGUgdGV4dCBpdHNlbGYgaXMgbm90IHVzZWQuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJKHZvaWQpcmVhZGZpbGUoY3VyYnVmLT5iX2ZmbmFtZSwgTlVMTCwgKGxpbmVucl9UKTAsCisJCQkgICAgICAobGluZW5yX1QpMCwgKGxpbmVucl9UKU1BWExOVU0sIE5VTEwsIFJFQURfTkVXKTsKKwl3aGlsZSAoIShjdXJidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkpCisJICAgIG1sX2RlbGV0ZSgobGluZW5yX1QpMSwgRkFMU0UpOworICAgIH0KKworICAgIGJudW0gPSAxOwkJLyogc3RhcnQgd2l0aCBibG9jayAxICovCisgICAgcGFnZV9jb3VudCA9IDE7CS8qIHdoaWNoIGlzIDEgcGFnZSAqLworICAgIGxudW0gPSAwOwkJLyogYXBwZW5kIGFmdGVyIGxpbmUgMCBpbiBjdXJidWYgKi8KKyAgICBsaW5lX2NvdW50ID0gMDsKKyAgICBpZHggPSAwOwkJLyogc3RhcnQgd2l0aCBmaXJzdCBpbmRleCBpbiBibG9jayAxICovCisgICAgZXJyb3IgPSAwOworICAgIGJ1Zi0+Yl9tbC5tbF9zdGFja190b3AgPSAwOworICAgIGJ1Zi0+Yl9tbC5tbF9zdGFjayA9IE5VTEw7CisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3NpemUgPSAwOwkvKiBubyBzdGFjayB5ZXQgKi8KKworICAgIGlmIChjdXJidWYtPmJfZmZuYW1lID09IE5VTEwpCisJY2Fubm90X29wZW4gPSBUUlVFOworICAgIGVsc2UKKwljYW5ub3Rfb3BlbiA9IEZBTFNFOworCisgICAgc2VyaW91c19lcnJvciA9IEZBTFNFOworICAgIGZvciAoIDsgIWdvdF9pbnQ7IGxpbmVfYnJlYWtjaGVjaygpKQorICAgIHsKKwlpZiAoaHAgIT0gTlVMTCkKKwkgICAgbWZfcHV0KG1mcCwgaHAsIEZBTFNFLCBGQUxTRSk7CS8qIHJlbGVhc2UgcHJldmlvdXMgYmxvY2sgKi8KKworCS8qCisJICogZ2V0IGJsb2NrCisJICovCisJaWYgKChocCA9IG1mX2dldChtZnAsIChibG9ja25yX1QpYm51bSwgcGFnZV9jb3VudCkpID09IE5VTEwpCisJeworCSAgICBpZiAoYm51bSA9PSAxKQorCSAgICB7CisJCUVNU0cyKF8oIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIpLCBtZnAtPm1mX2ZuYW1lKTsKKwkJZ290byB0aGVlbmQ7CisJICAgIH0KKwkgICAgKytlcnJvcjsKKwkgICAgbWxfYXBwZW5kKGxudW0rKywgKGNoYXJfdSAqKV8oIj8/P01BTlkgTElORVMgTUlTU0lORyIpLAorCQkJCQkJCSAgICAoY29sbnJfVCkwLCBUUlVFKTsKKwl9CisJZWxzZQkJLyogdGhlcmUgaXMgYSBibG9jayAqLworCXsKKwkgICAgcHAgPSAoUFRSX0JMICopKGhwLT5iaF9kYXRhKTsKKwkgICAgaWYgKHBwLT5wYl9pZCA9PSBQVFJfSUQpCQkvKiBpdCBpcyBhIHBvaW50ZXIgYmxvY2sgKi8KKwkgICAgeworCQkvKiBjaGVjayBsaW5lIGNvdW50IHdoZW4gdXNpbmcgcG9pbnRlciBibG9jayBmaXJzdCB0aW1lICovCisJCWlmIChpZHggPT0gMCAmJiBsaW5lX2NvdW50ICE9IDApCisJCXsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KXBwLT5wYl9jb3VudDsgKytpKQorCQkJbGluZV9jb3VudCAtPSBwcC0+cGJfcG9pbnRlcltpXS5wZV9saW5lX2NvdW50OworCQkgICAgaWYgKGxpbmVfY291bnQgIT0gMCkKKwkJICAgIHsKKwkJCSsrZXJyb3I7CisJCQltbF9hcHBlbmQobG51bSsrLCAoY2hhcl91ICopXygiPz8/TElORSBDT1VOVCBXUk9ORyIpLAorCQkJCQkJCSAgICAoY29sbnJfVCkwLCBUUlVFKTsKKwkJICAgIH0KKwkJfQorCisJCWlmIChwcC0+cGJfY291bnQgPT0gMCkKKwkJeworCQkgICAgbWxfYXBwZW5kKGxudW0rKywgKGNoYXJfdSAqKV8oIj8/P0VNUFRZIEJMT0NLIiksCisJCQkJCQkJICAgIChjb2xucl9UKTAsIFRSVUUpOworCQkgICAgKytlcnJvcjsKKwkJfQorCQllbHNlIGlmIChpZHggPCAoaW50KXBwLT5wYl9jb3VudCkJLyogZ28gYSBibG9jayBkZWVwZXIgKi8KKwkJeworCQkgICAgaWYgKHBwLT5wYl9wb2ludGVyW2lkeF0ucGVfYm51bSA8IDApCisJCSAgICB7CisJCQkvKgorCQkJICogRGF0YSBibG9jayB3aXRoIG5lZ2F0aXZlIGJsb2NrIG51bWJlci4KKwkJCSAqIFRyeSB0byByZWFkIGxpbmVzIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUuCisJCQkgKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCB3b3Jrcy4KKwkJCSAqLworCQkJaWYgKCFjYW5ub3Rfb3BlbikKKwkJCXsKKwkJCSAgICBsaW5lX2NvdW50ID0gcHAtPnBiX3BvaW50ZXJbaWR4XS5wZV9saW5lX2NvdW50OworCQkJICAgIGlmIChyZWFkZmlsZShjdXJidWYtPmJfZmZuYW1lLCBOVUxMLCBsbnVtLAorCQkJCQlwcC0+cGJfcG9pbnRlcltpZHhdLnBlX29sZF9sbnVtIC0gMSwKKwkJCQkJbGluZV9jb3VudCwgTlVMTCwgMCkgPT0gRkFJTCkKKwkJCQljYW5ub3Rfb3BlbiA9IFRSVUU7CisJCQkgICAgZWxzZQorCQkJCWxudW0gKz0gbGluZV9jb3VudDsKKwkJCX0KKwkJCWlmIChjYW5ub3Rfb3BlbikKKwkJCXsKKwkJCSAgICArK2Vycm9yOworCQkJICAgIG1sX2FwcGVuZChsbnVtKyssIChjaGFyX3UgKilfKCI/Pz9MSU5FUyBNSVNTSU5HIiksCisJCQkJCQkJICAgIChjb2xucl9UKTAsIFRSVUUpOworCQkJfQorCQkJKytpZHg7CSAgICAvKiBnZXQgc2FtZSBibG9jayBhZ2FpbiBmb3IgbmV4dCBpbmRleCAqLworCQkJY29udGludWU7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBnb2luZyBvbmUgYmxvY2sgZGVlcGVyIGluIHRoZSB0cmVlCisJCSAgICAgKi8KKwkJICAgIGlmICgodG9wID0gbWxfYWRkX3N0YWNrKGJ1ZikpIDwgMCkJLyogbmV3IGVudHJ5IGluIHN0YWNrICovCisJCSAgICB7CisJCQkrK2Vycm9yOworCQkJYnJlYWs7CQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCQkgICAgfQorCQkgICAgaXAgPSAmKGJ1Zi0+Yl9tbC5tbF9zdGFja1t0b3BdKTsKKwkJICAgIGlwLT5pcF9ibnVtID0gYm51bTsKKwkJICAgIGlwLT5pcF9pbmRleCA9IGlkeDsKKworCQkgICAgYm51bSA9IHBwLT5wYl9wb2ludGVyW2lkeF0ucGVfYm51bTsKKwkJICAgIGxpbmVfY291bnQgPSBwcC0+cGJfcG9pbnRlcltpZHhdLnBlX2xpbmVfY291bnQ7CisJCSAgICBwYWdlX2NvdW50ID0gcHAtPnBiX3BvaW50ZXJbaWR4XS5wZV9wYWdlX2NvdW50OworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCSAgICAvKiBub3QgYSBwb2ludGVyIGJsb2NrICovCisJICAgIHsKKwkJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisJCWlmIChkcC0+ZGJfaWQgIT0gREFUQV9JRCkJLyogYmxvY2sgaWQgd3JvbmcgKi8KKwkJeworCQkgICAgaWYgKGJudW0gPT0gMSkKKwkJICAgIHsKKwkJCUVNU0cyKF8oIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIiksCisJCQkJCQkJICAgICAgIG1mcC0+bWZfZm5hbWUpOworCQkJZ290byB0aGVlbmQ7CisJCSAgICB9CisJCSAgICArK2Vycm9yOworCQkgICAgbWxfYXBwZW5kKGxudW0rKywgKGNoYXJfdSAqKV8oIj8/P0JMT0NLIE1JU1NJTkciKSwKKwkJCQkJCQkgICAgKGNvbG5yX1QpMCwgVFJVRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogaXQgaXMgYSBkYXRhIGJsb2NrCisJCSAgICAgKiBBcHBlbmQgYWxsIHRoZSBsaW5lcyBpbiB0aGlzIGJsb2NrCisJCSAgICAgKi8KKwkJICAgIGhhc19lcnJvciA9IEZBTFNFOworCQkJLyoKKwkJCSAqIGNoZWNrIGxlbmd0aCBvZiBibG9jaworCQkJICogaWYgd3JvbmcsIHVzZSBsZW5ndGggaW4gcG9pbnRlciBibG9jaworCQkJICovCisJCSAgICBpZiAocGFnZV9jb3VudCAqIG1mcC0+bWZfcGFnZV9zaXplICE9IGRwLT5kYl90eHRfZW5kKQorCQkgICAgeworCQkJbWxfYXBwZW5kKGxudW0rKywgKGNoYXJfdSAqKV8oIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiKSwKKwkJCQkJCQkgICAgKGNvbG5yX1QpMCwgVFJVRSk7CisJCQkrK2Vycm9yOworCQkJaGFzX2Vycm9yID0gVFJVRTsKKwkJCWRwLT5kYl90eHRfZW5kID0gcGFnZV9jb3VudCAqIG1mcC0+bWZfcGFnZV9zaXplOworCQkgICAgfQorCisJCQkvKiBtYWtlIHN1cmUgdGhlcmUgaXMgYSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwkJICAgICooKGNoYXJfdSAqKWRwICsgZHAtPmRiX3R4dF9lbmQgLSAxKSA9IE5VTDsKKworCQkJLyoKKwkJCSAqIGNoZWNrIG51bWJlciBvZiBsaW5lcyBpbiBibG9jaworCQkJICogaWYgd3JvbmcsIHVzZSBjb3VudCBpbiBkYXRhIGJsb2NrCisJCQkgKi8KKwkJICAgIGlmIChsaW5lX2NvdW50ICE9IGRwLT5kYl9saW5lX2NvdW50KQorCQkgICAgeworCQkJbWxfYXBwZW5kKGxudW0rKywgKGNoYXJfdSAqKV8oIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIpLAorCQkJCQkJCSAgICAoY29sbnJfVCkwLCBUUlVFKTsKKwkJCSsrZXJyb3I7CisJCQloYXNfZXJyb3IgPSBUUlVFOworCQkgICAgfQorCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgZHAtPmRiX2xpbmVfY291bnQ7ICsraSkKKwkJICAgIHsKKwkJCXR4dF9zdGFydCA9IChkcC0+ZGJfaW5kZXhbaV0gJiBEQl9JTkRFWF9NQVNLKTsKKwkJCWlmICh0eHRfc3RhcnQgPD0gSEVBREVSX1NJWkUKKwkJCQkJICB8fCB0eHRfc3RhcnQgPj0gKGludClkcC0+ZGJfdHh0X2VuZCkKKwkJCXsKKwkJCSAgICBwID0gKGNoYXJfdSAqKSI/Pz8iOworCQkJICAgICsrZXJyb3I7CisJCQl9CisJCQllbHNlCisJCQkgICAgcCA9IChjaGFyX3UgKilkcCArIHR4dF9zdGFydDsKKwkJCW1sX2FwcGVuZChsbnVtKyssIHAsIChjb2xucl9UKTAsIFRSVUUpOworCQkgICAgfQorCQkgICAgaWYgKGhhc19lcnJvcikKKwkJCW1sX2FwcGVuZChsbnVtKyssIChjaGFyX3UgKilfKCI/Pz9FTkQiKSwgKGNvbG5yX1QpMCwgVFJVRSk7CisJCX0KKwkgICAgfQorCX0KKworCWlmIChidWYtPmJfbWwubWxfc3RhY2tfdG9wID09IDApCS8qIGZpbmlzaGVkICovCisJICAgIGJyZWFrOworCisJLyoKKwkgKiBnbyBvbmUgYmxvY2sgdXAgaW4gdGhlIHRyZWUKKwkgKi8KKwlpcCA9ICYoYnVmLT5iX21sLm1sX3N0YWNrWy0tKGJ1Zi0+Yl9tbC5tbF9zdGFja190b3ApXSk7CisJYm51bSA9IGlwLT5pcF9ibnVtOworCWlkeCA9IGlwLT5pcF9pbmRleCArIDE7CSAgICAvKiBnbyB0byBuZXh0IGluZGV4ICovCisJcGFnZV9jb3VudCA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgZHVtbXkgbGluZSBmcm9tIHRoZSBlbXB0eSBidWZmZXIgd2lsbCBub3cgYmUgYWZ0ZXIgdGhlIGxhc3QgbGluZSBpbgorICAgICAqIHRoZSBidWZmZXIuIERlbGV0ZSBpdC4KKyAgICAgKi8KKyAgICBtbF9kZWxldGUoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQsIEZBTFNFKTsKKyAgICBjdXJidWYtPmJfZmxhZ3MgfD0gQkZfUkVDT1ZFUkVEOworCisgICAgcmVjb3Zlcnltb2RlID0gRkFMU0U7CisgICAgaWYgKGdvdF9pbnQpCisJRU1TRyhfKCJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIpKTsKKyAgICBlbHNlIGlmIChlcnJvcikKKyAgICB7CisJKytub193YWl0X3JldHVybjsKKwlNU0coIj4+Pj4+Pj4+Pj4+Pj4iKTsKKwlFTVNHKF8oIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIpKTsKKwktLW5vX3dhaXRfcmV0dXJuOworCU1TRyhfKCJTZWUgXCI6aGVscCBFMzEyXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIikpOworCU1TRygiPj4+Pj4+Pj4+Pj4+PiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCU1TRyhfKCJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iKSk7CisJTVNHX1BVVFMoXygiXG4oWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIpKTsKKwlNU0dfUFVUUyhfKCJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIpKTsKKwlNU0dfUFVUUyhfKCJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuXG4iKSk7CisJY21kbGluZV9yb3cgPSBtc2dfcm93OworICAgIH0KKyAgICByZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisKK3RoZWVuZDoKKyAgICByZWNvdmVyeW1vZGUgPSBGQUxTRTsKKyAgICBpZiAobWZwICE9IE5VTEwpCisgICAgeworCWlmIChocCAhPSBOVUxMKQorCSAgICBtZl9wdXQobWZwLCBocCwgRkFMU0UsIEZBTFNFKTsKKwltZl9jbG9zZShtZnAsIEZBTFNFKTsJICAgIC8qIHdpbGwgYWxzbyB2aW1fZnJlZShtZnAtPm1mX2ZuYW1lKSAqLworICAgIH0KKyAgICB2aW1fZnJlZShidWYpOworICAgIGlmIChzZXJpb3VzX2Vycm9yICYmIGNhbGxlZF9mcm9tX21haW4pCisJbWxfY2xvc2UoY3VyYnVmLCBUUlVFKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBlbHNlCisgICAgeworCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRlJFQURQT1NULCBOVUxMLCBjdXJidWYtPmJfZm5hbWUsIEZBTFNFLCBjdXJidWYpOworCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRldJTkVOVEVSLCBOVUxMLCBjdXJidWYtPmJfZm5hbWUsIEZBTFNFLCBjdXJidWYpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybjsKK30KKworLyoKKyAqIEZpbmQgdGhlIG5hbWVzIG9mIHN3YXAgZmlsZXMgaW4gY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZSBkaXJlY3RvcnkgZ2l2ZW4KKyAqIHdpdGggdGhlICdkaXJlY3RvcnknIG9wdGlvbi4KKyAqCisgKiBVc2VkIHRvOgorICogLSBsaXN0IHRoZSBzd2FwIGZpbGVzIGZvciAidmltIC1yIgorICogLSBjb3VudCB0aGUgbnVtYmVyIG9mIHN3YXAgZmlsZXMgd2hlbiByZWNvdmVyaW5nCisgKiAtIGxpc3QgdGhlIHN3YXAgZmlsZXMgd2hlbiByZWNvdmVyaW5nCisgKiAtIGZpbmQgdGhlIG5hbWUgb2YgdGhlIG4ndGggc3dhcCBmaWxlIHdoZW4gcmVjb3ZlcmluZworICovCisgICAgaW50CityZWNvdmVyX25hbWVzKGZuYW1lLCBsaXN0LCBucikKKyAgICBjaGFyX3UJKipmbmFtZTsgICAgLyogYmFzZSBmb3Igc3dhcCBmaWxlIG5hbWUgKi8KKyAgICBpbnQJCWxpc3Q7CSAgICAvKiB3aGVuIFRSVUUsIGxpc3QgdGhlIHN3YXAgZmlsZSBuYW1lcyAqLworICAgIGludAkJbnI7CSAgICAvKiB3aGVuIG5vbi16ZXJvLCByZXR1cm4gbnIndGggc3dhcCBmaWxlIG5hbWUgKi8KK3sKKyAgICBpbnQJCW51bV9uYW1lczsKKyAgICBjaGFyX3UJKihuYW1lc1s2XSk7CisgICAgY2hhcl91CSp0YWlsOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCW51bV9maWxlczsKKyAgICBpbnQJCWZpbGVfY291bnQgPSAwOworICAgIGNoYXJfdQkqKmZpbGVzOworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKmRpcnA7CisgICAgY2hhcl91CSpkaXJfbmFtZTsKKworICAgIGlmIChsaXN0KQorICAgIHsKKwkgICAgLyogdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkgKi8KKwltc2coKGNoYXJfdSAqKV8oIlN3YXAgZmlsZXMgZm91bmQ6IikpOworCW1zZ19wdXRjaGFyKCdcbicpOworICAgIH0KKworICAgIC8qCisgICAgICogRG8gdGhlIGxvb3AgZm9yIGV2ZXJ5IGRpcmVjdG9yeSBpbiAnZGlyZWN0b3J5Jy4KKyAgICAgKiBGaXJzdCBhbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBwdXQgdGhlIGRpcmVjdG9yeSBuYW1lIGluLgorICAgICAqLworICAgIGRpcl9uYW1lID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTihwX2RpcikgKyAxKTsKKyAgICBkaXJwID0gcF9kaXI7CisgICAgd2hpbGUgKGRpcl9uYW1lICE9IE5VTEwgJiYgKmRpcnApCisgICAgeworCS8qCisJICogSXNvbGF0ZSBhIGRpcmVjdG9yeSBuYW1lIGZyb20gKmRpcnAgYW5kIHB1dCBpdCBpbiBkaXJfbmFtZSAod2Uga25vdworCSAqIGl0IGlzIGxhcmdlIGVub3VnaCwgc28gdXNlIDMxMDAwIGZvciBsZW5ndGgpLgorCSAqIEFkdmFuY2UgZGlycCB0byBuZXh0IGRpcmVjdG9yeSBuYW1lLgorCSAqLworCSh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJmRpcnAsIGRpcl9uYW1lLCAzMTAwMCwgIiwiKTsKKworCWlmIChkaXJfbmFtZVswXSA9PSAnLicgJiYgZGlyX25hbWVbMV0gPT0gTlVMKQkvKiBjaGVjayBjdXJyZW50IGRpciAqLworCXsKKwkgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTEwpCisJICAgIHsKKyNpZmRlZiBWTVMKKwkJbmFtZXNbMF0gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIipfc3clIik7CisjZWxzZQorIyBpZmRlZiBSSVNDT1MKKwkJbmFtZXNbMF0gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIipfc3cjIik7CisjIGVsc2UKKwkJbmFtZXNbMF0gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIiouc3c/Iik7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBVTklYCisJCS8qIGZvciBVbml4IG5hbWVzIHN0YXJ0aW5nIHdpdGggYSBkb3QgYXJlIHNwZWNpYWwgKi8KKwkJbmFtZXNbMV0gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIi4qLnN3PyIpOworCQluYW1lc1syXSA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikiLnN3PyIpOworCQludW1fbmFtZXMgPSAzOworI2Vsc2UKKyMgaWZkZWYgVk1TCisJCW5hbWVzWzFdID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSIuKl9zdyUiKTsKKwkJbnVtX25hbWVzID0gMjsKKyMgZWxzZQorCQludW1fbmFtZXMgPSAxOworIyBlbmRpZgorI2VuZGlmCisJICAgIH0KKwkgICAgZWxzZQorCQludW1fbmFtZXMgPSByZWNvdl9maWxlX25hbWVzKG5hbWVzLCAqZm5hbWUsIFRSVUUpOworCX0KKwllbHNlCQkJICAgIC8qIGNoZWNrIGRpcmVjdG9yeSBkaXJfbmFtZSAqLworCXsKKwkgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTEwpCisJICAgIHsKKyNpZmRlZiBWTVMKKwkJbmFtZXNbMF0gPSBjb25jYXRfZm5hbWVzKGRpcl9uYW1lLCAoY2hhcl91ICopIipfc3clIiwgVFJVRSk7CisjZWxzZQorIyBpZmRlZiBSSVNDT1MKKwkJbmFtZXNbMF0gPSBjb25jYXRfZm5hbWVzKGRpcl9uYW1lLCAoY2hhcl91ICopIipfc3cjIiwgVFJVRSk7CisjIGVsc2UKKwkJbmFtZXNbMF0gPSBjb25jYXRfZm5hbWVzKGRpcl9uYW1lLCAoY2hhcl91ICopIiouc3c/IiwgVFJVRSk7CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBVTklYCisJCS8qIGZvciBVbml4IG5hbWVzIHN0YXJ0aW5nIHdpdGggYSBkb3QgYXJlIHNwZWNpYWwgKi8KKwkJbmFtZXNbMV0gPSBjb25jYXRfZm5hbWVzKGRpcl9uYW1lLCAoY2hhcl91ICopIi4qLnN3PyIsIFRSVUUpOworCQluYW1lc1syXSA9IGNvbmNhdF9mbmFtZXMoZGlyX25hbWUsIChjaGFyX3UgKikiLnN3PyIsIFRSVUUpOworCQludW1fbmFtZXMgPSAzOworI2Vsc2UKKyMgaWZkZWYgVk1TCisJCW5hbWVzWzFdID0gY29uY2F0X2ZuYW1lcyhkaXJfbmFtZSwgKGNoYXJfdSAqKSIuKl9zdyUiLCBUUlVFKTsKKwkJbnVtX25hbWVzID0gMjsKKyMgZWxzZQorCQludW1fbmFtZXMgPSAxOworIyBlbmRpZgorI2VuZGlmCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisJCXAgPSBkaXJfbmFtZSArIFNUUkxFTihkaXJfbmFtZSk7CisJCWlmICh2aW1faXNwYXRoc2VwKHBbLTFdKSAmJiBwWy0xXSA9PSBwWy0yXSkKKwkJeworCQkgICAgLyogRW5kcyB3aXRoICcvLycsIFVzZSBGdWxsIHBhdGggZm9yIHN3YXAgbmFtZSAqLworCQkgICAgdGFpbCA9IG1ha2VfcGVyY2VudF9zd25hbWUoZGlyX25hbWUsICpmbmFtZSk7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgIHRhaWwgPSBnZXR0YWlsKCpmbmFtZSk7CisJCSAgICB0YWlsID0gY29uY2F0X2ZuYW1lcyhkaXJfbmFtZSwgdGFpbCwgVFJVRSk7CisJCX0KKwkJaWYgKHRhaWwgPT0gTlVMTCkKKwkJICAgIG51bV9uYW1lcyA9IDA7CisJCWVsc2UKKwkJeworCQkgICAgbnVtX25hbWVzID0gcmVjb3ZfZmlsZV9uYW1lcyhuYW1lcywgdGFpbCwgRkFMU0UpOworCQkgICAgdmltX2ZyZWUodGFpbCk7CisJCX0KKwkgICAgfQorCX0KKworCSAgICAvKiBjaGVjayBmb3Igb3V0LW9mLW1lbW9yeSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbmFtZXM7ICsraSkKKwl7CisJICAgIGlmIChuYW1lc1tpXSA9PSBOVUxMKQorCSAgICB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fbmFtZXM7ICsraSkKKwkJICAgIHZpbV9mcmVlKG5hbWVzW2ldKTsKKwkJbnVtX25hbWVzID0gMDsKKwkgICAgfQorCX0KKwlpZiAobnVtX25hbWVzID09IDApCisJICAgIG51bV9maWxlcyA9IDA7CisJZWxzZSBpZiAoZXhwYW5kX3dpbGRjYXJkcyhudW1fbmFtZXMsIG5hbWVzLCAmbnVtX2ZpbGVzLCAmZmlsZXMsCisJCQkJCUVXX0tFRVBBTEx8RVdfRklMRXxFV19TSUxFTlQpID09IEZBSUwpCisJICAgIG51bV9maWxlcyA9IDA7CisKKwkvKgorCSAqIFdoZW4gbm8gc3dhcCBmaWxlIGZvdW5kLCB3aWxkY2FyZCBleHBhbnNpb24gbWlnaHQgaGF2ZSBmYWlsZWQgKGUuZy4KKwkgKiBub3QgYWJsZSB0byBleGVjdXRlIHRoZSBzaGVsbCkuCisJICogVHJ5IGZpbmRpbmcgYSBzd2FwIGZpbGUgYnkgc2ltcGx5IGFkZGluZyAiLnN3cCIgdG8gdGhlIGZpbGUgbmFtZS4KKwkgKi8KKwlpZiAoKmRpcnAgPT0gTlVMICYmIGZpbGVfY291bnQgKyBudW1fZmlsZXMgPT0gMAorCQkJCQkgICAmJiBmbmFtZSAhPSBOVUxMICYmICpmbmFtZSAhPSBOVUxMKQorCXsKKwkgICAgc3RydWN0IHN0YXQJICAgIHN0OworCSAgICBjaGFyX3UJICAgICpzd2FwbmFtZTsKKworI2lmIGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKFJJU0NPUykKKwkgICAgc3dhcG5hbWUgPSBtb2RuYW1lKCpmbmFtZSwgKGNoYXJfdSAqKSJfc3dwIiwgRkFMU0UpOworI2Vsc2UKKwkgICAgc3dhcG5hbWUgPSBtb2RuYW1lKCpmbmFtZSwgKGNoYXJfdSAqKSIuc3dwIiwgVFJVRSk7CisjZW5kaWYKKwkgICAgaWYgKHN3YXBuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJaWYgKG1jaF9zdGF0KChjaGFyICopc3dhcG5hbWUsICZzdCkgIT0gLTEpCSAgICAvKiBJdCBleGlzdHMhICovCisJCXsKKwkJICAgIGZpbGVzID0gKGNoYXJfdSAqKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKGNoYXJfdSAqKSk7CisJCSAgICBpZiAoZmlsZXMgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWZpbGVzWzBdID0gc3dhcG5hbWU7CisJCQlzd2FwbmFtZSA9IE5VTEw7CisJCQludW1fZmlsZXMgPSAxOworCQkgICAgfQorCQl9CisJCXZpbV9mcmVlKHN3YXBuYW1lKTsKKwkgICAgfQorCX0KKworCS8qCisJICogcmVtb3ZlIHN3YXBmaWxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLCBpdCBtdXN0IGJlIGlnbm9yZWQKKwkgKi8KKwlpZiAoY3VyYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMCisJCQkgICAgICAgJiYgKHAgPSBjdXJidWYtPmJfbWwubWxfbWZwLT5tZl9mbmFtZSkgIT0gTlVMTCkKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZmlsZXM7ICsraSkKKwkJaWYgKGZ1bGxwYXRoY21wKHAsIGZpbGVzW2ldLCBUUlVFKSAmIEZQQ19TQU1FKQorCQl7CisJCSAgICB2aW1fZnJlZShmaWxlc1tpXSk7CisJCSAgICAtLW51bV9maWxlczsKKwkJICAgIGZvciAoIDsgaSA8IG51bV9maWxlczsgKytpKQorCQkJZmlsZXNbaV0gPSBmaWxlc1tpICsgMV07CisJCX0KKwl9CisJaWYgKG5yKQorCXsKKwkgICAgZmlsZV9jb3VudCArPSBudW1fZmlsZXM7CisJICAgIGlmIChuciA8PSBmaWxlX2NvdW50KQorCSAgICB7CisJCSpmbmFtZSA9IHZpbV9zdHJzYXZlKGZpbGVzW25yIC0gMSArIG51bV9maWxlcyAtIGZpbGVfY291bnRdKTsKKwkJZGlycCA9IChjaGFyX3UgKikiIjsJCSAgICAvKiBzdG9wIHNlYXJjaGluZyAqLworCSAgICB9CisJfQorCWVsc2UgaWYgKGxpc3QpCisJeworCSAgICBpZiAoZGlyX25hbWVbMF0gPT0gJy4nICYmIGRpcl9uYW1lWzFdID09IE5VTCkKKwkgICAgeworCQlpZiAoZm5hbWUgPT0gTlVMTCB8fCAqZm5hbWUgPT0gTlVMTCkKKwkJICAgIE1TR19QVVRTKF8oIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIikpOworCQllbHNlCisJCSAgICBNU0dfUFVUUyhfKCIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIpKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJTVNHX1BVVFMoXygiICAgSW4gZGlyZWN0b3J5ICIpKTsKKwkJbXNnX2hvbWVfcmVwbGFjZShkaXJfbmFtZSk7CisJCU1TR19QVVRTKCI6XG4iKTsKKwkgICAgfQorCisJICAgIGlmIChudW1fZmlsZXMpCisJICAgIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9maWxlczsgKytpKQorCQl7CisJCSAgICAvKiBwcmludCB0aGUgc3dhcCBmaWxlIG5hbWUgKi8KKwkJICAgIG1zZ19vdXRudW0oKGxvbmcpKytmaWxlX2NvdW50KTsKKwkJICAgIE1TR19QVVRTKCIuICAgICIpOworCQkgICAgbXNnX3B1dHMoZ2V0dGFpbChmaWxlc1tpXSkpOworCQkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJCSAgICAodm9pZClzd2FwZmlsZV9pbmZvKGZpbGVzW2ldKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJTVNHX1BVVFMoXygiICAgICAgLS0gbm9uZSAtLVxuIikpOworCSAgICBvdXRfZmx1c2goKTsKKwl9CisJZWxzZQorCSAgICBmaWxlX2NvdW50ICs9IG51bV9maWxlczsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbmFtZXM7ICsraSkKKwkgICAgdmltX2ZyZWUobmFtZXNbaV0pOworCUZyZWVXaWxkKG51bV9maWxlcywgZmlsZXMpOworICAgIH0KKyAgICB2aW1fZnJlZShkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZpbGVfY291bnQ7Cit9CisKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoV0lOMzI2NCkgIC8qIE5lZWQgX3ZlcnlfIGxvbmcgZmlsZSBuYW1lcyAqLworLyoKKyAqIEFwcGVuZCB0aGUgZnVsbCBwYXRoIHRvIG5hbWUgd2l0aCBwYXRoIHNlcGFyYXRvcnMgbWFkZSBpbnRvIHBlcmNlbnQKKyAqIHNpZ25zLCB0byBkaXIuIEFuIHVubmFtZWQgYnVmZmVyIGlzIGhhbmRsZWQgYXMgIiIgKDxjdXJyZW50ZGlyPi8iIikKKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorbWFrZV9wZXJjZW50X3N3bmFtZShkaXIsIG5hbWUpCisgICAgY2hhcl91CSpkaXI7CisgICAgY2hhcl91CSpuYW1lOworeworICAgIGNoYXJfdSAqZCwgKnMsICpmLCAqcDsKKworICAgIGYgPSBmaXhfZm5hbWUobmFtZSAhPSBOVUxMID8gbmFtZSA6IChjaGFyX3UgKikgIiIpOworICAgIGQgPSBOVUxMOworICAgIGlmIChmICE9IE5VTEwpCisgICAgeworCXMgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihmKSArIDEpKTsKKwlpZiAocyAhPSBOVUxMKQorCXsKKwkgICAgZm9yIChkID0gcywgcCA9IGY7ICpwOyBwKyssIGQrKykKKwkJKmQgPSB2aW1faXNwYXRoc2VwKCpwKSA/ICclJyA6ICpwOworCSAgICAqZCA9IDA7CisJICAgIGQgPSBjb25jYXRfZm5hbWVzKGRpciwgcywgVFJVRSk7CisJICAgIHZpbV9mcmVlKHMpOworCX0KKwl2aW1fZnJlZShmKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChWTVMpKSAmJiAoZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKSkKK3N0YXRpYyBpbnQgcHJvY2Vzc19zdGlsbF9ydW5uaW5nOworI2VuZGlmCisKKy8qCisgKiBHaXZlIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4aXN0aW5nIHN3YXAgZmlsZQorICogUmV0dXJucyB0aW1lc3RhbXAgKDAgd2hlbiB1bmtub3duKS4KKyAqLworICAgIHN0YXRpYyB0aW1lX3QKK3N3YXBmaWxlX2luZm8oZm5hbWUpCisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyAgICBzdHJ1Y3Qgc3RhdAkgICAgc3Q7CisgICAgaW50CQkgICAgZmQ7CisgICAgc3RydWN0IGJsb2NrMCAgIGIwOworICAgIHRpbWVfdAkgICAgeCA9ICh0aW1lX3QpMDsKKyNpZmRlZiBVTklYCisgICAgY2hhcl91CSAgICB1bmFtZVtCMF9VTkFNRV9TSVpFXTsKKyNlbmRpZgorCisgICAgLyogcHJpbnQgdGhlIHN3YXAgZmlsZSBkYXRlICovCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWUsICZzdCkgIT0gLTEpCisgICAgeworI2lmZGVmIFVOSVgKKwkvKiBwcmludCBuYW1lIG9mIG93bmVyIG9mIHRoZSBmaWxlICovCisJaWYgKG1jaF9nZXRfdW5hbWUoc3Quc3RfdWlkLCB1bmFtZSwgQjBfVU5BTUVfU0laRSkgPT0gT0spCisJeworCSAgICBNU0dfUFVUUyhfKCIgICAgICAgICAgb3duZWQgYnk6ICIpKTsKKwkgICAgbXNnX291dHRyYW5zKHVuYW1lKTsKKwkgICAgTVNHX1BVVFMoXygiICAgZGF0ZWQ6ICIpKTsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIE1TR19QVVRTKF8oIiAgICAgICAgICAgICBkYXRlZDogIikpOworCXggPSBzdC5zdF9tdGltZTsJCSAgICAvKiBNYW54IEMgY2FuJ3QgZG8gJnN0LnN0X210aW1lICovCisJTVNHX1BVVFMoY3RpbWUoJngpKTsJCSAgICAvKiBpbmNsdWRlcyAnXG4nICovCisKKyAgICB9CisKKyAgICAvKgorICAgICAqIHByaW50IHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBmZCA9IG1jaF9vcGVuKChjaGFyICopZm5hbWUsIE9fUkRPTkxZIHwgT19FWFRSQSwgMCk7CisgICAgaWYgKGZkID49IDApCisgICAgeworCWlmIChyZWFkKGZkLCAoY2hhciAqKSZiMCwgc2l6ZW9mKGIwKSkgPT0gc2l6ZW9mKGIwKSkKKwl7CisJICAgIGlmIChTVFJOQ01QKGIwLmIwX3ZlcnNpb24sICJWSU0gMy4wIiwgNykgPT0gMCkKKwkgICAgeworCQlNU0dfUFVUUyhfKCIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIikpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGIwLmIwX2lkWzBdICE9IEJMT0NLMF9JRDAgfHwgYjAuYjBfaWRbMV0gIT0gQkxPQ0swX0lEMSkKKwkgICAgeworCQlNU0dfUFVUUyhfKCIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iKSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCU1TR19QVVRTKF8oIiAgICAgICAgIGZpbGUgbmFtZTogIikpOworCQlpZiAoYjAuYjBfZm5hbWVbMF0gPT0gTlVMKQorCQkgICAgTVNHX1BVVFMoXygiW05vIEZpbGVdIikpOworCQllbHNlCisJCSAgICBtc2dfb3V0dHJhbnMoYjAuYjBfZm5hbWUpOworCisJCU1TR19QVVRTKF8oIlxuICAgICAgICAgIG1vZGlmaWVkOiAiKSk7CisJCU1TR19QVVRTKGIwLmIwX2RpcnR5ID8gXygiWUVTIikgOiBfKCJubyIpKTsKKworCQlpZiAoKihiMC5iMF91bmFtZSkgIT0gTlVMKQorCQl7CisJCSAgICBNU0dfUFVUUyhfKCJcbiAgICAgICAgIHVzZXIgbmFtZTogIikpOworCQkgICAgbXNnX291dHRyYW5zKGIwLmIwX3VuYW1lKTsKKwkJfQorCisJCWlmICgqKGIwLmIwX2huYW1lKSAhPSBOVUwpCisJCXsKKwkJICAgIGlmICgqKGIwLmIwX3VuYW1lKSAhPSBOVUwpCisJCQlNU0dfUFVUUyhfKCIgICBob3N0IG5hbWU6ICIpKTsKKwkJICAgIGVsc2UKKwkJCU1TR19QVVRTKF8oIlxuICAgICAgICAgaG9zdCBuYW1lOiAiKSk7CisJCSAgICBtc2dfb3V0dHJhbnMoYjAuYjBfaG5hbWUpOworCQl9CisKKwkJaWYgKGNoYXJfdG9fbG9uZyhiMC5iMF9waWQpICE9IDBMKQorCQl7CisJCSAgICBNU0dfUFVUUyhfKCJcbiAgICAgICAgcHJvY2VzcyBJRDogIikpOworCQkgICAgbXNnX291dG51bShjaGFyX3RvX2xvbmcoYjAuYjBfcGlkKSk7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKF9fRU1YX18pCisJCSAgICAvKiBFTVgga2lsbCgpIG5vdCB3b3JraW5nIGNvcnJlY3RseSwgaXQgc2VlbXMgKi8KKwkJICAgIGlmIChraWxsKChwaWRfdCljaGFyX3RvX2xvbmcoYjAuYjBfcGlkKSwgMCkgPT0gMCkKKwkJICAgIHsKKwkJCU1TR19QVVRTKF8oIiAoc3RpbGwgcnVubmluZykiKSk7CisjIGlmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwkJCXByb2Nlc3Nfc3RpbGxfcnVubmluZyA9IFRSVUU7CisjIGVuZGlmCisJCSAgICB9CisjZW5kaWYKKwkJfQorCisJCWlmIChiMF9tYWdpY193cm9uZygmYjApKQorCQl7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKwkJICAgIGlmIChTVFJOQ01QKGIwLmIwX2huYW1lLCAiUEMgIiwgMykgPT0gMCkKKwkJCU1TR19QVVRTKF8oIlxuICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIpKTsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJTVNHX1BVVFMoXygiXG4gICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIpKTsKKwkJfQorCSAgICB9CisJfQorCWVsc2UKKwkgICAgTVNHX1BVVFMoXygiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIpKTsKKwljbG9zZShmZCk7CisgICAgfQorICAgIGVsc2UKKwlNU0dfUFVUUyhfKCIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iKSk7CisgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisKKyAgICByZXR1cm4geDsKK30KKworICAgIHN0YXRpYyBpbnQKK3JlY292X2ZpbGVfbmFtZXMobmFtZXMsIHBhdGgsIHByZXBlbmRfZG90KQorICAgIGNoYXJfdQkqKm5hbWVzOworICAgIGNoYXJfdQkqcGF0aDsKKyAgICBpbnQJCXByZXBlbmRfZG90OworeworICAgIGludAkJbnVtX25hbWVzOworCisjaWZkZWYgU0hPUlRfRk5BTUUKKyAgICAvKgorICAgICAqIChNUy1ET1MpIGFsd2F5cyBzaG9ydCBuYW1lcworICAgICAqLworICAgIG5hbWVzWzBdID0gbW9kbmFtZShwYXRoLCAoY2hhcl91ICopIi5zdz8iLCBGQUxTRSk7CisgICAgbnVtX25hbWVzID0gMTsKKyNlbHNlIC8qICFTSE9SVF9GTkFNRSAqLworICAgIC8qCisgICAgICogKFdpbjMyIGFuZCBXaW42NCkgbmV2ZXIgc2hvcnQgbmFtZXMsIGJ1dCBkbyBwcmVwZW5kIGEgZG90LgorICAgICAqIChOb3QgTVMtRE9TIG9yIFdpbjMyIG9yIFdpbjY0KSBtYXliZSBzaG9ydCBuYW1lLCBtYXliZSBub3Q6IFRyeSBib3RoLgorICAgICAqIE9ubHkgdXNlIHRoZSBzaG9ydCBuYW1lIGlmIGl0IGlzIGRpZmZlcmVudC4KKyAgICAgKi8KKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworIyBpZm5kZWYgV0lOMzI2NAorICAgIGludAkgICAgc2hvcnRuYW1lID0gY3VyYnVmLT5iX3Nob3J0bmFtZTsKKworICAgIGN1cmJ1Zi0+Yl9zaG9ydG5hbWUgPSBGQUxTRTsKKyMgZW5kaWYKKworICAgIG51bV9uYW1lcyA9IDA7CisKKyAgICAvKgorICAgICAqIE1heSBhbHNvIGFkZCB0aGUgZmlsZSBuYW1lIHdpdGggYSBkb3QgcHJlcGVuZGVkLCBmb3Igc3dhcCBmaWxlIGluIHNhbWUKKyAgICAgKiBkaXIgYXMgb3JpZ2luYWwgZmlsZS4KKyAgICAgKi8KKyAgICBpZiAocHJlcGVuZF9kb3QpCisgICAgeworCW5hbWVzW251bV9uYW1lc10gPSBtb2RuYW1lKHBhdGgsIChjaGFyX3UgKikiLnN3PyIsIFRSVUUpOworCWlmIChuYW1lc1tudW1fbmFtZXNdID09IE5VTEwpCisJICAgIGdvdG8gZW5kOworCSsrbnVtX25hbWVzOworICAgIH0KKworICAgIC8qCisgICAgICogRm9ybSB0aGUgbm9ybWFsIHN3YXAgZmlsZSBuYW1lIHBhdHRlcm4gYnkgYXBwZW5kaW5nICIuc3c/Ii4KKyAgICAgKi8KKyNpZmRlZiBWTVMKKyAgICBuYW1lc1tudW1fbmFtZXNdID0gY29uY2F0X2ZuYW1lcyhwYXRoLCAoY2hhcl91ICopIl9zdyUiLCBGQUxTRSk7CisjZWxzZQorIyBpZmRlZiBSSVNDT1MKKyAgICBuYW1lc1tudW1fbmFtZXNdID0gY29uY2F0X2ZuYW1lcyhwYXRoLCAoY2hhcl91ICopIl9zdyMiLCBGQUxTRSk7CisjIGVsc2UKKyAgICBuYW1lc1tudW1fbmFtZXNdID0gY29uY2F0X2ZuYW1lcyhwYXRoLCAoY2hhcl91ICopIi5zdz8iLCBGQUxTRSk7CisjIGVuZGlmCisjZW5kaWYKKyAgICBpZiAobmFtZXNbbnVtX25hbWVzXSA9PSBOVUxMKQorCWdvdG8gZW5kOworICAgIGlmIChudW1fbmFtZXMgPj0gMSkJICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgbmFtZSB0d2ljZSAqLworICAgIHsKKwlwID0gbmFtZXNbbnVtX25hbWVzIC0gMV07CisJaSA9IChpbnQpU1RSTEVOKG5hbWVzW251bV9uYW1lcyAtIDFdKSAtIChpbnQpU1RSTEVOKG5hbWVzW251bV9uYW1lc10pOworCWlmIChpID4gMCkKKwkgICAgcCArPSBpOwkgICAgLyogZmlsZSBuYW1lIGhhcyBiZWVuIGV4cGFuZGVkIHRvIGZ1bGwgcGF0aCAqLworCisJaWYgKFNUUkNNUChwLCBuYW1lc1tudW1fbmFtZXNdKSAhPSAwKQorCSAgICArK251bV9uYW1lczsKKwllbHNlCisJICAgIHZpbV9mcmVlKG5hbWVzW251bV9uYW1lc10pOworICAgIH0KKyAgICBlbHNlCisJKytudW1fbmFtZXM7CisKKyMgaWZuZGVmIFdJTjMyNjQKKyAgICAvKgorICAgICAqIEFsc28gdHJ5IHdpdGggJ3Nob3J0bmFtZScgc2V0LCBpbiBjYXNlIHRoZSBmaWxlIGlzIG9uIGEgRE9TIGZpbGVzeXN0ZW0uCisgICAgICovCisgICAgY3VyYnVmLT5iX3Nob3J0bmFtZSA9IFRSVUU7CisjaWZkZWYgVk1TCisgICAgbmFtZXNbbnVtX25hbWVzXSA9IG1vZG5hbWUocGF0aCwgKGNoYXJfdSAqKSJfc3clIiwgRkFMU0UpOworI2Vsc2UKKyMgaWZkZWYgUklTQ09TCisgICAgbmFtZXNbbnVtX25hbWVzXSA9IG1vZG5hbWUocGF0aCwgKGNoYXJfdSAqKSJfc3cjIiwgRkFMU0UpOworIyBlbHNlCisgICAgbmFtZXNbbnVtX25hbWVzXSA9IG1vZG5hbWUocGF0aCwgKGNoYXJfdSAqKSIuc3c/IiwgRkFMU0UpOworIyBlbmRpZgorI2VuZGlmCisgICAgaWYgKG5hbWVzW251bV9uYW1lc10gPT0gTlVMTCkKKwlnb3RvIGVuZDsKKworICAgIC8qCisgICAgICogUmVtb3ZlIHRoZSBvbmUgZnJvbSAnc2hvcnRuYW1lJywgaWYgaXQncyB0aGUgc2FtZSBhcyB3aXRoICdub3Nob3J0bmFtZScuCisgICAgICovCisgICAgcCA9IG5hbWVzW251bV9uYW1lc107CisgICAgaSA9IFNUUkxFTihuYW1lc1tudW1fbmFtZXNdKSAtIFNUUkxFTihuYW1lc1tudW1fbmFtZXMgLSAxXSk7CisgICAgaWYgKGkgPiAwKQorCXAgKz0gaTsJCS8qIGZpbGUgbmFtZSBoYXMgYmVlbiBleHBhbmRlZCB0byBmdWxsIHBhdGggKi8KKyAgICBpZiAoU1RSQ01QKG5hbWVzW251bV9uYW1lcyAtIDFdLCBwKSA9PSAwKQorCXZpbV9mcmVlKG5hbWVzW251bV9uYW1lc10pOworICAgIGVsc2UKKwkrK251bV9uYW1lczsKKyMgZW5kaWYKKworZW5kOgorIyBpZm5kZWYgV0lOMzI2NAorICAgIGN1cmJ1Zi0+Yl9zaG9ydG5hbWUgPSBzaG9ydG5hbWU7CisjIGVuZGlmCisKKyNlbmRpZiAvKiAhU0hPUlRfRk5BTUUgKi8KKworICAgIHJldHVybiBudW1fbmFtZXM7Cit9CisKKy8qCisgKiBzeW5jIGFsbCBtZW1saW5lcworICoKKyAqIElmICdjaGVja19maWxlJyBpcyBUUlVFLCBjaGVjayBpZiBvcmlnaW5hbCBmaWxlIGV4aXN0cyBhbmQgd2FzIG5vdCBjaGFuZ2VkLgorICogSWYgJ2NoZWNrX2NoYXInIGlzIFRSVUUsIHN0b3Agc3luY2luZyB3aGVuIGNoYXJhY3RlciBiZWNvbWVzIGF2YWlsYWJsZSwgYnV0CisgKiBhbHdheXMgc3luYyBhdCBsZWFzdCBvbmUgYmxvY2suCisgKi8KKyAgICB2b2lkCittbF9zeW5jX2FsbChjaGVja19maWxlLCBjaGVja19jaGFyKQorICAgIGludAkgICAgY2hlY2tfZmlsZTsKKyAgICBpbnQJICAgIGNoZWNrX2NoYXI7Cit7CisgICAgYnVmX1QJCSpidWY7CisgICAgc3RydWN0IHN0YXQJCXN0OworCisgICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQorICAgIHsKKwlpZiAoYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMIHx8IGJ1Zi0+Yl9tbC5tbF9tZnAtPm1mX2ZuYW1lID09IE5VTEwpCisJICAgIGNvbnRpbnVlOwkJCSAgICAvKiBubyBmaWxlICovCisKKwltbF9mbHVzaF9saW5lKGJ1Zik7CQkgICAgLyogZmx1c2ggYnVmZmVyZWQgbGluZSAqLworCQkJCQkgICAgLyogZmx1c2ggbG9ja2VkIGJsb2NrICovCisJKHZvaWQpbWxfZmluZF9saW5lKGJ1ZiwgKGxpbmVucl9UKTAsIE1MX0ZMVVNIKTsKKwlpZiAoYnVmSXNDaGFuZ2VkKGJ1ZikgJiYgY2hlY2tfZmlsZSAmJiBtZl9uZWVkX3RyYW5zKGJ1Zi0+Yl9tbC5tbF9tZnApCisJCQkJCQkgICAgICYmIGJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTCkKKwl7CisJICAgIC8qCisJICAgICAqIElmIHRoZSBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0IGFueW1vcmUgb3IgaGFzIGJlZW4gY2hhbmdlZAorCSAgICAgKiBjYWxsIG1sX3ByZXNlcnZlKCkgdG8gZ2V0IHJpZCBvZiBhbGwgbmVnYXRpdmUgbnVtYmVyZWQgYmxvY2tzLgorCSAgICAgKi8KKwkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopYnVmLT5iX2ZmbmFtZSwgJnN0KSA9PSAtMQorCQkgICAgfHwgc3Quc3RfbXRpbWUgIT0gYnVmLT5iX210aW1lX3JlYWQKKwkJICAgIHx8IChzaXplX3Qpc3Quc3Rfc2l6ZSAhPSBidWYtPmJfb3JpZ19zaXplKQorCSAgICB7CisJCW1sX3ByZXNlcnZlKGJ1ZiwgRkFMU0UpOworCQlkaWRfY2hlY2tfdGltZXN0YW1wcyA9IEZBTFNFOworCQluZWVkX2NoZWNrX3RpbWVzdGFtcHMgPSBUUlVFOwkvKiBnaXZlIG1lc3NhZ2UgbGF0ZXIgKi8KKwkgICAgfQorCX0KKwlpZiAoYnVmLT5iX21sLm1sX21mcC0+bWZfZGlydHkpCisJeworCSAgICAodm9pZCltZl9zeW5jKGJ1Zi0+Yl9tbC5tbF9tZnAsIChjaGVja19jaGFyID8gTUZTX1NUT1AgOiAwKQorCQkJCQl8IChidWZJc0NoYW5nZWQoYnVmKSA/IE1GU19GTFVTSCA6IDApKTsKKwkgICAgaWYgKGNoZWNrX2NoYXIgJiYgdWlfY2hhcl9hdmFpbCgpKQkvKiBjaGFyYWN0ZXIgYXZhaWxhYmxlIG5vdyAqLworCQlicmVhazsKKwl9CisgICAgfQorfQorCisvKgorICogc3luYyBvbmUgYnVmZmVyLCBpbmNsdWRpbmcgbmVnYXRpdmUgYmxvY2tzCisgKgorICogYWZ0ZXIgdGhpcyBhbGwgdGhlIGJsb2NrcyBhcmUgaW4gdGhlIHN3YXAgZmlsZQorICoKKyAqIFVzZWQgZm9yIHRoZSA6cHJlc2VydmUgY29tbWFuZCBhbmQgd2hlbiB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbgorICogY2hhbmdlZCBvciBkZWxldGVkLgorICoKKyAqIHdoZW4gbWVzc2FnZSBpcyBUUlVFIHRoZSBzdWNjZXNzIG9mIHByZXNlcnZpbmcgaXMgcmVwb3J0ZWQKKyAqLworICAgIHZvaWQKK21sX3ByZXNlcnZlKGJ1ZiwgbWVzc2FnZSkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJbWVzc2FnZTsKK3sKKyAgICBiaGRyX1QJKmhwOworICAgIGxpbmVucl9UCWxudW07CisgICAgbWVtZmlsZV9UCSptZnAgPSBidWYtPmJfbWwubWxfbWZwOworICAgIGludAkJc3RhdHVzOworICAgIGludAkJZ290X2ludF9zYXZlID0gZ290X2ludDsKKworICAgIGlmIChtZnAgPT0gTlVMTCB8fCBtZnAtPm1mX2ZuYW1lID09IE5VTEwpCisgICAgeworCWlmIChtZXNzYWdlKQorCSAgICBFTVNHKF8oIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIikpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBvbmx5IHdhbnQgdG8gc3RvcCB3aGVuIGludGVycnVwdGVkIGhlcmUsIG5vdCB3aGVuIGludGVycnVwdGVkCisgICAgICogYmVmb3JlLiAqLworICAgIGdvdF9pbnQgPSBGQUxTRTsKKworICAgIG1sX2ZsdXNoX2xpbmUoYnVmKTsJCQkJICAgIC8qIGZsdXNoIGJ1ZmZlcmVkIGxpbmUgKi8KKyAgICAodm9pZCltbF9maW5kX2xpbmUoYnVmLCAobGluZW5yX1QpMCwgTUxfRkxVU0gpOyAvKiBmbHVzaCBsb2NrZWQgYmxvY2sgKi8KKyAgICBzdGF0dXMgPSBtZl9zeW5jKG1mcCwgTUZTX0FMTCB8IE1GU19GTFVTSCk7CisKKyAgICAvKiBzdGFjayBpcyBpbnZhbGlkIGFmdGVyIG1mX3N5bmMoLi4sIE1GU19BTEwpICovCisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IDA7CisKKyAgICAvKgorICAgICAqIFNvbWUgb2YgdGhlIGRhdGEgYmxvY2tzIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIG5lZ2F0aXZlIHRvCisgICAgICogcG9zaXRpdmUgYmxvY2sgbnVtYmVyLiBJbiB0aGF0IGNhc2UgdGhlIHBvaW50ZXIgYmxvY2tzIG5lZWQgdG8gYmUKKyAgICAgKiB1cGRhdGVkLgorICAgICAqCisgICAgICogV2UgZG9uJ3Qga25vdyBpbiB3aGljaCBwb2ludGVyIGJsb2NrIHRoZSByZWZlcmVuY2VzIGFyZSwgc28gd2UgdmlzaXQKKyAgICAgKiBhbGwgZGF0YSBibG9ja3MgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgdHJhbnNsYXRpb25zIHRvIGJlIGRvbmUgKG9yCisgICAgICogd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoIGNhbiBvbmx5IGhhcHBlbiBpbiBjYXNlIGEgd3JpdGUgZmFpbHMsCisgICAgICogZS5nLiB3aGVuIGZpbGUgc3lzdGVtIGlmIGZ1bGwpLgorICAgICAqIG1sX2ZpbmRfbGluZSgpIGRvZXMgdGhlIHdvcmsgYnkgdHJhbnNsYXRpbmcgdGhlIG5lZ2F0aXZlIGJsb2NrIG51bWJlcnMKKyAgICAgKiB3aGVuIGdldHRpbmcgdGhlIGZpcnN0IGxpbmUgb2YgZWFjaCBkYXRhIGJsb2NrLgorICAgICAqLworICAgIGlmIChtZl9uZWVkX3RyYW5zKG1mcCkgJiYgIWdvdF9pbnQpCisgICAgeworCWxudW0gPSAxOworCXdoaWxlIChtZl9uZWVkX3RyYW5zKG1mcCkgJiYgbG51bSA8PSBidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisJICAgIGhwID0gbWxfZmluZF9saW5lKGJ1ZiwgbG51bSwgTUxfRklORCk7CisJICAgIGlmIChocCA9PSBOVUxMKQorCSAgICB7CisJCXN0YXR1cyA9IEZBSUw7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisJICAgIENIRUNLKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93ICE9IGxudW0sICJsb3cgIT0gbG51bSIpOworCSAgICBsbnVtID0gYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoICsgMTsKKwl9CisJKHZvaWQpbWxfZmluZF9saW5lKGJ1ZiwgKGxpbmVucl9UKTAsIE1MX0ZMVVNIKTsJLyogZmx1c2ggbG9ja2VkIGJsb2NrICovCisJLyogc3luYyB0aGUgdXBkYXRlZCBwb2ludGVyIGJsb2NrcyAqLworCWlmIChtZl9zeW5jKG1mcCwgTUZTX0FMTCB8IE1GU19GTFVTSCkgPT0gRkFJTCkKKwkgICAgc3RhdHVzID0gRkFJTDsKKwlidWYtPmJfbWwubWxfc3RhY2tfdG9wID0gMDsJICAgIC8qIHN0YWNrIGlzIGludmFsaWQgbm93ICovCisgICAgfQordGhlZW5kOgorICAgIGdvdF9pbnQgfD0gZ290X2ludF9zYXZlOworCisgICAgaWYgKG1lc3NhZ2UpCisgICAgeworCWlmIChzdGF0dXMgPT0gT0spCisJICAgIE1TRyhfKCJGaWxlIHByZXNlcnZlZCIpKTsKKwllbHNlCisJICAgIEVNU0coXygiRTMxNDogUHJlc2VydmUgZmFpbGVkIikpOworICAgIH0KK30KKworLyoKKyAqIE5PVEU6IFRoZSBwb2ludGVyIHJldHVybmVkIGJ5IHRoZSBtbF9nZXRfKigpIGZ1bmN0aW9ucyBvbmx5IHJlbWFpbnMgdmFsaWQKKyAqIHVudGlsIHRoZSBuZXh0IGNhbGwhCisgKiAgbGluZTEgPSBtbF9nZXQoMSk7CisgKiAgbGluZTIgPSBtbF9nZXQoMik7CS8vIGxpbmUxIGlzIG5vdyBpbnZhbGlkIQorICogTWFrZSBhIGNvcHkgb2YgdGhlIGxpbmUgaWYgbmVjZXNzYXJ5LgorICovCisvKgorICogZ2V0IGEgcG9pbnRlciB0byBhIChyZWFkLW9ubHkgY29weSBvZiBhKSBsaW5lCisgKgorICogT24gZmFpbHVyZSBhbiBlcnJvciBtZXNzYWdlIGlzIGdpdmVuIGFuZCBJT2J1ZmYgaXMgcmV0dXJuZWQgKHRvIGF2b2lkCisgKiBoYXZpbmcgdG8gY2hlY2sgZm9yIGVycm9yIGV2ZXJ5d2hlcmUpLgorICovCisgICAgY2hhcl91ICAqCittbF9nZXQobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHJldHVybiBtbF9nZXRfYnVmKGN1cmJ1ZiwgbG51bSwgRkFMU0UpOworfQorCisvKgorICogbWxfZ2V0X3BvczogZ2V0IHBvaW50ZXIgdG8gcG9zaXRpb24gJ3BvcycKKyAqLworICAgIGNoYXJfdSAqCittbF9nZXRfcG9zKHBvcykKKyAgICBwb3NfVAkqcG9zOworeworICAgIHJldHVybiAobWxfZ2V0X2J1ZihjdXJidWYsIHBvcy0+bG51bSwgRkFMU0UpICsgcG9zLT5jb2wpOworfQorCisvKgorICogbWxfZ2V0X2N1cmxpbmU6IGdldCBwb2ludGVyIHRvIGN1cnNvciBsaW5lLgorICovCisgICAgY2hhcl91ICoKK21sX2dldF9jdXJsaW5lKCkKK3sKKyAgICByZXR1cm4gbWxfZ2V0X2J1ZihjdXJidWYsIGN1cndpbi0+d19jdXJzb3IubG51bSwgRkFMU0UpOworfQorCisvKgorICogbWxfZ2V0X2N1cnNvcjogZ2V0IHBvaW50ZXIgdG8gY3Vyc29yIHBvc2l0aW9uCisgKi8KKyAgICBjaGFyX3UgKgorbWxfZ2V0X2N1cnNvcigpCit7CisgICAgcmV0dXJuIChtbF9nZXRfYnVmKGN1cmJ1ZiwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBGQUxTRSkgKworCQkJCQkJCWN1cndpbi0+d19jdXJzb3IuY29sKTsKK30KKworLyoKKyAqIGdldCBhIHBvaW50ZXIgdG8gYSBsaW5lIGluIGEgc3BlY2lmaWMgYnVmZmVyCisgKgorICogIndpbGxfY2hhbmdlIjogaWYgVFJVRSBtYXJrIHRoZSBidWZmZXIgZGlydHkgKGNoYXJzIGluIHRoZSBsaW5lIHdpbGwgYmUKKyAqIGNoYW5nZWQpCisgKi8KKyAgICBjaGFyX3UgICoKK21sX2dldF9idWYoYnVmLCBsbnVtLCB3aWxsX2NoYW5nZSkKKyAgICBidWZfVAkqYnVmOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQl3aWxsX2NoYW5nZTsJCS8qIGxpbmUgd2lsbCBiZSBjaGFuZ2VkICovCit7CisgICAgYmhkcl9UICAgICpocDsKKyAgICBEQVRBX0JMICpkcDsKKyAgICBjaGFyX3UgICpwdHI7CisKKyAgICBpZiAobG51bSA+IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQkvKiBpbnZhbGlkIGxpbmUgbnVtYmVyICovCisgICAgeworCUVNU0dOKF8oIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiKSwgbG51bSk7CitlcnJvcnJldDoKKwlTVFJDUFkoSU9idWZmLCAiPz8/Iik7CisJcmV0dXJuIElPYnVmZjsKKyAgICB9CisgICAgaWYgKGxudW0gPD0gMCkJCQkvKiBwcmV0ZW5kIGxpbmUgMCBpcyBsaW5lIDEgKi8KKwlsbnVtID0gMTsKKworICAgIGlmIChidWYtPmJfbWwubWxfbWZwID09IE5VTEwpCS8qIHRoZXJlIGFyZSBubyBsaW5lcyAqLworCXJldHVybiAoY2hhcl91ICopIiI7CisKKy8qCisgKiBTZWUgaWYgaXQgaXMgdGhlIHNhbWUgbGluZSBhcyByZXF1ZXN0ZWQgbGFzdCB0aW1lLgorICogT3RoZXJ3aXNlIG1heSBuZWVkIHRvIGZsdXNoIGxhc3QgdXNlZCBsaW5lLgorICovCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gIT0gbG51bSkKKyAgICB7CisJbWxfZmx1c2hfbGluZShidWYpOworCisJLyoKKwkgKiBGaW5kIHRoZSBkYXRhIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGxpbmUuCisJICogVGhpcyBhbHNvIGZpbGxzIHRoZSBzdGFjayB3aXRoIHRoZSBibG9ja3MgZnJvbSB0aGUgcm9vdCB0byB0aGUgZGF0YQorCSAqIGJsb2NrIGFuZCByZWxlYXNlcyBhbnkgbG9ja2VkIGJsb2NrLgorCSAqLworCWlmICgoaHAgPSBtbF9maW5kX2xpbmUoYnVmLCBsbnVtLCBNTF9GSU5EKSkgPT0gTlVMTCkKKwl7CisJICAgIEVNU0dOKF8oIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiKSwgbG51bSk7CisJICAgIGdvdG8gZXJyb3JyZXQ7CisJfQorCisJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisKKwlwdHIgPSAoY2hhcl91ICopZHAgKyAoKGRwLT5kYl9pbmRleFtsbnVtIC0gYnVmLT5iX21sLm1sX2xvY2tlZF9sb3ddKSAmIERCX0lOREVYX01BU0spOworCWJ1Zi0+Yl9tbC5tbF9saW5lX3B0ciA9IHB0cjsKKwlidWYtPmJfbWwubWxfbGluZV9sbnVtID0gbG51bTsKKwlidWYtPmJfbWwubWxfZmxhZ3MgJj0gfk1MX0xJTkVfRElSVFk7CisgICAgfQorICAgIGlmICh3aWxsX2NoYW5nZSkKKwlidWYtPmJfbWwubWxfZmxhZ3MgfD0gKE1MX0xPQ0tFRF9ESVJUWSB8IE1MX0xPQ0tFRF9QT1MpOworCisgICAgcmV0dXJuIGJ1Zi0+Yl9tbC5tbF9saW5lX3B0cjsKK30KKworLyoKKyAqIENoZWNrIGlmIGEgbGluZSB0aGF0IHdhcyBqdXN0IG9idGFpbmVkIGJ5IGEgY2FsbCB0byBtbF9nZXQKKyAqIGlzIGluIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KKyAgICBpbnQKK21sX2xpbmVfYWxsb2NlZCgpCit7CisgICAgcmV0dXJuIChjdXJidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9MSU5FX0RJUlRZKTsKK30KKworLyoKKyAqIEFwcGVuZCBhIGxpbmUgYWZ0ZXIgbG51bSAobWF5IGJlIDAgdG8gaW5zZXJ0IGEgbGluZSBpbiBmcm9udCBvZiB0aGUgZmlsZSkuCisgKiAibGluZSIgZG9lcyBub3QgbmVlZCB0byBiZSBhbGxvY2F0ZWQsIGJ1dCBjYW4ndCBiZSBhbm90aGVyIGxpbmUgaW4gYQorICogYnVmZmVyLCB1bmxvY2tpbmcgbWF5IG1ha2UgaXQgaW52YWxpZC4KKyAqCisgKiAgIG5ld2ZpbGU6IFRSVUUgd2hlbiBzdGFydGluZyB0byBlZGl0IGEgbmV3IGZpbGUsIG1lYW5pbmcgdGhhdCBwZV9vbGRfbG51bQorICoJCXdpbGwgYmUgc2V0IGZvciByZWNvdmVyeQorICogQ2hlY2s6IFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYWxzbyBjYWxsCisgKiBhcHBlbmRlZF9saW5lcygpLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWxfYXBwZW5kKGxudW0sIGxpbmUsIGxlbiwgbmV3ZmlsZSkKKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogYXBwZW5kIGFmdGVyIHRoaXMgbGluZSAoY2FuIGJlIDApICovCisgICAgY2hhcl91CSpsaW5lOwkJLyogdGV4dCBvZiB0aGUgbmV3IGxpbmUgKi8KKyAgICBjb2xucl9UCWxlbjsJCS8qIGxlbmd0aCBvZiBuZXcgbGluZSwgaW5jbHVkaW5nIE5VTCwgb3IgMCAqLworICAgIGludAkJbmV3ZmlsZTsJLyogZmxhZywgc2VlIGFib3ZlICovCit7CisgICAgLyogV2hlbiBzdGFydGluZyB1cCwgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBjcmVhdGUgdGhlIG1lbWZpbGUgKi8KKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMICYmIG9wZW5fYnVmZmVyKEZBTFNFLCBOVUxMKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gIT0gMCkKKwltbF9mbHVzaF9saW5lKGN1cmJ1Zik7CisgICAgcmV0dXJuIG1sX2FwcGVuZF9pbnQoY3VyYnVmLCBsbnVtLCBsaW5lLCBsZW4sIG5ld2ZpbGUsIEZBTFNFKTsKK30KKworICAgIHN0YXRpYyBpbnQKK21sX2FwcGVuZF9pbnQoYnVmLCBsbnVtLCBsaW5lLCBsZW4sIG5ld2ZpbGUsIG1hcmspCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogYXBwZW5kIGFmdGVyIHRoaXMgbGluZSAoY2FuIGJlIDApICovCisgICAgY2hhcl91CSpsaW5lOwkJLyogdGV4dCBvZiB0aGUgbmV3IGxpbmUgKi8KKyAgICBjb2xucl9UCWxlbjsJCS8qIGxlbmd0aCBvZiBsaW5lLCBpbmNsdWRpbmcgTlVMLCBvciAwICovCisgICAgaW50CQluZXdmaWxlOwkvKiBmbGFnLCBzZWUgYWJvdmUgKi8KKyAgICBpbnQJCW1hcms7CQkvKiBtYXJrIHRoZSBuZXcgbGluZSAqLworeworICAgIGludAkJaTsKKyAgICBpbnQJCWxpbmVfY291bnQ7CS8qIG51bWJlciBvZiBpbmRleGVzIGluIGN1cnJlbnQgYmxvY2sgKi8KKyAgICBpbnQJCW9mZnNldDsKKyAgICBpbnQJCWZyb20sIHRvOworICAgIGludAkJc3BhY2VfbmVlZGVkOwkvKiBzcGFjZSBuZWVkZWQgZm9yIG5ldyBsaW5lICovCisgICAgaW50CQlwYWdlX3NpemU7CisgICAgaW50CQlwYWdlX2NvdW50OworICAgIGludAkJZGJfaWR4OwkJLyogaW5kZXggZm9yIGxudW0gaW4gZGF0YSBibG9jayAqLworICAgIGJoZHJfVAkqaHA7CisgICAgbWVtZmlsZV9UCSptZnA7CisgICAgREFUQV9CTAkqZHA7CisgICAgUFRSX0JMCSpwcDsKKyAgICBpbmZvcHRyX1QJKmlwOworCisJCQkJCS8qIGxudW0gb3V0IG9mIHJhbmdlICovCisgICAgaWYgKGxudW0gPiBidWYtPmJfbWwubWxfbGluZV9jb3VudCB8fCBidWYtPmJfbWwubWxfbWZwID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICBpZiAobG93ZXN0X21hcmtlZCAmJiBsb3dlc3RfbWFya2VkID4gbG51bSkKKwlsb3dlc3RfbWFya2VkID0gbG51bSArIDE7CisKKyAgICBpZiAobGVuID09IDApCisJbGVuID0gKGNvbG5yX1QpU1RSTEVOKGxpbmUpICsgMTsJLyogc3BhY2UgbmVlZGVkIGZvciB0aGUgdGV4dCAqLworICAgIHNwYWNlX25lZWRlZCA9IGxlbiArIElOREVYX1NJWkU7CS8qIHNwYWNlIG5lZWRlZCBmb3IgdGV4dCArIGluZGV4ICovCisKKyAgICBtZnAgPSBidWYtPmJfbWwubWxfbWZwOworICAgIHBhZ2Vfc2l6ZSA9IG1mcC0+bWZfcGFnZV9zaXplOworCisvKgorICogZmluZCB0aGUgZGF0YSBibG9jayBjb250YWluaW5nIHRoZSBwcmV2aW91cyBsaW5lCisgKiBUaGlzIGFsc28gZmlsbHMgdGhlIHN0YWNrIHdpdGggdGhlIGJsb2NrcyBmcm9tIHRoZSByb290IHRvIHRoZSBkYXRhIGJsb2NrCisgKiBUaGlzIGFsc28gcmVsZWFzZXMgYW55IGxvY2tlZCBibG9jay4KKyAqLworICAgIGlmICgoaHAgPSBtbF9maW5kX2xpbmUoYnVmLCBsbnVtID09IDAgPyAobGluZW5yX1QpMSA6IGxudW0sCisJCQkJCQkJICBNTF9JTlNFUlQpKSA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgYnVmLT5iX21sLm1sX2ZsYWdzICY9IH5NTF9FTVBUWTsKKworICAgIGlmIChsbnVtID09IDApCQkvKiBnb3QgbGluZSBvbmUgaW5zdGVhZCwgY29ycmVjdCBkYl9pZHggKi8KKwlkYl9pZHggPSAtMTsJCS8qIGNhcmVmdWwsIGl0IGlzIG5lZ2F0aXZlISAqLworICAgIGVsc2UKKwlkYl9pZHggPSBsbnVtIC0gYnVmLT5iX21sLm1sX2xvY2tlZF9sb3c7CisJCS8qIGdldCBsaW5lIGNvdW50IGJlZm9yZSB0aGUgaW5zZXJ0aW9uICovCisgICAgbGluZV9jb3VudCA9IGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfaGlnaCAtIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93OworCisgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisKKy8qCisgKiBJZgorICogLSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAqIC0gYXBwZW5kaW5nIHRvIHRoZSBsYXN0IGxpbmUgaW4gdGhlIGJsb2NrCisgKiAtIG5vdCBhcHBlbmRpbmcgdG8gdGhlIGxhc3QgbGluZSBpbiB0aGUgZmlsZQorICogaW5zZXJ0IGluIGZyb250IG9mIHRoZSBuZXh0IGJsb2NrLgorICovCisgICAgaWYgKChpbnQpZHAtPmRiX2ZyZWUgPCBzcGFjZV9uZWVkZWQgJiYgZGJfaWR4ID09IGxpbmVfY291bnQgLSAxCisJCQkJCSAgICAmJiBsbnVtIDwgYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCS8qCisJICogTm93IHRoYXQgdGhlIGxpbmUgaXMgbm90IGdvaW5nIHRvIGJlIGluc2VydGVkIGluIHRoZSBibG9jayB0aGF0IHdlCisJICogZXhwZWN0ZWQsIHRoZSBsaW5lIGNvdW50IGhhcyB0byBiZSBhZGp1c3RlZCBpbiB0aGUgcG9pbnRlciBibG9ja3MKKwkgKiBieSB1c2luZyBtbF9sb2NrZWRfbGluZWFkZC4KKwkgKi8KKwktLShidWYtPmJfbWwubWxfbG9ja2VkX2xpbmVhZGQpOworCS0tKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfaGlnaCk7CisJaWYgKChocCA9IG1sX2ZpbmRfbGluZShidWYsIGxudW0gKyAxLCBNTF9JTlNFUlQpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKworCWRiX2lkeCA9IC0xOwkJICAgIC8qIGNhcmVmdWwsIGl0IGlzIG5lZ2F0aXZlISAqLworCQkgICAgLyogZ2V0IGxpbmUgY291bnQgYmVmb3JlIHRoZSBpbnNlcnRpb24gKi8KKwlsaW5lX2NvdW50ID0gYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoIC0gYnVmLT5iX21sLm1sX2xvY2tlZF9sb3c7CisJQ0hFQ0soYnVmLT5iX21sLm1sX2xvY2tlZF9sb3cgIT0gbG51bSArIDEsICJsb2NrZWRfbG93ICE9IGxudW0gKyAxIik7CisKKwlkcCA9IChEQVRBX0JMICopKGhwLT5iaF9kYXRhKTsKKyAgICB9CisKKyAgICArK2J1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCisgICAgaWYgKChpbnQpZHAtPmRiX2ZyZWUgPj0gc3BhY2VfbmVlZGVkKQkvKiBlbm91Z2ggcm9vbSBpbiBkYXRhIGJsb2NrICovCisgICAgeworLyoKKyAqIEluc2VydCBuZXcgbGluZSBpbiBleGlzdGluZyBkYXRhIGJsb2NrLCBvciBpbiBkYXRhIGJsb2NrIGFsbG9jYXRlZCBhYm92ZS4KKyAqLworCWRwLT5kYl90eHRfc3RhcnQgLT0gbGVuOworCWRwLT5kYl9mcmVlIC09IHNwYWNlX25lZWRlZDsKKwkrKyhkcC0+ZGJfbGluZV9jb3VudCk7CisKKwkvKgorCSAqIG1vdmUgdGhlIHRleHQgb2YgdGhlIGxpbmVzIHRoYXQgZm9sbG93IHRvIHRoZSBmcm9udAorCSAqIGFkanVzdCB0aGUgaW5kZXhlcyBvZiB0aGUgbGluZXMgdGhhdCBmb2xsb3cKKwkgKi8KKwlpZiAobGluZV9jb3VudCA+IGRiX2lkeCArIDEpCSAgICAvKiBpZiB0aGVyZSBhcmUgZm9sbG93aW5nIGxpbmVzICovCisJeworCSAgICAvKgorCSAgICAgKiBPZmZzZXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyBsaW5lLgorCSAgICAgKiBUaGlzIHdpbGwgYmVjb21lIHRoZSBjaGFyYWN0ZXIganVzdCBhZnRlciB0aGUgbmV3IGxpbmUuCisJICAgICAqLworCSAgICBpZiAoZGJfaWR4IDwgMCkKKwkJb2Zmc2V0ID0gZHAtPmRiX3R4dF9lbmQ7CisJICAgIGVsc2UKKwkJb2Zmc2V0ID0gKChkcC0+ZGJfaW5kZXhbZGJfaWR4XSkgJiBEQl9JTkRFWF9NQVNLKTsKKwkgICAgbWNoX21lbW1vdmUoKGNoYXIgKilkcCArIGRwLT5kYl90eHRfc3RhcnQsCisJCQkJCSAgKGNoYXIgKilkcCArIGRwLT5kYl90eHRfc3RhcnQgKyBsZW4sCisJCQkJIChzaXplX3QpKG9mZnNldCAtIChkcC0+ZGJfdHh0X3N0YXJ0ICsgbGVuKSkpOworCSAgICBmb3IgKGkgPSBsaW5lX2NvdW50IC0gMTsgaSA+IGRiX2lkeDsgLS1pKQorCQlkcC0+ZGJfaW5kZXhbaSArIDFdID0gZHAtPmRiX2luZGV4W2ldIC0gbGVuOworCSAgICBkcC0+ZGJfaW5kZXhbZGJfaWR4ICsgMV0gPSBvZmZzZXQgLSBsZW47CisJfQorCWVsc2UJCQkJICAgIC8qIGFkZCBsaW5lIGF0IHRoZSBlbmQgKi8KKwkgICAgZHAtPmRiX2luZGV4W2RiX2lkeCArIDFdID0gZHAtPmRiX3R4dF9zdGFydDsKKworCS8qCisJICogY29weSB0aGUgdGV4dCBpbnRvIHRoZSBibG9jaworCSAqLworCW1jaF9tZW1tb3ZlKChjaGFyICopZHAgKyBkcC0+ZGJfaW5kZXhbZGJfaWR4ICsgMV0sIGxpbmUsIChzaXplX3QpbGVuKTsKKwlpZiAobWFyaykKKwkgICAgZHAtPmRiX2luZGV4W2RiX2lkeCArIDFdIHw9IERCX01BUktFRDsKKworCS8qCisJICogTWFyayB0aGUgYmxvY2sgZGlydHkuCisJICovCisJYnVmLT5iX21sLm1sX2ZsYWdzIHw9IE1MX0xPQ0tFRF9ESVJUWTsKKwlpZiAoIW5ld2ZpbGUpCisJICAgIGJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9MT0NLRURfUE9TOworICAgIH0KKyAgICBlbHNlCSAgICAvKiBub3QgZW5vdWdoIHNwYWNlIGluIGRhdGEgYmxvY2sgKi8KKyAgICB7CisvKgorICogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIHdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGRhdGEgYmxvY2sgYW5kIGNvcHkgc29tZQorICogbGluZXMgaW50byBpdC4KKyAqIFRoZW4gd2UgaGF2ZSB0byBpbnNlcnQgYW4gZW50cnkgaW4gdGhlIHBvaW50ZXIgYmxvY2suCisgKiBJZiB0aGlzIHBvaW50ZXIgYmxvY2sgYWxzbyBpcyBmdWxsLCB3ZSBnbyB1cCBhbm90aGVyIGJsb2NrLCBhbmQgc28gb24sIHVwCisgKiB0byB0aGUgcm9vdCBpZiBuZWNlc3NhcnkuCisgKiBUaGUgbGluZSBjb3VudHMgaW4gdGhlIHBvaW50ZXIgYmxvY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkIGJ5CisgKiBtbF9maW5kX2xpbmUoKS4KKyAqLworCWxvbmcJICAgIGxpbmVfY291bnRfbGVmdCwgbGluZV9jb3VudF9yaWdodDsKKwlpbnQJICAgIHBhZ2VfY291bnRfbGVmdCwgcGFnZV9jb3VudF9yaWdodDsKKwliaGRyX1QJICAgICpocF9sZWZ0OworCWJoZHJfVAkgICAgKmhwX3JpZ2h0OworCWJoZHJfVAkgICAgKmhwX25ldzsKKwlpbnQJICAgIGxpbmVzX21vdmVkOworCWludAkgICAgZGF0YV9tb3ZlZCA9IDA7CSAgICAvKiBpbml0IHRvIHNodXQgdXAgZ2NjICovCisJaW50CSAgICB0b3RhbF9tb3ZlZCA9IDA7CSAgICAvKiBpbml0IHRvIHNodXQgdXAgZ2NjICovCisJREFUQV9CTAkgICAgKmRwX3JpZ2h0LCAqZHBfbGVmdDsKKwlpbnQJICAgIHN0YWNrX2lkeDsKKwlpbnQJICAgIGluX2xlZnQ7CisJaW50CSAgICBsaW5lYWRkOworCWJsb2NrbnJfVCAgIGJudW1fbGVmdCwgYm51bV9yaWdodDsKKwlsaW5lbnJfVCAgICBsbnVtX2xlZnQsIGxudW1fcmlnaHQ7CisJaW50CSAgICBwYl9pZHg7CisJUFRSX0JMCSAgICAqcHBfbmV3OworCisJLyoKKwkgKiBXZSBhcmUgZ29pbmcgdG8gYWxsb2NhdGUgYSBuZXcgZGF0YSBibG9jay4gRGVwZW5kaW5nIG9uIHRoZQorCSAqIHNpdHVhdGlvbiBpdCB3aWxsIGJlIHB1dCB0byB0aGUgbGVmdCBvciByaWdodCBvZiB0aGUgZXhpc3RpbmcKKwkgKiBibG9jay4gIElmIHBvc3NpYmxlIHdlIHB1dCB0aGUgbmV3IGxpbmUgaW4gdGhlIGxlZnQgYmxvY2sgYW5kIG1vdmUKKwkgKiB0aGUgbGluZXMgYWZ0ZXIgaXQgdG8gdGhlIHJpZ2h0IGJsb2NrLiBPdGhlcndpc2UgdGhlIG5ldyBsaW5lIGlzCisJICogYWxzbyBwdXQgaW4gdGhlIHJpZ2h0IGJsb2NrLiBUaGlzIG1ldGhvZCBpcyBtb3JlIGVmZmljaWVudCB3aGVuCisJICogaW5zZXJ0aW5nIGEgbG90IG9mIGxpbmVzIGF0IG9uZSBwbGFjZS4KKwkgKi8KKwlpZiAoZGJfaWR4IDwgMCkJCS8qIGxlZnQgYmxvY2sgaXMgbmV3LCByaWdodCBibG9jayBpcyBleGlzdGluZyAqLworCXsKKwkgICAgbGluZXNfbW92ZWQgPSAwOworCSAgICBpbl9sZWZ0ID0gVFJVRTsKKwkgICAgLyogc3BhY2VfbmVlZGVkIGRvZXMgbm90IGNoYW5nZSAqLworCX0KKwllbHNlCQkJLyogbGVmdCBibG9jayBpcyBleGlzdGluZywgcmlnaHQgYmxvY2sgaXMgbmV3ICovCisJeworCSAgICBsaW5lc19tb3ZlZCA9IGxpbmVfY291bnQgLSBkYl9pZHggLSAxOworCSAgICBpZiAobGluZXNfbW92ZWQgPT0gMCkKKwkJaW5fbGVmdCA9IEZBTFNFOwkvKiBwdXQgbmV3IGxpbmUgaW4gcmlnaHQgYmxvY2sgKi8KKwkJCQkJLyogc3BhY2VfbmVlZGVkIGRvZXMgbm90IGNoYW5nZSAqLworCSAgICBlbHNlCisJICAgIHsKKwkJZGF0YV9tb3ZlZCA9ICgoZHAtPmRiX2luZGV4W2RiX2lkeF0pICYgREJfSU5ERVhfTUFTSykgLQorCQkJCQkJCSAgICBkcC0+ZGJfdHh0X3N0YXJ0OworCQl0b3RhbF9tb3ZlZCA9IGRhdGFfbW92ZWQgKyBsaW5lc19tb3ZlZCAqIElOREVYX1NJWkU7CisJCWlmICgoaW50KWRwLT5kYl9mcmVlICsgdG90YWxfbW92ZWQgPj0gc3BhY2VfbmVlZGVkKQorCQl7CisJCSAgICBpbl9sZWZ0ID0gVFJVRTsJLyogcHV0IG5ldyBsaW5lIGluIGxlZnQgYmxvY2sgKi8KKwkJICAgIHNwYWNlX25lZWRlZCA9IHRvdGFsX21vdmVkOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaW5fbGVmdCA9IEZBTFNFOwkgICAgLyogcHV0IG5ldyBsaW5lIGluIHJpZ2h0IGJsb2NrICovCisJCSAgICBzcGFjZV9uZWVkZWQgKz0gdG90YWxfbW92ZWQ7CisJCX0KKwkgICAgfQorCX0KKworCXBhZ2VfY291bnQgPSAoKHNwYWNlX25lZWRlZCArIEhFQURFUl9TSVpFKSArIHBhZ2Vfc2l6ZSAtIDEpIC8gcGFnZV9zaXplOworCWlmICgoaHBfbmV3ID0gbWxfbmV3X2RhdGEobWZwLCBuZXdmaWxlLCBwYWdlX2NvdW50KSkgPT0gTlVMTCkKKwl7CisJCQkvKiBjb3JyZWN0IGxpbmUgY291bnRzIGluIHBvaW50ZXIgYmxvY2tzICovCisJICAgIC0tKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbGluZWFkZCk7CisJICAgIC0tKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfaGlnaCk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlpZiAoZGJfaWR4IDwgMCkJCS8qIGxlZnQgYmxvY2sgaXMgbmV3ICovCisJeworCSAgICBocF9sZWZ0ID0gaHBfbmV3OworCSAgICBocF9yaWdodCA9IGhwOworCSAgICBsaW5lX2NvdW50X2xlZnQgPSAwOworCSAgICBsaW5lX2NvdW50X3JpZ2h0ID0gbGluZV9jb3VudDsKKwl9CisJZWxzZQkJCS8qIHJpZ2h0IGJsb2NrIGlzIG5ldyAqLworCXsKKwkgICAgaHBfbGVmdCA9IGhwOworCSAgICBocF9yaWdodCA9IGhwX25ldzsKKwkgICAgbGluZV9jb3VudF9sZWZ0ID0gbGluZV9jb3VudDsKKwkgICAgbGluZV9jb3VudF9yaWdodCA9IDA7CisJfQorCWRwX3JpZ2h0ID0gKERBVEFfQkwgKikoaHBfcmlnaHQtPmJoX2RhdGEpOworCWRwX2xlZnQgPSAoREFUQV9CTCAqKShocF9sZWZ0LT5iaF9kYXRhKTsKKwlibnVtX2xlZnQgPSBocF9sZWZ0LT5iaF9ibnVtOworCWJudW1fcmlnaHQgPSBocF9yaWdodC0+YmhfYm51bTsKKwlwYWdlX2NvdW50X2xlZnQgPSBocF9sZWZ0LT5iaF9wYWdlX2NvdW50OworCXBhZ2VfY291bnRfcmlnaHQgPSBocF9yaWdodC0+YmhfcGFnZV9jb3VudDsKKworCS8qCisJICogTWF5IG1vdmUgdGhlIG5ldyBsaW5lIGludG8gdGhlIHJpZ2h0L25ldyBibG9jay4KKwkgKi8KKwlpZiAoIWluX2xlZnQpCisJeworCSAgICBkcF9yaWdodC0+ZGJfdHh0X3N0YXJ0IC09IGxlbjsKKwkgICAgZHBfcmlnaHQtPmRiX2ZyZWUgLT0gbGVuICsgSU5ERVhfU0laRTsKKwkgICAgZHBfcmlnaHQtPmRiX2luZGV4WzBdID0gZHBfcmlnaHQtPmRiX3R4dF9zdGFydDsKKwkgICAgaWYgKG1hcmspCisJCWRwX3JpZ2h0LT5kYl9pbmRleFswXSB8PSBEQl9NQVJLRUQ7CisKKwkgICAgbWNoX21lbW1vdmUoKGNoYXIgKilkcF9yaWdodCArIGRwX3JpZ2h0LT5kYl90eHRfc3RhcnQsCisJCQkJCQkJICAgbGluZSwgKHNpemVfdClsZW4pOworCSAgICArK2xpbmVfY291bnRfcmlnaHQ7CisJfQorCS8qCisJICogbWF5IG1vdmUgbGluZXMgZnJvbSB0aGUgbGVmdC9vbGQgYmxvY2sgdG8gdGhlIHJpZ2h0L25ldyBvbmUuCisJICovCisJaWYgKGxpbmVzX21vdmVkKQorCXsKKwkgICAgLyoKKwkgICAgICovCisJICAgIGRwX3JpZ2h0LT5kYl90eHRfc3RhcnQgLT0gZGF0YV9tb3ZlZDsKKwkgICAgZHBfcmlnaHQtPmRiX2ZyZWUgLT0gdG90YWxfbW92ZWQ7CisJICAgIG1jaF9tZW1tb3ZlKChjaGFyICopZHBfcmlnaHQgKyBkcF9yaWdodC0+ZGJfdHh0X3N0YXJ0LAorCQkJKGNoYXIgKilkcF9sZWZ0ICsgZHBfbGVmdC0+ZGJfdHh0X3N0YXJ0LAorCQkJKHNpemVfdClkYXRhX21vdmVkKTsKKwkgICAgb2Zmc2V0ID0gZHBfcmlnaHQtPmRiX3R4dF9zdGFydCAtIGRwX2xlZnQtPmRiX3R4dF9zdGFydDsKKwkgICAgZHBfbGVmdC0+ZGJfdHh0X3N0YXJ0ICs9IGRhdGFfbW92ZWQ7CisJICAgIGRwX2xlZnQtPmRiX2ZyZWUgKz0gdG90YWxfbW92ZWQ7CisKKwkgICAgLyoKKwkgICAgICogdXBkYXRlIGluZGV4ZXMgaW4gdGhlIG5ldyBibG9jaworCSAgICAgKi8KKwkgICAgZm9yICh0byA9IGxpbmVfY291bnRfcmlnaHQsIGZyb20gPSBkYl9pZHggKyAxOworCQkJCQkgZnJvbSA8IGxpbmVfY291bnRfbGVmdDsgKytmcm9tLCArK3RvKQorCQlkcF9yaWdodC0+ZGJfaW5kZXhbdG9dID0gZHAtPmRiX2luZGV4W2Zyb21dICsgb2Zmc2V0OworCSAgICBsaW5lX2NvdW50X3JpZ2h0ICs9IGxpbmVzX21vdmVkOworCSAgICBsaW5lX2NvdW50X2xlZnQgLT0gbGluZXNfbW92ZWQ7CisJfQorCisJLyoKKwkgKiBNYXkgbW92ZSB0aGUgbmV3IGxpbmUgaW50byB0aGUgbGVmdCAob2xkIG9yIG5ldykgYmxvY2suCisJICovCisJaWYgKGluX2xlZnQpCisJeworCSAgICBkcF9sZWZ0LT5kYl90eHRfc3RhcnQgLT0gbGVuOworCSAgICBkcF9sZWZ0LT5kYl9mcmVlIC09IGxlbiArIElOREVYX1NJWkU7CisJICAgIGRwX2xlZnQtPmRiX2luZGV4W2xpbmVfY291bnRfbGVmdF0gPSBkcF9sZWZ0LT5kYl90eHRfc3RhcnQ7CisJICAgIGlmIChtYXJrKQorCQlkcF9sZWZ0LT5kYl9pbmRleFtsaW5lX2NvdW50X2xlZnRdIHw9IERCX01BUktFRDsKKwkgICAgbWNoX21lbW1vdmUoKGNoYXIgKilkcF9sZWZ0ICsgZHBfbGVmdC0+ZGJfdHh0X3N0YXJ0LAorCQkJCQkJCSAgIGxpbmUsIChzaXplX3QpbGVuKTsKKwkgICAgKytsaW5lX2NvdW50X2xlZnQ7CisJfQorCisJaWYgKGRiX2lkeCA8IDApCQkvKiBsZWZ0IGJsb2NrIGlzIG5ldyAqLworCXsKKwkgICAgbG51bV9sZWZ0ID0gbG51bSArIDE7CisJICAgIGxudW1fcmlnaHQgPSAwOworCX0KKwllbHNlCQkJLyogcmlnaHQgYmxvY2sgaXMgbmV3ICovCisJeworCSAgICBsbnVtX2xlZnQgPSAwOworCSAgICBpZiAoaW5fbGVmdCkKKwkJbG51bV9yaWdodCA9IGxudW0gKyAyOworCSAgICBlbHNlCisJCWxudW1fcmlnaHQgPSBsbnVtICsgMTsKKwl9CisJZHBfbGVmdC0+ZGJfbGluZV9jb3VudCA9IGxpbmVfY291bnRfbGVmdDsKKwlkcF9yaWdodC0+ZGJfbGluZV9jb3VudCA9IGxpbmVfY291bnRfcmlnaHQ7CisKKwkvKgorCSAqIHJlbGVhc2UgdGhlIHR3byBkYXRhIGJsb2NrcworCSAqIFRoZSBuZXcgb25lIChocF9uZXcpIGFscmVhZHkgaGFzIGEgY29ycmVjdCBibG9ja251bWJlci4KKwkgKiBUaGUgb2xkIG9uZSAoaHAsIGluIG1sX2xvY2tlZCkgZ2V0cyBhIHBvc2l0aXZlIGJsb2NrbnVtYmVyIGlmCisJICogd2UgY2hhbmdlZCBpdCBhbmQgd2UgYXJlIG5vdCBlZGl0aW5nIGEgbmV3IGZpbGUuCisJICovCisJaWYgKGxpbmVzX21vdmVkIHx8IGluX2xlZnQpCisJICAgIGJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9MT0NLRURfRElSVFk7CisJaWYgKCFuZXdmaWxlICYmIGRiX2lkeCA+PSAwICYmIGluX2xlZnQpCisJICAgIGJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9MT0NLRURfUE9TOworCW1mX3B1dChtZnAsIGhwX25ldywgVFJVRSwgRkFMU0UpOworCisJLyoKKwkgKiBmbHVzaCB0aGUgb2xkIGRhdGEgYmxvY2sKKwkgKiBzZXQgbWxfbG9ja2VkX2xpbmVhZGQgdG8gMCwgYmVjYXVzZSB0aGUgdXBkYXRpbmcgb2YgdGhlCisJICogcG9pbnRlciBibG9ja3MgaXMgZG9uZSBiZWxvdworCSAqLworCWxpbmVhZGQgPSBidWYtPmJfbWwubWxfbG9ja2VkX2xpbmVhZGQ7CisJYnVmLT5iX21sLm1sX2xvY2tlZF9saW5lYWRkID0gMDsKKwltbF9maW5kX2xpbmUoYnVmLCAobGluZW5yX1QpMCwgTUxfRkxVU0gpOyAgIC8qIGZsdXNoIGRhdGEgYmxvY2sgKi8KKworCS8qCisJICogdXBkYXRlIHBvaW50ZXIgYmxvY2tzIGZvciB0aGUgbmV3IGRhdGEgYmxvY2sKKwkgKi8KKwlmb3IgKHN0YWNrX2lkeCA9IGJ1Zi0+Yl9tbC5tbF9zdGFja190b3AgLSAxOyBzdGFja19pZHggPj0gMDsKKwkJCQkJCQkJICAtLXN0YWNrX2lkeCkKKwl7CisJICAgIGlwID0gJihidWYtPmJfbWwubWxfc3RhY2tbc3RhY2tfaWR4XSk7CisJICAgIHBiX2lkeCA9IGlwLT5pcF9pbmRleDsKKwkgICAgaWYgKChocCA9IG1mX2dldChtZnAsIGlwLT5pcF9ibnVtLCAxKSkgPT0gTlVMTCkKKwkJcmV0dXJuIEZBSUw7CisJICAgIHBwID0gKFBUUl9CTCAqKShocC0+YmhfZGF0YSk7ICAgLyogbXVzdCBiZSBwb2ludGVyIGJsb2NrICovCisJICAgIGlmIChwcC0+cGJfaWQgIT0gUFRSX0lEKQorCSAgICB7CisJCUVNU0coXygiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIikpOworCQltZl9wdXQobWZwLCBocCwgRkFMU0UsIEZBTFNFKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgLyoKKwkgICAgICogVE9ETzogSWYgdGhlIHBvaW50ZXIgYmxvY2sgaXMgZnVsbCBhbmQgd2UgYXJlIGFkZGluZyBhdCB0aGUgZW5kCisJICAgICAqIHRyeSB0byBpbnNlcnQgaW4gZnJvbnQgb2YgdGhlIG5leHQgYmxvY2sKKwkgICAgICovCisJICAgIC8qIGJsb2NrIG5vdCBmdWxsLCBhZGQgb25lIGVudHJ5ICovCisJICAgIGlmIChwcC0+cGJfY291bnQgPCBwcC0+cGJfY291bnRfbWF4KQorCSAgICB7CisJCWlmIChwYl9pZHggKyAxIDwgKGludClwcC0+cGJfY291bnQpCisJCSAgICBtY2hfbWVtbW92ZSgmcHAtPnBiX3BvaW50ZXJbcGJfaWR4ICsgMl0sCisJCQkJJnBwLT5wYl9wb2ludGVyW3BiX2lkeCArIDFdLAorCQkJKHNpemVfdCkocHAtPnBiX2NvdW50IC0gcGJfaWR4IC0gMSkgKiBzaXplb2YoUFRSX0VOKSk7CisJCSsrcHAtPnBiX2NvdW50OworCQlwcC0+cGJfcG9pbnRlcltwYl9pZHhdLnBlX2xpbmVfY291bnQgPSBsaW5lX2NvdW50X2xlZnQ7CisJCXBwLT5wYl9wb2ludGVyW3BiX2lkeF0ucGVfYm51bSA9IGJudW1fbGVmdDsKKwkJcHAtPnBiX3BvaW50ZXJbcGJfaWR4XS5wZV9wYWdlX2NvdW50ID0gcGFnZV9jb3VudF9sZWZ0OworCQlwcC0+cGJfcG9pbnRlcltwYl9pZHggKyAxXS5wZV9saW5lX2NvdW50ID0gbGluZV9jb3VudF9yaWdodDsKKwkJcHAtPnBiX3BvaW50ZXJbcGJfaWR4ICsgMV0ucGVfYm51bSA9IGJudW1fcmlnaHQ7CisJCXBwLT5wYl9wb2ludGVyW3BiX2lkeCArIDFdLnBlX3BhZ2VfY291bnQgPSBwYWdlX2NvdW50X3JpZ2h0OworCisJCWlmIChsbnVtX2xlZnQgIT0gMCkKKwkJICAgIHBwLT5wYl9wb2ludGVyW3BiX2lkeF0ucGVfb2xkX2xudW0gPSBsbnVtX2xlZnQ7CisJCWlmIChsbnVtX3JpZ2h0ICE9IDApCisJCSAgICBwcC0+cGJfcG9pbnRlcltwYl9pZHggKyAxXS5wZV9vbGRfbG51bSA9IGxudW1fcmlnaHQ7CisKKwkJbWZfcHV0KG1mcCwgaHAsIFRSVUUsIEZBTFNFKTsKKwkJYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IHN0YWNrX2lkeCArIDE7CSAgICAvKiB0cnVuY2F0ZSBzdGFjayAqLworCisJCWlmIChsaW5lYWRkKQorCQl7CisJCSAgICAtLShidWYtPmJfbWwubWxfc3RhY2tfdG9wKTsKKwkJCS8qIGZpeCBsaW5lIGNvdW50IGZvciByZXN0IG9mIGJsb2NrcyBpbiB0aGUgc3RhY2sgKi8KKwkJICAgIG1sX2xpbmVhZGQoYnVmLCBsaW5lYWRkKTsKKwkJCQkJCQkvKiBmaXggc3RhY2sgaXRzZWxmICovCisJCSAgICBidWYtPmJfbWwubWxfc3RhY2tbYnVmLT5iX21sLm1sX3N0YWNrX3RvcF0uaXBfaGlnaCArPQorCQkJCQkJCQkgICAgICBsaW5lYWRkOworCQkgICAgKysoYnVmLT5iX21sLm1sX3N0YWNrX3RvcCk7CisJCX0KKworCQkvKgorCQkgKiBXZSBhcmUgZmluaXNoZWQsIGJyZWFrIHRoZSBsb29wIGhlcmUuCisJCSAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBlbHNlCQkJLyogcG9pbnRlciBibG9jayBmdWxsICovCisJICAgIHsKKwkJLyoKKwkJICogc3BsaXQgdGhlIHBvaW50ZXIgYmxvY2sKKwkJICogYWxsb2NhdGUgYSBuZXcgcG9pbnRlciBibG9jaworCQkgKiBtb3ZlIHNvbWUgb2YgdGhlIHBvaW50ZXIgaW50byB0aGUgbmV3IGJsb2NrCisJCSAqIHByZXBhcmUgZm9yIHVwZGF0aW5nIHRoZSBwYXJlbnQgYmxvY2sKKwkJICovCisJCWZvciAoOzspCS8qIGRvIHRoaXMgdHdpY2Ugd2hlbiBzcGxpdHRpbmcgYmxvY2sgMSAqLworCQl7CisJCSAgICBocF9uZXcgPSBtbF9uZXdfcHRyKG1mcCk7CisJCSAgICBpZiAoaHBfbmV3ID09IE5VTEwpCSAgICAvKiBUT0RPOiB0cnkgdG8gZml4IHRyZWUgKi8KKwkJCXJldHVybiBGQUlMOworCQkgICAgcHBfbmV3ID0gKFBUUl9CTCAqKShocF9uZXctPmJoX2RhdGEpOworCisJCSAgICBpZiAoaHAtPmJoX2JudW0gIT0gMSkKKwkJCWJyZWFrOworCisJCSAgICAvKgorCQkgICAgICogaWYgYmxvY2sgMSBiZWNvbWVzIGZ1bGwgdGhlIHRyZWUgaXMgZ2l2ZW4gYW4gZXh0cmEgbGV2ZWwKKwkJICAgICAqIFRoZSBwb2ludGVycyBmcm9tIGJsb2NrIDEgYXJlIG1vdmVkIGludG8gdGhlIG5ldyBibG9jay4KKwkJICAgICAqIGJsb2NrIDEgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGJsb2NrCisJCSAgICAgKiB0aGVuIGNvbnRpbnVlIHRvIHNwbGl0IHRoZSBuZXcgYmxvY2sKKwkJICAgICAqLworCQkgICAgbWNoX21lbW1vdmUocHBfbmV3LCBwcCwgKHNpemVfdClwYWdlX3NpemUpOworCQkgICAgcHAtPnBiX2NvdW50ID0gMTsKKwkJICAgIHBwLT5wYl9wb2ludGVyWzBdLnBlX2JudW0gPSBocF9uZXctPmJoX2JudW07CisJCSAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9saW5lX2NvdW50ID0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCSAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9vbGRfbG51bSA9IDE7CisJCSAgICBwcC0+cGJfcG9pbnRlclswXS5wZV9wYWdlX2NvdW50ID0gMTsKKwkJICAgIG1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7ICAgLyogcmVsZWFzZSBibG9jayAxICovCisJCSAgICBocCA9IGhwX25ldzsJCS8qIG5ldyBibG9jayBpcyB0byBiZSBzcGxpdCAqLworCQkgICAgcHAgPSBwcF9uZXc7CisJCSAgICBDSEVDSyhzdGFja19pZHggIT0gMCwgXygic3RhY2tfaWR4IHNob3VsZCBiZSAwIikpOworCQkgICAgaXAtPmlwX2luZGV4ID0gMDsKKwkJICAgICsrc3RhY2tfaWR4OwkvKiBkbyBibG9jayAxIGFnYWluIGxhdGVyICovCisJCX0KKwkJLyoKKwkJICogbW92ZSB0aGUgcG9pbnRlcnMgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIHRvIHRoZSBuZXcgYmxvY2sKKwkJICogSWYgdGhlcmUgYXJlIG5vbmUsIHRoZSBuZXcgZW50cnkgd2lsbCBiZSBpbiB0aGUgbmV3IGJsb2NrLgorCQkgKi8KKwkJdG90YWxfbW92ZWQgPSBwcC0+cGJfY291bnQgLSBwYl9pZHggLSAxOworCQlpZiAodG90YWxfbW92ZWQpCisJCXsKKwkJICAgIG1jaF9tZW1tb3ZlKCZwcF9uZXctPnBiX3BvaW50ZXJbMF0sCisJCQkJJnBwLT5wYl9wb2ludGVyW3BiX2lkeCArIDFdLAorCQkJCShzaXplX3QpKHRvdGFsX21vdmVkKSAqIHNpemVvZihQVFJfRU4pKTsKKwkJICAgIHBwX25ldy0+cGJfY291bnQgPSB0b3RhbF9tb3ZlZDsKKwkJICAgIHBwLT5wYl9jb3VudCAtPSB0b3RhbF9tb3ZlZCAtIDE7CisJCSAgICBwcC0+cGJfcG9pbnRlcltwYl9pZHggKyAxXS5wZV9ibnVtID0gYm51bV9yaWdodDsKKwkJICAgIHBwLT5wYl9wb2ludGVyW3BiX2lkeCArIDFdLnBlX2xpbmVfY291bnQgPSBsaW5lX2NvdW50X3JpZ2h0OworCQkgICAgcHAtPnBiX3BvaW50ZXJbcGJfaWR4ICsgMV0ucGVfcGFnZV9jb3VudCA9IHBhZ2VfY291bnRfcmlnaHQ7CisJCSAgICBpZiAobG51bV9yaWdodCkKKwkJCXBwLT5wYl9wb2ludGVyW3BiX2lkeCArIDFdLnBlX29sZF9sbnVtID0gbG51bV9yaWdodDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHBwX25ldy0+cGJfY291bnQgPSAxOworCQkgICAgcHBfbmV3LT5wYl9wb2ludGVyWzBdLnBlX2JudW0gPSBibnVtX3JpZ2h0OworCQkgICAgcHBfbmV3LT5wYl9wb2ludGVyWzBdLnBlX2xpbmVfY291bnQgPSBsaW5lX2NvdW50X3JpZ2h0OworCQkgICAgcHBfbmV3LT5wYl9wb2ludGVyWzBdLnBlX3BhZ2VfY291bnQgPSBwYWdlX2NvdW50X3JpZ2h0OworCQkgICAgcHBfbmV3LT5wYl9wb2ludGVyWzBdLnBlX29sZF9sbnVtID0gbG51bV9yaWdodDsKKwkJfQorCQlwcC0+cGJfcG9pbnRlcltwYl9pZHhdLnBlX2JudW0gPSBibnVtX2xlZnQ7CisJCXBwLT5wYl9wb2ludGVyW3BiX2lkeF0ucGVfbGluZV9jb3VudCA9IGxpbmVfY291bnRfbGVmdDsKKwkJcHAtPnBiX3BvaW50ZXJbcGJfaWR4XS5wZV9wYWdlX2NvdW50ID0gcGFnZV9jb3VudF9sZWZ0OworCQlpZiAobG51bV9sZWZ0KQorCQkgICAgcHAtPnBiX3BvaW50ZXJbcGJfaWR4XS5wZV9vbGRfbG51bSA9IGxudW1fbGVmdDsKKwkJbG51bV9sZWZ0ID0gMDsKKwkJbG51bV9yaWdodCA9IDA7CisKKwkJLyoKKwkJICogcmVjb21wdXRlIGxpbmUgY291bnRzCisJCSAqLworCQlsaW5lX2NvdW50X3JpZ2h0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IChpbnQpcHBfbmV3LT5wYl9jb3VudDsgKytpKQorCQkgICAgbGluZV9jb3VudF9yaWdodCArPSBwcF9uZXctPnBiX3BvaW50ZXJbaV0ucGVfbGluZV9jb3VudDsKKwkJbGluZV9jb3VudF9sZWZ0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IChpbnQpcHAtPnBiX2NvdW50OyArK2kpCisJCSAgICBsaW5lX2NvdW50X2xlZnQgKz0gcHAtPnBiX3BvaW50ZXJbaV0ucGVfbGluZV9jb3VudDsKKworCQlibnVtX2xlZnQgPSBocC0+YmhfYm51bTsKKwkJYm51bV9yaWdodCA9IGhwX25ldy0+YmhfYm51bTsKKwkJcGFnZV9jb3VudF9sZWZ0ID0gMTsKKwkJcGFnZV9jb3VudF9yaWdodCA9IDE7CisJCW1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7CisJCW1mX3B1dChtZnAsIGhwX25ldywgVFJVRSwgRkFMU0UpOworCSAgICB9CisJfQorCisJLyoKKwkgKiBTYWZldHkgY2hlY2s6IGZhbGxlbiBvdXQgb2YgZm9yIGxvb3A/CisJICovCisJaWYgKHN0YWNrX2lkeCA8IDApCisJeworCSAgICBFTVNHKF8oIkUzMTg6IFVwZGF0ZWQgdG9vIG1hbnkgYmxvY2tzPyIpKTsKKwkgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IDA7CS8qIGludmFsaWRhdGUgc3RhY2sgKi8KKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9CWVRFT0ZGCisgICAgLyogVGhlIGxpbmUgd2FzIGluc2VydGVkIGJlbG93ICdsbnVtJyAqLworICAgIG1sX3VwZGF0ZWNodW5rKGJ1ZiwgbG51bSArIDEsIChsb25nKWxlbiwgTUxfQ0hOS19BRERMSU5FKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIGlmICh1c2luZ05ldGJlYW5zKQorICAgIHsKKwlpZiAoU1RSTEVOKGxpbmUpID4gMCkKKwkgICAgbmV0YmVhbnNfaW5zZXJ0ZWQoYnVmLCBsbnVtKzEsIChjb2xucl9UKTAsIDAsIGxpbmUsIFNUUkxFTihsaW5lKSk7CisJbmV0YmVhbnNfaW5zZXJ0ZWQoYnVmLCBsbnVtKzEsIChjb2xucl9UKVNUUkxFTihsaW5lKSwgMCwKKwkJCQkJCQkgICAoY2hhcl91ICopIlxuIiwgMSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogcmVwbGFjZSBsaW5lIGxudW0sIHdpdGggYnVmZmVyaW5nLCBpbiBjdXJyZW50IGJ1ZmZlcgorICoKKyAqIElmIGNvcHkgaXMgVFJVRSwgbWFrZSBhIGNvcHkgb2YgdGhlIGxpbmUsIG90aGVyd2lzZSB0aGUgbGluZSBoYXMgYmVlbgorICogY29waWVkIHRvIGFsbG9jYXRlZCBtZW1vcnkgYWxyZWFkeS4KKyAqCisgKiBDaGVjazogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBhbHNvIGNhbGwKKyAqIGNoYW5nZWRfbGluZXMoKSwgdW5sZXNzIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKSBpcyB1c2VkLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWxfcmVwbGFjZShsbnVtLCBsaW5lLCBjb3B5KQorICAgIGxpbmVucl9UCWxudW07CisgICAgY2hhcl91CSpsaW5lOworICAgIGludAkJY29weTsKK3sKKyAgICBpZiAobGluZSA9PSBOVUxMKQkJLyoganVzdCBjaGVja2luZy4uLiAqLworCXJldHVybiBGQUlMOworCisgICAgLyogV2hlbiBzdGFydGluZyB1cCwgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBjcmVhdGUgdGhlIG1lbWZpbGUgKi8KKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMICYmIG9wZW5fYnVmZmVyKEZBTFNFLCBOVUxMKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgaWYgKGNvcHkgJiYgKGxpbmUgPSB2aW1fc3Ryc2F2ZShsaW5lKSkgPT0gTlVMTCkgLyogYWxsb2NhdGUgbWVtb3J5ICovCisJcmV0dXJuIEZBSUw7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKHVzaW5nTmV0YmVhbnMpCisgICAgeworCW5ldGJlYW5zX3JlbW92ZWQoY3VyYnVmLCBsbnVtLCAwLCAobG9uZylTVFJMRU4obWxfZ2V0KGxudW0pKSk7CisJbmV0YmVhbnNfaW5zZXJ0ZWQoY3VyYnVmLCBsbnVtLCAwLCAwLCBsaW5lLCBTVFJMRU4obGluZSkpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChjdXJidWYtPmJfbWwubWxfbGluZV9sbnVtICE9IGxudW0pCSAgICAvKiBvdGhlciBsaW5lIGJ1ZmZlcmVkICovCisJbWxfZmx1c2hfbGluZShjdXJidWYpOwkJCSAgICAvKiBmbHVzaCBpdCAqLworICAgIGVsc2UgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0xJTkVfRElSVFkpIC8qIHNhbWUgbGluZSBhbGxvY2F0ZWQgKi8KKwl2aW1fZnJlZShjdXJidWYtPmJfbWwubWxfbGluZV9wdHIpOwkgICAgLyogZnJlZSBpdCAqLworICAgIGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX3B0ciA9IGxpbmU7CisgICAgY3VyYnVmLT5iX21sLm1sX2xpbmVfbG51bSA9IGxudW07CisgICAgY3VyYnVmLT5iX21sLm1sX2ZsYWdzID0gKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyB8IE1MX0xJTkVfRElSVFkpICYgfk1MX0VNUFRZOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogZGVsZXRlIGxpbmUgJ2xudW0nCisgKgorICogQ2hlY2s6IFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYWxzbyBjYWxsCisgKiBkZWxldGVkX2xpbmVzKCkgYWZ0ZXIgdGhpcy4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21sX2RlbGV0ZShsbnVtLCBtZXNzYWdlKQorICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQltZXNzYWdlOworeworICAgIG1sX2ZsdXNoX2xpbmUoY3VyYnVmKTsKKyAgICByZXR1cm4gbWxfZGVsZXRlX2ludChjdXJidWYsIGxudW0sIG1lc3NhZ2UpOworfQorCisgICAgc3RhdGljIGludAorbWxfZGVsZXRlX2ludChidWYsIGxudW0sIG1lc3NhZ2UpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJbWVzc2FnZTsKK3sKKyAgICBiaGRyX1QJKmhwOworICAgIG1lbWZpbGVfVAkqbWZwOworICAgIERBVEFfQkwJKmRwOworICAgIFBUUl9CTAkqcHA7CisgICAgaW5mb3B0cl9UCSppcDsKKyAgICBpbnQJCWNvdW50OwkgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gYmxvY2sgKi8KKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCXN0YWNrX2lkeDsKKyAgICBpbnQJCXRleHRfc3RhcnQ7CisgICAgaW50CQlsaW5lX3N0YXJ0OworICAgIGxvbmcJbGluZV9zaXplOworICAgIGludAkJaTsKKworICAgIGlmIChsbnVtIDwgMSB8fCBsbnVtID4gYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJcmV0dXJuIEZBSUw7CisKKyAgICBpZiAobG93ZXN0X21hcmtlZCAmJiBsb3dlc3RfbWFya2VkID4gbG51bSkKKwlsb3dlc3RfbWFya2VkLS07CisKKy8qCisgKiBJZiB0aGUgZmlsZSBiZWNvbWVzIGVtcHR5IHRoZSBsYXN0IGxpbmUgaXMgcmVwbGFjZWQgYnkgYW4gZW1wdHkgbGluZS4KKyAqLworICAgIGlmIChidWYtPmJfbWwubWxfbGluZV9jb3VudCA9PSAxKQkgICAgLyogZmlsZSBiZWNvbWVzIGVtcHR5ICovCisgICAgeworCWlmIChtZXNzYWdlCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJCSYmICFuZXRiZWFuc1N1cHByZXNzTm9MaW5lcworI2VuZGlmCisJICAgKQorCXsKKwkgICAgc2V0X2tlZXBfbXNnKChjaGFyX3UgKilfKG5vX2xpbmVzX21zZykpOworCSAgICBrZWVwX21zZ19hdHRyID0gMDsKKwl9CisJLyogRkVBVF9CWVRFT0ZGIGFscmVhZHkgaGFuZGxlZCBpbiB0aGVyZSwgZG9udCB3b3JyeSAnYm91dCBpdCBiZWxvdyAqLworCWkgPSBtbF9yZXBsYWNlKChsaW5lbnJfVCkxLCAoY2hhcl91ICopIiIsIFRSVUUpOworCWJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9FTVBUWTsKKworCXJldHVybiBpOworICAgIH0KKworLyoKKyAqIGZpbmQgdGhlIGRhdGEgYmxvY2sgY29udGFpbmluZyB0aGUgbGluZQorICogVGhpcyBhbHNvIGZpbGxzIHRoZSBzdGFjayB3aXRoIHRoZSBibG9ja3MgZnJvbSB0aGUgcm9vdCB0byB0aGUgZGF0YSBibG9jaworICogVGhpcyBhbHNvIHJlbGVhc2VzIGFueSBsb2NrZWQgYmxvY2suCisgKi8KKyAgICBtZnAgPSBidWYtPmJfbWwubWxfbWZwOworICAgIGlmIChtZnAgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGlmICgoaHAgPSBtbF9maW5kX2xpbmUoYnVmLCBsbnVtLCBNTF9ERUxFVEUpKSA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisgICAgLyogY29tcHV0ZSBsaW5lIGNvdW50IGJlZm9yZSB0aGUgZGVsZXRlICovCisgICAgY291bnQgPSAobG9uZykoYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoKQorCQkJCQktIChsb25nKShidWYtPmJfbWwubWxfbG9ja2VkX2xvdykgKyAyOworICAgIGlkeCA9IGxudW0gLSBidWYtPmJfbWwubWxfbG9ja2VkX2xvdzsKKworICAgIC0tYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisKKyAgICBsaW5lX3N0YXJ0ID0gKChkcC0+ZGJfaW5kZXhbaWR4XSkgJiBEQl9JTkRFWF9NQVNLKTsKKyAgICBpZiAoaWR4ID09IDApCQkvKiBmaXJzdCBsaW5lIGluIGJsb2NrLCB0ZXh0IGF0IHRoZSBlbmQgKi8KKwlsaW5lX3NpemUgPSBkcC0+ZGJfdHh0X2VuZCAtIGxpbmVfc3RhcnQ7CisgICAgZWxzZQorCWxpbmVfc2l6ZSA9ICgoZHAtPmRiX2luZGV4W2lkeCAtIDFdKSAmIERCX0lOREVYX01BU0spIC0gbGluZV9zdGFydDsKKworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIGlmICh1c2luZ05ldGJlYW5zKQorCW5ldGJlYW5zX3JlbW92ZWQoYnVmLCBsbnVtLCAwLCBsaW5lX3NpemUpOworI2VuZGlmCisKKy8qCisgKiBzcGVjaWFsIGNhc2U6IElmIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgaW4gdGhlIGRhdGEgYmxvY2sgaXQgYmVjb21lcyBlbXB0eS4KKyAqIFRoZW4gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGVudHJ5LCBwb2ludGluZyB0byB0aGlzIGRhdGEgYmxvY2ssIGZyb20gdGhlCisgKiBwb2ludGVyIGJsb2NrLiBJZiB0aGlzIHBvaW50ZXIgYmxvY2sgYWxzbyBiZWNvbWVzIGVtcHR5LCB3ZSBnbyB1cCBhbm90aGVyCisgKiBibG9jaywgYW5kIHNvIG9uLCB1cCB0byB0aGUgcm9vdCBpZiBuZWNlc3NhcnkuCisgKiBUaGUgbGluZSBjb3VudHMgaW4gdGhlIHBvaW50ZXIgYmxvY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkIGJ5CisgKiBtbF9maW5kX2xpbmUoKS4KKyAqLworICAgIGlmIChjb3VudCA9PSAxKQorICAgIHsKKwltZl9mcmVlKG1mcCwgaHApOwkvKiBmcmVlIHRoZSBkYXRhIGJsb2NrICovCisJYnVmLT5iX21sLm1sX2xvY2tlZCA9IE5VTEw7CisKKwlmb3IgKHN0YWNrX2lkeCA9IGJ1Zi0+Yl9tbC5tbF9zdGFja190b3AgLSAxOyBzdGFja19pZHggPj0gMDsgLS1zdGFja19pZHgpCisJeworCSAgICBidWYtPmJfbWwubWxfc3RhY2tfdG9wID0gMDsJICAgIC8qIHN0YWNrIGlzIGludmFsaWQgd2hlbiBmYWlsaW5nICovCisJICAgIGlwID0gJihidWYtPmJfbWwubWxfc3RhY2tbc3RhY2tfaWR4XSk7CisJICAgIGlkeCA9IGlwLT5pcF9pbmRleDsKKwkgICAgaWYgKChocCA9IG1mX2dldChtZnAsIGlwLT5pcF9ibnVtLCAxKSkgPT0gTlVMTCkKKwkJcmV0dXJuIEZBSUw7CisJICAgIHBwID0gKFBUUl9CTCAqKShocC0+YmhfZGF0YSk7ICAgLyogbXVzdCBiZSBwb2ludGVyIGJsb2NrICovCisJICAgIGlmIChwcC0+cGJfaWQgIT0gUFRSX0lEKQorCSAgICB7CisJCUVNU0coXygiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IikpOworCQltZl9wdXQobWZwLCBocCwgRkFMU0UsIEZBTFNFKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgY291bnQgPSAtLShwcC0+cGJfY291bnQpOworCSAgICBpZiAoY291bnQgPT0gMCkJICAgIC8qIHRoZSBwb2ludGVyIGJsb2NrIGJlY29tZXMgZW1wdHkhICovCisJCW1mX2ZyZWUobWZwLCBocCk7CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoY291bnQgIT0gaWR4KQkvKiBtb3ZlIGVudHJpZXMgYWZ0ZXIgdGhlIGRlbGV0ZWQgb25lICovCisJCSAgICBtY2hfbWVtbW92ZSgmcHAtPnBiX3BvaW50ZXJbaWR4XSwgJnBwLT5wYl9wb2ludGVyW2lkeCArIDFdLAorCQkJCSAgICAgIChzaXplX3QpKGNvdW50IC0gaWR4KSAqIHNpemVvZihQVFJfRU4pKTsKKwkJbWZfcHV0KG1mcCwgaHAsIFRSVUUsIEZBTFNFKTsKKworCQlidWYtPmJfbWwubWxfc3RhY2tfdG9wID0gc3RhY2tfaWR4OwkvKiB0cnVuY2F0ZSBzdGFjayAqLworCQkgICAgLyogZml4IGxpbmUgY291bnQgZm9yIHJlc3Qgb2YgYmxvY2tzIGluIHRoZSBzdGFjayAqLworCQlpZiAoYnVmLT5iX21sLm1sX2xvY2tlZF9saW5lYWRkKQorCQl7CisJCSAgICBtbF9saW5lYWRkKGJ1ZiwgYnVmLT5iX21sLm1sX2xvY2tlZF9saW5lYWRkKTsKKwkJICAgIGJ1Zi0+Yl9tbC5tbF9zdGFja1tidWYtPmJfbWwubWxfc3RhY2tfdG9wXS5pcF9oaWdoICs9CisJCQkJCQlidWYtPmJfbWwubWxfbG9ja2VkX2xpbmVhZGQ7CisJCX0KKwkJKysoYnVmLT5iX21sLm1sX3N0YWNrX3RvcCk7CisKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJQ0hFQ0soc3RhY2tfaWR4IDwgMCwgXygiZGVsZXRlZCBibG9jayAxPyIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIGRlbGV0ZSB0aGUgdGV4dCBieSBtb3ZpbmcgdGhlIG5leHQgbGluZXMgZm9yd2FyZHMKKwkgKi8KKwl0ZXh0X3N0YXJ0ID0gZHAtPmRiX3R4dF9zdGFydDsKKwltY2hfbWVtbW92ZSgoY2hhciAqKWRwICsgdGV4dF9zdGFydCArIGxpbmVfc2l6ZSwKKwkJICAoY2hhciAqKWRwICsgdGV4dF9zdGFydCwgKHNpemVfdCkobGluZV9zdGFydCAtIHRleHRfc3RhcnQpKTsKKworCS8qCisJICogZGVsZXRlIHRoZSBpbmRleCBieSBtb3ZpbmcgdGhlIG5leHQgaW5kZXhlcyBiYWNrd2FyZHMKKwkgKiBBZGp1c3QgdGhlIGluZGV4ZXMgZm9yIHRoZSB0ZXh0IG1vdmVtZW50LgorCSAqLworCWZvciAoaSA9IGlkeDsgaSA8IGNvdW50IC0gMTsgKytpKQorCSAgICBkcC0+ZGJfaW5kZXhbaV0gPSBkcC0+ZGJfaW5kZXhbaSArIDFdICsgbGluZV9zaXplOworCisJZHAtPmRiX2ZyZWUgKz0gbGluZV9zaXplICsgSU5ERVhfU0laRTsKKwlkcC0+ZGJfdHh0X3N0YXJ0ICs9IGxpbmVfc2l6ZTsKKwktLShkcC0+ZGJfbGluZV9jb3VudCk7CisKKwkvKgorCSAqIG1hcmsgdGhlIGJsb2NrIGRpcnR5IGFuZCBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGZpbGUgKGZvciByZWNvdmVyeSkKKwkgKi8KKwlidWYtPmJfbWwubWxfZmxhZ3MgfD0gKE1MX0xPQ0tFRF9ESVJUWSB8IE1MX0xPQ0tFRF9QT1MpOworICAgIH0KKworI2lmZGVmIEZFQVRfQllURU9GRgorICAgIG1sX3VwZGF0ZWNodW5rKGJ1ZiwgbG51bSwgbGluZV9zaXplLCBNTF9DSE5LX0RFTExJTkUpOworI2VuZGlmCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogc2V0IHRoZSBCX01BUktFRCBmbGFnIGZvciBsaW5lICdsbnVtJworICovCisgICAgdm9pZAorbWxfc2V0bWFya2VkKGxudW0pCisgICAgbGluZW5yX1QgbG51bTsKK3sKKyAgICBiaGRyX1QgICAgKmhwOworICAgIERBVEFfQkwgKmRwOworCQkJCSAgICAvKiBpbnZhbGlkIGxpbmUgbnVtYmVyICovCisgICAgaWYgKGxudW0gPCAxIHx8IGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCQkJCQkgICAgICAgfHwgY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKQorCXJldHVybjsJCQkgICAgLyogZ2l2ZSBlcnJvciBtZXNzYWdlPyAqLworCisgICAgaWYgKGxvd2VzdF9tYXJrZWQgPT0gMCB8fCBsb3dlc3RfbWFya2VkID4gbG51bSkKKwlsb3dlc3RfbWFya2VkID0gbG51bTsKKworICAgIC8qCisgICAgICogZmluZCB0aGUgZGF0YSBibG9jayBjb250YWluaW5nIHRoZSBsaW5lCisgICAgICogVGhpcyBhbHNvIGZpbGxzIHRoZSBzdGFjayB3aXRoIHRoZSBibG9ja3MgZnJvbSB0aGUgcm9vdCB0byB0aGUgZGF0YSBibG9jaworICAgICAqIFRoaXMgYWxzbyByZWxlYXNlcyBhbnkgbG9ja2VkIGJsb2NrLgorICAgICAqLworICAgIGlmICgoaHAgPSBtbF9maW5kX2xpbmUoY3VyYnVmLCBsbnVtLCBNTF9GSU5EKSkgPT0gTlVMTCkKKwlyZXR1cm47CQkgICAgLyogZ2l2ZSBlcnJvciBtZXNzYWdlPyAqLworCisgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisgICAgZHAtPmRiX2luZGV4W2xudW0gLSBjdXJidWYtPmJfbWwubWxfbG9ja2VkX2xvd10gfD0gREJfTUFSS0VEOworICAgIGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9MT0NLRURfRElSVFk7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBmaXJzdCBsaW5lIHdpdGggaXRzIEJfTUFSS0VEIGZsYWcgc2V0CisgKi8KKyAgICBsaW5lbnJfVAorbWxfZmlyc3RtYXJrZWQoKQoreworICAgIGJoZHJfVAkqaHA7CisgICAgREFUQV9CTAkqZHA7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKQorCXJldHVybiAobGluZW5yX1QpIDA7CisKKyAgICAvKgorICAgICAqIFRoZSBzZWFyY2ggc3RhcnRzIHdpdGggbG93ZXN0X21hcmtlZCBsaW5lLiBUaGlzIGlzIHRoZSBsYXN0IGxpbmUgd2hlcmUKKyAgICAgKiBhIG1hcmsgd2FzIGZvdW5kLCBhZGp1c3RlZCBieSBpbnNlcnRpbmcvZGVsZXRpbmcgbGluZXMuCisgICAgICovCisgICAgZm9yIChsbnVtID0gbG93ZXN0X21hcmtlZDsgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsgKQorICAgIHsKKwkvKgorCSAqIEZpbmQgdGhlIGRhdGEgYmxvY2sgY29udGFpbmluZyB0aGUgbGluZS4KKwkgKiBUaGlzIGFsc28gZmlsbHMgdGhlIHN0YWNrIHdpdGggdGhlIGJsb2NrcyBmcm9tIHRoZSByb290IHRvIHRoZSBkYXRhCisJICogYmxvY2sgVGhpcyBhbHNvIHJlbGVhc2VzIGFueSBsb2NrZWQgYmxvY2suCisJICovCisJaWYgKChocCA9IG1sX2ZpbmRfbGluZShjdXJidWYsIGxudW0sIE1MX0ZJTkQpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gKGxpbmVucl9UKTA7CQkgICAgLyogZ2l2ZSBlcnJvciBtZXNzYWdlPyAqLworCisJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisKKwlmb3IgKGkgPSBsbnVtIC0gY3VyYnVmLT5iX21sLm1sX2xvY2tlZF9sb3c7CisJCQkgICAgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbG9ja2VkX2hpZ2g7ICsraSwgKytsbnVtKQorCSAgICBpZiAoKGRwLT5kYl9pbmRleFtpXSkgJiBEQl9NQVJLRUQpCisJICAgIHsKKwkJKGRwLT5kYl9pbmRleFtpXSkgJj0gREJfSU5ERVhfTUFTSzsKKwkJY3VyYnVmLT5iX21sLm1sX2ZsYWdzIHw9IE1MX0xPQ0tFRF9ESVJUWTsKKwkJbG93ZXN0X21hcmtlZCA9IGxudW0gKyAxOworCQlyZXR1cm4gbG51bTsKKwkgICAgfQorICAgIH0KKworICAgIHJldHVybiAobGluZW5yX1QpIDA7Cit9CisKKyNpZiAwICAvKiBub3QgdXNlZCAqLworLyoKKyAqIHJldHVybiBUUlVFIGlmIGxpbmUgJ2xudW0nIGhhcyBhIG1hcmsKKyAqLworICAgIGludAorbWxfaGFzX21hcmsobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGJoZHJfVAkqaHA7CisgICAgREFUQV9CTAkqZHA7CisKKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMCisJCQl8fCAoaHAgPSBtbF9maW5kX2xpbmUoY3VyYnVmLCBsbnVtLCBNTF9GSU5EKSkgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBkcCA9IChEQVRBX0JMICopKGhwLT5iaF9kYXRhKTsKKyAgICByZXR1cm4gKGludCkoKGRwLT5kYl9pbmRleFtsbnVtIC0gY3VyYnVmLT5iX21sLm1sX2xvY2tlZF9sb3ddKSAmIERCX01BUktFRCk7Cit9CisjZW5kaWYKKworLyoKKyAqIGNsZWFyIGFsbCBEQl9NQVJLRUQgZmxhZ3MKKyAqLworICAgIHZvaWQKK21sX2NsZWFybWFya2VkKCkKK3sKKyAgICBiaGRyX1QJKmhwOworICAgIERBVEFfQkwJKmRwOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlpOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgPT0gTlVMTCkJICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIFRoZSBzZWFyY2ggc3RhcnRzIHdpdGggbGluZSBsb3dlc3RfbWFya2VkLgorICAgICAqLworICAgIGZvciAobG51bSA9IGxvd2VzdF9tYXJrZWQ7IGxudW0gPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7ICkKKyAgICB7CisJLyoKKwkgKiBGaW5kIHRoZSBkYXRhIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGxpbmUuCisJICogVGhpcyBhbHNvIGZpbGxzIHRoZSBzdGFjayB3aXRoIHRoZSBibG9ja3MgZnJvbSB0aGUgcm9vdCB0byB0aGUgZGF0YQorCSAqIGJsb2NrIGFuZCByZWxlYXNlcyBhbnkgbG9ja2VkIGJsb2NrLgorCSAqLworCWlmICgoaHAgPSBtbF9maW5kX2xpbmUoY3VyYnVmLCBsbnVtLCBNTF9GSU5EKSkgPT0gTlVMTCkKKwkgICAgcmV0dXJuOwkJLyogZ2l2ZSBlcnJvciBtZXNzYWdlPyAqLworCisJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisKKwlmb3IgKGkgPSBsbnVtIC0gY3VyYnVmLT5iX21sLm1sX2xvY2tlZF9sb3c7CisJCQkgICAgbG51bSA8PSBjdXJidWYtPmJfbWwubWxfbG9ja2VkX2hpZ2g7ICsraSwgKytsbnVtKQorCSAgICBpZiAoKGRwLT5kYl9pbmRleFtpXSkgJiBEQl9NQVJLRUQpCisJICAgIHsKKwkJKGRwLT5kYl9pbmRleFtpXSkgJj0gREJfSU5ERVhfTUFTSzsKKwkJY3VyYnVmLT5iX21sLm1sX2ZsYWdzIHw9IE1MX0xPQ0tFRF9ESVJUWTsKKwkgICAgfQorICAgIH0KKworICAgIGxvd2VzdF9tYXJrZWQgPSAwOworICAgIHJldHVybjsKK30KKworLyoKKyAqIGZsdXNoIG1sX2xpbmUgaWYgbmVjZXNzYXJ5CisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWxfZmx1c2hfbGluZShidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBiaGRyX1QJKmhwOworICAgIERBVEFfQkwJKmRwOworICAgIGxpbmVucl9UCWxudW07CisgICAgY2hhcl91CSpuZXdfbGluZTsKKyAgICBjaGFyX3UJKm9sZF9saW5lOworICAgIGNvbG5yX1QJbmV3X2xlbjsKKyAgICBpbnQJCW9sZF9sZW47CisgICAgaW50CQlleHRyYTsKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCXN0YXJ0OworICAgIGludAkJY291bnQ7CisgICAgaW50CQlpOworCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gPT0gMCB8fCBidWYtPmJfbWwubWxfbWZwID09IE5VTEwpCisJcmV0dXJuOwkJLyogbm90aGluZyB0byBkbyAqLworCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0xJTkVfRElSVFkpCisgICAgeworCWxudW0gPSBidWYtPmJfbWwubWxfbGluZV9sbnVtOworCW5ld19saW5lID0gYnVmLT5iX21sLm1sX2xpbmVfcHRyOworCisJaHAgPSBtbF9maW5kX2xpbmUoYnVmLCBsbnVtLCBNTF9GSU5EKTsKKwlpZiAoaHAgPT0gTlVMTCkKKwkgICAgRU1TR04oXygiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiKSwgbG51bSk7CisJZWxzZQorCXsKKwkgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisJICAgIGlkeCA9IGxudW0gLSBidWYtPmJfbWwubWxfbG9ja2VkX2xvdzsKKwkgICAgc3RhcnQgPSAoKGRwLT5kYl9pbmRleFtpZHhdKSAmIERCX0lOREVYX01BU0spOworCSAgICBvbGRfbGluZSA9IChjaGFyX3UgKilkcCArIHN0YXJ0OworCSAgICBpZiAoaWR4ID09IDApCS8qIGxpbmUgaXMgbGFzdCBpbiBibG9jayAqLworCQlvbGRfbGVuID0gZHAtPmRiX3R4dF9lbmQgLSBzdGFydDsKKwkgICAgZWxzZQkJLyogdGV4dCBvZiBwcmV2aW91cyBsaW5lIGZvbGxvd3MgKi8KKwkJb2xkX2xlbiA9IChkcC0+ZGJfaW5kZXhbaWR4IC0gMV0gJiBEQl9JTkRFWF9NQVNLKSAtIHN0YXJ0OworCSAgICBuZXdfbGVuID0gKGNvbG5yX1QpU1RSTEVOKG5ld19saW5lKSArIDE7CisJICAgIGV4dHJhID0gbmV3X2xlbiAtIG9sZF9sZW47CSAgICAvKiBuZWdhdGl2ZSBpZiBsaW5lcyBnZXRzIHNtYWxsZXIgKi8KKworCSAgICAvKgorCSAgICAgKiBpZiBuZXcgbGluZSBmaXRzIGluIGRhdGEgYmxvY2ssIHJlcGxhY2UgZGlyZWN0bHkKKwkgICAgICovCisJICAgIGlmICgoaW50KWRwLT5kYl9mcmVlID49IGV4dHJhKQorCSAgICB7CisJCS8qIGlmIHRoZSBsZW5ndGggY2hhbmdlcyBhbmQgdGhlcmUgYXJlIGZvbGxvd2luZyBsaW5lcyAqLworCQljb3VudCA9IGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfaGlnaCAtIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93ICsgMTsKKwkJaWYgKGV4dHJhICE9IDAgJiYgaWR4IDwgY291bnQgLSAxKQorCQl7CisJCSAgICAvKiBtb3ZlIHRleHQgb2YgZm9sbG93aW5nIGxpbmVzICovCisJCSAgICBtY2hfbWVtbW92ZSgoY2hhciAqKWRwICsgZHAtPmRiX3R4dF9zdGFydCAtIGV4dHJhLAorCQkJCShjaGFyICopZHAgKyBkcC0+ZGJfdHh0X3N0YXJ0LAorCQkJCShzaXplX3QpKHN0YXJ0IC0gZHAtPmRiX3R4dF9zdGFydCkpOworCisJCSAgICAvKiBhZGp1c3QgcG9pbnRlcnMgb2YgdGhpcyBhbmQgZm9sbG93aW5nIGxpbmVzICovCisJCSAgICBmb3IgKGkgPSBpZHggKyAxOyBpIDwgY291bnQ7ICsraSkKKwkJCWRwLT5kYl9pbmRleFtpXSAtPSBleHRyYTsKKwkJfQorCQlkcC0+ZGJfaW5kZXhbaWR4XSAtPSBleHRyYTsKKworCQkvKiBhZGp1c3QgZnJlZSBzcGFjZSAqLworCQlkcC0+ZGJfZnJlZSAtPSBleHRyYTsKKwkJZHAtPmRiX3R4dF9zdGFydCAtPSBleHRyYTsKKworCQkvKiBjb3B5IG5ldyBsaW5lIGludG8gdGhlIGRhdGEgYmxvY2sgKi8KKwkJbWNoX21lbW1vdmUob2xkX2xpbmUgLSBleHRyYSwgbmV3X2xpbmUsIChzaXplX3QpbmV3X2xlbik7CisJCWJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSAoTUxfTE9DS0VEX0RJUlRZIHwgTUxfTE9DS0VEX1BPUyk7CisjaWZkZWYgRkVBVF9CWVRFT0ZGCisJCS8qIFRoZSBlbHNlIGNhc2UgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRoZSBpbnNlcnQgYW5kIGRlbGV0ZSAqLworCQltbF91cGRhdGVjaHVuayhidWYsIGxudW0sIChsb25nKWV4dHJhLCBNTF9DSE5LX1VQRExJTkUpOworI2VuZGlmCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qCisJCSAqIENhbm5vdCBkbyBpdCBpbiBvbmUgZGF0YSBibG9jazogRGVsZXRlIGFuZCBhcHBlbmQuCisJCSAqIEFwcGVuZCBmaXJzdCwgYmVjYXVzZSBtbF9kZWxldGVfaW50KCkgY2Fubm90IGRlbGV0ZSB0aGUKKwkJICogbGFzdCBsaW5lIGluIGEgYnVmZmVyLCB3aGljaCBjYXVzZXMgdHJvdWJsZSBmb3IgYSBidWZmZXIKKwkJICogdGhhdCBoYXMgb25seSBvbmUgbGluZS4KKwkJICogRG9uJ3QgZm9yZ2V0IHRvIGNvcHkgdGhlIG1hcmshCisJCSAqLworCQkvKiBIb3cgYWJvdXQgaGFuZGxpbmcgZXJyb3JzPz8/ICovCisJCSh2b2lkKW1sX2FwcGVuZF9pbnQoYnVmLCBsbnVtLCBuZXdfbGluZSwgbmV3X2xlbiwgRkFMU0UsCisJCQkJCSAgICAgKGRwLT5kYl9pbmRleFtpZHhdICYgREJfTUFSS0VEKSk7CisJCSh2b2lkKW1sX2RlbGV0ZV9pbnQoYnVmLCBsbnVtLCBGQUxTRSk7CisJICAgIH0KKwl9CisJdmltX2ZyZWUobmV3X2xpbmUpOworICAgIH0KKworICAgIGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gPSAwOworfQorCisvKgorICogY3JlYXRlIGEgbmV3LCBlbXB0eSwgZGF0YSBibG9jaworICovCisgICAgc3RhdGljIGJoZHJfVCAqCittbF9uZXdfZGF0YShtZnAsIG5lZ2F0aXZlLCBwYWdlX2NvdW50KQorICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGludAkJbmVnYXRpdmU7CisgICAgaW50CQlwYWdlX2NvdW50OworeworICAgIGJoZHJfVAkqaHA7CisgICAgREFUQV9CTAkqZHA7CisKKyAgICBpZiAoKGhwID0gbWZfbmV3KG1mcCwgbmVnYXRpdmUsIHBhZ2VfY291bnQpKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisgICAgZHAtPmRiX2lkID0gREFUQV9JRDsKKyAgICBkcC0+ZGJfdHh0X3N0YXJ0ID0gZHAtPmRiX3R4dF9lbmQgPSBwYWdlX2NvdW50ICogbWZwLT5tZl9wYWdlX3NpemU7CisgICAgZHAtPmRiX2ZyZWUgPSBkcC0+ZGJfdHh0X3N0YXJ0IC0gSEVBREVSX1NJWkU7CisgICAgZHAtPmRiX2xpbmVfY291bnQgPSAwOworCisgICAgcmV0dXJuIGhwOworfQorCisvKgorICogY3JlYXRlIGEgbmV3LCBlbXB0eSwgcG9pbnRlciBibG9jaworICovCisgICAgc3RhdGljIGJoZHJfVCAqCittbF9uZXdfcHRyKG1mcCkKKyAgICBtZW1maWxlX1QJKm1mcDsKK3sKKyAgICBiaGRyX1QJKmhwOworICAgIFBUUl9CTAkqcHA7CisKKyAgICBpZiAoKGhwID0gbWZfbmV3KG1mcCwgRkFMU0UsIDEpKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgcHAgPSAoUFRSX0JMICopKGhwLT5iaF9kYXRhKTsKKyAgICBwcC0+cGJfaWQgPSBQVFJfSUQ7CisgICAgcHAtPnBiX2NvdW50ID0gMDsKKyAgICBwcC0+cGJfY291bnRfbWF4ID0gKHNob3J0X3UpKChtZnAtPm1mX3BhZ2Vfc2l6ZSAtIHNpemVvZihQVFJfQkwpKSAvIHNpemVvZihQVFJfRU4pICsgMSk7CisKKyAgICByZXR1cm4gaHA7Cit9CisKKy8qCisgKiBsb29rdXAgbGluZSAnbG51bScgaW4gYSBtZW1saW5lCisgKgorICogICBhY3Rpb246IGlmIE1MX0RFTEVURSBvciBNTF9JTlNFUlQgdGhlIGxpbmUgY291bnQgaXMgdXBkYXRlZCB3aGlsZSBzZWFyY2hpbmcKKyAqCSAgICAgaWYgTUxfRkxVU0ggb25seSBmbHVzaCBhIGxvY2tlZCBibG9jaworICoJICAgICBpZiBNTF9GSU5EIGp1c3QgZmluZCB0aGUgbGluZQorICoKKyAqIElmIHRoZSBibG9jayB3YXMgZm91bmQgaXQgaXMgbG9ja2VkIGFuZCBwdXQgaW4gbWxfbG9ja2VkLgorICogVGhlIHN0YWNrIGlzIHVwZGF0ZWQgdG8gbGVhZCB0byB0aGUgbG9ja2VkIGJsb2NrLiBUaGUgaXBfaGlnaCBmaWVsZCBpbgorICogdGhlIHN0YWNrIGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbGFzdCBsaW5lIGluIHRoZSBibG9jayBBRlRFUiB0aGUKKyAqIGluc2VydCBvciBkZWxldGUsIGFsc28gaWYgdGhlIHBvaW50ZXIgYmxvY2sgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgeWV0LiBCdXQKKyAqIGlmIGlmIG1sX2xvY2tlZCAhPSBOVUxMIG1sX2xvY2tlZF9saW5lYWRkIG11c3QgYmUgYWRkZWQgdG8gaXBfaGlnaC4KKyAqCisgKiByZXR1cm46IE5VTEwgZm9yIGZhaWx1cmUsIHBvaW50ZXIgdG8gYmxvY2sgaGVhZGVyIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGJoZHJfVCAqCittbF9maW5kX2xpbmUoYnVmLCBsbnVtLCBhY3Rpb24pCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJYWN0aW9uOworeworICAgIERBVEFfQkwJKmRwOworICAgIFBUUl9CTAkqcHA7CisgICAgaW5mb3B0cl9UCSppcDsKKyAgICBiaGRyX1QJKmhwOworICAgIG1lbWZpbGVfVAkqbWZwOworICAgIGxpbmVucl9UCXQ7CisgICAgYmxvY2tucl9UCWJudW0sIGJudW0yOworICAgIGludAkJZGlydHk7CisgICAgbGluZW5yX1QJbG93LCBoaWdoOworICAgIGludAkJdG9wOworICAgIGludAkJcGFnZV9jb3VudDsKKyAgICBpbnQJCWlkeDsKKworICAgIG1mcCA9IGJ1Zi0+Yl9tbC5tbF9tZnA7CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGlzIGEgbG9ja2VkIGJsb2NrIGNoZWNrIGlmIHRoZSB3YW50ZWQgbGluZSBpcyBpbiBpdC4KKyAgICAgKiBJZiBub3QsIGZsdXNoIGFuZCByZWxlYXNlIHRoZSBsb2NrZWQgYmxvY2suCisgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgTUxfSU5TRVJUX1NBTUUsIGJlY2F1c2UgdGhlIHN0YWNrIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciBNTF9GTFVTSCwgYmVjYXVzZSB3ZSB3YW50IHRvIGZsdXNoIHRoZSBsb2NrZWQgYmxvY2suCisgICAgICovCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9sb2NrZWQpCisgICAgeworCWlmIChNTF9TSU1QTEUoYWN0aW9uKSAmJiBidWYtPmJfbWwubWxfbG9ja2VkX2xvdyA8PSBsbnVtCisJCQkJCSAgJiYgYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoID49IGxudW0pCisJeworCQkvKiByZW1lbWJlciB0byB1cGRhdGUgcG9pbnRlciBibG9ja3MgYW5kIHN0YWNrIGxhdGVyICovCisJICAgIGlmIChhY3Rpb24gPT0gTUxfSU5TRVJUKQorCSAgICB7CisJCSsrKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbGluZWFkZCk7CisJCSsrKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfaGlnaCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYWN0aW9uID09IE1MX0RFTEVURSkKKwkgICAgeworCQktLShidWYtPmJfbWwubWxfbG9ja2VkX2xpbmVhZGQpOworCQktLShidWYtPmJfbWwubWxfbG9ja2VkX2hpZ2gpOworCSAgICB9CisJICAgIHJldHVybiAoYnVmLT5iX21sLm1sX2xvY2tlZCk7CisJfQorCisJbWZfcHV0KG1mcCwgYnVmLT5iX21sLm1sX2xvY2tlZCwgYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfTE9DS0VEX0RJUlRZLAorCQkJCQkgICAgYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfTE9DS0VEX1BPUyk7CisJYnVmLT5iX21sLm1sX2xvY2tlZCA9IE5VTEw7CisKKwkgICAgLyoKKwkgICAgICogaWYgbGluZXMgaGF2ZSBiZWVuIGFkZGVkIG9yIGRlbGV0ZWQgaW4gdGhlIGxvY2tlZCBibG9jaywgbmVlZCB0bworCSAgICAgKiB1cGRhdGUgdGhlIGxpbmUgY291bnQgaW4gcG9pbnRlciBibG9ja3MKKwkgICAgICovCisJaWYgKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbGluZWFkZCkKKwkgICAgbWxfbGluZWFkZChidWYsIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbGluZWFkZCk7CisgICAgfQorCisgICAgaWYgKGFjdGlvbiA9PSBNTF9GTFVTSCkJICAgIC8qIG5vdGhpbmcgZWxzZSB0byBkbyAqLworCXJldHVybiBOVUxMOworCisgICAgYm51bSA9IDE7CQkJICAgIC8qIHN0YXJ0IGF0IHRoZSByb290IG9mIHRoZSB0cmVlICovCisgICAgcGFnZV9jb3VudCA9IDE7CisgICAgbG93ID0gMTsKKyAgICBoaWdoID0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisKKyAgICBpZiAoYWN0aW9uID09IE1MX0ZJTkQpCS8qIGZpcnN0IHRyeSBzdGFjayBlbnRyaWVzICovCisgICAgeworCWZvciAodG9wID0gYnVmLT5iX21sLm1sX3N0YWNrX3RvcCAtIDE7IHRvcCA+PSAwOyAtLXRvcCkKKwl7CisJICAgIGlwID0gJihidWYtPmJfbWwubWxfc3RhY2tbdG9wXSk7CisJICAgIGlmIChpcC0+aXBfbG93IDw9IGxudW0gJiYgaXAtPmlwX2hpZ2ggPj0gbG51bSkKKwkgICAgeworCQlibnVtID0gaXAtPmlwX2JudW07CisJCWxvdyA9IGlwLT5pcF9sb3c7CisJCWhpZ2ggPSBpcC0+aXBfaGlnaDsKKwkJYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IHRvcDsJLyogdHJ1bmNhdGUgc3RhY2sgYXQgcHJldiBlbnRyeSAqLworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAodG9wIDwgMCkKKwkgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IDA7CQkvKiBub3QgZm91bmQsIHN0YXJ0IGF0IHRoZSByb290ICovCisgICAgfQorICAgIGVsc2UJLyogTUxfREVMRVRFIG9yIE1MX0lOU0VSVCAqLworCWJ1Zi0+Yl9tbC5tbF9zdGFja190b3AgPSAwOwkvKiBzdGFydCBhdCB0aGUgcm9vdCAqLworCisvKgorICogc2VhcmNoIGRvd253YXJkcyBpbiB0aGUgdHJlZSB1bnRpbCBhIGRhdGEgYmxvY2sgaXMgZm91bmQKKyAqLworICAgIGZvciAoOzspCisgICAgeworCWlmICgoaHAgPSBtZl9nZXQobWZwLCBibnVtLCBwYWdlX2NvdW50KSkgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9ub2Jsb2NrOworCisJLyoKKwkgKiB1cGRhdGUgaGlnaCBmb3IgaW5zZXJ0L2RlbGV0ZQorCSAqLworCWlmIChhY3Rpb24gPT0gTUxfSU5TRVJUKQorCSAgICArK2hpZ2g7CisJZWxzZSBpZiAoYWN0aW9uID09IE1MX0RFTEVURSkKKwkgICAgLS1oaWdoOworCisJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisJaWYgKGRwLT5kYl9pZCA9PSBEQVRBX0lEKQkvKiBkYXRhIGJsb2NrICovCisJeworCSAgICBidWYtPmJfbWwubWxfbG9ja2VkID0gaHA7CisJICAgIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93ID0gbG93OworCSAgICBidWYtPmJfbWwubWxfbG9ja2VkX2hpZ2ggPSBoaWdoOworCSAgICBidWYtPmJfbWwubWxfbG9ja2VkX2xpbmVhZGQgPSAwOworCSAgICBidWYtPmJfbWwubWxfZmxhZ3MgJj0gfihNTF9MT0NLRURfRElSVFkgfCBNTF9MT0NLRURfUE9TKTsKKwkgICAgcmV0dXJuIGhwOworCX0KKworCXBwID0gKFBUUl9CTCAqKShkcCk7CQkvKiBtdXN0IGJlIHBvaW50ZXIgYmxvY2sgKi8KKwlpZiAocHAtPnBiX2lkICE9IFBUUl9JRCkKKwl7CisJICAgIEVNU0coXygiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIpKTsKKwkgICAgZ290byBlcnJvcl9ibG9jazsKKwl9CisKKwlpZiAoKHRvcCA9IG1sX2FkZF9zdGFjayhidWYpKSA8IDApCS8qIGFkZCBuZXcgZW50cnkgdG8gc3RhY2sgKi8KKwkgICAgZ290byBlcnJvcl9ibG9jazsKKwlpcCA9ICYoYnVmLT5iX21sLm1sX3N0YWNrW3RvcF0pOworCWlwLT5pcF9ibnVtID0gYm51bTsKKwlpcC0+aXBfbG93ID0gbG93OworCWlwLT5pcF9oaWdoID0gaGlnaDsKKwlpcC0+aXBfaW5kZXggPSAtMTsJCS8qIGluZGV4IG5vdCBrbm93biB5ZXQgKi8KKworCWRpcnR5ID0gRkFMU0U7CisJZm9yIChpZHggPSAwOyBpZHggPCAoaW50KXBwLT5wYl9jb3VudDsgKytpZHgpCisJeworCSAgICB0ID0gcHAtPnBiX3BvaW50ZXJbaWR4XS5wZV9saW5lX2NvdW50OworCSAgICBDSEVDSyh0ID09IDAsIF8oInBlX2xpbmVfY291bnQgaXMgemVybyIpKTsKKwkgICAgaWYgKChsb3cgKz0gdCkgPiBsbnVtKQorCSAgICB7CisJCWlwLT5pcF9pbmRleCA9IGlkeDsKKwkJYm51bSA9IHBwLT5wYl9wb2ludGVyW2lkeF0ucGVfYm51bTsKKwkJcGFnZV9jb3VudCA9IHBwLT5wYl9wb2ludGVyW2lkeF0ucGVfcGFnZV9jb3VudDsKKwkJaGlnaCA9IGxvdyAtIDE7CisJCWxvdyAtPSB0OworCisJCS8qCisJCSAqIGEgbmVnYXRpdmUgYmxvY2sgbnVtYmVyIG1heSBoYXZlIGJlZW4gY2hhbmdlZAorCQkgKi8KKwkJaWYgKGJudW0gPCAwKQorCQl7CisJCSAgICBibnVtMiA9IG1mX3RyYW5zX2RlbChtZnAsIGJudW0pOworCQkgICAgaWYgKGJudW0gIT0gYm51bTIpCisJCSAgICB7CisJCQlibnVtID0gYm51bTI7CisJCQlwcC0+cGJfcG9pbnRlcltpZHhdLnBlX2JudW0gPSBibnVtOworCQkJZGlydHkgPSBUUlVFOworCQkgICAgfQorCQl9CisKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKGlkeCA+PSAoaW50KXBwLT5wYl9jb3VudCkJICAgIC8qIHBhc3QgdGhlIGVuZDogc29tZXRoaW5nIHdyb25nISAqLworCXsKKwkgICAgaWYgKGxudW0gPiBidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJRU1TR04oXygiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIiksCisJCQkJCSAgICAgIGxudW0gLSBidWYtPmJfbWwubWxfbGluZV9jb3VudCk7CisKKwkgICAgZWxzZQorCQlFTVNHTihfKCJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIpLCBibnVtKTsKKwkgICAgZ290byBlcnJvcl9ibG9jazsKKwl9CisJaWYgKGFjdGlvbiA9PSBNTF9ERUxFVEUpCisJeworCSAgICBwcC0+cGJfcG9pbnRlcltpZHhdLnBlX2xpbmVfY291bnQtLTsKKwkgICAgZGlydHkgPSBUUlVFOworCX0KKwllbHNlIGlmIChhY3Rpb24gPT0gTUxfSU5TRVJUKQorCXsKKwkgICAgcHAtPnBiX3BvaW50ZXJbaWR4XS5wZV9saW5lX2NvdW50Kys7CisJICAgIGRpcnR5ID0gVFJVRTsKKwl9CisJbWZfcHV0KG1mcCwgaHAsIGRpcnR5LCBGQUxTRSk7CisgICAgfQorCitlcnJvcl9ibG9jazoKKyAgICBtZl9wdXQobWZwLCBocCwgRkFMU0UsIEZBTFNFKTsKK2Vycm9yX25vYmxvY2s6CisvKgorICogSWYgYWN0aW9uIGlzIE1MX0RFTEVURSBvciBNTF9JTlNFUlQgd2UgaGF2ZSB0byBjb3JyZWN0IHRoZSB0cmVlIGZvcgorICogdGhlIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIGxpbmUgY291bnRzLCBiZWNhdXNlIHRoZXJlIHdvbid0IGJlIGEgbGluZQorICogaW5zZXJ0ZWQvZGVsZXRlZCBhZnRlciBhbGwuCisgKi8KKyAgICBpZiAoYWN0aW9uID09IE1MX0RFTEVURSkKKwltbF9saW5lYWRkKGJ1ZiwgMSk7CisgICAgZWxzZSBpZiAoYWN0aW9uID09IE1MX0lOU0VSVCkKKwltbF9saW5lYWRkKGJ1ZiwgLTEpOworICAgIGJ1Zi0+Yl9tbC5tbF9zdGFja190b3AgPSAwOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogYWRkIGFuIGVudHJ5IHRvIHRoZSBpbmZvIHBvaW50ZXIgc3RhY2sKKyAqCisgKiByZXR1cm4gLTEgZm9yIGZhaWx1cmUsIG51bWJlciBvZiB0aGUgbmV3IGVudHJ5IG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorbWxfYWRkX3N0YWNrKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIGludAkJdG9wOworICAgIGluZm9wdHJfVAkqbmV3c3RhY2s7CisKKyAgICB0b3AgPSBidWYtPmJfbWwubWxfc3RhY2tfdG9wOworCisJLyogbWF5IGhhdmUgdG8gaW5jcmVhc2UgdGhlIHN0YWNrIHNpemUgKi8KKyAgICBpZiAodG9wID09IGJ1Zi0+Yl9tbC5tbF9zdGFja19zaXplKQorICAgIHsKKwlDSEVDSyh0b3AgPiAwLCBfKCJTdGFjayBzaXplIGluY3JlYXNlcyIpKTsJLyogbW9yZSB0aGFuIDUgbGV2ZWxzPz8/ICovCisKKwluZXdzdGFjayA9IChpbmZvcHRyX1QgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKGluZm9wdHJfVCkgKgorCQkJCQkoYnVmLT5iX21sLm1sX3N0YWNrX3NpemUgKyBTVEFDS19JTkNSKSk7CisJaWYgKG5ld3N0YWNrID09IE5VTEwpCisJICAgIHJldHVybiAtMTsKKwltY2hfbWVtbW92ZShuZXdzdGFjaywgYnVmLT5iX21sLm1sX3N0YWNrLCAoc2l6ZV90KXRvcCAqIHNpemVvZihpbmZvcHRyX1QpKTsKKwl2aW1fZnJlZShidWYtPmJfbWwubWxfc3RhY2spOworCWJ1Zi0+Yl9tbC5tbF9zdGFjayA9IG5ld3N0YWNrOworCWJ1Zi0+Yl9tbC5tbF9zdGFja19zaXplICs9IFNUQUNLX0lOQ1I7CisgICAgfQorCisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCsrOworICAgIHJldHVybiB0b3A7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYmxvY2tzIG9uIHRoZSBzdGFjayBmb3IgaW5zZXJ0ZWQvZGVsZXRlZCBsaW5lcy4KKyAqIFRoZSBzdGFjayBpdHNlbGYgaXMgYWxzbyB1cGRhdGVkLgorICoKKyAqIFdoZW4gYSBpbnNlcnQvZGVsZXRlIGxpbmUgYWN0aW9uIGZhaWxzLCB0aGUgbGluZSBpcyBub3QgaW5zZXJ0ZWQvZGVsZXRlZCwKKyAqIGJ1dCB0aGUgcG9pbnRlciBibG9ja3MgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZC4gVGhhdCBpcyBmaXhlZCBoZXJlIGJ5CisgKiB3YWxraW5nIHRocm91Z2ggdGhlIHN0YWNrLgorICoKKyAqIENvdW50IGlzIHRoZSBudW1iZXIgb2YgbGluZXMgYWRkZWQsIG5lZ2F0aXZlIGlmIGxpbmVzIGhhdmUgYmVlbiBkZWxldGVkLgorICovCisgICAgc3RhdGljIHZvaWQKK21sX2xpbmVhZGQoYnVmLCBjb3VudCkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJY291bnQ7Cit7CisgICAgaW50CQlpZHg7CisgICAgaW5mb3B0cl9UCSppcDsKKyAgICBQVFJfQkwJKnBwOworICAgIG1lbWZpbGVfVAkqbWZwID0gYnVmLT5iX21sLm1sX21mcDsKKyAgICBiaGRyX1QJKmhwOworCisgICAgZm9yIChpZHggPSBidWYtPmJfbWwubWxfc3RhY2tfdG9wIC0gMTsgaWR4ID49IDA7IC0taWR4KQorICAgIHsKKwlpcCA9ICYoYnVmLT5iX21sLm1sX3N0YWNrW2lkeF0pOworCWlmICgoaHAgPSBtZl9nZXQobWZwLCBpcC0+aXBfYm51bSwgMSkpID09IE5VTEwpCisJICAgIGJyZWFrOworCXBwID0gKFBUUl9CTCAqKShocC0+YmhfZGF0YSk7CS8qIG11c3QgYmUgcG9pbnRlciBibG9jayAqLworCWlmIChwcC0+cGJfaWQgIT0gUFRSX0lEKQorCXsKKwkgICAgbWZfcHV0KG1mcCwgaHAsIEZBTFNFLCBGQUxTRSk7CisJICAgIEVNU0coXygiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIikpOworCSAgICBicmVhazsKKwl9CisJcHAtPnBiX3BvaW50ZXJbaXAtPmlwX2luZGV4XS5wZV9saW5lX2NvdW50ICs9IGNvdW50OworCWlwLT5pcF9oaWdoICs9IGNvdW50OworCW1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7CisgICAgfQorfQorCisvKgorICogbWFrZSBzd2FwIGZpbGUgbmFtZSBvdXQgb2YgdGhlIGZpbGUgbmFtZSBhbmQgYSBkaXJlY3RvcnkgbmFtZQorICovCisgICAgc3RhdGljIGNoYXJfdSAqCittYWtlc3dhcG5hbWUoYnVmLCBkaXJfbmFtZSkKKyAgICBidWZfVAkqYnVmOworICAgIGNoYXJfdQkqZGlyX25hbWU7Cit7CisgICAgY2hhcl91CSpyLCAqczsKKworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChXSU4zMjY0KSAgLyogTmVlZCBfdmVyeV8gbG9uZyBmaWxlIG5hbWVzICovCisgICAgcyA9IGRpcl9uYW1lICsgU1RSTEVOKGRpcl9uYW1lKTsKKyAgICBpZiAodmltX2lzcGF0aHNlcChzWy0xXSkgJiYgc1stMV0gPT0gc1stMl0pCisgICAgewkJCSAgICAgICAvKiBFbmRzIHdpdGggJy8vJywgVXNlIEZ1bGwgcGF0aCAqLworCXIgPSBOVUxMOworCWlmICgocyA9IG1ha2VfcGVyY2VudF9zd25hbWUoZGlyX25hbWUsIGJ1Zi0+Yl9mbmFtZSkpICE9IE5VTEwpCisJeworCSAgICByID0gbW9kbmFtZShzLCAoY2hhcl91ICopIi5zd3AiLCBGQUxTRSk7CisJICAgIHZpbV9mcmVlKHMpOworCX0KKwlyZXR1cm4gcjsKKyAgICB9CisjZW5kaWYKKworICAgIHIgPSBidWZfbW9kbmFtZSgKKyNpZmRlZiBTSE9SVF9GTkFNRQorCSAgICBUUlVFLAorI2Vsc2UKKwkgICAgKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAorI2VuZGlmCisjaWZkZWYgUklTQ09TCisJICAgIC8qIEF2b2lkIHByb2JsZW1zIGlmIGZuYW1lIGhhcyBzcGVjaWFsIGNoYXJzLCBlZyA8V2ltcCRTY3JhcD4gKi8KKwkgICAgYnVmLT5iX2ZmbmFtZSwKKyNlbHNlCisJICAgIGJ1Zi0+Yl9mbmFtZSwKKyNlbmRpZgorCSAgICAoY2hhcl91ICopCisjaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoUklTQ09TKQorCSAgICAiX3N3cCIsCisjZWxzZQorCSAgICAiLnN3cCIsCisjZW5kaWYKKyNpZmRlZiBTSE9SVF9GTkFNRQkJLyogYWx3YXlzIDguMyBmaWxlIG5hbWUgKi8KKwkgICAgRkFMU0UKKyNlbHNlCisJICAgIC8qIFByZXBlbmQgYSAnLicgdG8gdGhlIHN3YXAgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuICovCisJICAgIGRpcl9uYW1lWzBdID09ICcuJyAmJiBkaXJfbmFtZVsxXSA9PSBOVUwKKyNlbmRpZgorCSAgICAgICApOworICAgIGlmIChyID09IE5VTEwpCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCisJcmV0dXJuIE5VTEw7CisKKyAgICBzID0gZ2V0X2ZpbGVfaW5fZGlyKHIsIGRpcl9uYW1lKTsKKyAgICB2aW1fZnJlZShyKTsKKyAgICByZXR1cm4gczsKK30KKworLyoKKyAqIEdldCBmaWxlIG5hbWUgdG8gdXNlIGZvciBzd2FwIGZpbGUgb3IgYmFja3VwIGZpbGUuCisgKiBVc2UgdGhlIG5hbWUgb2YgdGhlIGVkaXRlZCBmaWxlICJmbmFtZSIgYW5kIGFuIGVudHJ5IGluIHRoZSAnZGlyJyBvciAnYmRpcicKKyAqIG9wdGlvbiAiZG5hbWUiLgorICogLSBJZiAiZG5hbWUiIGlzICIuIiwgcmV0dXJuICJmbmFtZSIgKHN3YXAgZmlsZSBpbiBkaXIgb2YgZmlsZSkuCisgKiAtIElmICJkbmFtZSIgc3RhcnRzIHdpdGggIi4vIiwgaW5zZXJ0ICJkbmFtZSIgaW4gImZuYW1lIiAoc3dhcCBmaWxlCisgKiAgIHJlbGF0aXZlIHRvIGRpciBvZiBmaWxlKS4KKyAqIC0gT3RoZXJ3aXNlLCBwcmVwZW5kICJkbmFtZSIgdG8gdGhlIHRhaWwgb2YgImZuYW1lIiAoc3dhcCBmaWxlIGluIHNwZWNpZmljCisgKiAgIGRpcikuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBhbGxvY2F0ZWQgc3RyaW5nIGFuZCBjYW4gYmUgTlVMTC4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfZmlsZV9pbl9kaXIoZm5hbWUsIGRuYW1lKQorICAgIGNoYXJfdSAgKmZuYW1lOworICAgIGNoYXJfdSAgKmRuYW1lOwkvKiBkb24ndCB1c2UgImRpcm5hbWUiLCBpdCBpcyBhIGdsb2JhbCBmb3IgQWxwaGEgKi8KK3sKKyAgICBjaGFyX3UJKnQ7CisgICAgY2hhcl91CSp0YWlsOworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIGludAkJc2F2ZV9jaGFyOworCisgICAgdGFpbCA9IGdldHRhaWwoZm5hbWUpOworCisgICAgaWYgKGRuYW1lWzBdID09ICcuJyAmJiBkbmFtZVsxXSA9PSBOVUwpCisJcmV0dmFsID0gdmltX3N0cnNhdmUoZm5hbWUpOworICAgIGVsc2UgaWYgKGRuYW1lWzBdID09ICcuJyAmJiB2aW1faXNwYXRoc2VwKGRuYW1lWzFdKSkKKyAgICB7CisJaWYgKHRhaWwgPT0gZm5hbWUpCSAgICAvKiBubyBwYXRoIGJlZm9yZSBmaWxlIG5hbWUgKi8KKwkgICAgcmV0dmFsID0gY29uY2F0X2ZuYW1lcyhkbmFtZSArIDIsIHRhaWwsIFRSVUUpOworCWVsc2UKKwl7CisJICAgIHNhdmVfY2hhciA9ICp0YWlsOworCSAgICAqdGFpbCA9IE5VTDsKKwkgICAgdCA9IGNvbmNhdF9mbmFtZXMoZm5hbWUsIGRuYW1lICsgMiwgVFJVRSk7CisJICAgICp0YWlsID0gc2F2ZV9jaGFyOworCSAgICBpZiAodCA9PSBOVUxMKQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCQlyZXR2YWwgPSBOVUxMOworCSAgICBlbHNlCisJICAgIHsKKwkJcmV0dmFsID0gY29uY2F0X2ZuYW1lcyh0LCB0YWlsLCBUUlVFKTsKKwkJdmltX2ZyZWUodCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKwlyZXR2YWwgPSBjb25jYXRfZm5hbWVzKGRuYW1lLCB0YWlsLCBUUlVFKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGaW5kIG91dCB3aGF0IG5hbWUgdG8gdXNlIGZvciB0aGUgc3dhcCBmaWxlIGZvciBidWZmZXIgJ2J1ZicuCisgKgorICogU2V2ZXJhbCBuYW1lcyBhcmUgdHJpZWQgdG8gZmluZCBvbmUgdGhhdCBkb2VzIG5vdCBleGlzdAorICoKKyAqIE5vdGU6IElmIEJBU0VOQU1FTEVOIGlzIG5vdCBjb3JyZWN0LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZXMgZm9yCisgKgkgbm90IGJlaW5nIGFibGUgdG8gb3BlbiB0aGUgc3dhcGZpbGUKKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZmluZHN3YXBuYW1lKGJ1ZiwgZGlycCwgb2xkX2ZuYW1lKQorICAgIGJ1Zl9UCSpidWY7CisgICAgY2hhcl91CSoqZGlycDsJCS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBkaXJlY3RvcmllcyAqLworICAgIGNoYXJfdQkqb2xkX2ZuYW1lOwkvKiBkb24ndCBnaXZlIHdhcm5pbmcgZm9yIHRoaXMgZmlsZSBuYW1lICovCit7CisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBpbnQJCW47CisgICAgdGltZV90CXgsIHN4OworICAgIGNoYXJfdQkqZGlyX25hbWU7CisjaWZkZWYgQU1JR0EKKyAgICBCUFRSCWZoOworI2VuZGlmCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgaW50CQlyOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTSE9SVF9GTkFNRSkgXAorCQkgICAgICYmICgoIWRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoT1MyKSkgfHwgZGVmaW5lZChBUkNISUUpKQorIyBkZWZpbmUgQ1JFQVRFX0RVTU1ZX0ZJTEUKKyAgICBGSUxFCSpkdW1teWZkID0gTlVMTDsKKworLyoKKyAqIElmIHdlIHN0YXJ0IGVkaXRpbmcgYSBuZXcgZmlsZSwgZS5nLiAidGVzdC5kb2MiLCB3aGljaCByZXNpZGVzIG9uIGFuIE1TRE9TCisgKiBjb21wYXRpYmxlIGZpbGVzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGZpbGUgInRlc3QuZG9jLnN3cCIgd2hpY2ggd2UKKyAqIGNyZWF0ZSB3aWxsIGJlIGV4YWN0bHkgdGhlIHNhbWUgZmlsZS4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtIHdlIHRlbXBvcmFyaWx5CisgKiBjcmVhdGUgInRlc3QuZG9jIi4KKyAqIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgY2hlY2sgYmVsb3cgZm9yIGEgOC4zIGZpbGUgbmFtZSBpcyB1c2VkLgorICovCisgICAgaWYgKCEoYnVmLT5iX3Bfc24gfHwgYnVmLT5iX3Nob3J0bmFtZSkgJiYgYnVmLT5iX2ZuYW1lICE9IE5VTEwKKwkJCQkJICAgICAmJiBtY2hfZ2V0cGVybShidWYtPmJfZm5hbWUpIDwgMCkKKwlkdW1teWZkID0gbWNoX2ZvcGVuKChjaGFyICopYnVmLT5iX2ZuYW1lLCAidyIpOworI2VuZGlmCisKKy8qCisgKiBJc29sYXRlIGEgZGlyZWN0b3J5IG5hbWUgZnJvbSAqZGlycCBhbmQgcHV0IGl0IGluIGRpcl9uYW1lLgorICogRmlyc3QgYWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gcHV0IHRoZSBkaXJlY3RvcnkgbmFtZSBpbi4KKyAqLworICAgIGRpcl9uYW1lID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTigqZGlycCkgKyAxKTsKKyAgICBpZiAoZGlyX25hbWUgIT0gTlVMTCkKKwkodm9pZCljb3B5X29wdGlvbl9wYXJ0KGRpcnAsIGRpcl9uYW1lLCAzMTAwMCwgIiwiKTsKKworLyoKKyAqIHdlIHRyeSBkaWZmZXJlbnQgbmFtZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQKKyAqLworICAgIGlmIChkaXJfbmFtZSA9PSBOVUxMKQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCWZuYW1lID0gTlVMTDsKKyAgICBlbHNlCisJZm5hbWUgPSBtYWtlc3dhcG5hbWUoYnVmLCBkaXJfbmFtZSk7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoZm5hbWUgPT0gTlVMTCkJLyogbXVzdCBiZSBvdXQgb2YgbWVtb3J5ICovCisJICAgIGJyZWFrOworCWlmICgobiA9IChpbnQpU1RSTEVOKGZuYW1lKSkgPT0gMCkJLyogc2FmZXR5IGNoZWNrICovCisJeworCSAgICB2aW1fZnJlZShmbmFtZSk7CisJICAgIGZuYW1lID0gTlVMTDsKKwkgICAgYnJlYWs7CisJfQorI2lmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoT1MyKSkgJiYgIWRlZmluZWQoQVJDSElFKSAmJiAhZGVmaW5lZChTSE9SVF9GTkFNRSkKKy8qCisgKiBTb21lIHN5c3RlbXMgaGF2ZSBhIE1TLURPUyBjb21wYXRpYmxlIGZpbGVzeXN0ZW0gdGhhdCB1c2UgOC4zIGNoYXJhY3RlcgorICogZmlsZSBuYW1lcy4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdHJ5IGFuZCB0aGUgc3dhcCBmaWxlIG5hbWUgZG9lcyBub3QgZml0IGluCisgKiA4LjMsIGRldGVjdCBpZiB0aGlzIGlzIHRoZSBjYXNlLCBzZXQgc2hvcnRuYW1lIGFuZCB0cnkgYWdhaW4uCisgKi8KKwlpZiAoZm5hbWVbbiAtIDJdID09ICd3JyAmJiBmbmFtZVtuIC0gMV0gPT0gJ3AnCisJCQkJCSYmICEoYnVmLT5iX3Bfc24gfHwgYnVmLT5iX3Nob3J0bmFtZSkpCisJeworCSAgICBjaGFyX3UJICAgICp0YWlsOworCSAgICBjaGFyX3UJICAgICpmbmFtZTI7CisJICAgIHN0cnVjdCBzdGF0CSAgICBzMSwgczI7CisJICAgIGludAkJICAgIGYxLCBmMjsKKwkgICAgaW50CQkgICAgY3JlYXRlZDEgPSBGQUxTRSwgY3JlYXRlZDIgPSBGQUxTRTsKKwkgICAgaW50CQkgICAgc2FtZSA9IEZBTFNFOworCisJICAgIC8qCisJICAgICAqIENoZWNrIGlmIHN3YXBmaWxlIG5hbWUgZG9lcyBub3QgZml0IGluIDguMzoKKwkgICAgICogSXQgZWl0aGVyIGNvbnRhaW5zIHR3byBkb3RzLCBpcyBsb25nZXIgdGhhbiA4IGNoYXJzLCBvciBzdGFydHMKKwkgICAgICogd2l0aCBhIGRvdC4KKwkgICAgICovCisJICAgIHRhaWwgPSBnZXR0YWlsKGJ1Zi0+Yl9mbmFtZSk7CisJICAgIGlmICggICAgICAgdmltX3N0cmNocih0YWlsLCAnLicpICE9IE5VTEwKKwkJICAgIHx8IFNUUkxFTih0YWlsKSA+IChzaXplX3QpOAorCQkgICAgfHwgKmdldHRhaWwoZm5hbWUpID09ICcuJykKKwkgICAgeworCQlmbmFtZTIgPSBhbGxvYyhuICsgMik7CisJCWlmIChmbmFtZTIgIT0gTlVMTCkKKwkJeworCQkgICAgU1RSQ1BZKGZuYW1lMiwgZm5hbWUpOworCQkgICAgLyogaWYgZm5hbWUgPT0gInh4Lnh4LnN3cCIsCSAgICBmbmFtZTIgPSAieHgueHguc3d4IgorCQkgICAgICogaWYgZm5hbWUgPT0gIi54eC5zd3AiLAkgICAgZm5hbWUyID0gIi54eC5zd3B4IgorCQkgICAgICogaWYgZm5hbWUgPT0gIjEyMzQ1Njc4OS5zd3AiLCBmbmFtZTIgPSAiMTIzNDU2Nzh4LnN3cCIKKwkJICAgICAqLworCQkgICAgaWYgKHZpbV9zdHJjaHIodGFpbCwgJy4nKSAhPSBOVUxMKQorCQkJZm5hbWUyW24gLSAxXSA9ICd4JzsKKwkJICAgIGVsc2UgaWYgKCpnZXR0YWlsKGZuYW1lKSA9PSAnLicpCisJCSAgICB7CisJCQlmbmFtZTJbbl0gPSAneCc7CisJCQlmbmFtZTJbbiArIDFdID0gTlVMOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJZm5hbWUyW24gLSA1XSArPSAxOworCQkgICAgLyoKKwkJICAgICAqIG1heSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmlsZXMgdG8gYmUgYWJsZSB0byB1c2UgbWNoX3N0YXQoKQorCQkgICAgICovCisJCSAgICBmMSA9IG1jaF9vcGVuKChjaGFyICopZm5hbWUsIE9fUkRPTkxZIHwgT19FWFRSQSwgMCk7CisJCSAgICBpZiAoZjEgPCAwKQorCQkgICAgeworCQkJZjEgPSBtY2hfb3Blbl9ydygoY2hhciAqKWZuYW1lLAorCQkJCQkgICAgICAgT19SRFdSfE9fQ1JFQVR8T19FWENMfE9fRVhUUkEpOworI2lmIGRlZmluZWQoT1MyKQorCQkJaWYgKGYxIDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQkgICAgc2FtZSA9IFRSVUU7CisjZW5kaWYKKwkJCWNyZWF0ZWQxID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGlmIChmMSA+PSAwKQorCQkgICAgeworCQkJZjIgPSBtY2hfb3BlbigoY2hhciAqKWZuYW1lMiwgT19SRE9OTFkgfCBPX0VYVFJBLCAwKTsKKwkJCWlmIChmMiA8IDApCisJCQl7CisJCQkgICAgZjIgPSBtY2hfb3Blbl9ydygoY2hhciAqKWZuYW1lMiwKKwkJCQkJICAgICAgIE9fUkRXUnxPX0NSRUFUfE9fRVhDTHxPX0VYVFJBKTsKKwkJCSAgICBjcmVhdGVkMiA9IFRSVUU7CisJCQl9CisJCQlpZiAoZjIgPj0gMCkKKwkJCXsKKwkJCSAgICAvKgorCQkJICAgICAqIEJvdGggZmlsZXMgZXhpc3Qgbm93LiBJZiBtY2hfc3RhdCgpIHJldHVybnMgdGhlCisJCQkgICAgICogc2FtZSBkZXZpY2UgYW5kIGlub2RlIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUuCisJCQkgICAgICovCisJCQkgICAgaWYgKG1jaF9mc3RhdChmMSwgJnMxKSAhPSAtMQorCQkJCSAgICAmJiBtY2hfZnN0YXQoZjIsICZzMikgIT0gLTEKKwkJCQkgICAgJiYgczEuc3RfZGV2ID09IHMyLnN0X2RldgorCQkJCSAgICAmJiBzMS5zdF9pbm8gPT0gczIuc3RfaW5vKQorCQkJCXNhbWUgPSBUUlVFOworCQkJICAgIGNsb3NlKGYyKTsKKwkJCSAgICBpZiAoY3JlYXRlZDIpCisJCQkJbWNoX3JlbW92ZShmbmFtZTIpOworCQkJfQorCQkJY2xvc2UoZjEpOworCQkJaWYgKGNyZWF0ZWQxKQorCQkJICAgIG1jaF9yZW1vdmUoZm5hbWUpOworCQkgICAgfQorCQkgICAgdmltX2ZyZWUoZm5hbWUyKTsKKwkJICAgIGlmIChzYW1lKQorCQkgICAgeworCQkJYnVmLT5iX3Nob3J0bmFtZSA9IFRSVUU7CisJCQl2aW1fZnJlZShmbmFtZSk7CisJCQlmbmFtZSA9IG1ha2Vzd2FwbmFtZShidWYsIGRpcl9uYW1lKTsKKwkJCWNvbnRpbnVlOwkvKiB0cnkgYWdhaW4gd2l0aCBiX3Nob3J0bmFtZSBzZXQgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgc3dhcGZpbGUgYWxyZWFkeSBleGlzdHMKKwkgKi8KKwlpZiAobWNoX2dldHBlcm0oZm5hbWUpIDwgMCkJLyogaXQgZG9lcyBub3QgZXhpc3QgKi8KKwl7CisjaWZkZWYgSEFWRV9MU1RBVAorCSAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworCSAgICAvKgorCSAgICAgKiBFeHRyYSBzZWN1cml0eSBjaGVjazogV2hlbiBhIHN3YXAgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMKKwkgICAgICogaXMgbW9zdCBsaWtlbHkgYSBzeW1saW5rIGF0dGFjay4KKwkgICAgICovCisJICAgIGlmIChtY2hfbHN0YXQoKGNoYXIgKilmbmFtZSwgJnNiKSA8IDApCisjZWxzZQorIyBpZmRlZiBBTUlHQQorCSAgICBmaCA9IE9wZW4oKFVCWVRFICopZm5hbWUsIChsb25nKU1PREVfTkVXRklMRSk7CisJICAgIC8qCisJICAgICAqIG9uIHRoZSBBbWlnYSBtY2hfZ2V0cGVybSgpIHdpbGwgcmV0dXJuIC0xIHdoZW4gdGhlIGZpbGUgZXhpc3RzCisJICAgICAqIGJ1dCBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgcHJvZ3JhbS4gVGhpcyBoYXBwZW5zIGlmIHlvdSBlZGl0CisJICAgICAqIGEgZmlsZSB0d2ljZS4KKwkgICAgICovCisJICAgIGlmIChmaCAhPSAoQlBUUilOVUxMKQkvKiBjYW4gb3BlbiBmaWxlLCBPSyAqLworCSAgICB7CisJCUNsb3NlKGZoKTsKKwkJbWNoX3JlbW92ZShmbmFtZSk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChJb0VycigpICE9IEVSUk9SX09CSkVDVF9JTl9VU0UKKwkJCQkJICAgICYmIElvRXJyKCkgIT0gRVJST1JfT0JKRUNUX0VYSVNUUykKKyMgZW5kaWYKKyNlbmRpZgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIEEgZmlsZSBuYW1lIGVxdWFsIHRvIG9sZF9mbmFtZSBpcyBPSyB0byB1c2UuCisJICovCisJaWYgKG9sZF9mbmFtZSAhPSBOVUxMICYmIGZuYW1lY21wKGZuYW1lLCBvbGRfZm5hbWUpID09IDApCisJICAgIGJyZWFrOworCisJLyoKKwkgKiBnZXQgaGVyZSB3aGVuIGZpbGUgYWxyZWFkeSBleGlzdHMKKwkgKi8KKwlpZiAoZm5hbWVbbiAtIDJdID09ICd3JyAmJiBmbmFtZVtuIC0gMV0gPT0gJ3AnKQkvKiBmaXJzdCB0cnkgKi8KKwl7CisjaWZuZGVmIFNIT1JUX0ZOQU1FCisJICAgIC8qCisJICAgICAqIG9uIE1TLURPUyBjb21wYXRpYmxlIGZpbGVzeXN0ZW1zIChlLmcuIG1lc3N5ZG9zKSBmaWxlLmRvYy5zd3AKKwkgICAgICogYW5kIGZpbGUuZG9jIGFyZSB0aGUgc2FtZSBmaWxlLiBUbyBndWVzcyBpZiB0aGlzIHByb2JsZW0gaXMKKwkgICAgICogcHJlc2VudCB0cnkgaWYgZmlsZS5kb2Muc3d4IGV4aXN0cy4gSWYgaXQgZG9lcywgd2Ugc2V0CisJICAgICAqIGJ1Zi0+Yl9zaG9ydG5hbWUgYW5kIHRyeSBmaWxlX2RvYy5zd3AgKGRvdHMgcmVwbGFjZWQgYnkKKwkgICAgICogdW5kZXJzY29yZXMgZm9yIHRoaXMgZmlsZSksIGFuZCB0cnkgYWdhaW4uIElmIGl0IGRvZXNuJ3Qgd2UKKwkgICAgICogYXNzdW1lIHRoYXQgImZpbGUuZG9jLnN3cCIgYWxyZWFkeSBleGlzdHMuCisJICAgICAqLworCSAgICBpZiAoIShidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSkJLyogbm90IHRyaWVkIHlldCAqLworCSAgICB7CisJCWZuYW1lW24gLSAxXSA9ICd4JzsKKwkJciA9IG1jaF9nZXRwZXJtKGZuYW1lKTsJCS8qIHRyeSAiZmlsZS5zd3giICovCisJCWZuYW1lW24gLSAxXSA9ICdwJzsKKwkJaWYgKHIgPj0gMCkJCSAgICAvKiAiZmlsZS5zd3giIHNlZW1zIHRvIGV4aXN0ICovCisJCXsKKwkJICAgIGJ1Zi0+Yl9zaG9ydG5hbWUgPSBUUlVFOworCQkgICAgdmltX2ZyZWUoZm5hbWUpOworCQkgICAgZm5hbWUgPSBtYWtlc3dhcG5hbWUoYnVmLCBkaXJfbmFtZSk7CisJCSAgICBjb250aW51ZTsJICAgIC8qIHRyeSBhZ2FpbiB3aXRoICcuJyByZXBsYWNlZCB3aXRoICdfJyAqLworCQl9CisJICAgIH0KKyNlbmRpZgorCSAgICAvKgorCSAgICAgKiBJZiB3ZSBnZXQgaGVyZSB0aGUgIi5zd3AiIGZpbGUgcmVhbGx5IGV4aXN0cy4KKwkgICAgICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlLCB1bmxlc3MgcmVjb3ZlcmluZywgbm8gZmlsZSBuYW1lLCB3ZSBhcmUKKwkgICAgICogdmlld2luZyBhIGhlbHAgZmlsZSBvciB3aGVuIHRoZSBwYXRoIG9mIHRoZSBmaWxlIGlzIGRpZmZlcmVudAorCSAgICAgKiAoaGFwcGVucyB3aGVuIGFsbCAuc3dwIGZpbGVzIGFyZSBpbiBvbmUgZGlyZWN0b3J5KS4KKwkgICAgICovCisJICAgIGlmICghcmVjb3Zlcnltb2RlICYmIGJ1Zi0+Yl9mbmFtZSAhPSBOVUxMICYmICFidWYtPmJfaGVscCkKKwkgICAgeworCQlpbnQJCWZkOworCQlzdHJ1Y3QgYmxvY2swCWIwOworCQlpbnQJCWRpZmZlciA9IEZBTFNFOworCisJCS8qCisJCSAqIFRyeSB0byByZWFkIGJsb2NrIDAgZnJvbSB0aGUgc3dhcCBmaWxlIHRvIGdldCB0aGUgb3JpZ2luYWwKKwkJICogZmlsZSBuYW1lIChhbmQgaW5vZGUgbnVtYmVyKS4KKwkJICovCisJCWZkID0gbWNoX29wZW4oKGNoYXIgKilmbmFtZSwgT19SRE9OTFkgfCBPX0VYVFJBLCAwKTsKKwkJaWYgKGZkID49IDApCisJCXsKKwkJICAgIGlmIChyZWFkKGZkLCAoY2hhciAqKSZiMCwgc2l6ZW9mKGIwKSkgPT0gc2l6ZW9mKGIwKSkKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBUaGUgbmFtZSBpbiB0aGUgc3dhcCBmaWxlIG1heSBiZSAifnVzZXIvcGF0aC9maWxlIi4KKwkJCSAqIEV4cGFuZCBpdCBmaXJzdC4KKwkJCSAqLworCQkJZXhwYW5kX2VudihiMC5iMF9mbmFtZSwgTmFtZUJ1ZmYsIE1BWFBBVEhMKTsKKyNpZmRlZiBDSEVDS19JTk9ERQorCQkJaWYgKGZuYW1lY21wX2lubyhidWYtPmJfZmZuYW1lLCBOYW1lQnVmZiwKKwkJCQkJCSAgICAgY2hhcl90b19sb25nKGIwLmIwX2lubykpKQorCQkJICAgIGRpZmZlciA9IFRSVUU7CisjZWxzZQorCQkJaWYgKGZuYW1lY21wKE5hbWVCdWZmLCBidWYtPmJfZmZuYW1lKSAhPSAwKQorCQkJICAgIGRpZmZlciA9IFRSVUU7CisjZW5kaWYKKwkJICAgIH0KKwkJICAgIGNsb3NlKGZkKTsKKwkJfQorI2lmZGVmIFJJU0NPUworCQllbHNlCisJCSAgICAvKiBDYW4ndCBvcGVuIHN3YXAgZmlsZSwgdGhvdWdoIGl0IGRvZXMgZXhpc3QuCisJCSAgICAgKiBBc3N1bWUgdGhhdCB0aGUgdXNlciBpcyBlZGl0aW5nIHR3byBmaWxlcyB3aXRoCisJCSAgICAgKiB0aGUgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gTm8gZXJyb3IuCisJCSAgICAgKi8KKwkJICAgIGRpZmZlciA9IFRSVUU7CisjZW5kaWYKKworCQkvKiBnaXZlIHRoZSBBVFRFTlRJT04gbWVzc2FnZSB3aGVuIHRoZXJlIGlzIGFuIG9sZCBzd2FwIGZpbGUKKwkJICogZm9yIHRoZSBjdXJyZW50IGZpbGUsIGFuZCB0aGUgYnVmZmVyIHdhcyBub3QgcmVjb3ZlcmVkLiAqLworCQlpZiAoZGlmZmVyID09IEZBTFNFICYmICEoY3VyYnVmLT5iX2ZsYWdzICYgQkZfUkVDT1ZFUkVEKQorCQkJJiYgdmltX3N0cmNocihwX3NobSwgU0hNX0FUVEVOVElPTikgPT0gTlVMTCkKKwkJeworCQkgICAgc3RydWN0IHN0YXQgc3Q7CisjaWZkZWYgQ1JFQVRFX0RVTU1ZX0ZJTEUKKwkJICAgIGludAkJZGlkX3VzZV9kdW1teSA9IEZBTFNFOworCisJCSAgICAvKiBBdm9pZCBnZXR0aW5nIGEgd2FybmluZyBmb3IgdGhlIGZpbGUgYmVpbmcgY3JlYXRlZAorCQkgICAgICogb3V0c2lkZSBvZiBWaW0sIGl0IHdhcyBjcmVhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGlzCisJCSAgICAgKiBmdW5jdGlvbi4gIERlbGV0ZSB0aGUgZmlsZSBub3csIGJlY2F1c2UgVmltIG1pZ2h0IGV4aXQKKwkJICAgICAqIGhlcmUgaWYgdGhlIHdpbmRvdyBpcyBjbG9zZWQuICovCisJCSAgICBpZiAoZHVtbXlmZCAhPSBOVUxMKQorCQkgICAgeworCQkJZmNsb3NlKGR1bW15ZmQpOworCQkJZHVtbXlmZCA9IE5VTEw7CisJCQltY2hfcmVtb3ZlKGJ1Zi0+Yl9mbmFtZSk7CisJCQlkaWRfdXNlX2R1bW15ID0gVFJVRTsKKwkJICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisJCSAgICAvKiBJZiB3ZSBhcmUgc3VwcG9zZWQgdG8gc3RhcnQgdGhlIEdVSSBidXQgaXQgd2Fzbid0CisJCSAgICAgKiBjb21wbGV0ZWx5IHN0YXJ0ZWQgeWV0LCBzdGFydCBpdCBub3cuICBUaGlzIG1ha2VzIHRoZQorCQkgICAgICogbWVzc2FnZXMgZGlzcGxheWVkIGluIHRoZSBWaW0gd2luZG93IHdoZW4gbG9hZGluZyBhCisJCSAgICAgKiBzZXNzaW9uIGZyb20gdGhlIC5ndmltcmMgZmlsZS4gKi8KKwkJICAgIGlmIChndWkuc3RhcnRpbmcgJiYgIWd1aS5pbl91c2UpCisJCQlndWlfc3RhcnQoKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykpICYmIChkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpKQorCQkgICAgcHJvY2Vzc19zdGlsbF9ydW5uaW5nID0gRkFMU0U7CisjZW5kaWYKKwkJICAgICsrbm9fd2FpdF9yZXR1cm47CisJCSAgICAodm9pZClFTVNHKF8oIkUzMjU6IEFUVEVOVElPTiIpKTsKKwkJICAgIE1TR19QVVRTKF8oIlxuRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiKSk7CisJCSAgICBtc2dfaG9tZV9yZXBsYWNlKGZuYW1lKTsKKwkJICAgIE1TR19QVVRTKCJcIlxuIik7CisJCSAgICBzeCA9IHN3YXBmaWxlX2luZm8oZm5hbWUpOworCQkgICAgTVNHX1BVVFMoXygiV2hpbGUgb3BlbmluZyBmaWxlIFwiIikpOworCQkgICAgbXNnX291dHRyYW5zKGJ1Zi0+Yl9mbmFtZSk7CisJCSAgICBNU0dfUFVUUygiXCJcbiIpOworCQkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopYnVmLT5iX2ZuYW1lLCAmc3QpICE9IC0xKQorCQkgICAgeworCQkJTVNHX1BVVFMoXygiICAgICAgICAgICAgIGRhdGVkOiAiKSk7CisJCQl4ID0gc3Quc3RfbXRpbWU7ICAgIC8qIE1hbnggQyBjYW4ndCBkbyAmc3Quc3RfbXRpbWUgKi8KKwkJCU1TR19QVVRTKGN0aW1lKCZ4KSk7CisJCQlpZiAoc3ggIT0gMCAmJiB4ID4gc3gpCisJCQkgICAgTVNHX1BVVFMoXygiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iKSk7CisJCSAgICB9CisJCSAgICAvKiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisJCSAgICAgKiBvdGhlciBsYW5ndWFnZXMuICovCisJCSAgICBNU0dfUFVUUyhfKCJcbigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIpKTsKKwkJICAgIE1TR19QVVRTKF8oIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iKSk7CisJCSAgICBNU0dfUFVUUyhfKCJcbigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIikpOworCQkgICAgTVNHX1BVVFMoXygiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIikpOworCQkgICAgbXNnX291dHRyYW5zKGJ1Zi0+Yl9mbmFtZSk7CisJCSAgICBNU0dfUFVUUyhfKCJcIlxuICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIikpOworCQkgICAgTVNHX1BVVFMoXygiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIpKTsKKwkJICAgIG1zZ19vdXR0cmFucyhmbmFtZSk7CisJCSAgICBNU0dfUFVUUyhfKCJcIlxuICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIpKTsKKwkJICAgIGNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKwkJICAgIC0tbm9fd2FpdF9yZXR1cm47CisKKwkJICAgIC8qIFdlIGRvbid0IHdhbnQgYSAncScgdHlwZWQgYXQgdGhlIG1vcmUtcHJvbXB0IGludGVycnVwdAorCQkgICAgICogbG9hZGluZyBhIGZpbGUuICovCisJCSAgICBnb3RfaW50ID0gRkFMU0U7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJCSAgICBpZiAoc3dhcF9leGlzdHNfYWN0aW9uKQorCQkgICAgeworCQkJY2hhcl91CSpuYW1lOworCisJCQluYW1lID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oZm5hbWUpCisJCQkJKyBTVFJMRU4oXygiU3dhcCBmaWxlIFwiIikpCisJCQkJKyBTVFJMRU4oXygiXCIgYWxyZWFkeSBleGlzdHMhIikpICsgNSkpOworCQkJaWYgKG5hbWUgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICBTVFJDUFkobmFtZSwgXygiU3dhcCBmaWxlIFwiIikpOworCQkJICAgIGhvbWVfcmVwbGFjZShOVUxMLCBmbmFtZSwgbmFtZSArIFNUUkxFTihuYW1lKSwKKwkJCQkJCQkJICAxMDAwLCBUUlVFKTsKKwkJCSAgICBTVFJDQVQobmFtZSwgXygiXCIgYWxyZWFkeSBleGlzdHMhIikpOworCQkJfQorCQkJc3dpdGNoIChkb19kaWFsb2coVklNX1dBUk5JTkcsCisJCQkJICAgIChjaGFyX3UgKilfKCJWSU0gLSBBVFRFTlRJT04iKSwKKwkJCQkgICAgbmFtZSA9PSBOVUxMCisJCQkJCT8gIChjaGFyX3UgKilfKCJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIikKKwkJCQkJOiBuYW1lLAorIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChWTVMpCisJCQkJICAgIHByb2Nlc3Nfc3RpbGxfcnVubmluZworCQkJCQk/IChjaGFyX3UgKilfKCImT3BlbiBSZWFkLU9ubHlcbiZFZGl0IGFueXdheVxuJlJlY292ZXJcbiZRdWl0XG4mQWJvcnQiKSA6CisjIGVuZGlmCisJCQkJCShjaGFyX3UgKilfKCImT3BlbiBSZWFkLU9ubHlcbiZFZGl0IGFueXdheVxuJlJlY292ZXJcbiZRdWl0XG4mQWJvcnRcbiZEZWxldGUgaXQiKSwgMSwgTlVMTCkpCisJCQl7CisJCQkgICAgY2FzZSAxOgorCQkJCWJ1Zi0+Yl9wX3JvID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDI6CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSAzOgorCQkJCXN3YXBfZXhpc3RzX2FjdGlvbiA9IFNFQV9SRUNPVkVSOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgNDoKKwkJCQlzd2FwX2V4aXN0c19hY3Rpb24gPSBTRUFfUVVJVDsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDU6CisJCQkJc3dhcF9leGlzdHNfYWN0aW9uID0gU0VBX1FVSVQ7CisJCQkJZ290X2ludCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSA2OgorCQkJCW1jaF9yZW1vdmUoZm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJdmltX2ZyZWUobmFtZSk7CisKKwkJCS8qIHByZXRlbmQgc2NyZWVuIGRpZG4ndCBzY3JvbGwsIG5lZWQgcmVkcmF3IGFueXdheSAqLworCQkJbXNnX3Njcm9sbGVkID0gMDsKKwkJCXJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKKworCQkJLyogSWYgdGhlIGZpbGUgd2FzIGRlbGV0ZWQgdGhpcyBmbmFtZSBjYW4gYmUgdXNlZC4gKi8KKwkJCWlmIChtY2hfZ2V0cGVybShmbmFtZSkgPCAwKQorCQkJICAgIGJyZWFrOworCQkgICAgfQorCQkgICAgZWxzZQorI2VuZGlmCisJCSAgICB7CisJCQlNU0dfUFVUUygiXG4iKTsKKwkJCW5lZWRfd2FpdF9yZXR1cm4gPSBUUlVFOyAvKiBjYWxsIHdhaXRfcmV0dXJuIGxhdGVyICovCisJCSAgICB9CisKKyNpZmRlZiBDUkVBVEVfRFVNTVlfRklMRQorCQkgICAgLyogR29pbmcgdG8gdHJ5IGFub3RoZXIgbmFtZSwgbmVlZCB0aGUgZHVtbXkgZmlsZSBhZ2Fpbi4gKi8KKwkJICAgIGlmIChkaWRfdXNlX2R1bW15KQorCQkJZHVtbXlmZCA9IG1jaF9mb3BlbigoY2hhciAqKWJ1Zi0+Yl9mbmFtZSwgInciKTsKKyNlbmRpZgorCQl9CisJICAgIH0KKwl9CisKKwkvKgorCSAqIENoYW5nZSB0aGUgIi5zd3AiIGV4dGVuc2lvbiB0byBmaW5kIGFub3RoZXIgZmlsZSB0aGF0IGNhbiBiZSB1c2VkLgorCSAqIEZpcnN0IGRlY3JlbWVudCB0aGUgbGFzdCBjaGFyOiAiLnN3byIsICIuc3duIiwgZXRjLgorCSAqIElmIHRoYXQgc3RpbGwgaXNuJ3QgZW5vdWdoIGRlY3JlbWVudCB0aGUgbGFzdCBidXQgb25lIGNoYXI6ICIuc3Z6IgorCSAqIENhbiBoYXBwZW4gd2hlbiBlZGl0aW5nIG1hbnkgIk5vIEZpbGUiIGJ1ZmZlcnMuCisJICovCisJaWYgKGZuYW1lW24gLSAxXSA9PSAnYScpCS8qICIucz9hIiAqLworCXsKKwkgICAgaWYgKGZuYW1lW24gLSAyXSA9PSAnYScpICAgIC8qICIuc2FhIjogdHJpZWQgZW5vdWdoLCBnaXZlIHVwICovCisJICAgIHsKKwkJRU1TRyhfKCJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIikpOworCQl2aW1fZnJlZShmbmFtZSk7CisJCWZuYW1lID0gTlVMTDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgLS1mbmFtZVtuIC0gMl07CQkvKiAiLnN2eiIsICIuc3V6IiwgZXRjLiAqLworCSAgICBmbmFtZVtuIC0gMV0gPSAneicgKyAxOworCX0KKwktLWZuYW1lW24gLSAxXTsJCQkvKiAiLnN3byIsICIuc3duIiwgZXRjLiAqLworICAgIH0KKworICAgIHZpbV9mcmVlKGRpcl9uYW1lKTsKKyNpZmRlZiBDUkVBVEVfRFVNTVlfRklMRQorICAgIGlmIChkdW1teWZkICE9IE5VTEwpCS8qIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCB0ZW1wb3JhcmlseSAqLworICAgIHsKKwlmY2xvc2UoZHVtbXlmZCk7CisJbWNoX3JlbW92ZShidWYtPmJfZm5hbWUpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBmbmFtZTsKK30KKworICAgIHN0YXRpYyBpbnQKK2IwX21hZ2ljX3dyb25nKGIwcCkKKyAgICBaRVJPX0JMICpiMHA7Cit7CisgICAgcmV0dXJuIChiMHAtPmIwX21hZ2ljX2xvbmcgIT0gKGxvbmcpQjBfTUFHSUNfTE9ORworCSAgICB8fCBiMHAtPmIwX21hZ2ljX2ludCAhPSAoaW50KUIwX01BR0lDX0lOVAorCSAgICB8fCBiMHAtPmIwX21hZ2ljX3Nob3J0ICE9IChzaG9ydClCMF9NQUdJQ19TSE9SVAorCSAgICB8fCBiMHAtPmIwX21hZ2ljX2NoYXIgIT0gQjBfTUFHSUNfQ0hBUik7Cit9CisKKyNpZmRlZiBDSEVDS19JTk9ERQorLyoKKyAqIENvbXBhcmUgY3VycmVudCBmaWxlIG5hbWUgd2l0aCBmaWxlIG5hbWUgZnJvbSBzd2FwIGZpbGUuCisgKiBUcnkgdG8gdXNlIGlub2RlIG51bWJlcnMgd2hlbiBwb3NzaWJsZS4KKyAqIFJldHVybiBub24temVybyB3aGVuIGZpbGVzIGFyZSBkaWZmZXJlbnQuCisgKgorICogV2hlbiBjb21wYXJpbmcgZmlsZSBuYW1lcyBhIGZldyB0aGluZ3MgaGF2ZSB0byBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb246CisgKiAtIFdoZW4gd29ya2luZyBvdmVyIGEgbmV0d29yayB0aGUgZnVsbCBwYXRoIG9mIGEgZmlsZSBkZXBlbmRzIG9uIHRoZSBob3N0LgorICogICBXZSBjaGVjayB0aGUgaW5vZGUgbnVtYmVyIGlmIHBvc3NpYmxlLiAgSXQgaXMgbm90IDEwMCUgcmVsaWFibGUgdGhvdWdoLAorICogICBiZWNhdXNlIHRoZSBkZXZpY2UgbnVtYmVyIGNhbm5vdCBiZSB1c2VkIG92ZXIgYSBuZXR3b3JrLgorICogLSBXaGVuIGEgZmlsZSBkb2VzIG5vdCBleGlzdCB5ZXQgKGVkaXRpbmcgYSBuZXcgZmlsZSkgdGhlcmUgaXMgbm8gaW5vZGUKKyAqICAgbnVtYmVyLgorICogLSBUaGUgZmlsZSBuYW1lIGluIGEgc3dhcCBmaWxlIG1heSBub3QgYmUgdmFsaWQgb24gdGhlIGN1cnJlbnQgaG9zdC4gIFRoZQorICogICAifnVzZXIiIGZvcm0gaXMgdXNlZCB3aGVuZXZlciBwb3NzaWJsZSB0byBhdm9pZCB0aGlzLgorICoKKyAqIFRoaXMgaXMgZ2V0dGluZyBjb21wbGljYXRlZCwgbGV0J3MgbWFrZSBhIHRhYmxlOgorICoKKyAqCQlpbm9fYyAgaW5vX3MgIGZuYW1lX2MgIGZuYW1lX3MJZGlmZmVyID0KKyAqCisgKiBib3RoIGZpbGVzIGV4aXN0IC0+IGNvbXBhcmUgaW5vZGUgbnVtYmVyczoKKyAqCQkhPSAwICAgIT0gMAlYCSBYCWlub19jICE9IGlub19zCisgKgorICogaW5vZGUgbnVtYmVyKHMpIHVua25vd24sIGZpbGUgbmFtZXMgYXZhaWxhYmxlIC0+IGNvbXBhcmUgZmlsZSBuYW1lcworICoJCT09IDAJWAlPSwkgT0sJZm5hbWVfYyAhPSBmbmFtZV9zCisgKgkJIFggICAgID09IDAJT0sJIE9LCWZuYW1lX2MgIT0gZm5hbWVfcworICoKKyAqIGN1cnJlbnQgZmlsZSBkb2Vzbid0IGV4aXN0LCBmaWxlIGZvciBzd2FwIGZpbGUgZXhpc3QsIGZpbGUgbmFtZShzKSBub3QKKyAqIGF2YWlsYWJsZSAtPiBwcm9iYWJseSBkaWZmZXJlbnQKKyAqCQk9PSAwICAgIT0gMCAgICBGQUlMCSBYCVRSVUUKKyAqCQk9PSAwICAgIT0gMAlYCUZBSUwJVFJVRQorICoKKyAqIGN1cnJlbnQgZmlsZSBleGlzdHMsIGlub2RlIGZvciBzd2FwIHVua25vd24sIGZpbGUgbmFtZShzKSBub3QKKyAqIGF2YWlsYWJsZSAtPiBwcm9iYWJseSBkaWZmZXJlbnQKKyAqCQkhPSAwICAgPT0gMCAgICBGQUlMCSBYCVRSVUUKKyAqCQkhPSAwICAgPT0gMAlYCUZBSUwJVFJVRQorICoKKyAqIGN1cnJlbnQgZmlsZSBkb2Vzbid0IGV4aXN0LCBpbm9kZSBmb3Igc3dhcCB1bmtub3duLCBvbmUgZmlsZSBuYW1lIG5vdAorICogYXZhaWxhYmxlIC0+IHByb2JhYmx5IGRpZmZlcmVudAorICoJCT09IDAgICA9PSAwICAgIEZBSUwJIE9LCVRSVUUKKyAqCQk9PSAwICAgPT0gMAlPSwlGQUlMCVRSVUUKKyAqCisgKiBjdXJyZW50IGZpbGUgZG9lc24ndCBleGlzdCwgaW5vZGUgZm9yIHN3YXAgdW5rbm93biwgYm90aCBmaWxlIG5hbWVzIG5vdAorICogYXZhaWxhYmxlIC0+IHByb2JhYmx5IHNhbWUgZmlsZQorICoJCT09IDAgICA9PSAwICAgIEZBSUwJRkFJTAlGQUxTRQorICoKKyAqIE5vdGUgdGhhdCB3aGVuIHRoZSBpbm9fdCBpcyA2NCBiaXRzLCBvbmx5IHRoZSBsYXN0IDMyIHdpbGwgYmUgdXNlZC4gIFRoaXMKKyAqIGNhbid0IGJlIGNoYW5nZWQgd2l0aG91dCBtYWtpbmcgdGhlIGJsb2NrIDAgaW5jb21wYXRpYmxlIHdpdGggMzIgYml0CisgKiB2ZXJzaW9ucy4KKyAqLworCisgICAgc3RhdGljIGludAorZm5hbWVjbXBfaW5vKGZuYW1lX2MsIGZuYW1lX3MsIGlub19ibG9jazApCisgICAgY2hhcl91CSpmbmFtZV9jOwkgICAgLyogY3VycmVudCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmZuYW1lX3M7CSAgICAvKiBmaWxlIG5hbWUgZnJvbSBzd2FwIGZpbGUgKi8KKyAgICBsb25nCWlub19ibG9jazA7Cit7CisgICAgc3RydWN0IHN0YXQJc3Q7CisgICAgaW5vX3QJaW5vX2MgPSAwOwkgICAgLyogaW5vIG9mIGN1cnJlbnQgZmlsZSAqLworICAgIGlub190CWlub19zOwkJICAgIC8qIGlubyBvZiBmaWxlIGZyb20gc3dhcCBmaWxlICovCisgICAgY2hhcl91CWJ1Zl9jW01BWFBBVEhMXTsgICAgLyogZnVsbCBwYXRoIG9mIGZuYW1lX2MgKi8KKyAgICBjaGFyX3UJYnVmX3NbTUFYUEFUSExdOyAgICAvKiBmdWxsIHBhdGggb2YgZm5hbWVfcyAqLworICAgIGludAkJcmV0dmFsX2M7CSAgICAvKiBmbGFnOiBidWZfYyB2YWxpZCAqLworICAgIGludAkJcmV0dmFsX3M7CSAgICAvKiBmbGFnOiBidWZfcyB2YWxpZCAqLworCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWVfYywgJnN0KSA9PSAwKQorCWlub19jID0gKGlub190KXN0LnN0X2lubzsKKworICAgIC8qCisgICAgICogRmlyc3Qgd2UgdHJ5IHRvIGdldCB0aGUgaW5vZGUgZnJvbSB0aGUgZmlsZSBuYW1lLCBiZWNhdXNlIHRoZSBpbm9kZSBpbgorICAgICAqIHRoZSBzd2FwIGZpbGUgbWF5IGJlIG91dGRhdGVkLiAgSWYgdGhhdCBmYWlscyAoZS5nLiB0aGlzIHBhdGggaXMgbm90CisgICAgICogdmFsaWQgb24gdGhpcyBtYWNoaW5lKSwgdXNlIHRoZSBpbm9kZSBmcm9tIGJsb2NrIDAuCisgICAgICovCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWVfcywgJnN0KSA9PSAwKQorCWlub19zID0gKGlub190KXN0LnN0X2lubzsKKyAgICBlbHNlCisJaW5vX3MgPSAoaW5vX3QpaW5vX2Jsb2NrMDsKKworICAgIGlmIChpbm9fYyAmJiBpbm9fcykKKwlyZXR1cm4gKGlub19jICE9IGlub19zKTsKKworICAgIC8qCisgICAgICogT25lIG9mIHRoZSBpbm9kZSBudW1iZXJzIGlzIHVua25vd24sIHRyeSBhIGZvcmNlZCB2aW1fRnVsbE5hbWUoKSBhbmQKKyAgICAgKiBjb21wYXJlIHRoZSBmaWxlIG5hbWVzLgorICAgICAqLworICAgIHJldHZhbF9jID0gdmltX0Z1bGxOYW1lKGZuYW1lX2MsIGJ1Zl9jLCBNQVhQQVRITCwgVFJVRSk7CisgICAgcmV0dmFsX3MgPSB2aW1fRnVsbE5hbWUoZm5hbWVfcywgYnVmX3MsIE1BWFBBVEhMLCBUUlVFKTsKKyAgICBpZiAocmV0dmFsX2MgPT0gT0sgJiYgcmV0dmFsX3MgPT0gT0spCisJcmV0dXJuIChTVFJDTVAoYnVmX2MsIGJ1Zl9zKSAhPSAwKTsKKworICAgIC8qCisgICAgICogQ2FuJ3QgY29tcGFyZSBpbm9kZXMgb3IgZmlsZSBuYW1lcywgZ3Vlc3MgdGhhdCB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudCwKKyAgICAgKiB1bmxlc3MgYm90aCBhcHBlYXIgbm90IHRvIGV4aXN0IGF0IGFsbC4KKyAgICAgKi8KKyAgICBpZiAoaW5vX3MgPT0gMCAmJiBpbm9fYyA9PSAwICYmIHJldHZhbF9jID09IEZBSUwgJiYgcmV0dmFsX3MgPT0gRkFJTCkKKwlyZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogQ0hFQ0tfSU5PREUgKi8KKworLyoKKyAqIE1vdmUgYSBsb25nIGludGVnZXIgaW50byBhIGZvdXIgYnl0ZSBjaGFyYWN0ZXIgYXJyYXkuCisgKiBVc2VkIGZvciBtYWNoaW5lIGluZGVwZW5kZW5jeSBpbiBibG9jayB6ZXJvLgorICovCisgICAgc3RhdGljIHZvaWQKK2xvbmdfdG9fY2hhcihuLCBzKQorICAgIGxvbmcgICAgbjsKKyAgICBjaGFyX3UgICpzOworeworICAgIHNbMF0gPSAoY2hhcl91KShuICYgMHhmZik7CisgICAgbiA9ICh1bnNpZ25lZCluID4+IDg7CisgICAgc1sxXSA9IChjaGFyX3UpKG4gJiAweGZmKTsKKyAgICBuID0gKHVuc2lnbmVkKW4gPj4gODsKKyAgICBzWzJdID0gKGNoYXJfdSkobiAmIDB4ZmYpOworICAgIG4gPSAodW5zaWduZWQpbiA+PiA4OworICAgIHNbM10gPSAoY2hhcl91KShuICYgMHhmZik7Cit9CisKKyAgICBzdGF0aWMgbG9uZworY2hhcl90b19sb25nKHMpCisgICAgY2hhcl91ICAqczsKK3sKKyAgICBsb25nICAgIHJldHZhbDsKKworICAgIHJldHZhbCA9IHNbM107CisgICAgcmV0dmFsIDw8PSA4OworICAgIHJldHZhbCB8PSBzWzJdOworICAgIHJldHZhbCA8PD0gODsKKyAgICByZXR2YWwgfD0gc1sxXTsKKyAgICByZXR2YWwgPDw9IDg7CisgICAgcmV0dmFsIHw9IHNbMF07CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisgICAgdm9pZAorbWxfc2V0ZGlydHkoYnVmLCBmbGFnKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmbGFnOworeworICAgIGJoZHJfVAkqaHA7CisgICAgWkVST19CTAkqYjBwOworCisgICAgaWYgKCFidWYtPmJfbWwubWxfbWZwKQorCXJldHVybjsKKyAgICBmb3IgKGhwID0gYnVmLT5iX21sLm1sX21mcC0+bWZfdXNlZF9sYXN0OyBocCAhPSBOVUxMOyBocCA9IGhwLT5iaF9wcmV2KQorICAgIHsKKwlpZiAoaHAtPmJoX2JudW0gPT0gMCkKKwl7CisJICAgIGIwcCA9IChaRVJPX0JMICopKGhwLT5iaF9kYXRhKTsKKwkgICAgYjBwLT5iMF9kaXJ0eSA9IGZsYWcgPyAweDU1IDogMDsKKwkgICAgaHAtPmJoX2ZsYWdzIHw9IEJIX0RJUlRZOworCSAgICBtZl9zeW5jKGJ1Zi0+Yl9tbC5tbF9tZnAsIE1GU19aRVJPKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9CWVRFT0ZGKSB8fCBkZWZpbmVkKFBST1RPKQorCisjZGVmaW5lIE1MQ1NfTUFYTCA4MDAJLyogbWF4IG5vIG9mIGxpbmVzIGluIGNodW5rICovCisjZGVmaW5lIE1MQ1NfTUlOTCA0MDAgICAvKiBzaG91bGQgYmUgaGFsZiBvZiBNTENTX01BWEwgKi8KKworLyoKKyAqIEtlZXAgaW5mb3JtYXRpb24gZm9yIGZpbmRpbmcgYnl0ZSBvZmZzZXQgb2YgYSBsaW5lLCB1cGR0eXRwZSBtYXkgYmUgb25lIG9mOgorICogTUxfQ0hOS19BRERMSU5FOiBBZGQgbGVuIHRvIHBhcmVudCBjaHVuaywgcG9zc2libHkgc3BsaXR0aW5nIGl0CisgKgkgICBDYXJlZnVsOiBNTF9DSE5LX0FERExJTkUgbWF5IGNhdXNlIG1sX2ZpbmRfbGluZSgpIHRvIGJlIGNhbGxlZC4KKyAqIE1MX0NITktfREVMTElORTogU3VidHJhY3QgbGVuIGZyb20gcGFyZW50IGNodW5rLCBwb3NzaWJseSBkZWxldGluZyBpdAorICogTUxfQ0hOS19VUERMSU5FOiBBZGQgbGVuIHRvIHBhcmVudCBjaHVuaywgYXMgYSBzaWduZWQgZW50aXR5LgorICovCisgICAgc3RhdGljIHZvaWQKK21sX3VwZGF0ZWNodW5rKGJ1ZiwgbGluZSwgbGVuLCB1cGR0eXBlKQorICAgIGJ1Zl9UCSpidWY7CisgICAgbGluZW5yX1QJbGluZTsKKyAgICBsb25nCWxlbjsKKyAgICBpbnQJCXVwZHR5cGU7Cit7CisgICAgc3RhdGljIGJ1Zl9UCSptbF91cGRfbGFzdGJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIGxpbmVucl9UCW1sX3VwZF9sYXN0bGluZTsKKyAgICBzdGF0aWMgbGluZW5yX1QJbWxfdXBkX2xhc3RjdXJsaW5lOworICAgIHN0YXRpYyBpbnQJCW1sX3VwZF9sYXN0Y3VyaXg7CisKKyAgICBsaW5lbnJfVAkJY3VybGluZSA9IG1sX3VwZF9sYXN0Y3VybGluZTsKKyAgICBpbnQJCQljdXJpeCA9IG1sX3VwZF9sYXN0Y3VyaXg7CisgICAgbG9uZwkJc2l6ZTsKKyAgICBjaHVua3NpemVfVAkJKmN1cmNobms7CisgICAgaW50CQkJcmVzdDsKKyAgICBiaGRyX1QJCSpocDsKKyAgICBEQVRBX0JMCQkqZHA7CisKKyAgICBpZiAoYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgPT0gLTEgfHwgbGVuID09IDApCisJcmV0dXJuOworICAgIGlmIChidWYtPmJfbWwubWxfY2h1bmtzaXplID09IE5VTEwpCisgICAgeworCWJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgPSAoY2h1bmtzaXplX1QgKikKKwkJCQkgIGFsbG9jKCh1bnNpZ25lZClzaXplb2YoY2h1bmtzaXplX1QpICogMTAwKTsKKwlpZiAoYnVmLT5iX21sLm1sX2NodW5rc2l6ZSA9PSBOVUxMKQorCXsKKwkgICAgYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgPSAtMTsKKwkgICAgcmV0dXJuOworCX0KKwlidWYtPmJfbWwubWxfbnVtY2h1bmtzID0gMTAwOworCWJ1Zi0+Yl9tbC5tbF91c2VkY2h1bmtzID0gMTsKKwlidWYtPmJfbWwubWxfY2h1bmtzaXplWzBdLm1sY3NfbnVtbGluZXMgPSAxOworCWJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbMF0ubWxjc190b3RhbHNpemUgPSAxOworICAgIH0KKworICAgIGlmICh1cGR0eXBlID09IE1MX0NITktfVVBETElORSAmJiBidWYtPmJfbWwubWxfbGluZV9jb3VudCA9PSAxKQorICAgIHsKKwkvKgorCSAqIEZpcnN0IGxpbmUgaW4gZW1wdHkgYnVmZmVyIGZyb20gbWxfZmx1c2hfbGluZSgpIC0tIHJlc2V0CisJICovCisJYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgPSAxOworCWJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbMF0ubWxjc19udW1saW5lcyA9IDE7CisJYnVmLT5iX21sLm1sX2NodW5rc2l6ZVswXS5tbGNzX3RvdGFsc2l6ZSA9CisJCQkJICAobG9uZylTVFJMRU4oYnVmLT5iX21sLm1sX2xpbmVfcHRyKSArIDE7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogRmluZCBjaHVuayB0aGF0IG91ciBsaW5lIGJlbG9uZ3MgdG8sIGN1cmxpbmUgd2lsbCBiZSBhdCBzdGFydCBvZiB0aGUKKyAgICAgKiBjaHVuay4KKyAgICAgKi8KKyAgICBpZiAoYnVmICE9IG1sX3VwZF9sYXN0YnVmIHx8IGxpbmUgIT0gbWxfdXBkX2xhc3RsaW5lICsgMQorCSAgICB8fCB1cGR0eXBlICE9IE1MX0NITktfQURETElORSkKKyAgICB7CisJZm9yIChjdXJsaW5lID0gMSwgY3VyaXggPSAwOworCSAgICAgY3VyaXggPCBidWYtPmJfbWwubWxfdXNlZGNodW5rcyAtIDEKKwkgICAgICYmIGxpbmUgPj0gY3VybGluZSArIGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbY3VyaXhdLm1sY3NfbnVtbGluZXM7CisJICAgICBjdXJpeCsrKQorCXsKKwkgICAgY3VybGluZSArPSBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAobGluZSA+PSBjdXJsaW5lICsgYnVmLT5iX21sLm1sX2NodW5rc2l6ZVtjdXJpeF0ubWxjc19udW1saW5lcworCQkgJiYgY3VyaXggPCBidWYtPmJfbWwubWxfdXNlZGNodW5rcyAtIDEpCisgICAgeworCS8qIEFkanVzdCBjYWNoZWQgY3VyaXggJiBjdXJsaW5lICovCisJY3VybGluZSArPSBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzOworCWN1cml4Kys7CisgICAgfQorICAgIGN1cmNobmsgPSBidWYtPmJfbWwubWxfY2h1bmtzaXplICsgY3VyaXg7CisKKyAgICBpZiAodXBkdHlwZSA9PSBNTF9DSE5LX0RFTExJTkUpCisJbGVuICo9IC0xOworICAgIGN1cmNobmstPm1sY3NfdG90YWxzaXplICs9IGxlbjsKKyAgICBpZiAodXBkdHlwZSA9PSBNTF9DSE5LX0FERExJTkUpCisgICAgeworCWN1cmNobmstPm1sY3NfbnVtbGluZXMrKzsKKworCS8qIE1heSByZXNpemUgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGluIGJvdGggY2FzZXMgYmVsb3cgKi8KKwlpZiAoYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgKyAxID49IGJ1Zi0+Yl9tbC5tbF9udW1jaHVua3MpCisJeworCSAgICBidWYtPmJfbWwubWxfbnVtY2h1bmtzID0gYnVmLT5iX21sLm1sX251bWNodW5rcyAqIDMgLyAyOworCSAgICBidWYtPmJfbWwubWxfY2h1bmtzaXplID0gKGNodW5rc2l6ZV9UICopCisJCXZpbV9yZWFsbG9jKGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUsCisJCQkgICAgc2l6ZW9mKGNodW5rc2l6ZV9UKSAqIGJ1Zi0+Yl9tbC5tbF9udW1jaHVua3MpOworCSAgICBpZiAoYnVmLT5iX21sLm1sX2NodW5rc2l6ZSA9PSBOVUxMKQorCSAgICB7CisJCS8qIEhtbW1tLCBHaXZlIHVwIG9uIG9mZnNldCBmb3IgdGhpcyBidWZmZXIgKi8KKwkJYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgPSAtMTsKKwkJcmV0dXJuOworCSAgICB9CisJfQorCisJaWYgKGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbY3VyaXhdLm1sY3NfbnVtbGluZXMgPj0gTUxDU19NQVhMKQorCXsKKwkgICAgaW50CSAgICBjb3VudDsJICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGJsb2NrICovCisJICAgIGludAkgICAgaWR4OworCSAgICBpbnQJICAgIHRleHRfZW5kOworCSAgICBpbnQJICAgIGxpbmVjbnQ7CisKKwkgICAgbWNoX21lbW1vdmUoYnVmLT5iX21sLm1sX2NodW5rc2l6ZSArIGN1cml4ICsgMSwKKwkJCWJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgKyBjdXJpeCwKKwkJCShidWYtPmJfbWwubWxfdXNlZGNodW5rcyAtIGN1cml4KSAqCisJCQlzaXplb2YoY2h1bmtzaXplX1QpKTsKKwkgICAgLyogQ29tcHV0ZSBsZW5ndGggb2YgZmlyc3QgaGFsZiBvZiBsaW5lcyBpbiB0aGUgc3BsaXR0ZWQgY2h1bmsgKi8KKwkgICAgc2l6ZSA9IDA7CisJICAgIGxpbmVjbnQgPSAwOworCSAgICB3aGlsZSAoY3VybGluZSA8IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50CisJCQkmJiBsaW5lY250IDwgTUxDU19NSU5MKQorCSAgICB7CisJCWlmICgoaHAgPSBtbF9maW5kX2xpbmUoYnVmLCBjdXJsaW5lLCBNTF9GSU5EKSkgPT0gTlVMTCkKKwkJeworCQkgICAgYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgPSAtMTsKKwkJICAgIHJldHVybjsKKwkJfQorCQlkcCA9IChEQVRBX0JMICopKGhwLT5iaF9kYXRhKTsKKwkJY291bnQgPSAobG9uZykoYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoKSAtCisJCQkobG9uZykoYnVmLT5iX21sLm1sX2xvY2tlZF9sb3cpICsgMTsKKwkJaWR4ID0gY3VybGluZSAtIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93OworCQljdXJsaW5lID0gYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoICsgMTsKKwkJaWYgKGlkeCA9PSAwKS8qIGZpcnN0IGxpbmUgaW4gYmxvY2ssIHRleHQgYXQgdGhlIGVuZCAqLworCQkgICAgdGV4dF9lbmQgPSBkcC0+ZGJfdHh0X2VuZDsKKwkJZWxzZQorCQkgICAgdGV4dF9lbmQgPSAoKGRwLT5kYl9pbmRleFtpZHggLSAxXSkgJiBEQl9JTkRFWF9NQVNLKTsKKwkJLyogQ29tcHV0ZSBpbmRleCBvZiBsYXN0IGxpbmUgdG8gdXNlIGluIHRoaXMgTUVNTElORSAqLworCQlyZXN0ID0gY291bnQgLSBpZHg7CisJCWlmIChsaW5lY250ICsgcmVzdCA+IE1MQ1NfTUlOTCkKKwkJeworCQkgICAgaWR4ICs9IE1MQ1NfTUlOTCAtIGxpbmVjbnQgLSAxOworCQkgICAgbGluZWNudCA9IE1MQ1NfTUlOTDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGlkeCA9IGNvdW50IC0gMTsKKwkJICAgIGxpbmVjbnQgKz0gcmVzdDsKKwkJfQorCQlzaXplICs9IHRleHRfZW5kIC0gKChkcC0+ZGJfaW5kZXhbaWR4XSkgJiBEQl9JTkRFWF9NQVNLKTsKKwkgICAgfQorCSAgICBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzID0gbGluZWNudDsKKwkgICAgYnVmLT5iX21sLm1sX2NodW5rc2l6ZVtjdXJpeCArIDFdLm1sY3NfbnVtbGluZXMgLT0gbGluZWNudDsKKwkgICAgYnVmLT5iX21sLm1sX2NodW5rc2l6ZVtjdXJpeF0ubWxjc190b3RhbHNpemUgPSBzaXplOworCSAgICBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4ICsgMV0ubWxjc190b3RhbHNpemUgLT0gc2l6ZTsKKwkgICAgYnVmLT5iX21sLm1sX3VzZWRjaHVua3MrKzsKKwkgICAgbWxfdXBkX2xhc3RidWYgPSBOVUxMOyAgIC8qIEZvcmNlIHJlY2FsYyBvZiBjdXJpeCAmIGN1cmxpbmUgKi8KKwkgICAgcmV0dXJuOworCX0KKwllbHNlIGlmIChidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzID49IE1MQ1NfTUlOTAorCQkgICAgICYmIGN1cml4ID09IGJ1Zi0+Yl9tbC5tbF91c2VkY2h1bmtzIC0gMQorCQkgICAgICYmIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gbGluZSA8PSAxKQorCXsKKwkgICAgLyoKKwkgICAgICogV2UgYXJlIGluIHRoZSBsYXN0IGNodW5rIGFuZCBpdCBpcyBjaGVhcCB0byBjcmF0ZSBhIG5ldyBvbmUKKwkgICAgICogYWZ0ZXIgdGhpcy4gRG8gaXQgbm93IHRvIGF2b2lkIHRoZSBsb29wIGFib3ZlIGxhdGVyIG9uCisJICAgICAqLworCSAgICBjdXJjaG5rID0gYnVmLT5iX21sLm1sX2NodW5rc2l6ZSArIGN1cml4ICsgMTsKKwkgICAgYnVmLT5iX21sLm1sX3VzZWRjaHVua3MrKzsKKwkgICAgaWYgKGxpbmUgPT0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKwkJY3VyY2huay0+bWxjc19udW1saW5lcyA9IDA7CisJCWN1cmNobmstPm1sY3NfdG90YWxzaXplID0gMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogTGluZSBpcyBqdXN0IHByaW9yIHRvIGxhc3QsIG1vdmUgY291bnQgZm9yIGxhc3QKKwkJICogVGhpcyBpcyB0aGUgY29tbW9uIGNhc2UgIHdoZW4gbG9hZGluZyBhIG5ldyBmaWxlCisJCSAqLworCQlocCA9IG1sX2ZpbmRfbGluZShidWYsIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LCBNTF9GSU5EKTsKKwkJaWYgKGhwID09IE5VTEwpCisJCXsKKwkJICAgIGJ1Zi0+Yl9tbC5tbF91c2VkY2h1bmtzID0gLTE7CisJCSAgICByZXR1cm47CisJCX0KKwkJZHAgPSAoREFUQV9CTCAqKShocC0+YmhfZGF0YSk7CisJCWlmIChkcC0+ZGJfbGluZV9jb3VudCA9PSAxKQorCQkgICAgcmVzdCA9IGRwLT5kYl90eHRfZW5kIC0gZHAtPmRiX3R4dF9zdGFydDsKKwkJZWxzZQorCQkgICAgcmVzdCA9CisJCQkoKGRwLT5kYl9pbmRleFtkcC0+ZGJfbGluZV9jb3VudCAtIDJdKSAmIERCX0lOREVYX01BU0spCisJCQktIGRwLT5kYl90eHRfc3RhcnQ7CisJCWN1cmNobmstPm1sY3NfdG90YWxzaXplID0gcmVzdDsKKwkJY3VyY2huay0+bWxjc19udW1saW5lcyA9IDE7CisJCWN1cmNobmtbLTFdLm1sY3NfdG90YWxzaXplIC09IHJlc3Q7CisJCWN1cmNobmtbLTFdLm1sY3NfbnVtbGluZXMgLT0gMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZSBpZiAodXBkdHlwZSA9PSBNTF9DSE5LX0RFTExJTkUpCisgICAgeworCWN1cmNobmstPm1sY3NfbnVtbGluZXMtLTsKKwltbF91cGRfbGFzdGJ1ZiA9IE5VTEw7ICAgLyogRm9yY2UgcmVjYWxjIG9mIGN1cml4ICYgY3VybGluZSAqLworCWlmIChjdXJpeCA8IChidWYtPmJfbWwubWxfdXNlZGNodW5rcyAtIDEpCisJCSYmIChjdXJjaG5rLT5tbGNzX251bWxpbmVzICsgY3VyY2hua1sxXS5tbGNzX251bWxpbmVzKQorCQkgICA8PSBNTENTX01JTkwpCisJeworCSAgICBjdXJpeCsrOworCSAgICBjdXJjaG5rID0gYnVmLT5iX21sLm1sX2NodW5rc2l6ZSArIGN1cml4OworCX0KKwllbHNlIGlmIChjdXJpeCA9PSAwICYmIGN1cmNobmstPm1sY3NfbnVtbGluZXMgPD0gMCkKKwl7CisJICAgIGJ1Zi0+Yl9tbC5tbF91c2VkY2h1bmtzLS07CisJICAgIG1jaF9tZW1tb3ZlKGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUsIGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgKyAxLAorCQkJYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgKiBzaXplb2YoY2h1bmtzaXplX1QpKTsKKwkgICAgcmV0dXJuOworCX0KKwllbHNlIGlmIChjdXJpeCA9PSAwIHx8IChjdXJjaG5rLT5tbGNzX251bWxpbmVzID4gMTAKKwkJICAgICYmIChjdXJjaG5rLT5tbGNzX251bWxpbmVzICsgY3VyY2hua1stMV0ubWxjc19udW1saW5lcykKKwkJICAgICAgID4gTUxDU19NSU5MKSkKKwl7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBDb2xsYXBzZSBjaHVua3MgKi8KKwljdXJjaG5rWy0xXS5tbGNzX251bWxpbmVzICs9IGN1cmNobmstPm1sY3NfbnVtbGluZXM7CisJY3VyY2hua1stMV0ubWxjc190b3RhbHNpemUgKz0gY3VyY2huay0+bWxjc190b3RhbHNpemU7CisJYnVmLT5iX21sLm1sX3VzZWRjaHVua3MtLTsKKwlpZiAoY3VyaXggPCBidWYtPmJfbWwubWxfdXNlZGNodW5rcykKKwl7CisJICAgIG1jaF9tZW1tb3ZlKGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgKyBjdXJpeCwKKwkJCWJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgKyBjdXJpeCArIDEsCisJCQkoYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgLSBjdXJpeCkgKgorCQkJc2l6ZW9mKGNodW5rc2l6ZV9UKSk7CisJfQorCXJldHVybjsKKyAgICB9CisgICAgbWxfdXBkX2xhc3RidWYgPSBidWY7CisgICAgbWxfdXBkX2xhc3RsaW5lID0gbGluZTsKKyAgICBtbF91cGRfbGFzdGN1cmxpbmUgPSBjdXJsaW5lOworICAgIG1sX3VwZF9sYXN0Y3VyaXggPSBjdXJpeDsKK30KKworLyoKKyAqIEZpbmQgb2Zmc2V0IGZvciBsaW5lIG9yIGxpbmUgd2l0aCBvZmZzZXQuCisgKiBGaW5kIGxpbmUgd2l0aCBvZmZzZXQgaWYgbGluZSBpcyAwOyByZXR1cm4gcmVtYWluaW5nIG9mZnNldCBpbiBvZmZwCisgKiBGaW5kIG9mZnNldCBvZiBsaW5lIGlmIGxpbmUgPiAwCisgKiByZXR1cm4gLTEgaWYgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZQorICovCisgICAgbG9uZworbWxfZmluZF9saW5lX29yX29mZnNldChidWYsIGxpbmUsIG9mZnApCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsaW5lOworICAgIGxvbmcJKm9mZnA7Cit7CisgICAgbGluZW5yX1QJY3VybGluZTsKKyAgICBpbnQJCWN1cml4OworICAgIGxvbmcJc2l6ZTsKKyAgICBiaGRyX1QJKmhwOworICAgIERBVEFfQkwJKmRwOworICAgIGludAkJY291bnQ7CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBibG9jayAqLworICAgIGludAkJaWR4OworICAgIGludAkJc3RhcnRfaWR4OworICAgIGludAkJdGV4dF9lbmQ7CisgICAgbG9uZwlvZmZzZXQ7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmZmRvcyA9IChnZXRfZmlsZWZvcm1hdChidWYpID09IEVPTF9ET1MpOworICAgIGludAkJZXh0cmEgPSAwOworCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF91c2VkY2h1bmtzID09IC0xCisJICAgIHx8IGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgPT0gTlVMTAorCSAgICB8fCBsaW5lIDwgMCkKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAob2ZmcCA9PSBOVUxMKQorCW9mZnNldCA9IDA7CisgICAgZWxzZQorCW9mZnNldCA9ICpvZmZwOworICAgIGlmIChsaW5lID09IDAgJiYgb2Zmc2V0IDw9IDApCisJcmV0dXJuIDE7ICAgLyogTm90IGEgImZpbmQgb2Zmc2V0IiBhbmQgb2Zmc2V0IDAgX211c3RfIGJlIGluIGxpbmUgMSAqLworICAgIC8qCisgICAgICogRmluZCB0aGUgbGFzdCBjaHVuayBiZWZvcmUgdGhlIG9uZSBjb250YWluaW5nIG91ciBsaW5lLiBMYXN0IGNodW5rIGlzCisgICAgICogc3BlY2lhbCBiZWNhdXNlIGl0IHdpbGwgbmV2ZXIgcXVhbGlmeQorICAgICAqLworICAgIGN1cmxpbmUgPSAxOworICAgIGN1cml4ID0gc2l6ZSA9IDA7CisgICAgd2hpbGUgKGN1cml4IDwgYnVmLT5iX21sLm1sX3VzZWRjaHVua3MgLSAxCisJICAgICYmICgobGluZSAhPSAwCisJICAgICAmJiBsaW5lID49IGN1cmxpbmUgKyBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzKQorCQl8fCAob2Zmc2V0ICE9IDAKKwkgICAgICAgJiYgb2Zmc2V0ID4gc2l6ZSArIGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbY3VyaXhdLm1sY3NfdG90YWxzaXplCisJCSAgICAgICsgZmZkb3MgKiBidWYtPmJfbWwubWxfY2h1bmtzaXplW2N1cml4XS5tbGNzX251bWxpbmVzKSkpCisgICAgeworCWN1cmxpbmUgKz0gYnVmLT5iX21sLm1sX2NodW5rc2l6ZVtjdXJpeF0ubWxjc19udW1saW5lczsKKwlzaXplICs9IGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemVbY3VyaXhdLm1sY3NfdG90YWxzaXplOworCWlmIChvZmZzZXQgJiYgZmZkb3MpCisJICAgIHNpemUgKz0gYnVmLT5iX21sLm1sX2NodW5rc2l6ZVtjdXJpeF0ubWxjc19udW1saW5lczsKKwljdXJpeCsrOworICAgIH0KKworICAgIHdoaWxlICgobGluZSAhPSAwICYmIGN1cmxpbmUgPCBsaW5lKSB8fCAob2Zmc2V0ICE9IDAgJiYgc2l6ZSA8IG9mZnNldCkpCisgICAgeworCWlmIChjdXJsaW5lID4gYnVmLT5iX21sLm1sX2xpbmVfY291bnQKKwkJfHwgKGhwID0gbWxfZmluZF9saW5lKGJ1ZiwgY3VybGluZSwgTUxfRklORCkpID09IE5VTEwpCisJICAgIHJldHVybiAtMTsKKwlkcCA9IChEQVRBX0JMICopKGhwLT5iaF9kYXRhKTsKKwljb3VudCA9IChsb25nKShidWYtPmJfbWwubWxfbG9ja2VkX2hpZ2gpIC0KKwkJKGxvbmcpKGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93KSArIDE7CisJc3RhcnRfaWR4ID0gaWR4ID0gY3VybGluZSAtIGJ1Zi0+Yl9tbC5tbF9sb2NrZWRfbG93OworCWlmIChpZHggPT0gMCkvKiBmaXJzdCBsaW5lIGluIGJsb2NrLCB0ZXh0IGF0IHRoZSBlbmQgKi8KKwkgICAgdGV4dF9lbmQgPSBkcC0+ZGJfdHh0X2VuZDsKKwllbHNlCisJICAgIHRleHRfZW5kID0gKChkcC0+ZGJfaW5kZXhbaWR4IC0gMV0pICYgREJfSU5ERVhfTUFTSyk7CisJLyogQ29tcHV0ZSBpbmRleCBvZiBsYXN0IGxpbmUgdG8gdXNlIGluIHRoaXMgTUVNTElORSAqLworCWlmIChsaW5lICE9IDApCisJeworCSAgICBpZiAoY3VybGluZSArIChjb3VudCAtIGlkeCkgPj0gbGluZSkKKwkJaWR4ICs9IGxpbmUgLSBjdXJsaW5lIC0gMTsKKwkgICAgZWxzZQorCQlpZHggPSBjb3VudCAtIDE7CisJfQorCWVsc2UKKwl7CisJICAgIGV4dHJhID0gMDsKKwkgICAgd2hpbGUgKG9mZnNldCA+PSBzaXplCisJCSAgICAgICArIHRleHRfZW5kIC0gKGludCkoKGRwLT5kYl9pbmRleFtpZHhdKSAmIERCX0lOREVYX01BU0spCisJCQkJCQkJCSAgICAgICsgZmZkb3MpCisJICAgIHsKKwkJaWYgKGZmZG9zKQorCQkgICAgc2l6ZSsrOworCQlpZiAoaWR4ID09IGNvdW50IC0gMSkKKwkJeworCQkgICAgZXh0cmEgPSAxOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWR4Kys7CisJICAgIH0KKwl9CisJbGVuID0gdGV4dF9lbmQgLSAoKGRwLT5kYl9pbmRleFtpZHhdKSAmIERCX0lOREVYX01BU0spOworCXNpemUgKz0gbGVuOworCWlmIChvZmZzZXQgIT0gMCAmJiBzaXplID49IG9mZnNldCkKKwl7CisJICAgIGlmIChzaXplICsgZmZkb3MgPT0gb2Zmc2V0KQorCQkqb2ZmcCA9IDA7CisJICAgIGVsc2UgaWYgKGlkeCA9PSBzdGFydF9pZHgpCisJCSpvZmZwID0gb2Zmc2V0IC0gc2l6ZSArIGxlbjsKKwkgICAgZWxzZQorCQkqb2ZmcCA9IG9mZnNldCAtIHNpemUgKyBsZW4KKwkJICAgICAtICh0ZXh0X2VuZCAtICgoZHAtPmRiX2luZGV4W2lkeCAtIDFdKSAmIERCX0lOREVYX01BU0spKTsKKwkgICAgY3VybGluZSArPSBpZHggLSBzdGFydF9pZHggKyBleHRyYTsKKwkgICAgaWYgKGN1cmxpbmUgPiBidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJcmV0dXJuIC0xOwkvKiBleGFjdGx5IG9uZSBieXRlIGJleW9uZCB0aGUgZW5kICovCisJICAgIHJldHVybiBjdXJsaW5lOworCX0KKwljdXJsaW5lID0gYnVmLT5iX21sLm1sX2xvY2tlZF9oaWdoICsgMTsKKyAgICB9CisKKyAgICBpZiAoZmZkb3MpCisJc2l6ZSArPSBsaW5lIC0gMTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIEdvdG8gYnl0ZSBpbiBidWZmZXIgd2l0aCBvZmZzZXQgJ2NudCcuCisgKi8KKyAgICB2b2lkCitnb3RvX2J5dGUoY250KQorICAgIGxvbmcJY250OworeworICAgIGxvbmcJYm9mZiA9IGNudDsKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgbWxfZmx1c2hfbGluZShjdXJidWYpOwkvKiBjYWNoZWQgbGluZSBtYXkgYmUgZGlydHkgKi8KKyAgICBzZXRwY21hcmsoKTsKKyAgICBpZiAoYm9mZikKKwktLWJvZmY7CisgICAgbG51bSA9IG1sX2ZpbmRfbGluZV9vcl9vZmZzZXQoY3VyYnVmLCAobGluZW5yX1QpMCwgJmJvZmYpOworICAgIGlmIChsbnVtIDwgMSkJLyogcGFzdCB0aGUgZW5kICovCisgICAgeworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWN1cndpbi0+d19jdXJzd2FudCA9IE1BWENPTDsKKwljb2xhZHZhbmNlKChjb2xucl9UKU1BWENPTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IChjb2xucl9UKWJvZmY7CisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisgICAgfQorICAgIGNoZWNrX2N1cnNvcigpOworCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGN1cnNvciBpcyBvbiB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpLWJ5dGUgY2hhci4gKi8KKyAgICBpZiAoaGFzX21ieXRlKQorCW1iX2FkanVzdF9jdXJzb3IoKTsKKyMgZW5kaWYKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL21lbnUuYyBiL3NyYy9tZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyOTEwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZW51LmMKQEAgLTAsMCArMSwyMzg1IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIENvZGUgZm9yIG1lbnVzLiAgVXNlZCBmb3IgdGhlIEdVSSBhbmQgJ3dpbGRtZW51Jy4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgfHwgZGVmaW5lZChQUk9UTykKKworI2RlZmluZSBNRU5VREVQVEggICAxMAkJLyogbWF4aW11bSBkZXB0aCBvZiBtZW51cyAqLworCisjaWZkZWYgRkVBVF9HVUlfVzMyCitzdGF0aWMgaW50IGFkZF9tZW51X3BhdGggX19BUkdTKChjaGFyX3UgKiwgdmltbWVudV9UICosIGludCAqLCBjaGFyX3UgKiwgaW50KSk7CisjZWxzZQorc3RhdGljIGludCBhZGRfbWVudV9wYXRoIF9fQVJHUygoY2hhcl91ICosIHZpbW1lbnVfVCAqLCBpbnQgKiwgY2hhcl91ICopKTsKKyNlbmRpZgorc3RhdGljIGludCBtZW51X25hYmxlX3JlY3Vyc2UgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGNoYXJfdSAqbmFtZSwgaW50IG1vZGVzLCBpbnQgZW5hYmxlKSk7CitzdGF0aWMgaW50IHJlbW92ZV9tZW51IF9fQVJHUygodmltbWVudV9UICoqLCBjaGFyX3UgKiwgaW50LCBpbnQgc2lsZW50KSk7CitzdGF0aWMgdm9pZCBmcmVlX21lbnUgX19BUkdTKCh2aW1tZW51X1QgKiptZW51cCkpOworc3RhdGljIHZvaWQgZnJlZV9tZW51X3N0cmluZyBfX0FSR1MoKHZpbW1lbnVfVCAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgc2hvd19tZW51cyBfX0FSR1MoKGNoYXJfdSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHNob3dfbWVudXNfcmVjdXJzaXZlIF9fQVJHUygodmltbWVudV9UICosIGludCwgaW50KSk7CitzdGF0aWMgaW50IG1lbnVfbmFtZV9lcXVhbCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgdmltbWVudV9UICptZW51KSk7CitzdGF0aWMgaW50IG1lbnVfbmFtZWNtcCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgY2hhcl91ICptbmFtZSkpOworc3RhdGljIGludCBnZXRfbWVudV9jbWRfbW9kZXMgX19BUkdTKChjaGFyX3UgKiwgaW50LCBpbnQgKiwgaW50ICopKTsKK3N0YXRpYyBjaGFyX3UgKnBvcHVwX21vZGVfbmFtZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGlkeCkpOworc3RhdGljIGNoYXJfdSAqbWVudV90ZXh0IF9fQVJHUygoY2hhcl91ICp0ZXh0LCBpbnQgKm1uZW1vbmljLCBjaGFyX3UgKiphY3RleHQpKTsKKyNpZmRlZiBGRUFUX0dVSQorc3RhdGljIGludCBnZXRfbWVudV9tb2RlIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgZ3VpX3VwZGF0ZV9tZW51c19yZWN1cnNlIF9fQVJHUygodmltbWVudV9UICosIGludCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgZGVmaW5lZChGRUFUX1RFQVJPRkYpCitzdGF0aWMgdm9pZCBndWlfY3JlYXRlX3RlYXJvZmZzX3JlY3Vyc2UgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGNvbnN0IGNoYXJfdSAqcG5hbWUsIGludCAqcHJpX3RhYiwgaW50IHByaV9pZHgpKTsKK3N0YXRpYyB2b2lkIGd1aV9hZGRfdGVhcm9mZiBfX0FSR1MoKGNoYXJfdSAqdGVhcnBhdGgsIGludCAqcHJpX3RhYiwgaW50IHByaV9pZHgpKTsKK3N0YXRpYyB2b2lkIGd1aV9kZXN0cm95X3RlYXJvZmZzX3JlY3Vyc2UgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3N0YXRpYyBpbnQgc190ZWFyb2ZmcyA9IEZBTFNFOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbWVudV9pc19oaWRkZW4gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgKGRlZmluZWQoRkVBVF9HVUlfVzMyKSAmJiBkZWZpbmVkKEZFQVRfVEVBUk9GRikpCitzdGF0aWMgaW50IG1lbnVfaXNfdGVhcm9mZiBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTVVMVElfTEFORykgfHwgZGVmaW5lZChGRUFUX1RPT0xCQVIpCitzdGF0aWMgY2hhcl91ICptZW51X3NraXBfcGFydCBfX0FSR1MoKGNoYXJfdSAqcCkpOworI2VuZGlmCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCitzdGF0aWMgY2hhcl91ICptZW51dHJhbnNfbG9va3VwIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgbGVuKSk7CisjZW5kaWYKKworLyogVGhlIGNoYXJhY3RlciBmb3IgZWFjaCBtZW51IG1vZGUgKi8KK3N0YXRpYyBjaGFyX3UJbWVudV9tb2RlX2NoYXJzW10gPSB7J24nLCAndicsICdvJywgJ2knLCAnYycsICd0J307CisKK3N0YXRpYyBjaGFyX3UgZV9ub3RzdWJtZW51W10gPSBOXygiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiKTsKK3N0YXRpYyBjaGFyX3UgZV9vdGhlcm1vZGVbXSA9IE5fKCJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIpOworc3RhdGljIGNoYXJfdSBlX25vbWVudVtdID0gTl8oIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIik7CisKKyNpZmRlZiBGRUFUX1RPT0xCQVIKK3N0YXRpYyBjb25zdCBjaGFyICp0b29sYmFyX25hbWVzW10gPQoreworICAgIC8qICAwICovICJOZXciLCAiT3BlbiIsICJTYXZlIiwgIlVuZG8iLCAiUmVkbyIsCisgICAgLyogIDUgKi8gIkN1dCIsICJDb3B5IiwgIlBhc3RlIiwgIlByaW50IiwgIkhlbHAiLAorICAgIC8qIDEwICovICJGaW5kIiwgIlNhdmVBbGwiLCAiU2F2ZVNlc24iLCAiTmV3U2VzbiIsICJMb2FkU2VzbiIsCisgICAgLyogMTUgKi8gIlJ1blNjcmlwdCIsICJSZXBsYWNlIiwgIldpbkNsb3NlIiwgIldpbk1heCIsICJXaW5NaW4iLAorICAgIC8qIDIwICovICJXaW5TcGxpdCIsICJTaGVsbCIsICJGaW5kUHJldiIsICJGaW5kTmV4dCIsICJGaW5kSGVscCIsCisgICAgLyogMjUgKi8gIk1ha2UiLCAiVGFnSnVtcCIsICJSdW5DdGFncyIsICJXaW5WU3BsaXQiLCAiV2luTWF4V2lkdGgiLAorICAgIC8qIDMwICovICJXaW5NaW5XaWR0aCIsICJFeGl0IgorfTsKKyMgZGVmaW5lIFRPT0xCQVJfTkFNRV9DT1VOVCAoc2l6ZW9mKHRvb2xiYXJfbmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCisjZW5kaWYKKworLyoKKyAqIERvIHRoZSA6bWVudSBjb21tYW5kIGFuZCByZWxhdGl2ZXMuCisgKi8KKyAgICB2b2lkCitleF9tZW51KGVhcCkKKyAgICBleGFyZ19UCSplYXA7CQkgICAgLyogRXggY29tbWFuZCBhcmd1bWVudHMgKi8KK3sKKyAgICBjaGFyX3UJKm1lbnVfcGF0aDsKKyAgICBpbnQJCW1vZGVzOworICAgIGNoYXJfdQkqbWFwX3RvOworICAgIGludAkJbm9yZW1hcDsKKyAgICBpbnQJCXNpbGVudCA9IEZBTFNFOworICAgIGludAkJdW5tZW51OworICAgIGNoYXJfdQkqbWFwX2J1ZjsKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpOworI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmICFkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyAgICBpbnQJCW9sZF9tZW51X2hlaWdodDsKKyMgaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzE2KQorICAgIGludAkJb2xkX3Rvb2xiYXJfaGVpZ2h0OworIyBlbmRpZgorI2VuZGlmCisgICAgaW50CQlwcmlfdGFiW01FTlVERVBUSCArIDFdOworICAgIGludAkJZW5hYmxlID0gTUFZQkU7CSAgICAvKiBUUlVFIGZvciAibWVudSBlbmFibGUiLCBGQUxTRSBmb3IgIm1lbnUKKwkJCQkgICAgICogZGlzYWJsZSAqLworI2lmZGVmIEZFQVRfTVVMVElfTEFORworICAgIGNoYXJfdQkqdG9mcmVlID0gTlVMTDsKKyAgICBjaGFyX3UJKm5ld19jbWQ7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICBjaGFyX3UJKmljb24gPSBOVUxMOworI2VuZGlmCisgICAgdmltbWVudV9UCW1lbnVhcmc7CisKKyAgICBtb2RlcyA9IGdldF9tZW51X2NtZF9tb2RlcyhlYXAtPmNtZCwgZWFwLT5mb3JjZWl0LCAmbm9yZW1hcCwgJnVubWVudSk7CisgICAgYXJnID0gZWFwLT5hcmc7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoU1RSTkNNUChhcmcsICI8c2NyaXB0PiIsIDgpID09IDApCisJeworCSAgICBub3JlbWFwID0gUkVNQVBfU0NSSVBUOworCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnICsgOCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoU1RSTkNNUChhcmcsICI8c2lsZW50PiIsIDgpID09IDApCisJeworCSAgICBzaWxlbnQgPSBUUlVFOworCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnICsgOCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlicmVhazsKKyAgICB9CisKKworICAgIC8qIExvY2F0ZSBhbiBvcHRpb25hbCAiaWNvbj1maWxlbmFtZSIgYXJndW1lbnQuICovCisgICAgaWYgKFNUUk5DTVAoYXJnLCAiaWNvbj0iLCA1KSA9PSAwKQorICAgIHsKKwlhcmcgKz0gNTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwlpY29uID0gYXJnOworI2VuZGlmCisJd2hpbGUgKCphcmcgIT0gTlVMICYmICphcmcgIT0gJyAnKQorCXsKKwkgICAgaWYgKCphcmcgPT0gJ1xcJykKKwkJbWNoX21lbW1vdmUoYXJnLCBhcmcgKyAxLCBTVFJMRU4oYXJnKSk7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlhcmcgKz0gKCptYl9wdHIybGVuX2NoZWNrKShhcmcpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKythcmc7CisJfQorCWlmICgqYXJnICE9IE5VTCkKKwl7CisJICAgICphcmcrKyA9IE5VTDsKKwkgICAgYXJnID0gc2tpcHdoaXRlKGFyZyk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgcHJpb3JpdHkgdGFibGUuCisgICAgICovCisgICAgZm9yIChwID0gYXJnOyAqcDsgKytwKQorCWlmICghVklNX0lTRElHSVQoKnApICYmICpwICE9ICcuJykKKwkgICAgYnJlYWs7CisgICAgaWYgKHZpbV9pc3doaXRlKCpwKSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IE1FTlVERVBUSCAmJiAhdmltX2lzd2hpdGUoKmFyZyk7ICsraSkKKwl7CisJICAgIHByaV90YWJbaV0gPSBnZXRkaWdpdHMoJmFyZyk7CisJICAgIGlmIChwcmlfdGFiW2ldID09IDApCisJCXByaV90YWJbaV0gPSA1MDA7CisJICAgIGlmICgqYXJnID09ICcuJykKKwkJKythcmc7CisJfQorCWFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIH0KKyAgICBlbHNlIGlmIChlYXAtPmFkZHJfY291bnQgJiYgZWFwLT5saW5lMiAhPSAwKQorICAgIHsKKwlwcmlfdGFiWzBdID0gZWFwLT5saW5lMjsKKwlpID0gMTsKKyAgICB9CisgICAgZWxzZQorCWkgPSAwOworICAgIHdoaWxlIChpIDwgTUVOVURFUFRIKQorCXByaV90YWJbaSsrXSA9IDUwMDsKKyAgICBwcmlfdGFiW01FTlVERVBUSF0gPSAtMTsJCS8qIG1hcmsgZW5kIG9mIHRoZSB0YWJsZSAqLworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgImRpc2FibGUiIG9yICJlbmFibGUiIGFyZ3VtZW50LgorICAgICAqLworICAgIGlmIChTVFJOQ01QKGFyZywgImVuYWJsZSIsIDYpID09IDAgJiYgdmltX2lzd2hpdGUoYXJnWzZdKSkKKyAgICB7CisJZW5hYmxlID0gVFJVRTsKKwlhcmcgPSBza2lwd2hpdGUoYXJnICsgNik7CisgICAgfQorICAgIGVsc2UgaWYgKFNUUk5DTVAoYXJnLCAiZGlzYWJsZSIsIDcpID09IDAgJiYgdmltX2lzd2hpdGUoYXJnWzddKSkKKyAgICB7CisJZW5hYmxlID0gRkFMU0U7CisJYXJnID0gc2tpcHdoaXRlKGFyZyArIDcpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIGRpc3BsYXkgYWxsIG1lbnVzLgorICAgICAqLworICAgIGlmICgqYXJnID09IE5VTCkKKyAgICB7CisJc2hvd19tZW51cyhhcmcsIG1vZGVzKTsKKwlyZXR1cm47CisgICAgfQorCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgLyoKKyAgICAgKiBOZWVkIHRvIGdldCB0aGUgdG9vbGJhciBpY29uIGluZGV4IGJlZm9yZSBkb2luZyB0aGUgdHJhbnNsYXRpb24uCisgICAgICovCisgICAgbWVudWFyZy5pY29uaWR4ID0gLTE7CisgICAgbWVudWFyZy5pY29uX2J1aWx0aW4gPSBGQUxTRTsKKyAgICBpZiAobWVudV9pc190b29sYmFyKGFyZykpCisgICAgeworCW1lbnVfcGF0aCA9IG1lbnVfc2tpcF9wYXJ0KGFyZyk7CisJaWYgKCptZW51X3BhdGggPT0gJy4nKQorCXsKKwkgICAgcCA9IG1lbnVfc2tpcF9wYXJ0KCsrbWVudV9wYXRoKTsKKwkgICAgaWYgKFNUUk5DTVAobWVudV9wYXRoLCAiQnVpbHRJbiIsIDcpID09IDApCisJICAgIHsKKwkJaWYgKHNraXBkaWdpdHMobWVudV9wYXRoICsgNykgPT0gcCkKKwkJeworCQkgICAgbWVudWFyZy5pY29uaWR4ID0gYXRvaSgoY2hhciAqKW1lbnVfcGF0aCArIDcpOworCQkgICAgaWYgKG1lbnVhcmcuaWNvbmlkeCA+PSBUT09MQkFSX05BTUVfQ09VTlQpCisJCQltZW51YXJnLmljb25pZHggPSAtMTsKKwkJICAgIGVsc2UKKwkJCW1lbnVhcmcuaWNvbl9idWlsdGluID0gVFJVRTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlmb3IgKGkgPSAwOyBpIDwgVE9PTEJBUl9OQU1FX0NPVU5UOyArK2kpCisJCSAgICBpZiAoU1RSTkNNUCh0b29sYmFyX25hbWVzW2ldLCBtZW51X3BhdGgsIHAgLSBtZW51X3BhdGgpCisJCQkJCQkJCQkgPT0gMCkKKwkJICAgIHsKKwkJCW1lbnVhcmcuaWNvbmlkeCA9IGk7CisJCQlicmVhazsKKwkJICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTVVMVElfTEFORworICAgIC8qCisgICAgICogVHJhbnNsYXRlIG1lbnUgbmFtZXMgYXMgc3BlY2lmaWVkIHdpdGggIjptZW51dHJhbnMiIGNvbW1hbmRzLgorICAgICAqLworICAgIG1lbnVfcGF0aCA9IGFyZzsKKyAgICB3aGlsZSAoKm1lbnVfcGF0aCkKKyAgICB7CisJLyogZmluZCB0aGUgZW5kIG9mIG9uZSBwYXJ0IGFuZCBjaGVjayBpZiBpdCBzaG91bGQgYmUgdHJhbnNsYXRlZCAqLworCXAgPSBtZW51X3NraXBfcGFydChtZW51X3BhdGgpOworCW1hcF90byA9IG1lbnV0cmFuc19sb29rdXAobWVudV9wYXRoLCAoaW50KShwIC0gbWVudV9wYXRoKSk7CisJaWYgKG1hcF90byAhPSBOVUxMKQorCXsKKwkgICAgLyogZm91bmQgYSBtYXRjaDogcmVwbGFjZSB3aXRoIHRoZSB0cmFuc2xhdGVkIHBhcnQgKi8KKwkgICAgaSA9IChpbnQpU1RSTEVOKG1hcF90byk7CisJICAgIG5ld19jbWQgPSBhbGxvYygodW5zaWduZWQpU1RSTEVOKGFyZykgKyBpICsgMSk7CisJICAgIGlmIChuZXdfY21kID09IE5VTEwpCisJCWJyZWFrOworCSAgICBtY2hfbWVtbW92ZShuZXdfY21kLCBhcmcsIG1lbnVfcGF0aCAtIGFyZyk7CisJICAgIG1jaF9tZW1tb3ZlKG5ld19jbWQgKyAobWVudV9wYXRoIC0gYXJnKSwgbWFwX3RvLCAoc2l6ZV90KWkpOworCSAgICBTVFJDUFkobmV3X2NtZCArIChtZW51X3BhdGggLSBhcmcpICsgaSwgcCk7CisJICAgIHAgPSBuZXdfY21kICsgKG1lbnVfcGF0aCAtIGFyZykgKyBpOworCSAgICB2aW1fZnJlZSh0b2ZyZWUpOworCSAgICB0b2ZyZWUgPSBuZXdfY21kOworCSAgICBhcmcgPSBuZXdfY21kOworCX0KKwlpZiAoKnAgIT0gJy4nKQorCSAgICBicmVhazsKKwltZW51X3BhdGggPSBwICsgMTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogSXNvbGF0ZSB0aGUgbWVudSBuYW1lLgorICAgICAqIFNraXAgdGhlIG1lbnUgbmFtZSwgYW5kIHRyYW5zbGF0ZSA8VGFiPiBpbnRvIGEgcmVhbCBUQUIuCisgICAgICovCisgICAgbWVudV9wYXRoID0gYXJnOworICAgIGlmICgqbWVudV9wYXRoID09ICcuJykKKyAgICB7CisJRU1TRzIoXyhlX2ludmFyZzIpLCBtZW51X3BhdGgpOworCWdvdG8gdGhlZW5kOworICAgIH0KKworICAgIHdoaWxlICgqYXJnICYmICF2aW1faXN3aGl0ZSgqYXJnKSkKKyAgICB7CisJaWYgKCgqYXJnID09ICdcXCcgfHwgKmFyZyA9PSBDdHJsX1YpICYmIGFyZ1sxXSAhPSBOVUwpCisJICAgIGFyZysrOworCWVsc2UgaWYgKFNUUk5JQ01QKGFyZywgIjxUQUI+IiwgNSkgPT0gMCkKKwl7CisJICAgICphcmcgPSBUQUI7CisJICAgIG1jaF9tZW1tb3ZlKGFyZyArIDEsIGFyZyArIDUsIFNUUkxFTihhcmcgKyA0KSk7CisJfQorCWFyZysrOworICAgIH0KKyAgICBpZiAoKmFyZyAhPSBOVUwpCisJKmFyZysrID0gTlVMOworICAgIGFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIG1hcF90byA9IGFyZzsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgb25seSBhIG1lbnUgbmFtZSwgZGlzcGxheSBtZW51cyB3aXRoIHRoYXQgbmFtZS4KKyAgICAgKi8KKyAgICBpZiAoKm1hcF90byA9PSBOVUwgJiYgIXVubWVudSAmJiBlbmFibGUgPT0gTUFZQkUpCisgICAgeworCXNob3dfbWVudXMobWVudV9wYXRoLCBtb2Rlcyk7CisJZ290byB0aGVlbmQ7CisgICAgfQorICAgIGVsc2UgaWYgKCptYXBfdG8gIT0gTlVMICYmICh1bm1lbnUgfHwgZW5hYmxlICE9IE1BWUJFKSkKKyAgICB7CisJRU1TRyhfKGVfdHJhaWxpbmcpKTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgIShkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pKQorICAgIG9sZF9tZW51X2hlaWdodCA9IGd1aS5tZW51X2hlaWdodDsKKyMgaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzE2KQorICAgIG9sZF90b29sYmFyX2hlaWdodCA9IGd1aS50b29sYmFyX2hlaWdodDsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgaWYgKGVuYWJsZSAhPSBNQVlCRSkKKyAgICB7CisJLyoKKwkgKiBDaGFuZ2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIG1lbnUuCisJICogRm9yIHRoZSBQb3BVcCBtZW51LCByZW1vdmUgYSBtZW51IGZvciBlYWNoIG1vZGUgc2VwYXJhdGVseS4KKwkgKiBDYXJlZnVsOiBtZW51X25hYmxlX3JlY3Vyc2UoKSBjaGFuZ2VzIG1lbnVfcGF0aC4KKwkgKi8KKwlpZiAoU1RSQ01QKG1lbnVfcGF0aCwgIioiKSA9PSAwKQkvKiBtZWFuaW5nOiBkbyBhbGwgbWVudXMgKi8KKwkgICAgbWVudV9wYXRoID0gKGNoYXJfdSAqKSIiOworCisJaWYgKG1lbnVfaXNfcG9wdXAobWVudV9wYXRoKSkKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBNRU5VX0lOREVYX1RJUDsgKytpKQorCQlpZiAobW9kZXMgJiAoMSA8PCBpKSkKKwkJeworCQkgICAgcCA9IHBvcHVwX21vZGVfbmFtZShtZW51X3BhdGgsIGkpOworCQkgICAgaWYgKHAgIT0gTlVMTCkKKwkJICAgIHsKKwkJCW1lbnVfbmFibGVfcmVjdXJzZShyb290X21lbnUsIHAsIE1FTlVfQUxMX01PREVTLAorCQkJCQkJCQkgICAgICBlbmFibGUpOworCQkJdmltX2ZyZWUocCk7CisJCSAgICB9CisJCX0KKwl9CisJbWVudV9uYWJsZV9yZWN1cnNlKHJvb3RfbWVudSwgbWVudV9wYXRoLCBtb2RlcywgZW5hYmxlKTsKKyAgICB9CisgICAgZWxzZSBpZiAodW5tZW51KQorICAgIHsKKwkvKgorCSAqIERlbGV0ZSBtZW51KHMpLgorCSAqLworCWlmIChTVFJDTVAobWVudV9wYXRoLCAiKiIpID09IDApCS8qIG1lYW5pbmc6IHJlbW92ZSBhbGwgbWVudXMgKi8KKwkgICAgbWVudV9wYXRoID0gKGNoYXJfdSAqKSIiOworCisJLyoKKwkgKiBGb3IgdGhlIFBvcFVwIG1lbnUsIHJlbW92ZSBhIG1lbnUgZm9yIGVhY2ggbW9kZSBzZXBhcmF0ZWx5LgorCSAqLworCWlmIChtZW51X2lzX3BvcHVwKG1lbnVfcGF0aCkpCisJeworCSAgICBmb3IgKGkgPSAwOyBpIDwgTUVOVV9JTkRFWF9USVA7ICsraSkKKwkJaWYgKG1vZGVzICYgKDEgPDwgaSkpCisJCXsKKwkJICAgIHAgPSBwb3B1cF9tb2RlX25hbWUobWVudV9wYXRoLCBpKTsKKwkJICAgIGlmIChwICE9IE5VTEwpCisJCSAgICB7CisJCQlyZW1vdmVfbWVudSgmcm9vdF9tZW51LCBwLCBNRU5VX0FMTF9NT0RFUywgVFJVRSk7CisJCQl2aW1fZnJlZShwKTsKKwkJICAgIH0KKwkJfQorCX0KKworCS8qIENhcmVmdWw6IHJlbW92ZV9tZW51KCkgY2hhbmdlcyBtZW51X3BhdGggKi8KKwlyZW1vdmVfbWVudSgmcm9vdF9tZW51LCBtZW51X3BhdGgsIG1vZGVzLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBBZGQgbWVudShzKS4KKwkgKiBSZXBsYWNlIHNwZWNpYWwga2V5IGNvZGVzLgorCSAqLworCWlmIChTVFJJQ01QKG1hcF90bywgIjxub3A+IikgPT0gMCkJLyogIjxOb3A+IiBtZWFucyBub3RoaW5nICovCisJeworCSAgICBtYXBfdG8gPSAoY2hhcl91ICopIiI7CisJICAgIG1hcF9idWYgPSBOVUxMOworCX0KKwllbHNlCisJICAgIG1hcF90byA9IHJlcGxhY2VfdGVybWNvZGVzKG1hcF90bywgJm1hcF9idWYsIEZBTFNFLCBUUlVFKTsKKwltZW51YXJnLm1vZGVzID0gbW9kZXM7CisjaWZkZWYgRkVBVF9UT09MQkFSCisJbWVudWFyZy5pY29uZmlsZSA9IGljb247CisjZW5kaWYKKwltZW51YXJnLm5vcmVtYXBbMF0gPSBub3JlbWFwOworCW1lbnVhcmcuc2lsZW50WzBdID0gc2lsZW50OworCWFkZF9tZW51X3BhdGgobWVudV9wYXRoLCAmbWVudWFyZywgcHJpX3RhYiwgbWFwX3RvCisjaWZkZWYgRkVBVF9HVUlfVzMyCisJCSwgVFJVRQorI2VuZGlmCisJCSk7CisKKwkvKgorCSAqIEZvciB0aGUgUG9wVXAgbWVudSwgYWRkIGEgbWVudSBmb3IgZWFjaCBtb2RlIHNlcGFyYXRlbHkuCisJICovCisJaWYgKG1lbnVfaXNfcG9wdXAobWVudV9wYXRoKSkKKwl7CisJICAgIGZvciAoaSA9IDA7IGkgPCBNRU5VX0lOREVYX1RJUDsgKytpKQorCQlpZiAobW9kZXMgJiAoMSA8PCBpKSkKKwkJeworCQkgICAgcCA9IHBvcHVwX21vZGVfbmFtZShtZW51X3BhdGgsIGkpOworCQkgICAgaWYgKHAgIT0gTlVMTCkKKwkJICAgIHsKKwkJCS8qIEluY2x1ZGUgYWxsIG1vZGVzLCB0byBtYWtlICI6YW1lbnUiIHdvcmsgKi8KKwkJCW1lbnVhcmcubW9kZXMgPSBtb2RlczsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwkJCW1lbnVhcmcuaWNvbmZpbGUgPSBOVUxMOworCQkJbWVudWFyZy5pY29uaWR4ID0gLTE7CisJCQltZW51YXJnLmljb25fYnVpbHRpbiA9IEZBTFNFOworI2VuZGlmCisJCQlhZGRfbWVudV9wYXRoKHAsICZtZW51YXJnLCBwcmlfdGFiLCBtYXBfdG8KKyNpZmRlZiBGRUFUX0dVSV9XMzIKKwkJCQksIFRSVUUKKyNlbmRpZgorCQkJCQkgKTsKKwkJCXZpbV9mcmVlKHApOworCQkgICAgfQorCQl9CisJfQorCisJdmltX2ZyZWUobWFwX2J1Zik7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKQorICAgIC8qIElmIHRoZSBtZW51YmFyIGhlaWdodCBjaGFuZ2VkLCByZXNpemUgdGhlIHdpbmRvdyAqLworICAgIGlmIChndWkuaW5fdXNlCisJICAgICYmIChndWkubWVudV9oZWlnaHQgIT0gb2xkX21lbnVfaGVpZ2h0CisjIGlmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1cxNikKKwkJfHwgZ3VpLnRvb2xiYXJfaGVpZ2h0ICE9IG9sZF90b29sYmFyX2hlaWdodAorIyBlbmRpZgorCSAgICApKQorCWd1aV9zZXRfc2hlbGxzaXplKEZBTFNFLCBGQUxTRSk7CisjZW5kaWYKKwordGhlZW5kOgorI2lmZGVmIEZFQVRfTVVMVElfTEFORworICAgIHZpbV9mcmVlKHRvZnJlZSk7CisjZWxzZQorICAgIDsKKyNlbmRpZgorfQorCisvKgorICogQWRkIHRoZSBtZW51IHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIG1lbnUgaGllcmFyY2h5CisgKi8KKyAgICBzdGF0aWMgaW50CithZGRfbWVudV9wYXRoKG1lbnVfcGF0aCwgbWVudWFyZywgcHJpX3RhYiwgY2FsbF9kYXRhCisjaWZkZWYgRkVBVF9HVUlfVzMyCisJLCBhZGR0ZWFyb2ZmCisjZW5kaWYKKwkpCisgICAgY2hhcl91CSptZW51X3BhdGg7CisgICAgdmltbWVudV9UCSptZW51YXJnOwkvKiBwYXNzZXMgbW9kZXMsIGljb25maWxlLCBpY29uaWR4LAorCQkJCSAgIGljb25fYnVpbHRpbiwgc2lsZW50WzBdLCBub3JlbWFwWzBdICovCisgICAgaW50CQkqcHJpX3RhYjsKKyAgICBjaGFyX3UJKmNhbGxfZGF0YTsKKyNpZmRlZiBGRUFUX0dVSV9XMzIKKyAgICBpbnQJCWFkZHRlYXJvZmY7CS8qIG1heSBhZGQgdGVhcm9mZiBpdGVtICovCisjZW5kaWYKK3sKKyAgICBjaGFyX3UJKnBhdGhfbmFtZTsKKyAgICBpbnQJCW1vZGVzID0gbWVudWFyZy0+bW9kZXM7CisgICAgdmltbWVudV9UCSoqbWVudXA7CisgICAgdmltbWVudV9UCSptZW51ID0gTlVMTDsKKyAgICB2aW1tZW51X1QJKnBhcmVudDsKKyAgICB2aW1tZW51X1QJKipsb3dlcl9wcmk7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBjaGFyX3UJKmRuYW1lOworICAgIGNoYXJfdQkqbmV4dF9uYW1lOworICAgIGludAkJaTsKKyAgICBpbnQJCWM7CisjaWZkZWYgRkVBVF9HVUkKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCW5ld19pZHg7CisjZW5kaWYKKyAgICBpbnQJCXByaV9pZHggPSAwOworICAgIGludAkJb2xkX21vZGVzID0gMDsKKyAgICBpbnQJCWFtZW51OworCisgICAgLyogTWFrZSBhIGNvcHkgc28gd2UgY2FuIHN0dWZmIGFyb3VuZCB3aXRoIGl0LCBzaW5jZSBpdCBjb3VsZCBiZSBjb25zdCAqLworICAgIHBhdGhfbmFtZSA9IHZpbV9zdHJzYXZlKG1lbnVfcGF0aCk7CisgICAgaWYgKHBhdGhfbmFtZSA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIG1lbnVwID0gJnJvb3RfbWVudTsKKyAgICBwYXJlbnQgPSBOVUxMOworICAgIG5hbWUgPSBwYXRoX25hbWU7CisgICAgd2hpbGUgKCpuYW1lKQorICAgIHsKKwkvKiBHZXQgbmFtZSBvZiB0aGlzIGVsZW1lbnQgaW4gdGhlIG1lbnUgaGllcmFyY2h5LCBhbmQgdGhlIHNpbXBsaWZpZWQKKwkgKiBuYW1lICh3aXRob3V0IG1uZW1vbmljIGFuZCBhY2NlbGVyYXRvciB0ZXh0KS4gKi8KKwluZXh0X25hbWUgPSBtZW51X25hbWVfc2tpcChuYW1lKTsKKwlkbmFtZSA9IG1lbnVfdGV4dChuYW1lLCBOVUxMLCBOVUxMKTsKKworCS8qIFNlZSBpZiBpdCdzIGFscmVhZHkgdGhlcmUgKi8KKwlsb3dlcl9wcmkgPSBtZW51cDsKKyNpZmRlZiBGRUFUX0dVSQorCWlkeCA9IDA7CisJbmV3X2lkeCA9IDA7CisjZW5kaWYKKwltZW51ID0gKm1lbnVwOworCXdoaWxlIChtZW51ICE9IE5VTEwpCisJeworCSAgICBpZiAobWVudV9uYW1lX2VxdWFsKG5hbWUsIG1lbnUpIHx8IG1lbnVfbmFtZV9lcXVhbChkbmFtZSwgbWVudSkpCisJICAgIHsKKwkJaWYgKCpuZXh0X25hbWUgPT0gTlVMICYmIG1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCisJCXsKKwkJICAgIGlmICghc3lzX21lbnUpCisJCQlFTVNHKF8oIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiKSk7CisJCSAgICBnb3RvIGVycmV0OworCQl9CisJCWlmICgqbmV4dF9uYW1lICE9IE5VTCAmJiBtZW51LT5jaGlsZHJlbiA9PSBOVUxMCisjaWZkZWYgRkVBVF9HVUlfVzMyCisJCQkmJiBhZGR0ZWFyb2ZmCisjZW5kaWYKKwkJCSkKKwkJeworCQkgICAgaWYgKCFzeXNfbWVudSkKKwkJCUVNU0coXyhlX25vdHN1Ym1lbnUpKTsKKwkJICAgIGdvdG8gZXJyZXQ7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbWVudXAgPSAmbWVudS0+bmV4dDsKKworCSAgICAvKiBDb3VudCBtZW51cywgdG8gZmluZCB3aGVyZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBpbnNlcnRlZC4KKwkgICAgICogSWdub3JlIG1lbnVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgbWVudWJhciAoUG9wVXAgYW5kIFRvb2xiYXIpICovCisJICAgIGlmIChwYXJlbnQgIT0gTlVMTCB8fCBtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisJICAgIHsKKyNpZmRlZiBGRUFUX0dVSQorCQkrK2lkeDsKKyNlbmRpZgorCQlpZiAobWVudS0+cHJpb3JpdHkgPD0gcHJpX3RhYltwcmlfaWR4XSkKKwkJeworCQkgICAgbG93ZXJfcHJpID0gbWVudXA7CisjaWZkZWYgRkVBVF9HVUkKKwkJICAgIG5ld19pZHggPSBpZHg7CisjZW5kaWYKKwkJfQorCSAgICB9CisJICAgIG1lbnUgPSBtZW51LT5uZXh0OworCX0KKworCWlmIChtZW51ID09IE5VTEwpCisJeworCSAgICBpZiAoKm5leHRfbmFtZSA9PSBOVUwgJiYgcGFyZW50ID09IE5VTEwpCisJICAgIHsKKwkJRU1TRyhfKCJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIpKTsKKwkJZ290byBlcnJldDsKKwkgICAgfQorCisJICAgIGlmIChtZW51X2lzX3NlcGFyYXRvcihkbmFtZSkgJiYgKm5leHRfbmFtZSAhPSBOVUwpCisJICAgIHsKKwkJRU1TRyhfKCJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiKSk7CisJCWdvdG8gZXJyZXQ7CisJICAgIH0KKworCSAgICAvKiBOb3QgYWxyZWFkeSB0aGVyZSwgc28gbGV0cyBhZGQgaXQgKi8KKwkgICAgbWVudSA9ICh2aW1tZW51X1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKHZpbW1lbnVfVCkpOworCSAgICBpZiAobWVudSA9PSBOVUxMKQorCQlnb3RvIGVycmV0OworCisJICAgIG1lbnUtPm1vZGVzID0gbW9kZXM7CisJICAgIG1lbnUtPmVuYWJsZWQgPSBNRU5VX0FMTF9NT0RFUzsKKwkgICAgbWVudS0+bmFtZSA9IHZpbV9zdHJzYXZlKG5hbWUpOworCSAgICAvKiBzZXBhcmF0ZSBtbmVtb25pYyBhbmQgYWNjZWxlcmF0b3IgdGV4dCBmcm9tIGFjdHVhbCBtZW51IG5hbWUgKi8KKwkgICAgbWVudS0+ZG5hbWUgPSBtZW51X3RleHQobmFtZSwgJm1lbnUtPm1uZW1vbmljLCAmbWVudS0+YWN0ZXh0KTsKKwkgICAgbWVudS0+cHJpb3JpdHkgPSBwcmlfdGFiW3ByaV9pZHhdOworCSAgICBtZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisjaWZkZWYgRkVBVF9HVUlfTU9USUYKKwkgICAgbWVudS0+c2Vuc2l0aXZlID0gVFJVRTsJICAgIC8qIHRoZSBkZWZhdWx0ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0JFVkFMX1RJUAorCSAgICBtZW51LT50aXAgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfQVRIRU5BCisJICAgIG1lbnUtPmltYWdlID0gTm9uZTsJCSAgICAvKiBYLVdpbmRvd3MgZGVmaW5pdGlvbiBmb3IgTlVMTCovCisjZW5kaWYKKworCSAgICAvKgorCSAgICAgKiBBZGQgYWZ0ZXIgbWVudSB0aGF0IGhhcyBsb3dlciBwcmlvcml0eS4KKwkgICAgICovCisJICAgIG1lbnUtPm5leHQgPSAqbG93ZXJfcHJpOworCSAgICAqbG93ZXJfcHJpID0gbWVudTsKKworCSAgICBvbGRfbW9kZXMgPSAwOworCisjaWZkZWYgRkVBVF9UT09MQkFSCisJICAgIG1lbnUtPmljb25pZHggPSBtZW51YXJnLT5pY29uaWR4OworCSAgICBtZW51LT5pY29uX2J1aWx0aW4gPSBtZW51YXJnLT5pY29uX2J1aWx0aW47CisJICAgIGlmICgqbmV4dF9uYW1lID09IE5VTCAmJiBtZW51YXJnLT5pY29uZmlsZSAhPSBOVUxMKQorCQltZW51LT5pY29uZmlsZSA9IHZpbV9zdHJzYXZlKG1lbnVhcmctPmljb25maWxlKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUlfVzMyKSAmJiBkZWZpbmVkKEZFQVRfVEVBUk9GRikKKwkgICAgLyogdGhlIHRlYXJvZmYgaXRlbSBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIG1vZGVzIG9mIGVhY2ggaXRlbS4gKi8KKwkgICAgaWYgKHBhcmVudCAhPSBOVUxMICYmIG1lbnVfaXNfdGVhcm9mZihwYXJlbnQtPmNoaWxkcmVuLT5kbmFtZSkpCisJCXBhcmVudC0+Y2hpbGRyZW4tPm1vZGVzIHw9IG1vZGVzOworI2VuZGlmCisJfQorCWVsc2UKKwl7CisJICAgIG9sZF9tb2RlcyA9IG1lbnUtPm1vZGVzOworCisJICAgIC8qCisJICAgICAqIElmIHRoaXMgbWVudSBvcHRpb24gd2FzIHByZXZpb3VzbHkgb25seSBhdmFpbGFibGUgaW4gb3RoZXIKKwkgICAgICogbW9kZXMsIHRoZW4gbWFrZSBzdXJlIGl0J3MgYXZhaWxhYmxlIGZvciB0aGlzIG9uZSBub3cKKwkgICAgICogQWxzbyBlbmFibGUgYSBtZW51IHdoZW4gaXQncyBjcmVhdGVkIG9yIGNoYW5nZWQuCisJICAgICAqLworI2lmZGVmIEZFQVRfR1VJX1czMgorCSAgICAvKiBJZiBhZGRpbmcgYSB0ZWFyYmFyIChhZGR0ZWFyb2ZmID09IEZBTFNFKSBkb24ndCB1cGRhdGUgbW9kZXMgKi8KKwkgICAgaWYgKGFkZHRlYXJvZmYpCisjZW5kaWYKKwkgICAgeworCQltZW51LT5tb2RlcyB8PSBtb2RlczsKKwkJbWVudS0+ZW5hYmxlZCB8PSBtb2RlczsKKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfR1VJCisJLyoKKwkgKiBBZGQgdGhlIG1lbnUgaXRlbSB3aGVuIGl0J3MgdXNlZCBpbiBvbmUgb2YgdGhlIG1vZGVzLCBidXQgbm90IHdoZW4KKwkgKiBvbmx5IGEgdG9vbHRpcCBpcyBkZWZpbmVkLgorCSAqLworCWlmICgob2xkX21vZGVzICYgTUVOVV9BTExfTU9ERVMpID09IDAKKwkJJiYgKG1lbnUtPm1vZGVzICYgTUVOVV9BTExfTU9ERVMpICE9IDApCisJeworCSAgICBpZiAoZ3VpLmluX3VzZSkgIC8qIE90aGVyd2lzZSBpdCB3aWxsIGJlIGFkZGVkIHdoZW4gR1VJIHN0YXJ0cyAqLworCSAgICB7CisJCWlmICgqbmV4dF9uYW1lID09IE5VTCkKKwkJeworCQkgICAgLyogUmVhbCBtZW51IGl0ZW0sIG5vdCBzdWItbWVudSAqLworCQkgICAgZ3VpX21jaF9hZGRfbWVudV9pdGVtKG1lbnUsIG5ld19pZHgpOworCisJCSAgICAvKiBXYW50IHRvIHVwZGF0ZSBtZW51cyBub3cgZXZlbiBpZiBtb2RlIG5vdCBjaGFuZ2VkICovCisJCSAgICBmb3JjZV9tZW51X3VwZGF0ZSA9IFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBTdWItbWVudSAobm90IGF0IGVuZCBvZiBwYXRoIHlldCkgKi8KKwkJICAgIGd1aV9tY2hfYWRkX21lbnUobWVudSwgbmV3X2lkeCk7CisJCX0KKwkgICAgfQorCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfVzMyKSAmIGRlZmluZWQoRkVBVF9URUFST0ZGKQorCSAgICAvKiBXaGVuIGFkZGluZyBhIG5ldyBzdWJtZW51LCBtYXkgYWRkIGEgdGVhcm9mZiBpdGVtICovCisJICAgIGlmICgJYWRkdGVhcm9mZgorCQkgICAgJiYgKm5leHRfbmFtZQorCQkgICAgJiYgdmltX3N0cmNocihwX2dvLCBHT19URUFST0ZGKSAhPSBOVUxMCisJCSAgICAmJiBtZW51X2lzX21lbnViYXIobmFtZSkpCisJICAgIHsKKwkJY2hhcl91CQkqdGVhcnBhdGg7CisKKwkJLyoKKwkJICogVGhlIHBvaW50ZXJzIG5leHRfbmFtZSAmIHBhdGhfbmFtZSByZWZlciB0byBhIHN0cmluZyB3aXRoCisJCSAqIFwncyBhbmQgXlYncyBzdHJpcHBlZCBvdXQuIEJ1dCBtZW51X3BhdGggaXMgYSAicmF3IgorCQkgKiBzdHJpbmcsIHNvIHdlIG11c3QgY29ycmVjdCBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLgorCQkgKi8KKwkJdGVhcnBhdGggPSBhbGxvYygodW5zaWduZWQgaW50KVNUUkxFTihtZW51X3BhdGgpICsgVEVBUl9MRU4gKyAyKTsKKwkJaWYgKHRlYXJwYXRoICE9IE5VTEwpCisJCXsKKwkJICAgIGNoYXJfdSAgKnM7CisJCSAgICBpbnQJICAgIGlkeDsKKworCQkgICAgU1RSQ1BZKHRlYXJwYXRoLCBtZW51X3BhdGgpOworCQkgICAgaWR4ID0gKGludCkobmV4dF9uYW1lIC0gcGF0aF9uYW1lIC0gMSk7CisJCSAgICBmb3IgKHMgPSB0ZWFycGF0aDsgKnMgJiYgcyA8IHRlYXJwYXRoICsgaWR4OyArK3MpCisJCSAgICB7CisJCQlpZiAoKCpzID09ICdcXCcgfHwgKnMgPT0gQ3RybF9WKSAmJiBzWzFdKQorCQkJeworCQkJICAgICsraWR4OworCQkJICAgICsrczsKKwkJCX0KKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJCWlmIChoYXNfbWJ5dGUpCisJCQkgICAgcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpIC0gMTsKKyMgIGVuZGlmCisJCSAgICB9CisJCSAgICB0ZWFycGF0aFtpZHhdID0gTlVMOworCQkgICAgZ3VpX2FkZF90ZWFyb2ZmKHRlYXJwYXRoLCBwcmlfdGFiLCBwcmlfaWR4KTsKKwkJICAgIHZpbV9mcmVlKHRlYXJwYXRoKTsKKwkJfQorCSAgICB9CisjIGVuZGlmCisJfQorI2VuZGlmIC8qIEZFQVRfR1VJICovCisKKwltZW51cCA9ICZtZW51LT5jaGlsZHJlbjsKKwlwYXJlbnQgPSBtZW51OworCW5hbWUgPSBuZXh0X25hbWU7CisJdmltX2ZyZWUoZG5hbWUpOworCWlmIChwcmlfdGFiW3ByaV9pZHggKyAxXSAhPSAtMSkKKwkgICAgKytwcmlfaWR4OworICAgIH0KKyAgICB2aW1fZnJlZShwYXRoX25hbWUpOworCisgICAgLyoKKyAgICAgKiBPbmx5IGFkZCBzeXN0ZW0gbWVudSBpdGVtcyB3aGljaCBoYXZlIG5vdCBiZWVuIGRlZmluZWQgeWV0LgorICAgICAqIEZpcnN0IGNoZWNrIGlmIHRoaXMgd2FzIGFuICI6YW1lbnUiLgorICAgICAqLworICAgIGFtZW51ID0gKChtb2RlcyAmIChNRU5VX05PUk1BTF9NT0RFIHwgTUVOVV9JTlNFUlRfTU9ERSkpID09CisJCQkJICAgICAgIChNRU5VX05PUk1BTF9NT0RFIHwgTUVOVV9JTlNFUlRfTU9ERSkpOworICAgIGlmIChzeXNfbWVudSkKKwltb2RlcyAmPSB+b2xkX21vZGVzOworCisgICAgaWYgKG1lbnUgIT0gTlVMTCAmJiBtb2RlcykKKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwltZW51LT5jYiA9IGd1aV9tZW51X2NiOworI2VuZGlmCisJcCA9IChjYWxsX2RhdGEgPT0gTlVMTCkgPyBOVUxMIDogdmltX3N0cnNhdmUoY2FsbF9kYXRhKTsKKworCS8qIGxvb3Agb3ZlciBhbGwgbW9kZXMsIG1heSBhZGQgbW9yZSB0aGFuIG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBNRU5VX01PREVTOyArK2kpCisJeworCSAgICBpZiAobW9kZXMgJiAoMSA8PCBpKSkKKwkgICAgeworCQkvKiBmcmVlIGFueSBvbGQgbWVudSAqLworCQlmcmVlX21lbnVfc3RyaW5nKG1lbnUsIGkpOworCisJCS8qIEZvciAiYW1lbnUiLCBtYXkgaW5zZXJ0IGFuIGV4dHJhIGNoYXJhY3Rlci4KKwkJICogRG9uJ3QgZG8gdGhpcyBpZiBhZGRpbmcgYSB0ZWFyYmFyIChhZGR0ZWFyb2ZmID09IEZBTFNFKS4KKwkJICogRG9uJ3QgZG8gdGhpcyBmb3IgIjxOb3A+Ii4gKi8KKwkJYyA9IDA7CisJCWlmIChhbWVudSAmJiBjYWxsX2RhdGEgIT0gTlVMTCAmJiAqY2FsbF9kYXRhICE9IE5VTAorI2lmZGVmIEZFQVRfR1VJX1czMgorCQkgICAgICAgJiYgYWRkdGVhcm9mZgorI2VuZGlmCisJCQkJICAgICAgICkKKwkJeworCQkgICAgc3dpdGNoICgxIDw8IGkpCisJCSAgICB7CisJCQljYXNlIE1FTlVfVklTVUFMX01PREU6CisJCQljYXNlIE1FTlVfT1BfUEVORElOR19NT0RFOgorCQkJY2FzZSBNRU5VX0NNRExJTkVfTU9ERToKKwkJCSAgICBjID0gQ3RybF9DOworCQkJICAgIGJyZWFrOworCQkJY2FzZSBNRU5VX0lOU0VSVF9NT0RFOgorCQkJICAgIGMgPSBDdHJsX087CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKworCQlpZiAoYykKKwkJeworCQkgICAgbWVudS0+c3RyaW5nc1tpXSA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGNhbGxfZGF0YSkgKyA0KSk7CisJCSAgICBpZiAobWVudS0+c3RyaW5nc1tpXSAhPSBOVUxMKQorCQkgICAgeworCQkJbWVudS0+c3RyaW5nc1tpXVswXSA9IGM7CisJCQlTVFJDUFkobWVudS0+c3RyaW5nc1tpXSArIDEsIGNhbGxfZGF0YSk7CisJCQlpZiAoYyA9PSBDdHJsX0MpCisJCQl7CisJCQkgICAgaW50CSAgICBsZW4gPSBTVFJMRU4obWVudS0+c3RyaW5nc1tpXSk7CisKKwkJCSAgICAvKiBBcHBlbmQgQ1RSTC1cIENUUkwtRyB0byBvYmV5ICdpbnNlcnRtb2RlJy4gKi8KKwkJCSAgICBtZW51LT5zdHJpbmdzW2ldW2xlbl0gPSBDdHJsX0JTTDsKKwkJCSAgICBtZW51LT5zdHJpbmdzW2ldW2xlbiArIDFdID0gQ3RybF9HOworCQkJICAgIG1lbnUtPnN0cmluZ3NbaV1bbGVuICsgMl0gPSBOVUw7CisJCQl9CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQkgICAgbWVudS0+c3RyaW5nc1tpXSA9IHA7CisJCW1lbnUtPm5vcmVtYXBbaV0gPSBtZW51YXJnLT5ub3JlbWFwWzBdOworCQltZW51LT5zaWxlbnRbaV0gPSBtZW51YXJnLT5zaWxlbnRbMF07CisJICAgIH0KKwl9CisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgXAorCSYmIChkZWZpbmVkKEZFQVRfQkVWQUwpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSkKKwkvKiBOZWVkIHRvIHVwZGF0ZSB0aGUgbWVudSB0aXAuICovCisJaWYgKG1vZGVzICYgTUVOVV9USVBfTU9ERSkKKwkgICAgZ3VpX21jaF9tZW51X3NldF90aXAobWVudSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIE9LOworCitlcnJldDoKKyAgICB2aW1fZnJlZShwYXRoX25hbWUpOworICAgIHZpbV9mcmVlKGRuYW1lKTsKKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFNldCB0aGUgKHN1YiltZW51IHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqIENhbGxlZCByZWN1cnNpdmVseS4KKyAqLworICAgIHN0YXRpYyBpbnQKK21lbnVfbmFibGVfcmVjdXJzZShtZW51LCBuYW1lLCBtb2RlcywgZW5hYmxlKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQltb2RlczsKKyAgICBpbnQJCWVuYWJsZTsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAobWVudSA9PSBOVUxMKQorCXJldHVybiBPSzsJCS8qIEdvdCB0byBib3R0b20gb2YgaGllcmFyY2h5ICovCisKKyAgICAvKiBHZXQgbmFtZSBvZiB0aGlzIGVsZW1lbnQgaW4gdGhlIG1lbnUgaGllcmFyY2h5ICovCisgICAgcCA9IG1lbnVfbmFtZV9za2lwKG5hbWUpOworCisgICAgLyogRmluZCB0aGUgbWVudSAqLworICAgIHdoaWxlIChtZW51ICE9IE5VTEwpCisgICAgeworCWlmICgqbmFtZSA9PSBOVUwgfHwgKm5hbWUgPT0gJyonIHx8IG1lbnVfbmFtZV9lcXVhbChuYW1lLCBtZW51KSkKKwl7CisJICAgIGlmICgqcCAhPSBOVUwpCisJICAgIHsKKwkJaWYgKG1lbnUtPmNoaWxkcmVuID09IE5VTEwpCisJCXsKKwkJICAgIEVNU0coXyhlX25vdHN1Ym1lbnUpKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCWlmIChtZW51X25hYmxlX3JlY3Vyc2UobWVudS0+Y2hpbGRyZW4sIHAsIG1vZGVzLCBlbmFibGUpCisJCQkJCQkJCSAgICAgID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJCWlmIChlbmFibGUpCisJCSAgICBtZW51LT5lbmFibGVkIHw9IG1vZGVzOworCQllbHNlCisJCSAgICBtZW51LT5lbmFibGVkICY9IH5tb2RlczsKKworCSAgICAvKgorCSAgICAgKiBXaGVuIG5hbWUgaXMgZW1wdHksIHdlIGFyZSBkb2luZyBhbGwgbWVudSBpdGVtcyBmb3IgdGhlIGdpdmVuCisJICAgICAqIG1vZGVzLCBzbyBrZWVwIGxvb3BpbmcsIG90aGVyd2lzZSB3ZSBhcmUganVzdCBkb2luZyB0aGUgbmFtZWQKKwkgICAgICogbWVudSBpdGVtICh3aGljaCBoYXMgYmVlbiBmb3VuZCkgc28gYnJlYWsgaGVyZS4KKwkgICAgICovCisJICAgIGlmICgqbmFtZSAhPSBOVUwgJiYgKm5hbWUgIT0gJyonKQorCQlicmVhazsKKwl9CisJbWVudSA9IG1lbnUtPm5leHQ7CisgICAgfQorICAgIGlmICgqbmFtZSAhPSBOVUwgJiYgKm5hbWUgIT0gJyonICYmIG1lbnUgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfbm9tZW51KSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBXYW50IHRvIHVwZGF0ZSBtZW51cyBub3cgZXZlbiBpZiBtb2RlIG5vdCBjaGFuZ2VkICovCisgICAgZm9yY2VfbWVudV91cGRhdGUgPSBUUlVFOworI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIChzdWIpbWVudSB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIG1lbnUgaGllcmFyY2h5CisgKiBDYWxsZWQgcmVjdXJzaXZlbHkuCisgKi8KKyAgICBzdGF0aWMgaW50CityZW1vdmVfbWVudShtZW51cCwgbmFtZSwgbW9kZXMsIHNpbGVudCkKKyAgICB2aW1tZW51X1QJKiptZW51cDsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQltb2RlczsKKyAgICBpbnQJCXNpbGVudDsJCS8qIGRvbid0IGdpdmUgZXJyb3IgbWVzc2FnZXMgKi8KK3sKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgdmltbWVudV9UCSpjaGlsZDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoKm1lbnVwID09IE5VTEwpCisJcmV0dXJuIE9LOwkJLyogR290IHRvIGJvdHRvbSBvZiBoaWVyYXJjaHkgKi8KKworICAgIC8qIEdldCBuYW1lIG9mIHRoaXMgZWxlbWVudCBpbiB0aGUgbWVudSBoaWVyYXJjaHkgKi8KKyAgICBwID0gbWVudV9uYW1lX3NraXAobmFtZSk7CisKKyAgICAvKiBGaW5kIHRoZSBtZW51ICovCisgICAgd2hpbGUgKChtZW51ID0gKm1lbnVwKSAhPSBOVUxMKQorICAgIHsKKwlpZiAoKm5hbWUgPT0gTlVMIHx8IG1lbnVfbmFtZV9lcXVhbChuYW1lLCBtZW51KSkKKwl7CisJICAgIGlmICgqcCAhPSBOVUwgJiYgbWVudS0+Y2hpbGRyZW4gPT0gTlVMTCkKKwkgICAgeworCQlpZiAoIXNpbGVudCkKKwkJICAgIEVNU0coXyhlX25vdHN1Ym1lbnUpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgaWYgKChtZW51LT5tb2RlcyAmIG1vZGVzKSAhPSAweDApCisJICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgJiBkZWZpbmVkKEZFQVRfVEVBUk9GRikKKwkJLyoKKwkJICogSWYgd2UgYXJlIHJlbW92aW5nIGFsbCBlbnRyaWVzIGZvciB0aGlzIG1lbnUsTUVOVV9BTExfTU9ERVMsCisJCSAqIFRoZW4ga2lsbCBhbnkgdGVhcm9mZiBiZWZvcmUgd2Ugc3RhcnQKKwkJICovCisJCWlmICgqcCA9PSBOVUwgJiYgbW9kZXMgPT0gTUVOVV9BTExfTU9ERVMpCisJCXsKKwkJICAgIGlmIChJc1dpbmRvdyhtZW51LT50ZWFyb2ZmX2hhbmRsZSkpCisJCQlEZXN0cm95V2luZG93KG1lbnUtPnRlYXJvZmZfaGFuZGxlKTsKKwkJfQorI2VuZGlmCisJCWlmIChyZW1vdmVfbWVudSgmbWVudS0+Y2hpbGRyZW4sIHAsIG1vZGVzLCBzaWxlbnQpID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqbmFtZSAhPSBOVUwpCisJICAgIHsKKwkJaWYgKCFzaWxlbnQpCisJCSAgICBFTVNHKF8oZV9vdGhlcm1vZGUpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBXaGVuIG5hbWUgaXMgZW1wdHksIHdlIGFyZSByZW1vdmluZyBhbGwgbWVudSBpdGVtcyBmb3IgdGhlIGdpdmVuCisJICAgICAqIG1vZGVzLCBzbyBrZWVwIGxvb3BpbmcsIG90aGVyd2lzZSB3ZSBhcmUganVzdCByZW1vdmluZyB0aGUgbmFtZWQKKwkgICAgICogbWVudSBpdGVtICh3aGljaCBoYXMgYmVlbiBmb3VuZCkgc28gYnJlYWsgaGVyZS4KKwkgICAgICovCisJICAgIGlmICgqbmFtZSAhPSBOVUwpCisJCWJyZWFrOworCisJICAgIC8qIFJlbW92ZSB0aGUgbWVudSBpdGVtIGZvciB0aGUgZ2l2ZW4gbW9kZVtzXS4gIElmIHRoZSBtZW51IGl0ZW0KKwkgICAgICogaXMgbm8gbG9uZ2VyIHZhbGlkIGluIEFOWSBtb2RlLCBkZWxldGUgaXQgKi8KKwkgICAgbWVudS0+bW9kZXMgJj0gfm1vZGVzOworCSAgICBpZiAobW9kZXMgJiBNRU5VX1RJUF9NT0RFKQorCQlmcmVlX21lbnVfc3RyaW5nKG1lbnUsIE1FTlVfSU5ERVhfVElQKTsKKwkgICAgaWYgKChtZW51LT5tb2RlcyAmIE1FTlVfQUxMX01PREVTKSA9PSAwKQorCQlmcmVlX21lbnUobWVudXApOworCSAgICBlbHNlCisJCW1lbnVwID0gJm1lbnUtPm5leHQ7CisJfQorCWVsc2UKKwkgICAgbWVudXAgPSAmbWVudS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCpuYW1lICE9IE5VTCkKKyAgICB7CisJaWYgKG1lbnUgPT0gTlVMTCkKKwl7CisJICAgIGlmICghc2lsZW50KQorCQlFTVNHKF8oZV9ub21lbnUpKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCisKKwkvKiBSZWNhbGN1bGF0ZSBtb2RlcyBmb3IgbWVudSBiYXNlZCBvbiB0aGUgbmV3IHVwZGF0ZWQgY2hpbGRyZW4gKi8KKwltZW51LT5tb2RlcyAmPSB+bW9kZXM7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpICYgZGVmaW5lZChGRUFUX1RFQVJPRkYpCisJaWYgKChzX3RlYXJvZmZzKSAmJiAobWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkpIC8qIHRoZXJlJ3MgYSB0ZWFyIGJhci4uICovCisJICAgIGNoaWxkID0gbWVudS0+Y2hpbGRyZW4tPm5leHQ7IC8qIGRvbid0IGNvdW50IHRlYXJvZmYgYmFyICovCisJZWxzZQorI2VuZGlmCisJICAgIGNoaWxkID0gbWVudS0+Y2hpbGRyZW47CisJZm9yICggOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCSAgICBtZW51LT5tb2RlcyB8PSBjaGlsZC0+bW9kZXM7CisJaWYgKG1vZGVzICYgTUVOVV9USVBfTU9ERSkKKwl7CisJICAgIGZyZWVfbWVudV9zdHJpbmcobWVudSwgTUVOVV9JTkRFWF9USVApOworI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpIFwKKwkgICAgJiYgKGRlZmluZWQoRkVBVF9CRVZBTCkgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspKQorCSAgICAvKiBOZWVkIHRvIHVwZGF0ZSB0aGUgbWVudSB0aXAuICovCisJICAgIGlmIChndWkuaW5fdXNlKQorCQlndWlfbWNoX21lbnVfc2V0X3RpcChtZW51KTsKKyNlbmRpZgorCX0KKwlpZiAoKG1lbnUtPm1vZGVzICYgTUVOVV9BTExfTU9ERVMpID09IDApCisJeworCSAgICAvKiBUaGUgbWVudSBpdGVtIGlzIG5vIGxvbmdlciB2YWxpZCBpbiBBTlkgbW9kZSwgc28gZGVsZXRlIGl0ICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpICYgZGVmaW5lZChGRUFUX1RFQVJPRkYpCisJICAgIGlmIChzX3RlYXJvZmZzICYmIG1lbnUtPmNoaWxkcmVuICE9IE5VTEwpIC8qIHRoZXJlJ3MgYSB0ZWFyIGJhci4uICovCisJCWZyZWVfbWVudSgmbWVudS0+Y2hpbGRyZW4pOworI2VuZGlmCisJICAgICptZW51cCA9IG1lbnU7CisJICAgIGZyZWVfbWVudShtZW51cCk7CisJfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEZyZWUgdGhlIGdpdmVuIG1lbnUgc3RydWN0dXJlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGlua2VkIGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJlZV9tZW51KG1lbnVwKQorICAgIHZpbW1lbnVfVAkqKm1lbnVwOworeworICAgIGludAkJaTsKKyAgICB2aW1tZW51X1QJKm1lbnU7CisKKyAgICBtZW51ID0gKm1lbnVwOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBGcmVlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSBzdHJ1Y3R1cmVzIChvbmx5IHdoZW4gYWxyZWFkeSBjcmVhdGVkKSAqLworICAgIC8qIEFsc28gbWF5IHJlYnVpbGQgYSB0ZWFyb2ZmJ2VkIG1lbnUgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KTsKKyNlbmRpZgorCisgICAgLyogRG9uJ3QgY2hhbmdlICptZW51cCB1bnRpbCBhZnRlciBjYWxsaW5nIGd1aV9tY2hfZGVzdHJveV9tZW51KCkuIFRoZQorICAgICAqIE1hY09TIGNvZGUgbmVlZHMgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZSB0byBwcm9wZXJseSBkZWxldGUgdGhlIG1lbnUuICovCisgICAgKm1lbnVwID0gbWVudS0+bmV4dDsKKyAgICB2aW1fZnJlZShtZW51LT5uYW1lKTsKKyAgICB2aW1fZnJlZShtZW51LT5kbmFtZSk7CisgICAgdmltX2ZyZWUobWVudS0+YWN0ZXh0KTsKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKyAgICB2aW1fZnJlZShtZW51LT5pY29uZmlsZSk7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUVOVV9NT0RFUzsgaSsrKQorCWZyZWVfbWVudV9zdHJpbmcobWVudSwgaSk7CisgICAgdmltX2ZyZWUobWVudSk7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qIFdhbnQgdG8gdXBkYXRlIG1lbnVzIG5vdyBldmVuIGlmIG1vZGUgbm90IGNoYW5nZWQgKi8KKyAgICBmb3JjZV9tZW51X3VwZGF0ZSA9IFRSVUU7CisjZW5kaWYKK30KKworLyoKKyAqIEZyZWUgdGhlIG1lbnUtPnN0cmluZyB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmVlX21lbnVfc3RyaW5nKG1lbnUsIGlkeCkKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQlpZHg7Cit7CisgICAgaW50CQljb3VudCA9IDA7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1FTlVfTU9ERVM7IGkrKykKKwlpZiAobWVudS0+c3RyaW5nc1tpXSA9PSBtZW51LT5zdHJpbmdzW2lkeF0pCisJICAgIGNvdW50Kys7CisgICAgaWYgKGNvdW50ID09IDEpCisJdmltX2ZyZWUobWVudS0+c3RyaW5nc1tpZHhdKTsKKyAgICBtZW51LT5zdHJpbmdzW2lkeF0gPSBOVUxMOworfQorCisvKgorICogU2hvdyB0aGUgbWFwcGluZyBhc3NvY2lhdGVkIHdpdGggYSBtZW51IGl0ZW0gb3IgaGllcmFyY2h5IGluIGEgc3ViLW1lbnUuCisgKi8KKyAgICBzdGF0aWMgaW50CitzaG93X21lbnVzKHBhdGhfbmFtZSwgbW9kZXMpCisgICAgY2hhcl91ICAqcGF0aF9uYW1lOworICAgIGludAkgICAgbW9kZXM7Cit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgdmltbWVudV9UCSpwYXJlbnQgPSBOVUxMOworCisgICAgbWVudSA9IHJvb3RfbWVudTsKKyAgICBuYW1lID0gcGF0aF9uYW1lID0gdmltX3N0cnNhdmUocGF0aF9uYW1lKTsKKyAgICBpZiAocGF0aF9uYW1lID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKiBGaXJzdCwgZmluZCB0aGUgKHN1YiltZW51IHdpdGggdGhlIGdpdmVuIG5hbWUgKi8KKyAgICB3aGlsZSAoKm5hbWUpCisgICAgeworCXAgPSBtZW51X25hbWVfc2tpcChuYW1lKTsKKwl3aGlsZSAobWVudSAhPSBOVUxMKQorCXsKKwkgICAgaWYgKG1lbnVfbmFtZV9lcXVhbChuYW1lLCBtZW51KSkKKwkgICAgeworCQkvKiBGb3VuZCBtZW51ICovCisJCWlmICgqcCAhPSBOVUwgJiYgbWVudS0+Y2hpbGRyZW4gPT0gTlVMTCkKKwkJeworCQkgICAgRU1TRyhfKGVfbm90c3VibWVudSkpOworCQkgICAgdmltX2ZyZWUocGF0aF9uYW1lKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCWVsc2UgaWYgKChtZW51LT5tb2RlcyAmIG1vZGVzKSA9PSAweDApCisJCXsKKwkJICAgIEVNU0coXyhlX290aGVybW9kZSkpOworCQkgICAgdmltX2ZyZWUocGF0aF9uYW1lKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCWJyZWFrOworCSAgICB9CisJICAgIG1lbnUgPSBtZW51LT5uZXh0OworCX0KKwlpZiAobWVudSA9PSBOVUxMKQorCXsKKwkgICAgRU1TRyhfKGVfbm9tZW51KSk7CisJICAgIHZpbV9mcmVlKHBhdGhfbmFtZSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwluYW1lID0gcDsKKwlwYXJlbnQgPSBtZW51OworCW1lbnUgPSBtZW51LT5jaGlsZHJlbjsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzICovCisJCQkJCQkgICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCisgICAgTVNHX1BVVFNfVElUTEUoXygiXG4tLS0gTWVudXMgLS0tIikpOworCisgICAgc2hvd19tZW51c19yZWN1cnNpdmUocGFyZW50LCBtb2RlcywgMCk7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogUmVjdXJzaXZlbHkgc2hvdyB0aGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW51cyB1bmRlciB0aGUgZ2l2ZW4gb25lCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2hvd19tZW51c19yZWN1cnNpdmUobWVudSwgbW9kZXMsIGRlcHRoKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCW1vZGVzOworICAgIGludAkJZGVwdGg7Cit7CisgICAgaW50CQlpOworICAgIGludAkJYml0OworCisgICAgaWYgKG1lbnUgIT0gTlVMTCAmJiAobWVudS0+bW9kZXMgJiBtb2RlcykgPT0gMHgwKQorCXJldHVybjsKKworICAgIGlmIChtZW51ICE9IE5VTEwpCisgICAgeworCW1zZ19wdXRjaGFyKCdcbicpOworCWlmIChnb3RfaW50KQkJLyogInEiIGhpdCBmb3IgIi0tbW9yZS0tIiAqLworCSAgICByZXR1cm47CisJZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspCisJICAgIE1TR19QVVRTKCIgICIpOworCWlmIChtZW51LT5wcmlvcml0eSkKKwl7CisJICAgIG1zZ19vdXRudW0oKGxvbmcpbWVudS0+cHJpb3JpdHkpOworCSAgICBNU0dfUFVUUygiICIpOworCX0KKwkJCQkvKiBTYW1lIGhpZ2hsaWdodGluZyBhcyBmb3IgZGlyZWN0b3JpZXMhPyAqLworCW1zZ19vdXR0cmFuc19hdHRyKG1lbnUtPm5hbWUsIGhsX2F0dHIoSExGX0QpKTsKKyAgICB9CisKKyAgICBpZiAobWVudSAhPSBOVUxMICYmIG1lbnUtPmNoaWxkcmVuID09IE5VTEwpCisgICAgeworCWZvciAoYml0ID0gMDsgYml0IDwgTUVOVV9NT0RFUzsgYml0KyspCisJICAgIGlmICgobWVudS0+bW9kZXMgJiBtb2RlcyAmICgxIDw8IGJpdCkpICE9IDApCisJICAgIHsKKwkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJCWlmIChnb3RfaW50KQkJLyogInEiIGhpdCBmb3IgIi0tbW9yZS0tIiAqLworCQkgICAgcmV0dXJuOworCQlmb3IgKGkgPSAwOyBpIDwgZGVwdGggKyAyOyBpKyspCisJCSAgICBNU0dfUFVUUygiICAiKTsKKwkJbXNnX3B1dGNoYXIobWVudV9tb2RlX2NoYXJzW2JpdF0pOworCQlpZiAobWVudS0+bm9yZW1hcFtiaXRdID09IFJFTUFQX05PTkUpCisJCSAgICBtc2dfcHV0Y2hhcignKicpOworCQllbHNlIGlmIChtZW51LT5ub3JlbWFwW2JpdF0gPT0gUkVNQVBfU0NSSVBUKQorCQkgICAgbXNnX3B1dGNoYXIoJyYnKTsKKwkJZWxzZQorCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJaWYgKG1lbnUtPnNpbGVudFtiaXRdKQorCQkgICAgbXNnX3B1dGNoYXIoJ3MnKTsKKwkJZWxzZQorCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJaWYgKChtZW51LT5tb2RlcyAmIG1lbnUtPmVuYWJsZWQgJiAoMSA8PCBiaXQpKSA9PSAwKQorCQkgICAgbXNnX3B1dGNoYXIoJy0nKTsKKwkJZWxzZQorCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJTVNHX1BVVFMoIiAiKTsKKwkJaWYgKCptZW51LT5zdHJpbmdzW2JpdF0gPT0gTlVMKQorCQkgICAgbXNnX3B1dHNfYXR0cigoY2hhcl91ICopIjxOb3A+IiwgaGxfYXR0cihITEZfOCkpOworCQllbHNlCisJCSAgICBtc2dfb3V0dHJhbnNfc3BlY2lhbChtZW51LT5zdHJpbmdzW2JpdF0sIEZBTFNFKTsKKwkgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChtZW51ID09IE5VTEwpCisJeworCSAgICBtZW51ID0gcm9vdF9tZW51OworCSAgICBkZXB0aC0tOworCX0KKwllbHNlCisJICAgIG1lbnUgPSBtZW51LT5jaGlsZHJlbjsKKworCS8qIHJlY3Vyc2l2ZWx5IHNob3cgYWxsIGNoaWxkcmVuLiAgU2tpcCBQb3BVcFtudm9jaV0uICovCisJZm9yICg7IG1lbnUgIT0gTlVMTCAmJiAhZ290X2ludDsgbWVudSA9IG1lbnUtPm5leHQpCisJICAgIGlmICghbWVudV9pc19oaWRkZW4obWVudS0+ZG5hbWUpKQorCQlzaG93X21lbnVzX3JlY3Vyc2l2ZShtZW51LCBtb2RlcywgZGVwdGggKyAxKTsKKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX0NNRExfQ09NUEwKKworLyoKKyAqIFVzZWQgd2hlbiBleHBhbmRpbmcgbWVudSBuYW1lcy4KKyAqLworc3RhdGljIHZpbW1lbnVfVAkqZXhwYW5kX21lbnUgPSBOVUxMOworc3RhdGljIGludAkJZXhwYW5kX21vZGVzID0gMHgwOworc3RhdGljIGludAkJZXhwYW5kX2VtZW51OwkvKiBUUlVFIGZvciAiOmVtZW51IiBjb21tYW5kICovCisKKy8qCisgKiBXb3JrIG91dCB3aGF0IHRvIGNvbXBsZXRlIHdoZW4gZG9pbmcgY29tbWFuZCBsaW5lIGNvbXBsZXRpb24gb2YgbWVudSBuYW1lcy4KKyAqLworICAgIGNoYXJfdSAqCitzZXRfY29udGV4dF9pbl9tZW51X2NtZCh4cCwgY21kLCBhcmcsIGZvcmNlaXQpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGNoYXJfdQkqY21kOworICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJZm9yY2VpdDsKK3sKKyAgICBjaGFyX3UJKmFmdGVyX2RvdDsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpwYXRoX25hbWUgPSBOVUxMOworICAgIGNoYXJfdQkqbmFtZTsKKyAgICBpbnQJCXVubWVudTsKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQlleHBhbmRfbWVudXM7CisKKyAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9VTlNVQ0NFU1NGVUw7CisKKworICAgIC8qIENoZWNrIGZvciBwcmlvcml0eSBudW1iZXJzLCBlbmFibGUgYW5kIGRpc2FibGUgKi8KKyAgICBmb3IgKHAgPSBhcmc7ICpwOyArK3ApCisJaWYgKCFWSU1fSVNESUdJVCgqcCkgJiYgKnAgIT0gJy4nKQorCSAgICBicmVhazsKKworICAgIGlmICghdmltX2lzd2hpdGUoKnApKQorICAgIHsKKwlpZiAoU1RSTkNNUChhcmcsICJlbmFibGUiLCA2KSA9PSAwCisJCSYmIChhcmdbNl0gPT0gTlVMIHx8ICB2aW1faXN3aGl0ZShhcmdbNl0pKSkKKwkgICAgcCA9IGFyZyArIDY7CisJZWxzZSBpZiAoU1RSTkNNUChhcmcsICJkaXNhYmxlIiwgNykgPT0gMAorCQkmJiAoYXJnWzddID09IE5VTCB8fCB2aW1faXN3aGl0ZShhcmdbN10pKSkKKwkgICAgcCA9IGFyZyArIDc7CisJZWxzZQorCSAgICBwID0gYXJnOworICAgIH0KKworICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgdmltX2lzd2hpdGUoKnApKQorCSsrcDsKKworICAgIGFyZyA9IGFmdGVyX2RvdCA9IHA7CisKKyAgICBmb3IgKDsgKnAgJiYgIXZpbV9pc3doaXRlKCpwKTsgKytwKQorICAgIHsKKwlpZiAoKCpwID09ICdcXCcgfHwgKnAgPT0gQ3RybF9WKSAmJiBwWzFdICE9IE5VTCkKKwkgICAgcCsrOworCWVsc2UgaWYgKCpwID09ICcuJykKKwkgICAgYWZ0ZXJfZG90ID0gcCArIDE7CisgICAgfQorCisgICAgLyogIjp0ZWFyb2ZmIiBhbmQgIjpwb3B1cCIgb25seSB1c2UgbWVudXMsIG5vdCBlbnRyaWVzICovCisgICAgZXhwYW5kX21lbnVzID0gISgoKmNtZCA9PSAndCcgJiYgY21kWzFdID09ICdlJykgfHwgKmNtZCA9PSAncCcpOworICAgIGV4cGFuZF9lbWVudSA9ICgqY21kID09ICdlJyk7CisgICAgaWYgKGV4cGFuZF9tZW51cyAmJiB2aW1faXN3aGl0ZSgqcCkpCisJcmV0dXJuIE5VTEw7CS8qIFRPRE86IGNoZWNrIGZvciBuZXh0IGNvbW1hbmQ/ICovCisgICAgaWYgKCpwID09IE5VTCkJCS8qIENvbXBsZXRlIHRoZSBtZW51IG5hbWUgKi8KKyAgICB7CisJLyoKKwkgKiBXaXRoIDp1bm1lbnUsIHlvdSBvbmx5IHdhbnQgdG8gbWF0Y2ggbWVudXMgZm9yIHRoZSBhcHByb3ByaWF0ZSBtb2RlLgorCSAqIFdpdGggOm1lbnUgdGhvdWdoIHlvdSBtaWdodCB3YW50IHRvIGFkZCBhIG1lbnUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCisJICogb25lIGluIGFub3RoZXIgbW9kZSwgc28gbWF0Y2ggbWVudXMgZnJvbSBvdGhlciBtb2RlcyB0b28uCisJICovCisJZXhwYW5kX21vZGVzID0gZ2V0X21lbnVfY21kX21vZGVzKGNtZCwgZm9yY2VpdCwgTlVMTCwgJnVubWVudSk7CisJaWYgKCF1bm1lbnUpCisJICAgIGV4cGFuZF9tb2RlcyA9IE1FTlVfQUxMX01PREVTOworCisJbWVudSA9IHJvb3RfbWVudTsKKwlpZiAoYWZ0ZXJfZG90ICE9IGFyZykKKwl7CisJICAgIHBhdGhfbmFtZSA9IGFsbG9jKCh1bnNpZ25lZCkoYWZ0ZXJfZG90IC0gYXJnKSk7CisJICAgIGlmIChwYXRoX25hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJICAgIFNUUk5DUFkocGF0aF9uYW1lLCBhcmcsIGFmdGVyX2RvdCAtIGFyZyAtIDEpOworCSAgICBwYXRoX25hbWVbYWZ0ZXJfZG90IC0gYXJnIC0gMV0gPSBOVUw7CisJfQorCW5hbWUgPSBwYXRoX25hbWU7CisJd2hpbGUgKG5hbWUgIT0gTlVMTCAmJiAqbmFtZSkKKwl7CisJICAgIHAgPSBtZW51X25hbWVfc2tpcChuYW1lKTsKKwkgICAgd2hpbGUgKG1lbnUgIT0gTlVMTCkKKwkgICAgeworCQlpZiAobWVudV9uYW1lX2VxdWFsKG5hbWUsIG1lbnUpKQorCQl7CisJCSAgICAvKiBGb3VuZCBtZW51ICovCisJCSAgICBpZiAoKCpwICE9IE5VTCAmJiBtZW51LT5jaGlsZHJlbiA9PSBOVUxMKQorCQkJfHwgKChtZW51LT5tb2RlcyAmIGV4cGFuZF9tb2RlcykgPT0gMHgwKSkKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBNZW51IHBhdGggY29udGludWVzLCBidXQgd2UgaGF2ZSByZWFjaGVkIGEgbGVhZi4KKwkJCSAqIE9yIG1lbnUgZXhpc3RzIG9ubHkgaW4gYW5vdGhlciBtb2RlLgorCQkJICovCisJCQl2aW1fZnJlZShwYXRoX25hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQltZW51ID0gbWVudS0+bmV4dDsKKwkgICAgfQorCSAgICBpZiAobWVudSA9PSBOVUxMKQorCSAgICB7CisJCS8qIE5vIG1lbnUgZm91bmQgd2l0aCB0aGUgbmFtZSB3ZSB3ZXJlIGxvb2tpbmcgZm9yICovCisJCXZpbV9mcmVlKHBhdGhfbmFtZSk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIG5hbWUgPSBwOworCSAgICBtZW51ID0gbWVudS0+Y2hpbGRyZW47CisJfQorCisJeHAtPnhwX2NvbnRleHQgPSBleHBhbmRfbWVudXMgPyBFWFBBTkRfTUVOVU5BTUVTIDogRVhQQU5EX01FTlVTOworCXhwLT54cF9wYXR0ZXJuID0gYWZ0ZXJfZG90OworCWV4cGFuZF9tZW51ID0gbWVudTsKKyAgICB9CisgICAgZWxzZQkJCS8qIFdlJ3JlIGluIHRoZSBtYXBwaW5nIHBhcnQgKi8KKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgbGlzdCBvZiAoc3ViKW1lbnVzIChub3QKKyAqIGVudHJpZXMpLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X21lbnVfbmFtZSh4cCwgaWR4KQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBpbnQJCWlkeDsKK3sKKyAgICBzdGF0aWMgdmltbWVudV9UCSptZW51ID0gTlVMTDsKKyAgICBjaGFyX3UJCSpzdHI7CisKKyAgICBpZiAoaWR4ID09IDApCSAgICAvKiBmaXJzdCBjYWxsOiBzdGFydCBhdCBmaXJzdCBpdGVtICovCisJbWVudSA9IGV4cGFuZF9tZW51OworCisgICAgLyogU2tpcCBQb3BVcFtudm9jaV0uICovCisgICAgd2hpbGUgKG1lbnUgIT0gTlVMTCAmJiAobWVudV9pc19oaWRkZW4obWVudS0+ZG5hbWUpCisJICAgIHx8IG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPmRuYW1lKQorCSAgICB8fCBtZW51X2lzX3RlYXJvZmYobWVudS0+ZG5hbWUpCisJICAgIHx8IG1lbnUtPmNoaWxkcmVuID09IE5VTEwpKQorCW1lbnUgPSBtZW51LT5uZXh0OworCisgICAgaWYgKG1lbnUgPT0gTlVMTCkJICAgIC8qIGF0IGVuZCBvZiBsaW5rZWQgbGlzdCAqLworCXJldHVybiBOVUxMOworCisgICAgaWYgKG1lbnUtPm1vZGVzICYgZXhwYW5kX21vZGVzKQorCXN0ciA9IG1lbnUtPmRuYW1lOworICAgIGVsc2UKKwlzdHIgPSAoY2hhcl91ICopIiI7CisKKyAgICAvKiBBZHZhbmNlIHRvIG5leHQgbWVudSBlbnRyeS4gKi8KKyAgICBtZW51ID0gbWVudS0+bmV4dDsKKworICAgIHJldHVybiBzdHI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXZlbiB0byBFeHBhbmRHZW5lcmljKCkgdG8gb2J0YWluIHRoZSBsaXN0IG9mIG1lbnVzIGFuZCBtZW51CisgKiBlbnRyaWVzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X21lbnVfbmFtZXMoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgc3RhdGljIHZpbW1lbnVfVAkqbWVudSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXJfdQl0YnVmZmVyWzI1Nl07IC8qaGFjayovCisgICAgY2hhcl91CQkqc3RyOworCisgICAgaWYgKGlkeCA9PSAwKQkgICAgLyogZmlyc3QgY2FsbDogc3RhcnQgYXQgZmlyc3QgaXRlbSAqLworCW1lbnUgPSBleHBhbmRfbWVudTsKKworICAgIC8qIFNraXAgQnJvd3NlLXN0eWxlIGVudHJpZXMsIHBvcHVwIG1lbnVzIGFuZCBzZXBhcmF0b3JzLiAqLworICAgIHdoaWxlIChtZW51ICE9IE5VTEwKKwkgICAgJiYgKCAgIG1lbnVfaXNfaGlkZGVuKG1lbnUtPmRuYW1lKQorCQl8fCAoZXhwYW5kX2VtZW51ICYmIG1lbnVfaXNfc2VwYXJhdG9yKG1lbnUtPmRuYW1lKSkKKwkJfHwgbWVudV9pc190ZWFyb2ZmKG1lbnUtPmRuYW1lKQorI2lmbmRlZiBGRUFUX0JST1dTRQorCQl8fCBtZW51LT5kbmFtZVtTVFJMRU4obWVudS0+ZG5hbWUpIC0gMV0gPT0gJy4nCisjZW5kaWYKKwkgICAgICAgKSkKKwltZW51ID0gbWVudS0+bmV4dDsKKworICAgIGlmIChtZW51ID09IE5VTEwpCSAgICAvKiBhdCBlbmQgb2YgbGlua2VkIGxpc3QgKi8KKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChtZW51LT5tb2RlcyAmIGV4cGFuZF9tb2RlcykKKyAgICB7CisJaWYgKG1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCisJeworCSAgICBTVFJDUFkodGJ1ZmZlciwgbWVudS0+ZG5hbWUpOworCSAgICAvKiBoYWNrIG9uIG1lbnUgc2VwYXJhdG9yczogIHVzZSBhICdtYWdpYycgY2hhciBmb3IgdGhlIHNlcGFyYXRvcgorCSAgICAgKiBzbyB0aGF0ICcuJyBpbiBuYW1lcyBnZXRzIGVzY2FwZWQgcHJvcGVybHkgKi8KKwkgICAgU1RSQ0FUKHRidWZmZXIsICJcMDAxIik7CisJICAgIHN0ciA9IHRidWZmZXI7CisJfQorCWVsc2UKKwkgICAgc3RyID0gbWVudS0+ZG5hbWU7CisgICAgfQorICAgIGVsc2UKKwlzdHIgPSAoY2hhcl91ICopIiI7CisKKyAgICAvKiBBZHZhbmNlIHRvIG5leHQgbWVudSBlbnRyeS4gKi8KKyAgICBtZW51ID0gbWVudS0+bmV4dDsKKworICAgIHJldHVybiBzdHI7Cit9CisjZW5kaWYgLyogRkVBVF9DTURMX0NPTVBMICovCisKKy8qCisgKiBTa2lwIG92ZXIgdGhpcyBlbGVtZW50IG9mIHRoZSBtZW51IHBhdGggYW5kIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIG5leHQKKyAqIGVsZW1lbnQuICBBbnkgXCBhbmQgXlZzIGFyZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAqLworICAgIGNoYXJfdSAqCittZW51X25hbWVfc2tpcChuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgY2hhcl91ICAqcDsKKworICAgIGZvciAocCA9IG5hbWU7ICpwICYmICpwICE9ICcuJzsgcCsrKQorICAgIHsKKwlpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSBDdHJsX1YpCisJeworCSAgICBtY2hfbWVtbW92ZShwLCBwICsgMSwgU1RSTEVOKHApKTsKKwkgICAgaWYgKCpwID09IE5VTCkKKwkJYnJlYWs7CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOwkvKiBza2lwIG11bHRpYnl0ZSBjaGFyICovCisjZW5kaWYKKyAgICB9CisgICAgaWYgKCpwKQorCSpwKysgPSBOVUw7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSB3aGVuICJuYW1lIiBtYXRjaGVzIHdpdGggbWVudSAibWVudSIuICBUaGUgbmFtZSBpcyBjb21wYXJlZCBpbgorICogdHdvIHdheXM6IHJhdyBtZW51IG5hbWUgYW5kIG1lbnUgbmFtZSB3aXRob3V0ICcmJy4gIGlnbm9yZSBwYXJ0IGFmdGVyIGEgVEFCLgorICovCisgICAgc3RhdGljIGludAorbWVudV9uYW1lX2VxdWFsKG5hbWUsIG1lbnUpCisgICAgY2hhcl91CSpuYW1lOworICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICByZXR1cm4gKG1lbnVfbmFtZWNtcChuYW1lLCBtZW51LT5uYW1lKSB8fCBtZW51X25hbWVjbXAobmFtZSwgbWVudS0+ZG5hbWUpKTsKK30KKworICAgIHN0YXRpYyBpbnQKK21lbnVfbmFtZWNtcChuYW1lLCBtbmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSptbmFtZTsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBmb3IgKGkgPSAwOyBuYW1lW2ldICE9IE5VTCAmJiBuYW1lW2ldICE9IFRBQjsgKytpKQorCWlmIChuYW1lW2ldICE9IG1uYW1lW2ldKQorCSAgICBicmVhazsKKyAgICByZXR1cm4gKChuYW1lW2ldID09IE5VTCB8fCBuYW1lW2ldID09IFRBQikKKwkgICAgJiYgKG1uYW1lW2ldID09IE5VTCB8fCBtbmFtZVtpXSA9PSBUQUIpKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbW9kZXMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBtZW51IGNvbW1hbmQgKGVnIDptZW51ISByZXR1cm5zCisgKiBNRU5VX0NNRExJTkVfTU9ERSB8IE1FTlVfSU5TRVJUX01PREUpLgorICogSWYgIm5vcmVtYXAiIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBmbGFnIGl0IHBvaW50cyB0byBpcyBzZXQgYWNjb3JkaW5nIHRvCisgKiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGEgIm5vcmUiIGNvbW1hbmQuCisgKiBJZiAidW5tZW51IiBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZmxhZyBpdCBwb2ludHMgdG8gaXMgc2V0IGFjY29yZGluZyB0bworICogd2hldGhlciB0aGUgY29tbWFuZCBpcyBhbiAidW5tZW51IiBjb21tYW5kLgorICovCisgICAgc3RhdGljIGludAorZ2V0X21lbnVfY21kX21vZGVzKGNtZCwgZm9yY2VpdCwgbm9yZW1hcCwgdW5tZW51KQorICAgIGNoYXJfdSAgKmNtZDsKKyAgICBpbnQJICAgIGZvcmNlaXQ7CSAgICAvKiBXYXMgdGhlcmUgYSAiISIgYWZ0ZXIgdGhlIGNvbW1hbmQ/ICovCisgICAgaW50CSAgICAqbm9yZW1hcDsKKyAgICBpbnQJICAgICp1bm1lbnU7Cit7CisgICAgaW50CSAgICBtb2RlczsKKworICAgIHN3aXRjaCAoKmNtZCsrKQorICAgIHsKKwljYXNlICd2JzoJCQkvKiB2bWVudSwgdnVubWVudSwgdm5vcmVtZW51ICovCisJICAgIG1vZGVzID0gTUVOVV9WSVNVQUxfTU9ERTsKKwkgICAgYnJlYWs7CisJY2FzZSAnbyc6CQkJLyogb21lbnUgKi8KKwkgICAgbW9kZXMgPSBNRU5VX09QX1BFTkRJTkdfTU9ERTsKKwkgICAgYnJlYWs7CisJY2FzZSAnaSc6CQkJLyogaW1lbnUgKi8KKwkgICAgbW9kZXMgPSBNRU5VX0lOU0VSVF9NT0RFOworCSAgICBicmVhazsKKwljYXNlICd0JzoKKwkgICAgbW9kZXMgPSBNRU5VX1RJUF9NT0RFOwkvKiB0bWVudSAqLworCSAgICBicmVhazsKKwljYXNlICdjJzoJCQkvKiBjbWVudSAqLworCSAgICBtb2RlcyA9IE1FTlVfQ01ETElORV9NT0RFOworCSAgICBicmVhazsKKwljYXNlICdhJzoJCQkvKiBhbWVudSAqLworCSAgICBtb2RlcyA9IE1FTlVfSU5TRVJUX01PREUgfCBNRU5VX0NNRExJTkVfTU9ERSB8IE1FTlVfTk9STUFMX01PREUKKwkJCQkgICAgfCBNRU5VX1ZJU1VBTF9NT0RFIHwgTUVOVV9PUF9QRU5ESU5HX01PREU7CisJICAgIGJyZWFrOworCWNhc2UgJ24nOgorCSAgICBpZiAoKmNtZCAhPSAnbycpCQkvKiBubWVudSwgbm90IG5vcmVtZW51ICovCisJICAgIHsKKwkJbW9kZXMgPSBNRU5VX05PUk1BTF9NT0RFOworCQlicmVhazsKKwkgICAgfQorCSAgICAvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJICAgIC0tY21kOworCSAgICBpZiAoZm9yY2VpdCkJCS8qIG1lbnUhISAqLworCQltb2RlcyA9IE1FTlVfSU5TRVJUX01PREUgfCBNRU5VX0NNRExJTkVfTU9ERTsKKwkgICAgZWxzZQkJCS8qIG1lbnUgKi8KKwkJbW9kZXMgPSBNRU5VX05PUk1BTF9NT0RFIHwgTUVOVV9WSVNVQUxfTU9ERQorCQkJCQkJICAgICAgIHwgTUVOVV9PUF9QRU5ESU5HX01PREU7CisgICAgfQorCisgICAgaWYgKG5vcmVtYXAgIT0gTlVMTCkKKwkqbm9yZW1hcCA9ICgqY21kID09ICduJyA/IFJFTUFQX05PTkUgOiBSRU1BUF9ZRVMpOworICAgIGlmICh1bm1lbnUgIT0gTlVMTCkKKwkqdW5tZW51ID0gKCpjbWQgPT0gJ3UnKTsKKyAgICByZXR1cm4gbW9kZXM7Cit9CisKKy8qCisgKiBNb2RpZnkgYSBtZW51IG5hbWUgc3RhcnRpbmcgd2l0aCAiUG9wVXAiIHRvIGluY2x1ZGUgdGhlIG1vZGUgY2hhcmFjdGVyLgorICogUmV0dXJucyB0aGUgbmFtZSBpbiBhbGxvY2F0ZWQgbWVtb3J5IChOVUxMIGZvciBmYWlsdXJlKS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcG9wdXBfbW9kZV9uYW1lKG5hbWUsIGlkeCkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlpZHg7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuID0gKGludClTVFJMRU4obmFtZSk7CisKKyAgICBwID0gdmltX3N0cm5zYXZlKG5hbWUsIGxlbiArIDEpOworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCW1jaF9tZW1tb3ZlKHAgKyA2LCBwICsgNSwgKHNpemVfdCkobGVuIC0gNCkpOworCXBbNV0gPSBtZW51X21vZGVfY2hhcnNbaWR4XTsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiB0aGUgaW5kZXggaW50byB0aGUgbWVudS0+c3RyaW5ncyBvciBtZW51LT5ub3JlbWFwIGFycmF5cyBmb3IgdGhlCisgKiBjdXJyZW50IHN0YXRlLiAgUmV0dXJucyBNRU5VX0lOREVYX0lOVkFMSUQgaWYgdGhlcmUgaXMgbm8gbWFwcGluZyBmb3IgdGhlCisgKiBnaXZlbiBtZW51IGluIHRoZSBjdXJyZW50IG1vZGUuCisgKi8KKyAgICBpbnQKK2dldF9tZW51X2luZGV4KG1lbnUsIHN0YXRlKQorICAgIHZpbW1lbnVfVAkqbWVudTsKKyAgICBpbnQJCXN0YXRlOworeworICAgIGludAkJaWR4OworCisgICAgaWYgKChzdGF0ZSAmIElOU0VSVCkpCisJaWR4ID0gTUVOVV9JTkRFWF9JTlNFUlQ7CisgICAgZWxzZSBpZiAoc3RhdGUgJiBDTURMSU5FKQorCWlkeCA9IE1FTlVfSU5ERVhfQ01ETElORTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGVsc2UgaWYgKFZJc3VhbF9hY3RpdmUpCisJaWR4ID0gTUVOVV9JTkRFWF9WSVNVQUw7CisjZW5kaWYKKyAgICBlbHNlIGlmIChzdGF0ZSA9PSBISVRSRVRVUk4gfHwgc3RhdGUgPT0gQVNLTU9SRSkKKwlpZHggPSBNRU5VX0lOREVYX0NNRExJTkU7CisgICAgZWxzZSBpZiAoZmluaXNoX29wKQorCWlkeCA9IE1FTlVfSU5ERVhfT1BfUEVORElORzsKKyAgICBlbHNlIGlmICgoc3RhdGUgJiBOT1JNQUwpKQorCWlkeCA9IE1FTlVfSU5ERVhfTk9STUFMOworICAgIGVsc2UKKwlpZHggPSBNRU5VX0lOREVYX0lOVkFMSUQ7CisKKyAgICBpZiAoaWR4ICE9IE1FTlVfSU5ERVhfSU5WQUxJRCAmJiBtZW51LT5zdHJpbmdzW2lkeF0gPT0gTlVMTCkKKwlpZHggPSBNRU5VX0lOREVYX0lOVkFMSUQ7CisgICAgcmV0dXJuIGlkeDsKK30KKyNlbmRpZgorCisvKgorICogRHVwbGljYXRlIHRoZSBtZW51IGl0ZW0gdGV4dCBhbmQgdGhlbiBwcm9jZXNzIHRvIHNlZSBpZiBhIG1uZW1vbmljIGtleQorICogYW5kL29yIGFjY2VsZXJhdG9yIHRleHQgaGFzIGJlZW4gaWRlbnRpZmllZC4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnksIG9yIE5VTEwgZm9yIGZhaWx1cmUuCisgKiBJZiBtbmVtb25pYyAhPSBOVUxMLCAqbW5lbW9uaWMgaXMgc2V0IHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGZpcnN0ICcmJy4KKyAqIElmIGFjdGV4dCAhPSBOVUxMLCAqYWN0ZXh0IGlzIHNldCB0byB0aGUgdGV4dCBhZnRlciB0aGUgZmlyc3QgVEFCLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCittZW51X3RleHQoc3RyLCBtbmVtb25pYywgYWN0ZXh0KQorICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJKm1uZW1vbmljOworICAgIGNoYXJfdQkqKmFjdGV4dDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSp0ZXh0OworCisgICAgLyogTG9jYXRlIGFjY2VsZXJhdG9yIHRleHQsIGFmdGVyIHRoZSBmaXJzdCBUQUIgKi8KKyAgICBwID0gdmltX3N0cmNocihzdHIsIFRBQik7CisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJaWYgKGFjdGV4dCAhPSBOVUxMKQorCSAgICAqYWN0ZXh0ID0gdmltX3N0cnNhdmUocCArIDEpOworCXRleHQgPSB2aW1fc3RybnNhdmUoc3RyLCAoaW50KShwIC0gc3RyKSk7CisgICAgfQorICAgIGVsc2UKKwl0ZXh0ID0gdmltX3N0cnNhdmUoc3RyKTsKKworICAgIC8qIEZpbmQgbW5lbW9uaWMgY2hhcmFjdGVycyAiJmEiIGFuZCByZWR1Y2UgIiYmIiB0byAiJiIuICovCisgICAgZm9yIChwID0gdGV4dDsgcCAhPSBOVUxMOyApCisgICAgeworCXAgPSB2aW1fc3RyY2hyKHAsICcmJyk7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIGlmIChwWzFdID09IE5VTCkJICAgIC8qIHRyYWlsaW5nICImIiAqLworCQlicmVhazsKKwkgICAgaWYgKG1uZW1vbmljICE9IE5VTEwgJiYgcFsxXSAhPSAnJicpCisjaWYgIWRlZmluZWQoX19NVlNfXykgfHwgZGVmaW5lZChNT1RJRjM5MF9NTkVNT05JQ19GSVhFRCkKKwkJKm1uZW1vbmljID0gcFsxXTsKKyNlbHNlCisJICAgIHsKKwkJLyoKKwkJICogV2VsbCB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgTW90aWYgbGlicmFyaWVzIG9uIE9TMzkwIFVuaXguCisJCSAqIFRoZSBtbmVtb25pYyBrZXlzIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2YWx1ZXMKKwkJICogZmlyc3QuCisJCSAqIFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc2VlbiBpbiAyLjggYW5kIDIuOS4KKwkJICovCisJCWNoYXIgYyA9IHBbMV07CisJCV9fZXRvYV9sKCZjLCAxKTsKKwkJKm1uZW1vbmljID0gYzsKKwkgICAgfQorI2VuZGlmCisJICAgIG1jaF9tZW1tb3ZlKHAsIHAgKyAxLCBTVFJMRU4ocCkpOworCSAgICBwID0gcCArIDE7CisJfQorICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJuYW1lIiBjYW4gYmUgYSBtZW51IGluIHRoZSBNZW51QmFyLgorICovCisgICAgaW50CittZW51X2lzX21lbnViYXIobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgcmV0dXJuICghbWVudV9pc19wb3B1cChuYW1lKQorCSAgICAmJiAhbWVudV9pc190b29sYmFyKG5hbWUpCisJICAgICYmICpuYW1lICE9IE1OVV9ISURERU5fQ0hBUik7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAibmFtZSIgaXMgYSBwb3B1cCBtZW51IG5hbWUuCisgKi8KKyAgICBpbnQKK21lbnVfaXNfcG9wdXAobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgcmV0dXJuIChTVFJOQ01QKG5hbWUsICJQb3BVcCIsIDUpID09IDApOworfQorCisjaWYgKGRlZmluZWQoRkVBVF9HVUlfTU9USUYpICYmIChYbVZlcnNpb24gPD0gMTAwMikpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgaWYgIm5hbWUiIGlzIHBhcnQgb2YgYSBwb3B1cCBtZW51LgorICovCisgICAgaW50CittZW51X2lzX2NoaWxkX29mX3BvcHVwKG1lbnUpCisgICAgdmltbWVudV9UICptZW51OworeworICAgIHdoaWxlIChtZW51LT5wYXJlbnQgIT0gTlVMTCkKKwltZW51ID0gbWVudS0+cGFyZW50OworICAgIHJldHVybiBtZW51X2lzX3BvcHVwKG1lbnUtPm5hbWUpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAibmFtZSIgaXMgYSB0b29sYmFyIG1lbnUgbmFtZS4KKyAqLworICAgIGludAorbWVudV9pc190b29sYmFyKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIHJldHVybiAoU1RSTkNNUChuYW1lLCAiVG9vbEJhciIsIDcpID09IDApOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIG5hbWUgaXMgYSBtZW51IHNlcGFyYXRvciBpZGVudGlmaWVyOiBTdGFydHMgYW5kIGVuZHMKKyAqIHdpdGggJy0nCisgKi8KKyAgICBpbnQKK21lbnVfaXNfc2VwYXJhdG9yKG5hbWUpCisgICAgY2hhcl91ICpuYW1lOworeworICAgIHJldHVybiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVtTVFJMRU4obmFtZSkgLSAxXSA9PSAnLScpOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIG1lbnUgaXMgaGlkZGVuOiAgU3RhcnRzIHdpdGggJ10nCisgKi8KKyAgICBzdGF0aWMgaW50CittZW51X2lzX2hpZGRlbihuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyAgICByZXR1cm4gKG5hbWVbMF0gPT0gJ10nKSB8fCAobWVudV9pc19wb3B1cChuYW1lKSAmJiBuYW1lWzVdICE9IE5VTCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgXAorCXx8IChkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgZGVmaW5lZChGRUFUX1RFQVJPRkYpKQorLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBtZW51IGlzIHRoZSB0ZWFyb2ZmIG1lbnUuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyBpbnQKK21lbnVfaXNfdGVhcm9mZihuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyNpZmRlZiBGRUFUX0dVSQorICAgIHJldHVybiAoU1RSQ01QKG5hbWUsIFRFQVJfU1RSSU5HKSA9PSAwKTsKKyNlbHNlCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisKKyAgICBzdGF0aWMgaW50CitnZXRfbWVudV9tb2RlKCkKK3sKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCXJldHVybiBNRU5VX0lOREVYX1ZJU1VBTDsKKyNlbmRpZgorICAgIGlmIChTdGF0ZSAmIElOU0VSVCkKKwlyZXR1cm4gTUVOVV9JTkRFWF9JTlNFUlQ7CisgICAgaWYgKChTdGF0ZSAmIENNRExJTkUpIHx8IFN0YXRlID09IEFTS01PUkUgfHwgU3RhdGUgPT0gSElUUkVUVVJOKQorCXJldHVybiBNRU5VX0lOREVYX0NNRExJTkU7CisgICAgaWYgKGZpbmlzaF9vcCkKKwlyZXR1cm4gTUVOVV9JTkRFWF9PUF9QRU5ESU5HOworICAgIGlmIChTdGF0ZSAmIE5PUk1BTCkKKwlyZXR1cm4gTUVOVV9JTkRFWF9OT1JNQUw7CisgICAgaWYgKFN0YXRlICYgTEFOR01BUCkJLyogbXVzdCBiZSBhICJyIiBjb21tYW5kLCBsaWtlIEluc2VydCBtb2RlICovCisJcmV0dXJuIE1FTlVfSU5ERVhfSU5TRVJUOworICAgIHJldHVybiBNRU5VX0lOREVYX0lOVkFMSUQ7Cit9CisKKy8qCisgKiBBZnRlciB3ZSBoYXZlIHN0YXJ0ZWQgdGhlIEdVSSwgdGhlbiB3ZSBjYW4gY3JlYXRlIGFueSBtZW51cyB0aGF0IGhhdmUgYmVlbgorICogZGVmaW5lZC4gIFRoaXMgaXMgZG9uZSBvbmNlIGhlcmUuICBhZGRfbWVudV9wYXRoKCkgbWF5IGhhdmUgYWxyZWFkeSBiZWVuCisgKiBjYWxsZWQgdG8gZGVmaW5lIHRoZXNlIG1lbnVzLCBhbmQgbWF5IGJlIGNhbGxlZCBhZ2Fpbi4gIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAqIGl0c2VsZiByZWN1cnNpdmVseS4JU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgdG9wIGxldmVsIHdpdGg6CisgKiBndWlfY3JlYXRlX2luaXRpYWxfbWVudXMocm9vdF9tZW51LCBOVUxMKTsKKyAqLworICAgIHZvaWQKK2d1aV9jcmVhdGVfaW5pdGlhbF9tZW51cyhtZW51KQorICAgIHZpbW1lbnVfVAkqbWVudTsKK3sKKyAgICBpbnQJCWlkeCA9IDA7CisKKyAgICB3aGlsZSAobWVudSAhPSBOVUxMKQorICAgIHsKKwkvKiBEb24ndCBhZGQgYSBtZW51IHdoZW4gb25seSBhIHRpcCB3YXMgZGVmaW5lZC4gKi8KKwlpZiAobWVudS0+bW9kZXMgJiBNRU5VX0FMTF9NT0RFUykKKwl7CisJICAgIGlmIChtZW51LT5jaGlsZHJlbiAhPSBOVUxMKQorCSAgICB7CisJCWd1aV9tY2hfYWRkX21lbnUobWVudSwgaWR4KTsKKwkJZ3VpX2NyZWF0ZV9pbml0aWFsX21lbnVzKG1lbnUtPmNoaWxkcmVuKTsKKwkgICAgfQorCSAgICBlbHNlCisJCWd1aV9tY2hfYWRkX21lbnVfaXRlbShtZW51LCBpZHgpOworCX0KKwltZW51ID0gbWVudS0+bmV4dDsKKwkrK2lkeDsKKyAgICB9Cit9CisKKy8qCisgKiBVc2VkIHJlY3Vyc2l2ZWx5IGJ5IGd1aV91cGRhdGVfbWVudXMgKHNlZSBiZWxvdykKKyAqLworICAgIHN0YXRpYyB2b2lkCitndWlfdXBkYXRlX21lbnVzX3JlY3Vyc2UobWVudSwgbW9kZSkKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQltb2RlOworeworICAgIGludAkJZ3JleTsKKworICAgIHdoaWxlIChtZW51KQorICAgIHsKKwlpZiAoKG1lbnUtPm1vZGVzICYgbWVudS0+ZW5hYmxlZCAmIG1vZGUpCisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpICYmIGRlZmluZWQoRkVBVF9URUFST0ZGKQorCQl8fCBtZW51X2lzX3RlYXJvZmYobWVudS0+ZG5hbWUpCisjZW5kaWYKKwkgICApCisJICAgIGdyZXkgPSBGQUxTRTsKKwllbHNlCisJICAgIGdyZXkgPSBUUlVFOworI2lmZGVmIEZFQVRfR1VJX0FUSEVOQQorCS8qIEhpZGluZyBtZW51cyBkb2Vzbid0IHdvcmsgZm9yIEF0aGVuYSwgaXQgY2FuIGNhdXNlIGEgY3Jhc2guICovCisJZ3VpX21jaF9tZW51X2dyZXkobWVudSwgZ3JleSk7CisjZWxzZQorCS8qIE5ldmVyIGhpZGUgYSB0b3BsZXZlbCBtZW51LCBpdCBtYXkgbWFrZSB0aGUgbWVudWJhciByZXNpemUgb3IKKwkgKiBkaXNhcHBlYXIuIFNhbWUgcHJvYmxlbSBmb3IgVG9vbEJhciBpdGVtcy4gKi8KKwlpZiAodmltX3N0cmNocihwX2dvLCBHT19HUkVZKSAhPSBOVUxMIHx8IG1lbnUtPnBhcmVudCA9PSBOVUxMCisjIGlmZGVmIEZFQVRfVE9PTEJBUgorCQl8fCBtZW51X2lzX3Rvb2xiYXIobWVudS0+cGFyZW50LT5uYW1lKQorIyBlbmRpZgorCQkgICApCisJICAgIGd1aV9tY2hfbWVudV9ncmV5KG1lbnUsIGdyZXkpOworCWVsc2UKKwkgICAgZ3VpX21jaF9tZW51X2hpZGRlbihtZW51LCBncmV5KTsKKyNlbmRpZgorCWd1aV91cGRhdGVfbWVudXNfcmVjdXJzZShtZW51LT5jaGlsZHJlbiwgbW9kZSk7CisJbWVudSA9IG1lbnUtPm5leHQ7CisgICAgfQorfQorCisvKgorICogTWFrZSBzdXJlIG9ubHkgdGhlIHZhbGlkIG1lbnUgaXRlbXMgYXBwZWFyIGZvciB0aGlzIG1vZGUuICBJZgorICogZm9yY2VfbWVudV91cGRhdGUgaXMgbm90IFRSVUUsIHRoZW4gd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBtb2RlIGhhcyBjaGFuZ2VkCisgKiBzaW5jZSBsYXN0IHRpbWUuICBJZiAibW9kZXMiIGlzIG5vdCAwLCB0aGVuIHdlIHVzZSB0aGVzZSBtb2RlcyBpbnN0ZWFkLgorICovCisgICAgdm9pZAorZ3VpX3VwZGF0ZV9tZW51cyhtb2RlcykKKyAgICBpbnQJICAgIG1vZGVzOworeworICAgIHN0YXRpYyBpbnQJICAgIHByZXZfbW9kZSA9IC0xOworICAgIGludAkJICAgIG1vZGUgPSAwOworCisgICAgaWYgKG1vZGVzICE9IDB4MCkKKwltb2RlID0gbW9kZXM7CisgICAgZWxzZQorICAgIHsKKwltb2RlID0gZ2V0X21lbnVfbW9kZSgpOworCWlmIChtb2RlID09IE1FTlVfSU5ERVhfSU5WQUxJRCkKKwkgICAgbW9kZSA9IDA7CisJZWxzZQorCSAgICBtb2RlID0gKDEgPDwgbW9kZSk7CisgICAgfQorCisgICAgaWYgKGZvcmNlX21lbnVfdXBkYXRlIHx8IG1vZGUgIT0gcHJldl9tb2RlKQorICAgIHsKKwlndWlfdXBkYXRlX21lbnVzX3JlY3Vyc2Uocm9vdF9tZW51LCBtb2RlKTsKKwlndWlfbWNoX2RyYXdfbWVudWJhcigpOworCXByZXZfbW9kZSA9IG1vZGU7CisJZm9yY2VfbWVudV91cGRhdGUgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX0dVSV9XMzIKKwkvKiBUaGlzIGNhbiBsZWF2ZSBhIHRlYXJvZmYgYXMgYWN0aXZlIHdpbmRvdyAtIG1ha2Ugc3VyZSB3ZQorCSAqIGhhdmUgdGhlIGZvY3VzIDxuZWdyaT4qLworCWd1aV9tY2hfYWN0aXZhdGVfd2luZG93KCk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykgXAorICAgIHx8IGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENoZWNrIGlmIGEga2V5IGlzIHVzZWQgYXMgYSBtbmVtb25pYyBmb3IgYSB0b3BsZXZlbCBtZW51LgorICogQ2FzZSBvZiB0aGUga2V5IGlzIGlnbm9yZWQuCisgKi8KKyAgICBpbnQKK2d1aV9pc19tZW51X3Nob3J0Y3V0KGtleSkKKyAgICBpbnQJCWtleTsKK3sKKyAgICB2aW1tZW51X1QJKm1lbnU7CisKKyAgICBpZiAoa2V5IDwgMjU2KQorCWtleSA9IFRPTE9XRVJfTE9DKGtleSk7CisgICAgZm9yIChtZW51ID0gcm9vdF9tZW51OyBtZW51ICE9IE5VTEw7IG1lbnUgPSBtZW51LT5uZXh0KQorCWlmIChtZW51LT5tbmVtb25pYyA9PSBrZXkKKwkJfHwgKG1lbnUtPm1uZW1vbmljIDwgMjU2ICYmIFRPTE9XRVJfTE9DKG1lbnUtPm1uZW1vbmljKSA9PSBrZXkpKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworLyoKKyAqIERpc3BsYXkgdGhlIFNwZWNpYWwgIlBvcFVwIiBtZW51IGFzIGEgcG9wLXVwIGF0IHRoZSBjdXJyZW50IG1vdXNlCisgKiBwb3NpdGlvbi4gIFRoZSAiUG9wVXBuIiBtZW51IGlzIGZvciBOb3JtYWwgbW9kZSwgIlBvcFVwaSIgZm9yIEluc2VydCBtb2RlLAorICogZXRjLgorICovCisgICAgdm9pZAorZ3VpX3Nob3dfcG9wdXBtZW51KCkKK3sKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgaW50CQltb2RlOworCisgICAgbW9kZSA9IGdldF9tZW51X21vZGUoKTsKKyAgICBpZiAobW9kZSA9PSBNRU5VX0lOREVYX0lOVkFMSUQpCisJcmV0dXJuOworICAgIG1vZGUgPSBtZW51X21vZGVfY2hhcnNbbW9kZV07CisKKyAgICBmb3IgKG1lbnUgPSByb290X21lbnU7IG1lbnUgIT0gTlVMTDsgbWVudSA9IG1lbnUtPm5leHQpCisJaWYgKFNUUk5DTVAoIlBvcFVwIiwgbWVudS0+bmFtZSwgNSkgPT0gMCAmJiBtZW51LT5uYW1lWzVdID09IG1vZGUpCisJICAgIGJyZWFrOworCisgICAgLyogT25seSBzaG93IGEgcG9wdXAgd2hlbiBpdCBpcyBkZWZpbmVkIGFuZCBoYXMgZW50cmllcyAqLworICAgIGlmIChtZW51ICE9IE5VTEwgJiYgbWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkKKwlndWlfbWNoX3Nob3dfcG9wdXBtZW51KG1lbnUpOworfQorI2VuZGlmIC8qIEZFQVRfR1VJICovCisKKyNpZiAoZGVmaW5lZChGRUFUX0dVSV9XMzIpICYmIGRlZmluZWQoRkVBVF9URUFST0ZGKSkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIERlYWwgd2l0aCB0ZWFyb2ZmIGl0ZW1zIHRoYXQgYXJlIGFkZGVkIGxpa2UgYSBtZW51IGl0ZW0uCisgKiBDdXJyZW50bHkgb25seSBmb3IgV2luMzIgR1VJLiAgT3RoZXJzIG1heSBmb2xsb3cgbGF0ZXIuCisgKi8KKworICAgIHZvaWQKK2d1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKGludCBlbmFibGUpCit7CisgICAgaW50CQlwcmlfdGFiW01FTlVERVBUSCArIDFdOworICAgIGludAkJaTsKKworICAgIGlmIChlbmFibGUpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBNRU5VREVQVEg7ICsraSkKKwkgICAgcHJpX3RhYltpXSA9IDUwMDsKKwlwcmlfdGFiW01FTlVERVBUSF0gPSAtMTsKKwlndWlfY3JlYXRlX3RlYXJvZmZzX3JlY3Vyc2Uocm9vdF9tZW51LCAoY2hhcl91ICopIiIsIHByaV90YWIsIDApOworICAgIH0KKyAgICBlbHNlCisJZ3VpX2Rlc3Ryb3lfdGVhcm9mZnNfcmVjdXJzZShyb290X21lbnUpOworICAgIHNfdGVhcm9mZnMgPSBlbmFibGU7Cit9CisKKy8qCisgKiBSZWN1cnNpdmVseSBhZGQgdGVhcm9mZiBpdGVtcworICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9jcmVhdGVfdGVhcm9mZnNfcmVjdXJzZShtZW51LCBwbmFtZSwgcHJpX3RhYiwgcHJpX2lkeCkKKyAgICB2aW1tZW51X1QJCSptZW51OworICAgIGNvbnN0IGNoYXJfdQkqcG5hbWU7CisgICAgaW50CQkJKnByaV90YWI7CisgICAgaW50CQkJcHJpX2lkeDsKK3sKKyAgICBjaGFyX3UJKm5ld3BuYW1lID0gTlVMTDsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CSpkOworCisgICAgaWYgKHByaV90YWJbcHJpX2lkeCArIDFdICE9IC0xKQorCSsrcHJpX2lkeDsKKyAgICB3aGlsZSAobWVudSAhPSBOVUxMKQorICAgIHsKKwlpZiAobWVudS0+Y2hpbGRyZW4gIT0gTlVMTCAmJiBtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisJeworCSAgICAvKiBBZGQgdGhlIG1lbnUgbmFtZSB0byB0aGUgbWVudSBwYXRoLiAgSW5zZXJ0IGEgYmFja3NsYXNoIGJlZm9yZQorCSAgICAgKiBkb3RzIChpdCdzIHVzZWQgdG8gc2VwYXJhdGUgbWVudSBuYW1lcykuICovCisJICAgIGxlbiA9IChpbnQpU1RSTEVOKHBuYW1lKSArIChpbnQpU1RSTEVOKG1lbnUtPm5hbWUpOworCSAgICBmb3IgKHMgPSBtZW51LT5uYW1lOyAqczsgKytzKQorCQlpZiAoKnMgPT0gJy4nIHx8ICpzID09ICdcXCcpCisJCSAgICArK2xlbjsKKwkgICAgbmV3cG5hbWUgPSBhbGxvYyhsZW4gKyBURUFSX0xFTiArIDIpOworCSAgICBpZiAobmV3cG5hbWUgIT0gTlVMTCkKKwkgICAgeworCQlTVFJDUFkobmV3cG5hbWUsIHBuYW1lKTsKKwkJZCA9IG5ld3BuYW1lICsgU1RSTEVOKG5ld3BuYW1lKTsKKwkJZm9yIChzID0gbWVudS0+bmFtZTsgKnM7ICsrcykKKwkJeworCQkgICAgaWYgKCpzID09ICcuJyB8fCAqcyA9PSAnXFwnKQorCQkJKmQrKyA9ICdcXCc7CisJCSAgICAqZCsrID0gKnM7CisJCX0KKwkJKmQgPSBOVUw7CisKKwkJLyogY2hlY2sgaWYgdGVhcm9mZiBhbHJlYWR5IGV4aXN0cyAqLworCQlpZiAoU1RSQ01QKG1lbnUtPmNoaWxkcmVuLT5uYW1lLCBURUFSX1NUUklORykgIT0gMCkKKwkJeworCQkgICAgZ3VpX2FkZF90ZWFyb2ZmKG5ld3BuYW1lLCBwcmlfdGFiLCBwcmlfaWR4IC0gMSk7CisJCSAgICAqZCA9IE5VTDsJCQkvKiByZW1vdmUgVEVBUl9TVFJJTkcgKi8KKwkJfQorCisJCVNUUkNBVChuZXdwbmFtZSwgIi4iKTsKKwkJZ3VpX2NyZWF0ZV90ZWFyb2Zmc19yZWN1cnNlKG1lbnUtPmNoaWxkcmVuLCBuZXdwbmFtZSwKKwkJCQkJCQkgICAgcHJpX3RhYiwgcHJpX2lkeCk7CisJCXZpbV9mcmVlKG5ld3BuYW1lKTsKKwkgICAgfQorCX0KKwltZW51ID0gbWVudS0+bmV4dDsKKyAgICB9Cit9CisKKy8qCisgKiBBZGQgdGVhci1vZmYgbWVudSBpdGVtIGZvciBhIHN1Ym1lbnUuCisgKiAidGVhcnBhdGgiIGlzIHRoZSBtZW51IHBhdGgsIGFuZCBtdXN0IGhhdmUgcm9vbSB0byBhZGQgVEVBUl9TVFJJTkcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ3VpX2FkZF90ZWFyb2ZmKHRlYXJwYXRoLCBwcmlfdGFiLCBwcmlfaWR4KQorICAgIGNoYXJfdQkqdGVhcnBhdGg7CisgICAgaW50CQkqcHJpX3RhYjsKKyAgICBpbnQJCXByaV9pZHg7Cit7CisgICAgY2hhcl91CSp0YnVmOworICAgIGludAkJdDsKKyAgICB2aW1tZW51X1QJbWVudWFyZzsKKworICAgIHRidWYgPSBhbGxvYyg1ICsgKHVuc2lnbmVkIGludClTVFJMRU4odGVhcnBhdGgpKTsKKyAgICBpZiAodGJ1ZiAhPSBOVUxMKQorICAgIHsKKwl0YnVmWzBdID0gS19TUEVDSUFMOworCXRidWZbMV0gPSBLX1NFQ09ORChLX1RFQVJPRkYpOworCXRidWZbMl0gPSBLX1RISVJEKEtfVEVBUk9GRik7CisJU1RSQ1BZKHRidWYgKyAzLCB0ZWFycGF0aCk7CisJU1RSQ0FUKHRidWYgKyAzLCAiXHIiKTsKKworCVNUUkNBVCh0ZWFycGF0aCwgIi4iKTsKKwlTVFJDQVQodGVhcnBhdGgsIFRFQVJfU1RSSU5HKTsKKworCS8qIFByaW9yaXR5IG9mIHRlYXItb2ZmIGlzIGFsd2F5cyAxICovCisJdCA9IHByaV90YWJbcHJpX2lkeCArIDFdOworCXByaV90YWJbcHJpX2lkeCArIDFdID0gMTsKKworI2lmZGVmIEZFQVRfVE9PTEJBUgorCW1lbnVhcmcuaWNvbmZpbGUgPSBOVUxMOworCW1lbnVhcmcuaWNvbmlkeCA9IC0xOworCW1lbnVhcmcuaWNvbl9idWlsdGluID0gRkFMU0U7CisjZW5kaWYKKwltZW51YXJnLm5vcmVtYXBbMF0gPSBSRU1BUF9OT05FOworCW1lbnVhcmcuc2lsZW50WzBdID0gVFJVRTsKKworCW1lbnVhcmcubW9kZXMgPSBNRU5VX0FMTF9NT0RFUzsKKwlhZGRfbWVudV9wYXRoKHRlYXJwYXRoLCAmbWVudWFyZywgcHJpX3RhYiwgdGJ1ZiwgRkFMU0UpOworCisJbWVudWFyZy5tb2RlcyA9IE1FTlVfVElQX01PREU7CisJYWRkX21lbnVfcGF0aCh0ZWFycGF0aCwgJm1lbnVhcmcsIHByaV90YWIsCisJCShjaGFyX3UgKilfKCJUZWFyIG9mZiB0aGlzIG1lbnUiKSwgRkFMU0UpOworCisJcHJpX3RhYltwcmlfaWR4ICsgMV0gPSB0OworCXZpbV9mcmVlKHRidWYpOworICAgIH0KK30KKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGRlc3Ryb3kgdGVhcm9mZiBpdGVtcworICovCisgICAgc3RhdGljIHZvaWQKK2d1aV9kZXN0cm95X3RlYXJvZmZzX3JlY3Vyc2UobWVudSkKKyAgICB2aW1tZW51X1QJKm1lbnU7Cit7CisgICAgd2hpbGUgKG1lbnUpCisgICAgeworCWlmIChtZW51LT5jaGlsZHJlbikKKwl7CisJICAgIC8qIGNoZWNrIGlmIHRlYXJvZmYgZXhpc3RzICovCisJICAgIGlmIChTVFJDTVAobWVudS0+Y2hpbGRyZW4tPm5hbWUsIFRFQVJfU1RSSU5HKSA9PSAwKQorCSAgICB7CisJCS8qIERpc2Nvbm5lY3QgdGhlIGl0ZW0gYW5kIGZyZWUgdGhlIG1lbW9yeSAqLworCQlmcmVlX21lbnUoJm1lbnUtPmNoaWxkcmVuKTsKKwkgICAgfQorCSAgICBpZiAobWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkgLyogaWYgbm90IHRoZSBsYXN0IG9uZSAqLworCQlndWlfZGVzdHJveV90ZWFyb2Zmc19yZWN1cnNlKG1lbnUtPmNoaWxkcmVuKTsKKwl9CisJbWVudSA9IG1lbnUtPm5leHQ7CisgICAgfQorfQorCisjZW5kaWYgLyogRkVBVF9HVUlfVzMyICYmIEZFQVRfVEVBUk9GRiAqLworCisvKgorICogR2l2ZW4gYSBtZW51IGRlc2NyaXB0b3IsIGUuZy4gIkZpbGUuTmV3IiwgZmluZCBpdCBpbiB0aGUgbWVudSBoaWVyYXJjaHkgYW5kCisgKiBleGVjdXRlIGl0LgorICovCisgICAgdm9pZAorZXhfZW1lbnUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICB2aW1tZW51X1QJKm1lbnU7CisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqc2F2ZWRfbmFtZTsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpZHg7CisgICAgY2hhcl91CSptb2RlOworCisgICAgc2F2ZWRfbmFtZSA9IHZpbV9zdHJzYXZlKGVhcC0+YXJnKTsKKyAgICBpZiAoc2F2ZWRfbmFtZSA9PSBOVUxMKQorCXJldHVybjsKKworICAgIG1lbnUgPSByb290X21lbnU7CisgICAgbmFtZSA9IHNhdmVkX25hbWU7CisgICAgd2hpbGUgKCpuYW1lKQorICAgIHsKKwkvKiBGaW5kIGluIHRoZSBtZW51IGhpZXJhcmNoeSAqLworCXAgPSBtZW51X25hbWVfc2tpcChuYW1lKTsKKworCXdoaWxlIChtZW51ICE9IE5VTEwpCisJeworCSAgICBpZiAobWVudV9uYW1lX2VxdWFsKG5hbWUsIG1lbnUpKQorCSAgICB7CisJCWlmICgqcCA9PSBOVUwgJiYgbWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkKKwkJeworCQkgICAgRU1TRyhfKCJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIikpOworCQkgICAgbWVudSA9IE5VTEw7CisJCX0KKwkJZWxzZSBpZiAoKnAgIT0gTlVMICYmIG1lbnUtPmNoaWxkcmVuID09IE5VTEwpCisJCXsKKwkJICAgIEVNU0coXyhlX25vdHN1Ym1lbnUpKTsKKwkJICAgIG1lbnUgPSBOVUxMOworCQl9CisJCWJyZWFrOworCSAgICB9CisJICAgIG1lbnUgPSBtZW51LT5uZXh0OworCX0KKwlpZiAobWVudSA9PSBOVUxMIHx8ICpwID09IE5VTCkKKwkgICAgYnJlYWs7CisJbWVudSA9IG1lbnUtPmNoaWxkcmVuOworCW5hbWUgPSBwOworICAgIH0KKyAgICB2aW1fZnJlZShzYXZlZF9uYW1lKTsKKyAgICBpZiAobWVudSA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKCJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiKSwgZWFwLT5hcmcpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBGb3VuZCB0aGUgbWVudSwgc28gZXhlY3V0ZS4gKi8KKyAgICBpZiAocmVzdGFydF9lZGl0KQorICAgIHsKKwltb2RlID0gKGNoYXJfdSAqKSJJbnNlcnQiOworCWlkeCA9IE1FTlVfSU5ERVhfSU5TRVJUOworICAgIH0KKyAgICBlbHNlIGlmIChlYXAtPmFkZHJfY291bnQpCisgICAgeworCXBvc19UCXRwb3M7CisKKwltb2RlID0gKGNoYXJfdSAqKSJWaXN1YWwiOworCWlkeCA9IE1FTlVfSU5ERVhfVklTVUFMOworCisJLyogR0VEREVTOiBUaGlzIGlzIG5vdCBwZXJmZWN0IC0gYnV0IGl0IGlzIGEKKwkgKiBxdWljayB3YXkgb2YgZGV0ZWN0aW5nIHdoZXRoZXIgd2UgYXJlIGRvaW5nIHRoaXMgZnJvbSBhCisJICogc2VsZWN0aW9uIC0gc2VlIGlmIHRoZSByYW5nZSBtYXRjaGVzIHVwIHdpdGggdGhlIHZpc3VhbAorCSAqIHNlbGVjdCBzdGFydCBhbmQgZW5kLgorCSAqLworCWlmICgoY3VyYnVmLT5iX3Zpc3VhbF9zdGFydC5sbnVtID09IGVhcC0+bGluZTEpCisJCSYmIChjdXJidWYtPmJfdmlzdWFsX2VuZC5sbnVtKSA9PSBlYXAtPmxpbmUyKQorCXsKKwkgICAgLyogU2V0IGl0IHVwIGZvciB2aXN1YWwgbW9kZSAtIGVxdWl2YWxlbnQgdG8gZ3YuICAqLworCSAgICBWSXN1YWxfbW9kZSA9IGN1cmJ1Zi0+Yl92aXN1YWxfbW9kZTsKKwkgICAgdHBvcyA9IGN1cmJ1Zi0+Yl92aXN1YWxfZW5kOworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gY3VyYnVmLT5iX3Zpc3VhbF9zdGFydDsKKwkgICAgY3Vyd2luLT53X2N1cnN3YW50ID0gY3VyYnVmLT5iX3Zpc3VhbF9jdXJzd2FudDsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogU2V0IGl0IHVwIGZvciBsaW5lLXdpc2UgdmlzdWFsIG1vZGUgKi8KKwkgICAgVklzdWFsX21vZGUgPSAnVic7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGVhcC0+bGluZTE7CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMTsKKwkgICAgdHBvcy5sbnVtID0gZWFwLT5saW5lMjsKKwkgICAgdHBvcy5jb2wgPSBNQVhDT0w7CisJfQorCisJLyogQWN0aXZhdGUgdmlzdWFsIG1vZGUKKwkgKi8KKwlWSXN1YWxfYWN0aXZlID0gVFJVRTsKKwlWSXN1YWxfcmVzZWxlY3QgPSBUUlVFOworCWNoZWNrX2N1cnNvcigpOworCVZJc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CisJY3Vyd2luLT53X2N1cnNvciA9IHRwb3M7CisKKwljaGVja19jdXJzb3IoKTsKKworCS8qIEFkanVzdCB0aGUgY3Vyc29yIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCBwb3MKKwkgKiBmb3IgZXhjbHVzaXZlIG1vZGUKKwkgKi8KKwlpZiAoKnBfc2VsID09ICdlJyAmJiBnY2hhcl9jdXJzb3IoKSAhPSBOVUwpCisJICAgICsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbW9kZSA9IChjaGFyX3UgKikiTm9ybWFsIjsKKwlpZHggPSBNRU5VX0lOREVYX05PUk1BTDsKKyAgICB9CisKKyAgICBpZiAoaWR4ICE9IE1FTlVfSU5ERVhfSU5WQUxJRCAmJiBtZW51LT5zdHJpbmdzW2lkeF0gIT0gTlVMTCkKKyAgICB7CisJaW5zX3R5cGVidWYobWVudS0+c3RyaW5nc1tpZHhdLCBtZW51LT5ub3JlbWFwW2lkeF0sIDAsCisJCQkJCQkgICAgIFRSVUUsIG1lbnUtPnNpbGVudFtpZHhdKTsKKyAgICB9CisgICAgZWxzZQorCUVNU0cyKF8oIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiKSwgbW9kZSk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSBcCisJfHwgKGRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiBkZWZpbmVkKEZFQVRfTUVOVSkpIFwKKwl8fCBkZWZpbmVkKEZFQVRfQkVWQUxfVElQKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdpdmVuIGEgbWVudSBkZXNjcmlwdG9yLCBlLmcuICJGaWxlLk5ldyIsIGZpbmQgaXQgaW4gdGhlIG1lbnUgaGllcmFyY2h5LgorICovCisgICAgdmltbWVudV9UICoKK2d1aV9maW5kX21lbnUocGF0aF9uYW1lKQorICAgIGNoYXJfdSAqcGF0aF9uYW1lOworeworICAgIHZpbW1lbnVfVAkqbWVudSA9IE5VTEw7CisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqc2F2ZWRfbmFtZTsKKyAgICBjaGFyX3UJKnA7CisKKyAgICBtZW51ID0gcm9vdF9tZW51OworCisgICAgc2F2ZWRfbmFtZSA9IHZpbV9zdHJzYXZlKHBhdGhfbmFtZSk7CisgICAgaWYgKHNhdmVkX25hbWUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIG5hbWUgPSBzYXZlZF9uYW1lOworICAgIHdoaWxlICgqbmFtZSkKKyAgICB7CisJLyogZmluZCB0aGUgZW5kIG9mIG9uZSBkb3Qtc2VwYXJhdGVkIG5hbWUgYW5kIHB1dCBhIE5VTCBhdCB0aGUgZG90ICovCisJcCA9IG1lbnVfbmFtZV9za2lwKG5hbWUpOworCisJd2hpbGUgKG1lbnUgIT0gTlVMTCkKKwl7CisJICAgIGlmIChTVFJDTVAobmFtZSwgbWVudS0+bmFtZSkgPT0gMCB8fCBTVFJDTVAobmFtZSwgbWVudS0+ZG5hbWUpID09IDApCisJICAgIHsKKwkJaWYgKG1lbnUtPmNoaWxkcmVuID09IE5VTEwpCisJCXsKKwkJICAgIC8qIGZvdW5kIGEgbWVudSBpdGVtIGluc3RlYWQgb2YgYSBzdWItbWVudSAqLworCQkgICAgaWYgKCpwID09IE5VTCkKKwkJCUVNU0coXygiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IikpOworCQkgICAgZWxzZQorCQkJRU1TRyhfKGVfbm90c3VibWVudSkpOworCQkgICAgbWVudSA9IE5VTEw7CisJCSAgICBnb3RvIHRoZWVuZDsKKwkJfQorCQlpZiAoKnAgPT0gTlVMKQkgICAgLyogZm91bmQgYSBmdWxsIG1hdGNoICovCisJCSAgICBnb3RvIHRoZWVuZDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbWVudSA9IG1lbnUtPm5leHQ7CisJfQorCWlmIChtZW51ID09IE5VTEwpCS8qIGRpZG4ndCBmaW5kIGl0ICovCisJICAgIGJyZWFrOworCisJLyogRm91bmQgYSBtYXRjaCwgc2VhcmNoIHRoZSBzdWItbWVudS4gKi8KKwltZW51ID0gbWVudS0+Y2hpbGRyZW47CisJbmFtZSA9IHA7CisgICAgfQorCisgICAgaWYgKG1lbnUgPT0gTlVMTCkKKwlFTVNHKF8oIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIpKTsKK3RoZWVuZDoKKyAgICB2aW1fZnJlZShzYXZlZF9uYW1lKTsKKyAgICByZXR1cm4gbWVudTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisvKgorICogVHJhbnNsYXRpb24gb2YgbWVudSBuYW1lcy4gIEp1c3QgYSBzaW1wbGUgbG9va3VwIHRhYmxlLgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhcl91CSpmcm9tOwkJLyogRW5nbGlzaCBuYW1lICovCisgICAgY2hhcl91CSpmcm9tX25vYW1wOwkvKiBzYW1lLCB3aXRob3V0ICcmJyAqLworICAgIGNoYXJfdQkqdG87CQkvKiB0cmFuc2xhdGVkIG5hbWUgKi8KK30gbWVudXRyYW5zX1Q7CisKK3N0YXRpYyBnYXJyYXlfVCBtZW51dHJhbnNfZ2EgPSB7MCwgMCwgMCwgMCwgTlVMTH07CisjZW5kaWYKKworLyoKKyAqICI6bWVudXRyYW5zIi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBkZWZpbmVkIHdpdGhvdXQgdGhlICttdWx0aV9sYW5nIGZlYXR1cmUsIGluIHdoaWNoCisgKiBjYXNlIHRoZSBjb21tYW5kcyBhcmUgaWdub3JlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZXhfbWVudXRyYW5zbGF0ZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworI2lmZGVmIEZFQVRfTVVMVElfTEFORworICAgIGNoYXJfdQkJKmFyZyA9IGVhcC0+YXJnOworICAgIG1lbnV0cmFuc19UCQkqdHA7CisgICAgaW50CQkJaTsKKyAgICBjaGFyX3UJCSpmcm9tLCAqZnJvbV9ub2FtcCwgKnRvOworCisgICAgaWYgKG1lbnV0cmFuc19nYS5nYV9pdGVtc2l6ZSA9PSAwKQorCWdhX2luaXQyKCZtZW51dHJhbnNfZ2EsIChpbnQpc2l6ZW9mKG1lbnV0cmFuc19UKSwgNSk7CisKKyAgICAvKgorICAgICAqICI6bWVudXRyYW5zIGNsZWFyIjogY2xlYXIgYWxsIHRyYW5zbGF0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoU1RSTkNNUChhcmcsICJjbGVhciIsIDUpID09IDAgJiYgZW5kc19leGNtZCgqc2tpcHdoaXRlKGFyZyArIDUpKSkKKyAgICB7CisJdHAgPSAobWVudXRyYW5zX1QgKiltZW51dHJhbnNfZ2EuZ2FfZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgbWVudXRyYW5zX2dhLmdhX2xlbjsgKytpKQorCXsKKwkgICAgdmltX2ZyZWUodHBbaV0uZnJvbSk7CisJICAgIHZpbV9mcmVlKHRwW2ldLmZyb21fbm9hbXApOworCSAgICB2aW1fZnJlZSh0cFtpXS50byk7CisJfQorCWdhX2NsZWFyKCZtZW51dHJhbnNfZ2EpOworIyBpZmRlZiBGRUFUX0VWQUwKKwkvKiBEZWxldGUgYWxsICJtZW51dHJhbnNfIiBnbG9iYWwgdmFyaWFibGVzLiAqLworCWRlbF9tZW51dHJhbnNfdmFycygpOworIyBlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qICI6bWVudXRyYW5zIGZyb20gdG8iOiBhZGQgdHJhbnNsYXRpb24gKi8KKwlmcm9tID0gYXJnOworCWFyZyA9IG1lbnVfc2tpcF9wYXJ0KGFyZyk7CisJdG8gPSBza2lwd2hpdGUoYXJnKTsKKwkqYXJnID0gTlVMOworCWFyZyA9IG1lbnVfc2tpcF9wYXJ0KHRvKTsKKwlpZiAoYXJnID09IHRvKQorCSAgICBFTVNHKF8oZV9pbnZhcmcpKTsKKwllbHNlCisJeworCSAgICBpZiAoZ2FfZ3JvdygmbWVudXRyYW5zX2dhLCAxKSA9PSBPSykKKwkgICAgeworCQl0cCA9IChtZW51dHJhbnNfVCAqKW1lbnV0cmFuc19nYS5nYV9kYXRhOworCQlmcm9tID0gdmltX3N0cnNhdmUoZnJvbSk7CisJCWZyb21fbm9hbXAgPSBtZW51X3RleHQoZnJvbSwgTlVMTCwgTlVMTCk7CisJCXRvID0gdmltX3N0cm5zYXZlKHRvLCAoaW50KShhcmcgLSB0bykpOworCQlpZiAoZnJvbSAhPSBOVUxMICYmIGZyb21fbm9hbXAgIT0gTlVMTCAmJiB0byAhPSBOVUxMKQorCQl7CisJCSAgICB0cFttZW51dHJhbnNfZ2EuZ2FfbGVuXS5mcm9tID0gZnJvbTsKKwkJICAgIHRwW21lbnV0cmFuc19nYS5nYV9sZW5dLmZyb21fbm9hbXAgPSBmcm9tX25vYW1wOworCQkgICAgdHBbbWVudXRyYW5zX2dhLmdhX2xlbl0udG8gPSB0bzsKKwkJICAgICsrbWVudXRyYW5zX2dhLmdhX2xlbjsKKwkJICAgIC0tbWVudXRyYW5zX2dhLmdhX3Jvb207CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICB2aW1fZnJlZShmcm9tKTsKKwkJICAgIHZpbV9mcmVlKGZyb21fbm9hbXApOworCQkgICAgdmltX2ZyZWUodG8pOworCQl9CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTVVMVElfTEFORykgfHwgZGVmaW5lZChGRUFUX1RPT0xCQVIpCisvKgorICogRmluZCB0aGUgY2hhcmFjdGVyIGp1c3QgYWZ0ZXIgb25lIHBhcnQgb2YgYSBtZW51IG5hbWUuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK21lbnVfc2tpcF9wYXJ0KHApCisgICAgY2hhcl91CSpwOworeworICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnAgIT0gJy4nICYmICF2aW1faXN3aGl0ZSgqcCkpCisgICAgeworCWlmICgoKnAgPT0gJ1xcJyB8fCAqcCA9PSBDdHJsX1YpICYmIHBbMV0gIT0gTlVMKQorCSAgICArK3A7CisJKytwOworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisvKgorICogTG9va3VwIHBhcnQgb2YgYSBtZW51IG5hbWUgaW4gdGhlIHRyYW5zbGF0aW9ucy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRyYW5zbGF0aW9uIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCittZW51dHJhbnNfbG9va3VwKG5hbWUsIGxlbikKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlsZW47Cit7CisgICAgbWVudXRyYW5zX1QJCSp0cCA9IChtZW51dHJhbnNfVCAqKW1lbnV0cmFuc19nYS5nYV9kYXRhOworICAgIGludAkJCWk7CisgICAgY2hhcl91CQkqZG5hbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVudXRyYW5zX2dhLmdhX2xlbjsgKytpKQorCWlmIChTVFJOQ01QKG5hbWUsIHRwW2ldLmZyb20sIGxlbikgPT0gMCAmJiB0cFtpXS5mcm9tW2xlbl0gPT0gTlVMKQorCSAgICByZXR1cm4gdHBbaV0udG87CisKKyAgICAvKiBOb3cgdHJ5IGFnYWluIHdoaWxlIGlnbm9yaW5nICcmJyBjaGFyYWN0ZXJzLiAqLworICAgIGkgPSBuYW1lW2xlbl07CisgICAgbmFtZVtsZW5dID0gTlVMOworICAgIGRuYW1lID0gbWVudV90ZXh0KG5hbWUsIE5VTEwsIE5VTEwpOworICAgIG5hbWVbbGVuXSA9IGk7CisgICAgaWYgKGRuYW1lICE9IE5VTEwpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBtZW51dHJhbnNfZ2EuZ2FfbGVuOyArK2kpCisJICAgIGlmIChTVFJDTVAoZG5hbWUsIHRwW2ldLmZyb21fbm9hbXApID09IDApCisJICAgIHsKKwkJdmltX2ZyZWUoZG5hbWUpOworCQlyZXR1cm4gdHBbaV0udG87CisJICAgIH0KKwl2aW1fZnJlZShkbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogRkVBVF9NVUxUSV9MQU5HICovCisKKyNlbmRpZiAvKiBGRUFUX01FTlUgKi8KZGlmZiAtLWdpdCBhL3NyYy9tZXNzYWdlLmMgYi9zcmMvbWVzc2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWFlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWVzc2FnZS5jCkBAIC0wLDAgKzEsMzE2NSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogbWVzc2FnZS5jOiBmdW5jdGlvbnMgZm9yIGRpc3BsYXlpbmcgbWVzc2FnZXMgb24gdGhlIGNvbW1hbmQgbGluZQorICovCisKKyNkZWZpbmUgTUVTU0FHRV9GSUxFCQkvKiBkb24ndCBpbmNsdWRlIHByb3RvdHlwZSBmb3Igc21zZygpICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfU1REQVJHX0gKKyMgaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVzZXRfbGFzdF9zb3VyY2luZyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBjaGFyX3UgKmdldF9lbXNnX3NvdXJjZSBfX0FSR1MoKGludCBvdGhlcikpOworc3RhdGljIGNoYXJfdSAqZ2V0X2Vtc2dfbG51bSBfX0FSR1MoKGludCBvdGhlcikpOworc3RhdGljIHZvaWQgYWRkX21zZ19oaXN0IF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuLCBpbnQgYXR0cikpOworc3RhdGljIHZvaWQgaGl0X3JldHVybl9tc2cgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBtc2dfaG9tZV9yZXBsYWNlX2F0dHIgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBpbnQgYXR0cikpOworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBjaGFyX3UgKnNjcmVlbl9wdXRzX21ieXRlIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbCwgaW50IGF0dHIpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbXNnX3B1dHNfYXR0cl9sZW4gX19BUkdTKChjaGFyX3UgKnN0ciwgaW50IG1heGxlbiwgaW50IGF0dHIpKTsKK3N0YXRpYyB2b2lkIHRfcHV0cyBfX0FSR1MoKGludCB0X2NvbCwgY2hhcl91ICp0X3MsIGNoYXJfdSAqcywgaW50IGF0dHIpKTsKK3N0YXRpYyB2b2lkIG1zZ19zY3JlZW5fcHV0Y2hhciBfX0FSR1MoKGludCBjLCBpbnQgYXR0cikpOworc3RhdGljIGludCAgbXNnX2NoZWNrX3NjcmVlbiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHJlZGlyX3dyaXRlIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbWF4bGVuKSk7CisjaWZkZWYgRkVBVF9DT05fRElBTE9HCitzdGF0aWMgY2hhcl91ICptc2dfc2hvd19jb25zb2xlX2RpYWxvZyBfX0FSR1MoKGNoYXJfdSAqbWVzc2FnZSwgY2hhcl91ICpidXR0b25zLCBpbnQgZGZsdGJ1dHRvbikpOworc3RhdGljIGludAljb25maXJtX21zZ191c2VkID0gRkFMU0U7CS8qIGRpc3BsYXlpbmcgY29uZmlybV9tc2cgKi8KK3N0YXRpYyBjaGFyX3UJKmNvbmZpcm1fbXNnID0gTlVMTDsJCS8qICI6Y29uZmlybSIgbWVzc2FnZSAqLworc3RhdGljIGNoYXJfdQkqY29uZmlybV9tc2dfdGFpbDsJCS8qIHRhaWwgb2YgY29uZmlybV9tc2cgKi8KKyNlbmRpZgorCitzdHJ1Y3QgbXNnX2hpc3QKK3sKKyAgICBzdHJ1Y3QgbXNnX2hpc3QJKm5leHQ7CisgICAgY2hhcl91CQkqbXNnOworICAgIGludAkJCWF0dHI7Cit9OworCitzdGF0aWMgc3RydWN0IG1zZ19oaXN0ICpmaXJzdF9tc2dfaGlzdCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IG1zZ19oaXN0ICpsYXN0X21zZ19oaXN0ID0gTlVMTDsKK3N0YXRpYyBpbnQgbXNnX2hpc3RfbGVuID0gMDsKK3N0YXRpYyBpbnQgbXNnX2hpc3Rfb2ZmID0gRkFMU0U7CS8qIGRvbid0IGFkZCBtZXNzYWdlcyB0byBoaXN0b3J5ICovCisKKy8qCisgKiBXaGVuIHdyaXRpbmcgbWVzc2FnZXMgdG8gdGhlIHNjcmVlbiwgdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHNpdHVhdGlvbnMuCisgKiBBIG51bWJlciBvZiB2YXJpYWJsZXMgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgY3VycmVudCBzdGF0ZToKKyAqIG1zZ19kaWRhbnkJICAgIFRSVUUgd2hlbiBtZXNzYWdlcyB3ZXJlIHdyaXR0ZW4gc2luY2UgdGhlIGxhc3QgdGltZSB0aGUKKyAqCQkgICAgdXNlciByZWFjdGVkIHRvIGEgcHJvbXB0LgorICoJCSAgICBSZXNldDogQWZ0ZXIgaGl0dGluZyBhIGtleSBmb3IgdGhlIGhpdC1yZXR1cm4gcHJvbXB0LAorICoJCSAgICBoaXR0aW5nIDxDUj4gZm9yIHRoZSBjb21tYW5kIGxpbmUgb3IgaW5wdXQoKS4KKyAqCQkgICAgU2V0OiBXaGVuIGFueSBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gdGhlIHNjcmVlbi4KKyAqIG1zZ19kaWRvdXQJICAgIFRSVUUgd2hlbiBzb21ldGhpbmcgd2FzIHdyaXR0ZW4gdG8gdGhlIGN1cnJlbnQgbGluZS4KKyAqCQkgICAgUmVzZXQ6IFdoZW4gYWR2YW5jaW5nIHRvIHRoZSBuZXh0IGxpbmUsIHdoZW4gdGhlIGN1cnJlbnQKKyAqCQkgICAgdGV4dCBjYW4gYmUgb3ZlcndyaXR0ZW4uCisgKgkJICAgIFNldDogV2hlbiBhbnkgbWVzc2FnZSBpcyB3cml0dGVuIHRvIHRoZSBzY3JlZW4uCisgKiBtc2dfbm93YWl0CSAgICBObyBleHRyYSBkZWxheSBmb3IgdGhlIGxhc3QgZHJhd24gbWVzc2FnZS4KKyAqCQkgICAgVXNlZCBpbiBub3JtYWxfY21kKCkgYmVmb3JlIHRoZSBtb2RlIG1lc3NhZ2UgaXMgZHJhd24uCisgKiBlbXNnX29uX2Rpc3BsYXkgIFRoZXJlIHdhcyBhbiBlcnJvciBtZXNzYWdlIHJlY2VudGx5LiAgSW5kaWNhdGVzIHRoYXQgdGhlcmUKKyAqCQkgICAgc2hvdWxkIGJlIGEgZGVsYXkgYmVmb3JlIHJlZHJhd2luZy4KKyAqIG1zZ19zY3JvbGwJICAgIFRoZSBuZXh0IG1lc3NhZ2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgb25lLgorICogbXNnX3Njcm9sbGVkCSAgICBIb3cgbWFueSBsaW5lcyB0aGUgc2NyZWVuIGhhcyBiZWVuIHNjcm9sbGVkIChiZWNhdXNlIG9mCisgKgkJICAgIG1lc3NhZ2VzKS4gIFVzZWQgaW4gdXBkYXRlX3NjcmVlbigpIHRvIHNjcm9sbCB0aGUgc2NyZWVuCisgKgkJICAgIGJhY2suICBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNjcmVlbiBzY3JvbGxzIGEgbGluZS4KKyAqIG1zZ19zY3JvbGxlZF9pZ24gIFRSVUUgd2hlbiBtc2dfc2Nyb2xsZWQgaXMgbm9uLXplcm8gYW5kIG1zZ19wdXRzX2F0dHIoKQorICoJCSAgICB3cml0ZXMgc29tZXRoaW5nIHdpdGhvdXQgc2Nyb2xsaW5nIHNob3VsZCBub3QgbWFrZQorICoJCSAgICBuZWVkX3dhaXRfcmV0dXJuIHRvIGJlIHNldC4gIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2UgIjp0cyIKKyAqCQkgICAgd29yayB3aXRob3V0IGFuIGV4dHJhIHByb21wdC4KKyAqIGxpbmVzX2xlZnQJICAgIE51bWJlciBvZiBsaW5lcyBhdmFpbGFibGUgZm9yIG1lc3NhZ2VzIGJlZm9yZSB0aGUKKyAqCQkgICAgbW9yZS1wcm9tcHQgaXMgdG8gYmUgZ2l2ZW4uCisgKiBuZWVkX3dhaXRfcmV0dXJuIFRSVUUgd2hlbiB0aGUgaGl0LXJldHVybiBwcm9tcHQgaXMgbmVlZGVkLgorICoJCSAgICBSZXNldDogQWZ0ZXIgZ2l2aW5nIHRoZSBoaXQtcmV0dXJuIHByb21wdCwgd2hlbiB0aGUgdXNlcgorICoJCSAgICBoYXMgYW5zd2VyZWQgc29tZSBvdGhlciBwcm9tcHQuCisgKgkJICAgIFNldDogV2hlbiB0aGUgcnVsZXIgb3IgdHlwZWFoZWFkIGRpc3BsYXkgaXMgb3ZlcndyaXR0ZW4sCisgKgkJICAgIHNjcm9sbGluZyB0aGUgc2NyZWVuIGZvciBzb21lIG1lc3NhZ2UuCisgKiBrZWVwX21zZwkgICAgTWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYWZ0ZXIgcmVkcmF3aW5nIHRoZSBzY3JlZW4sIGluCisgKgkJICAgIG1haW5fbG9vcCgpLgorICoJCSAgICBUaGlzIGlzIGFuIGFsbG9jYXRlZCBzdHJpbmcgb3IgTlVMTCB3aGVuIG5vdCB1c2VkLgorICovCisKKy8qCisgKiBtc2cocykgLSBkaXNwbGF5cyB0aGUgc3RyaW5nICdzJyBvbiB0aGUgc3RhdHVzIGxpbmUKKyAqIFdoZW4gdGVybWluYWwgbm90IGluaXRpYWxpemVkICh5ZXQpIG1jaF9lcnJtc2coLi4pIGlzIHVzZWQuCisgKiByZXR1cm4gVFJVRSBpZiB3YWl0X3JldHVybiBub3QgY2FsbGVkCisgKi8KKyAgICBpbnQKK21zZyhzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICByZXR1cm4gbXNnX2F0dHJfa2VlcChzLCAwLCBGQUxTRSk7Cit9CisKKyAgICBpbnQKK21zZ19hdHRyKHMsIGF0dHIpCisgICAgY2hhcl91CSpzOworICAgIGludAkJYXR0cjsKK3sKKyAgICByZXR1cm4gbXNnX2F0dHJfa2VlcChzLCBhdHRyLCBGQUxTRSk7Cit9CisKKyAgICBpbnQKK21zZ19hdHRyX2tlZXAocywgYXR0ciwga2VlcCkKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlhdHRyOworICAgIGludAkJa2VlcDsJICAgIC8qIFRSVUU6IHNldCBrZWVwX21zZyBpZiBpdCBkb2Vzbid0IHNjcm9sbCAqLworeworICAgIHN0YXRpYyBpbnQJZW50ZXJlZCA9IDA7CisgICAgaW50CQlyZXR2YWw7CisgICAgY2hhcl91CSpidWYgPSBOVUxMOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgaWYgKGF0dHIgPT0gMCkKKwlzZXRfdmltX3Zhcl9zdHJpbmcoVlZfU1RBVFVTTVNHLCBzLCAtMSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSXQgaXMgcG9zc2libGUgdGhhdCBkaXNwbGF5aW5nIGEgbWVzc2FnZXMgY2F1c2VzIGEgcHJvYmxlbSAoZS5nLiwKKyAgICAgKiB3aGVuIHJlZHJhd2luZyB0aGUgd2luZG93KSwgd2hpY2ggY2F1c2VzIGFub3RoZXIgbWVzc2FnZSwgZXRjLi4JVG8KKyAgICAgKiBicmVhayB0aGlzIGxvb3AsIGxpbWl0IHRoZSByZWN1cnNpdmVuZXNzIHRvIDMgbGV2ZWxzLgorICAgICAqLworICAgIGlmIChlbnRlcmVkID49IDMpCisJcmV0dXJuIFRSVUU7CisgICAgKytlbnRlcmVkOworCisgICAgLyogQWRkIG1lc3NhZ2UgdG8gaGlzdG9yeSAodW5sZXNzIGl0J3MgYSByZXBlYXRlZCBrZXB0IG1lc3NhZ2Ugb3IgYQorICAgICAqIHRydW5jYXRlZCBtZXNzYWdlKSAqLworICAgIGlmIChzICE9IGtlZXBfbXNnCisJICAgIHx8ICgqcyAhPSAnPCcKKwkJJiYgbGFzdF9tc2dfaGlzdCAhPSBOVUxMCisJCSYmIGxhc3RfbXNnX2hpc3QtPm1zZyAhPSBOVUxMCisJCSYmIFNUUkNNUChzLCBsYXN0X21zZ19oaXN0LT5tc2cpKSkKKwlhZGRfbXNnX2hpc3QocywgLTEsIGF0dHIpOworCisgICAgLyogV2hlbiBkaXNwbGF5aW5nIGtlZXBfbXNnLCBkb24ndCBsZXQgbXNnX3N0YXJ0KCkgZnJlZSBpdCwgY2FsbGVyIG11c3QgZG8KKyAgICAgKiB0aGF0LiAqLworICAgIGlmIChzID09IGtlZXBfbXNnKQorCWtlZXBfbXNnID0gTlVMTDsKKworICAgIC8qIFRydW5jYXRlIHRoZSBtZXNzYWdlIGlmIG5lZWRlZC4gKi8KKyAgICBidWYgPSBtc2dfc3RydHJ1bmMocyk7CisgICAgaWYgKGJ1ZiAhPSBOVUxMKQorCXMgPSBidWY7CisKKyAgICBtc2dfc3RhcnQoKTsKKyAgICBtc2dfb3V0dHJhbnNfYXR0cihzLCBhdHRyKTsKKyAgICBtc2dfY2xyX2VvcygpOworICAgIHJldHZhbCA9IG1zZ19lbmQoKTsKKworICAgIGlmIChrZWVwICYmIHJldHZhbCAmJiB2aW1fc3Ryc2l6ZShzKSA8IChpbnQpKFJvd3MgLSBjbWRsaW5lX3JvdyAtIDEpCisJCQkJCQkJICAgKiBDb2x1bW5zICsgc2NfY29sKQorICAgIHsKKwlzZXRfa2VlcF9tc2cocyk7CisJa2VlcF9tc2dfYXR0ciA9IDA7CisgICAgfQorCisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICAtLWVudGVyZWQ7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRydW5jYXRlIGEgc3RyaW5nIHN1Y2ggdGhhdCBpdCBjYW4gYmUgcHJpbnRlZCB3aXRob3V0IGNhdXNpbmcgYSBzY3JvbGwuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgb3IgTlVMTCB3aGVuIG5vIHRydW5jYXRpbmcgaXMgZG9uZS4KKyAqLworICAgIGNoYXJfdSAqCittc2dfc3RydHJ1bmMocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgY2hhcl91CSpidWYgPSBOVUxMOworICAgIGludAkJbGVuOworICAgIGludAkJcm9vbTsKKworICAgIC8qIE1heSB0cnVuY2F0ZSBtZXNzYWdlIHRvIGF2b2lkIGEgaGl0LXJldHVybiBwcm9tcHQgKi8KKyAgICBpZiAoIW1zZ19zY3JvbGwgJiYgIW5lZWRfd2FpdF9yZXR1cm4gJiYgc2hvcnRtZXNzKFNITV9UUlVOQ0FMTCkKKwkJCQkJCQkgICAgJiYgIWV4bW9kZV9hY3RpdmUpCisgICAgeworCWxlbiA9IHZpbV9zdHJzaXplKHMpOworCXJvb20gPSAoaW50KShSb3dzIC0gY21kbGluZV9yb3cgLSAxKSAqIENvbHVtbnMgKyBzY19jb2wgLSAxOworCWlmIChsZW4gPiByb29tICYmIHJvb20gPiAwKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChlbmNfdXRmOCkKKwkJLyogbWF5IGhhdmUgdXAgdG8gMTggYnl0ZXMgcGVyIGNlbGwgKDYgcGVyIGNoYXIsIHVwIHRvIHR3bworCQkgKiBjb21wb3NpbmcgY2hhcnMpICovCisJCWJ1ZiA9IGFsbG9jKChyb29tICsgMikgKiAxOCk7CisJICAgIGVsc2UgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwkJLyogbWF5IGhhdmUgdXAgdG8gMiBieXRlcyBwZXIgY2VsbCBmb3IgZXVjLWpwICovCisJCWJ1ZiA9IGFsbG9jKChyb29tICsgMikgKiAyKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCWJ1ZiA9IGFsbG9jKHJvb20gKyAyKTsKKwkgICAgaWYgKGJ1ZiAhPSBOVUxMKQorCQl0cnVuY19zdHJpbmcocywgYnVmLCByb29tKTsKKwl9CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKKy8qCisgKiBUcnVuY2F0ZSBhIHN0cmluZyAicyIgdG8gImJ1ZiIgd2l0aCBjZWxsIHdpZHRoICJyb29tIi4KKyAqICJzIiBhbmQgImJ1ZiIgbWF5IGJlIGVxdWFsLgorICovCisgICAgdm9pZAordHJ1bmNfc3RyaW5nKHMsIGJ1Ziwgcm9vbSkKKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlyb29tOworeworICAgIGludAkJaGFsZjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWU7CisgICAgaW50CQlpOworICAgIGludAkJbjsKKworICAgIHJvb20gLT0gMzsKKyAgICBoYWxmID0gcm9vbSAvIDI7CisgICAgbGVuID0gMDsKKworICAgIC8qIEZpcnN0IHBhcnQ6IFN0YXJ0IG9mIHRoZSBzdHJpbmcuICovCisgICAgZm9yIChlID0gMDsgbGVuIDwgaGFsZjsgKytlKQorICAgIHsKKwlpZiAoc1tlXSA9PSBOVUwpCisJeworCSAgICAvKiB0ZXh0IGZpdHMgd2l0aG91dCB0cnVuY2F0aW5nISAqLworCSAgICBidWZbZV0gPSBOVUw7CisJICAgIHJldHVybjsKKwl9CisJbiA9IHB0cjJjZWxscyhzICsgZSk7CisJaWYgKGxlbiArIG4gPj0gaGFsZikKKwkgICAgYnJlYWs7CisJbGVuICs9IG47CisJYnVmW2VdID0gc1tlXTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgZm9yIChuID0gKCptYl9wdHIybGVuX2NoZWNrKShzICsgZSk7IC0tbiA+IDA7ICkKKwkgICAgeworCQkrK2U7CisJCWJ1ZltlXSA9IHNbZV07CisJICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIC8qIExhc3QgcGFydDogRW5kIG9mIHRoZSBzdHJpbmcuICovCisgICAgaSA9IGU7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChlbmNfZGJjcyAhPSAwKQorICAgIHsKKwkvKiBGb3IgREJDUyBnb2luZyBiYWNrd2FyZHMgaW4gYSBzdHJpbmcgaXMgc2xvdywgYnV0CisJICogY29tcHV0aW5nIHRoZSBjZWxsIHdpZHRoIGlzbid0IHRvbyBzbG93OiBnbyBmb3J3YXJkCisJICogdW50aWwgdGhlIHJlc3QgZml0cy4gKi8KKwluID0gdmltX3N0cnNpemUocyArIGkpOworCXdoaWxlIChsZW4gKyBuID4gcm9vbSkKKwl7CisJICAgIG4gLT0gcHRyMmNlbGxzKHMgKyBpKTsKKwkgICAgaSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMgKyBpKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKGVuY191dGY4KQorICAgIHsKKwkvKiBGb3IgVVRGLTggd2UgY2FuIGdvIGJhY2t3YXJkcyBlYXNpbHkuICovCisJaSA9IChpbnQpU1RSTEVOKHMpOworCWZvciAoOzspCisJeworCSAgICBoYWxmID0gaSAtICgqbWJfaGVhZF9vZmYpKHMsIHMgKyBpIC0gMSkgLSAxOworCSAgICBuID0gcHRyMmNlbGxzKHMgKyBoYWxmKTsKKwkgICAgaWYgKGxlbiArIG4gPiByb29tKQorCQlicmVhazsKKwkgICAgbGVuICs9IG47CisJICAgIGkgPSBoYWxmOworCX0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWZvciAoaSA9IChpbnQpU1RSTEVOKHMpOyBsZW4gKyAobiA9IHB0cjJjZWxscyhzICsgaSAtIDEpKSA8PSByb29tOyAtLWkpCisJICAgIGxlbiArPSBuOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbWlkZGxlIGFuZCBjb3B5IHRoZSBsYXN0IHBhcnQuICovCisgICAgbWNoX21lbW1vdmUoYnVmICsgZSwgIi4uLiIsIChzaXplX3QpMyk7CisgICAgbWNoX21lbW1vdmUoYnVmICsgZSArIDMsIHMgKyBpLCBTVFJMRU4ocyArIGkpICsgMSk7Cit9CisKKy8qCisgKiBBdXRvbWF0aWMgcHJvdG90eXBlIGdlbmVyYXRpb24gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLgorICogTm90ZTogQ2FsbGVyIG9mIHNtZ3MoKSBhbmQgc21zZ19hdHRyKCkgbXVzdCBjaGVjayB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcworICogc2hvcnRlciB0aGFuIElPU0laRSEhIQorICovCisjaWZuZGVmIFBST1RPCisjIGlmbmRlZiBIQVZFX1NUREFSR19ICisKK2ludAorI2lmZGVmIF9fQk9STEFORENfXworX1JUTEVOVFJZRgorI2VuZGlmCitzbXNnIF9fQVJHUygoY2hhcl91ICosIGxvbmcsIGxvbmcsIGxvbmcsCisJCQlsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKSk7CitpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorc21zZ19hdHRyIF9fQVJHUygoaW50LCBjaGFyX3UgKiwgbG9uZywgbG9uZywgbG9uZywKKwkJCWxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpKTsKKworLyogVkFSQVJHUyAqLworICAgIGludAorI2lmZGVmIF9fQk9STEFORENfXworX1JUTEVOVFJZRgorI2VuZGlmCitzbXNnKHMsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkKKyAgICBjaGFyX3UJKnM7CisgICAgbG9uZwlhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTA7Cit7CisgICAgcmV0dXJuIHNtc2dfYXR0cigwLCBzLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApOworfQorCisvKiBWQVJBUkdTICovCisgICAgaW50CisjaWZkZWYgX19CT1JMQU5EQ19fCitfUlRMRU5UUllGCisjZW5kaWYKK3Ntc2dfYXR0cihhdHRyLCBzLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApCisgICAgaW50CQlhdHRyOworICAgIGNoYXJfdQkqczsKKyAgICBsb25nCWExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMDsKK3sKKyAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAoY2hhciAqKXMsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7CisgICAgcmV0dXJuIG1zZ19hdHRyKElPYnVmZiwgYXR0cik7Cit9CisKKyMgZWxzZSAvKiBIQVZFX1NUREFSR19IICovCisKKyAgICBpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorc21zZyhjaGFyX3UgKnMsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ2xpc3Q7CisKKyAgICB2YV9zdGFydChhcmdsaXN0LCBzKTsKKyMgaWZkZWYgSEFWRV9WU05QUklOVEYKKyAgICB2c25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgKGNoYXIgKilzLCBhcmdsaXN0KTsKKyMgZWxzZQorICAgIHZzcHJpbnRmKChjaGFyICopSU9idWZmLCAoY2hhciAqKXMsIGFyZ2xpc3QpOworIyBlbmRpZgorICAgIHZhX2VuZChhcmdsaXN0KTsKKyAgICByZXR1cm4gbXNnKElPYnVmZik7Cit9CisKKyAgICBpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorc21zZ19hdHRyKGludCBhdHRyLCBjaGFyX3UgKnMsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ2xpc3Q7CisKKyAgICB2YV9zdGFydChhcmdsaXN0LCBzKTsKKyMgaWZkZWYgSEFWRV9WU05QUklOVEYKKyAgICB2c25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgKGNoYXIgKilzLCBhcmdsaXN0KTsKKyMgZWxzZQorICAgIHZzcHJpbnRmKChjaGFyICopSU9idWZmLCAoY2hhciAqKXMsIGFyZ2xpc3QpOworIyBlbmRpZgorICAgIHZhX2VuZChhcmdsaXN0KTsKKyAgICByZXR1cm4gbXNnX2F0dHIoSU9idWZmLCBhdHRyKTsKK30KKworIyBlbmRpZiAvKiBIQVZFX1NUREFSR19IICovCisjZW5kaWYKKworLyoKKyAqIFJlbWVtYmVyIHRoZSBsYXN0IHNvdXJjaW5nIG5hbWUvbG51bSB1c2VkIGluIGFuIGVycm9yIG1lc3NhZ2UsIHNvIHRoYXQgaXQKKyAqIGlzbid0IHByaW50ZWQgZWFjaCB0aW1lIHdoZW4gaXQgZGlkbid0IGNoYW5nZS4KKyAqLworc3RhdGljIGludAlsYXN0X3NvdXJjaW5nX2xudW0gPSAwOworc3RhdGljIGNoYXJfdSAgICpsYXN0X3NvdXJjaW5nX25hbWUgPSBOVUxMOworCisvKgorICogUmVzZXQgdGhlIGxhc3QgdXNlZCBzb3VyY2luZyBuYW1lL2xudW0uICBNYWtlcyBzdXJlIGl0IGlzIGRpc3BsYXllZCBhZ2FpbgorICogZm9yIHRoZSBuZXh0IGVycm9yIG1lc3NhZ2U7CisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVzZXRfbGFzdF9zb3VyY2luZygpCit7CisgICAgdmltX2ZyZWUobGFzdF9zb3VyY2luZ19uYW1lKTsKKyAgICBsYXN0X3NvdXJjaW5nX25hbWUgPSBOVUxMOworICAgIGxhc3Rfc291cmNpbmdfbG51bSA9IDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIG1lc3NhZ2UgYWJvdXQgdGhlIHNvdXJjZSwgYXMgdXNlZCBmb3IgYW4gZXJyb3IgbWVzc2FnZS4KKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyB3aXRoIHJvb20gZm9yIG9uZSBtb3JlIGNoYXJhY3Rlci4KKyAqIFJldHVybnMgTlVMTCB3aGVuIG5vIG1lc3NhZ2UgaXMgdG8gYmUgZ2l2ZW4uCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2dldF9lbXNnX3NvdXJjZShvdGhlcikKKyAgICBpbnQJCW90aGVyOwkvKiBUUlVFIHdoZW4gInNvdXJjaW5nX25hbWUiIGRpZmZlcnMgZnJvbSBsYXN0IHRpbWUgKi8KK3sKKyAgICBjaGFyX3UJKkJ1ZiwgKnA7CisKKyAgICBpZiAoc291cmNpbmdfbmFtZSAhPSBOVUxMICYmIG90aGVyKQorICAgIHsKKwlwID0gKGNoYXJfdSAqKV8oIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6Iik7CisJQnVmID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oc291cmNpbmdfbmFtZSkgKyBTVFJMRU4ocCkpKTsKKwlpZiAoQnVmICE9IE5VTEwpCisJICAgIHNwcmludGYoKGNoYXIgKilCdWYsIChjaGFyICopcCwgc291cmNpbmdfbmFtZSk7CisJcmV0dXJuIEJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBHZXQgdGhlIG1lc3NhZ2UgYWJvdXQgdGhlIHNvdXJjZSBsbnVtLCBhcyB1c2VkIGZvciBhbiBlcnJvciBtZXNzYWdlLgorICogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggcm9vbSBmb3Igb25lIG1vcmUgY2hhcmFjdGVyLgorICogUmV0dXJucyBOVUxMIHdoZW4gbm8gbWVzc2FnZSBpcyB0byBiZSBnaXZlbi4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X2Vtc2dfbG51bShvdGhlcikKKyAgICBpbnQJCW90aGVyOwkvKiBUUlVFIHdoZW4gInNvdXJjaW5nX25hbWUiIGRpZmZlcnMgZnJvbSBsYXN0IHRpbWUgKi8KK3sKKyAgICBjaGFyX3UJKkJ1ZiwgKnA7CisKKyAgICAvKiBsbnVtIGlzIDAgd2hlbiBleGVjdXRpbmcgYSBjb21tYW5kIGZyb20gdGhlIGNvbW1hbmQgbGluZQorICAgICAqIGFyZ3VtZW50LCB3ZSBkb24ndCB3YW50IGEgbGluZSBudW1iZXIgdGhlbiAqLworICAgIGlmIChzb3VyY2luZ19uYW1lICE9IE5VTEwKKwkgICAgJiYgKG90aGVyIHx8IHNvdXJjaW5nX2xudW0gIT0gbGFzdF9zb3VyY2luZ19sbnVtKQorCSAgICAmJiBzb3VyY2luZ19sbnVtICE9IDApCisgICAgeworCXAgPSAoY2hhcl91ICopXygibGluZSAlNGxkOiIpOworCUJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKHApICsgMjApKTsKKwlpZiAoQnVmICE9IE5VTEwpCisJICAgIHNwcmludGYoKGNoYXIgKilCdWYsIChjaGFyICopcCwgKGxvbmcpc291cmNpbmdfbG51bSk7CisJcmV0dXJuIEJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBlbXNnKCkgLSBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UKKyAqCisgKiBSaW5ncyB0aGUgYmVsbCwgaWYgYXBwcm9wcmlhdGUsIGFuZCBjYWxscyBtZXNzYWdlKCkgdG8gZG8gdGhlIHJlYWwgd29yaworICogV2hlbiB0ZXJtaW5hbCBub3QgaW5pdGlhbGl6ZWQgKHlldCkgbWNoX2Vycm1zZyguLikgaXMgdXNlZC4KKyAqCisgKiByZXR1cm4gVFJVRSBpZiB3YWl0X3JldHVybiBub3QgY2FsbGVkCisgKi8KKyAgICBpbnQKK2Vtc2cocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgaW50CQlhdHRyOworICAgIGludAkJb3RoZXJfc291cmNpbmdfbmFtZTsKKyAgICBjaGFyX3UJKnA7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgaW50CQlpZ25vcmUgPSBGQUxTRTsKKyAgICBpbnQJCXNldmVyZTsKKyNlbmRpZgorCisgICAgY2FsbGVkX2Vtc2cgPSBUUlVFOworCisgICAgLyoKKyAgICAgKiBJZiAiZW1zZ19zZXZlcmUiIGlzIFRSVUU6IFdoZW4gYW4gZXJyb3IgZXhjZXB0aW9uIGlzIHRvIGJlIHRocm93biwgcHJlZmVyCisgICAgICogdGhpcyBtZXNzYWdlIG92ZXIgcHJldmlvdXMgbWVzc2FnZXMgZm9yIHRoZSBzYW1lIGNvbW1hbmQuCisgICAgICovCisjaWZkZWYgRkVBVF9FVkFMCisgICAgc2V2ZXJlID0gZW1zZ19zZXZlcmU7CisgICAgZW1zZ19zZXZlcmUgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiAiZW1zZ19vZmYiIGlzIHNldDogbm8gZXJyb3IgbWVzc2FnZXMgYXQgdGhlIG1vbWVudC4KKyAgICAgKiBJZiAnZGVidWcnIGlzIHNldDogZG8gZXJyb3IgbWVzc2FnZSBhbnl3YXksIGJ1dCB3aXRob3V0IHNpZGUgZWZmZWN0cy4KKyAgICAgKiBJZiAiZW1zZ19za2lwIiBpcyBzZXQ6IG5ldmVyIGRvIGVycm9yIG1lc3NhZ2VzLgorICAgICAqLworICAgIGlmICgoZW1zZ19vZmYgPiAwICYmICpwX2RlYnVnID09IE5VTCkKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgfHwgZW1zZ19za2lwID4gMAorI2VuZGlmCisJICAgICkKKwlyZXR1cm4gVFJVRTsKKworICAgIGlmIChzb3VyY2luZ19uYW1lICE9IE5VTEwpCisgICAgeworCWlmIChsYXN0X3NvdXJjaW5nX25hbWUgIT0gTlVMTCkKKwkgICAgb3RoZXJfc291cmNpbmdfbmFtZSA9IFNUUkNNUChzb3VyY2luZ19uYW1lLCBsYXN0X3NvdXJjaW5nX25hbWUpOworCWVsc2UKKwkgICAgb3RoZXJfc291cmNpbmdfbmFtZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKwlvdGhlcl9zb3VyY2luZ19uYW1lID0gRkFMU0U7CisKKyAgICBpZiAoIWVtc2dfb2ZmKQorICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwkvKgorCSAqIENhdXNlIGEgdGhyb3cgb2YgYW4gZXJyb3IgZXhjZXB0aW9uIGlmIGFwcHJvcHJpYXRlLiAgRG9uJ3QgZGlzcGxheQorCSAqIHRoZSBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZS4gIChJZiBubyBtYXRjaGluZyBjYXRjaCBjbGF1c2Ugd2lsbAorCSAqIGJlIGZvdW5kLCB0aGUgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZCBsYXRlciBvbi4pICAiaWdub3JlIiBpcyBzZXQKKwkgKiB3aGVuIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBpZ25vcmVkIGNvbXBsZXRlbHkgKHVzZWQgZm9yIHRoZQorCSAqIGludGVycnVwdCBtZXNzYWdlKS4KKwkgKi8KKwlpZiAoY2F1c2VfZXJydGhyb3cocywgc2V2ZXJlLCAmaWdub3JlKSA9PSBUUlVFKQorCXsKKwkgICAgaWYgKCFpZ25vcmUpCisJCWRpZF9lbXNnID0gVFJVRTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyogc2V0ICJ2OmVycm1zZyIsIGFsc28gd2hlbiB1c2luZyAiOnNpbGVudCEgY21kIiAqLworCXNldF92aW1fdmFyX3N0cmluZyhWVl9FUlJNU0csIHMsIC0xKTsKKyNlbmRpZgorCisJLyoKKwkgKiBXaGVuIHVzaW5nICI6c2lsZW50ISBjbWQiIGlnbm9yZSBlcnJvciBtZXNzc2FnZXMuCisJICogQnV0IGRvIHdyaXRlIGl0IHRvIHRoZSByZWRpcmVjdGlvbiBmaWxlLgorCSAqLworCWlmIChlbXNnX3NpbGVudCAhPSAwKQorCXsKKwkgICAgbXNnX3N0YXJ0KCk7CisJICAgIHAgPSBnZXRfZW1zZ19zb3VyY2Uob3RoZXJfc291cmNpbmdfbmFtZSk7CisJICAgIGlmIChwICE9IE5VTEwpCisJICAgIHsKKwkJU1RSQ0FUKHAsICJcbiIpOworCQlyZWRpcl93cml0ZShwLCAtMSk7CisJCXZpbV9mcmVlKHApOworCSAgICB9CisJICAgIHAgPSBnZXRfZW1zZ19sbnVtKG90aGVyX3NvdXJjaW5nX25hbWUpOworCSAgICBpZiAocCAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNBVChwLCAiXG4iKTsKKwkJcmVkaXJfd3JpdGUocCwgLTEpOworCQl2aW1fZnJlZShwKTsKKwkgICAgfQorCSAgICByZWRpcl93cml0ZShzLCAtMSk7CisJICAgIHJldHVybiBUUlVFOworCX0KKworCS8qIFJlc2V0IG1zZ19zaWxlbnQsIGFuIGVycm9yIGNhdXNlcyBtZXNzYWdlcyB0byBiZSBzd2l0Y2hlZCBiYWNrIG9uLiAqLworCW1zZ19zaWxlbnQgPSAwOworCWNtZF9zaWxlbnQgPSBGQUxTRTsKKworCWlmIChnbG9iYWxfYnVzeSkJCS8qIGJyZWFrIDpnbG9iYWwgY29tbWFuZCAqLworCSAgICArK2dsb2JhbF9idXN5OworCisJaWYgKHBfZWIpCisJICAgIGJlZXBfZmx1c2goKTsJCS8qIGFsc28gaW5jbHVkZXMgZmx1c2hfYnVmZmVycygpICovCisJZWxzZQorCSAgICBmbHVzaF9idWZmZXJzKEZBTFNFKTsJLyogZmx1c2ggaW50ZXJuYWwgYnVmZmVycyAqLworCWRpZF9lbXNnID0gVFJVRTsJCS8qIGZsYWcgZm9yIERvT25lQ21kKCkgKi8KKworI2lmZGVmIFZJTUJVRERZCisJaWYgKHNvdXJjaW5nX25hbWUgPT0gTlVMTCkKKwl7CisJICAgIFZpbUJ1ZGR5VGV4dChzLCAyKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgZW1zZ19vbl9kaXNwbGF5ID0gVFJVRTsJLyogcmVtZW1iZXIgdGhlcmUgaXMgYW4gZXJyb3IgbWVzc2FnZSAqLworICAgICsrbXNnX3Njcm9sbDsJCS8qIGRvbid0IG92ZXJ3cml0ZSBhIHByZXZpb3VzIG1lc3NhZ2UgKi8KKyAgICBhdHRyID0gaGxfYXR0cihITEZfRSk7CS8qIHNldCBoaWdobGlnaHQgbW9kZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBpZiAobXNnX3Njcm9sbGVkKQorCW5lZWRfd2FpdF9yZXR1cm4gPSBUUlVFOyAgICAvKiBuZWVkZWQgaW4gY2FzZSBlbXNnKCkgaXMgY2FsbGVkIGFmdGVyCisJCQkJICAgICAqIHdhaXRfcmV0dXJuIGhhcyByZXNldCBuZWVkX3dhaXRfcmV0dXJuCisJCQkJICAgICAqIGFuZCBhIHJlZHJhdyBpcyBleHBlY3RlZCBiZWNhdXNlCisJCQkJICAgICAqIG1zZ19zY3JvbGxlZCBpcyBub24temVybyAqLworCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4KKyAgICAgKi8KKyAgICArK25vX3dhaXRfcmV0dXJuOworICAgIHAgPSBnZXRfZW1zZ19zb3VyY2Uob3RoZXJfc291cmNpbmdfbmFtZSk7CisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJbXNnX2F0dHIocCwgYXR0cik7CisJdmltX2ZyZWUocCk7CisgICAgfQorICAgIHAgPSBnZXRfZW1zZ19sbnVtKG90aGVyX3NvdXJjaW5nX25hbWUpOworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCW1zZ19hdHRyKHAsIGhsX2F0dHIoSExGX04pKTsKKwl2aW1fZnJlZShwKTsKKwlsYXN0X3NvdXJjaW5nX2xudW0gPSBzb3VyY2luZ19sbnVtOyAgLyogb25seSBvbmNlIGZvciBlYWNoIGxpbmUgKi8KKyAgICB9CisgICAgLS1ub193YWl0X3JldHVybjsKKworICAgIC8qIHJlbWVtYmVyIHRoZSBsYXN0IHNvdXJjaW5nIG5hbWUgcHJpbnRlZCwgYWxzbyB3aGVuIGl0J3MgZW1wdHkgKi8KKyAgICBpZiAoc291cmNpbmdfbmFtZSA9PSBOVUxMIHx8IG90aGVyX3NvdXJjaW5nX25hbWUpCisgICAgeworCXZpbV9mcmVlKGxhc3Rfc291cmNpbmdfbmFtZSk7CisJaWYgKHNvdXJjaW5nX25hbWUgPT0gTlVMTCkKKwkgICAgbGFzdF9zb3VyY2luZ19uYW1lID0gTlVMTDsKKwllbHNlCisJICAgIGxhc3Rfc291cmNpbmdfbmFtZSA9IHZpbV9zdHJzYXZlKHNvdXJjaW5nX25hbWUpOworICAgIH0KKyAgICBtc2dfbm93YWl0ID0gRkFMU0U7CQkJLyogd2FpdCBmb3IgdGhpcyBtc2cgKi8KKworICAgIC8qCisgICAgICogRGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZSBpdHNlbGYuCisgICAgICovCisgICAgcmV0dXJuIG1zZ19hdHRyKHMsIGF0dHIpOworfQorCisvKgorICogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9uZSAiJXMiIGFuZCBvbmUgc3RyaW5nIGFyZ3VtZW50LgorICovCisgICAgaW50CitlbXNnMihzLCBhMSkKKyAgICBjaGFyX3UgKnMsICphMTsKK3sKKyAgICByZXR1cm4gZW1zZzMocywgYTEsIE5VTEwpOworfQorCisvKgorICogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9uZSBvciB0d28gIiVzIiBhbmQgb25lIG9yIHR3byBzdHJpbmcgYXJndW1lbnRzLgorICovCisgICAgaW50CitlbXNnMyhzLCBhMSwgYTIpCisgICAgY2hhcl91ICpzLCAqYTEsICphMjsKK3sKKyAgICBpZiAoKGVtc2dfb2ZmID4gMCAmJiAqcF9kZWJ1ZyA9PSBOVUwpCisjaWZkZWYgRkVBVF9FVkFMCisJICAgIHx8IGVtc2dfc2tpcCA+IDAKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIFRSVUU7CQkvKiBubyBlcnJvciBtZXNzYWdlcyBhdCB0aGUgbW9tZW50ICovCisKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBzdHJpbmdzIChqdXN0IGluIGNhc2UpICovCisgICAgaWYgKGExID09IE5VTEwpCisJYTEgPSAoY2hhcl91ICopIltOVUxMXSI7CisgICAgaWYgKGEyID09IE5VTEwpCisJYTIgPSAoY2hhcl91ICopIltOVUxMXSI7CisKKyAgICAvKiBDaGVjayBmb3IgdmVyeSBsb25nIHN0cmluZ3MgKGNhbiBoYXBwZW4gd2l0aCAiOmhlbHAgXkE8Q1I+IikuICovCisgICAgaWYgKFNUUkxFTihzKSArIFNUUkxFTihhMSkgKyBTVFJMRU4oYTIpID49IChzaXplX3QpSU9TSVpFKQorCWExID0gYTIgPSAoY2hhcl91ICopXygiW3N0cmluZyB0b28gbG9uZ10iKTsKKworICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsIChjaGFyICopcywgKGNoYXIgKilhMSwgKGNoYXIgKilhMik7CisgICAgcmV0dXJuIGVtc2coSU9idWZmKTsKK30KKworLyoKKyAqIFByaW50IGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvbmUgIiVsZCIgYW5kIG9uZSBsb25nIGludCBhcmd1bWVudC4KKyAqLworICAgIGludAorZW1zZ24ocywgbikKKyAgICBjaGFyX3UJKnM7CisgICAgbG9uZwluOworeworICAgIGlmICgoZW1zZ19vZmYgPiAwICYmICpwX2RlYnVnID09IE5VTCkKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgfHwgZW1zZ19za2lwID4gMAorI2VuZGlmCisJICAgICkKKwlyZXR1cm4gVFJVRTsJCS8qIG5vIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSBtb21lbnQgKi8KKyAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAoY2hhciAqKXMsIG4pOworICAgIHJldHVybiBlbXNnKElPYnVmZik7Cit9CisKKy8qCisgKiBMaWtlIG1zZygpLCBidXQgdHJ1bmNhdGUgdG8gYSBzaW5nbGUgbGluZSBpZiBwX3NobSBjb250YWlucyAndCcsIG9yIHdoZW4KKyAqICJmb3JjZSIgaXMgVFJVRS4gIFRoaXMgdHJ1bmNhdGVzIGluIGFub3RoZXIgd2F5IGFzIGZvciBub3JtYWwgbWVzc2FnZXMuCisgKiBDYXJlZnVsOiBUaGUgc3RyaW5nIG1heSBiZSBjaGFuZ2VkIGJ5IG1zZ19tYXlfdHJ1bmMoKSEKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwcmludGVkIG1lc3NhZ2UsIGlmIHdhaXRfcmV0dXJuKCkgbm90IGNhbGxlZC4KKyAqLworICAgIGNoYXJfdSAqCittc2dfdHJ1bmNfYXR0cihzLCBmb3JjZSwgYXR0cikKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlmb3JjZTsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgaW50CQluOworCisgICAgLyogQWRkIG1lc3NhZ2UgdG8gaGlzdG9yeSBiZWZvcmUgdHJ1bmNhdGluZyAqLworICAgIGFkZF9tc2dfaGlzdChzLCAtMSwgYXR0cik7CisKKyAgICBzID0gbXNnX21heV90cnVuYyhmb3JjZSwgcyk7CisKKyAgICBtc2dfaGlzdF9vZmYgPSBUUlVFOworICAgIG4gPSBtc2dfYXR0cihzLCBhdHRyKTsKKyAgICBtc2dfaGlzdF9vZmYgPSBGQUxTRTsKKworICAgIGlmIChuKQorCXJldHVybiBzOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogQ2hlY2sgaWYgbWVzc2FnZSAicyIgc2hvdWxkIGJlIHRydW5jYXRlZCBhdCB0aGUgc3RhcnQgKGZvciBmaWxlbmFtZXMpLgorICogUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgdHJ1bmNhdGVkIG1lc3NhZ2Ugc3RhcnRzLgorICogTm90ZTogTWF5IGNoYW5nZSB0aGUgbWVzc2FnZSBieSByZXBsYWNpbmcgYSBjaGFyYWN0ZXIgd2l0aCAnPCcuCisgKi8KKyAgICBjaGFyX3UgKgorbXNnX21heV90cnVuYyhmb3JjZSwgcykKKyAgICBpbnQJCWZvcmNlOworICAgIGNoYXJfdQkqczsKK3sKKyAgICBpbnQJCW47CisgICAgaW50CQlyb29tOworCisgICAgcm9vbSA9IChpbnQpKFJvd3MgLSBjbWRsaW5lX3JvdyAtIDEpICogQ29sdW1ucyArIHNjX2NvbCAtIDE7CisgICAgaWYgKChmb3JjZSB8fCAoc2hvcnRtZXNzKFNITV9UUlVOQykgJiYgIWV4bW9kZV9hY3RpdmUpKQorCSAgICAmJiAobiA9IChpbnQpU1RSTEVOKHMpIC0gcm9vbSkgPiAwKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGludAlzaXplID0gdmltX3N0cnNpemUocyk7CisKKwkgICAgZm9yIChuID0gMDsgc2l6ZSA+PSByb29tOyApCisJICAgIHsKKwkJc2l6ZSAtPSAoKm1iX3B0cjJjZWxscykocyArIG4pOworCQluICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocyArIG4pOworCSAgICB9CisJICAgIC0tbjsKKwl9CisjZW5kaWYKKwlzICs9IG47CisJKnMgPSAnPCc7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisgICAgc3RhdGljIHZvaWQKK2FkZF9tc2dfaGlzdChzLCBsZW4sIGF0dHIpCisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOwkJLyogLTEgZm9yIHVuZGV0ZXJtaW5lZCBsZW5ndGggKi8KKyAgICBpbnQJCWF0dHI7Cit7CisgICAgc3RydWN0IG1zZ19oaXN0ICpwOworCisgICAgaWYgKG1zZ19oaXN0X29mZiB8fCBtc2dfc2lsZW50ICE9IDApCisJcmV0dXJuOworCisgICAgLyogRG9uJ3QgbGV0IHRoZSBtZXNzYWdlIGhpc3RvcnkgZ2V0IHRvbyBiaWcgKi8KKyAgICB3aGlsZSAobXNnX2hpc3RfbGVuID4gMjApCisgICAgeworCXAgPSBmaXJzdF9tc2dfaGlzdDsKKwlmaXJzdF9tc2dfaGlzdCA9IHAtPm5leHQ7CisJdmltX2ZyZWUocC0+bXNnKTsKKwl2aW1fZnJlZShwKTsKKwktLW1zZ19oaXN0X2xlbjsKKyAgICB9CisgICAgLyogYWxsb2NhdGUgYW4gZW50cnkgYW5kIGFkZCB0aGUgbWVzc2FnZSBhdCB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5ICovCisgICAgcCA9IChzdHJ1Y3QgbXNnX2hpc3QgKilhbGxvYygoaW50KXNpemVvZihzdHJ1Y3QgbXNnX2hpc3QpKTsKKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwlpZiAobGVuIDwgMCkKKwkgICAgbGVuID0gKGludClTVFJMRU4ocyk7CisJLyogcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5ld2xpbmVzICovCisJd2hpbGUgKGxlbiA+IDAgJiYgKnMgPT0gJ1xuJykKKwl7CisJICAgICsrczsKKwkgICAgLS1sZW47CisJfQorCXdoaWxlIChsZW4gPiAwICYmIHNbbGVuIC0gMV0gPT0gJ1xuJykKKwkgICAgLS1sZW47CisJcC0+bXNnID0gdmltX3N0cm5zYXZlKHMsIGxlbik7CisJcC0+bmV4dCA9IE5VTEw7CisJcC0+YXR0ciA9IGF0dHI7CisJaWYgKGxhc3RfbXNnX2hpc3QgIT0gTlVMTCkKKwkgICAgbGFzdF9tc2dfaGlzdC0+bmV4dCA9IHA7CisJbGFzdF9tc2dfaGlzdCA9IHA7CisJaWYgKGZpcnN0X21zZ19oaXN0ID09IE5VTEwpCisJICAgIGZpcnN0X21zZ19oaXN0ID0gbGFzdF9tc2dfaGlzdDsKKwkrK21zZ19oaXN0X2xlbjsKKyAgICB9Cit9CisKKy8qCisgKiAiOm1lc3NhZ2VzIiBjb21tYW5kLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitleF9tZXNzYWdlcyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHN0cnVjdCBtc2dfaGlzdCAqcDsKKyAgICBjaGFyX3UJICAgICpzOworCisgICAgbXNnX2hpc3Rfb2ZmID0gVFJVRTsKKworICAgIHMgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiTEFORyIpOworICAgIGlmIChzICE9IE5VTEwgJiYgKnMgIT0gTlVMKQorCW1zZ19hdHRyKChjaGFyX3UgKikKKwkJXygiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iKSwKKwkJaGxfYXR0cihITEZfVCkpOworCisgICAgZm9yIChwID0gZmlyc3RfbXNnX2hpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJaWYgKHAtPm1zZyAhPSBOVUxMKQorCSAgICBtc2dfYXR0cihwLT5tc2csIHAtPmF0dHIpOworCisgICAgbXNnX2hpc3Rfb2ZmID0gRkFMU0U7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykgfHwgZGVmaW5lZChQUk9UTykKK3N0YXRpYyB2b2lkIG1zZ19lbmRfcHJvbXB0IF9fQVJHUygodm9pZCkpOworCisvKgorICogQ2FsbCB0aGlzIGFmdGVyIHByb21wdGluZyB0aGUgdXNlci4gIFRoaXMgd2lsbCBhdm9pZCBhIGhpdC1yZXR1cm4gbWVzc2FnZQorICogYW5kIGEgZGVsYXkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbXNnX2VuZF9wcm9tcHQoKQoreworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBlbXNnX29uX2Rpc3BsYXkgPSBGQUxTRTsKKyAgICBjbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisgICAgbXNnX2NvbCA9IDA7CisgICAgbXNnX2Nscl9lb3MoKTsKK30KKyNlbmRpZgorCisvKgorICogd2FpdCBmb3IgdGhlIHVzZXIgdG8gaGl0IGEga2V5IChub3JtYWxseSBhIHJldHVybikKKyAqIGlmICdyZWRyYXcnIGlzIFRSVUUsIGNsZWFyIGFuZCByZWRyYXcgdGhlIHNjcmVlbgorICogaWYgJ3JlZHJhdycgaXMgRkFMU0UsIGp1c3QgcmVkcmF3IHRoZSBzY3JlZW4KKyAqIGlmICdyZWRyYXcnIGlzIC0xLCBkb24ndCByZWRyYXcgYXQgYWxsCisgKi8KKyAgICB2b2lkCit3YWl0X3JldHVybihyZWRyYXcpCisgICAgaW50CQlyZWRyYXc7Cit7CisgICAgaW50CQljOworICAgIGludAkJb2xkU3RhdGU7CisgICAgaW50CQl0bXBTdGF0ZTsKKyNpZm5kZWYgT1JHX0hJVFJFVFVSTgorICAgIGludAkJaGFkX2dvdF9pbnQ7CisjZW5kaWYKKworICAgIGlmIChyZWRyYXcgPT0gVFJVRSkKKwltdXN0X3JlZHJhdyA9IENMRUFSOworCisgICAgLyogSWYgdXNpbmcgIjpzaWxlbnQgY21kIiwgZG9uJ3Qgd2FpdCBmb3IgYSByZXR1cm4uICBBbHNvIGRvbid0IHNldAorICAgICAqIG5lZWRfd2FpdF9yZXR1cm4gdG8gZG8gaXQgbGF0ZXIuICovCisgICAgaWYgKG1zZ19zaWxlbnQgIT0gMCkKKwlyZXR1cm47CisKKy8qCisgKiBXaXRoIHRoZSBnbG9iYWwgY29tbWFuZCAoYW5kIHNvbWUgb3RoZXJzKSB3ZSBvbmx5IG5lZWQgb25lIHJldHVybiBhdCB0aGUKKyAqIGVuZC4gQWRqdXN0IGNtZGxpbmVfcm93IHRvIGF2b2lkIHRoZSBuZXh0IG1lc3NhZ2Ugb3ZlcndyaXRpbmcgdGhlIGxhc3Qgb25lLgorICogV2hlbiBpbnNpZGUgdmdldGMoKSwgd2UgY2FuJ3Qgd2FpdCBmb3IgYSB0eXBlZCBjaGFyYWN0ZXIgYXQgYWxsLgorICovCisgICAgaWYgKHZnZXRjX2J1c3kpCisJcmV0dXJuOworICAgIGlmIChub193YWl0X3JldHVybikKKyAgICB7CisJbmVlZF93YWl0X3JldHVybiA9IFRSVUU7CisJaWYgKCFleG1vZGVfYWN0aXZlKQorCSAgICBjbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJcmV0dXJuOworICAgIH0KKworICAgIHJlZGlyX29mZiA9IFRSVUU7CQkvKiBkb24ndCByZWRpcmVjdCB0aGlzIG1lc3NhZ2UgKi8KKyAgICBvbGRTdGF0ZSA9IFN0YXRlOworICAgIGlmIChxdWl0X21vcmUpCisgICAgeworCWMgPSBDQVI7CQkvKiBqdXN0IHByZXRlbmQgQ1Igd2FzIGhpdCAqLworCXF1aXRfbW9yZSA9IEZBTFNFOworCWdvdF9pbnQgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSBpZiAoZXhtb2RlX2FjdGl2ZSkKKyAgICB7CisJTVNHX1BVVFMoIiAiKTsJCS8qIG1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzIG9uIHRoZSByaWdodCBsaW5lICovCisJYyA9IENBUjsJCS8qIG5vIG5lZWQgZm9yIGEgcmV0dXJuIGluIGV4IG1vZGUgKi8KKwlnb3RfaW50ID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogTWFrZSBzdXJlIHRoZSBoaXQtcmV0dXJuIHByb21wdCBpcyBvbiBzY3JlZW4gd2hlbiAnZ3Vpb3B0aW9ucycgd2FzCisJICoganVzdCBjaGFuZ2VkLiAqLworCXNjcmVlbmFsbG9jKEZBTFNFKTsKKworCVN0YXRlID0gSElUUkVUVVJOOworI2lmZGVmIEZFQVRfTU9VU0UKKwlzZXRtb3VzZSgpOworI2VuZGlmCisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKwlkb250X3Njcm9sbCA9IFRSVUU7CQkvKiBkaXNhbGxvdyBzY3JvbGxpbmcgaGVyZSAqLworI2VuZGlmCisJaGl0X3JldHVybl9tc2coKTsKKworI2lmZGVmIE9SR19ISVRSRVRVUk4KKwlkbworCXsKKwkgICAgYyA9IHNhZmVfdmdldGMoKTsKKwl9IHdoaWxlICh2aW1fc3RyY2hyKChjaGFyX3UgKikiXHJcbjogIiwgYykgPT0gTlVMTCk7CisJaWYgKGMgPT0gJzonKQkJCS8qIHRoaXMgY2FuIHZpIHRvbyAoYnV0IG5vdCBhbHdheXMhKSAqLworCSAgICBzdHVmZmNoYXJSZWFkYnVmZihjKTsKKyNlbHNlCisJZG8KKwl7CisJICAgIC8qIFJlbWVtYmVyICJnb3RfaW50IiwgaWYgaXQgaXMgc2V0IHZnZXRjKCkgcHJvYmFibHkgcmV0dXJucyBhCisJICAgICAqIENUUkwtQywgYnV0IHdlIG5lZWQgdG8gbG9vcCB0aGVuLiAqLworCSAgICBoYWRfZ290X2ludCA9IGdvdF9pbnQ7CisJICAgIGMgPSBzYWZlX3ZnZXRjKCk7CisJICAgIGlmICghZ2xvYmFsX2J1c3kpCisJCWdvdF9pbnQgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorCSAgICAvKiBTdHJhbmdlIHdheSB0byBhbGxvdyBjb3B5aW5nICh5YW5raW5nKSBhIG1vZGVsZXNzIHNlbGVjdGlvbiBhdAorCSAgICAgKiB0aGUgaGl0LWVudGVyIHByb21wdC4gIFVzZSBDVFJMLVksIGJlY2F1c2UgdGhlIHNhbWUgaXMgdXNlZCBpbgorCSAgICAgKiBDbWRsaW5lLW1vZGUgYW5kIGl0J3MgaGFybWxlc3Mgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uICovCisJICAgIGlmIChjID09IEN0cmxfWSAmJiBjbGlwX3N0YXIuc3RhdGUgPT0gU0VMRUNUX0RPTkUpCisJICAgIHsKKwkJY2xpcF9jb3B5X21vZGVsZXNzX3NlbGVjdGlvbihUUlVFKTsKKwkJYyA9IEtfSUdOT1JFOworCSAgICB9CisjZW5kaWYKKwl9IHdoaWxlICgoaGFkX2dvdF9pbnQgJiYgYyA9PSBDdHJsX0MpCisJCQkJfHwgYyA9PSBLX0lHTk9SRQorI2lmZGVmIEZFQVRfR1VJCisJCQkJfHwgYyA9PSBLX1ZFUl9TQ1JPTExCQVIgfHwgYyA9PSBLX0hPUl9TQ1JPTExCQVIKKyNlbmRpZgorI2lmZGVmIEZFQVRfTU9VU0UKKwkJCQl8fCBjID09IEtfTEVGVERSQUcgICB8fCBjID09IEtfTEVGVFJFTEVBU0UKKwkJCQl8fCBjID09IEtfTUlERExFRFJBRyB8fCBjID09IEtfTUlERExFUkVMRUFTRQorCQkJCXx8IGMgPT0gS19SSUdIVERSQUcgIHx8IGMgPT0gS19SSUdIVFJFTEVBU0UKKwkJCQl8fCBjID09IEtfTU9VU0VET1dOICB8fCBjID09IEtfTU9VU0VVUAorCQkJCXx8ICghbW91c2VfaGFzKE1PVVNFX1JFVFVSTikKKwkJCQkgICAgJiYgbW91c2Vfcm93IDwgbXNnX3JvdworCQkJCSAgICAmJiAoYyA9PSBLX0xFRlRNT1VTRQorCQkJCQl8fCBjID09IEtfTUlERExFTU9VU0UKKwkJCQkJfHwgYyA9PSBLX1JJR0hUTU9VU0UKKwkJCQkJfHwgYyA9PSBLX1gxTU9VU0UKKwkJCQkJfHwgYyA9PSBLX1gyTU9VU0UpKQorI2VuZGlmCisJCQkJKTsKKwl1aV9icmVha2NoZWNrKCk7CisjaWZkZWYgRkVBVF9NT1VTRQorCS8qCisJICogQXZvaWQgdGhhdCB0aGUgbW91c2UtdXAgZXZlbnQgY2F1c2VzIHZpc3VhbCBtb2RlIHRvIHN0YXJ0LgorCSAqLworCWlmIChjID09IEtfTEVGVE1PVVNFIHx8IGMgPT0gS19NSURETEVNT1VTRSB8fCBjID09IEtfUklHSFRNT1VTRQorCQkJCQkgIHx8IGMgPT0gS19YMU1PVVNFIHx8IGMgPT0gS19YMk1PVVNFKQorCSAgICAodm9pZClqdW1wX3RvX21vdXNlKE1PVVNFX1NFVFBPUywgTlVMTCwgMCk7CisJZWxzZQorI2VuZGlmCisJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiXHJcbiAiLCBjKSA9PSBOVUxMICYmIGMgIT0gQ3RybF9DKQorCXsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoYyk7CisJICAgIGRvX3JlZHJhdyA9IFRSVUU7CSAgICAvKiBuZWVkIGEgcmVkcmF3IGV2ZW4gdGhvdWdoIHRoZXJlIGlzCisJCQkJICAgICAgIHNvbWV0aGluZyBpbiB0aGUgc3R1ZmYgYnVmZmVyICovCisJfQorI2VuZGlmCisgICAgfQorICAgIHJlZGlyX29mZiA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgdXNlciBoaXRzICc6JywgJz8nIG9yICcvJyB3ZSBnZXQgYSBjb21tYW5kIGxpbmUgZnJvbSB0aGUgbmV4dAorICAgICAqIGxpbmUuCisgICAgICovCisgICAgaWYgKGMgPT0gJzonIHx8IGMgPT0gJz8nIHx8IGMgPT0gJy8nKQorICAgIHsKKwlpZiAoIWV4bW9kZV9hY3RpdmUpCisJICAgIGNtZGxpbmVfcm93ID0gbXNnX3JvdzsKKwlza2lwX3JlZHJhdyA9IFRSVUU7CSAgICAvKiBza2lwIHJlZHJhdyBvbmNlICovCisJZG9fcmVkcmF3ID0gRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgd2luZG93IHNpemUgY2hhbmdlZCBzZXRfc2hlbGxzaXplKCkgd2lsbCByZWRyYXcgdGhlIHNjcmVlbi4KKyAgICAgKiBPdGhlcndpc2UgdGhlIHNjcmVlbiBpcyBvbmx5IHJlZHJhd24gaWYgJ3JlZHJhdycgaXMgc2V0IGFuZCBubyAnOicKKyAgICAgKiB0eXBlZC4KKyAgICAgKi8KKyAgICB0bXBTdGF0ZSA9IFN0YXRlOworICAgIFN0YXRlID0gb2xkU3RhdGU7CQkgICAgLyogcmVzdG9yZSBTdGF0ZSBiZWZvcmUgc2V0X3NoZWxsc2l6ZSAqLworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzZXRtb3VzZSgpOworI2VuZGlmCisgICAgbXNnX2NoZWNrKCk7CisKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorICAgIC8qCisgICAgICogV2hlbiBzd2l0Y2hpbmcgc2NyZWVucywgd2UgbmVlZCB0byBvdXRwdXQgYW4gZXh0cmEgbmV3bGluZSBvbiBleGl0LgorICAgICAqLworICAgIGlmIChzd2FwcGluZ19zY3JlZW4oKSAmJiAhdGVybWNhcF9hY3RpdmUpCisJbmV3bGluZV9vbl9leGl0ID0gVFJVRTsKKyNlbmRpZgorCisgICAgbmVlZF93YWl0X3JldHVybiA9IEZBTFNFOworICAgIGRpZF93YWl0X3JldHVybiA9IFRSVUU7CisgICAgZW1zZ19vbl9kaXNwbGF5ID0gRkFMU0U7CS8qIGNhbiBkZWxldGUgZXJyb3IgbWVzc2FnZSBub3cgKi8KKyAgICBsaW5lc19sZWZ0ID0gLTE7CQkvKiByZXNldCBsaW5lc19sZWZ0IGF0IG5leHQgbXNnX3N0YXJ0KCkgKi8KKyAgICByZXNldF9sYXN0X3NvdXJjaW5nKCk7CisgICAgaWYgKGtlZXBfbXNnICE9IE5VTEwgJiYgdmltX3N0cnNpemUoa2VlcF9tc2cpID49CisJCQkJICAoUm93cyAtIGNtZGxpbmVfcm93IC0gMSkgKiBDb2x1bW5zICsgc2NfY29sKQorICAgIHsKKwl2aW1fZnJlZShrZWVwX21zZyk7CisJa2VlcF9tc2cgPSBOVUxMOwkgICAgLyogZG9uJ3QgcmVkaXNwbGF5IG1lc3NhZ2UsIGl0J3MgdG9vIGxvbmcgKi8KKyAgICB9CisKKyAgICBpZiAodG1wU3RhdGUgPT0gU0VUV1NJWkUpCSAgICAvKiBnb3QgcmVzaXplIGV2ZW50IHdoaWxlIGluIHZnZXRjKCkgKi8KKyAgICB7CisJc3RhcnR0ZXJtY2FwKCk7CQkgICAgLyogc3RhcnQgdGVybWNhcCBiZWZvcmUgcmVkcmF3aW5nICovCisJc2hlbGxfcmVzaXplZCgpOworICAgIH0KKyAgICBlbHNlIGlmICghc2tpcF9yZWRyYXcKKwkgICAgJiYgKHJlZHJhdyA9PSBUUlVFIHx8IChtc2dfc2Nyb2xsZWQgIT0gMCAmJiByZWRyYXcgIT0gLTEpKSkKKyAgICB7CisJc3RhcnR0ZXJtY2FwKCk7CQkgICAgLyogc3RhcnQgdGVybWNhcCBiZWZvcmUgcmVkcmF3aW5nICovCisJcmVkcmF3X2xhdGVyKFZBTElEKTsKKyAgICB9Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgaGl0LXJldHVybiBwcm9tcHQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraGl0X3JldHVybl9tc2coKQoreworICAgIGlmIChtc2dfZGlkb3V0KQkJICAgIC8qIHN0YXJ0IG9uIGEgbmV3IGxpbmUgKi8KKwltc2dfcHV0Y2hhcignXG4nKTsKKyAgICBpZiAoZ290X2ludCkKKwlNU0dfUFVUUyhfKCJJbnRlcnJ1cHQ6ICIpKTsKKworI2lmZGVmIE9SR19ISVRSRVRVUk4KKyAgICBNU0dfUFVUU19BVFRSKF8oIkhpdCBFTlRFUiB0byBjb250aW51ZSIpLCBobF9hdHRyKEhMRl9SKSk7CisjZWxzZQorICAgIE1TR19QVVRTX0FUVFIoXygiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIpLCBobF9hdHRyKEhMRl9SKSk7CisjZW5kaWYKKyAgICBpZiAoIW1zZ191c2VfcHJpbnRmKCkpCisJbXNnX2Nscl9lb3MoKTsKK30KKworLyoKKyAqIFNldCAia2VlcF9tc2ciIHRvICJzIi4gIEZyZWUgdGhlIG9sZCB2YWx1ZSBhbmQgY2hlY2sgZm9yIE5VTEwgcG9pbnRlci4KKyAqLworICAgIHZvaWQKK3NldF9rZWVwX21zZyhzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICB2aW1fZnJlZShrZWVwX21zZyk7CisgICAgaWYgKHMgIT0gTlVMTCAmJiBtc2dfc2lsZW50ID09IDApCisJa2VlcF9tc2cgPSB2aW1fc3Ryc2F2ZShzKTsKKyAgICBlbHNlCisJa2VlcF9tc2cgPSBOVUxMOworfQorCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0dGluZyBjaGFyYWN0ZXJzIGluIHRoZSBjb21tYW5kIGxpbmUuCisgKi8KKyAgICB2b2lkCittc2dfc3RhcnQoKQoreworICAgIGludAkJZGlkX3JldHVybiA9IEZBTFNFOworCisgICAgdmltX2ZyZWUoa2VlcF9tc2cpOworICAgIGtlZXBfbXNnID0gTlVMTDsJCQkvKiBkb24ndCBkaXNwbGF5IG9sZCBtZXNzYWdlIG5vdyAqLworICAgIGlmICghbXNnX3Njcm9sbCAmJiBmdWxsX3NjcmVlbikJLyogb3ZlcndyaXRlIGxhc3QgbWVzc2FnZSAqLworICAgIHsKKwltc2dfcm93ID0gY21kbGluZV9yb3c7CisJbXNnX2NvbCA9CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgY21kbXNnX3JsID8gQ29sdW1ucyAtIDEgOgorI2VuZGlmCisJICAgIDA7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZ19kaWRvdXQpCQkgICAgLyogc3RhcnQgbWVzc2FnZSBvbiBuZXh0IGxpbmUgKi8KKyAgICB7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJZGlkX3JldHVybiA9IFRSVUU7CisJaWYgKGV4bW9kZV9hY3RpdmUgIT0gRVhNT0RFX05PUk1BTCkKKwkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93OworICAgIH0KKyAgICBpZiAoIW1zZ19kaWRhbnkgfHwgbGluZXNfbGVmdCA8IDApCisJbXNnX3N0YXJ0aGVyZSgpOworICAgIGlmIChtc2dfc2lsZW50ID09IDApCisgICAgeworCW1zZ19kaWRvdXQgPSBGQUxTRTsJCSAgICAvKiBubyBvdXRwdXQgb24gY3VycmVudCBsaW5lIHlldCAqLworCWN1cnNvcl9vZmYoKTsKKyAgICB9CisKKyAgICAvKiB3aGVuIHJlZGlyZWN0aW5nLCBtYXkgbmVlZCB0byBzdGFydCBhIG5ldyBsaW5lLiAqLworICAgIGlmICghZGlkX3JldHVybikKKwlyZWRpcl93cml0ZSgoY2hhcl91ICopIlxuIiwgLTEpOworfQorCisvKgorICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IG1zZyBwb3NpdGlvbiBpcyB3aGVyZSBtZXNzYWdlcyBzdGFydC4KKyAqLworICAgIHZvaWQKK21zZ19zdGFydGhlcmUoKQoreworICAgIGxpbmVzX2xlZnQgPSBjbWRsaW5lX3JvdzsKKyAgICBtc2dfZGlkYW55ID0gRkFMU0U7Cit9CisKKyAgICB2b2lkCittc2dfcHV0Y2hhcihjKQorICAgIGludAkJYzsKK3sKKyAgICBtc2dfcHV0Y2hhcl9hdHRyKGMsIDApOworfQorCisgICAgdm9pZAorbXNnX3B1dGNoYXJfYXR0cihjLCBhdHRyKQorICAgIGludAkJYzsKKyAgICBpbnQJCWF0dHI7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGNoYXJfdQlidWZbTUJfTUFYQllURVMgKyAxXTsKKyNlbHNlCisgICAgY2hhcl91CWJ1Zls0XTsKKyNlbmRpZgorCisgICAgaWYgKElTX1NQRUNJQUwoYykpCisgICAgeworCWJ1ZlswXSA9IEtfU1BFQ0lBTDsKKwlidWZbMV0gPSBLX1NFQ09ORChjKTsKKwlidWZbMl0gPSBLX1RISVJEKGMpOworCWJ1ZlszXSA9IE5VTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJYnVmWygqbWJfY2hhcjJieXRlcykoYywgYnVmKV0gPSBOVUw7CisjZWxzZQorCWJ1ZlswXSA9IGM7CisJYnVmWzFdID0gTlVMOworI2VuZGlmCisgICAgfQorICAgIG1zZ19wdXRzX2F0dHIoYnVmLCBhdHRyKTsKK30KKworICAgIHZvaWQKK21zZ19vdXRudW0obikKKyAgICBsb25nCW47Cit7CisgICAgY2hhcl91CWJ1ZlsyMF07CisKKyAgICBzcHJpbnRmKChjaGFyICopYnVmLCAiJWxkIiwgbik7CisgICAgbXNnX3B1dHMoYnVmKTsKK30KKworICAgIHZvaWQKK21zZ19ob21lX3JlcGxhY2UoZm5hbWUpCisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyAgICBtc2dfaG9tZV9yZXBsYWNlX2F0dHIoZm5hbWUsIDApOworfQorCisjaWYgZGVmaW5lZChGRUFUX0ZJTkRfSUQpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorbXNnX2hvbWVfcmVwbGFjZV9obChmbmFtZSkKKyAgICBjaGFyX3UJKmZuYW1lOworeworICAgIG1zZ19ob21lX3JlcGxhY2VfYXR0cihmbmFtZSwgaGxfYXR0cihITEZfRCkpOworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAorbXNnX2hvbWVfcmVwbGFjZV9hdHRyKGZuYW1lLCBhdHRyKQorICAgIGNoYXJfdSAgKmZuYW1lOworICAgIGludAkgICAgYXR0cjsKK3sKKyAgICBjaGFyX3UJKm5hbWU7CisKKyAgICBuYW1lID0gaG9tZV9yZXBsYWNlX3NhdmUoTlVMTCwgZm5hbWUpOworICAgIGlmIChuYW1lICE9IE5VTEwpCisJbXNnX291dHRyYW5zX2F0dHIobmFtZSwgYXR0cik7CisgICAgdmltX2ZyZWUobmFtZSk7Cit9CisKKy8qCisgKiBPdXRwdXQgJ2xlbicgY2hhcmFjdGVycyBpbiAnc3RyJyAoaW5jbHVkaW5nIE5VTHMpIHdpdGggdHJhbnNsYXRpb24KKyAqIGlmICdsZW4nIGlzIC0xLCBvdXRwdXQgdXB0byBhIE5VTCBjaGFyYWN0ZXIuCisgKiBVc2UgYXR0cmlidXRlcyAnYXR0cicuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGl0IHRha2VzIG9uIHRoZSBzY3JlZW4uCisgKi8KKyAgICBpbnQKK21zZ19vdXR0cmFucyhzdHIpCisgICAgY2hhcl91CSAgICAqc3RyOworeworICAgIHJldHVybiBtc2dfb3V0dHJhbnNfYXR0cihzdHIsIDApOworfQorCisgICAgaW50Cittc2dfb3V0dHJhbnNfYXR0cihzdHIsIGF0dHIpCisgICAgY2hhcl91CSpzdHI7CisgICAgaW50CQlhdHRyOworeworICAgIHJldHVybiBtc2dfb3V0dHJhbnNfbGVuX2F0dHIoc3RyLCAoaW50KVNUUkxFTihzdHIpLCBhdHRyKTsKK30KKworICAgIGludAorbXNnX291dHRyYW5zX2xlbihzdHIsIGxlbikKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICByZXR1cm4gbXNnX291dHRyYW5zX2xlbl9hdHRyKHN0ciwgbGVuLCAwKTsKK30KKworLyoKKyAqIE91dHB1dCBvbmUgY2hhcmFjdGVyIGF0ICJwIi4gIFJldHVybiBwb2ludGVyIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAqIEhhbmRsZXMgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgorICovCisgICAgY2hhcl91ICoKK21zZ19vdXR0cmFuc19vbmUocCwgYXR0cikKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlhdHRyOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWw7CisKKyAgICBpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkgPiAxKQorICAgIHsKKwltc2dfb3V0dHJhbnNfbGVuX2F0dHIocCwgbCwgYXR0cik7CisJcmV0dXJuIHAgKyBsOworICAgIH0KKyNlbmRpZgorICAgIG1zZ19wdXRzX2F0dHIodHJhbnNjaGFyX2J5dGUoKnApLCBhdHRyKTsKKyAgICByZXR1cm4gcCArIDE7Cit9CisKKyAgICBpbnQKK21zZ19vdXR0cmFuc19sZW5fYXR0cihtc2dzdHIsIGxlbiwgYXR0cikKKyAgICBjaGFyX3UJKm1zZ3N0cjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgaW50CQlyZXR2YWwgPSAwOworICAgIGNoYXJfdQkqc3RyID0gbXNnc3RyOworICAgIGNoYXJfdQkqcGxhaW5fc3RhcnQgPSBtc2dzdHI7CisgICAgY2hhcl91CSpzOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCW1iX2w7CisgICAgaW50CQljOworI2VuZGlmCisKKyAgICAvKiBpZiBNU0dfSElTVCBmbGFnIHNldCwgYWRkIG1lc3NhZ2UgdG8gaGlzdG9yeSAqLworICAgIGlmIChhdHRyICYgTVNHX0hJU1QpCisgICAgeworCWFkZF9tc2dfaGlzdChzdHIsIGxlbiwgYXR0cik7CisJYXR0ciAmPSB+TVNHX0hJU1Q7CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBjb21wb3NpbmcgY2hhcmFjdGVyIGZpcnN0IGRyYXcgYSBzcGFjZSBvbgorICAgICAqIHdoaWNoIHRoZSBjb21wb3NpbmcgY2hhciBjYW4gYmUgZHJhd24uICovCisgICAgaWYgKGVuY191dGY4ICYmIHV0Zl9pc2NvbXBvc2luZyh1dGZfcHRyMmNoYXIobXNnc3RyKSkpCisJbXNnX3B1dHNfYXR0cigoY2hhcl91ICopIiAiLCBhdHRyKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBHbyBvdmVyIHRoZSBzdHJpbmcuICBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHRyYW5zbGF0ZWQgYW5kIHByaW50ZWQuCisgICAgICogTm9ybWFsIGNoYXJhY3RlcnMgYXJlIHByaW50ZWQgc2V2ZXJhbCBhdCBhIHRpbWUuCisgICAgICovCisgICAgd2hpbGUgKC0tbGVuID49IDApCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoZW5jX3V0ZjgpCisJICAgIC8qIERvbid0IGluY2x1ZGUgY29tcG9zaW5nIGNoYXJzIGFmdGVyIHRoZSBlbmQuICovCisJICAgIG1iX2wgPSB1dGZjX3B0cjJsZW5fY2hlY2tfbGVuKHN0ciwgbGVuICsgMSk7CisJZWxzZSBpZiAoaGFzX21ieXRlKQorCSAgICBtYl9sID0gKCptYl9wdHIybGVuX2NoZWNrKShzdHIpOworCWVsc2UKKwkgICAgbWJfbCA9IDE7CisJaWYgKGhhc19tYnl0ZSAmJiBtYl9sID4gMSkKKwl7CisJICAgIGMgPSAoKm1iX3B0cjJjaGFyKShzdHIpOworCSAgICBpZiAodmltX2lzcHJpbnRjKGMpKQorCQkvKiBwcmludGFibGUgbXVsdGktYnl0ZSBjaGFyOiBjb3VudCB0aGUgY2VsbHMuICovCisJCXJldHZhbCArPSAoKm1iX3B0cjJjZWxscykoc3RyKTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIHVucHJpbnRhYmxlIG11bHRpLWJ5dGUgY2hhcjogcHJpbnQgdGhlIHByaW50YWJsZSBjaGFycyBzbworCQkgKiBmYXIgYW5kIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgdW5wcmludGFibGUgY2hhci4gKi8KKwkJaWYgKHN0ciA+IHBsYWluX3N0YXJ0KQorCQkgICAgbXNnX3B1dHNfYXR0cl9sZW4ocGxhaW5fc3RhcnQsIChpbnQpKHN0ciAtIHBsYWluX3N0YXJ0KSwKKwkJCQkJCQkJCWF0dHIpOworCQlwbGFpbl9zdGFydCA9IHN0ciArIG1iX2w7CisJCW1zZ19wdXRzX2F0dHIodHJhbnNjaGFyKGMpLCBhdHRyID09IDAgPyBobF9hdHRyKEhMRl84KSA6IGF0dHIpOworCQlyZXR2YWwgKz0gY2hhcjJjZWxscyhjKTsKKwkgICAgfQorCSAgICBsZW4gLT0gbWJfbCAtIDE7CisJICAgIHN0ciArPSBtYl9sOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIHMgPSB0cmFuc2NoYXJfYnl0ZSgqc3RyKTsKKwkgICAgaWYgKHNbMV0gIT0gTlVMKQorCSAgICB7CisJCS8qIHVucHJpbnRhYmxlIGNoYXI6IHByaW50IHRoZSBwcmludGFibGUgY2hhcnMgc28gZmFyIGFuZCB0aGUKKwkJICogdHJhbnNsYXRpb24gb2YgdGhlIHVucHJpbnRhYmxlIGNoYXIuICovCisJCWlmIChzdHIgPiBwbGFpbl9zdGFydCkKKwkJICAgIG1zZ19wdXRzX2F0dHJfbGVuKHBsYWluX3N0YXJ0LCAoaW50KShzdHIgLSBwbGFpbl9zdGFydCksCisJCQkJCQkJCQlhdHRyKTsKKwkJcGxhaW5fc3RhcnQgPSBzdHIgKyAxOworCQltc2dfcHV0c19hdHRyKHMsIGF0dHIgPT0gMCA/IGhsX2F0dHIoSExGXzgpIDogYXR0cik7CisJICAgIH0KKwkgICAgcmV0dmFsICs9IHB0cjJjZWxscyhzdHIpOworCSAgICArK3N0cjsKKwl9CisgICAgfQorCisgICAgaWYgKHN0ciA+IHBsYWluX3N0YXJ0KQorCS8qIHByaW50IHRoZSBwcmludGFibGUgY2hhcnMgYXQgdGhlIGVuZCAqLworCW1zZ19wdXRzX2F0dHJfbGVuKHBsYWluX3N0YXJ0LCAoaW50KShzdHIgLSBwbGFpbl9zdGFydCksIGF0dHIpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCittc2dfbWFrZShhcmcpCisgICAgY2hhcl91ICAqYXJnOworeworICAgIGludAkgICAgaTsKKyAgICBzdGF0aWMgY2hhcl91ICpzdHIgPSAoY2hhcl91ICopImVlZmZvYyIsICpycyA9IChjaGFyX3UgKikiUGxvbiNkcWcjdnhqZHVCIjsKKworICAgIGFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIGZvciAoaSA9IDU7ICphcmcgJiYgaSA+PSAwOyAtLWkpCisJaWYgKCphcmcrKyAhPSBzdHJbaV0pCisJICAgIGJyZWFrOworICAgIGlmIChpIDwgMCkKKyAgICB7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJZm9yIChpID0gMDsgcnNbaV07ICsraSkKKwkgICAgbXNnX3B1dGNoYXIocnNbaV0gLSAzKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIE91dHB1dCB0aGUgc3RyaW5nICdzdHInIHVwdG8gYSBOVUwgY2hhcmFjdGVyLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpdCB0YWtlcyBvbiB0aGUgc2NyZWVuLgorICoKKyAqIElmIEtfU1BFQ0lBTCBpcyBlbmNvdW50ZXJlZCwgdGhlbiBpdCBpcyB0YWtlbiBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICogZm9sbG93aW5nIGNoYXJhY3RlciBhbmQgc2hvd24gYXMgPEYxPiwgPFMtVXA+IGV0Yy4gIEFueSBvdGhlciBjaGFyYWN0ZXIKKyAqIHdoaWNoIGlzIG5vdCBwcmludGFibGUgc2hvd24gaW4gPD4gZm9ybS4KKyAqIElmICdmcm9tJyBpcyBUUlVFIChsaHMgb2YgYSBtYXBwaW5nKSwgYSBzcGFjZSBpcyBzaG93biBhcyA8U3BhY2U+LgorICogSWYgYSBjaGFyYWN0ZXIgaXMgZGlzcGxheWVkIGluIG9uZSBvZiB0aGVzZSBzcGVjaWFsIHdheXMsIGlzIGFsc28KKyAqIGhpZ2hsaWdodGVkIChpdHMgaGlnaGxpZ2h0IG5hbWUgaXMgJzgnIGluIHRoZSBwX2hsIHZhcmlhYmxlKS4KKyAqIE90aGVyd2lzZSBjaGFyYWN0ZXJzIGFyZSBub3QgaGlnaGxpZ2h0ZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2hvdyBtYXBwaW5ncywgd2hlcmUgd2Ugd2FudCB0byBzZWUgaG93IHRvIHR5cGUKKyAqIHRoZSBjaGFyYWN0ZXIvc3RyaW5nIC0tIHdlYmIKKyAqLworICAgIGludAorbXNnX291dHRyYW5zX3NwZWNpYWwoc3Ryc3RhcnQsIGZyb20pCisgICAgY2hhcl91CSpzdHJzdGFydDsKKyAgICBpbnQJCWZyb207CS8qIFRSVUUgZm9yIGxocyBvZiBhIG1hcHBpbmcgKi8KK3sKKyAgICBjaGFyX3UJKnN0ciA9IHN0cnN0YXJ0OworICAgIGludAkJcmV0dmFsID0gMDsKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBpbnQJCWF0dHI7CisgICAgaW50CQlsZW47CisKKyAgICBhdHRyID0gaGxfYXR0cihITEZfOCk7CisgICAgd2hpbGUgKCpzdHIgIT0gTlVMKQorICAgIHsKKwkvKiBMZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgbmVlZCB0byBiZSBkaXNwbGF5ZWQgaW4gPD4gZm9ybS4gKi8KKwlpZiAoKHN0ciA9PSBzdHJzdGFydCB8fCBzdHJbMV0gPT0gTlVMKSAmJiAqc3RyID09ICcgJykKKwl7CisJICAgIHN0cmluZyA9IChjaGFyX3UgKikiPFNwYWNlPiI7CisJICAgICsrc3RyOworCX0KKwllbHNlCisJICAgIHN0cmluZyA9IHN0cjJzcGVjaWFsKCZzdHIsIGZyb20pOworCWxlbiA9IHZpbV9zdHJzaXplKHN0cmluZyk7CisJLyogSGlnaGxpZ2h0IHNwZWNpYWwga2V5cyAqLworCW1zZ19wdXRzX2F0dHIoc3RyaW5nLCBsZW4gPiAxCisjaWZkZWYgRkVBVF9NQllURQorCQkmJiAoKm1iX3B0cjJsZW5fY2hlY2spKHN0cmluZykgPD0gMQorI2VuZGlmCisJCT8gYXR0ciA6IDApOworCXJldHZhbCArPSBsZW47CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHByaW50YWJsZSBzdHJpbmcgZm9yIHRoZSBrZXkgY29kZXMgYXQgIipzcCIuCisgKiBVc2VkIGZvciB0cmFuc2xhdGluZyB0aGUgbGhzIG9yIHJocyBvZiBhIG1hcHBpbmcgdG8gcHJpbnRhYmxlIGNoYXJzLgorICogQWR2YW5jZXMgInNwIiB0byB0aGUgbmV4dCBjb2RlLgorICovCisgICAgY2hhcl91ICoKK3N0cjJzcGVjaWFsKHNwLCBmcm9tKQorICAgIGNoYXJfdQkqKnNwOworICAgIGludAkJZnJvbTsJLyogVFJVRSBmb3IgbGhzIG9mIG1hcHBpbmcgKi8KK3sKKyAgICBpbnQJCQljOworICAgIHN0YXRpYyBjaGFyX3UJYnVmWzddOworICAgIGNoYXJfdQkJKnN0ciA9ICpzcDsKKyAgICBpbnQJCQltb2RpZmllcnMgPSAwOworICAgIGludAkJCXNwZWNpYWwgPSBGQUxTRTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorICAgIHsKKwljaGFyX3UJKnA7CisKKwkvKiBUcnkgdG8gdW4tZXNjYXBlIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICBSZXR1cm4gdGhlIHVuLWVzY2FwZWQKKwkgKiBzdHJpbmcgaWYgaXQgaXMgYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci4gKi8KKwlwID0gbWJfdW5lc2NhcGUoc3ApOworCWlmIChwICE9IE5VTEwpCisJICAgIHJldHVybiBwOworICAgIH0KKyNlbmRpZgorCisgICAgYyA9ICpzdHI7CisgICAgaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKKyAgICB7CisJaWYgKHN0clsxXSA9PSBLU19NT0RJRklFUikKKwl7CisJICAgIG1vZGlmaWVycyA9IHN0clsyXTsKKwkgICAgc3RyICs9IDM7CisJICAgIGMgPSAqc3RyOworCX0KKwlpZiAoYyA9PSBLX1NQRUNJQUwgJiYgc3RyWzFdICE9IE5VTCAmJiBzdHJbMl0gIT0gTlVMKQorCXsKKwkgICAgYyA9IFRPX1NQRUNJQUwoc3RyWzFdLCBzdHJbMl0pOworCSAgICBzdHIgKz0gMjsKKwkgICAgaWYgKGMgPT0gS19aRVJPKQkvKiBkaXNwbGF5IDxOdWw+IGFzIF5AICovCisJCWMgPSBOVUw7CisJfQorCWlmIChJU19TUEVDSUFMKGMpIHx8IG1vZGlmaWVycykJLyogc3BlY2lhbCBrZXkgKi8KKwkgICAgc3BlY2lhbCA9IFRSVUU7CisgICAgfQorICAgICpzcCA9IHN0ciArIDE7CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogRm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBjaGVjayBmb3IgYW4gaWxsZWdhbCBieXRlLiAqLworICAgIGlmIChoYXNfbWJ5dGUgJiYgTUJfQllURTJMRU4oKnN0cikgPiAoKm1iX3B0cjJsZW5fY2hlY2spKHN0cikpCisgICAgeworCXRyYW5zY2hhcl9ub25wcmludChidWYsIGMpOworCXJldHVybiBidWY7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBNYWtlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gPD4gZm9ybSwgYWxzbyA8TS1TcGFjZT4gYW5kIDxUYWI+LgorICAgICAqIFVzZSA8U3BhY2U+IG9ubHkgZm9yIGxocyBvZiBhIG1hcHBpbmcuICovCisgICAgaWYgKHNwZWNpYWwgfHwgY2hhcjJjZWxscyhjKSA+IDEgfHwgKGZyb20gJiYgYyA9PSAnICcpKQorCXJldHVybiBnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RpZmllcnMpOworICAgIGJ1ZlswXSA9IGM7CisgICAgYnVmWzFdID0gTlVMOworICAgIHJldHVybiBidWY7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgYSBrZXkgc2VxdWVuY2UgaW50byBzcGVjaWFsIGtleSBuYW1lcy4KKyAqLworICAgIHZvaWQKK3N0cjJzcGVjaWFsYnVmKHNwLCBidWYsIGxlbikKKyAgICBjaGFyX3UJKnNwOworICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbGVuOworeworICAgIGNoYXJfdQkqczsKKworICAgICpidWYgPSBOVUw7CisgICAgd2hpbGUgKCpzcCkKKyAgICB7CisJcyA9IHN0cjJzcGVjaWFsKCZzcCwgRkFMU0UpOworCWlmICgoaW50KShTVFJMRU4ocykgKyBTVFJMRU4oYnVmKSkgPCBsZW4pCisJICAgIFNUUkNBVChidWYsIHMpOworICAgIH0KK30KKworLyoKKyAqIHByaW50IGxpbmUgZm9yIDpwcmludCBvciA6bGlzdCBjb21tYW5kCisgKi8KKyAgICB2b2lkCittc2dfcHJ0X2xpbmUocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgaW50CQljOworICAgIGludAkJY29sID0gMDsKKyAgICBpbnQJCW5fZXh0cmEgPSAwOworICAgIGludAkJY19leHRyYSA9IDA7CisgICAgY2hhcl91CSpwX2V4dHJhID0gTlVMTDsJICAgIC8qIGluaXQgdG8gbWFrZSBTQVNDIHNodXQgdXAgKi8KKyAgICBpbnQJCW47CisgICAgaW50CQlhdHRyPSAwOworICAgIGNoYXJfdQkqdHJhaWwgPSBOVUxMOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWw7CisgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOworI2VuZGlmCisKKyAgICAvKiBmaW5kIHN0YXJ0IG9mIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKyAgICBpZiAoY3Vyd2luLT53X3BfbGlzdCAmJiBsY3NfdHJhaWwpCisgICAgeworCXRyYWlsID0gcyArIFNUUkxFTihzKTsKKwl3aGlsZSAodHJhaWwgPiBzICYmIHZpbV9pc3doaXRlKHRyYWlsWy0xXSkpCisJICAgIC0tdHJhaWw7CisgICAgfQorCisgICAgLyogb3V0cHV0IGEgc3BhY2UgZm9yIGFuIGVtcHR5IGxpbmUsIG90aGVyd2lzZSB0aGUgbGluZSB3aWxsIGJlCisgICAgICogb3ZlcndyaXR0ZW4gKi8KKyAgICBpZiAoKnMgPT0gTlVMICYmICEoY3Vyd2luLT53X3BfbGlzdCAmJiBsY3NfZW9sICE9IE5VTCkpCisJbXNnX3B1dGNoYXIoJyAnKTsKKworICAgIGZvciAoOzspCisgICAgeworCWlmIChuX2V4dHJhKQorCXsKKwkgICAgLS1uX2V4dHJhOworCSAgICBpZiAoY19leHRyYSkKKwkJYyA9IGNfZXh0cmE7CisJICAgIGVsc2UKKwkJYyA9ICpwX2V4dHJhKys7CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwllbHNlIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpKSA+IDEpCisJeworCSAgICBjb2wgKz0gKCptYl9wdHIyY2VsbHMpKHMpOworCSAgICBtY2hfbWVtbW92ZShidWYsIHMsIChzaXplX3QpbCk7CisJICAgIGJ1ZltsXSA9IE5VTDsKKwkgICAgbXNnX3B1dHNfYXR0cihidWYsIGF0dHIpOworCSAgICBzICs9IGw7CisJICAgIGNvbnRpbnVlOworCX0KKyNlbmRpZgorCWVsc2UKKwl7CisJICAgIGF0dHIgPSAwOworCSAgICBjID0gKnMrKzsKKwkgICAgaWYgKGMgPT0gVEFCICYmICghY3Vyd2luLT53X3BfbGlzdCB8fCBsY3NfdGFiMSkpCisJICAgIHsKKwkJLyogdGFiIGFtb3VudCBkZXBlbmRzIG9uIGN1cnJlbnQgY29sdW1uICovCisJCW5fZXh0cmEgPSBjdXJidWYtPmJfcF90cyAtIGNvbCAlIGN1cmJ1Zi0+Yl9wX3RzIC0gMTsKKwkJaWYgKCFjdXJ3aW4tPndfcF9saXN0KQorCQl7CisJCSAgICBjID0gJyAnOworCQkgICAgY19leHRyYSA9ICcgJzsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGMgPSBsY3NfdGFiMTsKKwkJICAgIGNfZXh0cmEgPSBsY3NfdGFiMjsKKwkJICAgIGF0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgaWYgKGMgPT0gTlVMICYmIGN1cndpbi0+d19wX2xpc3QgJiYgbGNzX2VvbCAhPSBOVUwpCisJICAgIHsKKwkJcF9leHRyYSA9IChjaGFyX3UgKikiIjsKKwkJY19leHRyYSA9IE5VTDsKKwkJbl9leHRyYSA9IDE7CisJCWMgPSBsY3NfZW9sOworCQlhdHRyID0gaGxfYXR0cihITEZfQVQpOworCQktLXM7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYyAhPSBOVUwgJiYgKG4gPSBieXRlMmNlbGxzKGMpKSA+IDEpCisJICAgIHsKKwkJbl9leHRyYSA9IG4gLSAxOworCQlwX2V4dHJhID0gdHJhbnNjaGFyX2J5dGUoYyk7CisJCWNfZXh0cmEgPSBOVUw7CisJCWMgPSAqcF9leHRyYSsrOworCSAgICB9CisJICAgIGVsc2UgaWYgKGMgPT0gJyAnICYmIHRyYWlsICE9IE5VTEwgJiYgcyA+IHRyYWlsKQorCSAgICB7CisJCWMgPSBsY3NfdHJhaWw7CisJCWF0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkgICAgfQorCX0KKworCWlmIChjID09IE5VTCkKKwkgICAgYnJlYWs7CisKKwltc2dfcHV0Y2hhcl9hdHRyKGMsIGF0dHIpOworCWNvbCsrOworICAgIH0KKyAgICBtc2dfY2xyX2VvcygpOworfQorCisjaWZkZWYgRkVBVF9NQllURQorLyoKKyAqIFVzZSBzY3JlZW5fcHV0cygpIHRvIG91dHB1dCBvbmUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKiBSZXR1cm4gdGhlIHBvaW50ZXIgInMiIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorc2NyZWVuX3B1dHNfbWJ5dGUocywgbCwgYXR0cikKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsOworICAgIGludAkJYXR0cjsKK3sKKyAgICBpbnQJCWN3OworCisgICAgbXNnX2RpZG91dCA9IFRSVUU7CQkvKiByZW1lbWJlciB0aGF0IGxpbmUgaXMgbm90IGVtcHR5ICovCisgICAgY3cgPSAoKm1iX3B0cjJjZWxscykocyk7CisgICAgaWYgKGN3ID4gMSAmJiAoCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJY21kbXNnX3JsID8gbXNnX2NvbCA8PSAxIDoKKyNlbmRpZgorCQltc2dfY29sID09IENvbHVtbnMgLSAxKSkKKyAgICB7CisJLyogRG9lc24ndCBmaXQsIHByaW50IGEgaGlnaGxpZ2h0ZWQgJz4nIHRvIGZpbGwgaXQgdXAuICovCisJbXNnX3NjcmVlbl9wdXRjaGFyKCc+JywgaGxfYXR0cihITEZfQVQpKTsKKwlyZXR1cm4gczsKKyAgICB9CisKKyAgICBzY3JlZW5fcHV0c19sZW4ocywgbCwgbXNnX3JvdywgbXNnX2NvbCwgYXR0cik7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoY21kbXNnX3JsKQorICAgIHsKKwltc2dfY29sIC09IGN3OworCWlmIChtc2dfY29sID09IDApCisJeworCSAgICBtc2dfY29sID0gQ29sdW1uczsKKwkgICAgKyttc2dfcm93OworCX0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCW1zZ19jb2wgKz0gY3c7CisJaWYgKG1zZ19jb2wgPj0gQ29sdW1ucykKKwl7CisJICAgIG1zZ19jb2wgPSAwOworCSAgICArK21zZ19yb3c7CisJfQorICAgIH0KKyAgICByZXR1cm4gcyArIGw7Cit9CisjZW5kaWYKKworLyoKKyAqIE91dHB1dCBhIHN0cmluZyB0byB0aGUgc2NyZWVuIGF0IHBvc2l0aW9uIG1zZ19yb3csIG1zZ19jb2wuCisgKiBVcGRhdGUgbXNnX3JvdyBhbmQgbXNnX2NvbCBmb3IgdGhlIG5leHQgbWVzc2FnZS4KKyAqLworICAgIHZvaWQKK21zZ19wdXRzKHMpCisgICAgY2hhcl91CSpzOworeworICAgIG1zZ19wdXRzX2F0dHIocywgMCk7Cit9CisKKyAgICB2b2lkCittc2dfcHV0c190aXRsZShzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICBtc2dfcHV0c19hdHRyKHMsIGhsX2F0dHIoSExGX1QpKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DU0NPUEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogaWYgcHJpbnRpbmcgYSBzdHJpbmcgd2lsbCBleGNlZWQgdGhlIHNjcmVlbiB3aWR0aCwgcHJpbnQgIi4uLiIgaW4gdGhlCisgKiBtaWRkbGUuCisgKi8KKyAgICB2b2lkCittc2dfcHV0c19sb25nKGxvbmdzdHIpCisgICAgY2hhcl91CSpsb25nc3RyOworeworICAgIG1zZ19wdXRzX2xvbmdfbGVuX2F0dHIobG9uZ3N0ciwgKGludClzdHJsZW4oKGNoYXIgKilsb25nc3RyKSwgMCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFNob3cgYSBtZXNzYWdlIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBhbHdheXMgZml0cyBpbiB0aGUgbGluZS4gIEN1dCBvdXQgYQorICogcGFydCBpbiB0aGUgbWlkZGxlIGFuZCByZXBsYWNlIGl0IHdpdGggIi4uLiIgd2hlbiBuZWNlc3NhcnkuCisgKiBEb2VzIG5vdCBoYW5kbGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIQorICovCisgICAgdm9pZAorbXNnX3B1dHNfbG9uZ19hdHRyKGxvbmdzdHIsIGF0dHIpCisgICAgY2hhcl91CSpsb25nc3RyOworICAgIGludAkJYXR0cjsKK3sKKyAgICBtc2dfcHV0c19sb25nX2xlbl9hdHRyKGxvbmdzdHIsIChpbnQpc3RybGVuKChjaGFyICopbG9uZ3N0ciksIGF0dHIpOworfQorCisgICAgdm9pZAorbXNnX3B1dHNfbG9uZ19sZW5fYXR0cihsb25nc3RyLCBsZW4sIGF0dHIpCisgICAgY2hhcl91CSpsb25nc3RyOworICAgIGludAkJbGVuOworICAgIGludAkJYXR0cjsKK3sKKyAgICBpbnQJCXNsZW4gPSBsZW47CisgICAgaW50CQlyb29tOworCisgICAgcm9vbSA9IENvbHVtbnMgLSBtc2dfY29sOworICAgIGlmIChsZW4gPiByb29tICYmIHJvb20gPj0gMjApCisgICAgeworCXNsZW4gPSAocm9vbSAtIDMpIC8gMjsKKwltc2dfb3V0dHJhbnNfbGVuX2F0dHIobG9uZ3N0ciwgc2xlbiwgYXR0cik7CisJbXNnX3B1dHNfYXR0cigoY2hhcl91ICopIi4uLiIsIGhsX2F0dHIoSExGXzgpKTsKKyAgICB9CisgICAgbXNnX291dHRyYW5zX2xlbl9hdHRyKGxvbmdzdHIgKyBsZW4gLSBzbGVuLCBzbGVuLCBhdHRyKTsKK30KKworLyoKKyAqIEJhc2ljIGZ1bmN0aW9uIGZvciB3cml0aW5nIGEgbWVzc2FnZSB3aXRoIGhpZ2hsaWdodCBhdHRyaWJ1dGVzLgorICovCisgICAgdm9pZAorbXNnX3B1dHNfYXR0cihzLCBhdHRyKQorICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgbXNnX3B1dHNfYXR0cl9sZW4ocywgLTEsIGF0dHIpOworfQorCisvKgorICogTGlrZSBtc2dfcHV0c19hdHRyKCksIGJ1dCB3aXRoIGEgbWF4aW11bSBsZW5ndGggIm1heGxlbiIgKGluIGJ5dGVzKS4KKyAqIFdoZW4gIm1heGxlbiIgaXMgLTEgdGhlcmUgaXMgbm8gbWF4aW11bSBsZW5ndGguCisgKiBXaGVuICJtYXhsZW4iIGlzID49IDAgdGhlIG1lc3NhZ2UgaXMgbm90IHB1dCBpbiB0aGUgaGlzdG9yeS4KKyAqLworICAgIHN0YXRpYyB2b2lkCittc2dfcHV0c19hdHRyX2xlbihzdHIsIG1heGxlbiwgYXR0cikKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCW1heGxlbjsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgaW50CQlvbGRTdGF0ZTsKKyAgICBjaGFyX3UJKnMgPSBzdHI7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQlidWZbNF07CisgICAgY2hhcl91CSp0X3MgPSBzdHI7CS8qIHN0cmluZyBmcm9tICJ0X3MiIHRvICJzIiBpcyBzdGlsbCB0b2RvICovCisgICAgaW50CQl0X2NvbCA9IDA7CS8qIHNjcmVlbiBjZWxscyB0b2RvLCAwIHdoZW4gInRfcyIgbm90IHVzZWQgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsOworICAgIGludAkJY3c7CisjZW5kaWYKKyAgICBpbnQJCWM7CisKKyAgICAvKgorICAgICAqIElmIHJlZGlyZWN0aW9uIGlzIG9uLCBhbHNvIHdyaXRlIHRvIHRoZSByZWRpcmVjdGlvbiBmaWxlLgorICAgICAqLworICAgIHJlZGlyX3dyaXRlKHMsIG1heGxlbik7CisKKyAgICAvKgorICAgICAqIERvbid0IHByaW50IGFueXRoaW5nIHdoZW4gdXNpbmcgIjpzaWxlbnQgY21kIi4KKyAgICAgKi8KKyAgICBpZiAobXNnX3NpbGVudCAhPSAwKQorCXJldHVybjsKKworICAgIC8qIGlmIE1TR19ISVNUIGZsYWcgc2V0LCBhZGQgbWVzc2FnZSB0byBoaXN0b3J5ICovCisgICAgaWYgKChhdHRyICYgTVNHX0hJU1QpICYmIG1heGxlbiA8IDApCisgICAgeworCWFkZF9tc2dfaGlzdChzLCAtMSwgYXR0cik7CisJYXR0ciAmPSB+TVNHX0hJU1Q7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXaGVuIHdyaXRpbmcgc29tZXRoaW5nIHRvIHRoZSBzY3JlZW4gYWZ0ZXIgaXQgaGFzIHNjcm9sbGVkLCByZXF1aXJlcyBhCisgICAgICogd2FpdC1yZXR1cm4gcHJvbXB0IGxhdGVyLiAgTmVlZGVkIHdoZW4gc2Nyb2xsaW5nLCByZXNldHRpbmcKKyAgICAgKiBuZWVkX3dhaXRfcmV0dXJuIGFmdGVyIHNvbWUgcHJvbXB0LCBhbmQgdGhlbiBvdXRwdXR0aW5nIHNvbWV0aGluZworICAgICAqIHdpdGhvdXQgc2Nyb2xsaW5nCisgICAgICovCisgICAgaWYgKG1zZ19zY3JvbGxlZCAmJiAhbXNnX3Njcm9sbGVkX2lnbikKKwluZWVkX3dhaXRfcmV0dXJuID0gVFJVRTsKKyAgICBtc2dfZGlkYW55ID0gVFJVRTsJCS8qIHJlbWVtYmVyIHRoYXQgc29tZXRoaW5nIHdhcyBvdXRwdXR0ZWQgKi8KKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgbm8gdmFsaWQgc2NyZWVuLCB1c2UgZnByaW50ZiBzbyB3ZSBjYW4gc2VlIGVycm9yIG1lc3NhZ2VzLgorICAgICAqIElmIHRlcm1jYXAgaXMgbm90IGFjdGl2ZSwgd2UgbWF5IGJlIHdyaXRpbmcgaW4gYW4gYWx0ZXJuYXRlIGNvbnNvbGUKKyAgICAgKiB3aW5kb3csIGN1cnNvciBwb3NpdGlvbmluZyBtYXkgbm90IHdvcmsgY29ycmVjdGx5ICh3aW5kb3cgc2l6ZSBtYXkgYmUKKyAgICAgKiBkaWZmZXJlbnQsIGUuZy4gZm9yIFdpbjMyIGNvbnNvbGUpIG9yIHdlIGp1c3QgZG9uJ3Qga25vdyB3aGVyZSB0aGUKKyAgICAgKiBjdXJzb3IgaXMuCisgICAgICovCisgICAgaWYgKG1zZ191c2VfcHJpbnRmKCkpCisgICAgeworI2lmZGVmIFdJTjMyNjQKKwlpZiAoIShzaWxlbnRfbW9kZSAmJiBwX3ZlcmJvc2UgPT0gMCkpCisJICAgIG1jaF9zZXR0bW9kZShUTU9ERV9DT09LKTsJLyogaGFuZGxlICdccicgYW5kICdcbicgY29ycmVjdGx5ICovCisjZW5kaWYKKwl3aGlsZSAoKnMgIT0gTlVMICYmIChtYXhsZW4gPCAwIHx8IChpbnQpKHMgLSBzdHIpIDwgbWF4bGVuKSkKKwl7CisJICAgIGlmICghKHNpbGVudF9tb2RlICYmIHBfdmVyYm9zZSA9PSAwKSkKKwkgICAgeworCQlwID0gJmJ1ZlswXTsKKwkJLyogTkwgLS0+IENSIE5MIHRyYW5zbGF0aW9uIChmb3IgVW5peCwgbm90IGZvciAiLS12ZXJzaW9uIikgKi8KKwkJLyogTkwgLS0+IENSIHRyYW5zbGF0aW9uIChmb3IgTWFjKSAqLworCQlpZiAoKnMgPT0gJ1xuJyAmJiAhaW5mb19tZXNzYWdlKQorCQkgICAgKnArKyA9ICdccic7CisjaWYgZGVmaW5lZChVU0VfQ1IpICYmICFkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKwkJZWxzZQorI2VuZGlmCisJCSAgICAqcCsrID0gKnM7CisJCSpwID0gJ1wwJzsKKwkJaWYgKGluZm9fbWVzc2FnZSkJLyogaW5mb3JtYXRpdmUgbWVzc2FnZSwgbm90IGFuIGVycm9yICovCisJCSAgICBtY2hfbXNnKChjaGFyICopYnVmKTsKKwkJZWxzZQorCQkgICAgbWNoX2Vycm1zZygoY2hhciAqKWJ1Zik7CisJICAgIH0KKworCSAgICAvKiBwcmltaXRpdmUgd2F5IHRvIGNvbXB1dGUgdGhlIGN1cnJlbnQgY29sdW1uICovCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgaWYgKGNtZG1zZ19ybCkKKwkgICAgeworCQlpZiAoKnMgPT0gJ1xyJyB8fCAqcyA9PSAnXG4nKQorCQkgICAgbXNnX2NvbCA9IENvbHVtbnMgLSAxOworCQllbHNlCisJCSAgICAtLW1zZ19jb2w7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJaWYgKCpzID09ICdccicgfHwgKnMgPT0gJ1xuJykKKwkJICAgIG1zZ19jb2wgPSAwOworCQllbHNlCisJCSAgICArK21zZ19jb2w7CisJICAgIH0KKwkgICAgKytzOworCX0KKwltc2dfZGlkb3V0ID0gVFJVRTsJICAgIC8qIGFzc3VtZSB0aGF0IGxpbmUgaXMgbm90IGVtcHR5ICovCisKKyNpZmRlZiBXSU4zMjY0CisJaWYgKCEoc2lsZW50X21vZGUgJiYgcF92ZXJib3NlID09IDApKQorCSAgICBtY2hfc2V0dG1vZGUoVE1PREVfUkFXKTsKKyNlbmRpZgorCXJldHVybjsKKyAgICB9CisKKyAgICBkaWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICB3aGlsZSAoKnMgIT0gTlVMICYmIChtYXhsZW4gPCAwIHx8IChpbnQpKHMgLSBzdHIpIDwgbWF4bGVuKSkKKyAgICB7CisJLyoKKwkgKiBUaGUgc2NyZWVuIGlzIHNjcm9sbGVkIHVwIHdoZW46CisJICogLSBXaGVuIG91dHB1dHRpbmcgYSBuZXdsaW5lIGluIHRoZSBsYXN0IHJvdworCSAqIC0gd2hlbiBvdXRwdXR0aW5nIGEgY2hhcmFjdGVyIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgbGFzdCByb3cKKwkgKiAgIChzb21lIHRlcm1pbmFscyBzY3JvbGwgYXV0b21hdGljYWxseSwgc29tZSBkb24ndC4gVG8gYXZvaWQKKwkgKiAgIHByb2JsZW1zIHdlIHNjcm9sbCBvdXJzZWx2ZXMpCisJICovCisJaWYgKG1zZ19yb3cgPj0gUm93cyAtIDEKKwkJJiYgKCpzID09ICdcbicKKwkJICAgIHx8ICgKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkgICAgY21kbXNnX3JsCisJCSAgICA/ICgKKwkJCW1zZ19jb2wgPD0gMQorCQkJfHwgKCpzID09IFRBQiAmJiBtc2dfY29sIDw9IDcpCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCXx8IChoYXNfbWJ5dGUgJiYgKCptYl9wdHIyY2VsbHMpKHMpID4gMSAmJiBtc2dfY29sIDw9IDIpCisjIGVuZGlmCisJCSAgICAgICkKKwkJICAgIDoKKyNlbmRpZgorCQkgICAgICAobXNnX2NvbCArIHRfY29sID49IENvbHVtbnMgLSAxCisJCSAgICAgICB8fCAoKnMgPT0gVEFCICYmIG1zZ19jb2wgKyB0X2NvbCA+PSAoKENvbHVtbnMgLSAxKSAmIH43KSkKKyMgaWZkZWYgRkVBVF9NQllURQorCQkgICAgICAgfHwgKGhhc19tYnl0ZSAmJiAoKm1iX3B0cjJjZWxscykocykgPiAxCisJCQkJCSAgICAmJiBtc2dfY29sICsgdF9jb2wgPj0gQ29sdW1ucyAtIDIpCisjIGVuZGlmCisJCSAgICAgICkpKSkKKwl7CisJICAgIGlmICh0X2NvbCA+IDApCisJICAgIHsKKwkJLyogb3V0cHV0IHBvc3Rwb25lZCB0ZXh0ICovCisJCXRfcHV0cyh0X2NvbCwgdF9zLCBzLCBhdHRyKTsKKwkJdF9jb2wgPSAwOworCSAgICB9CisKKwkgICAgLyogV2hlbiBubyBtb3JlIHByb21wdCBhbiBubyBtb3JlIHJvb20sIHRydW5jYXRlIGhlcmUgKi8KKwkgICAgaWYgKG1zZ19ub19tb3JlICYmIGxpbmVzX2xlZnQgPT0gMCkKKwkJYnJlYWs7CisjaWZkZWYgRkVBVF9HVUkKKwkgICAgLyogUmVtb3ZlIHRoZSBjdXJzb3IgYmVmb3JlIHNjcm9sbGluZywgU2NyZWVuTGluZXNbXSBpcyBnb2luZyB0bworCSAgICAgKiBiZWNvbWUgaW52YWxpZC4gKi8KKwkgICAgaWYgKGd1aS5pbl91c2UpCisJCWd1aV91bmRyYXdfY3Vyc29yKCk7CisjZW5kaWYKKwkgICAgLyogc2Nyb2xsaW5nIHVwIGFsd2F5cyB3b3JrcyAqLworCSAgICBzY3JlZW5fZGVsX2xpbmVzKDAsIDAsIDEsIChpbnQpUm93cywgVFJVRSwgTlVMTCk7CisKKwkgICAgaWYgKCFjYW5fY2xlYXIoKGNoYXJfdSAqKSIgIikpCisJICAgIHsKKwkJLyogU2Nyb2xsaW5nIHVwIGRvZXNuJ3QgcmVzdWx0IGluIHRoZSByaWdodCBiYWNrZ3JvdW5kLiAgU2V0CisJCSAqIHRoZSBiYWNrZ3JvdW5kIGhlcmUuICBJdCdzIG5vdCBlZmZpY2llbnQsIGJ1dCBhdm9pZHMgdGhhdAorCQkgKiB3ZSBoYXZlIHRvIGRvIGl0IGFsbCBvdmVyIHRoZSBjb2RlLiAqLworCQlzY3JlZW5fZmlsbCgoaW50KVJvd3MgLSAxLCAoaW50KVJvd3MsIDAsCisJCQkJCQkgICAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKworCQkvKiBBbHNvIGNsZWFyIHRoZSBsYXN0IGNoYXIgb2YgdGhlIGxhc3QgYnV0IG9uZSBsaW5lIGlmIGl0IHdhcworCQkgKiBub3QgY2xlYXJlZCBiZWZvcmUgdG8gYXZvaWQgYSBzY3JvbGwtdXAuICovCisJCWlmIChTY3JlZW5BdHRyc1tMaW5lT2Zmc2V0W1Jvd3MgLSAyXSArIENvbHVtbnMgLSAxXQorCQkJCQkJCSAgICAgICA9PSAoc2F0dHJfVCktMSkKKwkJICAgIHNjcmVlbl9maWxsKChpbnQpUm93cyAtIDIsIChpbnQpUm93cyAtIDEsCisJCQkJIChpbnQpQ29sdW1ucyAtIDEsIChpbnQpQ29sdW1ucywgJyAnLCAnICcsIDApOworCSAgICB9CisKKwkgICAgbXNnX3JvdyA9IFJvd3MgLSAyOworCSAgICBpZiAobXNnX2NvbCA+PSBDb2x1bW5zKQkvKiBjYW4gaGFwcGVuIGFmdGVyIHNjcmVlbiByZXNpemUgKi8KKwkJbXNnX2NvbCA9IENvbHVtbnMgLSAxOworCisJICAgICsrbXNnX3Njcm9sbGVkOworCSAgICBuZWVkX3dhaXRfcmV0dXJuID0gVFJVRTsJLyogbWF5IG5lZWQgd2FpdF9yZXR1cm4gaW4gbWFpbigpICovCisJICAgIGlmIChtdXN0X3JlZHJhdyA8IFZBTElEKQorCQltdXN0X3JlZHJhdyA9IFZBTElEOworCSAgICByZWRyYXdfY21kbGluZSA9IFRSVUU7CisJICAgIGlmIChjbWRsaW5lX3JvdyA+IDAgJiYgIWV4bW9kZV9hY3RpdmUpCisJCS0tY21kbGluZV9yb3c7CisKKwkgICAgLyoKKwkgICAgICogaWYgc2NyZWVuIGlzIGNvbXBsZXRlbHkgZmlsbGVkIHdhaXQgZm9yIGEgY2hhcmFjdGVyCisJICAgICAqLworCSAgICBpZiAocF9tb3JlICYmIC0tbGluZXNfbGVmdCA9PSAwICYmIFN0YXRlICE9IEhJVFJFVFVSTgorCQkJCQkgICAgJiYgIW1zZ19ub19tb3JlICYmICFleG1vZGVfYWN0aXZlKQorCSAgICB7CisJCW9sZFN0YXRlID0gU3RhdGU7CisJCVN0YXRlID0gQVNLTU9SRTsKKyNpZmRlZiBGRUFUX01PVVNFCisJCXNldG1vdXNlKCk7CisjZW5kaWYKKwkJbXNnX21vcmVtc2coRkFMU0UpOworCQlmb3IgKDs7KQorCQl7CisJCSAgICAvKgorCQkgICAgICogR2V0IGEgdHlwZWQgY2hhcmFjdGVyIGRpcmVjdGx5IGZyb20gdGhlIHVzZXIuCisJCSAgICAgKi8KKwkJICAgIGMgPSBnZXRfa2V5c3Ryb2tlKCk7CisKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgZGVmaW5lZChGRUFUX0dVSSkKKwkJICAgIGlmIChjID09IEtfTUVOVSkKKwkJICAgIHsKKwkJCWludCBpZHggPSBnZXRfbWVudV9pbmRleChjdXJyZW50X21lbnUsIEFTS01PUkUpOworCisJCQkvKiBVc2VkIGEgbWVudS4gIElmIGl0IHN0YXJ0cyB3aXRoIENUUkwtWSwgaXQgbXVzdAorCQkJICogYmUgYSAiQ29weSIgZm9yIHRoZSBjbGlwYm9hcmQuICBPdGhlcndpc2UKKwkJCSAqIGFzc3VtZSB0aGF0IHdlIGVuZCAqLworCQkJaWYgKGlkeCA9PSBNRU5VX0lOREVYX0lOVkFMSUQpCisJCQkgICAgY29udGludWU7CisJCQljID0gKmN1cnJlbnRfbWVudS0+c3RyaW5nc1tpZHhdOworCQkJaWYgKGMgIT0gTlVMICYmIGN1cnJlbnRfbWVudS0+c3RyaW5nc1tpZHhdWzFdICE9IE5VTCkKKwkJCSAgICBpbnNfdHlwZWJ1ZihjdXJyZW50X21lbnUtPnN0cmluZ3NbaWR4XSArIDEsCisJCQkJICAgIGN1cnJlbnRfbWVudS0+bm9yZW1hcFtpZHhdLCAwLCBUUlVFLAorCQkJCSAgICBjdXJyZW50X21lbnUtPnNpbGVudFtpZHhdKTsKKwkJICAgIH0KKyNlbmRpZgorCisJCSAgICBzd2l0Y2ggKGMpCisJCSAgICB7CisJCSAgICBjYXNlIEJTOgorCQkgICAgY2FzZSAnayc6CisJCSAgICBjYXNlIEtfVVA6CisJCQlpZiAoIW1vcmVfYmFja191c2VkKQorCQkJeworCQkJICAgIG1zZ19tb3JlbXNnKFRSVUUpOworCQkJICAgIGNvbnRpbnVlOworCQkJfQorCQkJbW9yZV9iYWNrID0gMTsKKwkJCWxpbmVzX2xlZnQgPSAxOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENBUjoJCS8qIG9uZSBleHRyYSBsaW5lICovCisJCSAgICBjYXNlIE5MOgorCQkgICAgY2FzZSAnaic6CisJCSAgICBjYXNlIEtfRE9XTjoKKwkJCWxpbmVzX2xlZnQgPSAxOworCQkJYnJlYWs7CisJCSAgICBjYXNlICc6JzoJCS8qIHN0YXJ0IG5ldyBjb21tYW5kIGxpbmUgKi8KKyNpZmRlZiBGRUFUX0NPTl9ESUFMT0cKKwkJCWlmICghY29uZmlybV9tc2dfdXNlZCkKKyNlbmRpZgorCQkJeworCQkJICAgIC8qIFNpbmNlIGdvdF9pbnQgaXMgc2V0IGFsbCB0eXBlYWhlYWQgd2lsbCBiZQorCQkJICAgICAqIGZsdXNoZWQsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhpcyAnOicsIHJlbWVtYmVyCisJCQkgICAgICogdGhhdCBpbiBhIHNwZWNpYWwgd2F5LiAqLworCQkJICAgIHR5cGVhaGVhZF9ub2ZsdXNoKCc6Jyk7CisJCQkgICAgY21kbGluZV9yb3cgPSBSb3dzIC0gMTsgICAvKiBwdXQgJzonIG9uIHRoaXMgbGluZSAqLworCQkJICAgIHNraXBfcmVkcmF3ID0gVFJVRTsJICAgICAgLyogc2tpcCByZWRyYXcgb25jZSAqLworCQkJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsgLyogZG9uJ3Qgd2FpdCBpbiBtYWluKCkgKi8KKwkJCX0KKwkJCS8qRkFMTFRIUk9VR0gqLworCQkgICAgY2FzZSAncSc6CQkvKiBxdWl0ICovCisJCSAgICBjYXNlIEN0cmxfQzoKKwkJICAgIGNhc2UgRVNDOgorI2lmZGVmIEZFQVRfQ09OX0RJQUxPRworCQkJaWYgKGNvbmZpcm1fbXNnX3VzZWQpCisJCQl7CisJCQkgICAgLyogSnVtcCB0byB0aGUgY2hvaWNlcyBvZiB0aGUgZGlhbG9nLiAqLworCQkJICAgIHMgPSBjb25maXJtX21zZ190YWlsOworCQkJICAgIGxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZgorCQkJeworCQkJICAgIGdvdF9pbnQgPSBUUlVFOworCQkJICAgIHF1aXRfbW9yZSA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ3UnOgkJLyogVXAgaGFsZiBhIHBhZ2UgKi8KKwkJICAgIGNhc2UgS19QQUdFVVA6CisJCQlpZiAoIW1vcmVfYmFja191c2VkKQorCQkJeworCQkJICAgIG1zZ19tb3JlbXNnKFRSVUUpOworCQkJICAgIGNvbnRpbnVlOworCQkJfQorCQkJbW9yZV9iYWNrID0gUm93cyAvIDI7CisJCQkvKkZBTExUSFJPVUdIKi8KKwkJICAgIGNhc2UgJ2QnOgkJLyogRG93biBoYWxmIGEgcGFnZSAqLworCQkJbGluZXNfbGVmdCA9IFJvd3MgLyAyOworCQkJYnJlYWs7CisJCSAgICBjYXNlICdiJzoJCS8qIG9uZSBwYWdlIGJhY2sgKi8KKwkJCWlmICghbW9yZV9iYWNrX3VzZWQpCisJCQl7CisJCQkgICAgbXNnX21vcmVtc2coVFJVRSk7CisJCQkgICAgY29udGludWU7CisJCQl9CisJCQltb3JlX2JhY2sgPSBSb3dzIC0gMTsKKwkJCS8qRkFMTFRIUk9VR0gqLworCQkgICAgY2FzZSAnICc6CQkvKiBvbmUgZXh0cmEgcGFnZSAqLworCQkgICAgY2FzZSBLX1BBR0VET1dOOgorCQkgICAgY2FzZSBLX0xFRlRNT1VTRToKKwkJCWxpbmVzX2xlZnQgPSBSb3dzIC0gMTsKKwkJCWJyZWFrOworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkJICAgIGNhc2UgQ3RybF9ZOgorCQkJLyogU3RyYW5nZSB3YXkgdG8gYWxsb3cgY29weWluZyAoeWFua2luZykgYSBtb2RlbGVzcworCQkJICogc2VsZWN0aW9uIGF0IHRoZSBtb3JlIHByb21wdC4gIFVzZSBDVFJMLVksCisJCQkgKiBiZWNhdXNlIHRoZSBzYW1lIGlzIHVzZWQgaW4gQ21kbGluZS1tb2RlIGFuZCBhdCB0aGUKKwkJCSAqIGhpdC1lbnRlciBwcm9tcHQuICBIb3dldmVyLCBzY3JvbGxpbmcgb25lIGxpbmUgdXAKKwkJCSAqIG1pZ2h0IGJlIGV4cGVjdGVkLi4uICovCisJCQlpZiAoY2xpcF9zdGFyLnN0YXRlID09IFNFTEVDVF9ET05FKQorCQkJICAgIGNsaXBfY29weV9tb2RlbGVzc19zZWxlY3Rpb24oVFJVRSk7CisJCQljb250aW51ZTsKKyNlbmRpZgorCQkgICAgZGVmYXVsdDoJCS8qIG5vIHZhbGlkIHJlc3BvbnNlICovCisJCQltc2dfbW9yZW1zZyhUUlVFKTsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKworCQkvKiBjbGVhciB0aGUgLS1tb3JlLS0gbWVzc2FnZSAqLworCQlzY3JlZW5fZmlsbCgoaW50KVJvd3MgLSAxLCAoaW50KVJvd3MsCisJCQkJCQkwLCAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKwkJU3RhdGUgPSBvbGRTdGF0ZTsKKyNpZmRlZiBGRUFUX01PVVNFCisJCXNldG1vdXNlKCk7CisjZW5kaWYKKwkJaWYgKHF1aXRfbW9yZSkKKwkJeworCQkgICAgbXNnX3JvdyA9IFJvd3MgLSAxOworCQkgICAgbXNnX2NvbCA9IDA7CisJCSAgICByZXR1cm47CSAgICAvKiB0aGUgc3RyaW5nIGlzIG5vdCBkaXNwbGF5ZWQhICovCisJCX0KKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlpZiAoY21kbXNnX3JsKQorCQkgICAgbXNnX2NvbCA9IENvbHVtbnMgLSAxOworI2VuZGlmCisJICAgIH0KKwl9CisKKwlpZiAodF9jb2wgPiAwCisJCSYmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiXG5cclxiXHQiLCAqcykgIT0gTlVMTAorCQkgICAgfHwgKnMgPT0gQkVMTAorCQkgICAgfHwgbXNnX2NvbCArIHRfY29sID49IENvbHVtbnMKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICB8fCAoaGFzX21ieXRlICYmICgqbWJfcHRyMmNlbGxzKShzKSA+IDEKKwkJCQkJICAgICYmIG1zZ19jb2wgKyB0X2NvbCA+PSBDb2x1bW5zIC0gMSkKKyNlbmRpZgorCQkgICAgKSkKKwl7CisJICAgIC8qIG91dHB1dCBhbnkgcG9zdHBvbmVkIHRleHQgKi8KKwkgICAgdF9wdXRzKHRfY29sLCB0X3MsIHMsIGF0dHIpOworCSAgICB0X2NvbCA9IDA7CisJfQorCisJaWYgKCpzID09ICdcbicpCQkgICAgLyogZ28gdG8gbmV4dCBsaW5lICovCisJeworCSAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CSAgICAvKiByZW1lbWJlciB0aGF0IGxpbmUgaXMgZW1wdHkgKi8KKwkgICAgbXNnX2NvbCA9IDA7CisJICAgIGlmICgrK21zZ19yb3cgPj0gUm93cykgIC8qIHNhZmV0eSBjaGVjayAqLworCQltc2dfcm93ID0gUm93cyAtIDE7CisJfQorCWVsc2UgaWYgKCpzID09ICdccicpCSAgICAvKiBnbyB0byBjb2x1bW4gMCAqLworCXsKKwkgICAgbXNnX2NvbCA9IDA7CisJfQorCWVsc2UgaWYgKCpzID09ICdcYicpCSAgICAvKiBnbyB0byBwcmV2aW91cyBjaGFyICovCisJeworCSAgICBpZiAobXNnX2NvbCkKKwkJLS1tc2dfY29sOworCX0KKwllbHNlIGlmICgqcyA9PSBUQUIpCSAgICAvKiB0cmFuc2xhdGUgaW50byBzcGFjZXMgKi8KKwl7CisJICAgIGRvCisJCW1zZ19zY3JlZW5fcHV0Y2hhcignICcsIGF0dHIpOworCSAgICB3aGlsZSAobXNnX2NvbCAmIDcpOworCX0KKwllbHNlIGlmICgqcyA9PSBCRUxMKQkgICAgLyogYmVlcCAoZnJvbSAiOnNoIikgKi8KKwkgICAgdmltX2JlZXAoKTsKKwllbHNlCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQljdyA9ICgqbWJfcHRyMmNlbGxzKShzKTsKKwkJaWYgKGVuY191dGY4ICYmIG1heGxlbiA+PSAwKQorCQkgICAgLyogYXZvaWQgaW5jbHVkaW5nIGNvbXBvc2luZyBjaGFycyBhZnRlciB0aGUgZW5kICovCisJCSAgICBsID0gdXRmY19wdHIybGVuX2NoZWNrX2xlbihzLCAoaW50KSgoc3RyICsgbWF4bGVuKSAtIHMpKTsKKwkJZWxzZQorCQkgICAgbCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWN3ID0gMTsKKwkJbCA9IDE7CisJICAgIH0KKyNlbmRpZgorCSAgICAvKiBXaGVuIGRyYXdpbmcgZnJvbSByaWdodCB0byBsZWZ0IG9yIHdoZW4gYSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIKKwkgICAgICogZG9lc24ndCBmaXQsIGRyYXcgYSBzaW5nbGUgY2hhcmFjdGVyIGhlcmUuICBPdGhlcndpc2UgY29sbGVjdAorCSAgICAgKiBjaGFyYWN0ZXJzIGFuZCBkcmF3IHRoZW0gYWxsIGF0IG9uY2UgbGF0ZXIuICovCisjaWYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkgfHwgZGVmaW5lZChGRUFUX01CWVRFKQorCSAgICBpZiAoCisjIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCSAgICBjbWRtc2dfcmwKKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJICAgIHx8CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01CWVRFCisJCSAgICAoY3cgPiAxICYmIG1zZ19jb2wgKyB0X2NvbCA+PSBDb2x1bW5zIC0gMSkKKyMgZW5kaWYKKwkJICAgICkKKwkgICAgeworIyBpZmRlZiBGRUFUX01CWVRFCisJCWlmIChsID4gMSkKKwkJICAgIHMgPSBzY3JlZW5fcHV0c19tYnl0ZShzLCBsLCBhdHRyKSAtIDE7CisJCWVsc2UKKyMgZW5kaWYKKwkJICAgIG1zZ19zY3JlZW5fcHV0Y2hhcigqcywgYXR0cik7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJLyogcG9zdHBvbmUgdGhpcyBjaGFyYWN0ZXIgdW50aWwgbGF0ZXIgKi8KKwkJaWYgKHRfY29sID09IDApCisJCSAgICB0X3MgPSBzOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJdF9jb2wgKz0gY3c7CisJCXMgKz0gbCAtIDE7CisjZWxzZQorCQkrK3RfY29sOworI2VuZGlmCisJICAgIH0KKwl9CisJKytzOworICAgIH0KKworICAgIC8qIG91dHB1dCBhbnkgcG9zdHBvbmVkIHRleHQgKi8KKyAgICBpZiAodF9jb2wgPiAwKQorCXRfcHV0cyh0X2NvbCwgdF9zLCBzLCBhdHRyKTsKKworICAgIG1zZ19jaGVjaygpOworfQorCisvKgorICogT3V0cHV0IGFueSBwb3N0cG9uZWQgdGV4dCBmb3IgbXNnX3B1dHNfYXR0cl9sZW4oKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCit0X3B1dHModF9jb2wsIHRfcywgcywgYXR0cikKKyAgICBpbnQJCXRfY29sOworICAgIGNoYXJfdQkqdF9zOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgLyogb3V0cHV0IHBvc3Rwb25lZCB0ZXh0ICovCisgICAgbXNnX2RpZG91dCA9IFRSVUU7CQkvKiByZW1lbWJlciB0aGF0IGxpbmUgaXMgbm90IGVtcHR5ICovCisgICAgc2NyZWVuX3B1dHNfbGVuKHRfcywgKGludCkocyAtIHRfcyksIG1zZ19yb3csIG1zZ19jb2wsIGF0dHIpOworICAgIG1zZ19jb2wgKz0gdF9jb2w7CisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBjb21wb3NpbmcgY2hhcmFjdGVyIGRvbid0IGluY3JlbWVudCB0aGUKKyAgICAgKiBjb2x1bW4gcG9zaXRpb24gZm9yIGl0LiAqLworICAgIGlmIChlbmNfdXRmOCAmJiB1dGZfaXNjb21wb3NpbmcodXRmX3B0cjJjaGFyKHRfcykpKQorCS0tbXNnX2NvbDsKKyNlbmRpZgorICAgIGlmIChtc2dfY29sID49IENvbHVtbnMpCisgICAgeworCW1zZ19jb2wgPSAwOworCSsrbXNnX3JvdzsKKyAgICB9Cit9CisKKworLyoKKyAqIFJldHVybnMgVFJVRSB3aGVuIG1lc3NhZ2VzIHNob3VsZCBiZSBwcmludGVkIHdpdGggbWNoX2Vycm1zZygpLgorICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gdmFsaWQgc2NyZWVuLCBzbyB3ZSBjYW4gc2VlIGVycm9yIG1lc3NhZ2VzLgorICogSWYgdGVybWNhcCBpcyBub3QgYWN0aXZlLCB3ZSBtYXkgYmUgd3JpdGluZyBpbiBhbiBhbHRlcm5hdGUgY29uc29sZQorICogd2luZG93LCBjdXJzb3IgcG9zaXRpb25pbmcgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSAod2luZG93IHNpemUgbWF5IGJlCisgKiBkaWZmZXJlbnQsIGUuZy4gZm9yIFdpbjMyIGNvbnNvbGUpIG9yIHdlIGp1c3QgZG9uJ3Qga25vdyB3aGVyZSB0aGUKKyAqIGN1cnNvciBpcy4KKyAqLworICAgIGludAorbXNnX3VzZV9wcmludGYoKQoreworICAgIHJldHVybiAoIW1zZ19jaGVja19zY3JlZW4oKQorI2lmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfTVNXSU4pCisJICAgIHx8ICF0ZXJtY2FwX2FjdGl2ZQorI2VuZGlmCisJICAgIHx8IChzd2FwcGluZ19zY3JlZW4oKSAmJiAhdGVybWNhcF9hY3RpdmUpCisJICAgICAgICk7Cit9CisKKyNpZiBkZWZpbmVkKFVTRV9NQ0hfRVJSTVNHKSB8fCBkZWZpbmVkKFBST1RPKQorCisjaWZkZWYgbWNoX2Vycm1zZworIyB1bmRlZiBtY2hfZXJybXNnCisjZW5kaWYKKyNpZmRlZiBtY2hfbXNnCisjIHVuZGVmIG1jaF9tc2cKKyNlbmRpZgorCisvKgorICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlLiAgVG8gYmUgdXNlZCB3aGVuIHRoZSBzY3JlZW4gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQKKyAqIHlldC4gIFdoZW4gc3RkZXJyIGNhbid0IGJlIHVzZWQsIGNvbGxlY3QgZXJyb3IgbWVzc2FnZXMgdW50aWwgdGhlIEdVSSBoYXMKKyAqIHN0YXJ0ZWQgYW5kIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBpbiBhIG1lc3NhZ2UgYm94LgorICovCisgICAgdm9pZAorbWNoX2Vycm1zZyhzdHIpCisgICAgY2hhcgkqc3RyOworeworICAgIGludAkJbGVuOworCisjaWYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX0dVSSkpICYmICFkZWZpbmVkKEFMV0FZU19VU0VfR1VJKQorICAgIC8qIE9uIFVuaXggdXNlIHN0ZGVyciBpZiBpdCdzIGEgdHR5LgorICAgICAqIFdoZW4gbm90IGdvaW5nIHRvIHN0YXJ0IHRoZSBHVUkgYWxzbyB1c2Ugc3RkZXJyLgorICAgICAqIE9uIE1hYywgd2hlbiBzdGFydGVkIGZyb20gRmluZGVyLCBzdGRlcnIgaXMgdGhlIGNvbnNvbGUuICovCisgICAgaWYgKAorIyBpZmRlZiBVTklYCisjICBpZmRlZiBNQUNPU19YX1VOSVgKKwkgICAgKGlzYXR0eSgyKSAmJiBzdHJjbXAoIi9kZXYvY29uc29sZSIsIHR0eW5hbWUoMikpICE9IDApCisjICBlbHNlCisJICAgIGlzYXR0eSgyKQorIyAgZW5kaWYKKyMgIGlmZGVmIEZFQVRfR1VJCisJICAgIHx8CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0dVSQorCSAgICAhKGd1aS5pbl91c2UgfHwgZ3VpLnN0YXJ0aW5nKQorIyBlbmRpZgorCSAgICApCisgICAgeworCWZwcmludGYoc3RkZXJyLCAiJXMiLCBzdHIpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIGF2b2lkIGEgZGVsYXkgZm9yIGEgbWVzc2FnZSB0aGF0IGlzbid0IHRoZXJlICovCisgICAgZW1zZ19vbl9kaXNwbGF5ID0gRkFMU0U7CisKKyAgICBsZW4gPSAoaW50KVNUUkxFTihzdHIpICsgMTsKKyAgICBpZiAoZXJyb3JfZ2EuZ2FfZ3Jvd3NpemUgPT0gMCkKKyAgICB7CisJZXJyb3JfZ2EuZ2FfZ3Jvd3NpemUgPSA4MDsKKwllcnJvcl9nYS5nYV9pdGVtc2l6ZSA9IDE7CisgICAgfQorICAgIGlmIChnYV9ncm93KCZlcnJvcl9nYSwgbGVuKSA9PSBPSykKKyAgICB7CisJbWNoX21lbW1vdmUoKGNoYXJfdSAqKWVycm9yX2dhLmdhX2RhdGEgKyBlcnJvcl9nYS5nYV9sZW4sCisJCQkJCQkJICAoY2hhcl91ICopc3RyLCBsZW4pOworI2lmZGVmIFVOSVgKKwkvKiByZW1vdmUgQ1IgY2hhcmFjdGVycywgdGhleSBhcmUgZGlzcGxheWVkICovCisJeworCSAgICBjaGFyX3UJKnA7CisKKwkgICAgcCA9IChjaGFyX3UgKillcnJvcl9nYS5nYV9kYXRhICsgZXJyb3JfZ2EuZ2FfbGVuOworCSAgICBmb3IgKDs7KQorCSAgICB7CisJCXAgPSB2aW1fc3RyY2hyKHAsICdccicpOworCQlpZiAocCA9PSBOVUxMKQorCQkgICAgYnJlYWs7CisJCSpwID0gJyAnOworCSAgICB9CisJfQorI2VuZGlmCisJLS1sZW47CQkvKiBkb24ndCBjb3VudCB0aGUgTlVMIGF0IHRoZSBlbmQgKi8KKwllcnJvcl9nYS5nYV9sZW4gKz0gbGVuOworCWVycm9yX2dhLmdhX3Jvb20gLT0gbGVuOworICAgIH0KK30KKworLyoKKyAqIEdpdmUgYSBtZXNzYWdlLiAgVG8gYmUgdXNlZCB3aGVuIHRoZSBzY3JlZW4gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgorICogV2hlbiB0aGVyZSBpcyBubyB0dHksIGNvbGxlY3QgbWVzc2FnZXMgdW50aWwgdGhlIEdVSSBoYXMgc3RhcnRlZCBhbmQgdGhleQorICogY2FuIGJlIGRpc3BsYXllZCBpbiBhIG1lc3NhZ2UgYm94LgorICovCisgICAgdm9pZAorbWNoX21zZyhzdHIpCisgICAgY2hhcgkqc3RyOworeworI2lmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9HVUkpKSAmJiAhZGVmaW5lZChBTFdBWVNfVVNFX0dVSSkKKyAgICAvKiBPbiBVbml4IHVzZSBzdGRvdXQgaWYgd2UgaGF2ZSBhIHR0eS4gIFRoaXMgYWxsb3dzICJ2aW0gLWggfCBtb3JlIiBhbmQKKyAgICAgKiB1c2VzIG1jaF9lcnJtc2coKSB3aGVuIHN0YXJ0ZWQgZnJvbSB0aGUgZGVza3RvcC4KKyAgICAgKiBXaGVuIG5vdCBnb2luZyB0byBzdGFydCB0aGUgR1VJIGFsc28gdXNlIHN0ZG91dC4KKyAgICAgKiBPbiBNYWMsIHdoZW4gc3RhcnRlZCBmcm9tIEZpbmRlciwgc3RkZXJyIGlzIHRoZSBjb25zb2xlLiAqLworICAgIGlmICgKKyMgIGlmZGVmIFVOSVgKKyMgICBpZmRlZiBNQUNPU19YX1VOSVgKKwkgICAgKGlzYXR0eSgyKSAmJiBzdHJjbXAoIi9kZXYvY29uc29sZSIsIHR0eW5hbWUoMikpICE9IDApCisjICAgZWxzZQorCSAgICBpc2F0dHkoMikKKyMgICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX0dVSQorCSAgICB8fAorIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9HVUkKKwkgICAgIShndWkuaW5fdXNlIHx8IGd1aS5zdGFydGluZykKKyMgIGVuZGlmCisJICAgICkKKyAgICB7CisJcHJpbnRmKCIlcyIsIHN0cik7CisJcmV0dXJuOworICAgIH0KKyMgZW5kaWYKKyAgICBtY2hfZXJybXNnKHN0cik7Cit9CisjZW5kaWYgLyogVVNFX01DSF9FUlJNU0cgKi8KKworLyoKKyAqIFB1dCBhIGNoYXJhY3RlciBvbiB0aGUgc2NyZWVuIGF0IHRoZSBjdXJyZW50IG1lc3NhZ2UgcG9zaXRpb24gYW5kIGFkdmFuY2UKKyAqIHRvIHRoZSBuZXh0IHBvc2l0aW9uLiAgT25seSBmb3IgcHJpbnRhYmxlIEFTQ0lJIQorICovCisgICAgc3RhdGljIHZvaWQKK21zZ19zY3JlZW5fcHV0Y2hhcihjLCBhdHRyKQorICAgIGludAkJYzsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgbXNnX2RpZG91dCA9IFRSVUU7CQkvKiByZW1lbWJlciB0aGF0IGxpbmUgaXMgbm90IGVtcHR5ICovCisgICAgc2NyZWVuX3B1dGNoYXIoYywgbXNnX3JvdywgbXNnX2NvbCwgYXR0cik7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoY21kbXNnX3JsKQorICAgIHsKKwlpZiAoLS1tc2dfY29sID09IDApCisJeworCSAgICBtc2dfY29sID0gQ29sdW1uczsKKwkgICAgKyttc2dfcm93OworCX0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWlmICgrK21zZ19jb2wgPj0gQ29sdW1ucykKKwl7CisJICAgIG1zZ19jb2wgPSAwOworCSAgICArK21zZ19yb3c7CisJfQorICAgIH0KK30KKworICAgIHZvaWQKK21zZ19tb3JlbXNnKGZ1bGwpCisgICAgaW50CSAgICBmdWxsOworeworICAgIGludAkgICAgYXR0cjsKKworICAgIGF0dHIgPSBobF9hdHRyKEhMRl9NKTsKKyAgICBzY3JlZW5fcHV0cygoY2hhcl91ICopXygiLS0gTW9yZSAtLSIpLCAoaW50KVJvd3MgLSAxLCAwLCBhdHRyKTsKKyAgICBpZiAoZnVsbCkKKwlzY3JlZW5fcHV0cyhtb3JlX2JhY2tfdXNlZAorCSAgICA/IChjaGFyX3UgKilfKCIgKFJFVC9CUzogbGluZSwgU1BBQ0UvYjogcGFnZSwgZC91OiBoYWxmIHBhZ2UsIHE6IHF1aXQpIikKKwkgICAgOiAoY2hhcl91ICopXygiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIiksCisJICAgIChpbnQpUm93cyAtIDEsIDEwLCBhdHRyKTsKK30KKworLyoKKyAqIFJlcGVhdCB0aGUgbWVzc2FnZSBmb3IgdGhlIGN1cnJlbnQgbW9kZTogQVNLTU9SRSwgRVhURVJOQ01ELCBDT05GSVJNIG9yCisgKiBleG1vZGVfYWN0aXZlLgorICovCisgICAgdm9pZAorcmVwZWF0X21lc3NhZ2UoKQoreworICAgIGlmIChTdGF0ZSA9PSBBU0tNT1JFKQorICAgIHsKKwltc2dfbW9yZW1zZyhUUlVFKTsJLyogZGlzcGxheSAtLW1vcmUtLSBtZXNzYWdlIGFnYWluICovCisJbXNnX3JvdyA9IFJvd3MgLSAxOworICAgIH0KKyNpZmRlZiBGRUFUX0NPTl9ESUFMT0cKKyAgICBlbHNlIGlmIChTdGF0ZSA9PSBDT05GSVJNKQorICAgIHsKKwlkaXNwbGF5X2NvbmZpcm1fbXNnKCk7CS8qIGRpc3BsYXkgIjpjb25maXJtIiBtZXNzYWdlIGFnYWluICovCisJbXNnX3JvdyA9IFJvd3MgLSAxOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgaWYgKFN0YXRlID09IEVYVEVSTkNNRCkKKyAgICB7CisJd2luZGdvdG8obXNnX3JvdywgbXNnX2NvbCk7IC8qIHB1dCBjdXJzb3IgYmFjayAqLworICAgIH0KKyAgICBlbHNlIGlmIChTdGF0ZSA9PSBISVRSRVRVUk4gfHwgU3RhdGUgPT0gU0VUV1NJWkUpCisgICAgeworCWhpdF9yZXR1cm5fbXNnKCk7CisJbXNnX3JvdyA9IFJvd3MgLSAxOworICAgIH0KK30KKworLyoKKyAqIG1zZ19jaGVja19zY3JlZW4gLSBjaGVjayBpZiB0aGUgc2NyZWVuIGlzIGluaXRpYWxpemVkLgorICogQWxzbyBjaGVjayBtc2dfcm93IGFuZCBtc2dfY29sLCBpZiB0aGV5IGFyZSB0b28gYmlnIGl0IG1heSBjYXVzZSBhIGNyYXNoLgorICogV2hpbGUgc3RhcnRpbmcgdGhlIEdVSSB0aGUgdGVybWluYWwgY29kZXMgd2lsbCBiZSBzZXQgZm9yIHRoZSBHVUksIGJ1dCB0aGUKKyAqIG91dHB1dCBnb2VzIHRvIHRoZSB0ZXJtaW5hbC4gIERvbid0IHVzZSB0aGUgdGVybWluYWwgY29kZXMgdGhlbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK21zZ19jaGVja19zY3JlZW4oKQoreworICAgIGlmICghZnVsbF9zY3JlZW4gfHwgIXNjcmVlbl92YWxpZChGQUxTRSkpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG1zZ19yb3cgPj0gUm93cykKKwltc2dfcm93ID0gUm93cyAtIDE7CisgICAgaWYgKG1zZ19jb2wgPj0gQ29sdW1ucykKKwltc2dfY29sID0gQ29sdW1ucyAtIDE7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDbGVhciBmcm9tIGN1cnJlbnQgbWVzc2FnZSBwb3NpdGlvbiB0byBlbmQgb2Ygc2NyZWVuLgorICogU2tpcCB0aGlzIHdoZW4gIjpzaWxlbnQiIHdhcyB1c2VkLCBubyBuZWVkIHRvIGNsZWFyIGZvciByZWRpcmVjdGlvbi4KKyAqLworICAgIHZvaWQKK21zZ19jbHJfZW9zKCkKK3sKKyAgICBpZiAobXNnX3NpbGVudCA9PSAwKQorCW1zZ19jbHJfZW9zX2ZvcmNlKCk7Cit9CisKKy8qCisgKiBDbGVhciBmcm9tIGN1cnJlbnQgbWVzc2FnZSBwb3NpdGlvbiB0byBlbmQgb2Ygc2NyZWVuLgorICogTm90ZTogbXNnX2NvbCBpcyBub3QgdXBkYXRlZCwgc28gd2UgcmVtZW1iZXIgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZQorICogZm9yIG1zZ19jaGVjaygpLgorICovCisgICAgdm9pZAorbXNnX2Nscl9lb3NfZm9yY2UoKQoreworICAgIGlmIChtc2dfdXNlX3ByaW50ZigpKQorICAgIHsKKwlpZiAoZnVsbF9zY3JlZW4pCS8qIG9ubHkgd2hlbiB0ZXJtY2FwIGNvZGVzIGFyZSB2YWxpZCAqLworCXsKKwkgICAgaWYgKCpUX0NEKQorCQlvdXRfc3RyKFRfQ0QpOwkvKiBjbGVhciB0byBlbmQgb2YgZGlzcGxheSAqLworCSAgICBlbHNlIGlmICgqVF9DRSkKKwkJb3V0X3N0cihUX0NFKTsJLyogY2xlYXIgdG8gZW5kIG9mIGxpbmUgKi8KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwlpZiAoY21kbXNnX3JsKQorCXsKKwkgICAgc2NyZWVuX2ZpbGwobXNnX3JvdywgbXNnX3JvdyArIDEsIDAsIG1zZ19jb2wgKyAxLCAnICcsICcgJywgMCk7CisJICAgIHNjcmVlbl9maWxsKG1zZ19yb3cgKyAxLCAoaW50KVJvd3MsIDAsIChpbnQpQ29sdW1ucywgJyAnLCAnICcsIDApOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIHNjcmVlbl9maWxsKG1zZ19yb3csIG1zZ19yb3cgKyAxLCBtc2dfY29sLCAoaW50KUNvbHVtbnMsCisJCQkJCQkJCSAnICcsICcgJywgMCk7CisJICAgIHNjcmVlbl9maWxsKG1zZ19yb3cgKyAxLCAoaW50KVJvd3MsIDAsIChpbnQpQ29sdW1ucywgJyAnLCAnICcsIDApOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBDbGVhciB0aGUgY29tbWFuZCBsaW5lLgorICovCisgICAgdm9pZAorbXNnX2Nscl9jbWRsaW5lKCkKK3sKKyAgICBtc2dfcm93ID0gY21kbGluZV9yb3c7CisgICAgbXNnX2NvbCA9IDA7CisgICAgbXNnX2Nscl9lb3NfZm9yY2UoKTsKK30KKworLyoKKyAqIGVuZCBwdXR0aW5nIGEgbWVzc2FnZSBvbiB0aGUgc2NyZWVuCisgKiBjYWxsIHdhaXRfcmV0dXJuIGlmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGZpdCBpbiB0aGUgYXZhaWxhYmxlIHNwYWNlCisgKiByZXR1cm4gVFJVRSBpZiB3YWl0X3JldHVybiBub3QgY2FsbGVkLgorICovCisgICAgaW50Cittc2dfZW5kKCkKK3sKKyAgICAvKgorICAgICAqIGlmIHRoZSBzdHJpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdywKKyAgICAgKiBvciB0aGUgcnVsZXIgb3B0aW9uIGlzIHNldCBhbmQgd2UgcnVuIGludG8gaXQsCisgICAgICogd2UgaGF2ZSB0byByZWRyYXcgdGhlIHdpbmRvdy4KKyAgICAgKiBEbyBub3QgZG8gdGhpcyBpZiB3ZSBhcmUgYWJhbmRvbmluZyB0aGUgZmlsZSBvciBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgaWYgKCFleGl0aW5nICYmIG5lZWRfd2FpdF9yZXR1cm4gJiYgIShTdGF0ZSAmIENNRExJTkUpKQorICAgIHsKKwl3YWl0X3JldHVybihGQUxTRSk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBvdXRfZmx1c2goKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIElmIHRoZSB3cml0dGVuIG1lc3NhZ2UgcnVucyBpbnRvIHRoZSBzaG93biBjb21tYW5kIG9yIHJ1bGVyLCB3ZSBoYXZlIHRvCisgKiB3YWl0IGZvciBoaXQtcmV0dXJuIGFuZCByZWRyYXcgdGhlIHdpbmRvdyBsYXRlci4KKyAqLworICAgIHZvaWQKK21zZ19jaGVjaygpCit7CisgICAgaWYgKG1zZ19yb3cgPT0gUm93cyAtIDEgJiYgbXNnX2NvbCA+PSBzY19jb2wpCisgICAgeworCW5lZWRfd2FpdF9yZXR1cm4gPSBUUlVFOworCXJlZHJhd19jbWRsaW5lID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBNYXkgd3JpdGUgYSBzdHJpbmcgdG8gdGhlIHJlZGlyZWN0aW9uIGZpbGUuCisgKiBXaGVuICJtYXhsZW4iIGlzIC0xIHdyaXRlIHRoZSB3aG9sZSBzdHJpbmcsIG90aGVyd2lzZSB1cCB0byAibWF4bGVuIiBieXRlcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZWRpcl93cml0ZShzdHIsIG1heGxlbikKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCW1heGxlbjsKK3sKKyAgICBjaGFyX3UJKnMgPSBzdHI7CisgICAgc3RhdGljIGludAljdXJfY29sID0gMDsKKworICAgIGlmICgocmVkaXJfZmQgIT0gTlVMTAorI2lmZGVmIEZFQVRfRVZBTAorCQkJICB8fCByZWRpcl9yZWcKKyNlbmRpZgorCQkJCSAgICAgICApICYmICFyZWRpcl9vZmYpCisgICAgeworCS8qIElmIHRoZSBzdHJpbmcgZG9lc24ndCBzdGFydCB3aXRoIENSIG9yIE5MLCBnbyB0byBtc2dfY29sICovCisJaWYgKCpzICE9ICdcbicgJiYgKnMgIT0gJ1xyJykKKwl7CisJICAgIHdoaWxlIChjdXJfY29sIDwgbXNnX2NvbCkKKwkgICAgeworI2lmZGVmIEZFQVRfRVZBTAorCQlpZiAocmVkaXJfcmVnKQorCQkgICAgd3JpdGVfcmVnX2NvbnRlbnRzKHJlZGlyX3JlZywgKGNoYXJfdSAqKSIgIiwgLTEsIFRSVUUpOworCQllbHNlIGlmIChyZWRpcl9mZCkKKyNlbmRpZgorCQkgICAgZnB1dHMoIiAiLCByZWRpcl9mZCk7CisJCSsrY3VyX2NvbDsKKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfRVZBTAorCWlmIChyZWRpcl9yZWcpCisJICAgIHdyaXRlX3JlZ19jb250ZW50cyhyZWRpcl9yZWcsIHMsIG1heGxlbiwgVFJVRSk7CisjZW5kaWYKKworCS8qIEFkanVzdCB0aGUgY3VycmVudCBjb2x1bW4gKi8KKwl3aGlsZSAoKnMgIT0gTlVMICYmIChtYXhsZW4gPCAwIHx8IChpbnQpKHMgLSBzdHIpIDwgbWF4bGVuKSkKKwl7CisjaWZkZWYgRkVBVF9FVkFMCisJICAgIGlmICghcmVkaXJfcmVnICYmIHJlZGlyX2ZkICE9IE5VTEwpCisjZW5kaWYKKwkJcHV0YygqcywgcmVkaXJfZmQpOworCSAgICBpZiAoKnMgPT0gJ1xyJyB8fCAqcyA9PSAnXG4nKQorCQljdXJfY29sID0gMDsKKwkgICAgZWxzZSBpZiAoKnMgPT0gJ1x0JykKKwkJY3VyX2NvbCArPSAoOCAtIGN1cl9jb2wgJSA4KTsKKwkgICAgZWxzZQorCQkrK2N1cl9jb2w7CisJICAgICsrczsKKwl9CisKKwlpZiAobXNnX3NpbGVudCAhPSAwKQkvKiBzaG91bGQgdXBkYXRlIG1zZ19jb2wgKi8KKwkgICAgbXNnX2NvbCA9IGN1cl9jb2w7CisgICAgfQorfQorCisvKgorICogR2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSAoZm9yIHNlYXJjaGluZykuCisgKiBVc2UgJ3cnIGhpZ2hsaWdodGluZyBhbmQgbWF5IHJlcGVhdCB0aGUgbWVzc2FnZSBhZnRlciByZWRyYXdpbmcKKyAqLworICAgIHZvaWQKK2dpdmVfd2FybmluZyhtZXNzYWdlLCBobCkKKyAgICBjaGFyX3UgICptZXNzYWdlOworICAgIGludAkgICAgaGw7Cit7CisgICAgLyogRG9uJ3QgZG8gdGhpcyBmb3IgIjpzaWxlbnQiLiAqLworICAgIGlmIChtc2dfc2lsZW50ICE9IDApCisJcmV0dXJuOworCisgICAgLyogRG9uJ3Qgd2FudCBhIGhpdC1lbnRlciBwcm9tcHQgaGVyZS4gKi8KKyAgICArK25vX3dhaXRfcmV0dXJuOworI2lmZGVmIEZFQVRfRVZBTAorICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9XQVJOSU5HTVNHLCBtZXNzYWdlLCAtMSk7CisjZW5kaWYKKyNpZmRlZiBWSU1CVUREWQorICAgIFZpbUJ1ZGR5VGV4dChtZXNzYWdlLCAxKTsKKyNlbHNlCisgICAgdmltX2ZyZWUoa2VlcF9tc2cpOworICAgIGtlZXBfbXNnID0gTlVMTDsKKyAgICBpZiAoaGwpCisJa2VlcF9tc2dfYXR0ciA9IGhsX2F0dHIoSExGX1cpOworICAgIGVsc2UKKwlrZWVwX21zZ19hdHRyID0gMDsKKyAgICBpZiAobXNnX2F0dHIobWVzc2FnZSwga2VlcF9tc2dfYXR0cikgJiYgbXNnX3Njcm9sbGVkID09IDApCisJc2V0X2tlZXBfbXNnKG1lc3NhZ2UpOworICAgIG1zZ19kaWRvdXQgPSBGQUxTRTsJICAgIC8qIG92ZXJ3cml0ZSB0aGlzIG1lc3NhZ2UgKi8KKyAgICBtc2dfbm93YWl0ID0gVFJVRTsJICAgIC8qIGRvbid0IHdhaXQgZm9yIHRoaXMgbWVzc2FnZSAqLworICAgIG1zZ19jb2wgPSAwOworI2VuZGlmCisgICAgLS1ub193YWl0X3JldHVybjsKK30KKworLyoKKyAqIEFkdmFuY2UgbXNnIGN1cnNvciB0byBjb2x1bW4gImNvbCIuCisgKi8KKyAgICB2b2lkCittc2dfYWR2YW5jZShjb2wpCisgICAgaW50CSAgICBjb2w7Cit7CisgICAgaWYgKG1zZ19zaWxlbnQgIT0gMCkJLyogbm90aGluZyB0byBhZHZhbmNlIHRvICovCisgICAgeworCW1zZ19jb2wgPSBjb2w7CQkvKiBmb3IgcmVkaXJlY3Rpb24sIG1heSBmaWxsIGl0IHVwIGxhdGVyICovCisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29sID49IENvbHVtbnMpCQkvKiBub3QgZW5vdWdoIHJvb20gKi8KKwljb2wgPSBDb2x1bW5zIC0gMTsKKyAgICB3aGlsZSAobXNnX2NvbCA8IGNvbCkKKwltc2dfcHV0Y2hhcignICcpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVXNlZCBmb3IgImNvbmZpcm0oKSIgZnVuY3Rpb24sIGFuZCB0aGUgOmNvbmZpcm0gY29tbWFuZCBwcmVmaXguCisgKiBWZXJzaW9ucyB3aGljaCBoYXZlbid0IGdvdCBmbGV4aWJsZSBkaWFsb2dzIHlldCwgYW5kIGNvbnNvbGUKKyAqIHZlcnNpb25zLCBnZXQgdGhpcyBnZW5lcmljIGhhbmRsZXIgd2hpY2ggdXNlcyB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIHR5cGUgID0gb25lIG9mOgorICoJICAgVklNX1FVRVNUSU9OLCBWSU1fSU5GTywgVklNX1dBUk5JTkcsIFZJTV9FUlJPUiBvciBWSU1fR0VORVJJQworICogdGl0bGUgPSB0aXRsZSBzdHJpbmcgKGNhbiBiZSBOVUxMIGZvciBkZWZhdWx0KQorICogKG5laXRoZXIgdXNlZCBpbiBjb25zb2xlIGRpYWxvZ3MgYXQgdGhlIG1vbWVudCkKKyAqCisgKiBGb3JtYXQgb2YgdGhlICJidXR0b25zIiBzdHJpbmc6CisgKiAiQnV0dG9uMU5hbWVcbkJ1dHRvbjJOYW1lXG5CdXR0b24zTmFtZSIKKyAqIFRoZSBmaXJzdCBidXR0b24gc2hvdWxkIG5vcm1hbGx5IGJlIHRoZSBkZWZhdWx0L2FjY2VwdAorICogVGhlIHNlY29uZCBidXR0b24gc2hvdWxkIGJlIHRoZSAnQ2FuY2VsJyBidXR0b24KKyAqIE90aGVyIGJ1dHRvbnMtIHVzZSB5b3VyIGltYWdpbmF0aW9uIQorICogQSAnJicgaW4gYSBidXR0b24gbmFtZSBiZWNvbWVzIGEgc2hvcnRjdXQsIHNvIGVhY2ggJyYnIHNob3VsZCBiZSBiZWZvcmUgYQorICogZGlmZmVyZW50IGxldHRlci4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK2RvX2RpYWxvZyh0eXBlLCB0aXRsZSwgbWVzc2FnZSwgYnV0dG9ucywgZGZsdGJ1dHRvbiwgdGV4dGZpZWxkKQorICAgIGludAkJdHlwZTsKKyAgICBjaGFyX3UJKnRpdGxlOworICAgIGNoYXJfdQkqbWVzc2FnZTsKKyAgICBjaGFyX3UJKmJ1dHRvbnM7CisgICAgaW50CQlkZmx0YnV0dG9uOworICAgIGNoYXJfdQkqdGV4dGZpZWxkOwkvKiBJT2J1ZmYgZm9yIGlucHV0ZGlhbG9nKCksIE5VTEwgb3RoZXJ3aXNlICovCit7CisgICAgaW50CQlvbGRTdGF0ZTsKKyAgICBpbnQJCXJldHZhbCA9IDA7CisgICAgY2hhcl91CSpob3RrZXlzOworICAgIGludAkJYzsKKyAgICBpbnQJCWk7CisKKyNpZm5kZWYgTk9fQ09OU09MRQorICAgIC8qIERvbid0IG91dHB1dCBhbnl0aGluZyBpbiBzaWxlbnQgbW9kZSAoImV4IC1zIikgKi8KKyAgICBpZiAoc2lsZW50X21vZGUpCisJcmV0dXJuIGRmbHRidXR0b247ICAgLyogcmV0dXJuIGRlZmF1bHQgb3B0aW9uICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX0RJQUxPRworICAgIC8qIFdoZW4gR1VJIGlzIHJ1bm5pbmcgYW5kICdjJyBub3QgaW4gJ2d1aW9wdGlvbnMnLCB1c2UgdGhlIEdVSSBkaWFsb2cgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSAmJiB2aW1fc3RyY2hyKHBfZ28sIEdPX0NPTkRJQUxPRykgPT0gTlVMTCkKKyAgICB7CisJYyA9IGd1aV9tY2hfZGlhbG9nKHR5cGUsIHRpdGxlLCBtZXNzYWdlLCBidXR0b25zLCBkZmx0YnV0dG9uLAorCQkJCQkJCQkgICB0ZXh0ZmllbGQpOworCW1zZ19lbmRfcHJvbXB0KCk7CisKKwkvKiBGbHVzaCBvdXRwdXQgdG8gYXZvaWQgdGhhdCBmdXJ0aGVyIG1lc3NhZ2VzIGFuZCByZWRyYXdpbmcgaXMgZG9uZQorCSAqIGluIHRoZSB3cm9uZyBvcmRlci4gKi8KKwlvdXRfZmx1c2goKTsKKwlndWlfbWNoX3VwZGF0ZSgpOworCisJcmV0dXJuIGM7CisgICAgfQorI2VuZGlmCisKKyAgICBvbGRTdGF0ZSA9IFN0YXRlOworICAgIFN0YXRlID0gQ09ORklSTTsKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgc2V0bW91c2UoKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBTaW5jZSB3ZSB3YWl0IGZvciBhIGtleXByZXNzLCBkb24ndCBtYWtlIHRoZQorICAgICAqIHVzZXIgcHJlc3MgUkVUVVJOIGFzIHdlbGwgYWZ0ZXJ3YXJkcy4KKyAgICAgKi8KKyAgICArK25vX3dhaXRfcmV0dXJuOworICAgIGhvdGtleXMgPSBtc2dfc2hvd19jb25zb2xlX2RpYWxvZyhtZXNzYWdlLCBidXR0b25zLCBkZmx0YnV0dG9uKTsKKworICAgIGlmIChob3RrZXlzICE9IE5VTEwpCisgICAgeworCWZvciAoOzspCisJeworCSAgICAvKiBHZXQgYSB0eXBlZCBjaGFyYWN0ZXIgZGlyZWN0bHkgZnJvbSB0aGUgdXNlci4gKi8KKwkgICAgYyA9IGdldF9rZXlzdHJva2UoKTsKKwkgICAgc3dpdGNoIChjKQorCSAgICB7CisJICAgIGNhc2UgQ0FSOgkJLyogVXNlciBhY2NlcHRzIGRlZmF1bHQgb3B0aW9uICovCisJICAgIGNhc2UgTkw6CisJCXJldHZhbCA9IGRmbHRidXR0b247CisJCWJyZWFrOworCSAgICBjYXNlIEN0cmxfQzoJLyogVXNlciBhYm9ydHMvY2FuY2VscyAqLworCSAgICBjYXNlIEVTQzoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CQkvKiBDb3VsZCBiZSBhIGhvdGtleT8gKi8KKwkJaWYgKGMgPCAwKQkvKiBzcGVjaWFsIGtleXMgYXJlIGlnbm9yZWQgaGVyZSAqLworCQkgICAgY29udGludWU7CisJCS8qIE1ha2UgdGhlIGNoYXJhY3RlciBsb3dlcmNhc2UsIGFzIGNoYXJzIGluICJob3RrZXlzIiBhcmUuICovCisJCWMgPSBNQl9UT0xPV0VSKGMpOworCQlyZXR2YWwgPSAxOworCQlmb3IgKGkgPSAwOyBob3RrZXlzW2ldOyArK2kpCisJCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkgICAgeworCQkJaWYgKCgqbWJfcHRyMmNoYXIpKGhvdGtleXMgKyBpKSA9PSBjKQorCQkJICAgIGJyZWFrOworCQkJaSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGhvdGtleXMgKyBpKSAtIDE7CisJCSAgICB9CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCWlmIChob3RrZXlzW2ldID09IGMpCisJCQkgICAgYnJlYWs7CisJCSAgICArK3JldHZhbDsKKwkJfQorCQlpZiAoaG90a2V5c1tpXSkKKwkJICAgIGJyZWFrOworCQkvKiBObyBob3RrZXkgbWF0Y2gsIHNvIGtlZXAgd2FpdGluZyAqLworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKwl2aW1fZnJlZShob3RrZXlzKTsKKyAgICB9CisKKyAgICBTdGF0ZSA9IG9sZFN0YXRlOworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzZXRtb3VzZSgpOworI2VuZGlmCisgICAgLS1ub193YWl0X3JldHVybjsKKyAgICBtc2dfZW5kX3Byb21wdCgpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjb3B5X2NoYXIgX19BUkdTKChjaGFyX3UgKmZyb20sIGNoYXJfdSAqdG8sIGludCBsb3dlcmNhc2UpKTsKKworLyoKKyAqIENvcHkgb25lIGNoYXJhY3RlciBmcm9tICIqZnJvbSIgdG8gIip0byIsIHRha2luZyBjYXJlIG9mIG11bHRpLWJ5dGUKKyAqIGNoYXJhY3RlcnMuICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY2hhcmFjdGVyIGluIGJ5dGVzLgorICovCisgICAgc3RhdGljIGludAorY29weV9jaGFyKGZyb20sIHRvLCBsb3dlcmNhc2UpCisgICAgY2hhcl91CSpmcm9tOworICAgIGNoYXJfdQkqdG87CisgICAgaW50CQlsb3dlcmNhc2U7CS8qIG1ha2UgY2hhcmFjdGVyIGxvd2VyIGNhc2UgKi8KK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsZW47CisgICAgaW50CQljOworCisgICAgaWYgKGhhc19tYnl0ZSkKKyAgICB7CisJaWYgKGxvd2VyY2FzZSkKKwl7CisJICAgIGMgPSBNQl9UT0xPV0VSKCgqbWJfcHRyMmNoYXIpKGZyb20pKTsKKwkgICAgcmV0dXJuICgqbWJfY2hhcjJieXRlcykoYywgdG8pOworCX0KKwllbHNlCisJeworCSAgICBsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKGZyb20pOworCSAgICBtY2hfbWVtbW92ZSh0bywgZnJvbSwgKHNpemVfdClsZW4pOworCSAgICByZXR1cm4gbGVuOworCX0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWlmIChsb3dlcmNhc2UpCisJICAgICp0byA9IChjaGFyX3UpVE9MT1dFUl9MT0MoKmZyb20pOworCWVsc2UKKwkgICAgKnRvID0gKmZyb207CisJcmV0dXJuIDE7CisgICAgfQorfQorCisvKgorICogRm9ybWF0IHRoZSBkaWFsb2cgc3RyaW5nLCBhbmQgZGlzcGxheSBpdCBhdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgc2NyZWVuLiBSZXR1cm4gYSBzdHJpbmcgb2YgaG90a2V5IGNoYXJzIChpZiBkZWZpbmVkKSBmb3IKKyAqIGVhY2ggJ2J1dHRvbicuIElmIGEgYnV0dG9uIGhhcyBubyBob3RrZXkgZGVmaW5lZCwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgorICogdGhlIGJ1dHRvbiBpcyB1c2VkLgorICogVGhlIGhvdGtleXMgY2FuIGJlIG11bHRpLWJ5dGUgY2hhcmFjdGVycywgYnV0IHdpdGhvdXQgY29tYmluaW5nIGNoYXJzLgorICoKKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyB3aXRoIGhvdGtleXMsIG9yIE5VTEwgZm9yIGVycm9yLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCittc2dfc2hvd19jb25zb2xlX2RpYWxvZyhtZXNzYWdlLCBidXR0b25zLCBkZmx0YnV0dG9uKQorICAgIGNoYXJfdQkqbWVzc2FnZTsKKyAgICBjaGFyX3UJKmJ1dHRvbnM7CisgICAgaW50CQlkZmx0YnV0dG9uOworeworICAgIGludAkJbGVuID0gMDsKKyNpZmRlZiBGRUFUX01CWVRFCisjIGRlZmluZSBIT1RLX0xFTiAoaGFzX21ieXRlID8gTUJfTUFYQllURVMgOiAxKQorI2Vsc2UKKyMgZGVmaW5lIEhPVEtfTEVOIDEKKyNlbmRpZgorICAgIGludAkJbGVuaG90a2V5ID0gSE9US19MRU47CS8qIGNvdW50IGZpcnN0IGJ1dHRvbiAqLworICAgIGNoYXJfdQkqaG90ayA9IE5VTEw7CisgICAgY2hhcl91CSptc2dwID0gTlVMTDsKKyAgICBjaGFyX3UJKmhvdGtwID0gTlVMTDsKKyAgICBjaGFyX3UJKnI7CisgICAgaW50CQljb3B5OworI2RlZmluZSBIQVNfSE9US0VZX0xFTiAzMAorICAgIGNoYXJfdQloYXNfaG90a2V5W0hBU19IT1RLRVlfTEVOXTsKKyAgICBpbnQJCWZpcnN0X2hvdGtleSA9IEZBTFNFOwkvKiBmaXJzdCBjaGFyIG9mIGJ1dHRvbiBpcyBob3RrZXkgKi8KKyAgICBpbnQJCWlkeDsKKworICAgIGhhc19ob3RrZXlbMF0gPSBGQUxTRTsKKworICAgIC8qCisgICAgICogRmlyc3QgbG9vcDogY29tcHV0ZSB0aGUgc2l6ZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgICAgICogU2Vjb25kIGxvb3A6IGNvcHkgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgICAgICovCisgICAgZm9yIChjb3B5ID0gMDsgY29weSA8PSAxOyArK2NvcHkpCisgICAgeworCXIgPSBidXR0b25zOworCWlkeCA9IDA7CisJd2hpbGUgKCpyKQorCXsKKwkgICAgaWYgKCpyID09IERMR19CVVRUT05fU0VQKQorCSAgICB7CisJCWlmIChjb3B5KQorCQl7CisJCSAgICAqbXNncCsrID0gJywnOworCQkgICAgKm1zZ3ArKyA9ICcgJzsJICAgIC8qICdcbicgLT4gJywgJyAqLworCisJCSAgICAvKiBhZHZhbmNlIHRvIG5leHQgaG90a2V5IGFuZCBzZXQgZGVmYXVsdCBob3RrZXkgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJaG90a3AgKz0gKCptYl9wdHIybGVuX2NoZWNrKShob3RrcCk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSsraG90a3A7CisJCSAgICAodm9pZCljb3B5X2NoYXIociArIDEsIGhvdGtwLCBUUlVFKTsKKwkJICAgIGlmIChkZmx0YnV0dG9uKQorCQkJLS1kZmx0YnV0dG9uOworCisJCSAgICAvKiBJZiBubyBob3RrZXkgaXMgc3BlY2lmaWVkIGZpcnN0IGNoYXIgaXMgdXNlZC4gKi8KKwkJICAgIGlmIChpZHggPCBIQVNfSE9US0VZX0xFTiAtIDEgJiYgIWhhc19ob3RrZXlbKytpZHhdKQorCQkJZmlyc3RfaG90a2V5ID0gVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGxlbiArPSAzOwkJICAgIC8qICdcbicgLT4gJywgJzsgJ3gnIC0+ICcoeCknICovCisJCSAgICBsZW5ob3RrZXkgKz0gSE9US19MRU47ICAvKiBlYWNoIGJ1dHRvbiBuZWVkcyBhIGhvdGtleSAqLworCQkgICAgaWYgKGlkeCA8IEhBU19IT1RLRVlfTEVOIC0gMSkKKwkJCWhhc19ob3RrZXlbKytpZHhdID0gRkFMU0U7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmICgqciA9PSBETEdfSE9US0VZX0NIQVIgfHwgZmlyc3RfaG90a2V5KQorCSAgICB7CisJCWlmICgqciA9PSBETEdfSE9US0VZX0NIQVIpCisJCSAgICArK3I7CisJCWZpcnN0X2hvdGtleSA9IEZBTFNFOworCQlpZiAoY29weSkKKwkJeworCQkgICAgaWYgKCpyID09IERMR19IT1RLRVlfQ0hBUikJCS8qICcmJmEnIC0+ICcmYScgKi8KKwkJCSptc2dwKysgPSAqcjsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qICcmYScgLT4gJ1thXScgKi8KKwkJCSptc2dwKysgPSAoZGZsdGJ1dHRvbiA9PSAxKSA/ICdbJyA6ICcoJzsKKwkJCW1zZ3AgKz0gY29weV9jaGFyKHIsIG1zZ3AsIEZBTFNFKTsKKwkJCSptc2dwKysgPSAoZGZsdGJ1dHRvbiA9PSAxKSA/ICddJyA6ICcpJzsKKworCQkJLyogcmVkZWZpbmUgaG90a2V5ICovCisJCQkodm9pZCljb3B5X2NoYXIociwgaG90a3AsIFRSVUUpOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgKytsZW47CSAgICAvKiAnJmEnIC0+ICdbYV0nICovCisJCSAgICBpZiAoaWR4IDwgSEFTX0hPVEtFWV9MRU4gLSAxKQorCQkJaGFzX2hvdGtleVtpZHhdID0gVFJVRTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBldmVyeXRoaW5nIGVsc2UgY29weSBsaXRlcmFsbHkgKi8KKwkJaWYgKGNvcHkpCisJCSAgICBtc2dwICs9IGNvcHlfY2hhcihyLCBtc2dwLCBGQUxTRSk7CisJICAgIH0KKworCSAgICAvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHIpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKytyOworCX0KKworCWlmIChjb3B5KQorCXsKKwkgICAgKm1zZ3ArKyA9ICc6JzsKKwkgICAgKm1zZ3ArKyA9ICcgJzsKKwkgICAgKm1zZ3AgPSBOVUw7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlob3RrcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGhvdGtwKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCSsraG90a3A7CisJICAgICpob3RrcCA9IE5VTDsKKwl9CisJZWxzZQorCXsKKwkgICAgbGVuICs9IFNUUkxFTihtZXNzYWdlKQorCQkgICAgKyAyCQkJLyogZm9yIHRoZSBOTCdzICovCisJCSAgICArIFNUUkxFTihidXR0b25zKQorCQkgICAgKyAzOwkJLyogZm9yIHRoZSAiOiAiIGFuZCBOVUwgKi8KKwkgICAgbGVuaG90a2V5Kys7CQkvKiBmb3IgdGhlIE5VTCAqLworCisJICAgIC8qIElmIG5vIGhvdGtleSBpcyBzcGVjaWZpZWQgZmlyc3QgY2hhciBpcyB1c2VkLiAqLworCSAgICBpZiAoIWhhc19ob3RrZXlbMF0pCisJICAgIHsKKwkJZmlyc3RfaG90a2V5ID0gVFJVRTsKKwkJbGVuICs9IDI7CQkvKiAieCIgLT4gIlt4XSIgKi8KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIE5vdyBhbGxvY2F0ZSBhbmQgbG9hZCB0aGUgc3RyaW5ncworCSAgICAgKi8KKwkgICAgdmltX2ZyZWUoY29uZmlybV9tc2cpOworCSAgICBjb25maXJtX21zZyA9IGFsbG9jKGxlbik7CisJICAgIGlmIChjb25maXJtX21zZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkgICAgKmNvbmZpcm1fbXNnID0gTlVMOworCSAgICBob3RrID0gYWxsb2MobGVuaG90a2V5KTsKKwkgICAgaWYgKGhvdGsgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkgICAgKmNvbmZpcm1fbXNnID0gJ1xuJzsKKwkgICAgU1RSQ1BZKGNvbmZpcm1fbXNnICsgMSwgbWVzc2FnZSk7CisKKwkgICAgbXNncCA9IGNvbmZpcm1fbXNnICsgMSArIFNUUkxFTihtZXNzYWdlKTsKKwkgICAgaG90a3AgPSBob3RrOworCisJICAgIC8qIGRlZmluZSBmaXJzdCBkZWZhdWx0IGhvdGtleSAqLworCSAgICAodm9pZCljb3B5X2NoYXIoYnV0dG9ucywgaG90a3AsIFRSVUUpOworCisJICAgIC8qIFJlbWVtYmVyIHdoZXJlIHRoZSBjaG9pY2VzIHN0YXJ0LCBkaXNwbGF5aW5nIHN0YXJ0cyBoZXJlIHdoZW4KKwkgICAgICogImhvdGtwIiB0eXBlZCBhdCB0aGUgbW9yZSBwcm9tcHQuICovCisJICAgIGNvbmZpcm1fbXNnX3RhaWwgPSBtc2dwOworCSAgICAqbXNncCsrID0gJ1xuJzsKKwl9CisgICAgfQorCisgICAgZGlzcGxheV9jb25maXJtX21zZygpOworICAgIHJldHVybiBob3RrOworfQorCisvKgorICogRGlzcGxheSB0aGUgIjpjb25maXJtIiBtZXNzYWdlLiAgQWxzbyBjYWxsZWQgd2hlbiBzY3JlZW4gcmVzaXplZC4KKyAqLworICAgIHZvaWQKK2Rpc3BsYXlfY29uZmlybV9tc2coKQoreworICAgIC8qIGF2b2lkIHRoYXQgJ3EnIGF0IHRoZSBtb3JlIHByb21wdCB0cnVuY2F0ZXMgdGhlIG1lc3NhZ2UgaGVyZSAqLworICAgICsrY29uZmlybV9tc2dfdXNlZDsKKyAgICBpZiAoY29uZmlybV9tc2cgIT0gTlVMTCkKKwltc2dfcHV0c19hdHRyKGNvbmZpcm1fbXNnLCBobF9hdHRyKEhMRl9NKSk7CisgICAgLS1jb25maXJtX21zZ191c2VkOworfQorCisjZW5kaWYgLyogRkVBVF9DT05fRElBTE9HICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykgfHwgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpCisKKyAgICBpbnQKK3ZpbV9kaWFsb2dfeWVzbm8odHlwZSwgdGl0bGUsIG1lc3NhZ2UsIGRmbHQpCisgICAgaW50CQl0eXBlOworICAgIGNoYXJfdQkqdGl0bGU7CisgICAgY2hhcl91CSptZXNzYWdlOworICAgIGludAkJZGZsdDsKK3sKKyAgICBpZiAoZG9fZGlhbG9nKHR5cGUsCisJCXRpdGxlID09IE5VTEwgPyAoY2hhcl91ICopXygiUXVlc3Rpb24iKSA6IHRpdGxlLAorCQltZXNzYWdlLAorCQkoY2hhcl91ICopXygiJlllc1xuJk5vIiksIGRmbHQsIE5VTEwpID09IDEpCisJcmV0dXJuIFZJTV9ZRVM7CisgICAgcmV0dXJuIFZJTV9OTzsKK30KKworICAgIGludAordmltX2RpYWxvZ195ZXNub2NhbmNlbCh0eXBlLCB0aXRsZSwgbWVzc2FnZSwgZGZsdCkKKyAgICBpbnQJCXR5cGU7CisgICAgY2hhcl91CSp0aXRsZTsKKyAgICBjaGFyX3UJKm1lc3NhZ2U7CisgICAgaW50CQlkZmx0OworeworICAgIHN3aXRjaCAoZG9fZGlhbG9nKHR5cGUsCisJCXRpdGxlID09IE5VTEwgPyAoY2hhcl91ICopXygiUXVlc3Rpb24iKSA6IHRpdGxlLAorCQltZXNzYWdlLAorCQkoY2hhcl91ICopXygiJlllc1xuJk5vXG4mQ2FuY2VsIiksIGRmbHQsIE5VTEwpKQorICAgIHsKKwljYXNlIDE6IHJldHVybiBWSU1fWUVTOworCWNhc2UgMjogcmV0dXJuIFZJTV9OTzsKKyAgICB9CisgICAgcmV0dXJuIFZJTV9DQU5DRUw7Cit9CisKKyAgICBpbnQKK3ZpbV9kaWFsb2dfeWVzbm9hbGxjYW5jZWwodHlwZSwgdGl0bGUsIG1lc3NhZ2UsIGRmbHQpCisgICAgaW50CQl0eXBlOworICAgIGNoYXJfdQkqdGl0bGU7CisgICAgY2hhcl91CSptZXNzYWdlOworICAgIGludAkJZGZsdDsKK3sKKyAgICBzd2l0Y2ggKGRvX2RpYWxvZyh0eXBlLAorCQl0aXRsZSA9PSBOVUxMID8gKGNoYXJfdSAqKSJRdWVzdGlvbiIgOiB0aXRsZSwKKwkJbWVzc2FnZSwKKwkJKGNoYXJfdSAqKV8oIiZZZXNcbiZOb1xuU2F2ZSAmQWxsXG4mRGlzY2FyZCBBbGxcbiZDYW5jZWwiKSwKKwkJCQkJCQkJICBkZmx0LCBOVUxMKSkKKyAgICB7CisJY2FzZSAxOiByZXR1cm4gVklNX1lFUzsKKwljYXNlIDI6IHJldHVybiBWSU1fTk87CisJY2FzZSAzOiByZXR1cm4gVklNX0FMTDsKKwljYXNlIDQ6IHJldHVybiBWSU1fRElTQ0FSREFMTDsKKyAgICB9CisgICAgcmV0dXJuIFZJTV9DQU5DRUw7Cit9CisKKyNlbmRpZiAvKiBGRUFUX0dVSV9ESUFMT0cgfHwgRkVBVF9DT05fRElBTE9HICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQlJPV1NFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdlbmVyaWMgYnJvd3NlIGZ1bmN0aW9uLiAgQ2FsbHMgZ3VpX21jaF9icm93c2UoKSB3aGVuIHBvc3NpYmxlLgorICogTGF0ZXIgdGhpcyBtYXkgcG9wLXVwIGEgbm9uLUdVSSBmaWxlIHNlbGVjdG9yIChleHRlcm5hbCBjb21tYW5kPykuCisgKi8KKyAgICBjaGFyX3UgKgorZG9fYnJvd3NlKHNhdmluZywgdGl0bGUsIGRmbHQsIGV4dCwgaW5pdGRpciwgZmlsdGVyLCBidWYpCisgICAgaW50CQlzYXZpbmc7CQkvKiB3cml0ZSBhY3Rpb24gKi8KKyAgICBjaGFyX3UJKnRpdGxlOwkJLyogdGl0bGUgZm9yIHRoZSB3aW5kb3cgKi8KKyAgICBjaGFyX3UJKmRmbHQ7CQkvKiBkZWZhdWx0IGZpbGUgbmFtZSAobWF5IGluY2x1ZGUgZGlyZWN0b3J5KSAqLworICAgIGNoYXJfdQkqZXh0OwkJLyogZXh0ZW5zaW9uIGFkZGVkICovCisgICAgY2hhcl91CSppbml0ZGlyOwkvKiBpbml0aWFsIGRpcmVjdG9yeSwgTlVMTCBmb3IgY3VycmVudCBkaXIgb3IKKwkJCQkgICB3aGVuIHVzaW5nIHBhdGggZnJvbSAiZGZsdCIgKi8KKyAgICBjaGFyX3UJKmZpbHRlcjsJLyogZmlsZSBuYW1lIGZpbHRlciAqLworICAgIGJ1Zl9UCSpidWY7CQkvKiBidWZmZXIgdG8gcmVhZC93cml0ZSBmb3IgKi8KK3sKKyAgICBjaGFyX3UJCSpmbmFtZTsKKyAgICBzdGF0aWMgY2hhcl91CSpsYXN0X2RpciA9IE5VTEw7ICAgIC8qIGxhc3QgdXNlZCBkaXJlY3RvcnkgKi8KKyAgICBjaGFyX3UJCSp0b2ZyZWUgPSBOVUxMOworICAgIGludAkJCXNhdmVfYnJvd3NlID0gY21kbW9kLmJyb3dzZTsKKworICAgIC8qIE11c3QgdHVybiBvZmYgYnJvd3NlIHRvIGF2b2lkIHRoYXQgYXV0b2NvbW1hbmRzIHdpbGwgZ2V0IHRoZQorICAgICAqIGZsYWcgdG9vISAgKi8KKyAgICBjbWRtb2QuYnJvd3NlID0gRkFMU0U7CisKKyAgICBpZiAodGl0bGUgPT0gTlVMTCkKKyAgICB7CisJaWYgKHNhdmluZykKKwkgICAgdGl0bGUgPSAoY2hhcl91ICopXygiU2F2ZSBGaWxlIGRpYWxvZyIpOworCWVsc2UKKwkgICAgdGl0bGUgPSAoY2hhcl91ICopXygiT3BlbiBGaWxlIGRpYWxvZyIpOworICAgIH0KKworICAgIC8qIFdoZW4gbm8gZGlyZWN0b3J5IHNwZWNpZmllZCwgdXNlIGRlZmF1bHQgZmlsZSBuYW1lLCBkZWZhdWx0IGRpciwgYnVmZmVyCisgICAgICogZGlyLCBsYXN0IGRpciBvciBjdXJyZW50IGRpciAqLworICAgIGlmICgoaW5pdGRpciA9PSBOVUxMIHx8ICppbml0ZGlyID09IE5VTCkgJiYgZGZsdCAhPSBOVUxMICYmICpkZmx0ICE9IE5VTCkKKyAgICB7CisJaWYgKG1jaF9pc2RpcihkZmx0KSkJCS8qIGRlZmF1bHQgZmlsZSBuYW1lIGlzIGEgZGlyZWN0b3J5ICovCisJeworCSAgICBpbml0ZGlyID0gZGZsdDsKKwkgICAgZGZsdCA9IE5VTEw7CisJfQorCWVsc2UgaWYgKGdldHRhaWwoZGZsdCkgIT0gZGZsdCkJLyogZGVmYXVsdCBmaWxlIG5hbWUgaW5jbHVkZXMgYSBwYXRoICovCisJeworCSAgICB0b2ZyZWUgPSB2aW1fc3Ryc2F2ZShkZmx0KTsKKwkgICAgaWYgKHRvZnJlZSAhPSBOVUxMKQorCSAgICB7CisJCWluaXRkaXIgPSB0b2ZyZWU7CisJCSpnZXR0YWlsKGluaXRkaXIpID0gTlVMOworCQlkZmx0ID0gZ2V0dGFpbChkZmx0KTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoaW5pdGRpciA9PSBOVUxMIHx8ICppbml0ZGlyID09IE5VTCkKKyAgICB7CisJLyogV2hlbiAnYnJvd3NlZGlyJyBpcyBhIGRpcmVjdG9yeSwgdXNlIGl0ICovCisJaWYgKG1jaF9pc2RpcihwX2JzZGlyKSkKKwkgICAgaW5pdGRpciA9IHBfYnNkaXI7CisJLyogV2hlbiBzYXZpbmcgb3IgJ2Jyb3dzZWRpcicgaXMgImJ1ZmZlciIsIHVzZSBidWZmZXIgZm5hbWUgKi8KKwllbHNlIGlmICgoc2F2aW5nIHx8ICpwX2JzZGlyID09ICdiJykKKwkJJiYgYnVmICE9IE5VTEwgJiYgYnVmLT5iX2ZmbmFtZSAhPSBOVUxMKQorCXsKKwkgICAgaWYgKGRmbHQgPT0gTlVMTCB8fCAqZGZsdCA9PSBOVUwpCisJCWRmbHQgPSBnZXR0YWlsKGN1cmJ1Zi0+Yl9mZm5hbWUpOworCSAgICB0b2ZyZWUgPSB2aW1fc3Ryc2F2ZShjdXJidWYtPmJfZmZuYW1lKTsKKwkgICAgaWYgKHRvZnJlZSAhPSBOVUxMKQorCSAgICB7CisJCWluaXRkaXIgPSB0b2ZyZWU7CisJCSpnZXR0YWlsKGluaXRkaXIpID0gTlVMOworCSAgICB9CisJfQorCS8qIFdoZW4gJ2Jyb3dzZWRpcicgaXMgImxhc3QiLCB1c2UgZGlyIGZyb20gbGFzdCBicm93c2UgKi8KKwllbHNlIGlmICgqcF9ic2RpciA9PSAnbCcpCisJICAgIGluaXRkaXIgPSBsYXN0X2RpcjsKKwkvKiBXaGVuICdicm93c2VkaXIgaXMgImN1cnJlbnQiLCB1c2UgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzIGlzIHRoZQorCSAqIGRlZmF1bHQgYWxyZWFkeSwgbGVhdmUgaW5pdGRpciBlbXB0eS4gKi8KKyAgICB9CisKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkJCS8qIHdoZW4gdGhpcyBjaGFuZ2VzLCBhbHNvIGFkanVzdCBmX2hhcygpISAqLworICAgIHsKKwlpZiAoZmlsdGVyID09IE5VTEwKKyMgIGlmZGVmIEZFQVRfRVZBTAorCQkmJiAoZmlsdGVyID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImI6YnJvd3NlZmlsdGVyIikpID09IE5VTEwKKwkJJiYgKGZpbHRlciA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOmJyb3dzZWZpbHRlciIpKSA9PSBOVUxMCisjICBlbmRpZgorCSkKKwkgICAgZmlsdGVyID0gQlJPV1NFX0ZJTFRFUl9ERUZBVUxUOworCWZuYW1lID0gZ3VpX21jaF9icm93c2Uoc2F2aW5nLCB0aXRsZSwgZGZsdCwgZXh0LCBpbml0ZGlyLCBmaWx0ZXIpOworCisJLyogV2UgaGFuZyBhcm91bmQgaW4gdGhlIGRpYWxvZyBmb3IgYSB3aGlsZSwgdGhlIHVzZXIgbWlnaHQgZG8gc29tZQorCSAqIHRoaW5ncyB0byBvdXIgZmlsZXMuICBUaGUgV2luMzIgZGlhbG9nIGFsbG93cyBkZWxldGluZyBvciByZW5hbWluZworCSAqIGEgZmlsZSwgY2hlY2sgdGltZXN0YW1wcy4gKi8KKwluZWVkX2NoZWNrX3RpbWVzdGFtcHMgPSBUUlVFOworCWRpZF9jaGVja190aW1lc3RhbXBzID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyMgZW5kaWYKKyAgICB7CisJLyogVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUgKi8KKwlFTVNHKF8oIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIikpOworCWZuYW1lID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBrZWVwIHRoZSBkaXJlY3RvcnkgZm9yIG5leHQgdGltZSAqLworICAgIGlmIChmbmFtZSAhPSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShsYXN0X2Rpcik7CisJbGFzdF9kaXIgPSB2aW1fc3Ryc2F2ZShmbmFtZSk7CisJaWYgKGxhc3RfZGlyICE9IE5VTEwpCisJeworCSAgICAqZ2V0dGFpbChsYXN0X2RpcikgPSBOVUw7CisJICAgIGlmICgqbGFzdF9kaXIgPT0gTlVMKQorCSAgICB7CisJCS8qIGZpbGVuYW1lIG9ubHkgcmV0dXJuZWQsIG11c3QgYmUgaW4gY3VycmVudCBkaXIgKi8KKwkJdmltX2ZyZWUobGFzdF9kaXIpOworCQlsYXN0X2RpciA9IGFsbG9jKE1BWFBBVEhMKTsKKwkJaWYgKGxhc3RfZGlyICE9IE5VTEwpCisJCSAgICBtY2hfZGlybmFtZShsYXN0X2RpciwgTUFYUEFUSEwpOworCSAgICB9CisJfQorICAgIH0KKworICAgIHZpbV9mcmVlKHRvZnJlZSk7CisgICAgY21kbW9kLmJyb3dzZSA9IHNhdmVfYnJvd3NlOworCisgICAgcmV0dXJuIGZuYW1lOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWlzYzEuYyBiL3NyYy9taXNjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDcwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYzEuYwpAQCAtMCwwICsxLDg0NTUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIG1pc2MxLmM6IGZ1bmN0aW9ucyB0aGF0IGRpZG4ndCBzZWVtIHRvIGZpdCBlbHNld2hlcmUKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgY2hkaXIoKSAqLworI2VuZGlmCisKK3N0YXRpYyBjaGFyX3UgKnZpbV92ZXJzaW9uX2RpciBfX0FSR1MoKGNoYXJfdSAqdmltZGlyKSk7CitzdGF0aWMgY2hhcl91ICpyZW1vdmVfdGFpbCBfX0FSR1MoKGNoYXJfdSAqcCwgY2hhcl91ICpwZW5kLCBjaGFyX3UgKm5hbWUpKTsKKyNpZiBkZWZpbmVkKFVTRV9FWEVfTkFNRSkgJiYgZGVmaW5lZChNQUNPU19YKQorc3RhdGljIGNoYXJfdSAqcmVtb3ZlX3RhaWxfd2l0aF9leHQgX19BUkdTKChjaGFyX3UgKnAsIGNoYXJfdSAqcGVuZCwgY2hhcl91ICpleHQpKTsKKyNlbmRpZgorc3RhdGljIGludCBnZXRfaW5kZW50X3N0ciBfX0FSR1MoKGNoYXJfdSAqcHRyLCBpbnQgdHMpKTsKK3N0YXRpYyBpbnQgY29weV9pbmRlbnQgX19BUkdTKChpbnQgc2l6ZSwgY2hhcl91CSpzcmMpKTsKKworLyoKKyAqIENvdW50IHRoZSBzaXplIChpbiB3aW5kb3cgY2VsbHMpIG9mIHRoZSBpbmRlbnQgaW4gdGhlIGN1cnJlbnQgbGluZS4KKyAqLworICAgIGludAorZ2V0X2luZGVudCgpCit7CisgICAgcmV0dXJuIGdldF9pbmRlbnRfc3RyKG1sX2dldF9jdXJsaW5lKCksIChpbnQpY3VyYnVmLT5iX3BfdHMpOworfQorCisvKgorICogQ291bnQgdGhlIHNpemUgKGluIHdpbmRvdyBjZWxscykgb2YgdGhlIGluZGVudCBpbiBsaW5lICJsbnVtIi4KKyAqLworICAgIGludAorZ2V0X2luZGVudF9sbnVtKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICByZXR1cm4gZ2V0X2luZGVudF9zdHIobWxfZ2V0KGxudW0pLCAoaW50KWN1cmJ1Zi0+Yl9wX3RzKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9GT0xESU5HKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENvdW50IHRoZSBzaXplIChpbiB3aW5kb3cgY2VsbHMpIG9mIHRoZSBpbmRlbnQgaW4gbGluZSAibG51bSIgb2YgYnVmZmVyCisgKiAiYnVmIi4KKyAqLworICAgIGludAorZ2V0X2luZGVudF9idWYoYnVmLCBsbnVtKQorICAgIGJ1Zl9UCSpidWY7CisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICByZXR1cm4gZ2V0X2luZGVudF9zdHIobWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKSwgKGludClidWYtPmJfcF90cyk7Cit9CisjZW5kaWYKKworLyoKKyAqIGNvdW50IHRoZSBzaXplIChpbiB3aW5kb3cgY2VsbHMpIG9mIHRoZSBpbmRlbnQgaW4gbGluZSAicHRyIiwgd2l0aAorICogJ3RhYnN0b3AnIGF0ICJ0cyIKKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9pbmRlbnRfc3RyKHB0ciwgdHMpCisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQl0czsKK3sKKyAgICBpbnQJCWNvdW50ID0gMDsKKworICAgIGZvciAoIDsgKnB0cjsgKytwdHIpCisgICAgeworCWlmICgqcHRyID09IFRBQikgICAgLyogY291bnQgYSB0YWIgZm9yIHdoYXQgaXQgaXMgd29ydGggKi8KKwkgICAgY291bnQgKz0gdHMgLSAoY291bnQgJSB0cyk7CisJZWxzZSBpZiAoKnB0ciA9PSAnICcpCisJICAgICsrY291bnQ7CQkvKiBjb3VudCBhIHNwYWNlIGZvciBvbmUgKi8KKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIFNldCB0aGUgaW5kZW50IG9mIHRoZSBjdXJyZW50IGxpbmUuCisgKiBMZWF2ZXMgdGhlIGN1cnNvciBvbiB0aGUgZmlyc3Qgbm9uLWJsYW5rIGluIHRoZSBsaW5lLgorICogQ2FsbGVyIG11c3QgdGFrZSBjYXJlIG9mIHVuZG8uCisgKiAiZmxhZ3MiOgorICoJU0lOX0NIQU5HRUQ6CWNhbGwgY2hhbmdlZF9ieXRlcygpIGlmIHRoZSBsaW5lIHdhcyBjaGFuZ2VkLgorICoJU0lOX0lOU0VSVDoJaW5zZXJ0IHRoZSBpbmRlbnQgaW4gZnJvbnQgb2YgdGhlIGxpbmUuCisgKglTSU5fVU5ETzoJc2F2ZSBsaW5lIGZvciB1bmRvIGJlZm9yZSBjaGFuZ2luZyBpdC4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgbGluZSB3YXMgY2hhbmdlZC4KKyAqLworICAgIGludAorc2V0X2luZGVudChzaXplLCBmbGFncykKKyAgICBpbnQJCXNpemU7CisgICAgaW50CQlmbGFnczsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpuZXdsaW5lOworICAgIGNoYXJfdQkqb2xkbGluZTsKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQl0b2RvOworICAgIGludAkJaW5kX2xlbjsKKyAgICBpbnQJCWxpbmVfbGVuOworICAgIGludAkJZG9pdCA9IEZBTFNFOworICAgIGludAkJaW5kX2RvbmU7CisgICAgaW50CQl0YWJfcGFkOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBkbyBhbmQgY29tcHV0ZSB0aGUgbnVtYmVyIG9mCisgICAgICogY2hhcmFjdGVycyBuZWVkZWQgZm9yIHRoZSBpbmRlbnQuCisgICAgICovCisgICAgdG9kbyA9IHNpemU7CisgICAgaW5kX2xlbiA9IDA7CisgICAgcCA9IG9sZGxpbmUgPSBtbF9nZXRfY3VybGluZSgpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIG5ldyBpbmRlbnQsIGFuZCBjaGVjayB0byBzZWUgaWYgaXQKKyAgICAgKiBpc24ndCBhbHJlYWR5IHNldCAqLworCisgICAgLyogaWYgJ2V4cGFuZHRhYicgaXNuJ3Qgc2V0OiB1c2UgVEFCcyAqLworICAgIGlmICghY3VyYnVmLT5iX3BfZXQpCisgICAgeworCS8qIElmICdwcmVzZXJ2ZWluZGVudCcgaXMgc2V0IHRoZW4gcmV1c2UgYXMgbXVjaCBhcyBwb3NzaWJsZSBvZgorCSAqIHRoZSBleGlzdGluZyBpbmRlbnQgc3RydWN0dXJlIGZvciB0aGUgbmV3IGluZGVudCAqLworCWlmICghKGZsYWdzICYgU0lOX0lOU0VSVCkgJiYgY3VyYnVmLT5iX3BfcGkpCisJeworCSAgICBpbmRfZG9uZSA9IDA7CisKKwkgICAgLyogY291bnQgYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHdlIGNhbiB1c2UgKi8KKwkgICAgd2hpbGUgKHRvZG8gPiAwICYmIHZpbV9pc3doaXRlKCpwKSkKKwkgICAgeworCQlpZiAoKnAgPT0gVEFCKQorCQl7CisJCSAgICB0YWJfcGFkID0gKGludCljdXJidWYtPmJfcF90cworCQkJCQkgICAtIChpbmRfZG9uZSAlIChpbnQpY3VyYnVmLT5iX3BfdHMpOworCQkgICAgLyogc3RvcCBpZiB0aGlzIHRhYiB3aWxsIG92ZXJzaG9vdCB0aGUgdGFyZ2V0ICovCisJCSAgICBpZiAodG9kbyA8IHRhYl9wYWQpCisJCQlicmVhazsKKwkJICAgIHRvZG8gLT0gdGFiX3BhZDsKKwkJICAgICsraW5kX2xlbjsKKwkJICAgIGluZF9kb25lICs9IHRhYl9wYWQ7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAtLXRvZG87CisJCSAgICArK2luZF9sZW47CisJCSAgICArK2luZF9kb25lOworCQl9CisJCSsrcDsKKwkgICAgfQorCisJICAgIC8qIEZpbGwgdG8gbmV4dCB0YWJzdG9wIHdpdGggYSB0YWIsIGlmIHBvc3NpYmxlICovCisJICAgIHRhYl9wYWQgPSAoaW50KWN1cmJ1Zi0+Yl9wX3RzIC0gKGluZF9kb25lICUgKGludCljdXJidWYtPmJfcF90cyk7CisJICAgIGlmICh0b2RvID49IHRhYl9wYWQpCisJICAgIHsKKwkJZG9pdCA9IFRSVUU7CisJCXRvZG8gLT0gdGFiX3BhZDsKKwkJKytpbmRfbGVuOworCQkvKiBpbmRfZG9uZSArPSB0YWJfcGFkOyAqLworCSAgICB9CisJfQorCisJLyogY291bnQgdGFicyByZXF1aXJlZCBmb3IgaW5kZW50ICovCisJd2hpbGUgKHRvZG8gPj0gKGludCljdXJidWYtPmJfcF90cykKKwl7CisJICAgIGlmICgqcCAhPSBUQUIpCisJCWRvaXQgPSBUUlVFOworCSAgICBlbHNlCisJCSsrcDsKKwkgICAgdG9kbyAtPSAoaW50KWN1cmJ1Zi0+Yl9wX3RzOworCSAgICArK2luZF9sZW47CisJICAgIC8qIGluZF9kb25lICs9IChpbnQpY3VyYnVmLT5iX3BfdHM7ICovCisJfQorICAgIH0KKyAgICAvKiBjb3VudCBzcGFjZXMgcmVxdWlyZWQgZm9yIGluZGVudCAqLworICAgIHdoaWxlICh0b2RvID4gMCkKKyAgICB7CisJaWYgKCpwICE9ICcgJykKKwkgICAgZG9pdCA9IFRSVUU7CisJZWxzZQorCSAgICArK3A7CisJLS10b2RvOworCSsraW5kX2xlbjsKKwkvKiArK2luZF9kb25lOyAqLworICAgIH0KKworICAgIC8qIFJldHVybiBpZiB0aGUgaW5kZW50IGlzIE9LIGFscmVhZHkuICovCisgICAgaWYgKCFkb2l0ICYmICF2aW1faXN3aGl0ZSgqcCkgJiYgIShmbGFncyAmIFNJTl9JTlNFUlQpKQorCXJldHVybiBGQUxTRTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBsaW5lLiAqLworICAgIGlmIChmbGFncyAmIFNJTl9JTlNFUlQpCisJcCA9IG9sZGxpbmU7CisgICAgZWxzZQorCXAgPSBza2lwd2hpdGUocCk7CisgICAgbGluZV9sZW4gPSAoaW50KVNUUkxFTihwKSArIDE7CisgICAgbmV3bGluZSA9IGFsbG9jKGluZF9sZW4gKyBsaW5lX2xlbik7CisgICAgaWYgKG5ld2xpbmUgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBQdXQgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIG5ldyBsaW5lLiAqLworICAgIHMgPSBuZXdsaW5lOworICAgIHRvZG8gPSBzaXplOworICAgIC8qIGlmICdleHBhbmR0YWInIGlzbid0IHNldDogdXNlIFRBQnMgKi8KKyAgICBpZiAoIWN1cmJ1Zi0+Yl9wX2V0KQorICAgIHsKKwkvKiBJZiAncHJlc2VydmVpbmRlbnQnIGlzIHNldCB0aGVuIHJldXNlIGFzIG11Y2ggYXMgcG9zc2libGUgb2YKKwkgKiB0aGUgZXhpc3RpbmcgaW5kZW50IHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBpbmRlbnQgKi8KKwlpZiAoIShmbGFncyAmIFNJTl9JTlNFUlQpICYmIGN1cmJ1Zi0+Yl9wX3BpKQorCXsKKwkgICAgcCA9IG9sZGxpbmU7CisJICAgIGluZF9kb25lID0gMDsKKworCSAgICB3aGlsZSAodG9kbyA+IDAgJiYgdmltX2lzd2hpdGUoKnApKQorCSAgICB7CisJCWlmICgqcCA9PSBUQUIpCisJCXsKKwkJICAgIHRhYl9wYWQgPSAoaW50KWN1cmJ1Zi0+Yl9wX3RzCisJCQkJCSAgIC0gKGluZF9kb25lICUgKGludCljdXJidWYtPmJfcF90cyk7CisJCSAgICAvKiBzdG9wIGlmIHRoaXMgdGFiIHdpbGwgb3ZlcnNob290IHRoZSB0YXJnZXQgKi8KKwkJICAgIGlmICh0b2RvIDwgdGFiX3BhZCkKKwkJCWJyZWFrOworCQkgICAgdG9kbyAtPSB0YWJfcGFkOworCQkgICAgaW5kX2RvbmUgKz0gdGFiX3BhZDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC0tdG9kbzsKKwkJICAgICsraW5kX2RvbmU7CisJCX0KKwkJKnMrKyA9ICpwKys7CisJICAgIH0KKworCSAgICAvKiBGaWxsIHRvIG5leHQgdGFic3RvcCB3aXRoIGEgdGFiLCBpZiBwb3NzaWJsZSAqLworCSAgICB0YWJfcGFkID0gKGludCljdXJidWYtPmJfcF90cyAtIChpbmRfZG9uZSAlIChpbnQpY3VyYnVmLT5iX3BfdHMpOworCSAgICBpZiAodG9kbyA+PSB0YWJfcGFkKQorCSAgICB7CisJCSpzKysgPSBUQUI7CisJCXRvZG8gLT0gdGFiX3BhZDsKKwkgICAgfQorCisJICAgIHAgPSBza2lwd2hpdGUocCk7CisJfQorCisJd2hpbGUgKHRvZG8gPj0gKGludCljdXJidWYtPmJfcF90cykKKwl7CisJICAgICpzKysgPSBUQUI7CisJICAgIHRvZG8gLT0gKGludCljdXJidWYtPmJfcF90czsKKwl9CisgICAgfQorICAgIHdoaWxlICh0b2RvID4gMCkKKyAgICB7CisJKnMrKyA9ICcgJzsKKwktLXRvZG87CisgICAgfQorICAgIG1jaF9tZW1tb3ZlKHMsIHAsIChzaXplX3QpbGluZV9sZW4pOworCisgICAgLyogUmVwbGFjZSB0aGUgbGluZSAodW5sZXNzIHVuZG8gZmFpbHMpLiAqLworICAgIGlmICghKGZsYWdzICYgU0lOX1VORE8pIHx8IHVfc2F2ZXN1YihjdXJ3aW4tPndfY3Vyc29yLmxudW0pID09IE9LKQorICAgIHsKKwltbF9yZXBsYWNlKGN1cndpbi0+d19jdXJzb3IubG51bSwgbmV3bGluZSwgRkFMU0UpOworCWlmIChmbGFncyAmIFNJTl9DSEFOR0VEKQorCSAgICBjaGFuZ2VkX2J5dGVzKGN1cndpbi0+d19jdXJzb3IubG51bSwgMCk7CisJLyogQ29ycmVjdCBzYXZlZCBjdXJzb3IgcG9zaXRpb24gaWYgaXQncyBhZnRlciB0aGUgaW5kZW50LiAqLworCWlmIChzYXZlZF9jdXJzb3IubG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJCQkmJiBzYXZlZF9jdXJzb3IuY29sID49IChjb2xucl9UKShwIC0gb2xkbGluZSkpCisJICAgIHNhdmVkX2N1cnNvci5jb2wgKz0gaW5kX2xlbiAtIChwIC0gb2xkbGluZSk7CisgICAgfQorICAgIGVsc2UKKwl2aW1fZnJlZShuZXdsaW5lKTsKKworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gaW5kX2xlbjsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIENvcHkgdGhlIGluZGVudCBmcm9tIHB0ciB0byB0aGUgY3VycmVudCBsaW5lIChhbmQgZmlsbCB0byBzaXplKQorICogTGVhdmVzIHRoZSBjdXJzb3Igb24gdGhlIGZpcnN0IG5vbi1ibGFuayBpbiB0aGUgbGluZS4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgbGluZSB3YXMgY2hhbmdlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NvcHlfaW5kZW50KHNpemUsIHNyYykKKyAgICBpbnQJCXNpemU7CisgICAgY2hhcl91CSpzcmM7Cit7CisgICAgY2hhcl91CSpwID0gTlVMTDsKKyAgICBjaGFyX3UJKmxpbmUgPSBOVUxMOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCXRvZG87CisgICAgaW50CQlpbmRfbGVuOworICAgIGludAkJbGluZV9sZW4gPSAwOworICAgIGludAkJdGFiX3BhZDsKKyAgICBpbnQJCWluZF9kb25lOworICAgIGludAkJcm91bmQ7CisKKyAgICAvKiBSb3VuZCAxOiBjb21wdXRlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBuZWVkZWQgZm9yIHRoZSBpbmRlbnQKKyAgICAgKiBSb3VuZCAyOiBjb3B5IHRoZSBjaGFyYWN0ZXJzLiAqLworICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAyOyArK3JvdW5kKQorICAgIHsKKwl0b2RvID0gc2l6ZTsKKwlpbmRfbGVuID0gMDsKKwlpbmRfZG9uZSA9IDA7CisJcyA9IHNyYzsKKworCS8qIENvdW50L2NvcHkgdGhlIHVzYWJsZSBwb3J0aW9uIG9mIHRoZSBzb3VyY2UgbGluZSAqLworCXdoaWxlICh0b2RvID4gMCAmJiB2aW1faXN3aGl0ZSgqcykpCisJeworCSAgICBpZiAoKnMgPT0gVEFCKQorCSAgICB7CisJCXRhYl9wYWQgPSAoaW50KWN1cmJ1Zi0+Yl9wX3RzCisJCQkJCSAgIC0gKGluZF9kb25lICUgKGludCljdXJidWYtPmJfcF90cyk7CisJCS8qIFN0b3AgaWYgdGhpcyB0YWIgd2lsbCBvdmVyc2hvb3QgdGhlIHRhcmdldCAqLworCQlpZiAodG9kbyA8IHRhYl9wYWQpCisJCSAgICBicmVhazsKKwkJdG9kbyAtPSB0YWJfcGFkOworCQlpbmRfZG9uZSArPSB0YWJfcGFkOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQktLXRvZG87CisJCSsraW5kX2RvbmU7CisJICAgIH0KKwkgICAgKytpbmRfbGVuOworCSAgICBpZiAocm91bmQgPT0gMikKKwkJKnArKyA9ICpzOworCSAgICArK3M7CisJfQorCisJLyogRmlsbCB0byBuZXh0IHRhYnN0b3Agd2l0aCBhIHRhYiwgaWYgcG9zc2libGUgKi8KKwl0YWJfcGFkID0gKGludCljdXJidWYtPmJfcF90cyAtIChpbmRfZG9uZSAlIChpbnQpY3VyYnVmLT5iX3BfdHMpOworCWlmICh0b2RvID49IHRhYl9wYWQpCisJeworCSAgICB0b2RvIC09IHRhYl9wYWQ7CisJICAgICsraW5kX2xlbjsKKwkgICAgaWYgKHJvdW5kID09IDIpCisJCSpwKysgPSBUQUI7CisJfQorCisJLyogQWRkIHRhYnMgcmVxdWlyZWQgZm9yIGluZGVudCAqLworCXdoaWxlICh0b2RvID49IChpbnQpY3VyYnVmLT5iX3BfdHMpCisJeworCSAgICB0b2RvIC09IChpbnQpY3VyYnVmLT5iX3BfdHM7CisJICAgICsraW5kX2xlbjsKKwkgICAgaWYgKHJvdW5kID09IDIpCisJCSpwKysgPSBUQUI7CisJfQorCisJLyogQ291bnQvYWRkIHNwYWNlcyByZXF1aXJlZCBmb3IgaW5kZW50ICovCisJd2hpbGUgKHRvZG8gPiAwKQorCXsKKwkgICAgLS10b2RvOworCSAgICArK2luZF9sZW47CisJICAgIGlmIChyb3VuZCA9PSAyKQorCQkqcCsrID0gJyAnOworCX0KKworCWlmIChyb3VuZCA9PSAxKQorCXsKKwkgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVzdWx0OiB0aGUgY29waWVkIGluZGVudCwgbmV3IGluZGVudAorCSAgICAgKiBhbmQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICovCisJICAgIGxpbmVfbGVuID0gKGludClTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSkgKyAxOworCSAgICBsaW5lID0gYWxsb2MoaW5kX2xlbiArIGxpbmVfbGVuKTsKKwkgICAgaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBwID0gbGluZTsKKwl9CisgICAgfQorCisgICAgLyogQXBwZW5kIHRoZSBvcmlnaW5hbCBsaW5lICovCisgICAgbWNoX21lbW1vdmUocCwgbWxfZ2V0X2N1cmxpbmUoKSwgKHNpemVfdClsaW5lX2xlbik7CisKKyAgICAvKiBSZXBsYWNlIHRoZSBsaW5lICovCisgICAgbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGxpbmUsIEZBTFNFKTsKKworICAgIC8qIFB1dCB0aGUgY3Vyc29yIGFmdGVyIHRoZSBpbmRlbnQuICovCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBpbmRfbGVuOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogUmV0dXJuIHRoZSBpbmRlbnQgb2YgdGhlIGN1cnJlbnQgbGluZSBhZnRlciBhIG51bWJlci4gIFJldHVybiAtMSBpZiBubworICogbnVtYmVyIHdhcyBmb3VuZC4gIFVzZWQgZm9yICduJyBpbiAnZm9ybWF0b3B0aW9ucyc6IG51bWJlcmVkIGxpc3QuCisgKi8KKyAgICBpbnQKK2dldF9udW1iZXJfaW5kZW50KGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY2hhcl91CSpwOworICAgIGNvbG5yX1QJY29sOworICAgIHBvc19UCXBvczsKKworICAgIGlmIChsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJcmV0dXJuIC0xOworICAgIGxpbmUgPSBtbF9nZXQobG51bSk7CisgICAgcCA9IHNraXB3aGl0ZShsaW5lKTsKKyAgICBpZiAoIVZJTV9JU0RJR0lUKCpwKSkKKwlyZXR1cm4gLTE7CisgICAgcCA9IHNraXBkaWdpdHMocCk7CisgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSI6LildfVx0ICIsICpwKSA9PSBOVUxMKQorCXJldHVybiAtMTsKKyAgICBwID0gc2tpcHdoaXRlKHAgKyAxKTsKKyAgICBpZiAoKnAgPT0gTlVMKQorCXJldHVybiAtMTsKKyAgICBwb3MubG51bSA9IGxudW07CisgICAgcG9zLmNvbCA9IChjb2xucl9UKShwIC0gbGluZSk7CisgICAgZ2V0dmNvbChjdXJ3aW4sICZwb3MsICZjb2wsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiAoaW50KWNvbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSB8fCBkZWZpbmVkKEZFQVRfU01BUlRJTkRFTlQpCisKK3N0YXRpYyBpbnQgY2luX2lzX2NpbndvcmQgX19BUkdTKChjaGFyX3UgKmxpbmUpKTsKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBzdHJpbmcgImxpbmUiIHN0YXJ0cyB3aXRoIGEgd29yZCBmcm9tICdjaW53b3JkcycuCisgKi8KKyAgICBzdGF0aWMgaW50CitjaW5faXNfY2lud29yZChsaW5lKQorICAgIGNoYXJfdQkqbGluZTsKK3sKKyAgICBjaGFyX3UJKmNpbnc7CisgICAgY2hhcl91CSpjaW53X2J1ZjsKKyAgICBpbnQJCWNpbndfbGVuOworICAgIGludAkJcmV0dmFsID0gRkFMU0U7CisgICAgaW50CQlsZW47CisKKyAgICBjaW53X2xlbiA9IChpbnQpU1RSTEVOKGN1cmJ1Zi0+Yl9wX2NpbncpICsgMTsKKyAgICBjaW53X2J1ZiA9IGFsbG9jKCh1bnNpZ25lZCljaW53X2xlbik7CisgICAgaWYgKGNpbndfYnVmICE9IE5VTEwpCisgICAgeworCWxpbmUgPSBza2lwd2hpdGUobGluZSk7CisJZm9yIChjaW53ID0gY3VyYnVmLT5iX3BfY2ludzsgKmNpbnc7ICkKKwl7CisJICAgIGxlbiA9IGNvcHlfb3B0aW9uX3BhcnQoJmNpbncsIGNpbndfYnVmLCBjaW53X2xlbiwgIiwiKTsKKwkgICAgaWYgKFNUUk5DTVAobGluZSwgY2lud19idWYsIGxlbikgPT0gMAorCQkgICAgJiYgKCF2aW1faXN3b3JkYyhsaW5lW2xlbl0pIHx8ICF2aW1faXN3b3JkYyhsaW5lW2xlbiAtIDFdKSkpCisJICAgIHsKKwkJcmV0dmFsID0gVFJVRTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJdmltX2ZyZWUoY2lud19idWYpOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qCisgKiBvcGVuX2xpbmU6IEFkZCBhIG5ldyBsaW5lIGJlbG93IG9yIGFib3ZlIHRoZSBjdXJyZW50IGxpbmUuCisgKgorICogRm9yIFZSRVBMQUNFIG1vZGUsIHdlIG9ubHkgYWRkIGEgbmV3IGxpbmUgd2hlbiB3ZSBnZXQgdG8gdGhlIGVuZCBvZiB0aGUKKyAqIGZpbGUsIG90aGVyd2lzZSB3ZSBqdXN0IHN0YXJ0IHJlcGxhY2luZyB0aGUgbmV4dCBsaW5lLgorICoKKyAqIENhbGxlciBtdXN0IHRha2UgY2FyZSBvZiB1bmRvLiAgU2luY2UgVlJFUExBQ0UgbWF5IGFmZmVjdCBhbnkgbnVtYmVyIG9mCisgKiBsaW5lcyBob3dldmVyLCBpdCBtYXkgY2FsbCB1X3NhdmVfY3Vyc29yKCkgYWdhaW4gd2hlbiBzdGFydGluZyB0byBjaGFuZ2UgYQorICogbmV3IGxpbmUuCisgKiAiZmxhZ3MiOiBPUEVOTElORV9ERUxTUEFDRVMJZGVsZXRlIHNwYWNlcyBhZnRlciBjdXJzb3IKKyAqCSAgICBPUEVOTElORV9ET19DT00JZm9ybWF0IGNvbW1lbnRzCisgKgkgICAgT1BFTkxJTkVfS0VFUFRSQUlMCWtlZXAgdHJhaWxpbmcgc3BhY2VzCisgKgkgICAgT1BFTkxJTkVfTUFSS0ZJWAlhZGp1c3QgbWFyayBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGxpbmUgYnJlYWsKKyAqCisgKiBSZXR1cm4gVFJVRSBmb3Igc3VjY2VzcywgRkFMU0UgZm9yIGZhaWx1cmUKKyAqLworICAgIGludAorb3Blbl9saW5lKGRpciwgZmxhZ3MsIG9sZF9pbmRlbnQpCisgICAgaW50CQlkaXI7CQkvKiBGT1JXQVJEIG9yIEJBQ0tXQVJEICovCisgICAgaW50CQlmbGFnczsKKyAgICBpbnQJCW9sZF9pbmRlbnQ7CS8qIGluZGVudCBmb3IgYWZ0ZXIgXl5EIGluIEluc2VydCBtb2RlICovCit7CisgICAgY2hhcl91CSpzYXZlZF9saW5lOwkJLyogY29weSBvZiB0aGUgb3JpZ2luYWwgbGluZSAqLworICAgIGNoYXJfdQkqbmV4dF9saW5lID0gTlVMTDsJLyogY29weSBvZiB0aGUgbmV4dCBsaW5lICovCisgICAgY2hhcl91CSpwX2V4dHJhID0gTlVMTDsJLyogd2hhdCBnb2VzIHRvIG5leHQgbGluZSAqLworICAgIGludAkJbGVzc19jb2xzID0gMDsJCS8qIGxlc3MgY29sdW1ucyBmb3IgbWFyayBpbiBuZXcgbGluZSAqLworICAgIGludAkJbGVzc19jb2xzX29mZiA9IDA7CS8qIGNvbHVtbnMgdG8gc2tpcCBmb3IgbWFyayBhZGp1c3QgKi8KKyAgICBwb3NfVAlvbGRfY3Vyc29yOwkJLyogb2xkIGN1cnNvciBwb3NpdGlvbiAqLworICAgIGludAkJbmV3Y29sID0gMDsJCS8qIG5ldyBjdXJzb3IgY29sdW1uICovCisgICAgaW50CQluZXdpbmRlbnQgPSAwOwkJLyogYXV0by1pbmRlbnQgb2YgdGhlIG5ldyBsaW5lICovCisgICAgaW50CQluOworICAgIGludAkJdHJ1bmNfbGluZSA9IEZBTFNFOwkvKiB0cnVuY2F0ZSBjdXJyZW50IGxpbmUgYWZ0ZXJ3YXJkcyAqLworICAgIGludAkJcmV0dmFsID0gRkFMU0U7CQkvKiByZXR1cm4gdmFsdWUsIGRlZmF1bHQgaXMgRkFJTCAqLworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICBpbnQJCWV4dHJhX2xlbiA9IDA7CQkvKiBsZW5ndGggb2YgcF9leHRyYSBzdHJpbmcgKi8KKyAgICBpbnQJCWxlYWRfbGVuOwkJLyogbGVuZ3RoIG9mIGNvbW1lbnQgbGVhZGVyICovCisgICAgY2hhcl91CSpsZWFkX2ZsYWdzOwkvKiBwb3NpdGlvbiBpbiAnY29tbWVudHMnIGZvciBjb21tZW50IGxlYWRlciAqLworICAgIGNoYXJfdQkqbGVhZGVyID0gTlVMTDsJCS8qIGNvcHkgb2YgY29tbWVudCBsZWFkZXIgKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqYWxsb2NhdGVkID0gTlVMTDsJLyogYWxsb2NhdGVkIG1lbW9yeSAqLworI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX1ZSRVBMQUNFKSB8fCBkZWZpbmVkKEZFQVRfTElTUCkgXAorCXx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKSB8fCBkZWZpbmVkKEZFQVRfQ09NTUVOVFMpCisgICAgY2hhcl91CSpwOworI2VuZGlmCisgICAgaW50CQlzYXZlZF9jaGFyID0gTlVMOwkvKiBpbml0IGZvciBHQ0MgKi8KKyNpZiBkZWZpbmVkKEZFQVRfU01BUlRJTkRFTlQpIHx8IGRlZmluZWQoRkVBVF9DT01NRU5UUykKKyAgICBwb3NfVAkqcG9zOworI2VuZGlmCisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorICAgIGludAkJZG9fc2kgPSAoIXBfcGFzdGUgJiYgY3VyYnVmLT5iX3Bfc2kKKyMgaWZkZWYgRkVBVF9DSU5ERU5UCisJCQkJCSYmICFjdXJidWYtPmJfcF9jaW4KKyMgZW5kaWYKKwkJCSk7CisgICAgaW50CQlub19zaSA9IEZBTFNFOwkJLyogcmVzZXQgZGlkX3NpIGFmdGVyd2FyZHMgKi8KKyAgICBpbnQJCWZpcnN0X2NoYXIgPSBOVUw7CS8qIGluaXQgZm9yIEdDQyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1ZSRVBMQUNFKSAmJiAoZGVmaW5lZChGRUFUX0xJU1ApIHx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKSkKKyAgICBpbnQJCXZyZXBsYWNlX21vZGU7CisjZW5kaWYKKyAgICBpbnQJCWRpZF9hcHBlbmQ7CQkvKiBhcHBlbmRlZCBhIG5ldyBsaW5lICovCisgICAgaW50CQlzYXZlZF9waSA9IGN1cmJ1Zi0+Yl9wX3BpOyAvKiBjb3B5IG9mIHByZXNlcnZlaW5kZW50IHNldHRpbmcgKi8KKworICAgIC8qCisgICAgICogbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbGluZSBzbyB3ZSBjYW4gbWVzcyB3aXRoIGl0CisgICAgICovCisgICAgc2F2ZWRfbGluZSA9IHZpbV9zdHJzYXZlKG1sX2dldF9jdXJsaW5lKCkpOworICAgIGlmIChzYXZlZF9saW5lID09IE5VTEwpCSAgICAvKiBvdXQgb2YgbWVtb3J5ISAqLworCXJldHVybiBGQUxTRTsKKworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyAgICBpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorICAgIHsKKwkvKgorCSAqIFdpdGggVlJFUExBQ0Ugd2UgbWFrZSBhIGNvcHkgb2YgdGhlIG5leHQgbGluZSwgd2hpY2ggd2Ugd2lsbCBiZQorCSAqIHN0YXJ0aW5nIHRvIHJlcGxhY2UuICBGaXJzdCBtYWtlIHRoZSBuZXcgbGluZSBlbXB0eSBhbmQgbGV0IHZpbSBwbGF5CisJICogd2l0aCB0aGUgaW5kZW50aW5nIGFuZCBjb21tZW50IGxlYWRlciB0byBpdHMgaGVhcnQncyBjb250ZW50LiAgVGhlbgorCSAqIHdlIGdyYWIgd2hhdCBpdCBlbmRlZCB1cCBwdXR0aW5nIG9uIHRoZSBuZXcgbGluZSwgcHV0IGJhY2sgdGhlCisJICogb3JpZ2luYWwgbGluZSwgYW5kIGNhbGwgaW5zX2NoYXIoKSB0byBwdXQgZWFjaCBuZXcgY2hhcmFjdGVyIG9udG8KKwkgKiB0aGUgbGluZSwgcmVwbGFjaW5nIHdoYXQgd2FzIHRoZXJlIGJlZm9yZSBhbmQgcHVzaGluZyB0aGUgcmlnaHQKKwkgKiBzdHVmZiBvbnRvIHRoZSByZXBsYWNlIHN0YWNrLiAgLS0gd2ViYi4KKwkgKi8KKwlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgb3JpZ19saW5lX2NvdW50KQorCSAgICBuZXh0X2xpbmUgPSB2aW1fc3Ryc2F2ZShtbF9nZXQoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSkpOworCWVsc2UKKwkgICAgbmV4dF9saW5lID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSIiKTsKKwlpZiAobmV4dF9saW5lID09IE5VTEwpCSAgICAvKiBvdXQgb2YgbWVtb3J5ISAqLworCSAgICBnb3RvIHRoZWVuZDsKKworCS8qCisJICogSW4gVlJFUExBQ0UgbW9kZSwgYSBOTCByZXBsYWNlcyB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIHN0YXJ0cworCSAqIHJlcGxhY2luZyB0aGUgbmV4dCBsaW5lLCBzbyBwdXNoIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBsZWZ0IG9uIHRoZQorCSAqIGxpbmUgb250byB0aGUgcmVwbGFjZSBzdGFjay4gIFdlJ2xsIHB1c2ggYW55IG90aGVyIGNoYXJhY3RlcnMgdGhhdAorCSAqIG1pZ2h0IGJlIHJlcGxhY2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lIChkdWUgdG8gYXV0b2luZGVudAorCSAqIGV0YykgYSBiaXQgbGF0ZXIuCisJICovCisJcmVwbGFjZV9wdXNoKE5VTCk7ICAvKiBDYWxsIHR3aWNlIGJlY2F1c2UgQlMgb3ZlciBOTCBleHBlY3RzIGl0ICovCisJcmVwbGFjZV9wdXNoKE5VTCk7CisJcCA9IHNhdmVkX2xpbmUgKyBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwl3aGlsZSAoKnAgIT0gTlVMKQorCSAgICByZXBsYWNlX3B1c2goKnArKyk7CisJc2F2ZWRfbGluZVtjdXJ3aW4tPndfY3Vyc29yLmNvbF0gPSBOVUw7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKFN0YXRlICYgSU5TRVJUKQorI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwkgICAgJiYgIShTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlwX2V4dHJhID0gc2F2ZWRfbGluZSArIGN1cndpbi0+d19jdXJzb3IuY29sOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwlpZiAoZG9fc2kpCQkvKiBuZWVkIGZpcnN0IGNoYXIgYWZ0ZXIgbmV3IGxpbmUgYnJlYWsgKi8KKwl7CisJICAgIHAgPSBza2lwd2hpdGUocF9leHRyYSk7CisJICAgIGZpcnN0X2NoYXIgPSAqcDsKKwl9CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJZXh0cmFfbGVuID0gKGludClTVFJMRU4ocF9leHRyYSk7CisjZW5kaWYKKwlzYXZlZF9jaGFyID0gKnBfZXh0cmE7CisJKnBfZXh0cmEgPSBOVUw7CisgICAgfQorCisgICAgdV9jbGVhcmxpbmUoKTsJCS8qIGNhbm5vdCBkbyAiVSIgY29tbWFuZCB3aGVuIGFkZGluZyBsaW5lcyAqLworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKyAgICBkaWRfc2kgPSBGQUxTRTsKKyNlbmRpZgorICAgIGFpX2NvbCA9IDA7CisKKyAgICAvKgorICAgICAqIElmIHdlIGp1c3QgZGlkIGFuIGF1dG8taW5kZW50LCB0aGVuIHdlIGRpZG4ndCB0eXBlIGFueXRoaW5nIG9uCisgICAgICogdGhlIHByaW9yIGxpbmUsIGFuZCBpdCBzaG91bGQgYmUgdHJ1bmNhdGVkLiAgRG8gdGhpcyBldmVuIGlmICdhaScgaXMgbm90CisgICAgICogc2V0IGJlY2F1c2UgYXV0b21hdGljYWxseSBpbnNlcnRpbmcgYSBjb21tZW50IGxlYWRlciBhbHNvIHNldHMgZGlkX2FpLgorICAgICAqLworICAgIGlmIChkaXIgPT0gRk9SV0FSRCAmJiBkaWRfYWkpCisJdHJ1bmNfbGluZSA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIElmICdhdXRvaW5kZW50JyBhbmQvb3IgJ3NtYXJ0aW5kZW50JyBpcyBzZXQsIHRyeSB0byBmaWd1cmUgb3V0IHdoYXQKKyAgICAgKiBpbmRlbnQgdG8gdXNlIGZvciB0aGUgbmV3IGxpbmUuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9wX2FpCisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorCQkJfHwgZG9fc2kKKyNlbmRpZgorCQkJCQkgICAgKQorICAgIHsKKwkvKgorCSAqIGNvdW50IHdoaXRlIHNwYWNlIG9uIGN1cnJlbnQgbGluZQorCSAqLworCW5ld2luZGVudCA9IGdldF9pbmRlbnRfc3RyKHNhdmVkX2xpbmUsIChpbnQpY3VyYnVmLT5iX3BfdHMpOworCWlmIChuZXdpbmRlbnQgPT0gMCkKKwkgICAgbmV3aW5kZW50ID0gb2xkX2luZGVudDsJLyogZm9yIF5eRCBjb21tYW5kIGluIGluc2VydCBtb2RlICovCisKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisJLyoKKwkgKiBEbyBzbWFydCBpbmRlbnRpbmcuCisJICogSW4gaW5zZXJ0L3JlcGxhY2UgbW9kZSAob25seSB3aGVuIGRpciA9PSBGT1JXQVJEKQorCSAqIHdlIG1heSBtb3ZlIHNvbWUgdGV4dCB0byB0aGUgbmV4dCBsaW5lLiBJZiBpdCBzdGFydHMgd2l0aCAneycKKwkgKiBkb24ndCBhZGQgYW4gaW5kZW50LiBGaXhlcyBpbnNlcnRpbmcgYSBOTCBiZWZvcmUgJ3snIGluIGxpbmUKKwkgKgkiaWYgKGNvbmRpdGlvbikgeyIKKwkgKi8KKwlpZiAoIXRydW5jX2xpbmUgJiYgZG9fc2kgJiYgKnNhdmVkX2xpbmUgIT0gTlVMCisJCQkJICAgICYmIChwX2V4dHJhID09IE5VTEwgfHwgZmlyc3RfY2hhciAhPSAneycpKQorCXsKKwkgICAgY2hhcl91ICAqcHRyOworCSAgICBjaGFyX3UgIGxhc3RfY2hhcjsKKworCSAgICBvbGRfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgcHRyID0gc2F2ZWRfbGluZTsKKyMgaWZkZWYgRkVBVF9DT01NRU5UUworCSAgICBpZiAoZmxhZ3MgJiBPUEVOTElORV9ET19DT00pCisJCWxlYWRfbGVuID0gZ2V0X2xlYWRlcl9sZW4ocHRyLCBOVUxMLCBGQUxTRSk7CisJICAgIGVsc2UKKwkJbGVhZF9sZW4gPSAwOworIyBlbmRpZgorCSAgICBpZiAoZGlyID09IEZPUldBUkQpCisJICAgIHsKKwkJLyoKKwkJICogU2tpcCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgdW5sZXNzIHRoZXkgYXJlCisJCSAqIHJlY29nbmlzZWQgYXMgY29tbWVudHMuCisJCSAqLworCQlpZiAoCisjIGlmZGVmIEZFQVRfQ09NTUVOVFMKKwkJCWxlYWRfbGVuID09IDAgJiYKKyMgZW5kaWYKKwkJCXB0clswXSA9PSAnIycpCisJCXsKKwkJICAgIHdoaWxlIChwdHJbMF0gPT0gJyMnICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisJCQlwdHIgPSBtbF9nZXQoLS1jdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCQkgICAgbmV3aW5kZW50ID0gZ2V0X2luZGVudCgpOworCQl9CisjIGlmZGVmIEZFQVRfQ09NTUVOVFMKKwkJaWYgKGZsYWdzICYgT1BFTkxJTkVfRE9fQ09NKQorCQkgICAgbGVhZF9sZW4gPSBnZXRfbGVhZGVyX2xlbihwdHIsIE5VTEwsIEZBTFNFKTsKKwkJZWxzZQorCQkgICAgbGVhZF9sZW4gPSAwOworCQlpZiAobGVhZF9sZW4gPiAwKQorCQl7CisJCSAgICAvKgorCQkgICAgICogVGhpcyBjYXNlIGdldHMgdGhlIGZvbGxvd2luZyByaWdodDoKKwkJICAgICAqCSAgICBcKgorCQkgICAgICoJICAgICAqIEEgY29tbWVudCAocmVhZCAnXCcgYXMgJy8nKS4KKwkJICAgICAqCSAgICAgKlwKKwkJICAgICAqICNkZWZpbmUgSU5fVEhFX1dBWQorCQkgICAgICoJICAgIFRoaXMgc2hvdWxkIGxpbmUgdXAgaGVyZTsKKwkJICAgICAqLworCQkgICAgcCA9IHNraXB3aGl0ZShwdHIpOworCQkgICAgaWYgKHBbMF0gPT0gJy8nICYmIHBbMV0gPT0gJyonKQorCQkJcCsrOworCQkgICAgaWYgKHBbMF0gPT0gJyonKQorCQkgICAgeworCQkJZm9yIChwKys7ICpwOyBwKyspCisJCQl7CisJCQkgICAgaWYgKHBbMF0gPT0gJy8nICYmIHBbLTFdID09ICcqJykKKwkJCSAgICB7CisJCQkJLyoKKwkJCQkgKiBFbmQgb2YgQyBjb21tZW50LCBpbmRlbnQgc2hvdWxkIGxpbmUgdXAKKwkJCQkgKiB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IG9mCisJCQkJICogdGhlIGNvbW1lbnQKKwkJCQkgKi8KKwkJCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IChjb2xucl9UKShwIC0gcHRyKTsKKwkJCQlpZiAoKHBvcyA9IGZpbmRtYXRjaChOVUxMLCBOVUwpKSAhPSBOVUxMKQorCQkJCXsKKwkJCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gcG9zLT5sbnVtOworCQkJCSAgICBuZXdpbmRlbnQgPSBnZXRfaW5kZW50KCk7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJfQorCQllbHNlCS8qIE5vdCBhIGNvbW1lbnQgbGluZSAqLworIyBlbmRpZgorCQl7CisJCSAgICAvKiBGaW5kIGxhc3Qgbm9uLWJsYW5rIGluIGxpbmUgKi8KKwkJICAgIHAgPSBwdHIgKyBTVFJMRU4ocHRyKSAtIDE7CisJCSAgICB3aGlsZSAocCA+IHB0ciAmJiB2aW1faXN3aGl0ZSgqcCkpCisJCQktLXA7CisJCSAgICBsYXN0X2NoYXIgPSAqcDsKKworCQkgICAgLyoKKwkJICAgICAqIGZpbmQgdGhlIGNoYXJhY3RlciBqdXN0IGJlZm9yZSB0aGUgJ3snIG9yICc7JworCQkgICAgICovCisJCSAgICBpZiAobGFzdF9jaGFyID09ICd7JyB8fCBsYXN0X2NoYXIgPT0gJzsnKQorCQkgICAgeworCQkJaWYgKHAgPiBwdHIpCisJCQkgICAgLS1wOworCQkJd2hpbGUgKHAgPiBwdHIgJiYgdmltX2lzd2hpdGUoKnApKQorCQkJICAgIC0tcDsKKwkJICAgIH0KKwkJICAgIC8qCisJCSAgICAgKiBUcnkgdG8gY2F0Y2ggbGluZXMgdGhhdCBhcmUgc3BsaXQgb3ZlciBtdWx0aXBsZQorCQkgICAgICogbGluZXMuICBlZzoKKwkJICAgICAqCSAgICBpZiAoY29uZGl0aW9uICYmCisJCSAgICAgKgkJCWNvbmRpdGlvbikgeworCQkgICAgICoJCVNob3VsZCBsaW5lIHVwIGhlcmUhCisJCSAgICAgKgkgICAgfQorCQkgICAgICovCisJCSAgICBpZiAoKnAgPT0gJyknKQorCQkgICAgeworCQkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAoY29sbnJfVCkocCAtIHB0cik7CisJCQlpZiAoKHBvcyA9IGZpbmRtYXRjaChOVUxMLCAnKCcpKSAhPSBOVUxMKQorCQkJeworCQkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHBvcy0+bG51bTsKKwkJCSAgICBuZXdpbmRlbnQgPSBnZXRfaW5kZW50KCk7CisJCQkgICAgcHRyID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIC8qCisJCSAgICAgKiBJZiBsYXN0IGNoYXJhY3RlciBpcyAneycgZG8gaW5kZW50LCB3aXRob3V0CisJCSAgICAgKiBjaGVja2luZyBmb3IgImlmIiBhbmQgdGhlIGxpa2UuCisJCSAgICAgKi8KKwkJICAgIGlmIChsYXN0X2NoYXIgPT0gJ3snKQorCQkgICAgeworCQkJZGlkX3NpID0gVFJVRTsJLyogZG8gaW5kZW50ICovCisJCQlub19zaSA9IFRSVUU7CS8qIGRvbid0IGRlbGV0ZSBpdCB3aGVuICd7JyB0eXBlZCAqLworCQkgICAgfQorCQkgICAgLyoKKwkJICAgICAqIExvb2sgZm9yICJpZiIgYW5kIHRoZSBsaWtlLCB1c2UgJ2NpbndvcmRzJy4KKwkJICAgICAqIERvbid0IGRvIHRoaXMgaWYgdGhlIHByZXZpb3VzIGxpbmUgZW5kZWQgaW4gJzsnIG9yCisJCSAgICAgKiAnfScuCisJCSAgICAgKi8KKwkJICAgIGVsc2UgaWYgKGxhc3RfY2hhciAhPSAnOycgJiYgbGFzdF9jaGFyICE9ICd9JworCQkJCQkJICAgICAgICYmIGNpbl9pc19jaW53b3JkKHB0cikpCisJCQlkaWRfc2kgPSBUUlVFOworCQl9CisJICAgIH0KKwkgICAgZWxzZSAvKiBkaXIgPT0gQkFDS1dBUkQgKi8KKwkgICAgeworCQkvKgorCQkgKiBTa2lwIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLCB1bmxlc3MgdGhleSBhcmUKKwkJICogcmVjb2duaXNlZCBhcyBjb21tZW50cy4KKwkJICovCisJCWlmICgKKyMgaWZkZWYgRkVBVF9DT01NRU5UUworCQkJbGVhZF9sZW4gPT0gMCAmJgorIyBlbmRpZgorCQkJcHRyWzBdID09ICcjJykKKwkJeworCQkgICAgaW50IHdhc19iYWNrc2xhc2hlZCA9IEZBTFNFOworCisJCSAgICB3aGlsZSAoKHB0clswXSA9PSAnIycgfHwgd2FzX2JhY2tzbGFzaGVkKSAmJgorCQkJIGN1cndpbi0+d19jdXJzb3IubG51bSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkgICAgeworCQkJaWYgKCpwdHIgJiYgcHRyW1NUUkxFTihwdHIpIC0gMV0gPT0gJ1xcJykKKwkJCSAgICB3YXNfYmFja3NsYXNoZWQgPSBUUlVFOworCQkJZWxzZQorCQkJICAgIHdhc19iYWNrc2xhc2hlZCA9IEZBTFNFOworCQkJcHRyID0gbWxfZ2V0KCsrY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkJICAgIH0KKwkJICAgIGlmICh3YXNfYmFja3NsYXNoZWQpCisJCQluZXdpbmRlbnQgPSAwOwkgICAgLyogR290IHRvIGVuZCBvZiBmaWxlICovCisJCSAgICBlbHNlCisJCQluZXdpbmRlbnQgPSBnZXRfaW5kZW50KCk7CisJCX0KKwkJcCA9IHNraXB3aGl0ZShwdHIpOworCQlpZiAoKnAgPT0gJ30nKQkgICAgLyogaWYgbGluZSBzdGFydHMgd2l0aCAnfSc6IGRvIGluZGVudCAqLworCQkgICAgZGlkX3NpID0gVFJVRTsKKwkJZWxzZQkJICAgIC8qIGNhbiBkZWxldGUgaW5kZW50IHdoZW4gJ3snIHR5cGVkICovCisJCSAgICBjYW5fc2lfYmFjayA9IFRSVUU7CisJICAgIH0KKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IG9sZF9jdXJzb3I7CisJfQorCWlmIChkb19zaSkKKwkgICAgY2FuX3NpID0gVFJVRTsKKyNlbmRpZiAvKiBGRUFUX1NNQVJUSU5ERU5UICovCisKKwlkaWRfYWkgPSBUUlVFOworICAgIH0KKworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICAvKgorICAgICAqIEZpbmQgb3V0IGlmIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzIHdpdGggYSBjb21tZW50IGxlYWRlci4KKyAgICAgKiBUaGlzIG1heSB0aGVuIGJlIGluc2VydGVkIGluIGZyb250IG9mIHRoZSBuZXcgbGluZS4KKyAgICAgKi8KKyAgICBlbmRfY29tbWVudF9wZW5kaW5nID0gTlVMOworICAgIGlmIChmbGFncyAmIE9QRU5MSU5FX0RPX0NPTSkKKwlsZWFkX2xlbiA9IGdldF9sZWFkZXJfbGVuKHNhdmVkX2xpbmUsICZsZWFkX2ZsYWdzLCBkaXIgPT0gQkFDS1dBUkQpOworICAgIGVsc2UKKwlsZWFkX2xlbiA9IDA7CisgICAgaWYgKGxlYWRfbGVuID4gMCkKKyAgICB7CisJY2hhcl91CSpsZWFkX3JlcGwgPSBOVUxMOwkgICAgLyogcmVwbGFjZXMgY29tbWVudCBsZWFkZXIgKi8KKwlpbnQJbGVhZF9yZXBsX2xlbiA9IDA7CSAgICAvKiBsZW5ndGggb2YgKmxlYWRfcmVwbCAqLworCWNoYXJfdQlsZWFkX21pZGRsZVtDT01fTUFYX0xFTl07ICAgLyogbWlkZGxlLWNvbW1lbnQgc3RyaW5nICovCisJY2hhcl91CWxlYWRfZW5kW0NPTV9NQVhfTEVOXTsJICAgIC8qIGVuZC1jb21tZW50IHN0cmluZyAqLworCWNoYXJfdQkqY29tbWVudF9lbmQgPSBOVUxMOwkgICAgLyogd2hlcmUgbGVhZF9lbmQgaGFzIGJlZW4gZm91bmQgKi8KKwlpbnQJZXh0cmFfc3BhY2UgPSBGQUxTRTsJICAgIC8qIGFwcGVuZCBleHRyYSBzcGFjZSAqLworCWludAljdXJyZW50X2ZsYWc7CisJaW50CXJlcXVpcmVfYmxhbmsgPSBGQUxTRTsJICAgIC8qIHJlcXVpcmVzIGJsYW5rIGFmdGVyIG1pZGRsZSAqLworCWNoYXJfdQkqcDI7CisKKwkvKgorCSAqIElmIHRoZSBjb21tZW50IGxlYWRlciBoYXMgdGhlIHN0YXJ0LCBtaWRkbGUgb3IgZW5kIGZsYWcsIGl0IG1heSBub3QKKwkgKiBiZSB1c2VkIG9yIG1heSBiZSByZXBsYWNlZCB3aXRoIHRoZSBtaWRkbGUgbGVhZGVyLgorCSAqLworCWZvciAocCA9IGxlYWRfZmxhZ3M7ICpwICYmICpwICE9ICc6JzsgKytwKQorCXsKKwkgICAgaWYgKCpwID09IENPTV9CTEFOSykKKwkgICAgeworCQlyZXF1aXJlX2JsYW5rID0gVFJVRTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKCpwID09IENPTV9TVEFSVCB8fCAqcCA9PSBDT01fTUlERExFKQorCSAgICB7CisJCWN1cnJlbnRfZmxhZyA9ICpwOworCQlpZiAoKnAgPT0gQ09NX1NUQVJUKQorCQl7CisJCSAgICAvKgorCQkgICAgICogRG9pbmcgIk8iIG9uIGEgc3RhcnQgb2YgY29tbWVudCBkb2VzIG5vdCBpbnNlcnQgbGVhZGVyLgorCQkgICAgICovCisJCSAgICBpZiAoZGlyID09IEJBQ0tXQVJEKQorCQkgICAgeworCQkJbGVhZF9sZW4gPSAwOworCQkJYnJlYWs7CisJCSAgICB9CisKKwkJICAgIC8qIGZpbmQgc3RhcnQgb2YgbWlkZGxlIHBhcnQgKi8KKwkJICAgICh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJnAsIGxlYWRfbWlkZGxlLCBDT01fTUFYX0xFTiwgIiwiKTsKKwkJICAgIHJlcXVpcmVfYmxhbmsgPSBGQUxTRTsKKwkJfQorCisJCS8qCisJCSAqIElzb2xhdGUgdGhlIHN0cmluZ3Mgb2YgdGhlIG1pZGRsZSBhbmQgZW5kIGxlYWRlci4KKwkJICovCisJCXdoaWxlICgqcCAmJiBwWy0xXSAhPSAnOicpCS8qIGZpbmQgZW5kIG9mIG1pZGRsZSBmbGFncyAqLworCQl7CisJCSAgICBpZiAoKnAgPT0gQ09NX0JMQU5LKQorCQkJcmVxdWlyZV9ibGFuayA9IFRSVUU7CisJCSAgICArK3A7CisJCX0KKwkJKHZvaWQpY29weV9vcHRpb25fcGFydCgmcCwgbGVhZF9taWRkbGUsIENPTV9NQVhfTEVOLCAiLCIpOworCisJCXdoaWxlICgqcCAmJiBwWy0xXSAhPSAnOicpCS8qIGZpbmQgZW5kIG9mIGVuZCBmbGFncyAqLworCQl7CisJCSAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGFsbG93IGF1dG9tYXRpYyBlbmRpbmcgb2YgY29tbWVudHMgKi8KKwkJICAgIGlmICgqcCA9PSBDT01fQVVUT19FTkQpCisJCQllbmRfY29tbWVudF9wZW5kaW5nID0gLTE7IC8qIG1lYW5zIHdlIHdhbnQgdG8gc2V0IGl0ICovCisJCSAgICArK3A7CisJCX0KKwkJbiA9IGNvcHlfb3B0aW9uX3BhcnQoJnAsIGxlYWRfZW5kLCBDT01fTUFYX0xFTiwgIiwiKTsKKworCQlpZiAoZW5kX2NvbW1lbnRfcGVuZGluZyA9PSAtMSkJLyogd2UgY2FuIHNldCBpdCBub3cgKi8KKwkJICAgIGVuZF9jb21tZW50X3BlbmRpbmcgPSBsZWFkX2VuZFtuIC0gMV07CisKKwkJLyoKKwkJICogSWYgdGhlIGVuZCBvZiB0aGUgY29tbWVudCBpcyBpbiB0aGUgc2FtZSBsaW5lLCBkb24ndCB1c2UKKwkJICogdGhlIGNvbW1lbnQgbGVhZGVyLgorCQkgKi8KKwkJaWYgKGRpciA9PSBGT1JXQVJEKQorCQl7CisJCSAgICBmb3IgKHAgPSBzYXZlZF9saW5lICsgbGVhZF9sZW47ICpwOyArK3ApCisJCQlpZiAoU1RSTkNNUChwLCBsZWFkX2VuZCwgbikgPT0gMCkKKwkJCXsKKwkJCSAgICBjb21tZW50X2VuZCA9IHA7CisJCQkgICAgbGVhZF9sZW4gPSAwOworCQkJICAgIGJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogRG9pbmcgIm8iIG9uIGEgc3RhcnQgb2YgY29tbWVudCBpbnNlcnRzIHRoZSBtaWRkbGUgbGVhZGVyLgorCQkgKi8KKwkJaWYgKGxlYWRfbGVuID4gMCkKKwkJeworCQkgICAgaWYgKGN1cnJlbnRfZmxhZyA9PSBDT01fU1RBUlQpCisJCSAgICB7CisJCQlsZWFkX3JlcGwgPSBsZWFkX21pZGRsZTsKKwkJCWxlYWRfcmVwbF9sZW4gPSAoaW50KVNUUkxFTihsZWFkX21pZGRsZSk7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBJZiB3ZSBoYXZlIGhpdCBSRVRVUk4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHN0YXJ0CisJCSAgICAgKiBjb21tZW50IGxlYWRlciwgdGhlbiBwdXQgYSBzcGFjZSBhZnRlciB0aGUgbWlkZGxlCisJCSAgICAgKiBjb21tZW50IGxlYWRlciBvbiB0aGUgbmV4dCBsaW5lLgorCQkgICAgICovCisJCSAgICBpZiAoIXZpbV9pc3doaXRlKHNhdmVkX2xpbmVbbGVhZF9sZW4gLSAxXSkKKwkJCSAgICAmJiAoKHBfZXh0cmEgIT0gTlVMTAorCQkJCSAgICAmJiAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sID09IGxlYWRfbGVuKQorCQkJCXx8IChwX2V4dHJhID09IE5VTEwKKwkJCQkgICAgJiYgc2F2ZWRfbGluZVtsZWFkX2xlbl0gPT0gTlVMKQorCQkJCXx8IHJlcXVpcmVfYmxhbmspKQorCQkJZXh0cmFfc3BhY2UgPSBUUlVFOworCQl9CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICgqcCA9PSBDT01fRU5EKQorCSAgICB7CisJCS8qCisJCSAqIERvaW5nICJvIiBvbiB0aGUgZW5kIG9mIGEgY29tbWVudCBkb2VzIG5vdCBpbnNlcnQgbGVhZGVyLgorCQkgKiBSZW1lbWJlciB3aGVyZSB0aGUgZW5kIGlzLCBtaWdodCB3YW50IHRvIHVzZSBpdCB0byBmaW5kIHRoZQorCQkgKiBzdGFydCAoZm9yIEMtY29tbWVudHMpLgorCQkgKi8KKwkJaWYgKGRpciA9PSBGT1JXQVJEKQorCQl7CisJCSAgICBjb21tZW50X2VuZCA9IHNraXB3aGl0ZShzYXZlZF9saW5lKTsKKwkJICAgIGxlYWRfbGVuID0gMDsKKwkJICAgIGJyZWFrOworCQl9CisKKwkJLyoKKwkJICogRG9pbmcgIk8iIG9uIHRoZSBlbmQgb2YgYSBjb21tZW50IGluc2VydHMgdGhlIG1pZGRsZSBsZWFkZXIuCisJCSAqIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIG1pZGRsZSBsZWFkZXIsIHNlYXJjaGluZyBiYWNrd2FyZHMuCisJCSAqLworCQl3aGlsZSAocCA+IGN1cmJ1Zi0+Yl9wX2NvbSAmJiAqcCAhPSAnLCcpCisJCSAgICAtLXA7CisJCWZvciAobGVhZF9yZXBsID0gcDsgbGVhZF9yZXBsID4gY3VyYnVmLT5iX3BfY29tCisJCQkJCSAmJiBsZWFkX3JlcGxbLTFdICE9ICc6JzsgLS1sZWFkX3JlcGwpCisJCSAgICA7CisJCWxlYWRfcmVwbF9sZW4gPSAoaW50KShwIC0gbGVhZF9yZXBsKTsKKworCQkvKiBXZSBjYW4gcHJvYmFibHkgYWx3YXlzIGFkZCBhbiBleHRyYSBzcGFjZSB3aGVuIGRvaW5nICJPIiBvbgorCQkgKiB0aGUgY29tbWVudC1lbmQgKi8KKwkJZXh0cmFfc3BhY2UgPSBUUlVFOworCisJCS8qIENoZWNrIHdoZXRoZXIgd2UgYWxsb3cgYXV0b21hdGljIGVuZGluZyBvZiBjb21tZW50cyAqLworCQlmb3IgKHAyID0gcDsgKnAyICYmICpwMiAhPSAnOic7IHAyKyspCisJCXsKKwkJICAgIGlmICgqcDIgPT0gQ09NX0FVVE9fRU5EKQorCQkJZW5kX2NvbW1lbnRfcGVuZGluZyA9IC0xOyAvKiBtZWFucyB3ZSB3YW50IHRvIHNldCBpdCAqLworCQl9CisJCWlmIChlbmRfY29tbWVudF9wZW5kaW5nID09IC0xKQorCQl7CisJCSAgICAvKiBGaW5kIGxhc3QgY2hhcmFjdGVyIGluIGVuZC1jb21tZW50IHN0cmluZyAqLworCQkgICAgd2hpbGUgKCpwMiAmJiAqcDIgIT0gJywnKQorCQkJcDIrKzsKKwkJICAgIGVuZF9jb21tZW50X3BlbmRpbmcgPSBwMlstMV07CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCpwID09IENPTV9GSVJTVCkKKwkgICAgeworCQkvKgorCQkgKiBDb21tZW50IGxlYWRlciBmb3IgZmlyc3QgbGluZSBvbmx5OglEb24ndCByZXBlYXQgbGVhZGVyCisJCSAqIHdoZW4gdXNpbmcgIk8iLCBibGFuayBvdXQgbGVhZGVyIHdoZW4gdXNpbmcgIm8iLgorCQkgKi8KKwkJaWYgKGRpciA9PSBCQUNLV0FSRCkKKwkJICAgIGxlYWRfbGVuID0gMDsKKwkJZWxzZQorCQl7CisJCSAgICBsZWFkX3JlcGwgPSAoY2hhcl91ICopIiI7CisJCSAgICBsZWFkX3JlcGxfbGVuID0gMDsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAobGVhZF9sZW4pCisJeworCSAgICAvKiBhbGxvY2F0ZSBidWZmZXIgKG1heSBjb25jYXRlbmF0ZSBwX2V4dGEgbGF0ZXIpICovCisJICAgIGxlYWRlciA9IGFsbG9jKGxlYWRfbGVuICsgbGVhZF9yZXBsX2xlbiArIGV4dHJhX3NwYWNlICsKKwkJCQkJCQkgICAgICBleHRyYV9sZW4gKyAxKTsKKwkgICAgYWxsb2NhdGVkID0gbGVhZGVyOwkJICAgIC8qIHJlbWVtYmVyIHRvIGZyZWUgaXQgbGF0ZXIgKi8KKworCSAgICBpZiAobGVhZGVyID09IE5VTEwpCisJCWxlYWRfbGVuID0gMDsKKwkgICAgZWxzZQorCSAgICB7CisJCVNUUk5DUFkobGVhZGVyLCBzYXZlZF9saW5lLCBsZWFkX2xlbik7CisJCWxlYWRlcltsZWFkX2xlbl0gPSBOVUw7CisKKwkJLyoKKwkJICogUmVwbGFjZSBsZWFkZXIgd2l0aCBsZWFkX3JlcGwsIHJpZ2h0IG9yIGxlZnQgYWRqdXN0ZWQKKwkJICovCisJCWlmIChsZWFkX3JlcGwgIT0gTlVMTCkKKwkJeworCQkgICAgaW50CQljID0gMDsKKwkJICAgIGludAkJb2ZmID0gMDsKKworCQkgICAgZm9yIChwID0gbGVhZF9mbGFnczsgKnAgJiYgKnAgIT0gJzonOyArK3ApCisJCSAgICB7CisJCQlpZiAoKnAgPT0gQ09NX1JJR0hUIHx8ICpwID09IENPTV9MRUZUKQorCQkJICAgIGMgPSAqcDsKKwkJCWVsc2UgaWYgKFZJTV9JU0RJR0lUKCpwKSB8fCAqcCA9PSAnLScpCisJCQkgICAgb2ZmID0gZ2V0ZGlnaXRzKCZwKTsKKwkJICAgIH0KKwkJICAgIGlmIChjID09IENPTV9SSUdIVCkgICAgLyogcmlnaHQgYWRqdXN0ZWQgbGVhZGVyICovCisJCSAgICB7CisJCQkvKiBmaW5kIGxhc3Qgbm9uLXdoaXRlIGluIHRoZSBsZWFkZXIgdG8gbGluZSB1cCB3aXRoICovCisJCQlmb3IgKHAgPSBsZWFkZXIgKyBsZWFkX2xlbiAtIDE7IHAgPiBsZWFkZXIKKwkJCQkJCSAgICAgICYmIHZpbV9pc3doaXRlKCpwKTsgLS1wKQorCQkJICAgIDsKKworCQkJKytwOworCQkJaWYgKHAgPCBsZWFkZXIgKyBsZWFkX3JlcGxfbGVuKQorCQkJICAgIHAgPSBsZWFkZXI7CisJCQllbHNlCisJCQkgICAgcCAtPSBsZWFkX3JlcGxfbGVuOworCQkJbWNoX21lbW1vdmUocCwgbGVhZF9yZXBsLCAoc2l6ZV90KWxlYWRfcmVwbF9sZW4pOworCQkJaWYgKHAgKyBsZWFkX3JlcGxfbGVuID4gbGVhZGVyICsgbGVhZF9sZW4pCisJCQkgICAgcFtsZWFkX3JlcGxfbGVuXSA9IE5VTDsKKworCQkJLyogYmxhbmstb3V0IGFueSBvdGhlciBjaGFycyBmcm9tIHRoZSBvbGQgbGVhZGVyLiAqLworCQkJd2hpbGUgKC0tcCA+PSBsZWFkZXIpCisJCQkgICAgaWYgKCF2aW1faXN3aGl0ZSgqcCkpCisJCQkJKnAgPSAnICc7CisJCSAgICB9CisJCSAgICBlbHNlCQkgICAgLyogbGVmdCBhZGp1c3RlZCBsZWFkZXIgKi8KKwkJICAgIHsKKwkJCXAgPSBza2lwd2hpdGUobGVhZGVyKTsKKwkJCW1jaF9tZW1tb3ZlKHAsIGxlYWRfcmVwbCwgKHNpemVfdClsZWFkX3JlcGxfbGVuKTsKKworCQkJLyogUmVwbGFjZSBhbnkgcmVtYWluaW5nIG5vbi13aGl0ZSBjaGFycyBpbiB0aGUgb2xkCisJCQkgKiBsZWFkZXIgYnkgc3BhY2VzLiAgS2VlcCBUYWJzLCB0aGUgaW5kZW50IG11c3QKKwkJCSAqIHJlbWFpbiB0aGUgc2FtZS4gKi8KKwkJCWZvciAocCArPSBsZWFkX3JlcGxfbGVuOyBwIDwgbGVhZGVyICsgbGVhZF9sZW47ICsrcCkKKwkJCSAgICBpZiAoIXZpbV9pc3doaXRlKCpwKSkKKwkJCSAgICB7CisJCQkJLyogRG9uJ3QgcHV0IGEgc3BhY2UgYmVmb3JlIGEgVEFCLiAqLworCQkJCWlmIChwICsgMSA8IGxlYWRlciArIGxlYWRfbGVuICYmIHBbMV0gPT0gVEFCKQorCQkJCXsKKwkJCQkgICAgLS1sZWFkX2xlbjsKKwkJCQkgICAgbWNoX21lbW1vdmUocCwgcCArIDEsCisJCQkJCQkgICAgIChsZWFkZXIgKyBsZWFkX2xlbikgLSBwKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCSAgICAqcCA9ICcgJzsKKwkJCSAgICB9CisJCQkqcCA9IE5VTDsKKwkJICAgIH0KKworCQkgICAgLyogUmVjb21wdXRlIHRoZSBpbmRlbnQsIGl0IG1heSBoYXZlIGNoYW5nZWQuICovCisJCSAgICBpZiAoY3VyYnVmLT5iX3BfYWkKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisJCQkJCXx8IGRvX3NpCisjZW5kaWYKKwkJCQkJCQkgICApCisJCQluZXdpbmRlbnQgPSBnZXRfaW5kZW50X3N0cihsZWFkZXIsIChpbnQpY3VyYnVmLT5iX3BfdHMpOworCisJCSAgICAvKiBBZGQgdGhlIGluZGVudCBvZmZzZXQgKi8KKwkJICAgIGlmIChuZXdpbmRlbnQgKyBvZmYgPCAwKQorCQkgICAgeworCQkJb2ZmID0gLW5ld2luZGVudDsKKwkJCW5ld2luZGVudCA9IDA7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQluZXdpbmRlbnQgKz0gb2ZmOworCisJCSAgICAvKiBDb3JyZWN0IHRyYWlsaW5nIHNwYWNlcyBmb3IgdGhlIHNoaWZ0LCBzbyB0aGF0CisJCSAgICAgKiBhbGlnbm1lbnQgcmVtYWlucyBlcXVhbC4gKi8KKwkJICAgIHdoaWxlIChvZmYgPiAwICYmIGxlYWRfbGVuID4gMAorCQkJCQkgICAgICAgJiYgbGVhZGVyW2xlYWRfbGVuIC0gMV0gPT0gJyAnKQorCQkgICAgeworCQkJLyogRG9uJ3QgZG8gaXQgd2hlbiB0aGVyZSBpcyBhIHRhYiBiZWZvcmUgdGhlIHNwYWNlICovCisJCQlpZiAodmltX3N0cmNocihza2lwd2hpdGUobGVhZGVyKSwgJ1x0JykgIT0gTlVMTCkKKwkJCSAgICBicmVhazsKKwkJCS0tbGVhZF9sZW47CisJCQktLW9mZjsKKwkJICAgIH0KKworCQkgICAgLyogSWYgdGhlIGxlYWRlciBlbmRzIGluIHdoaXRlIHNwYWNlLCBkb24ndCBhZGQgYW4KKwkJICAgICAqIGV4dHJhIHNwYWNlICovCisJCSAgICBpZiAobGVhZF9sZW4gPiAwICYmIHZpbV9pc3doaXRlKGxlYWRlcltsZWFkX2xlbiAtIDFdKSkKKwkJCWV4dHJhX3NwYWNlID0gRkFMU0U7CisJCSAgICBsZWFkZXJbbGVhZF9sZW5dID0gTlVMOworCQl9CisKKwkJaWYgKGV4dHJhX3NwYWNlKQorCQl7CisJCSAgICBsZWFkZXJbbGVhZF9sZW4rK10gPSAnICc7CisJCSAgICBsZWFkZXJbbGVhZF9sZW5dID0gTlVMOworCQl9CisKKwkJbmV3Y29sID0gbGVhZF9sZW47CisKKwkJLyoKKwkJICogaWYgYSBuZXcgaW5kZW50IHdpbGwgYmUgc2V0IGJlbG93LCByZW1vdmUgdGhlIGluZGVudCB0aGF0CisJCSAqIGlzIGluIHRoZSBjb21tZW50IGxlYWRlcgorCQkgKi8KKwkJaWYgKG5ld2luZGVudAorI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkJCQl8fCBkaWRfc2kKKyNlbmRpZgorCQkJCQkgICApCisJCXsKKwkJICAgIHdoaWxlIChsZWFkX2xlbiAmJiB2aW1faXN3aGl0ZSgqbGVhZGVyKSkKKwkJICAgIHsKKwkJCS0tbGVhZF9sZW47CisJCQktLW5ld2NvbDsKKwkJCSsrbGVhZGVyOworCQkgICAgfQorCQl9CisKKwkgICAgfQorI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkgICAgZGlkX3NpID0gY2FuX3NpID0gRkFMU0U7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoY29tbWVudF9lbmQgIT0gTlVMTCkKKwl7CisJICAgIC8qCisJICAgICAqIFdlIGhhdmUgZmluaXNoZWQgYSBjb21tZW50LCBzbyB3ZSBkb24ndCB1c2UgdGhlIGxlYWRlci4KKwkgICAgICogSWYgdGhpcyB3YXMgYSBDLWNvbW1lbnQgYW5kICdhaScgb3IgJ3NpJyBpcyBzZXQgZG8gYSBub3JtYWwKKwkgICAgICogaW5kZW50IHRvIGFsaWduIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyB0aGUgc3RhcnQgb2YgdGhlCisJICAgICAqIGNvbW1lbnQuCisJICAgICAqLworCSAgICBpZiAoY29tbWVudF9lbmRbMF0gPT0gJyonICYmIGNvbW1lbnRfZW5kWzFdID09ICcvJyAmJgorCQkJKGN1cmJ1Zi0+Yl9wX2FpCisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorCQkJCQl8fCBkb19zaQorI2VuZGlmCisJCQkJCQkJICAgKSkKKwkgICAgeworCQlvbGRfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAoY29sbnJfVCkoY29tbWVudF9lbmQgLSBzYXZlZF9saW5lKTsKKwkJaWYgKChwb3MgPSBmaW5kbWF0Y2goTlVMTCwgTlVMKSkgIT0gTlVMTCkKKwkJeworCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gcG9zLT5sbnVtOworCQkgICAgbmV3aW5kZW50ID0gZ2V0X2luZGVudCgpOworCQl9CisJCWN1cndpbi0+d19jdXJzb3IgPSBvbGRfY3Vyc29yOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogKFN0YXRlID09IElOU0VSVCB8fCBTdGF0ZSA9PSBSRVBMQUNFKSwgb25seSB3aGVuIGRpciA9PSBGT1JXQVJEICovCisgICAgaWYgKHBfZXh0cmEgIT0gTlVMTCkKKyAgICB7CisJKnBfZXh0cmEgPSBzYXZlZF9jaGFyOwkJLyogcmVzdG9yZSBjaGFyIHRoYXQgTlVMIHJlcGxhY2VkICovCisKKwkvKgorCSAqIFdoZW4gJ2FpJyBzZXQgb3IgImZsYWdzIiBoYXMgT1BFTkxJTkVfREVMU1BBQ0VTLCBza2lwIHRvIHRoZSBmaXJzdAorCSAqIG5vbi1ibGFuay4KKwkgKgorCSAqIFdoZW4gaW4gUkVQTEFDRSBtb2RlLCBwdXQgdGhlIGRlbGV0ZWQgYmxhbmtzIG9uIHRoZSByZXBsYWNlIHN0YWNrLAorCSAqIHByZWNlZGVkIGJ5IGEgTlVMLCBzbyB0aGV5IGNhbiBiZSBwdXQgYmFjayB3aGVuIGEgQlMgaXMgZW50ZXJlZC4KKwkgKi8KKwlpZiAoUkVQTEFDRV9OT1JNQUwoU3RhdGUpKQorCSAgICByZXBsYWNlX3B1c2goTlVMKTsJICAgIC8qIGVuZCBvZiBleHRyYSBibGFua3MgKi8KKwlpZiAoY3VyYnVmLT5iX3BfYWkgfHwgKGZsYWdzICYgT1BFTkxJTkVfREVMU1BBQ0VTKSkKKwl7CisJICAgIHdoaWxlICgoKnBfZXh0cmEgPT0gJyAnIHx8ICpwX2V4dHJhID09ICdcdCcpCisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgJiYgKCFlbmNfdXRmOAorCQkJICAgICAgIHx8ICF1dGZfaXNjb21wb3NpbmcodXRmX3B0cjJjaGFyKHBfZXh0cmEgKyAxKSkpCisjZW5kaWYKKwkJICAgICkKKwkgICAgeworCQlpZiAoUkVQTEFDRV9OT1JNQUwoU3RhdGUpKQorCQkgICAgcmVwbGFjZV9wdXNoKCpwX2V4dHJhKTsKKwkJKytwX2V4dHJhOworCQkrK2xlc3NfY29sc19vZmY7CisJICAgIH0KKwl9CisJaWYgKCpwX2V4dHJhICE9IE5VTCkKKwkgICAgZGlkX2FpID0gRkFMU0U7CSAgICAvKiBhcHBlbmQgc29tZSB0ZXh0LCBkb24ndCB0cnVuY2F0ZSBub3cgKi8KKworCS8qIGNvbHVtbnMgZm9yIG1hcmtzIGFkanVzdGVkIGZvciByZW1vdmVkIGNvbHVtbnMgKi8KKwlsZXNzX2NvbHMgPSAoaW50KShwX2V4dHJhIC0gc2F2ZWRfbGluZSk7CisgICAgfQorCisgICAgaWYgKHBfZXh0cmEgPT0gTlVMTCkKKwlwX2V4dHJhID0gKGNoYXJfdSAqKSIiOwkJICAgIC8qIGFwcGVuZCBlbXB0eSBsaW5lICovCisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgLyogY29uY2F0ZW5hdGUgbGVhZGVyIGFuZCBwX2V4dHJhLCBpZiB0aGVyZSBpcyBhIGxlYWRlciAqLworICAgIGlmIChsZWFkX2xlbikKKyAgICB7CisJU1RSQ0FUKGxlYWRlciwgcF9leHRyYSk7CisJcF9leHRyYSA9IGxlYWRlcjsKKwlkaWRfYWkgPSBUUlVFOwkgICAgLyogU28gdHJ1bmNhdGluZyBibGFua3Mgd29ya3Mgd2l0aCBjb21tZW50cyAqLworCWxlc3NfY29scyAtPSBsZWFkX2xlbjsKKyAgICB9CisgICAgZWxzZQorCWVuZF9jb21tZW50X3BlbmRpbmcgPSBOVUw7ICAvKiB0dXJucyBvdXQgdGhlcmUgd2FzIG5vIGxlYWRlciAqLworI2VuZGlmCisKKyAgICBvbGRfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoZGlyID09IEJBQ0tXQVJEKQorCS0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyAgICBpZiAoIShTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpIHx8IG9sZF9jdXJzb3IubG51bSA+PSBvcmlnX2xpbmVfY291bnQpCisjZW5kaWYKKyAgICB7CisJaWYgKG1sX2FwcGVuZChjdXJ3aW4tPndfY3Vyc29yLmxudW0sIHBfZXh0cmEsIChjb2xucl9UKTAsIEZBTFNFKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCSAgICBnb3RvIHRoZWVuZDsKKwkvKiBQb3N0cG9uZSBjYWxsaW5nIGNoYW5nZWRfbGluZXMoKSwgYmVjYXVzZSBpdCB3b3VsZCBtZXNzIHVwIGZvbGRpbmcKKwkgKiB3aXRoIG1hcmtlcnMuICovCisJbWFya19hZGp1c3QoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSwgKGxpbmVucl9UKU1BWExOVU0sIDFMLCAwTCk7CisJZGlkX2FwcGVuZCA9IFRSVUU7CisgICAgfQorI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyAgICBlbHNlCisgICAgeworCS8qCisJICogSW4gVlJFUExBQ0UgbW9kZSB3ZSBhcmUgc3RhcnRpbmcgdG8gcmVwbGFjZSB0aGUgbmV4dCBsaW5lLgorCSAqLworCWN1cndpbi0+d19jdXJzb3IubG51bSsrOworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPj0gSW5zc3RhcnQubG51bSArIHZyX2xpbmVzX2NoYW5nZWQpCisJeworCSAgICAvKiBJbiBjYXNlIHdlIE5MIHRvIGEgbmV3IGxpbmUsIEJTIHRvIHRoZSBwcmV2aW91cyBvbmUsIGFuZCBOTAorCSAgICAgKiBhZ2Fpbiwgd2UgZG9uJ3Qgd2FudCB0byBzYXZlIHRoZSBuZXcgbGluZSBmb3IgdW5kbyB0d2ljZS4KKwkgICAgICovCisJICAgICh2b2lkKXVfc2F2ZV9jdXJzb3IoKTsJCSAgICAvKiBlcnJvcnMgYXJlIGlnbm9yZWQhICovCisJICAgIHZyX2xpbmVzX2NoYW5nZWQrKzsKKwl9CisJbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIHBfZXh0cmEsIFRSVUUpOworCWNoYW5nZWRfYnl0ZXMoY3Vyd2luLT53X2N1cnNvci5sbnVtLCAwKTsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0tLTsKKwlkaWRfYXBwZW5kID0gRkFMU0U7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobmV3aW5kZW50CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorCQkgICAgfHwgZGlkX3NpCisjZW5kaWYKKwkJCQkpCisgICAgeworCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwlpZiAoZGlkX3NpKQorCXsKKwkgICAgaWYgKHBfc3IpCisJCW5ld2luZGVudCAtPSBuZXdpbmRlbnQgJSAoaW50KWN1cmJ1Zi0+Yl9wX3N3OworCSAgICBuZXdpbmRlbnQgKz0gKGludCljdXJidWYtPmJfcF9zdzsKKwl9CisjZW5kaWYKKwkvKiBDb3B5IHRoZSBpbmRlbnQgb25seSBpZiBleHBhbmQgdGFiIGlzIGRpc2FibGVkICovCisJaWYgKGN1cmJ1Zi0+Yl9wX2NpICYmICFjdXJidWYtPmJfcF9ldCkKKwl7CisJICAgICh2b2lkKWNvcHlfaW5kZW50KG5ld2luZGVudCwgc2F2ZWRfbGluZSk7CisKKwkgICAgLyoKKwkgICAgICogU2V0IHRoZSAncHJlc2VydmVpbmRlbnQnIG9wdGlvbiBzbyB0aGF0IGFueSBmdXJ0aGVyIHNjcmV3aW5nCisJICAgICAqIHdpdGggdGhlIGxpbmUgZG9lc24ndCBlbnRpcmVseSBkZXN0cm95IG91ciBlZmZvcnRzIHRvIHByZXNlcnZlCisJICAgICAqIGl0LiAgSXQgZ2V0cyByZXN0b3JlZCBhdCB0aGUgZnVuY3Rpb24gZW5kLgorCSAgICAgKi8KKwkgICAgY3VyYnVmLT5iX3BfcGkgPSBUUlVFOworCX0KKwllbHNlCisJICAgICh2b2lkKXNldF9pbmRlbnQobmV3aW5kZW50LCBTSU5fSU5TRVJUKTsKKwlsZXNzX2NvbHMgLT0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisKKwlhaV9jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworCS8qCisJICogSW4gUkVQTEFDRSBtb2RlLCBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIG5ldyBpbmRlbnQsIHRoZXJlIG11c3QKKwkgKiBiZSBhIE5VTCBvbiB0aGUgcmVwbGFjZSBzdGFjaywgZm9yIHdoZW4gaXQgaXMgZGVsZXRlZCB3aXRoIEJTCisJICovCisJaWYgKFJFUExBQ0VfTk9STUFMKFN0YXRlKSkKKwkgICAgZm9yIChuID0gMDsgbiA8IChpbnQpY3Vyd2luLT53X2N1cnNvci5jb2w7ICsrbikKKwkJcmVwbGFjZV9wdXNoKE5VTCk7CisJbmV3Y29sICs9IGN1cndpbi0+d19jdXJzb3IuY29sOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwlpZiAobm9fc2kpCisJICAgIGRpZF9zaSA9IEZBTFNFOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9DT01NRU5UUworICAgIC8qCisgICAgICogSW4gUkVQTEFDRSBtb2RlLCBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIGV4dHJhIGxlYWRlciwgdGhlcmUgbXVzdCBiZQorICAgICAqIGEgTlVMIG9uIHRoZSByZXBsYWNlIHN0YWNrLCBmb3Igd2hlbiBpdCBpcyBkZWxldGVkIHdpdGggQlMuCisgICAgICovCisgICAgaWYgKFJFUExBQ0VfTk9STUFMKFN0YXRlKSkKKwl3aGlsZSAobGVhZF9sZW4tLSA+IDApCisJICAgIHJlcGxhY2VfcHVzaChOVUwpOworI2VuZGlmCisKKyAgICBjdXJ3aW4tPndfY3Vyc29yID0gb2xkX2N1cnNvcjsKKworICAgIGlmIChkaXIgPT0gRk9SV0FSRCkKKyAgICB7CisJaWYgKHRydW5jX2xpbmUgfHwgKFN0YXRlICYgSU5TRVJUKSkKKwl7CisJICAgIC8qIHRydW5jYXRlIGN1cnJlbnQgbGluZSBhdCBjdXJzb3IgKi8KKwkgICAgc2F2ZWRfbGluZVtjdXJ3aW4tPndfY3Vyc29yLmNvbF0gPSBOVUw7CisJICAgIC8qIFJlbW92ZSB0cmFpbGluZyB3aGl0ZSBzcGFjZSwgdW5sZXNzIE9QRU5MSU5FX0tFRVBUUkFJTCB1c2VkLiAqLworCSAgICBpZiAodHJ1bmNfbGluZSAmJiAhKGZsYWdzICYgT1BFTkxJTkVfS0VFUFRSQUlMKSkKKwkJdHJ1bmNhdGVfc3BhY2VzKHNhdmVkX2xpbmUpOworCSAgICBtbF9yZXBsYWNlKGN1cndpbi0+d19jdXJzb3IubG51bSwgc2F2ZWRfbGluZSwgRkFMU0UpOworCSAgICBzYXZlZF9saW5lID0gTlVMTDsKKwkgICAgaWYgKGRpZF9hcHBlbmQpCisJICAgIHsKKwkJY2hhbmdlZF9saW5lcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cndpbi0+d19jdXJzb3IuY29sLAorCQkJCQkgICAgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSwgMUwpOworCQlkaWRfYXBwZW5kID0gRkFMU0U7CisKKwkJLyogTW92ZSBtYXJrcyBhZnRlciB0aGUgbGluZSBicmVhayB0byB0aGUgbmV3IGxpbmUuICovCisJCWlmIChmbGFncyAmIE9QRU5MSU5FX01BUktGSVgpCisJCSAgICBtYXJrX2NvbF9hZGp1c3QoY3Vyd2luLT53X2N1cnNvci5sbnVtLAorCQkJCQkgY3Vyd2luLT53X2N1cnNvci5jb2wgKyBsZXNzX2NvbHNfb2ZmLAorCQkJCQkJCTFMLCAobG9uZyktbGVzc19jb2xzKTsKKwkgICAgfQorCSAgICBlbHNlCisJCWNoYW5nZWRfYnl0ZXMoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjdXJ3aW4tPndfY3Vyc29yLmNvbCk7CisJfQorCisJLyoKKwkgKiBQdXQgdGhlIGN1cnNvciBvbiB0aGUgbmV3IGxpbmUuICBDYXJlZnVsOiB0aGUgc2Nyb2xsdXAoKSBhYm92ZSBtYXkKKwkgKiBoYXZlIG1vdmVkIHdfY3Vyc29yLCB3ZSBtdXN0IHVzZSBvbGRfY3Vyc29yLgorCSAqLworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IG9sZF9jdXJzb3IubG51bSArIDE7CisgICAgfQorICAgIGlmIChkaWRfYXBwZW5kKQorCWNoYW5nZWRfbGluZXMoY3Vyd2luLT53X2N1cnNvci5sbnVtLCAwLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIDFMKTsKKworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gbmV3Y29sOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9WUkVQTEFDRSkgJiYgKGRlZmluZWQoRkVBVF9MSVNQKSB8fCBkZWZpbmVkKEZFQVRfQ0lOREVOVCkpCisgICAgLyoKKyAgICAgKiBJbiBWUkVQTEFDRSBtb2RlLCB3ZSBhcmUgaGFuZGxpbmcgdGhlIHJlcGxhY2Ugc3RhY2sgb3Vyc2VsdmVzLCBzbyBzdG9wCisgICAgICogZml4dGhpc2xpbmUoKSBmcm9tIGRvaW5nIGl0ICh2aWEgY2hhbmdlX2luZGVudCgpKSBieSB0ZWxsaW5nIGl0IHdlJ3JlIGluCisgICAgICogbm9ybWFsIElOU0VSVCBtb2RlLgorICAgICAqLworICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisgICAgeworCXZyZXBsYWNlX21vZGUgPSBTdGF0ZTsJLyogU28gd2Uga25vdyB0byBwdXQgdGhpbmdzIHJpZ2h0IGxhdGVyICovCisJU3RhdGUgPSBJTlNFUlQ7CisgICAgfQorICAgIGVsc2UKKwl2cmVwbGFjZV9tb2RlID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElTUAorICAgIC8qCisgICAgICogTWF5IGRvIGxpc3AgaW5kZW50aW5nLgorICAgICAqLworICAgIGlmICghcF9wYXN0ZQorIyBpZmRlZiBGRUFUX0NPTU1FTlRTCisJICAgICYmIGxlYWRlciA9PSBOVUxMCisjIGVuZGlmCisJICAgICYmIGN1cmJ1Zi0+Yl9wX2xpc3AKKwkgICAgJiYgY3VyYnVmLT5iX3BfYWkpCisgICAgeworCWZpeHRoaXNsaW5lKGdldF9saXNwX2luZGVudCk7CisJcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJYWlfY29sID0gKGNvbG5yX1QpKHNraXB3aGl0ZShwKSAtIHApOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0lOREVOVAorICAgIC8qCisgICAgICogTWF5IGRvIGluZGVudGluZyBhZnRlciBvcGVuaW5nIGEgbmV3IGxpbmUuCisgICAgICovCisgICAgaWYgKCFwX3Bhc3RlCisJICAgICYmIChjdXJidWYtPmJfcF9jaW4KKyMgIGlmZGVmIEZFQVRfRVZBTAorCQkgICAgfHwgKmN1cmJ1Zi0+Yl9wX2luZGUgIT0gTlVMCisjICBlbmRpZgorCQkpCisJICAgICYmIGluX2NpbmtleXMoZGlyID09IEZPUldBUkQKKwkJPyBLRVlfT1BFTl9GT1JXCisJCTogS0VZX09QRU5fQkFDSywgJyAnLCBsaW5ld2hpdGUoY3Vyd2luLT53X2N1cnNvci5sbnVtKSkpCisgICAgeworCWRvX2NfZXhwcl9pbmRlbnQoKTsKKwlwID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwlhaV9jb2wgPSAoY29sbnJfVCkoc2tpcHdoaXRlKHApIC0gcCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1ZSRVBMQUNFKSAmJiAoZGVmaW5lZChGRUFUX0xJU1ApIHx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKSkKKyAgICBpZiAodnJlcGxhY2VfbW9kZSAhPSAwKQorCVN0YXRlID0gdnJlcGxhY2VfbW9kZTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorICAgIC8qCisgICAgICogRmluYWxseSwgVlJFUExBQ0UgZ2V0cyB0aGUgc3R1ZmYgb24gdGhlIG5ldyBsaW5lLCB0aGVuIHB1dHMgYmFjayB0aGUKKyAgICAgKiBvcmlnaW5hbCBsaW5lLCBhbmQgaW5zZXJ0cyB0aGUgbmV3IHN0dWZmIGNoYXIgYnkgY2hhciwgcHVzaGluZyBvbGQgc3R1ZmYKKyAgICAgKiBvbnRvIHRoZSByZXBsYWNlIHN0YWNrICh2aWEgaW5zX2NoYXIoKSkuCisgICAgICovCisgICAgaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKyAgICB7CisJLyogUHV0IG5ldyBsaW5lIGluIHBfZXh0cmEgKi8KKwlwX2V4dHJhID0gdmltX3N0cnNhdmUobWxfZ2V0X2N1cmxpbmUoKSk7CisJaWYgKHBfZXh0cmEgPT0gTlVMTCkKKwkgICAgZ290byB0aGVlbmQ7CisKKwkvKiBQdXQgYmFjayBvcmlnaW5hbCBsaW5lICovCisJbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG5leHRfbGluZSwgRkFMU0UpOworCisJLyogSW5zZXJ0IG5ldyBzdHVmZiBpbnRvIGxpbmUgYWdhaW4gKi8KKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorCWluc19ieXRlcyhwX2V4dHJhKTsJLyogd2lsbCBjYWxsIGNoYW5nZWRfYnl0ZXMoKSAqLworCXZpbV9mcmVlKHBfZXh0cmEpOworCW5leHRfbGluZSA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR2YWwgPSBUUlVFOwkJLyogc3VjY2VzcyEgKi8KK3RoZWVuZDoKKyAgICBjdXJidWYtPmJfcF9waSA9IHNhdmVkX3BpOworICAgIHZpbV9mcmVlKHNhdmVkX2xpbmUpOworICAgIHZpbV9mcmVlKG5leHRfbGluZSk7CisgICAgdmltX2ZyZWUoYWxsb2NhdGVkKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgZGVmaW5lZChGRUFUX0NPTU1FTlRTKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIGdldF9sZWFkZXJfbGVuKCkgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggb2YgdGhlIGdpdmVuIHN0cmluZworICogd2hpY2ggaW50cm9kdWNlcyBhIGNvbW1lbnQuCUlmIHRoaXMgc3RyaW5nIGlzIG5vdCBhIGNvbW1lbnQgdGhlbiAwIGlzCisgKiByZXR1cm5lZC4KKyAqIFdoZW4gImZsYWdzIiBpcyBub3QgTlVMTCwgaXQgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBmbGFncyBvZiB0aGUgcmVjb2duaXplZAorICogY29tbWVudCBsZWFkZXIuCisgKiAiYmFja3dhcmQiIG11c3QgYmUgdHJ1ZSBmb3IgdGhlICJPIiBjb21tYW5kLgorICovCisgICAgaW50CitnZXRfbGVhZGVyX2xlbihsaW5lLCBmbGFncywgYmFja3dhcmQpCisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqKmZsYWdzOworICAgIGludAkJYmFja3dhcmQ7Cit7CisgICAgaW50CQlpLCBqOworICAgIGludAkJZ290X2NvbSA9IEZBTFNFOworICAgIGludAkJZm91bmRfb25lOworICAgIGNoYXJfdQlwYXJ0X2J1ZltDT01fTUFYX0xFTl07CS8qIGJ1ZmZlciBmb3Igb25lIG9wdGlvbiBwYXJ0ICovCisgICAgY2hhcl91CSpzdHJpbmc7CQkvKiBwb2ludGVyIHRvIGNvbW1lbnQgc3RyaW5nICovCisgICAgY2hhcl91CSpsaXN0OworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHZpbV9pc3doaXRlKGxpbmVbaV0pKSAgICAvKiBsZWFkaW5nIHdoaXRlIHNwYWNlIGlzIGlnbm9yZWQgKi8KKwkrK2k7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCB0byBtYXRjaCBzZXZlcmFsIG5lc3RlZCBjb21tZW50IHN0cmluZ3MuCisgICAgICovCisgICAgd2hpbGUgKGxpbmVbaV0pCisgICAgeworCS8qCisJICogc2NhbiB0aHJvdWdoIHRoZSAnY29tbWVudHMnIG9wdGlvbiBmb3IgYSBtYXRjaAorCSAqLworCWZvdW5kX29uZSA9IEZBTFNFOworCWZvciAobGlzdCA9IGN1cmJ1Zi0+Yl9wX2NvbTsgKmxpc3Q7ICkKKwl7CisJICAgIC8qCisJICAgICAqIEdldCBvbmUgb3B0aW9uIHBhcnQgaW50byBwYXJ0X2J1ZltdLiAgQWR2YW5jZSBsaXN0IHRvIG5leHQgb25lLgorCSAgICAgKiBwdXQgc3RyaW5nIGF0IHN0YXJ0IG9mIHN0cmluZy4KKwkgICAgICovCisJICAgIGlmICghZ290X2NvbSAmJiBmbGFncyAhPSBOVUxMKSAgLyogcmVtZW1iZXIgd2hlcmUgZmxhZ3Mgc3RhcnRlZCAqLworCQkqZmxhZ3MgPSBsaXN0OworCSAgICAodm9pZCljb3B5X29wdGlvbl9wYXJ0KCZsaXN0LCBwYXJ0X2J1ZiwgQ09NX01BWF9MRU4sICIsIik7CisJICAgIHN0cmluZyA9IHZpbV9zdHJjaHIocGFydF9idWYsICc6Jyk7CisJICAgIGlmIChzdHJpbmcgPT0gTlVMTCkJICAgIC8qIG1pc3NpbmcgJzonLCBpZ25vcmUgdGhpcyBwYXJ0ICovCisJCWNvbnRpbnVlOworCSAgICAqc3RyaW5nKysgPSBOVUw7CSAgICAvKiBpc29sYXRlIGZsYWdzIGZyb20gc3RyaW5nICovCisKKwkgICAgLyoKKwkgICAgICogV2hlbiBhbHJlYWR5IGZvdW5kIGEgbmVzdGVkIGNvbW1lbnQsIG9ubHkgYWNjZXB0IGZ1cnRoZXIKKwkgICAgICogbmVzdGVkIGNvbW1lbnRzLgorCSAgICAgKi8KKwkgICAgaWYgKGdvdF9jb20gJiYgdmltX3N0cmNocihwYXJ0X2J1ZiwgQ09NX05FU1QpID09IE5VTEwpCisJCWNvbnRpbnVlOworCisJICAgIC8qIFdoZW4gJ08nIGZsYWcgdXNlZCBkb24ndCB1c2UgZm9yICJPIiBjb21tYW5kICovCisJICAgIGlmIChiYWNrd2FyZCAmJiB2aW1fc3RyY2hyKHBhcnRfYnVmLCBDT01fTk9CQUNLKSAhPSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICAvKgorCSAgICAgKiBMaW5lIGNvbnRlbnRzIGFuZCBzdHJpbmcgbXVzdCBtYXRjaC4KKwkgICAgICogV2hlbiBzdHJpbmcgc3RhcnRzIHdpdGggd2hpdGUgc3BhY2UsIG11c3QgaGF2ZSBzb21lIHdoaXRlIHNwYWNlCisJICAgICAqIChidXQgdGhlIGFtb3VudCBkb2VzIG5vdCBuZWVkIHRvIG1hdGNoLCB0aGVyZSBtaWdodCBiZSBhIG1peCBvZgorCSAgICAgKiBUQUJzIGFuZCBzcGFjZXMpLgorCSAgICAgKi8KKwkgICAgaWYgKHZpbV9pc3doaXRlKHN0cmluZ1swXSkpCisJICAgIHsKKwkJaWYgKGkgPT0gMCB8fCAhdmltX2lzd2hpdGUobGluZVtpIC0gMV0pKQorCQkgICAgY29udGludWU7CisJCXdoaWxlICh2aW1faXN3aGl0ZShzdHJpbmdbMF0pKQorCQkgICAgKytzdHJpbmc7CisJICAgIH0KKwkgICAgZm9yIChqID0gMDsgc3RyaW5nW2pdICE9IE5VTCAmJiBzdHJpbmdbal0gPT0gbGluZVtpICsgal07ICsraikKKwkJOworCSAgICBpZiAoc3RyaW5nW2pdICE9IE5VTCkKKwkJY29udGludWU7CisKKwkgICAgLyoKKwkgICAgICogV2hlbiAnYicgZmxhZyB1c2VkLCB0aGVyZSBtdXN0IGJlIHdoaXRlIHNwYWNlIG9yIGFuCisJICAgICAqIGVuZC1vZi1saW5lIGFmdGVyIHRoZSBzdHJpbmcgaW4gdGhlIGxpbmUuCisJICAgICAqLworCSAgICBpZiAodmltX3N0cmNocihwYXJ0X2J1ZiwgQ09NX0JMQU5LKSAhPSBOVUxMCisJCQkgICAmJiAhdmltX2lzd2hpdGUobGluZVtpICsgal0pICYmIGxpbmVbaSArIGpdICE9IE5VTCkKKwkJY29udGludWU7CisKKwkgICAgLyoKKwkgICAgICogV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLCBzdG9wIHNlYXJjaGluZy4KKwkgICAgICovCisJICAgIGkgKz0gajsKKwkgICAgZ290X2NvbSA9IFRSVUU7CisJICAgIGZvdW5kX29uZSA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKworCS8qCisJICogTm8gbWF0Y2ggZm91bmQsIHN0b3Agc2Nhbm5pbmcuCisJICovCisJaWYgKCFmb3VuZF9vbmUpCisJICAgIGJyZWFrOworCisJLyoKKwkgKiBJbmNsdWRlIGFueSB0cmFpbGluZyB3aGl0ZSBzcGFjZS4KKwkgKi8KKwl3aGlsZSAodmltX2lzd2hpdGUobGluZVtpXSkpCisJICAgICsraTsKKworCS8qCisJICogSWYgdGhpcyBjb21tZW50IGRvZXNuJ3QgbmVzdCwgc3RvcCBoZXJlLgorCSAqLworCWlmICh2aW1fc3RyY2hyKHBhcnRfYnVmLCBDT01fTkVTVCkgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoZ290X2NvbSA/IGkgOiAwKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygd2luZG93IGxpbmVzIG9jY3VwaWVkIGJ5IGJ1ZmZlciBsaW5lICJsbnVtIi4KKyAqLworICAgIGludAorcGxpbmVzKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICByZXR1cm4gcGxpbmVzX3dpbihjdXJ3aW4sIGxudW0sIFRSVUUpOworfQorCisgICAgaW50CitwbGluZXNfd2luKHdwLCBsbnVtLCB3aW5oZWlnaHQpCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQl3aW5oZWlnaHQ7CS8qIHdoZW4gVFJVRSBsaW1pdCB0byB3aW5kb3cgaGVpZ2h0ICovCit7CisjaWYgZGVmaW5lZChGRUFUX0RJRkYpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgLyogQ2hlY2sgZm9yIGZpbGxlciBsaW5lcyBhYm92ZSB0aGlzIGJ1ZmZlciBsaW5lLiAgV2hlbiBmb2xkZWQgdGhlIHJlc3VsdAorICAgICAqIGlzIG9uZSBsaW5lIGFueXdheS4gKi8KKyAgICByZXR1cm4gcGxpbmVzX3dpbl9ub2ZpbGwod3AsIGxudW0sIHdpbmhlaWdodCkgKyBkaWZmX2NoZWNrX2ZpbGwod3AsIGxudW0pOworfQorCisgICAgaW50CitwbGluZXNfbm9maWxsKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICByZXR1cm4gcGxpbmVzX3dpbl9ub2ZpbGwoY3Vyd2luLCBsbnVtLCBUUlVFKTsKK30KKworICAgIGludAorcGxpbmVzX3dpbl9ub2ZpbGwod3AsIGxudW0sIHdpbmhlaWdodCkKKyAgICB3aW5fVAkqd3A7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXdpbmhlaWdodDsJLyogd2hlbiBUUlVFIGxpbWl0IHRvIHdpbmRvdyBoZWlnaHQgKi8KK3sKKyNlbmRpZgorICAgIGludAkJbGluZXM7CisKKyAgICBpZiAoIXdwLT53X3Bfd3JhcCkKKwlyZXR1cm4gMTsKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKHdwLT53X3dpZHRoID09IDApCisJcmV0dXJuIDE7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIC8qIEEgZm9sZGVkIGxpbmVzIGlzIGhhbmRsZWQganVzdCBsaWtlIGFuIGVtcHR5IGxpbmUuICovCisgICAgLyogTk9URTogQ2FsbGVyIG11c3QgaGFuZGxlIGxpbmVzIHRoYXQgYXJlIE1BWUJFIGZvbGRlZC4gKi8KKyAgICBpZiAobGluZUZvbGRlZCh3cCwgbG51bSkgPT0gVFJVRSkKKwlyZXR1cm4gMTsKKyNlbmRpZgorCisgICAgbGluZXMgPSBwbGluZXNfd2luX25vZm9sZCh3cCwgbG51bSk7CisgICAgaWYgKHdpbmhlaWdodCA+IDAgJiYgbGluZXMgPiB3cC0+d19oZWlnaHQpCisJcmV0dXJuIChpbnQpd3AtPndfaGVpZ2h0OworICAgIHJldHVybiBsaW5lczsKK30KKworLyoKKyAqIFJldHVybiBudW1iZXIgb2Ygd2luZG93IGxpbmVzIHBoeXNpY2FsIGxpbmUgImxudW0iIHdpbGwgb2NjdXB5IGluIHdpbmRvdworICogIndwIi4gIERvZXMgbm90IGNhcmUgYWJvdXQgZm9sZGluZywgJ3dyYXAnIG9yICdkaWZmJy4KKyAqLworICAgIGludAorcGxpbmVzX3dpbl9ub2ZvbGQod3AsIGxudW0pCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgY2hhcl91CSpzOworICAgIGxvbmcJY29sOworICAgIGludAkJd2lkdGg7CisKKyAgICBzID0gbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW0sIEZBTFNFKTsKKyAgICBpZiAoKnMgPT0gTlVMKQkJLyogZW1wdHkgbGluZSAqLworCXJldHVybiAxOworICAgIGNvbCA9IHdpbl9saW5ldGFic2l6ZSh3cCwgcywgKGNvbG5yX1QpTUFYQ09MKTsKKworICAgIC8qCisgICAgICogSWYgbGlzdCBtb2RlIGlzIG9uLCB0aGVuIHRoZSAnJCcgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBtYXkgdGFrZSB1cCBvbmUKKyAgICAgKiBleHRyYSBjb2x1bW4uCisgICAgICovCisgICAgaWYgKHdwLT53X3BfbGlzdCAmJiBsY3NfZW9sICE9IE5VTCkKKwljb2wgKz0gMTsKKworICAgIC8qCisgICAgICogQWRkIGNvbHVtbiBvZmZzZXQgZm9yICdudW1iZXInIGFuZCAnZm9sZGNvbHVtbicuCisgICAgICovCisgICAgd2lkdGggPSBXX1dJRFRIKHdwKSAtIHdpbl9jb2xfb2ZmKHdwKTsKKyAgICBpZiAod2lkdGggPD0gMCkKKwlyZXR1cm4gMzIwMDA7CisgICAgaWYgKGNvbCA8PSB3aWR0aCkKKwlyZXR1cm4gMTsKKyAgICBjb2wgLT0gd2lkdGg7CisgICAgd2lkdGggKz0gd2luX2NvbF9vZmYyKHdwKTsKKyAgICByZXR1cm4gKGNvbCArICh3aWR0aCAtIDEpKSAvIHdpZHRoICsgMTsKK30KKworLyoKKyAqIExpa2UgcGxpbmVzX3dpbigpLCBidXQgb25seSByZXBvcnRzIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgc2NyZWVuIGxpbmVzCisgKiB1c2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRvIHRoZSBnaXZlbiBjb2x1bW4gbnVtYmVyLgorICovCisgICAgaW50CitwbGluZXNfd2luX2NvbCh3cCwgbG51bSwgY29sdW1uKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJY29sdW1uOworeworICAgIGxvbmcJY29sOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWxpbmVzID0gMDsKKyAgICBpbnQJCXdpZHRoOworCisjaWZkZWYgRkVBVF9ESUZGCisgICAgLyogQ2hlY2sgZm9yIGZpbGxlciBsaW5lcyBhYm92ZSB0aGlzIGJ1ZmZlciBsaW5lLiAgV2hlbiBmb2xkZWQgdGhlIHJlc3VsdAorICAgICAqIGlzIG9uZSBsaW5lIGFueXdheS4gKi8KKyAgICBsaW5lcyA9IGRpZmZfY2hlY2tfZmlsbCh3cCwgbG51bSk7CisjZW5kaWYKKworICAgIGlmICghd3AtPndfcF93cmFwKQorCXJldHVybiBsaW5lcyArIDE7CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmICh3cC0+d193aWR0aCA9PSAwKQorCXJldHVybiBsaW5lcyArIDE7CisjZW5kaWYKKworICAgIHMgPSBtbF9nZXRfYnVmKHdwLT53X2J1ZmZlciwgbG51bSwgRkFMU0UpOworCisgICAgY29sID0gMDsKKyAgICB3aGlsZSAoKnMgIT0gTlVMICYmIC0tY29sdW1uID49IDApCisgICAgeworCWNvbCArPSB3aW5fbGJyX2NoYXJ0YWJzaXplKHdwLCBzLCAoY29sbnJfVCljb2wsIE5VTEwpOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBzICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocyk7CisJZWxzZQorI2VuZGlmCisJICAgICsrczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmICpzIGlzIGEgVEFCLCBhbmQgdGhlIFRBQiBpcyBub3QgZGlzcGxheWVkIGFzIF5JLCBhbmQgd2UncmUgbm90IGluCisgICAgICogSU5TRVJUIG1vZGUsIHRoZW4gY29sIG11c3QgYmUgYWRqdXN0ZWQgc28gdGhhdCBpdCByZXByZXNlbnRzIHRoZSBsYXN0CisgICAgICogc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBUQUIuICBUaGlzIG9ubHkgZml4ZXMgYW4gZXJyb3Igd2hlbiB0aGUgVEFCIHdyYXBzCisgICAgICogZnJvbSBvbmUgc2NyZWVuIGxpbmUgdG8gdGhlIG5leHQgKHdoZW4gJ2NvbHVtbnMnIGlzIG5vdCBhIG11bHRpcGxlIG9mCisgICAgICogJ3RzJykgLS0gd2ViYi4KKyAgICAgKi8KKyAgICBpZiAoKnMgPT0gVEFCICYmIChTdGF0ZSAmIE5PUk1BTCkgJiYgKCF3cC0+d19wX2xpc3QgfHwgbGNzX3RhYjEpKQorCWNvbCArPSB3aW5fbGJyX2NoYXJ0YWJzaXplKHdwLCBzLCAoY29sbnJfVCljb2wsIE5VTEwpIC0gMTsKKworICAgIC8qCisgICAgICogQWRkIGNvbHVtbiBvZmZzZXQgZm9yICdudW1iZXInLCAnZm9sZGNvbHVtbicsIGV0Yy4KKyAgICAgKi8KKyAgICB3aWR0aCA9IFdfV0lEVEgod3ApIC0gd2luX2NvbF9vZmYod3ApOworICAgIGlmICh3aWR0aCA+IDApCisgICAgeworCWxpbmVzICs9IDE7CisJaWYgKGNvbCA+PSB3aWR0aCkKKwkgICAgbGluZXMgKz0gKGNvbCAtIHdpZHRoKSAvICh3aWR0aCArIHdpbl9jb2xfb2ZmMih3cCkpOworCWlmIChsaW5lcyA8PSB3cC0+d19oZWlnaHQpCisJICAgIHJldHVybiBsaW5lczsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKHdwLT53X2hlaWdodCk7CSAgICAvKiBtYXhpbXVtIGxlbmd0aCAqLworfQorCisgICAgaW50CitwbGluZXNfbV93aW4od3AsIGZpcnN0LCBsYXN0KQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlmaXJzdCwgbGFzdDsKK3sKKyAgICBpbnQJCWNvdW50ID0gMDsKKworICAgIHdoaWxlIChmaXJzdCA8PSBsYXN0KQorICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpbnQJeDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcmVhbGx5IGZvbGRlZCBsaW5lcywgYnV0IGFsc28gaW5jbHVkZWQgbGluZXMKKwkgKiB0aGF0IGFyZSBtYXliZSBmb2xkZWQuICovCisJeCA9IGZvbGRlZENvdW50KHdwLCBmaXJzdCwgTlVMTCk7CisJaWYgKHggPiAwKQorCXsKKwkgICAgKytjb3VudDsJICAgIC8qIGNvdW50IDEgZm9yICIrLS0gZm9sZGVkIiBsaW5lICovCisJICAgIGZpcnN0ICs9IHg7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgaWYgKGZpcnN0ID09IHdwLT53X3RvcGxpbmUpCisJCWNvdW50ICs9IHBsaW5lc193aW5fbm9maWxsKHdwLCBmaXJzdCwgVFJVRSkgKyB3cC0+d190b3BmaWxsOworCSAgICBlbHNlCisjZW5kaWYKKwkJY291bnQgKz0gcGxpbmVzX3dpbih3cCwgZmlyc3QsIFRSVUUpOworCSAgICArK2ZpcnN0OworCX0KKyAgICB9CisgICAgcmV0dXJuIChjb3VudCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVlJFUExBQ0UpIHx8IGRlZmluZWQoRkVBVF9JTlNfRVhQQU5EKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEluc2VydCBzdHJpbmcgInAiIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uICBTdG9wcyBhdCBhIE5VTCBieXRlLgorICogSGFuZGxlcyBSZXBsYWNlIG1vZGUgYW5kIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4KKyAqLworICAgIHZvaWQKK2luc19ieXRlcyhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpbnNfYnl0ZXNfbGVuKHAsIChpbnQpU1RSTEVOKHApKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1ZSRVBMQUNFKSB8fCBkZWZpbmVkKEZFQVRfSU5TX0VYUEFORCkgXAorCXx8IGRlZmluZWQoRkVBVF9DT01NRU5UUykgfHwgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEluc2VydCBzdHJpbmcgInAiIHdpdGggbGVuZ3RoICJsZW4iIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uCisgKiBIYW5kbGVzIFJlcGxhY2UgbW9kZSBhbmQgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgorICovCisgICAgdm9pZAoraW5zX2J5dGVzX2xlbihwLCBsZW4pCisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuOworeworICAgIGludAkJaTsKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gbikKKyAgICB7CisJbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCArIGkpOworCWluc19jaGFyX2J5dGVzKHAgKyBpLCBuKTsKKyAgICB9CisjIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJaW5zX2NoYXIocFtpXSk7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIEluc2VydCBvciByZXBsYWNlIGEgc2luZ2xlIGNoYXJhY3RlciBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICogV2hlbiBpbiBSRVBMQUNFIG9yIFZSRVBMQUNFIG1vZGUsIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNoYXJhY3Rlci4KKyAqIENhbGxlciBtdXN0IGhhdmUgcHJlcGFyZWQgZm9yIHVuZG8uCisgKiBGb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzIHdlIGdldCB0aGUgd2hvbGUgY2hhcmFjdGVyLCB0aGUgY2FsbGVyIG11c3QKKyAqIGNvbnZlcnQgYnl0ZXMgdG8gYSBjaGFyYWN0ZXIuCisgKi8KKyAgICB2b2lkCitpbnNfY2hhcihjKQorICAgIGludAkJYzsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFU107CisgICAgaW50CQluOworCisgICAgbiA9ICgqbWJfY2hhcjJieXRlcykoYywgYnVmKTsKKworICAgIC8qIFdoZW4gImMiIGlzIDB4MTAwLCAweDIwMCwgZXRjLiB3ZSBkb24ndCB3YW50IHRvIGluc2VydCBhIE5VTCBieXRlLgorICAgICAqIEhhcHBlbnMgZm9yIENUUkwtVnU5OTAwLiAqLworICAgIGlmIChidWZbMF0gPT0gMCkKKwlidWZbMF0gPSAnXG4nOworCisgICAgaW5zX2NoYXJfYnl0ZXMoYnVmLCBuKTsKK30KKworICAgIHZvaWQKK2luc19jaGFyX2J5dGVzKGJ1ZiwgY2hhcmxlbikKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWNoYXJsZW47Cit7CisgICAgaW50CQljID0gYnVmWzBdOworICAgIGludAkJbCwgajsKKyNlbmRpZgorICAgIGludAkJbmV3bGVuOwkJLyogbnIgb2YgYnl0ZXMgaW5zZXJ0ZWQgKi8KKyAgICBpbnQJCW9sZGxlbjsJCS8qIG5yIG9mIGJ5dGVzIGRlbGV0ZWQgKDAgd2hlbiBub3QgcmVwbGFjaW5nKSAqLworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKm5ld3A7CisgICAgY2hhcl91CSpvbGRwOworICAgIGludAkJbGluZWxlbjsJLyogbGVuZ3RoIG9mIG9sZCBsaW5lIGluY2x1ZGluZyBOVUwgKi8KKyAgICBjb2xucl9UCWNvbDsKKyAgICBsaW5lbnJfVAlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGludAkJaTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICAvKiBCcmVhayB0YWJzIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAodmlydHVhbF9hY3RpdmUoKSAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDApCisJY29sYWR2YW5jZV9mb3JjZShnZXR2aXNjb2woKSk7CisjZW5kaWYKKworICAgIGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIG9sZHAgPSBtbF9nZXQobG51bSk7CisgICAgbGluZWxlbiA9IChpbnQpU1RSTEVOKG9sZHApICsgMTsKKworICAgIC8qIFRoZSBsZW5ndGhzIGRlZmF1bHQgdG8gdGhlIHZhbHVlcyBmb3Igd2hlbiBub3QgcmVwbGFjaW5nLiAqLworICAgIG9sZGxlbiA9IDA7CisjaWZkZWYgRkVBVF9NQllURQorICAgIG5ld2xlbiA9IGNoYXJsZW47CisjZWxzZQorICAgIG5ld2xlbiA9IDE7CisjZW5kaWYKKworICAgIGlmIChTdGF0ZSAmIFJFUExBQ0VfRkxBRykKKyAgICB7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCWlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCisJeworCSAgICBjb2xucl9UCW5ld192Y29sID0gMDsgICAvKiBpbml0IGZvciBHQ0MgKi8KKwkgICAgY29sbnJfVAl2Y29sOworCSAgICBpbnQJCW9sZF9saXN0OworI2lmbmRlZiBGRUFUX01CWVRFCisJICAgIGNoYXJfdQlidWZbMl07CisjZW5kaWYKKworCSAgICAvKgorCSAgICAgKiBEaXNhYmxlICdsaXN0JyB0ZW1wb3JhcmlseSwgdW5sZXNzICdjcG8nIGNvbnRhaW5zIHRoZSAnTCcgZmxhZy4KKwkgICAgICogUmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mIGxpc3QsIHNvIHdoZW4gZmluaXNoZWQsCisJICAgICAqIGN1cndpbi0+d19wX2xpc3Qgc2hvdWxkIGJlIHNldCBiYWNrIHRvIHRoaXMuCisJICAgICAqLworCSAgICBvbGRfbGlzdCA9IGN1cndpbi0+d19wX2xpc3Q7CisJICAgIGlmIChvbGRfbGlzdCAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fTElTVFdNKSA9PSBOVUxMKQorCQljdXJ3aW4tPndfcF9saXN0ID0gRkFMU0U7CisKKwkgICAgLyoKKwkgICAgICogSW4gdmlydHVhbCByZXBsYWNlIG1vZGUgZWFjaCBjaGFyYWN0ZXIgbWF5IHJlcGxhY2Ugb25lIG9yIG1vcmUKKwkgICAgICogY2hhcmFjdGVycyAoemVybyBpZiBpdCdzIGEgVEFCKS4gIENvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8KKwkgICAgICogYmUgZGVsZXRlZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgY2hhcmFjdGVyLCBjb3VudGluZyBzY3JlZW4KKwkgICAgICogY2VsbHMuICBNYXkgcmVzdWx0IGluIGFkZGluZyBzcGFjZXMgdG8gZmlsbCBhIGdhcC4KKwkgICAgICovCisJICAgIGdldHZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgTlVMTCwgJnZjb2wsIE5VTEwpOworI2lmbmRlZiBGRUFUX01CWVRFCisJICAgIGJ1ZlswXSA9IGM7CisJICAgIGJ1ZlsxXSA9IE5VTDsKKyNlbmRpZgorCSAgICBuZXdfdmNvbCA9IHZjb2wgKyBjaGFydGFic2l6ZShidWYsIHZjb2wpOworCSAgICB3aGlsZSAob2xkcFtjb2wgKyBvbGRsZW5dICE9IE5VTCAmJiB2Y29sIDwgbmV3X3Zjb2wpCisJICAgIHsKKwkJdmNvbCArPSBjaGFydGFic2l6ZShvbGRwICsgY29sICsgb2xkbGVuLCB2Y29sKTsKKwkJLyogRG9uJ3QgbmVlZCB0byByZW1vdmUgYSBUQUIgdGhhdCB0YWtlcyB1cyB0byB0aGUgcmlnaHQKKwkJICogcG9zaXRpb24uICovCisJCWlmICh2Y29sID4gbmV3X3Zjb2wgJiYgb2xkcFtjb2wgKyBvbGRsZW5dID09IFRBQikKKwkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJb2xkbGVuICs9ICgqbWJfcHRyMmxlbl9jaGVjaykob2xkcCArIGNvbCArIG9sZGxlbik7CisjZWxzZQorCQkrK29sZGxlbjsKKyNlbmRpZgorCQkvKiBEZWxldGVkIGEgYml0IHRvbyBtdWNoLCBpbnNlcnQgc3BhY2VzLiAqLworCQlpZiAodmNvbCA+IG5ld192Y29sKQorCQkgICAgbmV3bGVuICs9IHZjb2wgLSBuZXdfdmNvbDsKKwkgICAgfQorCSAgICBjdXJ3aW4tPndfcF9saXN0ID0gb2xkX2xpc3Q7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBpZiAob2xkcFtjb2xdICE9IE5VTCkKKwl7CisJICAgIC8qIG5vcm1hbCByZXBsYWNlICovCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBvbGRsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKG9sZHAgKyBjb2wpOworI2Vsc2UKKwkgICAgb2xkbGVuID0gMTsKKyNlbmRpZgorCX0KKworCisJLyogUHVzaCB0aGUgcmVwbGFjZWQgYnl0ZXMgb250byB0aGUgcmVwbGFjZSBzdGFjaywgc28gdGhhdCB0aGV5IGNhbiBiZQorCSAqIHB1dCBiYWNrIHdoZW4gQlMgaXMgdXNlZC4gIFRoZSBieXRlcyBvZiBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGFyZQorCSAqIGRvbmUgdGhlIG90aGVyIHdheSBhcm91bmQsIHNvIHRoYXQgdGhlIGZpcnN0IGJ5dGUgaXMgcG9wcGVkIG9mZgorCSAqIGZpcnN0IChpdCB0ZWxscyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIGNoYXJhY3RlcikuICovCisJcmVwbGFjZV9wdXNoKE5VTCk7CisJZm9yIChpID0gMDsgaSA8IG9sZGxlbjsgKytpKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKG9sZHAgKyBjb2wgKyBpKSAtIDE7CisJICAgIGZvciAoaiA9IGw7IGogPj0gMDsgLS1qKQorCQlyZXBsYWNlX3B1c2gob2xkcFtjb2wgKyBpICsgal0pOworCSAgICBpICs9IGw7CisjZWxzZQorCSAgICByZXBsYWNlX3B1c2gob2xkcFtjb2wgKyBpXSk7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgbmV3cCA9IGFsbG9jX2NoZWNrKCh1bnNpZ25lZCkobGluZWxlbiArIG5ld2xlbiAtIG9sZGxlbikpOworICAgIGlmIChuZXdwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyogQ29weSBieXRlcyBiZWZvcmUgdGhlIGN1cnNvci4gKi8KKyAgICBpZiAoY29sID4gMCkKKwltY2hfbWVtbW92ZShuZXdwLCBvbGRwLCAoc2l6ZV90KWNvbCk7CisKKyAgICAvKiBDb3B5IGJ5dGVzIGFmdGVyIHRoZSBjaGFuZ2VkIGNoYXJhY3RlcihzKS4gKi8KKyAgICBwID0gbmV3cCArIGNvbDsKKyAgICBtY2hfbWVtbW92ZShwICsgbmV3bGVuLCBvbGRwICsgY29sICsgb2xkbGVuLAorCQkJCQkgICAgKHNpemVfdCkobGluZWxlbiAtIGNvbCAtIG9sZGxlbikpOworCisgICAgLyogSW5zZXJ0IG9yIG92ZXJ3cml0ZSB0aGUgbmV3IGNoYXJhY3Rlci4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgbWNoX21lbW1vdmUocCwgYnVmLCBjaGFybGVuKTsKKyAgICBpID0gY2hhcmxlbjsKKyNlbHNlCisgICAgKnAgPSBjOworICAgIGkgPSAxOworI2VuZGlmCisKKyAgICAvKiBGaWxsIHdpdGggc3BhY2VzIHdoZW4gbmVjZXNzYXJ5LiAqLworICAgIHdoaWxlIChpIDwgbmV3bGVuKQorCXBbaSsrXSA9ICcgJzsKKworICAgIC8qIFJlcGxhY2UgdGhlIGxpbmUgaW4gdGhlIGJ1ZmZlci4gKi8KKyAgICBtbF9yZXBsYWNlKGxudW0sIG5ld3AsIEZBTFNFKTsKKworICAgIC8qIG1hcmsgdGhlIGJ1ZmZlciBhcyBjaGFuZ2VkIGFuZCBwcmVwYXJlIGZvciBkaXNwbGF5aW5nICovCisgICAgY2hhbmdlZF9ieXRlcyhsbnVtLCBjb2wpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSdyZSBpbiBJbnNlcnQgb3IgUmVwbGFjZSBtb2RlIGFuZCAnc2hvd21hdGNoJyBpcyBzZXQsIHRoZW4gYnJpZWZseQorICAgICAqIHNob3cgdGhlIG1hdGNoIGZvciByaWdodCBwYXJlbnMgYW5kIGJyYWNlcy4KKyAgICAgKi8KKyAgICBpZiAocF9zbSAmJiAoU3RhdGUgJiBJTlNFUlQpCisJICAgICYmIG1zZ19zaWxlbnQgPT0gMAorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgJiYgY2hhcmxlbiA9PSAxCisjZW5kaWYKKyAgICAgICApCisJc2hvd21hdGNoKGMpOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAoIXBfcmkgfHwgKFN0YXRlICYgUkVQTEFDRV9GTEFHKSkKKyNlbmRpZgorICAgIHsKKwkvKiBOb3JtYWwgaW5zZXJ0OiBtb3ZlIGN1cnNvciByaWdodCAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCArPSBjaGFybGVuOworI2Vsc2UKKwkrK2N1cndpbi0+d19jdXJzb3IuY29sOworI2VuZGlmCisgICAgfQorICAgIC8qCisgICAgICogVE9ETzogc2hvdWxkIHRyeSB0byB1cGRhdGUgd19yb3cgaGVyZSwgdG8gYXZvaWQgcmVjb21wdXRpbmcgaXQgbGF0ZXIuCisgICAgICovCit9CisKKy8qCisgKiBJbnNlcnQgYSBzdHJpbmcgYXQgdGhlIGN1cnNvciBwb3NpdGlvbi4KKyAqIE5vdGU6IERvZXMgTk9UIGhhbmRsZSBSZXBsYWNlIG1vZGUuCisgKiBDYWxsZXIgbXVzdCBoYXZlIHByZXBhcmVkIGZvciB1bmRvLgorICovCisgICAgdm9pZAoraW5zX3N0cihzKQorICAgIGNoYXJfdQkqczsKK3sKKyAgICBjaGFyX3UJKm9sZHAsICpuZXdwOworICAgIGludAkJbmV3bGVuID0gKGludClTVFJMRU4ocyk7CisgICAgaW50CQlvbGRsZW47CisgICAgY29sbnJfVAljb2w7CisgICAgbGluZW5yX1QJbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBpZiAodmlydHVhbF9hY3RpdmUoKSAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDApCisJY29sYWR2YW5jZV9mb3JjZShnZXR2aXNjb2woKSk7CisjZW5kaWYKKworICAgIGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIG9sZHAgPSBtbF9nZXQobG51bSk7CisgICAgb2xkbGVuID0gKGludClTVFJMRU4ob2xkcCk7CisKKyAgICBuZXdwID0gYWxsb2NfY2hlY2soKHVuc2lnbmVkKShvbGRsZW4gKyBuZXdsZW4gKyAxKSk7CisgICAgaWYgKG5ld3AgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgaWYgKGNvbCA+IDApCisJbWNoX21lbW1vdmUobmV3cCwgb2xkcCwgKHNpemVfdCljb2wpOworICAgIG1jaF9tZW1tb3ZlKG5ld3AgKyBjb2wsIHMsIChzaXplX3QpbmV3bGVuKTsKKyAgICBtY2hfbWVtbW92ZShuZXdwICsgY29sICsgbmV3bGVuLCBvbGRwICsgY29sLCAoc2l6ZV90KShvbGRsZW4gLSBjb2wgKyAxKSk7CisgICAgbWxfcmVwbGFjZShsbnVtLCBuZXdwLCBGQUxTRSk7CisgICAgY2hhbmdlZF9ieXRlcyhsbnVtLCBjb2wpOworICAgIGN1cndpbi0+d19jdXJzb3IuY29sICs9IG5ld2xlbjsKK30KKworLyoKKyAqIERlbGV0ZSBvbmUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IuCisgKiBJZiAiZml4cG9zIiBpcyBUUlVFLCBkb24ndCBsZWF2ZSB0aGUgY3Vyc29yIG9uIHRoZSBOVUwgYWZ0ZXIgdGhlIGxpbmUuCisgKiBDYWxsZXIgbXVzdCBoYXZlIHByZXBhcmVkIGZvciB1bmRvLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorZGVsX2NoYXIoZml4cG9zKQorICAgIGludAkJZml4cG9zOworeworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorICAgIHsKKwkvKiBNYWtlIHN1cmUgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIuICovCisJbWJfYWRqdXN0X2N1cnNvcigpOworCWlmICgqbWxfZ2V0X2N1cnNvcigpID09IE5VTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJcmV0dXJuIGRlbF9jaGFycygxTCwgZml4cG9zKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gZGVsX2J5dGVzKDFMLCBmaXhwb3MpOworfQorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIExpa2UgZGVsX2J5dGVzKCksIGJ1dCBkZWxldGUgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIGJ5dGVzLgorICovCisgICAgaW50CitkZWxfY2hhcnMoY291bnQsIGZpeHBvcykKKyAgICBsb25nCWNvdW50OworICAgIGludAkJZml4cG9zOworeworICAgIGxvbmcJYnl0ZXMgPSAwOworICAgIGxvbmcJaTsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlsOworCisgICAgcCA9IG1sX2dldF9jdXJzb3IoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgKnAgIT0gTlVMOyArK2kpCisgICAgeworCWwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCWJ5dGVzICs9IGw7CisJcCArPSBsOworICAgIH0KKyAgICByZXR1cm4gZGVsX2J5dGVzKGJ5dGVzLCBmaXhwb3MpOworfQorI2VuZGlmCisKKy8qCisgKiBEZWxldGUgImNvdW50IiBieXRlcyB1bmRlciB0aGUgY3Vyc29yLgorICogSWYgImZpeHBvcyIgaXMgVFJVRSwgZG9uJ3QgbGVhdmUgdGhlIGN1cnNvciBvbiB0aGUgTlVMIGFmdGVyIHRoZSBsaW5lLgorICogQ2FsbGVyIG11c3QgaGF2ZSBwcmVwYXJlZCBmb3IgdW5kby4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2RlbF9ieXRlcyhjb3VudCwgZml4cG9zKQorICAgIGxvbmcJY291bnQ7CisgICAgaW50CQlmaXhwb3M7Cit7CisgICAgY2hhcl91CSpvbGRwLCAqbmV3cDsKKyAgICBjb2xucl9UCW9sZGxlbjsKKyAgICBsaW5lbnJfVAlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGNvbG5yX1QJY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgaW50CQl3YXNfYWxsb2NlZDsKKyAgICBsb25nCW1vdmVsZW47CisKKyAgICBvbGRwID0gbWxfZ2V0KGxudW0pOworICAgIG9sZGxlbiA9IChpbnQpU1RSTEVOKG9sZHApOworCisgICAgLyoKKyAgICAgKiBDYW4ndCBkbyBhbnl0aGluZyB3aGVuIHRoZSBjdXJzb3IgaXMgb24gdGhlIE5VTCBhZnRlciB0aGUgbGluZS4KKyAgICAgKi8KKyAgICBpZiAoY29sID49IG9sZGxlbikKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBJZiAnZGVsY29tYmluZScgaXMgc2V0IGFuZCBkZWxldGluZyAobGVzcyB0aGFuKSBvbmUgY2hhcmFjdGVyLCBvbmx5CisgICAgICogZGVsZXRlIHRoZSBsYXN0IGNvbWJpbmluZyBjaGFyYWN0ZXIuICovCisgICAgaWYgKHBfZGVjbyAmJiBlbmNfdXRmOCAmJiAoKm1iX3B0cjJsZW5fY2hlY2spKG9sZHAgKyBjb2wpIDw9IGNvdW50KQorICAgIHsKKwlpbnQJYzEsIGMyOworCWludAluOworCisJKHZvaWQpdXRmY19wdHIyY2hhcihvbGRwICsgY29sLCAmYzEsICZjMik7CisJaWYgKGMxICE9IE5VTCkKKwl7CisJICAgIC8qIEZpbmQgdGhlIGxhc3QgY29tcG9zaW5nIGNoYXIsIHRoZXJlIGNhbiBiZSBzZXZlcmFsLiAqLworCSAgICBuID0gY29sOworCSAgICBkbworCSAgICB7CisJCWNvbCA9IG47CisJCWNvdW50ID0gdXRmX3B0cjJsZW5fY2hlY2sob2xkcCArIG4pOworCQluICs9IGNvdW50OworCSAgICB9IHdoaWxlIChVVEZfQ09NUE9TSU5HTElLRShvbGRwICsgY29sLCBvbGRwICsgbikpOworCSAgICBmaXhwb3MgPSAwOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2hlbiBjb3VudCBpcyB0b28gYmlnLCByZWR1Y2UgaXQuCisgICAgICovCisgICAgbW92ZWxlbiA9IChsb25nKW9sZGxlbiAtIChsb25nKWNvbCAtIGNvdW50ICsgMTsgLyogaW5jbHVkZXMgdHJhaWxpbmcgTlVMICovCisgICAgaWYgKG1vdmVsZW4gPD0gMSkKKyAgICB7CisJLyoKKwkgKiBJZiB3ZSBqdXN0IHRvb2sgb2ZmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIG5vbi1ibGFuayBsaW5lLCBhbmQKKwkgKiBmaXhwb3MgaXMgVFJVRSwgd2UgZG9uJ3Qgd2FudCB0byBlbmQgdXAgcG9zaXRpb25lZCBhdCB0aGUgTlVMLgorCSAqLworCWlmIChjb2wgPiAwICYmIGZpeHBvcykKKwl7CisJICAgIC0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWN1cndpbi0+d19jdXJzb3IuY29sIC09CisJCQkgICAgKCptYl9oZWFkX29mZikob2xkcCwgb2xkcCArIGN1cndpbi0+d19jdXJzb3IuY29sKTsKKyNlbmRpZgorCX0KKwljb3VudCA9IG9sZGxlbiAtIGNvbDsKKwltb3ZlbGVuID0gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBvbGQgbGluZSBoYXMgYmVlbiBhbGxvY2F0ZWQgdGhlIGRlbGV0aW9uIGNhbiBiZSBkb25lIGluIHRoZQorICAgICAqIGV4aXN0aW5nIGxpbmUuIE90aGVyd2lzZSBhIG5ldyBsaW5lIGhhcyB0byBiZSBhbGxvY2F0ZWQKKyAgICAgKi8KKyAgICB3YXNfYWxsb2NlZCA9IG1sX2xpbmVfYWxsb2NlZCgpOwkgICAgLyogY2hlY2sgaWYgb2xkcCB3YXMgYWxsb2NhdGVkICovCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKHdhc19hbGxvY2VkICYmIHVzaW5nTmV0YmVhbnMpCisJbmV0YmVhbnNfcmVtb3ZlZChjdXJidWYsIGxudW0sIGNvbCwgY291bnQpOworICAgIC8qIGVsc2UgaXMgaGFuZGxlZCBieSBtbF9yZXBsYWNlKCkgKi8KKyNlbmRpZgorICAgIGlmICh3YXNfYWxsb2NlZCkKKwluZXdwID0gb2xkcDsJCQkgICAgLyogdXNlIHNhbWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGVsc2UKKyAgICB7CQkJCQkgICAgLyogbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBsaW5lICovCisJbmV3cCA9IGFsbG9jKCh1bnNpZ25lZCkob2xkbGVuICsgMSAtIGNvdW50KSk7CisJaWYgKG5ld3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJbWNoX21lbW1vdmUobmV3cCwgb2xkcCwgKHNpemVfdCljb2wpOworICAgIH0KKyAgICBtY2hfbWVtbW92ZShuZXdwICsgY29sLCBvbGRwICsgY29sICsgY291bnQsIChzaXplX3QpbW92ZWxlbik7CisgICAgaWYgKCF3YXNfYWxsb2NlZCkKKwltbF9yZXBsYWNlKGxudW0sIG5ld3AsIEZBTFNFKTsKKworICAgIC8qIG1hcmsgdGhlIGJ1ZmZlciBhcyBjaGFuZ2VkIGFuZCBwcmVwYXJlIGZvciBkaXNwbGF5aW5nICovCisgICAgY2hhbmdlZF9ieXRlcyhsbnVtLCBjdXJ3aW4tPndfY3Vyc29yLmNvbCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBEZWxldGUgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUuCisgKiBDYWxsZXIgbXVzdCBoYXZlIHByZXBhcmVkIGZvciB1bmRvLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAordHJ1bmNhdGVfbGluZShmaXhwb3MpCisgICAgaW50CQlmaXhwb3M7CSAgICAvKiBpZiBUUlVFIGZpeCB0aGUgY3Vyc29yIHBvc2l0aW9uIHdoZW4gZG9uZSAqLworeworICAgIGNoYXJfdQkqbmV3cDsKKyAgICBsaW5lbnJfVAlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGNvbG5yX1QJY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisKKyAgICBpZiAoY29sID09IDApCisJbmV3cCA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikiIik7CisgICAgZWxzZQorCW5ld3AgPSB2aW1fc3RybnNhdmUobWxfZ2V0KGxudW0pLCBjb2wpOworCisgICAgaWYgKG5ld3AgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIG1sX3JlcGxhY2UobG51bSwgbmV3cCwgRkFMU0UpOworCisgICAgLyogbWFyayB0aGUgYnVmZmVyIGFzIGNoYW5nZWQgYW5kIHByZXBhcmUgZm9yIGRpc3BsYXlpbmcgKi8KKyAgICBjaGFuZ2VkX2J5dGVzKGxudW0sIGN1cndpbi0+d19jdXJzb3IuY29sKTsKKworICAgIC8qCisgICAgICogSWYgImZpeHBvcyIgaXMgVFJVRSB3ZSBkb24ndCB3YW50IHRvIGVuZCB1cCBwb3NpdGlvbmVkIGF0IHRoZSBOVUwuCisgICAgICovCisgICAgaWYgKGZpeHBvcyAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDApCisJLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIERlbGV0ZSAibmxpbmVzIiBsaW5lcyBhdCB0aGUgY3Vyc29yLgorICogU2F2ZXMgdGhlIGxpbmVzIGZvciB1bmRvIGZpcnN0IGlmICJ1bmRvIiBpcyBUUlVFLgorICovCisgICAgdm9pZAorZGVsX2xpbmVzKG5saW5lcywgdW5kbykKKyAgICBsb25nCW5saW5lczsJCS8qIG51bWJlciBvZiBsaW5lcyB0byBkZWxldGUgKi8KKyAgICBpbnQJCXVuZG87CQkvKiBpZiBUUlVFLCBwcmVwYXJlIGZvciB1bmRvICovCit7CisgICAgbG9uZwluOworCisgICAgaWYgKG5saW5lcyA8PSAwKQorCXJldHVybjsKKworICAgIC8qIHNhdmUgdGhlIGRlbGV0ZWQgbGluZXMgZm9yIHVuZG8gKi8KKyAgICBpZiAodW5kbyAmJiB1X3NhdmVkZWwoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBubGluZXMpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgZm9yIChuID0gMDsgbiA8IG5saW5lczsgKQorICAgIHsKKwlpZiAoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpCSAgICAvKiBub3RoaW5nIHRvIGRlbGV0ZSAqLworCSAgICBicmVhazsKKworCW1sX2RlbGV0ZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIFRSVUUpOworCSsrbjsKKworCS8qIElmIHdlIGRlbGV0ZSB0aGUgbGFzdCBsaW5lIGluIHRoZSBmaWxlLCBzdG9wICovCisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICBicmVhazsKKyAgICB9CisgICAgLyogYWRqdXN0IG1hcmtzLCBtYXJrIHRoZSBidWZmZXIgYXMgY2hhbmdlZCBhbmQgcHJlcGFyZSBmb3IgZGlzcGxheWluZyAqLworICAgIGRlbGV0ZWRfbGluZXNfbWFyayhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG4pOworCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIGNoZWNrX2N1cnNvcl9sbnVtKCk7Cit9CisKKyAgICBpbnQKK2djaGFyX3Bvcyhwb3MpCisgICAgcG9zX1QgKnBvczsKK3sKKyAgICBjaGFyX3UJKnB0ciA9IG1sX2dldF9wb3MocG9zKTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorCXJldHVybiAoKm1iX3B0cjJjaGFyKShwdHIpOworI2VuZGlmCisgICAgcmV0dXJuIChpbnQpKnB0cjsKK30KKworICAgIGludAorZ2NoYXJfY3Vyc29yKCkKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSkKKwlyZXR1cm4gKCptYl9wdHIyY2hhcikobWxfZ2V0X2N1cnNvcigpKTsKKyNlbmRpZgorICAgIHJldHVybiAoaW50KSptbF9nZXRfY3Vyc29yKCk7Cit9CisKKy8qCisgKiBXcml0ZSBhIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisgKiBJdCBpcyBkaXJlY3RseSB3cml0dGVuIGludG8gdGhlIGJsb2NrLgorICovCisgICAgdm9pZAorcGNoYXJfY3Vyc29yKGMpCisgICAgaW50IGM7Cit7CisgICAgKihtbF9nZXRfYnVmKGN1cmJ1ZiwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBUUlVFKQorCQkJCQkJICArIGN1cndpbi0+d19jdXJzb3IuY29sKSA9IGM7Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisvKgorICogUHV0ICpwb3MgYXQgZW5kIG9mIGN1cnJlbnQgYnVmZmVyCisgKi8KKyAgICB2b2lkCitnb3RvX2VuZG9mYnVmKHBvcykKKyAgICBwb3NfVCAgICAqcG9zOworeworICAgIGNoYXJfdSAgKnA7CisKKyAgICBwb3MtPmxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBwb3MtPmNvbCA9IDA7CisgICAgcCA9IG1sX2dldChwb3MtPmxudW0pOworICAgIHdoaWxlICgqcCsrKQorCSsrcG9zLT5jb2w7Cit9CisjZW5kaWYKKworLyoKKyAqIFdoZW4gZXh0cmEgPT0gMDogUmV0dXJuIFRSVUUgaWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgb3Igb24gdGhlIGZpcnN0CisgKgkJICAgIG5vbi1ibGFuayBpbiB0aGUgbGluZS4KKyAqIFdoZW4gZXh0cmEgPT0gMTogUmV0dXJuIFRSVUUgaWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IG5vbi1ibGFuayBpbgorICoJCSAgICB0aGUgbGluZS4KKyAqLworICAgIGludAoraW5pbmRlbnQoZXh0cmEpCisgICAgaW50CSAgICBleHRyYTsKK3sKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBjb2xucl9UCWNvbDsKKworICAgIGZvciAoY29sID0gMCwgcHRyID0gbWxfZ2V0X2N1cmxpbmUoKTsgdmltX2lzd2hpdGUoKnB0cik7ICsrY29sKQorCSsrcHRyOworICAgIGlmIChjb2wgPj0gY3Vyd2luLT53X2N1cnNvci5jb2wgKyBleHRyYSkKKwlyZXR1cm4gVFJVRTsKKyAgICBlbHNlCisJcmV0dXJuIEZBTFNFOworfQorCisvKgorICogU2tpcCB0byBuZXh0IHBhcnQgb2YgYW4gb3B0aW9uIGFyZ3VtZW50OiBTa2lwIHNwYWNlIGFuZCBjb21tYS4KKyAqLworICAgIGNoYXJfdSAqCitza2lwX3RvX29wdGlvbl9wYXJ0KHApCisgICAgY2hhcl91ICAqcDsKK3sKKyAgICBpZiAoKnAgPT0gJywnKQorCSsrcDsKKyAgICB3aGlsZSAoKnAgPT0gJyAnKQorCSsrcDsKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyAqIGNoYW5nZWQoKSBpcyBjYWxsZWQgd2hlbiBzb21ldGhpbmcgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGNoYW5nZWQuCisgKgorICogTW9zdCBvZnRlbiBjYWxsZWQgdGhyb3VnaCBjaGFuZ2VkX2J5dGVzKCkgYW5kIGNoYW5nZWRfbGluZXMoKSwgd2hpY2ggYWxzbworICogbWFyayB0aGUgYXJlYSBvZiB0aGUgZGlzcGxheSB0byBiZSByZWRyYXduLgorICovCisgICAgdm9pZAorY2hhbmdlZCgpCit7CisjaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspCisgICAgLyogVGhlIHRleHQgb2YgdGhlIHByZWVkaXRpbmcgYXJlYSBpcyBpbnNlcnRlZCwgYnV0IHRoaXMgZG9lc24ndAorICAgICAqIG1lYW4gYSBjaGFuZ2Ugb2YgdGhlIGJ1ZmZlciB5ZXQuICBUaGF0IGlzIGRlbGF5ZWQgdW50aWwgdGhlCisgICAgICogdGV4dCBpcyBjb21taXR0ZWQuICh0aGlzIG1lYW5zIHByZWVkaXQgYmVjb21lcyBlbXB0eSkgKi8KKyAgICBpZiAoaW1faXNfcHJlZWRpdGluZygpICYmICF4aW1fY2hhbmdlZF93aGlsZV9wcmVlZGl0aW5nKQorCXJldHVybjsKKyAgICB4aW1fY2hhbmdlZF93aGlsZV9wcmVlZGl0aW5nID0gRkFMU0U7CisjZW5kaWYKKworICAgIGlmICghY3VyYnVmLT5iX2NoYW5nZWQpCisgICAgeworCWludAlzYXZlX21zZ19zY3JvbGwgPSBtc2dfc2Nyb2xsOworCisJY2hhbmdlX3dhcm5pbmcoMCk7CisJLyogQ3JlYXRlIGEgc3dhcCBmaWxlIGlmIHRoYXQgaXMgd2FudGVkLgorCSAqIERvbid0IGRvIHRoaXMgZm9yICJub2ZpbGUiIGFuZCAibm93cml0ZSIgYnVmZmVyIHR5cGVzLiAqLworCWlmIChjdXJidWYtPmJfbWF5X3N3YXAKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCSYmICFidF9kb250d3JpdGUoY3VyYnVmKQorI2VuZGlmCisJCSkKKwl7CisJICAgIG1sX29wZW5fZmlsZShjdXJidWYpOworCisJICAgIC8qIFRoZSBtbF9vcGVuX2ZpbGUoKSBjYW4gY2F1c2UgYW4gQVRURU5USU9OIG1lc3NhZ2UuCisJICAgICAqIFdhaXQgdHdvIHNlY29uZHMsIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciByZWFkcyB0aGlzIHVuZXhwZWN0ZWQKKwkgICAgICogbWVzc2FnZS4gIFNpbmNlIHdlIGNvdWxkIGJlIGFueXdoZXJlLCBjYWxsIHdhaXRfcmV0dXJuKCkgbm93LAorCSAgICAgKiBhbmQgZG9uJ3QgbGV0IHRoZSBlbXNnKCkgc2V0IG1zZ19zY3JvbGwuICovCisJICAgIGlmIChuZWVkX3dhaXRfcmV0dXJuICYmIGVtc2dfc2lsZW50ID09IDApCisJICAgIHsKKwkJb3V0X2ZsdXNoKCk7CisJCXVpX2RlbGF5KDIwMDBMLCBUUlVFKTsKKwkJd2FpdF9yZXR1cm4oVFJVRSk7CisJCW1zZ19zY3JvbGwgPSBzYXZlX21zZ19zY3JvbGw7CisJICAgIH0KKwl9CisJY3VyYnVmLT5iX2NoYW5nZWQgPSBUUlVFOworCW1sX3NldGRpcnR5KGN1cmJ1ZiwgVFJVRSk7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJY2hlY2tfc3RhdHVzKGN1cmJ1Zik7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1RJVExFCisJbmVlZF9tYWtldGl0bGUgPSBUUlVFOwkgICAgLyogc2V0IHdpbmRvdyB0aXRsZSBsYXRlciAqLworI2VuZGlmCisgICAgfQorICAgICsrY3VyYnVmLT5iX2NoYW5nZWR0aWNrOworICAgICsrZ2xvYmFsX2NoYW5nZWR0aWNrOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VkT25lbGluZSBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK3N0YXRpYyB2b2lkIGNoYW5nZWRfY29tbW9uIF9fQVJHUygobGluZW5yX1QgbG51bSwgY29sbnJfVCBjb2wsIGxpbmVucl9UIGxudW1lLCBsb25nIHh0cmEpKTsKKworLyoKKyAqIENoYW5nZWQgYnl0ZXMgd2l0aGluIGEgc2luZ2xlIGxpbmUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAqIC0gbWFya3MgdGhlIHdpbmRvd3Mgb24gdGhpcyBidWZmZXIgdG8gYmUgcmVkaXNwbGF5ZWQKKyAqIC0gbWFya3MgdGhlIGJ1ZmZlciBjaGFuZ2VkIGJ5IGNhbGxpbmcgY2hhbmdlZCgpCisgKiAtIGludmFsaWRhdGVzIGNhY2hlZCB2YWx1ZXMKKyAqLworICAgIHZvaWQKK2NoYW5nZWRfYnl0ZXMobG51bSwgY29sKQorICAgIGxpbmVucl9UCWxudW07CisgICAgY29sbnJfVAljb2w7Cit7CisgICAgY2hhbmdlZE9uZWxpbmUobG51bSk7CisgICAgY2hhbmdlZF9jb21tb24obG51bSwgY29sLCBsbnVtICsgMSwgMEwpOworfQorCisgICAgc3RhdGljIHZvaWQKK2NoYW5nZWRPbmVsaW5lKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBpZiAoY3VyYnVmLT5iX21vZF9zZXQpCisgICAgeworCS8qIGZpbmQgdGhlIG1heGltdW0gYXJlYSB0aGF0IG11c3QgYmUgcmVkaXNwbGF5ZWQgKi8KKwlpZiAobG51bSA8IGN1cmJ1Zi0+Yl9tb2RfdG9wKQorCSAgICBjdXJidWYtPmJfbW9kX3RvcCA9IGxudW07CisJZWxzZSBpZiAobG51bSA+PSBjdXJidWYtPmJfbW9kX2JvdCkKKwkgICAgY3VyYnVmLT5iX21vZF9ib3QgPSBsbnVtICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBzZXQgdGhlIGFyZWEgdGhhdCBtdXN0IGJlIHJlZGlzcGxheWVkIHRvIG9uZSBsaW5lICovCisJY3VyYnVmLT5iX21vZF9zZXQgPSBUUlVFOworCWN1cmJ1Zi0+Yl9tb2RfdG9wID0gbG51bTsKKwljdXJidWYtPmJfbW9kX2JvdCA9IGxudW0gKyAxOworCWN1cmJ1Zi0+Yl9tb2RfeGxpbmVzID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBBcHBlbmRlZCAiY291bnQiIGxpbmVzIGJlbG93IGxpbmUgImxudW0iIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAqIE11c3QgYmUgY2FsbGVkIEFGVEVSIHRoZSBjaGFuZ2UgYW5kIGFmdGVyIG1hcmtfYWRqdXN0KCkuCisgKiBUYWtlcyBjYXJlIG9mIG1hcmtpbmcgdGhlIGJ1ZmZlciB0byBiZSByZWRyYXduIGFuZCBzZXRzIHRoZSBjaGFuZ2VkIGZsYWcuCisgKi8KKyAgICB2b2lkCithcHBlbmRlZF9saW5lcyhsbnVtLCBjb3VudCkKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxvbmcJY291bnQ7Cit7CisgICAgY2hhbmdlZF9saW5lcyhsbnVtICsgMSwgMCwgbG51bSArIDEsIGNvdW50KTsKK30KKworLyoKKyAqIExpa2UgYXBwZW5kZWRfbGluZXMoKSwgYnV0IGFkanVzdCBtYXJrcyBmaXJzdC4KKyAqLworICAgIHZvaWQKK2FwcGVuZGVkX2xpbmVzX21hcmsobG51bSwgY291bnQpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBsb25nCWNvdW50OworeworICAgIG1hcmtfYWRqdXN0KGxudW0gKyAxLCAobGluZW5yX1QpTUFYTE5VTSwgY291bnQsIDBMKTsKKyAgICBjaGFuZ2VkX2xpbmVzKGxudW0gKyAxLCAwLCBsbnVtICsgMSwgY291bnQpOworfQorCisvKgorICogRGVsZXRlZCAiY291bnQiIGxpbmVzIGF0IGxpbmUgImxudW0iIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAqIE11c3QgYmUgY2FsbGVkIEFGVEVSIHRoZSBjaGFuZ2UgYW5kIGFmdGVyIG1hcmtfYWRqdXN0KCkuCisgKiBUYWtlcyBjYXJlIG9mIG1hcmtpbmcgdGhlIGJ1ZmZlciB0byBiZSByZWRyYXduIGFuZCBzZXRzIHRoZSBjaGFuZ2VkIGZsYWcuCisgKi8KKyAgICB2b2lkCitkZWxldGVkX2xpbmVzKGxudW0sIGNvdW50KQorICAgIGxpbmVucl9UCWxudW07CisgICAgbG9uZwljb3VudDsKK3sKKyAgICBjaGFuZ2VkX2xpbmVzKGxudW0sIDAsIGxudW0gKyBjb3VudCwgLWNvdW50KTsKK30KKworLyoKKyAqIExpa2UgZGVsZXRlZF9saW5lcygpLCBidXQgYWRqdXN0IG1hcmtzIGZpcnN0LgorICovCisgICAgdm9pZAorZGVsZXRlZF9saW5lc19tYXJrKGxudW0sIGNvdW50KQorICAgIGxpbmVucl9UCWxudW07CisgICAgbG9uZwljb3VudDsKK3sKKyAgICBtYXJrX2FkanVzdChsbnVtLCAobGluZW5yX1QpKGxudW0gKyBjb3VudCAtIDEpLCAobG9uZylNQVhMTlVNLCAtY291bnQpOworICAgIGNoYW5nZWRfbGluZXMobG51bSwgMCwgbG51bSArIGNvdW50LCAtY291bnQpOworfQorCisvKgorICogQ2hhbmdlZCBsaW5lcyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLgorICogTXVzdCBiZSBjYWxsZWQgQUZURVIgdGhlIGNoYW5nZSBhbmQgYWZ0ZXIgbWFya19hZGp1c3QoKS4KKyAqIC0gbWFyayB0aGUgYnVmZmVyIGNoYW5nZWQgYnkgY2FsbGluZyBjaGFuZ2VkKCkKKyAqIC0gbWFyayB0aGUgd2luZG93cyBvbiB0aGlzIGJ1ZmZlciB0byBiZSByZWRpc3BsYXllZAorICogLSBpbnZhbGlkYXRlIGNhY2hlZCB2YWx1ZXMKKyAqICJsbnVtIiBpcyB0aGUgZmlyc3QgbGluZSB0aGF0IG5lZWRzIGRpc3BsYXlpbmcsICJsbnVtZSIgdGhlIGZpcnN0IGxpbmUKKyAqIGJlbG93IHRoZSBjaGFuZ2VkIGxpbmVzIChCRUZPUkUgdGhlIGNoYW5nZSkuCisgKiBXaGVuIG9ubHkgaW5zZXJ0aW5nIGxpbmVzLCAibG51bSIgYW5kICJsbnVtZSIgYXJlIGVxdWFsLgorICogVGFrZXMgY2FyZSBvZiBjYWxsaW5nIGNoYW5nZWQoKSBhbmQgdXBkYXRpbmcgYl9tb2RfKi4KKyAqLworICAgIHZvaWQKK2NoYW5nZWRfbGluZXMobG51bSwgY29sLCBsbnVtZSwgeHRyYSkKKyAgICBsaW5lbnJfVAlsbnVtOwkgICAgLyogZmlyc3QgbGluZSB3aXRoIGNoYW5nZSAqLworICAgIGNvbG5yX1QJY29sOwkgICAgLyogY29sdW1uIGluIGZpcnN0IGxpbmUgd2l0aCBjaGFuZ2UgKi8KKyAgICBsaW5lbnJfVAlsbnVtZTsJICAgIC8qIGxpbmUgYmVsb3cgbGFzdCBjaGFuZ2VkIGxpbmUgKi8KKyAgICBsb25nCXh0cmE7CSAgICAvKiBudW1iZXIgb2YgZXh0cmEgbGluZXMgKG5lZ2F0aXZlIHdoZW4gZGVsZXRpbmcpICovCit7CisgICAgaWYgKGN1cmJ1Zi0+Yl9tb2Rfc2V0KQorICAgIHsKKwkvKiBmaW5kIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCBtdXN0IGJlIHJlZGlzcGxheWVkICovCisJaWYgKGxudW0gPCBjdXJidWYtPmJfbW9kX3RvcCkKKwkgICAgY3VyYnVmLT5iX21vZF90b3AgPSBsbnVtOworCWlmIChsbnVtIDwgY3VyYnVmLT5iX21vZF9ib3QpCisJeworCSAgICAvKiBhZGp1c3Qgb2xkIGJvdCBwb3NpdGlvbiBmb3IgeHRyYSBsaW5lcyAqLworCSAgICBjdXJidWYtPmJfbW9kX2JvdCArPSB4dHJhOworCSAgICBpZiAoY3VyYnVmLT5iX21vZF9ib3QgPCBsbnVtKQorCQljdXJidWYtPmJfbW9kX2JvdCA9IGxudW07CisJfQorCWlmIChsbnVtZSArIHh0cmEgPiBjdXJidWYtPmJfbW9kX2JvdCkKKwkgICAgY3VyYnVmLT5iX21vZF9ib3QgPSBsbnVtZSArIHh0cmE7CisJY3VyYnVmLT5iX21vZF94bGluZXMgKz0geHRyYTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBzZXQgdGhlIGFyZWEgdGhhdCBtdXN0IGJlIHJlZGlzcGxheWVkICovCisJY3VyYnVmLT5iX21vZF9zZXQgPSBUUlVFOworCWN1cmJ1Zi0+Yl9tb2RfdG9wID0gbG51bTsKKwljdXJidWYtPmJfbW9kX2JvdCA9IGxudW1lICsgeHRyYTsKKwljdXJidWYtPmJfbW9kX3hsaW5lcyA9IHh0cmE7CisgICAgfQorCisgICAgY2hhbmdlZF9jb21tb24obG51bSwgY29sLCBsbnVtZSwgeHRyYSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY2hhbmdlZF9jb21tb24obG51bSwgY29sLCBsbnVtZSwgeHRyYSkKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNvbG5yX1QJY29sOworICAgIGxpbmVucl9UCWxudW1lOworICAgIGxvbmcJeHRyYTsKK3sKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQlpOworI2lmZGVmIEZFQVRfSlVNUExJU1QKKyAgICBpbnQJCWNvbHM7CisgICAgcG9zX1QJKnA7CisgICAgaW50CQlhZGQ7CisjZW5kaWYKKworICAgIC8qIG1hcmsgdGhlIGJ1ZmZlciBhcyBtb2RpZmllZCAqLworICAgIGNoYW5nZWQoKTsKKworICAgIC8qIHNldCB0aGUgJy4gbWFyayAqLworICAgIGlmICghY21kbW9kLmtlZXBqdW1wcykKKyAgICB7CisJY3VyYnVmLT5iX2xhc3RfY2hhbmdlLmxudW0gPSBsbnVtOworCWN1cmJ1Zi0+Yl9sYXN0X2NoYW5nZS5jb2wgPSBjb2w7CisKKyNpZmRlZiBGRUFUX0pVTVBMSVNUCisJLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGlmIGEgbmV3IHVuZG8tYWJsZSBjaGFuZ2Ugd2FzIHN0YXJ0ZWQgb3Igd2UKKwkgKiBkb24ndCBoYXZlIGFuIGVudHJ5IHlldC4gKi8KKwlpZiAoY3VyYnVmLT5iX25ld19jaGFuZ2UgfHwgY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW4gPT0gMCkKKwl7CisJICAgIGlmIChjdXJidWYtPmJfY2hhbmdlbGlzdGxlbiA9PSAwKQorCQlhZGQgPSBUUlVFOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogRG9uJ3QgY3JlYXRlIGEgbmV3IGVudHJ5IHdoZW4gdGhlIGxpbmUgbnVtYmVyIGlzIHRoZSBzYW1lCisJCSAqIGFzIHRoZSBsYXN0IG9uZSBhbmQgdGhlIGNvbHVtbiBpcyBub3QgdG9vIGZhciBhd2F5LiAgQXZvaWRzCisJCSAqIGNyZWF0aW5nIG1hbnkgZW50cmllcyBmb3IgdHlwaW5nICJ4eHh4eCIuICovCisJCXAgPSAmY3VyYnVmLT5iX2NoYW5nZWxpc3RbY3VyYnVmLT5iX2NoYW5nZWxpc3RsZW4gLSAxXTsKKwkJaWYgKHAtPmxudW0gIT0gbG51bSkKKwkJICAgIGFkZCA9IFRSVUU7CisJCWVsc2UKKwkJeworCQkgICAgY29scyA9IGNvbXBfdGV4dHdpZHRoKEZBTFNFKTsKKwkJICAgIGlmIChjb2xzID09IDApCisJCQljb2xzID0gNzk7CisJCSAgICBhZGQgPSAocC0+Y29sICsgY29scyA8IGNvbCB8fCBjb2wgKyBjb2xzIDwgcC0+Y29sKTsKKwkJfQorCSAgICB9CisJICAgIGlmIChhZGQpCisJICAgIHsKKwkJLyogVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBuZXcgc2VxdWVuY2Ugb2YgdW5kby1hYmxlIGNoYW5nZXMKKwkJICogYW5kIGl0J3MgYXQgc29tZSBkaXN0YW5jZSBvZiB0aGUgbGFzdCBjaGFuZ2UuICBVc2UgYSBuZXcKKwkJICogcG9zaXRpb24gaW4gdGhlIGNoYW5nZWxpc3QuICovCisJCWN1cmJ1Zi0+Yl9uZXdfY2hhbmdlID0gRkFMU0U7CisKKwkJaWYgKGN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuID09IEpVTVBMSVNUU0laRSkKKwkJeworCQkgICAgLyogY2hhbmdlbGlzdCBpcyBmdWxsOiByZW1vdmUgb2xkZXN0IGVudHJ5ICovCisJCSAgICBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbiA9IEpVTVBMSVNUU0laRSAtIDE7CisJCSAgICBtY2hfbWVtbW92ZShjdXJidWYtPmJfY2hhbmdlbGlzdCwgY3VyYnVmLT5iX2NoYW5nZWxpc3QgKyAxLAorCQkJCQkgIHNpemVvZihwb3NfVCkgKiAoSlVNUExJU1RTSVpFIC0gMSkpOworCQkgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorCQkgICAgeworCQkJLyogQ29ycmVjdCBwb3NpdGlvbiBpbiBjaGFuZ2VsaXN0IGZvciBvdGhlciB3aW5kb3dzIG9uCisJCQkgKiB0aGlzIGJ1ZmZlci4gKi8KKwkJCWlmICh3cC0+d19idWZmZXIgPT0gY3VyYnVmICYmIHdwLT53X2NoYW5nZWxpc3RpZHggPiAwKQorCQkJICAgIC0td3AtPndfY2hhbmdlbGlzdGlkeDsKKwkJICAgIH0KKwkJfQorCQlGT1JfQUxMX1dJTkRPV1Mod3ApCisJCXsKKwkJICAgIC8qIEZvciBvdGhlciB3aW5kb3dzLCBpZiB0aGUgcG9zaXRpb24gaW4gdGhlIGNoYW5nZWxpc3QgaXMKKwkJICAgICAqIGF0IHRoZSBlbmQgaXQgc3RheXMgYXQgdGhlIGVuZC4gKi8KKwkJICAgIGlmICh3cC0+d19idWZmZXIgPT0gY3VyYnVmCisJCQkgICAgJiYgd3AtPndfY2hhbmdlbGlzdGlkeCA9PSBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbikKKwkJCSsrd3AtPndfY2hhbmdlbGlzdGlkeDsKKwkJfQorCQkrK2N1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuOworCSAgICB9CisJfQorCWN1cmJ1Zi0+Yl9jaGFuZ2VsaXN0W2N1cmJ1Zi0+Yl9jaGFuZ2VsaXN0bGVuIC0gMV0gPQorCQkJCQkJCWN1cmJ1Zi0+Yl9sYXN0X2NoYW5nZTsKKwkvKiBUaGUgY3VycmVudCB3aW5kb3cgaXMgYWx3YXlzIGFmdGVyIHRoZSBsYXN0IGNoYW5nZSwgc28gdGhhdCAiZywiCisJICogdGFrZXMgeW91IGJhY2sgdG8gaXQuICovCisJY3Vyd2luLT53X2NoYW5nZWxpc3RpZHggPSBjdXJidWYtPmJfY2hhbmdlbGlzdGxlbjsKKyNlbmRpZgorICAgIH0KKworICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKyAgICB7CisJaWYgKHdwLT53X2J1ZmZlciA9PSBjdXJidWYpCisJeworCSAgICAvKiBNYXJrIHRoaXMgd2luZG93IHRvIGJlIHJlZHJhd24gbGF0ZXIuICovCisJICAgIGlmICh3cC0+d19yZWRyX3R5cGUgPCBWQUxJRCkKKwkJd3AtPndfcmVkcl90eXBlID0gVkFMSUQ7CisKKwkgICAgLyogQ2hlY2sgaWYgYSBjaGFuZ2UgaW4gdGhlIGJ1ZmZlciBoYXMgaW52YWxpZGF0ZWQgdGhlIGNhY2hlZAorCSAgICAgKiB2YWx1ZXMgZm9yIHRoZSBjdXJzb3IuICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIC8qCisJICAgICAqIFVwZGF0ZSB0aGUgZm9sZHMgZm9yIHRoaXMgd2luZG93LiAgQ2FuJ3QgcG9zdHBvbmUgdGhpcywgYmVjYXVzZQorCSAgICAgKiBhIGZvbGxvd2luZyBvcGVyYXRvciBtaWdodCB3b3JrIG9uIHRoZSB3aG9sZSBmb2xkOiAiPj5kZCIuCisJICAgICAqLworCSAgICBmb2xkVXBkYXRlKHdwLCBsbnVtLCBsbnVtZSArIHh0cmEgLSAxKTsKKworCSAgICAvKiBUaGUgY2hhbmdlIG1heSBjYXVzZSBsaW5lcyBhYm92ZSBvciBiZWxvdyB0aGUgY2hhbmdlIHRvIGJlY29tZQorCSAgICAgKiBpbmNsdWRlZCBpbiBhIGZvbGQuICBTZXQgbG51bS9sbnVtZSB0byB0aGUgZmlyc3QvbGFzdCBsaW5lIHRoYXQKKwkgICAgICogbWlnaHQgYmUgZGlzcGxheWVkIGRpZmZlcmVudGx5LgorCSAgICAgKiBTZXQgd19jbGluZV9mb2xkZWQgaGVyZSBhcyBhbiBlZmZpY2llbnQgd2F5IHRvIHVwZGF0ZSBpdCB3aGVuCisJICAgICAqIGluc2VydGluZyBsaW5lcyBqdXN0IGFib3ZlIGEgY2xvc2VkIGZvbGQuICovCisJICAgIGkgPSBoYXNGb2xkaW5nV2luKHdwLCBsbnVtLCAmbG51bSwgTlVMTCwgRkFMU0UsIE5VTEwpOworCSAgICBpZiAod3AtPndfY3Vyc29yLmxudW0gPT0gbG51bSkKKwkJd3AtPndfY2xpbmVfZm9sZGVkID0gaTsKKwkgICAgaSA9IGhhc0ZvbGRpbmdXaW4od3AsIGxudW1lLCBOVUxMLCAmbG51bWUsIEZBTFNFLCBOVUxMKTsKKwkgICAgaWYgKHdwLT53X2N1cnNvci5sbnVtID09IGxudW1lKQorCQl3cC0+d19jbGluZV9mb2xkZWQgPSBpOworCisJICAgIC8qIElmIHRoZSBjaGFuZ2VkIGxpbmUgaXMgaW4gYSByYW5nZSBvZiBwcmV2aW91c2x5IGZvbGRlZCBsaW5lcywKKwkgICAgICogY29tcGFyZSB3aXRoIHRoZSBmaXJzdCBsaW5lIGluIHRoYXQgcmFuZ2UuICovCisJICAgIGlmICh3cC0+d19jdXJzb3IubG51bSA8PSBsbnVtKQorCSAgICB7CisJCWkgPSBmaW5kX3dsX2VudHJ5KHdwLCBsbnVtKTsKKwkJaWYgKGkgPj0gMCAmJiB3cC0+d19jdXJzb3IubG51bSA+IHdwLT53X2xpbmVzW2ldLndsX2xudW0pCisJCSAgICBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnNfd2luKHdwKTsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgaWYgKHdwLT53X2N1cnNvci5sbnVtID4gbG51bSkKKwkJY2hhbmdlZF9saW5lX2Fidl9jdXJzX3dpbih3cCk7CisJICAgIGVsc2UgaWYgKHdwLT53X2N1cnNvci5sbnVtID09IGxudW0gJiYgd3AtPndfY3Vyc29yLmNvbCA+PSBjb2wpCisJCWNoYW5nZWRfY2xpbmVfYmVmX2N1cnNfd2luKHdwKTsKKwkgICAgaWYgKHdwLT53X2JvdGxpbmUgPj0gbG51bSkKKwkgICAgeworCQkvKiBBc3N1bWUgdGhhdCBib3RsaW5lIGRvZXNuJ3QgY2hhbmdlIChpbnNlcnRlZCBsaW5lcyBtYWtlCisJCSAqIG90aGVyIGxpbmVzIHNjcm9sbCBkb3duIGJlbG93IGJvdGxpbmUpLiAqLworCQlhcHByb3hpbWF0ZV9ib3RsaW5lX3dpbih3cCk7CisJICAgIH0KKworCSAgICAvKiBDaGVjayBpZiBhbnkgd19saW5lc1tdIGVudHJpZXMgaGF2ZSBiZWNvbWUgaW52YWxpZC4KKwkgICAgICogRm9yIGVudHJpZXMgYmVsb3cgdGhlIGNoYW5nZTogQ29ycmVjdCB0aGUgbG51bXMgZm9yCisJICAgICAqIGluc2VydGVkL2RlbGV0ZWQgbGluZXMuICBNYWtlcyBpdCBwb3NzaWJsZSB0byBzdG9wIGRpc3BsYXlpbmcKKwkgICAgICogYWZ0ZXIgdGhlIGNoYW5nZS4gKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IHdwLT53X2xpbmVzX3ZhbGlkOyArK2kpCisJCWlmICh3cC0+d19saW5lc1tpXS53bF92YWxpZCkKKwkJeworCQkgICAgaWYgKHdwLT53X2xpbmVzW2ldLndsX2xudW0gPj0gbG51bSkKKwkJICAgIHsKKwkJCWlmICh3cC0+d19saW5lc1tpXS53bF9sbnVtIDwgbG51bWUpCisJCQl7CisJCQkgICAgLyogbGluZSBpbmNsdWRlZCBpbiBjaGFuZ2UgKi8KKwkJCSAgICB3cC0+d19saW5lc1tpXS53bF92YWxpZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZSBpZiAoeHRyYSAhPSAwKQorCQkJeworCQkJICAgIC8qIGxpbmUgYmVsb3cgY2hhbmdlICovCisJCQkgICAgd3AtPndfbGluZXNbaV0ud2xfbG51bSArPSB4dHJhOworI2lmZGVmIEZFQVRfRk9MRElORworCQkJICAgIHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtICs9IHh0cmE7CisjZW5kaWYKKwkJCX0KKwkJICAgIH0KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJICAgIGVsc2UgaWYgKHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtID49IGxudW0pCisJCSAgICB7CisJCQkvKiBjaGFuZ2Ugc29tZXdoZXJlIGluc2lkZSB0aGlzIHJhbmdlIG9mIGZvbGRlZCBsaW5lcywKKwkJCSAqIG1heSBuZWVkIHRvIGJlIHJlZHJhd24gKi8KKwkJCXdwLT53X2xpbmVzW2ldLndsX3ZhbGlkID0gRkFMU0U7CisJCSAgICB9CisjZW5kaWYKKwkJfQorCX0KKyAgICB9CisKKyAgICAvKiBDYWxsIHVwZGF0ZV9zY3JlZW4oKSBsYXRlciwgd2hpY2ggY2hlY2tzIG91dCB3aGF0IG5lZWRzIHRvIGJlIHJlZHJhd24sCisgICAgICogc2luY2UgaXQgbm90aWNlcyBiX21vZF9zZXQgYW5kIHRoZW4gdXNlcyBiX21vZF8qLiAqLworICAgIGlmIChtdXN0X3JlZHJhdyA8IFZBTElEKQorCW11c3RfcmVkcmF3ID0gVkFMSUQ7Cit9CisKKy8qCisgKiB1bmNoYW5nZWQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2hhbmdlZCBmbGFnIG11c3QgYmUgcmVzZXQgZm9yIGJ1ZmZlciAnYnVmJworICovCisgICAgdm9pZAordW5jaGFuZ2VkKGJ1ZiwgZmYpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCWZmOwkvKiBhbHNvIHJlc2V0ICdmaWxlZm9ybWF0JyAqLworeworICAgIGlmIChidWYtPmJfY2hhbmdlZCB8fCAoZmYgJiYgZmlsZV9mZl9kaWZmZXJzKGJ1ZikpKQorICAgIHsKKwlidWYtPmJfY2hhbmdlZCA9IDA7CisJbWxfc2V0ZGlydHkoYnVmLCBGQUxTRSk7CisJaWYgKGZmKQorCSAgICBzYXZlX2ZpbGVfZmYoYnVmKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwljaGVja19zdGF0dXMoYnVmKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVElUTEUKKwluZWVkX21ha2V0aXRsZSA9IFRSVUU7CSAgICAvKiBzZXQgd2luZG93IHRpdGxlIGxhdGVyICovCisjZW5kaWYKKyAgICB9CisgICAgKytidWYtPmJfY2hhbmdlZHRpY2s7CisgICAgKytnbG9iYWxfY2hhbmdlZHRpY2s7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgbmV0YmVhbnNfdW5tb2RpZmllZChidWYpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBjaGVja19zdGF0dXM6IGNhbGxlZCB3aGVuIHRoZSBzdGF0dXMgYmFycyBmb3IgdGhlIGJ1ZmZlciAnYnVmJworICoJCSBuZWVkIHRvIGJlIHVwZGF0ZWQKKyAqLworICAgIHZvaWQKK2NoZWNrX3N0YXR1cyhidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICB3aW5fVAkqd3A7CisKKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwlpZiAod3AtPndfYnVmZmVyID09IGJ1ZiAmJiB3cC0+d19zdGF0dXNfaGVpZ2h0KQorCXsKKwkgICAgd3AtPndfcmVkcl9zdGF0dXMgPSBUUlVFOworCSAgICBpZiAobXVzdF9yZWRyYXcgPCBWQUxJRCkKKwkJbXVzdF9yZWRyYXcgPSBWQUxJRDsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIElmIHRoZSBmaWxlIGlzIHJlYWRvbmx5LCBnaXZlIGEgd2FybmluZyBtZXNzYWdlIHdpdGggdGhlIGZpcnN0IGNoYW5nZS4KKyAqIERvbid0IGRvIHRoaXMgZm9yIGF1dG9jb21tYW5kcy4KKyAqIERvbid0IHVzZSBlbXNnKCksIGJlY2F1c2UgaXQgZmx1c2hlcyB0aGUgbWFjcm8gYnVmZmVyLgorICogSWYgd2UgaGF2ZSB1bmRvbmUgYWxsIGNoYW5nZXMgYl9jaGFuZ2VkIHdpbGwgYmUgRkFMU0UsIGJ1dCBiX2RpZF93YXJuCisgKiB3aWxsIGJlIFRSVUUuCisgKi8KKyAgICB2b2lkCitjaGFuZ2Vfd2FybmluZyhjb2wpCisgICAgaW50CSAgICBjb2w7CQkvKiBjb2x1bW4gZm9yIG1lc3NhZ2U7IG5vbi16ZXJvIHdoZW4gaW4gaW5zZXJ0CisJCQkJICAgbW9kZSBhbmQgJ3Nob3dtb2RlJyBpcyBvbiAqLworeworICAgIGlmIChjdXJidWYtPmJfZGlkX3dhcm4gPT0gRkFMU0UKKwkgICAgJiYgY3VyYnVmSXNDaGFuZ2VkKCkgPT0gMAorI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICAmJiAhYXV0b2NtZF9idXN5CisjZW5kaWYKKwkgICAgJiYgY3VyYnVmLT5iX3Bfcm8pCisgICAgeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0ZJTEVDSEFOR0VEUk8sIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworCWlmICghY3VyYnVmLT5iX3Bfcm8pCisJICAgIHJldHVybjsKKyNlbmRpZgorCS8qCisJICogRG8gd2hhdCBtc2coKSBkb2VzLCBidXQgd2l0aCBhIGNvbHVtbiBvZmZzZXQgaWYgdGhlIHdhcm5pbmcgc2hvdWxkCisJICogYmUgYWZ0ZXIgdGhlIG1vZGUgbWVzc2FnZS4KKwkgKi8KKwltc2dfc3RhcnQoKTsKKwlpZiAobXNnX3JvdyA9PSBSb3dzIC0gMSkKKwkgICAgbXNnX2NvbCA9IGNvbDsKKwlNU0dfUFVUU19BVFRSKF8oIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIiksCisJCQkJCQkgICBobF9hdHRyKEhMRl9XKSB8IE1TR19ISVNUKTsKKwltc2dfY2xyX2VvcygpOworCSh2b2lkKW1zZ19lbmQoKTsKKwlpZiAobXNnX3NpbGVudCA9PSAwICYmICFzaWxlbnRfbW9kZSkKKwl7CisJICAgIG91dF9mbHVzaCgpOworCSAgICB1aV9kZWxheSgxMDAwTCwgVFJVRSk7IC8qIGdpdmUgdGhlIHVzZXIgdGltZSB0byB0aGluayBhYm91dCBpdCAqLworCX0KKwljdXJidWYtPmJfZGlkX3dhcm4gPSBUUlVFOworCXJlZHJhd19jbWRsaW5lID0gRkFMU0U7CS8qIGRvbid0IHJlZHJhdyBhbmQgZXJhc2UgdGhlIG1lc3NhZ2UgKi8KKwlpZiAobXNnX3JvdyA8IFJvd3MgLSAxKQorCSAgICBzaG93bW9kZSgpOworICAgIH0KK30KKworLyoKKyAqIEFzayBmb3IgYSByZXBseSBmcm9tIHRoZSB1c2VyLCBhICd5JyBvciBhICduJy4KKyAqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGFjY2VwdGVkLCB0aGUgbWVzc2FnZSBpcyByZXBlYXRlZCB1bnRpbCBhIHZhbGlkCisgKiByZXBseSBpcyBlbnRlcmVkIG9yIENUUkwtQyBpcyBoaXQuCisgKiBJZiBkaXJlY3QgaXMgVFJVRSwgZG9uJ3QgdXNlIHZnZXRjKCkgYnV0IHVpX2luY2hhcigpLCBkb24ndCBnZXQgY2hhcmFjdGVycworICogZnJvbSBhbnkgYnVmZmVycyBidXQgZGlyZWN0bHkgZnJvbSB0aGUgdXNlci4KKyAqCisgKiByZXR1cm4gdGhlICd5JyBvciAnbicKKyAqLworICAgIGludAorYXNrX3llc25vKHN0ciwgZGlyZWN0KQorICAgIGNoYXJfdSAgKnN0cjsKKyAgICBpbnQJICAgIGRpcmVjdDsKK3sKKyAgICBpbnQJICAgIHIgPSAnICc7CisgICAgaW50CSAgICBzYXZlX1N0YXRlID0gU3RhdGU7CisKKyAgICBpZiAoZXhpdGluZykJCS8qIHB1dCB0ZXJtaW5hbCBpbiByYXcgbW9kZSBmb3IgdGhpcyBxdWVzdGlvbiAqLworCXNldHRtb2RlKFRNT0RFX1JBVyk7CisgICAgKytub193YWl0X3JldHVybjsKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorICAgIGRvbnRfc2Nyb2xsID0gVFJVRTsJCS8qIGRpc2FsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKyAgICBTdGF0ZSA9IENPTkZJUk07CQkvKiBtb3VzZSBiZWhhdmVzIGxpa2Ugd2l0aCA6Y29uZmlybSAqLworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBzZXRtb3VzZSgpOwkJCS8qIGRpc2FibGVzIG1vdXNlIGZvciB4dGVybSAqLworI2VuZGlmCisgICAgKytub19tYXBwaW5nOworICAgICsrYWxsb3dfa2V5czsJCS8qIG5vIG1hcHBpbmcgaGVyZSwgYnV0IHJlY29nbml6ZSBrZXlzICovCisKKyAgICB3aGlsZSAociAhPSAneScgJiYgciAhPSAnbicpCisgICAgeworCS8qIHNhbWUgaGlnaGxpZ2h0aW5nIGFzIGZvciB3YWl0X3JldHVybiAqLworCXNtc2dfYXR0cihobF9hdHRyKEhMRl9SKSwgKGNoYXJfdSAqKSIlcyAoeS9uKT8iLCBzdHIpOworCWlmIChkaXJlY3QpCisJICAgIHIgPSBnZXRfa2V5c3Ryb2tlKCk7CisJZWxzZQorCSAgICByID0gc2FmZV92Z2V0YygpOworCWlmIChyID09IEN0cmxfQyB8fCByID09IEVTQykKKwkgICAgciA9ICduJzsKKwltc2dfcHV0Y2hhcihyKTsJICAgIC8qIHNob3cgd2hhdCB5b3UgdHlwZWQgKi8KKwlvdXRfZmx1c2goKTsKKyAgICB9CisgICAgLS1ub193YWl0X3JldHVybjsKKyAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisjaWZkZWYgRkVBVF9NT1VTRQorICAgIHNldG1vdXNlKCk7CisjZW5kaWYKKyAgICAtLW5vX21hcHBpbmc7CisgICAgLS1hbGxvd19rZXlzOworCisgICAgcmV0dXJuIHI7Cit9CisKKy8qCisgKiBHZXQgYSBrZXkgc3Ryb2tlIGRpcmVjdGx5IGZyb20gdGhlIHVzZXIuCisgKiBJZ25vcmVzIG1vdXNlIGNsaWNrcyBhbmQgc2Nyb2xsYmFyIGV2ZW50cywgZXhjZXB0IGEgY2xpY2sgZm9yIHRoZSBsZWZ0CisgKiBidXR0b24gKHVzZWQgYXQgdGhlIG1vcmUgcHJvbXB0KS4KKyAqIERvZXNuJ3QgdXNlIHZnZXRjKCksIGJlY2F1c2UgaXQgc3luY3MgdW5kbyBhbmQgZWF0cyBtYXBwZWQgY2hhcmFjdGVycy4KKyAqIERpc2FkdmFudGFnZTogdHlwZWFoZWFkIGlzIGlnbm9yZWQuCisgKiBUcmFuc2xhdGVzIHRoZSBpbnRlcnJ1cHQgY2hhcmFjdGVyIGZvciB1bml4IHRvIEVTQy4KKyAqLworICAgIGludAorZ2V0X2tleXN0cm9rZSgpCit7CisjZGVmaW5lIENCVUZMRU4gMTUxCisgICAgY2hhcl91CWJ1ZltDQlVGTEVOXTsKKyAgICBpbnQJCWxlbiA9IDA7CisgICAgaW50CQluOworICAgIGludAkJc2F2ZV9tYXBwZWRfY3RybF9jID0gbWFwcGVkX2N0cmxfYzsKKworICAgIG1hcHBlZF9jdHJsX2MgPSBGQUxTRTsJLyogbWFwcGluZ3MgYXJlIG5vdCB1c2VkIGhlcmUgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwljdXJzb3Jfb24oKTsKKwlvdXRfZmx1c2goKTsKKworCS8qIEZpcnN0IHRpbWU6IGJsb2NraW5nIHdhaXQuICBTZWNvbmQgdGltZTogd2FpdCB1cCB0byAxMDBtcyBmb3IgYQorCSAqIHRlcm1pbmFsIGNvZGUgdG8gY29tcGxldGUuICBMZWF2ZSBzb21lIHJvb20gZm9yIGNoZWNrX3Rlcm1jb2RlKCkgdG8KKwkgKiBpbnNlcnQgYSBrZXkgY29kZSBpbnRvIChtYXggNSBjaGFycyBwbHVzIE5VTCkuICBBbmQKKwkgKiBmaXhfaW5wdXRfYnVmZmVyKCkgY2FuIHRyaXBsZSB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAqLworCW4gPSB1aV9pbmNoYXIoYnVmICsgbGVuLCAoQ0JVRkxFTiAtIDYgLSBsZW4pIC8gMywKKwkJCQkJCSAgICBsZW4gPT0gMCA/IC0xTCA6IDEwMEwsIDApOworCWlmIChuID4gMCkKKwl7CisJICAgIC8qIFJlcGxhY2UgemVybyBhbmQgQ1NJIGJ5IGEgc3BlY2lhbCBrZXkgY29kZS4gKi8KKwkgICAgbiA9IGZpeF9pbnB1dF9idWZmZXIoYnVmICsgbGVuLCBuLCBGQUxTRSk7CisJICAgIGxlbiArPSBuOworCX0KKworCS8qIGluY29tcGxldGUgdGVybWNvZGU6IGdldCBtb3JlIGNoYXJhY3RlcnMgKi8KKwlpZiAoKG4gPSBjaGVja190ZXJtY29kZSgxLCBidWYsIGxlbikpIDwgMCkKKwkgICAgY29udGludWU7CisJLyogZm91bmQgYSB0ZXJtY29kZTogYWRqdXN0IGxlbmd0aCAqLworCWlmIChuID4gMCkKKwkgICAgbGVuID0gbjsKKwlpZiAobGVuID09IDApCSAgICAvKiBub3RoaW5nIHR5cGVkIHlldCAqLworCSAgICBjb250aW51ZTsKKworCS8qIEhhbmRsZSBtb2RpZmllciBhbmQvb3Igc3BlY2lhbCBrZXkgY29kZS4gKi8KKwluID0gYnVmWzBdOworCWlmIChuID09IEtfU1BFQ0lBTCkKKwl7CisJICAgIG4gPSBUT19TUEVDSUFMKGJ1ZlsxXSwgYnVmWzJdKTsKKwkgICAgaWYgKGJ1ZlsxXSA9PSBLU19NT0RJRklFUgorCQkgICAgfHwgbiA9PSBLX0lHTk9SRQorI2lmZGVmIEZFQVRfTU9VU0UKKwkJICAgIHx8IG4gPT0gS19MRUZUTU9VU0VfTk0KKwkJICAgIHx8IG4gPT0gS19MRUZURFJBRworCQkgICAgfHwgbiA9PSBLX0xFRlRSRUxFQVNFCisJCSAgICB8fCBuID09IEtfTEVGVFJFTEVBU0VfTk0KKwkJICAgIHx8IG4gPT0gS19NSURETEVNT1VTRQorCQkgICAgfHwgbiA9PSBLX01JRERMRURSQUcKKwkJICAgIHx8IG4gPT0gS19NSURETEVSRUxFQVNFCisJCSAgICB8fCBuID09IEtfUklHSFRNT1VTRQorCQkgICAgfHwgbiA9PSBLX1JJR0hURFJBRworCQkgICAgfHwgbiA9PSBLX1JJR0hUUkVMRUFTRQorCQkgICAgfHwgbiA9PSBLX01PVVNFRE9XTgorCQkgICAgfHwgbiA9PSBLX01PVVNFVVAKKwkJICAgIHx8IG4gPT0gS19YMU1PVVNFCisJCSAgICB8fCBuID09IEtfWDFEUkFHCisJCSAgICB8fCBuID09IEtfWDFSRUxFQVNFCisJCSAgICB8fCBuID09IEtfWDJNT1VTRQorCQkgICAgfHwgbiA9PSBLX1gyRFJBRworCQkgICAgfHwgbiA9PSBLX1gyUkVMRUFTRQorIyBpZmRlZiBGRUFUX0dVSQorCQkgICAgfHwgbiA9PSBLX1ZFUl9TQ1JPTExCQVIKKwkJICAgIHx8IG4gPT0gS19IT1JfU0NST0xMQkFSCisjIGVuZGlmCisjZW5kaWYKKwkgICAgICAgKQorCSAgICB7CisJCWlmIChidWZbMV0gPT0gS1NfTU9ESUZJRVIpCisJCSAgICBtb2RfbWFzayA9IGJ1ZlsyXTsKKwkJbGVuIC09IDM7CisJCWlmIChsZW4gPiAwKQorCQkgICAgbWNoX21lbW1vdmUoYnVmLCBidWYgKyAzLCAoc2l6ZV90KWxlbik7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaWYgKE1CX0JZVEUyTEVOKG4pID4gbGVuKQorCQljb250aW51ZTsJLyogbW9yZSBieXRlcyB0byBnZXQgKi8KKwkgICAgYnVmW2xlbiA+PSBDQlVGTEVOID8gQ0JVRkxFTiAtIDEgOiBsZW5dID0gTlVMOworCSAgICBuID0gKCptYl9wdHIyY2hhcikoYnVmKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBVTklYCisJaWYgKG4gPT0gaW50cl9jaGFyKQorCSAgICBuID0gRVNDOworI2VuZGlmCisJYnJlYWs7CisgICAgfQorCisgICAgbWFwcGVkX2N0cmxfYyA9IHNhdmVfbWFwcGVkX2N0cmxfYzsKKyAgICByZXR1cm4gbjsKK30KKworLyoKKyAqIGdldCBhIG51bWJlciBmcm9tIHRoZSB1c2VyCisgKi8KKyAgICBpbnQKK2dldF9udW1iZXIoY29sb24pCisgICAgaW50CWNvbG9uOwkJCS8qIGFsbG93IGNvbG9uIHRvIGFib3J0ICovCit7CisgICAgaW50CW4gPSAwOworICAgIGludAljOworCisgICAgLyogV2hlbiBub3QgcHJpbnRpbmcgbWVzc2FnZXMsIHRoZSB1c2VyIHdvbid0IGtub3cgd2hhdCB0byB0eXBlLCByZXR1cm4gYQorICAgICAqIHplcm8gKGFzIGlmIENSIHdhcyBoaXQpLiAqLworICAgIGlmIChtc2dfc2lsZW50ICE9IDApCisJcmV0dXJuIDA7CisKKyNpZmRlZiBVU0VfT05fRkxZX1NDUk9MTAorICAgIGRvbnRfc2Nyb2xsID0gVFJVRTsJCS8qIGRpc2FsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKyAgICArK25vX21hcHBpbmc7CisgICAgKythbGxvd19rZXlzOwkJLyogbm8gbWFwcGluZyBoZXJlLCBidXQgcmVjb2duaXplIGtleXMgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwl3aW5kZ290byhtc2dfcm93LCBtc2dfY29sKTsKKwljID0gc2FmZV92Z2V0YygpOworCWlmIChWSU1fSVNESUdJVChjKSkKKwl7CisJICAgIG4gPSBuICogMTAgKyBjIC0gJzAnOworCSAgICBtc2dfcHV0Y2hhcihjKTsKKwl9CisJZWxzZSBpZiAoYyA9PSBLX0RFTCB8fCBjID09IEtfS0RFTCB8fCBjID09IEtfQlMgfHwgYyA9PSBDdHJsX0gpCisJeworCSAgICBuIC89IDEwOworCSAgICBNU0dfUFVUUygiXGIgXGIiKTsKKwl9CisJZWxzZSBpZiAobiA9PSAwICYmIGMgPT0gJzonICYmIGNvbG9uKQorCXsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoJzonKTsKKwkgICAgaWYgKCFleG1vZGVfYWN0aXZlKQorCQljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJICAgIHNraXBfcmVkcmF3ID0gVFJVRTsJICAgIC8qIHNraXAgcmVkcmF3IG9uY2UgKi8KKwkgICAgZG9fcmVkcmF3ID0gRkFMU0U7CisJICAgIGJyZWFrOworCX0KKwllbHNlIGlmIChjID09IENBUiB8fCBjID09IE5MIHx8IGMgPT0gQ3RybF9DIHx8IGMgPT0gRVNDKQorCSAgICBicmVhazsKKyAgICB9CisgICAgLS1ub19tYXBwaW5nOworICAgIC0tYWxsb3dfa2V5czsKKyAgICByZXR1cm4gbjsKK30KKworICAgIHZvaWQKK21zZ21vcmUobikKKyAgICBsb25nIG47Cit7CisgICAgbG9uZyBwbjsKKworICAgIGlmIChnbG9iYWxfYnVzeQkgICAgLyogbm8gbWVzc2FnZXMgbm93LCB3YWl0IHVudGlsIGdsb2JhbCBpcyBmaW5pc2hlZCAqLworCSAgICB8fCBrZWVwX21zZyAhPSBOVUxMIC8qIHRoZXJlIGlzIGEgbWVzc2FnZSBhbHJlYWR5LCBza2lwIHRoaXMgb25lICovCisJICAgIHx8ICFtZXNzYWdpbmcoKSkgIC8qICdsYXp5cmVkcmF3JyBzZXQsIGRvbid0IGRvIG1lc3NhZ2VzIG5vdyAqLworCXJldHVybjsKKworICAgIGlmIChuID4gMCkKKwlwbiA9IG47CisgICAgZWxzZQorCXBuID0gLW47CisKKyAgICBpZiAocG4gPiBwX3JlcG9ydCkKKyAgICB7CisJaWYgKHBuID09IDEpCisJeworCSAgICBpZiAobiA+IDApCisJCVNUUkNQWShtc2dfYnVmLCBfKCIxIG1vcmUgbGluZSIpKTsKKwkgICAgZWxzZQorCQlTVFJDUFkobXNnX2J1ZiwgXygiMSBsaW5lIGxlc3MiKSk7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChuID4gMCkKKwkJc3ByaW50ZigoY2hhciAqKW1zZ19idWYsIF8oIiVsZCBtb3JlIGxpbmVzIiksIHBuKTsKKwkgICAgZWxzZQorCQlzcHJpbnRmKChjaGFyICopbXNnX2J1ZiwgXygiJWxkIGZld2VyIGxpbmVzIiksIHBuKTsKKwl9CisJaWYgKGdvdF9pbnQpCisJICAgIFNUUkNBVChtc2dfYnVmLCBfKCIgKEludGVycnVwdGVkKSIpKTsKKwlpZiAobXNnKG1zZ19idWYpKQorCXsKKwkgICAgc2V0X2tlZXBfbXNnKG1zZ19idWYpOworCSAgICBrZWVwX21zZ19hdHRyID0gMDsKKwl9CisgICAgfQorfQorCisvKgorICogZmx1c2ggbWFwIGFuZCB0eXBlYWhlYWQgYnVmZmVycyBhbmQgZ2l2ZSBhIHdhcm5pbmcgZm9yIGFuIGVycm9yCisgKi8KKyAgICB2b2lkCitiZWVwX2ZsdXNoKCkKK3sKKyAgICBpZiAoZW1zZ19zaWxlbnQgPT0gMCkKKyAgICB7CisJZmx1c2hfYnVmZmVycyhGQUxTRSk7CisJdmltX2JlZXAoKTsKKyAgICB9Cit9CisKKy8qCisgKiBnaXZlIGEgd2FybmluZyBmb3IgYW4gZXJyb3IKKyAqLworICAgIHZvaWQKK3ZpbV9iZWVwKCkKK3sKKyAgICBpZiAoZW1zZ19zaWxlbnQgPT0gMCkKKyAgICB7CisJaWYgKHBfdmIKKyNpZmRlZiBGRUFUX0dVSQorCQkvKiBXaGlsZSB0aGUgR1VJIGlzIHN0YXJ0aW5nIHVwIHRoZSB0ZXJtY2FwIGlzIHNldCBmb3IgdGhlIEdVSQorCQkgKiBidXQgdGhlIG91dHB1dCBzdGlsbCBnb2VzIHRvIGEgdGVybWluYWwuICovCisJCSYmICEoZ3VpLmluX3VzZSAmJiBndWkuc3RhcnRpbmcpCisjZW5kaWYKKwkJKQorCXsKKwkgICAgb3V0X3N0cihUX1ZCKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBNU0RPUworCSAgICAvKgorCSAgICAgKiBUaGUgbnVtYmVyIG9mIGJlZXBzIG91dHB1dHRlZCBpcyByZWR1Y2VkIHRvIGF2b2lkIGhhdmluZyB0byB3YWl0CisJICAgICAqIGZvciBhbGwgdGhlIGJlZXBzIHRvIGZpbmlzaC4gVGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBvbiBzeXN0ZW1zCisJICAgICAqIHdoZXJlIHRoZSBiZWVwcyBkb24ndCBvdmVybGFwLgorCSAgICAgKi8KKwkgICAgaWYgKGJlZXBfY291bnQgPT0gMCB8fCBiZWVwX2NvdW50ID09IDEwKQorCSAgICB7CisJCW91dF9jaGFyKEJFTEwpOworCQliZWVwX2NvdW50ID0gMTsKKwkgICAgfQorCSAgICBlbHNlCisJCSsrYmVlcF9jb3VudDsKKyNlbHNlCisJICAgIG91dF9jaGFyKEJFTEwpOworI2VuZGlmCisJfQorICAgIH0KK30KKworLyoKKyAqIFRvIGdldCB0aGUgInJlYWwiIGhvbWUgZGlyZWN0b3J5OgorICogLSBnZXQgdmFsdWUgb2YgJEhPTUUKKyAqIEZvciBVbml4OgorICogIC0gZ28gdG8gdGhhdCBkaXJlY3RvcnkKKyAqICAtIGRvIG1jaF9kaXJuYW1lKCkgdG8gZ2V0IHRoZSByZWFsIG5hbWUgb2YgdGhhdCBkaXJlY3RvcnkuCisgKiAgVGhpcyBhbHNvIHdvcmtzIHdpdGggbW91bnRzIGFuZCBsaW5rcy4KKyAqICBEb24ndCBkbyB0aGlzIGZvciBNUy1ET1MsIGl0IHdpbGwgY2hhbmdlIHRoZSAiY3VycmVudCBkaXIiIGZvciBhIGRyaXZlLgorICovCitzdGF0aWMgY2hhcl91CSpob21lZGlyID0gTlVMTDsKKworICAgIHZvaWQKK2luaXRfaG9tZWRpcigpCit7CisgICAgY2hhcl91ICAqdmFyOworCisjaWZkZWYgVk1TCisgICAgdmFyID0gbWNoX2dldGVudigoY2hhcl91ICopIlNZUyRMT0dJTiIpOworI2Vsc2UKKyAgICB2YXIgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiSE9NRSIpOworI2VuZGlmCisKKyAgICBpZiAodmFyICE9IE5VTEwgJiYgKnZhciA9PSBOVUwpCS8qIGVtcHR5IGlzIHNhbWUgYXMgbm90IHNldCAqLworCXZhciA9IE5VTEw7CisKKyNpZmRlZiBXSU4zMjY0CisgICAgLyoKKyAgICAgKiBXZWlyZCBidXQgdHJ1ZTogJEhPTUUgbWF5IGNvbnRhaW4gYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGFub3RoZXIKKyAgICAgKiB2YXJpYWJsZSwgZXNwLiAiJVVTRVJQUk9GSUxFJSIuICBIYXBwZW5zIHdoZW4gJFVTRVJQUk9GSUxFIGlzbid0IHNldAorICAgICAqIHdoZW4gJEhPTUUgaXMgYmVpbmcgc2V0LgorICAgICAqLworICAgIGlmICh2YXIgIT0gTlVMTCAmJiAqdmFyID09ICclJykKKyAgICB7CisJY2hhcl91CSpwOworCWNoYXJfdQkqZXhwOworCisJcCA9IHZpbV9zdHJjaHIodmFyICsgMSwgJyUnKTsKKwlpZiAocCAhPSBOVUxMKQorCXsKKwkgICAgU1RSTkNQWShOYW1lQnVmZiwgdmFyICsgMSwgcCAtICh2YXIgKyAxKSk7CisJICAgIE5hbWVCdWZmW3AgLSAodmFyICsgMSldID0gTlVMOworCSAgICBleHAgPSBtY2hfZ2V0ZW52KE5hbWVCdWZmKTsKKwkgICAgaWYgKGV4cCAhPSBOVUxMICYmICpleHAgIT0gTlVMCisJCQkJCSYmIFNUUkxFTihleHApICsgU1RSTEVOKHApIDwgTUFYUEFUSEwpCisJICAgIHsKKwkJc3ByaW50ZigoY2hhciAqKU5hbWVCdWZmLCAiJXMlcyIsIGV4cCwgcCArIDEpOworCQl2YXIgPSBOYW1lQnVmZjsKKwkJLyogQWxzbyBzZXQgJEhPTUUsIGl0J3MgbmVlZGVkIGZvciBfdmltaW5mby4gKi8KKwkJdmltX3NldGVudigoY2hhcl91ICopIkhPTUUiLCBOYW1lQnVmZik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUeXBpY2FsbHksICRIT01FIGlzIG5vdCBkZWZpbmVkIG9uIFdpbmRvd3MsIHVubGVzcyB0aGUgdXNlciBoYXMKKyAgICAgKiBzcGVjaWZpY2FsbHkgZGVmaW5lZCBpdCBmb3IgVmltJ3Mgc2FrZS4gIEhvd2V2ZXIsIG9uIFdpbmRvd3MgTlQKKyAgICAgKiBwbGF0Zm9ybXMsICRIT01FRFJJVkUgYW5kICRIT01FUEFUSCBhcmUgYXV0b21hdGljYWxseSBkZWZpbmVkIGZvcgorICAgICAqIGVhY2ggdXNlci4gIFRyeSBjb25zdHJ1Y3RpbmcgJEhPTUUgZnJvbSB0aGVzZS4KKyAgICAgKi8KKyAgICBpZiAodmFyID09IE5VTEwpCisgICAgeworCWNoYXJfdSAqaG9tZWRyaXZlLCAqaG9tZXBhdGg7CisKKwlob21lZHJpdmUgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiSE9NRURSSVZFIik7CisJaG9tZXBhdGggPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiSE9NRVBBVEgiKTsKKwlpZiAoaG9tZWRyaXZlICE9IE5VTEwgJiYgaG9tZXBhdGggIT0gTlVMTAorCQkJICAgJiYgU1RSTEVOKGhvbWVkcml2ZSkgKyBTVFJMRU4oaG9tZXBhdGgpIDwgTUFYUEFUSEwpCisJeworCSAgICBzcHJpbnRmKChjaGFyICopTmFtZUJ1ZmYsICIlcyVzIiwgaG9tZWRyaXZlLCBob21lcGF0aCk7CisJICAgIGlmIChOYW1lQnVmZlswXSAhPSBOVUwpCisJICAgIHsKKwkJdmFyID0gTmFtZUJ1ZmY7CisJCS8qIEFsc28gc2V0ICRIT01FLCBpdCdzIG5lZWRlZCBmb3IgX3ZpbWluZm8uICovCisJCXZpbV9zZXRlbnYoKGNoYXJfdSAqKSJIT01FIiwgTmFtZUJ1ZmYpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisgICAgLyoKKyAgICAgKiBEZWZhdWx0IGhvbWUgZGlyIGlzIEM6LworICAgICAqIEJlc3QgYXNzdW1wdGlvbiB3ZSBjYW4gbWFrZSBpbiBzdWNoIGEgc2l0dWF0aW9uLgorICAgICAqLworICAgIGlmICh2YXIgPT0gTlVMTCkKKwl2YXIgPSAiQzovIjsKKyNlbmRpZgorICAgIGlmICh2YXIgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgVU5JWAorCS8qCisJICogQ2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgYW5kIGdldCB0aGUgYWN0dWFsIHBhdGguICBUaGlzIHJlc29sdmVzCisJICogbGlua3MuICBEb24ndCBkbyBpdCB3aGVuIHdlIGNhbid0IHJldHVybi4KKwkgKi8KKwlpZiAobWNoX2Rpcm5hbWUoTmFtZUJ1ZmYsIE1BWFBBVEhMKSA9PSBPSworCQkJCQkgICYmIG1jaF9jaGRpcigoY2hhciAqKU5hbWVCdWZmKSA9PSAwKQorCXsKKwkgICAgaWYgKCFtY2hfY2hkaXIoKGNoYXIgKil2YXIpICYmIG1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKSA9PSBPSykKKwkJdmFyID0gSU9idWZmOworCSAgICBpZiAobWNoX2NoZGlyKChjaGFyICopTmFtZUJ1ZmYpICE9IDApCisJCUVNU0coXyhlX3ByZXZfZGlyKSk7CisJfQorI2VuZGlmCisJaG9tZWRpciA9IHZpbV9zdHJzYXZlKHZhcik7CisgICAgfQorfQorCisvKgorICogRXhwYW5kIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggcGF0aCBuYW1lLgorICogIn4vIiBpcyBhbHNvIGV4cGFuZGVkLCB1c2luZyAkSE9NRS4JRm9yIFVuaXggIn51c2VyLyIgaXMgZXhwYW5kZWQuCisgKiBTa2lwcyBvdmVyICJcICIsICJcfiIgYW5kICJcJCIuCisgKiBJZiBhbnl0aGluZyBmYWlscyBubyBleHBhbnNpb24gaXMgZG9uZSBhbmQgZHN0IGVxdWFscyBzcmMuCisgKi8KKyAgICB2b2lkCitleHBhbmRfZW52KHNyYywgZHN0LCBkc3RsZW4pCisgICAgY2hhcl91CSpzcmM7CQkvKiBpbnB1dCBzdHJpbmcgZS5nLiAiJEhPTUUvdmltLmhscCIgKi8KKyAgICBjaGFyX3UJKmRzdDsJCS8qIHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0ICovCisgICAgaW50CQlkc3RsZW47CQkvKiBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmVzdWx0ICovCit7CisgICAgZXhwYW5kX2Vudl9lc2Moc3JjLCBkc3QsIGRzdGxlbiwgRkFMU0UpOworfQorCisgICAgdm9pZAorZXhwYW5kX2Vudl9lc2Moc3JjLCBkc3QsIGRzdGxlbiwgZXNjKQorICAgIGNoYXJfdQkqc3JjOwkJLyogaW5wdXQgc3RyaW5nIGUuZy4gIiRIT01FL3ZpbS5obHAiICovCisgICAgY2hhcl91CSpkc3Q7CQkvKiB3aGVyZSB0byBwdXQgdGhlIHJlc3VsdCAqLworICAgIGludAkJZHN0bGVuOwkJLyogbWF4aW11bSBsZW5ndGggb2YgdGhlIHJlc3VsdCAqLworICAgIGludAkJZXNjOwkJLyogZXNjYXBlIHNwYWNlcyBpbiBleHBhbmRlZCB2YXJpYWJsZXMgKi8KK3sKKyAgICBjaGFyX3UJKnRhaWw7CisgICAgaW50CQljOworICAgIGNoYXJfdQkqdmFyOworICAgIGludAkJY29weV9jaGFyOworICAgIGludAkJbXVzdGZyZWU7CS8qIHZhciB3YXMgYWxsb2NhdGVkLCBuZWVkIHRvIGZyZWUgaXQgbGF0ZXIgKi8KKyAgICBpbnQJCWF0X3N0YXJ0ID0gVFJVRTsgLyogYXQgc3RhcnQgb2YgYSBuYW1lICovCisKKyAgICBzcmMgPSBza2lwd2hpdGUoc3JjKTsKKyAgICAtLWRzdGxlbjsJCSAgICAvKiBsZWF2ZSBvbmUgY2hhciBzcGFjZSBmb3IgIlwsIiAqLworICAgIHdoaWxlICgqc3JjICYmIGRzdGxlbiA+IDApCisgICAgeworCWNvcHlfY2hhciA9IFRSVUU7CisJaWYgKCpzcmMgPT0gJyQnCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpCisJCXx8ICpzcmMgPT0gJyUnCisjZW5kaWYKKwkJfHwgKCpzcmMgPT0gJ34nICYmIGF0X3N0YXJ0KSkKKwl7CisJICAgIG11c3RmcmVlID0gRkFMU0U7CisKKwkgICAgLyoKKwkgICAgICogVGhlIHZhcmlhYmxlIG5hbWUgaXMgY29waWVkIGludG8gZHN0IHRlbXBvcmFyaWx5LCBiZWNhdXNlIGl0IG1heQorCSAgICAgKiBiZSBhIHN0cmluZyBpbiByZWFkLW9ubHkgbWVtb3J5IGFuZCBhIE5VTCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KKwkgICAgICovCisJICAgIGlmICgqc3JjICE9ICd+JykJCQkJLyogZW52aXJvbm1lbnQgdmFyICovCisJICAgIHsKKwkJdGFpbCA9IHNyYyArIDE7CisJCXZhciA9IGRzdDsKKwkJYyA9IGRzdGxlbiAtIDE7CisKKyNpZmRlZiBVTklYCisJCS8qIFVuaXggaGFzICR7dmFyLW5hbWV9IHR5cGUgZW52aXJvbm1lbnQgdmFycyAqLworCQlpZiAoKnRhaWwgPT0gJ3snICYmICF2aW1faXNJRGMoJ3snKSkKKwkJeworCQkgICAgdGFpbCsrOwkvKiBpZ25vcmUgJ3snICovCisJCSAgICB3aGlsZSAoYy0tID4gMCAmJiAqdGFpbCAmJiAqdGFpbCAhPSAnfScpCisJCQkqdmFyKysgPSAqdGFpbCsrOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCSAgICB3aGlsZSAoYy0tID4gMCAmJiAqdGFpbCAhPSBOVUwgJiYgKCh2aW1faXNJRGMoKnRhaWwpKQorI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKQorCQkJICAgIHx8ICgqc3JjID09ICclJyAmJiAqdGFpbCAhPSAnJScpCisjZW5kaWYKKwkJCSAgICApKQorCQkgICAgeworI2lmZGVmIE9TMgkJLyogZW52IHZhcnMgb25seSBpbiB1cHBlcmNhc2UgKi8KKwkJCSp2YXIrKyA9IFRPVVBQRVJfTE9DKCp0YWlsKTsKKwkJCXRhaWwrKzsJICAgIC8qIHRvdXBwZXIoKSBtYXkgYmUgYSBtYWNybyEgKi8KKyNlbHNlCisJCQkqdmFyKysgPSAqdGFpbCsrOworI2VuZGlmCisJCSAgICB9CisJCX0KKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFVOSVgpCisjIGlmZGVmIFVOSVgKKwkJaWYgKHNyY1sxXSA9PSAneycgJiYgKnRhaWwgIT0gJ30nKQorIyBlbHNlCisJCWlmICgqc3JjID09ICclJyAmJiAqdGFpbCAhPSAnJScpCisjIGVuZGlmCisJCSAgICB2YXIgPSBOVUxMOworCQllbHNlCisJCXsKKyMgaWZkZWYgVU5JWAorCQkgICAgaWYgKHNyY1sxXSA9PSAneycpCisjIGVsc2UKKwkJICAgIGlmICgqc3JjID09ICclJykKKyNlbmRpZgorCQkJKyt0YWlsOworI2VuZGlmCisJCSAgICAqdmFyID0gTlVMOworCQkgICAgdmFyID0gdmltX2dldGVudihkc3QsICZtdXN0ZnJlZSk7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVU5JWCkKKwkJfQorI2VuZGlmCisJICAgIH0KKwkJCQkJCQkvKiBob21lIGRpcmVjdG9yeSAqLworCSAgICBlbHNlIGlmICggIHNyY1sxXSA9PSBOVUwKKwkJICAgIHx8IHZpbV9pc3BhdGhzZXAoc3JjWzFdKQorCQkgICAgfHwgdmltX3N0cmNocigoY2hhcl91ICopIiAsXHRcbiIsIHNyY1sxXSkgIT0gTlVMTCkKKwkgICAgeworCQl2YXIgPSBob21lZGlyOworCQl0YWlsID0gc3JjICsgMTsKKwkgICAgfQorCSAgICBlbHNlCQkJCQkvKiB1c2VyIGRpcmVjdG9yeSAqLworCSAgICB7CisjaWYgZGVmaW5lZChVTklYKSB8fCAoZGVmaW5lZChWTVMpICYmIGRlZmluZWQoVVNFUl9IT01FKSkKKwkJLyoKKwkJICogQ29weSB+dXNlciB0byBkc3RbXSwgc28gd2UgY2FuIHB1dCBhIE5VTCBhZnRlciBpdC4KKwkJICovCisJCXRhaWwgPSBzcmM7CisJCXZhciA9IGRzdDsKKwkJYyA9IGRzdGxlbiAtIDE7CisJCXdoaWxlICgJICAgYy0tID4gMAorCQkJJiYgKnRhaWwKKwkJCSYmIHZpbV9pc2ZpbGVjKCp0YWlsKQorCQkJJiYgIXZpbV9pc3BhdGhzZXAoKnRhaWwpKQorCQkgICAgKnZhcisrID0gKnRhaWwrKzsKKwkJKnZhciA9IE5VTDsKKyMgaWZkZWYgVU5JWAorCQkvKgorCQkgKiBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGdldHB3bmFtKCksIHVzZSBpdC4KKwkJICogT3RoZXJ3aXNlLCBvciBpZiBnZXRwd25hbSgpIGZhaWxzLCB0aGUgc2hlbGwgaXMgdXNlZCB0bworCQkgKiBleHBhbmQgfnVzZXIuICBUaGlzIGlzIHNsb3dlciBhbmQgbWF5IGZhaWwgaWYgdGhlIHNoZWxsCisJCSAqIGRvZXMgbm90IHN1cHBvcnQgfnVzZXIgKG9sZCB2ZXJzaW9ucyBvZiAvYmluL3NoKS4KKwkJICovCisjICBpZiBkZWZpbmVkKEhBVkVfR0VUUFdOQU0pICYmIGRlZmluZWQoSEFWRV9QV0RfSCkKKwkJeworCQkgICAgc3RydWN0IHBhc3N3ZCAqcHc7CisKKwkJICAgIHB3ID0gZ2V0cHduYW0oKGNoYXIgKilkc3QgKyAxKTsKKwkJICAgIGlmIChwdyAhPSBOVUxMKQorCQkJdmFyID0gKGNoYXJfdSAqKXB3LT5wd19kaXI7CisJCSAgICBlbHNlCisJCQl2YXIgPSBOVUxMOworCQl9CisJCWlmICh2YXIgPT0gTlVMTCkKKyMgIGVuZGlmCisJCXsKKwkJICAgIGV4cGFuZF9UCXhwYzsKKworCQkgICAgRXhwYW5kSW5pdCgmeHBjKTsKKwkJICAgIHhwYy54cF9jb250ZXh0ID0gRVhQQU5EX0ZJTEVTOworCQkgICAgdmFyID0gRXhwYW5kT25lKCZ4cGMsIGRzdCwgTlVMTCwKKwkJCQlXSUxEX0FERF9TTEFTSHxXSUxEX1NJTEVOVCwgV0lMRF9FWFBBTkRfRlJFRSk7CisJCSAgICBFeHBhbmRDbGVhbnVwKCZ4cGMpOworCQkgICAgbXVzdGZyZWUgPSBUUlVFOworCQl9CisKKyMgZWxzZQkvKiAhVU5JWCwgdGh1cyBWTVMgKi8KKwkJLyoKKwkJICogVVNFUl9IT01FIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YKKwkJICogZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciB0aGUgdXNlciBhY2NvdW50IGluLgorCQkgKi8KKwkJeworCQkgICAgY2hhcl91CXRlc3RbTUFYUEFUSExdLCBwYXRoc1tNQVhQQVRITF07CisJCSAgICBjaGFyX3UJKnBhdGgsICpuZXh0X3BhdGgsICpwdHI7CisJCSAgICBzdHJ1Y3Qgc3RhdAlzdDsKKworCQkgICAgU1RSQ1BZKHBhdGhzLCBVU0VSX0hPTUUpOworCQkgICAgbmV4dF9wYXRoID0gcGF0aHM7CisJCSAgICB3aGlsZSAoKm5leHRfcGF0aCkKKwkJICAgIHsKKwkJCWZvciAocGF0aCA9IG5leHRfcGF0aDsgKm5leHRfcGF0aCAmJiAqbmV4dF9wYXRoICE9ICcsJzsKKwkJCQluZXh0X3BhdGgrKyk7CisJCQlpZiAoKm5leHRfcGF0aCkKKwkJCSAgICAqbmV4dF9wYXRoKysgPSBOVUw7CisJCQlTVFJDUFkodGVzdCwgcGF0aCk7CisJCQlTVFJDQVQodGVzdCwgIi8iKTsKKwkJCVNUUkNBVCh0ZXN0LCBkc3QgKyAxKTsKKwkJCWlmIChtY2hfc3RhdCh0ZXN0LCAmc3QpID09IDApCisJCQl7CisJCQkgICAgdmFyID0gYWxsb2MoU1RSTEVOKHRlc3QpICsgMSk7CisJCQkgICAgU1RSQ1BZKHZhciwgdGVzdCk7CisJCQkgICAgbXVzdGZyZWUgPSBUUlVFOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisjIGVuZGlmIC8qIFVOSVggKi8KKyNlbHNlCisJCS8qIGNhbm5vdCBleHBhbmQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCBzbyBkb24ndCB0cnkgKi8KKwkJdmFyID0gTlVMTDsKKwkJdGFpbCA9IChjaGFyX3UgKikiIjsJLyogZm9yIGdjYyAqLworI2VuZGlmIC8qIFVOSVggfHwgVk1TICovCisJICAgIH0KKworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCSAgICAvKiBJZiAnc2hlbGxzbGFzaCcgaXMgc2V0IGNoYW5nZSBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuCisJICAgICAqIENhbid0IHVzZSBzbGFzaF9hZGp1c3QoKSwgcF9zc2wgbWF5IGJlIHNldCB0ZW1wb3JhcmlseS4gKi8KKwkgICAgaWYgKHBfc3NsICYmIHZhciAhPSBOVUxMICYmIHZpbV9zdHJjaHIodmFyLCAnXFwnKSAhPSBOVUxMKQorCSAgICB7CisJCWNoYXJfdQkqcCA9IHZpbV9zdHJzYXZlKHZhcik7CisKKwkJaWYgKHAgIT0gTlVMTCkKKwkJeworCQkgICAgaWYgKG11c3RmcmVlKQorCQkJdmltX2ZyZWUodmFyKTsKKwkJICAgIHZhciA9IHA7CisJCSAgICBtdXN0ZnJlZSA9IFRSVUU7CisJCSAgICBmb3J3YXJkX3NsYXNoKHZhcik7CisJCX0KKwkgICAgfQorI2VuZGlmCisKKwkgICAgLyogSWYgInZhciIgY29udGFpbnMgd2hpdGUgc3BhY2UsIGVzY2FwZSBpdCB3aXRoIGEgYmFja3NsYXNoLgorCSAgICAgKiBSZXF1aXJlZCBmb3IgIjplIH4vdHQiIHdoZW4gJEhPTUUgaW5jbHVkZXMgYSBzcGFjZS4gKi8KKwkgICAgaWYgKGVzYyAmJiB2YXIgIT0gTlVMTCAmJiB2aW1fc3RycGJyayh2YXIsIChjaGFyX3UgKikiIFx0IikgIT0gTlVMTCkKKwkgICAgeworCQljaGFyX3UJKnAgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKHZhciwgKGNoYXJfdSAqKSIgXHQiKTsKKworCQlpZiAocCAhPSBOVUxMKQorCQl7CisJCSAgICBpZiAobXVzdGZyZWUpCisJCQl2aW1fZnJlZSh2YXIpOworCQkgICAgdmFyID0gcDsKKwkJICAgIG11c3RmcmVlID0gVFJVRTsKKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHZhciAhPSBOVUxMICYmICp2YXIgIT0gTlVMCisJCSAgICAmJiAoU1RSTEVOKHZhcikgKyBTVFJMRU4odGFpbCkgKyAxIDwgKHVuc2lnbmVkKWRzdGxlbikpCisJICAgIHsKKwkJU1RSQ1BZKGRzdCwgdmFyKTsKKwkJZHN0bGVuIC09IChpbnQpU1RSTEVOKHZhcik7CisJCWRzdCArPSBTVFJMRU4odmFyKTsKKwkJLyogaWYgdmFyW10gZW5kcyBpbiBhIHBhdGggc2VwYXJhdG9yIGFuZCB0YWlsW10gc3RhcnRzCisJCSAqIHdpdGggaXQsIHNraXAgYSBjaGFyYWN0ZXIgKi8KKwkJaWYgKCp2YXIgIT0gTlVMICYmIHZpbV9pc3BhdGhzZXAoZHN0Wy0xXSkKKyNpZiBkZWZpbmVkKEJBQ0tTTEFTSF9JTl9GSUxFTkFNRSkgfHwgZGVmaW5lZChBTUlHQSkKKwkJCSYmIGRzdFstMV0gIT0gJzonCisjZW5kaWYKKwkJCSYmIHZpbV9pc3BhdGhzZXAoKnRhaWwpKQorCQkgICAgKyt0YWlsOworCQlzcmMgPSB0YWlsOworCQljb3B5X2NoYXIgPSBGQUxTRTsKKwkgICAgfQorCSAgICBpZiAobXVzdGZyZWUpCisJCXZpbV9mcmVlKHZhcik7CisJfQorCisJaWYgKGNvcHlfY2hhcikJICAgIC8qIGNvcHkgYXQgbGVhc3Qgb25lIGNoYXIgKi8KKwl7CisJICAgIC8qCisJICAgICAqIFJlY29naXplIHRoZSBzdGFydCBvZiBhIG5ldyBuYW1lLCBmb3IgJ34nLgorCSAgICAgKi8KKwkgICAgYXRfc3RhcnQgPSBGQUxTRTsKKwkgICAgaWYgKHNyY1swXSA9PSAnXFwnICYmIHNyY1sxXSAhPSBOVUwpCisJICAgIHsKKwkJKmRzdCsrID0gKnNyYysrOworCQktLWRzdGxlbjsKKwkgICAgfQorCSAgICBlbHNlIGlmIChzcmNbMF0gPT0gJyAnIHx8IHNyY1swXSA9PSAnLCcpCisJCWF0X3N0YXJ0ID0gVFJVRTsKKwkgICAgKmRzdCsrID0gKnNyYysrOworCSAgICAtLWRzdGxlbjsKKwl9CisgICAgfQorICAgICpkc3QgPSBOVUw7Cit9CisKKy8qCisgKiBWaW0ncyB2ZXJzaW9uIG9mIGdldGVudigpLgorICogU3BlY2lhbCBoYW5kbGluZyBvZiAkSE9NRSwgJFZJTSBhbmQgJFZJTVJVTlRJTUUuCisgKi8KKyAgICBjaGFyX3UgKgordmltX2dldGVudihuYW1lLCBtdXN0ZnJlZSkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQkqbXVzdGZyZWU7CS8qIHNldCB0byBUUlVFIHdoZW4gcmV0dXJuZWQgaXMgYWxsb2NhdGVkICovCit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqcGVuZDsKKyAgICBpbnQJCXZpbXJ1bnRpbWU7CisKKyNpZiBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyAgICAvKiB1c2UgIkM6LyIgd2hlbiAkSE9NRSBpcyBub3Qgc2V0ICovCisgICAgaWYgKFNUUkNNUChuYW1lLCAiSE9NRSIpID09IDApCisJcmV0dXJuIGhvbWVkaXI7CisjZW5kaWYKKworICAgIHAgPSBtY2hfZ2V0ZW52KG5hbWUpOworICAgIGlmIChwICE9IE5VTEwgJiYgKnAgPT0gTlVMKQkgICAgLyogZW1wdHkgaXMgdGhlIHNhbWUgYXMgbm90IHNldCAqLworCXAgPSBOVUxMOworCisgICAgaWYgKHAgIT0gTlVMTCkKKwlyZXR1cm4gcDsKKworICAgIHZpbXJ1bnRpbWUgPSAoU1RSQ01QKG5hbWUsICJWSU1SVU5USU1FIikgPT0gMCk7CisgICAgaWYgKCF2aW1ydW50aW1lICYmIFNUUkNNUChuYW1lLCAiVklNIikgIT0gMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogV2hlbiBleHBhbmRpbmcgJFZJTVJVTlRJTUUgZmFpbHMsIHRyeSB1c2luZyAkVklNL3ZpbTx2ZXJzaW9uPiBvciAkVklNLgorICAgICAqIERvbid0IGRvIHRoaXMgd2hlbiBkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyIGlzIG5vbi1lbXB0eS4KKyAgICAgKi8KKyAgICBpZiAodmltcnVudGltZQorI2lmZGVmIEhBVkVfUEFUSERFRgorCSAgICAmJiAqZGVmYXVsdF92aW1ydW50aW1lX2RpciA9PSBOVUwKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisJcCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJWSU0iKTsKKwlpZiAocCAhPSBOVUxMICYmICpwID09IE5VTCkJICAgIC8qIGVtcHR5IGlzIHRoZSBzYW1lIGFzIG5vdCBzZXQgKi8KKwkgICAgcCA9IE5VTEw7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIHAgPSB2aW1fdmVyc2lvbl9kaXIocCk7CisJICAgIGlmIChwICE9IE5VTEwpCisJCSptdXN0ZnJlZSA9IFRSVUU7CisJICAgIGVsc2UKKwkJcCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJWSU0iKTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXaGVuIGV4cGFuZGluZyAkVklNIG9yICRWSU1SVU5USU1FIGZhaWxzLCB0cnkgdXNpbmc6CisgICAgICogLSB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSAnaGVscGZpbGUnICh1bmxlc3MgaXQgY29udGFpbnMgJyQnKQorICAgICAqIC0gdGhlIGV4ZWN1dGFibGUgbmFtZSBmcm9tIGFyZ3ZbMF0KKyAgICAgKi8KKyAgICBpZiAocCA9PSBOVUxMKQorICAgIHsKKwlpZiAocF9oZiAhPSBOVUxMICYmIHZpbV9zdHJjaHIocF9oZiwgJyQnKSA9PSBOVUxMKQorCSAgICBwID0gcF9oZjsKKyNpZmRlZiBVU0VfRVhFX05BTUUKKwkvKgorCSAqIFVzZSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSwgb2J0YWluZWQgZnJvbSBhcmd2WzBdLgorCSAqLworCWVsc2UKKwkgICAgcCA9IGV4ZV9uYW1lOworI2VuZGlmCisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIC8qIHJlbW92ZSB0aGUgZmlsZSBuYW1lICovCisJICAgIHBlbmQgPSBnZXR0YWlsKHApOworCisJICAgIC8qIHJlbW92ZSAiZG9jLyIgZnJvbSAnaGVscGZpbGUnLCBpZiBwcmVzZW50ICovCisJICAgIGlmIChwID09IHBfaGYpCisJCXBlbmQgPSByZW1vdmVfdGFpbChwLCBwZW5kLCAoY2hhcl91ICopImRvYyIpOworCisjaWZkZWYgVVNFX0VYRV9OQU1FCisjIGlmZGVmIE1BQ09TX1gKKwkgICAgLyogcmVtb3ZlICJidWlsZC8uLi4iIGZyb20gZXhlX25hbWUsIGlmIHByZXNlbnQgKi8KKwkgICAgaWYgKHAgPT0gZXhlX25hbWUpCisJICAgIHsKKwkJY2hhcl91CSpwZW5kMTsKKwkJY2hhcl91ICAqcGVuZDI7CisKKwkJcGVuZDEgPSByZW1vdmVfdGFpbChwLCBwZW5kLCAoY2hhcl91ICopIkNvbnRlbnRzL01hY09TIik7CisJCXBlbmQyID0gcmVtb3ZlX3RhaWxfd2l0aF9leHQocCwgcGVuZDEsIChjaGFyX3UgKikiLmFwcCIpOworCQlwZW5kID0gcmVtb3ZlX3RhaWwocCwgcGVuZDIsIChjaGFyX3UgKikiYnVpbGQiKTsKKwkJLyogV2hlbiBydW5uaWcgZnJvbSBwcm9qZWN0IGJ1aWxkZXIgZ2V0IHJpZCBvZiB0aGUKKwkJICogYnVpbGQvPz8/LmFwcCwgb3RoZXJ3aXNlIGtlZXAgdGhlID8/Py5hcHAgKi8KKwkJaWYgKHBlbmQyID09IHBlbmQpCisJCSAgICBwZW5kID0gcGVuZDE7CisJICAgIH0KKyMgZW5kaWYKKwkgICAgLyogcmVtb3ZlICJzcmMvIiBmcm9tIGV4ZV9uYW1lLCBpZiBwcmVzZW50ICovCisJICAgIGlmIChwID09IGV4ZV9uYW1lKQorCQlwZW5kID0gcmVtb3ZlX3RhaWwocCwgcGVuZCwgKGNoYXJfdSAqKSJzcmMiKTsKKyNlbmRpZgorCisJICAgIC8qIGZvciAkVklNLCByZW1vdmUgInJ1bnRpbWUvIiBvciAidmltNTQvIiwgaWYgcHJlc2VudCAqLworCSAgICBpZiAoIXZpbXJ1bnRpbWUpCisJICAgIHsKKwkJcGVuZCA9IHJlbW92ZV90YWlsKHAsIHBlbmQsIChjaGFyX3UgKilSVU5USU1FX0RJUk5BTUUpOworCQlwZW5kID0gcmVtb3ZlX3RhaWwocCwgcGVuZCwgKGNoYXJfdSAqKVZJTV9WRVJTSU9OX05PRE9UKTsKKwkgICAgfQorCisJICAgIC8qIHJlbW92ZSB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciAqLworI2lmbmRlZiBNQUNPU19DTEFTU0lDCisJICAgIC8qIFdpdGggTWFjT1MgcGF0aCAod2l0aCAgY29sb25zKSB0aGUgZmluYWwgY29sb24gaXMgcmVxdWlyZWQgKi8KKwkgICAgLyogdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gYWJzb3VsdXRlIGFuZCByZWxhdGl2ZSBwYXRoICovCisJICAgIGlmIChwZW5kID4gcCAmJiB2aW1faXNwYXRoc2VwKCoocGVuZCAtIDEpKSkKKwkJLS1wZW5kOworI2VuZGlmCisKKwkgICAgLyogY2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzIGEgZGlyZWN0b3J5IG5hbWUgKi8KKwkgICAgcCA9IHZpbV9zdHJuc2F2ZShwLCAoaW50KShwZW5kIC0gcCkpOworCisJICAgIGlmIChwICE9IE5VTEwgJiYgIW1jaF9pc2RpcihwKSkKKwkgICAgeworCQl2aW1fZnJlZShwKTsKKwkJcCA9IE5VTEw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgVVNFX0VYRV9OQU1FCisJCS8qIG1heSBhZGQgIi92aW01NCIgb3IgIi9ydW50aW1lIiBpZiBpdCBleGlzdHMgKi8KKwkJaWYgKHZpbXJ1bnRpbWUgJiYgKHBlbmQgPSB2aW1fdmVyc2lvbl9kaXIocCkpICE9IE5VTEwpCisJCXsKKwkJICAgIHZpbV9mcmVlKHApOworCQkgICAgcCA9IHBlbmQ7CisJCX0KKyNlbmRpZgorCQkqbXVzdGZyZWUgPSBUUlVFOworCSAgICB9CisJfQorICAgIH0KKworI2lmZGVmIEhBVkVfUEFUSERFRgorICAgIC8qIFdoZW4gdGhlcmUgaXMgYSBwYXRoZGVmLmMgZmlsZSB3ZSBjYW4gdXNlIGRlZmF1bHRfdmltX2RpciBhbmQKKyAgICAgKiBkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyICovCisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICB7CisJLyogT25seSB1c2UgZGVmYXVsdF92aW1ydW50aW1lX2RpciB3aGVuIGl0IGlzIG5vdCBlbXB0eSAqLworCWlmICh2aW1ydW50aW1lICYmICpkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyICE9IE5VTCkKKwl7CisJICAgIHAgPSBkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyOworCSAgICAqbXVzdGZyZWUgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAoKmRlZmF1bHRfdmltX2RpciAhPSBOVUwpCisJeworCSAgICBpZiAodmltcnVudGltZSAmJiAocCA9IHZpbV92ZXJzaW9uX2RpcihkZWZhdWx0X3ZpbV9kaXIpKSAhPSBOVUxMKQorCQkqbXVzdGZyZWUgPSBUUlVFOworCSAgICBlbHNlCisJICAgIHsKKwkJcCA9IGRlZmF1bHRfdmltX2RpcjsKKwkJKm11c3RmcmVlID0gRkFMU0U7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIHRoYXQgdGhlIG5ldyB2YWx1ZSBjYW4gYmUgZm91bmQgZmFzdAorICAgICAqIG5leHQgdGltZSwgYW5kIG90aGVycyBjYW4gYWxzbyB1c2UgaXQgKGUuZy4gUGVybCkuCisgICAgICovCisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJaWYgKHZpbXJ1bnRpbWUpCisJeworCSAgICB2aW1fc2V0ZW52KChjaGFyX3UgKikiVklNUlVOVElNRSIsIHApOworCSAgICBkaWRzZXRfdmltcnVudGltZSA9IFRSVUU7CisjaWZkZWYgRkVBVF9HRVRURVhUCisJICAgIHsKKwkJY2hhcl91CSpidWYgPSBhbGxvYygodW5zaWduZWQgaW50KVNUUkxFTihwKSArIDYpOworCisJCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQkgICAgU1RSQ1BZKGJ1ZiwgcCk7CisJCSAgICBTVFJDQVQoYnVmLCAiL2xhbmciKTsKKwkJICAgIGJpbmR0ZXh0ZG9tYWluKFZJTVBBQ0tBR0UsIChjaGFyICopYnVmKTsKKwkJICAgIHZpbV9mcmVlKGJ1Zik7CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorCWVsc2UKKwl7CisJICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJWSU0iLCBwKTsKKwkgICAgZGlkc2V0X3ZpbSA9IFRSVUU7CisJfQorICAgIH0KKyAgICByZXR1cm4gcDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgInZpbWRpci88dmVyc2lvbj4iIG9yICJ2aW1kaXIvcnVudGltZSIgZXhpc3RzLgorICogUmV0dXJuIE5VTEwgaWYgbm90LCByZXR1cm4gaXRzIG5hbWUgaW4gYWxsb2NhdGVkIG1lbW9yeSBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3ZpbV92ZXJzaW9uX2Rpcih2aW1kaXIpCisgICAgY2hhcl91CSp2aW1kaXI7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgaWYgKHZpbWRpciA9PSBOVUxMIHx8ICp2aW1kaXIgPT0gTlVMKQorCXJldHVybiBOVUxMOworICAgIHAgPSBjb25jYXRfZm5hbWVzKHZpbWRpciwgKGNoYXJfdSAqKVZJTV9WRVJTSU9OX05PRE9ULCBUUlVFKTsKKyAgICBpZiAocCAhPSBOVUxMICYmIG1jaF9pc2RpcihwKSkKKwlyZXR1cm4gcDsKKyAgICB2aW1fZnJlZShwKTsKKyAgICBwID0gY29uY2F0X2ZuYW1lcyh2aW1kaXIsIChjaGFyX3UgKilSVU5USU1FX0RJUk5BTUUsIFRSVUUpOworICAgIGlmIChwICE9IE5VTEwgJiYgbWNoX2lzZGlyKHApKQorCXJldHVybiBwOworICAgIHZpbV9mcmVlKHApOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogSWYgdGhlIHN0cmluZyBiZXR3ZWVuICJwIiBhbmQgInBlbmQiIGVuZHMgaW4gIm5hbWUvIiwgcmV0dXJuICJwZW5kIiBtaW51cworICogdGhlIGxlbmd0aCBvZiAibmFtZS8iLiAgT3RoZXJ3aXNlIHJldHVybiAicGVuZCIuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3JlbW92ZV90YWlsKHAsIHBlbmQsIG5hbWUpCisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqcGVuZDsKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgaW50CQlsZW4gPSAoaW50KVNUUkxFTihuYW1lKSArIDE7CisgICAgY2hhcl91CSpuZXdlbmQgPSBwZW5kIC0gbGVuOworCisgICAgaWYgKG5ld2VuZCA+PSBwCisJICAgICYmIGZuYW1lbmNtcChuZXdlbmQsIG5hbWUsIGxlbiAtIDEpID09IDAKKwkgICAgJiYgKG5ld2VuZCA9PSBwIHx8IHZpbV9pc3BhdGhzZXAoKihuZXdlbmQgLSAxKSkpKQorCXJldHVybiBuZXdlbmQ7CisgICAgcmV0dXJuIHBlbmQ7Cit9CisKKyNpZiBkZWZpbmVkKFVTRV9FWEVfTkFNRSkgJiYgZGVmaW5lZChNQUNPU19YKQorLyoKKyAqIElmIHRoZSBzdHJpbmcgYmV0d2VlbiAicCIgYW5kICJwZW5kIiBlbmRzIGluICI/Pz8uZXh0LyIsIHJldHVybiAicGVuZCIKKyAqIG1pbnVzIHRoZSBsZW5ndGggb2YgIj8/Py5leHQvIi4gIE90aGVyd2lzZSByZXR1cm4gInBlbmQiLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZW1vdmVfdGFpbF93aXRoX2V4dChwLCBwZW5kLCBleHQpCisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqcGVuZDsKKyAgICBjaGFyX3UJKmV4dDsKK3sKKyAgICBpbnQJCWxlbiA9IChpbnQpU1RSTEVOKGV4dCkgKyAxOworICAgIGNoYXJfdQkqbmV3ZW5kID0gcGVuZCAtIGxlbjsKKworICAgIGlmIChuZXdlbmQgPj0gcCAmJiBmbmFtZW5jbXAobmV3ZW5kLCBleHQsIGxlbiAtIDEpID09IDApCisJd2hpbGUgKG5ld2VuZCAhPSBwICYmICF2aW1faXNwYXRoc2VwKCoobmV3ZW5kIC0gMSkpKQorCSAgICAtLW5ld2VuZDsKKyAgICBpZiAobmV3ZW5kID09IHAgfHwgdmltX2lzcGF0aHNlcCgqKG5ld2VuZCAtIDEpKSkKKwlyZXR1cm4gbmV3ZW5kOworICAgIHJldHVybiBwZW5kOworfQorI2VuZGlmCisKKy8qCisgKiBDYWxsIGV4cGFuZF9lbnYoKSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhbiBhbGxvY2F0ZWQgc3RyaW5nLgorICogVGhpcyBpcyBub3QgdmVyeSBtZW1vcnkgZWZmaWNpZW50LCB0aGlzIGV4cGVjdHMgdGhlIHJlc3VsdCB0byBiZSBmcmVlZAorICogYWdhaW4gc29vbi4KKyAqLworICAgIGNoYXJfdSAqCitleHBhbmRfZW52X3NhdmUoc3JjKQorICAgIGNoYXJfdQkqc3JjOworeworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBhbGxvYyhNQVhQQVRITCk7CisgICAgaWYgKHAgIT0gTlVMTCkKKwlleHBhbmRfZW52KHNyYywgcCwgTUFYUEFUSEwpOworICAgIHJldHVybiBwOworfQorCisvKgorICogT3VyIHBvcnRhYmxlIHZlcnNpb24gb2Ygc2V0ZW52LgorICovCisgICAgdm9pZAordmltX3NldGVudihuYW1lLCB2YWwpCisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqdmFsOworeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgbWNoX3NldGVudigoY2hhciAqKW5hbWUsIChjaGFyICopdmFsLCAxKTsKKyNlbHNlCisgICAgY2hhcl91CSplbnZidWY7CisKKyAgICAvKgorICAgICAqIFB1dGVudiBkb2VzIG5vdCBjb3B5IHRoZSBzdHJpbmcsIGl0IGhhcyB0byByZW1haW4KKyAgICAgKiB2YWxpZC4gIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IHdpbGwgbmV2ZXIgYmUgZnJlZWQuCisgICAgICovCisgICAgZW52YnVmID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4obmFtZSkgKyBTVFJMRU4odmFsKSArIDIpKTsKKyAgICBpZiAoZW52YnVmICE9IE5VTEwpCisgICAgeworCXNwcmludGYoKGNoYXIgKillbnZidWYsICIlcz0lcyIsIG5hbWUsIHZhbCk7CisJcHV0ZW52KChjaGFyICopZW52YnVmKTsKKyAgICB9CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgY2hhcl91ICoKK2dldF9lbnZfbmFtZSh4cCwgaWR4KQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBpbnQJCWlkeDsKK3sKKyMgaWYgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykKKyAgICAvKgorICAgICAqIE5vIGVudmlyb25bXSBvbiB0aGUgQW1pZ2EgYW5kIG9uIHRoZSBNYWMgKHVzaW5nIE1QVykuCisgICAgICovCisgICAgcmV0dXJuIE5VTEw7CisjIGVsc2UKKyMgaWZuZGVmIF9fV0lOMzJfXworICAgIC8qIEJvcmxhbmQgQysrIDUuMiBoYXMgdGhpcyBpbiBhIGhlYWRlciBmaWxlLiAqLworICAgIGV4dGVybiBjaGFyCQkqKmVudmlyb247CisjIGVuZGlmCisgICAgc3RhdGljIGNoYXJfdQluYW1lWzEwMF07CisgICAgY2hhcl91CQkqc3RyOworICAgIGludAkJCW47CisKKyAgICBzdHIgPSAoY2hhcl91ICopZW52aXJvbltpZHhdOworICAgIGlmIChzdHIgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGZvciAobiA9IDA7IG4gPCA5OTsgKytuKQorICAgIHsKKwlpZiAoc3RyW25dID09ICc9JyB8fCBzdHJbbl0gPT0gTlVMKQorCSAgICBicmVhazsKKwluYW1lW25dID0gc3RyW25dOworICAgIH0KKyAgICBuYW1lW25dID0gTlVMOworICAgIHJldHVybiBuYW1lOworIyBlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBSZXBsYWNlIGhvbWUgZGlyZWN0b3J5IGJ5ICJ+IiBpbiBlYWNoIHNwYWNlIG9yIGNvbW1hIHNlcGFyYXRlZCBmaWxlIG5hbWUgaW4KKyAqICdzcmMnLgorICogSWYgYW55dGhpbmcgZmFpbHMgKGV4Y2VwdCB3aGVuIG91dCBvZiBzcGFjZSkgZHN0IGVxdWFscyBzcmMuCisgKi8KKyAgICB2b2lkCitob21lX3JlcGxhY2UoYnVmLCBzcmMsIGRzdCwgZHN0bGVuLCBvbmUpCisgICAgYnVmX1QJKmJ1ZjsJLyogd2hlbiBub3QgTlVMTCwgY2hlY2sgZm9yIGhlbHAgZmlsZXMgKi8KKyAgICBjaGFyX3UJKnNyYzsJLyogaW5wdXQgZmlsZSBuYW1lICovCisgICAgY2hhcl91CSpkc3Q7CS8qIHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0ICovCisgICAgaW50CQlkc3RsZW47CS8qIG1heGltdW0gbGVuZ3RoIG9mIHRoZSByZXN1bHQgKi8KKyAgICBpbnQJCW9uZTsJLyogaWYgVFJVRSwgb25seSByZXBsYWNlIG9uZSBmaWxlIG5hbWUsIGluY2x1ZGUKKwkJCSAgIHNwYWNlcyBhbmQgY29tbWFzIGluIHRoZSBmaWxlIG5hbWUuICovCit7CisgICAgc2l6ZV90CWRpcmxlbiA9IDAsIGVudmxlbiA9IDA7CisgICAgc2l6ZV90CWxlbjsKKyAgICBjaGFyX3UJKmhvbWVkaXJfZW52OworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChzcmMgPT0gTlVMTCkKKyAgICB7CisJKmRzdCA9IE5VTDsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgZmlsZSBpcyBhIGhlbHAgZmlsZSwgcmVtb3ZlIHRoZSBwYXRoIGNvbXBsZXRlbHkuCisgICAgICovCisgICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGJ1Zi0+Yl9oZWxwKQorICAgIHsKKwlTVFJDUFkoZHN0LCBnZXR0YWlsKHNyYykpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIGNoZWNrIGJvdGggdGhlIHZhbHVlIG9mIHRoZSAkSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlCisgICAgICogInJlYWwiIGhvbWUgZGlyZWN0b3J5LgorICAgICAqLworICAgIGlmIChob21lZGlyICE9IE5VTEwpCisJZGlybGVuID0gU1RSTEVOKGhvbWVkaXIpOworCisjaWZkZWYgVk1TCisgICAgaG9tZWRpcl9lbnYgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiU1lTJExPR0lOIik7CisjZWxzZQorICAgIGhvbWVkaXJfZW52ID0gbWNoX2dldGVudigoY2hhcl91ICopIkhPTUUiKTsKKyNlbmRpZgorCisgICAgaWYgKGhvbWVkaXJfZW52ICE9IE5VTEwgJiYgKmhvbWVkaXJfZW52ID09IE5VTCkKKwlob21lZGlyX2VudiA9IE5VTEw7CisgICAgaWYgKGhvbWVkaXJfZW52ICE9IE5VTEwpCisJZW52bGVuID0gU1RSTEVOKGhvbWVkaXJfZW52KTsKKworICAgIGlmICghb25lKQorCXNyYyA9IHNraXB3aGl0ZShzcmMpOworICAgIHdoaWxlICgqc3JjICYmIGRzdGxlbiA+IDApCisgICAgeworCS8qCisJICogSGVyZSB3ZSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUgbmFtZS4KKwkgKiBGaXJzdCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgbmFtZSBtYXRjaGVzCisJICogJEhPTUUgb3IgdGhlICJyZWFsIiBob21lIGRpcmVjdG9yeS4gQ2hlY2sgdGhhdCB0aGVyZSBpcyBhICcvJworCSAqIGFmdGVyIHRoZSBtYXRjaCAoc28gdGhhdCBpZiBlLmcuIHRoZSBmaWxlIGlzICIvaG9tZS9waWV0ZXIvYmxhIiwKKwkgKiBhbmQgdGhlIGhvbWUgZGlyZWN0b3J5IGlzICIvaG9tZS9waWV0IiwgdGhlIGZpbGUgZG9lcyBub3QgZW5kIHVwCisJICogYXMgIn5lci9ibGEiICh3aGljaCB3b3VsZCBzZWVtIHRvIGluZGljYXRlIHRoZSBmaWxlICJibGEiIGluIHVzZXIKKwkgKiBlcidzIGhvbWUgZGlyZWN0b3J5KSkuCisJICovCisJcCA9IGhvbWVkaXI7CisJbGVuID0gZGlybGVuOworCWZvciAoOzspCisJeworCSAgICBpZiAoICAgbGVuCisJCSYmIGZuYW1lbmNtcChzcmMsIHAsIGxlbikgPT0gMAorCQkmJiAodmltX2lzcGF0aHNlcChzcmNbbGVuXSkKKwkJICAgIHx8ICghb25lICYmIChzcmNbbGVuXSA9PSAnLCcgfHwgc3JjW2xlbl0gPT0gJyAnKSkKKwkJICAgIHx8IHNyY1tsZW5dID09IE5VTCkpCisJICAgIHsKKwkJc3JjICs9IGxlbjsKKwkJaWYgKC0tZHN0bGVuID4gMCkKKwkJICAgICpkc3QrKyA9ICd+JzsKKworCQkvKgorCQkgKiBJZiBpdCdzIGp1c3QgdGhlIGhvbWUgZGlyZWN0b3J5LCBhZGQgICIvIi4KKwkJICovCisJCWlmICghdmltX2lzcGF0aHNlcChzcmNbMF0pICYmIC0tZHN0bGVuID4gMCkKKwkJICAgICpkc3QrKyA9ICcvJzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHAgPT0gaG9tZWRpcl9lbnYpCisJCWJyZWFrOworCSAgICBwID0gaG9tZWRpcl9lbnY7CisJICAgIGxlbiA9IGVudmxlbjsKKwl9CisKKwkvKiBpZiAoIW9uZSkgc2tpcCB0byBzZXBhcmF0b3I6IHNwYWNlIG9yIGNvbW1hICovCisJd2hpbGUgKCpzcmMgJiYgKG9uZSB8fCAoKnNyYyAhPSAnLCcgJiYgKnNyYyAhPSAnICcpKSAmJiAtLWRzdGxlbiA+IDApCisJICAgICpkc3QrKyA9ICpzcmMrKzsKKwkvKiBza2lwIHNlcGFyYXRvciAqLworCXdoaWxlICgoKnNyYyA9PSAnICcgfHwgKnNyYyA9PSAnLCcpICYmIC0tZHN0bGVuID4gMCkKKwkgICAgKmRzdCsrID0gKnNyYysrOworICAgIH0KKyAgICAvKiBpZiAoZHN0bGVuID09IDApIG91dCBvZiBzcGFjZSwgd2hhdCB0byBkbz8/PyAqLworCisgICAgKmRzdCA9IE5VTDsKK30KKworLyoKKyAqIExpa2UgaG9tZV9yZXBsYWNlLCBzdG9yZSB0aGUgcmVwbGFjZWQgc3RyaW5nIGluIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBXaGVuIHNvbWV0aGluZyBmYWlscywgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworICAgIGNoYXJfdSAgKgoraG9tZV9yZXBsYWNlX3NhdmUoYnVmLCBzcmMpCisgICAgYnVmX1QJKmJ1ZjsJLyogd2hlbiBub3QgTlVMTCwgY2hlY2sgZm9yIGhlbHAgZmlsZXMgKi8KKyAgICBjaGFyX3UJKnNyYzsJLyogaW5wdXQgZmlsZSBuYW1lICovCit7CisgICAgY2hhcl91CSpkc3Q7CisgICAgdW5zaWduZWQJbGVuOworCisgICAgbGVuID0gMzsJCQkvKiBzcGFjZSBmb3IgIn4vIiBhbmQgdHJhaWxpbmcgTlVMICovCisgICAgaWYgKHNyYyAhPSBOVUxMKQkJLyoganVzdCBpbiBjYXNlICovCisJbGVuICs9ICh1bnNpZ25lZClTVFJMRU4oc3JjKTsKKyAgICBkc3QgPSBhbGxvYyhsZW4pOworICAgIGlmIChkc3QgIT0gTlVMTCkKKwlob21lX3JlcGxhY2UoYnVmLCBzcmMsIGRzdCwgbGVuLCBUUlVFKTsKKyAgICByZXR1cm4gZHN0OworfQorCisvKgorICogQ29tcGFyZSB0d28gZmlsZSBuYW1lcyBhbmQgcmV0dXJuOgorICogRlBDX1NBTUUgICBpZiB0aGV5IGJvdGggZXhpc3QgYW5kIGFyZSB0aGUgc2FtZSBmaWxlLgorICogRlBDX1NBTUVYICBpZiB0aGV5IGJvdGggZG9uJ3QgZXhpc3QgYW5kIGhhdmUgdGhlIHNhbWUgZmlsZSBuYW1lLgorICogRlBDX0RJRkYgICBpZiB0aGV5IGJvdGggZXhpc3QgYW5kIGFyZSBkaWZmZXJlbnQgZmlsZXMuCisgKiBGUENfTk9UWCAgIGlmIHRoZXkgYm90aCBkb24ndCBleGlzdC4KKyAqIEZQQ19ESUZGWCAgaWYgb25lIG9mIHRoZW0gZG9lc24ndCBleGlzdC4KKyAqIEZvciB0aGUgZmlyc3QgbmFtZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkCisgKi8KKyAgICBpbnQKK2Z1bGxwYXRoY21wKHMxLCBzMiwgY2hlY2tuYW1lKQorICAgIGNoYXJfdSAqczEsICpzMjsKKyAgICBpbnQJICAgIGNoZWNrbmFtZTsJCS8qIHdoZW4gYm90aCBkb24ndCBleGlzdCwgY2hlY2sgZmlsZSBuYW1lcyAqLworeworI2lmZGVmIFVOSVgKKyAgICBjaGFyX3UJICAgIGV4cDFbTUFYUEFUSExdOworICAgIGNoYXJfdQkgICAgZnVsbDFbTUFYUEFUSExdOworICAgIGNoYXJfdQkgICAgZnVsbDJbTUFYUEFUSExdOworICAgIHN0cnVjdCBzdGF0CSAgICBzdDEsIHN0MjsKKyAgICBpbnQJCSAgICByMSwgcjI7CisKKyAgICBleHBhbmRfZW52KHMxLCBleHAxLCBNQVhQQVRITCk7CisgICAgcjEgPSBtY2hfc3RhdCgoY2hhciAqKWV4cDEsICZzdDEpOworICAgIHIyID0gbWNoX3N0YXQoKGNoYXIgKilzMiwgJnN0Mik7CisgICAgaWYgKHIxICE9IDAgJiYgcjIgIT0gMCkKKyAgICB7CisJLyogaWYgbWNoX3N0YXQoKSBkb2Vzbid0IHdvcmssIG1heSBjb21wYXJlIHRoZSBuYW1lcyAqLworCWlmIChjaGVja25hbWUpCisJeworCSAgICBpZiAoZm5hbWVjbXAoZXhwMSwgczIpID09IDApCisJCXJldHVybiBGUENfU0FNRVg7CisJICAgIHIxID0gdmltX0Z1bGxOYW1lKGV4cDEsIGZ1bGwxLCBNQVhQQVRITCwgRkFMU0UpOworCSAgICByMiA9IHZpbV9GdWxsTmFtZShzMiwgZnVsbDIsIE1BWFBBVEhMLCBGQUxTRSk7CisJICAgIGlmIChyMSA9PSBPSyAmJiByMiA9PSBPSyAmJiBmbmFtZWNtcChmdWxsMSwgZnVsbDIpID09IDApCisJCXJldHVybiBGUENfU0FNRVg7CisJfQorCXJldHVybiBGUENfTk9UWDsKKyAgICB9CisgICAgaWYgKHIxICE9IDAgfHwgcjIgIT0gMCkKKwlyZXR1cm4gRlBDX0RJRkZYOworICAgIGlmIChzdDEuc3RfZGV2ID09IHN0Mi5zdF9kZXYgJiYgc3QxLnN0X2lubyA9PSBzdDIuc3RfaW5vKQorCXJldHVybiBGUENfU0FNRTsKKyAgICByZXR1cm4gRlBDX0RJRkY7CisjZWxzZQorICAgIGNoYXJfdSAgKmV4cDE7CQkvKiBleHBhbmRlZCBzMSAqLworICAgIGNoYXJfdSAgKmZ1bGwxOwkJLyogZnVsbCBwYXRoIG9mIHMxICovCisgICAgY2hhcl91ICAqZnVsbDI7CQkvKiBmdWxsIHBhdGggb2YgczIgKi8KKyAgICBpbnQJICAgIHJldHZhbCA9IEZQQ19ESUZGOworICAgIGludAkgICAgcjEsIHIyOworCisgICAgLyogYWxsb2NhdGUgb25lIGJ1ZmZlciB0byBzdG9yZSB0aHJlZSBwYXRocyAoYWxsb2MoKS9mcmVlKCkgaXMgc2xvdyEpICovCisgICAgaWYgKChleHAxID0gYWxsb2MoTUFYUEFUSEwgKiAzKSkgIT0gTlVMTCkKKyAgICB7CisJZnVsbDEgPSBleHAxICsgTUFYUEFUSEw7CisJZnVsbDIgPSBmdWxsMSArIE1BWFBBVEhMOworCisJZXhwYW5kX2VudihzMSwgZXhwMSwgTUFYUEFUSEwpOworCXIxID0gdmltX0Z1bGxOYW1lKGV4cDEsIGZ1bGwxLCBNQVhQQVRITCwgRkFMU0UpOworCXIyID0gdmltX0Z1bGxOYW1lKHMyLCBmdWxsMiwgTUFYUEFUSEwsIEZBTFNFKTsKKworCS8qIElmIHZpbV9GdWxsTmFtZSgpIGZhaWxzLCB0aGUgZmlsZSBwcm9iYWJseSBkb2Vzbid0IGV4aXN0LiAqLworCWlmIChyMSAhPSBPSyAmJiByMiAhPSBPSykKKwl7CisJICAgIGlmIChjaGVja25hbWUgJiYgZm5hbWVjbXAoZXhwMSwgczIpID09IDApCisJCXJldHZhbCA9IEZQQ19TQU1FWDsKKwkgICAgZWxzZQorCQlyZXR2YWwgPSBGUENfTk9UWDsKKwl9CisJZWxzZSBpZiAocjEgIT0gT0sgfHwgcjIgIT0gT0spCisJICAgIHJldHZhbCA9IEZQQ19ESUZGWDsKKwllbHNlIGlmIChmbmFtZWNtcChmdWxsMSwgZnVsbDIpKQorCSAgICByZXR2YWwgPSBGUENfRElGRjsKKwllbHNlCisJICAgIHJldHZhbCA9IEZQQ19TQU1FOworCXZpbV9mcmVlKGV4cDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworI2VuZGlmCit9CisKKy8qCisgKiBnZXQgdGhlIHRhaWwgb2YgYSBwYXRoOiB0aGUgZmlsZSBuYW1lLgorICovCisgICAgY2hhcl91ICoKK2dldHRhaWwoZm5hbWUpCisgICAgY2hhcl91ICpmbmFtZTsKK3sKKyAgICBjaGFyX3UgICpwMSwgKnAyOworCisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuIChjaGFyX3UgKikiIjsKKyAgICBmb3IgKHAxID0gcDIgPSBmbmFtZTsgKnAyOyApCS8qIGZpbmQgbGFzdCBwYXJ0IG9mIHBhdGggKi8KKyAgICB7CisJaWYgKHZpbV9pc3BhdGhzZXAoKnAyKSkKKwkgICAgcDEgPSBwMiArIDE7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHAyICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocDIpOworCWVsc2UKKyNlbmRpZgorCSAgICArK3AyOworICAgIH0KKyAgICByZXR1cm4gcDE7Cit9CisKKy8qCisgKiBnZXQgdGhlIG5leHQgcGF0aCBjb21wb25lbnQgKGp1c3QgYWZ0ZXIgdGhlIG5leHQgcGF0aCBzZXBhcmF0b3IpLgorICovCisgICAgY2hhcl91ICoKK2dldG5leHRjb21wKGZuYW1lKQorICAgIGNoYXJfdSAqZm5hbWU7Cit7CisgICAgd2hpbGUgKCpmbmFtZSAmJiAhdmltX2lzcGF0aHNlcCgqZm5hbWUpKQorCSsrZm5hbWU7CisgICAgaWYgKCpmbmFtZSkKKwkrK2ZuYW1lOworICAgIHJldHVybiBmbmFtZTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NT0RJRllfRk5BTUUpIHx8IGRlZmluZWQoRkVBVF9FVkFMKSBcCisJfHwgZGVmaW5lZChGRUFUX1NFU1NJT04pIHx8IGRlZmluZWQoTVNXSU4pIFwKKwl8fCAoZGVmaW5lZChGRUFUX0dVSV9HVEspIFwKKwkJCSAgICAmJiAoZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9ETkQpKSkgXAorCXx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIHx8IGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgYSBwb2ludGVyIHRvIG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgaGVhZCBvZiBhIHBhdGggbmFtZS4KKyAqIFVuaXg6IGFmdGVyICIvIjsgRE9TOiBhZnRlciAiYzpcIjsgQW1pZ2E6IGFmdGVyICJkaXNrOi8iOyBNYWM6IG5vIGhlYWQuCisgKiBJZiB0aGVyZSBpcyBubyBoZWFkLCBwYXRoIGlzIHJldHVybmVkLgorICovCisgICAgY2hhcl91ICoKK2dldF9wYXN0X2hlYWQocGF0aCkKKyAgICBjaGFyX3UgICpwYXRoOworeworICAgIGNoYXJfdSAgKnJldHZhbDsKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKQorICAgIC8qIG1heSBza2lwICJjOiIgKi8KKyAgICBpZiAoaXNhbHBoYShwYXRoWzBdKSAmJiBwYXRoWzFdID09ICc6JykKKwlyZXR2YWwgPSBwYXRoICsgMjsKKyAgICBlbHNlCisJcmV0dmFsID0gcGF0aDsKKyNlbHNlCisjIGlmIGRlZmluZWQoQU1JR0EpCisgICAgLyogbWF5IHNraXAgImxhYmVsOiIgKi8KKyAgICByZXR2YWwgPSB2aW1fc3RyY2hyKHBhdGgsICc6Jyk7CisgICAgaWYgKHJldHZhbCA9PSBOVUxMKQorCXJldHZhbCA9IHBhdGg7CisjIGVsc2UJLyogVW5peCAqLworICAgIHJldHZhbCA9IHBhdGg7CisjIGVuZGlmCisjZW5kaWYKKworICAgIHdoaWxlICh2aW1faXNwYXRoc2VwKCpyZXR2YWwpKQorCSsrcmV0dmFsOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKgorICogcmV0dXJuIFRSVUUgaWYgJ2MnIGlzIGEgcGF0aCBzZXBhcmF0b3IuCisgKi8KKyAgICBpbnQKK3ZpbV9pc3BhdGhzZXAoYykKKyAgICBpbnQgYzsKK3sKKyNpZmRlZiBSSVNDT1MKKyAgICByZXR1cm4gKGMgPT0gJy4nIHx8IGMgPT0gJzonKTsKKyNlbHNlCisjIGlmZGVmIFVOSVgKKyAgICByZXR1cm4gKGMgPT0gJy8nKTsJICAgIC8qIFVOSVggaGFzICc6JyBpbnNpZGUgZmlsZSBuYW1lcyAqLworIyBlbHNlCisjICBpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyAgICByZXR1cm4gKGMgPT0gJzonIHx8IGMgPT0gJy8nIHx8IGMgPT0gJ1xcJyk7CisjICBlbHNlCisjICAgaWZkZWYgVk1TCisgICAgLyogc2VydmVyInVzZXIgcGFzc3dkIjo6ZGV2aWNlOltmdWxsLnBhdGgubmFtZV1mbmFtZS5leHRlbnNpb247dmVyc2lvbiIgKi8KKyAgICByZXR1cm4gKGMgPT0gJzonIHx8IGMgPT0gJ1snIHx8IGMgPT0gJ10nIHx8IGMgPT0gJy8nCisJICAgIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJyInICk7CisjICAgZWxzZQorIyAgICBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisgICAgcmV0dXJuIChjID09ICc6Jyk7CisjICAgIGVsc2UJCS8qIEFtaWdhICovCisgICAgcmV0dXJuIChjID09ICc6JyB8fCBjID09ICcvJyk7CisjICAgIGVuZGlmCisjICAgZW5kaWYgLyogVk1TICovCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIFJJU0MgT1MgKi8KK30KKworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHJldHVybiBUUlVFIGlmICdjJyBpcyBhIHBhdGggbGlzdCBzZXBhcmF0b3IuCisgKi8KKyAgICBpbnQKK3ZpbV9pc3BhdGhsaXN0c2VwKGMpCisgICAgaW50IGM7Cit7CisjaWZkZWYgVU5JWAorICAgIHJldHVybiAoYyA9PSAnOicpOworI2Vsc2UKKyAgICByZXR1cm4gKGMgPT0gJzsnKTsJLyogbWlnaHQgbm90IGJlIHJpZ3RoIGZvciBldmVyeSBzeXN0ZW0uLi4gKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FKSAmJiBkZWZpbmVkKEJBQ0tTTEFTSF9JTl9GSUxFTkFNRSkpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFZlcnNpb25zIG9mIGZuYW1lY21wKCkgYW5kIGZuYW1lbmNtcCgpIHRoYXQgaGFuZGxlICcvJyBhbmQgJ1wnIGVxdWFsbHkuCisgKi8KKyAgICBpbnQKK3ZpbV9mbmFtZWNtcCh4LCB5KQorICAgIGNoYXJfdQkqeCwgKnk7Cit7CisgICAgcmV0dXJuIHZpbV9mbmFtZW5jbXAoeCwgeSwgTUFYUEFUSEwpOworfQorCisgICAgaW50Cit2aW1fZm5hbWVuY21wKHgsIHksIGxlbikKKyAgICBjaGFyX3UJKngsICp5OworICAgIHNpemVfdAlsZW47Cit7CisgICAgd2hpbGUgKGxlbiA+IDAgJiYgKnggJiYgKnkpCisgICAgeworCWlmIChUT0xPV0VSX0xPQygqeCkgIT0gVE9MT1dFUl9MT0MoKnkpCisJCSYmICEoKnggPT0gJy8nICYmICp5ID09ICdcXCcpCisJCSYmICEoKnggPT0gJ1xcJyAmJiAqeSA9PSAnLycpKQorCSAgICBicmVhazsKKwkrK3g7CisJKyt5OworCS0tbGVuOworICAgIH0KKyAgICBpZiAobGVuID09IDApCisJcmV0dXJuIDA7CisgICAgcmV0dXJuICgqeCAtICp5KTsKK30KKyNlbmRpZgorCisvKgorICogQ29uY2F0ZW5hdGUgZmlsZSBuYW1lcyBmbmFtZTEgYW5kIGZuYW1lMiBpbnRvIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBPbmx5IGFkZCBhICcvJyBvciAnXFwnIHdoZW4gJ3NlcCcgaXMgVFJVRSBhbmQgaXQgaXMgbmVjY2VzYXJ5LgorICovCisgICAgY2hhcl91ICAqCitjb25jYXRfZm5hbWVzKGZuYW1lMSwgZm5hbWUyLCBzZXApCisgICAgY2hhcl91ICAqZm5hbWUxOworICAgIGNoYXJfdSAgKmZuYW1lMjsKKyAgICBpbnQJICAgIHNlcDsKK3sKKyAgICBjaGFyX3UgICpkZXN0OworCisgICAgZGVzdCA9IGFsbG9jKCh1bnNpZ25lZCkoU1RSTEVOKGZuYW1lMSkgKyBTVFJMRU4oZm5hbWUyKSArIDMpKTsKKyAgICBpZiAoZGVzdCAhPSBOVUxMKQorICAgIHsKKwlTVFJDUFkoZGVzdCwgZm5hbWUxKTsKKwlpZiAoc2VwKQorCSAgICBhZGRfcGF0aHNlcChkZXN0KTsKKwlTVFJDQVQoZGVzdCwgZm5hbWUyKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qCisgKiBBZGQgYSBwYXRoIHNlcGFyYXRvciB0byBhIGZpbGUgbmFtZSwgdW5sZXNzIGl0IGFscmVhZHkgZW5kcyBpbiBhIHBhdGgKKyAqIHNlcGFyYXRvci4KKyAqLworICAgIHZvaWQKK2FkZF9wYXRoc2VwKHApCisgICAgY2hhcl91CSpwOworeworICAgIGlmICgqcCAhPSBOVUwgJiYgIXZpbV9pc3BhdGhzZXAoKihwICsgU1RSTEVOKHApIC0gMSkpKQorCVNUUkNBVChwLCBQQVRIU0VQU1RSKTsKK30KKworLyoKKyAqIEZ1bGxOYW1lX3NhdmUgLSBNYWtlIGFuIGFsbG9jYXRlZCBjb3B5IG9mIGEgZnVsbCBmaWxlIG5hbWUuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgY2hhcl91ICAqCitGdWxsTmFtZV9zYXZlKGZuYW1lLCBmb3JjZSkKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIGludAkJZm9yY2U7CSAgICAvKiBmb3JjZSBleHBhbnNpb24sIGV2ZW4gd2hlbiBpdCBhbHJlYWR5IGxvb2tzCisJCQkgICAgICAgbGlrZSBhIGZ1bGwgcGF0aCBuYW1lICovCit7CisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpuZXdfZm5hbWUgPSBOVUxMOworCisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBidWYgPSBhbGxvYygodW5zaWduZWQpTUFYUEFUSEwpOworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICB7CisJaWYgKHZpbV9GdWxsTmFtZShmbmFtZSwgYnVmLCBNQVhQQVRITCwgZm9yY2UpICE9IEZBSUwpCisJICAgIG5ld19mbmFtZSA9IHZpbV9zdHJzYXZlKGJ1Zik7CisJZWxzZQorCSAgICBuZXdfZm5hbWUgPSB2aW1fc3Ryc2F2ZShmbmFtZSk7CisJdmltX2ZyZWUoYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIG5ld19mbmFtZTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSB8fCBkZWZpbmVkKEZFQVRfU1lOX0hMKQorCitzdGF0aWMgY2hhcl91CSpza2lwX3N0cmluZyBfX0FSR1MoKGNoYXJfdSAqcCkpOworCisvKgorICogRmluZCB0aGUgc3RhcnQgb2YgYSBjb21tZW50LCBub3Qga25vd2luZyBpZiB3ZSBhcmUgaW4gYSBjb21tZW50IHJpZ2h0IG5vdy4KKyAqIFNlYXJjaCBzdGFydHMgYXQgd19jdXJzb3IubG51bSBhbmQgZ29lcyBiYWNrd2FyZHMuCisgKi8KKyAgICBwb3NfVCAqCitmaW5kX3N0YXJ0X2NvbW1lbnQoaW5kX21heGNvbW1lbnQpCSAgICAvKiBYWFggKi8KKyAgICBpbnQJCWluZF9tYXhjb21tZW50OworeworICAgIHBvc19UCSpwb3M7CisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmICgocG9zID0gZmluZG1hdGNobGltaXQoTlVMTCwgJyonLCBGTV9CQUNLV0FSRCwgaW5kX21heGNvbW1lbnQpKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgY29tbWVudCBzdGFydCB3ZSBmb3VuZCBpcyBpbnNpZGUgYSBzdHJpbmcuCisgICAgICovCisgICAgbGluZSA9IG1sX2dldChwb3MtPmxudW0pOworICAgIGZvciAocCA9IGxpbmU7ICpwICYmICh1bnNpZ25lZCkocCAtIGxpbmUpIDwgcG9zLT5jb2w7ICsrcCkKKwlwID0gc2tpcF9zdHJpbmcocCk7CisgICAgaWYgKCh1bnNpZ25lZCkocCAtIGxpbmUpID4gcG9zLT5jb2wpCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBvczsKK30KKworLyoKKyAqIFNraXAgdG8gdGhlIGVuZCBvZiBhICJzdHJpbmciIGFuZCBhICdjJyBjaGFyYWN0ZXIuCisgKiBJZiB0aGVyZSBpcyBubyBzdHJpbmcgb3IgY2hhcmFjdGVyLCByZXR1cm4gYXJndW1lbnQgdW5tb2RpZmllZC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorc2tpcF9zdHJpbmcocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIGludAkgICAgaTsKKworICAgIC8qCisgICAgICogV2UgbG9vcCwgYmVjYXVzZSBzdHJpbmdzIG1heSBiZSBjb25jYXRlbmF0ZWQ6ICJkYXRlIiJ0aW1lIi4KKyAgICAgKi8KKyAgICBmb3IgKCA7IDsgKytwKQorICAgIHsKKwlpZiAocFswXSA9PSAnXCcnKQkJICAgIC8qICdjJyBvciAnXG4nIG9yICdcMDAwJyAqLworCXsKKwkgICAgaWYgKCFwWzFdKQkJCSAgICAvKiAnIGF0IGVuZCBvZiBsaW5lICovCisJCWJyZWFrOworCSAgICBpID0gMjsKKwkgICAgaWYgKHBbMV0gPT0gJ1xcJykJCSAgICAvKiAnXG4nIG9yICdcMDAwJyAqLworCSAgICB7CisJCSsraTsKKwkJd2hpbGUgKHZpbV9pc2RpZ2l0KHBbaSAtIDFdKSkgICAvKiAnXDAwMCcgKi8KKwkJICAgICsraTsKKwkgICAgfQorCSAgICBpZiAocFtpXSA9PSAnXCcnKQkJICAgIC8qIGNoZWNrIGZvciB0cmFpbGluZyAnICovCisJICAgIHsKKwkJcCArPSBpOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKwllbHNlIGlmIChwWzBdID09ICciJykJCSAgICAvKiBzdGFydCBvZiBzdHJpbmcgKi8KKwl7CisJICAgIGZvciAoKytwOyBwWzBdOyArK3ApCisJICAgIHsKKwkJaWYgKHBbMF0gPT0gJ1xcJyAmJiBwWzFdICE9IE5VTCkKKwkJICAgICsrcDsKKwkJZWxzZSBpZiAocFswXSA9PSAnIicpCSAgICAvKiBlbmQgb2Ygc3RyaW5nICovCisJCSAgICBicmVhazsKKwkgICAgfQorCSAgICBpZiAocFswXSA9PSAnIicpCisJCWNvbnRpbnVlOworCX0KKwlicmVhazsJCQkJICAgIC8qIG5vIHN0cmluZyBmb3VuZCAqLworICAgIH0KKyAgICBpZiAoISpwKQorCS0tcDsJCQkJICAgIC8qIGJhY2t1cCBmcm9tIE5VTCAqLworICAgIHJldHVybiBwOworfQorI2VuZGlmIC8qIEZFQVRfQ0lOREVOVCB8fCBGRUFUX1NZTl9ITCAqLworCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBEbyBDIG9yIGV4cHJlc3Npb24gaW5kZW50aW5nIG9uIHRoZSBjdXJyZW50IGxpbmUuCisgKi8KKyAgICB2b2lkCitkb19jX2V4cHJfaW5kZW50KCkKK3sKKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgaWYgKCpjdXJidWYtPmJfcF9pbmRlICE9IE5VTCkKKwlmaXh0aGlzbGluZShnZXRfZXhwcl9pbmRlbnQpOworICAgIGVsc2UKKyMgZW5kaWYKKwlmaXh0aGlzbGluZShnZXRfY19pbmRlbnQpOworfQorCisvKgorICogRnVuY3Rpb25zIGZvciBDLWluZGVudGluZy4KKyAqIE1vc3Qgb2YgdGhpcyBvcmlnaW5hbGx5IGNvbWVzIGZyb20gRXJpYyBGaXNjaGVyLgorICovCisvKgorICogQmVsb3cgIlhYWCIgbWVhbnMgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSB1bmxvY2sgdGhlIGN1cnJlbnQgbGluZS4KKyAqLworCitzdGF0aWMgY2hhcl91CSpjaW5fc2tpcGNvbW1lbnQgX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIGludAljaW5fbm9jb2RlIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBwb3NfVAkqZmluZF9saW5lX2NvbW1lbnQgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50CWNpbl9pc2xhYmVsX3NraXAgX19BUkdTKChjaGFyX3UgKiopKTsKK3N0YXRpYyBpbnQJY2luX2lzZGVmYXVsdCBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgY2hhcl91CSphZnRlcl9sYWJlbCBfX0FSR1MoKGNoYXJfdSAqbCkpOworc3RhdGljIGludAlnZXRfaW5kZW50X25vbGFiZWwgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7CitzdGF0aWMgaW50CXNraXBfbGFiZWwgX19BUkdTKChsaW5lbnJfVCwgY2hhcl91ICoqcHAsIGludCBpbmRfbWF4Y29tbWVudCkpOworc3RhdGljIGludAljaW5fZmlyc3RfaWRfYW1vdW50IF9fQVJHUygodm9pZCkpOworc3RhdGljIGludAljaW5fZ2V0X2VxdWFsX2Ftb3VudCBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK3N0YXRpYyBpbnQJY2luX2lzcHJlcHJvYyBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgaW50CWNpbl9pc3ByZXByb2NfY29udCBfX0FSR1MoKGNoYXJfdSAqKnBwLCBsaW5lbnJfVCAqbG51bXApKTsKK3N0YXRpYyBpbnQJY2luX2lzY29tbWVudCBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgaW50CWNpbl9pc2xpbmVjb21tZW50IF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBpbnQJY2luX2lzdGVybWluYXRlZCBfX0FSR1MoKGNoYXJfdSAqLCBpbnQsIGludCkpOworc3RhdGljIGludAljaW5faXNpbml0IF9fQVJHUygodm9pZCkpOworc3RhdGljIGludAljaW5faXNmdW5jZGVjbCBfX0FSR1MoKGNoYXJfdSAqKiwgbGluZW5yX1QpKTsKK3N0YXRpYyBpbnQJY2luX2lzaWYgX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIGludAljaW5faXNlbHNlIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBpbnQJY2luX2lzZG8gX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIGludAljaW5faXN3aGlsZW9mZG8gX19BUkdTKChjaGFyX3UgKiwgbGluZW5yX1QsIGludCkpOworc3RhdGljIGludAljaW5faXNicmVhayBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgaW50CWNpbl9pc19jcHBfYmFzZWNsYXNzIF9fQVJHUygoY2hhcl91ICpsaW5lLCBjb2xucl9UICpjb2wpKTsKK3N0YXRpYyBpbnQJY2luX2VuZHNfaW4gX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGNoYXJfdSAqKSk7CitzdGF0aWMgaW50CWNpbl9za2lwMnBvcyBfX0FSR1MoKHBvc19UICp0cnlwb3MpKTsKK3N0YXRpYyBwb3NfVAkqZmluZF9zdGFydF9icmFjZSBfX0FSR1MoKGludCkpOworc3RhdGljIHBvc19UCSpmaW5kX21hdGNoX3BhcmVuIF9fQVJHUygoaW50LCBpbnQpKTsKK3N0YXRpYyBpbnQJY29ycl9pbmRfbWF4cGFyZW4gX19BUkdTKChpbnQgaW5kX21heHBhcmVuLCBwb3NfVCAqc3RhcnRwb3MpKTsKK3N0YXRpYyBpbnQJZmluZF9sYXN0X3BhcmVuIF9fQVJHUygoY2hhcl91ICpsLCBpbnQgc3RhcnQsIGludCBlbmQpKTsKK3N0YXRpYyBpbnQJZmluZF9tYXRjaCBfX0FSR1MoKGludCBsb29rZm9yLCBsaW5lbnJfVCBvdXJzY29wZSwgaW50IGluZF9tYXhwYXJlbiwgaW50IGluZF9tYXhjb21tZW50KSk7CisKKy8qCisgKiBTa2lwIG92ZXIgd2hpdGUgc3BhY2UgYW5kIEMgY29tbWVudHMgd2l0aGluIHRoZSBsaW5lLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjaW5fc2tpcGNvbW1lbnQocykKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgd2hpbGUgKCpzKQorICAgIHsKKwlzID0gc2tpcHdoaXRlKHMpOworCWlmICgqcyAhPSAnLycpCisJICAgIGJyZWFrOworCSsrczsKKwlpZiAoKnMgPT0gJy8nKQkJLyogc2xhc2gtc2xhc2ggY29tbWVudCBjb250aW51ZXMgdGlsbCBlb2wgKi8KKwl7CisJICAgIHMgKz0gU1RSTEVOKHMpOworCSAgICBicmVhazsKKwl9CisJaWYgKCpzICE9ICcqJykKKwkgICAgYnJlYWs7CisJZm9yICgrK3M7ICpzOyArK3MpCS8qIHNraXAgc2xhc2gtc3RhciBjb21tZW50ICovCisJICAgIGlmIChzWzBdID09ICcqJyAmJiBzWzFdID09ICcvJykKKwkgICAgeworCQlzICs9IDI7CisJCWJyZWFrOworCSAgICB9CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlcmUgdGhlcmUgaXMgbm8gY29kZSBhdCAqcy4gIFdoaXRlIHNwYWNlIGFuZCBjb21tZW50cyBhcmUKKyAqIG5vdCBjb25zaWRlcmVkIGNvZGUuCisgKi8KKyAgICBzdGF0aWMgaW50CitjaW5fbm9jb2RlKHMpCisgICAgY2hhcl91CSpzOworeworICAgIHJldHVybiAqY2luX3NraXBjb21tZW50KHMpID09IE5VTDsKK30KKworLyoKKyAqIENoZWNrIHByZXZpb3VzIGxpbmVzIGZvciBhICIvLyIgbGluZSBjb21tZW50LCBza2lwcGluZyBvdmVyIGJsYW5rIGxpbmVzLgorICovCisgICAgc3RhdGljIHBvc19UICoKK2ZpbmRfbGluZV9jb21tZW50KCkgLyogWFhYICovCit7CisgICAgc3RhdGljIHBvc19UIHBvczsKKyAgICBjaGFyX3UJICpsaW5lOworICAgIGNoYXJfdQkgKnA7CisKKyAgICBwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIHdoaWxlICgtLXBvcy5sbnVtID4gMCkKKyAgICB7CisJbGluZSA9IG1sX2dldChwb3MubG51bSk7CisJcCA9IHNraXB3aGl0ZShsaW5lKTsKKwlpZiAoY2luX2lzbGluZWNvbW1lbnQocCkpCisJeworCSAgICBwb3MuY29sID0gKGludCkocCAtIGxpbmUpOworCSAgICByZXR1cm4gJnBvczsKKwl9CisJaWYgKCpwICE9IE5VTCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogQ2hlY2sgaWYgc3RyaW5nIG1hdGNoZXMgImxhYmVsOiI7IG1vdmUgdG8gY2hhcmFjdGVyIGFmdGVyICc6JyBpZiB0cnVlLgorICovCisgICAgc3RhdGljIGludAorY2luX2lzbGFiZWxfc2tpcChzKQorICAgIGNoYXJfdQkqKnM7Cit7CisgICAgaWYgKCF2aW1faXNJRGMoKipzKSkJICAgIC8qIG5lZWQgYXQgbGVhc3Qgb25lIElEIGNoYXJhY3RlciAqLworCXJldHVybiBGQUxTRTsKKworICAgIHdoaWxlICh2aW1faXNJRGMoKipzKSkKKwkoKnMpKys7CisKKyAgICAqcyA9IGNpbl9za2lwY29tbWVudCgqcyk7CisKKyAgICAvKiAiOjoiIGlzIG5vdCBhIGxhYmVsLCBpdCdzIEMrKyAqLworICAgIHJldHVybiAoKipzID09ICc6JyAmJiAqKysqcyAhPSAnOicpOworfQorCisvKgorICogUmVjb2duaXplIGEgbGFiZWw6ICJsYWJlbDoiLgorICogTm90ZTogY3Vyd2luLT53X2N1cnNvciBtdXN0IGJlIHdoZXJlIHdlIGFyZSBsb29raW5nIGZvciB0aGUgbGFiZWwuCisgKi8KKyAgICBpbnQKK2Npbl9pc2xhYmVsKGluZF9tYXhjb21tZW50KQkJLyogWFhYICovCisgICAgaW50CQlpbmRfbWF4Y29tbWVudDsKK3sKKyAgICBjaGFyX3UJKnM7CisKKyAgICBzID0gY2luX3NraXBjb21tZW50KG1sX2dldF9jdXJsaW5lKCkpOworCisgICAgLyoKKyAgICAgKiBFeGNsdWRlICJkZWZhdWx0IiBmcm9tIGxhYmVscywgc2luY2UgaXQgc2hvdWxkIGJlIGluZGVudGVkCisgICAgICogbGlrZSBhIHN3aXRjaCBsYWJlbC4gIFNhbWUgZm9yIEMrKyBzY29wZSBkZWNsYXJhdGlvbnMuCisgICAgICovCisgICAgaWYgKGNpbl9pc2RlZmF1bHQocykpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChjaW5faXNzY29wZWRlY2wocykpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGNpbl9pc2xhYmVsX3NraXAoJnMpKQorICAgIHsKKwkvKgorCSAqIE9ubHkgYWNjZXB0IGEgbGFiZWwgaWYgdGhlIHByZXZpb3VzIGxpbmUgaXMgdGVybWluYXRlZCBvciBpcyBhIGNhc2UKKwkgKiBsYWJlbC4KKwkgKi8KKwlwb3NfVAljdXJzb3Jfc2F2ZTsKKwlwb3NfVAkqdHJ5cG9zOworCWNoYXJfdQkqbGluZTsKKworCWN1cnNvcl9zYXZlID0gY3Vyd2luLT53X2N1cnNvcjsKKwl3aGlsZSAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gMSkKKwl7CisJICAgIC0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworCisJICAgIC8qCisJICAgICAqIElmIHdlJ3JlIGluIGEgY29tbWVudCBub3csIHNraXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb21tZW50LgorCSAgICAgKi8KKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCSAgICBpZiAoKHRyeXBvcyA9IGZpbmRfc3RhcnRfY29tbWVudChpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpIC8qIFhYWCAqLworCQljdXJ3aW4tPndfY3Vyc29yID0gKnRyeXBvczsKKworCSAgICBsaW5lID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwkgICAgaWYgKGNpbl9pc3ByZXByb2MobGluZSkpCS8qIGlnbm9yZSAjZGVmaW5lcywgI2lmLCBldGMuICovCisJCWNvbnRpbnVlOworCSAgICBpZiAoKihsaW5lID0gY2luX3NraXBjb21tZW50KGxpbmUpKSA9PSBOVUwpCisJCWNvbnRpbnVlOworCisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBjdXJzb3Jfc2F2ZTsKKwkgICAgaWYgKGNpbl9pc3Rlcm1pbmF0ZWQobGluZSwgVFJVRSwgRkFMU0UpCisJCSAgICB8fCBjaW5faXNzY29wZWRlY2wobGluZSkKKwkJICAgIHx8IGNpbl9pc2Nhc2UobGluZSkKKwkJICAgIHx8IChjaW5faXNsYWJlbF9za2lwKCZsaW5lKSAmJiBjaW5fbm9jb2RlKGxpbmUpKSkKKwkJcmV0dXJuIFRSVUU7CisJICAgIHJldHVybiBGQUxTRTsKKwl9CisJY3Vyd2luLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworCXJldHVybiBUUlVFOwkJLyogbGFiZWwgYXQgc3RhcnQgb2YgZmlsZT8/PyAqLworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBSZWNvZ25pemUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIGFuZCBlbnVtZXJhdGlvbnMuCisgKiBRJkQtSW1wbGVtZW50YXRpb246CisgKiBjaGVjayBmb3IgIj0iIGF0IGVuZCBvciAiW3R5cGVkZWZdIGVudW0iIGF0IGJlZ2lubmluZyBvZiBsaW5lLgorICovCisgICAgc3RhdGljIGludAorY2luX2lzaW5pdCh2b2lkKQoreworICAgIGNoYXJfdQkqczsKKworICAgIHMgPSBjaW5fc2tpcGNvbW1lbnQobWxfZ2V0X2N1cmxpbmUoKSk7CisKKyAgICBpZiAoU1RSTkNNUChzLCAidHlwZWRlZiIsIDcpID09IDAgJiYgIXZpbV9pc0lEYyhzWzddKSkKKwlzID0gY2luX3NraXBjb21tZW50KHMgKyA3KTsKKworICAgIGlmIChTVFJOQ01QKHMsICJlbnVtIiwgNCkgPT0gMCAmJiAhdmltX2lzSURjKHNbNF0pKQorCXJldHVybiBUUlVFOworCisgICAgaWYgKGNpbl9lbmRzX2luKHMsIChjaGFyX3UgKikiPSIsIChjaGFyX3UgKikieyIpKQorCXJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmVjb2duaXplIGEgc3dpdGNoIGxhYmVsOiAiY2FzZSAuKjoiIG9yICJkZWZhdWx0OiIuCisgKi8KKyAgICAgaW50CitjaW5faXNjYXNlKHMpCisgICAgY2hhcl91ICpzOworeworICAgIHMgPSBjaW5fc2tpcGNvbW1lbnQocyk7CisgICAgaWYgKFNUUk5DTVAocywgImNhc2UiLCA0KSA9PSAwICYmICF2aW1faXNJRGMoc1s0XSkpCisgICAgeworCWZvciAocyArPSA0OyAqczsgKytzKQorCXsKKwkgICAgcyA9IGNpbl9za2lwY29tbWVudChzKTsKKwkgICAgaWYgKCpzID09ICc6JykKKwkgICAgeworCQlpZiAoc1sxXSA9PSAnOicpCS8qIHNraXAgb3ZlciAiOjoiIGZvciBDKysgKi8KKwkJICAgICsrczsKKwkJZWxzZQorCQkgICAgcmV0dXJuIFRSVUU7CisJICAgIH0KKwkgICAgaWYgKCpzID09ICdcJycgJiYgc1sxXSAmJiBzWzJdID09ICdcJycpCisJCXMgKz0gMjsJCQkvKiBza2lwIG92ZXIgJy4nICovCisJICAgIGVsc2UgaWYgKCpzID09ICcvJyAmJiAoc1sxXSA9PSAnKicgfHwgc1sxXSA9PSAnLycpKQorCQlyZXR1cm4gRkFMU0U7CQkvKiBzdG9wIGF0IGNvbW1lbnQgKi8KKwkgICAgZWxzZSBpZiAoKnMgPT0gJyInKQorCQlyZXR1cm4gRkFMU0U7CQkvKiBzdG9wIGF0IHN0cmluZyAqLworCX0KKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGNpbl9pc2RlZmF1bHQocykpCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmVjb2duaXplIGEgImRlZmF1bHQiIHN3aXRjaCBsYWJlbC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9pc2RlZmF1bHQocykKKyAgICBjaGFyX3UgICpzOworeworICAgIHJldHVybiAoU1RSTkNNUChzLCAiZGVmYXVsdCIsIDcpID09IDAKKwkgICAgJiYgKihzID0gY2luX3NraXBjb21tZW50KHMgKyA3KSkgPT0gJzonCisJICAgICYmIHNbMV0gIT0gJzonKTsKK30KKworLyoKKyAqIFJlY29nbml6ZSBhICJwdWJsaWMvcHJpdmF0ZS9wcm9jdGVjdGVkIiBzY29wZSBkZWNsYXJhdGlvbiBsYWJlbC4KKyAqLworICAgIGludAorY2luX2lzc2NvcGVkZWNsKHMpCisgICAgY2hhcl91CSpzOworeworICAgIGludAkJaTsKKworICAgIHMgPSBjaW5fc2tpcGNvbW1lbnQocyk7CisgICAgaWYgKFNUUk5DTVAocywgInB1YmxpYyIsIDYpID09IDApCisJaSA9IDY7CisgICAgZWxzZSBpZiAoU1RSTkNNUChzLCAicHJvdGVjdGVkIiwgOSkgPT0gMCkKKwlpID0gOTsKKyAgICBlbHNlIGlmIChTVFJOQ01QKHMsICJwcml2YXRlIiwgNykgPT0gMCkKKwlpID0gNzsKKyAgICBlbHNlCisJcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAoKihzID0gY2luX3NraXBjb21tZW50KHMgKyBpKSkgPT0gJzonICYmIHNbMV0gIT0gJzonKTsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi1lbXB0eSBub24tY29tbWVudCBjaGFyYWN0ZXIgYWZ0ZXIgYSAnOicuCisgKiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCisgKgkgIGNhc2UgMjM0OiAgICBhID0gYjsKKyAqCQkgICAgICAgXgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCithZnRlcl9sYWJlbChsKQorICAgIGNoYXJfdSAgKmw7Cit7CisgICAgZm9yICggOyAqbDsgKytsKQorICAgIHsKKwlpZiAoKmwgPT0gJzonKQorCXsKKwkgICAgaWYgKGxbMV0gPT0gJzonKQkgICAgLyogc2tpcCBvdmVyICI6OiIgZm9yIEMrKyAqLworCQkrK2w7CisJICAgIGVsc2UgaWYgKCFjaW5faXNjYXNlKGwgKyAxKSkKKwkJYnJlYWs7CisJfQorCWVsc2UgaWYgKCpsID09ICdcJycgJiYgbFsxXSAmJiBsWzJdID09ICdcJycpCisJICAgIGwgKz0gMjsJCSAgICAvKiBza2lwIG92ZXIgJ3gnICovCisgICAgfQorICAgIGlmICgqbCA9PSBOVUwpCisJcmV0dXJuIE5VTEw7CisgICAgbCA9IGNpbl9za2lwY29tbWVudChsICsgMSk7CisgICAgaWYgKCpsID09IE5VTCkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbDsKK30KKworLyoKKyAqIEdldCBpbmRlbnQgb2YgbGluZSAibG51bSIsIHNraXBwaW5nIGEgbGFiZWwuCisgKiBSZXR1cm4gMCBpZiB0aGVyZSBpcyBub3RoaW5nIGFmdGVyIHRoZSBsYWJlbC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9pbmRlbnRfbm9sYWJlbChsbnVtKQkJLyogWFhYICovCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBjaGFyX3UJKmw7CisgICAgcG9zX1QJZnA7CisgICAgY29sbnJfVAljb2w7CisgICAgY2hhcl91CSpwOworCisgICAgbCA9IG1sX2dldChsbnVtKTsKKyAgICBwID0gYWZ0ZXJfbGFiZWwobCk7CisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKworICAgIGZwLmNvbCA9IChjb2xucl9UKShwIC0gbCk7CisgICAgZnAubG51bSA9IGxudW07CisgICAgZ2V0dmNvbChjdXJ3aW4sICZmcCwgJmNvbCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIChpbnQpY29sOworfQorCisvKgorICogRmluZCBpbmRlbnQgZm9yIGxpbmUgImxudW0iLCBpZ25vcmluZyBhbnkgY2FzZSBvciBqdW1wIGxhYmVsLgorICogQWxzbyByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0ZXh0IChhZnRlciB0aGUgbGFiZWwpLgorICogICBsYWJlbDoJaWYgKGFzZGYgJiYgYXNkZmFzZGYpCisgKgkJXgorICovCisgICAgc3RhdGljIGludAorc2tpcF9sYWJlbChsbnVtLCBwcCwgaW5kX21heGNvbW1lbnQpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKipwcDsKKyAgICBpbnQJCWluZF9tYXhjb21tZW50OworeworICAgIGNoYXJfdQkqbDsKKyAgICBpbnQJCWFtb3VudDsKKyAgICBwb3NfVAljdXJzb3Jfc2F2ZTsKKworICAgIGN1cnNvcl9zYXZlID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworICAgIGwgPSBtbF9nZXRfY3VybGluZSgpOworCQkJCSAgICAvKiBYWFggKi8KKyAgICBpZiAoY2luX2lzY2FzZShsKSB8fCBjaW5faXNzY29wZWRlY2wobCkgfHwgY2luX2lzbGFiZWwoaW5kX21heGNvbW1lbnQpKQorICAgIHsKKwlhbW91bnQgPSBnZXRfaW5kZW50X25vbGFiZWwobG51bSk7CisJbCA9IGFmdGVyX2xhYmVsKG1sX2dldF9jdXJsaW5lKCkpOworCWlmIChsID09IE5VTEwpCQkvKiBqdXN0IGluIGNhc2UgKi8KKwkgICAgbCA9IG1sX2dldF9jdXJsaW5lKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJYW1vdW50ID0gZ2V0X2luZGVudCgpOworCWwgPSBtbF9nZXRfY3VybGluZSgpOworICAgIH0KKyAgICAqcHAgPSBsOworCisgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworICAgIHJldHVybiBhbW91bnQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGluZGVudCBvZiB0aGUgZmlyc3QgdmFyaWFibGUgbmFtZSBhZnRlciBhIHR5cGUgaW4gYSBkZWNsYXJhdGlvbi4KKyAqICBpbnQJICAgIGEsCQkJaW5kZW50IG9mICJhIgorICogIHN0YXRpYyBzdHJ1Y3QgZm9vICAgIGIsCWluZGVudCBvZiAiYiIKKyAqICBlbnVtIGJsYSAgICBjLAkJaW5kZW50IG9mICJjIgorICogUmV0dXJucyB6ZXJvIHdoZW4gaXQgZG9lc24ndCBsb29rIGxpa2UgYSBkZWNsYXJhdGlvbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9maXJzdF9pZF9hbW91bnQoKQoreworICAgIGNoYXJfdQkqbGluZSwgKnAsICpzOworICAgIGludAkJbGVuOworICAgIHBvc19UCWZwOworICAgIGNvbG5yX1QJY29sOworCisgICAgbGluZSA9IG1sX2dldF9jdXJsaW5lKCk7CisgICAgcCA9IHNraXB3aGl0ZShsaW5lKTsKKyAgICBsZW4gPSBza2lwdG93aGl0ZShwKSAtIHA7CisgICAgaWYgKGxlbiA9PSA2ICYmIFNUUk5DTVAocCwgInN0YXRpYyIsIDYpID09IDApCisgICAgeworCXAgPSBza2lwd2hpdGUocCArIDYpOworCWxlbiA9IHNraXB0b3doaXRlKHApIC0gcDsKKyAgICB9CisgICAgaWYgKGxlbiA9PSA2ICYmIFNUUk5DTVAocCwgInN0cnVjdCIsIDYpID09IDApCisJcCA9IHNraXB3aGl0ZShwICsgNik7CisgICAgZWxzZSBpZiAobGVuID09IDQgJiYgU1RSTkNNUChwLCAiZW51bSIsIDQpID09IDApCisJcCA9IHNraXB3aGl0ZShwICsgNCk7CisgICAgZWxzZSBpZiAoKGxlbiA9PSA4ICYmIFNUUk5DTVAocCwgInVuc2lnbmVkIiwgOCkgPT0gMCkKKwkgICAgfHwgKGxlbiA9PSA2ICYmIFNUUk5DTVAocCwgInNpZ25lZCIsIDYpID09IDApKQorICAgIHsKKwlzID0gc2tpcHdoaXRlKHAgKyBsZW4pOworCWlmICgoU1RSTkNNUChzLCAiaW50IiwgMykgPT0gMCAmJiB2aW1faXN3aGl0ZShzWzNdKSkKKwkJfHwgKFNUUk5DTVAocywgImxvbmciLCA0KSA9PSAwICYmIHZpbV9pc3doaXRlKHNbNF0pKQorCQl8fCAoU1RSTkNNUChzLCAic2hvcnQiLCA1KSA9PSAwICYmIHZpbV9pc3doaXRlKHNbNV0pKQorCQl8fCAoU1RSTkNNUChzLCAiY2hhciIsIDQpID09IDAgJiYgdmltX2lzd2hpdGUoc1s0XSkpKQorCSAgICBwID0gczsKKyAgICB9CisgICAgZm9yIChsZW4gPSAwOyB2aW1faXNJRGMocFtsZW5dKTsgKytsZW4pCisJOworICAgIGlmIChsZW4gPT0gMCB8fCAhdmltX2lzd2hpdGUocFtsZW5dKSB8fCBjaW5fbm9jb2RlKHApKQorCXJldHVybiAwOworCisgICAgcCA9IHNraXB3aGl0ZShwICsgbGVuKTsKKyAgICBmcC5sbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGZwLmNvbCA9IChjb2xucl9UKShwIC0gbGluZSk7CisgICAgZ2V0dmNvbChjdXJ3aW4sICZmcCwgJmNvbCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIChpbnQpY29sOworfQorCisvKgorICogUmV0dXJuIHRoZSBpbmRlbnQgb2YgdGhlIGZpcnN0IG5vbi1ibGFuayBhZnRlciBhbiBlcXVhbCBzaWduLgorICogICAgICAgY2hhciAqZm9vID0gImhlcmUiOworICogUmV0dXJuIHplcm8gaWYgbm8gKHVzZWZ1bCkgZXF1YWwgc2lnbiBmb3VuZC4KKyAqIFJldHVybiAtMSBpZiB0aGUgbGluZSBhYm92ZSAibG51bSIgZW5kcyBpbiBhIGJhY2tzbGFzaC4KKyAqICAgICAgZm9vID0gImFzZGZcCisgKgkgICAgICAgYXNkZlwKKyAqCSAgICAgICBoZXJlIjsKKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9nZXRfZXF1YWxfYW1vdW50KGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY2hhcl91CSpzOworICAgIGNvbG5yX1QJY29sOworICAgIHBvc19UCWZwOworCisgICAgaWYgKGxudW0gPiAxKQorICAgIHsKKwlsaW5lID0gbWxfZ2V0KGxudW0gLSAxKTsKKwlpZiAoKmxpbmUgIT0gTlVMICYmIGxpbmVbU1RSTEVOKGxpbmUpIC0gMV0gPT0gJ1xcJykKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxpbmUgPSBzID0gbWxfZ2V0KGxudW0pOworICAgIHdoaWxlICgqcyAhPSBOVUwgJiYgdmltX3N0cmNocigoY2hhcl91ICopIj07e31cIiciLCAqcykgPT0gTlVMTCkKKyAgICB7CisJaWYgKGNpbl9pc2NvbW1lbnQocykpCS8qIGlnbm9yZSBjb21tZW50cyAqLworCSAgICBzID0gY2luX3NraXBjb21tZW50KHMpOworCWVsc2UKKwkgICAgKytzOworICAgIH0KKyAgICBpZiAoKnMgIT0gJz0nKQorCXJldHVybiAwOworCisgICAgcyA9IHNraXB3aGl0ZShzICsgMSk7CisgICAgaWYgKGNpbl9ub2NvZGUocykpCisJcmV0dXJuIDA7CisKKyAgICBpZiAoKnMgPT0gJyInKQkvKiBuaWNlIGFsaWdubWVudCBmb3IgY29udGludWVkIHN0cmluZ3MgKi8KKwkrK3M7CisKKyAgICBmcC5sbnVtID0gbG51bTsKKyAgICBmcC5jb2wgPSAoY29sbnJfVCkocyAtIGxpbmUpOworICAgIGdldHZjb2woY3Vyd2luLCAmZnAsICZjb2wsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiAoaW50KWNvbDsKK30KKworLyoKKyAqIFJlY29nbml6ZSBhIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQ6IEFueSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggJyMnLgorICovCisgICAgc3RhdGljIGludAorY2luX2lzcHJlcHJvYyhzKQorICAgIGNoYXJfdSAqczsKK3sKKyAgICBzID0gc2tpcHdoaXRlKHMpOworICAgIGlmICgqcyA9PSAnIycpCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgbGluZSAiKnBwIiBhdCAiKmxudW1wIiBpcyBhIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQgb3IgYQorICogY29udGludWF0aW9uIGxpbmUgb2YgYSBwcmVwcm9jZXNzb3Igc3RhdGVtZW50LiAgRGVjcmVhc2UgIipsbnVtcCIgdG8gdGhlCisgKiBzdGFydCBhbmQgcmV0dXJuIHRoZSBsaW5lIGluICIqcHAiLgorICovCisgICAgc3RhdGljIGludAorY2luX2lzcHJlcHJvY19jb250KHBwLCBsbnVtcCkKKyAgICBjaGFyX3UJKipwcDsKKyAgICBsaW5lbnJfVAkqbG51bXA7Cit7CisgICAgY2hhcl91CSpsaW5lID0gKnBwOworICAgIGxpbmVucl9UCWxudW0gPSAqbG51bXA7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKwlpZiAoY2luX2lzcHJlcHJvYyhsaW5lKSkKKwl7CisJICAgIHJldHZhbCA9IFRSVUU7CisJICAgICpsbnVtcCA9IGxudW07CisJICAgIGJyZWFrOworCX0KKwlpZiAobG51bSA9PSAxKQorCSAgICBicmVhazsKKwlsaW5lID0gbWxfZ2V0KC0tbG51bSk7CisJaWYgKCpsaW5lID09IE5VTCB8fCBsaW5lW1NUUkxFTihsaW5lKSAtIDFdICE9ICdcXCcpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChsbnVtICE9ICpsbnVtcCkKKwkqcHAgPSBtbF9nZXQoKmxudW1wKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmVjb2duaXplIHRoZSBzdGFydCBvZiBhIEMgb3IgQysrIGNvbW1lbnQuCisgKi8KKyAgICBzdGF0aWMgaW50CitjaW5faXNjb21tZW50KHApCisgICAgY2hhcl91ICAqcDsKK3sKKyAgICByZXR1cm4gKHBbMF0gPT0gJy8nICYmIChwWzFdID09ICcqJyB8fCBwWzFdID09ICcvJykpOworfQorCisvKgorICogUmVjb2duaXplIHRoZSBzdGFydCBvZiBhICIvLyIgY29tbWVudC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9pc2xpbmVjb21tZW50KHApCisgICAgY2hhcl91ICpwOworeworICAgIHJldHVybiAocFswXSA9PSAnLycgJiYgcFsxXSA9PSAnLycpOworfQorCisvKgorICogUmVjb2duaXplIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoICd7JyBvciAnfScsIG9yIGVuZHMgd2l0aCAnOycsICd7JyBvciAnfScuCisgKiBEb24ndCBjb25zaWRlciAifSBlbHNlIiBhIHRlcm1pbmF0ZWQgbGluZS4KKyAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHRlcm1pbmF0aW5nIHRoZSBsaW5lIChlbmRpbmcgY2hhcidzIGhhdmUgcHJlY2VkZW5jZSBpZgorICogYm90aCBhcHBseSBpbiBvcmRlciB0byBkZXRlcm1pbmUgaW5pdGlhbGl6YXRpb25zKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9pc3Rlcm1pbmF0ZWQocywgaW5jbF9vcGVuLCBpbmNsX2NvbW1hKQorICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWluY2xfb3BlbjsJLyogaW5jbHVkZSAneycgYXQgdGhlIGVuZCBhcyB0ZXJtaW5hdG9yICovCisgICAgaW50CQlpbmNsX2NvbW1hOwkvKiByZWNvZ25pemUgYSB0cmFpbGluZyBjb21tYSAqLworeworICAgIGNoYXJfdSBmb3VuZF9zdGFydCA9IDA7CisKKyAgICBzID0gY2luX3NraXBjb21tZW50KHMpOworCisgICAgaWYgKCpzID09ICd7JyB8fCAoKnMgPT0gJ30nICYmICFjaW5faXNlbHNlKHMpKSkKKwlmb3VuZF9zdGFydCA9ICpzOworCisgICAgd2hpbGUgKCpzKQorICAgIHsKKwkvKiBza2lwIG92ZXIgY29tbWVudHMsICIiIHN0cmluZ3MgYW5kICdjJ2hhcmFjdGVycyAqLworCXMgPSBza2lwX3N0cmluZyhjaW5fc2tpcGNvbW1lbnQocykpOworCWlmICgoKnMgPT0gJzsnIHx8IChpbmNsX29wZW4gJiYgKnMgPT0gJ3snKSB8fCAqcyA9PSAnfScKKwkJCQkJCSB8fCAoaW5jbF9jb21tYSAmJiAqcyA9PSAnLCcpKQorCQkmJiBjaW5fbm9jb2RlKHMgKyAxKSkKKwkgICAgcmV0dXJuICpzOworCisJaWYgKCpzKQorCSAgICBzKys7CisgICAgfQorICAgIHJldHVybiBmb3VuZF9zdGFydDsKK30KKworLyoKKyAqIFJlY29nbml6ZSB0aGUgYmFzaWMgcGljdHVyZSBvZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIC0tIGl0IG5lZWRzIHRvCisgKiBoYXZlIGFuIG9wZW4gcGFyZW4gc29tZXdoZXJlIGFuZCBhIGNsb3NlIHBhcmVuIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYW5kCisgKiBubyBzZW1pY29sb25zIGFueXdoZXJlLgorICogV2hlbiBhIGxpbmUgZW5kcyBpbiBhIGNvbW1hIHdlIGNvbnRpbnVlIGxvb2tpbmcgaW4gdGhlIG5leHQgbGluZS4KKyAqICJzcCIgcG9pbnRzIHRvIGEgc3RyaW5nIHdpdGggdGhlIGxpbmUuICBXaGVuIGxvb2tpbmcgYXQgb3RoZXIgbGluZXMgaXQgbXVzdAorICogYmUgcmVzdG9yZWQgdG8gdGhlIGxpbmUuICBXaGVuIGl0J3MgTlVMTCBmZXRjaCBsaW5lcyBoZXJlLgorICogImxudW0iIGlzIHdoZXJlIHdlIHN0YXJ0IGxvb2tpbmcuCisgKi8KKyAgICBzdGF0aWMgaW50CitjaW5faXNmdW5jZGVjbChzcCwgZmlyc3RfbG51bSkKKyAgICBjaGFyX3UJKipzcDsKKyAgICBsaW5lbnJfVAlmaXJzdF9sbnVtOworeworICAgIGNoYXJfdQkqczsKKyAgICBsaW5lbnJfVAlsbnVtID0gZmlyc3RfbG51bTsKKyAgICBpbnQJCXJldHZhbCA9IEZBTFNFOworCisgICAgaWYgKHNwID09IE5VTEwpCisJcyA9IG1sX2dldChsbnVtKTsKKyAgICBlbHNlCisJcyA9ICpzcDsKKworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnKCcgJiYgKnMgIT0gJzsnICYmICpzICE9ICdcJycgJiYgKnMgIT0gJyInKQorICAgIHsKKwlpZiAoY2luX2lzY29tbWVudChzKSkJLyogaWdub3JlIGNvbW1lbnRzICovCisJICAgIHMgPSBjaW5fc2tpcGNvbW1lbnQocyk7CisJZWxzZQorCSAgICArK3M7CisgICAgfQorICAgIGlmICgqcyAhPSAnKCcpCisJcmV0dXJuIEZBTFNFOwkJLyogJzsnLCAnIG9yICIgIGJlZm9yZSBhbnkgKCkgb3Igbm8gJygnICovCisKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJzsnICYmICpzICE9ICdcJycgJiYgKnMgIT0gJyInKQorICAgIHsKKwlpZiAoKnMgPT0gJyknICYmIGNpbl9ub2NvZGUocyArIDEpKQorCXsKKwkgICAgLyogJyknIGF0IHRoZSBlbmQ6IG1heSBoYXZlIGZvdW5kIGEgbWF0Y2gKKwkgICAgICogQ2hlY2sgZm9yIGhlIHByZXZpb3VzIGxpbmUgbm90IHRvIGVuZCBpbiBhIGJhY2tzbGFzaDoKKwkgICAgICogICAgICAgI2lmIGRlZmluZWQoeCkgJiYgXAorCSAgICAgKgkJIGRlZmluZWQoeSkKKwkgICAgICovCisJICAgIGxudW0gPSBmaXJzdF9sbnVtIC0gMTsKKwkgICAgcyA9IG1sX2dldChsbnVtKTsKKwkgICAgaWYgKCpzID09IE5VTCB8fCBzW1NUUkxFTihzKSAtIDFdICE9ICdcXCcpCisJCXJldHZhbCA9IFRSVUU7CisJICAgIGdvdG8gZG9uZTsKKwl9CisJaWYgKCpzID09ICcsJyAmJiBjaW5fbm9jb2RlKHMgKyAxKSkKKwl7CisJICAgIC8qICcsJyBhdCB0aGUgZW5kOiBjb250aW51ZSBsb29raW5nIGluIHRoZSBuZXh0IGxpbmUgKi8KKwkgICAgaWYgKGxudW0gPj0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCWJyZWFrOworCisJICAgIHMgPSBtbF9nZXQoKytsbnVtKTsKKwl9CisJZWxzZSBpZiAoY2luX2lzY29tbWVudChzKSkJLyogaWdub3JlIGNvbW1lbnRzICovCisJICAgIHMgPSBjaW5fc2tpcGNvbW1lbnQocyk7CisJZWxzZQorCSAgICArK3M7CisgICAgfQorCitkb25lOgorICAgIGlmIChsbnVtICE9IGZpcnN0X2xudW0gJiYgc3AgIT0gTlVMTCkKKwkqc3AgPSBtbF9nZXQoZmlyc3RfbG51bSk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisgICAgc3RhdGljIGludAorY2luX2lzaWYocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIHJldHVybiAoU1RSTkNNUChwLCAiaWYiLCAyKSA9PSAwICYmICF2aW1faXNJRGMocFsyXSkpOworfQorCisgICAgc3RhdGljIGludAorY2luX2lzZWxzZShwKQorICAgIGNoYXJfdSAgKnA7Cit7CisgICAgaWYgKCpwID09ICd9JykJICAgIC8qIGFjY2VwdCAifSBlbHNlIiAqLworCXAgPSBjaW5fc2tpcGNvbW1lbnQocCArIDEpOworICAgIHJldHVybiAoU1RSTkNNUChwLCAiZWxzZSIsIDQpID09IDAgJiYgIXZpbV9pc0lEYyhwWzRdKSk7Cit9CisKKyAgICBzdGF0aWMgaW50CitjaW5faXNkbyhwKQorICAgIGNoYXJfdSAgKnA7Cit7CisgICAgcmV0dXJuIChTVFJOQ01QKHAsICJkbyIsIDIpID09IDAgJiYgIXZpbV9pc0lEYyhwWzJdKSk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGlzIGlzIGEgIndoaWxlIiB0aGF0IHNob3VsZCBoYXZlIGEgbWF0Y2hpbmcgImRvIi4KKyAqIFdlIG9ubHkgYWNjZXB0IGEgIndoaWxlIChjb25kaXRpb24pIDsiLCB3aXRoIG9ubHkgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUKKyAqICcpJyBhbmQgJzsnLiBUaGUgY29uZGl0aW9uIG1heSBiZSBzcHJlYWQgb3ZlciBzZXZlcmFsIGxpbmVzLgorICovCisgICAgc3RhdGljIGludAorY2luX2lzd2hpbGVvZmRvKHAsIGxudW0sIGluZF9tYXhwYXJlbikJICAgIC8qIFhYWCAqLworICAgIGNoYXJfdQkqcDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJaW5kX21heHBhcmVuOworeworICAgIHBvc19UCWN1cnNvcl9zYXZlOworICAgIHBvc19UCSp0cnlwb3M7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKworICAgIHAgPSBjaW5fc2tpcGNvbW1lbnQocCk7CisgICAgaWYgKCpwID09ICd9JykJCS8qIGFjY2VwdCAifSB3aGlsZSAoY29uZCk7IiAqLworCXAgPSBjaW5fc2tpcGNvbW1lbnQocCArIDEpOworICAgIGlmIChTVFJOQ01QKHAsICJ3aGlsZSIsIDUpID09IDAgJiYgIXZpbV9pc0lEYyhwWzVdKSkKKyAgICB7CisJY3Vyc29yX3NhdmUgPSBjdXJ3aW4tPndfY3Vyc29yOworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCXAgPSBtbF9nZXRfY3VybGluZSgpOworCXdoaWxlICgqcCAmJiAqcCAhPSAndycpCS8qIHNraXAgYW55ICd9JywgdW50aWwgdGhlICd3JyBvZiB0aGUgIndoaWxlIiAqLworCXsKKwkgICAgKytwOworCSAgICArK2N1cndpbi0+d19jdXJzb3IuY29sOworCX0KKwlpZiAoKHRyeXBvcyA9IGZpbmRtYXRjaGxpbWl0KE5VTEwsIDAsIDAsIGluZF9tYXhwYXJlbikpICE9IE5VTEwKKwkJJiYgKmNpbl9za2lwY29tbWVudChtbF9nZXRfcG9zKHRyeXBvcykgKyAxKSA9PSAnOycpCisJICAgIHJldHZhbCA9IFRSVUU7CisJY3Vyd2luLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisgICAgc3RhdGljIGludAorY2luX2lzYnJlYWsocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIHJldHVybiAoU1RSTkNNUChwLCAiYnJlYWsiLCA1KSA9PSAwICYmICF2aW1faXNJRGMocFs1XSkpOworfQorCisvKiBGaW5kIHRoZSBwb3NpdGlvbiBvZiBhIEMrKyBiYXNlLWNsYXNzIGRlY2xhcmF0aW9uIG9yCisgKiBjb25zdHJ1Y3Rvci1pbml0aWFsaXphdGlvbi4gZWc6CisgKgorICogY2xhc3MgTXlDbGFzcyA6CisgKgliYXNlQ2xhc3MJCTwtLSBoZXJlCisgKiBjbGFzcyBNeUNsYXNzIDogcHVibGljIGJhc2VDbGFzcywKKyAqCWFub3RoZXJCYXNlQ2xhc3MJPC0tIGhlcmUgKHNob3VsZCBwcm9iYWJseSBsaW5ldXAgPz8pCisgKiBNeUNsYXNzOjpNeUNsYXNzKC4uLikgOgorICoJYmFzZUNsYXNzKC4uLikJCTwtLSBoZXJlIChjb25zdHJ1Y3Rvci1pbml0aWFsaXphdGlvbikKKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9pc19jcHBfYmFzZWNsYXNzKGxpbmUsIGNvbCkKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY29sbnJfVAkqY29sOworeworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWNsYXNzX29yX3N0cnVjdCwgbG9va2Zvcl9jdG9yX2luaXQsIGNwcF9iYXNlX2NsYXNzOworCisgICAgKmNvbCA9IDA7CisKKyAgICBzID0gY2luX3NraXBjb21tZW50KGxpbmUpOworICAgIGlmICgqcyA9PSBOVUwpCisJcmV0dXJuIEZBTFNFOworCisgICAgY3BwX2Jhc2VfY2xhc3MgPSBsb29rZm9yX2N0b3JfaW5pdCA9IGNsYXNzX29yX3N0cnVjdCA9IEZBTFNFOworCisgICAgd2hpbGUoKnMgIT0gTlVMKQorICAgIHsKKwlpZiAoc1swXSA9PSAnOicpCisJeworCSAgICBpZiAoc1sxXSA9PSAnOicpCisJICAgIHsKKwkJLyogc2tpcCBkb3VibGUgY29sb24uIEl0IGNhbid0IGJlIGEgY29uc3RydWN0b3IKKwkJICogaW5pdGlhbGl6YXRpb24gYW55IG1vcmUgKi8KKwkJbG9va2Zvcl9jdG9yX2luaXQgPSBGQUxTRTsKKwkJcyA9IGNpbl9za2lwY29tbWVudChzICsgMik7CisJICAgIH0KKwkgICAgZWxzZSBpZiAobG9va2Zvcl9jdG9yX2luaXQgfHwgY2xhc3Nfb3Jfc3RydWN0KQorCSAgICB7CisJCS8qIHdlIGhhdmUgc29tZXRoaW5nIGZvdW5kLCB0aGF0IGxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mCisJCSAqIGNwcC1iYXNlLWNsYXNzLWRlY2xhcmF0aW9uIG9yIGNvbnRydWN0b3ItaW5pdGlhbGl6YXRpb24gKi8KKwkJY3BwX2Jhc2VfY2xhc3MgPSBUUlVFOworCQlsb29rZm9yX2N0b3JfaW5pdCA9IGNsYXNzX29yX3N0cnVjdCA9IEZBTFNFOworCQkqY29sID0gMDsKKwkJcyA9IGNpbl9za2lwY29tbWVudChzICsgMSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlzID0gY2luX3NraXBjb21tZW50KHMgKyAxKTsKKwl9CisJZWxzZSBpZiAoKFNUUk5DTVAocywgImNsYXNzIiwgNSkgPT0gMCAmJiAhdmltX2lzSURjKHNbNV0pKQorCQl8fCAoU1RSTkNNUChzLCAic3RydWN0IiwgNikgPT0gMCAmJiAhdmltX2lzSURjKHNbNl0pKSkKKwl7CisJICAgIGNsYXNzX29yX3N0cnVjdCA9IFRSVUU7CisJICAgIGxvb2tmb3JfY3Rvcl9pbml0ID0gRkFMU0U7CisKKwkgICAgaWYgKCpzID09ICdjJykKKwkJcyA9IGNpbl9za2lwY29tbWVudChzICsgNSk7CisJICAgIGVsc2UKKwkJcyA9IGNpbl9za2lwY29tbWVudChzICsgNik7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChzWzBdID09ICd7JyB8fCBzWzBdID09ICd9JyB8fCBzWzBdID09ICc7JykKKwkgICAgeworCQljcHBfYmFzZV9jbGFzcyA9IGxvb2tmb3JfY3Rvcl9pbml0ID0gY2xhc3Nfb3Jfc3RydWN0ID0gRkFMU0U7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoc1swXSA9PSAnKScpCisJICAgIHsKKwkJLyogQ29uc3RydWN0b3ItaW5pdGlhbGl6YXRpb24gaXMgYXNzdW1lZCBpZiB3ZSBjb21lIGFjcm9zcworCQkgKiBzb21ldGhpbmcgbGlrZSAiKToiICovCisJCWNsYXNzX29yX3N0cnVjdCA9IEZBTFNFOworCQlsb29rZm9yX2N0b3JfaW5pdCA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoIXZpbV9pc0lEYyhzWzBdKSkKKwkgICAgeworCQkvKiBpZiBpdCBpcyBub3QgYW4gaWRlbnRpZmllciwgd2UgYXJlIHdyb25nICovCisJCWNsYXNzX29yX3N0cnVjdCA9IEZBTFNFOworCQlsb29rZm9yX2N0b3JfaW5pdCA9IEZBTFNFOworCSAgICB9CisJICAgIGVsc2UgaWYgKCpjb2wgPT0gMCkKKwkgICAgeworCQkvKiBpdCBjYW4ndCBiZSBhIGNvbnN0cnVjdG9yLWluaXRpYWxpemF0aW9uIGFueSBtb3JlICovCisJCWxvb2tmb3JfY3Rvcl9pbml0ID0gRkFMU0U7CisKKwkJLyogdGhlIGZpcnN0IHN0YXRlbWVudCBzdGFydHMgaGVyZTogbGluZXVwIHdpdGggdGhpcyBvbmUuLi4gKi8KKwkJaWYgKGNwcF9iYXNlX2NsYXNzICYmICpjb2wgPT0gMCkKKwkJICAgICpjb2wgPSAoY29sbnJfVCkocyAtIGxpbmUpOworCSAgICB9CisKKwkgICAgcyA9IGNpbl9za2lwY29tbWVudChzICsgMSk7CisJfQorICAgIH0KKworICAgIHJldHVybiBjcHBfYmFzZV9jbGFzczsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHN0cmluZyAicyIgZW5kcyB3aXRoIHRoZSBzdHJpbmcgImZpbmQiLCBwb3NzaWJseSBmb2xsb3dlZCBieQorICogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzLiAgU2tpcCBzdHJpbmdzIGFuZCBjb21tZW50cy4KKyAqIElnbm9yZSAiaWdub3JlIiBhZnRlciAiZmluZCIgaWYgaXQncyBub3QgTlVMTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9lbmRzX2luKHMsIGZpbmQsIGlnbm9yZSkKKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CSpmaW5kOworICAgIGNoYXJfdQkqaWdub3JlOworeworICAgIGNoYXJfdQkqcCA9IHM7CisgICAgY2hhcl91CSpyOworICAgIGludAkJbGVuID0gKGludClTVFJMRU4oZmluZCk7CisKKyAgICB3aGlsZSAoKnAgIT0gTlVMKQorICAgIHsKKwlwID0gY2luX3NraXBjb21tZW50KHApOworCWlmIChTVFJOQ01QKHAsIGZpbmQsIGxlbikgPT0gMCkKKwl7CisJICAgIHIgPSBza2lwd2hpdGUocCArIGxlbik7CisJICAgIGlmIChpZ25vcmUgIT0gTlVMTCAmJiBTVFJOQ01QKHIsIGlnbm9yZSwgU1RSTEVOKGlnbm9yZSkpID09IDApCisJCXIgPSBza2lwd2hpdGUociArIFNUUkxFTihpZ25vcmUpKTsKKwkgICAgaWYgKGNpbl9ub2NvZGUocikpCisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoKnAgIT0gTlVMKQorCSAgICArK3A7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFNraXAgc3RyaW5ncywgY2hhcnMgYW5kIGNvbW1lbnRzIHVudGlsIGF0IG9yIHBhc3QgInRyeXBvcyIuCisgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3VuZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2Npbl9za2lwMnBvcyh0cnlwb3MpCisgICAgcG9zX1QJKnRyeXBvczsKK3sKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY2hhcl91CSpwOworCisgICAgcCA9IGxpbmUgPSBtbF9nZXQodHJ5cG9zLT5sbnVtKTsKKyAgICB3aGlsZSAoKnAgJiYgKGNvbG5yX1QpKHAgLSBsaW5lKSA8IHRyeXBvcy0+Y29sKQorICAgIHsKKwlpZiAoY2luX2lzY29tbWVudChwKSkKKwkgICAgcCA9IGNpbl9za2lwY29tbWVudChwKTsKKwllbHNlCisJeworCSAgICBwID0gc2tpcF9zdHJpbmcocCk7CisJICAgICsrcDsKKwl9CisgICAgfQorICAgIHJldHVybiAoaW50KShwIC0gbGluZSk7Cit9CisKKy8qCisgKiBGaW5kIHRoZSAneycgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayB3ZSBhcmUgaW4uCisgKiBSZXR1cm4gTlVMTCBpZiBubyBtYXRjaCBmb3VuZC4KKyAqIElnbm9yZSBhICd7JyB0aGF0IGlzIGluIGEgY29tbWVudCwgbWFrZXMgaW5kZW50aW5nIHRoZSBuZXh0IHRocmVlIGxpbmVzCisgKiB3b3JrLiAqLworLyogZm9vKCkgICAgKi8KKy8qIHsJICAgICovCisvKiB9CSAgICAqLworCisgICAgc3RhdGljIHBvc19UICoKK2ZpbmRfc3RhcnRfYnJhY2UoaW5kX21heGNvbW1lbnQpCSAgICAvKiBYWFggKi8KKyAgICBpbnQJCWluZF9tYXhjb21tZW50OworeworICAgIHBvc19UCWN1cnNvcl9zYXZlOworICAgIHBvc19UCSp0cnlwb3M7CisgICAgcG9zX1QJKnBvczsKKyAgICBzdGF0aWMgcG9zX1QJcG9zX2NvcHk7CisKKyAgICBjdXJzb3Jfc2F2ZSA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgd2hpbGUgKCh0cnlwb3MgPSBmaW5kbWF0Y2hsaW1pdChOVUxMLCAneycsIEZNX0JMT0NLU1RPUCwgMCkpICE9IE5VTEwpCisgICAgeworCXBvc19jb3B5ID0gKnRyeXBvczsJLyogY29weSBwb3NfVCwgbmV4dCBmaW5kbWF0Y2ggd2lsbCBjaGFuZ2UgaXQgKi8KKwl0cnlwb3MgPSAmcG9zX2NvcHk7CisJY3Vyd2luLT53X2N1cnNvciA9ICp0cnlwb3M7CisJcG9zID0gTlVMTDsKKwkvKiBpZ25vcmUgdGhlIHsgaWYgaXQncyBpbiBhIC8vIGNvbW1lbnQgKi8KKwlpZiAoKGNvbG5yX1QpY2luX3NraXAycG9zKHRyeXBvcykgPT0gdHJ5cG9zLT5jb2wKKwkJJiYgKHBvcyA9IGZpbmRfc3RhcnRfY29tbWVudChpbmRfbWF4Y29tbWVudCkpID09IE5VTEwpIC8qIFhYWCAqLworCSAgICBicmVhazsKKwlpZiAocG9zICE9IE5VTEwpCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHBvcy0+bG51bTsKKyAgICB9CisgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworICAgIHJldHVybiB0cnlwb3M7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBtYXRjaGluZyAnKCcsIGZhaWxpbmcgaWYgaXQgaXMgaW4gYSBjb21tZW50LgorICogUmV0dXJuIE5VTEwgb2Ygbm8gbWF0Y2ggZm91bmQuCisgKi8KKyAgICBzdGF0aWMgcG9zX1QgKgorZmluZF9tYXRjaF9wYXJlbihpbmRfbWF4cGFyZW4sIGluZF9tYXhjb21tZW50KQkgICAgLyogWFhYICovCisgICAgaW50CQlpbmRfbWF4cGFyZW47CisgICAgaW50CQlpbmRfbWF4Y29tbWVudDsKK3sKKyAgICBwb3NfVAljdXJzb3Jfc2F2ZTsKKyAgICBwb3NfVAkqdHJ5cG9zOworICAgIHN0YXRpYyBwb3NfVAlwb3NfY29weTsKKworICAgIGN1cnNvcl9zYXZlID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBpZiAoKHRyeXBvcyA9IGZpbmRtYXRjaGxpbWl0KE5VTEwsICcoJywgMCwgaW5kX21heHBhcmVuKSkgIT0gTlVMTCkKKyAgICB7CisJLyogY2hlY2sgaWYgdGhlICggaXMgaW4gYSAvLyBjb21tZW50ICovCisJaWYgKChjb2xucl9UKWNpbl9za2lwMnBvcyh0cnlwb3MpID4gdHJ5cG9zLT5jb2wpCisJICAgIHRyeXBvcyA9IE5VTEw7CisJZWxzZQorCXsKKwkgICAgcG9zX2NvcHkgPSAqdHJ5cG9zOwkgICAgLyogY29weSB0cnlwb3MsIGZpbmRtYXRjaCB3aWxsIGNoYW5nZSBpdCAqLworCSAgICB0cnlwb3MgPSAmcG9zX2NvcHk7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSAqdHJ5cG9zOworCSAgICBpZiAoZmluZF9zdGFydF9jb21tZW50KGluZF9tYXhjb21tZW50KSAhPSBOVUxMKSAvKiBYWFggKi8KKwkJdHJ5cG9zID0gTlVMTDsKKwl9CisgICAgfQorICAgIGN1cndpbi0+d19jdXJzb3IgPSBjdXJzb3Jfc2F2ZTsKKyAgICByZXR1cm4gdHJ5cG9zOworfQorCisvKgorICogUmV0dXJuIGluZF9tYXhwYXJlbiBjb3JyZWN0ZWQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIGxpbmUgbnVtYmVyIGJldHdlZW4gdGhlCisgKiBjdXJzb3IgcG9zaXRpb24gYW5kICJzdGFydHBvcyIuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBzZWFyY2hpbmcgZm9yIGEKKyAqIG1hdGNoaW5nIHBhcmVuIGFib3ZlIHRoZSBjdXJzb3IgbGluZSBkb2Vzbid0IGZpbmQgYSBtYXRjaCBiZWNhdXNlIG9mCisgKiBsb29raW5nIGEgZmV3IGxpbmVzIGZ1cnRoZXIuCisgKi8KKyAgICBzdGF0aWMgaW50Citjb3JyX2luZF9tYXhwYXJlbihpbmRfbWF4cGFyZW4sIHN0YXJ0cG9zKQorICAgIGludAkJaW5kX21heHBhcmVuOworICAgIHBvc19UCSpzdGFydHBvczsKK3sKKyAgICBsb25nCW4gPSAobG9uZylzdGFydHBvcy0+bG51bSAtIChsb25nKWN1cndpbi0+d19jdXJzb3IubG51bTsKKworICAgIGlmIChuID4gMCAmJiBuIDwgaW5kX21heHBhcmVuIC8gMikKKwlyZXR1cm4gaW5kX21heHBhcmVuIC0gKGludCluOworICAgIHJldHVybiBpbmRfbWF4cGFyZW47Cit9CisKKy8qCisgKiBTZXQgd19jdXJzb3IuY29sIHRvIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBsYXN0IHVubWF0Y2hlZCAnKScgb3IgJ3snIGluCisgKiBsaW5lICJsIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRfbGFzdF9wYXJlbihsLCBzdGFydCwgZW5kKQorICAgIGNoYXJfdQkqbDsKKyAgICBpbnQJCXN0YXJ0LCBlbmQ7Cit7CisgICAgaW50CQlpOworICAgIGludAkJcmV0dmFsID0gRkFMU0U7CisgICAgaW50CQlvcGVuX2NvdW50ID0gMDsKKworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsJCSAgICAvKiBkZWZhdWx0IGlzIHN0YXJ0IG9mIGxpbmUgKi8KKworICAgIGZvciAoaSA9IDA7IGxbaV07IGkrKykKKyAgICB7CisJaSA9IChpbnQpKGNpbl9za2lwY29tbWVudChsICsgaSkgLSBsKTsgLyogaWdub3JlIHBhcmVucyBpbiBjb21tZW50cyAqLworCWkgPSAoaW50KShza2lwX3N0cmluZyhsICsgaSkgLSBsKTsgICAgLyogaWdub3JlIHBhcmVucyBpbiBxdW90ZXMgKi8KKwlpZiAobFtpXSA9PSBzdGFydCkKKwkgICAgKytvcGVuX2NvdW50OworCWVsc2UgaWYgKGxbaV0gPT0gZW5kKQorCXsKKwkgICAgaWYgKG9wZW5fY291bnQgPiAwKQorCQktLW9wZW5fY291bnQ7CisJICAgIGVsc2UKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGk7CisJCXJldHZhbCA9IFRSVUU7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKyAgICBpbnQKK2dldF9jX2luZGVudCgpCit7CisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSBhIGJsb2NrJ3Mgb3BlbmluZyBicmFjZSB0aGUgcHJldmFpbGluZyBpbmRlbnQgZm9yIHRoYXQKKyAgICAgKiBibG9jayBzaG91bGQgYmUKKyAgICAgKi8KKyAgICBpbnQgaW5kX2xldmVsID0gY3VyYnVmLT5iX3Bfc3c7CisKKyAgICAvKgorICAgICAqIHNwYWNlcyBmcm9tIHRoZSBlZGdlIG9mIHRoZSBsaW5lIGFuIG9wZW4gYnJhY2UgdGhhdCdzIGF0IHRoZSBlbmQgb2YgYQorICAgICAqIGxpbmUgaXMgaW1hZ2luZWQgdG8gYmUuCisgICAgICovCisgICAgaW50IGluZF9vcGVuX2ltYWcgPSAwOworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgcHJldmFpbGluZyBpbmRlbnQgZm9yIGEgbGluZSB0aGF0IGlzIG5vdCBwcmVjZWRlZG9mIGJ5CisgICAgICogYW4gb3BlbmluZyBicmFjZS4KKyAgICAgKi8KKyAgICBpbnQgaW5kX25vX2JyYWNlID0gMDsKKworICAgIC8qCisgICAgICogY29sdW1uIHdoZXJlIHRoZSBmaXJzdCB7IG9mIGEgZnVuY3Rpb24gc2hvdWxkIGJlIGxvY2F0ZWQgfQorICAgICAqLworICAgIGludCBpbmRfZmlyc3Rfb3BlbiA9IDA7CisKKyAgICAvKgorICAgICAqIHNwYWNlcyBmcm9tIHRoZSBwcmV2YWlsaW5nIGluZGVudCBhIGxlZnRtb3N0IG9wZW4gYnJhY2Ugc2hvdWxkIGJlCisgICAgICogbG9jYXRlZAorICAgICAqLworICAgIGludCBpbmRfb3Blbl9leHRyYSA9IDA7CisKKyAgICAvKgorICAgICAqIHNwYWNlcyBmcm9tIHRoZSBtYXRjaGluZyBvcGVuIGJyYWNlIChyZWFsIGxvY2F0aW9uIGZvciBvbmUgYXQgdGhlIGxlZnQKKyAgICAgKiBlZGdlOyBpbWFnaW5hcnkgbG9jYXRpb24gZnJvbSBvbmUgdGhhdCBlbmRzIGEgbGluZSkgdGhlIG1hdGNoaW5nIGNsb3NlCisgICAgICogYnJhY2Ugc2hvdWxkIGJlIGxvY2F0ZWQKKyAgICAgKi8KKyAgICBpbnQgaW5kX2Nsb3NlX2V4dHJhID0gMDsKKworICAgIC8qCisgICAgICogc3BhY2VzIGZyb20gdGhlIGVkZ2Ugb2YgdGhlIGxpbmUgYW4gb3BlbiBicmFjZSBzaXR0aW5nIGluIHRoZSBsZWZ0bW9zdAorICAgICAqIGNvbHVtbiBpcyBpbWFnaW5lZCB0byBiZQorICAgICAqLworICAgIGludCBpbmRfb3Blbl9sZWZ0X2ltYWcgPSAwOworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgc3dpdGNoKCkgaW5kZW50IGEgImNhc2UgeHgiIGxhYmVsIHNob3VsZCBiZSBsb2NhdGVkCisgICAgICovCisgICAgaW50IGluZF9jYXNlID0gY3VyYnVmLT5iX3Bfc3c7CisKKyAgICAvKgorICAgICAqIHNwYWNlcyBmcm9tIHRoZSAiY2FzZSB4eDoiIGNvZGUgYWZ0ZXIgYSBzd2l0Y2goKSBzaG91bGQgYmUgbG9jYXRlZAorICAgICAqLworICAgIGludCBpbmRfY2FzZV9jb2RlID0gY3VyYnVmLT5iX3Bfc3c7CisKKyAgICAvKgorICAgICAqIGxpbmV1cCBicmVhayBhdCBlbmQgb2YgY2FzZSBpbiBzd2l0Y2goKSB3aXRoIGNhc2UgbGFiZWwKKyAgICAgKi8KKyAgICBpbnQgaW5kX2Nhc2VfYnJlYWsgPSAwOworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgY2xhc3MgZGVjbGFyYXRpb24gaW5kZW50IGEgc2NvcGUgZGVjbGFyYXRpb24gbGFiZWwKKyAgICAgKiBzaG91bGQgYmUgbG9jYXRlZAorICAgICAqLworICAgIGludCBpbmRfc2NvcGVkZWNsID0gY3VyYnVmLT5iX3Bfc3c7CisKKyAgICAvKgorICAgICAqIHNwYWNlcyBmcm9tIHRoZSBzY29wZSBkZWNsYXJhdGlvbiBsYWJlbCBjb2RlIHNob3VsZCBiZSBsb2NhdGVkCisgICAgICovCisgICAgaW50IGluZF9zY29wZWRlY2xfY29kZSA9IGN1cmJ1Zi0+Yl9wX3N3OworCisgICAgLyoKKyAgICAgKiBhbW91bnQgSyZSLXN0eWxlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGluZGVudGVkCisgICAgICovCisgICAgaW50IGluZF9wYXJhbSA9IGN1cmJ1Zi0+Yl9wX3N3OworCisgICAgLyoKKyAgICAgKiBhbW91bnQgYSBmdW5jdGlvbiB0eXBlIHNwZWMgc2hvdWxkIGJlIGluZGVudGVkCisgICAgICovCisgICAgaW50IGluZF9mdW5jX3R5cGUgPSBjdXJidWYtPmJfcF9zdzsKKworICAgIC8qCisgICAgICogYW1vdW50IGEgY3BwIGJhc2UgY2xhc3MgZGVjbGFyYXRpb24gb3IgY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBzaG91bGQgYmUgaW5kZW50ZWQKKyAgICAgKi8KKyAgICBpbnQgaW5kX2NwcF9iYXNlY2xhc3MgPSBjdXJidWYtPmJfcF9zdzsKKworICAgIC8qCisgICAgICogYWRkaXRpb25hbCBzcGFjZXMgYmV5b25kIHRoZSBwcmV2YWlsaW5nIGluZGVudCBhIGNvbnRpbnVhdGlvbiBsaW5lCisgICAgICogc2hvdWxkIGJlIGxvY2F0ZWQKKyAgICAgKi8KKyAgICBpbnQgaW5kX2NvbnRpbnVhdGlvbiA9IGN1cmJ1Zi0+Yl9wX3N3OworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgaW5kZW50IG9mIHRoZSBsaW5lIHdpdGggYW4gdW5jbG9zZWQgcGFyZW50aGVzZXMKKyAgICAgKi8KKyAgICBpbnQgaW5kX3VuY2xvc2VkID0gY3VyYnVmLT5iX3Bfc3cgKiAyOworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgaW5kZW50IG9mIHRoZSBsaW5lIHdpdGggYW4gdW5jbG9zZWQgcGFyZW50aGVzZXMsIHdoaWNoCisgICAgICogaXRzZWxmIGlzIGFsc28gdW5jbG9zZWQKKyAgICAgKi8KKyAgICBpbnQgaW5kX3VuY2xvc2VkMiA9IGN1cmJ1Zi0+Yl9wX3N3OworCisgICAgLyoKKyAgICAgKiBzdXBwcmVzcyBpZ25vcmluZyBzcGFjZXMgZnJvbSB0aGUgaW5kZW50IG9mIGEgbGluZSBzdGFydGluZyB3aXRoIGFuCisgICAgICogdW5jbG9zZWQgcGFyZW50aGVzZXMuCisgICAgICovCisgICAgaW50IGluZF91bmNsb3NlZF9ub2lnbm9yZSA9IDA7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBvcGVuaW5nIHBhcmVuIGlzIHRoZSBsYXN0IG5vbndoaXRlIGNoYXJhY3RlciBvbiB0aGUgbGluZSwgYW5kCisgICAgICogaW5kX3VuY2xvc2VkX3dyYXBwZWQgaXMgbm9uemVybywgdXNlIHRoaXMgaW5kZW50IHJlbGF0aXZlIHRvIHRoZSBvdXRlcgorICAgICAqIGNvbnRleHQgKGZvciB2ZXJ5IGxvbmcgbGluZXMpLgorICAgICAqLworICAgIGludCBpbmRfdW5jbG9zZWRfd3JhcHBlZCA9IDA7CisKKyAgICAvKgorICAgICAqIHN1cHByZXNzIGlnbm9yaW5nIHdoaXRlIHNwYWNlIHdoZW4gbGluaW5nIHVwIHdpdGggdGhlIGNoYXJhY3RlciBhZnRlcgorICAgICAqIGFuIHVuY2xvc2VkIHBhcmVudGhlc2VzLgorICAgICAqLworICAgIGludCBpbmRfdW5jbG9zZWRfd2hpdGVvayA9IDA7CisKKyAgICAvKgorICAgICAqIGluZGVudCBhIGNsb3NpbmcgcGFyZW50aGVzZXMgdW5kZXIgdGhlIGxpbmUgc3RhcnQgb2YgdGhlIG1hdGNoaW5nCisgICAgICogb3BlbmluZyBwYXJlbnRoZXNlcy4KKyAgICAgKi8KKyAgICBpbnQgaW5kX21hdGNoaW5nX3BhcmVuID0gMDsKKworICAgIC8qCisgICAgICogRXh0cmEgaW5kZW50IGZvciBjb21tZW50cy4KKyAgICAgKi8KKyAgICBpbnQgaW5kX2NvbW1lbnQgPSAwOworCisgICAgLyoKKyAgICAgKiBzcGFjZXMgZnJvbSB0aGUgY29tbWVudCBvcGVuZXIgd2hlbiB0aGVyZSBpcyBub3RoaW5nIGFmdGVyIGl0LgorICAgICAqLworICAgIGludCBpbmRfaW5fY29tbWVudCA9IDM7CisKKyAgICAvKgorICAgICAqIGJvb2xlYW46IGlmIG5vbi16ZXJvLCB1c2UgaW5kX2luX2NvbW1lbnQgZXZlbiBpZiB0aGVyZSBpcyBzb21ldGhpbmcKKyAgICAgKiBhZnRlciB0aGUgY29tbWVudCBvcGVuZXIuCisgICAgICovCisgICAgaW50IGluZF9pbl9jb21tZW50MiA9IDA7CisKKyAgICAvKgorICAgICAqIG1heCBsaW5lcyB0byBzZWFyY2ggZm9yIGFuIG9wZW4gcGFyZW4KKyAgICAgKi8KKyAgICBpbnQgaW5kX21heHBhcmVuID0gMjA7CisKKyAgICAvKgorICAgICAqIG1heCBsaW5lcyB0byBzZWFyY2ggZm9yIGFuIG9wZW4gY29tbWVudAorICAgICAqLworICAgIGludCBpbmRfbWF4Y29tbWVudCA9IDcwOworCisgICAgLyoKKyAgICAgKiBoYW5kbGUgYnJhY2VzIGZvciBqYXZhIGNvZGUKKyAgICAgKi8KKyAgICBpbnQJaW5kX2phdmEgPSAwOworCisgICAgLyoKKyAgICAgKiBoYW5kbGUgYmxvY2tlZCBjYXNlcyBjb3JyZWN0bHkKKyAgICAgKi8KKyAgICBpbnQgaW5kX2tlZXBfY2FzZV9sYWJlbCA9IDA7CisKKyAgICBwb3NfVAljdXJfY3VycG9zOworICAgIGludAkJYW1vdW50OworICAgIGludAkJc2NvcGVfYW1vdW50OworICAgIGludAkJY3VyX2Ftb3VudDsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBjaGFyX3UJKnRoZWxpbmU7CisgICAgY2hhcl91CSpsaW5lY29weTsKKyAgICBwb3NfVAkqdHJ5cG9zOworICAgIHBvc19UCSp0cnlwb3NCcmFjZSA9IE5VTEw7CisgICAgcG9zX1QJb3VyX3BhcmVuX3BvczsKKyAgICBjaGFyX3UJKnN0YXJ0OworICAgIGludAkJc3RhcnRfYnJhY2U7CisjZGVmaW5lIEJSQUNFX0lOX0NPTDAJCTEJICAgIC8qICd7JyBpcyBpbiBjb211bW4gMCAqLworI2RlZmluZSBCUkFDRV9BVF9TVEFSVAkJMgkgICAgLyogJ3snIGlzIGF0IHN0YXJ0IG9mIGxpbmUgKi8KKyNkZWZpbmUgQlJBQ0VfQVRfRU5ECQkzCSAgICAvKiAneycgaXMgYXQgZW5kIG9mIGxpbmUgKi8KKyAgICBsaW5lbnJfVAlvdXJzY29wZTsKKyAgICBjaGFyX3UJKmw7CisgICAgY2hhcl91CSpsb29rOworICAgIGNoYXJfdQl0ZXJtaW5hdGVkOworICAgIGludAkJbG9va2ZvcjsKKyNkZWZpbmUgTE9PS0ZPUl9JTklUSUFMCQkwCisjZGVmaW5lIExPT0tGT1JfSUYJCTEKKyNkZWZpbmUgTE9PS0ZPUl9ETwkJMgorI2RlZmluZSBMT09LRk9SX0NBU0UJCTMKKyNkZWZpbmUgTE9PS0ZPUl9BTlkJCTQKKyNkZWZpbmUgTE9PS0ZPUl9URVJNCQk1CisjZGVmaW5lIExPT0tGT1JfVU5URVJNCQk2CisjZGVmaW5lIExPT0tGT1JfU0NPUEVERUNMCTcKKyNkZWZpbmUgTE9PS0ZPUl9OT0JSRUFLCQk4CisjZGVmaW5lIExPT0tGT1JfQ1BQX0JBU0VDTEFTUwk5CisjZGVmaW5lIExPT0tGT1JfRU5VTV9PUl9JTklUCTEwCisKKyAgICBpbnQJCXdoaWxlbGV2ZWw7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKm9wdGlvbnM7CisgICAgaW50CQlmcmFjdGlvbiA9IDA7CSAgICAvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCWRpdmlkZXI7CisgICAgaW50CQluOworICAgIGludAkJaXNjYXNlOworICAgIGludAkJbG9va2Zvcl9icmVhazsKKyAgICBpbnQJCWNvbnRfYW1vdW50ID0gMDsgICAgLyogYW1vdW50IGZvciBjb250aW51YXRpb24gbGluZSAqLworCisgICAgZm9yIChvcHRpb25zID0gY3VyYnVmLT5iX3BfY2lubzsgKm9wdGlvbnM7ICkKKyAgICB7CisJbCA9IG9wdGlvbnMrKzsKKwlpZiAoKm9wdGlvbnMgPT0gJy0nKQorCSAgICArK29wdGlvbnM7CisJbiA9IGdldGRpZ2l0cygmb3B0aW9ucyk7CisJZGl2aWRlciA9IDA7CisJaWYgKCpvcHRpb25zID09ICcuJykJICAgIC8qICIuNXMiIG1lYW5zIGEgZnJhY3Rpb24gKi8KKwl7CisJICAgIGZyYWN0aW9uID0gYXRvbCgoY2hhciAqKSsrb3B0aW9ucyk7CisJICAgIHdoaWxlIChWSU1fSVNESUdJVCgqb3B0aW9ucykpCisJICAgIHsKKwkJKytvcHRpb25zOworCQlpZiAoZGl2aWRlcikKKwkJICAgIGRpdmlkZXIgKj0gMTA7CisJCWVsc2UKKwkJICAgIGRpdmlkZXIgPSAxMDsKKwkgICAgfQorCX0KKwlpZiAoKm9wdGlvbnMgPT0gJ3MnKQkgICAgLyogIjJzIiBtZWFucyB0d28gdGltZXMgJ3NoaWZ0d2lkdGgnICovCisJeworCSAgICBpZiAobiA9PSAwICYmIGZyYWN0aW9uID09IDApCisJCW4gPSBjdXJidWYtPmJfcF9zdzsJLyoganVzdCAicyIgaXMgb25lICdzaGlmdHdpZHRoJyAqLworCSAgICBlbHNlCisJICAgIHsKKwkJbiAqPSBjdXJidWYtPmJfcF9zdzsKKwkJaWYgKGRpdmlkZXIpCisJCSAgICBuICs9IChjdXJidWYtPmJfcF9zdyAqIGZyYWN0aW9uICsgZGl2aWRlciAvIDIpIC8gZGl2aWRlcjsKKwkgICAgfQorCSAgICArK29wdGlvbnM7CisJfQorCWlmIChsWzFdID09ICctJykKKwkgICAgbiA9IC1uOworCS8qIFdoZW4gYWRkaW5nIGFuIGVudHJ5IGhlcmUsIGFsc28gdXBkYXRlIHRoZSBkZWZhdWx0ICdjaW5vcHRpb25zJyBpbgorCSAqIGNoYW5nZS50eHQsIGFuZCBhZGQgZXhwbGFuYXRpb24gZm9yIGl0ISAqLworCXN3aXRjaCAoKmwpCisJeworCSAgICBjYXNlICc+JzogaW5kX2xldmVsID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ2UnOiBpbmRfb3Blbl9pbWFnID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ24nOiBpbmRfbm9fYnJhY2UgPSBuOyBicmVhazsKKwkgICAgY2FzZSAnZic6IGluZF9maXJzdF9vcGVuID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ3snOiBpbmRfb3Blbl9leHRyYSA9IG47IGJyZWFrOworCSAgICBjYXNlICd9JzogaW5kX2Nsb3NlX2V4dHJhID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ14nOiBpbmRfb3Blbl9sZWZ0X2ltYWcgPSBuOyBicmVhazsKKwkgICAgY2FzZSAnOic6IGluZF9jYXNlID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJz0nOiBpbmRfY2FzZV9jb2RlID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ2InOiBpbmRfY2FzZV9icmVhayA9IG47IGJyZWFrOworCSAgICBjYXNlICdwJzogaW5kX3BhcmFtID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ3QnOiBpbmRfZnVuY190eXBlID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJy8nOiBpbmRfY29tbWVudCA9IG47IGJyZWFrOworCSAgICBjYXNlICdjJzogaW5kX2luX2NvbW1lbnQgPSBuOyBicmVhazsKKwkgICAgY2FzZSAnQyc6IGluZF9pbl9jb21tZW50MiA9IG47IGJyZWFrOworCSAgICBjYXNlICdpJzogaW5kX2NwcF9iYXNlY2xhc3MgPSBuOyBicmVhazsKKwkgICAgY2FzZSAnKyc6IGluZF9jb250aW51YXRpb24gPSBuOyBicmVhazsKKwkgICAgY2FzZSAnKCc6IGluZF91bmNsb3NlZCA9IG47IGJyZWFrOworCSAgICBjYXNlICd1JzogaW5kX3VuY2xvc2VkMiA9IG47IGJyZWFrOworCSAgICBjYXNlICdVJzogaW5kX3VuY2xvc2VkX25vaWdub3JlID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ1cnOiBpbmRfdW5jbG9zZWRfd3JhcHBlZCA9IG47IGJyZWFrOworCSAgICBjYXNlICd3JzogaW5kX3VuY2xvc2VkX3doaXRlb2sgPSBuOyBicmVhazsKKwkgICAgY2FzZSAnbSc6IGluZF9tYXRjaGluZ19wYXJlbiA9IG47IGJyZWFrOworCSAgICBjYXNlICcpJzogaW5kX21heHBhcmVuID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJyonOiBpbmRfbWF4Y29tbWVudCA9IG47IGJyZWFrOworCSAgICBjYXNlICdnJzogaW5kX3Njb3BlZGVjbCA9IG47IGJyZWFrOworCSAgICBjYXNlICdoJzogaW5kX3Njb3BlZGVjbF9jb2RlID0gbjsgYnJlYWs7CisJICAgIGNhc2UgJ2onOiBpbmRfamF2YSA9IG47IGJyZWFrOworCSAgICBjYXNlICdsJzogaW5kX2tlZXBfY2FzZV9sYWJlbCA9IG47IGJyZWFrOworCX0KKyAgICB9CisKKyAgICAvKiByZW1lbWJlciB3aGVyZSB0aGUgY3Vyc29yIHdhcyB3aGVuIHdlIHN0YXJ0ZWQgKi8KKyAgICBjdXJfY3VycG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKworICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGxpbmUuCisgICAgICogVGhpcyBpcyByZXF1aXJlZCwgYmVjYXVzZSBvbmx5IHRoZSBtb3N0IHJlY2VudCBsaW5lIG9idGFpbmVkIHdpdGgKKyAgICAgKiBtbF9nZXQgaXMgdmFsaWQhICovCisgICAgbGluZWNvcHkgPSB2aW1fc3Ryc2F2ZShtbF9nZXQoY3VyX2N1cnBvcy5sbnVtKSk7CisgICAgaWYgKGxpbmVjb3B5ID09IE5VTEwpCisJcmV0dXJuIDA7CisKKyAgICAvKgorICAgICAqIEluIGluc2VydCBtb2RlIGFuZCB0aGUgY3Vyc29yIGlzIG9uIGEgJyknIHRydW5jYXRlIHRoZSBsaW5lIGF0IHRoZQorICAgICAqIGN1cnNvciBwb3NpdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gbGluZSB1cCB3aXRoIHRoZSBtYXRjaGluZyAnKCcgd2hlbgorICAgICAqIGluc2VydGluZyBuZXcgc3R1ZmYuCisgICAgICogRm9yIHVua25vd24gcmVhc29ucyB0aGUgY3Vyc29yIG1pZ2h0IGJlIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZSwgdGh1cworICAgICAqIGNoZWNrIGZvciB0aGF0LgorICAgICAqLworICAgIGlmICgoU3RhdGUgJiBJTlNFUlQpCisJICAgICYmIGN1cndpbi0+d19jdXJzb3IuY29sIDwgU1RSTEVOKGxpbmVjb3B5KQorCSAgICAmJiBsaW5lY29weVtjdXJ3aW4tPndfY3Vyc29yLmNvbF0gPT0gJyknKQorCWxpbmVjb3B5W2N1cndpbi0+d19jdXJzb3IuY29sXSA9IE5VTDsKKworICAgIHRoZWxpbmUgPSBza2lwd2hpdGUobGluZWNvcHkpOworCisgICAgLyogbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLworCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCisgICAgLyoKKyAgICAgKiAjZGVmaW5lcyBhbmQgc28gb24gYWx3YXlzIGdvIGF0IHRoZSBsZWZ0IHdoZW4gaW5jbHVkZWQgaW4gJ2NpbmtleXMnLgorICAgICAqLworICAgIGlmICgqdGhlbGluZSA9PSAnIycgJiYgKCpsaW5lY29weSA9PSAnIycgfHwgaW5fY2lua2V5cygnIycsICcgJywgVFJVRSkpKQorICAgIHsKKwlhbW91bnQgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogSXMgaXQgYSBub24tY2FzZSBsYWJlbD8JVGhlbiB0aGF0IGdvZXMgYXQgdGhlIGxlZnQgbWFyZ2luIHRvby4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChjaW5faXNsYWJlbChpbmRfbWF4Y29tbWVudCkpCSAgICAvKiBYWFggKi8KKyAgICB7CisJYW1vdW50ID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlJ3JlIGluc2lkZSBhICIvLyIgY29tbWVudCBhbmQgdGhlcmUgaXMgYSAiLy8iIGNvbW1lbnQgaW4gYQorICAgICAqIHByZXZpb3VzIGxpbmUsIGxpbmV1cCB3aXRoIHRoYXQgb25lLgorICAgICAqLworICAgIGVsc2UgaWYgKGNpbl9pc2xpbmVjb21tZW50KHRoZWxpbmUpCisJICAgICYmICh0cnlwb3MgPSBmaW5kX2xpbmVfY29tbWVudCgpKSAhPSBOVUxMKSAvKiBYWFggKi8KKyAgICB7CisJLyogZmluZCBob3cgaW5kZW50ZWQgdGhlIGxpbmUgYmVnaW5uaW5nIHRoZSBjb21tZW50IGlzICovCisJZ2V0dmNvbChjdXJ3aW4sIHRyeXBvcywgJmNvbCwgTlVMTCwgTlVMTCk7CisJYW1vdW50ID0gY29sOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgd2UncmUgaW5zaWRlIGEgY29tbWVudCBhbmQgbm90IGxvb2tpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAqIGNvbW1lbnQsIHRyeSB1c2luZyB0aGUgJ2NvbW1lbnRzJyBvcHRpb24uCisgICAgICovCisgICAgZWxzZSBpZiAoIWNpbl9pc2NvbW1lbnQodGhlbGluZSkKKwkgICAgJiYgKHRyeXBvcyA9IGZpbmRfc3RhcnRfY29tbWVudChpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpIC8qIFhYWCAqLworICAgIHsKKwlpbnQJbGVhZF9zdGFydF9sZW4gPSAyOworCWludAlsZWFkX21pZGRsZV9sZW4gPSAxOworCWNoYXJfdQlsZWFkX3N0YXJ0W0NPTV9NQVhfTEVOXTsJLyogc3RhcnQtY29tbWVudCBzdHJpbmcgKi8KKwljaGFyX3UJbGVhZF9taWRkbGVbQ09NX01BWF9MRU5dOwkvKiBtaWRkbGUtY29tbWVudCBzdHJpbmcgKi8KKwljaGFyX3UJbGVhZF9lbmRbQ09NX01BWF9MRU5dOwkJLyogZW5kLWNvbW1lbnQgc3RyaW5nICovCisJY2hhcl91CSpwOworCWludAlzdGFydF9hbGlnbiA9IDA7CisJaW50CXN0YXJ0X29mZiA9IDA7CisJaW50CWRvbmUgPSBGQUxTRTsKKworCS8qIGZpbmQgaG93IGluZGVudGVkIHRoZSBsaW5lIGJlZ2lubmluZyB0aGUgY29tbWVudCBpcyAqLworCWdldHZjb2woY3Vyd2luLCB0cnlwb3MsICZjb2wsIE5VTEwsIE5VTEwpOworCWFtb3VudCA9IGNvbDsKKworCXAgPSBjdXJidWYtPmJfcF9jb207CisJd2hpbGUgKCpwICE9IE5VTCkKKwl7CisJICAgIGludAlhbGlnbiA9IDA7CisJICAgIGludAlvZmYgPSAwOworCSAgICBpbnQgd2hhdCA9IDA7CisKKwkgICAgd2hpbGUgKCpwICE9IE5VTCAmJiAqcCAhPSAnOicpCisJICAgIHsKKwkJaWYgKCpwID09IENPTV9TVEFSVCB8fCAqcCA9PSBDT01fRU5EIHx8ICpwID09IENPTV9NSURETEUpCisJCSAgICB3aGF0ID0gKnArKzsKKwkJZWxzZSBpZiAoKnAgPT0gQ09NX0xFRlQgfHwgKnAgPT0gQ09NX1JJR0hUKQorCQkgICAgYWxpZ24gPSAqcCsrOworCQllbHNlIGlmIChWSU1fSVNESUdJVCgqcCkgfHwgKnAgPT0gJy0nKQorCQkgICAgb2ZmID0gZ2V0ZGlnaXRzKCZwKTsKKwkJZWxzZQorCQkgICAgKytwOworCSAgICB9CisKKwkgICAgaWYgKCpwID09ICc6JykKKwkJKytwOworCSAgICAodm9pZCljb3B5X29wdGlvbl9wYXJ0KCZwLCBsZWFkX2VuZCwgQ09NX01BWF9MRU4sICIsIik7CisJICAgIGlmICh3aGF0ID09IENPTV9TVEFSVCkKKwkgICAgeworCQlTVFJDUFkobGVhZF9zdGFydCwgbGVhZF9lbmQpOworCQlsZWFkX3N0YXJ0X2xlbiA9IChpbnQpU1RSTEVOKGxlYWRfc3RhcnQpOworCQlzdGFydF9vZmYgPSBvZmY7CisJCXN0YXJ0X2FsaWduID0gYWxpZ247CisJICAgIH0KKwkgICAgZWxzZSBpZiAod2hhdCA9PSBDT01fTUlERExFKQorCSAgICB7CisJCVNUUkNQWShsZWFkX21pZGRsZSwgbGVhZF9lbmQpOworCQlsZWFkX21pZGRsZV9sZW4gPSAoaW50KVNUUkxFTihsZWFkX21pZGRsZSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAod2hhdCA9PSBDT01fRU5EKQorCSAgICB7CisJCS8qIElmIG91ciBsaW5lIHN0YXJ0cyB3aXRoIHRoZSBtaWRkbGUgY29tbWVudCBzdHJpbmcsIGxpbmUgaXQKKwkJICogdXAgd2l0aCB0aGUgY29tbWVudCBvcGVuZXIgcGVyIHRoZSAnY29tbWVudHMnIG9wdGlvbi4gKi8KKwkJaWYgKFNUUk5DTVAodGhlbGluZSwgbGVhZF9taWRkbGUsIGxlYWRfbWlkZGxlX2xlbikgPT0gMAorCQkJJiYgU1RSTkNNUCh0aGVsaW5lLCBsZWFkX2VuZCwgU1RSTEVOKGxlYWRfZW5kKSkgIT0gMCkKKwkJeworCQkgICAgZG9uZSA9IFRSVUU7CisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gMSkKKwkJICAgIHsKKwkJCS8qIElmIHRoZSBzdGFydCBjb21tZW50IHN0cmluZyBtYXRjaGVzIGluIHRoZSBwcmV2aW91cworCQkJICogbGluZSwgdXNlIHRoZSBpbmRlbnQgb2YgdGhhdCBsaW5lIHBsdXNzIG9mZnNldC4gIElmCisJCQkgKiB0aGUgbWlkZGxlIGNvbW1lbnQgc3RyaW5nIG1hdGNoZXMgaW4gdGhlIHByZXZpb3VzCisJCQkgKiBsaW5lLCB1c2UgdGhlIGluZGVudCBvZiB0aGF0IGxpbmUuICBYWFggKi8KKwkJCWxvb2sgPSBza2lwd2hpdGUobWxfZ2V0KGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpKTsKKwkJCWlmIChTVFJOQ01QKGxvb2ssIGxlYWRfc3RhcnQsIGxlYWRfc3RhcnRfbGVuKSA9PSAwKQorCQkJICAgIGFtb3VudCA9IGdldF9pbmRlbnRfbG51bShjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSAxKTsKKwkJCWVsc2UgaWYgKFNUUk5DTVAobG9vaywgbGVhZF9taWRkbGUsCisJCQkJCQkJbGVhZF9taWRkbGVfbGVuKSA9PSAwKQorCQkJeworCQkJICAgIGFtb3VudCA9IGdldF9pbmRlbnRfbG51bShjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSAxKTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCS8qIElmIHRoZSBzdGFydCBjb21tZW50IHN0cmluZyBkb2Vzbid0IG1hdGNoIHdpdGggdGhlCisJCQkgKiBzdGFydCBvZiB0aGUgY29tbWVudCwgc2tpcCB0aGlzIGVudHJ5LiBYWFggKi8KKwkJCWVsc2UgaWYgKFNUUk5DTVAobWxfZ2V0KHRyeXBvcy0+bG51bSkgKyB0cnlwb3MtPmNvbCwKKwkJCQkJICAgICBsZWFkX3N0YXJ0LCBsZWFkX3N0YXJ0X2xlbikgIT0gMCkKKwkJCSAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICAgIGlmIChzdGFydF9vZmYgIT0gMCkKKwkJCWFtb3VudCArPSBzdGFydF9vZmY7CisJCSAgICBlbHNlIGlmIChzdGFydF9hbGlnbiA9PSBDT01fUklHSFQpCisJCQlhbW91bnQgKz0gbGVhZF9zdGFydF9sZW4gLSBsZWFkX21pZGRsZV9sZW47CisJCSAgICBicmVhazsKKwkJfQorCisJCS8qIElmIG91ciBsaW5lIHN0YXJ0cyB3aXRoIHRoZSBlbmQgY29tbWVudCBzdHJpbmcsIGxpbmUgaXQgdXAKKwkJICogd2l0aCB0aGUgbWlkZGxlIGNvbW1lbnQgKi8KKwkJaWYgKFNUUk5DTVAodGhlbGluZSwgbGVhZF9taWRkbGUsIGxlYWRfbWlkZGxlX2xlbikgIT0gMAorCQkJJiYgU1RSTkNNUCh0aGVsaW5lLCBsZWFkX2VuZCwgU1RSTEVOKGxlYWRfZW5kKSkgPT0gMCkKKwkJeworCQkgICAgYW1vdW50ID0gZ2V0X2luZGVudF9sbnVtKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpOworCQkJCQkJCQkgICAgIC8qIFhYWCAqLworCQkgICAgaWYgKG9mZiAhPSAwKQorCQkJYW1vdW50ICs9IG9mZjsKKwkJICAgIGVsc2UgaWYgKGFsaWduID09IENPTV9SSUdIVCkKKwkJCWFtb3VudCArPSBsZWFkX3N0YXJ0X2xlbiAtIGxlYWRfbWlkZGxlX2xlbjsKKwkJICAgIGRvbmUgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworCS8qIElmIG91ciBsaW5lIHN0YXJ0cyB3aXRoIGFuIGFzdGVyaXNrLCBsaW5lIHVwIHdpdGggdGhlCisJICogYXN0ZXJpc2sgaW4gdGhlIGNvbW1lbnQgb3BlbmVyOyBvdGhlcndpc2UsIGxpbmUgdXAKKwkgKiB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNvbW1lbnQgdGV4dC4KKwkgKi8KKwlpZiAoZG9uZSkKKwkgICAgOworCWVsc2UgaWYgKHRoZWxpbmVbMF0gPT0gJyonKQorCSAgICBhbW91bnQgKz0gMTsKKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJZiB3ZSBhcmUgbW9yZSB0aGFuIG9uZSBsaW5lIGF3YXkgZnJvbSB0aGUgY29tbWVudCBvcGVuZXIsIHRha2UKKwkgICAgICogdGhlIGluZGVudCBvZiB0aGUgcHJldmlvdXMgbm9uLWVtcHR5IGxpbmUuICBJZiAnY2lubycgaGFzICJDTyIKKwkgICAgICogYW5kIHdlIGFyZSBqdXN0IGJlbG93IHRoZSBjb21tZW50IG9wZW5lciBhbmQgdGhlcmUgYXJlIGFueQorCSAgICAgKiB3aGl0ZSBjaGFyYWN0ZXJzIGFmdGVyIGl0IGxpbmUgdXAgd2l0aCB0aGUgdGV4dCBhZnRlciBpdDsKKwkgICAgICogb3RoZXJ3aXNlLCBhZGQgdGhlIGFtb3VudCBzcGVjaWZpZWQgYnkgImMiIGluICdjaW5vJworCSAgICAgKi8KKwkgICAgYW1vdW50ID0gLTE7CisJICAgIGZvciAobG51bSA9IGN1cl9jdXJwb3MubG51bSAtIDE7IGxudW0gPiB0cnlwb3MtPmxudW07IC0tbG51bSkKKwkgICAgeworCQlpZiAobGluZXdoaXRlKGxudW0pKQkJICAgIC8qIHNraXAgYmxhbmsgbGluZXMgKi8KKwkJICAgIGNvbnRpbnVlOworCQlhbW91bnQgPSBnZXRfaW5kZW50X2xudW0obG51bSk7CSAgICAvKiBYWFggKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGFtb3VudCA9PSAtMSkJCQkgICAgLyogdXNlIHRoZSBjb21tZW50IG9wZW5lciAqLworCSAgICB7CisJCWlmICghaW5kX2luX2NvbW1lbnQyKQorCQl7CisJCSAgICBzdGFydCA9IG1sX2dldCh0cnlwb3MtPmxudW0pOworCQkgICAgbG9vayA9IHN0YXJ0ICsgdHJ5cG9zLT5jb2wgKyAyOyAvKiBza2lwIC8gYW5kICogKi8KKwkJICAgIGlmICgqbG9vayAhPSBOVUwpCQkgICAgLyogaWYgc29tZXRoaW5nIGFmdGVyIGl0ICovCisJCQl0cnlwb3MtPmNvbCA9IChjb2xucl9UKShza2lwd2hpdGUobG9vaykgLSBzdGFydCk7CisJCX0KKwkJZ2V0dmNvbChjdXJ3aW4sIHRyeXBvcywgJmNvbCwgTlVMTCwgTlVMTCk7CisJCWFtb3VudCA9IGNvbDsKKwkJaWYgKGluZF9pbl9jb21tZW50MiB8fCAqbG9vayA9PSBOVUwpCisJCSAgICBhbW91bnQgKz0gaW5kX2luX2NvbW1lbnQ7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBcmUgd2UgaW5zaWRlIHBhcmVudGhlc2VzIG9yIGJyYWNlcz8KKyAgICAgKi8JCQkJCQkgICAgLyogWFhYICovCisgICAgZWxzZSBpZiAoKCh0cnlwb3MgPSBmaW5kX21hdGNoX3BhcmVuKGluZF9tYXhwYXJlbiwgaW5kX21heGNvbW1lbnQpKSAhPSBOVUxMCisJCSYmIGluZF9qYXZhID09IDApCisJICAgIHx8ICh0cnlwb3NCcmFjZSA9IGZpbmRfc3RhcnRfYnJhY2UoaW5kX21heGNvbW1lbnQpKSAhPSBOVUxMCisJICAgIHx8IHRyeXBvcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICh0cnlwb3MgIT0gTlVMTCAmJiB0cnlwb3NCcmFjZSAhPSBOVUxMKQorICAgICAgeworCSAgLyogQm90aCBhbiB1bm1hdGNoZWQgJygnIGFuZCAneycgaXMgZm91bmQuICBVc2UgdGhlIG9uZSB3aGljaCBpcworCSAgICogY2xvc2VyIHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgc2V0IHRoZSBvdGhlciB0byBOVUxMLiAqLworCSAgaWYgKHRyeXBvcy0+bG51bSAhPSB0cnlwb3NCcmFjZS0+bG51bQorCQkgID8gdHJ5cG9zLT5sbnVtIDwgdHJ5cG9zQnJhY2UtPmxudW0KKwkJICA6IHRyeXBvcy0+Y29sIDwgdHJ5cG9zQnJhY2UtPmNvbCkKKwkgICAgICB0cnlwb3MgPSBOVUxMOworCSAgZWxzZQorCSAgICAgIHRyeXBvc0JyYWNlID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgaWYgKHRyeXBvcyAhPSBOVUxMKQorICAgICAgeworCS8qCisJICogSWYgdGhlIG1hdGNoaW5nIHBhcmVuIGlzIG1vcmUgdGhhbiBvbmUgbGluZSBhd2F5LCB1c2UgdGhlIGluZGVudCBvZgorCSAqIGEgcHJldmlvdXMgbm9uLWVtcHR5IGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBzYW1lIHBhcmVuLgorCSAqLworCWFtb3VudCA9IC0xOworCWN1cl9hbW91bnQgPSBNQVhDT0w7CisJb3VyX3BhcmVuX3BvcyA9ICp0cnlwb3M7CisJZm9yIChsbnVtID0gY3VyX2N1cnBvcy5sbnVtIC0gMTsgbG51bSA+IG91cl9wYXJlbl9wb3MubG51bTsgLS1sbnVtKQorCXsKKwkgICAgbCA9IHNraXB3aGl0ZShtbF9nZXQobG51bSkpOworCSAgICBpZiAoY2luX25vY29kZShsKSkJCS8qIHNraXAgY29tbWVudCBsaW5lcyAqLworCQljb250aW51ZTsKKwkgICAgaWYgKGNpbl9pc3ByZXByb2NfY29udCgmbCwgJmxudW0pKQkvKiBpZ25vcmUgI2RlZmluZXMsICNpZiwgZXRjLiAqLworCQljb250aW51ZTsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKworCSAgICAvKiBTa2lwIGEgY29tbWVudC4gWFhYICovCisJICAgIGlmICgodHJ5cG9zID0gZmluZF9zdGFydF9jb21tZW50KGluZF9tYXhjb21tZW50KSkgIT0gTlVMTCkKKwkgICAgeworCQlsbnVtID0gdHJ5cG9zLT5sbnVtICsgMTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICAvKiBYWFggKi8KKwkgICAgaWYgKCh0cnlwb3MgPSBmaW5kX21hdGNoX3BhcmVuKAorCQkJICAgIGNvcnJfaW5kX21heHBhcmVuKGluZF9tYXhwYXJlbiwgJmN1cl9jdXJwb3MpLAorCQkJCQkJICAgICAgaW5kX21heGNvbW1lbnQpKSAhPSBOVUxMCisJCSAgICAmJiB0cnlwb3MtPmxudW0gPT0gb3VyX3BhcmVuX3Bvcy5sbnVtCisJCSAgICAmJiB0cnlwb3MtPmNvbCA9PSBvdXJfcGFyZW5fcG9zLmNvbCkKKwkgICAgeworCQkgICAgYW1vdW50ID0gZ2V0X2luZGVudF9sbnVtKGxudW0pOwkvKiBYWFggKi8KKworCQkgICAgaWYgKHRoZWxpbmVbMF0gPT0gJyknKQorCQkgICAgeworCQkJaWYgKG91cl9wYXJlbl9wb3MubG51bSAhPSBsbnVtICYmIGN1cl9hbW91bnQgPiBhbW91bnQpCisJCQkgICAgY3VyX2Ftb3VudCA9IGFtb3VudDsKKwkJCWFtb3VudCA9IC0xOworCQkgICAgfQorCQlicmVhazsKKwkgICAgfQorCX0KKworCS8qCisJICogTGluZSB1cCB3aXRoIGxpbmUgd2hlcmUgdGhlIG1hdGNoaW5nIHBhcmVuIGlzLiBYWFgKKwkgKiBJZiB0aGUgbGluZSBzdGFydHMgd2l0aCBhICcoJyBvciB0aGUgaW5kZW50IGZvciB1bmNsb3NlZAorCSAqIHBhcmVudGhlc2VzIGlzIHplcm8sIGxpbmUgdXAgd2l0aCB0aGUgdW5jbG9zZWQgcGFyZW50aGVzZXMuCisJICovCisJaWYgKGFtb3VudCA9PSAtMSkKKwl7CisJICAgIGFtb3VudCA9IHNraXBfbGFiZWwob3VyX3BhcmVuX3Bvcy5sbnVtLCAmbG9vaywgaW5kX21heGNvbW1lbnQpOworCSAgICBpZiAodGhlbGluZVswXSA9PSAnKScgfHwgaW5kX3VuY2xvc2VkID09IDAKKwkJICAgICAgIHx8ICghaW5kX3VuY2xvc2VkX25vaWdub3JlICYmICpza2lwd2hpdGUobG9vaykgPT0gJygnKSkKKwkgICAgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBsb29raW5nIGF0IGEgY2xvc2UgcGFyZW4sIGxpbmUgdXAgcmlnaHQgdGhlcmU7CisJCSAqIG90aGVyd2lzZSwgbGluZSB1cCB3aXRoIHRoZSBuZXh0IChub24td2hpdGUpIGNoYXJhY3Rlci4KKwkJICogV2hlbiBpbmRfdW5jbG9zZWRfd3JhcHBlZCBpcyBzZXQgYW5kIHRoZSBtYXRjaGluZyBwYXJlbiBpcworCQkgKiB0aGUgbGFzdCBub253aGl0ZSBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUsIHVzZSBlaXRoZXIgdGhlCisJCSAqIGluZGVudCBvZiB0aGUgY3VycmVudCBsaW5lIG9yIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgbmV4dAorCQkgKiBvdXRlciBwYXJlbiBhbmQgYWRkIGluZF91bmNsb3NlZF93cmFwcGVkIChmb3IgdmVyeSBsb25nCisJCSAqIGxpbmVzKS4KKwkJICovCisJCWlmICh0aGVsaW5lWzBdICE9ICcpJykKKwkJeworCQkgICAgY3VyX2Ftb3VudCA9IE1BWENPTDsKKwkJICAgIGwgPSBtbF9nZXQob3VyX3BhcmVuX3Bvcy5sbnVtKTsKKwkJICAgIGlmIChpbmRfdW5jbG9zZWRfd3JhcHBlZAorCQkJCSAgICAgICAmJiBjaW5fZW5kc19pbihsLCAoY2hhcl91ICopIigiLCBOVUxMKSkKKwkJICAgIHsKKwkJCS8qIGxvb2sgZm9yIG9wZW5pbmcgdW5tYXRjaGVkIHBhcmVuLCBpbmRlbnQgb25lIGxldmVsCisJCQkgKiBmb3IgZWFjaCBhZGRpdGlvbmFsIGxldmVsICovCisJCQluID0gMTsKKwkJCWZvciAoY29sID0gMDsgY29sIDwgb3VyX3BhcmVuX3Bvcy5jb2w7ICsrY29sKQorCQkJeworCQkJICAgIHN3aXRjaCAobFtjb2xdKQorCQkJICAgIHsKKwkJCQljYXNlICcoJzoKKwkJCQljYXNlICd7JzogKytuOworCQkJCQkgIGJyZWFrOworCisJCQkJY2FzZSAnKSc6CisJCQkJY2FzZSAnfSc6IGlmIChuID4gMSkKKwkJCQkJICAgICAgLS1uOworCQkJCQkgIGJyZWFrOworCQkJICAgIH0KKwkJCX0KKworCQkJb3VyX3BhcmVuX3Bvcy5jb2wgPSAwOworCQkJYW1vdW50ICs9IG4gKiBpbmRfdW5jbG9zZWRfd3JhcHBlZDsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGluZF91bmNsb3NlZF93aGl0ZW9rKQorCQkJb3VyX3BhcmVuX3Bvcy5jb2wrKzsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWNvbCA9IG91cl9wYXJlbl9wb3MuY29sICsgMTsKKwkJCXdoaWxlICh2aW1faXN3aGl0ZShsW2NvbF0pKQorCQkJICAgIGNvbCsrOworCQkJaWYgKGxbY29sXSAhPSBOVUwpCS8qIEluIGNhc2Ugb2YgdHJhaWxpbmcgc3BhY2UgKi8KKwkJCSAgICBvdXJfcGFyZW5fcG9zLmNvbCA9IGNvbDsKKwkJCWVsc2UKKwkJCSAgICBvdXJfcGFyZW5fcG9zLmNvbCsrOworCQkgICAgfQorCQl9CisKKwkJLyoKKwkJICogRmluZCBob3cgaW5kZW50ZWQgdGhlIHBhcmVuIGlzLCBvciB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0CisJCSAqIGlmIHdlIGRpZCB0aGUgYWJvdmUgImlmIi4KKwkJICovCisJCWlmIChvdXJfcGFyZW5fcG9zLmNvbCA+IDApCisJCXsKKwkJICAgIGdldHZjb2woY3Vyd2luLCAmb3VyX3BhcmVuX3BvcywgJmNvbCwgTlVMTCwgTlVMTCk7CisJCSAgICBpZiAoY3VyX2Ftb3VudCA+IChpbnQpY29sKQorCQkJY3VyX2Ftb3VudCA9IGNvbDsKKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHRoZWxpbmVbMF0gPT0gJyknICYmIGluZF9tYXRjaGluZ19wYXJlbikKKwkgICAgeworCQkvKiBMaW5lIHVwIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGluZyBwYXJlbiBsaW5lLiAqLworCSAgICB9CisJICAgIGVsc2UgaWYgKGluZF91bmNsb3NlZCA9PSAwIHx8ICghaW5kX3VuY2xvc2VkX25vaWdub3JlCisJCQkJCQkgICYmICpza2lwd2hpdGUobG9vaykgPT0gJygnKSkKKwkgICAgeworCQlpZiAoY3VyX2Ftb3VudCAhPSBNQVhDT0wpCisJCSAgICBhbW91bnQgPSBjdXJfYW1vdW50OworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBhZGQgaW5kX3VuY2xvc2VkMiBmb3IgZWFjaCAnKCcgYmVmb3JlIG91ciBtYXRjaGluZyBvbmUgKi8KKwkJY29sID0gb3VyX3BhcmVuX3Bvcy5jb2w7CisJCXdoaWxlIChvdXJfcGFyZW5fcG9zLmNvbCA+IDApCisJCXsKKwkJICAgIC0tb3VyX3BhcmVuX3Bvcy5jb2w7CisJCSAgICBzd2l0Y2ggKCptbF9nZXRfcG9zKCZvdXJfcGFyZW5fcG9zKSkKKwkJICAgIHsKKwkJCWNhc2UgJygnOiBhbW91bnQgKz0gaW5kX3VuY2xvc2VkMjsKKwkJCQkgIGNvbCA9IG91cl9wYXJlbl9wb3MuY29sOworCQkJCSAgYnJlYWs7CisJCQljYXNlICcpJzogYW1vdW50IC09IGluZF91bmNsb3NlZDI7CisJCQkJICBjb2wgPSBNQVhDT0w7CisJCQkJICBicmVhazsKKwkJICAgIH0KKwkJfQorCisJCS8qIFVzZSBpbmRfdW5jbG9zZWQgb25jZSwgd2hlbiB0aGUgZmlyc3QgJygnIGlzIG5vdCBpbnNpZGUKKwkJICogYnJhY2VzICovCisJCWlmIChjb2wgPT0gTUFYQ09MKQorCQkgICAgYW1vdW50ICs9IGluZF91bmNsb3NlZDsKKwkJZWxzZQorCQl7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvdXJfcGFyZW5fcG9zLmxudW07CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbDsKKwkJICAgIGlmICgodHJ5cG9zID0gZmluZF9tYXRjaF9wYXJlbihpbmRfbWF4cGFyZW4sCisJCQkJCQkgICAgIGluZF9tYXhjb21tZW50KSkgIT0gTlVMTCkKKwkJCWFtb3VudCArPSBpbmRfdW5jbG9zZWQyOworCQkgICAgZWxzZQorCQkJYW1vdW50ICs9IGluZF91bmNsb3NlZDsKKwkJfQorCQkvKgorCQkgKiBGb3IgYSBsaW5lIHN0YXJ0aW5nIHdpdGggJyknIHVzZSB0aGUgbWluaW11bSBvZiB0aGUgdHdvCisJCSAqIHBvc2l0aW9ucywgdG8gYXZvaWQgZ2l2aW5nIGl0IG1vcmUgaW5kZW50IHRoYW4gdGhlIHByZXZpb3VzCisJCSAqIGxpbmVzOgorCQkgKiAgZnVuY19sb25nX25hbWUoCQkgICAgaWYgKHgKKwkJICoJYXJnCQkJCSAgICAmJiB5eQorCQkgKgkpCSAgXiBub3QgaGVyZQkgICAgICAgKSAgICBeIG5vdCBoZXJlCisJCSAqLworCQlpZiAoY3VyX2Ftb3VudCA8IGFtb3VudCkKKwkJICAgIGFtb3VudCA9IGN1cl9hbW91bnQ7CisJICAgIH0KKwl9CisKKwkvKiBhZGQgZXh0cmEgaW5kZW50IGZvciBhIGNvbW1lbnQgKi8KKwlpZiAoY2luX2lzY29tbWVudCh0aGVsaW5lKSkKKwkgICAgYW1vdW50ICs9IGluZF9jb21tZW50OworICAgICAgfQorCisgICAgICAvKgorICAgICAgICogQXJlIHdlIGF0IGxlYXN0IGluc2lkZSBicmFjZXMsIHRoZW4/CisgICAgICAgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKwl0cnlwb3MgPSB0cnlwb3NCcmFjZTsKKworCW91cnNjb3BlID0gdHJ5cG9zLT5sbnVtOworCXN0YXJ0ID0gbWxfZ2V0KG91cnNjb3BlKTsKKworCS8qCisJICogTm93IGZpZ3VyZSBvdXQgaG93IGluZGVudGVkIHRoZSBsaW5lIGlzIGluIGdlbmVyYWwuCisJICogSWYgdGhlIGJyYWNlIHdhcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdlIHVzZSB0aGF0OworCSAqIG90aGVyd2lzZSwgY2hlY2sgb3V0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZSBhcworCSAqIGEgd2hvbGUgYW5kIHRoZW4gYWRkIHRoZSAiaW1hZ2luYXJ5IGluZGVudCIgdG8gdGhhdC4KKwkgKi8KKwlsb29rID0gc2tpcHdoaXRlKHN0YXJ0KTsKKwlpZiAoKmxvb2sgPT0gJ3snKQorCXsKKwkgICAgZ2V0dmNvbChjdXJ3aW4sIHRyeXBvcywgJmNvbCwgTlVMTCwgTlVMTCk7CisJICAgIGFtb3VudCA9IGNvbDsKKwkgICAgaWYgKCpzdGFydCA9PSAneycpCisJCXN0YXJ0X2JyYWNlID0gQlJBQ0VfSU5fQ09MMDsKKwkgICAgZWxzZQorCQlzdGFydF9icmFjZSA9IEJSQUNFX0FUX1NUQVJUOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiB0aGF0IG9wZW5pbmcgYnJhY2UgbWlnaHQgaGF2ZSBiZWVuIG9uIGEgY29udGludWF0aW9uCisJICAgICAqIGxpbmUuICBpZiBzbywgZmluZCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisJICAgICAqLworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvdXJzY29wZTsKKworCSAgICAvKgorCSAgICAgKiBwb3NpdGlvbiB0aGUgY3Vyc29yIG92ZXIgdGhlIHJpZ2h0bW9zdCBwYXJlbiwgc28gdGhhdAorCSAgICAgKiBtYXRjaGluZyBpdCB3aWxsIHRha2UgdXMgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisJICAgICAqLworCSAgICBsbnVtID0gb3Vyc2NvcGU7CisJICAgIGlmIChmaW5kX2xhc3RfcGFyZW4oc3RhcnQsICcoJywgJyknKQorCQkgICAgJiYgKHRyeXBvcyA9IGZpbmRfbWF0Y2hfcGFyZW4oaW5kX21heHBhcmVuLAorCQkJCQkJICAgICBpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCWxudW0gPSB0cnlwb3MtPmxudW07CisKKwkgICAgLyoKKwkgICAgICogSXQgY291bGQgaGF2ZSBiZWVuIHNvbWV0aGluZyBsaWtlCisJICAgICAqCSAgIGNhc2UgMTogaWYgKGFzZGYgJiYKKwkgICAgICoJCQlsZGZkKSB7CisJICAgICAqCQkgICAgfQorCSAgICAgKi8KKwkgICAgaWYgKGluZF9rZWVwX2Nhc2VfbGFiZWwgJiYgY2luX2lzY2FzZShza2lwd2hpdGUobWxfZ2V0X2N1cmxpbmUoKSkpKQorCQlhbW91bnQgPSBnZXRfaW5kZW50KCk7CisJICAgIGVsc2UKKwkJYW1vdW50ID0gc2tpcF9sYWJlbChsbnVtLCAmbCwgaW5kX21heGNvbW1lbnQpOworCisJICAgIHN0YXJ0X2JyYWNlID0gQlJBQ0VfQVRfRU5EOworCX0KKworCS8qCisJICogaWYgd2UncmUgbG9va2luZyBhdCBhIGNsb3NpbmcgYnJhY2UsIHRoYXQncyB3aGVyZQorCSAqIHdlIHdhbnQgdG8gYmUuICBvdGhlcndpc2UsIGFkZCB0aGUgYW1vdW50IG9mIHJvb20KKwkgKiB0aGF0IGFuIGluZGVudCBpcyBzdXBwb3NlZCB0byBiZS4KKwkgKi8KKwlpZiAodGhlbGluZVswXSA9PSAnfScpCisJeworCSAgICAvKgorCSAgICAgKiB0aGV5IG1heSB3YW50IGNsb3NpbmcgYnJhY2VzIHRvIGxpbmUgdXAgd2l0aCBzb21ldGhpbmcKKwkgICAgICogb3RoZXIgdGhhbiB0aGUgb3BlbiBicmFjZS4gIGluZHVsZ2UgdGhlbSwgaWYgc28uCisJICAgICAqLworCSAgICBhbW91bnQgKz0gaW5kX2Nsb3NlX2V4dHJhOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJZiB3ZSdyZSBsb29raW5nIGF0IGFuICJlbHNlIiwgdHJ5IHRvIGZpbmQgYW4gImlmIgorCSAgICAgKiB0byBtYXRjaCBpdCB3aXRoLgorCSAgICAgKiBJZiB3ZSdyZSBsb29raW5nIGF0IGEgIndoaWxlIiwgdHJ5IHRvIGZpbmQgYSAiZG8iCisJICAgICAqIHRvIG1hdGNoIGl0IHdpdGguCisJICAgICAqLworCSAgICBsb29rZm9yID0gTE9PS0ZPUl9JTklUSUFMOworCSAgICBpZiAoY2luX2lzZWxzZSh0aGVsaW5lKSkKKwkJbG9va2ZvciA9IExPT0tGT1JfSUY7CisJICAgIGVsc2UgaWYgKGNpbl9pc3doaWxlb2Zkbyh0aGVsaW5lLCBjdXJfY3VycG9zLmxudW0sIGluZF9tYXhwYXJlbikpCisJCQkJCQkJCSAgICAvKiBYWFggKi8KKwkJbG9va2ZvciA9IExPT0tGT1JfRE87CisJICAgIGlmIChsb29rZm9yICE9IExPT0tGT1JfSU5JVElBTCkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJfY3VycG9zLmxudW07CisJCWlmIChmaW5kX21hdGNoKGxvb2tmb3IsIG91cnNjb3BlLCBpbmRfbWF4cGFyZW4sCisJCQkJCQkJaW5kX21heGNvbW1lbnQpID09IE9LKQorCQl7CisJCSAgICBhbW91bnQgPSBnZXRfaW5kZW50KCk7CS8qIFhYWCAqLworCQkgICAgZ290byB0aGVlbmQ7CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFdlIGdldCBoZXJlIGlmIHdlIGFyZSBub3Qgb24gYW4gIndoaWxlLW9mLWRvIiBvciAiZWxzZSIgKG9yCisJICAgICAqIGZhaWxlZCB0byBmaW5kIGEgbWF0Y2hpbmcgImlmIikuCisJICAgICAqIFNlYXJjaCBiYWNrd2FyZHMgZm9yIHNvbWV0aGluZyB0byBsaW5lIHVwIHdpdGguCisJICAgICAqIEZpcnN0IHNldCBhbW91bnQgZm9yIHdoZW4gd2UgZG9uJ3QgZmluZCBhbnl0aGluZy4KKwkgICAgICovCisKKwkgICAgLyoKKwkgICAgICogaWYgdGhlICd7JyBpcyAgX3JlYWxseV8gYXQgdGhlIGxlZnQgbWFyZ2luLCB1c2UgdGhlIGltYWdpbmFyeQorCSAgICAgKiBsb2NhdGlvbiBvZiBhIGxlZnQtbWFyZ2luIGJyYWNlLiAgT3RoZXJ3aXNlLCBjb3JyZWN0IHRoZQorCSAgICAgKiBsb2NhdGlvbiBmb3IgaW5kX29wZW5fZXh0cmEuCisJICAgICAqLworCisJICAgIGlmIChzdGFydF9icmFjZSA9PSBCUkFDRV9JTl9DT0wwKQkgICAgLyogJ3snIGlzIGluIGNvbHVtbiAwICovCisJICAgIHsKKwkJYW1vdW50ID0gaW5kX29wZW5fbGVmdF9pbWFnOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoc3RhcnRfYnJhY2UgPT0gQlJBQ0VfQVRfRU5EKSAgICAvKiAneycgaXMgYXQgZW5kIG9mIGxpbmUgKi8KKwkJICAgIGFtb3VudCArPSBpbmRfb3Blbl9pbWFnOworCQllbHNlCisJCXsKKwkJICAgIC8qIENvbXBlbnNhdGUgZm9yIGFkZGluZyBpbmRfb3Blbl9leHRyYSBsYXRlci4gKi8KKwkJICAgIGFtb3VudCAtPSBpbmRfb3Blbl9leHRyYTsKKwkJICAgIGlmIChhbW91bnQgPCAwKQorCQkJYW1vdW50ID0gMDsKKwkJfQorCSAgICB9CisKKwkgICAgbG9va2Zvcl9icmVhayA9IEZBTFNFOworCisJICAgIGlmIChjaW5faXNjYXNlKHRoZWxpbmUpKQkvKiBpdCdzIGEgc3dpdGNoKCkgbGFiZWwgKi8KKwkgICAgeworCQlsb29rZm9yID0gTE9PS0ZPUl9DQVNFOwkvKiBmaW5kIGEgcHJldmlvdXMgc3dpdGNoKCkgbGFiZWwgKi8KKwkJYW1vdW50ICs9IGluZF9jYXNlOworCSAgICB9CisJICAgIGVsc2UgaWYgKGNpbl9pc3Njb3BlZGVjbCh0aGVsaW5lKSkJLyogcHJpdmF0ZTosIC4uLiAqLworCSAgICB7CisJCWxvb2tmb3IgPSBMT09LRk9SX1NDT1BFREVDTDsJLyogY2xhc3MgZGVjbCBpcyB0aGlzIGJsb2NrICovCisJCWFtb3VudCArPSBpbmRfc2NvcGVkZWNsOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoaW5kX2Nhc2VfYnJlYWsgJiYgY2luX2lzYnJlYWsodGhlbGluZSkpCS8qIGJyZWFrOyAuLi4gKi8KKwkJICAgIGxvb2tmb3JfYnJlYWsgPSBUUlVFOworCisJCWxvb2tmb3IgPSBMT09LRk9SX0lOSVRJQUw7CisJCWFtb3VudCArPSBpbmRfbGV2ZWw7CS8qIGluZF9sZXZlbCBmcm9tIHN0YXJ0IG9mIGJsb2NrICovCisJICAgIH0KKwkgICAgc2NvcGVfYW1vdW50ID0gYW1vdW50OworCSAgICB3aGlsZWxldmVsID0gMDsKKworCSAgICAvKgorCSAgICAgKiBTZWFyY2ggYmFja3dhcmRzLiAgSWYgd2UgZmluZCBzb21ldGhpbmcgd2UgcmVjb2duaXplLCBsaW5lIHVwCisJICAgICAqIHdpdGggdGhhdC4KKwkgICAgICoKKwkgICAgICogaWYgd2UncmUgbG9va2luZyBhdCBhbiBvcGVuIGJyYWNlLCBpbmRlbnQKKwkgICAgICogdGhlIHVzdWFsIGFtb3VudCByZWxhdGl2ZSB0byB0aGUgY29uZGl0aW9uYWwKKwkgICAgICogdGhhdCBvcGVucyB0aGUgYmxvY2suCisJICAgICAqLworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gY3VyX2N1cnBvczsKKwkgICAgZm9yICg7OykKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0tLTsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCisJCS8qCisJCSAqIElmIHdlIHdlbnQgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgc3RhcnQgb2Ygb3VyIHNjb3BlLCBsaW5lCisJCSAqIHVwIHdpdGggaXQuCisJCSAqLworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDw9IG91cnNjb3BlKQorCQl7CisJCSAgICAvKiB3ZSByZWFjaGVkIGVuZCBvZiBzY29wZToKKwkJICAgICAqIGlmIGxvb2tpbmcgZm9yIGEgZW51bSBvciBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24KKwkJICAgICAqIGdvIGZ1cnRoZXIgYmFjazoKKwkJICAgICAqIGlmIGl0IGlzIGFuIGluaXRpYWxpemVyIChlbnVtIHh4eCBvciB4eHggPSksIHRoZW4KKwkJICAgICAqIGRvbid0IGFkZCBpbmRfY29udGludWF0aW9uLCBvdGhlcndpc2UgaXQgaXMgYSB2YXJpYWJsZQorCQkgICAgICogZGVjbGFyYXRpb246CisJCSAgICAgKiBpbnQgeCwKKwkJICAgICAqICAgICBoZXJlOyA8LS0gYWRkIGluZF9jb250aW51YXRpb24KKwkJICAgICAqLworCQkgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9FTlVNX09SX0lOSVQpCisJCSAgICB7CisJCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID09IDAKKwkJCQl8fCBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJCQkJCSAgICA8IG91cnNjb3BlIC0gaW5kX21heHBhcmVuKQorCQkJeworCQkJICAgIC8qIG5vdGhpbmcgZm91bmQgKGFidXNlIGluZF9tYXhwYXJlbiBhcyBsaW1pdCkKKwkJCSAgICAgKiBhc3N1bWUgdGVybWluYXRlZCBsaW5lIChpLmUuIGEgdmFyaWFibGUKKwkJCSAgICAgKiBpbml0aWFsaXphdGlvbikgKi8KKwkJCSAgICBpZiAoY29udF9hbW91bnQgPiAwKQorCQkJCWFtb3VudCA9IGNvbnRfYW1vdW50OworCQkJICAgIGVsc2UKKwkJCQlhbW91bnQgKz0gaW5kX2NvbnRpbnVhdGlvbjsKKwkJCSAgICBicmVhazsKKwkJCX0KKworCQkJbCA9IG1sX2dldF9jdXJsaW5lKCk7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSdyZSBpbiBhIGNvbW1lbnQgbm93LCBza2lwIHRvIHRoZSBzdGFydCBvZiB0aGUKKwkJCSAqIGNvbW1lbnQuCisJCQkgKi8KKwkJCXRyeXBvcyA9IGZpbmRfc3RhcnRfY29tbWVudChpbmRfbWF4Y29tbWVudCk7CisJCQlpZiAodHJ5cG9zICE9IE5VTEwpCisJCQl7CisJCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gdHJ5cG9zLT5sbnVtICsgMTsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNraXAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYW5kIGJsYW5rIGxpbmVzLgorCQkJICovCisJCQlpZiAoY2luX2lzcHJlcHJvY19jb250KCZsLCAmY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwkJCSAgICBjb250aW51ZTsKKworCQkJaWYgKGNpbl9ub2NvZGUobCkpCisJCQkgICAgY29udGludWU7CisKKwkJCXRlcm1pbmF0ZWQgPSBjaW5faXN0ZXJtaW5hdGVkKGwsIEZBTFNFLCBUUlVFKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBhdCB0b3AgbGV2ZWwgYW5kIHRoZSBsaW5lIGxvb2tzIGxpa2UgYQorCQkJICogZnVuY3Rpb24gZGVjbGFyYXRpb24sIHdlIGFyZSBkb25lCisJCQkgKiAoaXQncyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uKS4KKwkJCSAqLworCQkJaWYgKHN0YXJ0X2JyYWNlICE9IEJSQUNFX0lOX0NPTDAKKwkJCQl8fCAhY2luX2lzZnVuY2RlY2woJmwsIGN1cndpbi0+d19jdXJzb3IubG51bSkpCisJCQl7CisJCQkgICAgLyogaWYgdGhlIGxpbmUgaXMgdGVybWluYXRlZCB3aXRoIGFub3RoZXIgJywnCisJCQkgICAgICogaXQgaXMgYSBjb250aW51ZWQgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCisJCQkgICAgICogZG9uJ3QgYWRkIGV4dHJhIGluZGVudC4KKwkJCSAgICAgKiBUT0RPOiBkb2VzIG5vdCB3b3JrLCBpZiAgYSBmdW5jdGlvbgorCQkJICAgICAqIGRlY2xhcmF0aW9uIGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUgbGluZXM6CisJCQkgICAgICogY2luX2lzZnVuY2RlY2wgcmV0dXJucyBGQUxTRSB0aGVuLgorCQkJICAgICAqLworCQkJICAgIGlmICh0ZXJtaW5hdGVkID09ICcsJykKKwkJCQlicmVhazsKKworCQkJICAgIC8qIGlmIGl0IGVzIGEgZW51bSBkZWNsYXJhdGlvbiBvciBhbiBhc3NpZ25tZW50LAorCQkJICAgICAqIHdlIGFyZSBkb25lLgorCQkJICAgICAqLworCQkJICAgIGlmICh0ZXJtaW5hdGVkICE9ICc7JyAmJiBjaW5faXNpbml0KCkpCisJCQkJYnJlYWs7CisKKwkJCSAgICAvKiBub3RoaW5nIHVzZWZ1bCBmb3VuZCAqLworCQkJICAgIGlmICh0ZXJtaW5hdGVkID09IDAgfHwgdGVybWluYXRlZCA9PSAneycpCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh0ZXJtaW5hdGVkICE9ICc7JykKKwkJCXsKKwkJCSAgICAvKiBTa2lwIHBhcmVucyBhbmQgYnJhY2VzLiBQb3NpdGlvbiB0aGUgY3Vyc29yCisJCQkgICAgICogb3ZlciB0aGUgcmlnaHRtb3N0IHBhcmVuLCBzbyB0aGF0IG1hdGNoaW5nIGl0CisJCQkgICAgICogd2lsbCB0YWtlIHVzIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorCQkJICAgICAqLwkJCQkJLyogWFhYICovCisJCQkgICAgdHJ5cG9zID0gTlVMTDsKKwkJCSAgICBpZiAoZmluZF9sYXN0X3BhcmVuKGwsICcoJywgJyknKSkKKwkJCQl0cnlwb3MgPSBmaW5kX21hdGNoX3BhcmVuKGluZF9tYXhwYXJlbiwKKwkJCQkJaW5kX21heGNvbW1lbnQpOworCisJCQkgICAgaWYgKHRyeXBvcyA9PSBOVUxMICYmIGZpbmRfbGFzdF9wYXJlbihsLCAneycsICd9JykpCisJCQkJdHJ5cG9zID0gZmluZF9zdGFydF9icmFjZShpbmRfbWF4Y29tbWVudCk7CisKKwkJCSAgICBpZiAodHJ5cG9zICE9IE5VTEwpCisJCQkgICAgeworCQkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IHRyeXBvcy0+bG51bSArIDE7CisJCQkJY29udGludWU7CisJCQkgICAgfQorCQkJfQorCisJCQkvKiBpdCdzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIGFkZCBpbmRlbnRhdGlvbgorCQkJICogbGlrZSBpbgorCQkJICogaW50IGEsCisJCQkgKiAgICBiOworCQkJICovCisJCQlpZiAoY29udF9hbW91bnQgPiAwKQorCQkJICAgIGFtb3VudCA9IGNvbnRfYW1vdW50OworCQkJZWxzZQorCQkJICAgIGFtb3VudCArPSBpbmRfY29udGludWF0aW9uOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAobG9va2ZvciA9PSBMT09LRk9SX1VOVEVSTSkKKwkJICAgIHsKKwkJCWlmIChjb250X2Ftb3VudCA+IDApCisJCQkgICAgYW1vdW50ID0gY29udF9hbW91bnQ7CisJCQllbHNlCisJCQkgICAgYW1vdW50ICs9IGluZF9jb250aW51YXRpb247CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChsb29rZm9yICE9IExPT0tGT1JfVEVSTQorCQkJCQkgICYmIGxvb2tmb3IgIT0gTE9PS0ZPUl9DUFBfQkFTRUNMQVNTKQorCQkgICAgeworCQkJYW1vdW50ID0gc2NvcGVfYW1vdW50OworCQkJaWYgKHRoZWxpbmVbMF0gPT0gJ3snKQorCQkJICAgIGFtb3VudCArPSBpbmRfb3Blbl9leHRyYTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UncmUgaW4gYSBjb21tZW50IG5vdywgc2tpcCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbW1lbnQuCisJCSAqLwkJCQkJICAgIC8qIFhYWCAqLworCQlpZiAoKHRyeXBvcyA9IGZpbmRfc3RhcnRfY29tbWVudChpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCXsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHRyeXBvcy0+bG51bSArIDE7CisJCSAgICBjb250aW51ZTsKKwkJfQorCisJCWwgPSBtbF9nZXRfY3VybGluZSgpOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgYSBzd2l0Y2goKSBsYWJlbCwgbWF5IGxpbmUgdXAgcmVsYXRpdmUgdG8gdGhhdC4KKwkJICogaWYgdGhpcyBpcyBhIEMrKyBzY29wZSBkZWNsYXJhdGlvbiwgZG8gdGhlIHNhbWUuCisJCSAqLworCQlpc2Nhc2UgPSBjaW5faXNjYXNlKGwpOworCQlpZiAoaXNjYXNlIHx8IGNpbl9pc3Njb3BlZGVjbChsKSkKKwkJeworCQkgICAgLyogd2UgYXJlIG9ubHkgbG9va2luZyBmb3IgY3BwIGJhc2UgY2xhc3MKKwkJICAgICAqIGRlY2xhcmF0aW9uL2luaXRpYWxpemF0aW9uIGFueSBsb25nZXIgKi8KKwkJICAgIGlmIChsb29rZm9yID09IExPT0tGT1JfQ1BQX0JBU0VDTEFTUykKKwkJCWJyZWFrOworCisJCSAgICAvKiBXaGVuIGxvb2tpbmcgZm9yIGEgImRvIiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4KKwkJICAgICAqIGxhYmVscy4gKi8KKwkJICAgIGlmICh3aGlsZWxldmVsID4gMCkKKwkJCWNvbnRpbnVlOworCisJCSAgICAvKgorCQkgICAgICoJY2FzZSB4eDoKKwkJICAgICAqCSAgICBjID0gOTkgKwkgICAgPC0gdGhpcyBpbmRlbnQgcGx1cyBjb250aW51YXRpb24KKwkJICAgICAqLT4JICAgaGVyZTsKKwkJICAgICAqLworCQkgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9VTlRFUk0KKwkJCQkJICAgfHwgbG9va2ZvciA9PSBMT09LRk9SX0VOVU1fT1JfSU5JVCkKKwkJICAgIHsKKwkJCWlmIChjb250X2Ftb3VudCA+IDApCisJCQkgICAgYW1vdW50ID0gY29udF9hbW91bnQ7CisJCQllbHNlCisJCQkgICAgYW1vdW50ICs9IGluZF9jb250aW51YXRpb247CisJCQlicmVhazsKKwkJICAgIH0KKworCQkgICAgLyoKKwkJICAgICAqCWNhc2UgeHg6CTwtIGxpbmUgdXAgd2l0aCB0aGlzIGNhc2UKKwkJICAgICAqCSAgICB4ID0gMzMzOworCQkgICAgICoJY2FzZSB5eToKKwkJICAgICAqLworCQkgICAgaWYgKCAgICAgICAoaXNjYXNlICYmIGxvb2tmb3IgPT0gTE9PS0ZPUl9DQVNFKQorCQkJICAgIHx8IChpc2Nhc2UgJiYgbG9va2Zvcl9icmVhaykKKwkJCSAgICB8fCAoIWlzY2FzZSAmJiBsb29rZm9yID09IExPT0tGT1JfU0NPUEVERUNMKSkKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBDaGVjayB0aGF0IHRoaXMgY2FzZSBsYWJlbCBpcyBub3QgZm9yIGFub3RoZXIKKwkJCSAqIHN3aXRjaCgpCisJCQkgKi8JCQkJICAgIC8qIFhYWCAqLworCQkJaWYgKCh0cnlwb3MgPSBmaW5kX3N0YXJ0X2JyYWNlKGluZF9tYXhjb21tZW50KSkgPT0KKwkJCQkJICAgICBOVUxMIHx8IHRyeXBvcy0+bG51bSA9PSBvdXJzY29wZSkKKwkJCXsKKwkJCSAgICBhbW91bnQgPSBnZXRfaW5kZW50KCk7CS8qIFhYWCAqLworCQkJICAgIGJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCSAgICB9CisKKwkJICAgIG4gPSBnZXRfaW5kZW50X25vbGFiZWwoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsgIC8qIFhYWCAqLworCisJCSAgICAvKgorCQkgICAgICoJIGNhc2UgeHg6IGlmIChjb25kKQkgICAgPC0gbGluZSB1cCB3aXRoIHRoaXMgaWYKKwkJICAgICAqCQkgICAgICB5ID0geSArIDE7CisJCSAgICAgKiAtPgkgIHMgPSA5OTsKKwkJICAgICAqCisJCSAgICAgKgkgY2FzZSB4eDoKKwkJICAgICAqCSAgICAgaWYgKGNvbmQpCQk8LSBsaW5lIHVwIHdpdGggdGhpcyBsaW5lCisJCSAgICAgKgkJIHkgPSB5ICsgMTsKKwkJICAgICAqIC0+ICAgIHMgPSA5OTsKKwkJICAgICAqLworCQkgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9URVJNKQorCQkgICAgeworCQkJaWYgKG4pCisJCQkgICAgYW1vdW50ID0gbjsKKworCQkJaWYgKCFsb29rZm9yX2JyZWFrKQorCQkJICAgIGJyZWFrOworCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICoJIGNhc2UgeHg6IHggPSB4ICsgMTsJICAgIDwtIGxpbmUgdXAgd2l0aCB0aGlzIHgKKwkJICAgICAqIC0+CSAgeSA9IHkgKyAxOworCQkgICAgICoKKwkJICAgICAqCSBjYXNlIHh4OiBpZiAoY29uZCkJICAgIDwtIGxpbmUgdXAgd2l0aCB0aGlzIGlmCisJCSAgICAgKiAtPgkgICAgICAgeSA9IHkgKyAxOworCQkgICAgICovCisJCSAgICBpZiAobikKKwkJICAgIHsKKwkJCWFtb3VudCA9IG47CisJCQlsID0gYWZ0ZXJfbGFiZWwobWxfZ2V0X2N1cmxpbmUoKSk7CisJCQlpZiAobCAhPSBOVUxMICYmIGNpbl9pc19jaW53b3JkKGwpKQorCQkJICAgIGFtb3VudCArPSBpbmRfbGV2ZWwgKyBpbmRfbm9fYnJhY2U7CisJCQlicmVhazsKKwkJICAgIH0KKworCQkgICAgLyoKKwkJICAgICAqIFRyeSB0byBnZXQgdGhlIGluZGVudCBvZiBhIHN0YXRlbWVudCBiZWZvcmUgdGhlIHN3aXRjaAorCQkgICAgICogbGFiZWwuICBJZiBub3RoaW5nIGlzIGZvdW5kLCBsaW5lIHVwIHJlbGF0aXZlIHRvIHRoZQorCQkgICAgICogc3dpdGNoIGxhYmVsLgorCQkgICAgICoJICAgIGJyZWFrOwkJPC0gbWF5IGxpbmUgdXAgd2l0aCB0aGlzIGxpbmUKKwkJICAgICAqCSBjYXNlIHh4OgorCQkgICAgICogLT4gICB5ID0gMTsKKwkJICAgICAqLworCQkgICAgc2NvcGVfYW1vdW50ID0gZ2V0X2luZGVudCgpICsgKGlzY2FzZSAgICAvKiBYWFggKi8KKwkJCQkJPyBpbmRfY2FzZV9jb2RlIDogaW5kX3Njb3BlZGVjbF9jb2RlKTsKKwkJICAgIGxvb2tmb3IgPSBpbmRfY2FzZV9icmVhayA/IExPT0tGT1JfTk9CUkVBSyA6IExPT0tGT1JfQU5ZOworCQkgICAgY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBMb29raW5nIGZvciBhIHN3aXRjaCgpIGxhYmVsIG9yIEMrKyBzY29wZSBkZWNsYXJhdGlvbiwKKwkJICogaWdub3JlIG90aGVyIGxpbmVzLCBza2lwIHt9LWJsb2Nrcy4KKwkJICovCisJCWlmIChsb29rZm9yID09IExPT0tGT1JfQ0FTRSB8fCBsb29rZm9yID09IExPT0tGT1JfU0NPUEVERUNMKQorCQl7CisJCSAgICBpZiAoZmluZF9sYXN0X3BhcmVuKGwsICd7JywgJ30nKSAmJiAodHJ5cG9zID0KKwkJCQkgICAgZmluZF9zdGFydF9icmFjZShpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0cnlwb3MtPmxudW0gKyAxOworCQkgICAgY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJZ25vcmUganVtcCBsYWJlbHMgd2l0aCBub3RoaW5nIGFmdGVyIHRoZW0uCisJCSAqLworCQlpZiAoY2luX2lzbGFiZWwoaW5kX21heGNvbW1lbnQpKQorCQl7CisJCSAgICBsID0gYWZ0ZXJfbGFiZWwobWxfZ2V0X2N1cmxpbmUoKSk7CisJCSAgICBpZiAobCA9PSBOVUxMIHx8IGNpbl9ub2NvZGUobCkpCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIElnbm9yZSAjZGVmaW5lcywgI2lmLCBldGMuCisJCSAqIElnbm9yZSBjb21tZW50IGFuZCBlbXB0eSBsaW5lcy4KKwkJICogKG5lZWQgdG8gZ2V0IHRoZSBsaW5lIGFnYWluLCBjaW5faXNsYWJlbCgpIG1heSBoYXZlCisJCSAqIHVubG9ja2VkIGl0KQorCQkgKi8KKwkJbCA9IG1sX2dldF9jdXJsaW5lKCk7CisJCWlmIChjaW5faXNwcmVwcm9jX2NvbnQoJmwsICZjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJCQkJCQkJICAgICB8fCBjaW5fbm9jb2RlKGwpKQorCQkgICAgY29udGludWU7CisKKwkJLyoKKwkJICogQXJlIHdlIGF0IHRoZSBzdGFydCBvZiBhIGNwcCBiYXNlIGNsYXNzIGRlY2xhcmF0aW9uIG9yCisJCSAqIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uPworCQkgKi8JCQkJCQkgICAgLyogWFhYICovCisJCWlmIChsb29rZm9yICE9IExPT0tGT1JfVEVSTSAmJiBpbmRfY3BwX2Jhc2VjbGFzcworCQkJCQkgICAgICYmIGNpbl9pc19jcHBfYmFzZWNsYXNzKGwsICZjb2wpKQorCQl7CisJCSAgICBpZiAobG9va2ZvciA9PSBMT09LRk9SX1VOVEVSTSkKKwkJICAgIHsKKwkJCWlmIChjb250X2Ftb3VudCA+IDApCisJCQkgICAgYW1vdW50ID0gY29udF9hbW91bnQ7CisJCQllbHNlCisJCQkgICAgYW1vdW50ICs9IGluZF9jb250aW51YXRpb247CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChjb2wgPT0gMCB8fCB0aGVsaW5lWzBdID09ICd7JykKKwkJICAgIHsKKwkJCWFtb3VudCA9IGdldF9pbmRlbnQoKTsKKwkJCWlmIChmaW5kX2xhc3RfcGFyZW4obCwgJygnLCAnKScpCisJCQkJJiYgKHRyeXBvcyA9IGZpbmRfbWF0Y2hfcGFyZW4oaW5kX21heHBhcmVuLAorCQkJCQlpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCQkgICAgYW1vdW50ID0gZ2V0X2luZGVudF9sbnVtKHRyeXBvcy0+bG51bSk7IC8qIFhYWCAqLworCQkJaWYgKHRoZWxpbmVbMF0gIT0gJ3snKQorCQkJICAgIGFtb3VudCArPSBpbmRfY3BwX2Jhc2VjbGFzczsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWN1cndpbi0+d19jdXJzb3IuY29sID0gY29sOworCQkJZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmY29sLCBOVUxMLCBOVUxMKTsKKwkJCWFtb3VudCA9IChpbnQpY29sOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAobG9va2ZvciA9PSBMT09LRk9SX0NQUF9CQVNFQ0xBU1MpCisJCXsKKwkJICAgIC8qIG9ubHkgbG9vaywgd2hldGhlciB0aGVyZSBpcyBhIGNwcCBiYXNlIGNsYXNzCisJCSAgICAgKiBkZWNsYXJhdGlvbiBvciBpbml0aWFsaXphdGlvbiBiZWZvcmUgdGhlIG9wZW5pbmcgYnJhY2UuICovCisJCSAgICBpZiAoY2luX2lzdGVybWluYXRlZChsLCBUUlVFLCBGQUxTRSkpCisJCQlicmVhazsKKwkJICAgIGVsc2UKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB0aGUgbGluZSBiZWluZyB0ZXJtaW5hdGVkLgorCQkgKiBJZiB0ZXJtaW5hdGVkIHdpdGggYSAnLCcgb25seSBjb25zaWRlciBpdCB0ZXJtaW5hdGluZyBpZgorCQkgKiB0aGVyZSBpcyBhbm90ZXIgdW50ZXJtaW5hdGVkIHN0YXRlbWVudCBiZWhpbmQsIGVnOgorCQkgKiAgIDEyMywKKwkJICogICBzaXplb2YKKwkJICoJICBoZXJlCisJCSAqIE90aGVyd2lzZSBjaGVjayB3aGV0aGVyIGl0IGlzIGEgZW51bWVyYXRpb24gb3Igc3RydWN0dXJlCisJCSAqIGluaXRpYWxpc2F0aW9uIChub3QgaW5kZW50ZWQpIG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24KKwkJICogKGluZGVudGVkKS4KKwkJICovCisJCXRlcm1pbmF0ZWQgPSBjaW5faXN0ZXJtaW5hdGVkKGwsIEZBTFNFLCBUUlVFKTsKKworCQlpZiAodGVybWluYXRlZCA9PSAwIHx8IChsb29rZm9yICE9IExPT0tGT1JfVU5URVJNCisJCQkJCQkJJiYgdGVybWluYXRlZCA9PSAnLCcpKQorCQl7CisJCSAgICAvKgorCQkgICAgICogaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHBhcmVuIHRoaW5nLAorCQkgICAgICogZ28gYmFjayB0byB0aGUgbGluZSB0aGF0IHN0YXJ0cyBpdCBzbworCQkgICAgICogd2UgY2FuIGdldCB0aGUgcmlnaHQgcHJldmFpbGluZyBpbmRlbnQKKwkJICAgICAqCSAgIGlmICggZm9vICYmCisJCSAgICAgKgkJICAgIGJhciApCisJCSAgICAgKi8KKwkJICAgIC8qCisJCSAgICAgKiBwb3NpdGlvbiB0aGUgY3Vyc29yIG92ZXIgdGhlIHJpZ2h0bW9zdCBwYXJlbiwgc28gdGhhdAorCQkgICAgICogbWF0Y2hpbmcgaXQgd2lsbCB0YWtlIHVzIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorCQkgICAgICovCisJCSAgICAodm9pZClmaW5kX2xhc3RfcGFyZW4obCwgJygnLCAnKScpOworCQkgICAgdHJ5cG9zID0gZmluZF9tYXRjaF9wYXJlbigKKwkJCQkgY29ycl9pbmRfbWF4cGFyZW4oaW5kX21heHBhcmVuLCAmY3VyX2N1cnBvcyksCisJCQkJCQkJICAgICAgaW5kX21heGNvbW1lbnQpOworCisJCSAgICAvKgorCQkgICAgICogSWYgd2UgYXJlIGxvb2tpbmcgZm9yICcsJywgd2UgYWxzbyBsb29rIGZvciBtYXRjaGluZworCQkgICAgICogYnJhY2VzLgorCQkgICAgICovCisJCSAgICBpZiAodHJ5cG9zID09IE5VTEwgJiYgZmluZF9sYXN0X3BhcmVuKGwsICd7JywgJ30nKSkKKwkJCXRyeXBvcyA9IGZpbmRfc3RhcnRfYnJhY2UoaW5kX21heGNvbW1lbnQpOworCisJCSAgICBpZiAodHJ5cG9zICE9IE5VTEwpCisJCSAgICB7CisJCQkvKgorCQkJICogQ2hlY2sgaWYgd2UgYXJlIG9uIGEgY2FzZSBsYWJlbCBub3cuICBUaGlzIGlzCisJCQkgKiBoYW5kbGVkIGFib3ZlLgorCQkJICogICAgIGNhc2UgeHg6ICBpZiAoIGFzZGYgJiYKKwkJCSAqCQkJYXNkZikKKwkJCSAqLworCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gdHJ5cG9zLT5sbnVtOworCQkJbCA9IG1sX2dldF9jdXJsaW5lKCk7CisJCQlpZiAoY2luX2lzY2FzZShsKSB8fCBjaW5faXNzY29wZWRlY2wobCkpCisJCQl7CisJCQkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCQkgICAgY29udGludWU7CisJCQl9CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBTa2lwIG92ZXIgY29udGludWF0aW9uIGxpbmVzIHRvIGZpbmQgdGhlIG9uZSB0byBnZXQgdGhlCisJCSAgICAgKiBpbmRlbnQgZnJvbQorCQkgICAgICogY2hhciAqdXNldGhpcyA9ICJibGFcCisJCSAgICAgKgkJIGJsYSIsCisJCSAgICAgKiAgICAgIGhlcmU7CisJCSAgICAgKi8KKwkJICAgIGlmICh0ZXJtaW5hdGVkID09ICcsJykKKwkJICAgIHsKKwkJCXdoaWxlIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxKQorCQkJeworCQkJICAgIGwgPSBtbF9nZXQoY3Vyd2luLT53X2N1cnNvci5sbnVtIC0gMSk7CisJCQkgICAgaWYgKCpsID09IE5VTCB8fCBsW1NUUkxFTihsKSAtIDFdICE9ICdcXCcpCisJCQkJYnJlYWs7CisJCQkgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCQl9CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBHZXQgaW5kZW50IGFuZCBwb2ludGVyIHRvIHRleHQgZm9yIGN1cnJlbnQgbGluZSwKKwkJICAgICAqIGlnbm9yaW5nIGFueSBqdW1wIGxhYmVsLgkgICAgWFhYCisJCSAgICAgKi8KKwkJICAgIGN1cl9hbW91bnQgPSBza2lwX2xhYmVsKGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJCQkJCQkgICZsLCBpbmRfbWF4Y29tbWVudCk7CisKKwkJICAgIC8qCisJCSAgICAgKiBJZiB0aGlzIGlzIGp1c3QgYWJvdmUgdGhlIGxpbmUgd2UgYXJlIGluZGVudGluZywgYW5kIGl0CisJCSAgICAgKiBzdGFydHMgd2l0aCBhICd7JywgbGluZSBpdCB1cCB3aXRoIHRoaXMgbGluZS4KKwkJICAgICAqCQl3aGlsZSAobm90KQorCQkgICAgICogLT4JeworCQkgICAgICoJCX0KKwkJICAgICAqLworCQkgICAgaWYgKHRlcm1pbmF0ZWQgIT0gJywnICYmIGxvb2tmb3IgIT0gTE9PS0ZPUl9URVJNCisJCQkJCQkJICYmIHRoZWxpbmVbMF0gPT0gJ3snKQorCQkgICAgeworCQkJYW1vdW50ID0gY3VyX2Ftb3VudDsKKwkJCS8qCisJCQkgKiBPbmx5IGFkZCBpbmRfb3Blbl9leHRyYSB3aGVuIHRoZSBjdXJyZW50IGxpbmUKKwkJCSAqIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICd7Jywgd2hpY2ggbXVzdCBoYXZlIGEgbWF0Y2gKKwkJCSAqIGluIHRoZSBzYW1lIGxpbmUgKHNjb3BlIGlzIHRoZSBzYW1lKS4gIFByb2JhYmx5OgorCQkJICoJeyAxLCAyIH0sCisJCQkgKiAtPgl7IDMsIDQgfQorCQkJICovCisJCQlpZiAoKnNraXB3aGl0ZShsKSAhPSAneycpCisJCQkgICAgYW1vdW50ICs9IGluZF9vcGVuX2V4dHJhOworCisJCQlpZiAoaW5kX2NwcF9iYXNlY2xhc3MpCisJCQl7CisJCQkgICAgLyogaGF2ZSB0byBsb29rIGJhY2ssIHdoZXRoZXIgaXQgaXMgYSBjcHAgYmFzZQorCQkJICAgICAqIGNsYXNzIGRlY2xhcmF0aW9uIG9yIGluaXRpYWxpemF0aW9uICovCisJCQkgICAgbG9va2ZvciA9IExPT0tGT1JfQ1BQX0JBU0VDTEFTUzsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICogQ2hlY2sgaWYgd2UgYXJlIGFmdGVyIGFuICJpZiIsICJ3aGlsZSIsIGV0Yy4KKwkJICAgICAqIEFsc28gYWxsb3cgIiAgIH0gZWxzZSIuCisJCSAgICAgKi8KKwkJICAgIGlmIChjaW5faXNfY2lud29yZChsKSB8fCBjaW5faXNlbHNlKHNraXB3aGl0ZShsKSkpCisJCSAgICB7CisJCQkvKgorCQkJICogRm91bmQgYW4gdW50ZXJtaW5hdGVkIGxpbmUgYWZ0ZXIgYW4gaWYgKCksIGxpbmUgdXAKKwkJCSAqIHdpdGggdGhlIGxhc3Qgb25lLgorCQkJICogICBpZiAoY29uZCkKKwkJCSAqCSAgICAxMDAgKworCQkJICogLT4JCWhlcmU7CisJCQkgKi8KKwkJCWlmIChsb29rZm9yID09IExPT0tGT1JfVU5URVJNCisJCQkJCSAgIHx8IGxvb2tmb3IgPT0gTE9PS0ZPUl9FTlVNX09SX0lOSVQpCisJCQl7CisJCQkgICAgaWYgKGNvbnRfYW1vdW50ID4gMCkKKwkJCQlhbW91bnQgPSBjb250X2Ftb3VudDsKKwkJCSAgICBlbHNlCisJCQkJYW1vdW50ICs9IGluZF9jb250aW51YXRpb247CisJCQkgICAgYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIGp1c3QgYWJvdmUgdGhlIGxpbmUgd2UgYXJlIGluZGVudGluZywgd2UKKwkJCSAqIGFyZSBmaW5pc2hlZC4KKwkJCSAqCSAgICB3aGlsZSAobm90KQorCQkJICogLT4JCWhlcmU7CisJCQkgKiBPdGhlcndpc2UgdGhpcyBpbmRlbnQgY2FuIGJlIHVzZWQgd2hlbiB0aGUgbGluZQorCQkJICogYmVmb3JlIHRoaXMgaXMgdGVybWluYXRlZC4KKwkJCSAqCXl5eTsKKwkJCSAqCWlmIChzdGF0KQorCQkJICoJICAgIHdoaWxlIChub3QpCisJCQkgKgkJeHh4OworCQkJICogLT4JaGVyZTsKKwkJCSAqLworCQkJYW1vdW50ID0gY3VyX2Ftb3VudDsKKwkJCWlmICh0aGVsaW5lWzBdID09ICd7JykKKwkJCSAgICBhbW91bnQgKz0gaW5kX29wZW5fZXh0cmE7CisJCQlpZiAobG9va2ZvciAhPSBMT09LRk9SX1RFUk0pCisJCQl7CisJCQkgICAgYW1vdW50ICs9IGluZF9sZXZlbCArIGluZF9ub19icmFjZTsKKwkJCSAgICBicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNwZWNpYWwgdHJpY2s6IHdoZW4gZXhwZWN0aW5nIHRoZSB3aGlsZSAoKSBhZnRlciBhCisJCQkgKiBkbywgbGluZSB1cCB3aXRoIHRoZSB3aGlsZSgpCisJCQkgKiAgICAgZG8KKwkJCSAqCSAgICB4ID0gMTsKKwkJCSAqIC0+ICBoZXJlCisJCQkgKi8KKwkJCWwgPSBza2lwd2hpdGUobWxfZ2V0X2N1cmxpbmUoKSk7CisJCQlpZiAoY2luX2lzZG8obCkpCisJCQl7CisJCQkgICAgaWYgKHdoaWxlbGV2ZWwgPT0gMCkKKwkJCQlicmVhazsKKwkJCSAgICAtLXdoaWxlbGV2ZWw7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXaGVuIHNlYXJjaGluZyBmb3IgYSB0ZXJtaW5hdGVkIGxpbmUsIGRvbid0IHVzZSB0aGUKKwkJCSAqIG9uZSBiZXR3ZWVuIHRoZSAiaWYiIGFuZCB0aGUgImVsc2UiLgorCQkJICogTmVlZCB0byB1c2UgdGhlIHNjb3BlIG9mIHRoaXMgImVsc2UiLiAgWFhYCisJCQkgKiBJZiB3aGlsZWxldmVsICE9IDAgY29udGludWUgbG9va2luZyBmb3IgYSAiZG8geyIuCisJCQkgKi8KKwkJCWlmIChjaW5faXNlbHNlKGwpCisJCQkJJiYgd2hpbGVsZXZlbCA9PSAwCisJCQkJJiYgKCh0cnlwb3MgPSBmaW5kX3N0YXJ0X2JyYWNlKGluZF9tYXhjb21tZW50KSkKKwkJCQkJCQkJICAgID09IE5VTEwKKwkJCQkgICAgfHwgZmluZF9tYXRjaChMT09LRk9SX0lGLCB0cnlwb3MtPmxudW0sCisJCQkJCWluZF9tYXhwYXJlbiwgaW5kX21heGNvbW1lbnQpID09IEZBSUwpKQorCQkJICAgIGJyZWFrOworCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICogSWYgd2UncmUgYmVsb3cgYW4gdW50ZXJtaW5hdGVkIGxpbmUgdGhhdCBpcyBub3QgYW4KKwkJICAgICAqICJpZiIgb3Igc29tZXRoaW5nLCB3ZSBtYXkgbGluZSB1cCB3aXRoIHRoaXMgbGluZSBvcgorCQkgICAgICogYWRkIHNvbWV0aW5nIGZvciBhIGNvbnRpbnVhdGlvbiBsaW5lLCBkZXBlbmRpbmcgb24KKwkJICAgICAqIHRoZSBsaW5lIGJlZm9yZSB0aGlzIG9uZS4KKwkJICAgICAqLworCQkgICAgZWxzZQorCQkgICAgeworCQkJLyoKKwkJCSAqIEZvdW5kIHR3byB1bnRlcm1pbmF0ZWQgbGluZXMgb24gYSByb3csIGxpbmUgdXAgd2l0aAorCQkJICogdGhlIGxhc3Qgb25lLgorCQkJICogICBjID0gOTkgKworCQkJICoJICAgIDEwMCArCisJCQkgKiAtPgkgICAgaGVyZTsKKwkJCSAqLworCQkJaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9VTlRFUk0pCisJCQl7CisJCQkgICAgLyogV2hlbiBsaW5lIGVuZHMgaW4gYSBjb21tYSBhZGQgZXh0cmEgaW5kZW50ICovCisJCQkgICAgaWYgKHRlcm1pbmF0ZWQgPT0gJywnKQorCQkJCWFtb3VudCArPSBpbmRfY29udGludWF0aW9uOworCQkJICAgIGJyZWFrOworCQkJfQorCisJCQlpZiAobG9va2ZvciA9PSBMT09LRk9SX0VOVU1fT1JfSU5JVCkKKwkJCXsKKwkJCSAgICAvKiBGb3VuZCB0d28gbGluZXMgZW5kaW5nIGluICcsJywgbGluZXVwIHdpdGggdGhlCisJCQkgICAgICogbG93ZXN0IG9uZSwgYnV0IGNoZWNrIGZvciBjcHAgYmFzZSBjbGFzcworCQkJICAgICAqIGRlY2xhcmF0aW9uL2luaXRpYWxpemF0aW9uLCBpZiBpdCBpcyBhbgorCQkJICAgICAqIG9wZW5pbmcgYnJhY2Ugb3Igd2UgYXJlIGxvb2tpbmcganVzdCBmb3IKKwkJCSAgICAgKiBlbnVtZXJhdGlvbnMvaW5pdGlhbGl6YXRpb25zLiAqLworCQkJICAgIGlmICh0ZXJtaW5hdGVkID09ICcsJykKKwkJCSAgICB7CisJCQkJaWYgKGluZF9jcHBfYmFzZWNsYXNzID09IDApCisJCQkJICAgIGJyZWFrOworCisJCQkJbG9va2ZvciA9IExPT0tGT1JfQ1BQX0JBU0VDTEFTUzsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisKKwkJCSAgICAvKiBJZ25vcmUgdW50ZXJtaW5hdGVkIGxpbmVzIGluIGJldHdlZW4sIGJ1dAorCQkJICAgICAqIHJlZHVjZSBpbmRlbnQuICovCisJCQkgICAgaWYgKGFtb3VudCA+IGN1cl9hbW91bnQpCisJCQkJYW1vdW50ID0gY3VyX2Ftb3VudDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICAvKgorCQkJICAgICAqIEZvdW5kIGZpcnN0IHVudGVybWluYXRlZCBsaW5lIG9uIGEgcm93LCBtYXkKKwkJCSAgICAgKiBsaW5lIHVwIHdpdGggdGhpcyBsaW5lLCByZW1lbWJlciBpdHMgaW5kZW50CisJCQkgICAgICoJICAgIDEwMCArCisJCQkgICAgICogLT4JICAgIGhlcmU7CisJCQkgICAgICovCisJCQkgICAgYW1vdW50ID0gY3VyX2Ftb3VudDsKKworCQkJICAgIC8qCisJCQkgICAgICogSWYgcHJldmlvdXMgbGluZSBlbmRzIGluICcsJywgY2hlY2sgd2hldGhlciB3ZQorCQkJICAgICAqIGFyZSBpbiBhbiBpbml0aWFsaXphdGlvbiBvciBlbnVtCisJCQkgICAgICogc3RydWN0IHh4eCA9CisJCQkgICAgICogeworCQkJICAgICAqICAgICAgc2l6ZW9mIGEsCisJCQkgICAgICogICAgICAxMjQgfTsKKwkJCSAgICAgKiBvciBhIG5vcm1hbCBwb3NzaWJsZSBjb250aW51YXRpb24gbGluZS4KKwkJCSAgICAgKiBidXQgb25seSwgb2Ygbm8gb3RoZXIgc3RhdGVtZW50IGhhcyBiZWVuIGZvdW5kCisJCQkgICAgICogeWV0LgorCQkJICAgICAqLworCQkJICAgIGlmIChsb29rZm9yID09IExPT0tGT1JfSU5JVElBTCAmJiB0ZXJtaW5hdGVkID09ICcsJykKKwkJCSAgICB7CisJCQkJbG9va2ZvciA9IExPT0tGT1JfRU5VTV9PUl9JTklUOworCQkJCWNvbnRfYW1vdW50ID0gY2luX2ZpcnN0X2lkX2Ftb3VudCgpOworCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgeworCQkJCWlmIChsb29rZm9yID09IExPT0tGT1JfSU5JVElBTAorCQkJCQkmJiAqbCAhPSBOVUwKKwkJCQkJJiYgbFtTVFJMRU4obCkgLSAxXSA9PSAnXFwnKQorCQkJCQkJCQkvKiBYWFggKi8KKwkJCQkgICAgY29udF9hbW91bnQgPSBjaW5fZ2V0X2VxdWFsX2Ftb3VudCgKKwkJCQkJCSAgICAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCQkJCWlmIChsb29rZm9yICE9IExPT0tGT1JfVEVSTSkKKwkJCQkgICAgbG9va2ZvciA9IExPT0tGT1JfVU5URVJNOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGlmIHdlIGFyZSBhZnRlciBhIHdoaWxlIChjb25kKTsKKwkJICogSWYgc286IElnbm9yZSB1bnRpbCB0aGUgbWF0Y2hpbmcgImRvIi4KKwkJICovCisJCQkJCQkJLyogWFhYICovCisJCWVsc2UgaWYgKGNpbl9pc3doaWxlb2ZkbyhsLAorCQkJCQkgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBpbmRfbWF4cGFyZW4pKQorCQl7CisJCSAgICAvKgorCQkgICAgICogRm91bmQgYW4gdW50ZXJtaW5hdGVkIGxpbmUgYWZ0ZXIgYSB3aGlsZSAoKTssIGxpbmUgdXAKKwkJICAgICAqIHdpdGggdGhlIGxhc3Qgb25lLgorCQkgICAgICoJICAgIHdoaWxlIChjb25kKTsKKwkJICAgICAqCSAgICAxMDAgKwkJPC0gbGluZSB1cCB3aXRoIHRoaXMgb25lCisJCSAgICAgKiAtPgkgICAgaGVyZTsKKwkJICAgICAqLworCQkgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9VTlRFUk0KKwkJCQkJICAgfHwgbG9va2ZvciA9PSBMT09LRk9SX0VOVU1fT1JfSU5JVCkKKwkJICAgIHsKKwkJCWlmIChjb250X2Ftb3VudCA+IDApCisJCQkgICAgYW1vdW50ID0gY29udF9hbW91bnQ7CisJCQllbHNlCisJCQkgICAgYW1vdW50ICs9IGluZF9jb250aW51YXRpb247CisJCQlicmVhazsKKwkJICAgIH0KKworCQkgICAgaWYgKHdoaWxlbGV2ZWwgPT0gMCkKKwkJICAgIHsKKwkJCWxvb2tmb3IgPSBMT09LRk9SX1RFUk07CisJCQlhbW91bnQgPSBnZXRfaW5kZW50KCk7CSAgICAvKiBYWFggKi8KKwkJCWlmICh0aGVsaW5lWzBdID09ICd7JykKKwkJCSAgICBhbW91bnQgKz0gaW5kX29wZW5fZXh0cmE7CisJCSAgICB9CisJCSAgICArK3doaWxlbGV2ZWw7CisJCX0KKworCQkvKgorCQkgKiBXZSBhcmUgYWZ0ZXIgYSAibm9ybWFsIiBzdGF0ZW1lbnQuCisJCSAqIElmIHdlIGhhZCBhbm90aGVyIHN0YXRlbWVudCB3ZSBjYW4gc3RvcCBub3cgYW5kIHVzZSB0aGUKKwkJICogaW5kZW50IG9mIHRoYXQgb3RoZXIgc3RhdGVtZW50LgorCQkgKiBPdGhlcndpc2UgdGhlIGluZGVudCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQgbWF5IGJlIHVzZWQsCisJCSAqIHNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBuZXh0ICJub3JtYWwiIHN0YXRlbWVudC4KKwkJICovCisJCWVsc2UKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFNraXAgc2luZ2xlIGJyZWFrIGxpbmUsIGlmIGJlZm9yZSBhIHN3aXRjaCBsYWJlbC4gSXQKKwkJICAgICAqIG1heSBiZSBsaW5lZCB1cCB3aXRoIHRoZSBjYXNlIGxhYmVsLgorCQkgICAgICovCisJCSAgICBpZiAobG9va2ZvciA9PSBMT09LRk9SX05PQlJFQUsKKwkJCQkgICYmIGNpbl9pc2JyZWFrKHNraXB3aGl0ZShtbF9nZXRfY3VybGluZSgpKSkpCisJCSAgICB7CisJCQlsb29rZm9yID0gTE9PS0ZPUl9BTlk7CisJCQljb250aW51ZTsKKwkJICAgIH0KKworCQkgICAgLyoKKwkJICAgICAqIEhhbmRsZSAiZG8geyIgbGluZS4KKwkJICAgICAqLworCQkgICAgaWYgKHdoaWxlbGV2ZWwgPiAwKQorCQkgICAgeworCQkJbCA9IGNpbl9za2lwY29tbWVudChtbF9nZXRfY3VybGluZSgpKTsKKwkJCWlmIChjaW5faXNkbyhsKSkKKwkJCXsKKwkJCSAgICBhbW91bnQgPSBnZXRfaW5kZW50KCk7CS8qIFhYWCAqLworCQkJICAgIC0td2hpbGVsZXZlbDsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgLyoKKwkJICAgICAqIEZvdW5kIGEgdGVybWluYXRlZCBsaW5lIGFib3ZlIGFuIHVudGVybWluYXRlZCBsaW5lLiBBZGQKKwkJICAgICAqIHRoZSBhbW91bnQgZm9yIGEgY29udGludWF0aW9uIGxpbmUuCisJCSAgICAgKgkgeCA9IDE7CisJCSAgICAgKgkgeSA9IGZvbyArCisJCSAgICAgKiAtPgloZXJlOworCQkgICAgICogb3IKKwkJICAgICAqCSBpbnQgeCA9IDE7CisJCSAgICAgKgkgaW50IGZvbywKKwkJICAgICAqIC0+CWhlcmU7CisJCSAgICAgKi8KKwkJICAgIGlmIChsb29rZm9yID09IExPT0tGT1JfVU5URVJNCisJCQkJCSAgIHx8IGxvb2tmb3IgPT0gTE9PS0ZPUl9FTlVNX09SX0lOSVQpCisJCSAgICB7CisJCQlpZiAoY29udF9hbW91bnQgPiAwKQorCQkJICAgIGFtb3VudCA9IGNvbnRfYW1vdW50OworCQkJZWxzZQorCQkJICAgIGFtb3VudCArPSBpbmRfY29udGludWF0aW9uOworCQkJYnJlYWs7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBGb3VuZCBhIHRlcm1pbmF0ZWQgbGluZSBhYm92ZSBhIHRlcm1pbmF0ZWQgbGluZSBvciAiaWYiCisJCSAgICAgKiBldGMuIGxpbmUuIFVzZSB0aGUgYW1vdW50IG9mIHRoZSBsaW5lIGJlbG93IHVzLgorCQkgICAgICoJIHggPSAxOwkJCQl4ID0gMTsKKwkJICAgICAqCSBpZiAoYXNkZikJCSAgICB5ID0gMjsKKwkJICAgICAqCSAgICAgd2hpbGUgKGFzZGYpCSAgLT5oZXJlOworCQkgICAgICoJCWhlcmU7CisJCSAgICAgKiAtPmZvbzsKKwkJICAgICAqLworCQkgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9URVJNKQorCQkgICAgeworCQkJaWYgKCFsb29rZm9yX2JyZWFrICYmIHdoaWxlbGV2ZWwgPT0gMCkKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKworCQkgICAgLyoKKwkJICAgICAqIEZpcnN0IGxpbmUgYWJvdmUgdGhlIG9uZSB3ZSdyZSBpbmRlbnRpbmcgaXMgdGVybWluYXRlZC4KKwkJICAgICAqIFRvIGtub3cgd2hhdCBuZWVkcyB0byBiZSBkb25lIGxvb2sgZnVydGhlciBiYWNrd2FyZCBmb3IKKwkJICAgICAqIGEgdGVybWluYXRlZCBsaW5lLgorCQkgICAgICovCisJCSAgICBlbHNlCisJCSAgICB7CisJCQkvKgorCQkJICogcG9zaXRpb24gdGhlIGN1cnNvciBvdmVyIHRoZSByaWdodG1vc3QgcGFyZW4sIHNvCisJCQkgKiB0aGF0IG1hdGNoaW5nIGl0IHdpbGwgdGFrZSB1cyBiYWNrIHRvIHRoZSBzdGFydCBvZgorCQkJICogdGhlIGxpbmUuICBIZWxwcyBmb3I6CisJCQkgKiAgICAgZnVuYyhhc2RyLAorCQkJICoJICAgICAgYXNkZmFzZGYpOworCQkJICogICAgIGhlcmU7CisJCQkgKi8KK3Rlcm1fYWdhaW46CisJCQlsID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwkJCWlmIChmaW5kX2xhc3RfcGFyZW4obCwgJygnLCAnKScpCisJCQkJJiYgKHRyeXBvcyA9IGZpbmRfbWF0Y2hfcGFyZW4oaW5kX21heHBhcmVuLAorCQkJCQkJICAgICBpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCQl7CisJCQkgICAgLyoKKwkJCSAgICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gYSBjYXNlIGxhYmVsIG5vdy4gIFRoaXMgaXMKKwkJCSAgICAgKiBoYW5kbGVkIGFib3ZlLgorCQkJICAgICAqCSAgIGNhc2UgeHg6ICBpZiAoIGFzZGYgJiYKKwkJCSAgICAgKgkJCSAgICBhc2RmKQorCQkJICAgICAqLworCQkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHRyeXBvcy0+bG51bTsKKwkJCSAgICBsID0gbWxfZ2V0X2N1cmxpbmUoKTsKKwkJCSAgICBpZiAoY2luX2lzY2FzZShsKSB8fCBjaW5faXNzY29wZWRlY2wobCkpCisJCQkgICAgeworCQkJCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJCWNvbnRpbnVlOworCQkJICAgIH0KKwkJCX0KKworCQkJLyogV2hlbiBhbGlnbmluZyB3aXRoIHRoZSBjYXNlIHN0YXRlbWVudCwgZG9uJ3QgYWxpZ24KKwkJCSAqIHdpdGggYSBzdGF0ZW1lbnQgYWZ0ZXIgaXQuCisJCQkgKiAgY2FzZSAxOiB7ICAgPC0tIGRvbid0IHVzZSB0aGlzIHsgcG9zaXRpb24KKwkJCSAqCXN0YXQ7CisJCQkgKiAgfQorCQkJICogIGNhc2UgMjoKKwkJCSAqCXN0YXQ7CisJCQkgKiB9CisJCQkgKi8KKwkJCWlzY2FzZSA9IChpbmRfa2VlcF9jYXNlX2xhYmVsICYmIGNpbl9pc2Nhc2UobCkpOworCisJCQkvKgorCQkJICogR2V0IGluZGVudCBhbmQgcG9pbnRlciB0byB0ZXh0IGZvciBjdXJyZW50IGxpbmUsCisJCQkgKiBpZ25vcmluZyBhbnkganVtcCBsYWJlbC4KKwkJCSAqLworCQkJYW1vdW50ID0gc2tpcF9sYWJlbChjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJCQkJICAmbCwgaW5kX21heGNvbW1lbnQpOworCisJCQlpZiAodGhlbGluZVswXSA9PSAneycpCisJCQkgICAgYW1vdW50ICs9IGluZF9vcGVuX2V4dHJhOworCQkJLyogU2VlIHJlbWFyayBhYm92ZTogIk9ubHkgYWRkIGluZF9vcGVuX2V4dHJhLi4iICovCisJCQlpZiAoKnNraXB3aGl0ZShsKSA9PSAneycpCisJCQkgICAgYW1vdW50IC09IGluZF9vcGVuX2V4dHJhOworCQkJbG9va2ZvciA9IGlzY2FzZSA/IExPT0tGT1JfQU5ZIDogTE9PS0ZPUl9URVJNOworCisJCQkvKgorCQkJICogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiBhIGJsb2NrLCBza2lwIHRvIHRoZSBzdGFydCBvZgorCQkJICogdGhhdCBibG9jay4KKwkJCSAqLworCQkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCQkJaWYgKCpjaW5fc2tpcGNvbW1lbnQobCkgPT0gJ30nCisJCQkJJiYgKHRyeXBvcyA9IGZpbmRfc3RhcnRfYnJhY2UoaW5kX21heGNvbW1lbnQpKQorCQkJCQkJCSAgICAhPSBOVUxMKSAvKiBYWFggKi8KKwkJCXsKKwkJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0cnlwb3MtPmxudW07CisJCQkgICAgLyogaWYgbm90ICJlbHNlIHsiIGNoZWNrIGZvciB0ZXJtaW5hdGVkIGFnYWluICovCisJCQkgICAgLyogYnV0IHNraXAgYmxvY2sgZm9yICJ9IGVsc2UgeyIgKi8KKwkJCSAgICBsID0gY2luX3NraXBjb21tZW50KG1sX2dldF9jdXJsaW5lKCkpOworCQkJICAgIGlmICgqbCA9PSAnfScgfHwgIWNpbl9pc2Vsc2UobCkpCisJCQkJZ290byB0ZXJtX2FnYWluOworCQkJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICB9CisKKyAgICAgIC8qIGFkZCBleHRyYSBpbmRlbnQgZm9yIGEgY29tbWVudCAqLworICAgICAgaWYgKGNpbl9pc2NvbW1lbnQodGhlbGluZSkpCisJICBhbW91bnQgKz0gaW5kX2NvbW1lbnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBvayAtLSB3ZSdyZSBub3QgaW5zaWRlIGFueSBzb3J0IG9mIHN0cnVjdHVyZSBhdCBhbGwhCisgICAgICoKKyAgICAgKiB0aGlzIG1lYW5zIHdlJ3JlIGF0IHRoZSB0b3AgbGV2ZWwsIGFuZCBldmVyeXRoaW5nIHNob3VsZAorICAgICAqIGJhc2ljYWxseSBqdXN0IG1hdGNoIHdoZXJlIHRoZSBwcmV2aW91cyBsaW5lIGlzLCBleGNlcHQKKyAgICAgKiBmb3IgdGhlIGxpbmVzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLAorICAgICAqIHdoaWNoIGFyZSBLJlItc3R5bGUgcGFyYW1ldGVycyBhbmQgbmVlZCB0byBiZSBpbmRlbnRlZC4KKyAgICAgKi8KKyAgICBlbHNlCisgICAgeworCS8qCisJICogaWYgb3VyIGxpbmUgc3RhcnRzIHdpdGggYW4gb3BlbiBicmFjZSwgZm9yZ2V0IGFib3V0IGFueQorCSAqIHByZXZhaWxpbmcgaW5kZW50IGFuZCBtYWtlIHN1cmUgaXQgbG9va3MgbGlrZSB0aGUgc3RhcnQKKwkgKiBvZiBhIGZ1bmN0aW9uCisJICovCisKKwlpZiAodGhlbGluZVswXSA9PSAneycpCisJeworCSAgICBhbW91bnQgPSBpbmRfZmlyc3Rfb3BlbjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBORVhUIGxpbmUgaXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgdGhlIGN1cnJlbnQKKwkgKiBsaW5lIG5lZWRzIHRvIGJlIGluZGVudGVkIGFzIGEgZnVuY3Rpb24gdHlwZSBzcGVjLgorCSAqIERvbid0IGRvIHRoaXMgaWYgdGhlIGN1cnJlbnQgbGluZSBsb29rcyBsaWtlIGEgY29tbWVudAorCSAqIG9yIGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgdGVybWluYXRlZCwgaWUuIGVuZHMgaW4gJzsnLgorCSAqLworCWVsc2UgaWYgKGN1cl9jdXJwb3MubG51bSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50CisJCSYmICFjaW5fbm9jb2RlKHRoZWxpbmUpCisJCSYmICFjaW5fZW5kc19pbih0aGVsaW5lLCAoY2hhcl91ICopIjoiLCBOVUxMKQorCQkmJiAhY2luX2VuZHNfaW4odGhlbGluZSwgKGNoYXJfdSAqKSIsIiwgTlVMTCkKKwkJJiYgY2luX2lzZnVuY2RlY2woTlVMTCwgY3VyX2N1cnBvcy5sbnVtICsgMSkKKwkJJiYgIWNpbl9pc3Rlcm1pbmF0ZWQodGhlbGluZSwgRkFMU0UsIFRSVUUpKQorCXsKKwkgICAgYW1vdW50ID0gaW5kX2Z1bmNfdHlwZTsKKwl9CisJZWxzZQorCXsKKwkgICAgYW1vdW50ID0gMDsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cl9jdXJwb3M7CisKKwkgICAgLyogc2VhcmNoIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZyB3ZSByZWNvZ25pemUgKi8KKworCSAgICB3aGlsZSAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gMSkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0tLTsKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCisJCWwgPSBtbF9nZXRfY3VybGluZSgpOworCisJCS8qCisJCSAqIElmIHdlJ3JlIGluIGEgY29tbWVudCBub3csIHNraXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb21tZW50LgorCQkgKi8JCQkJCQkvKiBYWFggKi8KKwkJaWYgKCh0cnlwb3MgPSBmaW5kX3N0YXJ0X2NvbW1lbnQoaW5kX21heGNvbW1lbnQpKSAhPSBOVUxMKQorCQl7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0cnlwb3MtPmxudW0gKyAxOworCQkgICAgY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBcmUgd2UgYXQgdGhlIHN0YXJ0IG9mIGEgY3BwIGJhc2UgY2xhc3MgZGVjbGFyYXRpb24gb3IgY29uc3RydWN0b3IKKwkJICogaW5pdGlhbGl6YXRpb24/CisJCSAqLwkJCQkJCSAgICAvKiBYWFggKi8KKwkJaWYgKGluZF9jcHBfYmFzZWNsYXNzICE9IDAgJiYgdGhlbGluZVswXSAhPSAneycKKwkJCQkJICAgICAmJiBjaW5faXNfY3BwX2Jhc2VjbGFzcyhsLCAmY29sKSkKKwkJeworCQkgICAgaWYgKGNvbCA9PSAwKQorCQkgICAgeworCQkJYW1vdW50ID0gZ2V0X2luZGVudCgpICsgaW5kX2NwcF9iYXNlY2xhc3M7ICAvKiBYWFggKi8KKwkJCWlmIChmaW5kX2xhc3RfcGFyZW4obCwgJygnLCAnKScpCisJCQkJJiYgKHRyeXBvcyA9IGZpbmRfbWF0Y2hfcGFyZW4oaW5kX21heHBhcmVuLAorCQkJCQlpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCQkgICAgYW1vdW50ID0gZ2V0X2luZGVudF9sbnVtKHRyeXBvcy0+bG51bSkKKwkJCQkJICAgKyBpbmRfY3BwX2Jhc2VjbGFzczsJICAgIC8qIFhYWCAqLworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBjb2w7CisJCQlnZXR2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZjb2wsIE5VTEwsIE5VTEwpOworCQkJYW1vdW50ID0gKGludCljb2w7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFNraXAgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYW5kIGJsYW5rIGxpbmVzLgorCQkgKi8KKwkJaWYgKGNpbl9pc3ByZXByb2NfY29udCgmbCwgJmN1cndpbi0+d19jdXJzb3IubG51bSkpCisJCSAgICBjb250aW51ZTsKKworCQlpZiAoY2luX25vY29kZShsKSkKKwkJICAgIGNvbnRpbnVlOworCisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91cyBsaW5lIGVuZHMgaW4gJywnLCB1c2Ugb25lIGxldmVsIG9mCisJCSAqIGluZGVudGF0aW9uOgorCQkgKiBpbnQgZm9vLAorCQkgKiAgICAgYmFyOworCQkgKiBkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBmb3IgJ30nIGluIGNhc2Ugb2YgZWcuCisJCSAqIGVudW0gZm9vYmFyCisJCSAqIHsKKwkJICogICAuLi4KKwkJICogfSBmb28sCisJCSAqICAgYmFyOworCQkgKi8KKwkJbiA9IDA7CisJCWlmIChjaW5fZW5kc19pbihsLCAoY2hhcl91ICopIiwiLCBOVUxMKQorCQkJICAgICB8fCAoKmwgIT0gTlVMICYmIChuID0gbFtTVFJMRU4obCkgLSAxXSkgPT0gJ1xcJykpCisJCXsKKwkJICAgIC8qIHRha2UgdXMgYmFjayB0byBvcGVuaW5nIHBhcmVuICovCisJCSAgICBpZiAoZmluZF9sYXN0X3BhcmVuKGwsICcoJywgJyknKQorCQkJICAgICYmICh0cnlwb3MgPSBmaW5kX21hdGNoX3BhcmVuKGluZF9tYXhwYXJlbiwKKwkJCQkJCSAgICAgaW5kX21heGNvbW1lbnQpKSAhPSBOVUxMKQorCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gdHJ5cG9zLT5sbnVtOworCisJCSAgICAvKiBGb3IgYSBsaW5lIGVuZGluZyBpbiAnLCcgdGhhdCBpcyBhIGNvbnRpbnVhdGlvbiBsaW5lIGdvCisJCSAgICAgKiBiYWNrIHRvIHRoZSBmaXJzdCBsaW5lIHdpdGggYSBiYWNrc2xhc2g6CisJCSAgICAgKiBjaGFyICpmb28gPSAiYmxhXAorCQkgICAgICoJCSBibGEiLAorCQkgICAgICogICAgICBoZXJlOworCQkgICAgICovCisJCSAgICB3aGlsZSAobiA9PSAwICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisJCSAgICB7CisJCQlsID0gbWxfZ2V0KGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpOworCQkJaWYgKCpsID09IE5VTCB8fCBsW1NUUkxFTihsKSAtIDFdICE9ICdcXCcpCisJCQkgICAgYnJlYWs7CisJCQktLWN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJICAgIH0KKworCQkgICAgYW1vdW50ID0gZ2V0X2luZGVudCgpOwkgICAgLyogWFhYICovCisKKwkJICAgIGlmIChhbW91bnQgPT0gMCkKKwkJCWFtb3VudCA9IGNpbl9maXJzdF9pZF9hbW91bnQoKTsKKwkJICAgIGlmIChhbW91bnQgPT0gMCkKKwkJCWFtb3VudCA9IGluZF9jb250aW51YXRpb247CisJCSAgICBicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBsaW5lIGxvb2tzIGxpa2UgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgYW5kIHdlJ3JlCisJCSAqIG5vdCBpbiBhIGNvbW1lbnQsIHB1dCBpdCB0aGUgbGVmdCBtYXJnaW4uCisJCSAqLworCQlpZiAoY2luX2lzZnVuY2RlY2woTlVMTCwgY3VyX2N1cnBvcy5sbnVtKSkgIC8qIFhYWCAqLworCQkgICAgYnJlYWs7CisJCWwgPSBtbF9nZXRfY3VybGluZSgpOworCisJCS8qCisJCSAqIEZpbmRpbmcgdGhlIGNsb3NpbmcgJ30nIG9mIGEgcHJldmlvdXMgZnVuY3Rpb24uICBQdXQKKwkJICogY3VycmVudCBsaW5lIGF0IHRoZSBsZWZ0IG1hcmdpbi4gIEZvciB3aGVuICdjaW5vJyBoYXMgImZzIi4KKwkJICovCisJCWlmICgqc2tpcHdoaXRlKGwpID09ICd9JykKKwkJICAgIGJyZWFrOworCisJCS8qCQkJICAgIChtYXRjaGluZyB7KQorCQkgKiBJZiB0aGUgcHJldmlvdXMgbGluZSBlbmRzIG9uICd9OycgKG1heWJlIGZvbGxvd2VkIGJ5CisJCSAqIGNvbW1lbnRzKSBhbGlnbiBhdCBjb2x1bW4gMC4gIEZvciBleGFtcGxlOgorCQkgKiBjaGFyICpzdHJpbmdfYXJyYXlbXSA9IHsgImZvbyIsCisJCSAqICAgICAvICogeCAqIC8gImJ9O2FyIiB9OyAvICogZm9vYmFyICogLworCQkgKi8KKwkJaWYgKGNpbl9lbmRzX2luKGwsIChjaGFyX3UgKikifTsiLCBOVUxMKSkKKwkJICAgIGJyZWFrOworCisJCS8qCisJCSAqIElmIHRoZSBQUkVWSU9VUyBsaW5lIGlzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHRoZSBjdXJyZW50CisJCSAqIGxpbmUgKGFuZCB0aGUgb25lcyB0aGF0IGZvbGxvdykgbmVlZHMgdG8gYmUgaW5kZW50ZWQgYXMKKwkJICogcGFyYW1ldGVycy4KKwkJICovCisJCWlmIChjaW5faXNmdW5jZGVjbCgmbCwgY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwkJeworCQkgICAgYW1vdW50ID0gaW5kX3BhcmFtOworCQkgICAgYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgcHJldmlvdXMgbGluZSBlbmRzIGluICc7JyBhbmQgdGhlIGxpbmUgYmVmb3JlIHRoZQorCQkgKiBwcmV2aW91cyBsaW5lIGVuZHMgaW4gJywnIG9yICdcJywgaWRlbnQgdG8gY29sdW1uIHplcm86CisJCSAqIGludCBmb28sCisJCSAqICAgICBiYXI7CisJCSAqIGluZGVudF90b18wIGhlcmU7CisJCSAqLworCQlpZiAoY2luX2VuZHNfaW4obCwgKGNoYXJfdSopIjsiLCBOVUxMKSkKKwkJeworCQkgICAgbCA9IG1sX2dldChjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSAxKTsKKwkJICAgIGlmIChjaW5fZW5kc19pbihsLCAoY2hhcl91ICopIiwiLCBOVUxMKQorCQkJICAgIHx8ICgqbCAhPSBOVUwgJiYgbFtTVFJMRU4obCkgLSAxXSA9PSAnXFwnKSkKKwkJCWJyZWFrOworCQkgICAgbCA9IG1sX2dldF9jdXJsaW5lKCk7CisJCX0KKworCQkvKgorCQkgKiBEb2Vzbid0IGxvb2sgbGlrZSBhbnl0aGluZyBpbnRlcmVzdGluZyAtLSBzbyBqdXN0CisJCSAqIHVzZSB0aGUgaW5kZW50IG9mIHRoaXMgbGluZS4KKwkJICoKKwkJICogUG9zaXRpb24gdGhlIGN1cnNvciBvdmVyIHRoZSByaWdodG1vc3QgcGFyZW4sIHNvIHRoYXQKKwkJICogbWF0Y2hpbmcgaXQgd2lsbCB0YWtlIHVzIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorCQkgKi8KKwkJZmluZF9sYXN0X3BhcmVuKGwsICcoJywgJyknKTsKKworCQlpZiAoKHRyeXBvcyA9IGZpbmRfbWF0Y2hfcGFyZW4oaW5kX21heHBhcmVuLAorCQkJCQkJICAgICBpbmRfbWF4Y29tbWVudCkpICE9IE5VTEwpCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0cnlwb3MtPmxudW07CisJCWFtb3VudCA9IGdldF9pbmRlbnQoKTsJICAgIC8qIFhYWCAqLworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIGFkZCBleHRyYSBpbmRlbnQgZm9yIGEgY29tbWVudCAqLworCSAgICBpZiAoY2luX2lzY29tbWVudCh0aGVsaW5lKSkKKwkJYW1vdW50ICs9IGluZF9jb21tZW50OworCisJICAgIC8qIGFkZCBleHRyYSBpbmRlbnQgaWYgdGhlIHByZXZpb3VzIGxpbmUgZW5kZWQgaW4gYSBiYWNrc2xhc2g6CisJICAgICAqCSAgICAgICJhc2RmYXNkZlwKKwkgICAgICoJCSAgaGVyZSI7CisJICAgICAqCSAgICBjaGFyICpmb28gPSAiYXNkZlwKKwkgICAgICoJCQkgaGVyZSI7CisJICAgICAqLworCSAgICBpZiAoY3VyX2N1cnBvcy5sbnVtID4gMSkKKwkgICAgeworCQlsID0gbWxfZ2V0KGN1cl9jdXJwb3MubG51bSAtIDEpOworCQlpZiAoKmwgIT0gTlVMICYmIGxbU1RSTEVOKGwpIC0gMV0gPT0gJ1xcJykKKwkJeworCQkgICAgY3VyX2Ftb3VudCA9IGNpbl9nZXRfZXF1YWxfYW1vdW50KGN1cl9jdXJwb3MubG51bSAtIDEpOworCQkgICAgaWYgKGN1cl9hbW91bnQgPiAwKQorCQkJYW1vdW50ID0gY3VyX2Ftb3VudDsKKwkJICAgIGVsc2UgaWYgKGN1cl9hbW91bnQgPT0gMCkKKwkJCWFtb3VudCArPSBpbmRfY29udGludWF0aW9uOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCit0aGVlbmQ6CisgICAgLyogcHV0IHRoZSBjdXJzb3IgYmFjayB3aGVyZSBpdCBiZWxvbmdzICovCisgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cl9jdXJwb3M7CisKKyAgICB2aW1fZnJlZShsaW5lY29weSk7CisKKyAgICBpZiAoYW1vdW50IDwgMCkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gYW1vdW50OworfQorCisgICAgc3RhdGljIGludAorZmluZF9tYXRjaChsb29rZm9yLCBvdXJzY29wZSwgaW5kX21heHBhcmVuLCBpbmRfbWF4Y29tbWVudCkKKyAgICBpbnQJCWxvb2tmb3I7CisgICAgbGluZW5yX1QJb3Vyc2NvcGU7CisgICAgaW50CQlpbmRfbWF4cGFyZW47CisgICAgaW50CQlpbmRfbWF4Y29tbWVudDsKK3sKKyAgICBjaGFyX3UJKmxvb2s7CisgICAgcG9zX1QJKnRoZWlyc2NvcGU7CisgICAgY2hhcl91CSptaWdodGJlaWY7CisgICAgaW50CQllbHNlbGV2ZWw7CisgICAgaW50CQl3aGlsZWxldmVsOworCisgICAgaWYgKGxvb2tmb3IgPT0gTE9PS0ZPUl9JRikKKyAgICB7CisJZWxzZWxldmVsID0gMTsKKwl3aGlsZWxldmVsID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwllbHNlbGV2ZWwgPSAwOworCXdoaWxlbGV2ZWwgPSAxOworICAgIH0KKworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKworICAgIHdoaWxlIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiBvdXJzY29wZSArIDEpCisgICAgeworCWN1cndpbi0+d19jdXJzb3IubG51bS0tOworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKworCWxvb2sgPSBjaW5fc2tpcGNvbW1lbnQobWxfZ2V0X2N1cmxpbmUoKSk7CisJaWYgKGNpbl9pc2Vsc2UobG9vaykKKwkJfHwgY2luX2lzaWYobG9vaykKKwkJfHwgY2luX2lzZG8obG9vaykJCQkgICAgLyogWFhYICovCisJCXx8IGNpbl9pc3doaWxlb2Zkbyhsb29rLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGluZF9tYXhwYXJlbikpCisJeworCSAgICAvKgorCSAgICAgKiBpZiB3ZSd2ZSBnb25lIG91dHNpZGUgdGhlIGJyYWNlcyBlbnRpcmVseSwKKwkgICAgICogd2UgbXVzdCBiZSBvdXQgb2Ygc2NvcGUuLi4KKwkgICAgICovCisJICAgIHRoZWlyc2NvcGUgPSBmaW5kX3N0YXJ0X2JyYWNlKGluZF9tYXhjb21tZW50KTsgIC8qIFhYWCAqLworCSAgICBpZiAodGhlaXJzY29wZSA9PSBOVUxMKQorCQlicmVhazsKKworCSAgICAvKgorCSAgICAgKiBhbmQgaWYgdGhlIGJyYWNlIGVuY2xvc2luZyB0aGlzIGlzIGZ1cnRoZXIKKwkgICAgICogYmFjayB0aGFuIHRoZSBvbmUgZW5jbG9zaW5nIHRoZSBlbHNlLCB3ZSdyZQorCSAgICAgKiBvdXQgb2YgbHVjayB0b28uCisJICAgICAqLworCSAgICBpZiAodGhlaXJzY29wZS0+bG51bSA8IG91cnNjb3BlKQorCQlicmVhazsKKworCSAgICAvKgorCSAgICAgKiBhbmQgaWYgdGhleSdyZSBlbmNsb3NlZCBpbiBhICpkZWVwZXIqIGJyYWNlLAorCSAgICAgKiB0aGVuIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSBpdCdzIGluIGEKKwkgICAgICogZGlmZmVyZW50IHNjb3BlLi4uCisJICAgICAqLworCSAgICBpZiAodGhlaXJzY29wZS0+bG51bSA+IG91cnNjb3BlKQorCQljb250aW51ZTsKKworCSAgICAvKgorCSAgICAgKiBpZiBpdCB3YXMgYW4gImVsc2UiICh0aGF0J3Mgbm90IGFuICJlbHNlIGlmIikKKwkgICAgICogdGhlbiB3ZSBuZWVkIHRvIGdvIGJhY2sgdG8gYW5vdGhlciBpZiwgc28KKwkgICAgICogaW5jcmVtZW50IGVsc2VsZXZlbAorCSAgICAgKi8KKwkgICAgbG9vayA9IGNpbl9za2lwY29tbWVudChtbF9nZXRfY3VybGluZSgpKTsKKwkgICAgaWYgKGNpbl9pc2Vsc2UobG9vaykpCisJICAgIHsKKwkJbWlnaHRiZWlmID0gY2luX3NraXBjb21tZW50KGxvb2sgKyA0KTsKKwkJaWYgKCFjaW5faXNpZihtaWdodGJlaWYpKQorCQkgICAgKytlbHNlbGV2ZWw7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogaWYgaXQgd2FzIGEgIndoaWxlIiB0aGVuIHdlIG5lZWQgdG8gZ28gYmFjayB0bworCSAgICAgKiBhbm90aGVyICJkbyIsIHNvIGluY3JlbWVudCB3aGlsZWxldmVsLiAgWFhYCisJICAgICAqLworCSAgICBpZiAoY2luX2lzd2hpbGVvZmRvKGxvb2ssIGN1cndpbi0+d19jdXJzb3IubG51bSwgaW5kX21heHBhcmVuKSkKKwkgICAgeworCQkrK3doaWxlbGV2ZWw7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgLyogSWYgaXQncyBhbiAiaWYiIGRlY3JlbWVudCBlbHNlbGV2ZWwgKi8KKwkgICAgbG9vayA9IGNpbl9za2lwY29tbWVudChtbF9nZXRfY3VybGluZSgpKTsKKwkgICAgaWYgKGNpbl9pc2lmKGxvb2spKQorCSAgICB7CisJCWVsc2VsZXZlbC0tOworCQkvKgorCQkgKiBXaGVuIGxvb2tpbmcgZm9yIGFuICJpZiIgaWdub3JlICJ3aGlsZSJzIHRoYXQKKwkJICogZ2V0IGluIHRoZSB3YXkuCisJCSAqLworCQlpZiAoZWxzZWxldmVsID09IDAgJiYgbG9va2ZvciA9PSBMT09LRk9SX0lGKQorCQkgICAgd2hpbGVsZXZlbCA9IDA7CisJICAgIH0KKworCSAgICAvKiBJZiBpdCdzIGEgImRvIiBkZWNyZW1lbnQgd2hpbGVsZXZlbCAqLworCSAgICBpZiAoY2luX2lzZG8obG9vaykpCisJCXdoaWxlbGV2ZWwtLTsKKworCSAgICAvKgorCSAgICAgKiBpZiB3ZSd2ZSB1c2VkIHVwIGFsbCB0aGUgZWxzZXMsIHRoZW4KKwkgICAgICogdGhpcyBtdXN0IGJlIHRoZSBpZiB0aGF0IHdlIHdhbnQhCisJICAgICAqIG1hdGNoIHRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhhdCBpZi4KKwkgICAgICovCisJICAgIGlmIChlbHNlbGV2ZWwgPD0gMCAmJiB3aGlsZWxldmVsIDw9IDApCisJICAgIHsKKwkJcmV0dXJuIE9LOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gRkFJTDsKK30KKworIyBpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBHZXQgaW5kZW50IGxldmVsIGZyb20gJ2luZGVudGV4cHInLgorICovCisgICAgaW50CitnZXRfZXhwcl9pbmRlbnQoKQoreworICAgIGludAkJaW5kZW50OworICAgIHBvc19UCXBvczsKKyAgICBpbnQJCXNhdmVfU3RhdGU7CisKKyAgICBwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIHNldF92aW1fdmFyX25yKFZWX0xOVU0sIGN1cndpbi0+d19jdXJzb3IubG51bSk7CisgICAgKytzYW5kYm94OworICAgIGluZGVudCA9IGV2YWxfdG9fbnVtYmVyKGN1cmJ1Zi0+Yl9wX2luZGUpOworICAgIC0tc2FuZGJveDsKKworICAgIC8qIFJlc3RvcmUgdGhlIGN1cnNvciBwb3NpdGlvbiBzbyB0aGF0ICdpbmRlbnRleHByJyBkb2Vzbid0IG5lZWQgdG8uCisgICAgICogUHJldGVuZCB0byBiZSBpbiBJbnNlcnQgbW9kZSwgYWxsb3cgY3Vyc29yIHBhc3QgZW5kIG9mIGxpbmUgZm9yICJvIgorICAgICAqIGNvbW1hbmQuICovCisgICAgc2F2ZV9TdGF0ZSA9IFN0YXRlOworICAgIFN0YXRlID0gSU5TRVJUOworICAgIGN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisgICAgY2hlY2tfY3Vyc29yKCk7CisgICAgU3RhdGUgPSBzYXZlX1N0YXRlOworCisgICAgLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGp1c3Qga2VlcCB0aGUgY3VycmVudCBpbmRlbnQuICovCisgICAgaWYgKGluZGVudCA8IDApCisJaW5kZW50ID0gZ2V0X2luZGVudCgpOworCisgICAgcmV0dXJuIGluZGVudDsKK30KKyMgZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfQ0lOREVOVCAqLworCisjaWYgZGVmaW5lZChGRUFUX0xJU1ApIHx8IGRlZmluZWQoUFJPVE8pCisKK3N0YXRpYyBpbnQgbGlzcF9tYXRjaCBfX0FSR1MoKGNoYXJfdSAqcCkpOworCisgICAgc3RhdGljIGludAorbGlzcF9tYXRjaChwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBjaGFyX3UJYnVmW0xTSVpFXTsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJKndvcmQgPSBwX2xpc3B3b3JkczsKKworICAgIHdoaWxlICgqd29yZCAhPSBOVUwpCisgICAgeworCSh2b2lkKWNvcHlfb3B0aW9uX3BhcnQoJndvcmQsIGJ1ZiwgTFNJWkUsICIsIik7CisJbGVuID0gKGludClTVFJMRU4oYnVmKTsKKwlpZiAoU1RSTkNNUChidWYsIHAsIGxlbikgPT0gMCAmJiBwW2xlbl0gPT0gJyAnKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogV2hlbiAncCcgaXMgcHJlc2VudCBpbiAnY3BvcHRpb25zLCBhIFZpIGNvbXBhdGlibGUgbWV0aG9kIGlzIHVzZWQuCisgKiBUaGUgaW5jb21wYXRpYmxlIG5ld2VyIG1ldGhvZCBpcyBxdWl0ZSBhIGJpdCBiZXR0ZXIgYXQgaW5kZW50aW5nCisgKiBjb2RlIGluIGxpc3AtbGlrZSBsYW5ndWFnZXMgdGhhbiB0aGUgdHJhZGl0aW9uYWwgb25lOyBpdCdzIHN0aWxsCisgKiBtb3N0bHkgaGV1cmlzdGljcyBob3dldmVyIC0tIERpcmsgdmFuIERldW4sIGRpcmtAcmF2ZS5vcmcKKyAqCisgKiBUT0RPOgorICogRmluZG1hdGNoKCkgc2hvdWxkIGJlIGFkYXB0ZWQgZm9yIGxpc3AsIGFsc28gdG8gbWFrZSBzaG93bWF0Y2gKKyAqIHdvcmsgY29ycmVjdGx5OiBub3cgKHY1LjMpIGl0IHNlZW1zIGFsbCBDL0MrKyBvcmllbnRlZDoKKyAqIC0gaXQgZG9lcyBub3QgcmVjb2duaXplIHRoZSAjXCggYW5kICNcKSBub3RhdGlvbnMgYXMgY2hhcmFjdGVyIGxpdGVyYWxzCisgKiAtIGl0IGRvZXNuJ3Qga25vdyBhYm91dCBjb21tZW50cyBzdGFydGluZyB3aXRoIGEgc2VtaWNvbG9uCisgKiAtIGl0IGluY29ycmVjdGx5IGludGVycHJldHMgJygnIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwKKyAqIEFsbCB0aGlzIG1lc3NlcyB1cCBnZXRfbGlzcF9pbmRlbnQgaW4gc29tZSByYXJlIGNhc2VzLgorICovCisgICAgaW50CitnZXRfbGlzcF9pbmRlbnQoKQoreworICAgIHBvc19UCSpwb3MsIHJlYWxwb3M7CisgICAgaW50CQlhbW91bnQ7CisgICAgY2hhcl91CSp0aGF0OworICAgIGNvbG5yX1QJY29sOworICAgIGNvbG5yX1QJZmlyc3R0cnk7CisgICAgaW50CQlwYXJlbmNvdW50LCBxdW90ZWNvdW50OworICAgIGludAkJdmlfbGlzcDsKKworICAgIC8qIFNldCB2aV9saXNwIHRvIHVzZSB0aGUgdmktY29tcGF0aWJsZSBtZXRob2QgKi8KKyAgICB2aV9saXNwID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19MSVNQKSAhPSBOVUxMKTsKKworICAgIHJlYWxwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKworICAgIGlmICgocG9zID0gZmluZG1hdGNoKE5VTEwsICcoJykpICE9IE5VTEwpCisgICAgeworCS8qIEV4dHJhIHRyaWNrOiBUYWtlIHRoZSBpbmRlbnQgb2YgdGhlIGZpcnN0IHByZXZpb3VzIG5vbi13aGl0ZQorCSAqIGxpbmUgdGhhdCBpcyBhdCB0aGUgc2FtZSAoKSBsZXZlbC4gKi8KKwlhbW91bnQgPSAtMTsKKwlwYXJlbmNvdW50ID0gMDsKKworCXdoaWxlICgtLWN1cndpbi0+d19jdXJzb3IubG51bSA+PSBwb3MtPmxudW0pCisJeworCSAgICBpZiAobGluZXdoaXRlKGN1cndpbi0+d19jdXJzb3IubG51bSkpCisJCWNvbnRpbnVlOworCSAgICBmb3IgKHRoYXQgPSBtbF9nZXRfY3VybGluZSgpOyAqdGhhdCAhPSBOVUw7ICsrdGhhdCkKKwkgICAgeworCQlpZiAoKnRoYXQgPT0gJzsnKQorCQl7CisJCSAgICB3aGlsZSAoKih0aGF0ICsgMSkgIT0gTlVMKQorCQkJKyt0aGF0OworCQkgICAgY29udGludWU7CisJCX0KKwkJaWYgKCp0aGF0ID09ICdcXCcpCisJCXsKKwkJICAgIGlmICgqKHRoYXQgKyAxKSAhPSBOVUwpCisJCQkrK3RoYXQ7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZiAoKnRoYXQgPT0gJyInICYmICoodGhhdCArIDEpICE9IE5VTCkKKwkJeworCQkgICAgdGhhdCsrOworCQkgICAgd2hpbGUgKCp0aGF0ICYmICgqdGhhdCAhPSAnIicgfHwgKih0aGF0IC0gMSkgPT0gJ1xcJykpCisJCQkrK3RoYXQ7CisJCX0KKwkJaWYgKCp0aGF0ID09ICcoJykKKwkJICAgICsrcGFyZW5jb3VudDsKKwkJZWxzZSBpZiAoKnRoYXQgPT0gJyknKQorCQkgICAgLS1wYXJlbmNvdW50OworCSAgICB9CisJICAgIGlmIChwYXJlbmNvdW50ID09IDApCisJICAgIHsKKwkJYW1vdW50ID0gZ2V0X2luZGVudCgpOworCQlicmVhazsKKwkgICAgfQorCX0KKworCWlmIChhbW91bnQgPT0gLTEpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBwb3MtPmxudW07CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gcG9zLT5jb2w7CisJICAgIGNvbCA9IHBvcy0+Y29sOworCisJICAgIHRoYXQgPSBtbF9nZXRfY3VybGluZSgpOworCisJICAgIGlmICh2aV9saXNwICYmIGdldF9pbmRlbnQoKSA9PSAwKQorCQlhbW91bnQgPSAyOworCSAgICBlbHNlCisJICAgIHsKKwkJYW1vdW50ID0gMDsKKwkJd2hpbGUgKCp0aGF0ICYmIGNvbCkKKwkJeworCQkgICAgYW1vdW50ICs9IGxicl9jaGFydGFic2l6ZV9hZHYoJnRoYXQsIChjb2xucl9UKWFtb3VudCk7CisJCSAgICBjb2wtLTsKKwkJfQorCisJCS8qCisJCSAqIFNvbWUga2V5d29yZHMgcmVxdWlyZSAiYm9keSIgaW5kZW50aW5nIHJ1bGVzICh0aGUKKwkJICogbm9uLXN0YW5kYXJkLWxpc3Agb25lcyBhcmUgU2NoZW1lIHNwZWNpYWwgZm9ybXMpOgorCQkgKgorCQkgKiAobGV0ICgoYSAxKSkgICAgaW5zdGVhZCAgICAobGV0ICgoYSAxKSkKKwkJICogICAoLi4uKSkJICAgICAgb2YJICAgKC4uLikpCisJCSAqLworCisJCWlmICghdmlfbGlzcCAmJiAqdGhhdCA9PSAnKCcgJiYgbGlzcF9tYXRjaCh0aGF0ICsgMSkpCisJCSAgICBhbW91bnQgKz0gMjsKKwkJZWxzZQorCQl7CisJCSAgICB0aGF0Kys7CisJCSAgICBhbW91bnQrKzsKKwkJICAgIGZpcnN0dHJ5ID0gYW1vdW50OworCisJCSAgICB3aGlsZSAodmltX2lzd2hpdGUoKnRoYXQpKQorCQkgICAgeworCQkJYW1vdW50ICs9IGxicl9jaGFydGFic2l6ZSh0aGF0LCAoY29sbnJfVClhbW91bnQpOworCQkJKyt0aGF0OworCQkgICAgfQorCisJCSAgICBpZiAoKnRoYXQgJiYgKnRoYXQgIT0gJzsnKSAvKiBub3QgYSBjb21tZW50IGxpbmUgKi8KKwkJICAgIHsKKwkJCS8qIHRlc3QgKnRoYXQgIT0gJygnIHRvIGFjY29tb2RhdGUgZmlyc3QgbGV0L2RvCisJCQkgKiBhcmd1bWVudCBpZiBpdCBpcyBtb3JlIHRoYW4gb25lIGxpbmUgKi8KKwkJCWlmICghdmlfbGlzcCAmJiAqdGhhdCAhPSAnKCcpCisJCQkgICAgZmlyc3R0cnkrKzsKKworCQkJcGFyZW5jb3VudCA9IDA7CisJCQlxdW90ZWNvdW50ID0gMDsKKworCQkJaWYgKHZpX2xpc3AKKwkJCQl8fCAoKnRoYXQgIT0gJyInCisJCQkJICAgICYmICp0aGF0ICE9ICdcJycKKwkJCQkgICAgJiYgKnRoYXQgIT0gJyMnCisJCQkJICAgICYmICgqdGhhdCA8ICcwJyB8fCAqdGhhdCA+ICc5JykpKQorCQkJeworCQkJICAgIHdoaWxlICgqdGhhdAorCQkJCSAgICAmJiAoIXZpbV9pc3doaXRlKCp0aGF0KQorCQkJCQl8fCBxdW90ZWNvdW50CisJCQkJCXx8IHBhcmVuY291bnQpCisJCQkJICAgICYmICghKCp0aGF0ID09ICcoJworCQkJCQkgICAgJiYgIXF1b3RlY291bnQKKwkJCQkJICAgICYmICFwYXJlbmNvdW50CisJCQkJCSAgICAmJiB2aV9saXNwKSkpCisJCQkgICAgeworCQkJCWlmICgqdGhhdCA9PSAnIicpCisJCQkJICAgIHF1b3RlY291bnQgPSAhcXVvdGVjb3VudDsKKwkJCQlpZiAoKnRoYXQgPT0gJygnICYmICFxdW90ZWNvdW50KQorCQkJCSAgICArK3BhcmVuY291bnQ7CisJCQkJaWYgKCp0aGF0ID09ICcpJyAmJiAhcXVvdGVjb3VudCkKKwkJCQkgICAgLS1wYXJlbmNvdW50OworCQkJCWlmICgqdGhhdCA9PSAnXFwnICYmICoodGhhdCsxKSAhPSBOVUwpCisJCQkJICAgIGFtb3VudCArPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZ0aGF0LAorCQkJCQkJCSAgICAgKGNvbG5yX1QpYW1vdW50KTsKKwkJCQlhbW91bnQgKz0gbGJyX2NoYXJ0YWJzaXplX2FkdigmdGhhdCwKKwkJCQkJCQkgICAgIChjb2xucl9UKWFtb3VudCk7CisJCQkgICAgfQorCQkJfQorCQkJd2hpbGUgKHZpbV9pc3doaXRlKCp0aGF0KSkKKwkJCXsKKwkJCSAgICBhbW91bnQgKz0gbGJyX2NoYXJ0YWJzaXplKHRoYXQsIChjb2xucl9UKWFtb3VudCk7CisJCQkgICAgdGhhdCsrOworCQkJfQorCQkJaWYgKCEqdGhhdCB8fCAqdGhhdCA9PSAnOycpCisJCQkgICAgYW1vdW50ID0gZmlyc3R0cnk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZQorCWFtb3VudCA9IDA7CS8qIG5vIG1hdGNoaW5nICcoJyBmb3VuZCwgdXNlIHplcm8gaW5kZW50ICovCisKKyAgICBjdXJ3aW4tPndfY3Vyc29yID0gcmVhbHBvczsKKworICAgIHJldHVybiBhbW91bnQ7Cit9CisjZW5kaWYgLyogRkVBVF9MSVNQICovCisKKyAgICB2b2lkCitwcmVwYXJlX3RvX2V4aXQoKQoreworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCWd1aS5keWluZyA9IFRSVUU7CisJb3V0X3RyYXNoKCk7CS8qIHRyYXNoIGFueSBwZW5kaW5nIG91dHB1dCAqLworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJd2luZGdvdG8oKGludClSb3dzIC0gMSwgMCk7CisKKwkvKgorCSAqIFN3aXRjaCB0ZXJtaW5hbCBtb2RlIGJhY2sgbm93LCBzbyBtZXNzYWdlcyBlbmQgdXAgb24gdGhlICJub3JtYWwiCisJICogc2NyZWVuIChpZiB0aGVyZSBhcmUgdHdvIHNjcmVlbnMpLgorCSAqLworCXNldHRtb2RlKFRNT0RFX0NPT0spOworI2lmZGVmIFdJTjMyNjQKKwlpZiAoY2FuX2VuZF90ZXJtY2FwX21vZGUoRkFMU0UpID09IFRSVUUpCisjZW5kaWYKKwkgICAgc3RvcHRlcm1jYXAoKTsKKwlvdXRfZmx1c2goKTsKKyAgICB9Cit9CisKKy8qCisgKiBQcmVzZXJ2ZSBmaWxlcyBhbmQgZXhpdC4KKyAqIFdoZW4gY2FsbGVkIElPYnVmZiBtdXN0IGNvbnRhaW4gYSBtZXNzYWdlLgorICovCisgICAgdm9pZAorcHJlc2VydmVfZXhpdCgpCit7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgIHByZXBhcmVfdG9fZXhpdCgpOworCisgICAgb3V0X3N0cihJT2J1ZmYpOworICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworICAgIG91dF9mbHVzaCgpOworCisgICAgbWxfY2xvc2Vfbm90bW9kKCk7CQkgICAgLyogY2xvc2UgYWxsIG5vdC1tb2RpZmllZCBidWZmZXJzICovCisKKyAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisgICAgeworCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwgJiYgYnVmLT5iX21sLm1sX21mcC0+bWZfZm5hbWUgIT0gTlVMTCkKKwl7CisJICAgIE9VVF9TVFIoXygiVmltOiBwcmVzZXJ2aW5nIGZpbGVzLi4uXG4iKSk7CisJICAgIHNjcmVlbl9zdGFydCgpOwkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJICAgIG91dF9mbHVzaCgpOworCSAgICBtbF9zeW5jX2FsbChGQUxTRSwgRkFMU0UpOwkvKiBwcmVzZXJ2ZSBhbGwgc3dhcCBmaWxlcyAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgbWxfY2xvc2VfYWxsKEZBTFNFKTsJICAgIC8qIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZyAqLworCisgICAgT1VUX1NUUihfKCJWaW06IEZpbmlzaGVkLlxuIikpOworCisgICAgZ2V0b3V0KDEpOworfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgImZuYW1lIiBleGlzdHMuCisgKi8KKyAgICBpbnQKK3ZpbV9mZXhpc3RzKGZuYW1lKQorICAgIGNoYXJfdSAgKmZuYW1lOworeworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWUsICZzdCkpCisJcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogQ2hlY2sgZm9yIENUUkwtQyBwcmVzc2VkLCBidXQgb25seSBvbmNlIGluIGEgd2hpbGUuCisgKiBTaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHVpX2JyZWFrY2hlY2soKSBmb3IgZnVuY3Rpb25zIHRoYXQgY2hlY2sgZm9yCisgKiBlYWNoIGxpbmUgaW4gdGhlIGZpbGUuICBDYWxsaW5nIHVpX2JyZWFrY2hlY2soKSBlYWNoIHRpbWUgdGFrZXMgdG9vIG11Y2gKKyAqIHRpbWUsIGJlY2F1c2UgaXQgY2FuIGJlIGEgc3lzdGVtIGNhbGwuCisgKi8KKworI2lmbmRlZiBCUkVBS0NIRUNLX1NLSVAKKyMgaWZkZWYgRkVBVF9HVUkJCSAgICAvKiBhc3N1bWUgdGhlIEdVSSBvbmx5IHJ1bnMgb24gZmFzdCBjb21wdXRlcnMgKi8KKyMgIGRlZmluZSBCUkVBS0NIRUNLX1NLSVAgMjAwCisjIGVsc2UKKyMgIGRlZmluZSBCUkVBS0NIRUNLX1NLSVAgMzIKKyMgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW50CWJyZWFrY2hlY2tfY291bnQgPSAwOworCisgICAgdm9pZAorbGluZV9icmVha2NoZWNrKCkKK3sKKyAgICBpZiAoKyticmVha2NoZWNrX2NvdW50ID49IEJSRUFLQ0hFQ0tfU0tJUCkKKyAgICB7CisJYnJlYWtjaGVja19jb3VudCA9IDA7CisJdWlfYnJlYWtjaGVjaygpOworICAgIH0KK30KKworLyoKKyAqIExpa2UgbGluZV9icmVha2NoZWNrKCkgYnV0IGNoZWNrIDEwIHRpbWVzIGxlc3Mgb2Z0ZW4uCisgKi8KKyAgICB2b2lkCitmYXN0X2JyZWFrY2hlY2soKQoreworICAgIGlmICgrK2JyZWFrY2hlY2tfY291bnQgPj0gQlJFQUtDSEVDS19TS0lQICogMTApCisgICAgeworCWJyZWFrY2hlY2tfY291bnQgPSAwOworCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9Cit9CisKKy8qCisgKiBFeHBhbmQgd2lsZGNhcmRzLiAgQ2FsbHMgZ2VuX2V4cGFuZF93aWxkY2FyZHMoKSBhbmQgcmVtb3ZlcyBmaWxlcyBtYXRjaGluZworICogJ3dpbGRpZ25vcmUnLgorICovCisgICAgaW50CitleHBhbmRfd2lsZGNhcmRzKG51bV9wYXQsIHBhdCwgbnVtX2ZpbGUsIGZpbGUsIGZsYWdzKQorICAgIGludAkJICAgbnVtX3BhdDsJLyogbnVtYmVyIG9mIGlucHV0IHBhdHRlcm5zICovCisgICAgY2hhcl91CSAqKnBhdDsJCS8qIGFycmF5IG9mIGlucHV0IHBhdHRlcm5zICovCisgICAgaW50CQkgICpudW1fZmlsZTsJLyogcmVzdWx0aW5nIG51bWJlciBvZiBmaWxlcyAqLworICAgIGNoYXJfdQkqKipmaWxlOwkvKiBhcnJheSBvZiByZXN1bHRpbmcgZmlsZXMgKi8KKyAgICBpbnQJCSAgIGZsYWdzOwkvKiBFV19ESVIsIGV0Yy4gKi8KK3sKKyAgICBpbnQJCXJldHZhbDsKKyAgICBpbnQJCWksIGo7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbm9uX3N1Zl9tYXRjaDsJLyogbnVtYmVyIHdpdGhvdXQgbWF0Y2hpbmcgc3VmZml4ICovCisKKyAgICByZXR2YWwgPSBnZW5fZXhwYW5kX3dpbGRjYXJkcyhudW1fcGF0LCBwYXQsIG51bV9maWxlLCBmaWxlLCBmbGFncyk7CisKKyAgICAvKiBXaGVuIGtlZXBpbmcgYWxsIG1hdGNoZXMsIHJldHVybiBoZXJlICovCisgICAgaWYgKGZsYWdzICYgRVdfS0VFUEFMTCkKKwlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgRkVBVF9XSUxESUdOCisgICAgLyoKKyAgICAgKiBSZW1vdmUgbmFtZXMgdGhhdCBtYXRjaCAnd2lsZGlnbm9yZScuCisgICAgICovCisgICAgaWYgKCpwX3dpZykKKyAgICB7CisJY2hhcl91CSpmZm5hbWU7CisKKwkvKiBjaGVjayBhbGwgZmlsZXMgaW4gKCpmaWxlKVtdICovCisJZm9yIChpID0gMDsgaSA8ICpudW1fZmlsZTsgKytpKQorCXsKKwkgICAgZmZuYW1lID0gRnVsbE5hbWVfc2F2ZSgoKmZpbGUpW2ldLCBGQUxTRSk7CisJICAgIGlmIChmZm5hbWUgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJYnJlYWs7CisjIGlmZGVmIFZNUworCSAgICB2bXNfcmVtb3ZlX3ZlcnNpb24oZmZuYW1lKTsKKyMgZW5kaWYKKwkgICAgaWYgKG1hdGNoX2ZpbGVfbGlzdChwX3dpZywgKCpmaWxlKVtpXSwgZmZuYW1lKSkKKwkgICAgeworCQkvKiByZW1vdmUgdGhpcyBtYXRjaGluZyBmaWxlIGZyb20gdGhlIGxpc3QgKi8KKwkJdmltX2ZyZWUoKCpmaWxlKVtpXSk7CisJCWZvciAoaiA9IGk7IGogKyAxIDwgKm51bV9maWxlOyArK2opCisJCSAgICAoKmZpbGUpW2pdID0gKCpmaWxlKVtqICsgMV07CisJCS0tKm51bV9maWxlOworCQktLWk7CisJICAgIH0KKwkgICAgdmltX2ZyZWUoZmZuYW1lKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIE1vdmUgdGhlIG5hbWVzIHdoZXJlICdzdWZmaXhlcycgbWF0Y2ggdG8gdGhlIGVuZC4KKyAgICAgKi8KKyAgICBpZiAoKm51bV9maWxlID4gMSkKKyAgICB7CisJbm9uX3N1Zl9tYXRjaCA9IDA7CisJZm9yIChpID0gMDsgaSA8ICpudW1fZmlsZTsgKytpKQorCXsKKwkgICAgaWYgKCFtYXRjaF9zdWZmaXgoKCpmaWxlKVtpXSkpCisJICAgIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgbmFtZSB3aXRob3V0IG1hdGNoaW5nIHN1ZmZpeCB0byB0aGUgZnJvbnQKKwkJICogb2YgdGhlIGxpc3QuCisJCSAqLworCQlwID0gKCpmaWxlKVtpXTsKKwkJZm9yIChqID0gaTsgaiA+IG5vbl9zdWZfbWF0Y2g7IC0taikKKwkJICAgICgqZmlsZSlbal0gPSAoKmZpbGUpW2ogLSAxXTsKKwkJKCpmaWxlKVtub25fc3VmX21hdGNoKytdID0gcDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgImZuYW1lIiBtYXRjaGVzIHdpdGggYW4gZW50cnkgaW4gJ3N1ZmZpeGVzJy4KKyAqLworICAgIGludAorbWF0Y2hfc3VmZml4KGZuYW1lKQorICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgaW50CQlmbmFtZWxlbiwgc2V0c3VmbGVuOworICAgIGNoYXJfdQkqc2V0c3VmOworI2RlZmluZSBNQVhTVUZMRU4gMzAJICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZSBzdWZmaXggKi8KKyAgICBjaGFyX3UJc3VmX2J1ZltNQVhTVUZMRU5dOworCisgICAgZm5hbWVsZW4gPSAoaW50KVNUUkxFTihmbmFtZSk7CisgICAgc2V0c3VmbGVuID0gMDsKKyAgICBmb3IgKHNldHN1ZiA9IHBfc3U7ICpzZXRzdWY7ICkKKyAgICB7CisJc2V0c3VmbGVuID0gY29weV9vcHRpb25fcGFydCgmc2V0c3VmLCBzdWZfYnVmLCBNQVhTVUZMRU4sICIuLCIpOworCWlmIChmbmFtZWxlbiA+PSBzZXRzdWZsZW4KKwkJJiYgZm5hbWVuY21wKHN1Zl9idWYsIGZuYW1lICsgZm5hbWVsZW4gLSBzZXRzdWZsZW4sCisJCQkJCSAgICAgIChzaXplX3Qpc2V0c3VmbGVuKSA9PSAwKQorCSAgICBicmVhazsKKwlzZXRzdWZsZW4gPSAwOworICAgIH0KKyAgICByZXR1cm4gKHNldHN1ZmxlbiAhPSAwKTsKK30KKworI2lmICFkZWZpbmVkKE5PX0VYUEFORFBBVEgpIHx8IGRlZmluZWQoUFJPVE8pCisKKyMgaWZkZWYgVklNX0JBQ0tUSUNLCitzdGF0aWMgaW50IHZpbV9iYWNrdGljayBfX0FSR1MoKGNoYXJfdSAqcCkpOworc3RhdGljIGludCBleHBhbmRfYmFja3RpY2sgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnBhdCwgaW50IGZsYWdzKSk7CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChGRUFUX0dVSV9XMTYpIHx8IGRlZmluZWQoV0lOMzI2NCkKKy8qCisgKiBGaWxlIG5hbWUgZXhwYW5zaW9uIGNvZGUgZm9yIE1TLURPUywgV2luMTYgYW5kIFdpbjMyLiAgSXQncyBoZXJlIGJlY2F1c2UKKyAqIGl0J3Mgc2hhcmVkIGJldHdlZW4gdGhlc2Ugc3lzdGVtcy4KKyAqLworIyBpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFBST1RPKQorIyAgZGVmaW5lIF9jZGVjbAkgICAgLyogREpHUFAgZG9lc24ndCBoYXZlIHRoaXMgKi8KKyMgZWxzZQorIyAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgZGVmaW5lIF9jZGVjbCBfUlRMRU5UUllGCisjICBlbmRpZgorIyBlbmRpZgorCisvKgorICogY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgcXNvcnQgaW4gZG9zX2V4cGFuZHBhdGgoKQorICovCisgICAgc3RhdGljIGludCBfY2RlY2wKK3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICByZXR1cm4gKHBhdGhjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKSk7Cit9CisKKyMgaWZuZGVmIFdJTjMyNjQKKyAgICBzdGF0aWMgdm9pZAorbmFtZWxvd2NweSgKKyAgICBjaGFyX3UgKmQsCisgICAgY2hhcl91ICpzKQoreworIyAgaWZkZWYgREpHUFAKKyAgICBpZiAoVVNFX0xPTkdfRk5BTUUpCSAgICAvKiBkb24ndCBsb3dlciBjYXNlIG9uIFdpbmRvd3MgOTUvTlQgc3lzdGVtcyAqLworCXdoaWxlICgqcykKKwkgICAgKmQrKyA9ICpzKys7CisgICAgZWxzZQorIyAgZW5kaWYKKwl3aGlsZSAoKnMpCisJICAgICpkKysgPSBUT0xPV0VSX0xPQygqcysrKTsKKyAgICAqZCA9IE5VTDsKK30KKyMgZW5kaWYKKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGJ1aWxkIHVwIGEgbGlzdCBvZiBmaWxlcyBpbiAiZ2FwIiBtYXRjaGluZyB0aGUgZmlyc3Qgd2lsZGNhcmQKKyAqIGluIGBwYXRoJy4gIENhbGxlZCBieSBleHBhbmRfd2lsZGNhcmRzKCkuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICogInBhdGgiIGhhcyBiYWNrc2xhc2hlcyBiZWZvcmUgY2hhcnMgdGhhdCBhcmUgbm90IHRvIGJlIGV4cGFuZGVkLCBzdGFydGluZworICogYXQgInBhdGhbd2lsZG9mZl0iLgorICovCisgICAgc3RhdGljIGludAorZG9zX2V4cGFuZHBhdGgoCisgICAgZ2FycmF5X1QJKmdhcCwKKyAgICBjaGFyX3UJKnBhdGgsCisgICAgaW50CQl3aWxkb2ZmLAorICAgIGludAkJZmxhZ3MpCQkvKiBFV18qIGZsYWdzICovCit7CisgICAgY2hhcl91CQkqYnVmOworICAgIGNoYXJfdQkJKnBhdGhfZW5kOworICAgIGNoYXJfdQkJKnAsICpzLCAqZTsKKyAgICBpbnQJCQlzdGFydF9sZW4gPSBnYXAtPmdhX2xlbjsKKyAgICBpbnQJCQlvazsKKyNpZmRlZiBXSU4zMjY0CisgICAgV0lOMzJfRklORF9EQVRBCWZiOworICAgIEhBTkRMRQkJaEZpbmQgPSAoSEFORExFKTA7CisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBXSU4zMl9GSU5EX0RBVEFXICAgIHdmYjsKKyAgICBXQ0hBUgkJKnduID0gTlVMTDsJLyogVUNTLTIgbmFtZSwgTlVMTCB3aGVuIG5vdCB1c2VkLiAqLworIyBlbmRpZgorI2Vsc2UKKyAgICBzdHJ1Y3QgZmZibGsJZmI7CisjZW5kaWYKKyAgICBpbnQJCQltYXRjaGVzOworICAgIGludAkJCXN0YXJ0c193aXRoX2RvdDsKKyAgICBpbnQJCQlsZW47CisgICAgY2hhcl91CQkqcGF0OworICAgIHJlZ21hdGNoX1QJCXJlZ21hdGNoOworICAgIGNoYXJfdQkJKm1hdGNobmFtZTsKKworICAgIC8qIG1ha2Ugcm9vbSBmb3IgZmlsZSBuYW1lICovCisgICAgYnVmID0gYWxsb2MoKHVuc2lnbmVkIGludClTVFJMRU4ocGF0aCkgKyBCQVNFTkFNRUxFTiArIDUpOworICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgZmlyc3QgcGFydCBpbiB0aGUgcGF0aCBuYW1lIHRoYXQgY29udGFpbnMgYSB3aWxkY2FyZCBvciBhIH4xLgorICAgICAqIENvcHkgaXQgaW50byBidWYsIGluY2x1ZGluZyB0aGUgcHJlY2VkaW5nIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcCA9IGJ1ZjsKKyAgICBzID0gYnVmOworICAgIGUgPSBOVUxMOworICAgIHBhdGhfZW5kID0gcGF0aDsKKyAgICB3aGlsZSAoKnBhdGhfZW5kICE9IE5VTCkKKyAgICB7CisJLyogTWF5IGlnbm9yZSBhIHdpbGRjYXJkIHRoYXQgaGFzIGEgYmFja3NsYXNoIGJlZm9yZSBpdDsgaXQgd2lsbAorCSAqIGJlIHJlbW92ZWQgYnkgcmVtX2JhY2tzbGFzaCgpIG9yIGZpbGVfcGF0X3RvX3JlZ19wYXQoKSBiZWxvdy4gKi8KKwlpZiAocGF0aF9lbmQgPj0gcGF0aCArIHdpbGRvZmYgJiYgcmVtX2JhY2tzbGFzaChwYXRoX2VuZCkpCisJICAgICpwKysgPSAqcGF0aF9lbmQrKzsKKwllbHNlIGlmICgqcGF0aF9lbmQgPT0gJ1xcJyB8fCAqcGF0aF9lbmQgPT0gJzonIHx8ICpwYXRoX2VuZCA9PSAnLycpCisJeworCSAgICBpZiAoZSAhPSBOVUxMKQorCQlicmVhazsKKwkgICAgcyA9IHAgKyAxOworCX0KKwllbHNlIGlmIChwYXRoX2VuZCA+PSBwYXRoICsgd2lsZG9mZgorCQkJICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIqP1t+IiwgKnBhdGhfZW5kKSAhPSBOVUxMKQorCSAgICBlID0gcDsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocGF0aF9lbmQpOworCSAgICBTVFJOQ1BZKHAsIHBhdGhfZW5kLCBsZW4pOworCSAgICBwICs9IGxlbjsKKwkgICAgcGF0aF9lbmQgKz0gbGVuOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgKnArKyA9ICpwYXRoX2VuZCsrOworICAgIH0KKyAgICBlID0gcDsKKyAgICAqZSA9IE5VTDsKKworICAgIC8qIG5vdyB3ZSBoYXZlIG9uZSB3aWxkY2FyZCBjb21wb25lbnQgYmV0d2VlbiBzIGFuZCBlICovCisgICAgLyogUmVtb3ZlIGJhY2tzbGFzaGVzIGJldHdlZW4gIndpbGRvZmYiIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHdpbGRjYXJkCisgICAgICogY29tcG9uZW50LiAqLworICAgIGZvciAocCA9IGJ1ZiArIHdpbGRvZmY7IHAgPCBzOyArK3ApCisJaWYgKHJlbV9iYWNrc2xhc2gocCkpCisJeworCSAgICBTVFJDUFkocCwgcCArIDEpOworCSAgICAtLWU7CisJICAgIC0tczsKKwl9CisKKyAgICBzdGFydHNfd2l0aF9kb3QgPSAoKnMgPT0gJy4nKTsKKyAgICBwYXQgPSBmaWxlX3BhdF90b19yZWdfcGF0KHMsIGUsIE5VTEwsIEZBTFNFKTsKKyAgICBpZiAocGF0ID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY29tcGlsZSB0aGUgcmVnZXhwIGludG8gYSBwcm9ncmFtICovCisgICAgcmVnbWF0Y2gucm1faWMgPSBUUlVFOwkJLyogQWx3YXlzIGlnbm9yZSBjYXNlICovCisgICAgcmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKHBhdCwgUkVfTUFHSUMpOworICAgIHZpbV9mcmVlKHBhdCk7CisKKyAgICBpZiAocmVnbWF0Y2gucmVncHJvZyA9PSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShidWYpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIHJlbWVtYmVyIHRoZSBwYXR0ZXJuIG9yIGZpbGUgbmFtZSBiZWluZyBsb29rZWQgZm9yICovCisgICAgbWF0Y2huYW1lID0gdmltX3N0cnNhdmUocyk7CisKKyAgICAvKiBTY2FuIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHdpdGggImRpci8gKi4qIiAqLworICAgIFNUUkNQWShzLCAiKi4qIik7CisjaWZkZWYgV0lOMzI2NAorIyBpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlKQorICAgIHsKKwkvKiBUaGUgYWN0aXZlIGNvZGVwYWdlIGRpZmZlcnMgZnJvbSAnZW5jb2RpbmcnLiAgQXR0ZW1wdCB1c2luZyB0aGUKKwkgKiB3aWRlIGZ1bmN0aW9uLiAgSWYgaXQgZmFpbHMgYmVjYXVzZSBpdCBpcyBub3QgaW1wbGVtZW50ZWQgZmFsbCBiYWNrCisJICogdG8gdGhlIG5vbi13aWRlIHZlcnNpb24gKGZvciBXaW5kb3dzIDk4KSAqLworCXduID0gZW5jX3RvX3VjczIoYnVmLCBOVUxMKTsKKwlpZiAod24gIT0gTlVMTCkKKwl7CisJICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZVcod24sICZ3ZmIpOworCSAgICBpZiAoaEZpbmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUKKwkJCSAgICAgICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCSAgICB7CisJCXZpbV9mcmVlKHduKTsKKwkJd24gPSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICh3biA9PSBOVUxMKQorIyBlbmRpZgorCWhGaW5kID0gRmluZEZpcnN0RmlsZShidWYsICZmYik7CisgICAgb2sgPSAoaEZpbmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworI2Vsc2UKKyAgICAvKiBJZiB3ZSBhcmUgZXhwYW5kaW5nIHdpbGRjYXJkcyB3ZSB0cnkgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKi8KKyAgICBvayA9IChmaW5kZmlyc3QoKGNoYXIgKilidWYsICZmYiwKKwkJKCpwYXRoX2VuZCAhPSBOVUwgfHwgKGZsYWdzICYgRVdfRElSKSkgPyBGQV9ESVJFQyA6IDApID09IDApOworI2VuZGlmCisKKyAgICB3aGlsZSAob2spCisgICAgeworI2lmZGVmIFdJTjMyNjQKKyMgaWZkZWYgRkVBVF9NQllURQorCWlmICh3biAhPSBOVUxMKQorCSAgICBwID0gdWNzMl90b19lbmMod2ZiLmNGaWxlTmFtZSwgTlVMTCk7ICAgLyogcCBpcyBhbGxvY2F0ZWQgaGVyZSAqLworCWVsc2UKKyMgZW5kaWYKKwkgICAgcCA9IChjaGFyX3UgKilmYi5jRmlsZU5hbWU7CisjZWxzZQorCXAgPSAoY2hhcl91ICopZmIuZmZfbmFtZTsKKyNlbmRpZgorCS8qIElnbm9yZSBlbnRyaWVzIHN0YXJ0aW5nIHdpdGggYSBkb3QsIHVubGVzcyB3aGVuIGFza2VkIGZvci4gIEFjY2VwdAorCSAqIGFsbCBlbnRyaWVzIGZvdW5kIHdpdGggIm1hdGNobmFtZSIuICovCisJaWYgKChwWzBdICE9ICcuJyB8fCBzdGFydHNfd2l0aF9kb3QpCisJCSYmIChtYXRjaG5hbWUgPT0gTlVMTAorCQkgICAgfHwgdmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBwLCAoY29sbnJfVCkwKSkpCisJeworI2lmZGVmIFdJTjMyNjQKKwkgICAgU1RSQ1BZKHMsIHApOworI2Vsc2UKKwkgICAgbmFtZWxvd2NweShzLCBwKTsKKyNlbmRpZgorCSAgICBsZW4gPSAoaW50KVNUUkxFTihidWYpOworCSAgICBTVFJDUFkoYnVmICsgbGVuLCBwYXRoX2VuZCk7CisJICAgIGlmIChtY2hfaGFzX2V4cF93aWxkY2FyZChwYXRoX2VuZCkpCisJICAgIHsKKwkJLyogbmVlZCB0byBleHBhbmQgYW5vdGhlciBjb21wb25lbnQgb2YgdGhlIHBhdGggKi8KKwkJLyogcmVtb3ZlIGJhY2tzbGFzaGVzIGZvciB0aGUgcmVtYWluaW5nIGNvbXBvbmVudHMgb25seSAqLworCQkodm9pZClkb3NfZXhwYW5kcGF0aChnYXAsIGJ1ZiwgbGVuICsgMSwgZmxhZ3MpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBubyBtb3JlIHdpbGRjYXJkcywgY2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaCAqLworCQkvKiByZW1vdmUgYmFja3NsYXNoZXMgZm9yIHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBvbmx5ICovCisJCWlmICgqcGF0aF9lbmQgIT0gMCkKKwkJICAgIGJhY2tzbGFzaF9oYWx2ZShidWYgKyBsZW4gKyAxKTsKKwkJaWYgKG1jaF9nZXRwZXJtKGJ1ZikgPj0gMCkJLyogYWRkIGV4aXN0aW5nIGZpbGUgKi8KKwkJICAgIGFkZGZpbGUoZ2FwLCBidWYsIGZsYWdzKTsKKwkgICAgfQorCX0KKworI2lmZGVmIFdJTjMyNjQKKyMgaWZkZWYgRkVBVF9NQllURQorCWlmICh3biAhPSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUocCk7CisJICAgIG9rID0gRmluZE5leHRGaWxlVyhoRmluZCwgJndmYik7CisJfQorCWVsc2UKKyMgZW5kaWYKKwkgICAgb2sgPSBGaW5kTmV4dEZpbGUoaEZpbmQsICZmYik7CisjZWxzZQorCW9rID0gKGZpbmRuZXh0KCZmYikgPT0gMCk7CisjZW5kaWYKKworCS8qIElmIG5vIG1vcmUgbWF0Y2hlcyBhbmQgbm8gbWF0Y2ggd2FzIHVzZWQsIHRyeSBleHBhbmRpbmcgdGhlIG5hbWUKKwkgKiBpdHNlbGYuICBGaW5kcyB0aGUgbG9uZyBuYW1lIG9mIGEgc2hvcnQgZmlsZW5hbWUuICovCisJaWYgKCFvayAmJiBtYXRjaG5hbWUgIT0gTlVMTCAmJiBnYXAtPmdhX2xlbiA9PSBzdGFydF9sZW4pCisJeworCSAgICBTVFJDUFkocywgbWF0Y2huYW1lKTsKKyNpZmRlZiBXSU4zMjY0CisJICAgIEZpbmRDbG9zZShoRmluZCk7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKHduICE9IE5VTEwpCisJICAgIHsKKwkJdmltX2ZyZWUod24pOworCQl3biA9IGVuY190b191Y3MyKGJ1ZiwgTlVMTCk7CisJCWlmICh3biAhPSBOVUxMKQorCQkgICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlVyh3biwgJndmYik7CisJICAgIH0KKwkgICAgaWYgKHduID09IE5VTEwpCisjIGVuZGlmCisJCWhGaW5kID0gRmluZEZpcnN0RmlsZShidWYsICZmYik7CisJICAgIG9rID0gKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyNlbHNlCisJICAgIG9rID0gKGZpbmRmaXJzdCgoY2hhciAqKWJ1ZiwgJmZiLAorCQkgKCpwYXRoX2VuZCAhPSBOVUwgfHwgKGZsYWdzICYgRVdfRElSKSkgPyBGQV9ESVJFQyA6IDApID09IDApOworI2VuZGlmCisJICAgIHZpbV9mcmVlKG1hdGNobmFtZSk7CisJICAgIG1hdGNobmFtZSA9IE5VTEw7CisJfQorICAgIH0KKworI2lmZGVmIFdJTjMyNjQKKyAgICBGaW5kQ2xvc2UoaEZpbmQpOworIyBpZmRlZiBGRUFUX01CWVRFCisgICAgdmltX2ZyZWUod24pOworIyBlbmRpZgorI2VuZGlmCisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKyAgICB2aW1fZnJlZShtYXRjaG5hbWUpOworCisgICAgbWF0Y2hlcyA9IGdhcC0+Z2FfbGVuIC0gc3RhcnRfbGVuOworICAgIGlmIChtYXRjaGVzID4gMCkKKwlxc29ydCgoKGNoYXJfdSAqKilnYXAtPmdhX2RhdGEpICsgc3RhcnRfbGVuLCAoc2l6ZV90KW1hdGNoZXMsCisJCQkJCQkgICBzaXplb2YoY2hhcl91ICopLCBwc3RyY21wKTsKKyAgICByZXR1cm4gbWF0Y2hlczsKK30KKworICAgIGludAorbWNoX2V4cGFuZHBhdGgoCisgICAgZ2FycmF5X1QJKmdhcCwKKyAgICBjaGFyX3UJKnBhdGgsCisgICAgaW50CQlmbGFncykJCS8qIEVXXyogZmxhZ3MgKi8KK3sKKyAgICByZXR1cm4gZG9zX2V4cGFuZHBhdGgoZ2FwLCBwYXRoLCAwLCBmbGFncyk7Cit9CisjIGVuZGlmIC8qIE1TRE9TIHx8IEZFQVRfR1VJX1cxNiB8fCBXSU4zMjY0ICovCisKKy8qCisgKiBHZW5lcmljIHdpbGRjYXJkIGV4cGFuc2lvbiBjb2RlLgorICoKKyAqIENoYXJhY3RlcnMgaW4gInBhdCIgdGhhdCBzaG91bGQgbm90IGJlIGV4cGFuZGVkIG11c3QgYmUgcHJlY2VkZWQgd2l0aCBhCisgKiBiYWNrc2xhc2guIEUuZy4sICIvcGF0aFwgd2l0aFwgc3BhY2VzL215XCpzdGFyKiIKKyAqCisgKiBSZXR1cm4gRkFJTCB3aGVuIG5vIHNpbmdsZSBmaWxlIHdhcyBmb3VuZC4gIEluIHRoaXMgY2FzZSAibnVtX2ZpbGUiIGlzIG5vdAorICogc2V0LCBhbmQgImZpbGUiIG1heSBjb250YWluIGFuIGVycm9yIG1lc3NhZ2UuCisgKiBSZXR1cm4gT0sgd2hlbiBzb21lIGZpbGVzIGZvdW5kLiAgIm51bV9maWxlIiBpcyBzZXQgdG8gdGhlIG51bWJlciBvZgorICogbWF0Y2hlcywgImZpbGUiIHRvIHRoZSBhcnJheSBvZiBtYXRjaGVzLiAgQ2FsbCBGcmVlV2lsZCgpIGxhdGVyLgorICovCisgICAgaW50CitnZW5fZXhwYW5kX3dpbGRjYXJkcyhudW1fcGF0LCBwYXQsIG51bV9maWxlLCBmaWxlLCBmbGFncykKKyAgICBpbnQJCW51bV9wYXQ7CS8qIG51bWJlciBvZiBpbnB1dCBwYXR0ZXJucyAqLworICAgIGNoYXJfdQkqKnBhdDsJCS8qIGFycmF5IG9mIGlucHV0IHBhdHRlcm5zICovCisgICAgaW50CQkqbnVtX2ZpbGU7CS8qIHJlc3VsdGluZyBudW1iZXIgb2YgZmlsZXMgKi8KKyAgICBjaGFyX3UJKioqZmlsZTsJLyogYXJyYXkgb2YgcmVzdWx0aW5nIGZpbGVzICovCisgICAgaW50CQlmbGFnczsJCS8qIEVXXyogZmxhZ3MgKi8KK3sKKyAgICBpbnQJCQlpOworICAgIGdhcnJheV9UCQlnYTsKKyAgICBjaGFyX3UJCSpwOworICAgIHN0YXRpYyBpbnQJCXJlY3Vyc2l2ZSA9IEZBTFNFOworICAgIGludAkJCWFkZF9wYXQ7CisKKyAgICAvKgorICAgICAqIGV4cGFuZF9lbnYoKSBpcyBjYWxsZWQgdG8gZXhwYW5kIHRoaW5ncyBsaWtlICJ+dXNlciIuICBJZiB0aGlzIGZhaWxzLAorICAgICAqIGl0IGNhbGxzIEV4cGFuZE9uZSgpLCB3aGljaCBicmluZ3MgdXMgYmFjayBoZXJlLiAgSW4gdGhpcyBjYXNlLCBhbHdheXMKKyAgICAgKiBjYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIGV4cGFuc2lvbiBmdW5jdGlvbiwgaWYgcG9zc2libGUuICBPdGhlcndpc2UsCisgICAgICogcmV0dXJuIEZBSUwuCisgICAgICovCisgICAgaWYgKHJlY3Vyc2l2ZSkKKyNpZmRlZiBTUEVDSUFMX1dJTERDSEFSCisJcmV0dXJuIG1jaF9leHBhbmRfd2lsZGNhcmRzKG51bV9wYXQsIHBhdCwgbnVtX2ZpbGUsIGZpbGUsIGZsYWdzKTsKKyNlbHNlCisJcmV0dXJuIEZBSUw7CisjZW5kaWYKKworI2lmZGVmIFNQRUNJQUxfV0lMRENIQVIKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGFyZSBhbnkgc3BlY2lhbCB3aWxkY2FyZCBjaGFyYWN0ZXJzIHdoaWNoIHdlIGNhbm5vdCBoYW5kbGUKKyAgICAgKiBoZXJlLCBjYWxsIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFsbCB0aGUgZXhwYW5zaW9uLiAgVGhpcworICAgICAqIGF2b2lkcyBzdGFydGluZyB0aGUgc2hlbGwgZm9yIGVhY2ggYXJndW1lbnQgc2VwYXJhdGVseS4KKyAgICAgKiBGb3IgYD1leHByYCBkbyB1c2UgdGhlIGludGVybmFsIGZ1bmN0aW9uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGF0OyBpKyspCisgICAgeworCWlmICh2aW1fc3RycGJyayhwYXRbaV0sIChjaGFyX3UgKilTUEVDSUFMX1dJTERDSEFSKSAhPSBOVUxMCisjIGlmZGVmIFZJTV9CQUNLVElDSworCQkmJiAhKHZpbV9iYWNrdGljayhwYXRbaV0pICYmIHBhdFtpXVsxXSA9PSAnPScpCisjIGVuZGlmCisJICAgKQorCSAgICByZXR1cm4gbWNoX2V4cGFuZF93aWxkY2FyZHMobnVtX3BhdCwgcGF0LCBudW1fZmlsZSwgZmlsZSwgZmxhZ3MpOworICAgIH0KKyNlbmRpZgorCisgICAgcmVjdXJzaXZlID0gVFJVRTsKKworICAgIC8qCisgICAgICogVGhlIG1hdGNoaW5nIGZpbGUgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIGdyb3dhcnJheS4gIEluaXQgaXQgZW1wdHkuCisgICAgICovCisgICAgZ2FfaW5pdDIoJmdhLCAoaW50KXNpemVvZihjaGFyX3UgKiksIDMwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGF0OyArK2kpCisgICAgeworCWFkZF9wYXQgPSAtMTsKKwlwID0gcGF0W2ldOworCisjaWZkZWYgVklNX0JBQ0tUSUNLCisJaWYgKHZpbV9iYWNrdGljayhwKSkKKwkgICAgYWRkX3BhdCA9IGV4cGFuZF9iYWNrdGljaygmZ2EsIHAsIGZsYWdzKTsKKwllbHNlCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIEZpcnN0IGV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsICJ+LyIgYW5kICJ+dXNlci8iLgorCSAgICAgKi8KKwkgICAgaWYgKHZpbV9zdHJwYnJrKHAsIChjaGFyX3UgKikiJH4iKSAhPSBOVUxMKQorCSAgICB7CisJCXAgPSBleHBhbmRfZW52X3NhdmUocCk7CisJCWlmIChwID09IE5VTEwpCisJCSAgICBwID0gcGF0W2ldOworI2lmZGVmIFVOSVgKKwkJLyoKKwkJICogT24gVW5peCwgaWYgZXhwYW5kX2VudigpIGNhbid0IGV4cGFuZCBhbiBlbnZpcm9ubWVudAorCQkgKiB2YXJpYWJsZSwgdXNlIHRoZSBzaGVsbCB0byBkbyB0aGF0LiAgRGlzY2FyZCBwcmV2aW91c2x5CisJCSAqIGZvdW5kIGZpbGUgbmFtZXMgYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgorCQkgKi8KKwkJZWxzZSBpZiAodmltX3N0cnBicmsocCwgKGNoYXJfdSAqKSIkfiIpICE9IE5VTEwpCisJCXsKKwkJICAgIHZpbV9mcmVlKHApOworCQkgICAgZ2FfY2xlYXIoJmdhKTsKKwkJICAgIGkgPSBtY2hfZXhwYW5kX3dpbGRjYXJkcyhudW1fcGF0LCBwYXQsIG51bV9maWxlLCBmaWxlLAorCQkJCQkJCQkgICAgICAgZmxhZ3MpOworCQkgICAgcmVjdXJzaXZlID0gRkFMU0U7CisJCSAgICByZXR1cm4gaTsKKwkJfQorI2VuZGlmCisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBJZiB0aGVyZSBhcmUgd2lsZGNhcmRzOiBFeHBhbmQgZmlsZSBuYW1lcyBhbmQgYWRkIGVhY2ggbWF0Y2ggdG8KKwkgICAgICogdGhlIGxpc3QuICBJZiB0aGVyZSBpcyBubyBtYXRjaCwgYW5kIEVXX05PVEZPVU5EIGlzIGdpdmVuLCBhZGQKKwkgICAgICogdGhlIHBhdHRlcm4uCisJICAgICAqIElmIHRoZXJlIGFyZSBubyB3aWxkY2FyZHM6IEFkZCB0aGUgZmlsZSBuYW1lIGlmIGl0IGV4aXN0cyBvcgorCSAgICAgKiB3aGVuIEVXX05PVEZPVU5EIGlzIGdpdmVuLgorCSAgICAgKi8KKwkgICAgaWYgKG1jaF9oYXNfZXhwX3dpbGRjYXJkKHApKQorCQlhZGRfcGF0ID0gbWNoX2V4cGFuZHBhdGgoJmdhLCBwLCBmbGFncyk7CisJfQorCisJaWYgKGFkZF9wYXQgPT0gLTEgfHwgKGFkZF9wYXQgPT0gMCAmJiAoZmxhZ3MgJiBFV19OT1RGT1VORCkpKQorCXsKKwkgICAgY2hhcl91CSp0ID0gYmFja3NsYXNoX2hhbHZlX3NhdmUocCk7CisKKyNpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCisJICAgIHNsYXNoX3RvX2NvbG9uKHQpOworI2VuZGlmCisJICAgIC8qIFdoZW4gRVdfTk9URk9VTkQgaXMgdXNlZCwgYWx3YXlzIGFkZCBmaWxlcyBhbmQgZGlycy4gIE1ha2VzCisJICAgICAqICJ2aW0gYzovIiB3b3JrLiAqLworCSAgICBpZiAoZmxhZ3MgJiBFV19OT1RGT1VORCkKKwkJYWRkZmlsZSgmZ2EsIHQsIGZsYWdzIHwgRVdfRElSIHwgRVdfRklMRSk7CisJICAgIGVsc2UgaWYgKG1jaF9nZXRwZXJtKHQpID49IDApCisJCWFkZGZpbGUoJmdhLCB0LCBmbGFncyk7CisJICAgIHZpbV9mcmVlKHQpOworCX0KKworCWlmIChwICE9IHBhdFtpXSkKKwkgICAgdmltX2ZyZWUocCk7CisgICAgfQorCisgICAgKm51bV9maWxlID0gZ2EuZ2FfbGVuOworICAgICpmaWxlID0gKGdhLmdhX2RhdGEgIT0gTlVMTCkgPyAoY2hhcl91ICoqKWdhLmdhX2RhdGEgOiAoY2hhcl91ICoqKSIiOworCisgICAgcmVjdXJzaXZlID0gRkFMU0U7CisKKyAgICByZXR1cm4gKGdhLmdhX2RhdGEgIT0gTlVMTCkgPyBPSyA6IEZBSUw7Cit9CisKKyMgaWZkZWYgVklNX0JBQ0tUSUNLCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZXhwYW5kIHRoaXMgYmFja3RpY2sgdGhpbmcgaGVyZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3ZpbV9iYWNrdGljayhwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICByZXR1cm4gKCpwID09ICdgJyAmJiAqKHAgKyAxKSAhPSBOVUwgJiYgKihwICsgU1RSTEVOKHApIC0gMSkgPT0gJ2AnKTsKK30KKworLyoKKyAqIEV4cGFuZCBhbiBpdGVtIGluIGBiYWNrdGlja3NgIGJ5IGV4ZWN1dGluZyBpdCBhcyBhIGNvbW1hbmQuCisgKiBDdXJyZW50bHkgb25seSB3b3JrcyB3aGVuIHBhdFtdIHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgYC4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGZpbGUgbmFtZXMgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgaW50CitleHBhbmRfYmFja3RpY2soZ2FwLCBwYXQsIGZsYWdzKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSpwYXQ7CisgICAgaW50CQlmbGFnczsJLyogRVdfKiBmbGFncyAqLworeworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKmNtZDsKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBpbnQJCWNudCA9IDA7CisgICAgaW50CQlpOworCisgICAgLyogQ3JlYXRlIHRoZSBjb21tYW5kOiBsb3Agb2ZmIHRoZSBiYWNrdGlja3MuICovCisgICAgY21kID0gdmltX3N0cm5zYXZlKHBhdCArIDEsIChpbnQpU1RSTEVOKHBhdCkgLSAyKTsKKyAgICBpZiAoY21kID09IE5VTEwpCisJcmV0dXJuIDA7CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBpZiAoKmNtZCA9PSAnPScpCSAgICAvKiBgPXtleHByfWA6IEV4cGFuZCBleHByZXNzaW9uICovCisJYnVmZmVyID0gZXZhbF90b19zdHJpbmcoY21kICsgMSwgJnApOworICAgIGVsc2UKKyNlbmRpZgorCWJ1ZmZlciA9IGdldF9jbWRfb3V0cHV0KGNtZCwgKGZsYWdzICYgRVdfU0lMRU5UKSA/IFNIRUxMX1NJTEVOVCA6IDApOworICAgIHZpbV9mcmVlKGNtZCk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgY21kID0gYnVmZmVyOworICAgIHdoaWxlICgqY21kICE9IE5VTCkKKyAgICB7CisJY21kID0gc2tpcHdoaXRlKGNtZCk7CQkvKiBza2lwIG92ZXIgd2hpdGUgc3BhY2UgKi8KKwlwID0gY21kOworCXdoaWxlICgqcCAhPSBOVUwgJiYgKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nKSAvKiBza2lwIG92ZXIgZW50cnkgKi8KKwkgICAgKytwOworCS8qIGFkZCBhbiBlbnRyeSBpZiBpdCBpcyBub3QgZW1wdHkgKi8KKwlpZiAocCA+IGNtZCkKKwl7CisJICAgIGkgPSAqcDsKKwkgICAgKnAgPSBOVUw7CisJICAgIGFkZGZpbGUoZ2FwLCBjbWQsIGZsYWdzKTsKKwkgICAgKnAgPSBpOworCSAgICArK2NudDsKKwl9CisJY21kID0gcDsKKwl3aGlsZSAoKmNtZCAhPSBOVUwgJiYgKCpjbWQgPT0gJ1xyJyB8fCAqY21kID09ICdcbicpKQorCSAgICArK2NtZDsKKyAgICB9CisKKyAgICB2aW1fZnJlZShidWZmZXIpOworICAgIHJldHVybiBjbnQ7Cit9CisjIGVuZGlmIC8qIFZJTV9CQUNLVElDSyAqLworCisvKgorICogQWRkIGEgZmlsZSB0byBhIGZpbGUgbGlzdC4gIEFjY2VwdGVkIGZsYWdzOgorICogRVdfRElSCWFkZCBkaXJlY3RvcmllcworICogRVdfRklMRQlhZGQgZmlsZXMKKyAqIEVXX05PVEZPVU5ECWFkZCBldmVuIHdoZW4gaXQgZG9lc24ndCBleGlzdAorICogRVdfQUREU0xBU0gJYWRkIHNsYXNoIGFmdGVyIGRpcmVjdG9yeSBuYW1lCisgKi8KKyAgICB2b2lkCithZGRmaWxlKGdhcCwgZiwgZmxhZ3MpCisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBjaGFyX3UJKmY7CS8qIGZpbGVuYW1lICovCisgICAgaW50CQlmbGFnczsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlpc2RpcjsKKworICAgIC8qIGlmIHRoZSBmaWxlL2RpciBkb2Vzbid0IGV4aXN0LCBtYXkgbm90IGFkZCBpdCAqLworICAgIGlmICghKGZsYWdzICYgRVdfTk9URk9VTkQpICYmIG1jaF9nZXRwZXJtKGYpIDwgMCkKKwlyZXR1cm47CisKKyNpZmRlZiBGTkFNRV9JTExFR0FMCisgICAgLyogaWYgdGhlIGZpbGUvZGlyIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycywgZG9uJ3QgYWRkIGl0ICovCisgICAgaWYgKHZpbV9zdHJwYnJrKGYsIChjaGFyX3UgKilGTkFNRV9JTExFR0FMKSAhPSBOVUxMKQorCXJldHVybjsKKyNlbmRpZgorCisgICAgaXNkaXIgPSBtY2hfaXNkaXIoZik7CisgICAgaWYgKChpc2RpciAmJiAhKGZsYWdzICYgRVdfRElSKSkgfHwgKCFpc2RpciAmJiAhKGZsYWdzICYgRVdfRklMRSkpKQorCXJldHVybjsKKworICAgIC8qIE1ha2Ugcm9vbSBmb3IgYW5vdGhlciBpdGVtIGluIHRoZSBmaWxlIGxpc3QuICovCisgICAgaWYgKGdhX2dyb3coZ2FwLCAxKSA9PSBGQUlMKQorCXJldHVybjsKKworICAgIHAgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihmKSArIDEgKyBpc2RpcikpOworICAgIGlmIChwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgU1RSQ1BZKHAsIGYpOworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorICAgIHNsYXNoX2FkanVzdChwKTsKKyNlbmRpZgorICAgIC8qCisgICAgICogQXBwZW5kIGEgc2xhc2ggb3IgYmFja3NsYXNoIGFmdGVyIGRpcmVjdG9yeSBuYW1lcyBpZiBub25lIGlzIHByZXNlbnQuCisgICAgICovCisjaWZuZGVmIERPTlRfQUREX1BBVEhTRVBfVE9fRElSCisgICAgaWYgKGlzZGlyICYmIChmbGFncyAmIEVXX0FERFNMQVNIKSkKKwlhZGRfcGF0aHNlcChwKTsKKyNlbmRpZgorICAgICgoY2hhcl91ICoqKWdhcC0+Z2FfZGF0YSlbZ2FwLT5nYV9sZW4rK10gPSBwOworICAgIC0tZ2FwLT5nYV9yb29tOworfQorI2VuZGlmIC8qICFOT19FWFBBTkRQQVRIICovCisKKyNpZiBkZWZpbmVkKFZJTV9CQUNLVElDSykgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisKKyNpZm5kZWYgU0VFS19TRVQKKyMgZGVmaW5lIFNFRUtfU0VUIDAKKyNlbmRpZgorI2lmbmRlZiBTRUVLX0VORAorIyBkZWZpbmUgU0VFS19FTkQgMgorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIHN0ZG91dCBvZiBhbiBleHRlcm5hbCBjb21tYW5kLgorICogUmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nLCBvciBOVUxMIGZvciBlcnJvci4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfY21kX291dHB1dChjbWQsIGZsYWdzKQorICAgIGNoYXJfdQkqY21kOworICAgIGludAkJZmxhZ3M7CQkvKiBjYW4gYmUgU0hFTExfU0lMRU5UICovCit7CisgICAgY2hhcl91CSp0ZW1wbmFtZTsKKyAgICBjaGFyX3UJKmNvbW1hbmQ7CisgICAgY2hhcl91CSpidWZmZXIgPSBOVUxMOworICAgIGludAkJbGVuOworICAgIGludAkJaSA9IDA7CisgICAgRklMRQkqZmQ7CisKKyAgICBpZiAoY2hlY2tfcmVzdHJpY3RlZCgpIHx8IGNoZWNrX3NlY3VyZSgpKQorCXJldHVybiBOVUxMOworCisgICAgLyogZ2V0IGEgbmFtZSBmb3IgdGhlIHRlbXAgZmlsZSAqLworICAgIGlmICgodGVtcG5hbWUgPSB2aW1fdGVtcG5hbWUoJ28nKSkgPT0gTlVMTCkKKyAgICB7CisJRU1TRyhfKGVfbm90bXApKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBBZGQgdGhlIHJlZGlyZWN0aW9uIHN0dWZmICovCisgICAgY29tbWFuZCA9IG1ha2VfZmlsdGVyX2NtZChjbWQsIE5VTEwsIHRlbXBuYW1lKTsKKyAgICBpZiAoY29tbWFuZCA9PSBOVUxMKQorCWdvdG8gZG9uZTsKKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgc2hlbGwgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAoZXJyb3JzIGFyZSBpZ25vcmVkKS4KKyAgICAgKiBEb24ndCBjaGVjayB0aW1lc3RhbXBzIGhlcmUuCisgICAgICovCisgICAgKytub19jaGVja190aW1lc3RhbXBzOworICAgIGNhbGxfc2hlbGwoY29tbWFuZCwgU0hFTExfRE9PVVQgfCBTSEVMTF9FWFBBTkQgfCBmbGFncyk7CisgICAgLS1ub19jaGVja190aW1lc3RhbXBzOworCisgICAgdmltX2ZyZWUoY29tbWFuZCk7CisKKyAgICAvKgorICAgICAqIHJlYWQgdGhlIG5hbWVzIGZyb20gdGhlIGZpbGUgaW50byBtZW1vcnkKKyAgICAgKi8KKyMgaWZkZWYgVk1TCisgICAgLyogY3JlYXRlZCB0ZW1wb3JhcnkgZmlsZSBpcyBub3QgYWxsd2F5cyByZWFkYWJsZSBhcyBiaW5hcnkgKi8KKyAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKXRlbXBuYW1lLCAiciIpOworIyBlbHNlCisgICAgZmQgPSBtY2hfZm9wZW4oKGNoYXIgKil0ZW1wbmFtZSwgUkVBREJJTik7CisjIGVuZGlmCisKKyAgICBpZiAoZmQgPT0gTlVMTCkKKyAgICB7CisJRU1TRzIoXyhlX25vdG9wZW4pLCB0ZW1wbmFtZSk7CisJZ290byBkb25lOworICAgIH0KKworICAgIGZzZWVrKGZkLCAwTCwgU0VFS19FTkQpOworICAgIGxlbiA9IGZ0ZWxsKGZkKTsJCSAgICAvKiBnZXQgc2l6ZSBvZiB0ZW1wIGZpbGUgKi8KKyAgICBmc2VlayhmZCwgMEwsIFNFRUtfU0VUKTsKKworICAgIGJ1ZmZlciA9IGFsbG9jKGxlbiArIDEpOworICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKwlpID0gKGludClmcmVhZCgoY2hhciAqKWJ1ZmZlciwgKHNpemVfdCkxLCAoc2l6ZV90KWxlbiwgZmQpOworICAgIGZjbG9zZShmZCk7CisgICAgbWNoX3JlbW92ZSh0ZW1wbmFtZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCWdvdG8gZG9uZTsKKyNpZmRlZiBWTVMKKyAgICBsZW4gPSBpOwkvKiBWTVMgZG9lc24ndCBnaXZlIHVzIHdoYXQgd2UgYXNrZWQgZm9yLi4uICovCisjZW5kaWYKKyAgICBpZiAoaSAhPSBsZW4pCisgICAgeworCUVNU0cyKF8oZV9ub3RyZWFkKSwgdGVtcG5hbWUpOworCXZpbV9mcmVlKGJ1ZmZlcik7CisJYnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorCWJ1ZmZlcltsZW5dID0gJ1wwJzsJLyogbWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgdGVybWluYXRlZCAqLworCitkb25lOgorICAgIHZpbV9mcmVlKHRlbXBuYW1lKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorI2VuZGlmCisKKy8qCisgKiBGcmVlIHRoZSBsaXN0IG9mIGZpbGVzIHJldHVybmVkIGJ5IGV4cGFuZF93aWxkY2FyZHMoKSBvciBvdGhlciBleHBhbnNpb24KKyAqIGZ1bmN0aW9ucy4KKyAqLworICAgIHZvaWQKK0ZyZWVXaWxkKGNvdW50LCBmaWxlcykKKyAgICBpbnQJICAgIGNvdW50OworICAgIGNoYXJfdSAgKipmaWxlczsKK3sKKyAgICBpZiAoZmlsZXMgPT0gTlVMTCB8fCBjb3VudCA8PSAwKQorCXJldHVybjsKKyNpZiBkZWZpbmVkKF9fRU1YX18pICYmIGRlZmluZWQoX19BTFdBWVNfSEFTX1RSQUlMSU5HX05VTExfUE9JTlRFUikgLyogWFhYICovCisgICAgLyoKKyAgICAgKiBJcyB0aGlzIHN0aWxsIE9LIGZvciB3aGVuIG90aGVyIGZ1bmN0aW9ucyB0aGFuIGV4cGFuZF93aWxkY2FyZHMoKSBoYXZlCisgICAgICogYmVlbiB1c2VkPz8/CisgICAgICovCisgICAgX2ZuZXhwbG9kZWZyZWUoKGNoYXIgKiopZmlsZXMpOworI2Vsc2UKKyAgICB3aGlsZSAoY291bnQtLSkKKwl2aW1fZnJlZShmaWxlc1tjb3VudF0pOworICAgIHZpbV9mcmVlKGZpbGVzKTsKKyNlbmRpZgorfQorCisvKgorICogcmV0dXJuIFRSVUUgd2hlbiBuZWVkIHRvIGdvIHRvIEluc2VydCBtb2RlIGJlY2F1c2Ugb2YgJ2luc2VydG1vZGUnLgorICogRG9uJ3QgZG8gdGhpcyB3aGVuIHN0aWxsIHByb2Nlc3NpbmcgYSBjb21tYW5kIG9yIGEgbWFwcGluZy4KKyAqIERvbid0IGRvIHRoaXMgd2hlbiBpbnNpZGUgYSAiOm5vcm1hbCIgY29tbWFuZC4KKyAqLworICAgIGludAorZ290b19pbSgpCit7CisgICAgcmV0dXJuIChwX2ltICYmIHN0dWZmX2VtcHR5KCkgJiYgdHlwZWJ1Zl90eXBlZCgpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9taXNjMi5jIGIvc3JjL21pc2MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjNDRhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjMi5jCkBAIC0wLDAgKzEsNTU1NiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogbWlzYzIuYzogVmFyaW91cyBmdW5jdGlvbnMuCisgKi8KKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgkgICAgLyogZm9yIGNoZGlyKCkgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1ZJUlRVQUxFRElUKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludCBjb2xhZHZhbmNlMiBfX0FSR1MoKHBvc19UICpwb3MsIGludCBhZGRzcGFjZXMsIGludCBmaW5ldHVuZSwgY29sbnJfVCB3Y29sKSk7CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBpbiB0aGUgY3VycmVudCBtb2RlIHdlIG5lZWQgdG8gdXNlIHZpcnR1YWwuCisgKi8KKyAgICBpbnQKK3ZpcnR1YWxfYWN0aXZlKCkKK3sKKyAgICAvKiBXaGlsZSBhbiBvcGVyYXRvciBpcyBiZWluZyBleGVjdXRlZCB3ZSByZXR1cm4gInZpcnR1YWxfb3AiLCBiZWNhdXNlCisgICAgICogVklzdWFsX2FjdGl2ZSBoYXMgYWxyZWFkeSBiZWVuIHJlc2V0LCB0aHVzIHdlIGNhbid0IGNoZWNrIGZvciAiYmxvY2siCisgICAgICogYmVpbmcgdXNlZC4gKi8KKyAgICBpZiAodmlydHVhbF9vcCAhPSBNQVlCRSkKKwlyZXR1cm4gdmlydHVhbF9vcDsKKyAgICByZXR1cm4gKHZlX2ZsYWdzID09IFZFX0FMTAorIyBpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICB8fCAoKHZlX2ZsYWdzICYgVkVfQkxPQ0spICYmIFZJc3VhbF9hY3RpdmUgJiYgVklzdWFsX21vZGUgPT0gQ3RybF9WKQorIyBlbmRpZgorCSAgICB8fCAoKHZlX2ZsYWdzICYgVkVfSU5TRVJUKSAmJiAoU3RhdGUgJiBJTlNFUlQpKSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIHNjcmVlbiBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLgorICovCisgICAgaW50CitnZXR2aXNjb2woKQoreworICAgIGNvbG5yX1QJeDsKKworICAgIGdldHZ2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZ4LCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gKGludCl4OworfQorCisvKgorICogR2V0IHRoZSBzY3JlZW4gcG9zaXRpb24gb2YgY2hhcmFjdGVyIGNvbCB3aXRoIGEgY29sYWRkIGluIHRoZSBjdXJzb3IgbGluZS4KKyAqLworICAgIGludAorZ2V0dmlzY29sMihjb2wsIGNvbGFkZCkKKyAgICBjb2xucl9UCWNvbDsKKyAgICBjb2xucl9UCWNvbGFkZDsKK3sKKyAgICBjb2xucl9UCXg7CisgICAgcG9zX1QJcG9zOworCisgICAgcG9zLmxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgcG9zLmNvbCA9IGNvbDsKKyAgICBwb3MuY29sYWRkID0gY29sYWRkOworICAgIGdldHZ2Y29sKGN1cndpbiwgJnBvcywgJngsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiAoaW50KXg7Cit9CisKKy8qCisgKiBHbyB0byBjb2x1bW4gIndjb2wiLCBhbmQgYWRkL2luc2VydCB3aGl0ZSBzcGFjZSBhcyBuZWNjZXNzYXJ5IHRvIGdldCB0aGUKKyAqIGN1cnNvciBpbiB0aGF0IGNvbHVtbi4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHNhdmVkIHRoZSBjdXJzb3IgbGluZSBmb3IgdW5kbyEKKyAqLworICAgIGludAorY29sYWR2YW5jZV9mb3JjZSh3Y29sKQorICAgIGNvbG5yX1Qgd2NvbDsKK3sKKyAgICBpbnQgcmMgPSBjb2xhZHZhbmNlMigmY3Vyd2luLT53X2N1cnNvciwgVFJVRSwgRkFMU0UsIHdjb2wpOworCisgICAgaWYgKHdjb2wgPT0gTUFYQ09MKQorCWN1cndpbi0+d192YWxpZCAmPSB+VkFMSURfVklSVENPTDsKKyAgICBlbHNlCisgICAgeworCS8qIFZpcnRjb2wgaXMgdmFsaWQgKi8KKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVklSVENPTDsKKwljdXJ3aW4tPndfdmlydGNvbCA9IHdjb2w7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisvKgorICogVHJ5IHRvIGFkdmFuY2UgdGhlIEN1cnNvciB0byB0aGUgc3BlY2lmaWVkIHNjcmVlbiBjb2x1bW4uCisgKiBJZiB2aXJ0dWFsIGVkaXRpbmc6IGZpbmUgdHVuZSB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICogTm90ZSB0aGF0IGFsbCB2aXJ0dWFsIHBvc2l0aW9ucyBvZmYgdGhlIGVuZCBvZiBhIGxpbmUgc2hvdWxkIHNoYXJlCisgKiBhIGN1cndpbi0+d19jdXJzb3IuY29sIHZhbHVlIChuLmIuIHRoaXMgaXMgZXF1YWwgdG8gU1RSTEVOKGxpbmUpKSwKKyAqIGJlZ2lubmluZyBhdCBjb2xhZGQgMC4KKyAqCisgKiByZXR1cm4gT0sgaWYgZGVzaXJlZCBjb2x1bW4gaXMgcmVhY2hlZCwgRkFJTCBpZiBub3QKKyAqLworICAgIGludAorY29sYWR2YW5jZSh3Y29sKQorICAgIGNvbG5yX1QJd2NvbDsKK3sKKyAgICBpbnQgcmMgPSBnZXR2cG9zKCZjdXJ3aW4tPndfY3Vyc29yLCB3Y29sKTsKKworICAgIGlmICh3Y29sID09IE1BWENPTCB8fCByYyA9PSBGQUlMKQorCWN1cndpbi0+d192YWxpZCAmPSB+VkFMSURfVklSVENPTDsKKyAgICBlbHNlCisgICAgeworCS8qIFZpcnRjb2wgaXMgdmFsaWQgKi8KKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVklSVENPTDsKKwljdXJ3aW4tPndfdmlydGNvbCA9IHdjb2w7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIFJldHVybiBpbiAicG9zIiB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBhZHZhbmNlZCB0byBzY3JlZW4gY29sdW1uICJ3Y29sIi4KKyAqIHJldHVybiBPSyBpZiBkZXNpcmVkIGNvbHVtbiBpcyByZWFjaGVkLCBGQUlMIGlmIG5vdAorICovCisgICAgaW50CitnZXR2cG9zKHBvcywgd2NvbCkKKyAgICBwb3NfVCAgICpwb3M7CisgICAgY29sbnJfVCB3Y29sOworeworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICByZXR1cm4gY29sYWR2YW5jZTIocG9zLCBGQUxTRSwgdmlydHVhbF9hY3RpdmUoKSwgd2NvbCk7Cit9CisKKyAgICBzdGF0aWMgaW50Citjb2xhZHZhbmNlMihwb3MsIGFkZHNwYWNlcywgZmluZXR1bmUsIHdjb2wpCisgICAgcG9zX1QJKnBvczsKKyAgICBpbnQJCWFkZHNwYWNlczsJLyogY2hhbmdlIHRoZSB0ZXh0IHRvIGFjaGlldmUgb3VyIGdvYWw/ICovCisgICAgaW50CQlmaW5ldHVuZTsJLyogY2hhbmdlIGNoYXIgb2Zmc2V0IGZvciB0aGUgZXhjYWN0IGNvbHVtbiAqLworICAgIGNvbG5yX1QJd2NvbDsJCS8qIGNvbHVtbiB0byBtb3ZlIHRvICovCit7CisjZW5kaWYKKyAgICBpbnQJCWlkeDsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY29sbnJfVAljb2wgPSAwOworICAgIGludAkJY3NpemUgPSAwOworICAgIGludAkJb25lX21vcmU7CisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICBpbnQJCWhlYWQgPSAwOworI2VuZGlmCisKKyAgICBvbmVfbW9yZSA9IChTdGF0ZSAmIElOU0VSVCkgfHwgcmVzdGFydF9lZGl0ICE9IE5VTAorI2lmZGVmIEZFQVRfVklTVUFMCisJCQkJCSAgfHwgKFZJc3VhbF9hY3RpdmUgJiYgKnBfc2VsICE9ICdvJykKKyNlbmRpZgorCQkJCQkgIDsKKyAgICBsaW5lID0gbWxfZ2V0X2N1cmxpbmUoKTsKKworICAgIGlmICh3Y29sID49IE1BWENPTCkKKyAgICB7CisJICAgIGlkeCA9IChpbnQpU1RSTEVOKGxpbmUpIC0gMSArIG9uZV9tb3JlOworCSAgICBjb2wgPSB3Y29sOworCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBpZiAoKGFkZHNwYWNlcyB8fCBmaW5ldHVuZSkgJiYgIVZJc3VhbF9hY3RpdmUpCisJICAgIHsKKwkJY3Vyd2luLT53X2N1cnN3YW50ID0gbGluZXRhYnNpemUobGluZSkgKyBvbmVfbW9yZTsKKwkJaWYgKGN1cndpbi0+d19jdXJzd2FudCA+IDApCisJCSAgICAtLWN1cndpbi0+d19jdXJzd2FudDsKKwkgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWludCB3aWR0aCA9IFdfV0lEVEgoY3Vyd2luKSAtIHdpbl9jb2xfb2ZmKGN1cndpbik7CisKKwlpZiAoKGFkZHNwYWNlcyB8fCBmaW5ldHVuZSkKKwkJJiYgY3Vyd2luLT53X3Bfd3JhcAorIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorCQkmJiBjdXJ3aW4tPndfd2lkdGggIT0gMAorIyBlbmRpZgorCQkmJiB3Y29sID49IChjb2xucl9UKXdpZHRoKQorCXsKKwkgICAgY3NpemUgPSBsaW5ldGFic2l6ZShsaW5lKTsKKwkgICAgaWYgKGNzaXplID4gMCkKKwkJY3NpemUtLTsKKworCSAgICBpZiAod2NvbCAvIHdpZHRoID4gKGNvbG5yX1QpY3NpemUgLyB3aWR0aCkKKwkgICAgeworCQkvKiBJbiBjYXNlIG9mIGxpbmUgd3JhcHBpbmcgZG9uJ3QgbW92ZSB0aGUgY3Vyc29yIGJleW9uZCB0aGUKKwkJICogcmlnaHQgc2NyZWVuIGVkZ2UuICovCisJCXdjb2wgPSAoY3NpemUgLyB3aWR0aCArIDEpICogd2lkdGggLSAxOworCSAgICB9CisJfQorI2VuZGlmCisKKwlpZHggPSAtMTsKKwlwdHIgPSBsaW5lOworCXdoaWxlIChjb2wgPD0gd2NvbCAmJiAqcHRyICE9IE5VTCkKKwl7CisJICAgIC8qIENvdW50IGEgdGFiIGZvciB3aGF0IGl0J3Mgd29ydGggKGlmIGxpc3QgbW9kZSBub3Qgb24pICovCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkgICAgY3NpemUgPSB3aW5fbGJyX2NoYXJ0YWJzaXplKGN1cndpbiwgcHRyLCBjb2wsICZoZWFkKTsKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlwdHIgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwdHIpOworCSAgICBlbHNlCisjIGVuZGlmCisJCSsrcHRyOworI2Vsc2UKKwkgICAgY3NpemUgPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZwdHIsIGNvbCk7CisjZW5kaWYKKwkgICAgY29sICs9IGNzaXplOworCX0KKwlpZHggPSAoaW50KShwdHIgLSBsaW5lKTsKKwkvKgorCSAqIEhhbmRsZSBhbGwgdGhlIHNwZWNpYWwgY2FzZXMuICBUaGUgdmlydHVhbF9hY3RpdmUoKSBjaGVjaworCSAqIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBhIHZpcnR1YWwgcG9zaXRpb24gb2ZmIHRoZSBlbmQgb2YKKwkgKiBhIGxpbmUgaGFzIHRoZSBjb3JyZWN0IGluZGV4aW5nLiAgVGhlIG9uZV9tb3JlIGNvbXBhcmlzb24KKwkgKiByZXBsYWNlcyBhbiBleHBsaWNpdCBhZGQgb2Ygb25lX21vcmUgbGF0ZXIgb24uCisJICovCisJaWYgKGNvbCA+IHdjb2wgfHwgKCF2aXJ0dWFsX2FjdGl2ZSgpICYmIG9uZV9tb3JlID09IDApKQorCXsKKwkgICAgaWR4IC09IDE7CisjIGlmZGVmIEZFQVRfTElORUJSRUFLCisJICAgIC8qIERvbid0IGNvdW50IHRoZSBjaGFycyBmcm9tICdzaG93YnJlYWsnLiAqLworCSAgICBjc2l6ZSAtPSBoZWFkOworIyBlbmRpZgorCSAgICBjb2wgLT0gY3NpemU7CisJfQorCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmICh2aXJ0dWFsX2FjdGl2ZSgpCisJCSYmIGFkZHNwYWNlcworCQkmJiAoKGNvbCAhPSB3Y29sICYmIGNvbCAhPSB3Y29sICsgMSkgfHwgY3NpemUgPiAxKSkKKwl7CisJICAgIC8qICd2aXJ0dWFsZWRpdCcgaXMgc2V0OiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdjb2wgYW5kIGNvbCBpcworCSAgICAgKiBmaWxsZWQgd2l0aCBzcGFjZXMuICovCisKKwkgICAgaWYgKGxpbmVbaWR4XSA9PSBOVUwpCisJICAgIHsKKwkJLyogQXBwZW5kIHNwYWNlcyAqLworCQlpbnQJY29ycmVjdCA9IHdjb2wgLSBjb2w7CisJCWNoYXJfdQkqbmV3bGluZSA9IGFsbG9jKGlkeCArIGNvcnJlY3QgKyAxKTsKKwkJaW50CXQ7CisKKwkJaWYgKG5ld2xpbmUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBGQUlMOworCisJCWZvciAodCA9IDA7IHQgPCBpZHg7ICsrdCkKKwkJICAgIG5ld2xpbmVbdF0gPSBsaW5lW3RdOworCisJCWZvciAodCA9IDA7IHQgPCBjb3JyZWN0OyArK3QpCisJCSAgICBuZXdsaW5lW3QgKyBpZHhdID0gJyAnOworCisJCW5ld2xpbmVbaWR4ICsgY29ycmVjdF0gPSBOVUw7CisKKwkJbWxfcmVwbGFjZShwb3MtPmxudW0sIG5ld2xpbmUsIEZBTFNFKTsKKwkJY2hhbmdlZF9ieXRlcyhwb3MtPmxudW0sIChjb2xucl9UKWlkeCk7CisJCWlkeCArPSBjb3JyZWN0OworCQljb2wgPSB3Y29sOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBCcmVhayBhIHRhYiAqLworCQlpbnQJbGluZWxlbiA9IChpbnQpU1RSTEVOKGxpbmUpOworCQlpbnQJY29ycmVjdCA9IHdjb2wgLSBjb2wgLSBjc2l6ZSArIDE7IC8qIG5lZ2F0aXZlISEgKi8KKwkJY2hhcl91CSpuZXdsaW5lID0gYWxsb2MobGluZWxlbiArIGNzaXplKTsKKwkJaW50CXQsIHMgPSAwOworCQlpbnQJdjsKKworCQkvKgorCQkgKiBicmVhayBhIHRhYgorCQkgKi8KKwkJaWYgKG5ld2xpbmUgPT0gTlVMTCB8fCAtY29ycmVjdCA+IGNzaXplKQorCQkgICAgcmV0dXJuIEZBSUw7CisKKwkJZm9yICh0ID0gMDsgdCA8IGxpbmVsZW47IHQrKykKKwkJeworCQkgICAgaWYgKHQgIT0gaWR4KQorCQkJbmV3bGluZVtzKytdID0gbGluZVt0XTsKKwkJICAgIGVsc2UKKwkJCWZvciAodiA9IDA7IHYgPCBjc2l6ZTsgdisrKQorCQkJICAgIG5ld2xpbmVbcysrXSA9ICcgJzsKKwkJfQorCisJCW5ld2xpbmVbbGluZWxlbiArIGNzaXplIC0gMV0gPSBOVUw7CisKKwkJbWxfcmVwbGFjZShwb3MtPmxudW0sIG5ld2xpbmUsIEZBTFNFKTsKKwkJY2hhbmdlZF9ieXRlcyhwb3MtPmxudW0sIGlkeCk7CisJCWlkeCArPSAoY3NpemUgLSAxICsgY29ycmVjdCk7CisJCWNvbCArPSBjb3JyZWN0OworCSAgICB9CisJfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKGlkeCA8IDApCisJcG9zLT5jb2wgPSAwOworICAgIGVsc2UKKwlwb3MtPmNvbCA9IGlkeDsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBwb3MtPmNvbGFkZCA9IDA7CisKKyAgICBpZiAoZmluZXR1bmUpCisgICAgeworCWlmICh3Y29sID09IE1BWENPTCkKKwl7CisJICAgIC8qIFRoZSB3aWR0aCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgdXNlZCB0byBzZXQgY29sYWRkLiAqLworCSAgICBpZiAoIW9uZV9tb3JlKQorCSAgICB7CisJCWNvbG5yX1QJICAgIHNjb2wsIGVjb2w7CisKKwkJZ2V0dmNvbChjdXJ3aW4sIHBvcywgJnNjb2wsIE5VTEwsICZlY29sKTsKKwkJcG9zLT5jb2xhZGQgPSBlY29sIC0gc2NvbDsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBpbnQgYiA9IChpbnQpd2NvbCAtIChpbnQpY29sOworCisJICAgIC8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2NvbCBhbmQgY29sIGlzIHVzZWQgdG8gc2V0IGNvbGFkZC4gKi8KKwkgICAgaWYgKGIgPiAwICYmIGIgPCAoTUFYQ09MIC0gMiAqIFdfV0lEVEgoY3Vyd2luKSkpCisJCXBvcy0+Y29sYWRkID0gYjsKKworCSAgICBjb2wgKz0gYjsKKwl9CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogcHJldmVudCBjdXJzb3IgZnJvbSBtb3Zpbmcgb24gdGhlIHRyYWlsIGJ5dGUgKi8KKyAgICBpZiAoaGFzX21ieXRlKQorCW1iX2FkanVzdF9jdXJzb3IoKTsKKyNlbmRpZgorCisgICAgaWYgKGNvbCA8IHdjb2wpCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogaW5jKHApCisgKgorICogSW5jcmVtZW50IHRoZSBsaW5lIHBvaW50ZXIgJ3AnIGNyb3NzaW5nIGxpbmUgYm91bmRhcmllcyBhcyBuZWNlc3NhcnkuCisgKiBSZXR1cm4gMSB3aGVuIGdvaW5nIHRvIHRoZSBuZXh0IGxpbmUuCisgKiBSZXR1cm4gMiB3aGVuIG1vdmluZyBmb3J3YXJkIG9udG8gYSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkuCisgKiBSZXR1cm4gLTEgd2hlbiBhdCB0aGUgZW5kIG9mIGZpbGUuCisgKiBSZXR1cm4gMCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2luY19jdXJzb3IoKQoreworICAgIHJldHVybiBpbmMoJmN1cndpbi0+d19jdXJzb3IpOworfQorCisgICAgaW50CitpbmMobHApCisgICAgcG9zX1QgICpscDsKK3sKKyAgICBjaGFyX3UgICpwID0gbWxfZ2V0X3BvcyhscCk7CisKKyAgICBpZiAoKnAgIT0gTlVMKQkvKiBzdGlsbCB3aXRoaW4gbGluZSwgbW92ZSB0byBuZXh0IGNoYXIgKG1heSBiZSBOVUwpICovCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50IGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCisJICAgIGxwLT5jb2wgKz0gbDsKKwkgICAgcmV0dXJuICgocFtsXSAhPSBOVUwpID8gMCA6IDIpOworCX0KKyNlbmRpZgorCWxwLT5jb2wrKzsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJbHAtPmNvbGFkZCA9IDA7CisjZW5kaWYKKwlyZXR1cm4gKChwWzFdICE9IE5VTCkgPyAwIDogMik7CisgICAgfQorICAgIGlmIChscC0+bG51bSAhPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkgICAgIC8qIHRoZXJlIGlzIGEgbmV4dCBsaW5lICovCisgICAgeworCWxwLT5jb2wgPSAwOworCWxwLT5sbnVtKys7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWxwLT5jb2xhZGQgPSAwOworI2VuZGlmCisJcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIGluY2wobHApOiBzYW1lIGFzIGluYygpLCBidXQgc2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2Ygbm9uLWVtcHR5IGxpbmVzCisgKi8KKyAgICBpbnQKK2luY2wobHApCisgICAgcG9zX1QgICAgKmxwOworeworICAgIGludAkgICAgcjsKKworICAgIGlmICgociA9IGluYyhscCkpID49IDEgJiYgbHAtPmNvbCkKKwlyID0gaW5jKGxwKTsKKyAgICByZXR1cm4gcjsKK30KKworLyoKKyAqIGRlYyhwKQorICoKKyAqIERlY3JlbWVudCB0aGUgbGluZSBwb2ludGVyICdwJyBjcm9zc2luZyBsaW5lIGJvdW5kYXJpZXMgYXMgbmVjZXNzYXJ5LgorICogUmV0dXJuIDEgd2hlbiBjcm9zc2luZyBhIGxpbmUsIC0xIHdoZW4gYXQgc3RhcnQgb2YgZmlsZSwgMCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2RlY19jdXJzb3IoKQoreworICAgIHJldHVybiBkZWMoJmN1cndpbi0+d19jdXJzb3IpOworfQorCisgICAgaW50CitkZWMobHApCisgICAgcG9zX1QgICpscDsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgbHAtPmNvbGFkZCA9IDA7CisjZW5kaWYKKyAgICBpZiAobHAtPmNvbCA+IDApCQkvKiBzdGlsbCB3aXRoaW4gbGluZSAqLworICAgIHsKKwlscC0+Y29sLS07CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICBwID0gbWxfZ2V0KGxwLT5sbnVtKTsKKwkgICAgbHAtPmNvbCAtPSAoKm1iX2hlYWRfb2ZmKShwLCBwICsgbHAtPmNvbCk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChscC0+bG51bSA+IDEpCQkvKiB0aGVyZSBpcyBhIHByaW9yIGxpbmUgKi8KKyAgICB7CisJbHAtPmxudW0tLTsKKwlwID0gbWxfZ2V0KGxwLT5sbnVtKTsKKwlscC0+Y29sID0gKGNvbG5yX1QpU1RSTEVOKHApOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBscC0+Y29sIC09ICgqbWJfaGVhZF9vZmYpKHAsIHAgKyBscC0+Y29sKTsKKyNlbmRpZgorCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gLTE7CQkJLyogYXQgc3RhcnQgb2YgZmlsZSAqLworfQorCisvKgorICogZGVjbChscCk6IHNhbWUgYXMgZGVjKCksIGJ1dCBza2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiBub24tZW1wdHkgbGluZXMKKyAqLworICAgIGludAorZGVjbChscCkKKyAgICBwb3NfVCAgICAqbHA7Cit7CisgICAgaW50CSAgICByOworCisgICAgaWYgKChyID0gZGVjKGxwKSkgPT0gMSAmJiBscC0+Y29sKQorCXIgPSBkZWMobHApOworICAgIHJldHVybiByOworfQorCisvKgorICogTWFrZSBzdXJlIGN1cndpbi0+d19jdXJzb3IubG51bSBpcyB2YWxpZC4KKyAqLworICAgIHZvaWQKK2NoZWNrX2N1cnNvcl9sbnVtKCkKK3sKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCS8qIElmIHRoZXJlIGlzIGEgY2xvc2VkIGZvbGQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgcHV0IHRoZSBjdXJzb3IgaW4KKwkgKiBpdHMgZmlyc3QgbGluZS4gIE90aGVyd2lzZSBpbiB0aGUgbGFzdCBsaW5lLiAqLworCWlmICghaGFzRm9sZGluZyhjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwKKwkJCQkJCSZjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwpKQorI2VuZGlmCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIH0KKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDw9IDApCisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gMTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSBjdXJ3aW4tPndfY3Vyc29yLmNvbCBpcyB2YWxpZC4KKyAqLworICAgIHZvaWQKK2NoZWNrX2N1cnNvcl9jb2woKQoreworICAgIGNvbG5yX1QgbGVuOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjb2xucl9UIG9sZGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sICsgY3Vyd2luLT53X2N1cnNvci5jb2xhZGQ7CisjZW5kaWYKKworICAgIGxlbiA9IChjb2xucl9UKVNUUkxFTihtbF9nZXRfY3VybGluZSgpKTsKKyAgICBpZiAobGVuID09IDApCisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIGVsc2UgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID49IGxlbikKKyAgICB7CisJLyogQWxsb3cgY3Vyc29yIHBhc3QgZW5kLW9mLWxpbmUgaW4gSW5zZXJ0IG1vZGUsIHJlc3RhcnRpbmcgSW5zZXJ0CisJICogbW9kZSBvciB3aGVuIGluIFZpc3VhbCBtb2RlIGFuZCAnc2VsZWN0aW9uJyBpc24ndCAib2xkIiAqLworCWlmIChTdGF0ZSAmIElOU0VSVCB8fCByZXN0YXJ0X2VkaXQKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQl8fCAoVklzdWFsX2FjdGl2ZSAmJiAqcF9zZWwgIT0gJ28nKQorI2VuZGlmCisJCXx8IHZpcnR1YWxfYWN0aXZlKCkpCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gbGVuOworCWVsc2UKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBsZW4gLSAxOworICAgIH0KKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICAvKiBJZiB2aXJ0dWFsIGVkaXRpbmcgaXMgb24sIHdlIGNhbiBsZWF2ZSB0aGUgY3Vyc29yIG9uIHRoZSBvbGQgcG9zaXRpb24sCisgICAgICogb25seSB3ZSBtdXN0IHNldCBpdCB0byB2aXJ0dWFsLiAgQnV0IGRvbid0IGRvIGl0IHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBsaW5lLiAqLworICAgIGlmIChvbGRjb2wgPT0gTUFYQ09MKQorCWN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyAgICBlbHNlIGlmICh2ZV9mbGFncyA9PSBWRV9BTEwpCisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSBvbGRjb2wgLSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyNlbmRpZgorfQorCisvKgorICogbWFrZSBzdXJlIGN1cndpbi0+d19jdXJzb3IgaW4gb24gYSB2YWxpZCBjaGFyYWN0ZXIKKyAqLworICAgIHZvaWQKK2NoZWNrX2N1cnNvcigpCit7CisgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKyAgICBjaGVja19jdXJzb3JfY29sKCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVEVYVE9CSikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBNYWtlIHN1cmUgY3Vyd2luLT53X2N1cnNvciBpcyBub3Qgb24gdGhlIE5VTCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICogQWxsb3cgaXQgd2hlbiBpbiBWaXN1YWwgbW9kZSBhbmQgJ3NlbGVjdGlvbicgaXMgbm90ICJvbGQiLgorICovCisgICAgdm9pZAorYWRqdXN0X2N1cnNvcl9jb2woKQoreworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAKKyMgaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgJiYgKCFWSXN1YWxfYWN0aXZlIHx8ICpwX3NlbCA9PSAnbycpCisjIGVuZGlmCisJICAgICYmIGdjaGFyX2N1cnNvcigpID09IE5VTCkKKwktLWN1cndpbi0+d19jdXJzb3IuY29sOworfQorI2VuZGlmCisKKy8qCisgKiBXaGVuIGN1cndpbi0+d19sZWZ0Y29sIGhhcyBjaGFuZ2VkLCBhZGp1c3QgdGhlIGN1cnNvciBwb3NpdGlvbi4KKyAqIFJldHVybiBUUlVFIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkLgorICovCisgICAgaW50CitsZWZ0Y29sX2NoYW5nZWQoKQoreworICAgIGxvbmcJbGFzdGNvbDsKKyAgICBjb2xucl9UCXMsIGU7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKworICAgIGNoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKTsKKyAgICBsYXN0Y29sID0gY3Vyd2luLT53X2xlZnRjb2wgKyBXX1dJRFRIKGN1cndpbikgLSBjdXJ3aW5fY29sX29mZigpIC0gMTsKKyAgICB2YWxpZGF0ZV92aXJ0Y29sKCk7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjdXJzb3IgaXMgcmlnaHQgb3IgbGVmdCBvZiB0aGUgc2NyZWVuLCBtb3ZlIGl0IHRvIGxhc3Qgb3IgZmlyc3QKKyAgICAgKiBjaGFyYWN0ZXIuCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d192aXJ0Y29sID4gKGNvbG5yX1QpKGxhc3Rjb2wgLSBwX3Npc28pKQorICAgIHsKKwlyZXR2YWwgPSBUUlVFOworCWNvbGFkdmFuY2UoKGNvbG5yX1QpKGxhc3Rjb2wgLSBwX3Npc28pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyd2luLT53X3ZpcnRjb2wgPCBjdXJ3aW4tPndfbGVmdGNvbCArIHBfc2lzbykKKyAgICB7CisJcmV0dmFsID0gVFJVRTsKKwkodm9pZCljb2xhZHZhbmNlKChjb2xucl9UKShjdXJ3aW4tPndfbGVmdGNvbCArIHBfc2lzbykpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlIHN0YXJ0IG9mIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciBpcyBub3Qgb24gdGhlIHNjcmVlbiwKKyAgICAgKiBhZHZhbmNlIHRoZSBjdXJzb3Igb25lIG1vcmUgY2hhci4gIElmIHRoaXMgZmFpbHMgKGxhc3QgY2hhciBvZiB0aGUKKyAgICAgKiBsaW5lKSBhZGp1c3QgdGhlIHNjcm9sbGluZy4KKyAgICAgKi8KKyAgICBnZXR2dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmcywgTlVMTCwgJmUpOworICAgIGlmIChlID4gKGNvbG5yX1QpbGFzdGNvbCkKKyAgICB7CisJcmV0dmFsID0gVFJVRTsKKwljb2xhZHZhbmNlKHMgLSAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAocyA8IGN1cndpbi0+d19sZWZ0Y29sKQorICAgIHsKKwlyZXR2YWwgPSBUUlVFOworCWlmIChjb2xhZHZhbmNlKGUgKyAxKSA9PSBGQUlMKQkvKiB0aGVyZSBpc24ndCBhbm90aGVyIGNoYXJhY3RlciAqLworCXsKKwkgICAgY3Vyd2luLT53X2xlZnRjb2wgPSBzOwkvKiBhZGp1c3Qgd19sZWZ0Y29sIGluc3RlYWQgKi8KKwkgICAgY2hhbmdlZF9jbGluZV9iZWZfY3VycygpOworCX0KKyAgICB9CisKKyAgICBpZiAocmV0dmFsKQorCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworICAgIHJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpb3VzIHJvdXRpbmVzIGRlYWxpbmcgd2l0aCBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gb2YgbWVtb3J5LgorICovCisKKyNpZiBkZWZpbmVkKE1FTV9QUk9GSUxFKSB8fCBkZWZpbmVkKFBST1RPKQorCisjIGRlZmluZSBNRU1fU0laRVMgIDgyMDAKK3N0YXRpYyBsb25nX3UgbWVtX2FsbG9jc1tNRU1fU0laRVNdOworc3RhdGljIGxvbmdfdSBtZW1fZnJlZXNbTUVNX1NJWkVTXTsKK3N0YXRpYyBsb25nX3UgbWVtX2FsbG9jYXRlZDsKK3N0YXRpYyBsb25nX3UgbWVtX2ZyZWVkOworc3RhdGljIGxvbmdfdSBtZW1fcGVhazsKK3N0YXRpYyBsb25nX3UgbnVtX2FsbG9jOworc3RhdGljIGxvbmdfdSBudW1fZnJlZWQ7CisKK3N0YXRpYyB2b2lkIG1lbV9wcmVfYWxsb2NfcyBfX0FSR1MoKHNpemVfdCAqc2l6ZXApKTsKK3N0YXRpYyB2b2lkIG1lbV9wcmVfYWxsb2NfbCBfX0FSR1MoKGxvbmdfdSAqc2l6ZXApKTsKK3N0YXRpYyB2b2lkIG1lbV9wb3N0X2FsbG9jIF9fQVJHUygodm9pZCAqKnBwLCBzaXplX3Qgc2l6ZSkpOworc3RhdGljIHZvaWQgbWVtX3ByZV9mcmVlIF9fQVJHUygodm9pZCAqKnBwKSk7CisKKyAgICBzdGF0aWMgdm9pZAorbWVtX3ByZV9hbGxvY19zKHNpemVwKQorICAgIHNpemVfdCAqc2l6ZXA7Cit7CisgICAgKnNpemVwICs9IHNpemVvZihzaXplX3QpOworfQorCisgICAgc3RhdGljIHZvaWQKK21lbV9wcmVfYWxsb2NfbChzaXplcCkKKyAgICBsb25nX3UgKnNpemVwOworeworICAgICpzaXplcCArPSBzaXplb2Yoc2l6ZV90KTsKK30KKworICAgIHN0YXRpYyB2b2lkCittZW1fcG9zdF9hbGxvYyhwcCwgc2l6ZSkKKyAgICB2b2lkICoqcHA7CisgICAgc2l6ZV90IHNpemU7Cit7CisgICAgaWYgKCpwcCA9PSBOVUxMKQorCXJldHVybjsKKyAgICBzaXplIC09IHNpemVvZihzaXplX3QpOworICAgICoobG9uZ191ICopKnBwID0gc2l6ZTsKKyAgICBpZiAoc2l6ZSA8PSBNRU1fU0laRVMtMSkKKwltZW1fYWxsb2NzW3NpemUtMV0rKzsKKyAgICBlbHNlCisJbWVtX2FsbG9jc1tNRU1fU0laRVMtMV0rKzsKKyAgICBtZW1fYWxsb2NhdGVkICs9IHNpemU7CisgICAgaWYgKG1lbV9hbGxvY2F0ZWQgLSBtZW1fZnJlZWQgPiBtZW1fcGVhaykKKwltZW1fcGVhayA9IG1lbV9hbGxvY2F0ZWQgLSBtZW1fZnJlZWQ7CisgICAgbnVtX2FsbG9jKys7CisgICAgKnBwID0gKHZvaWQgKikoKGNoYXIgKikqcHAgKyBzaXplb2Yoc2l6ZV90KSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbWVtX3ByZV9mcmVlKHBwKQorICAgIHZvaWQgKipwcDsKK3sKKyAgICBsb25nX3Ugc2l6ZTsKKworICAgICpwcCA9ICh2b2lkICopKChjaGFyICopKnBwIC0gc2l6ZW9mKHNpemVfdCkpOworICAgIHNpemUgPSAqKHNpemVfdCAqKSpwcDsKKyAgICBpZiAoc2l6ZSA8PSBNRU1fU0laRVMtMSkKKwltZW1fZnJlZXNbc2l6ZS0xXSsrOworICAgIGVsc2UKKwltZW1fZnJlZXNbTUVNX1NJWkVTLTFdKys7CisgICAgbWVtX2ZyZWVkICs9IHNpemU7CisgICAgbnVtX2ZyZWVkKys7Cit9CisKKy8qCisgKiBjYWxsZWQgb24gZXhpdCB2aWEgYXRleGl0KCkKKyAqLworICAgIHZvaWQKK3ZpbV9tZW1fcHJvZmlsZV9kdW1wKCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIHByaW50ZigiXHJcbiIpOworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBNRU1fU0laRVMgLSAxOyBpKyspCisgICAgeworCWlmIChtZW1fYWxsb2NzW2ldIHx8IG1lbV9mcmVlc1tpXSkKKwl7CisJICAgIGlmIChtZW1fZnJlZXNbaV0gPiBtZW1fYWxsb2NzW2ldKQorCQlwcmludGYoIlxyXG4lcyIsIF8oIkVSUk9SOiAiKSk7CisJICAgIHByaW50ZigiWyU0ZCAvICU0bHUtJS00bHVdICIsIGkgKyAxLCBtZW1fYWxsb2NzW2ldLCBtZW1fZnJlZXNbaV0pOworCSAgICBqKys7CisJICAgIGlmIChqID4gMykKKwkgICAgeworCQlqID0gMDsKKwkJcHJpbnRmKCJcclxuIik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaSA9IE1FTV9TSVpFUyAtIDE7CisgICAgaWYgKG1lbV9hbGxvY3NbaV0pCisgICAgeworCXByaW50ZigiXHJcbiIpOworCWlmIChtZW1fZnJlZXNbaV0gPiBtZW1fYWxsb2NzW2ldKQorCSAgICBwcmludGYoXygiRVJST1I6ICIpKTsKKwlwcmludGYoIls+JWQgLyAlNGx1LSUtNGx1XSIsIGksIG1lbV9hbGxvY3NbaV0sIG1lbV9mcmVlc1tpXSk7CisgICAgfQorCisgICAgcHJpbnRmKF8oIlxuW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIpLAorCSAgICBtZW1fYWxsb2NhdGVkLCBtZW1fZnJlZWQsIG1lbV9hbGxvY2F0ZWQgLSBtZW1fZnJlZWQsIG1lbV9wZWFrKTsKKyAgICBwcmludGYoXygiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG5cbiIpLAorCSAgICBudW1fYWxsb2MsIG51bV9mcmVlZCk7Cit9CisKKyNlbmRpZiAvKiBNRU1fUFJPRklMRSAqLworCisvKgorICogU29tZSBtZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIGVycm9yIG1lc3NhZ2VzIGFuZCBmb3IgYmVpbmcgYWJsZSB0bworICogY2FsbCBtZl9yZWxlYXNlX2FsbCgpLCB3aGljaCBuZWVkcyBzb21lIG1lbW9yeSBmb3IgbWZfdHJhbnNfYWRkKCkuCisgKi8KKyNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChESkdQUCkKKyMgZGVmaW5lIFNNQUxMX01FTQorIyBkZWZpbmUgS0VFUF9ST09NIDgxOTJMCisjZWxzZQorIyBkZWZpbmUgS0VFUF9ST09NICgyICogODE5MkwpCisjZW5kaWYKKworLyoKKyAqIE5vdGU6IGlmIHVuc2luZ2VkIGlzIDE2IGJpdHMgd2UgY2FuIG9ubHkgYWxsb2NhdGUgdXAgdG8gNjRLIHdpdGggYWxsb2MoKS4KKyAqIFVzZSBsYWxsb2MgZm9yIGxhcmdlciBibG9ja3MuCisgKi8KKyAgICBjaGFyX3UgKgorYWxsb2Moc2l6ZSkKKyAgICB1bnNpZ25lZAkgICAgc2l6ZTsKK3sKKyAgICByZXR1cm4gKGxhbGxvYygobG9uZ191KXNpemUsIFRSVUUpKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBhbmQgc2V0IGFsbCBieXRlcyB0byB6ZXJvLgorICovCisgICAgY2hhcl91ICoKK2FsbG9jX2NsZWFyKHNpemUpCisgICAgdW5zaWduZWQJICAgIHNpemU7Cit7CisgICAgY2hhcl91ICpwOworCisgICAgcCA9IChsYWxsb2MoKGxvbmdfdSlzaXplLCBUUlVFKSk7CisgICAgaWYgKHAgIT0gTlVMTCkKKwkodm9pZCl2aW1fbWVtc2V0KHAsIDAsIChzaXplX3Qpc2l6ZSk7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBhbGxvYygpIHdpdGggY2hlY2sgZm9yIG1heGltdW0gbGluZSBsZW5ndGgKKyAqLworICAgIGNoYXJfdSAqCithbGxvY19jaGVjayhzaXplKQorICAgIHVuc2lnbmVkCSAgICBzaXplOworeworI2lmICFkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKF9fRU1YX18pCisgICAgaWYgKHNpemVvZihpbnQpID09IDIgJiYgc2l6ZSA+IDB4N2ZmZikKKyAgICB7CisJLyogRG9uJ3QgaGlkZSB0aGlzIG1lc3NhZ2UgKi8KKwllbXNnX3NpbGVudCA9IDA7CisJRU1TRyhfKCJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIikpOworCXJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAobGFsbG9jKChsb25nX3Upc2l6ZSwgVFJVRSkpOworfQorCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGxpa2UgbGFsbG9jKCkgYW5kIHNldCBhbGwgYnl0ZXMgdG8gemVyby4KKyAqLworICAgIGNoYXJfdSAqCitsYWxsb2NfY2xlYXIoc2l6ZSwgbWVzc2FnZSkKKyAgICBsb25nX3UJc2l6ZTsKKyAgICBpbnQJCW1lc3NhZ2U7Cit7CisgICAgY2hhcl91ICpwOworCisgICAgcCA9IChsYWxsb2Moc2l6ZSwgbWVzc2FnZSkpOworICAgIGlmIChwICE9IE5VTEwpCisJKHZvaWQpdmltX21lbXNldChwLCAwLCAoc2l6ZV90KXNpemUpOworICAgIHJldHVybiBwOworfQorCisvKgorICogTG93IGxldmVsIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICogVGhpcyBpcyB1c2VkIG9mdGVuLCBLRUVQIElUIEZBU1QhCisgKi8KKyAgICBjaGFyX3UgKgorbGFsbG9jKHNpemUsIG1lc3NhZ2UpCisgICAgbG9uZ191CXNpemU7CisgICAgaW50CQltZXNzYWdlOworeworICAgIGNoYXJfdQkqcDsJCSAgICAvKiBwb2ludGVyIHRvIG5ldyBzdG9yYWdlIHNwYWNlICovCisgICAgc3RhdGljIGludAlyZWxlYXNpbmcgPSBGQUxTRTsgIC8qIGRvbid0IGRvIG1mX3JlbGVhc2VfYWxsKCkgcmVjdXJzaXZlICovCisgICAgaW50CQl0cnlfYWdhaW47CisjaWYgZGVmaW5lZChIQVZFX0FWQUlMX01FTSkgJiYgIWRlZmluZWQoU01BTExfTUVNKQorICAgIHN0YXRpYyBsb25nX3UgYWxsb2NhdGVkID0gMDsgICAgLyogYWxsb2NhdGVkIHNpbmNlIGxhc3QgYXZhaWwgY2hlY2sgKi8KKyNlbmRpZgorCisgICAgLyogU2FmZXR5IGNoZWNrIGZvciBhbGxvY2F0aW5nIHplcm8gYnl0ZXMgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgIHsKKwkvKiBEb24ndCBoaWRlIHRoaXMgbWVzc2FnZSAqLworCWVtc2dfc2lsZW50ID0gMDsKKwlFTVNHTihfKCJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIpLCBzaXplKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBNRU1fUFJPRklMRQorICAgIG1lbV9wcmVfYWxsb2NfbCgmc2l6ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKERKR1BQKQorICAgIGlmIChzaXplID49IDB4ZmZmMCkJCS8qIGluIE1TRE9TIHdlIGNhbid0IGRlYWwgd2l0aCA+NjRLIGJsb2NrcyAqLworCXAgPSBOVUxMOworICAgIGVsc2UKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBMb29wIHdoZW4gb3V0IG9mIG1lbW9yeTogVHJ5IHRvIHJlbGVhc2Ugc29tZSBtZW1maWxlIGJsb2NrcyBhbmQKKyAgICAgKiBpZiBzb21lIGJsb2NrcyBhcmUgcmVsZWFzZWQgY2FsbCBtYWxsb2MgYWdhaW4uCisgICAgICovCisgICAgZm9yICg7OykKKyAgICB7CisJLyoKKwkgKiBIYW5kbGUgdGhyZWUga2luZCBvZiBzeXN0ZW1zOgorCSAqIDEuIE5vIGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBKdXN0IHJldHVybi4KKwkgKiAyLiBTbG93IGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBjYWxsIG1jaF9hdmFpbF9tZW0oKSBhZnRlcgorCSAqICAgIGFsbG9jYXRpbmcgS0VFUF9ST09NIGFtb3VudCBvZiBtZW1vcnkuCisJICogMy4gU3RyaWN0IGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBjYWxsIG1jaF9hdmFpbF9tZW0oKQorCSAqLworCWlmICgocCA9IChjaGFyX3UgKiltYWxsb2MoKHNpemVfdClzaXplKSkgIT0gTlVMTCkKKwl7CisjaWZuZGVmIEhBVkVfQVZBSUxfTUVNCisJICAgIC8qIDEuIE5vIGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBKdXN0IHJldHVybi4gKi8KKwkgICAgZ290byB0aGVlbmQ7CisjZWxzZQorIyBpZm5kZWYgU01BTExfTUVNCisJICAgIC8qIDIuIFNsb3cgY2hlY2sgZm9yIGF2YWlsYWJsZSBtZW1vcnk6IGNhbGwgbWNoX2F2YWlsX21lbSgpIGFmdGVyCisJICAgICAqICAgIGFsbG9jYXRpbmcgKEtFRVBfUk9PTSAvIDIpIGFtb3VudCBvZiBtZW1vcnkuICovCisJICAgIGFsbG9jYXRlZCArPSBzaXplOworCSAgICBpZiAoYWxsb2NhdGVkIDwgS0VFUF9ST09NIC8gMikKKwkJZ290byB0aGVlbmQ7CisJICAgIGFsbG9jYXRlZCA9IDA7CisjIGVuZGlmCisJICAgIC8qIDMuIGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBjYWxsIG1jaF9hdmFpbF9tZW0oKSAqLworCSAgICBpZiAobWNoX2F2YWlsX21lbShUUlVFKSA8IEtFRVBfUk9PTSAmJiAhcmVsZWFzaW5nKQorCSAgICB7CisJCXZpbV9mcmVlKChjaGFyICopcCk7CS8qIFN5c3RlbSBpcyBsb3cuLi4gbm8gZ28hICovCisJCXAgPSBOVUxMOworCSAgICB9CisJICAgIGVsc2UKKwkJZ290byB0aGVlbmQ7CisjZW5kaWYKKwl9CisJLyoKKwkgKiBSZW1lbWJlciB0aGF0IG1mX3JlbGVhc2VfYWxsKCkgaXMgYmVpbmcgY2FsbGVkIHRvIGF2b2lkIGFuIGVuZGxlc3MKKwkgKiBsb29wLCBiZWNhdXNlIG1mX3JlbGVhc2VfYWxsKCkgbWF5IGNhbGwgYWxsb2MoKSByZWN1cnNpdmVseS4KKwkgKi8KKwlpZiAocmVsZWFzaW5nKQorCSAgICBicmVhazsKKwlyZWxlYXNpbmcgPSBUUlVFOworCXRyeV9hZ2FpbiA9IG1mX3JlbGVhc2VfYWxsKCk7CisJcmVsZWFzaW5nID0gRkFMU0U7CisJaWYgKCF0cnlfYWdhaW4pCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtZXNzYWdlICYmIHAgPT0gTlVMTCkKKwlkb19vdXRvZm1lbV9tc2coc2l6ZSk7CisKK3RoZWVuZDoKKyNpZmRlZiBNRU1fUFJPRklMRQorICAgIG1lbV9wb3N0X2FsbG9jKCh2b2lkICoqKSZwLCAoc2l6ZV90KXNpemUpOworI2VuZGlmCisgICAgcmV0dXJuIHA7Cit9CisKKyNpZiBkZWZpbmVkKE1FTV9QUk9GSUxFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHJlYWxsb2MoKSB3aXRoIG1lbW9yeSBwcm9maWxpbmcuCisgKi8KKyAgICB2b2lkICoKK21lbV9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICB2b2lkICpwdHI7CisgICAgc2l6ZV90IHNpemU7Cit7CisgICAgdm9pZCAqcDsKKworICAgIG1lbV9wcmVfZnJlZSgmcHRyKTsKKyAgICBtZW1fcHJlX2FsbG9jX3MoJnNpemUpOworCisgICAgcCA9IHJlYWxsb2MocHRyLCBzaXplKTsKKworICAgIG1lbV9wb3N0X2FsbG9jKCZwLCBzaXplKTsKKworICAgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qCisqIEF2b2lkIHJlcGVhdGluZyB0aGUgZXJyb3IgbWVzc2FnZSBtYW55IHRpbWVzICh0aGV5IHRha2UgMSBzZWNvbmQgZWFjaCkuCisqIERpZF9vdXRvZm1lbV9tc2cgaXMgcmVzZXQgd2hlbiBhIGNoYXJhY3RlciBpcyByZWFkLgorKi8KKyAgICB2b2lkCitkb19vdXRvZm1lbV9tc2coc2l6ZSkKKyAgICBsb25nX3UJc2l6ZTsKK3sKKyAgICBpZiAoIWRpZF9vdXRvZm1lbV9tc2cpCisgICAgeworCS8qIERvbid0IGhpZGUgdGhpcyBtZXNzYWdlICovCisJZW1zZ19zaWxlbnQgPSAwOworCUVNU0dOKF8oIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIiksIHNpemUpOworCWRpZF9vdXRvZm1lbV9tc2cgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqIGNvcHkgYSBzdHJpbmcgaW50byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5CisgKi8KKyAgICBjaGFyX3UgKgordmltX3N0cnNhdmUoc3RyaW5nKQorICAgIGNoYXJfdQkqc3RyaW5nOworeworICAgIGNoYXJfdQkqcDsKKyAgICB1bnNpZ25lZAlsZW47CisKKyAgICBsZW4gPSAodW5zaWduZWQpU1RSTEVOKHN0cmluZykgKyAxOworICAgIHAgPSBhbGxvYyhsZW4pOworICAgIGlmIChwICE9IE5VTEwpCisJbWNoX21lbW1vdmUocCwgc3RyaW5nLCAoc2l6ZV90KWxlbik7CisgICAgcmV0dXJuIHA7Cit9CisKKyAgICBjaGFyX3UgKgordmltX3N0cm5zYXZlKHN0cmluZywgbGVuKQorICAgIGNoYXJfdQkqc3RyaW5nOworICAgIGludAkJbGVuOworeworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBhbGxvYygodW5zaWduZWQpKGxlbiArIDEpKTsKKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwlTVFJOQ1BZKHAsIHN0cmluZywgbGVuKTsKKwlwW2xlbl0gPSBOVUw7CisgICAgfQorICAgIHJldHVybiBwOworfQorCisjaWYgMAkvKiBub3QgdXNlZCAqLworLyoKKyAqIGxpa2UgdmltX3N0cm5zYXZlKCksIGJ1dCByZW1vdmUgYmFja3NsYXNoZXMgZnJvbSB0aGUgc3RyaW5nLgorICovCisgICAgY2hhcl91ICoKK3ZpbV9zdHJuc2F2ZV9lc2Moc3RyaW5nLCBsZW4pCisgICAgY2hhcl91CSpzdHJpbmc7CisgICAgaW50CQlsZW47Cit7CisgICAgY2hhcl91ICpwMSwgKnAyOworCisgICAgcDEgPSBhbGxvYygodW5zaWduZWQpIChsZW4gKyAxKSk7CisgICAgaWYgKHAxICE9IE5VTEwpCisgICAgeworCVNUUk5DUFkocDEsIHN0cmluZywgbGVuKTsKKwlwMVtsZW5dID0gTlVMOworCWZvciAocDIgPSBwMTsgKnAyOyArK3AyKQorCSAgICBpZiAoKnAyID09ICdcXCcgJiYgKihwMiArIDEpICE9IE5VTCkKKwkJU1RSQ1BZKHAyLCBwMiArIDEpOworICAgIH0KKyAgICByZXR1cm4gcDE7Cit9CisjZW5kaWYKKworLyoKKyAqIFNhbWUgYXMgdmltX3N0cnNhdmUoKSwgYnV0IGFueSBjaGFyYWN0ZXJzIGZvdW5kIGluIGVzY19jaGFycyBhcmUgcHJlY2VkZWQKKyAqIGJ5IGEgYmFja3NsYXNoLgorICovCisgICAgY2hhcl91ICoKK3ZpbV9zdHJzYXZlX2VzY2FwZWQoc3RyaW5nLCBlc2NfY2hhcnMpCisgICAgY2hhcl91CSpzdHJpbmc7CisgICAgY2hhcl91CSplc2NfY2hhcnM7Cit7CisgICAgcmV0dXJuIHZpbV9zdHJzYXZlX2VzY2FwZWRfZXh0KHN0cmluZywgZXNjX2NoYXJzLCBGQUxTRSk7Cit9CisKKy8qCisgKiBTYW1lIGFzIHZpbV9zdHJzYXZlX2VzY2FwZWQoKSwgYnV0IHdoZW4gImJzbCIgaXMgVFJVRSBhbHNvIGVzY2FwZQorICogY2hhcmFjdGVycyB3aGVyZSByZW1fYmFja3NsYXNoKCkgd291bGQgcmVtb3ZlIHRoZSBiYWNrc2xhc2guCisgKi8KKyAgICBjaGFyX3UgKgordmltX3N0cnNhdmVfZXNjYXBlZF9leHQoc3RyaW5nLCBlc2NfY2hhcnMsIGJzbCkKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBjaGFyX3UJKmVzY19jaGFyczsKKyAgICBpbnQJCWJzbDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpwMjsKKyAgICBjaGFyX3UJKmVzY2FwZWRfc3RyaW5nOworICAgIHVuc2lnbmVkCWxlbmd0aDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZpcnN0IGNvdW50IHRoZSBudW1iZXIgb2YgYmFja3NsYXNoZXMgcmVxdWlyZWQuCisgICAgICogVGhlbiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFuZCBpbnNlcnQgdGhlbS4KKyAgICAgKi8KKyAgICBsZW5ndGggPSAxOwkJCQkvKiBjb3VudCB0aGUgdHJhaWxpbmcgTlVMICovCisgICAgZm9yIChwID0gc3RyaW5nOyAqcDsgcCsrKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSAmJiAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkpID4gMSkKKwl7CisJICAgIGxlbmd0aCArPSBsOwkJLyogY291bnQgYSBtdWx0aWJ5dGUgY2hhciAqLworCSAgICBwICs9IGwgLSAxOworCSAgICBjb250aW51ZTsKKwl9CisjZW5kaWYKKwlpZiAodmltX3N0cmNocihlc2NfY2hhcnMsICpwKSAhPSBOVUxMIHx8IChic2wgJiYgcmVtX2JhY2tzbGFzaChwKSkpCisJICAgICsrbGVuZ3RoOwkJCS8qIGNvdW50IGEgYmFja3NsYXNoICovCisJKytsZW5ndGg7CQkJLyogY291bnQgYW4gb3JkaW5hcnkgY2hhciAqLworICAgIH0KKyAgICBlc2NhcGVkX3N0cmluZyA9IGFsbG9jKGxlbmd0aCk7CisgICAgaWYgKGVzY2FwZWRfc3RyaW5nICE9IE5VTEwpCisgICAgeworCXAyID0gZXNjYXBlZF9zdHJpbmc7CisJZm9yIChwID0gc3RyaW5nOyAqcDsgcCsrKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKSA+IDEpCisJICAgIHsKKwkJbWNoX21lbW1vdmUocDIsIHAsIChzaXplX3QpbCk7CisJCXAyICs9IGw7CisJCXAgKz0gbCAtIDE7CQkvKiBza2lwIG11bHRpYnl0ZSBjaGFyICAqLworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisJICAgIGlmICh2aW1fc3RyY2hyKGVzY19jaGFycywgKnApICE9IE5VTEwgfHwgKGJzbCAmJiByZW1fYmFja3NsYXNoKHApKSkKKwkJKnAyKysgPSAnXFwnOworCSAgICAqcDIrKyA9ICpwOworCX0KKwkqcDIgPSBOVUw7CisgICAgfQorICAgIHJldHVybiBlc2NhcGVkX3N0cmluZzsKK30KKworLyoKKyAqIExpa2UgdmltX3N0cnNhdmUoKSwgYnV0IG1ha2UgYWxsIGNoYXJhY3RlcnMgdXBwZXJjYXNlLgorICogVGhpcyB1c2VzIEFTQ0lJIGxvd2VyLXRvLXVwcGVyIGNhc2UgdHJhbnNsYXRpb24sIGxhbmd1YWdlIGluZGVwZW5kZW50LgorICovCisgICAgY2hhcl91ICoKK3ZpbV9zdHJzYXZlX3VwKHN0cmluZykKKyAgICBjaGFyX3UJKnN0cmluZzsKK3sKKyAgICBjaGFyX3UgKnAxOworCisgICAgcDEgPSB2aW1fc3Ryc2F2ZShzdHJpbmcpOworICAgIHZpbV9zdHJ1cChwMSk7CisgICAgcmV0dXJuIHAxOworfQorCisvKgorICogTGlrZSB2aW1fc3RybnNhdmUoKSwgYnV0IG1ha2UgYWxsIGNoYXJhY3RlcnMgdXBwZXJjYXNlLgorICogVGhpcyB1c2VzIEFTQ0lJIGxvd2VyLXRvLXVwcGVyIGNhc2UgdHJhbnNsYXRpb24sIGxhbmd1YWdlIGluZGVwZW5kZW50LgorICovCisgICAgY2hhcl91ICoKK3ZpbV9zdHJuc2F2ZV91cChzdHJpbmcsIGxlbikKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBjaGFyX3UgKnAxOworCisgICAgcDEgPSB2aW1fc3RybnNhdmUoc3RyaW5nLCBsZW4pOworICAgIHZpbV9zdHJ1cChwMSk7CisgICAgcmV0dXJuIHAxOworfQorCisvKgorICogQVNDSUkgbG93ZXItdG8tdXBwZXIgY2FzZSB0cmFuc2xhdGlvbiwgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQuCisgKi8KKyAgICB2b2lkCit2aW1fc3RydXAocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgY2hhcl91ICAqcDI7CisgICAgaW50CSAgICBjOworCisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJcDIgPSBwOworCXdoaWxlICgoYyA9ICpwMikgIT0gTlVMKQorI2lmZGVmIEVCQ0RJQworCSAgICAqcDIrKyA9IGlzYWxwaGEoYykgPyB0b3VwcGVyKGMpIDogYzsKKyNlbHNlCisJICAgICpwMisrID0gKGMgPCAnYScgfHwgYyA+ICd6JykgPyBjIDogKGMgLSAweDIwKTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIGNvcHkgYSBzcGFjZSBhIG51bWJlciBvZiB0aW1lcworICovCisgICAgdm9pZAorY29weV9zcGFjZXMocHRyLCBjb3VudCkKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBzaXplX3QJY291bnQ7Cit7CisgICAgc2l6ZV90CWkgPSBjb3VudDsKKyAgICBjaGFyX3UJKnAgPSBwdHI7CisKKyAgICB3aGlsZSAoaS0tKQorCSpwKysgPSAnICc7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVklTVUFMRVhUUkEpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29weSBhIGNoYXJhY3RlciBhIG51bWJlciBvZiB0aW1lcy4KKyAqIERvZXMgbm90IHdvcmsgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVzIQorICovCisgICAgdm9pZAorY29weV9jaGFycyhwdHIsIGNvdW50LCBjKQorICAgIGNoYXJfdQkqcHRyOworICAgIHNpemVfdAljb3VudDsKKyAgICBpbnQJCWM7Cit7CisgICAgc2l6ZV90CWkgPSBjb3VudDsKKyAgICBjaGFyX3UJKnAgPSBwdHI7CisKKyAgICB3aGlsZSAoaS0tKQorCSpwKysgPSBjOworfQorI2VuZGlmCisKKy8qCisgKiBkZWxldGUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYSBzdHJpbmcKKyAqLworICAgIHZvaWQKK2RlbF90cmFpbGluZ19zcGFjZXMocHRyKQorICAgIGNoYXJfdQkqcHRyOworeworICAgIGNoYXJfdQkqcTsKKworICAgIHEgPSBwdHIgKyBTVFJMRU4ocHRyKTsKKyAgICB3aGlsZSAoLS1xID4gcHRyICYmIHZpbV9pc3doaXRlKHFbMF0pICYmIHFbLTFdICE9ICdcXCcgJiYgcVstMV0gIT0gQ3RybF9WKQorCSpxID0gTlVMOworfQorCisvKgorICogVGhpcyBpcyBoZXJlIGJlY2F1c2Ugc3RybmNweSgpIGRvZXMgbm90IGd1YXJhbnRlZSBzdWNjZXNzZnVsIHJlc3VsdHMgd2hlbgorICogdGhlIHRvIGFuZCBmcm9tIHN0cmluZ3Mgb3ZlcmxhcC4gIEl0IGlzIG9ubHkgY3VycmVudGx5IGNhbGxlZCBmcm9tCisgKiBuZXh0d2lsZCgpIHdoaWNoIGNvcGllcyBwYXJ0IG9mIHRoZSBjb21tYW5kIGxpbmUgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZQorICogY29tbWFuZCBsaW5lLiAgVGhpcyBwcm9kdWNlZCBnYXJiYWdlIHdoZW4gZXhwYW5kaW5nIGZpbGVzIGV0YyBpbiB0aGUgbWlkZGxlCisgKiBvZiB0aGUgY29tbWFuZCBsaW5lIChvbiBteSB0ZXJtaW5hbCwgYW55d2F5KSAtLSB3ZWJiLgorICogTm90ZTogc3RybmNweSgpIHBhZHMgdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyIHdpdGggTlVMIGJ5dGVzLAorICogdmltX3N0cm5jcHkoKSBkb2Vzbid0IGRvIHRoYXQuCisgKi8KKyAgICB2b2lkCit2aW1fc3RybmNweSh0bywgZnJvbSwgbGVuKQorICAgIGNoYXJfdSAqdG87CisgICAgY2hhcl91ICpmcm9tOworICAgIGludCBsZW47Cit7CisgICAgaW50IGk7CisKKyAgICBpZiAodG8gPD0gZnJvbSkKKyAgICB7CisJd2hpbGUgKGxlbi0tICYmICpmcm9tKQorCSAgICAqdG8rKyA9ICpmcm9tKys7CisJaWYgKGxlbiA+PSAwKQorCSAgICAqdG8gPSAqZnJvbTsgICAgLyogQ29weSBOVUwgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgICB0bysrOworCSAgICBpZiAoKmZyb20rKyA9PSBOVUwpCisJICAgIHsKKwkJaSsrOworCQlicmVhazsKKwkgICAgfQorCX0KKwlmb3IgKDsgaSA+IDA7IGktLSkKKwkgICAgKi0tdG8gPSAqLS1mcm9tOworICAgIH0KK30KKworLyoKKyAqIElzb2xhdGUgb25lIHBhcnQgb2YgYSBzdHJpbmcgb3B0aW9uIHdoZXJlIHBhcnRzIGFyZSBzZXBhcmF0ZWQgd2l0aAorICogInNlcF9jaGFycyIuCisgKiBUaGUgcGFydCBpcyBjb3BpZWQgaW50byBidWZbbWF4bGVuXS4KKyAqICIqb3B0aW9uIiBpcyBhZHZhbmNlZCB0byB0aGUgbmV4dCBwYXJ0LgorICogVGhlIGxlbmd0aCBpcyByZXR1cm5lZC4KKyAqLworICAgIGludAorY29weV9vcHRpb25fcGFydChvcHRpb24sIGJ1ZiwgbWF4bGVuLCBzZXBfY2hhcnMpCisgICAgY2hhcl91CSoqb3B0aW9uOworICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbWF4bGVuOworICAgIGNoYXIJKnNlcF9jaGFyczsKK3sKKyAgICBpbnQJICAgIGxlbiA9IDA7CisgICAgY2hhcl91ICAqcCA9ICpvcHRpb247CisKKyAgICAvKiBza2lwICcuJyBhdCBzdGFydCBvZiBvcHRpb24gcGFydCwgZm9yICdzdWZmaXhlcycgKi8KKyAgICBpZiAoKnAgPT0gJy4nKQorCWJ1ZltsZW4rK10gPSAqcCsrOworICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgdmltX3N0cmNocigoY2hhcl91ICopc2VwX2NoYXJzLCAqcCkgPT0gTlVMTCkKKyAgICB7CisJLyoKKwkgKiBTa2lwIGJhY2tzbGFzaCBiZWZvcmUgYSBzZXBhcmF0b3IgY2hhcmFjdGVyIGFuZCBzcGFjZS4KKwkgKi8KKwlpZiAocFswXSA9PSAnXFwnICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKXNlcF9jaGFycywgcFsxXSkgIT0gTlVMTCkKKwkgICAgKytwOworCWlmIChsZW4gPCBtYXhsZW4gLSAxKQorCSAgICBidWZbbGVuKytdID0gKnA7CisJKytwOworICAgIH0KKyAgICBidWZbbGVuXSA9IE5VTDsKKworICAgIGlmICgqcCAhPSBOVUwgJiYgKnAgIT0gJywnKQkvKiBza2lwIG5vbi1zdGFuZGFyZCBzZXBhcmF0b3IgKi8KKwkrK3A7CisgICAgcCA9IHNraXBfdG9fb3B0aW9uX3BhcnQocCk7CS8qIHAgcG9pbnRzIHRvIG5leHQgZmlsZSBuYW1lICovCisKKyAgICAqb3B0aW9uID0gcDsKKyAgICByZXR1cm4gbGVuOworfQorCisvKgorICogcmVwbGFjZW1lbnQgZm9yIGZyZWUoKSB0aGF0IGlnbm9yZXMgTlVMTCBwb2ludGVycworICovCisgICAgdm9pZAordmltX2ZyZWUoeCkKKyAgICB2b2lkICp4OworeworICAgIGlmICh4ICE9IE5VTEwpCisgICAgeworI2lmZGVmIE1FTV9QUk9GSUxFCisJbWVtX3ByZV9mcmVlKCZ4KTsKKyNlbmRpZgorCWZyZWUoeCk7CisgICAgfQorfQorCisjaWZuZGVmIEhBVkVfTUVNU0VUCisgICAgdm9pZCAqCit2aW1fbWVtc2V0KHB0ciwgYywgc2l6ZSkKKyAgICB2b2lkICAgICpwdHI7CisgICAgaW50CSAgICBjOworICAgIHNpemVfdCAgc2l6ZTsKK3sKKyAgICBjaGFyICpwID0gcHRyOworCisgICAgd2hpbGUgKHNpemUtLSA+IDApCisJKnArKyA9IGM7CisgICAgcmV0dXJuIHB0cjsKK30KKyNlbmRpZgorCisjaWZkZWYgVklNX01FTUNNUAorLyoKKyAqIFJldHVybiB6ZXJvIHdoZW4gImIxIiBhbmQgImIyIiBhcmUgdGhlIHNhbWUgZm9yICJsZW4iIGJ5dGVzLgorICogUmV0dXJuIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworICAgIGludAordmltX21lbWNtcChiMSwgYjIsIGxlbikKKyAgICB2b2lkICAgICpiMTsKKyAgICB2b2lkICAgICpiMjsKKyAgICBzaXplX3QgIGxlbjsKK3sKKyAgICBjaGFyX3UgICpwMSA9IChjaGFyX3UgKiliMSwgKnAyID0gKGNoYXJfdSAqKWIyOworCisgICAgZm9yICggOyBsZW4gPiAwOyAtLWxlbikKKyAgICB7CisJaWYgKCpwMSAhPSAqcDIpCisJICAgIHJldHVybiAxOworCSsrcDE7CisJKytwMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIFZJTV9NRU1NT1ZFCisvKgorICogVmVyc2lvbiBvZiBtZW1tb3ZlKCkgdGhhdCBoYW5kbGVzIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uCisgKiBGb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgYSBmdW5jdGlvbiB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gZG8gdGhhdCAoU1lTVikuCisgKi8KKyAgICB2b2lkCittY2hfbWVtbW92ZShkc3RfYXJnLCBzcmNfYXJnLCBsZW4pCisgICAgdm9pZCAgICAqc3JjX2FyZywgKmRzdF9hcmc7CisgICAgc2l6ZV90ICBsZW47Cit7CisgICAgLyoKKyAgICAgKiBBIHZvaWQgZG9lc24ndCBoYXZlIGEgc2l6ZSwgd2UgdXNlIGNoYXIgcG9pbnRlcnMuCisgICAgICovCisgICAgY2hhciAqZHN0ID0gZHN0X2FyZywgKnNyYyA9IHNyY19hcmc7CisKKwkJCQkJLyogb3ZlcmxhcCwgY29weSBiYWNrd2FyZHMgKi8KKyAgICBpZiAoZHN0ID4gc3JjICYmIGRzdCA8IHNyYyArIGxlbikKKyAgICB7CisJc3JjICs9IGxlbjsKKwlkc3QgKz0gbGVuOworCXdoaWxlIChsZW4tLSA+IDApCisJICAgICotLWRzdCA9ICotLXNyYzsKKyAgICB9CisgICAgZWxzZQkJCQkvKiBjb3B5IGZvcndhcmRzICovCisJd2hpbGUgKGxlbi0tID4gMCkKKwkgICAgKmRzdCsrID0gKnNyYysrOworfQorI2VuZGlmCisKKyNpZiAoIWRlZmluZWQoSEFWRV9TVFJDQVNFQ01QKSAmJiAhZGVmaW5lZChIQVZFX1NUUklDTVApKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UsIHVzaW5nIGN1cnJlbnQgbG9jYWxlLgorICogRG9lc24ndCB3b3JrIGZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuCisgKiByZXR1cm4gMCBmb3IgbWF0Y2gsIDwgMCBmb3Igc21hbGxlciwgPiAwIGZvciBiaWdnZXIKKyAqLworICAgIGludAordmltX3N0cmljbXAoczEsIHMyKQorICAgIGNoYXIJKnMxOworICAgIGNoYXIJKnMyOworeworICAgIGludAkJaTsKKworICAgIGZvciAoOzspCisgICAgeworCWkgPSAoaW50KVRPTE9XRVJfTE9DKCpzMSkgLSAoaW50KVRPTE9XRVJfTE9DKCpzMik7CisJaWYgKGkgIT0gMCkKKwkgICAgcmV0dXJuIGk7CQkJICAgIC8qIHRoaXMgY2hhcmFjdGVyIGRpZmZlcmVudCAqLworCWlmICgqczEgPT0gTlVMKQorCSAgICBicmVhazsJCQkgICAgLyogc3RyaW5ncyBtYXRjaCB1bnRpbCBOVUwgKi8KKwkrK3MxOworCSsrczI7CisgICAgfQorICAgIHJldHVybiAwOwkJCQkgICAgLyogc3RyaW5ncyBtYXRjaCAqLworfQorI2VuZGlmCisKKyNpZiAoIWRlZmluZWQoSEFWRV9TVFJOQ0FTRUNNUCkgJiYgIWRlZmluZWQoSEFWRV9TVFJOSUNNUCkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29tcGFyZSB0d28gc3RyaW5ncywgZm9yIGxlbmd0aCAibGVuIiwgaWdub3JpbmcgY2FzZSwgdXNpbmcgY3VycmVudCBsb2NhbGUuCisgKiBEb2Vzbid0IHdvcmsgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4KKyAqIHJldHVybiAwIGZvciBtYXRjaCwgPCAwIGZvciBzbWFsbGVyLCA+IDAgZm9yIGJpZ2dlcgorICovCisgICAgaW50Cit2aW1fc3RybmljbXAoczEsIHMyLCBsZW4pCisgICAgY2hhcgkqczE7CisgICAgY2hhcgkqczI7CisgICAgc2l6ZV90CWxlbjsKK3sKKyAgICBpbnQJCWk7CisKKyAgICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisJaSA9IChpbnQpVE9MT1dFUl9MT0MoKnMxKSAtIChpbnQpVE9MT1dFUl9MT0MoKnMyKTsKKwlpZiAoaSAhPSAwKQorCSAgICByZXR1cm4gaTsJCQkgICAgLyogdGhpcyBjaGFyYWN0ZXIgZGlmZmVyZW50ICovCisJaWYgKCpzMSA9PSBOVUwpCisJICAgIGJyZWFrOwkJCSAgICAvKiBzdHJpbmdzIG1hdGNoIHVudGlsIE5VTCAqLworCSsrczE7CisJKytzMjsKKwktLWxlbjsKKyAgICB9CisgICAgcmV0dXJuIDA7CQkJCSAgICAvKiBzdHJpbmdzIG1hdGNoICovCit9CisjZW5kaWYKKworI2lmIDAJLyogY3VycmVudGx5IG5vdCB1c2VkICovCisvKgorICogQ2hlY2sgaWYgc3RyaW5nICJzMiIgYXBwZWFycyBzb21ld2hlcmUgaW4gInMxIiB3aGlsZSBpZ25vcmluZyBjYXNlLgorICogUmV0dXJuIE5VTEwgaWYgbm90LCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2UgaWYgaXQgZG9lcy4KKyAqLworICAgIGNoYXJfdSAqCit2aW1fc3RyaXN0cihzMSwgczIpCisgICAgY2hhcl91CSpzMTsKKyAgICBjaGFyX3UJKnMyOworeworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWxlbiA9IFNUUkxFTihzMik7CisgICAgY2hhcl91CSplbmQgPSBzMSArIFNUUkxFTihzMSkgLSBsZW47CisKKyAgICBmb3IgKHAgPSBzMTsgcCA8PSBlbmQ7ICsrcCkKKwlpZiAoU1RSTklDTVAocCwgczIsIGxlbikgPT0gMCkKKwkgICAgcmV0dXJuIHA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIFZlcnNpb24gb2Ygc3RyY2hyKCkgYW5kIHN0cnJjaHIoKSB0aGF0IGhhbmRsZSB1bnNpZ25lZCBjaGFyIHN0cmluZ3MKKyAqIHdpdGggY2hhcmFjdGVycyBhYm92ZSAxMjggY29ycmVjdGx5LiBBbHNvIGl0IGRvZXNuJ3QgcmV0dXJuIGEgcG9pbnRlciB0bworICogdGhlIE5VTCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgKi8KKyAgICBjaGFyX3UgICoKK3ZpbV9zdHJjaHIoc3RyaW5nLCBjKQorICAgIGNoYXJfdQkqc3RyaW5nOworICAgIGludAkJYzsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQliOworCisgICAgcCA9IHN0cmluZzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkKKyAgICB7CisJd2hpbGUgKCpwICE9IE5VTCkKKwl7CisJICAgIGlmICh1dGZfcHRyMmNoYXIocCkgPT0gYykKKwkJcmV0dXJuIHA7CisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwl9CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlbmNfZGJjcyAhPSAwICYmIGMgPiAyNTUpCisgICAgeworCWludAluMiA9IGMgJiAweGZmOworCisJYyA9ICgodW5zaWduZWQpYyA+PiA4KSAmIDB4ZmY7CisJd2hpbGUgKChiID0gKnApICE9IE5VTCkKKwl7CisJICAgIGlmIChiID09IGMgJiYgcFsxXSA9PSBuMikKKwkJcmV0dXJuIHA7CisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwl9CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChoYXNfbWJ5dGUpCisgICAgeworCXdoaWxlICgoYiA9ICpwKSAhPSBOVUwpCisJeworCSAgICBpZiAoYiA9PSBjKQorCQlyZXR1cm4gcDsKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCX0KKwlyZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZSAoKGIgPSAqcCkgIT0gTlVMKQorICAgIHsKKwlpZiAoYiA9PSBjKQorCSAgICByZXR1cm4gcDsKKwkrK3A7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogU2VhcmNoIGZvciBsYXN0IG9jY3VycmVuY2Ugb2YgImMiIGluICJzdHJpbmciLgorICogcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorICogRG9lcyBub3QgaGFuZGxlIG11bHRpLWJ5dGUhCisgKi8KKyAgICBjaGFyX3UgICoKK3ZpbV9zdHJyY2hyKHN0cmluZywgYykKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBpbnQJCWM7Cit7CisgICAgY2hhcl91CSpyZXR2YWwgPSBOVUxMOworCisgICAgd2hpbGUgKCpzdHJpbmcpCisgICAgeworCWlmICgqc3RyaW5nID09IGMpCisJICAgIHJldHZhbCA9IHN0cmluZzsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgc3RyaW5nICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoc3RyaW5nKTsKKwllbHNlCisjZW5kaWYKKwkgICAgKytzdHJpbmc7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBWaW0ncyB2ZXJzaW9uIG9mIHN0cnBicmsoKSwgaW4gY2FzZSBpdCdzIG1pc3NpbmcuCisgKiBEb24ndCBnZW5lcmF0ZSBhIHByb3RvdHlwZSBmb3IgdGhpcywgY2F1c2VzIHByb2JsZW1zIHdoZW4gaXQncyBub3QgdXNlZC4KKyAqLworI2lmbmRlZiBQUk9UTworIyBpZm5kZWYgSEFWRV9TVFJQQlJLCisjICBpZmRlZiB2aW1fc3RycGJyaworIyAgIHVuZGVmIHZpbV9zdHJwYnJrCisjICBlbmRpZgorICAgIGNoYXJfdSAqCit2aW1fc3RycGJyayhzLCBjaGFyc2V0KQorICAgIGNoYXJfdQkqczsKKyAgICBjaGFyX3UJKmNoYXJzZXQ7Cit7CisgICAgd2hpbGUgKCpzKQorICAgIHsKKwlpZiAodmltX3N0cmNocihjaGFyc2V0LCAqcykgIT0gTlVMTCkKKwkgICAgcmV0dXJuIHM7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHMgKz0gKCptYl9wdHIybGVuX2NoZWNrKShzKTsKKwllbHNlCisjZW5kaWYKKwkgICAgKytzOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogVmltIGhhcyBpdHMgb3duIGlzc3BhY2UoKSBmdW5jdGlvbiwgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzIGlzc3BhY2UoKQorICogY2FuJ3QgaGFuZGxlIGNoYXJhY3RlcnMgYWJvdmUgMTI4LgorICovCisgICAgaW50Cit2aW1faXNzcGFjZSh4KQorICAgIGludAkgICAgeDsKK3sKKyAgICByZXR1cm4gKCh4ID49IDkgJiYgeCA8PSAxMykgfHwgeCA9PSAnICcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMgZm9yIGhhbmxkaW5nIGdyb3dpbmcgYXJyYXlzLgorICovCisKKy8qCisgKiBDbGVhciBhbiBhbGxvY2F0ZWQgZ3Jvd2luZyBhcnJheS4KKyAqLworICAgIHZvaWQKK2dhX2NsZWFyKGdhcCkKKyAgICBnYXJyYXlfVCAqZ2FwOworeworICAgIHZpbV9mcmVlKGdhcC0+Z2FfZGF0YSk7CisgICAgZ2FfaW5pdChnYXApOworfQorCisvKgorICogQ2xlYXIgYSBncm93aW5nIGFycmF5IHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MuCisgKi8KKyAgICB2b2lkCitnYV9jbGVhcl9zdHJpbmdzKGdhcCkKKyAgICBnYXJyYXlfVCAqZ2FwOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbjsgKytpKQorCXZpbV9mcmVlKCgoY2hhcl91ICoqKShnYXAtPmdhX2RhdGEpKVtpXSk7CisgICAgZ2FfY2xlYXIoZ2FwKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBncm93aW5nIGFycmF5LglEb24ndCBmb3JnZXQgdG8gc2V0IGdhX2l0ZW1zaXplIGFuZAorICogZ2FfZ3Jvd3NpemUhICBPciB1c2UgZ2FfaW5pdDIoKS4KKyAqLworICAgIHZvaWQKK2dhX2luaXQoZ2FwKQorICAgIGdhcnJheV9UICpnYXA7Cit7CisgICAgZ2FwLT5nYV9kYXRhID0gTlVMTDsKKyAgICBnYXAtPmdhX3Jvb20gPSAwOworICAgIGdhcC0+Z2FfbGVuID0gMDsKK30KKworICAgIHZvaWQKK2dhX2luaXQyKGdhcCwgaXRlbXNpemUsIGdyb3dzaXplKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgaW50CQlpdGVtc2l6ZTsKKyAgICBpbnQJCWdyb3dzaXplOworeworICAgIGdhX2luaXQoZ2FwKTsKKyAgICBnYXAtPmdhX2l0ZW1zaXplID0gaXRlbXNpemU7CisgICAgZ2FwLT5nYV9ncm93c2l6ZSA9IGdyb3dzaXplOworfQorCisvKgorICogTWFrZSByb29tIGluIGdyb3dpbmcgYXJyYXkgImdhcCIgZm9yIGF0IGxlYXN0ICJuIiBpdGVtcy4KKyAqIFJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2dhX2dyb3coZ2FwLCBuKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgaW50CQluOworeworICAgIHNpemVfdAlsZW47CisgICAgY2hhcl91CSpwcDsKKworICAgIGlmIChnYXAtPmdhX3Jvb20gPCBuKQorICAgIHsKKwlpZiAobiA8IGdhcC0+Z2FfZ3Jvd3NpemUpCisJICAgIG4gPSBnYXAtPmdhX2dyb3dzaXplOworCWxlbiA9IGdhcC0+Z2FfaXRlbXNpemUgKiAoZ2FwLT5nYV9sZW4gKyBuKTsKKwlwcCA9IGFsbG9jX2NsZWFyKCh1bnNpZ25lZClsZW4pOworCWlmIChwcCA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKwlnYXAtPmdhX3Jvb20gPSBuOworCWlmIChnYXAtPmdhX2RhdGEgIT0gTlVMTCkKKwl7CisJICAgIG1jaF9tZW1tb3ZlKHBwLCBnYXAtPmdhX2RhdGEsCisJCQkJICAgICAgKHNpemVfdCkoZ2FwLT5nYV9pdGVtc2l6ZSAqIGdhcC0+Z2FfbGVuKSk7CisJICAgIHZpbV9mcmVlKGdhcC0+Z2FfZGF0YSk7CisJfQorCWdhcC0+Z2FfZGF0YSA9IHBwOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDb25jYXRlbmF0ZSBhIHN0cmluZyB0byBhIGdyb3dhcnJheSB3aGljaCBjb250YWlucyBjaGFyYWN0ZXJzLgorICogTm90ZTogRG9lcyBOT1QgY29weSB0aGUgTlVMIGF0IHRoZSBlbmQhCisgKi8KKyAgICB2b2lkCitnYV9jb25jYXQoZ2FwLCBzKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSpzOworeworICAgIGludCAgICBsZW4gPSAoaW50KVNUUkxFTihzKTsKKworICAgIGlmIChnYV9ncm93KGdhcCwgbGVuKSA9PSBPSykKKyAgICB7CisJbWNoX21lbW1vdmUoKGNoYXIgKilnYXAtPmdhX2RhdGEgKyBnYXAtPmdhX2xlbiwgcywgKHNpemVfdClsZW4pOworCWdhcC0+Z2FfbGVuICs9IGxlbjsKKwlnYXAtPmdhX3Jvb20gLT0gbGVuOworICAgIH0KK30KKworLyoKKyAqIEFwcGVuZCBvbmUgYnl0ZSB0byBhIGdyb3dhcnJheSB3aGljaCBjb250YWlucyBieXRlcy4KKyAqLworICAgIHZvaWQKK2dhX2FwcGVuZChnYXAsIGMpCisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBpbnQJCWM7Cit7CisgICAgaWYgKGdhX2dyb3coZ2FwLCAxKSA9PSBPSykKKyAgICB7CisJKigoY2hhciAqKWdhcC0+Z2FfZGF0YSArIGdhcC0+Z2FfbGVuKSA9IGM7CisJKytnYXAtPmdhX2xlbjsKKwktLWdhcC0+Z2Ffcm9vbTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9ucyB0aGF0IHVzZSBsb29rdXAgdGFibGVzIGZvciB2YXJpb3VzIHRoaW5ncywgZ2VuZXJhbGx5IHRvIGRvIHdpdGgKKyAqIHNwZWNpYWwga2V5IGNvZGVzLgorICovCisKKy8qCisgKiBTb21lIHVzZWZ1bCB0YWJsZXMuCisgKi8KKworc3RhdGljIHN0cnVjdCBtb2RtYXNrdGFibGUKK3sKKyAgICBzaG9ydAltb2RfbWFzazsJLyogQml0LW1hc2sgZm9yIHBhcnRpY3VsYXIga2V5IG1vZGlmaWVyICovCisgICAgc2hvcnQJbW9kX2ZsYWc7CS8qIEJpdChzKSBmb3IgcGFydGljdWxhciBrZXkgbW9kaWZpZXIgKi8KKyAgICBjaGFyX3UJbmFtZTsJCS8qIFNpbmdsZSBsZXR0ZXIgbmFtZSBvZiBtb2RpZmllciAqLworfSBtb2RfbWFza190YWJsZVtdID0KK3sKKyAgICB7TU9EX01BU0tfQUxULAkJTU9EX01BU0tfQUxULAkJKGNoYXJfdSknTSd9LAorICAgIHtNT0RfTUFTS19DVFJMLAkJTU9EX01BU0tfQ1RSTCwJCShjaGFyX3UpJ0MnfSwKKyAgICB7TU9EX01BU0tfU0hJRlQsCQlNT0RfTUFTS19TSElGVCwJCShjaGFyX3UpJ1MnfSwKKyAgICB7TU9EX01BU0tfTVVMVElfQ0xJQ0ssCU1PRF9NQVNLXzJDTElDSywJKGNoYXJfdSknMid9LAorICAgIHtNT0RfTUFTS19NVUxUSV9DTElDSywJTU9EX01BU0tfM0NMSUNLLAkoY2hhcl91KSczJ30sCisgICAge01PRF9NQVNLX01VTFRJX0NMSUNLLAlNT0RfTUFTS180Q0xJQ0ssCShjaGFyX3UpJzQnfSwKKyNpZmRlZiBNQUNPUworICAgIHtNT0RfTUFTS19DTUQsCQlNT0RfTUFTS19DTUQsCQkoY2hhcl91KSdEJ30sCisjZW5kaWYKKyAgICAvKiAnQScgbXVzdCBiZSB0aGUgbGFzdCBvbmUgKi8KKyAgICB7TU9EX01BU0tfQUxULAkJTU9EX01BU0tfQUxULAkJKGNoYXJfdSknQSd9LAorICAgIHswLCAwLCBOVUx9Cit9OworCisvKgorICogU2hpZnRlZCBrZXkgdGVybWluYWwgY29kZXMgYW5kIHRoZWlyIHVuc2hpZnRlZCBlcXVpdmFsZW50LgorICogRG9uJ3QgYWRkIG1vdXNlIGNvZGVzIGhlcmUsIHRoZXkgYXJlIGhhbmRsZWQgc2VwZXJhdGVseSEKKyAqLworI2RlZmluZSBNT0RfS0VZU19FTlRSWV9TSVpFIDUKKworc3RhdGljIGNoYXJfdSBtb2RpZmllcl9rZXlzX3RhYmxlW10gPQoreworLyogIG1vZCBtYXNrCSAgICB3aXRoIG1vZGlmaWVyCQl3aXRob3V0IG1vZGlmaWVyICovCisgICAgTU9EX01BU0tfU0hJRlQsICcmJywgJzknLAkJCSdAJywgJzEnLAkvKiBiZWdpbiAqLworICAgIE1PRF9NQVNLX1NISUZULCAnJicsICcwJywJCQknQCcsICcyJywJLyogY2FuY2VsICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzEnLAkJCSdAJywgJzQnLAkvKiBjb21tYW5kICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzInLAkJCSdAJywgJzUnLAkvKiBjb3B5ICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzMnLAkJCSdAJywgJzYnLAkvKiBjcmVhdGUgKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyonLCAnNCcsCQkJJ2snLCAnRCcsCS8qIGRlbGV0ZSBjaGFyICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzUnLAkJCSdrJywgJ0wnLAkvKiBkZWxldGUgbGluZSAqLworICAgIE1PRF9NQVNLX1NISUZULCAnKicsICc3JywJCQknQCcsICc3JywJLyogZW5kICovCisgICAgTU9EX01BU0tfQ1RSTCwgIEtTX0VYVFJBLCAoaW50KUtFX0NfRU5ELAknQCcsICc3JywJLyogZW5kICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzknLAkJCSdAJywgJzknLAkvKiBleGl0ICovCisgICAgTU9EX01BU0tfU0hJRlQsICcqJywgJzAnLAkJCSdAJywgJzAnLAkvKiBmaW5kICovCisgICAgTU9EX01BU0tfU0hJRlQsICcjJywgJzEnLAkJCSclJywgJzEnLAkvKiBoZWxwICovCisgICAgTU9EX01BU0tfU0hJRlQsICcjJywgJzInLAkJCSdrJywgJ2gnLAkvKiBob21lICovCisgICAgTU9EX01BU0tfQ1RSTCwgIEtTX0VYVFJBLCAoaW50KUtFX0NfSE9NRSwJJ2snLCAnaCcsCS8qIGhvbWUgKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyMnLCAnMycsCQkJJ2snLCAnSScsCS8qIGluc2VydCAqLworICAgIE1PRF9NQVNLX1NISUZULCAnIycsICc0JywJCQknaycsICdsJywJLyogbGVmdCBhcnJvdyAqLworICAgIE1PRF9NQVNLX0NUUkwsICBLU19FWFRSQSwgKGludClLRV9DX0xFRlQsCSdrJywgJ2wnLAkvKiBsZWZ0IGFycm93ICovCisgICAgTU9EX01BU0tfU0hJRlQsICclJywgJ2EnLAkJCSclJywgJzMnLAkvKiBtZXNzYWdlICovCisgICAgTU9EX01BU0tfU0hJRlQsICclJywgJ2InLAkJCSclJywgJzQnLAkvKiBtb3ZlICovCisgICAgTU9EX01BU0tfU0hJRlQsICclJywgJ2MnLAkJCSclJywgJzUnLAkvKiBuZXh0ICovCisgICAgTU9EX01BU0tfU0hJRlQsICclJywgJ2QnLAkJCSclJywgJzcnLAkvKiBvcHRpb25zICovCisgICAgTU9EX01BU0tfU0hJRlQsICclJywgJ2UnLAkJCSclJywgJzgnLAkvKiBwcmV2aW91cyAqLworICAgIE1PRF9NQVNLX1NISUZULCAnJScsICdmJywJCQknJScsICc5JywJLyogcHJpbnQgKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyUnLCAnZycsCQkJJyUnLCAnMCcsCS8qIHJlZG8gKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyUnLCAnaCcsCQkJJyYnLCAnMycsCS8qIHJlcGxhY2UgKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyUnLCAnaScsCQkJJ2snLCAncicsCS8qIHJpZ2h0IGFyci4gKi8KKyAgICBNT0RfTUFTS19DVFJMLCAgS1NfRVhUUkEsIChpbnQpS0VfQ19SSUdIVCwJJ2snLCAncicsCS8qIHJpZ2h0IGFyci4gKi8KKyAgICBNT0RfTUFTS19TSElGVCwgJyUnLCAnaicsCQkJJyYnLCAnNScsCS8qIHJlc3VtZSAqLworICAgIE1PRF9NQVNLX1NISUZULCAnIScsICcxJywJCQknJicsICc2JywJLyogc2F2ZSAqLworICAgIE1PRF9NQVNLX1NISUZULCAnIScsICcyJywJCQknJicsICc3JywJLyogc3VzcGVuZCAqLworICAgIE1PRF9NQVNLX1NISUZULCAnIScsICczJywJCQknJicsICc4JywJLyogdW5kbyAqLworICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX1VQLAknaycsICd1JywJLyogdXAgYXJyb3cgKi8KKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19ET1dOLAknaycsICdkJywJLyogZG93biBhcnJvdyAqLworCisJCQkJCQkJCS8qIHZ0MTAwIEYxICovCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfWEYxLAlLU19FWFRSQSwgKGludClLRV9YRjEsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfWEYyLAlLU19FWFRSQSwgKGludClLRV9YRjIsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfWEYzLAlLU19FWFRSQSwgKGludClLRV9YRjMsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfWEY0LAlLU19FWFRSQSwgKGludClLRV9YRjQsCisKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMSwJJ2snLCAnMScsCS8qIEYxICovCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjIsCSdrJywgJzInLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YzLAknaycsICczJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GNCwJJ2snLCAnNCcsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjUsCSdrJywgJzUnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0Y2LAknaycsICc2JywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GNywJJ2snLCAnNycsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjgsCSdrJywgJzgnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0Y5LAknaycsICc5JywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMTAsCSdrJywgJzsnLAkvKiBGMTAgKi8KKworICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YxMSwJJ0YnLCAnMScsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjEyLAknRicsICcyJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMTMsCSdGJywgJzMnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YxNCwJJ0YnLCAnNCcsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjE1LAknRicsICc1JywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMTYsCSdGJywgJzYnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YxNywJJ0YnLCAnNycsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjE4LAknRicsICc4JywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMTksCSdGJywgJzknLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YyMCwJJ0YnLCAnQScsCisKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMjEsCSdGJywgJ0InLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YyMiwJJ0YnLCAnQycsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjIzLAknRicsICdEJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMjQsCSdGJywgJ0UnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YyNSwJJ0YnLCAnRicsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjI2LAknRicsICdHJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMjcsCSdGJywgJ0gnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YyOCwJJ0YnLCAnSScsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjI5LAknRicsICdKJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMzAsCSdGJywgJ0snLAorCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjMxLAknRicsICdMJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMzIsCSdGJywgJ00nLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YzMywJJ0YnLCAnTicsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjM0LAknRicsICdPJywKKyAgICBNT0RfTUFTS19TSElGVCwgS1NfRVhUUkEsIChpbnQpS0VfU19GMzUsCSdGJywgJ1AnLAorICAgIE1PRF9NQVNLX1NISUZULCBLU19FWFRSQSwgKGludClLRV9TX0YzNiwJJ0YnLCAnUScsCisgICAgTU9EX01BU0tfU0hJRlQsIEtTX0VYVFJBLCAoaW50KUtFX1NfRjM3LAknRicsICdSJywKKworCQkJCQkJCSAgICAvKiBUQUIgcHNldWRvIGNvZGUqLworICAgIE1PRF9NQVNLX1NISUZULCAnaycsICdCJywJCQlLU19FWFRSQSwgKGludClLRV9UQUIsCisKKyAgICBOVUwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5X25hbWVfZW50cnkKK3sKKyAgICBpbnQJICAgIGtleTsJLyogU3BlY2lhbCBrZXkgY29kZSBvciBhc2NpaSB2YWx1ZSAqLworICAgIGNoYXJfdSAgKm5hbWU7CS8qIE5hbWUgb2Yga2V5ICovCit9IGtleV9uYW1lc190YWJsZVtdID0KK3sKKyAgICB7JyAnLAkJKGNoYXJfdSAqKSJTcGFjZSJ9LAorICAgIHtUQUIsCQkoY2hhcl91ICopIlRhYiJ9LAorICAgIHtLX1RBQiwJCShjaGFyX3UgKikiVGFiIn0sCisgICAge05MLAkJKGNoYXJfdSAqKSJOTCJ9LAorICAgIHtOTCwJCShjaGFyX3UgKikiTmV3TGluZSJ9LAkvKiBBbHRlcm5hdGl2ZSBuYW1lICovCisgICAge05MLAkJKGNoYXJfdSAqKSJMaW5lRmVlZCJ9LAkvKiBBbHRlcm5hdGl2ZSBuYW1lICovCisgICAge05MLAkJKGNoYXJfdSAqKSJMRiJ9LAkvKiBBbHRlcm5hdGl2ZSBuYW1lICovCisgICAge0NBUiwJCShjaGFyX3UgKikiQ1IifSwKKyAgICB7Q0FSLAkJKGNoYXJfdSAqKSJSZXR1cm4ifSwJLyogQWx0ZXJuYXRpdmUgbmFtZSAqLworICAgIHtDQVIsCQkoY2hhcl91ICopIkVudGVyIn0sCS8qIEFsdGVybmF0aXZlIG5hbWUgKi8KKyAgICB7S19CUywJCShjaGFyX3UgKikiQlMifSwKKyAgICB7S19CUywJCShjaGFyX3UgKikiQmFja1NwYWNlIn0sCS8qIEFsdGVybmF0aXZlIG5hbWUgKi8KKyAgICB7RVNDLAkJKGNoYXJfdSAqKSJFc2MifSwKKyAgICB7Q1NJLAkJKGNoYXJfdSAqKSJDU0kifSwKKyAgICB7S19DU0ksCQkoY2hhcl91ICopInhDU0kifSwKKyAgICB7J3wnLAkJKGNoYXJfdSAqKSJCYXIifSwKKyAgICB7J1xcJywJCShjaGFyX3UgKikiQnNsYXNoIn0sCisgICAge0tfREVMLAkJKGNoYXJfdSAqKSJEZWwifSwKKyAgICB7S19ERUwsCQkoY2hhcl91ICopIkRlbGV0ZSJ9LAkvKiBBbHRlcm5hdGl2ZSBuYW1lICovCisgICAge0tfS0RFTCwJCShjaGFyX3UgKikia0RlbCJ9LAorICAgIHtLX1VQLAkJKGNoYXJfdSAqKSJVcCJ9LAorICAgIHtLX0RPV04sCQkoY2hhcl91ICopIkRvd24ifSwKKyAgICB7S19MRUZULAkJKGNoYXJfdSAqKSJMZWZ0In0sCisgICAge0tfUklHSFQsCQkoY2hhcl91ICopIlJpZ2h0In0sCisKKyAgICB7S19GMSwJCShjaGFyX3UgKikiRjEifSwKKyAgICB7S19GMiwJCShjaGFyX3UgKikiRjIifSwKKyAgICB7S19GMywJCShjaGFyX3UgKikiRjMifSwKKyAgICB7S19GNCwJCShjaGFyX3UgKikiRjQifSwKKyAgICB7S19GNSwJCShjaGFyX3UgKikiRjUifSwKKyAgICB7S19GNiwJCShjaGFyX3UgKikiRjYifSwKKyAgICB7S19GNywJCShjaGFyX3UgKikiRjcifSwKKyAgICB7S19GOCwJCShjaGFyX3UgKikiRjgifSwKKyAgICB7S19GOSwJCShjaGFyX3UgKikiRjkifSwKKyAgICB7S19GMTAsCQkoY2hhcl91ICopIkYxMCJ9LAorCisgICAge0tfRjExLAkJKGNoYXJfdSAqKSJGMTEifSwKKyAgICB7S19GMTIsCQkoY2hhcl91ICopIkYxMiJ9LAorICAgIHtLX0YxMywJCShjaGFyX3UgKikiRjEzIn0sCisgICAge0tfRjE0LAkJKGNoYXJfdSAqKSJGMTQifSwKKyAgICB7S19GMTUsCQkoY2hhcl91ICopIkYxNSJ9LAorICAgIHtLX0YxNiwJCShjaGFyX3UgKikiRjE2In0sCisgICAge0tfRjE3LAkJKGNoYXJfdSAqKSJGMTcifSwKKyAgICB7S19GMTgsCQkoY2hhcl91ICopIkYxOCJ9LAorICAgIHtLX0YxOSwJCShjaGFyX3UgKikiRjE5In0sCisgICAge0tfRjIwLAkJKGNoYXJfdSAqKSJGMjAifSwKKworICAgIHtLX0YyMSwJCShjaGFyX3UgKikiRjIxIn0sCisgICAge0tfRjIyLAkJKGNoYXJfdSAqKSJGMjIifSwKKyAgICB7S19GMjMsCQkoY2hhcl91ICopIkYyMyJ9LAorICAgIHtLX0YyNCwJCShjaGFyX3UgKikiRjI0In0sCisgICAge0tfRjI1LAkJKGNoYXJfdSAqKSJGMjUifSwKKyAgICB7S19GMjYsCQkoY2hhcl91ICopIkYyNiJ9LAorICAgIHtLX0YyNywJCShjaGFyX3UgKikiRjI3In0sCisgICAge0tfRjI4LAkJKGNoYXJfdSAqKSJGMjgifSwKKyAgICB7S19GMjksCQkoY2hhcl91ICopIkYyOSJ9LAorICAgIHtLX0YzMCwJCShjaGFyX3UgKikiRjMwIn0sCisKKyAgICB7S19GMzEsCQkoY2hhcl91ICopIkYzMSJ9LAorICAgIHtLX0YzMiwJCShjaGFyX3UgKikiRjMyIn0sCisgICAge0tfRjMzLAkJKGNoYXJfdSAqKSJGMzMifSwKKyAgICB7S19GMzQsCQkoY2hhcl91ICopIkYzNCJ9LAorICAgIHtLX0YzNSwJCShjaGFyX3UgKikiRjM1In0sCisgICAge0tfRjM2LAkJKGNoYXJfdSAqKSJGMzYifSwKKyAgICB7S19GMzcsCQkoY2hhcl91ICopIkYzNyJ9LAorCisgICAge0tfWEYxLAkJKGNoYXJfdSAqKSJ4RjEifSwKKyAgICB7S19YRjIsCQkoY2hhcl91ICopInhGMiJ9LAorICAgIHtLX1hGMywJCShjaGFyX3UgKikieEYzIn0sCisgICAge0tfWEY0LAkJKGNoYXJfdSAqKSJ4RjQifSwKKworICAgIHtLX0hFTFAsCQkoY2hhcl91ICopIkhlbHAifSwKKyAgICB7S19VTkRPLAkJKGNoYXJfdSAqKSJVbmRvIn0sCisgICAge0tfSU5TLAkJKGNoYXJfdSAqKSJJbnNlcnQifSwKKyAgICB7S19JTlMsCQkoY2hhcl91ICopIklucyJ9LAkvKiBBbHRlcm5hdGl2ZSBuYW1lICovCisgICAge0tfS0lOUywJCShjaGFyX3UgKikia0luc2VydCJ9LAorICAgIHtLX0hPTUUsCQkoY2hhcl91ICopIkhvbWUifSwKKyAgICB7S19LSE9NRSwJCShjaGFyX3UgKikia0hvbWUifSwKKyAgICB7S19YSE9NRSwJCShjaGFyX3UgKikieEhvbWUifSwKKyAgICB7S19FTkQsCQkoY2hhcl91ICopIkVuZCJ9LAorICAgIHtLX0tFTkQsCQkoY2hhcl91ICopImtFbmQifSwKKyAgICB7S19YRU5ELAkJKGNoYXJfdSAqKSJ4RW5kIn0sCisgICAge0tfUEFHRVVQLAkJKGNoYXJfdSAqKSJQYWdlVXAifSwKKyAgICB7S19QQUdFRE9XTiwJKGNoYXJfdSAqKSJQYWdlRG93biJ9LAorICAgIHtLX0tQQUdFVVAsCQkoY2hhcl91ICopImtQYWdlVXAifSwKKyAgICB7S19LUEFHRURPV04sCShjaGFyX3UgKikia1BhZ2VEb3duIn0sCisKKyAgICB7S19LUExVUywJCShjaGFyX3UgKikia1BsdXMifSwKKyAgICB7S19LTUlOVVMsCQkoY2hhcl91ICopImtNaW51cyJ9LAorICAgIHtLX0tESVZJREUsCQkoY2hhcl91ICopImtEaXZpZGUifSwKKyAgICB7S19LTVVMVElQTFksCShjaGFyX3UgKikia011bHRpcGx5In0sCisgICAge0tfS0VOVEVSLAkJKGNoYXJfdSAqKSJrRW50ZXIifSwKKyAgICB7S19LUE9JTlQsCQkoY2hhcl91ICopImtQb2ludCJ9LAorCisgICAge0tfSzAsCQkoY2hhcl91ICopImswIn0sCisgICAge0tfSzEsCQkoY2hhcl91ICopImsxIn0sCisgICAge0tfSzIsCQkoY2hhcl91ICopImsyIn0sCisgICAge0tfSzMsCQkoY2hhcl91ICopImszIn0sCisgICAge0tfSzQsCQkoY2hhcl91ICopIms0In0sCisgICAge0tfSzUsCQkoY2hhcl91ICopIms1In0sCisgICAge0tfSzYsCQkoY2hhcl91ICopIms2In0sCisgICAge0tfSzcsCQkoY2hhcl91ICopIms3In0sCisgICAge0tfSzgsCQkoY2hhcl91ICopIms4In0sCisgICAge0tfSzksCQkoY2hhcl91ICopIms5In0sCisKKyAgICB7JzwnLAkJKGNoYXJfdSAqKSJsdCJ9LAorCisgICAge0tfTU9VU0UsCQkoY2hhcl91ICopIk1vdXNlIn0sCisgICAge0tfTkVUVEVSTV9NT1VTRSwJKGNoYXJfdSAqKSJOZXRNb3VzZSJ9LAorICAgIHtLX0RFQ19NT1VTRSwJKGNoYXJfdSAqKSJEZWNNb3VzZSJ9LAorICAgIHtLX0pTQlRFUk1fTU9VU0UsCShjaGFyX3UgKikiSnNiTW91c2UifSwKKyAgICB7S19QVEVSTV9NT1VTRSwJKGNoYXJfdSAqKSJQdGVybU1vdXNlIn0sCisgICAge0tfTEVGVE1PVVNFLAkoY2hhcl91ICopIkxlZnRNb3VzZSJ9LAorICAgIHtLX0xFRlRNT1VTRV9OTSwJKGNoYXJfdSAqKSJMZWZ0TW91c2VOTSJ9LAorICAgIHtLX0xFRlREUkFHLAkoY2hhcl91ICopIkxlZnREcmFnIn0sCisgICAge0tfTEVGVFJFTEVBU0UsCShjaGFyX3UgKikiTGVmdFJlbGVhc2UifSwKKyAgICB7S19MRUZUUkVMRUFTRV9OTSwJKGNoYXJfdSAqKSJMZWZ0UmVsZWFzZU5NIn0sCisgICAge0tfTUlERExFTU9VU0UsCShjaGFyX3UgKikiTWlkZGxlTW91c2UifSwKKyAgICB7S19NSURETEVEUkFHLAkoY2hhcl91ICopIk1pZGRsZURyYWcifSwKKyAgICB7S19NSURETEVSRUxFQVNFLAkoY2hhcl91ICopIk1pZGRsZVJlbGVhc2UifSwKKyAgICB7S19SSUdIVE1PVVNFLAkoY2hhcl91ICopIlJpZ2h0TW91c2UifSwKKyAgICB7S19SSUdIVERSQUcsCShjaGFyX3UgKikiUmlnaHREcmFnIn0sCisgICAge0tfUklHSFRSRUxFQVNFLAkoY2hhcl91ICopIlJpZ2h0UmVsZWFzZSJ9LAorICAgIHtLX01PVVNFRE9XTiwJKGNoYXJfdSAqKSJNb3VzZURvd24ifSwKKyAgICB7S19NT1VTRVVQLAkJKGNoYXJfdSAqKSJNb3VzZVVwIn0sCisgICAge0tfWDFNT1VTRSwJCShjaGFyX3UgKikiWDFNb3VzZSJ9LAorICAgIHtLX1gxRFJBRywJCShjaGFyX3UgKikiWDFEcmFnIn0sCisgICAge0tfWDFSRUxFQVNFLAkJKGNoYXJfdSAqKSJYMVJlbGVhc2UifSwKKyAgICB7S19YMk1PVVNFLAkJKGNoYXJfdSAqKSJYMk1vdXNlIn0sCisgICAge0tfWDJEUkFHLAkJKGNoYXJfdSAqKSJYMkRyYWcifSwKKyAgICB7S19YMlJFTEVBU0UsCQkoY2hhcl91ICopIlgyUmVsZWFzZSJ9LAorICAgIHtLX0RST1AsCQkoY2hhcl91ICopIkRyb3AifSwKKyAgICB7S19aRVJPLAkJKGNoYXJfdSAqKSJOdWwifSwKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICB7S19TTlIsCQkoY2hhcl91ICopIlNOUiJ9LAorI2VuZGlmCisgICAge0tfUExVRywJCShjaGFyX3UgKikiUGx1ZyJ9LAorICAgIHswLAkJCU5VTEx9Cit9OworCisjZGVmaW5lIEtFWV9OQU1FU19UQUJMRV9MRU4gKHNpemVvZihrZXlfbmFtZXNfdGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBrZXlfbmFtZV9lbnRyeSkpCisKKyNpZmRlZiBGRUFUX01PVVNFCitzdGF0aWMgc3RydWN0IG1vdXNldGFibGUKK3sKKyAgICBpbnQJICAgIHBzZXVkb19jb2RlOwkvKiBDb2RlIGZvciBwc2V1ZG8gbW91c2UgZXZlbnQgKi8KKyAgICBpbnQJICAgIGJ1dHRvbjsJCS8qIFdoaWNoIG1vdXNlIGJ1dHRvbiBpcyBpdD8gKi8KKyAgICBpbnQJICAgIGlzX2NsaWNrOwkJLyogSXMgaXQgYSBtb3VzZSBidXR0b24gY2xpY2sgZXZlbnQ/ICovCisgICAgaW50CSAgICBpc19kcmFnOwkJLyogSXMgaXQgYSBtb3VzZSBkcmFnIGV2ZW50PyAqLworfSBtb3VzZV90YWJsZVtdID0KK3sKKyAgICB7KGludClLRV9MRUZUTU9VU0UsCQlNT1VTRV9MRUZULAlUUlVFLAlGQUxTRX0sCisjaWZkZWYgRkVBVF9HVUkKKyAgICB7KGludClLRV9MRUZUTU9VU0VfTk0sCU1PVVNFX0xFRlQsCVRSVUUsCUZBTFNFfSwKKyNlbmRpZgorICAgIHsoaW50KUtFX0xFRlREUkFHLAkJTU9VU0VfTEVGVCwJRkFMU0UsCVRSVUV9LAorICAgIHsoaW50KUtFX0xFRlRSRUxFQVNFLAlNT1VTRV9MRUZULAlGQUxTRSwJRkFMU0V9LAorI2lmZGVmIEZFQVRfR1VJCisgICAgeyhpbnQpS0VfTEVGVFJFTEVBU0VfTk0sCU1PVVNFX0xFRlQsCUZBTFNFLAlGQUxTRX0sCisjZW5kaWYKKyAgICB7KGludClLRV9NSURETEVNT1VTRSwJTU9VU0VfTUlERExFLAlUUlVFLAlGQUxTRX0sCisgICAgeyhpbnQpS0VfTUlERExFRFJBRywJTU9VU0VfTUlERExFLAlGQUxTRSwJVFJVRX0sCisgICAgeyhpbnQpS0VfTUlERExFUkVMRUFTRSwJTU9VU0VfTUlERExFLAlGQUxTRSwJRkFMU0V9LAorICAgIHsoaW50KUtFX1JJR0hUTU9VU0UsCU1PVVNFX1JJR0hULAlUUlVFLAlGQUxTRX0sCisgICAgeyhpbnQpS0VfUklHSFREUkFHLAkJTU9VU0VfUklHSFQsCUZBTFNFLAlUUlVFfSwKKyAgICB7KGludClLRV9SSUdIVFJFTEVBU0UsCU1PVVNFX1JJR0hULAlGQUxTRSwJRkFMU0V9LAorICAgIHsoaW50KUtFX1gxTU9VU0UsCQlNT1VTRV9YMSwJVFJVRSwJRkFMU0V9LAorICAgIHsoaW50KUtFX1gxRFJBRywJCU1PVVNFX1gxLAlGQUxTRSwJVFJVRX0sCisgICAgeyhpbnQpS0VfWDFSRUxFQVNFLAkJTU9VU0VfWDEsCUZBTFNFLAlGQUxTRX0sCisgICAgeyhpbnQpS0VfWDJNT1VTRSwJCU1PVVNFX1gyLAlUUlVFLAlGQUxTRX0sCisgICAgeyhpbnQpS0VfWDJEUkFHLAkJTU9VU0VfWDIsCUZBTFNFLAlUUlVFfSwKKyAgICB7KGludClLRV9YMlJFTEVBU0UsCQlNT1VTRV9YMiwJRkFMU0UsCUZBTFNFfSwKKyAgICAvKiBEUkFHIHdpdGhvdXQgQ0xJQ0sgKi8KKyAgICB7KGludClLRV9JR05PUkUsCQlNT1VTRV9SRUxFQVNFLAlGQUxTRSwJVFJVRX0sCisgICAgLyogUkVMRUFTRSB3aXRob3V0IENMSUNLICovCisgICAgeyhpbnQpS0VfSUdOT1JFLAkJTU9VU0VfUkVMRUFTRSwJRkFMU0UsCUZBTFNFfSwKKyAgICB7MCwJCQkJMCwJCTAsCTB9LAorfTsKKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKy8qCisgKiBSZXR1cm4gdGhlIG1vZGlmaWVyIG1hc2sgYml0IChNT0RfTUFTS18qKSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4KKyAqIG1vZGlmaWVyIG5hbWUgKCdTJyBmb3IgU2hpZnQsICdDJyBmb3IgQ3RybCBldGMpLgorICovCisgICAgaW50CituYW1lX3RvX21vZF9tYXNrKGMpCisgICAgaW50CSAgICBjOworeworICAgIGludAkgICAgaTsKKworICAgIGMgPSBUT1VQUEVSX0FTQyhjKTsKKyAgICBmb3IgKGkgPSAwOyBtb2RfbWFza190YWJsZVtpXS5tb2RfbWFzayAhPSAwOyBpKyspCisJaWYgKGMgPT0gbW9kX21hc2tfdGFibGVbaV0ubmFtZSkKKwkgICAgcmV0dXJuIG1vZF9tYXNrX3RhYmxlW2ldLm1vZF9mbGFnOworICAgIHJldHVybiAwOworfQorCisjaWYgMCAvKiBub3QgdXNlZCAqLworLyoKKyAqIERlY2lkZSB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgY29kZSAoS18qKSBpcyBhIHNoaWZ0ZWQgc3BlY2lhbAorICoga2V5IChieSBsb29raW5nIGF0IG1vZF9tYXNrKS4gIElmIGl0IGlzLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgc2hpZnRlZAorICoga2V5IGNvZGUsIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyIGFzIGlzLgorICovCisgICAgaW50CitjaGVja19zaGlmdGVkX3NwZWNfa2V5KGMpCisgICAgaW50CSAgICBjOworeworICAgIHJldHVybiBzaW1wbGlmeV9rZXkoYywgJm1vZF9tYXNrKTsKK30KKyNlbmRpZgorCisvKgorICogQ2hlY2sgaWYgaWYgdGhlcmUgaXMgYSBzcGVjaWFsIGtleSBjb2RlIGZvciAia2V5IiB0aGF0IGluY2x1ZGVzIHRoZQorICogbW9kaWZpZXJzIHNwZWNpZmllZC4KKyAqLworICAgIGludAorc2ltcGxpZnlfa2V5KGtleSwgbW9kaWZpZXJzKQorICAgIGludAkgICAga2V5OworICAgIGludAkgICAgKm1vZGlmaWVyczsKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICBrZXkwOworICAgIGludAkgICAga2V5MTsKKworICAgIGlmICgqbW9kaWZpZXJzICYgKE1PRF9NQVNLX1NISUZUIHwgTU9EX01BU0tfQ1RSTCB8IE1PRF9NQVNLX0FMVCkpCisgICAgeworCS8qIFRBQiBpcyBhIHNwZWNpYWwgY2FzZSAqLworCWlmIChrZXkgPT0gVEFCICYmICgqbW9kaWZpZXJzICYgTU9EX01BU0tfU0hJRlQpKQorCXsKKwkgICAgKm1vZGlmaWVycyAmPSB+TU9EX01BU0tfU0hJRlQ7CisJICAgIHJldHVybiBLX1NfVEFCOworCX0KKwlrZXkwID0gS0VZMlRFUk1DQVAwKGtleSk7CisJa2V5MSA9IEtFWTJURVJNQ0FQMShrZXkpOworCWZvciAoaSA9IDA7IG1vZGlmaWVyX2tleXNfdGFibGVbaV0gIT0gTlVMOyBpICs9IE1PRF9LRVlTX0VOVFJZX1NJWkUpCisJICAgIGlmIChrZXkwID09IG1vZGlmaWVyX2tleXNfdGFibGVbaSArIDNdCisJCSAgICAmJiBrZXkxID09IG1vZGlmaWVyX2tleXNfdGFibGVbaSArIDRdCisJCSAgICAmJiAoKm1vZGlmaWVycyAmIG1vZGlmaWVyX2tleXNfdGFibGVbaV0pKQorCSAgICB7CisJCSptb2RpZmllcnMgJj0gfm1vZGlmaWVyX2tleXNfdGFibGVbaV07CisJCXJldHVybiBURVJNQ0FQMktFWShtb2RpZmllcl9rZXlzX3RhYmxlW2kgKyAxXSwKKwkJCQkJCSAgIG1vZGlmaWVyX2tleXNfdGFibGVbaSArIDJdKTsKKwkgICAgfQorICAgIH0KKyAgICByZXR1cm4ga2V5OworfQorCisvKgorICogUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBrZXkgd2hlbiB0aGUgZ2l2ZW4KKyAqIG1vZGlmaWVycyBhcmUgZG93bi4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfc3BlY2lhbF9rZXlfbmFtZShjLCBtb2RpZmllcnMpCisgICAgaW50CSAgICBjOworICAgIGludAkgICAgbW9kaWZpZXJzOworeworICAgIHN0YXRpYyBjaGFyX3Ugc3RyaW5nW01BWF9LRVlfTkFNRV9MRU4gKyAxXTsKKworICAgIGludAkgICAgaSwgaWR4OworICAgIGludAkgICAgdGFibGVfaWR4OworICAgIGNoYXJfdSAgKnM7CisKKyAgICBzdHJpbmdbMF0gPSAnPCc7CisgICAgaWR4ID0gMTsKKworICAgIC8qIEtleSB0aGF0IHN0YW5kcyBmb3IgYSBub3JtYWwgY2hhcmFjdGVyLiAqLworICAgIGlmIChJU19TUEVDSUFMKGMpICYmIEtFWTJURVJNQ0FQMChjKSA9PSBLU19LRVkpCisJYyA9IEtFWTJURVJNQ0FQMShjKTsKKworICAgIC8qCisgICAgICogVHJhbnNsYXRlIHNoaWZ0ZWQgc3BlY2lhbCBrZXlzIGludG8gdW5zaGlmdGVkIGtleXMgYW5kIHNldCBtb2RpZmllci4KKyAgICAgKiBTYW1lIGZvciBDVFJMIGFuZCBBTFQgbW9kaWZpZXJzLgorICAgICAqLworICAgIGlmIChJU19TUEVDSUFMKGMpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBtb2RpZmllcl9rZXlzX3RhYmxlW2ldICE9IDA7IGkgKz0gTU9EX0tFWVNfRU5UUllfU0laRSkKKwkgICAgaWYgKCAgICAgICBLRVkyVEVSTUNBUDAoYykgPT0gKGludCltb2RpZmllcl9rZXlzX3RhYmxlW2kgKyAxXQorCQkgICAgJiYgKGludClLRVkyVEVSTUNBUDEoYykgPT0gKGludCltb2RpZmllcl9rZXlzX3RhYmxlW2kgKyAyXSkKKwkgICAgeworCQltb2RpZmllcnMgfD0gbW9kaWZpZXJfa2V5c190YWJsZVtpXTsKKwkJYyA9IFRFUk1DQVAyS0VZKG1vZGlmaWVyX2tleXNfdGFibGVbaSArIDNdLAorCQkJCQkJICAgbW9kaWZpZXJfa2V5c190YWJsZVtpICsgNF0pOworCQlicmVhazsKKwkgICAgfQorICAgIH0KKworICAgIC8qIHRyeSB0byBmaW5kIHRoZSBrZXkgaW4gdGhlIHNwZWNpYWwga2V5IHRhYmxlICovCisgICAgdGFibGVfaWR4ID0gZmluZF9zcGVjaWFsX2tleV9pbl90YWJsZShjKTsKKworICAgIC8qCisgICAgICogV2hlbiBub3QgYSBrbm93biBzcGVjaWFsIGtleSwgYW5kIG5vdCBhIHByaW50YWJsZSBjaGFyYWN0ZXIsIHRyeSB0bworICAgICAqIGV4dHJhY3QgbW9kaWZpZXJzLgorICAgICAqLworICAgIGlmIChjID4gMAorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgJiYgKCptYl9jaGFyMmxlbikoYykgPT0gMQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKwlpZiAodGFibGVfaWR4IDwgMAorCQkmJiAoIXZpbV9pc3ByaW50YyhjKSB8fCAoYyAmIDB4N2YpID09ICcgJykKKwkJJiYgKGMgJiAweDgwKSkKKwl7CisJICAgIGMgJj0gMHg3ZjsKKwkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0FMVDsKKwkgICAgLyogdHJ5IGFnYWluLCB0byBmaW5kIHRoZSB1bi1hbHRlZCBrZXkgaW4gdGhlIHNwZWNpYWwga2V5IHRhYmxlICovCisJICAgIHRhYmxlX2lkeCA9IGZpbmRfc3BlY2lhbF9rZXlfaW5fdGFibGUoYyk7CisJfQorCWlmICh0YWJsZV9pZHggPCAwICYmICF2aW1faXNwcmludGMoYykgJiYgYyA8ICcgJykKKwl7CisjaWZkZWYgRUJDRElDCisJICAgIGMgPSBDdHJsQ2hhcihjKTsKKyNlbHNlCisJICAgIGMgKz0gJ0AnOworI2VuZGlmCisJICAgIG1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOworCX0KKyAgICB9CisKKyAgICAvKiB0cmFuc2xhdGUgdGhlIG1vZGlmaWVyIGludG8gYSBzdHJpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBtb2RfbWFza190YWJsZVtpXS5uYW1lICE9ICdBJzsgaSsrKQorCWlmICgobW9kaWZpZXJzICYgbW9kX21hc2tfdGFibGVbaV0ubW9kX21hc2spCisJCQkJCQk9PSBtb2RfbWFza190YWJsZVtpXS5tb2RfZmxhZykKKwl7CisJICAgIHN0cmluZ1tpZHgrK10gPSBtb2RfbWFza190YWJsZVtpXS5uYW1lOworCSAgICBzdHJpbmdbaWR4KytdID0gKGNoYXJfdSknLSc7CisJfQorCisgICAgaWYgKHRhYmxlX2lkeCA8IDApCQkvKiB1bmtub3duIHNwZWNpYWwga2V5LCBtYXkgb3V0cHV0IHRfeHggKi8KKyAgICB7CisJaWYgKElTX1NQRUNJQUwoYykpCisJeworCSAgICBzdHJpbmdbaWR4KytdID0gJ3QnOworCSAgICBzdHJpbmdbaWR4KytdID0gJ18nOworCSAgICBzdHJpbmdbaWR4KytdID0gS0VZMlRFUk1DQVAwKGMpOworCSAgICBzdHJpbmdbaWR4KytdID0gS0VZMlRFUk1DQVAxKGMpOworCX0KKwkvKiBOb3QgYSBzcGVjaWFsIGtleSwgb25seSBtb2RpZmllcnMsIG91dHB1dCBkaXJlY3RseSAqLworCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlICYmICgqbWJfY2hhcjJsZW4pKGMpID4gMSkKKwkJaWR4ICs9ICgqbWJfY2hhcjJieXRlcykoYywgc3RyaW5nICsgaWR4KTsKKwkgICAgZWxzZQorI2VuZGlmCisJICAgIGlmICh2aW1faXNwcmludGMoYykpCisJCXN0cmluZ1tpZHgrK10gPSBjOworCSAgICBlbHNlCisJICAgIHsKKwkJcyA9IHRyYW5zY2hhcihjKTsKKwkJd2hpbGUgKCpzKQorCQkgICAgc3RyaW5nW2lkeCsrXSA9ICpzKys7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UJCS8qIHVzZSBuYW1lIG9mIHNwZWNpYWwga2V5ICovCisgICAgeworCVNUUkNQWShzdHJpbmcgKyBpZHgsIGtleV9uYW1lc190YWJsZVt0YWJsZV9pZHhdLm5hbWUpOworCWlkeCA9IChpbnQpU1RSTEVOKHN0cmluZyk7CisgICAgfQorICAgIHN0cmluZ1tpZHgrK10gPSAnPic7CisgICAgc3RyaW5nW2lkeF0gPSBOVUw7CisgICAgcmV0dXJuIHN0cmluZzsKK30KKworLyoKKyAqIFRyeSB0cmFuc2xhdGluZyBhIDw+IG5hbWUgYXQgKCpzcmNwKVtdIHRvIGRzdFtdLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZGRlZCB0byBkc3RbXSwgemVybyBmb3Igbm8gbWF0Y2guCisgKiBJZiB0aGVyZSBpcyBhIG1hdGNoLCBzcmNwIGlzIGFkdmFuY2VkIHRvIGFmdGVyIHRoZSA8PiBuYW1lLgorICogZHN0W10gbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdCAodXAgdG8gc2l4IGNoYXJhY3RlcnMpIQorICovCisgICAgaW50Cit0cmFuc19zcGVjaWFsKHNyY3AsIGRzdCwga2V5Y29kZSkKKyAgICBjaGFyX3UJKipzcmNwOworICAgIGNoYXJfdQkqZHN0OworICAgIGludAkJa2V5Y29kZTsgLyogcHJlZmVyIGtleSBjb2RlLCBlLmcuIEtfREVMIGluc3RlYWQgb2YgREVMICovCit7CisgICAgaW50CQltb2RpZmllcnMgPSAwOworICAgIGludAkJa2V5OworICAgIGludAkJZGxlbiA9IDA7CisKKyAgICBrZXkgPSBmaW5kX3NwZWNpYWxfa2V5KHNyY3AsICZtb2RpZmllcnMsIGtleWNvZGUpOworICAgIGlmIChrZXkgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIC8qIFB1dCB0aGUgYXBwcm9wcmlhdGUgbW9kaWZpZXIgaW4gYSBzdHJpbmcgKi8KKyAgICBpZiAobW9kaWZpZXJzICE9IDApCisgICAgeworCWRzdFtkbGVuKytdID0gS19TUEVDSUFMOworCWRzdFtkbGVuKytdID0gS1NfTU9ESUZJRVI7CisJZHN0W2RsZW4rK10gPSBtb2RpZmllcnM7CisgICAgfQorCisgICAgaWYgKElTX1NQRUNJQUwoa2V5KSkKKyAgICB7CisJZHN0W2RsZW4rK10gPSBLX1NQRUNJQUw7CisJZHN0W2RsZW4rK10gPSBLRVkyVEVSTUNBUDAoa2V5KTsKKwlkc3RbZGxlbisrXSA9IEtFWTJURVJNQ0FQMShrZXkpOworICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgZWxzZSBpZiAoaGFzX21ieXRlICYmICFrZXljb2RlKQorCWRsZW4gKz0gKCptYl9jaGFyMmJ5dGVzKShrZXksIGRzdCArIGRsZW4pOworI2VuZGlmCisgICAgZWxzZSBpZiAoa2V5Y29kZSkKKwlkbGVuID0gKGludCkoYWRkX2NoYXIyYnVmKGtleSwgZHN0ICsgZGxlbikgLSBkc3QpOworICAgIGVsc2UKKwlkc3RbZGxlbisrXSA9IGtleTsKKworICAgIHJldHVybiBkbGVuOworfQorCisvKgorICogVHJ5IHRyYW5zbGF0aW5nIGEgPD4gbmFtZSBhdCAoKnNyY3ApW10sIHJldHVybiB0aGUga2V5IGFuZCBtb2RpZmllcnMuCisgKiBzcmNwIGlzIGFkdmFuY2VkIHRvIGFmdGVyIHRoZSA8PiBuYW1lLgorICogcmV0dXJucyAwIGlmIHRoZXJlIGlzIG5vIG1hdGNoLgorICovCisgICAgaW50CitmaW5kX3NwZWNpYWxfa2V5KHNyY3AsIG1vZHAsIGtleWNvZGUpCisgICAgY2hhcl91CSoqc3JjcDsKKyAgICBpbnQJCSptb2RwOworICAgIGludAkJa2V5Y29kZTsgLyogcHJlZmVyIGtleSBjb2RlLCBlLmcuIEtfREVMIGluc3RlYWQgb2YgREVMICovCit7CisgICAgY2hhcl91CSpsYXN0X2Rhc2g7CisgICAgY2hhcl91CSplbmRfb2ZfbmFtZTsKKyAgICBjaGFyX3UJKnNyYzsKKyAgICBjaGFyX3UJKmJwOworICAgIGludAkJbW9kaWZpZXJzOworICAgIGludAkJYml0OworICAgIGludAkJa2V5OworICAgIGxvbmdfdQluOworCisgICAgc3JjID0gKnNyY3A7CisgICAgaWYgKHNyY1swXSAhPSAnPCcpCisJcmV0dXJuIDA7CisKKyAgICAvKiBGaW5kIGVuZCBvZiBtb2RpZmllciBsaXN0ICovCisgICAgbGFzdF9kYXNoID0gc3JjOworICAgIGZvciAoYnAgPSBzcmMgKyAxOyAqYnAgPT0gJy0nIHx8IHZpbV9pc0lEYygqYnApOyBicCsrKQorICAgIHsKKwlpZiAoKmJwID09ICctJykKKwl7CisJICAgIGxhc3RfZGFzaCA9IGJwOworCSAgICBpZiAoYnBbMV0gIT0gTlVMICYmIGJwWzJdID09ICc+JykKKwkJKyticDsJLyogYW55dGhpbmcgYWNjZXB0ZWQsIGxpa2UgPEMtPz4gKi8KKwl9CisJaWYgKGJwWzBdID09ICd0JyAmJiBicFsxXSA9PSAnXycgJiYgYnBbMl0gJiYgYnBbM10pCisJICAgIGJwICs9IDM7CS8qIHNraXAgdF94eCwgeHggbWF5IGJlICctJyBvciAnPicgKi8KKyAgICB9CisKKyAgICBpZiAoKmJwID09ICc+JykJLyogZm91bmQgbWF0Y2hpbmcgJz4nICovCisgICAgeworCWVuZF9vZl9uYW1lID0gYnAgKyAxOworCisJaWYgKFNUUk5JQ01QKHNyYyArIDEsICJjaGFyLSIsIDUpID09IDAgJiYgVklNX0lTRElHSVQoc3JjWzZdKSkKKwl7CisJICAgIC8qIDxDaGFyLTEyMz4gb3IgPENoYXItMDMzPiBvciA8Q2hhci0weDMzPiAqLworCSAgICB2aW1fc3RyMm5yKHNyYyArIDYsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsIE5VTEwsICZuKTsKKwkgICAgKm1vZHAgPSAwOworCSAgICAqc3JjcCA9IGVuZF9vZl9uYW1lOworCSAgICByZXR1cm4gKGludCluOworCX0KKworCS8qIFdoaWNoIG1vZGlmaWVycyBhcmUgZ2l2ZW4/ICovCisJbW9kaWZpZXJzID0gMHgwOworCWZvciAoYnAgPSBzcmMgKyAxOyBicCA8IGxhc3RfZGFzaDsgYnArKykKKwl7CisJICAgIGlmICgqYnAgIT0gJy0nKQorCSAgICB7CisJCWJpdCA9IG5hbWVfdG9fbW9kX21hc2soKmJwKTsKKwkJaWYgKGJpdCA9PSAweDApCisJCSAgICBicmVhazsJLyogSWxsZWdhbCBtb2RpZmllciBuYW1lICovCisJCW1vZGlmaWVycyB8PSBiaXQ7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIExlZ2FsIG1vZGlmaWVyIG5hbWUuCisJICovCisJaWYgKGJwID49IGxhc3RfZGFzaCkKKwl7CisJICAgIC8qCisJICAgICAqIE1vZGlmaWVyIHdpdGggc2luZ2xlIGxldHRlciwgb3Igc3BlY2lhbCBrZXkgbmFtZS4KKwkgICAgICovCisJICAgIGlmIChtb2RpZmllcnMgIT0gMCAmJiBsYXN0X2Rhc2hbMl0gPT0gJz4nKQorCQlrZXkgPSBsYXN0X2Rhc2hbMV07CisJICAgIGVsc2UKKwkJa2V5ID0gZ2V0X3NwZWNpYWxfa2V5X2NvZGUobGFzdF9kYXNoICsgMSk7CisKKwkgICAgLyoKKwkgICAgICogZ2V0X3NwZWNpYWxfa2V5X2NvZGUoKSBtYXkgcmV0dXJuIE5VTCBmb3IgaW52YWxpZAorCSAgICAgKiBzcGVjaWFsIGtleSBuYW1lLgorCSAgICAgKi8KKwkgICAgaWYgKGtleSAhPSBOVUwpCisJICAgIHsKKwkJLyoKKwkJICogT25seSB1c2UgYSBtb2RpZmllciB3aGVuIHRoZXJlIGlzIG5vIHNwZWNpYWwga2V5IGNvZGUgdGhhdAorCQkgKiBpbmNsdWRlcyB0aGUgbW9kaWZpZXIuCisJCSAqLworCQlrZXkgPSBzaW1wbGlmeV9rZXkoa2V5LCAmbW9kaWZpZXJzKTsKKworCQlpZiAoIWtleWNvZGUpCisJCXsKKwkJICAgIC8qIGRvbid0IHdhbnQga2V5Y29kZSwgdXNlIHNpbmdsZSBieXRlIGNvZGUgKi8KKwkJICAgIGlmIChrZXkgPT0gS19CUykKKwkJCWtleSA9IEJTOworCQkgICAgZWxzZSBpZiAoa2V5ID09IEtfREVMIHx8IGtleSA9PSBLX0tERUwpCisJCQlrZXkgPSBERUw7CisJCX0KKworCQkvKgorCQkgKiBOb3JtYWwgS2V5IHdpdGggbW9kaWZpZXI6IFRyeSB0byBtYWtlIGEgc2luZ2xlIGJ5dGUgY29kZS4KKwkJICovCisJCWlmICghSVNfU1BFQ0lBTChrZXkpKQorCQkgICAga2V5ID0gZXh0cmFjdF9tb2RpZmllcnMoa2V5LCAmbW9kaWZpZXJzKTsKKworCQkqbW9kcCA9IG1vZGlmaWVyczsKKwkJKnNyY3AgPSBlbmRfb2ZfbmFtZTsKKwkJcmV0dXJuIGtleTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcnkgdG8gaW5jbHVkZSBtb2RpZmllcnMgaW4gdGhlIGtleS4KKyAqIENoYW5nZXMgIlNoaWZ0LWEiIHRvICdBJywgIkFsdC1BIiB0byAweGMwLCBldGMuCisgKi8KKyAgICBpbnQKK2V4dHJhY3RfbW9kaWZpZXJzKGtleSwgbW9kcCkKKyAgICBpbnQJICAgIGtleTsKKyAgICBpbnQJICAgICptb2RwOworeworICAgIGludAltb2RpZmllcnMgPSAqbW9kcDsKKworI2lmZGVmIE1BQ09TCisgICAgLyogQ29tbWFuZC1rZXkgcmVhbGx5IHNwZWNpYWwsIE5vIGZhbmN5bmVzdCAqLworICAgIGlmICghKG1vZGlmaWVycyAmIE1PRF9NQVNLX0NNRCkpCisjZW5kaWYKKyAgICBpZiAoKG1vZGlmaWVycyAmIE1PRF9NQVNLX1NISUZUKSAmJiBBU0NJSV9JU0FMUEhBKGtleSkpCisgICAgeworCWtleSA9IFRPVVBQRVJfQVNDKGtleSk7CisJbW9kaWZpZXJzICY9IH5NT0RfTUFTS19TSElGVDsKKyAgICB9CisgICAgaWYgKChtb2RpZmllcnMgJiBNT0RfTUFTS19DVFJMKQorI2lmZGVmIEVCQ0RJQworCSAgICAvKiAqIFRPRE86IEVCQ0RJQyBCZXR0ZXIgdXNlOgorCSAgICAgKiAmJiAoQ3RybF9jaHIoa2V5KSB8fCBrZXkgPT0gJz8nKQorCSAgICAgKiA/Pz8gICovCisJICAgICYmIHN0cmNocigiP0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eXyIsIGtleSkKKwkJCQkJCSAgICAgICAhPSBOVUxMCisjZWxzZQorCSAgICAmJiAoKGtleSA+PSAnPycgJiYga2V5IDw9ICdfJykgfHwgQVNDSUlfSVNBTFBIQShrZXkpKQorI2VuZGlmCisJICAgICkKKyAgICB7CisJa2V5ID0gQ3RybF9jaHIoa2V5KTsKKwltb2RpZmllcnMgJj0gfk1PRF9NQVNLX0NUUkw7CisJLyogPEMtQD4gaXMgPE51bD4gKi8KKwlpZiAoa2V5ID09IDApCisJICAgIGtleSA9IEtfWkVSTzsKKyAgICB9CisjaWZkZWYgTUFDT1MKKyAgICAvKiBDb21tYW5kLWtleSByZWFsbHkgc3BlY2lhbCwgTm8gZmFuY3luZXN0ICovCisgICAgaWYgKCEobW9kaWZpZXJzICYgTU9EX01BU0tfQ01EKSkKKyNlbmRpZgorICAgIGlmICgobW9kaWZpZXJzICYgTU9EX01BU0tfQUxUKSAmJiBrZXkgPCAweDgwCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAmJiAhZW5jX2RiY3MJCS8qIGF2b2lkIGNyZWF0aW5nIGEgbGVhZCBieXRlICovCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlrZXkgfD0gMHg4MDsKKwltb2RpZmllcnMgJj0gfk1PRF9NQVNLX0FMVDsJLyogcmVtb3ZlIHRoZSBNRVRBIG1vZGlmaWVyICovCisgICAgfQorCisgICAgKm1vZHAgPSBtb2RpZmllcnM7CisgICAgcmV0dXJuIGtleTsKK30KKworLyoKKyAqIFRyeSB0byBmaW5kIGtleSAiYyIgaW4gdGhlIHNwZWNpYWwga2V5IHRhYmxlLgorICogUmV0dXJuIHRoZSBpbmRleCB3aGVuIGZvdW5kLCAtMSB3aGVuIG5vdCBmb3VuZC4KKyAqLworICAgIGludAorZmluZF9zcGVjaWFsX2tleV9pbl90YWJsZShjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBrZXlfbmFtZXNfdGFibGVbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJaWYgKGMgPT0ga2V5X25hbWVzX3RhYmxlW2ldLmtleSkKKwkgICAgYnJlYWs7CisgICAgaWYgKGtleV9uYW1lc190YWJsZVtpXS5uYW1lID09IE5VTEwpCisJaSA9IC0xOworICAgIHJldHVybiBpOworfQorCisvKgorICogRmluZCB0aGUgc3BlY2lhbCBrZXkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAodGhlIGdpdmVuIHN0cmluZyBkb2VzIG5vdCBoYXZlIHRvCisgKiBlbmQgd2l0aCBOVUwsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gZW5kIGJlZm9yZSB0aGUgZmlyc3Qgbm9uLWlkY2hhcikuCisgKiBJZiB0aGUgbmFtZSBzdGFydHMgd2l0aCAidF8iIHRoZSBuZXh0IHR3byBjaGFyYWN0ZXJzIGFyZSBpbnRlcnByZXRlZCBhcyBhCisgKiB0ZXJtY2FwIG5hbWUuCisgKiBSZXR1cm4gdGhlIGtleSBjb2RlLCBvciAwIGlmIG5vdCBmb3VuZC4KKyAqLworICAgIGludAorZ2V0X3NwZWNpYWxfa2V5X2NvZGUobmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOworeworICAgIGNoYXJfdSAgKnRhYmxlX25hbWU7CisgICAgY2hhcl91ICBzdHJpbmdbM107CisgICAgaW50CSAgICBpLCBqOworCisgICAgLyoKKyAgICAgKiBJZiBpdCdzIDx0X3h4PiB3ZSBnZXQgdGhlIGNvZGUgZm9yIHh4IGZyb20gdGhlIHRlcm1jYXAKKyAgICAgKi8KKyAgICBpZiAobmFtZVswXSA9PSAndCcgJiYgbmFtZVsxXSA9PSAnXycgJiYgbmFtZVsyXSAhPSBOVUwgJiYgbmFtZVszXSAhPSBOVUwpCisgICAgeworCXN0cmluZ1swXSA9IG5hbWVbMl07CisJc3RyaW5nWzFdID0gbmFtZVszXTsKKwlzdHJpbmdbMl0gPSBOVUw7CisJaWYgKGFkZF90ZXJtY2FwX2VudHJ5KHN0cmluZywgRkFMU0UpID09IE9LKQorCSAgICByZXR1cm4gVEVSTUNBUDJLRVkobmFtZVsyXSwgbmFtZVszXSk7CisgICAgfQorICAgIGVsc2UKKwlmb3IgKGkgPSAwOyBrZXlfbmFtZXNfdGFibGVbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJeworCSAgICB0YWJsZV9uYW1lID0ga2V5X25hbWVzX3RhYmxlW2ldLm5hbWU7CisJICAgIGZvciAoaiA9IDA7IHZpbV9pc0lEYyhuYW1lW2pdKSAmJiB0YWJsZV9uYW1lW2pdICE9IE5VTDsgaisrKQorCQlpZiAoVE9MT1dFUl9BU0ModGFibGVfbmFtZVtqXSkgIT0gVE9MT1dFUl9BU0MobmFtZVtqXSkpCisJCSAgICBicmVhazsKKwkgICAgaWYgKCF2aW1faXNJRGMobmFtZVtqXSkgJiYgdGFibGVfbmFtZVtqXSA9PSBOVUwpCisJCXJldHVybiBrZXlfbmFtZXNfdGFibGVbaV0ua2V5OworCX0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorICAgIGNoYXJfdSAqCitnZXRfa2V5X25hbWUoaSkKKyAgICBpbnQJICAgIGk7Cit7CisgICAgaWYgKGkgPj0gS0VZX05BTUVTX1RBQkxFX0xFTikKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gIGtleV9uYW1lc190YWJsZVtpXS5uYW1lOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01PVVNFCisvKgorICogTG9vayB1cCB0aGUgZ2l2ZW4gbW91c2UgY29kZSB0byByZXR1cm4gdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGluIHRoZSBvdGhlcgorICogYXJndW1lbnRzLiAgUmV0dXJuIHdoaWNoIGJ1dHRvbiBpcyBkb3duIG9yIHdhcyByZWxlYXNlZC4KKyAqLworICAgIGludAorZ2V0X21vdXNlX2J1dHRvbihjb2RlLCBpc19jbGljaywgaXNfZHJhZykKKyAgICBpbnQJICAgIGNvZGU7CisgICAgaW50CSAgICAqaXNfY2xpY2s7CisgICAgaW50CSAgICAqaXNfZHJhZzsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBtb3VzZV90YWJsZVtpXS5wc2V1ZG9fY29kZTsgaSsrKQorCWlmIChjb2RlID09IG1vdXNlX3RhYmxlW2ldLnBzZXVkb19jb2RlKQorCXsKKwkgICAgKmlzX2NsaWNrID0gbW91c2VfdGFibGVbaV0uaXNfY2xpY2s7CisJICAgICppc19kcmFnID0gbW91c2VfdGFibGVbaV0uaXNfZHJhZzsKKwkgICAgcmV0dXJuIG1vdXNlX3RhYmxlW2ldLmJ1dHRvbjsKKwl9CisgICAgcmV0dXJuIDA7CSAgICAvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KK30KKworLyoKKyAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHNldWRvIG1vdXNlIGV2ZW50IHRva2VuIChLRV9MRUZUTU9VU0UgZXRjKSBiYXNlZCBvbgorICogdGhlIGdpdmVuIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIG1vdXNlIGJ1dHRvbiBpcyBkb3duLCBhbmQgd2hldGhlciB0aGUKKyAqIG1vdXNlIHdhcyBjbGlja2VkLCBkcmFnZ2VkIG9yIHJlbGVhc2VkLgorICovCisgICAgaW50CitnZXRfcHNldWRvX21vdXNlX2NvZGUoYnV0dG9uLCBpc19jbGljaywgaXNfZHJhZykKKyAgICBpbnQJICAgIGJ1dHRvbjsJLyogZWcgTU9VU0VfTEVGVCAqLworICAgIGludAkgICAgaXNfY2xpY2s7CisgICAgaW50CSAgICBpc19kcmFnOworeworICAgIGludAkgICAgaTsKKworICAgIGZvciAoaSA9IDA7IG1vdXNlX3RhYmxlW2ldLnBzZXVkb19jb2RlOyBpKyspCisJaWYgKGJ1dHRvbiA9PSBtb3VzZV90YWJsZVtpXS5idXR0b24KKwkgICAgJiYgaXNfY2xpY2sgPT0gbW91c2VfdGFibGVbaV0uaXNfY2xpY2sKKwkgICAgJiYgaXNfZHJhZyA9PSBtb3VzZV90YWJsZVtpXS5pc19kcmFnKQorCXsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICAvKiBUcmljazogYSBub24gbWFwcGFibGUgbGVmdCBjbGljayBhbmQgcmVsZWFzZSBoYXMgbW91c2VfY29sIDwgMC4KKwkgICAgICogVXNlZCBmb3IgJ21vdXNlZm9jdXMnIGluIGd1aV9tb3VzZV9tb3ZlZCgpICovCisJICAgIGlmIChtb3VzZV9jb2wgPCAwKQorCSAgICB7CisJCW1vdXNlX2NvbCA9IDA7CisJCWlmIChtb3VzZV90YWJsZVtpXS5wc2V1ZG9fY29kZSA9PSAoaW50KUtFX0xFRlRNT1VTRSkKKwkJICAgIHJldHVybiAoaW50KUtFX0xFRlRNT1VTRV9OTTsKKwkJaWYgKG1vdXNlX3RhYmxlW2ldLnBzZXVkb19jb2RlID09IChpbnQpS0VfTEVGVFJFTEVBU0UpCisJCSAgICByZXR1cm4gKGludClLRV9MRUZUUkVMRUFTRV9OTTsKKwkgICAgfQorI2VuZGlmCisJICAgIHJldHVybiBtb3VzZV90YWJsZVtpXS5wc2V1ZG9fY29kZTsKKwl9CisgICAgcmV0dXJuIChpbnQpS0VfSUdOT1JFOwkgICAgLyogbm90IHJlY29uZ25pemVkLCBpZ25vcmUgaXQgKi8KK30KKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZW5kLW9mLWxpbmUgdHlwZTogRU9MX0RPUywgRU9MX1VOSVggb3IgRU9MX01BQy4KKyAqLworICAgIGludAorZ2V0X2ZpbGVmb3JtYXQoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaW50CQljID0gKmJ1Zi0+Yl9wX2ZmOworCisgICAgaWYgKGJ1Zi0+Yl9wX2JpbiB8fCBjID09ICd1JykKKwlyZXR1cm4gRU9MX1VOSVg7CisgICAgaWYgKGMgPT0gJ20nKQorCXJldHVybiBFT0xfTUFDOworICAgIHJldHVybiBFT0xfRE9TOworfQorCisvKgorICogTGlrZSBnZXRfZmlsZWZvcm1hdCgpLCBidXQgb3ZlcnJpZGUgJ2ZpbGVmb3JtYXQnIHdpdGggInAiIGZvciAiKytvcHQ9dmFsIgorICogYXJndW1lbnQuCisgKi8KKyAgICBpbnQKK2dldF9maWxlZm9ybWF0X2ZvcmNlKGJ1ZiwgZWFwKQorICAgIGJ1Zl9UCSpidWY7CisgICAgZXhhcmdfVAkqZWFwOwkgICAgLyogY2FuIGJlIE5VTEwhICovCit7CisgICAgaW50CQljOworCisgICAgaWYgKGVhcCAhPSBOVUxMICYmIGVhcC0+Zm9yY2VfZmYgIT0gMCkKKwljID0gZWFwLT5jbWRbZWFwLT5mb3JjZV9mZl07CisgICAgZWxzZQorICAgIHsKKwlpZiAoKGVhcCAhPSBOVUxMICYmIGVhcC0+Zm9yY2VfYmluICE9IDApCisJCQkgICAgICAgPyAoZWFwLT5mb3JjZV9iaW4gPT0gRk9SQ0VfQklOKSA6IGJ1Zi0+Yl9wX2JpbikKKwkgICAgcmV0dXJuIEVPTF9VTklYOworCWMgPSAqYnVmLT5iX3BfZmY7CisgICAgfQorICAgIGlmIChjID09ICd1JykKKwlyZXR1cm4gRU9MX1VOSVg7CisgICAgaWYgKGMgPT0gJ20nKQorCXJldHVybiBFT0xfTUFDOworICAgIHJldHVybiBFT0xfRE9TOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IGVuZC1vZi1saW5lIHR5cGUgdG8gRU9MX0RPUywgRU9MX1VOSVggb3IgRU9MX01BQy4KKyAqIFNldHMgYm90aCAndGV4dG1vZGUnIGFuZCAnZmlsZWZvcm1hdCcuCisgKiBOb3RlOiBEb2VzIF9ub3RfIHNldCBnbG9iYWwgdmFsdWUgb2YgJ3RleHRtb2RlJyEKKyAqLworICAgIHZvaWQKK3NldF9maWxlZm9ybWF0KHQsIG9wdF9mbGFncykKKyAgICBpbnQJCXQ7CisgICAgaW50CQlvcHRfZmxhZ3M7CS8qIE9QVF9MT0NBTCBhbmQvb3IgT1BUX0dMT0JBTCAqLworeworICAgIGNoYXIJKnAgPSBOVUxMOworCisgICAgc3dpdGNoICh0KQorICAgIHsKKyAgICBjYXNlIEVPTF9ET1M6CisJcCA9IEZGX0RPUzsKKwljdXJidWYtPmJfcF90eCA9IFRSVUU7CisJYnJlYWs7CisgICAgY2FzZSBFT0xfVU5JWDoKKwlwID0gRkZfVU5JWDsKKwljdXJidWYtPmJfcF90eCA9IEZBTFNFOworCWJyZWFrOworICAgIGNhc2UgRU9MX01BQzoKKwlwID0gRkZfTUFDOworCWN1cmJ1Zi0+Yl9wX3R4ID0gRkFMU0U7CisJYnJlYWs7CisgICAgfQorICAgIGlmIChwICE9IE5VTEwpCisJc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikiZmYiLCAtMSwgKGNoYXJfdSAqKXAsCisJCQkJCQkJT1BUX0ZSRUUgfCBvcHRfZmxhZ3MpOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGNoZWNrX3N0YXR1cyhjdXJidWYpOworI2VuZGlmCisjaWZkZWYgRkVBVF9USVRMRQorICAgIG5lZWRfbWFrZXRpdGxlID0gVFJVRTsJICAgIC8qIHNldCB3aW5kb3cgdGl0bGUgbGF0ZXIgKi8KKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIHRoZSBkZWZhdWx0IGZpbGVmb3JtYXQgZnJvbSAnZmlsZWZvcm1hdHMnLgorICovCisgICAgaW50CitkZWZhdWx0X2ZpbGVmb3JtYXQoKQoreworICAgIHN3aXRjaCAoKnBfZmZzKQorICAgIHsKKwljYXNlICdtJzogICByZXR1cm4gRU9MX01BQzsKKwljYXNlICdkJzogICByZXR1cm4gRU9MX0RPUzsKKyAgICB9CisgICAgcmV0dXJuIEVPTF9VTklYOworfQorCisvKgorICogQ2FsbCBzaGVsbC4JQ2FsbHMgbWNoX2NhbGxfc2hlbGwsIHdpdGggJ3NoZWxseHF1b3RlJyBhZGRlZC4KKyAqLworICAgIGludAorY2FsbF9zaGVsbChjbWQsIG9wdCkKKyAgICBjaGFyX3UJKmNtZDsKKyAgICBpbnQJCW9wdDsKK3sKKyAgICBjaGFyX3UJKm5jbWQ7CisgICAgaW50CQlyZXR2YWw7CisKKyAgICBpZiAocF92ZXJib3NlID4gMykKKyAgICB7CisJbXNnX3N0cigoY2hhcl91ICopXygiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiKSwKKwkJCQkJCSAgICBjbWQgPT0gTlVMTCA/IHBfc2ggOiBjbWQpOworCW91dF9jaGFyKCdcbicpOworCWN1cnNvcl9vbigpOworICAgIH0KKworICAgIGlmICgqcF9zaCA9PSBOVUwpCisgICAgeworCUVNU0coXyhlX3NoZWxsZW1wdHkpKTsKKwlyZXR2YWwgPSAtMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSV9NU1dJTgorCS8qIERvbid0IGhpZGUgdGhlIHBvaW50ZXIgd2hpbGUgZXhlY3V0aW5nIGEgc2hlbGwgY29tbWFuZC4gKi8KKwlndWlfbWNoX21vdXNlaGlkZShGQUxTRSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorCSsraG9sZF9ndWlfZXZlbnRzOworI2VuZGlmCisJLyogVGhlIGV4dGVybmFsIGNvbW1hbmQgbWF5IHVwZGF0ZSBhIHRhZ3MgZmlsZSwgY2xlYXIgY2FjaGVkIHRhZ3MuICovCisJdGFnX2ZyZWVtYXRjaCgpOworCisJaWYgKGNtZCA9PSBOVUxMIHx8ICpwX3N4cSA9PSBOVUwpCisJICAgIHJldHZhbCA9IG1jaF9jYWxsX3NoZWxsKGNtZCwgb3B0KTsKKwllbHNlCisJeworCSAgICBuY21kID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oY21kKSArIFNUUkxFTihwX3N4cSkgKiAyICsgMSkpOworCSAgICBpZiAobmNtZCAhPSBOVUxMKQorCSAgICB7CisJCVNUUkNQWShuY21kLCBwX3N4cSk7CisJCVNUUkNBVChuY21kLCBjbWQpOworCQlTVFJDQVQobmNtZCwgcF9zeHEpOworCQlyZXR2YWwgPSBtY2hfY2FsbF9zaGVsbChuY21kLCBvcHQpOworCQl2aW1fZnJlZShuY21kKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXJldHZhbCA9IC0xOworCX0KKyNpZmRlZiBGRUFUX0dVSQorCS0taG9sZF9ndWlfZXZlbnRzOworI2VuZGlmCisJLyoKKwkgKiBDaGVjayB0aGUgd2luZG93IHNpemUsIGluIGNhc2UgaXQgY2hhbmdlZCB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogZXh0ZXJuYWwgY29tbWFuZC4KKwkgKi8KKwlzaGVsbF9yZXNpemVkX2NoZWNrKCk7CisgICAgfQorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgc2V0X3ZpbV92YXJfbnIoVlZfU0hFTExfRVJST1IsIChsb25nKXJldHZhbCk7CisjZW5kaWYKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBWSVNVQUwgYW5kIE9QX1BFTkRJTkcgU3RhdGUgYXJlIG5ldmVyIHNldCwgdGhleSBhcmUgZXF1YWwgdG8gTk9STUFMIFN0YXRlCisgKiB3aXRoIGEgY29uZGl0aW9uLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWFsIFN0YXRlLgorICovCisgICAgaW50CitnZXRfcmVhbF9zdGF0ZSgpCit7CisgICAgaWYgKFN0YXRlICYgTk9STUFMKQorICAgIHsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChWSXN1YWxfYWN0aXZlKQorCSAgICByZXR1cm4gVklTVUFMOworCWVsc2UKKyNlbmRpZgorCSAgICBpZiAoZmluaXNoX29wKQorCSAgICByZXR1cm4gT1BfUEVORElORzsKKyAgICB9CisgICAgcmV0dXJuIFN0YXRlOworfQorCisjaWYgZGVmaW5lZChGRUFUX1NFU1NJT04pIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9HVUlfTUFDKSBcCisJfHwgKGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisJCQkgICAgJiYgKGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKEZFQVRfRE5EKSkpIFwKKwl8fCBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSB8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2hhbmdlIHRvIGEgZmlsZSdzIGRpcmVjdG9yeS4KKyAqIENhbGxlciBtdXN0IGNhbGwgc2hvcnRlbl9mbmFtZXMoKSEKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50Cit2aW1fY2hkaXJmaWxlKGZuYW1lKQorICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgY2hhcl91CXRlbXBfc3RyaW5nW01BWFBBVEhMXTsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSp0OworCisgICAgU1RSQ1BZKHRlbXBfc3RyaW5nLCBmbmFtZSk7CisgICAgcCA9IGdldF9wYXN0X2hlYWQodGVtcF9zdHJpbmcpOworICAgIHQgPSBnZXR0YWlsKHRlbXBfc3RyaW5nKTsKKyAgICB3aGlsZSAodCA+IHAgJiYgdmltX2lzcGF0aHNlcCh0Wy0xXSkpCisJLS10OworICAgICp0ID0gTlVMOyAvKiBjaG9wIG9mZiBlbmQgb2Ygc3RyaW5nICovCisKKyAgICByZXR1cm4gbWNoX2NoZGlyKChjaGFyICopdGVtcF9zdHJpbmcpID09IDAgPyBPSyA6IEZBSUw7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RBVF9JR05PUkVTX1NMQVNIKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENoZWNrIGlmICJuYW1lIiBlbmRzIGluIGEgc2xhc2ggYW5kIGlzIG5vdCBhIGRpcmVjdG9yeS4KKyAqIFVzZWQgZm9yIHN5c3RlbXMgd2hlcmUgc3RhdCgpIGlnbm9yZXMgYSB0cmFpbGluZyBzbGFzaCBvbiBhIGZpbGUgbmFtZS4KKyAqIFRoZSBWaW0gY29kZSBhc3N1bWVzIGEgdHJhaWxpbmcgc2xhc2ggaXMgb25seSBpZ25vcmVkIGZvciBhIGRpcmVjdG9yeS4KKyAqLworICAgIGludAoraWxsZWdhbF9zbGFzaChuYW1lKQorICAgIGNoYXIgKm5hbWU7Cit7CisgICAgaWYgKG5hbWVbMF0gPT0gTlVMKQorCXJldHVybiBGQUxTRTsJICAgIC8qIG5vIGZpbGUgbmFtZSBpcyBub3QgaWxsZWdhbCAqLworICAgIGlmIChuYW1lW3N0cmxlbihuYW1lKSAtIDFdICE9ICcvJykKKwlyZXR1cm4gRkFMU0U7CSAgICAvKiBubyB0cmFpbGluZyBzbGFzaCAqLworICAgIGlmIChtY2hfaXNkaXIoKGNoYXJfdSAqKW5hbWUpKQorCXJldHVybiBGQUxTRTsJICAgIC8qIHRyYWlsaW5nIHNsYXNoIGZvciBhIGRpcmVjdG9yeSAqLworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENVUlNPUl9TSEFQRSkgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEhhbmRsaW5nIG9mIGN1cnNvciBhbmQgbW91c2UgcG9pbnRlciBzaGFwZXMgaW4gdmFyaW91cyBtb2Rlcy4KKyAqLworCitjdXJzb3JlbnRyeV9UIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9DT1VOVF0gPQoreworICAgIC8qIFRoZSB2YWx1ZXMgd2lsbCBiZSBmaWxsZWQgaW4gZnJvbSB0aGUgJ2d1aWN1cnNvcicgYW5kICdtb3VzZXNoYXBlJworICAgICAqIGRlZmF1bHRzIHdoZW4gVmltIHN0YXJ0cy4KKyAgICAgKiBBZGp1c3QgdGhlIFNIQVBFX0lEWF8gZGVmaW5lcyB3aGVuIG1ha2luZyBjaGFuZ2VzISAqLworICAgIHswLAkwLCAwLCA3MDBMLCA0MDBMLCAyNTBMLCAwLCAwLCAibiIsIFNIQVBFX0NVUlNPUitTSEFQRV9NT1VTRX0sCisgICAgezAsCTAsIDAsIDcwMEwsIDQwMEwsIDI1MEwsIDAsIDAsICJ2IiwgU0hBUEVfQ1VSU09SK1NIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgNzAwTCwgNDAwTCwgMjUwTCwgMCwgMCwgImkiLCBTSEFQRV9DVVJTT1IrU0hBUEVfTU9VU0V9LAorICAgIHswLAkwLCAwLCA3MDBMLCA0MDBMLCAyNTBMLCAwLCAwLCAiciIsIFNIQVBFX0NVUlNPUitTSEFQRV9NT1VTRX0sCisgICAgezAsCTAsIDAsIDcwMEwsIDQwMEwsIDI1MEwsIDAsIDAsICJjIiwgU0hBUEVfQ1VSU09SK1NIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgNzAwTCwgNDAwTCwgMjUwTCwgMCwgMCwgImNpIiwgU0hBUEVfQ1VSU09SK1NIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgNzAwTCwgNDAwTCwgMjUwTCwgMCwgMCwgImNyIiwgU0hBUEVfQ1VSU09SK1NIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgNzAwTCwgNDAwTCwgMjUwTCwgMCwgMCwgIm8iLCBTSEFQRV9DVVJTT1IrU0hBUEVfTU9VU0V9LAorICAgIHswLAkwLCAwLCA3MDBMLCA0MDBMLCAyNTBMLCAwLCAwLCAidmUiLCBTSEFQRV9DVVJTT1IrU0hBUEVfTU9VU0V9LAorICAgIHswLAkwLCAwLCAgIDBMLCAgIDBMLCAgIDBMLCAwLCAwLCAiZSIsIFNIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgICAwTCwgICAwTCwgICAwTCwgMCwgMCwgInMiLCBTSEFQRV9NT1VTRX0sCisgICAgezAsCTAsIDAsICAgMEwsICAgMEwsICAgMEwsIDAsIDAsICJzZCIsIFNIQVBFX01PVVNFfSwKKyAgICB7MCwJMCwgMCwgICAwTCwgICAwTCwgICAwTCwgMCwgMCwgInZzIiwgU0hBUEVfTU9VU0V9LAorICAgIHswLAkwLCAwLCAgIDBMLCAgIDBMLCAgIDBMLCAwLCAwLCAidmQiLCBTSEFQRV9NT1VTRX0sCisgICAgezAsCTAsIDAsICAgMEwsICAgMEwsICAgMEwsIDAsIDAsICJtIiwgU0hBUEVfTU9VU0V9LAorICAgIHswLAkwLCAwLCAgIDBMLCAgIDBMLCAgIDBMLCAwLCAwLCAibWwiLCBTSEFQRV9NT1VTRX0sCisgICAgezAsCTAsIDAsIDEwMEwsIDEwMEwsIDEwMEwsIDAsIDAsICJzbSIsIFNIQVBFX0NVUlNPUn0sCit9OworCisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisvKgorICogVGFibGUgd2l0aCBuYW1lcyBmb3IgbW91c2Ugc2hhcGVzLiAgS2VlcCBpbiBzeW5jIHdpdGggYWxsIHRoZSB0YWJsZXMgZm9yCisgKiBtY2hfc2V0X21vdXNlX3NoYXBlKCkhLgorICovCitzdGF0aWMgY2hhciAqIG1zaGFwZV9uYW1lc1tdID0KK3sKKyAgICAiYXJyb3ciLAkvKiBkZWZhdWx0LCBtdXN0IGJlIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAiYmxhbmsiLAkvKiBoaWRkZW4gKi8KKyAgICAiYmVhbSIsCisgICAgInVwZG93biIsCisgICAgInVkc2l6aW5nIiwKKyAgICAibGVmdHJpZ2h0IiwKKyAgICAibHJzaXppbmciLAorICAgICJidXN5IiwKKyAgICAibm8iLAorICAgICJjcm9zc2hhaXIiLAorICAgICJoYW5kMSIsCisgICAgImhhbmQyIiwKKyAgICAicGVuY2lsIiwKKyAgICAicXVlc3Rpb24iLAorICAgICJyaWdodHVwLWFycm93IiwKKyAgICAidXAtYXJyb3ciLAorICAgIE5VTEwKK307CisjZW5kaWYKKworLyoKKyAqIFBhcnNlIHRoZSAnZ3VpY3Vyc29yJyBvcHRpb24gKCJ3aGF0IiBpcyBTSEFQRV9DVVJTT1IpIG9yICdtb3VzZXNoYXBlJworICogKCJ3aGF0IiBpcyBTSEFQRV9NT1VTRSkuCisgKiBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgZm9yIGFuIGlsbGVnYWwgb3B0aW9uLCBOVUxMIG90aGVyd2lzZS4KKyAqLworICAgIGNoYXJfdSAqCitwYXJzZV9zaGFwZV9vcHQod2hhdCkKKyAgICBpbnQJCXdoYXQ7Cit7CisgICAgY2hhcl91CSptb2RlcDsKKyAgICBjaGFyX3UJKmNvbG9ucDsKKyAgICBjaGFyX3UJKmNvbW1hcDsKKyAgICBjaGFyX3UJKnNsYXNocDsKKyAgICBjaGFyX3UJKnAsICplbmRwOworICAgIGludAkJaWR4ID0gMDsJCS8qIGluaXQgZm9yIEdDQyAqLworICAgIGludAkJYWxsX2lkeDsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWk7CisgICAgbG9uZwluOworICAgIGludAkJZm91bmRfdmUgPSBGQUxTRTsJLyogZm91bmQgInZlIiBmbGFnICovCisgICAgaW50CQlyb3VuZDsKKworICAgIC8qCisgICAgICogRmlyc3Qgcm91bmQ6IGNoZWNrIGZvciBlcnJvcnM7IHNlY29uZCByb3VuZDogZG8gaXQgZm9yIHJlYWwuCisgICAgICovCisgICAgZm9yIChyb3VuZCA9IDE7IHJvdW5kIDw9IDI7ICsrcm91bmQpCisgICAgeworCS8qCisJICogUmVwZWF0IGZvciBhbGwgY29tbWEgc2VwYXJhdGVkIHBhcnRzLgorCSAqLworI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQorCWlmICh3aGF0ID09IFNIQVBFX01PVVNFKQorCSAgICBtb2RlcCA9IHBfbW91c2VzaGFwZTsKKwllbHNlCisjZW5kaWYKKwkgICAgbW9kZXAgPSBwX2d1aWN1cnNvcjsKKwl3aGlsZSAoKm1vZGVwICE9IE5VTCkKKwl7CisJICAgIGNvbG9ucCA9IHZpbV9zdHJjaHIobW9kZXAsICc6Jyk7CisJICAgIGlmIChjb2xvbnAgPT0gTlVMTCkKKwkJcmV0dXJuIChjaGFyX3UgKilOXygiRTU0NTogTWlzc2luZyBjb2xvbiIpOworCSAgICBpZiAoY29sb25wID09IG1vZGVwKQorCQlyZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTQ2OiBJbGxlZ2FsIG1vZGUiKTsKKwkgICAgY29tbWFwID0gdmltX3N0cmNocihtb2RlcCwgJywnKTsKKworCSAgICAvKgorCSAgICAgKiBSZXBlYXQgZm9yIGFsbCBtb2RlJ3MgYmVmb3JlIHRoZSBjb2xvbi4KKwkgICAgICogRm9yIHRoZSAnYScgbW9kZSwgd2UgbG9vcCB0byBoYW5kbGUgYWxsIHRoZSBtb2Rlcy4KKwkgICAgICovCisJICAgIGFsbF9pZHggPSAtMTsKKwkgICAgd2hpbGUgKG1vZGVwIDwgY29sb25wIHx8IGFsbF9pZHggPj0gMCkKKwkgICAgeworCQlpZiAoYWxsX2lkeCA8IDApCisJCXsKKwkJICAgIC8qIEZpbmQgdGhlIG1vZGUuICovCisJCSAgICBpZiAobW9kZXBbMV0gPT0gJy0nIHx8IG1vZGVwWzFdID09ICc6JykKKwkJCWxlbiA9IDE7CisJCSAgICBlbHNlCisJCQlsZW4gPSAyOworCQkgICAgaWYgKGxlbiA9PSAxICYmIFRPTE9XRVJfQVNDKG1vZGVwWzBdKSA9PSAnYScpCisJCQlhbGxfaWR4ID0gU0hBUEVfSURYX0NPVU5UIC0gMTsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgU0hBUEVfSURYX0NPVU5UOyArK2lkeCkKKwkJCSAgICBpZiAoU1RSTklDTVAobW9kZXAsIHNoYXBlX3RhYmxlW2lkeF0ubmFtZSwgbGVuKQorCQkJCQkJCQkJID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoaWR4ID09IFNIQVBFX0lEWF9DT1VOVAorCQkJCSAgIHx8IChzaGFwZV90YWJsZVtpZHhdLnVzZWRfZm9yICYgd2hhdCkgPT0gMCkKKwkJCSAgICByZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTQ2OiBJbGxlZ2FsIG1vZGUiKTsKKwkJCWlmIChsZW4gPT0gMiAmJiBtb2RlcFswXSA9PSAndicgJiYgbW9kZXBbMV0gPT0gJ2UnKQorCQkJICAgIGZvdW5kX3ZlID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIG1vZGVwICs9IGxlbiArIDE7CisJCX0KKworCQlpZiAoYWxsX2lkeCA+PSAwKQorCQkgICAgaWR4ID0gYWxsX2lkeC0tOworCQllbHNlIGlmIChyb3VuZCA9PSAyKQorCQl7CisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJCSAgICBpZiAod2hhdCA9PSBTSEFQRV9NT1VTRSkKKwkJICAgIHsKKwkJCS8qIFNldCB0aGUgZGVmYXVsdCwgZm9yIHRoZSBtaXNzaW5nIHBhcnRzICovCisJCQlzaGFwZV90YWJsZVtpZHhdLm1zaGFwZSA9IDA7CisJCSAgICB9CisJCSAgICBlbHNlCisjZW5kaWYKKwkJICAgIHsKKwkJCS8qIFNldCB0aGUgZGVmYXVsdHMsIGZvciB0aGUgbWlzc2luZyBwYXJ0cyAqLworCQkJc2hhcGVfdGFibGVbaWR4XS5zaGFwZSA9IFNIQVBFX0JMT0NLOworCQkJc2hhcGVfdGFibGVbaWR4XS5ibGlua3dhaXQgPSA3MDBMOworCQkJc2hhcGVfdGFibGVbaWR4XS5ibGlua29uID0gNDAwTDsKKwkJCXNoYXBlX3RhYmxlW2lkeF0uYmxpbmtvZmYgPSAyNTBMOworCQkgICAgfQorCQl9CisKKwkJLyogUGFyc2UgdGhlIHBhcnQgYWZ0ZXIgdGhlIGNvbG9uICovCisJCWZvciAocCA9IGNvbG9ucCArIDE7ICpwICYmICpwICE9ICcsJzsgKQorCQl7CisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJCSAgICBpZiAod2hhdCA9PSBTSEFQRV9NT1VTRSkKKwkJICAgIHsKKwkJCWZvciAoaSA9IDA7IDsgKytpKQorCQkJeworCQkJICAgIGlmIChtc2hhcGVfbmFtZXNbaV0gPT0gTlVMTCkKKwkJCSAgICB7CisJCQkJaWYgKCFWSU1fSVNESUdJVCgqcCkpCisJCQkJICAgIHJldHVybiAoY2hhcl91ICopTl8oIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIpOworCQkJCWlmIChyb3VuZCA9PSAyKQorCQkJCSAgICBzaGFwZV90YWJsZVtpZHhdLm1zaGFwZSA9CisJCQkJCSAgICAgIGdldGRpZ2l0cygmcCkgKyBNU0hBUEVfTlVNQkVSRUQ7CisJCQkJZWxzZQorCQkJCSAgICAodm9pZClnZXRkaWdpdHMoJnApOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCSAgICBsZW4gPSAoaW50KVNUUkxFTihtc2hhcGVfbmFtZXNbaV0pOworCQkJICAgIGlmIChTVFJOSUNNUChwLCBtc2hhcGVfbmFtZXNbaV0sIGxlbikgPT0gMCkKKwkJCSAgICB7CisJCQkJaWYgKHJvdW5kID09IDIpCisJCQkJICAgIHNoYXBlX3RhYmxlW2lkeF0ubXNoYXBlID0gaTsKKwkJCQlwICs9IGxlbjsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlIC8qIGlmICh3aGF0ID09IFNIQVBFX01PVVNFKSAqLworI2VuZGlmCisJCSAgICB7CisJCQkvKgorCQkJICogRmlyc3QgaGFuZGxlIHRoZSBvbmVzIHdpdGggYSBudW1iZXIgYXJndW1lbnQuCisJCQkgKi8KKwkJCWkgPSAqcDsKKwkJCWxlbiA9IDA7CisJCQlpZiAoU1RSTklDTVAocCwgInZlciIsIDMpID09IDApCisJCQkgICAgbGVuID0gMzsKKwkJCWVsc2UgaWYgKFNUUk5JQ01QKHAsICJob3IiLCAzKSA9PSAwKQorCQkJICAgIGxlbiA9IDM7CisJCQllbHNlIGlmIChTVFJOSUNNUChwLCAiYmxpbmt3YWl0IiwgOSkgPT0gMCkKKwkJCSAgICBsZW4gPSA5OworCQkJZWxzZSBpZiAoU1RSTklDTVAocCwgImJsaW5rb24iLCA3KSA9PSAwKQorCQkJICAgIGxlbiA9IDc7CisJCQllbHNlIGlmIChTVFJOSUNNUChwLCAiYmxpbmtvZmYiLCA4KSA9PSAwKQorCQkJICAgIGxlbiA9IDg7CisJCQlpZiAobGVuICE9IDApCisJCQl7CisJCQkgICAgcCArPSBsZW47CisJCQkgICAgaWYgKCFWSU1fSVNESUdJVCgqcCkpCisJCQkJcmV0dXJuIChjaGFyX3UgKilOXygiRTU0ODogZGlnaXQgZXhwZWN0ZWQiKTsKKwkJCSAgICBuID0gZ2V0ZGlnaXRzKCZwKTsKKwkJCSAgICBpZiAobGVuID09IDMpICAgLyogInZlciIgb3IgImhvciIgKi8KKwkJCSAgICB7CisJCQkJaWYgKG4gPT0gMCkKKwkJCQkgICAgcmV0dXJuIChjaGFyX3UgKilOXygiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIik7CisJCQkJaWYgKHJvdW5kID09IDIpCisJCQkJeworCQkJCSAgICBpZiAoVE9MT1dFUl9BU0MoaSkgPT0gJ3YnKQorCQkJCQlzaGFwZV90YWJsZVtpZHhdLnNoYXBlID0gU0hBUEVfVkVSOworCQkJCSAgICBlbHNlCisJCQkJCXNoYXBlX3RhYmxlW2lkeF0uc2hhcGUgPSBTSEFQRV9IT1I7CisJCQkJICAgIHNoYXBlX3RhYmxlW2lkeF0ucGVyY2VudGFnZSA9IG47CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICBlbHNlIGlmIChyb3VuZCA9PSAyKQorCQkJICAgIHsKKwkJCQlpZiAobGVuID09IDkpCisJCQkJICAgIHNoYXBlX3RhYmxlW2lkeF0uYmxpbmt3YWl0ID0gbjsKKwkJCQllbHNlIGlmIChsZW4gPT0gNykKKwkJCQkgICAgc2hhcGVfdGFibGVbaWR4XS5ibGlua29uID0gbjsKKwkJCQllbHNlCisJCQkJICAgIHNoYXBlX3RhYmxlW2lkeF0uYmxpbmtvZmYgPSBuOworCQkJICAgIH0KKwkJCX0KKwkJCWVsc2UgaWYgKFNUUk5JQ01QKHAsICJibG9jayIsIDUpID09IDApCisJCQl7CisJCQkgICAgaWYgKHJvdW5kID09IDIpCisJCQkJc2hhcGVfdGFibGVbaWR4XS5zaGFwZSA9IFNIQVBFX0JMT0NLOworCQkJICAgIHAgKz0gNTsKKwkJCX0KKwkJCWVsc2UJLyogbXVzdCBiZSBhIGhpZ2hsaWdodCBncm91cCBuYW1lIHRoZW4gKi8KKwkJCXsKKwkJCSAgICBlbmRwID0gdmltX3N0cmNocihwLCAnLScpOworCQkJICAgIGlmIChjb21tYXAgPT0gTlVMTCkJCSAgICAvKiBsYXN0IHBhcnQgKi8KKwkJCSAgICB7CisJCQkJaWYgKGVuZHAgPT0gTlVMTCkKKwkJCQkgICAgZW5kcCA9IHAgKyBTVFJMRU4ocCk7ICAgLyogZmluZCBlbmQgb2YgcGFydCAqLworCQkJICAgIH0KKwkJCSAgICBlbHNlIGlmIChlbmRwID4gY29tbWFwIHx8IGVuZHAgPT0gTlVMTCkKKwkJCQllbmRwID0gY29tbWFwOworCQkJICAgIHNsYXNocCA9IHZpbV9zdHJjaHIocCwgJy8nKTsKKwkJCSAgICBpZiAoc2xhc2hwICE9IE5VTEwgJiYgc2xhc2hwIDwgZW5kcCkKKwkJCSAgICB7CisJCQkJLyogImdyb3VwL2xhbmdtYXBfZ3JvdXAiICovCisJCQkJaSA9IHN5bl9jaGVja19ncm91cChwLCAoaW50KShzbGFzaHAgLSBwKSk7CisJCQkJcCA9IHNsYXNocCArIDE7CisJCQkgICAgfQorCQkJICAgIGlmIChyb3VuZCA9PSAyKQorCQkJICAgIHsKKwkJCQlzaGFwZV90YWJsZVtpZHhdLmlkID0gc3luX2NoZWNrX2dyb3VwKHAsCisJCQkJCQkJICAgICAoaW50KShlbmRwIC0gcCkpOworCQkJCXNoYXBlX3RhYmxlW2lkeF0uaWRfbG0gPSBzaGFwZV90YWJsZVtpZHhdLmlkOworCQkJCWlmIChzbGFzaHAgIT0gTlVMTCAmJiBzbGFzaHAgPCBlbmRwKQorCQkJCSAgICBzaGFwZV90YWJsZVtpZHhdLmlkID0gaTsKKwkJCSAgICB9CisJCQkgICAgcCA9IGVuZHA7CisJCQl9CisJCSAgICB9IC8qIGlmICh3aGF0ICE9IFNIQVBFX01PVVNFKSAqLworCisJCSAgICBpZiAoKnAgPT0gJy0nKQorCQkJKytwOworCQl9CisJICAgIH0KKwkgICAgbW9kZXAgPSBwOworCSAgICBpZiAoKm1vZGVwID09ICcsJykKKwkJKyttb2RlcDsKKwl9CisgICAgfQorCisgICAgLyogSWYgdGhlICdzJyBmbGFnIGlzIG5vdCBnaXZlbiwgdXNlIHRoZSAndicgY3Vyc29yIGZvciAncycgKi8KKyAgICBpZiAoIWZvdW5kX3ZlKQorICAgIHsKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKwlpZiAod2hhdCA9PSBTSEFQRV9NT1VTRSkKKwl7CisJICAgIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9WRV0ubXNoYXBlID0gc2hhcGVfdGFibGVbU0hBUEVfSURYX1ZdLm1zaGFwZTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVkVdLnNoYXBlID0gc2hhcGVfdGFibGVbU0hBUEVfSURYX1ZdLnNoYXBlOworCSAgICBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVkVdLnBlcmNlbnRhZ2UgPQorCQkJCQkgc2hhcGVfdGFibGVbU0hBUEVfSURYX1ZdLnBlcmNlbnRhZ2U7CisJICAgIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9WRV0uYmxpbmt3YWl0ID0KKwkJCQkJICBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVl0uYmxpbmt3YWl0OworCSAgICBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVkVdLmJsaW5rb24gPQorCQkJCQkgICAgc2hhcGVfdGFibGVbU0hBUEVfSURYX1ZdLmJsaW5rb247CisJICAgIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9WRV0uYmxpbmtvZmYgPQorCQkJCQkgICBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVl0uYmxpbmtvZmY7CisJICAgIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9WRV0uaWQgPSBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVl0uaWQ7CisJICAgIHNoYXBlX3RhYmxlW1NIQVBFX0lEWF9WRV0uaWRfbG0gPSBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVl0uaWRfbG07CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogUmV0dXJuIHRoZSBpbmRleCBpbnRvIHNoYXBlX3RhYmxlW10gZm9yIHRoZSBjdXJyZW50IG1vZGUuCisgKiBXaGVuICJtb3VzZSIgaXMgVFJVRSwgY29uc2lkZXIgaW5kZXhlcyB2YWxpZCBmb3IgdGhlIG1vdXNlIHBvaW50ZXIuCisgKi8KKyAgICBpbnQKK2dldF9zaGFwZV9pZHgobW91c2UpCisgICAgaW50CW1vdXNlOworeworI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQorICAgIGlmIChtb3VzZSAmJiAoU3RhdGUgPT0gSElUUkVUVVJOIHx8IFN0YXRlID09IEFTS01PUkUpKQorICAgIHsKKyMgaWZkZWYgRkVBVF9HVUkKKwlpZiAoWV8yX1JPVyhndWlfbWNoX2dldF9tb3VzZV95KCkpID09IFJvd3MgLSAxKQorCSAgICByZXR1cm4gU0hBUEVfSURYX01PUkVMOworIyBlbmRpZgorCXJldHVybiBTSEFQRV9JRFhfTU9SRTsKKyAgICB9CisgICAgaWYgKG1vdXNlICYmIGRyYWdfc3RhdHVzX2xpbmUpCisJcmV0dXJuIFNIQVBFX0lEWF9TRFJBRzsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAobW91c2UgJiYgZHJhZ19zZXBfbGluZSkKKwlyZXR1cm4gU0hBUEVfSURYX1ZEUkFHOworIyBlbmRpZgorI2VuZGlmCisgICAgaWYgKCFtb3VzZSAmJiBTdGF0ZSA9PSBTSE9XTUFUQ0gpCisJcmV0dXJuIFNIQVBFX0lEWF9TTTsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisgICAgaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwlyZXR1cm4gU0hBUEVfSURYX1I7CisjZW5kaWYKKyAgICBpZiAoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCisJcmV0dXJuIFNIQVBFX0lEWF9SOworICAgIGlmIChTdGF0ZSAmIElOU0VSVCkKKwlyZXR1cm4gU0hBUEVfSURYX0k7CisgICAgaWYgKFN0YXRlICYgQ01ETElORSkKKyAgICB7CisJaWYgKGNtZGxpbmVfYXRfZW5kKCkpCisJICAgIHJldHVybiBTSEFQRV9JRFhfQzsKKwlpZiAoY21kbGluZV9vdmVyc3RyaWtlKCkpCisJICAgIHJldHVybiBTSEFQRV9JRFhfQ1I7CisJcmV0dXJuIFNIQVBFX0lEWF9DSTsKKyAgICB9CisgICAgaWYgKGZpbmlzaF9vcCkKKwlyZXR1cm4gU0hBUEVfSURYX087CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSkKKyAgICB7CisJaWYgKCpwX3NlbCA9PSAnZScpCisJICAgIHJldHVybiBTSEFQRV9JRFhfVkU7CisJZWxzZQorCSAgICByZXR1cm4gU0hBUEVfSURYX1Y7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIFNIQVBFX0lEWF9OOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9NT1VTRVNIQVBFKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludCBvbGRfbW91c2Vfc2hhcGUgPSAwOworCisvKgorICogU2V0IHRoZSBtb3VzZSBzaGFwZToKKyAqIElmICJzaGFwZSIgaXMgLTEsIHVzZSBzaGFwZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgbW9kZSwKKyAqIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZS4KKyAqIElmICJzaGFwZSIgaXMgLTIsIG9ubHkgdXBkYXRlIHRoZSBzaGFwZSB3aGVuIGl0J3MgQ0xJTkUgb3IgU1RBVFVTICh1c2VkCisgKiB3aGVuIHRoZSBtb3VzZSBtb3ZlcyBvZmYgdGhlIHN0YXR1cyBvciBjb21tYW5kIGxpbmUpLgorICovCisgICAgdm9pZAordXBkYXRlX21vdXNlc2hhcGUoc2hhcGVfaWR4KQorICAgIGludAlzaGFwZV9pZHg7Cit7CisgICAgaW50IG5ld19tb3VzZV9zaGFwZTsKKworICAgIC8qIE9ubHkgd29ya3MgaW4gR1VJIG1vZGUuICovCisgICAgaWYgKCFndWkuaW5fdXNlKQorCXJldHVybjsKKworICAgIC8qIFBvc3Rwb25lIHRoZSB1cGRhdGluZyB3aGVuIG1vcmUgaXMgdG8gY29tZS4gIFNwZWVkcyB1cCBleGVjdXRpbmcgb2YKKyAgICAgKiBtYXBwaW5ncy4gKi8KKyAgICBpZiAoc2hhcGVfaWR4ID09IC0xICYmIGNoYXJfYXZhaWwoKSkKKyAgICB7CisJcG9zdHBvbmVkX21vdXNlc2hhcGUgPSBUUlVFOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2hhcGVfaWR4ID09IC0yCisJICAgICYmIG9sZF9tb3VzZV9zaGFwZSAhPSBzaGFwZV90YWJsZVtTSEFQRV9JRFhfQ0xJTkVdLm1zaGFwZQorCSAgICAmJiBvbGRfbW91c2Vfc2hhcGUgIT0gc2hhcGVfdGFibGVbU0hBUEVfSURYX1NUQVRVU10ubXNoYXBlCisJICAgICYmIG9sZF9tb3VzZV9zaGFwZSAhPSBzaGFwZV90YWJsZVtTSEFQRV9JRFhfVlNFUF0ubXNoYXBlKQorCXJldHVybjsKKyAgICBpZiAoc2hhcGVfaWR4IDwgMCkKKwluZXdfbW91c2Vfc2hhcGUgPSBzaGFwZV90YWJsZVtnZXRfc2hhcGVfaWR4KFRSVUUpXS5tc2hhcGU7CisgICAgZWxzZQorCW5ld19tb3VzZV9zaGFwZSA9IHNoYXBlX3RhYmxlW3NoYXBlX2lkeF0ubXNoYXBlOworICAgIGlmIChuZXdfbW91c2Vfc2hhcGUgIT0gb2xkX21vdXNlX3NoYXBlKQorICAgIHsKKwltY2hfc2V0X21vdXNlX3NoYXBlKG5ld19tb3VzZV9zaGFwZSk7CisJb2xkX21vdXNlX3NoYXBlID0gbmV3X21vdXNlX3NoYXBlOworICAgIH0KKyAgICBwb3N0cG9uZWRfbW91c2VzaGFwZSA9IEZBTFNFOworfQorIyBlbmRpZgorCisjZW5kaWYgLyogQ1VSU09SX1NIQVBFICovCisKKworI2lmZGVmIEZFQVRfQ1JZUFQKKy8qCisgKiBPcHRpb25hbCBlbmNyeXB0aW9uIHN1eXBwb3J0LgorICogTW9oc2luIEFobWVkLCBtb3NoQHNhc2kuY29tLCA5OC0wOS0yNAorICogQmFzZWQgb24gemlwL2NyeXB0IHNvdXJjZXMuCisgKgorICogTk9URSBGT1IgVVNBOiBTaW5jZSAyMDAwIGV4cG9ydGluZyB0aGlzIGNvZGUgZnJvbSB0aGUgVVNBIGlzIGFsbG93ZWQgdG8KKyAqIG1vc3QgY291bnRyaWVzLiAgVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMsIGJ1dCB0aGF0IHN0aWxsIHNob3VsZCBub3QgYmUgYQorICogcHJvYmxlbSBzaW5jZSB0aGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBFdXJvcGUgYW5kIEluZGlhLgorICovCisKKy8qIGZyb20gemlwLmggKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7CS8qIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7CS8qIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSAqLworCitzdGF0aWMgdm9pZCBtYWtlX2NyY190YWIgX19BUkdTKCh2b2lkKSk7CisKK3VsZyBjcmNfMzJfdGFiWzI1Nl07CisKKy8qCisgKiBGaWxsIHRoZSBDUkMgdGFibGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWFrZV9jcmNfdGFiKCkKK3sKKyAgICB1bGcJCXMsdCx2OworICAgIHN0YXRpYyBpbnQJZG9uZSA9IEZBTFNFOworCisgICAgaWYgKGRvbmUpCisJcmV0dXJuOworICAgIGZvciAodCA9IDA7IHQgPCAyNTY7IHQrKykKKyAgICB7CisJdiA9IHQ7CisJZm9yIChzID0gMDsgcyA8IDg7IHMrKykKKwkgICAgdiA9ICh2ID4+IDEpIF4gKCh2ICYgMSkgKiAodWxnKTB4ZWRiODgzMjBMKTsKKwljcmNfMzJfdGFiW3RdID0gdjsKKyAgICB9CisgICAgZG9uZSA9IFRSVUU7Cit9CisKKyNkZWZpbmUgQ1JDMzIoYywgYikgKGNyY18zMl90YWJbKChpbnQpKGMpIF4gKGIpKSAmIDB4ZmZdIF4gKChjKSA+PiA4KSkKKworCitzdGF0aWMgdWxnIGtleXNbM107IC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KKworLyoKKyAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlCisgKi8KKyAgICBpbnQKK2RlY3J5cHRfYnl0ZSgpCit7CisgICAgdXNoIHRlbXA7CisKKyAgICB0ZW1wID0gKHVzaClrZXlzWzJdIHwgMjsKKyAgICByZXR1cm4gKGludCkoKCh1bnNpZ25lZCkodGVtcCAqICh0ZW1wIF4gMSkpID4+IDgpICYgMHhmZik7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dAorICovCisgICAgaW50Cit1cGRhdGVfa2V5cyhjKQorICAgIGludCBjOwkJCS8qIGJ5dGUgb2YgcGxhaW4gdGV4dCAqLworeworICAgIGtleXNbMF0gPSBDUkMzMihrZXlzWzBdLCBjKTsKKyAgICBrZXlzWzFdICs9IGtleXNbMF0gJiAweGZmOworICAgIGtleXNbMV0gPSBrZXlzWzFdICogMTM0Nzc1ODEzTCArIDE7CisgICAga2V5c1syXSA9IENSQzMyKGtleXNbMl0sIChpbnQpKGtleXNbMV0gPj4gMjQpKTsKKyAgICByZXR1cm4gYzsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCisgKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCisgKiBJZiAicGFzc3dkIiBpcyBOVUxMIG9yIGVtcHR5LCBkb24ndCBkbyBhbnl0aGluZy4KKyAqLworICAgIHZvaWQKK2NyeXB0X2luaXRfa2V5cyhwYXNzd2QpCisgICAgY2hhcl91ICpwYXNzd2Q7CQkvKiBwYXNzd29yZCBzdHJpbmcgd2l0aCB3aGljaCB0byBtb2RpZnkga2V5cyAqLworeworICAgIGlmIChwYXNzd2QgIT0gTlVMTCAmJiAqcGFzc3dkICE9IE5VTCkKKyAgICB7CisJbWFrZV9jcmNfdGFiKCk7CisJa2V5c1swXSA9IDMwNTQxOTg5Nkw7CisJa2V5c1sxXSA9IDU5MTc1MTA0OUw7CisJa2V5c1syXSA9IDg3ODA4MjE5Mkw7CisJd2hpbGUgKCpwYXNzd2QgIT0gJ1wwJykKKwkgICAgdXBkYXRlX2tleXMoKGludCkqcGFzc3dkKyspOworICAgIH0KK30KKworLyoKKyAqIEFzayB0aGUgdXNlciBmb3IgYSBjcnlwdCBrZXkuCisgKiBXaGVuICJzdG9yZSIgaXMgVFJVRSwgdGhlIG5ldyBrZXkgaW4gc3RvcmVkIGluIHRoZSAna2V5JyBvcHRpb24sIGFuZCB0aGUKKyAqICdrZXknIG9wdGlvbiB2YWx1ZSBpcyByZXR1cm5lZDogRG9uJ3QgZnJlZSBpdC4KKyAqIFdoZW4gInN0b3JlIiBpcyBGQUxTRSwgdGhlIHR5cGVkIGtleSBpcyByZXR1cm5lZCBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X2NyeXB0X2tleShzdG9yZSwgdHdpY2UpCisgICAgaW50CQlzdG9yZTsKKyAgICBpbnQJCXR3aWNlOwkgICAgLyogQXNrIGZvciB0aGUga2V5IHR3aWNlLiAqLworeworICAgIGNoYXJfdQkqcDEsICpwMiA9IE5VTEw7CisgICAgaW50CQlyb3VuZDsKKworICAgIGZvciAocm91bmQgPSAwOyA7ICsrcm91bmQpCisgICAgeworCWNtZGxpbmVfc3RhciA9IFRSVUU7CisJY21kbGluZV9yb3cgPSBtc2dfcm93OworCXAxID0gZ2V0Y21kbGluZV9wcm9tcHQoTlVMLCByb3VuZCA9PSAwCisJCT8gKGNoYXJfdSAqKV8oIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiKQorCQk6IChjaGFyX3UgKilfKCJFbnRlciBzYW1lIGtleSBhZ2FpbjogIiksIDApOworCWNtZGxpbmVfc3RhciA9IEZBTFNFOworCisJaWYgKHAxID09IE5VTEwpCisJICAgIGJyZWFrOworCisJaWYgKHJvdW5kID09IHR3aWNlKQorCXsKKwkgICAgaWYgKHAyICE9IE5VTEwgJiYgU1RSQ01QKHAxLCBwMikgIT0gMCkKKwkgICAgeworCQlNU0coXygiS2V5cyBkb24ndCBtYXRjaCEiKSk7CisJCXZpbV9mcmVlKHAxKTsKKwkJdmltX2ZyZWUocDIpOworCQlwMiA9IE5VTEw7CisJCXJvdW5kID0gLTE7CQkvKiBkbyBpdCBhZ2FpbiAqLworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoc3RvcmUpCisJICAgIHsKKwkJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImtleSIsIDBMLCBwMSwgT1BUX0xPQ0FMKTsKKwkJdmltX2ZyZWUocDEpOworCQlwMSA9IGN1cmJ1Zi0+Yl9wX2tleTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJcDIgPSBwMTsKKyAgICB9CisKKyAgICAvKiBzaW5jZSB0aGUgdXNlciB0eXBlZCB0aGlzLCBubyBuZWVkIHRvIHdhaXQgZm9yIHJldHVybiAqLworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CisKKyAgICB2aW1fZnJlZShwMik7CisgICAgcmV0dXJuIHAxOworfQorCisjZW5kaWYgLyogRkVBVF9DUllQVCAqLworCisvKiBUT0RPOiBtYWtlIHNvbWUgI2lmZGVmIGZvciB0aGlzICovCisvKi0tLS0tLS0tWyBmaWxlIHNlYXJjaGluZyBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRmlsZSBzZWFyY2hpbmcgZnVuY3Rpb25zIGZvciAncGF0aCcsICd0YWdzJyBhbmQgJ2NkcGF0aCcgb3B0aW9ucy4KKyAqIEV4dGVybmFsIHZpc2libGUgZnVuY3Rpb25zOgorICogdmltX2ZpbmRmaWxlX2luaXQoKQkJY3JlYXRlcy9pbml0aWFsaXNlcyB0aGUgc2VhcmNoIGNvbnRleHQKKyAqIHZpbV9maW5kZmlsZV9mcmVlX3Zpc2l0ZWQoKQlmcmVlIGxpc3Qgb2YgdmlzaXRlZCBmaWxlcy9kaXJzIG9mIHNlYXJjaAorICoJCQkJY29udGV4dAorICogdmltX2ZpbmRmaWxlKCkJCWZpbmQgYSBmaWxlIGluIHRoZSBzZWFyY2ggY29udGV4dAorICogdmltX2ZpbmRmaWxlX2NsZWFudXAoKQljbGVhbnVwL2ZyZWUgc2VhcmNoIGNvbnRleHQgY3JlYXRlZCBieQorICoJCQkJdmltX2ZpbmRmaWxlX2luaXQoKQorICoKKyAqIEFsbCBzdGF0aWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgc3RhcnQgd2l0aCAnZmZfJworICoKKyAqIEluIGdlbmVyYWwgaXQgd29ya3MgbGlrZSB0aGlzOgorICogRmlyc3QgeW91IGNyZWF0ZSB5b3Vyc2VsZiBhIHNlYXJjaCBjb250ZXh0IGJ5IGNhbGxpbmcgdmltX2ZpbmRmaWxlX2luaXQoKS4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGdpdmUgYSBzZWFyY2ggY29udGV4dCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICogdmltX2ZpbmRmaWxlX2luaXQoKSwgc28gaXQgY2FuIGJlIHJldXNlZC4gQWZ0ZXIgdGhpcyB5b3UgY2FsbCB2aW1fZmluZGZpbGUoKQorICogdW50aWwgeW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB0aGUgcmVzdWx0IG9yIGl0IHJldHVybnMgTlVMTC4gT24gZXZlcnkgY2FsbCBpdAorICogcmV0dXJucyB0aGUgbmV4dCBmaWxlIHdoaWNoIG1hdGNoZXMgdGhlIGNvbmRpdGlvbnMgZ2l2ZW4gdG8KKyAqIHZpbV9maW5kZmlsZV9pbml0KCkuIElmIGl0IGRvZXNuJ3QgZmluZCBhIG5leHQgZmlsZSBpdCByZXR1cm5zIE5VTEwuCisgKgorICogSXQgaXMgcG9zc2libGUgdG8gY2FsbCB2aW1fZmluZGZpbGVfaW5pdCgpIGFnYWluIHRvIHJlaW5pdGlhbGlzZSB5b3VyIHNlYXJjaAorICogd2l0aCBzb21lIG5ldyBwYXJhbWV0ZXJzLiBEb24ndCBmb3JnZXQgdG8gcGFzcyB5b3VyIG9sZCBzZWFyY2ggY29udGV4dCB0bworICogaXQsIHNvIGl0IGNhbiByZXVzZSBpdCBhbmQgZXNwZWNpYWxseSByZXVzZSB0aGUgbGlzdCBvZiBhbHJlYWR5IHZpc2l0ZWQKKyAqIGRpcmVjdG9yaWVzLiBJZiB5b3Ugd2FudCB0byBkZWxldGUgdGhlIGxpc3Qgb2YgYWxyZWFkeSB2aXNpdGVkIGRpcmVjdG9yaWVzCisgKiBzaW1wbHkgY2FsbCB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkKCkuCisgKgorICogV2hlbiB5b3UgYXJlIGRvbmUgY2FsbCB2aW1fZmluZGZpbGVfY2xlYW51cCgpIHRvIGZyZWUgdGhlIHNlYXJjaCBjb250ZXh0LgorICoKKyAqIFRoZSBmdW5jdGlvbiB2aW1fZmluZGZpbGVfaW5pdCgpIGhhcyBhIGxvbmcgY29tbWVudCwgd2hpY2ggZGVzY3JpYmVzIHRoZQorICogbmVlZGVkIHBhcmFtZXRlcnMuCisgKgorICoKKyAqCisgKiBBVFRFTlRJT046CisgKiA9PT09PT09PT09CisgKglBbHNvIHdlIHVzZSBhbiBhbGxvY2F0ZWQgc2VhcmNoIGNvbnRleHQgaGVyZSwgdGhpcyBmdW5jdGlvbnMgQVJFIE5PVAorICoJdGhyZWFkLXNhZmUhISEhIQorICoKKyAqCVRvIG1pbmltaXplIHBhcmFtZXRlciBwYXNzaW5nIChvciBiZWNhdXNlIEknbSB0byBsYXp5KSwgb25seSB0aGUKKyAqCWV4dGVybmFsIHZpc2libGUgZnVuY3Rpb25zIGdldCBhIHNlYXJjaCBjb250ZXh0IGFzIGEgcGFyYW1ldGVyLiBUaGlzIGlzCisgKgl0aGVuIGFzc2lnbmVkIHRvIGEgc3RhdGljIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBsb2NhbAorICoJZnVuY3Rpb25zLgorICovCisKKy8qCisgKiB0eXBlIGZvciB0aGUgZGlyZWN0b3J5IHNlYXJjaCBzdGFjaworICovCit0eXBlZGVmIHN0cnVjdCBmZl9zdGFjaworeworICAgIHN0cnVjdCBmZl9zdGFjawkqZmZzX3ByZXY7CisKKyAgICAvKiB0aGUgZml4IHBhcnQgKG5vIHdpbGRjYXJkcykgYW5kIHRoZSBwYXJ0IGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkcworICAgICAqIG9mIHRoZSBzZWFyY2ggcGF0aAorICAgICAqLworICAgIGNoYXJfdQkJKmZmc19maXhfcGF0aDsKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKyAgICBjaGFyX3UJCSpmZnNfd2NfcGF0aDsKKyNlbmRpZgorCisgICAgLyogZmlsZXMvZGlycyBmb3VuZCBpbiB0aGUgYWJvdmUgZGlyZWN0b3J5LCBtYXRjaGVkIGJ5IHRoZSBmaXJzdCB3aWxkY2FyZAorICAgICAqIG9mIHdjX3BhcnQKKyAgICAgKi8KKyAgICBjaGFyX3UJCSoqZmZzX2ZpbGVhcnJheTsKKyAgICBpbnQJCQlmZnNfZmlsZWFycmF5X3NpemU7CisgICAgY2hhcl91CQlmZnNfZmlsZWFycmF5X2N1cjsgICAvKiBuZWVkZWQgZm9yIHBhcnRseSBoYW5kbGVkIGRpcnMgKi8KKworICAgIC8qIHRvIHN0b3JlIHN0YXR1cyBvZiBwYXJ0bHkgaGFuZGxlZCBkaXJlY3RvcmllcworICAgICAqIDA6IHdlIHdvcmsgdGhlIG9uIHRoaXMgZGlyZWN0b3J5IGZvciB0aGUgZmlyc3QgdGltZQorICAgICAqIDE6IHRoaXMgZGlyZWN0b3J5IHdhcyBwYXJ0bHkgc2VhcmNoZWQgaW4gYW4gZWFybGllciBzdGVwCisgICAgKi8KKyAgICBpbnQJCQlmZnNfc3RhZ2U7CisKKyAgICAvKiBIb3cgZGVlcCBhcmUgd2UgaW4gdGhlIGRpcmVjdG9yeSB0cmVlPworICAgICAqIENvdW50cyBiYWNrd2FyZCBmcm9tIHZhbHVlIG9mIGxldmVsIHBhcmFtZXRlciB0byB2aW1fZmluZGZpbGVfaW5pdAorICAgICAqLworICAgIGludAkJCWZmc19sZXZlbDsKKworICAgIC8qIERpZCB3ZSBhbHJlYWR5IGV4cGFuZCAnKionIHRvIGFuIGVtcHR5IHN0cmluZz8gKi8KKyAgICBpbnQJCQlmZnNfc3Rhcl9zdGFyX2VtcHR5OworfSBmZl9zdGFja19UOworCisvKgorICogdHlwZSBmb3IgYWxyZWFkeSB2aXNpdGVkIGRpcmVjdG9yaWVzIG9yIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBmZl92aXNpdGVkCit7CisgICAgc3RydWN0IGZmX3Zpc2l0ZWQJKmZmdl9uZXh0OworCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgLyogVmlzaXRlZCBkaXJlY3RvcmllcyBhcmUgZGlmZmVyZW50IGlmIHRoZSB3aWxkY2FyZCBzdHJpbmcgYXJlCisgICAgICogZGlmZmVyZW50LiBTbyB3ZSBoYXZlIHRvIHNhdmUgaXQuCisgICAgICovCisgICAgY2hhcl91CQkqZmZ2X3djX3BhdGg7CisjZW5kaWYKKyAgICAvKiBmb3IgdW5peCB1c2UgaW5vZGUgZXRjIGZvciBjb21wYXJpc29uIChuZWVkZWQgYmVjYXVzZSBvZiBsaW5rcyksIGVsc2UKKyAgICAgKiB1c2UgZmlsZW5hbWUuCisgICAgICovCisjaWZkZWYgVU5JWAorICAgIGludAkJCWZmdl9kZXY7CS8qIGRldmljZSBudW1iZXIgKC0xIGlmIG5vdCBzZXQpICovCisgICAgaW5vX3QJCWZmdl9pbm87CS8qIGlub2RlIG51bWJlciAqLworI2VuZGlmCisgICAgLyogVGhlIG1lbW9yeSBmb3IgdGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgbGVuZ3RoIG9mCisgICAgICogZmZ2X2ZuYW1lLgorICAgICAqLworICAgIGNoYXJfdQkJZmZ2X2ZuYW1lWzFdOwkvKiBhY3R1YWxseSBsb25nZXIgKi8KK30gZmZfdmlzaXRlZF9UOworCisvKgorICogV2UgbWlnaHQgaGF2ZSB0byBtYW5hZ2Ugc2V2ZXJhbCB2aXNpdGVkIGxpc3RzIGR1cmluZyBhIHNlYXJjaC4KKyAqIFRoaXMgaXMgZXhwZWNpYWxseSBuZWVkZWQgZm9yIHRoZSB0YWdzIG9wdGlvbi4gSWYgdGFncyBpcyBzZXQgdG86CisgKiAgICAgICIuLysrL3RhZ3MsLi8rKy9UQUdTLCsrL3RhZ3MiICAocmVwbGFjZSArIHdpdGggKikKKyAqIFNvIHdlIGhhdmUgdG8gZG8gMyBzZWFyY2hlczoKKyAqICAgMSkgc2VhcmNoIGZyb20gdGhlIGN1cnJlbnQgZmlsZXMgZGlyZWN0b3J5IGRvd253YXJkIGZvciB0aGUgZmlsZSAidGFncyIKKyAqICAgMikgc2VhcmNoIGZyb20gdGhlIGN1cnJlbnQgZmlsZXMgZGlyZWN0b3J5IGRvd253YXJkIGZvciB0aGUgZmlsZSAiVEFHUyIKKyAqICAgMykgc2VhcmNoIGZyb20gVmltcyBjdXJyZW50IGRpcmVjdG9yeSBkb3dud2FyZHMgZm9yIHRoZSBmaWxlICJ0YWdzIgorICogQXMgeW91IGNhbiBzZWUsIHRoZSBmaXJzdCBhbmQgdGhlIHRoaXJkIHNlYXJjaCBhcmUgZm9yIHRoZSBzYW1lIGZpbGUsIHNvIGZvcgorICogdGhlIHRoaXJkIHNlYXJjaCB3ZSBjYW4gdXNlIHRoZSB2aXNpdGVkIGxpc3Qgb2YgdGhlIGZpcnN0IHNlYXJjaC4gRm9yIHRoZQorICogc2Vjb25kIHNlYXJjaCB3ZSBtdXN0IHN0YXJ0IGZyb20gYSBlbXB0eSB2aXNpdGVkIGxpc3QuCisgKiBUaGUgc3RydWN0IGZmX3Zpc2l0ZWRfbGlzdF9oZHIgaXMgdXNlZCB0byBtYW5hZ2UgYSBsaW5rZWQgbGlzdCBvZiBhbHJlYWR5CisgKiB2aXNpdGVkIGxpc3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBmZl92aXNpdGVkX2xpc3RfaGRyCit7CisgICAgc3RydWN0IGZmX3Zpc2l0ZWRfbGlzdF9oZHIJKmZmdmxfbmV4dDsKKworICAgIC8qIHRoZSBmaWxlbmFtZSB0aGUgYXR0YWNoZWQgdmlzaXRlZCBsaXN0IGlzIGZvciAqLworICAgIGNoYXJfdQkJCSpmZnZsX2ZpbGVuYW1lOworCisgICAgZmZfdmlzaXRlZF9UCQkqZmZ2bF92aXNpdGVkX2xpc3Q7CisKK30gZmZfdmlzaXRlZF9saXN0X2hkcl9UOworCisKKy8qCisgKiAnKionIGNhbiBiZSBleHBhbmRlZCB0byBzZXZlcmFsIGRpcmVjdG9yeSBsZXZlbHMuCisgKiBTZXQgdGhlIGRlZmF1bHQgbWF4aW1pdW0gZGVwdGguCisgKi8KKyNkZWZpbmUgRkZfTUFYX1NUQVJfU1RBUl9FWFBBTkQgKChjaGFyX3UpMzApCisvKgorICogVGhlIHNlYXJjaCBjb250ZXh0OgorICogICBmZnNjX3N0YWNrX3B0cjoJdGhlIHN0YWNrIGZvciB0aGUgZGlycyB0byBzZWFyY2gKKyAqICAgZmZzY192aXNpdGVkX2xpc3Q6IHRoZSBjdXJyZW50bHkgYWN0aXZlIHZpc2l0ZWQgbGlzdAorICogICBmZnNjX2Rpcl92aXNpdGVkX2xpc3Q6IHRoZSBjdXJyZW50bHkgYWN0aXZlIHZpc2l0ZWQgbGlzdCBmb3Igc2VhcmNoIGRpcnMKKyAqICAgZmZzY192aXNpdGVkX2xpc3RzX2xpc3Q6IHRoZSBsaXN0IG9mIGFsbCB2aXNpdGVkIGxpc3RzCisgKiAgIGZmc2NfZGlyX3Zpc2l0ZWRfbGlzdHNfbGlzdDogdGhlIGxpc3Qgb2YgYWxsIHZpc2l0ZWQgbGlzdHMgZm9yIHNlYXJjaCBkaXJzCisgKiAgIGZmc2NfZmlsZV90b19zZWFyY2g6ICAgICB0aGUgZmlsZSB0byBzZWFyY2ggZm9yCisgKiAgIGZmc2Nfc3RhcnRfZGlyOgl0aGUgc3RhcnRpbmcgZGlyZWN0b3J5LCBpZiBzZWFyY2ggcGF0aCB3YXMgcmVsYXRpdmUKKyAqICAgZmZzY19maXhfcGF0aDoJdGhlIGZpeCBwYXJ0IG9mIHRoZSBnaXZlbiBwYXRoICh3aXRob3V0IHdpbGRjYXJkcykKKyAqCQkJTmVlZGVkIGZvciB1cHdhcmQgc2VhcmNoLgorICogICBmZnNjX3djX3BhdGg6CXRoZSBwYXJ0IG9mIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW5pbmcgd2lsZGNhcmRzCisgKiAgIGZmc2NfbGV2ZWw6CWhvdyBtYW55IGxldmVscyBvZiBkaXJzIHRvIHNlYXJjaCBkb3dud2FyZHMKKyAqICAgZmZzY19zdG9wZGlyc192OglhcnJheSBvZiBzdG9wIGRpcmVjdG9yaWVzIGZvciB1cHdhcmQgc2VhcmNoCisgKiAgIGZmc2NfbmVlZF9kaXI6CVRSVUUgaWYgd2Ugc2VhcmNoIGZvciBhIGRpcmVjdG9yeQorICovCit0eXBlZGVmIHN0cnVjdCBmZl9zZWFyY2hfY3R4X1QKK3sKKyAgICAgZmZfc3RhY2tfVAkJCSpmZnNjX3N0YWNrX3B0cjsKKyAgICAgZmZfdmlzaXRlZF9saXN0X2hkcl9UCSpmZnNjX3Zpc2l0ZWRfbGlzdDsKKyAgICAgZmZfdmlzaXRlZF9saXN0X2hkcl9UCSpmZnNjX2Rpcl92aXNpdGVkX2xpc3Q7CisgICAgIGZmX3Zpc2l0ZWRfbGlzdF9oZHJfVAkqZmZzY192aXNpdGVkX2xpc3RzX2xpc3Q7CisgICAgIGZmX3Zpc2l0ZWRfbGlzdF9oZHJfVAkqZmZzY19kaXJfdmlzaXRlZF9saXN0c19saXN0OworICAgICBjaGFyX3UJCQkqZmZzY19maWxlX3RvX3NlYXJjaDsKKyAgICAgY2hhcl91CQkJKmZmc2Nfc3RhcnRfZGlyOworICAgICBjaGFyX3UJCQkqZmZzY19maXhfcGF0aDsKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKyAgICAgY2hhcl91CQkJKmZmc2Nfd2NfcGF0aDsKKyAgICAgaW50CQkJZmZzY19sZXZlbDsKKyAgICAgY2hhcl91CQkJKipmZnNjX3N0b3BkaXJzX3Y7CisjZW5kaWYKKyAgICAgaW50CQkJZmZzY19uZWVkX2RpcjsKK31mZl9zZWFyY2hfY3R4X1Q7CitzdGF0aWMgZmZfc2VhcmNoX2N0eF9UICpmZl9zZWFyY2hfY3R4ID0gTlVMTDsKKworLyogdXNlZCBmb3IgZXhwYW5kaW5nIGZpbGVuYW1lcyAqLworc3RhdGljIGNoYXJfdQkJKmZmX2V4cGFuZF9idWZmZXIgPSBOVUxMOworCisvKiBsb2NhbGx5IG5lZWRlZCBmdW5jdGlvbnMgKi8KKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKK3N0YXRpYyBpbnQgZmZfY2hlY2tfdmlzaXRlZCBfX0FSR1MoKGZmX3Zpc2l0ZWRfVCAqKiwgY2hhcl91ICosIGNoYXJfdSAqKSk7CisjZWxzZQorc3RhdGljIGludCBmZl9jaGVja192aXNpdGVkIF9fQVJHUygoZmZfdmlzaXRlZF9UICoqLCBjaGFyX3UgKikpOworI2VuZGlmCitzdGF0aWMgdm9pZCB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkX2xpc3QgX19BUkdTKChmZl92aXNpdGVkX2xpc3RfaGRyX1QgKipsaXN0X2hlYWRwKSk7CitzdGF0aWMgdm9pZCBmZl9mcmVlX3Zpc2l0ZWRfbGlzdCBfX0FSR1MoKGZmX3Zpc2l0ZWRfVCAqdmwpKTsKK3N0YXRpYyBmZl92aXNpdGVkX2xpc3RfaGRyX1QqIGZmX2dldF92aXNpdGVkX2xpc3QgX19BUkdTKChjaGFyX3UgKiwgZmZfdmlzaXRlZF9saXN0X2hkcl9UICoqbGlzdF9oZWFkcCkpOworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorc3RhdGljIGludCBmZl93Y19lcXVhbCBfX0FSR1MoKGNoYXJfdSAqczEsIGNoYXJfdSAqczIpKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmZl9wdXNoIF9fQVJHUygoZmZfc3RhY2tfVCAqKSk7CitzdGF0aWMgZmZfc3RhY2tfVCAqIGZmX3BvcCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGZmX2NsZWFyIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgZmZfZnJlZV9zdGFja19lbGVtZW50IF9fQVJHUygoZmZfc3RhY2tfVCAqKSk7CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCitzdGF0aWMgZmZfc3RhY2tfVCAqZmZfY3JlYXRlX3N0YWNrX2VsZW1lbnQgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGludCwgaW50KSk7CisjZWxzZQorc3RhdGljIGZmX3N0YWNrX1QgKmZmX2NyZWF0ZV9zdGFja19lbGVtZW50IF9fQVJHUygoY2hhcl91ICosIGludCwgaW50KSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKK3N0YXRpYyBpbnQgZmZfcGF0aF9pbl9zdG9wbGlzdCBfX0FSR1MoKGNoYXJfdSAqLCBpbnQsIGNoYXJfdSAqKikpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKK3N0YXRpYyBjaGFyX3UgKmZpbmRfZmlsZV9pbl9wYXRoX29wdGlvbiBfX0FSR1MoKGNoYXJfdSAqcHRyLCBpbnQgbGVuLCBpbnQgb3B0aW9ucywgaW50IGZpcnN0LCBjaGFyX3UgKnBhdGhfb3B0aW9uLCBpbnQgbmVlZF9kaXIsIGNoYXJfdSAqcmVsX2ZuYW1lKSk7CisjZW5kaWYKKworI2lmIDAKKy8qCisgKiBpZiBzb21lb25lIGxpa2VzIGZpbmRmaXJzdC9maW5kbmV4dCwgaGVyZSBhcmUgdGhlIGZ1bmN0aW9ucworICogTk9UIFRFU1RFRCEhCisgKi8KKworc3RhdGljIHZvaWQgKmZmX2ZuX3NlYXJjaF9jb250ZXh0ID0gTlVMTDsKKworICAgIGNoYXJfdSAqCit2aW1fZmluZGZpcnN0KHBhdGgsIGZpbGVuYW1lLCBsZXZlbCkKKyAgICBjaGFyX3UJKnBhdGg7CisgICAgY2hhcl91CSpmaWxlbmFtZTsKKyAgICBpbnQJCWxldmVsOworeworICAgIGZmX2ZuX3NlYXJjaF9jb250ZXh0ID0KKwl2aW1fZmluZGZpbGVfaW5pdChwYXRoLCBmaWxlbmFtZSwgTlVMTCwgbGV2ZWwsIFRSVUUsIEZBTFNFLAorCQlmZl9mbl9zZWFyY2hfY29udGV4dCwgcmVsX2ZuYW1lKTsKKyAgICBpZiAoTlVMTCA9PSBmZl9mbl9zZWFyY2hfY29udGV4dCkKKwlyZXR1cm4gTlVMTDsKKyAgICBlbHNlCisJcmV0dXJuIHZpbV9maW5kbmV4dCgpCit9CisKKyAgICBjaGFyX3UgKgordmltX2ZpbmRuZXh0KCkKK3sKKyAgICBjaGFyX3UgKnJldCA9IHZpbV9maW5kZmlsZShmZl9mbl9zZWFyY2hfY29udGV4dCk7CisKKyAgICBpZiAoTlVMTCA9PSByZXQpCisgICAgeworCXZpbV9maW5kZmlsZV9jbGVhbnVwKGZmX2ZuX3NlYXJjaF9jb250ZXh0KTsKKwlmZl9mbl9zZWFyY2hfY29udGV4dCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHZpbV9maW5kZmlsZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXdseSBhbGxvY2F0ZWQgc2VhcmNoIGNvbnRleHQgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkLgorICoKKyAqIERvbid0IGZvcmdldCB0byBjbGVhbiB1cCBieSBjYWxsaW5nIHZpbV9maW5kZmlsZV9jbGVhbnVwKCkgaWYgeW91IGFyZSBkb25lCisgKiB3aXRoIHRoZSBzZWFyY2ggY29udGV4dC4KKyAqCisgKiBGaW5kIHRoZSBmaWxlICdmaWxlbmFtZScgaW4gdGhlIGRpcmVjdG9yeSAncGF0aCcuCisgKiBUaGUgcGFyYW1ldGVyICdwYXRoJyBtYXkgY29udGFpbiB3aWxkY2FyZHMuIElmIHNvIG9ubHkgc2VhcmNoICdsZXZlbCcKKyAqIGRpcmVjdG9yaWVzIGRlZXAuIFRoZSBwYXJhbWV0ZXIgJ2xldmVsJyBpcyB0aGUgYWJzb2x1dGUgbWF4aW11bSBhbmQgaXMKKyAqIG5vdCByZWxhdGVkIHRvIHJlc3RyaWN0cyBnaXZlbiB0byB0aGUgJyoqJyB3aWxkY2FyZC4gSWYgJ2xldmVsJyBpcyAxMDAKKyAqIGFuZCB5b3UgdXNlICcqKjIwMCcgdmltX2ZpbmRmaWxlKCkgd2lsbCBzdG9wIGFmdGVyIDEwMCBsZXZlbHMuCisgKgorICogSWYgJ3N0b3BkaXJzJyBpcyBub3QgTlVMTCBhbmQgbm90aGluZyBpcyBmb3VuZCBkb3dud2FyZCwgdGhlIHNlYXJjaCBpcworICogcmVzdGFydGVkIG9uIHRoZSBuZXh0IGhpZ2hlciBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgaXMgcmVwZWF0ZWQgdW50aWwgdGhlCisgKiBzdGFydC1kaXJlY3Rvcnkgb2YgYSBzZWFyY2ggaXMgY29udGFpbmVkIGluICdzdG9wZGlycycuICdzdG9wZGlycycgaGFzIHRoZQorICogZm9ybWF0ICI7KjxkaXJuYW1lPipcKDs8ZGlybmFtZT5cKSo7XD0kIi4KKyAqCisgKiBJZiB0aGUgJ3BhdGgnIGlzIHJlbGF0aXZlLCB0aGUgc3RhcnRpbmcgZGlyIGZvciB0aGUgc2VhcmNoIGlzIGVpdGhlciBWSU0ncworICogY3VycmVudCBkaXIgb3IgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggIi4vIiB0aGUgY3VycmVudCBmaWxlcyBkaXIuCisgKiBJZiB0aGUgJ3BhdGgnIGlzIGFic29sdXQsIHRoZSBzdGFydGluZyBkaXIgaXMgdGhhdCBwYXJ0IG9mIHRoZSBwYXRoIGJlZm9yZQorICogdGhlIGZpcnN0IHdpbGRjYXJkLgorICoKKyAqIFVwd2FyZCBzZWFyY2ggaXMgb25seSBkb25lIG9uIHRoZSBzdGFydGluZyBkaXIuCisgKgorICogSWYgJ2ZyZWVfdmlzaXRlZCcgaXMgVFJVRSB0aGUgbGlzdCBvZiBhbHJlYWR5IHZpc2l0ZWQgZmlsZXMvZGlyZWN0b3JpZXMgaXMKKyAqIGNsZWFyZWQuIFNldCB0aGlzIHRvIEZBTFNFIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VhcmNoIGZyb20gYW5vdGhlcgorICogZGlyZWN0b3J5LCBidXQgd2FudCB0byBiZSBzdXJlIHRoYXQgbm8gZGlyZWN0b3J5IGZyb20gYSBwcmV2aW91cyBzZWFyY2ggaXMKKyAqIHNlYXJjaGVkIGFnYWluLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugc2VhcmNoIGZvciBhIGZpbGUgYXQgZGlmZmVyZW50IHBsYWNlcy4KKyAqIFRoZSBsaXN0IG9mIHZpc2l0ZWQgZmlsZXMvZGlycyBjYW4gYWxzbyBiZSBjbGVhcmVkIHdpdGggdGhlIGZ1bmN0aW9uCisgKiB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkKCkuCisgKgorICogU2V0IHRoZSBwYXJhbWV0ZXIgJ25lZWRfZGlyJyB0byBUUlVFIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgYSBkaXJlY3RvcnkKKyAqIGluc3RlYWQgb2YgYSBmaWxlLgorICoKKyAqIEEgc2VhcmNoIGNvbnRleHQgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIHZpbV9maW5kZmlsZV9pbml0KCkgY2FuIGJlCisgKiBwYXNzZWQgaW4gdGhlIHBhcmFtZXRlciAnc2VhcmNoX2N0eCcuIFRoaXMgY29udGV4dCBpcyB0aGFuIHJldXNlZCBhbmQKKyAqIHJlaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmV3IHBhcmFtZXRlcnMuIFRoZSBsaXN0IG9mIGFscmVhZHkgdmlzZXRlZAorICogZGlyZWN0b3JpZXMgZnJvbSB0aGlzIGNvbnRleHQgaXMgb25seSBkZWxldGVkIGlmIHRoZSBwYXJhbWV0ZXIKKyAqICdmcmVlX3Zpc2l0ZWQnIGlzIHRydWUuIEJlIGF3YXJlIHRoYXQgdGhlIHBhc3NlZCBzZWFyY2hfY29udGV4dCBpcyBmcmVlZCBpZgorICogdGhlIHJlaW5pdGlhbGl6YXRpb24gZmFpbHMuCisgKgorICogSWYgeW91IGRvbid0IGhhdmUgYSBzZWFyY2ggY29udGV4dCBmcm9tIGEgcHJldmlvdXMgY2FsbCAnc2VhcmNoX2N0eCcgbXVzdCBiZQorICogTlVMTC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNpbGVudGx5IGlnbm9yZXMgYSBmZXcgZXJyb3JzLCB2aW1fZmluZGZpbGUoKSB3aWxsIGhhdmUKKyAqIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSB0aGVuLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkICoKK3ZpbV9maW5kZmlsZV9pbml0KHBhdGgsIGZpbGVuYW1lLCBzdG9wZGlycywgbGV2ZWwsIGZyZWVfdmlzaXRlZCwgbmVlZF9kaXIsCisJCQkJCQlzZWFyY2hfY3R4LCB0YWdmaWxlLCByZWxfZm5hbWUpCisgICAgY2hhcl91CSpwYXRoOworICAgIGNoYXJfdQkqZmlsZW5hbWU7CisgICAgY2hhcl91CSpzdG9wZGlyczsKKyAgICBpbnQJCWxldmVsOworICAgIGludAkJZnJlZV92aXNpdGVkOworICAgIGludAkJbmVlZF9kaXI7CisgICAgdm9pZAkqc2VhcmNoX2N0eDsKKyAgICBpbnQJCXRhZ2ZpbGU7CisgICAgY2hhcl91CSpyZWxfZm5hbWU7CS8qIGZpbGUgbmFtZSB0byB1c2UgZm9yICIuIiAqLworeworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorICAgIGNoYXJfdQkqd2NfcGFydDsKKyNlbmRpZgorICAgIGZmX3N0YWNrX1QJKnNwdHI7CisKKyAgICAvKiBJZiBhIHNlYXJjaCBjb250ZXh0IGlzIGdpdmVuIGJ5IHRoZSBjYWxsZXIsIHJldXNlIGl0LCBlbHNlIGFsbG9jYXRlIGEKKyAgICAgKiBuZXcgb25lLgorICAgICAqLworICAgIGlmIChzZWFyY2hfY3R4ICE9IE5VTEwpCisJZmZfc2VhcmNoX2N0eCA9IHNlYXJjaF9jdHg7CisgICAgZWxzZQorICAgIHsKKwlmZl9zZWFyY2hfY3R4ID0gKGZmX3NlYXJjaF9jdHhfVCopYWxsb2MoCisJCQkJCSAgICh1bnNpZ25lZClzaXplb2YoZmZfc2VhcmNoX2N0eF9UKSk7CisJaWYgKGZmX3NlYXJjaF9jdHggPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJbWVtc2V0KGZmX3NlYXJjaF9jdHgsIDAsIHNpemVvZihmZl9zZWFyY2hfY3R4X1QpKTsKKyAgICB9CisKKyAgICAvKiBjbGVhciB0aGUgc2VhcmNoIGNvbnRleHQsIGJ1dCBOT1QgdGhlIHZpc2l0ZWQgbGlzdHMgKi8KKyAgICBmZl9jbGVhcigpOworCisgICAgLyogY2xlYXIgdmlzaXRlZCBsaXN0IGlmIHdhbnRlZCAqLworICAgIGlmIChmcmVlX3Zpc2l0ZWQgPT0gVFJVRSkKKwl2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkKGZmX3NlYXJjaF9jdHgpOworICAgIGVsc2UKKyAgICB7CisJLyogUmV1c2Ugb2xkIHZpc2l0ZWQgbGlzdHMuIEdldCB0aGUgdmlzaXRlZCBsaXN0IGZvciB0aGUgZ2l2ZW4KKwkgKiBmaWxlbmFtZS4gSWYgbm8gbGlzdCBmb3IgdGhlIGN1cnJlbnQgZmlsZW5hbWUgZXhpc3RzLCBjcmVhdGVzIGEgbmV3CisJICogb25lLgorCSAqLworCWZmX3NlYXJjaF9jdHgtPmZmc2NfdmlzaXRlZF9saXN0ID0gZmZfZ2V0X3Zpc2l0ZWRfbGlzdChmaWxlbmFtZSwKKwkJCQkgICAgICZmZl9zZWFyY2hfY3R4LT5mZnNjX3Zpc2l0ZWRfbGlzdHNfbGlzdCk7CisJaWYgKGZmX3NlYXJjaF9jdHgtPmZmc2NfdmlzaXRlZF9saXN0ID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCWZmX3NlYXJjaF9jdHgtPmZmc2NfZGlyX3Zpc2l0ZWRfbGlzdCA9IGZmX2dldF92aXNpdGVkX2xpc3QoZmlsZW5hbWUsCisJCQkJICZmZl9zZWFyY2hfY3R4LT5mZnNjX2Rpcl92aXNpdGVkX2xpc3RzX2xpc3QpOworCWlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX2Rpcl92aXNpdGVkX2xpc3QgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgICAgaWYgKGZmX2V4cGFuZF9idWZmZXIgPT0gTlVMTCkKKyAgICB7CisJZmZfZXhwYW5kX2J1ZmZlciA9IChjaGFyX3UqKWFsbG9jKE1BWFBBVEhMKTsKKwlpZiAoZmZfZXhwYW5kX2J1ZmZlciA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTdG9yZSBpbmZvcm1hdGlvbiBvbiBzdGFydGluZyBkaXIgbm93IGlmIHBhdGggaXMgcmVsYXRpdmUuCisgICAgICogSWYgcGF0aCBpcyBhYnNvbHV0ZSwgd2UgZG8gdGhhdCBsYXRlci4KKyAgICAgKi8KKyAgICBpZiAocGF0aFswXSA9PSAnLicKKwkgICAgJiYgKHZpbV9pc3BhdGhzZXAocGF0aFsxXSkgfHwgcGF0aFsxXSA9PSBOVUwpCisJICAgICYmICghdGFnZmlsZSB8fCB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRE9UVEFHKSA9PSBOVUxMKQorCSAgICAmJiByZWxfZm5hbWUgIT0gTlVMTCkKKyAgICB7CisJaW50CWxlbiA9IChpbnQpKGdldHRhaWwocmVsX2ZuYW1lKSAtIHJlbF9mbmFtZSk7CisKKwlpZiAoIXZpbV9pc0Fic05hbWUocmVsX2ZuYW1lKSAmJiBsZW4gKyAxIDwgTUFYUEFUSEwpCisJeworCSAgICAvKiBNYWtlIHRoZSBzdGFydCBkaXIgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLiAqLworCSAgICBTVFJOQ1BZKGZmX2V4cGFuZF9idWZmZXIsIHJlbF9mbmFtZSwgbGVuKTsKKwkgICAgZmZfZXhwYW5kX2J1ZmZlcltsZW5dID0gTlVMOworCSAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpciA9IEZ1bGxOYW1lX3NhdmUoZmZfZXhwYW5kX2J1ZmZlciwKKwkJCQkJCQkJICAgICAgIEZBTFNFKTsKKwl9CisJZWxzZQorCSAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpciA9IHZpbV9zdHJuc2F2ZShyZWxfZm5hbWUsIGxlbik7CisJaWYgKGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhcnRfZGlyID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCWlmICgqKytwYXRoICE9IE5VTCkKKwkgICAgKytwYXRoOworICAgIH0KKyAgICBlbHNlIGlmICgqcGF0aCA9PSBOVUwgfHwgIXZpbV9pc0Fic05hbWUocGF0aCkpCisgICAgeworI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCS8qICJjOmRpciIgbmVlZHMgImM6IiB0byBiZSBleHBhbmRlZCwgb3RoZXJ3aXNlIHVzZSBjdXJyZW50IGRpciAqLworCWlmICgqcGF0aCAhPSBOVUwgJiYgcGF0aFsxXSA9PSAnOicpCisJeworCSAgICBjaGFyX3UgIGRyaXZlWzNdOworCisJICAgIGRyaXZlWzBdID0gcGF0aFswXTsKKwkgICAgZHJpdmVbMV0gPSAnOic7CisJICAgIGRyaXZlWzJdID0gTlVMOworCSAgICBpZiAodmltX0Z1bGxOYW1lKGRyaXZlLCBmZl9leHBhbmRfYnVmZmVyLCBNQVhQQVRITCwgVFJVRSkgPT0gRkFJTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIHBhdGggKz0gMjsKKwl9CisJZWxzZQorI2VuZGlmCisJaWYgKG1jaF9kaXJuYW1lKGZmX2V4cGFuZF9idWZmZXIsIE1BWFBBVEhMKSA9PSBGQUlMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCWZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhcnRfZGlyID0gdmltX3N0cnNhdmUoZmZfZXhwYW5kX2J1ZmZlcik7CisJaWYgKGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhcnRfZGlyID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJLyogQSBwYXRoIHRoYXQgc3RhcnRzIHdpdGggIi9kaXIiIGlzIHJlbGF0aXZlIHRvIHRoZSBkcml2ZSwgbm90IHRvIHRoZQorCSAqIGRpcmVjdG9yeSAoYnV0IG5vdCBmb3IgIi8vbWFjaGluZS9kaXIiKS4gIE9ubHkgdXNlIHRoZSBkcml2ZSBuYW1lLiAqLworCWlmICgoKnBhdGggPT0gJy8nIHx8ICpwYXRoID09ICdcXCcpCisJCSYmIHBhdGhbMV0gIT0gcGF0aFswXQorCQkmJiBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpclsxXSA9PSAnOicpCisJICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhcnRfZGlyWzJdID0gTlVMOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgLyoKKyAgICAgKiBJZiBzdG9wZGlycyBhcmUgZ2l2ZW4sIHNwbGl0IHRoZW0gaW50byBhbiBhcnJheSBvZiBwb2ludGVycy4KKyAgICAgKiBJZiB0aGlzIGZhaWxzIChtZW0gYWxsb2NhdGlvbiksIHRoZXJlIGlzIG5vIHVwd2FyZCBzZWFyY2ggYXQgYWxsIG9yIGEKKyAgICAgKiBzdG9wIGRpcmVjdG9yeSBpcyBub3QgcmVjb2duaXplZCAtPiBjb250aW51ZSBzaWxlbnRseS4KKyAgICAgKiBJZiBzdG9wZGlycyBqdXN0IGNvbnRhaW5zIGEgIjsiIG9yIGlzIGVtcHR5LAorICAgICAqIGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RvcGRpcnNfdiB3aWxsIG9ubHkgY29udGFpbiBhICBOVUxMIHBvaW50ZXIuIFRoaXMKKyAgICAgKiBpcyBoYW5kbGVkIGFzIHVubGltaXRlZCB1cHdhcmQgc2VhcmNoLiAgU2VlIGZ1bmN0aW9uCisgICAgICogZmZfcGF0aF9pbl9zdG9wbGlzdCgpIGZvciBkZXRhaWxzLgorICAgICAqLworICAgIGlmIChzdG9wZGlycyAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UJKndhbGtlciA9IHN0b3BkaXJzOworCWludAlkaXJjb3VudDsKKworCXdoaWxlICgqd2Fsa2VyID09ICc7JykKKwkgICAgd2Fsa2VyKys7CisKKwlkaXJjb3VudCA9IDE7CisJZmZfc2VhcmNoX2N0eC0+ZmZzY19zdG9wZGlyc192ID0KKwkgICAgKGNoYXJfdSAqKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKGNoYXJfdSAqKSk7CisKKwlpZiAoZmZfc2VhcmNoX2N0eC0+ZmZzY19zdG9wZGlyc192ICE9IE5VTEwpCisJeworCSAgICBkbworCSAgICB7CisJCWNoYXJfdQkqaGVscGVyOworCQl2b2lkCSpwdHI7CisKKwkJaGVscGVyID0gd2Fsa2VyOworCQlwdHIgPSB2aW1fcmVhbGxvYyhmZl9zZWFyY2hfY3R4LT5mZnNjX3N0b3BkaXJzX3YsCisJCQkJCSAgIChkaXJjb3VudCArIDEpICogc2l6ZW9mKGNoYXJfdSAqKSk7CisJCWlmIChwdHIpCisJCSAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0b3BkaXJzX3YgPSBwdHI7CisJCWVsc2UKKwkJICAgIC8qIGlnbm9yZSwga2VlcCB3aGF0IHdlIGhhdmUgYW5kIGNvbnRpbnVlICovCisJCSAgICBicmVhazsKKwkJd2Fsa2VyID0gdmltX3N0cmNocih3YWxrZXIsICc7Jyk7CisJCWlmICh3YWxrZXIpCisJCXsKKwkJICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RvcGRpcnNfdltkaXJjb3VudC0xXSA9CisJCQl2aW1fc3RybnNhdmUoaGVscGVyLCAoaW50KSh3YWxrZXIgLSBoZWxwZXIpKTsKKwkJICAgIHdhbGtlcisrOworCQl9CisJCWVsc2UKKwkJICAgIC8qIHRoaXMgbWlnaHQgYmUgIiIsIHdoaWNoIG1lYW5zIGFzY2VudCB0aWxsIHRvcAorCQkgICAgICogb2YgZGlyZWN0b3J5IHRyZWUuCisJCSAgICAgKi8KKwkJICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RvcGRpcnNfdltkaXJjb3VudC0xXSA9CisJCQl2aW1fc3Ryc2F2ZShoZWxwZXIpOworCisJCWRpcmNvdW50Kys7CisKKwkgICAgfSB3aGlsZSAod2Fsa2VyICE9IE5VTEwpOworCSAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0b3BkaXJzX3ZbZGlyY291bnQtMV0gPSBOVUxMOworCX0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorICAgIGZmX3NlYXJjaF9jdHgtPmZmc2NfbGV2ZWwgPSBsZXZlbDsKKworICAgIC8qIHNwbGl0IGludG86CisgICAgICogIC1maXggcGF0aAorICAgICAqICAtd2lsZGNhcmRfc3R1ZmYgKG1pZ2h0IGJlIE5VTEwpCisgICAgICovCisgICAgd2NfcGFydCA9IHZpbV9zdHJjaHIocGF0aCwgJyonKTsKKyAgICBpZiAod2NfcGFydCAhPSBOVUxMKQorICAgIHsKKwlpbnQJbGxldmVsOworCWludAlsZW47CisJY2hhcl91CSplcnJwdDsKKworCS8qIHNhdmUgdGhlIGZpeCBwYXJ0IG9mIHRoZSBwYXRoICovCisJZmZfc2VhcmNoX2N0eC0+ZmZzY19maXhfcGF0aCA9IHZpbV9zdHJuc2F2ZShwYXRoLAorCQkJCQkJICAgICAgIChpbnQpKHdjX3BhcnQgLSBwYXRoKSk7CisKKwkvKgorCSAqIGNvcHkgd2NfcGF0aCBhbmQgYWRkIHJlc3RyaWN0cyB0byB0aGUgJyoqJyB3aWxkY2FyZC4KKwkgKiBUaGUgb2N0ZXR0IGFmdGVyIGEgJyoqJyBpcyB1c2VkIGFzIGEgKGJpbmFyeSkgY291bnRlci4KKwkgKiBTbyAnKiozJyBpcyB0cmFuc3Bvc2VkIHRvICcqKl5DJyAoJ15DJyBpcyBBU0NJSSB2YWx1ZSAzKQorCSAqIG9yICcqKjc2JyBpcyB0cmFuc3Bvc2VkIHRvICcqKk4nKCAnTicgaXMgQVNDSUkgdmFsdWUgNzYpLgorCSAqIEZvciBFQkNESUMgeW91IGdldCBkaWZmZXJlbnQgY2hhcmFjdGVyIHZhbHVlcy4KKwkgKiBJZiBubyByZXN0cmljdCBpcyBnaXZlbiBhZnRlciAnKionIHRoZSBkZWZhdWx0IGlzIHVzZWQuCisJICogRHVlIHRvIHRoaXMgdGVjaG5pYyB0aGUgcGF0aCBsb29rcyBhd2Z1bCBpZiB5b3UgcHJpbnQgaXQgYXMgYQorCSAqIHN0cmluZy4KKwkgKi8KKwlsZW4gPSAwOworCXdoaWxlICgqd2NfcGFydCAhPSBOVUwpCisJeworCSAgICBpZiAoU1RSTkNNUCh3Y19wYXJ0LCAiKioiLCAyKSA9PSAwKQorCSAgICB7CisJCWZmX2V4cGFuZF9idWZmZXJbbGVuKytdID0gKndjX3BhcnQrKzsKKwkJZmZfZXhwYW5kX2J1ZmZlcltsZW4rK10gPSAqd2NfcGFydCsrOworCisJCWxsZXZlbCA9IHN0cnRvbCgoY2hhciAqKXdjX3BhcnQsIChjaGFyICoqKSZlcnJwdCwgMTApOworCQlpZiAoZXJycHQgIT0gd2NfcGFydCAmJiBsbGV2ZWwgPiAwICYmIGxsZXZlbCA8IDI1NSkKKwkJICAgIGZmX2V4cGFuZF9idWZmZXJbbGVuKytdID0gbGxldmVsOworCQllbHNlIGlmIChlcnJwdCAhPSB3Y19wYXJ0ICYmIGxsZXZlbCA9PSAwKQorCQkgICAgLyogcmVzdHJpY3QgaXMgMCAtPiByZW1vdmUgYWxyZWFkeSBhZGRlZCAnKionICovCisJCSAgICBsZW4gLT0gMjsKKwkJZWxzZQorCQkgICAgZmZfZXhwYW5kX2J1ZmZlcltsZW4rK10gPSBGRl9NQVhfU1RBUl9TVEFSX0VYUEFORDsKKwkJd2NfcGFydCA9IGVycnB0OworCQlpZiAoKndjX3BhcnQgIT0gUEFUSFNFUCAmJiAqd2NfcGFydCAhPSBOVUwpCisJCXsKKwkJICAgIEVNU0cyKF8oIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSBmb2xsb3dlZCBieSAnJXMnLiIpLCBQQVRIU0VQU1RSKTsKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCQlmZl9leHBhbmRfYnVmZmVyW2xlbisrXSA9ICp3Y19wYXJ0Kys7CisJfQorCWZmX2V4cGFuZF9idWZmZXJbbGVuXSA9IE5VTDsKKwlmZl9zZWFyY2hfY3R4LT5mZnNjX3djX3BhdGggPQorCSAgICB2aW1fc3Ryc2F2ZShmZl9leHBhbmRfYnVmZmVyKTsKKworCWlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX3djX3BhdGggPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWZmX3NlYXJjaF9jdHgtPmZmc2NfZml4X3BhdGggPSB2aW1fc3Ryc2F2ZShwYXRoKTsKKworICAgIGlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpciA9PSBOVUxMKQorICAgIHsKKwkvKiBzdG9yZSB0aGUgZml4IHBhcnQgYXMgc3RhcnRkaXIuCisJICogVGhpcyBpcyBuZWVkZWQgaWYgdGhlIHBhcmFtZXRlciBwYXRoIGlzIGZ1bGx5IHF1YWxpZmllZC4KKwkgKi8KKwlmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpciA9IHZpbV9zdHJzYXZlKGZmX3NlYXJjaF9jdHgtPmZmc2NfZml4X3BhdGgpOworCWlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpcikKKwkgICAgZmZfc2VhcmNoX2N0eC0+ZmZzY19maXhfcGF0aFswXSA9IE5VTDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYW4gYWJzb2x1dGUgcGF0aCAqLworICAgIFNUUkNQWShmZl9leHBhbmRfYnVmZmVyLCBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2Rpcik7CisgICAgYWRkX3BhdGhzZXAoZmZfZXhwYW5kX2J1ZmZlcik7CisgICAgU1RSQ0FUKGZmX2V4cGFuZF9idWZmZXIsIGZmX3NlYXJjaF9jdHgtPmZmc2NfZml4X3BhdGgpOworICAgIGFkZF9wYXRoc2VwKGZmX2V4cGFuZF9idWZmZXIpOworCisgICAgc3B0ciA9IGZmX2NyZWF0ZV9zdGFja19lbGVtZW50KGZmX2V4cGFuZF9idWZmZXIsCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfd2NfcGF0aCwKKyNlbmRpZgorCSAgICBsZXZlbCwgMCk7CisKKyAgICBpZiAoc3B0ciA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgZmZfcHVzaChzcHRyKTsKKworICAgIGZmX3NlYXJjaF9jdHgtPmZmc2NfZmlsZV90b19zZWFyY2ggPSB2aW1fc3Ryc2F2ZShmaWxlbmFtZSk7CisgICAgaWYgKGZmX3NlYXJjaF9jdHgtPmZmc2NfZmlsZV90b19zZWFyY2ggPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgIHJldHVybiBmZl9zZWFyY2hfY3R4OworCitlcnJvcl9yZXR1cm46CisgICAgLyoKKyAgICAgKiBXZSBjbGVhciB0aGUgc2VhcmNoIGNvbnRleHQgbm93IQorICAgICAqIEV2ZW4gd2hlbiB0aGUgY2FsbGVyIGdhdmUgdXMgYSAocGVyaGFwcyB2YWxpZCkgY29udGV4dCB3ZSBmcmVlIGl0IGhlcmUsCisgICAgICogYXMgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRlc3Ryb3llZCBpdC4KKyAgICAgKi8KKyAgICB2aW1fZmluZGZpbGVfY2xlYW51cChmZl9zZWFyY2hfY3R4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9QQVRIX0VYVFJBKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdldCB0aGUgc3RvcGRpciBzdHJpbmcuICBDaGVjayB0aGF0ICc7JyBpcyBub3QgZXNjYXBlZC4KKyAqLworICAgIGNoYXJfdSAqCit2aW1fZmluZGZpbGVfc3RvcGRpcihidWYpCisgICAgY2hhcl91CSpidWY7Cit7CisgICAgY2hhcl91CSpyX3B0ciA9IGJ1ZjsKKworICAgIHdoaWxlICgqcl9wdHIgIT0gTlVMICYmICpyX3B0ciAhPSAnOycpCisgICAgeworCWlmIChyX3B0clswXSA9PSAnXFwnICYmIHJfcHRyWzFdID09ICc7JykKKwl7CisJICAgIC8qIG92ZXJ3cml0ZSB0aGUgZXNjYXBlIGNoYXIsCisJICAgICAqIHVzZSBTVFJMRU4ocl9wdHIpIHRvIG1vdmUgdGhlIHRyYWlsaW5nICdcMCcKKwkgICAgICovCisJICAgIG1jaF9tZW1tb3ZlKHJfcHRyLCByX3B0ciArIDEsIFNUUkxFTihyX3B0cikpOworCSAgICByX3B0cisrOworCX0KKwlyX3B0cisrOworICAgIH0KKyAgICBpZiAoKnJfcHRyID09ICc7JykKKyAgICB7CisJKnJfcHRyID0gMDsKKwlyX3B0cisrOworICAgIH0KKyAgICBlbHNlIGlmICgqcl9wdHIgPT0gTlVMKQorCXJfcHRyID0gTlVMTDsKKyAgICByZXR1cm4gcl9wdHI7Cit9CisjZW5kaWYKKworLyogQ2xlYW4gdXAgdGhlIGdpdmVuIHNlYXJjaCBjb250ZXh0LiBDYW4gaGFuZGxlIGEgTlVMTCBwb2ludGVyICovCisgICAgdm9pZAordmltX2ZpbmRmaWxlX2NsZWFudXAoY3R4KQorICAgIHZvaWQJKmN0eDsKK3sKKyAgICBpZiAoTlVMTCA9PSBjdHgpCisJcmV0dXJuOworCisgICAgZmZfc2VhcmNoX2N0eCA9IGN0eDsKKworICAgIHZpbV9maW5kZmlsZV9mcmVlX3Zpc2l0ZWQoY3R4KTsKKyAgICBmZl9jbGVhcigpOworICAgIHZpbV9mcmVlKGN0eCk7CisgICAgZmZfc2VhcmNoX2N0eCA9IE5VTEw7Cit9CisKKy8qCisgKiBGaW5kIGEgZmlsZSBpbiBhIHNlYXJjaCBjb250ZXh0LgorICogVGhlIHNlYXJjaCBjb250ZXh0IHdhcyBjcmVhdGVkIHdpdGggdmltX2ZpbmRmaWxlX2luaXQoKSBhYm92ZS4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGZpbGUgbmFtZSBvciBOVUxMIGlmIG5vdGhpbmcgZm91bmQuCisgKiBUbyBnZXQgYWxsIG1hdGNoaW5nIGZpbGVzIGNhbGwgdGhpcyBmdW5jdGlvbiB1bnRpbCB5b3UgZ2V0IE5VTEwuCisgKgorICogSWYgdGhlIHBhc3NlZCBzZWFyY2hfY29udGV4dCBpcyBOVUxMLCBpdCB0aGUgcmV0dXJucyBOVUxMLgorICoKKyAqIFRoZSBzZWFyY2ggYWxnb3JpdGhtIGlzIGRlcHRoIGZpcnN0LiBUbyBjaGFuZ2UgdGhpcyByZXBsYWNlIHRoZQorICogc3RhY2sgd2l0aCBhIGxpc3QgKGRvbid0IGZvcmdldCB0byBsZWF2ZSBwYXJ0bHkgc2VhcmNoZWQgZGlyZWN0b3JpZXMgb24gdGhlCisgKiB0b3Agb2YgdGhlIGxpc3QpLgorICovCisgICAgY2hhcl91ICoKK3ZpbV9maW5kZmlsZShzZWFyY2hfY3R4KQorICAgIHZvaWQJKnNlYXJjaF9jdHg7Cit7CisgICAgY2hhcl91CSpmaWxlX3BhdGg7CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgY2hhcl91CSpyZXN0X29mX3dpbGRjYXJkczsKKyAgICBjaGFyX3UJKnBhdGhfZW5kID0gTlVMTDsKKyNlbmRpZgorICAgIGZmX3N0YWNrX1QJKmN0eDsKKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIUEFUSCkgfHwgZGVmaW5lZChGRUFUX1BBVEhfRVhUUkEpCisgICAgaW50CQlsZW47CisjZW5kaWYKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpwOworI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorICAgIGNoYXJfdQkqc3VmOworI2VuZGlmCisKKyAgICBpZiAoc2VhcmNoX2N0eCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZmZfc2VhcmNoX2N0eCA9IChmZl9zZWFyY2hfY3R4X1QqKXNlYXJjaF9jdHg7CisKKyAgICAvKgorICAgICAqIGZpbGVwYXRoIGlzIHVzZWQgYXMgYnVmZmVyIGZvciB2YXJpb3VzIGFjdGlvbnMgYW5kIGFzIHRoZSBzdG9yYWdlIHRvCisgICAgICogcmV0dXJuIGEgZm91bmQgZmlsZW5hbWUuCisgICAgICovCisgICAgaWYgKChmaWxlX3BhdGggPSBhbGxvYygoaW50KU1BWFBBVEhMKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorICAgIC8qIHN0b3JlIHRoZSBlbmQgb2YgdGhlIHN0YXJ0IGRpciAtLSBuZWVkZWQgZm9yIHVwd2FyZCBzZWFyY2ggKi8KKyAgICBpZiAoZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIgIT0gTlVMTCkKKwlwYXRoX2VuZCA9ICZmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpcltTVFJMRU4oZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIpXTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgLyogdXB3YXJkIHNlYXJjaCBsb29wICovCisgICAgZm9yICg7OykKKyAgICB7CisjZW5kaWYKKwkvKiBkb3dud2FyZCBzZWFyY2ggbG9vcCAqLworCWZvciAoOzspCisJeworCSAgICAvKiBjaGVjayBpZiB1c2VyIHVzZXIgd2FudHMgdG8gc3RvcCB0aGUgc2VhcmNoKi8KKwkgICAgdWlfYnJlYWtjaGVjaygpOworCSAgICBpZiAoZ290X2ludCkKKwkJYnJlYWs7CisKKwkgICAgLyogZ2V0IGRpcmVjdG9yeSB0byB3b3JrIG9uIGZyb20gc3RhY2sgKi8KKwkgICAgY3R4ID0gZmZfcG9wKCk7CisJICAgIGlmIChjdHggPT0gTlVMTCkKKwkJYnJlYWs7CisKKwkgICAgLyoKKwkgICAgICogVE9ETzogZGVjaWRlIGlmIHdlIGxlYXZlIHRoaXMgdGVzdCBpbgorCSAgICAgKgorCSAgICAgKiBHT09EOiBkb24ndCBzZWFyY2ggYSBkaXJlY3RvcnkoLXRyZWUpIHR3aWNlLgorCSAgICAgKiBCQUQ6ICAtIGNoZWNrIGxpbmtlZCBsaXN0IGZvciBldmVyeSBuZXcgZGlyZWN0b3J5IGVudGVyZWQuCisJICAgICAqICAgICAgIC0gY2hlY2sgZm9yIGRvdWJsZSBmaWxlcyBhbHNvIGRvbmUgYmVsb3cKKwkgICAgICoKKwkgICAgICogSGVyZSB3ZSBjaGVjayBpZiB3ZSBhbHJlYWR5IHNlYXJjaGVkIHRoaXMgZGlyZWN0b3J5LgorCSAgICAgKiBXZSBhbHJlYWR5IHNlYXJjaGVkIGEgZGlyZWN0b3J5IGlmOgorCSAgICAgKiAxKSBUaGUgZGlyZWN0b3J5IGlzIHRoZSBzYW1lLgorCSAgICAgKiAyKSBXZSB3b3VsZCB1c2UgdGhlIHNhbWUgd2lsZGNhcmQgc3RyaW5nLgorCSAgICAgKgorCSAgICAgKiBHb29kIGlmIHlvdSBoYXZlIGxpbmtzIG9uIHNhbWUgZGlyZWN0b3J5IHZpYSBzZXZlcmFsIHdheXMKKwkgICAgICogIG9yIHlvdSBoYXZlIHNlbGZyZWZlcmVuY2VzIGluIGRpcmVjdG9yaWVzIChlLmcuIFN1U0UgTGludXggNi4zOgorCSAgICAgKiAgL2V0Yy9yYy5kL2luaXQuZCBpcyBsaW5rZWQgdG8gL2V0Yy9yYy5kIC0+IGVuZGxlc3MgbG9vcCkKKwkgICAgICoKKwkgICAgICogVGhpcyBjaGVjayBpcyBvbmx5IG5lZWRlZCBmb3IgZGlyZWN0b3JpZXMgd2Ugd29yayBvbiBmb3IgdGhlCisJICAgICAqIGZpcnN0IHRpbWUgKGhlbmNlIGN0eC0+ZmZfZmlsZWFycmF5ID09IE5VTEwpCisJICAgICAqLworCSAgICBpZiAoY3R4LT5mZnNfZmlsZWFycmF5ID09IE5VTEwKKwkJICAgICYmIGZmX2NoZWNrX3Zpc2l0ZWQoJmZmX3NlYXJjaF9jdHgtPmZmc2NfZGlyX3Zpc2l0ZWRfbGlzdAorCQkJCQkJCSAgLT5mZnZsX3Zpc2l0ZWRfbGlzdCwKKwkJCWN0eC0+ZmZzX2ZpeF9wYXRoCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJCQksIGN0eC0+ZmZzX3djX3BhdGgKKyNlbmRpZgorCQkJKSA9PSBGQUlMKQorCSAgICB7CisjaWZkZWYgRkZfVkVSQk9TRQorCQlpZiAocF92ZXJib3NlID49IDUpCisJCXsKKwkJICAgIC8qIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZSAqLworCQkgICAgbXNnX3Njcm9sbCA9IFRSVUU7CisJCSAgICBzbXNnKChjaGFyX3UgKikiQWxyZWFkeSBTZWFyY2hlZDogJXMgKCVzKSIsCisJCQkJCSAgIGN0eC0+ZmZzX2ZpeF9wYXRoLCBjdHgtPmZmc193Y19wYXRoKTsKKwkJICAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworCQkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOworCQkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93OworCQl9CisjZW5kaWYKKwkJZmZfZnJlZV9zdGFja19lbGVtZW50KGN0eCk7CisJCWNvbnRpbnVlOworCSAgICB9CisjaWZkZWYgRkZfVkVSQk9TRQorCSAgICBlbHNlIGlmIChwX3ZlcmJvc2UgPj0gNSkKKwkgICAgeworCQkvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwkJbXNnX3Njcm9sbCA9IFRSVUU7CisJCXNtc2coKGNoYXJfdSAqKSJTZWFyY2hpbmc6ICVzICglcykiLCBjdHgtPmZmc19maXhfcGF0aCwKKwkJCWN0eC0+ZmZzX3djX3BhdGgpOworCQkvKiBkb24ndCBvdmVyd3JpdGUgdGhpcyBlaXRoZXIgKi8KKwkJbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOworCQljbWRsaW5lX3JvdyA9IG1zZ19yb3c7CisJICAgIH0KKyNlbmRpZgorCisJICAgIC8qIGNoZWNrIGRlcHRoICovCisJICAgIGlmIChjdHgtPmZmc19sZXZlbCA8PSAwKQorCSAgICB7CisJCWZmX2ZyZWVfc3RhY2tfZWxlbWVudChjdHgpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIGZpbGVfcGF0aFswXSA9IE5VTDsKKworCSAgICAvKgorCSAgICAgKiBJZiBubyBmaWxlYXJyYXkgdGlsbCBub3cgZXhwYW5kIHdpbGRjYXJkcworCSAgICAgKiBUaGUgZnVuY3Rpb24gZXhwYW5kX3dpbGRjYXJkcygpIGNhbiBoYW5kbGUgYW4gYXJyYXkgb2YgcGF0aHMKKwkgICAgICogYW5kIGFsbCBwb3NzaWJsZSBleHBhbmRzIGFyZSByZXR1cm5lZCBpbiBvbmUgYXJyYXkuIFdlIHVzZSB0aGlzCisJICAgICAqIHRvIGhhbmRsZSB0aGUgZXhwYW5zaW9uIG9mICcqKicgaW50byBhbiBlbXB0eSBzdHJpbmcuCisJICAgICAqLworCSAgICBpZiAoY3R4LT5mZnNfZmlsZWFycmF5ID09IE5VTEwpCisJICAgIHsKKwkJY2hhcl91ICpkaXJwdHJzWzJdOworCisJCS8qIHdlIHVzZSBmaWxlcGF0aCB0byBidWlsZCB0aGUgcGF0aCBleHBhbmRfd2lsZGNhcmRzKCkgc2hvdWxkCisJCSAqIGV4cGFuZC4KKwkJICovCisJCWRpcnB0cnNbMF0gPSBmaWxlX3BhdGg7CisJCWRpcnB0cnNbMV0gPSBOVUxMOworCisJCS8qIGlmIHdlIGhhdmUgYSBzdGFydCBkaXIgY29weSBpdCBpbiAqLworCQlpZiAoIXZpbV9pc0Fic05hbWUoY3R4LT5mZnNfZml4X3BhdGgpCisJCQkmJiBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpcikKKwkJeworCQkgICAgU1RSQ1BZKGZpbGVfcGF0aCwgZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIpOworCQkgICAgYWRkX3BhdGhzZXAoZmlsZV9wYXRoKTsKKwkJfQorCisJCS8qIGFwcGVuZCB0aGUgZml4IHBhcnQgb2YgdGhlIHNlYXJjaCBwYXRoICovCisJCVNUUkNBVChmaWxlX3BhdGgsIGN0eC0+ZmZzX2ZpeF9wYXRoKTsKKwkJYWRkX3BhdGhzZXAoZmlsZV9wYXRoKTsKKworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCQlyZXN0X29mX3dpbGRjYXJkcyA9IGN0eC0+ZmZzX3djX3BhdGg7CisJCWlmICgqcmVzdF9vZl93aWxkY2FyZHMgIT0gTlVMKQorCQl7CisJCSAgICBsZW4gPSAoaW50KVNUUkxFTihmaWxlX3BhdGgpOworCQkgICAgaWYgKFNUUk5DTVAocmVzdF9vZl93aWxkY2FyZHMsICIqKiIsIDIpID09IDApCisJCSAgICB7CisJCQkvKiBwb2ludGVyIHRvIHRoZSByZXN0cmljdCBieXRlCisJCQkgKiBUaGUgcmVzdHJpY3QgYnl0ZSBpcyBub3QgYSBjaGFyYWN0ZXIhCisJCQkgKi8KKwkJCXAgPSByZXN0X29mX3dpbGRjYXJkcyArIDI7CisKKwkJCWlmICgqcCA+IDApCisJCQl7CisJCQkgICAgKCpwKS0tOworCQkJICAgIGZpbGVfcGF0aFtsZW4rK10gPSAnKic7CisJCQl9CisKKwkJCWlmICgqcCA9PSAwKQorCQkJeworCQkJICAgIC8qIHJlbW92ZSAnKio8bnVtYj4gZnJvbSB3aWxkY2FyZHMgKi8KKwkJCSAgICBtY2hfbWVtbW92ZShyZXN0X29mX3dpbGRjYXJkcywKKwkJCQkgICAgcmVzdF9vZl93aWxkY2FyZHMgKyAzLAorCQkJCSAgICBTVFJMRU4ocmVzdF9vZl93aWxkY2FyZHMgKyAzKSArIDEpOworCQkJfQorCQkJZWxzZQorCQkJICAgIHJlc3Rfb2Zfd2lsZGNhcmRzICs9IDM7CisKKwkJCWlmIChjdHgtPmZmc19zdGFyX3N0YXJfZW1wdHkgPT0gMCkKKwkJCXsKKwkJCSAgICAvKiBpZiBub3QgZG9uZSBiZWZvcmUsIGV4cGFuZCAnKionIHRvIGVtcHR5ICovCisJCQkgICAgY3R4LT5mZnNfc3Rhcl9zdGFyX2VtcHR5ID0gMTsKKwkJCSAgICBkaXJwdHJzWzFdID0gY3R4LT5mZnNfZml4X3BhdGg7CisJCQl9CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBIZXJlIHdlIGNvcHkgdW50aWwgdGhlIG5leHQgcGF0aCBzZXBhcmF0b3Igb3IgdGhlIGVuZCBvZgorCQkgICAgICogdGhlIHBhdGguIElmIHdlIHN0b3AgYXQgYSBwYXRoIHNlcGFyYXRvciwgdGhlcmUgaXMKKwkJICAgICAqIHN0aWxsIHNvbXRoaW5nIGVsc2UgbGVmdC4gVGhpcyBpcyBoYW5kbGVkIGJlbG93IGJ5CisJCSAgICAgKiBwdXNoaW5nIGV2ZXJ5IGRpcmVjdG9yeSByZXR1cm5lZCBmcm9tIGV4cGFuZF93aWxkY2FyZHMoKQorCQkgICAgICogb24gdGhlIHN0YWNrIGFnYWluIGZvciBmdXJ0aGVyIHNlYXJjaC4KKwkJICAgICAqLworCQkgICAgd2hpbGUgKCpyZXN0X29mX3dpbGRjYXJkcworCQkJICAgICYmICF2aW1faXNwYXRoc2VwKCpyZXN0X29mX3dpbGRjYXJkcykpCisJCQlmaWxlX3BhdGhbbGVuKytdID0gKnJlc3Rfb2Zfd2lsZGNhcmRzKys7CisKKwkJICAgIGZpbGVfcGF0aFtsZW5dID0gTlVMOworCQkgICAgaWYgKHZpbV9pc3BhdGhzZXAoKnJlc3Rfb2Zfd2lsZGNhcmRzKSkKKwkJCXJlc3Rfb2Zfd2lsZGNhcmRzKys7CisJCX0KKyNlbmRpZgorCisJCS8qCisJCSAqIEV4cGFuZCB3aWxkY2FyZHMgbGlrZSAiKiIgYW5kICIkVkFSIi4KKwkJICogSWYgdGhlIHBhdGggaXMgYSBVUkwgZG9uJ3QgdHJ5IHRoaXMuCisJCSAqLworCQlpZiAocGF0aF93aXRoX3VybChkaXJwdHJzWzBdKSkKKwkJeworCQkgICAgY3R4LT5mZnNfZmlsZWFycmF5ID0gKGNoYXJfdSAqKikKKwkJCQkJICAgICAgYWxsb2MoKHVuc2lnbmVkKXNpemVvZihjaGFyICopKTsKKwkJICAgIGlmIChjdHgtPmZmc19maWxlYXJyYXkgIT0gTlVMTAorCQkJICAgICYmIChjdHgtPmZmc19maWxlYXJyYXlbMF0KKwkJCQk9IHZpbV9zdHJzYXZlKGRpcnB0cnNbMF0pKSAhPSBOVUxMKQorCQkJY3R4LT5mZnNfZmlsZWFycmF5X3NpemUgPSAxOworCQkgICAgZWxzZQorCQkJY3R4LT5mZnNfZmlsZWFycmF5X3NpemUgPSAwOworCQl9CisJCWVsc2UKKwkJICAgIGV4cGFuZF93aWxkY2FyZHMoKGRpcnB0cnNbMV0gPT0gTlVMTCkgPyAxIDogMiwgZGlycHRycywKKwkJCSAgICAmY3R4LT5mZnNfZmlsZWFycmF5X3NpemUsCisJCQkgICAgJmN0eC0+ZmZzX2ZpbGVhcnJheSwKKwkJCSAgICBFV19ESVJ8RVdfQUREU0xBU0h8RVdfU0lMRU5UKTsKKworCQljdHgtPmZmc19maWxlYXJyYXlfY3VyID0gMDsKKwkJY3R4LT5mZnNfc3RhZ2UgPSAwOworCSAgICB9CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJICAgIGVsc2UKKwkJcmVzdF9vZl93aWxkY2FyZHMgPSAmY3R4LT5mZnNfd2NfcGF0aFtTVFJMRU4oY3R4LT5mZnNfd2NfcGF0aCldOworI2VuZGlmCisKKwkgICAgaWYgKGN0eC0+ZmZzX3N0YWdlID09IDApCisJICAgIHsKKwkJLyogdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSB3b3JrIG9uIHRoaXMgZGlyZWN0b3J5ICovCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJCWlmICgqcmVzdF9vZl93aWxkY2FyZHMgPT0gTlVMKQorI2VuZGlmCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiB3ZSBkb24ndCBoYXZlIGZ1cnRoZXIgd2lsZGNhcmRzIHRvIGV4cGFuZCwgc28gd2UgaGF2ZSB0bworCQkgICAgICogY2hlY2sgZm9yIHRoZSBmaW5hbCBmaWxlIG5vdworCQkgICAgICovCisJCSAgICBmb3IgKGkgPSBjdHgtPmZmc19maWxlYXJyYXlfY3VyOworCQkJCQkgICAgIGkgPCBjdHgtPmZmc19maWxlYXJyYXlfc2l6ZTsgKytpKQorCQkgICAgeworCQkJaWYgKCFwYXRoX3dpdGhfdXJsKGN0eC0+ZmZzX2ZpbGVhcnJheVtpXSkKKwkJCQkJICYmICFtY2hfaXNkaXIoY3R4LT5mZnNfZmlsZWFycmF5W2ldKSkKKwkJCSAgICBjb250aW51ZTsgICAvKiBub3QgYSBkaXJlY3RvcnkgKi8KKworCQkJLyogcHJlcGFyZSB0aGUgZmlsZW5hbWUgdG8gYmUgY2hlY2tlZCBmb3IgZXhpc3RhbmNlCisJCQkgKiBiZWxvdyAqLworCQkJU1RSQ1BZKGZpbGVfcGF0aCwgY3R4LT5mZnNfZmlsZWFycmF5W2ldKTsKKwkJCWFkZF9wYXRoc2VwKGZpbGVfcGF0aCk7CisJCQlTVFJDQVQoZmlsZV9wYXRoLCBmZl9zZWFyY2hfY3R4LT5mZnNjX2ZpbGVfdG9fc2VhcmNoKTsKKworCQkJLyoKKwkJCSAqIFRyeSB3aXRob3V0IGV4dHJhIHN1ZmZpeCBhbmQgdGhlbiB3aXRoIHN1ZmZpeGVzCisJCQkgKiBmcm9tICdzdWZmaXhlc2FkZCcuCisJCQkgKi8KKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKwkJCWxlbiA9IChpbnQpU1RSTEVOKGZpbGVfcGF0aCk7CisJCQlzdWYgPSBjdXJidWYtPmJfcF9zdWE7CisJCQlmb3IgKDs7KQorI2VuZGlmCisJCQl7CisJCQkgICAgLyogaWYgZmlsZSBleGlzdHMgYW5kIHdlIGRpZG4ndCBhbHJlYWR5IGZpbmQgaXQgKi8KKwkJCSAgICBpZiAoKHBhdGhfd2l0aF91cmwoZmlsZV9wYXRoKQorCQkJCQl8fCAobWNoX2dldHBlcm0oZmlsZV9wYXRoKSA+PSAwCisJCQkJCSAgICAmJiAoIWZmX3NlYXJjaF9jdHgtPmZmc2NfbmVlZF9kaXIKKwkJCQkJCXx8IG1jaF9pc2RpcihmaWxlX3BhdGgpKSkpCisjaWZuZGVmIEZGX1ZFUkJPU0UKKwkJCQkgICAgJiYgKGZmX2NoZWNrX3Zpc2l0ZWQoCisJCQkJCSAgICAmZmZfc2VhcmNoX2N0eC0+ZmZzY192aXNpdGVkX2xpc3QtPmZmdmxfdmlzaXRlZF9saXN0LAorCQkJCQkgICAgZmlsZV9wYXRoCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJCQkJCSAgICAsIChjaGFyX3UgKikiIgorI2VuZGlmCisJCQkJCSAgICApID09IE9LKQorI2VuZGlmCisJCQkgICAgICAgKQorCQkJICAgIHsKKyNpZmRlZiBGRl9WRVJCT1NFCisJCQkJaWYgKGZmX2NoZWNrX3Zpc2l0ZWQoCisJCQkJCSAgICAmZmZfc2VhcmNoX2N0eC0+ZmZzY192aXNpdGVkX2xpc3QtPmZmdmxfdmlzaXRlZF9saXN0LAorCQkJCQkgICAgZmlsZV9wYXRoCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJCQkJCSAgICAsIChjaGFyX3UgKikiIgorI2VuZGlmCisJCQkJCQkgICAgKSA9PSBGQUlMKQorCQkJCXsKKwkJCQkgICAgaWYgKHBfdmVyYm9zZSA+PSA1KQorCQkJCSAgICB7CisJCQkJCS8qIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZSAqLworCQkJCQltc2dfc2Nyb2xsID0gVFJVRTsKKwkJCQkJbXNnX3N0cigoY2hhcl91ICopIkFscmVhZHk6ICVzIiwKKwkJCQkJCQkJICAgZmlsZV9wYXRoKTsKKwkJCQkJLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgZWl0aGVyICovCisJCQkJCW1zZ19wdXRzKChjaGFyX3UgKikiXG4iKTsKKwkJCQkJY21kbGluZV9yb3cgPSBtc2dfcm93OworCQkJCSAgICB9CisJCQkJICAgIGNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCisJCQkJLyogcHVzaCBkaXIgdG8gZXhhbWluZSByZXN0IG9mIHN1YmRpcnMgbGF0ZXIgKi8KKwkJCQljdHgtPmZmc19maWxlYXJyYXlfY3VyID0gaSArIDE7CisJCQkJZmZfcHVzaChjdHgpOworCisJCQkJc2ltcGxpZnlfZmlsZW5hbWUoZmlsZV9wYXRoKTsKKwkJCQlpZiAobWNoX2Rpcm5hbWUoZmZfZXhwYW5kX2J1ZmZlciwgTUFYUEFUSEwpCisJCQkJCQkJCQk9PSBPSykKKwkJCQl7CisJCQkJICAgIHAgPSBzaG9ydGVuX2ZuYW1lKGZpbGVfcGF0aCwKKwkJCQkJCQkgICAgZmZfZXhwYW5kX2J1ZmZlcik7CisJCQkJICAgIGlmIChwICE9IE5VTEwpCisJCQkJCW1jaF9tZW1tb3ZlKGZpbGVfcGF0aCwgcCwKKwkJCQkJCQkgICAgICAgU1RSTEVOKHApICsgMSk7CisJCQkJfQorI2lmZGVmIEZGX1ZFUkJPU0UKKwkJCQlpZiAocF92ZXJib3NlID49IDUpCisJCQkJeworCQkJCSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwkJCQkgICAgbXNnX3Njcm9sbCA9IFRSVUU7CisJCQkJICAgIG1zZ19zdHIoKGNoYXJfdSAqKSJISVQ6ICVzIiwgZmlsZV9wYXRoKTsKKwkJCQkgICAgLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgZWl0aGVyICovCisJCQkJICAgIG1zZ19wdXRzKChjaGFyX3UgKikiXG4iKTsKKwkJCQkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93OworCQkJCX0KKyNlbmRpZgorCQkJCXJldHVybiBmaWxlX3BhdGg7CisJCQkgICAgfQorCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisJCQkgICAgLyogTm90IGZvdW5kIG9yIGZvdW5kIGFscmVhZHksIHRyeSBuZXh0IHN1ZmZpeC4gKi8KKwkJCSAgICBpZiAoKnN1ZiA9PSBOVUwpCisJCQkJYnJlYWs7CisJCQkgICAgY29weV9vcHRpb25fcGFydCgmc3VmLCBmaWxlX3BhdGggKyBsZW4sCisJCQkJCQkJIE1BWFBBVEhMIC0gbGVuLCAiLCIpOworI2VuZGlmCisJCQl9CisJCSAgICB9CisJCX0KKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogc3RpbGwgd2lsZGNhcmRzIGxlZnQsIHB1c2ggdGhlIGRpcmVjdG9yaWVzIGZvciBmdXJ0aGVyCisJCSAgICAgKiBzZWFyY2gKKwkJICAgICAqLworCQkgICAgZm9yIChpID0gY3R4LT5mZnNfZmlsZWFycmF5X2N1cjsgaSA8IGN0eC0+ZmZzX2ZpbGVhcnJheV9zaXplOworCQkJCQkJCQkJICArK2kpCisJCSAgICB7CisJCQlpZiAoIW1jaF9pc2RpcihjdHgtPmZmc19maWxlYXJyYXlbaV0pKQorCQkJICAgIGNvbnRpbnVlOwkvKiBub3QgYSBkaXJlY3RvcnkgKi8KKworCQkJZmZfcHVzaChmZl9jcmVhdGVfc3RhY2tfZWxlbWVudChjdHgtPmZmc19maWxlYXJyYXlbaV0sCisJCQkJICAgICAgcmVzdF9vZl93aWxkY2FyZHMsIGN0eC0+ZmZzX2xldmVsIC0gMSwgMCkpOworCQkgICAgfQorCQl9CisjZW5kaWYKKwkJY3R4LT5mZnNfZmlsZWFycmF5X2N1ciA9IDA7CisJCWN0eC0+ZmZzX3N0YWdlID0gMTsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJICAgIC8qCisJICAgICAqIGlmIHdpbGRjYXJkcyBjb250YWlucyAnKionIHdlIGhhdmUgdG8gZGVzY2VudCB0aWxsIHdlIHJlYWNoIHRoZQorCSAgICAgKiBsZWF2ZXMgb2YgdGhlIGRpcmVjdG9yeSB0cmVlLgorCSAgICAgKi8KKwkgICAgaWYgKFNUUk5DTVAoY3R4LT5mZnNfd2NfcGF0aCwgIioqIiwgMikgPT0gMCkKKwkgICAgeworCQlmb3IgKGkgPSBjdHgtPmZmc19maWxlYXJyYXlfY3VyOyBpIDwgY3R4LT5mZnNfZmlsZWFycmF5X3NpemU7ICsraSkKKwkJeworCQkgICAgaWYgKGZuYW1lY21wKGN0eC0+ZmZzX2ZpbGVhcnJheVtpXSwgY3R4LT5mZnNfZml4X3BhdGgpID09IDApCisJCQljb250aW51ZTsgLyogZG9uJ3QgcmVwdXNoIHNhbWUgZGlyZWN0b3J5ICovCisJCSAgICBpZiAoIW1jaF9pc2RpcihjdHgtPmZmc19maWxlYXJyYXlbaV0pKQorCQkJY29udGludWU7ICAgLyogbm90IGEgZGlyZWN0b3J5ICovCisJCSAgICBmZl9wdXNoKGZmX2NyZWF0ZV9zdGFja19lbGVtZW50KGN0eC0+ZmZzX2ZpbGVhcnJheVtpXSwKKwkJCQljdHgtPmZmc193Y19wYXRoLCBjdHgtPmZmc19sZXZlbCAtIDEsIDEpKTsKKwkJfQorCSAgICB9CisjZW5kaWYKKworCSAgICAvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworCSAgICBmZl9mcmVlX3N0YWNrX2VsZW1lbnQoY3R4KTsKKworCX0KKworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCS8qIElmIHdlIHJlYWNoZWQgdGhpcywgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgZG93bndhcmRzLgorCSAqIExldCdzIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhbiB1cHdhcmQgc2VhcmNoLgorCSAqLworCWlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpcgorCQkmJiBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0b3BkaXJzX3YgIT0gTlVMTCAmJiAhZ290X2ludCkKKwl7CisJICAgIGZmX3N0YWNrX1QgICpzcHRyOworCisJICAgIC8qIGlzIHRoZSBsYXN0IHN0YXJ0aW5nIGRpcmVjdG9yeSBpbiB0aGUgc3RvcCBsaXN0PyAqLworCSAgICBpZiAoZmZfcGF0aF9pbl9zdG9wbGlzdChmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpciwKKwkJICAgICAgIChpbnQpKHBhdGhfZW5kIC0gZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIpLAorCQkgICAgICAgZmZfc2VhcmNoX2N0eC0+ZmZzY19zdG9wZGlyc192KSA9PSBUUlVFKQorCQlicmVhazsKKworCSAgICAvKiBjdXQgb2YgbGFzdCBkaXIgKi8KKwkgICAgd2hpbGUgKHBhdGhfZW5kID4gZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIKKwkJICAgICYmICpwYXRoX2VuZCA9PSBQQVRIU0VQKQorCQlwYXRoX2VuZC0tOworCSAgICB3aGlsZSAocGF0aF9lbmQgPiBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2RpcgorCQkgICAgJiYgKihwYXRoX2VuZC0xKSAhPSBQQVRIU0VQKQorCQlwYXRoX2VuZC0tOworCSAgICAqcGF0aF9lbmQgPSAwOworCSAgICBwYXRoX2VuZC0tOworCisJICAgIGlmICgqZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIgPT0gMCkKKwkJYnJlYWs7CisKKwkgICAgU1RSQ1BZKGZpbGVfcGF0aCwgZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFydF9kaXIpOworCSAgICBhZGRfcGF0aHNlcChmaWxlX3BhdGgpOworCSAgICBTVFJDQVQoZmlsZV9wYXRoLCBmZl9zZWFyY2hfY3R4LT5mZnNjX2ZpeF9wYXRoKTsKKworCSAgICAvKiBjcmVhdGUgYSBuZXcgc3RhY2sgZW50cnkgKi8KKwkgICAgc3B0ciA9IGZmX2NyZWF0ZV9zdGFja19lbGVtZW50KGZpbGVfcGF0aCwKKwkJICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfd2NfcGF0aCwgZmZfc2VhcmNoX2N0eC0+ZmZzY19sZXZlbCwgMCk7CisJICAgIGlmIChzcHRyID09IE5VTEwpCisJCWJyZWFrOworCSAgICBmZl9wdXNoKHNwdHIpOworCX0KKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgdmltX2ZyZWUoZmlsZV9wYXRoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZyZWUgdGhlIGxpc3Qgb2YgbGlzdHMgb2YgdmlzaXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAqIENhbiBoYW5kbGUgaXQgaWYgdGhlIHBhc3NlZCBzZWFyY2hfY29udGV4dCBpcyBOVUxMOworICovCisgICAgdm9pZAordmltX2ZpbmRmaWxlX2ZyZWVfdmlzaXRlZChzZWFyY2hfY3R4KQorICAgIHZvaWQJKnNlYXJjaF9jdHg7Cit7CisgICAgaWYgKHNlYXJjaF9jdHggPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBmZl9zZWFyY2hfY3R4ID0gKGZmX3NlYXJjaF9jdHhfVCAqKXNlYXJjaF9jdHg7CisKKyAgICB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkX2xpc3QoJmZmX3NlYXJjaF9jdHgtPmZmc2NfdmlzaXRlZF9saXN0c19saXN0KTsKKyAgICB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkX2xpc3QoJmZmX3NlYXJjaF9jdHgtPmZmc2NfZGlyX3Zpc2l0ZWRfbGlzdHNfbGlzdCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordmltX2ZpbmRmaWxlX2ZyZWVfdmlzaXRlZF9saXN0KGxpc3RfaGVhZHApCisgICAgZmZfdmlzaXRlZF9saXN0X2hkcl9UCSoqbGlzdF9oZWFkcDsKK3sKKyAgICBmZl92aXNpdGVkX2xpc3RfaGRyX1QgKnZwOworCisgICAgd2hpbGUgKCpsaXN0X2hlYWRwICE9IE5VTEwpCisgICAgeworCXZwID0gKCpsaXN0X2hlYWRwKS0+ZmZ2bF9uZXh0OworCWZmX2ZyZWVfdmlzaXRlZF9saXN0KCgqbGlzdF9oZWFkcCktPmZmdmxfdmlzaXRlZF9saXN0KTsKKworCXZpbV9mcmVlKCgqbGlzdF9oZWFkcCktPmZmdmxfZmlsZW5hbWUpOworCXZpbV9mcmVlKCpsaXN0X2hlYWRwKTsKKwkqbGlzdF9oZWFkcCA9IHZwOworICAgIH0KKyAgICAqbGlzdF9oZWFkcCA9IE5VTEw7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZmZfZnJlZV92aXNpdGVkX2xpc3QodmwpCisgICAgZmZfdmlzaXRlZF9UICp2bDsKK3sKKyAgICBmZl92aXNpdGVkX1QgKnZwOworCisgICAgd2hpbGUgKHZsICE9IE5VTEwpCisgICAgeworCXZwID0gdmwtPmZmdl9uZXh0OworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCXZpbV9mcmVlKHZsLT5mZnZfd2NfcGF0aCk7CisjZW5kaWYKKwl2aW1fZnJlZSh2bCk7CisJdmwgPSB2cDsKKyAgICB9CisgICAgdmwgPSBOVUxMOworfQorCisvKgorICogUmV0dXJucyB0aGUgYWxyZWFkeSB2aXNpdGVkIGxpc3QgZm9yIHRoZSBnaXZlbiBmaWxlbmFtZS4gSWYgbm9uZSBpcyBmb3VuZCBpdAorICogYWxsb2NhdGVzIGEgbmV3IG9uZS4KKyAqLworICAgIHN0YXRpYyBmZl92aXNpdGVkX2xpc3RfaGRyX1QqCitmZl9nZXRfdmlzaXRlZF9saXN0KGZpbGVuYW1lLCBsaXN0X2hlYWRwKQorICAgIGNoYXJfdQkJCSpmaWxlbmFtZTsKKyAgICBmZl92aXNpdGVkX2xpc3RfaGRyX1QJKipsaXN0X2hlYWRwOworeworICAgIGZmX3Zpc2l0ZWRfbGlzdF9oZHJfVCAgKnJldHB0ciA9IE5VTEw7CisKKyAgICAvKiBjaGVjayBpZiBhIHZpc2l0ZWQgbGlzdCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lIGV4aXN0cyAqLworICAgIGlmICgqbGlzdF9oZWFkcCAhPSBOVUxMKQorICAgIHsKKwlyZXRwdHIgPSAqbGlzdF9oZWFkcDsKKwl3aGlsZSAocmV0cHRyICE9IE5VTEwpCisJeworCSAgICBpZiAoZm5hbWVjbXAoZmlsZW5hbWUsIHJldHB0ci0+ZmZ2bF9maWxlbmFtZSkgPT0gMCkKKwkgICAgeworI2lmZGVmIEZGX1ZFUkJPU0UKKwkJaWYgKHBfdmVyYm9zZSA+PSA1KQorCQl7CisJCSAgICAvKiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUgKi8KKwkJICAgIG1zZ19zY3JvbGwgPSBUUlVFOworCQkgICAgbXNnX3N0cigoY2hhcl91ICopImZmX2dldF92aXNpdGVkX2xpc3Q6IEZPVU5EIGxpc3QgZm9yICVzIiwKKwkJCQkJCQkJICAgIGZpbGVuYW1lKTsKKwkJICAgIC8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIGVpdGhlciAqLworCQkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJcbiIpOworCQkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93OworCQl9CisjZW5kaWYKKwkJcmV0dXJuIHJldHB0cjsKKwkgICAgfQorCSAgICByZXRwdHIgPSByZXRwdHItPmZmdmxfbmV4dDsKKwl9CisgICAgfQorCisjaWZkZWYgRkZfVkVSQk9TRQorICAgIGlmIChwX3ZlcmJvc2UgPj0gNSkKKyAgICB7CisJLyogYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlICovCisJbXNnX3Njcm9sbCA9IFRSVUU7CisJbXNnX3N0cigoY2hhcl91ICopImZmX2dldF92aXNpdGVkX2xpc3Q6IG5ldyBsaXN0IGZvciAlcyIsIGZpbGVuYW1lKTsKKwkvKiBkb24ndCBvdmVyd3JpdGUgdGhpcyBlaXRoZXIgKi8KKwltc2dfcHV0cygoY2hhcl91ICopIlxuIik7CisJY21kbGluZV9yb3cgPSBtc2dfcm93OworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBpZiB3ZSByZWFjaCB0aGlzIHdlIGRpZG4ndCBmaW5kIGEgbGlzdCBhbmQgd2UgaGF2ZSB0byBhbGxvY2F0ZSBuZXcgbGlzdAorICAgICAqLworICAgIHJldHB0ciA9IChmZl92aXNpdGVkX2xpc3RfaGRyX1QqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoKnJldHB0cikpOworICAgIGlmIChyZXRwdHIgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHJldHB0ci0+ZmZ2bF92aXNpdGVkX2xpc3QgPSBOVUxMOworICAgIHJldHB0ci0+ZmZ2bF9maWxlbmFtZSA9IHZpbV9zdHJzYXZlKGZpbGVuYW1lKTsKKyAgICBpZiAocmV0cHRyLT5mZnZsX2ZpbGVuYW1lID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKHJldHB0cik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHB0ci0+ZmZ2bF9uZXh0ID0gKmxpc3RfaGVhZHA7CisgICAgKmxpc3RfaGVhZHAgPSByZXRwdHI7CisKKyAgICByZXR1cm4gcmV0cHRyOworfQorCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisvKgorICogY2hlY2sgaWYgdHdvIHdpbGRjYXJkIHBhdGhzIGFyZSBlcXVhbC4gUmV0dXJucyBUUlVFIG9yIEZBTFNFLgorICogVGhleSBhcmUgZXF1YWwgaWY6CisgKiAgLSBib3RoIHBhdGhzIGFyZSBOVUxMCisgKiAgLSB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoCisgKiAgLSBjaGFyIGJ5IGNoYXIgY29tcGFyaXNvbiBpcyBPSworICogIC0gdGhlIG9ubHkgZGlmZmVyZW5jZXMgYXJlIGluIHRoZSBjb3VudGVycyBiZWhpbmQgYSAnKionLCBzbworICogICAgJyoqXDIwJyBpcyBlcXVhbCB0byAnKipcMjQnCisgKi8KKyAgICBzdGF0aWMgaW50CitmZl93Y19lcXVhbChzMSwgczIpCisgICAgY2hhcl91CSpzMTsKKyAgICBjaGFyX3UJKnMyOworeworICAgIGludAkJaTsKKworICAgIGlmIChzMSA9PSBzMikKKwlyZXR1cm4gVFJVRTsKKworICAgIGlmIChzMSA9PSBOVUxMIHx8IHMyID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKFNUUkxFTihzMSkgIT0gU1RSTEVOKHMyKSkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZvciAoaSA9IDA7IHMxW2ldICE9IE5VTCAmJiBzMltpXSAhPSBOVUw7IGkrKykKKyAgICB7CisJaWYgKHMxW2ldICE9IHMyW2ldCisjaWZkZWYgQ0FTRV9JTlNFTlNJVElWRV9GSUxFTkFNRQorCQkmJiBUT1VQUEVSX0xPQyhzMVtpXSkgIT0gVE9VUFBFUl9MT0MoczJbaV0pCisjZW5kaWYKKwkJKQorCXsKKwkgICAgaWYgKGkgPj0gMikKKwkJaWYgKHMxW2ktMV0gPT0gJyonICYmIHMxW2ktMl0gPT0gJyonKQorCQkgICAgY29udGludWU7CisJCWVsc2UKKwkJICAgIHJldHVybiBGQUlMOworCSAgICBlbHNlCisJCXJldHVybiBGQUlMOworCX0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworLyoKKyAqIG1haW50YWlucyB0aGUgbGlzdCBvZiBhbHJlYWR5IHZpc2l0ZWQgZmlsZXMgYW5kIGRpcnMKKyAqIHJldHVybnMgRkFJTCBpZiB0aGUgZ2l2ZW4gZmlsZS9kaXIgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdAorICogcmV0dXJucyBPSyBpZiBpdCBpcyBuZXdseSBhZGRlZAorICoKKyAqIFRPRE86IFdoYXQgdG8gZG8gb24gbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXM/CisgKgkgLT4gcmV0dXJuIFRSVUUgLSBCZXR0ZXIgdGhlIGZpbGUgaXMgZm91bmQgc2V2ZXJhbCB0aW1lcyBpbnN0ZWFkIG9mCisgKgkgICAgbmV2ZXIuCisgKi8KKyAgICBzdGF0aWMgaW50CitmZl9jaGVja192aXNpdGVkKHZpc2l0ZWRfbGlzdCwgZm5hbWUKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKwksIHdjX3BhdGgKKyNlbmRpZgorCSkKKyAgICBmZl92aXNpdGVkX1QJKip2aXNpdGVkX2xpc3Q7CisgICAgY2hhcl91CQkqZm5hbWU7CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgY2hhcl91CQkqd2NfcGF0aDsKKyNlbmRpZgoreworICAgIGZmX3Zpc2l0ZWRfVAkqdnA7CisjaWZkZWYgVU5JWAorICAgIHN0cnVjdCBzdGF0CQlzdDsKKyAgICBpbnQJCQl1cmwgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgLyogRm9yIGFuIFVSTCB3ZSBvbmx5IGNvbXBhcmUgdGhlIG5hbWUsIG90aGVyd2lzZSB3ZSBjb21wYXJlIHRoZQorICAgICAqIGRldmljZS9pbm9kZSAodW5peCkgb3IgdGhlIGZ1bGwgcGF0aCBuYW1lIChub3QgVW5peCkuICovCisgICAgaWYgKHBhdGhfd2l0aF91cmwoZm5hbWUpKQorICAgIHsKKwlTVFJOQ1BZKGZmX2V4cGFuZF9idWZmZXIsIGZuYW1lLCBNQVhQQVRITCk7CisjaWZkZWYgVU5JWAorCXVybCA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmZl9leHBhbmRfYnVmZmVyWzBdID0gTlVMOworI2lmZGVmIFVOSVgKKwlpZiAobWNoX3N0YXQoKGNoYXIgKilmbmFtZSwgJnN0KSA8IDApCisjZWxzZQorCWlmICh2aW1fRnVsbE5hbWUoZm5hbWUsIGZmX2V4cGFuZF9idWZmZXIsIE1BWFBBVEhMLCBUUlVFKSA9PSBGQUlMKQorI2VuZGlmCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIGNoZWNrIGFnYWluc3QgbGlzdCBvZiBhbHJlYWR5IHZpc2l0ZWQgZmlsZXMgKi8KKyAgICBmb3IgKHZwID0gKnZpc2l0ZWRfbGlzdDsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+ZmZ2X25leHQpCisgICAgeworCWlmICgKKyNpZmRlZiBVTklYCisJCSF1cmwKKwkJICAgID8gKHZwLT5mZnZfZGV2ID09IHN0LnN0X2RldgorCQkJJiYgdnAtPmZmdl9pbm8gPT0gc3Quc3RfaW5vKQorCQkgICAgOgorI2VuZGlmCisJCWZuYW1lY21wKHZwLT5mZnZfZm5hbWUsIGZmX2V4cGFuZF9idWZmZXIpID09IDAKKwkgICApCisJeworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCSAgICAvKiBhcmUgdGhlIHdpbGRjYXJkIHBhcnRzIGVxdWFsICovCisJICAgIGlmIChmZl93Y19lcXVhbCh2cC0+ZmZ2X3djX3BhdGgsIHdjX3BhdGgpID09IFRSVUUpCisjZW5kaWYKKwkJLyogYWxyZWFkeSB2aXNpdGVkICovCisJCXJldHVybiBGQUlMOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5ldyBmaWxlL2Rpci4gIEFkZCBpdCB0byB0aGUgbGlzdCBvZiB2aXNpdGVkIGZpbGVzL2RpcnMuCisgICAgICovCisgICAgdnAgPSAoZmZfdmlzaXRlZF9UICopYWxsb2MoKHVuc2lnbmVkKShzaXplb2YoZmZfdmlzaXRlZF9UKQorCQkJCQkJICsgU1RSTEVOKGZmX2V4cGFuZF9idWZmZXIpKSk7CisKKyAgICBpZiAodnAgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgVU5JWAorCWlmICghdXJsKQorCXsKKwkgICAgdnAtPmZmdl9pbm8gPSBzdC5zdF9pbm87CisJICAgIHZwLT5mZnZfZGV2ID0gc3Quc3RfZGV2OworCSAgICB2cC0+ZmZ2X2ZuYW1lWzBdID0gTlVMOworCX0KKwllbHNlCisJeworCSAgICB2cC0+ZmZ2X2lubyA9IDA7CisJICAgIHZwLT5mZnZfZGV2ID0gLTE7CisjZW5kaWYKKwkgICAgU1RSQ1BZKHZwLT5mZnZfZm5hbWUsIGZmX2V4cGFuZF9idWZmZXIpOworI2lmZGVmIFVOSVgKKwl9CisjZW5kaWYKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKwlpZiAod2NfcGF0aCAhPSBOVUxMKQorCSAgICB2cC0+ZmZ2X3djX3BhdGggPSB2aW1fc3Ryc2F2ZSh3Y19wYXRoKTsKKwllbHNlCisJICAgIHZwLT5mZnZfd2NfcGF0aCA9IE5VTEw7CisjZW5kaWYKKworCXZwLT5mZnZfbmV4dCA9ICp2aXNpdGVkX2xpc3Q7CisJKnZpc2l0ZWRfbGlzdCA9IHZwOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGNyZWF0ZSBzdGFjayBlbGVtZW50IGZyb20gZ2l2ZW4gcGF0aCBwaWVjZXMKKyAqLworICAgIHN0YXRpYyBmZl9zdGFja19UICoKK2ZmX2NyZWF0ZV9zdGFja19lbGVtZW50KGZpeF9wYXJ0LAorI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCXdjX3BhcnQsCisjZW5kaWYKKwlsZXZlbCwgc3Rhcl9zdGFyX2VtcHR5KQorICAgIGNoYXJfdQkqZml4X3BhcnQ7CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgY2hhcl91CSp3Y19wYXJ0OworI2VuZGlmCisgICAgaW50CQlsZXZlbDsKKyAgICBpbnQJCXN0YXJfc3Rhcl9lbXB0eTsKK3sKKyAgICBmZl9zdGFja19UCSpuZXc7CisKKyAgICBuZXcgPSAoZmZfc3RhY2tfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoZmZfc3RhY2tfVCkpOworICAgIGlmIChuZXcgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIG5ldy0+ZmZzX3ByZXYJICAgPSBOVUxMOworICAgIG5ldy0+ZmZzX2ZpbGVhcnJheQkgICA9IE5VTEw7CisgICAgbmV3LT5mZnNfZmlsZWFycmF5X3NpemUgPSAwOworICAgIG5ldy0+ZmZzX2ZpbGVhcnJheV9jdXIgID0gMDsKKyAgICBuZXctPmZmc19zdGFnZQkgICA9IDA7CisgICAgbmV3LT5mZnNfbGV2ZWwJICAgPSBsZXZlbDsKKyAgICBuZXctPmZmc19zdGFyX3N0YXJfZW1wdHkgPSBzdGFyX3N0YXJfZW1wdHk7OworCisgICAgLyogdGhlIGZvbGxvd2luZyBzYXZlcyBOVUxMIHBvaW50ZXIgY2hlY2tzIGluIHZpbV9maW5kZmlsZSAqLworICAgIGlmIChmaXhfcGFydCA9PSBOVUxMKQorCWZpeF9wYXJ0ID0gKGNoYXJfdSAqKSIiOworICAgIG5ldy0+ZmZzX2ZpeF9wYXRoID0gdmltX3N0cnNhdmUoZml4X3BhcnQpOworCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgaWYgKHdjX3BhcnQgPT0gTlVMTCkKKwl3Y19wYXJ0ICA9IChjaGFyX3UgKikiIjsKKyAgICBuZXctPmZmc193Y19wYXRoID0gdmltX3N0cnNhdmUod2NfcGFydCk7CisjZW5kaWYKKworICAgIGlmIChuZXctPmZmc19maXhfcGF0aCA9PSBOVUxMCisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisJICAgIHx8IG5ldy0+ZmZzX3djX3BhdGggPT0gTlVMTAorI2VuZGlmCisJICAgICkKKyAgICB7CisJZmZfZnJlZV9zdGFja19lbGVtZW50KG5ldyk7CisJbmV3ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3OworfQorCisvKgorICogcHVzaCBhIGRpciBvbiB0aGUgZGlyZWN0b3J5IHN0YWNrCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZmZfcHVzaChjdHgpCisgICAgZmZfc3RhY2tfVCAqY3R4OworeworICAgIC8qIGNoZWNrIGZvciBOVUxMIHBvaW50ZXIsIG5vdCB0byByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIHVzZXIsIGJ1dAorICAgICAqIHRvIHByZXZlbnQgYSBjcmFzaAorICAgICAqLworICAgIGlmIChjdHggIT0gTlVMTCkKKyAgICB7CisJY3R4LT5mZnNfcHJldiAgID0gZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFja19wdHI7CisJZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFja19wdHIgPSBjdHg7CisgICAgfQorfQorCisvKgorICogcG9wIGEgZGlyIGZyb20gdGhlIGRpcmVjdG9yeSBzdGFjaworICogcmV0dXJucyBOVUxMIGlmIHN0YWNrIGlzIGVtcHR5CisgKi8KKyAgICBzdGF0aWMgZmZfc3RhY2tfVCAqCitmZl9wb3AoKQoreworICAgIGZmX3N0YWNrX1QgICpzcHRyOworCisgICAgc3B0ciA9IGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhY2tfcHRyOworICAgIGlmIChmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YWNrX3B0ciAhPSBOVUxMKQorCWZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhY2tfcHRyID0gZmZfc2VhcmNoX2N0eC0+ZmZzY19zdGFja19wdHItPmZmc19wcmV2OworCisgICAgcmV0dXJuIHNwdHI7Cit9CisKKy8qCisgKiBmcmVlIHRoZSBnaXZlbiBzdGFjayBlbGVtZW50CisgKi8KKyAgICBzdGF0aWMgdm9pZAorZmZfZnJlZV9zdGFja19lbGVtZW50KGN0eCkKKyAgICBmZl9zdGFja19UICAqY3R4OworeworICAgIC8qIHZpbV9mcmVlIGhhbmRsZXMgcG9zc2libGUgTlVMTCBwb2ludGVycyAqLworICAgIHZpbV9mcmVlKGN0eC0+ZmZzX2ZpeF9wYXRoKTsKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKyAgICB2aW1fZnJlZShjdHgtPmZmc193Y19wYXRoKTsKKyNlbmRpZgorCisgICAgaWYgKGN0eC0+ZmZzX2ZpbGVhcnJheSAhPSBOVUxMKQorCUZyZWVXaWxkKGN0eC0+ZmZzX2ZpbGVhcnJheV9zaXplLCBjdHgtPmZmc19maWxlYXJyYXkpOworCisgICAgdmltX2ZyZWUoY3R4KTsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBzZWFyY2ggY29udGV4dAorICovCisgICAgc3RhdGljIHZvaWQKK2ZmX2NsZWFyKCkKK3sKKyAgICBmZl9zdGFja19UICAgKnNwdHI7CisKKyAgICAvKiBjbGVhciB1cCBzdGFjayAqLworICAgIHdoaWxlICgoc3B0ciA9IGZmX3BvcCgpKSAhPSBOVUxMKQorCWZmX2ZyZWVfc3RhY2tfZWxlbWVudChzcHRyKTsKKworICAgIHZpbV9mcmVlKGZmX3NlYXJjaF9jdHgtPmZmc2NfZmlsZV90b19zZWFyY2gpOworICAgIHZpbV9mcmVlKGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RhcnRfZGlyKTsKKyAgICB2aW1fZnJlZShmZl9zZWFyY2hfY3R4LT5mZnNjX2ZpeF9wYXRoKTsKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKyAgICB2aW1fZnJlZShmZl9zZWFyY2hfY3R4LT5mZnNjX3djX3BhdGgpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKyAgICBpZiAoZmZfc2VhcmNoX2N0eC0+ZmZzY19zdG9wZGlyc192ICE9IE5VTEwpCisgICAgeworCWludCAgaSA9IDA7CisKKwl3aGlsZSAoZmZfc2VhcmNoX2N0eC0+ZmZzY19zdG9wZGlyc192W2ldICE9IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShmZl9zZWFyY2hfY3R4LT5mZnNjX3N0b3BkaXJzX3ZbaV0pOworCSAgICBpKys7CisJfQorCXZpbV9mcmVlKGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RvcGRpcnNfdik7CisgICAgfQorICAgIGZmX3NlYXJjaF9jdHgtPmZmc2Nfc3RvcGRpcnNfdiA9IE5VTEw7CisjZW5kaWYKKworICAgIC8qIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKyAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX2ZpbGVfdG9fc2VhcmNoCT0gTlVMTDsKKyAgICBmZl9zZWFyY2hfY3R4LT5mZnNjX3N0YXJ0X2Rpcgk9IE5VTEw7CisgICAgZmZfc2VhcmNoX2N0eC0+ZmZzY19maXhfcGF0aAk9IE5VTEw7CisjaWZkZWYgRkVBVF9QQVRIX0VYVFJBCisgICAgZmZfc2VhcmNoX2N0eC0+ZmZzY193Y19wYXRoCQk9IE5VTEw7CisgICAgZmZfc2VhcmNoX2N0eC0+ZmZzY19sZXZlbAkJPSAwOworI2VuZGlmCit9CisKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKy8qCisgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBpbiB0aGUgc3RvcGRpcnMKKyAqIHJldHVybnMgVFJVRSBpZiB5ZXMgZWxzZSBGQUxTRQorICovCisgICAgc3RhdGljIGludAorZmZfcGF0aF9pbl9zdG9wbGlzdChwYXRoLCBwYXRoX2xlbiwgc3RvcGRpcnNfdikKKyAgICBjaGFyX3UJKnBhdGg7CisgICAgaW50CQlwYXRoX2xlbjsKKyAgICBjaGFyX3UJKipzdG9wZGlyc192OworeworICAgIGludAkJaSA9IDA7CisKKyAgICAvKiBlYXQgdXAgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzLCBleGNlcHQgdGhlIGZpcnN0ICovCisgICAgd2hpbGUgKHBhdGhfbGVuID4gMSAmJiBwYXRoW3BhdGhfbGVuIC0gMV0gPT0gUEFUSFNFUCkKKwlwYXRoX2xlbi0tOworCisgICAgLyogaWYgbm8gcGF0aCBjb25zaWRlciBpdCBhcyBtYXRjaCAqLworICAgIGlmIChwYXRoX2xlbiA9PSAwKQorCXJldHVybiBUUlVFOworCisgICAgZm9yIChpID0gMDsgc3RvcGRpcnNfdltpXSAhPSBOVUxMOyBpKyspCisgICAgeworCWlmICgoaW50KVNUUkxFTihzdG9wZGlyc192W2ldKSA+IHBhdGhfbGVuKQorCXsKKwkgICAgLyogbWF0Y2ggZm9yIHBhcmVudCBkaXJlY3RvcnkuIFNvICcvaG9tZScgYWxzbyBtYXRjaGVzCisJICAgICAqICcvaG9tZS9ya3MnLiBDaGVjayBmb3IgUEFUSFNFUCBpbiBzdG9wZGlyc192W2ldLCBlbHNlCisJICAgICAqICcvaG9tZS9yJyB3b3VsZCBhbHNvIG1hdGNoICcvaG9tZS9ya3MnCisJICAgICAqLworCSAgICBpZiAoZm5hbWVuY21wKHN0b3BkaXJzX3ZbaV0sIHBhdGgsIHBhdGhfbGVuKSA9PSAwCisJCSAgICAmJiBzdG9wZGlyc192W2ldW3BhdGhfbGVuXSA9PSBQQVRIU0VQKQorCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGZuYW1lY21wKHN0b3BkaXJzX3ZbaV0sIHBhdGgpID09IDApCisJCXJldHVybiBUUlVFOworCX0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIUEFUSCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBGaW5kIHRoZSBmaWxlIG5hbWUgInB0cltsZW5dIiBpbiB0aGUgcGF0aC4KKyAqCisgKiBPbiB0aGUgZmlyc3QgY2FsbCBzZXQgdGhlIHBhcmFtZXRlciAnZmlyc3QnIHRvIFRSVUUgdG8gaW5pdGlhbGl6ZQorICogdGhlIHNlYXJjaC4gIEZvciByZXBlYXRpbmcgY2FsbHMgdG8gRkFMU0UuCisgKgorICogUmVwZWF0aW5nIGNhbGxzIHdpbGwgcmV0dXJuIG90aGVyIGZpbGVzIGNhbGxlZCAncHRyW2xlbl0nIGZyb20gdGhlIHBhdGguCisgKgorICogT25seSBvbiB0aGUgZmlyc3QgY2FsbCAncHRyJyBhbmQgJ2xlbicgYXJlIHVzZWQuICBGb3IgcmVwZWF0aW5nIGNhbGxzIHRoZXkKKyAqIGRvbid0IG5lZWQgdmFsaWQgdmFsdWVzLgorICoKKyAqIElmIG5vdGhpbmcgZm91bmQgb24gdGhlIGZpcnN0IGNhbGwgdGhlIG9wdGlvbiBGTkFNRV9NRVNTIHdpbGwgaXNzdWUgdGhlCisgKiBtZXNzYWdlOgorICoJICAgICdDYW4ndCBmaW5kIGZpbGUgIjxmaWxlPiIgaW4gcGF0aCcKKyAqIE9uIHJlcGVhdGluZyBjYWxsczoKKyAqCSAgICAnTm8gbW9yZSBmaWxlICI8ZmlsZT4iIGZvdW5kIGluIHBhdGgnCisgKgorICogb3B0aW9uczoKKyAqIEZOQU1FX01FU1MJICAgIGdpdmUgZXJyb3IgbWVzc2FnZSB3aGVuIG5vdCBmb3VuZAorICoKKyAqIFVzZXMgTmFtZUJ1ZmZbXSEKKyAqCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgZm9yIHRoZSBmaWxlIG5hbWUuICBOVUxMIGZvciBlcnJvci4KKyAqCisgKi8KKyAgICBjaGFyX3UgKgorZmluZF9maWxlX2luX3BhdGgocHRyLCBsZW4sIG9wdGlvbnMsIGZpcnN0LCByZWxfZm5hbWUpCisgICAgY2hhcl91CSpwdHI7CQkvKiBmaWxlIG5hbWUgKi8KKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiBmaWxlIG5hbWUgKi8KKyAgICBpbnQJCW9wdGlvbnM7CisgICAgaW50CQlmaXJzdDsJCS8qIHVzZSBjb3VudCd0aCBtYXRjaGluZyBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKnJlbF9mbmFtZTsJLyogZmlsZSBuYW1lIHNlYXJjaGluZyByZWxhdGl2ZSB0byAqLworeworICAgIHJldHVybiBmaW5kX2ZpbGVfaW5fcGF0aF9vcHRpb24ocHRyLCBsZW4sIG9wdGlvbnMsIGZpcnN0LAorCSAgICAqY3VyYnVmLT5iX3BfcGF0aCA9PSBOVUwgPyBwX3BhdGggOiBjdXJidWYtPmJfcF9wYXRoLAorCSAgICBGQUxTRSwgcmVsX2ZuYW1lKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGRpcmVjdG9yeSBuYW1lICJwdHJbbGVuXSIgaW4gdGhlIHBhdGguCisgKgorICogb3B0aW9uczoKKyAqIEZOQU1FX01FU1MJICAgIGdpdmUgZXJyb3IgbWVzc2FnZSB3aGVuIG5vdCBmb3VuZAorICoKKyAqIFVzZXMgTmFtZUJ1ZmZbXSEKKyAqCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgZm9yIHRoZSBmaWxlIG5hbWUuICBOVUxMIGZvciBlcnJvci4KKyAqLworICAgIGNoYXJfdSAqCitmaW5kX2RpcmVjdG9yeV9pbl9wYXRoKHB0ciwgbGVuLCBvcHRpb25zLCByZWxfZm5hbWUpCisgICAgY2hhcl91CSpwdHI7CQkvKiBmaWxlIG5hbWUgKi8KKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiBmaWxlIG5hbWUgKi8KKyAgICBpbnQJCW9wdGlvbnM7CisgICAgY2hhcl91CSpyZWxfZm5hbWU7CS8qIGZpbGUgbmFtZSBzZWFyY2hpbmcgcmVsYXRpdmUgdG8gKi8KK3sKKyAgICByZXR1cm4gZmluZF9maWxlX2luX3BhdGhfb3B0aW9uKHB0ciwgbGVuLCBvcHRpb25zLCBUUlVFLCBwX2NkcGF0aCwKKwkJCQkJCQkgICAgIFRSVUUsIHJlbF9mbmFtZSk7Cit9CisKKyAgICBzdGF0aWMgY2hhcl91ICoKK2ZpbmRfZmlsZV9pbl9wYXRoX29wdGlvbihwdHIsIGxlbiwgb3B0aW9ucywgZmlyc3QsIHBhdGhfb3B0aW9uLCBuZWVkX2RpciwgcmVsX2ZuYW1lKQorICAgIGNoYXJfdQkqcHRyOwkJLyogZmlsZSBuYW1lICovCisgICAgaW50CQlsZW47CQkvKiBsZW5ndGggb2YgZmlsZSBuYW1lICovCisgICAgaW50CQlvcHRpb25zOworICAgIGludAkJZmlyc3Q7CQkvKiB1c2UgY291bnQndGggbWF0Y2hpbmcgZmlsZSBuYW1lICovCisgICAgY2hhcl91CSpwYXRoX29wdGlvbjsJLyogcF9wYXRoIG9yIHBfY2RwYXRoICovCisgICAgaW50CQluZWVkX2RpcjsJLyogbG9va2luZyBmb3IgZGlyZWN0b3J5IG5hbWUgKi8KKyAgICBjaGFyX3UJKnJlbF9mbmFtZTsJLyogZmlsZSBuYW1lIHdlIGFyZSBsb29raW5nIHJlbGF0aXZlIHRvLiAqLworeworICAgIHN0YXRpYyB2b2lkCQkqc2VhcmNoX2N0eCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXJfdQkqZGlyOworICAgIHN0YXRpYyBjaGFyX3UJKmZpbGVfdG9fZmluZCA9IE5VTEw7CisgICAgc3RhdGljIGludAkJZGlkX2ZpbmRmaWxlX2luaXQgPSBGQUxTRTsKKyAgICBjaGFyX3UJCXNhdmVfY2hhcjsKKyAgICBjaGFyX3UJCSpmaWxlX25hbWUgPSBOVUxMOworICAgIGNoYXJfdQkJKmJ1ZiA9IE5VTEw7CisgICAgaW50CQkJcmVsX3RvX2N1cmRpcjsKKyNpZmRlZiBBTUlHQQorICAgIHN0cnVjdCBQcm9jZXNzCSpwcm9jID0gKHN0cnVjdCBQcm9jZXNzICopRmluZFRhc2soMEwpOworICAgIEFQVFIJCXNhdmVfd2lucHRyID0gcHJvYy0+cHJfV2luZG93UHRyOworCisgICAgLyogQXZvaWQgYSByZXF1ZXN0ZXIgaGVyZSBmb3IgYSB2b2x1bWUgdGhhdCBkb2Vzbid0IGV4aXN0LiAqLworICAgIHByb2MtPnByX1dpbmRvd1B0ciA9IChBUFRSKS0xTDsKKyNlbmRpZgorCisgICAgaWYgKGZpcnN0ID09IFRSVUUpCisgICAgeworCS8qIGNvcHkgZmlsZSBuYW1lIGludG8gTmFtZUJ1ZmYsIGV4cGFuZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKwlzYXZlX2NoYXIgPSBwdHJbbGVuXTsKKwlwdHJbbGVuXSA9IE5VTDsKKwlleHBhbmRfZW52KHB0ciwgTmFtZUJ1ZmYsIE1BWFBBVEhMKTsKKwlwdHJbbGVuXSA9IHNhdmVfY2hhcjsKKworCXZpbV9mcmVlKGZpbGVfdG9fZmluZCk7CisJZmlsZV90b19maW5kID0gdmltX3N0cnNhdmUoTmFtZUJ1ZmYpOworCWlmIChmaWxlX3RvX2ZpbmQgPT0gTlVMTCkJLyogb3V0IG9mIG1lbW9yeSAqLworCXsKKwkgICAgZmlsZV9uYW1lID0gTlVMTDsKKwkgICAgZ290byB0aGVlbmQ7CisJfQorICAgIH0KKworICAgIHJlbF90b19jdXJkaXIgPSAoZmlsZV90b19maW5kWzBdID09ICcuJworCQkgICAgJiYgKGZpbGVfdG9fZmluZFsxXSA9PSBOVUwKKwkJCXx8IHZpbV9pc3BhdGhzZXAoZmlsZV90b19maW5kWzFdKQorCQkJfHwgKGZpbGVfdG9fZmluZFsxXSA9PSAnLicKKwkJCSAgICAmJiAoZmlsZV90b19maW5kWzJdID09IE5VTAorCQkJCXx8IHZpbV9pc3BhdGhzZXAoZmlsZV90b19maW5kWzJdKSkpKSk7CisgICAgaWYgKHZpbV9pc0Fic05hbWUoZmlsZV90b19maW5kKQorCSAgICAvKiAiLi4iLCAiLi4vcGF0aCIsICIuIiBhbmQgIi4vcGF0aCI6IGRvbid0IHVzZSB0aGUgcGF0aF9vcHRpb24gKi8KKwkgICAgfHwgcmVsX3RvX2N1cmRpcgorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKQorCSAgICAvKiBoYW5kbGUgIlx0bXAiIGFzIGFic29sdXRlIHBhdGggKi8KKwkgICAgfHwgdmltX2lzcGF0aHNlcChmaWxlX3RvX2ZpbmRbMF0pCisJICAgIC8qIGhhbmRsZSAiYzpuYW1lIiBhcyBhYnN1bHV0ZSBwYXRoICovCisJICAgIHx8IChmaWxlX3RvX2ZpbmRbMF0gIT0gTlVMICYmIGZpbGVfdG9fZmluZFsxXSA9PSAnOicpCisjZW5kaWYKKyNpZmRlZiBBTUlHQQorCSAgICAvKiBoYW5kbGUgIjp0bXAiIGFzIGFic29sdXRlIHBhdGggKi8KKwkgICAgfHwgZmlsZV90b19maW5kWzBdID09ICc6JworI2VuZGlmCisgICAgICAgKQorICAgIHsKKwkvKgorCSAqIEFic29sdXRlIHBhdGgsIG5vIG5lZWQgdG8gdXNlICJwYXRoX29wdGlvbiIuCisJICogSWYgdGhpcyBpcyBub3QgYSBmaXJzdCBjYWxsLCByZXR1cm4gTlVMTC4gIFdlIGFscmVhZHkgcmV0dXJuZWQgYQorCSAqIGZpbGVuYW1lIG9uIHRoZSBmaXJzdCBjYWxsLgorCSAqLworCWlmIChmaXJzdCA9PSBUUlVFKQorCXsKKwkgICAgaW50CQlsOworCSAgICBpbnQJCXJ1bjsKKworCSAgICBpZiAocGF0aF93aXRoX3VybChmaWxlX3RvX2ZpbmQpKQorCSAgICB7CisJCWZpbGVfbmFtZSA9IHZpbV9zdHJzYXZlKGZpbGVfdG9fZmluZCk7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisKKwkgICAgLyogV2hlbiBGTkFNRV9SRUwgZmxhZyBnaXZlbiBmaXJzdCB1c2UgdGhlIGRpcmVjdG9yeSBvZiB0aGUgZmlsZS4KKwkgICAgICogT3RoZXJ3aXNlIG9yIHdoZW4gdGhpcyBmYWlscyB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLworCSAgICBmb3IgKHJ1biA9IDE7IHJ1biA8PSAyOyArK3J1bikKKwkgICAgeworCQlsID0gKGludClTVFJMRU4oZmlsZV90b19maW5kKTsKKwkJaWYgKHJ1biA9PSAxCisJCQkmJiByZWxfdG9fY3VyZGlyCisJCQkmJiAob3B0aW9ucyAmIEZOQU1FX1JFTCkKKwkJCSYmIHJlbF9mbmFtZSAhPSBOVUxMCisJCQkmJiBTVFJMRU4ocmVsX2ZuYW1lKSArIGwgPCBNQVhQQVRITCkKKwkJeworCQkgICAgU1RSQ1BZKE5hbWVCdWZmLCByZWxfZm5hbWUpOworCQkgICAgU1RSQ1BZKGdldHRhaWwoTmFtZUJ1ZmYpLCBmaWxlX3RvX2ZpbmQpOworCQkgICAgbCA9IChpbnQpU1RSTEVOKE5hbWVCdWZmKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIFNUUkNQWShOYW1lQnVmZiwgZmlsZV90b19maW5kKTsKKwkJICAgIHJ1biA9IDI7CisJCX0KKworCQkvKiBXaGVuIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRyeSBhZGRpbmcgcGFydHMgb2YKKwkJICogJ3N1ZmZpeGVzYWRkJy4gKi8KKwkJYnVmID0gY3VyYnVmLT5iX3Bfc3VhOworCQlmb3IgKDs7KQorCQl7CisJCSAgICBpZiAoCisjaWZkZWYgREpHUFAKKwkJCSAgICAvKiAiQzoiIGJ5IGl0c2VsZiB3aWxsIGZhaWwgZm9yIG1jaF9nZXRwZXJtKCksCisJCQkgICAgICogYXNzdW1lIGl0J3MgYWx3YXlzIHZhbGlkLiAqLworCQkJICAgIChuZWVkX2RpciAmJiBOYW1lQnVmZlswXSAhPSBOVUwKKwkJCQkgICYmIE5hbWVCdWZmWzFdID09ICc6JworCQkJCSAgJiYgTmFtZUJ1ZmZbMl0gPT0gTlVMKSB8fAorI2VuZGlmCisJCQkgICAgKG1jaF9nZXRwZXJtKE5hbWVCdWZmKSA+PSAwCisJCQkJICAgICAgICYmICghbmVlZF9kaXIgfHwgbWNoX2lzZGlyKE5hbWVCdWZmKSkpKQorCQkgICAgeworCQkJZmlsZV9uYW1lID0gdmltX3N0cnNhdmUoTmFtZUJ1ZmYpOworCQkJZ290byB0aGVlbmQ7CisJCSAgICB9CisJCSAgICBpZiAoKmJ1ZiA9PSBOVUwpCisJCQlicmVhazsKKwkJICAgIGNvcHlfb3B0aW9uX3BhcnQoJmJ1ZiwgTmFtZUJ1ZmYgKyBsLCBNQVhQQVRITCAtIGwsICIsIik7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgcGF0aHMgaW4gdGhlICdwYXRoJyBvciAnY2RwYXRoJyBvcHRpb24uCisJICogV2hlbiAiZmlyc3QiIGlzIHNldCwgZmlyc3Qgc2V0dXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvcHRpb24uCisJICogT3RoZXJ3aXNlIGNvbnRpbnVlIHRvIGZpbmQgdGhlIG5leHQgbWF0Y2guCisJICovCisJaWYgKGZpcnN0ID09IFRSVUUpCisJeworCSAgICAvKiB2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkIGNhbiBoYW5kbGUgYSBwb3NzaWJsZSBOVUxMIHBvaW50ZXIgKi8KKwkgICAgdmltX2ZpbmRmaWxlX2ZyZWVfdmlzaXRlZChzZWFyY2hfY3R4KTsKKwkgICAgZGlyID0gcGF0aF9vcHRpb247CisJICAgIGRpZF9maW5kZmlsZV9pbml0ID0gRkFMU0U7CisJfQorCisJZm9yICg7OykKKwl7CisJICAgIGlmIChkaWRfZmluZGZpbGVfaW5pdCkKKwkgICAgeworCQlmZl9zZWFyY2hfY3R4LT5mZnNjX25lZWRfZGlyID0gbmVlZF9kaXI7CisJCWZpbGVfbmFtZSA9IHZpbV9maW5kZmlsZShzZWFyY2hfY3R4KTsKKwkJZmZfc2VhcmNoX2N0eC0+ZmZzY19uZWVkX2RpciA9IEZBTFNFOworCQlpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisJCSAgICBicmVhazsKKworCQlkaWRfZmluZGZpbGVfaW5pdCA9IEZBTFNFOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQljaGFyX3UgICpyX3B0cjsKKworCQlpZiAoZGlyID09IE5VTEwgfHwgKmRpciA9PSBOVUwpCisJCXsKKwkJICAgIC8qIFdlIHNlYXJjaGVkIGFsbCBwYXRocyBvZiB0aGUgb3B0aW9uLCBub3cgd2UgY2FuCisJCSAgICAgKiBmcmVlIHRoZSBzZWFyY2ggY29udGV4dC4gKi8KKwkJICAgIHZpbV9maW5kZmlsZV9jbGVhbnVwKHNlYXJjaF9jdHgpOworCQkgICAgc2VhcmNoX2N0eCA9IE5VTEw7CisJCSAgICBicmVhazsKKwkJfQorCisJCWlmICgoYnVmID0gYWxsb2MoKGludCkoTUFYUEFUSEwpKSkgPT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCS8qIGNvcHkgbmV4dCBwYXRoICovCisJCWJ1ZlswXSA9IDA7CisJCWNvcHlfb3B0aW9uX3BhcnQoJmRpciwgYnVmLCBNQVhQQVRITCwgIiAsIik7CisKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKwkJLyogZ2V0IHRoZSBzdG9wZGlyIHN0cmluZyAqLworCQlyX3B0ciA9IHZpbV9maW5kZmlsZV9zdG9wZGlyKGJ1Zik7CisjZWxzZQorCQlyX3B0ciA9IE5VTEw7CisjZW5kaWYKKwkJc2VhcmNoX2N0eCA9IHZpbV9maW5kZmlsZV9pbml0KGJ1ZiwgZmlsZV90b19maW5kLCByX3B0ciwgMTAwLAorCQkJCSAgIEZBTFNFLCBUUlVFLCBzZWFyY2hfY3R4LCBGQUxTRSwgcmVsX2ZuYW1lKTsKKwkJaWYgKHNlYXJjaF9jdHggIT0gTlVMTCkKKwkJICAgIGRpZF9maW5kZmlsZV9pbml0ID0gVFJVRTsKKwkJdmltX2ZyZWUoYnVmKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMICYmIChvcHRpb25zICYgRk5BTUVfTUVTUykpCisgICAgeworCWlmIChmaXJzdCA9PSBUUlVFKQorCXsKKwkgICAgaWYgKG5lZWRfZGlyKQorCQlFTVNHMihfKCJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIiksCisJCQlmaWxlX3RvX2ZpbmQpOworCSAgICBlbHNlCisJCUVNU0cyKF8oIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIpLAorCQkJZmlsZV90b19maW5kKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKG5lZWRfZGlyKQorCQlFTVNHMihfKCJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIiksCisJCQlmaWxlX3RvX2ZpbmQpOworCSAgICBlbHNlCisJCUVNU0cyKF8oIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIpLAorCQkJZmlsZV90b19maW5kKTsKKwl9CisgICAgfQorCit0aGVlbmQ6CisjaWZkZWYgQU1JR0EKKyAgICBwcm9jLT5wcl9XaW5kb3dQdHIgPSBzYXZlX3dpbnB0cjsKKyNlbmRpZgorICAgIHJldHVybiBmaWxlX25hbWU7Cit9CisKKyNlbmRpZiAvKiBGRUFUX1NFQVJDSFBBVEggKi8KKworLyoKKyAqIENoYW5nZSBkaXJlY3RvcnkgdG8gIm5ld19kaXIiLiAgSWYgRkVBVF9TRUFSQ0hQQVRIIGlzIGRlZmluZWQsIHNlYXJjaAorICogJ2NkcGF0aCcgZm9yIHJlbGF0aXZlIGRpcmVjdG9yeSBuYW1lcywgb3RoZXJ3aXNlIGp1c3QgbWNoX2NoZGlyKCkuCisgKi8KKyAgICBpbnQKK3ZpbV9jaGRpcihuZXdfZGlyKQorICAgIGNoYXJfdQkqbmV3X2RpcjsKK3sKKyNpZm5kZWYgRkVBVF9TRUFSQ0hQQVRICisgICAgcmV0dXJuIG1jaF9jaGRpcigoY2hhciAqKW5ld19kaXIpOworI2Vsc2UKKyAgICBjaGFyX3UJKmRpcl9uYW1lOworICAgIGludAkJcjsKKworICAgIGRpcl9uYW1lID0gZmluZF9kaXJlY3RvcnlfaW5fcGF0aChuZXdfZGlyLCAoaW50KVNUUkxFTihuZXdfZGlyKSwKKwkJCQkJCUZOQU1FX01FU1MsIGN1cmJ1Zi0+Yl9mZm5hbWUpOworICAgIGlmIChkaXJfbmFtZSA9PSBOVUxMKQorCXJldHVybiAtMTsKKyAgICByID0gbWNoX2NoZGlyKChjaGFyICopZGlyX25hbWUpOworICAgIHZpbV9mcmVlKGRpcl9uYW1lKTsKKyAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCisvKgorICogR2V0IHVzZXIgbmFtZSBmcm9tIG1hY2hpbmUtc3BlY2lmaWMgZnVuY3Rpb24gYW5kIGNhY2hlIGl0LgorICogUmV0dXJucyB0aGUgdXNlciBuYW1lIGluICJidWZbbGVuXSIuCisgKiBTb21lIHN5c3RlbXMgYXJlIHF1aXRlIHNsb3cgaW4gb2J0YWluaW5nIHRoZSB1c2VyIG5hbWUgKFdpbmRvd3MgTlQpLgorICogUmV0dXJucyBPSyBvciBGQUlMLgorICovCisgICAgaW50CitnZXRfdXNlcl9uYW1lKGJ1ZiwgbGVuKQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbGVuOworeworICAgIHN0YXRpYyBjaGFyX3UJKm5hbWUgPSBOVUxMOworCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisJaWYgKG1jaF9nZXRfdXNlcl9uYW1lKGJ1ZiwgbGVuKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKwluYW1lID0gdmltX3N0cnNhdmUoYnVmKTsKKyAgICB9CisgICAgZWxzZQorCVNUUk5DUFkoYnVmLCBuYW1lLCBsZW4pOworICAgIHJldHVybiBPSzsKK30KKworI2lmbmRlZiBIQVZFX1FTT1JUCisvKgorICogT3VyIG93biBxc29ydCgpLCBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgaXQuCisgKiBJdCdzIHNpbXBsZSBhbmQgc2xvdy4gIEZyb20gdGhlIEsmUiBDIGJvb2suCisgKi8KKyAgICB2b2lkCitxc29ydChiYXNlLCBlbG1fY291bnQsIGVsbV9zaXplLCBjbXApCisgICAgdm9pZAkqYmFzZTsKKyAgICBzaXplX3QJZWxtX2NvdW50OworICAgIHNpemVfdAllbG1fc2l6ZTsKKyAgICBpbnQgKCpjbXApIF9fQVJHUygoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3sKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBjaGFyX3UJKnAxOworICAgIGNoYXJfdQkqcDI7CisgICAgaW50CQlpLCBqOworICAgIGludAkJZ2FwOworCisgICAgYnVmID0gYWxsb2MoKHVuc2lnbmVkKWVsbV9zaXplKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuOworCisgICAgZm9yIChnYXAgPSBlbG1fY291bnQgLyAyOyBnYXAgPiAwOyBnYXAgLz0gMikKKwlmb3IgKGkgPSBnYXA7IGkgPCBlbG1fY291bnQ7ICsraSkKKwkgICAgZm9yIChqID0gaSAtIGdhcDsgaiA+PSAwOyBqIC09IGdhcCkKKwkgICAgeworCQkvKiBDb21wYXJlIHRoZSBlbGVtZW50cy4gKi8KKwkJcDEgPSAoY2hhcl91ICopYmFzZSArIGogKiBlbG1fc2l6ZTsKKwkJcDIgPSAoY2hhcl91ICopYmFzZSArIChqICsgZ2FwKSAqIGVsbV9zaXplOworCQlpZiAoKCpjbXApKCh2b2lkICopcDEsICh2b2lkICopcDIpIDw9IDApCisJCSAgICBicmVhazsKKwkJLyogRXhjaGFuZ2UgdGhlIGVsZW1ldHMuICovCisJCW1jaF9tZW1tb3ZlKGJ1ZiwgcDEsIGVsbV9zaXplKTsKKwkJbWNoX21lbW1vdmUocDEsIHAyLCBlbG1fc2l6ZSk7CisJCW1jaF9tZW1tb3ZlKHAyLCBidWYsIGVsbV9zaXplKTsKKwkgICAgfQorCisgICAgdmltX2ZyZWUoYnVmKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0VYX0VYVFJBKSB8fCBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTb3J0IGFuIGFycmF5IG9mIHN0cmluZ3MuCisgKi8KK3N0YXRpYyBpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorc29ydF9jb21wYXJlIF9fQVJHUygoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyKSk7CisKKyAgICBzdGF0aWMgaW50CisjaWZkZWYgX19CT1JMQU5EQ19fCitfUlRMRU5UUllGCisjZW5kaWYKK3NvcnRfY29tcGFyZShzMSwgczIpCisgICAgY29uc3Qgdm9pZAkqczE7CisgICAgY29uc3Qgdm9pZAkqczI7Cit7CisgICAgcmV0dXJuIFNUUkNNUCgqKGNoYXIgKiopczEsICooY2hhciAqKilzMik7Cit9CisKKyAgICB2b2lkCitzb3J0X3N0cmluZ3MoZmlsZXMsIGNvdW50KQorICAgIGNoYXJfdQkqKmZpbGVzOworICAgIGludAkJY291bnQ7Cit7CisgICAgcXNvcnQoKHZvaWQgKilmaWxlcywgKHNpemVfdCljb3VudCwgc2l6ZW9mKGNoYXJfdSAqKSwgc29ydF9jb21wYXJlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTk9fRVhQQU5EUEFUSCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDb21wYXJlIHBhdGggInBbXSIgdG8gInFbXSIuCisgKiBSZXR1cm4gdmFsdWUgbGlrZSBzdHJjbXAocCwgcSksIGJ1dCBjb25zaWRlciBwYXRoIHNlcGFyYXRvcnMuCisgKi8KKyAgICBpbnQKK3BhdGhjbXAocCwgcSkKKyAgICBjb25zdCBjaGFyICpwLCAqcTsKK3sKKyAgICBpbnQJCWk7CisgICAgY29uc3QgY2hhcgkqczsKKworICAgIGZvciAoaSA9IDA7IDsgKytpKQorICAgIHsKKwkvKiBFbmQgb2YgInAiOiBjaGVjayBpZiAicSIgYWxzbyBlbmRzIG9yIGp1c3QgaGFzIGEgc2xhc2guICovCisJaWYgKHBbaV0gPT0gTlVMKQorCXsKKwkgICAgaWYgKHFbaV0gPT0gTlVMKSAgLyogZnVsbCBtYXRjaCAqLworCQlyZXR1cm4gMDsKKwkgICAgcyA9IHE7CisJICAgIGJyZWFrOworCX0KKworCS8qIEVuZCBvZiAicSI6IGNoZWNrIGlmICJwIiBqdXN0IGhhcyBhIHNsYXNoLiAqLworCWlmIChxW2ldID09IE5VTCkKKwl7CisJICAgIHMgPSBwOworCSAgICBicmVhazsKKwl9CisKKwlpZiAoCisjaWZkZWYgQ0FTRV9JTlNFTlNJVElWRV9GSUxFTkFNRQorCQlUT1VQUEVSX0xPQyhwW2ldKSAhPSBUT1VQUEVSX0xPQyhxW2ldKQorI2Vsc2UKKwkJcFtpXSAhPSBxW2ldCisjZW5kaWYKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJLyogY29uc2lkZXIgJy8nIGFuZCAnXFwnIHRvIGJlIGVxdWFsICovCisJCSYmICEoKHBbaV0gPT0gJy8nICYmIHFbaV0gPT0gJ1xcJykKKwkJICAgIHx8IChwW2ldID09ICdcXCcgJiYgcVtpXSA9PSAnLycpKQorI2VuZGlmCisJCSkKKwl7CisJICAgIGlmICh2aW1faXNwYXRoc2VwKHBbaV0pKQorCQlyZXR1cm4gLTE7CisJICAgIGlmICh2aW1faXNwYXRoc2VwKHFbaV0pKQorCQlyZXR1cm4gMTsKKwkgICAgcmV0dXJuICgoY2hhcl91ICopcClbaV0gLSAoKGNoYXJfdSAqKXEpW2ldOwkgICAgLyogbm8gbWF0Y2ggKi8KKwl9CisgICAgfQorCisgICAgLyogaWdub3JlIGEgdHJhaWxpbmcgc2xhc2gsIGJ1dCBub3QgIi8vIiBvciAiOi8iICovCisgICAgaWYgKHNbaSArIDFdID09IE5VTCAmJiBpID4gMCAmJiAhdmltX2lzcGF0aHNlcChzW2kgLSAxXSkKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkgICAgJiYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJ1xcJykKKyNlbHNlCisJICAgICYmIHNbaV0gPT0gJy8nCisjZW5kaWYKKyAgICAgICApCisJcmV0dXJuIDA7ICAgLyogbWF0Y2ggd2l0aCB0cmFpbGluZyBzbGFzaCAqLworICAgIGlmIChzID09IHEpCisJcmV0dXJuIC0xOwkgICAgLyogbm8gbWF0Y2ggKi8KKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1BSSU5URVIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUGFyc2UgYSBsaXN0IG9mIG9wdGlvbnMgaW4gdGhlIGZvcm0KKyAqIG9wdGlvbjp2YWx1ZSxvcHRpb246dmFsdWUsb3B0aW9uOnZhbHVlCisgKgorICogInZhbHVlIiBjYW4gc3RhcnQgd2l0aCBhIG51bWJlciB3aGljaCBpcyBwYXJzZWQgb3V0LCBlLmcuCisgKiBtYXJnaW46MTJtbQorICoKKyAqIFJldHVybnMgZXJyb3IgbWVzc2FnZSBmb3IgYW4gaWxsZWdhbCBvcHRpb24sIE5VTEwgb3RoZXJ3aXNlLgorICogT25seSB1c2VkIGZvciB0aGUgcHJpbnRlciBhdCB0aGUgbW9tZW50Li4uCisgKi8KKyAgICBjaGFyX3UgKgorcGFyc2VfbGlzdF9vcHRpb25zKG9wdGlvbl9zdHIsIHRhYmxlLCB0YWJsZV9zaXplKQorICAgIGNoYXJfdQkJKm9wdGlvbl9zdHI7CisgICAgb3B0aW9uX3RhYmxlX1QJKnRhYmxlOworICAgIGludAkJCXRhYmxlX3NpemU7Cit7CisgICAgY2hhcl91CSpzdHJpbmdwOworICAgIGNoYXJfdQkqY29sb25wOworICAgIGNoYXJfdQkqY29tbWFwOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWlkeCA9IDA7CQkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCWxlbjsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdGFibGVfc2l6ZTsgKytpZHgpCisJdGFibGVbaWR4XS5wcmVzZW50ID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIFJlcGVhdCBmb3IgYWxsIGNvbW1hIHNlcGFyYXRlZCBwYXJ0cy4KKyAgICAgKi8KKyAgICBzdHJpbmdwID0gb3B0aW9uX3N0cjsKKyAgICB3aGlsZSAoKnN0cmluZ3ApCisgICAgeworCWNvbG9ucCA9IHZpbV9zdHJjaHIoc3RyaW5ncCwgJzonKTsKKwlpZiAoY29sb25wID09IE5VTEwpCisJICAgIHJldHVybiAoY2hhcl91ICopTl8oIkU1NTA6IE1pc3NpbmcgY29sb24iKTsKKwljb21tYXAgPSB2aW1fc3RyY2hyKHN0cmluZ3AsICcsJyk7CisJaWYgKGNvbW1hcCA9PSBOVUxMKQorCSAgICBjb21tYXAgPSBvcHRpb25fc3RyICsgU1RSTEVOKG9wdGlvbl9zdHIpOworCisJbGVuID0gKGludCkoY29sb25wIC0gc3RyaW5ncCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHRhYmxlX3NpemU7ICsraWR4KQorCSAgICBpZiAoU1RSTklDTVAoc3RyaW5ncCwgdGFibGVbaWR4XS5uYW1lLCBsZW4pID09IDApCisJCWJyZWFrOworCisJaWYgKGlkeCA9PSB0YWJsZV9zaXplKQorCSAgICByZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIpOworCisJcCA9IGNvbG9ucCArIDE7CisJdGFibGVbaWR4XS5wcmVzZW50ID0gVFJVRTsKKworCWlmICh0YWJsZVtpZHhdLmhhc251bSkKKwl7CisJICAgIGlmICghVklNX0lTRElHSVQoKnApKQorCQlyZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTUyOiBkaWdpdCBleHBlY3RlZCIpOworCisJICAgIHRhYmxlW2lkeF0ubnVtYmVyID0gZ2V0ZGlnaXRzKCZwKTsgLyphZHZhbmNlcyBwKi8KKwl9CisKKwl0YWJsZVtpZHhdLnN0cmluZyA9IHA7CisJdGFibGVbaWR4XS5zdHJsZW4gPSAoaW50KShjb21tYXAgLSBwKTsKKworCXN0cmluZ3AgPSBjb21tYXA7CisJaWYgKCpzdHJpbmdwID09ICcsJykKKwkgICAgKytzdHJpbmdwOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKKyNlbmRpZiAvKkZFQVRfUFJJTlRFUiovCisKKy8qCisgKiBUaGUgcHV0ZW52KCkgaW1wbGVtZW50YXRpb24gYmVsb3cgY29tZXMgZnJvbSB0aGUgInNjcmVlbiIgcHJvZ3JhbS4KKyAqIEluY2x1ZGVkIHdpdGggcGVybWlzc2lvbiBmcm9tIEp1ZXJnZW4gV2VpZ2VydC4KKyAqIFNlZSBwdHkuYyBmb3IgdGhlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworLyoKKyAqICBwdXRlbnYgIC0tCXB1dCB2YWx1ZSBpbnRvIGVudmlyb25tZW50CisgKgorICogIFVzYWdlOiAgaSA9IHB1dGVudiAoc3RyaW5nKQorICogICAgaW50IGk7CisgKiAgICBjaGFyICAqc3RyaW5nOworICoKKyAqICB3aGVyZSBzdHJpbmcgaXMgb2YgdGhlIGZvcm0gPG5hbWU+PTx2YWx1ZT4uCisgKiAgUHV0ZW52IHJldHVybnMgMCBub3JtYWxseSwgLTEgb24gZXJyb3IgKG5vdCBlbm91Z2ggY29yZSBmb3IgbWFsbG9jKS4KKyAqCisgKiAgUHV0ZW52IG1heSBuZWVkIHRvIGFkZCBhIG5ldyBuYW1lIGludG8gdGhlIGVudmlyb25tZW50LCBvciB0bworICogIGFzc29jaWF0ZSBhIHZhbHVlIGxvbmdlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIHdpdGggYSBwYXJ0aWN1bGFyCisgKiAgbmFtZS4gIFNvLCB0byBtYWtlIGxpZmUgc2ltcGxlciwgcHV0ZW52KCkgY29waWVzIHlvdXIgZW50aXJlCisgKiAgZW52aXJvbm1lbnQgaW50byB0aGUgaGVhcCAoaS5lLiBtYWxsb2MoKSkgZnJvbSB0aGUgc3RhY2sKKyAqICAoaS5lLiB3aGVyZSBpdCByZXNpZGVzIHdoZW4geW91ciBwcm9jZXNzIGlzIGluaXRpYXRlZCkgdGhlIGZpcnN0CisgKiAgdGltZSB5b3UgY2FsbCBpdC4KKyAqCisgKiAgKGhpc3RvcnkgcmVtb3ZlZCwgbm90IHZlcnkgaW50ZXJlc3RpbmcuICBTZWUgdGhlICJzY3JlZW4iIHNvdXJjZXMuKQorICovCisKKyNpZiAhZGVmaW5lZChIQVZFX1NFVEVOVikgJiYgIWRlZmluZWQoSEFWRV9QVVRFTlYpCisKKyNkZWZpbmUgRVhUUkFTSVpFIDUJCS8qIGluY3JlbWVudCB0byBhZGQgdG8gZW52LiBzaXplICovCisKK3N0YXRpYyBpbnQgIGVudnNpemUgPSAtMTsJLyogY3VycmVudCBzaXplIG9mIGVudmlyb25tZW50ICovCisjaWZuZGVmIE1BQ09TX0NMQVNTSUMKK2V4dGVybgorI2VuZGlmCisgICAgICAgY2hhciAqKmVudmlyb247CQkvKiB0aGUgZ2xvYmFsIHdoaWNoIGlzIHlvdXIgZW52LiAqLworCitzdGF0aWMgaW50ICBmaW5kZW52IF9fQVJHUygoY2hhciAqbmFtZSkpOyAvKiBsb29rIGZvciBhIG5hbWUgaW4gdGhlIGVudi4gKi8KK3N0YXRpYyBpbnQgIG5ld2VudiBfX0FSR1MoKHZvaWQpKTsJLyogY29weSBlbnYuIGZyb20gc3RhY2sgdG8gaGVhcCAqLworc3RhdGljIGludCAgbW9yZWVudiBfX0FSR1MoKHZvaWQpKTsJLyogaW5jci4gc2l6ZSBvZiBlbnYuICovCisKKyAgICBpbnQKK3B1dGVudihzdHJpbmcpCisgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICAgIGludAkgICAgaTsKKyAgICBjaGFyICAgICpwOworCisgICAgaWYgKGVudnNpemUgPCAwKQorICAgIHsJCQkJLyogZmlyc3QgdGltZSBwdXRlbnYgY2FsbGVkICovCisJaWYgKG5ld2VudigpIDwgMCkJLyogY29weSBlbnYuIHRvIGhlYXAgKi8KKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGkgPSBmaW5kZW52KChjaGFyICopc3RyaW5nKTsgLyogbG9vayBmb3IgbmFtZSBpbiBlbnZpcm9ubWVudCAqLworCisgICAgaWYgKGkgPCAwKQorICAgIHsJCQkJLyogbmFtZSBtdXN0IGJlIGFkZGVkICovCisJZm9yIChpID0gMDsgZW52aXJvbltpXTsgaSsrKTsKKwlpZiAoaSA+PSAoZW52c2l6ZSAtIDEpKQorCXsJCQkvKiBuZWVkIG5ldyBzbG90ICovCisJICAgIGlmIChtb3JlZW52KCkgPCAwKQorCQlyZXR1cm4gLTE7CisJfQorCXAgPSAoY2hhciAqKWFsbG9jKCh1bnNpZ25lZCkoc3RybGVuKHN0cmluZykgKyAxKSk7CisJaWYgKHAgPT0gTlVMTCkJCS8qIG5vdCBlbm91Z2ggY29yZSAqLworCSAgICByZXR1cm4gLTE7CisJZW52aXJvbltpICsgMV0gPSAwOwkvKiBuZXcgZW5kIG9mIGVudi4gKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsJCQkJLyogbmFtZSBhbHJlYWR5IGluIGVudi4gKi8KKwlwID0gdmltX3JlYWxsb2MoZW52aXJvbltpXSwgc3RybGVuKHN0cmluZykgKyAxKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNwcmludGYocCwgIiVzIiwgc3RyaW5nKTsJLyogY29weSBpbnRvIGVudi4gKi8KKyAgICBlbnZpcm9uW2ldID0gcDsKKworICAgIHJldHVybiAwOworfQorCisgICAgc3RhdGljIGludAorZmluZGVudihuYW1lKQorICAgIGNoYXIgKm5hbWU7Cit7CisgICAgY2hhciAgICAqbmFtZWNoYXIsICplbnZjaGFyOworICAgIGludAkgICAgaSwgZm91bmQ7CisKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChpID0gMDsgZW52aXJvbltpXSAmJiAhZm91bmQ7IGkrKykKKyAgICB7CisJZW52Y2hhciA9IGVudmlyb25baV07CisJbmFtZWNoYXIgPSBuYW1lOworCXdoaWxlICgqbmFtZWNoYXIgJiYgKm5hbWVjaGFyICE9ICc9JyAmJiAoKm5hbWVjaGFyID09ICplbnZjaGFyKSkKKwl7CisJICAgIG5hbWVjaGFyKys7CisJICAgIGVudmNoYXIrKzsKKwl9CisJZm91bmQgPSAoKCpuYW1lY2hhciA9PSAnXDAnIHx8ICpuYW1lY2hhciA9PSAnPScpICYmICplbnZjaGFyID09ICc9Jyk7CisgICAgfQorICAgIHJldHVybiBmb3VuZCA/IGkgLSAxIDogLTE7Cit9CisKKyAgICBzdGF0aWMgaW50CituZXdlbnYoKQoreworICAgIGNoYXIgICAgKiplbnYsICplbGVtOworICAgIGludAkgICAgaSwgZXNpemU7CisKKyNpZmRlZiBNQUNPUworICAgIC8qIGZvciBNYWMgYSBuZXcsIGVtcHR5IGVudmlyb25tZW50IGlzIGNyZWF0ZWQgKi8KKyAgICBpID0gMDsKKyNlbHNlCisgICAgZm9yIChpID0gMDsgZW52aXJvbltpXTsgaSsrKQorCTsKKyNlbmRpZgorICAgIGVzaXplID0gaSArIEVYVFJBU0laRSArIDE7CisgICAgZW52ID0gKGNoYXIgKiopYWxsb2MoKHVuc2lnbmVkKShlc2l6ZSAqIHNpemVvZiAoZWxlbSkpKTsKKyAgICBpZiAoZW52ID09IE5VTEwpCisJcmV0dXJuIC0xOworCisjaWZuZGVmIE1BQ09TCisgICAgZm9yIChpID0gMDsgZW52aXJvbltpXTsgaSsrKQorICAgIHsKKwllbGVtID0gKGNoYXIgKilhbGxvYygodW5zaWduZWQpKHN0cmxlbihlbnZpcm9uW2ldKSArIDEpKTsKKwlpZiAoZWxlbSA9PSBOVUxMKQorCSAgICByZXR1cm4gLTE7CisJZW52W2ldID0gZWxlbTsKKwlzdHJjcHkoZWxlbSwgZW52aXJvbltpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBlbnZbaV0gPSAwOworICAgIGVudmlyb24gPSBlbnY7CisgICAgZW52c2l6ZSA9IGVzaXplOworICAgIHJldHVybiAwOworfQorCisgICAgc3RhdGljIGludAorbW9yZWVudigpCit7CisgICAgaW50CSAgICBlc2l6ZTsKKyAgICBjaGFyICAgICoqZW52OworCisgICAgZXNpemUgPSBlbnZzaXplICsgRVhUUkFTSVpFOworICAgIGVudiA9IChjaGFyICoqKXZpbV9yZWFsbG9jKChjaGFyICopZW52aXJvbiwgZXNpemUgKiBzaXplb2YgKCplbnYpKTsKKyAgICBpZiAoZW52ID09IDApCisJcmV0dXJuIC0xOworICAgIGVudmlyb24gPSBlbnY7CisgICAgZW52c2l6ZSA9IGVzaXplOworICAgIHJldHVybiAwOworfQorCisjIGlmZGVmIFVTRV9WSU1QVFlfR0VURU5WCisgICAgY2hhcl91ICoKK3ZpbXB0eV9nZXRlbnYoc3RyaW5nKQorICAgIGNvbnN0IGNoYXJfdSAqc3RyaW5nOworeworICAgIGludCBpOworICAgIGNoYXJfdSAqcDsKKworICAgIGlmIChlbnZzaXplIDwgMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGkgPSBmaW5kZW52KChjaGFyICopc3RyaW5nKTsKKworICAgIGlmIChpIDwgMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHAgPSB2aW1fc3RyY2hyKChjaGFyX3UgKillbnZpcm9uW2ldLCAnPScpOworICAgIHJldHVybiAocCArIDEpOworfQorIyBlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9TRVRFTlYpICYmICFkZWZpbmVkKEhBVkVfUFVURU5WKSAqLworCisvKgorICogUHJpbnQgYSBtZXNzYWdlIHdpdGggb25lIHN0cmluZyBhcmd1bWVudC4KKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgZml0cyBpbiBJT2J1ZmYuCisgKiBUaGlzIGlzIG5vdCBpbiBtZXNzYWdlLmMsIGJlY2F1c2UgdGhlIHByb3RvdHlwZSBmb3Igc21zZygpIGlzbid0IHVzZWQKKyAqIHRoZXJlLgorICovCisgICAgdm9pZAorbXNnX3N0cihzLCBhcmcpCisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqYXJnOworeworICAgIGludAkJbHMgPSBTVFJMRU4ocyk7CisgICAgaW50CQlsYXJnID0gU1RSTEVOKGFyZyk7CisKKyAgICBpZiAobHMgKyBsYXJnID49IElPU0laRSkKKwlzbXNnKHMsIGFyZyArIChscyArIGxhcmcgLSBJT1NJWkUpKTsKKyAgICBlbHNlCisJc21zZyhzLCBhcmcpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21raW5zdGFsbGRpcnMgYi9zcmMvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGFlMzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSw0MCBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbgorCisjICRJZCQKKworZXJyc3RhdHVzPTAKKworZm9yIGZpbGUKK2RvCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZAorICAgZG8KKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgICBjYXNlICIkcGF0aGNvbXAiIGluCisgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgICBlc2FjCisKKyAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJZWNobyAibWtkaXIgJHBhdGhjb21wIiAxPiYyCisKKwlta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKwlpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKwkgIGVycnN0YXR1cz0kbGFzdGVycgorCWZpCisgICAgIGZpCisKKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisgICBkb25lCitkb25lCisKK2V4aXQgJGVycnN0YXR1cworCisjIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9zcmMvbW92ZS5jIGIvc3JjL21vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWEwZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vdmUuYwpAQCAtMCwwICsxLDI3OTYgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKy8qCisgKiBtb3ZlLmM6IEZ1bmN0aW9ucyBmb3IgbW92aW5nIHRoZSBjdXJzb3IgYW5kIHNjcm9sbGluZyB0ZXh0LgorICoKKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtb3ZlIHRoZSBjdXJzb3I6CisgKiAxLiBNb3ZlIHRoZSBjdXJzb3IgZGlyZWN0bHksIHRoZSB0ZXh0IGlzIHNjcm9sbGVkIHRvIGtlZXAgdGhlIGN1cnNvciBpbiB0aGUKKyAqICAgIHdpbmRvdy4KKyAqIDIuIFNjcm9sbCB0aGUgdGV4dCwgdGhlIGN1cnNvciBpcyBtb3ZlZCBpbnRvIHRoZSB0ZXh0IHZpc2libGUgaW4gdGhlCisgKiAgICB3aW5kb3cuCisgKiBUaGUgJ3Njcm9sbG9mZicgb3B0aW9uIG1ha2VzIHRoaXMgYSBiaXQgY29tcGxpY2F0ZWQuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCitzdGF0aWMgdm9pZCBjb21wX2JvdGxpbmUgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyBpbnQgY2hlY2tfdG9wX29mZnNldCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGN1cnNfcm93cyBfX0FSR1MoKHdpbl9UICp3cCwgaW50IGRvX2JvdGxpbmUpKTsKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX2JvdGxpbmVfd2luIF9fQVJHUygod2luX1QgKndwKSk7CitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9jaGVpZ2h0IF9fQVJHUygodm9pZCkpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGxpbmVucl9UCSAgICBsbnVtOwkvKiBsaW5lIG51bWJlciAqLworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJICAgIGZpbGw7CS8qIGZpbGxlciBsaW5lcyAqLworI2VuZGlmCisgICAgaW50CQkgICAgaGVpZ2h0OwkvKiBoZWlnaHQgb2YgYWRkZWQgbGluZSAqLworfSBsaW5lb2ZmX1Q7CisKK3N0YXRpYyB2b2lkIHRvcGxpbmVfYmFjayBfX0FSR1MoKGxpbmVvZmZfVCAqbHApKTsKK3N0YXRpYyB2b2lkIGJvdGxpbmVfZm9ydyBfX0FSR1MoKGxpbmVvZmZfVCAqbHApKTsKKyNpZmRlZiBGRUFUX0RJRkYKK3N0YXRpYyB2b2lkIGJvdGxpbmVfdG9wbGluZSBfX0FSR1MoKGxpbmVvZmZfVCAqbHApKTsKK3N0YXRpYyB2b2lkIHRvcGxpbmVfYm90bGluZSBfX0FSR1MoKGxpbmVvZmZfVCAqbHApKTsKK3N0YXRpYyB2b2lkIG1heF90b3BmaWxsIF9fQVJHUygodm9pZCkpOworI2VuZGlmCisKKy8qCisgKiBDb21wdXRlIHdwLT53X2JvdGxpbmUgZm9yIHRoZSBjdXJyZW50IHdwLT53X3RvcGxpbmUuICBDYW4gYmUgY2FsbGVkIGFmdGVyCisgKiB3cC0+d190b3BsaW5lIGNoYW5nZWQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY29tcF9ib3RsaW5lKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBpbnQJCW47CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCWRvbmU7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgbGluZW5yX1QgICAgbGFzdDsKKyAgICBpbnQJCWZvbGRlZDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB3X2NsaW5lX3JvdyBpcyB2YWxpZCwgc3RhcnQgdGhlcmUuCisgICAgICogT3RoZXJ3aXNlIGhhdmUgdG8gc3RhcnQgYXQgd190b3BsaW5lLgorICAgICAqLworICAgIGNoZWNrX2N1cnNvcl9tb3ZlZCh3cCk7CisgICAgaWYgKHdwLT53X3ZhbGlkICYgVkFMSURfQ1JPVykKKyAgICB7CisJbG51bSA9IHdwLT53X2N1cnNvci5sbnVtOworCWRvbmUgPSB3cC0+d19jbGluZV9yb3c7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbG51bSA9IHdwLT53X3RvcGxpbmU7CisJZG9uZSA9IDA7CisgICAgfQorCisgICAgZm9yICggOyBsbnVtIDw9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCWxhc3QgPSBsbnVtOworCWZvbGRlZCA9IEZBTFNFOworCWlmIChoYXNGb2xkaW5nV2luKHdwLCBsbnVtLCBOVUxMLCAmbGFzdCwgVFJVRSwgTlVMTCkpCisJeworCSAgICBuID0gMTsKKwkgICAgZm9sZGVkID0gVFJVRTsKKwl9CisJZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisJICAgIGlmIChsbnVtID09IHdwLT53X3RvcGxpbmUpCisJCW4gPSBwbGluZXNfd2luX25vZmlsbCh3cCwgbG51bSwgVFJVRSkgKyB3cC0+d190b3BmaWxsOworCSAgICBlbHNlCisjZW5kaWYKKwkJbiA9IHBsaW5lc193aW4od3AsIGxudW0sIFRSVUUpOworCWlmICgKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJbG51bSA8PSB3cC0+d19jdXJzb3IubG51bSAmJiBsYXN0ID49IHdwLT53X2N1cnNvci5sbnVtCisjZWxzZQorCQlsbnVtID09IHdwLT53X2N1cnNvci5sbnVtCisjZW5kaWYKKwkgICApCisJeworCSAgICB3cC0+d19jbGluZV9yb3cgPSBkb25lOworCSAgICB3cC0+d19jbGluZV9oZWlnaHQgPSBuOworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICB3cC0+d19jbGluZV9mb2xkZWQgPSBmb2xkZWQ7CisjZW5kaWYKKwkgICAgd3AtPndfdmFsaWQgfD0gKFZBTElEX0NST1d8VkFMSURfQ0hFSUdIVCk7CisJfQorCWlmIChkb25lICsgbiA+IHdwLT53X2hlaWdodCkKKwkgICAgYnJlYWs7CisJZG9uZSArPSBuOworI2lmZGVmIEZFQVRfRk9MRElORworCWxudW0gPSBsYXN0OworI2VuZGlmCisgICAgfQorCisgICAgLyogd3AtPndfYm90bGluZSBpcyB0aGUgbGluZSB0aGF0IGlzIGp1c3QgYmVsb3cgdGhlIHdpbmRvdyAqLworICAgIHdwLT53X2JvdGxpbmUgPSBsbnVtOworICAgIHdwLT53X3ZhbGlkIHw9IFZBTElEX0JPVExJTkV8VkFMSURfQk9UTElORV9BUDsKKworICAgIHNldF9lbXB0eV9yb3dzKHdwLCBkb25lKTsKK30KKworLyoKKyAqIFVwZGF0ZSBjdXJ3aW4tPndfdG9wbGluZSBhbmQgcmVkcmF3IGlmIG5lY2Vzc2FyeS4KKyAqIFVzZWQgdG8gdXBkYXRlIHRoZSBzY3JlZW4gYmVmb3JlIHByaW50aW5nIGEgbWVzc2FnZS4KKyAqLworICAgIHZvaWQKK3VwZGF0ZV90b3BsaW5lX3JlZHJhdygpCit7CisgICAgdXBkYXRlX3RvcGxpbmUoKTsKKyAgICBpZiAobXVzdF9yZWRyYXcpCisJdXBkYXRlX3NjcmVlbigwKTsKK30KKworLyoKKyAqIFVwZGF0ZSBjdXJ3aW4tPndfdG9wbGluZSB0byBtb3ZlIHRoZSBjdXJzb3Igb250byB0aGUgc2NyZWVuLgorICovCisgICAgdm9pZAordXBkYXRlX3RvcGxpbmUoKQoreworICAgIGxvbmcJbGluZV9jb3VudDsKKyAgICBpbnQJCWhhbGZoZWlnaHQ7CisgICAgaW50CQluOworICAgIGxpbmVucl9UCW9sZF90b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJb2xkX3RvcGZpbGw7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBsaW5lbnJfVAlsbnVtOworI2VuZGlmCisgICAgaW50CQljaGVja190b3BsaW5lID0gRkFMU0U7CisgICAgaW50CQljaGVja19ib3RsaW5lID0gRkFMU0U7CisjaWZkZWYgRkVBVF9NT1VTRQorICAgIGludAkJc2F2ZV9zbyA9IHBfc287CisjZW5kaWYKKworICAgIGlmICghc2NyZWVuX3ZhbGlkKFRSVUUpKQorCXJldHVybjsKKworICAgIGNoZWNrX2N1cnNvcl9tb3ZlZChjdXJ3aW4pOworICAgIGlmIChjdXJ3aW4tPndfdmFsaWQgJiBWQUxJRF9UT1BMSU5FKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICAvKiBXaGVuIGRyYWdnaW5nIHdpdGggdGhlIG1vdXNlLCBkb24ndCBzY3JvbGwgdGhhdCBxdWlja2x5ICovCisgICAgaWYgKG1vdXNlX2RyYWdnaW5nKQorCXBfc28gPSBtb3VzZV9kcmFnZ2luZyAtIDE7CisjZW5kaWYKKworICAgIG9sZF90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgb2xkX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBhbHdheXMgc2V0IHRvcGxpbmUgdG8gMS4KKyAgICAgKi8KKyAgICBpZiAoYnVmZW1wdHkoKSkJCS8qIHNwZWNpYWwgY2FzZSAtIGZpbGUgaXMgZW1wdHkgKi8KKyAgICB7CisJaWYgKGN1cndpbi0+d190b3BsaW5lICE9IDEpCisJICAgIHJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworCWN1cndpbi0+d190b3BsaW5lID0gMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwljdXJ3aW4tPndfdG9wZmlsbCA9IDA7CisjZW5kaWYKKwljdXJ3aW4tPndfYm90bGluZSA9IDI7CisJY3Vyd2luLT53X3ZhbGlkIHw9IFZBTElEX0JPVExJTkV8VkFMSURfQk9UTElORV9BUDsKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwljdXJ3aW4tPndfc2NiaW5kX3BvcyA9IDE7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjdXJzb3IgaXMgYWJvdmUgb3IgbmVhciB0aGUgdG9wIG9mIHRoZSB3aW5kb3csIHNjcm9sbCB0aGUgd2luZG93CisgICAgICogdG8gc2hvdyB0aGUgbGluZSB0aGUgY3Vyc29yIGlzIGluLCB3aXRoICdzY3JvbGxvZmYnIGNvbnRleHQuCisgICAgICovCisgICAgZWxzZQorICAgIHsKKwlpZiAoY3Vyd2luLT53X3RvcGxpbmUgPiAxKQorCXsKKwkgICAgLyogSWYgdGhlIGN1cnNvciBpcyBhYm92ZSB0b3BsaW5lLCBzY3JvbGxpbmcgaXMgYWx3YXlzIG5lZWRlZC4KKwkgICAgICogSWYgdGhlIGN1cnNvciBpcyBmYXIgYmVsb3cgdG9wbGluZSBhbmQgdGhlcmUgaXMgbm8gZm9sZGluZywKKwkgICAgICogc2Nyb2xsaW5nIGRvd24gaXMgbmV2ZXIgbmVlZGVkLiAqLworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3Vyd2luLT53X3RvcGxpbmUpCisJCWNoZWNrX3RvcGxpbmUgPSBUUlVFOworCSAgICBlbHNlIGlmIChjaGVja190b3Bfb2Zmc2V0KCkpCisJCWNoZWNrX3RvcGxpbmUgPSBUUlVFOworCX0KKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZmlsbGVyIGxpbmVzIHRoYW4gYWxsb3dlZC4gKi8KKwlpZiAoIWNoZWNrX3RvcGxpbmUgJiYgY3Vyd2luLT53X3RvcGZpbGwgPiBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLAorCQkJCQkJCSAgIGN1cndpbi0+d190b3BsaW5lKSkKKwkgICAgY2hlY2tfdG9wbGluZSA9IFRSVUU7CisjZW5kaWYKKworCWlmIChjaGVja190b3BsaW5lKQorCXsKKwkgICAgaGFsZmhlaWdodCA9IGN1cndpbi0+d19oZWlnaHQgLyAyIC0gMTsKKwkgICAgaWYgKGhhbGZoZWlnaHQgPCAyKQorCQloYWxmaGVpZ2h0ID0gMjsKKworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoaGFzQW55Rm9sZGluZyhjdXJ3aW4pKQorCSAgICB7CisJCS8qIENvdW50IHRoZSBudW1iZXIgb2YgbG9naWNhbCBsaW5lcyBiZXR3ZWVuIHRoZSBjdXJzb3IgYW5kCisJCSAqIHRvcGxpbmUgKyBwX3NvIChhcHByb3hpbWF0aW9uIG9mIGhvdyBtdWNoIHdpbGwgYmUKKwkJICogc2Nyb2xsZWQpLiAqLworCQluID0gMDsKKwkJZm9yIChsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkJCSAgICAgIGxudW0gPCBjdXJ3aW4tPndfdG9wbGluZSArIHBfc287ICsrbG51bSkKKwkJeworCQkgICAgKytuOworCQkgICAgLyogc3RvcCBhdCBlbmQgb2YgZmlsZSBvciB3aGVuIHdlIGtub3cgd2UgYXJlIGZhciBvZmYgKi8KKwkJICAgIGlmIChsbnVtID49IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IHx8IG4gPj0gaGFsZmhlaWdodCkKKwkJCWJyZWFrOworCQkgICAgKHZvaWQpaGFzRm9sZGluZyhsbnVtLCBOVUxMLCAmbG51bSk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJbiA9IGN1cndpbi0+d190b3BsaW5lICsgcF9zbyAtIGN1cndpbi0+d19jdXJzb3IubG51bTsKKworCSAgICAvKiBJZiB3ZSB3ZXJlbid0IHZlcnkgY2xvc2UgdG8gYmVnaW4gd2l0aCwgd2Ugc2Nyb2xsIHRvIHB1dCB0aGUKKwkgICAgICogY3Vyc29yIGluIHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdy4gIE90aGVyd2lzZSBwdXQgdGhlIGN1cnNvcgorCSAgICAgKiBuZWFyIHRoZSB0b3Agb2YgdGhlIHdpbmRvdy4gKi8KKwkgICAgaWYgKG4gPj0gaGFsZmhlaWdodCkKKwkJc2Nyb2xsX2N1cnNvcl9oYWxmd2F5KEZBTFNFKTsKKwkgICAgZWxzZQorCSAgICB7CisJCXNjcm9sbF9jdXJzb3JfdG9wKChpbnQpcF9zaiwgRkFMU0UpOworCQljaGVja19ib3RsaW5lID0gVFJVRTsKKwkgICAgfQorCX0KKworCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIC8qIE1ha2Ugc3VyZSB0b3BsaW5lIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGEgZm9sZC4gKi8KKwkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfdG9wbGluZSwgJmN1cndpbi0+d190b3BsaW5lLCBOVUxMKTsKKyNlbmRpZgorCSAgICBjaGVja19ib3RsaW5lID0gVFJVRTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIGJlbG93IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdywgc2Nyb2xsIHRoZSB3aW5kb3cKKyAgICAgKiB0byBwdXQgdGhlIGN1cnNvciBvbiB0aGUgd2luZG93LgorICAgICAqIFdoZW4gd19ib3RsaW5lIGlzIGludmFsaWQsIHJlY29tcHV0ZSBpdCBmaXJzdCwgdG8gYXZvaWQgYSByZWRyYXcgbGF0ZXIuCisgICAgICogSWYgd19ib3RsaW5lIHdhcyBhcHByb3hpbWF0ZWQsIHdlIG1pZ2h0IG5lZWQgYSByZWRyYXcgbGF0ZXIgaW4gYSBmZXcKKyAgICAgKiBjYXNlcywgYnV0IHdlIGRvbid0IHdhbnQgdG8gc3BlbmQgKGEgbG90IG9mKSB0aW1lIHJlY29tcHV0aW5nIHdfYm90bGluZQorICAgICAqIGZvciBldmVyeSBzbWFsbCBjaGFuZ2UuCisgICAgICovCisgICAgaWYgKGNoZWNrX2JvdGxpbmUpCisgICAgeworCWlmICghKGN1cndpbi0+d192YWxpZCAmIFZBTElEX0JPVExJTkVfQVApKQorCSAgICB2YWxpZGF0ZV9ib3RsaW5lKCk7CisKKwlpZiAoY3Vyd2luLT53X2JvdGxpbmUgPD0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3Vyd2luLT53X2JvdGxpbmUKKwkJICAgICYmICgobG9uZyljdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJCQkJICAgICA+PSAobG9uZyljdXJ3aW4tPndfYm90bGluZSAtIHBfc28KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJCXx8IGhhc0FueUZvbGRpbmcoY3Vyd2luKQorI2VuZGlmCisJCQkpKQorCSAgICB7CisJCWxpbmVvZmZfVAlsb2ZmOworCisJCS8qIEN1cnNvciBpcyBhYm92ZSBib3RsaW5lLCBjaGVjayBpZiB0aGVyZSBhcmUgJ3Njcm9sbG9mZicKKwkJICogd2luZG93IGxpbmVzIGJlbG93IHRoZSBjdXJzb3IuICBJZiBub3QsIG5lZWQgdG8gc2Nyb2xsLiAqLworCQluID0gY3Vyd2luLT53X2VtcHR5X3Jvd3M7CisJCWxvZmYubG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJLyogSW4gYSBmb2xkIGdvIHRvIGl0cyBsYXN0IGxpbmUuICovCisJCSh2b2lkKWhhc0ZvbGRpbmcobG9mZi5sbnVtLCBOVUxMLCAmbG9mZi5sbnVtKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorCQlsb2ZmLmZpbGwgPSAwOworCQluICs9IGN1cndpbi0+d19maWxsZXJfcm93czsKKyNlbmRpZgorCQlsb2ZmLmhlaWdodCA9IDA7CisJCXdoaWxlIChsb2ZmLmxudW0gPCBjdXJ3aW4tPndfYm90bGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkJJiYgKGxvZmYubG51bSArIDEgPCBjdXJ3aW4tPndfYm90bGluZSB8fCBsb2ZmLmZpbGwgPT0gMCkKKyNlbmRpZgorCQkJKQorCQl7CisJCSAgICBuICs9IGxvZmYuaGVpZ2h0OworCQkgICAgaWYgKG4gPj0gcF9zbykKKwkJCWJyZWFrOworCQkgICAgYm90bGluZV9mb3J3KCZsb2ZmKTsKKwkJfQorCQlpZiAobiA+PSBwX3NvKQorCQkgICAgLyogc3VmZmljaWVudCBjb250ZXh0LCBubyBuZWVkIHRvIHNjcm9sbCAqLworCQkgICAgY2hlY2tfYm90bGluZSA9IEZBTFNFOworCSAgICB9CisJICAgIGlmIChjaGVja19ib3RsaW5lKQorCSAgICB7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWlmIChoYXNBbnlGb2xkaW5nKGN1cndpbikpCisJCXsKKwkJICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgbG9naWNhbCBsaW5lcyBiZXR3ZWVuIHRoZSBjdXJzb3IgYW5kCisJCSAgICAgKiBib3RsaW5lIC0gcF9zbyAoYXBwcm94aW1hdGlvbiBvZiBob3cgbXVjaCB3aWxsIGJlCisJCSAgICAgKiBzY3JvbGxlZCkuICovCisJCSAgICBsaW5lX2NvdW50ID0gMDsKKwkJICAgIGZvciAobG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJCQkgICAgIGxudW0gPj0gY3Vyd2luLT53X2JvdGxpbmUgLSBwX3NvOyAtLWxudW0pCisJCSAgICB7CisJCQkrK2xpbmVfY291bnQ7CisJCQkvKiBzdG9wIGF0IGVuZCBvZiBmaWxlIG9yIHdoZW4gd2Uga25vdyB3ZSBhcmUgZmFyIG9mZiAqLworCQkJaWYgKGxudW0gPD0gMCB8fCBsaW5lX2NvdW50ID4gY3Vyd2luLT53X2hlaWdodCArIDEpCisJCQkgICAgYnJlYWs7CisJCQkodm9pZCloYXNGb2xkaW5nKGxudW0sICZsbnVtLCBOVUxMKTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisjZW5kaWYKKwkJICAgIGxpbmVfY291bnQgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSBjdXJ3aW4tPndfYm90bGluZQorCQkJCQkJCQkgICArIDEgKyBwX3NvOworCQlpZiAobGluZV9jb3VudCA8PSBjdXJ3aW4tPndfaGVpZ2h0ICsgMSkKKwkJICAgIHNjcm9sbF9jdXJzb3JfYm90KChpbnQpcF9zaiwgRkFMU0UpOworCQllbHNlCisJCSAgICBzY3JvbGxfY3Vyc29yX2hhbGZ3YXkoRkFMU0UpOworCSAgICB9CisJfQorICAgIH0KKyAgICBjdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKKworICAgIC8qCisgICAgICogTmVlZCB0byByZWRyYXcgd2hlbiB0b3BsaW5lIGNoYW5nZWQuCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d190b3BsaW5lICE9IG9sZF90b3BsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJICAgIHx8IGN1cndpbi0+d190b3BmaWxsICE9IG9sZF90b3BmaWxsCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwlkb2xsYXJfdmNvbCA9IDA7CisJaWYgKGN1cndpbi0+d19za2lwY29sKQorCXsKKwkgICAgY3Vyd2luLT53X3NraXBjb2wgPSAwOworCSAgICByZWRyYXdfbGF0ZXIoTk9UX1ZBTElEKTsKKwl9CisJZWxzZQorCSAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworCS8qIE1heSBuZWVkIHRvIHNldCB3X3NraXBjb2wgd2hlbiBjdXJzb3IgaW4gd190b3BsaW5lLiAqLworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3Vyd2luLT53X3RvcGxpbmUpCisJICAgIHZhbGlkYXRlX2N1cnNvcigpOworICAgIH0KKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBwX3NvID0gc2F2ZV9zbzsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiB0aGVyZSBhcmUgbm90ICdzY3JvbGxvZmYnIGxpbmVzIGFib3ZlIHRoZSBjdXJzb3IgZm9yIHRoZQorICogY3VycmVudCB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGVja190b3Bfb2Zmc2V0KCkKK3sKKyAgICBsaW5lb2ZmX1QJbG9mZjsKKyAgICBpbnQJCW47CisKKyAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3Vyd2luLT53X3RvcGxpbmUgKyBwX3NvCisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSAgICB8fCBoYXNBbnlGb2xkaW5nKGN1cndpbikKKyNlbmRpZgorCSAgICApCisgICAgeworCWxvZmYubG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKyNpZmRlZiBGRUFUX0RJRkYKKwlsb2ZmLmZpbGwgPSAwOworCW4gPSBjdXJ3aW4tPndfdG9wZmlsbDsJICAgIC8qIGFsd2F5cyBoYXZlIHRoaXMgY29udGV4dCAqLworI2Vsc2UKKwluID0gMDsKKyNlbmRpZgorCS8qIENvdW50IHRoZSB2aXNpYmxlIHNjcmVlbiBsaW5lcyBhYm92ZSB0aGUgY3Vyc29yIGxpbmUuICovCisJd2hpbGUgKG4gPCBwX3NvKQorCXsKKwkgICAgdG9wbGluZV9iYWNrKCZsb2ZmKTsKKwkgICAgLyogU3RvcCB3aGVuIGluY2x1ZGVkIGEgbGluZSBhYm92ZSB0aGUgd2luZG93LiAqLworCSAgICBpZiAobG9mZi5sbnVtIDwgY3Vyd2luLT53X3RvcGxpbmUKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIHx8IChsb2ZmLmxudW0gPT0gY3Vyd2luLT53X3RvcGxpbmUgJiYgbG9mZi5maWxsID4gMCkKKyNlbmRpZgorCQkgICAgKQorCQlicmVhazsKKwkgICAgbiArPSBsb2ZmLmhlaWdodDsKKwl9CisJaWYgKG4gPCBwX3NvKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisgICAgdm9pZAordXBkYXRlX2N1cnN3YW50KCkKK3sKKyAgICBpZiAoY3Vyd2luLT53X3NldF9jdXJzd2FudCkKKyAgICB7CisJdmFsaWRhdGVfdmlydGNvbCgpOworCWN1cndpbi0+d19jdXJzd2FudCA9IGN1cndpbi0+d192aXJ0Y29sOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBGQUxTRTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgY3Vyc29yIGhhcyBtb3ZlZC4gIFNldCB0aGUgd192YWxpZCBmbGFnIGFjY29yZGluZ2x5LgorICovCisgICAgdm9pZAorY2hlY2tfY3Vyc29yX21vdmVkKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBpZiAod3AtPndfY3Vyc29yLmxudW0gIT0gd3AtPndfdmFsaWRfY3Vyc29yLmxudW0pCisgICAgeworCXdwLT53X3ZhbGlkICY9IH4oVkFMSURfV1JPV3xWQUxJRF9XQ09MfFZBTElEX1ZJUlRDT0wKKwkJCQkgICAgIHxWQUxJRF9DSEVJR0hUfFZBTElEX0NST1d8VkFMSURfVE9QTElORSk7CisJd3AtPndfdmFsaWRfY3Vyc29yID0gd3AtPndfY3Vyc29yOworCXdwLT53X3ZhbGlkX2xlZnRjb2wgPSB3cC0+d19sZWZ0Y29sOworICAgIH0KKyAgICBlbHNlIGlmICh3cC0+d19jdXJzb3IuY29sICE9IHdwLT53X3ZhbGlkX2N1cnNvci5jb2wKKwkgICAgIHx8IHdwLT53X2xlZnRjb2wgIT0gd3AtPndfdmFsaWRfbGVmdGNvbAorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgIHx8IHdwLT53X2N1cnNvci5jb2xhZGQgIT0gd3AtPndfdmFsaWRfY3Vyc29yLmNvbGFkZAorI2VuZGlmCisJICAgICApCisgICAgeworCXdwLT53X3ZhbGlkICY9IH4oVkFMSURfV1JPV3xWQUxJRF9XQ09MfFZBTElEX1ZJUlRDT0wpOworCXdwLT53X3ZhbGlkX2N1cnNvci5jb2wgPSB3cC0+d19jdXJzb3IuY29sOworCXdwLT53X3ZhbGlkX2xlZnRjb2wgPSB3cC0+d19sZWZ0Y29sOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwl3cC0+d192YWxpZF9jdXJzb3IuY29sYWRkID0gd3AtPndfY3Vyc29yLmNvbGFkZDsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHNvbWUgd2luZG93IHNldHRpbmdzIGhhdmUgY2hhbmdlZCwgd2hpY2ggcmVxdWlyZQorICogdGhlIGN1cnNvciBwb3NpdGlvbiwgYm90bGluZSBhbmQgdG9wbGluZSB0byBiZSByZWNvbXB1dGVkIGFuZCB0aGUgd2luZG93IHRvCisgKiBiZSByZWRyYXduLiAgRS5nLCB3aGVuIGNoYW5naW5nIHRoZSAnd3JhcCcgb3B0aW9uIG9yIGZvbGRpbmcuCisgKi8KKyAgICB2b2lkCitjaGFuZ2VkX3dpbmRvd19zZXR0aW5nKCkKK3sKKyAgICBjaGFuZ2VkX3dpbmRvd19zZXR0aW5nX3dpbihjdXJ3aW4pOworfQorCisgICAgdm9pZAorY2hhbmdlZF93aW5kb3dfc2V0dGluZ193aW4od3ApCisgICAgd2luX1QJKndwOworeworICAgIHdwLT53X2xpbmVzX3ZhbGlkID0gMDsKKyAgICBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnNfd2luKHdwKTsKKyAgICB3cC0+d192YWxpZCAmPSB+KFZBTElEX0JPVExJTkV8VkFMSURfQk9UTElORV9BUHxWQUxJRF9UT1BMSU5FKTsKKyAgICByZWRyYXdfd2luX2xhdGVyKHdwLCBOT1RfVkFMSUQpOworfQorCisvKgorICogU2V0IHdwLT53X3RvcGxpbmUgdG8gYSBjZXJ0YWluIG51bWJlci4KKyAqLworICAgIHZvaWQKK3NldF90b3BsaW5lKHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworeworI2lmZGVmIEZFQVRfRk9MRElORworICAgIC8qIGdvIHRvIGZpcnN0IG9mIGZvbGRlZCBsaW5lcyAqLworICAgICh2b2lkKWhhc0ZvbGRpbmdXaW4od3AsIGxudW0sICZsbnVtLCBOVUxMLCBUUlVFLCBOVUxMKTsKKyNlbmRpZgorICAgIC8qIEFwcHJveGltYXRlIHRoZSB2YWx1ZSBvZiB3X2JvdGxpbmUgKi8KKyAgICB3cC0+d19ib3RsaW5lICs9IGxudW0gLSB3cC0+d190b3BsaW5lOworICAgIHdwLT53X3RvcGxpbmUgPSBsbnVtOworI2lmZGVmIEZFQVRfRElGRgorICAgIHdwLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisgICAgd3AtPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORXxWQUxJRF9UT1BMSU5FKTsKKyAgICAvKiBEb24ndCBzZXQgVkFMSURfVE9QTElORSBoZXJlLCAnc2Nyb2xsb2ZmJyBuZWVkcyB0byBiZSBjaGVja2VkLiAqLworICAgIHJlZHJhd19sYXRlcihWQUxJRCk7Cit9CisKKy8qCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJzb3IgbGluZSAoaW4gc2NyZWVuCisgKiBjaGFyYWN0ZXJzKSBoYXMgY2hhbmdlZCwgYW5kIHRoZSBjaGFuZ2UgaXMgYmVmb3JlIHRoZSBjdXJzb3IuCisgKiBOZWVkIHRvIHRha2UgY2FyZSBvZiB3X2JvdGxpbmUgc2VwYXJhdGVseSEKKyAqLworICAgIHZvaWQKK2NoYW5nZWRfY2xpbmVfYmVmX2N1cnMoKQoreworICAgIGN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9WSVJUQ09MCisJCQkJCQl8VkFMSURfQ0hFSUdIVHxWQUxJRF9UT1BMSU5FKTsKK30KKworICAgIHZvaWQKK2NoYW5nZWRfY2xpbmVfYmVmX2N1cnNfd2luKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICB3cC0+d192YWxpZCAmPSB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9WSVJUQ09MCisJCQkJCQl8VkFMSURfQ0hFSUdIVHxWQUxJRF9UT1BMSU5FKTsKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KKy8qCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJzb3IgbGluZSAoaW4gc2NyZWVuCisgKiBjaGFyYWN0ZXJzKSBoYXMgY2hhbmdlZCwgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGRvZXNuJ3QgY2hhbmdlLgorICogTmVlZCB0byB0YWtlIGNhcmUgb2Ygd19ib3RsaW5lIHNlcGFyYXRlbHkhCisgKi8KKyAgICB2b2lkCitjaGFuZ2VkX2NsaW5lX2FmdF9jdXJzKCkKK3sKKyAgICBjdXJ3aW4tPndfdmFsaWQgJj0gflZBTElEX0NIRUlHSFQ7Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsZW5ndGggb2YgYSBsaW5lIChpbiBzY3JlZW4gY2hhcmFjdGVycykgYWJvdmUKKyAqIHRoZSBjdXJzb3IgaGF2ZSBjaGFuZ2VkLgorICogTmVlZCB0byB0YWtlIGNhcmUgb2Ygd19ib3RsaW5lIHNlcGFyYXRlbHkhCisgKi8KKyAgICB2b2lkCitjaGFuZ2VkX2xpbmVfYWJ2X2N1cnMoKQoreworICAgIGN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9WSVJUQ09MfFZBTElEX0NST1cKKwkJCQkJCXxWQUxJRF9DSEVJR0hUfFZBTElEX1RPUExJTkUpOworfQorCisgICAgdm9pZAorY2hhbmdlZF9saW5lX2Fidl9jdXJzX3dpbih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgd3AtPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX1dDT0x8VkFMSURfVklSVENPTHxWQUxJRF9DUk9XCisJCQkJCQl8VkFMSURfQ0hFSUdIVHxWQUxJRF9UT1BMSU5FKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgdmFsdWUgb2YgY3Vyd2luLT53X2JvdGxpbmUgaXMgdmFsaWQuCisgKi8KKyAgICB2b2lkCit2YWxpZGF0ZV9ib3RsaW5lKCkKK3sKKyAgICBpZiAoIShjdXJ3aW4tPndfdmFsaWQgJiBWQUxJRF9CT1RMSU5FKSkKKwljb21wX2JvdGxpbmUoY3Vyd2luKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgdmFsdWUgb2Ygd3AtPndfYm90bGluZSBpcyB2YWxpZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCit2YWxpZGF0ZV9ib3RsaW5lX3dpbih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaWYgKCEod3AtPndfdmFsaWQgJiBWQUxJRF9CT1RMSU5FKSkKKwljb21wX2JvdGxpbmUod3ApOworfQorCisvKgorICogTWFyayBjdXJ3aW4tPndfYm90bGluZSBhcyBpbnZhbGlkIChiZWNhdXNlIG9mIHNvbWUgY2hhbmdlIGluIHRoZSBidWZmZXIpLgorICovCisgICAgdm9pZAoraW52YWxpZGF0ZV9ib3RsaW5lKCkKK3sKKyAgICBjdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9CT1RMSU5FfFZBTElEX0JPVExJTkVfQVApOworfQorCisgICAgdm9pZAoraW52YWxpZGF0ZV9ib3RsaW5lX3dpbih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgd3AtPndfdmFsaWQgJj0gfihWQUxJRF9CT1RMSU5FfFZBTElEX0JPVExJTkVfQVApOworfQorCisjaWYgMCAvKiBuZXZlciB1c2VkICovCisvKgorICogTWFyayBjdXJ3aW4tPndfYm90bGluZSBhcyBhcHByb3hpbWF0ZWQgKGJlY2F1c2Ugb2Ygc29tZSBzbWFsbCBjaGFuZ2UgaW4gdGhlCisgKiBidWZmZXIpLgorICovCisgICAgdm9pZAorYXBwcm94aW1hdGVfYm90bGluZSgpCit7CisgICAgY3Vyd2luLT53X3ZhbGlkICY9IH5WQUxJRF9CT1RMSU5FOworfQorI2VuZGlmCisKKyAgICB2b2lkCithcHByb3hpbWF0ZV9ib3RsaW5lX3dpbih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgd3AtPndfdmFsaWQgJj0gflZBTElEX0JPVExJTkU7Cit9CisKKyNpZiAwIC8qIG5vdCB1c2VkICovCisvKgorICogUmV0dXJuIFRSVUUgaWYgY3Vyd2luLT53X2JvdGxpbmUgaXMgdmFsaWQuCisgKi8KKyAgICBpbnQKK2JvdGxpbmVfdmFsaWQoKQoreworICAgIHJldHVybiAoY3Vyd2luLT53X3ZhbGlkICYgVkFMSURfQk9UTElORSk7Cit9CisjZW5kaWYKKworI2lmIDAgLyogbm90IHVzZWQgKi8KKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBjdXJ3aW4tPndfYm90bGluZSBpcyB2YWxpZCBvciBhcHByb3hpbWF0ZWQuCisgKi8KKyAgICBpbnQKK2JvdGxpbmVfYXBwcm94aW1hdGVkKCkKK3sKKyAgICByZXR1cm4gKGN1cndpbi0+d192YWxpZCAmIFZBTElEX0JPVExJTkVfQVApOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBjdXJ3aW4tPndfd3JvdyBhbmQgY3Vyd2luLT53X3djb2wgYXJlIHZhbGlkLgorICovCisgICAgaW50CitjdXJzb3JfdmFsaWQoKQoreworICAgIGNoZWNrX2N1cnNvcl9tb3ZlZChjdXJ3aW4pOworICAgIHJldHVybiAoKGN1cndpbi0+d192YWxpZCAmIChWQUxJRF9XUk9XfFZBTElEX1dDT0wpKSA9PQorCQkJCQkJICAgICAgKFZBTElEX1dST1d8VkFMSURfV0NPTCkpOworfQorCisvKgorICogVmFsaWRhdGUgY3Vyc29yIHBvc2l0aW9uLiAgTWFrZXMgc3VyZSB3X3dyb3cgYW5kIHdfd2NvbCBhcmUgdmFsaWQuCisgKiB3X3RvcGxpbmUgbXVzdCBiZSB2YWxpZCwgeW91IG1heSBuZWVkIHRvIGNhbGwgdXBkYXRlX3RvcGxpbmUoKSBmaXJzdCEKKyAqLworICAgIHZvaWQKK3ZhbGlkYXRlX2N1cnNvcigpCit7CisgICAgY2hlY2tfY3Vyc29yX21vdmVkKGN1cndpbik7CisgICAgaWYgKChjdXJ3aW4tPndfdmFsaWQgJiAoVkFMSURfV0NPTHxWQUxJRF9XUk9XKSkgIT0gKFZBTElEX1dDT0x8VkFMSURfV1JPVykpCisJY3Vyc19jb2x1bW5zKFRSVUUpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiB2YWxpZGF0ZSB3X2NsaW5lX3Jvdy4KKyAqLworICAgIHZvaWQKK3ZhbGlkYXRlX2NsaW5lX3JvdygpCit7CisgICAgLyoKKyAgICAgKiBGaXJzdCBtYWtlIHN1cmUgdGhhdCB3X3RvcGxpbmUgaXMgdmFsaWQgKGFmdGVyIG1vdmluZyB0aGUgY3Vyc29yKS4KKyAgICAgKi8KKyAgICB1cGRhdGVfdG9wbGluZSgpOworICAgIGNoZWNrX2N1cnNvcl9tb3ZlZChjdXJ3aW4pOworICAgIGlmICghKGN1cndpbi0+d192YWxpZCAmIFZBTElEX0NST1cpKQorCWN1cnNfcm93cyhjdXJ3aW4sIEZBTFNFKTsKK30KKyNlbmRpZgorCisvKgorICogQ29tcHV0ZSB3cC0+d19jbGluZV9yb3cgYW5kIHdwLT53X2NsaW5lX2hlaWdodCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUKKyAqIG9mIHdwLT53X3RvcGluZS4KKyAqCisgKiBSZXR1cm5zIE9LIHdoZW4gY3Vyc29yIGlzIGluIHRoZSB3aW5kb3csIEZBSUwgd2hlbiBpdCBpc24ndC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjdXJzX3Jvd3Mod3AsIGRvX2JvdGxpbmUpCisgICAgd2luX1QJKndwOworICAgIGludAkJZG9fYm90bGluZTsJCS8qIGFsc28gY29tcHV0ZSB3X2JvdGxpbmUgKi8KK3sKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJaTsKKyAgICBpbnQJCWFsbF9pbnZhbGlkOworICAgIGludAkJdmFsaWQ7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgbG9uZwlmb2xkX2NvdW50OworI2VuZGlmCisKKyAgICAvKiBDaGVjayBpZiB3cC0+d19saW5lc1tdLndsX3NpemUgaXMgaW52YWxpZCAqLworICAgIGFsbF9pbnZhbGlkID0gKCFyZWRyYXdpbmcoKQorCQkJfHwgd3AtPndfbGluZXNfdmFsaWQgPT0gMAorCQkJfHwgd3AtPndfbGluZXNbMF0ud2xfbG51bSA+IHdwLT53X3RvcGxpbmUpOworICAgIGkgPSAwOworICAgIHdwLT53X2NsaW5lX3JvdyA9IDA7CisgICAgZm9yIChsbnVtID0gd3AtPndfdG9wbGluZTsgbG51bSA8IHdwLT53X2N1cnNvci5sbnVtOyArK2kpCisgICAgeworCXZhbGlkID0gRkFMU0U7CisJaWYgKCFhbGxfaW52YWxpZCAmJiBpIDwgd3AtPndfbGluZXNfdmFsaWQpCisJeworCSAgICBpZiAod3AtPndfbGluZXNbaV0ud2xfbG51bSA8IGxudW0gfHwgIXdwLT53X2xpbmVzW2ldLndsX3ZhbGlkKQorCQljb250aW51ZTsJCS8qIHNraXAgY2hhbmdlZCBvciBkZWxldGVkIGxpbmVzICovCisJICAgIGlmICh3cC0+d19saW5lc1tpXS53bF9sbnVtID09IGxudW0pCisJICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJLyogQ2hlY2sgZm9yIG5ld2x5IGluc2VydGVkIGxpbmVzIGJlbG93IHRoaXMgcm93LCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZvbGRlZCBsaW5lcy4gKi8KKwkJaWYgKCF3cC0+d19idWZmZXItPmJfbW9kX3NldAorCQkJfHwgd3AtPndfbGluZXNbaV0ud2xfbGFzdGxudW0gPCB3cC0+d19jdXJzb3IubG51bQorCQkJfHwgd3AtPndfYnVmZmVyLT5iX21vZF90b3AKKwkJCQkJICAgICA+IHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtICsgMSkKKyNlbmRpZgorCQl2YWxpZCA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAod3AtPndfbGluZXNbaV0ud2xfbG51bSA+IGxudW0pCisJCS0taTsJCQkvKiBob2xkIGF0IGluc2VydGVkIGxpbmVzICovCisJfQorCWlmICh2YWxpZAorI2lmZGVmIEZFQVRfRElGRgorCQkmJiAobG51bSAhPSB3cC0+d190b3BsaW5lIHx8ICF3cC0+d19wX2RpZmYpCisjZW5kaWYKKwkJKQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgbG51bSA9IHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtICsgMTsKKwkgICAgLyogQ3Vyc29yIGluc2lkZSBmb2xkZWQgbGluZXMsIGRvbid0IGNvdW50IHRoaXMgcm93ICovCisJICAgIGlmIChsbnVtID4gd3AtPndfY3Vyc29yLmxudW0pCisJCWJyZWFrOworI2Vsc2UKKwkgICAgKytsbnVtOworI2VuZGlmCisJICAgIHdwLT53X2NsaW5lX3JvdyArPSB3cC0+d19saW5lc1tpXS53bF9zaXplOworCX0KKwllbHNlCisJeworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBmb2xkX2NvdW50ID0gZm9sZGVkQ291bnQod3AsIGxudW0sIE5VTEwpOworCSAgICBpZiAoZm9sZF9jb3VudCkKKwkgICAgeworCQlsbnVtICs9IGZvbGRfY291bnQ7CisJCWlmIChsbnVtID4gd3AtPndfY3Vyc29yLmxudW0pCisJCSAgICBicmVhazsKKwkJKyt3cC0+d19jbGluZV9yb3c7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisJCWlmIChsbnVtID09IHdwLT53X3RvcGxpbmUpCisJCSAgICB3cC0+d19jbGluZV9yb3cgKz0gcGxpbmVzX3dpbl9ub2ZpbGwod3AsIGxudW0rKywgVFJVRSkKKwkJCQkJCQkgICAgICArIHdwLT53X3RvcGZpbGw7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgd3AtPndfY2xpbmVfcm93ICs9IHBsaW5lc193aW4od3AsIGxudW0rKywgVFJVRSk7CisJfQorICAgIH0KKworICAgIGNoZWNrX2N1cnNvcl9tb3ZlZCh3cCk7CisgICAgaWYgKCEod3AtPndfdmFsaWQgJiBWQUxJRF9DSEVJR0hUKSkKKyAgICB7CisJaWYgKGFsbF9pbnZhbGlkCisJCXx8IGkgPT0gd3AtPndfbGluZXNfdmFsaWQKKwkJfHwgKGkgPCB3cC0+d19saW5lc192YWxpZAorCQkgICAgJiYgKCF3cC0+d19saW5lc1tpXS53bF92YWxpZAorCQkJfHwgd3AtPndfbGluZXNbaV0ud2xfbG51bSAhPSB3cC0+d19jdXJzb3IubG51bSkpKQorCXsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgaWYgKHdwLT53X2N1cnNvci5sbnVtID09IHdwLT53X3RvcGxpbmUpCisJCXdwLT53X2NsaW5lX2hlaWdodCA9IHBsaW5lc193aW5fbm9maWxsKHdwLCB3cC0+d19jdXJzb3IubG51bSwKKwkJCQkJCQlUUlVFKSArIHdwLT53X3RvcGZpbGw7CisJICAgIGVsc2UKKyNlbmRpZgorCQl3cC0+d19jbGluZV9oZWlnaHQgPSBwbGluZXNfd2luKHdwLCB3cC0+d19jdXJzb3IubG51bSwgVFJVRSk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIHdwLT53X2NsaW5lX2ZvbGRlZCA9IGhhc0ZvbGRpbmdXaW4od3AsIHdwLT53X2N1cnNvci5sbnVtLAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCwgVFJVRSwgTlVMTCk7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoaSA+IHdwLT53X2xpbmVzX3ZhbGlkKQorCXsKKwkgICAgLyogYSBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgdG8gZml0IG9uIHRoZSBsYXN0IHNjcmVlbiBsaW5lICovCisJICAgIHdwLT53X2NsaW5lX2hlaWdodCA9IDA7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIHdwLT53X2NsaW5lX2ZvbGRlZCA9IGhhc0ZvbGRpbmdXaW4od3AsIHdwLT53X2N1cnNvci5sbnVtLAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCwgVFJVRSwgTlVMTCk7CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKwkgICAgd3AtPndfY2xpbmVfaGVpZ2h0ID0gd3AtPndfbGluZXNbaV0ud2xfc2l6ZTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgd3AtPndfY2xpbmVfZm9sZGVkID0gd3AtPndfbGluZXNbaV0ud2xfZm9sZGVkOworI2VuZGlmCisJfQorICAgIH0KKworICAgIHdwLT53X3ZhbGlkIHw9IFZBTElEX0NST1d8VkFMSURfQ0hFSUdIVDsKKworICAgIC8qIHZhbGlkYXRlIGJvdGxpbmUgdG9vLCBpZiB1cGRhdGVfc2NyZWVuIGRvZXNuJ3QgZG8gaXQgKi8KKyAgICBpZiAoZG9fYm90bGluZSAmJiBhbGxfaW52YWxpZCkKKwl2YWxpZGF0ZV9ib3RsaW5lX3dpbih3cCk7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSBjdXJ3aW4tPndfdmlydGNvbCBvbmx5LgorICovCisgICAgdm9pZAordmFsaWRhdGVfdmlydGNvbCgpCit7CisgICAgdmFsaWRhdGVfdmlydGNvbF93aW4oY3Vyd2luKTsKK30KKworLyoKKyAqIFZhbGlkYXRlIHdwLT53X3ZpcnRjb2wgb25seS4KKyAqLworICAgIHZvaWQKK3ZhbGlkYXRlX3ZpcnRjb2xfd2luKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBjaGVja19jdXJzb3JfbW92ZWQod3ApOworICAgIGlmICghKHdwLT53X3ZhbGlkICYgVkFMSURfVklSVENPTCkpCisgICAgeworCWdldHZ2Y29sKHdwLCAmd3AtPndfY3Vyc29yLCBOVUxMLCAmKHdwLT53X3ZpcnRjb2wpLCBOVUxMKTsKKwl3cC0+d192YWxpZCB8PSBWQUxJRF9WSVJUQ09MOworICAgIH0KK30KKworLyoKKyAqIFZhbGlkYXRlIGN1cndpbi0+d19jbGluZV9oZWlnaHQgb25seS4KKyAqLworICAgIHN0YXRpYyB2b2lkCit2YWxpZGF0ZV9jaGVpZ2h0KCkKK3sKKyAgICBjaGVja19jdXJzb3JfbW92ZWQoY3Vyd2luKTsKKyAgICBpZiAoIShjdXJ3aW4tPndfdmFsaWQgJiBWQUxJRF9DSEVJR0hUKSkKKyAgICB7CisjaWZkZWYgRkVBVF9ESUZGCisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBjdXJ3aW4tPndfdG9wbGluZSkKKwkgICAgY3Vyd2luLT53X2NsaW5lX2hlaWdodCA9IHBsaW5lc19ub2ZpbGwoY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQkJCQkJCSAgKyBjdXJ3aW4tPndfdG9wZmlsbDsKKwllbHNlCisjZW5kaWYKKwkgICAgY3Vyd2luLT53X2NsaW5lX2hlaWdodCA9IHBsaW5lcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworI2lmZGVmIEZFQVRfRk9MRElORworCWN1cndpbi0+d19jbGluZV9mb2xkZWQgPSBoYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfQ0hFSUdIVDsKKyAgICB9Cit9CisKKy8qCisgKiB2YWxpZGF0ZSB3X3djb2wgYW5kIHdfdmlydGNvbCBvbmx5LglPbmx5IGNvcnJlY3Qgd2hlbiAnd3JhcCcgb24hCisgKi8KKyAgICB2b2lkCit2YWxpZGF0ZV9jdXJzb3JfY29sKCkKK3sKKyAgICBjb2xucl9UIG9mZjsKKyAgICBjb2xucl9UIGNvbDsKKworICAgIHZhbGlkYXRlX3ZpcnRjb2woKTsKKyAgICBpZiAoIShjdXJ3aW4tPndfdmFsaWQgJiBWQUxJRF9XQ09MKSkKKyAgICB7CisJY29sID0gY3Vyd2luLT53X3ZpcnRjb2w7CisJb2ZmID0gY3Vyd2luX2NvbF9vZmYoKTsKKwljb2wgKz0gb2ZmOworCisJLyogbG9uZyBsaW5lIHdyYXBwaW5nLCBhZGp1c3QgY3Vyd2luLT53X3dyb3cgKi8KKwlpZiAoY3Vyd2luLT53X3Bfd3JhcCAmJiBjb2wgPj0gKGNvbG5yX1QpV19XSURUSChjdXJ3aW4pCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJJiYgY3Vyd2luLT53X3dpZHRoICE9IDAKKyNlbmRpZgorCQkpCisJeworCSAgICBjb2wgLT0gV19XSURUSChjdXJ3aW4pOworCSAgICBjb2wgPSBjb2wgJSAoV19XSURUSChjdXJ3aW4pIC0gb2ZmICsgY3Vyd2luX2NvbF9vZmYyKCkpOworCX0KKwljdXJ3aW4tPndfd2NvbCA9IGNvbDsKKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfV0NPTDsKKyAgICB9Cit9CisKKy8qCisgKiBDb21wdXRlIG9mZnNldCBvZiBhIHdpbmRvdywgb2NjdXBpZWQgYnkgbGluZSBudW1iZXIsIGZvbGQgY29sdW1uIGFuZCBzaWduCisgKiBjb2x1bW4gKHRoZXNlIGRvbid0IG1vdmUgd2hlbiBzY3JvbGxpbmcgaG9yaXpvbnRhbGx5KS4KKyAqLworICAgIGludAord2luX2NvbF9vZmYod3ApCisgICAgd2luX1QJKndwOworeworICAgIHJldHVybiAoKHdwLT53X3BfbnUgPyA4IDogMCkKKyNpZmRlZiBGRUFUX0NNRFdJTgorCSAgICArIChjbWR3aW5fdHlwZSA9PSAwIHx8IHdwICE9IGN1cndpbiA/IDAgOiAxKQorI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgICsgd3AtPndfcF9mZGMKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0lHTlMKKwkgICAgKyAoCisjIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCQkvKiBhbHdheXMgc2hvdyBnbHlwaCBndXR0ZXIgaW4gbmV0YmVhbnMgKi8KKwkJdXNpbmdOZXRiZWFucyB8fAorIyBlbmRpZgorCQl3cC0+d19idWZmZXItPmJfc2lnbmxpc3QgIT0gTlVMTCA/IDIgOiAwKQorI2VuZGlmCisJICAgKTsKK30KKworICAgIGludAorY3Vyd2luX2NvbF9vZmYoKQoreworICAgIHJldHVybiB3aW5fY29sX29mZihjdXJ3aW4pOworfQorCisvKgorICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIGNvbHVtbiBvZmZzZXQgZm9yIHRoZSBzZWNvbmQgc2NyZWVuIGxpbmUgb2YgYQorICogd3JhcHBlZCBsaW5lLiAgSXQncyA4IGlmICdudW1iZXInIGlzIG9uIGFuZCAnbicgaXMgaW4gJ2Nwb3B0aW9ucycuCisgKi8KKyAgICBpbnQKK3dpbl9jb2xfb2ZmMih3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaWYgKHdwLT53X3BfbnUgJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX05VTUNPTCkgIT0gTlVMTCkKKwlyZXR1cm4gODsKKyAgICByZXR1cm4gMDsKK30KKworICAgIGludAorY3Vyd2luX2NvbF9vZmYyKCkKK3sKKyAgICByZXR1cm4gd2luX2NvbF9vZmYyKGN1cndpbik7Cit9CisKKy8qCisgKiBjb21wdXRlIGN1cndpbi0+d193Y29sIGFuZCBjdXJ3aW4tPndfdmlydGNvbC4KKyAqIEFsc28gdXBkYXRlcyBjdXJ3aW4tPndfd3JvdyBhbmQgY3Vyd2luLT53X2NsaW5lX3Jvdy4KKyAqIEFsc28gdXBkYXRlcyBjdXJ3aW4tPndfbGVmdGNvbC4KKyAqLworICAgIHZvaWQKK2N1cnNfY29sdW1ucyhzY3JvbGwpCisgICAgaW50CQlzY3JvbGw7CQkvKiB3aGVuIFRSVUUsIG1heSBzY3JvbGwgaG9yaXpvbnRhbGx5ICovCit7CisgICAgaW50CQlkaWZmOworICAgIGludAkJZXh0cmE7CQkvKiBvZmZzZXQgZm9yIGZpcnN0IHNjcmVlbiBsaW5lICovCisgICAgaW50CQlvZmZfbGVmdCwgb2ZmX3JpZ2h0OworICAgIGludAkJbjsKKyAgICBpbnQJCXBfbGluZXM7CisgICAgaW50CQl3aWR0aCA9IDA7CisgICAgaW50CQl0ZXh0d2lkdGg7CisgICAgaW50CQluZXdfbGVmdGNvbDsKKyAgICBjb2xucl9UCXN0YXJ0Y29sOworICAgIGNvbG5yX1QJZW5kY29sOworICAgIGNvbG5yX1QJcHJldl9za2lwY29sOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBtYWtlIHN1cmUgdGhhdCB3X3RvcGxpbmUgaXMgdmFsaWQgKGFmdGVyIG1vdmluZyB0aGUgY3Vyc29yKS4KKyAgICAgKi8KKyAgICB1cGRhdGVfdG9wbGluZSgpOworCisgICAgLyoKKyAgICAgKiBOZXh0IG1ha2Ugc3VyZSB0aGF0IHdfY2xpbmVfcm93IGlzIHZhbGlkLgorICAgICAqLworICAgIGlmICghKGN1cndpbi0+d192YWxpZCAmIFZBTElEX0NST1cpKQorCWN1cnNfcm93cyhjdXJ3aW4sIEZBTFNFKTsKKworICAgIC8qCisgICAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgY29sdW1ucy4KKyAgICAgKi8KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoY3Vyd2luLT53X2NsaW5lX2ZvbGRlZCkKKwkvKiBJbiBhIGZvbGRlZCBsaW5lIHRoZSBjdXJzb3IgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCBjb2x1bW4gKi8KKwlzdGFydGNvbCA9IGN1cndpbi0+d192aXJ0Y29sID0gZW5kY29sID0gY3Vyd2luLT53X2xlZnRjb2w7CisgICAgZWxzZQorI2VuZGlmCisJZ2V0dnZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwKKwkJCQkmc3RhcnRjb2wsICYoY3Vyd2luLT53X3ZpcnRjb2wpLCAmZW5kY29sKTsKKworICAgIC8qIHJlbW92ZSAnJCcgZnJvbSBjaGFuZ2UgY29tbWFuZCB3aGVuIGN1cnNvciBtb3ZlcyBvbnRvIGl0ICovCisgICAgaWYgKHN0YXJ0Y29sID4gZG9sbGFyX3Zjb2wpCisJZG9sbGFyX3Zjb2wgPSAwOworCisgICAgZXh0cmEgPSBjdXJ3aW5fY29sX29mZigpOworICAgIGN1cndpbi0+d193Y29sID0gY3Vyd2luLT53X3ZpcnRjb2wgKyBleHRyYTsKKyAgICBlbmRjb2wgKz0gZXh0cmE7CisKKyAgICAvKgorICAgICAqIE5vdyBjb21wdXRlIHdfd3JvdywgY291bnRpbmcgc2NyZWVuIGxpbmVzIGZyb20gd19jbGluZV9yb3cuCisgICAgICovCisgICAgY3Vyd2luLT53X3dyb3cgPSBjdXJ3aW4tPndfY2xpbmVfcm93OworCisgICAgdGV4dHdpZHRoID0gV19XSURUSChjdXJ3aW4pIC0gZXh0cmE7CisgICAgaWYgKHRleHR3aWR0aCA8PSAwKQorICAgIHsKKwkvKiBObyByb29tIGZvciB0ZXh0LCBwdXQgY3Vyc29yIGluIGxhc3QgY2hhciBvZiB3aW5kb3cuICovCisJY3Vyd2luLT53X3djb2wgPSBXX1dJRFRIKGN1cndpbikgLSAxOworCWN1cndpbi0+d193cm93ID0gY3Vyd2luLT53X2hlaWdodCAtIDE7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cndpbi0+d19wX3dyYXAKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICAmJiBjdXJ3aW4tPndfd2lkdGggIT0gMAorI2VuZGlmCisJICAgICkKKyAgICB7CisJd2lkdGggPSB0ZXh0d2lkdGggKyBjdXJ3aW5fY29sX29mZjIoKTsKKworCS8qIGxvbmcgbGluZSB3cmFwcGluZywgYWRqdXN0IGN1cndpbi0+d193cm93ICovCisJaWYgKGN1cndpbi0+d193Y29sID49IFdfV0lEVEgoY3Vyd2luKSkKKwl7CisJICAgIG4gPSAoY3Vyd2luLT53X3djb2wgLSBXX1dJRFRIKGN1cndpbikpIC8gd2lkdGggKyAxOworCSAgICBjdXJ3aW4tPndfd2NvbCAtPSBuICogd2lkdGg7CisJICAgIGN1cndpbi0+d193cm93ICs9IG47CisKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworCSAgICAvKiBXaGVuIGN1cnNvciB3cmFwcyB0byBmaXJzdCBjaGFyIG9mIG5leHQgbGluZSBpbiBJbnNlcnQKKwkgICAgICogbW9kZSwgdGhlICdzaG93YnJlYWsnIHN0cmluZyBpc24ndCBzaG93biwgYmFja3VwIHRvIGZpcnN0CisJICAgICAqIGNvbHVtbiAqLworCSAgICBpZiAoKnBfc2JyICYmICptbF9nZXRfY3Vyc29yKCkgPT0gTlVMCisJCSAgICAmJiBjdXJ3aW4tPndfd2NvbCA9PSAoaW50KXZpbV9zdHJzaXplKHBfc2JyKSkKKwkJY3Vyd2luLT53X3djb2wgPSAwOworI2VuZGlmCisJfQorICAgIH0KKworICAgIC8qIE5vIGxpbmUgd3JhcHBpbmc6IGNvbXB1dGUgY3Vyd2luLT53X2xlZnRjb2wgaWYgc2Nyb2xsaW5nIGlzIG9uIGFuZCBsaW5lCisgICAgICogaXMgbm90IGZvbGRlZC4KKyAgICAgKiBJZiBzY3JvbGxpbmcgaXMgb2ZmLCBjdXJ3aW4tPndfbGVmdGNvbCBpcyBhc3N1bWVkIHRvIGJlIDAgKi8KKyAgICBlbHNlIGlmIChzY3JvbGwKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgJiYgIWN1cndpbi0+d19jbGluZV9mb2xkZWQKKyNlbmRpZgorCSAgICApCisgICAgeworCS8qCisJICogSWYgQ3Vyc29yIGlzIGxlZnQgb2YgdGhlIHNjcmVlbiwgc2Nyb2xsIHJpZ2h0d2FyZHMuCisJICogSWYgQ3Vyc29yIGlzIHJpZ2h0IG9mIHRoZSBzY3JlZW4sIHNjcm9sbCBsZWZ0d2FyZHMKKwkgKiBJZiB3ZSBnZXQgY2xvc2VyIHRvIHRoZSBlZGdlIHRoYW4gJ3NpZGVzY3JvbGxvZmYnLCBzY3JvbGwgYSBsaXR0bGUKKwkgKiBleHRyYQorCSAqLworCW9mZl9sZWZ0ID0gKGludClzdGFydGNvbCAtIChpbnQpY3Vyd2luLT53X2xlZnRjb2wgLSBwX3Npc287CisJb2ZmX3JpZ2h0ID0gKGludCllbmRjb2wgLSAoaW50KShjdXJ3aW4tPndfbGVmdGNvbCArIFdfV0lEVEgoY3Vyd2luKQorCQkJCQkJCQktIHBfc2lzbykgKyAxOworCWlmIChvZmZfbGVmdCA8IDAgfHwgb2ZmX3JpZ2h0ID4gMCkKKwl7CisJICAgIGlmIChvZmZfbGVmdCA8IDApCisJCWRpZmYgPSAtb2ZmX2xlZnQ7CisJICAgIGVsc2UKKwkJZGlmZiA9IG9mZl9yaWdodDsKKworCSAgICAvKiBXaGVuIGZhciBvZmYgb3Igbm90IGVub3VnaCByb29tIG9uIGVpdGhlciBzaWRlLCBwdXQgY3Vyc29yIGluCisJICAgICAqIG1pZGRsZSBvZiB3aW5kb3cuICovCisJICAgIGlmIChwX3NzID09IDAgfHwgZGlmZiA+PSB0ZXh0d2lkdGggLyAyIHx8IG9mZl9yaWdodCA+PSBvZmZfbGVmdCkKKwkJbmV3X2xlZnRjb2wgPSBjdXJ3aW4tPndfd2NvbCAtIGV4dHJhIC0gdGV4dHdpZHRoIC8gMjsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChkaWZmIDwgcF9zcykKKwkJICAgIGRpZmYgPSBwX3NzOworCQlpZiAob2ZmX2xlZnQgPCAwKQorCQkgICAgbmV3X2xlZnRjb2wgPSBjdXJ3aW4tPndfbGVmdGNvbCAtIGRpZmY7CisJCWVsc2UKKwkJICAgIG5ld19sZWZ0Y29sID0gY3Vyd2luLT53X2xlZnRjb2wgKyBkaWZmOworCSAgICB9CisJICAgIGlmIChuZXdfbGVmdGNvbCA8IDApCisJCW5ld19sZWZ0Y29sID0gMDsKKwkgICAgaWYgKG5ld19sZWZ0Y29sICE9IChpbnQpY3Vyd2luLT53X2xlZnRjb2wpCisJICAgIHsKKwkJY3Vyd2luLT53X2xlZnRjb2wgPSBuZXdfbGVmdGNvbDsKKwkJLyogc2NyZWVuIGhhcyB0byBiZSByZWRyYXduIHdpdGggbmV3IGN1cndpbi0+d19sZWZ0Y29sICovCisJCXJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworCSAgICB9CisJfQorCWN1cndpbi0+d193Y29sIC09IGN1cndpbi0+d19sZWZ0Y29sOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJ3aW4tPndfd2NvbCA+IChpbnQpY3Vyd2luLT53X2xlZnRjb2wpCisJY3Vyd2luLT53X3djb2wgLT0gY3Vyd2luLT53X2xlZnRjb2w7CisgICAgZWxzZQorCWN1cndpbi0+d193Y29sID0gMDsKKworI2lmZGVmIEZFQVRfRElGRgorICAgIC8qIFNraXAgb3ZlciBmaWxsZXIgbGluZXMuICBBdCB0aGUgdG9wIHVzZSB3X3RvcGZpbGwsIHRoZXJlCisgICAgICogbWF5IGJlIHNvbWUgZmlsbGVyIGxpbmVzIGFib3ZlIHRoZSB3aW5kb3cuICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBjdXJ3aW4tPndfdG9wbGluZSkKKwljdXJ3aW4tPndfd3JvdyArPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyAgICBlbHNlCisJY3Vyd2luLT53X3dyb3cgKz0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKyNlbmRpZgorCisgICAgcHJldl9za2lwY29sID0gY3Vyd2luLT53X3NraXBjb2w7CisKKyAgICBwX2xpbmVzID0gMDsKKyAgICBpZiAoKGN1cndpbi0+d193cm93ID49IGN1cndpbi0+d19oZWlnaHQKKwkJfHwgKChwcmV2X3NraXBjb2wgPiAwCisJCQl8fCBjdXJ3aW4tPndfd3JvdyArIHBfc28gPj0gY3Vyd2luLT53X2hlaWdodCkKKwkJICAgICYmIChwX2xpbmVzID0KKyNpZmRlZiBGRUFUX0RJRkYKKwkJCXBsaW5lc193aW5fbm9maWxsCisjZWxzZQorCQkJcGxpbmVzX3dpbgorI2VuZGlmCisJCQkoY3Vyd2luLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIEZBTFNFKSkKKwkJCQkJCSAgICAtIDEgPj0gY3Vyd2luLT53X2hlaWdodCkpCisJICAgICYmIGN1cndpbi0+d19oZWlnaHQgIT0gMAorCSAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3Vyd2luLT53X3RvcGxpbmUKKwkgICAgJiYgd2lkdGggPiAwCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgJiYgY3Vyd2luLT53X3dpZHRoICE9IDAKKyNlbmRpZgorCSAgICApCisgICAgeworCS8qIEN1cnNvciBwYXN0IGVuZCBvZiBzY3JlZW4uICBIYXBwZW5zIHdpdGggYSBzaW5nbGUgbGluZSB0aGF0IGRvZXMKKwkgKiBub3QgZml0IG9uIHNjcmVlbi4gIEZpbmQgYSBza2lwY29sIHRvIHNob3cgdGhlIHRleHQgYXJvdW5kIHRoZQorCSAqIGN1cnNvci4gIEF2b2lkIHNjcm9sbGluZyBhbGwgdGhlIHRpbWUuIGNvbXB1dGUgdmFsdWUgb2YgImV4dHJhIjoKKwkgKiAxOiBMZXNzIHRoYW4gInBfc28iIGxpbmVzIGFib3ZlCisJICogMjogTGVzcyB0aGFuICJwX3NvIiBsaW5lcyBiZWxvdworCSAqIDM6IGJvdGggb2YgdGhlbSAqLworCWV4dHJhID0gMDsKKwlpZiAoY3Vyd2luLT53X3NraXBjb2wgKyBwX3NvICogd2lkdGggPiBjdXJ3aW4tPndfdmlydGNvbCkKKwkgICAgZXh0cmEgPSAxOworCS8qIENvbXB1dGUgbGFzdCBkaXNwbGF5IGxpbmUgb2YgdGhlIGJ1ZmZlciBsaW5lIHRoYXQgd2Ugd2FudCBhdCB0aGUKKwkgKiBib3R0b20gb2YgdGhlIHdpbmRvdy4gKi8KKwlpZiAocF9saW5lcyA9PSAwKQorCSAgICBwX2xpbmVzID0gcGxpbmVzX3dpbihjdXJ3aW4sIGN1cndpbi0+d19jdXJzb3IubG51bSwgRkFMU0UpOworCS0tcF9saW5lczsKKwlpZiAocF9saW5lcyA+IGN1cndpbi0+d193cm93ICsgcF9zbykKKwkgICAgbiA9IGN1cndpbi0+d193cm93ICsgcF9zbzsKKwllbHNlCisJICAgIG4gPSBwX2xpbmVzOworCWlmICgoY29sbnJfVCluID49IGN1cndpbi0+d19oZWlnaHQgKyBjdXJ3aW4tPndfc2tpcGNvbCAvIHdpZHRoKQorCSAgICBleHRyYSArPSAyOworCisJaWYgKGV4dHJhID09IDMgfHwgcF9saW5lcyA8IHBfc28gKiAyKQorCXsKKwkgICAgLyogbm90IGVub3VnaCByb29tIGZvciAnc2Nyb2xsb2ZmJywgcHV0IGN1cnNvciBpbiB0aGUgbWlkZGxlICovCisJICAgIG4gPSBjdXJ3aW4tPndfdmlydGNvbCAvIHdpZHRoOworCSAgICBpZiAobiA+IGN1cndpbi0+d19oZWlnaHQgLyAyKQorCQluIC09IGN1cndpbi0+d19oZWlnaHQgLyAyOworCSAgICBlbHNlCisJCW4gPSAwOworCSAgICAvKiBkb24ndCBza2lwIG1vcmUgdGhhbiBuZWNlc3NhcnkgKi8KKwkgICAgaWYgKG4gPiBwX2xpbmVzIC0gY3Vyd2luLT53X2hlaWdodCArIDEpCisJCW4gPSBwX2xpbmVzIC0gY3Vyd2luLT53X2hlaWdodCArIDE7CisJICAgIGN1cndpbi0+d19za2lwY29sID0gbiAqIHdpZHRoOworCX0KKwllbHNlIGlmIChleHRyYSA9PSAxKQorCXsKKwkgICAgLyogbGVzcyB0aGVuICdzY3JvbGxvZmYnIGxpbmVzIGFib3ZlLCBkZWNyZWFzZSBza2lwY29sICovCisJICAgIGV4dHJhID0gKGN1cndpbi0+d19za2lwY29sICsgcF9zbyAqIHdpZHRoIC0gY3Vyd2luLT53X3ZpcnRjb2wKKwkJCQkgICAgICsgd2lkdGggLSAxKSAvIHdpZHRoOworCSAgICBpZiAoZXh0cmEgPiAwKQorCSAgICB7CisJCWlmICgoY29sbnJfVCkoZXh0cmEgKiB3aWR0aCkgPiBjdXJ3aW4tPndfc2tpcGNvbCkKKwkJICAgIGV4dHJhID0gY3Vyd2luLT53X3NraXBjb2wgLyB3aWR0aDsKKwkJY3Vyd2luLT53X3NraXBjb2wgLT0gZXh0cmEgKiB3aWR0aDsKKwkgICAgfQorCX0KKwllbHNlIGlmIChleHRyYSA9PSAyKQorCXsKKwkgICAgLyogbGVzcyB0aGVuICdzY3JvbGxvZmYnIGxpbmVzIGJlbG93LCBpbmNyZWFzZSBza2lwY29sICovCisJICAgIGVuZGNvbCA9IChuIC0gY3Vyd2luLT53X2hlaWdodCArIDEpICogd2lkdGg7CisJICAgIHdoaWxlIChlbmRjb2wgPiBjdXJ3aW4tPndfdmlydGNvbCkKKwkJZW5kY29sIC09IHdpZHRoOworCSAgICBpZiAoZW5kY29sID4gY3Vyd2luLT53X3NraXBjb2wpCisJCWN1cndpbi0+d19za2lwY29sID0gZW5kY29sOworCX0KKworCWN1cndpbi0+d193cm93IC09IGN1cndpbi0+d19za2lwY29sIC8gd2lkdGg7CisJaWYgKGN1cndpbi0+d193cm93ID49IGN1cndpbi0+d19oZWlnaHQpCisJeworCSAgICAvKiBzbWFsbCB3aW5kb3csIG1ha2Ugc3VyZSBjdXJzb3IgaXMgaW4gaXQgKi8KKwkgICAgZXh0cmEgPSBjdXJ3aW4tPndfd3JvdyAtIGN1cndpbi0+d19oZWlnaHQgKyAxOworCSAgICBjdXJ3aW4tPndfc2tpcGNvbCArPSBleHRyYSAqIHdpZHRoOworCSAgICBjdXJ3aW4tPndfd3JvdyAtPSBleHRyYTsKKwl9CisKKwlleHRyYSA9ICgoaW50KXByZXZfc2tpcGNvbCAtIChpbnQpY3Vyd2luLT53X3NraXBjb2wpIC8gd2lkdGg7CisJaWYgKGV4dHJhID4gMCkKKwkgICAgd2luX2luc19saW5lcyhjdXJ3aW4sIDAsIGV4dHJhLCBGQUxTRSwgRkFMU0UpOworCWVsc2UgaWYgKGV4dHJhIDwgMCkKKwkgICAgd2luX2RlbF9saW5lcyhjdXJ3aW4sIDAsIC1leHRyYSwgRkFMU0UsIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorCWN1cndpbi0+d19za2lwY29sID0gMDsKKyAgICBpZiAocHJldl9za2lwY29sICE9IGN1cndpbi0+d19za2lwY29sKQorCXJlZHJhd19sYXRlcihOT1RfVkFMSUQpOworCisgICAgY3Vyd2luLT53X3ZhbGlkIHw9IFZBTElEX1dDT0x8VkFMSURfV1JPV3xWQUxJRF9WSVJUQ09MOworfQorCisvKgorICogU2Nyb2xsIHRoZSBjdXJyZW50IHdpbmRvdyBkb3duIGJ5ICJsaW5lX2NvdW50IiBsb2dpY2FsIGxpbmVzLiAgIkNUUkwtWSIKKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorc2Nyb2xsZG93bihsaW5lX2NvdW50LCBieWZvbGQpCisgICAgbG9uZwlsaW5lX2NvdW50OworICAgIGludAkJYnlmb2xkOwkJLyogVFJVRTogY291bnQgYSBjbG9zZWQgZm9sZCBhcyBvbmUgbGluZSAqLworeworICAgIGxvbmcJZG9uZSA9IDA7CS8qIHRvdGFsICMgb2YgcGh5c2ljYWwgbGluZXMgZG9uZSAqLworICAgIGludAkJd3JvdzsKKyAgICBpbnQJCW1vdmVkID0gRkFMU0U7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBsaW5lbnJfVAlmaXJzdDsKKworICAgIC8qIE1ha2Ugc3VyZSB3X3RvcGxpbmUgaXMgYXQgdGhlIGZpcnN0IG9mIGEgc2VxdWVuY2Ugb2YgZm9sZGVkIGxpbmVzLiAqLworICAgICh2b2lkKWhhc0ZvbGRpbmcoY3Vyd2luLT53X3RvcGxpbmUsICZjdXJ3aW4tPndfdG9wbGluZSwgTlVMTCk7CisjZW5kaWYKKyAgICB2YWxpZGF0ZV9jdXJzb3IoKTsJCS8qIHdfd3JvdyBuZWVkcyB0byBiZSB2YWxpZCAqLworICAgIHdoaWxlIChsaW5lX2NvdW50LS0gPiAwKQorICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwlpZiAoY3Vyd2luLT53X3RvcGZpbGwgPCBkaWZmX2NoZWNrKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpKQorCXsKKwkgICAgKytjdXJ3aW4tPndfdG9wZmlsbDsKKwkgICAgKytkb25lOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGlmIChjdXJ3aW4tPndfdG9wbGluZSA9PSAxKQorCQlicmVhazsKKwkgICAgLS1jdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgY3Vyd2luLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIC8qIEEgc2VxdWVuY2Ugb2YgZm9sZGVkIGxpbmVzIG9ubHkgY291bnRzIGZvciBvbmUgbG9naWNhbCBsaW5lICovCisJICAgIGlmIChoYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lLCAmZmlyc3QsIE5VTEwpKQorCSAgICB7CisJCSsrZG9uZTsKKwkJaWYgKCFieWZvbGQpCisJCSAgICBsaW5lX2NvdW50IC09IGN1cndpbi0+d190b3BsaW5lIC0gZmlyc3QgLSAxOworCQljdXJ3aW4tPndfYm90bGluZSAtPSBjdXJ3aW4tPndfdG9wbGluZSAtIGZpcnN0OworCQljdXJ3aW4tPndfdG9wbGluZSA9IGZpcnN0OworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorCQlkb25lICs9IHBsaW5lc19ub2ZpbGwoY3Vyd2luLT53X3RvcGxpbmUpOworI2Vsc2UKKwkJZG9uZSArPSBwbGluZXMoY3Vyd2luLT53X3RvcGxpbmUpOworI2VuZGlmCisJfQorCS0tY3Vyd2luLT53X2JvdGxpbmU7CQkvKiBhcHByb3hpbWF0ZSB3X2JvdGxpbmUgKi8KKwlpbnZhbGlkYXRlX2JvdGxpbmUoKTsKKyAgICB9CisgICAgY3Vyd2luLT53X3dyb3cgKz0gZG9uZTsJCS8qIGtlZXAgd193cm93IHVwZGF0ZWQgKi8KKyAgICBjdXJ3aW4tPndfY2xpbmVfcm93ICs9IGRvbmU7CS8qIGtlZXAgd19jbGluZV9yb3cgdXBkYXRlZCAqLworCisjaWZkZWYgRkVBVF9ESUZGCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBjdXJ3aW4tPndfdG9wbGluZSkKKwljdXJ3aW4tPndfY2xpbmVfcm93ID0gMDsKKyAgICBjaGVja190b3BmaWxsKGN1cndpbiwgVFJVRSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ29tcHV0ZSB0aGUgcm93IG51bWJlciBvZiB0aGUgbGFzdCByb3cgb2YgdGhlIGN1cnNvciBsaW5lCisgICAgICogYW5kIG1vdmUgdGhlIGN1cnNvciBvbnRvIHRoZSBkaXNwbGF5ZWQgcGFydCBvZiB0aGUgd2luZG93LgorICAgICAqLworICAgIHdyb3cgPSBjdXJ3aW4tPndfd3JvdzsKKyAgICBpZiAoY3Vyd2luLT53X3Bfd3JhcAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCSYmIGN1cndpbi0+d193aWR0aCAhPSAwCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwl2YWxpZGF0ZV92aXJ0Y29sKCk7CisJdmFsaWRhdGVfY2hlaWdodCgpOworCXdyb3cgKz0gY3Vyd2luLT53X2NsaW5lX2hlaWdodCAtIDEgLQorCSAgICBjdXJ3aW4tPndfdmlydGNvbCAvIFdfV0lEVEgoY3Vyd2luKTsKKyAgICB9CisgICAgd2hpbGUgKHdyb3cgPj0gY3Vyd2luLT53X2hlaWdodCAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxKQorICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sICZmaXJzdCwgTlVMTCkpCisJeworCSAgICAtLXdyb3c7CisJICAgIGlmIChmaXJzdCA9PSAxKQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAxOworCSAgICBlbHNlCisJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGZpcnN0IC0gMTsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIHdyb3cgLT0gcGxpbmVzKGN1cndpbi0+d19jdXJzb3IubG51bS0tKTsKKwljdXJ3aW4tPndfdmFsaWQgJj0KKwkgICAgICB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9DSEVJR0hUfFZBTElEX0NST1d8VkFMSURfVklSVENPTCk7CisJbW92ZWQgPSBUUlVFOworICAgIH0KKyAgICBpZiAobW92ZWQpCisgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCS8qIE1vdmUgY3Vyc29yIHRvIGZpcnN0IGxpbmUgb2YgY2xvc2VkIGZvbGQuICovCisJZm9sZEFkanVzdEN1cnNvcigpOworI2VuZGlmCisJY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworICAgIH0KK30KKworLyoKKyAqIFNjcm9sbCB0aGUgY3VycmVudCB3aW5kb3cgdXAgYnkgImxpbmVfY291bnQiIGxvZ2ljYWwgbGluZXMuICAiQ1RSTC1FIgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitzY3JvbGx1cChsaW5lX2NvdW50LCBieWZvbGQpCisgICAgbG9uZwlsaW5lX2NvdW50OworICAgIGludAkJYnlmb2xkOwkJLyogVFJVRTogY291bnQgYSBjbG9zZWQgZm9sZCBhcyBvbmUgbGluZSAqLworeworI2lmIGRlZmluZWQoRkVBVF9GT0xESU5HKSB8fCBkZWZpbmVkKEZFQVRfRElGRikKKyAgICBsaW5lbnJfVAlsbnVtOworCisgICAgaWYgKAorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgKGJ5Zm9sZCAmJiBoYXNBbnlGb2xkaW5nKGN1cndpbikpCisjICBpZmRlZiBGRUFUX0RJRkYKKwkgICAgfHwKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfRElGRgorCSAgICBjdXJ3aW4tPndfcF9kaWZmCisjIGVuZGlmCisJICAgICkKKyAgICB7CisJLyogY291bnQgZWFjaCBzZXF1ZW5jZSBvZiBmb2xkZWQgbGluZXMgYXMgb25lIGxvZ2ljYWwgbGluZSAqLworCWxudW0gPSBjdXJ3aW4tPndfdG9wbGluZTsKKwl3aGlsZSAobGluZV9jb3VudC0tKQorCXsKKyMgaWZkZWYgRkVBVF9ESUZGCisJICAgIGlmIChjdXJ3aW4tPndfdG9wZmlsbCA+IDApCisJCS0tY3Vyd2luLT53X3RvcGZpbGw7CisJICAgIGVsc2UKKyMgZW5kaWYKKwkgICAgeworIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkJaWYgKGJ5Zm9sZCkKKwkJICAgICh2b2lkKWhhc0ZvbGRpbmcobG51bSwgTlVMTCwgJmxudW0pOworIyBlbmRpZgorCQlpZiAobG51bSA+PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJICAgIGJyZWFrOworCQkrK2xudW07CisjIGlmZGVmIEZFQVRfRElGRgorCQljdXJ3aW4tPndfdG9wZmlsbCA9IGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIGxudW0pOworIyBlbmRpZgorCSAgICB9CisJfQorCS8qIGFwcHJveGltYXRlIHdfYm90bGluZSAqLworCWN1cndpbi0+d19ib3RsaW5lICs9IGxudW0gLSBjdXJ3aW4tPndfdG9wbGluZTsKKwljdXJ3aW4tPndfdG9wbGluZSA9IGxudW07CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwljdXJ3aW4tPndfdG9wbGluZSArPSBsaW5lX2NvdW50OworCWN1cndpbi0+d19ib3RsaW5lICs9IGxpbmVfY291bnQ7CS8qIGFwcHJveGltYXRlIHdfYm90bGluZSAqLworICAgIH0KKworICAgIGlmIChjdXJ3aW4tPndfdG9wbGluZSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWN1cndpbi0+d190b3BsaW5lID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisgICAgaWYgKGN1cndpbi0+d19ib3RsaW5lID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgKyAxKQorCWN1cndpbi0+d19ib3RsaW5lID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgKyAxOworCisjaWZkZWYgRkVBVF9ESUZGCisgICAgY2hlY2tfdG9wZmlsbChjdXJ3aW4sIEZBTFNFKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKGhhc0FueUZvbGRpbmcoY3Vyd2luKSkKKwkvKiBNYWtlIHN1cmUgd190b3BsaW5lIGlzIGF0IHRoZSBmaXJzdCBvZiBhIHNlcXVlbmNlIG9mIGZvbGRlZCBsaW5lcy4gKi8KKwkodm9pZCloYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lLCAmY3Vyd2luLT53X3RvcGxpbmUsIE5VTEwpOworI2VuZGlmCisKKyAgICBjdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORSk7CisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA8IGN1cndpbi0+d190b3BsaW5lKQorICAgIHsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJ3aW4tPndfdG9wbGluZTsKKwljdXJ3aW4tPndfdmFsaWQgJj0KKwkgICAgICB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9DSEVJR0hUfFZBTElEX0NST1d8VkFMSURfVklSVENPTCk7CisJY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworICAgIH0KK30KKworI2lmZGVmIEZFQVRfRElGRgorLyoKKyAqIERvbid0IGVuZCB1cCB3aXRoIHRvbyBtYW55IGZpbGxlciBsaW5lcyBpbiB0aGUgd2luZG93LgorICovCisgICAgdm9pZAorY2hlY2tfdG9wZmlsbCh3cCwgZG93bikKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQlkb3duOwkvKiB3aGVuIFRSVUUgc2Nyb2xsIGRvd24gd2hlbiBub3QgZW5vdWdoIHNwYWNlICovCit7CisgICAgaW50CQluOworCisgICAgaWYgKHdwLT53X3RvcGZpbGwgPiAwKQorICAgIHsKKwluID0gcGxpbmVzX3dpbl9ub2ZpbGwod3AsIHdwLT53X3RvcGxpbmUsIFRSVUUpOworCWlmICh3cC0+d190b3BmaWxsICsgbiA+IHdwLT53X2hlaWdodCkKKwl7CisJICAgIGlmIChkb3duICYmIHdwLT53X3RvcGxpbmUgPiAxKQorCSAgICB7CisJCS0td3AtPndfdG9wbGluZTsKKwkJd3AtPndfdG9wZmlsbCA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXdwLT53X3RvcGZpbGwgPSB3cC0+d19oZWlnaHQgLSBuOworCQlpZiAod3AtPndfdG9wZmlsbCA8IDApCisJCSAgICB3cC0+d190b3BmaWxsID0gMDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBVc2UgYXMgbWFueSBmaWxsZXIgbGluZXMgYXMgcG9zc2libGUgZm9yIHdfdG9wbGluZS4gIE1ha2Ugc3VyZSB3X3RvcGxpbmUKKyAqIGlzIHN0aWxsIHZpc2libGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWF4X3RvcGZpbGwoKQoreworICAgIGludAkJbjsKKworICAgIG4gPSBwbGluZXNfbm9maWxsKGN1cndpbi0+d190b3BsaW5lKTsKKyAgICBpZiAobiA+PSBjdXJ3aW4tPndfaGVpZ2h0KQorCWN1cndpbi0+d190b3BmaWxsID0gMDsKKyAgICBlbHNlCisgICAgeworCWN1cndpbi0+d190b3BmaWxsID0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpOworCWlmIChjdXJ3aW4tPndfdG9wZmlsbCArIG4gPiBjdXJ3aW4tPndfaGVpZ2h0KQorCSAgICBjdXJ3aW4tPndfdG9wZmlsbCA9IGN1cndpbi0+d19oZWlnaHQgLSBuOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2Nyb2xsIHRoZSBzY3JlZW4gb25lIGxpbmUgZG93biwgYnV0IGRvbid0IGRvIGl0IGlmIGl0IHdvdWxkIG1vdmUgdGhlCisgKiBjdXJzb3Igb2ZmIHRoZSBzY3JlZW4uCisgKi8KKyAgICB2b2lkCitzY3JvbGxkb3duX2NsYW1wKCkKK3sKKyAgICBpbnQJCWVuZF9yb3c7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQljYW5fZmlsbCA9IChjdXJ3aW4tPndfdG9wZmlsbAorCQkJCTwgZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpKTsKKyNlbmRpZgorCisgICAgaWYgKGN1cndpbi0+d190b3BsaW5lIDw9IDEKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgJiYgIWNhbl9maWxsCisjZW5kaWYKKwkgICAgKQorCXJldHVybjsKKworICAgIHZhbGlkYXRlX2N1cnNvcigpOwkgICAgLyogd193cm93IG5lZWRzIHRvIGJlIHZhbGlkICovCisKKyAgICAvKgorICAgICAqIENvbXB1dGUgdGhlIHJvdyBudW1iZXIgb2YgdGhlIGxhc3Qgcm93IG9mIHRoZSBjdXJzb3IgbGluZQorICAgICAqIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvZmYgdGhlIHNjcmVlbi4gTWFrZSBzdXJlIHRoZSBjdXJzb3IKKyAgICAgKiBkb2Vzbid0IGdvIHBhc3QgJ3Njcm9sbG9mZicgbGluZXMgZnJvbSB0aGUgc2NyZWVuIGVuZC4KKyAgICAgKi8KKyAgICBlbmRfcm93ID0gY3Vyd2luLT53X3dyb3c7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgaWYgKGNhbl9maWxsKQorCSsrZW5kX3JvdzsKKyAgICBlbHNlCisJZW5kX3JvdyArPSBwbGluZXNfbm9maWxsKGN1cndpbi0+d190b3BsaW5lIC0gMSk7CisjZWxzZQorICAgIGVuZF9yb3cgKz0gcGxpbmVzKGN1cndpbi0+d190b3BsaW5lIC0gMSk7CisjZW5kaWYKKyAgICBpZiAoY3Vyd2luLT53X3Bfd3JhcAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCSYmIGN1cndpbi0+d193aWR0aCAhPSAwCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwl2YWxpZGF0ZV9jaGVpZ2h0KCk7CisJdmFsaWRhdGVfdmlydGNvbCgpOworCWVuZF9yb3cgKz0gY3Vyd2luLT53X2NsaW5lX2hlaWdodCAtIDEgLQorCSAgICBjdXJ3aW4tPndfdmlydGNvbCAvIFdfV0lEVEgoY3Vyd2luKTsKKyAgICB9CisgICAgaWYgKGVuZF9yb3cgPCBjdXJ3aW4tPndfaGVpZ2h0IC0gcF9zbykKKyAgICB7CisjaWZkZWYgRkVBVF9ESUZGCisJaWYgKGNhbl9maWxsKQorCXsKKwkgICAgKytjdXJ3aW4tPndfdG9wZmlsbDsKKwkgICAgY2hlY2tfdG9wZmlsbChjdXJ3aW4sIFRSVUUpOworCX0KKwllbHNlCisJeworCSAgICAtLWN1cndpbi0+d190b3BsaW5lOworCSAgICBjdXJ3aW4tPndfdG9wZmlsbCA9IDA7CisJfQorI2Vsc2UKKwktLWN1cndpbi0+d190b3BsaW5lOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJaGFzRm9sZGluZyhjdXJ3aW4tPndfdG9wbGluZSwgJmN1cndpbi0+d190b3BsaW5lLCBOVUxMKTsKKyNlbmRpZgorCS0tY3Vyd2luLT53X2JvdGxpbmU7CSAgICAvKiBhcHByb3hpbWF0ZSB3X2JvdGxpbmUgKi8KKwljdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORSk7CisgICAgfQorfQorCisvKgorICogU2Nyb2xsIHRoZSBzY3JlZW4gb25lIGxpbmUgdXAsIGJ1dCBkb24ndCBkbyBpdCBpZiBpdCB3b3VsZCBtb3ZlIHRoZSBjdXJzb3IKKyAqIG9mZiB0aGUgc2NyZWVuLgorICovCisgICAgdm9pZAorc2Nyb2xsdXBfY2xhbXAoKQoreworICAgIGludAkgICAgc3RhcnRfcm93OworCisgICAgaWYgKGN1cndpbi0+d190b3BsaW5lID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50CisjaWZkZWYgRkVBVF9ESUZGCisJICAgICYmIGN1cndpbi0+d190b3BmaWxsID09IDAKKyNlbmRpZgorCSAgICApCisJcmV0dXJuOworCisgICAgdmFsaWRhdGVfY3Vyc29yKCk7CSAgICAvKiB3X3dyb3cgbmVlZHMgdG8gYmUgdmFsaWQgKi8KKworICAgIC8qCisgICAgICogQ29tcHV0ZSB0aGUgcm93IG51bWJlciBvZiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBjdXJzb3IgbGluZQorICAgICAqIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvZmYgdGhlIHNjcmVlbi4gTWFrZSBzdXJlIHRoZSBjdXJzb3IKKyAgICAgKiBkb2Vzbid0IGdvIGJlZm9yZSAnc2Nyb2xsb2ZmJyBsaW5lcyBmcm9tIHRoZSBzY3JlZW4gc3RhcnQuCisgICAgICovCisjaWZkZWYgRkVBVF9ESUZGCisgICAgc3RhcnRfcm93ID0gY3Vyd2luLT53X3dyb3cgLSBwbGluZXNfbm9maWxsKGN1cndpbi0+d190b3BsaW5lKQorCQkJCQkJCSAgLSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbHNlCisgICAgc3RhcnRfcm93ID0gY3Vyd2luLT53X3dyb3cgLSBwbGluZXMoY3Vyd2luLT53X3RvcGxpbmUpOworI2VuZGlmCisgICAgaWYgKGN1cndpbi0+d19wX3dyYXAKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCQkmJiBjdXJ3aW4tPndfd2lkdGggIT0gMAorI2VuZGlmCisJICAgICkKKyAgICB7CisJdmFsaWRhdGVfdmlydGNvbCgpOworCXN0YXJ0X3JvdyAtPSBjdXJ3aW4tPndfdmlydGNvbCAvIFdfV0lEVEgoY3Vyd2luKTsKKyAgICB9CisgICAgaWYgKHN0YXJ0X3JvdyA+PSBwX3NvKQorICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwlpZiAoY3Vyd2luLT53X3RvcGZpbGwgPiAwKQorCSAgICAtLWN1cndpbi0+d190b3BmaWxsOworCWVsc2UKKyNlbmRpZgorCSAgICArK2N1cndpbi0+d190b3BsaW5lOworCSsrY3Vyd2luLT53X2JvdGxpbmU7CQkvKiBhcHByb3hpbWF0ZSB3X2JvdGxpbmUgKi8KKwljdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORSk7CisgICAgfQorfQorI2VuZGlmIC8qIEZFQVRfSU5TX0VYUEFORCAqLworCisvKgorICogQWRkIG9uZSBsaW5lIGFib3ZlICJscC0+bG51bSIuICBUaGlzIGNhbiBiZSBhIGZpbGxlciBsaW5lLCBhIGNsb3NlZCBmb2xkIG9yCisgKiBhICh3cmFwcGVkKSB0ZXh0IGxpbmUuICBVc2VzIGFuZCBzZXRzICJscC0+ZmlsbCIuCisgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGFkZGVkIGxpbmUgaW4gImxwLT5oZWlnaHQiLgorICogTGluZXMgYWJvdmUgdGhlIGZpcnN0IG9uZSBhcmUgaW5jcmVkaWJseSBoaWdoLgorICovCisgICAgc3RhdGljIHZvaWQKK3RvcGxpbmVfYmFjayhscCkKKyAgICBsaW5lb2ZmX1QJKmxwOworeworI2lmZGVmIEZFQVRfRElGRgorICAgIGlmIChscC0+ZmlsbCA8IGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIGxwLT5sbnVtKSkKKyAgICB7CisJLyogQWRkIGEgZmlsbGVyIGxpbmUuICovCisJKytscC0+ZmlsbDsKKwlscC0+aGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS0tbHAtPmxudW07CisjaWZkZWYgRkVBVF9ESUZGCisJbHAtPmZpbGwgPSAwOworI2VuZGlmCisJaWYgKGxwLT5sbnVtIDwgMSkKKwkgICAgbHAtPmhlaWdodCA9IE1BWENPTDsKKwllbHNlCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIGlmIChoYXNGb2xkaW5nKGxwLT5sbnVtLCAmbHAtPmxudW0sIE5VTEwpKQorCSAgICAvKiBBZGQgYSBjbG9zZWQgZm9sZCAqLworCSAgICBscC0+aGVpZ2h0ID0gMTsKKwllbHNlCisjZW5kaWYKKwl7CisjaWZkZWYgRkVBVF9ESUZGCisJICAgIGxwLT5oZWlnaHQgPSBwbGluZXNfbm9maWxsKGxwLT5sbnVtKTsKKyNlbHNlCisJICAgIGxwLT5oZWlnaHQgPSBwbGluZXMobHAtPmxudW0pOworI2VuZGlmCisJfQorICAgIH0KK30KKworLyoKKyAqIEFkZCBvbmUgbGluZSBiZWxvdyAibHAtPmxudW0iLiAgVGhpcyBjYW4gYmUgYSBmaWxsZXIgbGluZSwgYSBjbG9zZWQgZm9sZCBvcgorICogYSAod3JhcHBlZCkgdGV4dCBsaW5lLiAgVXNlcyBhbmQgc2V0cyAibHAtPmZpbGwiLgorICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBhZGRlZCBsaW5lIGluICJscC0+aGVpZ2h0Ii4KKyAqIExpbmVzIGJlbG93IHRoZSBsYXN0IG9uZSBhcmUgaW5jcmVkaWJseSBoaWdoLgorICovCisgICAgc3RhdGljIHZvaWQKK2JvdGxpbmVfZm9ydyhscCkKKyAgICBsaW5lb2ZmX1QJKmxwOworeworI2lmZGVmIEZFQVRfRElGRgorICAgIGlmIChscC0+ZmlsbCA8IGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIGxwLT5sbnVtICsgMSkpCisgICAgeworCS8qIEFkZCBhIGZpbGxlciBsaW5lLiAqLworCSsrbHAtPmZpbGw7CisJbHAtPmhlaWdodCA9IDE7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkrK2xwLT5sbnVtOworI2lmZGVmIEZFQVRfRElGRgorCWxwLT5maWxsID0gMDsKKyNlbmRpZgorCWlmIChscC0+bG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICBscC0+aGVpZ2h0ID0gTUFYQ09MOworCWVsc2UKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKGhhc0ZvbGRpbmcobHAtPmxudW0sIE5VTEwsICZscC0+bG51bSkpCisJICAgIC8qIEFkZCBhIGNsb3NlZCBmb2xkICovCisJICAgIGxwLT5oZWlnaHQgPSAxOworCWVsc2UKKyNlbmRpZgorCXsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgbHAtPmhlaWdodCA9IHBsaW5lc19ub2ZpbGwobHAtPmxudW0pOworI2Vsc2UKKwkgICAgbHAtPmhlaWdodCA9IHBsaW5lcyhscC0+bG51bSk7CisjZW5kaWYKKwl9CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9ESUZGCisvKgorICogU3dpdGNoIGZyb20gaW5jbHVkaW5nIGZpbGxlciBsaW5lcyBiZWxvdyBscC0+bG51bSB0byBpbmNsdWRpbmcgZmlsbGVyCisgKiBsaW5lcyBhYm92ZSBsb2ZmLmxudW0gKyAxLiAgVGhpcyBrZWVwcyBwb2ludGluZyB0byB0aGUgc2FtZSBsaW5lLgorICogV2hlbiB0aGVyZSBhcmUgbm8gZmlsbGVyIGxpbmVzIG5vdGhpbmcgY2hhbmdlcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitib3RsaW5lX3RvcGxpbmUobHApCisgICAgbGluZW9mZl9UCSpscDsKK3sKKyAgICBpZiAobHAtPmZpbGwgPiAwKQorICAgIHsKKwkrK2xwLT5sbnVtOworCWxwLT5maWxsID0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgbHAtPmxudW0pIC0gbHAtPmZpbGwgKyAxOworICAgIH0KK30KKworLyoKKyAqIFN3aXRjaCBmcm9tIGluY2x1ZGluZyBmaWxsZXIgbGluZXMgYWJvdmUgbHAtPmxudW0gdG8gaW5jbHVkaW5nIGZpbGxlcgorICogbGluZXMgYmVsb3cgbG9mZi5sbnVtIC0gMS4gIFRoaXMga2VlcHMgcG9pbnRpbmcgdG8gdGhlIHNhbWUgbGluZS4KKyAqIFdoZW4gdGhlcmUgYXJlIG5vIGZpbGxlciBsaW5lcyBub3RoaW5nIGNoYW5nZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordG9wbGluZV9ib3RsaW5lKGxwKQorICAgIGxpbmVvZmZfVAkqbHA7Cit7CisgICAgaWYgKGxwLT5maWxsID4gMCkKKyAgICB7CisJbHAtPmZpbGwgPSBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBscC0+bG51bSkgLSBscC0+ZmlsbCArIDE7CisJLS1scC0+bG51bTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFJlY29tcHV0ZSB0b3BsaW5lIHRvIHB1dCB0aGUgY3Vyc29yIGF0IHRoZSB0b3Agb2YgdGhlIHdpbmRvdy4KKyAqIFNjcm9sbCBhdCBsZWFzdCAibWluX3Njcm9sbCIgbGluZXMuCisgKiBJZiAiYWx3YXlzIiBpcyBUUlVFLCBhbHdheXMgc2V0IHRvcGxpbmUgKGZvciAienQiKS4KKyAqLworICAgIHZvaWQKK3Njcm9sbF9jdXJzb3JfdG9wKG1pbl9zY3JvbGwsIGFsd2F5cykKKyAgICBpbnQJCW1pbl9zY3JvbGw7CisgICAgaW50CQlhbHdheXM7Cit7CisgICAgaW50CQlzY3JvbGxlZCA9IDA7CisgICAgaW50CQlleHRyYSA9IDA7CisgICAgaW50CQl1c2VkOworICAgIGludAkJaTsKKyAgICBsaW5lbnJfVAl0b3A7CQkvKiBqdXN0IGFib3ZlIGRpc3BsYXllZCBsaW5lcyAqLworICAgIGxpbmVucl9UCWJvdDsJCS8qIGp1c3QgYmVsb3cgZGlzcGxheWVkIGxpbmVzICovCisgICAgbGluZW5yX1QJb2xkX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBsaW5lbnJfVAlvbGRfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisgICAgbGluZW5yX1QJbmV3X3RvcGxpbmU7CisgICAgaW50CQlvZmYgPSBwX3NvOworCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIGlmIChtb3VzZV9kcmFnZ2luZyA+IDApCisJb2ZmID0gbW91c2VfZHJhZ2dpbmcgLSAxOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIERlY3JlYXNlIHRvcGxpbmUgdW50aWw6CisgICAgICogLSBpdCBoYXMgYmVjb21lIDEKKyAgICAgKiAtIChwYXJ0IG9mKSB0aGUgY3Vyc29yIGxpbmUgaXMgbW92ZWQgb2ZmIHRoZSBzY3JlZW4gb3IKKyAgICAgKiAtIG1vdmVkIGF0IGxlYXN0ICdzY3JvbGxqdW1wJyBsaW5lcyBhbmQKKyAgICAgKiAtIGF0IGxlYXN0ICdzY3JvbGxvZmYnIGxpbmVzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3Vyc29yCisgICAgICovCisgICAgdmFsaWRhdGVfY2hlaWdodCgpOworICAgIHVzZWQgPSBjdXJ3aW4tPndfY2xpbmVfaGVpZ2h0OworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBjdXJ3aW4tPndfdG9wbGluZSkKKwlzY3JvbGxlZCA9IHVzZWQ7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sICZ0b3AsICZib3QpKQorICAgIHsKKwktLXRvcDsKKwkrK2JvdDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCXRvcCA9IGN1cndpbi0+d19jdXJzb3IubG51bSAtIDE7CisJYm90ID0gY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMTsKKyAgICB9CisgICAgbmV3X3RvcGxpbmUgPSB0b3AgKyAxOworCisjaWZkZWYgRkVBVF9ESUZGCisgICAgLyogY291bnQgZmlsbGVyIGxpbmVzIG9mIHRoZSBjdXJzb3Igd2luZG93IGFzIGNvbnRleHQgKi8KKyAgICBpID0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKyAgICB1c2VkICs9IGk7CisgICAgZXh0cmEgKz0gaTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgbGluZXMgZnJvbSAidG9wIiB0byAiYm90IiBmaXQgaW4gdGhlIHdpbmRvdy4gIElmIHRoZXkgZG8sCisgICAgICogc2V0IG5ld190b3BsaW5lIGFuZCBhZHZhbmNlICJ0b3AiIGFuZCAiYm90IiB0byBpbmNsdWRlIG1vcmUgbGluZXMuCisgICAgICovCisgICAgd2hpbGUgKHRvcCA+IDApCisgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCWlmIChoYXNGb2xkaW5nKHRvcCwgJnRvcCwgTlVMTCkpCisJICAgIC8qIGNvdW50IG9uZSBsb2dpY2FsIGxpbmUgZm9yIGEgc2VxdWVuY2Ugb2YgZm9sZGVkIGxpbmVzICovCisJICAgIGkgPSAxOworCWVsc2UKKyNlbmRpZgorCSAgICBpID0gcGxpbmVzKHRvcCk7CisJdXNlZCArPSBpOworCWlmIChleHRyYSArIGkgPD0gb2ZmICYmIGJvdCA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKGhhc0ZvbGRpbmcoYm90LCBOVUxMLCAmYm90KSkKKwkJLyogY291bnQgb25lIGxvZ2ljYWwgbGluZSBmb3IgYSBzZXF1ZW5jZSBvZiBmb2xkZWQgbGluZXMgKi8KKwkJKyt1c2VkOworCSAgICBlbHNlCisjZW5kaWYKKwkJdXNlZCArPSBwbGluZXMoYm90KTsKKwl9CisJaWYgKHVzZWQgPiBjdXJ3aW4tPndfaGVpZ2h0KQorCSAgICBicmVhazsKKwlpZiAodG9wIDwgY3Vyd2luLT53X3RvcGxpbmUpCisJICAgIHNjcm9sbGVkICs9IGk7CisKKwkvKgorCSAqIElmIHNjcm9sbGluZyBpcyBuZWVkZWQsIHNjcm9sbCBhdCBsZWFzdCAnc2onIGxpbmVzLgorCSAqLworCWlmICgobmV3X3RvcGxpbmUgPj0gY3Vyd2luLT53X3RvcGxpbmUgfHwgc2Nyb2xsZWQgPiBtaW5fc2Nyb2xsKQorCQkmJiBleHRyYSA+PSBvZmYpCisJICAgIGJyZWFrOworCisJZXh0cmEgKz0gaTsKKwluZXdfdG9wbGluZSA9IHRvcDsKKwktLXRvcDsKKwkrK2JvdDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlLCBwdXQgY3Vyc29yIGluIHRoZSBtaWRkbGUuCisgICAgICogVGhpcyBtYWtlcyBzdXJlIHdlIGdldCB0aGUgc2FtZSBwb3NpdGlvbiB3aGVuIHVzaW5nICJrIiBhbmQgImoiCisgICAgICogaW4gYSBzbWFsbCB3aW5kb3cuCisgICAgICovCisgICAgaWYgKHVzZWQgPiBjdXJ3aW4tPndfaGVpZ2h0KQorCXNjcm9sbF9jdXJzb3JfaGFsZndheShGQUxTRSk7CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIElmICJhbHdheXMiIGlzIEZBTFNFLCBvbmx5IGFkanVzdCB0b3BsaW5lIHRvIGEgbG93ZXIgdmFsdWUsIGhpZ2hlcgorCSAqIHZhbHVlIG1heSBoYXBwZW4gd2l0aCB3cmFwcGluZyBsaW5lcworCSAqLworCWlmIChuZXdfdG9wbGluZSA8IGN1cndpbi0+d190b3BsaW5lIHx8IGFsd2F5cykKKwkgICAgY3Vyd2luLT53X3RvcGxpbmUgPSBuZXdfdG9wbGluZTsKKwlpZiAoY3Vyd2luLT53X3RvcGxpbmUgPiBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIGN1cndpbi0+d190b3BsaW5lID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2lmZGVmIEZFQVRfRElGRgorCWN1cndpbi0+d190b3BmaWxsID0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpOworCWlmIChjdXJ3aW4tPndfdG9wZmlsbCA+IDAgJiYgZXh0cmEgPiBvZmYpCisJeworCSAgICBjdXJ3aW4tPndfdG9wZmlsbCAtPSBleHRyYSAtIG9mZjsKKwkgICAgaWYgKGN1cndpbi0+d190b3BmaWxsIDwgMCkKKwkJY3Vyd2luLT53X3RvcGZpbGwgPSAwOworCX0KKwljaGVja190b3BmaWxsKGN1cndpbiwgRkFMU0UpOworI2VuZGlmCisJaWYgKGN1cndpbi0+d190b3BsaW5lICE9IG9sZF90b3BsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJCXx8IGN1cndpbi0+d190b3BmaWxsICE9IG9sZF90b3BmaWxsCisjZW5kaWYKKwkJKQorCSAgICBjdXJ3aW4tPndfdmFsaWQgJj0KKwkJICAgICAgfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORXxWQUxJRF9CT1RMSU5FX0FQKTsKKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKKyAgICB9Cit9CisKKy8qCisgKiBTZXQgd19lbXB0eV9yb3dzIGFuZCB3X2ZpbGxlcl9yb3dzIGZvciB3aW5kb3cgIndwIiwgaGF2aW5nIHVzZWQgdXAgInVzZWQiCisgKiBzY3JlZW4gbGluZXMgZm9yIHRleHQgbGluZXMuCisgKi8KKyAgICB2b2lkCitzZXRfZW1wdHlfcm93cyh3cCwgdXNlZCkKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl1c2VkOworeworI2lmZGVmIEZFQVRfRElGRgorICAgIHdwLT53X2ZpbGxlcl9yb3dzID0gMDsKKyNlbmRpZgorICAgIGlmICh1c2VkID09IDApCisJd3AtPndfZW1wdHlfcm93cyA9IDA7CS8qIHNpbmdsZSBsaW5lIHRoYXQgZG9lc24ndCBmaXQgKi8KKyAgICBlbHNlCisgICAgeworCXdwLT53X2VtcHR5X3Jvd3MgPSB3cC0+d19oZWlnaHQgLSB1c2VkOworI2lmZGVmIEZFQVRfRElGRgorCWlmICh3cC0+d19ib3RsaW5lIDw9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXsKKwkgICAgd3AtPndfZmlsbGVyX3Jvd3MgPSBkaWZmX2NoZWNrX2ZpbGwod3AsIHdwLT53X2JvdGxpbmUpOworCSAgICBpZiAod3AtPndfZW1wdHlfcm93cyA+IHdwLT53X2ZpbGxlcl9yb3dzKQorCQl3cC0+d19lbXB0eV9yb3dzIC09IHdwLT53X2ZpbGxlcl9yb3dzOworCSAgICBlbHNlCisJICAgIHsKKwkJd3AtPndfZmlsbGVyX3Jvd3MgPSB3cC0+d19lbXB0eV9yb3dzOworCQl3cC0+d19lbXB0eV9yb3dzID0gMDsKKwkgICAgfQorCX0KKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIFJlY29tcHV0ZSB0b3BsaW5lIHRvIHB1dCB0aGUgY3Vyc29yIGF0IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdy4KKyAqIFNjcm9sbCBhdCBsZWFzdCAibWluX3Njcm9sbCIgbGluZXMuCisgKiBJZiAic2V0X3RvcGJvdCIgaXMgVFJVRSwgc2V0IHRvcGxpbmUgYW5kIGJvdGxpbmUgZmlyc3QgKGZvciAiemIiKS4KKyAqIFRoaXMgaXMgbWVzc3kgc3R1ZmYhISEKKyAqLworICAgIHZvaWQKK3Njcm9sbF9jdXJzb3JfYm90KG1pbl9zY3JvbGwsIHNldF90b3Bib3QpCisgICAgaW50CQltaW5fc2Nyb2xsOworICAgIGludAkJc2V0X3RvcGJvdDsKK3sKKyAgICBpbnQJCXVzZWQ7CisgICAgaW50CQlzY3JvbGxlZCA9IDA7CisgICAgaW50CQlleHRyYSA9IDA7CisgICAgaW50CQlpOworICAgIGxpbmVucl9UCWxpbmVfY291bnQ7CisgICAgbGluZW5yX1QJb2xkX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyAgICBsaW5lb2ZmX1QJbG9mZjsKKyAgICBsaW5lb2ZmX1QJYm9mZjsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBpbnQJCW9sZF90b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CisgICAgaW50CQlmaWxsX2JlbG93X3dpbmRvdzsKKyNlbmRpZgorICAgIGxpbmVucl9UCW9sZF9ib3RsaW5lID0gY3Vyd2luLT53X2JvdGxpbmU7CisgICAgbGluZW5yX1QJb2xkX3ZhbGlkID0gY3Vyd2luLT53X3ZhbGlkOworICAgIGludAkJb2xkX2VtcHR5X3Jvd3MgPSBjdXJ3aW4tPndfZW1wdHlfcm93czsKKyAgICBsaW5lbnJfVAljbG47CQkgICAgLyogQ3Vyc29yIExpbmUgTnVtYmVyICovCisKKyAgICBjbG4gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgaWYgKHNldF90b3Bib3QpCisgICAgeworCXVzZWQgPSAwOworCWN1cndpbi0+d19ib3RsaW5lID0gY2xuICsgMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwlsb2ZmLmZpbGwgPSAwOworI2VuZGlmCisJZm9yIChjdXJ3aW4tPndfdG9wbGluZSA9IGN1cndpbi0+d19ib3RsaW5lOworCQljdXJ3aW4tPndfdG9wbGluZSA+IDE7CisJCWN1cndpbi0+d190b3BsaW5lID0gbG9mZi5sbnVtKQorCXsKKwkgICAgbG9mZi5sbnVtID0gY3Vyd2luLT53X3RvcGxpbmU7CisJICAgIHRvcGxpbmVfYmFjaygmbG9mZik7CisJICAgIGlmICh1c2VkICsgbG9mZi5oZWlnaHQgPiBjdXJ3aW4tPndfaGVpZ2h0KQorCQlicmVhazsKKwkgICAgdXNlZCArPSBsb2ZmLmhlaWdodDsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgY3Vyd2luLT53X3RvcGZpbGwgPSBsb2ZmLmZpbGw7CisjZW5kaWYKKwl9CisJc2V0X2VtcHR5X3Jvd3MoY3Vyd2luLCB1c2VkKTsKKwljdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfQk9UTElORXxWQUxJRF9CT1RMSU5FX0FQOworCWlmIChjdXJ3aW4tPndfdG9wbGluZSAhPSBvbGRfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQl8fCBjdXJ3aW4tPndfdG9wZmlsbCAhPSBvbGRfdG9wZmlsbAorI2VuZGlmCisJCSkKKwkgICAgY3Vyd2luLT53X3ZhbGlkICY9IH4oVkFMSURfV1JPV3xWQUxJRF9DUk9XKTsKKyAgICB9CisgICAgZWxzZQorCXZhbGlkYXRlX2JvdGxpbmUoKTsKKworICAgIC8qIFRoZSBsaW5lcyBvZiB0aGUgY3Vyc29yIGxpbmUgaXRzZWxmIGFyZSBhbHdheXMgdXNlZC4gKi8KKyNpZmRlZiBGRUFUX0RJRkYKKyAgICB1c2VkID0gcGxpbmVzX25vZmlsbChjbG4pOworI2Vsc2UKKyAgICB2YWxpZGF0ZV9jaGVpZ2h0KCk7CisgICAgdXNlZCA9IGN1cndpbi0+d19jbGluZV9oZWlnaHQ7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBjdXJzb3IgaXMgYmVsb3cgYm90bGluZSwgd2Ugd2lsbCBhdCBsZWFzdCBzY3JvbGwgYnkgdGhlIGhlaWdodAorICAgICAqIG9mIHRoZSBjdXJzb3IgbGluZS4gIENvcnJlY3QgZm9yIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgcmVhbGx5IHBhcnQgb2YKKyAgICAgKiBib3RsaW5lLiAqLworICAgIGlmIChjbG4gPj0gY3Vyd2luLT53X2JvdGxpbmUpCisgICAgeworCXNjcm9sbGVkID0gdXNlZDsKKwlpZiAoY2xuID09IGN1cndpbi0+d19ib3RsaW5lKQorCSAgICBzY3JvbGxlZCAtPSBjdXJ3aW4tPndfZW1wdHlfcm93czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0b3AgY291bnRpbmcgbGluZXMgdG8gc2Nyb2xsIHdoZW4KKyAgICAgKiAtIGhpdHRpbmcgc3RhcnQgb2YgdGhlIGZpbGUKKyAgICAgKiAtIHNjcm9sbGVkIG5vdGhpbmcgb3IgYXQgbGVhc3QgJ3NqJyBsaW5lcworICAgICAqIC0gYXQgbGVhc3QgJ3NvJyBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yCisgICAgICogLSBsaW5lcyBiZXR3ZWVuIGJvdGxpbmUgYW5kIGN1cnNvciBoYXZlIGJlZW4gY291bnRlZAorICAgICAqLworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICghaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sICZsb2ZmLmxudW0sICZib2ZmLmxudW0pKQorI2VuZGlmCisgICAgeworCWxvZmYubG51bSA9IGNsbjsKKwlib2ZmLmxudW0gPSBjbG47CisgICAgfQorI2lmZGVmIEZFQVRfRElGRgorICAgIGxvZmYuZmlsbCA9IDA7CisgICAgYm9mZi5maWxsID0gMDsKKyAgICBmaWxsX2JlbG93X3dpbmRvdyA9IGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIGN1cndpbi0+d19ib3RsaW5lKQorCQkJCQkJICAgICAgLSBjdXJ3aW4tPndfZmlsbGVyX3Jvd3M7CisjZW5kaWYKKworICAgIHdoaWxlIChsb2ZmLmxudW0gPiAxKQorICAgIHsKKwkvKiBTdG9wIHdoZW4gc2Nyb2xsZWQgbm90aGluZyBvciBhdCBsZWFzdCAibWluX3Njcm9sbCIsIGZvdW5kICJleHRyYSIKKwkgKiBjb250ZXh0IGZvciAnc2Nyb2xsb2ZmJyBhbmQgY291bnRlZCBhbGwgbGluZXMgYmVsb3cgdGhlIHdpbmRvdy4gKi8KKwlpZiAoKCgoc2Nyb2xsZWQgPD0gMCB8fCBzY3JvbGxlZCA+PSBtaW5fc2Nyb2xsKQorCQkJJiYgZXh0cmEgPj0gKAorI2lmZGVmIEZFQVRfTU9VU0UKKwkJCSAgICBtb3VzZV9kcmFnZ2luZyA/IG1vdXNlX2RyYWdnaW5nIC0gMSA6CisjZW5kaWYKKwkJCSAgICBwX3NvKSkKKwkJICAgIHx8IGJvZmYubG51bSArIDEgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJJiYgbG9mZi5sbnVtIDw9IGN1cndpbi0+d19ib3RsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJCSYmIChsb2ZmLmxudW0gPCBjdXJ3aW4tPndfYm90bGluZQorCQkgICAgfHwgbG9mZi5maWxsID49IGZpbGxfYmVsb3dfd2luZG93KQorI2VuZGlmCisJCSkKKwkgICAgYnJlYWs7CisKKwkvKiBBZGQgb25lIGxpbmUgYWJvdmUgKi8KKwl0b3BsaW5lX2JhY2soJmxvZmYpOworCXVzZWQgKz0gbG9mZi5oZWlnaHQ7CisJaWYgKHVzZWQgPiBjdXJ3aW4tPndfaGVpZ2h0KQorCSAgICBicmVhazsKKwlpZiAobG9mZi5sbnVtID49IGN1cndpbi0+d19ib3RsaW5lCisjaWZkZWYgRkVBVF9ESUZGCisJCSYmIChsb2ZmLmxudW0gPiBjdXJ3aW4tPndfYm90bGluZQorCQkgICAgfHwgbG9mZi5maWxsIDw9IGZpbGxfYmVsb3dfd2luZG93KQorI2VuZGlmCisJCSkKKwl7CisJICAgIC8qIENvdW50IHNjcmVlbiBsaW5lcyB0aGF0IGFyZSBiZWxvdyB0aGUgd2luZG93LiAqLworCSAgICBzY3JvbGxlZCArPSBsb2ZmLmhlaWdodDsKKwkgICAgaWYgKGxvZmYubG51bSA9PSBjdXJ3aW4tPndfYm90bGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkJICAgICYmIGJvZmYuZmlsbCA9PSAwCisjZW5kaWYKKwkJICAgICkKKwkJc2Nyb2xsZWQgLT0gY3Vyd2luLT53X2VtcHR5X3Jvd3M7CisJfQorCisJaWYgKGJvZmYubG51bSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXsKKwkgICAgLyogQWRkIG9uZSBsaW5lIGJlbG93ICovCisJICAgIGJvdGxpbmVfZm9ydygmYm9mZik7CisJICAgIHVzZWQgKz0gYm9mZi5oZWlnaHQ7CisJICAgIGlmICh1c2VkID4gY3Vyd2luLT53X2hlaWdodCkKKwkJYnJlYWs7CisJICAgIGlmIChleHRyYSA8ICgKKyNpZmRlZiBGRUFUX01PVVNFCisJCQltb3VzZV9kcmFnZ2luZyA+IDAgPyBtb3VzZV9kcmFnZ2luZyAtIDEgOgorI2VuZGlmCisJCQlwX3NvKSB8fCBzY3JvbGxlZCA8IG1pbl9zY3JvbGwpCisJICAgIHsKKwkJZXh0cmEgKz0gYm9mZi5oZWlnaHQ7CisJCWlmIChib2ZmLmxudW0gPj0gY3Vyd2luLT53X2JvdGxpbmUKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCXx8IChib2ZmLmxudW0gKyAxID09IGN1cndpbi0+d19ib3RsaW5lCisJCQkgICAgJiYgYm9mZi5maWxsID4gY3Vyd2luLT53X2ZpbGxlcl9yb3dzKQorI2VuZGlmCisJCSAgICkKKwkJeworCQkgICAgLyogQ291bnQgc2NyZWVuIGxpbmVzIHRoYXQgYXJlIGJlbG93IHRoZSB3aW5kb3cuICovCisJCSAgICBzY3JvbGxlZCArPSBib2ZmLmhlaWdodDsKKwkJICAgIGlmIChib2ZmLmxudW0gPT0gY3Vyd2luLT53X2JvdGxpbmUKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCSAgICAmJiBib2ZmLmZpbGwgPT0gMAorI2VuZGlmCisJCQkgICAgKQorCQkJc2Nyb2xsZWQgLT0gY3Vyd2luLT53X2VtcHR5X3Jvd3M7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBjdXJ3aW4tPndfZW1wdHlfcm93cyBpcyBsYXJnZXIsIG5vIG5lZWQgdG8gc2Nyb2xsICovCisgICAgaWYgKHNjcm9sbGVkIDw9IDApCisJbGluZV9jb3VudCA9IDA7CisgICAgLyogbW9yZSB0aGFuIGEgc2NyZWVuZnVsbCwgZG9uJ3Qgc2Nyb2xsIGJ1dCByZWRyYXcgKi8KKyAgICBlbHNlIGlmICh1c2VkID4gY3Vyd2luLT53X2hlaWdodCkKKwlsaW5lX2NvdW50ID0gdXNlZDsKKyAgICAvKiBzY3JvbGwgbWluaW1hbCBudW1iZXIgb2YgbGluZXMgKi8KKyAgICBlbHNlCisgICAgeworCWxpbmVfY291bnQgPSAwOworI2lmZGVmIEZFQVRfRElGRgorCWJvZmYuZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisJYm9mZi5sbnVtID0gY3Vyd2luLT53X3RvcGxpbmUgLSAxOworCWZvciAoaSA9IDA7IGkgPCBzY3JvbGxlZCAmJiBib2ZmLmxudW0gPCBjdXJ3aW4tPndfYm90bGluZTsgKQorCXsKKwkgICAgYm90bGluZV9mb3J3KCZib2ZmKTsKKwkgICAgaSArPSBib2ZmLmhlaWdodDsKKwkgICAgKytsaW5lX2NvdW50OworCX0KKwlpZiAoaSA8IHNjcm9sbGVkKQkvKiBiZWxvdyBjdXJ3aW4tPndfYm90bGluZSwgZG9uJ3Qgc2Nyb2xsICovCisJICAgIGxpbmVfY291bnQgPSA5OTk5OworICAgIH0KKworICAgIC8qCisgICAgICogU2Nyb2xsIHVwIGlmIHRoZSBjdXJzb3IgaXMgb2ZmIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiBhIGJpdC4KKyAgICAgKiBPdGhlcndpc2UgcHV0IGl0IGF0IDEvMiBvZiB0aGUgc2NyZWVuLgorICAgICAqLworICAgIGlmIChsaW5lX2NvdW50ID49IGN1cndpbi0+d19oZWlnaHQgJiYgbGluZV9jb3VudCA+IG1pbl9zY3JvbGwpCisJc2Nyb2xsX2N1cnNvcl9oYWxmd2F5KEZBTFNFKTsKKyAgICBlbHNlCisJc2Nyb2xsdXAobGluZV9jb3VudCwgVFJVRSk7CisKKyAgICAvKgorICAgICAqIElmIHRvcGxpbmUgZGlkbid0IGNoYW5nZSB3ZSBuZWVkIHRvIHJlc3RvcmUgd19ib3RsaW5lIGFuZCB3X2VtcHR5X3Jvd3MKKyAgICAgKiAod2UgY2hhbmdlZCB0aGVtKS4KKyAgICAgKiBJZiB0b3BsaW5lIGRpZCBjaGFuZ2UsIHVwZGF0ZV9zY3JlZW4oKSB3aWxsIHNldCBib3RsaW5lLgorICAgICAqLworICAgIGlmIChjdXJ3aW4tPndfdG9wbGluZSA9PSBvbGRfdG9wbGluZSAmJiBzZXRfdG9wYm90KQorICAgIHsKKwljdXJ3aW4tPndfYm90bGluZSA9IG9sZF9ib3RsaW5lOworCWN1cndpbi0+d19lbXB0eV9yb3dzID0gb2xkX2VtcHR5X3Jvd3M7CisJY3Vyd2luLT53X3ZhbGlkID0gb2xkX3ZhbGlkOworICAgIH0KKyAgICBjdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKK30KKworLyoKKyAqIFJlY29tcHV0ZSB0b3BsaW5lIHRvIHB1dCB0aGUgY3Vyc29yIGhhbGZ3YXkgdGhlIHdpbmRvdworICogSWYgImF0ZW5kIiBpcyBUUlVFLCBhbHNvIHB1dCBpdCBoYWxmd2F5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKyAgICB2b2lkCitzY3JvbGxfY3Vyc29yX2hhbGZ3YXkoYXRlbmQpCisgICAgaW50CQlhdGVuZDsKK3sKKyAgICBpbnQJCWFib3ZlID0gMDsKKyAgICBsaW5lbnJfVAl0b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJdG9wZmlsbCA9IDA7CisjZW5kaWYKKyAgICBpbnQJCWJlbG93ID0gMDsKKyAgICBpbnQJCXVzZWQ7CisgICAgbGluZW9mZl9UCWxvZmY7CisgICAgbGluZW9mZl9UCWJvZmY7CisKKyAgICBsb2ZmLmxudW0gPSBib2ZmLmxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgKHZvaWQpaGFzRm9sZGluZyhsb2ZmLmxudW0sICZsb2ZmLmxudW0sICZib2ZmLmxudW0pOworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisgICAgdXNlZCA9IHBsaW5lc19ub2ZpbGwobG9mZi5sbnVtKTsKKyAgICBsb2ZmLmZpbGwgPSAwOworICAgIGJvZmYuZmlsbCA9IDA7CisjZWxzZQorICAgIHVzZWQgPSBwbGluZXMobG9mZi5sbnVtKTsKKyNlbmRpZgorICAgIHRvcGxpbmUgPSBsb2ZmLmxudW07CisgICAgd2hpbGUgKHRvcGxpbmUgPiAxKQorICAgIHsKKwlpZiAoYmVsb3cgPD0gYWJvdmUpCSAgICAvKiBhZGQgYSBsaW5lIGJlbG93IHRoZSBjdXJzb3IgZmlyc3QgKi8KKwl7CisJICAgIGlmIChib2ZmLmxudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgeworCQlib3RsaW5lX2ZvcncoJmJvZmYpOworCQl1c2VkICs9IGJvZmYuaGVpZ2h0OworCQlpZiAodXNlZCA+IGN1cndpbi0+d19oZWlnaHQpCisJCSAgICBicmVhazsKKwkJYmVsb3cgKz0gYm9mZi5oZWlnaHQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCSsrYmVsb3c7CSAgICAvKiBjb3VudCBhICJ+IiBsaW5lICovCisJCWlmIChhdGVuZCkKKwkJICAgICsrdXNlZDsKKwkgICAgfQorCX0KKworCWlmIChiZWxvdyA+IGFib3ZlKQkgICAgLyogYWRkIGEgbGluZSBhYm92ZSB0aGUgY3Vyc29yICovCisJeworCSAgICB0b3BsaW5lX2JhY2soJmxvZmYpOworCSAgICB1c2VkICs9IGxvZmYuaGVpZ2h0OworCSAgICBpZiAodXNlZCA+IGN1cndpbi0+d19oZWlnaHQpCisJCWJyZWFrOworCSAgICBhYm92ZSArPSBsb2ZmLmhlaWdodDsKKwkgICAgdG9wbGluZSA9IGxvZmYubG51bTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgdG9wZmlsbCA9IGxvZmYuZmlsbDsKKyNlbmRpZgorCX0KKyAgICB9CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKCFoYXNGb2xkaW5nKHRvcGxpbmUsICZjdXJ3aW4tPndfdG9wbGluZSwgTlVMTCkpCisjZW5kaWYKKwljdXJ3aW4tPndfdG9wbGluZSA9IHRvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgY3Vyd2luLT53X3RvcGZpbGwgPSB0b3BmaWxsOworICAgIGNoZWNrX3RvcGZpbGwoY3Vyd2luLCBGQUxTRSk7CisjZW5kaWYKKyAgICBjdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORXxWQUxJRF9CT1RMSU5FX0FQKTsKKyAgICBjdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKK30KKworLyoKKyAqIENvcnJlY3QgdGhlIGN1cnNvciBwb3NpdGlvbiBzbyB0aGF0IGl0IGlzIGluIGEgcGFydCBvZiB0aGUgc2NyZWVuIGF0IGxlYXN0CisgKiAnc28nIGxpbmVzIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tLCBpZiBwb3NzaWJsZS4KKyAqIElmIG5vdCBwb3NzaWJsZSwgcHV0IGl0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIHNjcm9sbF9jdXJzb3JfaGFsZndheSgpLgorICogV2hlbiBjYWxsZWQgdG9wbGluZSBtdXN0IGJlIHZhbGlkIQorICovCisgICAgdm9pZAorY3Vyc29yX2NvcnJlY3QoKQoreworICAgIGludAkJYWJvdmUgPSAwOwkgICAgLyogc2NyZWVuIGxpbmVzIGFib3ZlIHRvcGxpbmUgKi8KKyAgICBsaW5lbnJfVAl0b3BsaW5lOworICAgIGludAkJYmVsb3cgPSAwOwkgICAgLyogc2NyZWVuIGxpbmVzIGJlbG93IGJvdGxpbmUgKi8KKyAgICBsaW5lbnJfVAlib3RsaW5lOworICAgIGludAkJYWJvdmVfd2FudGVkLCBiZWxvd193YW50ZWQ7CisgICAgbGluZW5yX1QJY2xuOwkJICAgIC8qIEN1cnNvciBMaW5lIE51bWJlciAqLworICAgIGludAkJbWF4X29mZjsKKworICAgIC8qCisgICAgICogSG93IG1hbnkgbGluZXMgd2Ugd291bGQgbGlrZSB0byBoYXZlIGFib3ZlL2JlbG93IHRoZSBjdXJzb3IgZGVwZW5kcyBvbgorICAgICAqIHdoZXRoZXIgdGhlIGZpcnN0L2xhc3QgbGluZSBvZiB0aGUgZmlsZSBpcyBvbiBzY3JlZW4uCisgICAgICovCisgICAgYWJvdmVfd2FudGVkID0gcF9zbzsKKyAgICBiZWxvd193YW50ZWQgPSBwX3NvOworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBpZiAobW91c2VfZHJhZ2dpbmcpCisgICAgeworCWFib3ZlX3dhbnRlZCA9IG1vdXNlX2RyYWdnaW5nIC0gMTsKKwliZWxvd193YW50ZWQgPSBtb3VzZV9kcmFnZ2luZyAtIDE7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGN1cndpbi0+d190b3BsaW5lID09IDEpCisgICAgeworCWFib3ZlX3dhbnRlZCA9IDA7CisJbWF4X29mZiA9IGN1cndpbi0+d19oZWlnaHQgLyAyOworCWlmIChiZWxvd193YW50ZWQgPiBtYXhfb2ZmKQorCSAgICBiZWxvd193YW50ZWQgPSBtYXhfb2ZmOworICAgIH0KKyAgICB2YWxpZGF0ZV9ib3RsaW5lKCk7CisgICAgaWYgKGN1cndpbi0+d19ib3RsaW5lID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMQorI2lmZGVmIEZFQVRfTU9VU0UKKwkgICAgJiYgIW1vdXNlX2RyYWdnaW5nCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwliZWxvd193YW50ZWQgPSAwOworCW1heF9vZmYgPSAoY3Vyd2luLT53X2hlaWdodCAtIDEpIC8gMjsKKwlpZiAoYWJvdmVfd2FudGVkID4gbWF4X29mZikKKwkgICAgYWJvdmVfd2FudGVkID0gbWF4X29mZjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGFyZSBzdWZmaWNpZW50IGZpbGUtbGluZXMgYWJvdmUgYW5kIGJlbG93IHRoZSBjdXJzb3IsIHdlIGNhbgorICAgICAqIHJldHVybiBub3cuCisgICAgICovCisgICAgY2xuID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGlmIChjbG4gPj0gY3Vyd2luLT53X3RvcGxpbmUgKyBhYm92ZV93YW50ZWQKKwkgICAgJiYgY2xuIDwgY3Vyd2luLT53X2JvdGxpbmUgLSBiZWxvd193YW50ZWQKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgJiYgIWhhc0FueUZvbGRpbmcoY3Vyd2luKQorI2VuZGlmCisJICAgICkKKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIE5hcnJvdyBkb3duIHRoZSBhcmVhIHdoZXJlIHRoZSBjdXJzb3IgY2FuIGJlIHB1dCBieSB0YWtpbmcgbGluZXMgZnJvbQorICAgICAqIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gdW50aWw6CisgICAgICogLSB0aGUgZGVzaXJlZCBjb250ZXh0IGxpbmVzIGFyZSBmb3VuZAorICAgICAqIC0gdGhlIGxpbmVzIGZyb20gdGhlIHRvcCBpcyBwYXN0IHRoZSBsaW5lcyBmcm9tIHRoZSBib3R0b20KKyAgICAgKi8KKyAgICB0b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisgICAgYm90bGluZSA9IGN1cndpbi0+d19ib3RsaW5lIC0gMTsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKiBjb3VudCBmaWxsZXIgbGluZXMgYXMgY29udGV4dCAqLworICAgIGFib3ZlID0gY3Vyd2luLT53X3RvcGZpbGw7CisgICAgYmVsb3cgPSBjdXJ3aW4tPndfZmlsbGVyX3Jvd3M7CisjZW5kaWYKKyAgICB3aGlsZSAoKGFib3ZlIDwgYWJvdmVfd2FudGVkIHx8IGJlbG93IDwgYmVsb3dfd2FudGVkKSAmJiB0b3BsaW5lIDwgYm90bGluZSkKKyAgICB7CisJaWYgKGJlbG93IDwgYmVsb3dfd2FudGVkICYmIChiZWxvdyA8PSBhYm92ZSB8fCBhYm92ZSA+PSBhYm92ZV93YW50ZWQpKQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKGhhc0ZvbGRpbmcoYm90bGluZSwgJmJvdGxpbmUsIE5VTEwpKQorCQkrK2JlbG93OworCSAgICBlbHNlCisjZW5kaWYKKwkJYmVsb3cgKz0gcGxpbmVzKGJvdGxpbmUpOworCSAgICAtLWJvdGxpbmU7CisJfQorCWlmIChhYm92ZSA8IGFib3ZlX3dhbnRlZCAmJiAoYWJvdmUgPCBiZWxvdyB8fCBiZWxvdyA+PSBiZWxvd193YW50ZWQpKQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKGhhc0ZvbGRpbmcodG9wbGluZSwgTlVMTCwgJnRvcGxpbmUpKQorCQkrK2Fib3ZlOworCSAgICBlbHNlCisjZW5kaWYKKyNpZm5kZWYgRkVBVF9ESUZGCisJCWFib3ZlICs9IHBsaW5lcyh0b3BsaW5lKTsKKyNlbHNlCisJCWFib3ZlICs9IHBsaW5lc19ub2ZpbGwodG9wbGluZSk7CisKKwkgICAgLyogQ291bnQgZmlsbGVyIGxpbmVzIGJlbG93IHRoaXMgbGluZSBhcyBjb250ZXh0LiAqLworCSAgICBpZiAodG9wbGluZSA8IGJvdGxpbmUpCisJCWFib3ZlICs9IGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIHRvcGxpbmUgKyAxKTsKKyNlbmRpZgorCSAgICArK3RvcGxpbmU7CisJfQorICAgIH0KKyAgICBpZiAodG9wbGluZSA9PSBib3RsaW5lIHx8IGJvdGxpbmUgPT0gMCkKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0b3BsaW5lOworICAgIGVsc2UgaWYgKHRvcGxpbmUgPiBib3RsaW5lKQorCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGJvdGxpbmU7CisgICAgZWxzZQorICAgIHsKKwlpZiAoY2xuIDwgdG9wbGluZSAmJiBjdXJ3aW4tPndfdG9wbGluZSA+IDEpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSB0b3BsaW5lOworCSAgICBjdXJ3aW4tPndfdmFsaWQgJj0KKwkJCSAgICB+KFZBTElEX1dST1d8VkFMSURfV0NPTHxWQUxJRF9DSEVJR0hUfFZBTElEX0NST1cpOworCX0KKwlpZiAoY2xuID4gYm90bGluZSAmJiBjdXJ3aW4tPndfYm90bGluZSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGJvdGxpbmU7CisJICAgIGN1cndpbi0+d192YWxpZCAmPQorCQkJICAgIH4oVkFMSURfV1JPV3xWQUxJRF9XQ09MfFZBTElEX0NIRUlHSFR8VkFMSURfQ1JPVyk7CisJfQorICAgIH0KKyAgICBjdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3Njcm9sbF9vdmVybGFwIF9fQVJHUygobGluZW9mZl9UICpscCwgaW50IGRpcikpOworCisvKgorICogbW92ZSBzY3JlZW4gJ2NvdW50JyBwYWdlcyB1cCBvciBkb3duIGFuZCB1cGRhdGUgc2NyZWVuCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CitvbmVwYWdlKGRpciwgY291bnQpCisgICAgaW50CQlkaXI7CisgICAgbG9uZwljb3VudDsKK3sKKyAgICBsb25nCW47CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKyAgICBsaW5lb2ZmX1QJbG9mZjsKKyAgICBsaW5lbnJfVAlvbGRfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID09IDEpICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB7CisJYmVlcF9mbHVzaCgpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIGZvciAoIDsgY291bnQgPiAwOyAtLWNvdW50KQorICAgIHsKKwl2YWxpZGF0ZV9ib3RsaW5lKCk7CisJLyoKKwkgKiBJdCdzIGFuIGVycm9yIHRvIG1vdmUgYSBwYWdlIHVwIHdoZW4gdGhlIGZpcnN0IGxpbmUgaXMgYWxyZWFkeSBvbgorCSAqIHRoZSBzY3JlZW4uCUl0J3MgYW4gZXJyb3IgdG8gbW92ZSBhIHBhZ2UgZG93biB3aGVuIHRoZSBsYXN0IGxpbmUKKwkgKiBpcyBvbiB0aGUgc2NyZWVuIGFuZCB0aGUgdG9wbGluZSBpcyAnc2Nyb2xsb2ZmJyBsaW5lcyBmcm9tIHRoZQorCSAqIGxhc3QgbGluZS4KKwkgKi8KKwlpZiAoZGlyID09IEZPUldBUkQKKwkJPyAoKGN1cndpbi0+d190b3BsaW5lID49IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gcF9zbykKKwkJICAgICYmIGN1cndpbi0+d19ib3RsaW5lID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCTogKGN1cndpbi0+d190b3BsaW5lID09IDEKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgICYmIGN1cndpbi0+d190b3BmaWxsID09CisJCQkJICAgIGRpZmZfY2hlY2tfZmlsbChjdXJ3aW4sIGN1cndpbi0+d190b3BsaW5lKQorI2VuZGlmCisJCSAgICApKQorCXsKKwkgICAgYmVlcF9mbHVzaCgpOworCSAgICByZXR2YWwgPSBGQUlMOworCSAgICBicmVhazsKKwl9CisKKyNpZmRlZiBGRUFUX0RJRkYKKwlsb2ZmLmZpbGwgPSAwOworI2VuZGlmCisJaWYgKGRpciA9PSBGT1JXQVJEKQorCXsKKwkJCQkJLyogYXQgZW5kIG9mIGZpbGUgKi8KKwkgICAgaWYgKGN1cndpbi0+d19ib3RsaW5lID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKwkJY3Vyd2luLT53X3RvcGxpbmUgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJY3Vyd2luLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisJCWN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dST1d8VkFMSURfQ1JPVyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIEZvciB0aGUgb3ZlcmxhcCwgc3RhcnQgd2l0aCB0aGUgbGluZSBqdXN0IGJlbG93IHRoZSB3aW5kb3cKKwkJICogYW5kIGdvIHVwd2FyZHMuICovCisJCWxvZmYubG51bSA9IGN1cndpbi0+d19ib3RsaW5lOworI2lmZGVmIEZFQVRfRElGRgorCQlsb2ZmLmZpbGwgPSBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBsb2ZmLmxudW0pCisJCQkJCQkgICAgICAtIGN1cndpbi0+d19maWxsZXJfcm93czsKKyNlbmRpZgorCQlnZXRfc2Nyb2xsX292ZXJsYXAoJmxvZmYsIC0xKTsKKwkJY3Vyd2luLT53X3RvcGxpbmUgPSBsb2ZmLmxudW07CisjaWZkZWYgRkVBVF9ESUZGCisJCWN1cndpbi0+d190b3BmaWxsID0gbG9mZi5maWxsOworCQljaGVja190b3BmaWxsKGN1cndpbiwgRkFMU0UpOworI2VuZGlmCisJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cndpbi0+d190b3BsaW5lOworCQljdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XQ09MfFZBTElEX0NIRUlHSFR8VkFMSURfV1JPV3wKKwkJCQkgICBWQUxJRF9DUk9XfFZBTElEX0JPVExJTkV8VkFMSURfQk9UTElORV9BUCk7CisJICAgIH0KKwl9CisJZWxzZQkvKiBkaXIgPT0gQkFDS1dBUkRTICovCisJeworI2lmZGVmIEZFQVRfRElGRgorCSAgICBpZiAoY3Vyd2luLT53X3RvcGxpbmUgPT0gMSkKKwkgICAgeworCQkvKiBJbmNsdWRlIG1heCBudW1iZXIgb2YgZmlsbGVyIGxpbmVzICovCisJCW1heF90b3BmaWxsKCk7CisJCWNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgICAgLyogRmluZCB0aGUgbGluZSBhdCB0aGUgdG9wIG9mIHRoZSB3aW5kb3cgdGhhdCBpcyBnb2luZyB0byBiZSB0aGUKKwkgICAgICogbGluZSBhdCB0aGUgYm90dG9tIG9mIHRoZSB3aW5kb3cuICBNYWtlIHN1cmUgdGhpcyByZXN1bHRzIGluCisJICAgICAqIHRoZSBzYW1lIGxpbmUgYXMgYmVmb3JlIGRvaW5nIENUUkwtRi4gKi8KKwkgICAgbG9mZi5sbnVtID0gY3Vyd2luLT53X3RvcGxpbmUgLSAxOworI2lmZGVmIEZFQVRfRElGRgorCSAgICBsb2ZmLmZpbGwgPSBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBsb2ZmLmxudW0gKyAxKQorCQkJCQkJCSAgLSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbmRpZgorCSAgICBnZXRfc2Nyb2xsX292ZXJsYXAoJmxvZmYsIDEpOworCisJICAgIGlmIChsb2ZmLmxudW0gPj0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKwkJbG9mZi5sbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisjaWZkZWYgRkVBVF9ESUZGCisJCWxvZmYuZmlsbCA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWJvdGxpbmVfdG9wbGluZSgmbG9mZik7CisjZW5kaWYKKwkgICAgfQorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsb2ZmLmxudW07CisKKwkgICAgLyogRmluZCB0aGUgbGluZSBqdXN0IGFib3ZlIHRoZSBuZXcgdG9wbGluZSB0byBnZXQgdGhlIHJpZ2h0IGxpbmUKKwkgICAgICogYXQgdGhlIGJvdHRvbSBvZiB0aGUgd2luZG93LiAqLworCSAgICBuID0gMDsKKwkgICAgd2hpbGUgKG4gPD0gY3Vyd2luLT53X2hlaWdodCAmJiBsb2ZmLmxudW0gPj0gMSkKKwkgICAgeworCQl0b3BsaW5lX2JhY2soJmxvZmYpOworCQluICs9IGxvZmYuaGVpZ2h0OworCSAgICB9CisJICAgIGlmIChuIDw9IGN1cndpbi0+d19oZWlnaHQpCQkgICAgLyogYXQgYmVnaW4gb2YgZmlsZSAqLworCSAgICB7CisJCWN1cndpbi0+d190b3BsaW5lID0gMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJbWF4X3RvcGZpbGwoKTsKKyNlbmRpZgorCQljdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIEdvIHR3byBsaW5lcyBmb3J3YXJkIGFnYWluLiAqLworI2lmZGVmIEZFQVRfRElGRgorCQl0b3BsaW5lX2JvdGxpbmUoJmxvZmYpOworI2VuZGlmCisJCWJvdGxpbmVfZm9ydygmbG9mZik7CisJCWJvdGxpbmVfZm9ydygmbG9mZik7CisjaWZkZWYgRkVBVF9ESUZGCisJCWJvdGxpbmVfdG9wbGluZSgmbG9mZik7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJLyogV2UncmUgYXQgdGhlIHdyb25nIGVuZCBvZiBhIGZvbGQgbm93LiAqLworCQkodm9pZCloYXNGb2xkaW5nKGxvZmYubG51bSwgJmxvZmYubG51bSwgTlVMTCk7CisjZW5kaWYKKworCQkvKiBBbHdheXMgc2Nyb2xsIGF0IGxlYXN0IG9uZSBsaW5lLiAgQXZvaWQgZ2V0dGluZyBzdHVjayBvbgorCQkgKiB2ZXJ5IGxvbmcgbGluZXMuICovCisJCWlmIChsb2ZmLmxudW0gPj0gY3Vyd2luLT53X3RvcGxpbmUKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCSYmIChsb2ZmLmxudW0gPiBjdXJ3aW4tPndfdG9wbGluZQorCQkJICAgIHx8IGxvZmYuZmlsbCA+PSBjdXJ3aW4tPndfdG9wZmlsbCkKKyNlbmRpZgorCQkJKQorCQl7CisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICAvKiBGaXJzdCB0cnkgdXNpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGxlciBsaW5lcy4gIElmCisJCSAgICAgKiB0aGF0J3Mgbm90IGVub3VnaCwgYmFja3VwIG9uZSBsaW5lLiAqLworCQkgICAgbG9mZi5maWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CisJCSAgICBpZiAoY3Vyd2luLT53X3RvcGZpbGwgPCBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLAorCQkJCQkJCSAgIGN1cndpbi0+d190b3BsaW5lKSkKKwkJCW1heF90b3BmaWxsKCk7CisJCSAgICBpZiAoY3Vyd2luLT53X3RvcGZpbGwgPT0gbG9mZi5maWxsKQorI2VuZGlmCisJCSAgICB7CisJCQktLWN1cndpbi0+d190b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorCQkJY3Vyd2luLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisJCSAgICB9CisJCSAgICBjb21wX2JvdGxpbmUoY3Vyd2luKTsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cndpbi0+d19ib3RsaW5lIC0gMTsKKwkJICAgIGN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dDT0x8VkFMSURfQ0hFSUdIVHwKKwkJCSAgICBWQUxJRF9XUk9XfFZBTElEX0NST1cpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgY3Vyd2luLT53X3RvcGxpbmUgPSBsb2ZmLmxudW07CisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICBjdXJ3aW4tPndfdG9wZmlsbCA9IGxvZmYuZmlsbDsKKwkJICAgIGNoZWNrX3RvcGZpbGwoY3Vyd2luLCBGQUxTRSk7CisjZW5kaWYKKwkJICAgIGN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dST1d8VkFMSURfQ1JPV3xWQUxJRF9CT1RMSU5FKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBmb2xkQWRqdXN0Q3Vyc29yKCk7CisjZW5kaWYKKyAgICBjdXJzb3JfY29ycmVjdCgpOworICAgIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworICAgIGN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1dDT0x8VkFMSURfV1JPV3xWQUxJRF9WSVJUQ09MKTsKKworICAgIC8qCisgICAgICogQXZvaWQgdGhlIHNjcmVlbiBqdW1waW5nIHVwIGFuZCBkb3duIHdoZW4gJ3Njcm9sbG9mZicgaXMgbm9uLXplcm8uCisgICAgICogQnV0IG1ha2Ugc3VyZSB3ZSBzY3JvbGwgYXQgbGVhc3Qgb25lIGxpbmUgKGhhcHBlbnMgd2l0aCBtaXggb2YgbG9uZworICAgICAqIHdyYXBwaW5nIGxpbmVzIGFuZCBub24td3JhcHBpbmcgbGluZSkuCisgICAgICovCisgICAgaWYgKHJldHZhbCA9PSBPSyAmJiBkaXIgPT0gRk9SV0FSRCAmJiBjaGVja190b3Bfb2Zmc2V0KCkpCisgICAgeworCXNjcm9sbF9jdXJzb3JfdG9wKDEsIEZBTFNFKTsKKwlpZiAoY3Vyd2luLT53X3RvcGxpbmUgPD0gb2xkX3RvcGxpbmUKKwkJCQkgICYmIG9sZF90b3BsaW5lIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBjdXJ3aW4tPndfdG9wbGluZSA9IG9sZF90b3BsaW5lICsgMTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfdG9wbGluZSwgJmN1cndpbi0+d190b3BsaW5lLCBOVUxMKTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBEZWNpZGUgaG93IG11Y2ggb3ZlcmxhcCB0byB1c2UgZm9yIHBhZ2UtdXAgb3IgcGFnZS1kb3duIHNjcm9sbGluZy4KKyAqIFRoaXMgaXMgc3ltbWV0cmljLCBzbyB0aGF0IGRvaW5nIGJvdGgga2VlcHMgdGhlIHNhbWUgbGluZXMgZGlzcGxheWVkLgorICogVGhyZWUgbGluZXMgYXJlIGV4YW1pbmVkOgorICoKKyAqICBiZWZvcmUgQ1RSTC1GCSAgICBhZnRlciBDVFJMLUYgLyBiZWZvcmUgQ1RSTC1CCisgKiAgICAgZXRjLgkJCWwxCisgKiAgbDEgbGFzdCBidXQgb25lIGxpbmUJLS0tLS0tLS0tLS0tCisgKiAgbDIgbGFzdCB0ZXh0IGxpbmUJCWwyIHRvcCB0ZXh0IGxpbmUKKyAqICAtLS0tLS0tLS0tLS0tCQlsMyBzZWNvbmQgdGV4dCBsaW5lCisgKiAgbDMJCQkJICAgZXRjLgorICovCisgICAgc3RhdGljIHZvaWQKK2dldF9zY3JvbGxfb3ZlcmxhcChscCwgZGlyKQorICAgIGxpbmVvZmZfVAkqbHA7CisgICAgaW50CQlkaXI7Cit7CisgICAgaW50CQloMSwgaDIsIGgzLCBoNDsKKyAgICBpbnQJCW1pbl9oZWlnaHQgPSBjdXJ3aW4tPndfaGVpZ2h0IC0gMjsKKyAgICBsaW5lb2ZmX1QJbG9mZjAsIGxvZmYxLCBsb2ZmMjsKKworI2lmZGVmIEZFQVRfRElGRgorICAgIGlmIChscC0+ZmlsbCA+IDApCisJbHAtPmhlaWdodCA9IDE7CisgICAgZWxzZQorCWxwLT5oZWlnaHQgPSBwbGluZXNfbm9maWxsKGxwLT5sbnVtKTsKKyNlbHNlCisgICAgbHAtPmhlaWdodCA9IHBsaW5lcyhscC0+bG51bSk7CisjZW5kaWYKKyAgICBoMSA9IGxwLT5oZWlnaHQ7CisgICAgaWYgKGgxID4gbWluX2hlaWdodCkKKwlyZXR1cm47CQkvKiBubyBvdmVybGFwICovCisKKyAgICBsb2ZmMCA9ICpscDsKKyAgICBpZiAoZGlyID4gMCkKKwlib3RsaW5lX2ZvcncobHApOworICAgIGVsc2UKKwl0b3BsaW5lX2JhY2sobHApOworICAgIGgyID0gbHAtPmhlaWdodDsKKyAgICBpZiAoaDIgKyBoMSA+IG1pbl9oZWlnaHQpCisgICAgeworCSpscCA9IGxvZmYwOwkvKiBubyBvdmVybGFwICovCisJcmV0dXJuOworICAgIH0KKworICAgIGxvZmYxID0gKmxwOworICAgIGlmIChkaXIgPiAwKQorCWJvdGxpbmVfZm9ydyhscCk7CisgICAgZWxzZQorCXRvcGxpbmVfYmFjayhscCk7CisgICAgaDMgPSBscC0+aGVpZ2h0OworICAgIGlmIChoMyArIGgyID4gbWluX2hlaWdodCkKKyAgICB7CisJKmxwID0gbG9mZjA7CS8qIG5vIG92ZXJsYXAgKi8KKwlyZXR1cm47CisgICAgfQorCisgICAgbG9mZjIgPSAqbHA7CisgICAgaWYgKGRpciA+IDApCisJYm90bGluZV9mb3J3KGxwKTsKKyAgICBlbHNlCisJdG9wbGluZV9iYWNrKGxwKTsKKyAgICBoNCA9IGxwLT5oZWlnaHQ7CisgICAgaWYgKGg0ICsgaDMgKyBoMiA+IG1pbl9oZWlnaHQgfHwgaDMgKyBoMiArIGgxID4gbWluX2hlaWdodCkKKwkqbHAgPSBsb2ZmMTsJLyogMSBsaW5lIG92ZXJsYXAgKi8KKyAgICBlbHNlCisJKmxwID0gbG9mZjI7CS8qIDIgbGluZXMgb3ZlcmxhcCAqLworICAgIHJldHVybjsKK30KKworLyogI2RlZmluZSBLRUVQX1NDUkVFTl9MSU5FICovCisvKgorICogU2Nyb2xsICdzY3JvbGwnIGxpbmVzIHVwIG9yIGRvd24uCisgKi8KKyAgICB2b2lkCitoYWxmcGFnZShmbGFnLCBQcmVudW0pCisgICAgaW50CQlmbGFnOworICAgIGxpbmVucl9UCVByZW51bTsKK3sKKyAgICBsb25nCXNjcm9sbGVkID0gMDsKKyAgICBpbnQJCWk7CisgICAgaW50CQluOworICAgIGludAkJcm9vbTsKKworICAgIGlmIChQcmVudW0pCisJY3Vyd2luLT53X3Bfc2NyID0gKFByZW51bSA+IGN1cndpbi0+d19oZWlnaHQpID8KKwkJCQkJCWN1cndpbi0+d19oZWlnaHQgOiBQcmVudW07CisgICAgbiA9IChjdXJ3aW4tPndfcF9zY3IgPD0gY3Vyd2luLT53X2hlaWdodCkgPworCQkJCSAgICBjdXJ3aW4tPndfcF9zY3IgOiBjdXJ3aW4tPndfaGVpZ2h0OworCisgICAgdmFsaWRhdGVfYm90bGluZSgpOworICAgIHJvb20gPSBjdXJ3aW4tPndfZW1wdHlfcm93czsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICByb29tICs9IGN1cndpbi0+d19maWxsZXJfcm93czsKKyNlbmRpZgorICAgIGlmIChmbGFnKQorICAgIHsKKwkvKgorCSAqIHNjcm9sbCB0aGUgdGV4dCB1cAorCSAqLworCXdoaWxlIChuID4gMCAmJiBjdXJ3aW4tPndfYm90bGluZSA8PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisjaWZkZWYgRkVBVF9ESUZGCisJICAgIGlmIChjdXJ3aW4tPndfdG9wZmlsbCA+IDApCisJICAgIHsKKwkJaSA9IDE7CisJCWlmICgtLW4gPCAwICYmIHNjcm9sbGVkID4gMCkKKwkJICAgIGJyZWFrOworCQktLWN1cndpbi0+d190b3BmaWxsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisjaWZkZWYgRkVBVF9ESUZGCisJCWkgPSBwbGluZXNfbm9maWxsKGN1cndpbi0+d190b3BsaW5lKTsKKyNlbHNlCisJCWkgPSBwbGluZXMoY3Vyd2luLT53X3RvcGxpbmUpOworI2VuZGlmCisJCW4gLT0gaTsKKwkJaWYgKG4gPCAwICYmIHNjcm9sbGVkID4gMCkKKwkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfRk9MRElORworCQkodm9pZCloYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lLCBOVUxMLCAmY3Vyd2luLT53X3RvcGxpbmUpOworI2VuZGlmCisJCSsrY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisJCWN1cndpbi0+d190b3BmaWxsID0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpOworI2VuZGlmCisKKyNpZm5kZWYgS0VFUF9TQ1JFRU5fTElORQorCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCXsKKwkJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkgICAgY3Vyd2luLT53X3ZhbGlkICY9CisJCQkJICAgIH4oVkFMSURfVklSVENPTHxWQUxJRF9DSEVJR0hUfFZBTElEX1dDT0wpOworCQl9CisjZW5kaWYKKwkgICAgfQorCSAgICBjdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9DUk9XfFZBTElEX1dST1cpOworCSAgICBzY3JvbGxlZCArPSBpOworCisJICAgIC8qCisJICAgICAqIENvcnJlY3Qgd19ib3RsaW5lIGZvciBjaGFuZ2VkIHdfdG9wbGluZS4KKwkgICAgICogV29uJ3Qgd29yayB3aGVuIHRoZXJlIGFyZSBmaWxsZXIgbGluZXMuCisJICAgICAqLworI2lmZGVmIEZFQVRfRElGRgorCSAgICBpZiAoY3Vyd2luLT53X3BfZGlmZikKKwkJY3Vyd2luLT53X3ZhbGlkICY9IH4oVkFMSURfQk9UTElORXxWQUxJRF9CT1RMSU5FX0FQKTsKKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJcm9vbSArPSBpOworCQlkbworCQl7CisJCSAgICBpID0gcGxpbmVzKGN1cndpbi0+d19ib3RsaW5lKTsKKwkJICAgIGlmIChpID4gcm9vbSkKKwkJCWJyZWFrOworI2lmZGVmIEZFQVRfRk9MRElORworCQkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfYm90bGluZSwgTlVMTCwKKwkJCQkJCQkgICZjdXJ3aW4tPndfYm90bGluZSk7CisjZW5kaWYKKwkJICAgICsrY3Vyd2luLT53X2JvdGxpbmU7CisJCSAgICByb29tIC09IGk7CisJCX0gd2hpbGUgKGN1cndpbi0+d19ib3RsaW5lIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KTsKKwkgICAgfQorCX0KKworI2lmbmRlZiBLRUVQX1NDUkVFTl9MSU5FCisJLyoKKwkgKiBXaGVuIGhpdCBib3R0b20gb2YgdGhlIGZpbGU6IG1vdmUgY3Vyc29yIGRvd24uCisJICovCisJaWYgKG4gPiAwKQorCXsKKyMgaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIGlmIChoYXNBbnlGb2xkaW5nKGN1cndpbikpCisJICAgIHsKKwkJd2hpbGUgKC0tbiA+PSAwCisJCQkmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJeworCQkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsCisJCQkJCQkgICAgICAmY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorIyBlbmRpZgorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gKz0gbjsKKwkgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKwl9CisjZWxzZQorCS8qIHRyeSB0byBwdXQgdGhlIGN1cnNvciBpbiB0aGUgc2FtZSBzY3JlZW4gbGluZSAqLworCXdoaWxlICgoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3Vyd2luLT53X3RvcGxpbmUgfHwgc2Nyb2xsZWQgPiAwKQorCQkJICAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBjdXJ3aW4tPndfYm90bGluZSAtIDEpCisJeworCSAgICBzY3JvbGxlZCAtPSBwbGluZXMoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkgICAgaWYgKHNjcm9sbGVkIDwgMCAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPj0gY3Vyd2luLT53X3RvcGxpbmUpCisJCWJyZWFrOworIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsCisJCQkJCQkgICAgICAmY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKyMgZW5kaWYKKwkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBzY3JvbGwgdGhlIHRleHQgZG93bgorCSAqLworCXdoaWxlIChuID4gMCAmJiBjdXJ3aW4tPndfdG9wbGluZSA+IDEpCisJeworI2lmZGVmIEZFQVRfRElGRgorCSAgICBpZiAoY3Vyd2luLT53X3RvcGZpbGwgPCBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBjdXJ3aW4tPndfdG9wbGluZSkpCisJICAgIHsKKwkJaSA9IDE7CisJCWlmICgtLW4gPCAwICYmIHNjcm9sbGVkID4gMCkKKwkJICAgIGJyZWFrOworCQkrK2N1cndpbi0+d190b3BmaWxsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisjaWZkZWYgRkVBVF9ESUZGCisJCWkgPSBwbGluZXNfbm9maWxsKGN1cndpbi0+d190b3BsaW5lIC0gMSk7CisjZWxzZQorCQlpID0gcGxpbmVzKGN1cndpbi0+d190b3BsaW5lIC0gMSk7CisjZW5kaWYKKwkJbiAtPSBpOworCQlpZiAobiA8IDAgJiYgc2Nyb2xsZWQgPiAwKQorCQkgICAgYnJlYWs7CisJCS0tY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSh2b2lkKWhhc0ZvbGRpbmcoY3Vyd2luLT53X3RvcGxpbmUsICZjdXJ3aW4tPndfdG9wbGluZSwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJRkYKKwkJY3Vyd2luLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisJICAgIH0KKwkgICAgY3Vyd2luLT53X3ZhbGlkICY9IH4oVkFMSURfQ1JPV3xWQUxJRF9XUk9XfAorCQkJCQkgICAgICBWQUxJRF9CT1RMSU5FfFZBTElEX0JPVExJTkVfQVApOworCSAgICBzY3JvbGxlZCArPSBpOworI2lmbmRlZiBLRUVQX1NDUkVFTl9MSU5FCisJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxKQorCSAgICB7CisJCS0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQljdXJ3aW4tPndfdmFsaWQgJj0gfihWQUxJRF9WSVJUQ09MfFZBTElEX0NIRUlHSFR8VkFMSURfV0NPTCk7CisJICAgIH0KKyNlbmRpZgorCX0KKyNpZm5kZWYgS0VFUF9TQ1JFRU5fTElORQorCS8qCisJICogV2hlbiBoaXQgdG9wIG9mIHRoZSBmaWxlOiBtb3ZlIGN1cnNvciB1cC4KKwkgKi8KKwlpZiAobiA+IDApCisJeworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDw9IChsaW5lbnJfVCluKQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAxOworCSAgICBlbHNlCisjIGlmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoaGFzQW55Rm9sZGluZyhjdXJ3aW4pKQorCSAgICB7CisJCXdoaWxlICgtLW4gPj0gMCAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxKQorCQl7CisJCSAgICAtLWN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJICAgICh2b2lkKWhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLAorCQkJCQkJJmN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisjIGVuZGlmCisJCWN1cndpbi0+d19jdXJzb3IubG51bSAtPSBuOworCX0KKyNlbHNlCisJLyogdHJ5IHRvIHB1dCB0aGUgY3Vyc29yIGluIHRoZSBzYW1lIHNjcmVlbiBsaW5lICovCisJc2Nyb2xsZWQgKz0gbjsJICAgIC8qIG1vdmUgY3Vyc29yIHdoZW4gdG9wbGluZSBpcyAxICovCisJd2hpbGUgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IGN1cndpbi0+d190b3BsaW5lCisJICAgICAgJiYgKHNjcm9sbGVkID4gMCB8fCBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPj0gY3Vyd2luLT53X2JvdGxpbmUpKQorCXsKKwkgICAgc2Nyb2xsZWQgLT0gcGxpbmVzKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpOworCSAgICBpZiAoc2Nyb2xsZWQgPCAwICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA8IGN1cndpbi0+d19ib3RsaW5lKQorCQlicmVhazsKKwkgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmxudW07CisjIGlmZGVmIEZFQVRfRk9MRElORworCSAgICBmb2xkQWRqdXN0Q3Vyc29yKCk7CisjIGVuZGlmCisJfQorI2VuZGlmCisgICAgfQorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKiBNb3ZlIGN1cnNvciB0byBmaXJzdCBsaW5lIG9mIGNsb3NlZCBmb2xkLiAqLworICAgIGZvbGRBZGp1c3RDdXJzb3IoKTsKKyMgZW5kaWYKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBjaGVja190b3BmaWxsKGN1cndpbiwgIWZsYWcpOworI2VuZGlmCisgICAgY3Vyc29yX2NvcnJlY3QoKTsKKyAgICBiZWdpbmxpbmUoQkxfU09MIHwgQkxfRklYKTsKKyAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL215c2lnbiBiL3NyYy9teXNpZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyOGUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9teXNpZ24KQEAgLTAsMCArMSBAQAorPWF1dG8vY29uZmlndXJlGy1sYXN0dXBkYXRlPTEwODQ3ODk4NzUuMjUbPWNvbmZpZ3VyZS5pbkBtZDU9OGYyY2Y5MTM1ZTI5NzA5NGM1MzA4MGM1M2U1NDFhMGYbLUBidWlsZGNoZWNrPTJjOTJhOWU0Njc2YjIzMDRmYWI5YWYxNmYxNjY0MTk0GwpkaWZmIC0tZ2l0IGEvc3JjL25iZGVidWcuYyBiL3NyYy9uYmRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmODdhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9uYmRlYnVnLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz04IHN3PTg6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJVmlzdWFsIFdvcmtzaG9wIGludGVncmF0aW9uIGJ5IEdvcmRvbiBQcmlldXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIE5ldEJlYW5zIERlYnVnZ2luZyBUb29scy4gV2hhdCBhcmUgdGhlc2UgdG9vbHMgYW5kIHdoeSBhcmUgdGhleSBpbXBvcnRhbnQ/CisgKiBUaGVyZSBhcmUgdHdvIG1haW4gdG9vbHMgaGVyZS4gVGhlIGZpcnN0IHRvb2wgaXMgYSB0b29sIGZvciBkZWxheWluZyBvcgorICogc3RvcHBpbmcgZ3ZpbSBkdXJpbmcgc3RhcnR1cC4gIFRoZSBzZWNvbmQgdG9vbCBpcyBhIHByb3RvY29sIGxvZyB0b29sLgorICoKKyAqIFRoZSBzdGFydHVwIGRlbGF5IHRvb2wgaXMgY2FsbGVkIG5iZGVidWdfd2FpdCgpLiBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IGZvcgorICogZGVidWdnaW5nIHN0YXJ0dXAgcHJvYmxlbXMgYmVjYXVzZSBndmltIHdpbGwgYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGZyb20KKyAqIG5ldGJlYW5zIGFuZCBjYW5ub3QgYmUgcnVuIGRpcmVjdGx5IGZyb20gYSBkZWJ1Z2dlci4gVGhlIG9ubHkgd2F5IHRvIGRlYnVnCisgKiBhIGd2aW0gc3RhcnRlZCBieSBuZXRiZWFucyBpcyBieSBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byBpdC4gV2l0aG91dCB0aGlzCisgKiB0b29sIGFsbCBzdGFydXAgY29kZSB3aWxsIGhhdmUgY29tcGxldGVkIGJlZm9yZSB5b3UgY2FuIGdldCB0aGUgcGlkIGFuZAorICogYXR0YWNoLgorICoKKyAqIFRoZSBzZWNvbmQgdG9vbCBpcyBhIGxvZyB0b29sLgorICoKKyAqIFRoaXMgY29kZSBtdXN0IGhhdmUgTkJERUJVRyBkZWZpbmVkIGZvciBpdCB0byBiZSBjb21waWxlZCBpbnRvIHZpbS9ndmltLgorICovCisKKyNpZmRlZiBOQkRFQlVHCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInZpbS5oIgorCitGSUxFCQkqbmJfZGVidWcgPSBOVUxMOwordV9pbnQJCSBuYl9kbGV2ZWwgPSAwOwkJLyogbmJfZGVidWcgdmVyYm9zaXR5IGxldmVsICovCisKK3ZvaWQJCSBuYmRiKGNoYXIgKiwgLi4uKTsKK3ZvaWQJCSBuYnRyYWNlKGNoYXIgKiwgLi4uKTsKKworc3RhdGljIGludAkgbG9va3VwKGNoYXIgKik7CisjaWZuZGVmIEZFQVRfR1VJX1czMgorc3RhdGljIGludAkgZXJyb3JIYW5kbGVyKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKik7CisjZW5kaWYKKworLyoKKyAqIG5iZGVidWdfd2FpdAktICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWxheSBvciBzdG9wIGV4ZWN1dGlvbiBvZiB2aW0uCisgKgkJICAgIEl0cyBub3JtYWxseSB1c2VkIHRvIGRlbGF5IHN0YXJ0dXAgd2hpbGUgYXR0YWNoaW5nIGEKKyAqCQkgICAgZGVidWdnZXIgdG8gYSBydW5uaW5nIHByb2Nlc3MuIFNpbmNlIHdvcmtzaG9wIHN0YXJ0cyBndmltCisgKgkJICAgIGZyb20gYSBiYWNrZ3JvdW5kIHByb2Nlc3MgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZGVidWcKKyAqCQkgICAgc3RhcnR1cCBwcm9ibGVtcy4KKyAqLworCit2b2lkIG5iZGVidWdfd2FpdCgKKwl1X2ludAkJIHdhaXRfZmxhZ3MsCS8qIHRlbGxzIHdoYXQgdG8gZG8gKi8KKwljaGFyCQkqd2FpdF92YXIsCS8qIHdhaXQgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwl1X2ludAkJIHdhaXRfc2VjcykJLyogaG93IG1hbnkgc2Vjb25kcyB0byB3YWl0ICovCit7CisKKwlpbml0X2hvbWVkaXIoKTsJCQkvKiBub3QgaW5pdGVkIHlldCAqLworI2lmZGVmIFVTRV9XRERVTVAKKwlXRER1bXAoMCwgMCwgMCk7CisjZW5kaWYKKworCS8qIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLworCWlmICh3YWl0X2ZsYWdzICYgV1RfRU5WICYmIHdhaXRfdmFyICYmIGdldGVudih3YWl0X3ZhcikgIT0gTlVMTCkgeworCQlzbGVlcChhdG9pKGdldGVudih3YWl0X3ZhcikpKTsKKwl9IGVsc2UgaWYgKHdhaXRfZmxhZ3MgJiBXVF9XQUlUICYmIGxvb2t1cCgifi8uZ3ZpbXdhaXQiKSkgeworCQlzbGVlcCh3YWl0X3NlY3MgPiAwICYmIHdhaXRfc2VjcyA8IDEyMCA/IHdhaXRfc2VjcyA6IDIwKTsKKwl9IGVsc2UgaWYgKHdhaXRfZmxhZ3MgJiBXVF9TVE9QICYmIGxvb2t1cCgifi8uZ3ZpbXN0b3AiKSkgeworCQlpbnQgdyA9IDE7CisJCXdoaWxlICh3KSB7CisJCQk7CisJCX0KKwl9Cit9ICAgIC8qIGVuZCBuYmRlYnVnX3dhaXQgKi8KKworCit2b2lkCituYmRlYnVnX2xvZ19pbml0KAorCWNoYXIJCSpsb2dfdmFyLAkvKiBlbnYgdmFyIHdpdGggbG9nIGZpbGUgKi8KKwljaGFyCQkqbGV2ZWxfdmFyKQkvKiBlbnYgdmFyIHdpdGggbmJfZGVidWcgbGV2ZWwgKi8KK3sKKwljaGFyCQkqZmlsZTsJCS8qIHBvc3NpYmxlIG5iX2RlYnVnIG91dHB1dCBmaWxlICovCisJY2hhcgkJKmNwOwkJLyogbmJfZGxldmVsIHBvaW50ZXIgKi8KKworCWlmIChsb2dfdmFyICYmIChmaWxlID0gZ2V0ZW52KGxvZ192YXIpKSAhPSBOVUxMKSB7CisJCXRpbWVfdCBub3c7CisKKwkJbmJfZGVidWcgPSBmb3BlbihmaWxlLCAiYSIpOworCQl0aW1lKCZub3cpOworCQlmcHJpbnRmKG5iX2RlYnVnLCAiJXMiLCBhc2N0aW1lKGxvY2FsdGltZSgmbm93KSkpOworCQlpZiAobGV2ZWxfdmFyICYmIChjcCA9IGdldGVudihsZXZlbF92YXIpKSAhPSBOVUxMKSB7CisJCQluYl9kbGV2ZWwgPSBzdHJ0b3VsKGNwLCBOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCW5iX2RsZXZlbCA9IE5CX1RSQUNFOwkvKiBkZWZhdWx0IGxldmVsICovCisJCX0KKwkJLyogWFNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOyAqLworCX0KKworfSAgICAvKiBlbmQgbmJkZWJ1Z19sb2dfaW5pdCAqLworCisKKworCit2b2lkCituYnRyYWNlKAorCWNoYXIJCSpmbXQsCisJLi4uKQoreworCXZhX2xpc3QJCSBhcDsKKworCWlmIChuYl9kZWJ1ZyE9IE5VTEwgJiYgKG5iX2RsZXZlbCAmIChOQl9UUkFDRSB8IE5CX1RSQUNFX1ZFUkJPU0UpKSkgeworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJdmZwcmludGYobmJfZGVidWcsIGZtdCwgYXApOworCQl2YV9lbmQoYXApOworCQlmZmx1c2gobmJfZGVidWcpOworCX0KKworfSAgICAvKiBlbmQgbmJ0cmFjZSAqLworCisKK3ZvaWQKK25iZGJnKAorCWNoYXIJCSpmbXQsCisJLi4uKQoreworCXZhX2xpc3QJCSBhcDsKKworCWlmIChuYl9kZWJ1ZyAhPSBOVUxMKSB7CisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQl2ZnByaW50ZihuYl9kZWJ1ZywgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWZmbHVzaChuYl9kZWJ1Zyk7CisJfQorCit9ICAgIC8qIGVuZCBuYmRiZyAqLworCisKK3N0YXRpYyBpbnQKK2xvb2t1cCgKKwljaGFyCQkqZmlsZSkKK3sKKwljaGFyCQkgYnVmW0JVRlNJWl07CisKKwlleHBhbmRfZW52KChjaGFyX3UgKikgZmlsZSwgKGNoYXJfdSAqKSBidWYsIEJVRlNJWik7CisJcmV0dXJuCisjaWZuZGVmIEZFQVRfR1VJX1czMgorCQkoYWNjZXNzKGJ1ZiwgRl9PSykgPT0gMCk7CisjZWxzZQorCQkoYWNjZXNzKGJ1ZiwgMCkgPT0gMCk7CisjZW5kaWYKKworfSAgICAvKiBlbmQgbG9va3VwICovCisKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCitzdGF0aWMgaW50CitlcnJvckhhbmRsZXIoCisJRGlzcGxheQkJKmRweSwKKwlYRXJyb3JFdmVudAkqZXJyKQoreworCWNoYXIJCSBtc2dbMjU2XTsKKwljaGFyCQkgYnVmWzI1Nl07CisKKwlYR2V0RXJyb3JUZXh0KGRweSwgZXJyLT5lcnJvcl9jb2RlLCBtc2csIHNpemVvZihtc2cpKTsKKwluYmRiZygiXG5cbk5CREVCVUcgVmltOiBYIEVycm9yIG9mIGZhaWxlZCByZXF1ZXN0OiAlc1xuIiwgbXNnKTsKKworCXNwcmludGYoYnVmLCAiJWQiLCBlcnItPnJlcXVlc3RfY29kZSk7CisJWEdldEVycm9yRGF0YWJhc2VUZXh0KGRweSwKKwkgICAgIlhSZXF1ZXN0IiwgYnVmLCAiVW5rbm93biIsIG1zZywgc2l6ZW9mKG1zZykpOworCW5iZGJnKCJcdE1ham9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogJWQgKCVzKVxuIiwKKwkgICAgZXJyLT5yZXF1ZXN0X2NvZGUsIG1zZyk7CisJaWYgKGVyci0+cmVxdWVzdF9jb2RlID4gMTI4KSB7CisJCW5iZGJnKCJcdE1pbm9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogJWRcbiIsCisJCSAgICBlcnItPm1pbm9yX2NvZGUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIE5CREVCVUcgKi8KZGlmZiAtLWdpdCBhL3NyYy9uYmRlYnVnLmggYi9zcmMvbmJkZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjJjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmJkZWJ1Zy5oCkBAIC0wLDAgKzEsODEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz04IHN3PTg6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJVmlzdWFsIFdvcmtzaG9wIGludGVncmF0aW9uIGJ5IEdvcmRvbiBQcmlldXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKworI2lmbmRlZiBOQkRFQlVHX0gKKyNkZWZpbmUgTkJERUJVR19ICisKKyNpZmRlZiBOQkRFQlVHCisKKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVChjKSBcCisgICAgaWYgKCEoYykpIHsgXAorCWZwcmludGYoc3RkZXJyLCAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCwgZmlsZSAlc1xuIiwgXAorCQlfX0xJTkVfXywgX19GSUxFX18pOyBcCisJZmZsdXNoKHN0ZGVycik7IFwKKwlhYm9ydCgpOyBcCisgICAgfQorI2VuZGlmCisKKyNkZWZpbmUgbmJkZWJ1ZyhhKSBuYmRiZyMjYQorCisjZGVmaW5lIE5CX1RSQUNFCQkweDAwMDAwMDAxCisjZGVmaW5lIE5CX1RSQUNFX1ZFUkJPU0UJMHgwMDAwMDAwMgorI2RlZmluZSBOQl9UUkFDRV9DT0xPTkNNRAkweDAwMDAwMDA0CisjZGVmaW5lIE5CX0RFQlVHX0FMTAkJMHhmZmZmZmZmZgorCisjZGVmaW5lIE5CRExFVkVMKGZsYWdzKQkJKG5iX2RlYnVnICE9IE5VTEwgJiYgKG5iX2RsZXZlbCAmIChmbGFncykpKQorCisjZGVmaW5lIE5CREVCVUdfVFJBQ0UJMQorLy8jZGVmaW5lIE5CREVCVUdfU0VOU0UJMgorCit0eXBlZGVmIGVudW0geworCQlXVF9FTlYgPSAxLAkJLyogbG9vayBmb3IgZW52IHZhciBpZiBzZXQgKi8KKwkJV1RfV0FJVCwJCS8qIGxvb2sgZm9yIH4vLmd2aW13YWl0IGlmIHNldCAqLworCQlXVF9TVE9QCQkJLyogbG9vayBmb3Igfi8uZ3ZpbXN0b3AgaWYgc2V0ICovCit9IFd0V2FpdDsKKworCit2b2lkCQkgbmJkYmcoY2hhciAqLCAuLi4pOwordm9pZAkJIG5idHJhY2UoY2hhciAqLCAuLi4pOworCit2b2lkIG5iZGVidWdfd2FpdCBfX0FSR1MoKHVfaW50IHdhaXRfZmxhZ3MsIGNoYXIgKndhaXRfdmFyLCB1X2ludCB3YWl0X3NlY3MpKTsKK3ZvaWQgbmJkZWJ1Z19sb2dfaW5pdCBfX0FSR1MoKGNoYXIgKmxvZ192YXIsIGNoYXIgKmxldmVsX3ZhcikpOworCitleHRlcm4gRklMRQkqbmJfZGVidWc7CitleHRlcm4gdV9pbnQJIG5iX2RsZXZlbDsJCS8qIG5iX2RlYnVnIHZlcmJvc2l0eSBsZXZlbCAqLworCisjIGVsc2UJCS8qIG5vdCBOQkRFQlVHICovCisKKyNpZm5kZWYgQVNTRVJUCisjIGRlZmluZSBBU1NFUlQoYykKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyAyIHN0dWJzIGFyZSBuZWVkZWQgYmVjYXVzZSBhIG1hY3JvIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2Ugb2YKKyAqIHRoZSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCisKK3ZvaWQKK25iZGJnKAorCWNoYXIJCSpmbXQsCisJLi4uKQoreworfQorCisKK3ZvaWQKK25idHJhY2UoCisJY2hhcgkJKmZtdCwKKwkuLi4pCit7Cit9CisKKyNlbmRpZiAvKiBOQkRFQlVHICovCisjZW5kaWYgLyogTkJERUJVR19IICovCmRpZmYgLS1naXQgYS9zcmMvbmV0YmVhbnMuYyBiL3NyYy9uZXRiZWFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2YzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmV0YmVhbnMuYwpAQCAtMCwwICsxLDMxODUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJTmV0YmVhbnMgaW50ZWdyYXRpb24gYnkgRGF2aWQgV2VhdGhlcmZvcmQKKyAqCQkJQWRvcHRlZCBmb3IgV2luMzIgYnkgU2VyZ2V5IEtob3JldgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIEltcGxlbWVudHMgY2xpZW50IHNpZGUgb2Ygb3JnLm5ldGJlYW5zLm1vZHVsZXMuZW1hY3MgZWRpdG9yCisgKiBpbnRlZ3JhdGlvbiBwcm90b2NvbC4gIEJlIGNhcmVmdWwhICBUaGUgcHJvdG9jb2wgdXNlcyBvZmZzZXRzCisgKiB3aGljaCBhcmUgKmJldHdlZW4qIGNoYXJhY3RlcnMsIHdoZXJlYXMgdmltIHVzZXMgbGluZSBudW1iZXIKKyAqIGFuZCBjb2x1bW4gbnVtYmVyIHdoaWNoIGFyZSAqb24qIGNoYXJhY3RlcnMuCisgKiBTZWUgIjpoZWxwIG5ldGJlYW5zLXByb3RvY29sIiBmb3IgZXhwbGFuYXRpb24uCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qIE5vdGU6IHdoZW4gbWFraW5nIGNoYW5nZXMgaGVyZSBhbHNvIGFkanVzdCBjb25maWd1cmUuaW4uICovCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorIyBpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIFdJTjMyCisjIGlmZGVmIERFQlVHCisjICBpbmNsdWRlIDx0Y2hhci5oPgkvKiBmb3IgX1QgZGVmaW5pdGlvbiBmb3IgVFJBQ0VuIG1hY3JvcyAqLworIyBlbmRpZgorIyBpbmNsdWRlIDxpby5oPgorLyogV2luU29jayBBUEkgaXMgc2VwYXJhdGVkIGZyb20gQyBBUEksIHRodXMgd2UgY2FuJ3QgdXNlIHJlYWQoKSwgd3JpdGUoKSwKKyAqIGVycm5vLi4uICovCisjIGRlZmluZSBzb2NrX2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjIGRlZmluZSBFQ09OTlJFRlVTRUQgV1NBRUNPTk5SRUZVU0VECisjIGlmZGVmIEVJTlRSCisjICB1bmRlZiBFSU5UUgorIyBlbmRpZgorIyBkZWZpbmUgRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIHNvY2tfd3JpdGUoc2QsIGJ1ZiwgbGVuKSBzZW5kKHNkLCBidWYsIGxlbiwgMCkKKyMgZGVmaW5lIHNvY2tfcmVhZChzZCwgYnVmLCBsZW4pIHJlY3Yoc2QsIGJ1ZiwgbGVuLCAwKQorIyBkZWZpbmUgc29ja19jbG9zZShzZCkgY2xvc2Vzb2NrZXQoc2QpCisjIGRlZmluZSBzbGVlcCh0KSBTbGVlcCh0KjEwMDApIC8qIFdpbkFQSSBTbGVlcCgpIGFjY2VwdHMgbWlsbGlzZWNvbmRzICovCisjZWxzZQorIyBpbmNsdWRlIDxuZXRkYi5oPgorIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgaWZkZWYgSEFWRV9MSUJHRU5fSAorIyAgaW5jbHVkZSA8bGliZ2VuLmg+CisjIGVuZGlmCisjIGRlZmluZSBzb2NrX2Vycm5vIGVycm5vCisjIGRlZmluZSBzb2NrX3dyaXRlKHNkLCBidWYsIGxlbikgd3JpdGUoc2QsIGJ1ZiwgbGVuKQorIyBkZWZpbmUgc29ja19yZWFkKHNkLCBidWYsIGxlbikgcmVhZChzZCwgYnVmLCBsZW4pCisjIGRlZmluZSBzb2NrX2Nsb3NlKHNkKSBjbG9zZShzZCkKKyNlbmRpZgorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lIElORVRfU09DS0VUUworCisjZGVmaW5lIEdVQVJERUQJCTEwMDAwIC8qIHR5cGVuciBmb3IgImd1YXJkZWQiIGFubm90YXRpb24gKi8KKyNkZWZpbmUgR1VBUkRFRE9GRlNFVCAxMDAwMDAwIC8qIGJhc2UgZm9yICJndWFyZGVkIiBzaWduIGlkJ3MgKi8KKworLyogVGhlIGZpcnN0IGltcGxlbWVudGF0aW9uICh3b3JraW5nIG9ubHkgd2l0aCBOZXRiZWFucykgcmV0dXJuZWQgIjEuMSIuICBUaGUKKyAqIHByb3RvY29sIGltcGxlbWVudGVkIGhlcmUgYWxzbyBzdXBwb3J0cyBBLUEtUC4gKi8KK3N0YXRpYyBjaGFyICpFeHRFZFByb3RvY29sVmVyc2lvbiA9ICIyLjIiOworCitzdGF0aWMgbG9uZyBwb3Myb2ZmIF9fQVJHUygoYnVmX1QgKiwgcG9zX1QgKikpOworc3RhdGljIHBvc19UICpvZmYycG9zIF9fQVJHUygoYnVmX1QgKiwgbG9uZykpOworc3RhdGljIHBvc19UICpnZXRfb2ZmX29yX2xudW0gX19BUkdTKChidWZfVCAqYnVmLCBjaGFyX3UgKiphcmdwKSk7CitzdGF0aWMgbG9uZyBnZXRfYnVmX3NpemUgX19BUkdTKChidWZfVCAqKSk7CisKK3N0YXRpYyB2b2lkIG5ldGJlYW5zX2Nvbm5lY3QgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IGdldENvbm5JbmZvIF9fQVJHUygoY2hhciAqZmlsZSwgY2hhciAqKmhvc3QsIGNoYXIgKipwb3J0LCBjaGFyICoqcGFzc3dvcmQpKTsKKworc3RhdGljIHZvaWQgbmJfaW5pdF9ncmFwaGljcyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNvbG9uY21kIF9fQVJHUygoY2hhciAqY21kLCAuLi4pKTsKKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorc3RhdGljIHZvaWQgbWVzc2FnZUZyb21OZXRiZWFucyBfX0FSR1MoKFh0UG9pbnRlciwgaW50ICosIFh0SW5wdXRJZCAqKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9HVEsKK3N0YXRpYyB2b2lkIG1lc3NhZ2VGcm9tTmV0YmVhbnMgX19BUkdTKChncG9pbnRlciwgZ2ludCwgR2RrSW5wdXRDb25kaXRpb24pKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbmJfcGFyc2VfY21kIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBpbnQgIG5iX2RvX2NtZCBfX0FSR1MoKGludCwgY2hhcl91ICosIGludCwgaW50LCBjaGFyX3UgKikpOworc3RhdGljIHZvaWQgbmJfc2VuZCBfX0FSR1MoKGNoYXIgKmJ1ZiwgY2hhciAqZnVuKSk7CisjaWZkZWYgRkVBVF9CRVZBTAorc3RhdGljIHZvaWQgbmV0YmVhbnNfYmV2YWxfY2IgX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwsIGludCBzdGF0ZSkpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc2QgPSAtMTsJCQkvKiBzb2NrZXQgZmQgZm9yIE5ldGJlYW5zIGNvbm5lY3Rpb24gKi8KKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorc3RhdGljIFh0SW5wdXRJZCBpbnB1dEhhbmRsZXI7CQkvKiBDb29raWUgZm9yIGlucHV0ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9HVEsKK3N0YXRpYyBnaW50IGlucHV0SGFuZGxlcjsJCS8qIENvb2tpZSBmb3IgaW5wdXQgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1czMgorc3RhdGljIGludCAgaW5wdXRIYW5kbGVyID0gLTE7CQkvKiBzaW1wbHkgcmV0LnZhbHVlIG9mIFdTQUFzeW5jU2VsZWN0KCkgKi8KK2V4dGVybiBIV05EIHNfaHduZDsJCQkvKiBHdmltJ3MgV2luZG93IGhhbmRsZSAqLworI2VuZGlmCitzdGF0aWMgaW50IGNtZG5vOwkJCS8qIGN1cnJlbnQgY29tbWFuZCBudW1iZXIgZm9yIHJlcGx5ICovCitzdGF0aWMgaW50IGhhdmVDb25uZWN0aW9uID0gRkFMU0U7CS8qIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kCisJCQkJCSAgIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgKi8KK3N0YXRpYyBpbnQgb2xkRmlyZSA9IDE7CitzdGF0aWMgaW50IGV4aXRfZGVsYXkgPSAyOwkJLyogZXhpdCBkZWxheSBpbiBzZWNvbmRzICovCisKKyNpZmRlZiBGRUFUX0JFVkFMCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKQorZXh0ZXJuIFdpZGdldAl0ZXh0QXJlYTsKKyMgZW5kaWYKK0JhbGxvb25FdmFsCSpiYWxsb29uRXZhbCA9IE5VTEw7CisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGUgdGhlIGRlYnVnZ2luZyBjb2RlIGlmIHdhbnRlZC4KKyAqLworI2lmZGVmIE5CREVCVUcKKyMgaW5jbHVkZSAibmJkZWJ1Zy5jIgorI2VuZGlmCisKKy8qIENvbm5lY3QgYmFjayB0byBOZXRiZWFucyBwcm9jZXNzICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCituZXRiZWFuc19YdF9jb25uZWN0KHZvaWQgKmNvbnRleHQpCit7CisgICAgbmV0YmVhbnNfY29ubmVjdCgpOworICAgIGlmIChzZCA+IDApCisgICAgeworCS8qIHRlbGwgbm90aWZpZXIgd2UgYXJlIGludGVyZXN0ZWQgaW4gYmVpbmcgY2FsbGVkCisJICogd2hlbiB0aGVyZSBpcyBpbnB1dCBvbiB0aGUgZWRpdG9yIGNvbm5lY3Rpb24gc29ja2V0CisJICovCisJaW5wdXRIYW5kbGVyID0gWHRBcHBBZGRJbnB1dCgoWHRBcHBDb250ZXh0KWNvbnRleHQsIHNkLAorCQkJICAgICAoWHRQb2ludGVyKShYdElucHV0UmVhZE1hc2sgKyBYdElucHV0RXhjZXB0TWFzayksCisJCQkJCQkgICBtZXNzYWdlRnJvbU5ldGJlYW5zLCBOVUxMKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbmV0YmVhbnNfZGlzY29ubmVjdCh2b2lkKQoreworICAgIGlmIChpbnB1dEhhbmRsZXIgIT0gKFh0SW5wdXRJZClOVUxMKQorICAgIHsKKwlYdFJlbW92ZUlucHV0KGlucHV0SGFuZGxlcik7CisJaW5wdXRIYW5kbGVyID0gKFh0SW5wdXRJZClOVUxMOworICAgIH0KKyAgICBzZCA9IC0xOworICAgIGhhdmVDb25uZWN0aW9uID0gRkFMU0U7Cit9CisjZW5kaWYgLyogRkVBVF9NT1RJRl9HVUkgKi8KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK25ldGJlYW5zX2d0a19jb25uZWN0KHZvaWQpCit7CisjIGlmZGVmIEZFQVRfQkVWQUwKKyAgICAvKgorICAgICAqIFNldCB1cCB0aGUgQmFsbG9vbiBFeHByZXNzaW9uIEV2YWx1YXRpb24gYXJlYS4KKyAgICAgKiBBbHdheXMgY3JlYXRlIGl0IGJ1dCBkaXNhYmxlIGl0IHdoZW4gJ2JhbGxvb25ldmFsJyBpc24ndCBzZXQuCisgICAgICovCisgICAgYmFsbG9vbkV2YWwgPSBndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKGd1aS5kcmF3YXJlYSwgTlVMTCwKKwkJCQkJICAgICZuZXRiZWFuc19iZXZhbF9jYiwgTlVMTCk7CisgICAgaWYgKCFwX2JldmFsKQorCWd1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhKGJhbGxvb25FdmFsKTsKKyMgZW5kaWYKKworICAgIG5ldGJlYW5zX2Nvbm5lY3QoKTsKKyAgICBpZiAoc2QgPiAwKQorICAgIHsKKwkvKgorCSAqIFRlbGwgZ2RrIHdlIGFyZSBpbnRlcmVzdGVkIGluIGJlaW5nIGNhbGxlZCB3aGVuIHRoZXJlCisJICogaXMgaW5wdXQgb24gdGhlIGVkaXRvciBjb25uZWN0aW9uIHNvY2tldAorCSAqLworCWlucHV0SGFuZGxlciA9IGdka19pbnB1dF9hZGQoc2QsIChHZGtJbnB1dENvbmRpdGlvbikKKwkJKChpbnQpR0RLX0lOUFVUX1JFQUQgKyAoaW50KUdES19JTlBVVF9FWENFUFRJT04pLAorCQkJCQkJICAgbWVzc2FnZUZyb21OZXRiZWFucywgTlVMTCk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK25ldGJlYW5zX2Rpc2Nvbm5lY3Qodm9pZCkKK3sKKyAgICBpZiAoaW5wdXRIYW5kbGVyICE9IDApCisgICAgeworCWdka19pbnB1dF9yZW1vdmUoaW5wdXRIYW5kbGVyKTsKKwlpbnB1dEhhbmRsZXIgPSAwOworICAgIH0KKyAgICBzZCA9IC0xOworICAgIGhhdmVDb25uZWN0aW9uID0gRkFMU0U7Cit9CisjZW5kaWYgLyogRkVBVF9HVUlfR1RLICovCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCituZXRiZWFuc193MzJfY29ubmVjdCh2b2lkKQoreworICAgIG5ldGJlYW5zX2Nvbm5lY3QoKTsKKyAgICBpZiAoc2QgPiAwKQorICAgIHsKKwkvKgorCSAqIFRlbGwgV2luZG93cyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcgbWVzc2FnZSB3aGVuIHRoZXJlCisJICogaXMgaW5wdXQgb24gdGhlIGVkaXRvciBjb25uZWN0aW9uIHNvY2tldAorCSAqLworCWlucHV0SGFuZGxlciA9IFdTQUFzeW5jU2VsZWN0KHNkLCBzX2h3bmQsIFdNX05FVEJFQU5TLCBGRF9SRUFEKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbmV0YmVhbnNfZGlzY29ubmVjdCh2b2lkKQoreworICAgIGlmIChpbnB1dEhhbmRsZXIgPT0gMCkKKyAgICB7CisJV1NBQXN5bmNTZWxlY3Qoc2QsIHNfaHduZCwgMCwgMCk7CisJaW5wdXRIYW5kbGVyID0gLTE7CisgICAgfQorICAgIHNkID0gLTE7CisgICAgaGF2ZUNvbm5lY3Rpb24gPSBGQUxTRTsKKworICAgIC8qIEl0IHNlZW1zIHRoYXQgTW90aWYgYW5kIEdUSyB2ZXJzaW9ucyBhbHNvIG5lZWQgdGhpczogKi8KKyAgICBndWlfbWNoX2Rlc3Ryb3lfYmV2YWxfYXJlYShiYWxsb29uRXZhbCk7CisgICAgYmFsbG9vbkV2YWwgPSBOVUxMOworfQorI2VuZGlmIC8qIEZFQVRfR1VJX1czMiAqLworCisjZGVmaW5lIE5CX0RFRl9IT1NUICJsb2NhbGhvc3QiCisjZGVmaW5lIE5CX0RFRl9BRERSICIzMjE5IgorI2RlZmluZSBOQl9ERUZfUEFTUyAiY2hhbmdlbWUiCisKKyAgICBzdGF0aWMgdm9pZAorbmV0YmVhbnNfY29ubmVjdCh2b2lkKQoreworI2lmZGVmIElORVRfU09DS0VUUworICAgIHN0cnVjdCBzb2NrYWRkcl9pbglzZXJ2ZXI7CisgICAgc3RydWN0IGhvc3RlbnQgKglob3N0OworIyBpZmRlZiBGRUFUX0dVSV9XMzIKKyAgICB1X3Nob3J0CQlwb3J0OworIyBlbHNlCisgICAgaW50CQkJcG9ydDsKKyNlbmRpZgorI2Vsc2UKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4Jc2VydmVyOworI2VuZGlmCisgICAgY2hhcglidWZbMzJdOworICAgIGNoYXIJKmhvc3RuYW1lID0gTlVMTDsKKyAgICBjaGFyCSphZGRyZXNzID0gTlVMTDsKKyAgICBjaGFyCSpwYXNzd29yZCA9IE5VTEw7CisgICAgY2hhcgkqZm5hbWU7CisgICAgY2hhcgkqYXJnID0gTlVMTDsKKworICAgIGlmIChuZXRiZWFuc0FyZ1szXSA9PSAnPScpCisgICAgeworCS8qICItbmI9Zm5hbWUiOiBSZWFkIGluZm8gZnJvbSBzcGVjaWZpZWQgZmlsZS4gKi8KKwlpZiAoZ2V0Q29ubkluZm8obmV0YmVhbnNBcmcgKyA0LCAmaG9zdG5hbWUsICZhZGRyZXNzLCAmcGFzc3dvcmQpCisJCQkJCQkJCSAgICAgID09IEZBSUwpCisJICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAobmV0YmVhbnNBcmdbM10gPT0gJzonKQorCSAgICAvKiAiLW5iOjxob3N0Pjo8YWRkcj46PHBhc3N3b3JkPiI6IGdldCBpbmZvIGZyb20gYXJndW1lbnQgKi8KKwkgICAgYXJnID0gbmV0YmVhbnNBcmcgKyA0OworCWlmIChhcmcgPT0gTlVMTCAmJiAoZm5hbWUgPSBnZXRlbnYoIl9fTkVUQkVBTlNfQ09OSU5GTyIpKSAhPSBOVUxMKQorCXsKKwkgICAgLyogIi1uYiI6IGdldCBpbmZvIGZyb20gZmlsZSBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgKi8KKwkgICAgaWYgKGdldENvbm5JbmZvKGZuYW1lLCAmaG9zdG5hbWUsICZhZGRyZXNzLCAmcGFzc3dvcmQpID09IEZBSUwpCisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGFyZyAhPSBOVUxMKQorCSAgICB7CisJCS8qICItbmI6PGhvc3Q+OjxhZGRyPjo8cGFzc3dvcmQ+IjogZ2V0IGluZm8gZnJvbSBhcmd1bWVudCAqLworCQlob3N0bmFtZSA9IGFyZzsKKwkJYWRkcmVzcyA9IHN0cmNocihob3N0bmFtZSwgJzonKTsKKwkJaWYgKGFkZHJlc3MgIT0gTlVMTCkKKwkJeworCQkgICAgKmFkZHJlc3MrKyA9ICdcMCc7CisJCSAgICBwYXNzd29yZCA9IHN0cmNocihhZGRyZXNzLCAnOicpOworCQkgICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCisJCQkqcGFzc3dvcmQrKyA9ICdcMCc7CisJCX0KKwkgICAgfQorCisJICAgIC8qIEdldCB0aGUgbWlzc2luZyB2YWx1ZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICovCisJICAgIGlmIChob3N0bmFtZSA9PSBOVUxMIHx8ICpob3N0bmFtZSA9PSAnXDAnKQorCQlob3N0bmFtZSA9IGdldGVudigiX19ORVRCRUFOU19IT1NUIik7CisJICAgIGlmIChhZGRyZXNzID09IE5VTEwpCisJCWFkZHJlc3MgPSBnZXRlbnYoIl9fTkVUQkVBTlNfU09DS0VUIik7CisJICAgIGlmIChwYXNzd29yZCA9PSBOVUxMKQorCQlwYXNzd29yZCA9IGdldGVudigiX19ORVRCRUFOU19WSU1fUEFTU1dPUkQiKTsKKworCSAgICAvKiBNb3ZlIHZhbHVlcyB0byBhbGxvY2F0ZWQgbWVtb3J5LiAqLworCSAgICBpZiAoaG9zdG5hbWUgIT0gTlVMTCkKKwkJaG9zdG5hbWUgPSAoY2hhciAqKXZpbV9zdHJzYXZlKChjaGFyX3UgKilob3N0bmFtZSk7CisJICAgIGlmIChhZGRyZXNzICE9IE5VTEwpCisJCWFkZHJlc3MgPSAoY2hhciAqKXZpbV9zdHJzYXZlKChjaGFyX3UgKilhZGRyZXNzKTsKKwkgICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCisJCXBhc3N3b3JkID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopcGFzc3dvcmQpOworCX0KKyAgICB9CisKKyAgICAvKiBVc2UgdGhlIGRlZmF1bHQgd2hlbiBhIHZhbHVlIGlzIG1pc3NpbmcuICovCisgICAgaWYgKGhvc3RuYW1lID09IE5VTEwgfHwgKmhvc3RuYW1lID09ICdcMCcpCisgICAgeworCXZpbV9mcmVlKGhvc3RuYW1lKTsKKwlob3N0bmFtZSA9IChjaGFyICopdmltX3N0cnNhdmUoKGNoYXJfdSAqKU5CX0RFRl9IT1NUKTsKKyAgICB9CisgICAgaWYgKGFkZHJlc3MgPT0gTlVMTCB8fCAqYWRkcmVzcyA9PSAnXDAnKQorICAgIHsKKwl2aW1fZnJlZShhZGRyZXNzKTsKKwlhZGRyZXNzID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopTkJfREVGX0FERFIpOworICAgIH0KKyAgICBpZiAocGFzc3dvcmQgPT0gTlVMTCB8fCAqcGFzc3dvcmQgPT0gJ1wwJykKKyAgICB7CisJdmltX2ZyZWUocGFzc3dvcmQpOworCXBhc3N3b3JkID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgoY2hhcl91ICopTkJfREVGX1BBU1MpOworICAgIH0KKyAgICBpZiAoaG9zdG5hbWUgPT0gTlVMTCB8fCBhZGRyZXNzID09IE5VTEwgfHwgcGFzc3dvcmQgPT0gTlVMTCkKKwlnb3RvIHRoZWVuZDsJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKworI2lmZGVmIElORVRfU09DS0VUUworICAgIHBvcnQgPSBhdG9pKGFkZHJlc3MpOworCisgICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQorICAgIHsKKwlQRVJST1IoInNvY2tldCgpIGluIG5ldGJlYW5zX2Nvbm5lY3QoKSIpOworCWdvdG8gdGhlZW5kOworICAgIH0KKworICAgIC8qIEdldCB0aGUgc2VydmVyIGludGVybmV0IGFkZHJlc3MgYW5kIHB1dCBpbnRvIGFkZHIgc3RydWN0dXJlICovCisgICAgLyogZmlsbCBpbiB0aGUgc29ja2V0IGFkZHJlc3Mgc3RydWN0dXJlIGFuZCBjb25uZWN0IHRvIHNlcnZlciAqLworICAgIG1lbXNldCgoY2hhciAqKSZzZXJ2ZXIsICdcMCcsIHNpemVvZihzZXJ2ZXIpKTsKKyAgICBzZXJ2ZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgICAgaWYgKChob3N0ID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkpID09IE5VTEwpCisgICAgeworCWlmIChtY2hfYWNjZXNzKGhvc3RuYW1lLCBSX09LKSA+PSAwKQorCXsKKwkgICAgLyogREVCVUc6IGlucHV0IGZpbGUgKi8KKwkgICAgc2QgPSBtY2hfb3Blbihob3N0bmFtZSwgT19SRE9OTFksIDApOworCSAgICBnb3RvIHRoZWVuZDsKKwl9CisJUEVSUk9SKCJnZXRob3N0YnluYW1lKCkgaW4gbmV0YmVhbnNfY29ubmVjdCgpIik7CisJc2QgPSAtMTsKKwlnb3RvIHRoZWVuZDsKKyAgICB9CisgICAgbWVtY3B5KChjaGFyICopJnNlcnZlci5zaW5fYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZWxzZQorICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKKyAgICB7CisJUEVSUk9SKCJzb2NrZXQoKSIpOworCWdvdG8gdGhlZW5kOworICAgIH0KKworICAgIHNlcnZlci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBzdHJjcHkoc2VydmVyLnN1bl9wYXRoLCBhZGRyZXNzKTsKKyNlbmRpZgorICAgIC8qIENvbm5lY3QgdG8gc2VydmVyICovCisgICAgaWYgKGNvbm5lY3Qoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyLCBzaXplb2Yoc2VydmVyKSkpCisgICAgeworCW5iZGVidWcoKCJuZXRiZWFuc19jb25uZWN0OiBDb25uZWN0IGZhaWxlZCB3aXRoIGVycm5vICVkXG4iLCBzb2NrX2Vycm5vKSk7CisJaWYgKHNvY2tfZXJybm8gPT0gRUNPTk5SRUZVU0VEKQorCXsKKwkgICAgc29ja19jbG9zZShzZCk7CisjaWZkZWYgSU5FVF9TT0NLRVRTCisJICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKKwkgICAgeworCQlQRVJST1IoInNvY2tldCgpIzIgaW4gbmV0YmVhbnNfY29ubmVjdCgpIik7CisJCWdvdG8gdGhlZW5kOworCSAgICB9CisjZWxzZQorCSAgICBpZiAoKHNkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisJICAgIHsKKwkJUEVSUk9SKCJzb2NrZXQoKSMyIGluIG5ldGJlYW5zX2Nvbm5lY3QoKSIpOworCQlnb3RvIHRoZWVuZDsKKwkgICAgfQorI2VuZGlmCisJICAgIGlmIChjb25uZWN0KHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlciwgc2l6ZW9mKHNlcnZlcikpKQorCSAgICB7CisJCWludCByZXRyaWVzID0gMzY7CisJCWludCBzdWNjZXNzID0gRkFMU0U7CisJCXdoaWxlIChyZXRyaWVzLS0KKwkJCSAgICAgJiYgKChzb2NrX2Vycm5vID09IEVDT05OUkVGVVNFRCkgfHwgKHNvY2tfZXJybm8gPT0gRUlOVFIpKSkKKwkJeworCQkgICAgbmJkZWJ1ZygoInJldHJ5aW5nLi4uXG4iKSk7CisJCSAgICBzbGVlcCg1KTsKKwkJICAgIGlmIChjb25uZWN0KHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlciwKKwkJCQlzaXplb2Yoc2VydmVyKSkgPT0gMCkKKwkJICAgIHsKKwkJCXN1Y2Nlc3MgPSBUUlVFOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYgKCFzdWNjZXNzKQorCQl7CisJCSAgICAvKiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuICovCisJCSAgICBQRVJST1IoXygiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiKSk7CisJCSAgICBnZXRvdXQoMSk7CisJCX0KKwkgICAgfQorCisJfQorCWVsc2UKKwl7CisJICAgIFBFUlJPUihfKCJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIpKTsKKwkgICAgZ2V0b3V0KDEpOworCX0KKyAgICB9CisKKyAgICBzcHJpbnRmKGJ1ZiwgIkFVVEggJXNcbiIsIHBhc3N3b3JkKTsKKyAgICBuYl9zZW5kKGJ1ZiwgIm5ldGJlYW5zX2Nvbm5lY3QiKTsKKworICAgIHNwcmludGYoYnVmLCAiMDp2ZXJzaW9uPTAgXCIlc1wiXG4iLCBFeHRFZFByb3RvY29sVmVyc2lvbik7CisgICAgbmJfc2VuZChidWYsICJleHRlcm5hbGVkaXRvcl92ZXJzaW9uIik7CisKKyAgICBuYmRlYnVnKCgibmV0YmVhbnNfY29ubmVjdDogQ29ubmVjdGlvbiBzdWNjZWVkZWRcbiIpKTsKKworLyogICAgbmJfaW5pdF9ncmFwaGljcygpOyAgZGVsYXkgdW50aWwgbmVlZGVkICovCisKKyAgICBoYXZlQ29ubmVjdGlvbiA9IFRSVUU7CisKK3RoZWVuZDoKKyAgICB2aW1fZnJlZShob3N0bmFtZSk7CisgICAgdmltX2ZyZWUoYWRkcmVzcyk7CisgICAgdmltX2ZyZWUocGFzc3dvcmQpOworICAgIHJldHVybjsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgTmV0QmVhbnMgaG9zdG5hbWUsIHBvcnQgYWRkcmVzcyBhbmQgcGFzc3dvcmQgZnJvbSBhIGZpbGUuCisgKiBSZXR1cm4gdGhlIHN0cmluZ3MgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFJldHVybiBGQUlMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLCBPSyBvdGhlcndpc2UgKG5vIG1hdHRlciB3aGF0IGl0CisgKiBjb250YWlucykuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRDb25uSW5mbyhjaGFyICpmaWxlLCBjaGFyICoqaG9zdCwgY2hhciAqKnBvcnQsIGNoYXIgKiphdXRoKQoreworICAgIEZJTEUgKmZwOworICAgIGNoYXJfdSBidWZbQlVGU0laXTsKKyAgICBjaGFyX3UgKmxwOworICAgIGNoYXJfdSAqbmw7CisjaWZkZWYgVU5JWAorICAgIHN0cnVjdCBzdGF0CXN0OworCisgICAgLyoKKyAgICAgKiBGb3IgVW5peCBvbmx5IGFjY2VwdCB0aGUgZmlsZSB3aGVuIGl0J3Mgbm90IGFjY2Vzc2libGUgYnkgb3RoZXJzLgorICAgICAqIFRoZSBvcGVuIHdpbGwgdGhlbiBmYWlsIGlmIHdlIGRvbid0IG93biB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBpZiAobWNoX3N0YXQoZmlsZSwgJnN0KSA9PSAwICYmIChzdC5zdF9tb2RlICYgMDA3NykgIT0gMCkKKyAgICB7CisJRU1TRzIoXygiRTY2ODogV3JvbmcgYWNjZXNzIG1vZGUgZm9yIE5ldEJlYW5zIGNvbm5lY3Rpb24gaW5mbyBmaWxlOiBcIiVzXCIiKSwKKwkJCQkJCQkJCWZpbGUpOworCXJldHVybiBGQUlMOworICAgIH0KKyNlbmRpZgorCisgICAgZnAgPSBtY2hfZm9wZW4oZmlsZSwgInIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICB7CisJUEVSUk9SKCJFNjYwOiBDYW5ub3Qgb3BlbiBOZXRCZWFucyBjb25uZWN0aW9uIGluZm8gZmlsZSIpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIGZpbGUuIFRoZXJlIHNob3VsZCBiZSBvbmUgb2YgZWFjaCBwYXJhbWV0ZXIgKi8KKyAgICB3aGlsZSAoKGxwID0gKGNoYXJfdSAqKWZnZXRzKChjaGFyICopYnVmLCBCVUZTSVosIGZwKSkgIT0gTlVMTCkKKyAgICB7CisJaWYgKChubCA9IHZpbV9zdHJjaHIobHAsICdcbicpKSAhPSBOVUxMKQorCSAgICAqbmwgPSAwOwkgICAgLyogc3RyaXAgb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lICovCisKKwlpZiAoU1RSTkNNUChscCwgImhvc3Q9IiwgNSkgPT0gMCkKKwl7CisJICAgIHZpbV9mcmVlKCpob3N0KTsKKwkgICAgKmhvc3QgPSAoY2hhciAqKXZpbV9zdHJzYXZlKCZidWZbNV0pOworCX0KKwllbHNlIGlmIChTVFJOQ01QKGxwLCAicG9ydD0iLCA1KSA9PSAwKQorCXsKKwkgICAgdmltX2ZyZWUoKnBvcnQpOworCSAgICAqcG9ydCA9IChjaGFyICopdmltX3N0cnNhdmUoJmJ1Zls1XSk7CisJfQorCWVsc2UgaWYgKFNUUk5DTVAobHAsICJhdXRoPSIsIDUpID09IDApCisJeworCSAgICB2aW1fZnJlZSgqYXV0aCk7CisJICAgICphdXRoID0gKGNoYXIgKil2aW1fc3Ryc2F2ZSgmYnVmWzVdKTsKKwl9CisgICAgfQorICAgIGZjbG9zZShmcCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKworc3RydWN0IGtleXF1ZXVlCit7CisgICAgaW50CQkgICAgIGtleTsKKyAgICBzdHJ1Y3Qga2V5cXVldWUgKm5leHQ7CisgICAgc3RydWN0IGtleXF1ZXVlICpwcmV2OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga2V5cXVldWUga2V5UV9UOworCitzdGF0aWMga2V5UV9UIGtleUhlYWQ7IC8qIGR1bW15IG5vZGUsIGhlYWRlciBmb3IgY2lyY3VsYXIgcXVldWUgKi8KKworCisvKgorICogUXVldWUgdXAga2V5IGNvbW1hbmRzIHNlbnQgZnJvbSBuZXRiZWFucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwb3N0cG9uZV9rZXljb21tYW5kKGludCBrZXkpCit7CisgICAga2V5UV9UICpub2RlOworCisgICAgbm9kZSA9IChrZXlRX1QgKilhbGxvYyhzaXplb2Yoa2V5UV9UKSk7CisKKyAgICBpZiAoa2V5SGVhZC5uZXh0ID09IE5VTEwpIC8qIGluaXRpYWxpemUgY2lyY3VsYXIgcXVldWUgKi8KKyAgICB7CisJa2V5SGVhZC5uZXh0ID0gJmtleUhlYWQ7CisJa2V5SGVhZC5wcmV2ID0gJmtleUhlYWQ7CisgICAgfQorCisgICAgLyogaW5zZXJ0IG5vZGUgYXQgdGFpbCBvZiBxdWV1ZSAqLworICAgIG5vZGUtPm5leHQgPSAma2V5SGVhZDsKKyAgICBub2RlLT5wcmV2ID0ga2V5SGVhZC5wcmV2OworICAgIGtleUhlYWQucHJldi0+bmV4dCA9IG5vZGU7CisgICAga2V5SGVhZC5wcmV2ID0gbm9kZTsKKworICAgIG5vZGUtPmtleSA9IGtleTsKK30KKworLyoKKyAqIEhhbmRsZSBhbnkgcXVldWVkLXVwIE5ldEJlYW5zIGtleWNvbW1hbmRzIHRvIGJlIHNlbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraGFuZGxlX2tleV9xdWV1ZSh2b2lkKQoreworICAgIHdoaWxlIChrZXlIZWFkLm5leHQgJiYga2V5SGVhZC5uZXh0ICE9ICZrZXlIZWFkKQorICAgIHsKKwkvKiBmaXJzdCwgdW5saW5rIHRoZSBub2RlICovCisJa2V5UV9UICpub2RlID0ga2V5SGVhZC5uZXh0OworCWtleUhlYWQubmV4dCA9IG5vZGUtPm5leHQ7CisJbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisKKwkvKiBub3csIHNlbmQgdGhlIGtleWNvbW1hbmQgKi8KKwluZXRiZWFuc19rZXljb21tYW5kKG5vZGUtPmtleSk7CisKKwkvKiBGaW5hbGx5LCBkaXNwb3NlIG9mIHRoZSBub2RlICovCisJdmltX2ZyZWUobm9kZSk7CisgICAgfQorfQorCisKK3N0cnVjdCBjbWRxdWV1ZQoreworICAgIGNoYXJfdQkgICAgKmJ1ZmZlcjsKKyAgICBzdHJ1Y3QgY21kcXVldWUgKm5leHQ7CisgICAgc3RydWN0IGNtZHF1ZXVlICpwcmV2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgY21kcXVldWUgcXVldWVfVDsKKworc3RhdGljIHF1ZXVlX1QgaGVhZDsgIC8qIGR1bW15IG5vZGUsIGhlYWRlciBmb3IgY2lyY3VsYXIgcXVldWUgKi8KKworCisvKgorICogUHV0IHRoZSBidWZmZXIgb24gdGhlIHdvcmsgcXVldWU7IHBvc3NpYmx5IHNhdmUgaXQgdG8gYSBmaWxlIGFzIHdlbGwuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2F2ZShjaGFyX3UgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBxdWV1ZV9UICpub2RlOworCisgICAgbm9kZSA9IChxdWV1ZV9UICopYWxsb2Moc2l6ZW9mKHF1ZXVlX1QpKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKQorCXJldHVybjsJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICBub2RlLT5idWZmZXIgPSBhbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAobm9kZS0+YnVmZmVyID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKG5vZGUpOworCXJldHVybjsJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICB9CisgICAgbWNoX21lbW1vdmUobm9kZS0+YnVmZmVyLCBidWYsIChzaXplX3QpbGVuKTsKKyAgICBub2RlLT5idWZmZXJbbGVuXSA9IE5VTDsKKworICAgIGlmIChoZWFkLm5leHQgPT0gTlVMTCkgICAvKiBpbml0aWFsaXplIGNpcmN1bGFyIHF1ZXVlICovCisgICAgeworCWhlYWQubmV4dCA9ICZoZWFkOworCWhlYWQucHJldiA9ICZoZWFkOworICAgIH0KKworICAgIC8qIGluc2VydCBub2RlIGF0IHRhaWwgb2YgcXVldWUgKi8KKyAgICBub2RlLT5uZXh0ID0gJmhlYWQ7CisgICAgbm9kZS0+cHJldiA9IGhlYWQucHJldjsKKyAgICBoZWFkLnByZXYtPm5leHQgPSBub2RlOworICAgIGhlYWQucHJldiA9IG5vZGU7CisKKyNpZmRlZiBOQkRFQlVHCisgICAgeworCXN0YXRpYyBpbnQgb3V0ZmQgPSAtMjsKKworCS8qIHBvc3NpYmx5IHdyaXRlIGJ1ZmZlciBvdXQgdG8gYSBmaWxlICovCisJaWYgKG91dGZkID09IC0zKQorCSAgICByZXR1cm47CisKKwlpZiAob3V0ZmQgPT0gLTIpCisJeworCSAgICBjaGFyICpmaWxlID0gZ2V0ZW52KCJfX05FVEJFQU5TX1NBVkUiKTsKKwkgICAgaWYgKGZpbGUgPT0gTlVMTCkKKwkJb3V0ZmQgPSAtMzsKKwkgICAgZWxzZQorCQlvdXRmZCA9IG1jaF9vcGVuKGZpbGUsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJfQorCisJaWYgKG91dGZkID49IDApCisJICAgIHdyaXRlKG91dGZkLCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmCit9CisKKworLyoKKyAqIFdoaWxlIHRoZXJlJ3Mgc3RpbGwgYSBjb21tYW5kIGluIHRoZSB3b3JrIHF1ZXVlLCBwYXJzZSBhbmQgZXhlY3V0ZSBpdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCituYl9wYXJzZV9tZXNzYWdlcyh2b2lkKQoreworICAgIGNoYXJfdQkqcDsKKyAgICBxdWV1ZV9UCSpub2RlOworCisgICAgd2hpbGUgKGhlYWQubmV4dCAhPSAmaGVhZCkKKyAgICB7CisJbm9kZSA9IGhlYWQubmV4dDsKKworCS8qIExvY2F0ZSB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlyc3QgYnVmZmVyLiAqLworCXAgPSB2aW1fc3RyY2hyKG5vZGUtPmJ1ZmZlciwgJ1xuJyk7CisJaWYgKHAgPT0gTlVMTCkKKwl7CisJICAgIC8qIENvbW1hbmQgaXNuJ3QgY29tcGxldGUuICBJZiB0aGVyZSBpcyBubyBmb2xsb3dpbmcgYnVmZmVyLAorCSAgICAgKiByZXR1cm4gKHdhaXQgZm9yIG1vcmUpLiBJZiB0aGVyZSBpcyBhbm90aGVyIGJ1ZmZlciBmb2xsb3dpbmcsCisJICAgICAqIHByZXBlbmQgdGhlIHRleHQgdG8gdGhhdCBidWZmZXIgYW5kIGRlbGV0ZSB0aGlzIG9uZS4gICovCisJICAgIGlmIChub2RlLT5uZXh0ID09ICZoZWFkKQorCQlyZXR1cm47CisJICAgIHAgPSBhbGxvYyhTVFJMRU4obm9kZS0+YnVmZmVyKSArIFNUUkxFTihub2RlLT5uZXh0LT5idWZmZXIpICsgMSk7CisJICAgIGlmIChwID09IE5VTEwpCisJCXJldHVybjsJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwkgICAgU1RSQ1BZKHAsIG5vZGUtPmJ1ZmZlcik7CisJICAgIFNUUkNBVChwLCBub2RlLT5uZXh0LT5idWZmZXIpOworCSAgICB2aW1fZnJlZShub2RlLT5uZXh0LT5idWZmZXIpOworCSAgICBub2RlLT5uZXh0LT5idWZmZXIgPSBwOworCisJICAgIC8qIGRpc3Bvc2Ugb2YgdGhlIG5vZGUgYW5kIGJ1ZmZlciAqLworCSAgICBoZWFkLm5leHQgPSBub2RlLT5uZXh0OworCSAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKKwkgICAgdmltX2ZyZWUobm9kZS0+YnVmZmVyKTsKKwkgICAgdmltX2ZyZWUobm9kZSk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIFRoZXJlIGlzIGEgY29tcGxldGUgY29tbWFuZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKwkgICAgICogVGVybWluYXRlIGl0IHdpdGggYSBOVUwuICBXaGVuIG5vIG1vcmUgdGV4dCBpcyBmb2xsb3dpbmcgdW5saW5rCisJICAgICAqIHRoZSBidWZmZXIuICBEbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcsIGJlY2F1c2UgbmV3IGJ1ZmZlcnMgY2FuCisJICAgICAqIGJlIGFkZGVkIHdoaWxlIGJ1c3kgaGFuZGxpbmcgdGhlIGNvbW1hbmQuICovCisJICAgICpwKysgPSBOVUw7CisJICAgIGlmICgqcCA9PSBOVUwpCisJICAgIHsKKwkJaGVhZC5uZXh0ID0gbm9kZS0+bmV4dDsKKwkJbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisJICAgIH0KKworCSAgICAvKiBub3csIHBhcnNlIGFuZCBleGVjdXRlIHRoZSBjb21tYW5kcyAqLworCSAgICBuYl9wYXJzZV9jbWQobm9kZS0+YnVmZmVyKTsKKworCSAgICBpZiAoKnAgPT0gTlVMKQorCSAgICB7CisJCS8qIGJ1ZmZlciBmaW5pc2hlZCwgZGlzcG9zZSBvZiB0aGUgbm9kZSBhbmQgYnVmZmVyICovCisJCXZpbV9mcmVlKG5vZGUtPmJ1ZmZlcik7CisJCXZpbV9mcmVlKG5vZGUpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBtb3JlIGZvbGxvd3MsIG1vdmUgdG8gdGhlIHN0YXJ0ICovCisJCW1jaF9tZW1tb3ZlKG5vZGUtPmJ1ZmZlciwgcCwgU1RSTEVOKHApICsgMSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBCdWZmZXIgc2l6ZSBmb3IgcmVhZGluZyBpbmNvbWluZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgTUFYTVNHU0laRSA0MDk2CisKKy8qCisgKiBSZWFkIGFuZCBwcm9jZXNzIGEgY29tbWFuZCBmcm9tIG5ldGJlYW5zLgorICovCisvKkFSR1NVU0VEKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChQUk9UTykKKy8qIFVzZSB0aGlzIG9uZSB3aGVuIGdlbmVyYXRpbmcgcHJvdG90eXBlcywgdGhlIG90aGVycyBhcmUgc3RhdGljLiAqLworICAgIHZvaWQKK21lc3NhZ2VGcm9tTmV0YmVhbnNXMzIoKQorI2Vsc2UKKyMgaWZkZWYgRkVBVF9HVUlfTU9USUYKKyAgICBzdGF0aWMgdm9pZAorbWVzc2FnZUZyb21OZXRiZWFucyhYdFBvaW50ZXIgY2xpZW50RGF0YSwgaW50ICp1bnVzZWQxLCBYdElucHV0SWQgKnVudXNlZDIpCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfR1VJX0dUSworICAgIHN0YXRpYyB2b2lkCittZXNzYWdlRnJvbU5ldGJlYW5zKGdwb2ludGVyIGNsaWVudERhdGEsIGdpbnQgdW51c2VkMSwKKwkJCQkJCSAgICBHZGtJbnB1dENvbmRpdGlvbiB1bnVzZWQyKQorIyBlbmRpZgorI2VuZGlmCit7CisgICAgc3RhdGljIGNoYXJfdQkqYnVmID0gTlVMTDsKKyAgICBpbnQJCQlsZW47CisgICAgaW50CQkJcmVhZGxlbiA9IDA7CisgICAgc3RhdGljIGludAkJbGV2ZWwgPSAwOworCisgICAgaWYgKHNkIDwgMCkKKyAgICB7CisJbmJkZWJ1ZygoIm1lc3NhZ2VGcm9tTmV0YmVhbnMoKSBjYWxsZWQgd2l0aG91dCBhIHNvY2tldFxuIikpOworCXJldHVybjsKKyAgICB9CisKKyAgICArK2xldmVsOyAgLyogcmVjdXJzaW9uIGd1YXJkOyB0aGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIFggZXZlbnQgbG9vcCAqLworCisgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gcmVhZCBpbnRvLiAqLworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICB7CisJYnVmID0gYWxsb2MoTUFYTVNHU0laRSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICByZXR1cm47CS8qIG91dCBvZiBtZW1vcnkhICovCisgICAgfQorCisgICAgLyogS2VlcCBvbiByZWFkaW5nIGZvciBhcyBsb25nIGFzIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkLiAqLworICAgIGZvciAoOzspCisgICAgeworCWxlbiA9IHNvY2tfcmVhZChzZCwgYnVmLCBNQVhNU0dTSVpFKTsKKwlpZiAobGVuIDw9IDApCisJICAgIGJyZWFrOwkvKiBlcnJvciBvciBub3RoaW5nIG1vcmUgdG8gcmVhZCAqLworCisJLyogU3RvcmUgdGhlIHJlYWQgbWVzc2FnZSBpbiB0aGUgcXVldWUuICovCisJc2F2ZShidWYsIGxlbik7CisJcmVhZGxlbiArPSBsZW47CisJaWYgKGxlbiA8IE1BWE1TR1NJWkUpCisJICAgIGJyZWFrOwkvKiBkaWQgcmVhZCBldmVyeXRoaW5nIHRoYXQncyBhdmFpbGFibGUgKi8KKyAgICB9CisKKyAgICBpZiAocmVhZGxlbiA8PSAwKQorICAgIHsKKwkvKiByZWFkIGVycm9yIG9yIGRpZG4ndCByZWFkIGFueXRoaW5nICovCisJbmV0YmVhbnNfZGlzY29ubmVjdCgpOworCW5iZGVidWcoKCJtZXNzYWdlRnJvbU5ldGJlYW5zOiBFcnJvciBpbiByZWFkKCkgZnJvbSBzb2NrZXRcbiIpKTsKKwlpZiAobGVuIDwgMCkKKwkgICAgUEVSUk9SKF8oInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiKSk7CisJcmV0dXJuOyAvKiBkb24ndCB0cnkgdG8gcGFyc2UgaXQgKi87CisgICAgfQorCisgICAgLyogUGFyc2UgdGhlIG1lc3NhZ2VzLCBidXQgYXZvaWQgcmVjdXJzaW9uLiAqLworICAgIGlmIChsZXZlbCA9PSAxKQorCW5iX3BhcnNlX21lc3NhZ2VzKCk7CisKKyAgICAtLWxldmVsOworfQorCisvKgorICogSGFuZGxlIG9uZSBOVUwgdGVybWluYXRlZCBjb21tYW5kLgorICoKKyAqIGZvcm1hdCBvZiBhIGNvbW1hbmQgZnJvbSBuZXRiZWFuczoKKyAqCisgKiAgICA2OnNldFRpdGxlITg0ICJhLmMiCisgKgorICogICAgYnVmbm8KKyAqICAgICBjb2xvbgorICogICAgICBjbWQKKyAqCQkhCisgKgkJIGNtZG5vCisgKgkJICAgIGFyZ3MKKyAqCisgKiBmb3IgZnVuY3Rpb24gY2FsbHMsIHRoZSAhIGlzIHJlcGxhY2VkIGJ5IGEgLworICovCisgICAgc3RhdGljIHZvaWQKK25iX3BhcnNlX2NtZChjaGFyX3UgKmNtZCkKK3sKKyAgICBjaGFyX3UJKnZlcmI7CisgICAgY2hhcl91CSpxOworICAgIGludAkJYnVmbm87CisgICAgaW50CQlpc2Z1bmMgPSAtMTsKKworICAgIGlmIChTVFJDTVAoY21kLCAiRElTQ09OTkVDVCIpID09IDApCisgICAgeworCS8qIFdlIGFzc3VtZSB0aGUgc2VydmVyIGtub3dzIHRoYXQgd2UgY2FuIHNhZmVseSBleGl0ISAqLworCWlmIChzZCA+PSAwKQorCSAgICBzb2NrX2Nsb3NlKHNkKTsKKwkvKiBEaXNjb25uZWN0IGJlZm9yZSBleGl0aW5nLCBNb3RpZiBoYW5ncyBpbiBhIFNlbGVjdCBlcnJvcgorCSAqIG1lc3NhZ2Ugb3RoZXJ3aXNlLiAqLworCW5ldGJlYW5zX2Rpc2Nvbm5lY3QoKTsKKwlnZXRvdXQoMCk7CisJLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKworICAgIGlmIChTVFJDTVAoY21kLCAiREVUQUNIIikgPT0gMCkKKyAgICB7CisJLyogVGhlIElERSBpcyBicmVha2luZyB0aGUgY29ubmVjdGlvbi4gKi8KKwlpZiAoc2QgPj0gMCkKKwkgICAgc29ja19jbG9zZShzZCk7CisJbmV0YmVhbnNfZGlzY29ubmVjdCgpOworCXJldHVybjsKKyAgICB9CisKKyAgICBidWZubyA9IHN0cnRvbCgoY2hhciAqKWNtZCwgKGNoYXIgKiopJnZlcmIsIDEwKTsKKworICAgIGlmICgqdmVyYiAhPSAnOicpCisgICAgeworCUVNU0cyKCJFNjI3OiBtaXNzaW5nIGNvbG9uOiAlcyIsIGNtZCk7CisJcmV0dXJuOworICAgIH0KKyAgICArK3ZlcmI7IC8qIHNraXAgY29sb24gKi8KKworICAgIGZvciAocSA9IHZlcmI7ICpxOyBxKyspCisgICAgeworCWlmICgqcSA9PSAnIScpCisJeworCSAgICAqcSsrID0gTlVMOworCSAgICBpc2Z1bmMgPSAwOworCSAgICBicmVhazsKKwl9CisJZWxzZSBpZiAoKnEgPT0gJy8nKQorCXsKKwkgICAgKnErKyA9IE5VTDsKKwkgICAgaXNmdW5jID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChpc2Z1bmMgPCAwKQorICAgIHsKKwlFTVNHMigiRTYyODogbWlzc2luZyAhIG9yIC8gaW46ICVzIiwgY21kKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgY21kbm8gPSBzdHJ0b2woKGNoYXIgKilxLCAoY2hhciAqKikmcSwgMTApOworCisgICAgcSA9IHNraXB3aGl0ZShxKTsKKworICAgIGlmIChuYl9kb19jbWQoYnVmbm8sIHZlcmIsIGlzZnVuYywgY21kbm8sIHEpID09IEZBSUwpCisgICAgeworCW5iZGVidWcoKCJuYl9wYXJzZV9jbWQ6IENvbW1hbmQgZXJyb3IgZm9yIFwiJXNcIlxuIiwgY21kKSk7CisJRU1TRygiRTYyOTogYmFkIHJldHVybiBmcm9tIG5iX2RvX2NtZCIpOworICAgIH0KK30KKworc3RydWN0IG5iYnVmX3N0cnVjdAoreworICAgIGJ1Zl9UCQkqYnVmcDsKKyAgICB1bnNpZ25lZCBpbnQJIGZpcmVDaGFuZ2VzOjE7CisgICAgdW5zaWduZWQgaW50CSBpbml0RG9uZToxOworICAgIHVuc2lnbmVkIGludAkgbW9kaWZpZWQ6MTsKKyAgICBjaGFyCQkqZGlzcGxheW5hbWU7CisgICAgY2hhcl91CQkqcGFydGlhbF9saW5lOworICAgIGludAkJCSpzaWdubWFwOworICAgIHNob3J0X3UJCSBzaWdubWFwbGVuOworICAgIHNob3J0X3UJCSBzaWdubWFwdXNlZDsKK307CisKK3R5cGVkZWYgc3RydWN0IG5iYnVmX3N0cnVjdCBuYmJ1Zl9UOworCitzdGF0aWMgbmJidWZfVCAqYnVmX2xpc3QgPSAwOworaW50IGJ1Zl9saXN0X3NpemUgPSAwOwkvKiBzaXplIG9mIGJ1Zl9saXN0ICovCitpbnQgYnVmX2xpc3RfdXNlZCA9IDA7CS8qIG5yIG9mIGVudHJpZXMgaW4gYnVmX2xpc3QgYWN0dWFsbHkgaW4gdXNlICovCisKK3N0YXRpYyBjaGFyICoqZ2xvYmFsc2lnbm1hcDsKK3N0YXRpYyBpbnQgZ2xvYmFsc2lnbm1hcGxlbjsKK3N0YXRpYyBpbnQgZ2xvYmFsc2lnbm1hcHVzZWQ7CisKK3N0YXRpYyBpbnQgIG1hcHNpZ250eXBlIF9fQVJHUygobmJidWZfVCAqLCBpbnQgbG9jYWxzaWdudHlwZSkpOworc3RhdGljIHZvaWQgYWRkc2lnbnR5cGUgX19BUkdTKChuYmJ1Zl9UICosIGludCBsb2NhbHNpZ250eXBlLCBjaGFyX3UgKnR5cGVOYW1lLAorCQkJY2hhcl91ICp0b29sdGlwLCBjaGFyX3UgKmdseXBoZmlsZSwKKwkJCWludCB1c2VmZywgaW50IGZnLCBpbnQgdXNlYmcsIGludCBiZykpOworCitzdGF0aWMgaW50IGN1clBDdHlwZSA9IC0xOworCisvKgorICogR2V0IHRoZSBOZXRiZWFucyBidWZmZXIgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyBpbnQKK25iX2dldGJ1Zm5vKGJ1Zl9UICpidWZwKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9saXN0X3VzZWQ7IGkrKykKKwlpZiAoYnVmX2xpc3RbaV0uYnVmcCA9PSBidWZwKQorCSAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBJcyB0aGlzIGEgTmV0QmVhbnMtb3duZWQgYnVmZmVyPworICovCisgICAgaW50Citpc05ldGJlYW5zQnVmZmVyKGJ1Zl9UICpidWZwKQoreworICAgIHJldHVybiBidWZwLT5iX25ldGJlYW5zX2ZpbGU7Cit9CisKKy8qCisgKiBOZXRCZWFucyBhbmQgVmltIGhhdmUgZGlmZmVyZW50IHVuZG8gbW9kZWxzLiBJbiBWaW0sIHRoZSBmaWxlIGlzbid0CisgKiBjaGFuZ2VkIGlmIGNoYW5nZXMgYXJlIHVuZG9uZSB2aWEgdGhlIHVuZG8gY29tbWFuZC4gSW4gTmV0QmVhbnMsIG9uY2UKKyAqIGEgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdGhlIGZpbGUgaXMgbWFya2VkIGFzIG1vZGlmaWVkIHVudGlsIHNhdmVkLiBJdAorICogZG9lc24ndCBtYXR0ZXIgaWYgdGhlIGNoYW5nZSB3YXMgdW5kb25lLgorICoKKyAqIFNvIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRoZSBjb3JuZXIgY2FzZSB3aGVyZSBWaW0gdGhpbmtzIGEgYnVmZmVyIGlzCisgKiB1bm1vZGlmaWVkIGJ1dCBOZXRCZWFucyB0aGlua3MgaXQgSVMgbW9kaWZpZWQuCisgKi8KKyAgICBpbnQKK2lzTmV0YmVhbnNNb2RpZmllZChidWZfVCAqYnVmcCkKK3sKKyAgICBpbnQgYnVmbm8gPSBuYl9nZXRidWZubyhidWZwKTsKKworICAgIGlmIChidWZubyA+IDApCisJcmV0dXJuIGJ1Zl9saXN0W2J1Zm5vXS5tb2RpZmllZDsKKyAgICBlbHNlCisJcmV0dXJuIEZBTFNFOworfQorCisvKgorICogR2l2ZW4gYSBOZXRiZWFucyBidWZmZXIgbnVtYmVyLCByZXR1cm4gdGhlIG5ldGJlYW5zIGJ1ZmZlci4KKyAqIFJldHVybnMgTlVMTCBmb3IgMCBvciBhIG5lZ2F0aXZlIG51bWJlci4gQSAwIGJ1Zm5vIG1lYW5zIGEKKyAqIG5vbi1idWZmZXIgcmVsYXRlZCBjb21tYW5kIGhhcyBiZWVuIHNlbnQuCisgKi8KKyAgICBzdGF0aWMgbmJidWZfVCAqCituYl9nZXRfYnVmKGludCBidWZubykKK3sKKyAgICAvKiBmaW5kIG9yIGNyZWF0ZSBhIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBudW1iZXIgKi8KKyAgICBpbnQgaW5jcjsKKworICAgIGlmIChidWZubyA8PSAwKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKCFidWZfbGlzdCkKKyAgICB7CisJLyogaW5pdGlhbGl6ZSAqLworCWJ1Zl9saXN0ID0gKG5iYnVmX1QgKilhbGxvY19jbGVhcigxMDAgKiBzaXplb2YobmJidWZfVCkpOworCWJ1Zl9saXN0X3NpemUgPSAxMDA7CisgICAgfQorICAgIGlmIChidWZubyA+PSBidWZfbGlzdF91c2VkKSAvKiBuZXcgKi8KKyAgICB7CisJaWYgKGJ1Zm5vID49IGJ1Zl9saXN0X3NpemUpIC8qIGdyb3cgbGlzdCAqLworCXsKKwkgICAgaW5jciA9IGJ1Zm5vIC0gYnVmX2xpc3Rfc2l6ZSArIDkwOworCSAgICBidWZfbGlzdF9zaXplICs9IGluY3I7CisJICAgIGJ1Zl9saXN0ID0gKG5iYnVmX1QgKil2aW1fcmVhbGxvYygKKwkJCQkgICBidWZfbGlzdCwgYnVmX2xpc3Rfc2l6ZSAqIHNpemVvZihuYmJ1Zl9UKSk7CisJICAgIG1lbXNldChidWZfbGlzdCArIGJ1Zl9saXN0X3NpemUgLSBpbmNyLCAwLCBpbmNyICogc2l6ZW9mKG5iYnVmX1QpKTsKKwl9CisKKwl3aGlsZSAoYnVmX2xpc3RfdXNlZCA8PSBidWZubykKKwl7CisJICAgIC8qIERlZmF1bHQgaXMgdG8gZmlyZSB0ZXh0IGNoYW5nZXMuICovCisJICAgIGJ1Zl9saXN0W2J1Zl9saXN0X3VzZWRdLmZpcmVDaGFuZ2VzID0gMTsKKwkgICAgKytidWZfbGlzdF91c2VkOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gYnVmX2xpc3QgKyBidWZubzsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgbW9kaWZpZWQuCisgKi8KKyAgICBzdGF0aWMgaW50Citjb3VudF9jaGFuZ2VkX2J1ZmZlcnModm9pZCkKK3sKKyAgICBidWZfVAkqYnVmcDsKKyAgICBpbnQJCW47CisKKyAgICBuID0gMDsKKyAgICBmb3IgKGJ1ZnAgPSBmaXJzdGJ1ZjsgYnVmcCAhPSBOVUxMOyBidWZwID0gYnVmcC0+Yl9uZXh0KQorCWlmIChidWZwLT5iX2NoYW5nZWQpCisJICAgICsrbjsKKyAgICByZXR1cm4gbjsKK30KKworLyoKKyAqIEVuZCB0aGUgbmV0YmVhbnMgc2Vzc2lvbi4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2VuZCh2b2lkKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCisgICAgaWYgKCFoYXZlQ29ubmVjdGlvbikKKwlyZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX2xpc3RfdXNlZDsgaSsrKQorICAgIHsKKwlpZiAoIWJ1Zl9saXN0W2ldLmJ1ZnApCisJICAgIGNvbnRpbnVlOworCWlmIChuZXRiZWFuc0ZvcmNlZFF1aXQpCisJeworCSAgICAvKiBtYXJrIGFzIHVubW9kaWZpZWQgc28gTmV0QmVhbnMgd29uJ3QgcHV0IHVwIGRpYWxvZyBvbiAia2lsbGVkIiAqLworCSAgICBzcHJpbnRmKGJ1ZiwgIiVkOnVubW9kaWZpZWQ9JWRcbiIsIGksIGNtZG5vKTsKKwkgICAgbmJkZWJ1ZygoIkVWVDogJXMiLCBidWYpKTsKKwkgICAgbmJfc2VuZChidWYsICJuZXRiZWFuc19lbmQiKTsKKwl9CisJc3ByaW50ZihidWYsICIlZDpraWxsZWQ9JWRcbiIsIGksIGNtZG5vKTsKKwluYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZikpOworLyoJbmJfc2VuZChidWYsICJuZXRiZWFuc19lbmQiKTsgICAgYXZvaWQgIndyaXRlIGZhaWxlZCIgbWVzc2FnZXMgKi8KKwlpZiAoc2QgPj0gMCkKKwkgICAgc29ja193cml0ZShzZCwgYnVmLCBTVFJMRU4oYnVmKSk7ICAvKiBpZ25vcmUgZXJyb3JzICovCisgICAgfQorCisgICAgLyogR2l2ZSBOZXRCZWFucyBhIGNoYW5jZSB0byB3cml0ZSBzb21lIGNsZWFuLXVwIGNtZHMgdG8gdGhlIHNvY2tldCBiZWZvcmUKKyAgICAgKiB3ZSBjbG9zZSB0aGUgY29ubmVjdGlvbi4gIE90aGVyIGNsaWVudHMgbWF5IHNldCB0aGUgZGVsYXkgdG8gemVyby4gKi8KKyAgICBpZiAoZXhpdF9kZWxheSA+IDApCisJc2xlZXAoZXhpdF9kZWxheSk7Cit9CisKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSB0byBuZXRiZWFucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCituYl9zZW5kKGNoYXIgKmJ1ZiwgY2hhciAqZnVuKQoreworICAgIC8qIEF2b2lkIGdpdmluZyBwYWdlcyBmdWxsIG9mIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlIG90aGVyIHNpZGUgaGFzCisgICAgICogZXhpdGVkLCBvbmx5IG1lbnRpb24gdGhlIGZpcnN0IGVycm9yIHVudGlsIHRoZSBjb25uZWN0aW9uIHdvcmtzIGFnYWluLiAqLworICAgIHN0YXRpYyBpbnQgZGlkX2Vycm9yID0gRkFMU0U7CisKKyAgICBpZiAoc2QgPCAwKQorICAgIHsKKwlpZiAoIWRpZF9lcnJvcikKKwkgICAgRU1TRzIoIkU2MzA6ICVzKCk6IHdyaXRlIHdoaWxlIG5vdCBjb25uZWN0ZWQiLCBmdW4pOworCWRpZF9lcnJvciA9IFRSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKHNvY2tfd3JpdGUoc2QsIGJ1ZiwgU1RSTEVOKGJ1ZikpICE9IChpbnQpU1RSTEVOKGJ1ZikpCisgICAgeworCWlmICghZGlkX2Vycm9yKQorCSAgICBFTVNHMigiRTYzMTogJXMoKTogd3JpdGUgZmFpbGVkIiwgZnVuKTsKKwlkaWRfZXJyb3IgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisJZGlkX2Vycm9yID0gRkFMU0U7Cit9CisKKy8qCisgKiBTb21lIGlucHV0IHJlY2VpdmVkIGZyb20gbmV0YmVhbnMgcmVxdWlyZXMgYSByZXNwb25zZS4gVGhpcyBmdW5jdGlvbgorICogaGFuZGxlcyBhIHJlc3BvbnNlIHdpdGggbm8gaW5mb3JtYXRpb24gKGV4Y2VwdCB0aGUgY29tbWFuZCBudW1iZXIpLgorICovCisgICAgc3RhdGljIHZvaWQKK25iX3JlcGx5X25pbChpbnQgY21kbm8pCit7CisgICAgY2hhciByZXBseVszMl07CisKKyAgICBpZiAoIWhhdmVDb25uZWN0aW9uKQorCXJldHVybjsKKworICAgIHNwcmludGYocmVwbHksICIlZFxuIiwgY21kbm8pOworCisgICAgbmJkZWJ1ZygoIiAgICBSRVBMWTogJXMiLCByZXBseSkpOworCisgICAgbmJfc2VuZChyZXBseSwgIm5iX3JlcGx5X25pbCIpOworfQorCisKKy8qCisgKiBTZW5kIGEgcmVzcG9uc2Ugd2l0aCB0ZXh0LgorICogInJlc3VsdCIgbXVzdCBoYXZlIGJlZW4gcXVvdGVkIGFscmVhZHkgKHVzaW5nIG5iX3F1b3RlKCkpLgorICovCisgICAgc3RhdGljIHZvaWQKK25iX3JlcGx5X3RleHQoaW50IGNtZG5vLCBjaGFyX3UgKnJlc3VsdCkKK3sKKyAgICBjaGFyX3UgKnJlcGx5OworCisgICAgaWYgKCFoYXZlQ29ubmVjdGlvbikKKwlyZXR1cm47CisKKyAgICByZXBseSA9IGFsbG9jKFNUUkxFTihyZXN1bHQpICsgMzIpOworICAgIHNwcmludGYoKGNoYXIgKilyZXBseSwgIiVkICVzXG4iLCBjbWRubywgKGNoYXIgKilyZXN1bHQpOworCisgICAgbmJkZWJ1ZygoIiAgICBSRVBMWTogJXMiLCByZXBseSkpOworICAgIG5iX3NlbmQoKGNoYXIgKilyZXBseSwgIm5iX3JlcGx5X3RleHQiKTsKKworICAgIHZpbV9mcmVlKHJlcGx5KTsKK30KKworCisvKgorICogU2VuZCBhIHJlc3BvbnNlIHdpdGggYSBudW1iZXIgcmVzdWx0IGNvZGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbmJfcmVwbHlfbnIoaW50IGNtZG5vLCBsb25nIHJlc3VsdCkKK3sKKyAgICBjaGFyIHJlcGx5WzMyXTsKKworICAgIGlmICghaGF2ZUNvbm5lY3Rpb24pCisJcmV0dXJuOworCisgICAgc3ByaW50ZihyZXBseSwgIiVkICVsZFxuIiwgY21kbm8sIHJlc3VsdCk7CisKKyAgICBuYmRlYnVnKCgiUkVQTFk6ICVzIiwgcmVwbHkpKTsKKworICAgIG5iX3NlbmQocmVwbHksICJuYl9yZXBseV9uciIpOworfQorCisKKy8qCisgKiBFbmNvZGUgbmV3bGluZSwgcmV0LCBiYWNrc2xhc2gsIGRvdWJsZSBxdW90ZSBmb3IgdHJhbnNtaXNzaW9uIHRvIE5ldEJlYW5zLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCituYl9xdW90ZShjaGFyX3UgKnR4dCkKK3sKKyAgICBjaGFyX3UgKmJ1ZiA9IGFsbG9jKDIgKiBTVFJMRU4odHh0KSArIDEpOworICAgIGNoYXJfdSAqcCA9IHR4dDsKKyAgICBjaGFyX3UgKnEgPSBidWY7CisKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgZm9yICg7ICpwOyBwKyspCisgICAgeworCXN3aXRjaCAoKnApCisJeworCSAgICBjYXNlICdcIic6CisJICAgIGNhc2UgJ1xcJzoKKwkJKnErKyA9ICdcXCc7ICpxKysgPSAqcDsgYnJlYWs7CisJIC8qIGNhc2UgJ1x0JzogKi8KKwkgLyogICAgICpxKysgPSAnXFwnOyAqcSsrID0gJ3QnOyBicmVhazsgKi8KKwkgICAgY2FzZSAnXG4nOgorCQkqcSsrID0gJ1xcJzsgKnErKyA9ICduJzsgYnJlYWs7CisJICAgIGNhc2UgJ1xyJzoKKwkJKnErKyA9ICdcXCc7ICpxKysgPSAncic7IGJyZWFrOworCSAgICBkZWZhdWx0OgorCQkqcSsrID0gKnA7CisJCWJyZWFrOworCX0KKyAgICB9CisgICAgKnErKyA9ICdcMCc7CisKKyAgICByZXR1cm4gYnVmOworfQorCisKKy8qCisgKiBSZW1vdmUgdG9wIGxldmVsIGRvdWJsZSBxdW90ZXM7IGNvbnZlcnQgYmFja3NsYXNoZWQgY2hhcnMuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgKE5VTEwgZm9yIGZhaWx1cmUpLgorICogSWYgImVuZHAiIGlzIG5vdCBOVUxMIGl0IGlzIHNldCB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSB0ZXJtaW5hdGluZworICogcXVvdGUuCisgKi8KKyAgICBzdGF0aWMgY2hhciAqCituYl91bnF1b3RlKGNoYXJfdSAqcCwgY2hhcl91ICoqZW5kcCkKK3sKKyAgICBjaGFyICpyZXN1bHQgPSAwOworICAgIGNoYXIgKnE7CisgICAgaW50IGRvbmUgPSAwOworCisgICAgLyogcmVzdWx0IGlzIG5ldmVyIGxvbmdlciB0aGFuIGlucHV0ICovCisgICAgcmVzdWx0ID0gKGNoYXIgKilhbGxvY19jbGVhcihTVFJMRU4ocCkgKyAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKnArKyAhPSAnIicpCisgICAgeworCW5iZGVidWcoKCJuYl91bnF1b3RlIGNhbGxlZCB3aXRoIHN0cmluZyB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHF1b3RlITogJXNcbiIsCisJCQlwKSk7CisJcmVzdWx0WzBdID0gTlVMOworCXJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZm9yIChxID0gcmVzdWx0OyAhZG9uZSAmJiAqcCAhPSBOVUw7KQorICAgIHsKKwlzd2l0Y2ggKCpwKQorCXsKKwkgICAgY2FzZSAnIic6CisJCS8qCisJCSAqIFVuYmFja3NsYXNoZWQgZHF1b3RlIG1hcmtzIHRoZSBlbmQsIGlmIGZpcnN0IGNoYXIgd2FzIGRxdW90ZS4KKwkJICovCisJCWRvbmUgPSAxOworCQlicmVhazsKKworCSAgICBjYXNlICdcXCc6CisJCSsrcDsKKwkJc3dpdGNoICgqcCkKKwkJeworCQkgICAgY2FzZSAnXFwnOgkqcSsrID0gJ1xcJzsJYnJlYWs7CisJCSAgICBjYXNlICduJzoJKnErKyA9ICdcbic7CWJyZWFrOworCQkgICAgY2FzZSAndCc6CSpxKysgPSAnXHQnOwlicmVhazsKKwkJICAgIGNhc2UgJ3InOgkqcSsrID0gJ1xyJzsJYnJlYWs7CisJCSAgICBjYXNlICciJzoJKnErKyA9ICciJzsJYnJlYWs7CisJCSAgICBjYXNlIE5VTDoJLS1wOwkJYnJlYWs7CisJCSAgICAvKiBkZWZhdWx0OiBza2lwIG92ZXIgaWxsZWdhbCBjaGFycyAqLworCQl9CisJCSsrcDsKKwkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJKnErKyA9ICpwKys7CisJfQorICAgIH0KKworICAgIGlmIChlbmRwICE9IE5VTEwpCisJKmVuZHAgPSBwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBTS0lQX1NUT1AgMgorI2RlZmluZSBzdHJlcShhLGIpIChzdHJjbXAoYSxiKSA9PSAwKQorc3RhdGljIGludCBuZWVkdXBkYXRlID0gMDsKK3N0YXRpYyBpbnQgaW5BdG9taWMgPSAwOworCisvKgorICogRG8gdGhlIGFjdHVhbCBwcm9jZXNzaW5nIG9mIGEgc2luZ2xlIG5ldGJlYW5zIGNvbW1hbmQgb3IgZnVuY3Rpb24uCisgKiBUaGUgZGlmZmVyYW5jZSBiZXR3ZWVuIGEgY29tbWFuZCBhbmQgZnVuY3Rpb24gaXMgdGhhdCBhIGZ1bmN0aW9uCisgKiBnZXRzIGEgcmVzcG9uc2UgKGl0cyByZXF1aXJlZCkgYnV0IGEgY29tbWFuZCBkb2VzIG5vdC4KKyAqIEZvciBhcmd1bWVudHMgc2VlIGNvbW1lbnQgZm9yIG5iX3BhcnNlX2NtZCgpLgorICovCisgICAgc3RhdGljIGludAorbmJfZG9fY21kKAorICAgIGludAkJYnVmbm8sCisgICAgY2hhcl91CSpjbWQsCisgICAgaW50CQlmdW5jLAorICAgIGludAkJY21kbm8sCisgICAgY2hhcl91CSphcmdzKQkgICAgLyogcG9pbnRzIHRvIHNwYWNlIGJlZm9yZSBhcmd1bWVudHMgb3IgTlVMICovCit7CisgICAgaW50CQlkb3VwZGF0ZSA9IDA7CisgICAgbG9uZwlvZmYgPSAwOworICAgIG5iYnVmX1QJKmJ1ZiA9IG5iX2dldF9idWYoYnVmbm8pOworICAgIHN0YXRpYyBpbnQJc2tpcCA9IDA7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKworICAgIG5iZGVidWcoKCIlcyAlZDogKCVkKSAlcyAlc1xuIiwgKGZ1bmMpID8gIkZVTiIgOiAiQ01EIiwgY21kbm8sIGJ1Zm5vLCBjbWQsCisJU1RSQ01QKGNtZCwgImluc2VydCIpID09IDAgPyAiPHRleHQ+IiA6IChjaGFyICopYXJncykpOworCisgICAgaWYgKGZ1bmMpCisgICAgeworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwlpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJnZXRNb2RpZmllZCIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IGJ1Zi0+YnVmcCA9PSBOVUxMKQorCQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYXJlIG1vZGlmaWVkLiAqLworCQluYl9yZXBseV9ucihjbWRubywgKGxvbmcpY291bnRfY2hhbmdlZF9idWZmZXJzKCkpOworCSAgICBlbHNlCisJCS8qIFJldHVybiB3aGV0aGVyIHRoZSBidWZmZXIgaXMgbW9kaWZpZWQuICovCisJCW5iX3JlcGx5X25yKGNtZG5vLCAobG9uZykoYnVmLT5idWZwLT5iX2NoYW5nZWQKKwkJCQkJICAgfHwgaXNOZXRiZWFuc01vZGlmaWVkKGJ1Zi0+YnVmcCkpKTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAic2F2ZUFuZEV4aXQiKSkKKwl7CisJICAgIC8qIE5vdGU6IHRoaXMgd2lsbCBleGl0IFZpbSBpZiBzdWNjZXNzZnVsLiAqLworCSAgICBjb2xvbmNtZCgiOmNvbmZpcm0gcWFsbCIpOworCisJICAgIC8qIFdlIGRpZG4ndCBleGl0OiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFuZ2VkIGJ1ZmZlcnMuICovCisJICAgIG5iX3JlcGx5X25yKGNtZG5vLCAobG9uZyljb3VudF9jaGFuZ2VkX2J1ZmZlcnMoKSk7CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgImdldEN1cnNvciIpKQorCXsKKwkgICAgY2hhcl91IHRleHRbMjAwXTsKKworCSAgICAvKiBOb3RlOiBuYl9nZXRidWZubygpIG1heSByZXR1cm4gLTEuICBUaGlzIGluZGljYXRlcyB0aGUgSURFCisJICAgICAqIGRpZG4ndCBhc3NpZ24gYSBudW1iZXIgdG8gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHJlc3BvbnNlIHRvIGEKKwkgICAgICogZmlsZU9wZW5lZCBldmVudC4gKi8KKwkgICAgc3ByaW50ZigoY2hhciAqKXRleHQsICIlZCAlbGQgJWQgJWxkIiwKKwkJICAgIG5iX2dldGJ1Zm5vKGN1cmJ1ZiksCisJCSAgICAobG9uZyljdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCSAgICAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sLAorCQkgICAgcG9zMm9mZihjdXJidWYsICZjdXJ3aW4tPndfY3Vyc29yKSk7CisJICAgIG5iX3JlcGx5X3RleHQoY21kbm8sIHRleHQpOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJnZXRMZW5ndGgiKSkKKwl7CisJICAgIGxvbmcgbGVuID0gMDsKKworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBudWxsIGJ1ZnAgaW4gZ2V0TGVuZ3RoIikpOworCQlFTVNHKCJFNjMyOiBudWxsIGJ1ZnAgaW4gZ2V0TGVuZ3RoIik7CisJCXJldHZhbCA9IEZBSUw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWxlbiA9IGdldF9idWZfc2l6ZShidWYtPmJ1ZnApOworCQkvKiBhZGp1c3QgZm9yIGEgcGFydGlhbCBsYXN0IGxpbmUgKi8KKwkJaWYgKGJ1Zi0+cGFydGlhbF9saW5lICE9IE5VTEwpCisJCXsKKwkJICAgIG5iZGVidWcoKCIgICAgQWRqdXN0aW5nIGJ1ZmZlciBsZW4gZm9yIHBhcnRpYWwgbGFzdCBsaW5lOiAlZFxuIiwKKwkJCQlTVFJMRU4oYnVmLT5wYXJ0aWFsX2xpbmUpKSk7CisJCSAgICBsZW4gKz0gU1RSTEVOKGJ1Zi0+cGFydGlhbF9saW5lKTsKKwkJfQorCSAgICB9CisJICAgIG5iX3JlcGx5X25yKGNtZG5vLCBsZW4pOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJnZXRUZXh0IikpCisJeworCSAgICBsb25nCWxlbjsKKwkgICAgbGluZW5yX1QJbmxpbmVzOworCSAgICBjaGFyX3UJKnRleHQgPSBOVUxMOworCSAgICBsaW5lbnJfVAlsbm8gPSAxOworCSAgICBjaGFyX3UJKnA7CisJICAgIGNoYXJfdQkqbGluZTsKKworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBudWxsIGJ1ZnAgaW4gZ2V0VGV4dCIpKTsKKwkJRU1TRygiRTYzMzogbnVsbCBidWZwIGluIGdldFRleHQiKTsKKwkJcmV0dmFsID0gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJbGVuID0gZ2V0X2J1Zl9zaXplKGJ1Zi0+YnVmcCk7CisJCW5saW5lcyA9IGJ1Zi0+YnVmcC0+Yl9tbC5tbF9saW5lX2NvdW50OworCQl0ZXh0ID0gYWxsb2MoKHVuc2lnbmVkKSgobGVuID4gMCkKKwkJCQkJCSA/ICgobGVuICsgbmxpbmVzKSAqIDIpIDogNCkpOworCQlpZiAodGV4dCA9PSBOVUxMKQorCQl7CisJCSAgICBuYmRlYnVnKCgiICAgIG5iX2RvX2NtZDogZ2V0VGV4dCBoYXMgbnVsbCB0ZXh0IGZpZWxkXG4iKSk7CisJCSAgICByZXR2YWwgPSBGQUlMOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgcCA9IHRleHQ7CisJCSAgICAqcCsrID0gJ1wiJzsKKwkJICAgIGZvciAoOyBsbm8gPD0gbmxpbmVzIDsgbG5vKyspCisJCSAgICB7CisJCQlsaW5lID0gbmJfcXVvdGUobWxfZ2V0X2J1ZihidWYtPmJ1ZnAsIGxubywgRkFMU0UpKTsKKwkJCWlmIChsaW5lICE9IE5VTEwpCisJCQl7CisJCQkgICAgU1RSQ1BZKHAsIGxpbmUpOworCQkJICAgIHAgKz0gU1RSTEVOKGxpbmUpOworCQkJICAgICpwKysgPSAnXFwnOworCQkJICAgICpwKysgPSAnbic7CisJCQl9CisJCQl2aW1fZnJlZShsaW5lKTsKKwkJICAgIH0KKwkJICAgICpwKysgPSAnXCInOworCQkgICAgKnAgPSAnXDAnOworCQl9CisJICAgIH0KKwkgICAgaWYgKHRleHQgPT0gTlVMTCkKKwkJbmJfcmVwbHlfdGV4dChjbWRubywgKGNoYXJfdSAqKSIiKTsKKwkgICAgZWxzZQorCSAgICB7CisJCW5iX3JlcGx5X3RleHQoY21kbm8sIHRleHQpOworCQl2aW1fZnJlZSh0ZXh0KTsKKwkgICAgfQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJyZW1vdmUiKSkKKwl7CisJICAgIGxvbmcgY291bnQ7CisJICAgIHBvc19UIGZpcnN0LCBsYXN0OworCSAgICBwb3NfVCAqcG9zOworCSAgICBpbnQgb2xkRmlyZSA9IG5ldGJlYW5zRmlyZUNoYW5nZXM7CisJICAgIGludCBvbGRTdXBwcmVzcyA9IG5ldGJlYW5zU3VwcHJlc3NOb0xpbmVzOworCSAgICBpbnQgd2FzQ2hhbmdlZDsKKworCSAgICBpZiAoc2tpcCA+PSBTS0lQX1NUT1ApCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBTa2lwcGluZyAlcyBjb21tYW5kXG4iLCAoY2hhciAqKSBjbWQpKTsKKwkJbmJfcmVwbHlfbmlsKGNtZG5vKTsKKwkJcmV0dXJuIE9LOworCSAgICB9CisKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IGJ1Zi0+YnVmcCA9PSBOVUxMKQorCSAgICB7CisJCW5iZGVidWcoKCIgICAgbnVsbCBidWZwIGluIHJlbW92ZSIpKTsKKwkJRU1TRygiRTYzNDogbnVsbCBidWZwIGluIHJlbW92ZSIpOworCQlyZXR2YWwgPSBGQUlMOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQluZXRiZWFuc0ZpcmVDaGFuZ2VzID0gRkFMU0U7CisJCW5ldGJlYW5zU3VwcHJlc3NOb0xpbmVzID0gVFJVRTsKKworCQlpZiAoY3VyYnVmICE9IGJ1Zi0+YnVmcCkKKwkJICAgIHNldF9jdXJidWYoYnVmLT5idWZwLCBET0JVRl9HT1RPKTsKKwkJd2FzQ2hhbmdlZCA9IGJ1Zi0+YnVmcC0+Yl9jaGFuZ2VkOworCQlvZmYgPSBzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworCQljb3VudCA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIChjaGFyICoqKSZhcmdzLCAxMCk7CisJCS8qIGRlbGV0ZSAiY291bnQiIGNoYXJzLCBzdGFydGluZyBhdCAib2ZmIiAqLworCQlwb3MgPSBvZmYycG9zKGJ1Zi0+YnVmcCwgb2ZmKTsKKwkJaWYgKCFwb3MpCisJCXsKKwkJICAgIG5iX3JlcGx5X3RleHQoY21kbm8sIChjaGFyX3UgKikiIWJhZCBwb3NpdGlvbiIpOworCQkgICAgbmV0YmVhbnNGaXJlQ2hhbmdlcyA9IG9sZEZpcmU7CisJCSAgICBuZXRiZWFuc1N1cHByZXNzTm9MaW5lcyA9IG9sZFN1cHByZXNzOworCQkgICAgcmV0dXJuIEZBSUw7CisJCX0KKwkJZmlyc3QgPSAqcG9zOworCQluYmRlYnVnKCgiICAgIEZJUlNUIFBPUzogbGluZSAlZCwgY29sICVkXG4iLCBmaXJzdC5sbnVtLCBmaXJzdC5jb2wpKTsKKwkJcG9zID0gb2ZmMnBvcyhidWYtPmJ1ZnAsIG9mZitjb3VudC0xKTsKKwkJaWYgKCFwb3MpCisJCXsKKwkJICAgIG5iX3JlcGx5X3RleHQoY21kbm8sIChjaGFyX3UgKikiIWJhZCBjb3VudCIpOworCQkgICAgbmV0YmVhbnNGaXJlQ2hhbmdlcyA9IG9sZEZpcmU7CisJCSAgICBuZXRiZWFuc1N1cHByZXNzTm9MaW5lcyA9IG9sZFN1cHByZXNzOworCQkgICAgcmV0dXJuIEZBSUw7CisJCX0KKwkJbGFzdCA9ICpwb3M7CisJCW5iZGVidWcoKCIgICAgTEFTVCBQT1M6IGxpbmUgJWQsIGNvbCAlZFxuIiwgbGFzdC5sbnVtLCBsYXN0LmNvbCkpOworCQljdXJ3aW4tPndfY3Vyc29yID0gZmlyc3Q7CisJCWRvdXBkYXRlID0gMTsKKworCQkvKiBrZWVwIHBhcnQgb2YgZmlyc3QgbGluZSAqLworCQlpZiAoZmlyc3QubG51bSA9PSBsYXN0LmxudW0gJiYgZmlyc3QuY29sICE9IGxhc3QuY29sKQorCQl7CisJCSAgICAvKiBkZWxldGlvbiBpcyB3aXRoaW4gb25lIGxpbmUgKi8KKwkJICAgIGNoYXJfdSAqcCA9IG1sX2dldChmaXJzdC5sbnVtKTsKKwkJICAgIG1jaF9tZW1tb3ZlKHAgKyBmaXJzdC5jb2wsIHAgKyBsYXN0LmNvbCArIDEsIFNUUkxFTihwICsgbGFzdC5jb2wpICsgMSk7CisJCSAgICBuYmRlYnVnKCgiICAgIE5FVyBMSU5FICVkOiAlc1xuIiwgZmlyc3QubG51bSwgcCkpOworCQkgICAgbWxfcmVwbGFjZShmaXJzdC5sbnVtLCBwLCBUUlVFKTsKKwkJfQorCisJCWlmIChmaXJzdC5sbnVtIDwgbGFzdC5sbnVtKQorCQl7CisJCSAgICBpbnQgaTsKKworCQkgICAgLyogZGVsZXRlIHNpZ25zIGZyb20gdGhlIGxpbmVzIGJlaW5nIGRlbGV0ZWQgKi8KKwkJICAgIGZvciAoaSA9IGZpcnN0LmxudW07IGkgPD0gbGFzdC5sbnVtOyBpKyspCisJCSAgICB7CisJCQlpbnQgaWQgPSBidWZfZmluZHNpZ25faWQoYnVmLT5idWZwLCAobGluZW5yX1QpaSk7CisJCQlpZiAoaWQgPiAwKQorCQkJeworCQkJICAgIG5iZGVidWcoKCIgICAgRGVsZXRpbmcgc2lnbiAlZCBvbiBsaW5lICVkXG4iLCBpZCwgaSkpOworCQkJICAgIGJ1Zl9kZWxzaWduKGJ1Zi0+YnVmcCwgaWQpOworCQkJfQorCQkJZWxzZQorCQkJICAgIG5iZGVidWcoKCIgICAgTm8gc2lnbiBvbiBsaW5lICVkXG4iLCBpKSk7CisJCSAgICB9CisKKwkJICAgIC8qIGRlbGV0ZSB3aG9sZSBsaW5lcyAqLworCQkgICAgbmJkZWJ1ZygoIiAgICBEZWxldGluZyBsaW5lcyAlZCB0aHJvdWdoICVkXG4iLCBmaXJzdC5sbnVtLCBsYXN0LmxudW0pKTsKKwkJICAgIGRlbF9saW5lcyhsYXN0LmxudW0gLSBmaXJzdC5sbnVtICsgMSwgRkFMU0UpOworCQl9CisJCWJ1Zi0+YnVmcC0+Yl9jaGFuZ2VkID0gd2FzQ2hhbmdlZDsgLyogbG9naWNhbGx5IHVuY2hhbmdlZCAqLworCQluZXRiZWFuc0ZpcmVDaGFuZ2VzID0gb2xkRmlyZTsKKwkJbmV0YmVhbnNTdXBwcmVzc05vTGluZXMgPSBvbGRTdXBwcmVzczsKKworCQl1X2Jsb2NrZnJlZShidWYtPmJ1ZnApOworCQl1X2NsZWFyYWxsKGJ1Zi0+YnVmcCk7CisJICAgIH0KKwkgICAgbmJfcmVwbHlfbmlsKGNtZG5vKTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAiaW5zZXJ0IikpCisJeworCSAgICBwb3NfVAkqcG9zOworCSAgICBwb3NfVAlteXBvczsKKwkgICAgY2hhcl91CSp0b19mcmVlOworCSAgICBjaGFyX3UJKm5sOworCSAgICBpbnQJCWxudW07CisJICAgIHBvc19UCW9sZF93X2N1cnNvcjsKKwkgICAgaW50CQlvbGRfYl9jaGFuZ2VkOworCisJICAgIGlmIChza2lwID49IFNLSVBfU1RPUCkKKwkgICAgeworCQluYmRlYnVnKCgiICAgIFNraXBwaW5nICVzIGNvbW1hbmRcbiIsIChjaGFyICopIGNtZCkpOworCQluYl9yZXBseV9uaWwoY21kbm8pOworCQlyZXR1cm4gT0s7CisJICAgIH0KKworCSAgICAvKiBnZXQgb2Zmc2V0ICovCisJICAgIG9mZiA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIChjaGFyICoqKSZhcmdzLCAxMCk7CisKKwkgICAgLyogZ2V0IHRleHQgdG8gYmUgaW5zZXJ0ZWQgKi8KKwkgICAgYXJncyA9IHNraXB3aGl0ZShhcmdzKTsKKwkgICAgYXJncyA9IHRvX2ZyZWUgPSAoY2hhcl91ICopbmJfdW5xdW90ZShhcmdzLCBOVUxMKTsKKworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBudWxsIGJ1ZnAgaW4gaW5zZXJ0IikpOworCQlFTVNHKCJFNjM1OiBudWxsIGJ1ZnAgaW4gaW5zZXJ0Iik7CisJCXJldHZhbCA9IEZBSUw7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYXJncyAhPSBOVUxMKQorCSAgICB7CisJCS8qIFdlIG5lZWQgdG8gZGV0ZWN0IEVPTCBzdHlsZQorCQkgKiBiZWNhdXNlIGFkZEFubm8gcGFzc2VzIGNoYXItb2Zmc2V0CisJCSAqLworCQlpbnQgICAgZmZfZGV0ZWN0ZWQgPSBFT0xfVU5LTk9XTjsKKwkJaW50ICAgIGJ1Zl93YXNfZW1wdHkgPSAoYnVmLT5idWZwLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpOworCisJCW9sZEZpcmUgPSBuZXRiZWFuc0ZpcmVDaGFuZ2VzOworCQluZXRiZWFuc0ZpcmVDaGFuZ2VzID0gMDsKKworCQlpZiAoY3VyYnVmICE9IGJ1Zi0+YnVmcCkKKwkJICAgIHNldF9jdXJidWYoYnVmLT5idWZwLCBET0JVRl9HT1RPKTsKKwkJb2xkX2JfY2hhbmdlZCA9IGJ1Zi0+YnVmcC0+Yl9jaGFuZ2VkOworCisJCWlmIChidWYtPnBhcnRpYWxfbGluZSAhPSBOVUxMKQorCQl7CisJCSAgICBuYmRlYnVnKCgiICAgIENvbWJpbmluZyB3aXRoIHBhcnRpYWwgbGluZVxuIikpOworCQkgICAgb2ZmIC09IFNUUkxFTihidWYtPnBhcnRpYWxfbGluZSk7CisJCSAgICBwb3MgPSBvZmYycG9zKGJ1Zi0+YnVmcCwgb2ZmKTsKKwkJICAgIGlmIChwb3MgJiYgcG9zLT5jb2wgIT0gMCkKKwkJCW9mZiAtPSBwb3MtPmNvbDsgIC8qIHdhbnQgc3RhcnQgb2YgbGluZSAqLworCQkgICAgYnVmLT5wYXJ0aWFsX2xpbmUgPSB2aW1fcmVhbGxvYyhidWYtPnBhcnRpYWxfbGluZSwKKwkJCQlTVFJMRU4oYnVmLT5wYXJ0aWFsX2xpbmUpICsgU1RSTEVOKGFyZ3MpICsgMSk7CisJCSAgICBTVFJDQVQoYnVmLT5wYXJ0aWFsX2xpbmUsIGFyZ3MpOworCQkgICAgdmltX2ZyZWUodG9fZnJlZSk7CisJCSAgICBhcmdzID0gYnVmLT5wYXJ0aWFsX2xpbmU7CisJCSAgICBidWYtPnBhcnRpYWxfbGluZSA9IE5VTEw7CisJCSAgICB0b19mcmVlID0gYXJnczsKKwkJfQorCQlwb3MgPSBvZmYycG9zKGJ1Zi0+YnVmcCwgb2ZmKTsKKwkJaWYgKHBvcykKKwkJeworCQkgICAgaWYgKHBvcy0+bG51bSA9PSAwKQorCQkJcG9zLT5sbnVtID0gMTsKKwkJICAgIG5iZGVidWcoKCIgICAgUE9TSVRJT046IGxpbmUgPSAlZCwgY29sID0gJWRcbiIsCisJCQkJCQkJcG9zLT5sbnVtLCBwb3MtPmNvbCkpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogaWYgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCwgYXNzdW1lIHdlIHdhbnQKKwkJICAgICAqIHRoZSBlbmQgb2YgdGhlIGZpbGUuICBTZWUgc2V0TG9jQW5kU2l6ZSBIQUNLLiAqLworCQkgICAgcG9zID0gJm15cG9zOworCQkgICAgcG9zLT5jb2wgPSAwOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJICAgIHBvcy0+Y29sYWRkID0gMDsKKyNlbmRpZgorCQkgICAgcG9zLT5sbnVtID0gYnVmLT5idWZwLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCSAgICBuYmRlYnVnKCgiICAgIFBPU0lUSU9OOiBsaW5lID0gJWQgKEVPRilcbiIsIHBvcy0+bG51bSkpOworCQl9CisJCWxudW0gPSBwb3MtPmxudW07CisJCW9sZF93X2N1cnNvciA9IGN1cndpbi0+d19jdXJzb3I7CisJCWN1cndpbi0+d19jdXJzb3IgPSAqcG9zOworCisJCWRvdXBkYXRlID0gMTsKKwkJd2hpbGUgKCphcmdzKQorCQl7CisJCSAgICBubCA9IChjaGFyX3UgKilzdHJjaHIoKGNoYXIgKilhcmdzLCAnXG4nKTsKKwkJICAgIGlmICghbmwpCisJCSAgICB7CisJCQluYmRlYnVnKCgiICAgIFBBUlRJQUxbJWRdOiAlc1xuIiwgbG51bSwgYXJncykpOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICAvKiBFT0wgZGV0ZWN0aW5nLgorCQkgICAgICogTm90IHN1cmUgaG93IHRvIGRlYWwgd2l0aCAnXG4nIG9uIE1hYworCQkgICAgICogaXQgd2lsbCBmYWlsIGFscmVhZHkgaW4gbmwgPSAuLi4gYWJvdmUKKwkJICAgICAqLworCQkgICAgaWYgKGJ1Zl93YXNfZW1wdHkgJiYgLyogVGhlcmUgaXMgbmVlZCB0byBkZXRlY3QgRU9McyAqLworCQkJICAgIC8qIEFORDogc3RyaW5nIGlzIGVtcHR5ICovCisJCQkgICAgKGFyZ3MgPT0gbmwKKwkJCSAgICAgLyogT1IgaGFzbid0ICdccicgYXQgdGhlIGVuZCAqLworCQkJICAgIHx8ICoobmwgLSAxKSAhPSAnXHInKSkKKwkJCWZmX2RldGVjdGVkID0gRU9MX1VOSVg7CisKKwkJICAgICpubCA9ICdcMCc7CisJCSAgICBuYmRlYnVnKCgiICAgIElOU0VSVFslZF06ICVzXG4iLCBsbnVtLCBhcmdzKSk7CisJCSAgICBtbF9hcHBlbmQoKGxpbmVucl9UKShsbnVtKysgLSAxKSwgYXJncywKKwkJCQkJCSAgICAgU1RSTEVOKGFyZ3MpICsgMSwgRkFMU0UpOworCQkgICAgYXJncyA9IG5sICsgMTsKKwkJfQorCisJCWFwcGVuZGVkX2xpbmVzX21hcmsocG9zLT5sbnVtIC0gMSwgbG51bSAtIHBvcy0+bG51bSk7CisKKwkJLyogV2UgY2FuIGNoYW5nZSBpbml0aWFsIGZmIHdpdGhvdXQgY29uc2VxdWVuY2VzCisJCSAqIElzbid0IGl0IGEga2luZCBvZiBoYWNraW5nPworCQkgKi8KKwkJaWYgKGJ1Zl93YXNfZW1wdHkpCisJCXsKKwkJICAgIGlmIChmZl9kZXRlY3RlZCA9PSBFT0xfVU5LTk9XTikKKwkJCWZmX2RldGVjdGVkID0gRU9MX0RPUzsKKwkJICAgIHNldF9maWxlZm9ybWF0KGZmX2RldGVjdGVkLCBPUFRfTE9DQUwpOworCQkgICAgYnVmLT5idWZwLT5iX3N0YXJ0X2ZmYyA9ICpidWYtPmJ1ZnAtPmJfcF9mZjsKKwkJfQorCisJCWlmICgqYXJncykKKwkJeworCQkgICAgLyoKKwkJICAgICAqIEluY29tcGxldGUgbGluZSwgc3F1aXJyZWwgYXdheSBhbmQgd2FpdCBmb3IgbmV4dCBpbnNlcnQuCisJCSAgICAgKi8KKwkJICAgIG5iZGVidWcoKCIgICAgUEFSVElBTC1TQVZFRDogJXNcbiIsIGFyZ3MpKTsKKwkJICAgIGJ1Zi0+cGFydGlhbF9saW5lID0gdmltX3JlYWxsb2MoYnVmLT5wYXJ0aWFsX2xpbmUsCisJCQkJCQkJICAgIFNUUkxFTihhcmdzKSArIDEpOworCQkgICAgU1RSQ1BZKGJ1Zi0+cGFydGlhbF9saW5lLCBhcmdzKTsKKwkJfQorCQljdXJ3aW4tPndfY3Vyc29yID0gb2xkX3dfY3Vyc29yOworCisJCS8qCisJCSAqIFhYWCAtIEdSUCAtIElzIHRoZSBuZXh0IGxpbmUgcmlnaHQ/IElmIEkndmUgaW5zZXJ0ZWQKKwkJICogdGV4dCB0aGUgYnVmZmVyIGhhcyBiZWVuIHVwZGF0ZWQgYnV0IG5vdCB3cml0dGVuLiBXaWxsCisJCSAqIG5ldGJlYW5zIGd1YXJhbnRlZSB0byB3cml0ZSBpdD8gRXZlbiBpZiBJIGRvIGEgOnEhID8KKwkJICovCisJCWJ1Zi0+YnVmcC0+Yl9jaGFuZ2VkID0gb2xkX2JfY2hhbmdlZDsgLyogbG9naWNhbGx5IHVuY2hhbmdlZCAqLworCQluZXRiZWFuc0ZpcmVDaGFuZ2VzID0gb2xkRmlyZTsKKworCQl1X2Jsb2NrZnJlZShidWYtPmJ1ZnApOworCQl1X2NsZWFyYWxsKGJ1Zi0+YnVmcCk7CisJICAgIH0KKwkgICAgdmltX2ZyZWUodG9fZnJlZSk7CisJICAgIG5iX3JlcGx5X25pbChjbWRubyk7IC8qIG9yICFlcnJvciAqLworCX0KKwllbHNlCisJeworCSAgICBuYmRlYnVnKCgiVU5JTVBMRU1FTlRFRCBGVU5DVElPTjogJXNcbiIsIGNtZCkpOworCSAgICBuYl9yZXBseV9uaWwoY21kbm8pOworCSAgICByZXR2YWwgPSBGQUlMOworCX0KKyAgICB9CisgICAgZWxzZSAvKiBOb3QgYSBmdW5jdGlvbjsgbm8gcmVwbHkgcmVxdWlyZWQuICovCisgICAgeworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwlpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJjcmVhdGUiKSkKKwl7CisJICAgIC8qIENyZWF0ZSBhIGJ1ZmZlciB3aXRob3V0IGEgbmFtZS4gKi8KKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2MzY6IG51bGwgYnVmIGluIGNyZWF0ZSIpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICB2aW1fZnJlZShidWYtPmRpc3BsYXluYW1lKTsKKwkgICAgYnVmLT5kaXNwbGF5bmFtZSA9IE5VTEw7CisJICAgIG5iZGVidWcoKCIgICAgQ1JFQVRFICVkXG4iLCBidWZubykpOworCisJICAgIG5ldGJlYW5zUmVhZEZpbGUgPSAwOyAvKiBkb24ndCB0cnkgdG8gb3BlbiBkaXNrIGZpbGUgKi8KKwkgICAgZG9fZWNtZCgwLCBOVUxMLCAwLCAwLCBFQ01EX09ORSwgRUNNRF9ISURFICsgRUNNRF9PTERCVUYpOworCSAgICBuZXRiZWFuc1JlYWRGaWxlID0gMTsKKwkgICAgYnVmLT5idWZwID0gY3VyYnVmOworCSAgICBtYWtldGl0bGUoKTsKKwkgICAgZ3VpX3VwZGF0ZV9tZW51cygwKTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAic3RhcnREb2N1bWVudExpc3RlbiIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2Mzc6IG51bGwgYnVmIGluIHN0YXJ0RG9jdW1lbnRMaXN0ZW4iKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgYnVmLT5maXJlQ2hhbmdlcyA9IDE7CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgInN0b3BEb2N1bWVudExpc3RlbiIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2Mzg6IG51bGwgYnVmIGluIHN0b3BEb2N1bWVudExpc3RlbiIpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBidWYtPmZpcmVDaGFuZ2VzID0gMDsKKwkgICAgaWYgKGJ1Zi0+YnVmcCAhPSBOVUxMCisJCSAgICAmJiBidWYtPmJ1ZnAtPmJfd2FzX25ldGJlYW5zX2ZpbGUKKwkJICAgICYmICFidWYtPmJ1ZnAtPmJfbmV0YmVhbnNfZmlsZSkKKwkJRU1TR04oXygiRTY1ODogTmV0QmVhbnMgY29ubmVjdGlvbiBsb3N0IGZvciBidWZmZXIgJWxkIiksCisJCQkJCQkJICAgYnVmLT5idWZwLT5iX2ZudW0pOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXRUaXRsZSIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2Mzk6IG51bGwgYnVmIGluIHNldFRpdGxlIik7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIHZpbV9mcmVlKGJ1Zi0+ZGlzcGxheW5hbWUpOworCSAgICBidWYtPmRpc3BsYXluYW1lID0gbmJfdW5xdW90ZShhcmdzLCBOVUxMKTsKKwkgICAgbmJkZWJ1ZygoIiAgICBTRVRUSVRMRSAlZCAlc1xuIiwgYnVmbm8sIGJ1Zi0+ZGlzcGxheW5hbWUpKTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAiaW5pdERvbmUiKSkKKwl7CisJICAgIGlmIChidWYgPT0gTlVMTCB8fCBidWYtPmJ1ZnAgPT0gTlVMTCkKKwkgICAgeworCQlFTVNHKCJFNjQwOiBudWxsIGJ1ZiBpbiBpbml0RG9uZSIpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBkb3VwZGF0ZSA9IDE7CisJICAgIGJ1Zi0+aW5pdERvbmUgPSAxOworCSAgICBpZiAoY3VyYnVmICE9IGJ1Zi0+YnVmcCkKKwkJc2V0X2N1cmJ1ZihidWYtPmJ1ZnAsIERPQlVGX0dPVE8pOworI2lmIGRlZmluZWQoRkVBVF9BVVRPQ01EKQorCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZSRUFEUE9TVCwgMCwgMCwgRkFMU0UsIGJ1Zi0+YnVmcCk7CisjZW5kaWYKKworCSAgICAvKiBoYW5kbGUgYW55IHBvc3Rwb25lZCBrZXkgY29tbWFuZHMgKi8KKwkgICAgaGFuZGxlX2tleV9xdWV1ZSgpOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXRCdWZmZXJOdW1iZXIiKQorCQl8fCBzdHJlcSgoY2hhciAqKWNtZCwgInB1dEJ1ZmZlck51bWJlciIpKQorCXsKKwkgICAgY2hhcl91CSp0b19mcmVlOworCSAgICBidWZfVAkqYnVmcDsKKworCSAgICBpZiAoYnVmID09IE5VTEwpCisJICAgIHsKKwkJRU1TRygiRTY0MTogbnVsbCBidWYgaW4gc2V0QnVmZmVyTnVtYmVyIik7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIHRvX2ZyZWUgPSAoY2hhcl91ICopbmJfdW5xdW90ZShhcmdzLCBOVUxMKTsKKwkgICAgaWYgKHRvX2ZyZWUgPT0gTlVMTCkKKwkJcmV0dXJuIEZBSUw7CisJICAgIGJ1ZnAgPSBidWZsaXN0X2ZpbmRuYW1lKHRvX2ZyZWUpOworCSAgICB2aW1fZnJlZSh0b19mcmVlKTsKKwkgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKKwkgICAgeworCQlFTVNHMigiRTY0MjogRmlsZSAlcyBub3QgZm91bmQgaW4gc2V0QnVmZmVyTnVtYmVyIiwgYXJncyk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGJ1Zi0+YnVmcCA9IGJ1ZnA7CisKKwkgICAgLyogInNldEJ1ZmZlck51bWJlciIgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBqdW1waW5nIHRvIHRoZSBidWZmZXIKKwkgICAgICogKGRvbid0IGtub3cgd2h5ISkuICBEb24ndCBkbyB0aGF0IGZvciAicHV0QnVmZmVyTnVtYmVyIi4gKi8KKwkgICAgaWYgKCpjbWQgIT0gJ3AnKQorCQljb2xvbmNtZCgiOmJ1ZmZlciAlZCIsIGJ1ZnAtPmJfZm51bSk7CisJICAgIGVsc2UKKwkgICAgeworCQlidWYtPmluaXREb25lID0gMTsKKworCQkvKiBoYW5kbGUgYW55IHBvc3Rwb25lZCBrZXkgY29tbWFuZHMgKi8KKwkJaGFuZGxlX2tleV9xdWV1ZSgpOworCSAgICB9CisKKyNpZiAwICAvKiBuZXZlciB1c2VkICovCisJICAgIGJ1Zi0+aW50ZXJuYWxuYW1lID0gKGNoYXIgKilhbGxvY19jbGVhcig4KTsKKwkgICAgc3ByaW50ZihidWYtPmludGVybmFsbmFtZSwgIjwlZD4iLCBidWZubyk7CisJICAgIGJ1Zi0+bmV0YmVhbnNPd25zID0gMDsKKyNlbmRpZgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXRGdWxsTmFtZSIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2NDM6IG51bGwgYnVmIGluIHNldEZ1bGxOYW1lIik7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIHZpbV9mcmVlKGJ1Zi0+ZGlzcGxheW5hbWUpOworCSAgICBidWYtPmRpc3BsYXluYW1lID0gbmJfdW5xdW90ZShhcmdzLCBOVUxMKTsKKwkgICAgbmJkZWJ1ZygoIiAgICBTRVRGVUxMTkFNRSAlZCAlc1xuIiwgYnVmbm8sIGJ1Zi0+ZGlzcGxheW5hbWUpKTsKKworCSAgICBuZXRiZWFuc1JlYWRGaWxlID0gMDsgLyogZG9uJ3QgdHJ5IHRvIG9wZW4gZGlzayBmaWxlICovCisJICAgIGRvX2VjbWQoMCwgKGNoYXJfdSAqKWJ1Zi0+ZGlzcGxheW5hbWUsIDAsIDAsIEVDTURfT05FLAorCQkJCQkJICAgICBFQ01EX0hJREUgKyBFQ01EX09MREJVRik7CisJICAgIG5ldGJlYW5zUmVhZEZpbGUgPSAxOworCSAgICBidWYtPmJ1ZnAgPSBjdXJidWY7CisJICAgIG1ha2V0aXRsZSgpOworCSAgICBndWlfdXBkYXRlX21lbnVzKDApOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJlZGl0RmlsZSIpKQorCXsKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2NDQ6IG51bGwgYnVmIGluIGVkaXRGaWxlIik7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIC8qIEVkaXQgYSBmaWxlOiBsaWtlIGNyZWF0ZSArIHNldEZ1bGxOYW1lICsgcmVhZCB0aGUgZmlsZS4gKi8KKwkgICAgdmltX2ZyZWUoYnVmLT5kaXNwbGF5bmFtZSk7CisJICAgIGJ1Zi0+ZGlzcGxheW5hbWUgPSBuYl91bnF1b3RlKGFyZ3MsIE5VTEwpOworCSAgICBuYmRlYnVnKCgiICAgIEVESVRGSUxFICVkICVzXG4iLCBidWZubywgYnVmLT5kaXNwbGF5bmFtZSkpOworCSAgICBkb19lY21kKDAsIChjaGFyX3UgKilidWYtPmRpc3BsYXluYW1lLCBOVUxMLCBOVUxMLCBFQ01EX09ORSwKKwkJCQkJCSAgICAgRUNNRF9ISURFICsgRUNNRF9PTERCVUYpOworCSAgICBidWYtPmJ1ZnAgPSBjdXJidWY7CisJICAgIGJ1Zi0+aW5pdERvbmUgPSAxOworCSAgICBkb3VwZGF0ZSA9IDE7CisjaWYgZGVmaW5lZChGRUFUX1RJVExFKQorCSAgICBtYWtldGl0bGUoKTsKKyNlbmRpZgorCSAgICBndWlfdXBkYXRlX21lbnVzKDApOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXRWaXNpYmxlIikpCisJeworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKy8qCQlFTVNHKCJFNjQ1OiBudWxsIGJ1ZnAgaW4gc2V0VmlzaWJsZSIpOyAqLworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBpZiAoc3RyZXEoKGNoYXIgKilhcmdzLCAiVCIpKQorCSAgICB7CisJCWV4YXJnX1QgZXhhcmc7CisJCWV4YXJnLmNtZCA9IChjaGFyX3UgKikiZ290byI7CisJCWV4YXJnLmZvcmNlaXQgPSBGQUxTRTsKKwkJZ290b19idWZmZXIoJmV4YXJnLCBET0JVRl9GSVJTVCwgRk9SV0FSRCwgYnVmLT5idWZwLT5iX2ZudW0pOworCQlkb3VwZGF0ZSA9IDE7CisKKwkJLyogU2lkZSBlZmZlY3QhISEuICovCisJCWlmICghZ3VpLnN0YXJ0aW5nKQorCQkgICAgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBidXJ5IHRoZSBidWZmZXIgLSBub3QgeWV0ICovCisJICAgIH0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAicmFpc2UiKSkKKwl7CisJICAgIC8qIEJyaW5nIGd2aW0gdG8gdGhlIGZvcmVncm91bmQuICovCisJICAgIGlmICghZ3VpLnN0YXJ0aW5nKQorCQlndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCk7CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgInNldE1vZGlmaWVkIikpCisJeworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKy8qCQlFTVNHKCJFNjQ2OiBudWxsIGJ1ZnAgaW4gc2V0TW9kaWZpZWQiKTsgKi8KKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgaWYgKHN0cmVxKChjaGFyICopYXJncywgIlQiKSkKKwkJYnVmLT5idWZwLT5iX2NoYW5nZWQgPSAxOworCSAgICBlbHNlCisJICAgIHsKKwkJc3RydWN0IHN0YXQJc3Q7CisKKwkJLyogQXNzdW1lIE5ldEJlYW5zIHN0b3JlZCB0aGUgZmlsZS4gIFJlc2V0IHRoZSB0aW1lc3RhbXAgdG8KKwkJICogYXZvaWQgImZpbGUgY2hhbmdlZCIgd2FybmluZ3MuICovCisJCWlmIChidWYtPmJ1ZnAtPmJfZmZuYW1lICE9IE5VTEwKKwkJCSYmIG1jaF9zdGF0KChjaGFyICopYnVmLT5idWZwLT5iX2ZmbmFtZSwgJnN0KSA+PSAwKQorCQkgICAgYnVmX3N0b3JlX3RpbWUoYnVmLT5idWZwLCAmc3QsIGJ1Zi0+YnVmcC0+Yl9mZm5hbWUpOworCQlidWYtPmJ1ZnAtPmJfY2hhbmdlZCA9IDA7CisJICAgIH0KKwkgICAgYnVmLT5tb2RpZmllZCA9IGJ1Zi0+YnVmcC0+Yl9jaGFuZ2VkOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXRNYXJrIikpCisJeworCSAgICAvKiBub3QgeWV0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgInNob3dCYWxsb29uIikpCisJeworI2lmIGRlZmluZWQoRkVBVF9CRVZBTCkKKwkgICAgc3RhdGljIGNoYXIJKnRleHQgPSBOVUxMOworCisJICAgIC8qCisJICAgICAqIFNldCB1cCB0aGUgQmFsbG9vbiBFeHByZXNzaW9uIEV2YWx1YXRpb24gYXJlYS4KKwkgICAgICogSWdub3JlICdiYWxsb29uZXZhbCcgaGVyZS4KKwkgICAgICogVGhlIHRleHQgcG9pbnRlciBtdXN0IHJlbWFpbiB2YWxpZCBmb3IgYSB3aGlsZS4KKwkgICAgICovCisJICAgIGlmIChiYWxsb29uRXZhbCAhPSBOVUxMKQorCSAgICB7CisJCXZpbV9mcmVlKHRleHQpOworCQl0ZXh0ID0gbmJfdW5xdW90ZShhcmdzLCBOVUxMKTsKKwkJaWYgKHRleHQgIT0gTlVMTCkKKwkJICAgIGd1aV9tY2hfcG9zdF9iYWxsb29uKGJhbGxvb25FdmFsLCAoY2hhcl91ICopdGV4dCk7CisJICAgIH0KKyNlbmRpZgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzZXREb3QiKSkKKwl7CisJICAgIHBvc19UICpwb3M7CisjaWZkZWYgTkJERUJVRworCSAgICBjaGFyX3UgKnM7CisjZW5kaWYKKworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKwkJRU1TRygiRTY0NzogbnVsbCBidWZwIGluIHNldERvdCIpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCisJICAgIGlmIChjdXJidWYgIT0gYnVmLT5idWZwKQorCQlzZXRfY3VyYnVmKGJ1Zi0+YnVmcCwgRE9CVUZfR09UTyk7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgLyogRG9uJ3Qgd2FudCBWaXN1YWwgbW9kZSBub3cuICovCisJICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCQllbmRfdmlzdWFsX21vZGUoKTsKKyNlbmRpZgorI2lmZGVmIE5CREVCVUcKKwkgICAgcyA9IGFyZ3M7CisjZW5kaWYKKwkgICAgcG9zID0gZ2V0X29mZl9vcl9sbnVtKGJ1Zi0+YnVmcCwgJmFyZ3MpOworCSAgICBpZiAocG9zKQorCSAgICB7CisJCWN1cndpbi0+d19jdXJzb3IgPSAqcG9zOworCQljaGVja19jdXJzb3IoKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorCSAgICB9CisJICAgIGVsc2UKKwkJbmJkZWJ1ZygoIiAgICBCQUQgUE9TSVRJT04gaW4gc2V0RG90OiAlc1xuIiwgcykpOworCisJICAgIC8qIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsgKi8KKwkgICAgLyogdXBkYXRlX2N1cmJ1ZihOT1RfVkFMSUQpOyAqLworCSAgICB1cGRhdGVfdG9wbGluZSgpOwkJLyogc2Nyb2xsIHRvIHNob3cgdGhlIGxpbmUgKi8KKwkgICAgdXBkYXRlX3NjcmVlbihWQUxJRCk7CisJICAgIHNldGN1cnNvcigpOworCSAgICBvdXRfZmx1c2goKTsKKwkgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCSAgICBndWlfbWNoX2ZsdXNoKCk7CisJICAgIC8qIFF1aXQgYSBoaXQtcmV0dXJuIG9yIG1vcmUgcHJvbXB0LiAqLworCSAgICBpZiAoU3RhdGUgPT0gSElUUkVUVVJOIHx8IFN0YXRlID09IEFTS01PUkUpCisJICAgIHsKKwkJYWRkX3RvX2lucHV0X2J1ZigoY2hhcl91ICopIlwwMDMiLCAxKTsKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKwkJaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCQkgICAgZ3RrX21haW5fcXVpdCgpOworI2VuZGlmCisJICAgIH0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAiY2xvc2UiKSkKKwl7CisjaWZkZWYgTkJERUJVRworCSAgICBjaGFyICpuYW1lID0gIjxOT05FPiI7CisjZW5kaWYKKworCSAgICBpZiAoYnVmID09IE5VTEwpCisJICAgIHsKKwkJRU1TRygiRTY0ODogbnVsbCBidWYgaW4gY2xvc2UiKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKworI2lmZGVmIE5CREVCVUcKKwkgICAgaWYgKGJ1Zi0+ZGlzcGxheW5hbWUgIT0gTlVMTCkKKwkJbmFtZSA9IGJ1Zi0+ZGlzcGxheW5hbWU7CisjZW5kaWYKKy8qCSAgICBpZiAoYnVmLT5idWZwID09IE5VTEwpICovCisvKgkJRU1TRygiRTY0OTogbnVsbCBidWZwIGluIGNsb3NlIik7ICovCisJICAgIG5iZGVidWcoKCIgICAgQ0xPU0UgJWQ6ICVzXG4iLCBidWZubywgbmFtZSkpOworCSAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworCSAgICBpZiAoYnVmLT5idWZwICE9IE5VTEwpCisJCWRvX2J1ZmZlcihET0JVRl9XSVBFLCBET0JVRl9GSVJTVCwgRk9SV0FSRCwKKwkJCQkJCSAgICAgYnVmLT5idWZwLT5iX2ZudW0sIFRSVUUpOworCSAgICBkb3VwZGF0ZSA9IDE7CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgInNldFN0eWxlIikpIC8qIG9ic29sZXRlLi4uICovCisJeworCSAgICBuYmRlYnVnKCgiICAgIHNldFN0eWxlIGlzIG9ic29sZXRlISIpKTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAic2V0RXhpdERlbGF5IikpCisJeworCSAgICAvKiBOZXcgaW4gdmVyc2lvbiAyLjEuICovCisJICAgIGV4aXRfZGVsYXkgPSBzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJkZWZpbmVBbm5vVHlwZSIpKQorCXsKKyNpZmRlZiBGRUFUX1NJR05TCisJICAgIGludCB0eXBlTnVtOworCSAgICBjaGFyX3UgKnR5cGVOYW1lOworCSAgICBjaGFyX3UgKnRvb2x0aXA7CisJICAgIGNoYXJfdSAqcDsKKwkgICAgY2hhcl91ICpnbHlwaEZpbGU7CisJICAgIGludCB1c2VfZmcgPSAwOworCSAgICBpbnQgdXNlX2JnID0gMDsKKwkgICAgaW50IGZnID0gLTE7CisJICAgIGludCBiZyA9IC0xOworCisJICAgIGlmIChidWYgPT0gTlVMTCkKKwkgICAgeworCQlFTVNHKCJFNjUwOiBudWxsIGJ1ZiBpbiBkZWZpbmVBbm5vVHlwZSIpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCisJICAgIHR5cGVOdW0gPSBzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworCSAgICBhcmdzID0gc2tpcHdoaXRlKGFyZ3MpOworCSAgICB0eXBlTmFtZSA9IChjaGFyX3UgKiluYl91bnF1b3RlKGFyZ3MsICZhcmdzKTsKKwkgICAgYXJncyA9IHNraXB3aGl0ZShhcmdzICsgMSk7CisJICAgIHRvb2x0aXAgPSAoY2hhcl91ICopbmJfdW5xdW90ZShhcmdzLCAmYXJncyk7CisJICAgIGFyZ3MgPSBza2lwd2hpdGUoYXJncyArIDEpOworCisJICAgIHAgPSAoY2hhcl91ICopbmJfdW5xdW90ZShhcmdzLCAmYXJncyk7CisJICAgIGdseXBoRmlsZSA9IHZpbV9zdHJzYXZlX2VzY2FwZWQocCwgZXNjYXBlX2NoYXJzKTsKKwkgICAgdmltX2ZyZWUocCk7CisKKwkgICAgYXJncyA9IHNraXB3aGl0ZShhcmdzICsgMSk7CisJICAgIGlmIChTVFJOQ01QKGFyZ3MsICJub25lIiwgNCkgPT0gMCkKKwkJYXJncyArPSA1OworCSAgICBlbHNlCisJICAgIHsKKwkJdXNlX2ZnID0gMTsKKwkJZmcgPSBzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworCSAgICB9CisJICAgIGlmIChTVFJOQ01QKGFyZ3MsICJub25lIiwgNCkgPT0gMCkKKwkJYXJncyArPSA1OworCSAgICBlbHNlCisJICAgIHsKKwkJdXNlX2JnID0gMTsKKwkJYmcgPSBzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworCSAgICB9CisJICAgIGlmICh0eXBlTmFtZSAhPSBOVUxMICYmIHRvb2x0aXAgIT0gTlVMTCAmJiBnbHlwaEZpbGUgIT0gTlVMTCkKKwkJYWRkc2lnbnR5cGUoYnVmLCB0eXBlTnVtLCB0eXBlTmFtZSwgdG9vbHRpcCwgZ2x5cGhGaWxlLAorCQkJCQkJICAgICAgdXNlX2ZnLCBmZywgdXNlX2JnLCBiZyk7CisJICAgIGVsc2UKKwkJdmltX2ZyZWUodHlwZU5hbWUpOworCisJICAgIC8qIGRvbid0IGZyZWUgdHlwZU5hbWU7IGl0J3MgdXNlZCBkaXJlY3RseSBpbiBhZGRzaWdudHlwZSgpICovCisJICAgIHZpbV9mcmVlKHRvb2x0aXApOworCSAgICB2aW1fZnJlZShnbHlwaEZpbGUpOworCisjZW5kaWYKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAiYWRkQW5ubyIpKQorCXsKKyNpZmRlZiBGRUFUX1NJR05TCisJICAgIGludCBzZXJOdW07CisJICAgIGludCBsb2NhbFR5cGVOdW07CisJICAgIGludCB0eXBlTnVtOworIyBpZmRlZiBOQkRFQlVHCisJICAgIGludCBsZW47CisjIGVuZGlmCisJICAgIHBvc19UICpwb3M7CisKKwkgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IGJ1Zi0+YnVmcCA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coIkU2NTE6IG51bGwgYnVmcCBpbiBhZGRBbm5vIik7CisJCXJldHVybiBGQUlMOworCSAgICB9CisKKwkgICAgZG91cGRhdGUgPSAxOworCisJICAgIHNlck51bSA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIChjaGFyICoqKSZhcmdzLCAxMCk7CisKKwkgICAgLyogR2V0IHRoZSB0eXBlbnIgc3BlY2lmaWMgZm9yIHRoaXMgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IHRvCisJICAgICAqIHRoZSBnbG9iYWwgdHlwZW51bWJlciwgYXMgdXNlZCBmb3IgdGhlIHNpZ24gbmFtZS4gKi8KKwkgICAgbG9jYWxUeXBlTnVtID0gc3RydG9sKChjaGFyICopYXJncywgKGNoYXIgKiopJmFyZ3MsIDEwKTsKKwkgICAgdHlwZU51bSA9IG1hcHNpZ250eXBlKGJ1ZiwgbG9jYWxUeXBlTnVtKTsKKworCSAgICBwb3MgPSBnZXRfb2ZmX29yX2xudW0oYnVmLT5idWZwLCAmYXJncyk7CisKKyMgaWZkZWYgTkJERUJVRworCSAgICBsZW4gPQorIyBlbmRpZgorCQlzdHJ0b2woKGNoYXIgKilhcmdzLCAoY2hhciAqKikmYXJncywgMTApOworIyBpZmRlZiBOQkRFQlVHCisJICAgIGlmIChsZW4gIT0gLTEpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBwYXJ0aWFsIGxpbmUgYW5ub3RhdGlvbiAtLSBOb3QgWWV0IEltcGxlbWVudGVkISIpKTsKKwkgICAgfQorIyBlbmRpZgorCSAgICBpZiAoc2VyTnVtID49IEdVQVJERURPRkZTRVQpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICB0b28gbWFueSBhbm5vdGF0aW9ucyEgaWdub3JpbmcuLi4iKSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGlmIChwb3MpCisJICAgIHsKKwkJY29sb25jbWQoIjpzaWduIHBsYWNlICVkIGxpbmU9JWQgbmFtZT0lZCBidWZmZXI9JWQiLAorCQkJICAgc2VyTnVtLCBwb3MtPmxudW0sIHR5cGVOdW0sIGJ1Zi0+YnVmcC0+Yl9mbnVtKTsKKwkJaWYgKHR5cGVOdW0gPT0gY3VyUEN0eXBlKQorCQkgICAgY29sb25jbWQoIjpzaWduIGp1bXAgJWQgYnVmZmVyPSVkIiwgc2VyTnVtLAorCQkJCQkJICAgICAgIGJ1Zi0+YnVmcC0+Yl9mbnVtKTsKKwkgICAgfQorCSAgICAvKiBYWFggb25seSByZWRyYXcgd2hhdCBjaGFuZ2VkLiAqLworCSAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOworI2VuZGlmCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgInJlbW92ZUFubm8iKSkKKwl7CisjaWZkZWYgRkVBVF9TSUdOUworCSAgICBpbnQgc2VyTnVtOworCisJICAgIGlmIChidWYgPT0gTlVMTCB8fCBidWYtPmJ1ZnAgPT0gTlVMTCkKKwkgICAgeworCQluYmRlYnVnKCgiICAgIG51bGwgYnVmcCBpbiByZW1vdmVBbm5vIikpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBkb3VwZGF0ZSA9IDE7CisJICAgIHNlck51bSA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIChjaGFyICoqKSZhcmdzLCAxMCk7CisJICAgIGNvbG9uY21kKCI6c2lnbiB1bnBsYWNlICVkIGJ1ZmZlcj0lZCIsCisJCSAgICAgc2VyTnVtLCBidWYtPmJ1ZnAtPmJfZm51bSk7CisJICAgIHJlZHJhd19idWZfbGF0ZXIoYnVmLT5idWZwLCBOT1RfVkFMSUQpOworI2VuZGlmCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCX0KKwllbHNlIGlmIChzdHJlcSgoY2hhciAqKWNtZCwgIm1vdmVBbm5vVG9Gcm9udCIpKQorCXsKKyNpZmRlZiBGRUFUX1NJR05TCisJICAgIG5iZGVidWcoKCIgICAgbW92ZUFubm9Ub0Zyb250OiBOb3QgWWV0IEltcGxlbWVudGVkISIpKTsKKyNlbmRpZgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJndWFyZCIpIHx8IHN0cmVxKChjaGFyICopY21kLCAidW5ndWFyZCIpKQorCXsKKwkgICAgaW50IGxlbjsKKwkgICAgcG9zX1QgZmlyc3Q7CisJICAgIHBvc19UIGxhc3Q7CisJICAgIHBvc19UICpwb3M7CisJICAgIGludCB1biA9IChjbWRbMF0gPT0gJ3UnKTsKKwkgICAgc3RhdGljIGludCBndWFyZElkID0gR1VBUkRFRE9GRlNFVDsKKworCSAgICBpZiAoc2tpcCA+PSBTS0lQX1NUT1ApCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBTa2lwcGluZyAlcyBjb21tYW5kXG4iLCAoY2hhciAqKSBjbWQpKTsKKwkJcmV0dXJuIE9LOworCSAgICB9CisKKwkgICAgbmJfaW5pdF9ncmFwaGljcygpOworCisJICAgIGlmIChidWYgPT0gTlVMTCB8fCBidWYtPmJ1ZnAgPT0gTlVMTCkKKwkgICAgeworCQluYmRlYnVnKCgiICAgIG51bGwgYnVmcCBpbiAlcyBjb21tYW5kIiwgY21kKSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGlmIChjdXJidWYgIT0gYnVmLT5idWZwKQorCQlzZXRfY3VyYnVmKGJ1Zi0+YnVmcCwgRE9CVUZfR09UTyk7CisJICAgIG9mZiA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIChjaGFyICoqKSZhcmdzLCAxMCk7CisJICAgIGxlbiA9IHN0cnRvbCgoY2hhciAqKWFyZ3MsIDAsIDEwKTsKKwkgICAgcG9zID0gb2ZmMnBvcyhidWYtPmJ1ZnAsIG9mZik7CisJICAgIGRvdXBkYXRlID0gMTsKKwkgICAgaWYgKCFwb3MpCisJCW5iZGVidWcoKCIgICAgbm8gc3VjaCBzdGFydCBwb3MgaW4gJXMsICVsZFxuIiwgY21kLCBvZmYpKTsKKwkgICAgZWxzZQorCSAgICB7CisJCWZpcnN0ID0gKnBvczsKKwkJcG9zID0gb2ZmMnBvcyhidWYtPmJ1ZnAsIG9mZiArIGxlbiAtIDEpOworCQlpZiAocG9zICE9IE5VTEwgJiYgcG9zLT5jb2wgPT0gMCkgeworCQkJLyoKKwkJCSAqIEluIEphdmEgU3dpbmcgdGhlIG9mZnNldCBpcyBhIHBvc2l0aW9uIGJldHdlZW4gMgorCQkJICogY2hhcmFjdGVycy4gSWYgY29sID09IDAgdGhlbiB3ZSByZWFsbHkgd2FudCB0aGUKKwkJCSAqIHByZXZpb3VzIGxpbmUgYXMgdGhlIGVuZC4KKwkJCSAqLworCQkJcG9zID0gb2ZmMnBvcyhidWYtPmJ1ZnAsIG9mZiArIGxlbiAtIDIpOworCQl9CisJCWlmICghcG9zKQorCQkgICAgbmJkZWJ1ZygoIiAgICBubyBzdWNoIGVuZCBwb3MgaW4gJXMsICVsZFxuIiwKKwkJCSAgICBjbWQsIG9mZiArIGxlbiAtIDEpKTsKKwkJZWxzZQorCQl7CisJCSAgICBsb25nIGxudW07CisJCSAgICBsYXN0ID0gKnBvczsKKwkJICAgIC8qIHNldCBoaWdobGlnaHQgZm9yIHJlZ2lvbiAqLworCQkgICAgbmJkZWJ1ZygoIiAgICAlc0dVQVJEICVsZCwlZCB0byAlbGQsJWRcbiIsICh1bikgPyAiVU4iIDogIiIsCisJCQkgICAgIGZpcnN0LmxudW0sIGZpcnN0LmNvbCwKKwkJCSAgICAgbGFzdC5sbnVtLCBsYXN0LmNvbCkpOworI2lmZGVmIEZFQVRfU0lHTlMKKwkJICAgIGZvciAobG51bSA9IGZpcnN0LmxudW07IGxudW0gPD0gbGFzdC5sbnVtOyBsbnVtKyspCisJCSAgICB7CisJCQlpZiAodW4pCisJCQl7CisJCQkgICAgLyogbmV2ZXIgdXNlZCAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIGlmIChidWZfZmluZHNpZ250eXBlX2lkKGJ1Zi0+YnVmcCwgbG51bSwKKwkJCQlHVUFSREVEKSA9PSAwKQorCQkJICAgIHsKKwkJCQljb2xvbmNtZCgKKwkJCQkgICAgIjpzaWduIHBsYWNlICVkIGxpbmU9JWQgbmFtZT0lZCBidWZmZXI9JWQiLAorCQkJCSAgICAgZ3VhcmRJZCsrLCBsbnVtLCBHVUFSREVELAorCQkJCSAgICAgYnVmLT5idWZwLT5iX2ZudW0pOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKyNlbmRpZgorCQkgICAgcmVkcmF3X2J1Zl9sYXRlcihidWYtPmJ1ZnAsIE5PVF9WQUxJRCk7CisJCX0KKwkgICAgfQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzdGFydEF0b21pYyIpKQorCXsKKwkgICAgaW5BdG9taWMgPSAxOworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJlbmRBdG9taWMiKSkKKwl7CisJICAgIGluQXRvbWljID0gMDsKKwkgICAgaWYgKG5lZWR1cGRhdGUpCisJICAgIHsKKwkJZG91cGRhdGUgPSAxOworCQluZWVkdXBkYXRlID0gMDsKKwkgICAgfQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwl9CisJZWxzZSBpZiAoc3RyZXEoKGNoYXIgKiljbWQsICJzYXZlIikpCisJeworCSAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmLT5idWZwID09IE5VTEwpCisJICAgIHsKKwkJbmJkZWJ1ZygoIiAgICBudWxsIGJ1ZnAgaW4gJXMgY29tbWFuZCIsIGNtZCkpOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCisJICAgIC8qIHRoZSBmb2xsb3dpbmcgaXMgdGFrZW4gZnJvbSBleF9jbWRzLmMgKGRvX3dxYWxsIGZ1bmN0aW9uKSAqLworCSAgICBpZiAoYnVmSXNDaGFuZ2VkKGJ1Zi0+YnVmcCkpCisJICAgIHsKKwkJLyogT25seSB3cml0ZSBpZiB0aGUgYnVmZmVyIGNhbiBiZSB3cml0dGVuLiAqLworCQlpZiAocF93cml0ZQorCQkJJiYgIWJ1Zi0+YnVmcC0+Yl9wX3JvCisJCQkmJiBidWYtPmJ1ZnAtPmJfZmZuYW1lICE9IE5VTEwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCQkmJiAhYnRfZG9udHdyaXRlKGJ1Zi0+YnVmcCkKKyNlbmRpZgorCQkJKQorCQl7CisJCSAgICBidWZfd3JpdGVfYWxsKGJ1Zi0+YnVmcCwgRkFMU0UpOworI2lmZGVmIEZFQVRfQVVUT0NNRAorCQkgICAgLyogYW4gYXV0b2NvbW1hbmQgbWF5IGhhdmUgZGVsZXRlZCB0aGUgYnVmZmVyICovCisJCSAgICBpZiAoIWJ1Zl92YWxpZChidWYtPmJ1ZnApKQorCQkJYnVmLT5idWZwID0gTlVMTDsKKyNlbmRpZgorCQl9CisJICAgIH0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAibmV0YmVhbnNCdWZmZXIiKSkKKwl7CisJICAgIGlmIChidWYgPT0gTlVMTCB8fCBidWYtPmJ1ZnAgPT0gTlVMTCkKKwkgICAgeworCQluYmRlYnVnKCgiICAgIG51bGwgYnVmcCBpbiAlcyBjb21tYW5kIiwgY21kKSk7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGlmICgqYXJncyA9PSAnVCcpCisJICAgIHsKKwkJYnVmLT5idWZwLT5iX25ldGJlYW5zX2ZpbGUgPSBUUlVFOworCQlidWYtPmJ1ZnAtPmJfd2FzX25ldGJlYW5zX2ZpbGUgPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UKKwkJYnVmLT5idWZwLT5iX25ldGJlYW5zX2ZpbGUgPSBGQUxTRTsKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJfQorCWVsc2UgaWYgKHN0cmVxKChjaGFyICopY21kLCAidmVyc2lvbiIpKQorCXsKKwkgICAgbmJkZWJ1ZygoIiAgICBWZXJzaW9uID0gJXNcbiIsIChjaGFyICopIGFyZ3MpKTsKKwl9CisJLyoKKwkgKiBVbnJlY29nbml6ZWQgY29tbWFuZCBpcyBpZ25vcmVkLgorCSAqLworICAgIH0KKyAgICBpZiAoaW5BdG9taWMgJiYgZG91cGRhdGUpCisgICAgeworCW5lZWR1cGRhdGUgPSAxOworCWRvdXBkYXRlID0gMDsKKyAgICB9CisKKyAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmLT5pbml0RG9uZSAmJiBkb3VwZGF0ZSkKKyAgICB7CisJdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworCXNldGN1cnNvcigpOworCW91dF9mbHVzaCgpOworCWd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKwlndWlfbWNoX2ZsdXNoKCk7CisJLyogUXVpdCBhIGhpdC1yZXR1cm4gb3IgbW9yZSBwcm9tcHQuICovCisJaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBBU0tNT1JFKQorCXsKKwkgICAgYWRkX3RvX2lucHV0X2J1ZigoY2hhcl91ICopIlwwMDMiLCAxKTsKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKwkgICAgaWYgKGd0a19tYWluX2xldmVsKCkgPiAwKQorCQlndGtfbWFpbl9xdWl0KCk7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogUHJvY2VzcyBhIHZpbSBjb2xvbiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvbG9uY21kKGNoYXIgKmNtZCwgLi4uKQoreworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgY21kKTsKKyAgICB2c3ByaW50ZihidWYsIGNtZCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICBuYmRlYnVnKCgiICAgIENPTE9OQ01EICVzXG4iLCBidWYpKTsKKworLyogICAgIEFMVF9JTlBVVF9MT0NLX09OOyAqLworICAgIGRvX2NtZGxpbmUoKGNoYXJfdSAqKWJ1ZiwgTlVMTCwgTlVMTCwgRE9DTURfTk9XQUlUIHwgRE9DTURfS0VZVFlQRUQpOworLyogICAgIEFMVF9JTlBVVF9MT0NLX09GRjsgKi8KKworICAgIHNldGN1cnNvcigpOwkJLyogcmVzdG9yZSB0aGUgY3Vyc29yIHBvc2l0aW9uICovCisgICAgb3V0X2ZsdXNoKCk7CQkvKiBtYWtlIHN1cmUgb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gKi8KKworICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKKyAgICBndWlfbWNoX2ZsdXNoKCk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgaGlnaGxpZ2h0cyBhbmQgc2lnbnMgZm9yIHVzZSBieSBuZXRiZWFucyAgKG1vc3RseSBvYnNvbGV0ZSkKKyAqLworICAgIHN0YXRpYyB2b2lkCituYl9pbml0X2dyYXBoaWNzKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkaWRfaW5pdCA9IEZBTFNFOworCisgICAgaWYgKCFkaWRfaW5pdCkKKyAgICB7CisJY29sb25jbWQoIjpoaWdobGlnaHQgTkJHdWFyZGVkIGd1aWJnPUN5YW4gZ3VpZmc9QmxhY2siKTsKKwljb2xvbmNtZCgiOnNpZ24gZGVmaW5lICVkIGxpbmVobD1OQkd1YXJkZWQiLCBHVUFSREVEKTsKKworCWRpZF9pbml0ID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0IGtleSB0byBuZXRiZWFucyBuYW1lLgorICovCisgICAgc3RhdGljIHZvaWQKK25ldGJlYW5zX2tleW5hbWUoaW50IGtleSwgY2hhciAqYnVmKQoreworICAgIGNoYXIgKm5hbWUgPSAwOworICAgIGNoYXIgbmFtZWJ1ZlsyXTsKKyAgICBpbnQgY3RybCAgPSAwOworICAgIGludCBzaGlmdCA9IDA7CisgICAgaW50IGFsdCAgID0gMDsKKworICAgIGlmIChtb2RfbWFzayAmIE1PRF9NQVNLX0NUUkwpCisJY3RybCA9IDE7CisgICAgaWYgKG1vZF9tYXNrICYgTU9EX01BU0tfU0hJRlQpCisJc2hpZnQgPSAxOworICAgIGlmIChtb2RfbWFzayAmIE1PRF9NQVNLX0FMVCkKKwlhbHQgPSAxOworCisKKyAgICBzd2l0Y2ggKGtleSkKKyAgICB7CisJY2FzZSBLX0YxOgkJbmFtZSA9ICJGMSI7CQlicmVhazsKKwljYXNlIEtfU19GMToJbmFtZSA9ICJGMSI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0YyOgkJbmFtZSA9ICJGMiI7CQlicmVhazsKKwljYXNlIEtfU19GMjoJbmFtZSA9ICJGMiI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0YzOgkJbmFtZSA9ICJGMyI7CQlicmVhazsKKwljYXNlIEtfU19GMzoJbmFtZSA9ICJGMyI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y0OgkJbmFtZSA9ICJGNCI7CQlicmVhazsKKwljYXNlIEtfU19GNDoJbmFtZSA9ICJGNCI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y1OgkJbmFtZSA9ICJGNSI7CQlicmVhazsKKwljYXNlIEtfU19GNToJbmFtZSA9ICJGNSI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y2OgkJbmFtZSA9ICJGNiI7CQlicmVhazsKKwljYXNlIEtfU19GNjoJbmFtZSA9ICJGNiI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y3OgkJbmFtZSA9ICJGNyI7CQlicmVhazsKKwljYXNlIEtfU19GNzoJbmFtZSA9ICJGNyI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y4OgkJbmFtZSA9ICJGOCI7CQlicmVhazsKKwljYXNlIEtfU19GODoJbmFtZSA9ICJGOCI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0Y5OgkJbmFtZSA9ICJGOSI7CQlicmVhazsKKwljYXNlIEtfU19GOToJbmFtZSA9ICJGOSI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJY2FzZSBLX0YxMDoJCW5hbWUgPSAiRjEwIjsJCWJyZWFrOworCWNhc2UgS19TX0YxMDoJbmFtZSA9ICJGMTAiOwlzaGlmdCA9IDE7CWJyZWFrOworCWNhc2UgS19GMTE6CQluYW1lID0gIkYxMSI7CQlicmVhazsKKwljYXNlIEtfU19GMTE6CW5hbWUgPSAiRjExIjsJc2hpZnQgPSAxOwlicmVhazsKKwljYXNlIEtfRjEyOgkJbmFtZSA9ICJGMTIiOwkJYnJlYWs7CisJY2FzZSBLX1NfRjEyOgluYW1lID0gIkYxMiI7CXNoaWZ0ID0gMTsJYnJlYWs7CisJZGVmYXVsdDoKKwkJCWlmIChrZXkgPj0gJyAnICYmIGtleSA8PSAnficpCisJCQl7CisJCQkgICAgLyogQWxsb3cgQVNDSUkgY2hhcmFjdGVycy4gKi8KKwkJCSAgICBuYW1lID0gbmFtZWJ1ZjsKKwkJCSAgICBuYW1lYnVmWzBdID0ga2V5OworCQkJICAgIG5hbWVidWZbMV0gPSBOVUw7CisJCQl9CisJCQllbHNlCisJCQkgICAgbmFtZSA9ICJYIjsKKwkJCWJyZWFrOworICAgIH0KKworICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgaWYgKGN0cmwpCisJc3RyY2F0KGJ1ZiwgIkMiKTsKKyAgICBpZiAoc2hpZnQpCisJc3RyY2F0KGJ1ZiwgIlMiKTsKKyAgICBpZiAoYWx0KQorCXN0cmNhdChidWYsICJNIik7IC8qIE1FVEEgKi8KKyAgICBpZiAoY3RybCB8fCBzaGlmdCB8fCBhbHQpCisJc3RyY2F0KGJ1ZiwgIi0iKTsKKyAgICBzdHJjYXQoYnVmLCBuYW1lKTsKK30KKworI2lmZGVmIEZFQVRfQkVWQUwKKy8qCisgKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGJhbGxvb24gZXZhbHVhdGlvbi4gIEdyYWJzIHRoZSB0ZXh0IHVuZGVyIHRoZQorICogY3Vyc29yIGFuZCBzZW5kcyBpdCB0byB0aGUgZGVidWdnZXIgZm9yIGV2YWx1YXRpb24uICBUaGUgZGVidWdnZXIgc2hvdWxkCisgKiByZXNwb25kIHdpdGggYSBzaG93QmFsbG9vbiBjb21tYW5kIHdoZW4gdGhlcmUgaXMgYSB1c2VmdWwgcmVzdWx0LgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorbmV0YmVhbnNfYmV2YWxfY2IoCisJQmFsbG9vbkV2YWwJKmJldmFsLAorCWludAkJIHN0YXRlKQoreworICAgIGNoYXJfdQkqZmlsZW5hbWU7CisgICAgY2hhcl91CSp0ZXh0OworICAgIGludAkJbGluZTsKKyAgICBpbnQJCWNvbDsKKyAgICBjaGFyCWJ1ZltNQVhQQVRITCAqIDIgKyAyNV07CisgICAgY2hhcl91CSpwOworCisgICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2hlbiAnYmFsbG9vbmV2YWwnIGlzIG9mZiwgbWVzc2FnZXMgc2Nyb2xsZWQgdGhlCisgICAgICogd2luZG93cyB1cCBvciB3ZSBoYXZlIG5vIGNvbm5lY3Rpb24uICovCisgICAgaWYgKCFwX2JldmFsIHx8IG1zZ19zY3JvbGxlZCA+IDAgfHwgIWhhdmVDb25uZWN0aW9uKQorCXJldHVybjsKKworICAgIGlmIChndWlfbWNoX2dldF9iZXZhbF9pbmZvKGJldmFsLCAmZmlsZW5hbWUsICZsaW5lLCAmdGV4dCwgJmNvbCkgPT0gT0spCisgICAgeworCS8qIFNlbmQgZGVidWdnZXIgcmVxdWVzdC4gIE9ubHkgd2hlbiB0aGUgdGV4dCBpcyBvZiByZWFzb25hYmxlCisJICogbGVuZ3RoLiAqLworCWlmICh0ZXh0ICE9IE5VTEwgJiYgdGV4dFswXSAhPSBOVUwgJiYgU1RSTEVOKHRleHQpIDwgTUFYUEFUSEwpCisJeworCSAgICBwID0gbmJfcXVvdGUodGV4dCk7CisJICAgIGlmIChwICE9IE5VTEwpCisJCXNwcmludGYoYnVmLCAiMDpiYWxsb29uVGV4dD0lZCBcIiVzXCJcbiIsIGNtZG5vLCBwKTsKKwkgICAgdmltX2ZyZWUocCk7CisJICAgIG5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisJICAgIG5iX3NlbmQoYnVmLCAibmV0YmVhbnNfYmV2YWxfY2IiKTsKKwl9CisJdmltX2ZyZWUodGV4dCk7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBUZWxsIG5ldGJlYW5zIHRoYXQgdGhlIHdpbmRvdyB3YXMgb3BlbmVkLCByZWFkeSBmb3IgY29tbWFuZHMuCisgKi8KKyAgICB2b2lkCituZXRiZWFuc19zdGFydHVwX2RvbmUodm9pZCkKK3sKKyAgICBjaGFyICpjbWQgPSAiMDpzdGFydHVwRG9uZT0wXG4iOworCisgICAgaWYgKCFoYXZlQ29ubmVjdGlvbikKKwlyZXR1cm47CisKKyAgICBuYmRlYnVnKCgiRVZUOiAlcyIsIGNtZCkpOworICAgIG5iX3NlbmQoY21kLCAibmV0YmVhbnNfc3RhcnR1cF9kb25lIik7CisKKyNpZmRlZiBGRUFUX0JFVkFMCisjIGlmZGVmIEZFQVRfR1VJX01PVElGCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCS8qCisJICogU2V0IHVwIHRoZSBCYWxsb29uIEV4cHJlc3Npb24gRXZhbHVhdGlvbiBhcmVhIGZvciBNb3RpZi4KKwkgKiBHVEsgY2FuIGRvIGl0IGVhcmxpZXIuLi4KKwkgKiBBbHdheXMgY3JlYXRlIGl0IGJ1dCBkaXNhYmxlIGl0IHdoZW4gJ2JhbGxvb25ldmFsJyBpc24ndCBzZXQuCisJICovCisJYmFsbG9vbkV2YWwgPSBndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKHRleHRBcmVhLCBOVUxMLAorCQkJCQkJICAgICZuZXRiZWFuc19iZXZhbF9jYiwgTlVMTCk7CisJaWYgKCFwX2JldmFsKQorCSAgICBndWlfbWNoX2Rpc2FibGVfYmV2YWxfYXJlYShiYWxsb29uRXZhbCk7CisgICAgfQorIyBlbHNlCisjICBpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCWJhbGxvb25FdmFsID0gZ3VpX21jaF9jcmVhdGVfYmV2YWxfYXJlYShOVUxMLCBOVUxMLAorCQkJCQkJICAgICZuZXRiZWFuc19iZXZhbF9jYiwgTlVMTCk7CisJaWYgKCFwX2JldmFsKQorCSAgICBndWlfbWNoX2Rpc2FibGVfYmV2YWxfYXJlYShiYWxsb29uRXZhbCk7CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUZWxsIG5ldGJlYW5zIHRoYXQgdGhlIHdpbmRvdyB3YXMgbW92ZWQgb3IgcmVzaXplZC4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2ZyYW1lX21vdmVkKGludCBuZXdfeCwgaW50IG5ld195KQoreworICAgIGNoYXIgYnVmWzEyOF07CisKKyAgICBpZiAoIWhhdmVDb25uZWN0aW9uKQorCXJldHVybjsKKworICAgIHNwcmludGYoYnVmLCAiMDpnZW9tZXRyeT0lZCAlZCAlZCAlZCAlZFxuIiwKKwkJICAgIGNtZG5vLCAoaW50KUNvbHVtbnMsIChpbnQpUm93cywgbmV3X3gsIG5ld195KTsKKyAgICBuYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZikpOworICAgIG5iX3NlbmQoYnVmLCAibmV0YmVhbnNfZnJhbWVfbW92ZWQiKTsKK30KKyNlbmRpZgorCisvKgorICogVGVsbCBuZXRiZWFucyB0aGUgdXNlciBvcGVuZWQgYSBmaWxlLgorICovCisgICAgdm9pZAorbmV0YmVhbnNfZmlsZV9vcGVuZWQoY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciAgICBidWZmZXJbMipNQVhQQVRITF07CisgICAgY2hhcl91ICAqcTsKKworICAgIGlmICghaGF2ZUNvbm5lY3Rpb24pCisJcmV0dXJuOworCisgICAgcSA9IG5iX3F1b3RlKChjaGFyX3UgKilmaWxlbmFtZSk7CisgICAgaWYgKHEgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgc3ByaW50ZihidWZmZXIsICIwOmZpbGVPcGVuZWQ9JWQgXCIlc1wiICVzICVzXG4iLAorCSAgICAwLAorCSAgICAoY2hhciAqKXEsCisJICAgICJUIiwgIC8qIG9wZW4gaW4gTmV0QmVhbnMgKi8KKwkgICAgIkYiKTsgLyogbW9kaWZpZWQgKi8KKworICAgIHZpbV9mcmVlKHEpOworICAgIG5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmZmVyKSk7CisKKyAgICBuYl9zZW5kKGJ1ZmZlciwgIm5ldGJlYW5zX2ZpbGVfb3BlbmVkIik7CisgICAgaWYgKHBfYWNkICYmIHZpbV9jaGRpcmZpbGUoKGNoYXJfdSAqKWZpbGVuYW1lKSA9PSBPSykKKwlzaG9ydGVuX2ZuYW1lcyhUUlVFKTsKK30KKworLyoKKyAqIFRlbGwgbmV0YmVhbnMgYSBmaWxlIHdhcyBjbG9zZWQuCisgKi8KKyAgICB2b2lkCituZXRiZWFuc19maWxlX2Nsb3NlZChidWZfVCAqYnVmcCkKK3sKKyAgICBpbnQJCWJ1Zm5vID0gbmJfZ2V0YnVmbm8oYnVmcCk7CisgICAgbmJidWZfVAkqbmJidWYgPSBuYl9nZXRfYnVmKGJ1Zm5vKTsKKyAgICBjaGFyCWJ1ZmZlclsyKk1BWFBBVEhMXTsKKworICAgIGlmICghaGF2ZUNvbm5lY3Rpb24gfHwgYnVmbm8gPCAwKQorCXJldHVybjsKKworICAgIGlmICghbmV0YmVhbnNDbG9zZUZpbGUpCisgICAgeworCW5iZGVidWcoKCJpZ25vcmluZyBmaWxlX2Nsb3NlZCBmb3IgJXNcbiIsIGJ1ZnAtPmJfZmZuYW1lKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIG5iZGVidWcoKCJuZXRiZWFuc19maWxlX2Nsb3NlZCgpIGJ1Zm5vID0gICVkLCBmaWxlID0gJXMsIGRpc3BsYXluYW1lID0gJXNcbiIsCisJCWJ1Zm5vLCBidWZwLT5iX2ZmbmFtZSwKKwkJKG5iYnVmICE9IE5VTEwpID8gbmJidWYtPmRpc3BsYXluYW1lIDogIjw+IikpOworCisgICAgaWYgKGJ1Zm5vIDw9IDApCisJcmV0dXJuOworCisgICAgc3ByaW50ZihidWZmZXIsICIlZDpraWxsZWQ9JWRcbiIsIGJ1Zm5vLCBjbWRubyk7CisKKyAgICBuYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZmZlcikpOworCisgICAgbmJfc2VuZChidWZmZXIsICJuZXRiZWFuc19maWxlX2Nsb3NlZCIpOworCisgICAgaWYgKG5iYnVmICE9IE5VTEwpCisJbmJidWYtPmJ1ZnAgPSBOVUxMOworfQorCisvKgorICogR2V0IGEgcG9pbnRlciB0byB0aGUgTmV0YmVhbnMgYnVmZmVyIGZvciBWaW0gYnVmZmVyICJidWZwIi4KKyAqIFJldHVybiBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1Y2ggYnVmZmVyIG9yIGNoYW5nZXMgYXJlIG5vdCB0byBiZSByZXBvcnRlZC4KKyAqIE90aGVyd2lzZSBzdG9yZSB0aGUgYnVmZmVyIG51bWJlciBpbiAiKmJ1Zm5vcCIuCisgKi8KKyAgICBzdGF0aWMgbmJidWZfVCAqCituYl9idWZwMm5iYnVmX2ZpcmUoYnVmX1QgKmJ1ZnAsIGludCAqYnVmbm9wKQoreworICAgIGludAkJYnVmbm87CisgICAgbmJidWZfVAkqbmJidWY7CisKKyAgICBpZiAoIWhhdmVDb25uZWN0aW9uIHx8ICFuZXRiZWFuc0ZpcmVDaGFuZ2VzKQorCXJldHVybiBOVUxMOwkJLyogY2hhbmdlcyBhcmUgbm90IHJlcG9ydGVkIGF0IGFsbCAqLworCisgICAgYnVmbm8gPSBuYl9nZXRidWZubyhidWZwKTsKKyAgICBpZiAoYnVmbm8gPD0gMCkKKwlyZXR1cm4gTlVMTDsJCS8qIGZpbGUgaXMgbm90IGtub3duIHRvIE5ldEJlYW5zICovCisKKyAgICBuYmJ1ZiA9IG5iX2dldF9idWYoYnVmbm8pOworICAgIGlmIChuYmJ1ZiAhPSBOVUxMICYmICFuYmJ1Zi0+ZmlyZUNoYW5nZXMpCisJcmV0dXJuIE5VTEw7CQkvKiBjaGFuZ2VzIGluIHRoaXMgYnVmZmVyIGFyZSBub3QgcmVwb3J0ZWQgKi8KKworICAgICpidWZub3AgPSBidWZubzsKKyAgICByZXR1cm4gbmJidWY7Cit9CisKKy8qCisgKiBUZWxsIG5ldGJlYW5zIHRoZSB1c2VyIGluc2VydGVkIHNvbWUgdGV4dC4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2luc2VydGVkKAorICAgIGJ1Zl9UCSpidWZwLAorICAgIGxpbmVucl9UCWxpbmVuciwKKyAgICBjb2xucl9UCWNvbCwKKyAgICBpbnQJCW9sZGxlbiwKKyAgICBjaGFyX3UJKnR4dCwKKyAgICBpbnQJCW5ld2xlbikKK3sKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWJ1Zm5vOworICAgIG5iYnVmX1QJKm5iYnVmOworICAgIHBvc19UCXBvczsKKyAgICBsb25nCW9mZjsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpuZXd0eHQ7CisKKyAgICBuYmJ1ZiA9IG5iX2J1ZnAybmJidWZfZmlyZShidWZwLCAmYnVmbm8pOworICAgIGlmIChuYmJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIG5iYnVmLT5tb2RpZmllZCA9IDE7CisKKyAgICBwb3MubG51bSA9IGxpbmVucjsKKyAgICBwb3MuY29sID0gY29sOworCisgICAgb2ZmID0gcG9zMm9mZihidWZwLCAmcG9zKTsKKworLyogICAgIG5iZGVidWcoKCJsaW5lbnIgPSAlZCwgY29sID0gJWQsIG9mZiA9ICVsZFxuIiwgbGluZW5yLCBjb2wsIG9mZikpOyAqLworCisgICAgYnVmID0gYWxsb2MoMTI4ICsgMipuZXdsZW4pOworCisgICAgaWYgKG9sZGxlbiA+IDApCisgICAgeworCS8qIHNvbWUgY2hhcnMgd2VyZSByZXBsYWNlZDsgc2VuZCAicmVtb3ZlIiBFVlQgKi8KKwlzcHJpbnRmKChjaGFyICopYnVmLCAiJWQ6cmVtb3ZlPSVkICVsZCAlZFxuIiwKKwkJCQkJCSAgIGJ1Zm5vLCBjbWRubywgb2ZmLCBvbGRsZW4pOworCW5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisJbmJfc2VuZCgoY2hhciAqKWJ1ZiwgIm5ldGJlYW5zX2luc2VydGVkIik7CisgICAgfQorICAgIGVsc2UgaWYgKG9sZGxlbiA8IDApCisgICAgeworCS8qIGNhbid0IGhhcHBlbj8gKi8KKwluYmRlYnVnKCgidW5leHBlY3RlZDogb2xkbGVuIDwgMCBpbiBuZXRiZWFuc19pbnNlcnRlZCIpKTsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoZSAiaW5zZXJ0IiBFVlQgKi8KKyAgICBuZXd0eHQgPSBhbGxvYyhuZXdsZW4gKyAxKTsKKyAgICBTVFJOQ1BZKG5ld3R4dCwgdHh0LCBuZXdsZW4pOworICAgIG5ld3R4dFtuZXdsZW5dID0gJ1wwJzsKKyAgICBwID0gbmJfcXVvdGUobmV3dHh0KTsKKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopYnVmLCAiJWQ6aW5zZXJ0PSVkICVsZCBcIiVzXCJcbiIsIGJ1Zm5vLCBjbWRubywgb2ZmLCBwKTsKKwluYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZikpOworCW5iX3NlbmQoKGNoYXIgKilidWYsICJuZXRiZWFuc19pbnNlcnRlZCIpOworICAgIH0KKyAgICB2aW1fZnJlZShwKTsKKyAgICB2aW1fZnJlZShuZXd0eHQpOworICAgIHZpbV9mcmVlKGJ1Zik7Cit9CisKKy8qCisgKiBUZWxsIG5ldGJlYW5zIHNvbWUgYnl0ZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCisgKi8KKyAgICB2b2lkCituZXRiZWFuc19yZW1vdmVkKAorICAgIGJ1Zl9UCSpidWZwLAorICAgIGxpbmVucl9UCWxpbmVuciwKKyAgICBjb2xucl9UCWNvbCwKKyAgICBsb25nCWxlbikKK3sKKyAgICBjaGFyX3UJYnVmWzEyOF07CisgICAgaW50CQlidWZubzsKKyAgICBuYmJ1Zl9UCSpuYmJ1ZjsKKyAgICBwb3NfVAlwb3M7CisgICAgbG9uZwlvZmY7CisKKyAgICBuYmJ1ZiA9IG5iX2J1ZnAybmJidWZfZmlyZShidWZwLCAmYnVmbm8pOworICAgIGlmIChuYmJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsZW4gPCAwKQorICAgIHsKKwluYmRlYnVnKCgiTmVnYXRpdmUgbGVuICVsZCBpbiBuZXRiZWFuc19yZW1vdmVkKCkhIiwgbGVuKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIG5iYnVmLT5tb2RpZmllZCA9IDE7CisKKyAgICBwb3MubG51bSA9IGxpbmVucjsKKyAgICBwb3MuY29sID0gY29sOworCisgICAgb2ZmID0gcG9zMm9mZihidWZwLCAmcG9zKTsKKworICAgIHNwcmludGYoKGNoYXIgKilidWYsICIlZDpyZW1vdmU9JWQgJWxkICVsZFxuIiwgYnVmbm8sIGNtZG5vLCBvZmYsIGxlbik7CisgICAgbmJkZWJ1ZygoIkVWVDogJXMiLCBidWYpKTsKKyAgICBuYl9zZW5kKChjaGFyICopYnVmLCAibmV0YmVhbnNfcmVtb3ZlZCIpOworfQorCisvKgorICogU2VuZCBuZXRiZWFucyBhbiB1bm1vZHVmaWVkIGNvbW1hbmQuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK25ldGJlYW5zX3VubW9kaWZpZWQoYnVmX1QgKmJ1ZnApCit7CisjaWYgMAorICAgIGNoYXJfdQlidWZbMTI4XTsKKyAgICBpbnQJCWJ1Zm5vOworICAgIG5iYnVmX1QJKm5iYnVmOworCisgICAgLyogVGhpcyBoYXMgYmVlbiBkaXNhYmxlZCwgYmVjYXVzZSBOZXRCZWFucyBjb25zaWRlcnMgYSBidWZmZXIgbW9kaWZpZWQKKyAgICAgKiBldmVuIHdoZW4gYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIHVuZG9uZS4gKi8KKyAgICBuYmJ1ZiA9IG5iX2J1ZnAybmJidWZfZmlyZShidWZwLCAmYnVmbm8pOworICAgIGlmIChuYmJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIG5iYnVmLT5tb2RpZmllZCA9IDA7CisKKyAgICBzcHJpbnRmKChjaGFyICopYnVmLCAiJWQ6dW5tb2RpZmllZD0lZFxuIiwgYnVmbm8sIGNtZG5vKTsKKyAgICBuYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZikpOworICAgIG5iX3NlbmQoKGNoYXIgKilidWYsICJuZXRiZWFuc191bm1vZGlmaWVkIik7CisjZW5kaWYKK30KKworLyoKKyAqIFNlbmQgYSBidXR0b24gcmVsZWFzZSBldmVudCBiYWNrIHRvIG5ldGJlYW5zLiBJdHMgdXAgdG8gbmV0YmVhbnMKKyAqIHRvIGRlY2lkZSB3aGF0IHRvIGRvIChpZiBhbnl0aGluZykgd2l0aCB0aGlzIGV2ZW50LgorICovCisgICAgdm9pZAorbmV0YmVhbnNfYnV0dG9uX3JlbGVhc2UoaW50IGJ1dHRvbikKK3sKKyAgICBjaGFyCWJ1ZlsxMjhdOworICAgIGludAkJYnVmbm87CisKKyAgICBidWZubyA9IG5iX2dldGJ1Zm5vKGN1cmJ1Zik7CisKKyAgICBpZiAoYnVmbm8gPj0gMCAmJiBjdXJ3aW4gIT0gTlVMTCAmJiBjdXJ3aW4tPndfYnVmZmVyID09IGN1cmJ1ZikKKyAgICB7CisJaW50IGNvbCA9IG1vdXNlX2NvbCAtIGN1cndpbi0+d193aW5jb2wgLSAoY3Vyd2luLT53X3BfbnUgPyA5IDogMSk7CisJbG9uZyBvZmYgPSBwb3Myb2ZmKGN1cmJ1ZiwgJmN1cndpbi0+d19jdXJzb3IpOworCisJLyogc3luYyB0aGUgY3Vyc29yIHBvc2l0aW9uICovCisJc3ByaW50ZihidWYsICIlZDpuZXdEb3RBbmRNYXJrPSVkICVsZCAlbGRcbiIsIGJ1Zm5vLCBjbWRubywgb2ZmLCBvZmYpOworCW5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisJbmJfc2VuZChidWYsICJuZXRiZWFuc19idXR0b25fcmVsZWFzZVtuZXdEb3RBbmRNYXJrXSIpOworCisJc3ByaW50ZihidWYsICIlZDpidXR0b25SZWxlYXNlPSVkICVkICVsZCAlZFxuIiwgYnVmbm8sIGNtZG5vLAorCQkJCSAgICBidXR0b24sIChsb25nKWN1cndpbi0+d19jdXJzb3IubG51bSwgY29sKTsKKwluYmRlYnVnKCgiRVZUOiAlcyIsIGJ1ZikpOworCW5iX3NlbmQoYnVmLCAibmV0YmVhbnNfYnV0dG9uX3JlbGVhc2UiKTsKKyAgICB9Cit9CisKKworLyoKKyAqIFNlbmQgYSBrZXlwcmVzcyBldmVudCBiYWNrIHRvIG5ldGJlYW5zLiBUaGlzIHVzdWFseSBzaW11bGF0ZXMgc29tZQorICoga2luZCBvZiBmdW5jdGlvbiBrZXkgcHJlc3MuCisgKi8KKyAgICB2b2lkCituZXRiZWFuc19rZXljb21tYW5kKGludCBrZXkpCit7CisgICAgY2hhcglidWZbMipNQVhQQVRITF07CisgICAgaW50CQlidWZubzsKKyAgICBjaGFyCWtleU5hbWVbNjBdOworICAgIGxvbmcJb2ZmOworICAgIGNoYXJfdQkqcTsKKworICAgIGlmICghaGF2ZUNvbm5lY3Rpb24pCisJcmV0dXJuOworCisgICAgLyogY29udmVydCBrZXkgdG8gbmV0YmVhbnMgbmFtZSAqLworICAgIG5ldGJlYW5zX2tleW5hbWUoa2V5LCBrZXlOYW1lKTsKKworICAgIGJ1Zm5vID0gbmJfZ2V0YnVmbm8oY3VyYnVmKTsKKworICAgIGlmIChidWZubyA9PSAtMSkKKyAgICB7CisJbmJkZWJ1ZygoImdvdCBrZXljb21tYW5kIGZvciBub24tTmV0QmVhbnMgYnVmZmVyLCBvcGVuaW5nLi4uXG4iKSk7CisJcSA9IGN1cmJ1Zi0+Yl9mZm5hbWUgPT0gTlVMTCA/IChjaGFyX3UgKikiIgorCQkJCQkJIDogbmJfcXVvdGUoY3VyYnVmLT5iX2ZmbmFtZSk7CisJaWYgKHEgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCXNwcmludGYoYnVmLCAiMDpmaWxlT3BlbmVkPSVkIFwiJXNcIiAlcyAlc1xuIiwgMCwKKwkJcSwKKwkJIlQiLCAgLyogb3BlbiBpbiBOZXRCZWFucyAqLworCQkiRiIpOyAvKiBtb2RpZmllZCAqLworCWlmIChjdXJidWYtPmJfZmZuYW1lICE9IE5VTEwpCisJICAgIHZpbV9mcmVlKHEpOworCW5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisJbmJfc2VuZChidWYsICJuZXRiZWFuc19rZXljb21tYW5kIik7CisKKwlwb3N0cG9uZV9rZXljb21tYW5kKGtleSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIHN5bmMgdGhlIGN1cnNvciBwb3NpdGlvbiAqLworICAgIG9mZiA9IHBvczJvZmYoY3VyYnVmLCAmY3Vyd2luLT53X2N1cnNvcik7CisgICAgc3ByaW50ZihidWYsICIlZDpuZXdEb3RBbmRNYXJrPSVkICVsZCAlbGRcbiIsIGJ1Zm5vLCBjbWRubywgb2ZmLCBvZmYpOworICAgIG5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisgICAgbmJfc2VuZChidWYsICJuZXRiZWFuc19rZXljb21tYW5kIik7CisKKyAgICAvKiBUbyB3b3JrIG9uIFdpbjMyIHlvdSBtdXN0IGFwcGx5IHBhdGNoIHRvIEV4dEVkaXRvciBtb2R1bGUKKyAgICAgKiBmcm9tIEV4dEVkQ2FyZXQuamF2YS5kaWZmIC0gbWFrZSBFVlRfbmV3RG90QW5kTWFyayBoYW5kbGVyCisgICAgICogbW9yZSBzeW5jaHJvbm91cworICAgICAqLworCisgICAgLyogbm93IHNlbmQga2V5Q29tbWFuZCBldmVudCAqLworICAgIHNwcmludGYoYnVmLCAiJWQ6a2V5Q29tbWFuZD0lZCBcIiVzXCJcbiIsIGJ1Zm5vLCBjbWRubywga2V5TmFtZSk7CisgICAgbmJkZWJ1ZygoIkVWVDogJXMiLCBidWYpKTsKKyAgICBuYl9zZW5kKGJ1ZiwgIm5ldGJlYW5zX2tleWNvbW1hbmQiKTsKKworICAgIC8qIE5ldzogZG8gYm90aCBhdCBvbmNlIGFuZCBpbmNsdWRlIHRoZSBsbnVtL2NvbC4gKi8KKyAgICBzcHJpbnRmKGJ1ZiwgIiVkOmtleUF0UG9zPSVkIFwiJXNcIiAlbGQgJWxkLyVsZFxuIiwgYnVmbm8sIGNtZG5vLCBrZXlOYW1lLAorCQlvZmYsIChsb25nKWN1cndpbi0+d19jdXJzb3IubG51bSwgKGxvbmcpY3Vyd2luLT53X2N1cnNvci5jb2wpOworICAgIG5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisgICAgbmJfc2VuZChidWYsICJuZXRiZWFuc19rZXljb21tYW5kIik7Cit9CisKKworLyoKKyAqIFNlbmQgYSBzYXZlIGV2ZW50IHRvIG5ldGJlYW5zLgorICovCisgICAgdm9pZAorbmV0YmVhbnNfc2F2ZV9idWZmZXIoYnVmX1QgKmJ1ZnApCit7CisgICAgY2hhcl91CWJ1Zls2NF07CisgICAgaW50CQlidWZubzsKKyAgICBuYmJ1Zl9UCSpuYmJ1ZjsKKworICAgIG5iYnVmID0gbmJfYnVmcDJuYmJ1Zl9maXJlKGJ1ZnAsICZidWZubyk7CisgICAgaWYgKG5iYnVmID09IE5VTEwpCisJcmV0dXJuOworCisgICAgbmJidWYtPm1vZGlmaWVkID0gMDsKKworICAgIHNwcmludGYoKGNoYXIgKilidWYsICIlZDpzYXZlPSVkXG4iLCBidWZubywgY21kbm8pOworICAgIG5iZGVidWcoKCJFVlQ6ICVzIiwgYnVmKSk7CisgICAgbmJfc2VuZCgoY2hhciAqKWJ1ZiwgIm5ldGJlYW5zX3NhdmVfYnVmZmVyIik7Cit9CisKKworLyoKKyAqIFNlbmQgcmVtb3ZlIGNvbW1hbmQgdG8gbmV0YmVhbnMgKHRoaXMgY29tbWFuZCBoYXMgYmVlbiB0dXJuZWQgb2ZmKS4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2RlbGV0ZWRfYWxsX2xpbmVzKGJ1Zl9UICpidWZwKQoreworICAgIGNoYXJfdQlidWZbNjRdOworICAgIGludAkJYnVmbm87CisgICAgbmJidWZfVAkqbmJidWY7CisKKyAgICBuYmJ1ZiA9IG5iX2J1ZnAybmJidWZfZmlyZShidWZwLCAmYnVmbm8pOworICAgIGlmIChuYmJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIG5iYnVmLT5tb2RpZmllZCA9IDE7CisKKyAgICBzcHJpbnRmKChjaGFyICopYnVmLCAiJWQ6cmVtb3ZlPSVkIDAgLTFcbiIsIGJ1Zm5vLCBjbWRubyk7CisgICAgbmJkZWJ1ZygoIkVWVChzdXBwcmVzc2VkKTogJXMiLCBidWYpKTsKKy8qICAgICBuYl9zZW5kKGJ1ZiwgIm5ldGJlYW5zX2RlbGV0ZWRfYWxsX2xpbmVzIik7ICovCit9CisKKworLyoKKyAqIFNlZSBpZiB0aGUgbGluZXMgYXJlIGd1YXJkZWQuIFRoZSB0b3AgYW5kIGJvdCBwYXJhbWV0ZXJzIGFyZSBmcm9tCisgKiB1X3NhdmVjb21tb24oKSwgdGhlc2UgYXJlIHRoZSBsaW5lIGFib3ZlIHRoZSBjaGFuZ2UgYW5kIHRoZSBsaW5lIGJlbG93IHRoZQorICogY2hhbmdlLgorICovCisgICAgaW50CituZXRiZWFuc19pc19ndWFyZGVkKGxpbmVucl9UIHRvcCwgbGluZW5yX1QgYm90KQoreworICAgIHNpZ25saXN0X1QJKnA7CisgICAgaW50CQlsbnVtOworCisgICAgZm9yIChwID0gY3VyYnVmLT5iX3NpZ25saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCWlmIChwLT5pZCA+PSBHVUFSREVET0ZGU0VUKQorCSAgICBmb3IgKGxudW0gPSB0b3AgKyAxOyBsbnVtIDwgYm90OyBsbnVtKyspCisJCWlmIChsbnVtID09IHAtPmxudW0pCisJCSAgICByZXR1cm4gVFJVRTsKKworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogV2UgaGF2ZSBtdWx0aXBsZSBzaWducyB0byBkcmF3IGF0IHRoZSBzYW1lIGxvY2F0aW9uLiBEcmF3IHRoZQorICogbXVsdGktc2lnbiBpbmRpY2F0b3IgaW5zdGVhZC4gVGhpcyBpcyB0aGUgTW90aWYgdmVyc2lvbi4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2RyYXdfbXVsdGlzaWduX2luZGljYXRvcihpbnQgcm93KQoreworICAgIGludCBpOworICAgIGludCB5OworICAgIGludCB4OworCisgICAgeCA9IDA7CisgICAgeSA9IHJvdyAqIGd1aS5jaGFyX2hlaWdodCArIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3VpLmNoYXJfaGVpZ2h0IC0gMzsgaSsrKQorCVhEcmF3UG9pbnQoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIHgrMiwgeSsrKTsKKworICAgIFhEcmF3UG9pbnQoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIHgrMCwgeSk7CisgICAgWERyYXdQb2ludChndWkuZHB5LCBndWkud2lkLCBndWkudGV4dF9nYywgeCsyLCB5KTsKKyAgICBYRHJhd1BvaW50KGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCB4KzQsIHkrKyk7CisgICAgWERyYXdQb2ludChndWkuZHB5LCBndWkud2lkLCBndWkudGV4dF9nYywgeCsxLCB5KTsKKyAgICBYRHJhd1BvaW50KGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCB4KzIsIHkpOworICAgIFhEcmF3UG9pbnQoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLnRleHRfZ2MsIHgrMywgeSsrKTsKKyAgICBYRHJhd1BvaW50KGd1aS5kcHksIGd1aS53aWQsIGd1aS50ZXh0X2djLCB4KzIsIHkpOworfQorI2VuZGlmIC8qIEZFQVRfR1VJX01PVElGICovCisKKyNpZmRlZiBGRUFUX0dVSV9HVEsKKy8qCisgKiBXZSBoYXZlIG11bHRpcGxlIHNpZ25zIHRvIGRyYXcgYXQgdGhlIHNhbWUgbG9jYXRpb24uIERyYXcgdGhlCisgKiBtdWx0aS1zaWduIGluZGljYXRvciBpbnN0ZWFkLiBUaGlzIGlzIHRoZSBHVEsvR25vbWUgdmVyc2lvbi4KKyAqLworICAgIHZvaWQKK25ldGJlYW5zX2RyYXdfbXVsdGlzaWduX2luZGljYXRvcihpbnQgcm93KQoreworICAgIGludCBpOworICAgIGludCB5OworICAgIGludCB4OworICAgIEdka0RyYXdhYmxlICpkcmF3YWJsZSA9IGd1aS5kcmF3YXJlYS0+d2luZG93OworCisgICAgeCA9IDA7CisgICAgeSA9IHJvdyAqIGd1aS5jaGFyX2hlaWdodCArIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3VpLmNoYXJfaGVpZ2h0IC0gMzsgaSsrKQorCWdka19kcmF3X3BvaW50KGRyYXdhYmxlLCBndWkudGV4dF9nYywgeCsyLCB5KyspOworCisgICAgZ2RrX2RyYXdfcG9pbnQoZHJhd2FibGUsIGd1aS50ZXh0X2djLCB4KzAsIHkpOworICAgIGdka19kcmF3X3BvaW50KGRyYXdhYmxlLCBndWkudGV4dF9nYywgeCsyLCB5KTsKKyAgICBnZGtfZHJhd19wb2ludChkcmF3YWJsZSwgZ3VpLnRleHRfZ2MsIHgrNCwgeSsrKTsKKyAgICBnZGtfZHJhd19wb2ludChkcmF3YWJsZSwgZ3VpLnRleHRfZ2MsIHgrMSwgeSk7CisgICAgZ2RrX2RyYXdfcG9pbnQoZHJhd2FibGUsIGd1aS50ZXh0X2djLCB4KzIsIHkpOworICAgIGdka19kcmF3X3BvaW50KGRyYXdhYmxlLCBndWkudGV4dF9nYywgeCszLCB5KyspOworICAgIGdka19kcmF3X3BvaW50KGRyYXdhYmxlLCBndWkudGV4dF9nYywgeCsyLCB5KTsKK30KKyNlbmRpZiAvKiBGRUFUX0dVSV9HVEsgKi8KKworLyoKKyAqIElmIHRoZSBtb3VzZSBpcyBjbGlja2VkIGluIHRoZSBndXR0ZXIgb2YgYSBsaW5lIHdpdGggbXVsdGlwbGUKKyAqIGFubm90YXRpb25zLCBjeWNsZSB0aHJvdWdoIHRoZSBzZXQgb2Ygc2lnbnMuCisgKi8KKyAgICB2b2lkCituZXRiZWFuc19ndXR0ZXJfY2xpY2sobGluZW5yX1QgbG51bSkKK3sKKyAgICBzaWdubGlzdF9UCSpwOworCisgICAgZm9yIChwID0gY3VyYnVmLT5iX3NpZ25saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorICAgIHsKKwlpZiAocC0+bG51bSA9PSBsbnVtICYmIHAtPm5leHQgJiYgcC0+bmV4dC0+bG51bSA9PSBsbnVtKQorCXsKKwkgICAgc2lnbmxpc3RfVCAqdGFpbDsKKworCSAgICAvKiByZW1vdmUgInAiIGZyb20gbGlzdCwgcmVpbnNlcnQgaXQgYXQgdGhlIHRhaWwgb2YgdGhlIHN1Ymxpc3QgKi8KKwkgICAgaWYgKHAtPnByZXYpCisJCXAtPnByZXYtPm5leHQgPSBwLT5uZXh0OworCSAgICBlbHNlCisJCWN1cmJ1Zi0+Yl9zaWdubGlzdCA9IHAtPm5leHQ7CisJICAgIHAtPm5leHQtPnByZXYgPSBwLT5wcmV2OworCSAgICAvKiBub3cgZmluZCBlbmQgb2Ygc3VibGlzdCBhbmQgaW5zZXJ0IHAgKi8KKwkgICAgZm9yICh0YWlsID0gcC0+bmV4dDsKKwkJICB0YWlsLT5uZXh0ICYmIHRhaWwtPm5leHQtPmxudW0gPT0gbG51bQorCQkJCQkgICAgJiYgdGFpbC0+bmV4dC0+aWQgPCBHVUFSREVET0ZGU0VUOworCQkgIHRhaWwgPSB0YWlsLT5uZXh0KQorCQk7CisJICAgIC8qIHRhaWwgbm93IHBvaW50cyB0byBsYXN0IGVudHJ5IHdpdGggc2FtZSBsbnVtIChleGNlcHQKKwkgICAgICogdGhhdCAiZ3VhcmRlZCIgYW5ub3RhdGlvbnMgYXJlIGFsd2F5cyBsYXN0KSAqLworCSAgICBwLT5uZXh0ID0gdGFpbC0+bmV4dDsKKwkgICAgaWYgKHRhaWwtPm5leHQpCisJCXRhaWwtPm5leHQtPnByZXYgPSBwOworCSAgICBwLT5wcmV2ID0gdGFpbDsKKwkgICAgdGFpbC0+bmV4dCA9IHA7CisJICAgIHVwZGF0ZV9kZWJ1Z19zaWduKGN1cmJ1ZiwgbG51bSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIEFkZCBhIHNpZ24gb2YgdGhlIHJlcWVzdGVkIHR5cGUgYXQgdGhlIHJlcXVlc3RlZCBsb2NhdGlvbi4KKyAqCisgKiBSZXZlcnNlIGVuZ2luZWVyaW5nOgorICogQXBwYXJlbnRseSBhbiBhbm5vdGF0aW9uIGlzIGRlZmluZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgdXNlZCBpbiBhIGJ1ZmZlci4KKyAqIFdoZW4gdGhlIHNhbWUgYW5ub3RhdGlvbiBpcyB1c2VkIGluIHR3byBidWZmZXJzLCB0aGUgc2Vjb25kIHRpbWUgd2UgZG8gbm90CisgKiBuZWVkIHRvIGRlZmluZSBhIG5ldyBzaWduIG5hbWUgYnV0IHJldXNlIHRoZSBleGlzdGluZyBvbmUuICBCdXQgc2luY2UgdGhlCisgKiBJRCBudW1iZXIgdXNlZCBpbiB0aGUgc2Vjb25kIGJ1ZmZlciBzdGFydHMgY291bnRpbmcgYXQgb25lIGFnYWluLCBhIG1hcHBpbmcKKyAqIGlzIG1hZGUgZnJvbSB0aGUgSUQgc3BlY2lmaWNhbGx5IGZvciB0aGUgYnVmZmVyIHRvIHRoZSBnbG9iYWwgc2lnbiBuYW1lCisgKiAod2hpY2ggaXMgYSBudW1iZXIpLgorICoKKyAqIGdsb2JhbHNpZ25tYXBbXQlzdG9yZXMgdGhlIHNpZ25zIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgZ2xvYmFsbHkuCisgKiBidWYtPnNpZ25tYXB1c2VkW10JbWFwcyBidWZmZXItbG9jYWwgYW5ub3RhdGlvbiBJRHMgdG8gYW4gaW5kZXggaW4KKyAqCQkJZ2xvYmFsc2lnbm1hcFtdLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorYWRkc2lnbnR5cGUoCisgICAgbmJidWZfVAkqYnVmLAorICAgIGludAkJdHlwZU51bSwKKyAgICBjaGFyX3UJKnR5cGVOYW1lLAorICAgIGNoYXJfdQkqdG9vbHRpcCwKKyAgICBjaGFyX3UJKmdseXBoRmlsZSwKKyAgICBpbnQJCXVzZV9mZywKKyAgICBpbnQJCWZnLAorICAgIGludAkJdXNlX2JnLAorICAgIGludAkJYmcpCit7CisgICAgY2hhciBmZ2J1ZlszMl07CisgICAgY2hhciBiZ2J1ZlszMl07CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsc2lnbm1hcHVzZWQ7IGkrKykKKwlpZiAoU1RSQ01QKHR5cGVOYW1lLCBnbG9iYWxzaWdubWFwW2ldKSA9PSAwKQorCSAgICBicmVhazsKKworICAgIGlmIChpID09IGdsb2JhbHNpZ25tYXB1c2VkKSAvKiBub3QgZm91bmQ7IGFkZCBpdCB0byBnbG9iYWwgbWFwICovCisgICAgeworCW5iZGVidWcoKCJERUZJTkVBTk5PVFlQRSglZCwlcywlcywlcywlZCwlZClcbiIsCisJCQkgICAgdHlwZU51bSwgdHlwZU5hbWUsIHRvb2x0aXAsIGdseXBoRmlsZSwgZmcsIGJnKSk7CisJaWYgKHVzZV9mZyB8fCB1c2VfYmcpCisJeworCSAgICBzcHJpbnRmKGZnYnVmLCAiZ3VpZmc9IyUwNngiLCBmZyAmIDB4RkZGRkZGKTsKKwkgICAgc3ByaW50ZihiZ2J1ZiwgImd1aWJnPSMlMDZ4IiwgYmcgJiAweEZGRkZGRik7CisKKwkgICAgY29sb25jbWQoIjpoaWdobGlnaHQgTkJfJXMgJXMgJXMiLCB0eXBlTmFtZSwgKHVzZV9mZykgPyBmZ2J1ZiA6ICIiLAorCQkgICAgICh1c2VfYmcpID8gYmdidWYgOiAiIik7CisJICAgIGlmICgqZ2x5cGhGaWxlID09IE5VTCkKKwkJLyogbm8gZ2x5cGgsIGxpbmUgaGlnaGxpZ2h0aW5nIG9ubHkgKi8KKwkJY29sb25jbWQoIjpzaWduIGRlZmluZSAlZCBsaW5laGw9TkJfJXMiLCBpICsgMSwgdHlwZU5hbWUpOworCSAgICBlbHNlIGlmICh2aW1fc3Ryc2l6ZShnbHlwaEZpbGUpIDw9IDIpCisJCS8qIG9uZS0gb3IgdHdvLWNoYXJhY3RlciBnbHlwaCBuYW1lLCB1c2UgYXMgdGV4dCBnbHlwaCB3aXRoCisJCSAqIHRleHRobCAqLworCQljb2xvbmNtZCgiOnNpZ24gZGVmaW5lICVkIHRleHQ9JXMgdGV4dGhsPU5CXyVzIiwgaSArIDEsCisJCQkJCQkJIGdseXBoRmlsZSwgdHlwZU5hbWUpOworCSAgICBlbHNlCisJCS8qIGdseXBoLCBsaW5lIGhpZ2hsaWdodGluZyAqLworCQljb2xvbmNtZCgiOnNpZ24gZGVmaW5lICVkIGljb249JXMgbGluZWhsPU5CXyVzIiwgaSArIDEsCisJCQkJCQkJIGdseXBoRmlsZSwgdHlwZU5hbWUpOworCX0KKwllbHNlCisJICAgIC8qIGdseXBoLCBubyBsaW5lIGhpZ2hsaWdodGluZyAqLworCSAgICBjb2xvbmNtZCgiOnNpZ24gZGVmaW5lICVkIGljb249JXMiLCBpICsgMSwgZ2x5cGhGaWxlKTsKKworCWlmIChTVFJDTVAodHlwZU5hbWUsIkN1cnJlbnRQQyIpID09IDApCisJICAgIGN1clBDdHlwZSA9IHR5cGVOdW07CisKKwlpZiAoZ2xvYmFsc2lnbm1hcHVzZWQgPT0gZ2xvYmFsc2lnbm1hcGxlbikKKwl7CisJICAgIGlmIChnbG9iYWxzaWdubWFwbGVuID09IDApIC8qIGZpcnN0IGFsbG9jYXRpb24gKi8KKwkgICAgeworCQlnbG9iYWxzaWdubWFwbGVuID0gMjA7CisJCWdsb2JhbHNpZ25tYXAgPSAoY2hhciAqKilhbGxvY19jbGVhcihnbG9iYWxzaWdubWFwbGVuKnNpemVvZihjaGFyICopKTsKKwkgICAgfQorCSAgICBlbHNlICAgIC8qIGdyb3cgaXQgKi8KKwkgICAgeworCQlpbnQgaW5jcjsKKwkJaW50IG9sZGxlbiA9IGdsb2JhbHNpZ25tYXBsZW47CisKKwkJZ2xvYmFsc2lnbm1hcGxlbiAqPSAyOworCQlpbmNyID0gZ2xvYmFsc2lnbm1hcGxlbiAtIG9sZGxlbjsKKwkJZ2xvYmFsc2lnbm1hcCA9IChjaGFyICoqKXZpbV9yZWFsbG9jKGdsb2JhbHNpZ25tYXAsCisJCQkJCSAgIGdsb2JhbHNpZ25tYXBsZW4gKiBzaXplb2YoY2hhciAqKSk7CisJCW1lbXNldChnbG9iYWxzaWdubWFwICsgb2xkbGVuLCAwLCBpbmNyICogc2l6ZW9mKGNoYXIgKikpOworCSAgICB9CisJfQorCisJZ2xvYmFsc2lnbm1hcFtpXSA9IChjaGFyICopdHlwZU5hbWU7CisJZ2xvYmFsc2lnbm1hcHVzZWQgPSBpICsgMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBsb2NhbCBtYXA7IHNob3VsZCAqbm90KiBiZSBmb3VuZCEgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgYnVmLT5zaWdubWFwdXNlZDsgaisrKQorCWlmIChidWYtPnNpZ25tYXBbal0gPT0gaSArIDEpCisJICAgIHJldHVybjsKKworICAgIC8qIGFkZCB0byBsb2NhbCBtYXAgKi8KKyAgICBpZiAoYnVmLT5zaWdubWFwdXNlZCA9PSBidWYtPnNpZ25tYXBsZW4pCisgICAgeworCWlmIChidWYtPnNpZ25tYXBsZW4gPT0gMCkgLyogZmlyc3QgYWxsb2NhdGlvbiAqLworCXsKKwkgICAgYnVmLT5zaWdubWFwbGVuID0gNTsKKwkgICAgYnVmLT5zaWdubWFwID0gKGludCAqKWFsbG9jX2NsZWFyKGJ1Zi0+c2lnbm1hcGxlbiAqIHNpemVvZihpbnQgKikpOworCX0KKwllbHNlICAgIC8qIGdyb3cgaXQgKi8KKwl7CisJICAgIGludCBpbmNyOworCSAgICBpbnQgb2xkbGVuID0gYnVmLT5zaWdubWFwbGVuOworCSAgICBidWYtPnNpZ25tYXBsZW4gKj0gMjsKKwkgICAgaW5jciA9IGJ1Zi0+c2lnbm1hcGxlbiAtIG9sZGxlbjsKKwkgICAgYnVmLT5zaWdubWFwID0gKGludCAqKXZpbV9yZWFsbG9jKGJ1Zi0+c2lnbm1hcCwKKwkJCQkJICAgICAgIGJ1Zi0+c2lnbm1hcGxlbipzaXplb2YoaW50ICopKTsKKwkgICAgbWVtc2V0KGJ1Zi0+c2lnbm1hcCArIG9sZGxlbiwgMCwgaW5jciAqIHNpemVvZihpbnQgKikpOworCX0KKyAgICB9CisKKyAgICBidWYtPnNpZ25tYXBbYnVmLT5zaWdubWFwdXNlZCsrXSA9IGkgKyAxOworCit9CisKKworLyoKKyAqIFNlZSBpZiB3ZSBoYXZlIHRoZSByZXF1ZXN0ZWQgc2lnbiB0eXBlIGluIHRoZSBidWZmZXIuCisgKi8KKyAgICBzdGF0aWMgaW50CittYXBzaWdudHlwZShuYmJ1Zl9UICpidWYsIGludCBsb2NhbHNpZ250eXBlKQoreworICAgIGlmICgtLWxvY2Fsc2lnbnR5cGUgPj0gMCAmJiBsb2NhbHNpZ250eXBlIDwgYnVmLT5zaWdubWFwdXNlZCkKKwlyZXR1cm4gYnVmLT5zaWdubWFwW2xvY2Fsc2lnbnR5cGVdOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENvbXB1dGUgbGVuZ3RoIG9mIGJ1ZmZlciwgZG9uJ3QgcHJpbnQgYW55dGhpbmcuCisgKi8KKyAgICBzdGF0aWMgbG9uZworZ2V0X2J1Zl9zaXplKGJ1Zl9UICpidWZwKQoreworICAgIGxpbmVucl9UCWxudW07CisgICAgbG9uZwljaGFyX2NvdW50ID0gMDsKKyAgICBpbnQJCWVvbF9zaXplOworICAgIGxvbmcJbGFzdF9jaGVjayA9IDEwMDAwMEw7CisKKyAgICBpZiAoYnVmcC0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKQorCXJldHVybiAwOworICAgIGVsc2UKKyAgICB7CisJaWYgKGdldF9maWxlZm9ybWF0KGJ1ZnApID09IEVPTF9ET1MpCisJICAgIGVvbF9zaXplID0gMjsKKwllbHNlCisJICAgIGVvbF9zaXplID0gMTsKKwlmb3IgKGxudW0gPSAxOyBsbnVtIDw9IGJ1ZnAtPmJfbWwubWxfbGluZV9jb3VudDsgKytsbnVtKQorCXsKKwkgICAgY2hhcl9jb3VudCArPSBTVFJMRU4obWxfZ2V0KGxudW0pKSArIGVvbF9zaXplOworCSAgICAvKiBDaGVjayBmb3IgYSBDVFJMLUMgZXZlcnkgMTAwMDAwIGNoYXJhY3RlcnMgKi8KKwkgICAgaWYgKGNoYXJfY291bnQgPiBsYXN0X2NoZWNrKQorCSAgICB7CisJCXVpX2JyZWFrY2hlY2soKTsKKwkJaWYgKGdvdF9pbnQpCisJCSAgICByZXR1cm4gY2hhcl9jb3VudDsKKwkJbGFzdF9jaGVjayA9IGNoYXJfY291bnQgKyAxMDAwMDBMOworCSAgICB9CisJfQorCS8qIENvcnJlY3Rpb24gZm9yIHdoZW4gbGFzdCBsaW5lIGRvZXNuJ3QgaGF2ZSBhbiBFT0wuICovCisJaWYgKCFidWZwLT5iX3BfZW9sICYmIGJ1ZnAtPmJfcF9iaW4pCisJICAgIGNoYXJfY291bnQgLT0gZW9sX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGNoYXJfY291bnQ7Cit9CisKKy8qCisgKiBDb252ZXJ0IGNoYXJhY3RlciBvZmZzZXQgdG8gbG51bSxjb2wKKyAqLworICAgIHN0YXRpYyBwb3NfVCAqCitvZmYycG9zKGJ1Zl9UICpidWYsIGxvbmcgb2Zmc2V0KQoreworICAgIGxpbmVucl9UCSBsbnVtOworICAgIHN0YXRpYyBwb3NfVCBwb3M7CisKKyAgICBwb3MubG51bSA9IDA7CisgICAgcG9zLmNvbCA9IDA7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIHBvcy5jb2xhZGQgPSAwOworI2VuZGlmCisKKyAgICBpZiAoIShidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkpCisgICAgeworCWlmICgobG51bSA9IG1sX2ZpbmRfbGluZV9vcl9vZmZzZXQoYnVmLCAobGluZW5yX1QpMCwgJm9mZnNldCkpIDwgMCkKKwkgICAgcmV0dXJuIE5VTEw7CisJcG9zLmxudW0gPSBsbnVtOworCXBvcy5jb2wgPSBvZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuICZwb3M7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIGFyZ3VtZW50IGluIHRoZSBmb3JtICIxMjM0IiB0byBhbiBvZmZzZXQgYW5kIGNvbXB1dGUgdGhlCisgKiBsbnVtL2NvbCBmcm9tIGl0LiAgQ29udmVydCBhbiBhcmd1bWVudCBpbiB0aGUgZm9ybSAiMTIzLzEyIiBkaXJlY3RseSB0byBhCisgKiBsbnVtL2NvbC4KKyAqICJhcmdwIiBpcyBhZHZhbmNlZCB0byBhZnRlciB0aGUgYXJndW1lbnQuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiwgTlVMTCBpZiBzb21ldGhpbmcgaXMgd3JvbmcuCisgKi8KKyAgICBzdGF0aWMgcG9zX1QgKgorZ2V0X29mZl9vcl9sbnVtKGJ1Zl9UICpidWYsIGNoYXJfdSAqKmFyZ3ApCit7CisgICAgc3RhdGljIHBvc19UCW15cG9zOworICAgIGxvbmcJCW9mZjsKKworICAgIG9mZiA9IHN0cnRvbCgoY2hhciAqKSphcmdwLCAoY2hhciAqKilhcmdwLCAxMCk7CisgICAgaWYgKCoqYXJncCA9PSAnLycpCisgICAgeworCW15cG9zLmxudW0gPSAobGluZW5yX1Qpb2ZmOworCSsrKmFyZ3A7CisJbXlwb3MuY29sID0gc3RydG9sKChjaGFyICopKmFyZ3AsIChjaGFyICoqKWFyZ3AsIDEwKTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJbXlwb3MuY29sYWRkID0gMDsKKyNlbmRpZgorCXJldHVybiAmbXlwb3M7CisgICAgfQorICAgIHJldHVybiBvZmYycG9zKGJ1Ziwgb2ZmKTsKK30KKworCisvKgorICogQ29udmVydCBsbnVtLGNvbCB0byBjaGFyYWN0ZXIgb2Zmc2V0CisgKi8KKyAgICBzdGF0aWMgbG9uZworcG9zMm9mZihidWZfVCAqYnVmLCBwb3NfVCAqcG9zKQoreworICAgIGxvbmcJIG9mZnNldCA9IDA7CisKKyAgICBpZiAoIShidWYtPmJfbWwubWxfZmxhZ3MgJiBNTF9FTVBUWSkpCisgICAgeworCWlmICgob2Zmc2V0ID0gbWxfZmluZF9saW5lX29yX29mZnNldChidWYsIHBvcy0+bG51bSwgMCkpIDwgMCkKKwkgICAgcmV0dXJuIDA7CisJb2Zmc2V0ICs9IHBvcy0+Y29sOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworI2VuZGlmIC8qIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL25vcm1hbC5jIGIvc3JjL25vcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTk2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbm9ybWFsLmMKQEAgLTAsMCArMSw4NTA4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogbm9ybWFsLmM6CUNvbnRhaW5zIHRoZSBtYWluIHJvdXRpbmUgZm9yIHByb2Nlc3NpbmcgY2hhcmFjdGVycyBpbiBjb21tYW5kCisgKgkJbW9kZS4gIENvbW11bmljYXRlcyBjbG9zZWx5IHdpdGggdGhlIGNvZGUgaW4gb3BzLmMgdG8gaGFuZGxlCisgKgkJdGhlIG9wZXJhdG9ycy4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorLyoKKyAqIFRoZSBWaXN1YWwgYXJlYSBpcyByZW1lbWJlcmVkIGZvciByZXNlbGVjdGlvbi4KKyAqLworc3RhdGljIGludAlyZXNlbF9WSXN1YWxfbW9kZSA9IE5VTDsJLyogJ3YnLCAnVicsIG9yIEN0cmwtViAqLworc3RhdGljIGxpbmVucl9UCXJlc2VsX1ZJc3VhbF9saW5lX2NvdW50OwkvKiBudW1iZXIgb2YgbGluZXMgKi8KK3N0YXRpYyBjb2xucl9UCXJlc2VsX1ZJc3VhbF9jb2w7CQkvKiBuciBvZiBjb2xzIG9yIGVuZCBjb2wgKi8KKworc3RhdGljIGludAlyZXN0YXJ0X1ZJc3VhbF9zZWxlY3QgPSAwOworI2VuZGlmCisKK3N0YXRpYyBpbnQKKyMgaWZkZWYgX19CT1JMQU5EQ19fCitfUlRMRU5UUllGCisjIGVuZGlmCisJCW52X2NvbXBhcmUgX19BUkdTKChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIpKTsKK3N0YXRpYyBpbnQJZmluZF9jb21tYW5kIF9fQVJHUygoaW50IGNtZGNoYXIpKTsKK3N0YXRpYyB2b2lkCW9wX2NvbG9uIF9fQVJHUygob3BhcmdfVCAqb2FwKSk7CisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSAmJiBkZWZpbmVkKEZFQVRfVklTVUFMKQorc3RhdGljIHZvaWQJZmluZF9zdGFydF9vZl93b3JkIF9fQVJHUygocG9zX1QgKikpOworc3RhdGljIHZvaWQJZmluZF9lbmRfb2Zfd29yZCBfX0FSR1MoKHBvc19UICopKTsKK3N0YXRpYyBpbnQJZ2V0X21vdXNlX2NsYXNzIF9fQVJHUygoY2hhcl91ICpwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCXByZXBfcmVkb19jbWQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAlwcmVwX3JlZG8gX19BUkdTKChpbnQgcmVnbmFtZSwgbG9uZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQpKTsKK3N0YXRpYyBpbnQJY2hlY2tjbGVhcm9wIF9fQVJHUygob3BhcmdfVCAqb2FwKSk7CitzdGF0aWMgaW50CWNoZWNrY2xlYXJvcHEgX19BUkdTKChvcGFyZ19UICpvYXApKTsKK3N0YXRpYyB2b2lkCWNsZWFyb3AgX19BUkdTKChvcGFyZ19UICpvYXApKTsKK3N0YXRpYyB2b2lkCWNsZWFyb3BiZWVwIF9fQVJHUygob3BhcmdfVCAqb2FwKSk7CisjaWZkZWYgRkVBVF9WSVNVQUwKK3N0YXRpYyB2b2lkCXVuc2hpZnRfc3BlY2lhbCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ01ETF9JTkZPCitzdGF0aWMgdm9pZAlkZWxfZnJvbV9zaG93Y21kIF9fQVJHUygoaW50KSk7CisjZW5kaWYKKworLyoKKyAqIG52XyooKTogZnVuY3Rpb25zIGNhbGxlZCB0byBoYW5kbGUgTm9ybWFsIGFuZCBWaXN1YWwgbW9kZSBjb21tYW5kcy4KKyAqIG5fKigpOiBmdW5jdGlvbnMgY2FsbGVkIHRvIGhhbmRsZSBOb3JtYWwgbW9kZSBjb21tYW5kcy4KKyAqIHZfKigpOiBmdW5jdGlvbnMgY2FsbGVkIHRvIGhhbmRsZSBWaXN1YWwgbW9kZSBjb21tYW5kcy4KKyAqLworc3RhdGljIHZvaWQJbnZfaWdub3JlIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfZXJyb3IgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9oZWxwIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfYWRkc3ViIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfcGFnZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2dkIF9fQVJHUygob3BhcmdfVCAqb2FwLCBpbnQgbmNoYXIpKTsKK3N0YXRpYyBpbnQJbnZfc2NyZWVuZ28gX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBkaXIsIGxvbmcgZGlzdCkpOworI2lmZGVmIEZFQVRfTU9VU0UKK3N0YXRpYyB2b2lkCW52X21vdXNlc2Nyb2xsIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfbW91c2UgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCW52X3Njcm9sbF9saW5lIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfemV0IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2lmZGVmIEZFQVRfR1VJCitzdGF0aWMgdm9pZAludl92ZXJfc2Nyb2xsYmFyIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfaG9yX3Njcm9sbGJhciBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJbnZfZXhtb2RlIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfY29sb24gX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9jdHJsZyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2N0cmxoIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfY2xlYXIgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9jdHJsbyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2hhdCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X1pldCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2lkZW50IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2lmZGVmIEZFQVRfVklTVUFMCitzdGF0aWMgaW50CWdldF92aXN1YWxfdGV4dCBfX0FSR1MoKGNtZGFyZ19UICpjYXAsIGNoYXJfdSAqKnBwLCBpbnQgKmxlbnApKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJbnZfdGFncG9wIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfc2Nyb2xsIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfcmlnaHQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9sZWZ0IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfdXAgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9kb3duIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorc3RhdGljIHZvaWQJbnZfZ290b2ZpbGUgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCW52X2VuZCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2RvbGxhciBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X3NlYXJjaCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X25leHQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAlub3JtYWxfc2VhcmNoIF9fQVJHUygoY21kYXJnX1QgKmNhcCwgaW50IGRpciwgY2hhcl91ICpwYXQsIGludCBvcHQpKTsKK3N0YXRpYyB2b2lkCW52X2NzZWFyY2ggX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9icmFja2V0cyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X3BlcmNlbnQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9icmFjZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X21hcmsgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9maW5kcGFyIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfdW5kbyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2t1bmRvIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfUmVwbGFjZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCitzdGF0aWMgdm9pZAludl92cmVwbGFjZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCitzdGF0aWMgdm9pZAl2X3N3YXBfY29ybmVycyBfX0FSR1MoKGludCBjbWRjaGFyKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCW52X3JlcGxhY2UgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAluX3N3YXBjaGFyIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfY3Vyc29ybWFyayBfX0FSR1MoKGNtZGFyZ19UICpjYXAsIGludCBmbGFnLCBwb3NfVCAqcG9zKSk7CisjaWZkZWYgRkVBVF9WSVNVQUwKK3N0YXRpYyB2b2lkCXZfdmlzb3AgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCW52X3N1YnN0IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfYWJicmV2IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfb3B0cmFucyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2dvbWFyayBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X3BjbWFyayBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X3JlZ25hbWUgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CisjaWZkZWYgRkVBVF9WSVNVQUwKK3N0YXRpYyB2b2lkCW52X3Zpc3VhbCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW5fc3RhcnRfdmlzdWFsX21vZGUgX19BUkdTKChpbnQgYykpOworI2VuZGlmCitzdGF0aWMgdm9pZAludl93aW5kb3cgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9zdXNwZW5kIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfZ19jbWQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAluX29wZW5jbWQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9kb3QgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9yZWRvIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfVW5kbyBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X3RpbGRlIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfb3BlcmF0b3IgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9saW5lb3AgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9ob21lIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfcGlwZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2Jja193b3JkIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfd29yZGNtZCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2JlZ2lubGluZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorc3RhdGljIHZvaWQJYWRqdXN0X2Zvcl9zZWwgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgaW50CXVuYWRqdXN0X2Zvcl9zZWwgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAludl9zZWxlY3QgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCW52X2dvdG8gX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9ub3JtYWwgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9lc2MgX19BUkdTKChjbWRhcmdfVCAqb2FwKSk7CitzdGF0aWMgdm9pZAludl9lZGl0IF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJaW52b2tlX2VkaXQgX19BUkdTKChjbWRhcmdfVCAqY2FwLCBpbnQgcmVwbCwgaW50IGNtZCwgaW50IHN0YXJ0bG4pKTsKKyNpZmRlZiBGRUFUX1RFWFRPQkoKK3N0YXRpYyB2b2lkCW52X29iamVjdCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJbnZfcmVjb3JkIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworc3RhdGljIHZvaWQJbnZfYXQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9oYWxmcGFnZSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK3N0YXRpYyB2b2lkCW52X2pvaW4gX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9wdXQgX19BUkdTKChjbWRhcmdfVCAqY2FwKSk7CitzdGF0aWMgdm9pZAludl9vcGVuIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2lmZGVmIEZFQVRfU05JRkYKK3N0YXRpYyB2b2lkCW52X3NuaWZmIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCitzdGF0aWMgdm9pZAludl9uYmNtZCBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRE5ECitzdGF0aWMgdm9pZAludl9kcm9wIF9fQVJHUygoY21kYXJnX1QgKmNhcCkpOworI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGEgTm9ybWFsIG9yIFZpc3VhbCBtb2RlIGNvbW1hbmQuCisgKiBUaGUgYXJndW1lbnQgaXMgYSBjbWRhcmdfVC4KKyAqLwordHlwZWRlZiB2b2lkICgqbnZfZnVuY19UKSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKKworLyogVmFsdWVzIGZvciBjbWRfZmxhZ3MuICovCisjZGVmaW5lIE5WX05DSAkgICAgMHgwMQkgIC8qIG1heSBuZWVkIHRvIGdldCBhIHNlY29uZCBjaGFyICovCisjZGVmaW5lIE5WX05DSF9OT1AgICgweDAyfE5WX05DSCkgLyogZ2V0IHNlY29uZCBjaGFyIHdoZW4gbm8gb3BlcmF0b3IgcGVuZGluZyAqLworI2RlZmluZSBOVl9OQ0hfQUxXICAoMHgwNHxOVl9OQ0gpIC8qIGFsd2F5cyBnZXQgYSBzZWNvbmQgY2hhciAqLworI2RlZmluZSBOVl9MQU5HCSAgICAweDA4CS8qIHNlY29uZCBjaGFyIG5lZWRzIGxhbmd1YWdlIGFkanVzdG1lbnQgKi8KKworI2RlZmluZSBOVl9TUwkgICAgMHgxMAkvKiBtYXkgc3RhcnQgc2VsZWN0aW9uICovCisjZGVmaW5lIE5WX1NTUwkgICAgMHgyMAkvKiBtYXkgc3RhcnQgc2VsZWN0aW9uIHdpdGggc2hpZnQgbW9kaWZpZXIgKi8KKyNkZWZpbmUgTlZfU1RTCSAgICAweDQwCS8qIG1heSBzdG9wIHNlbGVjdGlvbiB3aXRob3V0IHNoaWZ0IG1vZGlmLiAqLworI2RlZmluZSBOVl9STAkgICAgMHg4MAkvKiAncmlnaHRsZWZ0JyBtb2RpZmllcyBjb21tYW5kICovCisjZGVmaW5lIE5WX0tFRVBSRUcgIDB4MTAwCS8qIGRvbid0IGNsZWFyIHJlZ25hbWUgKi8KKyNkZWZpbmUgTlZfTkNXCSAgICAweDIwMAkvKiBub3QgYWxsb3dlZCBpbiBjb21tYW5kLWxpbmUgd2luZG93ICovCisKKy8qCisgKiBHZW5lcmFsbHkgc3BlYWtpbmcsIGV2ZXJ5IE5vcm1hbCBtb2RlIGNvbW1hbmQgc2hvdWxkIGVpdGhlciBjbGVhciBhbnkKKyAqIHBlbmRpbmcgb3BlcmF0b3IgKHdpdGggKmNsZWFyb3AqKCkpLCBvciBzZXQgdGhlIG1vdGlvbiB0eXBlIHZhcmlhYmxlCisgKiBvYXAtPm1vdGlvbl90eXBlLgorICoKKyAqIFdoZW4gYSBjdXJzb3IgbW90aW9uIGNvbW1hbmQgaXMgbWFkZSwgaXQgaXMgbWFya2VkIGFzIGJlaW5nIGEgY2hhcmFjdGVyIG9yCisgKiBsaW5lIG9yaWVudGVkIG1vdGlvbi4gIFRoZW4sIGlmIGFuIG9wZXJhdG9yIGlzIGluIGVmZmVjdCwgdGhlIG9wZXJhdGlvbgorICogYmVjb21lcyBjaGFyYWN0ZXIgb3IgbGluZSBvcmllbnRlZCBhY2NvcmRpbmdseS4KKyAqLworCisvKgorICogVGhpcyB0YWJsZSBjb250YWlucyBvbmUgZW50cnkgZm9yIGV2ZXJ5IE5vcm1hbCBvciBWaXN1YWwgbW9kZSBjb21tYW5kLgorICogVGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLCBpbml0X25vcm1hbF9jbWRzKCkgd2lsbCBjcmVhdGUgYSBzb3J0ZWQgaW5kZXguCisgKiBJdCBpcyBmYXN0ZXIgd2hlbiBhbGwga2V5cyBmcm9tIHplcm8gdG8gJ34nIGFyZSBwcmVzZW50LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG52X2NtZAoreworICAgIGludAkJY21kX2NoYXI7CS8qIChmaXJzdCkgY29tbWFuZCBjaGFyYWN0ZXIgKi8KKyAgICBudl9mdW5jX1QgICBjbWRfZnVuYzsJLyogZnVuY3Rpb24gZm9yIHRoaXMgY29tbWFuZCAqLworICAgIHNob3J0X3UJY21kX2ZsYWdzOwkvKiBOVl8gZmxhZ3MgKi8KKyAgICBzaG9ydAljbWRfYXJnOwkvKiB2YWx1ZSBmb3IgY2EuYXJnICovCit9IG52X2NtZHNbXSA9Cit7CisgICAge05VTCwJbnZfZXJyb3IsCTAsCQkJMH0sCisgICAge0N0cmxfQSwJbnZfYWRkc3ViLAkwLAkJCTB9LAorICAgIHtDdHJsX0IsCW52X3BhZ2UsCU5WX1NUUywJCQlCQUNLV0FSRH0sCisgICAge0N0cmxfQywJbnZfZXNjLAkJMCwJCQlUUlVFfSwKKyAgICB7Q3RybF9ELAludl9oYWxmcGFnZSwJMCwJCQkwfSwKKyAgICB7Q3RybF9FLAludl9zY3JvbGxfbGluZSwJMCwJCQlUUlVFfSwKKyAgICB7Q3RybF9GLAludl9wYWdlLAlOVl9TVFMsCQkJRk9SV0FSRH0sCisgICAge0N0cmxfRywJbnZfY3RybGcsCTAsCQkJMH0sCisgICAge0N0cmxfSCwJbnZfY3RybGgsCTAsCQkJMH0sCisgICAge0N0cmxfSSwJbnZfcGNtYXJrLAkwLAkJCTB9LAorICAgIHtOTCwJbnZfZG93biwJMCwJCQlGQUxTRX0sCisgICAge0N0cmxfSywJbnZfZXJyb3IsCTAsCQkJMH0sCisgICAge0N0cmxfTCwJbnZfY2xlYXIsCTAsCQkJMH0sCisgICAge0NBUiwJbnZfZG93biwJMCwJCQlUUlVFfSwKKyAgICB7Q3RybF9OLAludl9kb3duLAlOVl9TVFMsCQkJRkFMU0V9LAorICAgIHtDdHJsX08sCW52X2N0cmxvLAkwLAkJCTB9LAorICAgIHtDdHJsX1AsCW52X3VwLAkJTlZfU1RTLAkJCUZBTFNFfSwKKyAgICB7Q3RybF9RLAludl9pZ25vcmUsCTAsCQkJMH0sCisgICAge0N0cmxfUiwJbnZfcmVkbywJMCwJCQkwfSwKKyAgICB7Q3RybF9TLAludl9pZ25vcmUsCTAsCQkJMH0sCisgICAge0N0cmxfVCwJbnZfdGFncG9wLAlOVl9OQ1csCQkJMH0sCisgICAge0N0cmxfVSwJbnZfaGFsZnBhZ2UsCTAsCQkJMH0sCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICB7Q3RybF9WLAludl92aXN1YWwsCTAsCQkJRkFMU0V9LAorICAgIHsnVicsCW52X3Zpc3VhbCwJMCwJCQlGQUxTRX0sCisgICAgeyd2JywJbnZfdmlzdWFsLAkwLAkJCUZBTFNFfSwKKyNlbHNlCisgICAge0N0cmxfViwJbnZfZXJyb3IsCTAsCQkJMH0sCisgICAgeydWJywJbnZfZXJyb3IsCTAsCQkJMH0sCisgICAgeyd2JywJbnZfZXJyb3IsCTAsCQkJMH0sCisjZW5kaWYKKyAgICB7Q3RybF9XLAludl93aW5kb3csCTAsCQkJMH0sCisgICAge0N0cmxfWCwJbnZfYWRkc3ViLAkwLAkJCTB9LAorICAgIHtDdHJsX1ksCW52X3Njcm9sbF9saW5lLAkwLAkJCUZBTFNFfSwKKyAgICB7Q3RybF9aLAludl9zdXNwZW5kLAkwLAkJCTB9LAorICAgIHtFU0MsCW52X2VzYywJCTAsCQkJRkFMU0V9LAorICAgIHtDdHJsX0JTTCwJbnZfbm9ybWFsLAlOVl9OQ0hfQUxXLAkJMH0sCisgICAge0N0cmxfUlNCLAludl9pZGVudCwJTlZfTkNXLAkJCTB9LAorICAgIHtDdHJsX0hBVCwJbnZfaGF0LAkJTlZfTkNXLAkJCTB9LAorICAgIHtDdHJsX18sCW52X2Vycm9yLAkwLAkJCTB9LAorICAgIHsnICcsCW52X3JpZ2h0LAkwLAkJCTB9LAorICAgIHsnIScsCW52X29wZXJhdG9yLAkwLAkJCTB9LAorICAgIHsnIicsCW52X3JlZ25hbWUsCU5WX05DSF9OT1B8TlZfS0VFUFJFRywJMH0sCisgICAgeycjJywJbnZfaWRlbnQsCTAsCQkJMH0sCisgICAgeyckJywJbnZfZG9sbGFyLAkwLAkJCTB9LAorICAgIHsnJScsCW52X3BlcmNlbnQsCTAsCQkJMH0sCisgICAgeycmJywJbnZfb3B0cmFucywJMCwJCQkwfSwKKyAgICB7J1wnJywJbnZfZ29tYXJrLAlOVl9OQ0hfQUxXLAkJVFJVRX0sCisgICAgeycoJywJbnZfYnJhY2UsCTAsCQkJQkFDS1dBUkR9LAorICAgIHsnKScsCW52X2JyYWNlLAkwLAkJCUZPUldBUkR9LAorICAgIHsnKicsCW52X2lkZW50LAkwLAkJCTB9LAorICAgIHsnKycsCW52X2Rvd24sCTAsCQkJVFJVRX0sCisgICAgeycsJywJbnZfY3NlYXJjaCwJMCwJCQlUUlVFfSwKKyAgICB7Jy0nLAludl91cCwJCTAsCQkJVFJVRX0sCisgICAgeycuJywJbnZfZG90LAkJTlZfS0VFUFJFRywJCTB9LAorICAgIHsnLycsCW52X3NlYXJjaCwJMCwJCQlGQUxTRX0sCisgICAgeycwJywJbnZfYmVnaW5saW5lLAkwLAkJCTB9LAorICAgIHsnMScsCW52X2lnbm9yZSwJMCwJCQkwfSwKKyAgICB7JzInLAludl9pZ25vcmUsCTAsCQkJMH0sCisgICAgeyczJywJbnZfaWdub3JlLAkwLAkJCTB9LAorICAgIHsnNCcsCW52X2lnbm9yZSwJMCwJCQkwfSwKKyAgICB7JzUnLAludl9pZ25vcmUsCTAsCQkJMH0sCisgICAgeyc2JywJbnZfaWdub3JlLAkwLAkJCTB9LAorICAgIHsnNycsCW52X2lnbm9yZSwJMCwJCQkwfSwKKyAgICB7JzgnLAludl9pZ25vcmUsCTAsCQkJMH0sCisgICAgeyc5JywJbnZfaWdub3JlLAkwLAkJCTB9LAorICAgIHsnOicsCW52X2NvbG9uLAkwLAkJCTB9LAorICAgIHsnOycsCW52X2NzZWFyY2gsCTAsCQkJRkFMU0V9LAorICAgIHsnPCcsCW52X29wZXJhdG9yLAlOVl9STCwJCQkwfSwKKyAgICB7Jz0nLAludl9vcGVyYXRvciwJMCwJCQkwfSwKKyAgICB7Jz4nLAludl9vcGVyYXRvciwJTlZfUkwsCQkJMH0sCisgICAgeyc/JywJbnZfc2VhcmNoLAkwLAkJCUZBTFNFfSwKKyAgICB7J0AnLAludl9hdCwJCU5WX05DSF9OT1AsCQlGQUxTRX0sCisgICAgeydBJywJbnZfZWRpdCwJMCwJCQkwfSwKKyAgICB7J0InLAludl9iY2tfd29yZCwJMCwJCQkxfSwKKyAgICB7J0MnLAludl9hYmJyZXYsCU5WX0tFRVBSRUcsCQkwfSwKKyAgICB7J0QnLAludl9hYmJyZXYsCU5WX0tFRVBSRUcsCQkwfSwKKyAgICB7J0UnLAludl93b3JkY21kLAkwLAkJCVRSVUV9LAorICAgIHsnRicsCW52X2NzZWFyY2gsCU5WX05DSF9BTFd8TlZfTEFORywJQkFDS1dBUkR9LAorICAgIHsnRycsCW52X2dvdG8sCTAsCQkJVFJVRX0sCisgICAgeydIJywJbnZfc2Nyb2xsLAkwLAkJCTB9LAorICAgIHsnSScsCW52X2VkaXQsCTAsCQkJMH0sCisgICAgeydKJywJbnZfam9pbiwJMCwJCQkwfSwKKyAgICB7J0snLAludl9pZGVudCwJMCwJCQkwfSwKKyAgICB7J0wnLAludl9zY3JvbGwsCTAsCQkJMH0sCisgICAgeydNJywJbnZfc2Nyb2xsLAkwLAkJCTB9LAorICAgIHsnTicsCW52X25leHQsCTAsCQkJU0VBUkNIX1JFVn0sCisgICAgeydPJywJbnZfb3BlbiwJMCwJCQkwfSwKKyAgICB7J1AnLAludl9wdXQsCQkwLAkJCTB9LAorICAgIHsnUScsCW52X2V4bW9kZSwJTlZfTkNXLAkJCTB9LAorICAgIHsnUicsCW52X1JlcGxhY2UsCTAsCQkJRkFMU0V9LAorICAgIHsnUycsCW52X3N1YnN0LAlOVl9LRUVQUkVHLAkJMH0sCisgICAgeydUJywJbnZfY3NlYXJjaCwJTlZfTkNIX0FMV3xOVl9MQU5HLAlCQUNLV0FSRH0sCisgICAgeydVJywJbnZfVW5kbywJMCwJCQkwfSwKKyAgICB7J1cnLAludl93b3JkY21kLAkwLAkJCVRSVUV9LAorICAgIHsnWCcsCW52X2FiYnJldiwJTlZfS0VFUFJFRywJCTB9LAorICAgIHsnWScsCW52X2FiYnJldiwJTlZfS0VFUFJFRywJCTB9LAorICAgIHsnWicsCW52X1pldCwJCU5WX05DSF9OT1B8TlZfTkNXLAkwfSwKKyAgICB7J1snLAludl9icmFja2V0cywJTlZfTkNIX0FMVywJCUJBQ0tXQVJEfSwKKyAgICB7J1xcJywJbnZfZXJyb3IsCTAsCQkJMH0sCisgICAgeyddJywJbnZfYnJhY2tldHMsCU5WX05DSF9BTFcsCQlGT1JXQVJEfSwKKyAgICB7J14nLAludl9iZWdpbmxpbmUsCTAsCQkJQkxfV0hJVEUgfCBCTF9GSVh9LAorICAgIHsnXycsCW52X2xpbmVvcCwJMCwJCQkwfSwKKyAgICB7J2AnLAludl9nb21hcmssCU5WX05DSF9BTFcsCQlGQUxTRX0sCisgICAgeydhJywJbnZfZWRpdCwJTlZfTkNILAkJCTB9LAorICAgIHsnYicsCW52X2Jja193b3JkLAkwLAkJCTB9LAorICAgIHsnYycsCW52X29wZXJhdG9yLAkwLAkJCTB9LAorICAgIHsnZCcsCW52X29wZXJhdG9yLAkwLAkJCTB9LAorICAgIHsnZScsCW52X3dvcmRjbWQsCTAsCQkJRkFMU0V9LAorICAgIHsnZicsCW52X2NzZWFyY2gsCU5WX05DSF9BTFd8TlZfTEFORywJRk9SV0FSRH0sCisgICAgeydnJywJbnZfZ19jbWQsCU5WX05DSF9BTFcsCQlGQUxTRX0sCisgICAgeydoJywJbnZfbGVmdCwJTlZfUkwsCQkJMH0sCisgICAgeydpJywJbnZfZWRpdCwJTlZfTkNILAkJCTB9LAorICAgIHsnaicsCW52X2Rvd24sCTAsCQkJRkFMU0V9LAorICAgIHsnaycsCW52X3VwLAkJMCwJCQlGQUxTRX0sCisgICAgeydsJywJbnZfcmlnaHQsCU5WX1JMLAkJCTB9LAorICAgIHsnbScsCW52X21hcmssCU5WX05DSF9OT1AsCQkwfSwKKyAgICB7J24nLAludl9uZXh0LAkwLAkJCTB9LAorICAgIHsnbycsCW52X29wZW4sCTAsCQkJMH0sCisgICAgeydwJywJbnZfcHV0LAkJMCwJCQkwfSwKKyAgICB7J3EnLAludl9yZWNvcmQsCU5WX05DSCwJCQkwfSwKKyAgICB7J3InLAludl9yZXBsYWNlLAlOVl9OQ0hfTk9QfE5WX0xBTkcsCTB9LAorICAgIHsncycsCW52X3N1YnN0LAlOVl9LRUVQUkVHLAkJMH0sCisgICAgeyd0JywJbnZfY3NlYXJjaCwJTlZfTkNIX0FMV3xOVl9MQU5HLAlGT1JXQVJEfSwKKyAgICB7J3UnLAludl91bmRvLAkwLAkJCTB9LAorICAgIHsndycsCW52X3dvcmRjbWQsCTAsCQkJRkFMU0V9LAorICAgIHsneCcsCW52X2FiYnJldiwJTlZfS0VFUFJFRywJCTB9LAorICAgIHsneScsCW52X29wZXJhdG9yLAkwLAkJCTB9LAorICAgIHsneicsCW52X3pldCwJCU5WX05DSF9BTFcsCQkwfSwKKyAgICB7J3snLAludl9maW5kcGFyLAkwLAkJCUJBQ0tXQVJEfSwKKyAgICB7J3wnLAludl9waXBlLAkwLAkJCTB9LAorICAgIHsnfScsCW52X2ZpbmRwYXIsCTAsCQkJRk9SV0FSRH0sCisgICAgeyd+JywJbnZfdGlsZGUsCTAsCQkJMH0sCisKKyAgICAvKiBwb3VuZCBzaWduICovCisgICAge1BPVU5ELAludl9pZGVudCwJMCwJCQkwfSwKKyNpZmRlZiBGRUFUX01PVVNFCisgICAge0tfTU9VU0VVUCwgbnZfbW91c2VzY3JvbGwsCTAsCQkJVFJVRX0sCisgICAge0tfTU9VU0VET1dOLCBudl9tb3VzZXNjcm9sbCwgMCwJCQlGQUxTRX0sCisgICAge0tfTEVGVE1PVVNFLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19MRUZUTU9VU0VfTk0sIG52X21vdXNlLAkwLAkJCTB9LAorICAgIHtLX0xFRlREUkFHLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19MRUZUUkVMRUFTRSwgbnZfbW91c2UsCTAsCQkJMH0sCisgICAge0tfTEVGVFJFTEVBU0VfTk0sIG52X21vdXNlLCAwLAkJCTB9LAorICAgIHtLX01JRERMRU1PVVNFLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19NSURETEVEUkFHLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19NSURETEVSRUxFQVNFLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19SSUdIVE1PVVNFLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19SSUdIVERSQUcsIG52X21vdXNlLAkwLAkJCTB9LAorICAgIHtLX1JJR0hUUkVMRUFTRSwgbnZfbW91c2UsCTAsCQkJMH0sCisgICAge0tfWDFNT1VTRSwgbnZfbW91c2UsCTAsCQkJMH0sCisgICAge0tfWDFEUkFHLCBudl9tb3VzZSwJMCwJCQkwfSwKKyAgICB7S19YMVJFTEVBU0UsIG52X21vdXNlLAkwLAkJCTB9LAorICAgIHtLX1gyTU9VU0UsIG52X21vdXNlLAkwLAkJCTB9LAorICAgIHtLX1gyRFJBRywgbnZfbW91c2UsCTAsCQkJMH0sCisgICAge0tfWDJSRUxFQVNFLCBudl9tb3VzZSwJMCwJCQkwfSwKKyNlbmRpZgorICAgIHtLX0lHTk9SRSwJbnZfaWdub3JlLAkwLAkJCTB9LAorICAgIHtLX0lOUywJbnZfZWRpdCwJMCwJCQkwfSwKKyAgICB7S19LSU5TLAludl9lZGl0LAkwLAkJCTB9LAorICAgIHtLX0JTLAludl9jdHJsaCwJMCwJCQkwfSwKKyAgICB7S19VUCwJbnZfdXAsCQlOVl9TU1N8TlZfU1RTLAkJRkFMU0V9LAorICAgIHtLX1NfVVAsCW52X3BhZ2UsCU5WX1NTLAkJCUJBQ0tXQVJEfSwKKyAgICB7S19ET1dOLAludl9kb3duLAlOVl9TU1N8TlZfU1RTLAkJRkFMU0V9LAorICAgIHtLX1NfRE9XTiwJbnZfcGFnZSwJTlZfU1MsCQkJRk9SV0FSRH0sCisgICAge0tfTEVGVCwJbnZfbGVmdCwJTlZfU1NTfE5WX1NUU3xOVl9STCwJMH0sCisgICAge0tfU19MRUZULAludl9iY2tfd29yZCwJTlZfU1N8TlZfUkwsCQkwfSwKKyAgICB7S19DX0xFRlQsCW52X2Jja193b3JkLAlOVl9TU1N8TlZfUkx8TlZfU1RTLAkxfSwKKyAgICB7S19SSUdIVCwJbnZfcmlnaHQsCU5WX1NTU3xOVl9TVFN8TlZfUkwsCTB9LAorICAgIHtLX1NfUklHSFQsCW52X3dvcmRjbWQsCU5WX1NTfE5WX1JMLAkJRkFMU0V9LAorICAgIHtLX0NfUklHSFQsCW52X3dvcmRjbWQsCU5WX1NTU3xOVl9STHxOVl9TVFMsCVRSVUV9LAorICAgIHtLX1BBR0VVUCwJbnZfcGFnZSwJTlZfU1NTfE5WX1NUUywJCUJBQ0tXQVJEfSwKKyAgICB7S19LUEFHRVVQLAludl9wYWdlLAlOVl9TU1N8TlZfU1RTLAkJQkFDS1dBUkR9LAorICAgIHtLX1BBR0VET1dOLCBudl9wYWdlLAlOVl9TU1N8TlZfU1RTLAkJRk9SV0FSRH0sCisgICAge0tfS1BBR0VET1dOLCBudl9wYWdlLAlOVl9TU1N8TlZfU1RTLAkJRk9SV0FSRH0sCisgICAge0tfRU5ELAludl9lbmQsCQlOVl9TU1N8TlZfU1RTLAkJRkFMU0V9LAorICAgIHtLX0tFTkQsCW52X2VuZCwJCU5WX1NTU3xOVl9TVFMsCQlGQUxTRX0sCisgICAge0tfWEVORCwJbnZfZW5kLAkJTlZfU1NTfE5WX1NUUywJCUZBTFNFfSwKKyAgICB7S19TX0VORCwJbnZfZW5kLAkJTlZfU1MsCQkJRkFMU0V9LAorICAgIHtLX0NfRU5ELAludl9lbmQsCQlOVl9TU1N8TlZfU1RTLAkJVFJVRX0sCisgICAge0tfSE9NRSwJbnZfaG9tZSwJTlZfU1NTfE5WX1NUUywJCTB9LAorICAgIHtLX0tIT01FLAludl9ob21lLAlOVl9TU1N8TlZfU1RTLAkJMH0sCisgICAge0tfWEhPTUUsCW52X2hvbWUsCU5WX1NTU3xOVl9TVFMsCQkwfSwKKyAgICB7S19TX0hPTUUsCW52X2hvbWUsCU5WX1NTLAkJCTB9LAorICAgIHtLX0NfSE9NRSwJbnZfZ290bywJTlZfU1NTfE5WX1NUUywJCUZBTFNFfSwKKyAgICB7S19ERUwsCW52X2FiYnJldiwJMCwJCQkwfSwKKyAgICB7S19LREVMLAludl9hYmJyZXYsCTAsCQkJMH0sCisgICAge0tfVU5ETywJbnZfa3VuZG8sCTAsCQkJMH0sCisgICAge0tfSEVMUCwJbnZfaGVscCwJTlZfTkNXLAkJCTB9LAorICAgIHtLX0YxLAludl9oZWxwLAlOVl9OQ1csCQkJMH0sCisgICAge0tfWEYxLAludl9oZWxwLAlOVl9OQ1csCQkJMH0sCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICB7S19TRUxFQ1QsCW52X3NlbGVjdCwJMCwJCQkwfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisgICAge0tfVkVSX1NDUk9MTEJBUiwgbnZfdmVyX3Njcm9sbGJhciwgMCwJCTB9LAorICAgIHtLX0hPUl9TQ1JPTExCQVIsIG52X2hvcl9zY3JvbGxiYXIsIDAsCQkwfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRktNQVAKKyAgICB7S19GOCwJZmFyc2lfZmtleSwJMCwJCQkwfSwKKyAgICB7S19GOSwJZmFyc2lfZmtleSwJMCwJCQkwfSwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU05JRkYKKyAgICB7S19TTklGRiwJbnZfc25pZmYsCTAsCQkJMH0sCisjZW5kaWYKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICB7S19GMjEsCW52X25iY21kLAlOVl9OQ0hfQUxXLAkJMH0sCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RORAorICAgIHtLX0RST1AsCW52X2Ryb3AsCU5WX1NUUywJCQkwfSwKKyNlbmRpZgorfTsKKworLyogTnVtYmVyIG9mIGNvbW1hbmRzIGluIG52X2NtZHNbXS4gKi8KKyNkZWZpbmUgTlZfQ01EU19TSVpFIChzaXplb2YobnZfY21kcykgLyBzaXplb2Yoc3RydWN0IG52X2NtZCkpCisKKy8qIFNvcnRlZCBpbmRleCBvZiBjb21tYW5kcyBpbiBudl9jbWRzW10uICovCitzdGF0aWMgc2hvcnQgbnZfY21kX2lkeFtOVl9DTURTX1NJWkVdOworCisvKiBUaGUgaGlnaGVzdCBpbmRleCBmb3Igd2hpY2gKKyAqIG52X2NtZHNbaWR4XS5jbWRfY2hhciA9PSBudl9jbWRfaWR4W252X2NtZHNbaWR4XS5jbWRfY2hhcl0gKi8KK3N0YXRpYyBpbnQgbnZfbWF4X2xpbmVhcjsKKworLyoKKyAqIENvbXBhcmUgZnVuY3Rpb25zIGZvciBxc29ydCgpIGJlbG93LCB0aGF0IGNoZWNrcyB0aGUgY29tbWFuZCBjaGFyYWN0ZXIKKyAqIHRocm91Z2ggdGhlIGluZGV4IGluIG52X2NtZF9pZHhbXS4KKyAqLworICAgIHN0YXRpYyBpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorbnZfY29tcGFyZShzMSwgczIpCisgICAgY29uc3Qgdm9pZAkqczE7CisgICAgY29uc3Qgdm9pZAkqczI7Cit7CisgICAgaW50CQljMSwgYzI7CisKKyAgICAvKiBUaGUgY29tbWFuZHMgYXJlIHNvcnRlZCBvbiBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICBjMSA9IG52X2NtZHNbKihjb25zdCBzaG9ydCAqKXMxXS5jbWRfY2hhcjsKKyAgICBjMiA9IG52X2NtZHNbKihjb25zdCBzaG9ydCAqKXMyXS5jbWRfY2hhcjsKKyAgICBpZiAoYzEgPCAwKQorCWMxID0gLWMxOworICAgIGlmIChjMiA8IDApCisJYzIgPSAtYzI7CisgICAgcmV0dXJuIGMxIC0gYzI7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBudl9jbWRfaWR4W10gdGFibGUuCisgKi8KKyAgICB2b2lkCitpbml0X25vcm1hbF9jbWRzKCkKK3sKKyAgICBpbnQJCWk7CisKKyAgICAvKiBGaWxsIHRoZSBpbmRleCB0YWJsZSB3aXRoIGEgb25lIHRvIG9uZSByZWxhdGlvbi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlZfQ01EU19TSVpFOyArK2kpCisJbnZfY21kX2lkeFtpXSA9IGk7CisKKyAgICAvKiBTb3J0IHRoZSBjb21tYW5kcyBieSB0aGUgY29tbWFuZCBjaGFyYWN0ZXIuICAqLworICAgIHFzb3J0KCh2b2lkICopJm52X2NtZF9pZHgsIChzaXplX3QpTlZfQ01EU19TSVpFLCBzaXplb2Yoc2hvcnQpLCBudl9jb21wYXJlKTsKKworICAgIC8qIEZpbmQgdGhlIGZpcnN0IGVudHJ5IHRoYXQgY2FuJ3QgYmUgaW5kZXhlZCBieSB0aGUgY29tbWFuZCBjaGFyYWN0ZXIuICovCisgICAgZm9yIChpID0gMDsgaSA8IE5WX0NNRFNfU0laRTsgKytpKQorCWlmIChpICE9IG52X2NtZHNbbnZfY21kX2lkeFtpXV0uY21kX2NoYXIpCisJICAgIGJyZWFrOworICAgIG52X21heF9saW5lYXIgPSBpIC0gMTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgYSBjb21tYW5kIGluIHRoZSBjb21tYW5kcyB0YWJsZS4KKyAqIFJldHVybnMgLTEgZm9yIGludmFsaWQgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRfY29tbWFuZChjbWRjaGFyKQorICAgIGludAkJY21kY2hhcjsKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQlpZHg7CisgICAgaW50CQl0b3AsIGJvdDsKKyAgICBpbnQJCWM7CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogQSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpcyBuZXZlciBhIGNvbW1hbmQuICovCisgICAgaWYgKGNtZGNoYXIgPj0gMHgxMDApCisJcmV0dXJuIC0xOworI2VuZGlmCisKKyAgICAvKiBXZSB1c2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIuICBTcGVjaWFsIGtleXMgaGF2ZSBhCisgICAgICogbmVnYXRpdmUgdmFsdWUsIGJ1dCBhcmUgc29ydGVkIG9uIHRoZWlyIGFic29sdXRlIHZhbHVlLiAqLworICAgIGlmIChjbWRjaGFyIDwgMCkKKwljbWRjaGFyID0gLWNtZGNoYXI7CisKKyAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIGlzIGluIHRoZSBmaXJzdCBwYXJ0OiBUaGUgY2hhcmFjdGVyIGlzIHRoZSBpbmRleCBpbnRvCisgICAgICogbnZfY21kX2lkeFtdLiAqLworICAgIGlmIChjbWRjaGFyIDw9IG52X21heF9saW5lYXIpCisJcmV0dXJuIG52X2NtZF9pZHhbY21kY2hhcl07CisKKyAgICAvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaC4gKi8KKyAgICBib3QgPSBudl9tYXhfbGluZWFyICsgMTsKKyAgICB0b3AgPSBOVl9DTURTX1NJWkUgLSAxOworICAgIGlkeCA9IC0xOworICAgIHdoaWxlIChib3QgPD0gdG9wKQorICAgIHsKKwlpID0gKHRvcCArIGJvdCkgLyAyOworCWMgPSBudl9jbWRzW252X2NtZF9pZHhbaV1dLmNtZF9jaGFyOworCWlmIChjIDwgMCkKKwkgICAgYyA9IC1jOworCWlmIChjbWRjaGFyID09IGMpCisJeworCSAgICBpZHggPSBudl9jbWRfaWR4W2ldOworCSAgICBicmVhazsKKwl9CisJaWYgKGNtZGNoYXIgPiBjKQorCSAgICBib3QgPSBpICsgMTsKKwllbHNlCisJICAgIHRvcCA9IGkgLSAxOworICAgIH0KKyAgICByZXR1cm4gaWR4OworfQorCisvKgorICogRXhlY3V0ZSBhIGNvbW1hbmQgaW4gTm9ybWFsIG1vZGUuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK25vcm1hbF9jbWQob2FwLCB0b3BsZXZlbCkKKyAgICBvcGFyZ19UCSpvYXA7CisgICAgaW50CQl0b3BsZXZlbDsJCS8qIFRSVUUgd2hlbiBjYWxsZWQgZnJvbSBtYWluKCkgKi8KK3sKKyAgICBzdGF0aWMgbG9uZwlvcGNvdW50ID0gMDsJCS8qIGNhLm9wY291bnQgc2F2ZWQgaGVyZSAqLworICAgIGNtZGFyZ19UCWNhOwkJCS8qIGNvbW1hbmQgYXJndW1lbnRzICovCisgICAgaW50CQljOworICAgIGludAkJY3RybF93ID0gRkFMU0U7CQkvKiBnb3QgQ1RSTC1XIGNvbW1hbmQgKi8KKyAgICBpbnQJCW9sZF9jb2wgPSBjdXJ3aW4tPndfY3Vyc3dhbnQ7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBpbnQJCW5lZWRfZmx1c2hidWY7CQkvKiBuZWVkIHRvIGNhbGwgb3V0X2ZsdXNoKCkgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCisgICAgcG9zX1QJb2xkX3BvczsJCS8qIGN1cnNvciBwb3NpdGlvbiBiZWZvcmUgY29tbWFuZCAqLworICAgIGludAkJbWFwcGVkX2xlbjsKKyNlbmRpZgorICAgIHN0YXRpYyBpbnQJb2xkX21hcHBlZF9sZW4gPSAwOworICAgIGludAkJaWR4OworCisgICAgdmltX21lbXNldCgmY2EsIDAsIHNpemVvZihjYSkpOwkvKiBhbHNvIHJlc2V0cyBjYS5yZXR2YWwgKi8KKyAgICBjYS5vYXAgPSBvYXA7CisgICAgY2Eub3Bjb3VudCA9IG9wY291bnQ7CisKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgd2FudF9zbmlmZl9yZXF1ZXN0ID0gc25pZmZfY29ubmVjdGVkOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGlzIGFuIG9wZXJhdG9yIHBlbmRpbmcsIHRoZW4gdGhlIGNvbW1hbmQgd2UgdGFrZSB0aGlzIHRpbWUKKyAgICAgKiB3aWxsIHRlcm1pbmF0ZSBpdC4gRmluaXNoX29wIHRlbGxzIHVzIHRvIGZpbmlzaCB0aGUgb3BlcmF0aW9uIGJlZm9yZQorICAgICAqIHJldHVybmluZyB0aGlzIHRpbWUgKHVubGVzcyB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQpLgorICAgICAqLworI2lmZGVmIENVUlNPUl9TSEFQRQorICAgIGMgPSBmaW5pc2hfb3A7CisjZW5kaWYKKyAgICBmaW5pc2hfb3AgPSAob2FwLT5vcF90eXBlICE9IE9QX05PUCk7CisjaWZkZWYgQ1VSU09SX1NIQVBFCisgICAgaWYgKGZpbmlzaF9vcCAhPSBjKQorICAgIHsKKwl1aV9jdXJzb3Jfc2hhcGUoKTsJCS8qIG1heSBzaG93IGRpZmZlcmVudCBjdXJzb3Igc2hhcGUgKi8KKyMgaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJdXBkYXRlX21vdXNlc2hhcGUoLTEpOworIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFmaW5pc2hfb3AgJiYgIW9hcC0+cmVnbmFtZSkKKwljYS5vcGNvdW50ID0gMDsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgbWFwcGVkX2xlbiA9IHR5cGVidWZfbWFwbGVuKCk7CisjZW5kaWYKKworICAgIFN0YXRlID0gTk9STUFMX0JVU1k7CisjaWZkZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKyAgICBkb250X3Njcm9sbCA9IEZBTFNFOwkvKiBhbGxvdyBzY3JvbGxpbmcgaGVyZSAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgY29tbWFuZCBjaGFyYWN0ZXIgZnJvbSB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBjID0gc2FmZV92Z2V0YygpOworCisjaWZkZWYgRkVBVF9MQU5HTUFQCisgICAgTEFOR01BUF9BREpVU1QoYywgVFJVRSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgYSBtYXBwaW5nIHdhcyBzdGFydGVkIGluIFZpc3VhbCBvciBTZWxlY3QgbW9kZSwgcmVtZW1iZXIgdGhlIGxlbmd0aAorICAgICAqIG9mIHRoZSBtYXBwaW5nLiAgVGhpcyBpcyB1c2VkIGJlbG93IHRvIG5vdCByZXR1cm4gdG8gSW5zZXJ0IG1vZGUgZm9yIGFzCisgICAgICogbG9uZyBhcyB0aGUgbWFwcGluZyBpcyBiZWluZyBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBpZiAocmVzdGFydF9lZGl0ID09IDApCisJb2xkX21hcHBlZF9sZW4gPSAwOworICAgIGVsc2UgaWYgKG9sZF9tYXBwZWRfbGVuCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgfHwgKFZJc3VhbF9hY3RpdmUgJiYgbWFwcGVkX2xlbiA9PSAwICYmIHR5cGVidWZfbWFwbGVuKCkgPiAwKQorI2VuZGlmCisJICAgICkKKwlvbGRfbWFwcGVkX2xlbiA9IHR5cGVidWZfbWFwbGVuKCk7CisKKyAgICBpZiAoYyA9PSBOVUwpCisJYyA9IEtfWkVSTzsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiBJbiBTZWxlY3QgbW9kZSwgdHlwZWQgdGV4dCByZXBsYWNlcyB0aGUgc2VsZWN0aW9uLgorICAgICAqLworICAgIGlmIChWSXN1YWxfYWN0aXZlCisJICAgICYmIFZJc3VhbF9zZWxlY3QKKwkgICAgJiYgKHZpbV9pc3ByaW50YyhjKSB8fCBjID09IE5MIHx8IGMgPT0gQ0FSIHx8IGMgPT0gS19LRU5URVIpKQorICAgIHsKKyMgaWZkZWYgRkVBVF9NQllURQorCWNoYXJfdQkgICAgYnVmW01CX01BWEJZVEVTICsgMV07CisKKwlidWZbKCptYl9jaGFyMmJ5dGVzKShjLCBidWYpXSA9IE5VTDsKKyMgZWxzZQorCWNoYXJfdQkgICAgYnVmWzJdOworCisJYnVmWzBdID0gYzsKKwlidWZbMV0gPSBOVUw7CisjIGVuZGlmCisJLyogRmFrZSBhICJjImhhbmdlIGNvbW1hbmQuCisJICogSW5zZXJ0IHRoZSB0eXBlZCBjaGFyYWN0ZXIgaW4gdGhlIHR5cGVhaGVhZCBidWZmZXIsIHNvIHRoYXQgaXQgd2lsbAorCSAqIGJlIG1hcHBlZCBpbiBJbnNlcnQgbW9kZS4gIFJlcXVpcmVkIGZvciAiOmxtYXAiIHRvIHdvcmsuICBNYXkgY2F1c2UKKwkgKiBtYXBwaW5nIGEgY2hhcmFjdGVyIGZyb20gIjp2bm9yZW1hcCIuLi4gKi8KKwkodm9pZClpbnNfdHlwZWJ1ZihidWYsIFJFTUFQX1lFUywgMCwgIUtleVR5cGVkLCBGQUxTRSk7CisJYyA9ICdjJzsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgbmVlZF9mbHVzaGJ1ZiA9IGFkZF90b19zaG93Y21kKGMpOworI2VuZGlmCisKK2dldGNvdW50OgorI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKCEoVklzdWFsX2FjdGl2ZSAmJiBWSXN1YWxfc2VsZWN0KSkKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIEhhbmRsZSBhIGNvdW50IGJlZm9yZSBhIGNvbW1hbmQgYW5kIGNvbXB1dGUgY2EuY291bnQwLgorCSAqIE5vdGUgdGhhdCAnMCcgaXMgYSBjb21tYW5kIGFuZCBub3QgdGhlIHN0YXJ0IG9mIGEgY291bnQsIGJ1dCBpdCdzCisJICogcGFydCBvZiBhIGNvdW50IGFmdGVyIG90aGVyIGRpZ2l0cy4KKwkgKi8KKwl3aGlsZSAoICAgIChjID49ICcxJyAmJiBjIDw9ICc5JykKKwkJfHwgKGNhLmNvdW50MCAhPSAwICYmIChjID09IEtfREVMIHx8IGMgPT0gS19LREVMIHx8IGMgPT0gJzAnKSkpCisJeworCSAgICBpZiAoYyA9PSBLX0RFTCB8fCBjID09IEtfS0RFTCkKKwkgICAgeworCQljYS5jb3VudDAgLz0gMTA7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkJZGVsX2Zyb21fc2hvd2NtZCg0KTsJLyogZGVsZXRlIHRoZSBkaWdpdCBhbmQgfkAlICovCisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJCWNhLmNvdW50MCA9IGNhLmNvdW50MCAqIDEwICsgKGMgLSAnMCcpOworCSAgICBpZiAoY2EuY291bnQwIDwgMCkJICAgIC8qIGdvdCB0b28gbGFyZ2UhICovCisJCWNhLmNvdW50MCA9IDk5OTk5OTk5OUw7CisJICAgIGlmIChjdHJsX3cpCisJICAgIHsKKwkJKytub19tYXBwaW5nOworCQkrK2FsbG93X2tleXM7CQkvKiBubyBtYXBwaW5nIGZvciBuY2hhciwgYnV0IGtleXMgKi8KKwkgICAgfQorCSAgICArK25vX3plcm9fbWFwcGluZzsJCS8qIGRvbid0IG1hcCB6ZXJvIGhlcmUgKi8KKwkgICAgYyA9IHNhZmVfdmdldGMoKTsKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKwkgICAgTEFOR01BUF9BREpVU1QoYywgVFJVRSk7CisjZW5kaWYKKwkgICAgLS1ub196ZXJvX21hcHBpbmc7CisJICAgIGlmIChjdHJsX3cpCisJICAgIHsKKwkJLS1ub19tYXBwaW5nOworCQktLWFsbG93X2tleXM7CisJICAgIH0KKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCSAgICBuZWVkX2ZsdXNoYnVmIHw9IGFkZF90b19zaG93Y21kKGMpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBJZiB3ZSBnb3QgQ1RSTC1XIHRoZXJlIG1heSBiZSBhL2Fub3RoZXIgY291bnQKKwkgKi8KKwlpZiAoYyA9PSBDdHJsX1cgJiYgIWN0cmxfdyAmJiBvYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorCXsKKwkgICAgY3RybF93ID0gVFJVRTsKKwkgICAgY2Eub3Bjb3VudCA9IGNhLmNvdW50MDsJLyogcmVtZW1iZXIgZmlyc3QgY291bnQgKi8KKwkgICAgY2EuY291bnQwID0gMDsKKwkgICAgKytub19tYXBwaW5nOworCSAgICArK2FsbG93X2tleXM7CQkvKiBubyBtYXBwaW5nIGZvciBuY2hhciwgYnV0IGtleXMgKi8KKwkgICAgYyA9IHNhZmVfdmdldGMoKTsJCS8qIGdldCBuZXh0IGNoYXJhY3RlciAqLworI2lmZGVmIEZFQVRfTEFOR01BUAorCSAgICBMQU5HTUFQX0FESlVTVChjLCBUUlVFKTsKKyNlbmRpZgorCSAgICAtLW5vX21hcHBpbmc7CisJICAgIC0tYWxsb3dfa2V5czsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCSAgICBuZWVkX2ZsdXNoYnVmIHw9IGFkZF90b19zaG93Y21kKGMpOworI2VuZGlmCisJICAgIGdvdG8gZ2V0Y291bnQ7CQkvKiBqdW1wIGJhY2sgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wZXJhdG9yIChpbmNsdWRpbmcgYWZ0ZXIgZW50ZXJpbmcgYSB5YW5rCisgICAgICogYnVmZmVyIHdpdGggJyInKSBBTkQgd2UgaGFkIGEgY291bnQgYmVmb3JlIHRoZSBvcGVyYXRvciwgdGhlbiB0aGF0CisgICAgICogY291bnQgb3ZlcnJpZGVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNhLmNvdW50MC4KKyAgICAgKiBXaGF0IHRoaXMgbWVhbnMgZWZmZWN0aXZlbHksIGlzIHRoYXQgY29tbWFuZHMgbGlrZSAiM2R3IiBnZXQgdHVybmVkCisgICAgICogaW50byAiZDN3IiB3aGljaCBtYWtlcyB0aGluZ3MgZmFsbCBpbnRvIHBsYWNlIHByZXR0eSBuZWF0bHkuCisgICAgICogSWYgeW91IGdpdmUgYSBjb3VudCBiZWZvcmUgQU5EIGFmdGVyIHRoZSBvcGVyYXRvciwgdGhleSBhcmUgbXVsdGlwbGllZC4KKyAgICAgKi8KKyAgICBpZiAoY2Eub3Bjb3VudCAhPSAwKQorICAgIHsKKwlpZiAoY2EuY291bnQwKQorCSAgICBjYS5jb3VudDAgKj0gY2Eub3Bjb3VudDsKKwllbHNlCisJICAgIGNhLmNvdW50MCA9IGNhLm9wY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbHdheXMgcmVtZW1iZXIgdGhlIGNvdW50LiAgSXQgd2lsbCBiZSBzZXQgdG8gemVybyAob24gdGhlIG5leHQgY2FsbCwKKyAgICAgKiBhYm92ZSkgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIG9wZXJhdG9yLgorICAgICAqIFdoZW4gY2FsbGVkIGZyb20gbWFpbigpLCBzYXZlIHRoZSBjb3VudCBmb3IgdXNlIGJ5IHRoZSAiY291bnQiIGJ1aWx0LWluCisgICAgICogdmFyaWFibGUuCisgICAgICovCisgICAgY2Eub3Bjb3VudCA9IGNhLmNvdW50MDsKKyAgICBjYS5jb3VudDEgPSAoY2EuY291bnQwID09IDAgPyAxIDogY2EuY291bnQwKTsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIC8qCisgICAgICogT25seSBzZXQgdjpjb3VudCB3aGVuIGNhbGxlZCBmcm9tIG1haW4oKSBhbmQgbm90IGEgc3R1ZmZlZCBjb21tYW5kLgorICAgICAqLworICAgIGlmICh0b3BsZXZlbCAmJiBzdHVmZl9lbXB0eSgpKQorCXNldF92Y291bnQoY2EuY291bnQwLCBjYS5jb3VudDEpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZpbmQgdGhlIGNvbW1hbmQgY2hhcmFjdGVyIGluIHRoZSB0YWJsZSBvZiBjb21tYW5kcy4KKyAgICAgKiBGb3IgQ1RSTC1XIHdlIGFscmVhZHkgZ290IG5jaGFyIHdoZW4gbG9va2luZyBmb3IgYSBjb3VudC4KKyAgICAgKi8KKyAgICBpZiAoY3RybF93KQorICAgIHsKKwljYS5uY2hhciA9IGM7CisJY2EuY21kY2hhciA9IEN0cmxfVzsKKyAgICB9CisgICAgZWxzZQorCWNhLmNtZGNoYXIgPSBjOworICAgIGlkeCA9IGZpbmRfY29tbWFuZChjYS5jbWRjaGFyKTsKKyAgICBpZiAoaWR4IDwgMCkKKyAgICB7CisJLyogTm90IGEga25vd24gY29tbWFuZDogYmVlcC4gKi8KKwljbGVhcm9wYmVlcChvYXApOworCWdvdG8gbm9ybWFsX2VuZDsKKyAgICB9CisjaWZkZWYgRkVBVF9DTURXSU4KKyAgICBpZiAoY21kd2luX3R5cGUgIT0gMCAmJiAobnZfY21kc1tpZHhdLmNtZF9mbGFncyAmIE5WX05DVykpCisgICAgeworCS8qIFRoaXMgY29tbWFuZCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY21kbGluZSB3aW5kb3c6IGJlZXAuICovCisJY2xlYXJvcGJlZXAob2FwKTsKKwlFTVNHKF8oZV9jbWR3aW4pKTsKKwlnb3RvIG5vcm1hbF9lbmQ7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qCisgICAgICogSW4gVmlzdWFsL1NlbGVjdCBtb2RlLCBhIGZldyBrZXlzIGFyZSBoYW5kbGVkIGluIGEgc3BlY2lhbCB3YXkuCisgICAgICovCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCS8qIHdoZW4gJ2tleW1vZGVsJyBjb250YWlucyAic3RvcHNlbCIgbWF5IHN0b3AgU2VsZWN0L1Zpc3VhbCBtb2RlICovCisJaWYgKGttX3N0b3BzZWwKKwkJJiYgKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9TVFMpCisJCSYmICEobW9kX21hc2sgJiBNT0RfTUFTS19TSElGVCkpCisJeworCSAgICBlbmRfdmlzdWFsX21vZGUoKTsKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CisJfQorCisJLyogS2V5cyB0aGF0IHdvcmsgZGlmZmVyZW50IHdoZW4gJ2tleW1vZGVsJyBjb250YWlucyAic3RhcnRzZWwiICovCisJaWYgKGttX3N0YXJ0c2VsKQorCXsKKwkgICAgaWYgKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9TUykKKwkgICAgeworCQl1bnNoaWZ0X3NwZWNpYWwoJmNhKTsKKwkJaWR4ID0gZmluZF9jb21tYW5kKGNhLmNtZGNoYXIpOworCSAgICB9CisJICAgIGVsc2UgaWYgKChudl9jbWRzW2lkeF0uY21kX2ZsYWdzICYgTlZfU1NTKQorCQkJCQkgICAgICAgJiYgKG1vZF9tYXNrICYgTU9EX01BU0tfU0hJRlQpKQorCSAgICB7CisJCW1vZF9tYXNrICY9IH5NT0RfTUFTS19TSElGVDsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgaWYgKGN1cndpbi0+d19wX3JsICYmIEtleVR5cGVkICYmICFLZXlTdHVmZmVkCisJCQkJCSAgJiYgKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9STCkpCisgICAgeworCS8qIEludmVydCBob3Jpem9udGFsIG1vdmVtZW50cyBhbmQgb3BlcmF0aW9ucy4gIE9ubHkgd2hlbiB0eXBlZCBieSB0aGUKKwkgKiB1c2VyIGRpcmVjdGx5LCBub3Qgd2hlbiB0aGUgcmVzdWx0IG9mIGEgbWFwcGluZyBvciAieCIgdHJhbnNsYXRlZAorCSAqIHRvICJkbCIuICovCisJc3dpdGNoIChjYS5jbWRjaGFyKQorCXsKKwkgICAgY2FzZSAnbCc6CSAgICBjYS5jbWRjaGFyID0gJ2gnOyBicmVhazsKKwkgICAgY2FzZSBLX1JJR0hUOiAgIGNhLmNtZGNoYXIgPSBLX0xFRlQ7IGJyZWFrOworCSAgICBjYXNlIEtfU19SSUdIVDogY2EuY21kY2hhciA9IEtfU19MRUZUOyBicmVhazsKKwkgICAgY2FzZSBLX0NfUklHSFQ6IGNhLmNtZGNoYXIgPSBLX0NfTEVGVDsgYnJlYWs7CisJICAgIGNhc2UgJ2gnOgkgICAgY2EuY21kY2hhciA9ICdsJzsgYnJlYWs7CisJICAgIGNhc2UgS19MRUZUOiAgICBjYS5jbWRjaGFyID0gS19SSUdIVDsgYnJlYWs7CisJICAgIGNhc2UgS19TX0xFRlQ6ICBjYS5jbWRjaGFyID0gS19TX1JJR0hUOyBicmVhazsKKwkgICAgY2FzZSBLX0NfTEVGVDogIGNhLmNtZGNoYXIgPSBLX0NfUklHSFQ7IGJyZWFrOworCSAgICBjYXNlICc+JzoJICAgIGNhLmNtZGNoYXIgPSAnPCc7IGJyZWFrOworCSAgICBjYXNlICc8JzoJICAgIGNhLmNtZGNoYXIgPSAnPic7IGJyZWFrOworCX0KKwlpZHggPSBmaW5kX2NvbW1hbmQoY2EuY21kY2hhcik7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEdldCBhbiBhZGRpdGlvbmFsIGNoYXJhY3RlciBpZiB3ZSBuZWVkIG9uZS4KKyAgICAgKi8KKyAgICBpZiAoKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9OQ0gpCisJICAgICYmICgoKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9OQ0hfTk9QKSA9PSBOVl9OQ0hfTk9QCisJCSAgICAmJiBvYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorCQl8fCAobnZfY21kc1tpZHhdLmNtZF9mbGFncyAmIE5WX05DSF9BTFcpID09IE5WX05DSF9BTFcKKwkJfHwgKGNhLmNtZGNoYXIgPT0gJ3EnCisJCSAgICAmJiBvYXAtPm9wX3R5cGUgPT0gT1BfTk9QCisJCSAgICAmJiAhUmVjb3JkaW5nCisJCSAgICAmJiAhRXhlY19yZWcpCisJCXx8ICgoY2EuY21kY2hhciA9PSAnYScgfHwgY2EuY21kY2hhciA9PSAnaScpCisJCSAgICAmJiAob2FwLT5vcF90eXBlICE9IE9QX05PUAorI2lmZGVmIEZFQVRfVklTVUFMCisJCQl8fCBWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkJICAgICAgICkpKSkKKyAgICB7CisJaW50CSpjcDsKKwlpbnQJcmVwbCA9IEZBTFNFOwkvKiBnZXQgY2hhcmFjdGVyIGZvciByZXBsYWNlIG1vZGUgKi8KKwlpbnQJbGl0ID0gRkFMU0U7CS8qIGdldCBleHRyYSBjaGFyYWN0ZXIgbGl0ZXJhbGx5ICovCisJaW50CWxhbmdtYXBfYWN0aXZlID0gRkFMU0U7ICAgIC8qIHVzaW5nIDpsbWFwIG1hcHBpbmdzICovCisJaW50CWxhbmc7CQkvKiBnZXR0aW5nIGEgdGV4dCBjaGFyYWN0ZXIgKi8KKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorCWludAlzYXZlX3NtZDsJLyogc2F2ZWQgdmFsdWUgb2YgcF9zbWQgKi8KKyNlbmRpZgorCisJKytub19tYXBwaW5nOworCSsrYWxsb3dfa2V5czsJCS8qIG5vIG1hcHBpbmcgZm9yIG5jaGFyLCBidXQgYWxsb3cga2V5IGNvZGVzICovCisJaWYgKGNhLmNtZGNoYXIgPT0gJ2cnKQorCXsKKwkgICAgLyoKKwkgICAgICogRm9yICdnJyBnZXQgdGhlIG5leHQgY2hhcmFjdGVyIG5vdywgc28gdGhhdCB3ZSBjYW4gY2hlY2sgZm9yCisJICAgICAqICJnciIsICJnJyIgYW5kICJnYCIuCisJICAgICAqLworCSAgICBjYS5uY2hhciA9IHNhZmVfdmdldGMoKTsKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKwkgICAgTEFOR01BUF9BREpVU1QoY2EubmNoYXIsIFRSVUUpOworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkgICAgbmVlZF9mbHVzaGJ1ZiB8PSBhZGRfdG9fc2hvd2NtZChjYS5uY2hhcik7CisjZW5kaWYKKwkgICAgaWYgKGNhLm5jaGFyID09ICdyJyB8fCBjYS5uY2hhciA9PSAnXCcnIHx8IGNhLm5jaGFyID09ICdgJworCQkJCQkJICAgICAgfHwgY2EubmNoYXIgPT0gQ3RybF9CU0wpCisJICAgIHsKKwkJY3AgPSAmY2EuZXh0cmFfY2hhcjsJLyogbmVlZCB0byBnZXQgYSB0aGlyZCBjaGFyYWN0ZXIgKi8KKwkJaWYgKGNhLm5jaGFyICE9ICdyJykKKwkJICAgIGxpdCA9IFRSVUU7CQkJLyogZ2V0IGl0IGxpdGVyYWxseSAqLworCQllbHNlCisJCSAgICByZXBsID0gVFJVRTsJCS8qIGdldCBpdCBpbiByZXBsYWNlIG1vZGUgKi8KKwkgICAgfQorCSAgICBlbHNlCisJCWNwID0gTlVMTDsJCS8qIG5vIHRoaXJkIGNoYXJhY3RlciBuZWVkZWQgKi8KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGNhLmNtZGNoYXIgPT0gJ3InKQkJLyogZ2V0IGl0IGluIHJlcGxhY2UgbW9kZSAqLworCQlyZXBsID0gVFJVRTsKKwkgICAgY3AgPSAmY2EubmNoYXI7CisJfQorCWxhbmcgPSAocmVwbCB8fCAobnZfY21kc1tpZHhdLmNtZF9mbGFncyAmIE5WX0xBTkcpKTsKKworCS8qCisJICogR2V0IGEgc2Vjb25kIG9yIHRoaXJkIGNoYXJhY3Rlci4KKwkgKi8KKwlpZiAoY3AgIT0gTlVMTCkKKwl7CisjaWZkZWYgQ1VSU09SX1NIQVBFCisJICAgIGlmIChyZXBsKQorCSAgICB7CisJCVN0YXRlID0gUkVQTEFDRTsJLyogcHJldGVuZCBSZXBsYWNlIG1vZGUgKi8KKwkJdWlfY3Vyc29yX3NoYXBlKCk7CS8qIHNob3cgZGlmZmVyZW50IGN1cnNvciBzaGFwZSAqLworCSAgICB9CisjZW5kaWYKKwkgICAgaWYgKGxhbmcgJiYgY3VyYnVmLT5iX3BfaW1pbnNlcnQgPT0gQl9JTU9ERV9MTUFQKQorCSAgICB7CisJCS8qIEFsbG93IG1hcHBpbmdzIGRlZmluZWQgd2l0aCAiOmxtYXAiLiAqLworCQktLW5vX21hcHBpbmc7CisJCS0tYWxsb3dfa2V5czsKKwkJaWYgKHJlcGwpCisJCSAgICBTdGF0ZSA9IExSRVBMQUNFOworCQllbHNlCisJCSAgICBTdGF0ZSA9IExBTkdNQVA7CisJCWxhbmdtYXBfYWN0aXZlID0gVFJVRTsKKwkgICAgfQorI2lmZGVmIFVTRV9JTV9DT05UUk9MCisJICAgIHNhdmVfc21kID0gcF9zbWQ7CisJICAgIHBfc21kID0gRkFMU0U7CS8qIERvbid0IGxldCB0aGUgSU0gY29kZSBzaG93IHRoZSBtb2RlIGhlcmUgKi8KKwkgICAgaWYgKGxhbmcgJiYgY3VyYnVmLT5iX3BfaW1pbnNlcnQgPT0gQl9JTU9ERV9JTSkKKwkJaW1fc2V0X2FjdGl2ZShUUlVFKTsKKyNlbmRpZgorCisJICAgICpjcCA9IHNhZmVfdmdldGMoKTsKKworCSAgICBpZiAobGFuZ21hcF9hY3RpdmUpCisJICAgIHsKKwkJLyogVW5kbyB0aGUgZGVjcmVtZW50IGRvbmUgYWJvdmUgKi8KKwkJKytub19tYXBwaW5nOworCQkrK2FsbG93X2tleXM7CisJCVN0YXRlID0gTk9STUFMX0JVU1k7CisJICAgIH0KKyNpZmRlZiBVU0VfSU1fQ09OVFJPTAorCSAgICBpZiAobGFuZykKKwkgICAgeworCQlpZiAoY3VyYnVmLT5iX3BfaW1pbnNlcnQgIT0gQl9JTU9ERV9MTUFQKQorCQkgICAgaW1fc2F2ZV9zdGF0dXMoJmN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0KTsKKwkJaW1fc2V0X2FjdGl2ZShGQUxTRSk7CisJICAgIH0KKwkgICAgcF9zbWQgPSBzYXZlX3NtZDsKKyNlbmRpZgorI2lmZGVmIENVUlNPUl9TSEFQRQorCSAgICBTdGF0ZSA9IE5PUk1BTF9CVVNZOworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkgICAgbmVlZF9mbHVzaGJ1ZiB8PSBhZGRfdG9fc2hvd2NtZCgqY3ApOworI2VuZGlmCisKKwkgICAgaWYgKCFsaXQpCisJICAgIHsKKyNpZmRlZiBGRUFUX0RJR1JBUEhTCisJCS8qIFR5cGluZyBDVFJMLUsgZ2V0cyBhIGRpZ3JhcGguICovCisJCWlmICgqY3AgPT0gQ3RybF9LCisJCQkmJiAoKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9MQU5HKQorCQkJICAgIHx8IGNwID09ICZjYS5leHRyYV9jaGFyKQorCQkJJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0RJR1JBUEgpID09IE5VTEwpCisJCXsKKwkJICAgIGMgPSBnZXRfZGlncmFwaChGQUxTRSk7CisJCSAgICBpZiAoYyA+IDApCisJCSAgICB7CisJCQkqY3AgPSBjOworIyBpZmRlZiBGRUFUX0NNRExfSU5GTworCQkJLyogR3Vlc3NpbmcgaG93IHRvIHVwZGF0ZSBzaG93Y21kIGhlcmUuLi4gKi8KKwkJCWRlbF9mcm9tX3Nob3djbWQoMyk7CisJCQluZWVkX2ZsdXNoYnVmIHw9IGFkZF90b19zaG93Y21kKCpjcCk7CisjIGVuZGlmCisJCSAgICB9CisJCX0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9MQU5HTUFQCisJCS8qIGFkanVzdCBjaGFycyA+IDEyNywgZXhjZXB0IGFmdGVyICJ0VGZGciIgY29tbWFuZHMgKi8KKwkJTEFOR01BUF9BREpVU1QoKmNwLCAhbGFuZyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkvKiBhZGp1c3QgSGVicmV3IG1hcHBlZCBjaGFyICovCisJCWlmIChwX2hrbWFwICYmIGxhbmcgJiYgS2V5VHlwZWQpCisJCSAgICAqY3AgPSBoa21hcCgqY3ApOworIyBpZmRlZiBGRUFUX0ZLTUFQCisJCS8qIGFkanVzdCBGYXJzaSBtYXBwZWQgY2hhciAqLworCQlpZiAocF9ma21hcCAmJiBsYW5nICYmIEtleVR5cGVkKQorCQkgICAgKmNwID0gZmttYXAoKmNwKTsKKyMgZW5kaWYKKyNlbmRpZgorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogV2hlbiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgQ1RSTC1cIGEgZm9sbG93aW5nIENUUkwtTiBtZWFucyB0aGUKKwkgICAgICogY29tbWFuZCBpcyBhYm9ydGVkIGFuZCB3ZSBnbyB0byBOb3JtYWwgbW9kZS4KKwkgICAgICovCisJICAgIGlmIChjcCA9PSAmY2EuZXh0cmFfY2hhcgorCQkgICAgJiYgY2EubmNoYXIgPT0gQ3RybF9CU0wKKwkJICAgICYmIChjYS5leHRyYV9jaGFyID09IEN0cmxfTiB8fCBjYS5leHRyYV9jaGFyID09IEN0cmxfRykpCisJICAgIHsKKwkJY2EuY21kY2hhciA9IEN0cmxfQlNMOworCQljYS5uY2hhciA9IGNhLmV4dHJhX2NoYXI7CisJCWlkeCA9IGZpbmRfY29tbWFuZChjYS5jbWRjaGFyKTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqY3AgPT0gQ3RybF9CU0wpCisJICAgIHsKKwkJbG9uZyB0b3dhaXQgPSAocF90dG0gPj0gMCA/IHBfdHRtIDogcF90bSk7CisKKwkJLyogVGhlcmUgaXMgYSBidXN5IHdhaXQgaGVyZSB3aGVuIHR5cGluZyAiZjxDLVw+IiBhbmQgdGhlbgorCQkgKiBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gQ1RSTC1OLiAgQ2FuJ3QgYmUgYXZvaWRlZC4gKi8KKwkJd2hpbGUgKChjID0gdnBlZWtjKCkpIDw9IDAgJiYgdG93YWl0ID4gMEwpCisJCXsKKwkJICAgIGRvX3NsZWVwKHRvd2FpdCA+IDUwTCA/IDUwTCA6IHRvd2FpdCk7CisJCSAgICB0b3dhaXQgLT0gNTBMOworCQl9CisJCWlmIChjID4gMCkKKwkJeworCQkgICAgYyA9IHNhZmVfdmdldGMoKTsKKwkJICAgIGlmIChjICE9IEN0cmxfTiAmJiBjICE9IEN0cmxfRykKKwkJCXZ1bmdldGMoYyk7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQljYS5jbWRjaGFyID0gQ3RybF9CU0w7CisJCQljYS5uY2hhciA9IGM7CisJCQlpZHggPSBmaW5kX2NvbW1hbmQoY2EuY21kY2hhcik7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAvKiBXaGVuIGdldHRpbmcgYSB0ZXh0IGNoYXJhY3RlciBhbmQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEKKwkgICAgICogbXVsdGktYnl0ZSBjaGFyYWN0ZXIsIGl0IGNvdWxkIGJlIGEgY29tcG9zaW5nIGNoYXJhY3Rlci4KKwkgICAgICogSG93ZXZlciwgZG9uJ3Qgd2FpdCBmb3IgaXQgdG8gYXJyaXZlLiAqLworCSAgICB3aGlsZSAoZW5jX3V0ZjggJiYgbGFuZyAmJiAoYyA9IHZwZWVrYygpKSA+IDAKKwkJCQkgJiYgKGMgPj0gMHgxMDAgfHwgTUJfQllURTJMRU4odnBlZWtjKCkpID4gMSkpCisJICAgIHsKKwkJYyA9IHNhZmVfdmdldGMoKTsKKwkJaWYgKCF1dGZfaXNjb21wb3NpbmcoYykpCisJCXsKKwkJICAgIHZ1bmdldGMoYyk7CQkvKiBpdCB3YXNuJ3QsIHB1dCBpdCBiYWNrICovCisJCSAgICBicmVhazsKKwkJfQorCQllbHNlIGlmIChjYS5uY2hhckMxID09IDApCisJCSAgICBjYS5uY2hhckMxID0gYzsKKwkJZWxzZQorCQkgICAgY2EubmNoYXJDMiA9IGM7CisJICAgIH0KKyNlbmRpZgorCX0KKwktLW5vX21hcHBpbmc7CisJLS1hbGxvd19rZXlzOworICAgIH0KKworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgLyoKKyAgICAgKiBGbHVzaCB0aGUgc2hvd2NtZCBjaGFyYWN0ZXJzIG9udG8gdGhlIHNjcmVlbiBzbyB3ZSBjYW4gc2VlIHRoZW0gd2hpbGUKKyAgICAgKiB0aGUgY29tbWFuZCBpcyBiZWluZyBleGVjdXRlZC4gIE9ubHkgZG8gdGhpcyB3aGVuIHRoZSBzaG93biBjb21tYW5kIHdhcworICAgICAqIGFjdHVhbGx5IGRpc3BsYXllZCwgb3RoZXJ3aXNlIHRoaXMgd2lsbCBzbG93IGRvd24gYSBsb3Qgd2hlbiBleGVjdXRpbmcKKyAgICAgKiBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBpZiAobmVlZF9mbHVzaGJ1ZikKKwlvdXRfZmx1c2goKTsKKyNlbmRpZgorCisgICAgU3RhdGUgPSBOT1JNQUw7CisKKyAgICBpZiAoY2EubmNoYXIgPT0gRVNDKQorICAgIHsKKwljbGVhcm9wKG9hcCk7CisJaWYgKHJlc3RhcnRfZWRpdCA9PSAwICYmIGdvdG9faW0oKSkKKwkgICAgcmVzdGFydF9lZGl0ID0gJ2EnOworCWdvdG8gbm9ybWFsX2VuZDsKKyAgICB9CisKKyAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CSAgICAvKiBkb24ndCBzY3JvbGwgc2NyZWVuIHVwIGZvciBub3JtYWwgY29tbWFuZCAqLworICAgIG1zZ19jb2wgPSAwOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBvbGRfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsJCS8qIHJlbWVtYmVyIHdoZXJlIGN1cnNvciB3YXMgKi8KKworICAgIC8qIFdoZW4gJ2tleW1vZGVsJyBjb250YWlucyAic3RhcnRzZWwiIHNvbWUga2V5cyBzdGFydCBTZWxlY3QvVmlzdWFsCisgICAgICogbW9kZS4gKi8KKyAgICBpZiAoIVZJc3VhbF9hY3RpdmUgJiYga21fc3RhcnRzZWwpCisgICAgeworCWlmIChudl9jbWRzW2lkeF0uY21kX2ZsYWdzICYgTlZfU1MpCisJeworCSAgICBzdGFydF9zZWxlY3Rpb24oKTsKKwkgICAgdW5zaGlmdF9zcGVjaWFsKCZjYSk7CisJICAgIGlkeCA9IGZpbmRfY29tbWFuZChjYS5jbWRjaGFyKTsKKwl9CisJZWxzZSBpZiAoKG52X2NtZHNbaWR4XS5jbWRfZmxhZ3MgJiBOVl9TU1MpCisJCQkJCSAgICYmIChtb2RfbWFzayAmIE1PRF9NQVNLX1NISUZUKSkKKwl7CisJICAgIHN0YXJ0X3NlbGVjdGlvbigpOworCSAgICBtb2RfbWFzayAmPSB+TU9EX01BU0tfU0hJRlQ7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kIQorICAgICAqIENhbGwgdGhlIGNvbW1hbmQgZnVuY3Rpb24gZm91bmQgaW4gdGhlIGNvbW1hbmRzIHRhYmxlLgorICAgICAqLworICAgIGNhLmFyZyA9IG52X2NtZHNbaWR4XS5jbWRfYXJnOworICAgIChudl9jbWRzW2lkeF0uY21kX2Z1bmMpKCZjYSk7CisKKyAgICAvKgorICAgICAqIElmIHdlIGRpZG4ndCBzdGFydCBvciBmaW5pc2ggYW4gb3BlcmF0b3IsIHJlc2V0IG9hcC0+cmVnbmFtZSwgdW5sZXNzIHdlCisgICAgICogbmVlZCBpdCBsYXRlci4KKyAgICAgKi8KKyAgICBpZiAoIWZpbmlzaF9vcAorCSAgICAmJiAhb2FwLT5vcF90eXBlCisJICAgICYmIChpZHggPCAwIHx8ICEobnZfY21kc1tpZHhdLmNtZF9mbGFncyAmIE5WX0tFRVBSRUcpKSkKKyAgICB7CisJY2xlYXJvcChvYXApOworI2lmZGVmIEZFQVRfRVZBTAorCXNldF9yZWdfdmFyKCciJyk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIGFuIG9wZXJhdGlvbiBpcyBwZW5kaW5nLCBoYW5kbGUgaXQuLi4KKyAgICAgKi8KKyAgICBkb19wZW5kaW5nX29wZXJhdG9yKCZjYSwgb2xkX2NvbCwgRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBXYWl0IGZvciBhIG1vbWVudCB3aGVuIGEgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICogYnkgdGhlIG1vZGUgbWVzc2FnZS4KKyAgICAgKiBJbiBWaXN1YWwgbW9kZSBhbmQgd2l0aCAiXk8iIGluIEluc2VydCBtb2RlLCBhIHNob3J0IG1lc3NhZ2Ugd2lsbCBiZQorICAgICAqIG92ZXJ3cml0dGVuIGJ5IHRoZSBtb2RlIG1lc3NhZ2UuICBXYWl0IGEgYml0LCB1bnRpbCBhIGtleSBpcyBoaXQuCisgICAgICogSW4gVmlzdWFsIG1vZGUsIGl0J3MgbW9yZSBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgVmlzdWFsIGFyZWEgdXBkYXRlZAorICAgICAqIHRoYW4ga2VlcGluZyBhIG1lc3NhZ2UgKGUuZy4gZnJvbSBhIC9wYXQgc2VhcmNoKS4KKyAgICAgKiBPbmx5IGRvIHRoaXMgaWYgdGhlIGNvbW1hbmQgd2FzIHR5cGVkLCBub3QgZnJvbSBhIG1hcHBpbmcuCisgICAgICogRG9uJ3Qgd2FpdCB3aGVuIGVtc2dfc2lsZW50IGlzIG5vbi16ZXJvLgorICAgICAqIEFsc28gd2FpdCBhIGJpdCBhZnRlciBhbiBlcnJvciBtZXNzYWdlLCBlLmcuIGZvciAiXk86Ii4KKyAgICAgKiBEb24ndCByZWRyYXcgdGhlIHNjcmVlbiwgaXQgd291bGQgcmVtb3ZlIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIGlmICggICAgICAgKChwX3NtZAorCQkgICAgJiYgKHJlc3RhcnRfZWRpdCAhPSAwCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJCXx8IChWSXN1YWxfYWN0aXZlCisJCQkgICAgJiYgb2xkX3Bvcy5sbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bQorCQkJICAgICYmIG9sZF9wb3MuY29sID09IGN1cndpbi0+d19jdXJzb3IuY29sKQorI2VuZGlmCisJCSAgICAgICApCisJCSAgICAmJiAoY2xlYXJfY21kbGluZQorCQkJfHwgcmVkcmF3X2NtZGxpbmUpCisJCSAgICAmJiAobXNnX2RpZG91dCB8fCAobXNnX2RpZGFueSAmJiBtc2dfc2Nyb2xsKSkKKwkJICAgICYmICFtc2dfbm93YWl0CisJCSAgICAmJiBLZXlUeXBlZCkKKwkJfHwgKHJlc3RhcnRfZWRpdCAhPSAwCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJICAgICYmICFWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkJICAgICYmIChtc2dfc2Nyb2xsCisJCQl8fCBlbXNnX29uX2Rpc3BsYXkpKSkKKwkgICAgJiYgb2FwLT5yZWduYW1lID09IDAKKwkgICAgJiYgIShjYS5yZXR2YWwgJiBDQV9DT01NQU5EX0JVU1kpCisJICAgICYmIHN0dWZmX2VtcHR5KCkKKwkgICAgJiYgdHlwZWJ1Zl90eXBlZCgpCisJICAgICYmIGVtc2dfc2lsZW50ID09IDAKKwkgICAgJiYgIWRpZF93YWl0X3JldHVybgorCSAgICAmJiBvYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorICAgIHsKKwlpbnQJc2F2ZV9TdGF0ZSA9IFN0YXRlOworCisJLyogRHJhdyB0aGUgY3Vyc29yIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGhlcmUgKi8KKwlpZiAocmVzdGFydF9lZGl0ICE9IDApCisJICAgIFN0YXRlID0gSU5TRVJUOworCisJLyogSWYgbmVlZCB0byByZWRyYXcsIGFuZCB0aGVyZSBpcyBhICJrZWVwX21zZyIsIHJlZHJhdyBiZWZvcmUgdGhlCisJICogZGVsYXkgKi8KKwlpZiAobXVzdF9yZWRyYXcgJiYga2VlcF9tc2cgIT0gTlVMTCAmJiAhZW1zZ19vbl9kaXNwbGF5KQorCXsKKwkgICAgY2hhcl91CSprbXNnOworCisJICAgIGttc2cgPSBrZWVwX21zZzsKKwkgICAga2VlcF9tc2cgPSBOVUxMOworCSAgICAvKiBzaG93bW9kZSgpIHdpbGwgY2xlYXIga2VlcF9tc2csIGJ1dCB3ZSB3YW50IHRvIHVzZSBpdCBhbnl3YXkgKi8KKwkgICAgdXBkYXRlX3NjcmVlbigwKTsKKwkgICAgLyogbm93IHJlc2V0IGl0LCBvdGhlcndpc2UgaXQncyBwdXQgaW4gdGhlIGhpc3RvcnkgYWdhaW4gKi8KKwkgICAga2VlcF9tc2cgPSBrbXNnOworCSAgICBtc2dfYXR0cihrbXNnLCBrZWVwX21zZ19hdHRyKTsKKwkgICAgdmltX2ZyZWUoa21zZyk7CisJfQorCXNldGN1cnNvcigpOworCWN1cnNvcl9vbigpOworCW91dF9mbHVzaCgpOworCWlmIChtc2dfc2Nyb2xsIHx8IGVtc2dfb25fZGlzcGxheSkKKwkgICAgdWlfZGVsYXkoMTAwMEwsIFRSVUUpOwkvKiB3YWl0IGF0IGxlYXN0IG9uZSBzZWNvbmQgKi8KKwl1aV9kZWxheSgzMDAwTCwgRkFMU0UpOwkJLyogd2FpdCB1cCB0byB0aHJlZSBzZWNvbmRzICovCisJU3RhdGUgPSBzYXZlX1N0YXRlOworCisJbXNnX3Njcm9sbCA9IEZBTFNFOworCWVtc2dfb25fZGlzcGxheSA9IEZBTFNFOworICAgIH0KKworICAgIC8qCisgICAgICogRmluaXNoIHVwIGFmdGVyIGV4ZWN1dGluZyBhIE5vcm1hbCBtb2RlIGNvbW1hbmQuCisgICAgICovCitub3JtYWxfZW5kOgorCisgICAgbXNnX25vd2FpdCA9IEZBTFNFOworCisgICAgLyogUmVzZXQgZmluaXNoX29wLCBpbiBjYXNlIGl0IHdhcyBzZXQgKi8KKyNpZmRlZiBDVVJTT1JfU0hBUEUKKyAgICBjID0gZmluaXNoX29wOworI2VuZGlmCisgICAgZmluaXNoX29wID0gRkFMU0U7CisjaWZkZWYgQ1VSU09SX1NIQVBFCisgICAgLyogUmVkcmF3IHRoZSBjdXJzb3Igd2l0aCBhbm90aGVyIHNoYXBlLCBpZiB3ZSB3ZXJlIGluIE9wZXJhdG9yLXBlbmRpbmcKKyAgICAgKiBtb2RlIG9yIGRpZCBhIHJlcGxhY2UgY29tbWFuZC4gKi8KKyAgICBpZiAoYyB8fCBjYS5jbWRjaGFyID09ICdyJykKKyAgICB7CisJdWlfY3Vyc29yX3NoYXBlKCk7CQkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjIGlmZGVmIEZFQVRfTU9VU0VTSEFQRQorCXVwZGF0ZV9tb3VzZXNoYXBlKC0xKTsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgaWYgKG9hcC0+b3BfdHlwZSA9PSBPUF9OT1AgJiYgb2FwLT5yZWduYW1lID09IDApCisJY2xlYXJfc2hvd2NtZCgpOworI2VuZGlmCisKKyAgICBjaGVja3BjbWFyaygpOwkJLyogY2hlY2sgaWYgd2UgbW92ZWQgc2luY2Ugc2V0dGluZyBwY21hcmsgKi8KKyAgICB2aW1fZnJlZShjYS5zZWFyY2hidWYpOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisJbWJfYWRqdXN0X2N1cnNvcigpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKyAgICBpZiAoY3Vyd2luLT53X3Bfc2NiICYmIHRvcGxldmVsKQorICAgIHsKKwl2YWxpZGF0ZV9jdXJzb3IoKTsJLyogbWF5IG5lZWQgdG8gdXBkYXRlIHdfbGVmdGNvbCAqLworCWRvX2NoZWNrX3Njcm9sbGJpbmQoVFJVRSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIE1heSByZXN0YXJ0IGVkaXQoKSwgaWYgd2UgZ290IGhlcmUgd2l0aCBDVFJMLU8gaW4gSW5zZXJ0IG1vZGUgKGJ1dCBub3QKKyAgICAgKiBpZiBzdGlsbCBpbnNpZGUgYSBtYXBwaW5nIHRoYXQgc3RhcnRlZCBpbiBWaXN1YWwgbW9kZSkuCisgICAgICogTWF5IHN3aXRjaCBmcm9tIFZpc3VhbCB0byBTZWxlY3QgbW9kZSBhZnRlciBDVFJMLU8gY29tbWFuZC4KKyAgICAgKi8KKyAgICBpZiAoICAgICAgIG9hcC0+b3BfdHlwZSA9PSBPUF9OT1AKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICAmJiAoKHJlc3RhcnRfZWRpdCAhPSAwICYmICFWSXN1YWxfYWN0aXZlICYmIG9sZF9tYXBwZWRfbGVuID09IDApCisJCXx8IHJlc3RhcnRfVklzdWFsX3NlbGVjdCA9PSAxKQorI2VuZGlmCisJICAgICYmICEoY2EucmV0dmFsICYgQ0FfQ09NTUFORF9CVVNZKQorCSAgICAmJiBzdHVmZl9lbXB0eSgpCisJICAgICYmIG9hcC0+cmVnbmFtZSA9PSAwKQorICAgIHsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChyZXN0YXJ0X1ZJc3VhbF9zZWxlY3QgPT0gMSkKKwl7CisJICAgIFZJc3VhbF9zZWxlY3QgPSBUUlVFOworCSAgICBzaG93bW9kZSgpOworCSAgICByZXN0YXJ0X1ZJc3VhbF9zZWxlY3QgPSAwOworCX0KKyNlbmRpZgorCWlmIChyZXN0YXJ0X2VkaXQgIT0gMAorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICFWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkJJiYgb2xkX21hcHBlZF9sZW4gPT0gMCkKKwkgICAgKHZvaWQpZWRpdChyZXN0YXJ0X2VkaXQsIEZBTFNFLCAxTCk7CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAocmVzdGFydF9WSXN1YWxfc2VsZWN0ID09IDIpCisJcmVzdGFydF9WSXN1YWxfc2VsZWN0ID0gMTsKKyNlbmRpZgorCisgICAgLyogU2F2ZSBjb3VudCBiZWZvcmUgYW4gb3BlcmF0b3IgZm9yIG5leHQgdGltZS4gKi8KKyAgICBvcGNvdW50ID0gY2Eub3Bjb3VudDsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBvcGVyYXRvciBhZnRlciB2aXN1YWwgbW9kZSBvciB3aGVuIHRoZSBtb3ZlbWVudCBpcyBmaW5pc2hlZAorICovCisgICAgdm9pZAorZG9fcGVuZGluZ19vcGVyYXRvcihjYXAsIG9sZF9jb2wsIGd1aV95YW5rKQorICAgIGNtZGFyZ19UCSpjYXA7CisgICAgaW50CQlvbGRfY29sOworICAgIGludAkJZ3VpX3lhbms7Cit7CisgICAgb3BhcmdfVAkqb2FwID0gY2FwLT5vYXA7CisgICAgcG9zX1QJb2xkX2N1cnNvcjsKKyAgICBpbnQJCWVtcHR5X3JlZ2lvbl9lcnJvcjsKKyAgICBpbnQJCXJlc3RhcnRfZWRpdF9zYXZlOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiBUaGUgdmlzdWFsIGFyZWEgaXMgcmVtZW1iZXJlZCBmb3IgcmVkbyAqLworICAgIHN0YXRpYyBpbnQJICAgIHJlZG9fVklzdWFsX21vZGUgPSBOVUw7IC8qICd2JywgJ1YnLCBvciBDdHJsLVYgKi8KKyAgICBzdGF0aWMgbGluZW5yX1QgcmVkb19WSXN1YWxfbGluZV9jb3VudDsgLyogbnVtYmVyIG9mIGxpbmVzICovCisgICAgc3RhdGljIGNvbG5yX1QgIHJlZG9fVklzdWFsX2NvbDsJICAgIC8qIG51bWJlciBvZiBjb2xzIG9yIGVuZCBjb2x1bW4gKi8KKyAgICBzdGF0aWMgbG9uZwkgICAgcmVkb19WSXN1YWxfY291bnQ7CSAgICAvKiBjb3VudCBmb3IgVmlzdWFsIG9wZXJhdG9yICovCisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBpbnQJCSAgICBpbmNsdWRlX2xpbmVfYnJlYWsgPSBGQUxTRTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkKKyAgICAvKgorICAgICAqIFlhbmsgdGhlIHZpc3VhbCBhcmVhIGludG8gdGhlIEdVSSBzZWxlY3Rpb24gcmVnaXN0ZXIgYmVmb3JlIHdlIG9wZXJhdGUKKyAgICAgKiBvbiBpdCBhbmQgbG9zZSBpdCBmb3JldmVyLgorICAgICAqIERvbid0IGRvIGl0IGlmIGEgc3BlY2lmaWMgcmVnaXN0ZXIgd2FzIHNwZWNpZmllZCwgc28gdGhhdCAiIngiKlAgd29ya3MuCisgICAgICogVGhpcyBjb3VsZCBjYWxsIGRvX3BlbmRpbmdfb3BlcmF0b3IoKSByZWN1cnNpdmVseSwgYnV0IHRoYXQncyBPSworICAgICAqIGJlY2F1c2UgZ3VpX3lhbmsgd2lsbCBiZSBUUlVFIGZvciB0aGUgbmVzdGVkIGNhbGwuCisgICAgICovCisgICAgaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUKKwkgICAgJiYgb2FwLT5vcF90eXBlICE9IE9QX05PUAorCSAgICAmJiAhZ3VpX3lhbmsKKyMgaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgJiYgVklzdWFsX2FjdGl2ZQorCSAgICAmJiAhcmVkb19WSXN1YWxfYnVzeQorIyBlbmRpZgorCSAgICAmJiBvYXAtPnJlZ25hbWUgPT0gMCkKKwljbGlwX2F1dG9fc2VsZWN0KCk7CisjZW5kaWYKKyAgICBvbGRfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKworICAgIC8qCisgICAgICogSWYgYW4gb3BlcmF0aW9uIGlzIHBlbmRpbmcsIGhhbmRsZSBpdC4uLgorICAgICAqLworICAgIGlmICgoZmluaXNoX29wCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJfHwgVklzdWFsX2FjdGl2ZQorI2VuZGlmCisJCSkgJiYgb2FwLT5vcF90eXBlICE9IE9QX05PUCkKKyAgICB7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwlvYXAtPmlzX1ZJc3VhbCA9IFZJc3VhbF9hY3RpdmU7CisJaWYgKG9hcC0+bW90aW9uX2ZvcmNlID09ICdWJykKKwkgICAgb2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworCWVsc2UgaWYgKG9hcC0+bW90aW9uX2ZvcmNlID09ICd2JykKKwl7CisJICAgIC8qIElmIHRoZSBtb3Rpb24gd2FzIGxpbmV3aXNlLCAiaW5jbHVzaXZlIiB3aWxsIG5vdCBoYXZlIGJlZW4gc2V0LgorCSAgICAgKiBVc2UgImV4Y2x1c2l2ZSIgdG8gYmUgY29uc2lzdGVudC4gIE1ha2VzICJkdmoiIHdvcmsgbmljZS4gKi8KKwkgICAgaWYgKG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisJCW9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisJICAgIC8qIElmIHRoZSBtb3Rpb24gYWxyZWFkeSB3YXMgY2hhcmFjdGVyd2lzZSwgdG9nZ2xlICJpbmNsdXNpdmUiICovCisJICAgIGVsc2UgaWYgKG9hcC0+bW90aW9uX3R5cGUgPT0gTUNIQVIpCisJCW9hcC0+aW5jbHVzaXZlID0gIW9hcC0+aW5jbHVzaXZlOworCSAgICBvYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisJfQorCWVsc2UgaWYgKG9hcC0+bW90aW9uX2ZvcmNlID09IEN0cmxfVikKKwl7CisJICAgIC8qIENoYW5nZSBsaW5lLSBvciBjaGFyYWN0ZXJ3aXNlIG1vdGlvbiBpbnRvIFZpc3VhbCBibG9jayBtb2RlLiAqLworCSAgICBWSXN1YWxfYWN0aXZlID0gVFJVRTsKKwkgICAgVklzdWFsID0gb2FwLT5zdGFydDsKKwkgICAgVklzdWFsX21vZGUgPSBDdHJsX1Y7CisJICAgIFZJc3VhbF9zZWxlY3QgPSBGQUxTRTsKKwkgICAgVklzdWFsX3Jlc2VsZWN0ID0gRkFMU0U7CisJfQorI2VuZGlmCisKKwkvKiBvbmx5IHJlZG8geWFuayB3aGVuICd5JyBmbGFnIGlzIGluICdjcG9wdGlvbnMnICovCisJLyogbmV2ZXIgcmVkbyAiemYiIChkZWZpbmUgZm9sZCkgKi8KKwlpZiAoKHZpbV9zdHJjaHIocF9jcG8sIENQT19ZQU5LKSAhPSBOVUxMIHx8IG9hcC0+b3BfdHlwZSAhPSBPUF9ZQU5LKQorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICghVklzdWFsX2FjdGl2ZSB8fCBvYXAtPm1vdGlvbl9mb3JjZSkKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCQkmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRAorCQkmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRE9QRU4KKwkJJiYgb2FwLT5vcF90eXBlICE9IE9QX0ZPTERPUEVOUkVDCisJCSYmIG9hcC0+b3BfdHlwZSAhPSBPUF9GT0xEQ0xPU0UKKwkJJiYgb2FwLT5vcF90eXBlICE9IE9QX0ZPTERDTE9TRVJFQworCQkmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRERFTAorCQkmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRERFTFJFQworI2VuZGlmCisJCSkKKwl7CisJICAgIHByZXBfcmVkbyhvYXAtPnJlZ25hbWUsIGNhcC0+Y291bnQwLAorCQkgICAgZ2V0X29wX2NoYXIob2FwLT5vcF90eXBlKSwgZ2V0X2V4dHJhX29wX2NoYXIob2FwLT5vcF90eXBlKSwKKwkJICAgIG9hcC0+bW90aW9uX2ZvcmNlLCBjYXAtPmNtZGNoYXIsIGNhcC0+bmNoYXIpOworCSAgICBpZiAoY2FwLT5jbWRjaGFyID09ICcvJyB8fCBjYXAtPmNtZGNoYXIgPT0gJz8nKSAvKiB3YXMgYSBzZWFyY2ggKi8KKwkgICAgeworCQkvKgorCQkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdyJywgaW5zZXJ0IHRoZSBzZWFyY2gKKwkJICogcGF0dGVybiB0byByZWFsbHkgcmVwZWF0IHRoZSBzYW1lIGNvbW1hbmQuCisJCSAqLworCQlpZiAodmltX3N0cmNocihwX2NwbywgQ1BPX1JFRE8pID09IE5VTEwpCisJCSAgICBBcHBlbmRUb1JlZG9idWZmTGl0KGNhcC0+c2VhcmNoYnVmKTsKKwkJQXBwZW5kVG9SZWRvYnVmZihOTF9TVFIpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGNhcC0+Y21kY2hhciA9PSAnOicpCisJICAgIHsKKwkJLyogZG9fY21kbGluZSgpIGhhcyBzdG9yZWQgdGhlIGZpcnN0IHR5cGVkIGxpbmUgaW4KKwkJICogInJlcGVhdF9jbWRsaW5lIi4gIFdoZW4gc2V2ZXJhbCBsaW5lcyBhcmUgdHlwZWQgcmVwZWF0aW5nCisJCSAqIHdvbid0IGJlIHBvc3NpYmxlLiAqLworCQlpZiAocmVwZWF0X2NtZGxpbmUgPT0gTlVMTCkKKwkJICAgIFJlc2V0UmVkb2J1ZmYoKTsKKwkJZWxzZQorCQl7CisJCSAgICBBcHBlbmRUb1JlZG9idWZmTGl0KHJlcGVhdF9jbWRsaW5lKTsKKwkJICAgIEFwcGVuZFRvUmVkb2J1ZmYoTkxfU1RSKTsKKwkJICAgIHZpbV9mcmVlKHJlcGVhdF9jbWRsaW5lKTsKKwkJICAgIHJlcGVhdF9jbWRsaW5lID0gTlVMTDsKKwkJfQorCSAgICB9CisJfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKwlpZiAocmVkb19WSXN1YWxfYnVzeSkKKwl7CisJICAgIG9hcC0+c3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gKz0gcmVkb19WSXN1YWxfbGluZV9jb3VudCAtIDE7CisJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIFZJc3VhbF9tb2RlID0gcmVkb19WSXN1YWxfbW9kZTsKKwkgICAgaWYgKFZJc3VhbF9tb2RlID09ICd2JykKKwkgICAgeworCQlpZiAocmVkb19WSXN1YWxfbGluZV9jb3VudCA8PSAxKQorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gcmVkb19WSXN1YWxfY29sIC0gMTsKKwkJZWxzZQorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSByZWRvX1ZJc3VhbF9jb2w7CisJICAgIH0KKwkgICAgaWYgKHJlZG9fVklzdWFsX2NvbCA9PSBNQVhDT0wpCisJICAgIHsKKwkJY3Vyd2luLT53X2N1cnN3YW50ID0gTUFYQ09MOworCQljb2xhZHZhbmNlKChjb2xucl9UKU1BWENPTCk7CisJICAgIH0KKwkgICAgY2FwLT5jb3VudDAgPSByZWRvX1ZJc3VhbF9jb3VudDsKKwkgICAgaWYgKHJlZG9fVklzdWFsX2NvdW50ICE9IDApCisJCWNhcC0+Y291bnQxID0gcmVkb19WSXN1YWxfY291bnQ7CisJICAgIGVsc2UKKwkJY2FwLT5jb3VudDEgPSAxOworCX0KKwllbHNlIGlmIChWSXN1YWxfYWN0aXZlKQorCXsKKwkgICAgLyogU2F2ZSB0aGUgY3VycmVudCBWSXN1YWwgYXJlYSBmb3IgJzwgYW5kICc+IG1hcmtzLCBhbmQgImd2IiAqLworCSAgICBjdXJidWYtPmJfdmlzdWFsX3N0YXJ0ID0gVklzdWFsOworCSAgICBjdXJidWYtPmJfdmlzdWFsX2VuZCA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIGN1cmJ1Zi0+Yl92aXN1YWxfbW9kZSA9IFZJc3VhbF9tb2RlOworIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgY3VyYnVmLT5iX3Zpc3VhbF9tb2RlX2V2YWwgPSBWSXN1YWxfbW9kZTsKKyMgZW5kaWYKKwkgICAgY3VyYnVmLT5iX3Zpc3VhbF9jdXJzd2FudCA9IGN1cndpbi0+d19jdXJzd2FudDsKKworCSAgICAvKiBJbiBTZWxlY3QgbW9kZSwgYSBsaW5ld2lzZSBzZWxlY3Rpb24gaXMgb3BlcmF0ZWQgdXBvbiBsaWtlIGEKKwkgICAgICogY2hhcmFjdGVyd2lzZSBzZWxlY3Rpb24uICovCisJICAgIGlmIChWSXN1YWxfc2VsZWN0ICYmIFZJc3VhbF9tb2RlID09ICdWJykKKwkgICAgeworCQlpZiAobHQoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKwkJeworCQkgICAgVklzdWFsLmNvbCA9IDA7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9CisJCQkgICAgICAgKGNvbG5yX1QpU1RSTEVOKG1sX2dldChjdXJ3aW4tPndfY3Vyc29yLmxudW0pKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwkJICAgIFZJc3VhbC5jb2wgPSAoY29sbnJfVClTVFJMRU4obWxfZ2V0KFZJc3VhbC5sbnVtKSk7CisJCX0KKwkJVklzdWFsX21vZGUgPSAndic7CisJICAgIH0KKwkgICAgLyogSWYgJ3NlbGVjdGlvbicgaXMgImV4Y2x1c2l2ZSIsIGJhY2t1cCBvbmUgY2hhcmFjdGVyIGZvcgorCSAgICAgKiBjaGFyd2lzZSBzZWxlY3Rpb25zLiAqLworCSAgICBlbHNlIGlmIChWSXN1YWxfbW9kZSA9PSAndicpCisJICAgIHsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQlpbmNsdWRlX2xpbmVfYnJlYWsgPQorIyBlbmRpZgorCQkgICAgdW5hZGp1c3RfZm9yX3NlbCgpOworCSAgICB9CisKKwkgICAgb2FwLT5zdGFydCA9IFZJc3VhbDsKKwkgICAgaWYgKFZJc3VhbF9tb2RlID09ICdWJykKKwkJb2FwLT5zdGFydC5jb2wgPSAwOworCX0KKyNlbmRpZiAvKiBGRUFUX1ZJU1VBTCAqLworCisJLyoKKwkgKiBTZXQgb2FwLT5zdGFydCB0byB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIG9wZXJhdGVkIHRleHQsIG9hcC0+ZW5kCisJICogdG8gdGhlIGVuZCBvZiB0aGUgb3BlcmF0ZWQgdGV4dC4gIHdfY3Vyc29yIGlzIGVxdWFsIHRvIG9hcC0+c3RhcnQuCisJICovCisJaWYgKGx0KG9hcC0+c3RhcnQsIGN1cndpbi0+d19jdXJzb3IpKQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgLyogSW5jbHVkZSBmb2xkZWQgbGluZXMgY29tcGxldGVseS4gKi8KKwkgICAgaWYgKCFWSXN1YWxfYWN0aXZlKQorCSAgICB7CisJCWlmIChoYXNGb2xkaW5nKG9hcC0+c3RhcnQubG51bSwgJm9hcC0+c3RhcnQubG51bSwgTlVMTCkpCisJCSAgICBvYXAtPnN0YXJ0LmNvbCA9IDA7CisJCWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCwKKwkJCQkJCSAgICAgICZjdXJ3aW4tPndfY3Vyc29yLmxudW0pKQorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAoY29sbnJfVClTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSk7CisJICAgIH0KKyNlbmRpZgorCSAgICBvYXAtPmVuZCA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBvYXAtPnN0YXJ0OworCisJICAgIC8qIHdfdmlydGNvbCBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQ7IGlmIHRoZSBjdXJzb3IgZ29lcyBiYWNrIHRvIGl0cworCSAgICAgKiBwcmV2aW91cyBwb3NpdGlvbiB3X3ZpcnRjb2wgYmVjb21lcyBpbnZhbGlkIGFuZCBpc24ndCB1cGRhdGVkCisJICAgICAqIGF1dG9tYXRpY2FsbHkuICovCisJICAgIGN1cndpbi0+d192YWxpZCAmPSB+VkFMSURfVklSVENPTDsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgLyogSW5jbHVkZSBmb2xkZWQgbGluZXMgY29tcGxldGVseS4gKi8KKwkgICAgaWYgKCFWSXN1YWxfYWN0aXZlICYmIG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisJICAgIHsKKwkJaWYgKGhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLCAmY3Vyd2luLT53X2N1cnNvci5sbnVtLAorCQkJCQkJCQkJTlVMTCkpCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisJCWlmIChoYXNGb2xkaW5nKG9hcC0+c3RhcnQubG51bSwgTlVMTCwgJm9hcC0+c3RhcnQubG51bSkpCisJCSAgICBvYXAtPnN0YXJ0LmNvbCA9IChjb2xucl9UKVNUUkxFTihtbF9nZXQob2FwLT5zdGFydC5sbnVtKSk7CisJICAgIH0KKyNlbmRpZgorCSAgICBvYXAtPmVuZCA9IG9hcC0+c3RhcnQ7CisJICAgIG9hcC0+c3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOworCX0KKworCW9hcC0+bGluZV9jb3VudCA9IG9hcC0+ZW5kLmxudW0gLSBvYXAtPnN0YXJ0LmxudW0gKyAxOworCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCS8qIFNldCAidmlydHVhbF9vcCIgYmVmb3JlIHJlc2V0dGluZyBWSXN1YWxfYWN0aXZlLiAqLworCXZpcnR1YWxfb3AgPSB2aXJ0dWFsX2FjdGl2ZSgpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChWSXN1YWxfYWN0aXZlIHx8IHJlZG9fVklzdWFsX2J1c3kpCisJeworCSAgICBpZiAoVklzdWFsX21vZGUgPT0gQ3RybF9WKQkvKiBibG9jayBtb2RlICovCisJICAgIHsKKwkJY29sbnJfVAkgICAgc3RhcnQsIGVuZDsKKworCQlvYXAtPmJsb2NrX21vZGUgPSBUUlVFOworCisJCWdldHZ2Y29sKGN1cndpbiwgJihvYXAtPnN0YXJ0KSwKKwkJCQkgICAgICAmb2FwLT5zdGFydF92Y29sLCBOVUxMLCAmb2FwLT5lbmRfdmNvbCk7CisJCWlmICghcmVkb19WSXN1YWxfYnVzeSkKKwkJeworCQkgICAgZ2V0dnZjb2woY3Vyd2luLCAmKG9hcC0+ZW5kKSwgJnN0YXJ0LCBOVUxMLCAmZW5kKTsKKworCQkgICAgaWYgKHN0YXJ0IDwgb2FwLT5zdGFydF92Y29sKQorCQkJb2FwLT5zdGFydF92Y29sID0gc3RhcnQ7CisJCSAgICBpZiAoZW5kID4gb2FwLT5lbmRfdmNvbCkKKwkJICAgIHsKKwkJCWlmICgqcF9zZWwgPT0gJ2UnICYmIHN0YXJ0ID49IDEKKwkJCQkJCSYmIHN0YXJ0IC0gMSA+PSBvYXAtPmVuZF92Y29sKQorCQkJICAgIG9hcC0+ZW5kX3Zjb2wgPSBzdGFydCAtIDE7CisJCQllbHNlCisJCQkgICAgb2FwLT5lbmRfdmNvbCA9IGVuZDsKKwkJICAgIH0KKwkJfQorCisJCS8qIGlmICckJyB3YXMgdXNlZCwgZ2V0IG9hcC0+ZW5kX3Zjb2wgZnJvbSBsb25nZXN0IGxpbmUgKi8KKwkJaWYgKGN1cndpbi0+d19jdXJzd2FudCA9PSBNQVhDT0wpCisJCXsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gTUFYQ09MOworCQkgICAgb2FwLT5lbmRfdmNvbCA9IDA7CisJCSAgICBmb3IgKGN1cndpbi0+d19jdXJzb3IubG51bSA9IG9hcC0+c3RhcnQubG51bTsKKwkJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPD0gb2FwLT5lbmQubG51bTsKKwkJCQkJCSAgICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQkgICAgeworCQkJZ2V0dnZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgTlVMTCwgTlVMTCwgJmVuZCk7CisJCQlpZiAoZW5kID4gb2FwLT5lbmRfdmNvbCkKKwkJCSAgICBvYXAtPmVuZF92Y29sID0gZW5kOworCQkgICAgfQorCQl9CisJCWVsc2UgaWYgKHJlZG9fVklzdWFsX2J1c3kpCisJCSAgICBvYXAtPmVuZF92Y29sID0gb2FwLT5zdGFydF92Y29sICsgcmVkb19WSXN1YWxfY29sIC0gMTsKKwkJLyoKKwkJICogQ29ycmVjdCBvYXAtPmVuZC5jb2wgYW5kIG9hcC0+c3RhcnQuY29sIHRvIGJlIHRoZQorCQkgKiB1cHBlci1sZWZ0IGFuZCBsb3dlci1yaWdodCBjb3JuZXIgb2YgdGhlIGJsb2NrIGFyZWEuCisJCSAqCisJCSAqIChBY3R1YWxseSwgdGhpcyBkb2VzIGNvbnZlcnQgY29sdW1uIHBvc2l0aW9ucyBpbnRvIGNoYXJhY3RlcgorCQkgKiBwb3NpdGlvbnMpCisJCSAqLworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvYXAtPmVuZC5sbnVtOworCQljb2xhZHZhbmNlKG9hcC0+ZW5kX3Zjb2wpOworCQlvYXAtPmVuZCA9IGN1cndpbi0+d19jdXJzb3I7CisKKwkJY3Vyd2luLT53X2N1cnNvciA9IG9hcC0+c3RhcnQ7CisJCWNvbGFkdmFuY2Uob2FwLT5zdGFydF92Y29sKTsKKwkJb2FwLT5zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIH0KKworCSAgICBpZiAoIXJlZG9fVklzdWFsX2J1c3kgJiYgIWd1aV95YW5rKQorCSAgICB7CisJCS8qCisJCSAqIFByZXBhcmUgdG8gcmVzZWxlY3QgYW5kIHJlZG8gVmlzdWFsOiB0aGlzIGlzIGJhc2VkIG9uIHRoZQorCQkgKiBzaXplIG9mIHRoZSBWaXN1YWwgdGV4dAorCQkgKi8KKwkJcmVzZWxfVklzdWFsX21vZGUgPSBWSXN1YWxfbW9kZTsKKwkJaWYgKGN1cndpbi0+d19jdXJzd2FudCA9PSBNQVhDT0wpCisJCSAgICByZXNlbF9WSXN1YWxfY29sID0gTUFYQ09MOworCQllbHNlIGlmIChWSXN1YWxfbW9kZSA9PSBDdHJsX1YpCisJCSAgICByZXNlbF9WSXN1YWxfY29sID0gb2FwLT5lbmRfdmNvbCAtIG9hcC0+c3RhcnRfdmNvbCArIDE7CisJCWVsc2UgaWYgKG9hcC0+bGluZV9jb3VudCA+IDEpCisJCSAgICByZXNlbF9WSXN1YWxfY29sID0gb2FwLT5lbmQuY29sOworCQllbHNlCisJCSAgICByZXNlbF9WSXN1YWxfY29sID0gb2FwLT5lbmQuY29sIC0gb2FwLT5zdGFydC5jb2wgKyAxOworCQlyZXNlbF9WSXN1YWxfbGluZV9jb3VudCA9IG9hcC0+bGluZV9jb3VudDsKKwkgICAgfQorCisJICAgIC8qIGNhbid0IHJlZG8geWFuayAodW5sZXNzICd5JyBpcyBpbiAnY3BvcHRpb25zJykgYW5kICI6IiAqLworCSAgICBpZiAoKHZpbV9zdHJjaHIocF9jcG8sIENQT19ZQU5LKSAhPSBOVUxMIHx8IG9hcC0+b3BfdHlwZSAhPSBPUF9ZQU5LKQorCQkgICAgJiYgb2FwLT5vcF90eXBlICE9IE9QX0NPTE9OCisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSAgICAmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRAorCQkgICAgJiYgb2FwLT5vcF90eXBlICE9IE9QX0ZPTERPUEVOCisJCSAgICAmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRE9QRU5SRUMKKwkJICAgICYmIG9hcC0+b3BfdHlwZSAhPSBPUF9GT0xEQ0xPU0UKKwkJICAgICYmIG9hcC0+b3BfdHlwZSAhPSBPUF9GT0xEQ0xPU0VSRUMKKwkJICAgICYmIG9hcC0+b3BfdHlwZSAhPSBPUF9GT0xEREVMCisJCSAgICAmJiBvYXAtPm9wX3R5cGUgIT0gT1BfRk9MRERFTFJFQworI2VuZGlmCisJCSAgICAmJiBvYXAtPm1vdGlvbl9mb3JjZSA9PSBOVUwKKwkJICAgICkKKwkgICAgeworCQkvKiBQcmVwYXJlIGZvciByZWRvaW5nLiAgT25seSB1c2UgdGhlIG5jaGFyIGZpZWxkIGZvciAiciIsCisJCSAqIG90aGVyd2lzZSBpdCBtaWdodCBiZSB0aGUgc2Vjb25kIGNoYXIgb2YgdGhlIG9wZXJhdG9yLiAqLworCQlwcmVwX3JlZG8ob2FwLT5yZWduYW1lLCAwTCwgTlVMLCAndicsCisJCQkJZ2V0X29wX2NoYXIob2FwLT5vcF90eXBlKSwKKwkJCQlnZXRfZXh0cmFfb3BfY2hhcihvYXAtPm9wX3R5cGUpLAorCQkJCW9hcC0+b3BfdHlwZSA9PSBPUF9SRVBMQUNFID8gY2FwLT5uY2hhciA6IE5VTCk7CisJCWlmICghcmVkb19WSXN1YWxfYnVzeSkKKwkJeworCQkgICAgcmVkb19WSXN1YWxfbW9kZSA9IHJlc2VsX1ZJc3VhbF9tb2RlOworCQkgICAgcmVkb19WSXN1YWxfY29sID0gcmVzZWxfVklzdWFsX2NvbDsKKwkJICAgIHJlZG9fVklzdWFsX2xpbmVfY291bnQgPSByZXNlbF9WSXN1YWxfbGluZV9jb3VudDsKKwkJICAgIHJlZG9fVklzdWFsX2NvdW50ID0gY2FwLT5jb3VudDA7CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIG9hcC0+aW5jbHVzaXZlIGRlZmF1bHRzIHRvIFRSVUUuCisJICAgICAqIElmIG9hcC0+ZW5kIGlzIG9uIGEgTlVMIChlbXB0eSBsaW5lKSBvYXAtPmluY2x1c2l2ZSBiZWNvbWVzCisJICAgICAqIEZBTFNFLiAgVGhpcyBtYWtlcyAiZH1QIiBhbmQgInZ9ZFAiIHdvcmsgdGhlIHNhbWUuCisJICAgICAqLworCSAgICBpZiAob2FwLT5tb3Rpb25fZm9yY2UgPT0gTlVMIHx8IG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisJCW9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKwkgICAgaWYgKFZJc3VhbF9tb2RlID09ICdWJykKKwkJb2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworCSAgICBlbHNlCisJICAgIHsKKwkJb2FwLT5tb3Rpb25fdHlwZSA9IE1DSEFSOworCQlpZiAoVklzdWFsX21vZGUgIT0gQ3RybF9WICYmICptbF9nZXRfcG9zKCYob2FwLT5lbmQpKSA9PSBOVUwKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkJJiYgKGluY2x1ZGVfbGluZV9icmVhayB8fCAhdmlydHVhbF9vcCkKKyMgZW5kaWYKKwkJCSkKKwkJeworCQkgICAgb2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKwkJICAgIC8qIFRyeSB0byBpbmNsdWRlIHRoZSBuZXdsaW5lLCB1bmxlc3MgaXQncyBhbiBvcGVyYXRvcgorCQkgICAgICogdGhhdCB3b3JrcyBvbiBsaW5lcyBvbmx5ICovCisJCSAgICBpZiAoKnBfc2VsICE9ICdvJworCQkJICAgICYmICFvcF9vbl9saW5lcyhvYXAtPm9wX3R5cGUpCisJCQkgICAgJiYgb2FwLT5lbmQubG51bSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQkgICAgeworCQkJKytvYXAtPmVuZC5sbnVtOworCQkJb2FwLT5lbmQuY29sID0gMDsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkJb2FwLT5lbmQuY29sYWRkID0gMDsKKyMgZW5kaWYKKwkJCSsrb2FwLT5saW5lX2NvdW50OworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICByZWRvX1ZJc3VhbF9idXN5ID0gRkFMU0U7CisJICAgIC8qCisJICAgICAqIFN3aXRjaCBWaXN1YWwgb2ZmIG5vdywgc28gc2NyZWVuIHVwZGF0aW5nIGRvZXMKKwkgICAgICogbm90IHNob3cgaW52ZXJ0ZWQgdGV4dCB3aGVuIHRoZSBzY3JlZW4gaXMgcmVkcmF3bi4KKwkgICAgICogV2l0aCBPUF9ZQU5LIGFuZCBzb21ldGltZXMgd2l0aCBPUF9DT0xPTiBhbmQgT1BfRklMVEVSIHRoZXJlIGlzCisJICAgICAqIG5vIHNjcmVlbiByZWRyYXcsIHNvIGl0IGlzIGRvbmUgaGVyZSB0byByZW1vdmUgdGhlIGludmVydGVkCisJICAgICAqIHBhcnQuCisJICAgICAqLworCSAgICBpZiAoIWd1aV95YW5rKQorCSAgICB7CisJCVZJc3VhbF9hY3RpdmUgPSBGQUxTRTsKKyMgaWZkZWYgRkVBVF9NT1VTRQorCQlzZXRtb3VzZSgpOworCQltb3VzZV9kcmFnZ2luZyA9IDA7CisjIGVuZGlmCisJCWlmIChwX3NtZCkKKwkJICAgIGNsZWFyX2NtZGxpbmUgPSBUUlVFOyAgIC8qIHVuc2hvdyB2aXN1YWwgbW9kZSBsYXRlciAqLworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJCWVsc2UKKwkJICAgIGNsZWFyX3Nob3djbWQoKTsKKyNlbmRpZgorCQlpZiAoKG9hcC0+b3BfdHlwZSA9PSBPUF9ZQU5LCisJCQkgICAgfHwgb2FwLT5vcF90eXBlID09IE9QX0NPTE9OCisJCQkgICAgfHwgb2FwLT5vcF90eXBlID09IE9QX0ZJTFRFUikKKwkJCSYmIG9hcC0+bW90aW9uX2ZvcmNlID09IE5VTCkKKwkJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURUQpOworCSAgICB9CisJfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisJLyogSW5jbHVkZSB0aGUgdHJhaWxpbmcgYnl0ZSBvZiBhIG11bHRpLWJ5dGUgY2hhci4gKi8KKwlpZiAoaGFzX21ieXRlICYmIG9hcC0+aW5jbHVzaXZlKQorCXsKKwkgICAgaW50CQlsOworCisJICAgIGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKG1sX2dldF9wb3MoJm9hcC0+ZW5kKSk7CisJICAgIGlmIChsID4gMSkKKwkJb2FwLT5lbmQuY29sICs9IGwgLSAxOworCX0KKyNlbmRpZgorCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCisJLyoKKwkgKiBvYXAtPmVtcHR5IGlzIHNldCB3aGVuIHN0YXJ0IGFuZCBlbmQgYXJlIHRoZSBzYW1lLiAgVGhlIGluY2x1c2l2ZQorCSAqIGZsYWcgYWZmZWN0cyB0aGlzIHRvbywgdW5sZXNzIHlhbmtpbmcgYW5kIHRoZSBlbmQgaXMgb24gYSBOVUwuCisJICovCisJb2FwLT5lbXB0eSA9IChvYXAtPm1vdGlvbl90eXBlID09IE1DSEFSCisJCSAgICAmJiAoIW9hcC0+aW5jbHVzaXZlCisJCQl8fCAob2FwLT5vcF90eXBlID09IE9QX1lBTksKKwkJCSAgICAmJiBnY2hhcl9wb3MoJm9hcC0+ZW5kKSA9PSBOVUwpKQorCQkgICAgJiYgZXF1YWxwb3Mob2FwLT5zdGFydCwgb2FwLT5lbmQpCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkgICAgJiYgISh2aXJ0dWFsX29wICYmIG9hcC0+c3RhcnQuY29sYWRkICE9IG9hcC0+ZW5kLmNvbGFkZCkKKyNlbmRpZgorCQkgICAgKTsKKwkvKgorCSAqIEZvciBkZWxldGUsIGNoYW5nZSBhbmQgeWFuaywgaXQncyBhbiBlcnJvciB0byBvcGVyYXRlIG9uIGFuCisJICogZW1wdHkgcmVnaW9uLCB3aGVuICdFJyBpbmNsdWRlZCBpbiAnY3BvcHRpb25zJyAoVmkgY29tcGF0aWJsZSkuCisJICovCisJZW1wdHlfcmVnaW9uX2Vycm9yID0gKG9hcC0+ZW1wdHkKKwkJCQkmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRU1QVFlSRUdJT04pICE9IE5VTEwpOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkvKiBGb3JjZSBhIHJlZHJhdyB3aGVuIG9wZXJhdGluZyBvbiBhbiBlbXB0eSBWaXN1YWwgcmVnaW9uLCB3aGVuCisJICogJ21vZGlmaWFibGUgaXMgb2ZmIG9yIGNyZWF0aW5nIGEgZm9sZC4gKi8KKwlpZiAob2FwLT5pc19WSXN1YWwgJiYgKG9hcC0+ZW1wdHkgfHwgIWN1cmJ1Zi0+Yl9wX21hCisjIGlmZGVmIEZFQVRfRk9MRElORworCQkgICAgfHwgb2FwLT5vcF90eXBlID09IE9QX0ZPTEQKKyMgZW5kaWYKKwkJICAgICkpCisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURUQpOworI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZSBlbmQgb2YgYW4gb3BlcmF0b3IgaXMgaW4gY29sdW1uIG9uZSB3aGlsZSBvYXAtPm1vdGlvbl90eXBlCisJICogaXMgTUNIQVIgYW5kIG9hcC0+aW5jbHVzaXZlIGlzIEZBTFNFLCB3ZSBwdXQgb3BfZW5kIGFmdGVyIHRoZSBsYXN0CisJICogY2hhcmFjdGVyIGluIHRoZSBwcmV2aW91cyBsaW5lLiBJZiBvcF9zdGFydCBpcyBvbiBvciBiZWZvcmUgdGhlCisJICogZmlyc3Qgbm9uLWJsYW5rIGluIHRoZSBsaW5lLCB0aGUgb3BlcmF0b3IgYmVjb21lcyBsaW5ld2lzZQorCSAqIChzdHJhbmdlLCBidXQgdGhhdCdzIHRoZSB3YXkgdmkgZG9lcyBpdCkuCisJICovCisJaWYgKAkgICBvYXAtPm1vdGlvbl90eXBlID09IE1DSEFSCisJCSYmIG9hcC0+aW5jbHVzaXZlID09IEZBTFNFCisJCSYmICEoY2FwLT5yZXR2YWwgJiBDQV9OT19BREpfT1BfRU5EKQorCQkmJiBvYXAtPmVuZC5jb2wgPT0gMAorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICghb2FwLT5pc19WSXN1YWwgfHwgKnBfc2VsID09ICdvJykKKyNlbmRpZgorCQkmJiBvYXAtPmxpbmVfY291bnQgPiAxKQorCXsKKwkgICAgb2FwLT5lbmRfYWRqdXN0ZWQgPSBUUlVFOwkgICAgLyogcmVtZW1iZXIgdGhhdCB3ZSBkaWQgdGhpcyAqLworCSAgICAtLW9hcC0+bGluZV9jb3VudDsKKwkgICAgLS1vYXAtPmVuZC5sbnVtOworCSAgICBpZiAoaW5pbmRlbnQoMCkpCisJCW9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKwkgICAgZWxzZQorCSAgICB7CisJCW9hcC0+ZW5kLmNvbCA9IChjb2xucl9UKVNUUkxFTihtbF9nZXQob2FwLT5lbmQubG51bSkpOworCQlpZiAob2FwLT5lbmQuY29sKQorCQl7CisJCSAgICAtLW9hcC0+ZW5kLmNvbDsKKwkJICAgIG9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKwkJfQorCSAgICB9CisJfQorCWVsc2UKKwkgICAgb2FwLT5lbmRfYWRqdXN0ZWQgPSBGQUxTRTsKKworCXN3aXRjaCAob2FwLT5vcF90eXBlKQorCXsKKwljYXNlIE9QX0xTSElGVDoKKwljYXNlIE9QX1JTSElGVDoKKwkgICAgb3Bfc2hpZnQob2FwLCBUUlVFLAorI2lmZGVmIEZFQVRfVklTVUFMCisJCSAgICBvYXAtPmlzX1ZJc3VhbCA/IChpbnQpY2FwLT5jb3VudDEgOgorI2VuZGlmCisJCSAgICAxKTsKKwkgICAgYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCSAgICBicmVhazsKKworCWNhc2UgT1BfSk9JTl9OUzoKKwljYXNlIE9QX0pPSU46CisJICAgIGlmIChvYXAtPmxpbmVfY291bnQgPCAyKQorCQlvYXAtPmxpbmVfY291bnQgPSAyOworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgb2FwLT5saW5lX2NvdW50IC0gMSA+CisJCQkJCQkgICBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJYmVlcF9mbHVzaCgpOworCSAgICBlbHNlCisJICAgIHsKKwkJZG9fZG9fam9pbihvYXAtPmxpbmVfY291bnQsIG9hcC0+b3BfdHlwZSA9PSBPUF9KT0lOKTsKKwkJYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUF9ERUxFVEU6CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgVklzdWFsX3Jlc2VsZWN0ID0gRkFMU0U7CSAgICAvKiBkb24ndCByZXNlbGVjdCBub3cgKi8KKyNlbmRpZgorCSAgICBpZiAoZW1wdHlfcmVnaW9uX2Vycm9yKQorCQl2aW1fYmVlcCgpOworCSAgICBlbHNlCisJICAgIHsKKwkJKHZvaWQpb3BfZGVsZXRlKG9hcCk7CisJCWlmIChvYXAtPm1vdGlvbl90eXBlID09IE1MSU5FICYmIGhhc19mb3JtYXRfb3B0aW9uKEZPX0FVVE8pKQorCQkgICAgdV9zYXZlX2N1cnNvcigpOwkgICAgLyogY3Vyc29yIGxpbmUgd2Fzbid0IHNhdmVkIHlldCAqLworCQlhdXRvX2Zvcm1hdChGQUxTRSwgVFJVRSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX1lBTks6CisJICAgIGlmIChlbXB0eV9yZWdpb25fZXJyb3IpCisJICAgIHsKKwkJaWYgKCFndWlfeWFuaykKKwkJICAgIHZpbV9iZWVwKCk7CisJICAgIH0KKwkgICAgZWxzZQorCQkodm9pZClvcF95YW5rKG9hcCwgRkFMU0UsICFndWlfeWFuayk7CisJICAgIGNoZWNrX2N1cnNvcl9jb2woKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX0NIQU5HRToKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICBWSXN1YWxfcmVzZWxlY3QgPSBGQUxTRTsJICAgIC8qIGRvbid0IHJlc2VsZWN0IG5vdyAqLworI2VuZGlmCisJICAgIGlmIChlbXB0eV9yZWdpb25fZXJyb3IpCisJCXZpbV9iZWVwKCk7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBUaGlzIGlzIGEgbmV3IGVkaXQgY29tbWFuZCwgbm90IGEgcmVzdGFydC4gIE5lZWQgdG8KKwkJICogcmVtZW1iZXIgaXQgdG8gbWFrZSAnaW5zZXJ0bW9kZScgd29yayB3aXRoIG1hcHBpbmdzIGZvcgorCQkgKiBWaXN1YWwgbW9kZS4gIEJ1dCBkbyB0aGlzIG9ubHkgb25jZSBhbmQgbm90IHdoZW4gdHlwZWQgYW5kCisJCSAqICdpbnNlcnRtb2RlJyBpc24ndCBzZXQuICovCisJCWlmIChwX2ltIHx8ICFLZXlUeXBlZCkKKwkJICAgIHJlc3RhcnRfZWRpdF9zYXZlID0gcmVzdGFydF9lZGl0OworCQllbHNlCisJCSAgICByZXN0YXJ0X2VkaXRfc2F2ZSA9IDA7CisJCXJlc3RhcnRfZWRpdCA9IDA7CisJCS8qIFJlc2V0IGZpbmlzaF9vcCBub3csIGRvbid0IHdhbnQgaXQgc2V0IGluc2lkZSBlZGl0KCkuICovCisJCWZpbmlzaF9vcCA9IEZBTFNFOworCQlpZiAob3BfY2hhbmdlKG9hcCkpCS8qIHdpbGwgY2FsbCBlZGl0KCkgKi8KKwkJICAgIGNhcC0+cmV0dmFsIHw9IENBX0NPTU1BTkRfQlVTWTsKKwkJaWYgKHJlc3RhcnRfZWRpdCA9PSAwKQorCQkgICAgcmVzdGFydF9lZGl0ID0gcmVzdGFydF9lZGl0X3NhdmU7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX0ZJTFRFUjoKKwkgICAgaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19GSUxURVIpICE9IE5VTEwpCisJCUFwcGVuZFRvUmVkb2J1ZmYoKGNoYXJfdSAqKSIhXHIiKTsgIC8qIHVzZSBhbnkgbGFzdCB1c2VkICFjbWQgKi8KKwkgICAgZWxzZQorCQliYW5ncmVkbyA9IFRSVUU7ICAgIC8qIGRvX2JhbmcoKSB3aWxsIHB1dCBjbWQgaW4gcmVkbyBidWZmZXIgKi8KKworCWNhc2UgT1BfSU5ERU5UOgorCWNhc2UgT1BfQ09MT046CisKKyNpZiBkZWZpbmVkKEZFQVRfTElTUCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpCisJICAgIC8qCisJICAgICAqIElmICdlcXVhbHByZycgaXMgZW1wdHksIGRvIHRoZSBpbmRlbnRpbmcgaW50ZXJuYWxseS4KKwkgICAgICovCisJICAgIGlmIChvYXAtPm9wX3R5cGUgPT0gT1BfSU5ERU5UICYmICpnZXRfZXF1YWxwcmcoKSA9PSBOVUwpCisJICAgIHsKKyMgaWZkZWYgRkVBVF9MSVNQCisJCWlmIChjdXJidWYtPmJfcF9saXNwKQorCQl7CisJCSAgICBvcF9yZWluZGVudChvYXAsIGdldF9saXNwX2luZGVudCk7CisJCSAgICBicmVhazsKKwkJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0NJTkRFTlQKKwkJb3BfcmVpbmRlbnQob2FwLAorIyAgaWZkZWYgRkVBVF9FVkFMCisJCQkqY3VyYnVmLT5iX3BfaW5kZSAhPSBOVUwgPyBnZXRfZXhwcl9pbmRlbnQgOgorIyAgZW5kaWYKKwkJCSAgICBnZXRfY19pbmRlbnQpOworCQlicmVhazsKKyMgZW5kaWYKKwkgICAgfQorI2VuZGlmCisKKwkgICAgb3BfY29sb24ob2FwKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX1RJTERFOgorCWNhc2UgT1BfVVBQRVI6CisJY2FzZSBPUF9MT1dFUjoKKwljYXNlIE9QX1JPVDEzOgorCSAgICBpZiAoZW1wdHlfcmVnaW9uX2Vycm9yKQorCQl2aW1fYmVlcCgpOworCSAgICBlbHNlCisJCW9wX3RpbGRlKG9hcCk7CisJICAgIGNoZWNrX2N1cnNvcl9jb2woKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX0ZPUk1BVDoKKwkgICAgaWYgKCpwX2ZwICE9IE5VTCkKKwkJb3BfY29sb24ob2FwKTsJCS8qIHVzZSBleHRlcm5hbCBjb21tYW5kICovCisJICAgIGVsc2UKKwkJb3BfZm9ybWF0KG9hcCwgRkFMU0UpOwkvKiB1c2UgaW50ZXJuYWwgZnVuY3Rpb24gKi8KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX0ZPUk1BVDI6CisJICAgIG9wX2Zvcm1hdChvYXAsIFRSVUUpOwkvKiB1c2UgaW50ZXJuYWwgZnVuY3Rpb24gKi8KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QX0lOU0VSVDoKKwljYXNlIE9QX0FQUEVORDoKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICBWSXN1YWxfcmVzZWxlY3QgPSBGQUxTRTsJLyogZG9uJ3QgcmVzZWxlY3Qgbm93ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZJU1VBTEVYVFJBCisJICAgIGlmIChlbXB0eV9yZWdpb25fZXJyb3IpCisJCXZpbV9iZWVwKCk7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBUaGlzIGlzIGEgbmV3IGVkaXQgY29tbWFuZCwgbm90IGEgcmVzdGFydC4gIE5lZWQgdG8KKwkJICogcmVtZW1iZXIgaXQgdG8gbWFrZSAnaW5zZXJ0bW9kZScgd29yayB3aXRoIG1hcHBpbmdzIGZvcgorCQkgKiBWaXN1YWwgbW9kZS4gIEJ1dCBkbyB0aGlzIG9ubHkgb25jZS4gKi8KKwkJcmVzdGFydF9lZGl0X3NhdmUgPSByZXN0YXJ0X2VkaXQ7CisJCXJlc3RhcnRfZWRpdCA9IDA7CisKKwkJb3BfaW5zZXJ0KG9hcCwgY2FwLT5jb3VudDEpOworCisJCS8qIFRPRE86IHdoZW4gaW5zZXJ0aW5nIGluIHNldmVyYWwgbGluZXMsIHNob3VsZCBmb3JtYXQgYWxsCisJCSAqIHRoZSBsaW5lcy4gKi8KKwkJYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworCisJCWlmIChyZXN0YXJ0X2VkaXQgPT0gMCkKKwkJICAgIHJlc3RhcnRfZWRpdCA9IHJlc3RhcnRfZWRpdF9zYXZlOworCSAgICB9CisjZWxzZQorCSAgICB2aW1fYmVlcCgpOworI2VuZGlmCisJICAgIGJyZWFrOworCisJY2FzZSBPUF9SRVBMQUNFOgorI2lmZGVmIEZFQVRfVklTVUFMCisJICAgIFZJc3VhbF9yZXNlbGVjdCA9IEZBTFNFOwkvKiBkb24ndCByZXNlbGVjdCBub3cgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKwkgICAgaWYgKGVtcHR5X3JlZ2lvbl9lcnJvcikKKyNlbmRpZgorCQl2aW1fYmVlcCgpOworI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKwkgICAgZWxzZQorCQlvcF9yZXBsYWNlKG9hcCwgY2FwLT5uY2hhcik7CisjZW5kaWYKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwljYXNlIE9QX0ZPTEQ6CisJICAgIFZJc3VhbF9yZXNlbGVjdCA9IEZBTFNFOwkvKiBkb24ndCByZXNlbGVjdCBub3cgKi8KKwkgICAgZm9sZENyZWF0ZShvYXAtPnN0YXJ0LmxudW0sIG9hcC0+ZW5kLmxudW0pOworCSAgICBicmVhazsKKworCWNhc2UgT1BfRk9MRE9QRU46CisJY2FzZSBPUF9GT0xET1BFTlJFQzoKKwljYXNlIE9QX0ZPTERDTE9TRToKKwljYXNlIE9QX0ZPTERDTE9TRVJFQzoKKwkgICAgVklzdWFsX3Jlc2VsZWN0ID0gRkFMU0U7CS8qIGRvbid0IHJlc2VsZWN0IG5vdyAqLworCSAgICBvcEZvbGRSYW5nZShvYXAtPnN0YXJ0LmxudW0sIG9hcC0+ZW5kLmxudW0sCisJCSAgICBvYXAtPm9wX3R5cGUgPT0gT1BfRk9MRE9QRU4KKwkJCQkJICAgIHx8IG9hcC0+b3BfdHlwZSA9PSBPUF9GT0xET1BFTlJFQywKKwkJICAgIG9hcC0+b3BfdHlwZSA9PSBPUF9GT0xET1BFTlJFQworCQkJCQkgIHx8IG9hcC0+b3BfdHlwZSA9PSBPUF9GT0xEQ0xPU0VSRUMsCisJCQkJCSAgb2FwLT5pc19WSXN1YWwpOworCSAgICBicmVhazsKKworCWNhc2UgT1BfRk9MRERFTDoKKwljYXNlIE9QX0ZPTERERUxSRUM6CisJICAgIFZJc3VhbF9yZXNlbGVjdCA9IEZBTFNFOwkvKiBkb24ndCByZXNlbGVjdCBub3cgKi8KKwkgICAgZGVsZXRlRm9sZChvYXAtPnN0YXJ0LmxudW0sIG9hcC0+ZW5kLmxudW0sCisJCQkgICAgICAgb2FwLT5vcF90eXBlID09IE9QX0ZPTERERUxSRUMsIG9hcC0+aXNfVklzdWFsKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCSAgICBjbGVhcm9wYmVlcChvYXApOworCX0KKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJdmlydHVhbF9vcCA9IE1BWUJFOworI2VuZGlmCisJaWYgKCFndWlfeWFuaykKKwl7CisJICAgIC8qCisJICAgICAqIGlmICdzb2wnIG5vdCBzZXQsIGdvIGJhY2sgdG8gb2xkIGNvbHVtbiBmb3Igc29tZSBjb21tYW5kcworCSAgICAgKi8KKwkgICAgaWYgKCFwX3NvbCAmJiBvYXAtPm1vdGlvbl90eXBlID09IE1MSU5FICYmICFvYXAtPmVuZF9hZGp1c3RlZAorCQkgICAgJiYgKG9hcC0+b3BfdHlwZSA9PSBPUF9MU0hJRlQgfHwgb2FwLT5vcF90eXBlID09IE9QX1JTSElGVAorCQkJCQkJfHwgb2FwLT5vcF90eXBlID09IE9QX0RFTEVURSkpCisJCWNvbGFkdmFuY2UoY3Vyd2luLT53X2N1cnN3YW50ID0gb2xkX2NvbCk7CisJfQorCWVsc2UKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBvbGRfY3Vyc29yOworCX0KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCW9hcC0+YmxvY2tfbW9kZSA9IEZBTFNFOworI2VuZGlmCisJY2xlYXJvcChvYXApOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSBpbmRlbnQgYW5kIGZvcm1hdCBvcGVyYXRvcnMgYW5kIHZpc3VhbCBtb2RlICI6Ii4KKyAqLworICAgIHN0YXRpYyB2b2lkCitvcF9jb2xvbihvYXApCisgICAgb3BhcmdfVAkqb2FwOworeworICAgIHN0dWZmY2hhclJlYWRidWZmKCc6Jyk7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAob2FwLT5pc19WSXN1YWwpCisJc3R1ZmZSZWFkYnVmZigoY2hhcl91ICopIic8LCc+Iik7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qCisJICogTWFrZSB0aGUgcmFuZ2UgbG9vayBuaWNlLCBzbyBpdCBjYW4gYmUgcmVwZWF0ZWQuCisJICovCisJaWYgKG9hcC0+c3RhcnQubG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIHN0dWZmY2hhclJlYWRidWZmKCcuJyk7CisJZWxzZQorCSAgICBzdHVmZm51bVJlYWRidWZmKChsb25nKW9hcC0+c3RhcnQubG51bSk7CisJaWYgKG9hcC0+ZW5kLmxudW0gIT0gb2FwLT5zdGFydC5sbnVtKQorCXsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoJywnKTsKKwkgICAgaWYgKG9hcC0+ZW5kLmxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQlzdHVmZmNoYXJSZWFkYnVmZignLicpOworCSAgICBlbHNlIGlmIChvYXAtPmVuZC5sbnVtID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQlzdHVmZmNoYXJSZWFkYnVmZignJCcpOworCSAgICBlbHNlIGlmIChvYXAtPnN0YXJ0LmxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCSAgICB7CisJCXN0dWZmUmVhZGJ1ZmYoKGNoYXJfdSAqKSIuKyIpOworCQlzdHVmZm51bVJlYWRidWZmKChsb25nKW9hcC0+bGluZV9jb3VudCAtIDEpOworCSAgICB9CisJICAgIGVsc2UKKwkJc3R1ZmZudW1SZWFkYnVmZigobG9uZylvYXAtPmVuZC5sbnVtKTsKKwl9CisgICAgfQorICAgIGlmIChvYXAtPm9wX3R5cGUgIT0gT1BfQ09MT04pCisJc3R1ZmZSZWFkYnVmZigoY2hhcl91ICopIiEiKTsKKyAgICBpZiAob2FwLT5vcF90eXBlID09IE9QX0lOREVOVCkKKyAgICB7CisjaWZuZGVmIEZFQVRfQ0lOREVOVAorCWlmICgqZ2V0X2VxdWFscHJnKCkgPT0gTlVMKQorCSAgICBzdHVmZlJlYWRidWZmKChjaGFyX3UgKikiaW5kZW50Iik7CisJZWxzZQorI2VuZGlmCisJICAgIHN0dWZmUmVhZGJ1ZmYoZ2V0X2VxdWFscHJnKCkpOworCXN0dWZmUmVhZGJ1ZmYoKGNoYXJfdSAqKSJcbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChvYXAtPm9wX3R5cGUgPT0gT1BfRk9STUFUKQorICAgIHsKKwlpZiAoKnBfZnAgPT0gTlVMKQorCSAgICBzdHVmZlJlYWRidWZmKChjaGFyX3UgKikiZm10Iik7CisJZWxzZQorCSAgICBzdHVmZlJlYWRidWZmKHBfZnApOworCXN0dWZmUmVhZGJ1ZmYoKGNoYXJfdSAqKSJcbiIpOworICAgIH0KKworICAgIC8qCisgICAgICogZG9fY21kbGluZSgpIGRvZXMgdGhlIHJlc3QKKyAgICAgKi8KK30KKworI2lmIGRlZmluZWQoRkVBVF9NT1VTRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBEbyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIGZvciB0aGUgY3VycmVudCBtb3VzZSBjbGljayBpbiB0aGUgY3VycmVudCBtb2RlLgorICogTm90IHVzZWQgZm9yIENvbW1hbmQtbGluZSBtb2RlLgorICoKKyAqIE5vcm1hbCBNb2RlOgorICogZXZlbnQJIG1vZGktCXBvc2l0aW9uICAgICAgdmlzdWFsCSAgIGNoYW5nZSAgIGFjdGlvbgorICoJCSBmaWVyCWN1cnNvcgkJCSAgIHdpbmRvdworICogbGVmdCBwcmVzcwkgIC0JeWVzCSAgICBlbmQJCSAgICB5ZXMKKyAqIGxlZnQgcHJlc3MJICBDCXllcwkgICAgZW5kCQkgICAgeWVzCSAgICAiXl0iICgyKQorICogbGVmdCBwcmVzcwkgIFMJeWVzCSAgICBlbmQJCSAgICB5ZXMJICAgICIqIiAoMikKKyAqIGxlZnQgZHJhZwkgIC0JeWVzCXN0YXJ0IGlmIG1vdmVkCSAgICBubworICogbGVmdCByZWxzZQkgIC0JeWVzCXN0YXJ0IGlmIG1vdmVkCSAgICBubworICogbWlkZGxlIHByZXNzCSAgLQl5ZXMJIGlmIG5vdCBhY3RpdmUJICAgIG5vCSAgICBwdXQgcmVnaXN0ZXIKKyAqIG1pZGRsZSBwcmVzcwkgIC0JeWVzCSBpZiBhY3RpdmUJICAgIG5vCSAgICB5YW5rIGFuZCBwdXQKKyAqIHJpZ2h0IHByZXNzCSAgLQl5ZXMJc3RhcnQgb3IgZXh0ZW5kCSAgICB5ZXMKKyAqIHJpZ2h0IHByZXNzCSAgUwl5ZXMJbm8gY2hhbmdlCSAgICB5ZXMJICAgICIjIiAoMikKKyAqIHJpZ2h0IGRyYWcJICAtCXllcwlleHRlbmQJCSAgICBubworICogcmlnaHQgcmVsc2UJICAtCXllcwlleHRlbmQJCSAgICBubworICoKKyAqIEluc2VydCBvciBSZXBsYWNlIE1vZGU6CisgKiBldmVudAkgbW9kaS0JcG9zaXRpb24gICAgICB2aXN1YWwJICAgY2hhbmdlICAgYWN0aW9uCisgKgkJIGZpZXIJY3Vyc29yCQkJICAgd2luZG93CisgKiBsZWZ0IHByZXNzCSAgLQl5ZXMJKGNhbm5vdCBiZSBhY3RpdmUpICB5ZXMKKyAqIGxlZnQgcHJlc3MJICBDCXllcwkoY2Fubm90IGJlIGFjdGl2ZSkgIHllcwkgICAgIkNUUkwtT15dIiAoMikKKyAqIGxlZnQgcHJlc3MJICBTCXllcwkoY2Fubm90IGJlIGFjdGl2ZSkgIHllcwkgICAgIkNUUkwtTyoiICgyKQorICogbGVmdCBkcmFnCSAgLQl5ZXMJc3RhcnQgb3IgZXh0ZW5kICgxKSBubwkgICAgQ1RSTC1PICgxKQorICogbGVmdCByZWxzZQkgIC0JeWVzCXN0YXJ0IG9yIGV4dGVuZCAoMSkgbm8JICAgIENUUkwtTyAoMSkKKyAqIG1pZGRsZSBwcmVzcwkgIC0Jbm8JKGNhbm5vdCBiZSBhY3RpdmUpICBubwkgICAgcHV0IHJlZ2lzdGVyCisgKiByaWdodCBwcmVzcwkgIC0JeWVzCXN0YXJ0IG9yIGV4dGVuZAkgICAgeWVzCSAgICBDVFJMLU8KKyAqIHJpZ2h0IHByZXNzCSAgUwl5ZXMJKGNhbm5vdCBiZSBhY3RpdmUpICB5ZXMJICAgICJDVFJMLU8jIiAoMikKKyAqCisgKiAoMSkgb25seSBpZiBtb3VzZSBwb2ludGVyIG1vdmVkIHNpbmNlIHByZXNzCisgKiAoMikgb25seSBpZiBjbGljayBpcyBpbiBzYW1lIGJ1ZmZlcgorICoKKyAqIFJldHVybiBUUlVFIGlmIHN0YXJ0X2Fycm93KCkgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWRpdCBtb2RlLgorICovCisgICAgaW50Citkb19tb3VzZShvYXAsIGMsIGRpciwgY291bnQsIGZpeGluZGVudCkKKyAgICBvcGFyZ19UCSpvYXA7CQkvKiBvcGVyYXRvciBhcmd1bWVudCwgY2FuIGJlIE5VTEwgKi8KKyAgICBpbnQJCWM7CQkvKiBLX0xFRlRNT1VTRSwgZXRjICovCisgICAgaW50CQlkaXI7CQkvKiBEaXJlY3Rpb24gdG8gJ3B1dCcgaWYgbmVjZXNzYXJ5ICovCisgICAgbG9uZwljb3VudDsKKyAgICBpbnQJCWZpeGluZGVudDsJLyogUFVUX0ZJWElOREVOVCBpZiBmaXhpbmcgaW5kZW50IG5lY2Vzc2FyeSAqLworeworICAgIHN0YXRpYyBpbnQJZG9fYWx3YXlzID0gRkFMU0U7CS8qIGlnbm9yZSAnbW91c2UnIHNldHRpbmcgbmV4dCB0aW1lICovCisgICAgc3RhdGljIGludAlnb3RfY2xpY2sgPSBGQUxTRTsJLyogZ290IGEgY2xpY2sgc29tZSB0aW1lIGJhY2sgKi8KKworICAgIGludAkJd2hpY2hfYnV0dG9uOwkvKiBNT1VTRV9MRUZULCBfTUlERExFIG9yIF9SSUdIVCAqLworICAgIGludAkJaXNfY2xpY2s7CS8qIElmIEZBTFNFIGl0J3MgYSBkcmFnIG9yIHJlbGVhc2UgZXZlbnQgKi8KKyAgICBpbnQJCWlzX2RyYWc7CS8qIElmIFRSVUUgaXQncyBhIGRyYWcgZXZlbnQgKi8KKyAgICBpbnQJCWp1bXBfZmxhZ3MgPSAwOwkvKiBmbGFncyBmb3IganVtcF90b19tb3VzZSgpICovCisgICAgcG9zX1QJc3RhcnRfdmlzdWFsOworICAgIGludAkJbW92ZWQ7CQkvKiBIYXMgY3Vyc29yIG1vdmVkPyAqLworICAgIGludAkJaW5fc3RhdHVzX2xpbmU7CS8qIG1vdXNlIGluIHN0YXR1cyBsaW5lICovCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpbnQJCWluX3NlcF9saW5lOwkvKiBtb3VzZSBpbiB2ZXJ0aWNhbCBzZXBhcmF0b3IgbGluZSAqLworI2VuZGlmCisgICAgaW50CQljMSwgYzI7CisjaWYgZGVmaW5lZChGRUFUX0ZPTERJTkcpCisgICAgcG9zX1QJc2F2ZV9jdXJzb3I7CisjZW5kaWYKKyAgICB3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIHN0YXRpYyBwb3NfVCBvcmlnX2N1cnNvcjsKKyAgICBjb2xucl9UCWxlZnRjb2wsIHJpZ2h0Y29sOworICAgIHBvc19UCWVuZF92aXN1YWw7CisgICAgaW50CQlkaWZmOworICAgIGludAkJb2xkX2FjdGl2ZSA9IFZJc3VhbF9hY3RpdmU7CisgICAgaW50CQlvbGRfbW9kZSA9IFZJc3VhbF9tb2RlOworI2VuZGlmCisgICAgaW50CQlyZWduYW1lOworCisjaWYgZGVmaW5lZChGRUFUX0ZPTERJTkcpCisgICAgc2F2ZV9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFdoZW4gR1VJIGlzIGFjdGl2ZSwgYWx3YXlzIHJlY29nbml6ZSBtb3VzZSBldmVudHMsIG90aGVyd2lzZToKKyAgICAgKiAtIElnbm9yZSBtb3VzZSBldmVudCBpbiBub3JtYWwgbW9kZSBpZiAnbW91c2UnIGRvZXNuJ3QgaW5jbHVkZSAnbicuCisgICAgICogLSBJZ25vcmUgbW91c2UgZXZlbnQgaW4gdmlzdWFsIG1vZGUgaWYgJ21vdXNlJyBkb2Vzbid0IGluY2x1ZGUgJ3YnLgorICAgICAqIC0gRm9yIGNvbW1hbmQgbGluZSBhbmQgaW5zZXJ0IG1vZGUgJ21vdXNlJyBpcyBjaGVja2VkIGJlZm9yZSBjYWxsaW5nCisgICAgICoJIGRvX21vdXNlKCkuCisgICAgICovCisgICAgaWYgKGRvX2Fsd2F5cykKKwlkb19hbHdheXMgPSBGQUxTRTsKKyAgICBlbHNlCisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoIWd1aS5pbl91c2UpCisjZW5kaWYKKwl7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJICAgIHsKKwkJaWYgKCFtb3VzZV9oYXMoTU9VU0VfVklTVUFMKSkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJaWYgKFN0YXRlID09IE5PUk1BTCAmJiAhbW91c2VfaGFzKE1PVVNFX05PUk1BTCkpCisJCXJldHVybiBGQUxTRTsKKwl9CisKKyAgICB3aGljaF9idXR0b24gPSBnZXRfbW91c2VfYnV0dG9uKEtFWTJURVJNQ0FQMShjKSwgJmlzX2NsaWNrLCAmaXNfZHJhZyk7CisKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKyAgICAvKiBNYXkgaGF2ZSBzdG9wcGVkIGRyYWdnaW5nIHRoZSBzdGF0dXMgb3Igc2VwYXJhdG9yIGxpbmUuICBUaGUgcG9pbnRlciBpcworICAgICAqIG1vc3QgbGlrZWx5IHN0aWxsIG9uIHRoZSBzdGF0dXMgb3Igc2VwYXJhdG9yIGxpbmUuICovCisgICAgaWYgKCFpc19kcmFnICYmIGRyYWdfc3RhdHVzX2xpbmUpCisgICAgeworCWRyYWdfc3RhdHVzX2xpbmUgPSBGQUxTRTsKKwl1cGRhdGVfbW91c2VzaGFwZShTSEFQRV9JRFhfU1RBVFVTKTsKKyAgICB9CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKCFpc19kcmFnICYmIGRyYWdfc2VwX2xpbmUpCisgICAgeworCWRyYWdfc2VwX2xpbmUgPSBGQUxTRTsKKwl1cGRhdGVfbW91c2VzaGFwZShTSEFQRV9JRFhfVlNFUCk7CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisKKyAgICAvKgorICAgICAqIElnbm9yZSBkcmFnIGFuZCByZWxlYXNlIGV2ZW50cyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgY2xpY2suCisgICAgICovCisgICAgaWYgKGlzX2NsaWNrKQorCWdvdF9jbGljayA9IFRSVUU7CisgICAgZWxzZQorICAgIHsKKwlpZiAoIWdvdF9jbGljaykJCQkvKiBkaWRuJ3QgZ2V0IGNsaWNrLCBpZ25vcmUgKi8KKwkgICAgcmV0dXJuIEZBTFNFOworCWlmICghaXNfZHJhZykJCQkvKiByZWxlYXNlLCByZXNldCBnb3RfY2xpY2sgKi8KKwkgICAgZ290X2NsaWNrID0gRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBTFQgaXMgY3VycmVudGx5IGlnbm9yZWQKKyAgICAgKi8KKyAgICBpZiAoKG1vZF9tYXNrICYgTU9EX01BU0tfQUxUKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKgorICAgICAqIENUUkwgcmlnaHQgbW91c2UgYnV0dG9uIGRvZXMgQ1RSTC1UCisgICAgICovCisgICAgaWYgKGlzX2NsaWNrICYmIChtb2RfbWFzayAmIE1PRF9NQVNLX0NUUkwpICYmIHdoaWNoX2J1dHRvbiA9PSBNT1VTRV9SSUdIVCkKKyAgICB7CisJaWYgKFN0YXRlICYgSU5TRVJUKQorCSAgICBzdHVmZmNoYXJSZWFkYnVmZihDdHJsX08pOworCWlmIChjb3VudCA+IDEpCisJICAgIHN0dWZmbnVtUmVhZGJ1ZmYoY291bnQpOworCXN0dWZmY2hhclJlYWRidWZmKEN0cmxfVCk7CisJZ290X2NsaWNrID0gRkFMU0U7CQkvKiBpZ25vcmUgZHJhZyZyZWxlYXNlIG5vdyAqLworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENUUkwgb25seSB3b3JrcyB3aXRoIGxlZnQgbW91c2UgYnV0dG9uCisgICAgICovCisgICAgaWYgKChtb2RfbWFzayAmIE1PRF9NQVNLX0NUUkwpICYmIHdoaWNoX2J1dHRvbiAhPSBNT1VTRV9MRUZUKQorCXJldHVybiBGQUxTRTsKKworICAgIC8qCisgICAgICogV2hlbiBhIG1vZGlmaWVyIGlzIGRvd24sIGlnbm9yZSBkcmFnIGFuZCByZWxlYXNlIGV2ZW50cywgYXMgd2VsbCBhcworICAgICAqIG11bHRpcGxlIGNsaWNrcyBhbmQgdGhlIG1pZGRsZSBtb3VzZSBidXR0b24uCisgICAgICogQWNjZXB0IHNoaWZ0LWxlZnRtb3VzZSBkcmFncyB3aGVuICdtb3VzZW1vZGVsJyBpcyAicG9wdXAuKiIuCisgICAgICovCisgICAgaWYgKChtb2RfbWFzayAmIChNT0RfTUFTS19TSElGVCB8IE1PRF9NQVNLX0NUUkwgfCBNT0RfTUFTS19BTFQpKQorCSAgICAmJiAoIWlzX2NsaWNrCisJCXx8IChtb2RfbWFzayAmIE1PRF9NQVNLX01VTFRJX0NMSUNLKQorCQl8fCB3aGljaF9idXR0b24gPT0gTU9VU0VfTUlERExFKQorCSAgICAmJiAhKChtb2RfbWFzayAmIE1PRF9NQVNLX1NISUZUKQorCQkmJiBtb3VzZV9tb2RlbF9wb3B1cCgpCisJCSYmIHdoaWNoX2J1dHRvbiA9PSBNT1VTRV9MRUZUKQorCSAgICApCisJcmV0dXJuIEZBTFNFOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgYnV0dG9uIHByZXNzIHdhcyB1c2VkIGFzIHRoZSBtb3ZlbWVudCBjb21tYW5kIGZvciBhbiBvcGVyYXRvcgorICAgICAqIChlZyAiZDxNT1VTRT4iKSwgb3IgaXQgaXMgdGhlIG1pZGRsZSBidXR0b24gdGhhdCBpcyBoZWxkIGRvd24sIGlnbm9yZQorICAgICAqIGRyYWcvcmVsZWFzZSBldmVudHMuCisgICAgICovCisgICAgaWYgKCFpc19jbGljayAmJiB3aGljaF9idXR0b24gPT0gTU9VU0VfTUlERExFKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChvYXAgIT0gTlVMTCkKKwlyZWduYW1lID0gb2FwLT5yZWduYW1lOworICAgIGVsc2UKKwlyZWduYW1lID0gMDsKKworICAgIC8qCisgICAgICogTWlkZGxlIG1vdXNlIGJ1dHRvbiBkb2VzIGEgJ3B1dCcgb2YgdGhlIHNlbGVjdGVkIHRleHQKKyAgICAgKi8KKyAgICBpZiAod2hpY2hfYnV0dG9uID09IE1PVVNFX01JRERMRSkKKyAgICB7CisJaWYgKFN0YXRlID09IE5PUk1BTCkKKwl7CisJICAgIC8qCisJICAgICAqIElmIGFuIG9wZXJhdG9yIHdhcyBwZW5kaW5nLCB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHVzZXIgd2FudGVkCisJICAgICAqIHRvIGRvLiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlOiBDbGVhciB0aGUgb3BlcmF0b3IgYW5kIGJlZXAoKS4KKwkgICAgICovCisJICAgIGlmIChvYXAgIT0gTlVMTCAmJiBvYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorCSAgICB7CisJCWNsZWFyb3BiZWVwKG9hcCk7CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgLyoKKwkgICAgICogSWYgdmlzdWFsIHdhcyBhY3RpdmUsIHlhbmsgdGhlIGhpZ2hsaWdodGVkIHRleHQgYW5kIHB1dCBpdAorCSAgICAgKiBiZWZvcmUgdGhlIG1vdXNlIHBvaW50ZXIgcG9zaXRpb24uCisJICAgICAqLworCSAgICBpZiAoVklzdWFsX2FjdGl2ZSkKKwkgICAgeworCQlzdHVmZmNoYXJSZWFkYnVmZigneScpOworCQlzdHVmZmNoYXJSZWFkYnVmZihLX01JRERMRU1PVVNFKTsKKwkJZG9fYWx3YXlzID0gVFJVRTsJLyogaWdub3JlICdtb3VzZScgc2V0dGluZyBuZXh0IHRpbWUgKi8KKwkJcmV0dXJuIEZBTFNFOworCSAgICB9CisjZW5kaWYKKwkgICAgLyoKKwkgICAgICogVGhlIHJlc3QgaXMgYmVsb3cganVtcF90b19tb3VzZSgpCisJICAgICAqLworCX0KKworCWVsc2UgaWYgKChTdGF0ZSAmIElOU0VSVCkgPT0gMCkKKwkgICAgcmV0dXJuIEZBTFNFOworCisJLyoKKwkgKiBNaWRkbGUgY2xpY2sgaW4gaW5zZXJ0IG1vZGUgZG9lc24ndCBtb3ZlIHRoZSBtb3VzZSwganVzdCBpbnNlcnQgdGhlCisJICogY29udGVudHMgb2YgYSByZWdpc3Rlci4gICcuJyByZWdpc3RlciBpcyBzcGVjaWFsLCBjYW4ndCBpbnNlcnQgdGhhdAorCSAqIHdpdGggZG9fcHV0KCkuCisJICogQWxzbyBwYXN0ZSBhdCB0aGUgY3Vyc29yIGlmIHRoZSBjdXJyZW50IG1vZGUgaXNuJ3QgaW4gJ21vdXNlJyAob25seQorCSAqIGhhcHBlbnMgZm9yIHRoZSBHVUkpLgorCSAqLworCWlmICgoU3RhdGUgJiBJTlNFUlQpIHx8ICFtb3VzZV9oYXMoTU9VU0VfTk9STUFMKSkKKwl7CisJICAgIGlmIChyZWduYW1lID09ICcuJykKKwkJaW5zZXJ0X3JlZyhyZWduYW1lLCBUUlVFKTsKKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkJaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUgJiYgcmVnbmFtZSA9PSAwKQorCQkgICAgcmVnbmFtZSA9ICcqJzsKKyNlbmRpZgorCQlpZiAoKFN0YXRlICYgUkVQTEFDRV9GTEFHKSAmJiAheWFua19yZWdpc3Rlcl9tbGluZShyZWduYW1lKSkKKwkJICAgIGluc2VydF9yZWcocmVnbmFtZSwgVFJVRSk7CisJCWVsc2UKKwkJeworCQkgICAgZG9fcHV0KHJlZ25hbWUsIEJBQ0tXQVJELCAxTCwgZml4aW5kZW50IHwgUFVUX0NVUlNFTkQpOworCisJCSAgICAvKiBSZXBlYXQgaXQgd2l0aCBDVFJMLVIgQ1RSTC1PIHIgb3IgQ1RSTC1SIENUUkwtUCByICovCisJCSAgICBBcHBlbmRDaGFyVG9SZWRvYnVmZihDdHJsX1IpOworCQkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoZml4aW5kZW50ID8gQ3RybF9QIDogQ3RybF9PKTsKKwkJICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKHJlZ25hbWUgPT0gMCA/ICciJyA6IHJlZ25hbWUpOworCQl9CisJICAgIH0KKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKyAgICB9CisKKyAgICAvKiBXaGVuIGRyYWdnaW5nIG9yIGJ1dHRvbi11cCBzdGF5IGluIHRoZSBzYW1lIHdpbmRvdy4gKi8KKyAgICBpZiAoIWlzX2NsaWNrKQorCWp1bXBfZmxhZ3MgfD0gTU9VU0VfRk9DVVMgfCBNT1VTRV9ESURfTU9WRTsKKworICAgIHN0YXJ0X3Zpc3VhbC5sbnVtID0gMDsKKworICAgIC8qCisgICAgICogV2hlbiAnbW91c2Vtb2RlbCcgaXMgInBvcHVwIiBvciAicG9wdXBfc2V0cG9zIiwgdHJhbnNsYXRlIG1vdXNlIGV2ZW50czoKKyAgICAgKiByaWdodCBidXR0b24gdXAgICAtPiBwb3AtdXAgbWVudQorICAgICAqIHNoaWZ0LWxlZnQgYnV0dG9uIC0+IHJpZ2h0IGJ1dHRvbgorICAgICAqLworICAgIGlmIChtb3VzZV9tb2RlbF9wb3B1cCgpKQorICAgIHsKKwlpZiAod2hpY2hfYnV0dG9uID09IE1PVVNFX1JJR0hUCisJCQkgICAgJiYgIShtb2RfbWFzayAmIChNT0RfTUFTS19TSElGVCB8IE1PRF9NQVNLX0NUUkwpKSkKKwl7CisJICAgIC8qCisJICAgICAqIE5PVEU6IElnbm9yZSByaWdodCBidXR0b24gZG93biBhbmQgZHJhZyBtb3VzZSBldmVudHMuCisJICAgICAqIFdpbmRvd3Mgb25seSBzaG93cyB0aGUgcG9wdXAgbWVudSBvbiB0aGUgYnV0dG9uIHVwIGV2ZW50LgorCSAgICAgKi8KKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisJICAgIGlmICghaXNfY2xpY2spCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKQorCSAgICBpZiAoaXNfY2xpY2sgfHwgaXNfZHJhZykKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpIHx8IGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKQorCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkgICAgeworCQlqdW1wX2ZsYWdzID0gMDsKKwkJaWYgKFNUUkNNUChwX21vdXNlbSwgInBvcHVwX3NldHBvcyIpID09IDApCisJCXsKKwkJICAgIC8qIEZpcnN0IHNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIGJlZm9yZSBzaG93aW5nIHRoZSBwb3B1cAorCQkgICAgICogbWVudS4gKi8KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQkgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJCSAgICB7CisJCQlwb3NfVCAgICBtX3BvczsKKworCQkJLyoKKwkJCSAqIHNldCBNT1VTRV9NQVlfU1RPUF9WSVMgaWYgd2UgYXJlIG91dHNpZGUgdGhlCisJCQkgKiBzZWxlY3Rpb24gb3IgdGhlIGN1cnJlbnQgd2luZG93IChtaWdodCBoYXZlIGZhbHNlCisJCQkgKiBuZWdhdGl2ZSBoZXJlKQorCQkJICovCisJCQlpZiAobW91c2Vfcm93IDwgV19XSU5ST1coY3Vyd2luKQorCQkJICAgICB8fCBtb3VzZV9yb3cKKwkJCQkgICAgICA+IChXX1dJTlJPVyhjdXJ3aW4pICsgY3Vyd2luLT53X2hlaWdodCkpCisJCQkgICAganVtcF9mbGFncyA9IE1PVVNFX01BWV9TVE9QX1ZJUzsKKwkJCWVsc2UgaWYgKGdldF9mcG9zX29mX21vdXNlKCZtX3BvcykgIT0gSU5fQlVGRkVSKQorCQkJICAgIGp1bXBfZmxhZ3MgPSBNT1VTRV9NQVlfU1RPUF9WSVM7CisJCQllbHNlCisJCQl7CisJCQkgICAgaWYgKChsdChjdXJ3aW4tPndfY3Vyc29yLCBWSXN1YWwpCisJCQkJCSYmIChsdChtX3BvcywgY3Vyd2luLT53X2N1cnNvcikKKwkJCQkJICAgIHx8IGx0KFZJc3VhbCwgbV9wb3MpKSkKKwkJCQkgICAgfHwgKGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikKKwkJCQkJJiYgKGx0KG1fcG9zLCBWSXN1YWwpCisJCQkJCSAgICB8fCBsdChjdXJ3aW4tPndfY3Vyc29yLCBtX3BvcykpKSkKKwkJCSAgICB7CisJCQkJanVtcF9mbGFncyA9IE1PVVNFX01BWV9TVE9QX1ZJUzsKKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAoVklzdWFsX21vZGUgPT0gQ3RybF9WKQorCQkJICAgIHsKKwkJCQlnZXR2Y29scyhjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmVklzdWFsLAorCQkJCQkJCSAmbGVmdGNvbCwgJnJpZ2h0Y29sKTsKKwkJCQlnZXR2Y29sKGN1cndpbiwgJm1fcG9zLCBOVUxMLCAmbV9wb3MuY29sLCBOVUxMKTsKKwkJCQlpZiAobV9wb3MuY29sIDwgbGVmdGNvbCB8fCBtX3Bvcy5jb2wgPiByaWdodGNvbCkKKwkJCQkgICAganVtcF9mbGFncyA9IE1PVVNFX01BWV9TVE9QX1ZJUzsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlqdW1wX2ZsYWdzID0gTU9VU0VfTUFZX1NUT1BfVklTOworI2VuZGlmCisJCX0KKwkJaWYgKGp1bXBfZmxhZ3MpCisJCXsKKwkJICAgIGp1bXBfZmxhZ3MgPSBqdW1wX3RvX21vdXNlKGp1bXBfZmxhZ3MsIE5VTEwsIHdoaWNoX2J1dHRvbik7CisJCSAgICB1cGRhdGVfY3VyYnVmKAorI2lmZGVmIEZFQVRfVklTVUFMCisJCQkgICAgVklzdWFsX2FjdGl2ZSA/IElOVkVSVEVEIDoKKyNlbmRpZgorCQkJICAgIFZBTElEKTsKKwkJICAgIHNldGN1cnNvcigpOworCQkgICAgb3V0X2ZsdXNoKCk7ICAgIC8qIFVwZGF0ZSBiZWZvcmUgc2hvd2luZyBwb3B1cCBtZW51ICovCisJCX0KKyMgaWZkZWYgRkVBVF9NRU5VCisJCWd1aV9zaG93X3BvcHVwbWVudSgpOworIyBlbmRpZgorCQlyZXR1cm4gKGp1bXBfZmxhZ3MgJiBDVVJTT1JfTU9WRUQpICE9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCQlyZXR1cm4gRkFMU0U7CisjZWxzZQorCSAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKwl9CisJaWYgKHdoaWNoX2J1dHRvbiA9PSBNT1VTRV9MRUZUICYmIChtb2RfbWFzayAmIE1PRF9NQVNLX1NISUZUKSkKKwl7CisJICAgIHdoaWNoX2J1dHRvbiA9IE1PVVNFX1JJR0hUOworCSAgICBtb2RfbWFzayAmPSB+TU9EX01BU0tfU0hJRlQ7CisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKChTdGF0ZSAmIChOT1JNQUwgfCBJTlNFUlQpKQorCQkJICAgICYmICEobW9kX21hc2sgJiAoTU9EX01BU0tfU0hJRlQgfCBNT0RfTUFTS19DVFJMKSkpCisgICAgeworCWlmICh3aGljaF9idXR0b24gPT0gTU9VU0VfTEVGVCkKKwl7CisJICAgIGlmIChpc19jbGljaykKKwkgICAgeworCQkvKiBzdG9wIFZpc3VhbCBtb2RlIGZvciBhIGxlZnQgY2xpY2sgaW4gYSB3aW5kb3csIGJ1dCBub3Qgd2hlbgorCQkgKiBvbiBhIHN0YXR1cyBsaW5lICovCisJCWlmIChWSXN1YWxfYWN0aXZlKQorCQkgICAganVtcF9mbGFncyB8PSBNT1VTRV9NQVlfU1RPUF9WSVM7CisJICAgIH0KKwkgICAgZWxzZSBpZiAobW91c2VfaGFzKE1PVVNFX1ZJU1VBTCkpCisJCWp1bXBfZmxhZ3MgfD0gTU9VU0VfTUFZX1ZJUzsKKwl9CisJZWxzZSBpZiAod2hpY2hfYnV0dG9uID09IE1PVVNFX1JJR0hUKQorCXsKKwkgICAgaWYgKGlzX2NsaWNrICYmIFZJc3VhbF9hY3RpdmUpCisJICAgIHsKKwkJLyoKKwkJICogUmVtZW1iZXIgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdmlzdWFsIGJlZm9yZSBtb3ZpbmcgdGhlCisJCSAqIGN1cnNvci4KKwkJICovCisJCWlmIChsdChjdXJ3aW4tPndfY3Vyc29yLCBWSXN1YWwpKQorCQl7CisJCSAgICBzdGFydF92aXN1YWwgPSBjdXJ3aW4tPndfY3Vyc29yOworCQkgICAgZW5kX3Zpc3VhbCA9IFZJc3VhbDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHN0YXJ0X3Zpc3VhbCA9IFZJc3VhbDsKKwkJICAgIGVuZF92aXN1YWwgPSBjdXJ3aW4tPndfY3Vyc29yOworCQl9CisJICAgIH0KKwkgICAganVtcF9mbGFncyB8PSBNT1VTRV9GT0NVUzsKKwkgICAgaWYgKG1vdXNlX2hhcyhNT1VTRV9WSVNVQUwpKQorCQlqdW1wX2ZsYWdzIHw9IE1PVVNFX01BWV9WSVM7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiBhbiBvcGVyYXRvciBpcyBwZW5kaW5nLCBpZ25vcmUgYWxsIGRyYWdzIGFuZCByZWxlYXNlcyB1bnRpbCB0aGUKKyAgICAgKiBuZXh0IG1vdXNlIGNsaWNrLgorICAgICAqLworICAgIGlmICghaXNfZHJhZyAmJiBvYXAgIT0gTlVMTCAmJiBvYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorICAgIHsKKwlnb3RfY2xpY2sgPSBGQUxTRTsKKwlvYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgfQorCisgICAgLyogV2hlbiByZWxlYXNpbmcgdGhlIGJ1dHRvbiBsZXQganVtcF90b19tb3VzZSgpIGtub3cuICovCisgICAgaWYgKCFpc19jbGljayAmJiAhaXNfZHJhZykKKwlqdW1wX2ZsYWdzIHw9IE1PVVNFX1JFTEVBU0VEOworCisgICAgLyoKKyAgICAgKiBKVU1QIQorICAgICAqLworICAgIGp1bXBfZmxhZ3MgPSBqdW1wX3RvX21vdXNlKGp1bXBfZmxhZ3MsCisJCQlvYXAgPT0gTlVMTCA/IE5VTEwgOiAmKG9hcC0+aW5jbHVzaXZlKSwgd2hpY2hfYnV0dG9uKTsKKyAgICBtb3ZlZCA9IChqdW1wX2ZsYWdzICYgQ1VSU09SX01PVkVEKTsKKyAgICBpbl9zdGF0dXNfbGluZSA9IChqdW1wX2ZsYWdzICYgSU5fU1RBVFVTX0xJTkUpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaW5fc2VwX2xpbmUgPSAoanVtcF9mbGFncyAmIElOX1NFUF9MSU5FKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKHVzaW5nTmV0YmVhbnMgJiYgaXNOZXRiZWFuc0J1ZmZlcihjdXJidWYpCisJCQkgICAgJiYgIShqdW1wX2ZsYWdzICYgKElOX1NUQVRVU19MSU5FIHwgSU5fU0VQX0xJTkUpKSkKKyAgICB7CisJaW50IGtleSA9IEtFWTJURVJNQ0FQMShjKTsKKworCWlmIChrZXkgPT0gKGludClLRV9MRUZUUkVMRUFTRSB8fCBrZXkgPT0gKGludClLRV9NSURETEVSRUxFQVNFCisJCQkJCSAgICAgICB8fCBrZXkgPT0gKGludClLRV9SSUdIVFJFTEVBU0UpCisJICAgIG5ldGJlYW5zX2J1dHRvbl9yZWxlYXNlKHdoaWNoX2J1dHRvbik7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBXaGVuIGp1bXBpbmcgdG8gYW5vdGhlciB3aW5kb3csIGNsZWFyIGEgcGVuZGluZyBvcGVyYXRvci4gIFRoYXQncyBhIGJpdAorICAgICAqIGZyaWVuZGxpZXIgdGhhbiBiZWVwaW5nIGFuZCBub3QganVtcGluZyB0byB0aGF0IHdpbmRvdy4gKi8KKyAgICBpZiAoY3Vyd2luICE9IG9sZF9jdXJ3aW4gJiYgb2FwICE9IE5VTEwgJiYgb2FwLT5vcF90eXBlICE9IE9QX05PUCkKKwljbGVhcm9wKG9hcCk7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAobW9kX21hc2sgPT0gMAorCSAgICAmJiAhaXNfZHJhZworCSAgICAmJiAoanVtcF9mbGFncyAmIChNT1VTRV9GT0xEX0NMT1NFIHwgTU9VU0VfRk9MRF9PUEVOKSkKKwkgICAgJiYgd2hpY2hfYnV0dG9uID09IE1PVVNFX0xFRlQpCisgICAgeworCS8qIG9wZW4gb3IgY2xvc2UgYSBmb2xkIGF0IHRoaXMgbGluZSAqLworCWlmIChqdW1wX2ZsYWdzICYgTU9VU0VfRk9MRF9PUEVOKQorCSAgICBvcGVuRm9sZChjdXJ3aW4tPndfY3Vyc29yLmxudW0sIDFMKTsKKwllbHNlCisJICAgIGNsb3NlRm9sZChjdXJ3aW4tPndfY3Vyc29yLmxudW0sIDFMKTsKKwkvKiBkb24ndCBtb3ZlIHRoZSBjdXJzb3IgaWYgc3RpbGwgaW4gdGhlIHNhbWUgd2luZG93ICovCisJaWYgKGN1cndpbiA9PSBvbGRfY3Vyd2luKQorCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gc2F2ZV9jdXJzb3I7CisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSAmJiBkZWZpbmVkKEZFQVRfQ01EV0lOKQorICAgIGlmICgoanVtcF9mbGFncyAmIElOX09USEVSX1dJTikgJiYgIVZJc3VhbF9hY3RpdmUgJiYgY2xpcF9zdGFyLmF2YWlsYWJsZSkKKyAgICB7CisJY2xpcF9tb2RlbGVzcyh3aGljaF9idXR0b24sIGlzX2NsaWNrLCBpc19kcmFnKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIFNldCBnbG9iYWwgZmxhZyB0aGF0IHdlIGFyZSBleHRlbmRpbmcgdGhlIFZpc3VhbCBhcmVhIHdpdGggbW91c2UKKyAgICAgKiBkcmFnZ2luZzsgdGVtcG9yYXJpbHkgbWltaW1pemUgJ3Njcm9sbG9mZicuICovCisgICAgaWYgKFZJc3VhbF9hY3RpdmUgJiYgaXNfZHJhZyAmJiBwX3NvKQorICAgIHsKKwkvKiBJbiB0aGUgdmVyeSBmaXJzdCBsaW5lLCBhbGxvdyBzY3JvbGxpbmcgb25lIGxpbmUgKi8KKwlpZiAobW91c2Vfcm93ID09IDApCisJICAgIG1vdXNlX2RyYWdnaW5nID0gMjsKKwllbHNlCisJICAgIG1vdXNlX2RyYWdnaW5nID0gMTsKKyAgICB9CisKKyAgICAvKiBXaGVuIGRyYWdnaW5nIHRoZSBtb3VzZSBhYm92ZSB0aGUgd2luZG93LCBzY3JvbGwgZG93bi4gKi8KKyAgICBpZiAoaXNfZHJhZyAmJiBtb3VzZV9yb3cgPCAwICYmICFpbl9zdGF0dXNfbGluZSkKKyAgICB7CisJc2Nyb2xsX3JlZHJhdyhGQUxTRSwgMUwpOworCW1vdXNlX3JvdyA9IDA7CisgICAgfQorCisgICAgaWYgKHN0YXJ0X3Zpc3VhbC5sbnVtKQkJLyogcmlnaHQgY2xpY2sgaW4gdmlzdWFsIG1vZGUgKi8KKyAgICB7CisJLyoKKwkgKiBJbiBWaXN1YWwtYmxvY2sgbW9kZSwgZGl2aWRlIHRoZSBhcmVhIGluIGZvdXIsIHBpY2sgdXAgdGhlIGNvcm5lcgorCSAqIHRoYXQgaXMgaW4gdGhlIHF1YXJ0ZXIgdGhhdCB0aGUgY3Vyc29yIGlzIGluLgorCSAqLworCWlmIChWSXN1YWxfbW9kZSA9PSBDdHJsX1YpCisJeworCSAgICBnZXR2Y29scyhjdXJ3aW4sICZzdGFydF92aXN1YWwsICZlbmRfdmlzdWFsLCAmbGVmdGNvbCwgJnJpZ2h0Y29sKTsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzd2FudCA+IChsZWZ0Y29sICsgcmlnaHRjb2wpIC8gMikKKwkJZW5kX3Zpc3VhbC5jb2wgPSBsZWZ0Y29sOworCSAgICBlbHNlCisJCWVuZF92aXN1YWwuY29sID0gcmlnaHRjb2w7CisJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPAorCQkJCSAgICAoc3RhcnRfdmlzdWFsLmxudW0gKyBlbmRfdmlzdWFsLmxudW0pIC8gMikKKwkJZW5kX3Zpc3VhbC5sbnVtID0gZW5kX3Zpc3VhbC5sbnVtOworCSAgICBlbHNlCisJCWVuZF92aXN1YWwubG51bSA9IHN0YXJ0X3Zpc3VhbC5sbnVtOworCisJICAgIC8qIG1vdmUgVklzdWFsIHRvIHRoZSByaWdodCBjb2x1bW4gKi8KKwkgICAgc3RhcnRfdmlzdWFsID0gY3Vyd2luLT53X2N1cnNvcjsJICAgIC8qIHNhdmUgdGhlIGN1cnNvciBwb3MgKi8KKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGVuZF92aXN1YWw7CisJICAgIGNvbGFkdmFuY2UoZW5kX3Zpc3VhbC5jb2wpOworCSAgICBWSXN1YWwgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gc3RhcnRfdmlzdWFsOwkgICAgLyogcmVzdG9yZSB0aGUgY3Vyc29yICovCisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIElmIHRoZSBjbGljayBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHZpc3VhbCwgY2hhbmdlIHRoZSBzdGFydC4KKwkgICAgICogSWYgdGhlIGNsaWNrIGlzIGFmdGVyIHRoZSBlbmQgb2YgdmlzdWFsLCBjaGFuZ2UgdGhlIGVuZC4gIElmCisJICAgICAqIHRoZSBjbGljayBpcyBpbnNpZGUgdGhlIHZpc3VhbCwgY2hhbmdlIHRoZSBjbG9zZXN0IHNpZGUuCisJICAgICAqLworCSAgICBpZiAobHQoY3Vyd2luLT53X2N1cnNvciwgc3RhcnRfdmlzdWFsKSkKKwkJVklzdWFsID0gZW5kX3Zpc3VhbDsKKwkgICAgZWxzZSBpZiAobHQoZW5kX3Zpc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisJCVZJc3VhbCA9IHN0YXJ0X3Zpc3VhbDsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIEluIHRoZSBzYW1lIGxpbmUsIGNvbXBhcmUgY29sdW1uIG51bWJlciAqLworCQlpZiAoZW5kX3Zpc3VhbC5sbnVtID09IHN0YXJ0X3Zpc3VhbC5sbnVtKQorCQl7CisJCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgLSBzdGFydF92aXN1YWwuY29sID4KKwkJCQkgICAgZW5kX3Zpc3VhbC5jb2wgLSBjdXJ3aW4tPndfY3Vyc29yLmNvbCkKKwkJCVZJc3VhbCA9IHN0YXJ0X3Zpc3VhbDsKKwkJICAgIGVsc2UKKwkJCVZJc3VhbCA9IGVuZF92aXN1YWw7CisJCX0KKworCQkvKiBJbiBkaWZmZXJlbnQgbGluZXMsIGNvbXBhcmUgbGluZSBudW1iZXIgKi8KKwkJZWxzZQorCQl7CisJCSAgICBkaWZmID0gKGN1cndpbi0+d19jdXJzb3IubG51bSAtIHN0YXJ0X3Zpc3VhbC5sbnVtKSAtCisJCQkJKGVuZF92aXN1YWwubG51bSAtIGN1cndpbi0+d19jdXJzb3IubG51bSk7CisKKwkJICAgIGlmIChkaWZmID4gMCkJCS8qIGNsb3Nlc3QgdG8gZW5kICovCisJCQlWSXN1YWwgPSBzdGFydF92aXN1YWw7CisJCSAgICBlbHNlIGlmIChkaWZmIDwgMCkJLyogY2xvc2VzdCB0byBzdGFydCAqLworCQkJVklzdWFsID0gZW5kX3Zpc3VhbDsKKwkJICAgIGVsc2UJCQkvKiBpbiB0aGUgbWlkZGxlIGxpbmUgKi8KKwkJICAgIHsKKwkJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA8CisJCQkJCShzdGFydF92aXN1YWwuY29sICsgZW5kX3Zpc3VhbC5jb2wpIC8gMikKKwkJCSAgICBWSXN1YWwgPSBlbmRfdmlzdWFsOworCQkJZWxzZQorCQkJICAgIFZJc3VhbCA9IHN0YXJ0X3Zpc3VhbDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICAvKgorICAgICAqIElmIFZpc3VhbCBtb2RlIHN0YXJ0ZWQgaW4gaW5zZXJ0IG1vZGUsIGV4ZWN1dGUgIkNUUkwtTyIKKyAgICAgKi8KKyAgICBlbHNlIGlmICgoU3RhdGUgJiBJTlNFUlQpICYmIFZJc3VhbF9hY3RpdmUpCisJc3R1ZmZjaGFyUmVhZGJ1ZmYoQ3RybF9PKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBNaWRkbGUgbW91c2UgY2xpY2s6IFB1dCB0ZXh0IGJlZm9yZSBjdXJzb3IuCisgICAgICovCisgICAgaWYgKHdoaWNoX2J1dHRvbiA9PSBNT1VTRV9NSURETEUpCisgICAgeworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisJaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUgJiYgcmVnbmFtZSA9PSAwKQorCSAgICByZWduYW1lID0gJyonOworI2VuZGlmCisJaWYgKHlhbmtfcmVnaXN0ZXJfbWxpbmUocmVnbmFtZSkpCisJeworCSAgICBpZiAobW91c2VfcGFzdF9ib3R0b20pCisJCWRpciA9IEZPUldBUkQ7CisJfQorCWVsc2UgaWYgKG1vdXNlX3Bhc3RfZW9sKQorCSAgICBkaXIgPSBGT1JXQVJEOworCisJaWYgKGZpeGluZGVudCkKKwl7CisJICAgIGMxID0gKGRpciA9PSBCQUNLV0FSRCkgPyAnWycgOiAnXSc7CisJICAgIGMyID0gJ3AnOworCX0KKwllbHNlCisJeworCSAgICBjMSA9IChkaXIgPT0gRk9SV0FSRCkgPyAncCcgOiAnUCc7CisJICAgIGMyID0gTlVMOworCX0KKwlwcmVwX3JlZG8ocmVnbmFtZSwgY291bnQsIE5VTCwgYzEsIE5VTCwgYzIsIE5VTCk7CisKKwkvKgorCSAqIFJlbWVtYmVyIHdoZXJlIHRoZSBwYXN0ZSBzdGFydGVkLCBzbyBpbiBlZGl0KCkgSW5zc3RhcnQgY2FuIGJlIHNldAorCSAqIHRvIHRoaXMgcG9zaXRpb24KKwkgKi8KKwlpZiAocmVzdGFydF9lZGl0ICE9IDApCisJICAgIHdoZXJlX3Bhc3RlX3N0YXJ0ZWQgPSBjdXJ3aW4tPndfY3Vyc29yOworCWRvX3B1dChyZWduYW1lLCBkaXIsIGNvdW50LCBmaXhpbmRlbnQgfCBQVVRfQ1VSU0VORCk7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKyAgICAvKgorICAgICAqIEN0cmwtTW91c2UgY2xpY2sgb3IgZG91YmxlIGNsaWNrIGluIGEgcXVpY2tmaXggd2luZG93IGp1bXBzIHRvIHRoZQorICAgICAqIGVycm9yIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyLgorICAgICAqLworICAgIGVsc2UgaWYgKCgobW9kX21hc2sgJiBNT0RfTUFTS19DVFJMKQorCQl8fCAobW9kX21hc2sgJiBNT0RfTUFTS19NVUxUSV9DTElDSykgPT0gTU9EX01BU0tfMkNMSUNLKQorCSAgICAmJiBidF9xdWlja2ZpeChjdXJidWYpKQorICAgIHsKKwlpZiAoU3RhdGUgJiBJTlNFUlQpCisJICAgIHN0dWZmY2hhclJlYWRidWZmKEN0cmxfTyk7CisJc3R1ZmZSZWFkYnVmZigoY2hhcl91ICopIjouY2NcbiIpOworCWdvdF9jbGljayA9IEZBTFNFOwkJLyogaWdub3JlIGRyYWcmcmVsZWFzZSBub3cgKi8KKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ3RybC1Nb3VzZSBjbGljayAob3IgZG91YmxlIGNsaWNrIGluIGEgaGVscCB3aW5kb3cpIGp1bXBzIHRvIHRoZSB0YWcKKyAgICAgKiB1bmRlciB0aGUgbW91c2UgcG9pbnRlci4KKyAgICAgKi8KKyAgICBlbHNlIGlmICgobW9kX21hc2sgJiBNT0RfTUFTS19DVFJMKSB8fCAoY3VyYnVmLT5iX2hlbHAKKwkJICAgICAmJiAobW9kX21hc2sgJiBNT0RfTUFTS19NVUxUSV9DTElDSykgPT0gTU9EX01BU0tfMkNMSUNLKSkKKyAgICB7CisJaWYgKFN0YXRlICYgSU5TRVJUKQorCSAgICBzdHVmZmNoYXJSZWFkYnVmZihDdHJsX08pOworCXN0dWZmY2hhclJlYWRidWZmKEN0cmxfUlNCKTsKKwlnb3RfY2xpY2sgPSBGQUxTRTsJCS8qIGlnbm9yZSBkcmFnJnJlbGVhc2Ugbm93ICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBTaGlmdC1Nb3VzZSBjbGljayBzZWFyY2hlcyBmb3IgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgd29yZCB1bmRlcgorICAgICAqIHRoZSBtb3VzZSBwb2ludGVyCisgICAgICovCisgICAgZWxzZSBpZiAoKG1vZF9tYXNrICYgTU9EX01BU0tfU0hJRlQpKQorICAgIHsKKwlpZiAoU3RhdGUgJiBJTlNFUlQKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQl8fCAoVklzdWFsX2FjdGl2ZSAmJiBWSXN1YWxfc2VsZWN0KQorI2VuZGlmCisJCSkKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoQ3RybF9PKTsKKwlpZiAod2hpY2hfYnV0dG9uID09IE1PVVNFX0xFRlQpCisJICAgIHN0dWZmY2hhclJlYWRidWZmKCcqJyk7CisJZWxzZQkvKiBNT1VTRV9SSUdIVCAqLworCSAgICBzdHVmZmNoYXJSZWFkYnVmZignIycpOworICAgIH0KKworICAgIC8qIEhhbmRsZSBkb3VibGUgY2xpY2tzLCB1bmxlc3Mgb24gc3RhdHVzIGxpbmUgKi8KKyAgICBlbHNlIGlmIChpbl9zdGF0dXNfbGluZSkKKyAgICB7CisjaWZkZWYgRkVBVF9NT1VTRVNIQVBFCisJaWYgKChpc19kcmFnIHx8IGlzX2NsaWNrKSAmJiAhZHJhZ19zdGF0dXNfbGluZSkKKwl7CisJICAgIGRyYWdfc3RhdHVzX2xpbmUgPSBUUlVFOworCSAgICB1cGRhdGVfbW91c2VzaGFwZSgtMSk7CisJfQorI2VuZGlmCisgICAgfQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgZWxzZSBpZiAoaW5fc2VwX2xpbmUpCisgICAgeworIyBpZmRlZiBGRUFUX01PVVNFU0hBUEUKKwlpZiAoKGlzX2RyYWcgfHwgaXNfY2xpY2spICYmICFkcmFnX3NlcF9saW5lKQorCXsKKwkgICAgZHJhZ19zZXBfbGluZSA9IFRSVUU7CisJICAgIHVwZGF0ZV9tb3VzZXNoYXBlKC0xKTsKKwl9CisjIGVuZGlmCisgICAgfQorI2VuZGlmCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBlbHNlIGlmICgobW9kX21hc2sgJiBNT0RfTUFTS19NVUxUSV9DTElDSykgJiYgKFN0YXRlICYgKE5PUk1BTCB8IElOU0VSVCkpCisJICAgICAmJiBtb3VzZV9oYXMoTU9VU0VfVklTVUFMKSkKKyAgICB7CisJaWYgKGlzX2NsaWNrIHx8ICFWSXN1YWxfYWN0aXZlKQorCXsKKwkgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJCW9yaWdfY3Vyc29yID0gVklzdWFsOworCSAgICBlbHNlCisJICAgIHsKKwkJY2hlY2tfdmlzdWFsX2hpZ2hsaWdodCgpOworCQlWSXN1YWwgPSBjdXJ3aW4tPndfY3Vyc29yOworCQlvcmlnX2N1cnNvciA9IFZJc3VhbDsKKwkJVklzdWFsX2FjdGl2ZSA9IFRSVUU7CisJCVZJc3VhbF9yZXNlbGVjdCA9IFRSVUU7CisJCS8qIHN0YXJ0IFNlbGVjdCBtb2RlIGlmICdzZWxlY3Rtb2RlJyBjb250YWlucyAibW91c2UiICovCisJCW1heV9zdGFydF9zZWxlY3QoJ28nKTsKKwkJc2V0bW91c2UoKTsKKwkgICAgfQorCSAgICBpZiAoKG1vZF9tYXNrICYgTU9EX01BU0tfTVVMVElfQ0xJQ0spID09IE1PRF9NQVNLXzJDTElDSykKKwkJVklzdWFsX21vZGUgPSAndic7CisJICAgIGVsc2UgaWYgKChtb2RfbWFzayAmIE1PRF9NQVNLX01VTFRJX0NMSUNLKSA9PSBNT0RfTUFTS18zQ0xJQ0spCisJCVZJc3VhbF9tb2RlID0gJ1YnOworCSAgICBlbHNlIGlmICgobW9kX21hc2sgJiBNT0RfTUFTS19NVUxUSV9DTElDSykgPT0gTU9EX01BU0tfNENMSUNLKQorCQlWSXN1YWxfbW9kZSA9IEN0cmxfVjsKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorCSAgICAvKiBNYWtlIHN1cmUgdGhlIGNsaXBib2FyZCBnZXRzIHVwZGF0ZWQuICBOZWVkZWQgYmVjYXVzZSBzdGFydCBhbmQKKwkgICAgICogZW5kIG1heSBzdGlsbCBiZSB0aGUgc2FtZSwgYW5kIHRoZSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgb3duZWQgKi8KKwkgICAgY2xpcF9zdGFyLnZtb2RlID0gTlVMOworI2VuZGlmCisJfQorCS8qCisJICogQSBkb3VibGUgY2xpY2sgc2VsZWN0cyBhIHdvcmQgb3IgYSBibG9jay4KKwkgKi8KKwlpZiAoKG1vZF9tYXNrICYgTU9EX01BU0tfTVVMVElfQ0xJQ0spID09IE1PRF9NQVNLXzJDTElDSykKKwl7CisJICAgIHBvc19UCSpwb3MgPSBOVUxMOworCisJICAgIGlmIChpc19jbGljaykKKwkgICAgeworCQkvKiBJZiB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3IgKHNraXBwaW5nIHdoaXRlIHNwYWNlKSBpcworCQkgKiBub3QgYSB3b3JkIGNoYXJhY3RlciwgdHJ5IGZpbmRpbmcgYSBtYXRjaCBhbmQgc2VsZWN0IGEgKCksCisJCSAqIHt9LCBbXSwgI2lmLyNlbmRpZiwgZXRjLiBibG9jay4gKi8KKwkJZW5kX3Zpc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CisJCXdoaWxlICh2aW1faXN3aGl0ZShnY2hhcl9wb3MoJmVuZF92aXN1YWwpKSkKKwkJICAgIGluYygmZW5kX3Zpc3VhbCk7CisJCWlmIChvYXAgIT0gTlVMTCkKKwkJICAgIG9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKwkJaWYgKG9hcCAhPSBOVUxMCisJCQkmJiBWSXN1YWxfbW9kZSA9PSAndicKKwkJCSYmICF2aW1faXN3b3JkYyhnY2hhcl9wb3MoJmVuZF92aXN1YWwpKQorCQkJJiYgZXF1YWxwb3MoY3Vyd2luLT53X2N1cnNvciwgVklzdWFsKQorCQkJJiYgKHBvcyA9IGZpbmRtYXRjaChvYXAsIE5VTCkpICE9IE5VTEwpCisJCXsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IgPSAqcG9zOworCQkgICAgaWYgKG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisJCQlWSXN1YWxfbW9kZSA9ICdWJzsKKwkJICAgIGVsc2UgaWYgKCpwX3NlbCA9PSAnZScpCisJCSAgICB7CisJCQlpZiAobHQoY3Vyd2luLT53X2N1cnNvciwgVklzdWFsKSkKKwkJCSAgICArK1ZJc3VhbC5jb2w7CisJCQllbHNlCisJCQkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHBvcyA9PSBOVUxMICYmIChpc19jbGljayB8fCBpc19kcmFnKSkKKwkgICAgeworCQkvKiBXaGVuIG5vdCBmb3VuZCBhIG1hdGNoIG9yIHdoZW4gZHJhZ2dpbmc6IGV4dGVuZCB0byBpbmNsdWRlCisJCSAqIGEgd29yZC4gKi8KKwkJaWYgKGx0KGN1cndpbi0+d19jdXJzb3IsIG9yaWdfY3Vyc29yKSkKKwkJeworCQkgICAgZmluZF9zdGFydF9vZl93b3JkKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwkJICAgIGZpbmRfZW5kX29mX3dvcmQoJlZJc3VhbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBmaW5kX3N0YXJ0X29mX3dvcmQoJlZJc3VhbCk7CisJCSAgICBpZiAoKnBfc2VsID09ICdlJyAmJiAqbWxfZ2V0X2N1cnNvcigpICE9IE5VTCkKKyNpZmRlZiBGRUFUX01CWVRFCisJCQljdXJ3aW4tPndfY3Vyc29yLmNvbCArPQorCQkJCQkgKCptYl9wdHIybGVuX2NoZWNrKShtbF9nZXRfY3Vyc29yKCkpOworI2Vsc2UKKwkJCSsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisjZW5kaWYKKwkJICAgIGZpbmRfZW5kX29mX3dvcmQoJmN1cndpbi0+d19jdXJzb3IpOworCQl9CisJICAgIH0KKwkgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisJfQorCWlmIChpc19jbGljaykKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CS8qIHVwZGF0ZSB0aGUgaW52ZXJzaW9uICovCisgICAgfQorICAgIGVsc2UgaWYgKFZJc3VhbF9hY3RpdmUgJiYgIW9sZF9hY3RpdmUpCisJVklzdWFsX21vZGUgPSAndic7CisKKyAgICAvKiBJZiBWaXN1YWwgbW9kZSBjaGFuZ2VkIHNob3cgaXQgbGF0ZXIuICovCisgICAgaWYgKHBfc21kICYmIChWSXN1YWxfYWN0aXZlICE9IG9sZF9hY3RpdmUgfHwgVklzdWFsX21vZGUgIT0gb2xkX21vZGUpKQorCXJlZHJhd19jbWRsaW5lID0gVFJVRTsKKyNlbmRpZgorCisgICAgcmV0dXJuIG1vdmVkOworfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiBNb3ZlICJwb3MiIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIGl0J3MgaW4uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZmluZF9zdGFydF9vZl93b3JkKHBvcykKKyAgICBwb3NfVAkqcG9zOworeworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWNjbGFzczsKKyAgICBpbnQJCWNvbDsKKworICAgIGxpbmUgPSBtbF9nZXQocG9zLT5sbnVtKTsKKyAgICBjY2xhc3MgPSBnZXRfbW91c2VfY2xhc3MobGluZSArIHBvcy0+Y29sKTsKKworICAgIHdoaWxlIChwb3MtPmNvbCA+IDApCisgICAgeworCWNvbCA9IHBvcy0+Y29sIC0gMTsKKyNpZmRlZiBGRUFUX01CWVRFCisJY29sIC09ICgqbWJfaGVhZF9vZmYpKGxpbmUsIGxpbmUgKyBjb2wpOworI2VuZGlmCisJaWYgKGdldF9tb3VzZV9jbGFzcyhsaW5lICsgY29sKSAhPSBjY2xhc3MpCisJICAgIGJyZWFrOworCXBvcy0+Y29sID0gY29sOworICAgIH0KK30KKworLyoKKyAqIE1vdmUgInBvcyIgZm9yd2FyZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JkIGl0J3MgaW4uCisgKiBXaGVuICdzZWxlY3Rpb24nIGlzICJleGNsdXNpdmUiLCB0aGUgcG9zaXRpb24gaXMganVzdCBhZnRlciB0aGUgd29yZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmaW5kX2VuZF9vZl93b3JkKHBvcykKKyAgICBwb3NfVAkqcG9zOworeworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWNjbGFzczsKKyAgICBpbnQJCWNvbDsKKworICAgIGxpbmUgPSBtbF9nZXQocG9zLT5sbnVtKTsKKyAgICBpZiAoKnBfc2VsID09ICdlJyAmJiBwb3MtPmNvbCA+IDApCisgICAgeworCS0tcG9zLT5jb2w7CisjaWZkZWYgRkVBVF9NQllURQorCXBvcy0+Y29sIC09ICgqbWJfaGVhZF9vZmYpKGxpbmUsIGxpbmUgKyBwb3MtPmNvbCk7CisjZW5kaWYKKyAgICB9CisgICAgY2NsYXNzID0gZ2V0X21vdXNlX2NsYXNzKGxpbmUgKyBwb3MtPmNvbCk7CisgICAgd2hpbGUgKGxpbmVbcG9zLT5jb2xdICE9IE5VTCkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWNvbCA9IHBvcy0+Y29sICsgKCptYl9wdHIybGVuX2NoZWNrKShsaW5lICsgcG9zLT5jb2wpOworI2Vsc2UKKwljb2wgPSBwb3MtPmNvbCArIDE7CisjZW5kaWYKKwlpZiAoZ2V0X21vdXNlX2NsYXNzKGxpbmUgKyBjb2wpICE9IGNjbGFzcykKKwl7CisJICAgIGlmICgqcF9zZWwgPT0gJ2UnKQorCQlwb3MtPmNvbCA9IGNvbDsKKwkgICAgYnJlYWs7CisJfQorCXBvcy0+Y29sID0gY29sOworICAgIH0KK30KKworLyoKKyAqIEdldCBjbGFzcyBvZiBhIGNoYXJhY3RlciBmb3Igc2VsZWN0aW9uOiBzYW1lIGNsYXNzIG1lYW5zIHNhbWUgd29yZC4KKyAqIDA6IGJsYW5rCisgKiAxOiBwdW5jdHVhdGlvbiBncm91cHMKKyAqIDI6IG5vcm1hbCB3b3JkIGNoYXJhY3RlcgorICogPjI6IG11bHRpLWJ5dGUgd29yZCBjaGFyYWN0ZXIuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfbW91c2VfY2xhc3MocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaW50CQljOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUgJiYgTUJfQllURTJMRU4ocFswXSkgPiAxKQorCXJldHVybiBtYl9nZXRfY2xhc3MocCk7CisjZW5kaWYKKworICAgIGMgPSAqcDsKKyAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCXJldHVybiAwOworCisgICAgaWYgKHZpbV9pc3dvcmRjKGMpKQorCXJldHVybiAyOworCisgICAgLyoKKyAgICAgKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCBjYXNlcyB3aGVyZSB3ZSB3YW50IGNlcnRhaW4gY29tYmluYXRpb25zIG9mCisgICAgICogY2hhcmFjdGVycyB0byBiZSBjb25zaWRlcmVkIGFzIGEgc2luZ2xlIHdvcmQuICBUaGVzZSBhcmUgdGhpbmdzIGxpa2UKKyAgICAgKiAiLT4iLCAiLyAqIiwgIio9IiwgIis9IiwgIiY9IiwgIjw9IiwgIj49IiwgIiE9IiBldGMuICBPdGhlcndpc2UsIGVhY2gKKyAgICAgKiBjaGFyYWN0ZXIgaXMgaW4gaXQncyBvd24gY2xhc3MuCisgICAgICovCisgICAgaWYgKGMgIT0gTlVMICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSItKyovJTw+JnxeIT0iLCBjKSAhPSBOVUxMKQorCXJldHVybiAxOworICAgIHJldHVybiBjOworfQorI2VuZGlmIC8qIEZFQVRfVklTVUFMICovCisjZW5kaWYgLyogRkVBVF9NT1VTRSAqLworCisjaWYgZGVmaW5lZChGRUFUX1ZJU1VBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDaGVjayBpZiAgaGlnaGxpZ2h0aW5nIGZvciB2aXN1YWwgbW9kZSBpcyBwb3NzaWJsZSwgZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZQorICogaWYgbm90LgorICovCisgICAgdm9pZAorY2hlY2tfdmlzdWFsX2hpZ2hsaWdodCgpCit7CisgICAgc3RhdGljIGludAkgICAgZGlkX2NoZWNrID0gRkFMU0U7CisKKyAgICBpZiAoZnVsbF9zY3JlZW4pCisgICAgeworCWlmICghZGlkX2NoZWNrICYmIGhsX2F0dHIoSExGX1YpID09IDApCisJICAgIE1TRyhfKCJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IikpOworCWRpZF9jaGVjayA9IFRSVUU7CisgICAgfQorfQorCisvKgorICogRW5kIHZpc3VhbCBtb2RlLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgQUxXQVlTIGJlIGNhbGxlZCB0byBlbmQgVmlzdWFsIG1vZGUsIGV4Y2VwdCBmcm9tCisgKiBkb19wZW5kaW5nX29wZXJhdG9yKCkuCisgKi8KKyAgICB2b2lkCitlbmRfdmlzdWFsX21vZGUoKQoreworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyoKKyAgICAgKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIGNsaXBib2FyZCwgdGhlbiByZW1lbWJlciB3aGF0IHdhcyBzZWxlY3RlZCBpbiBjYXNlCisgICAgICogd2UgbmVlZCB0byBwYXN0ZSBpdCBzb21ld2hlcmUgd2hpbGUgd2Ugc3RpbGwgb3duIHRoZSBzZWxlY3Rpb24uCisgICAgICogT25seSBkbyB0aGlzIHdoZW4gdGhlIGNsaXBib2FyZCBpcyBhbHJlYWR5IG93bmVkLiAgRG9uJ3Qgd2FudCB0byBncmFiCisgICAgICogdGhlIHNlbGVjdGlvbiB3aGVuIGhpdHRpbmcgRVNDLgorICAgICAqLworICAgIGlmIChjbGlwX3N0YXIuYXZhaWxhYmxlICYmIGNsaXBfc3Rhci5vd25lZCkKKwljbGlwX2F1dG9fc2VsZWN0KCk7CisjZW5kaWYKKworICAgIFZJc3VhbF9hY3RpdmUgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgc2V0bW91c2UoKTsKKyAgICBtb3VzZV9kcmFnZ2luZyA9IDA7CisjZW5kaWYKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgVklzdWFsIGFyZWEgZm9yICc8IGFuZCAnPiBtYXJrcywgYW5kICJndiIgKi8KKyAgICBjdXJidWYtPmJfdmlzdWFsX21vZGUgPSBWSXN1YWxfbW9kZTsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBjdXJidWYtPmJfdmlzdWFsX21vZGVfZXZhbCA9IFZJc3VhbF9tb2RlOworI2VuZGlmCisgICAgY3VyYnVmLT5iX3Zpc3VhbF9zdGFydCA9IFZJc3VhbDsKKyAgICBjdXJidWYtPmJfdmlzdWFsX2VuZCA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgY3VyYnVmLT5iX3Zpc3VhbF9jdXJzd2FudCA9IGN1cndpbi0+d19jdXJzd2FudDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgaWYgKCF2aXJ0dWFsX2FjdGl2ZSgpKQorCWN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorCisgICAgaWYgKHBfc21kKQorCWNsZWFyX2NtZGxpbmUgPSBUUlVFOwkJLyogdW5zaG93IHZpc3VhbCBtb2RlIGxhdGVyICovCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyAgICBlbHNlCisJY2xlYXJfc2hvd2NtZCgpOworI2VuZGlmCisKKyAgICAvKiBEb24ndCBsZWF2ZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAgJiYgKm1sX2dldF9jdXJzb3IoKSA9PSBOVUwpCisJLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKK30KKworLyoKKyAqIFJlc2V0IFZJc3VhbF9hY3RpdmUgYW5kIFZJc3VhbF9yZXNlbGVjdC4KKyAqLworICAgIHZvaWQKK3Jlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKQoreworICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwllbmRfdmlzdWFsX21vZGUoKTsKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsJLyogZGVsZXRlIHRoZSBpbnZlcnNpb24gbGF0ZXIgKi8KKyAgICB9CisgICAgVklzdWFsX3Jlc2VsZWN0ID0gRkFMU0U7Cit9CisKKy8qCisgKiBSZXNldCBWSXN1YWxfYWN0aXZlIGFuZCBWSXN1YWxfcmVzZWxlY3QgaWYgaXQncyBzZXQuCisgKi8KKyAgICB2b2lkCityZXNldF9WSXN1YWwoKQoreworICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwllbmRfdmlzdWFsX21vZGUoKTsKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsJLyogZGVsZXRlIHRoZSBpbnZlcnNpb24gbGF0ZXIgKi8KKwlWSXN1YWxfcmVzZWxlY3QgPSBGQUxTRTsKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9WSVNVQUwgKi8KKworI2lmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpCitzdGF0aWMgaW50IGZpbmRfaXNfZXZhbF9pdGVtIF9fQVJHUygoY2hhcl91ICpwdHIsIGludCAqY29scCwgaW50ICpuYnAsIGludCBkaXIpKTsKKworLyoKKyAqIENoZWNrIGZvciBhIGJhbGxvb24tZXZhbCBzcGVjaWFsIGl0ZW0gdG8gaW5jbHVkZSB3aGVuIHNlYXJjaGluZyBmb3IgYW4KKyAqIGlkZW50aWZpZXIuICBXaGVuICJkaXIiIGlzIEJBQ0tXQVJEICJwdHJbLTFdIiBtdXN0IGJlIHZhbGlkIQorICogUmV0dXJucyBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgYXQgIipwdHIiIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqICJkaXIiIGlzIEZPUldBUkQgb3IgQkFDS1dBUkQsIHRoZSBkaXJlY3Rpb24gb2Ygc2VhcmNoaW5nLgorICogIipjb2xwIiBpcyBpbi9kZWNyZW1lbnRlZCBpZiAicHRyWy1kaXJdIiBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZC4KKyAqICJibnAiIHBvaW50cyB0byBhIGNvdW50ZXIgZm9yIHNxdWFyZSBicmFja2V0cy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRfaXNfZXZhbF9pdGVtKHB0ciwgY29scCwgYm5wLCBkaXIpCisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQkqY29scDsKKyAgICBpbnQJCSpibnA7CisgICAgaW50CQlkaXI7Cit7CisgICAgLyogQWNjZXB0IGV2ZXJ5dGhpbmcgaW5zaWRlIFtdLiAqLworICAgIGlmICgoKnB0ciA9PSAnXScgJiYgZGlyID09IEJBQ0tXQVJEKSB8fCAoKnB0ciA9PSAnWycgJiYgZGlyID09IEZPUldBUkQpKQorCSsrKmJucDsKKyAgICBpZiAoKmJucCA+IDApCisgICAgeworCWlmICgoKnB0ciA9PSAnWycgJiYgZGlyID09IEJBQ0tXQVJEKSB8fCAoKnB0ciA9PSAnXScgJiYgZGlyID09IEZPUldBUkQpKQorCSAgICAtLSpibnA7CisJcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLyogc2tpcCBvdmVyICJzLnZhciIgKi8KKyAgICBpZiAoKnB0ciA9PSAnLicpCisJcmV0dXJuIFRSVUU7CisKKyAgICAvKiB0d28tY2hhcmFjdGVyIGl0ZW06IHMtPnZhciAqLworICAgIGlmIChwdHJbZGlyID09IEJBQ0tXQVJEID8gMCA6IDFdID09ICc+JworCSAgICAmJiBwdHJbZGlyID09IEJBQ0tXQVJEID8gLTEgOiAwXSA9PSAnLScpCisgICAgeworCSpjb2xwICs9IGRpcjsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCisKKy8qCisgKiBGaW5kIHRoZSBpZGVudGlmaWVyIHVuZGVyIG9yIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yLgorICogImZpbmRfdHlwZSIgY2FuIGhhdmUgb25lIG9mIHRocmVlIHZhbHVlczoKKyAqIEZJTkRfSURFTlQ6ICAgZmluZCBhbiBpZGVudGlmaWVyIChrZXl3b3JkKQorICogRklORF9TVFJJTkc6ICBmaW5kIGFueSBub24td2hpdGUgc3RyaW5nCisgKiBGSU5EX0lERU5UICsgRklORF9TVFJJTkc6IGZpbmQgYW55IG5vbi13aGl0ZSBzdHJpbmcsIGlkZW50aWZpZXIgcHJlZmVycmVkLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBzdGVwczoKKyAqIDEuIFNlYXJjaCBmb3J3YXJkIGZvciB0aGUgc3RhcnQgb2YgYW4gaWRlbnRpZmllci9zdHJpbmcuICBEb2Vzbid0IG1vdmUgaWYKKyAqICAgIGFscmVhZHkgb24gb25lLgorICogMi4gU2VhcmNoIGJhY2t3YXJkIGZvciB0aGUgc3RhcnQgb2YgdGhpcyBpZGVudGlmaWVyL3N0cmluZy4KKyAqICAgIFRoaXMgZG9lc24ndCBtYXRjaCB0aGUgcmVhbCBWaSBidXQgSSBsaWtlIGl0IGEgbGl0dGxlIGJldHRlciBhbmQgaXQKKyAqICAgIHNob3VsZG4ndCBib3RoZXIgYW55b25lLgorICogMy4gU2VhcmNoIGZvcndhcmQgdG8gdGhlIGVuZCBvZiB0aGlzIGlkZW50aWZpZXIvc3RyaW5nLgorICogICAgV2hlbiBGSU5EX0lERU5UIGlzbid0IGRlZmluZWQsIHdlIGJhY2t1cCB1bnRpbCBhIGJsYW5rLgorICoKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBvciB6ZXJvIGlmIG5vIHN0cmluZyBpcyBmb3VuZC4KKyAqIElmIGEgc3RyaW5nIGlzIGZvdW5kLCBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBpcyBwdXQgaW4gIipzdHJpbmciLiAgVGhpcworICogc3RyaW5nIGlzIG5vdCBhbHdheXMgTlVMIHRlcm1pbmF0ZWQuCisgKi8KKyAgICBpbnQKK2ZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKHN0cmluZywgZmluZF90eXBlKQorICAgIGNoYXJfdQkqKnN0cmluZzsKKyAgICBpbnQJCWZpbmRfdHlwZTsKK3sKKyAgICByZXR1cm4gZmluZF9pZGVudF9hdF9wb3MoY3Vyd2luLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJICAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCwgc3RyaW5nLCBmaW5kX3R5cGUpOworfQorCisvKgorICogTGlrZSBmaW5kX2lkZW50X3VuZGVyX2N1cnNvcigpLCBidXQgZm9yIGFueSB3aW5kb3cgYW5kIGFueSBwb3NpdGlvbi4KKyAqIEhvd2V2ZXI6IFVzZXMgJ2lza2V5d29yZCcgZnJvbSB0aGUgY3VycmVudCB3aW5kb3chLgorICovCisgICAgaW50CitmaW5kX2lkZW50X2F0X3Bvcyh3cCwgbG51bSwgc3RhcnRjb2wsIHN0cmluZywgZmluZF90eXBlKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNvbG5yX1QJc3RhcnRjb2w7CisgICAgY2hhcl91CSoqc3RyaW5nOworICAgIGludAkJZmluZF90eXBlOworeworICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJY29sID0gMDsJICAgIC8qIGluaXQgdG8gc2h1dCB1cCBHQ0MgKi8KKyAgICBpbnQJCWk7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJdGhpc19jbGFzcyA9IDA7CisgICAgaW50CQlwcmV2X2NsYXNzOworICAgIGludAkJcHJldmNvbDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpCisgICAgaW50CQlibiA9IDA7CSAgICAvKiBicmFja2V0IG5lc3RpbmcgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBpZiBpID09IDA6IHRyeSB0byBmaW5kIGFuIGlkZW50aWZpZXIKKyAgICAgKiBpZiBpID09IDE6IHRyeSB0byBmaW5kIGFueSBub24td2hpdGUgc3RyaW5nCisgICAgICovCisgICAgcHRyID0gbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW0sIEZBTFNFKTsKKyAgICBmb3IgKGkgPSAoZmluZF90eXBlICYgRklORF9JREVOVCkgPyAwIDogMTsJaSA8IDI7ICsraSkKKyAgICB7CisJLyoKKwkgKiAxLiBza2lwIHRvIHN0YXJ0IG9mIGlkZW50aWZpZXIvc3RyaW5nCisJICovCisJY29sID0gc3RhcnRjb2w7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICB3aGlsZSAocHRyW2NvbF0gIT0gTlVMKQorCSAgICB7CisjIGlmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpCisJCS8qIFN0b3AgYXQgYSAnXScgdG8gZXZhbHVhdGUgImFbeF0iLiAqLworCQlpZiAoKGZpbmRfdHlwZSAmIEZJTkRfRVZBTCkgJiYgcHRyW2NvbF0gPT0gJ10nKQorCQkgICAgYnJlYWs7CisjIGVuZGlmCisJCXRoaXNfY2xhc3MgPSBtYl9nZXRfY2xhc3MocHRyICsgY29sKTsKKwkJaWYgKHRoaXNfY2xhc3MgIT0gMCAmJiAoaSA9PSAxIHx8IHRoaXNfY2xhc3MgIT0gMSkpCisJCSAgICBicmVhazsKKwkJY29sICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyICsgY29sKTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwkgICAgd2hpbGUgKHB0cltjb2xdICE9IE5VTAorCQkgICAgJiYgKGkgPT0gMCA/ICF2aW1faXN3b3JkYyhwdHJbY29sXSkgOiB2aW1faXN3aGl0ZShwdHJbY29sXSkpCisjIGlmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSAmJiBkZWZpbmVkKEZFQVRfQkVWQUwpCisJCSAgICAmJiAoIShmaW5kX3R5cGUgJiBGSU5EX0VWQUwpIHx8IHB0cltjb2xdICE9ICddJykKKyMgZW5kaWYKKwkJICAgICkKKwkJKytjb2w7CisKKyNpZiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCS8qIFdoZW4gc3RhcnRpbmcgb24gYSAnXScgY291bnQgaXQsIHNvIHRoYXQgd2UgaW5jbHVkZSB0aGUgJ1snLiAqLworCWJuID0gcHRyW2NvbF0gPT0gJ10nOworI2VuZGlmCisKKwkvKgorCSAqIDIuIEJhY2sgdXAgdG8gc3RhcnQgb2YgaWRlbnRpZmllci9zdHJpbmcuCisJICovCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICAvKiBSZW1lbWJlciBjbGFzcyBvZiBjaGFyYWN0ZXIgdW5kZXIgY3Vyc29yLiAqLworIyBpZiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCSAgICBpZiAoKGZpbmRfdHlwZSAmIEZJTkRfRVZBTCkgJiYgcHRyW2NvbF0gPT0gJ10nKQorCQl0aGlzX2NsYXNzID0gbWJfZ2V0X2NsYXNzKChjaGFyX3UgKikiYSIpOworCSAgICBlbHNlCisjIGVuZGlmCisJCXRoaXNfY2xhc3MgPSBtYl9nZXRfY2xhc3MocHRyICsgY29sKTsKKwkgICAgd2hpbGUgKGNvbCA+IDApCisJICAgIHsKKwkJcHJldmNvbCA9IGNvbCAtIDEgLSAoKm1iX2hlYWRfb2ZmKShwdHIsIHB0ciArIGNvbCAtIDEpOworCQlwcmV2X2NsYXNzID0gbWJfZ2V0X2NsYXNzKHB0ciArIHByZXZjb2wpOworCQlpZiAodGhpc19jbGFzcyAhPSBwcmV2X2NsYXNzCisJCQkmJiAoaSA9PSAwCisJCQkgICAgfHwgcHJldl9jbGFzcyA9PSAwCisJCQkgICAgfHwgKGZpbmRfdHlwZSAmIEZJTkRfSURFTlQpKQorIyBpZiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCQkJJiYgKCEoZmluZF90eXBlICYgRklORF9FVkFMKQorCQkJICAgIHx8IHByZXZjb2wgPT0gMAorCQkJICAgIHx8ICFmaW5kX2lzX2V2YWxfaXRlbShwdHIgKyBwcmV2Y29sLCAmcHJldmNvbCwKKwkJCQkJCQkgICAgICAgJmJuLCBCQUNLV0FSRCkpCisjIGVuZGlmCisJCQkpCisJCSAgICBicmVhazsKKwkJY29sID0gcHJldmNvbDsKKwkgICAgfQorCisJICAgIC8qIElmIHdlIGRvbid0IHdhbnQganVzdCBhbnkgb2xkIHN0cmluZywgb3Igd2UndmUgZm91bmQgYW4KKwkgICAgICogaWRlbnRpZmllciwgc3RvcCBzZWFyY2hpbmcuICovCisJICAgIGlmICh0aGlzX2NsYXNzID4gMikKKwkJdGhpc19jbGFzcyA9IDI7CisJICAgIGlmICghKGZpbmRfdHlwZSAmIEZJTkRfU1RSSU5HKSB8fCB0aGlzX2NsYXNzID09IDIpCisJCWJyZWFrOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIHdoaWxlIChjb2wgPiAwCisJCSAgICAmJiAoKGkgPT0gMAorCQkJICAgID8gdmltX2lzd29yZGMocHRyW2NvbCAtIDFdKQorCQkJICAgIDogKCF2aW1faXN3aGl0ZShwdHJbY29sIC0gMV0pCisJCQkJJiYgKCEoZmluZF90eXBlICYgRklORF9JREVOVCkKKwkJCQkgICAgfHwgIXZpbV9pc3dvcmRjKHB0cltjb2wgLSAxXSkpKSkKKyNpZiBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgJiYgZGVmaW5lZChGRUFUX0JFVkFMKQorCQkJfHwgKChmaW5kX3R5cGUgJiBGSU5EX0VWQUwpCisJCQkgICAgJiYgY29sID4gMQorCQkJICAgICYmIGZpbmRfaXNfZXZhbF9pdGVtKHB0ciArIGNvbCAtIDEsICZjb2wsCisJCQkJCQkJICAgICAgICZibiwgQkFDS1dBUkQpKQorI2VuZGlmCisJCQkpKQorCQktLWNvbDsKKworCSAgICAvKiBJZiB3ZSBkb24ndCB3YW50IGp1c3QgYW55IG9sZCBzdHJpbmcsIG9yIHdlJ3ZlIGZvdW5kIGFuCisJICAgICAqIGlkZW50aWZpZXIsIHN0b3Agc2VhcmNoaW5nLiAqLworCSAgICBpZiAoIShmaW5kX3R5cGUgJiBGSU5EX1NUUklORykgfHwgdmltX2lzd29yZGMocHRyW2NvbF0pKQorCQlicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKHB0cltjb2xdID09IE5VTCB8fCAoaSA9PSAwICYmICgKKyNpZmRlZiBGRUFUX01CWVRFCisJCWhhc19tYnl0ZSA/IHRoaXNfY2xhc3MgIT0gMiA6CisjZW5kaWYKKwkJIXZpbV9pc3dvcmRjKHB0cltjb2xdKSkpKQorICAgIHsKKwkvKgorCSAqIGRpZG4ndCBmaW5kIGFuIGlkZW50aWZpZXIgb3Igc3RyaW5nCisJICovCisJaWYgKGZpbmRfdHlwZSAmIEZJTkRfU1RSSU5HKQorCSAgICBFTVNHKF8oIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiKSk7CisJZWxzZQorCSAgICBFTVNHKF8oIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIikpOworCXJldHVybiAwOworICAgIH0KKyAgICBwdHIgKz0gY29sOworICAgICpzdHJpbmcgPSBwdHI7CisKKyAgICAvKgorICAgICAqIDMuIEZpbmQgdGhlIGVuZCBpZiB0aGUgaWRlbnRpZmllci9zdHJpbmcuCisgICAgICovCisjaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpICYmIGRlZmluZWQoRkVBVF9CRVZBTCkKKyAgICBibiA9IDA7CisgICAgc3RhcnRjb2wgLT0gY29sOworI2VuZGlmCisgICAgY29sID0gMDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGhhc19tYnl0ZSkKKyAgICB7CisJLyogU2VhcmNoIGZvciBwb2ludCBvZiBjaGFuZ2luZyBtdWx0aWJ5dGUgY2hhcmFjdGVyIGNsYXNzLiAqLworCXRoaXNfY2xhc3MgPSBtYl9nZXRfY2xhc3MocHRyKTsKKwl3aGlsZSAocHRyW2NvbF0gIT0gTlVMCisJCSYmICgoaSA9PSAwID8gbWJfZ2V0X2NsYXNzKHB0ciArIGNvbCkgPT0gdGhpc19jbGFzcworCQkJICAgIDogbWJfZ2V0X2NsYXNzKHB0ciArIGNvbCkgIT0gMCkKKyMgaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpICYmIGRlZmluZWQoRkVBVF9CRVZBTCkKKwkJICAgIHx8ICgoZmluZF90eXBlICYgRklORF9FVkFMKQorCQkJJiYgY29sIDw9IChpbnQpc3RhcnRjb2wKKwkJCSYmIGZpbmRfaXNfZXZhbF9pdGVtKHB0ciArIGNvbCwgJmNvbCwgJmJuLCBGT1JXQVJEKSkKKyMgZW5kaWYKKwkJKSkKKwkgICAgY29sICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyICsgY29sKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJd2hpbGUgKChpID09IDAgPyB2aW1faXN3b3JkYyhwdHJbY29sXSkKKwkJICAgICAgIDogKHB0cltjb2xdICE9IE5VTCAmJiAhdmltX2lzd2hpdGUocHRyW2NvbF0pKSkKKyMgaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpICYmIGRlZmluZWQoRkVBVF9CRVZBTCkKKwkJICAgIHx8ICgoZmluZF90eXBlICYgRklORF9FVkFMKQorCQkJJiYgY29sIDw9IChpbnQpc3RhcnRjb2wKKwkJCSYmIGZpbmRfaXNfZXZhbF9pdGVtKHB0ciArIGNvbCwgJmNvbCwgJmJuLCBGT1JXQVJEKSkKKyMgZW5kaWYKKwkJKQorCXsKKwkgICAgKytjb2w7CisJfQorCisgICAgcmV0dXJuIGNvbDsKK30KKworLyoKKyAqIFByZXBhcmUgZm9yIHJlZG8gb2YgYSBub3JtYWwgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwcmVwX3JlZG9fY21kKGNhcCkKKyAgICBjbWRhcmdfVCAgKmNhcDsKK3sKKyAgICBwcmVwX3JlZG8oY2FwLT5vYXAtPnJlZ25hbWUsIGNhcC0+Y291bnQwLAorCQkJCSAgICAgTlVMLCBjYXAtPmNtZGNoYXIsIE5VTCwgTlVMLCBjYXAtPm5jaGFyKTsKK30KKworLyoKKyAqIFByZXBhcmUgZm9yIHJlZG8gb2YgYW55IGNvbW1hbmQuCisgKiBOb3RlIHRoYXQgb25seSB0aGUgbGFzdCBhcmd1bWVudCBjYW4gYmUgYSBtdWx0aS1ieXRlIGNoYXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHJlcF9yZWRvKHJlZ25hbWUsIG51bSwgY21kMSwgY21kMiwgY21kMywgY21kNCwgY21kNSkKKyAgICBpbnQJICAgIHJlZ25hbWU7CisgICAgbG9uZyAgICBudW07CisgICAgaW50CSAgICBjbWQxOworICAgIGludAkgICAgY21kMjsKKyAgICBpbnQJICAgIGNtZDM7CisgICAgaW50CSAgICBjbWQ0OworICAgIGludAkgICAgY21kNTsKK3sKKyAgICBSZXNldFJlZG9idWZmKCk7CisgICAgaWYgKHJlZ25hbWUgIT0gMCkJLyogeWFuayBmcm9tIHNwZWNpZmllZCBidWZmZXIgKi8KKyAgICB7CisJQXBwZW5kQ2hhclRvUmVkb2J1ZmYoJyInKTsKKwlBcHBlbmRDaGFyVG9SZWRvYnVmZihyZWduYW1lKTsKKyAgICB9CisgICAgaWYgKG51bSkKKwlBcHBlbmROdW1iZXJUb1JlZG9idWZmKG51bSk7CisKKyAgICBpZiAoY21kMSAhPSBOVUwpCisJQXBwZW5kQ2hhclRvUmVkb2J1ZmYoY21kMSk7CisgICAgaWYgKGNtZDIgIT0gTlVMKQorCUFwcGVuZENoYXJUb1JlZG9idWZmKGNtZDIpOworICAgIGlmIChjbWQzICE9IE5VTCkKKwlBcHBlbmRDaGFyVG9SZWRvYnVmZihjbWQzKTsKKyAgICBpZiAoY21kNCAhPSBOVUwpCisJQXBwZW5kQ2hhclRvUmVkb2J1ZmYoY21kNCk7CisgICAgaWYgKGNtZDUgIT0gTlVMKQorCUFwcGVuZENoYXJUb1JlZG9idWZmKGNtZDUpOworfQorCisvKgorICogY2hlY2sgZm9yIG9wZXJhdG9yIGFjdGl2ZSBhbmQgY2xlYXIgaXQKKyAqCisgKiByZXR1cm4gVFJVRSBpZiBvcGVyYXRvciB3YXMgYWN0aXZlCisgKi8KKyAgICBzdGF0aWMgaW50CitjaGVja2NsZWFyb3Aob2FwKQorICAgIG9wYXJnX1QJKm9hcDsKK3sKKyAgICBpZiAob2FwLT5vcF90eXBlID09IE9QX05PUCkKKwlyZXR1cm4gRkFMU0U7CisgICAgY2xlYXJvcGJlZXAob2FwKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGNoZWNrIGZvciBvcGVyYXRvciBvciBWaXN1YWwgYWN0aXZlIGFuZCBjbGVhciBpdAorICoKKyAqIHJldHVybiBUUlVFIGlmIG9wZXJhdG9yIHdhcyBhY3RpdmUKKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrY2xlYXJvcHEob2FwKQorICAgIG9wYXJnX1QJKm9hcDsKK3sKKyAgICBpZiAob2FwLT5vcF90eXBlID09IE9QX05PUAorI2lmZGVmIEZFQVRfVklTVUFMCisJICAgICYmICFWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkgICAgKQorCXJldHVybiBGQUxTRTsKKyAgICBjbGVhcm9wYmVlcChvYXApOworICAgIHJldHVybiBUUlVFOworfQorCisgICAgc3RhdGljIHZvaWQKK2NsZWFyb3Aob2FwKQorICAgIG9wYXJnX1QJKm9hcDsKK3sKKyAgICBvYXAtPm9wX3R5cGUgPSBPUF9OT1A7CisgICAgb2FwLT5yZWduYW1lID0gMDsKKyAgICBvYXAtPm1vdGlvbl9mb3JjZSA9IE5VTDsKKyAgICBvYXAtPnVzZV9yZWdfb25lID0gRkFMU0U7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY2xlYXJvcGJlZXAob2FwKQorICAgIG9wYXJnX1QJKm9hcDsKK3sKKyAgICBjbGVhcm9wKG9hcCk7CisgICAgYmVlcF9mbHVzaCgpOworfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiBSZW1vdmUgdGhlIHNoaWZ0IG1vZGlmaWVyIGZyb20gYSBzcGVjaWFsIGtleS4KKyAqLworICAgIHN0YXRpYyB2b2lkCit1bnNoaWZ0X3NwZWNpYWwoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgc3dpdGNoIChjYXAtPmNtZGNoYXIpCisgICAgeworCWNhc2UgS19TX1JJR0hUOgljYXAtPmNtZGNoYXIgPSBLX1JJR0hUOyBicmVhazsKKwljYXNlIEtfU19MRUZUOgljYXAtPmNtZGNoYXIgPSBLX0xFRlQ7IGJyZWFrOworCWNhc2UgS19TX1VQOgljYXAtPmNtZGNoYXIgPSBLX1VQOyBicmVhazsKKwljYXNlIEtfU19ET1dOOgljYXAtPmNtZGNoYXIgPSBLX0RPV047IGJyZWFrOworCWNhc2UgS19TX0hPTUU6CWNhcC0+Y21kY2hhciA9IEtfSE9NRTsgYnJlYWs7CisJY2FzZSBLX1NfRU5EOgljYXAtPmNtZGNoYXIgPSBLX0VORDsgYnJlYWs7CisgICAgfQorICAgIGNhcC0+Y21kY2hhciA9IHNpbXBsaWZ5X2tleShjYXAtPmNtZGNoYXIsICZtb2RfbWFzayk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0lORk8pIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUm91dGluZXMgZm9yIGRpc3BsYXlpbmcgYSBwYXJ0bHkgdHlwZWQgY29tbWFuZAorICovCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAkvKiBuZWVkIHJvb20gZm9yIHNpemUgb2YgVmlzdWFsIGFyZWEgKi8KKyMgZGVmaW5lIFNIT1dDTURfQlVGTEVOIFNIT1dDTURfQ09MUyArIDEgKyAzMAorI2Vsc2UKKyMgZGVmaW5lIFNIT1dDTURfQlVGTEVOIFNIT1dDTURfQ09MUyArIDEKKyNlbmRpZgorc3RhdGljIGNoYXJfdQlzaG93Y21kX2J1ZltTSE9XQ01EX0JVRkxFTl07CitzdGF0aWMgY2hhcl91CW9sZF9zaG93Y21kX2J1ZltTSE9XQ01EX0JVRkxFTl07ICAvKiBGb3IgcHVzaF9zaG93Y21kKCkgKi8KK3N0YXRpYyBpbnQJc2hvd2NtZF9pc19jbGVhciA9IFRSVUU7CitzdGF0aWMgaW50CXNob3djbWRfdmlzdWFsID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfc2hvd2NtZCBfX0FSR1MoKHZvaWQpKTsKKworICAgIHZvaWQKK2NsZWFyX3Nob3djbWQoKQoreworICAgIGlmICghcF9zYykKKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlICYmICFjaGFyX2F2YWlsKCkpCisgICAgeworCWludAkJaSA9IGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcik7CisJbG9uZwkJbGluZXM7CisJY29sbnJfVAkJbGVmdGNvbCwgcmlnaHRjb2w7CisJbGluZW5yX1QJdG9wLCBib3Q7CisKKwkvKiBTaG93IHRoZSBzaXplIG9mIHRoZSBWaXN1YWwgYXJlYS4gKi8KKwlpZiAoaSkKKwl7CisJICAgIHRvcCA9IFZJc3VhbC5sbnVtOworCSAgICBib3QgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJfQorCWVsc2UKKwl7CisJICAgIHRvcCA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkgICAgYm90ID0gVklzdWFsLmxudW07CisJfQorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkvKiBJbmNsdWRlIGNsb3NlZCBmb2xkcyBhcyBhIHdob2xlLiAqLworCWhhc0ZvbGRpbmcodG9wLCAmdG9wLCBOVUxMKTsKKwloYXNGb2xkaW5nKGJvdCwgTlVMTCwgJmJvdCk7CisjIGVuZGlmCisJbGluZXMgPSBib3QgLSB0b3AgKyAxOworCisJaWYgKFZJc3VhbF9tb2RlID09IEN0cmxfVikKKwl7CisJICAgIGdldHZjb2xzKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZWSXN1YWwsICZsZWZ0Y29sLCAmcmlnaHRjb2wpOworCSAgICBzcHJpbnRmKChjaGFyICopc2hvd2NtZF9idWYsICIlbGR4JWxkIiwgbGluZXMsCisJCQkJCSAgICAgIChsb25nKShyaWdodGNvbCAtIGxlZnRjb2wgKyAxKSk7CisJfQorCWVsc2UgaWYgKFZJc3VhbF9tb2RlID09ICdWJyB8fCBWSXN1YWwubG51bSAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIHNwcmludGYoKGNoYXIgKilzaG93Y21kX2J1ZiwgIiVsZCIsIGxpbmVzKTsKKwllbHNlCisJICAgIHNwcmludGYoKGNoYXIgKilzaG93Y21kX2J1ZiwgIiVsZCIsIChsb25nKShpCisJCSAgICA/IGN1cndpbi0+d19jdXJzb3IuY29sIC0gVklzdWFsLmNvbAorCQkgICAgOiBWSXN1YWwuY29sIC0gY3Vyd2luLT53X2N1cnNvci5jb2wpICsgKCpwX3NlbCAhPSAnZScpKTsKKwlzaG93Y21kX2J1ZltTSE9XQ01EX0NPTFNdID0gTlVMOwkvKiB0cnVuY2F0ZSAqLworCXNob3djbWRfdmlzdWFsID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCXNob3djbWRfYnVmWzBdID0gTlVMOworCXNob3djbWRfdmlzdWFsID0gRkFMU0U7CisKKwkvKiBEb24ndCBhY3R1YWxseSBkaXNwbGF5IHNvbWV0aGluZyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFyLiAqLworCWlmIChzaG93Y21kX2lzX2NsZWFyKQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgZGlzcGxheV9zaG93Y21kKCk7Cit9CisKKy8qCisgKiBBZGQgJ2MnIHRvIHN0cmluZyBvZiBzaG93biBjb21tYW5kIGNoYXJzLgorICogUmV0dXJuIFRSVUUgaWYgb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gKGFuZCBzZXRjdXJzb3IoKSBoYXMgYmVlbiBjYWxsZWQpLgorICovCisgICAgaW50CithZGRfdG9fc2hvd2NtZChjKQorICAgIGludAkJYzsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlvbGRfbGVuOworICAgIGludAkJZXh0cmFfbGVuOworICAgIGludAkJb3ZlcmZsb3c7CisjaWYgZGVmaW5lZChGRUFUX01PVVNFKQorICAgIGludAkJaTsKKyAgICBzdGF0aWMgaW50CWlnbm9yZVtdID0KKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwlLX1ZFUl9TQ1JPTExCQVIsIEtfSE9SX1NDUk9MTEJBUiwKKwlLX0xFRlRNT1VTRV9OTSwgS19MRUZUUkVMRUFTRV9OTSwKKyNlbmRpZgorCUtfSUdOT1JFLAorCUtfTEVGVE1PVVNFLCBLX0xFRlREUkFHLCBLX0xFRlRSRUxFQVNFLAorCUtfTUlERExFTU9VU0UsIEtfTUlERExFRFJBRywgS19NSURETEVSRUxFQVNFLAorCUtfUklHSFRNT1VTRSwgS19SSUdIVERSQUcsIEtfUklHSFRSRUxFQVNFLAorCUtfTU9VU0VET1dOLCBLX01PVVNFVVAsCisJS19YMU1PVVNFLCBLX1gxRFJBRywgS19YMVJFTEVBU0UsIEtfWDJNT1VTRSwgS19YMkRSQUcsIEtfWDJSRUxFQVNFLAorCTAKKyAgICB9OworI2VuZGlmCisKKyAgICBpZiAoIXBfc2MpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHNob3djbWRfdmlzdWFsKQorICAgIHsKKwlzaG93Y21kX2J1ZlswXSA9IE5VTDsKKwlzaG93Y21kX3Zpc3VhbCA9IEZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQoRkVBVF9NT1VTRSkKKyAgICAvKiBJZ25vcmUga2V5cyB0aGF0IGFyZSBzY3JvbGxiYXIgdXBkYXRlcyBhbmQgbW91c2UgY2xpY2tzICovCisgICAgaWYgKElTX1NQRUNJQUwoYykpCisJZm9yIChpID0gMDsgaWdub3JlW2ldICE9IDA7ICsraSkKKwkgICAgaWYgKGlnbm9yZVtpXSA9PSBjKQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYKKworICAgIHAgPSB0cmFuc2NoYXIoYyk7CisgICAgb2xkX2xlbiA9IChpbnQpU1RSTEVOKHNob3djbWRfYnVmKTsKKyAgICBleHRyYV9sZW4gPSAoaW50KVNUUkxFTihwKTsKKyAgICBvdmVyZmxvdyA9IG9sZF9sZW4gKyBleHRyYV9sZW4gLSBTSE9XQ01EX0NPTFM7CisgICAgaWYgKG92ZXJmbG93ID4gMCkKKwlTVFJDUFkoc2hvd2NtZF9idWYsIHNob3djbWRfYnVmICsgb3ZlcmZsb3cpOworICAgIFNUUkNBVChzaG93Y21kX2J1ZiwgcCk7CisKKyAgICBpZiAoY2hhcl9hdmFpbCgpKQorCXJldHVybiBGQUxTRTsKKworICAgIGRpc3BsYXlfc2hvd2NtZCgpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyAgICB2b2lkCithZGRfdG9fc2hvd2NtZF9jKGMpCisgICAgaW50CQljOworeworICAgIGlmICghYWRkX3RvX3Nob3djbWQoYykpCisJc2V0Y3Vyc29yKCk7Cit9CisKKy8qCisgKiBEZWxldGUgJ2xlbicgY2hhcmFjdGVycyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNob3duIGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGVsX2Zyb21fc2hvd2NtZChsZW4pCisgICAgaW50CSAgICBsZW47Cit7CisgICAgaW50CSAgICBvbGRfbGVuOworCisgICAgaWYgKCFwX3NjKQorCXJldHVybjsKKworICAgIG9sZF9sZW4gPSAoaW50KVNUUkxFTihzaG93Y21kX2J1Zik7CisgICAgaWYgKGxlbiA+IG9sZF9sZW4pCisJbGVuID0gb2xkX2xlbjsKKyAgICBzaG93Y21kX2J1ZltvbGRfbGVuIC0gbGVuXSA9IE5VTDsKKworICAgIGlmICghY2hhcl9hdmFpbCgpKQorCWRpc3BsYXlfc2hvd2NtZCgpOworfQorCisvKgorICogcHVzaF9zaG93Y21kKCkgYW5kIHBvcF9zaG93Y21kKCkgYXJlIHVzZWQgd2hlbiB3YWl0aW5nIGZvciB0aGUgdXNlciB0byB0eXBlCisgKiBzb21ldGhpbmcgYW5kIHRoZXJlIGlzIGEgcGFydGlhbCBtYXBwaW5nLgorICovCisgICAgdm9pZAorcHVzaF9zaG93Y21kKCkKK3sKKyAgICBpZiAocF9zYykKKwlTVFJDUFkob2xkX3Nob3djbWRfYnVmLCBzaG93Y21kX2J1Zik7Cit9CisKKyAgICB2b2lkCitwb3Bfc2hvd2NtZCgpCit7CisgICAgaWYgKCFwX3NjKQorCXJldHVybjsKKworICAgIFNUUkNQWShzaG93Y21kX2J1Ziwgb2xkX3Nob3djbWRfYnVmKTsKKworICAgIGRpc3BsYXlfc2hvd2NtZCgpOworfQorCisgICAgc3RhdGljIHZvaWQKK2Rpc3BsYXlfc2hvd2NtZCgpCit7CisgICAgaW50CSAgICBsZW47CisKKyAgICBjdXJzb3Jfb2ZmKCk7CisKKyAgICBsZW4gPSAoaW50KVNUUkxFTihzaG93Y21kX2J1Zik7CisgICAgaWYgKGxlbiA9PSAwKQorCXNob3djbWRfaXNfY2xlYXIgPSBUUlVFOworICAgIGVsc2UKKyAgICB7CisJc2NyZWVuX3B1dHMoc2hvd2NtZF9idWYsIChpbnQpUm93cyAtIDEsIHNjX2NvbCwgMCk7CisJc2hvd2NtZF9pc19jbGVhciA9IEZBTFNFOworICAgIH0KKworICAgIC8qCisgICAgICogY2xlYXIgdGhlIHJlc3Qgb2YgYW4gb2xkIG1lc3NhZ2UgYnkgb3V0cHV0aW5nIHVwIHRvIFNIT1dDTURfQ09MUyBzcGFjZXMKKyAgICAgKi8KKyAgICBzY3JlZW5fcHV0cygoY2hhcl91ICopIiAgICAgICAgICAiICsgbGVuLCAoaW50KVJvd3MgLSAxLCBzY19jb2wgKyBsZW4sIDApOworCisgICAgc2V0Y3Vyc29yKCk7CSAgICAvKiBwdXQgY3Vyc29yIGJhY2sgd2hlcmUgaXQgYmVsb25ncyAqLworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKy8qCisgKiBXaGVuICJjaGVjayIgaXMgRkFMU0UsIHByZXBhcmUgZm9yIGNvbW1hbmRzIHRoYXQgc2Nyb2xsIHRoZSB3aW5kb3cuCisgKiBXaGVuICJjaGVjayIgaXMgVFJVRSwgdGFrZSBjYXJlIG9mIHNjcm9sbC1iaW5kaW5nIGFmdGVyIHRoZSB3aW5kb3cgaGFzCisgKiBzY3JvbGxlZC4gIENhbGxlZCBmcm9tIG5vcm1hbF9jbWQoKSBhbmQgZWRpdCgpLgorICovCisgICAgdm9pZAorZG9fY2hlY2tfc2Nyb2xsYmluZChjaGVjaykKKyAgICBpbnQJCWNoZWNrOworeworICAgIHN0YXRpYyB3aW5fVAkqb2xkX2N1cndpbiA9IE5VTEw7CisgICAgc3RhdGljIGxpbmVucl9UCW9sZF90b3BsaW5lID0gMDsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBzdGF0aWMgaW50CQlvbGRfdG9wZmlsbCA9IDA7CisjZW5kaWYKKyAgICBzdGF0aWMgYnVmX1QJKm9sZF9idWYgPSBOVUxMOworICAgIHN0YXRpYyBjb2xucl9UCW9sZF9sZWZ0Y29sID0gMDsKKworICAgIGlmIChjaGVjayAmJiBjdXJ3aW4tPndfcF9zY2IpCisgICAgeworCS8qIElmIGEgIjpzeW5jYmluZCIgY29tbWFuZCB3YXMganVzdCB1c2VkLCBkb24ndCBzY3JvbGwsIG9ubHkgcmVzZXQKKwkgKiB0aGUgdmFsdWVzLiAqLworCWlmIChkaWRfc3luY2JpbmQpCisJICAgIGRpZF9zeW5jYmluZCA9IEZBTFNFOworCWVsc2UgaWYgKGN1cndpbiA9PSBvbGRfY3Vyd2luKQorCXsKKwkgICAgLyoKKwkgICAgICogU3luY2hyb25pemUgb3RoZXIgd2luZG93cywgYXMgbmVjZXNzYXJ5IGFjY29yZGluZyB0bworCSAgICAgKiAnc2Nyb2xsYmluZCcuICBEb24ndCBkbyB0aGlzIGFmdGVyIGFuICI6ZWRpdCIgY29tbWFuZCwgZXhjZXB0CisJICAgICAqIHdoZW4gJ2RpZmYnIGlzIHNldC4KKwkgICAgICovCisJICAgIGlmICgoY3Vyd2luLT53X2J1ZmZlciA9PSBvbGRfYnVmCisjaWZkZWYgRkVBVF9ESUZGCisJCQl8fCBjdXJ3aW4tPndfcF9kaWZmCisjZW5kaWYKKwkJKQorCQkmJiAoY3Vyd2luLT53X3RvcGxpbmUgIT0gb2xkX3RvcGxpbmUKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCXx8IGN1cndpbi0+d190b3BmaWxsICE9IG9sZF90b3BmaWxsCisjZW5kaWYKKwkJCXx8IGN1cndpbi0+d19sZWZ0Y29sICE9IG9sZF9sZWZ0Y29sKSkKKwkgICAgeworCQljaGVja19zY3JvbGxiaW5kKGN1cndpbi0+d190b3BsaW5lIC0gb2xkX3RvcGxpbmUsCisJCQkobG9uZykoY3Vyd2luLT53X2xlZnRjb2wgLSBvbGRfbGVmdGNvbCkpOworCSAgICB9CisJfQorCWVsc2UgaWYgKHZpbV9zdHJjaHIocF9zYm8sICdqJykpIC8qIGp1bXAgZmxhZyBzZXQgaW4gJ3Njcm9sbG9wdCcgKi8KKwl7CisJICAgIC8qCisJICAgICAqIFdoZW4gc3dpdGNoaW5nIGJldHdlZW4gd2luZG93cywgbWFrZSBzdXJlIHRoYXQgdGhlIHJlbGF0aXZlCisJICAgICAqIHZlcnRpY2FsIG9mZnNldCBpcyB2YWxpZCBmb3IgdGhlIG5ldyB3aW5kb3cuICBUaGUgcmVsYXRpdmUKKwkgICAgICogb2Zmc2V0IGlzIGludmFsaWQgd2hlbmV2ZXIgYW5vdGhlciAnc2Nyb2xsYmluZCcgd2luZG93IGhhcworCSAgICAgKiBzY3JvbGxlZCB0byBhIHBvaW50IHRoYXQgd291bGQgZm9yY2UgdGhlIGN1cnJlbnQgd2luZG93IHRvCisJICAgICAqIHNjcm9sbCBwYXN0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGl0cyBidWZmZXIuICBXaGVuIHRoZQorCSAgICAgKiByZXN5bmMgaXMgcGVyZm9ybWVkLCBzb21lIG9mIHRoZSBvdGhlciAnc2Nyb2xsYmluZCcgd2luZG93cyBtYXkKKwkgICAgICogbmVlZCB0byBqdW1wIHNvIHRoYXQgdGhlIGN1cnJlbnQgd2luZG93J3MgcmVsYXRpdmUgcG9zaXRpb24gaXMKKwkgICAgICogdmlzaWJsZSBvbi1zY3JlZW4uCisJICAgICAqLworCSAgICBjaGVja19zY3JvbGxiaW5kKGN1cndpbi0+d190b3BsaW5lIC0gY3Vyd2luLT53X3NjYmluZF9wb3MsIDBMKTsKKwl9CisJY3Vyd2luLT53X3NjYmluZF9wb3MgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyAgICB9CisKKyAgICBvbGRfY3Vyd2luID0gY3Vyd2luOworICAgIG9sZF90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgb2xkX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbmRpZgorICAgIG9sZF9idWYgPSBjdXJ3aW4tPndfYnVmZmVyOworICAgIG9sZF9sZWZ0Y29sID0gY3Vyd2luLT53X2xlZnRjb2w7Cit9CisKKy8qCisgKiBTeW5jaHJvbml6ZSBhbnkgd2luZG93cyB0aGF0IGhhdmUgInNjcm9sbGJpbmQiIHNldCwgYmFzZWQgb24gdGhlCisgKiBudW1iZXIgb2Ygcm93cyBieSB3aGljaCB0aGUgY3VycmVudCB3aW5kb3cgaGFzIGNoYW5nZWQKKyAqICgxOTk4LTExLTAyIDE2OjIxOjAxICBSLiBFZHdhcmQgUmFsc3RvbiA8ZXJhbHN0b25AY29tcHV0ZXIub3JnPikKKyAqLworICAgIHZvaWQKK2NoZWNrX3Njcm9sbGJpbmQodG9wbGluZV9kaWZmLCBsZWZ0Y29sX2RpZmYpCisgICAgbGluZW5yX1QJdG9wbGluZV9kaWZmOworICAgIGxvbmcJbGVmdGNvbF9kaWZmOworeworICAgIGludAkJd2FudF92ZXI7CisgICAgaW50CQl3YW50X2hvcjsKKyAgICB3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKyAgICBidWZfVAkqb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGludAkJb2xkX1ZJc3VhbF9zZWxlY3QgPSBWSXN1YWxfc2VsZWN0OworICAgIGludAkJb2xkX1ZJc3VhbF9hY3RpdmUgPSBWSXN1YWxfYWN0aXZlOworI2VuZGlmCisgICAgY29sbnJfVAl0Z3RfbGVmdGNvbCA9IGN1cndpbi0+d19sZWZ0Y29sOworICAgIGxvbmcJdG9wbGluZTsKKyAgICBsb25nCXk7CisKKyAgICAvKgorICAgICAqIGNoZWNrICdzY3JvbGxvcHQnIHN0cmluZyBmb3IgdmVydGljYWwgYW5kIGhvcml6b250YWwgc2Nyb2xsIG9wdGlvbnMKKyAgICAgKi8KKyAgICB3YW50X3ZlciA9ICh2aW1fc3RyY2hyKHBfc2JvLCAndicpICYmIHRvcGxpbmVfZGlmZiAhPSAwKTsKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICB3YW50X3ZlciB8PSBvbGRfY3Vyd2luLT53X3BfZGlmZjsKKyNlbmRpZgorICAgIHdhbnRfaG9yID0gKHZpbV9zdHJjaHIocF9zYm8sICdoJykgJiYgKGxlZnRjb2xfZGlmZiB8fCB0b3BsaW5lX2RpZmYgIT0gMCkpOworCisgICAgLyoKKyAgICAgKiBsb29wIHRocm91Z2ggdGhlIHNjcm9sbGJvdW5kIHdpbmRvd3MgYW5kIHNjcm9sbCBhY2NvcmRpbmdseQorICAgICAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgVklzdWFsX3NlbGVjdCA9IFZJc3VhbF9hY3RpdmUgPSAwOworI2VuZGlmCisgICAgZm9yIChjdXJ3aW4gPSBmaXJzdHdpbjsgY3Vyd2luOyBjdXJ3aW4gPSBjdXJ3aW4tPndfbmV4dCkKKyAgICB7CisJY3VyYnVmID0gY3Vyd2luLT53X2J1ZmZlcjsKKwkvKiBza2lwIG9yaWdpbmFsIHdpbmRvdyAgYW5kIHdpbmRvd3Mgd2l0aCAnbm9zY3JvbGxiaW5kJyAqLworCWlmIChjdXJ3aW4gIT0gb2xkX2N1cndpbiAmJiBjdXJ3aW4tPndfcF9zY2IpCisJeworCSAgICAvKgorCSAgICAgKiBkbyB0aGUgdmVydGljYWwgc2Nyb2xsCisJICAgICAqLworCSAgICBpZiAod2FudF92ZXIpCisJICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJaWYgKG9sZF9jdXJ3aW4tPndfcF9kaWZmICYmIGN1cndpbi0+d19wX2RpZmYpCisJCXsKKwkJICAgIGRpZmZfc2V0X3RvcGxpbmUob2xkX2N1cndpbiwgY3Vyd2luKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgY3Vyd2luLT53X3NjYmluZF9wb3MgKz0gdG9wbGluZV9kaWZmOworCQkgICAgdG9wbGluZSA9IGN1cndpbi0+d19zY2JpbmRfcG9zOworCQkgICAgaWYgKHRvcGxpbmUgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJCXRvcGxpbmUgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkJICAgIGlmICh0b3BsaW5lIDwgMSkKKwkJCXRvcGxpbmUgPSAxOworCisJCSAgICB5ID0gdG9wbGluZSAtIGN1cndpbi0+d190b3BsaW5lOworCQkgICAgaWYgKHkgPiAwKQorCQkJc2Nyb2xsdXAoeSwgRkFMU0UpOworCQkgICAgZWxzZQorCQkJc2Nyb2xsZG93bigteSwgRkFMU0UpOworCQl9CisKKwkJcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkJY3Vyc29yX2NvcnJlY3QoKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJY3Vyd2luLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyNlbmRpZgorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogZG8gdGhlIGhvcml6b250YWwgc2Nyb2xsCisJICAgICAqLworCSAgICBpZiAod2FudF9ob3IgJiYgY3Vyd2luLT53X2xlZnRjb2wgIT0gdGd0X2xlZnRjb2wpCisJICAgIHsKKwkJY3Vyd2luLT53X2xlZnRjb2wgPSB0Z3RfbGVmdGNvbDsKKwkJbGVmdGNvbF9jaGFuZ2VkKCk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiByZXNldCBjdXJyZW50LXdpbmRvdworICAgICAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgVklzdWFsX3NlbGVjdCA9IG9sZF9WSXN1YWxfc2VsZWN0OworICAgIFZJc3VhbF9hY3RpdmUgPSBvbGRfVklzdWFsX2FjdGl2ZTsKKyNlbmRpZgorICAgIGN1cndpbiA9IG9sZF9jdXJ3aW47CisgICAgY3VyYnVmID0gb2xkX2N1cmJ1ZjsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRkVBVF9TQ1JPTExCSU5EICovCisKKy8qCisgKiBDb21tYW5kIGNoYXJhY3RlciB0aGF0J3MgaWdub3JlZC4KKyAqIFVzZWQgZm9yIENUUkwtUSBhbmQgQ1RSTC1TIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGVybWluYWxzIHRoYXQgdXNlCisgKiB4b24veG9mZgorICovCisvKkFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK252X2lnbm9yZShjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKK30KKworLyoKKyAqIENvbW1hbmQgY2hhcmFjdGVyIGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZXJyb3IoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworfQorCisvKgorICogPEhlbHA+IGFuZCA8RjE+IGNvbW1hbmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2hlbHAoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKCFjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKwlleF9oZWxwKE5VTEwpOworfQorCisvKgorICogQ1RSTC1BIGFuZCBDVFJMLVg6IEFkZCBvciBzdWJ0cmFjdCBmcm9tIGxldHRlciBvciBudW1iZXIgdW5kZXIgY3Vyc29yLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2FkZHN1YihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApCisJICAgICYmIGRvX2FkZHN1YigoaW50KWNhcC0+Y21kY2hhciwgY2FwLT5jb3VudDEpID09IE9LKQorCXByZXBfcmVkb19jbWQoY2FwKTsKK30KKworLyoKKyAqIENUUkwtRiwgQ1RSTC1CLCBldGM6IFNjcm9sbCBwYWdlIHVwIG9yIGRvd24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfcGFnZShjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoIWNoZWNrY2xlYXJvcChjYXAtPm9hcCkpCisJKHZvaWQpb25lcGFnZShjYXAtPmFyZywgY2FwLT5jb3VudDEpOworfQorCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgImdkIiBhbmQgImdEIiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2dkKG9hcCwgbmNoYXIpCisgICAgb3BhcmdfVCAgICpvYXA7CisgICAgaW50CSAgICBuY2hhcjsKK3sKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJKnBhdDsKKyAgICBwb3NfVAlvbGRfcG9zOworICAgIGludAkJdDsKKyAgICBpbnQJCXNhdmVfcF93czsKKyAgICBpbnQJCXNhdmVfcF9zY3M7CisgICAgY2hhcl91CSpwdHI7CisKKyAgICBpZiAoKGxlbiA9IGZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKCZwdHIsIEZJTkRfSURFTlQpKSA9PSAwIHx8CisJCQkJCSAgICAgICAocGF0ID0gYWxsb2MobGVuICsgNSkpID09IE5VTEwpCisgICAgeworCWNsZWFyb3BiZWVwKG9hcCk7CisJcmV0dXJuOworICAgIH0KKyAgICBzcHJpbnRmKChjaGFyICopcGF0LCB2aW1faXN3b3JkcChwdHIpID8gIlxcPCUuKnNcXD4iIDogIiUuKnMiLCBsZW4sIHB0cik7CisgICAgb2xkX3BvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgc2F2ZV9wX3dzID0gcF93czsKKyAgICBzYXZlX3Bfc2NzID0gcF9zY3M7CisgICAgcF93cyA9IEZBTFNFOwkvKiBkb24ndCB3cmFwIGFyb3VuZCBlbmQgb2YgZmlsZSBub3cgKi8KKyAgICBwX3NjcyA9IEZBTFNFOwkvKiBkb24ndCBzd2l0Y2ggaWdub3JlY2FzZSBvZmYgbm93ICovCisKKyAgICAvKgorICAgICAqIFdpdGggImdEIiBnbyB0byBsaW5lIDEuCisgICAgICogV2l0aCAiZ2QiIFNlYXJjaCBiYWNrIGZvciB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHRoZW4gZ28KKyAgICAgKiBiYWNrIHVudGlsIGEgYmxhbmsgbGluZS4gIElmIHRoaXMgZmFpbHMgZ28gdG8gbGluZSAxLgorICAgICAqLworICAgIGlmIChuY2hhciA9PSAnRCcgfHwgIWZpbmRwYXIob2FwLCBCQUNLV0FSRCwgMUwsICd7JywgRkFMU0UpKQorICAgIHsKKwlzZXRwY21hcmsoKTsJCQkvKiBTZXQgaW4gZmluZHBhcigpIG90aGVyd2lzZSAqLworCWN1cndpbi0+d19jdXJzb3IubG51bSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJd2hpbGUgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEgJiYgKnNraXB3aGl0ZShtbF9nZXRfY3VybGluZSgpKSAhPSBOVUwpCisJICAgIC0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIH0KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisKKyAgICAvKiBTZWFyY2ggZm9yd2FyZCBmb3IgdGhlIGlkZW50aWZpZXIsIGlnbm9yZSBjb21tZW50IGxpbmVzLiAqLworICAgIHdoaWxlICgodCA9IHNlYXJjaGl0KGN1cndpbiwgY3VyYnVmLCAmY3Vyd2luLT53X2N1cnNvciwgRk9SV0FSRCwgcGF0LCAxTCwgMCwKKwkJCQkJCQkgICAgIFJFX0xBU1QpKSAhPSBGQUlMCisjaWZkZWYgRkVBVF9DT01NRU5UUworCSAgICAmJiBnZXRfbGVhZGVyX2xlbihtbF9nZXRfY3VybGluZSgpLCBOVUxMLCBGQUxTRSkgPiAwCisjZW5kaWYKKwkgICAgJiYgb2xkX3Bvcy5sbnVtID4gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorICAgIHsKKwkvKiBJZ25vcmUgdGhpcyBsaW5lLCBjb250aW51ZSBhdCBzdGFydCBvZiBuZXh0IGxpbmUuICovCisJKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIH0KKyAgICBpZiAodCA9PSBGQUlMIHx8IG9sZF9wb3MubG51bSA8PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisgICAgeworCWNsZWFyb3BiZWVwKG9hcCk7CisJY3Vyd2luLT53X2N1cnNvciA9IG9sZF9wb3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJaWYgKChmZG9fZmxhZ3MgJiBGRE9fU0VBUkNIKSAmJiBLZXlUeXBlZCAmJiBvYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorCSAgICBmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisJLyogIm4iIHNlYXJjaGVzIGZvcndhcmQgbm93ICovCisJcmVzZXRfc2VhcmNoX2RpcigpOworICAgIH0KKworICAgIHZpbV9mcmVlKHBhdCk7CisgICAgcF93cyA9IHNhdmVfcF93czsKKyAgICBwX3NjcyA9IHNhdmVfcF9zY3M7Cit9CisKKy8qCisgKiBNb3ZlICdkaXN0JyBsaW5lcyBpbiBkaXJlY3Rpb24gJ2RpcicsIGNvdW50aW5nIGxpbmVzIGJ5ICpzY3JlZW4qCisgKiBsaW5lcyByYXRoZXIgdGhhbiBsaW5lcyBpbiB0aGUgZmlsZS4KKyAqICdkaXN0JyBtdXN0IGJlIHBvc2l0aXZlLgorICoKKyAqIFJldHVybiBPSyBpZiBhYmxlIHRvIG1vdmUgY3Vyc29yLCBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK252X3NjcmVlbmdvKG9hcCwgZGlyLCBkaXN0KQorICAgIG9wYXJnX1QJKm9hcDsKKyAgICBpbnQJCWRpcjsKKyAgICBsb25nCWRpc3Q7Cit7CisgICAgaW50CQlsaW5lbGVuID0gbGluZXRhYnNpemUobWxfZ2V0X2N1cmxpbmUoKSk7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKyAgICBpbnQJCWF0ZW5kID0gRkFMU0U7CisgICAgaW50CQluOworICAgIGludAkJY29sX29mZjE7CS8qIG1hcmdpbiBvZmZzZXQgZm9yIGZpcnN0IHNjcmVlbiBsaW5lICovCisgICAgaW50CQljb2xfb2ZmMjsJLyogbWFyZ2luIG9mZnNldCBmb3Igd3JhcHBlZCBzY3JlZW4gbGluZSAqLworICAgIGludAkJd2lkdGgxOwkJLyogdGV4dCB3aWR0aCBmb3IgZmlyc3Qgc2NyZWVuIGxpbmUgKi8KKyAgICBpbnQJCXdpZHRoMjsJCS8qIHRlc3Qgd2lkdGggZm9yIHdyYXBwZWQgc2NyZWVuIGxpbmUgKi8KKworICAgIG9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBvYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworCisgICAgY29sX29mZjEgPSBjdXJ3aW5fY29sX29mZigpOworICAgIGNvbF9vZmYyID0gY29sX29mZjEgLSBjdXJ3aW5fY29sX29mZjIoKTsKKyAgICB3aWR0aDEgPSBXX1dJRFRIKGN1cndpbikgLSBjb2xfb2ZmMTsKKyAgICB3aWR0aDIgPSBXX1dJRFRIKGN1cndpbikgLSBjb2xfb2ZmMjsKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGN1cndpbi0+d193aWR0aCAhPSAwKQorICAgIHsKKyNlbmRpZgorICAgICAgLyoKKyAgICAgICAqIEluc3RlYWQgb2Ygc3RpY2tpbmcgYXQgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBidWZmZXIgbGluZSB3ZQorICAgICAgICogdHJ5IHRvIHN0aWNrIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgc2NyZWVuLgorICAgICAgICovCisgICAgICBpZiAoY3Vyd2luLT53X2N1cnN3YW50ID09IE1BWENPTCkKKyAgICAgIHsKKwlhdGVuZCA9IFRSVUU7CisJdmFsaWRhdGVfdmlydGNvbCgpOworCWlmICh3aWR0aDEgPD0gMCkKKwkgICAgY3Vyd2luLT53X2N1cnN3YW50ID0gMDsKKwllbHNlCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc3dhbnQgPSB3aWR0aDEgLSAxOworCSAgICBpZiAoY3Vyd2luLT53X3ZpcnRjb2wgPiBjdXJ3aW4tPndfY3Vyc3dhbnQpCisJCWN1cndpbi0+d19jdXJzd2FudCArPSAoKGN1cndpbi0+d192aXJ0Y29sCisJCQkgICAgIC0gY3Vyd2luLT53X2N1cnN3YW50IC0gMSkgLyB3aWR0aDIgKyAxKSAqIHdpZHRoMjsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJaWYgKGxpbmVsZW4gPiB3aWR0aDEpCisJICAgIG4gPSAoKGxpbmVsZW4gLSB3aWR0aDEgLSAxKSAvIHdpZHRoMiArIDEpICogd2lkdGgyICsgd2lkdGgxOworCWVsc2UKKwkgICAgbiA9IHdpZHRoMTsKKwlpZiAoY3Vyd2luLT53X2N1cnN3YW50ID4gKGNvbG5yX1QpbiArIDEpCisJICAgIGN1cndpbi0+d19jdXJzd2FudCAtPSAoKGN1cndpbi0+d19jdXJzd2FudCAtIG4pIC8gd2lkdGgyICsgMSkKKwkJCQkJCQkJICAgICAqIHdpZHRoMjsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGRpc3QtLSkKKyAgICAgIHsKKwlpZiAoZGlyID09IEJBQ0tXQVJEKQorCXsKKwkgICAgaWYgKChsb25nKWN1cndpbi0+d19jdXJzd2FudCA+PSB3aWR0aDIpCisJCS8qIG1vdmUgYmFjayB3aXRoaW4gbGluZSAqLworCQljdXJ3aW4tPndfY3Vyc3dhbnQgLT0gd2lkdGgyOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogdG8gcHJldmlvdXMgbGluZSAqLworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID09IDEpCisJCXsKKwkJICAgIHJldHZhbCA9IEZBSUw7CisJCSAgICBicmVhazsKKwkJfQorCQktLWN1cndpbi0+d19jdXJzb3IubG51bTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJLyogTW92ZSB0byB0aGUgc3RhcnQgb2YgYSBjbG9zZWQgZm9sZC4gIERvbid0IGRvIHRoYXQgd2hlbgorCQkgKiAnZm9sZG9wZW4nIGNvbnRhaW5zICJhbGwiOiBpdCB3aWxsIG9wZW4gaW4gYSBtb21lbnQuICovCisJCWlmICghKGZkb19mbGFncyAmIEZET19BTEwpKQorCQkgICAgKHZvaWQpaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJCQkmY3Vyd2luLT53X2N1cnNvci5sbnVtLCBOVUxMKTsKKyNlbmRpZgorCQlsaW5lbGVuID0gbGluZXRhYnNpemUobWxfZ2V0X2N1cmxpbmUoKSk7CisJCWlmIChsaW5lbGVuID4gd2lkdGgxKQorCQkgICAgY3Vyd2luLT53X2N1cnN3YW50ICs9ICgoKGxpbmVsZW4gLSB3aWR0aDEgLSAxKSAvIHdpZHRoMikKKwkJCQkJCQkJKyAxKSAqIHdpZHRoMjsKKwkgICAgfQorCX0KKwllbHNlIC8qIGRpciA9PSBGT1JXQVJEICovCisJeworCSAgICBpZiAobGluZWxlbiA+IHdpZHRoMSkKKwkJbiA9ICgobGluZWxlbiAtIHdpZHRoMSAtIDEpIC8gd2lkdGgyICsgMSkgKiB3aWR0aDIgKyB3aWR0aDE7CisJICAgIGVsc2UKKwkJbiA9IHdpZHRoMTsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzd2FudCArIHdpZHRoMiA8IChjb2xucl9UKW4pCisJCS8qIG1vdmUgZm9yd2FyZCB3aXRoaW4gbGluZSAqLworCQljdXJ3aW4tPndfY3Vyc3dhbnQgKz0gd2lkdGgyOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogdG8gbmV4dCBsaW5lICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisJCS8qIE1vdmUgdG8gdGhlIGVuZCBvZiBhIGNsb3NlZCBmb2xkLiAqLworCQkodm9pZCloYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCwKKwkJCQkJCSAgICAgICZjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworI2VuZGlmCisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCXsKKwkJICAgIHJldHZhbCA9IEZBSUw7CisJCSAgICBicmVhazsKKwkJfQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0rKzsKKwkJY3Vyd2luLT53X2N1cnN3YW50ICU9IHdpZHRoMjsKKwkgICAgfQorCX0KKyAgICAgIH0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIH0KKyNlbmRpZgorCisgICAgY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworCisjaWYgZGVmaW5lZChGRUFUX0xJTkVCUkVBSykgfHwgZGVmaW5lZChGRUFUX01CWVRFKQorICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAgJiYgY3Vyd2luLT53X3Bfd3JhcCkKKyAgICB7CisJLyoKKwkgKiBDaGVjayBmb3IgbGFuZGluZyBvbiBhIGNoYXJhY3RlciB0aGF0IGdvdCBzcGxpdCBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIGxhc3QgbGluZS4gIFdlIHdhbnQgdG8gYWR2YW5jZSBhIHNjcmVlbmxpbmUsIG5vdCBlbmQgdXAgaW4gdGhlIHNhbWUKKwkgKiBzY3JlZW5saW5lIG9yIG1vdmUgdHdvIHNjcmVlbmxpbmVzLgorCSAqLworCXZhbGlkYXRlX3ZpcnRjb2woKTsKKwlpZiAoY3Vyd2luLT53X3ZpcnRjb2wgPiBjdXJ3aW4tPndfY3Vyc3dhbnQKKwkJJiYgKGN1cndpbi0+d19jdXJzd2FudCA8IChjb2xucl9UKXdpZHRoMQorCQkgICAgPyAoY3Vyd2luLT53X2N1cnN3YW50ID4gKGNvbG5yX1Qpd2lkdGgxIC8gMikKKwkJICAgIDogKChjdXJ3aW4tPndfY3Vyc3dhbnQgLSB3aWR0aDEpICUgd2lkdGgyCisJCQkJCQkgICAgICA+IChjb2xucl9UKXdpZHRoMiAvIDIpKSkKKwkgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChhdGVuZCkKKwljdXJ3aW4tPndfY3Vyc3dhbnQgPSBNQVhDT0w7CSAgICAvKiBzdGljayBpbiB0aGUgbGFzdCBjb2x1bW4gKi8KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBGRUFUX01PVVNFCisvKgorICogTW91c2Ugc2Nyb2xsIHdoZWVsOiBEZWZhdWx0IGFjdGlvbiBpcyB0byBzY3JvbGwgdGhyZWUgbGluZXMsIG9yIG9uZSBwYWdlCisgKiB3aGVuIFNoaWZ0IG9yIEN0cmwgaXMgdXNlZC4KKyAqIEtfTU9VU0VVUCAoY2FwLT5hcmcgPT0gVFJVRSkgb3IgS19NT1VTRURPV04gKGNhcC0+YXJnID09IEZBTFNFKQorICovCisgICAgc3RhdGljIHZvaWQKK252X21vdXNlc2Nyb2xsKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworIyBpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykKKyAgICB3aW5fVCAqb2xkX2N1cndpbjsKKworICAgIG9sZF9jdXJ3aW4gPSBjdXJ3aW47CisKKyAgICAvKiBDdXJyZW50bHkgd2Ugb25seSBnZXQgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGluIHRoZSBHVUkuICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgbW91c2Vfcm93ID49IDAgJiYgbW91c2VfY29sID49IDApCisgICAgeworCWludCByb3csIGNvbDsKKworCXJvdyA9IG1vdXNlX3JvdzsKKwljb2wgPSBtb3VzZV9jb2w7CisKKwkvKiBmaW5kIHRoZSB3aW5kb3cgYXQgdGhlIHBvaW50ZXIgY29vcmRpbmF0ZXMgKi8KKwljdXJ3aW4gPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKwljdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworICAgIH0KKyMgZW5kaWYKKworICAgIGlmIChtb2RfbWFzayAmIChNT0RfTUFTS19TSElGVCB8IE1PRF9NQVNLX0NUUkwpKQorICAgIHsKKwkodm9pZClvbmVwYWdlKGNhcC0+YXJnID8gRk9SV0FSRCA6IEJBQ0tXQVJELCAxTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJY2FwLT5jb3VudDEgPSAzOworCWNhcC0+Y291bnQwID0gMzsKKwludl9zY3JvbGxfbGluZShjYXApOworICAgIH0KKworIyBpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykKKyAgICBjdXJ3aW4tPndfcmVkcl9zdGF0dXMgPSBUUlVFOworCisgICAgY3Vyd2luID0gb2xkX2N1cndpbjsKKyAgICBjdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworIyBlbmRpZgorfQorCisvKgorICogTW91c2UgY2xpY2tzIGFuZCBkcmFncy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9tb3VzZShjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICAodm9pZClkb19tb3VzZShjYXAtPm9hcCwgY2FwLT5jbWRjaGFyLCBCQUNLV0FSRCwgY2FwLT5jb3VudDEsIDApOworfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgQ1RSTC1FIGFuZCBDVFJMLVkgY29tbWFuZHM6IHNjcm9sbCBhIGxpbmUgdXAgb3IgZG93bi4KKyAqIGNhcC0+YXJnIG11c3QgYmUgVFJVRSBmb3IgQ1RSTC1FLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3Njcm9sbF9saW5lKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKwlzY3JvbGxfcmVkcmF3KGNhcC0+YXJnLCBjYXAtPmNvdW50MSk7Cit9CisKKy8qCisgKiBTY3JvbGwgImNvdW50IiBsaW5lcyB1cCBvciBkb3duLCBhbmQgcmVkcmF3LgorICovCisgICAgdm9pZAorc2Nyb2xsX3JlZHJhdyh1cCwgY291bnQpCisgICAgaW50CQl1cDsKKyAgICBsb25nCWNvdW50OworeworICAgIGxpbmVucl9UCXByZXZfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOworI2lmZGVmIEZFQVRfRElGRgorICAgIGludAkJcHJldl90b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CisjZW5kaWYKKyAgICBsaW5lbnJfVAlwcmV2X2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisKKyAgICBpZiAodXApCisJc2Nyb2xsdXAoY291bnQsIFRSVUUpOworICAgIGVsc2UKKwlzY3JvbGxkb3duKGNvdW50LCBUUlVFKTsKKyAgICBpZiAocF9zbykKKyAgICB7CisJLyogQWRqdXN0IHRoZSBjdXJzb3IgcG9zaXRpb24gZm9yICdzY3JvbGxvZmYnLiAgTWFyayB3X3RvcGxpbmUgYXMKKwkgKiB2YWxpZCwgb3RoZXJ3aXNlIHRoZSBzY3JlZW4ganVtcHMgYmFjayBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAqLworCWN1cnNvcl9jb3JyZWN0KCk7CisJY2hlY2tfY3Vyc29yX21vdmVkKGN1cndpbik7CisJY3Vyd2luLT53X3ZhbGlkIHw9IFZBTElEX1RPUExJTkU7CisKKwkvKiBJZiBtb3ZlZCBiYWNrIHRvIHdoZXJlIHdlIHdlcmUsIGF0IGxlYXN0IG1vdmUgdGhlIGN1cnNvciwgb3RoZXJ3aXNlCisJICogd2UgZ2V0IHN0dWNrIGF0IG9uZSBwb3NpdGlvbi4gIERvbid0IG1vdmUgdGhlIGN1cnNvciB1cCBpZiB0aGUKKwkgKiBmaXJzdCBsaW5lIG9mIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBvbiB0aGUgc2NyZWVuICovCisJd2hpbGUgKGN1cndpbi0+d190b3BsaW5lID09IHByZXZfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkmJiBjdXJ3aW4tPndfdG9wZmlsbCA9PSBwcmV2X3RvcGZpbGwKKyNlbmRpZgorCQkpCisJeworCSAgICBpZiAodXApCisJICAgIHsKKwkJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IHByZXZfbG51bQorCQkJfHwgY3Vyc29yX2Rvd24oMUwsIEZBTFNFKSA9PSBGQUlMKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBwcmV2X2xudW0KKwkJCXx8IHByZXZfdG9wbGluZSA9PSAxTAorCQkJfHwgY3Vyc29yX3VwKDFMLCBGQUxTRSkgPT0gRkFJTCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIC8qIE1hcmsgd190b3BsaW5lIGFzIHZhbGlkLCBvdGhlcndpc2UgdGhlIHNjcmVlbiBqdW1wcyBiYWNrIGF0IHRoZQorCSAgICAgKiBlbmQgb2YgdGhlIGZpbGUuICovCisJICAgIGNoZWNrX2N1cnNvcl9tb3ZlZChjdXJ3aW4pOworCSAgICBjdXJ3aW4tPndfdmFsaWQgfD0gVkFMSURfVE9QTElORTsKKwl9CisgICAgfQorICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gcHJldl9sbnVtKQorCWNvbGFkdmFuY2UoY3Vyd2luLT53X2N1cnN3YW50KTsKKyAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworfQorCisvKgorICogQ29tbWFuZHMgdGhhdCBzdGFydCB3aXRoICJ6Ii4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl96ZXQoY2FwKQorICAgIGNtZGFyZ19UICAqY2FwOworeworICAgIGxvbmcJbjsKKyAgICBjb2xucl9UCWNvbDsKKyAgICBpbnQJCW5jaGFyID0gY2FwLT5uY2hhcjsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBsb25nCW9sZF9mZGwgPSBjdXJ3aW4tPndfcF9mZGw7CisgICAgaW50CQlvbGRfZmVuID0gY3Vyd2luLT53X3BfZmVuOworI2VuZGlmCisKKyAgICBpZiAoVklNX0lTRElHSVQobmNoYXIpKQorICAgIHsKKwkvKgorCSAqICJ6MTIze25jaGFyfSI6IGVkaXQgdGhlIGNvdW50IGJlZm9yZSBvYnRhaW5pbmcge25jaGFyfQorCSAqLworCWlmIChjaGVja2NsZWFyb3AoY2FwLT5vYXApKQorCSAgICByZXR1cm47CisJbiA9IG5jaGFyIC0gJzAnOworCWZvciAoOzspCisJeworI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisJICAgIGRvbnRfc2Nyb2xsID0gVFJVRTsJCS8qIGRpc2FsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKwkgICAgKytub19tYXBwaW5nOworCSAgICArK2FsbG93X2tleXM7ICAgLyogbm8gbWFwcGluZyBmb3IgbmNoYXIsIGJ1dCBhbGxvdyBrZXkgY29kZXMgKi8KKwkgICAgbmNoYXIgPSBzYWZlX3ZnZXRjKCk7CisjaWZkZWYgRkVBVF9MQU5HTUFQCisJICAgIExBTkdNQVBfQURKVVNUKG5jaGFyLCBUUlVFKTsKKyNlbmRpZgorCSAgICAtLW5vX21hcHBpbmc7CisJICAgIC0tYWxsb3dfa2V5czsKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCSAgICAodm9pZClhZGRfdG9fc2hvd2NtZChuY2hhcik7CisjZW5kaWYKKwkgICAgaWYgKG5jaGFyID09IEtfREVMIHx8IG5jaGFyID09IEtfS0RFTCkKKwkJbiAvPSAxMDsKKwkgICAgZWxzZSBpZiAoVklNX0lTRElHSVQobmNoYXIpKQorCQluID0gbiAqIDEwICsgKG5jaGFyIC0gJzAnKTsKKwkgICAgZWxzZSBpZiAobmNoYXIgPT0gQ0FSKQorCSAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fc2V0aGVpZ2h0KChpbnQpbik7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKG5jaGFyID09ICdsJworCQkgICAgfHwgbmNoYXIgPT0gJ2gnCisJCSAgICB8fCBuY2hhciA9PSBLX0xFRlQKKwkJICAgIHx8IG5jaGFyID09IEtfUklHSFQpCisJICAgIHsKKwkJY2FwLT5jb3VudDEgPSBuID8gbiAqIGNhcC0+Y291bnQxIDogY2FwLT5jb3VudDE7CisJCWdvdG8gZG96ZXQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJY2FwLT5vYXAtPm9wX3R5cGUgPSBPUF9OT1A7CisJcmV0dXJuOworICAgIH0KKworZG96ZXQ6CisgICAgaWYgKAorI2lmZGVmIEZFQVRfRk9MRElORworCSAgICAvKiAiemYiIGFuZCAiekYiIGFyZSBhbHdheXMgYW4gb3BlcmF0b3IsICJ6ZCIsICJ6byIsICJ6TyIsICJ6YyIKKwkgICAgICogYW5kICJ6QyIgb25seSBpbiBWaXN1YWwgbW9kZS4gICJ6aiIgYW5kICJ6ayIgYXJlIG1vdGlvbgorCSAgICAgKiBjb21tYW5kcy4gKi8KKwkgICAgY2FwLT5uY2hhciAhPSAnZicgJiYgY2FwLT5uY2hhciAhPSAnRicKKwkgICAgJiYgIShWSXN1YWxfYWN0aXZlICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJkY0NvTyIsIGNhcC0+bmNoYXIpKQorCSAgICAmJiBjYXAtPm5jaGFyICE9ICdqJyAmJiBjYXAtPm5jaGFyICE9ICdrJworCSAgICAmJgorI2VuZGlmCisJICAgIGNoZWNrY2xlYXJvcChjYXAtPm9hcCkpCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBGb3IgInorIiwgIno8Q1I+IiwgInp0IiwgInouIiwgInp6IiwgInpeIiwgInotIiwgInpiIjoKKyAgICAgKiBJZiBsaW5lIG51bWJlciBnaXZlbiwgc2V0IGN1cnNvci4KKyAgICAgKi8KKyAgICBpZiAoKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIrXHJcbnQuel4tYiIsIG5jaGFyKSAhPSBOVUxMKQorCSAgICAmJiBjYXAtPmNvdW50MAorCSAgICAmJiBjYXAtPmNvdW50MCAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisgICAgeworCXNldHBjbWFyaygpOworCWlmIChjYXAtPmNvdW50MCA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwllbHNlCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGNhcC0+Y291bnQwOworICAgIH0KKworICAgIHN3aXRjaCAobmNoYXIpCisgICAgeworCQkvKiAieisiLCAiejxDUj4iIGFuZCAienQiOiBwdXQgY3Vyc29yIGF0IHRvcCBvZiBzY3JlZW4gKi8KKyAgICBjYXNlICcrJzoKKwkJaWYgKGNhcC0+Y291bnQwID09IDApCisJCXsKKwkJICAgIC8qIE5vIGNvdW50IGdpdmVuOiBwdXQgY3Vyc29yIGF0IHRoZSBsaW5lIGJlbG93IHNjcmVlbiAqLworCQkgICAgdmFsaWRhdGVfYm90bGluZSgpOwkvKiBtYWtlIHN1cmUgd19ib3RsaW5lIGlzIHZhbGlkICovCisJCSAgICBpZiAoY3Vyd2luLT53X2JvdGxpbmUgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCQkgICAgZWxzZQorCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3Vyd2luLT53X2JvdGxpbmU7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIE5MOgorICAgIGNhc2UgQ0FSOgorICAgIGNhc2UgS19LRU5URVI6CisJCWJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisJCS8qIEZBTExUSFJPVUdIICovCisKKyAgICBjYXNlICd0JzoJc2Nyb2xsX2N1cnNvcl90b3AoMCwgVFJVRSk7CisJCXJlZHJhd19sYXRlcihWQUxJRCk7CisJCWJyZWFrOworCisJCS8qICJ6LiIgYW5kICJ6eiI6IHB1dCBjdXJzb3IgaW4gbWlkZGxlIG9mIHNjcmVlbiAqLworICAgIGNhc2UgJy4nOgliZWdpbmxpbmUoQkxfV0hJVEUgfCBCTF9GSVgpOworCQkvKiBGQUxMVEhST1VHSCAqLworCisgICAgY2FzZSAneic6CXNjcm9sbF9jdXJzb3JfaGFsZndheShUUlVFKTsKKwkJcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkJYnJlYWs7CisKKwkJLyogInpeIiwgInotIiBhbmQgInpiIjogcHV0IGN1cnNvciBhdCBib3R0b20gb2Ygc2NyZWVuICovCisgICAgY2FzZSAnXic6CS8qIFN0cmFuZ2UgVmkgYmVoYXZpb3I6IDxjb3VudD56XiBmaW5kcyBsaW5lIGF0IHRvcCBvZiB3aW5kb3cKKwkJICogd2hlbiA8Y291bnQ+IGlzIGF0IGJvdHRvbSBvZiB3aW5kb3csIGFuZCBwdXRzIHRoYXQgb25lIGF0CisJCSAqIGJvdHRvbSBvZiB3aW5kb3cuICovCisJCWlmIChjYXAtPmNvdW50MCAhPSAwKQorCQl7CisJCSAgICBzY3JvbGxfY3Vyc29yX2JvdCgwLCBUUlVFKTsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cndpbi0+d190b3BsaW5lOworCQl9CisJCWVsc2UgaWYgKGN1cndpbi0+d190b3BsaW5lID09IDEpCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAxOworCQllbHNlCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJ3aW4tPndfdG9wbGluZSAtIDE7CisJCS8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAnLSc6CisJCWJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisJCS8qIEZBTExUSFJPVUdIICovCisKKyAgICBjYXNlICdiJzoJc2Nyb2xsX2N1cnNvcl9ib3QoMCwgVFJVRSk7CisJCXJlZHJhd19sYXRlcihWQUxJRCk7CisJCWJyZWFrOworCisJCS8qICJ6SCIgLSBzY3JvbGwgc2NyZWVuIHJpZ2h0IGhhbGYtcGFnZSAqLworICAgIGNhc2UgJ0gnOgorCQljYXAtPmNvdW50MSAqPSBXX1dJRFRIKGN1cndpbikgLyAyOworCQkvKiBGQUxMVEhST1VHSCAqLworCisJCS8qICJ6aCIgLSBzY3JvbGwgc2NyZWVuIHRvIHRoZSByaWdodCAqLworICAgIGNhc2UgJ2gnOgorICAgIGNhc2UgS19MRUZUOgorCQlpZiAoIWN1cndpbi0+d19wX3dyYXApCisJCXsKKwkJICAgIGlmICgoY29sbnJfVCljYXAtPmNvdW50MSA+IGN1cndpbi0+d19sZWZ0Y29sKQorCQkJY3Vyd2luLT53X2xlZnRjb2wgPSAwOworCQkgICAgZWxzZQorCQkJY3Vyd2luLT53X2xlZnRjb2wgLT0gKGNvbG5yX1QpY2FwLT5jb3VudDE7CisJCSAgICBsZWZ0Y29sX2NoYW5nZWQoKTsKKwkJfQorCQlicmVhazsKKworCQkvKiAiekwiIC0gc2Nyb2xsIHNjcmVlbiBsZWZ0IGhhbGYtcGFnZSAqLworICAgIGNhc2UgJ0wnOgljYXAtPmNvdW50MSAqPSBXX1dJRFRIKGN1cndpbikgLyAyOworCQkvKiBGQUxMVEhST1VHSCAqLworCisJCS8qICJ6bCIgLSBzY3JvbGwgc2NyZWVuIHRvIHRoZSBsZWZ0ICovCisgICAgY2FzZSAnbCc6CisgICAgY2FzZSBLX1JJR0hUOgorCQlpZiAoIWN1cndpbi0+d19wX3dyYXApCisJCXsKKwkJICAgIC8qIHNjcm9sbCB0aGUgd2luZG93IGxlZnQgKi8KKwkJICAgIGN1cndpbi0+d19sZWZ0Y29sICs9IChjb2xucl9UKWNhcC0+Y291bnQxOworCQkgICAgbGVmdGNvbF9jaGFuZ2VkKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogInpzIiAtIHNjcm9sbCBzY3JlZW4sIGN1cnNvciBhdCB0aGUgc3RhcnQgKi8KKyAgICBjYXNlICdzJzoJaWYgKCFjdXJ3aW4tPndfcF93cmFwKQorCQl7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSAgICBpZiAoaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsIE5VTEwpKQorCQkJY29sID0gMDsJLyogbGlrZSB0aGUgY3Vyc29yIGlzIGluIGNvbCAwICovCisJCSAgICBlbHNlCisjZW5kaWYKKwkJICAgIGdldHZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgJmNvbCwgTlVMTCwgTlVMTCk7CisJCSAgICBpZiAoKGxvbmcpY29sID4gcF9zaXNvKQorCQkJY29sIC09IHBfc2lzbzsKKwkJICAgIGVsc2UKKwkJCWNvbCA9IDA7CisJCSAgICBpZiAoY3Vyd2luLT53X2xlZnRjb2wgIT0gY29sKQorCQkgICAgeworCQkJY3Vyd2luLT53X2xlZnRjb2wgPSBjb2w7CisJCQlyZWRyYXdfbGF0ZXIoTk9UX1ZBTElEKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKworCQkvKiAiemUiIC0gc2Nyb2xsIHNjcmVlbiwgY3Vyc29yIGF0IHRoZSBlbmQgKi8KKyAgICBjYXNlICdlJzoJaWYgKCFjdXJ3aW4tPndfcF93cmFwKQorCQl7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSAgICBpZiAoaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsIE5VTEwpKQorCQkJY29sID0gMDsJLyogbGlrZSB0aGUgY3Vyc29yIGlzIGluIGNvbCAwICovCisJCSAgICBlbHNlCisjZW5kaWYKKwkJICAgIGdldHZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgTlVMTCwgTlVMTCwgJmNvbCk7CisJCSAgICBuID0gV19XSURUSChjdXJ3aW4pIC0gY3Vyd2luX2NvbF9vZmYoKTsKKwkJICAgIGlmICgobG9uZyljb2wgKyBwX3Npc28gPCBuKQorCQkJY29sID0gMDsKKwkJICAgIGVsc2UKKwkJCWNvbCA9IGNvbCArIHBfc2lzbyAtIG4gKyAxOworCQkgICAgaWYgKGN1cndpbi0+d19sZWZ0Y29sICE9IGNvbCkKKwkJICAgIHsKKwkJCWN1cndpbi0+d19sZWZ0Y29sID0gY29sOworCQkJcmVkcmF3X2xhdGVyKE5PVF9WQUxJRCk7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJLyogInpGIjogY3JlYXRlIGZvbGQgY29tbWFuZCAqLworCQkvKiAiemYiOiBjcmVhdGUgZm9sZCBvcGVyYXRvciAqLworICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ2YnOiAgIGlmIChmb2xkTWFudWFsQWxsb3dlZChUUlVFKSkKKwkJeworCQkgICAgY2FwLT5uY2hhciA9ICdmJzsKKwkJICAgIG52X29wZXJhdG9yKGNhcCk7CisJCSAgICBjdXJ3aW4tPndfcF9mZW4gPSBUUlVFOworCisJCSAgICAvKiAiekYiIGlzIGxpa2UgInpmemYiICovCisJCSAgICBpZiAobmNoYXIgPT0gJ0YnICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX0ZPTEQpCisJCSAgICB7CisJCQludl9vcGVyYXRvcihjYXApOworCQkJZmluaXNoX29wID0gVFJVRTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJCWJyZWFrOworCisJCS8qICJ6ZCI6IGRlbGV0ZSBmb2xkIGF0IGN1cnNvciAqLworCQkvKiAiekQiOiBkZWxldGUgZm9sZCBhdCBjdXJzb3IgcmVjdXJzaXZlbHkgKi8KKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoJaWYgKGZvbGRNYW51YWxBbGxvd2VkKEZBTFNFKSkKKwkJeworCQkgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJCQludl9vcGVyYXRvcihjYXApOworCQkgICAgZWxzZQorCQkJZGVsZXRlRm9sZChjdXJ3aW4tPndfY3Vyc29yLmxudW0sCisJCQkJICBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG5jaGFyID09ICdEJywgRkFMU0UpOworCQl9CisJCWJyZWFrOworCisJCS8qICJ6RSI6IGVyZWFzZSBhbGwgZm9sZHMgKi8KKyAgICBjYXNlICdFJzoJaWYgKGZvbGRtZXRob2RJc01hbnVhbChjdXJ3aW4pKQorCQl7CisJCSAgICBjbGVhckZvbGRpbmcoY3Vyd2luKTsKKwkJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKwkJfQorCQllbHNlIGlmIChmb2xkbWV0aG9kSXNNYXJrZXIoY3Vyd2luKSkKKwkJICAgIGRlbGV0ZUZvbGQoKGxpbmVucl9UKTEsIGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LAorCQkJCQkJCQkgVFJVRSwgRkFMU0UpOworCQllbHNlCisJCSAgICBFTVNHKF8oIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIikpOworCQlicmVhazsKKworCQkvKiAiem4iOiBmb2xkIG5vbmU6IHJlc2V0ICdmb2xkZW5hYmxlJyAqLworICAgIGNhc2UgJ24nOgljdXJ3aW4tPndfcF9mZW4gPSBGQUxTRTsKKwkJYnJlYWs7CisKKwkJLyogInpOIjogZm9sZCBOb3JtYWw6IHNldCAnZm9sZGVuYWJsZScgKi8KKyAgICBjYXNlICdOJzoJY3Vyd2luLT53X3BfZmVuID0gVFJVRTsKKwkJYnJlYWs7CisKKwkJLyogInppIjogaW52ZXJ0IGZvbGRpbmc6IHRvZ2dsZSAnZm9sZGVuYWJsZScgKi8KKyAgICBjYXNlICdpJzoJY3Vyd2luLT53X3BfZmVuID0gIWN1cndpbi0+d19wX2ZlbjsKKwkJYnJlYWs7CisKKwkJLyogInphIjogb3BlbiBjbG9zZWQgZm9sZCBvciBjbG9zZSBvcGVuIGZvbGQgYXQgY3Vyc29yICovCisgICAgY2FzZSAnYSc6CWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCwgTlVMTCkpCisJCSAgICBvcGVuRm9sZChjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGNhcC0+Y291bnQxKTsKKwkJZWxzZQorCQl7CisJCSAgICBjbG9zZUZvbGQoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjYXAtPmNvdW50MSk7CisJCSAgICBjdXJ3aW4tPndfcF9mZW4gPSBUUlVFOworCQl9CisJCWJyZWFrOworCisJCS8qICJ6QSI6IG9wZW4gZm9sZCBhdCBjdXJzb3IgcmVjdXJzaXZlbHkgKi8KKyAgICBjYXNlICdBJzoJaWYgKGhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBOVUxMLCBOVUxMKSkKKwkJICAgIG9wZW5Gb2xkUmVjdXJzZShjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCQllbHNlCisJCXsKKwkJICAgIGNsb3NlRm9sZFJlY3Vyc2UoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkJICAgIGN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogInpvIjogb3BlbiBmb2xkIGF0IGN1cnNvciBvciBWaXN1YWwgYXJlYSAqLworICAgIGNhc2UgJ28nOglpZiAoVklzdWFsX2FjdGl2ZSkKKwkJICAgIG52X29wZXJhdG9yKGNhcCk7CisJCWVsc2UKKwkJICAgIG9wZW5Gb2xkKGN1cndpbi0+d19jdXJzb3IubG51bSwgY2FwLT5jb3VudDEpOworCQlicmVhazsKKworCQkvKiAiek8iOiBvcGVuIGZvbGQgcmVjdXJzaXZlbHkgKi8KKyAgICBjYXNlICdPJzoJaWYgKFZJc3VhbF9hY3RpdmUpCisJCSAgICBudl9vcGVyYXRvcihjYXApOworCQllbHNlCisJCSAgICBvcGVuRm9sZFJlY3Vyc2UoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkJYnJlYWs7CisKKwkJLyogInpjIjogY2xvc2UgZm9sZCBhdCBjdXJzb3Igb3IgVmlzdWFsIGFyZWEgKi8KKyAgICBjYXNlICdjJzoJaWYgKFZJc3VhbF9hY3RpdmUpCisJCSAgICBudl9vcGVyYXRvcihjYXApOworCQllbHNlCisJCSAgICBjbG9zZUZvbGQoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjYXAtPmNvdW50MSk7CisJCWN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCWJyZWFrOworCisJCS8qICJ6QyI6IGNsb3NlIGZvbGQgcmVjdXJzaXZlbHkgKi8KKyAgICBjYXNlICdDJzoJaWYgKFZJc3VhbF9hY3RpdmUpCisJCSAgICBudl9vcGVyYXRvcihjYXApOworCQllbHNlCisJCSAgICBjbG9zZUZvbGRSZWN1cnNlKGN1cndpbi0+d19jdXJzb3IubG51bSk7CisJCWN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCWJyZWFrOworCisJCS8qICJ6diI6IG9wZW4gZm9sZHMgYXQgdGhlIGN1cnNvciAqLworICAgIGNhc2UgJ3YnOglmb2xkT3BlbkN1cnNvcigpOworCQlicmVhazsKKworCQkvKiAiengiOiByZS1hcHBseSAnZm9sZGxldmVsJyBhbmQgb3BlbiBmb2xkcyBhdCB0aGUgY3Vyc29yICovCisgICAgY2FzZSAneCc6CWN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCW5ld0ZvbGRMZXZlbCgpOwkJLyogdXBkYXRlIHJpZ2h0IG5vdyAqLworCQlmb2xkT3BlbkN1cnNvcigpOworCQlicmVhazsKKworCQkvKiAielgiOiB1bmRvIG1hbnVhbCBvcGVucy9jbG9zZXMsIHJlLWFwcGx5ICdmb2xkbGV2ZWwnICovCisgICAgY2FzZSAnWCc6CWN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCW9sZF9mZGwgPSAtMTsJCS8qIGZvcmNlIGFuIHVwZGF0ZSAqLworCQlicmVhazsKKworCQkvKiAiem0iOiBmb2xkIG1vcmUgKi8KKyAgICBjYXNlICdtJzoJaWYgKGN1cndpbi0+d19wX2ZkbCA+IDApCisJCSAgICAtLWN1cndpbi0+d19wX2ZkbDsKKwkJb2xkX2ZkbCA9IC0xOwkJLyogZm9yY2UgYW4gdXBkYXRlICovCisJCWN1cndpbi0+d19wX2ZlbiA9IFRSVUU7CisJCWJyZWFrOworCisJCS8qICJ6TSI6IGNsb3NlIGFsbCBmb2xkcyAqLworICAgIGNhc2UgJ00nOgljdXJ3aW4tPndfcF9mZGwgPSAwOworCQlvbGRfZmRsID0gLTE7CQkvKiBmb3JjZSBhbiB1cGRhdGUgKi8KKwkJY3Vyd2luLT53X3BfZmVuID0gVFJVRTsKKwkJYnJlYWs7CisKKwkJLyogInpyIjogcmVkdWNlIGZvbGRpbmcgKi8KKyAgICBjYXNlICdyJzoJKytjdXJ3aW4tPndfcF9mZGw7CisJCWJyZWFrOworCisJCS8qICJ6UiI6IG9wZW4gYWxsIGZvbGRzICovCisgICAgY2FzZSAnUic6CWN1cndpbi0+d19wX2ZkbCA9IGdldERlZXBlc3ROZXN0aW5nKCk7CisJCW9sZF9mZGwgPSAtMTsJCS8qIGZvcmNlIGFuIHVwZGF0ZSAqLworCQlicmVhazsKKworICAgIGNhc2UgJ2onOgkvKiAiemoiIG1vdmUgdG8gbmV4dCBmb2xkIGRvd253YXJkcyAqLworICAgIGNhc2UgJ2snOgkvKiAiemsiIG1vdmUgdG8gbmV4dCBmb2xkIHVwd2FyZHMgKi8KKwkJaWYgKGZvbGRNb3ZlVG8oVFJVRSwgbmNoYXIgPT0gJ2onID8gRk9SV0FSRCA6IEJBQ0tXQVJELAorCQkJCQkJCSAgY2FwLT5jb3VudDEpID09IEZBSUwpCisJCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJCWJyZWFrOworCisjZW5kaWYgLyogRkVBVF9GT0xESU5HICovCisKKyAgICBkZWZhdWx0OgljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgfQorCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyogUmVkcmF3IHdoZW4gJ2ZvbGRlbmFibGUnIGNoYW5nZWQgKi8KKyAgICBpZiAob2xkX2ZlbiAhPSBjdXJ3aW4tPndfcF9mZW4pCisgICAgeworIyBpZmRlZiBGRUFUX0RJRkYKKwl3aW5fVAkgICAgKndwOworCisJaWYgKGZvbGRtZXRob2RJc0RpZmYoY3Vyd2luKSAmJiBjdXJ3aW4tPndfcF9zY2IpCisJeworCSAgICAvKiBBZGp1c3QgJ2ZvbGRlbmFibGUnIGluIGRpZmYtc3luY2VkIHdpbmRvd3MuICovCisJICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKwkgICAgeworCQlpZiAod3AgIT0gY3Vyd2luICYmIGZvbGRtZXRob2RJc0RpZmYod3ApICYmIHdwLT53X3Bfc2NiKQorCQl7CisJCSAgICB3cC0+d19wX2ZlbiA9IGN1cndpbi0+d19wX2ZlbjsKKwkJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmdfd2luKHdwKTsKKwkJfQorCSAgICB9CisJfQorIyBlbmRpZgorCWNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKyAgICB9CisKKyAgICAvKiBSZWRyYXcgd2hlbiAnZm9sZGxldmVsJyBjaGFuZ2VkLiAqLworICAgIGlmIChvbGRfZmRsICE9IGN1cndpbi0+d19wX2ZkbCkKKwluZXdGb2xkTGV2ZWwoKTsKKyNlbmRpZgorfQorCisjaWZkZWYgRkVBVF9HVUkKKy8qCisgKiBWZXJ0aWNhbCBzY3JvbGxiYXIgbW92ZW1lbnQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfdmVyX3Njcm9sbGJhcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKworICAgIC8qIEV2ZW4gaWYgYW4gb3BlcmF0b3Igd2FzIHBlbmRpbmcsIHdlIHN0aWxsIHdhbnQgdG8gc2Nyb2xsICovCisgICAgZ3VpX2RvX3Njcm9sbCgpOworfQorCisvKgorICogSG9yaXpvbnRhbCBzY3JvbGxiYXIgbW92ZW1lbnQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfaG9yX3Njcm9sbGJhcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKworICAgIC8qIEV2ZW4gaWYgYW4gb3BlcmF0b3Igd2FzIHBlbmRpbmcsIHdlIHN0aWxsIHdhbnQgdG8gc2Nyb2xsICovCisgICAgZ3VpX2RvX2hvcml6X3Njcm9sbCgpOworfQorI2VuZGlmCisKKy8qCisgKiAiUSIgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9leG1vZGUoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgLyoKKyAgICAgKiBJZ25vcmUgJ1EnIGluIFZpc3VhbCBtb2RlLCBqdXN0IGdpdmUgYSBiZWVwLgorICAgICAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJdmltX2JlZXAoKTsKKyAgICBlbHNlCisjZW5kaWYKKwlpZiAoIWNoZWNrY2xlYXJvcChjYXAtPm9hcCkpCisJZG9fZXhtb2RlKEZBTFNFKTsKK30KKworLyoKKyAqIEhhbmRsZSBhICI6IiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2NvbG9uKGNhcCkKKyAgICBjbWRhcmdfVCAgKmNhcDsKK3sKKyAgICBpbnQJICAgIG9sZF9wX2ltOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSkKKwludl9vcGVyYXRvcihjYXApOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlpZiAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorCXsKKwkgICAgLyogVXNpbmcgIjoiIGFzIGEgbW92ZW1lbnQgaXMgY2hhcmFjdGVyd2lzZSBleGNsdXNpdmUuICovCisJICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IE1DSEFSOworCSAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisJfQorCWVsc2UgaWYgKGNhcC0+Y291bnQwKQorCXsKKwkgICAgLyogdHJhbnNsYXRlICJjb3VudDoiIGludG8gIjouLC4rKGNvdW50IC0gMSkiICovCisJICAgIHN0dWZmY2hhclJlYWRidWZmKCcuJyk7CisJICAgIGlmIChjYXAtPmNvdW50MCA+IDEpCisJICAgIHsKKwkJc3R1ZmZSZWFkYnVmZigoY2hhcl91ICopIiwuKyIpOworCQlzdHVmZm51bVJlYWRidWZmKChsb25nKWNhcC0+Y291bnQwIC0gMUwpOworCSAgICB9CisJfQorCisJLyogV2hlbiB0eXBpbmcsIGRvbid0IHR5cGUgYmVsb3cgYW4gb2xkIG1lc3NhZ2UgKi8KKwlpZiAoS2V5VHlwZWQpCisJICAgIGNvbXB1dGVfY21kcm93KCk7CisKKwlvbGRfcF9pbSA9IHBfaW07CisKKwkvKiBnZXQgYSBjb21tYW5kIGxpbmUgYW5kIGV4ZWN1dGUgaXQgKi8KKwlkb19jbWRsaW5lKE5VTEwsIGdldGV4bGluZSwgTlVMTCwKKwkJCSAgICBjYXAtPm9hcC0+b3BfdHlwZSAhPSBPUF9OT1AgPyBET0NNRF9LRUVQTElORSA6IDApOworCisJLyogSWYgJ2luc2VydG1vZGUnIGNoYW5nZWQsIGVudGVyIG9yIGV4aXQgSW5zZXJ0IG1vZGUgKi8KKwlpZiAocF9pbSAhPSBvbGRfcF9pbSkKKwl7CisJICAgIGlmIChwX2ltKQorCQlyZXN0YXJ0X2VkaXQgPSAnaSc7CisJICAgIGVsc2UKKwkJcmVzdGFydF9lZGl0ID0gMDsKKwl9CisKKwkvKiBUaGUgc3RhcnQgb2YgdGhlIG9wZXJhdG9yIG1heSBoYXZlIGJlY29tZSBpbnZhbGlkIGJ5IHRoZSBFeAorCSAqIGNvbW1hbmQuICovCisJaWYgKGNhcC0+b2FwLT5vcF90eXBlICE9IE9QX05PUAorCQkmJiAoY2FwLT5vYXAtPnN0YXJ0LmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCQkgICAgfHwgY2FwLT5vYXAtPnN0YXJ0LmNvbCA+CisJCQkJCSBTVFJMRU4obWxfZ2V0KGNhcC0+b2FwLT5zdGFydC5sbnVtKSkpKQorCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgfQorfQorCisvKgorICogSGFuZGxlIENUUkwtRyBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2N0cmxnKGNhcCkKKyAgICBjbWRhcmdfVCAqY2FwOworeworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCS8qIHRvZ2dsZSBTZWxlY3Rpb24vVmlzdWFsIG1vZGUgKi8KKyAgICB7CisJVklzdWFsX3NlbGVjdCA9ICFWSXN1YWxfc2VsZWN0OworCXNob3dtb2RlKCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKwkvKiBwcmludCBmdWxsIG5hbWUgaWYgY291bnQgZ2l2ZW4gb3IgOmNkIHVzZWQgKi8KKwlmaWxlaW5mbygoaW50KWNhcC0+Y291bnQwLCBGQUxTRSwgVFJVRSk7Cit9CisKKy8qCisgKiBIYW5kbGUgQ1RSTC1IIDxCYWNrc3BhY2U+IGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfY3RybGgoY2FwKQorICAgIGNtZGFyZ19UICpjYXA7Cit7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSAmJiBWSXN1YWxfc2VsZWN0KQorICAgIHsKKwljYXAtPmNtZGNoYXIgPSAneCc7CS8qIEJTIGtleSBiZWhhdmVzIGxpa2UgJ3gnIGluIFNlbGVjdCBtb2RlICovCisJdl92aXNvcChjYXApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwludl9sZWZ0KGNhcCk7Cit9CisKKy8qCisgKiBDVFJMLUw6IGNsZWFyIHNjcmVlbiBhbmQgcmVkcmF3LgorICovCisgICAgc3RhdGljIHZvaWQKK252X2NsZWFyKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKyAgICB7CisjaWYgZGVmaW5lZChfX0JFT1NfXykgJiYgIVVTRV9USFJFQURfRk9SX0lOUFVUX1dJVEhfVElNRU9VVAorCS8qCisJICogUmlnaHQgbm93LCB0aGUgQmVCb3ggZG9lc24ndCBzZWVtIHRvIGhhdmUgYW4gZWFzeSB3YXkgdG8gZGV0ZWN0CisJICogd2luZG93IHJlc2l6aW5nLCBzbyB3ZSBjaGVhdCBhbmQgbWFrZSB0aGUgdXNlciBkZXRlY3QgaXQKKwkgKiBtYW51YWxseSB3aXRoIENUUkwtTCBpbnN0ZWFkCisJICovCisJdWlfZ2V0X3NoZWxsc2l6ZSgpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TWU5fSEwKKwkvKiBDbGVhciBhbGwgc3ludGF4IHN0YXRlcyB0byBmb3JjZSByZXN5bmNpbmcuICovCisJc3luX3N0YWNrX2ZyZWVfYWxsKGN1cmJ1Zik7CisjZW5kaWYKKwlyZWRyYXdfbGF0ZXIoQ0xFQVIpOworICAgIH0KK30KKworLyoKKyAqIENUUkwtTzogSW4gU2VsZWN0IG1vZGU6IHN3aXRjaCB0byBWaXN1YWwgbW9kZSBmb3Igb25lIGNvbW1hbmQuCisgKiBPdGhlcndpc2U6IEdvIHRvIG9sZGVyIHBjbWFyay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9jdHJsbyhjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlICYmIFZJc3VhbF9zZWxlY3QpCisgICAgeworCVZJc3VhbF9zZWxlY3QgPSBGQUxTRTsKKwlzaG93bW9kZSgpOworCXJlc3RhcnRfVklzdWFsX3NlbGVjdCA9IDI7CS8qIHJlc3RhcnQgU2VsZWN0IG1vZGUgbGF0ZXIgKi8KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWNhcC0+Y291bnQxID0gLWNhcC0+Y291bnQxOworCW52X3BjbWFyayhjYXApOworICAgIH0KK30KKworLyoKKyAqIENUUkwtXiBjb21tYW5kLCBzaG9ydCBmb3IgIjplICMiCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfaGF0KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wcShjYXAtPm9hcCkpCisJKHZvaWQpYnVmbGlzdF9nZXRmaWxlKChpbnQpY2FwLT5jb3VudDAsIChsaW5lbnJfVCkwLAorCQkJCQkJR0VURl9TRVRNQVJLfEdFVEZfQUxULCBGQUxTRSk7Cit9CisKKy8qCisgKiAiWiIgY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfWmV0KGNhcCkKKyAgICBjbWRhcmdfVCAqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wcShjYXAtPm9hcCkpCisgICAgeworCXN3aXRjaCAoY2FwLT5uY2hhcikKKwl7CisJCQkvKiAiWloiOiBlcXVpdmFsZW50IHRvICI6eCIuICovCisJICAgIGNhc2UgJ1onOglkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopIngiKTsKKwkJCWJyZWFrOworCisJCQkvKiAiWlEiOiBlcXVpdmFsZW50IHRvICI6cSEiIChFbHZpcyBjb21wYXRpYmxlKS4gKi8KKwkgICAgY2FzZSAnUSc6CWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikicSEiKTsKKwkJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwl9CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2FsbCBudl9pZGVudCgpIGFzIGlmICJjMSIgd2FzIHVzZWQsIHdpdGggImMyIiBhcyBuZXh0IGNoYXJhY3Rlci4KKyAqLworICAgIHZvaWQKK2RvX252X2lkZW50KGMxLCBjMikKKyAgICBpbnQJCWMxOworICAgIGludAkJYzI7Cit7CisgICAgb3BhcmdfVAlvYTsKKyAgICBjbWRhcmdfVAljYTsKKworICAgIGNsZWFyX29wYXJnKCZvYSk7CisgICAgdmltX21lbXNldCgmY2EsIDAsIHNpemVvZihjYSkpOworICAgIGNhLm9hcCA9ICZvYTsKKyAgICBjYS5jbWRjaGFyID0gYzE7CisgICAgY2EubmNoYXIgPSBjMjsKKyAgICBudl9pZGVudCgmY2EpOworfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgdGhlIGNvbW1hbmRzIHRoYXQgdXNlIHRoZSB3b3JkIHVuZGVyIHRoZSBjdXJzb3IuCisgKiBbZ10gQ1RSTC1dCTp0YSB0byBjdXJyZW50IGlkZW50aWZpZXIKKyAqIFtnXSAnSycJcnVuIHByb2dyYW0gZm9yIGN1cnJlbnQgaWRlbnRpZmllcgorICogW2ddICcqJwkvIHRvIGN1cnJlbnQgaWRlbnRpZmllciBvciBzdHJpbmcKKyAqIFtnXSAnIycJPyB0byBjdXJyZW50IGlkZW50aWZpZXIgb3Igc3RyaW5nCisgKiAgZyAgJ10nCTp0c2VsZWN0IGZvciBjdXJyZW50IGlkZW50aWZpZXIKKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9pZGVudChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjaGFyX3UJKnB0ciA9IE5VTEw7CisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqa3A7CQkvKiB2YWx1ZSBvZiAna2V5d29yZHByZycgKi8KKyAgICBpbnQJCWtwX2hlbHA7CS8qICdrZXl3b3JkcHJnJyBpcyAiOmhlbHAiICovCisgICAgaW50CQluID0gMDsJCS8qIGluaXQgZm9yIEdDQyAqLworICAgIGludAkJY21kY2hhcjsKKyAgICBpbnQJCWdfY21kOwkJLyogImciIGNvbW1hbmQgKi8KKyAgICBjaGFyX3UJKmF1eF9wdHI7CisgICAgaW50CQlpc21hbjsKKyAgICBpbnQJCWlzbWFuX3M7CisKKyAgICBpZiAoY2FwLT5jbWRjaGFyID09ICdnJykJLyogImcqIiwgImcjIiwgImddIiBhbmQgImdDVFJMLV0iICovCisgICAgeworCWNtZGNoYXIgPSBjYXAtPm5jaGFyOworCWdfY21kID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljbWRjaGFyID0gY2FwLT5jbWRjaGFyOworCWdfY21kID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGNtZGNoYXIgPT0gUE9VTkQpCS8qIHRoZSBwb3VuZCBzaWduLCAnIycgZm9yIEVuZ2xpc2gga2V5Ym9hcmRzICovCisJY21kY2hhciA9ICcjJzsKKworICAgIC8qCisgICAgICogVGhlICJdIiwgIkNUUkwtXSIgYW5kICJLIiBjb21tYW5kcyBhY2NlcHQgYW4gYXJndW1lbnQgaW4gVmlzdWFsIG1vZGUuCisgICAgICovCisgICAgaWYgKGNtZGNoYXIgPT0gJ10nIHx8IGNtZGNoYXIgPT0gQ3RybF9SU0IgfHwgY21kY2hhciA9PSAnSycpCisgICAgeworI2lmZGVmIEZFQVRfVklTVUFMCisJaWYgKFZJc3VhbF9hY3RpdmUgJiYgZ2V0X3Zpc3VhbF90ZXh0KGNhcCwgJnB0ciwgJm4pID09IEZBSUwpCisJICAgIHJldHVybjsKKyNlbmRpZgorCWlmIChjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwdHIgPT0gTlVMTCAmJiAobiA9IGZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKCZwdHIsCisJCSAgICAoY21kY2hhciA9PSAnKicgfHwgY21kY2hhciA9PSAnIycpCisJCQkJID8gRklORF9JREVOVHxGSU5EX1NUUklORyA6IEZJTkRfSURFTlQpKSA9PSAwKQorICAgIHsKKwljbGVhcm9wKGNhcC0+b2FwKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYnVmZmVyIHRvIHB1dCB0aGUgY29tbWFuZCBpbi4gIEluc2VydGluZyBiYWNrc2xhc2hlcyBjYW4KKyAgICAgKiBkb3VibGUgdGhlIGxlbmd0aCBvZiB0aGUgd29yZC4gIHBfa3AgLyBjdXJidWYtPmJfcF9rcCBjb3VsZCBiZSBhZGRlZAorICAgICAqIGFuZCBzb21lIG51bWJlcnMuICovCisgICAga3AgPSAoKmN1cmJ1Zi0+Yl9wX2twID09IE5VTCA/IHBfa3AgOiBjdXJidWYtPmJfcF9rcCk7CisgICAga3BfaGVscCA9ICgqa3AgPT0gTlVMIHx8IFNUUkNNUChrcCwgIjpoZSIpID09IDAKKwkJCQkJCSB8fCBTVFJDTVAoa3AsICI6aGVscCIpID09IDApOworICAgIGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZCkobiAqIDIgKyAzMCArIFNUUkxFTihrcCkpKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuOworICAgIGJ1ZlswXSA9IE5VTDsKKworICAgIHN3aXRjaCAoY21kY2hhcikKKyAgICB7CisJY2FzZSAnKic6CisJY2FzZSAnIyc6CisJICAgIC8qCisJICAgICAqIFB1dCBjdXJzb3IgYXQgc3RhcnQgb2Ygd29yZCwgbWFrZXMgc2VhcmNoIHNraXAgdGhlIHdvcmQKKwkgICAgICogdW5kZXIgdGhlIGN1cnNvci4KKwkgICAgICogQ2FsbCBzZXRwY21hcmsoKSBmaXJzdCwgc28gIipgYCIgcHV0cyB0aGUgY3Vyc29yIGJhY2sgd2hlcmUKKwkgICAgICogaXQgd2FzLgorCSAgICAgKi8KKwkgICAgc2V0cGNtYXJrKCk7CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gKGNvbG5yX1QpIChwdHIgLSBtbF9nZXRfY3VybGluZSgpKTsKKworCSAgICBpZiAoIWdfY21kICYmIHZpbV9pc3dvcmRwKHB0cikpCisJCVNUUkNQWShidWYsICJcXDwiKTsKKwkgICAgbm9fc21hcnRjYXNlID0gVFJVRTsJLyogZG9uJ3QgdXNlICdzbWFydGNhc2UnIG5vdyAqLworCSAgICBicmVhazsKKworCWNhc2UgJ0snOgorCSAgICBpZiAoa3BfaGVscCkKKwkJU1RSQ1BZKGJ1ZiwgImhlISAiKTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIFdoZW4gYSBjb3VudCBpcyBnaXZlbiwgdHVybiBpdCBpbnRvIGEgcmFuZ2UuICBJcyB0aGlzCisJCSAqIHJlYWxseSB3aGF0IHdlIHdhbnQ/ICovCisJCWlzbWFuID0gKFNUUkNNUChrcCwgIm1hbiIpID09IDApOworCQlpc21hbl9zID0gKFNUUkNNUChrcCwgIm1hbiAtcyIpID09IDApOworCQlpZiAoY2FwLT5jb3VudDAgIT0gMCAmJiAhKGlzbWFuIHx8IGlzbWFuX3MpKQorCQkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIi4sLislbGQiLCBjYXAtPmNvdW50MCAtIDEpOworCisJCVNUUkNBVChidWYsICIhICIpOworCQlpZiAoY2FwLT5jb3VudDAgPT0gMCAmJiBpc21hbl9zKQorCQkgICAgU1RSQ0FUKGJ1ZiwgIm1hbiIpOworCQllbHNlCisJCSAgICBTVFJDQVQoYnVmLCBrcCk7CisJCVNUUkNBVChidWYsICIgIik7CisJCWlmIChjYXAtPmNvdW50MCAhPSAwICYmIChpc21hbiB8fCBpc21hbl9zKSkKKwkJeworCQkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiArIFNUUkxFTihidWYpLCAiJWxkIiwgY2FwLT5jb3VudDApOworCQkgICAgU1RSQ0FUKGJ1ZiwgIiAiKTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnXSc6CisjaWZkZWYgRkVBVF9DU0NPUEUKKwkgICAgaWYgKHBfY3N0KQorCQlTVFJDUFkoYnVmLCAiY3N0YWcgIik7CisJICAgIGVsc2UKKyNlbmRpZgorCQlTVFJDUFkoYnVmLCAidHMgIik7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgaWYgKGN1cmJ1Zi0+Yl9oZWxwKQorCQlTVFJDUFkoYnVmLCAiaGUhICIpOworCSAgICBlbHNlIGlmIChnX2NtZCkKKwkJU1RSQ1BZKGJ1ZiwgInRqICIpOworCSAgICBlbHNlCisJCVNUUkNQWShidWYsICJ0YSAiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyBncmFiIHRoZSBjaGFycyBpbiB0aGUgaWRlbnRpZmllcgorICAgICAqLworICAgIGlmIChjbWRjaGFyID09ICcqJykKKwlhdXhfcHRyID0gKGNoYXJfdSAqKShwX21hZ2ljID8gIi8uKn5bXiRcXCIgOiAiL14kXFwiKTsKKyAgICBlbHNlIGlmIChjbWRjaGFyID09ICcjJykKKwlhdXhfcHRyID0gKGNoYXJfdSAqKShwX21hZ2ljID8gIi8/Lip+W14kXFwiIDogIi8/XiRcXCIpOworICAgIGVsc2UgaWYgKGNtZGNoYXIgPT0gJ0snICYmICFrcF9oZWxwKQorCWF1eF9wdHIgPSAoY2hhcl91ICopIiBcdFxcXCJ8ISI7CisgICAgZWxzZQorCS8qIERvbid0IGVzY2FwZSBzcGFjZXMgYW5kIFRhYnMgaW4gYSB0YWcgd2l0aCBhIGJhY2tzbGFzaCAqLworCWF1eF9wdHIgPSAoY2hhcl91ICopIlxcfFwiIjsKKworICAgIHAgPSBidWYgKyBTVFJMRU4oYnVmKTsKKyAgICB3aGlsZSAobi0tID4gMCkKKyAgICB7CisJLyogcHV0IGEgYmFja3NsYXNoIGJlZm9yZSBcIGFuZCBzb21lIG90aGVycyAqLworCWlmICh2aW1fc3RyY2hyKGF1eF9wdHIsICpwdHIpICE9IE5VTEwpCisJICAgICpwKysgPSAnXFwnOworI2lmZGVmIEZFQVRfTUJZVEUKKwkvKiBXaGVuIGN1cnJlbnQgYnl0ZSBpcyBhIHBhcnQgb2YgbXVsdGlieXRlIGNoYXJhY3RlciwgY29weSBhbGwgYnl0ZXMKKwkgKiBvZiB0aGF0IGNoYXJhY3Rlci4gKi8KKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50IGk7CisJICAgIGludCBsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cikgLSAxOworCisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gJiYgbiA+PSAxOyArK2ksIC0tbikKKwkJKnArKyA9ICpwdHIrKzsKKwl9CisjZW5kaWYKKwkqcCsrID0gKnB0cisrOworICAgIH0KKyAgICAqcCA9IE5VTDsKKworICAgIC8qCisgICAgICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBpZiAoY21kY2hhciA9PSAnKicgfHwgY21kY2hhciA9PSAnIycpCisgICAgeworCWlmICghZ19jbWQgJiYgKAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJaGFzX21ieXRlID8gdmltX2lzd29yZHAobWJfcHJldnB0cihtbF9nZXRfY3VybGluZSgpLCBwdHIpKSA6CisjZW5kaWYKKwkJdmltX2lzd29yZGMocHRyWy0xXSkpKQorCSAgICBTVFJDQVQoYnVmLCAiXFw+Iik7CisjaWZkZWYgRkVBVF9DTURISVNUCisJLyogcHV0IHBhdHRlcm4gaW4gc2VhcmNoIGhpc3RvcnkgKi8KKwlhZGRfdG9faGlzdG9yeShISVNUX1NFQVJDSCwgYnVmLCBUUlVFLCBOVUwpOworI2VuZGlmCisJbm9ybWFsX3NlYXJjaChjYXAsIGNtZGNoYXIgPT0gJyonID8gJy8nIDogJz8nLCBidWYsIDApOworICAgIH0KKyAgICBlbHNlCisJZG9fY21kbGluZV9jbWQoYnVmKTsKKworICAgIHZpbV9mcmVlKGJ1Zik7Cit9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorLyoKKyAqIEdldCB2aXN1YWxseSBzZWxlY3RlZCB0ZXh0LCB3aXRoaW4gb25lIGxpbmUgb25seS4KKyAqIFJldHVybnMgRkFJTCBpZiBtb3JlIHRoYW4gb25lIGxpbmUgc2VsZWN0ZWQuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfdmlzdWFsX3RleHQoY2FwLCBwcCwgbGVucCkKKyAgICBjbWRhcmdfVAkqY2FwOworICAgIGNoYXJfdQkqKnBwOwkgICAgLyogcmV0dXJuOiBzdGFydCBvZiBzZWxlY3RlZCB0ZXh0ICovCisgICAgaW50CQkqbGVucDsJICAgIC8qIHJldHVybjogbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQgKi8KK3sKKyAgICBpZiAoVklzdWFsX21vZGUgIT0gJ1YnKQorCXVuYWRqdXN0X2Zvcl9zZWwoKTsKKyAgICBpZiAoVklzdWFsLmxudW0gIT0gY3Vyd2luLT53X2N1cnNvci5sbnVtKQorICAgIHsKKwljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGlmIChWSXN1YWxfbW9kZSA9PSAnVicpCisgICAgeworCSpwcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJKmxlbnAgPSAoaW50KVNUUkxFTigqcHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChsdChjdXJ3aW4tPndfY3Vyc29yLCBWSXN1YWwpKQorCXsKKwkgICAgKnBwID0gbWxfZ2V0X3BvcygmY3Vyd2luLT53X2N1cnNvcik7CisJICAgICpsZW5wID0gVklzdWFsLmNvbCAtIGN1cndpbi0+d19jdXJzb3IuY29sICsgMTsKKwl9CisJZWxzZQorCXsKKwkgICAgKnBwID0gbWxfZ2V0X3BvcygmVklzdWFsKTsKKwkgICAgKmxlbnAgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCAtIFZJc3VhbC5jb2wgKyAxOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgLyogQ29ycmVjdCB0aGUgbGVuZ3RoIHRvIGluY2x1ZGUgdGhlIHdob2xlIGxhc3QgY2hhcmFjdGVyLiAqLworCSAgICAqbGVucCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKCpwcCArICgqbGVucCAtIDEpKSAtIDE7CisjZW5kaWYKKyAgICB9CisgICAgcmVzZXRfVklzdWFsX2FuZF9yZXNlbCgpOworICAgIHJldHVybiBPSzsKK30KKyNlbmRpZgorCisvKgorICogQ1RSTC1UOiBiYWNrd2FyZHMgaW4gdGFnIHN0YWNrCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfdGFncG9wKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wcShjYXAtPm9hcCkpCisJZG9fdGFnKChjaGFyX3UgKikiIiwgRFRfUE9QLCAoaW50KWNhcC0+Y291bnQxLCBGQUxTRSwgVFJVRSk7Cit9CisKKy8qCisgKiBIYW5kbGUgc2Nyb2xsaW5nIGNvbW1hbmQgJ0gnLCAnTCcgYW5kICdNJy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9zY3JvbGwoY2FwKQorICAgIGNtZGFyZ19UICAqY2FwOworeworICAgIGludAkJdXNlZCA9IDA7CisgICAgbG9uZwluOworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGxpbmVucl9UCWxudW07CisjZW5kaWYKKyAgICBpbnQJCWhhbGY7CisKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKyAgICBzZXRwY21hcmsoKTsKKworICAgIGlmIChjYXAtPmNtZGNoYXIgPT0gJ0wnKQorICAgIHsKKwl2YWxpZGF0ZV9ib3RsaW5lKCk7CSAgICAvKiBtYWtlIHN1cmUgY3Vyd2luLT53X2JvdGxpbmUgaXMgdmFsaWQgKi8KKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJ3aW4tPndfYm90bGluZSAtIDE7CisJaWYgKGNhcC0+Y291bnQxIC0gMSA+PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IDE7CisJZWxzZQorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gLT0gY2FwLT5jb3VudDEgLSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChjYXAtPmNtZGNoYXIgPT0gJ00nKQorCXsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgLyogRG9uJ3QgY291bnQgZmlsbGVyIGxpbmVzIGFib3ZlIHRoZSB3aW5kb3cuICovCisJICAgIHVzZWQgLT0gZGlmZl9jaGVja19maWxsKGN1cndpbiwgY3Vyd2luLT53X3RvcGxpbmUpCisJCQkJCQkJICAtIGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisJICAgIHZhbGlkYXRlX2JvdGxpbmUoKTsJICAgIC8qIG1ha2Ugc3VyZSB3X2VtcHR5X3Jvd3MgaXMgdmFsaWQgKi8KKwkgICAgaGFsZiA9IChjdXJ3aW4tPndfaGVpZ2h0IC0gY3Vyd2luLT53X2VtcHR5X3Jvd3MgKyAxKSAvIDI7CisJICAgIGZvciAobiA9IDA7IGN1cndpbi0+d190b3BsaW5lICsgbiA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK24pCisJICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJLyogQ291bnQgaGFsZiBoZSBudW1iZXIgb2YgZmlsbGVyIGxpbmVzIHRvIGJlICJiZWxvdyB0aGlzCisJCSAqIGxpbmUiIGFuZCBoYWxmIHRvIGJlICJhYm92ZSB0aGUgbmV4dCBsaW5lIi4gKi8KKwkJaWYgKG4gPiAwICYmIHVzZWQgKyBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBjdXJ3aW4tPndfdG9wbGluZQorCQkJCQkJCSAgICAgKyBuKSAvIDIgPj0gaGFsZikKKwkJeworCQkgICAgLS1uOworCQkgICAgYnJlYWs7CisJCX0KKyNlbmRpZgorCQl1c2VkICs9IHBsaW5lcyhjdXJ3aW4tPndfdG9wbGluZSArIG4pOworCQlpZiAodXNlZCA+PSBoYWxmKQorCQkgICAgYnJlYWs7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lICsgbiwgTlVMTCwgJmxudW0pKQorCQkgICAgbiA9IGxudW0gLSBjdXJ3aW4tPndfdG9wbGluZTsKKyNlbmRpZgorCSAgICB9CisJICAgIGlmIChuID4gMCAmJiB1c2VkID4gY3Vyd2luLT53X2hlaWdodCkKKwkJLS1uOworCX0KKwllbHNlCisJICAgIG4gPSBjYXAtPmNvdW50MSAtIDE7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3Vyd2luLT53X3RvcGxpbmUgKyBuOworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisgICAgfQorCisgICAgY3Vyc29yX2NvcnJlY3QoKTsJLyogY29ycmVjdCBmb3IgJ3NvJyAqLworICAgIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworfQorCisvKgorICogQ3Vyc29yIHJpZ2h0IGNvbW1hbmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3JpZ2h0KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGxvbmcJbjsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGludAkJUEFTVF9MSU5FOworI2Vsc2UKKyMgZGVmaW5lIFBBU1RfTElORSAwCisjZW5kaWYKKworICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IE1DSEFSOworICAgIGNhcC0+b2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIFBBU1RfTElORSA9IChWSXN1YWxfYWN0aXZlICYmICpwX3NlbCAhPSAnbycpOworCisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICAvKgorICAgICAqIEluIHZpcnR1YWwgbW9kZSwgdGhlcmUncyBubyBzdWNoIHRoaW5nIGFzICJQQVNUX0xJTkUiLCBhcyBsaW5lcyBhcmUKKyAgICAgKiAodGhlb3JldGljYWxseSkgaW5maW5pdGx5IGxvbmcuCisgICAgICovCisgICAgaWYgKHZpcnR1YWxfYWN0aXZlKCkpCisJUEFTVF9MSU5FID0gMDsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgZm9yIChuID0gY2FwLT5jb3VudDE7IG4gPiAwOyAtLW4pCisgICAgeworCWlmICgoIVBBU1RfTElORSAmJiBvbmVyaWdodCgpID09IEZBSUwpCisJCXx8IChQQVNUX0xJTkUgJiYgKm1sX2dldF9jdXJzb3IoKSA9PSBOVUwpKQorCXsKKwkgICAgLyoKKwkgICAgICoJICA8U3BhY2U+IHdyYXBzIHRvIG5leHQgbGluZSBpZiAnd2hpY2h3cmFwJyBiaXQgMSBzZXQuCisJICAgICAqCSAgICAgICdsJyB3cmFwcyB0byBuZXh0IGxpbmUgaWYgJ3doaWNod3JhcCcgYml0IDIgc2V0LgorCSAgICAgKiBDVVJTX1JJR0hUIHdyYXBzIHRvIG5leHQgbGluZSBpZiAnd2hpY2h3cmFwJyBiaXQgMyBzZXQKKwkgICAgICovCisJICAgIGlmICggICAgICAgKChjYXAtPmNtZGNoYXIgPT0gJyAnCisJCQkgICAgJiYgdmltX3N0cmNocihwX3d3LCAncycpICE9IE5VTEwpCisJCQl8fCAoY2FwLT5jbWRjaGFyID09ICdsJworCQkJICAgICYmIHZpbV9zdHJjaHIocF93dywgJ2wnKSAhPSBOVUxMKQorCQkJfHwgKGNhcC0+Y21kY2hhciA9PSBLX1JJR0hUCisJCQkgICAgJiYgdmltX3N0cmNocihwX3d3LCAnPicpICE9IE5VTEwpKQorCQkgICAgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKwkJLyogV2hlbiBkZWxldGluZyB3ZSBhbHNvIGNvdW50IHRoZSBOTCBhcyBhIGNoYXJhY3Rlci4KKwkJICogU2V0IGNhcC0+b2FwLT5pbmNsdXNpdmUgd2hlbiBsYXN0IGNoYXIgaW4gdGhlIGxpbmUgaXMKKwkJICogaW5jbHVkZWQsIG1vdmUgdG8gbmV4dCBsaW5lIGFmdGVyIHRoYXQgKi8KKwkJaWYgKAkgICAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfREVMRVRFCisJCQkgICAgfHwgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfQ0hBTkdFKQorCQkJJiYgIWNhcC0+b2FwLT5pbmNsdXNpdmUKKwkJCSYmICFsaW5lZW1wdHkoY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwkJICAgIGNhcC0+b2FwLT5pbmNsdXNpdmUgPSBUUlVFOworCQllbHNlCisJCXsKKwkJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorCQkgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisJCSAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisJCX0KKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwkgICAgeworCQkvKiBPbmx5IGJlZXAgYW5kIGZsdXNoIGlmIG5vdCBtb3ZlZCBhdCBhbGwgKi8KKwkJaWYgKG4gPT0gY2FwLT5jb3VudDEpCisJCSAgICBiZWVwX2ZsdXNoKCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmICghbGluZWVtcHR5KGN1cndpbi0+d19jdXJzb3IubG51bSkpCisJCSAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisjaWZkZWYgRkVBVF9WSVNVQUwKKwllbHNlIGlmIChQQVNUX0xJTkUpCisJeworCSAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBpZiAodmlydHVhbF9hY3RpdmUoKSkKKwkJb25lcmlnaHQoKTsKKwkgICAgZWxzZQorIyBlbmRpZgorCSAgICB7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sICs9CisJCQkJCSAoKm1iX3B0cjJsZW5fY2hlY2spKG1sX2dldF9jdXJzb3IoKSk7CisJCWVsc2UKKyMgZW5kaWYKKwkJICAgICsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIH0KKwl9CisjZW5kaWYKKyAgICB9CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKG4gIT0gY2FwLT5jb3VudDEgJiYgKGZkb19mbGFncyAmIEZET19IT1IpICYmIEtleVR5cGVkCisJCQkJCSAgICAgICAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorfQorCisvKgorICogQ3Vyc29yIGxlZnQgY29tbWFuZHMuCisgKgorICogUmV0dXJucyBUUlVFIHdoZW4gb3BlcmF0b3IgZW5kIHNob3VsZCBub3QgYmUgYWRqdXN0ZWQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfbGVmdChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBsb25nCW47CisKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisgICAgZm9yIChuID0gY2FwLT5jb3VudDE7IG4gPiAwOyAtLW4pCisgICAgeworCWlmIChvbmVsZWZ0KCkgPT0gRkFJTCkKKwl7CisJICAgIC8qIDxCUz4gYW5kIDxEZWw+IHdyYXAgdG8gcHJldmlvdXMgbGluZSBpZiAnd2hpY2h3cmFwJyBoYXMgJ2InLgorCSAgICAgKgkJICdoJyB3cmFwcyB0byBwcmV2aW91cyBsaW5lIGlmICd3aGljaHdyYXAnIGhhcyAnaCcuCisJICAgICAqCSAgIENVUlNfTEVGVCB3cmFwcyB0byBwcmV2aW91cyBsaW5lIGlmICd3aGljaHdyYXAnIGhhcyAnPCcuCisJICAgICAqLworCSAgICBpZiAoICAgICAgICgoKGNhcC0+Y21kY2hhciA9PSBLX0JTCisJCQkJfHwgY2FwLT5jbWRjaGFyID09IEN0cmxfSCkKKwkJCSAgICAmJiB2aW1fc3RyY2hyKHBfd3csICdiJykgIT0gTlVMTCkKKwkJCXx8IChjYXAtPmNtZGNoYXIgPT0gJ2gnCisJCQkgICAgJiYgdmltX3N0cmNocihwX3d3LCAnaCcpICE9IE5VTEwpCisJCQl8fCAoY2FwLT5jbWRjaGFyID09IEtfTEVGVAorCQkJICAgICYmIHZpbV9zdHJjaHIocF93dywgJzwnKSAhPSBOVUxMKSkKKwkJICAgICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisJICAgIHsKKwkJLS0oY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKwkJY29sYWR2YW5jZSgoY29sbnJfVClNQVhDT0wpOworCQljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKworCQkvKiBXaGVuIHRoZSBOTCBiZWZvcmUgdGhlIGZpcnN0IGNoYXIgaGFzIHRvIGJlIGRlbGV0ZWQgd2UKKwkJICogcHV0IHRoZSBjdXJzb3Igb24gdGhlIE5VTCBhZnRlciB0aGUgcHJldmlvdXMgbGluZS4KKwkJICogVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBiZSBjYXJlZnVsIQorCQkgKiBkb24ndCBhZGp1c3Qgb3BfZW5kIG5vdywgb3RoZXJ3aXNlIGl0IHdvbid0IHdvcmsgKi8KKwkJaWYgKAkgICAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfREVMRVRFCisJCQkgICAgfHwgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfQ0hBTkdFKQorCQkJJiYgIWxpbmVlbXB0eShjdXJ3aW4tPndfY3Vyc29yLmxudW0pKQorCQl7CisJCSAgICArK2N1cndpbi0+d19jdXJzb3IuY29sOworCQkgICAgY2FwLT5yZXR2YWwgfD0gQ0FfTk9fQURKX09QX0VORDsKKwkJfQorCQljb250aW51ZTsKKwkgICAgfQorCSAgICAvKiBPbmx5IGJlZXAgYW5kIGZsdXNoIGlmIG5vdCBtb3ZlZCBhdCBhbGwgKi8KKwkgICAgZWxzZSBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QICYmIG4gPT0gY2FwLT5jb3VudDEpCisJCWJlZXBfZmx1c2goKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAobiAhPSBjYXAtPmNvdW50MSAmJiAoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQKKwkJCQkJICAgICAgICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwlmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCit9CisKKy8qCisgKiBDdXJzb3IgdXAgY29tbWFuZHMuCisgKiBjYXAtPmFyZyBpcyBUUlVFIGZvciAiLSI6IE1vdmUgY3Vyc29yIHRvIGZpcnN0IG5vbi1ibGFuay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl91cChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKyAgICBpZiAoY3Vyc29yX3VwKGNhcC0+Y291bnQxLCBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApID09IEZBSUwpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIGVsc2UgaWYgKGNhcC0+YXJnKQorCWJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7Cit9CisKKy8qCisgKiBDdXJzb3IgZG93biBjb21tYW5kcy4KKyAqIGNhcC0+YXJnIGlzIFRSVUUgZm9yIENSIGFuZCAiKyI6IE1vdmUgY3Vyc29yIHRvIGZpcnN0IG5vbi1ibGFuay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9kb3duKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgLyogSW4gYSBxdWlja2ZpeCB3aW5kb3cgYSA8Q1I+IGp1bXBzIHRvIHRoZSBlcnJvciB1bmRlciB0aGUgY3Vyc29yLiAqLworICAgIGlmIChidF9xdWlja2ZpeChjdXJidWYpICYmIGNhcC0+Y21kY2hhciA9PSAnXHInKQorCWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiLmNjIik7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworI2lmZGVmIEZFQVRfQ01EV0lOCisJLyogSW4gdGhlIGNtZGxpbmUgd2luZG93IGEgPENSPiBleGVjdXRlcyB0aGUgY29tbWFuZC4gKi8KKwlpZiAoY21kd2luX3R5cGUgIT0gMCAmJiBjYXAtPmNtZGNoYXIgPT0gJ1xyJykKKwkgICAgY21kd2luX3Jlc3VsdCA9IENBUjsKKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworCSAgICBpZiAoY3Vyc29yX2Rvd24oY2FwLT5jb3VudDEsIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkgPT0gRkFJTCkKKwkJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCSAgICBlbHNlIGlmIChjYXAtPmFyZykKKwkJYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKwl9CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisvKgorICogR3JhYiB0aGUgZmlsZSBuYW1lIHVuZGVyIHRoZSBjdXJzb3IgYW5kIGVkaXQgaXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZ290b2ZpbGUoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgY2hhcl91CSpwdHI7CisKKyNpZmRlZiBGRUFUX0NNRFdJTgorICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorICAgIHsKKwljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjIGlmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiBJbiBWaXN1YWwgbW9kZSwgdXNlIHRoZSBzZWxlY3RlZCB0ZXh0IGFzIGEgZmlsZSBuYW1lLgorICAgICAqIERvbid0IGFsbG93IHNlbGVjdGlvbiBhY3Jvc3MgbXVsdGlwbGUgbGluZXMuCisgICAgICovCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCWludAlsZW47CisKKwlpZiAoZ2V0X3Zpc3VhbF90ZXh0KGNhcCwgJnB0ciwgJmxlbikgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworCXB0ciA9IGZpbmRfZmlsZV9uYW1lX2luX3BhdGgocHRyLCBsZW4sCisJICAgICAgIEZOQU1FX01FU1N8Rk5BTUVfRVhQfEZOQU1FX1JFTCwgY2FwLT5jb3VudDEsIGN1cmJ1Zi0+Yl9mZm5hbWUpOworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisJcHRyID0gZmlsZV9uYW1lX2F0X2N1cnNvcihGTkFNRV9NRVNTfEZOQU1FX0hZUHxGTkFNRV9FWFB8Rk5BTUVfUkVMLAorCQkJCQkJCQkgY2FwLT5jb3VudDEpOworCisgICAgaWYgKHB0ciAhPSBOVUxMKQorICAgIHsKKwkvKiBkbyBhdXRvd3JpdGUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGN1cmJ1ZklzQ2hhbmdlZCgpICYmIGN1cmJ1Zi0+Yl9ud2luZG93cyA8PSAxICYmICFQX0hJRChjdXJidWYpKQorCSAgICBhdXRvd3JpdGUoY3VyYnVmLCBGQUxTRSk7CisJc2V0cGNtYXJrKCk7CisJKHZvaWQpZG9fZWNtZCgwLCBwdHIsIE5VTEwsIE5VTEwsIEVDTURfTEFTVCwKKwkJCQkJICAgICAgIFBfSElEKGN1cmJ1ZikgPyBFQ01EX0hJREUgOiAwKTsKKwl2aW1fZnJlZShwdHIpOworICAgIH0KKyAgICBlbHNlCisJY2xlYXJvcChjYXAtPm9hcCk7Cit9CisjZW5kaWYKKworLyoKKyAqIDxFbmQ+IGNvbW1hbmQ6IHRvIGVuZCBvZiBjdXJyZW50IGxpbmUgb3IgbGFzdCBsaW5lLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2VuZChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoY2FwLT5hcmcpCS8qIENUUkwtRU5EID0gZ290byBsYXN0IGxpbmUgKi8KKyAgICB7CisJbnZfZ290byhjYXApOworCWNhcC0+Y291bnQxID0gMTsJCS8qIHRvIGVuZCBvZiBjdXJyZW50IGxpbmUgKi8KKyAgICB9CisgICAgbnZfZG9sbGFyKGNhcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlICIkIiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2RvbGxhcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgLyogSW4gdmlydHVhbCBtb2RlIHdoZW4gb2ZmIHRoZSBlZGdlIG9mIGEgbGluZSBhbmQgYW4gb3BlcmF0b3IKKyAgICAgKiBpcyBwZW5kaW5nICh3aGV3ISkga2VlcCB0aGUgY3Vyc29yIHdoZXJlIGl0IGlzLgorICAgICAqIE90aGVyd2lzZSwgc2VuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworICAgIGlmICghdmlydHVhbF9hY3RpdmUoKSB8fCBnY2hhcl9jdXJzb3IoKSAhPSBOVUwKKwkJCQkJICAgICAgIHx8IGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKyNlbmRpZgorCWN1cndpbi0+d19jdXJzd2FudCA9IE1BWENPTDsJLyogc28gd2Ugc3RheSBhdCB0aGUgZW5kICovCisgICAgaWYgKGN1cnNvcl9kb3duKChsb25nKShjYXAtPmNvdW50MSAtIDEpLAorCQkJCQkgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QKSA9PSBGQUlMKQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBlbHNlIGlmICgoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQgJiYgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorCWZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKK30KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mICc/JyBhbmQgJy8nIGNvbW1hbmRzLgorICogSWYgY2FwLT5hcmcgaXMgVFJVRSBkb24ndCBzZXQgUEMgbWFyay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9zZWFyY2goY2FwKQorICAgIGNtZGFyZ19UCSAgICAqY2FwOworeworICAgIG9wYXJnX1QJKm9hcCA9IGNhcC0+b2FwOworCisgICAgaWYgKGNhcC0+Y21kY2hhciA9PSAnPycgJiYgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfUk9UMTMpCisgICAgeworCS8qIFRyYW5zbGF0ZSAiZz8/IiB0byAiZz9nPyIgKi8KKwljYXAtPmNtZGNoYXIgPSAnZyc7CisJY2FwLT5uY2hhciA9ICc/JzsKKwludl9vcGVyYXRvcihjYXApOworCXJldHVybjsKKyAgICB9CisKKyAgICBjYXAtPnNlYXJjaGJ1ZiA9IGdldGNtZGxpbmUoY2FwLT5jbWRjaGFyLCBjYXAtPmNvdW50MSwgMCk7CisKKyAgICBpZiAoY2FwLT5zZWFyY2hidWYgPT0gTlVMTCkKKyAgICB7CisJY2xlYXJvcChvYXApOworCXJldHVybjsKKyAgICB9CisKKyAgICBub3JtYWxfc2VhcmNoKGNhcCwgY2FwLT5jbWRjaGFyLCBjYXAtPnNlYXJjaGJ1ZiwKKwkJCQkJCShjYXAtPmFyZyA/IDAgOiBTRUFSQ0hfTUFSSykpOworfQorCisvKgorICogSGFuZGxlICJOIiBhbmQgIm4iIGNvbW1hbmRzLgorICogY2FwLT5hcmcgaXMgU0VBUkNIX1JFViBmb3IgIk4iLCAwIGZvciAibiIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfbmV4dChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBub3JtYWxfc2VhcmNoKGNhcCwgMCwgTlVMTCwgU0VBUkNIX01BUksgfCBjYXAtPmFyZyk7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yICJwYXQiIGluIGRpcmVjdGlvbiAiZGlyIiAoJy8nIG9yICc/JywgMCBmb3IgcmVwZWF0KS4KKyAqIFVzZXMgb25seSBjYXAtPmNvdW50MSBhbmQgY2FwLT5vYXAgZnJvbSAiY2FwIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitub3JtYWxfc2VhcmNoKGNhcCwgZGlyLCBwYXQsIG9wdCkKKyAgICBjbWRhcmdfVAkqY2FwOworICAgIGludAkJZGlyOworICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJb3B0OwkJLyogZXh0cmEgZmxhZ3MgZm9yIGRvX3NlYXJjaCgpICovCit7CisgICAgaW50CQlpOworCisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworICAgIGNhcC0+b2FwLT51c2VfcmVnX29uZSA9IFRSVUU7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKKyAgICBpID0gZG9fc2VhcmNoKGNhcC0+b2FwLCBkaXIsIHBhdCwgY2FwLT5jb3VudDEsCisJCQkJIG9wdCB8IFNFQVJDSF9PUFQgfCBTRUFSQ0hfRUNITyB8IFNFQVJDSF9NU0cpOworICAgIGlmIChpID09IDApCisJY2xlYXJvcChjYXAtPm9hcCk7CisgICAgZWxzZQorICAgIHsKKwlpZiAoaSA9PSAyKQorCSAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJaWYgKGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCAmJiAoZmRvX2ZsYWdzICYgRkRPX1NFQVJDSCkgJiYgS2V5VHlwZWQpCisJICAgIGZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiAiLyQiIHdpbGwgcHV0IHRoZSBjdXJzb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbGluZSwgbWF5IG5lZWQgdG8KKyAgICAgKiBjb3JyZWN0IHRoYXQgaGVyZSAqLworICAgIGNoZWNrX2N1cnNvcigpOworfQorCisvKgorICogQ2hhcmFjdGVyIHNlYXJjaCBjb21tYW5kcy4KKyAqIGNhcC0+YXJnIGlzIEJBQ0tXQVJEIGZvciAnRicgYW5kICdUJywgRk9SV0FSRCBmb3IgJ2YnIGFuZCAndCcsIFRSVUUgZm9yCisgKiAnLCcgYW5kIEZBTFNFIGZvciAnOycuCisgKiBjYXAtPm5jaGFyIGlzIE5VTCBmb3IgJywnIGFuZCAnOycgKHJlcGVhdCB0aGUgc2VhcmNoKQorICovCisgICAgc3RhdGljIHZvaWQKK252X2NzZWFyY2goY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaW50CQl0X2NtZDsKKworICAgIGlmIChjYXAtPmNtZGNoYXIgPT0gJ3QnIHx8IGNhcC0+Y21kY2hhciA9PSAnVCcpCisJdF9jbWQgPSBUUlVFOworICAgIGVsc2UKKwl0X2NtZCA9IEZBTFNFOworCisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgaWYgKGNhcC0+YXJnID09IEJBQ0tXQVJEKQorCWNhcC0+b2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKyAgICBlbHNlCisJY2FwLT5vYXAtPmluY2x1c2l2ZSA9IFRSVUU7CisgICAgaWYgKElTX1NQRUNJQUwoY2FwLT5uY2hhcikgfHwgc2VhcmNoYyhjYXAsIHRfY21kKSA9PSBGQUlMKQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKyAgICBlbHNlCisgICAgeworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkvKiBJbmNsdWRlIGEgVGFiIGZvciAidHgiIGFuZCBmb3IgImRmeCIuICovCisJaWYgKGdjaGFyX2N1cnNvcigpID09IFRBQiAmJiB2aXJ0dWFsX2FjdGl2ZSgpICYmIGNhcC0+YXJnID09IEZPUldBUkQKKwkJJiYgKHRfY21kIHx8IGNhcC0+b2FwLT5vcF90eXBlICE9IE9QX05PUCkpCisJeworCSAgICBjb2xucl9UCXNjb2wsIGVjb2w7CisKKwkgICAgZ2V0dmNvbChjdXJ3aW4sICZjdXJ3aW4tPndfY3Vyc29yLCAmc2NvbCwgTlVMTCwgJmVjb2wpOworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IGVjb2wgLSBzY29sOworCX0KKwllbHNlCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCisJYWRqdXN0X2Zvcl9zZWwoY2FwKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCWlmICgoZmRvX2ZsYWdzICYgRkRPX0hPUikgJiYgS2V5VHlwZWQgJiYgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QKQorCSAgICBmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogIlsiIGFuZCAiXSIgY29tbWFuZHMuCisgKiBjYXAtPmFyZyBpcyBCQUNLV0FSRCBmb3IgIlsiIGFuZCBGT1JXQVJEIGZvciAiXSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfYnJhY2tldHMoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgcG9zX1QJbmV3X3BvczsKKyAgICBwb3NfVAlwcmV2X3BvczsKKyAgICBwb3NfVAkqcG9zID0gTlVMTDsJICAgIC8qIGluaXQgZm9yIEdDQyAqLworICAgIHBvc19UCW9sZF9wb3M7CSAgICAvKiBjdXJzb3IgcG9zaXRpb24gYmVmb3JlIGNvbW1hbmQgKi8KKyAgICBpbnQJCWZsYWc7CisgICAgbG9uZwluOworICAgIGludAkJZmluZGM7CisgICAgaW50CQljOworCisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworICAgIG9sZF9wb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CSAgICAvKiBUT0RPOiBkb24ndCBkbyB0aGlzIGZvciBhbiBlcnJvci4gKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisgICAgLyoKKyAgICAgKiAiW2YiIG9yICJdZiIgOiBFZGl0IGZpbGUgdW5kZXIgdGhlIGN1cnNvciAoc2FtZSBhcyAiZ2YiKQorICAgICAqLworICAgIGlmIChjYXAtPm5jaGFyID09ICdmJykKKwludl9nb3RvZmlsZShjYXApOworICAgIGVsc2UKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GSU5EX0lECisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBvY2N1cmVuY2Uocykgb2YgdGhlIGlkZW50aWZpZXIgb3IgZGVmaW5lIHVuZGVyIGN1cnNvcgorICAgICAqIGluIGN1cnJlbnQgYW5kIGluY2x1ZGVkIGZpbGVzIG9yIGp1bXAgdG8gdGhlIGZpcnN0IG9jY3VyZW5jZS4KKyAgICAgKgorICAgICAqCQkJc2VhcmNoCSAgICAgbGlzdAkgICAganVtcAorICAgICAqCQkgICAgICBmd2QgICBid2QgICAgZndkCSBid2QJIGZ3ZAlid2QKKyAgICAgKiBpZGVudGlmaWVyICAgICAiXWkiICAiW2kiICAgIl1JIiAgIltJIgkiXV5JIiAgIlteSSIKKyAgICAgKiBkZWZpbmUJICAgICAgIl1kIiAgIltkIiAgICJdRCIgICJbRCIJIl1eRCIgICJbXkQiCisgICAgICovCisgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKQorI2lmZGVmIEVCQ0RJQworCQkiaUlcMDA1ZERcMDY3IiwKKyNlbHNlCisJCSJpSVwwMTFkRFwwMDQiLAorI2VuZGlmCisJCWNhcC0+bmNoYXIpICE9IE5VTEwpCisgICAgeworCWNoYXJfdQkqcHRyOworCWludAlsZW47CisKKwlpZiAoKGxlbiA9IGZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKCZwdHIsIEZJTkRfSURFTlQpKSA9PSAwKQorCSAgICBjbGVhcm9wKGNhcC0+b2FwKTsKKwllbHNlCisJeworCSAgICBmaW5kX3BhdHRlcm5faW5fcGF0aChwdHIsIDAsIGxlbiwgVFJVRSwKKwkJY2FwLT5jb3VudDAgPT0gMCA/ICFpc3VwcGVyKGNhcC0+bmNoYXIpIDogRkFMU0UsCisJCSgoY2FwLT5uY2hhciAmIDB4ZikgPT0gKCdkJyAmIDB4ZikpID8gIEZJTkRfREVGSU5FIDogRklORF9BTlksCisJCWNhcC0+Y291bnQxLAorCQlpc3VwcGVyKGNhcC0+bmNoYXIpID8gQUNUSU9OX1NIT1dfQUxMIDoKKwkJCSAgICBpc2xvd2VyKGNhcC0+bmNoYXIpID8gQUNUSU9OX1NIT1cgOiBBQ1RJT05fR09UTywKKwkJY2FwLT5jbWRjaGFyID09ICddJyA/IGN1cndpbi0+d19jdXJzb3IubG51bSArIDEgOiAobGluZW5yX1QpMSwKKwkJKGxpbmVucl9UKU1BWExOVU0pOworCSAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiAiW3siLCAiWygiLCAiXX0iIG9yICJdKSI6IGdvIHRvIE50aCB1bmNsb3NlZCAneycsICcoJywgJ30nIG9yICcpJworICAgICAqICJbIyIsICJdIyI6IGdvIHRvIHN0YXJ0L2VuZCBvZiBOdGggaW5uZXJtb3N0ICNpZi4uI2VuZGlmIGNvbnN0cnVjdC4KKyAgICAgKiAiWy8iLCAiWyoiLCAiXS8iLCAiXSoiOiBnbyB0byBOdGggY29tbWVudCBzdGFydC9lbmQuCisgICAgICogIlttIiBvciAiXW0iIHNlYXJjaCBmb3IgcHJldi9uZXh0IHN0YXJ0IG9mIChKYXZhKSBtZXRob2QuCisgICAgICogIltNIiBvciAiXU0iIHNlYXJjaCBmb3IgcHJldi9uZXh0IGVuZCBvZiAoSmF2YSkgbWV0aG9kLgorICAgICAqLworICAgIGlmICggIChjYXAtPmNtZGNoYXIgPT0gJ1snCisJCSYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJ7KCovI21NIiwgY2FwLT5uY2hhcikgIT0gTlVMTCkKKwkgICAgfHwgKGNhcC0+Y21kY2hhciA9PSAnXScKKwkJJiYgdmltX3N0cmNocigoY2hhcl91ICopIn0pKi8jbU0iLCBjYXAtPm5jaGFyKSAhPSBOVUxMKSkKKyAgICB7CisJaWYgKGNhcC0+bmNoYXIgPT0gJyonKQorCSAgICBjYXAtPm5jaGFyID0gJy8nOworCW5ld19wb3MubG51bSA9IDA7CisJcHJldl9wb3MubG51bSA9IDA7CisJaWYgKGNhcC0+bmNoYXIgPT0gJ20nIHx8IGNhcC0+bmNoYXIgPT0gJ00nKQorCXsKKwkgICAgaWYgKGNhcC0+Y21kY2hhciA9PSAnWycpCisJCWZpbmRjID0gJ3snOworCSAgICBlbHNlCisJCWZpbmRjID0gJ30nOworCSAgICBuID0gOTk5OTsKKwl9CisJZWxzZQorCXsKKwkgICAgZmluZGMgPSBjYXAtPm5jaGFyOworCSAgICBuID0gY2FwLT5jb3VudDE7CisJfQorCWZvciAoIDsgbiA+IDA7IC0tbikKKwl7CisJICAgIGlmICgocG9zID0gZmluZG1hdGNobGltaXQoY2FwLT5vYXAsIGZpbmRjLAorCQkoY2FwLT5jbWRjaGFyID09ICdbJykgPyBGTV9CQUNLV0FSRCA6IEZNX0ZPUldBUkQsIDApKSA9PSBOVUxMKQorCSAgICB7CisJCWlmIChuZXdfcG9zLmxudW0gPT0gMCkJLyogbm90aGluZyBmb3VuZCAqLworCQl7CisJCSAgICBpZiAoY2FwLT5uY2hhciAhPSAnbScgJiYgY2FwLT5uY2hhciAhPSAnTScpCisJCQljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJCX0KKwkJZWxzZQorCQkgICAgcG9zID0gJm5ld19wb3M7CS8qIHVzZSBsYXN0IG9uZSBmb3VuZCAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBwcmV2X3BvcyA9IG5ld19wb3M7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSAqcG9zOworCSAgICBuZXdfcG9zID0gKnBvczsKKwl9CisJY3Vyd2luLT53X2N1cnNvciA9IG9sZF9wb3M7CisKKwkvKgorCSAqIEhhbmRsZSAiW20iLCAiXW0iLCAiW00iIGFuZCAiW00iLiAgVGhlIGZpbmRtYXRjaGxpbWl0KCkgb25seQorCSAqIGJyb3VnaHQgdXMgdG8gdGhlIG1hdGNoIGZvciAiW20iIGFuZCAiXU0iIHdoZW4gaW5zaWRlIGEgbWV0aG9kLgorCSAqIFRyeSBmaW5kaW5nIHRoZSAneycgb3IgJ30nIHdlIHdhbnQgdG8gYmUgYXQuCisJICogQWxzbyByZXBlYXQgZm9yIHRoZSBnaXZlbiBjb3VudC4KKwkgKi8KKwlpZiAoY2FwLT5uY2hhciA9PSAnbScgfHwgY2FwLT5uY2hhciA9PSAnTScpCisJeworCSAgICAvKiBub3JtIGlzIFRSVUUgZm9yICJdTSIgYW5kICJbbSIgKi8KKwkgICAgaW50CSAgICBub3JtID0gKChmaW5kYyA9PSAneycpID09IChjYXAtPm5jaGFyID09ICdtJykpOworCisJICAgIG4gPSBjYXAtPmNvdW50MTsKKwkgICAgLyogZm91bmQgYSBtYXRjaDogd2Ugd2VyZSBpbnNpZGUgYSBtZXRob2QgKi8KKwkgICAgaWYgKHByZXZfcG9zLmxudW0gIT0gMCkKKwkgICAgeworCQlwb3MgPSAmcHJldl9wb3M7CisJCWN1cndpbi0+d19jdXJzb3IgPSBwcmV2X3BvczsKKwkJaWYgKG5vcm0pCisJCSAgICAtLW47CisJICAgIH0KKwkgICAgZWxzZQorCQlwb3MgPSBOVUxMOworCSAgICB3aGlsZSAobiA+IDApCisJICAgIHsKKwkJZm9yICg7OykKKwkJeworCQkgICAgaWYgKChmaW5kYyA9PSAneycgPyBkZWNfY3Vyc29yKCkgOiBpbmNfY3Vyc29yKCkpIDwgMCkKKwkJICAgIHsKKwkJCS8qIGlmIG5vdCBmb3VuZCBhbnl0aGluZywgdGhhdCdzIGFuIGVycm9yICovCisJCQlpZiAocG9zID09IE5VTEwpCisJCQkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCQkJbiA9IDA7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGMgPSBnY2hhcl9jdXJzb3IoKTsKKwkJICAgIGlmIChjID09ICd7JyB8fCBjID09ICd9JykKKwkJICAgIHsKKwkJCS8qIE11c3QgaGF2ZSBmb3VuZCBlbmQvc3RhcnQgb2YgY2xhc3M6IHVzZSBpdC4KKwkJCSAqIE9yIGZvdW5kIHRoZSBwbGFjZSB0byBiZSBhdC4gKi8KKwkJCWlmICgoYyA9PSBmaW5kYyAmJiBub3JtKSB8fCAobiA9PSAxICYmICFub3JtKSkKKwkJCXsKKwkJCSAgICBuZXdfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkJCSAgICBwb3MgPSAmbmV3X3BvczsKKwkJCSAgICBuID0gMDsKKwkJCX0KKwkJCS8qIGlmIG5vIG1hdGNoIGZvdW5kIGF0IGFsbCwgd2Ugc3RhcnRlZCBvdXRzaWRlIG9mIHRoZQorCQkJICogY2xhc3MgYW5kIHdlJ3JlIGluc2lkZSBub3cuICBKdXN0IGdvIG9uLiAqLworCQkJZWxzZSBpZiAobmV3X3Bvcy5sbnVtID09IDApCisJCQl7CisJCQkgICAgbmV3X3BvcyA9IGN1cndpbi0+d19jdXJzb3I7CisJCQkgICAgcG9zID0gJm5ld19wb3M7CisJCQl9CisJCQkvKiBmb3VuZCBzdGFydC9lbmQgb2Ygb3RoZXIgbWV0aG9kOiBnbyB0byBtYXRjaCAqLworCQkJZWxzZSBpZiAoKHBvcyA9IGZpbmRtYXRjaGxpbWl0KGNhcC0+b2FwLCBmaW5kYywKKwkJCSAgICAoY2FwLT5jbWRjaGFyID09ICdbJykgPyBGTV9CQUNLV0FSRCA6IEZNX0ZPUldBUkQsCisJCQkJCQkJCSAgMCkpID09IE5VTEwpCisJCQkgICAgbiA9IDA7CisJCQllbHNlCisJCQkgICAgY3Vyd2luLT53X2N1cnNvciA9ICpwb3M7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCQktLW47CisJICAgIH0KKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IG9sZF9wb3M7CisJICAgIGlmIChwb3MgPT0gTlVMTCAmJiBuZXdfcG9zLmxudW0gIT0gMCkKKwkJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCX0KKwlpZiAocG9zICE9IE5VTEwpCisJeworCSAgICBzZXRwY21hcmsoKTsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9ICpwb3M7CisJICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoKGZkb19mbGFncyAmIEZET19CTE9DSykgJiYgS2V5VHlwZWQKKwkJCQkJICAgICAgICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwkJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqICJbWyIsICJbXSIsICJdXSIgYW5kICJdWyI6IG1vdmUgdG8gc3RhcnQgb3IgZW5kIG9mIGZ1bmN0aW9uCisgICAgICovCisgICAgZWxzZSBpZiAoY2FwLT5uY2hhciA9PSAnWycgfHwgY2FwLT5uY2hhciA9PSAnXScpCisgICAgeworCWlmIChjYXAtPm5jaGFyID09IGNhcC0+Y21kY2hhcikJCSAgICAvKiAiXV0iIG9yICJbWyIgKi8KKwkgICAgZmxhZyA9ICd7JzsKKwllbHNlCisJICAgIGZsYWcgPSAnfSc7CQkgICAgLyogIl1bIiBvciAiW10iICovCisKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwkvKgorCSAqIEltaXRhdGUgc3RyYW5nZSBWaSBiZWhhdmlvdXI6IFdoZW4gdXNpbmcgIl1dIiB3aXRoIGFuIG9wZXJhdG9yCisJICogd2UgYWxzbyBzdG9wIGF0ICd9Jy4KKwkgKi8KKwlpZiAoIWZpbmRwYXIoY2FwLT5vYXAsIGNhcC0+YXJnLCBjYXAtPmNvdW50MSwgZmxhZywKKwkgICAgICAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfTk9QCisJCQkJICAgICAgJiYgY2FwLT5hcmcgPT0gRk9SV0FSRCAmJiBmbGFnID09ICd7JykpKQorCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisJZWxzZQorCXsKKwkgICAgaWYgKGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwkJYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKChmZG9fZmxhZ3MgJiBGRE9fQkxPQ0spICYmIEtleVR5cGVkICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwkJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqICJbcCIsICJbUCIsICJdUCIgYW5kICJdcCI6IHB1dCB3aXRoIGluZGVudCBhZGp1c3RtZW50CisgICAgICovCisgICAgZWxzZSBpZiAoY2FwLT5uY2hhciA9PSAncCcgfHwgY2FwLT5uY2hhciA9PSAnUCcpCisgICAgeworCWlmICghY2hlY2tjbGVhcm9wcShjYXAtPm9hcCkpCisJeworCSAgICBwcmVwX3JlZG9fY21kKGNhcCk7CisJICAgIGRvX3B1dChjYXAtPm9hcC0+cmVnbmFtZSwKKwkgICAgICAoY2FwLT5jbWRjaGFyID09ICddJyAmJiBjYXAtPm5jaGFyID09ICdwJykgPyBGT1JXQVJEIDogQkFDS1dBUkQsCisJCQkJCQkgIGNhcC0+Y291bnQxLCBQVVRfRklYSU5ERU5UKTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAiWyciLCAiW2AiLCAiXSciIGFuZCAiXWAiOiBqdW1wIHRvIG5leHQgbWFyaworICAgICAqLworICAgIGVsc2UgaWYgKGNhcC0+bmNoYXIgPT0gJ1wnJyB8fCBjYXAtPm5jaGFyID09ICdgJykKKyAgICB7CisJcG9zID0gJmN1cndpbi0+d19jdXJzb3I7CisJZm9yIChuID0gY2FwLT5jb3VudDE7IG4gPiAwOyAtLW4pCisJeworCSAgICBwcmV2X3BvcyA9ICpwb3M7CisJICAgIHBvcyA9IGdldG5leHRtYXJrKHBvcywgY2FwLT5jbWRjaGFyID09ICdbJyA/IEJBQ0tXQVJEIDogRk9SV0FSRCwKKwkJCQkJCQkgIGNhcC0+bmNoYXIgPT0gJ1wnJyk7CisJICAgIGlmIChwb3MgPT0gTlVMTCkKKwkJYnJlYWs7CisJfQorCWlmIChwb3MgPT0gTlVMTCkKKwkgICAgcG9zID0gJnByZXZfcG9zOworCW52X2N1cnNvcm1hcmsoY2FwLCBjYXAtPm5jaGFyID09ICdcJycsIHBvcyk7CisgICAgfQorCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIC8qCisgICAgICogWyBvciBdIGZvbGxvd2VkIGJ5IGEgbWlkZGxlIG1vdXNlIGNsaWNrOiBwdXQgc2VsZWN0ZWQgdGV4dCB3aXRoCisgICAgICogaW5kZW50IGFkanVzdG1lbnQuICBBbnkgb3RoZXIgYnV0dG9uIGp1c3QgZG9lcyBhcyB1c3VhbC4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChjYXAtPm5jaGFyID49IEtfTEVGVE1PVVNFICYmIGNhcC0+bmNoYXIgPD0gS19SSUdIVFJFTEVBU0UpCisgICAgeworCSh2b2lkKWRvX21vdXNlKGNhcC0+b2FwLCBjYXAtPm5jaGFyLAorCQkgICAgICAgKGNhcC0+Y21kY2hhciA9PSAnXScpID8gRk9SV0FSRCA6IEJBQ0tXQVJELAorCQkgICAgICAgY2FwLT5jb3VudDEsIFBVVF9GSVhJTkRFTlQpOworICAgIH0KKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKgorICAgICAqICJbeiIgYW5kICJdeiI6IG1vdmUgdG8gc3RhcnQgb3IgZW5kIG9mIG9wZW4gZm9sZC4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChjYXAtPm5jaGFyID09ICd6JykKKyAgICB7CisJaWYgKGZvbGRNb3ZlVG8oRkFMU0UsIGNhcC0+Y21kY2hhciA9PSAnXScgPyBGT1JXQVJEIDogQkFDS1dBUkQsCisJCQkJCQkJIGNhcC0+Y291bnQxKSA9PSBGQUlMKQorCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKgorICAgICAqICJbYyIgYW5kICJdYyI6IG1vdmUgdG8gbmV4dCBvciBwcmV2aW91cyBkaWZmLWNoYW5nZS4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChjYXAtPm5jaGFyID09ICdjJykKKyAgICB7CisJaWYgKGRpZmZfbW92ZV90byhjYXAtPmNtZGNoYXIgPT0gJ10nID8gRk9SV0FSRCA6IEJBQ0tXQVJELAorCQkJCQkJCSBjYXAtPmNvdW50MSkgPT0gRkFJTCkKKwkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogTm90IGEgdmFsaWQgY2FwLT5uY2hhci4gKi8KKyAgICBlbHNlCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworfQorCisvKgorICogSGFuZGxlIE5vcm1hbCBtb2RlICIlIiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3BlcmNlbnQoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgcG9zX1QJKnBvczsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBsaW5lbnJfVAlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2VuZGlmCisKKyAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKyAgICBpZiAoY2FwLT5jb3VudDApCSAgICAvKiB7Y250fSUgOiBnb3RvIHtjbnR9IHBlcmNlbnRhZ2UgaW4gZmlsZSAqLworICAgIHsKKwlpZiAoY2FwLT5jb3VudDAgPiAxMDApCisJICAgIGNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwllbHNlCisJeworCSAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNTElORTsKKwkgICAgc2V0cGNtYXJrKCk7CisJICAgIC8qIFJvdW5kIHVwLCBzbyBDVFJMLUcgd2lsbCBnaXZlIHNhbWUgdmFsdWUuICBXYXRjaCBvdXQgZm9yIGEKKwkgICAgICogbGFyZ2UgbGluZSBjb3VudCwgdGhlIGxpbmUgbnVtYmVyIG11c3Qgbm90IGdvIG5lZ2F0aXZlISAqLworCSAgICBpZiAoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgPiAxMDAwMDAwKQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSAoY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgKyA5OUwpCisJCQkJCQkJIC8gMTAwTCAqIGNhcC0+Y291bnQwOworCSAgICBlbHNlCisJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IChjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCAqCisJCQkJCQkgICAgY2FwLT5jb3VudDAgKyA5OUwpIC8gMTAwTDsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkgICAgYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7CisJfQorICAgIH0KKyAgICBlbHNlCQkgICAgLyogIiUiIDogZ28gdG8gbWF0Y2hpbmcgcGFyZW4gKi8KKyAgICB7CisJY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisJY2FwLT5vYXAtPnVzZV9yZWdfb25lID0gVFJVRTsKKwlpZiAoKHBvcyA9IGZpbmRtYXRjaChjYXAtPm9hcCwgTlVMKSkgPT0gTlVMTCkKKwkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCWVsc2UKKwl7CisJICAgIHNldHBjbWFyaygpOworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gKnBvczsKKwkgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICBhZGp1c3RfZm9yX3NlbChjYXApOworI2VuZGlmCisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QCisJICAgICYmIGxudW0gIT0gY3Vyd2luLT53X2N1cnNvci5sbnVtCisJICAgICYmIChmZG9fZmxhZ3MgJiBGRE9fUEVSQ0VOVCkKKwkgICAgJiYgS2V5VHlwZWQpCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorfQorCisvKgorICogSGFuZGxlICIoIiBhbmQgIikiIGNvbW1hbmRzLgorICogY2FwLT5hcmcgaXMgQkFDS1dBUkQgZm9yICIoIiBhbmQgRk9SV0FSRCBmb3IgIikiLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2JyYWNlKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IE1DSEFSOworICAgIGNhcC0+b2FwLT51c2VfcmVnX29uZSA9IFRSVUU7CisgICAgaWYgKGNhcC0+Y21kY2hhciA9PSAnKScpCisJY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworICAgIGVsc2UKKwljYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKworICAgIGlmIChmaW5kc2VudChjYXAtPmFyZywgY2FwLT5jb3VudDEpID09IEZBSUwpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCWlmICgoZmRvX2ZsYWdzICYgRkRPX0JMT0NLKSAmJiBLZXlUeXBlZCAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApCisJICAgIGZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiAibSIgY29tbWFuZDogTWFyayBhIHBvc2l0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK252X21hcmsoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKCFjaGVja2NsZWFyb3AoY2FwLT5vYXApKQorICAgIHsKKwlpZiAoc2V0bWFyayhjYXAtPm5jaGFyKSA9PSBGQUlMKQorCSAgICBjbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgfQorfQorCisvKgorICogInsiIGFuZCAifSIgY29tbWFuZHMuCisgKiBjbWQtPmFyZyBpcyBCQUNLV0FSRCBmb3IgInsiIGFuZCBGT1JXQVJEIGZvciAifSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZmluZHBhcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisgICAgY2FwLT5vYXAtPnVzZV9yZWdfb25lID0gVFJVRTsKKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICBpZiAoIWZpbmRwYXIoY2FwLT5vYXAsIGNhcC0+YXJnLCBjYXAtPmNvdW50MSwgTlVMLCBGQUxTRSkpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCWlmICgoZmRvX2ZsYWdzICYgRkRPX0JMT0NLKSAmJiBLZXlUeXBlZCAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApCisJICAgIGZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiAidSIgY29tbWFuZDogVW5kbyBvciBtYWtlIGxvd2VyIGNhc2UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfdW5kbyhjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTE9XRVIKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICB8fCBWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwkvKiB0cmFuc2xhdGUgIjxWaXN1YWw+dSIgdG8gIjxWaXN1YWw+Z3UiIGFuZCAiZ3V1IiB0byAiZ3VndSIgKi8KKwljYXAtPmNtZGNoYXIgPSAnZyc7CisJY2FwLT5uY2hhciA9ICd1JzsKKwludl9vcGVyYXRvcihjYXApOworICAgIH0KKyAgICBlbHNlCisJbnZfa3VuZG8oY2FwKTsKK30KKworLyoKKyAqIDxVbmRvPiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2t1bmRvKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmICghY2hlY2tjbGVhcm9wcShjYXAtPm9hcCkpCisgICAgeworCXVfdW5kbygoaW50KWNhcC0+Y291bnQxKTsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlICJyIiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3JlcGxhY2UoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQloYWRfY3RybF92OworICAgIGxvbmcJbjsKKworICAgIGlmIChjaGVja2NsZWFyb3AoY2FwLT5vYXApKQorCXJldHVybjsKKworICAgIC8qIGdldCBhbm90aGVyIGNoYXJhY3RlciAqLworICAgIGlmIChjYXAtPm5jaGFyID09IEN0cmxfVikKKyAgICB7CisJaGFkX2N0cmxfdiA9IEN0cmxfVjsKKwljYXAtPm5jaGFyID0gZ2V0X2xpdGVyYWwoKTsKKwkvKiBEb24ndCByZWRvIGEgbXVsdGlieXRlIGNoYXJhY3RlciB3aXRoIENUUkwtVi4gKi8KKwlpZiAoY2FwLT5uY2hhciA+IERFTCkKKwkgICAgaGFkX2N0cmxfdiA9IE5VTDsKKyAgICB9CisgICAgZWxzZQorCWhhZF9jdHJsX3YgPSBOVUw7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIFZpc3VhbCBtb2RlICJyIiAqLworICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwludl9vcGVyYXRvcihjYXApOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICAvKiBCcmVhayB0YWJzLCBldGMuICovCisgICAgaWYgKHZpcnR1YWxfYWN0aXZlKCkpCisgICAgeworCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworCWlmIChnY2hhcl9jdXJzb3IoKSA9PSBOVUwpCisJeworCSAgICAvKiBBZGQgZXh0cmEgc3BhY2UgYW5kIHB1dCB0aGUgY3Vyc29yIG9uIHRoZSBmaXJzdCBvbmUuICovCisJICAgIGNvbGFkdmFuY2VfZm9yY2UoKGNvbG5yX1QpKGdldHZpc2NvbCgpICsgY2FwLT5jb3VudDEpKTsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgLT0gY2FwLT5jb3VudDE7CisJfQorCWVsc2UgaWYgKGdjaGFyX2N1cnNvcigpID09IFRBQikKKwkgICAgY29sYWR2YW5jZV9mb3JjZShnZXR2aXNjb2woKSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBhIHNwZWNpYWwga2V5IG9yIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byByZXBsYWNlLgorICAgICAqLworICAgIHB0ciA9IG1sX2dldF9jdXJzb3IoKTsKKyAgICBpZiAoSVNfU1BFQ0lBTChjYXAtPm5jaGFyKSB8fCBTVFJMRU4ocHRyKSA8ICh1bnNpZ25lZCljYXAtPmNvdW50MQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgKGhhc19tYnl0ZSAmJiBtYl9jaGFybGVuKHB0cikgPCBjYXAtPmNvdW50MSkKKyNlbmRpZgorCSAgICApCisgICAgeworCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXBsYWNpbmcgd2l0aCBhIFRBQiBpcyBkb25lIGJ5IGVkaXQoKSB3aGVuIGl0IGlzIGNvbXBsaWNhdGVkIGJlY2F1c2UKKyAgICAgKiAnZXhwYW5kdGFiJyBvciAnc21hcnR0YWInIGlzIHNldC4gIENUUkwtViBUQUIgaW5zZXJ0cyBhIGxpdGVyYWwgVEFCLgorICAgICAqIE90aGVyIGNoYXJhY3RlcnMgYXJlIGRvbmUgYmVsb3cgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0aGluZ3MgbGlrZQorICAgICAqIENUUkwtViAwNDggKGZvciBlZGl0KCkgdGhpcyB3b3VsZCBiZSBSIENUUkwtViAwIEVTQykuCisgICAgICovCisgICAgaWYgKGhhZF9jdHJsX3YgIT0gQ3RybF9WICYmIGNhcC0+bmNoYXIgPT0gJ1x0JyAmJiAoY3VyYnVmLT5iX3BfZXQgfHwgcF9zdGEpKQorICAgIHsKKwlzdHVmZm51bVJlYWRidWZmKGNhcC0+Y291bnQxKTsKKwlzdHVmZmNoYXJSZWFkYnVmZignUicpOworCXN0dWZmY2hhclJlYWRidWZmKCdcdCcpOworCXN0dWZmY2hhclJlYWRidWZmKEVTQyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIHNhdmUgbGluZSBmb3IgdW5kbyAqLworICAgIGlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICBpZiAoaGFkX2N0cmxfdiAhPSBDdHJsX1YgJiYgKGNhcC0+bmNoYXIgPT0gJ1xyJyB8fCBjYXAtPm5jaGFyID09ICdcbicpKQorICAgIHsKKwkvKgorCSAqIFJlcGxhY2UgY2hhcmFjdGVyKHMpIGJ5IGEgc2luZ2xlIG5ld2xpbmUuCisJICogU3RyYW5nZSB2aSBiZWhhdmlvdXI6IE9ubHkgb25lIG5ld2xpbmUgaXMgaW5zZXJ0ZWQuCisJICogRGVsZXRlIHRoZSBjaGFyYWN0ZXJzIGhlcmUuCisJICogSW5zZXJ0IHRoZSBuZXdsaW5lIHdpdGggYW4gaW5zZXJ0IGNvbW1hbmQsIHRha2VzIGNhcmUgb2YKKwkgKiBhdXRvaW5kZW50LglUaGUgaW5zZXJ0IGNvbW1hbmQgZGVwZW5kcyBvbiBiZWluZyBvbiB0aGUgbGFzdAorCSAqIGNoYXJhY3RlciBvZiBhIGxpbmUgb3Igbm90LgorCSAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkodm9pZClkZWxfY2hhcnMoY2FwLT5jb3VudDEsIEZBTFNFKTsJLyogZGVsZXRlIHRoZSBjaGFyYWN0ZXJzICovCisjZWxzZQorCSh2b2lkKWRlbF9ieXRlcyhjYXAtPmNvdW50MSwgRkFMU0UpOwkvKiBkZWxldGUgdGhlIGNoYXJhY3RlcnMgKi8KKyNlbmRpZgorCXN0dWZmY2hhclJlYWRidWZmKCdccicpOworCXN0dWZmY2hhclJlYWRidWZmKEVTQyk7CisKKwkvKiBHaXZlICdyJyB0byBlZGl0KCksIHRvIGdldCB0aGUgcmVkbyBjb21tYW5kIHJpZ2h0LiAqLworCWludm9rZV9lZGl0KGNhcCwgVFJVRSwgJ3InLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJlcF9yZWRvKGNhcC0+b2FwLT5yZWduYW1lLCBjYXAtPmNvdW50MSwKKwkJCQkgICAgICAgTlVMLCAncicsIE5VTCwgaGFkX2N0cmxfdiwgY2FwLT5uY2hhcik7CisKKwljdXJidWYtPmJfb3Bfc3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgaW50CQlvbGRfU3RhdGUgPSBTdGF0ZTsKKworCSAgICBpZiAoY2FwLT5uY2hhckMxICE9IDApCisJCUFwcGVuZENoYXJUb1JlZG9idWZmKGNhcC0+bmNoYXJDMSk7CisJICAgIGlmIChjYXAtPm5jaGFyQzIgIT0gMCkKKwkJQXBwZW5kQ2hhclRvUmVkb2J1ZmYoY2FwLT5uY2hhckMyKTsKKworCSAgICAvKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCBoYW5kbGVzIHJlcGxhY2luZyBhIHNpbmdsZS1ieXRlIHdpdGggYQorCSAgICAgKiBtdWx0aS1ieXRlIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gIEFsc28gaGFuZGxlcyBhZGRpbmcKKwkgICAgICogY29tcG9zaW5nIGNoYXJhY3RlcnMgZm9yIHV0Zi04LiAqLworCSAgICBmb3IgKG4gPSBjYXAtPmNvdW50MTsgbiA+IDA7IC0tbikKKwkgICAgeworCQlTdGF0ZSA9IFJFUExBQ0U7CisJCWluc19jaGFyKGNhcC0+bmNoYXIpOworCQlTdGF0ZSA9IG9sZF9TdGF0ZTsKKwkJaWYgKGNhcC0+bmNoYXJDMSAhPSAwKQorCQkgICAgaW5zX2NoYXIoY2FwLT5uY2hhckMxKTsKKwkJaWYgKGNhcC0+bmNoYXJDMiAhPSAwKQorCQkgICAgaW5zX2NoYXIoY2FwLT5uY2hhckMyKTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIFJlcGxhY2UgdGhlIGNoYXJhY3RlcnMgd2l0aGluIG9uZSBsaW5lLgorCSAgICAgKi8KKwkgICAgZm9yIChuID0gY2FwLT5jb3VudDE7IG4gPiAwOyAtLW4pCisJICAgIHsKKwkJLyoKKwkJICogR2V0IHB0ciBhZ2FpbiwgYmVjYXVzZSB1X3NhdmUgYW5kL29yIHNob3dtYXRjaCgpIHdpbGwgaGF2ZQorCQkgKiByZWxlYXNlZCB0aGUgbGluZS4gIEF0IHRoZSBzYW1lIHRpbWUgd2UgbGV0IGtub3cgdGhhdCB0aGUKKwkJICogbGluZSB3aWxsIGJlIGNoYW5nZWQuCisJCSAqLworCQlwdHIgPSBtbF9nZXRfYnVmKGN1cmJ1ZiwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBUUlVFKTsKKwkJcHRyW2N1cndpbi0+d19jdXJzb3IuY29sXSA9IGNhcC0+bmNoYXI7CisJCWlmIChwX3NtICYmIG1zZ19zaWxlbnQgPT0gMCkKKwkJICAgIHNob3dtYXRjaChjYXAtPm5jaGFyKTsKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgfQorI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCSAgICBpZiAodXNpbmdOZXRiZWFucykKKwkgICAgeworCQljb2xucl9UIHN0YXJ0ID0gKGNvbG5yX1QpKGN1cndpbi0+d19jdXJzb3IuY29sIC0gY2FwLT5jb3VudDEpOworCisJCW5ldGJlYW5zX2luc2VydGVkKGN1cmJ1ZiwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBzdGFydCwKKwkJCSAgICAgKGludCljYXAtPmNvdW50MSwgJnB0cltzdGFydF0sIChpbnQpY2FwLT5jb3VudDEpOworCSAgICB9CisjZW5kaWYKKworCSAgICAvKiBtYXJrIHRoZSBidWZmZXIgYXMgY2hhbmdlZCBhbmQgcHJlcGFyZSBmb3IgZGlzcGxheWluZyAqLworCSAgICBjaGFuZ2VkX2J5dGVzKGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJCSAgICAgICAoY29sbnJfVCkoY3Vyd2luLT53X2N1cnNvci5jb2wgLSBjYXAtPmNvdW50MSkpOworCX0KKwktLWN1cndpbi0+d19jdXJzb3IuY29sOwkgICAgLyogY3Vyc29yIG9uIHRoZSBsYXN0IHJlcGxhY2VkIGNoYXIgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJLyogaWYgdGhlIGNoYXJhY3RlciBvbiB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBjdXJzb3IgaXMgYSBtdWx0aS1ieXRlCisJICogY2hhcmFjdGVyLCBtb3ZlIHR3byBjaGFyYWN0ZXJzIGxlZnQgKi8KKwlpZiAoaGFzX21ieXRlKQorCSAgICBtYl9hZGp1c3RfY3Vyc29yKCk7CisjZW5kaWYKKwljdXJidWYtPmJfb3BfZW5kID0gY3Vyd2luLT53X2N1cnNvcjsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwlzZXRfbGFzdF9pbnNlcnQoY2FwLT5uY2hhcik7CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiAnbyc6IEV4Y2hhbmdlIHN0YXJ0IGFuZCBlbmQgb2YgVmlzdWFsIGFyZWEuCisgKiAnTyc6IHNhbWUsIGJ1dCBpbiBibG9jayBtb2RlIGV4Y2hhbmdlIGxlZnQgYW5kIHJpZ2h0IGNvcm5lcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordl9zd2FwX2Nvcm5lcnMoY21kY2hhcikKKyAgICBpbnQJCWNtZGNoYXI7Cit7CisgICAgcG9zX1QJb2xkX2N1cnNvcjsKKyAgICBjb2xucl9UCWxlZnQsIHJpZ2h0OworCisgICAgaWYgKGNtZGNoYXIgPT0gJ08nICYmIFZJc3VhbF9tb2RlID09IEN0cmxfVikKKyAgICB7CisJb2xkX2N1cnNvciA9IGN1cndpbi0+d19jdXJzb3I7CisJZ2V0dmNvbHMoY3Vyd2luLCAmb2xkX2N1cnNvciwgJlZJc3VhbCwgJmxlZnQsICZyaWdodCk7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gVklzdWFsLmxudW07CisJY29sYWR2YW5jZShsZWZ0KTsKKwlWSXN1YWwgPSBjdXJ3aW4tPndfY3Vyc29yOworCisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gb2xkX2N1cnNvci5sbnVtOworCWN1cndpbi0+d19jdXJzd2FudCA9IHJpZ2h0OworCS8qICdzZWxlY3Rpb24gImV4Y2x1c2l2ZSIgYW5kIGN1cnNvciBhdCByaWdodC1ib3R0b20gY29ybmVyOiBtb3ZlIGl0CisJICogcmlnaHQgb25lIGNvbHVtbiAqLworCWlmIChvbGRfY3Vyc29yLmxudW0gPj0gVklzdWFsLmxudW0gJiYgKnBfc2VsID09ICdlJykKKwkgICAgKytjdXJ3aW4tPndfY3Vyc3dhbnQ7CisJY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA9PSBvbGRfY3Vyc29yLmNvbAorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJJiYgKCF2aXJ0dWFsX2FjdGl2ZSgpCisJCSAgICB8fCBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9PSBvbGRfY3Vyc29yLmNvbGFkZCkKKyNlbmRpZgorCQkpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBWSXN1YWwubG51bTsKKwkgICAgaWYgKG9sZF9jdXJzb3IubG51bSA8PSBWSXN1YWwubG51bSAmJiAqcF9zZWwgPT0gJ2UnKQorCQkrK3JpZ2h0OworCSAgICBjb2xhZHZhbmNlKHJpZ2h0KTsKKwkgICAgVklzdWFsID0gY3Vyd2luLT53X2N1cnNvcjsKKworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvbGRfY3Vyc29yLmxudW07CisJICAgIGNvbGFkdmFuY2UobGVmdCk7CisJICAgIGN1cndpbi0+d19jdXJzd2FudCA9IGxlZnQ7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCW9sZF9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworCWN1cndpbi0+d19jdXJzb3IgPSBWSXN1YWw7CisJVklzdWFsID0gb2xkX2N1cnNvcjsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9WSVNVQUwgKi8KKworLyoKKyAqICJSIiAoY2FwLT5hcmcgaXMgRkFMU0UpIGFuZCAiZ1IiIChjYXAtPmFyZyBpcyBUUlVFKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9SZXBsYWNlKGNhcCkKKyAgICBjbWRhcmdfVAkgICAgKmNhcDsKK3sKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQkJLyogIlIiIGlzIHJlcGxhY2UgbGluZXMgKi8KKyAgICB7CisJY2FwLT5jbWRjaGFyID0gJ2MnOworCWNhcC0+bmNoYXIgPSBOVUw7CisJVklzdWFsX21vZGUgPSAnVic7CisJbnZfb3BlcmF0b3IoY2FwKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJaWYgKCFjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKyAgICB7CisJaWYgKCFjdXJidWYtPmJfcF9tYSkKKwkgICAgRU1TRyhfKGVfbW9kaWZpYWJsZSkpOworCWVsc2UKKwl7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBpZiAodmlydHVhbF9hY3RpdmUoKSkKKwkJY29sYWR2YW5jZShnZXR2aXNjb2woKSk7CisjZW5kaWYKKwkgICAgaW52b2tlX2VkaXQoY2FwLCBGQUxTRSwgY2FwLT5hcmcgPyAnVicgOiAnUicsIEZBTFNFKTsKKwl9CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9WUkVQTEFDRQorLyoKKyAqICJnciIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfdnJlcGxhY2UoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisjIGlmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCWNhcC0+Y21kY2hhciA9ICdyJzsKKwljYXAtPm5jaGFyID0gY2FwLT5leHRyYV9jaGFyOworCW52X3JlcGxhY2UoY2FwKTsJLyogRG8gc2FtZSBhcyAiciIgaW4gVmlzdWFsIG1vZGUgZm9yIG5vdyAqLworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisJaWYgKCFjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKyAgICB7CisJaWYgKCFjdXJidWYtPmJfcF9tYSkKKwkgICAgRU1TRyhfKGVfbW9kaWZpYWJsZSkpOworCWVsc2UKKwl7CisJICAgIGlmIChjYXAtPmV4dHJhX2NoYXIgPT0gQ3RybF9WKQkvKiBnZXQgYW5vdGhlciBjaGFyYWN0ZXIgKi8KKwkJY2FwLT5leHRyYV9jaGFyID0gZ2V0X2xpdGVyYWwoKTsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoY2FwLT5leHRyYV9jaGFyKTsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoRVNDKTsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBpZiAodmlydHVhbF9hY3RpdmUoKSkKKwkJY29sYWR2YW5jZShnZXR2aXNjb2woKSk7CisjIGVuZGlmCisJICAgIGludm9rZV9lZGl0KGNhcCwgVFJVRSwgJ3YnLCBGQUxTRSk7CisJfQorICAgIH0KK30KKyNlbmRpZgorCisvKgorICogU3dhcCBjYXNlIGZvciAifiIgY29tbWFuZCwgd2hlbiBpdCBkb2VzIG5vdCB3b3JrIGxpa2UgYW4gb3BlcmF0b3IuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbl9zd2FwY2hhcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBsb25nCW47CisgICAgcG9zX1QJc3RhcnRwb3M7CisgICAgaW50CQlkaWRfY2hhbmdlID0gMDsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBwb3NfVAlwb3M7CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQljb3VudDsKKyNlbmRpZgorCisgICAgaWYgKGNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorCXJldHVybjsKKworICAgIGlmIChsaW5lZW1wdHkoY3Vyd2luLT53X2N1cnNvci5sbnVtKSAmJiB2aW1fc3RyY2hyKHBfd3csICd+JykgPT0gTlVMTCkKKyAgICB7CisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCXJldHVybjsKKyAgICB9CisKKyAgICBwcmVwX3JlZG9fY21kKGNhcCk7CisKKyAgICBpZiAodV9zYXZlX2N1cnNvcigpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgc3RhcnRwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworI2lmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworICAgIHBvcyA9IHN0YXJ0cG9zOworI2VuZGlmCisgICAgZm9yIChuID0gY2FwLT5jb3VudDE7IG4gPiAwOyAtLW4pCisgICAgeworCWRpZF9jaGFuZ2UgfD0gc3dhcGNoYXIoY2FwLT5vYXAtPm9wX3R5cGUsICZjdXJ3aW4tPndfY3Vyc29yKTsKKwlpbmNfY3Vyc29yKCk7CisJaWYgKGdjaGFyX2N1cnNvcigpID09IE5VTCkKKwl7CisJICAgIGlmICh2aW1fc3RyY2hyKHBfd3csICd+JykgIT0gTlVMTAorCQkgICAgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkJaWYgKHVzaW5nTmV0YmVhbnMpCisJCXsKKwkJICAgIGlmIChkaWRfY2hhbmdlKQorCQkgICAgeworCQkJcHRyID0gbWxfZ2V0KHBvcy5sbnVtKTsKKwkJCWNvdW50ID0gU1RSTEVOKHB0cikgLSBwb3MuY29sOworCQkJbmV0YmVhbnNfaW5zZXJ0ZWQoY3VyYnVmLCBwb3MubG51bSwgcG9zLmNvbCwKKwkJCQkJCSBjb3VudCwgJnB0cltwb3MuY29sXSwgY291bnQpOworCQkgICAgfQorCQkgICAgcG9zLmNvbCA9IDA7CisJCSAgICBwb3MubG51bSsrOworCQl9CisjZW5kaWYKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwkJaWYgKG4gPiAxKQorCQl7CisJCSAgICBpZiAodV9zYXZlc3ViKGN1cndpbi0+d19jdXJzb3IubG51bSkgPT0gRkFJTCkKKwkJCWJyZWFrOworCQkgICAgdV9jbGVhcmxpbmUoKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJYnJlYWs7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBpZiAoZGlkX2NoYW5nZSAmJiB1c2luZ05ldGJlYW5zKQorICAgIHsKKwlwdHIgPSBtbF9nZXQocG9zLmxudW0pOworCWNvdW50ID0gY3Vyd2luLT53X2N1cnNvci5jb2wgLSBwb3MuY29sOworCW5ldGJlYW5zX2luc2VydGVkKGN1cmJ1ZiwgcG9zLmxudW0sIHBvcy5jb2wsCisJCQkJCQkgY291bnQsICZwdHJbcG9zLmNvbF0sIGNvdW50KTsKKyAgICB9CisjZW5kaWYKKworCisgICAgY2hlY2tfY3Vyc29yKCk7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisgICAgaWYgKGRpZF9jaGFuZ2UpCisgICAgeworCWNoYW5nZWRfbGluZXMoc3RhcnRwb3MubG51bSwgc3RhcnRwb3MuY29sLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyAxLAorCQkJCQkJCQkJICAwTCk7CisJY3VyYnVmLT5iX29wX3N0YXJ0ID0gc3RhcnRwb3M7CisJY3VyYnVmLT5iX29wX2VuZCA9IGN1cndpbi0+d19jdXJzb3I7CisJaWYgKGN1cmJ1Zi0+Yl9vcF9lbmQuY29sID4gMCkKKwkgICAgLS1jdXJidWYtPmJfb3BfZW5kLmNvbDsKKyAgICB9Cit9CisKKy8qCisgKiBNb3ZlIGN1cnNvciB0byBtYXJrLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2N1cnNvcm1hcmsoY2FwLCBmbGFnLCBwb3MpCisgICAgY21kYXJnX1QJKmNhcDsKKyAgICBpbnQJCWZsYWc7CisgICAgcG9zX1QJKnBvczsKK3sKKyAgICBpZiAoY2hlY2tfbWFyayhwb3MpID09IEZBSUwpCisJY2xlYXJvcChjYXAtPm9hcCk7CisgICAgZWxzZQorICAgIHsKKwlpZiAoY2FwLT5jbWRjaGFyID09ICdcJycKKwkJfHwgY2FwLT5jbWRjaGFyID09ICdgJworCQl8fCBjYXAtPmNtZGNoYXIgPT0gJ1snCisJCXx8IGNhcC0+Y21kY2hhciA9PSAnXScpCisJICAgIHNldHBjbWFyaygpOworCWN1cndpbi0+d19jdXJzb3IgPSAqcG9zOworCWlmIChmbGFnKQorCSAgICBiZWdpbmxpbmUoQkxfV0hJVEUgfCBCTF9GSVgpOworCWVsc2UKKwkgICAgY2hlY2tfY3Vyc29yKCk7CisgICAgfQorICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IGZsYWcgPyBNTElORSA6IE1DSEFSOworICAgIGlmIChjYXAtPmNtZGNoYXIgPT0gJ2AnKQorCWNhcC0+b2FwLT51c2VfcmVnX29uZSA9IFRSVUU7CisgICAgY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOwkJLyogaWdub3JlZCBpZiBub3QgTUNIQVIgKi8KKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKK30KKworI2lmZGVmIEZFQVRfVklTVUFMCisvKgorICogSGFuZGxlIGNvbW1hbmRzIHRoYXQgYXJlIG9wZXJhdG9ycyBpbiBWaXN1YWwgbW9kZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCit2X3Zpc29wKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIHN0YXRpYyBjaGFyX3UgdHJhbnNbXSA9ICJZeURkQ2N4ZFhkQUFJSXJyIjsKKworICAgIC8qIFVwcGVyY2FzZSBtZWFucyBsaW5ld2lzZSwgZXhjZXB0IGluIGJsb2NrIG1vZGUsIHRoZW4gIkQiIGRlbGV0ZXMgdGlsbAorICAgICAqIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGFuZCAiQyIgcmVwbGFjZXMgdGlsIEVPTCAqLworICAgIGlmIChpc3VwcGVyKGNhcC0+Y21kY2hhcikpCisgICAgeworCWlmIChWSXN1YWxfbW9kZSAhPSBDdHJsX1YpCisJICAgIFZJc3VhbF9tb2RlID0gJ1YnOworCWVsc2UgaWYgKGNhcC0+Y21kY2hhciA9PSAnQycgfHwgY2FwLT5jbWRjaGFyID09ICdEJykKKwkgICAgY3Vyd2luLT53X2N1cnN3YW50ID0gTUFYQ09MOworICAgIH0KKyAgICBjYXAtPmNtZGNoYXIgPSAqKHZpbV9zdHJjaHIodHJhbnMsIGNhcC0+Y21kY2hhcikgKyAxKTsKKyAgICBudl9vcGVyYXRvcihjYXApOworfQorI2VuZGlmCisKKy8qCisgKiAicyIgYW5kICJTIiBjb21tYW5kcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9zdWJzdChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQkvKiAidnMiIGFuZCAidlMiIGFyZSB0aGUgc2FtZSBhcyAidmMiICovCisgICAgeworCWlmIChjYXAtPmNtZGNoYXIgPT0gJ1MnKQorCSAgICBWSXN1YWxfbW9kZSA9ICdWJzsKKwljYXAtPmNtZGNoYXIgPSAnYyc7CisJbnZfb3BlcmF0b3IoY2FwKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJbnZfb3B0cmFucyhjYXApOworfQorCisvKgorICogQWJicmV2aWF0ZWQgY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfYWJicmV2KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmIChjYXAtPmNtZGNoYXIgPT0gS19ERUwgfHwgY2FwLT5jbWRjaGFyID09IEtfS0RFTCkKKwljYXAtPmNtZGNoYXIgPSAneCc7CQkvKiBERUwga2V5IGJlaGF2ZXMgbGlrZSAneCcgKi8KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyogaW4gVmlzdWFsIG1vZGUgdGhlc2UgY29tbWFuZHMgYXJlIG9wZXJhdG9ycyAqLworICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCXZfdmlzb3AoY2FwKTsKKyAgICBlbHNlCisjZW5kaWYKKwludl9vcHRyYW5zKGNhcCk7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgYSBjb21tYW5kIGludG8gYW5vdGhlciBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X29wdHJhbnMoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgc3RhdGljIGNoYXJfdSAqKGFyWzhdKSA9IHsoY2hhcl91ICopImRsIiwgKGNoYXJfdSAqKSJkaCIsCisJCQkgICAgICAoY2hhcl91ICopImQkIiwgKGNoYXJfdSAqKSJjJCIsCisJCQkgICAgICAoY2hhcl91ICopImNsIiwgKGNoYXJfdSAqKSJjYyIsCisJCQkgICAgICAoY2hhcl91ICopInl5IiwgKGNoYXJfdSAqKSI6c1xyIn07CisgICAgc3RhdGljIGNoYXJfdSAqc3RyID0gKGNoYXJfdSAqKSJ4WERDc1NZJiI7CisKKyAgICBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorICAgIHsKKwlpZiAoY2FwLT5jb3VudDApCisJICAgIHN0dWZmbnVtUmVhZGJ1ZmYoY2FwLT5jb3VudDApOworCXN0dWZmUmVhZGJ1ZmYoYXJbKGludCkodmltX3N0cmNocihzdHIsIGNhcC0+Y21kY2hhcikgLSBzdHIpXSk7CisgICAgfQorICAgIGNhcC0+b3Bjb3VudCA9IDA7Cit9CisKKy8qCisgKiAiJyIgYW5kICJgIiBjb21tYW5kcy4gIEFsc28gZm9yICJnJyIgYW5kICJnYCIuCisgKiBjYXAtPmFyZyBpcyBUUlVFIGZvciAiJyIgYW5kICJnJyIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZ29tYXJrKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIHBvc19UCSpwb3M7CisgICAgaW50CQljOworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGxpbmVucl9UCWxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgaW50CQlvbGRfS2V5VHlwZWQgPSBLZXlUeXBlZDsgICAgLyogZ2V0dGluZyBmaWxlIG1heSByZXNldCBpdCAqLworI2VuZGlmCisKKyAgICBpZiAoY2FwLT5jbWRjaGFyID09ICdnJykKKwljID0gY2FwLT5leHRyYV9jaGFyOworICAgIGVsc2UKKwljID0gY2FwLT5uY2hhcjsKKyAgICBwb3MgPSBnZXRtYXJrKGMsIChjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApKTsKKyAgICBpZiAocG9zID09IChwb3NfVCAqKS0xKQkgICAgLyoganVtcGVkIHRvIG90aGVyIGZpbGUgKi8KKyAgICB7CisJaWYgKGNhcC0+YXJnKQorCXsKKwkgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKwkgICAgYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKwl9CisJZWxzZQorCSAgICBjaGVja19jdXJzb3IoKTsKKyAgICB9CisgICAgZWxzZQorCW52X2N1cnNvcm1hcmsoY2FwLCBjYXAtPmFyZywgcG9zKTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICAvKiBNYXkgbmVlZCB0byBjbGVhciB0aGUgY29sYWRkIHRoYXQgYSBtYXJrIGluY2x1ZGVzLiAqLworICAgIGlmICghdmlydHVhbF9hY3RpdmUoKSkKKwljdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QCisJICAgICYmIChwb3MgPT0gKHBvc19UICopLTEgfHwgbG51bSAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgICYmIChmZG9fZmxhZ3MgJiBGRE9fTUFSSykKKwkgICAgJiYgb2xkX0tleVR5cGVkKQorCWZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKK30KKworLyoKKyAqIEhhbmRsZSBDVFJMLU8sIENUUkwtSSwgImc7IiBhbmQgImcsIiBjb21tYW5kcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9wY21hcmsoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIHBvc19UCSpwb3M7CisjIGlmZGVmIEZFQVRfRk9MRElORworICAgIGxpbmVucl9UCWxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgaW50CQlvbGRfS2V5VHlwZWQgPSBLZXlUeXBlZDsgICAgLyogZ2V0dGluZyBmaWxlIG1heSByZXNldCBpdCAqLworIyBlbmRpZgorCisgICAgaWYgKCFjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKyAgICB7CisJaWYgKGNhcC0+Y21kY2hhciA9PSAnZycpCisJICAgIHBvcyA9IG1vdmVjaGFuZ2VsaXN0KChpbnQpY2FwLT5jb3VudDEpOworCWVsc2UKKwkgICAgcG9zID0gbW92ZW1hcmsoKGludCljYXAtPmNvdW50MSk7CisJaWYgKHBvcyA9PSAocG9zX1QgKiktMSkJCS8qIGp1bXAgdG8gb3RoZXIgZmlsZSAqLworCXsKKwkgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisJICAgIGNoZWNrX2N1cnNvcigpOworCX0KKwllbHNlIGlmIChwb3MgIT0gTlVMTCkJCSAgICAvKiBjYW4ganVtcCAqLworCSAgICBudl9jdXJzb3JtYXJrKGNhcCwgRkFMU0UsIHBvcyk7CisJZWxzZSBpZiAoY2FwLT5jbWRjaGFyID09ICdnJykKKwl7CisJICAgIGlmIChjdXJidWYtPmJfY2hhbmdlbGlzdGxlbiA9PSAwKQorCQlFTVNHKF8oIkU2NjQ6IGNoYW5nZWxpc3QgaXMgZW1wdHkiKSk7CisJICAgIGVsc2UgaWYgKGNhcC0+Y291bnQxIDwgMCkKKwkJRU1TRyhfKCJFNjYyOiBBdCBzdGFydCBvZiBjaGFuZ2VsaXN0IikpOworCSAgICBlbHNlCisJCUVNU0coXygiRTY2MzogQXQgZW5kIG9mIGNoYW5nZWxpc3QiKSk7CisJfQorCWVsc2UKKwkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfTk9QCisJCSYmIChwb3MgPT0gKHBvc19UICopLTEgfHwgbG51bSAhPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJCSYmIChmZG9fZmxhZ3MgJiBGRE9fTUFSSykKKwkJJiYgb2xkX0tleVR5cGVkKQorCSAgICBmb2xkT3BlbkN1cnNvcigpOworIyBlbmRpZgorICAgIH0KKyNlbHNlCisgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworI2VuZGlmCit9CisKKy8qCisgKiBIYW5kbGUgJyInIGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfcmVnbmFtZShjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKwlyZXR1cm47CisjaWZkZWYgRkVBVF9FVkFMCisgICAgaWYgKGNhcC0+bmNoYXIgPT0gJz0nKQorCWNhcC0+bmNoYXIgPSBnZXRfZXhwcl9yZWdpc3RlcigpOworI2VuZGlmCisgICAgaWYgKGNhcC0+bmNoYXIgIT0gTlVMICYmIHZhbGlkX3lhbmtfcmVnKGNhcC0+bmNoYXIsIEZBTFNFKSkKKyAgICB7CisJY2FwLT5vYXAtPnJlZ25hbWUgPSBjYXAtPm5jaGFyOworCWNhcC0+b3Bjb3VudCA9IGNhcC0+Y291bnQwOwkvKiByZW1lbWJlciBjb3VudCBiZWZvcmUgJyInICovCisjaWZkZWYgRkVBVF9FVkFMCisJc2V0X3JlZ192YXIoY2FwLT5vYXAtPnJlZ25hbWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKwljbGVhcm9wYmVlcChjYXAtPm9hcCk7Cit9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorLyoKKyAqIEhhbmRsZSAidiIsICJWIiBhbmQgIkNUUkwtViIgY29tbWFuZHMuCisgKiBBbHNvIGZvciAiZ2giLCAiZ0giIGFuZCAiZ15IIiBjb21tYW5kczogQWx3YXlzIHN0YXJ0IFNlbGVjdCBtb2RlLCBjYXAtPmFyZworICogaXMgVFJVRS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl92aXN1YWwoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgLyogJ3YnLCAnVicgYW5kIENUUkwtViBjYW4gYmUgdXNlZCB3aGlsZSBhbiBvcGVyYXRvciBpcyBwZW5kaW5nIHRvIG1ha2UgaXQKKyAgICAgKiBjaGFyYWN0ZXJ3aXNlLCBsaW5ld2lzZSwgb3IgYmxvY2t3aXNlLiAqLworICAgIGlmIChjYXAtPm9hcC0+b3BfdHlwZSAhPSBPUF9OT1ApCisgICAgeworCWNhcC0+b2FwLT5tb3Rpb25fZm9yY2UgPSBjYXAtPmNtZGNoYXI7CisJZmluaXNoX29wID0gRkFMU0U7CS8qIG9wZXJhdG9yIGRvZXNuJ3QgZmluaXNoIG5vdyBidXQgbGF0ZXIgKi8KKwlyZXR1cm47CisgICAgfQorCisgICAgVklzdWFsX3NlbGVjdCA9IGNhcC0+YXJnOworICAgIGlmIChWSXN1YWxfYWN0aXZlKQkgICAgLyogY2hhbmdlIFZpc3VhbCBtb2RlICovCisgICAgeworCWlmIChWSXN1YWxfbW9kZSA9PSBjYXAtPmNtZGNoYXIpICAgIC8qIHN0b3AgdmlzdWFsIG1vZGUgKi8KKwkgICAgZW5kX3Zpc3VhbF9tb2RlKCk7CisJZWxzZQkJCQkgICAgLyogdG9nZ2xlIGNoYXIvYmxvY2sgbW9kZSAqLworCXsJCQkJICAgIC8qCSAgIG9yIGNoYXIvbGluZSBtb2RlICovCisJICAgIFZJc3VhbF9tb2RlID0gY2FwLT5jbWRjaGFyOworCSAgICBzaG93bW9kZSgpOworCX0KKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsJICAgIC8qIHVwZGF0ZSB0aGUgaW52ZXJzaW9uICovCisgICAgfQorICAgIGVsc2UJCSAgICAvKiBzdGFydCBWaXN1YWwgbW9kZSAqLworICAgIHsKKwljaGVja192aXN1YWxfaGlnaGxpZ2h0KCk7CisJaWYgKGNhcC0+Y291bnQwKQkJICAgIC8qIHVzZSBwcmV2aW91c2x5IHNlbGVjdGVkIHBhcnQgKi8KKwl7CisJICAgIGlmIChyZXNlbF9WSXN1YWxfbW9kZSA9PSBOVUwpICAgLyogdGhlcmUgaXMgbm9uZSAqLworCSAgICB7CisJCWJlZXBfZmx1c2goKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIFZJc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CisKKwkgICAgVklzdWFsX2FjdGl2ZSA9IFRSVUU7CisJICAgIFZJc3VhbF9yZXNlbGVjdCA9IFRSVUU7CisJICAgIGlmICghY2FwLT5hcmcpCisJCS8qIHN0YXJ0IFNlbGVjdCBtb2RlIHdoZW4gJ3NlbGVjdG1vZGUnIGNvbnRhaW5zICJjbWQiICovCisJCW1heV9zdGFydF9zZWxlY3QoJ2MnKTsKKyNpZmRlZiBGRUFUX01PVVNFCisJICAgIHNldG1vdXNlKCk7CisjZW5kaWYKKwkgICAgaWYgKHBfc21kKQorCQlyZWRyYXdfY21kbGluZSA9IFRSVUU7CSAgICAvKiBzaG93IHZpc3VhbCBtb2RlIGxhdGVyICovCisJICAgIC8qCisJICAgICAqIEZvciBWIGFuZCBeViwgd2UgbXVsdGlwbHkgdGhlIG51bWJlciBvZiBsaW5lcyBldmVuIGlmIHRoZXJlCisJICAgICAqIHdhcyBvbmx5IG9uZSAtLSB3ZWJiCisJICAgICAqLworCSAgICBpZiAocmVzZWxfVklzdWFsX21vZGUgIT0gJ3YnIHx8IHJlc2VsX1ZJc3VhbF9saW5lX2NvdW50ID4gMSkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gKz0KKwkJCQkgICAgcmVzZWxfVklzdWFsX2xpbmVfY291bnQgKiBjYXAtPmNvdW50MCAtIDE7CisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCSAgICB9CisJICAgIFZJc3VhbF9tb2RlID0gcmVzZWxfVklzdWFsX21vZGU7CisJICAgIGlmIChWSXN1YWxfbW9kZSA9PSAndicpCisJICAgIHsKKwkJaWYgKHJlc2VsX1ZJc3VhbF9saW5lX2NvdW50IDw9IDEpCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCArPSByZXNlbF9WSXN1YWxfY29sICogY2FwLT5jb3VudDAgLSAxOworCQllbHNlCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHJlc2VsX1ZJc3VhbF9jb2w7CisJCWNoZWNrX2N1cnNvcl9jb2woKTsKKwkgICAgfQorCSAgICBpZiAocmVzZWxfVklzdWFsX2NvbCA9PSBNQVhDT0wpCisJICAgIHsKKwkJY3Vyd2luLT53X2N1cnN3YW50ID0gTUFYQ09MOworCQljb2xhZHZhbmNlKChjb2xucl9UKU1BWENPTCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoVklzdWFsX21vZGUgPT0gQ3RybF9WKQorCSAgICB7CisJCXZhbGlkYXRlX3ZpcnRjb2woKTsKKwkJY3Vyd2luLT53X2N1cnN3YW50ID0gY3Vyd2luLT53X3ZpcnRjb2wKKwkJCQkJICsgcmVzZWxfVklzdWFsX2NvbCAqIGNhcC0+Y291bnQwIC0gMTsKKwkJY29sYWR2YW5jZShjdXJ3aW4tPndfY3Vyc3dhbnQpOworCSAgICB9CisJICAgIGVsc2UKKwkJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURUQpOwkvKiBzaG93IHRoZSBpbnZlcnNpb24gKi8KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKCFjYXAtPmFyZykKKwkJLyogc3RhcnQgU2VsZWN0IG1vZGUgd2hlbiAnc2VsZWN0bW9kZScgY29udGFpbnMgImNtZCIgKi8KKwkJbWF5X3N0YXJ0X3NlbGVjdCgnYycpOworCSAgICBuX3N0YXJ0X3Zpc3VhbF9tb2RlKGNhcC0+Y21kY2hhcik7CisJfQorICAgIH0KK30KKworLyoKKyAqIFN0YXJ0IHNlbGVjdGlvbiBmb3IgU2hpZnQtbW92ZW1lbnQga2V5cy4KKyAqLworICAgIHZvaWQKK3N0YXJ0X3NlbGVjdGlvbigpCit7CisgICAgLyogaWYgJ3NlbGVjdG1vZGUnIGNvbnRhaW5zICJrZXkiLCBzdGFydCBTZWxlY3QgbW9kZSAqLworICAgIG1heV9zdGFydF9zZWxlY3QoJ2snKTsKKyAgICBuX3N0YXJ0X3Zpc3VhbF9tb2RlKCd2Jyk7Cit9CisKKy8qCisgKiBTdGFydCBTZWxlY3QgbW9kZSwgaWYgImMiIGlzIGluICdzZWxlY3Rtb2RlJyBhbmQgbm90IGluIGEgbWFwcGluZyBvciBtZW51LgorICovCisgICAgdm9pZAorbWF5X3N0YXJ0X3NlbGVjdChjKQorICAgIGludAkJYzsKK3sKKyAgICBWSXN1YWxfc2VsZWN0ID0gKHN0dWZmX2VtcHR5KCkgJiYgdHlwZWJ1Zl90eXBlZCgpCisJCSAgICAmJiAodmltX3N0cmNocihwX3NsbSwgYykgIT0gTlVMTCkpOworfQorCisvKgorICogU3RhcnQgVmlzdWFsIG1vZGUgImMiLgorICogU2hvdWxkIHNldCBWSXN1YWxfc2VsZWN0IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbl9zdGFydF92aXN1YWxfbW9kZShjKQorICAgIGludAkJYzsKK3sKKyAgICBWSXN1YWxfbW9kZSA9IGM7CisgICAgVklzdWFsX2FjdGl2ZSA9IFRSVUU7CisgICAgVklzdWFsX3Jlc2VsZWN0ID0gVFJVRTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgLyogQ29ybmVyIGNhc2U6IHRoZSAwIHBvc2l0aW9uIGluIGEgdGFiIG1heSBjaGFuZ2Ugd2hlbiBnb2luZyBpbnRvCisgICAgICogdmlydHVhbGVkaXQuICBSZWNhbGN1bGF0ZSBjdXJ3aW4tPndfY3Vyc29yIHRvIGF2b2lkIGJhZCBoaWxpZ2h0aW5nLgorICAgICAqLworICAgIGlmIChjID09IEN0cmxfViAmJiAodmVfZmxhZ3MgJiBWRV9CTE9DSykgJiYgZ2NoYXJfY3Vyc29yKCkgPT0gVEFCKQorCWNvbGFkdmFuY2UoY3Vyd2luLT53X3ZpcnRjb2wpOworI2VuZGlmCisgICAgVklzdWFsID0gY3Vyd2luLT53X2N1cnNvcjsKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGZvbGRBZGp1c3RWaXN1YWwoKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIHNldG1vdXNlKCk7CisjZW5kaWYKKyAgICBpZiAocF9zbWQpCisJcmVkcmF3X2NtZGxpbmUgPSBUUlVFOwkvKiBzaG93IHZpc3VhbCBtb2RlIGxhdGVyICovCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGNsaXBib2FyZCBnZXRzIHVwZGF0ZWQuICBOZWVkZWQgYmVjYXVzZSBzdGFydCBhbmQKKyAgICAgKiBlbmQgbWF5IHN0aWxsIGJlIHRoZSBzYW1lLCBhbmQgdGhlIHNlbGVjdGlvbiBuZWVkcyB0byBiZSBvd25lZCAqLworICAgIGNsaXBfc3Rhci52bW9kZSA9IE5VTDsKKyNlbmRpZgorCisgICAgLyogT25seSBuZWVkIHRvIHJlZHJhdyB0aGlzIGxpbmUsIHVubGVzcyBzdGlsbCBuZWVkIHRvIHJlZHJhdyBhbiBvbGQKKyAgICAgKiBWaXN1YWwgYXJlYSAod2hlbiAnbGF6eXJlZHJhdycgaXMgc2V0KS4gKi8KKyAgICBpZiAoY3Vyd2luLT53X3JlZHJfdHlwZSA8IElOVkVSVEVEKQorICAgIHsKKwljdXJ3aW4tPndfb2xkX2N1cnNvcl9sbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCWN1cndpbi0+d19vbGRfdmlzdWFsX2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgfQorfQorCisjZW5kaWYgLyogRkVBVF9WSVNVQUwgKi8KKworLyoKKyAqIENUUkwtVzogV2luZG93IGNvbW1hbmRzCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfd2luZG93KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKwlkb193aW5kb3coY2FwLT5uY2hhciwgY2FwLT5jb3VudDAsIE5VTCk7IC8qIGV2ZXJ5dGhpbmcgaXMgaW4gd2luZG93LmMgKi8KKyNlbHNlCisgICAgKHZvaWQpY2hlY2tjbGVhcm9wKGNhcC0+b2FwKTsKKyNlbmRpZgorfQorCisvKgorICogQ1RSTC1aOiBTdXNwZW5kCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfc3VzcGVuZChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjbGVhcm9wKGNhcC0+b2FwKTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCWVuZF92aXN1YWxfbW9kZSgpOwkJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJzdCIpOworfQorCisvKgorICogQ29tbWFuZHMgc3RhcnRpbmcgd2l0aCAiZyIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZ19jbWQoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgb3BhcmdfVAkqb2FwID0gY2FwLT5vYXA7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBwb3NfVAl0cG9zOworI2VuZGlmCisgICAgaW50CQlpOworICAgIGludAkJZmxhZyA9IEZBTFNFOworCisgICAgc3dpdGNoIChjYXAtPm5jaGFyKQorICAgIHsKKyNpZmRlZiBNRU1fUFJPRklMRQorICAgIC8qCisgICAgICogImdeQSI6IGR1bXAgbG9nIG9mIHVzZWQgbWVtb3J5LgorICAgICAqLworICAgIGNhc2UgQ3RybF9BOgorCXZpbV9tZW1fcHJvZmlsZV9kdW1wKCk7CisJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyAgICAvKgorICAgICAqICJnUiI6IEVudGVyIHZpcnR1YWwgcmVwbGFjZSBtb2RlLgorICAgICAqLworICAgIGNhc2UgJ1InOgorCWNhcC0+YXJnID0gVFJVRTsKKwludl9SZXBsYWNlKGNhcCk7CisJYnJlYWs7CisKKyAgICBjYXNlICdyJzoKKwludl92cmVwbGFjZShjYXApOworCWJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlICcmJzoKKwlkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopIiVzLy9+LyYiKTsKKwlicmVhazsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiAiZ3YiOiBSZXNlbGVjdCB0aGUgcHJldmlvdXMgVmlzdWFsIGFyZWEuICBJZiBWaXN1YWwgYWxyZWFkeSBhY3RpdmUsCisgICAgICoJICAgICBleGNoYW5nZSBwcmV2aW91cyBhbmQgY3VycmVudCBWaXN1YWwgYXJlYS4KKyAgICAgKi8KKyAgICBjYXNlICd2JzoKKwlpZiAoY2hlY2tjbGVhcm9wKG9hcCkpCisJICAgIGJyZWFrOworCisJaWYgKAkgICBjdXJidWYtPmJfdmlzdWFsX3N0YXJ0LmxudW0gPT0gMAorCQl8fCBjdXJidWYtPmJfdmlzdWFsX3N0YXJ0LmxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCQl8fCBjdXJidWYtPmJfdmlzdWFsX2VuZC5sbnVtID09IDApCisJICAgIGJlZXBfZmx1c2goKTsKKwllbHNlCisJeworCSAgICAvKiBzZXQgd19jdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBWaXN1YWwgYXJlYSwgdHBvcyB0byB0aGUgZW5kICovCisJICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCSAgICB7CisJCWkgPSBWSXN1YWxfbW9kZTsKKwkJVklzdWFsX21vZGUgPSBjdXJidWYtPmJfdmlzdWFsX21vZGU7CisJCWN1cmJ1Zi0+Yl92aXN1YWxfbW9kZSA9IGk7CisjIGlmZGVmIEZFQVRfRVZBTAorCQljdXJidWYtPmJfdmlzdWFsX21vZGVfZXZhbCA9IGk7CisjIGVuZGlmCisJCWkgPSBjdXJ3aW4tPndfY3Vyc3dhbnQ7CisJCWN1cndpbi0+d19jdXJzd2FudCA9IGN1cmJ1Zi0+Yl92aXN1YWxfY3Vyc3dhbnQ7CisJCWN1cmJ1Zi0+Yl92aXN1YWxfY3Vyc3dhbnQgPSBpOworCisJCXRwb3MgPSBjdXJidWYtPmJfdmlzdWFsX2VuZDsKKwkJY3VyYnVmLT5iX3Zpc3VhbF9lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOworCQljdXJ3aW4tPndfY3Vyc29yID0gY3VyYnVmLT5iX3Zpc3VhbF9zdGFydDsKKwkJY3VyYnVmLT5iX3Zpc3VhbF9zdGFydCA9IFZJc3VhbDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJVklzdWFsX21vZGUgPSBjdXJidWYtPmJfdmlzdWFsX21vZGU7CisJCWN1cndpbi0+d19jdXJzd2FudCA9IGN1cmJ1Zi0+Yl92aXN1YWxfY3Vyc3dhbnQ7CisJCXRwb3MgPSBjdXJidWYtPmJfdmlzdWFsX2VuZDsKKwkJY3Vyd2luLT53X2N1cnNvciA9IGN1cmJ1Zi0+Yl92aXN1YWxfc3RhcnQ7CisJICAgIH0KKworCSAgICBWSXN1YWxfYWN0aXZlID0gVFJVRTsKKwkgICAgVklzdWFsX3Jlc2VsZWN0ID0gVFJVRTsKKworCSAgICAvKiBTZXQgVmlzdWFsIHRvIHRoZSBzdGFydCBhbmQgd19jdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgVmlzdWFsCisJICAgICAqIGFyZWEuICBNYWtlIHN1cmUgdGhleSBhcmUgb24gYW4gZXhpc3RpbmcgY2hhcmFjdGVyLiAqLworCSAgICBjaGVja19jdXJzb3IoKTsKKwkgICAgVklzdWFsID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IHRwb3M7CisJICAgIGNoZWNrX2N1cnNvcigpOworCSAgICB1cGRhdGVfdG9wbGluZSgpOworCSAgICAvKgorCSAgICAgKiBXaGVuIGNhbGxlZCBmcm9tIG5vcm1hbCAiZyIgY29tbWFuZDogc3RhcnQgU2VsZWN0IG1vZGUgd2hlbgorCSAgICAgKiAnc2VsZWN0bW9kZScgY29udGFpbnMgImNtZCIuICBXaGVuIGNhbGxlZCBmb3IgS19TRUxFQ1QsIGFsd2F5cworCSAgICAgKiBzdGFydCBTZWxlY3QgbW9kZS4KKwkgICAgICovCisJICAgIGlmIChjYXAtPmFyZykKKwkJVklzdWFsX3NlbGVjdCA9IFRSVUU7CisJICAgIGVsc2UKKwkJbWF5X3N0YXJ0X3NlbGVjdCgnYycpOworI2lmZGVmIEZFQVRfTU9VU0UKKwkgICAgc2V0bW91c2UoKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisJICAgIC8qIE1ha2Ugc3VyZSB0aGUgY2xpcGJvYXJkIGdldHMgdXBkYXRlZC4gIE5lZWRlZCBiZWNhdXNlIHN0YXJ0IGFuZAorCSAgICAgKiBlbmQgYXJlIHN0aWxsIHRoZSBzYW1lLCBhbmQgdGhlIHNlbGVjdGlvbiBuZWVkcyB0byBiZSBvd25lZCAqLworCSAgICBjbGlwX3N0YXIudm1vZGUgPSBOVUw7CisjZW5kaWYKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CisJICAgIHNob3dtb2RlKCk7CisJfQorCWJyZWFrOworICAgIC8qCisgICAgICogImdWIjogRG9uJ3QgcmVzZWxlY3QgdGhlIHByZXZpb3VzIFZpc3VhbCBhcmVhIGFmdGVyIGEgU2VsZWN0IG1vZGUKKyAgICAgKgkgICAgIG1hcHBpbmcgb2YgbWVudS4KKyAgICAgKi8KKyAgICBjYXNlICdWJzoKKwlWSXN1YWxfcmVzZWxlY3QgPSBGQUxTRTsKKwlicmVhazsKKworICAgIC8qCisgICAgICogImdoIjogIHN0YXJ0IFNlbGVjdCBtb2RlLgorICAgICAqICJnSCI6ICBzdGFydCBTZWxlY3QgbGluZSBtb2RlLgorICAgICAqICJnXkgiOiBzdGFydCBTZWxlY3QgYmxvY2sgbW9kZS4KKyAgICAgKi8KKyAgICBjYXNlIEtfQlM6CisJY2FwLT5uY2hhciA9IEN0cmxfSDsKKwkvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgJ2gnOgorICAgIGNhc2UgJ0gnOgorICAgIGNhc2UgQ3RybF9IOgorIyBpZmRlZiBFQkNESUMKKwkvKiBFQkNESUM6ICd2Jy0naCcgIT0gJ152Jy0nXmgnICovCisJaWYgKGNhcC0+bmNoYXIgPT0gQ3RybF9IKQorCSAgICBjYXAtPmNtZGNoYXIgPSBDdHJsX1Y7CisJZWxzZQorIyBlbmRpZgorCWNhcC0+Y21kY2hhciA9IGNhcC0+bmNoYXIgKyAoJ3YnIC0gJ2gnKTsKKwljYXAtPmFyZyA9IFRSVUU7CisJbnZfdmlzdWFsKGNhcCk7CisJYnJlYWs7CisjZW5kaWYgLyogRkVBVF9WSVNVQUwgKi8KKworICAgIC8qCisgICAgICogImdqIiBhbmQgImdrIiB0d28gbmV3IGZ1bm55IG1vdmVtZW50IGtleXMgLS0gdXAgYW5kIGRvd24KKyAgICAgKiBtb3ZlbWVudCBiYXNlZCBvbiAqc2NyZWVuKiBsaW5lIHJhdGhlciB0aGFuICpmaWxlKiBsaW5lLgorICAgICAqLworICAgIGNhc2UgJ2onOgorICAgIGNhc2UgS19ET1dOOgorCS8qIHdpdGggJ25vd3JhcCcgaXQgd29ya3MganVzdCBsaWtlIHRoZSBub3JtYWwgImoiIGNvbW1hbmQ7IGFsc28gd2hlbgorCSAqIGluIGEgY2xvc2VkIGZvbGQgKi8KKwlpZiAoIWN1cndpbi0+d19wX3dyYXAKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJfHwgaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsIE5VTEwpCisjZW5kaWYKKwkJKQorCXsKKwkgICAgb2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworCSAgICBpID0gY3Vyc29yX2Rvd24oY2FwLT5jb3VudDEsIG9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApOworCX0KKwllbHNlCisJICAgIGkgPSBudl9zY3JlZW5nbyhvYXAsIEZPUldBUkQsIGNhcC0+Y291bnQxKTsKKwlpZiAoaSA9PSBGQUlMKQorCSAgICBjbGVhcm9wYmVlcChvYXApOworCWJyZWFrOworCisgICAgY2FzZSAnayc6CisgICAgY2FzZSBLX1VQOgorCS8qIHdpdGggJ25vd3JhcCcgaXQgd29ya3MganVzdCBsaWtlIHRoZSBub3JtYWwgImsiIGNvbW1hbmQ7IGFsc28gd2hlbgorCSAqIGluIGEgY2xvc2VkIGZvbGQgKi8KKwlpZiAoIWN1cndpbi0+d19wX3dyYXAKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJfHwgaGFzRm9sZGluZyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwsIE5VTEwpCisjZW5kaWYKKwkgICApCisJeworCSAgICBvYXAtPm1vdGlvbl90eXBlID0gTUxJTkU7CisJICAgIGkgPSBjdXJzb3JfdXAoY2FwLT5jb3VudDEsIG9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApOworCX0KKwllbHNlCisJICAgIGkgPSBudl9zY3JlZW5nbyhvYXAsIEJBQ0tXQVJELCBjYXAtPmNvdW50MSk7CisJaWYgKGkgPT0gRkFJTCkKKwkgICAgY2xlYXJvcGJlZXAob2FwKTsKKwlicmVhazsKKworICAgIC8qCisgICAgICogImdKIjogam9pbiB0d28gbGluZXMgd2l0aG91dCBpbnNlcnRpbmcgYSBzcGFjZS4KKyAgICAgKi8KKyAgICBjYXNlICdKJzoKKwludl9qb2luKGNhcCk7CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqICJnMCIsICJnXiIgYW5kICJnJCI6IExpa2UgIjAiLCAiXiIgYW5kICIkIiBidXQgZm9yIHNjcmVlbiBsaW5lcy4KKyAgICAgKiAiZ20iOiBtaWRkbGUgb2YgImcwIiBhbmQgImckIi4KKyAgICAgKi8KKyAgICBjYXNlICdeJzoKKwlmbGFnID0gVFJVRTsKKwkvKiBGQUxMVEhST1VHSCAqLworCisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnbSc6CisgICAgY2FzZSBLX0hPTUU6CisgICAgY2FzZSBLX0tIT01FOgorICAgIGNhc2UgS19YSE9NRToKKwlvYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisJb2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKwlpZiAoY3Vyd2luLT53X3Bfd3JhcAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCSYmIGN1cndpbi0+d193aWR0aCAhPSAwCisjZW5kaWYKKwkJKQorCXsKKwkgICAgaW50CQl3aWR0aDEgPSBXX1dJRFRIKGN1cndpbikgLSBjdXJ3aW5fY29sX29mZigpOworCSAgICBpbnQJCXdpZHRoMiA9IHdpZHRoMSArIGN1cndpbl9jb2xfb2ZmMigpOworCisJICAgIHZhbGlkYXRlX3ZpcnRjb2woKTsKKwkgICAgaSA9IDA7CisJICAgIGlmIChjdXJ3aW4tPndfdmlydGNvbCA+PSAoY29sbnJfVCl3aWR0aDEgJiYgd2lkdGgyID4gMCkKKwkJaSA9IChjdXJ3aW4tPndfdmlydGNvbCAtIHdpZHRoMSkgLyB3aWR0aDIgKiB3aWR0aDIgKyB3aWR0aDE7CisJfQorCWVsc2UKKwkgICAgaSA9IGN1cndpbi0+d19sZWZ0Y29sOworCS8qIEdvIHRvIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiBsaW5lLiAgV2hlbiAnbnVtYmVyJyBpcyBvbiBhbmQgbGluZXMKKwkgKiBhcmUgd3JhcHBpbmcgdGhlIG1pZGRsZSBjYW4gYmUgbW9yZSB0byB0aGUgbGVmdC4qLworCWlmIChjYXAtPm5jaGFyID09ICdtJykKKwkgICAgaSArPSAoV19XSURUSChjdXJ3aW4pIC0gY3Vyd2luX2NvbF9vZmYoKQorCQkgICAgKyAoKGN1cndpbi0+d19wX3dyYXAgJiYgaSA+IDApCisJCQk/IGN1cndpbl9jb2xfb2ZmMigpIDogMCkpIC8gMjsKKwljb2xhZHZhbmNlKChjb2xucl9UKWkpOworCWlmIChmbGFnKQorCXsKKwkgICAgZG8KKwkJaSA9IGdjaGFyX2N1cnNvcigpOworCSAgICB3aGlsZSAodmltX2lzd2hpdGUoaSkgJiYgb25lcmlnaHQoKSA9PSBPSyk7CisJfQorCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCWJyZWFrOworCisgICAgY2FzZSAnXyc6CisJLyogImdfIjogdG8gdGhlIGxhc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBpbiB0aGUgbGluZSBvciA8Y291bnQ+IGxpbmVzCisJICogZG93bndhcmQuICovCisJY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisJY2FwLT5vYXAtPmluY2x1c2l2ZSA9IFRSVUU7CisJY3Vyd2luLT53X2N1cnN3YW50ID0gTUFYQ09MOworCWlmIChjdXJzb3JfZG93bigobG9uZykoY2FwLT5jb3VudDEgLSAxKSwKKwkJCQkJIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkgPT0gRkFJTCkKKwkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOworCWVsc2UKKwl7CisJICAgIGNoYXJfdSAgKnB0ciA9IG1sX2dldF9jdXJsaW5lKCk7CisKKwkgICAgLyogSW4gVmlzdWFsIG1vZGUgd2UgbWF5IGVuZCB1cCBhZnRlciB0aGUgbGluZS4gKi8KKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID4gMCAmJiBwdHJbY3Vyd2luLT53X2N1cnNvci5jb2xdID09IE5VTCkKKwkJLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKworCSAgICAvKiBEZWNyZWFzZSB0aGUgY3Vyc29yIGNvbHVtbiB1bnRpbCBpdCdzIG9uIGEgbm9uLWJsYW5rLiAqLworCSAgICB3aGlsZSAoY3Vyd2luLT53X2N1cnNvci5jb2wgPiAwCisJCQkJICAgICYmIHZpbV9pc3doaXRlKHB0cltjdXJ3aW4tPndfY3Vyc29yLmNvbF0pKQorCQktLWN1cndpbi0+d19jdXJzb3IuY29sOworCSAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlICckJzoKKyAgICBjYXNlIEtfRU5EOgorICAgIGNhc2UgS19LRU5EOgorICAgIGNhc2UgS19YRU5EOgorCXsKKwkgICAgaW50IGNvbF9vZmYgPSBjdXJ3aW5fY29sX29mZigpOworCisJICAgIG9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKwkgICAgb2FwLT5pbmNsdXNpdmUgPSBUUlVFOworCSAgICBpZiAoY3Vyd2luLT53X3Bfd3JhcAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCSAgICAmJiBjdXJ3aW4tPndfd2lkdGggIT0gMAorI2VuZGlmCisJICAgICAgICkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc3dhbnQgPSBNQVhDT0w7ICAgIC8qIHNvIHdlIHN0YXkgYXQgdGhlIGVuZCAqLworCQlpZiAoY2FwLT5jb3VudDEgPT0gMSkKKwkJeworCQkgICAgaW50CQl3aWR0aDEgPSBXX1dJRFRIKGN1cndpbikgLSBjb2xfb2ZmOworCQkgICAgaW50CQl3aWR0aDIgPSB3aWR0aDEgKyBjdXJ3aW5fY29sX29mZjIoKTsKKworCQkgICAgdmFsaWRhdGVfdmlydGNvbCgpOworCQkgICAgaSA9IHdpZHRoMSAtIDE7CisJCSAgICBpZiAoY3Vyd2luLT53X3ZpcnRjb2wgPj0gKGNvbG5yX1Qpd2lkdGgxKQorCQkJaSArPSAoKGN1cndpbi0+d192aXJ0Y29sIC0gd2lkdGgxKSAvIHdpZHRoMiArIDEpCisJCQkJCQkJCSAgICAgKiB3aWR0aDI7CisJCSAgICBjb2xhZHZhbmNlKChjb2xucl9UKWkpOworI2lmIGRlZmluZWQoRkVBVF9MSU5FQlJFQUspIHx8IGRlZmluZWQoRkVBVF9NQllURSkKKwkJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDAgJiYgY3Vyd2luLT53X3Bfd3JhcCkKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBDaGVjayBmb3IgbGFuZGluZyBvbiBhIGNoYXJhY3RlciB0aGF0IGdvdCBzcGxpdCBhdAorCQkJICogdGhlIGVuZCBvZiB0aGUgbGluZS4gIFdlIGRvIG5vdCB3YW50IHRvIGFkdmFuY2UgdG8KKwkJCSAqIHRoZSBuZXh0IHNjcmVlbiBsaW5lLgorCQkJICovCisJCQl2YWxpZGF0ZV92aXJ0Y29sKCk7CisJCQlpZiAoY3Vyd2luLT53X3ZpcnRjb2wgPiAoY29sbnJfVClpKQorCQkJICAgIC0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisJCSAgICB9CisjZW5kaWYKKwkJfQorCQllbHNlIGlmIChudl9zY3JlZW5nbyhvYXAsIEZPUldBUkQsIGNhcC0+Y291bnQxIC0gMSkgPT0gRkFJTCkKKwkJICAgIGNsZWFyb3BiZWVwKG9hcCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWkgPSBjdXJ3aW4tPndfbGVmdGNvbCArIFdfV0lEVEgoY3Vyd2luKSAtIGNvbF9vZmYgLSAxOworCQljb2xhZHZhbmNlKChjb2xucl9UKWkpOworCQljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIC8qCisgICAgICogImcqIiBhbmQgImcjIiwgbGlrZSAiKiIgYW5kICIjIiBidXQgd2l0aG91dCB1c2luZyAiXDwiIGFuZCAiXD4iCisgICAgICovCisgICAgY2FzZSAnKic6CisgICAgY2FzZSAnIyc6CisjaWYgUE9VTkQgIT0gJyMnCisgICAgY2FzZSBQT1VORDoJCS8qIHBvdW5kIHNpZ24gKHNvbWV0aW1lcyBlcXVhbCB0byAnIycpICovCisjZW5kaWYKKyAgICBjYXNlIEN0cmxfUlNCOgkJLyogOnRhZyBvciA6dHNlbGVjdCBmb3IgY3VycmVudCBpZGVudGlmaWVyICovCisgICAgY2FzZSAnXSc6CQkJLyogOnRzZWxlY3QgZm9yIGN1cnJlbnQgaWRlbnRpZmllciAqLworCW52X2lkZW50KGNhcCk7CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqIGdlIGFuZCBnRTogZ28gYmFjayB0byBlbmQgb2Ygd29yZAorICAgICAqLworICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ0UnOgorCW9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwlvYXAtPmluY2x1c2l2ZSA9IFRSVUU7CisJaWYgKGJja2VuZF93b3JkKGNhcC0+Y291bnQxLCBjYXAtPm5jaGFyID09ICdFJywgRkFMU0UpID09IEZBSUwpCisJICAgIGNsZWFyb3BiZWVwKG9hcCk7CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqICJnIENUUkwtRyI6IGRpc3BsYXkgaW5mbyBhYm91dCBjdXJzb3IgcG9zaXRpb24KKyAgICAgKi8KKyAgICBjYXNlIEN0cmxfRzoKKwljdXJzb3JfcG9zX2luZm8oKTsKKwlicmVhazsKKworICAgIC8qCisgICAgICogImdpIjogc3RhcnQgSW5zZXJ0IGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICAgICAqLworICAgIGNhc2UgJ2knOgorCWlmIChjdXJidWYtPmJfbGFzdF9pbnNlcnQubG51bSAhPSAwKQorCXsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cmJ1Zi0+Yl9sYXN0X2luc2VydDsKKwkgICAgY2hlY2tfY3Vyc29yX2xudW0oKTsKKwkgICAgaSA9IChpbnQpU1RSTEVOKG1sX2dldF9jdXJsaW5lKCkpOworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPiAoY29sbnJfVClpKQorCSAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQlpZiAodmlydHVhbF9hY3RpdmUoKSkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkICs9IGN1cndpbi0+d19jdXJzb3IuY29sIC0gaTsKKyNlbmRpZgorCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGk7CisJICAgIH0KKwl9CisJY2FwLT5jbWRjaGFyID0gJ2knOworCW52X2VkaXQoY2FwKTsKKwlicmVhazsKKworICAgIC8qCisgICAgICogImdJIjogU3RhcnQgaW5zZXJ0IGluIGNvbHVtbiAxLgorICAgICAqLworICAgIGNhc2UgJ0knOgorCWJlZ2lubGluZSgwKTsKKwlpZiAoIWNoZWNrY2xlYXJvcHEob2FwKSkKKwkgICAgaW52b2tlX2VkaXQoY2FwLCBGQUxTRSwgJ2cnLCBGQUxTRSk7CisJYnJlYWs7CisKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKyAgICAvKgorICAgICAqICJnZiI6IGdvdG8gZmlsZSwgZWRpdCBmaWxlIHVuZGVyIGN1cnNvcgorICAgICAqICJdZiIgYW5kICJbZiI6IGNhbiBhbHNvIGJlIHVzZWQuCisgICAgICovCisgICAgY2FzZSAnZic6CisJbnZfZ290b2ZpbGUoY2FwKTsKKwlicmVhazsKKyNlbmRpZgorCisJLyogImcnbSIgYW5kICJnYG0iOiBqdW1wIHRvIG1hcmsgd2l0aG91dCBzZXR0aW5nIHBjbWFyayAqLworICAgIGNhc2UgJ1wnJzoKKwljYXAtPmFyZyA9IFRSVUU7CisJLypGQUxMVEhST1VHSCovCisgICAgY2FzZSAnYCc6CisJbnZfZ29tYXJrKGNhcCk7CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqICJncyI6IEdvdG8gc2xlZXAuCisgICAgICovCisgICAgY2FzZSAncyc6CisJZG9fc2xlZXAoY2FwLT5jb3VudDEgKiAxMDAwTCk7CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqICJnYSI6IERpc3BsYXkgdGhlIGFzY2lpIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlCisgICAgICogY3Vyc29yLglJdCBpcyBkaXNwbGF5ZWQgaW4gZGVjaW1hbCwgaGV4LCBhbmQgb2N0YWwuIC0tIHdlYmIKKyAgICAgKi8KKyAgICBjYXNlICdhJzoKKwlkb19hc2NpaShOVUxMKTsKKwlicmVhazsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKgorICAgICAqICJnOCI6IERpc3BsYXkgdGhlIGJ5dGVzIHVzZWQgZm9yIHRoZSBVVEYtOCBjaGFyYWN0ZXIgdW5kZXIgdGhlCisgICAgICogY3Vyc29yLglJdCBpcyBkaXNwbGF5ZWQgaW4gaGV4LgorICAgICAqLworICAgIGNhc2UgJzgnOgorCXNob3dfdXRmOCgpOworCWJyZWFrOworI2VuZGlmCisKKyAgICAvKgorICAgICAqICJnZyI6IEdvdG8gdGhlIGZpcnN0IGxpbmUgaW4gZmlsZS4gIFdpdGggYSBjb3VudCBpdCBnb2VzIHRvCisgICAgICogdGhhdCBsaW5lIG51bWJlciBsaWtlIGZvciAiRyIuIC0tIHdlYmIKKyAgICAgKi8KKyAgICBjYXNlICdnJzoKKwljYXAtPmFyZyA9IEZBTFNFOworCW52X2dvdG8oY2FwKTsKKwlicmVhazsKKworICAgIC8qCisgICAgICoJIFR3by1jaGFyYWN0ZXIgb3BlcmF0b3JzOgorICAgICAqCSAiZ3EiCSAgICBGb3JtYXQgdGV4dAorICAgICAqCSAiZ3ciCSAgICBGb3JtYXQgdGV4dCBhbmQga2VlcCBjdXJzb3IgcG9zaXRpb24KKyAgICAgKgkgImd+IgkgICAgVG9nZ2xlIHRoZSBjYXNlIG9mIHRoZSB0ZXh0LgorICAgICAqCSAiZ3UiCSAgICBDaGFuZ2UgdGV4dCB0byBsb3dlciBjYXNlLgorICAgICAqCSAiZ1UiCSAgICBDaGFuZ2UgdGV4dCB0byB1cHBlciBjYXNlLgorICAgICAqICAgImc/IgkgICAgcm90MTMgZW5jb2RpbmcKKyAgICAgKi8KKyAgICBjYXNlICdxJzoKKyAgICBjYXNlICd3JzoKKwlvYXAtPmN1cnNvcl9zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJLypGQUxMVEhST1VHSCovCisgICAgY2FzZSAnfic6CisgICAgY2FzZSAndSc6CisgICAgY2FzZSAnVSc6CisgICAgY2FzZSAnPyc6CisJbnZfb3BlcmF0b3IoY2FwKTsKKwlicmVhazsKKworICAgIC8qCisgICAgICogImdkIjogRmluZCBmaXJzdCBvY2N1cmVuY2Ugb2YgcGF0dGVybiB1bmRlciB0aGUgY3Vyc29yIGluIHRoZQorICAgICAqCSBjdXJyZW50IGZ1bmN0aW9uCisgICAgICogImdEIjogaWRlbSwgYnV0IGluIHRoZSBjdXJyZW50IGZpbGUuCisgICAgICovCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisJbnZfZ2Qob2FwLCBjYXAtPm5jaGFyKTsKKwlicmVhazsKKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICAvKgorICAgICAqIGc8Kk1vdXNlPiA6IDxDLSptb3VzZT4KKyAgICAgKi8KKyAgICBjYXNlIEtfTUlERExFTU9VU0U6CisgICAgY2FzZSBLX01JRERMRURSQUc6CisgICAgY2FzZSBLX01JRERMRVJFTEVBU0U6CisgICAgY2FzZSBLX0xFRlRNT1VTRToKKyAgICBjYXNlIEtfTEVGVERSQUc6CisgICAgY2FzZSBLX0xFRlRSRUxFQVNFOgorICAgIGNhc2UgS19SSUdIVE1PVVNFOgorICAgIGNhc2UgS19SSUdIVERSQUc6CisgICAgY2FzZSBLX1JJR0hUUkVMRUFTRToKKyAgICBjYXNlIEtfWDFNT1VTRToKKyAgICBjYXNlIEtfWDFEUkFHOgorICAgIGNhc2UgS19YMVJFTEVBU0U6CisgICAgY2FzZSBLX1gyTU9VU0U6CisgICAgY2FzZSBLX1gyRFJBRzoKKyAgICBjYXNlIEtfWDJSRUxFQVNFOgorCW1vZF9tYXNrID0gTU9EX01BU0tfQ1RSTDsKKwkodm9pZClkb19tb3VzZShvYXAsIGNhcC0+bmNoYXIsIEJBQ0tXQVJELCBjYXAtPmNvdW50MSwgMCk7CisJYnJlYWs7CisjZW5kaWYKKworICAgIGNhc2UgS19JR05PUkU6CisJYnJlYWs7CisKKyAgICAvKgorICAgICAqICJnUCIgYW5kICJncCI6IHNhbWUgYXMgIlAiIGFuZCAicCIgYnV0IGxlYXZlIGN1cnNvciBqdXN0IGFmdGVyIG5ldyB0ZXh0CisgICAgICovCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisJbnZfcHV0KGNhcCk7CisJYnJlYWs7CisKKyNpZmRlZiBGRUFUX0JZVEVPRkYKKyAgICAvKiAiZ28iOiBnb3RvIGJ5dGUgY291bnQgZnJvbSBzdGFydCBvZiBidWZmZXIgKi8KKyAgICBjYXNlICdvJzoKKwlnb3RvX2J5dGUoY2FwLT5jb3VudDApOworCWJyZWFrOworI2VuZGlmCisKKyAgICAvKiAiZ1EiOiBpbXByb3ZlZCBFeCBtb2RlICovCisgICAgY2FzZSAnUSc6CisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoY21kd2luX3R5cGUgIT0gMCkKKwl7CisJICAgIGNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwkgICAgYnJlYWs7CisJfQorI2VuZGlmCisJaWYgKCFjaGVja2NsZWFyb3BxKG9hcCkpCisJICAgIGRvX2V4bW9kZShUUlVFKTsKKwlicmVhazsKKworI2lmZGVmIEZFQVRfSlVNUExJU1QKKyAgICBjYXNlICcsJzoKKwludl9wY21hcmsoY2FwKTsKKwlicmVhazsKKworICAgIGNhc2UgJzsnOgorCWNhcC0+Y291bnQxID0gLWNhcC0+Y291bnQxOworCW52X3BjbWFyayhjYXApOworCWJyZWFrOworI2VuZGlmCisKKyAgICBkZWZhdWx0OgorCWNsZWFyb3BiZWVwKG9hcCk7CisJYnJlYWs7CisgICAgfQorfQorCisvKgorICogSGFuZGxlICJvIiBhbmQgIk8iIGNvbW1hbmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK25fb3BlbmNtZChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoY2FwLT5jbWRjaGFyID09ICdPJykKKwkgICAgLyogT3BlbiBhYm92ZSB0aGUgZmlyc3QgbGluZSBvZiBhIGZvbGRlZCBzZXF1ZW5jZSBvZiBsaW5lcyAqLworCSAgICAodm9pZCloYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJCQkJCSZjdXJ3aW4tPndfY3Vyc29yLmxudW0sIE5VTEwpOworCWVsc2UKKwkgICAgLyogT3BlbiBiZWxvdyB0aGUgbGFzdCBsaW5lIG9mIGEgZm9sZGVkIHNlcXVlbmNlIG9mIGxpbmVzICovCisJICAgICh2b2lkKWhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLAorCQkJCQkJTlVMTCwgJmN1cndpbi0+d19jdXJzb3IubG51bSk7CisjZW5kaWYKKwlpZiAodV9zYXZlKChsaW5lbnJfVCkoY3Vyd2luLT53X2N1cnNvci5sbnVtIC0KKwkJCQkJICAgICAgIChjYXAtPmNtZGNoYXIgPT0gJ08nID8gMSA6IDApKSwKKwkJICAgKGxpbmVucl9UKShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKworCQkJCQkgICAgICAgKGNhcC0+Y21kY2hhciA9PSAnbycgPyAxIDogMCkpCisJCSAgICAgICApID09IE9LCisJCSYmIG9wZW5fbGluZShjYXAtPmNtZGNoYXIgPT0gJ08nID8gQkFDS1dBUkQgOiBGT1JXQVJELAorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkJICAgIGhhc19mb3JtYXRfb3B0aW9uKEZPX09QRU5fQ09NUykgPyBPUEVOTElORV9ET19DT00gOgorI2VuZGlmCisJCSAgICAwLCAwKSkKKwl7CisJICAgIGludm9rZV9lZGl0KGNhcCwgRkFMU0UsIGNhcC0+Y21kY2hhciwgVFJVRSk7CisJfQorICAgIH0KK30KKworLyoKKyAqICIuIiBjb21tYW5kOiByZWRvIGxhc3QgY2hhbmdlLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2RvdChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorICAgIHsKKwkvKgorCSAqIElmICJyZXN0YXJ0X2VkaXQiIGlzIFRSVUUsIHRoZSBsYXN0IGJ1dCBvbmUgY29tbWFuZCBpcyByZXBlYXRlZAorCSAqIGluc3RlYWQgb2YgdGhlIGxhc3QgY29tbWFuZCAoaW5zZXJ0aW5nIHRleHQpLiBUaGlzIGlzIHVzZWQgZm9yCisJICogQ1RSTC1PIDwuPiBpbiBpbnNlcnQgbW9kZS4KKwkgKi8KKwlpZiAoc3RhcnRfcmVkbyhjYXAtPmNvdW50MCwgcmVzdGFydF9lZGl0ICE9IDAgJiYgIWFycm93X3VzZWQpID09IEZBSUwpCisJICAgIGNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKyAgICB9Cit9CisKKy8qCisgKiBDVFJMLVI6IHVuZG8gdW5kbworICovCisgICAgc3RhdGljIHZvaWQKK252X3JlZG8oY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKCFjaGVja2NsZWFyb3BxKGNhcC0+b2FwKSkKKyAgICB7CisJdV9yZWRvKChpbnQpY2FwLT5jb3VudDEpOworCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSAiVSIgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9VbmRvKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIC8qIEluIFZpc3VhbCBtb2RlIGFuZCB0eXBpbmcgImdVVSIgdHJpZ2dlcnMgYW4gb3BlcmF0b3IgKi8KKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfVVBQRVIKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCSAgICB8fCBWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkgICAgKQorICAgIHsKKwkvKiB0cmFuc2xhdGUgImdVVSIgdG8gImdVZ1UiICovCisJY2FwLT5jbWRjaGFyID0gJ2cnOworCWNhcC0+bmNoYXIgPSAnVSc7CisJbnZfb3BlcmF0b3IoY2FwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorICAgIHsKKwl1X3VuZG9saW5lKCk7CisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisgICAgfQorfQorCisvKgorICogJ34nIGNvbW1hbmQ6IElmIHRpbGRlIGlzIG5vdCBhbiBvcGVyYXRvciBhbmQgVmlzdWFsIGlzIG9mZjogc3dhcCBjYXNlIG9mIGEKKyAqIHNpbmdsZSBjaGFyYWN0ZXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfdGlsZGUoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKCFwX3RvCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgJiYgIVZJc3VhbF9hY3RpdmUKKyNlbmRpZgorCSAgICAmJiBjYXAtPm9hcC0+b3BfdHlwZSAhPSBPUF9USUxERSkKKwluX3N3YXBjaGFyKGNhcCk7CisgICAgZWxzZQorCW52X29wZXJhdG9yKGNhcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gb3BlcmF0b3IgY29tbWFuZC4KKyAqIFRoZSBhY3R1YWwgd29yayBpcyBkb25lIGJ5IGRvX3BlbmRpbmdfb3BlcmF0b3IoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9vcGVyYXRvcihjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpbnQJICAgIG9wX3R5cGU7CisKKyAgICBvcF90eXBlID0gZ2V0X29wX3R5cGUoY2FwLT5jbWRjaGFyLCBjYXAtPm5jaGFyKTsKKworICAgIGlmIChvcF90eXBlID09IGNhcC0+b2FwLT5vcF90eXBlKQkgICAgLyogZG91YmxlIG9wZXJhdG9yIHdvcmtzIG9uIGxpbmVzICovCisJbnZfbGluZW9wKGNhcCk7CisgICAgZWxzZSBpZiAoIWNoZWNrY2xlYXJvcChjYXAtPm9hcCkpCisgICAgeworCWNhcC0+b2FwLT5zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJY2FwLT5vYXAtPm9wX3R5cGUgPSBvcF90eXBlOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSBsaW5ld2lzZSBvcGVyYXRvciAiZGQiLCAieXkiLCBldGMuCisgKgorICogIl8iIGlzIGlzIGEgc3RyYW5nZSBtb3Rpb24gY29tbWFuZCB0aGF0IGhlbHBzIG1ha2Ugb3BlcmF0b3JzIG1vcmUgbG9naWNhbC4KKyAqIEl0IGlzIGFjdHVhbGx5IGltcGxlbWVudGVkLCBidXQgbm90IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgVmkuICBUaGlzIG1vdGlvbgorICogY29tbWFuZCBhY3R1YWxseSByZWZlcnMgdG8gInRoZSBjdXJyZW50IGxpbmUiLiAgQ29tbWFuZHMgbGlrZSAiZGQiIGFuZCAieXkiCisgKiBhcmUgcmVhbGx5IGFuIGFsdGVybmF0ZSBmb3JtIG9mICJkXyIgYW5kICJ5XyIuICBJdCBkb2VzIGFjY2VwdCBhIGNvdW50LCBzbworICogImQzXyIgd29ya3MgdG8gZGVsZXRlIDMgbGluZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfbGluZW9wKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGNhcC0+b2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworICAgIGlmIChjdXJzb3JfZG93bihjYXAtPmNvdW50MSAtIDFMLCBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApID09IEZBSUwpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIGVsc2UgaWYgKCAgY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfREVMRVRFCisJICAgIHx8IGNhcC0+b2FwLT5vcF90eXBlID09IE9QX0xTSElGVAorCSAgICB8fCBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9SU0hJRlQpCisJYmVnaW5saW5lKEJMX1NPTCB8IEJMX0ZJWCk7CisgICAgZWxzZSBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfWUFOSykJLyogJ1knIGRvZXMgbm90IG1vdmUgY3Vyc29yICovCisJYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKK30KKworLyoKKyAqIDxIb21lPiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X2hvbWUoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgY2FwLT5jb3VudDAgPSAxOworICAgIG52X3BpcGUoY2FwKTsKK30KKworLyoKKyAqICJ8IiBjb21tYW5kLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3BpcGUoY2FwKQorICAgIGNtZGFyZ19UICpjYXA7Cit7CisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworICAgIGJlZ2lubGluZSgwKTsKKyAgICBpZiAoY2FwLT5jb3VudDAgPiAwKQorICAgIHsKKwljb2xhZHZhbmNlKChjb2xucl9UKShjYXAtPmNvdW50MCAtIDEpKTsKKwljdXJ3aW4tPndfY3Vyc3dhbnQgPSAoY29sbnJfVCkoY2FwLT5jb3VudDAgLSAxKTsKKyAgICB9CisgICAgZWxzZQorCWN1cndpbi0+d19jdXJzd2FudCA9IDA7CisgICAgLyoga2VlcCBjdXJzd2FudCBhdCB0aGUgY29sdW1uIHdoZXJlIHdlIHdhbnRlZCB0byBnbywgbm90IHdoZXJlCisgICAgICAgd2UgZW5kZWQ7IGRpZmZlcnMgaWYgbGluZSBpcyB0b28gc2hvcnQgKi8KKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gRkFMU0U7Cit9CisKKy8qCisgKiBIYW5kbGUgYmFjay13b3JkIGNvbW1hbmQgImIiIGFuZCAiQiIuCisgKiBjYXAtPmFyZyBpcyAxIGZvciAiQiIKKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9iY2tfd29yZChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBjYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisgICAgaWYgKGJja193b3JkKGNhcC0+Y291bnQxLCBjYXAtPmFyZywgRkFMU0UpID09IEZBSUwpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGVsc2UgaWYgKChmZG9fZmxhZ3MgJiBGRE9fSE9SKSAmJiBLZXlUeXBlZCAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorfQorCisvKgorICogSGFuZGxlIHdvcmQgbW90aW9uIGNvbW1hbmRzICJlIiwgIkUiLCAidyIgYW5kICJXIi4KKyAqIGNhcC0+YXJnIGlzIFRSVUUgZm9yICJFIiBhbmQgIlciLgorICovCisgICAgc3RhdGljIHZvaWQKK252X3dvcmRjbWQoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaW50CQluOworICAgIGludAkJd29yZF9lbmQ7CisgICAgaW50CQlmbGFnID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIFNldCBpbmNsdXNpdmUgZm9yIHRoZSAiRSIgYW5kICJlIiBjb21tYW5kLgorICAgICAqLworICAgIGlmIChjYXAtPmNtZGNoYXIgPT0gJ2UnIHx8IGNhcC0+Y21kY2hhciA9PSAnRScpCisJd29yZF9lbmQgPSBUUlVFOworICAgIGVsc2UKKwl3b3JkX2VuZCA9IEZBTFNFOworICAgIGNhcC0+b2FwLT5pbmNsdXNpdmUgPSB3b3JkX2VuZDsKKworICAgIC8qCisgICAgICogImN3IiBhbmQgImNXIiBhcmUgYSBzcGVjaWFsIGNhc2UuCisgICAgICovCisgICAgaWYgKCF3b3JkX2VuZCAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9DSEFOR0UpCisgICAgeworCW4gPSBnY2hhcl9jdXJzb3IoKTsKKwlpZiAobiAhPSBOVUwpCQkJLyogbm90IGFuIGVtcHR5IGxpbmUgKi8KKwl7CisJICAgIGlmICh2aW1faXN3aGl0ZShuKSkKKwkgICAgeworCQkvKgorCQkgKiBSZXByb2R1Y2UgYSBmdW5ueSBWaSBiZWhhdmlvdXI6ICJjdyIgb24gYSBibGFuayBvbmx5CisJCSAqIGNoYW5nZXMgb25lIGNoYXJhY3Rlciwgbm90IGFsbCBibGFua3MgdW50aWwgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBuZXh0IHdvcmQuICBPbmx5IGRvIHRoaXMgd2hlbiB0aGUgJ3cnIGZsYWcgaXMgaW5jbHVkZWQKKwkJICogaW4gJ2Nwb3B0aW9ucycuCisJCSAqLworCQlpZiAoY2FwLT5jb3VudDEgPT0gMSAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQ1cpICE9IE5VTEwpCisJCXsKKwkJICAgIGNhcC0+b2FwLT5pbmNsdXNpdmUgPSBUUlVFOworCQkgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisJCSAgICByZXR1cm47CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhIGxpdHRsZSBzdHJhbmdlLiBUbyBtYXRjaCB3aGF0IHRoZSByZWFsIFZpIGRvZXMsCisJCSAqIHdlIGVmZmVjdGl2ZWx5IG1hcCAnY3cnIHRvICdjZScsIGFuZCAnY1cnIHRvICdjRScsIHByb3ZpZGVkCisJCSAqIHRoYXQgd2UgYXJlIG5vdCBvbiBhIHNwYWNlIG9yIGEgVEFCLiAgVGhpcyBzZWVtcyBpbXBvbGl0ZQorCQkgKiBhdCBmaXJzdCwgYnV0IGl0J3MgcmVhbGx5IG1vcmUgd2hhdCB3ZSBtZWFuIHdoZW4gd2Ugc2F5CisJCSAqICdjdycuCisJCSAqIEFub3RoZXIgc3RyYW5nZW5lc3M6IFdoZW4gc3RhbmRpbmcgb24gdGhlIGVuZCBvZiBhIHdvcmQKKwkJICogImNlIiB3aWxsIGNoYW5nZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmR0LCBidXQgImN3IgorCQkgKiB3aWxsIGNoYW5nZSBvbmx5IG9uZSBjaGFyYWN0ZXIhIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nCisJCSAqIGZsYWcuCisJCSAqLworCQljYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKwkJd29yZF9lbmQgPSBUUlVFOworCQlmbGFnID0gVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBjYXAtPm9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyAgICBpZiAod29yZF9lbmQpCisJbiA9IGVuZF93b3JkKGNhcC0+Y291bnQxLCBjYXAtPmFyZywgZmxhZywgRkFMU0UpOworICAgIGVsc2UKKwluID0gZndkX3dvcmQoY2FwLT5jb3VudDEsIGNhcC0+YXJnLCBjYXAtPm9hcC0+b3BfdHlwZSAhPSBPUF9OT1ApOworCisgICAgLyogRG9uJ3QgbGVhdmUgdGhlIGN1cnNvciBvbiB0aGUgTlVMIHBhc3QgYSBsaW5lICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sICYmIGdjaGFyX2N1cnNvcigpID09IE5VTCkKKyAgICB7CisJLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwljYXAtPm9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAobiA9PSBGQUlMICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWFkanVzdF9mb3Jfc2VsKGNhcCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoKGZkb19mbGFncyAmIEZET19IT1IpICYmIEtleVR5cGVkICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwkgICAgZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqICIwIiBhbmQgIl4iIGNvbW1hbmRzLgorICogY2FwLT5hcmcgaXMgdGhlIGFyZ3VtZW50IGZvciBiZWdpbmxpbmUoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9iZWdpbmxpbmUoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUNIQVI7CisgICAgY2FwLT5vYXAtPmluY2x1c2l2ZSA9IEZBTFNFOworICAgIGJlZ2lubGluZShjYXAtPmFyZyk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKChmZG9fZmxhZ3MgJiBGRE9fSE9SKSAmJiBLZXlUeXBlZCAmJiBjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9OT1ApCisJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiBJbiBleGNsdXNpdmUgVmlzdWFsIG1vZGUsIG1heSBpbmNsdWRlIHRoZSBsYXN0IGNoYXJhY3Rlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCithZGp1c3RfZm9yX3NlbChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSAmJiBjYXAtPm9hcC0+aW5jbHVzaXZlICYmICpwX3NlbCA9PSAnZScKKwkgICAgJiYgZ2NoYXJfY3Vyc29yKCkgIT0gTlVMICYmIGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisgICAgeworIyBpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgaW5jX2N1cnNvcigpOworCWVsc2UKKyMgZW5kaWYKKwkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwljYXAtPm9hcC0+aW5jbHVzaXZlID0gRkFMU0U7CisgICAgfQorfQorCisvKgorICogRXhjbHVkZSBsYXN0IGNoYXJhY3RlciBhdCBlbmQgb2YgVmlzdWFsIGFyZWEgZm9yICdzZWxlY3Rpb24nID09ICJleGNsdXNpdmUiLgorICogU2hvdWxkIGNoZWNrIFZJc3VhbF9tb2RlIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKiBSZXR1cm5zIFRSVUUgd2hlbiBiYWNrZWQgdXAgdG8gdGhlIHByZXZpb3VzIGxpbmUuCisgKi8KKyAgICBzdGF0aWMgaW50Cit1bmFkanVzdF9mb3Jfc2VsKCkKK3sKKyAgICBwb3NfVAkqcHA7CisKKyAgICBpZiAoKnBfc2VsID09ICdlJyAmJiAhZXF1YWxwb3MoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKyAgICB7CisJaWYgKGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisJICAgIHBwID0gJmN1cndpbi0+d19jdXJzb3I7CisJZWxzZQorCSAgICBwcCA9ICZWSXN1YWw7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmIChwcC0+Y29sYWRkID4gMCkKKwkgICAgLS1wcC0+Y29sYWRkOworCWVsc2UKKyNlbmRpZgorCWlmIChwcC0+Y29sID4gMCkKKwl7CisJICAgIC0tcHAtPmNvbDsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIG1iX2FkanVzdHBvcyhwcCk7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAocHAtPmxudW0gPiAxKQorCXsKKwkgICAgLS1wcC0+bG51bTsKKwkgICAgcHAtPmNvbCA9IChjb2xucl9UKVNUUkxFTihtbF9nZXQocHAtPmxudW0pKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBTRUxFQ1Qga2V5IGluIE5vcm1hbCBvciBWaXN1YWwgbW9kZTogZW5kIG9mIFNlbGVjdCBtb2RlIG1hcHBpbmcuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfc2VsZWN0KGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCVZJc3VhbF9zZWxlY3QgPSBUUlVFOworICAgIGVsc2UgaWYgKFZJc3VhbF9yZXNlbGVjdCkKKyAgICB7CisJY2FwLT5uY2hhciA9ICd2JzsJICAgIC8qIGZha2UgImd2IiBjb21tYW5kICovCisJY2FwLT5hcmcgPSBUUlVFOworCW52X2dfY21kKGNhcCk7CisgICAgfQorfQorCisjZW5kaWYKKworLyoKKyAqICJHIiwgImdnIiwgQ1RSTC1FTkQsIENUUkwtSE9NRS4KKyAqIGNhcC0+YXJnIGlzIFRSVUUgZm9yICJHIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9nb3RvKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGxpbmVucl9UCWxudW07CisKKyAgICBpZiAoY2FwLT5hcmcpCisJbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworICAgIGVsc2UKKwlsbnVtID0gMUw7CisgICAgY2FwLT5vYXAtPm1vdGlvbl90eXBlID0gTUxJTkU7CisgICAgc2V0cGNtYXJrKCk7CisKKyAgICAvKiBXaGVuIGEgY291bnQgaXMgZ2l2ZW4sIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGxudW0gKi8KKyAgICBpZiAoY2FwLT5jb3VudDAgIT0gMCkKKwlsbnVtID0gY2FwLT5jb3VudDA7CisgICAgaWYgKGxudW0gPCAxTCkKKwlsbnVtID0gMUw7CisgICAgZWxzZSBpZiAobG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworICAgIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICgoZmRvX2ZsYWdzICYgRkRPX0pVTVApICYmIEtleVR5cGVkICYmIGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUCkKKwlmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCit9CisKKy8qCisgKiBDVFJMLVwgaW4gTm9ybWFsIG1vZGUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfbm9ybWFsKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmIChjYXAtPm5jaGFyID09IEN0cmxfTiB8fCBjYXAtPm5jaGFyID09IEN0cmxfRykKKyAgICB7CisJY2xlYXJvcChjYXAtPm9hcCk7CisJaWYgKHJlc3RhcnRfZWRpdCAhPSAwICYmIHBfc21kKQorCSAgICBjbGVhcl9jbWRsaW5lID0gVFJVRTsJCS8qIHVuc2hvdyBtb2RlIGxhdGVyICovCisJcmVzdGFydF9lZGl0ID0gMDsKKyNpZmRlZiBGRUFUX0NNRFdJTgorCWlmIChjbWR3aW5fdHlwZSAhPSAwKQorCSAgICBjbWR3aW5fcmVzdWx0ID0gQ3RybF9DOworI2VuZGlmCisjaWZkZWYgRkVBVF9WSVNVQUwKKwlpZiAoVklzdWFsX2FjdGl2ZSkKKwl7CisJICAgIGVuZF92aXN1YWxfbW9kZSgpOwkJLyogc3RvcCBWaXN1YWwgKi8KKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CisJfQorI2VuZGlmCisJLyogQ1RSTC1cIENUUkwtRyByZXN0YXJ0cyBJbnNlcnQgbW9kZSB3aGVuICdpbnNlcnRtb2RlJyBpcyBzZXQuICovCisJaWYgKGNhcC0+bmNoYXIgPT0gQ3RybF9HICYmIHBfaW0pCisJICAgIHJlc3RhcnRfZWRpdCA9ICdhJzsKKyAgICB9CisgICAgZWxzZQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKK30KKworLyoKKyAqIEVTQyBpbiBOb3JtYWwgbW9kZTogYmVlcCwgYnV0IGRvbid0IGZsdXNoIGJ1ZmZlcnMuCisgKiBEb24ndCBldmVuIGJlZXAgaWYgd2UgYXJlIGNhbmNlbGluZyBhIGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZXNjKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGludAkJbm9fcmVhc29uOworCisgICAgbm9fcmVhc29uID0gKGNhcC0+b2FwLT5vcF90eXBlID09IE9QX05PUAorCQkmJiBjYXAtPm9wY291bnQgPT0gMAorCQkmJiBjYXAtPmNvdW50MCA9PSAwCisJCSYmIGNhcC0+b2FwLT5yZWduYW1lID09IDAKKwkJJiYgIXBfaW0pOworCisgICAgaWYgKGNhcC0+YXJnKQkJLyogVFJVRSBmb3IgQ1RSTC1DICovCisgICAgeworCWlmIChyZXN0YXJ0X2VkaXQgPT0gMAorI2lmZGVmIEZFQVRfQ01EV0lOCisJCSYmIGNtZHdpbl90eXBlID09IDAKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICFWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkJJiYgbm9fcmVhc29uKQorCSAgICBNU0coXygiVHlwZSAgOnF1aXQ8RW50ZXI+ICB0byBleGl0IFZpbSIpKTsKKworCS8qIERvbid0IHJlc2V0ICJyZXN0YXJ0X2VkaXQiIHdoZW4gJ2luc2VydG1vZGUnIGlzIHNldCwgaXQgd29uJ3QgYmUKKwkgKiBzZXQgYWdhaW4gYmVsb3cgd2hlbiBoYWxmd2F5IGEgbWFwcGluZy4gKi8KKwlpZiAoIXBfaW0pCisJICAgIHJlc3RhcnRfZWRpdCA9IDA7CisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoY21kd2luX3R5cGUgIT0gMCkKKwl7CisJICAgIGNtZHdpbl9yZXN1bHQgPSBLX0lHTk9SRTsKKwkgICAgZ290X2ludCA9IEZBTFNFOwkvKiBkb24ndCBzdG9wIGV4ZWN1dGluZyBhdXRvY29tbWFuZHMgZXQgYWwuICovCisJICAgIHJldHVybjsKKwl9CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwllbmRfdmlzdWFsX21vZGUoKTsJLyogc3RvcCBWaXN1YWwgKi8KKwljaGVja19jdXJzb3JfY29sKCk7CS8qIG1ha2Ugc3VyZSBjdXJzb3IgaXMgbm90IGJleW9uZCBFT0wgKi8KKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJaWYgKG5vX3JlYXNvbikKKwkgICAgdmltX2JlZXAoKTsKKyAgICBjbGVhcm9wKGNhcC0+b2FwKTsKKworICAgIC8qIEEgQ1RSTC1DIGlzIG9mdGVuIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGEgbWVudS4gIFdoZW4gJ2luc2VydG1vZGUnIGlzCisgICAgICogc2V0IHJldHVybiB0byBJbnNlcnQgbW9kZSBhZnRlcndhcmRzLiAqLworICAgIGlmIChyZXN0YXJ0X2VkaXQgPT0gMCAmJiBnb3RvX2ltKCkKKyNpZmRlZiBGRUFUX0VYX0VYVFJBCisJICAgICYmIGV4X25vcm1hbF9idXN5ID09IDAKKyNlbmRpZgorCSAgICApCisJcmVzdGFydF9lZGl0ID0gJ2EnOworfQorCisvKgorICogSGFuZGxlICJBIiwgImEiLCAiSSIsICJpIiBhbmQgPEluc2VydD4gY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZWRpdChjYXApCisgICAgY21kYXJnX1QgKmNhcDsKK3sKKyAgICAvKiA8SW5zZXJ0PiBpcyBlcXVhbCB0byAiaSIgKi8KKyAgICBpZiAoY2FwLT5jbWRjaGFyID09IEtfSU5TIHx8IGNhcC0+Y21kY2hhciA9PSBLX0tJTlMpCisJY2FwLT5jbWRjaGFyID0gJ2knOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiBpbiBWaXN1YWwgbW9kZSAiQSIgYW5kICJJIiBhcmUgYW4gb3BlcmF0b3IgKi8KKyAgICBpZiAoVklzdWFsX2FjdGl2ZSAmJiAoY2FwLT5jbWRjaGFyID09ICdBJyB8fCBjYXAtPmNtZGNoYXIgPT0gJ0knKSkKKwl2X3Zpc29wKGNhcCk7CisKKyAgICAvKiBpbiBWaXN1YWwgbW9kZSBhbmQgYWZ0ZXIgYW4gb3BlcmF0b3IgImEiIGFuZCAiaSIgYXJlIGZvciB0ZXh0IG9iamVjdHMgKi8KKyAgICBlbHNlCisjZW5kaWYKKwlpZiAoKGNhcC0+Y21kY2hhciA9PSAnYScgfHwgY2FwLT5jbWRjaGFyID09ICdpJykKKwkgICAgJiYgKGNhcC0+b2FwLT5vcF90eXBlICE9IE9QX05PUAorI2lmZGVmIEZFQVRfVklTVUFMCisJCXx8IFZJc3VhbF9hY3RpdmUKKyNlbmRpZgorCQkpKQorICAgIHsKKyNpZmRlZiBGRUFUX1RFWFRPQkoKKwludl9vYmplY3QoY2FwKTsKKyNlbHNlCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKCFjdXJidWYtPmJfcF9tYSAmJiAhcF9pbSkKKyAgICB7CisJLyogT25seSBnaXZlIHRoaXMgZXJyb3Igd2hlbiAnaW5zZXJ0bW9kZScgaXMgb2ZmLiAqLworCUVNU0coXyhlX21vZGlmaWFibGUpKTsKKwljbGVhcm9wKGNhcC0+b2FwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWNoZWNrY2xlYXJvcHEoY2FwLT5vYXApKQorICAgIHsKKwlzd2l0Y2ggKGNhcC0+Y21kY2hhcikKKwl7CisJICAgIGNhc2UgJ0EnOgkvKiAiQSJwcGVuZCBhZnRlciB0aGUgbGluZSAqLworCQljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCWlmICh2ZV9mbGFncyA9PSBWRV9BTEwpCisJCXsKKwkJICAgIGludCBzYXZlX1N0YXRlID0gU3RhdGU7CisKKwkJICAgIC8qIFByZXRlbnQgSW5zZXJ0IG1vZGUgaGVyZSB0byBhbGxvdyB0aGUgY3Vyc29yIG9uIHRoZQorCQkgICAgICogY2hhcmFjdGVyIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkgICAgU3RhdGUgPSBJTlNFUlQ7CisJCSAgICBjb2xhZHZhbmNlKChjb2xucl9UKU1BWENPTCk7CisJCSAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCArPSAoY29sbnJfVClTVFJMRU4obWxfZ2V0X2N1cnNvcigpKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnSSc6CS8qICJJIm5zZXJ0IGJlZm9yZSB0aGUgZmlyc3Qgbm9uLWJsYW5rICovCisJCWJlZ2lubGluZShCTF9XSElURSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2EnOgkvKiAiYSJwcGVuZCBpcyBsaWtlICJpIm5zZXJ0IG9uIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCS8qIGluY3JlbWVudCBjb2xhZGQgd2hlbiBpbiB2aXJ0dWFsIHNwYWNlLCBpbmNyZW1lbnQgdGhlCisJCSAqIGNvbHVtbiBvdGhlcndpc2UsIGFsc28gdG8gYXBwZW5kIGFmdGVyIGFuIHVucHJpbnRhYmxlIGNoYXIgKi8KKwkJaWYgKHZpcnR1YWxfYWN0aXZlKCkKKwkJCSYmIChjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDAKKwkJCSAgICB8fCAqbWxfZ2V0X2N1cnNvcigpID09IE5VTAorCQkJICAgIHx8ICptbF9nZXRfY3Vyc29yKCkgPT0gVEFCKSkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkKys7CisJCWVsc2UKKyNlbmRpZgorCQlpZiAoKm1sX2dldF9jdXJzb3IoKSAhPSBOVUwpCisJCSAgICBpbmNfY3Vyc29yKCk7CisJCWJyZWFrOworCX0KKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgJiYgY2FwLT5jbWRjaGFyICE9ICdBJykKKwl7CisJICAgIGludCBzYXZlX1N0YXRlID0gU3RhdGU7CisKKwkgICAgLyogUHJldGVudCBJbnNlcnQgbW9kZSBoZXJlIHRvIGFsbG93IHRoZSBjdXJzb3Igb24gdGhlCisJICAgICAqIGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkgICAgU3RhdGUgPSBJTlNFUlQ7CisJICAgIGNvbGFkdmFuY2UoZ2V0dmlzY29sKCkpOworCSAgICBTdGF0ZSA9IHNhdmVfU3RhdGU7CisJfQorI2VuZGlmCisKKwlpbnZva2VfZWRpdChjYXAsIEZBTFNFLCBjYXAtPmNtZGNoYXIsIEZBTFNFKTsKKyAgICB9Cit9CisKKy8qCisgKiBJbnZva2UgZWRpdCgpIGFuZCB0YWtlIGNhcmUgb2YgInJlc3RhcnRfZWRpdCIgYW5kIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAoraW52b2tlX2VkaXQoY2FwLCByZXBsLCBjbWQsIHN0YXJ0bG4pCisgICAgY21kYXJnX1QJKmNhcDsKKyAgICBpbnQJCXJlcGw7CQkvKiAiciIgb3IgImdyIiBjb21tYW5kICovCisgICAgaW50CQljbWQ7CisgICAgaW50CQlzdGFydGxuOworeworICAgIGludAkJcmVzdGFydF9lZGl0X3NhdmUgPSAwOworCisgICAgLyogQ29tcGxpY2F0ZWQ6IFdoZW4gdGhlIHVzZXIgdHlwZXMgImE8Qy1PPmEiIHdlIGRvbid0IHdhbnQgdG8gZG8gSW5zZXJ0CisgICAgICogbW9kZSByZWN1cnNpdmVseS4gIEJ1dCB3aGVuIGRvaW5nICJhPEMtTz4uIiBvciAiYTxDLU8+cngiIHdlIGRvIGFsbG93CisgICAgICogaXQuICovCisgICAgaWYgKHJlcGwgfHwgIXN0dWZmX2VtcHR5KCkpCisJcmVzdGFydF9lZGl0X3NhdmUgPSByZXN0YXJ0X2VkaXQ7CisgICAgZWxzZQorCXJlc3RhcnRfZWRpdF9zYXZlID0gMDsKKworICAgIC8qIEFsd2F5cyByZXNldCAicmVzdGFydF9lZGl0IiwgdGhpcyBpcyBub3QgYSByZXN0YXJ0ZWQgZWRpdC4gKi8KKyAgICByZXN0YXJ0X2VkaXQgPSAwOworCisgICAgaWYgKGVkaXQoY21kLCBzdGFydGxuLCBjYXAtPmNvdW50MSkpCisJY2FwLT5yZXR2YWwgfD0gQ0FfQ09NTUFORF9CVVNZOworCisgICAgaWYgKHJlc3RhcnRfZWRpdCA9PSAwKQorCXJlc3RhcnRfZWRpdCA9IHJlc3RhcnRfZWRpdF9zYXZlOworfQorCisjaWZkZWYgRkVBVF9URVhUT0JKCisvKgorICogImEiIG9yICJpIiB3aGlsZSBhbiBvcGVyYXRvciBpcyBwZW5kaW5nIG9yIGluIFZpc3VhbCBtb2RlOiBvYmplY3QgbW90aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK252X29iamVjdChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBpbnQJCWZsYWc7CisgICAgaW50CQlpbmNsdWRlOworICAgIGNoYXJfdQkqbXBzX3NhdmU7CisKKyAgICBpZiAoY2FwLT5jbWRjaGFyID09ICdpJykKKwlpbmNsdWRlID0gRkFMU0U7ICAgIC8qICJpeCIgPSBpbm5lciBvYmplY3Q6IGV4Y2x1ZGUgd2hpdGUgc3BhY2UgKi8KKyAgICBlbHNlCisJaW5jbHVkZSA9IFRSVUU7CSAgICAvKiAiYXgiID0gYW4gb2JqZWN0OiBpbmNsdWRlIHdoaXRlIHNwYWNlICovCisKKyAgICAvKiBNYWtlIHN1cmUgKCksIFtdLCB7fSBhbmQgPD4gYXJlIGluICdtYXRjaHBhaXJzJyAqLworICAgIG1wc19zYXZlID0gY3VyYnVmLT5iX3BfbXBzOworICAgIGN1cmJ1Zi0+Yl9wX21wcyA9IChjaGFyX3UgKikiKDopLHs6fSxbOl0sPDo+IjsKKworICAgIHN3aXRjaCAoY2FwLT5uY2hhcikKKyAgICB7CisJY2FzZSAndyc6IC8qICJhdyIgPSBhIHdvcmQgKi8KKwkJZmxhZyA9IGN1cnJlbnRfd29yZChjYXAtPm9hcCwgY2FwLT5jb3VudDEsIGluY2x1ZGUsIEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSAnVyc6IC8qICJhVyIgPSBhIFdPUkQgKi8KKwkJZmxhZyA9IGN1cnJlbnRfd29yZChjYXAtPm9hcCwgY2FwLT5jb3VudDEsIGluY2x1ZGUsIFRSVUUpOworCQlicmVhazsKKwljYXNlICdiJzogLyogImFiIiA9IGEgYnJhY2VzIGJsb2NrICovCisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJCWZsYWcgPSBjdXJyZW50X2Jsb2NrKGNhcC0+b2FwLCBjYXAtPmNvdW50MSwgaW5jbHVkZSwgJygnLCAnKScpOworCQlicmVhazsKKwljYXNlICdCJzogLyogImFCIiA9IGEgQnJhY2tldHMgYmxvY2sgKi8KKwljYXNlICd7JzoKKwljYXNlICd9JzoKKwkJZmxhZyA9IGN1cnJlbnRfYmxvY2soY2FwLT5vYXAsIGNhcC0+Y291bnQxLCBpbmNsdWRlLCAneycsICd9Jyk7CisJCWJyZWFrOworCWNhc2UgJ1snOiAvKiAiYVsiID0gYSBbXSBibG9jayAqLworCWNhc2UgJ10nOgorCQlmbGFnID0gY3VycmVudF9ibG9jayhjYXAtPm9hcCwgY2FwLT5jb3VudDEsIGluY2x1ZGUsICdbJywgJ10nKTsKKwkJYnJlYWs7CisJY2FzZSAnPCc6IC8qICJhPCIgPSBhIDw+IGJsb2NrICovCisJY2FzZSAnPic6CisJCWZsYWcgPSBjdXJyZW50X2Jsb2NrKGNhcC0+b2FwLCBjYXAtPmNvdW50MSwgaW5jbHVkZSwgJzwnLCAnPicpOworCQlicmVhazsKKwljYXNlICdwJzogLyogImFwIiA9IGEgcGFyYWdyYXBoICovCisJCWZsYWcgPSBjdXJyZW50X3BhcihjYXAtPm9hcCwgY2FwLT5jb3VudDEsIGluY2x1ZGUsICdwJyk7CisJCWJyZWFrOworCWNhc2UgJ3MnOiAvKiAiYXMiID0gYSBzZW50ZW5jZSAqLworCQlmbGFnID0gY3VycmVudF9zZW50KGNhcC0+b2FwLCBjYXAtPmNvdW50MSwgaW5jbHVkZSk7CisJCWJyZWFrOworI2lmIDAJLyogVE9ETyAqLworCWNhc2UgJ1MnOiAvKiAiYVMiID0gYSBzZWN0aW9uICovCisJY2FzZSAnZic6IC8qICJhZiIgPSBhIGZpbGVuYW1lICovCisJY2FzZSAndSc6IC8qICJhdSIgPSBhIFVSTCAqLworI2VuZGlmCisJZGVmYXVsdDoKKwkJZmxhZyA9IEZBSUw7CisJCWJyZWFrOworICAgIH0KKworICAgIGN1cmJ1Zi0+Yl9wX21wcyA9IG1wc19zYXZlOworICAgIGlmIChmbGFnID09IEZBSUwpCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIGFkanVzdF9jdXJzb3JfY29sKCk7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7Cit9CisjZW5kaWYKKworLyoKKyAqICJxIiBjb21tYW5kOiBTdGFydC9zdG9wIHJlY29yZGluZy4KKyAqICJxOiIsICJxLyIsICJxPyI6IGVkaXQgY29tbWFuZC1saW5lIGluIGNvbW1hbmQtbGluZSB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfcmVjb3JkKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIGlmIChjYXAtPm9hcC0+b3BfdHlwZSA9PSBPUF9GT1JNQVQpCisgICAgeworCS8qICJncXEiIGlzIHRoZSBzYW1lIGFzICJncWdxIjogZm9ybWF0IGxpbmUgKi8KKwljYXAtPmNtZGNoYXIgPSAnZyc7CisJY2FwLT5uY2hhciA9ICdxJzsKKwludl9vcGVyYXRvcihjYXApOworICAgIH0KKyAgICBlbHNlIGlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKyAgICB7CisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoY2FwLT5uY2hhciA9PSAnOicgfHwgY2FwLT5uY2hhciA9PSAnLycgfHwgY2FwLT5uY2hhciA9PSAnPycpCisJeworCSAgICBzdHVmZmNoYXJSZWFkYnVmZihjYXAtPm5jaGFyKTsKKwkgICAgc3R1ZmZjaGFyUmVhZGJ1ZmYoS19DTURXSU4pOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgLyogKHN0b3ApIHJlY29yZGluZyBpbnRvIGEgbmFtZWQgcmVnaXN0ZXIsIHVubGVzcyBleGVjdXRpbmcgYQorCSAgICAgKiByZWdpc3RlciAqLworCSAgICBpZiAoIUV4ZWNfcmVnICYmIGRvX3JlY29yZChjYXAtPm5jaGFyKSA9PSBGQUlMKQorCQljbGVhcm9wYmVlcChjYXAtPm9hcCk7CisgICAgfQorfQorCisvKgorICogSGFuZGxlIHRoZSAiQHIiIGNvbW1hbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfYXQoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKGNoZWNrY2xlYXJvcChjYXAtPm9hcCkpCisJcmV0dXJuOworI2lmZGVmIEZFQVRfRVZBTAorICAgIGlmIChjYXAtPm5jaGFyID09ICc9JykKKyAgICB7CisJaWYgKGdldF9leHByX3JlZ2lzdGVyKCkgPT0gTlVMKQorCSAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgd2hpbGUgKGNhcC0+Y291bnQxLS0gJiYgIWdvdF9pbnQpCisgICAgeworCWlmIChkb19leGVjcmVnKGNhcC0+bmNoYXIsIEZBTFNFLCBGQUxTRSkgPT0gRkFJTCkKKwl7CisJICAgIGNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKwkgICAgYnJlYWs7CisJfQorCWxpbmVfYnJlYWtjaGVjaygpOworICAgIH0KK30KKworLyoKKyAqIEhhbmRsZSB0aGUgQ1RSTC1VIGFuZCBDVFJMLUQgY29tbWFuZHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfaGFsZnBhZ2UoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgaWYgKChjYXAtPmNtZGNoYXIgPT0gQ3RybF9VICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA9PSAxKQorCSAgICB8fCAoY2FwLT5jbWRjaGFyID09IEN0cmxfRAorCQkmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpKQorCWNsZWFyb3BiZWVwKGNhcC0+b2FwKTsKKyAgICBlbHNlIGlmICghY2hlY2tjbGVhcm9wKGNhcC0+b2FwKSkKKwloYWxmcGFnZShjYXAtPmNtZGNoYXIgPT0gQ3RybF9ELCBjYXAtPmNvdW50MCk7Cit9CisKKy8qCisgKiBIYW5kbGUgIkoiIG9yICJnSiIgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9qb2luKGNhcCkKKyAgICBjbWRhcmdfVCAqY2FwOworeworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCS8qIGpvaW4gdGhlIHZpc3VhbCBsaW5lcyAqLworCW52X29wZXJhdG9yKGNhcCk7CisgICAgZWxzZQorI2VuZGlmCisJaWYgKCFjaGVja2NsZWFyb3AoY2FwLT5vYXApKQorICAgIHsKKwlpZiAoY2FwLT5jb3VudDAgPD0gMSkKKwkgICAgY2FwLT5jb3VudDAgPSAyOwkgICAgLyogZGVmYXVsdCBmb3Igam9pbiBpcyB0d28gbGluZXMhICovCisJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSArIGNhcC0+Y291bnQwIC0gMSA+CisJCQkJCQkgICBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgY2xlYXJvcGJlZXAoY2FwLT5vYXApOyAgLyogYmV5b25kIGxhc3QgbGluZSAqLworCWVsc2UKKwl7CisJICAgIHByZXBfcmVkbyhjYXAtPm9hcC0+cmVnbmFtZSwgY2FwLT5jb3VudDAsCisJCQkgTlVMLCBjYXAtPmNtZGNoYXIsIE5VTCwgTlVMLCBjYXAtPm5jaGFyKTsKKwkgICAgZG9fZG9fam9pbihjYXAtPmNvdW50MCwgY2FwLT5uY2hhciA9PSBOVUwpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiAiUCIsICJnUCIsICJwIiBhbmQgImdwIiBjb21tYW5kcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitudl9wdXQoY2FwKQorICAgIGNtZGFyZ19UICAqY2FwOworeworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaW50CQlyZWduYW1lID0gMDsKKyAgICB2b2lkCSpyZWcxID0gTlVMTCwgKnJlZzIgPSBOVUxMOworI2VuZGlmCisgICAgaW50CQlkaXI7CisgICAgaW50CQlmbGFncyA9IDA7CisKKyAgICBpZiAoY2FwLT5vYXAtPm9wX3R5cGUgIT0gT1BfTk9QKQorICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwkvKiAiZHAiIGlzICI6ZGlmZnB1dCIgKi8KKwlpZiAoY2FwLT5vYXAtPm9wX3R5cGUgPT0gT1BfREVMRVRFICYmIGNhcC0+Y21kY2hhciA9PSAncCcpCisJeworCSAgICBjbGVhcm9wKGNhcC0+b2FwKTsKKwkgICAgbnZfZGlmZmdldHB1dChUUlVFKTsKKwl9CisJZWxzZQorI2VuZGlmCisJY2xlYXJvcGJlZXAoY2FwLT5vYXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWRpciA9IChjYXAtPmNtZGNoYXIgPT0gJ1AnCisJCXx8IChjYXAtPmNtZGNoYXIgPT0gJ2cnICYmIGNhcC0+bmNoYXIgPT0gJ1AnKSkKKwkJCQkJCQkgPyBCQUNLV0FSRCA6IEZPUldBUkQ7CisJcHJlcF9yZWRvX2NtZChjYXApOworCWlmIChjYXAtPmNtZGNoYXIgPT0gJ2cnKQorCSAgICBmbGFncyB8PSBQVVRfQ1VSU0VORDsKKworI2lmZGVmIEZFQVRfVklTVUFMCisJaWYgKFZJc3VhbF9hY3RpdmUpCisJeworCSAgICAvKiBQdXR0aW5nIGluIFZpc3VhbCBtb2RlOiBUaGUgcHV0IHRleHQgcmVwbGFjZXMgdGhlIHNlbGVjdGVkCisJICAgICAqIHRleHQuICBGaXJzdCBkZWxldGUgdGhlIHNlbGVjdGVkIHRleHQsIHRoZW4gcHV0IHRoZSBuZXcgdGV4dC4KKwkgICAgICogTmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSByZWdpc3RlcnMgdGhhdCB0aGUgZGVsZXRlCisJICAgICAqIG92ZXJ3cml0ZXMgaWYgdGhlIG9sZCBjb250ZW50cyBpcyBiZWluZyBwdXQuCisJICAgICAqLworCSAgICByZWduYW1lID0gY2FwLT5vYXAtPnJlZ25hbWU7CisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisJICAgIGFkanVzdF9jbGlwX3JlZygmcmVnbmFtZSk7CisjIGVuZGlmCisJICAgIGlmIChyZWduYW1lID09IDAgfHwgVklNX0lTRElHSVQocmVnbmFtZSkKKyMgaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkJICAgIHx8IChjbGlwX3VubmFtZWQgJiYgKHJlZ25hbWUgPT0gJyonIHx8IHJlZ25hbWUgPT0gJysnKSkKKyMgZW5kaWYKKworCQkgICAgKQorCSAgICB7CisJCS8qIHRoZSBkZWxldGUgaXMgZ29pbmcgdG8gb3ZlcndyaXRlIHRoZSByZWdpc3RlciB3ZSB3YW50IHRvCisJCSAqIHB1dCwgc2F2ZSBpdCBmaXJzdC4gKi8KKwkJcmVnMSA9IGdldF9yZWdpc3RlcihyZWduYW1lLCBUUlVFKTsKKwkgICAgfQorCisJICAgIC8qIE5vdyBkZWxldGUgdGhlIHNlbGVjdGVkIHRleHQuICovCisJICAgIGNhcC0+Y21kY2hhciA9ICdkJzsKKwkgICAgY2FwLT5uY2hhciA9IE5VTDsKKwkgICAgY2FwLT5vYXAtPnJlZ25hbWUgPSBOVUw7CisJICAgIG52X29wZXJhdG9yKGNhcCk7CisJICAgIGRvX3BlbmRpbmdfb3BlcmF0b3IoY2FwLCAwLCBGQUxTRSk7CisKKwkgICAgLyogZGVsZXRlIFBVVF9MSU5FX0JBQ0tXQVJEOyAqLworCSAgICBjYXAtPm9hcC0+cmVnbmFtZSA9IHJlZ25hbWU7CisKKwkgICAgaWYgKHJlZzEgIT0gTlVMTCkKKwkgICAgeworCQkvKiBEZWxldGUgcHJvYmFibHkgY2hhbmdlZCB0aGUgcmVnaXN0ZXIgd2Ugd2FudCB0byBwdXQsIHNhdmUKKwkJICogaXQgZmlyc3QuIFRoZW4gcHV0IGJhY2sgd2hhdCB3YXMgdGhlcmUgYmVmb3JlIHRoZSBkZWxldGUuICovCisJCXJlZzIgPSBnZXRfcmVnaXN0ZXIocmVnbmFtZSwgRkFMU0UpOworCQlwdXRfcmVnaXN0ZXIocmVnbmFtZSwgcmVnMSk7CisJICAgIH0KKworCSAgICAvKiBXaGVuIGRlbGV0ZWQgYSBsaW5ld2lzZSBWaXN1YWwgYXJlYSwgcHV0IHRoZSByZWdpc3RlciBhcworCSAgICAgKiBsaW5lcyB0byBhdm9pZCBpdCBqb2luZWQgd2l0aCB0aGUgbmV4dCBsaW5lLiAgV2hlbiBkZWxldGlvbiB3YXMKKwkgICAgICogY2hhcmFjdGVyd2lzZSwgc3BsaXQgYSBsaW5lIHdoZW4gcHV0dGluZyBsaW5lcy4gKi8KKwkgICAgaWYgKFZJc3VhbF9tb2RlID09ICdWJykKKwkJZmxhZ3MgfD0gUFVUX0xJTkU7CisJICAgIGVsc2UgaWYgKFZJc3VhbF9tb2RlID09ICd2JykKKwkJZmxhZ3MgfD0gUFVUX0xJTkVfU1BMSVQ7CisJICAgIGlmIChWSXN1YWxfbW9kZSA9PSBDdHJsX1YgJiYgZGlyID09IEZPUldBUkQpCisJCWZsYWdzIHw9IFBVVF9MSU5FX0ZPUldBUkQ7CisJICAgIGRpciA9IEJBQ0tXQVJEOworCSAgICBpZiAoKFZJc3VhbF9tb2RlICE9ICdWJworCQkJJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPCBjdXJidWYtPmJfb3Bfc3RhcnQuY29sKQorCQkgICAgfHwgKFZJc3VhbF9tb2RlID09ICdWJworCQkJJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0pKQorCQkvKiBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBvciBlbmQgb2YgZmlsZSwgcHV0CisJCSAqIGZvcndhcmQuICovCisJCWRpciA9IEZPUldBUkQ7CisJfQorI2VuZGlmCisJZG9fcHV0KGNhcC0+b2FwLT5yZWduYW1lLCBkaXIsIGNhcC0+Y291bnQxLCBmbGFncyk7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCS8qIElmIGEgcmVnaXN0ZXIgd2FzIHNhdmVkLCBwdXQgaXQgYmFjayBub3cuICovCisJaWYgKHJlZzIgIT0gTlVMTCkKKwkgICAgcHV0X3JlZ2lzdGVyKHJlZ25hbWUsIHJlZzIpOworI2VuZGlmCisJYXV0b19mb3JtYXQoRkFMU0UsIFRSVUUpOworICAgIH0KK30KKworLyoKKyAqICJvIiBhbmQgIk8iIGNvbW1hbmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK252X29wZW4oY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgLyogImRvIiBpcyAiOmRpZmZnZXQiICovCisgICAgaWYgKGNhcC0+b2FwLT5vcF90eXBlID09IE9QX0RFTEVURSAmJiBjYXAtPmNtZGNoYXIgPT0gJ28nKQorICAgIHsKKwljbGVhcm9wKGNhcC0+b2FwKTsKKwludl9kaWZmZ2V0cHV0KEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSkgIC8qIHN3aXRjaCBzdGFydCBhbmQgZW5kIG9mIHZpc3VhbCAqLworCXZfc3dhcF9jb3JuZXJzKGNhcC0+Y21kY2hhcik7CisgICAgZWxzZQorI2VuZGlmCisJbl9vcGVuY21kKGNhcCk7Cit9CisKKyNpZmRlZiBGRUFUX1NOSUZGCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfc25pZmYoY2FwKQorICAgIGNtZGFyZ19UCSpjYXA7Cit7CisgICAgUHJvY2Vzc1NuaWZmUmVxdWVzdHMoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgc3RhdGljIHZvaWQKK252X25iY21kKGNhcCkKKyAgICBjbWRhcmdfVAkqY2FwOworeworICAgIG5ldGJlYW5zX2tleWNvbW1hbmQoY2FwLT5uY2hhcik7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRE5ECisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAorbnZfZHJvcChjYXApCisgICAgY21kYXJnX1QJKmNhcDsKK3sKKyAgICBkb19wdXQoJ34nLCBCQUNLV0FSRCwgMUwsIFBVVF9DVVJTRU5EKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29wcy5jIGIvc3JjL29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDBjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3BzLmMKQEAgLTAsMCArMSw2MTE0IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBvcHMuYzogaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBvcGVyYXRvcnM6IG9wX3NoaWZ0LCBvcF9kZWxldGUsIG9wX3RpbGRlLAorICoJICBvcF9jaGFuZ2UsIG9wX3lhbmssIGRvX3B1dCwgZG9fam9pbgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyoKKyAqIE51bWJlciBvZiByZWdpc3RlcnMuCisgKgkwID0gdW5uYW1lZCByZWdpc3RlciwgZm9yIG5vcm1hbCB5YW5rcyBhbmQgcHV0cworICogICAxLi45ID0gcmVnaXN0ZXJzICcxJyB0byAnOScsIGZvciBkZWxldGVzCisgKiAxMC4uMzUgPSByZWdpc3RlcnMgJ2EnIHRvICd6JworICogICAgIDM2ID0gZGVsZXRlIHJlZ2lzdGVyICctJworICogICAgIDM3ID0gU2VsZWN0aW9uIHJlZ2lzdGVyICcqJy4gT25seSBpZiBGRUFUX0NMSVBCT0FSRCBkZWZpbmVkCisgKiAgICAgMzggPSBDbGlwYm9hcmQgcmVnaXN0ZXIgJysnLiBPbmx5IGlmIEZFQVRfQ0xJUEJPQVJEIGFuZCBGRUFUX1gxMSBkZWZpbmVkCisgKi8KKy8qCisgKiBTeW1ib2xpYyBuYW1lcyBmb3Igc29tZSByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgREVMRVRJT05fUkVHSVNURVIJMzYKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorIyBkZWZpbmUgU1RBUl9SRUdJU1RFUgkJMzcKKyMgIGlmZGVmIEZFQVRfWDExCisjICAgZGVmaW5lIFBMVVNfUkVHSVNURVIJMzgKKyMgIGVsc2UKKyMgICBkZWZpbmUgUExVU19SRUdJU1RFUglTVEFSX1JFR0lTVEVSCSAgICAvKiB0aGVyZSBpcyBvbmx5IG9uZSAqLworIyAgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfRE5ECisjIGRlZmluZSBUSUxERV9SRUdJU1RFUgkJKFBMVVNfUkVHSVNURVIgKyAxKQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorIyBpZmRlZiBGRUFUX0RORAorIyAgZGVmaW5lIE5VTV9SRUdJU1RFUlMJCShUSUxERV9SRUdJU1RFUiArIDEpCisjIGVsc2UKKyMgIGRlZmluZSBOVU1fUkVHSVNURVJTCQkoUExVU19SRUdJU1RFUiArIDEpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgTlVNX1JFR0lTVEVSUwkJMzcKKyNlbmRpZgorCisvKgorICogRWFjaCB5YW5rIHJlZ2lzdGVyIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGxpbmVzLgorICovCitzdGF0aWMgc3RydWN0IHlhbmtyZWcKK3sKKyAgICBjaGFyX3UJKip5X2FycmF5OwkvKiBwb2ludGVyIHRvIGFycmF5IG9mIGxpbmUgcG9pbnRlcnMgKi8KKyAgICBsaW5lbnJfVAl5X3NpemU7CQkvKiBudW1iZXIgb2YgbGluZXMgaW4geV9hcnJheSAqLworICAgIGNoYXJfdQl5X3R5cGU7CQkvKiBNTElORSwgTUNIQVIgb3IgTUJMT0NLICovCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBjb2xucl9UCXlfd2lkdGg7CS8qIG9ubHkgc2V0IGlmIHlfdHlwZSA9PSBNQkxPQ0sgKi8KKyNlbmRpZgorfSB5X3JlZ3NbTlVNX1JFR0lTVEVSU107CisKK3N0YXRpYyBzdHJ1Y3QgeWFua3JlZwkqeV9jdXJyZW50OwkgICAgLyogcHRyIHRvIGN1cnJlbnQgeWFua3JlZyAqLworc3RhdGljIGludAkJeV9hcHBlbmQ7CSAgICAvKiBUUlVFIHdoZW4gYXBwZW5kaW5nICovCitzdGF0aWMgc3RydWN0IHlhbmtyZWcJKnlfcHJldmlvdXMgPSBOVUxMOyAvKiBwdHIgdG8gbGFzdCB3cml0dGVuIHlhbmtyZWcgKi8KKworLyoKKyAqIHN0cnVjdHVyZSB1c2VkIGJ5IGJsb2NrX3ByZXAsIG9wX2RlbGV0ZSBhbmQgb3BfeWFuayBmb3IgYmxvY2t3aXNlIG9wZXJhdG9ycworICogYWxzbyBvcF9jaGFuZ2UsIG9wX3NoaWZ0LCBvcF9pbnNlcnQsIG9wX3JlcGxhY2UgLSBBS2VsbHkKKyAqLworc3RydWN0IGJsb2NrX2RlZgoreworICAgIGludAkJc3RhcnRzcGFjZXM7CS8qICdleHRyYScgY29scyBvZiBmaXJzdCBjaGFyICovCisgICAgaW50CQllbmRzcGFjZXM7CS8qICdleHRyYScgY29scyBvZiBmaXJzdCBjaGFyICovCisgICAgaW50CQl0ZXh0bGVuOwkvKiBjaGFycyBpbiBibG9jayAqLworICAgIGNoYXJfdQkqdGV4dHN0YXJ0OwkvKiBwb2ludGVyIHRvIDFzdCBjaGFyIGluIGJsb2NrICovCisgICAgY29sbnJfVAl0ZXh0Y29sOwkvKiBjb2xzIG9mIGNoYXJzIChhdCBsZWFzdCBwYXJ0LikgaW4gYmxvY2sgKi8KKyAgICBjb2xucl9UCXN0YXJ0X3Zjb2w7CS8qIHN0YXJ0IGNvbCBvZiAxc3QgY2hhciB3aG9sbHkgaW5zaWRlIGJsb2NrICovCisgICAgY29sbnJfVAllbmRfdmNvbDsJLyogc3RhcnQgY29sIG9mIDFzdCBjaGFyIHdob2xseSBhZnRlciBibG9jayAqLworI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKyAgICBpbnQJCWlzX3Nob3J0OwkvKiBUUlVFIGlmIGxpbmUgaXMgdG9vIHNob3J0IHRvIGZpdCBpbiBibG9jayAqLworICAgIGludAkJaXNfTUFYOwkJLyogVFJVRSBpZiBjdXJzd2FudD09TUFYQ09MIHdoZW4gc3RhcnRpbmcgKi8KKyAgICBpbnQJCWlzX29uZUNoYXI7CS8qIFRSVUUgaWYgYmxvY2sgd2l0aGluIG9uZSBjaGFyYWN0ZXIgKi8KKyAgICBpbnQJCXByZV93aGl0ZXNwOwkvKiBzY3JlZW4gY29scyBvZiB3cyBiZWZvcmUgYmxvY2sgKi8KKyAgICBpbnQJCXByZV93aGl0ZXNwX2M7CS8qIGNoYXJzIG9mIHdzIGJlZm9yZSBibG9jayAqLworICAgIGNvbG5yX1QJZW5kX2NoYXJfdmNvbHM7CS8qIG51bWJlciBvZiB2Y29scyBvZiBwb3N0LWJsb2NrIGNoYXIgKi8KKyNlbmRpZgorICAgIGNvbG5yX1QJc3RhcnRfY2hhcl92Y29sczsgLyogbnVtYmVyIG9mIHZjb2xzIG9mIHByZS1ibG9jayBjaGFyICovCit9OworCisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorc3RhdGljIHZvaWQgc2hpZnRfYmxvY2sgX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBhbW91bnQpKTsKK3N0YXRpYyB2b2lkIGJsb2NrX2luc2VydCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgY2hhcl91ICpzLCBpbnQgYl9pbnNlcnQsIHN0cnVjdCBibG9ja19kZWYqYmRwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCWdldF95YW5rX3JlZ2lzdGVyIF9fQVJHUygoaW50IHJlZ25hbWUsIGludCB3cml0aW5nKSk7CitzdGF0aWMgaW50CXN0dWZmX3lhbmsgX19BUkdTKChpbnQsIGNoYXJfdSAqKSk7CitzdGF0aWMgdm9pZAlwdXRfcmVlZGl0X2luX3R5cGVidWYgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50CXB1dF9pbl90eXBlYnVmIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgY29sb24pKTsKK3N0YXRpYyB2b2lkCXN0dWZmZXNjYXBlZCBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgbGl0ZXJhbGx5KSk7CitzdGF0aWMgaW50CWdldF9zcGVjX3JlZyBfX0FSR1MoKGludCByZWduYW1lLCBjaGFyX3UgKiphcmdwLCBpbnQgKmFsbG9jYXRlZCwgaW50IGVycm1zZykpOworc3RhdGljIHZvaWQJY21kbGluZV9wYXN0ZV9zdHIgX19BUkdTKChjaGFyX3UgKnMsIGludCBsaXRlcmFsbHkpKTsKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgdm9pZAltYl9hZGp1c3Rfb3BlbmQgX19BUkdTKChvcGFyZ19UICpvYXApKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJZnJlZV95YW5rIF9fQVJHUygobG9uZykpOworc3RhdGljIHZvaWQJZnJlZV95YW5rX2FsbCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQJeWFua19jb3B5X2xpbmUgX19BUkdTKChzdHJ1Y3QgYmxvY2tfZGVmICpiZCwgbG9uZyB5X2lkeCkpOworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECitzdGF0aWMgdm9pZAljb3B5X3lhbmtfcmVnIF9fQVJHUygoc3RydWN0IHlhbmtyZWcgKnJlZykpOworIyBpZiBkZWZpbmVkKEZFQVRfVklTVUFMKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkKK3N0YXRpYyB2b2lkCW1heV9zZXRfc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOworIyBlbmRpZgorI2VuZGlmCitzdGF0aWMgdm9pZAlkaXNfbXNnIF9fQVJHUygoY2hhcl91ICpwLCBpbnQgc2tpcF9lc2MpKTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorc3RhdGljIHZvaWQJYmxvY2tfcHJlcCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgc3RydWN0IGJsb2NrX2RlZiAqLCBsaW5lbnJfVCwgaW50KSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkKK3N0YXRpYyB2b2lkCXN0cl90b19yZWcgX19BUkdTKChzdHJ1Y3QgeWFua3JlZyAqeV9wdHIsIGludCB0eXBlLCBjaGFyX3UgKnN0ciwgbG9uZyBsZW4sIGxvbmcgYmxvY2tsZW4pKTsKKyNlbmRpZgorc3RhdGljIGludAllbmRzX2luX3doaXRlIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworI2lmZGVmIEZFQVRfQ09NTUVOVFMKK3N0YXRpYyBpbnQJc2FtZV9sZWFkZXIgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBpbnQsIGNoYXJfdSAqLCBpbnQsIGNoYXJfdSAqKSk7CitzdGF0aWMgaW50CWZtdF9jaGVja19wYXIgX19BUkdTKChsaW5lbnJfVCwgaW50ICosIGNoYXJfdSAqKiwgaW50IGRvX2NvbW1lbnRzKSk7CisjZWxzZQorc3RhdGljIGludAlmbXRfY2hlY2tfcGFyIF9fQVJHUygobGluZW5yX1QpKTsKKyNlbmRpZgorCisvKgorICogVGhlIG5hbWVzIG9mIG9wZXJhdG9ycy4KKyAqIElNUE9SVEFOVDogSW5kZXggbXVzdCBjb3JyZXNwb25kIHdpdGggZGVmaW5lcyBpbiB2aW0uaCEhIQorICogVGhlIHRoaXJkIGZpZWxkIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvcGVyYXRvciBhbHdheXMgd29ya3Mgb24gbGluZXMuCisgKi8KK3N0YXRpYyBjaGFyIG9wY2hhcnNbXVszXSA9Cit7CisgICAge05VTCwgTlVMLCBGQUxTRX0sCS8qIE9QX05PUCAqLworICAgIHsnZCcsIE5VTCwgRkFMU0V9LAkvKiBPUF9ERUxFVEUgKi8KKyAgICB7J3knLCBOVUwsIEZBTFNFfSwJLyogT1BfWUFOSyAqLworICAgIHsnYycsIE5VTCwgRkFMU0V9LAkvKiBPUF9DSEFOR0UgKi8KKyAgICB7JzwnLCBOVUwsIFRSVUV9LAkvKiBPUF9MU0hJRlQgKi8KKyAgICB7Jz4nLCBOVUwsIFRSVUV9LAkvKiBPUF9SU0hJRlQgKi8KKyAgICB7JyEnLCBOVUwsIFRSVUV9LAkvKiBPUF9GSUxURVIgKi8KKyAgICB7J2cnLCAnficsIEZBTFNFfSwJLyogT1BfVElMREUgKi8KKyAgICB7Jz0nLCBOVUwsIFRSVUV9LAkvKiBPUF9JTkRFTlQgKi8KKyAgICB7J2cnLCAncScsIFRSVUV9LAkvKiBPUF9GT1JNQVQgKi8KKyAgICB7JzonLCBOVUwsIFRSVUV9LAkvKiBPUF9DT0xPTiAqLworICAgIHsnZycsICdVJywgRkFMU0V9LAkvKiBPUF9VUFBFUiAqLworICAgIHsnZycsICd1JywgRkFMU0V9LAkvKiBPUF9MT1dFUiAqLworICAgIHsnSicsIE5VTCwgVFJVRX0sCS8qIERPX0pPSU4gKi8KKyAgICB7J2cnLCAnSicsIFRSVUV9LAkvKiBET19KT0lOX05TICovCisgICAgeydnJywgJz8nLCBGQUxTRX0sCS8qIE9QX1JPVDEzICovCisgICAgeydyJywgTlVMLCBGQUxTRX0sCS8qIE9QX1JFUExBQ0UgKi8KKyAgICB7J0knLCBOVUwsIEZBTFNFfSwJLyogT1BfSU5TRVJUICovCisgICAgeydBJywgTlVMLCBGQUxTRX0sCS8qIE9QX0FQUEVORCAqLworICAgIHsneicsICdmJywgVFJVRX0sCS8qIE9QX0ZPTEQgKi8KKyAgICB7J3onLCAnbycsIFRSVUV9LAkvKiBPUF9GT0xET1BFTiAqLworICAgIHsneicsICdPJywgVFJVRX0sCS8qIE9QX0ZPTERPUEVOUkVDICovCisgICAgeyd6JywgJ2MnLCBUUlVFfSwJLyogT1BfRk9MRENMT1NFICovCisgICAgeyd6JywgJ0MnLCBUUlVFfSwJLyogT1BfRk9MRENMT1NFUkVDICovCisgICAgeyd6JywgJ2QnLCBUUlVFfSwJLyogT1BfRk9MRERFTCAqLworICAgIHsneicsICdEJywgVFJVRX0sCS8qIE9QX0ZPTERERUxSRUMgKi8KKyAgICB7J2cnLCAndycsIFRSVUV9LAkvKiBPUF9GT1JNQVQyICovCit9OworCisvKgorICogVHJhbnNsYXRlIGEgY29tbWFuZCBuYW1lIGludG8gYW4gb3BlcmF0b3IgdHlwZS4KKyAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIHZhbGlkIG9wZXJhdG9yIG5hbWUhCisgKi8KKyAgICBpbnQKK2dldF9vcF90eXBlKGNoYXIxLCBjaGFyMikKKyAgICBpbnQJCWNoYXIxOworICAgIGludAkJY2hhcjI7Cit7CisgICAgaW50CQlpOworCisgICAgaWYgKGNoYXIxID09ICdyJykJCS8qIGlnbm9yZSBzZWNvbmQgY2hhcmFjdGVyICovCisJcmV0dXJuIE9QX1JFUExBQ0U7CisgICAgaWYgKGNoYXIxID09ICd+JykJCS8qIHdoZW4gdGlsZGUgaXMgYW4gb3BlcmF0b3IgKi8KKwlyZXR1cm4gT1BfVElMREU7CisgICAgZm9yIChpID0gMDsgOyArK2kpCisJaWYgKG9wY2hhcnNbaV1bMF0gPT0gY2hhcjEgJiYgb3BjaGFyc1tpXVsxXSA9PSBjaGFyMikKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVklTVUFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiBUUlVFIGlmIG9wZXJhdG9yICJvcCIgYWx3YXlzIHdvcmtzIG9uIHdob2xlIGxpbmVzLgorICovCisgICAgaW50CitvcF9vbl9saW5lcyhvcCkKKyAgICBpbnQgb3A7Cit7CisgICAgcmV0dXJuIG9wY2hhcnNbb3BdWzJdOworfQorI2VuZGlmCisKKy8qCisgKiBHZXQgZmlyc3Qgb3BlcmF0b3IgY29tbWFuZCBjaGFyYWN0ZXIuCisgKiBSZXR1cm5zICdnJyBvciAneicgaWYgdGhlcmUgaXMgYW5vdGhlciBjb21tYW5kIGNoYXJhY3Rlci4KKyAqLworICAgIGludAorZ2V0X29wX2NoYXIob3B0eXBlKQorICAgIGludAkJb3B0eXBlOworeworICAgIHJldHVybiBvcGNoYXJzW29wdHlwZV1bMF07Cit9CisKKy8qCisgKiBHZXQgc2Vjb25kIG9wZXJhdG9yIGNvbW1hbmQgY2hhcmFjdGVyLgorICovCisgICAgaW50CitnZXRfZXh0cmFfb3BfY2hhcihvcHR5cGUpCisgICAgaW50CQlvcHR5cGU7Cit7CisgICAgcmV0dXJuIG9wY2hhcnNbb3B0eXBlXVsxXTsKK30KKworLyoKKyAqIG9wX3NoaWZ0IC0gaGFuZGxlIGEgc2hpZnQgb3BlcmF0aW9uCisgKi8KKyAgICB2b2lkCitvcF9zaGlmdChvYXAsIGN1cnNfdG9wLCBhbW91bnQpCisgICAgb3BhcmdfVAkgICAgKm9hcDsKKyAgICBpbnQJCSAgICBjdXJzX3RvcDsKKyAgICBpbnQJCSAgICBhbW91bnQ7Cit7CisgICAgbG9uZwkgICAgaTsKKyAgICBpbnQJCSAgICBmaXJzdF9jaGFyOworICAgIGNoYXJfdQkgICAgKnM7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpbnQJCSAgICBibG9ja19jb2wgPSAwOworI2VuZGlmCisKKyAgICBpZiAodV9zYXZlKChsaW5lbnJfVCkob2FwLT5zdGFydC5sbnVtIC0gMSksCisJCQkJICAgICAgIChsaW5lbnJfVCkob2FwLT5lbmQubG51bSArIDEpKSA9PSBGQUlMKQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKG9hcC0+YmxvY2tfbW9kZSkKKwlibG9ja19jb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyNlbmRpZgorCisgICAgZm9yIChpID0gb2FwLT5saW5lX2NvdW50OyAtLWkgPj0gMDsgKQorICAgIHsKKwlmaXJzdF9jaGFyID0gKm1sX2dldF9jdXJsaW5lKCk7CisJaWYgKGZpcnN0X2NoYXIgPT0gTlVMKQkJCQkvKiBlbXB0eSBsaW5lICovCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyNpZmRlZiBGRUFUX1ZJU1VBTEVYVFJBCisJZWxzZSBpZiAob2FwLT5ibG9ja19tb2RlKQorCSAgICBzaGlmdF9ibG9jayhvYXAsIGFtb3VudCk7CisjZW5kaWYKKwllbHNlCisJICAgIC8qIE1vdmUgdGhlIGxpbmUgcmlnaHQgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoICcjJywgJ3NtYXJ0aW5kZW50JworCSAgICAgKiBpc24ndCBzZXQgb3IgJ2NpbmRlbnQnIGlzbid0IHNldCBvciAnIycgaXNuJ3QgaW4gJ2Npbm8nLiAqLworI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpCisJICAgIGlmIChmaXJzdF9jaGFyICE9ICcjJyB8fCAhcHJlcHJvY3NfbGVmdCgpKQorI2VuZGlmCisJeworCSAgICBzaGlmdF9saW5lKG9hcC0+b3BfdHlwZSA9PSBPUF9MU0hJRlQsIHBfc3IsIGFtb3VudCk7CisJfQorCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIH0KKworICAgIGNoYW5nZWRfbGluZXMob2FwLT5zdGFydC5sbnVtLCAwLCBvYXAtPmVuZC5sbnVtICsgMSwgMEwpOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAob2FwLT5ibG9ja19tb2RlKQorICAgIHsKKwljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvYXAtPnN0YXJ0LmxudW07CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSBibG9ja19jb2w7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCWlmIChjdXJzX3RvcCkJICAgIC8qIHB1dCBjdXJzb3Igb24gZmlyc3QgbGluZSwgZm9yICI+PiIgKi8KKyAgICB7CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gb2FwLT5zdGFydC5sbnVtOworCWJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOyAgIC8qIHNoaWZ0X2xpbmUoKSBtYXkgaGF2ZSBzZXQgY3Vyc29yLmNvbCAqLworICAgIH0KKyAgICBlbHNlCisJLS1jdXJ3aW4tPndfY3Vyc29yLmxudW07CS8qIHB1dCBjdXJzb3Igb24gbGFzdCBsaW5lLCBmb3IgIjo+IiAqLworCisgICAgaWYgKG9hcC0+bGluZV9jb3VudCA+IHBfcmVwb3J0KQorICAgIHsKKwlpZiAob2FwLT5vcF90eXBlID09IE9QX1JTSElGVCkKKwkgICAgcyA9IChjaGFyX3UgKikiPiI7CisJZWxzZQorCSAgICBzID0gKGNoYXJfdSAqKSI8IjsKKwlpZiAob2FwLT5saW5lX2NvdW50ID09IDEpCisJeworCSAgICBpZiAoYW1vdW50ID09IDEpCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIjEgbGluZSAlc2VkIDEgdGltZSIpLCBzKTsKKwkgICAgZWxzZQorCQlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCIxIGxpbmUgJXNlZCAlZCB0aW1lcyIpLCBzLCBhbW91bnQpOworCX0KKwllbHNlCisJeworCSAgICBpZiAoYW1vdW50ID09IDEpCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsIF8oIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIpLAorCQkJCQkJCSAgb2FwLT5saW5lX2NvdW50LCBzKTsKKwkgICAgZWxzZQorCQlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIpLAorCQkJCQkJICBvYXAtPmxpbmVfY291bnQsIHMsIGFtb3VudCk7CisJfQorCW1zZyhJT2J1ZmYpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICInWyIgYW5kICInXSIgbWFya3MuCisgICAgICovCisgICAgY3VyYnVmLT5iX29wX3N0YXJ0ID0gb2FwLT5zdGFydDsKKyAgICBjdXJidWYtPmJfb3BfZW5kLmxudW0gPSBvYXAtPmVuZC5sbnVtOworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQuY29sID0gKGNvbG5yX1QpU1RSTEVOKG1sX2dldChvYXAtPmVuZC5sbnVtKSk7CisgICAgaWYgKGN1cmJ1Zi0+Yl9vcF9lbmQuY29sID4gMCkKKwktLWN1cmJ1Zi0+Yl9vcF9lbmQuY29sOworfQorCisvKgorICogc2hpZnQgdGhlIGN1cnJlbnQgbGluZSBvbmUgc2hpZnR3aWR0aCBsZWZ0IChpZiBsZWZ0ICE9IDApIG9yIHJpZ2h0CisgKiBsZWF2ZXMgY3Vyc29yIG9uIGZpcnN0IGJsYW5rIGluIHRoZSBsaW5lCisgKi8KKyAgICB2b2lkCitzaGlmdF9saW5lKGxlZnQsIHJvdW5kLCBhbW91bnQpCisgICAgaW50CWxlZnQ7CisgICAgaW50CXJvdW5kOworICAgIGludAlhbW91bnQ7Cit7CisgICAgaW50CQljb3VudDsKKyAgICBpbnQJCWksIGo7CisgICAgaW50CQlwX3N3ID0gKGludCljdXJidWYtPmJfcF9zdzsKKworICAgIGNvdW50ID0gZ2V0X2luZGVudCgpOwkvKiBnZXQgY3VycmVudCBpbmRlbnQgKi8KKworICAgIGlmIChyb3VuZCkJCQkvKiByb3VuZCBvZmYgaW5kZW50ICovCisgICAgeworCWkgPSBjb3VudCAvIHBfc3c7CS8qIG51bWJlciBvZiBwX3N3IHJvdW5kZWQgZG93biAqLworCWogPSBjb3VudCAlIHBfc3c7CS8qIGV4dHJhIHNwYWNlcyAqLworCWlmIChqICYmIGxlZnQpCQkvKiBmaXJzdCByZW1vdmUgZXh0cmEgc3BhY2VzICovCisJICAgIC0tYW1vdW50OworCWlmIChsZWZ0KQorCXsKKwkgICAgaSAtPSBhbW91bnQ7CisJICAgIGlmIChpIDwgMCkKKwkJaSA9IDA7CisJfQorCWVsc2UKKwkgICAgaSArPSBhbW91bnQ7CisJY291bnQgPSBpICogcF9zdzsKKyAgICB9CisgICAgZWxzZQkJLyogb3JpZ2luYWwgdmkgaW5kZW50ICovCisgICAgeworCWlmIChsZWZ0KQorCXsKKwkgICAgY291bnQgLT0gcF9zdyAqIGFtb3VudDsKKwkgICAgaWYgKGNvdW50IDwgMCkKKwkJY291bnQgPSAwOworCX0KKwllbHNlCisJICAgIGNvdW50ICs9IHBfc3cgKiBhbW91bnQ7CisgICAgfQorCisgICAgLyogU2V0IG5ldyBpbmRlbnQgKi8KKyNpZmRlZiBGRUFUX1ZSRVBMQUNFCisgICAgaWYgKFN0YXRlICYgVlJFUExBQ0VfRkxBRykKKwljaGFuZ2VfaW5kZW50KElOREVOVF9TRVQsIGNvdW50LCBGQUxTRSwgTlVMKTsKKyAgICBlbHNlCisjZW5kaWYKKwkodm9pZClzZXRfaW5kZW50KGNvdW50LCBTSU5fQ0hBTkdFRCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVklTVUFMRVhUUkEpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2hpZnQgb25lIGxpbmUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb25lIHNoaWZ0d2lkdGggcmlnaHQgb3IgbGVmdC4KKyAqIExlYXZlcyBjdXJzb3Igb24gZmlyc3QgY2hhcmFjdGVyIGluIGJsb2NrLgorICovCisgICAgc3RhdGljIHZvaWQKK3NoaWZ0X2Jsb2NrKG9hcCwgYW1vdW50KQorICAgIG9wYXJnX1QJKm9hcDsKKyAgICBpbnQJCWFtb3VudDsKK3sKKyAgICBpbnQJCQlsZWZ0ID0gKG9hcC0+b3BfdHlwZSA9PSBPUF9MU0hJRlQpOworICAgIGludAkJCW9sZHN0YXRlID0gU3RhdGU7CisgICAgaW50CQkJdG90YWwsIHNwbGl0OworICAgIGNoYXJfdQkJKm5ld3AsICpvbGRwLCAqbWlkcCwgKnB0cjsKKyAgICBpbnQJCQlvbGRjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICBpbnQJCQlwX3N3ID0gKGludCljdXJidWYtPmJfcF9zdzsKKyAgICBpbnQJCQlwX3RzID0gKGludCljdXJidWYtPmJfcF90czsKKyAgICBzdHJ1Y3QgYmxvY2tfZGVmCWJkOworICAgIGludAkJCWludGVybmFsID0gMDsKKyAgICBpbnQJCQlpbmNyOworICAgIGNvbG5yX1QJCXZjb2wsIGNvbCA9IDAsIHdzX3Zjb2w7CisgICAgaW50CQkJaSA9IDAsIGogPSAwOworICAgIGludAkJCWxlbjsKKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgaW50CQkJb2xkX3BfcmkgPSBwX3JpOworCisgICAgcF9yaSA9IDA7CQkJLyogZG9uJ3Qgd2FudCByZXZpbnMgaW4gaWRlbnQgKi8KKyNlbmRpZgorCisgICAgU3RhdGUgPSBJTlNFUlQ7CQkvKiBkb24ndCB3YW50IFJFUExBQ0UgZm9yIFN0YXRlICovCisgICAgYmxvY2tfcHJlcChvYXAsICZiZCwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBUUlVFKTsKKyAgICBpZiAoYmQuaXNfc2hvcnQpCisJcmV0dXJuOworCisgICAgLyogdG90YWwgaXMgbnVtYmVyIG9mIHNjcmVlbiBjb2x1bW5zIHRvIGJlIGluc2VydGVkL3JlbW92ZWQgKi8KKyAgICB0b3RhbCA9IGFtb3VudCAqIHBfc3c7CisgICAgb2xkcCA9IG1sX2dldF9jdXJsaW5lKCk7CisKKyAgICBpZiAoIWxlZnQpCisgICAgeworCS8qCisJICogIDEuIEdldCBzdGFydCB2Y29sCisJICogIDIuIFRvdGFsIHdzIHZjb2xzCisJICogIDMuIERpdnZ5IGludG8gVEFCcyAmIHNwcAorCSAqICA0LiBDb25zdHJ1Y3QgbmV3IHN0cmluZworCSAqLworCXRvdGFsICs9IGJkLnByZV93aGl0ZXNwOyAvKiBhbGwgdmlydHVhbCBXUyB1cHRvICYgaW5jbCBhIHNwbGl0IFRBQiAqLworCXdzX3Zjb2wgPSBiZC5zdGFydF92Y29sIC0gYmQucHJlX3doaXRlc3A7CisJaWYgKGJkLnN0YXJ0c3BhY2VzKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWJkLnRleHRzdGFydCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGJkLnRleHRzdGFydCk7CisjZW5kaWYKKwkgICAgKytiZC50ZXh0c3RhcnQ7CisJfQorCWZvciAoIDsgdmltX2lzd2hpdGUoKmJkLnRleHRzdGFydCk7ICkKKwl7CisJICAgIGluY3IgPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZiZC50ZXh0c3RhcnQsIChjb2xucl9UKShiZC5zdGFydF92Y29sKSk7CisJICAgIHRvdGFsICs9IGluY3I7CisJICAgIGJkLnN0YXJ0X3Zjb2wgKz0gaW5jcjsKKwl9CisJLyogT0ssIG5vdyB0b3RhbD1hbGwgdGhlIFZXUyByZXFkLCBhbmQgdGV4dHN0YXJ0IHBvaW50cyBhdCB0aGUgMXN0CisJICogbm9uLXdzIGNoYXIgaW4gdGhlIGJsb2NrLiAqLworCWlmICghY3VyYnVmLT5iX3BfZXQpCisJICAgIGkgPSAoKHdzX3Zjb2wgJSBwX3RzKSArIHRvdGFsKSAvIHBfdHM7IC8qIG51bWJlciBvZiB0YWJzICovCisJaWYgKGkpCisJICAgIGogPSAoKHdzX3Zjb2wgJSBwX3RzKSArIHRvdGFsKSAlIHBfdHM7IC8qIG51bWJlciBvZiBzcHAgKi8KKwllbHNlCisJICAgIGogPSB0b3RhbDsKKwkvKiBpZiB3ZSdyZSBzcGxpdHRpbmcgYSBUQUIsIGFsbG93IGZvciBpdCAqLworCWJkLnRleHRjb2wgLT0gYmQucHJlX3doaXRlc3BfYyAtIChiZC5zdGFydHNwYWNlcyAhPSAwKTsKKwlsZW4gPSAoaW50KVNUUkxFTihiZC50ZXh0c3RhcnQpICsgMTsKKwluZXdwID0gYWxsb2NfY2hlY2soKHVuc2lnbmVkKShiZC50ZXh0Y29sICsgaSArIGogKyBsZW4pKTsKKwlpZiAobmV3cCA9PSBOVUxMKQorCSAgICByZXR1cm47CisJdmltX21lbXNldChuZXdwLCBOVUwsIChzaXplX3QpKGJkLnRleHRjb2wgKyBpICsgaiArIGxlbikpOworCW1jaF9tZW1tb3ZlKG5ld3AsIG9sZHAsIChzaXplX3QpYmQudGV4dGNvbCk7CisJY29weV9jaGFycyhuZXdwICsgYmQudGV4dGNvbCwgKHNpemVfdClpLCBUQUIpOworCWNvcHlfc3BhY2VzKG5ld3AgKyBiZC50ZXh0Y29sICsgaSwgKHNpemVfdClqKTsKKwkvKiB0aGUgZW5kICovCisJbWNoX21lbW1vdmUobmV3cCArIGJkLnRleHRjb2wgKyBpICsgaiwgYmQudGV4dHN0YXJ0LCAoc2l6ZV90KWxlbik7CisgICAgfQorICAgIGVsc2UgLyogbGVmdCAqLworICAgIHsKKwl2Y29sID0gb2FwLT5zdGFydF92Y29sOworCS8qIHdhbGsgdmNvbCBwYXN0IHdzIHRvIGJlIHJlbW92ZWQgKi8KKwlmb3IgKG1pZHAgPSBvbGRwICsgYmQudGV4dGNvbDsKKwkgICAgICB2Y29sIDwgKG9hcC0+c3RhcnRfdmNvbCArIHRvdGFsKSAmJiB2aW1faXN3aGl0ZSgqbWlkcCk7ICkKKwl7CisJICAgIGluY3IgPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZtaWRwLCAoY29sbnJfVCl2Y29sKTsKKwkgICAgdmNvbCArPSBpbmNyOworCX0KKwkvKiBpbnRlcm5hbCBpcyB0aGUgYmxvY2staW50ZXJuYWwgd3MgcmVwbGFjaW5nIGEgc3BsaXQgVEFCICovCisJaWYgKHZjb2wgPiAob2FwLT5zdGFydF92Y29sICsgdG90YWwpKQorCXsKKwkgICAgLyogd2UgaGF2ZSB0byBzcGxpdCB0aGUgVEFCICoobWlkcC0xKSAqLworCSAgICBpbnRlcm5hbCA9IHZjb2wgLSAob2FwLT5zdGFydF92Y29sICsgdG90YWwpOworCX0KKwkvKiBpZiAnZXhwYW5kdGFiJyBpcyBub3Qgc2V0LCB1c2UgVEFCcyAqLworCisJc3BsaXQgPSBiZC5zdGFydHNwYWNlcyArIGludGVybmFsOworCWlmIChzcGxpdCA+IDApCisJeworCSAgICBpZiAoIWN1cmJ1Zi0+Yl9wX2V0KQorCSAgICB7CisJCWZvciAocHRyID0gb2xkcCwgY29sID0gMDsgcHRyIDwgb2xkcCtiZC50ZXh0Y29sOyApCisJCSAgICBjb2wgKz0gbGJyX2NoYXJ0YWJzaXplX2FkdigmcHRyLCAoY29sbnJfVCljb2wpOworCisJCS8qIGNvbCsxIG5vdyBlcXVhbHMgdGhlIHN0YXJ0IGNvbCBvZiB0aGUgZmlyc3QgY2hhciBvZiB0aGUKKwkJICogYmxvY2sgKG1heSBiZSA8IG9hcC5zdGFydF92Y29sIGlmIHdlJ3JlIHNwbGl0dGluZyBhIFRBQikgKi8KKwkJaSA9ICgoY29sICUgcF90cykgKyBzcGxpdCkgLyBwX3RzOyAvKiBudW1iZXIgb2YgdGFicyAqLworCSAgICB9CisJICAgIGlmIChpKQorCQlqID0gKChjb2wgJSBwX3RzKSArIHNwbGl0KSAlIHBfdHM7IC8qIG51bWJlciBvZiBzcHAgKi8KKwkgICAgZWxzZQorCQlqID0gc3BsaXQ7CisJfQorCisJbmV3cCA9IGFsbG9jX2NoZWNrKGJkLnRleHRjb2wgKyBpICsgaiArICh1bnNpZ25lZClTVFJMRU4obWlkcCkgKyAxKTsKKwlpZiAobmV3cCA9PSBOVUxMKQorCSAgICByZXR1cm47CisJdmltX21lbXNldChuZXdwLCBOVUwsIChzaXplX3QpKGJkLnRleHRjb2wgKyBpICsgaiArIFNUUkxFTihtaWRwKSArIDEpKTsKKworCS8qIGNvcHkgZmlyc3QgcGFydCB3ZSB3YW50IHRvIGtlZXAgKi8KKwltY2hfbWVtbW92ZShuZXdwLCBvbGRwLCAoc2l6ZV90KWJkLnRleHRjb2wpOworCS8qIE5vdyBjb3B5IGFueSBUQUJTIGFuZCBzcHAgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50ISAqLworCXdoaWxlICh2aW1faXN3aGl0ZSgqbWlkcCkpCisJeworCSAgICBpZiAoKm1pZHAgPT0gVEFCKQorCQlpKys7CisJICAgIGVsc2UgLypzcGFjZSAqLworCQlqKys7CisJICAgIG1pZHArKzsKKwl9CisJLyogV2UgbWlnaHQgaGF2ZSBhbiBleHRyYSBUQUIgd29ydGggb2Ygc3BwIG5vdyEgKi8KKwlpZiAoaiAvIHBfdHMgJiYgIWN1cmJ1Zi0+Yl9wX2V0KQorCXsKKwkgICAgaSsrOworCSAgICBqIC09IHBfdHM7CisJfQorCWNvcHlfY2hhcnMobmV3cCArIGJkLnRleHRjb2wsIChzaXplX3QpaSwgVEFCKTsKKwljb3B5X3NwYWNlcyhuZXdwICsgYmQudGV4dGNvbCArIGksIChzaXplX3Qpaik7CisKKwkvKiB0aGUgZW5kICovCisJbWNoX21lbW1vdmUobmV3cCArIFNUUkxFTihuZXdwKSwgbWlkcCwgKHNpemVfdClTVFJMRU4obWlkcCkgKyAxKTsKKyAgICB9CisgICAgLyogcmVwbGFjZSB0aGUgbGluZSAqLworICAgIG1sX3JlcGxhY2UoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBuZXdwLCBGQUxTRSk7CisgICAgY2hhbmdlZF9ieXRlcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIChjb2xucl9UKWJkLnRleHRjb2wpOworICAgIFN0YXRlID0gb2xkc3RhdGU7CisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBvbGRjb2w7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBwX3JpID0gb2xkX3Bfcmk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorLyoKKyAqIEluc2VydCBzdHJpbmcgInMiIChiX2luc2VydCA/IGJlZm9yZSA6IGFmdGVyKSBibG9jayA6QUtlbGx5CisgKiBDYWxsZXIgbXVzdCBwcmVwYXJlIGZvciB1bmRvLgorICovCisgICAgc3RhdGljIHZvaWQKK2Jsb2NrX2luc2VydChvYXAsIHMsIGJfaW5zZXJ0LCBiZHApCisgICAgb3BhcmdfVAkJKm9hcDsKKyAgICBjaGFyX3UJCSpzOworICAgIGludAkJCWJfaW5zZXJ0OworICAgIHN0cnVjdCBibG9ja19kZWYJKmJkcDsKK3sKKyAgICBpbnQJCXBfdHM7CisgICAgaW50CQljb3VudCA9IDA7CS8qIGV4dHJhIHNwYWNlcyB0byByZXBsYWNlIGEgY3V0IFRBQiAqLworICAgIGludAkJc3BhY2VzID0gMDsJLyogbm9uLXplcm8gaWYgY3V0dGluZyBhIFRBQiAqLworICAgIGNvbG5yX1QJb2Zmc2V0OwkJLyogcG9pbnRlciBhbG9uZyBuZXcgbGluZSAqLworICAgIHVuc2lnbmVkCXNfbGVuOwkJLyogU1RSTEVOKHMpICovCisgICAgY2hhcl91CSpuZXdwLCAqb2xkcDsJLyogbmV3LCBvbGQgbGluZXMgKi8KKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogbG9vcCB2YXIgKi8KKyAgICBpbnQJCW9sZHN0YXRlID0gU3RhdGU7CisKKyAgICBTdGF0ZSA9IElOU0VSVDsJCS8qIGRvbid0IHdhbnQgUkVQTEFDRSBmb3IgU3RhdGUgKi8KKyAgICBzX2xlbiA9ICh1bnNpZ25lZClTVFJMRU4ocyk7CisKKyAgICBmb3IgKGxudW0gPSBvYXAtPnN0YXJ0LmxudW0gKyAxOyBsbnVtIDw9IG9hcC0+ZW5kLmxudW07IGxudW0rKykKKyAgICB7CisJYmxvY2tfcHJlcChvYXAsIGJkcCwgbG51bSwgVFJVRSk7CisJaWYgKGJkcC0+aXNfc2hvcnQgJiYgYl9pbnNlcnQpCisJICAgIGNvbnRpbnVlOwkvKiBPUF9JTlNFUlQsIGxpbmUgZW5kcyBiZWZvcmUgYmxvY2sgc3RhcnQgKi8KKworCW9sZHAgPSBtbF9nZXQobG51bSk7CisKKwlpZiAoYl9pbnNlcnQpCisJeworCSAgICBwX3RzID0gYmRwLT5zdGFydF9jaGFyX3Zjb2xzOworCSAgICBzcGFjZXMgPSBiZHAtPnN0YXJ0c3BhY2VzOworCSAgICBpZiAoc3BhY2VzICE9IDApCisJCWNvdW50ID0gcF90cyAtIDE7IC8qIHdlJ3JlIGN1dHRpbmcgYSBUQUIgKi8KKwkgICAgb2Zmc2V0ID0gYmRwLT50ZXh0Y29sOworCX0KKwllbHNlIC8qIGFwcGVuZCAqLworCXsKKwkgICAgcF90cyA9IGJkcC0+ZW5kX2NoYXJfdmNvbHM7CisJICAgIGlmICghYmRwLT5pc19zaG9ydCkgLyogc3BhY2VzID0gcGFkZGluZyBhZnRlciBibG9jayAqLworCSAgICB7CisJCXNwYWNlcyA9IChiZHAtPmVuZHNwYWNlcyA/IHBfdHMgLSBiZHAtPmVuZHNwYWNlcyA6IDApOworCQlpZiAoc3BhY2VzICE9IDApCisJCSAgICBjb3VudCA9IHBfdHMgLSAxOyAvKiB3ZSdyZSBjdXR0aW5nIGEgVEFCICovCisJCW9mZnNldCA9IGJkcC0+dGV4dGNvbCArIGJkcC0+dGV4dGxlbiAtIChzcGFjZXMgIT0gMCk7CisJICAgIH0KKwkgICAgZWxzZSAvKiBzcGFjZXMgPSBwYWRkaW5nIHRvIGJsb2NrIGVkZ2UgKi8KKwkgICAgeworCQkvKiBpZiAkIHVzZWQsIGp1c3QgYXBwZW5kIHRvIEVPTCAoaWUgc3BhY2VzPT0wKSAqLworCQlpZiAoIWJkcC0+aXNfTUFYKQorCQkgICAgc3BhY2VzID0gKG9hcC0+ZW5kX3Zjb2wgLSBiZHAtPmVuZF92Y29sKSArIDE7CisJCWNvdW50ID0gc3BhY2VzOworCQlvZmZzZXQgPSBiZHAtPnRleHRjb2wgKyBiZHAtPnRleHRsZW47CisJICAgIH0KKwl9CisKKwluZXdwID0gYWxsb2NfY2hlY2soKHVuc2lnbmVkKShTVFJMRU4ob2xkcCkpICsgc19sZW4gKyBjb3VudCArIDEpOworCWlmIChuZXdwID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJLyogY29weSB1cCB0byBzaGlmdGVkIHBhcnQgKi8KKwltY2hfbWVtbW92ZShuZXdwLCBvbGRwLCAoc2l6ZV90KShvZmZzZXQpKTsKKwlvbGRwICs9IG9mZnNldDsKKworCS8qIGluc2VydCBwcmUtcGFkZGluZyAqLworCWNvcHlfc3BhY2VzKG5ld3AgKyBvZmZzZXQsIChzaXplX3Qpc3BhY2VzKTsKKworCS8qIGNvcHkgdGhlIG5ldyB0ZXh0ICovCisJbWNoX21lbW1vdmUobmV3cCArIG9mZnNldCArIHNwYWNlcywgcywgKHNpemVfdClzX2xlbik7CisJb2Zmc2V0ICs9IHNfbGVuOworCisJaWYgKHNwYWNlcyAmJiAhYmRwLT5pc19zaG9ydCkKKwl7CisJICAgIC8qIGluc2VydCBwb3N0LXBhZGRpbmcgKi8KKwkgICAgY29weV9zcGFjZXMobmV3cCArIG9mZnNldCArIHNwYWNlcywgKHNpemVfdCkocF90cyAtIHNwYWNlcykpOworCSAgICAvKiBXZSdyZSBzcGxpdHRpbmcgYSBUQUIsIGRvbid0IGNvcHkgaXQuICovCisJICAgIG9sZHArKzsKKwkgICAgLyogV2UgYWxsb3dlZCBmb3IgdGhhdCBUQUIsIHJlbWVtYmVyIHRoaXMgbm93ICovCisJICAgIGNvdW50Kys7CisJfQorCisJaWYgKHNwYWNlcyA+IDApCisJICAgIG9mZnNldCArPSBjb3VudDsKKwltY2hfbWVtbW92ZShuZXdwICsgb2Zmc2V0LCBvbGRwLCAoc2l6ZV90KShTVFJMRU4ob2xkcCkgKyAxKSk7CisKKwltbF9yZXBsYWNlKGxudW0sIG5ld3AsIEZBTFNFKTsKKworCWlmIChsbnVtID09IG9hcC0+ZW5kLmxudW0pCisJeworCSAgICAvKiBTZXQgIiddIiBtYXJrIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGluc3RlYWQgb2YgdGhlIGVuZCBvZgorCSAgICAgKiB0aGUgaW5zZXJ0IGluIHRoZSBmaXJzdCBsaW5lLiAgKi8KKwkgICAgY3VyYnVmLT5iX29wX2VuZC5sbnVtID0gb2FwLT5lbmQubG51bTsKKwkgICAgY3VyYnVmLT5iX29wX2VuZC5jb2wgPSBvZmZzZXQ7CisJfQorICAgIH0gLyogZm9yIGFsbCBsbnVtICovCisKKyAgICBjaGFuZ2VkX2xpbmVzKG9hcC0+c3RhcnQubG51bSArIDEsIDAsIG9hcC0+ZW5kLmxudW0gKyAxLCAwTCk7CisKKyAgICBTdGF0ZSA9IG9sZHN0YXRlOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTElTUCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogb3BfcmVpbmRlbnQgLSBoYW5kbGUgcmVpbmRlbnRpbmcgYSBibG9jayBvZiBsaW5lcy4KKyAqLworICAgIHZvaWQKK29wX3JlaW5kZW50KG9hcCwgaG93KQorICAgIG9wYXJnX1QJKm9hcDsKKyAgICBpbnQJCSgqaG93KSBfX0FSR1MoKHZvaWQpKTsKK3sKKyAgICBsb25nCWk7CisgICAgY2hhcl91CSpsOworICAgIGludAkJY291bnQ7CisgICAgbGluZW5yX1QJZmlyc3RfY2hhbmdlZCA9IDA7CisgICAgbGluZW5yX1QJbGFzdF9jaGFuZ2VkID0gMDsKKyAgICBsaW5lbnJfVAlzdGFydF9sbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCisgICAgZm9yIChpID0gb2FwLT5saW5lX2NvdW50OyAtLWkgPj0gMCAmJiAhZ290X2ludDsgKQorICAgIHsKKwkvKiBpdCdzIGEgc2xvdyB0aGluZyB0byBkbywgc28gZ2l2ZSBmZWVkYmFjayBzbyB0aGVyZSdzIG5vIHdvcnJ5IHRoYXQKKwkgKiB0aGUgY29tcHV0ZXIncyBqdXN0IGh1bmcuICovCisKKwlpZiAoaSA+IDEKKwkJJiYgKGkgJSA1MCA9PSAwIHx8IGkgPT0gb2FwLT5saW5lX2NvdW50IC0gMSkKKwkJJiYgb2FwLT5saW5lX2NvdW50ID4gcF9yZXBvcnQpCisJICAgIHNtc2coKGNoYXJfdSAqKV8oIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIiksIGkpOworCisJLyoKKwkgKiBCZSB2aS1jb21wYXRpYmxlOiBGb3IgbGlzcCBpbmRlbnRpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90CisJICogaW5kZW50ZWQsIHVubGVzcyB0aGVyZSBpcyBvbmx5IG9uZSBsaW5lLgorCSAqLworI2lmZGVmIEZFQVRfTElTUAorCWlmIChpICE9IG9hcC0+bGluZV9jb3VudCAtIDEgfHwgb2FwLT5saW5lX2NvdW50ID09IDEKKwkJCQkJCSAgICB8fCBob3cgIT0gZ2V0X2xpc3BfaW5kZW50KQorI2VuZGlmCisJeworCSAgICBsID0gc2tpcHdoaXRlKG1sX2dldF9jdXJsaW5lKCkpOworCSAgICBpZiAoKmwgPT0gTlVMKQkJICAgIC8qIGVtcHR5IG9yIGJsYW5rIGxpbmUgKi8KKwkJY291bnQgPSAwOworCSAgICBlbHNlCisJCWNvdW50ID0gaG93KCk7CQkgICAgLyogZ2V0IHRoZSBpbmRlbnQgZm9yIHRoaXMgbGluZSAqLworCisJICAgIGlmIChzZXRfaW5kZW50KGNvdW50LCBTSU5fVU5ETykpCisJICAgIHsKKwkJLyogZGlkIGNoYW5nZSB0aGUgaW5kZW50LCBjYWxsIGNoYW5nZWRfbGluZXMoKSBsYXRlciAqLworCQlpZiAoZmlyc3RfY2hhbmdlZCA9PSAwKQorCQkgICAgZmlyc3RfY2hhbmdlZCA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJbGFzdF9jaGFuZ2VkID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCSAgICB9CisJfQorCSsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIH0KKworICAgIC8qIHB1dCBjdXJzb3Igb24gZmlyc3Qgbm9uLWJsYW5rIG9mIGluZGVudGVkIGxpbmUgKi8KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBzdGFydF9sbnVtOworICAgIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworCisgICAgLyogTWFyayBjaGFuZ2VkIGxpbmVzIHNvIHRoYXQgdGhleSB3aWxsIGJlIHJlZHJhd24uICBXaGVuIFZpc3VhbAorICAgICAqIGhpZ2hsaWdodGluZyB3YXMgcHJlc2VudCwgbmVlZCB0byBjb250aW51ZSB1bnRpbCB0aGUgbGFzdCBsaW5lLiAgV2hlbgorICAgICAqIHRoZXJlIGlzIG5vIGNoYW5nZSBzdGlsbCBuZWVkIHRvIHJlbW92ZSB0aGUgVmlzdWFsIGhpZ2hsaWdodGluZy4gKi8KKyAgICBpZiAobGFzdF9jaGFuZ2VkICE9IDApCisJY2hhbmdlZF9saW5lcyhmaXJzdF9jaGFuZ2VkLCAwLAorI2lmZGVmIEZFQVRfVklTVUFMCisJCW9hcC0+aXNfVklzdWFsID8gc3RhcnRfbG51bSArIG9hcC0+bGluZV9jb3VudCA6CisjZW5kaWYKKwkJbGFzdF9jaGFuZ2VkICsgMSwgMEwpOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgZWxzZSBpZiAob2FwLT5pc19WSXN1YWwpCisJcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CisjZW5kaWYKKworICAgIGlmIChvYXAtPmxpbmVfY291bnQgPiBwX3JlcG9ydCkKKyAgICB7CisJaSA9IG9hcC0+bGluZV9jb3VudCAtIChpICsgMSk7CisJaWYgKGkgPT0gMSkKKwkgICAgTVNHKF8oIjEgbGluZSBpbmRlbnRlZCAiKSk7CisJZWxzZQorCSAgICBzbXNnKChjaGFyX3UgKilfKCIlbGQgbGluZXMgaW5kZW50ZWQgIiksIGkpOworICAgIH0KKyAgICAvKiBzZXQgJ1sgYW5kICddIG1hcmtzICovCisgICAgY3VyYnVmLT5iX29wX3N0YXJ0ID0gb2FwLT5zdGFydDsKKyAgICBjdXJidWYtPmJfb3BfZW5kID0gb2FwLT5lbmQ7Cit9CisjZW5kaWYgLyogZGVmaW5lZChGRUFUX0xJU1ApIHx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKSAqLworCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogS2VlcCB0aGUgbGFzdCBleHByZXNzaW9uIGxpbmUgaGVyZSwgZm9yIHJlcGVhdGluZy4KKyAqLworc3RhdGljIGNoYXJfdQkqZXhwcl9saW5lID0gTlVMTDsKKworLyoKKyAqIEdldCBhbiBleHByZXNzaW9uIGZvciB0aGUgIlwiPWV4cHIxIiBvciAiQ1RSTC1SID1leHByMSIKKyAqIFJldHVybnMgJz0nIHdoZW4gT0ssIE5VTCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2dldF9leHByX3JlZ2lzdGVyKCkKK3sKKyAgICBjaGFyX3UJKm5ld19saW5lOworCisgICAgbmV3X2xpbmUgPSBnZXRjbWRsaW5lKCc9JywgMEwsIDApOworICAgIGlmIChuZXdfbGluZSA9PSBOVUxMKQorCXJldHVybiBOVUw7CisgICAgaWYgKCpuZXdfbGluZSA9PSBOVUwpCS8qIHVzZSBwcmV2aW91cyBsaW5lICovCisJdmltX2ZyZWUobmV3X2xpbmUpOworICAgIGVsc2UKKwlzZXRfZXhwcl9saW5lKG5ld19saW5lKTsKKyAgICByZXR1cm4gJz0nOworfQorCisvKgorICogU2V0IHRoZSBleHByZXNzaW9uIGZvciB0aGUgJz0nIHJlZ2lzdGVyLgorICogQXJndW1lbnQgbXVzdCBiZSBhbiBhbGxvY2F0ZWQgc3RyaW5nLgorICovCisgICAgdm9pZAorc2V0X2V4cHJfbGluZShuZXdfbGluZSkKKyAgICBjaGFyX3UJKm5ld19saW5lOworeworICAgIHZpbV9mcmVlKGV4cHJfbGluZSk7CisgICAgZXhwcl9saW5lID0gbmV3X2xpbmU7Cit9CisKKy8qCisgKiBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgJz0nIHJlZ2lzdGVyIGV4cHJlc3Npb24uCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LCBvciBOVUxMIGZvciBmYWlsdXJlLgorICovCisgICAgY2hhcl91ICoKK2dldF9leHByX2xpbmUoKQoreworICAgIGNoYXJfdQkqZXhwcl9jb3B5OworICAgIGNoYXJfdQkqcnY7CisKKyAgICBpZiAoZXhwcl9saW5lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgZXhwcmVzc2lvbiwgYmVjYXVzZSBldmFsdWF0aW5nIGl0IG1heSBjYXVzZSBpdCB0byBiZQorICAgICAqIGNoYW5nZWQuICovCisgICAgZXhwcl9jb3B5ID0gdmltX3N0cnNhdmUoZXhwcl9saW5lKTsKKyAgICBpZiAoZXhwcl9jb3B5ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBydiA9IGV2YWxfdG9fc3RyaW5nKGV4cHJfY29weSwgTlVMTCk7CisgICAgdmltX2ZyZWUoZXhwcl9jb3B5KTsKKyAgICByZXR1cm4gcnY7Cit9CisjZW5kaWYgLyogRkVBVF9FVkFMICovCisKKy8qCisgKiBDaGVjayBpZiAncmVnbmFtZScgaXMgYSB2YWxpZCBuYW1lIG9mIGEgeWFuayByZWdpc3Rlci4KKyAqIE5vdGU6IFRoZXJlIGlzIG5vIGNoZWNrIGZvciAwIChkZWZhdWx0IHJlZ2lzdGVyKSwgY2FsbGVyIHNob3VsZCBkbyB0aGlzCisgKi8KKyAgICBpbnQKK3ZhbGlkX3lhbmtfcmVnKHJlZ25hbWUsIHdyaXRpbmcpCisgICAgaW50CSAgICByZWduYW1lOworICAgIGludAkgICAgd3JpdGluZzsJICAgIC8qIGlmIFRSVUUgY2hlY2sgZm9yIHdyaXRhYmxlIHJlZ2lzdGVycyAqLworeworICAgIGlmICggICAgICAgKHJlZ25hbWUgPiAwICYmIEFTQ0lJX0lTQUxOVU0ocmVnbmFtZSkpCisJICAgIHx8ICghd3JpdGluZyAmJiB2aW1fc3RyY2hyKChjaGFyX3UgKikKKyNpZmRlZiBGRUFUX0VWQUwKKwkJCQkgICAgIi8uJSM6PSIKKyNlbHNlCisJCQkJICAgICIvLiUjOiIKKyNlbmRpZgorCQkJCQksIHJlZ25hbWUpICE9IE5VTEwpCisJICAgIHx8IHJlZ25hbWUgPT0gJyInCisJICAgIHx8IHJlZ25hbWUgPT0gJy0nCisJICAgIHx8IHJlZ25hbWUgPT0gJ18nCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkgICAgfHwgcmVnbmFtZSA9PSAnKicKKwkgICAgfHwgcmVnbmFtZSA9PSAnKycKKyNlbmRpZgorI2lmZGVmIEZFQVRfRE5ECisJICAgIHx8ICghd3JpdGluZyAmJiByZWduYW1lID09ICd+JykKKyNlbmRpZgorCQkJCQkJCSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBTZXQgeV9jdXJyZW50IGFuZCB5X2FwcGVuZCwgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiAicmVnbmFtZSIuCisgKiBDYW5ub3QgaGFuZGxlIHRoZSAnXycgcmVnaXN0ZXIuCisgKgorICogSWYgcmVnbmFtZSBpcyAwIGFuZCB3cml0aW5nLCB1c2UgcmVnaXN0ZXIgMAorICogSWYgcmVnbmFtZSBpcyAwIGFuZCByZWFkaW5nLCB1c2UgcHJldmlvdXMgcmVnaXN0ZXIKKyAqLworICAgIHN0YXRpYyB2b2lkCitnZXRfeWFua19yZWdpc3RlcihyZWduYW1lLCB3cml0aW5nKQorICAgIGludAkgICAgcmVnbmFtZTsKKyAgICBpbnQJICAgIHdyaXRpbmc7Cit7CisgICAgaW50CSAgICBpOworCisgICAgeV9hcHBlbmQgPSBGQUxTRTsKKyAgICBpZiAoKHJlZ25hbWUgPT0gMCB8fCByZWduYW1lID09ICciJykgJiYgIXdyaXRpbmcgJiYgeV9wcmV2aW91cyAhPSBOVUxMKQorICAgIHsKKwl5X2N1cnJlbnQgPSB5X3ByZXZpb3VzOworCXJldHVybjsKKyAgICB9CisgICAgaSA9IHJlZ25hbWU7CisgICAgaWYgKFZJTV9JU0RJR0lUKGkpKQorCWkgLT0gJzAnOworICAgIGVsc2UgaWYgKEFTQ0lJX0lTTE9XRVIoaSkpCisJaSA9IENoYXJPcmRMb3coaSkgKyAxMDsKKyAgICBlbHNlIGlmIChBU0NJSV9JU1VQUEVSKGkpKQorICAgIHsKKwlpID0gQ2hhck9yZFVwKGkpICsgMTA7CisJeV9hcHBlbmQgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChyZWduYW1lID09ICctJykKKwlpID0gREVMRVRJT05fUkVHSVNURVI7CisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBXaGVuIHNlbGVjdGlvbiBpcyBub3QgYXZhaWxhYmxlLCB1c2UgcmVnaXN0ZXIgMCBpbnN0ZWFkIG9mICcqJyAqLworICAgIGVsc2UgaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUgJiYgcmVnbmFtZSA9PSAnKicpCisJaSA9IFNUQVJfUkVHSVNURVI7CisgICAgLyogV2hlbiBjbGlwYm9hcmQgaXMgbm90IGF2YWlsYWJsZSwgdXNlIHJlZ2lzdGVyIDAgaW5zdGVhZCBvZiAnKycgKi8KKyAgICBlbHNlIGlmIChjbGlwX3BsdXMuYXZhaWxhYmxlICYmIHJlZ25hbWUgPT0gJysnKQorCWkgPSBQTFVTX1JFR0lTVEVSOworI2VuZGlmCisjaWZkZWYgRkVBVF9ETkQKKyAgICBlbHNlIGlmICghd3JpdGluZyAmJiByZWduYW1lID09ICd+JykKKwlpID0gVElMREVfUkVHSVNURVI7CisjZW5kaWYKKyAgICBlbHNlCQkvKiBub3QgMC05LCBhLXosIEEtWiBvciAnLSc6IHVzZSByZWdpc3RlciAwICovCisJaSA9IDA7CisgICAgeV9jdXJyZW50ID0gJih5X3JlZ3NbaV0pOworICAgIGlmICh3cml0aW5nKQkvKiByZW1lbWJlciB0aGUgcmVnaXN0ZXIgd2Ugd3JpdGUgaW50byBmb3IgZG9fcHV0KCkgKi8KKwl5X3ByZXZpb3VzID0geV9jdXJyZW50OworfQorCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKy8qCisgKiBXaGVuICJyZWduYW1lIiBpcyBhIGNsaXBib2FyZCByZWdpc3Rlciwgb2J0YWluIHRoZSBzZWxlY3Rpb24uICBJZiBpdCdzIG5vdAorICogYXZhaWxhYmxlIHJldHVybiB6ZXJvLCBvdGhlcndpc2UgcmV0dXJuICJyZWduYW1lIi4KKyAqLworc3RhdGljIGludCBtYXlfZ2V0X3NlbGVjdGlvbiBfX0FSR1MoKGludCByZWduYW1lKSk7CisKKyAgICBzdGF0aWMgaW50CittYXlfZ2V0X3NlbGVjdGlvbihyZWduYW1lKQorICAgIGludCByZWduYW1lOworeworICAgIGlmIChyZWduYW1lID09ICcqJykKKyAgICB7CisJaWYgKCFjbGlwX3N0YXIuYXZhaWxhYmxlKQorCSAgICByZWduYW1lID0gMDsKKwllbHNlCisJICAgIGNsaXBfZ2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKyAgICB9CisgICAgZWxzZSBpZiAocmVnbmFtZSA9PSAnKycpCisgICAgeworCWlmICghY2xpcF9wbHVzLmF2YWlsYWJsZSkKKwkgICAgcmVnbmFtZSA9IDA7CisJZWxzZQorCSAgICBjbGlwX2dldF9zZWxlY3Rpb24oJmNsaXBfcGx1cyk7CisgICAgfQorICAgIHJldHVybiByZWduYW1lOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVklTVUFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIE9idGFpbiB0aGUgY29udGVudHMgb2YgYSAibm9ybWFsIiByZWdpc3Rlci4gVGhlIHJlZ2lzdGVyIGlzIG1hZGUgZW1wdHkuCisgKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBoYXMgYWxsb2NhdGVkIG1lbW9yeSwgdXNlIHB1dF9yZWdpc3RlcigpIGxhdGVyLgorICovCisgICAgdm9pZCAqCitnZXRfcmVnaXN0ZXIobmFtZSwgY29weSkKKyAgICBpbnQJCW5hbWU7CisgICAgaW50CQljb3B5OwkvKiBtYWtlIGEgY29weSwgaWYgRkFMU0UgbWFrZSByZWdpc3RlciBlbXB0eS4gKi8KK3sKKyAgICBzdGF0aWMgc3RydWN0IHlhbmtyZWcJKnJlZzsKKyAgICBpbnQJCQkJaTsKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyogV2hlbiBWaXN1YWwgYXJlYSBjaGFuZ2VkLCBtYXkgaGF2ZSB0byB1cGRhdGUgc2VsZWN0aW9uLiAgT2J0YWluIHRoZQorICAgICAqIHNlbGVjdGlvbiB0b28uICovCisgICAgaWYgKG5hbWUgPT0gJyonICYmIGNsaXBfc3Rhci5hdmFpbGFibGUgJiYgY2xpcF9pc2F1dG9zZWwoKSkKKyAgICB7CisJY2xpcF91cGRhdGVfc2VsZWN0aW9uKCk7CisJbWF5X2dldF9zZWxlY3Rpb24obmFtZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBnZXRfeWFua19yZWdpc3RlcihuYW1lLCAwKTsKKyAgICByZWcgPSAoc3RydWN0IHlhbmtyZWcgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKHN0cnVjdCB5YW5rcmVnKSk7CisgICAgaWYgKHJlZyAhPSBOVUxMKQorICAgIHsKKwkqcmVnID0gKnlfY3VycmVudDsKKwlpZiAoY29weSkKKwl7CisJICAgIC8qIElmIHdlIHJ1biBvdXQgb2YgbWVtb3J5IHNvbWUgb3IgYWxsIG9mIHRoZSBsaW5lcyBhcmUgZW1wdHkuICovCisJICAgIGlmIChyZWctPnlfc2l6ZSA9PSAwKQorCQlyZWctPnlfYXJyYXkgPSBOVUxMOworCSAgICBlbHNlCisJCXJlZy0+eV9hcnJheSA9IChjaGFyX3UgKiopYWxsb2MoKHVuc2lnbmVkKShzaXplb2YoY2hhcl91ICopCisJCQkJCQkJICAgICAgKiByZWctPnlfc2l6ZSkpOworCSAgICBpZiAocmVnLT55X2FycmF5ICE9IE5VTEwpCisJICAgIHsKKwkJZm9yIChpID0gMDsgaSA8IHJlZy0+eV9zaXplOyArK2kpCisJCSAgICByZWctPnlfYXJyYXlbaV0gPSB2aW1fc3Ryc2F2ZSh5X2N1cnJlbnQtPnlfYXJyYXlbaV0pOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgeV9jdXJyZW50LT55X2FycmF5ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICh2b2lkICopcmVnOworfQorCisvKgorICogUHV0ICJyZWciIGludG8gcmVnaXN0ZXIgIm5hbWUiLiAgRnJlZSBhbnkgcHJldmlvdXMgY29udGVudHMuCisgKi8KKyAgICB2b2lkCitwdXRfcmVnaXN0ZXIobmFtZSwgcmVnKQorICAgIGludAkJbmFtZTsKKyAgICB2b2lkCSpyZWc7Cit7CisgICAgZ2V0X3lhbmtfcmVnaXN0ZXIobmFtZSwgMCk7CisgICAgZnJlZV95YW5rX2FsbCgpOworICAgICp5X2N1cnJlbnQgPSAqKHN0cnVjdCB5YW5rcmVnICopcmVnOworCisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyogU2VuZCB0ZXh0IHdyaXR0ZW4gdG8gY2xpcGJvYXJkIHJlZ2lzdGVyIHRvIHRoZSBjbGlwYm9hcmQuICovCisgICAgbWF5X3NldF9zZWxlY3Rpb24oKTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHJldHVybiBUUlVFIGlmIHRoZSBjdXJyZW50IHlhbmsgcmVnaXN0ZXIgaGFzIHR5cGUgTUxJTkUKKyAqLworICAgIGludAoreWFua19yZWdpc3Rlcl9tbGluZShyZWduYW1lKQorICAgIGludAkgICAgcmVnbmFtZTsKK3sKKyAgICBpZiAocmVnbmFtZSAhPSAwICYmICF2YWxpZF95YW5rX3JlZyhyZWduYW1lLCBGQUxTRSkpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChyZWduYW1lID09ICdfJykJCS8qIGJsYWNrIGhvbGUgaXMgYWx3YXlzIGVtcHR5ICovCisJcmV0dXJuIEZBTFNFOworICAgIGdldF95YW5rX3JlZ2lzdGVyKHJlZ25hbWUsIEZBTFNFKTsKKyAgICByZXR1cm4gKHlfY3VycmVudC0+eV90eXBlID09IE1MSU5FKTsKK30KKyNlbmRpZgorCisvKgorICogc3RhcnQgb3Igc3RvcCByZWNvcmRpbmcgaW50byBhIHlhbmsgcmVnaXN0ZXIKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2RvX3JlY29yZChjKQorICAgIGludCBjOworeworICAgIGNoYXJfdQkqcDsKKyAgICBzdGF0aWMgaW50CXJlZ25hbWU7CisgICAgc3RydWN0IHlhbmtyZWcgKm9sZF95X3ByZXZpb3VzLCAqb2xkX3lfY3VycmVudDsKKyAgICBpbnQJCXJldHZhbDsKKworICAgIGlmIChSZWNvcmRpbmcgPT0gRkFMU0UpCSAgICAvKiBzdGFydCByZWNvcmRpbmcgKi8KKyAgICB7CisJCQkvKiByZWdpc3RlcnMgMC05LCBhLXogYW5kICIgYXJlIGFsbG93ZWQgKi8KKwlpZiAoYyA8IDAgfHwgKCFBU0NJSV9JU0FMTlVNKGMpICYmIGMgIT0gJyInKSkKKwkgICAgcmV0dmFsID0gRkFJTDsKKwllbHNlCisJeworCSAgICBSZWNvcmRpbmcgPSBUUlVFOworCSAgICBzaG93bW9kZSgpOworCSAgICByZWduYW1lID0gYzsKKwkgICAgcmV0dmFsID0gT0s7CisJfQorICAgIH0KKyAgICBlbHNlCQkJICAgIC8qIHN0b3AgcmVjb3JkaW5nICovCisgICAgeworCS8qCisJICogR2V0IHRoZSByZWNvcmRlZCBrZXkgaGl0cy4gIEtfU1BFQ0lBTCBhbmQgQ1NJIHdpbGwgYmUgZXNjYXBlZCwgc28KKwkgKiB0aGF0IHRoZSByZWdpc3RlciBjYW4gYmUgcHV0IGludG8gdGhlIHR5cGVhaGVhZCBidWZmZXIgd2l0aG91dAorCSAqIHRyYW5zbGF0aW9uLgorCSAqLworCVJlY29yZGluZyA9IEZBTFNFOworCU1TRygiIik7CisJcCA9IGdldF9yZWNvcmRlZCgpOworCWlmIChwID09IE5VTEwpCisJICAgIHJldHZhbCA9IEZBSUw7CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogV2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcmVnaXN0ZXIgaGVyZSwgc28gc2F2ZSBhbmQKKwkgICAgICogcmVzdG9yZSB0aGUgY3VycmVudCByZWdpc3RlciBuYW1lLgorCSAgICAgKi8KKwkgICAgb2xkX3lfcHJldmlvdXMgPSB5X3ByZXZpb3VzOworCSAgICBvbGRfeV9jdXJyZW50ID0geV9jdXJyZW50OworCisJICAgIHJldHZhbCA9IHN0dWZmX3lhbmsocmVnbmFtZSwgcCk7CisKKwkgICAgeV9wcmV2aW91cyA9IG9sZF95X3ByZXZpb3VzOworCSAgICB5X2N1cnJlbnQgPSBvbGRfeV9jdXJyZW50OworCX0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFN0dWZmIHN0cmluZyAicCIgaW50byB5YW5rIHJlZ2lzdGVyICJyZWduYW1lIiBhcyBhIHNpbmdsZSBsaW5lIChhcHBlbmQgaWYKKyAqIHVwcGVyY2FzZSkuCSJwIiBtdXN0IGhhdmUgYmVlbiBhbGxvY2VkLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIHN0YXRpYyBpbnQKK3N0dWZmX3lhbmsocmVnbmFtZSwgcCkKKyAgICBpbnQJCXJlZ25hbWU7CisgICAgY2hhcl91CSpwOworeworICAgIGNoYXJfdQkqbHA7CisgICAgY2hhcl91CSoqcHA7CisKKyAgICAvKiBjaGVjayBmb3IgcmVhZC1vbmx5IHJlZ2lzdGVyICovCisgICAgaWYgKHJlZ25hbWUgIT0gMCAmJiAhdmFsaWRfeWFua19yZWcocmVnbmFtZSwgVFJVRSkpCisgICAgeworCXZpbV9mcmVlKHApOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICBpZiAocmVnbmFtZSA9PSAnXycpCQkgICAgLyogYmxhY2sgaG9sZTogZG9uJ3QgZG8gYW55dGhpbmcgKi8KKyAgICB7CisJdmltX2ZyZWUocCk7CisJcmV0dXJuIE9LOworICAgIH0KKyAgICBnZXRfeWFua19yZWdpc3RlcihyZWduYW1lLCBUUlVFKTsKKyAgICBpZiAoeV9hcHBlbmQgJiYgeV9jdXJyZW50LT55X2FycmF5ICE9IE5VTEwpCisgICAgeworCXBwID0gJih5X2N1cnJlbnQtPnlfYXJyYXlbeV9jdXJyZW50LT55X3NpemUgLSAxXSk7CisJbHAgPSBsYWxsb2MoKGxvbmdfdSkoU1RSTEVOKCpwcCkgKyBTVFJMRU4ocCkgKyAxKSwgVFJVRSk7CisJaWYgKGxwID09IE5VTEwpCisJeworCSAgICB2aW1fZnJlZShwKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCVNUUkNQWShscCwgKnBwKTsKKwlTVFJDQVQobHAsIHApOworCXZpbV9mcmVlKHApOworCXZpbV9mcmVlKCpwcCk7CisJKnBwID0gbHA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZnJlZV95YW5rX2FsbCgpOworCWlmICgoeV9jdXJyZW50LT55X2FycmF5ID0KKwkJCShjaGFyX3UgKiopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihjaGFyX3UgKikpKSA9PSBOVUxMKQorCXsKKwkgICAgdmltX2ZyZWUocCk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwl5X2N1cnJlbnQtPnlfYXJyYXlbMF0gPSBwOworCXlfY3VycmVudC0+eV9zaXplID0gMTsKKwl5X2N1cnJlbnQtPnlfdHlwZSA9IE1DSEFSOyAgLyogdXNlZCB0byBiZSBNTElORSwgd2h5PyAqLworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBleGVjdXRlIGEgeWFuayByZWdpc3RlcjogY29weSBpdCBpbnRvIHRoZSBzdHVmZiBidWZmZXIKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2RvX2V4ZWNyZWcocmVnbmFtZSwgY29sb24sIGFkZGNyKQorICAgIGludAkgICAgcmVnbmFtZTsKKyAgICBpbnQJICAgIGNvbG9uOwkJLyogaW5zZXJ0ICc6JyBiZWZvcmUgZWFjaCBsaW5lICovCisgICAgaW50CSAgICBhZGRjcjsJCS8qIGFsd2F5cyBhZGQgJ1xuJyB0byBlbmQgb2YgbGluZSAqLworeworICAgIHN0YXRpYyBpbnQJbGFzdGMgPSBOVUw7CisgICAgbG9uZwlpOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXJldHZhbCA9IE9LOworICAgIGludAkJcmVtYXA7CisKKyAgICBpZiAocmVnbmFtZSA9PSAnQCcpCQkJLyogcmVwZWF0IHByZXZpb3VzIG9uZSAqLworCXJlZ25hbWUgPSBsYXN0YzsKKwkJCQkJLyogY2hlY2sgZm9yIHZhbGlkIHJlZ25hbWUgKi8KKyAgICBpZiAocmVnbmFtZSA9PSAnJScgfHwgcmVnbmFtZSA9PSAnIycgfHwgIXZhbGlkX3lhbmtfcmVnKHJlZ25hbWUsIEZBTFNFKSkKKwlyZXR1cm4gRkFJTDsKKyAgICBsYXN0YyA9IHJlZ25hbWU7CisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIHJlZ25hbWUgPSBtYXlfZ2V0X3NlbGVjdGlvbihyZWduYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKHJlZ25hbWUgPT0gJ18nKQkJCS8qIGJsYWNrIGhvbGU6IGRvbid0IHN0dWZmIGFueXRoaW5nICovCisJcmV0dXJuIE9LOworCisjaWZkZWYgRkVBVF9DTURISVNUCisgICAgaWYgKHJlZ25hbWUgPT0gJzonKQkJCS8qIHVzZSBsYXN0IGNvbW1hbmQgbGluZSAqLworICAgIHsKKwlpZiAobGFzdF9jbWRsaW5lID09IE5VTEwpCisJeworCSAgICBFTVNHKF8oZV9ub2xhc3RjbWQpKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCXZpbV9mcmVlKG5ld19sYXN0X2NtZGxpbmUpOyAvKiBkb24ndCBrZWVwIHRoZSBjbWRsaW5lIGNvbnRhaW5pbmcgQDogKi8KKwluZXdfbGFzdF9jbWRsaW5lID0gTlVMTDsKKwlyZXR2YWwgPSBwdXRfaW5fdHlwZWJ1ZihsYXN0X2NtZGxpbmUsIFRSVUUpOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfRVZBTAorICAgIGVsc2UgaWYgKHJlZ25hbWUgPT0gJz0nKQorICAgIHsKKwlwID0gZ2V0X2V4cHJfbGluZSgpOworCWlmIChwID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCXJldHZhbCA9IHB1dF9pbl90eXBlYnVmKHAsIGNvbG9uKTsKKwl2aW1fZnJlZShwKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIGlmIChyZWduYW1lID09ICcuJykJCS8qIHVzZSBsYXN0IGluc2VydGVkIHRleHQgKi8KKyAgICB7CisJcCA9IGdldF9sYXN0X2luc2VydF9zYXZlKCk7CisJaWYgKHAgPT0gTlVMTCkKKwl7CisJICAgIEVNU0coXyhlX25vaW5zdGV4dCkpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisJcmV0dmFsID0gcHV0X2luX3R5cGVidWYocCwgY29sb24pOworCXZpbV9mcmVlKHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWdldF95YW5rX3JlZ2lzdGVyKHJlZ25hbWUsIEZBTFNFKTsKKwlpZiAoeV9jdXJyZW50LT55X2FycmF5ID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCisJLyogRGlzYWxsb3cgcmVtYXBpbmcgZm9yICI6QHIiLiAqLworCXJlbWFwID0gY29sb24gPyBSRU1BUF9OT05FIDogUkVNQVBfWUVTOworCisJLyoKKwkgKiBJbnNlcnQgbGluZXMgaW50byB0eXBlYWhlYWQgYnVmZmVyLCBmcm9tIGxhc3Qgb25lIHRvIGZpcnN0IG9uZS4KKwkgKi8KKwlwdXRfcmVlZGl0X2luX3R5cGVidWYoKTsKKwlmb3IgKGkgPSB5X2N1cnJlbnQtPnlfc2l6ZTsgLS1pID49IDA7ICkKKwl7CisJICAgIC8qIGluc2VydCBOTCBiZXR3ZWVuIGxpbmVzIGFuZCBhZnRlciBsYXN0IGxpbmUgaWYgdHlwZSBpcyBNTElORSAqLworCSAgICBpZiAoeV9jdXJyZW50LT55X3R5cGUgPT0gTUxJTkUgfHwgaSA8IHlfY3VycmVudC0+eV9zaXplIC0gMQorCQkJCQkJCQkgICAgIHx8IGFkZGNyKQorCSAgICB7CisJCWlmIChpbnNfdHlwZWJ1ZigoY2hhcl91ICopIlxuIiwgcmVtYXAsIDAsIFRSVUUsIEZBTFNFKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgaWYgKGluc190eXBlYnVmKHlfY3VycmVudC0+eV9hcnJheVtpXSwgcmVtYXAsIDAsIFRSVUUsIEZBTFNFKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwkgICAgaWYgKGNvbG9uICYmIGluc190eXBlYnVmKChjaGFyX3UgKikiOiIsIHJlbWFwLCAwLCBUUlVFLCBGQUxTRSkKKwkJCQkJCQkJICAgICAgPT0gRkFJTCkKKwkJcmV0dXJuIEZBSUw7CisJfQorCUV4ZWNfcmVnID0gVFJVRTsJLyogZGlzYWJsZSB0aGUgJ3EnIGNvbW1hbmQgKi8KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIElmICJyZXN0YXJ0X2VkaXQiIGlzIG5vdCB6ZXJvLCBwdXQgaXQgaW4gdGhlIHR5cGVhaGVhZCBidWZmZXIsIHNvIHRoYXQgaXQncworICogdXNlZCBvbmx5IGFmdGVyIG90aGVyIHR5cGVhaGVhZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHV0X3JlZWRpdF9pbl90eXBlYnVmKCkKK3sKKyAgICBjaGFyX3UJYnVmWzNdOworCisgICAgaWYgKHJlc3RhcnRfZWRpdCAhPSBOVUwpCisgICAgeworCWlmIChyZXN0YXJ0X2VkaXQgPT0gJ1YnKQorCXsKKwkgICAgYnVmWzBdID0gJ2cnOworCSAgICBidWZbMV0gPSAnUic7CisJICAgIGJ1ZlsyXSA9IE5VTDsKKwl9CisJZWxzZQorCXsKKwkgICAgYnVmWzBdID0gcmVzdGFydF9lZGl0ID09ICdJJyA/ICdpJyA6IHJlc3RhcnRfZWRpdDsKKwkgICAgYnVmWzFdID0gTlVMOworCX0KKwlpZiAoaW5zX3R5cGVidWYoYnVmLCBSRU1BUF9OT05FLCAwLCBUUlVFLCBGQUxTRSkgPT0gT0spCisJICAgIHJlc3RhcnRfZWRpdCA9IE5VTDsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgaW50CitwdXRfaW5fdHlwZWJ1ZihzLCBjb2xvbikKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQljb2xvbjsJICAgIC8qIGFkZCAnOicgYmVmb3JlIHRoZSBsaW5lICovCit7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKworICAgIHB1dF9yZWVkaXRfaW5fdHlwZWJ1ZigpOworICAgIGlmIChjb2xvbikKKwlyZXR2YWwgPSBpbnNfdHlwZWJ1ZigoY2hhcl91ICopIlxuIiwgUkVNQVBfWUVTLCAwLCBUUlVFLCBGQUxTRSk7CisgICAgaWYgKHJldHZhbCA9PSBPSykKKwlyZXR2YWwgPSBpbnNfdHlwZWJ1ZihzLCBSRU1BUF9ZRVMsIDAsIFRSVUUsIEZBTFNFKTsKKyAgICBpZiAoY29sb24gJiYgcmV0dmFsID09IE9LKQorCXJldHZhbCA9IGluc190eXBlYnVmKChjaGFyX3UgKikiOiIsIFJFTUFQX1lFUywgMCwgVFJVRSwgRkFMU0UpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBJbnNlcnQgYSB5YW5rIHJlZ2lzdGVyOiBjb3B5IGl0IGludG8gdGhlIFJlYWQgYnVmZmVyLgorICogVXNlZCBieSBDVFJMLVIgY29tbWFuZCBhbmQgbWlkZGxlIG1vdXNlIGJ1dHRvbiBpbiBpbnNlcnQgbW9kZS4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK2luc2VydF9yZWcocmVnbmFtZSwgbGl0ZXJhbGx5KQorICAgIGludAkJcmVnbmFtZTsKKyAgICBpbnQJCWxpdGVyYWxseTsJLyogaW5zZXJ0IGxpdGVyYWxseSwgbm90IGFzIGlmIHR5cGVkICovCit7CisgICAgbG9uZwlpOworICAgIGludAkJcmV0dmFsID0gT0s7CisgICAgY2hhcl91CSphcmc7CisgICAgaW50CQlhbGxvY2F0ZWQ7CisKKyAgICAvKgorICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBpbnRvIGFuIGVuZGxlc3MgbG9vcCBieSBoYXZpbmcgQ1RSTC1SIGEgaW4KKyAgICAgKiByZWdpc3RlciBhIGFuZCB0aGVuLCBpbiBpbnNlcnQgbW9kZSwgZG9pbmcgQ1RSTC1SIGEuCisgICAgICogSWYgeW91IGhpdCBDVFJMLUMsIHRoZSBsb29wIHdpbGwgYmUgYnJva2VuIGhlcmUuCisgICAgICovCisgICAgdWlfYnJlYWtjaGVjaygpOworICAgIGlmIChnb3RfaW50KQorCXJldHVybiBGQUlMOworCisgICAgLyogY2hlY2sgZm9yIHZhbGlkIHJlZ25hbWUgKi8KKyAgICBpZiAocmVnbmFtZSAhPSBOVUwgJiYgIXZhbGlkX3lhbmtfcmVnKHJlZ25hbWUsIEZBTFNFKSkKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgcmVnbmFtZSA9IG1heV9nZXRfc2VsZWN0aW9uKHJlZ25hbWUpOworI2VuZGlmCisKKyAgICBpZiAocmVnbmFtZSA9PSAnLicpCQkJLyogaW5zZXJ0IGxhc3QgaW5zZXJ0ZWQgdGV4dCAqLworCXJldHZhbCA9IHN0dWZmX2luc2VydGVkKE5VTCwgMUwsIFRSVUUpOworICAgIGVsc2UgaWYgKGdldF9zcGVjX3JlZyhyZWduYW1lLCAmYXJnLCAmYWxsb2NhdGVkLCBUUlVFKSkKKyAgICB7CisJaWYgKGFyZyA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKwlzdHVmZmVzY2FwZWQoYXJnLCBsaXRlcmFsbHkpOworCWlmIChhbGxvY2F0ZWQpCisJICAgIHZpbV9mcmVlKGFyZyk7CisgICAgfQorICAgIGVsc2UJCQkJLyogbmFtZSBvciBudW1iZXIgcmVnaXN0ZXIgKi8KKyAgICB7CisJZ2V0X3lhbmtfcmVnaXN0ZXIocmVnbmFtZSwgRkFMU0UpOworCWlmICh5X2N1cnJlbnQtPnlfYXJyYXkgPT0gTlVMTCkKKwkgICAgcmV0dmFsID0gRkFJTDsKKwllbHNlCisJeworCSAgICBmb3IgKGkgPSAwOyBpIDwgeV9jdXJyZW50LT55X3NpemU7ICsraSkKKwkgICAgeworCQlzdHVmZmVzY2FwZWQoeV9jdXJyZW50LT55X2FycmF5W2ldLCBsaXRlcmFsbHkpOworCQkvKgorCQkgKiBJbnNlcnQgYSBuZXdsaW5lIGJldHdlZW4gbGluZXMgYW5kIGFmdGVyIGxhc3QgbGluZSBpZgorCQkgKiB5X3R5cGUgaXMgTUxJTkUuCisJCSAqLworCQlpZiAoeV9jdXJyZW50LT55X3R5cGUgPT0gTUxJTkUgfHwgaSA8IHlfY3VycmVudC0+eV9zaXplIC0gMSkKKwkJICAgIHN0dWZmY2hhclJlYWRidWZmKCdcbicpOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBTdHVmZiBhIHN0cmluZyBpbnRvIHRoZSB0eXBlYWhlYWQgYnVmZmVyLCBzdWNoIHRoYXQgZWRpdCgpIHdpbGwgaW5zZXJ0IGl0CisgKiBsaXRlcmFsbHkgKCJsaXRlcmFsbHkiIFRSVUUpIG9yIGludGVycHJldCBpcyBhcyB0eXBlZCBjaGFyYWN0ZXJzLgorICovCisgICAgc3RhdGljIHZvaWQKK3N0dWZmZXNjYXBlZChhcmcsIGxpdGVyYWxseSkKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCWxpdGVyYWxseTsKK3sKKyAgICBpbnQJCWM7CisgICAgY2hhcl91CSpzdGFydDsKKworICAgIHdoaWxlICgqYXJnICE9IE5VTCkKKyAgICB7CisJLyogU3R1ZmYgYSBzZXF1ZW5jZSBvZiBub3JtYWwgQVNDSUkgY2hhcmFjdGVycywgdGhhdCdzIGZhc3QuICBBbHNvCisJICogc3R1ZmYgS19TUEVDSUFMIHRvIGdldCB0aGUgZWZmZWN0IG9mIGEgc3BlY2lhbCBrZXkgd2hlbiAibGl0ZXJhbGx5IgorCSAqIGlzIFRSVUUuICovCisJc3RhcnQgPSBhcmc7CisJd2hpbGUgKCgqYXJnID49ICcgJworI2lmbmRlZiBFQkNESUMKKwkJICAgICYmICphcmcgPCBERUwgLyogRUJDRElDOiBjaGFycyBhYm92ZSBzcGFjZSBhcmUgbm9ybWFsICovCisjZW5kaWYKKwkJICAgICkKKwkJfHwgKCphcmcgPT0gS19TUEVDSUFMICYmICFsaXRlcmFsbHkpKQorCSAgICArK2FyZzsKKwlpZiAoYXJnID4gc3RhcnQpCisJICAgIHN0dWZmUmVhZGJ1ZmZMZW4oc3RhcnQsIChsb25nKShhcmcgLSBzdGFydCkpOworCisJLyogc3R1ZmYgYSBzaW5nbGUgc3BlY2lhbCBjaGFyYWN0ZXIgKi8KKwlpZiAoKmFyZyAhPSBOVUwpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJYyA9IG1iX3B0cjJjaGFyX2FkdigmYXJnKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCWMgPSAqYXJnKys7CisJICAgIGlmIChsaXRlcmFsbHkgJiYgKChjIDwgJyAnICYmIGMgIT0gVEFCKSB8fCBjID09IERFTCkpCisJCXN0dWZmY2hhclJlYWRidWZmKEN0cmxfVik7CisJICAgIHN0dWZmY2hhclJlYWRidWZmKGMpOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBJZiAicmVnbmFtZSIgaXMgYSBzcGVjaWFsIHJlZ2lzdGVyLCByZXR1cm4gYSBwb2ludGVyIHRvIGl0cyB2YWx1ZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9zcGVjX3JlZyhyZWduYW1lLCBhcmdwLCBhbGxvY2F0ZWQsIGVycm1zZykKKyAgICBpbnQJCXJlZ25hbWU7CisgICAgY2hhcl91CSoqYXJncDsKKyAgICBpbnQJCSphbGxvY2F0ZWQ7CisgICAgaW50CQllcnJtc2c7CQkvKiBnaXZlIGVycm9yIG1lc3NhZ2Ugd2hlbiBmYWlsaW5nICovCit7CisgICAgaW50CQljbnQ7CisKKyAgICAqYXJncCA9IE5VTEw7CisgICAgKmFsbG9jYXRlZCA9IEZBTFNFOworICAgIHN3aXRjaCAocmVnbmFtZSkKKyAgICB7CisJY2FzZSAnJSc6CQkvKiBmaWxlIG5hbWUgKi8KKwkgICAgaWYgKGVycm1zZykKKwkJY2hlY2tfZm5hbWUoKTsJLyogd2lsbCBnaXZlIGVtc2cgaWYgbm90IHNldCAqLworCSAgICAqYXJncCA9IGN1cmJ1Zi0+Yl9mbmFtZTsKKwkgICAgcmV0dXJuIFRSVUU7CisKKwljYXNlICcjJzoJCS8qIGFsdGVybmF0ZSBmaWxlIG5hbWUgKi8KKwkgICAgKmFyZ3AgPSBnZXRhbHRmbmFtZShlcnJtc2cpOwkvKiBtYXkgZ2l2ZSBlbXNnIGlmIG5vdCBzZXQgKi8KKwkgICAgcmV0dXJuIFRSVUU7CisKKyNpZmRlZiBGRUFUX0VWQUwKKwljYXNlICc9JzoJCS8qIHJlc3VsdCBvZiBleHByZXNzaW9uICovCisJICAgICphcmdwID0gZ2V0X2V4cHJfbGluZSgpOworCSAgICAqYWxsb2NhdGVkID0gVFJVRTsKKwkgICAgcmV0dXJuIFRSVUU7CisjZW5kaWYKKworCWNhc2UgJzonOgkJLyogbGFzdCBjb21tYW5kIGxpbmUgKi8KKwkgICAgaWYgKGxhc3RfY21kbGluZSA9PSBOVUxMICYmIGVycm1zZykKKwkJRU1TRyhfKGVfbm9sYXN0Y21kKSk7CisJICAgICphcmdwID0gbGFzdF9jbWRsaW5lOworCSAgICByZXR1cm4gVFJVRTsKKworCWNhc2UgJy8nOgkJLyogbGFzdCBzZWFyY2gtcGF0dGVybiAqLworCSAgICBpZiAobGFzdF9zZWFyY2hfcGF0KCkgPT0gTlVMTCAmJiBlcnJtc2cpCisJCUVNU0coXyhlX25vcHJldnJlKSk7CisJICAgICphcmdwID0gbGFzdF9zZWFyY2hfcGF0KCk7CisJICAgIHJldHVybiBUUlVFOworCisJY2FzZSAnLic6CQkvKiBsYXN0IGluc2VydGVkIHRleHQgKi8KKwkgICAgKmFyZ3AgPSBnZXRfbGFzdF9pbnNlcnRfc2F2ZSgpOworCSAgICAqYWxsb2NhdGVkID0gVFJVRTsKKwkgICAgaWYgKCphcmdwID09IE5VTEwgJiYgZXJybXNnKQorCQlFTVNHKF8oZV9ub2luc3RleHQpKTsKKwkgICAgcmV0dXJuIFRSVUU7CisKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKwljYXNlIEN0cmxfRjoJCS8qIEZpbGVuYW1lIHVuZGVyIGN1cnNvciAqLworCWNhc2UgQ3RybF9QOgkJLyogUGF0aCB1bmRlciBjdXJzb3IsIGV4cGFuZCB2aWEgInBhdGgiICovCisJICAgIGlmICghZXJybXNnKQorCQlyZXR1cm4gRkFMU0U7CisJICAgICphcmdwID0gZmlsZV9uYW1lX2F0X2N1cnNvcihGTkFNRV9NRVNTIHwgRk5BTUVfSFlQCisJCQkJfCAocmVnbmFtZSA9PSBDdHJsX1AgPyBGTkFNRV9FWFAgOiAwKSwgMUwpOworCSAgICAqYWxsb2NhdGVkID0gVFJVRTsKKwkgICAgcmV0dXJuIFRSVUU7CisjZW5kaWYKKworCWNhc2UgQ3RybF9XOgkJLyogd29yZCB1bmRlciBjdXJzb3IgKi8KKwljYXNlIEN0cmxfQToJCS8qIFdPUkQgKG1uZW1vbmljIEFsbCkgdW5kZXIgY3Vyc29yICovCisJICAgIGlmICghZXJybXNnKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGNudCA9IGZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKGFyZ3AsIHJlZ25hbWUgPT0gQ3RybF9XCisJCQkJICAgPyAgKEZJTkRfSURFTlR8RklORF9TVFJJTkcpIDogRklORF9TVFJJTkcpOworCSAgICAqYXJncCA9IGNudCA/IHZpbV9zdHJuc2F2ZSgqYXJncCwgY250KSA6IE5VTEw7CisJICAgICphbGxvY2F0ZWQgPSBUUlVFOworCSAgICByZXR1cm4gVFJVRTsKKworCWNhc2UgJ18nOgkJLyogYmxhY2sgaG9sZTogYWx3YXlzIGVtcHR5ICovCisJICAgICphcmdwID0gKGNoYXJfdSAqKSIiOworCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBwYXN0ZSBhIHlhbmsgcmVnaXN0ZXIgaW50byB0aGUgY29tbWFuZCBsaW5lLgorICogdXNlZCBieSBDVFJMLVIgY29tbWFuZCBpbiBjb21tYW5kLWxpbmUgbW9kZQorICogaW5zZXJ0X3JlZygpIGNhbid0IGJlIHVzZWQgaGVyZSwgYmVjYXVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyAqIHJlZ2lzdGVyIGNvbnRlbnRzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgY29tbWFuZHMuCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CitjbWRsaW5lX3Bhc3RlKHJlZ25hbWUsIGxpdGVyYWxseSkKKyAgICBpbnQgcmVnbmFtZTsKKyAgICBpbnQgbGl0ZXJhbGx5OwkvKiBJbnNlcnQgdGV4dCBsaXRlcmFsbHkgaW5zdGVhZCBvZiAiYXMgdHlwZWQiICovCit7CisgICAgbG9uZwlpOworICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJYWxsb2NhdGVkOworCisgICAgLyogY2hlY2sgZm9yIHZhbGlkIHJlZ25hbWU7IGFsc28gYWNjZXB0IHNwZWNpYWwgY2hhcmFjdGVycyBmb3IgQ1RSTC1SIGluCisgICAgICogdGhlIGNvbW1hbmQgbGluZSAqLworICAgIGlmIChyZWduYW1lICE9IEN0cmxfRiAmJiByZWduYW1lICE9IEN0cmxfUCAmJiByZWduYW1lICE9IEN0cmxfVworCSAgICAmJiByZWduYW1lICE9IEN0cmxfQSAmJiAhdmFsaWRfeWFua19yZWcocmVnbmFtZSwgRkFMU0UpKQorCXJldHVybiBGQUlMOworCisgICAgLyogQSByZWdpc3RlciBjb250YWluaW5nIENUUkwtUiBjYW4gY2F1c2UgYW4gZW5kbGVzcyBsb29wLiAgQWxsb3cgdXNpbmcKKyAgICAgKiBDVFJMLUMgdG8gYnJlYWsgdGhlIGxvb3AuICovCisgICAgbGluZV9icmVha2NoZWNrKCk7CisgICAgaWYgKGdvdF9pbnQpCisJcmV0dXJuIEZBSUw7CisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIHJlZ25hbWUgPSBtYXlfZ2V0X3NlbGVjdGlvbihyZWduYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKGdldF9zcGVjX3JlZyhyZWduYW1lLCAmYXJnLCAmYWxsb2NhdGVkLCBUUlVFKSkKKyAgICB7CisJaWYgKGFyZyA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKwljbWRsaW5lX3Bhc3RlX3N0cihhcmcsIGxpdGVyYWxseSk7CisJaWYgKGFsbG9jYXRlZCkKKwkgICAgdmltX2ZyZWUoYXJnKTsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgZ2V0X3lhbmtfcmVnaXN0ZXIocmVnbmFtZSwgRkFMU0UpOworICAgIGlmICh5X2N1cnJlbnQtPnlfYXJyYXkgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCB5X2N1cnJlbnQtPnlfc2l6ZTsgKytpKQorICAgIHsKKwljbWRsaW5lX3Bhc3RlX3N0cih5X2N1cnJlbnQtPnlfYXJyYXlbaV0sIGxpdGVyYWxseSk7CisKKwkvKiBpbnNlcnQgXk0gYmV0d2VlbiBsaW5lcyBhbmQgYWZ0ZXIgbGFzdCBsaW5lIGlmIHR5cGUgaXMgTUxJTkUgKi8KKwlpZiAoeV9jdXJyZW50LT55X3R5cGUgPT0gTUxJTkUgfHwgaSA8IHlfY3VycmVudC0+eV9zaXplIC0gMSkKKwkgICAgY21kbGluZV9wYXN0ZV9zdHIoKGNoYXJfdSAqKSJcciIsIGxpdGVyYWxseSk7CisKKwkvKiBDaGVjayBmb3IgQ1RSTC1DLCBpbiBjYXNlIHNvbWVvbmUgdHJpZXMgdG8gcGFzdGUgYSBmZXcgdGhvdXNhbmQKKwkgKiBsaW5lcyBhbmQgZ2V0cyBib3JlZC4gKi8KKwl1aV9icmVha2NoZWNrKCk7CisJaWYgKGdvdF9pbnQpCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBQdXQgYSBzdHJpbmcgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqIFdoZW4gImxpdGVyYWxseSIgaXMgVFJVRSwgaW5zZXJ0IGxpdGVyYWxseS4KKyAqIFdoZW4gImxpdGVyYWxseSIgaXMgRkFMU0UsIGluc2VydCBhcyB0eXBlZCwgYnV0IGRvbid0IGxlYXZlIHRoZSBjb21tYW5kCisgKiBsaW5lLgorICovCisgICAgc3RhdGljIHZvaWQKK2NtZGxpbmVfcGFzdGVfc3RyKHMsIGxpdGVyYWxseSkKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQlsaXRlcmFsbHk7Cit7CisgICAgaW50CQljLCBjdjsKKworICAgIGlmIChsaXRlcmFsbHkpCisJcHV0X29uX2NtZGxpbmUocywgLTEsIFRSVUUpOworICAgIGVsc2UKKwl3aGlsZSAoKnMgIT0gTlVMKQorCXsKKwkgICAgY3YgPSAqczsKKwkgICAgaWYgKGN2ID09IEN0cmxfViAmJiBzWzFdKQorCQkrK3M7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCWMgPSBtYl9wdHIyY2hhcihzKTsKKwkJcyArPSBtYl9jaGFyMmxlbihjKTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJYyA9ICpzKys7CisJICAgIGlmIChjdiA9PSBDdHJsX1YgfHwgYyA9PSBFU0MgfHwgYyA9PSBDdHJsX0MgfHwgYyA9PSBDQVIgfHwgYyA9PSBOTAorI2lmZGVmIFVOSVgKKwkJICAgIHx8IGMgPT0gaW50cl9jaGFyCisjZW5kaWYKKwkJICAgIHx8IChjID09IEN0cmxfQlNMICYmICpzID09IEN0cmxfTikpCisJCXN0dWZmY2hhclJlYWRidWZmKEN0cmxfVik7CisJICAgIHN0dWZmY2hhclJlYWRidWZmKGMpOworCX0KK30KKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQWRqdXN0IHRoZSByZWdpc3RlciBuYW1lIHBvaW50ZWQgdG8gd2l0aCAicnAiIGZvciB0aGUgY2xpcGJvYXJkIGJlaW5nCisgKiB1c2VkIGFsd2F5cyBhbmQgdGhlIGNsaXBib2FyZCBiZWluZyBhdmFpbGFibGUuCisgKi8KKyAgICB2b2lkCithZGp1c3RfY2xpcF9yZWcocnApCisgICAgaW50CQkqcnA7Cit7CisgICAgLyogSWYgbm8gcmVnLiBzcGVjaWZpZWQsIGFuZCAidW5uYW1lZCIgaXMgaW4gJ2NsaXBib2FyZCcsIHVzZSAnKicgcmVnLiAqLworICAgIGlmICgqcnAgPT0gMCAmJiBjbGlwX3VubmFtZWQpCisJKnJwID0gJyonOworICAgIGlmICghY2xpcF9zdGFyLmF2YWlsYWJsZSAmJiAqcnAgPT0gJyonKQorCSpycCA9IDA7CisgICAgaWYgKCFjbGlwX3BsdXMuYXZhaWxhYmxlICYmICpycCA9PSAnKycpCisJKnJwID0gMDsKK30KKyNlbmRpZgorCisvKgorICogb3BfZGVsZXRlIC0gaGFuZGxlIGEgZGVsZXRlIG9wZXJhdGlvbgorICoKKyAqIHJldHVybiBGQUlMIGlmIHVuZG8gZmFpbGVkLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK29wX2RlbGV0ZShvYXApCisgICAgb3BhcmdfVCAgICpvYXA7Cit7CisgICAgaW50CQkJbjsKKyAgICBsaW5lbnJfVAkJbG51bTsKKyAgICBjaGFyX3UJCSpwdHI7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBjaGFyX3UJCSpuZXdwLCAqb2xkcDsKKyAgICBzdHJ1Y3QgYmxvY2tfZGVmCWJkOworI2VuZGlmCisgICAgbGluZW5yX1QJCW9sZF9sY291bnQgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBpbnQJCQlkaWRfeWFuayA9IEZBTFNFOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKQkgICAgLyogbm90aGluZyB0byBkbyAqLworCXJldHVybiBPSzsKKworICAgIC8qIE5vdGhpbmcgdG8gZGVsZXRlLCByZXR1cm4gaGVyZS4JRG8gcHJlcGFyZSB1bmRvLCBmb3Igb3BfY2hhbmdlKCkuICovCisgICAgaWYgKG9hcC0+ZW1wdHkpCisJcmV0dXJuIHVfc2F2ZV9jdXJzb3IoKTsKKworICAgIGlmICghY3VyYnVmLT5iX3BfbWEpCisgICAgeworCUVNU0coXyhlX21vZGlmaWFibGUpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIGFkanVzdF9jbGlwX3JlZygmb2FwLT5yZWduYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisJbWJfYWRqdXN0X29wZW5kKG9hcCk7CisjZW5kaWYKKworLyoKKyAqIEltaXRhdGUgdGhlIHN0cmFuZ2UgVmkgYmVoYXZpb3VyOiBJZiB0aGUgZGVsZXRlIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZQorICogYW5kIG1vdGlvbl90eXBlID09IE1DSEFSIGFuZCB0aGUgcmVzdWx0IGlzIGEgYmxhbmsgbGluZSwgbWFrZSB0aGUgZGVsZXRlCisgKiBsaW5ld2lzZS4gIERvbid0IGRvIHRoaXMgZm9yIHRoZSBjaGFuZ2UgY29tbWFuZCBvciBWaXN1YWwgbW9kZS4KKyAqLworICAgIGlmICggICAgICAgb2FwLT5tb3Rpb25fdHlwZSA9PSBNQ0hBUgorI2lmZGVmIEZFQVRfVklTVUFMCisJICAgICYmICFvYXAtPmlzX1ZJc3VhbAorI2VuZGlmCisJICAgICYmIG9hcC0+bGluZV9jb3VudCA+IDEKKwkgICAgJiYgb2FwLT5vcF90eXBlID09IE9QX0RFTEVURSkKKyAgICB7CisJcHRyID0gbWxfZ2V0KG9hcC0+ZW5kLmxudW0pICsgb2FwLT5lbmQuY29sICsgb2FwLT5pbmNsdXNpdmU7CisJcHRyID0gc2tpcHdoaXRlKHB0cik7CisJaWYgKCpwdHIgPT0gTlVMICYmIGluaW5kZW50KDApKQorCSAgICBvYXAtPm1vdGlvbl90eXBlID0gTUxJTkU7CisgICAgfQorCisvKgorICogQ2hlY2sgZm9yIHRyeWluZyB0byBkZWxldGUgKGUuZy4gIkQiKSBpbiBhbiBlbXB0eSBsaW5lLgorICogTm90ZTogRm9yIHRoZSBjaGFuZ2Ugb3BlcmF0b3IgaXQgaXMgb2suCisgKi8KKyAgICBpZiAoICAgICAgIG9hcC0+bW90aW9uX3R5cGUgPT0gTUNIQVIKKwkgICAgJiYgb2FwLT5saW5lX2NvdW50ID09IDEKKwkgICAgJiYgb2FwLT5vcF90eXBlID09IE9QX0RFTEVURQorCSAgICAmJiAqbWxfZ2V0KG9hcC0+c3RhcnQubG51bSkgPT0gTlVMKQorICAgIHsKKwkvKgorCSAqIEl0J3MgYW4gZXJyb3IgdG8gb3BlcmF0ZSBvbiBhbiBlbXB0eSByZWdpb24sIHdoZW4gJ0UnIGluY2x1Y2RlZCBpbgorCSAqICdjcG9wdGlvbnMnIChWaSBjb21wYXRpYmxlKS4KKwkgKi8KKwlpZiAodmltX3N0cmNocihwX2NwbywgQ1BPX0VNUFRZUkVHSU9OKSAhPSBOVUxMKQorCSAgICBiZWVwX2ZsdXNoKCk7CisJcmV0dXJuIE9LOworICAgIH0KKworLyoKKyAqIERvIGEgeWFuayBvZiB3aGF0ZXZlciB3ZSdyZSBhYm91dCB0byBkZWxldGUuCisgKiBJZiBhIHlhbmsgcmVnaXN0ZXIgd2FzIHNwZWNpZmllZCwgcHV0IHRoZSBkZWxldGVkIHRleHQgaW50byB0aGF0IHJlZ2lzdGVyLgorICogRm9yIHRoZSBibGFjayBob2xlIHJlZ2lzdGVyICdfJyBkb24ndCB5YW5rIGFueXRoaW5nLgorICovCisgICAgaWYgKG9hcC0+cmVnbmFtZSAhPSAnXycpCisgICAgeworCWlmIChvYXAtPnJlZ25hbWUgIT0gMCkKKwl7CisJICAgIC8qIGNoZWNrIGZvciByZWFkLW9ubHkgcmVnaXN0ZXIgKi8KKwkgICAgaWYgKCF2YWxpZF95YW5rX3JlZyhvYXAtPnJlZ25hbWUsIFRSVUUpKQorCSAgICB7CisJCWJlZXBfZmx1c2goKTsKKwkJcmV0dXJuIE9LOworCSAgICB9CisJICAgIGdldF95YW5rX3JlZ2lzdGVyKG9hcC0+cmVnbmFtZSwgVFJVRSk7IC8qIHlhbmsgaW50byBzcGVjaWYnZCByZWcuICovCisJICAgIGlmIChvcF95YW5rKG9hcCwgVFJVRSwgRkFMU0UpID09IE9LKSAgIC8qIHlhbmsgd2l0aG91dCBtZXNzYWdlICovCisJCWRpZF95YW5rID0gVFJVRTsKKwl9CisKKwkvKgorCSAqIFB1dCBkZWxldGVkIHRleHQgaW50byByZWdpc3RlciAxIGFuZCBzaGlmdCBudW1iZXIgcmVnaXN0ZXJzIGlmIHRoZQorCSAqIGRlbGV0ZSBjb250YWlucyBhIGxpbmUgYnJlYWssIG9yIHdoZW4gYSByZWduYW1lIGhhcyBiZWVuIHNwZWNpZmllZC4KKwkgKi8KKwlpZiAob2FwLT5yZWduYW1lICE9IDAgfHwgb2FwLT5tb3Rpb25fdHlwZSA9PSBNTElORQorCQkJCSAgIHx8IG9hcC0+bGluZV9jb3VudCA+IDEgfHwgb2FwLT51c2VfcmVnX29uZSkKKwl7CisJICAgIHlfY3VycmVudCA9ICZ5X3JlZ3NbOV07CisJICAgIGZyZWVfeWFua19hbGwoKTsJCQkvKiBmcmVlIHJlZ2lzdGVyIG5pbmUgKi8KKwkgICAgZm9yIChuID0gOTsgbiA+IDE7IC0tbikKKwkJeV9yZWdzW25dID0geV9yZWdzW24gLSAxXTsKKwkgICAgeV9wcmV2aW91cyA9IHlfY3VycmVudCA9ICZ5X3JlZ3NbMV07CisJICAgIHlfcmVnc1sxXS55X2FycmF5ID0gTlVMTDsJCS8qIHNldCByZWdpc3RlciBvbmUgdG8gZW1wdHkgKi8KKwkgICAgaWYgKG9wX3lhbmsob2FwLCBUUlVFLCBGQUxTRSkgPT0gT0spCisJCWRpZF95YW5rID0gVFJVRTsKKwl9CisKKwkvKiBZYW5rIGludG8gc21hbGwgZGVsZXRlIHJlZ2lzdGVyIHdoZW4gbm8gcmVnaXN0ZXIgc3BlY2lmaWVkIGFuZCB0aGUKKwkgKiBkZWxldGUgaXMgd2l0aGluIG9uZSBsaW5lLiAqLworCWlmIChvYXAtPnJlZ25hbWUgPT0gMCAmJiBvYXAtPm1vdGlvbl90eXBlICE9IE1MSU5FCisJCQkJCQkgICAgICAmJiBvYXAtPmxpbmVfY291bnQgPT0gMSkKKwl7CisJICAgIG9hcC0+cmVnbmFtZSA9ICctJzsKKwkgICAgZ2V0X3lhbmtfcmVnaXN0ZXIob2FwLT5yZWduYW1lLCBUUlVFKTsKKwkgICAgaWYgKG9wX3lhbmsob2FwLCBUUlVFLCBGQUxTRSkgPT0gT0spCisJCWRpZF95YW5rID0gVFJVRTsKKwkgICAgb2FwLT5yZWduYW1lID0gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgdG9vIG11Y2ggc3R1ZmYgdG8gZml0IGluIHRoZSB5YW5rIHJlZ2lzdGVyLCB0aGVuIGdldCBhCisJICogY29uZmlybWF0aW9uIGJlZm9yZSBkb2luZyB0aGUgZGVsZXRlLiBUaGlzIGlzIGNydWRlLCBidXQgc2ltcGxlLgorCSAqIEFuZCBpdCBhdm9pZHMgZG9pbmcgYSBkZWxldGUgb2Ygc29tZXRoaW5nIHdlIGNhbid0IHB1dCBiYWNrIGlmIHdlCisJICogd2FudC4KKwkgKi8KKwlpZiAoIWRpZF95YW5rKQorCXsKKwkgICAgaW50IG1zZ19zaWxlbnRfc2F2ZSA9IG1zZ19zaWxlbnQ7CisKKwkgICAgbXNnX3NpbGVudCA9IDA7CS8qIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0ICovCisJICAgIG4gPSBhc2tfeWVzbm8oKGNoYXJfdSAqKV8oImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IiksIFRSVUUpOworCSAgICBtc2dfc2lsZW50ID0gbXNnX3NpbGVudF9zYXZlOworCSAgICBpZiAobiAhPSAneScpCisJICAgIHsKKwkJRU1TRyhfKGVfYWJvcnQpKTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKy8qCisgKiBibG9jayBtb2RlIGRlbGV0ZQorICovCisgICAgaWYgKG9hcC0+YmxvY2tfbW9kZSkKKyAgICB7CisJaWYgKHVfc2F2ZSgobGluZW5yX1QpKG9hcC0+c3RhcnQubG51bSAtIDEpLAorCQkJICAgICAgIChsaW5lbnJfVCkob2FwLT5lbmQubG51bSArIDEpKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKworCWZvciAobG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsgbG51bSA8PSBvYXAtPmVuZC5sbnVtOyArK2xudW0pCisJeworCSAgICBibG9ja19wcmVwKG9hcCwgJmJkLCBsbnVtLCBUUlVFKTsKKwkgICAgaWYgKGJkLnRleHRsZW4gPT0gMCkJLyogbm90aGluZyB0byBkZWxldGUgKi8KKwkJY29udGludWU7CisKKwkgICAgLyogQWRqdXN0IGN1cnNvciBwb3NpdGlvbiBmb3IgdGFiIHJlcGxhY2VkIGJ5IHNwYWNlcyBhbmQgJ2xicicuICovCisJICAgIGlmIChsbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGJkLnRleHRjb2wgKyBiZC5zdGFydHNwYWNlczsKKyMgaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQljdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjIGVuZGlmCisJICAgIH0KKworCSAgICAvKiBuID09IG51bWJlciBvZiBjaGFycyBkZWxldGVkCisJICAgICAqIElmIHdlIGRlbGV0ZSBhIFRBQiwgaXQgbWF5IGJlIHJlcGxhY2VkIGJ5IHNldmVyYWwgY2hhcmFjdGVycy4KKwkgICAgICogVGh1cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgbWF5IGluY3JlYXNlIQorCSAgICAgKi8KKwkgICAgbiA9IGJkLnRleHRsZW4gLSBiZC5zdGFydHNwYWNlcyAtIGJkLmVuZHNwYWNlczsKKwkgICAgb2xkcCA9IG1sX2dldChsbnVtKTsKKwkgICAgbmV3cCA9IGFsbG9jX2NoZWNrKCh1bnNpZ25lZClTVFJMRU4ob2xkcCkgKyAxIC0gbik7CisJICAgIGlmIChuZXdwID09IE5VTEwpCisJCWNvbnRpbnVlOworCSAgICAvKiBjb3B5IHVwIHRvIGRlbGV0ZWQgcGFydCAqLworCSAgICBtY2hfbWVtbW92ZShuZXdwLCBvbGRwLCAoc2l6ZV90KWJkLnRleHRjb2wpOworCSAgICAvKiBpbnNlcnQgc3BhY2VzICovCisJICAgIGNvcHlfc3BhY2VzKG5ld3AgKyBiZC50ZXh0Y29sLAorCQkJCSAgICAgKHNpemVfdCkoYmQuc3RhcnRzcGFjZXMgKyBiZC5lbmRzcGFjZXMpKTsKKwkgICAgLyogY29weSB0aGUgcGFydCBhZnRlciB0aGUgZGVsZXRlZCBwYXJ0ICovCisJICAgIG9sZHAgKz0gYmQudGV4dGNvbCArIGJkLnRleHRsZW47CisJICAgIG1jaF9tZW1tb3ZlKG5ld3AgKyBiZC50ZXh0Y29sICsgYmQuc3RhcnRzcGFjZXMgKyBiZC5lbmRzcGFjZXMsCisJCQkJCQkgICAgICBvbGRwLCBTVFJMRU4ob2xkcCkgKyAxKTsKKwkgICAgLyogcmVwbGFjZSB0aGUgbGluZSAqLworCSAgICBtbF9yZXBsYWNlKGxudW0sIG5ld3AsIEZBTFNFKTsKKwl9CisKKwljaGVja19jdXJzb3JfY29sKCk7CisJY2hhbmdlZF9saW5lcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cndpbi0+d19jdXJzb3IuY29sLAorCQkJCQkJICAgICAgIG9hcC0+ZW5kLmxudW0gKyAxLCAwTCk7CisJb2FwLT5saW5lX2NvdW50ID0gMDsJICAgIC8qIG5vIGxpbmVzIGRlbGV0ZWQgKi8KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJaWYgKG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisgICAgeworCWlmIChvYXAtPm9wX3R5cGUgPT0gT1BfQ0hBTkdFKQorCXsKKwkgICAgLyogRGVsZXRlIHRoZSBsaW5lcyBleGNlcHQgdGhlIGZpcnN0IG9uZS4gIFRlbXBvcmFyaWx5IG1vdmUgdGhlCisJICAgICAqIGN1cnNvciB0byB0aGUgbmV4dCBsaW5lLiAgU2F2ZSB0aGUgY3VycmVudCBsaW5lIG51bWJlciwgaWYgdGhlCisJICAgICAqIGxhc3QgbGluZSBpcyBkZWxldGVkIGl0IG1heSBiZSBjaGFuZ2VkLgorCSAgICAgKi8KKwkgICAgaWYgKG9hcC0+bGluZV9jb3VudCA+IDEpCisJICAgIHsKKwkJbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCWRlbF9saW5lcygobG9uZykob2FwLT5saW5lX2NvdW50IC0gMSksIFRSVUUpOworCQljdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworCSAgICB9CisJICAgIGlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkKKwkJcmV0dXJuIEZBSUw7CisJICAgIGlmIChjdXJidWYtPmJfcF9haSkJCSAgICAvKiBkb24ndCBkZWxldGUgaW5kZW50ICovCisJICAgIHsKKwkJYmVnaW5saW5lKEJMX1dISVRFKTsJICAgIC8qIGN1cnNvciBvbiBmaXJzdCBub24td2hpdGUgKi8KKwkJZGlkX2FpID0gVFJVRTsJCSAgICAvKiBkZWxldGUgdGhlIGluZGVudCB3aGVuIEVTQyBoaXQgKi8KKwkJYWlfY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIH0KKwkgICAgZWxzZQorCQliZWdpbmxpbmUoMCk7CQkgICAgLyogY3Vyc29yIGluIGNvbHVtbiAwICovCisJICAgIHRydW5jYXRlX2xpbmUoRkFMU0UpOyAgIC8qIGRlbGV0ZSB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLworCQkJCSAgICAvKiBsZWF2ZSBjdXJzb3IgcGFzdCBsYXN0IGNoYXIgaW4gbGluZSAqLworCSAgICBpZiAob2FwLT5saW5lX2NvdW50ID4gMSkKKwkJdV9jbGVhcmxpbmUoKTsJICAgIC8qICJVIiBjb21tYW5kIG5vdCBwb3NzaWJsZSBhZnRlciAiMmNjIiAqLworCX0KKwllbHNlCisJeworCSAgICBkZWxfbGluZXMob2FwLT5saW5lX2NvdW50LCBUUlVFKTsKKwkgICAgYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKwkgICAgdV9jbGVhcmxpbmUoKTsJLyogIlUiIGNvbW1hbmQgbm90IHBvc3NpYmxlIGFmdGVyICJkZCIgKi8KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmICh2aXJ0dWFsX29wKQorCXsKKwkgICAgaW50CQllbmRjb2wgPSAwOworCisJICAgIC8qIEZvciB2aXJ0dWFsZWRpdDogYnJlYWsgdGhlIHRhYnMgdGhhdCBhcmUgcGFydGx5IGluY2x1ZGVkLiAqLworCSAgICBpZiAoZ2NoYXJfcG9zKCZvYXAtPnN0YXJ0KSA9PSAnXHQnKQorCSAgICB7CisJCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkJLyogc2F2ZSBmaXJzdCBsaW5lIGZvciB1bmRvICovCisJCSAgICByZXR1cm4gRkFJTDsKKwkJaWYgKG9hcC0+bGluZV9jb3VudCA9PSAxKQorCQkgICAgZW5kY29sID0gZ2V0dmlzY29sMihvYXAtPmVuZC5jb2wsIG9hcC0+ZW5kLmNvbGFkZCk7CisJCWNvbGFkdmFuY2VfZm9yY2UoZ2V0dmlzY29sMihvYXAtPnN0YXJ0LmNvbCwgb2FwLT5zdGFydC5jb2xhZGQpKTsKKwkJb2FwLT5zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJCWlmIChvYXAtPmxpbmVfY291bnQgPT0gMSkKKwkJeworCQkgICAgY29sYWR2YW5jZShlbmRjb2wpOworCQkgICAgb2FwLT5lbmQuY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisJCSAgICBvYXAtPmVuZC5jb2xhZGQgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZDsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IgPSBvYXAtPnN0YXJ0OworCQl9CisJICAgIH0KKworCSAgICAvKiBCcmVhayBhIHRhYiBvbmx5IHdoZW4gaXQncyBpbmNsdWRlZCBpbiB0aGUgYXJlYS4gKi8KKwkgICAgaWYgKGdjaGFyX3Bvcygmb2FwLT5lbmQpID09ICdcdCcKKwkJCQkgICAgICYmIChpbnQpb2FwLT5lbmQuY29sYWRkIDwgb2FwLT5pbmNsdXNpdmUpCisJICAgIHsKKwkJLyogc2F2ZSBsYXN0IGxpbmUgZm9yIHVuZG8gKi8KKwkJaWYgKHVfc2F2ZSgobGluZW5yX1QpKG9hcC0+ZW5kLmxudW0gLSAxKSwKKwkJCQkgICAgICAgKGxpbmVucl9UKShvYXAtPmVuZC5sbnVtICsgMSkpID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkJY3Vyd2luLT53X2N1cnNvciA9IG9hcC0+ZW5kOworCQljb2xhZHZhbmNlX2ZvcmNlKGdldHZpc2NvbDIob2FwLT5lbmQuY29sLCBvYXAtPmVuZC5jb2xhZGQpKTsKKwkJb2FwLT5lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOworCQljdXJ3aW4tPndfY3Vyc29yID0gb2FwLT5zdGFydDsKKwkgICAgfQorCX0KKyNlbmRpZgorCisJaWYgKG9hcC0+bGluZV9jb3VudCA9PSAxKQkvKiBkZWxldGUgY2hhcmFjdGVycyB3aXRoaW4gb25lIGxpbmUgKi8KKwl7CisJICAgIGlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkJLyogc2F2ZSBsaW5lIGZvciB1bmRvICovCisJCXJldHVybiBGQUlMOworCisJICAgIC8qIGlmICdjcG9wdGlvbnMnIGNvbnRhaW5zICckJywgZGlzcGxheSAnJCcgYXQgZW5kIG9mIGNoYW5nZSAqLworCSAgICBpZiAoCSAgIHZpbV9zdHJjaHIocF9jcG8sIENQT19ET0xMQVIpICE9IE5VTEwKKwkJICAgICYmIG9hcC0+b3BfdHlwZSA9PSBPUF9DSEFOR0UKKwkJICAgICYmIG9hcC0+ZW5kLmxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJICAgICYmICFvYXAtPmlzX1ZJc3VhbAorI2VuZGlmCisJCSAgICApCisJCWRpc3BsYXlfZG9sbGFyKG9hcC0+ZW5kLmNvbCAtICFvYXAtPmluY2x1c2l2ZSk7CisKKwkgICAgbiA9IG9hcC0+ZW5kLmNvbCAtIG9hcC0+c3RhcnQuY29sICsgMSAtICFvYXAtPmluY2x1c2l2ZTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgaWYgKHZpcnR1YWxfb3ApCisJICAgIHsKKwkJLyogZml4IHVwIHRoaW5ncyBmb3IgdmlydHVhbGVkaXQtZGVsZXRlOgorCQkgKiBicmVhayB0aGUgdGFicyB3aGljaCBhcmUgZ29pbmcgdG8gZ2V0IGluIG91ciB3YXkKKwkJICovCisJCWNoYXJfdQkJKmN1cmxpbmUgPSBtbF9nZXRfY3VybGluZSgpOworCQlpbnQJCWxlbiA9IChpbnQpU1RSTEVOKGN1cmxpbmUpOworCisJCWlmIChvYXAtPmVuZC5jb2xhZGQgIT0gMAorCQkJJiYgKGludClvYXAtPmVuZC5jb2wgPj0gbGVuIC0gMQorCQkJJiYgIShvYXAtPnN0YXJ0LmNvbGFkZCAmJiAoaW50KW9hcC0+ZW5kLmNvbCA+PSBsZW4gLSAxKSkKKwkJICAgIG4rKzsKKwkJLyogRGVsZXRlIGF0IGxlYXN0IG9uZSBjaGFyIChlLmcsIHdoZW4gb24gYSBjb250cm9sIGNoYXIpLiAqLworCQlpZiAobiA9PSAwICYmIG9hcC0+c3RhcnQuY29sYWRkICE9IG9hcC0+ZW5kLmNvbGFkZCkKKwkJICAgIG4gPSAxOworCisJCS8qIFdoZW4gZGVsZXRlZCBhIGNoYXIgaW4gdGhlIGxpbmUsIHJlc2V0IGNvbGFkZC4gKi8KKwkJaWYgKGdjaGFyX2N1cnNvcigpICE9IE5VTCkKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKwkgICAgfQorI2VuZGlmCisJICAgICh2b2lkKWRlbF9ieXRlcygobG9uZyluLCByZXN0YXJ0X2VkaXQgPT0gTlVMICYmICF2aXJ0dWFsX29wKTsKKwl9CisJZWxzZQkJCQkvKiBkZWxldGUgY2hhcmFjdGVycyBiZXR3ZWVuIGxpbmVzICovCisJeworCSAgICBwb3NfVCAgIGN1cnBvczsKKworCSAgICAvKiBzYXZlIGRlbGV0ZWQgYW5kIGNoYW5nZWQgbGluZXMgZm9yIHVuZG8gKi8KKwkgICAgaWYgKHVfc2F2ZSgobGluZW5yX1QpKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEpLAorCQkgKGxpbmVucl9UKShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyBvYXAtPmxpbmVfY291bnQpKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKworCSAgICB0cnVuY2F0ZV9saW5lKFRSVUUpOwkvKiBkZWxldGUgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUgKi8KKworCSAgICBjdXJwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiByZW1lbWJlciBjdXJ3aW4tPndfY3Vyc29yICovCisJICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworCSAgICBkZWxfbGluZXMoKGxvbmcpKG9hcC0+bGluZV9jb3VudCAtIDIpLCBGQUxTRSk7CisKKwkgICAgLyogZGVsZXRlIGZyb20gc3RhcnQgb2YgbGluZSB1bnRpbCBvcF9lbmQgKi8KKwkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCSAgICAodm9pZClkZWxfYnl0ZXMoKGxvbmcpKG9hcC0+ZW5kLmNvbCArIDEgLSAhb2FwLT5pbmNsdXNpdmUpLAorCQkJCSAgICByZXN0YXJ0X2VkaXQgPT0gTlVMICYmICF2aXJ0dWFsX29wKTsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cnBvczsJCS8qIHJlc3RvcmUgY3Vyd2luLT53X2N1cnNvciAqLworCisJICAgICh2b2lkKWRvX2pvaW4oRkFMU0UpOworCX0KKyAgICB9CisKKyAgICBtc2dtb3JlKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gb2xkX2xjb3VudCk7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChvYXAtPmJsb2NrX21vZGUpCisgICAgeworCWN1cmJ1Zi0+Yl9vcF9lbmQubG51bSA9IG9hcC0+ZW5kLmxudW07CisJY3VyYnVmLT5iX29wX2VuZC5jb2wgPSBvYXAtPnN0YXJ0LmNvbDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJY3VyYnVmLT5iX29wX2VuZCA9IG9hcC0+c3RhcnQ7CisgICAgY3VyYnVmLT5iX29wX3N0YXJ0ID0gb2FwLT5zdGFydDsKKworICAgIHJldHVybiBPSzsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qCisgKiBBZGp1c3QgZW5kIG9mIG9wZXJhdGluZyBhcmVhIGZvciBlbmRpbmcgb24gYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci4KKyAqIFVzZWQgZm9yIGRlbGV0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK21iX2FkanVzdF9vcGVuZChvYXApCisgICAgb3BhcmdfVAkqb2FwOworeworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChvYXAtPmluY2x1c2l2ZSkKKyAgICB7CisJcCA9IG1sX2dldChvYXAtPmVuZC5sbnVtKTsKKwlvYXAtPmVuZC5jb2wgKz0gbWJfdGFpbF9vZmYocCwgcCArIG9hcC0+ZW5kLmNvbCk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfVklTVUFMRVhUUkEpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmVwbGFjZSBhIHdob2xlIGFyZWEgd2l0aCBvbmUgY2hhcmFjdGVyLgorICovCisgICAgaW50CitvcF9yZXBsYWNlKG9hcCwgYykKKyAgICBvcGFyZ19UICAgKm9hcDsKKyAgICBpbnQJCWM7Cit7CisgICAgaW50CQkJbiwgbnVtYzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQkJbnVtX2NoYXJzOworI2VuZGlmCisgICAgY2hhcl91CQkqbmV3cCwgKm9sZHA7CisgICAgc2l6ZV90CQlvbGRsZW47CisgICAgc3RydWN0IGJsb2NrX2RlZgliZDsKKworICAgIGlmICgoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkgKSB8fCBvYXAtPmVtcHR5KQorCXJldHVybiBPSzsJICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoaGFzX21ieXRlKQorCW1iX2FkanVzdF9vcGVuZChvYXApOworI2VuZGlmCisKKyAgICBpZiAodV9zYXZlKChsaW5lbnJfVCkob2FwLT5zdGFydC5sbnVtIC0gMSksCisJCQkJICAgICAgIChsaW5lbnJfVCkob2FwLT5lbmQubG51bSArIDEpKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBibG9jayBtb2RlIHJlcGxhY2UKKyAgICAgKi8KKyAgICBpZiAob2FwLT5ibG9ja19tb2RlKQorICAgIHsKKwliZC5pc19NQVggPSAoY3Vyd2luLT53X2N1cnN3YW50ID09IE1BWENPTCk7CisJZm9yICggOyBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPD0gb2FwLT5lbmQubG51bTsgKytjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJeworCSAgICBibG9ja19wcmVwKG9hcCwgJmJkLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIFRSVUUpOworCSAgICBpZiAoYmQudGV4dGxlbiA9PSAwICYmICghdmlydHVhbF9vcCB8fCBiZC5pc19NQVgpKQorCQljb250aW51ZTsJICAgIC8qIG5vdGhpbmcgdG8gcmVwbGFjZSAqLworCisJICAgIC8qIG4gPT0gbnVtYmVyIG9mIGV4dHJhIGNoYXJzIHJlcXVpcmVkCisJICAgICAqIElmIHdlIHNwbGl0IGEgVEFCLCBpdCBtYXkgYmUgcmVwbGFjZWQgYnkgc2V2ZXJhbCBjaGFyYWN0ZXJzLgorCSAgICAgKiBUaHVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBtYXkgaW5jcmVhc2UhCisJICAgICAqLworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgLyogSWYgdGhlIHJhbmdlIHN0YXJ0cyBpbiB2aXJ0dWFsIHNwYWNlLCBjb3VudCB0aGUgaW5pdGlhbAorCSAgICAgKiBjb2xhZGQgb2Zmc2V0IGFzIHBhcnQgb2YgInN0YXJ0c3BhY2VzIiAqLworCSAgICBpZiAodmlydHVhbF9vcCAmJiBiZC5pc19zaG9ydCAmJiAqYmQudGV4dHN0YXJ0ID09IE5VTCkKKwkgICAgeworCQlwb3NfVCB2cG9zOworCisJCWdldHZwb3MoJnZwb3MsIG9hcC0+c3RhcnRfdmNvbCk7CisJCWJkLnN0YXJ0c3BhY2VzICs9IHZwb3MuY29sYWRkOworCQluID0gYmQuc3RhcnRzcGFjZXM7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCS8qIGFsbG93IGZvciBwcmUgc3BhY2VzICovCisJCW4gPSAoYmQuc3RhcnRzcGFjZXMgPyBiZC5zdGFydF9jaGFyX3Zjb2xzIC0gMSA6IDApOworCisJICAgIC8qIGFsbG93IGZvciBwb3N0IHNwcCAqLworCSAgICBuICs9IChiZC5lbmRzcGFjZXMKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCSAgICAmJiAhYmQuaXNfb25lQ2hhcgorI2VuZGlmCisJCSAgICAmJiBiZC5lbmRfY2hhcl92Y29scyA+IDApID8gYmQuZW5kX2NoYXJfdmNvbHMgLSAxIDogMDsKKwkgICAgLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIHJlcGxhY2UuICovCisJICAgIG51bWMgPSBvYXAtPmVuZF92Y29sIC0gb2FwLT5zdGFydF92Y29sICsgMTsKKwkgICAgaWYgKGJkLmlzX3Nob3J0ICYmICghdmlydHVhbF9vcCB8fCBiZC5pc19NQVgpKQorCQludW1jIC09IChvYXAtPmVuZF92Y29sIC0gYmQuZW5kX3Zjb2wpICsgMTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgLyogQSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIgY2FuIGJlIHJlcGxhY2VkIG9ubHkgdXAgdG8gaGFsZiB0aGUKKwkgICAgICogdGltZXMuICovCisJICAgIGlmICgoKm1iX2NoYXIyY2VsbHMpKGMpID4gMSkKKwkgICAgeworCQlpZiAoKG51bWMgJiAxKSAmJiAhYmQuaXNfc2hvcnQpCisJCXsKKwkJICAgICsrYmQuZW5kc3BhY2VzOworCQkgICAgKytuOworCQl9CisJCW51bWMgPSBudW1jIC8gMjsKKwkgICAgfQorCisJICAgIC8qIENvbXB1dGUgYnl0ZXMgbmVlZGVkLCBtb3ZlIGNoYXJhY3RlciBjb3VudCB0byBudW1fY2hhcnMuICovCisJICAgIG51bV9jaGFycyA9IG51bWM7CisJICAgIG51bWMgKj0gKCptYl9jaGFyMmxlbikoYyk7CisjZW5kaWYKKwkgICAgLyogb2xkbGVuIGluY2x1ZGVzIHRleHRsZW4sIHNvIGRvbid0IGRvdWJsZSBjb3VudCAqLworCSAgICBuICs9IG51bWMgLSBiZC50ZXh0bGVuOworCisJICAgIG9sZHAgPSBtbF9nZXRfY3VybGluZSgpOworCSAgICBvbGRsZW4gPSBTVFJMRU4ob2xkcCk7CisJICAgIG5ld3AgPSBhbGxvY19jaGVjaygodW5zaWduZWQpb2xkbGVuICsgMSArIG4pOworCSAgICBpZiAobmV3cCA9PSBOVUxMKQorCQljb250aW51ZTsKKwkgICAgdmltX21lbXNldChuZXdwLCBOVUwsIChzaXplX3QpKG9sZGxlbiArIDEgKyBuKSk7CisJICAgIC8qIGNvcHkgdXAgdG8gZGVsZXRlZCBwYXJ0ICovCisJICAgIG1jaF9tZW1tb3ZlKG5ld3AsIG9sZHAsIChzaXplX3QpYmQudGV4dGNvbCk7CisJICAgIG9sZHAgKz0gYmQudGV4dGNvbCArIGJkLnRleHRsZW47CisJICAgIC8qIGluc2VydCBwcmUtc3BhY2VzICovCisJICAgIGNvcHlfc3BhY2VzKG5ld3AgKyBiZC50ZXh0Y29sLCAoc2l6ZV90KWJkLnN0YXJ0c3BhY2VzKTsKKwkgICAgLyogaW5zZXJ0IHJlcGxhY2VtZW50IGNoYXJzIENIRUNLIEZPUiBBTExPQ0FURUQgU1BBQ0UgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJbiA9IFNUUkxFTihuZXdwKTsKKwkJd2hpbGUgKC0tbnVtX2NoYXJzID49IDApCisJCSAgICBuICs9ICgqbWJfY2hhcjJieXRlcykoYywgbmV3cCArIG4pOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQljb3B5X2NoYXJzKG5ld3AgKyBTVFJMRU4obmV3cCksIChzaXplX3QpbnVtYywgYyk7CisJICAgIGlmICghYmQuaXNfc2hvcnQpCisJICAgIHsKKwkJLyogaW5zZXJ0IHBvc3Qtc3BhY2VzICovCisJCWNvcHlfc3BhY2VzKG5ld3AgKyBTVFJMRU4obmV3cCksIChzaXplX3QpYmQuZW5kc3BhY2VzKTsKKwkJLyogY29weSB0aGUgcGFydCBhZnRlciB0aGUgY2hhbmdlZCBwYXJ0ICovCisJCW1jaF9tZW1tb3ZlKG5ld3AgKyBTVFJMRU4obmV3cCksIG9sZHAsIFNUUkxFTihvbGRwKSArIDEpOworCSAgICB9CisJICAgIC8qIHJlcGxhY2UgdGhlIGxpbmUgKi8KKwkgICAgbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG5ld3AsIEZBTFNFKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBNQ0hBUiBhbmQgTUxJTkUgbW90aW9uIHJlcGxhY2UuCisJICovCisJaWYgKG9hcC0+bW90aW9uX3R5cGUgPT0gTUxJTkUpCisJeworCSAgICBvYXAtPnN0YXJ0LmNvbCA9IDA7CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwkgICAgb2FwLT5lbmQuY29sID0gKGNvbG5yX1QpU1RSTEVOKG1sX2dldChvYXAtPmVuZC5sbnVtKSk7CisJICAgIGlmIChvYXAtPmVuZC5jb2wpCisJCS0tb2FwLT5lbmQuY29sOworCX0KKwllbHNlIGlmICghb2FwLT5pbmNsdXNpdmUpCisJICAgIGRlYygmKG9hcC0+ZW5kKSk7CisKKwl3aGlsZSAobHRvcmVxKGN1cndpbi0+d19jdXJzb3IsIG9hcC0+ZW5kKSkKKwl7CisJICAgIG4gPSBnY2hhcl9jdXJzb3IoKTsKKwkgICAgaWYgKG4gIT0gTlVMKQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoKCptYl9jaGFyMmxlbikoYykgPiAxIHx8ICgqbWJfY2hhcjJsZW4pKG4pID4gMSkKKwkJeworCQkgICAgLyogVGhpcyBpcyBzbG93LCBidXQgaXQgaGFuZGxlcyByZXBsYWNpbmcgYSBzaW5nbGUtYnl0ZQorCQkgICAgICogd2l0aCBhIG11bHRpLWJ5dGUgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLiAqLworCQkgICAgb2FwLT5lbmQuY29sICs9ICgqbWJfY2hhcjJsZW4pKGMpIC0gKCptYl9jaGFyMmxlbikobik7CisJCSAgICBuID0gU3RhdGU7CisJCSAgICBTdGF0ZSA9IFJFUExBQ0U7CisJCSAgICBpbnNfY2hhcihjKTsKKwkJICAgIFN0YXRlID0gbjsKKwkJICAgIC8qIEJhY2t1cCB0byB0aGUgcmVwbGFjZWQgY2hhcmFjdGVyLiAqLworCQkgICAgZGVjX2N1cnNvcigpOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkgICAgaWYgKG4gPT0gVEFCKQorCQkgICAgeworCQkJaW50IGVuZF92Y29sID0gMDsKKworCQkJaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBvYXAtPmVuZC5sbnVtKQorCQkJeworCQkJICAgIC8qIG9hcC0+ZW5kIGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgd2hlbgorCQkJICAgICAqIHRoZSB0YWIgYnJlYWtzICovCisJCQkgICAgZW5kX3Zjb2wgPSBnZXR2aXNjb2wyKG9hcC0+ZW5kLmNvbCwKKwkJCQkJCQkgICAgIG9hcC0+ZW5kLmNvbGFkZCk7CisJCQl9CisJCQljb2xhZHZhbmNlX2ZvcmNlKGdldHZpc2NvbCgpKTsKKwkJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gb2FwLT5lbmQubG51bSkKKwkJCSAgICBnZXR2cG9zKCZvYXAtPmVuZCwgZW5kX3Zjb2wpOworCQkgICAgfQorI2VuZGlmCisJCSAgICBwY2hhcihjdXJ3aW4tPndfY3Vyc29yLCBjKTsKKwkJfQorCSAgICB9CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBlbHNlIGlmICh2aXJ0dWFsX29wICYmIGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBvYXAtPmVuZC5sbnVtKQorCSAgICB7CisJCWludCB2aXJ0Y29scyA9IG9hcC0+ZW5kLmNvbGFkZDsKKworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID09IG9hcC0+c3RhcnQubG51bQorCQkJJiYgb2FwLT5zdGFydC5jb2wgPT0gb2FwLT5lbmQuY29sICYmIG9hcC0+c3RhcnQuY29sYWRkKQorCQkgICAgdmlydGNvbHMgLT0gb2FwLT5zdGFydC5jb2xhZGQ7CisKKwkJLyogb2FwLT5lbmQgaGFzIGJlZW4gdHJpbW1lZCBzbyBpdCdzIGVmZmVjdGl2ZWx5IGluY2x1c2l2ZTsKKwkJICogYXMgYSByZXN1bHQgYW4gZXh0cmEgKzEgbXVzdCBiZSBjb3VudGVkIHNvIHdlIGRvbid0CisJCSAqIHRyYW1wbGUgdGhlIE5VTCBieXRlLiAqLworCQljb2xhZHZhbmNlX2ZvcmNlKGdldHZpc2NvbDIob2FwLT5lbmQuY29sLCBvYXAtPmVuZC5jb2xhZGQpICsgMSk7CisJCWN1cndpbi0+d19jdXJzb3IuY29sIC09ICh2aXJ0Y29scyArIDEpOworCQlmb3IgKDsgdmlydGNvbHMgPj0gMDsgdmlydGNvbHMtLSkKKwkJeworCQkgICAgcGNoYXIoY3Vyd2luLT53X2N1cnNvciwgYyk7CisJCSAgICBpZiAoaW5jKCZjdXJ3aW4tPndfY3Vyc29yKSA9PSAtMSkKKwkJCWJyZWFrOworCQl9CisJICAgIH0KKyNlbmRpZgorCisJICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBjaGFyYWN0ZXIsIHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gKi8KKwkgICAgaWYgKGluY19jdXJzb3IoKSA9PSAtMSkKKwkJYnJlYWs7CisJfQorICAgIH0KKworICAgIGN1cndpbi0+d19jdXJzb3IgPSBvYXAtPnN0YXJ0OworICAgIGNoZWNrX2N1cnNvcigpOworICAgIGNoYW5nZWRfbGluZXMob2FwLT5zdGFydC5sbnVtLCBvYXAtPnN0YXJ0LmNvbCwgb2FwLT5lbmQubG51bSArIDEsIDBMKTsKKworICAgIC8qIFNldCAiJ1siIGFuZCAiJ10iIG1hcmtzLiAqLworICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydCA9IG9hcC0+c3RhcnQ7CisgICAgY3VyYnVmLT5iX29wX2VuZCA9IG9hcC0+ZW5kOworCisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKy8qCisgKiBIYW5kbGUgdGhlIChub24tc3RhbmRhcmQgdmkpIHRpbGRlIG9wZXJhdG9yLiAgQWxzbyBmb3IgImd1IiwgImdVIiBhbmQgImc/Ii4KKyAqLworICAgIHZvaWQKK29wX3RpbGRlKG9hcCkKKyAgICBvcGFyZ19UCSpvYXA7Cit7CisgICAgcG9zX1QJCXBvczsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIHN0cnVjdCBibG9ja19kZWYJYmQ7CisgICAgaW50CQkJZG9uZTsKKyNlbmRpZgorICAgIGludAkJCWRpZF9jaGFuZ2UgPSAwOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjb2xucl9UCQljb2w7CisjZW5kaWYKKworICAgIGlmICh1X3NhdmUoKGxpbmVucl9UKShvYXAtPnN0YXJ0LmxudW0gLSAxKSwKKwkJCQkgICAgICAgKGxpbmVucl9UKShvYXAtPmVuZC5sbnVtICsgMSkpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgcG9zID0gb2FwLT5zdGFydDsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChvYXAtPmJsb2NrX21vZGUpCQkgICAgLyogVmlzdWFsIGJsb2NrIG1vZGUgKi8KKyAgICB7CisJZm9yICg7IHBvcy5sbnVtIDw9IG9hcC0+ZW5kLmxudW07ICsrcG9zLmxudW0pCisJeworCSAgICBibG9ja19wcmVwKG9hcCwgJmJkLCBwb3MubG51bSwgRkFMU0UpOworCSAgICBwb3MuY29sID0gYmQudGV4dGNvbDsKKwkgICAgZm9yIChkb25lID0gMDsgZG9uZSA8IGJkLnRleHRsZW47ICsrZG9uZSkKKwkgICAgeworCQlkaWRfY2hhbmdlIHw9IHN3YXBjaGFyKG9hcC0+b3BfdHlwZSwgJnBvcyk7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJY29sID0gcG9zLmNvbCArIDE7CisjIGVuZGlmCisJCWlmIChpbmMoJnBvcykgPT0gLTEpCSAgICAvKiBhdCBlbmQgb2YgZmlsZSAqLworCQkgICAgYnJlYWs7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKHBvcy5jb2wgPiBjb2wpCisJCSAgICAvKiBDb3VudCBleHRyYSBieXRlcyBvZiBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLworCQkgICAgZG9uZSArPSBwb3MuY29sIC0gY29sOworIyBlbmRpZgorCSAgICB9CisjIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCSAgICBpZiAodXNpbmdOZXRiZWFucyAmJiBkaWRfY2hhbmdlKQorCSAgICB7CisJCWNoYXJfdSAqcHRyID0gbWxfZ2V0X2J1ZihjdXJidWYsIHBvcy5sbnVtLCBGQUxTRSk7CisKKwkJbmV0YmVhbnNfaW5zZXJ0ZWQoY3VyYnVmLCBwb3MubG51bSwgYmQudGV4dGNvbCwKKwkJCQkgICAgYmQudGV4dGxlbiwgJnB0cltiZC50ZXh0Y29sXSwgYmQudGV4dGxlbik7CisJICAgIH0KKyMgZW5kaWYKKwl9CisJaWYgKGRpZF9jaGFuZ2UpCisJICAgIGNoYW5nZWRfbGluZXMob2FwLT5zdGFydC5sbnVtLCAwLCBvYXAtPmVuZC5sbnVtICsgMSwgMEwpOworICAgIH0KKyAgICBlbHNlCQkJCSAgICAvKiBub3QgYmxvY2sgbW9kZSAqLworI2VuZGlmCisgICAgeworCWlmIChvYXAtPm1vdGlvbl90eXBlID09IE1MSU5FKQorCXsKKwkgICAgb2FwLT5zdGFydC5jb2wgPSAwOworCSAgICBwb3MuY29sID0gMDsKKwkgICAgb2FwLT5lbmQuY29sID0gKGNvbG5yX1QpU1RSTEVOKG1sX2dldChvYXAtPmVuZC5sbnVtKSk7CisJICAgIGlmIChvYXAtPmVuZC5jb2wpCisJCS0tb2FwLT5lbmQuY29sOworCX0KKwllbHNlIGlmICghb2FwLT5pbmNsdXNpdmUpCisJICAgIGRlYygmKG9hcC0+ZW5kKSk7CisKKwl3aGlsZSAobHRvcmVxKHBvcywgb2FwLT5lbmQpKQorCXsKKwkgICAgZGlkX2NoYW5nZSB8PSBzd2FwY2hhcihvYXAtPm9wX3R5cGUsICZwb3MpOworCSAgICBpZiAoaW5jKCZwb3MpID09IC0xKSAgICAvKiBhdCBlbmQgb2YgZmlsZSAqLworCQlicmVhazsKKwl9CisJaWYgKGRpZF9jaGFuZ2UpCisJeworCSAgICBjaGFuZ2VkX2xpbmVzKG9hcC0+c3RhcnQubG51bSwgb2FwLT5zdGFydC5jb2wsIG9hcC0+ZW5kLmxudW0gKyAxLAorCQkJCQkJCQkJICAwTCk7CisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJICAgIGlmICh1c2luZ05ldGJlYW5zICYmIGRpZF9jaGFuZ2UpCisJICAgIHsKKwkJY2hhcl91ICpwdHI7CisJCWludCBjb3VudDsKKworCQlwb3MgPSBvYXAtPnN0YXJ0OworCQl3aGlsZSAocG9zLmxudW0gPCBvYXAtPmVuZC5sbnVtKQorCQl7CisJCSAgICBwdHIgPSBtbF9nZXRfYnVmKGN1cmJ1ZiwgcG9zLmxudW0sIEZBTFNFKTsKKwkJICAgIGNvdW50ID0gU1RSTEVOKHB0cikgLSBwb3MuY29sOworCQkgICAgbmV0YmVhbnNfaW5zZXJ0ZWQoY3VyYnVmLCBwb3MubG51bSwgcG9zLmNvbCwKKwkJCQkJCSBjb3VudCwgJnB0cltwb3MuY29sXSwgY291bnQpOworCQkgICAgcG9zLmNvbCA9IDA7CisJCSAgICBwb3MubG51bSsrOworCQl9CisJCXB0ciA9IG1sX2dldF9idWYoY3VyYnVmLCBwb3MubG51bSwgRkFMU0UpOworCQljb3VudCA9IG9hcC0+ZW5kLmNvbCAtIHBvcy5jb2wgKyAxOworCQluZXRiZWFuc19pbnNlcnRlZChjdXJidWYsIHBvcy5sbnVtLCBwb3MuY29sLAorCQkJCQkJIGNvdW50LCAmcHRyW3Bvcy5jb2xdLCBjb3VudCk7CisJICAgIH0KKyNlbmRpZgorCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmICghZGlkX2NoYW5nZSAmJiBvYXAtPmlzX1ZJc3VhbCkKKwkvKiBObyBjaGFuZ2U6IG5lZWQgdG8gcmVtb3ZlIHRoZSBWaXN1YWwgc2VsZWN0aW9uICovCisJcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogU2V0ICdbIGFuZCAnXSBtYXJrcy4KKyAgICAgKi8KKyAgICBjdXJidWYtPmJfb3Bfc3RhcnQgPSBvYXAtPnN0YXJ0OworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQgPSBvYXAtPmVuZDsKKworICAgIGlmIChvYXAtPmxpbmVfY291bnQgPiBwX3JlcG9ydCkKKyAgICB7CisJaWYgKG9hcC0+bGluZV9jb3VudCA9PSAxKQorCSAgICBNU0coXygiMSBsaW5lIGNoYW5nZWQiKSk7CisJZWxzZQorCSAgICBzbXNnKChjaGFyX3UgKilfKCIlbGQgbGluZXMgY2hhbmdlZCIpLCBvYXAtPmxpbmVfY291bnQpOworICAgIH0KK30KKworLyoKKyAqIElmIG9wX3R5cGUgPT0gT1BfVVBQRVI6IG1ha2UgdXBwZXJjYXNlLAorICogaWYgb3BfdHlwZSA9PSBPUF9MT1dFUjogbWFrZSBsb3dlcmNhc2UsCisgKiBpZiBvcF90eXBlID09IE9QX1JPVDEzOiBkbyByb3QxMyBlbmNvZGluZywKKyAqIGVsc2Ugc3dhcCBjYXNlIG9mIGNoYXJhY3RlciBhdCAncG9zJworICogcmV0dXJucyBUUlVFIHdoZW4gc29tZXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQuCisgKi8KKyAgICBpbnQKK3N3YXBjaGFyKG9wX3R5cGUsIHBvcykKKyAgICBpbnQJICAgIG9wX3R5cGU7CisgICAgcG9zX1QgICAgKnBvczsKK3sKKyAgICBpbnQJICAgIGM7CisgICAgaW50CSAgICBuYzsKKworICAgIGMgPSBnY2hhcl9wb3MocG9zKTsKKworICAgIC8qIE9ubHkgZG8gcm90MTMgZW5jb2RpbmcgZm9yIEFTQ0lJIGNoYXJhY3RlcnMuICovCisgICAgaWYgKGMgPj0gMHg4MCAmJiBvcF90eXBlID09IE9QX1JPVDEzKQorCXJldHVybiBGQUxTRTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBjID49IDB4MTAwKQkvKiBObyBsb3dlci91cHBlcmNhc2UgbGV0dGVyICovCisJcmV0dXJuIEZBTFNFOworI2VuZGlmCisgICAgbmMgPSBjOworICAgIGlmIChNQl9JU0xPV0VSKGMpKQorICAgIHsKKwlpZiAob3BfdHlwZSA9PSBPUF9ST1QxMykKKwkgICAgbmMgPSBST1QxMyhjLCAnYScpOworCWVsc2UgaWYgKG9wX3R5cGUgIT0gT1BfTE9XRVIpCisJICAgIG5jID0gTUJfVE9VUFBFUihjKTsKKyAgICB9CisgICAgZWxzZSBpZiAoTUJfSVNVUFBFUihjKSkKKyAgICB7CisJaWYgKG9wX3R5cGUgPT0gT1BfUk9UMTMpCisJICAgIG5jID0gUk9UMTMoYywgJ0EnKTsKKwllbHNlIGlmIChvcF90eXBlICE9IE9QX1VQUEVSKQorCSAgICBuYyA9IE1CX1RPTE9XRVIoYyk7CisgICAgfQorICAgIGlmIChuYyAhPSBjKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4ICYmIChjID49IDB4ODAgfHwgbmMgPj0gMHg4MCkpCisJeworCSAgICBwb3NfVCAgIHNwID0gY3Vyd2luLT53X2N1cnNvcjsKKworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gKnBvczsKKwkgICAgZGVsX2NoYXIoRkFMU0UpOworCSAgICBpbnNfY2hhcihuYyk7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBzcDsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIHBjaGFyKCpwb3MsIG5jKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWYgZGVmaW5lZChGRUFUX1ZJU1VBTEVYVFJBKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIG9wX2luc2VydCAtIEluc2VydCBhbmQgYXBwZW5kIG9wZXJhdG9ycyBmb3IgVmlzdWFsIG1vZGUuCisgKi8KKyAgICB2b2lkCitvcF9pbnNlcnQob2FwLCBjb3VudDEpCisgICAgb3BhcmdfVAkqb2FwOworICAgIGxvbmcJY291bnQxOworeworICAgIGxvbmcJCWluc19sZW4sIHByZV90ZXh0bGVuID0gMDsKKyAgICBjaGFyX3UJCSpmaXJzdGxpbmUsICppbnNfdGV4dDsKKyAgICBzdHJ1Y3QgYmxvY2tfZGVmCWJkOworICAgIGludAkJCWk7CisKKyAgICAvKiBlZGl0KCkgY2hhbmdlcyB0aGlzIC0gcmVjb3JkIGl0IGZvciBPUF9BUFBFTkQgKi8KKyAgICBiZC5pc19NQVggPSAoY3Vyd2luLT53X2N1cnN3YW50ID09IE1BWENPTCk7CisKKyAgICAvKiB2aXMgYmxvY2sgaXMgc3RpbGwgbWFya2VkLiBHZXQgcmlkIG9mIGl0IG5vdy4gKi8KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBvYXAtPnN0YXJ0LmxudW07CisgICAgdXBkYXRlX3NjcmVlbihJTlZFUlRFRCk7CisKKyAgICBpZiAob2FwLT5ibG9ja19tb2RlKQorICAgIHsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJLyogV2hlbiAndmlydHVhbGVkaXQnIGlzIHVzZWQsIG5lZWQgdG8gaW5zZXJ0IHRoZSBleHRyYSBzcGFjZXMgYmVmb3JlCisJICogZG9pbmcgYmxvY2tfcHJlcCgpLiAgV2hlbiBvbmx5ICJibG9jayIgaXMgdXNlZCwgdmlydHVhbCBlZGl0IGlzCisJICogYWxyZWFkeSBkaXNhYmxlZCwgYnV0IHN0aWxsIG5lZWQgaXQgd2hlbiBjYWxsaW5nCisJICogY29sYWR2YW5jZV9mb3JjZSgpLiAqLworCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDApCisJeworCSAgICBpbnQJCW9sZF92ZV9mbGFncyA9IHZlX2ZsYWdzOworCisJICAgIHZlX2ZsYWdzID0gVkVfQUxMOworCSAgICBpZiAodV9zYXZlX2N1cnNvcigpID09IEZBSUwpCisJCXJldHVybjsKKwkgICAgY29sYWR2YW5jZV9mb3JjZShvYXAtPm9wX3R5cGUgPT0gT1BfQVBQRU5ECisJCQkJCSAgID8gb2FwLT5lbmRfdmNvbCArIDEgOiBnZXR2aXNjb2woKSk7CisJICAgIGlmIChvYXAtPm9wX3R5cGUgPT0gT1BfQVBQRU5EKQorCQktLWN1cndpbi0+d19jdXJzb3IuY29sOworCSAgICB2ZV9mbGFncyA9IG9sZF92ZV9mbGFnczsKKwl9CisjZW5kaWYKKwkvKiBHZXQgdGhlIGluZm8gYWJvdXQgdGhlIGJsb2NrIGJlZm9yZSBlbnRlcmluZyB0aGUgdGV4dCAqLworCWJsb2NrX3ByZXAob2FwLCAmYmQsIG9hcC0+c3RhcnQubG51bSwgVFJVRSk7CisJZmlyc3RsaW5lID0gbWxfZ2V0KG9hcC0+c3RhcnQubG51bSkgKyBiZC50ZXh0Y29sOworCWlmIChvYXAtPm9wX3R5cGUgPT0gT1BfQVBQRU5EKQorCSAgICBmaXJzdGxpbmUgKz0gYmQudGV4dGxlbjsKKwlwcmVfdGV4dGxlbiA9IChsb25nKVNUUkxFTihmaXJzdGxpbmUpOworICAgIH0KKworICAgIGlmIChvYXAtPm9wX3R5cGUgPT0gT1BfQVBQRU5EKQorICAgIHsKKwlpZiAob2FwLT5ibG9ja19tb2RlCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9PSAwCisjZW5kaWYKKwkgICApCisJeworCSAgICAvKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGNoYXJhY3RlciByaWdodCBvZiB0aGUgYmxvY2suICovCisJICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCSAgICB3aGlsZSAoKm1sX2dldF9jdXJzb3IoKSAhPSBOVUwKKwkJICAgICYmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA8IGJkLnRleHRjb2wgKyBiZC50ZXh0bGVuKSkKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgaWYgKGJkLmlzX3Nob3J0ICYmICFiZC5pc19NQVgpCisJICAgIHsKKwkJLyogRmlyc3QgbGluZSB3YXMgdG9vIHNob3J0LCBtYWtlIGl0IGxvbmdlciBhbmQgYWRqdXN0IHRoZQorCQkgKiB2YWx1ZXMgaW4gImJkIi4gKi8KKwkJaWYgKHVfc2F2ZV9jdXJzb3IoKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuOworCQlmb3IgKGkgPSAwOyBpIDwgYmQuZW5kc3BhY2VzOyArK2kpCisJCSAgICBpbnNfY2hhcignICcpOworCQliZC50ZXh0bGVuICs9IGJkLmVuZHNwYWNlczsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gb2FwLT5lbmQ7CisKKwkgICAgLyogV29ya3MganVzdCBsaWtlIGFuICdpJ25zZXJ0IG9uIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KKwkgICAgaWYgKCFsaW5lZW1wdHkoY3Vyd2luLT53X2N1cnNvci5sbnVtKQorCQkgICAgJiYgb2FwLT5zdGFydF92Y29sICE9IG9hcC0+ZW5kX3Zjb2wpCisJCWluY19jdXJzb3IoKTsKKwl9CisgICAgfQorCisgICAgZWRpdChOVUwsIEZBTFNFLCAobGluZW5yX1QpY291bnQxKTsKKworICAgIC8qIGlmIHVzZXIgaGFzIG1vdmVkIG9mZiB0aGlzIGxpbmUsIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbywgc28gZG8KKyAgICAgKiBub3RoaW5nICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSAhPSBvYXAtPnN0YXJ0LmxudW0pCisJcmV0dXJuOworCisgICAgaWYgKG9hcC0+YmxvY2tfbW9kZSkKKyAgICB7CisJc3RydWN0IGJsb2NrX2RlZgliZDI7CisKKwkvKgorCSAqIFNwYWNlcyBhbmQgdGFicyBpbiB0aGUgaW5kZW50IG1heSBoYXZlIGNoYW5nZWQgdG8gb3RoZXIgc3BhY2VzIGFuZAorCSAqIHRhYnMuICBHZXQgdGhlIHN0YXJ0aW5nIGNvbHVtbiBhZ2FpbiBhbmQgY29ycmVjdCB0aGUgbGVuZ2h0LgorCSAqIERvbid0IGRvIHRoaXMgd2hlbiAiJCIgdXNlZCwgZW5kLW9mLWxpbmUgd2lsbCBoYXZlIGNoYW5nZWQuCisJICovCisJYmxvY2tfcHJlcChvYXAsICZiZDIsIG9hcC0+c3RhcnQubG51bSwgVFJVRSk7CisJaWYgKCFiZC5pc19NQVggfHwgYmQyLnRleHRsZW4gPCBiZC50ZXh0bGVuKQorCXsKKwkgICAgaWYgKG9hcC0+b3BfdHlwZSA9PSBPUF9BUFBFTkQpCisJICAgIHsKKwkJcHJlX3RleHRsZW4gKz0gYmQyLnRleHRsZW4gLSBiZC50ZXh0bGVuOworCQlpZiAoYmQyLmVuZHNwYWNlcykKKwkJICAgIC0tYmQyLnRleHRsZW47CisJICAgIH0KKwkgICAgYmQudGV4dGNvbCA9IGJkMi50ZXh0Y29sOworCSAgICBiZC50ZXh0bGVuID0gYmQyLnRleHRsZW47CisJfQorCisJLyoKKwkgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIG1sX2dldCgpIGZsdXNoIHRoZSBmaXJzdGxpbmUgZGF0YSAtIHRha2UgYQorCSAqIGNvcHkgb2YgdGhlIHJlcXVpcmVkIHN0cmluZy4KKwkgKi8KKwlmaXJzdGxpbmUgPSBtbF9nZXQob2FwLT5zdGFydC5sbnVtKSArIGJkLnRleHRjb2w7CisJaWYgKG9hcC0+b3BfdHlwZSA9PSBPUF9BUFBFTkQpCisJICAgIGZpcnN0bGluZSArPSBiZC50ZXh0bGVuOworCWlmICgoaW5zX2xlbiA9IChsb25nKVNUUkxFTihmaXJzdGxpbmUpIC0gcHJlX3RleHRsZW4pID4gMCkKKwl7CisJICAgIGluc190ZXh0ID0gdmltX3N0cm5zYXZlKGZpcnN0bGluZSwgKGludClpbnNfbGVuKTsKKwkgICAgaWYgKGluc190ZXh0ICE9IE5VTEwpCisJICAgIHsKKwkJLyogYmxvY2sgaGFuZGxlZCBoZXJlICovCisJCWlmICh1X3NhdmUob2FwLT5zdGFydC5sbnVtLAorCQkJCQkgKGxpbmVucl9UKShvYXAtPmVuZC5sbnVtICsgMSkpID09IE9LKQorCQkgICAgYmxvY2tfaW5zZXJ0KG9hcCwgaW5zX3RleHQsIChvYXAtPm9wX3R5cGUgPT0gT1BfSU5TRVJUKSwKKwkJCQkJCQkJCSAmYmQpOworCisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gb2FwLT5zdGFydC5jb2w7CisJCWNoZWNrX2N1cnNvcigpOworCQl2aW1fZnJlZShpbnNfdGV4dCk7CisJICAgIH0KKwl9CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBvcF9jaGFuZ2UgLSBoYW5kbGUgYSBjaGFuZ2Ugb3BlcmF0aW9uCisgKgorICogcmV0dXJuIFRSVUUgaWYgZWRpdCgpIHJldHVybnMgYmVjYXVzZSBvZiBhIENUUkwtTyBjb21tYW5kCisgKi8KKyAgICBpbnQKK29wX2NoYW5nZShvYXApCisgICAgb3BhcmdfVAkqb2FwOworeworICAgIGNvbG5yX1QJCWw7CisgICAgaW50CQkJcmV0dmFsOworI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKyAgICBsb25nCQlvZmZzZXQ7CisgICAgbGluZW5yX1QJCWxpbmVucjsKKyAgICBsb25nCQlpbnNfbGVuLCBwcmVfdGV4dGxlbiA9IDA7CisgICAgY2hhcl91CQkqZmlyc3RsaW5lOworICAgIGNoYXJfdQkJKmluc190ZXh0LCAqbmV3cCwgKm9sZHA7CisgICAgc3RydWN0IGJsb2NrX2RlZgliZDsKKyNlbmRpZgorCisgICAgbCA9IG9hcC0+c3RhcnQuY29sOworICAgIGlmIChvYXAtPm1vdGlvbl90eXBlID09IE1MSU5FKQorICAgIHsKKwlsID0gMDsKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisJaWYgKCFwX3Bhc3RlICYmIGN1cmJ1Zi0+Yl9wX3NpCisjIGlmZGVmIEZFQVRfQ0lOREVOVAorCQkmJiAhY3VyYnVmLT5iX3BfY2luCisjIGVuZGlmCisJCSkKKwkgICAgY2FuX3NpID0gVFJVRTsJLyogSXQncyBsaWtlIG9wZW5pbmcgYSBuZXcgbGluZSwgZG8gc2kgKi8KKyNlbmRpZgorICAgIH0KKworICAgIC8qIEZpcnN0IGRlbGV0ZSB0aGUgdGV4dCBpbiB0aGUgcmVnaW9uLiAgSW4gYW4gZW1wdHkgYnVmZmVyIG9ubHkgbmVlZCB0bworICAgICAqIHNhdmUgZm9yIHVuZG8gKi8KKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpCisgICAgeworCWlmICh1X3NhdmVfY3Vyc29yKCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlIGlmIChvcF9kZWxldGUob2FwKSA9PSBGQUlMKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmICgobCA+IGN1cndpbi0+d19jdXJzb3IuY29sKSAmJiAhbGluZWVtcHR5KGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkJCQkJCQkgJiYgIXZpcnR1YWxfb3ApCisJaW5jX2N1cnNvcigpOworCisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorICAgIC8qIGNoZWNrIGZvciBzdGlsbCBvbiBzYW1lIGxpbmUgKDxDUj4gaW4gaW5zZXJ0ZWQgdGV4dCBtZWFuaW5nbGVzcykgKi8KKyAgICAvKiBza2lwIGJsYW5rIGxpbmVzIHRvbyAqLworICAgIGlmIChvYXAtPmJsb2NrX21vZGUpCisgICAgeworIyBpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJLyogQWRkIHNwYWNlcyBiZWZvcmUgZ2V0dGluZyB0aGUgY3VycmVudCBsaW5lIGxlbmd0aC4gKi8KKwlpZiAodmlydHVhbF9vcCAmJiAoY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPiAwCisJCQkJCQkgICAgfHwgZ2NoYXJfY3Vyc29yKCkgPT0gTlVMKSkKKwkgICAgY29sYWR2YW5jZV9mb3JjZShnZXR2aXNjb2woKSk7CisjIGVuZGlmCisJcHJlX3RleHRsZW4gPSAobG9uZylTVFJMRU4obWxfZ2V0KG9hcC0+c3RhcnQubG51bSkpOworCWJkLnRleHRjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9MSVNQKSB8fCBkZWZpbmVkKEZFQVRfQ0lOREVOVCkKKyAgICBpZiAob2FwLT5tb3Rpb25fdHlwZSA9PSBNTElORSkKKwlmaXhfaW5kZW50KCk7CisjZW5kaWYKKworICAgIHJldHZhbCA9IGVkaXQoTlVMLCBGQUxTRSwgKGxpbmVucl9UKTEpOworCisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorICAgIC8qCisgICAgICogSW4gVmlzdWFsIGJsb2NrIG1vZGUsIGhhbmRsZSBjb3B5aW5nIHRoZSBuZXh0IHRleHQgdG8gYWxsIGxpbmVzIG9mIHRoZQorICAgICAqIGJsb2NrLgorICAgICAqLworICAgIGlmIChvYXAtPmJsb2NrX21vZGUgJiYgb2FwLT5zdGFydC5sbnVtICE9IG9hcC0+ZW5kLmxudW0pCisgICAgeworCWZpcnN0bGluZSA9IG1sX2dldChvYXAtPnN0YXJ0LmxudW0pOworCS8qCisJICogU3Vic2VxdWVudCBjYWxscyB0byBtbF9nZXQoKSBmbHVzaCB0aGUgZmlyc3RsaW5lIGRhdGEgLSB0YWtlIGEKKwkgKiBjb3B5IG9mIHRoZSByZXF1aXJlZCBiaXQuCisJICovCisJaWYgKChpbnNfbGVuID0gKGxvbmcpU1RSTEVOKGZpcnN0bGluZSkgLSBwcmVfdGV4dGxlbikgPiAwKQorCXsKKwkgICAgaWYgKChpbnNfdGV4dCA9IGFsbG9jX2NoZWNrKCh1bnNpZ25lZCkoaW5zX2xlbiArIDEpKSkgIT0gTlVMTCkKKwkgICAgeworCQlTVFJOQ1BZKGluc190ZXh0LCBmaXJzdGxpbmUgKyBiZC50ZXh0Y29sLCBpbnNfbGVuKTsKKwkJaW5zX3RleHRbaW5zX2xlbl0gPSBOVUw7CisJCWZvciAobGluZW5yID0gb2FwLT5zdGFydC5sbnVtICsgMTsgbGluZW5yIDw9IG9hcC0+ZW5kLmxudW07CisJCQkJCQkJCSAgICAgbGluZW5yKyspCisJCXsKKwkJICAgIGJsb2NrX3ByZXAob2FwLCAmYmQsIGxpbmVuciwgVFJVRSk7CisJCSAgICBpZiAoIWJkLmlzX3Nob3J0IHx8IHZpcnR1YWxfb3ApCisJCSAgICB7CisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJCXBvc19UIHZwb3M7CisKKwkJCS8qIElmIHRoZSBibG9jayBzdGFydHMgaW4gdmlydHVhbCBzcGFjZSwgY291bnQgdGhlCisJCQkgKiBpbml0aWFsIGNvbGFkZCBvZmZzZXQgYXMgcGFydCBvZiAic3RhcnRzcGFjZXMiICovCisJCQlpZiAoYmQuaXNfc2hvcnQpCisJCQl7CisJCQkgICAgbGluZW5yX1QgbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKworCQkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxpbmVucjsKKwkJCSAgICAodm9pZClnZXR2cG9zKCZ2cG9zLCBvYXAtPnN0YXJ0X3Zjb2wpOworCQkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CisJCQl9CisJCQllbHNlCisJCQkgICAgdnBvcy5jb2xhZGQgPSAwOworIyBlbmRpZgorCQkJb2xkcCA9IG1sX2dldChsaW5lbnIpOworCQkJbmV3cCA9IGFsbG9jX2NoZWNrKCh1bnNpZ25lZCkoU1RSTEVOKG9sZHApCisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJCQkJCQkrIHZwb3MuY29sYWRkCisjIGVuZGlmCisJCQkJCQkJICAgICAgKyBpbnNfbGVuICsgMSkpOworCQkJaWYgKG5ld3AgPT0gTlVMTCkKKwkJCSAgICBjb250aW51ZTsKKwkJCS8qIGNvcHkgdXAgdG8gYmxvY2sgc3RhcnQgKi8KKwkJCW1jaF9tZW1tb3ZlKG5ld3AsIG9sZHAsIChzaXplX3QpYmQudGV4dGNvbCk7CisJCQlvZmZzZXQgPSBiZC50ZXh0Y29sOworIyBpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCQljb3B5X3NwYWNlcyhuZXdwICsgb2Zmc2V0LCAoc2l6ZV90KXZwb3MuY29sYWRkKTsKKwkJCW9mZnNldCArPSB2cG9zLmNvbGFkZDsKKyMgZW5kaWYKKwkJCW1jaF9tZW1tb3ZlKG5ld3AgKyBvZmZzZXQsIGluc190ZXh0LCAoc2l6ZV90KWluc19sZW4pOworCQkJb2Zmc2V0ICs9IGluc19sZW47CisJCQlvbGRwICs9IGJkLnRleHRjb2w7CisJCQltY2hfbWVtbW92ZShuZXdwICsgb2Zmc2V0LCBvbGRwLCBTVFJMRU4ob2xkcCkgKyAxKTsKKwkJCW1sX3JlcGxhY2UobGluZW5yLCBuZXdwLCBGQUxTRSk7CisJCSAgICB9CisJCX0KKwkJY2hlY2tfY3Vyc29yKCk7CisKKwkJY2hhbmdlZF9saW5lcyhvYXAtPnN0YXJ0LmxudW0gKyAxLCAwLCBvYXAtPmVuZC5sbnVtICsgMSwgMEwpOworCSAgICB9CisJICAgIHZpbV9mcmVlKGluc190ZXh0KTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc2V0IGFsbCB0aGUgeWFuayByZWdpc3RlcnMgdG8gZW1wdHkgKGNhbGxlZCBmcm9tIG1haW4oKSkKKyAqLworICAgIHZvaWQKK2luaXRfeWFuaygpCit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUdJU1RFUlM7ICsraSkKKwl5X3JlZ3NbaV0ueV9hcnJheSA9IE5VTEw7Cit9CisKKy8qCisgKiBGcmVlICJuIiBsaW5lcyBmcm9tIHRoZSBjdXJyZW50IHlhbmsgcmVnaXN0ZXIuCisgKiBDYWxsZWQgZm9yIG5vcm1hbCBmcmVlaW5nIGFuZCBpbiBjYXNlIG9mIGVycm9yLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZyZWVfeWFuayhuKQorICAgIGxvbmcJbjsKK3sKKyAgICBpZiAoeV9jdXJyZW50LT55X2FycmF5ICE9IE5VTEwpCisgICAgeworCWxvbmcJICAgIGk7CisKKwlmb3IgKGkgPSBuOyAtLWkgPj0gMDsgKQorCXsKKyNpZmRlZiBBTUlHQQkgICAgLyogb25seSBmb3IgdmVyeSBzbG93IG1hY2hpbmVzICovCisJICAgIGlmICgoaSAmIDEwMjMpID09IDEwMjMpICAvKiB0aGlzIG1heSB0YWtlIGEgd2hpbGUgKi8KKwkgICAgeworCQkvKgorCQkgKiBUaGlzIG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGNhdXNlIGEgaGl0LXJldHVybiBtZXNzYWdlLgorCQkgKiBPdmVyd3JpdGUgdGhpcyBtZXNzYWdlIHdpdGggYW55IG5leHQgbWVzc2FnZS4KKwkJICovCisJCSsrbm9fd2FpdF9yZXR1cm47CisJCXNtc2coKGNoYXJfdSAqKV8oImZyZWVpbmcgJWxkIGxpbmVzIiksIGkgKyAxKTsKKwkJLS1ub193YWl0X3JldHVybjsKKwkJbXNnX2RpZG91dCA9IEZBTFNFOworCQltc2dfY29sID0gMDsKKwkgICAgfQorI2VuZGlmCisJICAgIHZpbV9mcmVlKHlfY3VycmVudC0+eV9hcnJheVtpXSk7CisJfQorCXZpbV9mcmVlKHlfY3VycmVudC0+eV9hcnJheSk7CisJeV9jdXJyZW50LT55X2FycmF5ID0gTlVMTDsKKyNpZmRlZiBBTUlHQQorCWlmIChuID49IDEwMDApCisJICAgIE1TRygiIik7CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZnJlZV95YW5rX2FsbCgpCit7CisgICAgZnJlZV95YW5rKHlfY3VycmVudC0+eV9zaXplKTsKK30KKworLyoKKyAqIFlhbmsgdGhlIHRleHQgYmV0d2VlbiAib2FwLT5zdGFydCIgYW5kICJvYXAtPmVuZCIgaW50byBhIHlhbmsgcmVnaXN0ZXIuCisgKiBJZiB3ZSBhcmUgdG8gYXBwZW5kICh1cHBlcmNhc2UgcmVnaXN0ZXIpLCB3ZSBmaXJzdCB5YW5rIGludG8gYSBuZXcgeWFuaworICogcmVnaXN0ZXIgYW5kIHRoZW4gY29uY2F0ZW5hdGUgdGhlIG9sZCBhbmQgdGhlIG5ldyBvbmUgKHNvIHdlIGtlZXAgdGhlIG9sZAorICogb25lIGluIGNhc2Ugb2Ygb3V0LW9mLW1lbW9yeSkuCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CitvcF95YW5rKG9hcCwgZGVsZXRpbmcsIG1lc3MpCisgICAgb3BhcmdfVCAgICpvYXA7CisgICAgaW50CSAgICBkZWxldGluZzsKKyAgICBpbnQJICAgIG1lc3M7Cit7CisgICAgbG9uZwkJeV9pZHg7CQkvKiBpbmRleCBpbiB5X2FycmF5W10gKi8KKyAgICBzdHJ1Y3QgeWFua3JlZwkqY3VycjsJCS8qIGNvcHkgb2YgeV9jdXJyZW50ICovCisgICAgc3RydWN0IHlhbmtyZWcJbmV3cmVnOwkJLyogbmV3IHlhbmsgcmVnaXN0ZXIgd2hlbiBhcHBlbmRpbmcgKi8KKyAgICBjaGFyX3UJCSoqbmV3X3B0cjsKKyAgICBsaW5lbnJfVAkJbG51bTsJCS8qIGN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyAgICBsb25nCQlqOworICAgIGludAkJCXlhbmt0eXBlID0gb2FwLT5tb3Rpb25fdHlwZTsKKyAgICBsb25nCQl5YW5rbGluZXMgPSBvYXAtPmxpbmVfY291bnQ7CisgICAgbGluZW5yX1QJCXlhbmtlbmRsbnVtID0gb2FwLT5lbmQubG51bTsKKyAgICBjaGFyX3UJCSpwOworICAgIGNoYXJfdQkJKnBuZXc7CisgICAgc3RydWN0IGJsb2NrX2RlZgliZDsKKworCQkJCSAgICAvKiBjaGVjayBmb3IgcmVhZC1vbmx5IHJlZ2lzdGVyICovCisgICAgaWYgKG9hcC0+cmVnbmFtZSAhPSAwICYmICF2YWxpZF95YW5rX3JlZyhvYXAtPnJlZ25hbWUsIFRSVUUpKQorICAgIHsKKwliZWVwX2ZsdXNoKCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGlmIChvYXAtPnJlZ25hbWUgPT0gJ18nKQkgICAgLyogYmxhY2sgaG9sZTogbm90aGluZyB0byBkbyAqLworCXJldHVybiBPSzsKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgaWYgKCFjbGlwX3N0YXIuYXZhaWxhYmxlICYmIG9hcC0+cmVnbmFtZSA9PSAnKicpCisJb2FwLT5yZWduYW1lID0gMDsKKyAgICBlbHNlIGlmICghY2xpcF9wbHVzLmF2YWlsYWJsZSAmJiBvYXAtPnJlZ25hbWUgPT0gJysnKQorCW9hcC0+cmVnbmFtZSA9IDA7CisjZW5kaWYKKworICAgIGlmICghZGVsZXRpbmcpCQkgICAgLyogb3BfZGVsZXRlKCkgYWxyZWFkeSBzZXQgeV9jdXJyZW50ICovCisJZ2V0X3lhbmtfcmVnaXN0ZXIob2FwLT5yZWduYW1lLCBUUlVFKTsKKworICAgIGN1cnIgPSB5X2N1cnJlbnQ7CisJCQkJICAgIC8qIGFwcGVuZCB0byBleGlzdGluZyBjb250ZW50cyAqLworICAgIGlmICh5X2FwcGVuZCAmJiB5X2N1cnJlbnQtPnlfYXJyYXkgIT0gTlVMTCkKKwl5X2N1cnJlbnQgPSAmbmV3cmVnOworICAgIGVsc2UKKwlmcmVlX3lhbmtfYWxsKCk7CSAgICAvKiBmcmVlIHByZXZpb3VzbHkgeWFua2VkIGxpbmVzICovCisKKy8qCisgKiBJZiB0aGUgY3Vyc29yIHdhcyBpbiBjb2x1bW4gMSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtb3ZlbWVudCwgYW5kIHRoZQorICogb3BlcmF0b3IgaXMgbm90IGluY2x1c2l2ZSwgdGhlIHlhbmsgaXMgYWx3YXlzIGxpbmV3aXNlLgorICovCisgICAgaWYgKCAgICAgICBvYXAtPm1vdGlvbl90eXBlID09IE1DSEFSCisJICAgICYmIG9hcC0+c3RhcnQuY29sID09IDAKKwkgICAgJiYgIW9hcC0+aW5jbHVzaXZlCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgJiYgKCFvYXAtPmlzX1ZJc3VhbCB8fCAqcF9zZWwgPT0gJ28nKQorI2VuZGlmCisJICAgICYmIG9hcC0+ZW5kLmNvbCA9PSAwCisJICAgICYmIHlhbmtsaW5lcyA+IDEpCisgICAgeworCXlhbmt0eXBlID0gTUxJTkU7CisJLS15YW5rZW5kbG51bTsKKwktLXlhbmtsaW5lczsKKyAgICB9CisKKyAgICB5X2N1cnJlbnQtPnlfc2l6ZSA9IHlhbmtsaW5lczsKKyAgICB5X2N1cnJlbnQtPnlfdHlwZSA9IHlhbmt0eXBlOyAgIC8qIHNldCB0aGUgeWFuayByZWdpc3RlciB0eXBlICovCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICB5X2N1cnJlbnQtPnlfd2lkdGggPSAwOworI2VuZGlmCisgICAgeV9jdXJyZW50LT55X2FycmF5ID0gKGNoYXJfdSAqKilsYWxsb2NfY2xlYXIoKGxvbmdfdSkoc2l6ZW9mKGNoYXJfdSAqKSAqCisJCQkJCQkJICAgIHlhbmtsaW5lcyksIFRSVUUpOworCisgICAgaWYgKHlfY3VycmVudC0+eV9hcnJheSA9PSBOVUxMKQorICAgIHsKKwl5X2N1cnJlbnQgPSBjdXJyOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIHlfaWR4ID0gMDsKKyAgICBsbnVtID0gb2FwLT5zdGFydC5sbnVtOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAob2FwLT5ibG9ja19tb2RlKQorICAgIHsKKwkvKiBWaXN1YWwgYmxvY2sgbW9kZSAqLworCXlfY3VycmVudC0+eV90eXBlID0gTUJMT0NLOwkgICAgLyogc2V0IHRoZSB5YW5rIHJlZ2lzdGVyIHR5cGUgKi8KKwl5X2N1cnJlbnQtPnlfd2lkdGggPSBvYXAtPmVuZF92Y29sIC0gb2FwLT5zdGFydF92Y29sOworCisJaWYgKGN1cndpbi0+d19jdXJzd2FudCA9PSBNQVhDT0wgJiYgeV9jdXJyZW50LT55X3dpZHRoID4gMCkKKwkgICAgeV9jdXJyZW50LT55X3dpZHRoLS07CisgICAgfQorI2VuZGlmCisKKyAgICBmb3IgKCA7IGxudW0gPD0geWFua2VuZGxudW07IGxudW0rKywgeV9pZHgrKykKKyAgICB7CisJc3dpdGNoICh5X2N1cnJlbnQtPnlfdHlwZSkKKwl7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgY2FzZSBNQkxPQ0s6CisJCWJsb2NrX3ByZXAob2FwLCAmYmQsIGxudW0sIEZBTFNFKTsKKwkJaWYgKHlhbmtfY29weV9saW5lKCZiZCwgeV9pZHgpID09IEZBSUwpCisJCSAgICBnb3RvIGZhaWw7CisJCWJyZWFrOworI2VuZGlmCisKKwkgICAgY2FzZSBNTElORToKKwkJaWYgKCh5X2N1cnJlbnQtPnlfYXJyYXlbeV9pZHhdID0KKwkJCSAgICB2aW1fc3Ryc2F2ZShtbF9nZXQobG51bSkpKSA9PSBOVUxMKQorCQkgICAgZ290byBmYWlsOworCQlicmVhazsKKworCSAgICBjYXNlIE1DSEFSOgorCQl7CisJCSAgICBjb2xucl9UIHN0YXJ0Y29sID0gMCwgZW5kY29sID0gTUFYQ09MOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJICAgIGludCBpc19vbmVDaGFyID0gRkFMU0U7CisJCSAgICBjb2xucl9UIGNzLCBjZTsKKyNlbmRpZgorCQkgICAgcCA9IG1sX2dldChsbnVtKTsKKwkJICAgIGJkLnN0YXJ0c3BhY2VzID0gMDsKKwkJICAgIGJkLmVuZHNwYWNlcyA9IDA7CisKKwkJICAgIGlmIChsbnVtID09IG9hcC0+c3RhcnQubG51bSkKKwkJICAgIHsKKwkJCXN0YXJ0Y29sID0gb2FwLT5zdGFydC5jb2w7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkJaWYgKHZpcnR1YWxfb3ApCisJCQl7CisJCQkgICAgZ2V0dmNvbChjdXJ3aW4sICZvYXAtPnN0YXJ0LCAmY3MsIE5VTEwsICZjZSk7CisJCQkgICAgaWYgKGNlICE9IGNzICYmIG9hcC0+c3RhcnQuY29sYWRkID4gMCkKKwkJCSAgICB7CisJCQkJLyogUGFydCBvZiBhIHRhYiBzZWxlY3RlZCAtLSBidXQgZG9uJ3QKKwkJCQkgKiBkb3VibGUtY291bnQgaXQuICovCisJCQkJYmQuc3RhcnRzcGFjZXMgPSAoY2UgLSBjcyArIDEpCisJCQkJCQkJICAtIG9hcC0+c3RhcnQuY29sYWRkOworCQkJCXN0YXJ0Y29sKys7CisJCQkgICAgfQorCQkJfQorI2VuZGlmCisJCSAgICB9CisKKwkJICAgIGlmIChsbnVtID09IG9hcC0+ZW5kLmxudW0pCisJCSAgICB7CisJCQllbmRjb2wgPSBvYXAtPmVuZC5jb2w7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCQkJaWYgKHZpcnR1YWxfb3ApCisJCQl7CisJCQkgICAgZ2V0dmNvbChjdXJ3aW4sICZvYXAtPmVuZCwgJmNzLCBOVUxMLCAmY2UpOworCQkJICAgIGlmIChwW2VuZGNvbF0gPT0gTlVMIHx8IChjcyArIG9hcC0+ZW5kLmNvbGFkZCA8IGNlCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCQkJLyogRG9uJ3QgYWRkIHNwYWNlIGZvciBkb3VibGUtd2lkZQorCQkJCQkgKiBjaGFyOyBlbmRjb2wgd2lsbCBiZSBvbiBsYXN0IGJ5dGUKKwkJCQkJICogb2YgbXVsdGktYnl0ZSBjaGFyLiAqLworCQkJCQkmJiAoKm1iX2hlYWRfb2ZmKShwLCBwICsgZW5kY29sKSA9PSAwCisjIGVuZGlmCisJCQkJCSkpCisJCQkgICAgeworCQkJCWlmIChvYXAtPnN0YXJ0LmxudW0gPT0gb2FwLT5lbmQubG51bQorCQkJCQkgICAgJiYgb2FwLT5zdGFydC5jb2wgPT0gb2FwLT5lbmQuY29sKQorCQkJCXsKKwkJCQkgICAgLyogU3BlY2lhbCBjYXNlOiBpbnNpZGUgYSBzaW5nbGUgY2hhciAqLworCQkJCSAgICBpc19vbmVDaGFyID0gVFJVRTsKKwkJCQkgICAgYmQuc3RhcnRzcGFjZXMgPSBvYXAtPmVuZC5jb2xhZGQKKwkJCQkJIC0gb2FwLT5zdGFydC5jb2xhZGQgKyBvYXAtPmluY2x1c2l2ZTsKKwkJCQkgICAgZW5kY29sID0gc3RhcnRjb2w7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJICAgIGJkLmVuZHNwYWNlcyA9IG9hcC0+ZW5kLmNvbGFkZAorCQkJCQkJCSAgICAgKyBvYXAtPmluY2x1c2l2ZTsKKwkJCQkgICAgZW5kY29sIC09IG9hcC0+aW5jbHVzaXZlOworCQkJCX0KKwkJCSAgICB9CisJCQl9CisjZW5kaWYKKwkJICAgIH0KKwkJICAgIGlmIChzdGFydGNvbCA+IGVuZGNvbAorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJCSAgICB8fCBpc19vbmVDaGFyCisjZW5kaWYKKwkJCSAgICApCisJCQliZC50ZXh0bGVuID0gMDsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChlbmRjb2wgPT0gTUFYQ09MKQorCQkJICAgIGVuZGNvbCA9IFNUUkxFTihwKTsKKwkJCWJkLnRleHRsZW4gPSBlbmRjb2wgLSBzdGFydGNvbCArIG9hcC0+aW5jbHVzaXZlOworCQkgICAgfQorCQkgICAgYmQudGV4dHN0YXJ0ID0gcCArIHN0YXJ0Y29sOworCQkgICAgaWYgKHlhbmtfY29weV9saW5lKCZiZCwgeV9pZHgpID09IEZBSUwpCisJCQlnb3RvIGZhaWw7CisJCSAgICBicmVhazsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJfQorICAgIH0KKworICAgIGlmIChjdXJyICE9IHlfY3VycmVudCkJLyogYXBwZW5kIHRoZSBuZXcgYmxvY2sgdG8gdGhlIG9sZCBibG9jayAqLworICAgIHsKKwluZXdfcHRyID0gKGNoYXJfdSAqKilsYWxsb2MoKGxvbmdfdSkoc2l6ZW9mKGNoYXJfdSAqKSAqCisJCQkJICAgKGN1cnItPnlfc2l6ZSArIHlfY3VycmVudC0+eV9zaXplKSksIFRSVUUpOworCWlmIChuZXdfcHRyID09IE5VTEwpCisJICAgIGdvdG8gZmFpbDsKKwlmb3IgKGogPSAwOyBqIDwgY3Vyci0+eV9zaXplOyArK2opCisJICAgIG5ld19wdHJbal0gPSBjdXJyLT55X2FycmF5W2pdOworCXZpbV9mcmVlKGN1cnItPnlfYXJyYXkpOworCWN1cnItPnlfYXJyYXkgPSBuZXdfcHRyOworCisJaWYgKHlhbmt0eXBlID09IE1MSU5FKQkvKiBNTElORSBvdmVycmlkZXMgTUNIQVIgYW5kIE1CTE9DSyAqLworCSAgICBjdXJyLT55X3R5cGUgPSBNTElORTsKKworCS8qIGNvbmNhdGVuYXRlIHRoZSBsYXN0IGxpbmUgb2YgdGhlIG9sZCBibG9jayB3aXRoIHRoZSBmaXJzdCBsaW5lIG9mCisJICogdGhlIG5ldyBibG9jayAqLworCWlmIChjdXJyLT55X3R5cGUgPT0gTUNIQVIpCisJeworCSAgICBwbmV3ID0gbGFsbG9jKChsb25nX3UpKFNUUkxFTihjdXJyLT55X2FycmF5W2N1cnItPnlfc2l6ZSAtIDFdKQorCQkJICAgICAgKyBTVFJMRU4oeV9jdXJyZW50LT55X2FycmF5WzBdKSArIDEpLCBUUlVFKTsKKwkgICAgaWYgKHBuZXcgPT0gTlVMTCkKKwkgICAgeworCQl5X2lkeCA9IHlfY3VycmVudC0+eV9zaXplIC0gMTsKKwkJZ290byBmYWlsOworCSAgICB9CisJICAgIFNUUkNQWShwbmV3LCBjdXJyLT55X2FycmF5Wy0tal0pOworCSAgICBTVFJDQVQocG5ldywgeV9jdXJyZW50LT55X2FycmF5WzBdKTsKKwkgICAgdmltX2ZyZWUoY3Vyci0+eV9hcnJheVtqXSk7CisJICAgIHZpbV9mcmVlKHlfY3VycmVudC0+eV9hcnJheVswXSk7CisJICAgIGN1cnItPnlfYXJyYXlbaisrXSA9IHBuZXc7CisJICAgIHlfaWR4ID0gMTsKKwl9CisJZWxzZQorCSAgICB5X2lkeCA9IDA7CisJd2hpbGUgKHlfaWR4IDwgeV9jdXJyZW50LT55X3NpemUpCisJICAgIGN1cnItPnlfYXJyYXlbaisrXSA9IHlfY3VycmVudC0+eV9hcnJheVt5X2lkeCsrXTsKKwljdXJyLT55X3NpemUgPSBqOworCXZpbV9mcmVlKHlfY3VycmVudC0+eV9hcnJheSk7CisJeV9jdXJyZW50ID0gY3VycjsKKyAgICB9CisgICAgaWYgKG1lc3MpCQkJLyogRGlzcGxheSBtZXNzYWdlIGFib3V0IHlhbms/ICovCisgICAgeworCWlmICh5YW5rdHlwZSA9PSBNQ0hBUgorI2lmZGVmIEZFQVRfVklTVUFMCisJCSYmICFvYXAtPmJsb2NrX21vZGUKKyNlbmRpZgorCQkmJiB5YW5rbGluZXMgPT0gMSkKKwkgICAgeWFua2xpbmVzID0gMDsKKwkvKiBTb21lIHZlcnNpb25zIG9mIFZpIHVzZSAiPj0iIGhlcmUsIHNvbWUgZG9uJ3QuLi4gICovCisJaWYgKHlhbmtsaW5lcyA+IHBfcmVwb3J0KQorCXsKKwkgICAgLyogcmVkaXNwbGF5IG5vdywgc28gbWVzc2FnZSBpcyBub3QgZGVsZXRlZCAqLworCSAgICB1cGRhdGVfdG9wbGluZV9yZWRyYXcoKTsKKwkgICAgaWYgKHlhbmtsaW5lcyA9PSAxKQorCQlNU0coXygiMSBsaW5lIHlhbmtlZCIpKTsKKwkgICAgZWxzZQorCQlzbXNnKChjaGFyX3UgKilfKCIlbGQgbGluZXMgeWFua2VkIiksIHlhbmtsaW5lcyk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICInWyIgYW5kICInXSIgbWFya3MuCisgICAgICovCisgICAgY3VyYnVmLT5iX29wX3N0YXJ0ID0gb2FwLT5zdGFydDsKKyAgICBjdXJidWYtPmJfb3BfZW5kID0gb2FwLT5lbmQ7CisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIC8qCisgICAgICogSWYgd2Ugd2VyZSB5YW5raW5nIHRvIHRoZSAnKicgcmVnaXN0ZXIsIHNlbmQgcmVzdWx0IHRvIGNsaXBib2FyZC4KKyAgICAgKiBJZiBubyByZWdpc3RlciB3YXMgc3BlY2lmaWVkLCBhbmQgInVubmFtZWQiIGluICdjbGlwYm9hcmQnLCBtYWtlIGEgY29weQorICAgICAqIHRvIHRoZSAnKicgcmVnaXN0ZXIuCisgICAgICovCisgICAgaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUKKwkgICAgJiYgKGN1cnIgPT0gJih5X3JlZ3NbU1RBUl9SRUdJU1RFUl0pCisJCXx8ICghZGVsZXRpbmcgJiYgb2FwLT5yZWduYW1lID09IDAgJiYgY2xpcF91bm5hbWVkKSkpCisgICAgeworCWlmIChjdXJyICE9ICYoeV9yZWdzW1NUQVJfUkVHSVNURVJdKSkKKwkgICAgLyogQ29weSB0aGUgdGV4dCBmcm9tIHJlZ2lzdGVyIDAgdG8gdGhlIGNsaXBib2FyZCByZWdpc3Rlci4gKi8KKwkgICAgY29weV95YW5rX3JlZygmKHlfcmVnc1tTVEFSX1JFR0lTVEVSXSkpOworCisJY2xpcF9vd25fc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworCWNsaXBfZ2VuX3NldF9zZWxlY3Rpb24oJmNsaXBfc3Rhcik7CisgICAgfQorCisjIGlmZGVmIEZFQVRfWDExCisgICAgLyoKKyAgICAgKiBJZiB3ZSB3ZXJlIHlhbmtpbmcgdG8gdGhlICcrJyByZWdpc3Rlciwgc2VuZCByZXN1bHQgdG8gc2VsZWN0aW9uLgorICAgICAqIEFsc28gY29weSB0byB0aGUgJyonIHJlZ2lzdGVyLCBpbiBjYXNlIGF1dG8tc2VsZWN0IGlzIG9mZi4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChjbGlwX3BsdXMuYXZhaWxhYmxlICYmIGN1cnIgPT0gJih5X3JlZ3NbUExVU19SRUdJU1RFUl0pKQorICAgIHsKKwkvKiBObyBuZWVkIHRvIGNvcHkgdG8gKiByZWdpc3RlciB1cG9uICd1bm5hbWVkJyBub3cgLSBzZWUgYmVsb3cgKi8KKwljbGlwX293bl9zZWxlY3Rpb24oJmNsaXBfcGx1cyk7CisJY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9wbHVzKTsKKwlpZiAoIWNsaXBfaXNhdXRvc2VsKCkpCisJeworCSAgICBjb3B5X3lhbmtfcmVnKCYoeV9yZWdzW1NUQVJfUkVHSVNURVJdKSk7CisJICAgIGNsaXBfb3duX3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwkgICAgY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwl9CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gT0s7CisKK2ZhaWw6CQkvKiBmcmVlIHRoZSBhbGxvY2F0ZWQgbGluZXMgKi8KKyAgICBmcmVlX3lhbmsoeV9pZHggKyAxKTsKKyAgICB5X2N1cnJlbnQgPSBjdXJyOworICAgIHJldHVybiBGQUlMOworfQorCisgICAgc3RhdGljIGludAoreWFua19jb3B5X2xpbmUoYmQsIHlfaWR4KQorICAgIHN0cnVjdCBibG9ja19kZWYJKmJkOworICAgIGxvbmcJCXlfaWR4OworeworICAgIGNoYXJfdQkqcG5ldzsKKworICAgIGlmICgocG5ldyA9IGFsbG9jKGJkLT5zdGFydHNwYWNlcyArIGJkLT5lbmRzcGFjZXMgKyBiZC0+dGV4dGxlbiArIDEpKQorCQkJCQkJCQkgICAgICA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHlfY3VycmVudC0+eV9hcnJheVt5X2lkeF0gPSBwbmV3OworICAgIGNvcHlfc3BhY2VzKHBuZXcsIChzaXplX3QpYmQtPnN0YXJ0c3BhY2VzKTsKKyAgICBwbmV3ICs9IGJkLT5zdGFydHNwYWNlczsKKyAgICBtY2hfbWVtbW92ZShwbmV3LCBiZC0+dGV4dHN0YXJ0LCAoc2l6ZV90KWJkLT50ZXh0bGVuKTsKKyAgICBwbmV3ICs9IGJkLT50ZXh0bGVuOworICAgIGNvcHlfc3BhY2VzKHBuZXcsIChzaXplX3QpYmQtPmVuZHNwYWNlcyk7CisgICAgcG5ldyArPSBiZC0+ZW5kc3BhY2VzOworICAgICpwbmV3ID0gTlVMOworICAgIHJldHVybiBPSzsKK30KKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisvKgorICogTWFrZSBhIGNvcHkgb2YgdGhlIHlfY3VycmVudCByZWdpc3RlciB0byByZWdpc3RlciAicmVnIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjb3B5X3lhbmtfcmVnKHJlZykKKyAgICBzdHJ1Y3QgeWFua3JlZyAqcmVnOworeworICAgIHN0cnVjdCB5YW5rcmVnCSpjdXJyID0geV9jdXJyZW50OworICAgIGxvbmcJCWo7CisKKyAgICB5X2N1cnJlbnQgPSByZWc7CisgICAgZnJlZV95YW5rX2FsbCgpOworICAgICp5X2N1cnJlbnQgPSAqY3VycjsKKyAgICB5X2N1cnJlbnQtPnlfYXJyYXkgPSAoY2hhcl91ICoqKWxhbGxvY19jbGVhcigKKwkJCShsb25nX3UpKHNpemVvZihjaGFyX3UgKikgKiB5X2N1cnJlbnQtPnlfc2l6ZSksIFRSVUUpOworICAgIGlmICh5X2N1cnJlbnQtPnlfYXJyYXkgPT0gTlVMTCkKKwl5X2N1cnJlbnQtPnlfc2l6ZSA9IDA7CisgICAgZWxzZQorCWZvciAoaiA9IDA7IGogPCB5X2N1cnJlbnQtPnlfc2l6ZTsgKytqKQorCSAgICBpZiAoKHlfY3VycmVudC0+eV9hcnJheVtqXSA9IHZpbV9zdHJzYXZlKGN1cnItPnlfYXJyYXlbal0pKSA9PSBOVUxMKQorCSAgICB7CisJCWZyZWVfeWFuayhqKTsKKwkJeV9jdXJyZW50LT55X3NpemUgPSAwOworCQlicmVhazsKKwkgICAgfQorICAgIHlfY3VycmVudCA9IGN1cnI7Cit9CisjZW5kaWYKKworLyoKKyAqIHB1dCBjb250ZW50cyBvZiByZWdpc3RlciAicmVnbmFtZSIgaW50byB0aGUgdGV4dAorICogZmxhZ3M6IFBVVF9GSVhJTkRFTlQJbWFrZSBpbmRlbnQgbG9vayBuaWNlCisgKgkgIFBVVF9DVVJTRU5ECWxlYXZlIGN1cnNvciBhZnRlciBlbmQgb2YgbmV3IHRleHQKKyAqCSAgUFVUX0xJTkUJZm9yY2UgbGluZXdpc2UgcHV0ICgiOnB1dCIpCisgKi8KKyAgICB2b2lkCitkb19wdXQocmVnbmFtZSwgZGlyLCBjb3VudCwgZmxhZ3MpCisgICAgaW50CQlyZWduYW1lOworICAgIGludAkJZGlyOwkJLyogQkFDS1dBUkQgZm9yICdQJywgRk9SV0FSRCBmb3IgJ3AnICovCisgICAgbG9uZwljb3VudDsKKyAgICBpbnQJCWZsYWdzOworeworICAgIGNoYXJfdQkqcHRyOworICAgIGNoYXJfdQkqbmV3cCwgKm9sZHA7CisgICAgaW50CQl5YW5rbGVuOworICAgIGludAkJdG90bGVuID0gMDsJCS8qIGluaXQgZm9yIGdjYyAqLworICAgIGxpbmVucl9UCWxudW07CisgICAgY29sbnJfVAljb2w7CisgICAgbG9uZwlpOwkJCS8qIGluZGV4IGluIHlfYXJyYXlbXSAqLworICAgIGludAkJeV90eXBlOworICAgIGxvbmcJeV9zaXplOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaW50CQlvbGRsZW47CisgICAgbG9uZwl5X3dpZHRoID0gMDsKKyAgICBjb2xucl9UCXZjb2w7CisgICAgaW50CQlkZWxjb3VudDsKKyAgICBpbnQJCWluY3IgPSAwOworICAgIGxvbmcJajsKKyAgICBzdHJ1Y3QgYmxvY2tfZGVmIGJkOworI2VuZGlmCisgICAgY2hhcl91CSoqeV9hcnJheSA9IE5VTEw7CisgICAgbG9uZwlucl9saW5lcyA9IDA7CisgICAgcG9zX1QJbmV3X2N1cnNvcjsKKyAgICBpbnQJCWluZGVudDsKKyAgICBpbnQJCW9yaWdfaW5kZW50ID0gMDsJLyogaW5pdCBmb3IgZ2NjICovCisgICAgaW50CQlpbmRlbnRfZGlmZiA9IDA7CS8qIGluaXQgZm9yIGdjYyAqLworICAgIGludAkJZmlyc3RfaW5kZW50ID0gVFJVRTsKKyAgICBpbnQJCWxlbmRpZmYgPSAwOworICAgIHBvc19UCW9sZF9wb3M7CisgICAgY2hhcl91CSppbnNlcnRfc3RyaW5nID0gTlVMTDsKKyAgICBpbnQJCWFsbG9jYXRlZCA9IEZBTFNFOworICAgIGxvbmcJY250OworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBBZGp1c3QgcmVnaXN0ZXIgbmFtZSBmb3IgInVubmFtZWQiIGluICdjbGlwYm9hcmQnLiAqLworICAgIGFkanVzdF9jbGlwX3JlZygmcmVnbmFtZSk7CisgICAgKHZvaWQpbWF5X2dldF9zZWxlY3Rpb24ocmVnbmFtZSk7CisjZW5kaWYKKworICAgIGlmIChmbGFncyAmIFBVVF9GSVhJTkRFTlQpCisJb3JpZ19pbmRlbnQgPSBnZXRfaW5kZW50KCk7CisKKyAgICBjdXJidWYtPmJfb3Bfc3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiBkZWZhdWx0IGZvciAnWyBtYXJrICovCisgICAgY3VyYnVmLT5iX29wX2VuZCA9IGN1cndpbi0+d19jdXJzb3I7CS8qIGRlZmF1bHQgZm9yICddIG1hcmsgKi8KKworICAgIC8qCisgICAgICogVXNpbmcgaW5zZXJ0ZWQgdGV4dCB3b3JrcyBkaWZmZXJlbnRseSwgYmVjYXVzZSB0aGUgcmVnaXN0ZXIgaW5jbHVkZXMKKyAgICAgKiBzcGVjaWFsIGNoYXJhY3RlcnMgKG5ld2xpbmVzLCBldGMuKS4KKyAgICAgKi8KKyAgICBpZiAocmVnbmFtZSA9PSAnLicpCisgICAgeworCSh2b2lkKXN0dWZmX2luc2VydGVkKChkaXIgPT0gRk9SV0FSRCA/IChjb3VudCA9PSAtMSA/ICdvJyA6ICdhJykgOgorCQkJCSAgICAoY291bnQgPT0gLTEgPyAnTycgOiAnaScpKSwgY291bnQsIEZBTFNFKTsKKwkvKiBQdXR0aW5nIHRoZSB0ZXh0IGlzIGRvbmUgbGF0ZXIsIHNvIGNhbid0IHJlYWxseSBtb3ZlIHRoZSBjdXJzb3IgdG8KKwkgKiB0aGUgbmV4dCBjaGFyYWN0ZXIuICBVc2UgImwiIHRvIHNpbXVsYXRlIGl0LiAqLworCWlmICgoZmxhZ3MgJiBQVVRfQ1VSU0VORCkgJiYgZ2NoYXJfY3Vyc29yKCkgIT0gTlVMKQorCSAgICBzdHVmZmNoYXJSZWFkYnVmZignbCcpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBzcGVjaWFsIHJlZ2lzdGVycyAnJScgKGZpbGUgbmFtZSksICcjJyAoYWx0ZXJuYXRlIGZpbGUgbmFtZSkgYW5kCisgICAgICogJzonIChsYXN0IGNvbW1hbmQgbGluZSksIGV0Yy4gd2UgaGF2ZSB0byBjcmVhdGUgYSBmYWtlIHlhbmsgcmVnaXN0ZXIuCisgICAgICovCisgICAgaWYgKGdldF9zcGVjX3JlZyhyZWduYW1lLCAmaW5zZXJ0X3N0cmluZywgJmFsbG9jYXRlZCwgVFJVRSkpCisgICAgeworCWlmIChpbnNlcnRfc3RyaW5nID09IE5VTEwpCisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5zZXJ0X3N0cmluZyAhPSBOVUxMKQorICAgIHsKKwl5X3R5cGUgPSBNQ0hBUjsKKyNpZmRlZiBGRUFUX0VWQUwKKwlpZiAocmVnbmFtZSA9PSAnPScpCisJeworCSAgICAvKiBGb3IgdGhlID0gcmVnaXN0ZXIgd2UgbmVlZCB0byBzcGxpdCB0aGUgc3RyaW5nIGF0IE5MCisJICAgICAqIGNoYXJhY3RlcnMuICovCisJICAgIC8qIExvb3AgdHdpY2U6IGNvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgYW5kIHNhdmUgdGhlbS4gKi8KKwkgICAgZm9yICg7OykKKwkgICAgeworCQl5X3NpemUgPSAwOworCQlwdHIgPSBpbnNlcnRfc3RyaW5nOworCQl3aGlsZSAocHRyICE9IE5VTEwpCisJCXsKKwkJICAgIGlmICh5X2FycmF5ICE9IE5VTEwpCisJCQl5X2FycmF5W3lfc2l6ZV0gPSBwdHI7CisJCSAgICArK3lfc2l6ZTsKKwkJICAgIHB0ciA9IHZpbV9zdHJjaHIocHRyLCAnXG4nKTsKKwkJICAgIGlmIChwdHIgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWlmICh5X2FycmF5ICE9IE5VTEwpCisJCQkgICAgKnB0ciA9IE5VTDsKKwkJCSsrcHRyOworCQkJLyogQSB0cmFpbGluZyAnXG4nIG1ha2VzIHRoZSBzdHJpbmcgbGluZXdpc2UgKi8KKwkJCWlmICgqcHRyID09IE5VTCkKKwkJCXsKKwkJCSAgICB5X3R5cGUgPSBNTElORTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQlpZiAoeV9hcnJheSAhPSBOVUxMKQorCQkgICAgYnJlYWs7CisJCXlfYXJyYXkgPSAoY2hhcl91ICoqKWFsbG9jKCh1bnNpZ25lZCkKKwkJCQkJCSAoeV9zaXplICogc2l6ZW9mKGNoYXJfdSAqKSkpOworCQlpZiAoeV9hcnJheSA9PSBOVUxMKQorCQkgICAgZ290byBlbmQ7CisJICAgIH0KKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICB5X3NpemUgPSAxOwkJLyogdXNlIGZha2Ugb25lLWxpbmUgeWFuayByZWdpc3RlciAqLworCSAgICB5X2FycmF5ID0gJmluc2VydF9zdHJpbmc7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWdldF95YW5rX3JlZ2lzdGVyKHJlZ25hbWUsIEZBTFNFKTsKKworCXlfdHlwZSA9IHlfY3VycmVudC0+eV90eXBlOworI2lmZGVmIEZFQVRfVklTVUFMCisJeV93aWR0aCA9IHlfY3VycmVudC0+eV93aWR0aDsKKyNlbmRpZgorCXlfc2l6ZSA9IHlfY3VycmVudC0+eV9zaXplOworCXlfYXJyYXkgPSB5X2N1cnJlbnQtPnlfYXJyYXk7CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoeV90eXBlID09IE1MSU5FKQorICAgIHsKKwlpZiAoZmxhZ3MgJiBQVVRfTElORV9TUExJVCkKKwl7CisJICAgIC8qICJwIiBvciAiUCIgaW4gVmlzdWFsIG1vZGU6IHNwbGl0IHRoZSBsaW5lcyB0byBwdXQgdGhlIHRleHQgaW4KKwkgICAgICogYmV0d2Vlbi4gKi8KKwkgICAgaWYgKHVfc2F2ZV9jdXJzb3IoKSA9PSBGQUlMKQorCQlnb3RvIGVuZDsKKwkgICAgcHRyID0gdmltX3N0cnNhdmUobWxfZ2V0X2N1cnNvcigpKTsKKwkgICAgaWYgKHB0ciA9PSBOVUxMKQorCQlnb3RvIGVuZDsKKwkgICAgbWxfYXBwZW5kKGN1cndpbi0+d19jdXJzb3IubG51bSwgcHRyLCAoY29sbnJfVCkwLCBGQUxTRSk7CisJICAgIHZpbV9mcmVlKHB0cik7CisKKwkgICAgcHRyID0gdmltX3N0cm5zYXZlKG1sX2dldF9jdXJsaW5lKCksIGN1cndpbi0+d19jdXJzb3IuY29sKTsKKwkgICAgaWYgKHB0ciA9PSBOVUxMKQorCQlnb3RvIGVuZDsKKwkgICAgbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIHB0ciwgRkFMU0UpOworCSAgICArK25yX2xpbmVzOworCSAgICBkaXIgPSBGT1JXQVJEOworCX0KKwlpZiAoZmxhZ3MgJiBQVVRfTElORV9GT1JXQVJEKQorCXsKKwkgICAgLyogTXVzdCBiZSAicCIgZm9yIGEgVmlzdWFsIGJsb2NrLCBwdXQgbGluZXMgYmVsb3cgdGhlIGJsb2NrLiAqLworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gY3VyYnVmLT5iX3Zpc3VhbF9lbmQ7CisJICAgIGRpciA9IEZPUldBUkQ7CisJfQorCWN1cmJ1Zi0+Yl9vcF9zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CS8qIGRlZmF1bHQgZm9yICdbIG1hcmsgKi8KKwljdXJidWYtPmJfb3BfZW5kID0gY3Vyd2luLT53X2N1cnNvcjsJLyogZGVmYXVsdCBmb3IgJ10gbWFyayAqLworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGZsYWdzICYgUFVUX0xJTkUpCS8qIDpwdXQgY29tbWFuZCBvciAicCIgaW4gVmlzdWFsIGxpbmUgbW9kZS4gKi8KKwl5X3R5cGUgPSBNTElORTsKKworICAgIGlmICh5X3NpemUgPT0gMCB8fCB5X2FycmF5ID09IE5VTEwpCisgICAgeworCUVNU0cyKF8oIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiKSwKKwkJICByZWduYW1lID09IDAgPyAoY2hhcl91ICopIlwiIiA6IHRyYW5zY2hhcihyZWduYW1lKSk7CisJZ290byBlbmQ7CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoeV90eXBlID09IE1CTE9DSykKKyAgICB7CisJbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bSArIHlfc2l6ZSArIDE7CisJaWYgKGxudW0gPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkgICAgbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMTsKKwlpZiAodV9zYXZlKGN1cndpbi0+d19jdXJzb3IubG51bSAtIDEsIGxudW0pID09IEZBSUwpCisJICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlpZiAoeV90eXBlID09IE1MSU5FKQorICAgIHsKKwlsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworI2lmZGVmIEZFQVRfRk9MRElORworCS8qIENvcnJlY3QgbGluZSBudW1iZXIgZm9yIGNsb3NlZCBmb2xkLiAgRG9uJ3QgbW92ZSB0aGUgY3Vyc29yIHlldCwKKwkgKiB1X3NhdmUoKSB1c2VzIGl0LiAqLworCWlmIChkaXIgPT0gQkFDS1dBUkQpCisJICAgICh2b2lkKWhhc0ZvbGRpbmcobG51bSwgJmxudW0sIE5VTEwpOworCWVsc2UKKwkgICAgKHZvaWQpaGFzRm9sZGluZyhsbnVtLCBOVUxMLCAmbG51bSk7CisjZW5kaWYKKwlpZiAoZGlyID09IEZPUldBUkQpCisJICAgICsrbG51bTsKKwlpZiAodV9zYXZlKGxudW0gLSAxLCBsbnVtKSA9PSBGQUlMKQorCSAgICBnb3RvIGVuZDsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoZGlyID09IEZPUldBUkQpCisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW0gLSAxOworCWVsc2UKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwljdXJidWYtPmJfb3Bfc3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiBmb3IgbWFya19hZGp1c3QoKSAqLworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHVfc2F2ZV9jdXJzb3IoKSA9PSBGQUlMKQorCWdvdG8gZW5kOworCisgICAgeWFua2xlbiA9IChpbnQpU1RSTEVOKHlfYXJyYXlbMF0pOworCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGlmICh2ZV9mbGFncyA9PSBWRV9BTEwgJiYgeV90eXBlID09IE1DSEFSKQorICAgIHsKKwlpZiAoZ2NoYXJfY3Vyc29yKCkgPT0gVEFCKQorCXsKKwkgICAgLyogRG9uJ3QgbmVlZCB0byBpbnNlcnQgc3BhY2VzIHdoZW4gInAiIG9uIHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKKwkgICAgICogdGFiIG9yICJQIiBvbiB0aGUgZmlyc3QgcG9zaXRpb24uICovCisJICAgIGlmIChkaXIgPT0gRk9SV0FSRAorCQkgICAgPyAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sYWRkIDwgY3VyYnVmLT5iX3BfdHMgLSAxCisJCQkJCQk6IGN1cndpbi0+d19jdXJzb3IuY29sYWRkID4gMCkKKwkJY29sYWR2YW5jZV9mb3JjZShnZXR2aXNjb2woKSk7CisJICAgIGVsc2UKKwkJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworCX0KKwllbHNlIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDAgfHwgZ2NoYXJfY3Vyc29yKCkgPT0gTlVMKQorCSAgICBjb2xhZHZhbmNlX2ZvcmNlKGdldHZpc2NvbCgpICsgKGRpciA9PSBGT1JXQVJEKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBsbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKgorICAgICAqIEJsb2NrIG1vZGUKKyAgICAgKi8KKyAgICBpZiAoeV90eXBlID09IE1CTE9DSykKKyAgICB7CisJY2hhcgljID0gZ2NoYXJfY3Vyc29yKCk7CisJY29sbnJfVAllbmRjb2wyID0gMDsKKworCWlmIChkaXIgPT0gRk9SV0FSRCAmJiBjICE9IE5VTCkKKwl7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSAgICBpZiAodmVfZmxhZ3MgPT0gVkVfQUxMKQorCQlnZXR2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZjb2wsIE5VTEwsICZlbmRjb2wyKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCWdldHZjb2woY3Vyd2luLCAmY3Vyd2luLT53X2N1cnNvciwgTlVMTCwgTlVMTCwgJmNvbCk7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCS8qIG1vdmUgdG8gc3RhcnQgb2YgbmV4dCBtdWx0aS1ieXRlIGNoYXJhY3RlciAqLworCQljdXJ3aW4tPndfY3Vyc29yLmNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKG1sX2dldF9jdXJzb3IoKSk7CisJICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkgICAgaWYgKGMgIT0gVEFCIHx8IHZlX2ZsYWdzICE9IFZFX0FMTCkKKyNlbmRpZgorCQkrK2N1cndpbi0+d19jdXJzb3IuY29sOworCSAgICArK2NvbDsKKwl9CisJZWxzZQorCSAgICBnZXR2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsICZjb2wsIE5VTEwsICZlbmRjb2wyKTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwljb2wgKz0gY3Vyd2luLT53X2N1cnNvci5jb2xhZGQ7CisJaWYgKHZlX2ZsYWdzID09IFZFX0FMTCAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA+IDApCisJeworCSAgICBpZiAoZGlyID09IEZPUldBUkQgJiYgYyA9PSBOVUwpCisJCSsrY29sOworCSAgICBpZiAoZGlyICE9IEZPUldBUkQgJiYgYyAhPSBOVUwpCisJCSsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIGlmIChjID09IFRBQikKKwkgICAgeworCQlpZiAoZGlyID09IEJBQ0tXQVJEICYmIGN1cndpbi0+d19jdXJzb3IuY29sKQorCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wtLTsKKwkJaWYgKGRpciA9PSBGT1JXQVJEICYmIGNvbCAtIDEgPT0gZW5kY29sMikKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sKys7CisJICAgIH0KKwl9CisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IHlfc2l6ZTsgKytpKQorCXsKKwkgICAgaW50IHNwYWNlczsKKwkgICAgY2hhciBzaG9ydGxpbmU7CisKKwkgICAgYmQuc3RhcnRzcGFjZXMgPSAwOworCSAgICBiZC5lbmRzcGFjZXMgPSAwOworCSAgICBiZC50ZXh0Y29sID0gMDsKKwkgICAgdmNvbCA9IDA7CisJICAgIGRlbGNvdW50ID0gMDsKKworCSAgICAvKiBhZGQgYSBuZXcgbGluZSAqLworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHsKKwkJaWYgKG1sX2FwcGVuZChjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwgKGNoYXJfdSAqKSIiLAorCQkJCQkJICAgKGNvbG5yX1QpMSwgRkFMU0UpID09IEZBSUwpCisJCSAgICBicmVhazsKKwkJKytucl9saW5lczsKKwkgICAgfQorCSAgICAvKiBnZXQgdGhlIG9sZCBsaW5lIGFuZCBhZHZhbmNlIHRvIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQgYXQgKi8KKwkgICAgb2xkcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJICAgIG9sZGxlbiA9IChpbnQpU1RSTEVOKG9sZHApOworCSAgICBmb3IgKHB0ciA9IG9sZHA7IHZjb2wgPCBjb2wgJiYgKnB0cjsgKQorCSAgICB7CisJCS8qIENvdW50IGEgdGFiIGZvciB3aGF0IGl0J3Mgd29ydGggKGlmIGxpc3QgbW9kZSBub3Qgb24pICovCisJCWluY3IgPSBsYnJfY2hhcnRhYnNpemVfYWR2KCZwdHIsIChjb2xucl9UKXZjb2wpOworCQl2Y29sICs9IGluY3I7CisJICAgIH0KKwkgICAgYmQudGV4dGNvbCA9IChjb2xucl9UKShwdHIgLSBvbGRwKTsKKworCSAgICBzaG9ydGxpbmUgPSAodmNvbCA8IGNvbCkgfHwgKHZjb2wgPT0gY29sICYmICEqcHRyKSA7CisKKwkgICAgaWYgKHZjb2wgPCBjb2wpIC8qIGxpbmUgdG9vIHNob3J0LCBwYWRkIHdpdGggc3BhY2VzICovCisJCWJkLnN0YXJ0c3BhY2VzID0gY29sIC0gdmNvbDsKKwkgICAgZWxzZSBpZiAodmNvbCA+IGNvbCkKKwkgICAgeworCQliZC5lbmRzcGFjZXMgPSB2Y29sIC0gY29sOworCQliZC5zdGFydHNwYWNlcyA9IGluY3IgLSBiZC5lbmRzcGFjZXM7CisJCS0tYmQudGV4dGNvbDsKKwkJZGVsY291bnQgPSAxOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJICAgIGJkLnRleHRjb2wgLT0gKCptYl9oZWFkX29mZikob2xkcCwgb2xkcCArIGJkLnRleHRjb2wpOworI2VuZGlmCisJCWlmIChvbGRwW2JkLnRleHRjb2xdICE9IFRBQikKKwkJeworCQkgICAgLyogT25seSBhIFRhYiBjYW4gYmUgc3BsaXQgaW50byBzcGFjZXMuICBPdGhlcgorCQkgICAgICogY2hhcmFjdGVycyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgdG8gYWZ0ZXIgdGhlCisJCSAgICAgKiBibG9jaywgY2F1c2luZyBtaXNhbGlnbm1lbnQuICovCisJCSAgICBkZWxjb3VudCA9IDA7CisJCSAgICBiZC5lbmRzcGFjZXMgPSAwOworCQl9CisJICAgIH0KKworCSAgICB5YW5rbGVuID0gKGludClTVFJMRU4oeV9hcnJheVtpXSk7CisKKwkgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgcmVxdWlyZWQgdG8gZmlsbCByaWdodCBzaWRlIG9mIGJsb2NrKi8KKwkgICAgc3BhY2VzID0geV93aWR0aCArIDE7CisJICAgIGZvciAoaiA9IDA7IGogPCB5YW5rbGVuOyBqKyspCisJCXNwYWNlcyAtPSBsYnJfY2hhcnRhYnNpemUoJnlfYXJyYXlbaV1bal0sIDApOworCSAgICBpZiAoc3BhY2VzIDwgMCkKKwkJc3BhY2VzID0gMDsKKworCSAgICAvKiBpbnNlcnQgdGhlIG5ldyB0ZXh0ICovCisJICAgIHRvdGxlbiA9IGNvdW50ICogKHlhbmtsZW4gKyBzcGFjZXMpICsgYmQuc3RhcnRzcGFjZXMgKyBiZC5lbmRzcGFjZXM7CisJICAgIG5ld3AgPSBhbGxvY19jaGVjaygodW5zaWduZWQpdG90bGVuICsgb2xkbGVuICsgMSk7CisJICAgIGlmIChuZXdwID09IE5VTEwpCisJCWJyZWFrOworCSAgICAvKiBjb3B5IHBhcnQgdXAgdG8gY3Vyc29yIHRvIG5ldyBsaW5lICovCisJICAgIHB0ciA9IG5ld3A7CisJICAgIG1jaF9tZW1tb3ZlKHB0ciwgb2xkcCwgKHNpemVfdCliZC50ZXh0Y29sKTsKKwkgICAgcHRyICs9IGJkLnRleHRjb2w7CisJICAgIC8qIG1heSBpbnNlcnQgc29tZSBzcGFjZXMgYmVmb3JlIHRoZSBuZXcgdGV4dCAqLworCSAgICBjb3B5X3NwYWNlcyhwdHIsIChzaXplX3QpYmQuc3RhcnRzcGFjZXMpOworCSAgICBwdHIgKz0gYmQuc3RhcnRzcGFjZXM7CisJICAgIC8qIGluc2VydCB0aGUgbmV3IHRleHQgKi8KKwkgICAgZm9yIChqID0gMDsgaiA8IGNvdW50OyArK2opCisJICAgIHsKKwkJbWNoX21lbW1vdmUocHRyLCB5X2FycmF5W2ldLCAoc2l6ZV90KXlhbmtsZW4pOworCQlwdHIgKz0geWFua2xlbjsKKworCQkvKiBpbnNlcnQgYmxvY2sncyB0cmFpbGluZyBzcGFjZXMgb25seSBpZiB0aGVyZSdzIHRleHQgYmVoaW5kICovCisJCWlmICgoaiA8IGNvdW50IC0gMSB8fCAhc2hvcnRsaW5lKSAmJiBzcGFjZXMpCisJCXsKKwkJICAgIGNvcHlfc3BhY2VzKHB0ciwgKHNpemVfdClzcGFjZXMpOworCQkgICAgcHRyICs9IHNwYWNlczsKKwkJfQorCSAgICB9CisJICAgIC8qIG1heSBpbnNlcnQgc29tZSBzcGFjZXMgYWZ0ZXIgdGhlIG5ldyB0ZXh0ICovCisJICAgIGNvcHlfc3BhY2VzKHB0ciwgKHNpemVfdCliZC5lbmRzcGFjZXMpOworCSAgICBwdHIgKz0gYmQuZW5kc3BhY2VzOworCSAgICAvKiBtb3ZlIHRoZSB0ZXh0IGFmdGVyIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkgICAgbWNoX21lbW1vdmUocHRyLCBvbGRwICsgYmQudGV4dGNvbCArIGRlbGNvdW50LAorCQkJCShzaXplX3QpKG9sZGxlbiAtIGJkLnRleHRjb2wgLSBkZWxjb3VudCArIDEpKTsKKwkgICAgbWxfcmVwbGFjZShjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG5ld3AsIEZBTFNFKTsKKworCSAgICArK2N1cndpbi0+d19jdXJzb3IubG51bTsKKwkgICAgaWYgKGkgPT0gMCkKKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gYmQuc3RhcnRzcGFjZXM7CisJfQorCisJY2hhbmdlZF9saW5lcyhsbnVtLCAwLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0sIG5yX2xpbmVzKTsKKworCS8qIFNldCAnWyBtYXJrLiAqLworCWN1cmJ1Zi0+Yl9vcF9zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSBsbnVtOworCisJLyogYWRqdXN0ICddIG1hcmsgKi8KKwljdXJidWYtPmJfb3BfZW5kLmxudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSAxOworCWN1cmJ1Zi0+Yl9vcF9lbmQuY29sID0gYmQudGV4dGNvbCArIHRvdGxlbiAtIDE7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWN1cmJ1Zi0+Yl9vcF9lbmQuY29sYWRkID0gMDsKKyNlbmRpZgorCWlmIChmbGFncyAmIFBVVF9DVVJTRU5EKQorCXsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9IGN1cmJ1Zi0+Yl9vcF9lbmQ7CisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sKys7CisJfQorCWVsc2UKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCS8qCisJICogQ2hhcmFjdGVyIG9yIExpbmUgbW9kZQorCSAqLworCWlmICh5X3R5cGUgPT0gTUNIQVIpCisJeworCSAgICAvKiBpZiB0eXBlIGlzIE1DSEFSLCBGT1JXQVJEIGlzIHRoZSBzYW1lIGFzIEJBQ0tXQVJEIG9uIHRoZSBuZXh0CisJICAgICAqIGNoYXIgKi8KKwkgICAgaWYgKGRpciA9PSBGT1JXQVJEICYmIGdjaGFyX2N1cnNvcigpICE9IE5VTCkKKwkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJeworCQkgICAgaW50IGJ5dGVsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKG1sX2dldF9jdXJzb3IoKSk7CisKKwkJICAgIC8qIHB1dCBpdCBvbiB0aGUgbmV4dCBvZiB0aGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICovCisJCSAgICBjb2wgKz0gYnl0ZWxlbjsKKwkJICAgIGlmICh5YW5rbGVuKQorCQkgICAgeworCQkJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gYnl0ZWxlbjsKKwkJCWN1cmJ1Zi0+Yl9vcF9lbmQuY29sICs9IGJ5dGVsZW47CisJCSAgICB9CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgICsrY29sOworCQkgICAgaWYgKHlhbmtsZW4pCisJCSAgICB7CisJCQkrK2N1cndpbi0+d19jdXJzb3IuY29sOworCQkJKytjdXJidWYtPmJfb3BfZW5kLmNvbDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIG5ld19jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBjdXJidWYtPmJfb3Bfc3RhcnQgPSBjdXJ3aW4tPndfY3Vyc29yOworCX0KKwkvKgorCSAqIExpbmUgbW9kZTogQkFDS1dBUkQgaXMgdGhlIHNhbWUgYXMgRk9SV0FSRCBvbiB0aGUgcHJldmlvdXMgbGluZQorCSAqLworCWVsc2UgaWYgKGRpciA9PSBCQUNLV0FSRCkKKwkgICAgLS1sbnVtOworCisJLyoKKwkgKiBzaW1wbGUgY2FzZTogaW5zZXJ0IGludG8gY3VycmVudCBsaW5lCisJICovCisJaWYgKHlfdHlwZSA9PSBNQ0hBUiAmJiB5X3NpemUgPT0gMSkKKwl7CisJICAgIHRvdGxlbiA9IGNvdW50ICogeWFua2xlbjsKKwkgICAgaWYgKHRvdGxlbikKKwkgICAgeworCQlvbGRwID0gbWxfZ2V0KGxudW0pOworCQluZXdwID0gYWxsb2NfY2hlY2soKHVuc2lnbmVkKShTVFJMRU4ob2xkcCkgKyB0b3RsZW4gKyAxKSk7CisJCWlmIChuZXdwID09IE5VTEwpCisJCSAgICBnb3RvIGVuZDsJCS8qIGFsbG9jKCkgd2lsbCBnaXZlIGVycm9yIG1lc3NhZ2UgKi8KKwkJbWNoX21lbW1vdmUobmV3cCwgb2xkcCwgKHNpemVfdCljb2wpOworCQlwdHIgPSBuZXdwICsgY29sOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJeworCQkgICAgbWNoX21lbW1vdmUocHRyLCB5X2FycmF5WzBdLCAoc2l6ZV90KXlhbmtsZW4pOworCQkgICAgcHRyICs9IHlhbmtsZW47CisJCX0KKwkJbWNoX21lbW1vdmUocHRyLCBvbGRwICsgY29sLCBTVFJMRU4ob2xkcCArIGNvbCkgKyAxKTsKKwkJbWxfcmVwbGFjZShsbnVtLCBuZXdwLCBGQUxTRSk7CisJCS8qIFB1dCBjdXJzb3Igb24gbGFzdCBwdXR0ZWQgY2hhci4gKi8KKwkJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gKGNvbG5yX1QpKHRvdGxlbiAtIDEpOworCSAgICB9CisJICAgIGN1cmJ1Zi0+Yl9vcF9lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICAvKiBGb3IgIkNUUkwtTyBwIiBpbiBJbnNlcnQgbW9kZSwgcHV0IGN1cnNvciBhZnRlciBsYXN0IGNoYXIgKi8KKwkgICAgaWYgKHRvdGxlbiAmJiAocmVzdGFydF9lZGl0ICE9IDAgfHwgKGZsYWdzICYgUFVUX0NVUlNFTkQpKSkKKwkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwkgICAgY2hhbmdlZF9ieXRlcyhsbnVtLCBjb2wpOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJbnNlcnQgYXQgbGVhc3Qgb25lIGxpbmUuICBXaGVuIHlfdHlwZSBpcyBNQ0hBUiwgYnJlYWsgdGhlIGZpcnN0CisJICAgICAqIGxpbmUgaW4gdHdvLgorCSAgICAgKi8KKwkgICAgZm9yIChjbnQgPSAxOyBjbnQgPD0gY291bnQ7ICsrY250KQorCSAgICB7CisJCWkgPSAwOworCQlpZiAoeV90eXBlID09IE1DSEFSKQorCQl7CisJCSAgICAvKgorCQkgICAgICogU3BsaXQgdGhlIGN1cnJlbnQgbGluZSBpbiB0d28gYXQgdGhlIGluc2VydCBwb3NpdGlvbi4KKwkJICAgICAqIEZpcnN0IGluc2VydCB5X2FycmF5W3NpemUgLSAxXSBpbiBmcm9udCBvZiBzZWNvbmQgbGluZS4KKwkJICAgICAqIFRoZW4gYXBwZW5kIHlfYXJyYXlbMF0gdG8gZmlyc3QgbGluZS4KKwkJICAgICAqLworCQkgICAgbG51bSA9IG5ld19jdXJzb3IubG51bTsKKwkJICAgIHB0ciA9IG1sX2dldChsbnVtKSArIGNvbDsKKwkJICAgIHRvdGxlbiA9IChpbnQpU1RSTEVOKHlfYXJyYXlbeV9zaXplIC0gMV0pOworCQkgICAgbmV3cCA9IGFsbG9jX2NoZWNrKCh1bnNpZ25lZCkoU1RSTEVOKHB0cikgKyB0b3RsZW4gKyAxKSk7CisJCSAgICBpZiAobmV3cCA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKKwkJICAgIFNUUkNQWShuZXdwLCB5X2FycmF5W3lfc2l6ZSAtIDFdKTsKKwkJICAgIFNUUkNBVChuZXdwLCBwdHIpOworCQkgICAgLyogaW5zZXJ0IHNlY29uZCBsaW5lICovCisJCSAgICBtbF9hcHBlbmQobG51bSwgbmV3cCwgKGNvbG5yX1QpMCwgRkFMU0UpOworCQkgICAgdmltX2ZyZWUobmV3cCk7CisKKwkJICAgIG9sZHAgPSBtbF9nZXQobG51bSk7CisJCSAgICBuZXdwID0gYWxsb2NfY2hlY2soKHVuc2lnbmVkKShjb2wgKyB5YW5rbGVuICsgMSkpOworCQkgICAgaWYgKG5ld3AgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CisJCQkJCSAgICAvKiBjb3B5IGZpcnN0IHBhcnQgb2YgbGluZSAqLworCQkgICAgbWNoX21lbW1vdmUobmV3cCwgb2xkcCwgKHNpemVfdCljb2wpOworCQkJCQkgICAgLyogYXBwZW5kIHRvIGZpcnN0IGxpbmUgKi8KKwkJICAgIG1jaF9tZW1tb3ZlKG5ld3AgKyBjb2wsIHlfYXJyYXlbMF0sIChzaXplX3QpKHlhbmtsZW4gKyAxKSk7CisJCSAgICBtbF9yZXBsYWNlKGxudW0sIG5ld3AsIEZBTFNFKTsKKworCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwkJICAgIGkgPSAxOworCQl9CisKKwkJZm9yICg7IGkgPCB5X3NpemU7ICsraSkKKwkJeworCQkgICAgaWYgKCh5X3R5cGUgIT0gTUNIQVIgfHwgaSA8IHlfc2l6ZSAtIDEpCisJCQkgICAgJiYgbWxfYXBwZW5kKGxudW0sIHlfYXJyYXlbaV0sIChjb2xucl9UKTAsIEZBTFNFKQorCQkJCQkJCQkgICAgICA9PSBGQUlMKQorCQkJICAgIGdvdG8gZXJyb3I7CisJCSAgICBsbnVtKys7CisJCSAgICArK25yX2xpbmVzOworCQkgICAgaWYgKGZsYWdzICYgUFVUX0ZJWElOREVOVCkKKwkJICAgIHsKKwkJCW9sZF9wb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwkJCXB0ciA9IG1sX2dldChsbnVtKTsKKwkJCWlmIChjbnQgPT0gY291bnQgJiYgaSA9PSB5X3NpemUgLSAxKQorCQkJICAgIGxlbmRpZmYgPSAoaW50KVNUUkxFTihwdHIpOworI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpCisJCQlpZiAoKnB0ciA9PSAnIycgJiYgcHJlcHJvY3NfbGVmdCgpKQorCQkJICAgIGluZGVudCA9IDA7ICAgICAvKiBMZWF2ZSAjIGxpbmVzIGF0IHN0YXJ0ICovCisJCQllbHNlCisjZW5kaWYKKwkJCSAgICAgaWYgKCpwdHIgPT0gTlVMKQorCQkJICAgIGluZGVudCA9IDA7ICAgICAvKiBJZ25vcmUgZW1wdHkgbGluZXMgKi8KKwkJCWVsc2UgaWYgKGZpcnN0X2luZGVudCkKKwkJCXsKKwkJCSAgICBpbmRlbnRfZGlmZiA9IG9yaWdfaW5kZW50IC0gZ2V0X2luZGVudCgpOworCQkJICAgIGluZGVudCA9IG9yaWdfaW5kZW50OworCQkJICAgIGZpcnN0X2luZGVudCA9IEZBTFNFOworCQkJfQorCQkJZWxzZSBpZiAoKGluZGVudCA9IGdldF9pbmRlbnQoKSArIGluZGVudF9kaWZmKSA8IDApCisJCQkgICAgaW5kZW50ID0gMDsKKwkJCSh2b2lkKXNldF9pbmRlbnQoaW5kZW50LCAwKTsKKwkJCWN1cndpbi0+d19jdXJzb3IgPSBvbGRfcG9zOworCQkJLyogcmVtZW1iZXIgaG93IG1hbnkgY2hhcnMgd2VyZSByZW1vdmVkICovCisJCQlpZiAoY250ID09IGNvdW50ICYmIGkgPT0geV9zaXplIC0gMSkKKwkJCSAgICBsZW5kaWZmIC09IChpbnQpU1RSTEVOKG1sX2dldChsbnVtKSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCitlcnJvcjoKKwkgICAgLyogQWRqdXN0IG1hcmtzLiAqLworCSAgICBpZiAoeV90eXBlID09IE1MSU5FKQorCSAgICB7CisJCWN1cmJ1Zi0+Yl9vcF9zdGFydC5jb2wgPSAwOworCQlpZiAoZGlyID09IEZPUldBUkQpCisJCSAgICBjdXJidWYtPmJfb3Bfc3RhcnQubG51bSsrOworCSAgICB9CisJICAgIG1hcmtfYWRqdXN0KGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtICsgKHlfdHlwZSA9PSBNQ0hBUiksCisJCQkJCSAgICAgKGxpbmVucl9UKU1BWExOVU0sIG5yX2xpbmVzLCAwTCk7CisKKwkgICAgLyogbm90ZSBjaGFuZ2VkIHRleHQgZm9yIGRpc3BsYXlpbmcgYW5kIGZvbGRpbmcgKi8KKwkgICAgaWYgKHlfdHlwZSA9PSBNQ0hBUikKKwkJY2hhbmdlZF9saW5lcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGNvbCwKKwkJCQkJIGN1cndpbi0+d19jdXJzb3IubG51bSArIDEsIG5yX2xpbmVzKTsKKwkgICAgZWxzZQorCQljaGFuZ2VkX2xpbmVzKGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtLCAwLAorCQkJCQkgICBjdXJidWYtPmJfb3Bfc3RhcnQubG51bSwgbnJfbGluZXMpOworCisJICAgIC8qIHB1dCAnXSBtYXJrIGF0IGxhc3QgaW5zZXJ0ZWQgY2hhcmFjdGVyICovCisJICAgIGN1cmJ1Zi0+Yl9vcF9lbmQubG51bSA9IGxudW07CisJICAgIC8qIGNvcnJlY3QgbGVuZ3RoIGZvciBjaGFuZ2UgaW4gaW5kZW50ICovCisJICAgIGNvbCA9IChjb2xucl9UKVNUUkxFTih5X2FycmF5W3lfc2l6ZSAtIDFdKSAtIGxlbmRpZmY7CisJICAgIGlmIChjb2wgPiAxKQorCQljdXJidWYtPmJfb3BfZW5kLmNvbCA9IGNvbCAtIDE7CisJICAgIGVsc2UKKwkJY3VyYnVmLT5iX29wX2VuZC5jb2wgPSAwOworCisJICAgIGlmIChmbGFncyAmIFBVVF9DVVJTRU5EKQorCSAgICB7CisJCS8qIHB1dCBjdXJzb3IgYWZ0ZXIgaW5zZXJ0ZWQgdGV4dCAqLworCQlpZiAoeV90eXBlID09IE1MSU5FKQorCQl7CisJCSAgICBpZiAobG51bSA+PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCQkgICAgZWxzZQorCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bSArIDE7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBsbnVtOworCQkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBjb2w7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmICh5X3R5cGUgPT0gTUxJTkUpCisJICAgIHsKKwkJLyogcHV0IGN1cnNvciBvbmZpcnN0IG5vbi1ibGFuayBpbiBmaXJzdCBpbnNlcnRlZCBsaW5lICovCisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwkJaWYgKGRpciA9PSBGT1JXQVJEKQorCQkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCWJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisJICAgIH0KKwkgICAgZWxzZQkvKiBwdXQgY3Vyc29yIG9uIGZpcnN0IGluc2VydGVkIGNoYXJhY3RlciAqLworCQljdXJ3aW4tPndfY3Vyc29yID0gbmV3X2N1cnNvcjsKKwl9CisgICAgfQorCisgICAgbXNnbW9yZShucl9saW5lcyk7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKK2VuZDoKKyAgICBpZiAoYWxsb2NhdGVkKQorICAgIHsKKwl2aW1fZnJlZShpbnNlcnRfc3RyaW5nKTsKKwlpZiAocmVnbmFtZSA9PSAnPScpCisJICAgIHZpbV9mcmVlKHlfYXJyYXkpOworICAgIH0KKyAgICBpZiAoZ2NoYXJfY3Vyc29yKCkgPT0gTlVMCisJICAgICYmIGN1cndpbi0+d19jdXJzb3IuY29sID4gMAorCSAgICAmJiAhKHJlc3RhcnRfZWRpdCB8fCAoU3RhdGUgJiBJTlNFUlQpKSkKKyAgICB7CisJLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJaWYgKHZlX2ZsYWdzID09IFZFX0FMTCkKKwkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZDsKKyNlbmRpZgorICAgIH0KK30KKworI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgaWYgbGluZXMgc3RhcnRpbmcgd2l0aCAnIycgc2hvdWxkIGJlIGxlZnQgYWxpZ25lZC4KKyAqLworICAgIGludAorcHJlcHJvY3NfbGVmdCgpCit7CisgICAgcmV0dXJuCisjIGlmZGVmIEZFQVRfU01BUlRJTkRFTlQKKyMgIGlmZGVmIEZFQVRfQ0lOREVOVAorCShjdXJidWYtPmJfcF9zaSAmJiAhY3VyYnVmLT5iX3BfY2luKSB8fAorIyAgZWxzZQorCWN1cmJ1Zi0+Yl9wX3NpCisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0NJTkRFTlQKKwkoY3VyYnVmLT5iX3BfY2luICYmIGluX2NpbmtleXMoJyMnLCAnICcsIFRSVUUpKQorIyBlbmRpZgorCTsKK30KKyNlbmRpZgorCisvKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBuYW1lIG9mIHRoZSByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiBudW1iZXIgKi8KKyAgICBpbnQKK2dldF9yZWdpc3Rlcl9uYW1lKG51bSkKKyAgICBpbnQgbnVtOworeworICAgIGlmIChudW0gPT0gLTEpCisJcmV0dXJuICciJzsKKyAgICBlbHNlIGlmIChudW0gPCAxMCkKKwlyZXR1cm4gbnVtICsgJzAnOworICAgIGVsc2UgaWYgKG51bSA9PSBERUxFVElPTl9SRUdJU1RFUikKKwlyZXR1cm4gJy0nOworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgZWxzZSBpZiAobnVtID09IFNUQVJfUkVHSVNURVIpCisJcmV0dXJuICcqJzsKKyAgICBlbHNlIGlmIChudW0gPT0gUExVU19SRUdJU1RFUikKKwlyZXR1cm4gJysnOworI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBFQkNESUMKKwlpbnQgaTsKKworCS8qIEVCQ0RJQyBpcyByZWFsbHkgYnJhaW5kZWFkIC4uLiAqLworCWkgPSAnYScgKyAobnVtIC0gMTApOworCWlmIChpID4gJ2knKQorCSAgICBpICs9IDc7CisJaWYgKGkgPiAncicpCisJICAgIGkgKz0gODsKKwlyZXR1cm4gaTsKKyNlbHNlCisJcmV0dXJuIG51bSArICdhJyAtIDEwOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogIjpkaXMiIGFuZCAiOnJlZ2lzdGVycyI6IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSB5YW5rIHJlZ2lzdGVycy4KKyAqLworICAgIHZvaWQKK2V4X2Rpc3BsYXkoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpbnQJCQlpLCBuOworICAgIGxvbmcJCWo7CisgICAgY2hhcl91CQkqcDsKKyAgICBzdHJ1Y3QgeWFua3JlZwkqeWI7CisgICAgaW50CQkJbmFtZTsKKyAgICBpbnQJCQlhdHRyOworICAgIGNoYXJfdQkJKmFyZyA9IGVhcC0+YXJnOworCisgICAgaWYgKGFyZyAhPSBOVUxMICYmICphcmcgPT0gTlVMKQorCWFyZyA9IE5VTEw7CisgICAgYXR0ciA9IGhsX2F0dHIoSExGXzgpOworCisgICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCisgICAgTVNHX1BVVFNfVElUTEUoXygiXG4tLS0gUmVnaXN0ZXJzIC0tLSIpKTsKKyAgICBmb3IgKGkgPSAtMTsgaSA8IE5VTV9SRUdJU1RFUlMgJiYgIWdvdF9pbnQ7ICsraSkKKyAgICB7CisJbmFtZSA9IGdldF9yZWdpc3Rlcl9uYW1lKGkpOworCWlmIChhcmcgIT0gTlVMTCAmJiB2aW1fc3RyY2hyKGFyZywgbmFtZSkgPT0gTlVMTCkKKwkgICAgY29udGludWU7CSAgICAvKiBkaWQgbm90IGFzayBmb3IgdGhpcyByZWdpc3RlciAqLworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkvKiBBZGp1c3QgcmVnaXN0ZXIgbmFtZSBmb3IgInVubmFtZWQiIGluICdjbGlwYm9hcmQnLgorCSAqIFdoZW4gaXQncyBhIGNsaXBib2FyZCByZWdpc3RlciwgZmlsbCBpdCB3aXRoIHRoZSBjdXJyZW50IGNvbnRlbnRzCisJICogb2YgdGhlIGNsaXBib2FyZC4gICovCisJYWRqdXN0X2NsaXBfcmVnKCZuYW1lKTsKKwkodm9pZCltYXlfZ2V0X3NlbGVjdGlvbihuYW1lKTsKKyNlbmRpZgorCisJaWYgKGkgPT0gLTEpCisJeworCSAgICBpZiAoeV9wcmV2aW91cyAhPSBOVUxMKQorCQl5YiA9IHlfcHJldmlvdXM7CisJICAgIGVsc2UKKwkJeWIgPSAmKHlfcmVnc1swXSk7CisJfQorCWVsc2UKKwkgICAgeWIgPSAmKHlfcmVnc1tpXSk7CisJaWYgKHliLT55X2FycmF5ICE9IE5VTEwpCisJeworCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKwkgICAgbXNnX3B1dGNoYXIoJyInKTsKKwkgICAgbXNnX3B1dGNoYXIobmFtZSk7CisJICAgIE1TR19QVVRTKCIgICAiKTsKKworCSAgICBuID0gKGludClDb2x1bW5zIC0gNjsKKwkgICAgZm9yIChqID0gMDsgaiA8IHliLT55X3NpemUgJiYgbiA+IDE7ICsraikKKwkgICAgeworCQlpZiAoaikKKwkJeworCQkgICAgTVNHX1BVVFNfQVRUUigiXkoiLCBhdHRyKTsKKwkJICAgIG4gLT0gMjsKKwkJfQorCQlmb3IgKHAgPSB5Yi0+eV9hcnJheVtqXTsgKnAgJiYgKG4gLT0gcHRyMmNlbGxzKHApKSA+PSAwOyArK3ApCisJCXsKKwkJICAgIG1zZ19vdXR0cmFuc19sZW4ocCwgMSk7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgaWYgKGhhc19tYnl0ZSkKKwkJCXAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7CisjZW5kaWYKKwkJfQorCSAgICB9CisJICAgIGlmIChuID4gMSAmJiB5Yi0+eV90eXBlID09IE1MSU5FKQorCQlNU0dfUFVUU19BVFRSKCJeSiIsIGF0dHIpOworCSAgICBvdXRfZmx1c2goKTsJCSAgICAvKiBzaG93IG9uZSBsaW5lIGF0IGEgdGltZSAqLworCX0KKwl1aV9icmVha2NoZWNrKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBkaXNwbGF5IGxhc3QgaW5zZXJ0ZWQgdGV4dAorICAgICAqLworICAgIGlmICgocCA9IGdldF9sYXN0X2luc2VydCgpKSAhPSBOVUxMCisJCSAmJiAoYXJnID09IE5VTEwgfHwgdmltX3N0cmNocihhcmcsICcuJykgIT0gTlVMTCkgJiYgIWdvdF9pbnQpCisgICAgeworCU1TR19QVVRTKCJcblwiLiAgICIpOworCWRpc19tc2cocCwgVFJVRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBkaXNwbGF5IGxhc3QgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgaWYgKGxhc3RfY21kbGluZSAhPSBOVUxMICYmIChhcmcgPT0gTlVMTCB8fCB2aW1fc3RyY2hyKGFyZywgJzonKSAhPSBOVUxMKQorCQkJCQkJCQkgICYmICFnb3RfaW50KQorICAgIHsKKwlNU0dfUFVUUygiXG5cIjogICAiKTsKKwlkaXNfbXNnKGxhc3RfY21kbGluZSwgRkFMU0UpOworICAgIH0KKworICAgIC8qCisgICAgICogZGlzcGxheSBjdXJyZW50IGZpbGUgbmFtZQorICAgICAqLworICAgIGlmIChjdXJidWYtPmJfZm5hbWUgIT0gTlVMTAorCSAgICAmJiAoYXJnID09IE5VTEwgfHwgdmltX3N0cmNocihhcmcsICclJykgIT0gTlVMTCkgJiYgIWdvdF9pbnQpCisgICAgeworCU1TR19QVVRTKCJcblwiJSAgICIpOworCWRpc19tc2coY3VyYnVmLT5iX2ZuYW1lLCBGQUxTRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBkaXNwbGF5IGFsdGVybmF0ZSBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBpZiAoKGFyZyA9PSBOVUxMIHx8IHZpbV9zdHJjaHIoYXJnLCAnJScpICE9IE5VTEwpICYmICFnb3RfaW50KQorICAgIHsKKwljaGFyX3UJICAgICpmbmFtZTsKKwlsaW5lbnJfVCAgICBkdW1teTsKKworCWlmIChidWZsaXN0X25hbWVfbnIoMCwgJmZuYW1lLCAmZHVtbXkpICE9IEZBSUwpCisJeworCSAgICBNU0dfUFVUUygiXG5cIiMgICAiKTsKKwkgICAgZGlzX21zZyhmbmFtZSwgRkFMU0UpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIGRpc3BsYXkgbGFzdCBzZWFyY2ggcGF0dGVybgorICAgICAqLworICAgIGlmIChsYXN0X3NlYXJjaF9wYXQoKSAhPSBOVUxMCisJCSAmJiAoYXJnID09IE5VTEwgfHwgdmltX3N0cmNocihhcmcsICcvJykgIT0gTlVMTCkgJiYgIWdvdF9pbnQpCisgICAgeworCU1TR19QVVRTKCJcblwiLyAgICIpOworCWRpc19tc2cobGFzdF9zZWFyY2hfcGF0KCksIEZBTFNFKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICAvKgorICAgICAqIGRpc3BsYXkgbGFzdCB1c2VkIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBpZiAoZXhwcl9saW5lICE9IE5VTEwgJiYgKGFyZyA9PSBOVUxMIHx8IHZpbV9zdHJjaHIoYXJnLCAnPScpICE9IE5VTEwpCisJCQkJCQkJCSAgJiYgIWdvdF9pbnQpCisgICAgeworCU1TR19QVVRTKCJcblwiPSAgICIpOworCWRpc19tc2coZXhwcl9saW5lLCBGQUxTRSk7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBkaXNwbGF5IGEgc3RyaW5nIGZvciBkb19kaXMoKQorICogdHJ1bmNhdGUgYXQgZW5kIG9mIHNjcmVlbiBsaW5lCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlzX21zZyhwLCBza2lwX2VzYykKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlza2lwX2VzYzsJICAgIC8qIGlmIFRSVUUsIGlnbm9yZSB0cmFpbGluZyBFU0MgKi8KK3sKKyAgICBpbnQJCW47CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJbDsKKyNlbmRpZgorCisgICAgbiA9IChpbnQpQ29sdW1ucyAtIDY7CisgICAgd2hpbGUgKCpwICE9IE5VTAorCSAgICAmJiAhKCpwID09IEVTQyAmJiBza2lwX2VzYyAmJiAqKHAgKyAxKSA9PSBOVUwpCisJICAgICYmIChuIC09IHB0cjJjZWxscyhwKSkgPj0gMCkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKSA+IDEpCisJeworCSAgICBtc2dfb3V0dHJhbnNfbGVuKHAsIGwpOworCSAgICBwICs9IGw7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBtc2dfb3V0dHJhbnNfbGVuKHArKywgMSk7CisgICAgfQorICAgIHVpX2JyZWFrY2hlY2soKTsKK30KKworLyoKKyAqIGpvaW4gJ2NvdW50JyBsaW5lcyAobWluaW1hbCAyKSwgaW5jbHVkaW5nIHVfc2F2ZSgpCisgKi8KKyAgICB2b2lkCitkb19kb19qb2luKGNvdW50LCBpbnNlcnRfc3BhY2UpCisgICAgbG9uZyAgICBjb3VudDsKKyAgICBpbnQJICAgIGluc2VydF9zcGFjZTsKK3sKKyAgICBpZiAodV9zYXZlKChsaW5lbnJfVCkoY3Vyd2luLT53X2N1cnNvci5sbnVtIC0gMSksCisJCSAgICAobGluZW5yX1QpKGN1cndpbi0+d19jdXJzb3IubG51bSArIGNvdW50KSkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICB3aGlsZSAoLS1jb3VudCA+IDApCisgICAgeworCWxpbmVfYnJlYWtjaGVjaygpOworCWlmIChnb3RfaW50IHx8IGRvX2pvaW4oaW5zZXJ0X3NwYWNlKSA9PSBGQUlMKQorCXsKKwkgICAgYmVlcF9mbHVzaCgpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisjaWYgMAorICAgIC8qCisgICAgICogTmVlZCB0byB1cGRhdGUgdGhlIHNjcmVlbiBpZiB0aGUgbGluZSB3aGVyZSB0aGUgY3Vyc29yIGlzIGJlY2FtZSB0b28KKyAgICAgKiBsb25nIHRvIGZpdCBvbiB0aGUgc2NyZWVuLgorICAgICAqLworICAgIHVwZGF0ZV90b3BsaW5lX3JlZHJhdygpOworI2VuZGlmCit9CisKKy8qCisgKiBKb2luIHR3byBsaW5lcyBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICogInJlZHJhdyIgaXMgVFJVRSB3aGVuIHRoZSBzY3JlZW4gc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBDYWxsZXIgbXVzdCBoYXZlIHNldHVwIGZvciB1bmRvLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvaHRlcndpc2UKKyAqLworICAgIGludAorZG9fam9pbihpbnNlcnRfc3BhY2UpCisgICAgaW50CQlpbnNlcnRfc3BhY2U7Cit7CisgICAgY2hhcl91CSpjdXJyOworICAgIGNoYXJfdQkqbmV4dCwgKm5leHRfc3RhcnQ7CisgICAgY2hhcl91CSpuZXdwOworICAgIGludAkJZW5kY3VycjEsIGVuZGN1cnIyOworICAgIGludAkJY3VycnNpemU7CS8qIHNpemUgb2YgdGhlIGN1cnJlbnQgbGluZSAqLworICAgIGludAkJbmV4dHNpemU7CS8qIHNpemUgb2YgdGhlIG5leHQgbGluZSAqLworICAgIGludAkJc3BhY2VzOwkJLyogbnVtYmVyIG9mIHNwYWNlcyB0byBpbnNlcnQgKi8KKyAgICBsaW5lbnJfVAl0OworCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA9PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwlyZXR1cm4gRkFJTDsJCS8qIGNhbid0IGpvaW4gb24gbGFzdCBsaW5lICovCisKKyAgICBjdXJyID0gbWxfZ2V0X2N1cmxpbmUoKTsKKyAgICBjdXJyc2l6ZSA9IChpbnQpU1RSTEVOKGN1cnIpOworICAgIGVuZGN1cnIxID0gZW5kY3VycjIgPSBOVUw7CisgICAgaWYgKGluc2VydF9zcGFjZSAmJiBjdXJyc2l6ZSA+IDApCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgbmV4dCA9IGN1cnIgKyBjdXJyc2l6ZSAtIDE7CisJICAgIG5leHQgLT0gKCptYl9oZWFkX29mZikoY3VyciwgbmV4dCk7CisJICAgIGVuZGN1cnIxID0gKCptYl9wdHIyY2hhcikobmV4dCk7CisJICAgIGlmIChuZXh0ID4gY3VycikKKwkgICAgeworCQktLW5leHQ7CisJCW5leHQgLT0gKCptYl9oZWFkX29mZikoY3VyciwgbmV4dCk7CisJCWVuZGN1cnIyID0gKCptYl9wdHIyY2hhcikobmV4dCk7CisJICAgIH0KKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBlbmRjdXJyMSA9ICooY3VyciArIGN1cnJzaXplIC0gMSk7CisJICAgIGlmIChjdXJyc2l6ZSA+IDEpCisJCWVuZGN1cnIyID0gKihjdXJyICsgY3VycnNpemUgLSAyKTsKKwl9CisgICAgfQorCisgICAgbmV4dCA9IG5leHRfc3RhcnQgPSBtbF9nZXQoKGxpbmVucl9UKShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyAxKSk7CisgICAgc3BhY2VzID0gMDsKKyAgICBpZiAoaW5zZXJ0X3NwYWNlKQorICAgIHsKKwluZXh0ID0gc2tpcHdoaXRlKG5leHQpOworCWlmICgqbmV4dCAhPSAnKScgJiYgY3VycnNpemUgIT0gMCAmJiBlbmRjdXJyMSAhPSBUQUIKKyNpZmRlZiBGRUFUX01CWVRFCisJCSYmICghaGFzX2Zvcm1hdF9vcHRpb24oRk9fTUJZVEVfSk9JTikKKwkJCXx8IChtYl9wdHIyY2hhcihuZXh0KSA8IDB4MTAwICYmIGVuZGN1cnIxIDwgMHgxMDApKQorCQkmJiAoIWhhc19mb3JtYXRfb3B0aW9uKEZPX01CWVRFX0pPSU4yKQorCQkJfHwgbWJfcHRyMmNoYXIobmV4dCkgPCAweDEwMCB8fCBlbmRjdXJyMSA8IDB4MTAwKQorI2VuZGlmCisJCSkKKwl7CisJICAgIC8qIGRvbid0IGFkZCBhIHNwYWNlIGlmIHRoZSBsaW5lIGlzIGVuZGluZyBpbiBhIHNwYWNlICovCisJICAgIGlmIChlbmRjdXJyMSA9PSAnICcpCisJCWVuZGN1cnIxID0gZW5kY3VycjI7CisJICAgIGVsc2UKKwkJKytzcGFjZXM7CisJICAgIC8qIGV4dHJhIHNwYWNlIHdoZW4gJ2pvaW5zcGFjZXMnIHNldCBhbmQgbGluZSBlbmRzIGluICcuJyAqLworCSAgICBpZiAoICAgICAgIHBfanMKKwkJICAgICYmIChlbmRjdXJyMSA9PSAnLicKKwkJCXx8ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fSk9JTlNQKSA9PSBOVUxMCisJCQkgICAgJiYgKGVuZGN1cnIxID09ICc/JyB8fCBlbmRjdXJyMSA9PSAnIScpKSkpCisJCSsrc3BhY2VzOworCX0KKyAgICB9CisgICAgbmV4dHNpemUgPSAoaW50KVNUUkxFTihuZXh0KTsKKworICAgIG5ld3AgPSBhbGxvY19jaGVjaygodW5zaWduZWQpKGN1cnJzaXplICsgbmV4dHNpemUgKyBzcGFjZXMgKyAxKSk7CisgICAgaWYgKG5ld3AgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qCisgICAgICogSW5zZXJ0IHRoZSBuZXh0IGxpbmUgZmlyc3QsIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIHRoYXQgcG9pbnRlci4KKyAgICAgKiBDdXJyIGhhcyB0byBiZSBvYnRhaW5lZCBhZ2FpbiwgYmVjYXVzZSBnZXR0aW5nIG5leHQgd2lsbCBoYXZlCisgICAgICogaW52YWxpZGF0ZWQgaXQuCisgICAgICovCisgICAgbWNoX21lbW1vdmUobmV3cCArIGN1cnJzaXplICsgc3BhY2VzLCBuZXh0LCAoc2l6ZV90KShuZXh0c2l6ZSArIDEpKTsKKworICAgIGN1cnIgPSBtbF9nZXRfY3VybGluZSgpOworICAgIG1jaF9tZW1tb3ZlKG5ld3AsIGN1cnIsIChzaXplX3QpY3VycnNpemUpOworCisgICAgY29weV9zcGFjZXMobmV3cCArIGN1cnJzaXplLCAoc2l6ZV90KXNwYWNlcyk7CisKKyAgICBtbF9yZXBsYWNlKGN1cndpbi0+d19jdXJzb3IubG51bSwgbmV3cCwgRkFMU0UpOworCisgICAgLyogT25seSByZXBvcnQgdGhlIGNoYW5nZSBpbiB0aGUgZmlyc3QgbGluZSBoZXJlLCBkZWxfbGluZXMoKSB3aWxsIHJlcG9ydAorICAgICAqIHRoZSBkZWxldGVkIGxpbmUuICovCisgICAgY2hhbmdlZF9saW5lcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cnJzaXplLAorCQkJCQkgICAgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSwgMEwpOworCisgICAgLyoKKyAgICAgKiBEZWxldGUgdGhlIGZvbGxvd2luZyBsaW5lLiBUbyBkbyB0aGlzIHdlIG1vdmUgdGhlIGN1cnNvciB0aGVyZQorICAgICAqIGJyaWVmbHksIGFuZCB0aGVuIG1vdmUgaXQgYmFjay4gQWZ0ZXIgZGVsX2xpbmVzKCkgdGhlIGN1cnNvciBtYXkKKyAgICAgKiBoYXZlIG1vdmVkIHVwIChsYXN0IGxpbmUgZGVsZXRlZCksIHNvIHRoZSBjdXJyZW50IGxudW0gaXMga2VwdCBpbiB0LgorICAgICAqCisgICAgICogTW92ZSBtYXJrcyBmcm9tIHRoZSBkZWxldGVkIGxpbmUgdG8gdGhlIGpvaW5lZCBsaW5lLCBhZGp1c3RpbmcgdGhlCisgICAgICogY29sdW1uLiAgVGhpcyBpcyBub3QgVmkgY29tcGF0aWJsZSwgYnV0IFZpIGRlbGV0ZXMgdGhlIG1hcmtzLCB0aHVzIHRoYXQKKyAgICAgKiBzaG91bGQgbm90IHJlYWxseSBiZSBhIHByb2JsZW0uCisgICAgICovCisgICAgdCA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKyAgICBtYXJrX2NvbF9hZGp1c3QodCArIDEsIChjb2xucl9UKTAsIChsaW5lbnJfVCktMSwKKwkJCSAgICAgKGxvbmcpKGN1cnJzaXplICsgc3BhY2VzIC0gKG5leHQgLSBuZXh0X3N0YXJ0KSkpOworICAgICsrY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGRlbF9saW5lcygxTCwgRkFMU0UpOworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHQ7CisKKyAgICAvKgorICAgICAqIGdvIHRvIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgam9pbmVkIGxpbmUKKyAgICAgKi8KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGN1cnJzaXplOworICAgIGNoZWNrX2N1cnNvcl9jb2woKTsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIHR3byBjb21tZW50IGxlYWRlcnMgZ2l2ZW4gYXJlIHRoZSBzYW1lLiAgImxudW0iIGlzCisgKiB0aGUgZmlyc3QgbGluZS4gIFdoaXRlLXNwYWNlIGlzIGlnbm9yZWQuICBOb3RlIHRoYXQgdGhlIHdob2xlIG9mCisgKiAnbGVhZGVyMScgbXVzdCBtYXRjaCAnbGVhZGVyMl9sZW4nIGNoYXJhY3RlcnMgZnJvbSAnbGVhZGVyMicgLS0gd2ViYgorICovCisgICAgc3RhdGljIGludAorc2FtZV9sZWFkZXIobG51bSwgbGVhZGVyMV9sZW4sIGxlYWRlcjFfZmxhZ3MsIGxlYWRlcjJfbGVuLCBsZWFkZXIyX2ZsYWdzKQorICAgIGxpbmVucl9UIGxudW07CisgICAgaW50CSAgICBsZWFkZXIxX2xlbjsKKyAgICBjaGFyX3UgICpsZWFkZXIxX2ZsYWdzOworICAgIGludAkgICAgbGVhZGVyMl9sZW47CisgICAgY2hhcl91ICAqbGVhZGVyMl9mbGFnczsKK3sKKyAgICBpbnQJICAgIGlkeDEgPSAwLCBpZHgyID0gMDsKKyAgICBjaGFyX3UgICpwOworICAgIGNoYXJfdSAgKmxpbmUxOworICAgIGNoYXJfdSAgKmxpbmUyOworCisgICAgaWYgKGxlYWRlcjFfbGVuID09IDApCisJcmV0dXJuIChsZWFkZXIyX2xlbiA9PSAwKTsKKworICAgIC8qCisgICAgICogSWYgZmlyc3QgbGVhZGVyIGhhcyAnZicgZmxhZywgdGhlIGxpbmVzIGNhbiBiZSBqb2luZWQgb25seSBpZiB0aGUKKyAgICAgKiBzZWNvbmQgbGluZSBkb2VzIG5vdCBoYXZlIGEgbGVhZGVyLgorICAgICAqIElmIGZpcnN0IGxlYWRlciBoYXMgJ2UnIGZsYWcsIHRoZSBsaW5lcyBjYW4gbmV2ZXIgYmUgam9pbmVkLgorICAgICAqIElmIGZpc3QgbGVhZGVyIGhhcyAncycgZmxhZywgdGhlIGxpbmVzIGNhbiBvbmx5IGJlIGpvaW5lZCBpZiB0aGVyZSBpcworICAgICAqIHNvbWUgdGV4dCBhZnRlciBpdCBhbmQgdGhlIHNlY29uZCBsaW5lIGhhcyB0aGUgJ20nIGZsYWcuCisgICAgICovCisgICAgaWYgKGxlYWRlcjFfZmxhZ3MgIT0gTlVMTCkKKyAgICB7CisJZm9yIChwID0gbGVhZGVyMV9mbGFnczsgKnAgJiYgKnAgIT0gJzonOyArK3ApCisJeworCSAgICBpZiAoKnAgPT0gQ09NX0ZJUlNUKQorCQlyZXR1cm4gKGxlYWRlcjJfbGVuID09IDApOworCSAgICBpZiAoKnAgPT0gQ09NX0VORCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBpZiAoKnAgPT0gQ09NX1NUQVJUKQorCSAgICB7CisJCWlmICgqKG1sX2dldChsbnVtKSArIGxlYWRlcjFfbGVuKSA9PSBOVUwpCisJCSAgICByZXR1cm4gRkFMU0U7CisJCWlmIChsZWFkZXIyX2ZsYWdzID09IE5VTEwgfHwgbGVhZGVyMl9sZW4gPT0gMCkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkJZm9yIChwID0gbGVhZGVyMl9mbGFnczsgKnAgJiYgKnAgIT0gJzonOyArK3ApCisJCSAgICBpZiAoKnAgPT0gQ09NX01JRERMRSkKKwkJCXJldHVybiBUUlVFOworCQlyZXR1cm4gRkFMU0U7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgY3VycmVudCBsaW5lIGFuZCBuZXh0IGxpbmUsIGNvbXBhcmUgdGhlIGxlYWRlcnMuCisgICAgICogVGhlIGZpcnN0IGxpbmUgaGFzIHRvIGJlIHNhdmVkLCBvbmx5IG9uZSBsaW5lIGNhbiBiZSBsb2NrZWQgYXQgYSB0aW1lLgorICAgICAqLworICAgIGxpbmUxID0gdmltX3N0cnNhdmUobWxfZ2V0KGxudW0pKTsKKyAgICBpZiAobGluZTEgIT0gTlVMTCkKKyAgICB7CisJZm9yIChpZHgxID0gMDsgdmltX2lzd2hpdGUobGluZTFbaWR4MV0pOyArK2lkeDEpCisJICAgIDsKKwlsaW5lMiA9IG1sX2dldChsbnVtICsgMSk7CisJZm9yIChpZHgyID0gMDsgaWR4MiA8IGxlYWRlcjJfbGVuOyArK2lkeDIpCisJeworCSAgICBpZiAoIXZpbV9pc3doaXRlKGxpbmUyW2lkeDJdKSkKKwkgICAgeworCQlpZiAobGluZTFbaWR4MSsrXSAhPSBsaW5lMltpZHgyXSkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UKKwkJd2hpbGUgKHZpbV9pc3doaXRlKGxpbmUxW2lkeDFdKSkKKwkJICAgICsraWR4MTsKKwl9CisJdmltX2ZyZWUobGluZTEpOworICAgIH0KKyAgICByZXR1cm4gKGlkeDIgPT0gbGVhZGVyMl9sZW4gJiYgaWR4MSA9PSBsZWFkZXIxX2xlbik7Cit9CisjZW5kaWYKKworLyoKKyAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmb3JtYXQgb3BlcmF0b3IgJ2dxJworICovCisgICAgdm9pZAorb3BfZm9ybWF0KG9hcCwga2VlcF9jdXJzb3IpCisgICAgb3BhcmdfVAkqb2FwOworICAgIGludAkJa2VlcF9jdXJzb3I7CQkvKiBrZWVwIGN1cnNvciBvbiBzYW1lIHRleHQgY2hhciAqLworeworICAgIGxvbmcJb2xkX2xpbmVfY291bnQgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKworICAgIC8qIFBsYWNlIHRoZSBjdXJzb3Igd2hlcmUgdGhlICJncSIgb3IgImd3IiBjb21tYW5kIHdhcyBnaXZlbiwgc28gdGhhdCAidSIKKyAgICAgKiBjYW4gcHV0IGl0IGJhY2sgdGhlcmUuICovCisgICAgY3Vyd2luLT53X2N1cnNvciA9IG9hcC0+Y3Vyc29yX3N0YXJ0OworCisgICAgaWYgKHVfc2F2ZSgobGluZW5yX1QpKG9hcC0+c3RhcnQubG51bSAtIDEpLAorCQkJCSAgICAgICAobGluZW5yX1QpKG9hcC0+ZW5kLmxudW0gKyAxKSkgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgY3Vyd2luLT53X2N1cnNvciA9IG9hcC0+c3RhcnQ7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChvYXAtPmlzX1ZJc3VhbCkKKwkvKiBXaGVuIHRoZXJlIGlzIG5vIGNoYW5nZTogbmVlZCB0byByZW1vdmUgdGhlIFZpc3VhbCBzZWxlY3Rpb24gKi8KKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsKKyNlbmRpZgorCisgICAgLyogU2V0ICdbIG1hcmsgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmb3JtYXR0ZWQgYXJlYSAqLworICAgIGN1cmJ1Zi0+Yl9vcF9zdGFydCA9IG9hcC0+c3RhcnQ7CisKKyAgICAvKiBGb3IgImd3IiByZW1lbWJlciB0aGUgY3Vyc29yIHBvc2l0aW9uIGFuZCBwdXQgaXQgYmFjayBiZWxvdyAoYWRqdXN0ZWQKKyAgICAgKiBmb3Igam9pbmVkIGFuZCBzcGxpdCBsaW5lcykuICovCisgICAgaWYgKGtlZXBfY3Vyc29yKQorCXNhdmVkX2N1cnNvciA9IG9hcC0+Y3Vyc29yX3N0YXJ0OworCisgICAgZm9ybWF0X2xpbmVzKG9hcC0+bGluZV9jb3VudCk7CisKKyAgICAvKgorICAgICAqIExlYXZlIHRoZSBjdXJzb3IgYXQgdGhlIGZpcnN0IG5vbi1ibGFuayBvZiB0aGUgbGFzdCBmb3JtYXR0ZWQgbGluZS4KKyAgICAgKiBJZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZCBvbmUgbGluZSBiYWNrIChlLmcuIHdpdGggIlF9IikgZ28gdG8gdGhlIG5leHQKKyAgICAgKiBsaW5lLCBzbyAiLiIgd2lsbCBkbyB0aGUgbmV4dCBsaW5lcy4KKyAgICAgKi8KKyAgICBpZiAob2FwLT5lbmRfYWRqdXN0ZWQgJiYgY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJKytjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgYmVnaW5saW5lKEJMX1dISVRFIHwgQkxfRklYKTsKKyAgICBvbGRfbGluZV9jb3VudCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gb2xkX2xpbmVfY291bnQ7CisgICAgbXNnbW9yZShvbGRfbGluZV9jb3VudCk7CisKKyAgICAvKiBwdXQgJ10gbWFyayBvbiB0aGUgZW5kIG9mIHRoZSBmb3JtYXR0ZWQgYXJlYSAqLworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOworCisgICAgaWYgKGtlZXBfY3Vyc29yKQorICAgIHsKKwljdXJ3aW4tPndfY3Vyc29yID0gc2F2ZWRfY3Vyc29yOworCXNhdmVkX2N1cnNvci5sbnVtID0gMDsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChvYXAtPmlzX1ZJc3VhbCkKKyAgICB7CisJd2luX1QJKndwOworCisJRk9SX0FMTF9XSU5ET1dTKHdwKQorCXsKKwkgICAgaWYgKHdwLT53X29sZF9jdXJzb3JfbG51bSAhPSAwKQorCSAgICB7CisJCS8qIFdoZW4gbGluZXMgaGF2ZSBiZWVuIGluc2VydGVkIG9yIGRlbGV0ZWQsIGFkanVzdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBWaXN1YWwgYXJlYSB0byBiZSByZWRyYXduLiAqLworCQlpZiAod3AtPndfb2xkX2N1cnNvcl9sbnVtID4gd3AtPndfb2xkX3Zpc3VhbF9sbnVtKQorCQkgICAgd3AtPndfb2xkX2N1cnNvcl9sbnVtICs9IG9sZF9saW5lX2NvdW50OworCQllbHNlCisJCSAgICB3cC0+d19vbGRfdmlzdWFsX2xudW0gKz0gb2xkX2xpbmVfY291bnQ7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBGb3JtYXQgImxpbmVfY291bnQiIGxpbmVzLCBzdGFydGluZyBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLgorICogV2hlbiAibGluZV9jb3VudCIgaXMgbmVnYXRpdmUsIGZvcm1hdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGguCisgKiBMaW5lcyBhZnRlciB0aGUgY3Vyc29yIGxpbmUgYXJlIHNhdmVkIGZvciB1bmRvLCBjYWxsZXIgbXVzdCBoYXZlIHNhdmVkIHRoZQorICogZmlyc3QgbGluZS4KKyAqLworICAgIHZvaWQKK2Zvcm1hdF9saW5lcyhsaW5lX2NvdW50KQorICAgIGxpbmVucl9UCWxpbmVfY291bnQ7Cit7CisgICAgaW50CQltYXhfbGVuOworICAgIGludAkJaXNfbm90X3BhcjsJCS8qIGN1cnJlbnQgbGluZSBub3QgcGFydCBvZiBwYXJhZy4gKi8KKyAgICBpbnQJCW5leHRfaXNfbm90X3BhcjsJLyogbmV4dCBsaW5lIG5vdCBwYXJ0IG9mIHBhcmFncmFwaCAqLworICAgIGludAkJaXNfZW5kX3BhcjsJCS8qIGF0IGVuZCBvZiBwYXJhZ3JhcGggKi8KKyAgICBpbnQJCXByZXZfaXNfZW5kX3BhciA9IEZBTFNFOy8qIHByZXYuIGxpbmUgbm90IHBhcnQgb2YgcGFyYWcuICovCisgICAgaW50CQluZXh0X2lzX3N0YXJ0X3BhciA9IEZBTFNFOworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICBpbnQJCWxlYWRlcl9sZW4gPSAwOwkJLyogbGVhZGVyIGxlbiBvZiBjdXJyZW50IGxpbmUgKi8KKyAgICBpbnQJCW5leHRfbGVhZGVyX2xlbjsJLyogbGVhZGVyIGxlbiBvZiBuZXh0IGxpbmUgKi8KKyAgICBjaGFyX3UJKmxlYWRlcl9mbGFncyA9IE5VTEw7CS8qIGZsYWdzIGZvciBsZWFkZXIgb2YgY3VycmVudCBsaW5lICovCisgICAgY2hhcl91CSpuZXh0X2xlYWRlcl9mbGFnczsJLyogZmxhZ3MgZm9yIGxlYWRlciBvZiBuZXh0IGxpbmUgKi8KKyAgICBpbnQJCWRvX2NvbW1lbnRzOwkJLyogZm9ybWF0IGNvbW1lbnRzICovCisjZW5kaWYKKyAgICBpbnQJCWFkdmFuY2UgPSBUUlVFOworICAgIGludAkJc2Vjb25kX2luZGVudCA9IC0xOworICAgIGludAkJZG9fc2Vjb25kX2luZGVudDsKKyAgICBpbnQJCWRvX251bWJlcl9pbmRlbnQ7CisgICAgaW50CQlkb190cmFpbF93aGl0ZTsKKyAgICBpbnQJCWZpcnN0X3Bhcl9saW5lID0gVFJVRTsKKyAgICBpbnQJCXNtZF9zYXZlOworICAgIGxvbmcJY291bnQ7CisgICAgaW50CQluZWVkX3NldF9pbmRlbnQgPSBUUlVFOwkvKiBzZXQgaW5kZW50IG9mIG5leHQgcGFyYWdyYXBoICovCisgICAgaW50CQlmb3JjZV9mb3JtYXQgPSBGQUxTRTsKKyAgICBpbnQJCW9sZF9TdGF0ZSA9IFN0YXRlOworCisgICAgLyogbGVuZ3RoIG9mIGEgbGluZSB0byBmb3JjZSBmb3JtYXR0aW5nOiAzICogJ3R3JyAqLworICAgIG1heF9sZW4gPSBjb21wX3RleHR3aWR0aChUUlVFKSAqIDM7CisKKyAgICAvKiBjaGVjayBmb3IgJ3EnLCAnMicgYW5kICcxJyBpbiAnZm9ybWF0b3B0aW9ucycgKi8KKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgZG9fY29tbWVudHMgPSBoYXNfZm9ybWF0X29wdGlvbihGT19RX0NPTVMpOworI2VuZGlmCisgICAgZG9fc2Vjb25kX2luZGVudCA9IGhhc19mb3JtYXRfb3B0aW9uKEZPX1FfU0VDT05EKTsKKyAgICBkb19udW1iZXJfaW5kZW50ID0gaGFzX2Zvcm1hdF9vcHRpb24oRk9fUV9OVU1CRVIpOworICAgIGRvX3RyYWlsX3doaXRlID0gaGFzX2Zvcm1hdF9vcHRpb24oRk9fV0hJVEVfUEFSKTsKKworICAgIC8qCisgICAgICogR2V0IGluZm8gYWJvdXQgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IGxpbmUuCisgICAgICovCisgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSA+IDEpCisJaXNfbm90X3BhciA9IGZtdF9jaGVja19wYXIoY3Vyd2luLT53X2N1cnNvci5sbnVtIC0gMQorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkJCQksICZsZWFkZXJfbGVuLCAmbGVhZGVyX2ZsYWdzLCBkb19jb21tZW50cworI2VuZGlmCisJCQkJKTsKKyAgICBlbHNlCisJaXNfbm90X3BhciA9IFRSVUU7CisgICAgbmV4dF9pc19ub3RfcGFyID0gZm10X2NoZWNrX3BhcihjdXJ3aW4tPndfY3Vyc29yLmxudW0KKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCQkgICAsICZuZXh0X2xlYWRlcl9sZW4sICZuZXh0X2xlYWRlcl9mbGFncywgZG9fY29tbWVudHMKKyNlbmRpZgorCQkJCSk7CisgICAgaXNfZW5kX3BhciA9IChpc19ub3RfcGFyIHx8IG5leHRfaXNfbm90X3Bhcik7CisgICAgaWYgKCFpc19lbmRfcGFyICYmIGRvX3RyYWlsX3doaXRlKQorCWlzX2VuZF9wYXIgPSAhZW5kc19pbl93aGl0ZShjdXJ3aW4tPndfY3Vyc29yLmxudW0gLSAxKTsKKworICAgIGN1cndpbi0+d19jdXJzb3IubG51bS0tOworICAgIGZvciAoY291bnQgPSBsaW5lX2NvdW50OyBjb3VudCAhPSAwICYmICFnb3RfaW50OyAtLWNvdW50KQorICAgIHsKKwkvKgorCSAqIEFkdmFuY2UgdG8gbmV4dCBwYXJhZ3JhcGguCisJICovCisJaWYgKGFkdmFuY2UpCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0rKzsKKwkgICAgcHJldl9pc19lbmRfcGFyID0gaXNfZW5kX3BhcjsKKwkgICAgaXNfbm90X3BhciA9IG5leHRfaXNfbm90X3BhcjsKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJICAgIGxlYWRlcl9sZW4gPSBuZXh0X2xlYWRlcl9sZW47CisJICAgIGxlYWRlcl9mbGFncyA9IG5leHRfbGVhZGVyX2ZsYWdzOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBUaGUgbGFzdCBsaW5lIHRvIGJlIGZvcm1hdHRlZC4KKwkgKi8KKwlpZiAoY291bnQgPT0gMSB8fCBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBuZXh0X2lzX25vdF9wYXIgPSBUUlVFOworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkgICAgbmV4dF9sZWFkZXJfbGVuID0gMDsKKwkgICAgbmV4dF9sZWFkZXJfZmxhZ3MgPSBOVUxMOworI2VuZGlmCisJfQorCWVsc2UKKwl7CisJICAgIG5leHRfaXNfbm90X3BhciA9IGZtdF9jaGVja19wYXIoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMQorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkJCSAgICwgJm5leHRfbGVhZGVyX2xlbiwgJm5leHRfbGVhZGVyX2ZsYWdzLCBkb19jb21tZW50cworI2VuZGlmCisJCQkJCSk7CisJICAgIGlmIChkb19udW1iZXJfaW5kZW50KQorCQluZXh0X2lzX3N0YXJ0X3BhciA9CisJCQkgICAoZ2V0X251bWJlcl9pbmRlbnQoY3Vyd2luLT53X2N1cnNvci5sbnVtICsgMSkgPiAwKTsKKwl9CisJYWR2YW5jZSA9IFRSVUU7CisJaXNfZW5kX3BhciA9IChpc19ub3RfcGFyIHx8IG5leHRfaXNfbm90X3BhciB8fCBuZXh0X2lzX3N0YXJ0X3Bhcik7CisJaWYgKCFpc19lbmRfcGFyICYmIGRvX3RyYWlsX3doaXRlKQorCSAgICBpc19lbmRfcGFyID0gIWVuZHNfaW5fd2hpdGUoY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKKworCS8qCisJICogU2tpcCBsaW5lcyB0aGF0IGFyZSBub3QgaW4gYSBwYXJhZ3JhcGguCisJICovCisJaWYgKGlzX25vdF9wYXIpCisJeworCSAgICBpZiAobGluZV9jb3VudCA8IDApCisJCWJyZWFrOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBGb3IgdGhlIGZpcnN0IGxpbmUgb2YgYSBwYXJhZ3JhcGgsIGNoZWNrIGluZGVudCBvZiBzZWNvbmQgbGluZS4KKwkgICAgICogRG9uJ3QgZG8gdGhpcyBmb3IgY29tbWVudHMgYW5kIGVtcHR5IGxpbmVzLgorCSAgICAgKi8KKwkgICAgaWYgKGZpcnN0X3Bhcl9saW5lCisJCSAgICAmJiAoZG9fc2Vjb25kX2luZGVudCB8fCBkb19udW1iZXJfaW5kZW50KQorCQkgICAgJiYgcHJldl9pc19lbmRfcGFyCisJCSAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkJICAgICYmIGxlYWRlcl9sZW4gPT0gMAorCQkgICAgJiYgbmV4dF9sZWFkZXJfbGVuID09IDAKKyNlbmRpZgorCQkgICAgKQorCSAgICB7CisJCWlmIChkb19zZWNvbmRfaW5kZW50CisJCQkmJiAhbGluZWVtcHR5KGN1cndpbi0+d19jdXJzb3IubG51bSArIDEpKQorCQkgICAgc2Vjb25kX2luZGVudCA9IGdldF9pbmRlbnRfbG51bShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyAxKTsKKwkJZWxzZSBpZiAoZG9fbnVtYmVyX2luZGVudCkKKwkJICAgIHNlY29uZF9pbmRlbnQgPSBnZXRfbnVtYmVyX2luZGVudChjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogV2hlbiB0aGUgY29tbWVudCBsZWFkZXIgY2hhbmdlcywgaXQncyB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGguCisJICAgICAqLworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtID49IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50CisjaWZkZWYgRkVBVF9DT01NRU5UUworCQkgICAgfHwgIXNhbWVfbGVhZGVyKGN1cndpbi0+d19jdXJzb3IubG51bSwKKwkJCQkJbGVhZGVyX2xlbiwgbGVhZGVyX2ZsYWdzLAorCQkJCQkgIG5leHRfbGVhZGVyX2xlbiwgbmV4dF9sZWFkZXJfZmxhZ3MpCisjZW5kaWYKKwkJICAgICkKKwkJaXNfZW5kX3BhciA9IFRSVUU7CisKKwkgICAgLyoKKwkgICAgICogSWYgd2UgaGF2ZSBnb3QgdG8gdGhlIGVuZCBvZiBhIHBhcmFncmFwaCwgb3IgdGhlIGxpbmUgaXMKKwkgICAgICogZ2V0dGluZyBsb25nLCBmb3JtYXQgaXQuCisJICAgICAqLworCSAgICBpZiAoaXNfZW5kX3BhciB8fCBmb3JjZV9mb3JtYXQpCisJICAgIHsKKwkJaWYgKG5lZWRfc2V0X2luZGVudCkKKwkJICAgIC8qIHJlcGxhY2UgaW5kZW50IGluIGZpcnN0IGxpbmUgd2l0aCBtaW5pbWFsIG51bWJlciBvZgorCQkgICAgICogdGFicyBhbmQgc3BhY2VzLCBhY2NvcmRpbmcgdG8gY3VycmVudCBvcHRpb25zICovCisJCSAgICAodm9pZClzZXRfaW5kZW50KGdldF9pbmRlbnQoKSwgU0lOX0NIQU5HRUQpOworCisJCS8qIHB1dCBjdXJzb3Igb24gbGFzdCBub24tc3BhY2UgKi8KKwkJU3RhdGUgPSBOT1JNQUw7CS8qIGRvbid0IGdvIHBhc3QgZW5kLW9mLWxpbmUgKi8KKwkJY29sYWR2YW5jZSgoY29sbnJfVClNQVhDT0wpOworCQl3aGlsZSAoY3Vyd2luLT53X2N1cnNvci5jb2wgJiYgdmltX2lzc3BhY2UoZ2NoYXJfY3Vyc29yKCkpKQorCQkgICAgZGVjX2N1cnNvcigpOworCisJCS8qIGRvIHRoZSBmb3JtYXR0aW5nLCB3aXRob3V0ICdzaG93bW9kZScgKi8KKwkJU3RhdGUgPSBJTlNFUlQ7CS8qIGZvciBvcGVuX2xpbmUoKSAqLworCQlzbWRfc2F2ZSA9IHBfc21kOworCQlwX3NtZCA9IEZBTFNFOworCQlpbnNlcnRjaGFyKE5VTCwgSU5TQ0hBUl9GT1JNQVQKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCQkrIChkb19jb21tZW50cyA/IElOU0NIQVJfRE9fQ09NIDogMCkKKyNlbmRpZgorCQkJLCBzZWNvbmRfaW5kZW50KTsKKwkJU3RhdGUgPSBvbGRfU3RhdGU7CisJCXBfc21kID0gc21kX3NhdmU7CisJCXNlY29uZF9pbmRlbnQgPSAtMTsKKwkJLyogYXQgZW5kIG9mIHBhci46IG5lZWQgdG8gc2V0IGluZGVudCBvZiBuZXh0IHBhci4gKi8KKwkJbmVlZF9zZXRfaW5kZW50ID0gaXNfZW5kX3BhcjsKKwkJaWYgKGlzX2VuZF9wYXIpCisJCXsKKwkJICAgIC8qIFdoZW4gY2FsbGVkIHdpdGggYSBuZWdhdGl2ZSBsaW5lIGNvdW50LCBicmVhayBhdCB0aGUKKwkJICAgICAqIGVuZCBvZiB0aGUgcGFyYWdyYXBoLiAqLworCQkgICAgaWYgKGxpbmVfY291bnQgPCAwKQorCQkJYnJlYWs7CisJCSAgICBmaXJzdF9wYXJfbGluZSA9IFRSVUU7CisJCX0KKwkJZm9yY2VfZm9ybWF0ID0gRkFMU0U7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBXaGVuIHN0aWxsIGluIHNhbWUgcGFyYWdyYXBoLCBqb2luIHRoZSBsaW5lcyB0b2dldGhlci4gIEJ1dAorCSAgICAgKiBmaXJzdCBkZWxldGUgdGhlIGNvbW1lbnQgbGVhZGVyIGZyb20gdGhlIHNlY29uZCBsaW5lLgorCSAgICAgKi8KKwkgICAgaWYgKCFpc19lbmRfcGFyKQorCSAgICB7CisJCWFkdmFuY2UgPSBGQUxTRTsKKwkJY3Vyd2luLT53X2N1cnNvci5sbnVtKys7CisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKwkJaWYgKGxpbmVfY291bnQgPCAwICYmIHVfc2F2ZV9jdXJzb3IoKSA9PSBGQUlMKQorCQkJYnJlYWs7CisjaWZkZWYgRkVBVF9DT01NRU5UUworCQkodm9pZClkZWxfYnl0ZXMoKGxvbmcpbmV4dF9sZWFkZXJfbGVuLCBGQUxTRSk7CisJCWlmIChuZXh0X2xlYWRlcl9sZW4gPiAwKQorCQkgICAgbWFya19jb2xfYWRqdXN0KGN1cndpbi0+d19jdXJzb3IubG51bSwgKGNvbG5yX1QpMCwgMEwsCisJCQkJCQkgICAgICAobG9uZyktbmV4dF9sZWFkZXJfbGVuKTsKKyNlbmRpZgorCQljdXJ3aW4tPndfY3Vyc29yLmxudW0tLTsKKwkJaWYgKGRvX2pvaW4oVFJVRSkgPT0gRkFJTCkKKwkJeworCQkgICAgYmVlcF9mbHVzaCgpOworCQkgICAgYnJlYWs7CisJCX0KKwkJZmlyc3RfcGFyX2xpbmUgPSBGQUxTRTsKKwkJLyogSWYgdGhlIGxpbmUgaXMgZ2V0dGluZyBsb25nLCBmb3JtYXQgaXQgbmV4dCB0aW1lICovCisJCWlmIChTVFJMRU4obWxfZ2V0X2N1cmxpbmUoKSkgPiAoc2l6ZV90KW1heF9sZW4pCisJCSAgICBmb3JjZV9mb3JtYXQgPSBUUlVFOworCQllbHNlCisJCSAgICBmb3JjZV9mb3JtYXQgPSBGQUxTRTsKKwkgICAgfQorCX0KKwlsaW5lX2JyZWFrY2hlY2soKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBsaW5lICJsbnVtIiBlbmRzIGluIGEgd2hpdGUgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIGludAorZW5kc19pbl93aGl0ZShsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgY2hhcl91CSpzID0gbWxfZ2V0KGxudW0pOworICAgIHNpemVfdAlsOworCisgICAgaWYgKCpzID09IE5VTCkKKwlyZXR1cm4gRkFMU0U7CisgICAgLyogRG9uJ3QgdXNlIFNUUkxFTigpIGluc2lkZSB2aW1faXN3aGl0ZSgpLCBTQVMvQyBjb21wbGFpbnM6ICJtYWNybworICAgICAqIGludm9jYXRpb24gbWF5IGNhbGwgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMiLiAqLworICAgIGwgPSBTVFJMRU4ocykgLSAxOworICAgIHJldHVybiB2aW1faXN3aGl0ZShzW2xdKTsKK30KKworLyoKKyAqIEJsYW5rIGxpbmVzLCBhbmQgbGluZXMgY29udGFpbmluZyBvbmx5IHRoZSBjb21tZW50IGxlYWRlciwgYXJlIGxlZnQKKyAqIHVudG91Y2hlZCBieSB0aGUgZm9ybWF0dGluZy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaW4gdGhpcworICogY2FzZS4gIEl0IGFsc28gcmV0dXJucyBUUlVFIHdoZW4gYSBsaW5lIHN0YXJ0cyB3aXRoIHRoZSBlbmQgb2YgYSBjb21tZW50CisgKiAoJ2UnIGluIGNvbW1lbnQgZmxhZ3MpLCBzbyB0aGF0IHRoaXMgbGluZSBpcyBza2lwcGVkLCBhbmQgbm90IGpvaW5lZCB0byB0aGUKKyAqIHByZXZpb3VzIGxpbmUuICBBIG5ldyBwYXJhZ3JhcGggc3RhcnRzIGFmdGVyIGEgYmxhbmsgbGluZSwgb3Igd2hlbiB0aGUKKyAqIGNvbW1lbnQgbGVhZGVyIGNoYW5nZXMgLS0gd2ViYi4KKyAqLworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICBzdGF0aWMgaW50CitmbXRfY2hlY2tfcGFyKGxudW0sIGxlYWRlcl9sZW4sIGxlYWRlcl9mbGFncywgZG9fY29tbWVudHMpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCSpsZWFkZXJfbGVuOworICAgIGNoYXJfdQkqKmxlYWRlcl9mbGFnczsKKyAgICBpbnQJCWRvX2NvbW1lbnRzOworeworICAgIGNoYXJfdQkqZmxhZ3MgPSBOVUxMOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisgICAgY2hhcl91CSpwdHI7CisKKyAgICBwdHIgPSBtbF9nZXQobG51bSk7CisgICAgaWYgKGRvX2NvbW1lbnRzKQorCSpsZWFkZXJfbGVuID0gZ2V0X2xlYWRlcl9sZW4ocHRyLCBsZWFkZXJfZmxhZ3MsIEZBTFNFKTsKKyAgICBlbHNlCisJKmxlYWRlcl9sZW4gPSAwOworCisgICAgaWYgKCpsZWFkZXJfbGVuID4gMCkKKyAgICB7CisJLyoKKwkgKiBTZWFyY2ggZm9yICdlJyBmbGFnIGluIGNvbW1lbnQgbGVhZGVyIGZsYWdzLgorCSAqLworCWZsYWdzID0gKmxlYWRlcl9mbGFnczsKKwl3aGlsZSAoKmZsYWdzICYmICpmbGFncyAhPSAnOicgJiYgKmZsYWdzICE9IENPTV9FTkQpCisJICAgICsrZmxhZ3M7CisgICAgfQorCisgICAgcmV0dXJuICgqc2tpcHdoaXRlKHB0ciArICpsZWFkZXJfbGVuKSA9PSBOVUwKKwkgICAgfHwgKCpsZWFkZXJfbGVuID4gMCAmJiAqZmxhZ3MgPT0gQ09NX0VORCkKKwkgICAgfHwgc3RhcnRQUyhsbnVtLCBOVUwsIEZBTFNFKSk7Cit9CisjZWxzZQorICAgIHN0YXRpYyBpbnQKK2ZtdF9jaGVja19wYXIobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHJldHVybiAoKnNraXB3aGl0ZShtbF9nZXQobG51bSkpID09IE5VTCB8fCBzdGFydFBTKGxudW0sIE5VTCwgRkFMU0UpKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBhIHBhcmFncmFwaCBzdGFydHMgaW4gbGluZSAibG51bSIuICBSZXR1cm4gRkFMU0Ugd2hlbiB0aGUKKyAqIHByZXZpb3VzIGxpbmUgaXMgaW4gdGhlIHNhbWUgcGFyYWdyYXBoLiAgVXNlZCBmb3IgYXV0by1mb3JtYXR0aW5nLgorICovCisgICAgaW50CitwYXJhZ3JhcGhfc3RhcnQobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGNoYXJfdQkqcDsKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgaW50CQlsZWFkZXJfbGVuID0gMDsJCS8qIGxlYWRlciBsZW4gb2YgY3VycmVudCBsaW5lICovCisgICAgY2hhcl91CSpsZWFkZXJfZmxhZ3MgPSBOVUxMOwkvKiBmbGFncyBmb3IgbGVhZGVyIG9mIGN1cnJlbnQgbGluZSAqLworICAgIGludAkJbmV4dF9sZWFkZXJfbGVuOwkvKiBsZWFkZXIgbGVuIG9mIG5leHQgbGluZSAqLworICAgIGNoYXJfdQkqbmV4dF9sZWFkZXJfZmxhZ3M7CS8qIGZsYWdzIGZvciBsZWFkZXIgb2YgbmV4dCBsaW5lICovCisgICAgaW50CQlkb19jb21tZW50czsJCS8qIGZvcm1hdCBjb21tZW50cyAqLworI2VuZGlmCisKKyAgICBpZiAobG51bSA8PSAxKQorCXJldHVybiBUUlVFOwkJLyogc3RhcnQgb2YgdGhlIGZpbGUgKi8KKworICAgIHAgPSBtbF9nZXQobG51bSAtIDEpOworICAgIGlmICgqcCA9PSBOVUwpCisJcmV0dXJuIFRSVUU7CQkvKiBhZnRlciBlbXB0eSBsaW5lICovCisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgZG9fY29tbWVudHMgPSBoYXNfZm9ybWF0X29wdGlvbihGT19RX0NPTVMpOworI2VuZGlmCisgICAgaWYgKGZtdF9jaGVja19wYXIobG51bSAtIDEKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCQkJLCAmbGVhZGVyX2xlbiwgJmxlYWRlcl9mbGFncywgZG9fY29tbWVudHMKKyNlbmRpZgorCQkpKQorCXJldHVybiBUUlVFOwkJLyogYWZ0ZXIgbm9uLXBhcmFncmFwaCBsaW5lICovCisKKyAgICBpZiAoZm10X2NoZWNrX3BhcihsbnVtCisjaWZkZWYgRkVBVF9DT01NRU5UUworCQkJICAgLCAmbmV4dF9sZWFkZXJfbGVuLCAmbmV4dF9sZWFkZXJfZmxhZ3MsIGRvX2NvbW1lbnRzCisjZW5kaWYKKwkJKSkKKwlyZXR1cm4gVFJVRTsJCS8qICJsbnVtIiBpcyBub3QgYSBwYXJhZ3JhcGggbGluZSAqLworCisgICAgaWYgKGhhc19mb3JtYXRfb3B0aW9uKEZPX1dISVRFX1BBUikgJiYgIWVuZHNfaW5fd2hpdGUobG51bSAtIDEpKQorCXJldHVybiBUUlVFOwkJLyogbWlzc2luZyB0cmFpbGluZyBzcGFjZSBpbiBwcmV2aW91cyBsaW5lLiAqLworCisgICAgaWYgKGhhc19mb3JtYXRfb3B0aW9uKEZPX1FfTlVNQkVSKSAmJiAoZ2V0X251bWJlcl9pbmRlbnQobG51bSkgPiAwKSkKKwlyZXR1cm4gVFJVRTsJCS8qIG51bWJlcmVkIGl0ZW0gc3RhcnRzIGluICJsbnVtIi4gKi8KKworI2lmZGVmIEZFQVRfQ09NTUVOVFMKKyAgICBpZiAoIXNhbWVfbGVhZGVyKGxudW0gLSAxLCBsZWFkZXJfbGVuLCBsZWFkZXJfZmxhZ3MsCisJCQkJCSAgbmV4dF9sZWFkZXJfbGVuLCBuZXh0X2xlYWRlcl9mbGFncykpCisJcmV0dXJuIFRSVUU7CQkvKiBjaGFuZ2Ugb2YgY29tbWVudCBsZWFkZXIuICovCisjZW5kaWYKKworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIEZFQVRfVklTVUFMCisvKgorICogcHJlcGFyZSBhIGZldyB0aGluZ3MgZm9yIGJsb2NrIG1vZGUgeWFuay9kZWxldGUvdGlsZGUKKyAqCisgKiBmb3IgZGVsZXRlOgorICogLSB0ZXh0bGVuIGluY2x1ZGVzIHRoZSBmaXJzdC9sYXN0IGNoYXIgdG8gYmUgKHBhcnRseSkgZGVsZXRlZAorICogLSBzdGFydC9lbmRzcGFjZXMgaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgYXJlIHRha2VuIGJ5IHRoZQorICogICBmaXJzdC9sYXN0IGRlbGV0ZWQgY2hhciBtaW51cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhhdCBoYXZlIHRvIGJlCisgKiAgIGRlbGV0ZWQuICBmb3IgeWFuayBhbmQgdGlsZGU6CisgKiAtIHRleHRsZW4gaW5jbHVkZXMgdGhlIGZpcnN0L2xhc3QgY2hhciB0byBiZSB3aG9sbHkgeWFua2VkCisgKiAtIHN0YXJ0L2VuZHNwYWNlcyBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIGZpcnN0L2xhc3QgeWFua2VkIGNoYXIKKyAqICAgdGhhdCBhcmUgdG8gYmUgeWFua2VkLgorICovCisgICAgc3RhdGljIHZvaWQKK2Jsb2NrX3ByZXAob2FwLCBiZHAsIGxudW0sIGlzX2RlbCkKKyAgICBvcGFyZ19UCQkqb2FwOworICAgIHN0cnVjdCBibG9ja19kZWYJKmJkcDsKKyAgICBsaW5lbnJfVAkJbG51bTsKKyAgICBpbnQJCQlpc19kZWw7Cit7CisgICAgaW50CQlpbmNyID0gMDsKKyAgICBjaGFyX3UJKnBlbmQ7CisgICAgY2hhcl91CSpwc3RhcnQ7CisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqcHJldl9wc3RhcnQ7CisgICAgY2hhcl91CSpwcmV2X3BlbmQ7CisKKyAgICBiZHAtPnN0YXJ0c3BhY2VzID0gMDsKKyAgICBiZHAtPmVuZHNwYWNlcyA9IDA7CisgICAgYmRwLT50ZXh0bGVuID0gMDsKKyAgICBiZHAtPnN0YXJ0X3Zjb2wgPSAwOworICAgIGJkcC0+ZW5kX3Zjb2wgPSAwOworI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKyAgICBiZHAtPmlzX3Nob3J0ID0gRkFMU0U7CisgICAgYmRwLT5pc19vbmVDaGFyID0gRkFMU0U7CisgICAgYmRwLT5wcmVfd2hpdGVzcCA9IDA7CisgICAgYmRwLT5wcmVfd2hpdGVzcF9jID0gMDsKKyAgICBiZHAtPmVuZF9jaGFyX3Zjb2xzID0gMDsKKyNlbmRpZgorICAgIGJkcC0+c3RhcnRfY2hhcl92Y29scyA9IDA7CisKKyAgICBsaW5lID0gbWxfZ2V0KGxudW0pOworICAgIHBzdGFydCA9IGxpbmU7CisgICAgcHJldl9wc3RhcnQgPSBsaW5lOworICAgIHdoaWxlIChiZHAtPnN0YXJ0X3Zjb2wgPCBvYXAtPnN0YXJ0X3Zjb2wgJiYgKnBzdGFydCkKKyAgICB7CisJLyogQ291bnQgYSB0YWIgZm9yIHdoYXQgaXQncyB3b3J0aCAoaWYgbGlzdCBtb2RlIG5vdCBvbikgKi8KKwlpbmNyID0gbGJyX2NoYXJ0YWJzaXplKHBzdGFydCwgKGNvbG5yX1QpYmRwLT5zdGFydF92Y29sKTsKKwliZHAtPnN0YXJ0X3Zjb2wgKz0gaW5jcjsKKyNpZmRlZiBGRUFUX1ZJU1VBTEVYVFJBCisJaWYgKHZpbV9pc3doaXRlKCpwc3RhcnQpKQorCXsKKwkgICAgYmRwLT5wcmVfd2hpdGVzcCArPSBpbmNyOworCSAgICBiZHAtPnByZV93aGl0ZXNwX2MrKzsKKwl9CisJZWxzZQorCXsKKwkgICAgYmRwLT5wcmVfd2hpdGVzcCA9IDA7CisJICAgIGJkcC0+cHJlX3doaXRlc3BfYyA9IDA7CisJfQorI2VuZGlmCisJcHJldl9wc3RhcnQgPSBwc3RhcnQ7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHBzdGFydCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHBzdGFydCk7CisJZWxzZQorI2VuZGlmCisJICAgICsrcHN0YXJ0OworICAgIH0KKyAgICBiZHAtPnN0YXJ0X2NoYXJfdmNvbHMgPSBpbmNyOworICAgIGlmIChiZHAtPnN0YXJ0X3Zjb2wgPCBvYXAtPnN0YXJ0X3Zjb2wpCS8qIGxpbmUgdG9vIHNob3J0ICovCisgICAgeworCWJkcC0+ZW5kX3Zjb2wgPSBiZHAtPnN0YXJ0X3Zjb2w7CisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorCWJkcC0+aXNfc2hvcnQgPSBUUlVFOworI2VuZGlmCisJaWYgKCFpc19kZWwgfHwgb2FwLT5vcF90eXBlID09IE9QX0FQUEVORCkKKwkgICAgYmRwLT5lbmRzcGFjZXMgPSBvYXAtPmVuZF92Y29sIC0gb2FwLT5zdGFydF92Y29sICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBub3RpY2U6IHRoaXMgY29udmVydHMgcGFydGx5IHNlbGVjdGVkIE11bHRpYnl0ZSBjaGFyYWN0ZXJzIHRvCisJICogc3BhY2VzLCB0b28uICovCisJYmRwLT5zdGFydHNwYWNlcyA9IGJkcC0+c3RhcnRfdmNvbCAtIG9hcC0+c3RhcnRfdmNvbDsKKwlpZiAoaXNfZGVsICYmIGJkcC0+c3RhcnRzcGFjZXMpCisJICAgIGJkcC0+c3RhcnRzcGFjZXMgPSBiZHAtPnN0YXJ0X2NoYXJfdmNvbHMgLSBiZHAtPnN0YXJ0c3BhY2VzOworCXBlbmQgPSBwc3RhcnQ7CisJYmRwLT5lbmRfdmNvbCA9IGJkcC0+c3RhcnRfdmNvbDsKKwlpZiAoYmRwLT5lbmRfdmNvbCA+IG9hcC0+ZW5kX3Zjb2wpCS8qIGl0J3MgYWxsIGluIG9uZSBjaGFyYWN0ZXIgKi8KKwl7CisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorCSAgICBiZHAtPmlzX29uZUNoYXIgPSBUUlVFOworI2VuZGlmCisJICAgIGlmIChvYXAtPm9wX3R5cGUgPT0gT1BfSU5TRVJUKQorCQliZHAtPmVuZHNwYWNlcyA9IGJkcC0+c3RhcnRfY2hhcl92Y29scyAtIGJkcC0+c3RhcnRzcGFjZXM7CisJICAgIGVsc2UgaWYgKG9hcC0+b3BfdHlwZSA9PSBPUF9BUFBFTkQpCisJICAgIHsKKwkJYmRwLT5zdGFydHNwYWNlcyArPSBvYXAtPmVuZF92Y29sIC0gb2FwLT5zdGFydF92Y29sICsgMTsKKwkJYmRwLT5lbmRzcGFjZXMgPSBiZHAtPnN0YXJ0X2NoYXJfdmNvbHMgLSBiZHAtPnN0YXJ0c3BhY2VzOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQliZHAtPnN0YXJ0c3BhY2VzID0gb2FwLT5lbmRfdmNvbCAtIG9hcC0+c3RhcnRfdmNvbCArIDE7CisJCWlmIChpc19kZWwgJiYgb2FwLT5vcF90eXBlICE9IE9QX0xTSElGVCkKKwkJeworCQkgICAgLyoganVzdCBwdXR0aW5nIHRoZSBzdW0gb2YgdGhvc2UgdHdvIGludG8KKwkJICAgICAqIGJkcC0+c3RhcnRzcGFjZXMgZG9lc24ndCB3b3JrIGZvciBWaXN1YWwgcmVwbGFjZSwKKwkJICAgICAqIHNvIHdlIGhhdmUgdG8gc3BsaXQgdGhlIHRhYiBpbiB0d28gKi8KKwkJICAgIGJkcC0+c3RhcnRzcGFjZXMgPSBiZHAtPnN0YXJ0X2NoYXJfdmNvbHMKKwkJCQkJLSAoYmRwLT5zdGFydF92Y29sIC0gb2FwLT5zdGFydF92Y29sKTsKKwkJICAgIGJkcC0+ZW5kc3BhY2VzID0gYmRwLT5lbmRfdmNvbCAtIG9hcC0+ZW5kX3Zjb2wgLSAxOworCQl9CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgcHJldl9wZW5kID0gcGVuZDsKKwkgICAgd2hpbGUgKGJkcC0+ZW5kX3Zjb2wgPD0gb2FwLT5lbmRfdmNvbCAmJiAqcGVuZCAhPSBOVUwpCisJICAgIHsKKwkJLyogQ291bnQgYSB0YWIgZm9yIHdoYXQgaXQncyB3b3J0aCAoaWYgbGlzdCBtb2RlIG5vdCBvbikgKi8KKwkJcHJldl9wZW5kID0gcGVuZDsKKwkJaW5jciA9IGxicl9jaGFydGFic2l6ZV9hZHYoJnBlbmQsIChjb2xucl9UKWJkcC0+ZW5kX3Zjb2wpOworCQliZHAtPmVuZF92Y29sICs9IGluY3I7CisJICAgIH0KKwkgICAgaWYgKGJkcC0+ZW5kX3Zjb2wgPD0gb2FwLT5lbmRfdmNvbAorCQkgICAgJiYgKCFpc19kZWwKKwkJCXx8IG9hcC0+b3BfdHlwZSA9PSBPUF9BUFBFTkQKKwkJCXx8IG9hcC0+b3BfdHlwZSA9PSBPUF9SRVBMQUNFKSkgLyogbGluZSB0b28gc2hvcnQgKi8KKwkgICAgeworI2lmZGVmIEZFQVRfVklTVUFMRVhUUkEKKwkJYmRwLT5pc19zaG9ydCA9IFRSVUU7CisjZW5kaWYKKwkJLyogQWx0ZXJuYXRpdmU6IGluY2x1ZGUgc3BhY2VzIHRvIGZpbGwgdXAgdGhlIGJsb2NrLgorCQkgKiBEaXNhZHZhbnRhZ2U6IGNhbiBsZWFkIHRvIHRyYWlsaW5nIHNwYWNlcyB3aGVuIHRoZSBsaW5lIGlzCisJCSAqIHNob3J0IHdoZXJlIHRoZSB0ZXh0IGlzIHB1dCAqLworCQkvKiBpZiAoIWlzX2RlbCB8fCBvYXAtPm9wX3R5cGUgPT0gT1BfQVBQRU5EKSAqLworCQlpZiAob2FwLT5vcF90eXBlID09IE9QX0FQUEVORCB8fCB2aXJ0dWFsX29wKQorCQkgICAgYmRwLT5lbmRzcGFjZXMgPSBvYXAtPmVuZF92Y29sIC0gYmRwLT5lbmRfdmNvbAorCQkJCQkrIG9hcC0+aW5jbHVzaXZlOworCQllbHNlCisJCSAgICBiZHAtPmVuZHNwYWNlcyA9IDA7IC8qIHJlcGxhY2UgZG9lc24ndCBhZGQgY2hhcmFjdGVycyAqLworCSAgICB9CisJICAgIGVsc2UgaWYgKGJkcC0+ZW5kX3Zjb2wgPiBvYXAtPmVuZF92Y29sKQorCSAgICB7CisJCWJkcC0+ZW5kc3BhY2VzID0gYmRwLT5lbmRfdmNvbCAtIG9hcC0+ZW5kX3Zjb2wgLSAxOworCQlpZiAoIWlzX2RlbCAmJiBiZHAtPmVuZHNwYWNlcykKKwkJeworCQkgICAgYmRwLT5lbmRzcGFjZXMgPSBpbmNyIC0gYmRwLT5lbmRzcGFjZXM7CisJCSAgICBpZiAocGVuZCAhPSBwc3RhcnQpCisJCQlwZW5kID0gcHJldl9wZW5kOworCQl9CisJICAgIH0KKwl9CisjaWZkZWYgRkVBVF9WSVNVQUxFWFRSQQorCWJkcC0+ZW5kX2NoYXJfdmNvbHMgPSBpbmNyOworI2VuZGlmCisJaWYgKGlzX2RlbCAmJiBiZHAtPnN0YXJ0c3BhY2VzKQorCSAgICBwc3RhcnQgPSBwcmV2X3BzdGFydDsKKwliZHAtPnRleHRsZW4gPSAoaW50KShwZW5kIC0gcHN0YXJ0KTsKKyAgICB9CisgICAgYmRwLT50ZXh0Y29sID0gKGNvbG5yX1QpIChwc3RhcnQgLSBsaW5lKTsKKyAgICBiZHAtPnRleHRzdGFydCA9IHBzdGFydDsKK30KKyNlbmRpZiAvKiBGRUFUX1ZJU1VBTCAqLworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKK3N0YXRpYyB2b2lkIHJldmVyc2VfbGluZSBfX0FSR1MoKGNoYXJfdSAqcykpOworCisgICAgc3RhdGljIHZvaWQKK3JldmVyc2VfbGluZShzKQorICAgIGNoYXJfdSAqczsKK3sKKyAgICBpbnQJICAgIGksIGo7CisgICAgY2hhcl91ICBjOworCisgICAgaWYgKChpID0gKGludClTVFJMRU4ocykgLSAxKSA8PSAwKQorCXJldHVybjsKKworICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gaSAtIGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyssIGktLSkKKyAgICB7CisJYyA9IHNbaV07IHNbaV0gPSBzW2pdOyBzW2pdID0gYzsKKyAgICB9Cit9CisKKyMgZGVmaW5lIFJMQUREU1VCRklYKHB0cikgaWYgKGN1cndpbi0+d19wX3JsKSByZXZlcnNlX2xpbmUocHRyKTsKKyNlbHNlCisjIGRlZmluZSBSTEFERFNVQkZJWChwdHIpCisjZW5kaWYKKworLyoKKyAqIGFkZCBvciBzdWJ0cmFjdCAnUHJlbnVtMScgZnJvbSBhIG51bWJlciBpbiBhIGxpbmUKKyAqICdjb21tYW5kJyBpcyBDVFJMLUEgZm9yIGFkZCwgQ1RSTC1YIGZvciBzdWJ0cmFjdAorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorZG9fYWRkc3ViKGNvbW1hbmQsIFByZW51bTEpCisgICAgaW50CQljb21tYW5kOworICAgIGxpbmVucl9UCVByZW51bTE7Cit7CisgICAgaW50CQljb2w7CisgICAgY2hhcl91CSpidWYxOworICAgIGNoYXJfdQlidWYyW05VTUJVRkxFTl07CisgICAgaW50CQloZXg7CQkvKiAnWCcgb3IgJ3gnOiBoZXg7ICcwJzogb2N0YWwgKi8KKyAgICBzdGF0aWMgaW50CWhleHVwcGVyID0gRkFMU0U7CS8qIDB4QUJDICovCisgICAgbG9uZ191CW47CisgICAgbG9uZ191CW9sZG47CisgICAgY2hhcl91CSpwdHI7CisgICAgaW50CQljOworICAgIGludAkJbGVuZ3RoID0gMDsJCS8qIGNoYXJhY3RlciBsZW5ndGggb2YgdGhlIG51bWJlciAqLworICAgIGludAkJdG9kZWw7CisgICAgaW50CQlkb2hleDsKKyAgICBpbnQJCWRvb2N0OworICAgIGludAkJZG9hbHA7CisgICAgaW50CQlmaXJzdGRpZ2l0OworICAgIGludAkJbmVnYXRpdmU7CisgICAgaW50CQlzdWJ0cmFjdDsKKworICAgIGRvaGV4ID0gKHZpbV9zdHJjaHIoY3VyYnVmLT5iX3BfbmYsICd4JykgIT0gTlVMTCk7CS8qICJoZVgiICovCisgICAgZG9vY3QgPSAodmltX3N0cmNocihjdXJidWYtPmJfcF9uZiwgJ28nKSAhPSBOVUxMKTsJLyogIk9jdGFsIiAqLworICAgIGRvYWxwID0gKHZpbV9zdHJjaHIoY3VyYnVmLT5iX3BfbmYsICdwJykgIT0gTlVMTCk7CS8qICJhbFBoYSIgKi8KKworICAgIHB0ciA9IG1sX2dldF9jdXJsaW5lKCk7CisgICAgUkxBRERTVUJGSVgocHRyKTsKKworICAgIC8qCisgICAgICogRmlyc3QgY2hlY2sgaWYgd2UgYXJlIG9uIGEgaGV4YWRlY2ltYWwgbnVtYmVyLCBhZnRlciB0aGUgIjB4Ii4KKyAgICAgKi8KKyAgICBjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICBpZiAoZG9oZXgpCisJd2hpbGUgKGNvbCA+IDAgJiYgdmltX2lzeGRpZ2l0KHB0cltjb2xdKSkKKwkgICAgLS1jb2w7CisgICAgaWYgKCAgICAgICBkb2hleAorCSAgICAmJiBjb2wgPiAwCisJICAgICYmIChwdHJbY29sXSA9PSAnWCcKKwkJfHwgcHRyW2NvbF0gPT0gJ3gnKQorCSAgICAmJiBwdHJbY29sIC0gMV0gPT0gJzAnCisJICAgICYmIHZpbV9pc3hkaWdpdChwdHJbY29sICsgMV0pKQorICAgIHsKKwkvKgorCSAqIEZvdW5kIGhleGFkZWNpbWFsIG51bWJlciwgbW92ZSB0byBpdHMgc3RhcnQuCisJICovCisJLS1jb2w7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBTZWFyY2ggZm9yd2FyZCBhbmQgdGhlbiBiYWNrd2FyZCB0byBmaW5kIHRoZSBzdGFydCBvZiBudW1iZXIuCisJICovCisJY29sID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisKKwl3aGlsZSAocHRyW2NvbF0gIT0gTlVMCisJCSYmICF2aW1faXNkaWdpdChwdHJbY29sXSkKKwkJJiYgIShkb2FscCAmJiBBU0NJSV9JU0FMUEhBKHB0cltjb2xdKSkpCisJICAgICsrY29sOworCisJd2hpbGUgKGNvbCA+IDAKKwkJJiYgdmltX2lzZGlnaXQocHRyW2NvbCAtIDFdKQorCQkmJiAhKGRvYWxwICYmIEFTQ0lJX0lTQUxQSEEocHRyW2NvbF0pKSkKKwkgICAgLS1jb2w7CisgICAgfQorCisgICAgLyogdHJ1bmNhdGUgdG8gbWF4IGxlbmd0aCBvZiBhIG51bWJlciAqLworICAgIGlmIChsZW5ndGggPj0gTlVNQlVGTEVOIC0gMSkKKwlsZW5ndGggPSBOVU1CVUZMRU4gLSAyOworCisgICAgLyoKKyAgICAgKiBJZiBhIG51bWJlciB3YXMgZm91bmQsIGFuZCBzYXZpbmcgZm9yIHVuZG8gd29ya3MsIHJlcGxhY2UgdGhlIG51bWJlci4KKyAgICAgKi8KKyAgICBmaXJzdGRpZ2l0ID0gcHRyW2NvbF07CisgICAgUkxBRERTVUJGSVgocHRyKTsKKyAgICBpZiAoKCFWSU1fSVNESUdJVChmaXJzdGRpZ2l0KSAmJiAhKGRvYWxwICYmIEFTQ0lJX0lTQUxQSEEoZmlyc3RkaWdpdCkpKQorCSAgICB8fCB1X3NhdmVfY3Vyc29yKCkgIT0gT0spCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKiBnZXQgcHRyIGFnYWluLCBiZWNhdXNlIHVfc2F2ZSgpIG1heSBoYXZlIGNoYW5nZWQgaXQgKi8KKyAgICBwdHIgPSBtbF9nZXRfY3VybGluZSgpOworICAgIFJMQUREU1VCRklYKHB0cik7CisKKyAgICBpZiAoZG9hbHAgJiYgQVNDSUlfSVNBTFBIQShmaXJzdGRpZ2l0KSkKKyAgICB7CisJLyogZGVjcmVtZW50IG9yIGluY3JlbWVudCBhbHBoYWJldGljIGNoYXJhY3RlciAqLworCWlmIChjb21tYW5kID09IEN0cmxfWCkKKwl7CisJICAgIGlmIChDaGFyT3JkKGZpcnN0ZGlnaXQpIDwgUHJlbnVtMSkKKwkgICAgeworCQlpZiAoaXN1cHBlcihmaXJzdGRpZ2l0KSkKKwkJICAgIGZpcnN0ZGlnaXQgPSAnQSc7CisJCWVsc2UKKwkJICAgIGZpcnN0ZGlnaXQgPSAnYSc7CisJICAgIH0KKwkgICAgZWxzZQorI2lmZGVmIEVCQ0RJQworCQlmaXJzdGRpZ2l0ID0gRUJDRElDX0NIQVJfQUREKGZpcnN0ZGlnaXQsIC1QcmVudW0xKTsKKyNlbHNlCisJCWZpcnN0ZGlnaXQgLT0gUHJlbnVtMTsKKyNlbmRpZgorCX0KKwllbHNlCisJeworCSAgICBpZiAoMjYgLSBDaGFyT3JkKGZpcnN0ZGlnaXQpIC0gMSA8IFByZW51bTEpCisJICAgIHsKKwkJaWYgKGlzdXBwZXIoZmlyc3RkaWdpdCkpCisJCSAgICBmaXJzdGRpZ2l0ID0gJ1onOworCQllbHNlCisJCSAgICBmaXJzdGRpZ2l0ID0gJ3onOworCSAgICB9CisJICAgIGVsc2UKKyNpZmRlZiBFQkNESUMKKwkJZmlyc3RkaWdpdCA9IEVCQ0RJQ19DSEFSX0FERChmaXJzdGRpZ2l0LCBQcmVudW0xKTsKKyNlbHNlCisJCWZpcnN0ZGlnaXQgKz0gUHJlbnVtMTsKKyNlbmRpZgorCX0KKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbDsKKwkodm9pZClkZWxfY2hhcihGQUxTRSk7CisJaW5zX2NoYXIoZmlyc3RkaWdpdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbmVnYXRpdmUgPSBGQUxTRTsKKwlpZiAoY29sID4gMCAmJiBwdHJbY29sIC0gMV0gPT0gJy0nKQkgICAgLyogbmVnYXRpdmUgbnVtYmVyICovCisJeworCSAgICAtLWNvbDsKKwkgICAgbmVnYXRpdmUgPSBUUlVFOworCX0KKworCS8qIGdldCB0aGUgbnVtYmVyIHZhbHVlICh1bnNpZ25lZCkgKi8KKwl2aW1fc3RyMm5yKHB0ciArIGNvbCwgJmhleCwgJmxlbmd0aCwgZG9vY3QsIGRvaGV4LCBOVUxMLCAmbik7CisKKwkvKiBpZ25vcmUgbGVhZGluZyAnLScgZm9yIGhleCBhbmQgb2N0YWwgbnVtYmVycyAqLworCWlmIChoZXggJiYgbmVnYXRpdmUpCisJeworCSAgICArK2NvbDsKKwkgICAgLS1sZW5ndGg7CisJICAgIG5lZ2F0aXZlID0gRkFMU0U7CisJfQorCisJLyogYWRkIG9yIHN1YnRyYWN0ICovCisJc3VidHJhY3QgPSBGQUxTRTsKKwlpZiAoY29tbWFuZCA9PSBDdHJsX1gpCisJICAgIHN1YnRyYWN0IF49IFRSVUU7CisJaWYgKG5lZ2F0aXZlKQorCSAgICBzdWJ0cmFjdCBePSBUUlVFOworCisJb2xkbiA9IG47CisJaWYgKHN1YnRyYWN0KQorCSAgICBuIC09ICh1bnNpZ25lZCBsb25nKVByZW51bTE7CisJZWxzZQorCSAgICBuICs9ICh1bnNpZ25lZCBsb25nKVByZW51bTE7CisKKwkvKiBoYW5kbGUgd3JhcGFyb3VuZCBmb3IgZGVjaW1hbCBudW1iZXJzICovCisJaWYgKCFoZXgpCisJeworCSAgICBpZiAoc3VidHJhY3QpCisJICAgIHsKKwkJaWYgKG4gPiBvbGRuKQorCQl7CisJCSAgICBuID0gMSArIChuIF4gKHVuc2lnbmVkIGxvbmcpLTEpOworCQkgICAgbmVnYXRpdmUgXj0gVFJVRTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgLyogYWRkICovCisJICAgIHsKKwkJaWYgKG4gPCBvbGRuKQorCQl7CisJCSAgICBuID0gKG4gXiAodW5zaWduZWQgbG9uZyktMSk7CisJCSAgICBuZWdhdGl2ZSBePSBUUlVFOworCQl9CisJICAgIH0KKwkgICAgaWYgKG4gPT0gMCkKKwkJbmVnYXRpdmUgPSBGQUxTRTsKKwl9CisKKwkvKgorCSAqIERlbGV0ZSB0aGUgb2xkIG51bWJlci4KKwkgKi8KKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IGNvbDsKKwl0b2RlbCA9IGxlbmd0aDsKKwljID0gZ2NoYXJfY3Vyc29yKCk7CisJLyoKKwkgKiBEb24ndCBpbmNsdWRlIHRoZSAnLScgaW4gdGhlIGxlbmd0aCwgb25seSB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJ0CisJICogYWZ0ZXIgaXQgaXMga2VwdCB0aGUgc2FtZS4KKwkgKi8KKwlpZiAoYyA9PSAnLScpCisJICAgIC0tbGVuZ3RoOworCXdoaWxlICh0b2RlbC0tID4gMCkKKwl7CisJICAgIGlmIChjIDwgMHgxMDAgJiYgaXNhbHBoYShjKSkKKwkgICAgeworCQlpZiAoaXN1cHBlcihjKSkKKwkJICAgIGhleHVwcGVyID0gVFJVRTsKKwkJZWxzZQorCQkgICAgaGV4dXBwZXIgPSBGQUxTRTsKKwkgICAgfQorCSAgICAvKiBkZWxfY2hhcigpIHdpbGwgbWFyayBsaW5lIG5lZWRpbmcgZGlzcGxheWluZyAqLworCSAgICAodm9pZClkZWxfY2hhcihGQUxTRSk7CisJICAgIGMgPSBnY2hhcl9jdXJzb3IoKTsKKwl9CisKKwkvKgorCSAqIFByZXBhcmUgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBpbiBidWYxW10uCisJICogV2hlbiB0aGVyZSBhcmUgbWFueSBsZWFkaW5nIHplcm9zIGl0IGNvdWxkIGJlIHZlcnkgbG9uZy4gIEFsbG9jYXRlCisJICogYSBiaXQgdG9vIG11Y2guCisJICovCisJYnVmMSA9IGFsbG9jKCh1bnNpZ25lZClsZW5ndGggKyBOVU1CVUZMRU4pOworCWlmIChidWYxID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCXB0ciA9IGJ1ZjE7CisJaWYgKG5lZ2F0aXZlKQorCXsKKwkgICAgKnB0cisrID0gJy0nOworCX0KKwlpZiAoaGV4KQorCXsKKwkgICAgKnB0cisrID0gJzAnOworCSAgICAtLWxlbmd0aDsKKwl9CisJaWYgKGhleCA9PSAneCcgfHwgaGV4ID09ICdYJykKKwl7CisJICAgICpwdHIrKyA9IGhleDsKKwkgICAgLS1sZW5ndGg7CisJfQorCisJLyoKKwkgKiBQdXQgdGhlIG51bWJlciBjaGFyYWN0ZXJzIGluIGJ1ZjJbXS4KKwkgKi8KKwlpZiAoaGV4ID09IDApCisJICAgIHNwcmludGYoKGNoYXIgKilidWYyLCAiJWx1Iiwgbik7CisJZWxzZSBpZiAoaGV4ID09ICcwJykKKwkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZjIsICIlbG8iLCBuKTsKKwllbHNlIGlmIChoZXggJiYgaGV4dXBwZXIpCisJICAgIHNwcmludGYoKGNoYXIgKilidWYyLCAiJWxYIiwgbik7CisJZWxzZQorCSAgICBzcHJpbnRmKChjaGFyICopYnVmMiwgIiVseCIsIG4pOworCWxlbmd0aCAtPSAoaW50KVNUUkxFTihidWYyKTsKKworCS8qCisJICogYWRqdXN0IG51bWJlciBvZiB6ZXJvcyB0byB0aGUgbmV3IG51bWJlciBvZiBkaWdpdHMsIHNvIHRoZQorCSAqIHRvdGFsIGxlbmd0aCBvZiB0aGUgbnVtYmVyIHJlbWFpbnMgdGhlIHNhbWUKKwkgKi8KKwlpZiAoZmlyc3RkaWdpdCA9PSAnMCcpCisJICAgIHdoaWxlIChsZW5ndGgtLSA+IDApCisJCSpwdHIrKyA9ICcwJzsKKwkqcHRyID0gTlVMOworCVNUUkNBVChidWYxLCBidWYyKTsKKwlpbnNfc3RyKGJ1ZjEpOwkJLyogaW5zZXJ0IHRoZSBuZXcgbnVtYmVyICovCisJdmltX2ZyZWUoYnVmMSk7CisgICAgfQorICAgIC0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBwdHIgPSBtbF9nZXRfYnVmKGN1cmJ1ZiwgY3Vyd2luLT53X2N1cnNvci5sbnVtLCBUUlVFKTsKKyAgICBSTEFERFNVQkZJWChwdHIpOworI2VuZGlmCisgICAgcmV0dXJuIE9LOworfQorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisgICAgaW50CityZWFkX3ZpbWluZm9fcmVnaXN0ZXIodmlycCwgZm9yY2UpCisgICAgdmlyX1QJKnZpcnA7CisgICAgaW50CQlmb3JjZTsKK3sKKyAgICBpbnQJCWVvZjsKKyAgICBpbnQJCWRvX2l0ID0gVFJVRTsKKyAgICBpbnQJCXNpemU7CisgICAgaW50CQlsaW1pdDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlzZXRfcHJldiA9IEZBTFNFOworICAgIGNoYXJfdQkqc3RyOworICAgIGNoYXJfdQkqKmFycmF5ID0gTlVMTDsKKworICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgKGhvcGVmdWxseSkgaWYgbGluZVswXSA9PSAnIicgKi8KKyAgICBzdHIgPSB2aXJwLT52aXJfbGluZSArIDE7CisgICAgaWYgKCpzdHIgPT0gJyInKQorICAgIHsKKwlzZXRfcHJldiA9IFRSVUU7CisJc3RyKys7CisgICAgfQorICAgIGlmICghQVNDSUlfSVNBTE5VTSgqc3RyKSAmJiAqc3RyICE9ICctJykKKyAgICB7CisJaWYgKHZpbWluZm9fZXJyb3IoIkU1Nzc6ICIsIF8oIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIpLCB2aXJwLT52aXJfbGluZSkpCisJICAgIHJldHVybiBUUlVFOwkvKiB0b28gbWFueSBlcnJvcnMsIHByZXRlbmQgZW5kLW9mLWZpbGUgKi8KKwlkb19pdCA9IEZBTFNFOworICAgIH0KKyAgICBnZXRfeWFua19yZWdpc3Rlcigqc3RyKyssIEZBTFNFKTsKKyAgICBpZiAoIWZvcmNlICYmIHlfY3VycmVudC0+eV9hcnJheSAhPSBOVUxMKQorCWRvX2l0ID0gRkFMU0U7CisgICAgc2l6ZSA9IDA7CisgICAgbGltaXQgPSAxMDA7CS8qIE9wdGltaXplZCBmb3IgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgPD0gMTAwIGxpbmVzICovCisgICAgaWYgKGRvX2l0KQorICAgIHsKKwlpZiAoc2V0X3ByZXYpCisJICAgIHlfcHJldmlvdXMgPSB5X2N1cnJlbnQ7CisJdmltX2ZyZWUoeV9jdXJyZW50LT55X2FycmF5KTsKKwlhcnJheSA9IHlfY3VycmVudC0+eV9hcnJheSA9CisJCSAgICAgICAoY2hhcl91ICoqKWFsbG9jKCh1bnNpZ25lZCkobGltaXQgKiBzaXplb2YoY2hhcl91ICopKSk7CisJc3RyID0gc2tpcHdoaXRlKHN0cik7CisJaWYgKFNUUk5DTVAoc3RyLCAiQ0hBUiIsIDQpID09IDApCisJICAgIHlfY3VycmVudC0+eV90eXBlID0gTUNIQVI7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwllbHNlIGlmIChTVFJOQ01QKHN0ciwgIkJMT0NLIiwgNSkgPT0gMCkKKwkgICAgeV9jdXJyZW50LT55X3R5cGUgPSBNQkxPQ0s7CisjZW5kaWYKKwllbHNlCisJICAgIHlfY3VycmVudC0+eV90eXBlID0gTUxJTkU7CisJLyogZ2V0IHRoZSBibG9jayB3aWR0aDsgaWYgaXQncyBtaXNzaW5nIHdlIGdldCBhIHplcm8sIHdoaWNoIGlzIE9LICovCisJc3RyID0gc2tpcHdoaXRlKHNraXB0b3doaXRlKHN0cikpOworI2lmZGVmIEZFQVRfVklTVUFMCisJeV9jdXJyZW50LT55X3dpZHRoID0gZ2V0ZGlnaXRzKCZzdHIpOworI2Vsc2UKKwkodm9pZClnZXRkaWdpdHMoJnN0cik7CisjZW5kaWYKKyAgICB9CisKKyAgICB3aGlsZSAoIShlb2YgPSB2aW1pbmZvX3JlYWRsaW5lKHZpcnApKQorCQkgICAgJiYgKHZpcnAtPnZpcl9saW5lWzBdID09IFRBQiB8fCB2aXJwLT52aXJfbGluZVswXSA9PSAnPCcpKQorICAgIHsKKwlpZiAoZG9faXQpCisJeworCSAgICBpZiAoc2l6ZSA+PSBsaW1pdCkKKwkgICAgeworCQl5X2N1cnJlbnQtPnlfYXJyYXkgPSAoY2hhcl91ICoqKQorCQkJICAgICAgYWxsb2MoKHVuc2lnbmVkKShsaW1pdCAqIDIgKiBzaXplb2YoY2hhcl91ICopKSk7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKQorCQkgICAgeV9jdXJyZW50LT55X2FycmF5W2ldID0gYXJyYXlbaV07CisJCXZpbV9mcmVlKGFycmF5KTsKKwkJbGltaXQgKj0gMjsKKwkJYXJyYXkgPSB5X2N1cnJlbnQtPnlfYXJyYXk7CisJICAgIH0KKwkgICAgc3RyID0gdmltaW5mb19yZWFkc3RyaW5nKHZpcnAsIDEsIFRSVUUpOworCSAgICBpZiAoc3RyICE9IE5VTEwpCisJCWFycmF5W3NpemUrK10gPSBzdHI7CisJICAgIGVsc2UKKwkJZG9faXQgPSBGQUxTRTsKKwl9CisgICAgfQorICAgIGlmIChkb19pdCkKKyAgICB7CisJaWYgKHNpemUgPT0gMCkKKwl7CisJICAgIHZpbV9mcmVlKGFycmF5KTsKKwkgICAgeV9jdXJyZW50LT55X2FycmF5ID0gTlVMTDsKKwl9CisJZWxzZSBpZiAoc2l6ZSA8IGxpbWl0KQorCXsKKwkgICAgeV9jdXJyZW50LT55X2FycmF5ID0KKwkJCShjaGFyX3UgKiopYWxsb2MoKHVuc2lnbmVkKShzaXplICogc2l6ZW9mKGNoYXJfdSAqKSkpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl5X2N1cnJlbnQtPnlfYXJyYXlbaV0gPSBhcnJheVtpXTsKKwkgICAgdmltX2ZyZWUoYXJyYXkpOworCX0KKwl5X2N1cnJlbnQtPnlfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBlb2Y7Cit9CisKKyAgICB2b2lkCit3cml0ZV92aW1pbmZvX3JlZ2lzdGVycyhmcCkKKyAgICBGSUxFICAgICpmcDsKK3sKKyAgICBpbnQJICAgIGksIGo7CisgICAgY2hhcl91ICAqdHlwZTsKKyAgICBjaGFyX3UgIGM7CisgICAgaW50CSAgICBudW1fbGluZXM7CisgICAgaW50CSAgICBtYXhfbnVtX2xpbmVzOworICAgIGludAkgICAgbWF4X2tieXRlOworICAgIGxvbmcgICAgbGVuOworCisgICAgZnByaW50ZihmcCwgXygiXG4jIFJlZ2lzdGVyczpcbiIpKTsKKworICAgIC8qIEdldCAnPCcgdmFsdWUsIHVzZSBvbGQgJyInIHZhbHVlIGlmICc8JyBpcyBub3QgZm91bmQuICovCisgICAgbWF4X251bV9saW5lcyA9IGdldF92aW1pbmZvX3BhcmFtZXRlcignPCcpOworICAgIGlmIChtYXhfbnVtX2xpbmVzIDwgMCkKKwltYXhfbnVtX2xpbmVzID0gZ2V0X3ZpbWluZm9fcGFyYW1ldGVyKCciJyk7CisgICAgaWYgKG1heF9udW1fbGluZXMgPT0gMCkKKwlyZXR1cm47CisgICAgbWF4X2tieXRlID0gZ2V0X3ZpbWluZm9fcGFyYW1ldGVyKCdzJyk7CisgICAgaWYgKG1heF9rYnl0ZSA9PSAwKQorCXJldHVybjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR0lTVEVSUzsgaSsrKQorICAgIHsKKwlpZiAoeV9yZWdzW2ldLnlfYXJyYXkgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKwkvKiBTa2lwICcqJy8nKycgcmVnaXN0ZXIsIHdlIGRvbid0IHdhbnQgdGhlbSBiYWNrIG5leHQgdGltZSAqLworCWlmIChpID09IFNUQVJfUkVHSVNURVIgfHwgaSA9PSBQTFVTX1JFR0lTVEVSKQorCSAgICBjb250aW51ZTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRE5ECisJLyogTmVpdGhlciBkbyB3ZSB3YW50IHRoZSAnficgcmVnaXN0ZXIgKi8KKwlpZiAoaSA9PSBUSUxERV9SRUdJU1RFUikKKwkgICAgY29udGludWU7CisjZW5kaWYKKwludW1fbGluZXMgPSB5X3JlZ3NbaV0ueV9zaXplOworCWlmIChtYXhfa2J5dGUgPiAwKQorCXsKKwkgICAgLyogU2tpcCByZWdpc3RlciBpZiB0aGVyZSBpcyBtb3JlIHRleHQgdGhhbiB0aGUgbWF4aW11bSBzaXplLiAqLworCSAgICBsZW4gPSAwOworCSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2xpbmVzOyBqKyspCisJCWxlbiArPSBTVFJMRU4oeV9yZWdzW2ldLnlfYXJyYXlbal0pICsgMUw7CisJICAgIGlmIChsZW4gPiAobG9uZyltYXhfa2J5dGUgKiAxMDI0TCkKKwkJY29udGludWU7CisJfQorCisJc3dpdGNoICh5X3JlZ3NbaV0ueV90eXBlKQorCXsKKwkgICAgY2FzZSBNTElORToKKwkJdHlwZSA9IChjaGFyX3UgKikiTElORSI7CisJCWJyZWFrOworCSAgICBjYXNlIE1DSEFSOgorCQl0eXBlID0gKGNoYXJfdSAqKSJDSEFSIjsKKwkJYnJlYWs7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkgICAgY2FzZSBNQkxPQ0s6CisJCXR5cGUgPSAoY2hhcl91ICopIkJMT0NLIjsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgZGVmYXVsdDoKKwkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIiksCisJCSAgICB5X3JlZ3NbaV0ueV90eXBlKTsKKwkJZW1zZyhJT2J1ZmYpOworCQl0eXBlID0gKGNoYXJfdSAqKSJMSU5FIjsKKwkJYnJlYWs7CisJfQorCWlmICh5X3ByZXZpb3VzID09ICZ5X3JlZ3NbaV0pCisJICAgIGZwcmludGYoZnAsICJcIiIpOworCWMgPSBnZXRfcmVnaXN0ZXJfbmFtZShpKTsKKwlmcHJpbnRmKGZwLCAiXCIlY1x0JXNcdCVkXG4iLCBjLCB0eXBlLAorI2lmZGVmIEZFQVRfVklTVUFMCisJCSAgICAoaW50KXlfcmVnc1tpXS55X3dpZHRoCisjZWxzZQorCQkgICAgMAorI2VuZGlmCisJCSAgICApOworCisJLyogSWYgbWF4X251bV9saW5lcyA8IDAsIHRoZW4gd2Ugc2F2ZSBBTEwgdGhlIGxpbmVzIGluIHRoZSByZWdpc3RlciAqLworCWlmIChtYXhfbnVtX2xpbmVzID4gMCAmJiBudW1fbGluZXMgPiBtYXhfbnVtX2xpbmVzKQorCSAgICBudW1fbGluZXMgPSBtYXhfbnVtX2xpbmVzOworCWZvciAoaiA9IDA7IGogPCBudW1fbGluZXM7IGorKykKKwl7CisJICAgIHB1dGMoJ1x0JywgZnApOworCSAgICB2aW1pbmZvX3dyaXRlc3RyaW5nKGZwLCB5X3JlZ3NbaV0ueV9hcnJheVtqXSk7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBGRUFUX1ZJTUlORk8gKi8KKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU0VMRUNUSU9OIC8gUFJJTUFSWSAoJyonKQorICoKKyAqIFRleHQgc2VsZWN0aW9uIHN0dWZmIHRoYXQgdXNlcyB0aGUgR1VJIHNlbGVjdGlvbiByZWdpc3RlciAnKicuICBXaGVuIHVzaW5nIGEKKyAqIEdVSSB0aGlzIG1heSBiZSB0ZXh0IGZyb20gYW5vdGhlciB3aW5kb3csIG90aGVyd2lzZSBpdCBpcyB0aGUgbGFzdCB0ZXh0IHdlCisgKiBoYWQgaGlnaGxpZ2h0ZWQgd2l0aCBWSXN1YWwgbW9kZS4gIFdpdGggbW91c2Ugc3VwcG9ydCwgY2xpY2tpbmcgdGhlIG1pZGRsZQorICogYnV0dG9uIHBlcmZvcm1zIHRoZSBwYXN0ZSwgb3RoZXJ3aXNlIHlvdSB3aWxsIG5lZWQgdG8gZG8gPCIqcD4uICIKKyAqIElmIG5vdCB1bmRlciBYLCBpdCBpcyBzeW5vbnltb3VzIHdpdGggdGhlIGNsaXBib2FyZCByZWdpc3RlciAnKycuCisgKgorICogWCBDTElQQk9BUkQgKCcrJykKKyAqCisgKiBUZXh0IHNlbGVjdGlvbiBzdHVmZiB0aGF0IHVzZXMgdGhlIEdVSSBjbGlwYm9hcmQgcmVnaXN0ZXIgJysnLgorICogVW5kZXIgWCwgdGhpcyBtYXRjaGVzIHRoZSBzdGFuZGFyZCBjdXQvcGFzdGUgYnVmZmVyIENMSVBCT0FSRCBzZWxlY3Rpb24uCisgKiBJdCB3aWxsIGJlIHVzZWQgZm9yIHVubmFtZWQgY3V0L3Bhc3RpbmcgaXMgJ2NsaXBib2FyZCcgY29udGFpbnMgInVubmFtZWQiLAorICogb3RoZXJ3aXNlIHlvdSB3aWxsIG5lZWQgdG8gZG8gPCIrcD4uICIKKyAqIElmIG5vdCB1bmRlciBYLCBpdCBpcyBzeW5vbnltb3VzIHdpdGggdGhlIHNlbGVjdGlvbiByZWdpc3RlciAnKicuCisgKi8KKworLyoKKyAqIFJvdXRpbmUgdG8gZXhwb3J0IGFueSBmaW5hbCBYIHNlbGVjdGlvbiB3ZSBoYWQgdG8gdGhlIGVudmlyb25tZW50CisgKiBzbyB0aGF0IHRoZSB0ZXh0IGlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB2aW0gaGFzIGV4aXRlZC4gWCBzZWxlY3Rpb25zCisgKiBvbmx5IGV4aXN0IHdoaWxlIHRoZSBvd25pbmcgYXBwbGljYXRpb24gZXhpc3RzLCBzbyB3ZSB3cml0ZSB0byB0aGUKKyAqIHBlcm1hbmVudCAod2hpbGUgWCBydW5zKSBzdG9yZSBDVVRfQlVGRkVSMC4KKyAqIER1bXAgdGhlIENMSVBCT0FSRCBzZWxlY3Rpb24gaWYgd2Ugb3duIGl0IChpdCdzIGxvZ2ljYWxseSB0aGUgbW9yZQorICogJ3Blcm1hbmVudCcgb2YgdGhlIHR3byksIG90aGVyd2lzZSB0aGUgUFJJTUFSWSBvbmUuCisgKiBGb3Igbm93LCB1c2UgYSBoYXJkLWNvZGVkIHNhbml0eSBsaW1pdCBvZiAxTWIgb2YgZGF0YS4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9YMTEpICYmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpCisgICAgdm9pZAoreDExX2V4cG9ydF9maW5hbF9zZWxlY3Rpb24oKQoreworICAgIERpc3BsYXkJKmRweTsKKyAgICBjaGFyX3UJKnN0ciA9IE5VTEw7CisgICAgbG9uZ191CWxlbiA9IDA7CisgICAgaW50CQltb3Rpb25fdHlwZSA9IC0xOworCisjIGlmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJZHB5ID0gWF9ESVNQTEFZOworICAgIGVsc2UKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisJZHB5ID0geHRlcm1fZHB5OworIyBlbHNlCisJcmV0dXJuOworIyBlbmRpZgorCisgICAgLyogR2V0IHNlbGVjdGlvbiB0byBleHBvcnQgKi8KKyAgICBpZiAoY2xpcF9wbHVzLm93bmVkKQorCW1vdGlvbl90eXBlID0gY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigmc3RyLCAmbGVuLCAmY2xpcF9wbHVzKTsKKyAgICBlbHNlIGlmIChjbGlwX3N0YXIub3duZWQpCisJbW90aW9uX3R5cGUgPSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCZzdHIsICZsZW4sICZjbGlwX3N0YXIpOworCisgICAgLyogQ2hlY2sgaXQncyBPSyAqLworICAgIGlmIChkcHkgIT0gTlVMTCAmJiBzdHIgIT0gTlVMTCAmJiBtb3Rpb25fdHlwZSA+PSAwCisJCQkJCSAgICAgICAmJiBsZW4gPCAxMDI0KjEwMjQgJiYgbGVuID4gMCkKKyAgICB7CisJWFN0b3JlQnVmZmVyKGRweSwgKGNoYXIgKilzdHIsIChpbnQpbGVuLCAwKTsKKwlYRmx1c2goZHB5KTsKKyAgICB9CisKKyAgICB2aW1fZnJlZShzdHIpOworfQorI2VuZGlmCisKKyAgICB2b2lkCitjbGlwX2ZyZWVfc2VsZWN0aW9uKGNiZCkKKyAgICBWaW1DbGlwYm9hcmQJKmNiZDsKK3sKKyAgICBzdHJ1Y3QgeWFua3JlZyAqeV9wdHIgPSB5X2N1cnJlbnQ7CisKKyAgICBpZiAoY2JkID09ICZjbGlwX3BsdXMpCisJeV9jdXJyZW50ID0gJnlfcmVnc1tQTFVTX1JFR0lTVEVSXTsKKyAgICBlbHNlCisJeV9jdXJyZW50ID0gJnlfcmVnc1tTVEFSX1JFR0lTVEVSXTsKKyAgICBmcmVlX3lhbmtfYWxsKCk7CisgICAgeV9jdXJyZW50LT55X3NpemUgPSAwOworICAgIHlfY3VycmVudCA9IHlfcHRyOworfQorCisvKgorICogR2V0IHRoZSBzZWxlY3RlZCB0ZXh0IGFuZCBwdXQgaXQgaW4gdGhlIGd1aSBzZWxlY3Rpb24gcmVnaXN0ZXIgJyonIG9yICcrJy4KKyAqLworICAgIHZvaWQKK2NsaXBfZ2V0X3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisgICAgc3RydWN0IHlhbmtyZWcgKm9sZF95X3ByZXZpb3VzLCAqb2xkX3lfY3VycmVudDsKKyAgICBwb3NfVAlvbGRfY3Vyc29yOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgcG9zX1QJb2xkX3Zpc3VhbDsKKyAgICBpbnQJCW9sZF92aXN1YWxfbW9kZTsKKyNlbmRpZgorICAgIGNvbG5yX1QJb2xkX2N1cnN3YW50OworICAgIGludAkJb2xkX3NldF9jdXJzd2FudDsKKyAgICBwb3NfVAlvbGRfb3Bfc3RhcnQsIG9sZF9vcF9lbmQ7CisgICAgb3BhcmdfVAlvYTsKKyAgICBjbWRhcmdfVAljYTsKKworICAgIGlmIChjYmQtPm93bmVkKQorICAgIHsKKwlpZiAoKGNiZCA9PSAmY2xpcF9wbHVzICYmIHlfcmVnc1tQTFVTX1JFR0lTVEVSXS55X2FycmF5ICE9IE5VTEwpCisJCXx8IChjYmQgPT0gJmNsaXBfc3RhciAmJiB5X3JlZ3NbU1RBUl9SRUdJU1RFUl0ueV9hcnJheSAhPSBOVUxMKSkKKwkgICAgcmV0dXJuOworCisJLyogR2V0IHRoZSB0ZXh0IGJldHdlZW4gY2xpcF9zdGFyLnN0YXJ0ICYgY2xpcF9zdGFyLmVuZCAqLworCW9sZF95X3ByZXZpb3VzID0geV9wcmV2aW91czsKKwlvbGRfeV9jdXJyZW50ID0geV9jdXJyZW50OworCW9sZF9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworCW9sZF9jdXJzd2FudCA9IGN1cndpbi0+d19jdXJzd2FudDsKKwlvbGRfc2V0X2N1cnN3YW50ID0gY3Vyd2luLT53X3NldF9jdXJzd2FudDsKKwlvbGRfb3Bfc3RhcnQgPSBjdXJidWYtPmJfb3Bfc3RhcnQ7CisJb2xkX29wX2VuZCA9IGN1cmJ1Zi0+Yl9vcF9lbmQ7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwlvbGRfdmlzdWFsID0gVklzdWFsOworCW9sZF92aXN1YWxfbW9kZSA9IFZJc3VhbF9tb2RlOworI2VuZGlmCisJY2xlYXJfb3BhcmcoJm9hKTsKKwlvYS5yZWduYW1lID0gKGNiZCA9PSAmY2xpcF9wbHVzID8gJysnIDogJyonKTsKKwlvYS5vcF90eXBlID0gT1BfWUFOSzsKKwl2aW1fbWVtc2V0KCZjYSwgMCwgc2l6ZW9mKGNhKSk7CisJY2Eub2FwID0gJm9hOworCWNhLmNtZGNoYXIgPSAneSc7CisJY2EuY291bnQxID0gMTsKKwljYS5yZXR2YWwgPSBDQV9OT19BREpfT1BfRU5EOworCWRvX3BlbmRpbmdfb3BlcmF0b3IoJmNhLCAwLCBUUlVFKTsKKwl5X3ByZXZpb3VzID0gb2xkX3lfcHJldmlvdXM7CisJeV9jdXJyZW50ID0gb2xkX3lfY3VycmVudDsKKwljdXJ3aW4tPndfY3Vyc29yID0gb2xkX2N1cnNvcjsKKwljdXJ3aW4tPndfY3Vyc3dhbnQgPSBvbGRfY3Vyc3dhbnQ7CisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IG9sZF9zZXRfY3Vyc3dhbnQ7CisJY3VyYnVmLT5iX29wX3N0YXJ0ID0gb2xkX29wX3N0YXJ0OworCWN1cmJ1Zi0+Yl9vcF9lbmQgPSBvbGRfb3BfZW5kOworI2lmZGVmIEZFQVRfVklTVUFMCisJVklzdWFsID0gb2xkX3Zpc3VhbDsKKwlWSXN1YWxfbW9kZSA9IG9sZF92aXN1YWxfbW9kZTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworCWNsaXBfZnJlZV9zZWxlY3Rpb24oY2JkKTsKKworCS8qIFRyeSB0byBnZXQgc2VsZWN0ZWQgdGV4dCBmcm9tIGFub3RoZXIgd2luZG93ICovCisJY2xpcF9nZW5fcmVxdWVzdF9zZWxlY3Rpb24oY2JkKTsKKyAgICB9Cit9CisKKy8qIENvbnZlcnQgZnJvbSB0aGUgR1VJIHNlbGVjdGlvbiBzdHJpbmcgaW50byB0aGUgJyonLycrJyByZWdpc3RlciAqLworICAgIHZvaWQKK2NsaXBfeWFua19zZWxlY3Rpb24odHlwZSwgc3RyLCBsZW4sIGNiZCkKKyAgICBpbnQJCXR5cGU7CisgICAgY2hhcl91CSpzdHI7CisgICAgbG9uZwlsZW47CisgICAgVmltQ2xpcGJvYXJkICpjYmQ7Cit7CisgICAgc3RydWN0IHlhbmtyZWcgKnlfcHRyOworCisgICAgaWYgKGNiZCA9PSAmY2xpcF9wbHVzKQorCXlfcHRyID0gJnlfcmVnc1tQTFVTX1JFR0lTVEVSXTsKKyAgICBlbHNlCisJeV9wdHIgPSAmeV9yZWdzW1NUQVJfUkVHSVNURVJdOworCisgICAgY2xpcF9mcmVlX3NlbGVjdGlvbihjYmQpOworCisgICAgc3RyX3RvX3JlZyh5X3B0ciwgdHlwZSwgc3RyLCBsZW4sIDBMKTsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlICcqJy8nKycgcmVnaXN0ZXIgaW50byBhIEdVSSBzZWxlY3Rpb24gc3RyaW5nIHJldHVybmVkIGluICpzdHIKKyAqIHdpdGggbGVuZ3RoICpsZW4uCisgKiBSZXR1cm5zIHRoZSBtb3Rpb24gdHlwZSwgb3IgLTEgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK2NsaXBfY29udmVydF9zZWxlY3Rpb24oc3RyLCBsZW4sIGNiZCkKKyAgICBjaGFyX3UJKipzdHI7CisgICAgbG9uZ191CSpsZW47CisgICAgVmltQ2xpcGJvYXJkICpjYmQ7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbG51bTsKKyAgICBpbnQJCWksIGo7CisgICAgaW50X3UJZW9sc2l6ZTsKKyAgICBzdHJ1Y3QgeWFua3JlZyAqeV9wdHI7CisKKyAgICBpZiAoY2JkID09ICZjbGlwX3BsdXMpCisJeV9wdHIgPSAmeV9yZWdzW1BMVVNfUkVHSVNURVJdOworICAgIGVsc2UKKwl5X3B0ciA9ICZ5X3JlZ3NbU1RBUl9SRUdJU1RFUl07CisKKyNpZmRlZiBVU0VfQ1JOTAorICAgIGVvbHNpemUgPSAyOworI2Vsc2UKKyAgICBlb2xzaXplID0gMTsKKyNlbmRpZgorCisgICAgKnN0ciA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgaWYgKHlfcHRyLT55X2FycmF5ID09IE5VTEwpCisJcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IHlfcHRyLT55X3NpemU7IGkrKykKKwkqbGVuICs9IChsb25nX3UpU1RSTEVOKHlfcHRyLT55X2FycmF5W2ldKSArIGVvbHNpemU7CisKKyAgICAvKgorICAgICAqIERvbid0IHdhbnQgbmV3bGluZSBjaGFyYWN0ZXIgYXQgZW5kIG9mIGxhc3QgbGluZSBpZiB3ZSdyZSBpbiBNQ0hBUiBtb2RlLgorICAgICAqLworICAgIGlmICh5X3B0ci0+eV90eXBlID09IE1DSEFSICYmICpsZW4gPj0gZW9sc2l6ZSkKKwkqbGVuIC09IGVvbHNpemU7CisKKyAgICBwID0gKnN0ciA9IGxhbGxvYygqbGVuICsgMSwgVFJVRSk7CS8qIGFkZCBvbmUgdG8gYXZvaWQgemVybyAqLworICAgIGlmIChwID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgIGxudW0gPSAwOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgKGludCkqbGVuOyBpKyssIGorKykKKyAgICB7CisJaWYgKHlfcHRyLT55X2FycmF5W2xudW1dW2pdID09ICdcbicpCisJICAgIHBbaV0gPSBOVUw7CisJZWxzZSBpZiAoeV9wdHItPnlfYXJyYXlbbG51bV1bal0gPT0gTlVMKQorCXsKKyNpZmRlZiBVU0VfQ1JOTAorCSAgICBwW2krK10gPSAnXHInOworI2VuZGlmCisjaWZkZWYgVVNFX0NSCisJICAgIHBbaV0gPSAnXHInOworI2Vsc2UKKwkgICAgcFtpXSA9ICdcbic7CisjZW5kaWYKKwkgICAgbG51bSsrOworCSAgICBqID0gLTE7CisJfQorCWVsc2UKKwkgICAgcFtpXSA9IHlfcHRyLT55X2FycmF5W2xudW1dW2pdOworICAgIH0KKyAgICByZXR1cm4geV9wdHItPnlfdHlwZTsKK30KKworCisjIGlmIGRlZmluZWQoRkVBVF9WSVNVQUwpIHx8IGRlZmluZWQoRkVBVF9FVkFMKQorLyoKKyAqIElmIHdlIGhhdmUgd3JpdHRlbiB0byBhIGNsaXBib2FyZCByZWdpc3Rlciwgc2VuZCB0aGUgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgorICovCisgICAgc3RhdGljIHZvaWQKK21heV9zZXRfc2VsZWN0aW9uKCkKK3sKKyAgICBpZiAoeV9jdXJyZW50ID09ICYoeV9yZWdzW1NUQVJfUkVHSVNURVJdKSAmJiBjbGlwX3N0YXIuYXZhaWxhYmxlKQorICAgIHsKKwljbGlwX293bl9zZWxlY3Rpb24oJmNsaXBfc3Rhcik7CisJY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoeV9jdXJyZW50ID09ICYoeV9yZWdzW1BMVVNfUkVHSVNURVJdKSAmJiBjbGlwX3BsdXMuYXZhaWxhYmxlKQorICAgIHsKKwljbGlwX293bl9zZWxlY3Rpb24oJmNsaXBfcGx1cyk7CisJY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9wbHVzKTsKKyAgICB9Cit9CisjIGVuZGlmCisKKyNlbmRpZiAvKiBGRUFUX0NMSVBCT0FSRCB8fCBQUk9UTyAqLworCisKKyNpZiBkZWZpbmVkKEZFQVRfRE5EKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAnficgcmVnaXN0ZXIgd2l0aCBzdHIuCisgKi8KKyAgICB2b2lkCitkbmRfeWFua19kcmFnX2RhdGEoc3RyLCBsZW4pCisgICAgY2hhcl91CSpzdHI7CisgICAgbG9uZwlsZW47Cit7CisgICAgc3RydWN0IHlhbmtyZWcgKmN1cnI7CisKKyAgICBjdXJyID0geV9jdXJyZW50OworICAgIHlfY3VycmVudCA9ICZ5X3JlZ3NbVElMREVfUkVHSVNURVJdOworICAgIGZyZWVfeWFua19hbGwoKTsKKyAgICBzdHJfdG9fcmVnKHlfY3VycmVudCwgTUNIQVIsIHN0ciwgbGVuLCAwTCk7CisgICAgeV9jdXJyZW50ID0gY3VycjsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gdGhlIHR5cGUgb2YgYSByZWdpc3Rlci4KKyAqIFVzZWQgZm9yIGdldHJlZ3R5cGUoKQorICogUmV0dXJucyBNQVVUTyBmb3IgZXJyb3IuCisgKi8KKyAgICBjaGFyX3UKK2dldF9yZWdfdHlwZShyZWduYW1lLCByZWdsZW4pCisgICAgaW50CSAgICByZWduYW1lOworICAgIGxvbmcgICAgKnJlZ2xlbjsKK3sKKyAgICBzd2l0Y2ggKHJlZ25hbWUpCisgICAgeworCWNhc2UgJyUnOgkJLyogZmlsZSBuYW1lICovCisJY2FzZSAnIyc6CQkvKiBhbHRlcm5hdGUgZmlsZSBuYW1lICovCisJY2FzZSAnPSc6CQkvKiBleHByZXNzaW9uICovCisJY2FzZSAnOic6CQkvKiBsYXN0IGNvbW1hbmQgbGluZSAqLworCWNhc2UgJy8nOgkJLyogbGFzdCBzZWFyY2gtcGF0dGVybiAqLworCWNhc2UgJy4nOgkJLyogbGFzdCBpbnNlcnRlZCB0ZXh0ICovCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisJY2FzZSBDdHJsX0Y6CQkvKiBGaWxlbmFtZSB1bmRlciBjdXJzb3IgKi8KKwljYXNlIEN0cmxfUDoJCS8qIFBhdGggdW5kZXIgY3Vyc29yLCBleHBhbmQgdmlhICJwYXRoIiAqLworI2VuZGlmCisJY2FzZSBDdHJsX1c6CQkvKiB3b3JkIHVuZGVyIGN1cnNvciAqLworCWNhc2UgQ3RybF9BOgkJLyogV09SRCAobW5lbW9uaWMgQWxsKSB1bmRlciBjdXJzb3IgKi8KKwljYXNlICdfJzoJCS8qIGJsYWNrIGhvbGU6IGFsd2F5cyBlbXB0eSAqLworCSAgICByZXR1cm4gTUNIQVI7CisgICAgfQorCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICByZWduYW1lID0gbWF5X2dldF9zZWxlY3Rpb24ocmVnbmFtZSk7CisjZW5kaWYKKworICAgIC8qIFNob3VsZCB3ZSBjaGVjayBmb3IgYSB2YWxpZCBuYW1lPyAqLworICAgIGdldF95YW5rX3JlZ2lzdGVyKHJlZ25hbWUsIEZBTFNFKTsKKworICAgIGlmICh5X2N1cnJlbnQtPnlfYXJyYXkgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwlpZiAocmVnbGVuICE9IE5VTEwgJiYgeV9jdXJyZW50LT55X3R5cGUgPT0gTUJMT0NLKQorCSAgICAqcmVnbGVuID0geV9jdXJyZW50LT55X3dpZHRoOworI2VuZGlmCisJcmV0dXJuIHlfY3VycmVudC0+eV90eXBlOworICAgIH0KKyAgICByZXR1cm4gTUFVVE87Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIGEgcmVnaXN0ZXIgYXMgYSBzaW5nbGUgYWxsb2NhdGVkIHN0cmluZy4KKyAqIFVzZWQgZm9yICJAciIgaW4gZXhwcmVzc2lvbnMgYW5kIGZvciBnZXRyZWcoKS4KKyAqIFJldHVybnMgTlVMTCBmb3IgZXJyb3IuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X3JlZ19jb250ZW50cyhyZWduYW1lLCBhbGxvd2V4cHIpCisgICAgaW50CQlyZWduYW1lOworICAgIGludAkJYWxsb3dleHByOwkvKiBhbGxvdyAiPSIgcmVnaXN0ZXIuICovCit7CisgICAgbG9uZwlpOworICAgIGNoYXJfdQkqcmV0dmFsOworICAgIGludAkJYWxsb2NhdGVkOworICAgIGxvbmcJbGVuOworCisgICAgLyogRG9uJ3QgYWxsb3cgdXNpbmcgYW4gZXhwcmVzc2lvbiByZWdpc3RlciBpbnNpZGUgYW4gZXhwcmVzc2lvbiAqLworICAgIGlmIChyZWduYW1lID09ICc9JykKKyAgICB7CisJaWYgKGFsbG93ZXhwcikKKwkgICAgcmV0dXJuIGdldF9leHByX2xpbmUoKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmVnbmFtZSA9PSAnQCcpCSAgICAvKiAiQEAiIGlzIHVzZWQgZm9yIHVubmFtZWQgcmVnaXN0ZXIgKi8KKwlyZWduYW1lID0gJyInOworCisgICAgLyogY2hlY2sgZm9yIHZhbGlkIHJlZ25hbWUgKi8KKyAgICBpZiAocmVnbmFtZSAhPSBOVUwgJiYgIXZhbGlkX3lhbmtfcmVnKHJlZ25hbWUsIEZBTFNFKSkKKwlyZXR1cm4gTlVMTDsKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgcmVnbmFtZSA9IG1heV9nZXRfc2VsZWN0aW9uKHJlZ25hbWUpOworI2VuZGlmCisKKyAgICBpZiAoZ2V0X3NwZWNfcmVnKHJlZ25hbWUsICZyZXR2YWwsICZhbGxvY2F0ZWQsIEZBTFNFKSkKKyAgICB7CisJaWYgKHJldHZhbCA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwlpZiAoIWFsbG9jYXRlZCkKKwkgICAgcmV0dmFsID0gdmltX3N0cnNhdmUocmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGdldF95YW5rX3JlZ2lzdGVyKHJlZ25hbWUsIEZBTFNFKTsKKyAgICBpZiAoeV9jdXJyZW50LT55X2FycmF5ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIENvbXB1dGUgbGVuZ3RoIG9mIHJlc3VsdGluZyBzdHJpbmcuCisgICAgICovCisgICAgbGVuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgeV9jdXJyZW50LT55X3NpemU7ICsraSkKKyAgICB7CisJbGVuICs9IChsb25nKVNUUkxFTih5X2N1cnJlbnQtPnlfYXJyYXlbaV0pOworCS8qCisJICogSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIGxpbmVzIGFuZCBhZnRlciBsYXN0IGxpbmUgaWYKKwkgKiB5X3R5cGUgaXMgTUxJTkUuCisJICovCisJaWYgKHlfY3VycmVudC0+eV90eXBlID09IE1MSU5FIHx8IGkgPCB5X2N1cnJlbnQtPnlfc2l6ZSAtIDEpCisJICAgICsrbGVuOworICAgIH0KKworICAgIHJldHZhbCA9IGxhbGxvYyhsZW4gKyAxLCBUUlVFKTsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgbGluZXMgb2YgdGhlIHlhbmsgcmVnaXN0ZXIgaW50byB0aGUgc3RyaW5nLgorICAgICAqLworICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKyAgICB7CisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgeV9jdXJyZW50LT55X3NpemU7ICsraSkKKwl7CisJICAgIFNUUkNQWShyZXR2YWwgKyBsZW4sIHlfY3VycmVudC0+eV9hcnJheVtpXSk7CisJICAgIGxlbiArPSAobG9uZylTVFJMRU4ocmV0dmFsICsgbGVuKTsKKworCSAgICAvKgorCSAgICAgKiBJbnNlcnQgYSBOTCBiZXR3ZWVuIGxpbmVzIGFuZCBhZnRlciB0aGUgbGFzdCBsaW5lIGlmIHlfdHlwZSBpcworCSAgICAgKiBNTElORS4KKwkgICAgICovCisJICAgIGlmICh5X2N1cnJlbnQtPnlfdHlwZSA9PSBNTElORSB8fCBpIDwgeV9jdXJyZW50LT55X3NpemUgLSAxKQorCQlyZXR2YWxbbGVuKytdID0gJ1xuJzsKKwl9CisJcmV0dmFsW2xlbl0gPSBOVUw7CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFN0b3JlIHN0cmluZyAic3RyIiBpbiByZWdpc3RlciAibmFtZSIuCisgKiAibWF4bGVuIiBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlLCAtMSBmb3IgYWxsIGJ5dGVzLgorICogSWYgIm11c3RfYXBwZW5kIiBpcyBUUlVFLCBhbHdheXMgYXBwZW5kIHRvIHRoZSByZWdpc3Rlci4gIE90aGVyd2lzZSBhcHBlbmQKKyAqIGlmICJuYW1lIiBpcyBhbiB1cHBlcmNhc2UgbGV0dGVyLgorICogTm90ZTogIm1heGxlbiIgYW5kICJtdXN0X2FwcGVuZCIgZG9uJ3Qgd29yayBmb3IgdGhlICIvIiByZWdpc3Rlci4KKyAqIENhcmVmdWw6ICdzdHInIGlzIG1vZGlmaWVkLCB5b3UgbWF5IGhhdmUgdG8gdXNlIGEgY29weSEKKyAqIElmICJzdHIiIGVuZHMgaW4gJ1xuJyBvciAnXHInLCB1c2UgbGluZXdpc2UsIG90aGVyd2lzZSB1c2UgY2hhcmFjdGVyd2lzZS4KKyAqLworICAgIHZvaWQKK3dyaXRlX3JlZ19jb250ZW50cyhuYW1lLCBzdHIsIG1heGxlbiwgbXVzdF9hcHBlbmQpCisgICAgaW50CQluYW1lOworICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJbWF4bGVuOworICAgIGludAkJbXVzdF9hcHBlbmQ7Cit7CisgICAgd3JpdGVfcmVnX2NvbnRlbnRzX2V4KG5hbWUsIHN0ciwgbWF4bGVuLCBtdXN0X2FwcGVuZCwgTUFVVE8sIDBMKTsKK30KKworICAgIHZvaWQKK3dyaXRlX3JlZ19jb250ZW50c19leChuYW1lLCBzdHIsIG1heGxlbiwgbXVzdF9hcHBlbmQsIHlhbmtfdHlwZSwgYmxvY2tfbGVuKQorICAgIGludAkJbmFtZTsKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCW1heGxlbjsKKyAgICBpbnQJCW11c3RfYXBwZW5kOworICAgIGludAkJeWFua190eXBlOworICAgIGxvbmcJYmxvY2tfbGVuOworeworICAgIHN0cnVjdCB5YW5rcmVnICAqb2xkX3lfcHJldmlvdXMsICpvbGRfeV9jdXJyZW50OworICAgIGxvbmcJICAgIGxlbjsKKworICAgIC8qIFNwZWNpYWwgY2FzZTogJy8nIHNlYXJjaCBwYXR0ZXJuICovCisgICAgaWYgKG5hbWUgPT0gJy8nKQorICAgIHsKKwlzZXRfbGFzdF9zZWFyY2hfcGF0KHN0ciwgUkVfU0VBUkNILCBUUlVFLCBUUlVFKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCF2YWxpZF95YW5rX3JlZyhuYW1lLCBUUlVFKSkJICAgIC8qIGNoZWNrIGZvciB2YWxpZCByZWcgbmFtZSAqLworICAgIHsKKwlFTVNHMihfKCJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciKSwgdHJhbnNjaGFyKG5hbWUpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gJ18nKQkgICAgLyogYmxhY2sgaG9sZTogbm90aGluZyB0byBkbyAqLworCXJldHVybjsKKworICAgIC8qIERvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBjdXJyZW50ICh1bm5hbWVkKSByZWdpc3RlciAqLworICAgIG9sZF95X3ByZXZpb3VzID0geV9wcmV2aW91czsKKyAgICBvbGRfeV9jdXJyZW50ID0geV9jdXJyZW50OworCisgICAgZ2V0X3lhbmtfcmVnaXN0ZXIobmFtZSwgVFJVRSk7CisgICAgaWYgKCF5X2FwcGVuZCAmJiAhbXVzdF9hcHBlbmQpCisJZnJlZV95YW5rX2FsbCgpOworICAgIGlmIChtYXhsZW4gPj0gMCkKKwlsZW4gPSBtYXhsZW47CisgICAgZWxzZQorCWxlbiA9IChsb25nKVNUUkxFTihzdHIpOworI2lmbmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIEp1c3QgaW4gY2FzZSAtIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgTUJMT0NLICovCisgICAgaWYgKHlhbmtfdHlwZSA9PSBNQkxPQ0spCisJeWFua190eXBlID0gTUFVVE87CisjZW5kaWYKKyAgICBpZiAoeWFua190eXBlID09IE1BVVRPKQorCXlhbmtfdHlwZSA9ICgobGVuID4gMCAmJiAoc3RyW2xlbiAtIDFdID09ICdcbicgfHwgc3RyW2xlbiAtIDFdID09ICdccicpKQorCQkJCQkJCSAgICAgPyBNTElORSA6IE1DSEFSKTsKKyAgICBzdHJfdG9fcmVnKHlfY3VycmVudCwgeWFua190eXBlLCBzdHIsIGxlbiwgYmxvY2tfbGVuKTsKKworIyBpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIC8qIFNlbmQgdGV4dCBvZiBjbGlwYm9hcmQgcmVnaXN0ZXIgdG8gdGhlIGNsaXBib2FyZC4gKi8KKyAgICBtYXlfc2V0X3NlbGVjdGlvbigpOworIyBlbmRpZgorCisgICAgLyogJzpsZXQgQCIgPSAidmFsIicgc2hvdWxkIGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgIiIgcmVnaXN0ZXIgKi8KKyAgICBpZiAobmFtZSAhPSAnIicpCisJeV9wcmV2aW91cyA9IG9sZF95X3ByZXZpb3VzOworICAgIHlfY3VycmVudCA9IG9sZF95X2N1cnJlbnQ7Cit9CisjZW5kaWYJLyogRkVBVF9FVkFMICovCisKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkKKy8qCisgKiBQdXQgYSBzdHJpbmcgaW50byBhIHJlZ2lzdGVyLiAgV2hlbiB0aGUgcmVnaXN0ZXIgaXMgbm90IGVtcHR5LCB0aGUgc3RyaW5nCisgKiBpcyBhcHBlbmRlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzdHJfdG9fcmVnKHlfcHRyLCB0eXBlLCBzdHIsIGxlbiwgYmxvY2tsZW4pCisgICAgc3RydWN0IHlhbmtyZWcJKnlfcHRyOwkJLyogcG9pbnRlciB0byB5YW5rIHJlZ2lzdGVyICovCisgICAgaW50CQkJdHlwZTsJCS8qIE1DSEFSLCBNTElORSBvciBNQkxPQ0sgKi8KKyAgICBjaGFyX3UJCSpzdHI7CQkvKiBzdHJpbmcgdG8gcHV0IGluIHJlZ2lzdGVyICovCisgICAgbG9uZwkJbGVuOwkJLyogbGVuZ3RoIG9mIHN0cmluZyAqLworICAgIGxvbmcJCWJsb2NrbGVuOwkvKiB3aWR0aCBvZiBWaXN1YWwgYmxvY2sgKi8KK3sKKyAgICBpbnQJCWxudW07CisgICAgbG9uZwlzdGFydDsKKyAgICBsb25nCWk7CisgICAgaW50CQlleHRyYTsKKyAgICBpbnQJCW5ld2xpbmVzOwkJLyogbnVtYmVyIG9mIGxpbmVzIGFkZGVkICovCisgICAgaW50CQlleHRyYWxpbmUgPSAwOwkJLyogZXh0cmEgbGluZSBhdCB0aGUgZW5kICovCisgICAgaW50CQlhcHBlbmQgPSBGQUxTRTsJCS8qIGFwcGVuZCB0byBsYXN0IGxpbmUgaW4gcmVnaXN0ZXIgKi8KKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CSoqcHA7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBsb25nCW1heGxlbjsKKyNlbmRpZgorCisgICAgaWYgKHlfcHRyLT55X2FycmF5ID09IE5VTEwpCQkvKiBOVUxMIG1lYW5zIGVtdHB5IHJlZ2lzdGVyICovCisJeV9wdHItPnlfc2l6ZSA9IDA7CisKKyAgICAvKgorICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgd2l0aGluIHRoZSBzdHJpbmcKKyAgICAgKi8KKyAgICBuZXdsaW5lcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCWlmIChzdHJbaV0gPT0gJ1xuJykKKwkgICAgKytuZXdsaW5lczsKKyAgICBpZiAodHlwZSA9PSBNQ0hBUiB8fCBsZW4gPT0gMCB8fCBzdHJbbGVuIC0gMV0gIT0gJ1xuJykKKyAgICB7CisJZXh0cmFsaW5lID0gMTsKKwkrK25ld2xpbmVzOwkvKiBjb3VudCBleHRyYSBuZXdsaW5lIGF0IHRoZSBlbmQgKi8KKyAgICB9CisgICAgaWYgKHlfcHRyLT55X3NpemUgPiAwICYmIHlfcHRyLT55X3R5cGUgPT0gTUNIQVIpCisgICAgeworCWFwcGVuZCA9IFRSVUU7CisJLS1uZXdsaW5lczsJLyogdW5jb3VudCBuZXdsaW5lIHdoZW4gYXBwZW5kaW5nIGZpcnN0IGxpbmUgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBvaW50ZXJzIHRvIHRoZSBuZXcgcmVnaXN0ZXIgbGluZXMuCisgICAgICogSWYgdGhlIHJlZ2lzdGVyIHdhcyBub3QgZW1wdHksIG1vdmUgdGhlIGV4aXN0aW5nIGxpbmVzIHRvIHRoZSBuZXcgYXJyYXkuCisgICAgICovCisgICAgcHAgPSAoY2hhcl91ICoqKWxhbGxvY19jbGVhcigoeV9wdHItPnlfc2l6ZSArIG5ld2xpbmVzKQorCQkJCQkJICAgICogc2l6ZW9mKGNoYXJfdSAqKSwgVFJVRSk7CisgICAgaWYgKHBwID09IE5VTEwpCS8qIG91dCBvZiBtZW1vcnkgKi8KKwlyZXR1cm47CisgICAgZm9yIChsbnVtID0gMDsgbG51bSA8IHlfcHRyLT55X3NpemU7ICsrbG51bSkKKwlwcFtsbnVtXSA9IHlfcHRyLT55X2FycmF5W2xudW1dOworICAgIHZpbV9mcmVlKHlfcHRyLT55X2FycmF5KTsKKyAgICB5X3B0ci0+eV9hcnJheSA9IHBwOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgbWF4bGVuID0gMDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBlbmQgb2YgZWFjaCBsaW5lIGFuZCBzYXZlIGl0IGludG8gdGhlIGFycmF5LgorICAgICAqLworICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IGxlbiArIGV4dHJhbGluZTsgc3RhcnQgKz0gaSArIDEpCisgICAgeworCWZvciAoaSA9IHN0YXJ0OyBpIDwgbGVuOyArK2kpCS8qIGZpbmQgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCSAgICBpZiAoc3RyW2ldID09ICdcbicpCisJCWJyZWFrOworCWkgLT0gc3RhcnQ7CQkJLyogaSBpcyBub3cgbGVuZ3RoIG9mIGxpbmUgKi8KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChpID4gbWF4bGVuKQorCSAgICBtYXhsZW4gPSBpOworI2VuZGlmCisJaWYgKGFwcGVuZCkKKwl7CisJICAgIC0tbG51bTsKKwkgICAgZXh0cmEgPSAoaW50KVNUUkxFTih5X3B0ci0+eV9hcnJheVtsbnVtXSk7CisJfQorCWVsc2UKKwkgICAgZXh0cmEgPSAwOworCXMgPSBhbGxvYygodW5zaWduZWQpKGkgKyBleHRyYSArIDEpKTsKKwlpZiAocyA9PSBOVUxMKQorCSAgICBicmVhazsKKwlpZiAoZXh0cmEpCisJICAgIG1jaF9tZW1tb3ZlKHMsIHlfcHRyLT55X2FycmF5W2xudW1dLCAoc2l6ZV90KWV4dHJhKTsKKwlpZiAoYXBwZW5kKQorCSAgICB2aW1fZnJlZSh5X3B0ci0+eV9hcnJheVtsbnVtXSk7CisJaWYgKGkpCisJICAgIG1jaF9tZW1tb3ZlKHMgKyBleHRyYSwgc3RyICsgc3RhcnQsIChzaXplX3QpaSk7CisJZXh0cmEgKz0gaTsKKwlzW2V4dHJhXSA9IE5VTDsKKwl5X3B0ci0+eV9hcnJheVtsbnVtKytdID0gczsKKwl3aGlsZSAoLS1leHRyYSA+PSAwKQorCXsKKwkgICAgaWYgKCpzID09IE5VTCkKKwkJKnMgPSAnXG4nOwkgICAgLyogcmVwbGFjZSBOVUwgd2l0aCBuZXdsaW5lICovCisJICAgICsrczsKKwl9CisJYXBwZW5kID0gRkFMU0U7CQkgICAgLyogb25seSBmaXJzdCBsaW5lIGlzIGFwcGVuZGVkICovCisgICAgfQorICAgIHlfcHRyLT55X3R5cGUgPSB0eXBlOworICAgIHlfcHRyLT55X3NpemUgPSBsbnVtOworIyBpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmICh0eXBlID09IE1CTE9DSykKKwl5X3B0ci0+eV93aWR0aCA9IChibG9ja2xlbiA8IDAgPyBtYXhsZW4gLSAxIDogYmxvY2tsZW4pOworICAgIGVsc2UKKwl5X3B0ci0+eV93aWR0aCA9IDA7CisjIGVuZGlmCit9CisjZW5kaWYgLyogRkVBVF9DTElQQk9BUkQgfHwgRkVBVF9FVkFMIHx8IFBST1RPICovCisKKyAgICB2b2lkCitjbGVhcl9vcGFyZyhvYXApCisgICAgb3BhcmdfVAkqb2FwOworeworICAgIHZpbV9tZW1zZXQob2FwLCAwLCBzaXplb2Yob3BhcmdfVCkpOworfQorCitzdGF0aWMgbG9uZwlsaW5lX2NvdW50X2luZm8gX19BUkdTKChjaGFyX3UgKmxpbmUsIGxvbmcgKndjLCBsb25nIGxpbWl0LCBpbnQgZW9sX3NpemUpKTsKKworLyoKKyAqICBDb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYW5kICJ3b3JkcyIgaW4gYSBsaW5lLgorICoKKyAqICAiV29yZHMiIGFyZSBjb3VudGVkIGJ5IGxvb2tpbmcgZm9yIGJvdW5kYXJpZXMgYmV0d2VlbiBub24tc3BhY2UgYW5kCisgKiAgc3BhY2UgY2hhcmFjdGVycy4gIChpdCBzZWVtcyB0byBwcm9kdWNlIHJlc3VsdHMgdGhhdCBtYXRjaCAnd2MnLikKKyAqCisgKiAgUmV0dXJuIHZhbHVlIGlzIGNoYXJhY3RlciBjb3VudDsgd29yZCBjb3VudCBmb3IgdGhlIGxpbmUgaXMgQURERUQKKyAqICB0byAiKndjIi4KKyAqCisgKiAgVGhlIGZ1bmN0aW9uIHdpbGwgb25seSBleGFtaW5lIHRoZSBmaXJzdCAibGltaXQiIGNoYXJhY3RlcnMgaW4gdGhlCisgKiAgbGluZSwgc3RvcHBpbmcgaWYgaXQgZW5jb3VudGVycyBhbiBlbmQtb2YtbGluZSAoTlVMIGJ5dGUpLiAgSW4gdGhhdAorICogIGNhc2UsIGVvbF9zaXplIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNoYXJhY3RlciBjb3VudCB0byBhY2NvdW50IGZvcgorICogIHRoZSBzaXplIG9mIHRoZSBFT0wgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIGxvbmcKK2xpbmVfY291bnRfaW5mbyhsaW5lLCB3YywgbGltaXQsIGVvbF9zaXplKQorICAgIGNoYXJfdQkqbGluZTsKKyAgICBsb25nCSp3YzsKKyAgICBsb25nCWxpbWl0OworICAgIGludAkJZW9sX3NpemU7Cit7CisgICAgbG9uZwlpLCB3b3JkcyA9IDA7CisgICAgaW50CQlpc193b3JkID0gMDsKKworICAgIGZvciAoaSA9IDA7IGxpbmVbaV0gJiYgaSA8IGxpbWl0OyBpKyspCisgICAgeworCWlmIChpc193b3JkKQorCXsKKwkgICAgaWYgKHZpbV9pc3NwYWNlKGxpbmVbaV0pKQorCSAgICB7CisJCXdvcmRzKys7CisJCWlzX3dvcmQgPSAwOworCSAgICB9CisJfQorCWVsc2UgaWYgKCF2aW1faXNzcGFjZShsaW5lW2ldKSkKKwkgICAgaXNfd29yZCA9IDE7CisgICAgfQorCisgICAgaWYgKGlzX3dvcmQpCisJd29yZHMrKzsKKyAgICAqd2MgKz0gd29yZHM7CisKKyAgICAvKiBBZGQgZW9sX3NpemUgaWYgdGhlIGVuZCBvZiBsaW5lIHdhcyByZWFjaGVkIGJlZm9yZSBoaXR0aW5nIGxpbWl0LiAqLworICAgIGlmICghbGluZVtpXSAmJiBpIDwgbGltaXQpCisJaSArPSBlb2xfc2l6ZTsKKyAgICByZXR1cm4gaTsKK30KKworLyoKKyAqIEdpdmUgc29tZSBpbmZvIGFib3V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIChmb3IgImcgQ1RSTC1HIikuCisgKiBJbiBWaXN1YWwgbW9kZSwgZ2l2ZSBzb21lIGluZm8gYWJvdXQgdGhlIHNlbGVjdGVkIHJlZ2lvbi4gIChJbiB0aGlzIGNhc2UsCisgKiB0aGUgKl9jb3VudF9jdXJzb3IgdmFyaWFibGVzIHN0b3JlIHJ1bm5pbmcgdG90YWxzIGZvciB0aGUgc2VsZWN0aW9uLikKKyAqLworICAgIHZvaWQKK2N1cnNvcl9wb3NfaW5mbygpCit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQlidWYxWzIwXTsKKyAgICBjaGFyX3UJYnVmMlsyMF07CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBsb25nCWNoYXJfY291bnQgPSAwOworICAgIGxvbmcJY2hhcl9jb3VudF9jdXJzb3IgPSAwOworICAgIGludAkJZW9sX3NpemU7CisgICAgbG9uZwlsYXN0X2NoZWNrID0gMTAwMDAwTDsKKyAgICBsb25nCXdvcmRfY291bnQgPSAwOworICAgIGxvbmcJd29yZF9jb3VudF9jdXJzb3IgPSAwOworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgbG9uZwlsaW5lX2NvdW50X3NlbGVjdGVkID0gMDsKKyAgICBwb3NfVAltaW5fcG9zLCBtYXhfcG9zOworICAgIG9wYXJnX1QJb3Bhcmc7CisgICAgc3RydWN0IGJsb2NrX2RlZgliZDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgaW4gY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBpZiAoY3VyYnVmLT5iX21sLm1sX2ZsYWdzICYgTUxfRU1QVFkpCisgICAgeworCU1TRyhfKG5vX2xpbmVzX21zZykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChnZXRfZmlsZWZvcm1hdChjdXJidWYpID09IEVPTF9ET1MpCisJICAgIGVvbF9zaXplID0gMjsKKwllbHNlCisJICAgIGVvbF9zaXplID0gMTsKKworI2lmZGVmIEZFQVRfVklTVUFMCisJaWYgKFZJc3VhbF9hY3RpdmUpCisJeworCSAgICBpZiAobHQoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKwkgICAgeworCQltaW5fcG9zID0gVklzdWFsOworCQltYXhfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJbWluX3BvcyA9IGN1cndpbi0+d19jdXJzb3I7CisJCW1heF9wb3MgPSBWSXN1YWw7CisJICAgIH0KKwkgICAgaWYgKCpwX3NlbCA9PSAnZScgJiYgbWF4X3Bvcy5jb2wgPiAwKQorCQktLW1heF9wb3MuY29sOworCisJICAgIGlmIChWSXN1YWxfbW9kZSA9PSBDdHJsX1YpCisJICAgIHsKKwkJb3BhcmcuaXNfVklzdWFsID0gMTsKKwkJb3BhcmcuYmxvY2tfbW9kZSA9IFRSVUU7CisJCW9wYXJnLm9wX3R5cGUgPSBPUF9OT1A7CisJCWdldHZjb2xzKGN1cndpbiwgJm1pbl9wb3MsICZtYXhfcG9zLAorCQkJJm9wYXJnLnN0YXJ0X3Zjb2wsICZvcGFyZy5lbmRfdmNvbCk7CisJCS8qIFN3YXAgdGhlIHN0YXJ0LCBlbmQgdmNvbCBpZiBuZWVkZWQgKi8KKwkJaWYgKG9wYXJnLmVuZF92Y29sIDwgb3Bhcmcuc3RhcnRfdmNvbCkKKwkJeworCQkgICAgb3BhcmcuZW5kX3Zjb2wgKz0gb3Bhcmcuc3RhcnRfdmNvbDsKKwkJICAgIG9wYXJnLnN0YXJ0X3Zjb2wgPSBvcGFyZy5lbmRfdmNvbCAtIG9wYXJnLnN0YXJ0X3Zjb2w7CisJCSAgICBvcGFyZy5lbmRfdmNvbCAtPSBvcGFyZy5zdGFydF92Y29sOworCQl9CisJICAgIH0KKwkgICAgbGluZV9jb3VudF9zZWxlY3RlZCA9IG1heF9wb3MubG51bSAtIG1pbl9wb3MubG51bSArIDE7CisJfQorI2VuZGlmCisKKwlmb3IgKGxudW0gPSAxOyBsbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyArK2xudW0pCisJeworCSAgICAvKiBDaGVjayBmb3IgYSBDVFJMLUMgZXZlcnkgMTAwMDAwIGNoYXJhY3RlcnMuICovCisJICAgIGlmIChjaGFyX2NvdW50ID4gbGFzdF9jaGVjaykKKwkgICAgeworCQl1aV9icmVha2NoZWNrKCk7CisJCWlmIChnb3RfaW50KQorCQkgICAgcmV0dXJuOworCQlsYXN0X2NoZWNrID0gY2hhcl9jb3VudCArIDEwMDAwMEw7CisJICAgIH0KKworI2lmZGVmIEZFQVRfVklTVUFMCisJICAgIC8qIERvIGV4dHJhIHByb2Nlc3NpbmcgZm9yIFZJc3VhbCBtb2RlLiAqLworCSAgICBpZiAoVklzdWFsX2FjdGl2ZQorCQkgICAgJiYgbG51bSA+PSBtaW5fcG9zLmxudW0gJiYgbG51bSA8PSBtYXhfcG9zLmxudW0pCisJICAgIHsKKwkJc3dpdGNoIChWSXN1YWxfbW9kZSkKKwkJeworCQkgICAgY2FzZSBDdHJsX1Y6CisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJCXZpcnR1YWxfb3AgPSB2aXJ0dWFsX2FjdGl2ZSgpOworIyBlbmRpZgorCQkJYmxvY2tfcHJlcCgmb3BhcmcsICZiZCwgbG51bSwgMCk7CisjIGlmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJCXZpcnR1YWxfb3AgPSBNQVlCRTsKKyMgZW5kaWYKKwkJCWNoYXJfY291bnRfY3Vyc29yICs9IGxpbmVfY291bnRfaW5mbyhiZC50ZXh0c3RhcnQsCisJCQkJJndvcmRfY291bnRfY3Vyc29yLCAobG9uZyliZC50ZXh0bGVuLCBlb2xfc2l6ZSk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ1YnOgorCQkJY2hhcl9jb3VudF9jdXJzb3IgKz0gbGluZV9jb3VudF9pbmZvKG1sX2dldChsbnVtKSwKKwkJCQkmd29yZF9jb3VudF9jdXJzb3IsIChsb25nKU1BWENPTCwgZW9sX3NpemUpOworCQkJYnJlYWs7CisJCSAgICBjYXNlICd2JzoKKwkJCXsKKwkJCSAgICBjb2xucl9UIHN0YXJ0X2NvbCA9IChsbnVtID09IG1pbl9wb3MubG51bSkKKwkJCQkJCQkgICA/IG1pbl9wb3MuY29sIDogMDsKKwkJCSAgICBjb2xucl9UIGVuZF9jb2wgPSAobG51bSA9PSBtYXhfcG9zLmxudW0pCisJCQkJICAgICAgPyBtYXhfcG9zLmNvbCAtIHN0YXJ0X2NvbCArIDEgOiBNQVhDT0w7CisKKwkJCSAgICBjaGFyX2NvdW50X2N1cnNvciArPQorCQkJCWxpbmVfY291bnRfaW5mbyhtbF9nZXQobG51bSkgKyBzdGFydF9jb2wsCisJCQkJICZ3b3JkX2NvdW50X2N1cnNvciwgKGxvbmcpZW5kX2NvbCwgZW9sX3NpemUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQkvKiBJbiBub24tdmlzdWFsIG1vZGUsIGNoZWNrIGZvciB0aGUgbGluZSB0aGUgY3Vyc29yIGlzIG9uICovCisJCWlmIChsbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkJeworCQkgICAgd29yZF9jb3VudF9jdXJzb3IgKz0gd29yZF9jb3VudDsKKwkJICAgIGNoYXJfY291bnRfY3Vyc29yID0gY2hhcl9jb3VudCArCisJCQlsaW5lX2NvdW50X2luZm8obWxfZ2V0KGxudW0pLCAmd29yZF9jb3VudF9jdXJzb3IsCisJCQkJICAobG9uZykoY3Vyd2luLT53X2N1cnNvci5jb2wgKyAxKSwgZW9sX3NpemUpOworCQl9CisJICAgIH0KKwkgICAgLyogQWRkIHRvIHRoZSBydW5uaW5nIHRvdGFscyAqLworCSAgICBjaGFyX2NvdW50ICs9IGxpbmVfY291bnRfaW5mbyhtbF9nZXQobG51bSksICZ3b3JkX2NvdW50LAorCQkJCQkJICAgICAgKGxvbmcpTUFYQ09MLCBlb2xfc2l6ZSk7CisJfQorCisJLyogQ29ycmVjdGlvbiBmb3Igd2hlbiBsYXN0IGxpbmUgZG9lc24ndCBoYXZlIGFuIEVPTC4gKi8KKwlpZiAoIWN1cmJ1Zi0+Yl9wX2VvbCAmJiBjdXJidWYtPmJfcF9iaW4pCisJICAgIGNoYXJfY291bnQgLT0gZW9sX3NpemU7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChWSXN1YWxfYWN0aXZlKQorCXsKKwkgICAgaWYgKFZJc3VhbF9tb2RlID09IEN0cmxfVikKKwkgICAgeworCQlnZXR2Y29scyhjdXJ3aW4sICZtaW5fcG9zLCAmbWF4X3BvcywgJm1pbl9wb3MuY29sLAorCQkJJm1heF9wb3MuY29sKTsKKwkJc3ByaW50ZigoY2hhciAqKWJ1ZjEsIF8oIiVsZCBDb2xzOyAiKSwKKwkJCShsb25nKShvcGFyZy5lbmRfdmNvbCAtIG9wYXJnLnN0YXJ0X3Zjb2wgKyAxKSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlidWYxWzBdID0gTlVMOworCisJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsCisJICAgIF8oIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIpLAorCQkJYnVmMSwgbGluZV9jb3VudF9zZWxlY3RlZCwKKwkJCShsb25nKWN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50LAorCQkJd29yZF9jb3VudF9jdXJzb3IsIHdvcmRfY291bnQsCisJCQljaGFyX2NvdW50X2N1cnNvciwgY2hhcl9jb3VudCk7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkgICAgcCA9IG1sX2dldF9jdXJsaW5lKCk7CisJICAgIHZhbGlkYXRlX3ZpcnRjb2woKTsKKwkgICAgY29sX3ByaW50KGJ1ZjEsIChpbnQpY3Vyd2luLT53X2N1cnNvci5jb2wgKyAxLAorCQkgICAgKGludCljdXJ3aW4tPndfdmlydGNvbCArIDEpOworCSAgICBjb2xfcHJpbnQoYnVmMiwgKGludClTVFJMRU4ocCksIGxpbmV0YWJzaXplKHApKTsKKworCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLAorCQlfKCJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiKSwKKwkJICAgIChjaGFyICopYnVmMSwgKGNoYXIgKilidWYyLAorCQkgICAgKGxvbmcpY3Vyd2luLT53X2N1cnNvci5sbnVtLAorCQkgICAgKGxvbmcpY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQsCisJCSAgICB3b3JkX2NvdW50X2N1cnNvciwgd29yZF9jb3VudCwKKwkJICAgIGNoYXJfY291bnRfY3Vyc29yLCBjaGFyX2NvdW50KTsKKwl9CisKKyNpZmRlZiBGRUFUX01CWVRFCisJY2hhcl9jb3VudCA9IGJvbWJfc2l6ZSgpOworCWlmIChjaGFyX2NvdW50ID4gMCkKKwkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiArIFNUUkxFTihJT2J1ZmYpLCBfKCIoKyVsZCBmb3IgQk9NKSIpLAorCQkJCQkJCQkgIGNoYXJfY291bnQpOworI2VuZGlmCisJLyogRG9uJ3Qgc2hvcnRlbiB0aGlzIG1lc3NhZ2UsIHRoZSB1c2VyIGFza2VkIGZvciBpdC4gKi8KKwlwID0gcF9zaG07CisJcF9zaG0gPSAoY2hhcl91ICopIiI7CisJbXNnKElPYnVmZik7CisJcF9zaG0gPSBwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcHRpb24uYyBiL3NyYy9vcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODcwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29wdGlvbi5jCkBAIC0wLDAgKzEsOTM4MyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogQ29kZSB0byBoYW5kbGUgdXNlci1zZXR0YWJsZSBvcHRpb25zLiBUaGlzIGlzIGFsbCBwcmV0dHkgbXVjaCB0YWJsZS0KKyAqIGRyaXZlbi4gQ2hlY2tsaXN0IGZvciBhZGRpbmcgYSBuZXcgb3B0aW9uOgorICogLSBQdXQgaXQgaW4gdGhlIG9wdGlvbnMgYXJyYXkgYmVsb3cgKGNvcHkgYW4gZXhpc3RpbmcgZW50cnkpLgorICogLSBGb3IgYSBnbG9iYWwgb3B0aW9uOiBBZGQgYSB2YXJpYWJsZSBmb3IgaXQgaW4gb3B0aW9uLmguCisgKiAtIEZvciBhIGJ1ZmZlciBvciB3aW5kb3cgbG9jYWwgb3B0aW9uOgorICogICAtIEFkZCBhIFBWX1hYIGVudHJ5IHRvIHRoZSBlbnVtIGJlbG93LgorICogICAtIEFkZCBhIHZhcmlhYmxlIHRvIHRoZSB3aW5kb3cgb3IgYnVmZmVyIHN0cnVjdCBpbiBzdHJ1Y3RzLmguCisgKiAgIC0gRm9yIGEgd2luZG93IG9wdGlvbiwgYWRkIHNvbWUgY29kZSB0byBjb3B5X3dpbm9wdCgpLgorICogICAtIEZvciBhIGJ1ZmZlciBvcHRpb24sIGFkZCBzb21lIGNvZGUgdG8gYnVmX2NvcHlfb3B0aW9ucygpLgorICogICAtIEZvciBhIGJ1ZmZlciBzdHJpbmcgb3B0aW9uLCBhZGQgY29kZSB0byBjaGVja19idWZfb3B0aW9ucygpLgorICogLSBJZiBpdCdzIGEgbnVtZXJpYyBvcHRpb24sIGFkZCBhbnkgbmVjZXNzYXJ5IGJvdW5kcyBjaGVja3MgdG8gZG9fc2V0KCkuCisgKiAtIElmIGl0J3MgYSBsaXN0IG9mIGZsYWdzLCBhZGQgc29tZSBjb2RlIGluIGRvX3NldCgpLCBzZWFyY2ggZm9yIFdXX0FMTC4KKyAqIC0gV2hlbiBhZGRpbmcgYW4gb3B0aW9uIHdpdGggZXhwYW5zaW9uIChQX0VYUEFORCksIGJ1dCB3aXRoIGEgZGlmZmVyZW50CisgKiAgIGRlZmF1bHQgZm9yIFZpIGFuZCBWaW0gKG5vIFBfVklfREVGKSwgYWRkIHNvbWUgY29kZSBhdCBWSU1FWFAuCisgKiAtIEFkZCBkb2N1bWVudGF0aW9uISAgT25lIGxpbmUgaW4gZG9jL2hlbHAudHh0LCBmdWxsIGRlc2NyaXB0aW9uIGluCisgKiAgIG9wdGlvbnMudHh0LCBhbmQgYW55IG90aGVyIHJlbGF0ZWQgcGxhY2VzLgorICogLSBBZGQgYW4gZW50cnkgaW4gcnVudGltZS9vcHR3aW4udmltLgorICogV2hlbiBtYWtpbmcgY2hhbmdlczoKKyAqIC0gQWRqdXN0IHRoZSBoZWxwIGZvciB0aGUgb3B0aW9uIGluIGRvYy9vcHRpb24udHh0LgorICogLSBXaGVuIGFuIGVudHJ5IGhhcyB0aGUgUF9WSU0gZmxhZywgb3IgaXMgbGFja2luZyB0aGUgUF9WSV9ERUYgZmxhZywgYWRkIGEKKyAqICAgY29tbWVudCBhdCB0aGUgaGVscCBmb3IgdGhlICdjb21wYXRpYmxlJyBvcHRpb24uCisgKi8KKworI2RlZmluZSBJTl9PUFRJT05fQworI2luY2x1ZGUgInZpbS5oIgorCisvKgorICogVGhlIG9wdGlvbnMgdGhhdCBhcmUgbG9jYWwgdG8gYSB3aW5kb3cgb3IgYnVmZmVyIGhhdmUgImluZGlyIiBzZXQgdG8gb25lIG9mCisgKiB0aGVzZSB2YWx1ZXMuICBTcGVjaWFsIHZhbHVlczoKKyAqIFBWX05PTkU6IGdsb2JhbCBvcHRpb24uCisgKiBQVl9CT1RIIGlzIGFkZGVkOiBnbG9iYWwgb3B0aW9uIHdoaWNoIGFsc28gaGFzIGEgbG9jYWwgdmFsdWUuCisgKi8KKyNkZWZpbmUgUFZfQk9USCAweDEwMDAKKyNkZWZpbmUgT1BUX0JPVEgoeCkgKGlkb3B0X1QpKFBWX0JPVEggKyAoaW50KSh4KSkKKwordHlwZWRlZiBlbnVtCit7CisgICAgUFZfTk9ORSA9IDAKKyAgICAsIFBWX0FJCisgICAgLCBQVl9BUgorICAgICwgUFZfQVJBQgorICAgICwgUFZfQkgKKyAgICAsIFBWX0JJTgorICAgICwgUFZfQkwKKyAgICAsIFBWX0JPTUIKKyAgICAsIFBWX0JUCisgICAgLCBQVl9DSQorICAgICwgUFZfQ0lOCisgICAgLCBQVl9DSU5LCisgICAgLCBQVl9DSU5PCisgICAgLCBQVl9DSU5XCisgICAgLCBQVl9DTVMKKyAgICAsIFBWX0NPTQorICAgICwgUFZfQ1BUCisgICAgLCBQVl9ERUYKKyAgICAsIFBWX0RJQ1QKKyAgICAsIFBWX0RJRkYKKyAgICAsIFBWX0VGTQorICAgICwgUFZfRU9MCisgICAgLCBQVl9FUAorICAgICwgUFZfRVQKKyAgICAsIFBWX0ZEQworICAgICwgUFZfRkRFCisgICAgLCBQVl9GREkKKyAgICAsIFBWX0ZETAorICAgICwgUFZfRkRNCisgICAgLCBQVl9GRE4KKyAgICAsIFBWX0ZEVAorICAgICwgUFZfRkVOCisgICAgLCBQVl9GRU5DCisgICAgLCBQVl9GRgorICAgICwgUFZfRk1MCisgICAgLCBQVl9GTVIKKyAgICAsIFBWX0ZPCisgICAgLCBQVl9GVAorICAgICwgUFZfR1AKKyAgICAsIFBWX0lNSQorICAgICwgUFZfSU1TCisgICAgLCBQVl9JTkMKKyAgICAsIFBWX0lOREUKKyAgICAsIFBWX0lOREsKKyAgICAsIFBWX0lORVgKKyAgICAsIFBWX0lORgorICAgICwgUFZfSVNLCisgICAgLCBQVl9LRVkKKyAgICAsIFBWX0tNQVAKKyAgICAsIFBWX0tQCisgICAgLCBQVl9MQlIKKyAgICAsIFBWX0xJU1AKKyAgICAsIFBWX0xJU1QKKyAgICAsIFBWX01BCisgICAgLCBQVl9NTAorICAgICwgUFZfTU9ECisgICAgLCBQVl9NUAorICAgICwgUFZfTVBTCisgICAgLCBQVl9ORgorICAgICwgUFZfTlUKKyAgICAsIFBWX09GVAorICAgICwgUFZfUEFUSAorICAgICwgUFZfUEkKKyAgICAsIFBWX1BWVworICAgICwgUFZfUkwKKyAgICAsIFBWX1JMQworICAgICwgUFZfUk8KKyAgICAsIFBWX1NDQklORAorICAgICwgUFZfU0NST0xMCisgICAgLCBQVl9TSQorICAgICwgUFZfU04KKyAgICAsIFBWX1NUUworICAgICwgUFZfU1VBCisgICAgLCBQVl9TVworICAgICwgUFZfU1dGCisgICAgLCBQVl9TWU4KKyAgICAsIFBWX1RBR1MKKyAgICAsIFBWX1RTCisgICAgLCBQVl9UU1IKKyAgICAsIFBWX1RXCisgICAgLCBQVl9UWAorICAgICwgUFZfV0ZICisgICAgLCBQVl9XTQorICAgICwgUFZfV1JBUAorfSBpZG9wdF9UOworCisvKgorICogT3B0aW9ucyBsb2NhbCB0byBhIHdpbmRvdyBoYXZlIGEgdmFsdWUgbG9jYWwgdG8gYSBidWZmZXIgYW5kIGdsb2JhbCB0byBhbGwKKyAqIGJ1ZmZlcnMuICBJbmRpY2F0ZSB0aGlzIGJ5IHNldHRpbmcgInZhciIgdG8gVkFSX1dJTi4KKyAqLworI2RlZmluZSBWQVJfV0lOICgoY2hhcl91ICopLTEpCisKKy8qCisgKiBUaGVzZSB0aGUgZ2xvYmFsIHZhbHVlcyBmb3Igb3B0aW9ucyB3aGljaCBhcmUgYWxzbyBsb2NhbCB0byBhIGJ1ZmZlci4KKyAqIE9ubHkgdG8gYmUgdXNlZCBpbiBvcHRpb24uYyEKKyAqLworc3RhdGljIGludAlwX2FpOworc3RhdGljIGludAlwX2JpbjsKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgaW50CXBfYm9tYjsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKK3N0YXRpYyBjaGFyX3UJKnBfYmg7CitzdGF0aWMgY2hhcl91CSpwX2J0OworI2VuZGlmCitzdGF0aWMgaW50CXBfYmw7CitzdGF0aWMgaW50CXBfY2k7CisjaWZkZWYgRkVBVF9DSU5ERU5UCitzdGF0aWMgaW50CXBfY2luOworc3RhdGljIGNoYXJfdQkqcF9jaW5rOworc3RhdGljIGNoYXJfdQkqcF9jaW5vOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1NNQVJUSU5ERU5UKSB8fCBkZWZpbmVkKEZFQVRfQ0lOREVOVCkKK3N0YXRpYyBjaGFyX3UJKnBfY2ludzsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ09NTUVOVFMKK3N0YXRpYyBjaGFyX3UJKnBfY29tOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCitzdGF0aWMgY2hhcl91CSpwX2NtczsKKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorc3RhdGljIGNoYXJfdQkqcF9jcHQ7CisjZW5kaWYKK3N0YXRpYyBpbnQJcF9lb2w7CitzdGF0aWMgaW50CXBfZXQ7CisjaWZkZWYgRkVBVF9NQllURQorc3RhdGljIGNoYXJfdQkqcF9mZW5jOworI2VuZGlmCitzdGF0aWMgY2hhcl91CSpwX2ZmOworc3RhdGljIGNoYXJfdQkqcF9mbzsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKK3N0YXRpYyBjaGFyX3UJKnBfZnQ7CisjZW5kaWYKK3N0YXRpYyBsb25nCXBfaW1pbnNlcnQ7CitzdGF0aWMgbG9uZwlwX2ltc2VhcmNoOworI2lmIGRlZmluZWQoRkVBVF9GSU5EX0lEKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKK3N0YXRpYyBjaGFyX3UJKnBfaW5leDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKK3N0YXRpYyBjaGFyX3UJKnBfaW5kZTsKK3N0YXRpYyBjaGFyX3UJKnBfaW5kazsKKyNlbmRpZgorc3RhdGljIGludAlwX2luZjsKK3N0YXRpYyBjaGFyX3UJKnBfaXNrOworI2lmZGVmIEZFQVRfQ1JZUFQKK3N0YXRpYyBjaGFyX3UJKnBfa2V5OworI2VuZGlmCisjaWZkZWYgRkVBVF9MSVNQCitzdGF0aWMgaW50CXBfbGlzcDsKKyNlbmRpZgorc3RhdGljIGludAlwX21sOworc3RhdGljIGludAlwX21hOworc3RhdGljIGludAlwX21vZDsKK3N0YXRpYyBjaGFyX3UJKnBfbXBzOworc3RhdGljIGNoYXJfdQkqcF9uZjsKKyNpZmRlZiBGRUFUX09TRklMRVRZUEUKK3N0YXRpYyBjaGFyX3UJKnBfb2Z0OworI2VuZGlmCitzdGF0aWMgaW50CXBfcGk7CitzdGF0aWMgaW50CXBfcm87CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorc3RhdGljIGludAlwX3NpOworI2VuZGlmCisjaWZuZGVmIFNIT1JUX0ZOQU1FCitzdGF0aWMgaW50CXBfc247CisjZW5kaWYKK3N0YXRpYyBsb25nCXBfc3RzOworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKQorc3RhdGljIGNoYXJfdQkqcF9zdWE7CisjZW5kaWYKK3N0YXRpYyBsb25nCXBfc3c7CitzdGF0aWMgaW50CXBfc3dmOworI2lmZGVmIEZFQVRfU1lOX0hMCitzdGF0aWMgY2hhcl91CSpwX3N5bjsKKyNlbmRpZgorc3RhdGljIGxvbmcJcF90czsKK3N0YXRpYyBsb25nCXBfdHc7CitzdGF0aWMgaW50CXBfdHg7CitzdGF0aWMgbG9uZwlwX3dtOworI2lmZGVmIEZFQVRfS0VZTUFQCitzdGF0aWMgY2hhcl91CSpwX2tleW1hcDsKKyNlbmRpZgorCisvKiBTYXZlZCB2YWx1ZXMgZm9yIHdoZW4gJ2JpbicgaXMgc2V0LiAqLworc3RhdGljIGludAlwX2V0X25vYmluOworc3RhdGljIGludAlwX21sX25vYmluOworc3RhdGljIGxvbmcJcF90d19ub2JpbjsKK3N0YXRpYyBsb25nCXBfd21fbm9iaW47CisKKy8qIFNhdmVkIHZhbHVlcyBmb3Igd2hlbiAncGFzdGUnIGlzIHNldCAqLworc3RhdGljIGxvbmcJcF90d19ub3Bhc3RlOworc3RhdGljIGxvbmcJcF93bV9ub3Bhc3RlOworc3RhdGljIGxvbmcJcF9zdHNfbm9wYXN0ZTsKK3N0YXRpYyBpbnQJcF9haV9ub3Bhc3RlOworCitzdHJ1Y3Qgdmltb3B0aW9uCit7CisgICAgY2hhcgkqZnVsbG5hbWU7CS8qIGZ1bGwgb3B0aW9uIG5hbWUgKi8KKyAgICBjaGFyCSpzaG9ydG5hbWU7CS8qIHBlcm1pc3NpYmxlIGFiYnJldmlhdGlvbiAqLworICAgIGxvbmdfdQlmbGFnczsJCS8qIHNlZSBiZWxvdyAqLworICAgIGNoYXJfdQkqdmFyOwkJLyogZ2xvYmFsIG9wdGlvbjogcG9pbnRlciB0byB2YXJpYWJsZTsKKwkJCQkgKiB3aW5kb3ctbG9jYWwgb3B0aW9uOiBWQVJfV0lOOworCQkJCSAqIGJ1ZmZlci1sb2NhbCBvcHRpb246IGdsb2JhbCB2YWx1ZSAqLworICAgIGlkb3B0X1QJaW5kaXI7CQkvKiBnbG9iYWwgb3B0aW9uOiBQVl9OT05FOworCQkJCSAqIGxvY2FsIG9wdGlvbjogaW5kaXJlY3Qgb3B0aW9uIGluZGV4ICovCisgICAgY2hhcl91CSpkZWZfdmFsWzJdOwkvKiBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaWFibGUgKHZpIGFuZCB2aW0pICovCisjaWZkZWYgRkVBVF9FVkFMCisgICAgc2NpZF9UCXNjcmlwdElEOwkvKiBzY3JpcHQgaW4gd2hpY2ggdGhlIG9wdGlvbiB3YXMgbGFzdCBzZXQgKi8KKyNlbmRpZgorfTsKKworI2RlZmluZSBWSV9ERUZBVUxUICAwCSAgICAvKiBkZWZfdmFsW1ZJX0RFRkFVTFRdIGlzIFZpIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgVklNX0RFRkFVTFQgMQkgICAgLyogZGVmX3ZhbFtWSU1fREVGQVVMVF0gaXMgVmltIGRlZmF1bHQgdmFsdWUgKi8KKworLyoKKyAqIEZsYWdzCisgKi8KKyNkZWZpbmUgUF9CT09MCQkweDAxCS8qIHRoZSBvcHRpb24gaXMgYm9vbGVhbiAqLworI2RlZmluZSBQX05VTQkJMHgwMgkvKiB0aGUgb3B0aW9uIGlzIG51bWVyaWMgKi8KKyNkZWZpbmUgUF9TVFJJTkcJMHgwNAkvKiB0aGUgb3B0aW9uIGlzIGEgc3RyaW5nICovCisjZGVmaW5lIFBfQUxMT0NFRAkweDA4CS8qIHRoZSBzdHJpbmcgb3B0aW9uIGlzIGluIGFsbG9jYXRlZCBtZW1vcnksCisJCQkJICAgIG11c3QgdXNlIHZpbV9mcmVlKCkgd2hlbiBhc3NpZ25pbmcgbmV3CisJCQkJICAgIHZhbHVlLiBOb3Qgc2V0IGlmIGRlZmF1bHQgaXMgdGhlIHNhbWUuICovCisjZGVmaW5lIFBfRVhQQU5ECTB4MTAJLyogZW52aXJvbm1lbnQgZXhwYW5zaW9uLiAgTk9URTogUF9FWFBBTkQgY2FuCisJCQkJICAgbmV2ZXIgYmUgdXNlZCBmb3IgbG9jYWwgb3IgaGlkZGVuIG9wdGlvbnMhICovCisjZGVmaW5lIFBfTk9ERUZBVUxUCTB4NDAJLyogZG9uJ3Qgc2V0IHRvIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgUF9ERUZfQUxMT0NFRAkweDgwCS8qIGRlZmF1bHQgdmFsdWUgaXMgaW4gYWxsb2NhdGVkIG1lbW9yeSwgbXVzdAorCQkJCSAgICB1c2UgdmltX2ZyZWUoKSB3aGVuIGFzc2lnbmluZyBuZXcgdmFsdWUgKi8KKyNkZWZpbmUgUF9XQVNfU0VUCTB4MTAwCS8qIG9wdGlvbiBoYXMgYmVlbiBzZXQvcmVzZXQgKi8KKyNkZWZpbmUgUF9OT19NS1JDCTB4MjAwCS8qIGRvbid0IGluY2x1ZGUgaW4gOm1rdmltcmMgb3V0cHV0ICovCisjZGVmaW5lIFBfVklfREVGCTB4NDAwCS8qIFVzZSBWaSBkZWZhdWx0IGZvciBWaW0gKi8KKyNkZWZpbmUgUF9WSU0JCTB4ODAwCS8qIFZpbSBvcHRpb24sIHJlc2V0IHdoZW4gJ2NwJyBzZXQgKi8KKworCQkJCS8qIHdoZW4gb3B0aW9uIGNoYW5nZWQsIHdoYXQgdG8gZGlzcGxheTogKi8KKyNkZWZpbmUgUF9SU1RBVAkJMHgxMDAwCS8qIHJlZHJhdyBzdGF0dXMgbGluZXMgKi8KKyNkZWZpbmUgUF9SV0lOCQkweDIwMDAJLyogcmVkcmF3IGN1cnJlbnQgd2luZG93ICovCisjZGVmaW5lIFBfUkJVRgkJMHg0MDAwCS8qIHJlZHJhdyBjdXJyZW50IGJ1ZmZlciAqLworI2RlZmluZSBQX1JBTEwJCTB4NjAwMAkvKiByZWRyYXcgYWxsIHdpbmRvd3MgKi8KKyNkZWZpbmUgUF9SQ0xSCQkweDcwMDAJLyogY2xlYXIgYW5kIHJlZHJhdyBhbGwgKi8KKworI2RlZmluZSBQX0NPTU1BCQkweDgwMDAJLyogY29tbWEgc2VwYXJhdGVkIGxpc3QgKi8KKyNkZWZpbmUgUF9OT0RVUAkJMHgxMDAwMEwvKiBkb24ndCBhbGxvdyBkdXBsaWNhdGUgc3RyaW5ncyAqLworI2RlZmluZSBQX0ZMQUdMSVNUCTB4MjAwMDBMLyogbGlzdCBvZiBzaW5nbGUtY2hhciBmbGFncyAqLworCisjZGVmaW5lIFBfU0VDVVJFCTB4NDAwMDBMLyogY2Fubm90IGNoYW5nZSBpbiBtb2RlbGluZSBvciBzZWN1cmUgbW9kZSAqLworI2RlZmluZSBQX0dFVFRFWFQJMHg4MDAwMEwvKiBleHBhbmQgZGVmYXVsdCB2YWx1ZSB3aXRoIF8oKSAqLworI2RlZmluZSBQX05PR0xPQiAgICAgICAweDEwMDAwMEwvKiBkbyBub3QgdXNlIGxvY2FsIHZhbHVlIGZvciBnbG9iYWwgdmltcmMgKi8KKworLyoKKyAqIG9wdGlvbnNbXSBpcyBpbml0aWFsaXplZCBoZXJlLgorICogVGhlIG9yZGVyIG9mIHRoZSBvcHRpb25zIE1VU1QgYmUgYWxwaGFiZXRpYyBmb3IgIjpzZXQgYWxsIiBhbmQgZmluZG9wdGlvbigpLgorICogQWxsIG9wdGlvbiBuYW1lcyBNVVNUIHN0YXJ0IHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChmb3IgZmluZG9wdGlvbigpKS4KKyAqIEV4Y2VwdGlvbjogInRfIiBvcHRpb25zIGFyZSBhdCB0aGUgZW5kLgorICogVGhlIG9wdGlvbnMgd2l0aCBhIE5VTEwgdmFyaWFibGUgYXJlICdoaWRkZW4nOiBhIHNldCBjb21tYW5kIGZvciB0aGVtIGlzCisgKiBpZ25vcmVkIGFuZCB0aGV5IGFyZSBub3QgcHJpbnRlZC4KKyAqLworc3RhdGljIHN0cnVjdCB2aW1vcHRpb24KKyNpZmRlZiBGRUFUX0dVSV9XMTYKKwlfZmFyCisjZW5kaWYKKwlvcHRpb25zW10gPQoreworICAgIHsiYWxlcGgiLAkgICAgImFsIiwgICBQX05VTXxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIChjaGFyX3UgKikmcF9hbGVwaCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7CisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChPUzIpKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCisJCQkgICAgKGNoYXJfdSAqKTEyOEwsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKikyMjRMLAorI2VuZGlmCisJCQkJCSAgICAoY2hhcl91ICopMEx9fSwKKyAgICB7ImFudGlhbGlhcyIsICAgImFudGkiLCBQX0JPT0x8UF9WSV9ERUZ8UF9WSU18UF9SQ0xSLAorI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKKwkJCSAgICAoY2hhcl91ICopJnBfYW50aWFsaWFzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKilGQUxTRX0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKUZBTFNFfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImFyYWJpYyIsCSAgICAiYXJhYiIsIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX0FSQUJJQworCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9BUkFCLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYXJhYmljc2hhcGUiLCAiYXJzaGFwZSIsIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTXxQX1JDTFIsCisjaWZkZWYgRkVBVF9BUkFCSUMKKwkJCSAgICAoY2hhcl91ICopJnBfYXJzaGFwZSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKVRSVUUsIChjaGFyX3UgKikwTH19LAorICAgIHsiYWxsb3dyZXZpbnMiLCAiYXJpIiwgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIChjaGFyX3UgKikmcF9hcmksIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJhbHRrZXltYXAiLCAgICJha20iLCAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfRktNQVAKKwkJCSAgICAoY2hhcl91ICopJnBfYWx0a2V5bWFwLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYW1iaXdpZHRoIiwgICJhbWJ3IiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkNMUiwKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpCisJCQkgICAgKGNoYXJfdSAqKSZwX2FtYncsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikic2luZ2xlIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorI2lmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSB8fCBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKQorICAgIHsiYXV0b2NoZGlyIiwgICJhY2QiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfYWNkLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorI2VuZGlmCisgICAgeyJhdXRvaW5kZW50IiwgICJhaSIsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9haSwgUFZfQUksCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJhdXRvcHJpbnQiLCAgICJhcCIsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYXV0b3JlYWQiLCAgICAiYXIiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfYXIsIE9QVF9CT1RIKFBWX0FSKSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImF1dG93cml0ZSIsICAgImF3IiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX2F3LCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYXV0b3dyaXRlYWxsIiwiYXdhIiwgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfYXdhLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYmFja2dyb3VuZCIsICAiYmciLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfUkNMUiwKKwkJCSAgICAoY2hhcl91ICopJnBfYmcsIFBWX05PTkUsCisJCQkgICAgeworI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMjY0KSkgJiYgIWRlZmluZWQoRkVBVF9HVUkpCisJCQkgICAgKGNoYXJfdSAqKSJkYXJrIiwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKSJsaWdodCIsCisjZW5kaWYKKwkJCQkJICAgIChjaGFyX3UgKikwTH19LAorICAgIHsiYmFja3NwYWNlIiwgICAiYnMiLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfVklNfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfYnMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJiYWNrdXAiLAkgICAgImJrIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX2JrLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYmFja3VwY29weSIsICAiYmtjIiwgIFBfU1RSSU5HfFBfVklNfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfYmtjLCBQVl9OT05FLAorI2lmZGVmIFVOSVgKKwkJCSAgICB7KGNoYXJfdSAqKSJ5ZXMiLCAoY2hhcl91ICopImF1dG8ifQorI2Vsc2UKKwkJCSAgICB7KGNoYXJfdSAqKSJhdXRvIiwgKGNoYXJfdSAqKSJhdXRvIn0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJiYWNrdXBkaXIiLCAgICJiZGlyIiwgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQfFBfU0VDVVJFLAorCQkJICAgIChjaGFyX3UgKikmcF9iZGlyLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopREZMVF9CRElSLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImJhY2t1cGV4dCIsICAgImJleCIsICBQX1NUUklOR3xQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfYmV4LCBQVl9OT05FLAorCQkJICAgIHsKKyNpZmRlZiBWTVMKKwkJCSAgICAoY2hhcl91ICopIl8iLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopIn4iLAorI2VuZGlmCisJCQkJCSAgICAoY2hhcl91ICopMEx9fSwKKyAgICB7ImJhY2t1cHNraXAiLCAgImJzayIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BLAorI2lmZGVmIEZFQVRfV0lMRElHTgorCQkJICAgIChjaGFyX3UgKikmcF9ic2ssIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorI2lmZGVmIEZFQVRfQkVWQUwKKyAgICB7ImJhbGxvb25kZWxheSIsImJkbGF5IixQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfYmRsYXksIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKik2MDBMLCAoY2hhcl91ICopMEx9fSwKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9CRVZBTCkgJiYgKGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIFwKKwl8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykpCisgICAgeyJiYWxsb29uZXZhbCIsICJiZXZhbCIsUF9CT09MfFBfVklfREVGfFBfTk9fTUtSQywKKwkJCSAgICAoY2hhcl91ICopJnBfYmV2YWwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyNlbmRpZgorICAgIHsiYmVhdXRpZnkiLCAgICAiYmYiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImJpbmFyeSIsCSAgICAiYmluIiwgIFBfQk9PTHxQX1ZJX0RFRnxQX1JTVEFULAorCQkJICAgIChjaGFyX3UgKikmcF9iaW4sIFBWX0JJTiwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImJpb3NrZXkiLAkgICAgImJpb3NrIixQX0JPT0x8UF9WSV9ERUYsCisjaWZkZWYgTVNET1MKKwkJCSAgICAoY2hhcl91ICopJnBfYmlvc2ssIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImJvbWIiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9OT19NS1JDfFBfVklfREVGfFBfUlNUQVQsCisjaWZkZWYgRkVBVF9NQllURQorCQkJICAgIChjaGFyX3UgKikmcF9ib21iLCBQVl9CT01CLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiYnJlYWthdCIsCSAgICAiYnJrIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkFMTHxQX0ZMQUdMSVNULAorI2lmZGVmIEZFQVRfTElORUJSRUFLCisJCQkgICAgKGNoYXJfdSAqKSZwX2JyZWFrYXQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIFx0IUAqLSs7OiwuLz8iLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJicm93c2VkaXIiLCAgICJic2RpciIsUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9CUk9XU0UKKwkJCSAgICAoY2hhcl91ICopJnBfYnNkaXIsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikibGFzdCIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImJ1ZmhpZGRlbiIsICAgImJoIiwgICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9OT0dMT0IsCisjaWYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQkJICAgIChjaGFyX3UgKikmcF9iaCwgUFZfQkgsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiYnVmbGlzdGVkIiwgICAiYmwiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX05PR0xPQiwKKwkJCSAgICAoY2hhcl91ICopJnBfYmwsIFBWX0JMLAorCQkJICAgIHsoY2hhcl91ICopMUwsIChjaGFyX3UgKikwTH0KKwkJCSAgICB9LAorICAgIHsiYnVmdHlwZSIsCSAgICAiYnQiLCAgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRnxQX05PR0xPQiwKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCQkgICAgKGNoYXJfdSAqKSZwX2J0LCBQVl9CVCwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJjYXNlbWFwIiwJICAgICJjbXAiLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfY21wLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopImludGVybmFsLGtlZXBhc2NpaSIsIChjaGFyX3UgKikwTH0KKwkJCSAgICB9LAorICAgIHsiY2RwYXRoIiwJICAgICJjZCIsICAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorCQkJICAgIChjaGFyX3UgKikmcF9jZHBhdGgsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiLCwiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJjZWRpdCIsCSAgICBOVUxMLCAgIFBfU1RSSU5HLAorI2lmZGVmIEZFQVRfQ01EV0lOCisJCQkgICAgKGNoYXJfdSAqKSZwX2NlZGl0LCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKilDVFJMX0ZfU1RSfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiY2hhcmNvbnZlcnQiLCAgImNjdiIsIFBfU1RSSU5HfFBfVklfREVGfFBfU0VDVVJFLAorI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJCQkgICAgKGNoYXJfdSAqKSZwX2NjdiwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJjaW5kZW50IiwJICAgICJjaW4iLCAgUF9CT09MfFBfVklfREVGfFBfVklNLAorI2lmZGVmIEZFQVRfQ0lOREVOVAorCQkJICAgIChjaGFyX3UgKikmcF9jaW4sIFBWX0NJTiwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNpbmtleXMiLAkgICAgImNpbmsiLCBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfQ0lOREVOVAorCQkJICAgIChjaGFyX3UgKikmcF9jaW5rLCBQVl9DSU5LLAorCQkJICAgIHsoY2hhcl91ICopIjB7LDB9LDApLDosMCMsIV5GLG8sTyxlIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiY2lub3B0aW9ucyIsICAiY2lubyIsIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisjaWZkZWYgRkVBVF9DSU5ERU5UCisJCQkgICAgKGNoYXJfdSAqKSZwX2Npbm8sIFBWX0NJTk8sCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJjaW53b3JkcyIsICAgICJjaW53IiwgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZiBkZWZpbmVkKEZFQVRfU01BUlRJTkRFTlQpIHx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKQorCQkJICAgIChjaGFyX3UgKikmcF9jaW53LCBQVl9DSU5XLAorCQkJICAgIHsoY2hhcl91ICopImlmLGVsc2Usd2hpbGUsZG8sZm9yLHN3aXRjaCIsCisJCQkJKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiY2xpcGJvYXJkIiwgICAiY2IiLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorCQkJICAgIChjaGFyX3UgKikmcF9jYiwgUFZfTk9ORSwKKyMgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisJCQkgICAgeyhjaGFyX3UgKikiYXV0b3NlbGVjdCxleGNsdWRlOmNvbnNcXHxsaW51eCIsCisJCQkJCQkJICAgICAgIChjaGFyX3UgKikwTH0KKyMgZWxzZQorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH0KKyMgZW5kaWYKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImNtZGhlaWdodCIsICAgImNoIiwgICBQX05VTXxQX1ZJX0RFRnxQX1JBTEwsCisJCQkgICAgKGNoYXJfdSAqKSZwX2NoLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMUwsIChjaGFyX3UgKikwTH19LAorICAgIHsiY21kd2luaGVpZ2h0IiwgImN3aCIsIFBfTlVNfFBfVklfREVGLAorI2lmZGVmIEZFQVRfQ01EV0lOCisJCQkgICAgKGNoYXJfdSAqKSZwX2N3aCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTdMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNvbHVtbnMiLAkgICAgImNvIiwgICBQX05VTXxQX05PREVGQVVMVHxQX05PX01LUkN8UF9WSV9ERUZ8UF9SQ0xSLAorCQkJICAgIChjaGFyX3UgKikmQ29sdW1ucywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTgwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJjb21tZW50cyIsICAgICJjb20iLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJCQkgICAgKGNoYXJfdSAqKSZwX2NvbSwgUFZfQ09NLAorCQkJICAgIHsoY2hhcl91ICopInMxOi8qLG1iOiosZXg6Ki8sOi8vLGI6Iyw6JSw6WENPTU0sbjo+LGZiOi0iLAorCQkJCShjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImNvbW1lbnRzdHJpbmciLCAiY21zIiwgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGLAorI2lmZGVmIEZFQVRfRk9MRElORworCQkJICAgIChjaGFyX3UgKikmcF9jbXMsIFBWX0NNUywKKwkJCSAgICB7KGNoYXJfdSAqKSIvKiVzKi8iLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJjb21wYXRpYmxlIiwgICJjcCIsICAgUF9CT09MfFBfUkFMTCwKKwkJCSAgICAoY2hhcl91ICopJnBfY3AsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopRkFMU0V9fSwKKyAgICB7ImNvbXBsZXRlIiwgICAgImNwdCIsICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkJICAgIChjaGFyX3UgKikmcF9jcHQsIFBWX0NQVCwKKwkJCSAgICB7KGNoYXJfdSAqKSIuLHcsYix1LHQsaSIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImNvbmZpcm0iLCAgICAgImNmIiwgICBQX0JPT0x8UF9WSV9ERUYsCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorCQkJICAgIChjaGFyX3UgKikmcF9jb25maXJtLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiY29uc2tleSIsCSAgICAiY29uc2siLFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBNU0RPUworCQkJICAgIChjaGFyX3UgKikmcF9jb25zaywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNvcHlpbmRlbnQiLCAgImNpIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX2NpLCBQVl9DSSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNwb3B0aW9ucyIsICAgImNwbyIsICBQX1NUUklOR3xQX1ZJTXxQX1JBTEx8UF9GTEFHTElTVCwKKwkJCSAgICAoY2hhcl91ICopJnBfY3BvLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopQ1BPX0FMTCwgKGNoYXJfdSAqKUNQT19ERUZBVUxUfX0sCisgICAgeyJjc2NvcGVwYXRoY29tcCIsICJjc3BjIiwgUF9OVU18UF9WSV9ERUZ8UF9WSU0sCisjaWZkZWYgRkVBVF9DU0NPUEUKKwkJCSAgICAoY2hhcl91ICopJnBfY3NwYywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNzY29wZXByZyIsICAgImNzcHJnIiwgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9TRUNVUkUsCisjaWZkZWYgRkVBVF9DU0NPUEUKKwkJCSAgICAoY2hhcl91ICopJnBfY3NwcmcsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiY3Njb3BlIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiY3Njb3BlcXVpY2tmaXgiLCAiY3NxZiIsIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZiBkZWZpbmVkKEZFQVRfQ1NDT1BFKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCQkgICAgKGNoYXJfdSAqKSZwX2NzcWYsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiY3Njb3BldGFnIiwgICAiY3N0IiwgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX0NTQ09QRQorCQkJICAgIChjaGFyX3UgKikmcF9jc3QsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJjc2NvcGV0YWdvcmRlciIsICJjc3RvIiwgUF9OVU18UF9WSV9ERUZ8UF9WSU0sCisjaWZkZWYgRkVBVF9DU0NPUEUKKwkJCSAgICAoY2hhcl91ICopJnBfY3N0bywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImNzY29wZXZlcmJvc2UiLCAiY3N2ZXJiIiwgUF9CT09MfFBfVklfREVGfFBfVklNLAorI2lmZGVmIEZFQVRfQ1NDT1BFCisJCQkgICAgKGNoYXJfdSAqKSZwX2NzdmVyYm9zZSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImRlYnVnIiwJICAgIE5VTEwsICAgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX2RlYnVnLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsiZGVmaW5lIiwJICAgICJkZWYiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGLAorI2lmZGVmIEZFQVRfRklORF9JRAorCQkJICAgIChjaGFyX3UgKikmcF9kZWYsIE9QVF9CT1RIKFBWX0RFRiksCisJCQkgICAgeyhjaGFyX3UgKikiXlxccyNcXHMqZGVmaW5lIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJkZWxjb21iaW5lIiwgImRlY28iLCAgUF9CT09MfFBfVklfREVGfFBfVklNLAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAoY2hhcl91ICopJnBfZGVjbywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9CisJCQkgICAgfSwKKyAgICB7ImRpY3Rpb25hcnkiLCAgImRpY3QiLCBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJCQkgICAgKGNoYXJfdSAqKSZwX2RpY3QsIE9QVF9CT1RIKFBWX0RJQ1QpLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsiZGlmZiIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1JXSU58UF9OT0dMT0IsCisjaWZkZWYgRkVBVF9ESUZGCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0RJRkYsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJkaWZmZXhwciIsICAgICJkZXgiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9TRUNVUkUsCisjaWYgZGVmaW5lZChGRUFUX0RJRkYpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCQkJICAgIChjaGFyX3UgKikmcF9kZXgsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZGlmZm9wdCIsCSAgICAiZGlwIiwgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRnxQX1JXSU58UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfRElGRgorCQkJICAgIChjaGFyX3UgKikmcF9kaXAsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiZmlsbGVyIiwgKGNoYXJfdSAqKU5VTEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKilOVUxMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImRpZ3JhcGgiLAkgICAgImRnIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisjaWZkZWYgRkVBVF9ESUdSQVBIUworCQkJICAgIChjaGFyX3UgKikmcF9kZywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImRpcmVjdG9yeSIsICAgImRpciIsICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVB8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX2RpciwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKURGTFRfRElSLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImRpc3BsYXkiLAkgICAgImR5IiwgICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfUkFMTHxQX05PRFVQLAorCQkJICAgIChjaGFyX3UgKikmcF9keSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImVhZGlyZWN0aW9uIiwgImVhZCIsICBQX1NUUklOR3xQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCQkJICAgIChjaGFyX3UgKikmcF9lYWQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiYm90aCIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZWRjb21wYXRpYmxlIiwiZWQiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfZWQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJlbmNvZGluZyIsICAgICJlbmMiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9SQ0xSLAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAoY2hhcl91ICopJnBfZW5jLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRU5DX0RGTFQsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImVuZG9mbGluZSIsICAgImVvbCIsICBQX0JPT0x8UF9OT19NS1JDfFBfVklfREVGfFBfUlNUQVQsCisJCQkgICAgKGNoYXJfdSAqKSZwX2VvbCwgUFZfRU9MLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJlcXVhbGFsd2F5cyIsICJlYSIsICAgUF9CT09MfFBfVklfREVGfFBfUkFMTCwKKwkJCSAgICAoY2hhcl91ICopJnBfZWEsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImVxdWFscHJnIiwgICAgImVwIiwgICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX1NFQ1VSRSwKKwkJCSAgICAoY2hhcl91ICopJnBfZXAsIE9QVF9CT1RIKFBWX0VQKSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImVycm9yYmVsbHMiLCAgImViIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX2ViLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiZXJyb3JmaWxlIiwgICAiZWYiLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfU0VDVVJFLAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJCSAgICAoY2hhcl91ICopJnBfZWYsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilERkxUX0VSUk9SRklMRSwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJlcnJvcmZvcm1hdCIsICJlZm0iLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJCSAgICAoY2hhcl91ICopJnBfZWZtLCBPUFRfQk9USChQVl9FRk0pLAorCQkJICAgIHsoY2hhcl91ICopREZMVF9FRk0sIChjaGFyX3UgKikwTH0sCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImVzY2tleXMiLAkgICAgImVrIiwgICBQX0JPT0x8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX2VrLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKilUUlVFfX0sCisgICAgeyJldmVudGlnbm9yZSIsICJlaSIsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfQVVUT0NNRAorCQkJICAgIChjaGFyX3UgKikmcF9laSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImV4cGFuZHRhYiIsICAgImV0IiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX2V0LCBQVl9FVCwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImV4cmMiLAkgICAgImV4IiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX2V4cmMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmaWxlZW5jb2RpbmciLCJmZW5jIiwgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfUlNUQVR8UF9SQlVGfFBfTk9fTUtSQywKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkgICAgKGNoYXJfdSAqKSZwX2ZlbmMsIFBWX0ZFTkMsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZmlsZWVuY29kaW5ncyIsImZlbmNzIiwgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQSwKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkgICAgKGNoYXJfdSAqKSZwX2ZlbmNzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopInVjcy1ib20iLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJmaWxlZm9ybWF0IiwgICJmZiIsICAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfUlNUQVR8UF9OT19NS1JDLAorCQkJICAgIChjaGFyX3UgKikmcF9mZiwgUFZfRkYsCisJCQkgICAgeyhjaGFyX3UgKilERkxUX0ZGLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImZpbGVmb3JtYXRzIiwgImZmcyIsICBQX1NUUklOR3xQX1ZJTXxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX2ZmcywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKURGTFRfRkZTX1ZJLCAoY2hhcl91ICopREZMVF9GRlNfVklNfX0sCisgICAgeyJmaWxldHlwZSIsICAgICJmdCIsICAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfTk9HTE9CLAorI2lmZGVmIEZFQVRfQVVUT0NNRAorCQkJICAgIChjaGFyX3UgKikmcF9mdCwgUFZfRlQsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZmlsbGNoYXJzIiwgICAiZmNzIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkFMTHxQX0NPTU1BfFBfTk9EVVAsCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorCQkJICAgIChjaGFyX3UgKikmcF9mY3MsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikidmVydDp8LGZvbGQ6LSIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7ImZrbWFwIiwJICAgICJmayIsICAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfRktNQVAKKwkJCSAgICAoY2hhcl91ICopJnBfZmttYXAsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmbGFzaCIsCSAgICAiZmwiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICB7ImZvbGRjbG9zZSIsICAgImZjbCIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVB8UF9SV0lOLAorCQkJICAgIChjaGFyX3UgKikmcF9mY2wsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmb2xkY29sdW1uIiwgICJmZGMiLCAgUF9OVU18UF9WSV9ERUZ8UF9SV0lOLAorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9GREMsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmb2xkZW5hYmxlIiwgICJmZW4iLCAgUF9CT09MfFBfVklfREVGfFBfUldJTiwKKwkJCSAgICAoY2hhcl91ICopVkFSX1dJTiwgUFZfRkVOLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmb2xkZXhwciIsICAgICJmZGUiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklNfFBfVklfREVGfFBfUldJTiwKKyMgaWZkZWYgRkVBVF9FVkFMCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0ZERSwKKwkJCSAgICB7KGNoYXJfdSAqKSIwIiwgKGNoYXJfdSAqKU5VTEx9CisjIGVsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyMgZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZm9sZGlnbm9yZSIsICAiZmRpIiwgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJTXxQX1ZJX0RFRnxQX1JXSU4sCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0ZESSwKKwkJCSAgICB7KGNoYXJfdSAqKSIjIiwgKGNoYXJfdSAqKU5VTEx9fSwKKyAgICB7ImZvbGRsZXZlbCIsICAgImZkbCIsICBQX05VTXxQX1ZJX0RFRnxQX1JXSU4sCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0ZETCwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImZvbGRsZXZlbHN0YXJ0IiwiZmRscyIsIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9mZGxzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopLTFMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImZvbGRtYXJrZXIiLCAgImZtciIsICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSU18UF9WSV9ERUZ8CisJCQkJCQkgICAgICAgUF9SV0lOfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopVkFSX1dJTiwgUFZfRk1SLAorCQkJICAgIHsoY2hhcl91ICopInt7eyx9fX0iLCAoY2hhcl91ICopTlVMTH19LAorICAgIHsiZm9sZG1ldGhvZCIsICAiZmRtIiwgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJTXxQX1ZJX0RFRnxQX1JXSU4sCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0ZETSwKKwkJCSAgICB7KGNoYXJfdSAqKSJtYW51YWwiLCAoY2hhcl91ICopTlVMTH19LAorICAgIHsiZm9sZG1pbmxpbmVzIiwiZm1sIiwgIFBfTlVNfFBfVklfREVGfFBfUldJTiwKKwkJCSAgICAoY2hhcl91ICopVkFSX1dJTiwgUFZfRk1MLAorCQkJICAgIHsoY2hhcl91ICopMUwsIChjaGFyX3UgKikwTH19LAorICAgIHsiZm9sZG5lc3RtYXgiLCAiZmRuIiwgIFBfTlVNfFBfVklfREVGfFBfUldJTiwKKwkJCSAgICAoY2hhcl91ICopVkFSX1dJTiwgUFZfRkROLAorCQkJICAgIHsoY2hhcl91ICopMjBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImZvbGRvcGVuIiwgICAgImZkbyIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX2ZkbywgUFZfTk9ORSwKKwkJIHsoY2hhcl91ICopImJsb2NrLGhvcixtYXJrLHBlcmNlbnQscXVpY2tmaXgsc2VhcmNoLHRhZyx1bmRvIiwKKwkJCQkJCQkgICAgICAgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJmb2xkdGV4dCIsICAgICJmZHQiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklNfFBfVklfREVGfFBfUldJTiwKKyMgaWZkZWYgRkVBVF9FVkFMCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0ZEVCwKKwkJCSAgICB7KGNoYXJfdSAqKSJmb2xkdGV4dCgpIiwgKGNoYXJfdSAqKU5VTEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyNlbmRpZgorICAgIHsiZm9ybWF0b3B0aW9ucyIsImZvIiwgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJTXxQX0ZMQUdMSVNULAorCQkJICAgIChjaGFyX3UgKikmcF9mbywgUFZfRk8sCisJCQkgICAgeyhjaGFyX3UgKilERkxUX0ZPX1ZJLCAoY2hhcl91ICopREZMVF9GT19WSU19fSwKKyAgICB7ImZvcm1hdHByZyIsICAgImZwIiwgICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX1NFQ1VSRSwKKwkJCSAgICAoY2hhcl91ICopJnBfZnAsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJnZGVmYXVsdCIsICAgICJnZCIsICAgUF9CT09MfFBfVklfREVGfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF9nZCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImdyYXBoaWMiLAkgICAgImdyIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJncmVwZm9ybWF0IiwgICJnZm0iLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJCSAgICAoY2hhcl91ICopJnBfZ2VmbSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKURGTFRfR1JFUEZPUk1BVCwgKGNoYXJfdSAqKTBMfSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiZ3JlcHByZyIsCSAgICAiZ3AiLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfU0VDVVJFLAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJCSAgICAoY2hhcl91ICopJnBfZ3AsIE9QVF9CT1RIKFBWX0dQKSwKKwkJCSAgICB7CisjIGlmZGVmIFdJTjMyNjQKKwkJCSAgICAvKiBtYXkgYmUgY2hhbmdlZCB0byAiZ3JlcCAtbiIgaW4gb3Nfd2luMzIuYyAqLworCQkJICAgIChjaGFyX3UgKikiZmluZHN0ciAvbiIsCisjIGVsc2UKKyMgIGlmZGVmIFVOSVgKKwkJCSAgICAvKiBBZGQgYW4gZXh0cmEgZmlsZSBuYW1lIHNvIHRoYXQgZ3JlcCB3aWxsIGFsd2F5cworCQkJICAgICAqIGluc2VydCBhIGZpbGUgbmFtZSBpbiB0aGUgbWF0Y2ggbGluZS4gKi8KKwkJCSAgICAoY2hhcl91ICopImdyZXAgLW4gJCogL2Rldi9udWxsIiwKKyMgIGVsc2UKKyMgICBpZmRlZiBWTVMKKwkJCSAgICAoY2hhcl91ICopIlNFQVJDSC9OVU1CRVJTICIsCisjICAgZWxzZQorCQkJICAgIChjaGFyX3UgKikiZ3JlcCAtbiAiLAorI2VuZGlmCisjZW5kaWYKKyMgZW5kaWYKKwkJCSAgICAoY2hhcl91ICopMEx9LAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJndWljdXJzb3IiLCAgICAiZ2NyIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKwkJCSAgICAoY2hhcl91ICopJnBfZ3VpY3Vyc29yLCBQVl9OT05FLAorCQkJICAgIHsKKyMgaWZkZWYgRkVBVF9HVUkKKwkJCQkoY2hhcl91ICopIm4tdi1jOmJsb2NrLUN1cnNvci9sQ3Vyc29yLHZlOnZlcjM1LUN1cnNvcixvOmhvcjUwLUN1cnNvcixpLWNpOnZlcjI1LUN1cnNvci9sQ3Vyc29yLHItY3I6aG9yMjAtQ3Vyc29yL2xDdXJzb3Isc206YmxvY2stQ3Vyc29yLWJsaW5rd2FpdDE3NS1ibGlua29mZjE1MC1ibGlua29uMTc1IiwKKyMgZWxzZQkvKiBNU0RPUyBvciBXaW4zMiBjb25zb2xlICovCisJCQkJKGNoYXJfdSAqKSJuLXYtYzpibG9jayxvOmhvcjUwLGktY2k6aG9yMTUsci1jcjpob3IzMCxzbTpibG9jayIsCisjIGVuZGlmCisJCQkJICAgIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCQkgICAgfSwKKyAgICB7Imd1aWZvbnQiLAkgICAgImdmbiIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JDTFJ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfR1VJCisJCQkgICAgKGNoYXJfdSAqKSZwX2d1aWZvbnQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJCSAgICB9LAorICAgIHsiZ3VpZm9udHNldCIsICAiZ2ZzIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkNMUnxQX0NPTU1BLAorI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoRkVBVF9YRk9OVFNFVCkKKwkJCSAgICAoY2hhcl91ICopJnBfZ3VpZm9udHNldCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkJICAgIH0sCisgICAgeyJndWlmb250d2lkZSIsICJnZnciLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9SQ0xSfFBfQ09NTUF8UF9OT0RVUCwKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCisJCQkgICAgKGNoYXJfdSAqKSZwX2d1aWZvbnR3aWRlLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCQkgICAgfSwKKyAgICB7Imd1aWhlYWRyb29tIiwgImdociIsICBQX05VTXxQX1ZJX0RFRiwKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpCisJCQkgICAgKGNoYXJfdSAqKSZwX2dociwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTUwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJndWlvcHRpb25zIiwgICJnbyIsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9SQUxMfFBfRkxBR0xJU1QsCisjaWYgZGVmaW5lZChGRUFUX0dVSSkKKwkJCSAgICAoY2hhcl91ICopJnBfZ28sIFBWX05PTkUsCisjIGlmIGRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoTUFDT1MpCisJCQkgICAgeyhjaGFyX3UgKikiYWdpbXJMdFQiLCAoY2hhcl91ICopMEx9CisjIGVsc2UKKwkJCSAgICB7KGNoYXJfdSAqKSJnbXJMdFQiLCAoY2hhcl91ICopMEx9CisjIGVuZGlmCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkJICAgIH0sCisgICAgeyJndWlwdHkiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSV9ERUYsCisjaWYgZGVmaW5lZChGRUFUX0dVSSkKKwkJCSAgICAoY2hhcl91ICopJnBfZ3VpcHR5LCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJoYXJkdGFicyIsICAgICJodCIsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJoZWxwZmlsZSIsICAgICJoZiIsICAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX2hmLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopREZMVF9IRUxQRklMRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJoZWxwaGVpZ2h0IiwgICJoaCIsICAgUF9OVU18UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJCQkgICAgKGNoYXJfdSAqKSZwX2hoLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopMjBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImhlbHBsYW5nIiwgICAgImhsZyIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BLAorI2lmZGVmIEZFQVRfTVVMVElfTEFORworCQkJICAgIChjaGFyX3UgKikmcF9obGcsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKyAgICB9LAorICAgIHsiaGlkZGVuIiwJICAgICJoaWQiLCAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9oaWQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJoaWdobGlnaHQiLCAgICJobCIsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9SQ0xSfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfaGwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiODpTcGVjaWFsS2V5LEA6Tm9uVGV4dCxkOkRpcmVjdG9yeSxlOkVycm9yTXNnLGk6SW5jU2VhcmNoLGw6U2VhcmNoLG06TW9yZU1zZyxNOk1vZGVNc2csbjpMaW5lTnIscjpRdWVzdGlvbixzOlN0YXR1c0xpbmUsUzpTdGF0dXNMaW5lTkMsYzpWZXJ0U3BsaXQsdDpUaXRsZSx2OlZpc3VhbCxWOlZpc3VhbE5PUyx3Oldhcm5pbmdNc2csVzpXaWxkTWVudSxmOkZvbGRlZCxGOkZvbGRDb2x1bW4sQTpEaWZmQWRkLEM6RGlmZkNoYW5nZSxEOkRpZmZEZWxldGUsVDpEaWZmVGV4dCw+OlNpZ25Db2x1bW4iLAorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsiaGlzdG9yeSIsCSAgICAiaGkiLCAgIFBfTlVNfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF9oaSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMjBMfX0sCisgICAgeyJoa21hcCIsCSAgICAiaGsiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIChjaGFyX3UgKikmcF9oa21hcCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImhrbWFwcCIsCSAgICAiaGtwIiwgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIChjaGFyX3UgKikmcF9oa21hcHAsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJobHNlYXJjaCIsICAgICJobHMiLCAgUF9CT09MfFBfVklfREVGfFBfVklNfFBfUkFMTCwKKwkJCSAgICAoY2hhcl91ICopJnBfaGxzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiaWNvbiIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1RJVExFCisJCQkgICAgKGNoYXJfdSAqKSZwX2ljb24sIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJpY29uc3RyaW5nIiwgIE5VTEwsICAgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9USVRMRQorCQkJICAgIChjaGFyX3UgKikmcF9pY29uc3RyaW5nLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsiaWdub3JlY2FzZSIsICAiaWMiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfaWMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJpbWFjdGl2YXRla2V5IiwiaW1hayIsUF9TVFJJTkd8UF9WSV9ERUYsCisjaWYgZGVmaW5lZChGRUFUX1hJTSkgJiYgZGVmaW5lZChGRUFUX0dVSV9HVEspCisJCQkgICAgKGNoYXJfdSAqKSZwX2ltYWssIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJpbWNtZGxpbmUiLCAgICJpbWMiLCAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIFVTRV9JTV9DT05UUk9MCisJCQkgICAgKGNoYXJfdSAqKSZwX2ltY21kbGluZSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImltZGlzYWJsZSIsICAgImltZCIsICBQX0JPT0x8UF9WSV9ERUYsCisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKwkJCSAgICAoY2hhcl91ICopJnBfaW1kaXNhYmxlLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorI2lmZGVmIF9fc2dpCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJpbWluc2VydCIsICAgICJpbWkiLCAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX2ltaW5zZXJ0LCBQVl9JTUksCisjaWZkZWYgQl9JTU9ERV9JTQorCQkJICAgIHsoY2hhcl91ICopQl9JTU9ERV9JTSwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICB7KGNoYXJfdSAqKUJfSU1PREVfTk9ORSwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7Imltc2VhcmNoIiwgICAgImltcyIsICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfaW1zZWFyY2gsIFBWX0lNUywKKyNpZmRlZiBCX0lNT0RFX0lNCisJCQkgICAgeyhjaGFyX3UgKilCX0lNT0RFX0lNLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIHsoY2hhcl91ICopQl9JTU9ERV9OT05FLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiaW5jbHVkZSIsCSAgICAiaW5jIiwgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKwkJCSAgICAoY2hhcl91ICopJnBfaW5jLCBPUFRfQk9USChQVl9JTkMpLAorCQkJICAgIHsoY2hhcl91ICopIl5cXHMqI1xccyppbmNsdWRlIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiaW5jbHVkZWV4cHIiLCAiaW5leCIsIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRiwKKyNpZiBkZWZpbmVkKEZFQVRfRklORF9JRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJCQkgICAgKGNoYXJfdSAqKSZwX2luZXgsIFBWX0lORVgsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsiaW5jc2VhcmNoIiwgICAiaXMiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfaXMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJpbmRlbnRleHByIiwgImluZGUiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfVklNLAorI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKKwkJCSAgICAoY2hhcl91ICopJnBfaW5kZSwgUFZfSU5ERSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJpbmRlbnRrZXlzIiwgImluZGsiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZiBkZWZpbmVkKEZFQVRfQ0lOREVOVCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJCQkgICAgKGNoYXJfdSAqKSZwX2luZGssIFBWX0lOREssCisJCQkgICAgeyhjaGFyX3UgKikiMHssMH0sOiwwIywhXkYsbyxPLGUiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJpbmZlcmNhc2UiLCAgICJpbmYiLCAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9pbmYsIFBWX0lORiwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Imluc2VydG1vZGUiLCAgImltIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX2ltLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsiaXNmbmFtZSIsCSAgICAiaXNmIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfaXNmLCBQVl9OT05FLAorCQkJICAgIHsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJCQkvKiBFeGNsdWRlZCBhcmU6ICYgYW5kIF4gYXJlIHNwZWNpYWwgaW4gY21kLmV4ZQorCQkJCSAqICggYW5kICkgYXJlIHVzZWQgaW4gdGV4dCBzZXBhcmF0aW5nIGZuYW1lcyAqLworCQkJICAgIChjaGFyX3UgKikiQCw0OC01NywvLFxcLC4sLSxfLCssLCwjLCQsJSx7LH0sWyxdLDosQC1ALCEsfiw9IiwKKyNlbHNlCisjIGlmZGVmIEFNSUdBCisJCQkgICAgKGNoYXJfdSAqKSJALDQ4LTU3LC8sLiwtLF8sKywsLCQsOiIsCisjIGVsc2UKKyMgIGlmZGVmIFZNUworCQkJICAgIChjaGFyX3UgKikiQCw0OC01NywvLC4sLSxfLCssLCwjLCQsJSw8LD4sWyxdLDosOyx+IiwKKyMgIGVsc2UgLyogVU5JWCBldCBhbC4gKi8KKyMgICBpZmRlZiBFQkNESUMKKwkJCSAgICAoY2hhcl91ICopIkAsMjQwLTI0OSwvLC4sLSxfLCssLCwjLCQsJSx+LD0iLAorIyAgIGVsc2UKKwkJCSAgICAoY2hhcl91ICopIkAsNDgtNTcsLywuLC0sXywrLCwsIywkLCUsfiw9IiwKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsiaXNpZGVudCIsCSAgICAiaXNpIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfaXNpLCBQVl9OT05FLAorCQkJICAgIHsKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE9TMikKKwkJCSAgICAoY2hhcl91ICopIkAsNDgtNTcsXywxMjgtMTY3LDIyNC0yMzUiLAorI2Vsc2UKKyMgaWZkZWYgRUJDRElDCisJCQkgICAgLyogVE9ETzogRUJDRElDIENoZWNrIHRoaXMhIEAgPT0gaXNhbHBoYSgpKi8KKwkJCSAgICAoY2hhcl91ICopIkAsMjQwLTI0OSxfLDY2LTczLDgxLTg5LDk4LTEwNSwiCisJCQkJICAgICIxMTItMTIwLDEyOCwxNDAtMTQyLDE1NiwxNTgsMTcyLCIKKwkJCQkgICAgIjE3NCwxODYsMTkxLDIwMy0yMDcsMjE5LTIyNSwyMzUtMjM5LCIKKwkJCQkgICAgIjI1MS0yNTQiLAorIyBlbHNlCisJCQkgICAgKGNoYXJfdSAqKSJALDQ4LTU3LF8sMTkyLTI1NSIsCisjIGVuZGlmCisjZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9fSwKKyAgICB7Imlza2V5d29yZCIsICAgImlzayIsICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSU18UF9DT01NQXxQX05PRFVQLAorCQkJICAgIChjaGFyX3UgKikmcF9pc2ssIFBWX0lTSywKKwkJCSAgICB7CisjaWZkZWYgRUJDRElDCisJCQkgICAgIChjaGFyX3UgKikiQCwyNDAtMjQ5LF8iLAorCQkJICAgICAvKiBUT0RPOiBFQkNESUMgQ2hlY2sgdGhpcyEgQCA9PSBpc2FscGhhKCkqLworCQkJICAgICAoY2hhcl91ICopIkAsMjQwLTI0OSxfLDY2LTczLDgxLTg5LDk4LTEwNSwiCisJCQkJICAgICIxMTItMTIwLDEyOCwxNDAtMTQyLDE1NiwxNTgsMTcyLCIKKwkJCQkgICAgIjE3NCwxODYsMTkxLDIwMy0yMDcsMjE5LTIyNSwyMzUtMjM5LCIKKwkJCQkgICAgIjI1MS0yNTQiLAorI2Vsc2UKKwkJCQkoY2hhcl91ICopIkAsNDgtNTcsXyIsCisjIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKQorCQkJCShjaGFyX3UgKikiQCw0OC01NyxfLDEyOC0xNjcsMjI0LTIzNSIKKyMgZWxzZQorCQkJCShjaGFyX3UgKikiQCw0OC01NyxfLDE5Mi0yNTUiCisjIGVuZGlmCisjZW5kaWYKKwkJCQl9fSwKKyAgICB7ImlzcHJpbnQiLAkgICAgImlzcCIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JBTEx8UF9DT01NQXxQX05PRFVQLAorCQkJICAgIChjaGFyX3UgKikmcF9pc3AsIFBWX05PTkUsCisJCQkgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKE1BQ09TKSBcCisJCXx8IGRlZmluZWQoVk1TKQorCQkJICAgIChjaGFyX3UgKikiQCx+LTI1NSIsCisjZWxzZQorIyBpZmRlZiBFQkNESUMKKwkJCSAgICAvKiBhbGwgY2hhcnMgYWJvdmUgNjMgYXJlIHByaW50YWJsZSAqLworCQkJICAgIChjaGFyX3UgKikiNjMtMjU1IiwKKyMgZWxzZQorCQkJICAgIChjaGFyX3UgKikiQCwxNjEtMjU1IiwKKyMgZW5kaWYKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsiam9pbnNwYWNlcyIsICAianMiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfanMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImtleSIsCSAgICBOVUxMLCAgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRnxQX05PX01LUkMsCisjaWZkZWYgRkVBVF9DUllQVAorCQkJICAgIChjaGFyX3UgKikmcF9rZXksIFBWX0tFWSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJrZXltYXAiLAkgICAgImttcCIsICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9SQlVGfFBfUlNUQVQsCisjaWZkZWYgRkVBVF9LRVlNQVAKKwkJCSAgICAoY2hhcl91ICopJnBfa2V5bWFwLCBQVl9LTUFQLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJfSwKKyAgICB7ImtleW1vZGVsIiwgICAgImttIiwgICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJCSAgICAoY2hhcl91ICopJnBfa20sIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJrZXl3b3JkcHJnIiwgICJrcCIsICAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX2twLCBPUFRfQk9USChQVl9LUCksCisJCQkgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisJCQkgICAgKGNoYXJfdSAqKSI6aGVscCIsCisjZWxzZQorI2lmZGVmIFZNUworCQkJICAgIChjaGFyX3UgKikiaGVscCIsCisjZWxzZQorIyBpZiBkZWZpbmVkKE9TMikKKwkJCSAgICAoY2hhcl91ICopInZpZXcgLyIsCisjIGVsc2UKKyMgIGlmZGVmIFVTRU1BTl9TCisJCQkgICAgKGNoYXJfdSAqKSJtYW4gLXMiLAorIyAgZWxzZQorCQkJICAgIChjaGFyX3UgKikibWFuIiwKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsibGFuZ21hcCIsICAgICAibG1hcCIsIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKwkJCSAgICAoY2hhcl91ICopJnBfbGFuZ21hcCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLAkvKiB1bm1hdGNoZWQgfSAqLworI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsCisjZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9fSwKKyAgICB7ImxhbmdtZW51IiwgICAgImxtIiwgICBQX1NUUklOR3xQX1ZJX0RFRiwKKyNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgJiYgZGVmaW5lZChGRUFUX01VTFRJX0xBTkcpCisJCQkgICAgKGNoYXJfdSAqKSZwX2xtLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsibGFzdHN0YXR1cyIsICAibHMiLCAgIFBfTlVNfFBfVklfREVGfFBfUkFMTCwKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCSAgICAoY2hhcl91ICopJnBfbHMsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikxTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJsYXp5cmVkcmF3IiwgICJseiIsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9seiwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImxpbmVicmVhayIsICAgImxiciIsICBQX0JPT0x8UF9WSV9ERUZ8UF9SV0lOLAorI2lmZGVmIEZFQVRfTElORUJSRUFLCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX0xCUiwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7ImxpbmVzIiwJICAgIE5VTEwsICAgUF9OVU18UF9OT0RFRkFVTFR8UF9OT19NS1JDfFBfVklfREVGfFBfUkNMUiwKKwkJCSAgICAoY2hhcl91ICopJlJvd3MsIFBWX05PTkUsCisJCQkgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChPUzIpCisJCQkgICAgKGNoYXJfdSAqKTI1TCwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKTI0TCwKKyNlbmRpZgorCQkJCQkgICAgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJsaW5lc3BhY2UiLCAgICJsc3AiLCAgUF9OVU18UF9WSV9ERUZ8UF9SQ0xSLAorI2lmZGVmIEZFQVRfR1VJCisJCQkgICAgKGNoYXJfdSAqKSZwX2xpbmVzcGFjZSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9XMzIKKwkJCSAgICB7KGNoYXJfdSAqKTFMLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJsaXNwIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfTElTUAorCQkJICAgIChjaGFyX3UgKikmcF9saXNwLCBQVl9MSVNQLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsibGlzcHdvcmRzIiwgICAibHciLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX0xJU1AKKwkJCSAgICAoY2hhcl91ICopJnBfbGlzcHdvcmRzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTElTUFdPUkRfVkFMVUUsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7Imxpc3QiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSV9ERUZ8UF9SV0lOLAorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9MSVNULAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsibGlzdGNoYXJzIiwgICAibGNzIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkFMTHxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX2xjcywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSJlb2w6JCIsIChjaGFyX3UgKikwTH19LAorICAgIHsibG9hZHBsdWdpbnMiLCAibHBsIiwgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfbHBsLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtYWdpYyIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfbWFnaWMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im1ha2VlZiIsCSAgICAibWVmIiwgICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX1NFQ1VSRSwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCQkgICAgKGNoYXJfdSAqKSZwX21lZiwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7Im1ha2VwcmciLAkgICAgIm1wIiwgICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX1NFQ1VSRSwKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJCQkgICAgKGNoYXJfdSAqKSZwX21wLCBPUFRfQk9USChQVl9NUCksCisjIGlmZGVmIFZNUworCQkJICAgIHsoY2hhcl91ICopIk1NUyIsIChjaGFyX3UgKikwTH0KKyMgZWxzZQorCQkJICAgIHsoY2hhcl91ICopIm1ha2UiLCAoY2hhcl91ICopMEx9CisjIGVuZGlmCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7Im1hdGNocGFpcnMiLCAgIm1wcyIsICBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorCQkJICAgIChjaGFyX3UgKikmcF9tcHMsIFBWX01QUywKKwkJCSAgICB7KGNoYXJfdSAqKSIoOiksezp9LFs6XSIsIChjaGFyX3UgKikwTH19LAorICAgIHsibWF0Y2h0aW1lIiwgICAibWF0IiwgIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9tYXQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKik1TCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtYXhmdW5jZGVwdGgiLCAibWZkIiwgUF9OVU18UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9FVkFMCisJCQkgICAgKGNoYXJfdSAqKSZwX21mZCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTEwMEwsIChjaGFyX3UgKikwTH19LAorICAgIHsibWF4bWFwZGVwdGgiLCAibW1kIiwgIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9tbWQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikxMDAwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtYXhtZW0iLAkgICAgIm1tIiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfbW0sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilERkxUX01BWE1FTSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtYXhtZW10b3QiLCAgICJtbXQiLCAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX21tdCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKURGTFRfTUFYTUVNVE9ULCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im1lbnVpdGVtcyIsICAgIm1pcyIsICBQX05VTXxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX01FTlUKKwkJCSAgICAoY2hhcl91ICopJnBfbWlzLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopMjVMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im1lc2ciLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtb2RlbGluZSIsICAgICJtbCIsICAgUF9CT09MfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF9tbCwgUFZfTUwsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKVRSVUV9fSwKKyAgICB7Im1vZGVsaW5lcyIsICAgIm1scyIsICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfbWxzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopNUwsIChjaGFyX3UgKikwTH19LAorICAgIHsibW9kaWZpYWJsZSIsICAibWEiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX05PR0xPQiwKKwkJCSAgICAoY2hhcl91ICopJnBfbWEsIFBWX01BLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtb2RpZmllZCIsICAgICJtb2QiLCAgUF9CT09MfFBfTk9fTUtSQ3xQX1ZJX0RFRnxQX1JTVEFULAorCQkJICAgIChjaGFyX3UgKikmcF9tb2QsIFBWX01PRCwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im1vcmUiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX21vcmUsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKVRSVUV9fSwKKyAgICB7Im1vdXNlIiwJICAgIE5VTEwsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9GTEFHTElTVCwKKwkJCSAgICAoY2hhcl91ICopJnBfbW91c2UsIFBWX05PTkUsCisJCQkgICAgeworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKwkJCQkoY2hhcl91ICopImEiLAorI2Vsc2UKKwkJCQkoY2hhcl91ICopIiIsCisjZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9fSwKKyAgICB7Im1vdXNlZm9jdXMiLCAgICJtb3VzZWYiLCBQX0JPT0x8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9HVUkKKwkJCSAgICAoY2hhcl91ICopJnBfbW91c2VmLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsibW91c2VoaWRlIiwgICAibWgiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX0dVSQorCQkJICAgIChjaGFyX3UgKikmcF9taCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKVRSVUUsIChjaGFyX3UgKikwTH19LAorICAgIHsibW91c2Vtb2RlbCIsICAibW91c2VtIiwgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX21vdXNlbSwgUFZfTk9ORSwKKwkJCSAgICB7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKwkJCQkoY2hhcl91ICopInBvcHVwIiwKKyNlbHNlCisjIGlmIGRlZmluZWQoTUFDT1MpCisJCQkJKGNoYXJfdSAqKSJwb3B1cF9zZXRwb3MiLAorIyBlbHNlCisJCQkJKGNoYXJfdSAqKSJleHRlbmQiLAorIyBlbmRpZgorI2VuZGlmCisJCQkJKGNoYXJfdSAqKTBMfX0sCisgICAgeyJtb3VzZXNoYXBlIiwgICJtb3VzZXMiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfTU9VU0VTSEFQRQorCQkJICAgIChjaGFyX3UgKikmcF9tb3VzZXNoYXBlLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopImktcjpiZWFtLHM6dXBkb3duLHNkOnVkc2l6aW5nLHZzOmxlZnRyaWdodCx2ZDpscnNpemluZyxtOm5vLG1sOnVwLWFycm93LHY6cmlnaHR1cC1hcnJvdyIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsibW91c2V0aW1lIiwgICAibW91c2V0IiwJUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX21vdXNldCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTUwMEwsIChjaGFyX3UgKikwTH19LAorICAgIHsibm92aWNlIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsibnJmb3JtYXRzIiwgICAibmYiLCAgIFBfU1RSSU5HfFBfQUxMT0NFRHxQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX25mLCBQVl9ORiwKKwkJCSAgICB7KGNoYXJfdSAqKSJvY3RhbCxoZXgiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im51bWJlciIsCSAgICAibnUiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1JXSU4sCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX05VLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsib3BlbiIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Im9wdGltaXplIiwgICAgIm9wdCIsICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJvc2ZpbGV0eXBlIiwgICJvZnQiLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGLAorI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorCQkJICAgIChjaGFyX3UgKikmcF9vZnQsIFBWX09GVCwKKwkJCSAgICB7KGNoYXJfdSAqKURGTFRfT0ZULCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJwYXJhZ3JhcGhzIiwgICJwYXJhIiwgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3BhcmEsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiSVBMUFBQUVBQIExJcHBscGlwYnAiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InBhc3RlIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9wYXN0ZSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InBhc3RldG9nZ2xlIiwgInB0IiwgICBQX1NUUklOR3xQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfcHQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJwYXRjaGV4cHIiLCAgICJwZXgiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9TRUNVUkUsCisjaWYgZGVmaW5lZChGRUFUX0RJRkYpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCQkJICAgIChjaGFyX3UgKikmcF9wZXgsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsicGF0Y2htb2RlIiwgICAicG0iLCAgIFBfU1RSSU5HfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF9wbSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InBhdGgiLAkgICAgInBhIiwgICBQX1NUUklOR3xQX0VYUEFORHxQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX3BhdGgsIE9QVF9CT1RIKFBWX1BBVEgpLAorCQkJICAgIHsKKyNpZiBkZWZpbmVkIEFNSUdBIHx8IGRlZmluZWQgTVNET1MgfHwgZGVmaW5lZCBNU1dJTgorCQkJICAgIChjaGFyX3UgKikiLiwsIiwKKyNlbHNlCisjIGlmIGRlZmluZWQoX19FTVhfXykKKwkJCSAgICAoY2hhcl91ICopIi4sL2VteC9pbmNsdWRlLCwiLAorIyBlbHNlIC8qIFVuaXgsIHByb2JhYmx5ICovCisJCQkgICAgKGNoYXJfdSAqKSIuLC91c3IvaW5jbHVkZSwsIiwKKyMgZW5kaWYKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsicHJlc2VydmVpbmRlbnQiLCAicGkiLCBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3BpLCBQVl9QSSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InByZXZpZXdoZWlnaHQiLCAicHZoIixQX05VTXxQX1ZJX0RFRiwKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQkJICAgIChjaGFyX3UgKikmcF9wdmgsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikxMkwsIChjaGFyX3UgKikwTH19LAorICAgIHsicHJldmlld3dpbmRvdyIsICJwdnciLCBQX0JPT0x8UF9WSV9ERUZ8UF9SU1RBVHxQX05PR0xPQiwKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9QVlcsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJwcmludGRldmljZSIsICJwZGV2IiwgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9QUklOVEVSCisJCQkgICAgKGNoYXJfdSAqKSZwX3BkZXYsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJwcmludGVuY29kaW5nIiwgInBlbmMiLCBQX1NUUklOR3xQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1BPU1RTQ1JJUFQKKwkJCSAgICAoY2hhcl91ICopJnBfcGVuYywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InByaW50ZXhwciIsICJwZXhwciIsICBQX1NUUklOR3xQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1BPU1RTQ1JJUFQKKwkJCSAgICAoY2hhcl91ICopJnBfcGV4cHIsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJwcmludGZvbnQiLCAicGZuIiwgICAgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9QUklOVEVSCisJCQkgICAgKGNoYXJfdSAqKSZwX3BmbiwgUFZfTk9ORSwKKwkJCSAgICB7CisjIGlmZGVmIE1TV0lOCisJCQkJKGNoYXJfdSAqKSJDb3VyaWVyX05ldzpoMTAiLAorIyBlbHNlCisJCQkJKGNoYXJfdSAqKSJjb3VyaWVyIiwKKyMgZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InByaW50aGVhZGVyIiwgInBoZWFkZXIiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9HRVRURVhULAorI2lmZGVmIEZFQVRfUFJJTlRFUgorCQkJICAgIChjaGFyX3UgKikmcF9oZWFkZXIsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOXygiJTwlZiVoJW0lPVBhZ2UgJU4iKSwgKGNoYXJfdSAqKTBMfQorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKU5VTEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJwcmludG9wdGlvbnMiLCAicG9wdCIsIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX1BSSU5URVIKKwkJCSAgICAoY2hhcl91ICopJnBfcG9wdCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InByb21wdCIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InJlYWRvbmx5IiwgICAgInJvIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9SU1RBVHxQX05PR0xPQiwKKwkJCSAgICAoY2hhcl91ICopJnBfcm8sIFBWX1JPLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsicmVkcmF3IiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsicmVtYXAiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3JlbWFwLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJyZXBvcnQiLAkgICAgTlVMTCwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfcmVwb3J0LCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMkwsIChjaGFyX3UgKikwTH19LAorICAgIHsicmVzdG9yZXNjcmVlbiIsICJycyIsIFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBXSU4zMjY0CisJCQkgICAgKGNoYXJfdSAqKSZwX3JzLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJyZXZpbnMiLAkgICAgInJpIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJCSAgICAoY2hhcl91ICopJnBfcmksIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJyaWdodGxlZnQiLCAgICJybCIsICAgUF9CT09MfFBfVklfREVGfFBfUldJTiwKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9STCwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InJpZ2h0bGVmdGNtZCIsICJybGMiLCBQX1NUUklOR3xQX0FMTE9DRUR8UF9WSV9ERUZ8UF9SV0lOLAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX1JMQywKKwkJCSAgICB7KGNoYXJfdSAqKSJzZWFyY2giLCAoY2hhcl91ICopTlVMTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilOVUxMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsicnVsZXIiLAkgICAgInJ1IiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU18UF9SU1RBVCwKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCQkJICAgIChjaGFyX3UgKikmcF9ydSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InJ1bGVyZm9ybWF0IiwgInJ1ZiIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0FMTE9DRUR8UF9SU1RBVCwKKyNpZmRlZiBGRUFUX1NUTF9PUFQKKwkJCSAgICAoY2hhcl91ICopJnBfcnVmLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsicnVudGltZXBhdGgiLCAicnRwIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfRVhQQU5EfFBfQ09NTUF8UF9OT0RVUHxQX1NFQ1VSRSwKKwkJCSAgICAoY2hhcl91ICopJnBfcnRwLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopREZMVF9SVU5USU1FUEFUSCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzY3JvbGwiLAkgICAgInNjciIsICBQX05VTXxQX05PX01LUkN8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKVZBUl9XSU4sIFBWX1NDUk9MTCwKKwkJCSAgICB7KGNoYXJfdSAqKTEyTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzY3JvbGxiaW5kIiwgICJzY2IiLCAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfU0NST0xMQklORAorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9TQ0JJTkQsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzY3JvbGxqdW1wIiwgICJzaiIsICAgUF9OVU18UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3NqLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMUwsIChjaGFyX3UgKikwTH19LAorICAgIHsic2Nyb2xsb2ZmIiwgICAic28iLCAgIFBfTlVNfFBfVklfREVGfFBfVklNfFBfUkFMTCwKKwkJCSAgICAoY2hhcl91ICopJnBfc28sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzY3JvbGxvcHQiLCAgICJzYm8iLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfU0NST0xMQklORAorCQkJICAgIChjaGFyX3UgKikmcF9zYm8sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikidmVyLGp1bXAiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJzZWN0aW9ucyIsICAgICJzZWN0IiwgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3NlY3Rpb25zLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIlNITkhIIEhVbmhzaCIsIChjaGFyX3UgKikwTH19LAorICAgIHsic2VjdXJlIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGfFBfU0VDVVJFLAorCQkJICAgIChjaGFyX3UgKikmcF9zZWN1cmUsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzZWxlY3Rpb24iLCAgICJzZWwiLCAgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJCSAgICAoY2hhcl91ICopJnBfc2VsLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopImluY2x1c2l2ZSIsIChjaGFyX3UgKikwTH19LAorICAgIHsic2VsZWN0bW9kZSIsICAic2xtIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQkJICAgIChjaGFyX3UgKikmcF9zbG0sIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzZXNzaW9ub3B0aW9ucyIsICJzc29wIiwgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfU0VTU0lPTgorCQkJICAgIChjaGFyX3UgKikmcF9zc29wLCBQVl9OT05FLAorCQkgeyhjaGFyX3UgKikiYmxhbmssYnVmZmVycyxjdXJkaXIsZm9sZHMsaGVscCxvcHRpb25zLHdpbnNpemUiLAorCQkJCQkJCSAgICAgICAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJzaGVsbCIsCSAgICAic2giLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfU0VDVVJFLAorCQkJICAgIChjaGFyX3UgKikmcF9zaCwgUFZfTk9ORSwKKwkJCSAgICB7CisjaWZkZWYgVk1TCisJCQkgICAgKGNoYXJfdSAqKSItIiwKKyNlbHNlCisjIGlmIGRlZmluZWQoTVNET1MpCisJCQkgICAgKGNoYXJfdSAqKSJjb21tYW5kIiwKKyMgZWxzZQorIyAgaWYgZGVmaW5lZChXSU4xNikKKwkJCSAgICAoY2hhcl91ICopImNvbW1hbmQuY29tIiwKKyMgIGVsc2UKKyMgICBpZiBkZWZpbmVkKFdJTjMyNjQpCisJCQkgICAgKGNoYXJfdSAqKSIiLAkvKiBzZXQgaW4gc2V0X2luaXRfMSgpICovCisjICAgZWxzZQorIyAgICBpZiBkZWZpbmVkKE9TMikKKwkJCSAgICAoY2hhcl91ICopImNtZC5leGUiLAorIyAgICBlbHNlCisjICAgICBpZiBkZWZpbmVkKEFSQ0hJRSkKKwkJCSAgICAoY2hhcl91ICopImdvcyIsCisjICAgICBlbHNlCisJCQkgICAgKGNoYXJfdSAqKSJzaCIsCisjICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIFZNUyAqLworCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsic2hlbGxjbWRmbGFnIiwic2hjZiIsIFBfU1RSSU5HfFBfVklfREVGfFBfU0VDVVJFLAorCQkJICAgIChjaGFyX3UgKikmcF9zaGNmLCBQVl9OT05FLAorCQkJICAgIHsKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorCQkJICAgIChjaGFyX3UgKikiL2MiLAorI2Vsc2UKKyMgaWYgZGVmaW5lZChPUzIpCisJCQkgICAgKGNoYXJfdSAqKSIvYyIsCisjIGVsc2UKKwkJCSAgICAoY2hhcl91ICopIi1jIiwKKyMgZW5kaWYKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsic2hlbGxwaXBlIiwgICAic3AiLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfU0VDVVJFLAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJCSAgICAoY2hhcl91ICopJnBfc3AsIFBWX05PTkUsCisJCQkgICAgeworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpCisjIGlmZGVmIEFSQ0hJRQorCQkJICAgIChjaGFyX3UgKikiMj4iLAorIyBlbHNlCisJCQkgICAgKGNoYXJfdSAqKSJ8IHRlZSIsCisjIGVuZGlmCisjZWxzZQorCQkJICAgIChjaGFyX3UgKikiPiIsCisjZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorICAgIH0sCisgICAgeyJzaGVsbHF1b3RlIiwgICJzaHEiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX3NocSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNoZWxscmVkaXIiLCAgInNyciIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1NFQ1VSRSwKKwkJCSAgICAoY2hhcl91ICopJnBfc3JyLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIj4iLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNoZWxsc2xhc2giLCAgInNzbCIsICAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorCQkJICAgIChjaGFyX3UgKikmcF9zc2wsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzaGVsbHR5cGUiLCAgICJzdCIsICAgUF9OVU18UF9WSV9ERUYsCisjaWZkZWYgQU1JR0EKKwkJCSAgICAoY2hhcl91ICopJnBfc3QsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzaGVsbHhxdW90ZSIsICJzeHEiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9TRUNVUkUsCisJCQkgICAgKGNoYXJfdSAqKSZwX3N4cSwgUFZfTk9ORSwKKwkJCSAgICB7CisjaWYgZGVmaW5lZChVTklYKSAmJiBkZWZpbmVkKFVTRV9TWVNURU0pICYmICFkZWZpbmVkKF9fRU1YX18pCisJCQkgICAgKGNoYXJfdSAqKSJcIiIsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKikiIiwKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsic2hpZnRyb3VuZCIsICAic3IiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfc3IsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzaGlmdHdpZHRoIiwgICJzdyIsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3N3LCBQVl9TVywKKwkJCSAgICB7KGNoYXJfdSAqKThMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNob3J0bWVzcyIsICAgInNobSIsICBQX1NUUklOR3xQX1ZJTXxQX0ZMQUdMSVNULAorCQkJICAgIChjaGFyX3UgKikmcF9zaG0sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSJmaWxueHRUb08ifX0sCisgICAgeyJzaG9ydG5hbWUiLCAgICJzbiIsICAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIFNIT1JUX0ZOQU1FCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKikmcF9zbiwgUFZfU04sCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNob3dicmVhayIsICAgInNiciIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JBTEwsCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkJCSAgICAoY2hhcl91ICopJnBfc2JyLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsic2hvd2NtZCIsCSAgICAic2MiLCAgIFBfQk9PTHxQX1ZJTSwKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworCQkJICAgIChjaGFyX3UgKikmcF9zYywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLAorI2lmZGVmIFVOSVgKKwkJCQkoY2hhcl91ICopRkFMU0UKKyNlbHNlCisJCQkJKGNoYXJfdSAqKVRSVUUKKyNlbmRpZgorCQkJCX19LAorICAgIHsic2hvd2Z1bGx0YWciLCAic2Z0IiwgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfc2Z0LCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsic2hvd21hdGNoIiwgICAic20iLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfc20sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzaG93bW9kZSIsICAgICJzbWQiLCAgUF9CT09MfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF9zbWQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKVRSVUV9fSwKKyAgICB7InNpZGVzY3JvbGwiLCAgInNzIiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfc3MsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzaWRlc2Nyb2xsb2ZmIiwgInNpc28iLCBQX05VTXxQX1ZJX0RFRnxQX1ZJTXxQX1JCVUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3Npc28sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzbG93b3BlbiIsICAgICJzbG93IiwgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsic21hcnRjYXNlIiwgICAic2NzIiwgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfc2NzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsic21hcnRpbmRlbnQiLCAic2kiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCisJCQkgICAgKGNoYXJfdSAqKSZwX3NpLCBQVl9TSSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNtYXJ0dGFiIiwgICAgInN0YSIsICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3N0YSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InNvZnR0YWJzdG9wIiwgInN0cyIsICBQX05VTXxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfc3RzLCBQVl9TVFMsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzb3VyY2VhbnkiLCAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsic3BsaXRiZWxvdyIsICAic2IiLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCSAgICAoY2hhcl91ICopJnBfc2IsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzcGxpdHJpZ2h0IiwgICJzcHIiLCAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCQkgICAgKGNoYXJfdSAqKSZwX3NwciwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InN0YXJ0b2ZsaW5lIiwgInNvbCIsICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3NvbCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKVRSVUUsIChjaGFyX3UgKikwTH19LAorICAgIHsic3RhdHVzbGluZSIgICwic3RsIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQUxMT0NFRHxQX1JTVEFULAorI2lmZGVmIEZFQVRfU1RMX09QVAorCQkJICAgIChjaGFyX3UgKikmcF9zdGwsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzdWZmaXhlcyIsICAgICJzdSIsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorCQkJICAgIChjaGFyX3UgKikmcF9zdSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSIuYmFrLH4sLm8sLmgsLmluZm8sLnN3cCwub2JqIiwKKwkJCQkoY2hhcl91ICopMEx9fSwKKyAgICB7InN1ZmZpeGVzYWRkIiwgInN1YSIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0FMTE9DRUR8UF9DT01NQXxQX05PRFVQLAorI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKQorCQkJICAgIChjaGFyX3UgKikmcF9zdWEsIFBWX1NVQSwKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJzd2FwZmlsZSIsICAgICJzd2YiLCAgUF9CT09MfFBfVklfREVGfFBfUlNUQVQsCisJCQkgICAgKGNoYXJfdSAqKSZwX3N3ZiwgUFZfU1dGLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJzd2Fwc3luYyIsICAgICJzd3MiLCAgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3N3cywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSJmc3luYyIsIChjaGFyX3UgKikwTH19LAorICAgIHsic3dpdGNoYnVmIiwgICAic3diIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfc3diLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH19LAorICAgIHsic3ludGF4IiwJICAgICJzeW4iLCAgUF9TVFJJTkd8UF9BTExPQ0VEfFBfVklfREVGfFBfTk9HTE9CLAorI2lmZGVmIEZFQVRfU1lOX0hMCisJCQkgICAgKGNoYXJfdSAqKSZwX3N5biwgUFZfU1lOLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InRhYnN0b3AiLAkgICAgInRzIiwgICBQX05VTXxQX1ZJX0RFRnxQX1JCVUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3RzLCBQVl9UUywKKwkJCSAgICB7KGNoYXJfdSAqKThMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InRhZ2JzZWFyY2giLCAgInRicyIsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF90YnMsIFBWX05PTkUsCisjaWZkZWYgVk1TCS8qIGJpbmFyeSBzZWFyY2hpbmcgZG9lc24ndCBhcHBlYXIgdG8gd29yayBvbiBWTVMgKi8KKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InRhZ2xlbmd0aCIsICAgInRsIiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfdGwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0YWdyZWxhdGl2ZSIsICJ0ciIsICAgUF9CT09MfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF90ciwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopVFJVRX19LAorICAgIHsidGFncyIsCSAgICAidGFnIiwgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfdGFncywgT1BUX0JPVEgoUFZfVEFHUyksCisJCQkgICAgeworI2lmIGRlZmluZWQoRkVBVF9FTUFDU19UQUdTKSAmJiAhZGVmaW5lZChDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FKQorCQkJICAgIChjaGFyX3UgKikiLi90YWdzLC4vVEFHUyx0YWdzLFRBR1MiLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopIi4vdGFncyx0YWdzIiwKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsidGFnc3RhY2siLCAgICAidGdzdCIsIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfdGdzdCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKVRSVUUsIChjaGFyX3UgKikwTH19LAorICAgIHsidGVybSIsCSAgICBOVUxMLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfTk9ERUZBVUxUfFBfTk9fTUtSQ3xQX1ZJX0RFRnxQX1JBTEwsCisJCQkgICAgKGNoYXJfdSAqKSZUX05BTUUsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0ZXJtYmlkaSIsICJ0YmlkaSIsICAgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfQVJBQklDCisJCQkgICAgKGNoYXJfdSAqKSZwX3RiaWRpLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsidGVybWVuY29kaW5nIiwgInRlbmMiLCBQX1NUUklOR3xQX1ZJX0RFRnxQX1JDTFIsCisjaWZkZWYgRkVBVF9NQllURQorCQkJICAgIChjaGFyX3UgKikmcF90ZW5jLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InRlcnNlIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF90ZXJzZSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InRleHRhdXRvIiwgICAgInRhIiwgICBQX0JPT0x8UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3RhLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopREZMVF9URVhUQVVUTywgKGNoYXJfdSAqKVRSVUV9fSwKKyAgICB7InRleHRtb2RlIiwgICAgInR4IiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9OT19NS1JDLAorCQkJICAgIChjaGFyX3UgKikmcF90eCwgUFZfVFgsCisJCQkgICAgeworI2lmZGVmIFVTRV9DUk5MCisJCQkgICAgKGNoYXJfdSAqKVRSVUUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilGQUxTRSwKKyNlbmRpZgorCQkJCShjaGFyX3UgKikwTH19LAorICAgIHsidGV4dHdpZHRoIiwgICAidHciLCAgIFBfTlVNfFBfVklfREVGfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF90dywgUFZfVFcsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0aGVzYXVydXMiLCAgICJ0c3IiLCAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkJICAgIChjaGFyX3UgKikmcF90c3IsIE9QVF9CT1RIKFBWX1RTUiksCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0aWxkZW9wIiwJICAgICJ0b3AiLCAgUF9CT09MfFBfVklfREVGfFBfVklNLAorCQkJICAgIChjaGFyX3UgKikmcF90bywgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InRpbWVvdXQiLAkgICAgInRvIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3RpbWVvdXQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InRpbWVvdXRsZW4iLCAgInRtIiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfdG0sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikxMDAwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0aXRsZSIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1RJVExFCisJCQkgICAgKGNoYXJfdSAqKSZwX3RpdGxlLCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsidGl0bGVsZW4iLCAgICBOVUxMLCAgIFBfTlVNfFBfVklfREVGLAorI2lmZGVmIEZFQVRfVElUTEUKKwkJCSAgICAoY2hhcl91ICopJnBfdGl0bGVsZW4sIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKik4NUwsIChjaGFyX3UgKikwTH19LAorICAgIHsidGl0bGVvbGQiLCAgICBOVUxMLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfR0VUVEVYVCwKKyNpZmRlZiBGRUFUX1RJVExFCisJCQkgICAgKGNoYXJfdSAqKSZwX3RpdGxlb2xkLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTl8oIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIpLAorCQkJCQkJCSAgICAgICAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH0KKyNlbmRpZgorCQkJICAgIH0sCisgICAgeyJ0aXRsZXN0cmluZyIsIE5VTEwsICAgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9USVRMRQorCQkJICAgIChjaGFyX3UgKikmcF90aXRsZXN0cmluZywgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopMEx9fSwKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQorICAgIHsidG9vbGJhciIsICAgICAidGIiLCAgIFBfU1RSSU5HfFBfQ09NTUF8UF9WSV9ERUZ8UF9OT0RVUCwKKwkJCSAgICAoY2hhcl91ICopJnBfdG9vbGJhciwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSJpY29ucyx0b29sdGlwcyIsIChjaGFyX3UgKikwTH19LAorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICB7InRvb2xiYXJpY29uc2l6ZSIsCSJ0YmlzIiwgUF9TVFJJTkd8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3RiaXMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikic21hbGwiLCAoY2hhcl91ICopMEx9fSwKKyNlbmRpZgorICAgIHsidHRpbWVvdXQiLCAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfdHRpbWVvdXQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0dGltZW91dGxlbiIsICJ0dG0iLCAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3R0bSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKS0xTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0dHlidWlsdGluIiwgICJ0YmkiLCAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF90YmksIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InR0eWZhc3QiLAkgICAgInRmIiwgICBQX0JPT0x8UF9OT19NS1JDfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF90ZiwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InR0eW1vdXNlIiwgICAgInR0eW0iLCBQX1NUUklOR3xQX05PREVGQVVMVHxQX05PX01LUkN8UF9WSV9ERUYsCisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpCisJCQkgICAgKGNoYXJfdSAqKSZwX3R0eW0sIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ0dHlzY3JvbGwiLCAgICJ0c2wiLCAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3R0eXNjcm9sbCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTk5OUwsIChjaGFyX3UgKikwTH19LAorICAgIHsidHR5dHlwZSIsCSAgICAidHR5IiwgIFBfU1RSSU5HfFBfRVhQQU5EfFBfTk9ERUZBVUxUfFBfTk9fTUtSQ3xQX1ZJX0RFRnxQX1JBTEwsCisJCQkgICAgKGNoYXJfdSAqKSZUX05BTUUsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ1bmRvbGV2ZWxzIiwgICJ1bCIsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3VsLCBQVl9OT05FLAorCQkJICAgIHsKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKQorCQkJICAgIChjaGFyX3UgKikxMDAwTCwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKTEwMEwsCisjZW5kaWYKKwkJCQkoY2hhcl91ICopMEx9fSwKKyAgICB7InVwZGF0ZWNvdW50IiwgInVjIiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfdWMsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikyMDBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7InVwZGF0ZXRpbWUiLCAgInV0IiwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfdXQsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKik0MDAwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ2ZXJib3NlIiwJICAgICJ2YnMiLCAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZlcmJvc2UsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ2aWV3ZGlyIiwgICAgICJ2ZGlyIiwgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9TRUNVUkUsCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZkaXIsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilERkxUX1ZESVIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InZpZXdvcHRpb25zIiwgInZvcCIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZvcCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSJmb2xkcyxvcHRpb25zLGN1cnNvciIsIChjaGFyX3UgKikwTH0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InZpbWluZm8iLAkgICAgInZpIiwgICBQX1NUUklOR3xQX0NPTU1BfFBfTk9EVVB8UF9TRUNVUkUsCisjaWZkZWYgRkVBVF9WSU1JTkZPCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZpbWluZm8sIFBWX05PTkUsCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSInMjAsPDUwLHMxMCxoLHJBOixyQjoifQorI2Vsc2UKKyMgaWZkZWYgQU1JR0EKKwkJCSAgICB7KGNoYXJfdSAqKSIiLAorCQkJCSAoY2hhcl91ICopIicyMCw8NTAsczEwLGgscmRmMDoscmRmMToscmRmMjoifQorIyBlbHNlCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSInMjAsPDUwLHMxMCxoIn0KKyMgZW5kaWYKKyNlbmRpZgorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9CisjZW5kaWYKKwkJCSAgICB9LAorICAgIHsidmlydHVhbGVkaXQiLCAidmUiLCAgIFBfU1RSSU5HfFBfQ09NTUF8UF9OT0RVUHxQX1ZJX0RFRnxQX1ZJTSwKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZlLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikiIn0KKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7InZpc3VhbGJlbGwiLCAgInZiIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3ZiLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsidzMwMCIsCSAgICBOVUxMLCAgIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH19LAorICAgIHsidzEyMDAiLAkgICAgTlVMTCwgICBQX05VTXxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7Inc5NjAwIiwJICAgIE5VTEwsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3YXJuIiwJICAgIE5VTEwsICAgUF9CT09MfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF93YXJuLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3ZWlyZGludmVydCIsICJ3aXYiLCAgUF9CT09MfFBfVklfREVGfFBfUkNMUiwKKwkJCSAgICAoY2hhcl91ICopJnBfd2l2LCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsid2hpY2h3cmFwIiwgICAid3ciLCAgIFBfU1RSSU5HfFBfVklNfFBfQ09NTUF8UF9GTEFHTElTVCwKKwkJCSAgICAoY2hhcl91ICopJnBfd3csIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSJiLHMifX0sCisgICAgeyJ3aWxkY2hhciIsICAgICJ3YyIsICAgUF9OVU18UF9WSU0sCisJCQkgICAgKGNoYXJfdSAqKSZwX3djLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopKGxvbmcpQ3RybF9FLCAoY2hhcl91ICopKGxvbmcpVEFCfX0sCisgICAgeyJ3aWxkY2hhcm0iLCAgICJ3Y20iLCAgIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKikmcF93Y20sIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKikwTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3aWxkaWdub3JlIiwgICJ3aWciLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAorI2lmZGVmIEZFQVRfV0lMRElHTgorCQkJICAgIChjaGFyX3UgKikmcF93aWcsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3aWxkbWVudSIsICAgICJ3bW51IiwgUF9CT09MfFBfVklfREVGLAorI2lmZGVmIEZFQVRfV0lMRE1FTlUKKwkJCSAgICAoY2hhcl91ICopJnBfd21udSwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7IndpbGRtb2RlIiwgICAgIndpbSIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX0NPTU1BfFBfTk9EVVAsCisJCQkgICAgKGNoYXJfdSAqKSZwX3dpbSwgUFZfTk9ORSwKKwkJCSAgICB7KGNoYXJfdSAqKSJmdWxsIiwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3aW5hbHRrZXlzIiwgICJ3YWsiLCAgUF9TVFJJTkd8UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9XQUsKKwkJCSAgICAoY2hhcl91ICopJnBfd2FrLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopIm1lbnUiLCAoY2hhcl91ICopMEx9CisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopTlVMTCwgKGNoYXJfdSAqKTBMfQorI2VuZGlmCisJCQkgICAgfSwKKyAgICB7IndpbmRvdyIsCSAgICAid2kiLCAgIFBfTlVNfFBfVklfREVGLAorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH19LAorICAgIHsid2luaGVpZ2h0IiwgICAid2giLCAgIFBfTlVNfFBfVklfREVGLAorI2lmZGVmIEZFQVRfV0lORE9XUworCQkJICAgIChjaGFyX3UgKikmcF93aCwgUFZfTk9ORSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCisjZW5kaWYKKwkJCSAgICB7KGNoYXJfdSAqKTFMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7IndpbmZpeGhlaWdodCIsICJ3ZmgiLCBQX0JPT0x8UF9WSV9ERUZ8UF9SU1RBVCwKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykKKwkJCSAgICAoY2hhcl91ICopVkFSX1dJTiwgUFZfV0ZILAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsid2lubWluaGVpZ2h0IiwgIndtaCIsIFBfTlVNfFBfVklfREVGLAorI2lmZGVmIEZFQVRfV0lORE9XUworCQkJICAgIChjaGFyX3UgKikmcF93bWgsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikxTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3aW5taW53aWR0aCIsICJ3bXciLCBQX05VTXxQX1ZJX0RFRiwKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCQkJICAgIChjaGFyX3UgKikmcF93bXcsIFBWX05PTkUsCisjZWxzZQorCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAorI2VuZGlmCisJCQkgICAgeyhjaGFyX3UgKikxTCwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3aW53aWR0aCIsICAgIndpdyIsICAgUF9OVU18UF9WSV9ERUYsCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJCSAgICAoY2hhcl91ICopJnBfd2l3LCBQVl9OT05FLAorI2Vsc2UKKwkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKKyNlbmRpZgorCQkJICAgIHsoY2hhcl91ICopMjBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7IndyYXAiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9WSV9ERUZ8UF9SV0lOLAorCQkJICAgIChjaGFyX3UgKilWQVJfV0lOLCBQVl9XUkFQLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3cmFwbWFyZ2luIiwgICJ3bSIsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3dtLCBQVl9XTSwKKwkJCSAgICB7KGNoYXJfdSAqKTBMLCAoY2hhcl91ICopMEx9fSwKKyAgICB7IndyYXBzY2FuIiwgICAgIndzIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3dzLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3cml0ZSIsCSAgICBOVUxMLCAgIFBfQk9PTHxQX1ZJX0RFRiwKKwkJCSAgICAoY2hhcl91ICopJnBfd3JpdGUsIFBWX05PTkUsCisJCQkgICAgeyhjaGFyX3UgKilUUlVFLCAoY2hhcl91ICopMEx9fSwKKyAgICB7IndyaXRlYW55IiwgICAgIndhIiwgICBQX0JPT0x8UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3dhLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH19LAorICAgIHsid3JpdGViYWNrdXAiLCAid2IiLCAgIFBfQk9PTHxQX1ZJX0RFRnxQX1ZJTSwKKwkJCSAgICAoY2hhcl91ICopJnBfd2IsIFBWX05PTkUsCisJCQkgICAgeworI2lmZGVmIEZFQVRfV1JJVEVCQUNLVVAKKwkJCSAgICAoY2hhcl91ICopVFJVRSwKKyNlbHNlCisJCQkgICAgKGNoYXJfdSAqKUZBTFNFLAorI2VuZGlmCisJCQkJKGNoYXJfdSAqKTBMfX0sCisgICAgeyJ3cml0ZWRlbGF5IiwgICJ3ZCIsICAgUF9OVU18UF9WSV9ERUYsCisJCQkgICAgKGNoYXJfdSAqKSZwX3dkLCBQVl9OT05FLAorCQkJICAgIHsoY2hhcl91ICopMEwsIChjaGFyX3UgKikwTH19LAorCisvKiB0ZXJtaW5hbCBvdXRwdXQgY29kZXMgKi8KKyNkZWZpbmUgcF90ZXJtKHNzcywgdnZ2KSAgIHtzc3MsIE5VTEwsIFBfU1RSSU5HfFBfVklfREVGfFBfUkFMTCwgXAorCQkJICAgIChjaGFyX3UgKikmdnZ2LCBQVl9OT05FLCBcCisJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKTBMfX0sCisKKyAgICBwX3Rlcm0oInRfQUIiLCBUX0NBQikKKyAgICBwX3Rlcm0oInRfQUYiLCBUX0NBRikKKyAgICBwX3Rlcm0oInRfQUwiLCBUX0NBTCkKKyAgICBwX3Rlcm0oInRfYWwiLCBUX0FMKQorICAgIHBfdGVybSgidF9iYyIsIFRfQkMpCisgICAgcF90ZXJtKCJ0X2NkIiwgVF9DRCkKKyAgICBwX3Rlcm0oInRfY2UiLCBUX0NFKQorICAgIHBfdGVybSgidF9jbCIsIFRfQ0wpCisgICAgcF90ZXJtKCJ0X2NtIiwgVF9DTSkKKyAgICBwX3Rlcm0oInRfQ28iLCBUX0NDTykKKyAgICBwX3Rlcm0oInRfQ1MiLCBUX0NDUykKKyAgICBwX3Rlcm0oInRfY3MiLCBUX0NTKQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgcF90ZXJtKCJ0X0NWIiwgVF9DU1YpCisjZW5kaWYKKyAgICBwX3Rlcm0oInRfdXQiLCBUX1VUKQorICAgIHBfdGVybSgidF9kYSIsIFRfREEpCisgICAgcF90ZXJtKCJ0X2RiIiwgVF9EQikKKyAgICBwX3Rlcm0oInRfREwiLCBUX0NETCkKKyAgICBwX3Rlcm0oInRfZGwiLCBUX0RMKQorICAgIHBfdGVybSgidF9mcyIsIFRfRlMpCisgICAgcF90ZXJtKCJ0X0lFIiwgVF9DSUUpCisgICAgcF90ZXJtKCJ0X0lTIiwgVF9DSVMpCisgICAgcF90ZXJtKCJ0X2tlIiwgVF9LRSkKKyAgICBwX3Rlcm0oInRfa3MiLCBUX0tTKQorICAgIHBfdGVybSgidF9sZSIsIFRfTEUpCisgICAgcF90ZXJtKCJ0X21iIiwgVF9NQikKKyAgICBwX3Rlcm0oInRfbWQiLCBUX01EKQorICAgIHBfdGVybSgidF9tZSIsIFRfTUUpCisgICAgcF90ZXJtKCJ0X21yIiwgVF9NUikKKyAgICBwX3Rlcm0oInRfbXMiLCBUX01TKQorICAgIHBfdGVybSgidF9uZCIsIFRfTkQpCisgICAgcF90ZXJtKCJ0X29wIiwgVF9PUCkKKyAgICBwX3Rlcm0oInRfUkkiLCBUX0NSSSkKKyAgICBwX3Rlcm0oInRfUlYiLCBUX0NSVikKKyAgICBwX3Rlcm0oInRfU2IiLCBUX0NTQikKKyAgICBwX3Rlcm0oInRfU2YiLCBUX0NTRikKKyAgICBwX3Rlcm0oInRfc2UiLCBUX1NFKQorICAgIHBfdGVybSgidF9zbyIsIFRfU08pCisgICAgcF90ZXJtKCJ0X3NyIiwgVF9TUikKKyAgICBwX3Rlcm0oInRfdHMiLCBUX1RTKQorICAgIHBfdGVybSgidF90ZSIsIFRfVEUpCisgICAgcF90ZXJtKCJ0X3RpIiwgVF9USSkKKyAgICBwX3Rlcm0oInRfdWUiLCBUX1VFKQorICAgIHBfdGVybSgidF91cyIsIFRfVVMpCisgICAgcF90ZXJtKCJ0X3ZiIiwgVF9WQikKKyAgICBwX3Rlcm0oInRfdmUiLCBUX1ZFKQorICAgIHBfdGVybSgidF92aSIsIFRfVkkpCisgICAgcF90ZXJtKCJ0X3ZzIiwgVF9WUykKKyAgICBwX3Rlcm0oInRfV1AiLCBUX0NXUCkKKyAgICBwX3Rlcm0oInRfV1MiLCBUX0NXUykKKyAgICBwX3Rlcm0oInRfeHMiLCBUX1hTKQorICAgIHBfdGVybSgidF9aSCIsIFRfQ1pIKQorICAgIHBfdGVybSgidF9aUiIsIFRfQ1pSKQorCisvKiB0ZXJtaW5hbCBrZXkgY29kZXMgYXJlIG5vdCBpbiBoZXJlICovCisKKyAgICB7TlVMTCwgTlVMTCwgMCwgTlVMTCwgUFZfTk9ORSwge05VTEwsIE5VTEx9fQkvKiBlbmQgbWFya2VyICovCit9OworCisjZGVmaW5lIFBBUkFNX0NPVU5UIChzaXplb2Yob3B0aW9ucykgLyBzaXplb2Yoc3RydWN0IHZpbW9wdGlvbikpCisKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgY2hhciAqKHBfYW1id192YWx1ZXNbXSkgPSB7InNpbmdsZSIsICJkb3VibGUiLCBOVUxMfTsKKyNlbmRpZgorc3RhdGljIGNoYXIgKihwX2JnX3ZhbHVlc1tdKSA9IHsibGlnaHQiLCAiZGFyayIsIE5VTEx9Oworc3RhdGljIGNoYXIgKihwX25mX3ZhbHVlc1tdKSA9IHsib2N0YWwiLCAiaGV4IiwgImFscGhhIiwgTlVMTH07CitzdGF0aWMgY2hhciAqKHBfZmZfdmFsdWVzW10pID0ge0ZGX1VOSVgsIEZGX0RPUywgRkZfTUFDLCBOVUxMfTsKKyNpZmRlZiBGRUFUX1dBSworc3RhdGljIGNoYXIgKihwX3dha192YWx1ZXNbXSkgPSB7InllcyIsICJtZW51IiwgIm5vIiwgTlVMTH07CisjZW5kaWYKK3N0YXRpYyBjaGFyICoocF9tb3VzZW1fdmFsdWVzW10pID0geyJleHRlbmQiLCAicG9wdXAiLCAicG9wdXBfc2V0cG9zIiwgIm1hYyIsIE5VTEx9OworI2lmZGVmIEZFQVRfVklTVUFMCitzdGF0aWMgY2hhciAqKHBfc2VsX3ZhbHVlc1tdKSA9IHsiaW5jbHVzaXZlIiwgImV4Y2x1c2l2ZSIsICJvbGQiLCBOVUxMfTsKK3N0YXRpYyBjaGFyICoocF9zbG1fdmFsdWVzW10pID0geyJtb3VzZSIsICJrZXkiLCAiY21kIiwgTlVMTH07CisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZJU1VBTAorc3RhdGljIGNoYXIgKihwX2ttX3ZhbHVlc1tdKSA9IHsic3RhcnRzZWwiLCAic3RvcHNlbCIsIE5VTEx9OworI2VuZGlmCisjaWZkZWYgRkVBVF9CUk9XU0UKK3N0YXRpYyBjaGFyICoocF9ic2Rpcl92YWx1ZXNbXSkgPSB7ImN1cnJlbnQiLCAibGFzdCIsICJidWZmZXIiLCBOVUxMfTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0NST0xMQklORAorc3RhdGljIGNoYXIgKihwX3NjYm9wdF92YWx1ZXNbXSkgPSB7InZlciIsICJob3IiLCAianVtcCIsIE5VTEx9OworI2VuZGlmCitzdGF0aWMgY2hhciAqKHBfc3diX3ZhbHVlc1tdKSA9IHsidXNlb3BlbiIsICJzcGxpdCIsIE5VTEx9Oworc3RhdGljIGNoYXIgKihwX2RlYnVnX3ZhbHVlc1tdKSA9IHsibXNnIiwgTlVMTH07CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK3N0YXRpYyBjaGFyICoocF9lYWRfdmFsdWVzW10pID0geyJib3RoIiwgInZlciIsICJob3IiLCBOVUxMfTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKK3N0YXRpYyBjaGFyICoocF9idWZ0eXBlX3ZhbHVlc1tdKSA9IHsibm9maWxlIiwgIm5vd3JpdGUiLCAicXVpY2tmaXgiLCAiaGVscCIsIE5VTEx9Oworc3RhdGljIGNoYXIgKihwX2J1ZmhpZGRlbl92YWx1ZXNbXSkgPSB7ImhpZGUiLCAidW5sb2FkIiwgImRlbGV0ZSIsICJ3aXBlIiwgTlVMTH07CisjZW5kaWYKK3N0YXRpYyBjaGFyICoocF9ic192YWx1ZXNbXSkgPSB7ImluZGVudCIsICJlb2wiLCAic3RhcnQiLCBOVUxMfTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKK3N0YXRpYyBjaGFyICoocF9mZG1fdmFsdWVzW10pID0geyJtYW51YWwiLCAiZXhwciIsICJtYXJrZXIiLCAiaW5kZW50IiwgInN5bnRheCIsCisjaWZkZWYgRkVBVF9ESUZGCisJCQkJImRpZmYiLAorI2VuZGlmCisJCQkJTlVMTH07CitzdGF0aWMgY2hhciAqKHBfZmNsX3ZhbHVlc1tdKSA9IHsiYWxsIiwgTlVMTH07CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0X29wdGlvbl9kZWZhdWx0IF9fQVJHUygoaW50LCBpbnQgb3B0X2ZsYWdzLCBpbnQgY29tcGF0aWJsZSkpOworc3RhdGljIHZvaWQgc2V0X29wdGlvbnNfZGVmYXVsdCBfX0FSR1MoKGludCBvcHRfZmxhZ3MpKTsKK3N0YXRpYyBjaGFyX3UgKmlsbGVnYWxfY2hhciBfX0FSR1MoKGNoYXJfdSAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgc3RyaW5nX3RvX2tleSBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CisjaWZkZWYgRkVBVF9DTURXSU4KK3N0YXRpYyBjaGFyX3UgKmNoZWNrX2NlZGl0IF9fQVJHUygodm9pZCkpOworI2VuZGlmCisjaWZkZWYgRkVBVF9USVRMRQorc3RhdGljIHZvaWQgZGlkX3NldF90aXRsZSBfX0FSR1MoKGludCBpY29uKSk7CisjZW5kaWYKK3N0YXRpYyBjaGFyX3UgKm9wdGlvbl9leHBhbmQgX19BUkdTKChpbnQgb3B0X2lkeCwgY2hhcl91ICp2YWwpKTsKK3N0YXRpYyB2b2lkIGRpZHNldF9vcHRpb25zIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgY2hlY2tfc3RyaW5nX29wdGlvbiBfX0FSR1MoKGNoYXJfdSAqKnBwKSk7CitzdGF0aWMgdm9pZCBzZXRfc3RyaW5nX29wdGlvbl9nbG9iYWwgX19BUkdTKChpbnQgb3B0X2lkeCwgY2hhcl91ICoqdmFycCkpOworc3RhdGljIHZvaWQgc2V0X3N0cmluZ19vcHRpb24gX19BUkdTKChpbnQgb3B0X2lkeCwgY2hhcl91ICp2YWx1ZSwgaW50IG9wdF9mbGFncykpOworc3RhdGljIGNoYXJfdSAqZGlkX3NldF9zdHJpbmdfb3B0aW9uIF9fQVJHUygoaW50IG9wdF9pZHgsIGNoYXJfdSAqKnZhcnAsIGludCBuZXdfdmFsdWVfYWxsb2NlZCwgY2hhcl91ICpvbGR2YWwsIGNoYXJfdSAqZXJyYnVmLCBpbnQgb3B0X2ZsYWdzKSk7CitzdGF0aWMgY2hhcl91ICpzZXRfY2hhcnNfb3B0aW9uIF9fQVJHUygoY2hhcl91ICoqdmFycCkpOworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECitzdGF0aWMgY2hhcl91ICpjaGVja19jbGlwYm9hcmRfb3B0aW9uIF9fQVJHUygodm9pZCkpOworI2VuZGlmCitzdGF0aWMgY2hhcl91ICpzZXRfYm9vbF9vcHRpb24gX19BUkdTKChpbnQgb3B0X2lkeCwgY2hhcl91ICp2YXJwLCBpbnQgdmFsdWUsIGludCBvcHRfZmxhZ3MpKTsKK3N0YXRpYyBjaGFyX3UgKnNldF9udW1fb3B0aW9uIF9fQVJHUygoaW50IG9wdF9pZHgsIGNoYXJfdSAqdmFycCwgbG9uZyB2YWx1ZSwgY2hhcl91ICplcnJidWYsIGludCBvcHRfZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3JlZHJhdyBfX0FSR1MoKGxvbmdfdSBmbGFncykpOworc3RhdGljIGludCBmaW5kb3B0aW9uIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBpbnQgZmluZF9rZXlfb3B0aW9uIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyB2b2lkIHNob3dvcHRpb25zIF9fQVJHUygoaW50IGFsbCwgaW50IG9wdF9mbGFncykpOworc3RhdGljIGludCBvcHR2YWxfZGVmYXVsdCBfX0FSR1MoKHN0cnVjdCB2aW1vcHRpb24gKiwgY2hhcl91ICp2YXJwKSk7CitzdGF0aWMgdm9pZCBzaG93b25lb3B0IF9fQVJHUygoc3RydWN0IHZpbW9wdGlvbiAqLCBpbnQgb3B0X2ZsYWdzKSk7CitzdGF0aWMgaW50IHB1dF9zZXRzdHJpbmcgX19BUkdTKChGSUxFICpmZCwgY2hhciAqY21kLCBjaGFyICpuYW1lLCBjaGFyX3UgKip2YWx1ZXAsIGludCBleHBhbmQpKTsKK3N0YXRpYyBpbnQgcHV0X3NldG51bSBfX0FSR1MoKEZJTEUgKmZkLCBjaGFyICpjbWQsIGNoYXIgKm5hbWUsIGxvbmcgKnZhbHVlcCkpOworc3RhdGljIGludCBwdXRfc2V0Ym9vbCBfX0FSR1MoKEZJTEUgKmZkLCBjaGFyICpjbWQsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSkpOworc3RhdGljIGludCAgaXN0ZXJtb3B0aW9uIF9fQVJHUygoc3RydWN0IHZpbW9wdGlvbiAqKSk7CitzdGF0aWMgY2hhcl91ICpnZXRfdmFycF9zY29wZSBfX0FSR1MoKHN0cnVjdCB2aW1vcHRpb24gKnAsIGludCBvcHRfZmxhZ3MpKTsKK3N0YXRpYyBjaGFyX3UgKmdldF92YXJwIF9fQVJHUygoc3RydWN0IHZpbW9wdGlvbiAqKSk7CitzdGF0aWMgdm9pZCBvcHRpb25fdmFsdWUyc3RyaW5nIF9fQVJHUygoc3RydWN0IHZpbW9wdGlvbiAqLCBpbnQgb3B0X2ZsYWdzKSk7CitzdGF0aWMgaW50IHdjX3VzZV9rZXluYW1lIF9fQVJHUygoY2hhcl91ICp2YXJwLCBsb25nICp3Y3ApKTsKKyNpZmRlZiBGRUFUX0xBTkdNQVAKK3N0YXRpYyB2b2lkIGxhbmdtYXBfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGxhbmdtYXBfc2V0IF9fQVJHUygodm9pZCkpOworI2VuZGlmCitzdGF0aWMgdm9pZCBwYXN0ZV9vcHRpb25fY2hhbmdlZCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNvbXBhdGlibGVfc2V0IF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfTElORUJSRUFLCitzdGF0aWMgdm9pZCBmaWxsX2JyZWFrYXRfZmxhZ3MgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgb3B0X3N0cmluZ3NfZmxhZ3MgX19BUkdTKChjaGFyX3UgKnZhbCwgY2hhciAqKnZhbHVlcywgdW5zaWduZWQgKmZsYWdwLCBpbnQgbGlzdCkpOworc3RhdGljIGludCBjaGVja19vcHRfc3RyaW5ncyBfX0FSR1MoKGNoYXJfdSAqdmFsLCBjaGFyICoqdmFsdWVzLCBpbnQpKTsKK3N0YXRpYyBpbnQgY2hlY2tfb3B0X3dpbSBfX0FSR1MoKHZvaWQpKTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG9wdGlvbnMsIGZpcnN0IHBhcnQuCisgKgorICogQ2FsbGVkIG9ubHkgb25jZSBmcm9tIG1haW4oKSwganVzdCBhZnRlciBjcmVhdGluZyB0aGUgZmlyc3QgYnVmZmVyLgorICovCisgICAgdm9pZAorc2V0X2luaXRfMSgpCit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJb3B0X2lkeDsKKyAgICBsb25nCW47CisKKyNpZmRlZiBGRUFUX0xBTkdNQVAKKyAgICBsYW5nbWFwX2luaXQoKTsKKyNlbmRpZgorCisgICAgLyogQmUgVmkgY29tcGF0aWJsZSBieSBkZWZhdWx0ICovCisgICAgcF9jcCA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIEZpbmQgZGVmYXVsdCB2YWx1ZSBmb3IgJ3NoZWxsJyBvcHRpb24uCisgICAgICovCisgICAgaWYgKChwID0gbWNoX2dldGVudigoY2hhcl91ICopIlNIRUxMIikpICE9IE5VTEwKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE9TMikKKyMgaWZkZWYgX19FTVhfXworCSAgICB8fCAocCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJFTVhTSEVMTCIpKSAhPSBOVUxMCisjIGVuZGlmCisJICAgIHx8IChwID0gbWNoX2dldGVudigoY2hhcl91ICopIkNPTVNQRUMiKSkgIT0gTlVMTAorIyBpZmRlZiBXSU4zMjY0CisJICAgIHx8IChwID0gZGVmYXVsdF9zaGVsbCgpKSAhPSBOVUxMCisjIGVuZGlmCisjZW5kaWYKKyAgICAgICApCisJc2V0X3N0cmluZ19kZWZhdWx0KCJzaCIsIHApOworCisjaWZkZWYgRkVBVF9XSUxESUdOCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZm9yICdiYWNrdXBza2lwJyB0byBpbmNsdWRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IKKyAgICAgKiB0ZW1wIGZpbGVzLgorICAgICAqLworICAgIHsKKyMgaWZkZWYgVU5JWAorCXN0YXRpYyBjaGFyCSoobmFtZXNbNF0pID0geyIiLCAiVE1QRElSIiwgIlRFTVAiLCAiVE1QIn07CisjIGVsc2UKKwlzdGF0aWMgY2hhcgkqKG5hbWVzWzNdKSA9IHsiVE1QRElSIiwgIlRFTVAiLCAiVE1QIn07CisjIGVuZGlmCisJaW50CWxlbjsKKwlnYXJyYXlfVCBnYTsKKworCWdhX2luaXQyKCZnYSwgMSwgMTAwKTsKKwlmb3IgKG4gPSAwOyBuIDwgKGxvbmcpKHNpemVvZihuYW1lcykgLyBzaXplb2YoY2hhciAqKSk7ICsrbikKKwl7CisjIGlmZGVmIFVOSVgKKwkgICAgaWYgKCpuYW1lc1tuXSA9PSBOVUwpCisJCXAgPSAoY2hhcl91ICopIi90bXAiOworCSAgICBlbHNlCisjIGVuZGlmCisJCXAgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKiluYW1lc1tuXSk7CisJICAgIGlmIChwICE9IE5VTEwgJiYgKnAgIT0gTlVMKQorCSAgICB7CisJCS8qIEZpcnN0IHRpbWUgY291bnQgdGhlIE5VTCwgb3RoZXJ3aXNlIGNvdW50IHRoZSAnLCcuICovCisJCWxlbiA9IFNUUkxFTihwKSArIDM7CisJCWlmIChnYV9ncm93KCZnYSwgbGVuKSA9PSBPSykKKwkJeworCQkgICAgaWYgKGdhLmdhX2xlbiA+IDApCisJCQlTVFJDQVQoZ2EuZ2FfZGF0YSwgIiwiKTsKKwkJICAgIFNUUkNBVChnYS5nYV9kYXRhLCBwKTsKKwkJICAgIGFkZF9wYXRoc2VwKGdhLmdhX2RhdGEpOworCQkgICAgU1RSQ0FUKGdhLmdhX2RhdGEsICIqIik7CisJCSAgICBnYS5nYV9yb29tIC09IGxlbjsKKwkJICAgIGdhLmdhX2xlbiArPSBsZW47CisJCX0KKwkgICAgfQorCX0KKwlpZiAoZ2EuZ2FfZGF0YSAhPSBOVUxMKQorCXsKKwkgICAgc2V0X3N0cmluZ19kZWZhdWx0KCJic2siLCBnYS5nYV9kYXRhKTsKKwkgICAgdmltX2ZyZWUoZ2EuZ2FfZGF0YSk7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiAnbWF4bWVtdG90JyBhbmQgJ21heG1lbScgbWF5IGhhdmUgdG8gYmUgYWRqdXN0ZWQgZm9yIGF2YWlsYWJsZSBtZW1vcnkKKyAgICAgKi8KKyAgICBvcHRfaWR4ID0gZmluZG9wdGlvbigoY2hhcl91ICopIm1heG1lbXRvdCIpOworI2lmICFkZWZpbmVkKEhBVkVfQVZBSUxfTUVNKSAmJiAhZGVmaW5lZChIQVZFX1RPVEFMX01FTSkKKyAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS5kZWZfdmFsW1ZJX0RFRkFVTFRdID09IChjaGFyX3UgKikwTCkKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBIQVZFX0FWQUlMX01FTQorCS8qIFVzZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBhdCB0aGlzIG1vbWVudC4gKi8KKwluID0gKG1jaF9hdmFpbF9tZW0oRkFMU0UpID4+IDExKTsKKyNlbHNlCisjIGlmZGVmIEhBVkVfVE9UQUxfTUVNCisJLyogVXNlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIHRvIFZpbS4gKi8KKwluID0gKG1jaF90b3RhbF9tZW0oRkFMU0UpID4+IDExKTsKKyMgZWxzZQorCW4gPSAoMHg3ZmZmZmZmZiA+PiAxMSk7CisjIGVuZGlmCisjZW5kaWYKKwlvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0gPSAoY2hhcl91ICopbjsKKwlvcHRfaWR4ID0gZmluZG9wdGlvbigoY2hhcl91ICopIm1heG1lbSIpOworI2lmICFkZWZpbmVkKEhBVkVfQVZBSUxfTUVNKSAmJiAhZGVmaW5lZChIQVZFX1RPVEFMX01FTSkKKwlpZiAoKGxvbmcpb3B0aW9uc1tvcHRfaWR4XS5kZWZfdmFsW1ZJX0RFRkFVTFRdID4gbgorCQkJICB8fCAobG9uZylvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0gPT0gMEwpCisjZW5kaWYKKwkgICAgb3B0aW9uc1tvcHRfaWR4XS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gKGNoYXJfdSAqKW47CisgICAgfQorCisjaWZkZWYgRkVBVF9HVUlfVzMyCisgICAgLyogZm9yY2UgJ3Nob3J0bmFtZScgZm9yIFdpbjMycyAqLworICAgIGlmIChndWlfaXNfd2luMzJzKCkpCisJb3B0aW9uc1tmaW5kb3B0aW9uKChjaGFyX3UgKikic2hvcnRuYW1lIildLmRlZl92YWxbVklfREVGQVVMVF0gPQorCQkJCQkJCSAgICAgICAoY2hhcl91ICopVFJVRTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisgICAgeworCWNoYXJfdQkqY2RwYXRoOworCWNoYXJfdQkqYnVmOworCWludAlpOworCWludAlqOworCisJLyogSW5pdGlhbGl6ZSB0aGUgJ2NkcGF0aCcgb3B0aW9uJ3MgZGVmYXVsdCB2YWx1ZS4gKi8KKwljZHBhdGggPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiQ0RQQVRIIik7CisJaWYgKGNkcGF0aCAhPSBOVUxMKQorCXsKKwkgICAgYnVmID0gYWxsb2MoKHVuc2lnbmVkKSgoU1RSTEVOKGNkcGF0aCkgPDwgMSkgKyAyKSk7CisJICAgIGlmIChidWYgIT0gTlVMTCkKKwkgICAgeworCQlidWZbMF0gPSAnLCc7CSAgICAvKiBzdGFydCB3aXRoICIsIiwgY3VycmVudCBkaXIgZmlyc3QgKi8KKwkJaiA9IDE7CisJCWZvciAoaSA9IDA7IGNkcGF0aFtpXSAhPSBOVUw7ICsraSkKKwkJeworCQkgICAgaWYgKHZpbV9pc3BhdGhsaXN0c2VwKGNkcGF0aFtpXSkpCisJCQlidWZbaisrXSA9ICcsJzsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChjZHBhdGhbaV0gPT0gJyAnIHx8IGNkcGF0aFtpXSA9PSAnLCcpCisJCQkgICAgYnVmW2orK10gPSAnXFwnOworCQkJYnVmW2orK10gPSBjZHBhdGhbaV07CisJCSAgICB9CisJCX0KKwkJYnVmW2pdID0gTlVMOworCQlvcHRfaWR4ID0gZmluZG9wdGlvbigoY2hhcl91ICopImNkcGF0aCIpOworCQlvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0gPSBidWY7CisJCW9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9ERUZfQUxMT0NFRDsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9QT1NUU0NSSVBUKSAmJiAoZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEVCQ0RJQykgfHwgZGVmaW5lZChNQUMpIHx8IGRlZmluZWQoaHB1eCkpCisgICAgLyogU2V0IHByaW50IGVuY29kaW5nIG9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IGRlZmF1bHQgdG8gbGF0aW4xICovCisgICAgc2V0X3N0cmluZ19kZWZhdWx0KCJwZW5jIiwKKyMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChPUzIpCisJCSAgICAgICAoY2hhcl91ICopImNwMTI1MiIKKyMgZWxzZQorIyAgaWZkZWYgVk1TCisJCSAgICAgICAoY2hhcl91ICopImRlYy1tY3MiCisjICBlbHNlCisjICAgaWZkZWYgRUJDRElDCisJCSAgICAgICAoY2hhcl91ICopImViY2RpYy11ayIKKyMgICBlbHNlCisjICAgIGlmZGVmIE1BQworCQkgICAgICAgKGNoYXJfdSAqKSJtYWMtcm9tYW4iCisjICAgIGVsc2UgLyogSFBVWCAqLworCQkgICAgICAgKGNoYXJfdSAqKSJocC1yb21hbjgiCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisJCSAgICAgICApOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1BPU1RTQ1JJUFQKKyAgICAvKiAncHJpbnRleHByJyBtdXN0IGJlIGFsbG9jYXRlZCB0byBiZSBhYmxlIHRvIGV2YWx1YXRlIGl0LiAqLworICAgIHNldF9zdHJpbmdfZGVmYXVsdCgicGV4cHIiLAorIyBpZmRlZiBNU1dJTgorCSAgICAoY2hhcl91ICopInN5c3RlbSgnY29weScgLiAnICcgLiB2OmZuYW1lX2luIC4gJyBcIicgLiAmcHJpbnRkZXZpY2UgLiAnXCInKSAuIGRlbGV0ZSh2OmZuYW1lX2luKSIKKyMgZWxzZQorIyAgaWZkZWYgVk1TCisJICAgIChjaGFyX3UgKikic3lzdGVtKCdwcmludC9kZWxldGUnIC4gKCZwcmludGRldmljZSA9PSAnJyA/ICcnIDogJyAvcXVldWU9JyAuICZwcmludGRldmljZSkgLiAnICcgLiB2OmZuYW1lX2luKSIKKworIyAgZWxzZQorCSAgICAoY2hhcl91ICopInN5c3RlbSgnbHByJyAuICgmcHJpbnRkZXZpY2UgPT0gJycgPyAnJyA6ICcgLVAnIC4gJnByaW50ZGV2aWNlKSAuICcgJyAuIHY6Zm5hbWVfaW4pIC4gZGVsZXRlKHY6Zm5hbWVfaW4pICsgdjpzaGVsbF9lcnJvciIKKyMgIGVuZGlmCisjIGVuZGlmCisJICAgICk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogU2V0IGFsbCB0aGUgb3B0aW9ucyAoZXhjZXB0IHRoZSB0ZXJtaW5hbCBvcHRpb25zKSB0byB0aGVpciBkZWZhdWx0CisgICAgICogdmFsdWUuICBBbHNvIHNldCB0aGUgZ2xvYmFsIHZhbHVlIGZvciBsb2NhbCBvcHRpb25zLgorICAgICAqLworICAgIHNldF9vcHRpb25zX2RlZmF1bHQoMCk7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChmb3VuZF9yZXZlcnNlX2FyZykKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikiYmciLCAwTCwgKGNoYXJfdSAqKSJkYXJrIiwgMCk7CisjZW5kaWYKKworICAgIGN1cmJ1Zi0+Yl9wX2luaXRpYWxpemVkID0gVFJVRTsKKyAgICBjdXJidWYtPmJfcF9hciA9IC0xOwkvKiBubyBsb2NhbCAnYXV0b3JlYWQnIHZhbHVlICovCisgICAgY2hlY2tfYnVmX29wdGlvbnMoY3VyYnVmKTsKKyAgICBjaGVja193aW5fb3B0aW9ucyhjdXJ3aW4pOworICAgIGNoZWNrX29wdGlvbnMoKTsKKworICAgIC8qIE11c3QgYmUgYmVmb3JlIG9wdGlvbl9leHBhbmQoKSwgYmVjYXVzZSB0aGF0IG9uZSBuZWVkcyB2aW1faXNJRGMoKSAqLworICAgIGRpZHNldF9vcHRpb25zKCk7CisKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworICAgIC8qCisgICAgICogaW5pdGlhbGl6ZSB0aGUgdGFibGUgZm9yICdicmVha2F0Jy4KKyAgICAgKi8KKyAgICBmaWxsX2JyZWFrYXRfZmxhZ3MoKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBFeHBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB0aGluZ3MgbGlrZSAifiIgZm9yIHRoZSBkZWZhdWx0cy4KKyAgICAgKiBJZiBvcHRpb25fZXhwYW5kKCkgcmV0dXJucyBub24tTlVMTCB0aGUgdmFyaWFibGUgaXMgZXhwYW5kZWQuICBUaGlzIGNhbgorICAgICAqIG9ubHkgaGFwcGVuIGZvciBub24taW5kaXJlY3Qgb3B0aW9ucy4KKyAgICAgKiBBbHNvIHNldCB0aGUgZGVmYXVsdCB0byB0aGUgZXhwYW5kZWQgdmFsdWUsIHNvICI6c2V0IiBkb2VzIG5vdCBsaXN0CisgICAgICogdGhlbS4KKyAgICAgKiBEb24ndCBzZXQgdGhlIFBfQUxMT0NFRCBmbGFnLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUKKyAgICAgKiBkZWZhdWx0LgorICAgICAqLworICAgIGZvciAob3B0X2lkeCA9IDA7ICFpc3Rlcm1vcHRpb24oJm9wdGlvbnNbb3B0X2lkeF0pOyBvcHRfaWR4KyspCisgICAgeworCWlmICgob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfR0VUVEVYVCkKKwkJCQkJICAgICAgJiYgb3B0aW9uc1tvcHRfaWR4XS52YXIgIT0gTlVMTCkKKwkgICAgcCA9IChjaGFyX3UgKilfKCooY2hhciAqKilvcHRpb25zW29wdF9pZHhdLnZhcik7CisJZWxzZQorCSAgICBwID0gb3B0aW9uX2V4cGFuZChvcHRfaWR4LCBOVUxMKTsKKwlpZiAocCAhPSBOVUxMICYmIChwID0gdmltX3N0cnNhdmUocCkpICE9IE5VTEwpCisJeworCSAgICAqKGNoYXJfdSAqKilvcHRpb25zW29wdF9pZHhdLnZhciA9IHA7CisJICAgIC8qIFZJTUVYUAorCSAgICAgKiBEZWZhdWx0cyBmb3IgYWxsIGV4cGFuZGVkIG9wdGlvbnMgYXJlIGN1cnJlbnRseSB0aGUgc2FtZSBmb3IgVmkKKwkgICAgICogYW5kIFZpbS4gIFdoZW4gdGhpcyBjaGFuZ2VzLCBhZGQgc29tZSBjb2RlIGhlcmUhICBBbHNvIG5lZWQgdG8KKwkgICAgICogc3BsaXQgUF9ERUZfQUxMT0NFRCBpbiB0d28uCisJICAgICAqLworCSAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfREVGX0FMTE9DRUQpCisJCXZpbV9mcmVlKG9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtWSV9ERUZBVUxUXSk7CisJICAgIG9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHA7CisJICAgIG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9ERUZfQUxMT0NFRDsKKwl9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGlnaGxpZ2h0X2F0dHJbXSB0YWJsZS4gKi8KKyAgICBoaWdobGlnaHRfY2hhbmdlZCgpOworCisgICAgc2F2ZV9maWxlX2ZmKGN1cmJ1Zik7CS8qIEJ1ZmZlciBpcyB1bmNoYW5nZWQgKi8KKworICAgIC8qIFBhcnNlIGRlZmF1bHQgZm9yICd3aWxkbW9kZScgICovCisgICAgY2hlY2tfb3B0X3dpbSgpOworCisjaWYgZGVmaW5lZChGRUFUX0FSQUJJQykKKyAgICAvKiBEZXRlY3QgdXNlIG9mIG1sdGVybS4KKyAgICAgKiBNbHRlcm0gaXMgYSB0ZXJtaW5hbCBlbXVsYXRvciBha2luIHRvIHh0ZXJtIHRoYXQgaGFzIHNvbWUgc3BlY2lhbAorICAgICAqIGFiaWxpdGllcyAoYmlkaSBuYW1lbHkpLgorICAgICAqIE5PVEU6IG1sdGVybSdzIGF1dGhvciBpcyBiZWluZyBhc2tlZCB0byAnc2V0JyBhIHZhcmlhYmxlCisgICAgICogICAgICAgaW5zdGVhZCBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBkdWUgdG8gaW5oZXJpdGFuY2UuCisgICAgICovCisgICAgaWYgKG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJNTFRFUk0iKSAhPSBOVUxMKQorCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJ0YmlkaSIsIDFMLCBOVUxMLCAwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorICAgIC8qIFBhcnNlIGRlZmF1bHQgZm9yICdmaWxsY2hhcnMnLiAqLworICAgICh2b2lkKXNldF9jaGFyc19vcHRpb24oJnBfZmNzKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBQYXJzZSBkZWZhdWx0IGZvciAnY2xpcGJvYXJkJyAqLworICAgICh2b2lkKWNoZWNrX2NsaXBib2FyZF9vcHRpb24oKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NQllURQorIyBpZiBkZWZpbmVkKFdJTjMyNjQpICYmIGRlZmluZWQoRkVBVF9HRVRURVhUKQorICAgIC8qCisgICAgICogSWYgJExBTkcgaXNuJ3Qgc2V0LCB0cnkgdG8gZ2V0IGEgZ29vZCB2YWx1ZSBmb3IgaXQuICBUaGlzIG1ha2VzIHRoZQorICAgICAqIHJpZ2h0IGxhbmd1YWdlIGJlIHVzZWQgYXV0b21hdGljYWxseS4gIERvbid0IGRvIHRoaXMgZm9yIEVuZ2xpc2guCisgICAgICovCisgICAgaWYgKG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJMQU5HIikgPT0gTlVMTCkKKyAgICB7CisJY2hhcglidWZbMjBdOworCisJLyogQ291bGQgdXNlIExPQ0FMRV9TSVNPNjM5TEFOR05BTUUsIGJ1dCBpdCdzIG5vdCBpbiBXaW45NS4KKwkgKiBMT0NBTEVfU0FCQlJFVkxBTkdOQU1FIGdpdmVzIHVzIHRocmVlIGxldHRlcnMsIGxpa2UgImVudSIsIHdlIHVzZQorCSAqIG9ubHkgdGhlIGZpcnN0IHR3by4gKi8KKwluID0gR2V0TG9jYWxlSW5mbyhMT0NBTEVfVVNFUl9ERUZBVUxULCBMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLAorCQkJCQkJCSAgICAgKExQVFNUUilidWYsIDIwKTsKKwlpZiAobiA+PSAyICYmIFNUUk5JQ01QKGJ1ZiwgImVuIiwgMikgIT0gMCkKKwl7CisJICAgIC8qIFRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zIChwcm9iYWJseSBtb3JlKSAqLworCSAgICBpZiAoU1RSTklDTVAoYnVmLCAiY2h0IiwgMykgPT0gMCB8fCBTVFJOSUNNUChidWYsICJ6aHQiLCAzKSA9PSAwKQorCQlTVFJDUFkoYnVmLCAiemhfVFciKTsKKwkgICAgZWxzZSBpZiAoU1RSTklDTVAoYnVmLCAiY2hzIiwgMykgPT0gMAorCQkJCQkgICAgICB8fCBTVFJOSUNNUChidWYsICJ6aGMiLCAzKSA9PSAwKQorCQlTVFJDUFkoYnVmLCAiemhfQ04iKTsKKwkgICAgZWxzZSBpZiAoU1RSTklDTVAoYnVmLCAianAiLCAyKSA9PSAwKQorCQlTVFJDUFkoYnVmLCAiamEiKTsKKwkgICAgZWxzZQorCQlidWZbMl0gPSBOVUw7CQkvKiB0cnVuY2F0ZSB0byB0d28tbGV0dGVyIGNvZGUgKi8KKwkgICAgdmltX3NldGVudigiTEFORyIsIGJ1Zik7CisJfQorICAgIH0KKyMgZW5kaWYKKworICAgIC8qIGVuY19sb2NhbGUoKSB3aWxsIHRyeSB0byBmaW5kIHRoZSBlbmNvZGluZyBvZiB0aGUgY3VycmVudCBsb2NhbGUuICovCisgICAgcCA9IGVuY19sb2NhbGUoKTsKKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UgKnNhdmVfZW5jOworCisJLyogVHJ5IHNldHRpbmcgJ2VuY29kaW5nJyBhbmQgY2hlY2sgaWYgdGhlIHZhbHVlIGlzIHZhbGlkLgorCSAqIElmIG5vdCwgZ28gYmFjayB0byB0aGUgZGVmYXVsdCAibGF0aW4xIi4gKi8KKwlzYXZlX2VuYyA9IHBfZW5jOworCXBfZW5jID0gcDsKKwlpZiAobWJfaW5pdCgpID09IE5VTEwpCisJeworCSAgICBvcHRfaWR4ID0gZmluZG9wdGlvbigoY2hhcl91ICopImVuY29kaW5nIik7CisJICAgIG9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHBfZW5jOworCSAgICBvcHRpb25zW29wdF9pZHhdLmZsYWdzIHw9IFBfREVGX0FMTE9DRUQ7CisKKyMgaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSSkKKwkgICAgLyogV2luMzIgY29uc29sZTogV2hlbiBHZXRBQ1AoKSByZXR1cm5zIGEgZGlmZmVyZW50IHZhbHVlIGZyb20KKwkgICAgICogR2V0Q29uc29sZUNQKCkgc2V0ICd0ZXJtZW5jb2RpbmcnLiAqLworCSAgICBpZiAoR2V0QUNQKCkgIT0gR2V0Q29uc29sZUNQKCkpCisJICAgIHsKKwkJY2hhcglidWZbNTBdOworCisJCXNwcmludGYoYnVmLCAiY3AlbGQiLCAobG9uZylHZXRDb25zb2xlQ1AoKSk7CisJCXBfdGVuYyA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKilidWYpOworCQlpZiAocF90ZW5jICE9IE5VTEwpCisJCXsKKwkJICAgIG9wdF9pZHggPSBmaW5kb3B0aW9uKChjaGFyX3UgKikidGVybWVuY29kaW5nIik7CisJCSAgICBvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3RlbmM7CisJCSAgICBvcHRpb25zW29wdF9pZHhdLmZsYWdzIHw9IFBfREVGX0FMTE9DRUQ7CisJCSAgICBjb252ZXJ0X3NldHVwKCZpbnB1dF9jb252LCBwX3RlbmMsIHBfZW5jKTsKKwkJICAgIGNvbnZlcnRfc2V0dXAoJm91dHB1dF9jb252LCBwX2VuYywgcF90ZW5jKTsKKwkJfQorCQllbHNlCisJCSAgICBwX3RlbmMgPSBlbXB0eV9vcHRpb247CisJICAgIH0KKyMgZW5kaWYKKwl9CisJZWxzZQorCXsKKwkgICAgdmltX2ZyZWUocF9lbmMpOworCSAgICBwX2VuYyA9IHNhdmVfZW5jOworCX0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTVVMVElfTEFORworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBmb3IgJ2hlbHBsYW5nJy4gKi8KKyAgICBzZXRfaGVscGxhbmdfZGVmYXVsdChnZXRfbWVzc19sYW5nKCkpOworI2VuZGlmCit9CisKKy8qCisgKiBTZXQgYW4gb3B0aW9uIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgorICogVGhpcyBkb2VzIG5vdCB0YWtlIGNhcmUgb2Ygc2lkZSBlZmZlY3RzIQorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9vcHRpb25fZGVmYXVsdChvcHRfaWR4LCBvcHRfZmxhZ3MsIGNvbXBhdGlibGUpCisgICAgaW50CQlvcHRfaWR4OworICAgIGludAkJb3B0X2ZsYWdzOwkvKiBPUFRfRlJFRSwgT1BUX0xPQ0FMIGFuZC9vciBPUFRfR0xPQkFMICovCisgICAgaW50CQljb21wYXRpYmxlOwkvKiB1c2UgVmkgZGVmYXVsdCB2YWx1ZSAqLworeworICAgIGNoYXJfdQkqdmFycDsJCS8qIHBvaW50ZXIgdG8gdmFyaWFibGUgZm9yIGN1cnJlbnQgb3B0aW9uICovCisgICAgaW50CQlkdmk7CQkvKiBpbmRleCBpbiBkZWZfdmFsW10gKi8KKyAgICBsb25nX3UJZmxhZ3M7CisgICAgaW50CQlib3RoID0gKG9wdF9mbGFncyAmIChPUFRfTE9DQUwgfCBPUFRfR0xPQkFMKSkgPT0gMDsKKworICAgIHZhcnAgPSBnZXRfdmFycF9zY29wZSgmKG9wdGlvbnNbb3B0X2lkeF0pLCBib3RoID8gT1BUX0xPQ0FMIDogb3B0X2ZsYWdzKTsKKyAgICBmbGFncyA9IG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3M7CisgICAgaWYgKHZhcnAgIT0gTlVMTCkJICAgIC8qIG5vdGhpbmcgdG8gZG8gZm9yIGhpZGRlbiBvcHRpb24gKi8KKyAgICB7CisJZHZpID0gKChmbGFncyAmIFBfVklfREVGKSB8fCBjb21wYXRpYmxlKSA/IFZJX0RFRkFVTFQgOiBWSU1fREVGQVVMVDsKKwlpZiAoZmxhZ3MgJiBQX1NUUklORykKKwl7CisJICAgIC8qIFVzZSBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKSBmb3IgbG9jYWwgb3B0aW9ucyB0byBoYW5kbGUKKwkgICAgICogZnJlZWluZyBhbmQgYWxsb2NhdGluZyB0aGUgdmFsdWUuICovCisJICAgIGlmIChvcHRpb25zW29wdF9pZHhdLmluZGlyICE9IFBWX05PTkUpCisJCXNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdChOVUxMLCBvcHRfaWR4LAorCQkJCSAgICBvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbZHZpXSwgb3B0X2ZsYWdzKTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmICgob3B0X2ZsYWdzICYgT1BUX0ZSRUUpICYmIChmbGFncyAmIFBfQUxMT0NFRCkpCisJCSAgICBmcmVlX3N0cmluZ19vcHRpb24oKihjaGFyX3UgKiopKHZhcnApKTsKKwkJKihjaGFyX3UgKiopdmFycCA9IG9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtkdmldOworCQlvcHRpb25zW29wdF9pZHhdLmZsYWdzICY9IH5QX0FMTE9DRUQ7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoZmxhZ3MgJiBQX05VTSkKKwl7CisJICAgIGlmICh2YXJwID09IChjaGFyX3UgKilQVl9TQ1JPTEwpCisJCXdpbl9jb21wX3Njcm9sbChjdXJ3aW4pOworCSAgICBlbHNlCisJICAgIHsKKwkJKihsb25nICopdmFycCA9IChsb25nKW9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtkdmldOworCQkvKiBNYXkgYWxzbyBzZXQgZ2xvYmFsIHZhbHVlIGZvciBsb2NhbCBvcHRpb24uICovCisJCWlmIChib3RoKQorCQkgICAgKihsb25nICopZ2V0X3ZhcnBfc2NvcGUoJihvcHRpb25zW29wdF9pZHhdKSwgT1BUX0dMT0JBTCkgPQorCQkJCQkJCQkqKGxvbmcgKil2YXJwOworCSAgICB9CisJfQorCWVsc2UJLyogUF9CT09MICovCisJeworCSAgICAvKiB0aGUgY2FzdCB0byBsb25nIGlzIHJlcXVpcmVkIGZvciBNYW54IEMgKi8KKwkgICAgKihpbnQgKil2YXJwID0gKGludCkobG9uZylvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbZHZpXTsKKwkgICAgLyogTWF5IGFsc28gc2V0IGdsb2JhbCB2YWx1ZSBmb3IgbG9jYWwgb3B0aW9uLiAqLworCSAgICBpZiAoYm90aCkKKwkJKihpbnQgKilnZXRfdmFycF9zY29wZSgmKG9wdGlvbnNbb3B0X2lkeF0pLCBPUFRfR0xPQkFMKSA9CisJCQkJCQkJCSooaW50ICopdmFycDsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhlIG9wdGlvbiB3YXMgc2V0LiAqLworICAgIG9wdGlvbnNbb3B0X2lkeF0uc2NyaXB0SUQgPSBjdXJyZW50X1NJRDsKKyNlbmRpZgorfQorCisvKgorICogU2V0IGFsbCBvcHRpb25zIChleGNlcHQgdGVybWluYWwgb3B0aW9ucykgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfb3B0aW9uc19kZWZhdWx0KG9wdF9mbGFncykKKyAgICBpbnQJCW9wdF9mbGFnczsJLyogT1BUX0ZSRUUsIE9QVF9MT0NBTCBhbmQvb3IgT1BUX0dMT0JBTCAqLworeworICAgIGludAkJaTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd3A7CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7ICFpc3Rlcm1vcHRpb24oJm9wdGlvbnNbaV0pOyBpKyspCisJaWYgKCEob3B0aW9uc1tpXS5mbGFncyAmIFBfTk9ERUZBVUxUKSkKKwkgICAgc2V0X29wdGlvbl9kZWZhdWx0KGksIG9wdF9mbGFncywgcF9jcCk7CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICAvKiBUaGUgJ3Njcm9sbCcgb3B0aW9uIG11c3QgYmUgY29tcHV0ZWQgZm9yIGFsbCB3aW5kb3dzLiAqLworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCXdpbl9jb21wX3Njcm9sbCh3cCk7CisjZWxzZQorCXdpbl9jb21wX3Njcm9sbChjdXJ3aW4pOworI2VuZGlmCit9CisKKy8qCisgKiBTZXQgdGhlIFZpLWRlZmF1bHQgdmFsdWUgb2YgYSBzdHJpbmcgb3B0aW9uLgorICogVXNlZCBmb3IgJ3NoJywgJ2JhY2t1cHNraXAnIGFuZCAndGVybScuCisgKi8KKyAgICB2b2lkCitzZXRfc3RyaW5nX2RlZmF1bHQobmFtZSwgdmFsKQorICAgIGNoYXIJKm5hbWU7CisgICAgY2hhcl91CSp2YWw7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJb3B0X2lkeDsKKworICAgIHAgPSB2aW1fc3Ryc2F2ZSh2YWwpOworICAgIGlmIChwICE9IE5VTEwpCQkvKiB3ZSBkb24ndCB3YW50IGEgTlVMTCAqLworICAgIHsKKwlvcHRfaWR4ID0gZmluZG9wdGlvbigoY2hhcl91ICopbmFtZSk7CisJaWYgKG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgJiBQX0RFRl9BTExPQ0VEKQorCSAgICB2aW1fZnJlZShvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0pOworCW9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHA7CisJb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX0RFRl9BTExPQ0VEOworICAgIH0KK30KKworLyoKKyAqIFNldCB0aGUgVmktZGVmYXVsdCB2YWx1ZSBvZiBhIG51bWJlciBvcHRpb24uCisgKiBVc2VkIGZvciAnbGluZXMnIGFuZCAnY29sdW1ucycuCisgKi8KKyAgICB2b2lkCitzZXRfbnVtYmVyX2RlZmF1bHQobmFtZSwgdmFsKQorICAgIGNoYXIJKm5hbWU7CisgICAgbG9uZwl2YWw7Cit7CisgICAgb3B0aW9uc1tmaW5kb3B0aW9uKChjaGFyX3UgKiluYW1lKV0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IChjaGFyX3UgKil2YWw7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBvcHRpb25zLCBwYXJ0IHR3bzogQWZ0ZXIgZ2V0dGluZyBSb3dzIGFuZCBDb2x1bW5zIGFuZAorICogc2V0dGluZyAndGVybScuCisgKi8KKyAgICB2b2lkCitzZXRfaW5pdF8yKCkKK3sKKyAgICAvKgorICAgICAqICdzY3JvbGwnIGRlZmF1bHRzIHRvIGhhbGYgdGhlIHdpbmRvdyBoZWlnaHQuIE5vdGUgdGhhdCB0aGlzIGRlZmF1bHQgaXMKKyAgICAgKiB3cm9uZyB3aGVuIHRoZSB3aW5kb3cgaGVpZ2h0IGNoYW5nZXMuCisgICAgICovCisgICAgb3B0aW9uc1tmaW5kb3B0aW9uKChjaGFyX3UgKikic2Nyb2xsIildLmRlZl92YWxbVklfREVGQVVMVF0KKwkJCQkJICAgICAgPSAoY2hhcl91ICopKChsb25nX3UpUm93cyA+PiAxKTsKKyAgICBjb21wX2NvbCgpOworCisjaWYgISgoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJKSkKKyAgICB7CisJaW50CWlkeDQ7CisKKwkvKgorCSAqIElmICdiYWNrZ3JvdW5kJyB3YXNuJ3Qgc2V0IGJ5IHRoZSB1c2VyLCB0cnkgZ3Vlc3NpbmcgdGhlIHZhbHVlLAorCSAqIGRlcGVuZGluZyBvbiB0aGUgdGVybWluYWwgbmFtZS4gIE9ubHkgbmVlZCB0byBjaGVjayBmb3IgdGVybWluYWxzCisJICogd2l0aCBhIGRhcmsgYmFja2dyb3VuZCwgdGhhdCBjYW4gaGFuZGxlIGNvbG9yLiAgT25seSAibGludXgiCisJICogY29uc29sZSBhdCB0aGUgbW9tZW50LgorCSAqLworCWlkeDQgPSBmaW5kb3B0aW9uKChjaGFyX3UgKikiYmciKTsKKwlpZiAoIShvcHRpb25zW2lkeDRdLmZsYWdzICYgUF9XQVNfU0VUKSAmJiBTVFJDTVAoVF9OQU1FLCAibGludXgiKSA9PSAwKQorCXsKKwkgICAgc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KE5VTEwsIGlkeDQsIChjaGFyX3UgKikiZGFyayIsIE9QVF9GUkVFKTsKKwkgICAgLyogZG9uJ3QgbWFyayBpdCBhcyBzZXQsIHdoZW4gc3RhcnRpbmcgdGhlIEdVSSBpdCBtYXkgYmUgY2hhbmdlZAorCSAgICAgKiBhZ2FpbiAqLworCSAgICBvcHRpb25zW2lkeDRdLmZsYWdzICY9IH5QX1dBU19TRVQ7CisJfQorICAgIH0KKyNlbmRpZgorfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgb3B0aW9ucywgcGFydCB0aHJlZTogQWZ0ZXIgcmVhZGluZyB0aGUgLnZpbXJjCisgKi8KKyAgICB2b2lkCitzZXRfaW5pdF8zKCkKK3sKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisvKgorICogU2V0ICdzaGVsbHBpcGUnIGFuZCAnc2hlbGxyZWRpcicsIGRlcGVuZGluZyBvbiB0aGUgJ3NoZWxsJyBvcHRpb24uCisgKiBUaGlzIGlzIGRvbmUgYWZ0ZXIgb3RoZXIgaW5pdGlhbGl6YXRpb25zLCB3aGVyZSAnc2hlbGwnIG1pZ2h0IGhhdmUgYmVlbgorICogc2V0LCBidXQgb25seSBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0IGJlZm9yZS4KKyAqLworICAgIGNoYXJfdSAgKnA7CisgICAgaW50CSAgICBpZHhfc3JyOworICAgIGludAkgICAgZG9fc3JyOworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKyAgICBpbnQJICAgIGlkeF9zcDsKKyAgICBpbnQJICAgIGRvX3NwOworI2VuZGlmCisKKyAgICBpZHhfc3JyID0gZmluZG9wdGlvbigoY2hhcl91ICopInNyciIpOworICAgIGRvX3NyciA9ICEob3B0aW9uc1tpZHhfc3JyXS5mbGFncyAmIFBfV0FTX1NFVCk7CisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorICAgIGlkeF9zcCA9IGZpbmRvcHRpb24oKGNoYXJfdSAqKSJzcCIpOworICAgIGRvX3NwID0gIShvcHRpb25zW2lkeF9zcF0uZmxhZ3MgJiBQX1dBU19TRVQpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIElzb2xhdGUgdGhlIG5hbWUgb2YgdGhlIHNoZWxsOgorICAgICAqIC0gU2tpcCBiZXlvbmQgYW55IHBhdGguICBFLmcuLCAiL3Vzci9iaW4vY3NoIC1mIiAtPiAiY3NoIC1mIi4KKyAgICAgKiAtIFJlbW92ZSBhbnkgYXJndW1lbnQuICBFLmcuLCAiY3NoIC1mIiAtPiAiY3NoIi4KKyAgICAgKi8KKyAgICBwID0gZ2V0dGFpbChwX3NoKTsKKyAgICBwID0gdmltX3N0cm5zYXZlKHAsIChpbnQpKHNraXB0b3doaXRlKHApIC0gcCkpOworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCS8qCisJICogRGVmYXVsdCBmb3IgcF9zcCBpcyAifCB0ZWUiLCBmb3IgcF9zcnIgaXMgIj4iLgorCSAqIEZvciBrbm93biBzaGVsbHMgaXQgaXMgY2hhbmdlZCBoZXJlIHRvIGluY2x1ZGUgc3RkZXJyLgorCSAqLworCWlmICgJICAgZm5hbWVjbXAocCwgImNzaCIpID09IDAKKwkJfHwgZm5hbWVjbXAocCwgInRjc2giKSA9PSAwCisjIGlmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyNjQpCS8qIGFsc28gY2hlY2sgd2l0aCAuZXhlIGV4dGVuc2lvbiAqLworCQl8fCBmbmFtZWNtcChwLCAiY3NoLmV4ZSIpID09IDAKKwkJfHwgZm5hbWVjbXAocCwgInRjc2guZXhlIikgPT0gMAorIyBlbmRpZgorCSAgICkKKwl7CisjaWYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCSAgICBpZiAoZG9fc3ApCisJICAgIHsKKyMgaWZkZWYgV0lOMzI2NAorCQlwX3NwID0gKGNoYXJfdSAqKSI+JiI7CisjIGVsc2UKKwkJcF9zcCA9IChjaGFyX3UgKikifCYgdGVlIjsKKyMgZW5kaWYKKwkJb3B0aW9uc1tpZHhfc3BdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3NwOworCSAgICB9CisjZW5kaWYKKwkgICAgaWYgKGRvX3NycikKKwkgICAgeworCQlwX3NyciA9IChjaGFyX3UgKikiPiYiOworCQlvcHRpb25zW2lkeF9zcnJdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3NycjsKKwkgICAgfQorCX0KKwllbHNlCisjIGlmbmRlZiBPUzIJLyogQWx3YXlzIHVzZSBib3VybmUgc2hlbGwgc3R5bGUgcmVkaXJlY3Rpb24gaWYgd2UgcmVhY2ggdGhpcyAqLworCSAgICBpZiAoICAgICAgIGZuYW1lY21wKHAsICJzaCIpID09IDAKKwkJICAgIHx8IGZuYW1lY21wKHAsICJrc2giKSA9PSAwCisJCSAgICB8fCBmbmFtZWNtcChwLCAienNoIikgPT0gMAorCQkgICAgfHwgZm5hbWVjbXAocCwgImJhc2giKSA9PSAwCisjICBpZmRlZiBXSU4zMjY0CisJCSAgICB8fCBmbmFtZWNtcChwLCAiY21kIikgPT0gMAorCQkgICAgfHwgZm5hbWVjbXAocCwgInNoLmV4ZSIpID09IDAKKwkJICAgIHx8IGZuYW1lY21wKHAsICJrc2guZXhlIikgPT0gMAorCQkgICAgfHwgZm5hbWVjbXAocCwgInpzaC5leGUiKSA9PSAwCisJCSAgICB8fCBmbmFtZWNtcChwLCAiYmFzaC5leGUiKSA9PSAwCisJCSAgICB8fCBmbmFtZWNtcChwLCAiY21kLmV4ZSIpID09IDAKKyMgIGVuZGlmCisJCSAgICApCisjIGVuZGlmCisJICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCWlmIChkb19zcCkKKwkJeworIyBpZmRlZiBXSU4zMjY0CisJCSAgICBwX3NwID0gKGNoYXJfdSAqKSI+JXMgMj4mMSI7CisjIGVsc2UKKwkJICAgIHBfc3AgPSAoY2hhcl91ICopIjI+JjF8IHRlZSI7CisjIGVuZGlmCisJCSAgICBvcHRpb25zW2lkeF9zcF0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHBfc3A7CisJCX0KKyNlbmRpZgorCQlpZiAoZG9fc3JyKQorCQl7CisJCSAgICBwX3NyciA9IChjaGFyX3UgKikiPiVzIDI+JjEiOworCQkgICAgb3B0aW9uc1tpZHhfc3JyXS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gcF9zcnI7CisJCX0KKwkgICAgfQorCXZpbV9mcmVlKHApOworICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KSB8fCBkZWZpbmVkKE9TMikKKyAgICAvKgorICAgICAqIFNldCAnc2hlbGxjbWRmbGFnIGFuZCAnc2hlbGxxdW90ZScgZGVwZW5kaW5nIG9uIHRoZSAnc2hlbGwnIG9wdGlvbi4KKyAgICAgKiBUaGlzIGlzIGRvbmUgYWZ0ZXIgb3RoZXIgaW5pdGlhbGl6YXRpb25zLCB3aGVyZSAnc2hlbGwnIG1pZ2h0IGhhdmUgYmVlbgorICAgICAqIHNldCwgYnV0IG9ubHkgaWYgdGhleSBoYXZlIG5vdCBiZWVuIHNldCBiZWZvcmUuICBEZWZhdWx0IGZvciBwX3NoY2YgaXMKKyAgICAgKiAiL2MiLCBmb3IgcF9zaHEgaXMgIiIuICBGb3IgInNoIiBsaWtlICBzaGVsbHMgaXQgaXMgY2hhbmdlZCBoZXJlIHRvCisgICAgICogIi1jIiBhbmQgIlwiIiwgYnV0IG5vdCBmb3IgREpHUFAsIGJlY2F1c2UgaXQgc3RhcnRzIHRoZSBzaGVsbCB3aXRob3V0CisgICAgICogY29tbWFuZC5jb20uICBBbmQgZm9yIFdpbjMyIHdlIG5lZWQgdG8gc2V0IHBfc3hxIGluc3RlYWQuCisgICAgICovCisgICAgaWYgKHN0cnN0cigoY2hhciAqKXBfc2gsICJzaCIpICE9IE5VTEwpCisgICAgeworCWludAlpZHgzOworCisJaWR4MyA9IGZpbmRvcHRpb24oKGNoYXJfdSAqKSJzaGNmIik7CisJaWYgKCEob3B0aW9uc1tpZHgzXS5mbGFncyAmIFBfV0FTX1NFVCkpCisJeworCSAgICBwX3NoY2YgPSAoY2hhcl91ICopIi1jIjsKKwkgICAgb3B0aW9uc1tpZHgzXS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gcF9zaGNmOworCX0KKworIyBpZm5kZWYgREpHUFAKKyMgIGlmZGVmIFdJTjMyNjQKKwkvKiBTb21laG93IFdpbjMyIHJlcXVpcmVzIHRoZSBxdW90ZXMgYXJvdW5kIHRoZSByZWRpcmVjdGlvbiB0b28gKi8KKwlpZHgzID0gZmluZG9wdGlvbigoY2hhcl91ICopInN4cSIpOworCWlmICghKG9wdGlvbnNbaWR4M10uZmxhZ3MgJiBQX1dBU19TRVQpKQorCXsKKwkgICAgcF9zeHEgPSAoY2hhcl91ICopIlwiIjsKKwkgICAgb3B0aW9uc1tpZHgzXS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gcF9zeHE7CisJfQorIyAgZWxzZQorCWlkeDMgPSBmaW5kb3B0aW9uKChjaGFyX3UgKikic2hxIik7CisJaWYgKCEob3B0aW9uc1tpZHgzXS5mbGFncyAmIFBfV0FTX1NFVCkpCisJeworCSAgICBwX3NocSA9IChjaGFyX3UgKikiXCIiOworCSAgICBvcHRpb25zW2lkeDNdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3NocTsKKwl9CisjICBlbmRpZgorIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9USVRMRQorICAgIHNldF90aXRsZV9kZWZhdWx0cygpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTVVMVElfTEFORykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBXaGVuICdoZWxwbGFuZycgaXMgc3RpbGwgYXQgaXRzIGRlZmF1bHQgdmFsdWUsIHNldCBpdCB0byAibGFuZyIuCisgKiBPbmx5IHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiAibGFuZyIgYXJlIHVzZWQuCisgKi8KKyAgICB2b2lkCitzZXRfaGVscGxhbmdfZGVmYXVsdChsYW5nKQorICAgIGNoYXJfdQkqbGFuZzsKK3sKKyAgICBpbnQJCWlkeDsKKworICAgIGlmIChsYW5nID09IE5VTEwgfHwgU1RSTEVOKGxhbmcpIDwgMikJLyogc2FmZXR5IGNoZWNrICovCisJcmV0dXJuOworICAgIGlkeCA9IGZpbmRvcHRpb24oKGNoYXJfdSAqKSJobGciKTsKKyAgICBpZiAoIShvcHRpb25zW2lkeF0uZmxhZ3MgJiBQX1dBU19TRVQpKQorICAgIHsKKwlpZiAob3B0aW9uc1tpZHhdLmZsYWdzICYgUF9BTExPQ0VEKQorCSAgICBmcmVlX3N0cmluZ19vcHRpb24ocF9obGcpOworCXBfaGxnID0gdmltX3N0cnNhdmUobGFuZyk7CisJaWYgKHBfaGxnID09IE5VTEwpCisJICAgIHBfaGxnID0gZW1wdHlfb3B0aW9uOworCWVsc2UKKwkgICAgcF9obGdbMl0gPSBOVUw7CisJb3B0aW9uc1tpZHhdLmZsYWdzIHw9IFBfQUxMT0NFRDsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCitzdGF0aWMgY2hhcl91ICpndWlfYmdfZGVmYXVsdCBfX0FSR1MoKHZvaWQpKTsKKworICAgIHN0YXRpYyBjaGFyX3UgKgorZ3VpX2JnX2RlZmF1bHQoKQoreworICAgIGlmIChndWlfZ2V0X2xpZ2h0bmVzcyhndWkuYmFja19waXhlbCkgPCAxMjcpCisJcmV0dXJuIChjaGFyX3UgKikiZGFyayI7CisgICAgcmV0dXJuIChjaGFyX3UgKikibGlnaHQiOworfQorCisvKgorICogT3B0aW9uIGluaXRpYWxpemF0aW9ucyB0aGF0IGNhbiBvbmx5IGJlIGRvbmUgYWZ0ZXIgb3BlbmluZyB0aGUgR1VJIHdpbmRvdy4KKyAqLworICAgIHZvaWQKK2luaXRfZ3VpX29wdGlvbnMoKQoreworICAgIC8qIFNldCB0aGUgJ2JhY2tncm91bmQnIG9wdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGxpZ2h0bmVzcyBvZiB0aGUKKyAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yLCB1bmxlc3MgdGhlIHVzZXIgaGFzIHNldCBpdCBhbHJlYWR5LiAqLworICAgIGlmICghb3B0aW9uX3dhc19zZXQoKGNoYXJfdSAqKSJiZyIpICYmIFNUUkNNUChwX2JnLCBndWlfYmdfZGVmYXVsdCgpKSAhPSAwKQorICAgIHsKKwlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikiYmciLCAwTCwgZ3VpX2JnX2RlZmF1bHQoKSwgMCk7CisJaGlnaGxpZ2h0X2NoYW5nZWQoKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVElUTEUKKy8qCisgKiAndGl0bGUnIGFuZCAnaWNvbicgb25seSBkZWZhdWx0IHRvIHRydWUgaWYgdGhleSBoYXZlIG5vdCBiZWVuIHNldCBvciByZXNldAorICogaW4gLnZpbXJjIGFuZCB3ZSBjYW4gcmVhZCB0aGUgb2xkIHZhbHVlLgorICogV2hlbiAndGl0bGUnIGFuZCAnaWNvbicgaGF2ZSBiZWVuIHJlc2V0IGluIC52aW1yYywgd2Ugd29uJ3QgZXZlbiBjaGVjayBpZgorICogdGhleSBjYW4gYmUgcmVzZXQuICBUaGlzIHJlZHVjZXMgc3RhcnR1cCB0aW1lIHdoZW4gdXNpbmcgWCBvbiBhIHJlbW90ZQorICogbWFjaGluZS4KKyAqLworICAgIHZvaWQKK3NldF90aXRsZV9kZWZhdWx0cygpCit7CisgICAgaW50CSAgICBpZHgxOworICAgIGxvbmcgICAgdmFsOworCisgICAgLyoKKyAgICAgKiBJZiBHVUkgaXMgKGdvaW5nIHRvIGJlKSB1c2VkLCB3ZSBjYW4gYWx3YXlzIHNldCB0aGUgd2luZG93IHRpdGxlIGFuZAorICAgICAqIGljb24gbmFtZS4gIFNhdmVzIGEgYml0IG9mIHRpbWUsIGJlY2F1c2UgdGhlIFgxMSBkaXNwbGF5IHNlcnZlciBkb2VzCisgICAgICogbm90IG5lZWQgdG8gYmUgY29udGFjdGVkLgorICAgICAqLworICAgIGlkeDEgPSBmaW5kb3B0aW9uKChjaGFyX3UgKikidGl0bGUiKTsKKyAgICBpZiAoIShvcHRpb25zW2lkeDFdLmZsYWdzICYgUF9XQVNfU0VUKSkKKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLnN0YXJ0aW5nIHx8IGd1aS5pbl91c2UpCisJICAgIHZhbCA9IFRSVUU7CisJZWxzZQorI2VuZGlmCisJICAgIHZhbCA9IG1jaF9jYW5fcmVzdG9yZV90aXRsZSgpOworCW9wdGlvbnNbaWR4MV0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IChjaGFyX3UgKil2YWw7CisJcF90aXRsZSA9IHZhbDsKKyAgICB9CisgICAgaWR4MSA9IGZpbmRvcHRpb24oKGNoYXJfdSAqKSJpY29uIik7CisgICAgaWYgKCEob3B0aW9uc1tpZHgxXS5mbGFncyAmIFBfV0FTX1NFVCkpCisgICAgeworI2lmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5zdGFydGluZyB8fCBndWkuaW5fdXNlKQorCSAgICB2YWwgPSBUUlVFOworCWVsc2UKKyNlbmRpZgorCSAgICB2YWwgPSBtY2hfY2FuX3Jlc3RvcmVfaWNvbigpOworCW9wdGlvbnNbaWR4MV0uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IChjaGFyX3UgKil2YWw7CisJcF9pY29uID0gdmFsOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogUGFyc2UgJ2FyZycgZm9yIG9wdGlvbiBzZXR0aW5ncy4KKyAqCisgKiAnYXJnJyBtYXkgYmUgSU9idWZmLCBidXQgb25seSB3aGVuIG5vIGVycm9ycyBjYW4gYmUgcHJlc2VudCBhbmQgb3B0aW9uCisgKiBkb2VzIG5vdCBuZWVkIHRvIGJlIGV4cGFuZGVkIHdpdGggb3B0aW9uX2V4cGFuZCgpLgorICogIm9wdF9mbGFncyI6CisgKiAwIGZvciAiOnNldCIKKyAqIE9QVF9HTE9CQUwgZm9yICI6c2V0Z2xvYmFsIgorICogT1BUX0xPQ0FMIGZvciAiOnNldGxvY2FsIiBhbmQgYSBtb2RlbGluZQorICogT1BUX01PREVMSU5FIGZvciBhIG1vZGVsaW5lCisgKgorICogcmV0dXJucyBGQUlMIGlmIGFuIGVycm9yIGlzIGRldGVjdGVkLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorZG9fc2V0KGFyZywgb3B0X2ZsYWdzKQorICAgIGNoYXJfdQkqYXJnOwkJLyogb3B0aW9uIHN0cmluZyAobWF5IGJlIHdyaXR0ZW4gdG8hKSAqLworICAgIGludAkJb3B0X2ZsYWdzOworeworICAgIGludAkJb3B0X2lkeDsKKyAgICBjaGFyX3UJKmVycm1zZzsKKyAgICBjaGFyX3UJZXJyYnVmWzgwXTsKKyAgICBjaGFyX3UJKnN0YXJ0YXJnOworICAgIGludAkJcHJlZml4OwkvKiAxOiBub3RoaW5nLCAwOiAibm8iLCAyOiAiaW52IiBpbiBmcm9udCBvZiBuYW1lICovCisgICAgaW50CQluZXh0Y2hhcjsJICAgIC8qIG5leHQgbm9uLXdoaXRlIGNoYXIgYWZ0ZXIgb3B0aW9uIG5hbWUgKi8KKyAgICBpbnQJCWFmdGVyY2hhcjsJICAgIC8qIGNoYXJhY3RlciBqdXN0IGFmdGVyIG9wdGlvbiBuYW1lICovCisgICAgaW50CQlsZW47CisgICAgaW50CQlpOworICAgIGxvbmcJdmFsdWU7CisgICAgaW50CQlrZXk7CisgICAgbG9uZ191CWZsYWdzOwkJICAgIC8qIGZsYWdzIGZvciBjdXJyZW50IG9wdGlvbiAqLworICAgIGNoYXJfdQkqdmFycCA9IE5VTEw7CSAgICAvKiBwb2ludGVyIHRvIHZhcmlhYmxlIGZvciBjdXJyZW50IG9wdGlvbiAqLworICAgIGludAkJZGlkX3Nob3cgPSBGQUxTRTsgICAvKiBhbHJlYWR5IHNob3dlZCBvbmUgdmFsdWUgKi8KKyAgICBpbnQJCWFkZGluZzsJCSAgICAvKiAib3B0Kz1hcmciICovCisgICAgaW50CQlwcmVwZW5kaW5nOwkgICAgLyogIm9wdF49YXJnIiAqLworICAgIGludAkJcmVtb3Zpbmc7CSAgICAvKiAib3B0LT1hcmciICovCisgICAgaW50CQljcF92YWwgPSAwOworICAgIGNoYXJfdQlrZXlfbmFtZVsyXTsKKworICAgIGlmICgqYXJnID09IE5VTCkKKyAgICB7CisJc2hvd29wdGlvbnMoMCwgb3B0X2ZsYWdzKTsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgd2hpbGUgKCphcmcgIT0gTlVMKQkJLyogbG9vcCB0byBwcm9jZXNzIGFsbCBvcHRpb25zICovCisgICAgeworCWVycm1zZyA9IE5VTEw7CisJc3RhcnRhcmcgPSBhcmc7CQkvKiByZW1lbWJlciBmb3IgZXJyb3IgbWVzc2FnZSAqLworCisJaWYgKFNUUk5DTVAoYXJnLCAiYWxsIiwgMykgPT0gMCAmJiAhaXNhbHBoYShhcmdbM10pKQorCXsKKwkgICAgLyoKKwkgICAgICogIjpzZXQgYWxsIiAgc2hvdyBhbGwgb3B0aW9ucy4KKwkgICAgICogIjpzZXQgYWxsJiIgc2V0IGFsbCBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisJICAgICAqLworCSAgICBhcmcgKz0gMzsKKwkgICAgaWYgKCphcmcgPT0gJyYnKQorCSAgICB7CisJCSsrYXJnOworCQkvKiBPbmx5IGZvciA6c2V0IGNvbW1hbmQgc2V0IGdsb2JhbCB2YWx1ZSBvZiBsb2NhbCBvcHRpb25zLiAqLworCQlzZXRfb3B0aW9uc19kZWZhdWx0KE9QVF9GUkVFIHwgb3B0X2ZsYWdzKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXNob3dvcHRpb25zKDEsIG9wdF9mbGFncyk7CisJfQorCWVsc2UgaWYgKFNUUk5DTVAoYXJnLCAidGVybWNhcCIsIDcpID09IDApCisJeworCSAgICBzaG93b3B0aW9ucygyLCBvcHRfZmxhZ3MpOworCSAgICBzaG93X3Rlcm1jb2RlcygpOworCSAgICBhcmcgKz0gNzsKKwl9CisJZWxzZQorCXsKKwkgICAgcHJlZml4ID0gMTsKKwkgICAgaWYgKFNUUk5DTVAoYXJnLCAibm8iLCAyKSA9PSAwKQorCSAgICB7CisJCXByZWZpeCA9IDA7CisJCWFyZyArPSAyOworCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUk5DTVAoYXJnLCAiaW52IiwgMykgPT0gMCkKKwkgICAgeworCQlwcmVmaXggPSAyOworCQlhcmcgKz0gMzsKKwkgICAgfQorCisJICAgIC8qIGZpbmQgZW5kIG9mIG5hbWUgKi8KKwkgICAga2V5ID0gMDsKKwkgICAgaWYgKCphcmcgPT0gJzwnKQorCSAgICB7CisJCW5leHRjaGFyID0gMDsKKwkJb3B0X2lkeCA9IC0xOworCQkvKiBsb29rIG91dCBmb3IgPHRfPjs+ICovCisJCWlmIChhcmdbMV0gPT0gJ3QnICYmIGFyZ1syXSA9PSAnXycgJiYgYXJnWzNdICYmIGFyZ1s0XSkKKwkJICAgIGxlbiA9IDU7CisJCWVsc2UKKwkJeworCQkgICAgbGVuID0gMTsKKwkJICAgIHdoaWxlIChhcmdbbGVuXSAhPSBOVUwgJiYgYXJnW2xlbl0gIT0gJz4nKQorCQkJKytsZW47CisJCX0KKwkJaWYgKGFyZ1tsZW5dICE9ICc+JykKKwkJeworCQkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJCSAgICBnb3RvIHNraXA7CisJCX0KKwkJYXJnW2xlbl0gPSBOVUw7CQkJICAgIC8qIHB1dCBOVUwgYWZ0ZXIgbmFtZSAqLworCQlpZiAoYXJnWzFdID09ICd0JyAmJiBhcmdbMl0gPT0gJ18nKSAvKiBjb3VsZCBiZSB0ZXJtIGNvZGUgKi8KKwkJICAgIG9wdF9pZHggPSBmaW5kb3B0aW9uKGFyZyArIDEpOworCQlhcmdbbGVuKytdID0gJz4nOwkJICAgIC8qIHJlc3RvcmUgJz4nICovCisJCWlmIChvcHRfaWR4ID09IC0xKQorCQkgICAga2V5ID0gZmluZF9rZXlfb3B0aW9uKGFyZyArIDEpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlsZW4gPSAwOworCQkvKgorCQkgKiBUaGUgdHdvIGNoYXJhY3RlcnMgYWZ0ZXIgInRfIiBtYXkgbm90IGJlIGFscGhhbnVtZXJpYy4KKwkJICovCisJCWlmIChhcmdbMF0gPT0gJ3QnICYmIGFyZ1sxXSA9PSAnXycgJiYgYXJnWzJdICYmIGFyZ1szXSkKKwkJICAgIGxlbiA9IDQ7CisJCWVsc2UKKwkJICAgIHdoaWxlIChBU0NJSV9JU0FMTlVNKGFyZ1tsZW5dKSB8fCBhcmdbbGVuXSA9PSAnXycpCisJCQkrK2xlbjsKKwkJbmV4dGNoYXIgPSBhcmdbbGVuXTsKKwkJYXJnW2xlbl0gPSBOVUw7CQkJICAgIC8qIHB1dCBOVUwgYWZ0ZXIgbmFtZSAqLworCQlvcHRfaWR4ID0gZmluZG9wdGlvbihhcmcpOworCQlhcmdbbGVuXSA9IG5leHRjaGFyOwkJICAgIC8qIHJlc3RvcmUgbmV4dGNoYXIgKi8KKwkJaWYgKG9wdF9pZHggPT0gLTEpCisJCSAgICBrZXkgPSBmaW5kX2tleV9vcHRpb24oYXJnKTsKKwkgICAgfQorCisJICAgIC8qIHJlbWVtYmVyIGNoYXJhY3RlciBhZnRlciBvcHRpb24gbmFtZSAqLworCSAgICBhZnRlcmNoYXIgPSBhcmdbbGVuXTsKKworCSAgICAvKiBza2lwIHdoaXRlIHNwYWNlLCBhbGxvdyAiOnNldCBhaSAgPyIgKi8KKwkgICAgd2hpbGUgKHZpbV9pc3doaXRlKGFyZ1tsZW5dKSkKKwkJKytsZW47CisKKwkgICAgYWRkaW5nID0gRkFMU0U7CisJICAgIHByZXBlbmRpbmcgPSBGQUxTRTsKKwkgICAgcmVtb3ZpbmcgPSBGQUxTRTsKKwkgICAgaWYgKGFyZ1tsZW5dICE9IE5VTCAmJiBhcmdbbGVuICsgMV0gPT0gJz0nKQorCSAgICB7CisJCWlmIChhcmdbbGVuXSA9PSAnKycpCisJCXsKKwkJICAgIGFkZGluZyA9IFRSVUU7CQkvKiAiKz0iICovCisJCSAgICArK2xlbjsKKwkJfQorCQllbHNlIGlmIChhcmdbbGVuXSA9PSAnXicpCisJCXsKKwkJICAgIHByZXBlbmRpbmcgPSBUUlVFOwkJLyogIl49IiAqLworCQkgICAgKytsZW47CisJCX0KKwkJZWxzZSBpZiAoYXJnW2xlbl0gPT0gJy0nKQorCQl7CisJCSAgICByZW1vdmluZyA9IFRSVUU7CQkvKiAiLT0iICovCisJCSAgICArK2xlbjsKKwkJfQorCSAgICB9CisJICAgIG5leHRjaGFyID0gYXJnW2xlbl07CisKKwkgICAgaWYgKG9wdF9pZHggPT0gLTEgJiYga2V5ID09IDApCS8qIGZvdW5kIGEgbWlzbWF0Y2g6IHNraXAgKi8KKwkgICAgeworCQllcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1MTg6IFVua25vd24gb3B0aW9uIik7CisJCWdvdG8gc2tpcDsKKwkgICAgfQorCisJICAgIGlmIChvcHRfaWR4ID49IDApCisJICAgIHsKKwkJaWYgKG9wdGlvbnNbb3B0X2lkeF0udmFyID09IE5VTEwpICAgLyogaGlkZGVuIG9wdGlvbjogc2tpcCAqLworCQl7CisJCSAgICAvKiBPbmx5IGdpdmUgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHJlcXVlc3RpbmcgdGhlIHZhbHVlIG9mCisJCSAgICAgKiBhIGhpZGRlbiBvcHRpb24sIGlnbm9yZSBzZXR0aW5nIGl0LiAqLworCQkgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSI9OiEmPCIsIG5leHRjaGFyKSA9PSBOVUxMCisJCQkgICAgJiYgKCEob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfQk9PTCkKKwkJCQl8fCBuZXh0Y2hhciA9PSAnPycpKQorCQkJZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIpOworCQkgICAgZ290byBza2lwOworCQl9CisKKwkJZmxhZ3MgPSBvcHRpb25zW29wdF9pZHhdLmZsYWdzOworCQl2YXJwID0gZ2V0X3ZhcnBfc2NvcGUoJihvcHRpb25zW29wdF9pZHhdKSwgb3B0X2ZsYWdzKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZmxhZ3MgPSBQX1NUUklORzsKKwkJaWYgKGtleSA8IDApCisJCXsKKwkJICAgIGtleV9uYW1lWzBdID0gS0VZMlRFUk1DQVAwKGtleSk7CisJCSAgICBrZXlfbmFtZVsxXSA9IEtFWTJURVJNQ0FQMShrZXkpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAga2V5X25hbWVbMF0gPSBLU19LRVk7CisJCSAgICBrZXlfbmFtZVsxXSA9IChrZXkgJiAweGZmKTsKKwkJfQorCSAgICB9CisKKwkgICAgLyogRGlzYWxsb3cgY2hhbmdpbmcgc29tZSBvcHRpb25zIGZyb20gbW9kZWxpbmVzICovCisJICAgIGlmICgob3B0X2ZsYWdzICYgT1BUX01PREVMSU5FKSAmJiAoZmxhZ3MgJiBQX1NFQ1VSRSkpCisJICAgIHsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiKTsKKwkJZ290byBza2lwOworCSAgICB9CisKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKwkgICAgLyogRGlzYWxsb3cgY2hhbmdpbmcgc29tZSBvcHRpb25zIGluIHRoZSBzYW5kYm94ICovCisJICAgIGlmIChzYW5kYm94ID4gMCAmJiAoZmxhZ3MgJiBQX1NFQ1VSRSkpCisJICAgIHsKKwkJZXJybXNnID0gKGNoYXJfdSAqKV8oZV9zYW5kYm94KTsKKwkJZ290byBza2lwOworCSAgICB9CisjZW5kaWYKKworCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopIj89OiEmPCIsIG5leHRjaGFyKSAhPSBOVUxMKQorCSAgICB7CisJCWFyZyArPSBsZW47CisJCWNwX3ZhbCA9IHBfY3A7CisJCWlmIChuZXh0Y2hhciA9PSAnJicgJiYgYXJnWzFdID09ICd2JyAmJiBhcmdbMl0gPT0gJ2knKQorCQl7CisJCSAgICBpZiAoYXJnWzNdID09ICdtJykJLyogIm9wdCZ2aW0iOiBzZXQgdG8gVmltIGRlZmF1bHQgKi8KKwkJICAgIHsKKwkJCWNwX3ZhbCA9IEZBTFNFOworCQkJYXJnICs9IDM7CisJCSAgICB9CisJCSAgICBlbHNlCQkvKiAib3B0JnZpIjogc2V0IHRvIFZpIGRlZmF1bHQgKi8KKwkJICAgIHsKKwkJCWNwX3ZhbCA9IFRSVUU7CisJCQlhcmcgKz0gMjsKKwkJICAgIH0KKwkJfQorCQlpZiAodmltX3N0cmNocigoY2hhcl91ICopIj8hJjwiLCBuZXh0Y2hhcikgIT0gTlVMTAorCQkJJiYgYXJnWzFdICE9IE5VTCAmJiAhdmltX2lzd2hpdGUoYXJnWzFdKSkKKwkJeworCQkgICAgZXJybXNnID0gZV90cmFpbGluZzsKKwkJICAgIGdvdG8gc2tpcDsKKwkJfQorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogYWxsb3cgJz0nIGFuZCAnOicgYXMgTVNET1MgY29tbWFuZC5jb20gYWxsb3dzIG9ubHkgb25lCisJICAgICAqICc9JyBjaGFyYWN0ZXIgcGVyICJzZXQiIGNvbW1hbmQgbGluZS4gZ3Jyci4gKGp3KQorCSAgICAgKi8KKwkgICAgaWYgKG5leHRjaGFyID09ICc/JworCQkgICAgfHwgKHByZWZpeCA9PSAxCisJCQkmJiB2aW1fc3RyY2hyKChjaGFyX3UgKikiPTomPCIsIG5leHRjaGFyKSA9PSBOVUxMCisJCQkmJiAhKGZsYWdzICYgUF9CT09MKSkpCisJICAgIHsKKwkJLyoKKwkJICogcHJpbnQgdmFsdWUKKwkJICovCisJCWlmIChkaWRfc2hvdykKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOwkgICAgLyogY3Vyc29yIGJlbG93IGxhc3Qgb25lICovCisJCWVsc2UKKwkJeworCQkgICAgZ290b2NtZGxpbmUoVFJVRSk7CSAgICAvKiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUgKi8KKwkJICAgIGRpZF9zaG93ID0gVFJVRTsJICAgIC8qIHJlbWVtYmVyIHRoYXQgd2UgZGlkIGEgbGluZSAqLworCQl9CisJCWlmIChvcHRfaWR4ID49IDApCisJCXsKKwkJICAgIHNob3dvbmVvcHQoJm9wdGlvbnNbb3B0X2lkeF0sIG9wdF9mbGFncyk7CisjaWZkZWYgRkVBVF9FVkFMCisJCSAgICBpZiAocF92ZXJib3NlID4gMCkKKwkJICAgIHsKKwkJCWlmIChvcHRpb25zW29wdF9pZHhdLnNjcmlwdElEICE9IDApCisJCQl7CisJCQkgICAgTVNHX1BVVFMoXygiXG5cdExhc3Qgc2V0IGZyb20gIikpOworCQkJICAgIE1TR19QVVRTKGdldF9zY3JpcHRuYW1lKG9wdGlvbnNbb3B0X2lkeF0uc2NyaXB0SUQpKTsKKwkJCX0KKwkJICAgIH0KKyNlbmRpZgorCQl9CisJCWVsc2UKKwkJeworCQkgICAgY2hhcl91CSAgICAqcDsKKworCQkgICAgcCA9IGZpbmRfdGVybWNvZGUoa2V5X25hbWUpOworCQkgICAgaWYgKHAgPT0gTlVMTCkKKwkJICAgIHsKKwkJCWVycm1zZyA9IChjaGFyX3UgKilOXygiRTUxODogVW5rbm93biBvcHRpb24iKTsKKwkJCWdvdG8gc2tpcDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCSh2b2lkKXNob3dfb25lX3Rlcm1jb2RlKGtleV9uYW1lLCBwLCBUUlVFKTsKKwkJfQorCQlpZiAobmV4dGNoYXIgIT0gJz8nCisJCQkmJiBuZXh0Y2hhciAhPSBOVUwgJiYgIXZpbV9pc3doaXRlKGFmdGVyY2hhcikpCisJCSAgICBlcnJtc2cgPSBlX3RyYWlsaW5nOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoZmxhZ3MgJiBQX0JPT0wpCQkgICAgLyogYm9vbGVhbiAqLworCQl7CisJCSAgICBpZiAobmV4dGNoYXIgPT0gJz0nIHx8IG5leHRjaGFyID09ICc6JykKKwkJICAgIHsKKwkJCWVycm1zZyA9IGVfaW52YXJnOworCQkJZ290byBza2lwOworCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICogIjpzZXQgb3B0ISI6IGludmVydAorCQkgICAgICogIjpzZXQgb3B0JiI6IHJlc2V0IHRvIGRlZmF1bHQgdmFsdWUKKwkJICAgICAqICI6c2V0IG9wdDwiOiByZXNldCB0byBnbG9iYWwgdmFsdWUKKwkJICAgICAqLworCQkgICAgaWYgKG5leHRjaGFyID09ICchJykKKwkJCXZhbHVlID0gKihpbnQgKikodmFycCkgXiAxOworCQkgICAgZWxzZSBpZiAobmV4dGNoYXIgPT0gJyYnKQorCQkJdmFsdWUgPSAoaW50KShsb25nKW9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFsKKwkJCQkJCSgoZmxhZ3MgJiBQX1ZJX0RFRikgfHwgY3BfdmFsKQorCQkJCQkJID8gIFZJX0RFRkFVTFQgOiBWSU1fREVGQVVMVF07CisJCSAgICBlbHNlIGlmIChuZXh0Y2hhciA9PSAnPCcpCisJCSAgICB7CisJCQkvKiBGb3IgJ2F1dG9yZWFkJyAtMSBtZWFucyB0byB1c2UgZ2xvYmFsIHZhbHVlLiAqLworCQkJaWYgKChpbnQgKil2YXJwID09ICZjdXJidWYtPmJfcF9hcgorCQkJCQkJICAgICYmIG9wdF9mbGFncyA9PSBPUFRfTE9DQUwpCisJCQkgICAgdmFsdWUgPSAtMTsKKwkJCWVsc2UKKwkJCSAgICB2YWx1ZSA9ICooaW50ICopZ2V0X3ZhcnBfc2NvcGUoJihvcHRpb25zW29wdF9pZHhdKSwKKwkJCQkJCQkJICBPUFRfR0xPQkFMKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qCisJCQkgKiAiOnNldCBpbnZvcHQiOiBpbnZlcnQKKwkJCSAqICI6c2V0IG9wdCIgb3IgIjpzZXQgbm9vcHQiOiBzZXQgb3IgcmVzZXQKKwkJCSAqLworCQkJaWYgKG5leHRjaGFyICE9IE5VTCAmJiAhdmltX2lzd2hpdGUoYWZ0ZXJjaGFyKSkKKwkJCXsKKwkJCSAgICBlcnJtc2cgPSBlX3RyYWlsaW5nOworCQkJICAgIGdvdG8gc2tpcDsKKwkJCX0KKwkJCWlmIChwcmVmaXggPT0gMikJLyogaW52ICovCisJCQkgICAgdmFsdWUgPSAqKGludCAqKSh2YXJwKSBeIDE7CisJCQllbHNlCisJCQkgICAgdmFsdWUgPSBwcmVmaXg7CisJCSAgICB9CisKKwkJICAgIGVycm1zZyA9IHNldF9ib29sX29wdGlvbihvcHRfaWR4LCB2YXJwLCAoaW50KXZhbHVlLAorCQkJCQkJCQkgICBvcHRfZmxhZ3MpOworCQl9CisJCWVsc2UJCQkJICAgIC8qIG51bWVyaWMgb3Igc3RyaW5nICovCisJCXsKKwkJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiPTomPCIsIG5leHRjaGFyKSA9PSBOVUxMCisJCQkJCQkJICAgICAgIHx8IHByZWZpeCAhPSAxKQorCQkgICAgeworCQkJZXJybXNnID0gZV9pbnZhcmc7CisJCQlnb3RvIHNraXA7CisJCSAgICB9CisKKwkJICAgIGlmIChmbGFncyAmIFBfTlVNKQkJICAgIC8qIG51bWVyaWMgKi8KKwkJICAgIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQgd2F5cyB0byBzZXQgYSBudW1iZXIgb3B0aW9uOgorCQkJICogJgkgICAgc2V0IHRvIGRlZmF1bHQgdmFsdWUKKwkJCSAqIDwJICAgIHNldCB0byBnbG9iYWwgdmFsdWUKKwkJCSAqIDx4eD4JICAgIGFjY2VwdCBzcGVjaWFsIGtleSBjb2RlcyBmb3IgJ3dpbGRjaGFyJworCQkJICogYwkgICAgYWNjZXB0IGFueSBub24tZGlnaXQgZm9yICd3aWxkY2hhcicKKwkJCSAqIFstXTAtOSAgIHNldCBudW1iZXIKKwkJCSAqIG90aGVyICAgIGVycm9yCisJCQkgKi8KKwkJCSsrYXJnOworCQkJaWYgKG5leHRjaGFyID09ICcmJykKKwkJCSAgICB2YWx1ZSA9IChsb25nKW9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFsKKwkJCQkJCSgoZmxhZ3MgJiBQX1ZJX0RFRikgfHwgY3BfdmFsKQorCQkJCQkJID8gIFZJX0RFRkFVTFQgOiBWSU1fREVGQVVMVF07CisJCQllbHNlIGlmIChuZXh0Y2hhciA9PSAnPCcpCisJCQkgICAgdmFsdWUgPSAqKGxvbmcgKilnZXRfdmFycF9zY29wZSgmKG9wdGlvbnNbb3B0X2lkeF0pLAorCQkJCQkJCQkgIE9QVF9HTE9CQUwpOworCQkJZWxzZSBpZiAoKChsb25nICopdmFycCA9PSAmcF93YworCQkJCSAgICB8fCAobG9uZyAqKXZhcnAgPT0gJnBfd2NtKQorCQkJCSYmICgqYXJnID09ICc8JworCQkJCSAgICB8fCAqYXJnID09ICdeJworCQkJCSAgICB8fCAoKCFhcmdbMV0gfHwgdmltX2lzd2hpdGUoYXJnWzFdKSkKKwkJCQkJJiYgIVZJTV9JU0RJR0lUKCphcmcpKSkpCisJCQl7CisJCQkgICAgdmFsdWUgPSBzdHJpbmdfdG9fa2V5KGFyZyk7CisJCQkgICAgaWYgKHZhbHVlID09IDAgJiYgKGxvbmcgKil2YXJwICE9ICZwX3djbSkKKwkJCSAgICB7CisJCQkJZXJybXNnID0gZV9pbnZhcmc7CisJCQkJZ290byBza2lwOworCQkJICAgIH0KKwkJCX0KKwkJCQkvKiBhbGxvdyBuZWdhdGl2ZSBudW1iZXJzIChmb3IgJ3VuZG9sZXZlbHMnKSAqLworCQkJZWxzZSBpZiAoKmFyZyA9PSAnLScgfHwgVklNX0lTRElHSVQoKmFyZykpCisJCQl7CisJCQkgICAgaSA9IDA7CisJCQkgICAgaWYgKCphcmcgPT0gJy0nKQorCQkJCWkgPSAxOworI2lmZGVmIEhBVkVfU1RSVE9MCisJCQkgICAgdmFsdWUgPSBzdHJ0b2woKGNoYXIgKilhcmcsIE5VTEwsIDApOworCQkJICAgIGlmIChhcmdbaV0gPT0gJzAnICYmIFRPTE9XRVJfQVNDKGFyZ1tpICsgMV0pID09ICd4JykKKwkJCQlpICs9IDI7CisjZWxzZQorCQkJICAgIHZhbHVlID0gYXRvbCgoY2hhciAqKWFyZyk7CisjZW5kaWYKKwkJCSAgICB3aGlsZSAoVklNX0lTRElHSVQoYXJnW2ldKSkKKwkJCQkrK2k7CisJCQkgICAgaWYgKGFyZ1tpXSAhPSBOVUwgJiYgIXZpbV9pc3doaXRlKGFyZ1tpXSkpCisJCQkgICAgeworCQkJCWVycm1zZyA9IGVfaW52YXJnOworCQkJCWdvdG8gc2tpcDsKKwkJCSAgICB9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTIxOiBOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIpOworCQkJICAgIGdvdG8gc2tpcDsKKwkJCX0KKworCQkJaWYgKGFkZGluZykKKwkJCSAgICB2YWx1ZSA9ICoobG9uZyAqKXZhcnAgKyB2YWx1ZTsKKwkJCWlmIChwcmVwZW5kaW5nKQorCQkJICAgIHZhbHVlID0gKihsb25nICopdmFycCAqIHZhbHVlOworCQkJaWYgKHJlbW92aW5nKQorCQkJICAgIHZhbHVlID0gKihsb25nICopdmFycCAtIHZhbHVlOworCQkJZXJybXNnID0gc2V0X251bV9vcHRpb24ob3B0X2lkeCwgdmFycCwgdmFsdWUsCisJCQkJCQkJICAgZXJyYnVmLCBvcHRfZmxhZ3MpOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAob3B0X2lkeCA+PSAwKQkJICAgIC8qIHN0cmluZyAqLworCQkgICAgeworCQkJY2hhcl91CSAgICAqc2F2ZV9hcmcgPSBOVUxMOworCQkJY2hhcl91CSAgICAqcyA9IE5VTEw7CisJCQljaGFyX3UJICAgICpvbGR2YWw7CS8qIHByZXZpb3VzIHZhbHVlIGlmICp2YXJwICovCisJCQljaGFyX3UJICAgICpuZXd2YWw7CisJCQljaGFyX3UJICAgICpvcmlndmFsOworCQkJdW5zaWduZWQgICAgbmV3bGVuOworCQkJaW50CSAgICBjb21tYTsKKwkJCWludAkgICAgYnM7CisJCQlpbnQJICAgIG5ld192YWx1ZV9hbGxvY2VkOwkvKiBuZXcgc3RyaW5nIG9wdGlvbgorCQkJCQkJCSAgIHdhcyBhbGxvY2F0ZWQgKi8KKworCQkJLyogV2hlbiB1c2luZyAiOnNldCBvcHQ9dmFsIiBmb3IgYSBnbG9iYWwgb3B0aW9uCisJCQkgKiB3aXRoIGEgbG9jYWwgdmFsdWUgdGhlIGxvY2FsIHZhbHVlIHdpbGwgYmUKKwkJCSAqIHJlc2V0LCB1c2UgdGhlIGdsb2JhbCB2YWx1ZSBoZXJlLiAqLworCQkJaWYgKChvcHRfZmxhZ3MgJiAoT1BUX0xPQ0FMIHwgT1BUX0dMT0JBTCkpID09IDAKKwkJCQkmJiAoaW50KW9wdGlvbnNbb3B0X2lkeF0uaW5kaXIgPj0gUFZfQk9USCkKKwkJCSAgICB2YXJwID0gb3B0aW9uc1tvcHRfaWR4XS52YXI7CisKKwkJCS8qIFRoZSBvbGQgdmFsdWUgaXMga2VwdCB1bnRpbCB3ZSBhcmUgc3VyZSB0aGF0IHRoZQorCQkJICogbmV3IHZhbHVlIGlzIHZhbGlkLiAqLworCQkJb2xkdmFsID0gKihjaGFyX3UgKiopdmFycDsKKwkJCWlmIChuZXh0Y2hhciA9PSAnJicpCS8qIHNldCB0byBkZWZhdWx0IHZhbCAqLworCQkJeworCQkJICAgIG5ld3ZhbCA9IG9wdGlvbnNbb3B0X2lkeF0uZGVmX3ZhbFsKKwkJCQkJCSgoZmxhZ3MgJiBQX1ZJX0RFRikgfHwgY3BfdmFsKQorCQkJCQkJID8gIFZJX0RFRkFVTFQgOiBWSU1fREVGQVVMVF07CisJCQkgICAgaWYgKChjaGFyX3UgKiopdmFycCA9PSAmcF9iZykKKwkJCSAgICB7CisJCQkJLyogZ3Vlc3MgdGhlIHZhbHVlIG9mICdiYWNrZ3JvdW5kJyAqLworI2lmZGVmIEZFQVRfR1VJCisJCQkJaWYgKGd1aS5pbl91c2UpCisJCQkJICAgIG5ld3ZhbCA9IGd1aV9iZ19kZWZhdWx0KCk7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJICAgIGlmIChTVFJDTVAoVF9OQU1FLCAibGludXgiKSA9PSAwKQorCQkJCQluZXd2YWwgPSAoY2hhcl91ICopImRhcmsiOworCQkJICAgIH0KKworCQkJICAgIC8qIGV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIH4gKHNpbmNlIHRoZQorCQkJICAgICAqIGRlZmF1bHQgdmFsdWUgd2FzIGFscmVhZHkgZXhwYW5kZWQsIG9ubHkKKwkJCSAgICAgKiByZXF1aXJlZCB3aGVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBzZXQKKwkJCSAgICAgKiBsYXRlciAqLworCQkJICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKKwkJCQluZXd2YWwgPSBlbXB0eV9vcHRpb247CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQlzID0gb3B0aW9uX2V4cGFuZChvcHRfaWR4LCBuZXd2YWwpOworCQkJCWlmIChzID09IE5VTEwpCisJCQkJICAgIHMgPSBuZXd2YWw7CisJCQkJbmV3dmFsID0gdmltX3N0cnNhdmUocyk7CisJCQkgICAgfQorCQkJICAgIG5ld192YWx1ZV9hbGxvY2VkID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UgaWYgKG5leHRjaGFyID09ICc8JykJLyogc2V0IHRvIGdsb2JhbCB2YWwgKi8KKwkJCXsKKwkJCSAgICBuZXd2YWwgPSB2aW1fc3Ryc2F2ZSgqKGNoYXJfdSAqKilnZXRfdmFycF9zY29wZSgKKwkJCQkJICAgICAmKG9wdGlvbnNbb3B0X2lkeF0pLCBPUFRfR0xPQkFMKSk7CisJCQkgICAgbmV3X3ZhbHVlX2FsbG9jZWQgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgICsrYXJnOwkvKiBqdW1wIHRvIGFmdGVyIHRoZSAnPScgb3IgJzonICovCisKKwkJCSAgICAvKgorCQkJICAgICAqIFNldCAna2V5d29yZHByZycgdG8gIjpoZWxwIiBpZiBhbiBlbXB0eQorCQkJICAgICAqIHZhbHVlIHdhcyBwYXNzZWQgdG8gOnNldCBieSB0aGUgdXNlci4KKwkJCSAgICAgKiBNaXN1c2UgZXJyYnVmW10gZm9yIHRoZSByZXN1bHRpbmcgc3RyaW5nLgorCQkJICAgICAqLworCQkJICAgIGlmICh2YXJwID09IChjaGFyX3UgKikmcF9rcAorCQkJCQkgICAgICAmJiAoKmFyZyA9PSBOVUwgfHwgKmFyZyA9PSAnICcpKQorCQkJICAgIHsKKwkJCQlTVFJDUFkoZXJyYnVmLCAiOmhlbHAiKTsKKwkJCQlzYXZlX2FyZyA9IGFyZzsKKwkJCQlhcmcgPSBlcnJidWY7CisJCQkgICAgfQorCQkJICAgIC8qCisJCQkgICAgICogQ29udmVydCAnd2hpY2h3cmFwJyBudW1iZXIgdG8gc3RyaW5nLCBmb3IKKwkJCSAgICAgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFZpbSAzLjAuCisJCQkgICAgICogTWlzdXNlIGVycmJ1ZltdIGZvciB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKwkJCSAgICAgKi8KKwkJCSAgICBlbHNlIGlmICh2YXJwID09IChjaGFyX3UgKikmcF93dworCQkJCQkJCSAmJiBWSU1fSVNESUdJVCgqYXJnKSkKKwkJCSAgICB7CisJCQkJKmVycmJ1ZiA9IE5VTDsKKwkJCQlpID0gZ2V0ZGlnaXRzKCZhcmcpOworCQkJCWlmIChpICYgMSkKKwkJCQkgICAgU1RSQ0FUKGVycmJ1ZiwgImIsIik7CisJCQkJaWYgKGkgJiAyKQorCQkJCSAgICBTVFJDQVQoZXJyYnVmLCAicywiKTsKKwkJCQlpZiAoaSAmIDQpCisJCQkJICAgIFNUUkNBVChlcnJidWYsICJoLGwsIik7CisJCQkJaWYgKGkgJiA4KQorCQkJCSAgICBTVFJDQVQoZXJyYnVmLCAiPCw+LCIpOworCQkJCWlmIChpICYgMTYpCisJCQkJICAgIFNUUkNBVChlcnJidWYsICJbLF0sIik7CisJCQkJaWYgKCplcnJidWYgIT0gTlVMKQkvKiByZW1vdmUgdHJhaWxpbmcgLCAqLworCQkJCSAgICBlcnJidWZbU1RSTEVOKGVycmJ1ZikgLSAxXSA9IE5VTDsKKwkJCQlzYXZlX2FyZyA9IGFyZzsKKwkJCQlhcmcgPSBlcnJidWY7CisJCQkgICAgfQorCQkJICAgIC8qCisJCQkgICAgICogUmVtb3ZlICc+JyBiZWZvcmUgJ2RpcicgYW5kICdiZGlyJywgZm9yCisJCQkgICAgICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIDMuMAorCQkJICAgICAqLworCQkJICAgIGVsc2UgaWYgKCAgKmFyZyA9PSAnPicKKwkJCQkgICAgJiYgKHZhcnAgPT0gKGNoYXJfdSAqKSZwX2RpcgorCQkJCQkgICAgfHwgdmFycCA9PSAoY2hhcl91ICopJnBfYmRpcikpCisJCQkgICAgeworCQkJCSsrYXJnOworCQkJICAgIH0KKworCQkJICAgIC8qIFdoZW4gc2V0dGluZyB0aGUgbG9jYWwgdmFsdWUgb2YgYSBnbG9iYWwKKwkJCSAgICAgKiBvcHRpb24sIHRoZSBvbGQgdmFsdWUgbWF5IGJlIHRoZSBnbG9iYWwgdmFsdWUuICovCisJCQkgICAgaWYgKChpbnQpb3B0aW9uc1tvcHRfaWR4XS5pbmRpciA+PSBQVl9CT1RICisJCQkJCQkgICAmJiAob3B0X2ZsYWdzICYgT1BUX0xPQ0FMKSkKKwkJCQlvcmlndmFsID0gKihjaGFyX3UgKiopZ2V0X3ZhcnAoCisJCQkJCQkJICAgJm9wdGlvbnNbb3B0X2lkeF0pOworCQkJICAgIGVsc2UKKwkJCQlvcmlndmFsID0gb2xkdmFsOworCisJCQkgICAgLyoKKwkJCSAgICAgKiBDb3B5IHRoZSBuZXcgc3RyaW5nIGludG8gYWxsb2NhdGVkIG1lbW9yeS4KKwkJCSAgICAgKiBDYW4ndCB1c2Ugc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KCksIGJlY2F1c2UKKwkJCSAgICAgKiB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgYmFja3NsYXNoZXMuCisJCQkgICAgICovCisJCQkgICAgLyogZ2V0IGEgYml0IHRvbyBtdWNoICovCisJCQkgICAgbmV3bGVuID0gKHVuc2lnbmVkKVNUUkxFTihhcmcpICsgMTsKKwkJCSAgICBpZiAoYWRkaW5nIHx8IHByZXBlbmRpbmcgfHwgcmVtb3ZpbmcpCisJCQkJbmV3bGVuICs9ICh1bnNpZ25lZClTVFJMRU4ob3JpZ3ZhbCkgKyAxOworCQkJICAgIG5ld3ZhbCA9IGFsbG9jKG5ld2xlbik7CisJCQkgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKSAgLyogb3V0IG9mIG1lbSwgZG9uJ3QgY2hhbmdlICovCisJCQkJYnJlYWs7CisJCQkgICAgcyA9IG5ld3ZhbDsKKworCQkJICAgIC8qCisJCQkgICAgICogQ29weSB0aGUgc3RyaW5nLCBza2lwIG92ZXIgZXNjYXBlZCBjaGFycy4KKwkJCSAgICAgKiBGb3IgTVMtRE9TIGFuZCBXSU4zMiBiYWNrc2xhc2hlcyBiZWZvcmUgbm9ybWFsCisJCQkgICAgICogZmlsZSBuYW1lIGNoYXJhY3RlcnMgYXJlIG5vdCByZW1vdmVkLCBhbmQga2VlcAorCQkJICAgICAqIGJhY2tzbGFzaCBhdCBzdGFydCwgZm9yICJcXG1hY2hpbmVccGF0aCIsIGJ1dAorCQkJICAgICAqIGRvIHJlbW92ZSBpdCBmb3IgIlxcXFxtYWNoaW5lXFxwYXRoIi4KKwkJCSAgICAgKiBUaGUgcmV2ZXJzZSBpcyBmb3VuZCBpbiBFeHBhbmRPbGRTZXR0aW5nKCkuCisJCQkgICAgICovCisJCQkgICAgd2hpbGUgKCphcmcgJiYgIXZpbV9pc3doaXRlKCphcmcpKQorCQkJICAgIHsKKwkJCQlpZiAoKmFyZyA9PSAnXFwnICYmIGFyZ1sxXSAhPSBOVUwKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJCQkJJiYgISgoZmxhZ3MgJiBQX0VYUEFORCkKKwkJCQkJCSYmIHZpbV9pc2ZpbGVjKGFyZ1sxXSkKKwkJCQkJCSYmIChhcmdbMV0gIT0gJ1xcJworCQkJCQkJICAgIHx8IChzID09IG5ld3ZhbAorCQkJCQkJCSYmIGFyZ1syXSAhPSAnXFwnKSkpCisjZW5kaWYKKwkJCQkJCQkJICAgICkKKwkJCQkgICAgKythcmc7CS8qIHJlbW92ZSBiYWNrc2xhc2ggKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJCQkJaWYgKGhhc19tYnl0ZQorCQkJCQkmJiAoaSA9ICgqbWJfcHRyMmxlbl9jaGVjaykoYXJnKSkgPiAxKQorCQkJCXsKKwkJCQkgICAgLyogY29weSBtdWx0aWJ5dGUgY2hhciAqLworCQkJCSAgICBtY2hfbWVtbW92ZShzLCBhcmcsIChzaXplX3QpaSk7CisJCQkJICAgIGFyZyArPSBpOworCQkJCSAgICBzICs9IGk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZgorCQkJCSAgICAqcysrID0gKmFyZysrOworCQkJICAgIH0KKwkJCSAgICAqcyA9IE5VTDsKKworCQkJICAgIC8qCisJCQkgICAgICogRXhwYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgfi4KKwkJCSAgICAgKiBEb24ndCBkbyBpdCB3aGVuIGFkZGluZyB3aXRob3V0IGluc2VydGluZyBhCisJCQkgICAgICogY29tbWEuCisJCQkgICAgICovCisJCQkgICAgaWYgKCEoYWRkaW5nIHx8IHByZXBlbmRpbmcgfHwgcmVtb3ZpbmcpCisJCQkJCQkJIHx8IChmbGFncyAmIFBfQ09NTUEpKQorCQkJICAgIHsKKwkJCQlzID0gb3B0aW9uX2V4cGFuZChvcHRfaWR4LCBuZXd2YWwpOworCQkJCWlmIChzICE9IE5VTEwpCisJCQkJeworCQkJCSAgICB2aW1fZnJlZShuZXd2YWwpOworCQkJCSAgICBuZXdsZW4gPSAodW5zaWduZWQpU1RSTEVOKHMpICsgMTsKKwkJCQkgICAgaWYgKGFkZGluZyB8fCBwcmVwZW5kaW5nIHx8IHJlbW92aW5nKQorCQkJCQluZXdsZW4gKz0gKHVuc2lnbmVkKVNUUkxFTihvcmlndmFsKSArIDE7CisJCQkJICAgIG5ld3ZhbCA9IGFsbG9jKG5ld2xlbik7CisJCQkJICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJICAgIFNUUkNQWShuZXd2YWwsIHMpOworCQkJCX0KKwkJCSAgICB9CisKKwkJCSAgICAvKiBsb2NhdGUgbmV3dmFsW10gaW4gb3JpZ3ZhbFtdIHdoZW4gcmVtb3ZpbmcgaXQKKwkJCSAgICAgKiBhbmQgd2hlbiBhZGRpbmcgdG8gYXZvaWQgZHVwbGljYXRlcyAqLworCQkJICAgIGkgPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKwkJCSAgICBpZiAocmVtb3ZpbmcgfHwgKGZsYWdzICYgUF9OT0RVUCkpCisJCQkgICAgeworCQkJCWkgPSAoaW50KVNUUkxFTihuZXd2YWwpOworCQkJCWJzID0gMDsKKwkJCQlmb3IgKHMgPSBvcmlndmFsOyAqczsgKytzKQorCQkJCXsKKwkJCQkgICAgaWYgKCghKGZsYWdzICYgUF9DT01NQSkKKwkJCQkJCXx8IHMgPT0gb3JpZ3ZhbAorCQkJCQkJfHwgKHNbLTFdID09ICcsJyAmJiAhKGJzICYgMSkpKQorCQkJCQkgICAgJiYgU1RSTkNNUChzLCBuZXd2YWwsIGkpID09IDAKKwkJCQkJICAgICYmICghKGZsYWdzICYgUF9DT01NQSkKKwkJCQkJCXx8IHNbaV0gPT0gJywnCisJCQkJCQl8fCBzW2ldID09IE5VTCkpCisJCQkJCWJyZWFrOworCQkJCSAgICAvKiBDb3VudCBiYWNrc3BhY2VzLiAgT25seSBhIGNvbW1hIHdpdGggYW4KKwkJCQkgICAgICogZXZlbiBudW1iZXIgb2YgYmFja3NwYWNlcyBiZWZvcmUgaXQgaXMKKwkJCQkgICAgICogcmVjb2duaXplZCBhcyBhIHNlcGFyYXRvciAqLworCQkJCSAgICBpZiAocyA+IG9yaWd2YWwgJiYgc1stMV0gPT0gJ1xcJykKKwkJCQkJKyticzsKKwkJCQkgICAgZWxzZQorCQkJCQlicyA9IDA7CisJCQkJfQorCisJCQkJLyogZG8gbm90IGFkZCBpZiBhbHJlYWR5IHRoZXJlICovCisJCQkJaWYgKChhZGRpbmcgfHwgcHJlcGVuZGluZykgJiYgKnMpCisJCQkJeworCQkJCSAgICBwcmVwZW5kaW5nID0gRkFMU0U7CisJCQkJICAgIGFkZGluZyA9IEZBTFNFOworCQkJCSAgICBTVFJDUFkobmV3dmFsLCBvcmlndmFsKTsKKwkJCQl9CisJCQkgICAgfQorCisJCQkgICAgLyogY29uY2F0ZW5hdGUgdGhlIHR3byBzdHJpbmdzOyBhZGQgYSAnLCcgaWYKKwkJCSAgICAgKiBuZWVkZWQgKi8KKwkJCSAgICBpZiAoYWRkaW5nIHx8IHByZXBlbmRpbmcpCisJCQkgICAgeworCQkJCWNvbW1hID0gKChmbGFncyAmIFBfQ09NTUEpICYmICpvcmlndmFsICE9IE5VTAorCQkJCQkJCSAgICYmICpuZXd2YWwgIT0gTlVMKTsKKwkJCQlpZiAoYWRkaW5nKQorCQkJCXsKKwkJCQkgICAgaSA9IChpbnQpU1RSTEVOKG9yaWd2YWwpOworCQkJCSAgICBtY2hfbWVtbW92ZShuZXd2YWwgKyBpICsgY29tbWEsIG5ld3ZhbCwKKwkJCQkJCQkgIFNUUkxFTihuZXd2YWwpICsgMSk7CisJCQkJICAgIG1jaF9tZW1tb3ZlKG5ld3ZhbCwgb3JpZ3ZhbCwgKHNpemVfdClpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkgICAgaSA9IChpbnQpU1RSTEVOKG5ld3ZhbCk7CisJCQkJICAgIG1jaF9tZW1tb3ZlKG5ld3ZhbCArIGkgKyBjb21tYSwgb3JpZ3ZhbCwKKwkJCQkJCQkgIFNUUkxFTihvcmlndmFsKSArIDEpOworCQkJCX0KKwkJCQlpZiAoY29tbWEpCisJCQkJICAgIG5ld3ZhbFtpXSA9ICcsJzsKKwkJCSAgICB9CisKKwkJCSAgICAvKiBSZW1vdmUgbmV3dmFsW10gZnJvbSBvcmlndmFsW10uIChOb3RlOiAiaSIgaGFzCisJCQkgICAgICogYmVlbiBzZXQgYWJvdmUgYW5kIGlzIHVzZWQgaGVyZSkuICovCisJCQkgICAgaWYgKHJlbW92aW5nKQorCQkJICAgIHsKKwkJCQlTVFJDUFkobmV3dmFsLCBvcmlndmFsKTsKKwkJCQlpZiAoKnMpCisJCQkJeworCQkJCSAgICAvKiBtYXkgbmVlZCB0byByZW1vdmUgYSBjb21tYSAqLworCQkJCSAgICBpZiAoZmxhZ3MgJiBQX0NPTU1BKQorCQkJCSAgICB7CisJCQkJCWlmIChzID09IG9yaWd2YWwpCisJCQkJCXsKKwkJCQkJICAgIC8qIGluY2x1ZGUgY29tbWEgYWZ0ZXIgc3RyaW5nICovCisJCQkJCSAgICBpZiAoc1tpXSA9PSAnLCcpCisJCQkJCQkrK2k7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCSAgICAvKiBpbmNsdWRlIGNvbW1hIGJlZm9yZSBzdHJpbmcgKi8KKwkJCQkJICAgIC0tczsKKwkJCQkJICAgICsraTsKKwkJCQkJfQorCQkJCSAgICB9CisJCQkJICAgIG1jaF9tZW1tb3ZlKG5ld3ZhbCArIChzIC0gb3JpZ3ZhbCksIHMgKyBpLAorCQkJCQkJCSAgIFNUUkxFTihzICsgaSkgKyAxKTsKKwkJCQl9CisJCQkgICAgfQorCisJCQkgICAgaWYgKGZsYWdzICYgUF9GTEFHTElTVCkKKwkJCSAgICB7CisJCQkJLyogUmVtb3ZlIGZsYWdzIHRoYXQgYXBwZWFyIHR3aWNlLiAqLworCQkJCWZvciAocyA9IG5ld3ZhbDsgKnM7ICsrcykKKwkJCQkgICAgaWYgKCghKGZsYWdzICYgUF9DT01NQSkgfHwgKnMgIT0gJywnKQorCQkJCQkgICAgJiYgdmltX3N0cmNocihzICsgMSwgKnMpICE9IE5VTEwpCisJCQkJICAgIHsKKwkJCQkJU1RSQ1BZKHMsIHMgKyAxKTsKKwkJCQkJLS1zOworCQkJCSAgICB9CisJCQkgICAgfQorCisJCQkgICAgaWYgKHNhdmVfYXJnICE9IE5VTEwpICAgLyogbnVtYmVyIGZvciAnd2hpY2h3cmFwJyAqLworCQkJCWFyZyA9IHNhdmVfYXJnOworCQkJICAgIG5ld192YWx1ZV9hbGxvY2VkID0gVFJVRTsKKwkJCX0KKworCQkJLyogU2V0IHRoZSBuZXcgdmFsdWUuICovCisJCQkqKGNoYXJfdSAqKikodmFycCkgPSBuZXd2YWw7CisKKwkJCS8qIEhhbmRsZSBzaWRlIGVmZmVjdHMsIGFuZCBzZXQgdGhlIGdsb2JhbCB2YWx1ZSBmb3IKKwkJCSAqICI6c2V0IiBvbiBsb2NhbCBvcHRpb25zLiAqLworCQkJZXJybXNnID0gZGlkX3NldF9zdHJpbmdfb3B0aW9uKG9wdF9pZHgsIChjaGFyX3UgKiopdmFycCwKKwkJCQluZXdfdmFsdWVfYWxsb2NlZCwgb2xkdmFsLCBlcnJidWYsIG9wdF9mbGFncyk7CisKKwkJCS8qIElmIGVycm9yIGRldGVjdGVkLCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZS4gKi8KKwkJCWlmIChlcnJtc2cgIT0gTlVMTCkKKwkJCSAgICBnb3RvIHNraXA7CisJCSAgICB9CisJCSAgICBlbHNlCSAgICAvKiBrZXkgY29kZSBvcHRpb24gKi8KKwkJICAgIHsKKwkJCWNoYXJfdQkgICAgKnA7CisKKwkJCWlmIChuZXh0Y2hhciA9PSAnJicpCisJCQl7CisJCQkgICAgaWYgKGFkZF90ZXJtY2FwX2VudHJ5KGtleV9uYW1lLCBUUlVFKSA9PSBGQUlMKQorCQkJCWVycm1zZyA9IChjaGFyX3UgKilOXygiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICArK2FyZzsgLyoganVtcCB0byBhZnRlciB0aGUgJz0nIG9yICc6JyAqLworCQkJICAgIGZvciAocCA9IGFyZzsgKnAgJiYgIXZpbV9pc3doaXRlKCpwKTsgKytwKQorCQkJCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCQkJCSAgICArK3A7CisJCQkgICAgbmV4dGNoYXIgPSAqcDsKKwkJCSAgICAqcCA9IE5VTDsKKwkJCSAgICBhZGRfdGVybWNvZGUoa2V5X25hbWUsIGFyZywgRkFMU0UpOworCQkJICAgICpwID0gbmV4dGNoYXI7CisJCQl9CisJCQlpZiAoZnVsbF9zY3JlZW4pCisJCQkgICAgdHRlc3QoRkFMU0UpOworCQkJcmVkcmF3X2FsbF9sYXRlcihDTEVBUik7CisJCSAgICB9CisJCX0KKwkJaWYgKG9wdF9pZHggPj0gMCkKKwkJICAgIG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9XQVNfU0VUOworCSAgICB9CisKK3NraXA6CisJICAgIC8qCisJICAgICAqIEFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudC4KKwkgICAgICogLSBza2lwIHVudGlsIGEgYmxhbmsgZm91bmQsIHRha2luZyBjYXJlIG9mIGJhY2tzbGFzaGVzCisJICAgICAqIC0gc2tpcCBibGFua3MKKwkgICAgICogLSBza2lwIG9uZSAiPXZhbCIgYXJndW1lbnQgKGZvciBoaWRkZW4gb3B0aW9ucyAiOnNldCBnZm4gPXh4IikKKwkgICAgICovCisJICAgIGZvciAoaSA9IDA7IGkgPCAyIDsgKytpKQorCSAgICB7CisJCXdoaWxlICgqYXJnICE9IE5VTCAmJiAhdmltX2lzd2hpdGUoKmFyZykpCisJCSAgICBpZiAoKmFyZysrID09ICdcXCcgJiYgKmFyZyAhPSBOVUwpCisJCQkrK2FyZzsKKwkJYXJnID0gc2tpcHdoaXRlKGFyZyk7CisJCWlmICgqYXJnICE9ICc9JykKKwkJICAgIGJyZWFrOworCSAgICB9CisJfQorCisJaWYgKGVycm1zZyAhPSBOVUxMKQorCXsKKwkgICAgU1RSTkNQWShJT2J1ZmYsIF8oZXJybXNnKSwgSU9TSVpFIC0gMSk7CisJICAgIElPYnVmZltJT1NJWkUgLSAxXSA9IE5VTDsKKwkgICAgaSA9IFNUUkxFTihJT2J1ZmYpICsgMjsKKwkgICAgaWYgKGkgKyAoYXJnIC0gc3RhcnRhcmcpIDwgSU9TSVpFKQorCSAgICB7CisJCS8qIGFwcGVuZCB0aGUgYXJndW1lbnQgd2l0aCB0aGUgZXJyb3IgKi8KKwkJU1RSQ0FUKElPYnVmZiwgIjogIik7CisJCW1jaF9tZW1tb3ZlKElPYnVmZiArIGksIHN0YXJ0YXJnLCAoYXJnIC0gc3RhcnRhcmcpKTsKKwkJSU9idWZmW2kgKyAoYXJnIC0gc3RhcnRhcmcpXSA9IE5VTDsKKwkgICAgfQorCSAgICAvKiBtYWtlIHN1cmUgYWxsIGNoYXJhY3RlcnMgYXJlIHByaW50YWJsZSAqLworCSAgICB0cmFuc19jaGFyYWN0ZXJzKElPYnVmZiwgSU9TSVpFKTsKKworCSAgICArK25vX3dhaXRfcmV0dXJuOwkvKiB3YWl0X3JldHVybiBkb25lIGxhdGVyICovCisJICAgIGVtc2coSU9idWZmKTsJLyogc2hvdyBlcnJvciBoaWdobGlnaHRlZCAqLworCSAgICAtLW5vX3dhaXRfcmV0dXJuOworCisJICAgIHJldHVybiBGQUlMOworCX0KKworCWFyZyA9IHNraXB3aGl0ZShhcmcpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworICAgIHN0YXRpYyBjaGFyX3UgKgoraWxsZWdhbF9jaGFyKGVycmJ1ZiwgYykKKyAgICBjaGFyX3UJKmVycmJ1ZjsKKyAgICBpbnQJCWM7Cit7CisgICAgaWYgKGVycmJ1ZiA9PSBOVUxMKQorCXJldHVybiAoY2hhcl91ICopIiI7CisgICAgc3ByaW50ZigoY2hhciAqKWVycmJ1ZiwgXygiRTUzOTogSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIpLAorCSAgICAoY2hhciAqKXRyYW5zY2hhcihjKSk7CisgICAgcmV0dXJuIGVycmJ1ZjsKK30KKworLyoKKyAqIENvbnZlcnQgYSBrZXkgbmFtZSBvciBzdHJpbmcgaW50byBhIGtleSB2YWx1ZS4KKyAqIFVzZWQgZm9yICd3aWxkY2hhcicgYW5kICdjZWRpdCcgb3B0aW9ucy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3N0cmluZ190b19rZXkoYXJnKQorICAgIGNoYXJfdQkqYXJnOworeworICAgIGlmICgqYXJnID09ICc8JykKKwlyZXR1cm4gZmluZF9rZXlfb3B0aW9uKGFyZyArIDEpOworICAgIGlmICgqYXJnID09ICdeJykKKwlyZXR1cm4gQ3RybF9jaHIoYXJnWzFdKTsKKyAgICByZXR1cm4gKmFyZzsKK30KKworI2lmZGVmIEZFQVRfQ01EV0lOCisvKgorICogQ2hlY2sgdmFsdWUgb2YgJ2NlZGl0JyBhbmQgc2V0IGNlZGl0X2tleS4KKyAqIFJldHVybnMgTlVMTCBpZiB2YWx1ZSBpcyBPSywgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2NoZWNrX2NlZGl0KCkKK3sKKyAgICBpbnQgbjsKKworICAgIGlmICgqcF9jZWRpdCA9PSBOVUwpCisJY2VkaXRfa2V5ID0gLTE7CisgICAgZWxzZQorICAgIHsKKwluID0gc3RyaW5nX3RvX2tleShwX2NlZGl0KTsKKwlpZiAodmltX2lzcHJpbnRjKG4pKQorCSAgICByZXR1cm4gZV9pbnZhcmc7CisJY2VkaXRfa2V5ID0gbjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVElUTEUKKy8qCisgKiBXaGVuIGNoYW5naW5nICd0aXRsZScsICd0aXRsZXN0cmluZycsICdpY29uJyBvciAnaWNvbnN0cmluZycsIGNhbGwKKyAqIG1ha2V0aXRsZSgpIHRvIGNyZWF0ZSBhbmQgZGlzcGxheSBpdC4KKyAqIFdoZW4gc3dpdGNoaW5nIHRoZSB0aXRsZSBvciBpY29uIG9mZiwgY2FsbCBtY2hfcmVzdG9yZV90aXRsZSgpIHRvIGdldAorICogdGhlIG9sZCB2YWx1ZSBiYWNrLgorICovCisgICAgc3RhdGljIHZvaWQKK2RpZF9zZXRfdGl0bGUoaWNvbikKKyAgICBpbnQJICAgIGljb247CSAgICAvKiBEaWQgc2V0IGljb24gaW5zdGVhZCBvZiB0aXRsZSAqLworeworICAgIGlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4KKyNpZmRlZiBGRUFUX0dVSQorCSAgICAmJiAhZ3VpLnN0YXJ0aW5nCisjZW5kaWYKKwkJCQkpCisgICAgeworCW1ha2V0aXRsZSgpOworCWlmIChpY29uKQorCXsKKwkgICAgaWYgKCFwX2ljb24pCisJCW1jaF9yZXN0b3JlX3RpdGxlKDIpOworCX0KKwllbHNlCisJeworCSAgICBpZiAoIXBfdGl0bGUpCisJCW1jaF9yZXN0b3JlX3RpdGxlKDEpOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIHNldF9vcHRpb25zX2JpbiAtICBjYWxsZWQgd2hlbiAnYmluJyBjaGFuZ2VzIHZhbHVlLgorICovCisgICAgdm9pZAorc2V0X29wdGlvbnNfYmluKG9sZHZhbCwgbmV3dmFsLCBvcHRfZmxhZ3MpCisgICAgaW50CQlvbGR2YWw7CisgICAgaW50CQluZXd2YWw7CisgICAgaW50CQlvcHRfZmxhZ3M7CS8qIE9QVF9MT0NBTCBhbmQvb3IgT1BUX0dMT0JBTCAqLworeworICAgIC8qCisgICAgICogVGhlIG9wdGlvbiB2YWx1ZXMgdGhhdCBhcmUgY2hhbmdlZCB3aGVuICdiaW4nIGNoYW5nZXMgYXJlCisgICAgICogY29waWVkIHdoZW4gJ2JpbiBpcyBzZXQgYW5kIHJlc3RvcmVkIHdoZW4gJ2JpbicgaXMgcmVzZXQuCisgICAgICovCisgICAgaWYgKG5ld3ZhbCkKKyAgICB7CisJaWYgKCFvbGR2YWwpCQkvKiBzd2l0Y2hlZCBvbiAqLworCXsKKwkgICAgaWYgKCEob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkpCisJICAgIHsKKwkJY3VyYnVmLT5iX3BfdHdfbm9iaW4gPSBjdXJidWYtPmJfcF90dzsKKwkJY3VyYnVmLT5iX3Bfd21fbm9iaW4gPSBjdXJidWYtPmJfcF93bTsKKwkJY3VyYnVmLT5iX3BfbWxfbm9iaW4gPSBjdXJidWYtPmJfcF9tbDsKKwkJY3VyYnVmLT5iX3BfZXRfbm9iaW4gPSBjdXJidWYtPmJfcF9ldDsKKwkgICAgfQorCSAgICBpZiAoIShvcHRfZmxhZ3MgJiBPUFRfTE9DQUwpKQorCSAgICB7CisJCXBfdHdfbm9iaW4gPSBwX3R3OworCQlwX3dtX25vYmluID0gcF93bTsKKwkJcF9tbF9ub2JpbiA9IHBfbWw7CisJCXBfZXRfbm9iaW4gPSBwX2V0OworCSAgICB9CisJfQorCisJaWYgKCEob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkpCisJeworCSAgICBjdXJidWYtPmJfcF90dyA9IDA7CS8qIG5vIGF1dG9tYXRpYyBsaW5lIHdyYXAgKi8KKwkgICAgY3VyYnVmLT5iX3Bfd20gPSAwOwkvKiBubyBhdXRvbWF0aWMgbGluZSB3cmFwICovCisJICAgIGN1cmJ1Zi0+Yl9wX21sID0gMDsJLyogbm8gbW9kZWxpbmVzICovCisJICAgIGN1cmJ1Zi0+Yl9wX2V0ID0gMDsJLyogbm8gZXhwYW5kdGFiICovCisJfQorCWlmICghKG9wdF9mbGFncyAmIE9QVF9MT0NBTCkpCisJeworCSAgICBwX3R3ID0gMDsKKwkgICAgcF93bSA9IDA7CisJICAgIHBfbWwgPSBGQUxTRTsKKwkgICAgcF9ldCA9IEZBTFNFOworCSAgICBwX2JpbiA9IFRSVUU7CS8qIG5lZWRlZCB3aGVuIGNhbGxlZCBmb3IgdGhlICItYiIgYXJndW1lbnQgKi8KKwl9CisgICAgfQorICAgIGVsc2UgaWYgKG9sZHZhbCkJCS8qIHN3aXRjaGVkIG9mZiAqLworICAgIHsKKwlpZiAoIShvcHRfZmxhZ3MgJiBPUFRfR0xPQkFMKSkKKwl7CisJICAgIGN1cmJ1Zi0+Yl9wX3R3ID0gY3VyYnVmLT5iX3BfdHdfbm9iaW47CisJICAgIGN1cmJ1Zi0+Yl9wX3dtID0gY3VyYnVmLT5iX3Bfd21fbm9iaW47CisJICAgIGN1cmJ1Zi0+Yl9wX21sID0gY3VyYnVmLT5iX3BfbWxfbm9iaW47CisJICAgIGN1cmJ1Zi0+Yl9wX2V0ID0gY3VyYnVmLT5iX3BfZXRfbm9iaW47CisJfQorCWlmICghKG9wdF9mbGFncyAmIE9QVF9MT0NBTCkpCisJeworCSAgICBwX3R3ID0gcF90d19ub2JpbjsKKwkgICAgcF93bSA9IHBfd21fbm9iaW47CisJICAgIHBfbWwgPSBwX21sX25vYmluOworCSAgICBwX2V0ID0gcF9ldF9ub2JpbjsKKwl9CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisvKgorICogRmluZCB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBjaGFyYWN0ZXIgKGVnICcsIDosICIsIG9yIC8pLAorICogYW5kIHJldHVybiBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpbiB0aGUgJ3ZpbWluZm8nIHN0cmluZy4KKyAqIE9ubHkgd29ya3MgZm9yIG51bWJlciBwYXJhbWV0ZXJzLCBub3QgZm9yICdyJyBvciAnbicuCisgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZywgcmV0dXJuIC0xLgorICovCisgICAgaW50CitnZXRfdmltaW5mb19wYXJhbWV0ZXIodHlwZSkKKyAgICBpbnQJICAgIHR5cGU7Cit7CisgICAgY2hhcl91ICAqcDsKKworICAgIHAgPSBmaW5kX3ZpbWluZm9fcGFyYW1ldGVyKHR5cGUpOworICAgIGlmIChwICE9IE5VTEwgJiYgVklNX0lTRElHSVQoKnApKQorCXJldHVybiBhdG9pKChjaGFyICopcCk7CisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBjaGFyYWN0ZXIgKGVnICcnJywgJzonLCAnIicsIG9yCisgKiAnLycpIGluIHRoZSAndmltaW5mbycgb3B0aW9uIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYWZ0ZXIgaXQuCisgKiBSZXR1cm4gTlVMTCBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4KKyAqLworICAgIGNoYXJfdSAqCitmaW5kX3ZpbWluZm9fcGFyYW1ldGVyKHR5cGUpCisgICAgaW50CSAgICB0eXBlOworeworICAgIGNoYXJfdSAgKnA7CisKKyAgICBmb3IgKHAgPSBwX3ZpbWluZm87ICpwOyArK3ApCisgICAgeworCWlmICgqcCA9PSB0eXBlKQorCSAgICByZXR1cm4gcCArIDE7CisJaWYgKCpwID09ICduJykJCSAgICAvKiAnbicgaXMgYWx3YXlzIHRoZSBsYXN0IG9uZSAqLworCSAgICBicmVhazsKKwlwID0gdmltX3N0cmNocihwLCAnLCcpOwkgICAgLyogc2tpcCB1bnRpbCBuZXh0ICcsJyAqLworCWlmIChwID09IE5VTEwpCQkgICAgLyogaGl0IHRoZSBlbmQgd2l0aG91dCBmaW5kaW5nIHBhcmFtZXRlciAqLworCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIEV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNvbWUgc3RyaW5nIG9wdGlvbnMuCisgKiBUaGVzZSBzdHJpbmcgb3B0aW9ucyBjYW5ub3QgYmUgaW5kaXJlY3QhCisgKiBJZiAidmFsIiBpcyBOVUxMIGV4cGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgorICogUmV0dXJuIHBvaW50ZXIgdG8gTmFtZUJ1ZmYsIG9yIE5VTEwgd2hlbiBub3QgZXhwYW5kZWQuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK29wdGlvbl9leHBhbmQob3B0X2lkeCwgdmFsKQorICAgIGludAkJb3B0X2lkeDsKKyAgICBjaGFyX3UJKnZhbDsKK3sKKyAgICAvKiBpZiBvcHRpb24gZG9lc24ndCBuZWVkIGV4cGFuc2lvbiBub3RoaW5nIHRvIGRvICovCisgICAgaWYgKCEob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfRVhQQU5EKSB8fCBvcHRpb25zW29wdF9pZHhdLnZhciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgLyogSWYgdmFsIGlzIGxvbmdlciB0aGFuIE1BWFBBVEhMIG5vIG1lYW5pbmdmdWwgZXhwYW5zaW9uIGNhbiBiZSBkb25lLAorICAgICAqIGV4cGFuZF9lbnYoKSB3b3VsZCB0cnVuY2F0ZSB0aGUgc3RyaW5nLiAqLworICAgIGlmICh2YWwgIT0gTlVMTCAmJiBTVFJMRU4odmFsKSA+IE1BWFBBVEhMKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKHZhbCA9PSBOVUxMKQorCXZhbCA9ICooY2hhcl91ICoqKW9wdGlvbnNbb3B0X2lkeF0udmFyOworCisgICAgLyoKKyAgICAgKiBFeHBhbmRpbmcgdGhpcyB3aXRoIE5hbWVCdWZmLCBleHBhbmRfZW52KCkgbXVzdCBub3QgYmUgcGFzc2VkIElPYnVmZi4KKyAgICAgKiBFc2NhcGUgc3BhY2VzIHdoZW4gZXhwYW5kaW5nICd0YWdzJywgdGhleSBhcmUgdXNlZCB0byBzZXBhcmF0ZSBmaWxlCisgICAgICogbmFtZXMuCisgICAgICovCisgICAgZXhwYW5kX2Vudl9lc2ModmFsLCBOYW1lQnVmZiwgTUFYUEFUSEwsCisJCQkJICAoY2hhcl91ICoqKW9wdGlvbnNbb3B0X2lkeF0udmFyID09ICZwX3RhZ3MpOworICAgIGlmIChTVFJDTVAoTmFtZUJ1ZmYsIHZhbCkgPT0gMCkgICAvKiB0aGV5IGFyZSB0aGUgc2FtZSAqLworCXJldHVybiBOVUxMOworCisgICAgcmV0dXJuIE5hbWVCdWZmOworfQorCisvKgorICogQWZ0ZXIgc2V0dGluZyB2YXJpb3VzIG9wdGlvbiB2YWx1ZXM6IHJlY29tcHV0ZSB2YXJpYWJsZXMgdGhhdCBkZXBlbmQgb24KKyAqIG9wdGlvbiB2YWx1ZXMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZGlkc2V0X29wdGlvbnMoKQoreworICAgIC8qIGluaXRpYWxpemUgdGhlIHRhYmxlIGZvciAnaXNrZXl3b3JkJyBldC5hbC4gKi8KKyAgICAodm9pZClpbml0X2NoYXJ0YWIoKTsKKworICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfY21wLCBwX2NtcF92YWx1ZXMsICZjbXBfZmxhZ3MsIFRSVUUpOworICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfYmtjLCBwX2JrY192YWx1ZXMsICZia2NfZmxhZ3MsIFRSVUUpOworI2lmZGVmIEZFQVRfU0VTU0lPTgorICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfc3NvcCwgcF9zc29wX3ZhbHVlcywgJnNzb3BfZmxhZ3MsIFRSVUUpOworICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfdm9wLCBwX3Nzb3BfdmFsdWVzLCAmdm9wX2ZsYWdzLCBUUlVFKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfZmRvLCBwX2Zkb192YWx1ZXMsICZmZG9fZmxhZ3MsIFRSVUUpOworI2VuZGlmCisgICAgKHZvaWQpb3B0X3N0cmluZ3NfZmxhZ3MocF9keSwgcF9keV92YWx1ZXMsICZkeV9mbGFncywgVFJVRSk7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgICh2b2lkKW9wdF9zdHJpbmdzX2ZsYWdzKHBfdmUsIHBfdmVfdmFsdWVzLCAmdmVfZmxhZ3MsIFRSVUUpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpCisgICAgKHZvaWQpb3B0X3N0cmluZ3NfZmxhZ3MocF90dHltLCBwX3R0eW1fdmFsdWVzLCAmdHR5bV9mbGFncywgRkFMU0UpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKKyAgICAodm9pZClvcHRfc3RyaW5nc19mbGFncyhwX3Rvb2xiYXIsIHBfdG9vbGJhcl92YWx1ZXMsICZ0b29sYmFyX2ZsYWdzLCBUUlVFKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgJiYgZGVmaW5lZChIQVZFX0dUSzIpCisgICAgKHZvaWQpb3B0X3N0cmluZ3NfZmxhZ3MocF90YmlzLCBwX3RiaXNfdmFsdWVzLCAmdGJpc19mbGFncywgRkFMU0UpOworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURXSU4KKyAgICAvKiBzZXQgY2VkaXRfa2V5ICovCisgICAgKHZvaWQpY2hlY2tfY2VkaXQoKTsKKyNlbmRpZgorfQorCisvKgorICogQ2hlY2sgZm9yIHN0cmluZyBvcHRpb25zIHRoYXQgYXJlIE5VTEwgKG5vcm1hbGx5IG9ubHkgdGVybWNhcCBvcHRpb25zKS4KKyAqLworICAgIHZvaWQKK2NoZWNrX29wdGlvbnMoKQoreworICAgIGludAkJb3B0X2lkeDsKKworICAgIGZvciAob3B0X2lkeCA9IDA7IG9wdGlvbnNbb3B0X2lkeF0uZnVsbG5hbWUgIT0gTlVMTDsgb3B0X2lkeCsrKQorCWlmICgob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfU1RSSU5HKSAmJiBvcHRpb25zW29wdF9pZHhdLnZhciAhPSBOVUxMKQorCSAgICBjaGVja19zdHJpbmdfb3B0aW9uKChjaGFyX3UgKiopZ2V0X3ZhcnAoJihvcHRpb25zW29wdF9pZHhdKSkpOworfQorCisvKgorICogQ2hlY2sgc3RyaW5nIG9wdGlvbnMgaW4gYSBidWZmZXIgZm9yIE5VTEwgdmFsdWUuCisgKi8KKyAgICB2b2lkCitjaGVja19idWZfb3B0aW9ucyhidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYmgpOworICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2J0KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9mZW5jKTsKKyNlbmRpZgorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2ZmKTsKKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9kZWYpOworICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luYyk7CisjIGlmZGVmIEZFQVRfRVZBTAorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZXgpOworIyBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZGUpOworICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2luZGspOworI2VuZGlmCisjaWZkZWYgRkVBVF9DUllQVAorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2tleSk7CisjZW5kaWYKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9rcCk7CisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfbXBzKTsKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9mbyk7CisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfaXNrKTsKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfY29tKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2Ntcyk7CisjZW5kaWYKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9uZik7CisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9zeW4pOworI2VuZGlmCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3Bfc3VhKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0lOREVOVAorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2NpbmspOworICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2Npbm8pOworI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZnQpOworI2VuZGlmCisjaWZkZWYgRkVBVF9PU0ZJTEVUWVBFCisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3Bfb2Z0KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpCisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfY2ludyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9jcHQpOworI2VuZGlmCisjaWZkZWYgRkVBVF9LRVlNQVAKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9rZXltYXApOworI2VuZGlmCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2dwKTsKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9tcCk7CisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZWZtKTsKKyNlbmRpZgorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2VwKTsKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9wYXRoKTsKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF90YWdzKTsKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9kaWN0KTsKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF90c3IpOworI2VuZGlmCit9CisKKy8qCisgKiBGcmVlIHRoZSBzdHJpbmcgYWxsb2NhdGVkIGZvciBhbiBvcHRpb24uCisgKiBDaGVja3MgZm9yIHRoZSBzdHJpbmcgYmVpbmcgZW1wdHlfb3B0aW9uLiBUaGlzIG1heSBoYXBwZW4gaWYgd2UncmUgb3V0IG9mCisgKiBtZW1vcnksIHZpbV9zdHJzYXZlKCkgcmV0dXJuZWQgTlVMTCwgd2hpY2ggd2FzIHJlcGxhY2VkIGJ5IGVtcHR5X29wdGlvbiBieQorICogY2hlY2tfb3B0aW9ucygpLgorICogRG9lcyBOT1QgY2hlY2sgZm9yIFBfQUxMT0NFRCBmbGFnIQorICovCisgICAgdm9pZAorZnJlZV9zdHJpbmdfb3B0aW9uKHApCisgICAgY2hhcl91CSpwOworeworICAgIGlmIChwICE9IGVtcHR5X29wdGlvbikKKwl2aW1fZnJlZShwKTsKK30KKworICAgIHZvaWQKK2NsZWFyX3N0cmluZ19vcHRpb24ocHApCisgICAgY2hhcl91CSoqcHA7Cit7CisgICAgaWYgKCpwcCAhPSBlbXB0eV9vcHRpb24pCisJdmltX2ZyZWUoKnBwKTsKKyAgICAqcHAgPSBlbXB0eV9vcHRpb247Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfc3RyaW5nX29wdGlvbihwcCkKKyAgICBjaGFyX3UJKipwcDsKK3sKKyAgICBpZiAoKnBwID09IE5VTEwpCisJKnBwID0gZW1wdHlfb3B0aW9uOworfQorCisvKgorICogTWFyayBhIHRlcm1pbmFsIG9wdGlvbiBhcyBhbGxvY2F0ZWQsIGZvdW5kIGJ5IGEgcG9pbnRlciBpbnRvIHRlcm1fc3RyaW5nc1tdLgorICovCisgICAgdm9pZAorc2V0X3Rlcm1fb3B0aW9uX2FsbG9jZWQocCkKKyAgICBjaGFyX3UgKipwOworeworICAgIGludAkJb3B0X2lkeDsKKworICAgIGZvciAob3B0X2lkeCA9IDE7IG9wdGlvbnNbb3B0X2lkeF0uZnVsbG5hbWUgIT0gTlVMTDsgb3B0X2lkeCsrKQorCWlmIChvcHRpb25zW29wdF9pZHhdLnZhciA9PSAoY2hhcl91ICopcCkKKwl7CisJICAgIG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9BTExPQ0VEOworCSAgICByZXR1cm47CisJfQorICAgIHJldHVybjsgLyogY2Fubm90IGhhcHBlbjogZGlkbid0IGZpbmQgaXQhICovCit9CisKKy8qCisgKiBTZXQgYSBzdHJpbmcgb3B0aW9uIHRvIGEgbmV3IHZhbHVlICh3aXRob3V0IGNoZWNraW5nIHRoZSBlZmZlY3QpLgorICogVGhlIHN0cmluZyBpcyBjb3BpZWQgaW50byBhbGxvY2F0ZWQgbWVtb3J5LgorICogaWYgKCJvcHRfaWR4IiA9PSAtMSkgIm5hbWUiIGlzIHVzZWQsIG90aGVyd2lzZSAib3B0X2lkeCIgaXMgdXNlZC4KKyAqLworICAgIHZvaWQKK3NldF9zdHJpbmdfb3B0aW9uX2RpcmVjdChuYW1lLCBvcHRfaWR4LCB2YWwsIG9wdF9mbGFncykKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlvcHRfaWR4OworICAgIGNoYXJfdQkqdmFsOworICAgIGludAkJb3B0X2ZsYWdzOwkvKiBPUFRfRlJFRSwgT1BUX0xPQ0FMIGFuZC9vciBPUFRfR0xPQkFMICovCit7CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqKnZhcnA7CisgICAgaW50CQlib3RoID0gKG9wdF9mbGFncyAmIChPUFRfTE9DQUwgfCBPUFRfR0xPQkFMKSkgPT0gMDsKKworICAgIGlmIChvcHRfaWR4ID09IC0xKQkJLyogdXNlIG5hbWUgKi8KKyAgICB7CisJb3B0X2lkeCA9IGZpbmRvcHRpb24obmFtZSk7CisJaWYgKG9wdF9pZHggPT0gLTEpCS8qIG5vdCBmb3VuZCAoc2hvdWxkIG5vdCBoYXBwZW4pICovCisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS52YXIgPT0gTlVMTCkJLyogY2FuJ3Qgc2V0IGhpZGRlbiBvcHRpb24gKi8KKwlyZXR1cm47CisKKyAgICBzID0gdmltX3N0cnNhdmUodmFsKTsKKyAgICBpZiAocyAhPSBOVUxMKQorICAgIHsKKwl2YXJwID0gKGNoYXJfdSAqKilnZXRfdmFycF9zY29wZSgmKG9wdGlvbnNbb3B0X2lkeF0pLAorCQkJCQkgICAgICAgYm90aCA/IE9QVF9MT0NBTCA6IG9wdF9mbGFncyk7CisJaWYgKChvcHRfZmxhZ3MgJiBPUFRfRlJFRSkgJiYgKG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgJiBQX0FMTE9DRUQpKQorCSAgICBmcmVlX3N0cmluZ19vcHRpb24oKnZhcnApOworCSp2YXJwID0gczsKKworCS8qIEZvciBidWZmZXIvd2luZG93IGxvY2FsIG9wdGlvbiBtYXkgYWxzbyBzZXQgdGhlIGdsb2JhbCB2YWx1ZS4gKi8KKwlpZiAoYm90aCkKKwkgICAgc2V0X3N0cmluZ19vcHRpb25fZ2xvYmFsKG9wdF9pZHgsIHZhcnApOworCisJb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX0FMTE9DRUQ7CisKKwkvKiBXaGVuIHNldHRpbmcgYm90aCB2YWx1ZXMgb2YgYSBnbG9iYWwgb3B0aW9uIHdpdGggYSBsb2NhbCB2YWx1ZSwKKwkgKiBtYWtlIHRoZSBsb2NhbCB2YWx1ZSBlbXB0eSwgc28gdGhhdCB0aGUgZ2xvYmFsIHZhbHVlIGlzIHVzZWQuICovCisJaWYgKChpbnQpb3B0aW9uc1tvcHRfaWR4XS5pbmRpciA+PSBQVl9CT1RIICYmIGJvdGgpCisJeworCSAgICBmcmVlX3N0cmluZ19vcHRpb24oKnZhcnApOworCSAgICAqdmFycCA9IGVtcHR5X29wdGlvbjsKKwl9CisgICAgfQorfQorCisvKgorICogU2V0IGdsb2JhbCB2YWx1ZSBmb3Igc3RyaW5nIG9wdGlvbiB3aGVuIGl0J3MgYSBsb2NhbCBvcHRpb24uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0X3N0cmluZ19vcHRpb25fZ2xvYmFsKG9wdF9pZHgsIHZhcnApCisgICAgaW50CQlvcHRfaWR4OwkvKiBvcHRpb24gaW5kZXggKi8KKyAgICBjaGFyX3UJKip2YXJwOwkJLyogcG9pbnRlciB0byBvcHRpb24gdmFyaWFibGUgKi8KK3sKKyAgICBjaGFyX3UJKipwLCAqczsKKworICAgIC8qIHRoZSBnbG9iYWwgdmFsdWUgaXMgYWx3YXlzIGFsbG9jYXRlZCAqLworICAgIGlmIChvcHRpb25zW29wdF9pZHhdLnZhciA9PSBWQVJfV0lOKQorCXAgPSAoY2hhcl91ICoqKUdMT0JBTF9XTyh2YXJwKTsKKyAgICBlbHNlCisJcCA9IChjaGFyX3UgKiopb3B0aW9uc1tvcHRfaWR4XS52YXI7CisgICAgaWYgKG9wdGlvbnNbb3B0X2lkeF0uaW5kaXIgIT0gUFZfTk9ORQorCSAgICAmJiBwICE9IHZhcnAKKwkgICAgJiYgKHMgPSB2aW1fc3Ryc2F2ZSgqdmFycCkpICE9IE5VTEwpCisgICAgeworCWZyZWVfc3RyaW5nX29wdGlvbigqcCk7CisJKnAgPSBzOworICAgIH0KK30KKworLyoKKyAqIFNldCBhIHN0cmluZyBvcHRpb24gdG8gYSBuZXcgdmFsdWUsIGFuZCBoYW5kbGUgdGhlIGVmZmVjdHMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0X3N0cmluZ19vcHRpb24ob3B0X2lkeCwgdmFsdWUsIG9wdF9mbGFncykKKyAgICBpbnQJCW9wdF9pZHg7CisgICAgY2hhcl91CSp2YWx1ZTsKKyAgICBpbnQJCW9wdF9mbGFnczsJLyogT1BUX0xPQ0FMIGFuZC9vciBPUFRfR0xPQkFMICovCit7CisgICAgY2hhcl91CSpzOworICAgIGNoYXJfdQkqKnZhcnA7CisgICAgY2hhcl91CSpvbGR2YWw7CisKKyAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS52YXIgPT0gTlVMTCkJLyogZG9uJ3Qgc2V0IGhpZGRlbiBvcHRpb24gKi8KKwlyZXR1cm47CisKKyAgICBzID0gdmltX3N0cnNhdmUodmFsdWUpOworICAgIGlmIChzICE9IE5VTEwpCisgICAgeworCXZhcnAgPSAoY2hhcl91ICoqKWdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksCisJCShvcHRfZmxhZ3MgJiAoT1BUX0xPQ0FMIHwgT1BUX0dMT0JBTCkpID09IDAKKwkJICAgID8gKChpbnQpb3B0aW9uc1tvcHRfaWR4XS5pbmRpciA+PSBQVl9CT1RICisJCQk/IE9QVF9HTE9CQUwgOiBPUFRfTE9DQUwpCisJCSAgICA6IG9wdF9mbGFncyk7CisJb2xkdmFsID0gKnZhcnA7CisJKnZhcnAgPSBzOworCW9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9XQVNfU0VUOworCSh2b2lkKWRpZF9zZXRfc3RyaW5nX29wdGlvbihvcHRfaWR4LCB2YXJwLCBUUlVFLCBvbGR2YWwsIE5VTEwsCisJCQkJCQkJCSAgIG9wdF9mbGFncyk7CisgICAgfQorfQorCisvKgorICogSGFuZGxlIHN0cmluZyBvcHRpb25zIHRoYXQgbmVlZCBzb21lIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gY2hhbmdlZC4KKyAqIFJldHVybnMgTlVMTCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYW4gZXJyb3IuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2RpZF9zZXRfc3RyaW5nX29wdGlvbihvcHRfaWR4LCB2YXJwLCBuZXdfdmFsdWVfYWxsb2NlZCwgb2xkdmFsLCBlcnJidWYsCisJCQkJCQkJCSAgICBvcHRfZmxhZ3MpCisgICAgaW50CQlvcHRfaWR4OwkJLyogaW5kZXggaW4gb3B0aW9uc1tdIHRhYmxlICovCisgICAgY2hhcl91CSoqdmFycDsJCQkvKiBwb2ludGVyIHRvIHRoZSBvcHRpb24gdmFyaWFibGUgKi8KKyAgICBpbnQJCW5ld192YWx1ZV9hbGxvY2VkOwkvKiBuZXcgdmFsdWUgd2FzIGFsbG9jYXRlZCAqLworICAgIGNoYXJfdQkqb2xkdmFsOwkJLyogcHJldmlvdXMgdmFsdWUgb2YgdGhlIG9wdGlvbiAqLworICAgIGNoYXJfdQkqZXJyYnVmOwkJLyogYnVmZmVyIGZvciBlcnJvcnMsIG9yIE5VTEwgKi8KKyAgICBpbnQJCW9wdF9mbGFnczsJCS8qIE9QVF9MT0NBTCBhbmQvb3IgT1BUX0dMT0JBTCAqLworeworICAgIGNoYXJfdQkqZXJybXNnID0gTlVMTDsKKyAgICBjaGFyX3UJKnMsICpwOworICAgIGludAkJZGlkX2NoYXJ0YWIgPSBGQUxTRTsKKyAgICBjaGFyX3UJKipndmFycDsKKworICAgIC8qIEdldCB0aGUgZ2xvYmFsIG9wdGlvbiB0byBjb21wYXJlIHdpdGgsIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGNoZWNrCisgICAgICogdHdvIHZhbHVlcyBmb3IgYWxsIGxvY2FsIG9wdGlvbnMuICovCisgICAgZ3ZhcnAgPSAoY2hhcl91ICoqKWdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksIE9QVF9HTE9CQUwpOworCisgICAgLyogRGlzYWxsb3cgY2hhbmdpbmcgc29tZSBvcHRpb25zIGZyb20gc2VjdXJlIG1vZGUgKi8KKyAgICBpZiAoKHNlY3VyZQorI2lmZGVmIEhBVkVfU0FOREJPWAorCQl8fCBzYW5kYm94ICE9IDAKKyNlbmRpZgorCQkpICYmIChvcHRpb25zW29wdF9pZHhdLmZsYWdzICYgUF9TRUNVUkUpKQorICAgIHsKKwllcnJtc2cgPSBlX3NlY3VyZTsKKyAgICB9CisKKyAgICAvKiAndGVybScgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZUX05BTUUpCisgICAgeworCWlmIChUX05BTUVbMF0gPT0gTlVMKQorCSAgICBlcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIpOworI2lmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5pbl91c2UpCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTUzMDogQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIpOworCWVsc2UgaWYgKHRlcm1faXNfZ3VpKFRfTkFNRSkpCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiKTsKKyNlbmRpZgorCWVsc2UgaWYgKHNldF90ZXJtbmFtZShUX05BTUUpID09IEZBSUwpCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiKTsKKwllbHNlCisJICAgIC8qIFNjcmVlbiBjb2xvcnMgbWF5IGhhdmUgY2hhbmdlZC4gKi8KKwkgICAgcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisgICAgfQorCisgICAgLyogJ2JhY2t1cGNvcHknICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9ia2MpCisgICAgeworCWlmIChvcHRfc3RyaW5nc19mbGFncyhwX2JrYywgcF9ia2NfdmFsdWVzLCAmYmtjX2ZsYWdzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJaWYgKCgoYmtjX2ZsYWdzICYgQktDX0FVVE8pICE9IDApCisJCSsgKChia2NfZmxhZ3MgJiBCS0NfWUVTKSAhPSAwKQorCQkrICgoYmtjX2ZsYWdzICYgQktDX05PKSAhPSAwKSAhPSAxKQorCXsKKwkgICAgLyogTXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mICJhdXRvIiwgInllcyIgIGFuZCAibm8iLiAqLworCSAgICAodm9pZClvcHRfc3RyaW5nc19mbGFncyhvbGR2YWwsIHBfYmtjX3ZhbHVlcywgJmJrY19mbGFncywgVFJVRSk7CisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCX0KKyAgICB9CisKKyAgICAvKiAnYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2JleCB8fCB2YXJwID09ICZwX3BtKQorICAgIHsKKwlpZiAoU1RSQ01QKCpwX2JleCA9PSAnLicgPyBwX2JleCArIDEgOiBwX2JleCwKKwkJICAgICAqcF9wbSA9PSAnLicgPyBwX3BtICsgMSA6IHBfcG0pID09IDApCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTU4OTogJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIpOworICAgIH0KKworICAgIC8qCisgICAgICogJ2lzaWRlbnQnLCAnaXNrZXl3b3JkJywgJ2lzcHJpbnQgb3IgJ2lzZm5hbWUnIG9wdGlvbjogcmVmaWxsIGNoYXJ0YWJbXQorICAgICAqIElmIHRoZSBuZXcgb3B0aW9uIGlzIGludmFsaWQsIHVzZSBvbGQgdmFsdWUuICAnbGlzcCcgb3B0aW9uOiByZWZpbGwKKyAgICAgKiBjaGFydGFiW10gZm9yICctJyBjaGFyCisgICAgICovCisgICAgZWxzZSBpZiAoICB2YXJwID09ICZwX2lzaQorCSAgICB8fCB2YXJwID09ICYoY3VyYnVmLT5iX3BfaXNrKQorCSAgICB8fCB2YXJwID09ICZwX2lzcAorCSAgICB8fCB2YXJwID09ICZwX2lzZikKKyAgICB7CisJaWYgKGluaXRfY2hhcnRhYigpID09IEZBSUwpCisJeworCSAgICBkaWRfY2hhcnRhYiA9IFRSVUU7CSAgICAvKiBuZWVkIHRvIHJlc3RvcmUgaXQgYmVsb3cgKi8KKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CSAgICAvKiBlcnJvciBpbiB2YWx1ZSAqLworCX0KKyAgICB9CisKKyAgICAvKiAnaGVscGZpbGUnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9oZikKKyAgICB7CisJLyogTWF5IGNvbXB1dGUgbmV3IHZhbHVlcyBmb3IgJFZJTSBhbmQgJFZJTVJVTlRJTUUgKi8KKwlpZiAoZGlkc2V0X3ZpbSkKKwl7CisJICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJWSU0iLCAoY2hhcl91ICopIiIpOworCSAgICBkaWRzZXRfdmltID0gRkFMU0U7CisJfQorCWlmIChkaWRzZXRfdmltcnVudGltZSkKKwl7CisJICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJWSU1SVU5USU1FIiwgKGNoYXJfdSAqKSIiKTsKKwkgICAgZGlkc2V0X3ZpbXJ1bnRpbWUgPSBGQUxTRTsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgLyogJ2hlbHBsYW5nJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfaGxnKQorICAgIHsKKwkvKiBDaGVjayBmb3IgIiIsICJhYiIsICJhYixjZCIsIGV0Yy4gKi8KKwlmb3IgKHMgPSBwX2hsZzsgKnMgIT0gTlVMOyBzICs9IDMpCisJeworCSAgICBpZiAoc1sxXSA9PSBOVUwgfHwgKChzWzJdICE9ICcsJyB8fCBzWzNdID09IE5VTCkgJiYgc1syXSAhPSBOVUwpKQorCSAgICB7CisJCWVycm1zZyA9IGVfaW52YXJnOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoc1syXSA9PSBOVUwpCisJCWJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qICdoaWdobGlnaHQnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9obCkKKyAgICB7CisJaWYgKGhpZ2hsaWdodF9jaGFuZ2VkKCkgPT0gRkFJTCkKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CS8qIGludmFsaWQgZmxhZ3MgKi8KKyAgICB9CisKKyAgICAvKiAnbnJmb3JtYXRzJyAqLworICAgIGVsc2UgaWYgKGd2YXJwID09ICZwX25mKQorICAgIHsKKwlpZiAoY2hlY2tfb3B0X3N0cmluZ3MoKnZhcnAsIHBfbmZfdmFsdWVzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisgICAgfQorCisjaWZkZWYgRkVBVF9TRVNTSU9OCisgICAgLyogJ3Nlc3Npb25vcHRpb25zJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfc3NvcCkKKyAgICB7CisJaWYgKG9wdF9zdHJpbmdzX2ZsYWdzKHBfc3NvcCwgcF9zc29wX3ZhbHVlcywgJnNzb3BfZmxhZ3MsIFRSVUUpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKwlpZiAoKHNzb3BfZmxhZ3MgJiBTU09QX0NVUkRJUikgJiYgKHNzb3BfZmxhZ3MgJiBTU09QX1NFU0RJUikpCisJeworCSAgICAvKiBEb24ndCBhbGxvdyBib3RoICJzZXNkaXIiIGFuZCAiY3VyZGlyIi4gKi8KKwkgICAgKHZvaWQpb3B0X3N0cmluZ3NfZmxhZ3Mob2xkdmFsLCBwX3Nzb3BfdmFsdWVzLCAmc3NvcF9mbGFncywgVFJVRSk7CisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCX0KKyAgICB9CisgICAgLyogJ3ZpZXdvcHRpb25zJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfdm9wKQorICAgIHsKKwlpZiAob3B0X3N0cmluZ3NfZmxhZ3MocF92b3AsIHBfc3NvcF92YWx1ZXMsICZ2b3BfZmxhZ3MsIFRSVUUpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisjZW5kaWYKKworICAgIC8qICdzY3JvbGxvcHQnICovCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9zYm8pCisgICAgeworCWlmIChjaGVja19vcHRfc3RyaW5ncyhwX3NibywgcF9zY2JvcHRfdmFsdWVzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiAnYW1iaXdpZHRoJyAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2FtYncpCisgICAgeworCWlmIChjaGVja19vcHRfc3RyaW5ncyhwX2FtYncsIHBfYW1id192YWx1ZXMsIEZBTFNFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiAnYmFja2dyb3VuZCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2JnKQorICAgIHsKKwlpZiAoY2hlY2tfb3B0X3N0cmluZ3MocF9iZywgcF9iZ192YWx1ZXMsIEZBTFNFKSA9PSBPSykKKwl7CisjaWZkZWYgRkVBVF9FVkFMCisJICAgIGludCBkYXJrID0gKCpwX2JnID09ICdkJyk7CisjZW5kaWYKKworCSAgICBpbml0X2hpZ2hsaWdodChGQUxTRSwgRkFMU0UpOworCisjaWZkZWYgRkVBVF9FVkFMCisJICAgIGlmIChkYXJrICE9ICgqcF9iZyA9PSAnZCcpCisJCQkgICYmIGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOmNvbG9yc19uYW1lIikgIT0gTlVMTCkKKwkgICAgeworCQkvKiBUaGUgY29sb3Igc2NoZW1lIG11c3QgaGF2ZSBzZXQgJ2JhY2tncm91bmQnIGJhY2sgdG8gYW5vdGhlcgorCQkgKiB2YWx1ZSwgdGhhdCdzIG5vdCB3aGF0IHdlIHdhbnQgaGVyZS4gIERpc2FibGUgdGhlIGNvbG9yCisJCSAqIHNjaGVtZSBhbmQgc2V0IHRoZSBjb2xvcnMgYWdhaW4uICovCisJCWRvX3VubGV0KChjaGFyX3UgKikiZzpjb2xvcnNfbmFtZSIpOworCQlmcmVlX3N0cmluZ19vcHRpb24ocF9iZyk7CisJCXBfYmcgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopKGRhcmsgPyAiZGFyayIgOiAibGlnaHQiKSk7CisJCWNoZWNrX3N0cmluZ19vcHRpb24oJnBfYmcpOworCQlpbml0X2hpZ2hsaWdodChGQUxTRSwgRkFMU0UpOworCSAgICB9CisjZW5kaWYKKwl9CisJZWxzZQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisKKyAgICAvKiAnd2lsZG1vZGUnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF93aW0pCisgICAgeworCWlmIChjaGVja19vcHRfd2ltKCkgPT0gRkFJTCkKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisgICAgfQorCisjaWZkZWYgRkVBVF9XQUsKKyAgICAvKiAnd2luYWx0a2V5cycgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3dhaykKKyAgICB7CisJaWYgKCpwX3dhayA9PSBOVUwKKwkJfHwgY2hlY2tfb3B0X3N0cmluZ3MocF93YWssIHBfd2FrX3ZhbHVlcywgRkFMU0UpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyMgaWZkZWYgRkVBVF9NRU5VCisjICBpZmRlZiBGRUFUX0dVSV9NT1RJRgorCWVsc2UgaWYgKGd1aS5pbl91c2UpCisJICAgIGd1aV9tb3RpZl9zZXRfbW5lbW9uaWNzKHBfd2FrWzBdID09ICd5JyB8fCBwX3dha1swXSA9PSAnbScpOworIyAgZWxzZQorIyAgIGlmZGVmIEZFQVRfR1VJX0dUSworCWVsc2UgaWYgKGd1aS5pbl91c2UpCisJICAgIGd1aV9ndGtfc2V0X21uZW1vbmljcyhwX3dha1swXSA9PSAneScgfHwgcF93YWtbMF0gPT0gJ20nKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIC8qICdldmVudGlnbm9yZScgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2VpKQorICAgIHsKKwlpZiAoY2hlY2tfZWkoKSA9PSBGQUlMKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiAnZW5jb2RpbmcnIGFuZCAnZmlsZWVuY29kaW5nJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZW5jIHx8IGd2YXJwID09ICZwX2ZlbmMgfHwgdmFycCA9PSAmcF90ZW5jKQorICAgIHsKKwlpZiAoZ3ZhcnAgPT0gJnBfZmVuYykKKwl7CisJICAgIGlmICghY3VyYnVmLT5iX3BfbWEpCisJCWVycm1zZyA9IGVfbW9kaWZpYWJsZTsKKwkgICAgZWxzZSBpZiAodmltX3N0cmNocigqdmFycCwgJywnKSAhPSBOVUxMKQorCQkvKiBObyBjb21tYSBhbGxvd2VkIGluICdmaWxlZW5jb2RpbmcnOyBjYXRjaGVzIGNvbmZ1c2luZyBpdAorCQkgKiB3aXRoICdmaWxlZW5jb2RpbmdzJy4gKi8KKwkJZXJybXNnID0gZV9pbnZhcmc7CisjIGlmZGVmIEZFQVRfVElUTEUKKwkgICAgZWxzZQorCQkvKiBNYXkgc2hvdyBhICIrIiBpbiB0aGUgdGl0bGUgbm93LiAqLworCQluZWVkX21ha2V0aXRsZSA9IFRSVUU7CisjIGVuZGlmCisJfQorCWlmIChlcnJtc2cgPT0gTlVMTCkKKwl7CisJICAgIC8qIGNhbm9uaXplIHRoZSB2YWx1ZSwgc28gdGhhdCBTVFJDTVAoKSBjYW4gYmUgdXNlZCBvbiBpdCAqLworCSAgICBwID0gZW5jX2Nhbm9uaXplKCp2YXJwKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkgICAgeworCQl2aW1fZnJlZSgqdmFycCk7CisJCSp2YXJwID0gcDsKKwkgICAgfQorCSAgICBpZiAodmFycCA9PSAmcF9lbmMpCisJICAgIHsKKwkJZXJybXNnID0gbWJfaW5pdCgpOworIyBpZmRlZiBGRUFUX1RJVExFCisJCW5lZWRfbWFrZXRpdGxlID0gVFJVRTsKKyMgZW5kaWYKKwkgICAgfQorCX0KKworIyBpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgJiYgZGVmaW5lZChIQVZFX0dUSzIpCisJaWYgKGVycm1zZyA9PSBOVUxMICYmIHZhcnAgPT0gJnBfdGVuYyAmJiBndWkuaW5fdXNlKQorCXsKKwkgICAgLyogR1RLKyAyIHVzZXMgb25seSBhIHNpbmdsZSBlbmNvZGluZywgYW5kIHRoYXQgaXMgVVRGLTguICovCisJICAgIGlmIChTVFJDTVAocF90ZW5jLCAidXRmLTgiKSAhPSAwKQorCQllcnJtc2cgPSAoY2hhcl91ICopTl8oIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIik7CisJfQorIyBlbmRpZgorCisJaWYgKGVycm1zZyA9PSBOVUxMKQorCXsKKyMgaWZkZWYgRkVBVF9LRVlNQVAKKwkgICAgLyogV2hlbiAna2V5bWFwJyBpcyB1c2VkIGFuZCAnZW5jb2RpbmcnIGNoYW5nZXMsIHJlbG9hZCB0aGUga2V5bWFwCisJICAgICAqICh3aXRoIGFub3RoZXIgZW5jb2RpbmcpLiAqLworCSAgICBpZiAodmFycCA9PSAmcF9lbmMgJiYgKmN1cmJ1Zi0+Yl9wX2tleW1hcCAhPSBOVUwpCisJCSh2b2lkKWtleW1hcF9pbml0KCk7CisjIGVuZGlmCisKKwkgICAgLyogV2hlbiAndGVybWVuY29kaW5nJyBpcyBub3QgZW1wdHkgYW5kICdlbmNvZGluZycgY2hhbmdlcyBvciB3aGVuCisJICAgICAqICd0ZXJtZW5jb2RpbmcnIGNoYW5nZXMsIG5lZWQgdG8gc2V0dXAgZm9yIGtleWJvYXJkIGlucHV0IGFuZAorCSAgICAgKiBkaXNwbGF5IG91dHB1dCBjb252ZXJzaW9uLiAqLworCSAgICBpZiAoKCh2YXJwID09ICZwX2VuYyAmJiAqcF90ZW5jICE9IE5VTCkgfHwgdmFycCA9PSAmcF90ZW5jKSkKKwkgICAgeworCQljb252ZXJ0X3NldHVwKCZpbnB1dF9jb252LCBwX3RlbmMsIHBfZW5jKTsKKwkJY29udmVydF9zZXR1cCgmb3V0cHV0X2NvbnYsIHBfZW5jLCBwX3RlbmMpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9wZW5jKQorICAgIHsKKwkvKiBDYW5vbml6ZSBwcmludGVuY29kaW5nIGlmIFZJTSBzdGFuZGFyZCBvbmUgKi8KKwlwID0gZW5jX2Nhbm9uaXplKHBfcGVuYyk7CisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKHBfcGVuYyk7CisJICAgIHBfcGVuYyA9IHA7CisJfQorCWVsc2UKKwl7CisJICAgIC8qIEVuc3VyZSBsb3dlciBjYXNlIGFuZCAnLScgZm9yICdfJyAqLworCSAgICBmb3IgKHMgPSBwX3BlbmM7ICpzICE9IE5VTDsgcysrKQorCSAgICB7CisJCWlmICgqcyA9PSAnXycpCisJCSAgICAqcyA9ICctJzsKKwkJZWxzZQorCQkgICAgKnMgPSBUT0xPV0VSX0FTQygqcyk7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2ltYWspCisgICAgeworCWlmIChndWkuaW5fdXNlICYmICFpbV94aW1faXN2YWxpZF9pbWFjdGl2YXRlKCkpCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9LRVlNQVAKKyAgICBlbHNlIGlmICh2YXJwID09ICZjdXJidWYtPmJfcF9rZXltYXApCisgICAgeworCS8qIGxvYWQgb3IgdW5sb2FkIGtleSBtYXBwaW5nIHRhYmxlcyAqLworCWVycm1zZyA9IGtleW1hcF9pbml0KCk7CisKKwkvKiBXaGVuIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgYSBuZXcga2V5bWFwIHN3aXRjaCBvbiB1c2luZyBpdC4gKi8KKwlpZiAoKmN1cmJ1Zi0+Yl9wX2tleW1hcCAhPSBOVUwgJiYgZXJybXNnID09IE5VTEwpCisJeworCSAgICBjdXJidWYtPmJfcF9pbWluc2VydCA9IEJfSU1PREVfTE1BUDsKKwkgICAgaWYgKGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoICE9IEJfSU1PREVfVVNFX0lOU0VSVCkKKwkJY3VyYnVmLT5iX3BfaW1zZWFyY2ggPSBCX0lNT0RFX0xNQVA7CisJICAgIHNldF9pbWluc2VydF9nbG9iYWwoKTsKKwkgICAgc2V0X2ltc2VhcmNoX2dsb2JhbCgpOworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwkgICAgc3RhdHVzX3JlZHJhd19jdXJidWYoKTsKKyMgZW5kaWYKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiAnZmlsZWZvcm1hdCcgKi8KKyAgICBlbHNlIGlmIChndmFycCA9PSAmcF9mZikKKyAgICB7CisJaWYgKCFjdXJidWYtPmJfcF9tYSAmJiAhKG9wdF9mbGFncyAmIE9QVF9HTE9CQUwpKQorCSAgICBlcnJtc2cgPSBlX21vZGlmaWFibGU7CisJZWxzZSBpZiAoY2hlY2tfb3B0X3N0cmluZ3MoKnZhcnAsIHBfZmZfdmFsdWVzLCBGQUxTRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCWVsc2UKKwl7CisJICAgIC8qIG1heSBhbHNvIGNoYW5nZSAndGV4dG1vZGUnICovCisJICAgIGlmIChnZXRfZmlsZWZvcm1hdChjdXJidWYpID09IEVPTF9ET1MpCisJCWN1cmJ1Zi0+Yl9wX3R4ID0gVFJVRTsKKwkgICAgZWxzZQorCQljdXJidWYtPmJfcF90eCA9IEZBTFNFOworI2lmZGVmIEZFQVRfVElUTEUKKwkgICAgbmVlZF9tYWtldGl0bGUgPSBUUlVFOworI2VuZGlmCisJfQorICAgIH0KKworICAgIC8qICdmaWxlZm9ybWF0cycgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2ZmcykKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHBfZmZzLCBwX2ZmX3ZhbHVlcywgVFJVRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCWVsc2UKKwl7CisJICAgIC8qIGFsc28gY2hhbmdlICd0ZXh0YXV0bycgKi8KKwkgICAgaWYgKCpwX2ZmcyA9PSBOVUwpCisJCXBfdGEgPSBGQUxTRTsKKwkgICAgZWxzZQorCQlwX3RhID0gVFJVRTsKKwl9CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0NSWVBUKSAmJiBkZWZpbmVkKEZFQVRfQ01ESElTVCkKKyAgICAvKiAnY3J5cHRrZXknICovCisgICAgZWxzZSBpZiAoZ3ZhcnAgPT0gJnBfa2V5KQorICAgIHsKKwkvKiBNYWtlIHN1cmUgdGhlICI6c2V0IiBjb21tYW5kIGRvZXNuJ3Qgc2hvdyB0aGUgbmV3IHZhbHVlIGluIHRoZQorCSAqIGhpc3RvcnkuICovCisJcmVtb3ZlX2tleV9mcm9tX2hpc3RvcnkoKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qICdtYXRjaHBhaXJzJyAqLworICAgIGVsc2UgaWYgKGd2YXJwID09ICZwX21wcykKKyAgICB7CisJLyogQ2hlY2sgZm9yICJ4OnkseDp5IiAqLworCWZvciAocCA9ICp2YXJwOyAqcCAhPSBOVUw7IHAgKz0gNCkKKwl7CisJICAgIGlmIChwWzFdICE9ICc6JyB8fCBwWzJdID09IE5VTCB8fCAocFszXSAhPSBOVUwgJiYgcFszXSAhPSAnLCcpKQorCSAgICB7CisJCWVycm1zZyA9IGVfaW52YXJnOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAocFszXSA9PSBOVUwpCisJCWJyZWFrOworCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisgICAgLyogJ2NvbW1lbnRzJyAqLworICAgIGVsc2UgaWYgKGd2YXJwID09ICZwX2NvbSkKKyAgICB7CisJZm9yIChzID0gKnZhcnA7ICpzOyApCisJeworCSAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJzonKQorCSAgICB7CisJCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilDT01fQUxMLCAqcykgPT0gTlVMTAorCQkJCQkgICAgICYmICFWSU1fSVNESUdJVCgqcykgJiYgKnMgIT0gJy0nKQorCQl7CisJCSAgICBlcnJtc2cgPSBpbGxlZ2FsX2NoYXIoZXJyYnVmLCAqcyk7CisJCSAgICBicmVhazsKKwkJfQorCQkrK3M7CisJICAgIH0KKwkgICAgaWYgKCpzKysgPT0gTlVMKQorCQllcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1MjQ6IE1pc3NpbmcgY29sb24iKTsKKwkgICAgZWxzZSBpZiAoKnMgPT0gJywnIHx8ICpzID09IE5VTCkKKwkJZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTI1OiBaZXJvIGxlbmd0aCBzdHJpbmciKTsKKwkgICAgaWYgKGVycm1zZyAhPSBOVUxMKQorCQlicmVhazsKKwkgICAgd2hpbGUgKCpzICYmICpzICE9ICcsJykKKwkgICAgeworCQlpZiAoKnMgPT0gJ1xcJyAmJiBzWzFdICE9IE5VTCkKKwkJICAgICsrczsKKwkJKytzOworCSAgICB9CisJICAgIHMgPSBza2lwX3RvX29wdGlvbl9wYXJ0KHMpOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qICdsaXN0Y2hhcnMnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9sY3MpCisgICAgeworCWVycm1zZyA9IHNldF9jaGFyc19vcHRpb24odmFycCk7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorICAgIC8qICdmaWxsY2hhcnMnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9mY3MpCisgICAgeworCWVycm1zZyA9IHNldF9jaGFyc19vcHRpb24odmFycCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0NNRFdJTgorICAgIC8qICdjZWRpdCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2NlZGl0KQorICAgIHsKKwllcnJtc2cgPSBjaGVja19jZWRpdCgpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisgICAgLyogJ3ZpbWluZm8nICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF92aW1pbmZvKQorICAgIHsKKwlmb3IgKHMgPSBwX3ZpbWluZm87ICpzOykKKwl7CisJICAgIC8qIENoZWNrIGl0J3MgYSB2YWxpZCBjaGFyYWN0ZXIgKi8KKwkgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIhXCIlJy86PEBjZmhucnMiLCAqcykgPT0gTlVMTCkKKwkgICAgeworCQllcnJtc2cgPSBpbGxlZ2FsX2NoYXIoZXJyYnVmLCAqcyk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICgqcyA9PSAnbicpCS8qIG5hbWUgaXMgYWx3YXlzIGxhc3Qgb25lICovCisJICAgIHsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnMgPT0gJ3InKSAvKiBza2lwIHVudGlsIG5leHQgJywnICovCisJICAgIHsKKwkJd2hpbGUgKCorK3MgJiYgKnMgIT0gJywnKQorCQkgICAgOworCSAgICB9CisJICAgIGVsc2UgaWYgKCpzID09ICclJyB8fCAqcyA9PSAnIScgfHwgKnMgPT0gJ2gnIHx8ICpzID09ICdjJykKKwkJKytzOwkJLyogbm8gZXh0cmEgY2hhcnMgKi8KKwkgICAgZWxzZQkJLyogbXVzdCBoYXZlIGEgbnVtYmVyICovCisJICAgIHsKKwkJd2hpbGUgKHZpbV9pc2RpZ2l0KCorK3MpKQorCQkgICAgOworCisJCWlmICghVklNX0lTRElHSVQoKihzIC0gMSkpKQorCQl7CisJCSAgICBpZiAoZXJyYnVmICE9IE5VTEwpCisJCSAgICB7CisJCQlzcHJpbnRmKChjaGFyICopZXJyYnVmLCBfKCJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IiksCisJCQkJCQkgICAgdHJhbnNjaGFyX2J5dGUoKihzIC0gMSkpKTsKKwkJCWVycm1zZyA9IGVycmJ1ZjsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCWVycm1zZyA9IChjaGFyX3UgKikiIjsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgaWYgKCpzID09ICcsJykKKwkJKytzOworCSAgICBlbHNlIGlmICgqcykKKwkgICAgeworCQlpZiAoZXJyYnVmICE9IE5VTEwpCisJCSAgICBlcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1Mjc6IE1pc3NpbmcgY29tbWEiKTsKKwkJZWxzZQorCQkgICAgZXJybXNnID0gKGNoYXJfdSAqKSIiOworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAoKnBfdmltaW5mbyAmJiBlcnJtc2cgPT0gTlVMTCAmJiBnZXRfdmltaW5mb19wYXJhbWV0ZXIoJ1wnJykgPCAwKQorCSAgICBlcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiKTsKKyAgICB9CisjZW5kaWYgLyogRkVBVF9WSU1JTkZPICovCisKKyAgICAvKiB0ZXJtaW5hbCBvcHRpb25zICovCisgICAgZWxzZSBpZiAoaXN0ZXJtb3B0aW9uKCZvcHRpb25zW29wdF9pZHhdKSAmJiBmdWxsX3NjcmVlbikKKyAgICB7CisJLyogIjpzZXQgdF9Dbz0wIiBhbmQgIjpzZXQgdF9Dbz0xIiBkbyAiOnNldCB0X0NvPSIgKi8KKwlpZiAodmFycCA9PSAmVF9DQ08pCisJeworCSAgICB0X2NvbG9ycyA9IGF0b2koKGNoYXIgKilUX0NDTyk7CisJICAgIGlmICh0X2NvbG9ycyA8PSAxKQorCSAgICB7CisJCWlmIChuZXdfdmFsdWVfYWxsb2NlZCkKKwkJICAgIHZpbV9mcmVlKFRfQ0NPKTsKKwkJVF9DQ08gPSBlbXB0eV9vcHRpb247CisJICAgIH0KKwkgICAgLyogV2Ugbm93IGhhdmUgYSBkaWZmZXJlbnQgY29sb3Igc2V0dXAsIGluaXRpYWxpemUgaXQgYWdhaW4uICovCisJICAgIGluaXRfaGlnaGxpZ2h0KFRSVUUsIEZBTFNFKTsKKwl9CisJdHRlc3QoRkFMU0UpOworCWlmICh2YXJwID09ICZUX01FKQorCXsKKwkgICAgb3V0X3N0cihUX01FKTsKKwkgICAgcmVkcmF3X2xhdGVyKENMRUFSKTsKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpKQorCSAgICAvKiBTaW5jZSB0X21lIGhhcyBiZWVuIHNldCwgdGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB1c2VyCisJICAgICAqIHdhbnRzIHRvIHVzZSB0aGlzIGFzIGRlZmF1bHQgY29sb3JzLiAgTmVlZCB0byByZXNldCBkZWZhdWx0CisJICAgICAqIGJhY2tncm91bmQvZm9yZWdyb3VuZCBjb2xvcnMuICovCisJICAgIG1jaF9zZXRfbm9ybWFsX2NvbG9ycygpOworI2VuZGlmCisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfTElORUJSRUFLCisgICAgLyogJ3Nob3dicmVhaycgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3NicikKKyAgICB7CisJZm9yIChzID0gcF9zYnI7ICpzOyApCisJeworCSAgICBpZiAocHRyMmNlbGxzKHMpICE9IDEpCisJCWVycm1zZyA9IChjaGFyX3UgKilOXygiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiKTsKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlzICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocyk7CisJICAgIGVsc2UKKyMgZW5kaWYKKwkJKytzOworCX0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogJ2d1aWZvbnQnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9ndWlmb250KQorICAgIHsKKwlpZiAoZ3VpLmluX3VzZSkKKwl7CisJICAgIHAgPSBwX2d1aWZvbnQ7CisjIGlmZGVmIEZFQVRfR1VJX0dUSworCSAgICAvKgorCSAgICAgKiBQdXQgdXAgYSBmb250IGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIHNlbGVjdCBhIG5ldyB2YWx1ZS4KKwkgICAgICogSWYgdGhpcyBpcyBjYW5jZWxsZWQgZ28gYmFjayB0byB0aGUgb2xkIHZhbHVlIGJ1dCBkb24ndAorCSAgICAgKiBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuCisJICAgICAqLworCSAgICBpZiAoU1RSQ01QKHAsICIqIikgPT0gMCkKKwkgICAgeworCQlwID0gZ3VpX21jaF9mb250X2RpYWxvZyhvbGR2YWwpOworCisJCWlmIChuZXdfdmFsdWVfYWxsb2NlZCkKKwkJICAgIGZyZWVfc3RyaW5nX29wdGlvbihwX2d1aWZvbnQpOworCisJCXBfZ3VpZm9udCA9IChwICE9IE5VTEwpID8gcCA6IHZpbV9zdHJzYXZlKG9sZHZhbCk7CisJCW5ld192YWx1ZV9hbGxvY2VkID0gVFJVRTsKKwkgICAgfQorIyBlbmRpZgorCSAgICBpZiAocCAhPSBOVUxMICYmIGd1aV9pbml0X2ZvbnQocF9ndWlmb250LCBGQUxTRSkgIT0gT0spCisJICAgIHsKKyMgaWYgZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisJCWlmIChTVFJDTVAocF9ndWlmb250LCAiKiIpID09IDApCisJCXsKKwkJICAgIC8qIERpYWxvZyB3YXMgY2FuY2VsbGVkOiBLZWVwIHRoZSBvbGQgdmFsdWUgd2l0aG91dCBnaXZpbmcKKwkJICAgICAqIGFuIGVycm9yIG1lc3NhZ2UuICovCisJCSAgICBpZiAobmV3X3ZhbHVlX2FsbG9jZWQpCisJCQlmcmVlX3N0cmluZ19vcHRpb24ocF9ndWlmb250KTsKKwkJICAgIHBfZ3VpZm9udCA9IHZpbV9zdHJzYXZlKG9sZHZhbCk7CisJCSAgICBuZXdfdmFsdWVfYWxsb2NlZCA9IFRSVUU7CisJCX0KKwkJZWxzZQorIyBlbmRpZgorCQkgICAgZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTk2OiBJbnZhbGlkIGZvbnQocykiKTsKKwkgICAgfQorCX0KKyAgICB9CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2d1aWZvbnRzZXQpCisgICAgeworCWlmIChTVFJDTVAocF9ndWlmb250c2V0LCAiKiIpID09IDApCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiKTsKKwllbHNlIGlmIChndWkuaW5fdXNlICYmIGd1aV9pbml0X2ZvbnQocF9ndWlmb250c2V0LCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiKTsKKyAgICB9CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2d1aWZvbnR3aWRlKQorICAgIHsKKwlpZiAoU1RSQ01QKHBfZ3VpZm9udHdpZGUsICIqIikgPT0gMCkKKwkgICAgZXJybXNnID0gKGNoYXJfdSAqKU5fKCJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250Iik7CisJZWxzZSBpZiAoZ3VpX2dldF93aWRlX2ZvbnQoKSA9PSBGQUlMKQorCSAgICBlcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1MzQ6IEludmFsaWQgd2lkZSBmb250Iik7CisgICAgfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKyAgICAvKiAnZ3VpY3Vyc29yJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZ3VpY3Vyc29yKQorCWVycm1zZyA9IHBhcnNlX3NoYXBlX29wdChTSEFQRV9DVVJTT1IpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKKyAgICAvKiAnbW91c2VzaGFwZScgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX21vdXNlc2hhcGUpCisgICAgeworCWVycm1zZyA9IHBhcnNlX3NoYXBlX29wdChTSEFQRV9NT1VTRSk7CisJdXBkYXRlX21vdXNlc2hhcGUoLTEpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9QUklOVEVSCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9wb3B0KQorCWVycm1zZyA9IHBhcnNlX2xpc3Rfb3B0aW9ucyhwX3BvcHQsIHByaW50ZXJfb3B0cywgT1BUX1BSSU5UX05VTV9PUFRJT05TKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9MQU5HTUFQCisgICAgLyogJ2xhbmdtYXAnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9sYW5nbWFwKQorCWxhbmdtYXBfc2V0KCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTElORUJSRUFLCisgICAgLyogJ2JyZWFrYXQnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9icmVha2F0KQorCWZpbGxfYnJlYWthdF9mbGFncygpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgLyogJ3RpdGxlc3RyaW5nJyBhbmQgJ2ljb25zdHJpbmcnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF90aXRsZXN0cmluZyB8fCB2YXJwID09ICZwX2ljb25zdHJpbmcpCisgICAgeworIyBpZmRlZiBGRUFUX1NUTF9PUFQKKwlpbnQJZmxhZ3ZhbCA9ICh2YXJwID09ICZwX3RpdGxlc3RyaW5nKSA/IFNUTF9JTl9USVRMRSA6IFNUTF9JTl9JQ09OOworCisJLyogTlVMTCA9PiBzdGF0dXNsaW5lIHN5bnRheCAqLworCWlmICh2aW1fc3RyY2hyKCp2YXJwLCAnJScpICYmIGNoZWNrX3N0bF9vcHRpb24oKnZhcnApID09IE5VTEwpCisJICAgIHN0bF9zeW50YXggfD0gZmxhZ3ZhbDsKKwllbHNlCisJICAgIHN0bF9zeW50YXggJj0gfmZsYWd2YWw7CisjIGVuZGlmCisJZGlkX3NldF90aXRsZSh2YXJwID09ICZwX2ljb25zdHJpbmcpOworCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qICdndWlvcHRpb25zJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZ28pCisJZ3VpX2luaXRfd2hpY2hfY29tcG9uZW50cyhvbGR2YWwpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0VfVFRZKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpCisgICAgLyogJ3R0eW1vdXNlJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfdHR5bSkKKyAgICB7CisJaWYgKG9wdF9zdHJpbmdzX2ZsYWdzKHBfdHR5bSwgcF90dHltX3ZhbHVlcywgJnR0eW1fZmxhZ3MsIEZBTFNFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJZWxzZQorCSAgICBjaGVja19tb3VzZV90ZXJtY29kZSgpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiAnc2VsZWN0aW9uJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfc2VsKQorICAgIHsKKwlpZiAoKnBfc2VsID09IE5VTAorCQl8fCBjaGVja19vcHRfc3RyaW5ncyhwX3NlbCwgcF9zZWxfdmFsdWVzLCBGQUxTRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKworICAgIC8qICdzZWxlY3Rtb2RlJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfc2xtKQorICAgIHsKKwlpZiAoY2hlY2tfb3B0X3N0cmluZ3MocF9zbG0sIHBfc2xtX3ZhbHVlcywgVFJVRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9CUk9XU0UKKyAgICAvKiAnYnJvd3NlZGlyJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfYnNkaXIpCisgICAgeworCWlmIChjaGVja19vcHRfc3RyaW5ncyhwX2JzZGlyLCBwX2JzZGlyX3ZhbHVlcywgRkFMU0UpICE9IE9LCisJCSYmICFtY2hfaXNkaXIocF9ic2RpcikpCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiAna2V5bW9kZWwnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9rbSkKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHBfa20sIHBfa21fdmFsdWVzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJZWxzZQorCXsKKwkgICAga21fc3RvcHNlbCA9ICh2aW1fc3RyY2hyKHBfa20sICdvJykgIT0gTlVMTCk7CisJICAgIGttX3N0YXJ0c2VsID0gKHZpbV9zdHJjaHIocF9rbSwgJ2EnKSAhPSBOVUxMKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiAnbW91c2Vtb2RlbCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX21vdXNlbSkKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHBfbW91c2VtLCBwX21vdXNlbV92YWx1ZXMsIEZBTFNFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisjaWYgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgJiYgZGVmaW5lZChGRUFUX01FTlUpICYmIChYbVZlcnNpb24gPD0gMTAwMikKKwllbHNlIGlmICgqcF9tb3VzZW0gIT0gKm9sZHZhbCkKKwkgICAgLyogQ2hhbmdlZCBmcm9tICJleHRlbmQiIHRvICJwb3B1cCIgb3IgInBvcHVwX3NldHBvcyIgb3IgdnY6IG5lZWQKKwkgICAgICogdG8gY3JlYXRlIG9yIGRlbGV0ZSB0aGUgcG9wdXAgbWVudXMuICovCisJICAgIGd1aV9tb3RpZl91cGRhdGVfbW91c2Vtb2RlbChyb290X21lbnUpOworI2VuZGlmCisgICAgfQorCisgICAgLyogJ3N3aXRjaGJ1ZicgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3N3YikKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHBfc3diLCBwX3N3Yl92YWx1ZXMsIFRSVUUpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisKKyAgICAvKiAnZGVidWcnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9kZWJ1ZykKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHBfZGVidWcsIHBfZGVidWdfdmFsdWVzLCBGQUxTRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKworICAgIC8qICdkaXNwbGF5JyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZHkpCisgICAgeworCWlmIChvcHRfc3RyaW5nc19mbGFncyhwX2R5LCBwX2R5X3ZhbHVlcywgJmR5X2ZsYWdzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJZWxzZQorCSAgICAodm9pZClpbml0X2NoYXJ0YWIoKTsKKworICAgIH0KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgLyogJ2VhZGlyZWN0aW9uJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZWFkKQorICAgIHsKKwlpZiAoY2hlY2tfb3B0X3N0cmluZ3MocF9lYWQsIHBfZWFkX3ZhbHVlcywgRkFMU0UpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyogJ2NsaXBib2FyZCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2NiKQorCWVycm1zZyA9IGNoZWNrX2NsaXBib2FyZF9vcHRpb24oKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisjIGlmZGVmIEZFQVRfU1lOX0hMCisgICAgLyogV2hlbiAnc3ludGF4JyBpcyBzZXQsIGxvYWQgdGhlIHN5bnRheCBvZiB0aGF0IG5hbWUgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICYoY3VyYnVmLT5iX3Bfc3luKSkKKyAgICB7CisJYXBwbHlfYXV0b2NtZHMoRVZFTlRfU1lOVEFYLCBjdXJidWYtPmJfcF9zeW4sCisJCQkJCSAgICAgY3VyYnVmLT5iX2ZuYW1lLCBUUlVFLCBjdXJidWYpOworICAgIH0KKyMgZW5kaWYKKworICAgIC8qIFdoZW4gJ2ZpbGV0eXBlJyBpcyBzZXQsIHRyaWdnZXIgdGhlIEZpbGVUeXBlIGF1dG9jb21tYW5kcyBvZiB0aGF0IG5hbWUgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICYoY3VyYnVmLT5iX3BfZnQpKQorICAgIHsKKwlkaWRfZmlsZXR5cGUgPSBUUlVFOworCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0ZJTEVUWVBFLCBjdXJidWYtPmJfcF9mdCwKKwkJCQkJICAgICBjdXJidWYtPmJfZm5hbWUsIFRSVUUsIGN1cmJ1Zik7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisgICAgLyogV2hlbiAnYnVmaGlkZGVuJyBpcyBzZXQsIGNoZWNrIGZvciB2YWxpZCB2YWx1ZS4gKi8KKyAgICBlbHNlIGlmIChndmFycCA9PSAmcF9iaCkKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKGN1cmJ1Zi0+Yl9wX2JoLCBwX2J1ZmhpZGRlbl92YWx1ZXMsIEZBTFNFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisgICAgfQorCisgICAgLyogV2hlbiAnYnVmdHlwZScgaXMgc2V0LCBjaGVjayBmb3IgdmFsaWQgdmFsdWUuICovCisgICAgZWxzZSBpZiAoZ3ZhcnAgPT0gJnBfYnQpCisgICAgeworCWlmIChjaGVja19vcHRfc3RyaW5ncyhjdXJidWYtPmJfcF9idCwgcF9idWZ0eXBlX3ZhbHVlcywgRkFMU0UpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKwllbHNlCisJeworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwkgICAgaWYgKGN1cndpbi0+d19zdGF0dXNfaGVpZ2h0KQorCSAgICB7CisJCWN1cndpbi0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisJCXJlZHJhd19sYXRlcihWQUxJRCk7CisJICAgIH0KKyMgZW5kaWYKKwkgICAgY3VyYnVmLT5iX2hlbHAgPSAoY3VyYnVmLT5iX3BfYnRbMF0gPT0gJ2gnKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NUTF9PUFQKKyAgICAvKiAnc3RhdHVzbGluZScgb3IgJ3J1bGVyZm9ybWF0JyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfc3RsIHx8IHZhcnAgPT0gJnBfcnVmKQorICAgIHsKKwlpbnQgd2lkOworCisJaWYgKHZhcnAgPT0gJnBfcnVmKQkvKiByZXNldCBydV93aWQgZmlyc3QgKi8KKwkgICAgcnVfd2lkID0gMDsKKwlzID0gKnZhcnA7CisJaWYgKHZhcnAgPT0gJnBfcnVmICYmICpzID09ICclJykKKwl7CisJICAgIC8qIHNldCBydV93aWQgaWYgJ3J1Zicgc3RhcnRzIHdpdGggIiU5OSgiICovCisJICAgIGlmICgqKytzID09ICctJykJLyogaWdub3JlIGEgJy0nICovCisJCXMrKzsKKwkgICAgd2lkID0gZ2V0ZGlnaXRzKCZzKTsKKwkgICAgaWYgKHdpZCAmJiAqcyA9PSAnKCcgJiYgKGVycm1zZyA9IGNoZWNrX3N0bF9vcHRpb24ocF9ydWYpKSA9PSBOVUxMKQorCQlydV93aWQgPSB3aWQ7CisJICAgIGVsc2UKKwkJZXJybXNnID0gY2hlY2tfc3RsX29wdGlvbihwX3J1Zik7CisJfQorCWVsc2UKKwkgICAgZXJybXNnID0gY2hlY2tfc3RsX29wdGlvbihzKTsKKwlpZiAodmFycCA9PSAmKHBfcnVmKSAmJiBlcnJtc2cgPT0gTlVMTCkKKwkgICAgY29tcF9jb2woKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIC8qIGNoZWNrIGlmIGl0IGlzIGEgdmFsaWQgdmFsdWUgZm9yICdjb21wbGV0ZScgLS0gQWNldmVkbyAqLworICAgIGVsc2UgaWYgKGd2YXJwID09ICZwX2NwdCkKKyAgICB7CisJZm9yIChzID0gKnZhcnA7ICpzOykKKwl7CisJICAgIHdoaWxlKCpzID09ICcsJyB8fCAqcyA9PSAnICcpCisJCXMrKzsKKwkgICAgaWYgKCEqcykKKwkJYnJlYWs7CisJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiLndidWtzaWRddFUiLCAqcykgPT0gTlVMTCkKKwkgICAgeworCQllcnJtc2cgPSBpbGxlZ2FsX2NoYXIoZXJyYnVmLCAqcyk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICgqKytzICE9IE5VTCAmJiAqcyAhPSAnLCcgJiYgKnMgIT0gJyAnKQorCSAgICB7CisJCWlmIChzWy0xXSA9PSAnaycgfHwgc1stMV0gPT0gJ3MnKQorCQl7CisJCSAgICAvKiBza2lwIG9wdGlvbmFsIGZpbGVuYW1lIGFmdGVyICdrJyBhbmQgJ3MnICovCisJCSAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJywnICYmICpzICE9ICcgJykKKwkJICAgIHsKKwkJCWlmICgqcyA9PSAnXFwnKQorCQkJICAgICsrczsKKwkJCSsrczsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGlmIChlcnJidWYgIT0gTlVMTCkKKwkJICAgIHsKKwkJCXNwcmludGYoKGNoYXIgKillcnJidWYsCisJCQkJICAgICBfKCJFNTM1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IiksCisJCQkJICAgICAqLS1zKTsKKwkJCWVycm1zZyA9IGVycmJ1ZjsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCWVycm1zZyA9IChjaGFyX3UgKikiIjsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIEZFQVRfSU5TX0VYUEFORCAqLworCisKKyNpZiBkZWZpbmVkKEZFQVRfVE9PTEJBUikgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQorICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfdG9vbGJhcikKKyAgICB7CisJaWYgKG9wdF9zdHJpbmdzX2ZsYWdzKHBfdG9vbGJhciwgcF90b29sYmFyX3ZhbHVlcywKKwkJCSAgICAgICZ0b29sYmFyX2ZsYWdzLCBUUlVFKSAhPSBPSykKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJZWxzZQorCXsKKwkgICAgb3V0X2ZsdXNoKCk7CisJICAgIGd1aV9tY2hfc2hvd190b29sYmFyKCh0b29sYmFyX2ZsYWdzICYKKwkJCQkgIChUT09MQkFSX1RFWFQgfCBUT09MQkFSX0lDT05TKSkgIT0gMCk7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiBkZWZpbmVkKEhBVkVfR1RLMikKKyAgICAvKiAndG9vbGJhcmljb25zaXplJzogR1RLKyAyIG9ubHkgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3RiaXMpCisgICAgeworCWlmIChvcHRfc3RyaW5nc19mbGFncyhwX3RiaXMsIHBfdGJpc192YWx1ZXMsICZ0YmlzX2ZsYWdzLCBGQUxTRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCWVsc2UKKwl7CisJICAgIG91dF9mbHVzaCgpOworCSAgICBndWlfbWNoX3Nob3dfdG9vbGJhcigodG9vbGJhcl9mbGFncyAmCisJCQkJICAoVE9PTEJBUl9URVhUIHwgVE9PTEJBUl9JQ09OUykpICE9IDApOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qICdwYXN0ZXRvZ2dsZSc6IHRyYW5zbGF0ZSBrZXkgY29kZXMgbGlrZSBpbiBhIG1hcHBpbmcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3B0KQorICAgIHsKKwlpZiAoKnBfcHQpCisJeworCSAgICAodm9pZClyZXBsYWNlX3Rlcm1jb2RlcyhwX3B0LCAmcCwgVFJVRSwgVFJVRSk7CisJICAgIGlmIChwICE9IE5VTEwpCisJICAgIHsKKwkJaWYgKG5ld192YWx1ZV9hbGxvY2VkKQorCQkgICAgZnJlZV9zdHJpbmdfb3B0aW9uKHBfcHQpOworCQlwX3B0ID0gcDsKKwkJbmV3X3ZhbHVlX2FsbG9jZWQgPSBUUlVFOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qICdiYWNrc3BhY2UnICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmcF9icykKKyAgICB7CisJaWYgKFZJTV9JU0RJR0lUKCpwX2JzKSkKKwl7CisJICAgIGlmICgqcF9icyA+JzInIHx8IHBfYnNbMV0gIT0gTlVMKQorCQllcnJtc2cgPSBlX2ludmFyZzsKKwl9CisJZWxzZSBpZiAoY2hlY2tfb3B0X3N0cmluZ3MocF9icywgcF9ic192YWx1ZXMsIFRSVUUpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisKKyAgICAvKiAnY2FzZW1hcCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2NtcCkKKyAgICB7CisJaWYgKG9wdF9zdHJpbmdzX2ZsYWdzKHBfY21wLCBwX2NtcF92YWx1ZXMsICZjbXBfZmxhZ3MsIFRSVUUpICE9IE9LKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKiAnZGlmZm9wdCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX2RpcCkKKyAgICB7CisJaWYgKGRpZmZvcHRfY2hhbmdlZCgpID09IEZBSUwpCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyogJ2ZvbGRtZXRob2QnICovCisgICAgZWxzZSBpZiAoZ3ZhcnAgPT0gJmN1cndpbi0+d19hbGxidWZfb3B0LndvX2ZkbSkKKyAgICB7CisJaWYgKGNoZWNrX29wdF9zdHJpbmdzKCp2YXJwLCBwX2ZkbV92YWx1ZXMsIEZBTFNFKSAhPSBPSworCQl8fCAqY3Vyd2luLT53X3BfZmRtID09IE5VTCkKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJZWxzZQorCSAgICBmb2xkVXBkYXRlQWxsKGN1cndpbik7CisgICAgfQorIyBpZmRlZiBGRUFUX0VWQUwKKyAgICAvKiAnZm9sZGV4cHInICovCisgICAgZWxzZSBpZiAodmFycCA9PSAmY3Vyd2luLT53X3BfZmRlKQorICAgIHsKKwlpZiAoZm9sZG1ldGhvZElzRXhwcihjdXJ3aW4pKQorCSAgICBmb2xkVXBkYXRlQWxsKGN1cndpbik7CisgICAgfQorIyBlbmRpZgorICAgIC8qICdmb2xkbWFya2VyJyAqLworICAgIGVsc2UgaWYgKGd2YXJwID09ICZjdXJ3aW4tPndfYWxsYnVmX29wdC53b19mbXIpCisgICAgeworCXAgPSB2aW1fc3RyY2hyKCp2YXJwLCAnLCcpOworCWlmIChwID09IE5VTEwpCisJICAgIGVycm1zZyA9IChjaGFyX3UgKilOXygiRTUzNjogY29tbWEgcmVxdWlyZWQiKTsKKwllbHNlIGlmIChwID09ICp2YXJwIHx8IHBbMV0gPT0gTlVMKQorCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKwllbHNlIGlmIChmb2xkbWV0aG9kSXNNYXJrZXIoY3Vyd2luKSkKKwkgICAgZm9sZFVwZGF0ZUFsbChjdXJ3aW4pOworICAgIH0KKyAgICAvKiAnY29tbWVudHN0cmluZycgKi8KKyAgICBlbHNlIGlmIChndmFycCA9PSAmcF9jbXMpCisgICAgeworCWlmICgqKnZhcnAgIT0gTlVMICYmIHN0cnN0cigoY2hhciAqKSp2YXJwLCAiJXMiKSA9PSBOVUxMKQorCSAgICBlcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiKTsKKyAgICB9CisgICAgLyogJ2ZvbGRvcGVuJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZmRvKQorICAgIHsKKwlpZiAob3B0X3N0cmluZ3NfZmxhZ3MocF9mZG8sIHBfZmRvX3ZhbHVlcywgJmZkb19mbGFncywgVFJVRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyAgICAvKiAnZm9sZGNsb3NlJyAqLworICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfZmNsKQorICAgIHsKKwlpZiAoY2hlY2tfb3B0X3N0cmluZ3MocF9mY2wsIHBfZmNsX3ZhbHVlcywgVFJVRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIC8qICd2aXJ0dWFsZWRpdCcgKi8KKyAgICBlbHNlIGlmICh2YXJwID09ICZwX3ZlKQorICAgIHsKKwlpZiAob3B0X3N0cmluZ3NfZmxhZ3MocF92ZSwgcF92ZV92YWx1ZXMsICZ2ZV9mbGFncywgVFJVRSkgIT0gT0spCisJICAgIGVycm1zZyA9IGVfaW52YXJnOworCWVsc2UgaWYgKFNUUkNNUChwX3ZlLCBvbGR2YWwpICE9IDApCisJeworCSAgICAvKiBSZWNvbXB1dGUgY3Vyc29yIHBvc2l0aW9uIGluIGNhc2UgdGhlIG5ldyAndmUnIHNldHRpbmcKKwkgICAgICogY2hhbmdlcyBzb21ldGhpbmcuICovCisJICAgIHZhbGlkYXRlX3ZpcnRjb2woKTsKKwkgICAgY29sYWR2YW5jZShjdXJ3aW4tPndfdmlydGNvbCk7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NTQ09QRSkgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorICAgIGVsc2UgaWYgKHZhcnAgPT0gJnBfY3NxZikKKyAgICB7CisJaWYgKHBfY3NxZiAhPSBOVUxMKQorCXsKKwkgICAgcCA9IHBfY3NxZjsKKwkgICAgd2hpbGUgKCpwICE9IE5VTCkKKwkgICAgeworCQlpZiAodmltX3N0cmNocigoY2hhcl91ICopQ1NRRl9DTURTLCAqcCkgPT0gTlVMTAorCQkJfHwgcFsxXSA9PSBOVUwKKwkJCXx8IHZpbV9zdHJjaHIoKGNoYXJfdSAqKUNTUUZfRkxBR1MsIHBbMV0pID09IE5VTEwKKwkJCXx8IChwWzJdICE9IE5VTCAmJiBwWzJdICE9ICcsJykpCisJCXsKKwkJICAgIGVycm1zZyA9IGVfaW52YXJnOworCQkgICAgYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAocFsyXSA9PSBOVUwpCisJCSAgICBicmVhazsKKwkJZWxzZQorCQkgICAgcCArPSAzOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogT3B0aW9ucyB0aGF0IGFyZSBhIGxpc3Qgb2YgZmxhZ3MuICovCisgICAgZWxzZQorICAgIHsKKwlwID0gTlVMTDsKKwlpZiAodmFycCA9PSAmcF93dykKKwkgICAgcCA9IChjaGFyX3UgKilXV19BTEw7CisJaWYgKHZhcnAgPT0gJnBfc2htKQorCSAgICBwID0gKGNoYXJfdSAqKVNITV9BTEw7CisJZWxzZSBpZiAodmFycCA9PSAmKHBfY3BvKSkKKwkgICAgcCA9IChjaGFyX3UgKilDUE9fQUxMOworCWVsc2UgaWYgKHZhcnAgPT0gJihjdXJidWYtPmJfcF9mbykpCisJICAgIHAgPSAoY2hhcl91ICopRk9fQUxMOworCWVsc2UgaWYgKHZhcnAgPT0gJnBfbW91c2UpCisJeworI2lmZGVmIEZFQVRfTU9VU0UKKwkgICAgcCA9IChjaGFyX3UgKilNT1VTRV9BTEw7CisjZWxzZQorCSAgICBpZiAoKnBfbW91c2UgIT0gTlVMKQorCQllcnJtc2cgPSAoY2hhcl91ICopTl8oIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiKTsKKyNlbmRpZgorCX0KKyNpZiBkZWZpbmVkKEZFQVRfR1VJKQorCWVsc2UgaWYgKHZhcnAgPT0gJnBfZ28pCisJICAgIHAgPSAoY2hhcl91ICopR09fQUxMOworI2VuZGlmCisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIGZvciAocyA9ICp2YXJwOyAqczsgKytzKQorCQlpZiAodmltX3N0cmNocihwLCAqcykgPT0gTlVMTCkKKwkJeworCQkgICAgZXJybXNnID0gaWxsZWdhbF9jaGFyKGVycmJ1ZiwgKnMpOworCQkgICAgYnJlYWs7CisJCX0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBlcnJvciBkZXRlY3RlZCwgcmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWUuCisgICAgICovCisgICAgaWYgKGVycm1zZyAhPSBOVUxMKQorICAgIHsKKwlpZiAobmV3X3ZhbHVlX2FsbG9jZWQpCisJICAgIGZyZWVfc3RyaW5nX29wdGlvbigqdmFycCk7CisJKnZhcnAgPSBvbGR2YWw7CisJLyoKKwkgKiBXaGVuIHJlc2V0dGluZyBzb21lIHZhbHVlcywgbmVlZCB0byBhY3Qgb24gaXQuCisJICovCisJaWYgKGRpZF9jaGFydGFiKQorCSAgICAodm9pZClpbml0X2NoYXJ0YWIoKTsKKwlpZiAodmFycCA9PSAmcF9obCkKKwkgICAgKHZvaWQpaGlnaGxpZ2h0X2NoYW5nZWQoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwkvKiBSZW1lbWJlciB3aGVyZSB0aGUgb3B0aW9uIHdhcyBzZXQuICovCisJb3B0aW9uc1tvcHRfaWR4XS5zY3JpcHRJRCA9IGN1cnJlbnRfU0lEOworI2VuZGlmCisJLyoKKwkgKiBGcmVlIHN0cmluZyBvcHRpb25zIHRoYXQgYXJlIGluIGFsbG9jYXRlZCBtZW1vcnkuCisJICovCisJaWYgKG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgJiBQX0FMTE9DRUQpCisJICAgIGZyZWVfc3RyaW5nX29wdGlvbihvbGR2YWwpOworCWlmIChuZXdfdmFsdWVfYWxsb2NlZCkKKwkgICAgb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX0FMTE9DRUQ7CisJZWxzZQorCSAgICBvcHRpb25zW29wdF9pZHhdLmZsYWdzICY9IH5QX0FMTE9DRUQ7CisKKwlpZiAoKG9wdF9mbGFncyAmIChPUFRfTE9DQUwgfCBPUFRfR0xPQkFMKSkgPT0gMAorCQkmJiAoaW50KW9wdGlvbnNbb3B0X2lkeF0uaW5kaXIgPj0gUFZfQk9USCkKKwl7CisJICAgIC8qIGdsb2JhbCBvcHRpb24gd2l0aCBsb2NhbCB2YWx1ZSBzZXQgdG8gdXNlIGdsb2JhbCB2YWx1ZTsgZnJlZQorCSAgICAgKiB0aGUgbG9jYWwgdmFsdWUgYW5kIG1ha2UgaXQgZW1wdHkgKi8KKwkgICAgcCA9IGdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksIE9QVF9MT0NBTCk7CisJICAgIGZyZWVfc3RyaW5nX29wdGlvbigqKGNoYXJfdSAqKilwKTsKKwkgICAgKihjaGFyX3UgKiopcCA9IGVtcHR5X29wdGlvbjsKKwl9CisKKwkvKiBNYXkgc2V0IGdsb2JhbCB2YWx1ZSBmb3IgbG9jYWwgb3B0aW9uLiAqLworCWVsc2UgaWYgKCEob3B0X2ZsYWdzICYgT1BUX0xPQ0FMKSAmJiBvcHRfZmxhZ3MgIT0gT1BUX0dMT0JBTCkKKwkgICAgc2V0X3N0cmluZ19vcHRpb25fZ2xvYmFsKG9wdF9pZHgsIHZhcnApOworICAgIH0KKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBpZiAodmFycCA9PSAmcF9tb3VzZSkKKyAgICB7CisjIGlmZGVmIEZFQVRfTU9VU0VfVFRZCisJaWYgKCpwX21vdXNlID09IE5VTCkKKwkgICAgbWNoX3NldG1vdXNlKEZBTFNFKTsgICAgLyogc3dpdGNoIG1vdXNlIG9mZiAqLworCWVsc2UKKyMgZW5kaWYKKwkgICAgc2V0bW91c2UoKTsJCSAgICAvKiBpbiBjYXNlICdtb3VzZScgY2hhbmdlZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGN1cndpbi0+d19jdXJzd2FudCAhPSBNQVhDT0wpCisJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7ICAvKiBpbiBjYXNlICdzaG93YnJlYWsnIGNoYW5nZWQgKi8KKyAgICBjaGVja19yZWRyYXcob3B0aW9uc1tvcHRfaWR4XS5mbGFncyk7CisKKyAgICByZXR1cm4gZXJybXNnOworfQorCisvKgorICogSGFuZGxlIHNldHRpbmcgJ2xpc3RjaGFycycgb3IgJ2ZpbGxjaGFycycuCisgKiBSZXR1cm5zIGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgaXQncyBPSy4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorc2V0X2NoYXJzX29wdGlvbih2YXJwKQorICAgIGNoYXJfdQkqKnZhcnA7Cit7CisgICAgaW50CQlyb3VuZCwgaSwgbGVuLCBlbnRyaWVzOworICAgIGNoYXJfdQkqcCwgKnM7CisgICAgaW50CQljMSwgYzIgPSAwOworICAgIHN0cnVjdCBjaGFyc3RhYgorICAgIHsKKwlpbnQJKmNwOworCWNoYXIJKm5hbWU7CisgICAgfTsKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChGRUFUX0ZPTERJTkcpCisgICAgc3RhdGljIHN0cnVjdCBjaGFyc3RhYiBmaWxsdGFiW10gPQorICAgIHsKKwl7JmZpbGxfc3RsLAkic3RsIn0sCisJeyZmaWxsX3N0bG5jLAkic3RsbmMifSwKKwl7JmZpbGxfdmVydCwJInZlcnQifSwKKwl7JmZpbGxfZm9sZCwJImZvbGQifSwKKwl7JmZpbGxfZGlmZiwJImRpZmYifSwKKyAgICB9OworI2VuZGlmCisgICAgc3RhdGljIHN0cnVjdCBjaGFyc3RhYiBsY3N0YWJbXSA9CisgICAgeworCXsmbGNzX2VvbCwJImVvbCJ9LAorCXsmbGNzX2V4dCwJImV4dGVuZHMifSwKKwl7Jmxjc19wcmVjLAkicHJlY2VkZXMifSwKKwl7Jmxjc190YWIyLAkidGFiIn0sCisJeyZsY3NfdHJhaWwsCSJ0cmFpbCJ9LAorICAgIH07CisgICAgc3RydWN0IGNoYXJzdGFiICp0YWI7CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChGRUFUX0ZPTERJTkcpCisgICAgaWYgKHZhcnAgPT0gJnBfbGNzKQorI2VuZGlmCisgICAgeworCXRhYiA9IGxjc3RhYjsKKwllbnRyaWVzID0gc2l6ZW9mKGxjc3RhYikgLyBzaXplb2Yoc3RydWN0IGNoYXJzdGFiKTsKKyAgICB9CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorICAgIGVsc2UKKyAgICB7CisJdGFiID0gZmlsbHRhYjsKKwllbnRyaWVzID0gc2l6ZW9mKGZpbGx0YWIpIC8gc2l6ZW9mKHN0cnVjdCBjaGFyc3RhYik7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBmaXJzdCByb3VuZDogY2hlY2sgZm9yIHZhbGlkIHZhbHVlLCBzZWNvbmQgcm91bmQ6IGFzc2lnbiB2YWx1ZXMgKi8KKyAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPD0gMTsgKytyb3VuZCkKKyAgICB7CisJaWYgKHJvdW5kKQorCXsKKwkgICAgLyogQWZ0ZXIgY2hlY2tpbmcgdGhhdCB0aGUgdmFsdWUgaXMgdmFsaWQ6IHNldCBkZWZhdWx0czogc3BhY2UgZm9yCisJICAgICAqICdmaWxsY2hhcnMnLCBOVUwgZm9yICdsaXN0Y2hhcnMnICovCisJICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyArK2kpCisJCSoodGFiW2ldLmNwKSA9ICh2YXJwID09ICZwX2xjcyA/IE5VTCA6ICcgJyk7CisJICAgIGlmICh2YXJwID09ICZwX2xjcykKKwkJbGNzX3RhYjEgPSBOVUw7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9GT0xESU5HKQorCSAgICBlbHNlCisJCWZpbGxfZGlmZiA9ICctJzsKKyNlbmRpZgorCX0KKwlwID0gKnZhcnA7CisJd2hpbGUgKCpwKQorCXsKKwkgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7ICsraSkKKwkgICAgeworCQlsZW4gPSAoaW50KVNUUkxFTih0YWJbaV0ubmFtZSk7CisJCWlmIChTVFJOQ01QKHAsIHRhYltpXS5uYW1lLCBsZW4pID09IDAKKwkJCSYmIHBbbGVuXSA9PSAnOicKKwkJCSYmIHBbbGVuICsgMV0gIT0gTlVMKQorCQl7CisJCSAgICBzID0gcCArIGxlbiArIDE7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgYzEgPSBtYl9wdHIyY2hhcl9hZHYoJnMpOworI2Vsc2UKKwkJICAgIGMxID0gKnMrKzsKKyNlbmRpZgorCQkgICAgaWYgKHRhYltpXS5jcCA9PSAmbGNzX3RhYjIpCisJCSAgICB7CisJCQlpZiAoKnMgPT0gTlVMKQorCQkJICAgIGNvbnRpbnVlOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCWMyID0gbWJfcHRyMmNoYXJfYWR2KCZzKTsKKyNlbHNlCisJCQljMiA9ICpzKys7CisjZW5kaWYKKwkJICAgIH0KKwkJICAgIGlmICgqcyA9PSAnLCcgfHwgKnMgPT0gTlVMKQorCQkgICAgeworCQkJaWYgKHJvdW5kKQorCQkJeworCQkJICAgIGlmICh0YWJbaV0uY3AgPT0gJmxjc190YWIyKQorCQkJICAgIHsKKwkJCQlsY3NfdGFiMSA9IGMxOworCQkJCWxjc190YWIyID0gYzI7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCQkqKHRhYltpXS5jcCkgPSBjMTsKKworCQkJfQorCQkJcCA9IHM7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgaWYgKGkgPT0gZW50cmllcykKKwkJcmV0dXJuIGVfaW52YXJnOworCSAgICBpZiAoKnAgPT0gJywnKQorCQkrK3A7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOwkvKiBubyBlcnJvciAqLworfQorCisjaWZkZWYgRkVBVF9TVExfT1BUCisvKgorICogQ2hlY2sgdmFsaWRpdHkgb2Ygb3B0aW9ucyB3aXRoIHRoZSAnc3RhdHVzbGluZScgZm9ybWF0LgorICogUmV0dXJuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTC4KKyAqLworICAgIGNoYXJfdSAqCitjaGVja19zdGxfb3B0aW9uKHMpCisgICAgY2hhcl91CSpzOworeworICAgIGludAkJaXRlbWNudCA9IDA7CisgICAgaW50CQlncm91cGRlcHRoID0gMDsKKyAgICBzdGF0aWMgY2hhcl91ICAgZXJyYnVmWzgwXTsKKworICAgIHdoaWxlICgqcyAmJiBpdGVtY250IDwgU1RMX01BWF9JVEVNKQorICAgIHsKKwkvKiBDaGVjayBmb3IgdmFsaWQga2V5cyBhZnRlciAlIHNlcXVlbmNlcyAqLworCXdoaWxlICgqcyAmJiAqcyAhPSAnJScpCisJICAgIHMrKzsKKwlpZiAoISpzKQorCSAgICBicmVhazsKKwlzKys7CisJaWYgKCpzICE9ICclJyAmJiAqcyAhPSAnKScpCisJICAgICsraXRlbWNudDsKKwlpZiAoKnMgPT0gJyUnIHx8ICpzID09IFNUTF9UUlVOQ01BUksgfHwgKnMgPT0gU1RMX01JRERMRU1BUkspCisJeworCSAgICBzKys7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoKnMgPT0gJyknKQorCXsKKwkgICAgcysrOworCSAgICBpZiAoLS1ncm91cGRlcHRoIDwgMCkKKwkJYnJlYWs7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoKnMgPT0gJy0nKQorCSAgICBzKys7CisJd2hpbGUgKFZJTV9JU0RJR0lUKCpzKSkKKwkgICAgcysrOworCWlmICgqcyA9PSBTVExfSElHSExJR0hUKQorCSAgICBjb250aW51ZTsKKwlpZiAoKnMgPT0gJy4nKQorCXsKKwkgICAgcysrOworCSAgICB3aGlsZSAoKnMgJiYgVklNX0lTRElHSVQoKnMpKQorCQlzKys7CisJfQorCWlmICgqcyA9PSAnKCcpCisJeworCSAgICBncm91cGRlcHRoKys7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAodmltX3N0cmNocihTVExfQUxMLCAqcykgPT0gTlVMTCkKKwl7CisJICAgIHJldHVybiBpbGxlZ2FsX2NoYXIoZXJyYnVmLCAqcyk7CisJfQorCWlmICgqcyA9PSAneycpCisJeworCSAgICBzKys7CisJICAgIHdoaWxlICgqcyAhPSAnfScgJiYgKnMpCisJCXMrKzsKKwkgICAgaWYgKCpzICE9ICd9JykKKwkJcmV0dXJuIChjaGFyX3UgKilOXygiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIpOworCX0KKyAgICB9CisgICAgaWYgKGl0ZW1jbnQgPj0gU1RMX01BWF9JVEVNKQorCXJldHVybiAoY2hhcl91ICopTl8oIkU1NDE6IHRvbyBtYW55IGl0ZW1zIik7CisgICAgaWYgKGdyb3VwZGVwdGggIT0gMCkKKwlyZXR1cm4gKGNoYXJfdSAqKU5fKCJFNTQyOiB1bmJhbGFuY2VkIGdyb3VwcyIpOworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorLyoKKyAqIEV4dHJhY3QgdGhlIGl0ZW1zIGluIHRoZSAnY2xpcGJvYXJkJyBvcHRpb24gYW5kIHNldCBnbG9iYWwgdmFsdWVzLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjaGVja19jbGlwYm9hcmRfb3B0aW9uKCkKK3sKKyAgICBpbnQJCW5ld191bm5hbWVkID0gRkFMU0U7CisgICAgaW50CQluZXdfYXV0b3NlbGVjdCA9IEZBTFNFOworICAgIGludAkJbmV3X2F1dG9zZWxlY3RtbCA9IEZBTFNFOworICAgIHJlZ3Byb2dfVAkqbmV3X2V4Y2x1ZGVfcHJvZyA9IE5VTEw7CisgICAgY2hhcl91CSplcnJtc2cgPSBOVUxMOworICAgIGNoYXJfdQkqcDsKKworICAgIGZvciAocCA9IHBfY2I7ICpwICE9IE5VTDsgKQorICAgIHsKKwlpZiAoU1RSTkNNUChwLCAidW5uYW1lZCIsIDcpID09IDAgJiYgKHBbN10gPT0gJywnIHx8IHBbN10gPT0gTlVMKSkKKwl7CisJICAgIG5ld191bm5hbWVkID0gVFJVRTsKKwkgICAgcCArPSA3OworCX0KKwllbHNlIGlmIChTVFJOQ01QKHAsICJhdXRvc2VsZWN0IiwgMTApID09IDAKKwkJCQkJJiYgKHBbMTBdID09ICcsJyB8fCBwWzEwXSA9PSBOVUwpKQorCXsKKwkgICAgbmV3X2F1dG9zZWxlY3QgPSBUUlVFOworCSAgICBwICs9IDEwOworCX0KKwllbHNlIGlmIChTVFJOQ01QKHAsICJhdXRvc2VsZWN0bWwiLCAxMikgPT0gMAorCQkJCQkmJiAocFsxMl0gPT0gJywnIHx8IHBbMTJdID09IE5VTCkpCisJeworCSAgICBuZXdfYXV0b3NlbGVjdG1sID0gVFJVRTsKKwkgICAgcCArPSAxMjsKKwl9CisJZWxzZSBpZiAoU1RSTkNNUChwLCAiZXhjbHVkZToiLCA4KSA9PSAwICYmIG5ld19leGNsdWRlX3Byb2cgPT0gTlVMTCkKKwl7CisJICAgIHAgKz0gODsKKwkgICAgbmV3X2V4Y2x1ZGVfcHJvZyA9IHZpbV9yZWdjb21wKHAsIFJFX01BR0lDKTsKKwkgICAgaWYgKG5ld19leGNsdWRlX3Byb2cgPT0gTlVMTCkKKwkJZXJybXNnID0gZV9pbnZhcmc7CisJICAgIGJyZWFrOworCX0KKwllbHNlCisJeworCSAgICBlcnJtc2cgPSBlX2ludmFyZzsKKwkgICAgYnJlYWs7CisJfQorCWlmICgqcCA9PSAnLCcpCisJICAgICsrcDsKKyAgICB9CisgICAgaWYgKGVycm1zZyA9PSBOVUxMKQorICAgIHsKKwljbGlwX3VubmFtZWQgPSBuZXdfdW5uYW1lZDsKKwljbGlwX2F1dG9zZWxlY3QgPSBuZXdfYXV0b3NlbGVjdDsKKwljbGlwX2F1dG9zZWxlY3RtbCA9IG5ld19hdXRvc2VsZWN0bWw7CisJdmltX2ZyZWUoY2xpcF9leGNsdWRlX3Byb2cpOworCWNsaXBfZXhjbHVkZV9wcm9nID0gbmV3X2V4Y2x1ZGVfcHJvZzsKKyAgICB9CisgICAgZWxzZQorCXZpbV9mcmVlKG5ld19leGNsdWRlX3Byb2cpOworCisgICAgcmV0dXJuIGVycm1zZzsKK30KKyNlbmRpZgorCisvKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gb3B0aW9uLCBhbmQgdGFrZSBjYXJlIG9mIHNpZGUgZWZmZWN0cy4KKyAqIFJldHVybnMgTlVMTCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYW4gZXJyb3IuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3NldF9ib29sX29wdGlvbihvcHRfaWR4LCB2YXJwLCB2YWx1ZSwgb3B0X2ZsYWdzKQorICAgIGludAkJb3B0X2lkeDsJCS8qIGluZGV4IGluIG9wdGlvbnNbXSB0YWJsZSAqLworICAgIGNoYXJfdQkqdmFycDsJCQkvKiBwb2ludGVyIHRvIHRoZSBvcHRpb24gdmFyaWFibGUgKi8KKyAgICBpbnQJCXZhbHVlOwkJCS8qIG5ldyB2YWx1ZSAqLworICAgIGludAkJb3B0X2ZsYWdzOwkJLyogT1BUX0xPQ0FMIGFuZC9vciBPUFRfR0xPQkFMICovCit7CisgICAgaW50CQlvbGRfdmFsdWUgPSAqKGludCAqKXZhcnA7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworICAgIC8qIERpc2FsbG93IGNoYW5naW5nIHNvbWUgb3B0aW9ucyBmcm9tIHNlY3VyZSBtb2RlICovCisgICAgaWYgKChzZWN1cmUKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKwkJfHwgc2FuZGJveCAhPSAwCisjZW5kaWYKKwkJKSAmJiAob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfU0VDVVJFKSkKKwlyZXR1cm4gZV9zZWN1cmU7CisKKyAgICAqKGludCAqKXZhcnAgPSB2YWx1ZTsJICAgIC8qIHNldCB0aGUgbmV3IHZhbHVlICovCisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhlIG9wdGlvbiB3YXMgc2V0LiAqLworICAgIG9wdGlvbnNbb3B0X2lkeF0uc2NyaXB0SUQgPSBjdXJyZW50X1NJRDsKKyNlbmRpZgorCisgICAgLyogTWF5IHNldCBnbG9iYWwgdmFsdWUgZm9yIGxvY2FsIG9wdGlvbi4gKi8KKyAgICBpZiAoKG9wdF9mbGFncyAmIChPUFRfTE9DQUwgfCBPUFRfR0xPQkFMKSkgPT0gMCkKKwkqKGludCAqKWdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksIE9QVF9HTE9CQUwpID0gdmFsdWU7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSBzaWRlIGVmZmVjdHMgb2YgY2hhbmdpbmcgYSBib29sIG9wdGlvbi4KKyAgICAgKi8KKworICAgIC8qICdjb21wYXRpYmxlJyAqLworICAgIGlmICgoaW50ICopdmFycCA9PSAmcF9jcCkKKyAgICB7CisJY29tcGF0aWJsZV9zZXQoKTsKKyAgICB9CisKKyAgICAvKiB3aGVuICdyZWFkb25seScgaXMgcmVzZXQgZ2xvYmFsbHksIGFsc28gcmVzZXQgcmVhZG9ubHltb2RlICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJmN1cmJ1Zi0+Yl9wX3JvKQorICAgIHsKKwlpZiAoIWN1cmJ1Zi0+Yl9wX3JvICYmIChvcHRfZmxhZ3MgJiBPUFRfTE9DQUwpID09IDApCisJICAgIHJlYWRvbmx5bW9kZSA9IEZBTFNFOworI2lmZGVmIEZFQVRfVElUTEUKKwluZWVkX21ha2V0aXRsZSA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgLyogd2hlbiAnbW9kaWZpYWJsZScgaXMgY2hhbmdlZCwgcmVkcmF3IHRoZSB3aW5kb3cgdGl0bGUgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmY3VyYnVmLT5iX3BfbWEpCisJbmVlZF9tYWtldGl0bGUgPSBUUlVFOworICAgIC8qIHdoZW4gJ2VuZG9mbGluZScgaXMgY2hhbmdlZCwgcmVkcmF3IHRoZSB3aW5kb3cgdGl0bGUgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmY3VyYnVmLT5iX3BfZW9sKQorCW5lZWRfbWFrZXRpdGxlID0gVFJVRTsKKyNlbmRpZgorCisgICAgLyogd2hlbiAnYmluJyBpcyBzZXQgYWxzbyBzZXQgc29tZSBvdGhlciBvcHRpb25zICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJmN1cmJ1Zi0+Yl9wX2JpbikKKyAgICB7CisJc2V0X29wdGlvbnNfYmluKG9sZF92YWx1ZSwgY3VyYnVmLT5iX3BfYmluLCBvcHRfZmxhZ3MpOworI2lmZGVmIEZFQVRfVElUTEUKKwluZWVkX21ha2V0aXRsZSA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKiB3aGVuICdidWZsaXN0ZWQnIGNoYW5nZXMsIHRyaWdnZXIgYXV0b2NvbW1hbmRzICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJmN1cmJ1Zi0+Yl9wX2JsICYmIG9sZF92YWx1ZSAhPSBjdXJidWYtPmJfcF9ibCkKKyAgICB7CisJYXBwbHlfYXV0b2NtZHMoY3VyYnVmLT5iX3BfYmwgPyBFVkVOVF9CVUZBREQgOiBFVkVOVF9CVUZERUxFVEUsCisJCQkJCQkgICAgTlVMTCwgTlVMTCwgVFJVRSwgY3VyYnVmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIHdoZW4gJ3N3ZicgaXMgc2V0LCBjcmVhdGUgc3dhcGZpbGUsIHdoZW4gcmVzZXQgcmVtb3ZlIHN3YXBmaWxlICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJmN1cmJ1Zi0+Yl9wX3N3ZikKKyAgICB7CisJaWYgKGN1cmJ1Zi0+Yl9wX3N3ZiAmJiBwX3VjKQorCSAgICBtbF9vcGVuX2ZpbGUoY3VyYnVmKTsJCS8qIGNyZWF0ZSB0aGUgc3dhcCBmaWxlICovCisJZWxzZQorCSAgICBtZl9jbG9zZV9maWxlKGN1cmJ1ZiwgVFJVRSk7CS8qIHJlbW92ZSB0aGUgc3dhcCBmaWxlICovCisgICAgfQorCisgICAgLyogd2hlbiAndGVyc2UnIGlzIHNldCBjaGFuZ2UgJ3Nob3J0bWVzcycgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmcF90ZXJzZSkKKyAgICB7CisJY2hhcl91CSpwOworCisJcCA9IHZpbV9zdHJjaHIocF9zaG0sIFNITV9TRUFSQ0gpOworCisJLyogaW5zZXJ0ICdzJyBpbiBwX3NobSAqLworCWlmIChwX3RlcnNlICYmIHAgPT0gTlVMTCkKKwl7CisJICAgIFNUUkNQWShJT2J1ZmYsIHBfc2htKTsKKwkgICAgU1RSQ0FUKElPYnVmZiwgInMiKTsKKwkgICAgc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikic2htIiwgLTEsIElPYnVmZiwgT1BUX0ZSRUUpOworCX0KKwkvKiByZW1vdmUgJ3MnIGZyb20gcF9zaG0gKi8KKwllbHNlIGlmICghcF90ZXJzZSAmJiBwICE9IE5VTEwpCisJICAgIG1jaF9tZW1tb3ZlKHAsIHAgKyAxLCBTVFJMRU4ocCkpOworICAgIH0KKworICAgIC8qIHdoZW4gJ3Bhc3RlJyBpcyBzZXQgb3IgcmVzZXQgYWxzbyBjaGFuZ2Ugb3RoZXIgb3B0aW9ucyAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX3Bhc3RlKQorICAgIHsKKwlwYXN0ZV9vcHRpb25fY2hhbmdlZCgpOworICAgIH0KKworICAgIC8qIHdoZW4gJ2luc2VydG1vZGUnIGlzIHNldCBmcm9tIGFuIGF1dG9jb21tYW5kIG5lZWQgdG8gZG8gd29yayBoZXJlICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJnBfaW0pCisgICAgeworCWlmIChwX2ltKQorCXsKKwkgICAgaWYgKChTdGF0ZSAmIElOU0VSVCkgPT0gMCkKKwkJbmVlZF9zdGFydF9pbnNlcnRtb2RlID0gVFJVRTsKKwkgICAgc3RvcF9pbnNlcnRfbW9kZSA9IEZBTFNFOworCX0KKwllbHNlCisJeworCSAgICBuZWVkX3N0YXJ0X2luc2VydG1vZGUgPSBGQUxTRTsKKwkgICAgc3RvcF9pbnNlcnRfbW9kZSA9IFRSVUU7CisJICAgIGlmIChwX3NtZCAmJiByZXN0YXJ0X2VkaXQgIT0gMCkKKwkJY2xlYXJfY21kbGluZSA9IFRSVUU7CS8qIHJlbW92ZSAiKGluc2VydCkiICovCisJICAgIHJlc3RhcnRfZWRpdCA9IDA7CisJfQorICAgIH0KKworICAgIC8qIHdoZW4gJ2lnbm9yZWNhc2UnIGlzIHNldCBvciByZXNldCBhbmQgJ2hsc2VhcmNoJyBpcyBzZXQsIHJlZHJhdyAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX2ljICYmIHBfaGxzKQorICAgIHsKKwlyZWRyYXdfYWxsX2xhdGVyKE5PVF9WQUxJRCk7CisgICAgfQorCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICAvKiB3aGVuICdobHNlYXJjaCcgaXMgc2V0IG9yIHJlc2V0OiByZXNldCBub19obHNlYXJjaCAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX2hscykKKyAgICB7CisJbm9faGxzZWFyY2ggPSBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU0NST0xMQklORAorICAgIC8qIHdoZW4gJ3Njcm9sbGJpbmQnIGlzIHNldDogc25hcHNob3QgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gYXZvaWQgYSBqdW1wCisgICAgICogYXQgdGhlIGVuZCBvZiBub3JtYWxfY21kKCkgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmY3Vyd2luLT53X3Bfc2NiKQorICAgIHsKKwlpZiAoY3Vyd2luLT53X3Bfc2NiKQorCSAgICBkb19jaGVja19zY3JvbGxiaW5kKEZBTFNFKTsKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lIHdpbmRvdyB3aXRoICdwcmV2aWV3d2luZG93JyBzZXQuICovCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJmN1cndpbi0+d19wX3B2dykKKyAgICB7CisJaWYgKGN1cndpbi0+d19wX3B2dykKKwl7CisJICAgIHdpbl9UCSp3aW47CisKKwkgICAgZm9yICh3aW4gPSBmaXJzdHdpbjsgd2luICE9IE5VTEw7IHdpbiA9IHdpbi0+d19uZXh0KQorCQlpZiAod2luLT53X3BfcHZ3ICYmIHdpbiAhPSBjdXJ3aW4pCisJCXsKKwkJICAgIGN1cndpbi0+d19wX3B2dyA9IEZBTFNFOworCQkgICAgcmV0dXJuIChjaGFyX3UgKilOXygiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIpOworCQl9CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogd2hlbiAndGV4dG1vZGUnIGlzIHNldCBvciByZXNldCBhbHNvIGNoYW5nZSAnZmlsZWZvcm1hdCcgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmY3VyYnVmLT5iX3BfdHgpCisgICAgeworCXNldF9maWxlZm9ybWF0KGN1cmJ1Zi0+Yl9wX3R4ID8gRU9MX0RPUyA6IEVPTF9VTklYLCBvcHRfZmxhZ3MpOworICAgIH0KKworICAgIC8qIHdoZW4gJ3RleHRhdXRvJyBpcyBzZXQgb3IgcmVzZXQgYWxzbyBjaGFuZ2UgJ2ZpbGVmb3JtYXRzJyAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX3RhKQorICAgIHsKKwlzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJmZnMiLCAtMSwKKwkJCQkgcF90YSA/IChjaGFyX3UgKilERkxUX0ZGU19WSU0gOiAoY2hhcl91ICopIiIsCisJCQkJCQkJT1BUX0ZSRUUgfCBvcHRfZmxhZ3MpOworICAgIH0KKworICAgIC8qCisgICAgICogV2hlbiAnbGlzcCcgb3B0aW9uIGNoYW5nZXMgaW5jbHVkZS9leGNsdWRlICctJyBpbgorICAgICAqIGtleXdvcmQgY2hhcmFjdGVycy4KKyAgICAgKi8KKyNpZmRlZiBGRUFUX0xJU1AKKyAgICBlbHNlIGlmICh2YXJwID09IChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2xpc3ApKQorICAgIHsKKwkodm9pZClidWZfaW5pdF9jaGFydGFiKGN1cmJ1ZiwgRkFMU0UpOwkgICAgLyogaWdub3JlIGVycm9ycyAqLworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9USVRMRQorICAgIC8qIHdoZW4gJ3RpdGxlJyBjaGFuZ2VkLCBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHRpdGxlOyBzYW1lIGZvciAnaWNvbicgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmcF90aXRsZSkKKyAgICB7CisJZGlkX3NldF90aXRsZShGQUxTRSk7CisgICAgfQorCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJnBfaWNvbikKKyAgICB7CisJZGlkX3NldF90aXRsZShUUlVFKTsKKyAgICB9CisjZW5kaWYKKworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZjdXJidWYtPmJfY2hhbmdlZCkKKyAgICB7CisJaWYgKCF2YWx1ZSkKKwkgICAgc2F2ZV9maWxlX2ZmKGN1cmJ1Zik7CS8qIEJ1ZmZlciBpcyB1bmNoYW5nZWQgKi8KKyNpZmRlZiBGRUFUX1RJVExFCisJbmVlZF9tYWtldGl0bGUgPSBUUlVFOworI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJbW9kaWZpZWRfd2FzX3NldCA9IHZhbHVlOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJnBfc3NsKQorICAgIHsKKwlpZiAocF9zc2wpCisJeworCSAgICBwc2VwYyA9ICcvJzsKKwkgICAgcHNlcGNOID0gJ1xcJzsKKwkgICAgcHNlcHNbMF0gPSAnLyc7CisJICAgIHBzZXBzTlswXSA9ICdcXCc7CisJfQorCWVsc2UKKwl7CisJICAgIHBzZXBjID0gJ1xcJzsKKwkgICAgcHNlcGNOID0gJy8nOworCSAgICBwc2Vwc1swXSA9ICdcXCc7CisJICAgIHBzZXBzTlswXSA9ICcvJzsKKwl9CisKKwkvKiBuZWVkIHRvIGFkanVzdCB0aGUgZmlsZSBuYW1lIGFyZ3VtZW50cyBhbmQgYnVmZmVyIG5hbWVzLiAqLworCWJ1Zmxpc3Rfc2xhc2hfYWRqdXN0KCk7CisJYWxpc3Rfc2xhc2hfYWRqdXN0KCk7CisjIGlmZGVmIEZFQVRfRVZBTAorCXNjcmlwdG5hbWVzX3NsYXNoX2FkanVzdCgpOworIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgLyogSWYgJ3dyYXAnIGlzIHNldCwgc2V0IHdfbGVmdGNvbCB0byB6ZXJvLiAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZjdXJ3aW4tPndfcF93cmFwKQorICAgIHsKKwlpZiAoY3Vyd2luLT53X3Bfd3JhcCkKKwkgICAgY3Vyd2luLT53X2xlZnRjb2wgPSAwOworICAgIH0KKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX2VhKQorICAgIHsKKwlpZiAocF9lYSAmJiAhb2xkX3ZhbHVlKQorCSAgICB3aW5fZXF1YWwoY3Vyd2luLCBGQUxTRSwgMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmcF93aXYpCisgICAgeworCS8qCisJICogV2hlbiAnd2VpcmRpbnZlcnQnIGNoYW5nZWQsIHNldC9yZXNldCAndF94cycuCisJICogVGhlbiBzZXQgJ3dlaXJkaW52ZXJ0JyBhY2NvcmRpbmcgdG8gdmFsdWUgb2YgJ3RfeHMnLgorCSAqLworCWlmIChwX3dpdiAmJiAhb2xkX3ZhbHVlKQorCSAgICBUX1hTID0gKGNoYXJfdSAqKSJ5IjsKKwllbHNlIGlmICghcF93aXYgJiYgb2xkX3ZhbHVlKQorCSAgICBUX1hTID0gZW1wdHlfb3B0aW9uOworCXBfd2l2ID0gKCpUX1hTICE9IE5VTCk7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0JFVkFMKSAmJiAoZGVmaW5lZChGRUFUX1NVTl9XT1JLU0hPUCkgXAorCXx8IGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSkKKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmcF9iZXZhbCkKKyAgICB7CisJZXh0ZXJuIEJhbGxvb25FdmFsCSpiYWxsb29uRXZhbDsKKworCWlmIChwX2JldmFsID09IFRSVUUpCisJICAgIGd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEoYmFsbG9vbkV2YWwpOworCWVsc2UKKwkgICAgZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEoYmFsbG9vbkV2YWwpOworICAgIH0KKworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX2FjZCkKKyAgICB7CisJaWYgKHBfYWNkICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTAorCQkJCSAgICAgJiYgdmltX2NoZGlyZmlsZShjdXJidWYtPmJfZmZuYW1lKSA9PSBPSykKKwkgICAgc2hvcnRlbl9mbmFtZXMoVFJVRSk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICAvKiAnZGlmZicgKi8KKyAgICBlbHNlIGlmICgoaW50ICopdmFycCA9PSAmY3Vyd2luLT53X3BfZGlmZikKKyAgICB7CisJd2luX1QJKndwOworCisJaWYgKCFjdXJ3aW4tPndfcF9kaWZmKQorCXsKKwkgICAgLyogV2hlbiB0aGVyZSBpcyBubyB3aW5kb3cgc2hvd2luZyBhIGRpZmYgZm9yIHRoaXMgYnVmZmVyLCByZW1vdmUKKwkgICAgICogaXQgZnJvbSB0aGUgZGlmZnMuICovCisJICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCQlpZiAod3AtPndfYnVmZmVyID09IGN1cndpbi0+d19idWZmZXIgJiYgd3AtPndfcF9kaWZmKQorCQkgICAgYnJlYWs7CisJICAgIGlmICh3cCA9PSBOVUxMKQorCQlkaWZmX2J1Zl9kZWxldGUoY3Vyd2luLT53X2J1ZmZlcik7CisJfQorCWVsc2UKKwkgICAgZGlmZl9idWZfYWRkKGN1cndpbi0+d19idWZmZXIpOworI2lmZGVmIEZFQVRfRk9MRElORworCWlmIChmb2xkbWV0aG9kSXNEaWZmKGN1cndpbikpCisJICAgIGZvbGRVcGRhdGVBbGwoY3Vyd2luKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgVVNFX0lNX0NPTlRST0wKKyAgICAvKiAnaW1kaXNhYmxlJyAqLworICAgIGVsc2UgaWYgKChpbnQgKil2YXJwID09ICZwX2ltZGlzYWJsZSkKKyAgICB7CisJLyogT25seSBkZS1hY3RpdmF0ZSBpdCBoZXJlLCBpdCB3aWxsIGJlIGVuYWJsZWQgd2hlbiBjaGFuZ2luZyBtb2RlLiAqLworCWlmIChwX2ltZGlzYWJsZSkKKwkgICAgaW1fc2V0X2FjdGl2ZShGQUxTRSk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0ZLTUFQCisgICAgZWxzZSBpZiAoKGludCAqKXZhcnAgPT0gJnBfYWx0a2V5bWFwKQorICAgIHsKKwlpZiAob2xkX3ZhbHVlICE9IHBfYWx0a2V5bWFwKQorCXsKKwkgICAgaWYgKCFwX2FsdGtleW1hcCkKKwkgICAgeworCQlwX2hrbWFwID0gcF9ma21hcDsKKwkJcF9ma21hcCA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXBfZmttYXAgPSBwX2hrbWFwOworCQlwX2hrbWFwID0gMDsKKwkgICAgfQorCSAgICAodm9pZClpbml0X2NoYXJ0YWIoKTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiBjYXNlIHNvbWUgc2Vjb25kIGxhbmd1YWdlIGtleW1hcHBpbmcgb3B0aW9ucyBoYXZlIGNoYW5nZWQsIGNoZWNrCisgICAgICogYW5kIGNvcnJlY3QgdGhlIHNldHRpbmcgaW4gYSBjb25zaXN0ZW50IHdheS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogSWYgaGttYXAgb3IgZmttYXAgYXJlIHNldCwgcmVzZXQgQXJhYmljIGtleW1hcHBpbmcuCisgICAgICovCisgICAgaWYgKChwX2hrbWFwIHx8IHBfZmttYXApICYmIHBfYWx0a2V5bWFwKQorICAgIHsKKwlwX2FsdGtleW1hcCA9IHBfZmttYXA7CisjIGlmZGVmIEZFQVRfQVJBQklDCisJY3Vyd2luLT53X3BfYXJhYiA9IEZBTFNFOworIyBlbmRpZgorCSh2b2lkKWluaXRfY2hhcnRhYigpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgaGttYXAgc2V0LCByZXNldCBGYXJzaSBrZXltYXBwaW5nLgorICAgICAqLworICAgIGlmIChwX2hrbWFwICYmIHBfYWx0a2V5bWFwKQorICAgIHsKKwlwX2FsdGtleW1hcCA9IDA7CisJcF9ma21hcCA9IDA7CisjIGlmZGVmIEZFQVRfQVJBQklDCisJY3Vyd2luLT53X3BfYXJhYiA9IEZBTFNFOworIyBlbmRpZgorCSh2b2lkKWluaXRfY2hhcnRhYigpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgZmttYXAgc2V0LCByZXNldCBIZWJyZXcga2V5bWFwcGluZy4KKyAgICAgKi8KKyAgICBpZiAocF9ma21hcCAmJiAhcF9hbHRrZXltYXApCisgICAgeworCXBfYWx0a2V5bWFwID0gMTsKKwlwX2hrbWFwID0gMDsKKyMgaWZkZWYgRkVBVF9BUkFCSUMKKwljdXJ3aW4tPndfcF9hcmFiID0gRkFMU0U7CisjIGVuZGlmCisJKHZvaWQpaW5pdF9jaGFydGFiKCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0FSQUJJQworICAgIGlmICgoaW50ICopdmFycCA9PSAmY3Vyd2luLT53X3BfYXJhYikKKyAgICB7CisJaWYgKGN1cndpbi0+d19wX2FyYWIpCisJeworCSAgICAvKgorCSAgICAgKiAnYXJhYmljJyBpcyBzZXQsIGhhbmRsZSB2YXJpb3VzIHN1Yi1zZXR0aW5ncy4KKwkgICAgICovCisJICAgIGlmICghcF90YmlkaSkKKwkgICAgeworCQkvKiBzZXQgcmlnaHRsZWZ0IG1vZGUgKi8KKwkJaWYgKCFjdXJ3aW4tPndfcF9ybCkKKwkJeworCQkgICAgY3Vyd2luLT53X3BfcmwgPSBUUlVFOworCQkgICAgY2hhbmdlZF93aW5kb3dfc2V0dGluZygpOworCQl9CisKKwkJLyogRW5hYmxlIEFyYWJpYyBzaGFwaW5nIChtYWpvciBwYXJ0IG9mIHdoYXQgQXJhYmljIHJlcXVpcmVzKSAqLworCQlpZiAoIXBfYXJzaGFwZSkKKwkJeworCQkgICAgcF9hcnNoYXBlID0gVFJVRTsKKwkJICAgIHJlZHJhd19sYXRlcl9jbGVhcigpOworCQl9CisJICAgIH0KKworCSAgICAvKiBBcmFiaWMgcmVxdWlyZXMgYSB1dGYtOCBlbmNvZGluZywgaW5mb3JtIHRoZSB1c2VyIGlmIGl0cyBub3QKKwkgICAgICogc2V0LiAqLworCSAgICBpZiAoU1RSQ01QKHBfZW5jLCAidXRmLTgiKSAhPSAwKQorCQlNU0dfQVRUUihfKCJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIiksCisJCQlobF9hdHRyKEhMRl9XKSk7CisKKyMgaWZkZWYgRkVBVF9NQllURQorCSAgICAvKiBzZXQgJ2RlbGNvbWJpbmUnICovCisJICAgIHBfZGVjbyA9IFRSVUU7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9LRVlNQVAKKwkgICAgLyogRm9yY2Utc2V0IHRoZSBuZWNlc3Nhcnkga2V5bWFwIGZvciBhcmFiaWMgKi8KKwkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImtleW1hcCIsIDBMLCAoY2hhcl91ICopImFyYWJpYyIsCisJCQkJCQkJCSAgIE9QVF9MT0NBTCk7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfRktNQVAKKwkgICAgcF9hbHRrZXltYXAgPSAwOworCSAgICBwX2hrbWFwID0gMDsKKwkgICAgcF9ma21hcCA9IDA7CisJICAgICh2b2lkKWluaXRfY2hhcnRhYigpOworIyBlbmRpZgorCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiAnYXJhYmljJyBpcyByZXNldCwgaGFuZGxlIHZhcmlvdXMgc3ViLXNldHRpbmdzLgorCSAgICAgKi8KKwkgICAgaWYgKCFwX3RiaWRpKQorCSAgICB7CisJCS8qIHJlc2V0IHJpZ2h0bGVmdCBtb2RlICovCisJCWlmIChjdXJ3aW4tPndfcF9ybCkKKwkJeworCQkgICAgY3Vyd2luLT53X3BfcmwgPSBGQUxTRTsKKwkJICAgIGNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKwkJfQorCisJCS8qICdhcmFiaWNzaGFwZScgaXNuJ3QgcmVzZXQsIGl0IGlzIGEgZ2xvYmFsIG9wdGlvbiBhbmQKKwkJICogYW5vdGhlciB3aW5kb3cgbWF5IHN0aWxsIG5lZWQgaXQgIm9uIi4gKi8KKwkgICAgfQorCisJICAgIC8qICdkZWxjb21iaW5lJyBpc24ndCByZXNldCwgaXQgaXMgYSBnbG9iYWwgb3B0aW9uIGFuZCBhbm90aGVyCisJICAgICAqIHdpbmRvdyBtYXkgc3RpbGwgd2FudCBpdCAib24iLiAqLworCisjIGlmZGVmIEZFQVRfS0VZTUFQCisJICAgIC8qIFJldmVydCB0byB0aGUgZGVmYXVsdCBrZXltYXAgKi8KKwkgICAgY3VyYnVmLT5iX3BfaW1pbnNlcnQgPSBCX0lNT0RFX05PTkU7CisJICAgIGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoID0gQl9JTU9ERV9VU0VfSU5TRVJUOworIyBlbmRpZgorCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogRW5kIG9mIGhhbmRsaW5nIHNpZGUgZWZmZWN0cyBmb3IgYm9vbCBvcHRpb25zLgorICAgICAqLworCisgICAgb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX1dBU19TRVQ7CisKKyAgICBjb21wX2NvbCgpOwkJCSAgICAvKiBpbiBjYXNlICdydWxlcicgb3IgJ3Nob3djbWQnIGNoYW5nZWQgKi8KKyAgICBpZiAoY3Vyd2luLT53X2N1cnN3YW50ICE9IE1BWENPTCkKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsgIC8qIGluIGNhc2UgJ2xpc3QnIGNoYW5nZWQgKi8KKyAgICBjaGVja19yZWRyYXcob3B0aW9uc1tvcHRfaWR4XS5mbGFncyk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBudW1iZXIgb3B0aW9uLCBhbmQgdGFrZSBjYXJlIG9mIHNpZGUgZWZmZWN0cy4KKyAqIFJldHVybnMgTlVMTCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYW4gZXJyb3IuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3NldF9udW1fb3B0aW9uKG9wdF9pZHgsIHZhcnAsIHZhbHVlLCBlcnJidWYsIG9wdF9mbGFncykKKyAgICBpbnQJCW9wdF9pZHg7CQkvKiBpbmRleCBpbiBvcHRpb25zW10gdGFibGUgKi8KKyAgICBjaGFyX3UJKnZhcnA7CQkJLyogcG9pbnRlciB0byB0aGUgb3B0aW9uIHZhcmlhYmxlICovCisgICAgbG9uZwl2YWx1ZTsJCQkvKiBuZXcgdmFsdWUgKi8KKyAgICBjaGFyX3UJKmVycmJ1ZjsJCS8qIGJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBpbnQJCW9wdF9mbGFnczsJCS8qIE9QVF9MT0NBTCwgT1BUX0dMT0JBTCBhbmQKKwkJCQkJICAgT1BUX01PREVMSU5FICovCit7CisgICAgY2hhcl91CSplcnJtc2cgPSBOVUxMOworICAgIGxvbmcJb2xkX3ZhbHVlID0gKihsb25nICopdmFycDsKKyAgICBsb25nCW9sZF9Sb3dzID0gUm93czsJLyogcmVtZW1iZXIgb2xkIFJvd3MgKi8KKyAgICBsb25nCW9sZF9Db2x1bW5zID0gQ29sdW1uczsJLyogcmVtZW1iZXIgb2xkIENvbHVtbnMgKi8KKyAgICBsb25nCSpwcCA9IChsb25nICopdmFycDsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCisgICAgKnBwID0gdmFsdWU7CisjaWZkZWYgRkVBVF9FVkFMCisgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhlIG9wdGlvbiB3YXMgc2V0LiAqLworICAgIG9wdGlvbnNbb3B0X2lkeF0uc2NyaXB0SUQgPSBjdXJyZW50X1NJRDsKKyNlbmRpZgorCisgICAgaWYgKGN1cmJ1Zi0+Yl9wX3N3IDw9IDApCisgICAgeworCWVycm1zZyA9IGVfcG9zaXRpdmU7CisJY3VyYnVmLT5iX3Bfc3cgPSBjdXJidWYtPmJfcF90czsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE51bWJlciBvcHRpb25zIHRoYXQgbmVlZCBzb21lIGFjdGlvbiB3aGVuIGNoYW5nZWQKKyAgICAgKi8KKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpZiAocHAgPT0gJnBfd2ggfHwgcHAgPT0gJnBfaGgpCisgICAgeworCWlmIChwX3doIDwgMSkKKwl7CisJICAgIGVycm1zZyA9IGVfcG9zaXRpdmU7CisJICAgIHBfd2ggPSAxOworCX0KKwlpZiAocF93bWggPiBwX3doKQorCXsKKwkgICAgZXJybXNnID0gZV93aW5oZWlnaHQ7CisJICAgIHBfd2ggPSBwX3dtaDsKKwl9CisJaWYgKHBfaGggPCAwKQorCXsKKwkgICAgZXJybXNnID0gZV9wb3NpdGl2ZTsKKwkgICAgcF9oaCA9IDA7CisJfQorCisJLyogQ2hhbmdlIHdpbmRvdyBoZWlnaHQgTk9XICovCisJaWYgKGxhc3R3aW4gIT0gZmlyc3R3aW4pCisJeworCSAgICBpZiAocHAgPT0gJnBfd2ggJiYgY3Vyd2luLT53X2hlaWdodCA8IHBfd2gpCisJCXdpbl9zZXRoZWlnaHQoKGludClwX3doKTsKKwkgICAgaWYgKHBwID09ICZwX2hoICYmIGN1cmJ1Zi0+Yl9oZWxwICYmIGN1cndpbi0+d19oZWlnaHQgPCBwX2hoKQorCQl3aW5fc2V0aGVpZ2h0KChpbnQpcF9oaCk7CisJfQorICAgIH0KKworICAgIC8qICd3aW5taW5oZWlnaHQnICovCisgICAgZWxzZSBpZiAocHAgPT0gJnBfd21oKQorICAgIHsKKwlpZiAocF93bWggPCAwKQorCXsKKwkgICAgZXJybXNnID0gZV9wb3NpdGl2ZTsKKwkgICAgcF93bWggPSAwOworCX0KKwlpZiAocF93bWggPiBwX3doKQorCXsKKwkgICAgZXJybXNnID0gZV93aW5oZWlnaHQ7CisJICAgIHBfd21oID0gcF93aDsKKwl9CisJd2luX3NldG1pbmhlaWdodCgpOworICAgIH0KKworIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmIChwcCA9PSAmcF93aXcpCisgICAgeworCWlmIChwX3dpdyA8IDEpCisJeworCSAgICBlcnJtc2cgPSBlX3Bvc2l0aXZlOworCSAgICBwX3dpdyA9IDE7CisJfQorCWlmIChwX3dtdyA+IHBfd2l3KQorCXsKKwkgICAgZXJybXNnID0gZV93aW53aWR0aDsKKwkgICAgcF93aXcgPSBwX3dtdzsKKwl9CisKKwkvKiBDaGFuZ2Ugd2luZG93IHdpZHRoIE5PVyAqLworCWlmIChsYXN0d2luICE9IGZpcnN0d2luICYmIGN1cndpbi0+d193aWR0aCA8IHBfd2l3KQorCSAgICB3aW5fc2V0d2lkdGgoKGludClwX3dpdyk7CisgICAgfQorCisgICAgLyogJ3dpbm1pbndpZHRoJyAqLworICAgIGVsc2UgaWYgKHBwID09ICZwX3dtdykKKyAgICB7CisJaWYgKHBfd213IDwgMCkKKwl7CisJICAgIGVycm1zZyA9IGVfcG9zaXRpdmU7CisJICAgIHBfd213ID0gMDsKKwl9CisJaWYgKHBfd213ID4gcF93aXcpCisJeworCSAgICBlcnJtc2cgPSBlX3dpbndpZHRoOworCSAgICBwX3dtdyA9IHBfd2l3OworCX0KKwl3aW5fc2V0bWluaGVpZ2h0KCk7CisgICAgfQorIyBlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIC8qIChyZSlzZXQgbGFzdCB3aW5kb3cgc3RhdHVzIGxpbmUgKi8KKyAgICBlbHNlIGlmIChwcCA9PSAmcF9scykKKyAgICB7CisJbGFzdF9zdGF0dXMoRkFMU0UpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyAgICBlbHNlIGlmIChwcCA9PSAmcF9saW5lc3BhY2UpCisgICAgeworCWlmIChndWkuaW5fdXNlICYmIGd1aV9tY2hfYWRqdXN0X2NoYXJzaXplKCkgPT0gT0spCisJICAgIGd1aV9zZXRfc2hlbGxzaXplKEZBTFNFLCBGQUxTRSk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKiAnZm9sZGxldmVsJyAqLworICAgIGVsc2UgaWYgKHBwID09ICZjdXJ3aW4tPndfcF9mZGwpCisgICAgeworCWlmIChjdXJ3aW4tPndfcF9mZGwgPCAwKQorCSAgICBjdXJ3aW4tPndfcF9mZGwgPSAwOworCW5ld0ZvbGRMZXZlbCgpOworICAgIH0KKworICAgIC8qICdmb2xkbWlubGV2ZWwnICovCisgICAgZWxzZSBpZiAocHAgPT0gJmN1cndpbi0+d19wX2ZtbCkKKyAgICB7CisJZm9sZFVwZGF0ZUFsbChjdXJ3aW4pOworICAgIH0KKworICAgIC8qICdmb2xkbmVzdG1heCcgKi8KKyAgICBlbHNlIGlmIChwcCA9PSAmY3Vyd2luLT53X3BfZmRuKQorICAgIHsKKwlpZiAoZm9sZG1ldGhvZElzU3ludGF4KGN1cndpbikgfHwgZm9sZG1ldGhvZElzSW5kZW50KGN1cndpbikpCisJICAgIGZvbGRVcGRhdGVBbGwoY3Vyd2luKTsKKyAgICB9CisKKyAgICAvKiAnZm9sZGNvbHVtbicgKi8KKyAgICBlbHNlIGlmIChwcCA9PSAmY3Vyd2luLT53X3BfZmRjKQorICAgIHsKKwlpZiAoY3Vyd2luLT53X3BfZmRjIDwgMCkKKwl7CisJICAgIGVycm1zZyA9IGVfcG9zaXRpdmU7CisJICAgIGN1cndpbi0+d19wX2ZkYyA9IDA7CisJfQorCWVsc2UgaWYgKGN1cndpbi0+d19wX2ZkYyA+IDEyKQorCXsKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJICAgIGN1cndpbi0+d19wX2ZkYyA9IDEyOworCX0KKyAgICB9CisKKyAgICAvKiAnc2hpZnR3aWR0aCcgb3IgJ3RhYnN0b3AnICovCisgICAgZWxzZSBpZiAocHAgPT0gJmN1cmJ1Zi0+Yl9wX3N3IHx8IHBwID09ICZjdXJidWYtPmJfcF90cykKKyAgICB7CisJaWYgKGZvbGRtZXRob2RJc0luZGVudChjdXJ3aW4pKQorCSAgICBmb2xkVXBkYXRlQWxsKGN1cndpbik7CisgICAgfQorI2VuZGlmIC8qIEZFQVRfRk9MRElORyAqLworCisgICAgZWxzZSBpZiAocHAgPT0gJmN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0KQorICAgIHsKKwlpZiAoY3VyYnVmLT5iX3BfaW1pbnNlcnQgPCAwIHx8IGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0ID4gQl9JTU9ERV9MQVNUKQorCXsKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJICAgIGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0ID0gQl9JTU9ERV9OT05FOworCX0KKwlwX2ltaW5zZXJ0ID0gY3VyYnVmLT5iX3BfaW1pbnNlcnQ7CisJaWYgKHRlcm1jYXBfYWN0aXZlKQkvKiBkb24ndCBkbyB0aGlzIGluIHRoZSBhbHRlcm5hdGUgc2NyZWVuICovCisJICAgIHNob3dtb2RlKCk7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9LRVlNQVApCisJLyogU2hvdy91bnNob3cgdmFsdWUgb2YgJ2tleW1hcCcgaW4gc3RhdHVzIGxpbmVzLiAqLworCXN0YXR1c19yZWRyYXdfY3VyYnVmKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBlbHNlIGlmIChwcCA9PSAmY3VyYnVmLT5iX3BfaW1zZWFyY2gpCisgICAgeworCWlmIChjdXJidWYtPmJfcF9pbXNlYXJjaCA8IC0xIHx8IGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoID4gQl9JTU9ERV9MQVNUKQorCXsKKwkgICAgZXJybXNnID0gZV9pbnZhcmc7CisJICAgIGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoID0gQl9JTU9ERV9OT05FOworCX0KKwlwX2ltc2VhcmNoID0gY3VyYnVmLT5iX3BfaW1zZWFyY2g7CisgICAgfQorCisjaWZkZWYgRkVBVF9USVRMRQorICAgIC8qIGlmICd0aXRsZWxlbicgaGFzIGNoYW5nZWQsIHJlZHJhdyB0aGUgdGl0bGUgKi8KKyAgICBlbHNlIGlmIChwcCA9PSAmcF90aXRsZWxlbikKKyAgICB7CisJaWYgKHBfdGl0bGVsZW4gPCAwKQorCXsKKwkgICAgZXJybXNnID0gZV9wb3NpdGl2ZTsKKwkgICAgcF90aXRsZWxlbiA9IDg1OworCX0KKwlpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOICYmIG9sZF92YWx1ZSAhPSBwX3RpdGxlbGVuKQorCSAgICBuZWVkX21ha2V0aXRsZSA9IFRSVUU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBpZiBwX2NoIGNoYW5nZWQgdmFsdWUsIGNoYW5nZSB0aGUgY29tbWFuZCBsaW5lIGhlaWdodCAqLworICAgIGVsc2UgaWYgKHBwID09ICZwX2NoKQorICAgIHsKKwlpZiAocF9jaCA8IDEpCisJeworCSAgICBlcnJtc2cgPSBlX3Bvc2l0aXZlOworCSAgICBwX2NoID0gMTsKKwl9CisKKwkvKiBPbmx5IGNvbXB1dGUgdGhlIG5ldyB3aW5kb3cgbGF5b3V0IHdoZW4gc3RhcnR1cCBoYXMgYmVlbgorCSAqIGNvbXBsZXRlZC4gT3RoZXJ3aXNlIHRoZSBmcmFtZSBzaXplcyBtYXkgYmUgd3JvbmcuICovCisJaWYgKHBfY2ggIT0gb2xkX3ZhbHVlICYmIGZ1bGxfc2NyZWVuCisjaWZkZWYgRkVBVF9HVUkKKwkJJiYgIWd1aS5zdGFydGluZworI2VuZGlmCisJICAgKQorCSAgICBjb21tYW5kX2hlaWdodChvbGRfdmFsdWUpOworICAgIH0KKworICAgIC8qIHdoZW4gJ3VwZGF0ZWNvdW50JyBjaGFuZ2VzIGZyb20gemVybyB0byBub24temVybywgb3BlbiBzd2FwIGZpbGVzICovCisgICAgZWxzZSBpZiAocHAgPT0gJnBfdWMpCisgICAgeworCWlmIChwX3VjIDwgMCkKKwl7CisJICAgIGVycm1zZyA9IGVfcG9zaXRpdmU7CisJICAgIHBfdWMgPSAxMDA7CisJfQorCWlmIChwX3VjICYmICFvbGRfdmFsdWUpCisJICAgIG1sX29wZW5fZmlsZXMoKTsKKyAgICB9CisKKyAgICAvKiBzeW5jIHVuZG8gYmVmb3JlICd1bmRvbGV2ZWxzJyBjaGFuZ2VzICovCisgICAgZWxzZSBpZiAocHAgPT0gJnBfdWwpCisgICAgeworCS8qIHVzZSB0aGUgb2xkIHZhbHVlLCBvdGhlcndpc2UgdV9zeW5jKCkgbWF5IG5vdCB3b3JrIHByb3Blcmx5ICovCisJcF91bCA9IG9sZF92YWx1ZTsKKwl1X3N5bmMoKTsKKwlwX3VsID0gdmFsdWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgYm91bmRzIGZvciBudW1lcmljIG9wdGlvbnMgaGVyZQorICAgICAqLworICAgIGlmIChSb3dzIDwgbWluX3Jvd3MoKSAmJiBmdWxsX3NjcmVlbikKKyAgICB7CisJaWYgKGVycmJ1ZiAhPSBOVUxMKQorCXsKKwkgICAgc3ByaW50ZigoY2hhciAqKWVycmJ1ZiwgXygiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIpLAorCQkJCQkJCQkgIG1pbl9yb3dzKCkpOworCSAgICBlcnJtc2cgPSBlcnJidWY7CisJfQorCVJvd3MgPSBtaW5fcm93cygpOworICAgIH0KKyAgICBpZiAoQ29sdW1ucyA8IE1JTl9DT0xVTU5TICYmIGZ1bGxfc2NyZWVuKQorICAgIHsKKwlpZiAoZXJyYnVmICE9IE5VTEwpCisJeworCSAgICBzcHJpbnRmKChjaGFyICopZXJyYnVmLCBfKCJFNTk0OiBOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiKSwKKwkJCQkJCQkJIE1JTl9DT0xVTU5TKTsKKwkgICAgZXJybXNnID0gZXJyYnVmOworCX0KKwlDb2x1bW5zID0gTUlOX0NPTFVNTlM7CisgICAgfQorCisjaWZkZWYgREpHUFAKKyAgICAvKiBhdm9pZCBhIGNyYXNoIGJ5IGNoZWNraW5nIGZvciBhIHRvbyBsYXJnZSB2YWx1ZSBvZiAnY29sdW1ucycgKi8KKyAgICBpZiAob2xkX0NvbHVtbnMgIT0gQ29sdW1ucyAmJiBmdWxsX3NjcmVlbiAmJiB0ZXJtX2NvbnNvbGUpCisJbWNoX2NoZWNrX2NvbHVtbnMoKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2NyZWVuIChzaGVsbCkgaGVpZ2h0IGhhcyBiZWVuIGNoYW5nZWQsIGFzc3VtZSBpdCBpcyB0aGUKKyAgICAgKiBwaHlzaWNhbCBzY3JlZW5oZWlnaHQuCisgICAgICovCisgICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MgfHwgb2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKKyAgICB7CisJLyogQ2hhbmdpbmcgdGhlIHNjcmVlbiBzaXplIGlzIG5vdCBhbGxvd2VkIHdoaWxlIHVwZGF0aW5nIHRoZSBzY3JlZW4uICovCisJaWYgKHVwZGF0aW5nX3NjcmVlbikKKwkgICAgKnBwID0gb2xkX3ZhbHVlOworCWVsc2UgaWYgKGZ1bGxfc2NyZWVuCisjaWZkZWYgRkVBVF9HVUkKKwkJJiYgIWd1aS5zdGFydGluZworI2VuZGlmCisJICAgICkKKwkgICAgc2V0X3NoZWxsc2l6ZSgoaW50KUNvbHVtbnMsIChpbnQpUm93cywgVFJVRSk7CisJZWxzZQorCXsKKwkgICAgLyogUG9zdHBvbmUgdGhlIHJlc2l6aW5nOyBjaGVjayB0aGUgc2l6ZSBhbmQgY21kbGluZSBwb3NpdGlvbiBmb3IKKwkgICAgICogbWVzc2FnZXMuICovCisJICAgIGNoZWNrX3NoZWxsc2l6ZSgpOworCSAgICBpZiAoY21kbGluZV9yb3cgPiBSb3dzIC0gcF9jaCAmJiBSb3dzID4gcF9jaCkKKwkJY21kbGluZV9yb3cgPSBSb3dzIC0gcF9jaDsKKwl9CisgICAgfQorCisgICAgaWYgKGN1cmJ1Zi0+Yl9wX3N0cyA8IDApCisgICAgeworCWVycm1zZyA9IGVfcG9zaXRpdmU7CisJY3VyYnVmLT5iX3Bfc3RzID0gMDsKKyAgICB9CisgICAgaWYgKGN1cmJ1Zi0+Yl9wX3RzIDw9IDApCisgICAgeworCWVycm1zZyA9IGVfcG9zaXRpdmU7CisJY3VyYnVmLT5iX3BfdHMgPSA4OworICAgIH0KKyAgICBpZiAoY3VyYnVmLT5iX3BfdHcgPCAwKQorICAgIHsKKwllcnJtc2cgPSBlX3Bvc2l0aXZlOworCWN1cmJ1Zi0+Yl9wX3R3ID0gMDsKKyAgICB9CisgICAgaWYgKHBfdG0gPCAwKQorICAgIHsKKwllcnJtc2cgPSBlX3Bvc2l0aXZlOworCXBfdG0gPSAwOworICAgIH0KKyAgICBpZiAoKGN1cndpbi0+d19wX3NjciA8PSAwCisJCXx8IChjdXJ3aW4tPndfcF9zY3IgPiBjdXJ3aW4tPndfaGVpZ2h0CisJCSAgICAmJiBjdXJ3aW4tPndfaGVpZ2h0ID4gMCkpCisJICAgICYmIGZ1bGxfc2NyZWVuKQorICAgIHsKKwlpZiAocHAgPT0gJihjdXJ3aW4tPndfcF9zY3IpKQorCXsKKwkgICAgaWYgKGN1cndpbi0+d19wX3NjciAhPSAwKQorCQllcnJtc2cgPSBlX3Njcm9sbDsKKwkgICAgd2luX2NvbXBfc2Nyb2xsKGN1cndpbik7CisJfQorCS8qIElmICdzY3JvbGwnIGJlY2FtZSBpbnZhbGlkIGJlY2F1c2Ugb2YgYSBzaWRlIGVmZmVjdCBzaWxlbnRseSBhZGp1c3QKKwkgKiBpdC4gKi8KKwllbHNlIGlmIChjdXJ3aW4tPndfcF9zY3IgPD0gMCkKKwkgICAgY3Vyd2luLT53X3Bfc2NyID0gMTsKKwllbHNlIC8qIGN1cndpbi0+d19wX3NjciA+IGN1cndpbi0+d19oZWlnaHQgKi8KKwkgICAgY3Vyd2luLT53X3Bfc2NyID0gY3Vyd2luLT53X2hlaWdodDsKKyAgICB9CisgICAgaWYgKHBfcmVwb3J0IDwgMCkKKyAgICB7CisJZXJybXNnID0gZV9wb3NpdGl2ZTsKKwlwX3JlcG9ydCA9IDE7CisgICAgfQorICAgIGlmICgocF9zaiA8IDAgfHwgcF9zaiA+PSBSb3dzKSAmJiBmdWxsX3NjcmVlbikKKyAgICB7CisJaWYgKFJvd3MgIT0gb2xkX1Jvd3MpCS8qIFJvd3MgY2hhbmdlZCwganVzdCBhZGp1c3QgcF9zaiAqLworCSAgICBwX3NqID0gUm93cyAvIDI7CisJZWxzZQorCXsKKwkgICAgZXJybXNnID0gZV9zY3JvbGw7CisJICAgIHBfc2ogPSAxOworCX0KKyAgICB9CisgICAgaWYgKHBfc28gPCAwICYmIGZ1bGxfc2NyZWVuKQorICAgIHsKKwllcnJtc2cgPSBlX3Njcm9sbDsKKwlwX3NvID0gMDsKKyAgICB9CisgICAgaWYgKHBfc2lzbyA8IDAgJiYgZnVsbF9zY3JlZW4pCisgICAgeworCWVycm1zZyA9IGVfcG9zaXRpdmU7CisJcF9zaXNvID0gMDsKKyAgICB9CisjaWZkZWYgRkVBVF9DTURXSU4KKyAgICBpZiAocF9jd2ggPCAxKQorICAgIHsKKwllcnJtc2cgPSBlX3Bvc2l0aXZlOworCXBfY3doID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAocF91dCA8IDApCisgICAgeworCWVycm1zZyA9IGVfcG9zaXRpdmU7CisJcF91dCA9IDIwMDA7CisgICAgfQorICAgIGlmIChwX3NzIDwgMCkKKyAgICB7CisJZXJybXNnID0gZV9wb3NpdGl2ZTsKKwlwX3NzID0gMDsKKyAgICB9CisKKyAgICAvKiBNYXkgc2V0IGdsb2JhbCB2YWx1ZSBmb3IgbG9jYWwgb3B0aW9uLiAqLworICAgIGlmICgob3B0X2ZsYWdzICYgKE9QVF9MT0NBTCB8IE9QVF9HTE9CQUwpKSA9PSAwKQorCSoobG9uZyAqKWdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksIE9QVF9HTE9CQUwpID0gKnBwOworCisgICAgb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX1dBU19TRVQ7CisKKyAgICBjb21wX2NvbCgpOwkJCSAgICAvKiBpbiBjYXNlICdjb2x1bW5zJyBvciAnbHMnIGNoYW5nZWQgKi8KKyAgICBpZiAoY3Vyd2luLT53X2N1cnN3YW50ICE9IE1BWENPTCkKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsgIC8qIGluIGNhc2UgJ3RhYnN0b3AnIGNoYW5nZWQgKi8KKyAgICBjaGVja19yZWRyYXcob3B0aW9uc1tvcHRfaWR4XS5mbGFncyk7CisKKyAgICByZXR1cm4gZXJybXNnOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGFuIG9wdGlvbiBjaGFuZ2VkOiBjaGVjayBpZiBzb21ldGhpbmcgbmVlZHMgdG8gYmUgcmVkcmF3bi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGVja19yZWRyYXcoZmxhZ3MpCisgICAgbG9uZ191CWZsYWdzOworeworICAgIC8qIENhcmVmdWw6IFBfUkNMUiBhbmQgUF9SQUxMIGFyZSBhIGNvbWJpbmF0aW9uIG9mIG90aGVyIFBfIGZsYWdzICovCisgICAgaW50CQljbGVhciA9IChmbGFncyAmIFBfUkNMUikgPT0gUF9SQ0xSOworICAgIGludAkJYWxsID0gKChmbGFncyAmIFBfUkFMTCkgPT0gUF9SQUxMIHx8IGNsZWFyKTsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGlmICgoZmxhZ3MgJiBQX1JTVEFUKSB8fCBhbGwpCS8qIG1hcmsgYWxsIHN0YXR1cyBsaW5lcyBkaXJ0eSAqLworCXN0YXR1c19yZWRyYXdfYWxsKCk7CisjZW5kaWYKKworICAgIGlmICgoZmxhZ3MgJiBQX1JCVUYpIHx8IChmbGFncyAmIFBfUldJTikgfHwgYWxsKQorCWNoYW5nZWRfd2luZG93X3NldHRpbmcoKTsKKyAgICBpZiAoZmxhZ3MgJiBQX1JCVUYpCisJcmVkcmF3X2N1cmJ1Zl9sYXRlcihOT1RfVkFMSUQpOworICAgIGlmIChjbGVhcikKKwlyZWRyYXdfYWxsX2xhdGVyKENMRUFSKTsKKyAgICBlbHNlIGlmIChhbGwpCisJcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworfQorCisvKgorICogRmluZCBpbmRleCBmb3Igb3B0aW9uICdhcmcnLgorICogUmV0dXJuIC0xIGlmIG5vdCBmb3VuZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbmRvcHRpb24oYXJnKQorICAgIGNoYXJfdSAqYXJnOworeworICAgIGludAkJICAgIG9wdF9pZHg7CisgICAgY2hhcgkgICAgKnMsICpwOworICAgIHN0YXRpYyBzaG9ydCAgICBxdWlja190YWJbMjddID0gezAsIDB9OwkvKiBxdWljayBhY2Nlc3MgdGFibGUgKi8KKyAgICBpbnQJCSAgICBpc190ZXJtX29wdDsKKworICAgIC8qCisgICAgICogRm9yIGZpcnN0IGNhbGw6IEluaXRpYWxpemUgdGhlIHF1aWNrLWFjY2VzcyB0YWJsZS4KKyAgICAgKiBJdCBjb250YWlucyB0aGUgaW5kZXggZm9yIHRoZSBmaXJzdCBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBhIGNlcnRhaW4KKyAgICAgKiBsZXR0ZXIuICBUaGVyZSBhcmUgMjYgbGV0dGVycywgcGx1cyB0aGUgZmlyc3QgInRfIiBvcHRpb24uCisgICAgICovCisgICAgaWYgKHF1aWNrX3RhYlsxXSA9PSAwKQorICAgIHsKKwlwID0gb3B0aW9uc1swXS5mdWxsbmFtZTsKKwlmb3IgKG9wdF9pZHggPSAxOyAocyA9IG9wdGlvbnNbb3B0X2lkeF0uZnVsbG5hbWUpICE9IE5VTEw7IG9wdF9pZHgrKykKKwl7CisJICAgIGlmIChzWzBdICE9IHBbMF0pCisJICAgIHsKKwkJaWYgKHNbMF0gPT0gJ3QnICYmIHNbMV0gPT0gJ18nKQorCQkgICAgcXVpY2tfdGFiWzI2XSA9IG9wdF9pZHg7CisJCWVsc2UKKwkJICAgIHF1aWNrX3RhYltDaGFyT3JkTG93KHNbMF0pXSA9IG9wdF9pZHg7CisJICAgIH0KKwkgICAgcCA9IHM7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIG5hbWUgc3RhcnRpbmcgd2l0aCBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4KKyAgICAgKi8KKyNpZmRlZiBFQkNESUMKKyAgICBpZiAoIWlzbG93ZXIoYXJnWzBdKSkKKyNlbHNlCisgICAgaWYgKGFyZ1swXSA8ICdhJyB8fCBhcmdbMF0gPiAneicpCisjZW5kaWYKKwlyZXR1cm4gLTE7CisKKyAgICBpc190ZXJtX29wdCA9IChhcmdbMF0gPT0gJ3QnICYmIGFyZ1sxXSA9PSAnXycpOworICAgIGlmIChpc190ZXJtX29wdCkKKwlvcHRfaWR4ID0gcXVpY2tfdGFiWzI2XTsKKyAgICBlbHNlCisJb3B0X2lkeCA9IHF1aWNrX3RhYltDaGFyT3JkTG93KGFyZ1swXSldOworICAgIGZvciAoIDsgKHMgPSBvcHRpb25zW29wdF9pZHhdLmZ1bGxuYW1lKSAhPSBOVUxMOyBvcHRfaWR4KyspCisgICAgeworCWlmIChTVFJDTVAoYXJnLCBzKSA9PSAwKQkJICAgIC8qIG1hdGNoIGZ1bGwgbmFtZSAqLworCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHMgPT0gTlVMTCAmJiAhaXNfdGVybV9vcHQpCisgICAgeworCW9wdF9pZHggPSBxdWlja190YWJbQ2hhck9yZExvdyhhcmdbMF0pXTsKKwlmb3IgKCA7IG9wdGlvbnNbb3B0X2lkeF0uZnVsbG5hbWUgIT0gTlVMTDsgb3B0X2lkeCsrKQorCXsKKwkgICAgcyA9IG9wdGlvbnNbb3B0X2lkeF0uc2hvcnRuYW1lOworCSAgICBpZiAocyAhPSBOVUxMICYmIFNUUkNNUChhcmcsIHMpID09IDApICAgLyogbWF0Y2ggc2hvcnQgbmFtZSAqLworCQlicmVhazsKKwkgICAgcyA9IE5VTEw7CisJfQorICAgIH0KKyAgICBpZiAocyA9PSBOVUxMKQorCW9wdF9pZHggPSAtMTsKKyAgICByZXR1cm4gb3B0X2lkeDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKEZFQVRfVENMKQorLyoKKyAqIEdldCB0aGUgdmFsdWUgZm9yIGFuIG9wdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogTnVtYmVyIG9yIFRvZ2dsZSBvcHRpb246IDEsICpudW12YWwgZ2V0cyB2YWx1ZS4KKyAqCSAgICAgU3RyaW5nIG9wdGlvbjogMCwgKnN0cmluZ3ZhbCBnZXRzIGFsbG9jYXRlZCBzdHJpbmcuCisgKiBIaWRkZW4gTnVtYmVyIG9yIFRvZ2dsZSBvcHRpb246IC0xLgorICoJICAgICBoaWRkZW4gU3RyaW5nIG9wdGlvbjogLTIuCisgKgkJICAgdW5rbm93biBvcHRpb246IC0zLgorICovCisgICAgaW50CitnZXRfb3B0aW9uX3ZhbHVlKG5hbWUsIG51bXZhbCwgc3RyaW5ndmFsLCBvcHRfZmxhZ3MpCisgICAgY2hhcl91CSpuYW1lOworICAgIGxvbmcJKm51bXZhbDsKKyAgICBjaGFyX3UJKipzdHJpbmd2YWw7CSAgICAvKiBOVUxMIHdoZW4gb25seSBjaGVja2luZyBleGlzdGFuY2UgKi8KKyAgICBpbnQJCW9wdF9mbGFnczsKK3sKKyAgICBpbnQJCW9wdF9pZHg7CisgICAgY2hhcl91CSp2YXJwOworCisgICAgb3B0X2lkeCA9IGZpbmRvcHRpb24obmFtZSk7CisgICAgaWYgKG9wdF9pZHggPCAwKQkJICAgIC8qIHVua25vd24gb3B0aW9uICovCisJcmV0dXJuIC0zOworCisgICAgdmFycCA9IGdldF92YXJwX3Njb3BlKCYob3B0aW9uc1tvcHRfaWR4XSksIG9wdF9mbGFncyk7CisKKyAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfU1RSSU5HKQorICAgIHsKKwlpZiAodmFycCA9PSBOVUxMKQkJICAgIC8qIGhpZGRlbiBvcHRpb24gKi8KKwkgICAgcmV0dXJuIC0yOworCWlmIChzdHJpbmd2YWwgIT0gTlVMTCkKKwl7CisjaWZkZWYgRkVBVF9DUllQVAorCSAgICAvKiBuZXZlciByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjcnlwdCBrZXkgKi8KKwkgICAgaWYgKChjaGFyX3UgKiopdmFycCA9PSAmY3VyYnVmLT5iX3Bfa2V5KQorCQkqc3RyaW5ndmFsID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSIqKioqKiIpOworCSAgICBlbHNlCisjZW5kaWYKKwkJKnN0cmluZ3ZhbCA9IHZpbV9zdHJzYXZlKCooY2hhcl91ICoqKSh2YXJwKSk7CisJfQorCXJldHVybiAwOworICAgIH0KKworICAgIGlmICh2YXJwID09IE5VTEwpCQkgICAgLyogaGlkZGVuIG9wdGlvbiAqLworCXJldHVybiAtMTsKKyAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfTlVNKQorCSpudW12YWwgPSAqKGxvbmcgKil2YXJwOworICAgIGVsc2UKKyAgICB7CisJLyogU3BlY2lhbCBjYXNlOiAnbW9kaWZpZWQnIGlzIGJfY2hhbmdlZCwgYnV0IHdlIGFsc28gd2FudCB0byBjb25zaWRlcgorCSAqIGl0IHNldCB3aGVuICdmZicgb3IgJ2ZlbmMnIGNoYW5nZWQuICovCisJaWYgKChpbnQgKil2YXJwID09ICZjdXJidWYtPmJfY2hhbmdlZCkKKwkgICAgKm51bXZhbCA9IGN1cmJ1ZklzQ2hhbmdlZCgpOworCWVsc2UKKwkgICAgKm51bXZhbCA9ICooaW50ICopdmFycDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgdmFsdWUgb2Ygb3B0aW9uICJuYW1lIi4KKyAqIFVzZSAic3RyaW5nIiBmb3Igc3RyaW5nIG9wdGlvbnMsIHVzZSAibnVtYmVyIiBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqLworICAgIHZvaWQKK3NldF9vcHRpb25fdmFsdWUobmFtZSwgbnVtYmVyLCBzdHJpbmcsIG9wdF9mbGFncykKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgbG9uZwludW1iZXI7CisgICAgY2hhcl91CSpzdHJpbmc7CisgICAgaW50CQlvcHRfZmxhZ3M7CS8qIE9QVF9MT0NBTCBvciAwIChib3RoKSAqLworeworICAgIGludAkJb3B0X2lkeDsKKyAgICBjaGFyX3UJKnZhcnA7CisgICAgaW50CQlmbGFnczsKKworICAgIG9wdF9pZHggPSBmaW5kb3B0aW9uKG5hbWUpOworICAgIGlmIChvcHRfaWR4ID09IC0xKQorCUVNU0cyKF8oIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIpLCBuYW1lKTsKKyAgICBlbHNlCisgICAgeworCWZsYWdzID0gb3B0aW9uc1tvcHRfaWR4XS5mbGFnczsKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKwkvKiBEaXNhbGxvdyBjaGFuZ2luZyBzb21lIG9wdGlvbnMgaW4gdGhlIHNhbmRib3ggKi8KKwlpZiAoc2FuZGJveCA+IDAgJiYgKGZsYWdzICYgUF9TRUNVUkUpKQorCSAgICBFTVNHKF8oZV9zYW5kYm94KSk7CisJZWxzZQorI2VuZGlmCisJICBpZiAoZmxhZ3MgJiBQX1NUUklORykKKwkgICAgc2V0X3N0cmluZ19vcHRpb24ob3B0X2lkeCwgc3RyaW5nLCBvcHRfZmxhZ3MpOworCWVsc2UKKwl7CisJICAgIHZhcnAgPSBnZXRfdmFycCgmb3B0aW9uc1tvcHRfaWR4XSk7CisJICAgIGlmICh2YXJwICE9IE5VTEwpCS8qIGhpZGRlbiBvcHRpb24gaXMgbm90IGNoYW5nZWQgKi8KKwkgICAgeworCQlpZiAoZmxhZ3MgJiBQX05VTSkKKwkJICAgICh2b2lkKXNldF9udW1fb3B0aW9uKG9wdF9pZHgsIHZhcnAsIG51bWJlciwgTlVMTCwgb3B0X2ZsYWdzKTsKKwkJZWxzZQorCQkgICAgKHZvaWQpc2V0X2Jvb2xfb3B0aW9uKG9wdF9pZHgsIHZhcnAsIChpbnQpbnVtYmVyLCBvcHRfZmxhZ3MpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIEdldCB0aGUgdGVybWluYWwgY29kZSBmb3IgYSB0ZXJtaW5hbCBvcHRpb24uCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBub3QgZm91bmQuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X3Rlcm1fY29kZSh0bmFtZSkKKyAgICBjaGFyX3UJKnRuYW1lOworeworICAgIGludAkgICAgb3B0X2lkeDsKKyAgICBjaGFyX3UgICp2YXJwOworCisgICAgaWYgKHRuYW1lWzBdICE9ICd0JyB8fCB0bmFtZVsxXSAhPSAnXycgfHwKKwkgICAgdG5hbWVbMl0gPT0gTlVMIHx8IHRuYW1lWzNdID09IE5VTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKG9wdF9pZHggPSBmaW5kb3B0aW9uKHRuYW1lKSkgPj0gMCkKKyAgICB7CisJdmFycCA9IGdldF92YXJwKCYob3B0aW9uc1tvcHRfaWR4XSkpOworCWlmICh2YXJwICE9IE5VTEwpCisJICAgIHZhcnAgPSAqKGNoYXJfdSAqKikodmFycCk7CisJcmV0dXJuIHZhcnA7CisgICAgfQorICAgIHJldHVybiBmaW5kX3Rlcm1jb2RlKHRuYW1lICsgMik7Cit9CisKKyAgICBjaGFyX3UgKgorZ2V0X2hpZ2hsaWdodF9kZWZhdWx0KCkKK3sKKyAgICBpbnQgaTsKKworICAgIGkgPSBmaW5kb3B0aW9uKChjaGFyX3UgKikiaGwiKTsKKyAgICBpZiAoaSA+PSAwKQorCXJldHVybiBvcHRpb25zW2ldLmRlZl92YWxbVklfREVGQVVMVF07CisgICAgcmV0dXJuIChjaGFyX3UgKilOVUxMOworfQorCisvKgorICogVHJhbnNsYXRlIGEgc3RyaW5nIGxpa2UgInRfeHgiLCAiPHRfeHg+IiBvciAiPFMtVGFiPiIgdG8gYSBrZXkgbnVtYmVyLgorICovCisgICAgc3RhdGljIGludAorZmluZF9rZXlfb3B0aW9uKGFyZykKKyAgICBjaGFyX3UgKmFyZzsKK3sKKyAgICBpbnQJCWtleTsKKyAgICBpbnQJCW1vZGlmaWVyczsKKworICAgIC8qCisgICAgICogRG9uJ3QgdXNlIGdldF9zcGVjaWFsX2tleV9jb2RlKCkgZm9yIHRfeHgsIHdlIGRvbid0IHdhbnQgaXQgdG8gY2FsbAorICAgICAqIGFkZF90ZXJtY2FwX2VudHJ5KCkuCisgICAgICovCisgICAgaWYgKGFyZ1swXSA9PSAndCcgJiYgYXJnWzFdID09ICdfJyAmJiBhcmdbMl0gJiYgYXJnWzNdKQorCWtleSA9IFRFUk1DQVAyS0VZKGFyZ1syXSwgYXJnWzNdKTsKKyAgICBlbHNlCisgICAgeworCS0tYXJnOwkJCSAgICAvKiBwdXQgYXJnIGF0IHRoZSAnPCcgKi8KKwltb2RpZmllcnMgPSAwOworCWtleSA9IGZpbmRfc3BlY2lhbF9rZXkoJmFyZywgJm1vZGlmaWVycywgVFJVRSk7CisJaWYgKG1vZGlmaWVycykJCSAgICAvKiBjYW4ndCBoYW5kbGUgbW9kaWZpZXJzIGhlcmUgKi8KKwkgICAga2V5ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGtleTsKK30KKworLyoKKyAqIGlmICdhbGwnID09IDA6IHNob3cgY2hhbmdlZCBvcHRpb25zCisgKiBpZiAnYWxsJyA9PSAxOiBzaG93IGFsbCBub3JtYWwgb3B0aW9ucworICogaWYgJ2FsbCcgPT0gMjogc2hvdyBhbGwgdGVybWluYWwgb3B0aW9ucworICovCisgICAgc3RhdGljIHZvaWQKK3Nob3dvcHRpb25zKGFsbCwgb3B0X2ZsYWdzKQorICAgIGludAkJYWxsOworICAgIGludAkJb3B0X2ZsYWdzOwkvKiBPUFRfTE9DQUwgYW5kL29yIE9QVF9HTE9CQUwgKi8KK3sKKyAgICBzdHJ1Y3Qgdmltb3B0aW9uCSpwOworICAgIGludAkJCWNvbDsKKyAgICBpbnQJCQlpc3Rlcm07CisgICAgY2hhcl91CQkqdmFycDsKKyAgICBzdHJ1Y3Qgdmltb3B0aW9uCSoqaXRlbXM7CisgICAgaW50CQkJaXRlbV9jb3VudDsKKyAgICBpbnQJCQlydW47CisgICAgaW50CQkJcm93LCByb3dzOworICAgIGludAkJCWNvbHM7CisgICAgaW50CQkJaTsKKyAgICBpbnQJCQlsZW47CisKKyNkZWZpbmUgSU5DIDIwCisjZGVmaW5lIEdBUCAzCisKKyAgICBpdGVtcyA9IChzdHJ1Y3Qgdmltb3B0aW9uICoqKWFsbG9jKCh1bnNpZ25lZCkoc2l6ZW9mKHN0cnVjdCB2aW1vcHRpb24gKikgKgorCQkJCQkJCQlQQVJBTV9DT1VOVCkpOworICAgIGlmIChpdGVtcyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIEhpZ2hsaWdodCB0aXRsZSAqLworICAgIGlmIChhbGwgPT0gMikKKwlNU0dfUFVUU19USVRMRShfKCJcbi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iKSk7CisgICAgZWxzZSBpZiAob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkKKwlNU0dfUFVUU19USVRMRShfKCJcbi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iKSk7CisgICAgZWxzZSBpZiAob3B0X2ZsYWdzICYgT1BUX0xPQ0FMKQorCU1TR19QVVRTX1RJVExFKF8oIlxuLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIikpOworICAgIGVsc2UKKwlNU0dfUFVUU19USVRMRShfKCJcbi0tLSBPcHRpb25zIC0tLSIpKTsKKworICAgIC8qCisgICAgICogZG8gdGhlIGxvb3AgdHdvIHRpbWVzOgorICAgICAqIDEuIGRpc3BsYXkgdGhlIHNob3J0IGl0ZW1zCisgICAgICogMi4gZGlzcGxheSB0aGUgbG9uZyBpdGVtcyAob25seSBzdHJpbmdzIGFuZCBudW1iZXJzKQorICAgICAqLworICAgIGZvciAocnVuID0gMTsgcnVuIDw9IDIgJiYgIWdvdF9pbnQ7ICsrcnVuKQorICAgIHsKKwkvKgorCSAqIGNvbGxlY3QgdGhlIGl0ZW1zIGluIGl0ZW1zW10KKwkgKi8KKwlpdGVtX2NvdW50ID0gMDsKKwlmb3IgKHAgPSAmb3B0aW9uc1swXTsgcC0+ZnVsbG5hbWUgIT0gTlVMTDsgcCsrKQorCXsKKwkgICAgdmFycCA9IE5VTEw7CisJICAgIGlzdGVybSA9IGlzdGVybW9wdGlvbihwKTsKKwkgICAgaWYgKG9wdF9mbGFncyAhPSAwKQorCSAgICB7CisJCWlmIChwLT5pbmRpciAhPSBQVl9OT05FICYmICFpc3Rlcm0pCisJCSAgICB2YXJwID0gZ2V0X3ZhcnBfc2NvcGUocCwgb3B0X2ZsYWdzKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXZhcnAgPSBnZXRfdmFycChwKTsKKwkgICAgaWYgKHZhcnAgIT0gTlVMTAorCQkgICAgJiYgKChhbGwgPT0gMiAmJiBpc3Rlcm0pCisJCQl8fCAoYWxsID09IDEgJiYgIWlzdGVybSkKKwkJCXx8IChhbGwgPT0gMCAmJiAhb3B0dmFsX2RlZmF1bHQocCwgdmFycCkpKSkKKwkgICAgeworCQlpZiAocC0+ZmxhZ3MgJiBQX0JPT0wpCisJCSAgICBsZW4gPSAxOwkJLyogYSB0b2dnbGUgb3B0aW9uIGZpdHMgYWx3YXlzICovCisJCWVsc2UKKwkJeworCQkgICAgb3B0aW9uX3ZhbHVlMnN0cmluZyhwLCBvcHRfZmxhZ3MpOworCQkgICAgbGVuID0gKGludClTVFJMRU4ocC0+ZnVsbG5hbWUpICsgdmltX3N0cnNpemUoTmFtZUJ1ZmYpICsgMTsKKwkJfQorCQlpZiAoKGxlbiA8PSBJTkMgLSBHQVAgJiYgcnVuID09IDEpIHx8CisJCQkJCQkobGVuID4gSU5DIC0gR0FQICYmIHJ1biA9PSAyKSkKKwkJICAgIGl0ZW1zW2l0ZW1fY291bnQrK10gPSBwOworCSAgICB9CisJfQorCisJLyoKKwkgKiBkaXNwbGF5IHRoZSBpdGVtcworCSAqLworCWlmIChydW4gPT0gMSkKKwl7CisJICAgIGNvbHMgPSAoQ29sdW1ucyArIEdBUCAtIDMpIC8gSU5DOworCSAgICBpZiAoY29scyA9PSAwKQorCQljb2xzID0gMTsKKwkgICAgcm93cyA9IChpdGVtX2NvdW50ICsgY29scyAtIDEpIC8gY29sczsKKwl9CisJZWxzZQkvKiBydW4gPT0gMiAqLworCSAgICByb3dzID0gaXRlbV9jb3VudDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd3MgJiYgIWdvdF9pbnQ7ICsrcm93KQorCXsKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CQkJLyogZ28gdG8gbmV4dCBsaW5lICovCisJICAgIGlmIChnb3RfaW50KQkJCS8qICdxJyB0eXBlZCBpbiBtb3JlICovCisJCWJyZWFrOworCSAgICBjb2wgPSAwOworCSAgICBmb3IgKGkgPSByb3c7IGkgPCBpdGVtX2NvdW50OyBpICs9IHJvd3MpCisJICAgIHsKKwkJbXNnX2NvbCA9IGNvbDsJCQkvKiBtYWtlIGNvbHVtbnMgKi8KKwkJc2hvd29uZW9wdChpdGVtc1tpXSwgb3B0X2ZsYWdzKTsKKwkJY29sICs9IElOQzsKKwkgICAgfQorCSAgICBvdXRfZmx1c2goKTsKKwkgICAgdWlfYnJlYWtjaGVjaygpOworCX0KKyAgICB9CisgICAgdmltX2ZyZWUoaXRlbXMpOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgb3B0aW9uICJwIiBoYXMgaXRzIGRlZmF1bHQgdmFsdWUuCisgKi8KKyAgICBzdGF0aWMgaW50CitvcHR2YWxfZGVmYXVsdChwLCB2YXJwKQorICAgIHN0cnVjdCB2aW1vcHRpb24JKnA7CisgICAgY2hhcl91CQkqdmFycDsKK3sKKyAgICBpbnQJCWR2aTsKKworICAgIGlmICh2YXJwID09IE5VTEwpCisJcmV0dXJuIFRSVUU7CSAgICAvKiBoaWRkZW4gb3B0aW9uIGlzIGFsd2F5cyBhdCBkZWZhdWx0ICovCisgICAgZHZpID0gKChwLT5mbGFncyAmIFBfVklfREVGKSB8fCBwX2NwKSA/IFZJX0RFRkFVTFQgOiBWSU1fREVGQVVMVDsKKyAgICBpZiAocC0+ZmxhZ3MgJiBQX05VTSkKKwlyZXR1cm4gKCoobG9uZyAqKXZhcnAgPT0gKGxvbmcpcC0+ZGVmX3ZhbFtkdmldKTsKKyAgICBpZiAocC0+ZmxhZ3MgJiBQX0JPT0wpCisJCQkvKiB0aGUgY2FzdCB0byBsb25nIGlzIHJlcXVpcmVkIGZvciBNYW54IEMgKi8KKwlyZXR1cm4gKCooaW50ICopdmFycCA9PSAoaW50KShsb25nKXAtPmRlZl92YWxbZHZpXSk7CisgICAgLyogUF9TVFJJTkcgKi8KKyAgICByZXR1cm4gKFNUUkNNUCgqKGNoYXJfdSAqKil2YXJwLCBwLT5kZWZfdmFsW2R2aV0pID09IDApOworfQorCisvKgorICogc2hvd29uZW9wdDogc2hvdyB0aGUgdmFsdWUgb2Ygb25lIG9wdGlvbgorICogbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBoaWRkZW4gb3B0aW9uIQorICovCisgICAgc3RhdGljIHZvaWQKK3Nob3dvbmVvcHQocCwgb3B0X2ZsYWdzKQorICAgIHN0cnVjdCB2aW1vcHRpb24JKnA7CisgICAgaW50CQkJb3B0X2ZsYWdzOwkvKiBPUFRfTE9DQUwgb3IgT1BUX0dMT0JBTCAqLworeworICAgIGNoYXJfdQkJKnZhcnA7CisKKyAgICB2YXJwID0gZ2V0X3ZhcnBfc2NvcGUocCwgb3B0X2ZsYWdzKTsKKworICAgIC8qIGZvciAnbW9kaWZpZWQnIHdlIGFsc28gbmVlZCB0byBjaGVjayBpZiAnZmYnIG9yICdmZW5jJyBjaGFuZ2VkLiAqLworICAgIGlmICgocC0+ZmxhZ3MgJiBQX0JPT0wpICYmICgoaW50ICopdmFycCA9PSAmY3VyYnVmLT5iX2NoYW5nZWQKKwkJCQkJPyAhY3VyYnVmSXNDaGFuZ2VkKCkgOiAhKihpbnQgKil2YXJwKSkKKwlNU0dfUFVUUygibm8iKTsKKyAgICBlbHNlIGlmICgocC0+ZmxhZ3MgJiBQX0JPT0wpICYmICooaW50ICopdmFycCA8IDApCisJTVNHX1BVVFMoIi0tIik7CisgICAgZWxzZQorCU1TR19QVVRTKCIgICIpOworICAgIE1TR19QVVRTKHAtPmZ1bGxuYW1lKTsKKyAgICBpZiAoIShwLT5mbGFncyAmIFBfQk9PTCkpCisgICAgeworCW1zZ19wdXRjaGFyKCc9Jyk7CisJLyogcHV0IHZhbHVlIHN0cmluZyBpbiBOYW1lQnVmZiAqLworCW9wdGlvbl92YWx1ZTJzdHJpbmcocCwgb3B0X2ZsYWdzKTsKKwltc2dfb3V0dHJhbnMoTmFtZUJ1ZmYpOworICAgIH0KK30KKworLyoKKyAqIFdyaXRlIG1vZGlmaWVkIG9wdGlvbnMgYXMgIjpzZXQiIGNvbW1hbmRzIHRvIGEgZmlsZS4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgdmFsdWVzIGZvciAib3B0X2ZsYWdzIjoKKyAqIE9QVF9HTE9CQUw6CQkgICBXcml0ZSBnbG9iYWwgb3B0aW9uIHZhbHVlcyBhbmQgZnJlc2ggdmFsdWVzIG9mCisgKgkJCSAgIGJ1ZmZlci1sb2NhbCBvcHRpb25zICh1c2VkIGZvciBzdGFydCBvZiBhIHNlc3Npb24KKyAqCQkJICAgZmlsZSkuCisgKiBPUFRfR0xPQkFMICsgT1BUX0xPQ0FMOiBJZGVtLCBhZGQgZnJlc2ggdmFsdWVzIG9mIHdpbmRvdy1sb2NhbCBvcHRpb25zIGZvcgorICoJCQkgICBjdXJ3aW4gKHVzZWQgZm9yIGEgdmltcmMgZmlsZSkuCisgKiBPUFRfTE9DQUw6CQkgICBXcml0ZSBidWZmZXItbG9jYWwgb3B0aW9uIHZhbHVlcyBmb3IgY3VyYnVmLCBmcmVzaAorICoJCQkgICBhbmQgbG9jYWwgdmFsdWVzIGZvciB3aW5kb3ctbG9jYWwgb3B0aW9ucyBvZgorICoJCQkgICBjdXJ3aW4uICBMb2NhbCB2YWx1ZXMgYXJlIGFsc28gd3JpdHRlbiB3aGVuIGF0IHRoZQorICoJCQkgICBkZWZhdWx0IHZhbHVlLCBiZWNhdXNlIGEgbW9kZWxpbmUgb3IgYXV0b2NvbW1hbmQKKyAqCQkJICAgbWF5IGhhdmUgc2V0IHRoZW0gd2hlbiBkb2luZyAiOmVkaXQgZmlsZSIgYW5kIHRoZQorICoJCQkgICB1c2VyIGhhcyBzZXQgdGhlbSBiYWNrIGF0IHRoZSBkZWZhdWx0IG9yIGZyZXNoCisgKgkJCSAgIHZhbHVlLgorICoJCQkgICBXaGVuICJsb2NhbF9vbmx5IiBpcyBUUlVFLCBkb24ndCB3cml0ZSBmcmVzaAorICoJCQkgICB2YWx1ZXMsIG9ubHkgbG9jYWwgdmFsdWVzIChmb3IgIjpta3ZpZXciKS4KKyAqIChmcmVzaCB2YWx1ZSA9IHZhbHVlIHVzZWQgZm9yIGEgbmV3IGJ1ZmZlciBvciB3aW5kb3cgZm9yIGEgbG9jYWwgb3B0aW9uKS4KKyAqCisgKiBSZXR1cm4gRkFJTCBvbiBlcnJvciwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgaW50CittYWtlc2V0KGZkLCBvcHRfZmxhZ3MsIGxvY2FsX29ubHkpCisgICAgRklMRQkqZmQ7CisgICAgaW50CQlvcHRfZmxhZ3M7CisgICAgaW50CQlsb2NhbF9vbmx5OworeworICAgIHN0cnVjdCB2aW1vcHRpb24JKnA7CisgICAgY2hhcl91CQkqdmFycDsJCQkvKiBjdXJyZW50bHkgdXNlZCB2YWx1ZSAqLworICAgIGNoYXJfdQkJKnZhcnBfZnJlc2g7CQkvKiBsb2NhbCB2YWx1ZSAqLworICAgIGNoYXJfdQkJKnZhcnBfbG9jYWwgPSBOVUxMOwkvKiBmcmVzaCB2YWx1ZSAqLworICAgIGNoYXIJCSpjbWQ7CisgICAgaW50CQkJcm91bmQ7CisKKyAgICAvKgorICAgICAqIFRoZSBvcHRpb25zIHRoYXQgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgKHRlcm1pbmFsIG5hbWUsIGNvbHVtbnMsIGxpbmVzKQorICAgICAqIGFyZSBuZXZlciB3cml0dGVuLiAgVGVybWluYWwgb3B0aW9ucyBhcmUgYWxzbyBub3Qgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBmb3IgKHAgPSAmb3B0aW9uc1swXTsgIWlzdGVybW9wdGlvbihwKTsgcCsrKQorCWlmICghKHAtPmZsYWdzICYgUF9OT19NS1JDKSAmJiAhaXN0ZXJtb3B0aW9uKHApKQorCXsKKwkgICAgLyogc2tpcCBnbG9iYWwgb3B0aW9uIHdoZW4gb25seSBkb2luZyBsb2NhbHMgKi8KKwkgICAgaWYgKHAtPmluZGlyID09IFBWX05PTkUgJiYgIShvcHRfZmxhZ3MgJiBPUFRfR0xPQkFMKSkKKwkJY29udGludWU7CisKKwkgICAgLyogRG8gbm90IHN0b3JlIG9wdGlvbnMgbGlrZSAnYnVmaGlkZGVuJyBhbmQgJ3N5bnRheCcgaW4gYSB2aW1yYworCSAgICAgKiBmaWxlLCB0aGV5IGFyZSBhbHdheXMgYnVmZmVyLXNwZWNpZmljLiAqLworCSAgICBpZiAoKG9wdF9mbGFncyAmIE9QVF9HTE9CQUwpICYmIChwLT5mbGFncyAmIFBfTk9HTE9CKSkKKwkJY29udGludWU7CisKKwkgICAgLyogR2xvYmFsIHZhbHVlcyBhcmUgb25seSB3cml0dGVuIHdoZW4gbm90IGF0IHRoZSBkZWZhdWx0IHZhbHVlLiAqLworCSAgICB2YXJwID0gZ2V0X3ZhcnBfc2NvcGUocCwgb3B0X2ZsYWdzKTsKKwkgICAgaWYgKChvcHRfZmxhZ3MgJiBPUFRfR0xPQkFMKSAmJiBvcHR2YWxfZGVmYXVsdChwLCB2YXJwKSkKKwkJY29udGludWU7CisKKwkgICAgcm91bmQgPSAyOworCSAgICBpZiAocC0+aW5kaXIgIT0gUFZfTk9ORSkKKwkgICAgeworCQlpZiAocC0+dmFyID09IFZBUl9XSU4pCisJCXsKKwkJICAgIC8qIHNraXAgd2luZG93LWxvY2FsIG9wdGlvbiB3aGVuIG9ubHkgZG9pbmcgZ2xvYmFscyAqLworCQkgICAgaWYgKCEob3B0X2ZsYWdzICYgT1BUX0xPQ0FMKSkKKwkJCWNvbnRpbnVlOworCQkgICAgLyogV2hlbiBmcmVzaCB2YWx1ZSBvZiB3aW5kb3ctbG9jYWwgb3B0aW9uIGlzIG5vdCBhdCB0aGUKKwkJICAgICAqIGRlZmF1bHQsIG5lZWQgdG8gd3JpdGUgaXQgdG9vLiAqLworCQkgICAgaWYgKCEob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkgJiYgIWxvY2FsX29ubHkpCisJCSAgICB7CisJCQl2YXJwX2ZyZXNoID0gZ2V0X3ZhcnBfc2NvcGUocCwgT1BUX0dMT0JBTCk7CisJCQlpZiAoIW9wdHZhbF9kZWZhdWx0KHAsIHZhcnBfZnJlc2gpKQorCQkJeworCQkJICAgIHJvdW5kID0gMTsKKwkJCSAgICB2YXJwX2xvY2FsID0gdmFycDsKKwkJCSAgICB2YXJwID0gdmFycF9mcmVzaDsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgLyogUm91bmQgMTogZnJlc2ggdmFsdWUgZm9yIHdpbmRvdy1sb2NhbCBvcHRpb25zLgorCSAgICAgKiBSb3VuZCAyOiBvdGhlciB2YWx1ZXMgKi8KKwkgICAgZm9yICggOyByb3VuZCA8PSAyOyB2YXJwID0gdmFycF9sb2NhbCwgKytyb3VuZCkKKwkgICAgeworCQlpZiAocm91bmQgPT0gMSB8fCAob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkpCisJCSAgICBjbWQgPSAic2V0IjsKKwkJZWxzZQorCQkgICAgY21kID0gInNldGxvY2FsIjsKKworCQlpZiAocC0+ZmxhZ3MgJiBQX0JPT0wpCisJCXsKKwkJICAgIGlmIChwdXRfc2V0Ym9vbChmZCwgY21kLCBwLT5mdWxsbmFtZSwgKihpbnQgKil2YXJwKSA9PSBGQUlMKQorCQkJcmV0dXJuIEZBSUw7CisJCX0KKwkJZWxzZSBpZiAocC0+ZmxhZ3MgJiBQX05VTSkKKwkJeworCQkgICAgaWYgKHB1dF9zZXRudW0oZmQsIGNtZCwgcC0+ZnVsbG5hbWUsIChsb25nICopdmFycCkgPT0gRkFJTCkKKwkJCXJldHVybiBGQUlMOworCQl9CisJCWVsc2UgICAgLyogUF9TVFJJTkcgKi8KKwkJeworCQkgICAgLyogRG9uJ3Qgc2V0ICdzeW50YXgnIGFuZCAnZmlsZXR5cGUnIGFnYWluIGlmIHRoZSB2YWx1ZSBpcworCQkgICAgICogYWxyZWFkeSByaWdodCwgYXZvaWRzIHJlbG9hZGluZyB0aGUgc3ludGF4IGZpbGUuICovCisJCSAgICBpZiAocC0+aW5kaXIgPT0gUFZfU1lOIHx8IHAtPmluZGlyID09IFBWX0ZUKQorCQkgICAgeworCQkJaWYgKGZwcmludGYoZmQsICJpZiAmJXMgIT0gJyVzJyIsIHAtPmZ1bGxuYW1lLAorCQkJCQkJICAgICAgICooY2hhcl91ICoqKSh2YXJwKSkgPCAwCisJCQkJfHwgcHV0X2VvbChmZCkgPCAwKQorCQkJICAgIHJldHVybiBGQUlMOworCQkgICAgfQorCQkgICAgaWYgKHB1dF9zZXRzdHJpbmcoZmQsIGNtZCwgcC0+ZnVsbG5hbWUsIChjaGFyX3UgKiopdmFycCwKKwkJCQkJICAocC0+ZmxhZ3MgJiBQX0VYUEFORCkgIT0gMCkgPT0gRkFJTCkKKwkJCXJldHVybiBGQUlMOworCQkgICAgaWYgKHAtPmluZGlyID09IFBWX1NZTiB8fCBwLT5pbmRpciA9PSBQVl9GVCkKKwkJICAgIHsKKwkJCWlmIChwdXRfbGluZShmZCwgImVuZGlmIikgPT0gRkFJTCkKKwkJCSAgICByZXR1cm4gRkFJTDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIHJldHVybiBPSzsKK30KKworI2lmIGRlZmluZWQoRkVBVF9GT0xESU5HKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdlbmVyYXRlIHNldCBjb21tYW5kcyBmb3IgdGhlIGxvY2FsIGZvbGQgb3B0aW9ucyBvbmx5LiAgVXNlZCB3aGVuCisgKiAnc2Vzc2lvbm9wdGlvbnMnIG9yICd2aWV3b3B0aW9ucycgY29udGFpbnMgImZvbGRzIiBidXQgbm90ICJvcHRpb25zIi4KKyAqLworICAgIGludAorbWFrZWZvbGRzZXQoZmQpCisgICAgRklMRQkqZmQ7Cit7CisgICAgaWYgKHB1dF9zZXRzdHJpbmcoZmQsICJzZXRsb2NhbCIsICJmZG0iLCAmY3Vyd2luLT53X3BfZmRtLCBGQUxTRSkgPT0gRkFJTAorIyBpZmRlZiBGRUFUX0VWQUwKKwkgICAgfHwgcHV0X3NldHN0cmluZyhmZCwgInNldGxvY2FsIiwgImZkZSIsICZjdXJ3aW4tPndfcF9mZGUsIEZBTFNFKQorCQkJCQkJCQkgICAgICAgPT0gRkFJTAorIyBlbmRpZgorCSAgICB8fCBwdXRfc2V0c3RyaW5nKGZkLCAic2V0bG9jYWwiLCAiZm1yIiwgJmN1cndpbi0+d19wX2ZtciwgRkFMU0UpCisJCQkJCQkJCSAgICAgICA9PSBGQUlMCisJICAgIHx8IHB1dF9zZXRzdHJpbmcoZmQsICJzZXRsb2NhbCIsICJmZGkiLCAmY3Vyd2luLT53X3BfZmRpLCBGQUxTRSkKKwkJCQkJCQkJICAgICAgID09IEZBSUwKKwkgICAgfHwgcHV0X3NldG51bShmZCwgInNldGxvY2FsIiwgImZkbCIsICZjdXJ3aW4tPndfcF9mZGwpID09IEZBSUwKKwkgICAgfHwgcHV0X3NldG51bShmZCwgInNldGxvY2FsIiwgImZtbCIsICZjdXJ3aW4tPndfcF9mbWwpID09IEZBSUwKKwkgICAgfHwgcHV0X3NldG51bShmZCwgInNldGxvY2FsIiwgImZkbiIsICZjdXJ3aW4tPndfcF9mZG4pID09IEZBSUwKKwkgICAgfHwgcHV0X3NldGJvb2woZmQsICJzZXRsb2NhbCIsICJmZW4iLCBjdXJ3aW4tPndfcF9mZW4pID09IEZBSUwKKwkgICAgKQorCXJldHVybiBGQUlMOworCisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgaW50CitwdXRfc2V0c3RyaW5nKGZkLCBjbWQsIG5hbWUsIHZhbHVlcCwgZXhwYW5kKQorICAgIEZJTEUJKmZkOworICAgIGNoYXIJKmNtZDsKKyAgICBjaGFyCSpuYW1lOworICAgIGNoYXJfdQkqKnZhbHVlcDsKKyAgICBpbnQJCWV4cGFuZDsKK3sKKyAgICBjaGFyX3UJKnM7CisgICAgY2hhcl91CWJ1ZltNQVhQQVRITF07CisKKyAgICBpZiAoZnByaW50ZihmZCwgIiVzICVzPSIsIGNtZCwgbmFtZSkgPCAwKQorCXJldHVybiBGQUlMOworICAgIGlmICgqdmFsdWVwICE9IE5VTEwpCisgICAgeworCS8qIE91dHB1dCAncGFzdGV0b2dnbGUnIGFzIGtleSBuYW1lcy4gIEZvciBvdGhlcgorCSAqIG9wdGlvbnMgc29tZSBjaGFyYWN0ZXJzIGhhdmUgdG8gYmUgZXNjYXBlZCB3aXRoCisJICogQ1RSTC1WIG9yIGJhY2tzbGFzaCAqLworCWlmICh2YWx1ZXAgPT0gJnBfcHQpCisJeworCSAgICBzID0gKnZhbHVlcDsKKwkgICAgd2hpbGUgKCpzICE9IE5VTCkKKwkJaWYgKGZwdXRzKChjaGFyICopc3RyMnNwZWNpYWwoJnMsIEZBTFNFKSwgZmQpIDwgMCkKKwkJICAgIHJldHVybiBGQUlMOworCX0KKwllbHNlIGlmIChleHBhbmQpCisJeworCSAgICBob21lX3JlcGxhY2UoTlVMTCwgKnZhbHVlcCwgYnVmLCBNQVhQQVRITCwgRkFMU0UpOworCSAgICBpZiAocHV0X2VzY3N0cihmZCwgYnVmLCAyKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwl9CisJZWxzZSBpZiAocHV0X2VzY3N0cihmZCwgKnZhbHVlcCwgMikgPT0gRkFJTCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGlmIChwdXRfZW9sKGZkKSA8IDApCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIGludAorcHV0X3NldG51bShmZCwgY21kLCBuYW1lLCB2YWx1ZXApCisgICAgRklMRQkqZmQ7CisgICAgY2hhcgkqY21kOworICAgIGNoYXIJKm5hbWU7CisgICAgbG9uZwkqdmFsdWVwOworeworICAgIGxvbmcJd2M7CisKKyAgICBpZiAoZnByaW50ZihmZCwgIiVzICVzPSIsIGNtZCwgbmFtZSkgPCAwKQorCXJldHVybiBGQUlMOworICAgIGlmICh3Y191c2Vfa2V5bmFtZSgoY2hhcl91ICopdmFsdWVwLCAmd2MpKQorICAgIHsKKwkvKiBwcmludCAnd2lsZGNoYXInIGFuZCAnd2lsZGNoYXJtJyBhcyBhIGtleSBuYW1lICovCisJaWYgKGZwdXRzKChjaGFyICopZ2V0X3NwZWNpYWxfa2V5X25hbWUoKGludCl3YywgMCksIGZkKSA8IDApCisJICAgIHJldHVybiBGQUlMOworICAgIH0KKyAgICBlbHNlIGlmIChmcHJpbnRmKGZkLCAiJWxkIiwgKnZhbHVlcCkgPCAwKQorCXJldHVybiBGQUlMOworICAgIGlmIChwdXRfZW9sKGZkKSA8IDApCisJcmV0dXJuIEZBSUw7CisgICAgcmV0dXJuIE9LOworfQorCisgICAgc3RhdGljIGludAorcHV0X3NldGJvb2woZmQsIGNtZCwgbmFtZSwgdmFsdWUpCisgICAgRklMRQkqZmQ7CisgICAgY2hhcgkqY21kOworICAgIGNoYXIJKm5hbWU7CisgICAgaW50CQl2YWx1ZTsKK3sKKyAgICBpZiAoZnByaW50ZihmZCwgIiVzICVzJXMiLCBjbWQsIHZhbHVlID8gIiIgOiAibm8iLCBuYW1lKSA8IDAKKwkgICAgfHwgcHV0X2VvbChmZCkgPCAwKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENsZWFyIGFsbCB0aGUgdGVybWluYWwgb3B0aW9ucy4KKyAqIElmIHRoZSBvcHRpb24gaGFzIGJlZW4gYWxsb2NhdGVkLCBmcmVlIHRoZSBtZW1vcnkuCisgKiBUZXJtaW5hbCBvcHRpb25zIGFyZSBuZXZlciBoaWRkZW4gb3IgaW5kaXJlY3QuCisgKi8KKyAgICB2b2lkCitjbGVhcl90ZXJtb3B0aW9ucygpCit7CisgICAgc3RydWN0IHZpbW9wdGlvbiAgICpwOworCisgICAgLyoKKyAgICAgKiBSZXNldCBhIGZldyB0aGluZ3MgYmVmb3JlIGNsZWFyaW5nIHRoZSBvbGQgb3B0aW9ucy4gVGhpcyBtYXkgY2F1c2UKKyAgICAgKiBvdXRwdXR0aW5nIGEgZmV3IHRoaW5ncyB0aGF0IHRoZSB0ZXJtaW5hbCBkb2Vzbid0IHVuZGVyc3RhbmQsIGJ1dCB0aGUKKyAgICAgKiBzY3JlZW4gd2lsbCBiZSBjbGVhcmVkIGxhdGVyLCBzbyB0aGlzIGlzIE9LLgorICAgICAqLworI2lmZGVmIEZFQVRfTU9VU0VfVFRZCisgICAgbWNoX3NldG1vdXNlKEZBTFNFKTsJICAgIC8qIHN3aXRjaCBtb3VzZSBvZmYgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfVElUTEUKKyAgICBtY2hfcmVzdG9yZV90aXRsZSgzKTsJICAgIC8qIHJlc3RvcmUgd2luZG93IHRpdGxlcyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpICYmIGRlZmluZWQoRkVBVF9HVUkpCisgICAgLyogV2hlbiBzdGFydGluZyB0aGUgR1VJIGNsb3NlIHRoZSBkaXNwbGF5IG9wZW5lZCBmb3IgdGhlIGNsaXBib2FyZC4KKyAgICAgKiBBZnRlciByZXN0b3JpbmcgdGhlIHRpdGxlLCBiZWNhdXNlIHRoYXQgd2lsbCBuZWVkIHRoZSBkaXNwbGF5LiAqLworICAgIGlmIChndWkuc3RhcnRpbmcpCisJY2xlYXJfeHRlcm1fY2xpcCgpOworI2VuZGlmCisjaWZkZWYgV0lOMzI2NAorICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBpcyBhbGxvd2VkIG5vdy4KKyAgICAgKi8KKyAgICBpZiAoY2FuX2VuZF90ZXJtY2FwX21vZGUoRkFMU0UpID09IFRSVUUpCisjZW5kaWYKKwlzdG9wdGVybWNhcCgpOwkJCS8qIHN0b3AgdGVybWNhcCBtb2RlICovCisKKyAgICBmb3IgKHAgPSAmb3B0aW9uc1swXTsgcC0+ZnVsbG5hbWUgIT0gTlVMTDsgcCsrKQorCWlmIChpc3Rlcm1vcHRpb24ocCkpCisJeworCSAgICBpZiAocC0+ZmxhZ3MgJiBQX0FMTE9DRUQpCisJCWZyZWVfc3RyaW5nX29wdGlvbigqKGNoYXJfdSAqKikocC0+dmFyKSk7CisJICAgIGlmIChwLT5mbGFncyAmIFBfREVGX0FMTE9DRUQpCisJCWZyZWVfc3RyaW5nX29wdGlvbihwLT5kZWZfdmFsW1ZJX0RFRkFVTFRdKTsKKwkgICAgKihjaGFyX3UgKiopKHAtPnZhcikgPSBlbXB0eV9vcHRpb247CisJICAgIHAtPmRlZl92YWxbVklfREVGQVVMVF0gPSBlbXB0eV9vcHRpb247CisJICAgIHAtPmZsYWdzICY9IH4oUF9BTExPQ0VEfFBfREVGX0FMTE9DRUQpOworCX0KKyAgICBjbGVhcl90ZXJtY29kZXMoKTsKK30KKworLyoKKyAqIFNldCB0aGUgdGVybWluYWwgb3B0aW9uIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZhbHVlLgorICogVXNlZCBhZnRlciBzZXR0aW5nIHRoZSB0ZXJtaW5hbCBuYW1lLgorICovCisgICAgdm9pZAorc2V0X3Rlcm1fZGVmYXVsdHMoKQoreworICAgIHN0cnVjdCB2aW1vcHRpb24gICAqcDsKKworICAgIGZvciAocCA9ICZvcHRpb25zWzBdOyBwLT5mdWxsbmFtZSAhPSBOVUxMOyBwKyspCisgICAgeworCWlmIChpc3Rlcm1vcHRpb24ocCkgJiYgcC0+ZGVmX3ZhbFtWSV9ERUZBVUxUXSAhPSAqKGNoYXJfdSAqKikocC0+dmFyKSkKKwl7CisJICAgIGlmIChwLT5mbGFncyAmIFBfREVGX0FMTE9DRUQpCisJICAgIHsKKwkJZnJlZV9zdHJpbmdfb3B0aW9uKHAtPmRlZl92YWxbVklfREVGQVVMVF0pOworCQlwLT5mbGFncyAmPSB+UF9ERUZfQUxMT0NFRDsKKwkgICAgfQorCSAgICBwLT5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gKihjaGFyX3UgKiopKHAtPnZhcik7CisJICAgIGlmIChwLT5mbGFncyAmIFBfQUxMT0NFRCkKKwkgICAgeworCQlwLT5mbGFncyB8PSBQX0RFRl9BTExPQ0VEOworCQlwLT5mbGFncyAmPSB+UF9BTExPQ0VEOwkgLyogZG9uJ3QgZnJlZSB0aGUgdmFsdWUgbm93ICovCisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgJ3AnIHN0YXJ0cyB3aXRoICd0XycKKyAqLworICAgIHN0YXRpYyBpbnQKK2lzdGVybW9wdGlvbihwKQorICAgIHN0cnVjdCB2aW1vcHRpb24gKnA7Cit7CisgICAgcmV0dXJuIChwLT5mdWxsbmFtZVswXSA9PSAndCcgJiYgcC0+ZnVsbG5hbWVbMV0gPT0gJ18nKTsKK30KKworLyoKKyAqIENvbXB1dGUgY29sdW1ucyBmb3IgcnVsZXIgYW5kIHNob3duIGNvbW1hbmQuICdzY19jb2wnIGlzIGFsc28gdXNlZCB0bworICogZGVjaWRlIHdoYXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbWVzc2FnZSBvbiB0aGUgc3RhdHVzIGxpbmUgY2FuIGJlLgorICogSWYgdGhlcmUgaXMgYSBzdGF0dXMgbGluZSBmb3IgdGhlIGxhc3Qgd2luZG93LCAnc2NfY29sJyBpcyBpbmRlcGVuZGVudAorICogb2YgJ3J1X2NvbCcuCisgKi8KKworI2RlZmluZSBDT0xfUlVMRVIgMTcJICAgIC8qIGNvbHVtbnMgbmVlZGVkIGJ5IHN0YW5kYXJkIHJ1bGVyICovCisKKyAgICB2b2lkCitjb21wX2NvbCgpCit7CisjaWYgZGVmaW5lZChGRUFUX0NNRExfSU5GTykgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisgICAgaW50IGxhc3RfaGFzX3N0YXR1cyA9IChwX2xzID09IDIgfHwgKHBfbHMgPT0gMSAmJiBmaXJzdHdpbiAhPSBsYXN0d2luKSk7CisKKyAgICBzY19jb2wgPSAwOworICAgIHJ1X2NvbCA9IDA7CisgICAgaWYgKHBfcnUpCisgICAgeworI2lmZGVmIEZFQVRfU1RMX09QVAorCXJ1X2NvbCA9IChydV93aWQgPyBydV93aWQgOiBDT0xfUlVMRVIpICsgMTsKKyNlbHNlCisJcnVfY29sID0gQ09MX1JVTEVSICsgMTsKKyNlbmRpZgorCS8qIG5vIGxhc3Qgc3RhdHVzIGxpbmUsIGFkanVzdCBzY19jb2wgKi8KKwlpZiAoIWxhc3RfaGFzX3N0YXR1cykKKwkgICAgc2NfY29sID0gcnVfY29sOworICAgIH0KKyAgICBpZiAocF9zYykKKyAgICB7CisJc2NfY29sICs9IFNIT1dDTURfQ09MUzsKKwlpZiAoIXBfcnUgfHwgbGFzdF9oYXNfc3RhdHVzKQkgICAgLyogbm8gbmVlZCBmb3Igc2VwYXJhdGluZyBzcGFjZSAqLworCSAgICArK3NjX2NvbDsKKyAgICB9CisgICAgc2NfY29sID0gQ29sdW1ucyAtIHNjX2NvbDsKKyAgICBydV9jb2wgPSBDb2x1bW5zIC0gcnVfY29sOworICAgIGlmIChzY19jb2wgPD0gMCkJCS8qIHNjcmVlbiB0b28gbmFycm93LCB3aWxsIGJlY29tZSBhIG1lc3MgKi8KKwlzY19jb2wgPSAxOworICAgIGlmIChydV9jb2wgPD0gMCkKKwlydV9jb2wgPSAxOworI2Vsc2UKKyAgICBzY19jb2wgPSBDb2x1bW5zOworICAgIHJ1X2NvbCA9IENvbHVtbnM7CisjZW5kaWYKK30KKworLyoKKyAqIEdldCBwb2ludGVyIHRvIG9wdGlvbiB2YXJpYWJsZSwgZGVwZW5kaW5nIG9uIGxvY2FsIG9yIGdsb2JhbCBzY29wZS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X3ZhcnBfc2NvcGUocCwgb3B0X2ZsYWdzKQorICAgIHN0cnVjdCB2aW1vcHRpb24JKnA7CisgICAgaW50CQkJb3B0X2ZsYWdzOworeworICAgIGlmICgob3B0X2ZsYWdzICYgT1BUX0dMT0JBTCkgJiYgcC0+aW5kaXIgIT0gUFZfTk9ORSkKKyAgICB7CisJaWYgKHAtPnZhciA9PSBWQVJfV0lOKQorCSAgICByZXR1cm4gKGNoYXJfdSAqKUdMT0JBTF9XTyhnZXRfdmFycChwKSk7CisJcmV0dXJuIHAtPnZhcjsKKyAgICB9CisgICAgaWYgKChvcHRfZmxhZ3MgJiBPUFRfTE9DQUwpICYmIChpbnQpcC0+aW5kaXIgPj0gUFZfQk9USCkKKyAgICB7CisJc3dpdGNoICgoaW50KXAtPmluZGlyKQorCXsKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJICAgIGNhc2UgT1BUX0JPVEgoUFZfR1ApOiAgIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9ncCk7CisJICAgIGNhc2UgT1BUX0JPVEgoUFZfTVApOiAgIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9tcCk7CisJICAgIGNhc2UgT1BUX0JPVEgoUFZfRUZNKTogIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9lZm0pOworI2VuZGlmCisJICAgIGNhc2UgT1BUX0JPVEgoUFZfRVApOiAgIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9lcCk7CisJICAgIGNhc2UgT1BUX0JPVEgoUFZfS1ApOiAgIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9rcCk7CisJICAgIGNhc2UgT1BUX0JPVEgoUFZfUEFUSCk6IHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9wYXRoKTsKKwkgICAgY2FzZSBPUFRfQk9USChQVl9BUik6ICAgcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2FyKTsKKwkgICAgY2FzZSBPUFRfQk9USChQVl9UQUdTKTogcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX3RhZ3MpOworI2lmZGVmIEZFQVRfRklORF9JRAorCSAgICBjYXNlIE9QVF9CT1RIKFBWX0RFRik6ICByZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfZGVmKTsKKwkgICAgY2FzZSBPUFRfQk9USChQVl9JTkMpOiAgcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2luYyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwkgICAgY2FzZSBPUFRfQk9USChQVl9ESUNUKTogcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2RpY3QpOworCSAgICBjYXNlIE9QVF9CT1RIKFBWX1RTUik6ICByZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfdHNyKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gTlVMTDsgLyogImNhbm5vdCBoYXBwZW4iICovCisgICAgfQorICAgIHJldHVybiBnZXRfdmFycChwKTsKK30KKworLyoKKyAqIEdldCBwb2ludGVyIHRvIG9wdGlvbiB2YXJpYWJsZS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X3ZhcnAocCkKKyAgICBzdHJ1Y3Qgdmltb3B0aW9uCSpwOworeworICAgIC8qIGhpZGRlbiBvcHRpb24sIGFsd2F5cyByZXR1cm4gTlVMTCAqLworICAgIGlmIChwLT52YXIgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIHN3aXRjaCAoKGludClwLT5pbmRpcikKKyAgICB7CisJY2FzZSBQVl9OT05FOglyZXR1cm4gcC0+dmFyOworCisJLyogZ2xvYmFsIG9wdGlvbiB3aXRoIGxvY2FsIHZhbHVlOiB1c2UgbG9jYWwgdmFsdWUgaWYgaXQncyBiZWVuIHNldCAqLworCWNhc2UgT1BUX0JPVEgoUFZfRVApOglyZXR1cm4gKmN1cmJ1Zi0+Yl9wX2VwICE9IE5VTAorCQkJCSAgICA/IChjaGFyX3UgKikmY3VyYnVmLT5iX3BfZXAgOiBwLT52YXI7CisJY2FzZSBPUFRfQk9USChQVl9LUCk6CXJldHVybiAqY3VyYnVmLT5iX3Bfa3AgIT0gTlVMCisJCQkJICAgID8gKGNoYXJfdSAqKSZjdXJidWYtPmJfcF9rcCA6IHAtPnZhcjsKKwljYXNlIE9QVF9CT1RIKFBWX1BBVEgpOglyZXR1cm4gKmN1cmJ1Zi0+Yl9wX3BhdGggIT0gTlVMCisJCQkJICAgID8gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfcGF0aCkgOiBwLT52YXI7CisJY2FzZSBPUFRfQk9USChQVl9BUik6CXJldHVybiBjdXJidWYtPmJfcF9hciA+PSAwCisJCQkJICAgID8gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfYXIpIDogcC0+dmFyOworCWNhc2UgT1BUX0JPVEgoUFZfVEFHUyk6CXJldHVybiAqY3VyYnVmLT5iX3BfdGFncyAhPSBOVUwKKwkJCQkgICAgPyAoY2hhcl91ICopJihjdXJidWYtPmJfcF90YWdzKSA6IHAtPnZhcjsKKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKwljYXNlIE9QVF9CT1RIKFBWX0RFRik6CXJldHVybiAqY3VyYnVmLT5iX3BfZGVmICE9IE5VTAorCQkJCSAgICA/IChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2RlZikgOiBwLT52YXI7CisJY2FzZSBPUFRfQk9USChQVl9JTkMpOglyZXR1cm4gKmN1cmJ1Zi0+Yl9wX2luYyAhPSBOVUwKKwkJCQkgICAgPyAoY2hhcl91ICopJihjdXJidWYtPmJfcF9pbmMpIDogcC0+dmFyOworI2VuZGlmCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJY2FzZSBPUFRfQk9USChQVl9ESUNUKToJcmV0dXJuICpjdXJidWYtPmJfcF9kaWN0ICE9IE5VTAorCQkJCSAgICA/IChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2RpY3QpIDogcC0+dmFyOworCWNhc2UgT1BUX0JPVEgoUFZfVFNSKToJcmV0dXJuICpjdXJidWYtPmJfcF90c3IgIT0gTlVMCisJCQkJICAgID8gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfdHNyKSA6IHAtPnZhcjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwljYXNlIE9QVF9CT1RIKFBWX0dQKToJcmV0dXJuICpjdXJidWYtPmJfcF9ncCAhPSBOVUwKKwkJCQkgICAgPyAoY2hhcl91ICopJihjdXJidWYtPmJfcF9ncCkgOiBwLT52YXI7CisJY2FzZSBPUFRfQk9USChQVl9NUCk6CXJldHVybiAqY3VyYnVmLT5iX3BfbXAgIT0gTlVMCisJCQkJICAgID8gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfbXApIDogcC0+dmFyOworCWNhc2UgT1BUX0JPVEgoUFZfRUZNKToJcmV0dXJuICpjdXJidWYtPmJfcF9lZm0gIT0gTlVMCisJCQkJICAgID8gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfZWZtKSA6IHAtPnZhcjsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BUkFCSUMKKwljYXNlIFBWX0FSQUI6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9hcmFiKTsKKyNlbmRpZgorCWNhc2UgUFZfTElTVDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX2xpc3QpOworI2lmZGVmIEZFQVRfRElGRgorCWNhc2UgUFZfRElGRjoJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX2RpZmYpOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJY2FzZSBQVl9GREM6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9mZGMpOworCWNhc2UgUFZfRkVOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3Vyd2luLT53X3BfZmVuKTsKKwljYXNlIFBWX0ZESToJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX2ZkaSk7CisJY2FzZSBQVl9GREw6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9mZGwpOworCWNhc2UgUFZfRkRNOglyZXR1cm4gKGNoYXJfdSAqKSYoY3Vyd2luLT53X3BfZmRtKTsKKwljYXNlIFBWX0ZNTDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX2ZtbCk7CisJY2FzZSBQVl9GRE46CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9mZG4pOworIyBpZmRlZiBGRUFUX0VWQUwKKwljYXNlIFBWX0ZERToJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX2ZkZSk7CisJY2FzZSBQVl9GRFQ6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9mZHQpOworIyBlbmRpZgorCWNhc2UgUFZfRk1SOglyZXR1cm4gKGNoYXJfdSAqKSYoY3Vyd2luLT53X3BfZm1yKTsKKyNlbmRpZgorCWNhc2UgUFZfTlU6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9udSk7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisJY2FzZSBQVl9XRkg6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF93ZmgpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKwljYXNlIFBWX1BWVzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX3B2dyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCWNhc2UgUFZfUkw6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9ybCk7CisJY2FzZSBQVl9STEM6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9ybGMpOworI2VuZGlmCisJY2FzZSBQVl9TQ1JPTEw6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9zY3IpOworCWNhc2UgUFZfV1JBUDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cndpbi0+d19wX3dyYXApOworI2lmZGVmIEZFQVRfTElORUJSRUFLCisJY2FzZSBQVl9MQlI6CXJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9sYnIpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJY2FzZSBQVl9TQ0JJTkQ6IHJldHVybiAoY2hhcl91ICopJihjdXJ3aW4tPndfcF9zY2IpOworI2VuZGlmCisKKwljYXNlIFBWX0FJOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfYWkpOworCWNhc2UgUFZfQklOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfYmluKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJY2FzZSBQVl9CT01COglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfYm9tYik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJY2FzZSBQVl9CSDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2JoKTsKKwljYXNlIFBWX0JUOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfYnQpOworI2VuZGlmCisJY2FzZSBQVl9CTDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2JsKTsKKwljYXNlIFBWX0NJOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfY2kpOworI2lmZGVmIEZFQVRfQ0lOREVOVAorCWNhc2UgUFZfQ0lOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfY2luKTsKKwljYXNlIFBWX0NJTks6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9jaW5rKTsKKwljYXNlIFBWX0NJTk86CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9jaW5vKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9TTUFSVElOREVOVCkgfHwgZGVmaW5lZChGRUFUX0NJTkRFTlQpCisJY2FzZSBQVl9DSU5XOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfY2ludyk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJY2FzZSBQVl9DT006CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9jb20pOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisJY2FzZSBQVl9DTVM6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9jbXMpOworI2VuZGlmCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJY2FzZSBQVl9DUFQ6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9jcHQpOworI2VuZGlmCisJY2FzZSBQVl9FT0w6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9lb2wpOworCWNhc2UgUFZfRVQ6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9ldCk7CisjaWZkZWYgRkVBVF9NQllURQorCWNhc2UgUFZfRkVOQzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2ZlbmMpOworI2VuZGlmCisJY2FzZSBQVl9GRjoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2ZmKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwljYXNlIFBWX0ZUOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfZnQpOworI2VuZGlmCisJY2FzZSBQVl9GTzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2ZvKTsKKwljYXNlIFBWX0lNSToJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2ltaW5zZXJ0KTsKKwljYXNlIFBWX0lNUzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2ltc2VhcmNoKTsKKwljYXNlIFBWX0lORjoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2luZik7CisJY2FzZSBQVl9JU0s6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9pc2spOworI2lmZGVmIEZFQVRfRklORF9JRAorIyBpZmRlZiBGRUFUX0VWQUwKKwljYXNlIFBWX0lORVg6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9pbmV4KTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKKwljYXNlIFBWX0lOREU6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9pbmRlKTsKKwljYXNlIFBWX0lOREs6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9pbmRrKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ1JZUFQKKwljYXNlIFBWX0tFWToJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2tleSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJU1AKKwljYXNlIFBWX0xJU1A6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9saXNwKTsKKyNlbmRpZgorCWNhc2UgUFZfTUw6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9tbCk7CisJY2FzZSBQVl9NUFM6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9tcHMpOworCWNhc2UgUFZfTUE6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9tYSk7CisJY2FzZSBQVl9NT0Q6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfY2hhbmdlZCk7CisJY2FzZSBQVl9ORjoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX25mKTsKKyNpZmRlZiBGRUFUX09TRklMRVRZUEUKKwljYXNlIFBWX09GVDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX29mdCk7CisjZW5kaWYKKwljYXNlIFBWX1BJOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfcGkpOworCWNhc2UgUFZfUk86CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9ybyk7CisjaWZkZWYgRkVBVF9TTUFSVElOREVOVAorCWNhc2UgUFZfU0k6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zaSk7CisjZW5kaWYKKyNpZm5kZWYgU0hPUlRfRk5BTUUKKwljYXNlIFBWX1NOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc24pOworI2VuZGlmCisJY2FzZSBQVl9TVFM6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zdHMpOworI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorCWNhc2UgUFZfU1VBOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc3VhKTsKKyNlbmRpZgorCWNhc2UgUFZfU1dGOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc3dmKTsKKyNpZmRlZiBGRUFUX1NZTl9ITAorCWNhc2UgUFZfU1lOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc3luKTsKKyNlbmRpZgorCWNhc2UgUFZfU1c6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zdyk7CisJY2FzZSBQVl9UUzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX3RzKTsKKwljYXNlIFBWX1RXOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3BfdHcpOworCWNhc2UgUFZfVFg6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF90eCk7CisJY2FzZSBQVl9XTToJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX3dtKTsKKyNpZmRlZiBGRUFUX0tFWU1BUAorCWNhc2UgUFZfS01BUDoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX2tleW1hcCk7CisjZW5kaWYKKwlkZWZhdWx0OglFTVNHKF8oIkUzNTY6IGdldF92YXJwIEVSUk9SIikpOworICAgIH0KKyAgICAvKiBhbHdheXMgcmV0dXJuIGEgdmFsaWQgcG9pbnRlciB0byBhdm9pZCBhIGNyYXNoISAqLworICAgIHJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF93bSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIG9mICdlcXVhbHByZycsIGVpdGhlciB0aGUgYnVmZmVyLWxvY2FsIG9uZSBvciB0aGUgZ2xvYmFsIG9uZS4KKyAqLworICAgIGNoYXJfdSAqCitnZXRfZXF1YWxwcmcoKQoreworICAgIGlmICgqY3VyYnVmLT5iX3BfZXAgPT0gTlVMKQorCXJldHVybiBwX2VwOworICAgIHJldHVybiBjdXJidWYtPmJfcF9lcDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENvcHkgb3B0aW9ucyBmcm9tIG9uZSB3aW5kb3cgdG8gYW5vdGhlci4KKyAqIFVzZWQgd2hlbiBzcGxpdHRpbmcgYSB3aW5kb3cuCisgKi8KKyAgICB2b2lkCit3aW5fY29weV9vcHRpb25zKHdwX2Zyb20sIHdwX3RvKQorICAgIHdpbl9UCSp3cF9mcm9tOworICAgIHdpbl9UCSp3cF90bzsKK3sKKyAgICBjb3B5X3dpbm9wdCgmd3BfZnJvbS0+d19vbmVidWZfb3B0LCAmd3BfdG8tPndfb25lYnVmX29wdCk7CisgICAgY29weV93aW5vcHQoJndwX2Zyb20tPndfYWxsYnVmX29wdCwgJndwX3RvLT53X2FsbGJ1Zl9vcHQpOworIyBpZmRlZiBGRUFUX1JJR0hUTEVGVAorIyAgaWZkZWYgRkVBVF9GS01BUAorICAgIC8qIElzIHRoaXMgcmlnaHQ/ICovCisgICAgd3BfdG8tPndfZmFyc2kgPSB3cF9mcm9tLT53X2ZhcnNpOworIyAgZW5kaWYKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogQ29weSB0aGUgb3B0aW9ucyBmcm9tIG9uZSB3aW5vcHRfVCB0byBhbm90aGVyLgorICogRG9lc24ndCBmcmVlIHRoZSBvbGQgb3B0aW9uIHZhbHVlcyBpbiAidG8iLCB1c2UgY2xlYXJfd2lub3B0KCkgZm9yIHRoYXQuCisgKiBUaGUgJ3Njcm9sbCcgb3B0aW9uIGlzIG5vdCBjb3BpZWQsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgd2luZG93IGhlaWdodC4KKyAqIFRoZSAncHJldmlld3dpbmRvdycgb3B0aW9uIGlzIHJlc2V0LCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcHJldmlldyB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitjb3B5X3dpbm9wdChmcm9tLCB0bykKKyAgICB3aW5vcHRfVAkqZnJvbTsKKyAgICB3aW5vcHRfVAkqdG87Cit7CisjaWZkZWYgRkVBVF9BUkFCSUMKKyAgICB0by0+d29fYXJhYiA9IGZyb20tPndvX2FyYWI7CisjZW5kaWYKKyAgICB0by0+d29fbGlzdCA9IGZyb20tPndvX2xpc3Q7CisgICAgdG8tPndvX251ID0gZnJvbS0+d29fbnU7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICB0by0+d29fcmwgID0gZnJvbS0+d29fcmw7CisgICAgdG8tPndvX3JsYyA9IHZpbV9zdHJzYXZlKGZyb20tPndvX3JsYyk7CisjZW5kaWYKKyAgICB0by0+d29fd3JhcCA9IGZyb20tPndvX3dyYXA7CisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICB0by0+d29fbGJyID0gZnJvbS0+d29fbGJyOworI2VuZGlmCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisgICAgdG8tPndvX3NjYiA9IGZyb20tPndvX3NjYjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorICAgIHRvLT53b19kaWZmID0gZnJvbS0+d29fZGlmZjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworICAgIHRvLT53b19mZGMgPSBmcm9tLT53b19mZGM7CisgICAgdG8tPndvX2ZlbiA9IGZyb20tPndvX2ZlbjsKKyAgICB0by0+d29fZmRpID0gdmltX3N0cnNhdmUoZnJvbS0+d29fZmRpKTsKKyAgICB0by0+d29fZm1sID0gZnJvbS0+d29fZm1sOworICAgIHRvLT53b19mZGwgPSBmcm9tLT53b19mZGw7CisgICAgdG8tPndvX2ZkbSA9IHZpbV9zdHJzYXZlKGZyb20tPndvX2ZkbSk7CisgICAgdG8tPndvX2ZkbiA9IGZyb20tPndvX2ZkbjsKKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgdG8tPndvX2ZkZSA9IHZpbV9zdHJzYXZlKGZyb20tPndvX2ZkZSk7CisgICAgdG8tPndvX2ZkdCA9IHZpbV9zdHJzYXZlKGZyb20tPndvX2ZkdCk7CisjIGVuZGlmCisgICAgdG8tPndvX2ZtciA9IHZpbV9zdHJzYXZlKGZyb20tPndvX2Ztcik7CisjZW5kaWYKKyAgICBjaGVja193aW5vcHQodG8pOwkJLyogZG9uJ3Qgd2FudCBOVUxMIHBvaW50ZXJzICovCit9CisKKy8qCisgKiBDaGVjayBzdHJpbmcgb3B0aW9ucyBpbiBhIHdpbmRvdyBmb3IgYSBOVUxMIHZhbHVlLgorICovCisgICAgdm9pZAorY2hlY2tfd2luX29wdGlvbnMod2luKQorICAgIHdpbl9UCSp3aW47Cit7CisgICAgY2hlY2tfd2lub3B0KCZ3aW4tPndfb25lYnVmX29wdCk7CisgICAgY2hlY2tfd2lub3B0KCZ3aW4tPndfYWxsYnVmX29wdCk7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyBpbiBhIHdpbm9wdF9UIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBlbXB0eV9vcHRpb24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2NoZWNrX3dpbm9wdCh3b3ApCisgICAgd2lub3B0X1QJKndvcDsKK3sKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZ3b3AtPndvX2ZkaSk7CisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmd29wLT53b19mZG0pOworIyBpZmRlZiBGRUFUX0VWQUwKKyAgICBjaGVja19zdHJpbmdfb3B0aW9uKCZ3b3AtPndvX2ZkZSk7CisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmd29wLT53b19mZHQpOworIyBlbmRpZgorICAgIGNoZWNrX3N0cmluZ19vcHRpb24oJndvcC0+d29fZm1yKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgY2hlY2tfc3RyaW5nX29wdGlvbigmd29wLT53b19ybGMpOworI2VuZGlmCit9CisKKy8qCisgKiBGcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluc2lkZSBhIHdpbm9wdF9ULgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitjbGVhcl93aW5vcHQod29wKQorICAgIHdpbm9wdF9UCSp3b3A7Cit7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmd29wLT53b19mZGkpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJndvcC0+d29fZmRtKTsKKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmd29wLT53b19mZGUpOworICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJndvcC0+d29fZmR0KTsKKyMgZW5kaWYKKyAgICBjbGVhcl9zdHJpbmdfb3B0aW9uKCZ3b3AtPndvX2Ztcik7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGNsZWFyX3N0cmluZ19vcHRpb24oJndvcC0+d29fcmxjKTsKKyNlbmRpZgorfQorCisvKgorICogQ29weSBnbG9iYWwgb3B0aW9uIHZhbHVlcyB0byBsb2NhbCBvcHRpb25zIGZvciBvbmUgYnVmZmVyLgorICogVXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGJ1ZmZlciBhbmQgc29tZXRpbWVzIHdoZW4gZW50ZXJpbmcgYSBidWZmZXIuCisgKiBmbGFnczoKKyAqIEJDT19FTlRFUglXZSB3aWxsIGVudGVyIHRoZSBidWYgYnVmZmVyLgorICogQkNPX0FMV0FZUwlBbHdheXMgY29weSB0aGUgb3B0aW9ucywgYnV0IG9ubHkgc2V0IGJfcF9pbml0aWFsaXplZCB3aGVuCisgKgkJYXBwcm9wcmlhdGUuCisgKiBCQ09fTk9IRUxQCURvbid0IGNvcHkgdGhlIHZhbHVlcyB0byBhIGhlbHAgYnVmZmVyLgorICovCisgICAgdm9pZAorYnVmX2NvcHlfb3B0aW9ucyhidWYsIGZsYWdzKQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlmbGFnczsKK3sKKyAgICBpbnQJCXNob3VsZF9jb3B5ID0gVFJVRTsKKyAgICBjaGFyX3UJKnNhdmVfcF9pc2sgPSBOVUxMOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisgICAgaW50CQlkb250X2RvX2hlbHA7CisgICAgaW50CQlkaWRfaXNrID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIERvbid0IGRvIGFueXRoaW5nIG9mIHRoZSBidWZmZXIgaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBpZiAoYnVmID09IE5VTEwgfHwgIWJ1Zl92YWxpZChidWYpKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogU2tpcCB0aGlzIHdoZW4gdGhlIG9wdGlvbiBkZWZhdWx0cyBoYXZlIG5vdCBiZWVuIHNldCB5ZXQuICBIYXBwZW5zIHdoZW4KKyAgICAgKiBtYWluKCkgYWxsb2NhdGVzIHRoZSBmaXJzdCBidWZmZXIuCisgICAgICovCisgICAgaWYgKHBfY3BvICE9IE5VTEwpCisgICAgeworCS8qCisJICogQWx3YXlzIGNvcHkgd2hlbiBlbnRlcmluZyBhbmQgJ2NwbycgY29udGFpbnMgJ1MnLgorCSAqIERvbid0IGNvcHkgd2hlbiBhbHJlYWR5IGluaXRpYWxpemVkLgorCSAqIERvbid0IGNvcHkgd2hlbiAnY3BvJyBjb250YWlucyAncycgYW5kIG5vdCBlbnRlcmluZy4KKwkgKiAnUycJQkNPX0VOVEVSICBpbml0aWFsaXplZAkncycgIHNob3VsZF9jb3B5CisJICogeWVzCSAgeWVzCSAgICAgICBYCSBYCVRSVUUKKwkgKiB5ZXMJICBubwkgICAgICB5ZXMJIFgJRkFMU0UKKwkgKiBubwkgICBYCSAgICAgIHllcwkgWAlGQUxTRQorCSAqICBYCSAgbm8JICAgICAgbm8JeWVzCUZBTFNFCisJICogIFgJICBubwkgICAgICBubwlubwlUUlVFCisJICogbm8JICB5ZXMJICAgICAgbm8JIFgJVFJVRQorCSAqLworCWlmICgodmltX3N0cmNocihwX2NwbywgQ1BPX0JVRk9QVEdMT0IpID09IE5VTEwgfHwgIShmbGFncyAmIEJDT19FTlRFUikpCisJCSYmIChidWYtPmJfcF9pbml0aWFsaXplZAorCQkgICAgfHwgKCEoZmxhZ3MgJiBCQ09fRU5URVIpCisJCQkmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlVGT1BUKSAhPSBOVUxMKSkpCisJICAgIHNob3VsZF9jb3B5ID0gRkFMU0U7CisKKwlpZiAoc2hvdWxkX2NvcHkgfHwgKGZsYWdzICYgQkNPX0FMV0FZUykpCisJeworCSAgICAvKiBEb24ndCBjb3B5IHRoZSBvcHRpb25zIHNwZWNpZmljIHRvIGEgaGVscCBidWZmZXIgd2hlbgorCSAgICAgKiBCQ09fTk9IRUxQIGlzIGdpdmVuIG9yIHRoZSBvcHRpb25zIHdlcmUgaW5pdGlhbGl6ZWQgYWxyZWFkeQorCSAgICAgKiAoanVtcGluZyBiYWNrIHRvIGEgaGVscCBmaWxlIHdpdGggQ1RSTC1UIG9yIENUUkwtTykgKi8KKwkgICAgZG9udF9kb19oZWxwID0gKChmbGFncyAmIEJDT19OT0hFTFApICYmIGJ1Zi0+Yl9oZWxwKQorCQkJCQkJICAgICAgIHx8IGJ1Zi0+Yl9wX2luaXRpYWxpemVkOworCSAgICBpZiAoZG9udF9kb19oZWxwKQkJLyogZG9uJ3QgZnJlZSBiX3BfaXNrICovCisJICAgIHsKKwkJc2F2ZV9wX2lzayA9IGJ1Zi0+Yl9wX2lzazsKKwkJYnVmLT5iX3BfaXNrID0gTlVMTDsKKwkgICAgfQorCSAgICAvKgorCSAgICAgKiBBbHdheXMgZnJlZSB0aGUgYWxsb2NhdGVkIHN0cmluZ3MuCisJICAgICAqIElmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkLCBzZXQgJ3JlYWRvbmx5JyBhbmQgY29weSAnZmlsZWZvcm1hdCcuCisJICAgICAqLworCSAgICBpZiAoIWJ1Zi0+Yl9wX2luaXRpYWxpemVkKQorCSAgICB7CisJCWZyZWVfYnVmX29wdGlvbnMoYnVmLCBUUlVFKTsKKwkJYnVmLT5iX3Bfcm8gPSBGQUxTRTsJCS8qIGRvbid0IGNvcHkgcmVhZG9ubHkgKi8KKwkJYnVmLT5iX3BfdHggPSBwX3R4OworI2lmZGVmIEZFQVRfTUJZVEUKKwkJYnVmLT5iX3BfZmVuYyA9IHZpbV9zdHJzYXZlKHBfZmVuYyk7CisjZW5kaWYKKwkJYnVmLT5iX3BfZmYgPSB2aW1fc3Ryc2F2ZShwX2ZmKTsKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCWJ1Zi0+Yl9wX2JoID0gZW1wdHlfb3B0aW9uOworCQlidWYtPmJfcF9idCA9IGVtcHR5X29wdGlvbjsKKyNlbmRpZgorCSAgICB9CisJICAgIGVsc2UKKwkJZnJlZV9idWZfb3B0aW9ucyhidWYsIEZBTFNFKTsKKworCSAgICBidWYtPmJfcF9haSA9IHBfYWk7CisJICAgIGJ1Zi0+Yl9wX2FpX25vcGFzdGUgPSBwX2FpX25vcGFzdGU7CisJICAgIGJ1Zi0+Yl9wX3N3ID0gcF9zdzsKKwkgICAgYnVmLT5iX3BfdHcgPSBwX3R3OworCSAgICBidWYtPmJfcF90d19ub3Bhc3RlID0gcF90d19ub3Bhc3RlOworCSAgICBidWYtPmJfcF90d19ub2JpbiA9IHBfdHdfbm9iaW47CisJICAgIGJ1Zi0+Yl9wX3dtID0gcF93bTsKKwkgICAgYnVmLT5iX3Bfd21fbm9wYXN0ZSA9IHBfd21fbm9wYXN0ZTsKKwkgICAgYnVmLT5iX3Bfd21fbm9iaW4gPSBwX3dtX25vYmluOworCSAgICBidWYtPmJfcF9iaW4gPSBwX2JpbjsKKwkgICAgYnVmLT5iX3BfZXQgPSBwX2V0OworCSAgICBidWYtPmJfcF9ldF9ub2JpbiA9IHBfZXRfbm9iaW47CisJICAgIGJ1Zi0+Yl9wX21sID0gcF9tbDsKKwkgICAgYnVmLT5iX3BfbWxfbm9iaW4gPSBwX21sX25vYmluOworCSAgICBidWYtPmJfcF9pbmYgPSBwX2luZjsKKwkgICAgYnVmLT5iX3Bfc3dmID0gcF9zd2Y7CisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIGJ1Zi0+Yl9wX2NwdCA9IHZpbV9zdHJzYXZlKHBfY3B0KTsKKyNlbmRpZgorCSAgICBidWYtPmJfcF9zdHMgPSBwX3N0czsKKwkgICAgYnVmLT5iX3Bfc3RzX25vcGFzdGUgPSBwX3N0c19ub3Bhc3RlOworI2lmbmRlZiBTSE9SVF9GTkFNRQorCSAgICBidWYtPmJfcF9zbiA9IHBfc247CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NPTU1FTlRTCisJICAgIGJ1Zi0+Yl9wX2NvbSA9IHZpbV9zdHJzYXZlKHBfY29tKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBidWYtPmJfcF9jbXMgPSB2aW1fc3Ryc2F2ZShwX2Ntcyk7CisjZW5kaWYKKwkgICAgYnVmLT5iX3BfZm8gPSB2aW1fc3Ryc2F2ZShwX2ZvKTsKKwkgICAgYnVmLT5iX3BfbmYgPSB2aW1fc3Ryc2F2ZShwX25mKTsKKwkgICAgYnVmLT5iX3BfbXBzID0gdmltX3N0cnNhdmUocF9tcHMpOworI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkgICAgYnVmLT5iX3Bfc2kgPSBwX3NpOworI2VuZGlmCisJICAgIGJ1Zi0+Yl9wX2NpID0gcF9jaTsKKyNpZmRlZiBGRUFUX0NJTkRFTlQKKwkgICAgYnVmLT5iX3BfY2luID0gcF9jaW47CisJICAgIGJ1Zi0+Yl9wX2NpbmsgPSB2aW1fc3Ryc2F2ZShwX2NpbmspOworCSAgICBidWYtPmJfcF9jaW5vID0gdmltX3N0cnNhdmUocF9jaW5vKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICAvKiBEb24ndCBjb3B5ICdmaWxldHlwZScsIGl0IG11c3QgYmUgZGV0ZWN0ZWQgKi8KKwkgICAgYnVmLT5iX3BfZnQgPSBlbXB0eV9vcHRpb247CisjZW5kaWYKKyNpZmRlZiBGRUFUX09TRklMRVRZUEUKKwkgICAgYnVmLT5iX3Bfb2Z0ID0gdmltX3N0cnNhdmUocF9vZnQpOworI2VuZGlmCisJICAgIGJ1Zi0+Yl9wX3BpID0gcF9waTsKKyNpZiBkZWZpbmVkKEZFQVRfU01BUlRJTkRFTlQpIHx8IGRlZmluZWQoRkVBVF9DSU5ERU5UKQorCSAgICBidWYtPmJfcF9jaW53ID0gdmltX3N0cnNhdmUocF9jaW53KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElTUAorCSAgICBidWYtPmJfcF9saXNwID0gcF9saXNwOworI2VuZGlmCisjaWZkZWYgRkVBVF9TWU5fSEwKKwkgICAgLyogRG9uJ3QgY29weSAnc3ludGF4JywgaXQgbXVzdCBiZSBzZXQgKi8KKwkgICAgYnVmLT5iX3Bfc3luID0gZW1wdHlfb3B0aW9uOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorCSAgICBidWYtPmJfcF9pbmRlID0gdmltX3N0cnNhdmUocF9pbmRlKTsKKwkgICAgYnVmLT5iX3BfaW5kayA9IHZpbV9zdHJzYXZlKHBfaW5kayk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0NSWVBUCisJICAgIGJ1Zi0+Yl9wX2tleSA9IHZpbV9zdHJzYXZlKHBfa2V5KTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorCSAgICBidWYtPmJfcF9zdWEgPSB2aW1fc3Ryc2F2ZShwX3N1YSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0tFWU1BUAorCSAgICBidWYtPmJfcF9rZXltYXAgPSB2aW1fc3Ryc2F2ZShwX2tleW1hcCk7CisJICAgIGJ1Zi0+Yl9rbWFwX3N0YXRlIHw9IEtFWU1BUF9JTklUOworI2VuZGlmCisJICAgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IGFuIG9wdGlvbiwgYnV0IGNvcHlpbmcgdGhlIGxhbmdtYXAgYW5kIElNRQorCSAgICAgKiBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBiZXR0ZXIgdGhhbiByZXNldHRpbmcgaXQuICovCisJICAgIGJ1Zi0+Yl9wX2ltaW5zZXJ0ID0gcF9pbWluc2VydDsKKwkgICAgYnVmLT5iX3BfaW1zZWFyY2ggPSBwX2ltc2VhcmNoOworCisJICAgIC8qIG9wdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgZ2xvYmFsIGJ1dCBhbHNvIGhhdmUgYSBsb2NhbCB2YWx1ZQorCSAgICAgKiBhcmUgbm90IGNvcGllZCwgc3RhcnQgdXNpbmcgdGhlIGdsb2JhbCB2YWx1ZSAqLworCSAgICBidWYtPmJfcF9hciA9IC0xOworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkgICAgYnVmLT5iX3BfZ3AgPSBlbXB0eV9vcHRpb247CisJICAgIGJ1Zi0+Yl9wX21wID0gZW1wdHlfb3B0aW9uOworCSAgICBidWYtPmJfcF9lZm0gPSBlbXB0eV9vcHRpb247CisjZW5kaWYKKwkgICAgYnVmLT5iX3BfZXAgPSBlbXB0eV9vcHRpb247CisJICAgIGJ1Zi0+Yl9wX2twID0gZW1wdHlfb3B0aW9uOworCSAgICBidWYtPmJfcF9wYXRoID0gZW1wdHlfb3B0aW9uOworCSAgICBidWYtPmJfcF90YWdzID0gZW1wdHlfb3B0aW9uOworI2lmZGVmIEZFQVRfRklORF9JRAorCSAgICBidWYtPmJfcF9kZWYgPSBlbXB0eV9vcHRpb247CisJICAgIGJ1Zi0+Yl9wX2luYyA9IGVtcHR5X29wdGlvbjsKKyMgaWZkZWYgRkVBVF9FVkFMCisJICAgIGJ1Zi0+Yl9wX2luZXggPSB2aW1fc3Ryc2F2ZShwX2luZXgpOworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIGJ1Zi0+Yl9wX2RpY3QgPSBlbXB0eV9vcHRpb247CisJICAgIGJ1Zi0+Yl9wX3RzciA9IGVtcHR5X29wdGlvbjsKKyNlbmRpZgorCisJICAgIC8qCisJICAgICAqIERvbid0IGNvcHkgdGhlIG9wdGlvbnMgc2V0IGJ5IGV4X2hlbHAoKSwgdXNlIHRoZSBzYXZlZCB2YWx1ZXMsCisJICAgICAqIHdoZW4gZ29pbmcgZnJvbSBhIGhlbHAgYnVmZmVyIHRvIGEgbm9uLWhlbHAgYnVmZmVyLgorCSAgICAgKiBEb24ndCB0b3VjaCB0aGVzZSBhdCBhbGwgd2hlbiBCQ09fTk9IRUxQIGlzIHVzZWQgYW5kIGdvaW5nIGZyb20KKwkgICAgICogb3IgdG8gYSBoZWxwIGJ1ZmZlci4KKwkgICAgICovCisJICAgIGlmIChkb250X2RvX2hlbHApCisJCWJ1Zi0+Yl9wX2lzayA9IHNhdmVfcF9pc2s7CisJICAgIGVsc2UKKwkgICAgeworCQlidWYtPmJfcF9pc2sgPSB2aW1fc3Ryc2F2ZShwX2lzayk7CisJCWRpZF9pc2sgPSBUUlVFOworCQlidWYtPmJfcF90cyA9IHBfdHM7CisJCWJ1Zi0+Yl9oZWxwID0gRkFMU0U7CisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCQlpZiAoYnVmLT5iX3BfYnRbMF0gPT0gJ2gnKQorCQkgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYnQpOworI2VuZGlmCisJCWJ1Zi0+Yl9wX21hID0gcF9tYTsKKwkgICAgfQorCX0KKworCS8qCisJICogV2hlbiB0aGUgb3B0aW9ucyBzaG91bGQgYmUgY29waWVkIChpZ25vcmluZyBCQ09fQUxXQVlTKSwgc2V0IHRoZQorCSAqIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisJICovCisJaWYgKHNob3VsZF9jb3B5KQorCSAgICBidWYtPmJfcF9pbml0aWFsaXplZCA9IFRSVUU7CisgICAgfQorCisgICAgY2hlY2tfYnVmX29wdGlvbnMoYnVmKTsJICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIE5VTExzICovCisgICAgaWYgKGRpZF9pc2spCisJKHZvaWQpYnVmX2luaXRfY2hhcnRhYihidWYsIEZBTFNFKTsKK30KKworLyoKKyAqIFJlc2V0IHRoZSAnbW9kaWZpYWJsZScgb3B0aW9uIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAqLworICAgIHZvaWQKK3Jlc2V0X21vZGlmaWFibGUoKQoreworICAgIGludAkJb3B0X2lkeDsKKworICAgIGN1cmJ1Zi0+Yl9wX21hID0gRkFMU0U7CisgICAgcF9tYSA9IEZBTFNFOworICAgIG9wdF9pZHggPSBmaW5kb3B0aW9uKChjaGFyX3UgKikibWEiKTsKKyAgICBvcHRpb25zW29wdF9pZHhdLmRlZl92YWxbVklfREVGQVVMVF0gPSBGQUxTRTsKK30KKworLyoKKyAqIFNldCB0aGUgZ2xvYmFsIHZhbHVlIGZvciAnaW1pbnNlcnQnIHRvIHRoZSBsb2NhbCB2YWx1ZS4KKyAqLworICAgIHZvaWQKK3NldF9pbWluc2VydF9nbG9iYWwoKQoreworICAgIHBfaW1pbnNlcnQgPSBjdXJidWYtPmJfcF9pbWluc2VydDsKK30KKworLyoKKyAqIFNldCB0aGUgZ2xvYmFsIHZhbHVlIGZvciAnaW1zZWFyY2gnIHRvIHRoZSBsb2NhbCB2YWx1ZS4KKyAqLworICAgIHZvaWQKK3NldF9pbXNlYXJjaF9nbG9iYWwoKQoreworICAgIHBfaW1zZWFyY2ggPSBjdXJidWYtPmJfcF9pbXNlYXJjaDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludCBleHBhbmRfb3B0aW9uX2lkeCA9IC0xOworc3RhdGljIGNoYXJfdSBleHBhbmRfb3B0aW9uX25hbWVbNV0gPSB7J3QnLCAnXycsIE5VTCwgTlVMLCBOVUx9Oworc3RhdGljIGludCBleHBhbmRfb3B0aW9uX2ZsYWdzID0gMDsKKworICAgIHZvaWQKK3NldF9jb250ZXh0X2luX3NldF9jbWQoeHAsIGFyZywgb3B0X2ZsYWdzKQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBjaGFyX3UJKmFyZzsKKyAgICBpbnQJCW9wdF9mbGFnczsJLyogT1BUX0dMT0JBTCBhbmQvb3IgT1BUX0xPQ0FMICovCit7CisgICAgaW50CQluZXh0Y2hhcjsKKyAgICBsb25nX3UJZmxhZ3MgPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCW9wdF9pZHggPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpzOworICAgIGludAkJaXNfdGVybV9vcHRpb24gPSBGQUxTRTsKKyAgICBpbnQJCWtleTsKKworICAgIGV4cGFuZF9vcHRpb25fZmxhZ3MgPSBvcHRfZmxhZ3M7CisKKyAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9TRVRUSU5HUzsKKyAgICBpZiAoKmFyZyA9PSBOVUwpCisgICAgeworCXhwLT54cF9wYXR0ZXJuID0gYXJnOworCXJldHVybjsKKyAgICB9CisgICAgcCA9IGFyZyArIFNUUkxFTihhcmcpIC0gMTsKKyAgICBpZiAoKnAgPT0gJyAnICYmICoocCAtIDEpICE9ICdcXCcpCisgICAgeworCXhwLT54cF9wYXR0ZXJuID0gcCArIDE7CisJcmV0dXJuOworICAgIH0KKyAgICB3aGlsZSAocCA+IGFyZykKKyAgICB7CisJcyA9IHA7CisJLyogY291bnQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGJlZm9yZSAnICcgb3IgJywnICovCisJaWYgKCpwID09ICcgJyB8fCAqcCA9PSAnLCcpCisJeworCSAgICB3aGlsZSAocyA+IGFyZyAmJiAqKHMgLSAxKSA9PSAnXFwnKQorCQktLXM7CisJfQorCS8qIGJyZWFrIGF0IGEgc3BhY2Ugd2l0aCBhbiBldmVuIG51bWJlciBvZiBiYWNrc2xhc2hlcyAqLworCWlmICgqcCA9PSAnICcgJiYgKChwIC0gcykgJiAxKSA9PSAwKQorCXsKKwkgICAgKytwOworCSAgICBicmVhazsKKwl9CisJLS1wOworICAgIH0KKyAgICBpZiAoU1RSTkNNUChwLCAibm8iLCAyKSA9PSAwKQorICAgIHsKKwl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9CT09MX1NFVFRJTkdTOworCXAgKz0gMjsKKyAgICB9CisgICAgaWYgKFNUUk5DTVAocCwgImludiIsIDMpID09IDApCisgICAgeworCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0JPT0xfU0VUVElOR1M7CisJcCArPSAzOworICAgIH0KKyAgICB4cC0+eHBfcGF0dGVybiA9IGFyZyA9IHA7CisgICAgaWYgKCphcmcgPT0gJzwnKQorICAgIHsKKwl3aGlsZSAoKnAgIT0gJz4nKQorCSAgICBpZiAoKnArKyA9PSBOVUwpCSAgICAvKiBleHBhbmQgdGVybWluYWwgb3B0aW9uIG5hbWUgKi8KKwkJcmV0dXJuOworCWtleSA9IGdldF9zcGVjaWFsX2tleV9jb2RlKGFyZyArIDEpOworCWlmIChrZXkgPT0gMCkJCSAgICAvKiB1bmtub3duIG5hbWUgKi8KKwl7CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX05PVEhJTkc7CisJICAgIHJldHVybjsKKwl9CisJbmV4dGNoYXIgPSAqKytwOworCWlzX3Rlcm1fb3B0aW9uID0gVFJVRTsKKwlleHBhbmRfb3B0aW9uX25hbWVbMl0gPSBLRVkyVEVSTUNBUDAoa2V5KTsKKwlleHBhbmRfb3B0aW9uX25hbWVbM10gPSBLRVkyVEVSTUNBUDEoa2V5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAocFswXSA9PSAndCcgJiYgcFsxXSA9PSAnXycpCisJeworCSAgICBwICs9IDI7CisJICAgIGlmICgqcCAhPSBOVUwpCisJCSsrcDsKKwkgICAgaWYgKCpwID09IE5VTCkKKwkJcmV0dXJuOwkJLyogZXhwYW5kIG9wdGlvbiBuYW1lICovCisJICAgIG5leHRjaGFyID0gKisrcDsKKwkgICAgaXNfdGVybV9vcHRpb24gPSBUUlVFOworCSAgICBleHBhbmRfb3B0aW9uX25hbWVbMl0gPSBwWy0yXTsKKwkgICAgZXhwYW5kX29wdGlvbl9uYW1lWzNdID0gcFstMV07CisJfQorCWVsc2UKKwl7CisJCS8qIEFsbG93ICogd2lsZGNhcmQgKi8KKwkgICAgd2hpbGUgKEFTQ0lJX0lTQUxOVU0oKnApIHx8ICpwID09ICdfJyB8fCAqcCA9PSAnKicpCisJCXArKzsKKwkgICAgaWYgKCpwID09IE5VTCkKKwkJcmV0dXJuOworCSAgICBuZXh0Y2hhciA9ICpwOworCSAgICAqcCA9IE5VTDsKKwkgICAgb3B0X2lkeCA9IGZpbmRvcHRpb24oYXJnKTsKKwkgICAgKnAgPSBuZXh0Y2hhcjsKKwkgICAgaWYgKG9wdF9pZHggPT0gLTEgfHwgb3B0aW9uc1tvcHRfaWR4XS52YXIgPT0gTlVMTCkKKwkgICAgeworCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgZmxhZ3MgPSBvcHRpb25zW29wdF9pZHhdLmZsYWdzOworCSAgICBpZiAoZmxhZ3MgJiBQX0JPT0wpCisJICAgIHsKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfTk9USElORzsKKwkJcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKyAgICAvKiBoYW5kbGUgIi09IiBhbmQgIis9IiAqLworICAgIGlmICgobmV4dGNoYXIgPT0gJy0nIHx8IG5leHRjaGFyID09ICcrJyB8fCBuZXh0Y2hhciA9PSAnXicpICYmIHBbMV0gPT0gJz0nKQorICAgIHsKKwkrK3A7CisJbmV4dGNoYXIgPSAnPSc7CisgICAgfQorICAgIGlmICgobmV4dGNoYXIgIT0gJz0nICYmIG5leHRjaGFyICE9ICc6JykKKwkJCQkgICAgfHwgeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0JPT0xfU0VUVElOR1MpCisgICAgeworCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX1VOU1VDQ0VTU0ZVTDsKKwlyZXR1cm47CisgICAgfQorICAgIGlmICh4cC0+eHBfY29udGV4dCAhPSBFWFBBTkRfQk9PTF9TRVRUSU5HUyAmJiBwWzFdID09IE5VTCkKKyAgICB7CisJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfT0xEX1NFVFRJTkc7CisJaWYgKGlzX3Rlcm1fb3B0aW9uKQorCSAgICBleHBhbmRfb3B0aW9uX2lkeCA9IC0xOworCWVsc2UKKwkgICAgZXhwYW5kX29wdGlvbl9pZHggPSBvcHRfaWR4OworCXhwLT54cF9wYXR0ZXJuID0gcCArIDE7CisJcmV0dXJuOworICAgIH0KKyAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworICAgIGlmIChpc190ZXJtX29wdGlvbiB8fCAoZmxhZ3MgJiBQX05VTSkpCisJcmV0dXJuOworCisgICAgeHAtPnhwX3BhdHRlcm4gPSBwICsgMTsKKworICAgIGlmIChmbGFncyAmIFBfRVhQQU5EKQorICAgIHsKKwlwID0gb3B0aW9uc1tvcHRfaWR4XS52YXI7CisJaWYgKHAgPT0gKGNoYXJfdSAqKSZwX2JkaXIKKwkJfHwgcCA9PSAoY2hhcl91ICopJnBfZGlyCisJCXx8IHAgPT0gKGNoYXJfdSAqKSZwX3BhdGgKKwkJfHwgcCA9PSAoY2hhcl91ICopJnBfcnRwCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisJCXx8IHAgPT0gKGNoYXJfdSAqKSZwX2NkcGF0aAorI2VuZGlmCisjaWZkZWYgRkVBVF9TRVNTSU9OCisJCXx8IHAgPT0gKGNoYXJfdSAqKSZwX3ZkaXIKKyNlbmRpZgorCQkpCisJeworCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9ESVJFQ1RPUklFUzsKKwkgICAgaWYgKHAgPT0gKGNoYXJfdSAqKSZwX3BhdGgKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKwkJICAgIHx8IHAgPT0gKGNoYXJfdSAqKSZwX2NkcGF0aAorI2VuZGlmCisJCSAgICkKKwkJeHAtPnhwX2JhY2tzbGFzaCA9IFhQX0JTX1RIUkVFOworCSAgICBlbHNlCisJCXhwLT54cF9iYWNrc2xhc2ggPSBYUF9CU19PTkU7CisJfQorCWVsc2UKKwl7CisJICAgIHhwLT54cF9jb250ZXh0ID0gRVhQQU5EX0ZJTEVTOworCSAgICAvKiBmb3IgJ3RhZ3MnIG5lZWQgdGhyZWUgYmFja3NsYXNoZXMgZm9yIGEgc3BhY2UgKi8KKwkgICAgaWYgKHAgPT0gKGNoYXJfdSAqKSZwX3RhZ3MpCisJCXhwLT54cF9iYWNrc2xhc2ggPSBYUF9CU19USFJFRTsKKwkgICAgZWxzZQorCQl4cC0+eHBfYmFja3NsYXNoID0gWFBfQlNfT05FOworCX0KKyAgICB9CisKKyAgICAvKiBGb3IgYW4gb3B0aW9uIHRoYXQgaXMgYSBsaXN0IG9mIGZpbGUgbmFtZXMsIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAqIGxhc3QgZmlsZSBuYW1lLiAqLworICAgIGZvciAocCA9IGFyZyArIFNUUkxFTihhcmcpIC0gMTsgcCA+IHhwLT54cF9wYXR0ZXJuOyAtLXApCisgICAgeworCS8qIGNvdW50IG51bWJlciBvZiBiYWNrc2xhc2hlcyBiZWZvcmUgJyAnIG9yICcsJyAqLworCWlmICgqcCA9PSAnICcgfHwgKnAgPT0gJywnKQorCXsKKwkgICAgcyA9IHA7CisJICAgIHdoaWxlIChzID4geHAtPnhwX3BhdHRlcm4gJiYgKihzIC0gMSkgPT0gJ1xcJykKKwkJLS1zOworCSAgICBpZiAoKCpwID09ICcgJyAmJiAoeHAtPnhwX2JhY2tzbGFzaCA9PSBYUF9CU19USFJFRSAmJiAocCAtIHMpIDwgMykpCisJCSAgICB8fCAoKnAgPT0gJywnICYmIChmbGFncyAmIFBfQ09NTUEpICYmICgocCAtIHMpICYgMSkgPT0gMCkpCisJICAgIHsKKwkJeHAtPnhwX3BhdHRlcm4gPSBwICsgMTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisgICAgaW50CitFeHBhbmRTZXR0aW5ncyh4cCwgcmVnbWF0Y2gsIG51bV9maWxlLCBmaWxlKQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICByZWdtYXRjaF9UCSpyZWdtYXRjaDsKKyAgICBpbnQJCSpudW1fZmlsZTsKKyAgICBjaGFyX3UJKioqZmlsZTsKK3sKKyAgICBpbnQJCW51bV9ub3JtYWwgPSAwOwkgICAgLyogTnIgb2YgbWF0Y2hpbmcgbm9uLXRlcm0tY29kZSBzZXR0aW5ncyAqLworICAgIGludAkJbnVtX3Rlcm0gPSAwOwkgICAgLyogTnIgb2YgbWF0Y2hpbmcgdGVybWluYWwgY29kZSBzZXR0aW5ncyAqLworICAgIGludAkJb3B0X2lkeDsKKyAgICBpbnQJCW1hdGNoOworICAgIGludAkJY291bnQgPSAwOworICAgIGNoYXJfdQkqc3RyOworICAgIGludAkJbG9vcDsKKyAgICBpbnQJCWlzX3Rlcm1fb3B0OworICAgIGNoYXJfdQluYW1lX2J1ZltNQVhfS0VZX05BTUVfTEVOXTsKKyAgICBzdGF0aWMgY2hhciAqKG5hbWVzW10pID0geyJhbGwiLCAidGVybWNhcCJ9OworICAgIGludAkJaWMgPSByZWdtYXRjaC0+cm1faWM7CS8qIHJlbWVtYmVyIHRoZSBpZ25vcmUtY2FzZSBmbGFnICovCisKKyAgICAvKiBkbyB0aGlzIGxvb3AgdHdpY2U6CisgICAgICogbG9vcCA9PSAwOiBjb3VudCB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIG9wdGlvbnMKKyAgICAgKiBsb29wID09IDE6IGNvcHkgdGhlIG1hdGNoaW5nIG9wdGlvbnMgaW50byBhbGxvY2F0ZWQgbWVtb3J5CisgICAgICovCisgICAgZm9yIChsb29wID0gMDsgbG9vcCA8PSAxOyArK2xvb3ApCisgICAgeworCXJlZ21hdGNoLT5ybV9pYyA9IGljOworCWlmICh4cC0+eHBfY29udGV4dCAhPSBFWFBBTkRfQk9PTF9TRVRUSU5HUykKKwl7CisJICAgIGZvciAobWF0Y2ggPSAwOyBtYXRjaCA8IHNpemVvZihuYW1lcykgLyBzaXplb2YoY2hhciAqKTsgKyttYXRjaCkKKwkJaWYgKHZpbV9yZWdleGVjKHJlZ21hdGNoLCAoY2hhcl91ICopbmFtZXNbbWF0Y2hdLCAoY29sbnJfVCkwKSkKKwkJeworCQkgICAgaWYgKGxvb3AgPT0gMCkKKwkJCW51bV9ub3JtYWwrKzsKKwkJICAgIGVsc2UKKwkJCSgqZmlsZSlbY291bnQrK10gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopbmFtZXNbbWF0Y2hdKTsKKwkJfQorCX0KKwlmb3IgKG9wdF9pZHggPSAwOyAoc3RyID0gKGNoYXJfdSAqKW9wdGlvbnNbb3B0X2lkeF0uZnVsbG5hbWUpICE9IE5VTEw7CisJCQkJCQkJCSAgICBvcHRfaWR4KyspCisJeworCSAgICBpZiAob3B0aW9uc1tvcHRfaWR4XS52YXIgPT0gTlVMTCkKKwkJY29udGludWU7CisJICAgIGlmICh4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfQk9PTF9TRVRUSU5HUworCSAgICAgICYmICEob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIFBfQk9PTCkpCisJCWNvbnRpbnVlOworCSAgICBpc190ZXJtX29wdCA9IGlzdGVybW9wdGlvbigmb3B0aW9uc1tvcHRfaWR4XSk7CisJICAgIGlmIChpc190ZXJtX29wdCAmJiBudW1fbm9ybWFsID4gMCkKKwkJY29udGludWU7CisJICAgIG1hdGNoID0gRkFMU0U7CisJICAgIGlmICh2aW1fcmVnZXhlYyhyZWdtYXRjaCwgc3RyLCAoY29sbnJfVCkwKQorCQkgICAgfHwgKG9wdGlvbnNbb3B0X2lkeF0uc2hvcnRuYW1lICE9IE5VTEwKKwkJCSYmIHZpbV9yZWdleGVjKHJlZ21hdGNoLAorCQkJICAgKGNoYXJfdSAqKW9wdGlvbnNbb3B0X2lkeF0uc2hvcnRuYW1lLCAoY29sbnJfVCkwKSkpCisJCW1hdGNoID0gVFJVRTsKKwkgICAgZWxzZSBpZiAoaXNfdGVybV9vcHQpCisJICAgIHsKKwkJbmFtZV9idWZbMF0gPSAnPCc7CisJCW5hbWVfYnVmWzFdID0gJ3QnOworCQluYW1lX2J1ZlsyXSA9ICdfJzsKKwkJbmFtZV9idWZbM10gPSBzdHJbMl07CisJCW5hbWVfYnVmWzRdID0gc3RyWzNdOworCQluYW1lX2J1Zls1XSA9ICc+JzsKKwkJbmFtZV9idWZbNl0gPSBOVUw7CisJCWlmICh2aW1fcmVnZXhlYyhyZWdtYXRjaCwgbmFtZV9idWYsIChjb2xucl9UKTApKQorCQl7CisJCSAgICBtYXRjaCA9IFRSVUU7CisJCSAgICBzdHIgPSBuYW1lX2J1ZjsKKwkJfQorCSAgICB9CisJICAgIGlmIChtYXRjaCkKKwkgICAgeworCQlpZiAobG9vcCA9PSAwKQorCQl7CisJCSAgICBpZiAoaXNfdGVybV9vcHQpCisJCQludW1fdGVybSsrOworCQkgICAgZWxzZQorCQkJbnVtX25vcm1hbCsrOworCQl9CisJCWVsc2UKKwkJICAgICgqZmlsZSlbY291bnQrK10gPSB2aW1fc3Ryc2F2ZShzdHIpOworCSAgICB9CisJfQorCS8qCisJICogQ2hlY2sgdGVybWluYWwga2V5IGNvZGVzLCB0aGVzZSBhcmUgbm90IGluIHRoZSBvcHRpb24gdGFibGUKKwkgKi8KKwlpZiAoeHAtPnhwX2NvbnRleHQgIT0gRVhQQU5EX0JPT0xfU0VUVElOR1MgICYmIG51bV9ub3JtYWwgPT0gMCkKKwl7CisJICAgIGZvciAob3B0X2lkeCA9IDA7IChzdHIgPSBnZXRfdGVybWNvZGUob3B0X2lkeCkpICE9IE5VTEw7IG9wdF9pZHgrKykKKwkgICAgeworCQlpZiAoIWlzcHJpbnQoc3RyWzBdKSB8fCAhaXNwcmludChzdHJbMV0pKQorCQkgICAgY29udGludWU7CisKKwkJbmFtZV9idWZbMF0gPSAndCc7CisJCW5hbWVfYnVmWzFdID0gJ18nOworCQluYW1lX2J1ZlsyXSA9IHN0clswXTsKKwkJbmFtZV9idWZbM10gPSBzdHJbMV07CisJCW5hbWVfYnVmWzRdID0gTlVMOworCisJCW1hdGNoID0gRkFMU0U7CisJCWlmICh2aW1fcmVnZXhlYyhyZWdtYXRjaCwgbmFtZV9idWYsIChjb2xucl9UKTApKQorCQkgICAgbWF0Y2ggPSBUUlVFOworCQllbHNlCisJCXsKKwkJICAgIG5hbWVfYnVmWzBdID0gJzwnOworCQkgICAgbmFtZV9idWZbMV0gPSAndCc7CisJCSAgICBuYW1lX2J1ZlsyXSA9ICdfJzsKKwkJICAgIG5hbWVfYnVmWzNdID0gc3RyWzBdOworCQkgICAgbmFtZV9idWZbNF0gPSBzdHJbMV07CisJCSAgICBuYW1lX2J1Zls1XSA9ICc+JzsKKwkJICAgIG5hbWVfYnVmWzZdID0gTlVMOworCisJCSAgICBpZiAodmltX3JlZ2V4ZWMocmVnbWF0Y2gsIG5hbWVfYnVmLCAoY29sbnJfVCkwKSkKKwkJCW1hdGNoID0gVFJVRTsKKwkJfQorCQlpZiAobWF0Y2gpCisJCXsKKwkJICAgIGlmIChsb29wID09IDApCisJCQludW1fdGVybSsrOworCQkgICAgZWxzZQorCQkJKCpmaWxlKVtjb3VudCsrXSA9IHZpbV9zdHJzYXZlKG5hbWVfYnVmKTsKKwkJfQorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgc3BlY2lhbCBrZXkgbmFtZXMuCisJICAgICAqLworCSAgICByZWdtYXRjaC0+cm1faWMgPSBUUlVFOwkJLyogaWdub3JlIGNhc2UgaGVyZSAqLworCSAgICBmb3IgKG9wdF9pZHggPSAwOyAoc3RyID0gZ2V0X2tleV9uYW1lKG9wdF9pZHgpKSAhPSBOVUxMOyBvcHRfaWR4KyspCisJICAgIHsKKwkJbmFtZV9idWZbMF0gPSAnPCc7CisJCVNUUkNQWShuYW1lX2J1ZiArIDEsIHN0cik7CisJCVNUUkNBVChuYW1lX2J1ZiwgIj4iKTsKKworCQlpZiAodmltX3JlZ2V4ZWMocmVnbWF0Y2gsIG5hbWVfYnVmLCAoY29sbnJfVCkwKSkKKwkJeworCQkgICAgaWYgKGxvb3AgPT0gMCkKKwkJCW51bV90ZXJtKys7CisJCSAgICBlbHNlCisJCQkoKmZpbGUpW2NvdW50KytdID0gdmltX3N0cnNhdmUobmFtZV9idWYpOworCQl9CisJICAgIH0KKwl9CisJaWYgKGxvb3AgPT0gMCkKKwl7CisJICAgIGlmIChudW1fbm9ybWFsID4gMCkKKwkJKm51bV9maWxlID0gbnVtX25vcm1hbDsKKwkgICAgZWxzZSBpZiAobnVtX3Rlcm0gPiAwKQorCQkqbnVtX2ZpbGUgPSBudW1fdGVybTsKKwkgICAgZWxzZQorCQlyZXR1cm4gT0s7CisJICAgICpmaWxlID0gKGNoYXJfdSAqKilhbGxvYygodW5zaWduZWQpKCpudW1fZmlsZSAqIHNpemVvZihjaGFyX3UgKikpKTsKKwkgICAgaWYgKCpmaWxlID09IE5VTEwpCisJICAgIHsKKwkJKmZpbGUgPSAoY2hhcl91ICoqKSIiOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CitFeHBhbmRPbGRTZXR0aW5nKG51bV9maWxlLCBmaWxlKQorICAgIGludAkgICAgKm51bV9maWxlOworICAgIGNoYXJfdSAgKioqZmlsZTsKK3sKKyAgICBjaGFyX3UgICp2YXIgPSBOVUxMOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBjaGFyX3UgICpidWY7CisKKyAgICAqbnVtX2ZpbGUgPSAwOworICAgICpmaWxlID0gKGNoYXJfdSAqKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKGNoYXJfdSAqKSk7CisgICAgaWYgKCpmaWxlID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIEZvciBhIHRlcm1pbmFsIGtleSBjb2RlIGV4cGFuZF9vcHRpb25faWR4IGlzIDwgMC4KKyAgICAgKi8KKyAgICBpZiAoZXhwYW5kX29wdGlvbl9pZHggPCAwKQorICAgIHsKKwl2YXIgPSBmaW5kX3Rlcm1jb2RlKGV4cGFuZF9vcHRpb25fbmFtZSArIDIpOworCWlmICh2YXIgPT0gTlVMTCkKKwkgICAgZXhwYW5kX29wdGlvbl9pZHggPSBmaW5kb3B0aW9uKGV4cGFuZF9vcHRpb25fbmFtZSk7CisgICAgfQorCisgICAgaWYgKGV4cGFuZF9vcHRpb25faWR4ID49IDApCisgICAgeworCS8qIHB1dCBzdHJpbmcgb2Ygb3B0aW9uIHZhbHVlIGluIE5hbWVCdWZmICovCisJb3B0aW9uX3ZhbHVlMnN0cmluZygmb3B0aW9uc1tleHBhbmRfb3B0aW9uX2lkeF0sIGV4cGFuZF9vcHRpb25fZmxhZ3MpOworCXZhciA9IE5hbWVCdWZmOworICAgIH0KKyAgICBlbHNlIGlmICh2YXIgPT0gTlVMTCkKKwl2YXIgPSAoY2hhcl91ICopIiI7CisKKyAgICAvKiBBIGJhY2tzbGFzaCBpcyByZXF1aXJlZCBiZWZvcmUgc29tZSBjaGFyYWN0ZXJzLiAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZgorICAgICAqIHdoYXQgaGFwcGVucyBpbiBkb19zZXQoKS4gKi8KKyAgICBidWYgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKHZhciwgZXNjYXBlX2NoYXJzKTsKKworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoKmZpbGUpOworCSpmaWxlID0gTlVMTDsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyAgICAvKiBGb3IgTVMtV2luZG93cyBldCBhbC4gd2UgZG9uJ3QgZG91YmxlIGJhY2tzbGFzaGVzIGF0IHRoZSBzdGFydCBhbmQKKyAgICAgKiBiZWZvcmUgYSBmaWxlIG5hbWUgY2hhcmFjdGVyLiAqLworICAgIGZvciAodmFyID0gYnVmOyAqdmFyICE9IE5VTDsgKQorICAgIHsKKwlpZiAodmFyWzBdID09ICdcXCcgJiYgdmFyWzFdID09ICdcXCcKKwkJJiYgZXhwYW5kX29wdGlvbl9pZHggPj0gMAorCQkmJiAob3B0aW9uc1tleHBhbmRfb3B0aW9uX2lkeF0uZmxhZ3MgJiBQX0VYUEFORCkKKwkJJiYgdmltX2lzZmlsZWModmFyWzJdKQorCQkmJiAodmFyWzJdICE9ICdcXCcgfHwgKHZhciA9PSBidWYgJiYgdmFyWzRdICE9ICdcXCcpKSkKKwkgICAgbWNoX21lbW1vdmUodmFyLCB2YXIgKyAxLCBTVFJMRU4odmFyKSk7CisjaWZkZWYgRkVBVF9NQllURQorCWVsc2UgaWYgKGhhc19tYnl0ZSkKKwkgICAgdmFyICs9ICgqbWJfcHRyMmxlbl9jaGVjaykodmFyKSAtIDE7CisjZW5kaWYKKwkrK3ZhcjsKKyAgICB9CisjZW5kaWYKKworICAgICpmaWxlWzBdID0gYnVmOworICAgICpudW1fZmlsZSA9IDE7CisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgbnVtZXJpYyBvciBzdHJpbmcgb3B0aW9uICpvcHAgaW4gYSBuaWNlIGZvcm1hdCBpbnRvCisgKiBOYW1lQnVmZltdLiAgTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBoaWRkZW4gb3B0aW9uIQorICovCisgICAgc3RhdGljIHZvaWQKK29wdGlvbl92YWx1ZTJzdHJpbmcob3BwLCBvcHRfZmxhZ3MpCisgICAgc3RydWN0IHZpbW9wdGlvbgkqb3BwOworICAgIGludAkJCW9wdF9mbGFnczsJLyogT1BUX0dMT0JBTCBhbmQvb3IgT1BUX0xPQ0FMICovCit7CisgICAgY2hhcl91CSp2YXJwOworCisgICAgdmFycCA9IGdldF92YXJwX3Njb3BlKG9wcCwgb3B0X2ZsYWdzKTsKKworICAgIGlmIChvcHAtPmZsYWdzICYgUF9OVU0pCisgICAgeworCWxvbmcgd2MgPSAwOworCisJaWYgKHdjX3VzZV9rZXluYW1lKHZhcnAsICZ3YykpCisJICAgIFNUUkNQWShOYW1lQnVmZiwgZ2V0X3NwZWNpYWxfa2V5X25hbWUoKGludCl3YywgMCkpOworCWVsc2UgaWYgKHdjICE9IDApCisJICAgIFNUUkNQWShOYW1lQnVmZiwgdHJhbnNjaGFyKChpbnQpd2MpKTsKKwllbHNlCisJICAgIHNwcmludGYoKGNoYXIgKilOYW1lQnVmZiwgIiVsZCIsICoobG9uZyAqKXZhcnApOworICAgIH0KKyAgICBlbHNlICAgIC8qIFBfU1RSSU5HICovCisgICAgeworCXZhcnAgPSAqKGNoYXJfdSAqKikodmFycCk7CisJaWYgKHZhcnAgPT0gTlVMTCkJCSAgICAvKiBqdXN0IGluIGNhc2UgKi8KKwkgICAgTmFtZUJ1ZmZbMF0gPSBOVUw7CisjaWZkZWYgRkVBVF9DUllQVAorCS8qIGRvbid0IHNob3cgdGhlIGFjdHVhbCB2YWx1ZSBvZiAna2V5Jywgb25seSB0aGF0IGl0J3Mgc2V0ICovCisJaWYgKG9wcC0+dmFyID09IChjaGFyX3UgKikmcF9rZXkgJiYgKnZhcnApCisJICAgIFNUUkNQWShOYW1lQnVmZiwgIioqKioqIik7CisjZW5kaWYKKwllbHNlIGlmIChvcHAtPmZsYWdzICYgUF9FWFBBTkQpCisJICAgIGhvbWVfcmVwbGFjZShOVUxMLCB2YXJwLCBOYW1lQnVmZiwgTUFYUEFUSEwsIEZBTFNFKTsKKwkvKiBUcmFuc2xhdGUgJ3Bhc3RldG9nZ2xlJyBpbnRvIHNwZWNpYWwga2V5IG5hbWVzICovCisJZWxzZSBpZiAoKGNoYXJfdSAqKilvcHAtPnZhciA9PSAmcF9wdCkKKwkgICAgc3RyMnNwZWNpYWxidWYocF9wdCwgTmFtZUJ1ZmYsIE1BWFBBVEhMKTsKKwllbHNlCisJICAgIFNUUk5DUFkoTmFtZUJ1ZmYsIHZhcnAsIE1BWFBBVEhMKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAidmFycCIgcG9pbnRzIHRvICd3aWxkY2hhcicgb3IgJ3dpbGRjaGFybScgYW5kIGl0IGNhbiBiZQorICogcHJpbnRlZCBhcyBhIGtleW5hbWUuCisgKiAiKndjcCIgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIGlmIGl0J3MgJ3dpbGRjaGFyJyBvciAnd2lsZGNoYXJtJy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3djX3VzZV9rZXluYW1lKHZhcnAsIHdjcCkKKyAgICBjaGFyX3UJKnZhcnA7CisgICAgbG9uZwkqd2NwOworeworICAgIGlmICgoKGxvbmcgKil2YXJwID09ICZwX3djKSB8fCAoKGxvbmcgKil2YXJwID09ICZwX3djbSkpCisgICAgeworCSp3Y3AgPSAqKGxvbmcgKil2YXJwOworCWlmIChJU19TUEVDSUFMKCp3Y3ApIHx8IGZpbmRfc3BlY2lhbF9rZXlfaW5fdGFibGUoKGludCkqd2NwKSA+PSAwKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgRkVBVF9MQU5HTUFQCisvKgorICogQW55IGNoYXJhY3RlciBoYXMgYW4gZXF1aXZhbGVudCBjaGFyYWN0ZXIuICBUaGlzIGlzIHVzZWQgZm9yIGtleWJvYXJkcyB0aGF0CisgKiBoYXZlIGEgc3BlY2lhbCBsYW5ndWFnZSBtb2RlIHRoYXQgc2VuZHMgY2hhcmFjdGVycyBhYm92ZSAxMjggKGFsdGhvdWdoCisgKiBvdGhlciBjaGFyYWN0ZXJzIGNhbiBiZSB0cmFuc2xhdGVkIHRvbykuCisgKi8KKworLyoKKyAqIGNoYXJfdSBsYW5nbWFwX21hcGNoYXJbMjU2XTsKKyAqIE5vcm1hbGx5IG1hcHMgZWFjaCBvZiB0aGUgMTI4IHVwcGVyIGNoYXJzIHRvIGFuIDwxMjggYXNjaWkgY2hhcjsgdXNlZCB0bworICogInRyYW5zbGF0ZSIgbmF0aXZlIGxhbmcgY2hhcnMgaW4gbm9ybWFsIG1vZGUgb3Igc29tZSBjYXNlcyBvZgorICogaW5zZXJ0IG1vZGUgd2l0aG91dCBoYXZpbmcgdG8gdGVkaW91c2x5IHN3aXRjaCBsYW5nIG1vZGUgYmFjayZmb3J0aC4KKyAqLworCisgICAgc3RhdGljIHZvaWQKK2xhbmdtYXBfaW5pdCgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCQkvKiB3ZSBpbml0IHdpdGggYS1vbmUtdG8gb25lIG1hcCAqLworCWxhbmdtYXBfbWFwY2hhcltpXSA9IGk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBsYW5nbWFwIG9wdGlvbiBpcyBzZXQ7IHRoZSBsYW5ndWFnZSBtYXAgY2FuIGJlCisgKiBjaGFuZ2VkIGF0IGFueSB0aW1lIQorICovCisgICAgc3RhdGljIHZvaWQKK2xhbmdtYXBfc2V0KCkKK3sKKyAgICBjaGFyX3UgICpwOworICAgIGNoYXJfdSAgKnAyOworICAgIGludAkgICAgZnJvbSwgdG87CisKKyAgICBsYW5nbWFwX2luaXQoKTsJCQkgICAgLyogYmFjayB0byBvbmUtdG8tb25lIG1hcCBmaXJzdCAqLworCisgICAgZm9yIChwID0gcF9sYW5nbWFwOyBwWzBdICE9IE5VTDsgKQorICAgIHsKKwlmb3IgKHAyID0gcDsgcDJbMF0gIT0gTlVMICYmIHAyWzBdICE9ICcsJyAmJiBwMlswXSAhPSAnOyc7ICsrcDIpCisJeworCSAgICBpZiAocDJbMF0gPT0gJ1xcJyAmJiBwMlsxXSAhPSBOVUwpCisJCSsrcDI7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBwMiArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHAyKSAtIDE7CisjZW5kaWYKKwl9CisJaWYgKHAyWzBdID09ICc7JykKKwkgICAgKytwMjsJICAgIC8qIGFiY2Q7QUJDRCBmb3JtLCBwMiBwb2ludHMgdG8gQSAqLworCWVsc2UKKwkgICAgcDIgPSBOVUxMOwkgICAgLyogYUFiQmNDZEQgZm9ybSwgcDIgaXMgTlVMTCAqLworCXdoaWxlIChwWzBdKQorCXsKKwkgICAgaWYgKHBbMF0gPT0gJ1xcJyAmJiBwWzFdICE9IE5VTCkKKwkJKytwOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgZnJvbSA9ICgqbWJfcHRyMmNoYXIpKHApOworI2Vsc2UKKwkgICAgZnJvbSA9IHBbMF07CisjZW5kaWYKKwkgICAgaWYgKHAyID09IE5VTEwpCisJICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJCXAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKyNlbHNlCisJCSsrcDsKKyNlbmRpZgorCQlpZiAocFswXSA9PSAnXFwnKQorCQkgICAgKytwOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJdG8gPSAoKm1iX3B0cjJjaGFyKShwKTsKKyNlbHNlCisJCXRvID0gcFswXTsKKyNlbmRpZgorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAocDJbMF0gPT0gJ1xcJykKKwkJICAgICsrcDI7CisjaWZkZWYgRkVBVF9NQllURQorCQl0byA9ICgqbWJfcHRyMmNoYXIpKHAyKTsKKyNlbHNlCisJCXRvID0gcDJbMF07CisjZW5kaWYKKwkgICAgfQorCSAgICBpZiAodG8gPT0gTlVMKQorCSAgICB7CisJCUVNU0cyKF8oIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIiksCisJCQkJCQkJICAgICB0cmFuc2NoYXIoZnJvbSkpOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgbGFuZ21hcF9tYXBjaGFyW2Zyb20gJiAyNTVdID0gdG87CisKKwkgICAgLyogQWR2YW5jZSB0byBuZXh0IHBhaXIgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKyNlbHNlCisJICAgICsrcDsKKyNlbmRpZgorCSAgICBpZiAocDIgPT0gTlVMTCkKKwkgICAgeworCQlpZiAocFswXSA9PSAnLCcpCisJCXsKKwkJICAgICsrcDsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlwMiArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHAyKTsKKyNlbHNlCisJCSsrcDI7CisjZW5kaWYKKwkJaWYgKCpwID09ICc7JykKKwkJeworCQkgICAgcCA9IHAyOworCQkgICAgaWYgKHBbMF0gIT0gTlVMKQorCQkgICAgeworCQkJaWYgKHBbMF0gIT0gJywnKQorCQkJeworCQkJICAgIEVNU0cyKF8oIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIiksIHApOworCQkJICAgIHJldHVybjsKKwkJCX0KKwkJCSsrcDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBmb3JtYXQgb3B0aW9uICd4JyBpcyBpbiBlZmZlY3QuCisgKiBUYWtlIGNhcmUgb2Ygbm8gZm9ybWF0dGluZyB3aGVuICdwYXN0ZScgaXMgc2V0LgorICovCisgICAgaW50CitoYXNfZm9ybWF0X29wdGlvbih4KQorICAgIGludAkJeDsKK3sKKyAgICBpZiAocF9wYXN0ZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuICh2aW1fc3RyY2hyKGN1cmJ1Zi0+Yl9wX2ZvLCB4KSAhPSBOVUxMKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJ4IiBpcyBwcmVzZW50IGluICdzaG9ydG1lc3MnIG9wdGlvbiwgb3IKKyAqICdzaG9ydG1lc3MnIGNvbnRhaW5zICdhJyBhbmQgIngiIGlzIHByZXNlbnQgaW4gU0hNX0EuCisgKi8KKyAgICBpbnQKK3Nob3J0bWVzcyh4KQorICAgIGludAkgICAgeDsKK3sKKyAgICByZXR1cm4gKCAgIHZpbV9zdHJjaHIocF9zaG0sIHgpICE9IE5VTEwKKwkgICAgfHwgKHZpbV9zdHJjaHIocF9zaG0sICdhJykgIT0gTlVMTAorCQkmJiB2aW1fc3RyY2hyKChjaGFyX3UgKilTSE1fQSwgeCkgIT0gTlVMTCkpOworfQorCisvKgorICogcGFzdGVfb3B0aW9uX2NoYW5nZWQoKSAtIENhbGxlZCBhZnRlciBwX3Bhc3RlIHdhcyBzZXQgb3IgcmVzZXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcGFzdGVfb3B0aW9uX2NoYW5nZWQoKQoreworICAgIHN0YXRpYyBpbnQJb2xkX3BfcGFzdGUgPSBGQUxTRTsKKyAgICBzdGF0aWMgaW50CXNhdmVfc20gPSAwOworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgc3RhdGljIGludAlzYXZlX3J1ID0gMDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgc3RhdGljIGludAlzYXZlX3JpID0gMDsKKyAgICBzdGF0aWMgaW50CXNhdmVfaGttYXAgPSAwOworI2VuZGlmCisgICAgYnVmX1QJKmJ1ZjsKKworICAgIGlmIChwX3Bhc3RlKQorICAgIHsKKwkvKgorCSAqIFBhc3RlIHN3aXRjaGVkIGZyb20gb2ZmIHRvIG9uLgorCSAqIFNhdmUgdGhlIGN1cnJlbnQgdmFsdWVzLCBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZCBsYXRlci4KKwkgKi8KKwlpZiAoIW9sZF9wX3Bhc3RlKQorCXsKKwkgICAgLyogc2F2ZSBvcHRpb25zIGZvciBlYWNoIGJ1ZmZlciAqLworCSAgICBmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJICAgIHsKKwkJYnVmLT5iX3BfdHdfbm9wYXN0ZSA9IGJ1Zi0+Yl9wX3R3OworCQlidWYtPmJfcF93bV9ub3Bhc3RlID0gYnVmLT5iX3Bfd207CisJCWJ1Zi0+Yl9wX3N0c19ub3Bhc3RlID0gYnVmLT5iX3Bfc3RzOworCQlidWYtPmJfcF9haV9ub3Bhc3RlID0gYnVmLT5iX3BfYWk7CisJICAgIH0KKworCSAgICAvKiBzYXZlIGdsb2JhbCBvcHRpb25zICovCisJICAgIHNhdmVfc20gPSBwX3NtOworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJICAgIHNhdmVfcnUgPSBwX3J1OworI2VuZGlmCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgc2F2ZV9yaSA9IHBfcmk7CisJICAgIHNhdmVfaGttYXAgPSBwX2hrbWFwOworI2VuZGlmCisJICAgIC8qIHNhdmUgZ2xvYmFsIHZhbHVlcyBmb3IgbG9jYWwgYnVmZmVyIG9wdGlvbnMgKi8KKwkgICAgcF90d19ub3Bhc3RlID0gcF90dzsKKwkgICAgcF93bV9ub3Bhc3RlID0gcF93bTsKKwkgICAgcF9zdHNfbm9wYXN0ZSA9IHBfc3RzOworCSAgICBwX2FpX25vcGFzdGUgPSBwX2FpOworCX0KKworCS8qCisJICogQWx3YXlzIHNldCB0aGUgb3B0aW9uIHZhbHVlcywgYWxzbyB3aGVuICdwYXN0ZScgaXMgc2V0IHdoZW4gaXQgaXMKKwkgKiBhbHJlYWR5IG9uLgorCSAqLworCS8qIHNldCBvcHRpb25zIGZvciBlYWNoIGJ1ZmZlciAqLworCWZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwl7CisJICAgIGJ1Zi0+Yl9wX3R3ID0gMDsJICAgIC8qIHRleHR3aWR0aCBpcyAwICovCisJICAgIGJ1Zi0+Yl9wX3dtID0gMDsJICAgIC8qIHdyYXBtYXJnaW4gaXMgMCAqLworCSAgICBidWYtPmJfcF9zdHMgPSAwOwkgICAgLyogc29mdHRhYnN0b3AgaXMgMCAqLworCSAgICBidWYtPmJfcF9haSA9IDA7CSAgICAvKiBubyBhdXRvLWluZGVudCAqLworCX0KKworCS8qIHNldCBnbG9iYWwgb3B0aW9ucyAqLworCXBfc20gPSAwOwkJICAgIC8qIG5vIHNob3dtYXRjaCAqLworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisjIGlmZGVmIEZFQVRfV0lORE9XUworCWlmIChwX3J1KQorCSAgICBzdGF0dXNfcmVkcmF3X2FsbCgpOyAgICAvKiByZWRyYXcgdG8gcmVtb3ZlIHRoZSBydWxlciAqLworIyBlbmRpZgorCXBfcnUgPSAwOwkJICAgIC8qIG5vIHJ1bGVyICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCXBfcmkgPSAwOwkJICAgIC8qIG5vIHJldmVyc2UgaW5zZXJ0ICovCisJcF9oa21hcCA9IDA7CQkgICAgLyogbm8gSGVicmV3IGtleWJvYXJkICovCisjZW5kaWYKKwkvKiBzZXQgZ2xvYmFsIHZhbHVlcyBmb3IgbG9jYWwgYnVmZmVyIG9wdGlvbnMgKi8KKwlwX3R3ID0gMDsKKwlwX3dtID0gMDsKKwlwX3N0cyA9IDA7CisJcF9haSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXN0ZSBzd2l0Y2hlZCBmcm9tIG9uIHRvIG9mZjogUmVzdG9yZSBzYXZlZCB2YWx1ZXMuCisgICAgICovCisgICAgZWxzZSBpZiAob2xkX3BfcGFzdGUpCisgICAgeworCS8qIHJlc3RvcmUgb3B0aW9ucyBmb3IgZWFjaCBidWZmZXIgKi8KKwlmb3IgKGJ1ZiA9IGZpcnN0YnVmOyBidWYgIT0gTlVMTDsgYnVmID0gYnVmLT5iX25leHQpCisJeworCSAgICBidWYtPmJfcF90dyA9IGJ1Zi0+Yl9wX3R3X25vcGFzdGU7CisJICAgIGJ1Zi0+Yl9wX3dtID0gYnVmLT5iX3Bfd21fbm9wYXN0ZTsKKwkgICAgYnVmLT5iX3Bfc3RzID0gYnVmLT5iX3Bfc3RzX25vcGFzdGU7CisJICAgIGJ1Zi0+Yl9wX2FpID0gYnVmLT5iX3BfYWlfbm9wYXN0ZTsKKwl9CisKKwkvKiByZXN0b3JlIGdsb2JhbCBvcHRpb25zICovCisJcF9zbSA9IHNhdmVfc207CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisJaWYgKHBfcnUgIT0gc2F2ZV9ydSkKKwkgICAgc3RhdHVzX3JlZHJhd19hbGwoKTsgICAgLyogcmVkcmF3IHRvIGRyYXcgdGhlIHJ1bGVyICovCisjIGVuZGlmCisJcF9ydSA9IHNhdmVfcnU7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCXBfcmkgPSBzYXZlX3JpOworCXBfaGttYXAgPSBzYXZlX2hrbWFwOworI2VuZGlmCisJLyogc2V0IGdsb2JhbCB2YWx1ZXMgZm9yIGxvY2FsIGJ1ZmZlciBvcHRpb25zICovCisJcF90dyA9IHBfdHdfbm9wYXN0ZTsKKwlwX3dtID0gcF93bV9ub3Bhc3RlOworCXBfc3RzID0gcF9zdHNfbm9wYXN0ZTsKKwlwX2FpID0gcF9haV9ub3Bhc3RlOworICAgIH0KKworICAgIG9sZF9wX3Bhc3RlID0gcF9wYXN0ZTsKK30KKworLyoKKyAqIHZpbXJjX2ZvdW5kKCkgLSBDYWxsZWQgd2hlbiBhICIudmltcmMiIG9yICJWSU1JTklUIiBoYXMgYmVlbiBmb3VuZC4KKyAqCisgKiBSZXNldCAnY29tcGF0aWJsZScgYW5kIHNldCB0aGUgdmFsdWVzIGZvciBvcHRpb25zIHRoYXQgZGlkbid0IGdldCBzZXQgeWV0CisgKiB0byB0aGUgVmltIGRlZmF1bHRzLgorICogRG9uJ3QgZG8gdGhpcyBpZiB0aGUgJ2NvbXBhdGlibGUnIG9wdGlvbiBoYXMgYmVlbiBzZXQgb3IgcmVzZXQgYmVmb3JlLgorICovCisgICAgdm9pZAordmltcmNfZm91bmQoKQoreworICAgIGludAkgICAgb3B0X2lkeDsKKworICAgIGlmICghb3B0aW9uX3dhc19zZXQoKGNoYXJfdSAqKSJjcCIpKQorICAgIHsKKwlwX2NwID0gRkFMU0U7CisJZm9yIChvcHRfaWR4ID0gMDsgIWlzdGVybW9wdGlvbigmb3B0aW9uc1tvcHRfaWR4XSk7IG9wdF9pZHgrKykKKwkgICAgaWYgKCEob3B0aW9uc1tvcHRfaWR4XS5mbGFncyAmIChQX1dBU19TRVR8UF9WSV9ERUYpKSkKKwkJc2V0X29wdGlvbl9kZWZhdWx0KG9wdF9pZHgsIE9QVF9GUkVFLCBGQUxTRSk7CisJZGlkc2V0X29wdGlvbnMoKTsKKyAgICB9Cit9CisKKy8qCisgKiBTZXQgJ2NvbXBhdGlibGUnIG9uIG9yIG9mZi4gIENhbGxlZCBmb3IgIi1DIiBhbmQgIi1OIiBjb21tYW5kIGxpbmUgYXJnLgorICovCisgICAgdm9pZAorY2hhbmdlX2NvbXBhdGlibGUob24pCisgICAgaW50CSAgICBvbjsKK3sKKyAgICBpZiAocF9jcCAhPSBvbikKKyAgICB7CisJcF9jcCA9IG9uOworCWNvbXBhdGlibGVfc2V0KCk7CisgICAgfQorICAgIG9wdGlvbnNbZmluZG9wdGlvbigoY2hhcl91ICopImNwIildLmZsYWdzIHw9IFBfV0FTX1NFVDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gb3B0aW9uICJuYW1lIiBoYXMgYmVlbiBzZXQuCisgKi8KKyAgICBpbnQKK29wdGlvbl93YXNfc2V0KG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludCBpZHg7CisKKyAgICBpZHggPSBmaW5kb3B0aW9uKG5hbWUpOworICAgIGlmIChpZHggPCAwKQkvKiB1bmtub3duIG9wdGlvbiAqLworCXJldHVybiBGQUxTRTsKKyAgICBpZiAob3B0aW9uc1tpZHhdLmZsYWdzICYgUF9XQVNfU0VUKQorCXJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIGNvbXBhdGlibGVfc2V0KCkgLSBDYWxsZWQgd2hlbiAnY29tcGF0aWJsZScgaGFzIGJlZW4gc2V0IG9yIHVuc2V0LgorICoKKyAqIFdoZW4gJ2NvbXBhdGlibGUnIHNldDogU2V0IGFsbCByZWxldmFudCBvcHRpb25zICh0aG9zZSB0aGF0IGhhdmUgdGhlIFBfVklNKQorICogZmxhZykgdG8gYSBWaSBjb21wYXRpYmxlIHZhbHVlLgorICogV2hlbiAnY29tcGF0aWJsZScgaXMgdW5zZXQ6IFNldCBhbGwgb3B0aW9ucyB0aGF0IGhhdmUgYSBkaWZmZXJlbnQgZGVmYXVsdAorICogZm9yIFZpbSAod2l0aG91dCB0aGUgUF9WSV9ERUYgZmxhZykgdG8gdGhhdCBkZWZhdWx0LgorICovCisgICAgc3RhdGljIHZvaWQKK2NvbXBhdGlibGVfc2V0KCkKK3sKKyAgICBpbnQJICAgIG9wdF9pZHg7CisKKyAgICBmb3IgKG9wdF9pZHggPSAwOyAhaXN0ZXJtb3B0aW9uKCZvcHRpb25zW29wdF9pZHhdKTsgb3B0X2lkeCsrKQorCWlmICgJICAgKChvcHRpb25zW29wdF9pZHhdLmZsYWdzICYgUF9WSU0pICYmIHBfY3ApCisJCXx8ICghKG9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgJiBQX1ZJX0RFRikgJiYgIXBfY3ApKQorCSAgICBzZXRfb3B0aW9uX2RlZmF1bHQob3B0X2lkeCwgT1BUX0ZSRUUsIHBfY3ApOworICAgIGRpZHNldF9vcHRpb25zKCk7Cit9CisKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworCisjIGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fIDwgMHg1MDApCisgICAvKiBCb3JsYW5kIEMrKyBzY3Jld3MgdXAgbG9vcCBvcHRpbWlzYXRpb24gaGVyZSAobmVncmkpICovCisjICBwcmFnbWEgb3B0aW9uIC1PLWwKKyMgZW5kaWYKKworLyoKKyAqIGZpbGxfYnJlYWthdF9mbGFncygpIC0tIGNhbGxlZCB3aGVuICdicmVha2F0JyBjaGFuZ2VzIHZhbHVlLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZpbGxfYnJlYWthdF9mbGFncygpCit7CisgICAgY2hhcl91CSpjOworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwlicmVha2F0X2ZsYWdzW2ldID0gRkFMU0U7CisKKyAgICBpZiAocF9icmVha2F0ICE9IE5VTEwpCisJZm9yIChjID0gcF9icmVha2F0OyAqYzsgYysrKQorCSAgICBicmVha2F0X2ZsYWdzWypjXSA9IFRSVUU7Cit9CisKKyMgaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDUwMCkKKyMgIHByYWdtYSBvcHRpb24gLU8ubAorIyBlbmRpZgorCisjZW5kaWYKKworLyoKKyAqIENoZWNrIGFuIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHJhbmdlIG9mIHN0cmluZyB2YWx1ZXMuCisgKgorICogUmV0dXJuIE9LIGZvciBjb3JyZWN0IHZhbHVlLCBGQUlMIG90aGVyd2lzZS4KKyAqIEVtcHR5IGlzIGFsd2F5cyBPSy4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX29wdF9zdHJpbmdzKHZhbCwgdmFsdWVzLCBsaXN0KQorICAgIGNoYXJfdQkqdmFsOworICAgIGNoYXIJKip2YWx1ZXM7CisgICAgaW50CQlsaXN0OwkgICAgLyogd2hlbiBUUlVFOiBhY2NlcHQgYSBsaXN0IG9mIHZhbHVlcyAqLworeworICAgIHJldHVybiBvcHRfc3RyaW5nc19mbGFncyh2YWwsIHZhbHVlcywgTlVMTCwgbGlzdCk7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gb3B0aW9uIHRoYXQgY2FuIGJlIGEgcmFuZ2Ugb2Ygc3RyaW5nIHZhbHVlcy4KKyAqIFNldCBhIGZsYWcgaW4gIipmbGFncCIgZm9yIGVhY2ggc3RyaW5nIHByZXNlbnQuCisgKgorICogUmV0dXJuIE9LIGZvciBjb3JyZWN0IHZhbHVlLCBGQUlMIG90aGVyd2lzZS4KKyAqIEVtcHR5IGlzIGFsd2F5cyBPSy4KKyAqLworICAgIHN0YXRpYyBpbnQKK29wdF9zdHJpbmdzX2ZsYWdzKHZhbCwgdmFsdWVzLCBmbGFncCwgbGlzdCkKKyAgICBjaGFyX3UJKnZhbDsJCS8qIG5ldyB2YWx1ZSAqLworICAgIGNoYXIJKip2YWx1ZXM7CS8qIGFycmF5IG9mIHZhbGlkIHN0cmluZyB2YWx1ZXMgKi8KKyAgICB1bnNpZ25lZAkqZmxhZ3A7CisgICAgaW50CQlsaXN0OwkJLyogd2hlbiBUUlVFOiBhY2NlcHQgYSBsaXN0IG9mIHZhbHVlcyAqLworeworICAgIGludAkJaTsKKyAgICBpbnQJCWxlbjsKKyAgICB1bnNpZ25lZAluZXdfZmxhZ3MgPSAwOworCisgICAgd2hpbGUgKCp2YWwpCisgICAgeworCWZvciAoaSA9IDA7IDsgKytpKQorCXsKKwkgICAgaWYgKHZhbHVlc1tpXSA9PSBOVUxMKQkvKiB2YWwgbm90IGZvdW5kIGluIHZhbHVlc1tdICovCisJCXJldHVybiBGQUlMOworCisJICAgIGxlbiA9IChpbnQpU1RSTEVOKHZhbHVlc1tpXSk7CisJICAgIGlmIChTVFJOQ01QKHZhbHVlc1tpXSwgdmFsLCBsZW4pID09IDAKKwkJICAgICYmICgobGlzdCAmJiB2YWxbbGVuXSA9PSAnLCcpIHx8IHZhbFtsZW5dID09IE5VTCkpCisJICAgIHsKKwkJdmFsICs9IGxlbiArICh2YWxbbGVuXSA9PSAnLCcpOworCQluZXdfZmxhZ3MgfD0gKDEgPDwgaSk7CisJCWJyZWFrOwkJLyogY2hlY2sgbmV4dCBpdGVtIGluIHZhbCBsaXN0ICovCisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChmbGFncCAhPSBOVUxMKQorCSpmbGFncCA9IG5ld19mbGFnczsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJlYWQgdGhlICd3aWxkbW9kZScgb3B0aW9uLCBmaWxsIHdpbV9mbGFnc1tdLgorICovCisgICAgc3RhdGljIGludAorY2hlY2tfb3B0X3dpbSgpCit7CisgICAgY2hhcl91CW5ld193aW1fZmxhZ3NbNF07CisgICAgY2hhcl91CSpwOworICAgIGludAkJaTsKKyAgICBpbnQJCWlkeCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCW5ld193aW1fZmxhZ3NbaV0gPSAwOworCisgICAgZm9yIChwID0gcF93aW07ICpwOyArK3ApCisgICAgeworCWZvciAoaSA9IDA7IEFTQ0lJX0lTQUxQSEEocFtpXSk7ICsraSkKKwkgICAgOworCWlmIChwW2ldICE9IE5VTCAmJiBwW2ldICE9ICcsJyAmJiBwW2ldICE9ICc6JykKKwkgICAgcmV0dXJuIEZBSUw7CisJaWYgKGkgPT0gNyAmJiBTVFJOQ01QKHAsICJsb25nZXN0IiwgNykgPT0gMCkKKwkgICAgbmV3X3dpbV9mbGFnc1tpZHhdIHw9IFdJTV9MT05HRVNUOworCWVsc2UgaWYgKGkgPT0gNCAmJiBTVFJOQ01QKHAsICJmdWxsIiwgNCkgPT0gMCkKKwkgICAgbmV3X3dpbV9mbGFnc1tpZHhdIHw9IFdJTV9GVUxMOworCWVsc2UgaWYgKGkgPT0gNCAmJiBTVFJOQ01QKHAsICJsaXN0IiwgNCkgPT0gMCkKKwkgICAgbmV3X3dpbV9mbGFnc1tpZHhdIHw9IFdJTV9MSVNUOworCWVsc2UKKwkgICAgcmV0dXJuIEZBSUw7CisJcCArPSBpOworCWlmICgqcCA9PSBOVUwpCisJICAgIGJyZWFrOworCWlmICgqcCA9PSAnLCcpCisJeworCSAgICBpZiAoaWR4ID09IDMpCisJCXJldHVybiBGQUlMOworCSAgICArK2lkeDsKKwl9CisgICAgfQorCisgICAgLyogZmlsbCByZW1haW5pbmcgZW50cmllcyB3aXRoIGxhc3QgZmxhZyAqLworICAgIHdoaWxlIChpZHggPCAzKQorICAgIHsKKwluZXdfd2ltX2ZsYWdzW2lkeCArIDFdID0gbmV3X3dpbV9mbGFnc1tpZHhdOworCSsraWR4OworICAgIH0KKworICAgIC8qIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gZXJyb3JzLCB3aW1fZmxhZ3NbXSBpcyBjaGFuZ2VkICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwl3aW1fZmxhZ3NbaV0gPSBuZXdfd2ltX2ZsYWdzW2ldOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENoZWNrIGlmIGJhY2tzcGFjaW5nIG92ZXIgc29tZXRoaW5nIGlzIGFsbG93ZWQuCisgKi8KKyAgICBpbnQKK2Nhbl9icyh3aGF0KQorICAgIGludAkJd2hhdDsJICAgIC8qIEJTX0lOREVOVCwgQlNfRU9MIG9yIEJTX1NUQVJUICovCit7CisgICAgc3dpdGNoICgqcF9icykKKyAgICB7CisJY2FzZSAnMic6CXJldHVybiBUUlVFOworCWNhc2UgJzEnOglyZXR1cm4gKHdoYXQgIT0gQlNfU1RBUlQpOworCWNhc2UgJzAnOglyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiB2aW1fc3RyY2hyKHBfYnMsIHdoYXQpICE9IE5VTEw7Cit9CisKKy8qCisgKiBTYXZlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiAnZmlsZWZvcm1hdCcgYW5kICdmaWxlZW5jb2RpbmcnLCBzbyB0aGF0IHdlIGtub3cKKyAqIHRoZSBmaWxlIG11c3QgYmUgY29uc2lkZXJlZCBjaGFuZ2VkIHdoZW4gdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4KKyAqLworICAgIHZvaWQKK3NhdmVfZmlsZV9mZihidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBidWYtPmJfc3RhcnRfZmZjID0gKmJ1Zi0+Yl9wX2ZmOworICAgIGJ1Zi0+Yl9zdGFydF9lb2wgPSBidWYtPmJfcF9lb2w7CisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIE9ubHkgdXNlIGZyZWUvYWxsb2Mgd2hlbiBuZWNlc3NhcnksIHRoZXkgdGFrZSB0aW1lLiAqLworICAgIGlmIChidWYtPmJfc3RhcnRfZmVuYyA9PSBOVUxMCisJCQkgICAgIHx8IFNUUkNNUChidWYtPmJfc3RhcnRfZmVuYywgYnVmLT5iX3BfZmVuYykgIT0gMCkKKyAgICB7CisJdmltX2ZyZWUoYnVmLT5iX3N0YXJ0X2ZlbmMpOworCWJ1Zi0+Yl9zdGFydF9mZW5jID0gdmltX3N0cnNhdmUoYnVmLT5iX3BfZmVuYyk7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAnZmlsZWZvcm1hdCcgYW5kL29yICdmaWxlZW5jb2RpbmcnIGhhcyBhIGRpZmZlcmVudCB2YWx1ZQorICogZnJvbSB3aGVuIGVkaXRpbmcgc3RhcnRlZCAoc2F2ZV9maWxlX2ZmKCkgY2FsbGVkKS4KKyAqIEFsc28gd2hlbiAnZW5kb2ZsaW5lJyB3YXMgY2hhbmdlZCBhbmQgJ2JpbmFyeScgaXMgc2V0LgorICogRG9uJ3QgY29uc2lkZXIgYSBuZXcsIGVtcHR5IGJ1ZmZlciB0byBiZSBjaGFuZ2VkLgorICovCisgICAgaW50CitmaWxlX2ZmX2RpZmZlcnMoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaWYgKChidWYtPmJfZmxhZ3MgJiBCRl9ORVcpCisJICAgICYmIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID09IDEKKwkgICAgJiYgKm1sX2dldF9idWYoYnVmLCAobGluZW5yX1QpMSwgRkFMU0UpID09IE5VTCkKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYgKGJ1Zi0+Yl9zdGFydF9mZmMgIT0gKmJ1Zi0+Yl9wX2ZmKQorCXJldHVybiBUUlVFOworICAgIGlmIChidWYtPmJfcF9iaW4gJiYgYnVmLT5iX3N0YXJ0X2VvbCAhPSBidWYtPmJfcF9lb2wpCisJcmV0dXJuIFRSVUU7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChidWYtPmJfc3RhcnRfZmVuYyA9PSBOVUxMKQorCXJldHVybiAoKmJ1Zi0+Yl9wX2ZlbmMgIT0gTlVMKTsKKyAgICByZXR1cm4gKFNUUkNNUChidWYtPmJfc3RhcnRfZmVuYywgYnVmLT5iX3BfZmVuYykgIT0gMCk7CisjZWxzZQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKgorICogcmV0dXJuIE9LIGlmICJwIiBpcyBhIHZhbGlkIGZpbGVmb3JtYXQgbmFtZSwgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2NoZWNrX2ZmX3ZhbHVlKHApCisgICAgY2hhcl91CSpwOworeworICAgIHJldHVybiBjaGVja19vcHRfc3RyaW5ncyhwLCBwX2ZmX3ZhbHVlcywgRkFMU0UpOworfQpkaWZmIC0tZ2l0IGEvc3JjL29wdGlvbi5oIGIvc3JjL29wdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTg1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3B0aW9uLmgKQEAgLTAsMCArMSw4MDIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBvcHRpb24uaDogZGVmaW5pdGlvbiBvZiBnbG9iYWwgdmFyaWFibGVzIGZvciBzZXR0YWJsZSBvcHRpb25zCisgKi8KKworI2lmbmRlZiBFWFRFUk4KKyMgZGVmaW5lIEVYVEVSTiBleHRlcm4KKyMgZGVmaW5lIElOSVQoeCkKKyNlbHNlCisjIGlmbmRlZiBJTklUCisjICBkZWZpbmUgSU5JVCh4KSB4CisjIGVuZGlmCisjZW5kaWYKKworLyogZGVmYXVsdCB2YWx1ZXMgZm9yIHBfZWZtICdlcnJvcmZvcm1hdCcgKi8KKyNpZmRlZiBBTUlHQQorIyBkZWZpbmUgREZMVF9FRk0JIiVmPiVsOiVjOiV0OiVuOiVtLCVmOiVsOiAldCUqXFxEJW46ICVtLCVmICVsICV0JSpcXEQlbjogJW0sJSpbXlwiXVwiJWZcIiUqXFxEJWw6ICVtLCVmOiVsOiVtIgorI2Vsc2UKKyMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorIyAgZGVmaW5lIERGTFRfRUZNCSIlZiglbCkgOiAldCUqXFxEJW46ICVtLCUqW15cIl1cIiVmXCIlKlxcRCVsOiAlbSwlZiglbCkgOiAlbSwlKlteIF0gJWYgJWw6ICVtLCVmOiVsOiVtIgorIyBlbHNlCisjICBpZiBkZWZpbmVkKF9fRU1YX18pCS8qIHB1dCBtb3N0IGNvbW1vbiBoZXJlIChpLmUuIGdjYyBmb3JtYXQpIGF0IGZyb250ICovCisjICAgZGVmaW5lIERGTFRfRUZNCSIlZjolbDolbSwlKlteXCJdXCIlZlwiJSpcXEQlbDogJW0sXCIlZlwiJSpcXEQlbDogJW0sJWYoJWw6JWMpIDogJW0iCisjICBlbHNlCisjICAgaWYgZGVmaW5lZChfX1FOWF9fKQorIyAgICBkZWZpbmUgREZMVF9FRk0JIiVmKCVsKTolKlteV0VdJXQlKlxcRCVuOiVtIgorIyAgIGVsc2UKKyMgICAgaWZkZWYgVk1TCisjICAgICBkZWZpbmUgREZMVF9FRk0JIiVBJXBeLCVDJSVDQy0ldC0lbSwlQ2F0IGxpbmUgbnVtYmVyICVsIGluIGZpbGUgJWYiCisjICAgIGVsc2UgLyogVW5peCwgcHJvYmFibHkgKi8KKyMgICAgIGlmZGVmIEVCQ0RJQworI2RlZmluZSBERkxUX0VGTQkiJSpbXiBdICUqW14gXSAlZjolbCUqWyBdJW0sJSpbXlwiXVwiJWZcIiUqXFxEJWw6ICVtLFwiJWZcIiUqXFxEJWw6ICVtLCVmOiVsOiVtLFwiJWZcIlxcLCBsaW5lICVsJSpcXEQlYyUqW14gXSAlbSwlRCUqXFxhWyUqXFxkXTogRW50ZXJpbmcgZGlyZWN0b3J5IGAlZicsJVglKlxcYVslKlxcZF06IExlYXZpbmcgZGlyZWN0b3J5IGAlZicsJURNYWtpbmcgJSpcXGEgaW4gJWYiCisjICAgICBlbHNlCisjZGVmaW5lIERGTFRfRUZNCSIlKlteXCJdXCIlZlwiJSpcXEQlbDogJW0sXCIlZlwiJSpcXEQlbDogJW0sJS1HJWY6JWw6IChFYWNoIHVuZGVjbGFyZWQgaWRlbnRpZmllciBpcyByZXBvcnRlZCBvbmx5IG9uY2UsJS1HJWY6JWw6IGZvciBlYWNoIGZ1bmN0aW9uIGl0IGFwcGVhcnMgaW4uKSwlZjolbDolbSxcIiVmXCJcXCwgbGluZSAlbCUqXFxEJWMlKlteIF0gJW0sJUQlKlxcYVslKlxcZF06IEVudGVyaW5nIGRpcmVjdG9yeSBgJWYnLCVYJSpcXGFbJSpcXGRdOiBMZWF2aW5nIGRpcmVjdG9yeSBgJWYnLCVETWFraW5nICUqXFxhIGluICVmIgorIyAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIERGTFRfR1JFUEZPUk1BVAkiJWY6JWw6JW0sJWY6JWwlbSwlZiAgJWwlbSIKKworLyogZGVmYXVsdCB2YWx1ZXMgZm9yIGJfcF9mZiAnZmlsZWZvcm1hdCcgYW5kIHBfZmZzICdmaWxlZm9ybWF0cycgKi8KKyNkZWZpbmUgRkZfRE9TCQkiZG9zIgorI2RlZmluZSBGRl9NQUMJCSJtYWMiCisjZGVmaW5lIEZGX1VOSVgJCSJ1bml4IgorCisjaWZkZWYgVVNFX0NSTkwKKyMgZGVmaW5lIERGTFRfRkYJImRvcyIKKyMgZGVmaW5lIERGTFRfRkZTX1ZJTQkiZG9zLHVuaXgiCisjIGRlZmluZSBERkxUX0ZGU19WSQkiZG9zLHVuaXgiCS8qIGFsc28gYXV0b2RldGVjdCBpbiBjb21wYXRpYmxlIG1vZGUgKi8KKyMgZGVmaW5lIERGTFRfVEVYVEFVVE8JVFJVRQorI2Vsc2UKKyMgaWZkZWYgVVNFX0NSCisjICBkZWZpbmUgREZMVF9GRgkibWFjIgorIyAgZGVmaW5lIERGTFRfRkZTX1ZJTQkibWFjLHVuaXgsZG9zIgorIyAgZGVmaW5lIERGTFRfRkZTX1ZJCSJtYWMsdW5peCxkb3MiCisjICBkZWZpbmUgREZMVF9URVhUQVVUTwlUUlVFCisjIGVsc2UKKyMgIGRlZmluZSBERkxUX0ZGCSJ1bml4IgorIyAgZGVmaW5lIERGTFRfRkZTX1ZJTQkidW5peCxkb3MiCisjICBpZmRlZiBfX0NZR1dJTl9fCisjICAgZGVmaW5lIERGTFRfRkZTX1ZJCSJ1bml4LGRvcyIJLyogQ3lnd2luIGFsd2F5cyBuZWVkcyBmaWxlIGRldGVjdGlvbiAqLworIyAgIGRlZmluZSBERkxUX1RFWFRBVVRPIFRSVUUKKyMgIGVsc2UKKyMgICBkZWZpbmUgREZMVF9GRlNfVkkJIiIKKyMgICBkZWZpbmUgREZMVF9URVhUQVVUTyBGQUxTRQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBGRUFUX01CWVRFCisvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yICdlbmNvZGluZycgKi8KKyMgZGVmaW5lIEVOQ19VQ1NCT00JInVjcy1ib20iCS8qIGNoZWNrIGZvciBCT00gYXQgc3RhcnQgb2YgZmlsZSAqLworCisvKiBkZWZhdWx0IHZhbHVlIGZvciAnZW5jb2RpbmcnICovCisjIGRlZmluZSBFTkNfREZMVAkibGF0aW4xIgorI2VuZGlmCisKKy8qIGVuZC1vZi1saW5lIHN0eWxlICovCisjZGVmaW5lIEVPTF9VTktOT1dOCS0xCS8qIG5vdCBkZWZpbmVkIHlldCAqLworI2RlZmluZSBFT0xfVU5JWAkwCS8qIE5MICovCisjZGVmaW5lIEVPTF9ET1MJCTEJLyogQ1IgTkwgKi8KKyNkZWZpbmUgRU9MX01BQwkJMgkvKiBDUiAqLworCisvKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIHBfZm8gJ2Zvcm1hdG9wdGlvbnMnICovCisjZGVmaW5lIEZPX1dSQVAJCSd0JworI2RlZmluZSBGT19XUkFQX0NPTVMJJ2MnCisjZGVmaW5lIEZPX1JFVF9DT01TCSdyJworI2RlZmluZSBGT19PUEVOX0NPTVMJJ28nCisjZGVmaW5lIEZPX1FfQ09NUwkncScKKyNkZWZpbmUgRk9fUV9OVU1CRVIJJ24nCisjZGVmaW5lIEZPX1FfU0VDT05ECScyJworI2RlZmluZSBGT19JTlNfVkkJJ3YnCisjZGVmaW5lIEZPX0lOU19MT05HCSdsJworI2RlZmluZSBGT19JTlNfQkxBTksJJ2InCisjZGVmaW5lIEZPX01CWVRFX0JSRUFLCSdtJwkvKiBicmVhayBiZWZvcmUvYWZ0ZXIgbXVsdGktYnl0ZSBjaGFyICovCisjZGVmaW5lIEZPX01CWVRFX0pPSU4JJ00nCS8qIG5vIHNwYWNlIGJlZm9yZS9hZnRlciBtdWx0aS1ieXRlIGNoYXIgKi8KKyNkZWZpbmUgRk9fTUJZVEVfSk9JTjIJJ0InCS8qIG5vIHNwYWNlIGJldHdlZW4gbXVsdGktYnl0ZSBjaGFycyAqLworI2RlZmluZSBGT19PTkVfTEVUVEVSCScxJworI2RlZmluZSBGT19XSElURV9QQVIJJ3cnCS8qIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGNvbnRpbnVlcyBwYXJhZ3IuICovCisjZGVmaW5lIEZPX0FVVE8JCSdhJwkvKiBhdXRvbWF0aWMgZm9ybWF0dGluZyAqLworCisjZGVmaW5lIERGTFRfRk9fVkkJInZ0IgorI2RlZmluZSBERkxUX0ZPX1ZJTQkidGNxIgorI2RlZmluZSBGT19BTEwJCSJ0Y3JvcTJ2bGIxbU1CbixhdyIJLyogZm9yIGRvX3NldCgpICovCisKKy8qIGNoYXJhY3RlcnMgZm9yIHRoZSBwX2NwbyBvcHRpb246ICovCisjZGVmaW5lIENQT19BTFRSRUFECSdhJwkvKiAiOnJlYWQiIHNldHMgYWx0ZXJuYXRlIGZpbGUgbmFtZSAqLworI2RlZmluZSBDUE9fQUxUV1JJVEUJJ0EnCS8qICI6d3JpdGUiIHNldHMgYWx0ZXJuYXRlIGZpbGUgbmFtZSAqLworI2RlZmluZSBDUE9fQkFSCQknYicJLyogIlx8IiBlbmRzIGEgbWFwcGluZyAqLworI2RlZmluZSBDUE9fQlNMQVNICSdCJwkvKiBiYWNrc2xhc2ggaW4gbWFwcGluZyBpcyBub3Qgc3BlY2lhbCAqLworI2RlZmluZSBDUE9fU0VBUkNICSdjJworI2RlZmluZSBDUE9fQ09OQ0FUCSdDJwkvKiBEb24ndCBjb25jYXRlbmF0ZSBzb3VyY2VkIGxpbmVzICovCisjZGVmaW5lIENQT19ET1RUQUcJJ2QnCS8qICIuL3RhZ3MiIGluICd0YWdzJyBpcyBpbiBjdXJyZW50IGRpciAqLworI2RlZmluZSBDUE9fRElHUkFQSAknRCcJLyogTm8gZGlncmFwaCBhZnRlciAiciIsICJmIiwgZXRjLiAqLworI2RlZmluZSBDUE9fRVhFQ0JVRgknZScKKyNkZWZpbmUgQ1BPX0VNUFRZUkVHSU9OCSdFJwkvKiBvcGVyYXRpbmcgb24gZW1wdHkgcmVnaW9uIGlzIGFuIGVycm9yICovCisjZGVmaW5lIENQT19GTkFNRVIJJ2YnCS8qIHNldCBmaWxlIG5hbWUgZm9yICI6ciBmaWxlIiAqLworI2RlZmluZSBDUE9fRk5BTUVXCSdGJwkvKiBzZXQgZmlsZSBuYW1lIGZvciAiOncgZmlsZSIgKi8KKyNkZWZpbmUgQ1BPX0dPVE8xCSdnJwkvKiBnb3RvIGxpbmUgMSBmb3IgIjplZGl0IiAqLworI2RlZmluZSBDUE9fSU5UTU9ECSdpJwkvKiBpbnRlcnJ1cHQgYSByZWFkIG1ha2VzIGJ1ZmZlciBtb2RpZmllZCAqLworI2RlZmluZSBDUE9fSk9JTlNQCSdqJwkvKiBvbmx5IHVzZSB0d28gc3BhY2VzIGZvciBqb2luIGFmdGVyICcuJyAqLworI2RlZmluZSBDUE9fRU5ET0ZTRU5UCSdKJwkvKiBuZWVkIHR3byBzcGFjZXMgdG8gZGV0ZWN0IGVuZCBvZiBzZW50ZW5jZSAqLworI2RlZmluZSBDUE9fS0VZQ09ERQknaycJLyogZG9uJ3QgcmVjb2duaXplIHJhdyBrZXkgY29kZSBpbiBtYXBwaW5ncyAqLworI2RlZmluZSBDUE9fS09GRlNFVAknSycJLyogZG9uJ3Qgd2FpdCBmb3Iga2V5IGNvZGUgaW4gbWFwcGluZ3MgKi8KKyNkZWZpbmUgQ1BPX0xJVEVSQUwJJ2wnCS8qIHRha2UgY2hhciBhZnRlciBiYWNrc2xhc2ggaW4gW10gbGl0ZXJhbCAqLworI2RlZmluZSBDUE9fTElTVFdNCSdMJwkvKiAnbGlzdCcgY2hhbmdlcyB3cmFwbWFyZ2luICovCisjZGVmaW5lIENQT19TSE9XTUFUQ0gJJ20nCisjZGVmaW5lIENQT19NQVRDSEJTTAknTScJLyogIiUiIGlnbm9yZXMgdXNlIG9mIGJhY2tzbGFzaGVzICovCisjZGVmaW5lIENQT19OVU1DT0wJJ24nCS8qICdudW1iZXInIGNvbHVtbiBhbHNvIHVzZWQgZm9yIHRleHQgKi8KKyNkZWZpbmUgQ1BPX0xJTkVPRkYJJ28nCisjZGVmaW5lIENQT19PVkVSTkVXCSdPJwkvKiBzaWxlbnRseSBvdmVyd3JpdGUgbmV3IGZpbGUgKi8KKyNkZWZpbmUgQ1BPX0xJU1AJJ3AnCS8qICdsaXNwJyBpbmRlbnRpbmcgKi8KKyNkZWZpbmUgQ1BPX1JFRE8JJ3InCisjZGVmaW5lIENQT19SRU1NQVJLCSdSJwkvKiByZW1vdmUgbWFya3Mgd2hlbiBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgQ1BPX0JVRk9QVAkncycKKyNkZWZpbmUgQ1BPX0JVRk9QVEdMT0IJJ1MnCisjZGVmaW5lIENQT19UQUdQQVQJJ3QnCisjZGVmaW5lIENQT19VTkRPCSd1JwkvKiAidSIgdW5kb2VzIGl0c2VsZiAqLworI2RlZmluZSBDUE9fQkFDS1NQQUNFCSd2JwkvKiAidiIga2VlcCBkZWxldGVkIHRleHQgKi8KKyNkZWZpbmUgQ1BPX0NXCQkndycJLyogImN3IiBvbmx5IGNoYW5nZXMgb25lIGJsYW5rICovCisjZGVmaW5lIENQT19GV1JJVEUJJ1cnCS8qICJ3ISIgZG9lc24ndCBvdmVyd3JpdGUgcmVhZG9ubHkgZmlsZXMgKi8KKyNkZWZpbmUgQ1BPX0VTQwkJJ3gnCisjZGVmaW5lIENQT19ZQU5LCSd5JworI2RlZmluZSBDUE9fRE9MTEFSCSckJworI2RlZmluZSBDUE9fRklMVEVSCSchJworI2RlZmluZSBDUE9fTUFUQ0gJJyUnCisjZGVmaW5lIENQT19TVEFSCScqJwkvKiAiOioiIG1lYW5zICI6QCIgKi8KKyNkZWZpbmUgQ1BPX1NQRUNJCSc8JwkvKiBkb24ndCByZWNvZ25pemUgPD4gaW4gbWFwcGluZ3MgKi8KKyNkZWZpbmUgQ1BPX0RFRkFVTFQJImFBQmNlRnMiCisjZGVmaW5lIENQT19BTEwJCSJhQWJCY0NkRGVFZkZnaWpKa0tsTG1Nbm9PcHJSc1N0dXZ3V3h5JCElKjwiCisKKy8qIGNoYXJhY3RlcnMgZm9yIHBfd3cgb3B0aW9uOiAqLworI2RlZmluZSBXV19BTEwJCSJic2hsPD5bXSx+IgorCisvKiBjaGFyYWN0ZXJzIGZvciBwX21vdXNlIG9wdGlvbjogKi8KKyNkZWZpbmUgTU9VU0VfTk9STUFMCSduJwkJLyogdXNlIG1vdXNlIGluIE5vcm1hbCBtb2RlICovCisjZGVmaW5lIE1PVVNFX1ZJU1VBTAkndicJCS8qIHVzZSBtb3VzZSBpbiBWaXN1YWwvU2VsZWN0IG1vZGUgKi8KKyNkZWZpbmUgTU9VU0VfSU5TRVJUCSdpJwkJLyogdXNlIG1vdXNlIGluIEluc2VydCBtb2RlICovCisjZGVmaW5lIE1PVVNFX0NPTU1BTkQJJ2MnCQkvKiB1c2UgbW91c2UgaW4gQ29tbWFuZC1saW5lIG1vZGUgKi8KKyNkZWZpbmUgTU9VU0VfSEVMUAknaCcJCS8qIHVzZSBtb3VzZSBpbiBoZWxwIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTU9VU0VfUkVUVVJOCSdyJwkJLyogdXNlIG1vdXNlIGZvciBoaXQtcmV0dXJuIG1lc3NhZ2UgKi8KKyNkZWZpbmUgTU9VU0VfQQkJIm52aWNoIgkJLyogdXNlZCBmb3IgJ2EnIGZsYWcgKi8KKyNkZWZpbmUgTU9VU0VfQUxMCSJhbnZpY2hyIgkvKiBhbGwgcG9zc2libGUgY2hhcmFjdGVycyAqLworI2RlZmluZSBNT1VTRV9OT05FCScgJwkJLyogZG9uJ3QgdXNlIFZpc3VhbCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTU9VU0VfTk9ORUYJJ3gnCQkvKiBmb3JjZWQgbW9kZWxlc3Mgc2VsZWN0aW9uICovCisKKy8qIGNoYXJhY3RlcnMgZm9yIHBfc2htIG9wdGlvbjogKi8KKyNkZWZpbmUgU0hNX1JPCQkncicJCS8qIHJlYWRvbmx5ICovCisjZGVmaW5lIFNITV9NT0QJCSdtJwkJLyogbW9kaWZpZWQgKi8KKyNkZWZpbmUgU0hNX0ZJTEUJJ2YnCQkvKiAoZmlsZSAxIG9mIDIpICovCisjZGVmaW5lIFNITV9MQVNUCSdpJwkJLyogbGFzdCBsaW5lIGluY29tcGxldGUgKi8KKyNkZWZpbmUgU0hNX1RFWFQJJ3gnCQkvKiB0eCBpbnN0ZWFkIG9mIHRleHRtb2RlICovCisjZGVmaW5lIFNITV9MSU5FUwknbCcJCS8qICJMIiBpbnN0ZWFkIG9mICJsaW5lcyIgKi8KKyNkZWZpbmUgU0hNX05FVwkJJ24nCQkvKiAiW05ld10iIGluc3RlYWQgb2YgIltOZXcgZmlsZV0iICovCisjZGVmaW5lIFNITV9XUkkJCSd3JwkJLyogIlt3XSIgaW5zdGVhZCBvZiAid3JpdHRlbiIgKi8KKyNkZWZpbmUgU0hNX0EJCSJybWZpeGxudyIJLyogcmVwcmVzZW50ZWQgYnkgJ2EnIGZsYWcgKi8KKyNkZWZpbmUgU0hNX1dSSVRFCSdXJwkJLyogZG9uJ3QgdXNlICJ3cml0dGVuIiBhdCBhbGwgKi8KKyNkZWZpbmUgU0hNX1RSVU5DCSd0JwkJLyogdHJ1bmN0YXRlIGZpbGUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0hNX1RSVU5DQUxMCSdUJwkJLyogdHJ1bmN0YXRlIGFsbCBtZXNzYWdlcyAqLworI2RlZmluZSBTSE1fT1ZFUgknbycJCS8qIG92ZXJ3cml0ZSBmaWxlIG1lc3NhZ2VzICovCisjZGVmaW5lIFNITV9PVkVSQUxMCSdPJwkJLyogb3ZlcndyaXRlIG1vcmUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0hNX1NFQVJDSAkncycJCS8qIG5vIHNlYXJjaCBoaXQgYm90dG9tIG1lc3NhZ2VzICovCisjZGVmaW5lIFNITV9BVFRFTlRJT04JJ0EnCQkvKiBubyBBVFRFTlRJT04gbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0hNX0lOVFJPCSdJJwkJLyogaW50cm8gbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0hNX0FMTAkJInJtZml4bG53YVd0VG9Pc0FJIiAvKiBhbGwgcG9zc2libGUgZmxhZ3MgZm9yICdzaG0nICovCisKKy8qIGNoYXJhY3RlcnMgZm9yIHBfZ286ICovCisjZGVmaW5lIEdPX0FTRUwJCSdhJwkJLyogYXV0b3NlbGVjdCAqLworI2RlZmluZSBHT19BU0VMTUwJJ0EnCQkvKiBhdXRvc2VsZWN0IG1vZGVsZXNzIHNlbGVjdGlvbiAqLworI2RlZmluZSBHT19CT1QJCSdiJwkJLyogdXNlIGJvdHRvbSBzY3JvbGxiYXIgKi8KKyNkZWZpbmUgR09fQ09ORElBTE9HCSdjJwkJLyogdXNlIGNvbnNvbGUgZGlhbG9nICovCisjZGVmaW5lIEdPX0ZPUkcJCSdmJwkJLyogc3RhcnQgR1VJIGluIGZvcmVncm91bmQgKi8KKyNkZWZpbmUgR09fR1JFWQkJJ2cnCQkvKiB1c2UgZ3JleSBtZW51IGl0ZW1zICovCisjZGVmaW5lIEdPX0hPUlNDUk9MTAknaCcJCS8qIGZsZXhpYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nICovCisjZGVmaW5lIEdPX0lDT04JCSdpJwkJLyogdXNlIFZpbSBpY29uICovCisjZGVmaW5lIEdPX0xFRlQJCSdsJwkJLyogdXNlIGxlZnQgc2Nyb2xsYmFyICovCisjZGVmaW5lIEdPX1ZMRUZUCSdMJwkJLyogbGVmdCBzY3JvbGxiYXIgd2l0aCB2ZXJ0IHNwbGl0ICovCisjZGVmaW5lIEdPX01FTlVTCSdtJwkJLyogdXNlIG1lbnUgYmFyICovCisjZGVmaW5lIEdPX05PU1lTTUVOVQknTScJCS8qIGRvbid0IHNvdXJjZSBzeXN0ZW0gbWVudSAqLworI2RlZmluZSBHT19QT0lOVEVSCSdwJwkJLyogcG9pbnRlciBlbnRlci9sZWF2ZSBjYWxsYmFja3MgKi8KKyNkZWZpbmUgR09fUklHSFQJJ3InCQkvKiB1c2UgcmlnaHQgc2Nyb2xsYmFyICovCisjZGVmaW5lIEdPX1ZSSUdIVAknUicJCS8qIHJpZ2h0IHNjcm9sbGJhciB3aXRoIHZlcnQgc3BsaXQgKi8KKyNkZWZpbmUgR09fVEVBUk9GRgkndCcJCS8qIGFkZCB0ZWFyLW9mZiBtZW51IGl0ZW1zICovCisjZGVmaW5lIEdPX1RPT0xCQVIJJ1QnCQkvKiBhZGQgdG9vbGJhciAqLworI2RlZmluZSBHT19GT09URVIJJ0YnCQkvKiBhZGQgZm9vdGVyICovCisjZGVmaW5lIEdPX1ZFUlRJQ0FMCSd2JwkJLyogYXJyYW5nZSBkaWFsb2cgYnV0dG9ucyB2ZXJ0aWNhbGx5ICovCisjZGVmaW5lIEdPX0FMTAkJImFBYmNmRmdoaWxtTXBydFR2IiAvKiBhbGwgcG9zc2libGUgZmxhZ3MgZm9yICdnbycgKi8KKworLyogZmxhZ3MgZm9yICdjb21tZW50cycgb3B0aW9uICovCisjZGVmaW5lIENPTV9ORVNUCSduJwkJLyogY29tbWVudHMgc3RyaW5ncyBuZXN0ICovCisjZGVmaW5lIENPTV9CTEFOSwknYicJCS8qIG5lZWRzIGJsYW5rIGFmdGVyIHN0cmluZyAqLworI2RlZmluZSBDT01fU1RBUlQJJ3MnCQkvKiBzdGFydCBvZiBjb21tZW50ICovCisjZGVmaW5lIENPTV9NSURETEUJJ20nCQkvKiBtaWRkbGUgb2YgY29tbWVudCAqLworI2RlZmluZSBDT01fRU5ECQknZScJCS8qIGVuZCBvZiBjb21tZW50ICovCisjZGVmaW5lIENPTV9BVVRPX0VORAkneCcJCS8qIGxhc3QgY2hhciBvZiBlbmQgY2xvc2VzIGNvbW1lbnQgKi8KKyNkZWZpbmUgQ09NX0ZJUlNUCSdmJwkJLyogZmlyc3QgbGluZSBjb21tZW50IG9ubHkgKi8KKyNkZWZpbmUgQ09NX0xFRlQJJ2wnCQkvKiBsZWZ0IGFkanVzdGVkICovCisjZGVmaW5lIENPTV9SSUdIVAkncicJCS8qIHJpZ2h0IGFkanVzdGVkICovCisjZGVmaW5lIENPTV9OT0JBQ0sJJ08nCQkvKiBkb24ndCB1c2UgZm9yICJPIiBjb21tYW5kICovCisjZGVmaW5lIENPTV9BTEwJCSJuYnNtZXhmbHJPIgkvKiBhbGwgZmxhZ3MgZm9yICdjb21tZW50cycgb3B0aW9uICovCisjZGVmaW5lIENPTV9NQVhfTEVOCTUwCQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHBhcnQgKi8KKworLyogZmxhZ3MgZm9yICdzdGF0dXNsaW5lJyBvcHRpb24gKi8KKyNkZWZpbmUgU1RMX0ZJTEVQQVRICSdmJwkJLyogcGF0aCBvZiBmaWxlIGluIGJ1ZmZlciAqLworI2RlZmluZSBTVExfRlVMTFBBVEgJJ0YnCQkvKiBmdWxsIHBhdGggb2YgZmlsZSBpbiBidWZmZXIgKi8KKyNkZWZpbmUgU1RMX0ZJTEVOQU1FCSd0JwkJLyogbGFzdCBwYXJ0ICh0YWlsKSBvZiBmaWxlIHBhdGggKi8KKyNkZWZpbmUgU1RMX0NPTFVNTgknYycJCS8qIGNvbHVtbiBvZyBjdXJzb3IqLworI2RlZmluZSBTVExfVklSVENPTAkndicJCS8qIHZpcnR1YWwgY29sdW1uICovCisjZGVmaW5lIFNUTF9WSVJUQ09MX0FMVAknVicJCS8qIC0gd2l0aCAnaWYgZGlmZmVyZW50JyBkaXNwbGF5ICovCisjZGVmaW5lIFNUTF9MSU5FCSdsJwkJLyogbGluZSBudW1iZXIgb2YgY3Vyc29yICovCisjZGVmaW5lIFNUTF9OVU1MSU5FUwknTCcJCS8qIG51bWJlciBvZiBsaW5lcyBpbiBidWZmZXIgKi8KKyNkZWZpbmUgU1RMX0JVRk5PCSduJwkJLyogY3VycmVudCBidWZmZXIgbnVtYmVyICovCisjZGVmaW5lIFNUTF9LRVlNQVAJJ2snCQkvKiAna2V5bWFwJyB3aGVuIGFjdGl2ZSAqLworI2RlZmluZSBTVExfT0ZGU0VUCSdvJwkJLyogb2Zmc2V0IG9mIGNoYXJhY3RlciB1bmRlciBjdXJzb3IqLworI2RlZmluZSBTVExfT0ZGU0VUX1gJJ08nCQkvKiAtIGluIGhleGFkZWNpbWFsICovCisjZGVmaW5lIFNUTF9CWVRFVkFMCSdiJwkJLyogYnl0ZSB2YWx1ZSBvZiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgU1RMX0JZVEVWQUxfWAknQicJCS8qIC0gaW4gaGV4YWRlY2ltYWwgKi8KKyNkZWZpbmUgU1RMX1JPRkxBRwkncicJCS8qIHJlYWRvbmx5IGZsYWcgKi8KKyNkZWZpbmUgU1RMX1JPRkxBR19BTFQJJ1InCQkvKiAtIG90aGVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgU1RMX0hFTFBGTEFHCSdoJwkJLyogd2luZG93IGlzIHNob3dpbmcgYSBoZWxwIGZpbGUgKi8KKyNkZWZpbmUgU1RMX0hFTFBGTEFHX0FMVCAnSCcJCS8qIC0gb3RoZXIgZGlzcGxheSAqLworI2RlZmluZSBTVExfRklMRVRZUEUJJ3knCQkvKiAnZmlsZXR5cGUnICovCisjZGVmaW5lIFNUTF9GSUxFVFlQRV9BTFQgJ1knCQkvKiAtIG90aGVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgU1RMX1BSRVZJRVdGTEFHCSd3JwkJLyogd2luZG93IGlzIHNob3dpbmcgdGhlIHByZXZpZXcgYnVmICovCisjZGVmaW5lIFNUTF9QUkVWSUVXRkxBR19BTFQgJ1cnCQkvKiAtIG90aGVyIGRpc3BsYXkgKi8KKyNkZWZpbmUgU1RMX01PRElGSUVECSdtJwkJLyogbW9kaWZpZWQgZmxhZyAqLworI2RlZmluZSBTVExfTU9ESUZJRURfQUxUICdNJwkJLyogLSBvdGhlciBkaXNwbGF5ICovCisjZGVmaW5lIFNUTF9QRVJDRU5UQUdFCSdwJwkJLyogcGVyY2VudGFnZSB0aHJvdWdoIGZpbGUgKi8KKyNkZWZpbmUgU1RMX0FMVFBFUkNFTlQJJ1AnCQkvKiBwZXJjZW50YWdlIGFzIFRPUCBCT1QgQUxMIG9yIE5OJSAqLworI2RlZmluZSBTVExfQVJHTElTVFNUQVQJJ2EnCQkvKiBhcmd1bWVudCBsaXN0IHN0YXR1cyBhcyAoeCBvZiB5KSAqLworI2RlZmluZSBTVExfUEFHRU5VTQknTicJCS8qIHBhZ2UgbnVtYmVyICh3aGVuIHByaW50aW5nKSovCisjZGVmaW5lIFNUTF9WSU1fRVhQUgkneycJCS8qIHN0YXJ0IG9mIGV4cHJlc3Npb24gdG8gc3Vic3RpdHV0ZSAqLworI2RlZmluZSBTVExfTUlERExFTUFSSwknPScJCS8qIHNlcGFyYXRpb24gYmV0d2VlbiBsZWZ0IGFuZCByaWdodCAqLworI2RlZmluZSBTVExfVFJVTkNNQVJLCSc8JwkJLyogdHJ1bmNhdGlvbiBtYXJrIGlmIGxpbmUgaXMgdG9vIGxvbmcqLworI2RlZmluZSBTVExfSElHSExJR0hUCScqJwkJLyogaGlnaGxpZ2h0IGZyb20gKFVzZXIpMS4uOSBvciAwICovCisjZGVmaW5lIFNUTF9BTEwJCSgoY2hhcl91ICopICJmRnRjdlZsTGtub09iQnJSaEhtWXlXd01wUGFOeyIpCisKKy8qIGZsYWdzIHVzZWQgZm9yIHBhcnNlZCAnd2lsZG1vZGUnICovCisjZGVmaW5lIFdJTV9GVUxMCTEKKyNkZWZpbmUgV0lNX0xPTkdFU1QJMgorI2RlZmluZSBXSU1fTElTVAk0CisKKy8qIGFyZ3VtZW50cyBmb3IgY2FuX2JzKCkgKi8KKyNkZWZpbmUgQlNfSU5ERU5UCSdpJwkvKiAiSW5kZW50IiAqLworI2RlZmluZSBCU19FT0wJCSdvJwkvKiAiZU9sIiAqLworI2RlZmluZSBCU19TVEFSVAkncycJLyogIlN0YXJ0IiAqLworCisjZGVmaW5lIExJU1BXT1JEX1ZBTFVFCSJkZWZ1bixkZWZpbmUsZGVmbWFjcm8sc2V0ISxsYW1iZGEsaWYsY2FzZSxsZXQsZmxldCxsZXQqLGxldHJlYyxkbyxkbyosZGVmaW5lLXN5bnRheCxsZXQtc3ludGF4LGxldHJlYy1zeW50YXgsZGVzdHJ1Y3R1cmluZy1iaW5kLGRlZnBhY2thZ2UsZGVmcGFyYW1ldGVyLGRlZnN0cnVjdCxkZWZ0eXBlLGRlZnZhcixkby1hbGwtc3ltYm9scyxkby1leHRlcm5hbC1zeW1ib2xzLGRvLXN5bWJvbHMsZG9saXN0LGRvdGltZXMsZWNhc2UsZXR5cGVjYXNlLGV2YWwtd2hlbixsYWJlbHMsbWFjcm9sZXQsbXVsdGlwbGUtdmFsdWUtYmluZCxtdWx0aXBsZS12YWx1ZS1jYWxsLG11bHRpcGxlLXZhbHVlLXByb2cxLG11bHRpcGxlLXZhbHVlLXNldHEscHJvZzEscHJvZ3YsdHlwZWNhc2UsdW5sZXNzLHVud2luZC1wcm90ZWN0LHdoZW4sd2l0aC1pbnB1dC1mcm9tLXN0cmluZyx3aXRoLW9wZW4tZmlsZSx3aXRoLW9wZW4tc3RyZWFtLHdpdGgtb3V0cHV0LXRvLXN0cmluZyx3aXRoLXBhY2thZ2UtaXRlcmF0b3IsZGVmaW5lLWNvbmRpdGlvbixoYW5kbGVyLWJpbmQsaGFuZGxlci1jYXNlLHJlc3RhcnQtYmluZCxyZXN0YXJ0LWNhc2Usd2l0aC1zaW1wbGUtcmVzdGFydCxzdG9yZS12YWx1ZSx1c2UtdmFsdWUsbXVmZmxlLXdhcm5pbmcsYWJvcnQsY29udGludWUsd2l0aC1zbG90cyx3aXRoLXNsb3RzKix3aXRoLWFjY2Vzc29ycyx3aXRoLWFjY2Vzc29ycyosZGVmY2xhc3MsZGVmbWV0aG9kLHByaW50LXVucmVhZGFibGUtb2JqZWN0IgorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgYWN0dWFsIHZhcmlhYmFibGVzIGZvciB0aGUgb3B0aW9ucworICovCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorRVhURVJOIGxvbmcJcF9hbGVwaDsJLyogJ2FsZXBoJyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX05FVEJFQU5TX0lOVEcpIHx8IGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApCitFWFRFUk4gaW50CXBfYWNkOwkJLyogJ2F1dG9jaGRpcicgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKK0VYVEVSTiBjaGFyX3UJKnBfYW1idzsJLyogJ2FtYml3aWR0aCcgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKK0VYVEVSTiBpbnQJKnBfYW50aWFsaWFzOwkvKiAnYW50aWFsaWFzJyAqLworI2VuZGlmCitFWFRFUk4gaW50CXBfYXI7CQkvKiAnYXV0b3JlYWQnICovCitFWFRFUk4gaW50CXBfYXc7CQkvKiAnYXV0b3dyaXRlJyAqLworRVhURVJOIGludAlwX2F3YTsJCS8qICdhdXRvd3JpdGVhbGwnICovCitFWFRFUk4gY2hhcl91CSpwX2JzOwkJLyogJ2JhY2tzcGFjZScgKi8KK0VYVEVSTiBjaGFyX3UJKnBfYmc7CQkvKiAnYmFja2dyb3VuZCcgKi8KK0VYVEVSTiBpbnQJcF9iazsJCS8qICdiYWNrdXAnICovCitFWFRFUk4gY2hhcl91CSpwX2JrYzsJCS8qICdiYWNrdXBjb3B5JyAqLworRVhURVJOIHVuc2lnbmVkCWJrY19mbGFnczsKKyNpZmRlZiBJTl9PUFRJT05fQworc3RhdGljIGNoYXIgKihwX2JrY192YWx1ZXNbXSkgPSB7InllcyIsICJhdXRvIiwgIm5vIiwgImJyZWFrc3ltbGluayIsICJicmVha2hhcmRsaW5rIiwgTlVMTH07CisjZW5kaWYKKyMgZGVmaW5lIEJLQ19ZRVMJCTB4MDAxCisjIGRlZmluZSBCS0NfQVVUTwkJMHgwMDIKKyMgZGVmaW5lIEJLQ19OTwkJCTB4MDA0CisjIGRlZmluZSBCS0NfQlJFQUtTWU1MSU5LCTB4MDA4CisjIGRlZmluZSBCS0NfQlJFQUtIQVJETElOSwkweDAxMAorRVhURVJOIGNoYXJfdQkqcF9iZGlyOwkvKiAnYmFja3VwZGlyJyAqLworRVhURVJOIGNoYXJfdQkqcF9iZXg7CQkvKiAnYmFja3VwZXh0JyAqLworI2lmZGVmIEZFQVRfV0lMRElHTgorRVhURVJOIGNoYXJfdQkqcF9ic2s7CQkvKiAnYmFja3Vwc2tpcCcgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfQkVWQUwKK0VYVEVSTiBsb25nCXBfYmRsYXk7CS8qICdiYWxsb29uZGVsYXknICovCisjIGlmIGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApIHx8IGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKQorRVhURVJOIGludAlwX2JldmFsOwkvKiAnYmFsbG9vbmV2YWwnICovCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0JST1dTRQorRVhURVJOIGNoYXJfdQkqcF9ic2RpcjsJLyogJ2Jyb3dzZWRpcicgKi8KKyNlbmRpZgorI2lmZGVmIE1TRE9TCitFWFRFUk4gaW50CXBfYmlvc2s7CS8qICdiaW9za2V5JyAqLworRVhURVJOIGludAlwX2NvbnNrOwkvKiAnY29uc2tleScgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfTElORUJSRUFLCitFWFRFUk4gY2hhcl91CSpwX2JyZWFrYXQ7CS8qICdicmVha2F0JyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX2NtcDsJCS8qICdjYXNlbWFwJyAqLworRVhURVJOIHVuc2lnbmVkCWNtcF9mbGFnczsKKyNpZmRlZiBJTl9PUFRJT05fQworc3RhdGljIGNoYXIgKihwX2NtcF92YWx1ZXNbXSkgPSB7ImludGVybmFsIiwgImtlZXBhc2NpaSIsIE5VTEx9OworI2VuZGlmCisjZGVmaW5lIENNUF9JTlRFUk5BTAkJMHgwMDEKKyNkZWZpbmUgQ01QX0tFRVBBU0NJSQkJMHgwMDIKKyNpZmRlZiBGRUFUX01CWVRFCitFWFRFUk4gY2hhcl91CSpwX2VuYzsJCS8qICdlbmNvZGluZycgKi8KK0VYVEVSTiBpbnQJcF9kZWNvOwkJLyogJ2RlbGNvbWJpbmUnICovCisjIGlmZGVmIEZFQVRfRVZBTAorRVhURVJOIGNoYXJfdQkqcF9jY3Y7CQkvKiAnY2hhcmNvbnZlcnQnICovCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NNRFdJTgorRVhURVJOIGNoYXJfdQkqcF9jZWRpdDsJLyogJ2NlZGl0JyAqLworRVhURVJOIGxvbmcJcF9jd2g7CQkvKiAnY21kd2luaGVpZ2h0JyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKK0VYVEVSTiBjaGFyX3UJKnBfY2I7CQkvKiAnY2xpcGJvYXJkJyAqLworRVhURVJOIGludAljbGlwX3VubmFtZWQgSU5JVCg9IEZBTFNFKTsKK0VYVEVSTiBpbnQJY2xpcF9hdXRvc2VsZWN0IElOSVQoPSBGQUxTRSk7CitFWFRFUk4gaW50CWNsaXBfYXV0b3NlbGVjdG1sIElOSVQoPSBGQUxTRSk7CitFWFRFUk4gcmVncHJvZ19UICpjbGlwX2V4Y2x1ZGVfcHJvZyBJTklUKD0gTlVMTCk7CisjZW5kaWYKK0VYVEVSTiBsb25nCXBfY2g7CQkvKiAnY21kaGVpZ2h0JyAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKK0VYVEVSTiBpbnQJcF9jb25maXJtOwkvKiAnY29uZmlybScgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX2NwOwkJLyogJ2NvbXBhdGlibGUnICovCitFWFRFUk4gY2hhcl91CSpwX2NwbzsJCS8qICdjcG9wdGlvbnMnICovCisjaWZkZWYgRkVBVF9DU0NPUEUKK0VYVEVSTiBjaGFyX3UJKnBfY3Nwcmc7CS8qICdjc2NvcGVwcmcnICovCisjIGlmZGVmIEZFQVRfUVVJQ0tGSVgKK0VYVEVSTiBjaGFyX3UJKnBfY3NxZjsJLyogJ2NzY29wZXF1aWNrZml4JyAqLworIyAgZGVmaW5lCUNTUUZfQ01EUyAgICJzZ2RjdGVmaSIKKyMgIGRlZmluZQlDU1FGX0ZMQUdTICAiKy0wIgorIyBlbmRpZgorRVhURVJOIGludAlwX2NzdDsJCS8qICdjc2NvcGV0YWcnICovCitFWFRFUk4gbG9uZwlwX2NzdG87CQkvKiAnY3Njb3BldGFnb3JkZXInICovCitFWFRFUk4gbG9uZwlwX2NzcGM7CQkvKiAnY3Njb3BlcGF0aGNvbXAnICovCitFWFRFUk4gaW50CXBfY3N2ZXJib3NlOwkvKiAnY3Njb3BldmVyYm9zZScgKi8KKyNlbmRpZgorRVhURVJOIGNoYXJfdQkqcF9kZWJ1ZzsJLyogJ2RlYnVnJyAqLworI2lmZGVmIEZFQVRfRklORF9JRAorRVhURVJOIGNoYXJfdQkqcF9kZWY7CQkvKiAnZGVmaW5lJyAqLworRVhURVJOIGNoYXJfdQkqcF9pbmM7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJRkYKK0VYVEVSTiBjaGFyX3UJKnBfZGlwOwkJLyogJ2RpZmZvcHQnICovCisjIGlmZGVmIEZFQVRfRVZBTAorRVhURVJOIGNoYXJfdQkqcF9kZXg7CQkvKiAnZGlmZmV4cHInICovCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKK0VYVEVSTiBjaGFyX3UJKnBfZGljdDsJLyogJ2RpY3Rpb25hcnknICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJR1JBUEhTCitFWFRFUk4gaW50CXBfZGc7CQkvKiAnZGlncmFwaCcgKi8KKyNlbmRpZgorRVhURVJOIGNoYXJfdQkqcF9kaXI7CQkvKiAnZGlyZWN0b3J5JyAqLworRVhURVJOIGNoYXJfdQkqcF9keTsJCS8qICdkaXNwbGF5JyAqLworRVhURVJOIHVuc2lnbmVkCWR5X2ZsYWdzOworI2lmZGVmIElOX09QVElPTl9DCitzdGF0aWMgY2hhciAqKHBfZHlfdmFsdWVzW10pID0geyJsYXN0bGluZSIsICJ1aGV4IiwgTlVMTH07CisjZW5kaWYKKyNkZWZpbmUgRFlfTEFTVExJTkUJCTB4MDAxCisjZGVmaW5lIERZX1VIRVgJCQkweDAwMgorRVhURVJOIGludAlwX2VkOwkJLyogJ2VkY29tcGF0aWJsZScgKi8KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorRVhURVJOIGNoYXJfdQkqcF9lYWQ7CQkvKiAnZWFkaXJlY3Rpb24nICovCisjZW5kaWYKK0VYVEVSTiBpbnQJcF9lYTsJCS8qICdlcXVhbGFsd2F5cycgKi8KK0VYVEVSTiBjaGFyX3UJKnBfZXA7CQkvKiAnZXF1YWxwcmcnICovCitFWFRFUk4gaW50CXBfZWI7CQkvKiAnZXJyb3JiZWxscycgKi8KKyNpZmRlZiBGRUFUX1FVSUNLRklYCitFWFRFUk4gY2hhcl91CSpwX2VmOwkJLyogJ2Vycm9yZmlsZScgKi8KK0VYVEVSTiBjaGFyX3UJKnBfZWZtOwkJLyogJ2Vycm9yZm9ybWF0JyAqLworRVhURVJOIGNoYXJfdQkqcF9nZWZtOwkvKiAnZ3JlcGZvcm1hdCcgKi8KK0VYVEVSTiBjaGFyX3UJKnBfZ3A7CQkvKiAnZ3JlcHByZycgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfQVVUT0NNRAorRVhURVJOIGNoYXJfdQkqcF9laTsJCS8qICdldmVudGlnbm9yZScgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX2VrOwkJLyogJ2VzY2tleXMnICovCitFWFRFUk4gaW50CXBfZXhyYzsJCS8qICdleHJjJyAqLworI2lmZGVmIEZFQVRfTUJZVEUKK0VYVEVSTiBjaGFyX3UJKnBfZmVuY3M7CS8qICdmaWxlZW5jb2RpbmdzJyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX2ZmczsJCS8qICdmaWxlZm9ybWF0cycgKi8KKyNpZmRlZiBGRUFUX0ZPTERJTkcKK0VYVEVSTiBjaGFyX3UJKnBfZmNsOwkJLyogJ2ZvbGRjbG9zZScgKi8KK0VYVEVSTiBsb25nCXBfZmRsczsJCS8qICdmb2xkbGV2ZWxzdGFydCcgKi8KK0VYVEVSTiBjaGFyX3UJKnBfZmRvOwkJLyogJ2ZvbGRvcGVuJyAqLworRVhURVJOIHVuc2lnbmVkCWZkb19mbGFnczsKKyMgaWZkZWYgSU5fT1BUSU9OX0MKK3N0YXRpYyBjaGFyICoocF9mZG9fdmFsdWVzW10pID0geyJhbGwiLCAiYmxvY2siLCAiaG9yIiwgIm1hcmsiLCAicGVyY2VudCIsCisJCQkJICJxdWlja2ZpeCIsICJzZWFyY2giLCAidGFnIiwgImluc2VydCIsCisJCQkJICJ1bmRvIiwgImp1bXAiLCBOVUxMfTsKKyMgZW5kaWYKKyMgZGVmaW5lIEZET19BTEwJCTB4MDAxCisjIGRlZmluZSBGRE9fQkxPQ0sJCTB4MDAyCisjIGRlZmluZSBGRE9fSE9SCQkweDAwNAorIyBkZWZpbmUgRkRPX01BUksJCTB4MDA4CisjIGRlZmluZSBGRE9fUEVSQ0VOVAkJMHgwMTAKKyMgZGVmaW5lIEZET19RVUlDS0ZJWAkJMHgwMjAKKyMgZGVmaW5lIEZET19TRUFSQ0gJCTB4MDQwCisjIGRlZmluZSBGRE9fVEFHCQkweDA4MAorIyBkZWZpbmUgRkRPX0lOU0VSVAkJMHgxMDAKKyMgZGVmaW5lIEZET19VTkRPCQkweDIwMAorIyBkZWZpbmUgRkRPX0pVTVAJCTB4NDAwCisjZW5kaWYKK0VYVEVSTiBjaGFyX3UJKnBfZnA7CQkvKiAnZm9ybWF0cHJnJyAqLworRVhURVJOIGludAlwX2dkOwkJLyogJ2dkZWZhdWx0JyAqLworI2lmZGVmIEZFQVRfUFJJTlRFUgorRVhURVJOIGNoYXJfdQkqcF9wZGV2OwkvKiAncHJpbnRkZXZpY2UnICovCisjIGlmZGVmIEZFQVRfUE9TVFNDUklQVAorRVhURVJOIGNoYXJfdQkqcF9wZW5jOwkvKiAncHJpbnRlbmNvZGluZycgKi8KK0VYVEVSTiBjaGFyX3UJKnBfcGV4cHI7CS8qICdwcmludGV4cHInICovCisjIGVuZGlmCitFWFRFUk4gY2hhcl91CSpwX3BmbjsJCS8qICdwcmludGZvbnQnICovCitFWFRFUk4gY2hhcl91CSpwX3BvcHQ7CS8qICdwcmludG9wdGlvbnMnICovCitFWFRFUk4gY2hhcl91CSpwX2hlYWRlcjsJLyogJ3ByaW50aGVhZGVyJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUkKK0VYVEVSTiBjaGFyX3UJKnBfZ3VpZm9udDsJLyogJ2d1aWZvbnQnICovCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKK0VYVEVSTiBjaGFyX3UJKnBfZ3VpZm9udHNldDsJLyogJ2d1aWZvbnRzZXQnICovCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTUJZVEUKK0VYVEVSTiBjaGFyX3UJKnBfZ3VpZm9udHdpZGU7CS8qICdndWlmb250d2lkZScgKi8KKyMgZW5kaWYKK0VYVEVSTiBpbnQJcF9ndWlwdHk7CS8qICdndWlwdHknICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9YMTEpCitFWFRFUk4gbG9uZwlwX2docjsJCS8qICdndWloZWFkcm9vbScgKi8KKyNlbmRpZgorI2lmZGVmIENVUlNPUl9TSEFQRQorRVhURVJOIGNoYXJfdQkqcF9ndWljdXJzb3I7CS8qICdndWljdXJzb3InICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX01PVVNFU0hBUEUKK0VYVEVSTiBjaGFyX3UJKnBfbW91c2VzaGFwZTsJLyogJ21vdXNlc2hhcGUnICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKQorRVhURVJOIGNoYXJfdQkqcF9nbzsJCS8qICdndWlvcHRpb25zJyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX2hmOwkJLyogJ2hlbHBmaWxlJyAqLworI2lmZGVmIEZFQVRfV0lORE9XUworRVhURVJOIGxvbmcJcF9oaDsJCS8qICdoZWxwaGVpZ2h0JyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCitFWFRFUk4gY2hhcl91CSpwX2hsZzsJCS8qICdoZWxwbGFuZycgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX2hpZDsJCS8qICdoaWRkZW4nICovCisvKiBVc2UgUF9ISUQgdG8gY2hlY2sgaWYgYSBidWZmZXIgaXMgdG8gYmUgaGlkZGVuIHdoZW4gaXQgaXMgbm8gbG9uZ2VyCisgKiB2aXNpYmxlIGluIGEgd2luZG93LiAqLworI2lmbmRlZiBGRUFUX1FVSUNLRklYCisjIGRlZmluZSBQX0hJRChkdW1teSkgKHBfaGlkIHx8IGNtZG1vZC5oaWRlKQorI2Vsc2UKKyMgZGVmaW5lIFBfSElEKGJ1ZikgKGJ1Zl9oaWRlKGJ1ZikpCisjZW5kaWYKK0VYVEVSTiBjaGFyX3UJKnBfaGw7CQkvKiAnaGlnaGxpZ2h0JyAqLworRVhURVJOIGludAlwX2hsczsJCS8qICdobHNlYXJjaCcgKi8KK0VYVEVSTiBsb25nCXBfaGk7CQkvKiAnaGlzdG9yeScgKi8KKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorRVhURVJOIGludAlwX2hrbWFwOwkvKiAnaGttYXAnICovCitFWFRFUk4gaW50CXBfaGttYXBwOwkvKiAnaGttYXBwJyAqLworIyBpZmRlZiBGRUFUX0ZLTUFQCitFWFRFUk4gaW50CXBfZmttYXA7CS8qICdma21hcCcgKi8KK0VYVEVSTiBpbnQJcF9hbHRrZXltYXA7CS8qICdhbHRrZXltYXAnICovCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfQVJBQklDCitFWFRFUk4gaW50CXBfYXJzaGFwZTsJLyogJ2FyYWJpY3NoYXBlJyAqLworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9USVRMRQorRVhURVJOIGludAlwX2ljb247CQkvKiAnaWNvbicgKi8KK0VYVEVSTiBjaGFyX3UJKnBfaWNvbnN0cmluZzsJLyogJ2ljb25zdHJpbmcnICovCisjZW5kaWYKK0VYVEVSTiBpbnQJcF9pYzsJCS8qICdpZ25vcmVjYXNlJyAqLworI2lmIGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKQorRVhURVJOIGNoYXJfdQkqcF9pbWFrOwkvKiAnaW1hY3RpdmF0ZWtleScgKi8KKyNlbmRpZgorI2lmZGVmIFVTRV9JTV9DT05UUk9MCitFWFRFUk4gaW50CXBfaW1jbWRsaW5lOwkvKiAnaW1jbWRsaW5lJyAqLworRVhURVJOIGludAlwX2ltZGlzYWJsZTsJLyogJ2ltZGlzYWJsZScgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX2lzOwkJLyogJ2luY3NlYXJjaCcgKi8KK0VYVEVSTiBpbnQJcF9pbTsJCS8qICdpbnNlcnRtb2RlJyAqLworRVhURVJOIGNoYXJfdQkqcF9pc2Y7CQkvKiAnaXNmbmFtZScgKi8KK0VYVEVSTiBjaGFyX3UJKnBfaXNpOwkJLyogJ2lzaWRlbnQnICovCitFWFRFUk4gY2hhcl91CSpwX2lzcDsJCS8qICdpc3ByaW50JyAqLworRVhURVJOIGludAlwX2pzOwkJLyogJ2pvaW5zcGFjZXMnICovCitFWFRFUk4gY2hhcl91CSpwX2twOwkJLyogJ2tleXdvcmRwcmcnICovCisjaWZkZWYgRkVBVF9WSVNVQUwKK0VYVEVSTiBjaGFyX3UJKnBfa207CQkvKiAna2V5bW9kZWwnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xBTkdNQVAKK0VYVEVSTiBjaGFyX3UJKnBfbGFuZ21hcDsJLyogJ2xhbmdtYXAnKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9NRU5VKSAmJiBkZWZpbmVkKEZFQVRfTVVMVElfTEFORykKK0VYVEVSTiBjaGFyX3UJKnBfbG07CQkvKiAnbGFuZ21lbnUnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorRVhURVJOIGxvbmcJcF9saW5lc3BhY2U7CS8qICdsaW5lc3BhY2UnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJU1AKK0VYVEVSTiBjaGFyX3UJKnBfbGlzcHdvcmRzOwkvKiAnbGlzcHdvcmRzJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9XSU5ET1dTCitFWFRFUk4gbG9uZwlwX2xzOwkJLyogJ2xhc3RzdGF0dXMnICovCisjZW5kaWYKK0VYVEVSTiBjaGFyX3UJKnBfbGNzOwkJLyogJ2xpc3RjaGFycycgKi8KKworRVhURVJOIGludAlwX2x6OwkJLyogJ2xhenlyZWRyYXcnICovCitFWFRFUk4gaW50CXBfbHBsOwkJLyogJ2xvYWRwbHVnaW5zJyAqLworRVhURVJOIGludAlwX21hZ2ljOwkvKiAnbWFnaWMnICovCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorRVhURVJOIGNoYXJfdQkqcF9tZWY7CQkvKiAnbWFrZWVmJyAqLworRVhURVJOIGNoYXJfdQkqcF9tcDsJCS8qICdtYWtlcHJnJyAqLworI2VuZGlmCitFWFRFUk4gbG9uZwlwX21hdDsJCS8qICdtYXRjaHRpbWUnICovCisjaWZkZWYgRkVBVF9FVkFMCitFWFRFUk4gbG9uZwlwX21mZDsJCS8qICdtYXhmdW5jZGVwdGgnICovCisjZW5kaWYKK0VYVEVSTiBsb25nCXBfbW1kOwkJLyogJ21heG1hcGRlcHRoJyAqLworRVhURVJOIGxvbmcJcF9tbTsJCS8qICdtYXhtZW0nICovCitFWFRFUk4gbG9uZwlwX21tdDsJCS8qICdtYXhtZW10b3QnICovCisjaWZkZWYgRkVBVF9NRU5VCitFWFRFUk4gbG9uZwlwX21pczsJCS8qICdtZW51aXRlbXMnICovCisjZW5kaWYKK0VYVEVSTiBsb25nCXBfbWxzOwkJLyogJ21vZGVsaW5lcycgKi8KK0VYVEVSTiBjaGFyX3UJKnBfbW91c2U7CS8qICdtb3VzZScgKi8KKyNpZmRlZiBGRUFUX0dVSQorRVhURVJOIGludAlwX21vdXNlZjsJLyogJ21vdXNlZm9jdXMnICovCitFWFRFUk4gaW50CXBfbWg7CQkvKiAnbW91c2VoaWRlJyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX21vdXNlbTsJLyogJ21vdXNlbW9kZWwnICovCitFWFRFUk4gbG9uZwlwX21vdXNldDsJLyogJ21vdXNldGltZScgKi8KK0VYVEVSTiBpbnQJcF9tb3JlOwkJLyogJ21vcmUnICovCitFWFRFUk4gY2hhcl91CSpwX3BhcmE7CS8qICdwYXJhZ3JhcGhzJyAqLworRVhURVJOIGludAlwX3Bhc3RlOwkvKiAncGFzdGUnICovCitFWFRFUk4gY2hhcl91CSpwX3B0OwkJLyogJ3Bhc3RldG9nZ2xlJyAqLworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKEZFQVRfRElGRikKK0VYVEVSTiBjaGFyX3UJKnBfcGV4OwkJLyogJ3BhdGNoZXhwcicgKi8KKyNlbmRpZgorRVhURVJOIGNoYXJfdQkqcF9wbTsJCS8qICdwYXRjaG1vZGUnICovCitFWFRFUk4gY2hhcl91CSpwX3BhdGg7CS8qICdwYXRoJyAqLworI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorRVhURVJOIGNoYXJfdQkqcF9jZHBhdGg7CS8qICdjZHBhdGgnICovCisjZW5kaWYKK0VYVEVSTiBpbnQJcF9yZW1hcDsJLyogJ3JlbWFwJyAqLworRVhURVJOIGxvbmcJcF9yZXBvcnQ7CS8qICdyZXBvcnQnICovCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKK0VYVEVSTiBsb25nCXBfcHZoOwkJLyogJ3ByZXZpZXdoZWlnaHQnICovCisjZW5kaWYKKyNpZmRlZiBXSU4zMjY0CitFWFRFUk4gaW50CXBfcnM7CQkvKiAncmVzdG9yZXNjcmVlbicgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfUklHSFRMRUZUCitFWFRFUk4gaW50CXBfYXJpOwkJLyogJ2FsbG93cmV2aW5zJyAqLworRVhURVJOIGludAlwX3JpOwkJLyogJ3JldmlucycgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfQ01ETF9JTkZPCitFWFRFUk4gaW50CXBfcnU7CQkvKiAncnVsZXInICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NUTF9PUFQKK0VYVEVSTiBjaGFyX3UJKnBfcnVmOwkJLyogJ3J1bGVyZm9ybWF0JyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX3J0cDsJCS8qICdydW50aW1lcGF0aCcgKi8KK0VYVEVSTiBsb25nCXBfc2o7CQkvKiAnc2Nyb2xsanVtcCcgKi8KK0VYVEVSTiBsb25nCXBfc287CQkvKiAnc2Nyb2xsb2ZmJyAqLworI2lmZGVmIEZFQVRfU0NST0xMQklORAorRVhURVJOIGNoYXJfdQkqcF9zYm87CQkvKiAnc2Nyb2xsb3B0JyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX3NlY3Rpb25zOwkvKiAnc2VjdGlvbnMnICovCitFWFRFUk4gaW50CXBfc2VjdXJlOwkvKiAnc2VjdXJlJyAqLworI2lmZGVmIEZFQVRfVklTVUFMCitFWFRFUk4gY2hhcl91CSpwX3NlbDsJCS8qICdzZWxlY3Rpb24nICovCitFWFRFUk4gY2hhcl91CSpwX3NsbTsJCS8qICdzZWxlY3Rtb2RlJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9TRVNTSU9OCitFWFRFUk4gY2hhcl91CSpwX3Nzb3A7CS8qICdzZXNzaW9ub3B0aW9ucycgKi8KK0VYVEVSTiB1bnNpZ25lZAlzc29wX2ZsYWdzOworIyBpZmRlZiBJTl9PUFRJT05fQworLyogQWxzbyB1c2VkIGZvciAndmlld29wdGlvbnMnISAqLworc3RhdGljIGNoYXIgKihwX3Nzb3BfdmFsdWVzW10pID0geyJidWZmZXJzIiwgIndpbnBvcyIsICJyZXNpemUiLCAid2luc2l6ZSIsCisgICAgImxvY2Fsb3B0aW9ucyIsICJvcHRpb25zIiwgImhlbHAiLCAiYmxhbmsiLCAiZ2xvYmFscyIsICJzbGFzaCIsICJ1bml4IiwKKyAgICAic2VzZGlyIiwgImN1cmRpciIsICJmb2xkcyIsICJjdXJzb3IiLCBOVUxMfTsKKyMgZW5kaWYKKyMgZGVmaW5lIFNTT1BfQlVGRkVSUwkJMHgwMDEKKyMgZGVmaW5lIFNTT1BfV0lOUE9TCQkweDAwMgorIyBkZWZpbmUgU1NPUF9SRVNJWkUJCTB4MDA0CisjIGRlZmluZSBTU09QX1dJTlNJWkUJCTB4MDA4CisjIGRlZmluZSBTU09QX0xPQ0FMT1BUSU9OUwkweDAxMAorIyBkZWZpbmUgU1NPUF9PUFRJT05TCQkweDAyMAorIyBkZWZpbmUgU1NPUF9IRUxQCQkweDA0MAorIyBkZWZpbmUgU1NPUF9CTEFOSwkJMHgwODAKKyMgZGVmaW5lIFNTT1BfR0xPQkFMUwkJMHgxMDAKKyMgZGVmaW5lIFNTT1BfU0xBU0gJCTB4MjAwCisjIGRlZmluZSBTU09QX1VOSVgJCTB4NDAwCisjIGRlZmluZSBTU09QX1NFU0RJUgkJMHg4MDAKKyMgZGVmaW5lIFNTT1BfQ1VSRElSCQkweDEwMDAKKyMgZGVmaW5lIFNTT1BfRk9MRFMJCTB4MjAwMAorIyBkZWZpbmUgU1NPUF9DVVJTT1IJCTB4NDAwMAorI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX3NoOwkJLyogJ3NoZWxsJyAqLworRVhURVJOIGNoYXJfdQkqcF9zaGNmOwkvKiAnc2hlbGxjbWRmbGFnJyAqLworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKK0VYVEVSTiBjaGFyX3UJKnBfc3A7CQkvKiAnc2hlbGxwaXBlJyAqLworI2VuZGlmCitFWFRFUk4gY2hhcl91CSpwX3NocTsJCS8qICdzaGVsbHF1b3RlJyAqLworRVhURVJOIGNoYXJfdQkqcF9zeHE7CQkvKiAnc2hlbGx4cXVvdGUnICovCitFWFRFUk4gY2hhcl91CSpwX3NycjsJCS8qICdzaGVsbHJlZGlyJyAqLworI2lmZGVmIEFNSUdBCitFWFRFUk4gbG9uZwlwX3N0OwkJLyogJ3NoZWxsdHlwZScgKi8KKyNlbmRpZgorI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorRVhURVJOIGludAlwX3NzbDsJCS8qICdzaGVsbHNsYXNoJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9TVExfT1BUCitFWFRFUk4gY2hhcl91CSpwX3N0bDsJCS8qICdzdGF0dXNsaW5lJyAqLworI2VuZGlmCitFWFRFUk4gaW50CXBfc3I7CQkvKiAnc2hpZnRyb3VuZCcgKi8KK0VYVEVSTiBjaGFyX3UJKnBfc2htOwkJLyogJ3Nob3J0bWVzcycgKi8KKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworRVhURVJOIGNoYXJfdQkqcF9zYnI7CQkvKiAnc2hvd2JyZWFrJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KK0VYVEVSTiBpbnQJcF9zYzsJCS8qICdzaG93Y21kJyAqLworI2VuZGlmCitFWFRFUk4gaW50CXBfc2Z0OwkJLyogJ3Nob3dmdWxsdGFnJyAqLworRVhURVJOIGludAlwX3NtOwkJLyogJ3Nob3dtYXRjaCcgKi8KK0VYVEVSTiBpbnQJcF9zbWQ7CQkvKiAnc2hvd21vZGUnICovCitFWFRFUk4gbG9uZwlwX3NzOwkJLyogJ3NpZGVzY3JvbGwnICovCitFWFRFUk4gbG9uZwlwX3Npc287CQkvKiAnc2lkZXNjcm9sbG9mZicgKi8KK0VYVEVSTiBpbnQJcF9zY3M7CQkvKiAnc21hcnRjYXNlJyAqLworRVhURVJOIGludAlwX3N0YTsJCS8qICdzbWFydHRhYicgKi8KKyNpZmRlZiBGRUFUX1dJTkRPV1MKK0VYVEVSTiBpbnQJcF9zYjsJCS8qICdzcGxpdGJlbG93JyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK0VYVEVSTiBpbnQJcF9zcHI7CQkvKiAnc3BsaXRyaWdodCcgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX3NvbDsJCS8qICdzdGFydG9mbGluZScgKi8KK0VYVEVSTiBjaGFyX3UJKnBfc3U7CQkvKiAnc3VmZml4ZXMnICovCitFWFRFUk4gY2hhcl91CSpwX3N3czsJCS8qICdzd2Fwc3luYycgKi8KK0VYVEVSTiBjaGFyX3UJKnBfc3diOwkJLyogJ3N3aXRjaGJ1ZicgKi8KK0VYVEVSTiBpbnQJcF90YnM7CQkvKiAndGFnYnNlYXJjaCcgKi8KK0VYVEVSTiBsb25nCXBfdGw7CQkvKiAndGFnbGVuZ3RoJyAqLworRVhURVJOIGludAlwX3RyOwkJLyogJ3RhZ3JlbGF0aXZlJyAqLworRVhURVJOIGNoYXJfdQkqcF90YWdzOwkvKiAndGFncycgKi8KK0VYVEVSTiBpbnQJcF90Z3N0OwkJLyogJ3RhZ3N0YWNrJyAqLworI2lmZGVmIEZFQVRfQVJBQklDCitFWFRFUk4gaW50CXBfdGJpZGk7CS8qICd0ZXJtYmlkaScgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKK0VYVEVSTiBjaGFyX3UJKnBfdGVuYzsJLyogJ3Rlcm1lbmNvZGluZycgKi8KKyNlbmRpZgorRVhURVJOIGludAlwX3RlcnNlOwkvKiAndGVyc2UnICovCitFWFRFUk4gaW50CXBfdGE7CQkvKiAndGV4dGF1dG8nICovCitFWFRFUk4gaW50CXBfdG87CQkvKiAndGlsZGVvcCcgKi8KK0VYVEVSTiBpbnQJcF90aW1lb3V0OwkvKiAndGltZW91dCcgKi8KK0VYVEVSTiBsb25nCXBfdG07CQkvKiAndGltZW91dGxlbicgKi8KKyNpZmRlZiBGRUFUX1RJVExFCitFWFRFUk4gaW50CXBfdGl0bGU7CS8qICd0aXRsZScgKi8KK0VYVEVSTiBsb25nCXBfdGl0bGVsZW47CS8qICd0aXRsZWxlbicgKi8KK0VYVEVSTiBjaGFyX3UJKnBfdGl0bGVvbGQ7CS8qICd0aXRsZW9sZCcgKi8KK0VYVEVSTiBjaGFyX3UJKnBfdGl0bGVzdHJpbmc7CS8qICd0aXRsZXN0cmluZycgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorRVhURVJOIGNoYXJfdQkqcF90c3I7CQkvKiAndGhlc2F1cnVzJyAqLworI2VuZGlmCitFWFRFUk4gaW50CXBfdHRpbWVvdXQ7CS8qICd0dGltZW91dCcgKi8KK0VYVEVSTiBsb25nCXBfdHRtOwkJLyogJ3R0aW1lb3V0bGVuJyAqLworRVhURVJOIGludAlwX3RiaTsJCS8qICd0dHlidWlsdGluJyAqLworRVhURVJOIGludAlwX3RmOwkJLyogJ3R0eWZhc3QnICovCisjaWYgZGVmaW5lZChGRUFUX1RPT0xCQVIpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKK0VYVEVSTiBjaGFyX3UJKnBfdG9vbGJhcjsJLyogJ3Rvb2xiYXInICovCitFWFRFUk4gdW5zaWduZWQgdG9vbGJhcl9mbGFnczsKKyMgaWZkZWYgSU5fT1BUSU9OX0MKK3N0YXRpYyBjaGFyICoocF90b29sYmFyX3ZhbHVlc1tdKSA9IHsidGV4dCIsICJpY29ucyIsICJ0b29sdGlwcyIsICJob3JpeiIsIE5VTEx9OworIyBlbmRpZgorIyBkZWZpbmUgVE9PTEJBUl9URVhUCQkweDAxCisjIGRlZmluZSBUT09MQkFSX0lDT05TCQkweDAyCisjIGRlZmluZSBUT09MQkFSX1RPT0xUSVBTCTB4MDQKKyMgZGVmaW5lIFRPT0xCQVJfSE9SSVoJCTB4MDgKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9UT09MQkFSKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgJiYgZGVmaW5lZChIQVZFX0dUSzIpCitFWFRFUk4gY2hhcl91CSpwX3RiaXM7CS8qICd0b29sYmFyaWNvbnNpemUnICovCitFWFRFUk4gdW5zaWduZWQgdGJpc19mbGFnczsKKyMgaWZkZWYgSU5fT1BUSU9OX0MKK3N0YXRpYyBjaGFyICoocF90YmlzX3ZhbHVlc1tdKSA9IHsidGlueSIsICJzbWFsbCIsICJtZWRpdW0iLCAibGFyZ2UiLCBOVUxMfTsKKyMgZW5kaWYKKyMgZGVmaW5lIFRCSVNfVElOWQkJMHgwMQorIyBkZWZpbmUgVEJJU19TTUFMTAkJMHgwMgorIyBkZWZpbmUgVEJJU19NRURJVU0JCTB4MDQKKyMgZGVmaW5lIFRCSVNfTEFSR0UJCTB4MDgKKyNlbmRpZgorRVhURVJOIGxvbmcJcF90dHlzY3JvbGw7CS8qICd0dHlzY3JvbGwnICovCisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykpCitFWFRFUk4gY2hhcl91CSpwX3R0eW07CS8qICd0dHltb3VzZScgKi8KK0VYVEVSTiB1bnNpZ25lZCB0dHltX2ZsYWdzOworIyBpZmRlZiBJTl9PUFRJT05fQworc3RhdGljIGNoYXIgKihwX3R0eW1fdmFsdWVzW10pID0geyJ4dGVybSIsICJ4dGVybTIiLCAiZGVjIiwgIm5ldHRlcm0iLCAianNidGVybSIsICJwdGVybSIsIE5VTEx9OworIyBlbmRpZgorIyBkZWZpbmUgVFRZTV9YVEVSTQkJMHgwMQorIyBkZWZpbmUgVFRZTV9YVEVSTTIJCTB4MDIKKyMgZGVmaW5lIFRUWU1fREVDCQkweDA0CisjIGRlZmluZSBUVFlNX05FVFRFUk0JCTB4MDgKKyMgZGVmaW5lIFRUWU1fSlNCVEVSTQkJMHgxMAorIyBkZWZpbmUgVFRZTV9QVEVSTQkJMHgyMAorI2VuZGlmCitFWFRFUk4gbG9uZwlwX3VsOwkJLyogJ3VuZG9sZXZlbHMnICovCitFWFRFUk4gbG9uZwlwX3VjOwkJLyogJ3VwZGF0ZWNvdW50JyAqLworRVhURVJOIGxvbmcJcF91dDsJCS8qICd1cGRhdGV0aW1lJyAqLworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKEZFQVRfRk9MRElORykKK0VYVEVSTiBjaGFyX3UJKnBfZmNzOwkJLyogJ2ZpbGxjaGFyJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9WSU1JTkZPCitFWFRFUk4gY2hhcl91CSpwX3ZpbWluZm87CS8qICd2aW1pbmZvJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9TRVNTSU9OCitFWFRFUk4gY2hhcl91CSpwX3ZkaXI7CS8qICd2aWV3ZGlyJyAqLworRVhURVJOIGNoYXJfdQkqcF92b3A7CQkvKiAndmlld29wdGlvbnMnICovCitFWFRFUk4gdW5zaWduZWQJdm9wX2ZsYWdzOwkvKiB1c2VzIFNTT1BfIGZsYWdzICovCisjZW5kaWYKK0VYVEVSTiBpbnQJcF92YjsJCS8qICd2aXN1YWxiZWxsJyAqLworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKK0VYVEVSTiBjaGFyX3UJKnBfdmU7CQkvKiAndmlydHVhbGVkaXQnICovCitFWFRFUk4gdW5zaWduZWQgdmVfZmxhZ3M7CisjIGlmZGVmIElOX09QVElPTl9DCitzdGF0aWMgY2hhciAqKHBfdmVfdmFsdWVzW10pID0geyJibG9jayIsICJpbnNlcnQiLCAiYWxsIiwgTlVMTH07CisjIGVuZGlmCisjIGRlZmluZSBWRV9CTE9DSwk1CS8qIGluY2x1ZGVzICJhbGwiICovCisjIGRlZmluZSBWRV9JTlNFUlQJNgkvKiBpbmNsdWRlcyAiYWxsIiAqLworIyBkZWZpbmUgVkVfQUxMCQk0CisjZW5kaWYKK0VYVEVSTiBsb25nCXBfdmVyYm9zZTsJLyogJ3ZlcmJvc2UnICovCitFWFRFUk4gaW50CXBfd2FybjsJCS8qICd3YXJuJyAqLworI2lmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoTElOVCkgXAorCXx8IGRlZmluZWQgKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisjZGVmaW5lIEZFQVRfV0FLCitFWFRFUk4gY2hhcl91CSpwX3dhazsJCS8qICd3aW5hbHRrZXlzJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9XSUxESUdOCitFWFRFUk4gY2hhcl91CSpwX3dpZzsJCS8qICd3aWxkaWdub3JlJyAqLworI2VuZGlmCitFWFRFUk4gaW50CXBfd2l2OwkJLyogJ3dlaXJkaW52ZXJ0JyAqLworRVhURVJOIGNoYXJfdQkqcF93dzsJCS8qICd3aGljaHdyYXAnICovCitFWFRFUk4gbG9uZwlwX3djOwkJLyogJ3dpbGRjaGFyJyAqLworRVhURVJOIGxvbmcJcF93Y207CQkvKiAnd2lsZGNoYXJtJyAqLworRVhURVJOIGNoYXJfdQkqcF93aW07CQkvKiAnd2lsZG1vZGUnICovCisjaWZkZWYgRkVBVF9XSUxETUVOVQorRVhURVJOIGludAlwX3dtbnU7CQkvKiAnd2lsZG1lbnUnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTkRPV1MKK0VYVEVSTiBsb25nCXBfd2g7CQkvKiAnd2luaGVpZ2h0JyAqLworRVhURVJOIGxvbmcJcF93bWg7CQkvKiAnd2lubWluaGVpZ2h0JyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK0VYVEVSTiBsb25nCXBfd213OwkJLyogJ3dpbm1pbndpZHRoJyAqLworRVhURVJOIGxvbmcJcF93aXc7CQkvKiAnd2lud2lkdGgnICovCisjZW5kaWYKK0VYVEVSTiBpbnQJcF93czsJCS8qICd3cmFwc2NhbicgKi8KK0VYVEVSTiBpbnQJcF93cml0ZTsJLyogJ3dyaXRlJyAqLworRVhURVJOIGludAlwX3dhOwkJLyogJ3dyaXRlYW55JyAqLworRVhURVJOIGludAlwX3diOwkJLyogJ3dyaXRlYmFja3VwJyAqLworRVhURVJOIGxvbmcJcF93ZDsJCS8qICd3cml0ZWRlbGF5JyAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zX2FtaWdhLmMgYi9zcmMvb3NfYW1pZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYyY2NjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX2FtaWdhLmMKQEAgLTAsMCArMSwxNjE5IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiBvc19hbWlnYS5jCisgKgorICogQW1pZ2Egc3lzdGVtLWRlcGVuZGVudCByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBXaW5kb3cKKyMgdW5kZWYgV2luZG93CS8qIEFtaWdhIGhhcyBpdHMgb3duIFdpbmRvdyBkZWZpbml0aW9uICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyN1bmRlZiBUUlVFCQkvKiB3aWxsIGJlIHJlZGVmaW5lZCBieSBleGVjL3R5cGVzLmggKi8KKyN1bmRlZiBGQUxTRQorCisjaWZuZGVmIExBVFRJQ0UKKyMgaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgorIyBpbmNsdWRlIDxleGVjL2V4ZWMuaD4KKyMgaW5jbHVkZSA8bGlicmFyaWVzL2Rvcy5oPgorIyBpbmNsdWRlIDxsaWJyYXJpZXMvZG9zZXh0ZW5zLmg+CisjIGluY2x1ZGUgPGludHVpdGlvbi9pbnR1aXRpb24uaD4KKyNlbHNlCisjIGluY2x1ZGUgPHByb3RvL2Rvcy5oPgorIyBpbmNsdWRlIDxsaWJyYXJpZXMvZG9zZXh0ZW5zLmg+CisjIGluY2x1ZGUgPHByb3RvL2ludHVpdGlvbi5oPgorIyBpbmNsdWRlIDxwcm90by9leGVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGV4ZWMvbWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxkb3MvZG9zdGFncy5oPgkgICAgLyogZm9yIDIuMCBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlIDxkb3MvZG9zYXNsLmg+CisKKyNpZiBkZWZpbmVkKExBVFRJQ0UpICYmICFkZWZpbmVkKFNBU0MpICYmIGRlZmluZWQoRkVBVF9BUlApCisjIGluY2x1ZGUgPGxpYnJhcmllcy9hcnBfcHJhZ21hcy5oPgorI2VuZGlmCisKKy8qCisgKiBBdCB0aGlzIHBvaW50IFRSVUUgYW5kIEZBTFNFIGFyZSBkZWZpbmVkIGFzIDFMIGFuZCAwTCwgYnV0IHdlIHdhbnQgMSBhbmQgMC4KKyAqLworI3VuZGVmCVRSVUUKKyNkZWZpbmUgVFJVRSAoMSkKKyN1bmRlZglGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKworI2lmICFkZWZpbmVkKEFaVEVDX0MpICYmICFkZWZpbmVkKF9fQVJPU19fKQorc3RhdGljIGxvbmcgZG9zX3BhY2tldCBfX0FSR1MoKHN0cnVjdCBNc2dQb3J0ICosIGxvbmcsIGxvbmcpKTsKKyNlbmRpZgorc3RhdGljIGludCBsb2NrMm5hbWUgX19BUkdTKChCUFRSIGxvY2ssIGNoYXJfdSAqYnVmLCBsb25nICAgbGVuKSk7CitzdGF0aWMgdm9pZCBvdXRfbnVtIF9fQVJHUygobG9uZyBuKSk7CitzdGF0aWMgc3RydWN0IEZpbGVJbmZvQmxvY2sgKmdldF9maWIgX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIGludCBzb3J0Y21wIF9fQVJHUygoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikpOworCitzdGF0aWMgQlBUUgkJcmF3X2luID0gKEJQVFIpTlVMTDsKK3N0YXRpYyBCUFRSCQlyYXdfb3V0ID0gKEJQVFIpTlVMTDsKK3N0YXRpYyBpbnQJCWNsb3NlX3dpbiA9IEZBTFNFOyAgLyogc2V0IGlmIFZpbSBvcGVuZWQgdGhlIHdpbmRvdyAqLworCitzdHJ1Y3QgSW50dWl0aW9uQmFzZQkqSW50dWl0aW9uQmFzZSA9IE5VTEw7CisjaWZkZWYgRkVBVF9BUlAKK3N0cnVjdCBBcnBCYXNlCQkqQXJwQmFzZSA9IE5VTEw7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBXaW5kb3cJKndiX3dpbmRvdzsKK3N0YXRpYyBjaGFyX3UJCSpvbGR3aW5kb3d0aXRsZSA9IE5VTEw7CisKKyNpZmRlZiBGRUFUX0FSUAoraW50CQkJZG9zMiA9IEZBTFNFOwkgICAgLyogQW1pZ2EgRE9TIDIuMHggb3IgaGlnaGVyICovCisjZW5kaWYKK2ludAkJCXNpemVfc2V0ID0gRkFMU0U7ICAgLyogc2V0IHRvIFRSVUUgaWYgd2luZG93IHNpemUgd2FzIHNldCAqLworCisgICAgdm9pZAord2luX3Jlc2l6ZV9vbigpCit7CisgICAgT1VUX1NUUl9ORigiXDAzM1sxMnsiKTsKK30KKworICAgIHZvaWQKK3dpbl9yZXNpemVfb2ZmKCkKK3sKKyAgICBPVVRfU1RSX05GKCJcMDMzWzEyfSIpOworfQorCisgICAgdm9pZAorbWNoX3dyaXRlKHAsIGxlbikKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlsZW47Cit7CisgICAgV3JpdGUocmF3X291dCwgKGNoYXIgKilwLCAobG9uZylsZW4pOworfQorCisvKgorICogbWNoX2luY2hhcigpOiBsb3cgbGV2ZWwgaW5wdXQgZnVuY2lvbi4KKyAqIEdldCBhIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQuCisgKiBJZiB0aW1lID09IDAgZG8gbm90IHdhaXQgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB0aW1lID09IG4gd2FpdCBhIHNob3J0IHRpbWUgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB0aW1lID09IC0xIHdhaXQgZm9yZXZlciBmb3IgY2hhcmFjdGVycy4KKyAqCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZC4KKyAqLworICAgIGludAorbWNoX2luY2hhcihidWYsIG1heGxlbiwgdGltZSwgdGJfY2hhbmdlX2NudCkKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50CSAgICBtYXhsZW47CisgICAgbG9uZyAgICB0aW1lOwkJLyogbWlsbGkgc2Vjb25kcyAqLworICAgIGludAkgICAgdGJfY2hhbmdlX2NudDsKK3sKKyAgICBpbnQJICAgIGxlbjsKKyAgICBsb25nICAgIHV0aW1lOworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIHN0YXRpYyBpbnQJb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCisgICAgaWYgKHRpbWUgPj0gMCkKKyAgICB7CisJaWYgKHRpbWUgPT0gMCkKKwkgICAgdXRpbWUgPSAxMDBMOwkgICAgLyogdGltZSA9IDAgY2F1c2VzIHByb2JsZW1zIGluIERPUyAxLjIgKi8KKwllbHNlCisJICAgIHV0aW1lID0gdGltZSAqIDEwMDBMOyAgIC8qIGNvbnZlcnQgZnJvbSBtaWxsaSB0byBtaWNybyBzZWNzICovCisJaWYgKFdhaXRGb3JDaGFyKHJhd19pbiwgdXRpbWUpID09IDApCS8qIG5vIGNoYXJhY3RlciBhdmFpbGFibGUgKi8KKwl7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIG9uY2VfYWxyZWFkeSA9IDA7CisjZW5kaWYKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICBlbHNlICAgIC8qIHRpbWUgPT0gLTEgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJaWYgKG9uY2VfYWxyZWFkeSA9PSAyKQorCSAgICB1cGRhdGVzY3JpcHQoMCk7CisJZWxzZSBpZiAob25jZV9hbHJlYWR5ID09IDEpCisJeworCSAgICBzZXRjdXJzb3IoKTsKKwkgICAgb25jZV9hbHJlYWR5ID0gMjsKKwkgICAgcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZgorCS8qCisJICogSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSB3aXRoaW4gMiBzZWNvbmRzIChkZWZhdWx0KQorCSAqIHdyaXRlIHRoZSBhdXRvc2NyaXB0IGZpbGUgdG8gZGlzaworCSAqLworCSAgICBpZiAoV2FpdEZvckNoYXIocmF3X2luLCBwX3V0ICogMTAwMEwpID09IDApCisJeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpZiAoaGFzX2N1cnNvcmhvbGQoKSAmJiBnZXRfcmVhbF9zdGF0ZSgpID09IE5PUk1BTF9CVVNZKQorCSAgICB7CisJCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0NVUlNPUkhPTEQsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworCQl1cGRhdGVfc2NyZWVuKFZBTElEKTsKKwkJb25jZV9hbHJlYWR5ID0gMTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCXVwZGF0ZXNjcmlwdCgwKTsKKwl9CisgICAgfQorCisgICAgZm9yICg7OykJICAgIC8qIHJlcGVhdCB1bnRpbCB3ZSBnb3QgYSBjaGFyYWN0ZXIgKi8KKyAgICB7CisjICBpZmRlZiBGRUFUX01CWVRFCisJbGVuID0gUmVhZChyYXdfaW4sIChjaGFyICopYnVmLCAobG9uZyltYXhsZW4gLyBpbnB1dF9jb252LnZjX2ZhY3Rvcik7CisjICBlbHNlCisJbGVuID0gUmVhZChyYXdfaW4sIChjaGFyICopYnVmLCAobG9uZyltYXhsZW4pOworIyAgZW5kaWYKKwlpZiAobGVuID4gMCkKKwl7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIG9uY2VfYWxyZWFkeSA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIC8qIENvbnZlcnQgZnJvbSAndGVybWVuY29kaW5nJyB0byAnZW5jb2RpbmcnLiAqLworCSAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkJbGVuID0gY29udmVydF9pbnB1dChidWYsIGxlbiwgbWF4bGVuKTsKKyNlbmRpZgorCSAgICByZXR1cm4gbGVuOworCX0KKyAgICB9Cit9CisKKy8qCisgKiByZXR1cm4gbm9uLXplcm8gaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlCisgKi8KKyAgICBpbnQKK21jaF9jaGFyX2F2YWlsKCkKK3sKKyAgICByZXR1cm4gKFdhaXRGb3JDaGFyKHJhd19pbiwgMTAwTCkgIT0gMCk7Cit9CisKKy8qCisgKiBSZXR1cm4gYW1vdW50IG9mIG1lbW9yeSBzdGlsbCBhdmFpbGFibGUuCisgKi8KKyAgICBsb25nX3UKK21jaF9hdmFpbF9tZW0oc3BlY2lhbCkKKyAgICBpbnQJICAgIHNwZWNpYWw7Cit7CisgICAgcmV0dXJuIChsb25nX3UpQXZhaWxNZW0oc3BlY2lhbCA/IChsb25nKU1FTUZfQ0hJUCA6IChsb25nKU1FTUZfQU5ZKTsKK30KKworICAgIHZvaWQKK21jaF9kZWxheShtc2VjLCBpZ25vcmVpbnB1dCkKKyAgICBsb25nICAgIG1zZWM7CisgICAgaW50CSAgICBpZ25vcmVpbnB1dDsKK3sKKyNpZm5kZWYgTEFUVElDRQkJLyogU0FTIGRlY2xhcmVzIHZvaWQgRGVsYXkoVU5MT05HKSAqLworICAgIHZvaWQJICAgIERlbGF5IF9fQVJHUygobG9uZykpOworI2VuZGlmCisKKyAgICBpZiAobXNlYyA+IDApCisgICAgeworCWlmIChpZ25vcmVpbnB1dCkKKwkgICAgRGVsYXkobXNlYyAvIDIwTCk7CSAgICAvKiBEZWxheSB3b3JrcyB3aXRoIDIwIG1zZWMgaW50ZXJ2YWxzICovCisJZWxzZQorCSAgICBXYWl0Rm9yQ2hhcihyYXdfaW4sIG1zZWMgKiAxMDAwTCk7CisgICAgfQorfQorCisvKgorICogV2UgaGF2ZSBubyBqb2IgY29udHJvbCwgZmFrZSBpdCBieSBzdGFydGluZyBhIG5ldyBzaGVsbC4KKyAqLworICAgIHZvaWQKK21jaF9zdXNwZW5kKCkKK3sKKyAgICBzdXNwZW5kX3NoZWxsKCk7Cit9CisKKyNpZm5kZWYgRE9TX0xJQlJBUlkKKyMgZGVmaW5lIERPU19MSUJSQVJZCSgoVUJZVEUgKikiZG9zLmxpYnJhcnkiKQorI2VuZGlmCisKKyAgICB2b2lkCittY2hfaW5pdCgpCit7CisgICAgc3RhdGljIGNoYXIJICAgIGludGxpYm5hbWVbXSA9ICJpbnR1aXRpb24ubGlicmFyeSI7CisKKyNpZmRlZiBBWlRFQ19DCisgICAgRW5hYmxlX0Fib3J0ID0gMDsJCS8qIGRpc2FsbG93IHZpbSB0byBiZSBhYm9ydGVkICovCisjZW5kaWYKKyAgICBDb2x1bW5zID0gODA7CisgICAgUm93cyA9IDI0OworCisgICAgLyoKKyAgICAgKiBTZXQgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscywgdW5sZXNzIHdlIGhhdmUgb3BlbmVkIG91ciBvd24gd2luZG93CisgICAgICovCisgICAgaWYgKHJhd19pbiA9PSAoQlBUUilOVUxMKQorICAgIHsKKwlyYXdfaW4gPSBJbnB1dCgpOworCXJhd19vdXQgPSBPdXRwdXQoKTsKKwkvKgorCSAqIElmIElucHV0KCkgaXMgbm90IGludGVyYWN0aXZlLCB0aGVuIE91dHB1dCgpIHdpbGwgYmUgKGJlY2F1c2Ugb2YKKwkgKiBjaGVjayBpbiBtY2hfY2hlY2tfd2luKCkpLiAgVXNlZCBmb3IgIlZpbSAtIi4KKwkgKiBBbHNvIGNoZWNrIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBmb3IgIlZpbSAtaCB8IG1vcmUiLgorCSAqLworCWlmICghSXNJbnRlcmFjdGl2ZShyYXdfaW4pKQorCSAgICByYXdfaW4gPSByYXdfb3V0OworCWVsc2UgaWYgKCFJc0ludGVyYWN0aXZlKHJhd19vdXQpKQorCSAgICByYXdfb3V0ID0gcmF3X2luOworICAgIH0KKworICAgIG91dF9mbHVzaCgpOworCisgICAgd2Jfd2luZG93ID0gTlVMTDsKKyAgICBpZiAoKEludHVpdGlvbkJhc2UgPSAoc3RydWN0IEludHVpdGlvbkJhc2UgKikKKwkJCQlPcGVuTGlicmFyeSgoVUJZVEUgKilpbnRsaWJuYW1lLCAwTCkpID09IE5VTEwpCisgICAgeworCW1jaF9lcnJtc2coXygiY2Fubm90IG9wZW4gIikpOworCW1jaF9lcnJtc2coaW50bGlibmFtZSk7CisJbWNoX2Vycm1zZygiIT9cbiIpOworCW1jaF9leGl0KDMpOworICAgIH0KK30KKworI2luY2x1ZGUgPHdvcmtiZW5jaC9zdGFydHVwLmg+CisKKy8qCisgKiBDaGVja193aW4gY2hlY2tzIHdoZXRoZXIgd2UgaGF2ZSBhbiBpbnRlcmFjdGl2ZSB3aW5kb3cuCisgKiBJZiBub3QsIGEgbmV3IHdpbmRvdyBpcyBvcGVuZWQgd2l0aCB0aGUgbmV3Y2xpIGNvbW1hbmQuCisgKiBJZiB3ZSB3b3VsZCBvcGVuIGEgd2luZG93IG91cnNlbHZlcywgdGhlIDpzaCBhbmQgOiEgY29tbWFuZHMgd291bGQgbm90CisgKiB3b3JrIHByb3Blcmx5IChXaHk/IHByb2JhYmx5IGJlY2F1c2Ugd2UgYXJlIHRoZW4gcnVubmluZyBpbiBhIGJhY2tncm91bmQKKyAqIENMSSkuIFRoaXMgYWxzbyBpcyB0aGUgYmVzdCB3YXkgdG8gYXNzdXJlIHByb3BlciB3b3JraW5nIGluIGEgbmV4dAorICogV29ya2JlbmNoIHJlbGVhc2UuCisgKgorICogRm9yIHRoZSAtZiBvcHRpb24gKGZvcmVncm91bmQgbW9kZSkgd2Ugb3BlbiBvdXIgb3duIHdpbmRvdyBhbmQgZGlzYWJsZSA6c2guCisgKiBPdGhlcndpc2UgdGhlIGNhbGxpbmcgcHJvZ3JhbSB3b3VsZCBuZXZlciBrbm93IHdoZW4gZWRpdGluZyBpcyBmaW5pc2hlZC4KKyAqLworI2RlZmluZSBCVUYyU0laRSAzMjAJICAgIC8qIGxlbmd0aCBvZiBidWZmZXIgZm9yIGFyZ3VtZW50IHdpdGggY29tcGxldGUgcGF0aCAqLworCisgICAgaW50CittY2hfY2hlY2tfd2luKGFyZ2MsIGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7Cit7CisgICAgaW50CQkgICAgaTsKKyAgICBCUFRSCSAgICBuaWxmaCwgZmg7CisgICAgY2hhcl91CSAgICBidWYxWzIwXTsKKyAgICBjaGFyX3UJICAgIGJ1ZjJbQlVGMlNJWkVdOworICAgIHN0YXRpYyBjaGFyX3UgICAqKGNvbnN0cmluZ3NbM10pID0geyhjaGFyX3UgKikiY29uOjAvMC82NjIvMjEwLyIsCisJCQkJCShjaGFyX3UgKikiY29uOjAvMC82NDAvMjAwLyIsCisJCQkJCShjaGFyX3UgKikiY29uOjAvMC8zMjAvMjAwLyJ9OworICAgIHN0YXRpYyBjaGFyX3UgICAqd2luZXJyID0gKGNoYXJfdSAqKU5fKCJWSU06IENhbid0IG9wZW4gd2luZG93IVxuIik7CisgICAgc3RydWN0IFdCQXJnICAgICphcmdwOworICAgIGludAkJICAgIGFjOworICAgIGNoYXIJICAgICphdjsKKyAgICBjaGFyX3UJICAgICpkZXZpY2UgPSBOVUxMOworICAgIGludAkJICAgIGV4aXR2YWwgPSA0OworICAgIHN0cnVjdCBMaWJyYXJ5ICAqRG9zQmFzZTsKKyAgICBpbnQJCSAgICB1c2V3aW4gPSBGQUxTRTsKKworLyoKKyAqIGNoZWNrIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIERPUyAyLjB4IG9yIGhpZ2hlcgorICovCisgICAgRG9zQmFzZSA9IE9wZW5MaWJyYXJ5KERPU19MSUJSQVJZLCAzN0wpOworICAgIGlmIChEb3NCYXNlICE9IE5VTEwpCisgICAgLyogaWYgKCgoc3RydWN0IExpYnJhcnkgKilET1NCYXNlKS0+bGliX1ZlcnNpb24gPj0gMzcpICovCisgICAgeworCUNsb3NlTGlicmFyeShEb3NCYXNlKTsKKyNpZmRlZiBGRUFUX0FSUAorCWRvczIgPSBUUlVFOworI2VuZGlmCisgICAgfQorICAgIGVsc2UJICAgIC8qIHdpdGhvdXQgYXJwIGZ1bmN0aW9ucyB3ZSBORUVEIDIuMCAqLworICAgIHsKKyNpZm5kZWYgRkVBVF9BUlAKKwltY2hfZXJybXNnKF8oIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iKSk7CisJZXhpdCgzKTsKKyNlbHNlCisJCSAgICAvKiBuZWVkIGFycCBmdW5jdGlvbnMgZm9yIGRvcyAxLnggKi8KKwlpZiAoIShBcnBCYXNlID0gKHN0cnVjdCBBcnBCYXNlICopIE9wZW5MaWJyYXJ5KChVQllURSAqKUFycE5hbWUsIEFycFZlcnNpb24pKSkKKwl7CisJICAgIGZwcmludGYoc3RkZXJyLCBfKCJOZWVkICVzIHZlcnNpb24gJWxkXG4iKSwgQXJwTmFtZSwgQXJwVmVyc2lvbik7CisJICAgIGV4aXQoMyk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgLyoKKyAgICAgKiBzY2FuIGFyZ3ZbXSBmb3IgdGhlICItZiIgYW5kICItZCIgYXJndW1lbnRzCisgICAgICovCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKKwlpZiAoYXJndltpXVswXSA9PSAnLScpCisJeworCSAgICBzd2l0Y2ggKGFyZ3ZbaV1bMV0pCisJICAgIHsKKwkgICAgY2FzZSAnZic6CisJCXVzZXdpbiA9IFRSVUU7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2QnOgorCQlpZiAoaSA8IGFyZ2MgLSAxCisjaWZkZWYgRkVBVF9ESUZGCisJCQkvKiByZXF1aXJlIHVzaW5nICItZGV2IiwgIi1kIiBtZWFucyBkaWZmIG1vZGUgKi8KKwkJCSYmIGFyZ3ZbaV1bMl0gPT0gJ2UnICYmIGFyZ3ZbaV1bM10gPT0gJ3YnCisjZW5kaWYKKwkJICAgKQorCQkgICAgZGV2aWNlID0gKGNoYXJfdSAqKWFyZ3ZbaSArIDFdOworCQlicmVhazsKKwkgICAgfQorCX0KKworLyoKKyAqIElmIHdlIHdlcmUgbm90IHN0YXJ0ZWQgZnJvbSB3b3JrYmVuY2gsIGRvIG5vdCBoYXZlIGEgIi1kIiBvciAiLWRldiIKKyAqIGFyZ3VtZW50IGFuZCB3ZSBoYXZlIGJlZW4gc3RhcnRlZCB3aXRoIGFuIGludGVyYWN0aXZlIHdpbmRvdywgdXNlIHRoYXQKKyAqIHdpbmRvdy4KKyAqLworICAgIGlmIChhcmdjICE9IDAKKwkgICAgJiYgZGV2aWNlID09IE5VTEwKKwkgICAgJiYgKElzSW50ZXJhY3RpdmUoSW5wdXQoKSkgfHwgSXNJbnRlcmFjdGl2ZShPdXRwdXQoKSkpKQorCXJldHVybiBPSzsKKworLyoKKyAqIFdoZW4gZ2l2ZW4gdGhlICItZiIgYXJndW1lbnQsIHdlIG9wZW4gb3VyIG93biB3aW5kb3cuIFdlIGNhbid0IHVzZSB0aGUKKyAqIG5ld2NsaSB0cmljayBiZWxvdywgYmVjYXVzZSB0aGUgY2FsbGluZyBwcm9ncmFtIChtYWlsLCBybiwgZXRjLikgd291bGQgbm90CisgKiBrbm93IHdoZW4gd2UgYXJlIGZpbmlzaGVkLgorICovCisgICAgaWYgKHVzZXdpbikKKyAgICB7CisJLyoKKwkgKiBUcnkgdG8gb3BlbiBhIHdpbmRvdy4gRmlyc3QgdHJ5IHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorCSAqIFRoZW4gdHJ5IGEgMjQgbGluZSA4MCBjb2x1bW4gd2luZG93LgorCSAqIElmIHRoYXQgZmFpbHMsIHRyeSB0d28gc21hbGxlciBvbmVzLgorCSAqLworCWZvciAoaSA9IC0xOyBpIDwgMzsgKytpKQorCXsKKwkgICAgaWYgKGkgPj0gMCkKKwkJZGV2aWNlID0gY29uc3RyaW5nc1tpXTsKKwkgICAgaWYgKGRldmljZSAhPSBOVUxMICYmIChyYXdfaW4gPSBPcGVuKChVQllURSAqKWRldmljZSwKKwkJCQkJICAgKGxvbmcpTU9ERV9ORVdGSUxFKSkgIT0gKEJQVFIpTlVMTCkKKwkJYnJlYWs7CisJfQorCWlmIChyYXdfaW4gPT0gKEJQVFIpTlVMTCkJLyogYWxsIHRocmVlIGZhaWxlZCAqLworCXsKKwkgICAgbWNoX2Vycm1zZyhfKHdpbmVycikpOworCSAgICBnb3RvIGV4aXQ7CisJfQorCXJhd19vdXQgPSByYXdfaW47CisJY2xvc2Vfd2luID0gVFJVRTsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKChuaWxmaCA9IE9wZW4oKFVCWVRFICopIk5JTDoiLCAobG9uZylNT0RFX05FV0ZJTEUpKSA9PSAoQlBUUilOVUxMKQorICAgIHsKKwltY2hfZXJybXNnKF8oIkNhbm5vdCBvcGVuIE5JTDpcbiIpKTsKKwlnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYWtlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSB0ZW1wIGZpbGUgKHdoaWNoIHdlIHdpbGwgbm90IGRlbGV0ZSEpLgorICAgICAqIFVzZSBhIHBvaW50ZXIgb24gdGhlIHN0YWNrIChub2JvZHkgZWxzZSB3aWxsIGJlIHVzaW5nIGl0KS4KKyAgICAgKi8KKyAgICBzcHJpbnRmKChjaGFyICopYnVmMSwgInQ6bmMlbGQiLCAobG9uZylidWYxKTsKKyAgICBpZiAoKGZoID0gT3BlbigoVUJZVEUgKilidWYxLCAobG9uZylNT0RFX05FV0ZJTEUpKSA9PSAoQlBUUilOVUxMKQorICAgIHsKKwltY2hfZXJybXNnKF8oIkNhbm5vdCBjcmVhdGUgIikpOworCW1jaF9lcnJtc2coKGNoYXIgKilidWYxKTsKKwltY2hfZXJybXNnKCJcbiIpOworCWdvdG8gZXhpdDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBXcml0ZSB0aGUgY29tbWFuZCBpbnRvIHRoZSBmaWxlLCBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgYXJndW1lbnRzIHRoYXQKKyAgICAgKiBoYXZlIGEgc3BhY2UgaW4gdGhlbS4KKyAgICAgKi8KKyAgICBpZiAoYXJnYyA9PSAwKQkvKiBydW4gZnJvbSB3b3JrYmVuY2ggKi8KKwlhYyA9ICgoc3RydWN0IFdCU3RhcnR1cCAqKWFyZ3YpLT5zbV9OdW1BcmdzOworICAgIGVsc2UKKwlhYyA9IGFyZ2M7CisgICAgZm9yIChpID0gMDsgaSA8IGFjOyArK2kpCisgICAgeworCWlmIChhcmdjID09IDApCisJeworCSAgICAqYnVmMiA9IE5VTDsKKwkgICAgYXJncCA9ICYoKChzdHJ1Y3QgV0JTdGFydHVwICopYXJndiktPnNtX0FyZ0xpc3RbaV0pOworCSAgICBpZiAoYXJncC0+d2FfTG9jaykKKwkJKHZvaWQpbG9jazJuYW1lKGFyZ3AtPndhX0xvY2ssIGJ1ZjIsIChsb25nKShCVUYyU0laRSAtIDEpKTsKKyNpZmRlZiBGRUFUX0FSUAorCSAgICBpZiAoZG9zMikJICAgIC8qIHVzZSAyLjAgZnVuY3Rpb24gKi8KKyNlbmRpZgorCQlBZGRQYXJ0KChVQllURSAqKWJ1ZjIsIChVQllURSAqKWFyZ3AtPndhX05hbWUsIChsb25nKShCVUYyU0laRSAtIDEpKTsKKyNpZmRlZiBGRUFUX0FSUAorCSAgICBlbHNlCSAgICAvKiB1c2UgYXJwIGZ1bmN0aW9uICovCisJCVRhY2tPbigoY2hhciAqKWJ1ZjIsIGFyZ3AtPndhX05hbWUpOworI2VuZGlmCisJICAgIGF2ID0gKGNoYXIgKilidWYyOworCX0KKwllbHNlCisJICAgIGF2ID0gYXJndltpXTsKKworCS8qIHNraXAgJy1kJyBvciAiLWRldiIgb3B0aW9uICovCisJaWYgKGF2WzBdID09ICctJyAmJiBhdlsxXSA9PSAnZCcKKyNpZmRlZiBGRUFUX0RJRkYKKwkJJiYgYXZbMl0gPT0gJ2UnICYmIGF2WzNdID09ICd2JworI2VuZGlmCisJCSkKKwl7CisJICAgICsraTsKKwkgICAgY29udGludWU7CisJfQorCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilhdiwgJyAnKSkKKwkgICAgV3JpdGUoZmgsICJcIiIsIDFMKTsKKwlXcml0ZShmaCwgYXYsIChsb25nKXN0cmxlbihhdikpOworCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilhdiwgJyAnKSkKKwkgICAgV3JpdGUoZmgsICJcIiIsIDFMKTsKKwlXcml0ZShmaCwgIiAiLCAxTCk7CisgICAgfQorICAgIFdyaXRlKGZoLCAiXG5lbmRjbGlcbiIsIDhMKTsKKyAgICBDbG9zZShmaCk7CisKKy8qCisgKiBUcnkgdG8gb3BlbiBhIG5ldyBjbGkgaW4gYSB3aW5kb3cuIElmICItZCIgb3IgIi1kZXYiIGFyZ3VtZW50IHdhcyBnaXZlbiB0cnkKKyAqIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBkZXZpY2UuIFRoZW4gdHJ5IGEgMjQgbGluZSA4MCBjb2x1bW4gd2luZG93LiAgSWYgdGhhdAorICogZmFpbHMsIHRyeSB0d28gc21hbGxlciBvbmVzLgorICovCisgICAgZm9yIChpID0gLTE7IGkgPCAzOyArK2kpCisgICAgeworCWlmIChpID49IDApCisJICAgIGRldmljZSA9IGNvbnN0cmluZ3NbaV07CisJZWxzZSBpZiAoZGV2aWNlID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCXNwcmludGYoKGNoYXIgKilidWYyLCAibmV3Y2xpIDxuaWw6ID5uaWw6ICVzIGZyb20gJXMiLCAoY2hhciAqKWRldmljZSwgKGNoYXIgKilidWYxKTsKKyNpZmRlZiBGRUFUX0FSUAorCWlmIChkb3MyKQorCXsKKyNlbmRpZgorCSAgICBpZiAoIVN5c3RlbVRhZ3MoKFVCWVRFICopYnVmMiwgU1lTX1VzZXJTaGVsbCwgVFJVRSwgVEFHX0RPTkUpKQorCQlicmVhazsKKyNpZmRlZiBGRUFUX0FSUAorCX0KKwllbHNlCisJeworCSAgICBpZiAoRXhlY3V0ZSgoVUJZVEUgKilidWYyLCBuaWxmaCwgbmlsZmgpKQorCQlicmVhazsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgaWYgKGkgPT0gMykJICAgIC8qIGFsbCB0aHJlZSBmYWlsZWQgKi8KKyAgICB7CisJRGVsZXRlRmlsZSgoVUJZVEUgKilidWYxKTsKKwltY2hfZXJybXNnKF8od2luZXJyKSk7CisJZ290byBleGl0OworICAgIH0KKyAgICBleGl0dmFsID0gMDsgICAgLyogVGhlIEV4ZWN1dGUgc3VjY2VlZGVkOiBleGl0IHRoaXMgcHJvZ3JhbSAqLworCitleGl0OgorI2lmZGVmIEZFQVRfQVJQCisgICAgaWYgKEFycEJhc2UpCisJQ2xvc2VMaWJyYXJ5KChzdHJ1Y3QgTGlicmFyeSAqKSBBcnBCYXNlKTsKKyNlbmRpZgorICAgIGV4aXQoZXhpdHZhbCk7CisgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIGlucHV0IGNvbWVzIGZyb20gYSB0ZXJtaW5hbCwgRkFMU0Ugb3RoZXJ3aXNlLgorICogV2UgZmFrZSB0aGVyZSBpcyBhIHdpbmRvdywgYmVjYXVzZSB3ZSBjYW4gYWx3YXlzIG9wZW4gb25lIQorICovCisgICAgaW50CittY2hfaW5wdXRfaXNhdHR5KCkKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGZuYW1lX2Nhc2UoKTogU2V0IHRoZSBjYXNlIG9mIHRoZSBmaWxlIG5hbWUsIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICoJCSBUaGlzIHdpbGwgY2F1c2UgdGhlIGZpbGUgbmFtZSB0byByZW1haW4gZXhhY3RseSB0aGUgc2FtZS4KKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZm5hbWVfY2FzZShuYW1lLCBsZW4pCisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJbGVuOwkJLyogYnVmZmVyIHNpemUsIGlnbm9yZWQgaGVyZSAqLworeworICAgIHN0cnVjdCBGaWxlSW5mb0Jsb2NrICAgICpmaWI7CisgICAgc2l6ZV90CQkgICAgZmxlbjsKKworICAgIGZpYiA9IGdldF9maWIobmFtZSk7CisgICAgaWYgKGZpYiAhPSBOVUxMKQorICAgIHsKKwlmbGVuID0gU1RSTEVOKG5hbWUpOworCWlmIChmbGVuID09IHN0cmxlbihmaWItPmZpYl9GaWxlTmFtZSkpCS8qIHNhZmV0eSBjaGVjayAqLworCSAgICBtY2hfbWVtbW92ZShuYW1lLCBmaWItPmZpYl9GaWxlTmFtZSwgZmxlbik7CisJdmltX2ZyZWUoZmliKTsKKyAgICB9Cit9CisKKy8qCisgKiBHZXQgdGhlIEZpbGVJbmZvQmxvY2sgZm9yIGZpbGUgImZuYW1lIgorICogVGhlIHJldHVybmVkIHN0cnVjdHVyZSBoYXMgdG8gYmUgZnJlZSgpZC4KKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvci4KKyAqLworICAgIHN0YXRpYyBzdHJ1Y3QgRmlsZUluZm9CbG9jayAqCitnZXRfZmliKGZuYW1lKQorICAgIGNoYXJfdSAqZm5hbWU7Cit7CisgICAgQlBUUgkJICAgIGZsb2NrOworICAgIHN0cnVjdCBGaWxlSW5mb0Jsb2NrICAgICpmaWI7CisKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCkJICAgIC8qIHNhZmV0eSBjaGVjayAqLworCXJldHVybiBOVUxMOworICAgIGZpYiA9IChzdHJ1Y3QgRmlsZUluZm9CbG9jayAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEZpbGVJbmZvQmxvY2spKTsKKyAgICBpZiAoZmliICE9IE5VTEwpCisgICAgeworCWZsb2NrID0gTG9jaygoVUJZVEUgKilmbmFtZSwgKGxvbmcpQUNDRVNTX1JFQUQpOworCWlmIChmbG9jayA9PSAoQlBUUilOVUxMIHx8ICFFeGFtaW5lKGZsb2NrLCBmaWIpKQorCXsKKwkgICAgdmltX2ZyZWUoZmliKTsgIC8qIGluIGNhc2Ugb2YgYW4gZXJyb3IgdGhlIG1lbW9yeSBpcyBmcmVlZCBoZXJlICovCisJICAgIGZpYiA9IE5VTEw7CisJfQorCWlmIChmbG9jaykKKwkgICAgVW5Mb2NrKGZsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIGZpYjsKK30KKworI2lmZGVmIEZFQVRfVElUTEUKKy8qCisgKiBzZXQgdGhlIHRpdGxlIG9mIG91ciB3aW5kb3cKKyAqIGljb24gbmFtZSBpcyBub3Qgc2V0CisgKi8KKyAgICB2b2lkCittY2hfc2V0dGl0bGUodGl0bGUsIGljb24pCisgICAgY2hhcl91ICAqdGl0bGU7CisgICAgY2hhcl91ICAqaWNvbjsKK3sKKyAgICBpZiAod2Jfd2luZG93ICE9IE5VTEwgJiYgdGl0bGUgIT0gTlVMTCkKKwlTZXRXaW5kb3dUaXRsZXMod2Jfd2luZG93LCAoVUJZVEUgKil0aXRsZSwgKFVCWVRFICopLTFMKTsKK30KKworLyoKKyAqIFJlc3RvcmUgdGhlIHdpbmRvdy9pY29uIHRpdGxlLgorICogd2hpY2ggaXMgb25lIG9mOgorICogIDEgIEp1c3QgcmVzdG9yZSB0aXRsZQorICogIDIgIEp1c3QgcmVzdG9yZSBpY29uICh3aGljaCB3ZSBkb24ndCBoYXZlKQorICogIDMgIFJlc3RvcmUgdGl0bGUgYW5kIGljb24gKHdoaWNoIHdlIGRvbid0IGhhdmUpCisgKi8KKyAgICB2b2lkCittY2hfcmVzdG9yZV90aXRsZSh3aGljaCkKKyAgICBpbnQgd2hpY2g7Cit7CisgICAgaWYgKHdoaWNoICYgMSkKKwltY2hfc2V0dGl0bGUob2xkd2luZG93dGl0bGUsIE5VTEwpOworfQorCisgICAgaW50CittY2hfY2FuX3Jlc3RvcmVfdGl0bGUoKQoreworICAgIHJldHVybiAod2Jfd2luZG93ICE9IE5VTEwpOworfQorCisgICAgaW50CittY2hfY2FuX3Jlc3RvcmVfaWNvbigpCit7CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCisKKy8qCisgKiBJbnNlcnQgdXNlciBuYW1lIGluIHNbbGVuXS4KKyAqLworICAgIGludAorbWNoX2dldF91c2VyX25hbWUocywgbGVuKQorICAgIGNoYXJfdSAgKnM7CisgICAgaW50CSAgICBsZW47Cit7CisgICAgKnMgPSBOVUw7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBJbnNlcnQgaG9zdCBuYW1lIGlzIHNbbGVuXS4KKyAqLworICAgIHZvaWQKK21jaF9nZXRfaG9zdF9uYW1lKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworICAgIFNUUk5DUFkocywgIkFtaWdhIiwgbGVuKTsKK30KKworLyoKKyAqIHJldHVybiBwcm9jZXNzIElECisgKi8KKyAgICBsb25nCittY2hfZ2V0X3BpZCgpCit7CisgICAgcmV0dXJuIChsb25nKTA7Cit9CisKKy8qCisgKiBHZXQgbmFtZSBvZiBjdXJyZW50IGRpcmVjdG9yeSBpbnRvIGJ1ZmZlciAnYnVmJyBvZiBsZW5ndGggJ2xlbicgYnl0ZXMuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK21jaF9kaXJuYW1lKGJ1ZiwgbGVuKQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbGVuOworeworICAgIHJldHVybiBtY2hfRnVsbE5hbWUoKGNoYXJfdSAqKSIiLCBidWYsIGxlbiwgRkFMU0UpOworfQorCisvKgorICogZ2V0IGFic29sdXRlIGZpbGUgbmFtZSBpbnRvIGJ1ZmZlciAnYnVmJyBvZiBsZW5ndGggJ2xlbicgYnl0ZXMKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21jaF9GdWxsTmFtZShmbmFtZSwgYnVmLCBsZW4sIGZvcmNlKQorICAgIGNoYXJfdQkqZm5hbWUsICpidWY7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmb3JjZTsKK3sKKyAgICBCUFRSCWw7CisgICAgaW50CQlyZXR2YWwgPSBGQUlMOworICAgIGludAkJaTsKKworICAgIC8qIExvY2sgdGhlIGZpbGUuICBJZiBpdCBleGlzdHMsIHdlIGNhbiBnZXQgdGhlIGV4YWN0IG5hbWUuICovCisgICAgaWYgKChsID0gTG9jaygoVUJZVEUgKilmbmFtZSwgKGxvbmcpQUNDRVNTX1JFQUQpKSAhPSAoQlBUUikwKQorICAgIHsKKwlyZXR2YWwgPSBsb2NrMm5hbWUobCwgYnVmLCAobG9uZylsZW4gLSAxKTsKKwlVbkxvY2sobCk7CisgICAgfQorICAgIGVsc2UgaWYgKGZvcmNlIHx8ICFtY2hfaXNGdWxsTmFtZShmbmFtZSkpCSAgICAvKiBub3QgYSBmdWxsIHBhdGggeWV0ICovCisgICAgeworCS8qCisJICogSWYgdGhlIGZpbGUgY2Fubm90IGJlIGxvY2tlZCAoZG9lc24ndCBleGlzdCksIHRyeSB0byBsb2NrIHRoZQorCSAqIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBjb25jYXRlbmF0ZSB0aGUgZmlsZSBuYW1lLgorCSAqLworCWlmICgobCA9IExvY2soKFVCWVRFICopIiIsIChsb25nKUFDQ0VTU19SRUFEKSkgIT0gKEJQVFIpTlVMTCkKKwl7CisJICAgIHJldHZhbCA9IGxvY2sybmFtZShsLCBidWYsIChsb25nKWxlbik7CisJICAgIFVuTG9jayhsKTsKKwkgICAgaWYgKHJldHZhbCA9PSBPSykKKwkgICAgeworCQlpID0gU1RSTEVOKGJ1Zik7CisJCS8qIENvbmNhdGVuYXRlIHRoZSBmbmFtZSB0byB0aGUgZGlyZWN0b3J5LiAgRG9uJ3QgYWRkIGEgc2xhc2gKKwkJICogaWYgZm5hbWUgaXMgZW1wdHksIGJ1dCBkbyBjaGFuZ2UgIiIgdG8gIi8iLiAqLworCQlpZiAoaSA9PSAwIHx8ICpmbmFtZSAhPSBOVUwpCisJCXsKKwkJICAgIGlmIChpIDwgbGVuIC0gMSAmJiAoaSA9PSAwIHx8IGJ1ZltpIC0gMV0gIT0gJzonKSkKKwkJCWJ1ZltpKytdID0gJy8nOworCQkgICAgU1RSTkNQWShidWYgKyBpLCBmbmFtZSwgbGVuIC0gaSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKCpidWYgPT0gMCB8fCAqYnVmID09ICc6JykKKwlyZXR2YWwgPSBGQUlMOwkvKiBzb21ldGhpbmcgZmFpbGVkOyB1c2UgdGhlIGZpbGUgbmFtZSAqLworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiZm5hbWUiIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKi8KKyAgICBpbnQKK21jaF9pc0Z1bGxOYW1lKGZuYW1lKQorICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgcmV0dXJuICh2aW1fc3RyY2hyKGZuYW1lLCAnOicpICE9IE5VTEwgJiYgKmZuYW1lICE9ICc6Jyk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGZ1bGwgZmlsZSBuYW1lIGZyb20gYSBsb2NrLiBVc2UgMi4wIGZ1bmN0aW9uIGlmIHBvc3NpYmxlLCBiZWNhdXNlCisgKiB0aGUgYXJwIGZ1bmN0aW9uIGhhcyBtb3JlIHJlc3RyaWN0aW9ucyBvbiB0aGUgcGF0aCBsZW5ndGguCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgc3RhdGljIGludAorbG9jazJuYW1lKGxvY2ssIGJ1ZiwgbGVuKQorICAgIEJQVFIgICAgbG9jazsKKyAgICBjaGFyX3UgICpidWY7CisgICAgbG9uZyAgICBsZW47Cit7CisjaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoZG9zMikJCSAgICAvKiB1c2UgMi4wIGZ1bmN0aW9uICovCisjZW5kaWYKKwlyZXR1cm4gKChpbnQpTmFtZUZyb21Mb2NrKGxvY2ssIChVQllURSAqKWJ1ZiwgbGVuKSA/IE9LIDogRkFJTCk7CisjaWZkZWYgRkVBVF9BUlAKKyAgICBlbHNlCQkvKiB1c2UgYXJwIGZ1bmN0aW9uICovCisJcmV0dXJuICgoaW50KVBhdGhOYW1lKGxvY2ssIChjaGFyICopYnVmLCAobG9uZykobGVuLzMyKSkgPyBPSyA6IEZBSUwpOworI2VuZGlmCit9CisKKy8qCisgKiBnZXQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgJ25hbWUnCisgKiBSZXR1cm5zIC0xIHdoZW4gaXQgZG9lc24ndCBleGlzdC4KKyAqLworICAgIGxvbmcKK21jaF9nZXRwZXJtKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIHN0cnVjdCBGaWxlSW5mb0Jsb2NrICAgICpmaWI7CisgICAgbG9uZwkJICAgIHJldHZhbCA9IC0xOworCisgICAgZmliID0gZ2V0X2ZpYihuYW1lKTsKKyAgICBpZiAoZmliICE9IE5VTEwpCisgICAgeworCXJldHZhbCA9IGZpYi0+ZmliX1Byb3RlY3Rpb247CisJdmltX2ZyZWUoZmliKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIHNldCBmaWxlIHBlcm1pc3Npb24gZm9yICduYW1lJyB0byAncGVybScKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21jaF9zZXRwZXJtKG5hbWUsIHBlcm0pCisgICAgY2hhcl91CSpuYW1lOworICAgIGxvbmcJcGVybTsKK3sKKyAgICBwZXJtICY9IH5GSUJGX0FSQ0hJVkU7CQkvKiByZXNldCBhcmNoaXZlZCBiaXQgKi8KKyAgICByZXR1cm4gKFNldFByb3RlY3Rpb24oKFVCWVRFICopbmFtZSwgKGxvbmcpcGVybSkgPyBPSyA6IEZBSUwpOworfQorCisvKgorICogU2V0IGhpZGRlbiBmbGFnIGZvciAibmFtZSIuCisgKi8KKyAgICB2b2lkCittY2hfaGlkZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICAvKiBjYW4ndCBoaWRlIGEgZmlsZSAqLworfQorCisvKgorICogcmV0dXJuIEZBTFNFIGlmICJuYW1lIiBpcyBub3QgYSBkaXJlY3RvcnkKKyAqIHJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBhIGRpcmVjdG9yeS4KKyAqIHJldHVybiBGQUxTRSBmb3IgZXJyb3IuCisgKi8KKyAgICBpbnQKK21jaF9pc2RpcihuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBzdHJ1Y3QgRmlsZUluZm9CbG9jayAgICAqZmliOworICAgIGludAkJCSAgICByZXR2YWwgPSBGQUxTRTsKKworICAgIGZpYiA9IGdldF9maWIobmFtZSk7CisgICAgaWYgKGZpYiAhPSBOVUxMKQorICAgIHsKKwlyZXR2YWwgPSAoKGZpYi0+ZmliX0RpckVudHJ5VHlwZSA+PSAwKSA/IFRSVUUgOiBGQUxTRSk7CisJdmltX2ZyZWUoZmliKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIENyZWF0ZSBkaXJlY3RvcnkgIm5hbWUiLgorICovCisgICAgdm9pZAorbWNoX21rZGlyKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIEJQVFIJbG9jazsKKworICAgIGxvY2sgPSBDcmVhdGVEaXIobmFtZSk7CisgICAgaWYgKGxvY2sgIT0gTlVMTCkKKwlVbkxvY2sobG9jayk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gMSBpZiAibmFtZSIgY2FuIGJlIGV4ZWN1dGVkLCAwIGlmIG5vdC4KKyAqIFJldHVybiAtMSBpZiB1bmtub3duLgorICovCisgICAgaW50CittY2hfY2FuX2V4ZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICAvKiBUT0RPICovCisgICAgcmV0dXJuIC0xOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB3aGF0ICJuYW1lIiBpczoKKyAqIE5PREVfTk9STUFMOiBmaWxlIG9yIGRpcmVjdG9yeSAob3IgZG9lc24ndCBleGlzdCkKKyAqIE5PREVfV1JJVEFCTEU6IHdyaXRhYmxlIGRldmljZSwgc29ja2V0LCBmaWZvLCBldGMuCisgKiBOT0RFX09USEVSOiBub24td3JpdGFibGUgdGhpbmdzCisgKi8KKyAgICBpbnQKK21jaF9ub2RldHlwZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICAvKiBUT0RPICovCisgICAgcmV0dXJuIE5PREVfTk9STUFMOworfQorCisgICAgdm9pZAorbWNoX2Vhcmx5X2luaXQoKQoreworfQorCisvKgorICogQ2FyZWZ1bDogbWNoX2V4aXQoKSBtYXkgYmUgY2FsbGVkIGJlZm9yZSBtY2hfaW5pdCgpIQorICovCisgICAgdm9pZAorbWNoX2V4aXQocikKKyAgICBpbnQJCSAgICByOworeworICAgIGlmIChyYXdfaW4pCQkJICAgIC8qIHB1dCB0ZXJtaW5hbCBpbiAnbm9ybWFsJyBtb2RlICovCisgICAgeworCXNldHRtb2RlKFRNT0RFX0NPT0spOworCXN0b3B0ZXJtY2FwKCk7CisgICAgfQorICAgIG91dF9jaGFyKCdcbicpOworICAgIGlmIChyYXdfb3V0KQorICAgIHsKKwlpZiAodGVybV9jb25zb2xlKQorCXsKKwkgICAgd2luX3Jlc2l6ZV9vZmYoKTsJICAgIC8qIHdpbmRvdyByZXNpemUgZXZlbnRzIGRlLWFjdGl2YXRlZCAqLworCSAgICBpZiAoc2l6ZV9zZXQpCisJCU9VVF9TVFIoIlwyMzN0XDIzM3UiKTsJLyogcmVzZXQgd2luZG93IHNpemUgKENTSSB0IENTSSB1KSAqLworCX0KKwlvdXRfZmx1c2goKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgbWNoX3Jlc3RvcmVfdGl0bGUoMyk7CSAgICAvKiByZXN0b3JlIHdpbmRvdyB0aXRsZSAqLworI2VuZGlmCisKKyAgICBtbF9jbG9zZV9hbGwoVFJVRSk7CQkgICAgLyogcmVtb3ZlIGFsbCBtZW1maWxlcyAqLworCisjaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoQXJwQmFzZSkKKwlDbG9zZUxpYnJhcnkoKHN0cnVjdCBMaWJyYXJ5ICopIEFycEJhc2UpOworI2VuZGlmCisgICAgaWYgKGNsb3NlX3dpbikKKwlDbG9zZShyYXdfaW4pOworICAgIGlmIChyKQorCXByaW50ZihfKCJWaW0gZXhpdGluZyB3aXRoICVkXG4iKSwgcik7IC8qIHNvbWVob3cgdGhpcyBtYWtlcyA6Y3Egd29yayE/ICovCisgICAgZXhpdChyKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSByb3V0aW5lIGZvciBzZXR0aW5nIGEgZ2l2ZW4gc3RyZWFtIHRvIHJhdyBvciBjb29rZWQgbW9kZSBvbiB0aGUKKyAqIEFtaWdhIC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgYXJlIHVzaW5nIExhdHRpY2UgQyB0byBwcm9kdWNlIHByb2dyYW1zCisgKiB0aGF0IHdhbnQgdG8gcmVhZCBzaW5nbGUgY2hhcmFjdGVycyB3aXRoIHRoZSAiZ2V0Y2goKSIgb3IgImZnZXRjIiBjYWxsLgorICoKKyAqIFdyaXR0ZW4gOiAxOC1KdW4tODcgQnkgQ2h1Y2sgTWNNYW5pcy4KKyAqLworCisjZGVmaW5lIE1QKHh4KQkoKHN0cnVjdCBNc2dQb3J0ICopKChzdHJ1Y3QgRmlsZUhhbmRsZSAqKSAoQkFERFIoeHgpKSktPmZoX1R5cGUpCisKKy8qCisgKiBGdW5jdGlvbiBtY2hfc2V0dG1vZGUoKSAtIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIHBvaW50ZXIgdG8gJ3Jhdycgb3IKKyAqICdjb29rZWQnIG1vZGUuIFRoaXMgb25seSB3b3JrcyBvbiBUVFkncy4KKyAqCisgKiBSYXc6IGtlZXBzIERPUyBmcm9tIHRyYW5zbGF0aW5nIGtleXMgZm9yIHlvdSwgYWxzbyAoQklHIFdJTikgaXQgbWVhbnMKKyAqCWdldGNoKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdCBmb3IgYSByZXR1cm4uIFlvdQorICoJbG9zZSBlZGl0aW5nIGZlYXR1cmVzIHRob3VnaC4KKyAqCisgKiBDb29rZWQ6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGVzaWduYXRlIGZpbGUgcG9pbnRlciB0byBpdCdzIG5vcm1hbCwKKyAqCXdhaXQgZm9yIGEgPENSPiBtb2RlLiBUaGlzIGlzIGV4YWN0bHkgbGlrZSByYXcoKSBleGNlcHQgdGhhdAorICoJaXQgc2VuZHMgYSAwIHRvIHRoZSBjb25zb2xlIHRvIG1ha2UgaXQgYmFjayBpbnRvIGEgQ09OOiBmcm9tIGEgUkFXOgorICovCisgICAgdm9pZAorbWNoX3NldHRtb2RlKHRtb2RlKQorICAgIGludAkJdG1vZGU7Cit7CisjaWZkZWYgX19BUk9TX18KKyAgICBpZiAoIVNldE1vZGUocmF3X2luLCB0bW9kZSA9PSBUTU9ERV9SQVcgPyAxIDogMCkpCisjZWxzZQorICAgIGlmIChkb3NfcGFja2V0KE1QKHJhd19pbiksIChsb25nKUFDVElPTl9TQ1JFRU5fTU9ERSwKKwkJCQkJICB0bW9kZSA9PSBUTU9ERV9SQVcgPyAtMUwgOiAwTCkgPT0gMCkKKyNlbmRpZgorCW1jaF9lcnJtc2coXygiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIpKTsKK30KKworLyoKKyAqIHNldCBzY3JlZW4gbW9kZSwgYWx3YXlzIGZhaWxzLgorICovCisgICAgaW50CittY2hfc2NyZWVubW9kZShhcmcpCisgICAgY2hhcl91CSphcmc7Cit7CisgICAgRU1TRyhfKGVfc2NyZWVubW9kZSkpOworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogQ29kZSBmb3IgdGhpcyByb3V0aW5lIGNhbWUgZnJvbSB0aGUgZm9sbG93aW5nIDoKKyAqCisgKiBDb25QYWNrZXRzLmMgLSAgQy4gU2NoZXBwbmVyLCBBLiBGaW5rZWwsIFAuIExpbmRzYXkJQ0JNCisgKiAgIERPUyBwYWNrZXQgZXhhbXBsZQorICogICBSZXF1aXJlcyAxLjIKKyAqCisgKiBGb3VuZCBvbiBGaXNoIERpc2sgNTYuCisgKgorICogSGVhdmVseSBtb2RpZmllZCBieSBtb29sLgorICovCisKKyNpbmNsdWRlIDxkZXZpY2VzL2NvbnVuaXQuaD4KKworLyoKKyAqIHRyeSB0byBnZXQgdGhlIHJlYWwgd2luZG93IHNpemUKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWNoX2dldF9zaGVsbHNpemUoKQoreworICAgIHN0cnVjdCBDb25Vbml0ICAqY29uVW5pdDsKKyAgICBjaGFyCSAgICBpZF9hW3NpemVvZihzdHJ1Y3QgSW5mb0RhdGEpICsgM107CisgICAgc3RydWN0IEluZm9EYXRhICppZDsKKworICAgIGlmICghdGVybV9jb25zb2xlKQkvKiBub3QgYW4gYW1pZ2Egd2luZG93ICovCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKiBpbnN1cmUgbG9uZ3dvcmQgYWxpZ25tZW50ICovCisgICAgaWQgPSAoc3RydWN0IEluZm9EYXRhICopKCgobG9uZylpZF9hICsgM0wpICYgfjNMKTsKKworICAgIC8qCisgICAgICogU2hvdWxkIG1ha2UgY29uc29sZSBhd2FyZSBvZiByZWFsIHdpbmRvdyBzaXplLCBub3QgdGhlIG9uZSB3ZSBzZXQuCisgICAgICogVW5mb3J0dW5hdGVseSwgdW5kZXIgRE9TIDIuMHggdGhpcyByZWRyYXdzIHRoZSB3aW5kb3cgYW5kIGl0CisgICAgICogaXMgcmFyZWx5IG5lZWRlZCwgc28gd2Ugc2tpcCBpdCBub3csIHVubGVzcyB3ZSBjaGFuZ2VkIHRoZSBzaXplLgorICAgICAqLworICAgIGlmIChzaXplX3NldCkKKwlPVVRfU1RSKCJcMjMzdFwyMzN1Iik7CS8qIENTSSB0IENTSSB1ICovCisgICAgb3V0X2ZsdXNoKCk7CisKKyNpZmRlZiBfX0FST1NfXworICAgIGlmICghSW5mbyhyYXdfb3V0LCBpZCkKKwkJIHx8ICh3Yl93aW5kb3cgPSAoc3RydWN0IFdpbmRvdyAqKSBpZC0+aWRfVm9sdW1lTm9kZSkgPT0gTlVMTCkKKyNlbHNlCisgICAgaWYgKGRvc19wYWNrZXQoTVAocmF3X291dCksIChsb25nKUFDVElPTl9ESVNLX0lORk8sICgoVUxPTkcpIGlkKSA+PiAyKSA9PSAwCisJICAgIHx8ICh3Yl93aW5kb3cgPSAoc3RydWN0IFdpbmRvdyAqKWlkLT5pZF9Wb2x1bWVOb2RlKSA9PSBOVUxMKQorI2VuZGlmCisgICAgeworCS8qIGl0J3Mgbm90IGFuIGFtaWdhIHdpbmRvdywgbWF5YmUgYXV4IGRldmljZSAqLworCS8qIHRlcm1pbmFsIHR5cGUgc2hvdWxkIGJlIHNldCAqLworCXRlcm1fY29uc29sZSA9IEZBTFNFOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICBpZiAob2xkd2luZG93dGl0bGUgPT0gTlVMTCkKKwlvbGR3aW5kb3d0aXRsZSA9IChjaGFyX3UgKil3Yl93aW5kb3ctPlRpdGxlOworICAgIGlmIChpZC0+aWRfSW5Vc2UgPT0gKEJQVFIpTlVMTCkKKyAgICB7CisJbWNoX2Vycm1zZyhfKCJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGNvblVuaXQgPSAoc3RydWN0IENvblVuaXQgKikgKChzdHJ1Y3QgSU9TdGRSZXEgKikgaWQtPmlkX0luVXNlKS0+aW9fVW5pdDsKKworICAgIC8qIGdldCB3aW5kb3cgc2l6ZSAqLworICAgIFJvd3MgPSBjb25Vbml0LT5jdV9ZTWF4ICsgMTsKKyAgICBDb2x1bW5zID0gY29uVW5pdC0+Y3VfWE1heCArIDE7CisgICAgaWYgKFJvd3MgPCAwIHx8IFJvd3MgPiAyMDApCSAgICAvKiBjYW5ub3QgYmUgYW4gYW1pZ2Egd2luZG93ICovCisgICAgeworCUNvbHVtbnMgPSA4MDsKKwlSb3dzID0gMjQ7CisJdGVybV9jb25zb2xlID0gRkFMU0U7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogVHJ5IHRvIHNldCB0aGUgcmVhbCB3aW5kb3cgc2l6ZSB0byBSb3dzIGFuZCBDb2x1bW5zLgorICovCisgICAgdm9pZAorbWNoX3NldF9zaGVsbHNpemUoKQoreworICAgIGlmICh0ZXJtX2NvbnNvbGUpCisgICAgeworCXNpemVfc2V0ID0gVFJVRTsKKwlvdXRfY2hhcihDU0kpOworCW91dF9udW0oKGxvbmcpUm93cyk7CisJb3V0X2NoYXIoJ3QnKTsKKwlvdXRfY2hhcihDU0kpOworCW91dF9udW0oKGxvbmcpQ29sdW1ucyk7CisJb3V0X2NoYXIoJ3UnKTsKKwlvdXRfZmx1c2goKTsKKyAgICB9Cit9CisKKy8qCisgKiBSb3dzIGFuZC9vciBDb2x1bW5zIGhhcyBjaGFuZ2VkLgorICovCisgICAgdm9pZAorbWNoX25ld19zaGVsbHNpemUoKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8uICovCit9CisKKy8qCisgKiBvdXRfbnVtIC0gb3V0cHV0IGEgKGJpZykgbnVtYmVyIGZhc3QKKyAqLworICAgIHN0YXRpYyB2b2lkCitvdXRfbnVtKG4pCisgICAgbG9uZwluOworeworICAgIE9VVF9TVFJfTkYodGx0b2EoKHVuc2lnbmVkIGxvbmcpbikpOworfQorCisjaWYgIWRlZmluZWQoQVpURUNfQykgJiYgIWRlZmluZWQoX19BUk9TX18pCisvKgorICogU2VuZHBhY2tldC5jCisgKgorICogQW4gaW52YWx1YWJsZSBhZGRpdGlvbiB0byB5b3VyIEFtaWdhLmxpYiBmaWxlLiBUaGlzIGNvZGUgc2VuZHMgYSBwYWNrZXQgdG8KKyAqIHRoZSBnaXZlbiBtZXNzYWdlIHBvcnQuIFRoaXMgbWFrZXMgd29ya2luZyBhcm91bmQgRE9TIGxvdHMgZWFzaWVyLgorICoKKyAqIE5vdGUsIEkgZGlkbid0IHdyaXRlIHRoaXMsIHRob3NlIHdvbmRlcmZ1bCBmb2xrcyBhdCBDQk0gZGlkLiBJIGRvIHN1Z2dlc3QKKyAqIGhvd2V2ZXIgdGhhdCB5b3UgbWF5IHdpc2ggdG8gYWRkIGl0IHRvIEFtaWdhLkxpYiwgdG8gZG8gc28sIGNvbXBpbGUgaXQgYW5kCisgKiBzYXkgJ29tbCBsaWI6YW1pZ2EubGliIC1yIHNlbmRwYWNrZXQubycKKyAqLworCisvKiAjaW5jbHVkZSA8cHJvdG8vZXhlYy5oPiAqLworLyogI2luY2x1ZGUgPHByb3RvL2Rvcy5oPiAqLworI2luY2x1ZGUgPGV4ZWMvbWVtb3J5Lmg+CisKKy8qCisgKiBGdW5jdGlvbiAtIGRvc19wYWNrZXQgd3JpdHRlbiBieSBQaGlsIExpbmRzYXksIENhcm9seW4gU2NoZXBwbmVyLCBhbmQgQW5keQorICogRmlua2VsLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhIHBhY2tldCBvZiB0aGUgZ2l2ZW4gdHlwZSB0byB0aGUgTWVzc2FnZQorICogUG9ydCBzdXBwbGllZC4KKyAqLworCisgICAgc3RhdGljIGxvbmcKK2Rvc19wYWNrZXQocGlkLCBhY3Rpb24sIGFyZykKKyAgICBzdHJ1Y3QgTXNnUG9ydCAqcGlkOyAgICAvKiBwcm9jZXNzIGluZGVudGlmaWVyIC4uLiAoaGFuZGxlcnMgbWVzc2FnZSBwb3J0KSAqLworICAgIGxvbmcJICAgIGFjdGlvbiwgLyogcGFja2V0IHR5cGUgLi4uICh3aGF0IHlvdSB3YW50IGhhbmRsZXIgdG8gZG8pICAgKi8KKwkJICAgIGFyZzsgICAgLyogc2luZ2xlIGFyZ3VtZW50ICovCit7CisjIGlmZGVmIEZFQVRfQVJQCisgICAgc3RydWN0IE1zZ1BvcnQJICAgICpyZXBseXBvcnQ7CisgICAgc3RydWN0IFN0YW5kYXJkUGFja2V0ICAgKnBhY2tldDsKKyAgICBsb25nCQkgICAgcmVzMTsKKworICAgIGlmIChkb3MyKQorIyBlbmRpZgorCXJldHVybiBEb1BrdChwaWQsIGFjdGlvbiwgYXJnLCAwTCwgMEwsIDBMLCAwTCk7CS8qIHVzZSAyLjAgZnVuY3Rpb24gKi8KKyMgaWZkZWYgRkVBVF9BUlAKKworICAgIHJlcGx5cG9ydCA9IChzdHJ1Y3QgTXNnUG9ydCAqKSBDcmVhdGVQb3J0KE5VTEwsIDApOwkvKiB1c2UgYXJwIGZ1bmN0aW9uICovCisgICAgaWYgKCFyZXBseXBvcnQpCisJcmV0dXJuICgwKTsKKworICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHBhY2tldCwgbWFrZSBpdCBwdWJsaWMgYW5kIGNsZWFyIGl0ICovCisgICAgcGFja2V0ID0gKHN0cnVjdCBTdGFuZGFyZFBhY2tldCAqKQorCUFsbG9jTWVtKChsb25nKSBzaXplb2Yoc3RydWN0IFN0YW5kYXJkUGFja2V0KSwgTUVNRl9QVUJMSUMgfCBNRU1GX0NMRUFSKTsKKyAgICBpZiAoIXBhY2tldCkgeworCURlbGV0ZVBvcnQocmVwbHlwb3J0KTsKKwlyZXR1cm4gKDApOworICAgIH0KKyAgICBwYWNrZXQtPnNwX01zZy5tbl9Ob2RlLmxuX05hbWUgPSAoY2hhciAqKSAmKHBhY2tldC0+c3BfUGt0KTsKKyAgICBwYWNrZXQtPnNwX1BrdC5kcF9MaW5rID0gJihwYWNrZXQtPnNwX01zZyk7CisgICAgcGFja2V0LT5zcF9Qa3QuZHBfUG9ydCA9IHJlcGx5cG9ydDsKKyAgICBwYWNrZXQtPnNwX1BrdC5kcF9UeXBlID0gYWN0aW9uOworICAgIHBhY2tldC0+c3BfUGt0LmRwX0FyZzEgPSBhcmc7CisKKyAgICBQdXRNc2cocGlkLCAoc3RydWN0IE1lc3NhZ2UgKilwYWNrZXQpOwkvKiBzZW5kIHBhY2tldCAqLworCisgICAgV2FpdFBvcnQocmVwbHlwb3J0KTsKKyAgICBHZXRNc2cocmVwbHlwb3J0KTsKKworICAgIHJlczEgPSBwYWNrZXQtPnNwX1BrdC5kcF9SZXMxOworCisgICAgRnJlZU1lbShwYWNrZXQsIChsb25nKSBzaXplb2Yoc3RydWN0IFN0YW5kYXJkUGFja2V0KSk7CisgICAgRGVsZXRlUG9ydChyZXBseXBvcnQpOworCisgICAgcmV0dXJuIChyZXMxKTsKKyMgZW5kaWYKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChBWlRFQ19DKSAmJiAhZGVmaW5lZChfX0FST1NfXykgKi8KKworLyoKKyAqIENhbGwgc2hlbGwuCisgKiBSZXR1cm4gZXJyb3IgbnVtYmVyIGZvciBmYWlsdXJlLCAwIG90aGVyd2lzZQorICovCisgICAgaW50CittY2hfY2FsbF9zaGVsbChjbWQsIG9wdGlvbnMpCisgICAgY2hhcl91CSpjbWQ7CisgICAgaW50CQlvcHRpb25zOwkvKiBTSEVMTF8qLCBzZWUgdmltLmggKi8KK3sKKyAgICBCUFRSCW15ZGlyOworICAgIGludAkJeDsKKyAgICBpbnQJCXRtb2RlID0gY3VyX3Rtb2RlOworI2lmZGVmIEFaVEVDX0MKKyAgICBpbnQJCXVzZV9leGVjdXRlOworICAgIGNoYXJfdQkqc2hlbGxjbWQgPSBOVUxMOworICAgIGNoYXJfdQkqc2hlbGxhcmc7CisjZW5kaWYKKyAgICBpbnQJCXJldHZhbCA9IDA7CisKKyAgICBpZiAoY2xvc2Vfd2luKQorICAgIHsKKwkvKiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcyAqLworCUVNU0coXygiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iKSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICh0ZXJtX2NvbnNvbGUpCisJd2luX3Jlc2l6ZV9vZmYoKTsJICAgIC8qIHdpbmRvdyByZXNpemUgZXZlbnRzIGRlLWFjdGl2YXRlZCAqLworICAgIG91dF9mbHVzaCgpOworCisgICAgaWYgKG9wdGlvbnMgJiBTSEVMTF9DT09LRUQpCisJc2V0dG1vZGUoVE1PREVfQ09PSyk7CSAgICAvKiBzZXQgdG8gbm9ybWFsIG1vZGUgKi8KKyAgICBteWRpciA9IExvY2soKFVCWVRFICopIiIsIChsb25nKUFDQ0VTU19SRUFEKTsgICAvKiByZW1lbWJlciBjdXJyZW50IGRpciAqLworCisjaWYgIWRlZmluZWQoQVpURUNfQykJCSAgICAvKiBub3QgdGVzdGVkIHZlcnkgbXVjaCAqLworICAgIGlmIChjbWQgPT0gTlVMTCkKKyAgICB7CisjIGlmZGVmIEZFQVRfQVJQCisJaWYgKGRvczIpCisjIGVuZGlmCisJICAgIHggPSBTeXN0ZW1UYWdzKHBfc2gsIFNZU19Vc2VyU2hlbGwsIFRSVUUsIFRBR19ET05FKTsKKyMgaWZkZWYgRkVBVF9BUlAKKwllbHNlCisJICAgIHggPSBFeGVjdXRlKHBfc2gsIHJhd19pbiwgcmF3X291dCk7CisjIGVuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisjIGlmZGVmIEZFQVRfQVJQCisJaWYgKGRvczIpCisjIGVuZGlmCisJICAgIHggPSBTeXN0ZW1UYWdzKChjaGFyICopY21kLCBTWVNfVXNlclNoZWxsLCBUUlVFLCBUQUdfRE9ORSk7CisjIGlmZGVmIEZFQVRfQVJQCisJZWxzZQorCSAgICB4ID0gRXhlY3V0ZSgoY2hhciAqKWNtZCwgMEwsIHJhd19vdXQpOworIyBlbmRpZgorICAgIH0KKyMgaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoKGRvczIgJiYgeCA8IDApIHx8ICghZG9zMiAmJiAheCkpCisjIGVsc2UKKyAgICBpZiAoeCA8IDApCisjIGVuZGlmCisgICAgeworCU1TR19QVVRTKF8oIkNhbm5vdCBleGVjdXRlICIpKTsKKwlpZiAoY21kID09IE5VTEwpCisJeworCSAgICBNU0dfUFVUUyhfKCJzaGVsbCAiKSk7CisJICAgIG1zZ19vdXR0cmFucyhwX3NoKTsKKwl9CisJZWxzZQorCSAgICBtc2dfb3V0dHJhbnMoY21kKTsKKwltc2dfcHV0Y2hhcignXG4nKTsKKwlyZXR2YWwgPSAtMTsKKyAgICB9CisjIGlmZGVmIEZFQVRfQVJQCisgICAgZWxzZSBpZiAoIWRvczIgfHwgeCkKKyMgZWxzZQorICAgIGVsc2UgaWYgKHgpCisjIGVuZGlmCisgICAgeworCWlmICgoeCA9IElvRXJyKCkpICE9IDApCisJeworCSAgICBpZiAoIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSkKKwkgICAgeworCQltc2dfcHV0Y2hhcignXG4nKTsKKwkJbXNnX291dG51bSgobG9uZyl4KTsKKwkJTVNHX1BVVFMoXygiIHJldHVybmVkXG4iKSk7CisJICAgIH0KKwkgICAgcmV0dmFsID0geDsKKwl9CisgICAgfQorI2Vsc2UJLyogZWxzZSBwYXJ0IGlzIGZvciBBWlRFQ19DICovCisgICAgaWYgKHBfc3QgPj0gNCB8fCAocF9zdCA+PSAyICYmICEob3B0aW9ucyAmIFNIRUxMX0ZJTFRFUikpKQorCXVzZV9leGVjdXRlID0gMTsKKyAgICBlbHNlCisJdXNlX2V4ZWN1dGUgPSAwOworICAgIGlmICghdXNlX2V4ZWN1dGUpCisgICAgeworCS8qCisJICogc2VwYXJhdGUgc2hlbGwgbmFtZSBmcm9tIGFyZ3VtZW50CisJICovCisJc2hlbGxjbWQgPSB2aW1fc3Ryc2F2ZShwX3NoKTsKKwlpZiAoc2hlbGxjbWQgPT0gTlVMTCkJICAgIC8qIG91dCBvZiBtZW1vcnksIHVzZSBFeGVjdXRlICovCisJICAgIHVzZV9leGVjdXRlID0gMTsKKwllbHNlCisJeworCSAgICBzaGVsbGFyZyA9IHNraXB0b3doaXRlKHNoZWxsY21kKTsJLyogZmluZCBzdGFydCBvZiBhcmd1bWVudHMgKi8KKwkgICAgaWYgKCpzaGVsbGFyZyAhPSBOVUwpCisJICAgIHsKKwkJKnNoZWxsYXJnKysgPSBOVUw7CisJCXNoZWxsYXJnID0gc2tpcHdoaXRlKHNoZWxsYXJnKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGNtZCA9PSBOVUxMKQorICAgIHsKKwlpZiAodXNlX2V4ZWN1dGUpCisJeworIyBpZmRlZiBGRUFUX0FSUAorCSAgICBpZiAoZG9zMikKKyMgZW5kaWYKKwkJeCA9IFN5c3RlbVRhZ3MoKFVCWVRFICopcF9zaCwgU1lTX1VzZXJTaGVsbCwgVFJVRSwgVEFHX0RPTkUpOworIyBpZmRlZiBGRUFUX0FSUAorCSAgICBlbHNlCisJCXggPSAhRXhlY3V0ZSgoVUJZVEUgKilwX3NoLCByYXdfaW4sIHJhd19vdXQpOworIyBlbmRpZgorCX0KKwllbHNlCisJICAgIHggPSBmZXhlY2woKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGFyZywgTlVMTCk7CisgICAgfQorICAgIGVsc2UgaWYgKHVzZV9leGVjdXRlKQorICAgIHsKKyMgaWZkZWYgRkVBVF9BUlAKKwlpZiAoZG9zMikKKyMgZW5kaWYKKwkgICAgeCA9IFN5c3RlbVRhZ3MoKFVCWVRFICopY21kLCBTWVNfVXNlclNoZWxsLCBUUlVFLCBUQUdfRE9ORSk7CisjIGlmZGVmIEZFQVRfQVJQCisJZWxzZQorCSAgICB4ID0gIUV4ZWN1dGUoKFVCWVRFICopY21kLCAwTCwgcmF3X291dCk7CisjIGVuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHBfc3QgJiAxKQorCXggPSBmZXhlY2woKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGFyZywKKwkJCQkJCQkgICAoY2hhciAqKWNtZCwgTlVMTCk7CisgICAgZWxzZQorCXggPSBmZXhlY2woKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGNtZCwgKGNoYXIgKilzaGVsbGFyZywKKwkJCQkJICAgKGNoYXIgKilwX3NoY2YsIChjaGFyICopY21kLCBOVUxMKTsKKyMgaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoKGRvczIgJiYgeCA8IDApIHx8ICghZG9zMiAmJiB4KSkKKyMgZWxzZQorICAgIGlmICh4IDwgMCkKKyMgZW5kaWYKKyAgICB7CisJTVNHX1BVVFMoXygiQ2Fubm90IGV4ZWN1dGUgIikpOworCWlmICh1c2VfZXhlY3V0ZSkKKwl7CisJICAgIGlmIChjbWQgPT0gTlVMTCkKKwkJbXNnX291dHRyYW5zKHBfc2gpOworCSAgICBlbHNlCisJCW1zZ19vdXR0cmFucyhjbWQpOworCX0KKwllbHNlCisJeworCSAgICBNU0dfUFVUUyhfKCJzaGVsbCAiKSk7CisJICAgIG1zZ19vdXR0cmFucyhzaGVsbGNtZCk7CisJfQorCW1zZ19wdXRjaGFyKCdcbicpOworCXJldHZhbCA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmICh1c2VfZXhlY3V0ZSkKKwl7CisjIGlmZGVmIEZFQVRfQVJQCisJICAgIGlmICghZG9zMiB8fCB4KQorIyBlbHNlCisJICAgIGlmICh4KQorIyBlbmRpZgorCQl4ID0gSW9FcnIoKTsKKwl9CisJZWxzZQorCSAgICB4ID0gd2FpdCgpOworCWlmICh4KQorCXsKKwkgICAgaWYgKCEob3B0aW9ucyAmIFNIRUxMX1NJTEVOVCkgJiYgIWVtc2dfc2lsZW50KQorCSAgICB7CisJCW1zZ19wdXRjaGFyKCdcbicpOworCQltc2dfb3V0bnVtKChsb25nKXgpOworCQlNU0dfUFVUUyhfKCIgcmV0dXJuZWRcbiIpKTsKKwkgICAgfQorCSAgICByZXR2YWwgPSB4OworCX0KKyAgICB9CisgICAgdmltX2ZyZWUoc2hlbGxjbWQpOworI2VuZGlmCS8qIEFaVEVDX0MgKi8KKworICAgIGlmICgobXlkaXIgPSBDdXJyZW50RGlyKG15ZGlyKSkgIT0gMCkgLyogbWFrZSBzdXJlIHdlIHN0YXkgaW4gdGhlIHNhbWUgZGlyZWN0b3J5ICovCisJVW5Mb2NrKG15ZGlyKTsKKyAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorCXNldHRtb2RlKFRNT0RFX1JBVyk7CQkvKiBzZXQgdG8gcmF3IG1vZGUgKi8KKyNpZmRlZiBGRUFUX1RJVExFCisgICAgcmVzZXR0aXRsZSgpOworI2VuZGlmCisgICAgaWYgKHRlcm1fY29uc29sZSkKKwl3aW5fcmVzaXplX29uKCk7CQkvKiB3aW5kb3cgcmVzaXplIGV2ZW50cyBhY3RpdmF0ZWQgKi8KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogY2hlY2sgZm9yIGFuICJpbnRlcnJ1cHQgc2lnbmFsIgorICogV2Ugb25seSByZWFjdCB0byBhIENUUkwtQywgYnV0IGFsc28gY2xlYXIgdGhlIG90aGVyIGJyZWFrIHNpZ25hbHMgdG8gYXZvaWQKKyAqIHRyb3VibGUgd2l0aCBsYXR0aWNlLWMgcHJvZ3JhbXMuCisgKi8KKyAgICB2b2lkCittY2hfYnJlYWtjaGVjaygpCit7CisgICBpZiAoU2V0U2lnbmFsKDBMLCAobG9uZykoU0lHQlJFQUtGX0NUUkxfQ3xTSUdCUkVBS0ZfQ1RSTF9EfFNJR0JSRUFLRl9DVFJMX0V8U0lHQlJFQUtGX0NUUkxfRikpICYgU0lHQlJFQUtGX0NUUkxfQykKKwlnb3RfaW50ID0gVFJVRTsKK30KKworLyogdGhpcyByb3V0aW5lIGNhdXNlcyBtYW54IHRvIHVzZSB0aGlzIENoa19BYm9ydCgpIHJhdGhlciB0aGFuIGl0J3Mgb3duICovCisvKiBvdGhlcndpc2UgaXQgcmVzZXRzIG91ciBeQyB3aGVuIGRvaW5nIGFueSBJL08gKGV2ZW4gd2hlbiBFbmFibGVfQWJvcnQgKi8KKy8qIGlzIHplcm8pLiAgU2luY2Ugd2Ugd2FudCB0byBjaGVjayBmb3Igb3VyIG93biBeQydzCQkJICovCisKKyNpZmRlZiBfRENDCisjZGVmaW5lIENoa19BYm9ydCBjaGthYm9ydAorI2VuZGlmCisKKyNpZmRlZiBMQVRUSUNFCit2b2lkIF9fcmVnYXJncyBfX2Noa2Fib3J0KHZvaWQpOworCit2b2lkIF9fcmVnYXJncyBfX2Noa2Fib3J0KHZvaWQpCit7fQorCisjZWxzZQorICAgIGxvbmcKK0Noa19BYm9ydCh2b2lkKQoreworICAgIHJldHVybigwTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIG1jaF9leHBhbmRwYXRoKCkgLSB0aGlzIGNvZGUgZG9lcyB3aWxkLWNhcmQgcGF0dGVybiBtYXRjaGluZyB1c2luZyB0aGUgYXJwCisgKgkJICAgICAgcm91dGluZXMuCisgKgorICogInBhdCIgaGFzIGJhY2tzbGFzaGVzIGJlZm9yZSBjaGFycyB0aGF0IGFyZSBub3QgdG8gYmUgZXhwYW5kZWQuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZC4KKyAqCisgKiBUaGlzIGlzIGJhc2VkIG9uIFdpbGREZW1vMi5jIChmb3VuZCBpbiBhcnAxLjEgZGlzdHJpYnV0aW9uKS4KKyAqIFRoYXQgY29kZSdzIGNvcHlyaWdodCBmb2xsb3dzOgorICoJQ29weXJpZ2h0IChjKSAxOTg3LCBTY290dCBCYWxsYW50eW5lCisgKglVc2UgYW5kIGFidXNlIGFzIHlvdSBwbGVhc2UuCisgKi8KKworI2RlZmluZSBBTkNIT1JfQlVGX1NJWkUgKDUxMikKKyNkZWZpbmUgQU5DSE9SX1NJWkUgKHNpemVvZihzdHJ1Y3QgQW5jaG9yUGF0aCkgKyBBTkNIT1JfQlVGX1NJWkUpCisKKyAgICBpbnQKK21jaF9leHBhbmRwYXRoKGdhcCwgcGF0LCBmbGFncykKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJZmxhZ3M7CQkvKiBFV18qIGZsYWdzICovCit7CisgICAgc3RydWN0IEFuY2hvclBhdGgJKkFuY2hvcjsKKyAgICBMT05HCQlSZXN1bHQ7CisgICAgY2hhcl91CQkqc3RhcmJ1ZiwgKnNwLCAqZHA7CisgICAgaW50CQkJc3RhcnRfbGVuOworICAgIGludAkJCW1hdGNoZXM7CisKKyAgICBzdGFydF9sZW4gPSBnYXAtPmdhX2xlbjsKKworICAgIC8qIEdldCBvdXIgQW5jaG9yQmFzZSAqLworICAgIEFuY2hvciA9IChzdHJ1Y3QgQW5jaG9yUGF0aCAqKWFsbG9jX2NsZWFyKCh1bnNpZ25lZClBTkNIT1JfU0laRSk7CisgICAgaWYgKEFuY2hvciA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgQW5jaG9yLT5hcF9TdHJsZW4gPSBBTkNIT1JfQlVGX1NJWkU7ICAvKiBhcF9MZW5ndGggbm90IHN1cHBvcnRlZCBhbnltb3JlICovCisjaWZkZWYgQVBGX0RPRE9UCisgICAgQW5jaG9yLT5hcF9GbGFncyA9IEFQRl9ET0RPVCB8IEFQRl9ET1dJTEQ7CS8qIGFsbG93ICcuJyBmb3IgY3VycmVudCBkaXIgKi8KKyNlbHNlCisgICAgQW5jaG9yLT5hcF9GbGFncyA9IEFQRl9Eb0RvdCB8IEFQRl9Eb1dpbGQ7CS8qIGFsbG93ICcuJyBmb3IgY3VycmVudCBkaXIgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoZG9zMikKKyAgICB7CisjZW5kaWYKKwkvKiBoYWNrIHRvIHJlcGxhY2UgJyonIGJ5ICcjPycgKi8KKwlzdGFyYnVmID0gYWxsb2MoKHVuc2lnbmVkKSgyICogU1RSTEVOKHBhdCkgKyAxKSk7CisJaWYgKHN0YXJidWYgPT0gTlVMTCkKKwkgICAgZ290byBSZXR1cm47CisJZm9yIChzcCA9IHBhdCwgZHAgPSBzdGFyYnVmOyAqc3A7ICsrc3ApCisJeworCSAgICBpZiAoKnNwID09ICcqJykKKwkgICAgeworCQkqZHArKyA9ICcjJzsKKwkJKmRwKysgPSAnPyc7CisJICAgIH0KKwkgICAgZWxzZQorCQkqZHArKyA9ICpzcDsKKwl9CisJKmRwID0gTlVMOworCVJlc3VsdCA9IE1hdGNoRmlyc3QoKFVCWVRFICopc3RhcmJ1ZiwgQW5jaG9yKTsKKwl2aW1fZnJlZShzdGFyYnVmKTsKKyNpZmRlZiBGRUFUX0FSUAorICAgIH0KKyAgICBlbHNlCisJUmVzdWx0ID0gRmluZEZpcnN0KChjaGFyICopcGF0LCBBbmNob3IpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIExvb3AgdG8gZ2V0IGFsbCBtYXRjaGVzLgorICAgICAqLworICAgIHdoaWxlIChSZXN1bHQgPT0gMCkKKyAgICB7CisJYWRkZmlsZShnYXAsIChjaGFyX3UgKilBbmNob3ItPmFwX0J1ZiwgZmxhZ3MpOworI2lmZGVmIEZFQVRfQVJQCisJaWYgKGRvczIpCisjZW5kaWYKKwkgICAgUmVzdWx0ID0gTWF0Y2hOZXh0KEFuY2hvcik7CisjaWZkZWYgRkVBVF9BUlAKKwllbHNlCisJICAgIFJlc3VsdCA9IEZpbmROZXh0KEFuY2hvcik7CisjZW5kaWYKKyAgICB9CisgICAgbWF0Y2hlcyA9IGdhcC0+Z2FfbGVuIC0gc3RhcnRfbGVuOworCisgICAgaWYgKFJlc3VsdCA9PSBFUlJPUl9CVUZGRVJfT1ZFUkZMT1cpCisJRU1TRyhfKCJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIpKTsKKyAgICBlbHNlIGlmIChtYXRjaGVzID09IDAgJiYgUmVzdWx0ICE9IEVSUk9SX09CSkVDVF9OT1RfRk9VTkQKKwkJCSAgJiYgUmVzdWx0ICE9IEVSUk9SX0RFVklDRV9OT1RfTU9VTlRFRAorCQkJICAmJiBSZXN1bHQgIT0gRVJST1JfTk9fTU9SRV9FTlRSSUVTKQorCUVNU0coXygiSS9PIEVSUk9SIikpOworCisgICAgLyoKKyAgICAgKiBTb3J0IHRoZSBmaWxlcyBmb3IgdGhpcyBwYXR0ZXJuLgorICAgICAqLworICAgIGlmIChtYXRjaGVzKQorCXFzb3J0KCh2b2lkICopKCgoY2hhcl91ICoqKWdhcC0+Z2FfZGF0YSkgKyBzdGFydF9sZW4pLAorCQkJCSAgKHNpemVfdCltYXRjaGVzLCBzaXplb2YoY2hhcl91ICopLCBzb3J0Y21wKTsKKworICAgIC8qIEZyZWUgdGhlIHdpbGRjYXJkIHN0dWZmICovCisjaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoZG9zMikKKyNlbmRpZgorCU1hdGNoRW5kKEFuY2hvcik7CisjaWZkZWYgRkVBVF9BUlAKKyAgICBlbHNlCisJRnJlZUFuY2hvckNoYWluKEFuY2hvcik7CisjZW5kaWYKKworUmV0dXJuOgorICAgIHZpbV9mcmVlKEFuY2hvcik7CisKKyAgICByZXR1cm4gbWF0Y2hlczsKK30KKworICAgIHN0YXRpYyBpbnQKK3NvcnRjbXAoYSwgYikKKyAgICBjb25zdCB2b2lkICphLCAqYjsKK3sKKyAgICBjaGFyICpzID0gKihjaGFyICoqKWE7CisgICAgY2hhciAqdCA9ICooY2hhciAqKiliOworCisgICAgcmV0dXJuIHBhdGhjbXAocywgdCk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAicCIgaGFzIHdpbGRjYXJkcyB0aGF0IGNhbiBiZSBleHBhbmRlZCBieSBtY2hfZXhwYW5kcGF0aCgpLgorICovCisgICAgaW50CittY2hfaGFzX2V4cF93aWxkY2FyZChwKQorICAgIGNoYXJfdSAqcDsKK3sKKyAgICBmb3IgKCA7ICpwOyArK3ApCisgICAgeworCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCSAgICArK3A7CisJZWxzZSBpZiAodmltX3N0cmNocigoY2hhcl91ICopIio/WygjIiwgKnApICE9IE5VTEwpCisJICAgIHJldHVybiBUUlVFOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworICAgIGludAorbWNoX2hhc193aWxkY2FyZChwKQorICAgIGNoYXJfdSAqcDsKK3sKKyAgICBmb3IgKCA7ICpwOyArK3ApCisgICAgeworCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCSAgICArK3A7CisJZWxzZQorCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopCisjICBpZmRlZiBWSU1fQkFDS1RJQ0sKKwkJCQkgICAgIio/WygjJGAiCisjICBlbHNlCisJCQkJICAgICIqP1soIyQiCisjICBlbmRpZgorCQkJCQkJLCAqcCkgIT0gTlVMTAorCQkgICAgfHwgKCpwID09ICd+JyAmJiBwWzFdICE9IE5VTCkpCisJCXJldHVybiBUUlVFOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFdpdGggQW1pZ2FET1MgMi4wIHN1cHBvcnQgZm9yIHJlYWRpbmcgbG9jYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKgorICogVHdvIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZDoKKyAqIC0gQSBiaWcgb25lIHRvIGRvIHRoZSBleHBhbnNpb24gaW50by4gIEl0IGlzIGZyZWVkIGJlZm9yZSByZXR1cm5pbmcuCisgKiAtIEEgc21hbGwgb25lIHRvIGhvbGQgdGhlIHJldHVybiB2YWx1ZS4gIEl0IGlzIGtlcHQgdW50aWwgdGhlIG5leHQgY2FsbC4KKyAqLworICAgIGNoYXJfdSAqCittY2hfZ2V0ZW52KHZhcikKKyAgICBjaGFyX3UgKnZhcjsKK3sKKyAgICBpbnQJCSAgICBsZW47CisgICAgVUJZVEUJICAgICpidWY7CQkvKiBidWZmZXIgdG8gZXhwYW5kIGluICovCisgICAgY2hhcl91CSAgICAqcmV0dmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisgICAgc3RhdGljIGNoYXJfdSAgICphbGxvY2VkID0gTlVMTDsJLyogYWxsb2NhdGVkIG1lbW9yeSAqLworCisjaWZkZWYgRkVBVF9BUlAKKyAgICBpZiAoIWRvczIpCisJcmV0dmFsID0gKGNoYXJfdSAqKWdldGVudigoY2hhciAqKXZhcik7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCXZpbV9mcmVlKGFsbG9jZWQpOworCWFsbG9jZWQgPSBOVUxMOworCXJldHZhbCA9IE5VTEw7CisKKwlidWYgPSBhbGxvYyhJT1NJWkUpOworCWlmIChidWYgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBHZXRWYXIoKFVCWVRFICopdmFyLCBidWYsIChsb25nKShJT1NJWkUgLSAxKSwgKGxvbmcpMCk7CisJaWYgKGxlbiA+PSAwKQorCXsKKwkgICAgcmV0dmFsID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKWJ1Zik7CisJICAgIGFsbG9jZWQgPSByZXR2YWw7CisJfQorCisJdmltX2ZyZWUoYnVmKTsKKyAgICB9CisKKyAgICAvKiBpZiAkVklNIGlzIG5vdCBkZWZpbmVkLCB1c2UgInZpbToiIGluc3RlYWQgKi8KKyAgICBpZiAocmV0dmFsID09IE5VTEwgJiYgU1RSQ01QKHZhciwgIlZJTSIpID09IDApCisJcmV0dmFsID0gKGNoYXJfdSAqKSJ2aW06IjsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBBbWlnYSB2ZXJzaW9uIG9mIHNldGVudigpIHdpdGggQW1pZ2FET1MgMi4wIHN1cHBvcnQuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgaW50CittY2hfc2V0ZW52KHZhciwgdmFsdWUsIHgpCisgICAgY2hhciAqdmFyOworICAgIGNoYXIgKnZhbHVlOworICAgIGludAkgeDsKK3sKKyNpZmRlZiBGRUFUX0FSUAorICAgIGlmICghZG9zMikKKwlyZXR1cm4gc2V0ZW52KHZhciwgdmFsdWUpOworI2VuZGlmCisKKyAgICBpZiAoU2V0VmFyKChVQllURSAqKXZhciwgKFVCWVRFICopdmFsdWUsIChMT05HKS0xLCAoVUxPTkcpR1ZGX0xPQ0FMX09OTFkpKQorCXJldHVybiAwOyAgIC8qIHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gLTE7CSAgICAvKiBmYWlsdXJlICovCit9CmRpZmYgLS1naXQgYS9zcmMvb3NfYW1pZ2EuaCBiL3NyYy9vc19hbWlnYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTRkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfYW1pZ2EuaApAQCAtMCwwICsxLDIwMSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIEFtaWdhIE1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncworICovCisKKyNkZWZpbmUgQ0FTRV9JTlNFTlNJVElWRV9GSUxFTkFNRSAgIC8qIGlnbm9yZSBjYXNlIHdoZW4gY29tcGFyaW5nIGZpbGUgbmFtZXMgKi8KKyNkZWZpbmUgU1BBQ0VfSU5fRklMRU5BTUUKKyNkZWZpbmUgVVNFX0ZOQU1FX0NBU0UJCSAgICAvKiBhZGp1c3QgY2FzZSBvZiBmaWxlIG5hbWVzICovCisjZGVmaW5lIFVTRV9URVJNX0NPTlNPTEUKKyNkZWZpbmUgSEFWRV9BVkFJTF9NRU0KKworI2lmbmRlZiBIQVZFX0NPTkZJR19ICisjIGlmZGVmIEFaVEVDX0MKKyMgIGRlZmluZSBIQVZFX1NUQVRfSAorIyBlbmRpZgorIyBkZWZpbmUgSEFWRV9TVERMSUJfSAorIyBkZWZpbmUgSEFWRV9TVFJJTkdfSAorIyBkZWZpbmUgSEFWRV9GQ05UTF9ICisjIGRlZmluZSBIQVZFX1NUUkNTUE4KKyMgZGVmaW5lIEhBVkVfU1RSSUNNUAorIyBkZWZpbmUgSEFWRV9TVFJOSUNNUAorIyBkZWZpbmUgSEFWRV9TVFJGVElNRQkgICAgLyogZ3Vlc3NlZCAqLworIyBkZWZpbmUgSEFWRV9TRVRFTlYKKyMgZGVmaW5lIEhBVkVfTUVNU0VUCisjIGRlZmluZSBIQVZFX1FTT1JUCisjIGlmIGRlZmluZWQoX19EQVRFX18pICYmIGRlZmluZWQoX19USU1FX18pCisjICBkZWZpbmUgSEFWRV9EQVRFX1RJTUUKKyMgZW5kaWYKKworI2RlZmluZSBERkxUX0VSUk9SRklMRQkJIkF6dGVjQy5FcnIiCisjZGVmaW5lIERGTFRfUlVOVElNRVBBVEggImhvbWU6dmltZmlsZXMsJFZJTS92aW1maWxlcywkVklNUlVOVElNRSwkVklNL3ZpbWZpbGVzL2FmdGVyLGhvbWU6dmltZmlsZXMvYWZ0ZXIiCisKKyNkZWZpbmUgQkFTRU5BTUVMRU4JMjYJLyogQW1pZ2EgKi8KKworI2RlZmluZSBURU1QTkFNRQkidDp2P1hYWFhYWCIKKyNkZWZpbmUgVEVNUE5BTUVMRU4JMTIKKworI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KKworI2luY2x1ZGUgPGV4ZWMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJyYXJpZXMvZG9zLmg+CisjaW5jbHVkZSA8bGlicmFyaWVzL2Rvc2V4dGVucy5oPgorCisvKiBDdXJyZW50bHksIGFsbCBBbWlnYSBjb21waWxlcnMgZXhjZXB0IEFaVEVDIEMgaGF2ZSB0aGVzZS4uLiAqLworI2lmbmRlZiBBWlRFQ19DCisjIGluY2x1ZGUgPHByb3RvL2V4ZWMuaD4KKyMgaW5jbHVkZSA8cHJvdG8vZG9zLmg+CisjIGluY2x1ZGUgPHByb3RvL2ludHVpdGlvbi5oPgorI2VuZGlmCisKKyNkZWZpbmUgRk5BTUVfSUxMRUdBTCAiOyo/YCMlIiAvKiBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUgKi8KKworLyoKKyAqIE1hbnggZG9lc24ndCBoYXZlIG9mZl90LCBkZWZpbmUgaXQgaGVyZS4KKyAqLworI2lmZGVmIEFaVEVDX0MKK3R5cGVkZWYgbG9uZyBvZmZfdDsKKyNlbmRpZgorCisjaWZkZWYgTEFUVElDRQorIyBkZWZpbmUgVVNFX1RNUE5BTQkvKiB1c2UgdG1wbmFtKCkgaW5zdGVhZCBvZiBta3RlbXAoKSAqLworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisvKgorICogYXJwYmFzZS5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIGZ1bmN0aW9ucy5oCisgKi8KKyNpZmRlZiBGRUFUX0FSUAorIyBpbmNsdWRlIDxsaWJyYXJpZXMvYXJwYmFzZS5oPgorI2VuZGlmCisKKy8qCisgKiBUaGlzIHdvbid0IGJlIG5lZWRlZCBpZiB5b3UgaGF2ZSBhIHZlcnNpb24gb2YgTGF0dGljZSA0LjAxIHdpdGhvdXQgYnJva2VuCisgKiBicmVhayBzaWduYWwgaGFuZGxpbmcuCisgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyoKKyAqIE5hbWVzIGZvciB0aGUgRVhSQywgSEVMUCBhbmQgdGVtcG9yYXJ5IGZpbGVzLgorICogU29tZSBvZiB0aGVzZSBtYXkgaGF2ZSBiZWVuIGRlZmluZWQgaW4gdGhlIG1ha2VmaWxlLgorICovCisjaWZuZGVmIFNZU19WSU1SQ19GSUxFCisjIGRlZmluZSBTWVNfVklNUkNfRklMRSAiJFZJTS92aW1yYyIKKyNlbmRpZgorI2lmbmRlZiBTWVNfR1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFNZU19HVklNUkNfRklMRSAiJFZJTS9ndmltcmMiCisjZW5kaWYKKyNpZm5kZWYgU1lTX01FTlVfRklMRQorIyBkZWZpbmUgU1lTX01FTlVfRklMRQkiJFZJTVJVTlRJTUUvbWVudS52aW0iCisjZW5kaWYKKyNpZm5kZWYgREZMVF9IRUxQRklMRQorIyBkZWZpbmUgREZMVF9IRUxQRklMRQkiJFZJTVJVTlRJTUUvZG9jL2hlbHAudHh0IgorI2VuZGlmCisjaWZuZGVmIEZJTEVUWVBFX0ZJTEUKKyMgZGVmaW5lIEZJTEVUWVBFX0ZJTEUJImZpbGV0eXBlLnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVFBMVUdJTl9GSUxFCisjIGRlZmluZSBGVFBMVUdJTl9GSUxFCSJmdHBsdWdpbi52aW0iCisjZW5kaWYKKyNpZm5kZWYgSU5ERU5UX0ZJTEUKKyMgZGVmaW5lIElOREVOVF9GSUxFCSJpbmRlbnQudmltIgorI2VuZGlmCisjaWZuZGVmIEZUT0ZGX0ZJTEUKKyMgZGVmaW5lIEZUT0ZGX0ZJTEUJImZ0b2ZmLnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVFBMVUdPRl9GSUxFCisjIGRlZmluZSBGVFBMVUdPRl9GSUxFCSJmdHBsdWdvZi52aW0iCisjZW5kaWYKKyNpZm5kZWYgSU5ET0ZGX0ZJTEUKKyMgZGVmaW5lIElORE9GRl9GSUxFCSJpbmRvZmYudmltIgorI2VuZGlmCisjaWZuZGVmIFNZTlRBWF9GTkFNRQorIyBkZWZpbmUgU1lOVEFYX0ZOQU1FCSIkVklNUlVOVElNRS9zeW50YXgvJXMudmltIgorI2VuZGlmCisKKyNpZm5kZWYgVVNSX0VYUkNfRklMRQorIyBkZWZpbmUgVVNSX0VYUkNfRklMRQkiczouZXhyYyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfRVhSQ19GSUxFMgorIyBkZWZpbmUgVVNSX0VYUkNfRklMRTIJImhvbWU6LmV4cmMiCisjZW5kaWYKKworI2lmbmRlZiBVU1JfVklNUkNfRklMRQorIyBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUJInM6LnZpbXJjIgorI2VuZGlmCisjaWZuZGVmIFVTUl9WSU1SQ19GSUxFMgorIyBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUyICJob21lOi52aW1yYyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfVklNUkNfRklMRTMKKyMgZGVmaW5lIFVTUl9WSU1SQ19GSUxFMyAiJFZJTS8udmltcmMiCisjZW5kaWYKKyNpZm5kZWYgRVZJTV9GSUxFCisjIGRlZmluZSBFVklNX0ZJTEUJIiRWSU1SVU5USU1FL2V2aW0udmltIgorI2VuZGlmCisKKyNpZm5kZWYgVVNSX0dWSU1SQ19GSUxFCisjIGRlZmluZSBVU1JfR1ZJTVJDX0ZJTEUgInM6Lmd2aW1yYyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfR1ZJTVJDX0ZJTEUyCisjIGRlZmluZSBVU1JfR1ZJTVJDX0ZJTEUyICJob21lOi5ndmltcmMiCisjZW5kaWYKKyNpZm5kZWYgVVNSX0dWSU1SQ19GSUxFMworIyBkZWZpbmUgVVNSX0dWSU1SQ19GSUxFMyAiJFZJTS8uZ3ZpbXJjIgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKyNpZm5kZWYgVklNSU5GT19GSUxFCisjIGRlZmluZSBWSU1JTkZPX0ZJTEUJInM6LnZpbWluZm8iCisjZW5kaWYKKyNlbmRpZiAvKiBGRUFUX1ZJTUlORk8gKi8KKworI2lmbmRlZiBFWFJDX0ZJTEUKKyMgZGVmaW5lIEVYUkNfRklMRQkiLmV4cmMiCisjZW5kaWYKKworI2lmbmRlZiBWSU1SQ19GSUxFCisjIGRlZmluZSBWSU1SQ19GSUxFCSIudmltcmMiCisjZW5kaWYKKworI2lmbmRlZiBHVklNUkNfRklMRQorIyBkZWZpbmUgR1ZJTVJDX0ZJTEUJIi5ndmltcmMiCisjZW5kaWYKKworI2lmbmRlZiBERkxUX0JESVIKKyMgZGVmaW5lIERGTFRfQkRJUgkiLix0OiIJCS8qIGRlZmF1bHQgZm9yICdiYWNrdXBkaXInICovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX0RJUgorIyBkZWZpbmUgREZMVF9ESVIJIi4sdDoiCQkvKiBkZWZhdWx0IGZvciAnZGlyZWN0b3J5JyAqLworI2VuZGlmCisKKyNpZm5kZWYgREZMVF9WRElSCisjIGRlZmluZSBERkxUX1ZESVIJIiRWSU0vdmltZmlsZXMvdmlldyIJLyogZGVmYXVsdCBmb3IgJ3ZpZXdkaXInICovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX01BWE1FTQorIyBkZWZpbmUgREZMVF9NQVhNRU0JMjU2CQkvKiB1c2UgdXAgdG8gMjU2S2J5dGUgZm9yIGJ1ZmZlciAqLworI2VuZGlmCisjaWZuZGVmIERGTFRfTUFYTUVNVE9UCisjIGRlZmluZSBERkxUX01BWE1FTVRPVAkwCQkvKiBkZWNpZGUgaW4gc2V0X2luaXQgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTQVNDKQoraW50IHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2RlZmluZSBtY2hfcmVtb3ZlKHgpIHJlbW92ZSgoY2hhciAqKSh4KSkKKyNkZWZpbmUgbWNoX3JlbmFtZShzcmMsIGRzdCkgcmVuYW1lKHNyYywgZHN0KQorI2RlZmluZSBtY2hfY2hkaXIocykgY2hkaXIocykKKyNkZWZpbmUgdmltX21rZGlyKHgsIHkpIG1jaF9ta2Rpcih4KQpkaWZmIC0tZ2l0IGEvc3JjL29zX2Jlb3MuYyBiL3NyYy9vc19iZW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MmNhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc19iZW9zLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkgQmVCb3ggcG9ydCBDb3B5cmlnaHQgMTk5NyBieSBPbGFmIFNlaWJlcnQuCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogb3NfYmVvcy5jICBBZGRpdGlvbmFsIHN0dWZmIGZvciBCZU9TIChyZXN0IGlzIGluIG9zX3VuaXguYykKKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8a2VybmVsL09TLmg+CisjaW5jbHVkZSAidmltLmgiCisKKyNpZiBVU0VfVEhSRUFEX0ZPUl9JTlBVVF9XSVRIX1RJTUVPVVQKKworI2lmZGVmIFBST1RPCSAgICAvKiBtYWtpbmcgcHJvdG90eXBlcyBvbiBVbml4ICovCisjZGVmaW5lIHNlbV9pZCBpbnQKKyNkZWZpbmUgdGhyZWFkX2lkIGludAorI2VuZGlmCisKK2NoYXJfdSBjaGFyYnVmOworc2lnbmVkIGNoYXIgY2hhcmNvdW50Oworc2VtX2lkIGNoYXJhY3Rlcl9wcmVzZW50Oworc2VtX2lkIGNoYXJhY3Rlcl93YW50ZWQ7Cit0aHJlYWRfaWQgcmVhZF90aHJlYWRfaWQ7CisKKyNkZWZpbmUgVFJZX0FCT1JUCTAJLyogVGhpcyBjb2RlIGRvZXMgbm90IHdvcmsgc28gdHVybiBpdCBvZmYuICovCisKKyNpZiBUUllfQUJPUlQKKyAgICBzdGF0aWMgdm9pZAorbW9zdGx5X2lnbm9yZShpbnQgc2lnKQoreworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgbG9uZworcmVhZF90aHJlYWQodm9pZCAqZHVtbXkpCit7CisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisgICAgc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworI2lmIFRSWV9BQk9SVAorICAgIHNpZ25hbChTSUdVU1IxLCBtb3N0bHlfaWdub3JlKTsKKyNlbmRpZgorCisgICAgZm9yICg7OykgeworCWlmIChhY3F1aXJlX3NlbShjaGFyYWN0ZXJfd2FudGVkKSAhPSBCX05PX0VSUk9SKQorCSAgICBicmVhazsKKwljaGFyY291bnQgPSByZWFkKHJlYWRfY21kX2ZkLCAmY2hhcmJ1ZiwgMSk7CisJcmVsZWFzZV9zZW0oY2hhcmFjdGVyX3ByZXNlbnQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisgICAgdm9pZAorYmVvc19jbGVhbnVwX3JlYWRfdGhyZWFkKHZvaWQpCit7CisgICAgaWYgKGNoYXJhY3Rlcl9wcmVzZW50ID4gMCkKKwlkZWxldGVfc2VtKGNoYXJhY3Rlcl9wcmVzZW50KTsKKyAgICBjaGFyYWN0ZXJfcHJlc2VudCA9IDA7CisgICAgaWYgKHJlYWRfdGhyZWFkX2lkID4gMCkKKwlraWxsX3RocmVhZChyZWFkX3RocmVhZF9pZCk7CisgICAgcmVhZF90aHJlYWRfaWQgPSAwOworfQorCisjZW5kaWYKKworLyoKKyAqIHNlbGVjdCgpIGVtdWxhdGlvbi4gSG9wZWZ1bGx5LCBpbiBEUjkgdGhlcmUgd2lsbCBiZSBzb21ldGhpbmcKKyAqIHVzZWZ1bCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLiAuLi4gQWxhcywgbm90LiBOb3QgaW4gQUFQUiwgbm9yCisgKiBpbiBQUiBvciBldmVuIFBSMi4uLiBSMyB0aGVuIG1heWJlPyBJIGRvbid0IHRoaW5rIHNvIQorICovCisKKyAgICBpbnQKK2Jlb3Nfc2VsZWN0KGludCBuYml0cywKKyAgICAgICBzdHJ1Y3QgZmRfc2V0ICpyYml0cywKKyAgICAgICBzdHJ1Y3QgZmRfc2V0ICp3Yml0cywKKyAgICAgICBzdHJ1Y3QgZmRfc2V0ICplYml0cywKKyAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKyAgICBiaWd0aW1lX3QgdG1vOworCisgICAgaWYgKG5iaXRzID09IDApIHsKKwkvKiBzZWxlY3QgaXMgcHVyZWx5IGJlaW5nIHVzZWQgZm9yIGRlbGF5ICovCisJc25vb3plKHRpbWVvdXQtPnR2X3NlYyAqIDFlNiArIHRpbWVvdXQtPnR2X3VzZWMpOworCXJldHVybiAwOworICAgIH0KKyNpZiAwCisgICAgLyoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHNlZW0gdG8gd29yayBlaXRoZXIuIFJlYWRzIGhlcmUgYXJlIG5vdCBzdXBwb3NlZCB0bworICAgICAqIGJsb2NrIGluZGVmaW5pdGVseSwgeWV0IHRoZXkgZG8uIFRoaXMgaXMgbW9zdCBhbm5veWluZy4KKyAgICAgKi8KKyAgICBpZiAoRkRfSVNTRVQoMCwgcmJpdHMpKSB7CisJY2hhciBjYnVmWzFdOworCWludCBjb3VudDsKKwlzdHJ1Y3QgdGVybWlvcyB0b2xkOworCXN0cnVjdCB0ZXJtaW9zIHRuZXc7CisJdGNnZXRhdHRyKDAsICZ0b2xkKTsKKwl0bmV3ID0gdG9sZDsKKwl0bmV3LmNfbGZsYWcgJj0gfklDQU5PTjsKKwl0bmV3LmNfY2NbVk1JTl0gPSAwOworCXRuZXcuY19jY1tWVElNRV0gPSB0aW1lb3V0LT50dl9zZWMgKiAxMCArIHRpbWVvdXQtPnR2X3VzZWMgLyAxMDAwMDA7CisJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0bmV3KTsKKworCWNvdW50ID0gcmVhZCgwLCAmY2J1Ziwgc2l6ZW9mKGNidWYpKTsKKwl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRvbGQpOworCWlmIChjb3VudCA+IDApIHsKKwkgICAgYWRkX3RvX2lucHV0X2J1ZigmY2J1ZlswXSwgY291bnQpOworCSAgICByZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisjaWYgVVNFX1RIUkVBRF9GT1JfSU5QVVRfV0lUSF9USU1FT1VUCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgb3BlcmF0aW9uIGlzIHJlYWxseSBvbiBzdGRpbi4uLgorICAgICAqLworICAgIGlmIChGRF9JU1NFVChyZWFkX2NtZF9mZCwgcmJpdHMpKQorICAgIHsKKwlpbnQgYWNxdWlyZWQ7CisKKwkvKgorCSAqIElzIHRoaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaD8KKwkgKiBUaGVuIHN0YXJ0IHVwIHRoZSB0aHJlYWQgYW5kIGluaXRpYWxpc2UgdGhlIHNlbWFwaG9yZXMuCisJICovCisJaWYgKGNoYXJhY3Rlcl9wcmVzZW50ID09IDApIHsKKwkgICAgY2hhcmFjdGVyX3ByZXNlbnQgPSBjcmVhdGVfc2VtKDAsICJ2aW0gY2hhcmFjdGVyX3ByZXNlbnQiKTsKKwkgICAgY2hhcmFjdGVyX3dhbnRlZCA9IGNyZWF0ZV9zZW0oMSwgInZpbSBjaGFyYWN0ZXJfd2FudGVkIik7CisJICAgIHJlYWRfdGhyZWFkX2lkID0gc3Bhd25fdGhyZWFkKHJlYWRfdGhyZWFkLCAidmltIGFzeW5jIHJlYWQiLAorCQkgICAgQl9OT1JNQUxfUFJJT1JJVFksIE5VTEwpOworCSAgICBhdGV4aXQoYmVvc19jbGVhbnVwX3JlYWRfdGhyZWFkKTsKKwkgICAgcmVzdW1lX3RocmVhZChyZWFkX3RocmVhZF9pZCk7CisJfQorCisJLyogdGltZW91dCA9PSBOVUxMIG1lYW5zICJpbmRlZmluaXRlbHkiICovCisJaWYgKHRpbWVvdXQpIHsKKwkgICAgdG1vID0gdGltZW91dC0+dHZfc2VjICogMWU2ICsgdGltZW91dC0+dHZfdXNlYzsKKwkgICAgLyogMCBtZWFucyAiZG9uJ3Qgd2FpdCwgd2hpY2ggaXMgaW1wb3NzaWJsZSB0byBkbyBleGFjdGx5LiAqLworCSAgICBpZiAodG1vID09IDApCisJCXRtbyA9IDEuMDsKKwl9CisjaWYgVFJZX0FCT1JUCisJcmVsZWFzZV9zZW0oY2hhcmFjdGVyX3dhbnRlZCk7CisjZW5kaWYKKwlpZiAodGltZW91dCkKKwkgICAgYWNxdWlyZWQgPSBhY3F1aXJlX3NlbV9ldGMoY2hhcmFjdGVyX3ByZXNlbnQsIDEsIEJfVElNRU9VVCwgdG1vKTsKKwllbHNlCisJICAgIGFjcXVpcmVkID0gYWNxdWlyZV9zZW0oY2hhcmFjdGVyX3ByZXNlbnQpOworCWlmIChhY3F1aXJlZCA9PSBCX05PX0VSUk9SKSB7CisJICAgIGlmIChjaGFyY291bnQgPiAwKSB7CisJCWFkZF90b19pbnB1dF9idWYoJmNoYXJidWYsIDEpOworI2lmICFUUllfQUJPUlQKKwkJcmVsZWFzZV9zZW0oY2hhcmFjdGVyX3dhbnRlZCk7CisjZW5kaWYKKworCQlyZXR1cm4gMTsKKwkgICAgfSBlbHNlIHsKKyNpZiAhVFJZX0FCT1JUCisJCXJlbGVhc2Vfc2VtKGNoYXJhY3Rlcl93YW50ZWQpOworI2VuZGlmCisKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisjaWYgVFJZX0FCT1JUCisJZWxzZSB7CisJICAgIC8qCisJICAgICAqIFRpbWVvdXQgb2NjdXJyZWQuIEJyZWFrIHRoZSByZWFkKCkgY2FsbCBieSBzZW5kaW5nCisJICAgICAqIGEgc2lnbmFsLiBQcm9ibGVtOiBpdCBtYXkgYmUganVzdCByZWFkKClpbmcgaXQgbm93LgorCSAgICAgKiBUaGVyZWZvcmUgd2Ugc3RpbGwgaGF2ZSB0byBmaW5pc2ggdGhlIGhhbmRzaGFrZSB3aXRoCisJICAgICAqIHRoZSB0aHJlYWQgYW5kIG1heWJlIHJlbWVtYmVyIHRoZSBjaGFyYWN0ZXIuCisJICAgICAqLworCSAgICBraWxsKHJlYWRfdGhyZWFkX2lkLCBTSUdVU1IxKTsKKwkgICAgLyoKKwkgICAgICoJSWYgc29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCwgZG9uJ3QgaGFuZyBub3cuCisJICAgICAqIChXZSB3aWxsIG1vc3QgbGlrZWx5IGhhbmcgbGF0ZXIgYW55d2F5Li4uKQorCSAgICAgKi8KKwkgICAgaWYgKGFjcXVpcmVkID09IEJfVElNRURfT1VUKQorCQlhY3F1aXJlX3NlbShjaGFyYWN0ZXJfcHJlc2VudCk7CisJICAgIGlmIChjaGFyY291bnQgPiAwKSB7CisJCWFkZF90b19pbnB1dF9idWYoJmNoYXJidWYsIDEpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCSAgICByZXR1cm4gMDsKKwl9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmIEZFQVRfR1VJX0JFT1MKKyAgICAvKgorICAgICAqIElmIG5vdCByZWFkaW5nIGZyb20gdGVybWluYWwsIHByZXRlbmQgdGhlcmUgaXMgaW5wdXQuCisgICAgICogVGhpcyBtYWtlcyB0aGUgcHR5IHJlYWRpbmcgKGZvciB0aGUgR1VJKSAid29yayIgZm9yCisgICAgICogOiFscyBidXQgbm90IGZvciA6ciAhbHMgLi4uIHdlaXJkLgorICAgICAqLworICAgIGlmIChndWkuaW5fdXNlICYmIFN0YXRlID09IEVYVEVSTkNNRCkKKwlyZXR1cm4gMTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zcmMvb3NfYmVvcy5oIGIvc3JjL29zX2Jlb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA4MzRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX2Jlb3MuaApAQCAtMCwwICsxLDI1IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJIEJlQm94IHBvcnQgYnkgT2xhZiBTZWliZXJ0CisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogb3NfYmVvcy5oCisgKi8KKworI3VuZGVmIFVTRV9TWVNURU0KKyNkZWZpbmUgVVNFX1RIUkVBRF9GT1JfSU5QVVRfV0lUSF9USU1FT1VUCTEKKyNkZWZpbmUgVVNFX1RFUk1fQ09OU09MRQorCisjZGVmaW5lIEhBVkVfRFJPUF9GSUxFCisKKyN1bmRlZglCRU9TX0RSOAorI2RlZmluZQlCRU9TX1BSX09SX0JFVFRFUgorCisvKiBzZWxlY3QgZW11bGF0aW9uICovCisKKyNpbmNsdWRlIDxuZXQvc29ja2V0Lmg+CQkvKiBmb3IgdHlwZWRlZnMgYW5kICNkZWZpbmVzIG9ubHkgKi8KZGlmZiAtLWdpdCBhL3NyYy9vc19iZW9zLnJzcmMgYi9zcmMvb3NfYmVvcy5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDQzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfYmVvcy5yc3JjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9vc19kb3MuaCBiL3NyYy9vc19kb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNjZGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX2Rvcy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogQ29tbW9uIE1TLURPUyBhbmQgV2luMzIgKFdpbmRvd3MgTlQgYW5kIFdpbmRvd3MgOTUpIGRlZmluZXMuCisgKgorICogTmFtZXMgZm9yIHRoZSBFWFJDLCBIRUxQIGFuZCB0ZW1wb3JhcnkgZmlsZXMuCisgKiBTb21lIG9mIHRoZXNlIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGUgbWFrZWZpbGUgb3IgZmVhdHVyZS5oLgorICovCisKKyNpZm5kZWYgU1lTX1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFNZU19WSU1SQ19GSUxFCQkiJFZJTVxcdmltcmMiCisjZW5kaWYKKyNpZm5kZWYgVVNSX1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFVTUl9WSU1SQ19GSUxFCQkiJEhPTUVcXF92aW1yYyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfVklNUkNfRklMRTIKKyMgZGVmaW5lIFVTUl9WSU1SQ19GSUxFMgkiJFZJTVxcX3ZpbXJjIgorI2VuZGlmCisjaWZuZGVmIEVWSU1fRklMRQorIyBkZWZpbmUgRVZJTV9GSUxFCQkiJFZJTVJVTlRJTUVcXGV2aW0udmltIgorI2VuZGlmCisKKyNpZm5kZWYgVVNSX0VYUkNfRklMRQorIyBkZWZpbmUgVVNSX0VYUkNfRklMRQkJIiRIT01FXFxfZXhyYyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfRVhSQ19GSUxFMgorIyBkZWZpbmUgVVNSX0VYUkNfRklMRTIJCSIkVklNXFxfZXhyYyIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZuZGVmIFNZU19HVklNUkNfRklMRQorIyAgZGVmaW5lIFNZU19HVklNUkNfRklMRQkiJFZJTVxcZ3ZpbXJjIgorIyBlbmRpZgorIyBpZm5kZWYgVVNSX0dWSU1SQ19GSUxFCisjICBkZWZpbmUgVVNSX0dWSU1SQ19GSUxFCSIkSE9NRVxcX2d2aW1yYyIKKyMgZW5kaWYKKyMgaWZuZGVmIFVTUl9HVklNUkNfRklMRTIKKyMgIGRlZmluZSBVU1JfR1ZJTVJDX0ZJTEUyCSIkVklNXFxfZ3ZpbXJjIgorIyBlbmRpZgorIyBpZm5kZWYgU1lTX01FTlVfRklMRQorIyAgZGVmaW5lIFNZU19NRU5VX0ZJTEUJCSIkVklNUlVOVElNRVxcbWVudS52aW0iCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTWVNfT1BUV0lOX0ZJTEUKKyMgZGVmaW5lIFNZU19PUFRXSU5fRklMRQkiJFZJTVJVTlRJTUVcXG9wdHdpbi52aW0iCisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklNSU5GTworIyBpZm5kZWYgVklNSU5GT19GSUxFCisjICBkZWZpbmUgVklNSU5GT19GSUxFCQkiJEhPTUVcXF92aW1pbmZvIgorIyBlbmRpZgorIyBpZm5kZWYgVklNSU5GT19GSUxFMgorIyAgZGVmaW5lIFZJTUlORk9fRklMRTIJCSIkVklNXFxfdmltaW5mbyIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFZJTVJDX0ZJTEUKKyMgZGVmaW5lIFZJTVJDX0ZJTEUJIl92aW1yYyIKKyNlbmRpZgorCisjaWZuZGVmIEVYUkNfRklMRQorIyBkZWZpbmUgRVhSQ19GSUxFCSJfZXhyYyIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZuZGVmIEdWSU1SQ19GSUxFCisjICBkZWZpbmUgR1ZJTVJDX0ZJTEUJIl9ndmltcmMiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBERkxUX0hFTFBGSUxFCisjIGRlZmluZSBERkxUX0hFTFBGSUxFCSIkVklNUlVOVElNRVxcZG9jXFxoZWxwLnR4dCIKKyNlbmRpZgorCisjaWZuZGVmIEZJTEVUWVBFX0ZJTEUKKyMgZGVmaW5lIEZJTEVUWVBFX0ZJTEUJImZpbGV0eXBlLnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVFBMVUdJTl9GSUxFCisjIGRlZmluZSBGVFBMVUdJTl9GSUxFCSJmdHBsdWdpbi52aW0iCisjZW5kaWYKKyNpZm5kZWYgSU5ERU5UX0ZJTEUKKyMgZGVmaW5lIElOREVOVF9GSUxFCSJpbmRlbnQudmltIgorI2VuZGlmCisjaWZuZGVmIEZUT0ZGX0ZJTEUKKyMgZGVmaW5lIEZUT0ZGX0ZJTEUJImZ0b2ZmLnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVFBMVUdPRl9GSUxFCisjIGRlZmluZSBGVFBMVUdPRl9GSUxFCSJmdHBsdWdvZi52aW0iCisjZW5kaWYKKyNpZm5kZWYgSU5ET0ZGX0ZJTEUKKyMgZGVmaW5lIElORE9GRl9GSUxFCSJpbmRvZmYudmltIgorI2VuZGlmCisKKyNpZm5kZWYgU1lOVEFYX0ZOQU1FCisjIGRlZmluZSBTWU5UQVhfRk5BTUUJIiRWSU1SVU5USU1FXFxzeW50YXhcXCVzLnZpbSIKKyNlbmRpZgorCisjaWZuZGVmIERGTFRfQkRJUgorIyBkZWZpbmUgREZMVF9CRElSCSIuLGM6XFx0bXAsYzpcXHRlbXAiCS8qIGRlZmF1bHQgZm9yICdiYWNrdXBkaXInICovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX1ZESVIKKyMgZGVmaW5lIERGTFRfVkRJUgkiJFZJTS92aW1maWxlcy92aWV3IgkvKiBkZWZhdWx0IGZvciAndmlld2RpcicgKi8KKyNlbmRpZgorCisjaWZuZGVmIERGTFRfRElSCisjIGRlZmluZSBERkxUX0RJUgkiLixjOlxcdG1wLGM6XFx0ZW1wIgkvKiBkZWZhdWx0IGZvciAnZGlyZWN0b3J5JyAqLworI2VuZGlmCisKKyNkZWZpbmUgREZMVF9FUlJPUkZJTEUJCSJlcnJvcnMuZXJyIgorI2RlZmluZSBERkxUX1JVTlRJTUVQQVRICSIkSE9NRS92aW1maWxlcywkVklNL3ZpbWZpbGVzLCRWSU1SVU5USU1FLCRWSU0vdmltZmlsZXMvYWZ0ZXIsJEhPTUUvdmltZmlsZXMvYWZ0ZXIiCisKKyNkZWZpbmUgQ0FTRV9JTlNFTlNJVElWRV9GSUxFTkFNRSAgIC8qIGlnbm9yZSBjYXNlIHdoZW4gY29tcGFyaW5nIGZpbGUgbmFtZXMgKi8KKyNkZWZpbmUgU1BBQ0VfSU5fRklMRU5BTUUKKyNkZWZpbmUgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisjZGVmaW5lIFVTRV9DUk5MCQkvKiBsaW5lcyBlbmQgaW4gQ1ItTkwgaW5zdGVhZCBvZiBOTCAqLworI2RlZmluZSBIQVZFX0RVUAkJLyogaGF2ZSBkdXAoKSAqLworI2RlZmluZSBIQVZFX1NUX01PREUJCS8qIGhhdmUgc3RhdC5zdF9tb2RlICovCmRpZmYgLS1naXQgYS9zcmMvb3NfbWFjLmJ1aWxkIGIvc3JjL29zX21hYy5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRjMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX21hYy5idWlsZApAQCAtMCwwICsxLDkxIEBACitzZXQgNjhrVGFyZ2V0ICI2OGsiCitzZXQgcHBjVGFyZ2V0ICJwcGMiCitzZXQgY2FyYm9uVGFyZ2V0ICJjYXJib24iCitzZXQgdmltVGFyZ2V0cyAiYGdldGxpc3RpdGVtIC1tICIgU2VsZWN0IHRoZSB2aW0gdGFyZ2V0IHBsYXRmb3JtIiAtYyAtcSAiezY4a1RhcmdldH0iICJ7cHBjVGFyZ2V0fSIgIntjYXJib25UYXJnZXR9ImAiCitpZiAhInt2aW1UYXJnZXRzfSIKKyAgIGVjaG8gIk5vIE1ha2VmaWxlIGNyZWF0ZWQiCisgICBleGl0IDAKK2VuZAorIworc2V0IGdlbmVyYWxTb3VyY2VzICJidWZmZXIuYyBjaGFyc2V0LmMgZGlmZi5jIGRpZ3JhcGguYyBlZGl0LmMgZXZhbC5jIGV4X2NtZHMuYyBleF9jbWRzMi5jIGV4X2RvY21kLmMgZXhfZXZhbC5jIGV4X2dldGxuLmMgZmlsZWlvLmMgZm9sZC5jIGdldGNoYXIuYyBndWkuYyBndWlfbWFjLmMgaWZfY3Njb3BlLmMgbWFpbi5jIG1hcmsuYyBtZW1maWxlLmMgbWVtbGluZS5jIG1lbnUuYyBtZXNzYWdlLmMgbWlzYzEuYyBtaXNjMi5jIG1vdmUuYyBtYnl0ZS5jIG5vcm1hbC5jIG9wcy5jIG9wdGlvbi5jIG9zX21hYy5jIHB0eS5jIHF1aWNrZml4LmMgcmVnZXhwLmMgc2NyZWVuLmMgc2VhcmNoLmMgdGFnLmMgdGVybS5jIHRlcm1saWIuYyB1aS5jIHVuZG8uYyB2ZXJzaW9uLmMgd2luZG93LmMiCitzZXQgZ2VuZXJhbE9wdHMgIi1hcHAgLWMgJ1ZJTSEnIC10ICdBUFBMJyAtaSA6cHJvdG8iCitzZXQgZ2VuZXJhbENPcHRzICItdyAyLDM1IC1lbnVtIGludCIKK3NldCBnZW5lcmFsTE9wdHMgIi1tZiAtZCIKK3NldCBnZW5lcmFsTGlicyAiIgorIworIworc2V0IDY4a1NvdXJjZXMgIiIKK3NldCA2OGtPcHRzICItbW9kZWwgZmFyIgorc2V0IDY4a0NPcHRzICIiCitzZXQgNjhrTE9wdHMgIiIKK3NldCA2OGtMaWJzICIiCisjCitzZXQgcHBjU291cmNlcyAic3ludGF4LmMiCitzZXQgcHBjT3B0cyAiLXBvd2VycGMiCitzZXQgcHBjQ09wdHMgIiIKK3NldCBwcGNMT3B0cyAie1NoYXJlZExpYnJhcmllc31BcHBlYXJhbmNlTGliIgorc2V0IHBwY0xpYnMgIntTaGFyZWRMaWJyYXJpZXN9Q29udGV4dHVhbE1lbnUiCisjCitzZXQgY2FyYm9uU291cmNlcyAiIgorc2V0IGNhcmJvbk9wdHMgIi1jYXJib24iCitzZXQgY2FyYm9uQ09wdHMgIi1kIFRBUkdFVF9BUElfTUFDX0NBUkJPTiIKK3NldCBjYXJib25MT3B0cyAiIgorc2V0IGNhcmJvbkxpYnMgIntTaGFyZWRMaWJyYXJpZXN9Q2FyYm9uTGliIgorIworZm9yIHZUYXJnZXQgaW4ge3ZpbVRhcmdldHN9CisgICBzZXQgdlNvdXJjZXMgIntnZW5lcmFsU291cmNlc30iCisgICBzZXQgdkxpYnMgIntnZW5lcmFsTGlic30iCisgICBzZXQgdk9wdHMgIntnZW5lcmFsT3B0c30iCisgICBzZXQgdkNPcHRzICJ7Z2VuZXJhbENPcHRzfSIKKyAgIHNldCB2TE9wdHMgIntnZW5lcmFsTE9wdHN9IgorICAgc2V0IHBwYyAiIgorICAgaWYgInt2VGFyZ2V0fSIgPT0gIns2OGtUYXJnZXR9IgorICAgICAgc2V0IHZTb3VyY2VzICJ7dlNvdXJjZXN9IHs2OGtTb3VyY2VzfSIKKyAgICAgIHNldCB2T3B0cyAie3ZPcHRzfSB7NjhrT3B0c30iCisgICAgICBzZXQgdkxpYnMgInt2TGlic30gezY4a0xpYnN9IgorICAgICAgaWYgICJ7NjhrQ09wdHN9IgorICAgICAgICAgc2V0IHZDT3B0cyAie3ZDT3B0c30gezY4a0NPcHRzfSIKKyAgICAgIGVuZAorICAgICAgaWYgICJ7NjhrTE9wdHN9IgorICAgICAgICAgc2V0IHZMT3B0cyAie3ZMT3B0c30gezY4a0xPcHRzfSIKKyAgICAgIGVuZAorICAgZWxzZQorICAgICAgc2V0IHBwYyAicHBjIgorICAgICAgc2V0IHZTb3VyY2VzICJ7dlNvdXJjZXN9IHtwcGNTb3VyY2VzfSIKKyAgICAgIHNldCB2T3B0cyAie3ZPcHRzfSB7cHBjT3B0c30iCisgICAgICBzZXQgdkxpYnMgInt2TGlic30ge3BwY0xpYnN9IgorICAgICAgaWYgICJ7cHBjQ09wdHN9IgorICAgICAgICAgc2V0IHZDT3B0cyAie3ZDT3B0c30ge3BwY0NPcHRzfSIKKyAgICAgIGVuZAorICAgICAgaWYgICJ7cHBjTE9wdHN9IgorICAgICAgICAgc2V0IHZMT3B0cyAie3ZMT3B0c30ge3BwY0xPcHRzfSIKKyAgICAgIGVuZAorICAgICAgaWYgInt2VGFyZ2V0fSIgPT0gIntjYXJib25UYXJnZXR9IgorICAgICAgICAgc2V0IHZTb3VyY2VzICJ7dlNvdXJjZXN9IHtjYXJib25Tb3VyY2VzfSIKKyAgICAgICAgIHNldCB2TGlicyAie3ZMaWJzfSB7Y2FyYm9uTGlic30iCisgICAgICAgICBzZXQgdk9wdHMgInt2T3B0c30ge2NhcmJvbk9wdHN9IgorICAgICAgICAgaWYgICJ7Y2FyYm9uQ09wdHN9IgorICAgICAgICAgICAgc2V0IHZDT3B0cyAie3ZDT3B0c30ge2NhcmJvbkNPcHRzfSIKKyAgICAgICAgIGVuZAorICAgICAgICAgaWYgICJ7Y2FyYm9uTE9wdHN9IgorICAgICAgICAgICAgc2V0IHZMT3B0cyAie3ZMT3B0c30ge2NhcmJvbkxPcHRzfSIKKyAgICAgICAgIGVuZAorICAgICAgZW5kCisgICBlbmQKKyAgIHNldCB2T0RpciA6b2JqLXt2VGFyZ2V0fToKKyAgIGlmICEiYGV4aXN0cyAtZCB7dk9kaXJ9YCIKKyAgICAgIG5ld0ZvbGRlciB7dk9EaXJ9CisgICBlbmQKKyAgIHNldCB2QXBwIHZpbS17dlRhcmdldH0KKyAgIGlmICJ7dkNPcHRzfSIKKyAgICAgIHNldCB2T3B0cyAie3ZPcHRzfSAte3BwY31DT3B0aW9ucyAne3ZDT3B0c30nIgorICAgZW5kCisgICBpZiAie3ZMT3B0c30iCisgICAgICBzZXQgdk9wdHMgInt2T3B0c30gLXtwcGN9TGlua09wdGlvbnMgJ3t2TE9wdHN9JyIKKyAgIGVuZAorICAgc2V0IHZPcHRzICJ7dk9wdHN9IC1vYmpkaXIge3ZPRGlyfSIKKyAgIGNyZWF0ZW1ha2Uge3ZBcHB9IHt2T3B0c30ge3ZTb3VyY2VzfSB7dkxpYnN9CisgICBpZiAhe1N0YXR1c30KKyAgICAgIGVjaG8gIk1ha2VmaWxlIGZvciB7dkFwcH0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQiCisgICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvc3JjL29zX21hYy5jIGIvc3JjL29zX21hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmE3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfbWFjLmMKQEAgLTAsMCArMSwxNDUxIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogb3NfbWFjLmMgLS0gY29kZSBmb3IgdGhlIE1hY09TCisgKgorICogVGhpcyBmaWxlIGlzIG1haW5seSBiYXNlZCBvbiBvc191bml4LmMuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWYgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgLyogZm9yIEFwcGxlIE1QVyBDb21waWxlcnMgKi8KKworI2luY2x1ZGUgIlN0YW5kYXJkRmlsZS5oIgorCisvKgorICogSW1wbGVtZW50cyB0aGUgY29ycmVzcG9uZGluZyB1bml4IGZ1bmN0aW9uCisgKi8KKyAgICBpbnQKK3N0YXQoCisgICAgY2hhciAqcCwKKyAgICBzdHJ1Y3Qgc3RhdCAqcF9zdCkKK3sKKyAgICAvKgorICAgICAgIFRPRE86IFVzZSBmdW5jdGlvbnMgd2hpY2ggZmlsbCB0aGUgRmlsZVBhcmFtIHN0cnVjdCAoRmlsZXMuaCkKKwkgICAgIGFuZCBjb3B5IHRoZXNlIGNvbnRlbnRzIHRvIG91ciBzZWxmLWRlZmluZWQgc3RhdCBzdHJ1Y3QKKyAgICAgKi8KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogY2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CisgKi8KKyAgICBpbnQKK21jaF9jaGRpcihjaGFyICpwX25hbWUpCit7CisjaWYgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgLyogZm9yIEFwcGxlIE1QVyBDb21waWxlcnMgKi8KKyAgICAvKiBUT0RPICovCisgICAgcmV0dXJuIEZBSUw7CisjZWxzZQorICAgIHJldHVybiBjaGRpcihwX25hbWUpOworI2VuZGlmCit9CisKKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGJ1aWxkIHVwIGEgbGlzdCBvZiBmaWxlcyBpbiAiZ2FwIiBtYXRjaGluZyB0aGUgZmlyc3Qgd2lsZGNhcmQKKyAqIGluIGBwYXRoJy4gIENhbGxlZCBieSBtY2hfZXhwYW5kcGF0aCgpLgorICogInBhdGgiIGhhcyBiYWNrc2xhc2hlcyBiZWZvcmUgY2hhcnMgdGhhdCBhcmUgbm90IHRvIGJlIGV4cGFuZGVkLgorICovCisgICAgaW50CittYWNfZXhwYW5kcGF0aCgKKyAgICBnYXJyYXlfVAkqZ2FwLAorICAgIGNoYXJfdQkqcGF0aCwKKyAgICBpbnQJCWZsYWdzLAkJLyogRVdfKiBmbGFncyAqLworICAgIHNob3J0CXN0YXJ0X2F0LAorICAgIHNob3J0CWFzX2Z1bGwpCit7CisgICAgLyoKKyAgICAgKiBUT0RPOgorICAgICAqCQkrR2V0IFZvbHVtZXMgKHdoZW4gbG9va2luZyBmb3IgZmlsZXMgaW4gY3VycmVudCBkaXIpCisgICAgICoJCStNYWtlIGl0IHdvcmsgd2hlbiB3b3JraW5nIGRpciBub3Qgb24gc2VsZWN0IHZvbHVtZQorICAgICAqCQkrQ2xlYW51cAorICAgICAqLworICAgIHNob3J0CWluZGV4ID0gMTsKKyAgICBPU0VycglnRXJyOworICAgIGNoYXJfdQlkaXJuYW1lWzI1Nl07CisgICAgY2hhcl91CWNmaWxlbmFtZVsyNTZdOworICAgIGxvbmcJZGlySUQ7CisgICAgY2hhcl91CSpuZXdfbmFtZTsKKyAgICBDSW5mb1BCUmVjCWdNeUNQQjsKKyAgICBIUGFyYW1CbG9ja1JlYyBnTXlIUEJsb2NrOworICAgIEZTU3BlYwl1c2VkRGlyOworCisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpwLCAqcywgKmUsIGRhbnk7CisgICAgaW50CQlzdGFydF9sZW4sIGM7CisgICAgY2hhcl91CSpwYXQ7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKworICAgIHN0YXJ0X2xlbiA9IGdhcC0+Z2FfbGVuOworICAgIGJ1ZiA9IGFsbG9jKFNUUkxFTihwYXRoKSArIEJBU0VOQU1FTEVOICsgNSk7LyogbWFrZSByb29tIGZvciBmaWxlIG5hbWUgKi8KKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIDA7CisKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCBwYXJ0IGluIHRoZSBwYXRoIG5hbWUgdGhhdCBjb250YWlucyBhIHdpbGRjYXJkLgorICogQ29weSBpdCBpbnRvIGJ1ZiwgaW5jbHVkaW5nIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVycy4KKyAqLworICAgIHAgPSBidWY7CisgICAgcyA9IGJ1ZjsKKyAgICBlID0gTlVMTDsKKyNpZiAxCisgICAgU1RSTkNQWShidWYsIHBhdGgsIHN0YXJ0X2F0KTsKKyAgICBwICs9IHN0YXJ0X2F0OworICAgIHBhdGggKz0gc3RhcnRfYXQ7CisjZW5kaWYKKworICAgIHdoaWxlICgqcGF0aCkKKyAgICB7CisJaWYgKCpwYXRoID09ICc6JykKKwl7CisJICAgIGlmIChlKQorCQlicmVhazsKKwkgICAgZWxzZQorCQlzID0gcCArIDE7CisJfQorCS8qIHNob3VsZCB1c2UgIFdJTENBUkRMSVNUIGJ1dCB3aGF0IGFib3V0IGAgKi8KKwkvKgkgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIqP1t7fiQiLCAqcGF0aCkgIT0gTlVMTCkqLworCWVsc2UgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKVdJTERDSEFSX0xJU1QsICpwYXRoKSAhPSBOVUxMKQorCSAgICBlID0gcDsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGludCBsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKHBhdGgpOworCisJICAgIFNUUk5DUFkocCwgcGF0aCwgbGVuKTsKKwkgICAgcCArPSBsZW47CisJICAgIHBhdGggKz0gbGVuOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgKnArKyA9ICpwYXRoKys7CisgICAgfQorICAgIGUgPSBwOworCisgICAgLyogbm93IHdlIGhhdmUgb25lIHdpbGRjYXJkIGNvbXBvbmVudCBiZXR3ZWVuIHMgYW5kIGUgKi8KKyAgICAqZSA9IE5VTDsKKworI2lmIDEKKyAgICBkYW55ID0gKnM7CisgICAgKnMgPSBOVUw7CisgICAgYmFja3NsYXNoX2hhbHZlKGJ1Zik7CisgICAgKnMgPSBkYW55OworI2VuZGlmCisKKyAgICAvKiBjb252ZXJ0IHRoZSBmaWxlIHBhdHRlcm4gdG8gYSByZWdleHAgcGF0dGVybiAqLworICAgIHBhdCA9IGZpbGVfcGF0X3RvX3JlZ19wYXQocywgZSwgTlVMTCwgRkFMU0UpOworICAgIGlmIChwYXQgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBjb21waWxlIHRoZSByZWdleHAgaW50byBhIHByb2dyYW0gKi8KKyAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwkJCS8qIERvbid0IGV2ZXIgaWdub3JlIGNhc2UgKi8KKyAgICByZWdtYXRjaC5yZWdwcm9nID0gdmltX3JlZ2NvbXAocGF0LCBSRV9NQUdJQyk7CisgICAgdmltX2ZyZWUocGF0KTsKKworICAgIGlmIChyZWdtYXRjaC5yZWdwcm9nID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogb3BlbiB0aGUgZGlyZWN0b3J5IGZvciBzY2FubmluZyAqLworICAgIGMgPSAqczsKKyAgICAqcyA9IE5VTDsKKworICAgIGlmICgqYnVmID09IE5VTCkKKyAgICB7CisJYXNfZnVsbCA9IFRSVUU7CisjaWYgMAorCSh2b2lkKSBtY2hfZGlybmFtZSAoJmRpcm5hbWVbMV0sIDI1NCk7CisJZGlybmFtZVswXSA9IFNUUkxFTigmZGlybmFtZVsxXSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoKmJ1ZiA9PSAnOicpICAvKiByZWxhdGl2ZSBwYXRoICovCisJeworCSAgICAodm9pZCltY2hfZGlybmFtZSgmZGlybmFtZVsxXSwgMjU0KTsKKwkgICAgbmV3X25hbWUgPSBjb25jYXRfZm5hbWVzKCZkaXJuYW1lWzFdLCBidWYrMSwgVFJVRSk7CisJICAgIFNUUkNQWSgmZGlybmFtZVsxXSwgbmV3X25hbWUpOworCSAgICBkaXJuYW1lWzBdID0gU1RSTEVOKG5ld19uYW1lKTsKKwkgICAgdmltX2ZyZWUobmV3X25hbWUpOworCX0KKwllbHNlCisJeworCSAgICBTVFJDUFkoJmRpcm5hbWVbMV0sIGJ1Zik7CisJICAgIGJhY2tzbGFzaF9oYWx2ZSgmZGlybmFtZVsxXSk7CisJICAgIGRpcm5hbWVbMF0gPSBTVFJMRU4oYnVmKTsKKwl9CisgICAgfQorICAgICpzID0gYzsKKworICAgIEZTTWFrZUZTU3BlYyAoMCwgMCwgZGlybmFtZSwgJnVzZWREaXIpOworCisgICAgZ015Q1BCLmRpckluZm8uaW9OYW1lUHRyICAgID0gZGlybmFtZTsKKyAgICBnTXlDUEIuZGlySW5mby5pb1ZSZWZOdW0gICAgPSB1c2VkRGlyLnZSZWZOdW07CisgICAgZ015Q1BCLmRpckluZm8uaW9GRGlySW5kZXggID0gMDsKKyAgICBnTXlDUEIuZGlySW5mby5pb0RyRGlySUQgICAgPSAwOworCisgICAgZ0VyciA9IFBCR2V0Q2F0SW5mbygmZ015Q1BCLCBmYWxzZSk7CisKKyAgICBnTXlDUEIuZGlySW5mby5pb0NvbXBsZXRpb24gPSBOVUxMOworICAgIGRpcklEID0gZ015Q1BCLmRpckluZm8uaW9EckRpcklEOworICAgIGRvCisgICAgeworCWdNeUNQQi5oRmlsZUluZm8uaW9GRGlySW5kZXggPSBpbmRleDsKKwlnTXlDUEIuaEZpbGVJbmZvLmlvRGlySUQgICAgID0gZGlySUQ7CisKKwlnRXJyID0gUEJHZXRDYXRJbmZvKCZnTXlDUEIsZmFsc2UpOworCisJaWYgKGdFcnIgPT0gbm9FcnIpCisJeworCSAgICBTVFJOQ1BZIChjZmlsZW5hbWUsICZkaXJuYW1lWzFdLCBkaXJuYW1lWzBdKTsKKwkgICAgY2ZpbGVuYW1lW2Rpcm5hbWVbMF1dID0gMDsKKwkgICAgaWYgKHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgY2ZpbGVuYW1lLCAoY29sbnJfVCkwKSkKKwkgICAgeworCQlpZiAoc1stMV0gIT0gJzonKQorCQl7CisJCSAgICAvKiBUT0RPOiBuZWVkIHRvIGNvcHkgd2l0aCBjbGVhbmVkIG5hbWUgKi8KKwkJICAgIFNUUkNQWShzKzEsIGNmaWxlbmFtZSk7CisJCSAgICBzWzBdID0gJzonOworCQl9CisJCWVsc2UKKwkJeyAgIC8qIFRPRE86IG5lZWQgdG8gY29weSB3aXRoIGNsZWVhbmVkIG5hbWUgKi8KKwkJICAgIFNUUkNQWShzLCBjZmlsZW5hbWUpOworCQl9CisJCXN0YXJ0X2F0ID0gU1RSTEVOKGJ1Zik7CisJCVNUUkNBVChidWYsIHBhdGgpOworCQlpZiAobWNoX2hhc19leHBfd2lsZGNhcmQocGF0aCkpCS8qIGhhbmRsZSBtb3JlIHdpbGRjYXJkcyAqLworCQkgICAgKHZvaWQpbWFjX2V4cGFuZHBhdGgoZ2FwLCBidWYsIGZsYWdzLCBzdGFydF9hdCwgRkFMU0UpOworCQllbHNlCisJCXsKKyNpZmRlZiBET05UX0FERF9QQVRIU0VQX1RPX0RJUgorCQkgICAgaWYgKChnTXlDUEIuaEZpbGVJbmZvLmlvRmxBdHRyaWIgJiBpb0Rpck1hc2spICE9MCApCisJCQlTVFJDQVQoYnVmLCBQQVRIU0VQU1RSKTsKKyNlbmRpZgorCQkgICAgYWRkZmlsZShnYXAsIGJ1ZiwgZmxhZ3MpOworCQl9CisJICAgIH0KKwkgICAgaWYgKChnTXlDUEIuaEZpbGVJbmZvLmlvRmxBdHRyaWIgJiBpb0Rpck1hc2spICE9MCApCisJICAgIHsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgfQorCX0KKwlpbmRleCsrOworICAgIH0KKyAgICB3aGlsZSAoZ0VyciA9PSBub0Vycik7CisKKyAgICBpZiAoYXNfZnVsbCkKKyAgICB7CisJaW5kZXggPSAxOworCWRvCisJeworCSAgICBnTXlIUEJsb2NrLnZvbHVtZVBhcmFtLmlvTmFtZVB0ciA9IChjaGFyX3UgKikgZGlybmFtZTsKKwkgICAgZ015SFBCbG9jay52b2x1bWVQYXJhbS5pb1ZSZWZOdW0gPTA7CisJICAgIGdNeUhQQmxvY2sudm9sdW1lUGFyYW0uaW9Wb2xJbmRleCA9IGluZGV4OworCisJICAgIGdFcnIgPSBQQkhHZXRWSW5mbyAoJmdNeUhQQmxvY2ssZmFsc2UpOworCSAgICBpZiAoZ0VyciA9PSBub0VycikKKwkgICAgeworCQlTVFJOQ1BZIChjZmlsZW5hbWUsICZkaXJuYW1lWzFdLCBkaXJuYW1lWzBdKTsKKwkJY2ZpbGVuYW1lW2Rpcm5hbWVbMF1dID0gMDsKKwkJaWYgKHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgY2ZpbGVuYW1lLCAoY29sbnJfVCkwKSkKKwkJeworCQkgICAgU1RSQ1BZKHMsIGNmaWxlbmFtZSk7CisJCSAgICBTVFJDQVQoYnVmLCBwYXRoKTsKKwkJICAgIGlmIChtY2hfaGFzX2V4cF93aWxkY2FyZChwYXRoKSkgLyogaGFuZGxlIG1vcmUgd2lsZGNhcmRzICovCisJCQkodm9pZCltYWNfZXhwYW5kcGF0aChnYXAsIHMsIGZsYWdzLCAwLCBGQUxTRSk7CisJCSAgICBlbHNlCisJCSAgICB7CisjaWZkZWYgRE9OVF9BRERfUEFUSFNFUF9UT19ESVIKKy8qCQkJaWYgKChnTXlDUEIuaEZpbGVJbmZvLmlvRmxBdHRyaWIgJiBpb0Rpck1hc2spICE9MCApCisqLwkJCSAgICBTVFJDQVQoYnVmLCBQQVRIU0VQU1RSKTsKKyNlbmRpZgorCQkJYWRkZmlsZShnYXAsIHMsIGZsYWdzKTsKKwkJICAgIH0KKyNpZiAwCisJCSAgICBTVFJDQVQoY2ZpbGVuYW1lLCBQQVRIU0VQU1RSKTsKKwkJICAgIGFkZGZpbGUgKGdhcCwgY2ZpbGVuYW1lLCBmbGFncyk7CisjZW5kaWYKKwkJfQorCSAgICB9CisJICAgIGluZGV4Kys7CisJfQorCXdoaWxlIChnRXJyID09IG5vRXJyKTsKKyAgICB9CisKKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKworICAgIHJldHVybiBnYXAtPmdhX2xlbiAtIHN0YXJ0X2xlbjsKK30KKworCisjaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQorICAgIHN0YXRpYyBpbnQKK3BzdHJjbXAoYSwgYikKKyAgICBjb25zdCB2b2lkICphLCAqYjsKK3sKKyAgICByZXR1cm4gKHBhdGhjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKSk7Cit9CisKKyAgICBzdGF0aWMgaW50Cit1bml4X2V4cGFuZHBhdGgoZ2FwLCBwYXRoLCB3aWxkb2ZmLCBmbGFncykKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIGNoYXJfdQkqcGF0aDsKKyAgICBpbnQJCXdpbGRvZmY7CisgICAgaW50CQlmbGFnczsJCS8qIEVXXyogZmxhZ3MgKi8KK3sKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBjaGFyX3UJKnBhdGhfZW5kOworICAgIGNoYXJfdQkqcCwgKnMsICplOworICAgIGludAkJc3RhcnRfbGVuLCBjOworICAgIGNoYXJfdQkqcGF0OworICAgIERJUgkJKmRpcnA7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkcDsKKyAgICBpbnQJCXN0YXJ0c193aXRoX2RvdDsKKyAgICBpbnQJCW1hdGNoZXM7CisgICAgaW50CQlsZW47CisKKyAgICBzdGFydF9sZW4gPSBnYXAtPmdhX2xlbjsKKyAgICBidWYgPSBhbGxvYyhTVFJMRU4ocGF0aCkgKyBCQVNFTkFNRUxFTiArIDUpOy8qIG1ha2Ugcm9vbSBmb3IgZmlsZSBuYW1lICovCisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCXJldHVybiAwOworCisvKgorICogRmluZCB0aGUgZmlyc3QgcGFydCBpbiB0aGUgcGF0aCBuYW1lIHRoYXQgY29udGFpbnMgYSB3aWxkY2FyZC4KKyAqIENvcHkgaXQgaW50byBidWYsIGluY2x1ZGluZyB0aGUgcHJlY2VkaW5nIGNoYXJhY3RlcnMuCisgKi8KKyAgICBwID0gYnVmOworICAgIHMgPSBidWY7CisgICAgZSA9IE5VTEw7CisgICAgcGF0aF9lbmQgPSBwYXRoOworICAgIHdoaWxlICgqcGF0aF9lbmQpCisgICAgeworCS8qIE1heSBpZ25vcmUgYSB3aWxkY2FyZCB0aGF0IGhhcyBhIGJhY2tzbGFzaCBiZWZvcmUgaXQgKi8KKwlpZiAocGF0aF9lbmQgPj0gcGF0aCArIHdpbGRvZmYgJiYgcmVtX2JhY2tzbGFzaChwYXRoX2VuZCkpCisJICAgICpwKysgPSAqcGF0aF9lbmQrKzsKKwllbHNlIGlmICgqcGF0aF9lbmQgPT0gJy8nKQorCXsKKwkgICAgaWYgKGUgIT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGVsc2UKKwkJcyA9IHAgKyAxOworCX0KKwllbHNlIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiKj9be34kIiwgKnBhdGhfZW5kKSAhPSBOVUxMKQorCSAgICBlID0gcDsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocGF0aF9lbmQpOworCSAgICBTVFJOQ1BZKHAsIHBhdGhfZW5kLCBsZW4pOworCSAgICBwICs9IGxlbjsKKwkgICAgcGF0aF9lbmQgKz0gbGVuOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgKnArKyA9ICpwYXRoX2VuZCsrOworICAgIH0KKyAgICBlID0gcDsKKyAgICAqZSA9IE5VTDsKKworICAgIC8qIG5vdyB3ZSBoYXZlIG9uZSB3aWxkY2FyZCBjb21wb25lbnQgYmV0d2VlbiBzIGFuZCBlICovCisgICAgLyogUmVtb3ZlIGJhY2tzbGFzaGVzIGJldHdlZW4gIndpbGRvZmYiIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHdpbGRjYXJkCisgICAgICogY29tcG9uZW50LiAqLworICAgIGZvciAocCA9IGJ1ZiArIHdpbGRvZmY7IHAgPCBzOyArK3ApCisJaWYgKHJlbV9iYWNrc2xhc2gocCkpCisJeworCSAgICBTVFJDUFkocCwgcCArIDEpOworCSAgICAtLWU7CisJICAgIC0tczsKKwl9CisKKyAgICAvKiBjb252ZXJ0IHRoZSBmaWxlIHBhdHRlcm4gdG8gYSByZWdleHAgcGF0dGVybiAqLworICAgIHN0YXJ0c193aXRoX2RvdCA9ICgqcyA9PSAnLicpOworICAgIHBhdCA9IGZpbGVfcGF0X3RvX3JlZ19wYXQocywgZSwgTlVMTCwgRkFMU0UpOworICAgIGlmIChwYXQgPT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBjb21waWxlIHRoZSByZWdleHAgaW50byBhIHByb2dyYW0gKi8KKyNpZmRlZiBNQUNPU19YCisgICAgLyogV2Ugd2FudCB0byBiZWhhdmUgbGlrZSBUZXJtaW5hbC5hcHAgKi8KKyAgICByZWdtYXRjaC5ybV9pYyA9IFRSVUU7CisjZWxzZQorICAgIHJlZ21hdGNoLnJtX2ljID0gRkFMU0U7CQkvKiBEb24ndCBldmVyIGlnbm9yZSBjYXNlICovCisjZW5kaWYKKyAgICByZWdtYXRjaC5yZWdwcm9nID0gdmltX3JlZ2NvbXAocGF0LCBSRV9NQUdJQyk7CisgICAgdmltX2ZyZWUocGF0KTsKKworICAgIGlmIChyZWdtYXRjaC5yZWdwcm9nID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogb3BlbiB0aGUgZGlyZWN0b3J5IGZvciBzY2FubmluZyAqLworICAgIGMgPSAqczsKKyAgICAqcyA9IE5VTDsKKyAgICBkaXJwID0gb3BlbmRpcigqYnVmID09IE5VTCA/ICIuIiA6IChjaGFyICopYnVmKTsKKyAgICAqcyA9IGM7CisKKyAgICAvKiBGaW5kIGFsbCBtYXRjaGluZyBlbnRyaWVzICovCisgICAgaWYgKGRpcnAgIT0gTlVMTCkKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIGRwID0gcmVhZGRpcihkaXJwKTsKKwkgICAgaWYgKGRwID09IE5VTEwpCisJCWJyZWFrOworCSAgICBpZiAoKGRwLT5kX25hbWVbMF0gIT0gJy4nIHx8IHN0YXJ0c193aXRoX2RvdCkKKwkJICAgICYmIHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgKGNoYXJfdSAqKWRwLT5kX25hbWUsIChjb2xucl9UKTApKQorCSAgICB7CisJCVNUUkNQWShzLCBkcC0+ZF9uYW1lKTsKKwkJbGVuID0gU1RSTEVOKGJ1Zik7CisJCVNUUkNQWShidWYgKyBsZW4sIHBhdGhfZW5kKTsKKwkJaWYgKG1jaF9oYXNfZXhwX3dpbGRjYXJkKHBhdGhfZW5kKSkgLyogaGFuZGxlIG1vcmUgd2lsZGNhcmRzICovCisJCXsKKwkJICAgIC8qIG5lZWQgdG8gZXhwYW5kIGFub3RoZXIgY29tcG9uZW50IG9mIHRoZSBwYXRoICovCisJCSAgICAvKiByZW1vdmUgYmFja3NsYXNoZXMgZm9yIHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBvbmx5ICovCisJCSAgICAodm9pZCl1bml4X2V4cGFuZHBhdGgoZ2FwLCBidWYsIGxlbiArIDEsIGZsYWdzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIG5vIG1vcmUgd2lsZGNhcmRzLCBjaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoICovCisJCSAgICAvKiByZW1vdmUgYmFja3NsYXNoZXMgZm9yIHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBvbmx5ICovCisJCSAgICBpZiAoKnBhdGhfZW5kKQorCQkJYmFja3NsYXNoX2hhbHZlKGJ1ZiArIGxlbiArIDEpOworCQkgICAgaWYgKG1jaF9nZXRwZXJtKGJ1ZikgPj0gMCkJLyogYWRkIGV4aXN0aW5nIGZpbGUgKi8KKwkJCWFkZGZpbGUoZ2FwLCBidWYsIGZsYWdzKTsKKwkJfQorCSAgICB9CisJfQorCisJY2xvc2VkaXIoZGlycCk7CisgICAgfQorCisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKworICAgIG1hdGNoZXMgPSBnYXAtPmdhX2xlbiAtIHN0YXJ0X2xlbjsKKyAgICBpZiAobWF0Y2hlcykKKwlxc29ydCgoKGNoYXJfdSAqKilnYXAtPmdhX2RhdGEpICsgc3RhcnRfbGVuLCBtYXRjaGVzLAorCQkJCQkJICAgc2l6ZW9mKGNoYXJfdSAqKSwgcHN0cmNtcCk7CisgICAgcmV0dXJuIG1hdGNoZXM7Cit9CisjZW5kaWYKKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGJ1aWxkIHVwIGEgbGlzdCBvZiBmaWxlcyBpbiAiZ2FwIiBtYXRjaGluZyB0aGUgZmlyc3Qgd2lsZGNhcmQKKyAqIGluIGBwYXRoJy4gIENhbGxlZCBieSBleHBhbmRfd2lsZGNhcmRzKCkuCisgKiAicGF0IiBoYXMgYmFja3NsYXNoZXMgYmVmb3JlIGNoYXJzIHRoYXQgYXJlIG5vdCB0byBiZSBleHBhbmRlZC4KKyAqLworICAgIGludAorbWNoX2V4cGFuZHBhdGgoCisgICAgZ2FycmF5X1QJKmdhcCwKKyAgICBjaGFyX3UJKnBhdGgsCisgICAgaW50CQlmbGFncykJCS8qIEVXXyogZmxhZ3MgKi8KK3sKKyNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCisgICAgcmV0dXJuIHVuaXhfZXhwYW5kcGF0aChnYXAsIHBhdGgsIDAsIGZsYWdzKTsKKyNlbHNlCisgICAgY2hhcl91IGZpcnN0ID0gKnBhdGg7CisgICAgc2hvcnQgIHNjYW5fdm9sdW1lOworCisgICAgc2xhc2hfbl9jb2xvbl9hZGp1c3QocGF0aCk7CisKKyAgICBzY2FuX3ZvbHVtZSA9IChmaXJzdCAhPSAqcGF0aCk7CisKKyAgICByZXR1cm4gbWFjX2V4cGFuZHBhdGgoZ2FwLCBwYXRoLCBmbGFncywgMCwgc2Nhbl92b2x1bWUpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitmbmFtZV9jYXNlKG5hbWUsIGxlbikKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgaW50CQlsZW47CSAgICAvKiBidWZmZXIgc2l6ZSwgaWdub3JlZCBoZXJlICovCit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBnZXQgdGhlIHJlYWwgY2FzaW5nIGZvciB0aGUgZmlsZQorICAgICAqICAgICAgIG1ha2UgaXQgY2FsbGVkCisgICAgICogICAgICAgd2l0aCBVU0VfRk5BTUVfQ0FTRSAmIFVTRV9MT05HX0ZOQU1FCisgICAgICoJCSAgICBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FCisgICAgICogICAgICAgd2l0aGluIHNldGZuYW1lLCBmaXhfZm5hbWUsIGRvX2VjbWQKKyAgICAgKi8KKyNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCisgICAgT1NTdGF0dXMJc3RhdHVzOworICAgIEZTUmVmCXJlZkZpbGU7CisgICAgVUludDMyCXBhdGhTaXplID0gU1RSTEVOKG5hbWUpICsgMTsKKyAgICBjaGFyX3UJKnBhdGg7CisgICAgQm9vbGVhbglpc0RpcmVjdG9yeTsKKworICAgIHBhdGggPSBhbGxvYyhwYXRoU2l6ZSk7CisgICAgaWYgKHBhdGggPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBzdGF0dXMgPSBGU1BhdGhNYWtlUmVmKChVSW50OCAqKW5hbWUsICZyZWZGaWxlLCAmaXNEaXJlY3RvcnkpOworICAgIGlmIChzdGF0dXMpCisJcmV0dXJuOworCisgICAgc3RhdHVzID0gRlNSZWZNYWtlUGF0aCgmcmVmRmlsZSwgKFVJbnQ4ICopcGF0aCwgcGF0aFNpemUpOworICAgIGlmIChzdGF0dXMpCisJcmV0dXJuOworCisgICAgLyogUGFyYW5vaWQ6IFVwZGF0ZSB0aGUgbmFtZSBpZiBvbmx5IHRoZSBjYXNpbmcgZGlmZmVyLiovCisgICAgaWYgKFNUUklDTVAobmFtZSwgcGF0aCkgPT0gMCkKKwlTVFJDUFkobmFtZSwgcGF0aCk7CisjZW5kaWYKK30KK3N0YXRpYyBjaGFyX3UJKm9sZHRpdGxlID0gKGNoYXJfdSAqKSAiZ1ZpbSI7CisKKy8qCisgKiBjaGVjayBmb3IgYW4gImludGVycnVwdCBzaWduYWwiOiBDVFJMLWJyZWFrIG9yIENUUkwtQworICovCisgICAgdm9pZAorbWNoX2JyZWFrY2hlY2soKQoreworICAgIC8qCisgICAgICogVE9ETzogU2NhbiBldmVudCBmb3IgYSBDVFJMLUMgb3IgQ09NTUFORC0uIGFuZCBkbzogZ290X2ludD1UUlVFOworICAgICAqICAgICAgIG9yIG9ubHkgZ28gcHJvY2Nlc3MgZXZlbnQ/CisgICAgICogICAgICAgb3IgZG8gbm90aGluZworICAgICAqLworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OworCisgICAgaWYgKEV2ZW50QXZhaWwgKGtleURvd25NYXNrLCAmdGhlRXZlbnQpKQorCWlmICgodGhlRXZlbnQubWVzc2FnZSAmIGNoYXJDb2RlTWFzaykgPT0gQ3RybF9DICYmIGN0cmxfY19pbnRlcnJ1cHRzKQorCSAgICBnb3RfaW50ID0gVFJVRTsKKyNpZiAwCisgICAgc2hvcnQJaSA9IDA7CisgICAgQm9vbGVhbiAgICAgZm91bmQgPSBmYWxzZTsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKworICAgIHdoaWxlICgoaSA8IDEwKSAmJiAoIWZvdW5kKSkKKyAgICB7CisJZm91bmQgPSBFdmVudEF2YWlsIChrZXlEb3duTWFzaywgJnRoZUV2ZW50KTsKKwlpZiAoZm91bmQpCisJeworCSAgaWYgKCh0aGVFdmVudC5tb2RpZmllcnMgJiBjb250cm9sS2V5KSAhPSAwKQorCSAgICBmb3VuZCA9IGZhbHNlOworCSAgaWYgKCh0aGVFdmVudC53aGF0ID09IGtleURvd24pKQorCSAgICBmb3VuZCA9IGZhbHNlOworCSAgaWYgKCh0aGVFdmVudC5tZXNzYWdlICYgY2hhckNvZGVNYXNrKSA9PSBDdHJsX0MpCisJICAgIHsKKwkJZm91bmQgPSBmYWxzZTsKKwkJZ290X2ludCA9IFRSVUU7CisJICAgIH0KKwl9CisJaSsrOworICAgIH0KKyNlbmRpZgorCit9CisKKy8qCisgKiBSZXR1cm4gYW1vdW50IG9mIG1lbW9yeSBjdXJyZW50bHkgYXZhaWxhYmxlLgorICovCisgICAgbG9uZ191CittY2hfYXZhaWxfbWVtKHNwZWNpYWwpCisgICAgaW50ICAgICBzcGVjaWFsOworeworICAgIC8qCisgICAgICogVE9ETzogVXNlIE1heEJsb2NrLCBGcmVlTWVNLCBQdXJnZVNwYWNlLCBNYXhCbG9ja1N5cyBGQVEtMjY2CisgICAgICogICAgICAgZmlndXJlIG91dCB3aGF0IHRoZSBzcGVjaWFsIGlzIGZvcgorICAgICAqCisgICAgICogRnJlZU1lbSAgLT4gICByZXR1cm5zIGFsbCBhdmFpbCBtZW1vcnkgaXMgYXBwbGljYXRpb24gaGVhcAorICAgICAqIE1heEJsb2NrIC0+ICAgcmV0dXJucyB0aGUgYmlnZ2VzdCBjb250aWdlb3VzIGJsb2NrIGluIGFwcGxpY2F0aW9uIGhlYXAKKyAgICAgKiBQdXJnZVNwYWNlIC0+CisgICAgICovCisgICAgcmV0dXJuIE1heEJsb2NrKCk7Cit9CisKKyAgICB2b2lkCittY2hfZGVsYXkobXNlYywgaWdub3JlaW5wdXQpCisgICAgbG9uZwltc2VjOworICAgIGludAkJaWdub3JlaW5wdXQ7Cit7CisjaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19NV0VSS1NfXyA+PSAweDIwMDApIFwKKwl8fCBkZWZpbmVkKF9fTVJDX18pIHx8IGRlZmluZWQoX19TQ19fKQorICAgIHVuc2lnbmVkCisjZW5kaWYKKyAgICBsb25nICAgZmluYWxUaWNrOworCisgICAgaWYgKGlnbm9yZWlucHV0KQorCURlbGF5ICg2MCptc2VjLzEwMDAsICZmaW5hbFRpY2spOworICAgIGVsc2UKKwkvKiBldmVuIHRob3VndGggd2Ugc2hvdWxkIGNhbGwgZ3VpIHN0dWZmIGZyb20gaGVyZQorCSAgIGl0IHRoZSBzaW1wbGVzdCB3YXkgdG8gYmUgc2FmZSAqLworCWd1aV9tY2hfd2FpdF9mb3JfY2hhcnMobXNlYyk7Cit9CisKKyAgICB2b2lkCittY2hfaW5pdCgpCit7CisgICAgLyoKKyAgICAgKiAgVE9ETzogVmVyaWZ5IGlmIG5lZWRlZCwgb3Igb3ZlcnJpZGUgbGF0ZXIuCisgICAgICovCisgICAgQ29sdW1ucyA9IDgwOworICAgIFJvd3MgPSAyNDsKK30KKworLyoKKyAqIENoZWNrX3dpbiBjaGVja3Mgd2hldGhlciB3ZSBoYXZlIGFuIGludGVyYWN0aXZlIHN0ZG91dC4KKyAqLworICAgIGludAorbWNoX2NoZWNrX3dpbihhcmdjLCBhcmd2KQorICAgIGludAkJYXJnYzsKKyAgICBjaGFyCSoqYXJndjsKK3sKKyAgICAvKgorICAgICAqIFRPRE86IE1heWJlIHRvIGJlIHJlbW92ZSB0aHJvdWdoIE5PX0NPTlNPTEUKKyAgICAgKi8KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgaW5wdXQgY29tZXMgZnJvbSBhIHRlcm1pbmFsLCBGQUxTRSBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK21jaF9pbnB1dF9pc2F0dHkoKQoreworICAgIC8qCisgICAgICogVE9ETzogTWF5YmUgdG8gYmUgcmVtb3ZlIHRocm91Z2ggTk9fQ09OU09MRQorICAgICAqLworICAgIHJldHVybiBPSzsKK30KKworI2lmZGVmIEZFQVRfVElUTEUKKy8qCisgKiBTZXQgdGhlIHdpbmRvdyB0aXRsZSBhbmQgaWNvbi4KKyAqIChUaGUgaWNvbiBpcyBub3QgdGFrZW4gY2FyZSBvZikuCisgKi8KKyAgICB2b2lkCittY2hfc2V0dGl0bGUodGl0bGUsIGljb24pCisgICAgY2hhcl91ICp0aXRsZTsKKyAgICBjaGFyX3UgKmljb247Cit7CisgICAgZ3VpX21jaF9zZXR0aXRsZSh0aXRsZSwgaWNvbik7Cit9CisKKy8qCisgKiBSZXN0b3JlIHRoZSB3aW5kb3cvaWNvbiB0aXRsZS4KKyAqIHdoaWNoIGlzIG9uZSBvZjoKKyAqCTEgIEp1c3QgcmVzdG9yZSB0aXRsZQorICogICAgICAyICBKdXN0IHJlc3RvcmUgaWNvbgorICoJMyAgUmVzdG9yZSB0aXRsZSBhbmQgaWNvbgorICogYnV0IGRvbid0IGNhcmUgYWJvdXQgdGhlIGljb24uCisgKi8KKyAgICB2b2lkCittY2hfcmVzdG9yZV90aXRsZSh3aGljaCkKKyAgICBpbnQgd2hpY2g7Cit7CisgICAgbWNoX3NldHRpdGxlKCh3aGljaCAmIDEpID8gb2xkdGl0bGUgOiBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKgorICogSW5zZXJ0IHVzZXIgbmFtZSBpbiBzW2xlbl0uCisgKiBSZXR1cm4gT0sgaWYgYSBuYW1lIGZvdW5kLgorICovCisgICAgaW50CittY2hfZ2V0X3VzZXJfbmFtZShzLCBsZW4pCisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworeworI2lmICEoZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykpIC8qIE5vIHNvbHV0aW9uIHlldCAqLworICAgIC8qCisgICAgICogVE9ETzogY2xlYW4gdXAgYW5kIHRyeSBnZXRsb2dpbiAoKQorICAgICAqLworI2lmIGRlZmluZWQoSEFWRV9QV0RfSCkgJiYgZGVmaW5lZChIQVZFX0dFVFBXVUlEKQorICAgIHN0cnVjdCBwYXNzd2QJKnB3OworI2VuZGlmCisgICAgdWlkX3QJCXVpZDsKKworICAgIHVpZCA9IGdldHVpZCgpOworI2lmIGRlZmluZWQoSEFWRV9QV0RfSCkgJiYgZGVmaW5lZChIQVZFX0dFVFBXVUlEKQorICAgIGlmICgocHcgPSBnZXRwd3VpZCh1aWQpKSAhPSBOVUxMCisJICAgICYmIHB3LT5wd19uYW1lICE9IE5VTEwgJiYgKihwdy0+cHdfbmFtZSkgIT0gTlVMKQorICAgIHsKKwlTVFJOQ1BZKHMsIHB3LT5wd19uYW1lLCBsZW4pOworCXJldHVybiBPSzsKKyAgICB9CisjZW5kaWYKKyAgICBzcHJpbnRmKChjaGFyICopcywgIiVkIiwgKGludCl1aWQpOwkJLyogYXNzdW1lcyBzIGlzIGxvbmcgZW5vdWdoICovCisjZW5kaWYKKyAgICByZXR1cm4gRkFJTDsJCQkJLyogYSBudW1iZXIgaXMgbm90IGEgbmFtZSAqLworfQorCisvKgorICogQ29weSBob3N0IG5hbWUgaW50byBzW2xlbl0uCisgKi8KKyAgICB2b2lkCittY2hfZ2V0X2hvc3RfbmFtZShzLCBsZW4pCisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworeworI2lmIGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoX19BUFBMRV9DQ19fKQorICAgIFNUUk5DUFkocywgIk1hYyIsIGxlbik7IC8qIFRPRE86IHVzZSBHZXN0YWx0IGluZm9ybWF0aW9uICovCisjZWxzZQorICAgIHN0cnVjdCB1dHNuYW1lIHZ1dHNuYW1lOworCisgICAgaWYgKHVuYW1lKCZ2dXRzbmFtZSkgPCAwKQorCSpzID0gTlVMOworICAgIGVsc2UKKwlTVFJOQ1BZKHMsIHZ1dHNuYW1lLm5vZGVuYW1lLCBsZW4pOworI2VuZGlmCisgICAgc1tsZW4gLSAxXSA9IE5VTDsJLyogbWFrZSBzdXJlIGl0J3MgdGVybWluYXRlZCAqLworfQorCisvKgorICogcmV0dXJuIHByb2Nlc3MgSUQKKyAqLworICAgIGxvbmcKK21jaF9nZXRfcGlkKCkKK3sKKyAgICByZXR1cm4gKGxvbmcpZ2V0cGlkKCk7Cit9CisKKy8qCisgKiBHZXQgbmFtZSBvZiBjdXJyZW50IGRpcmVjdG9yeSBpbnRvIGJ1ZmZlciAnYnVmJyBvZiBsZW5ndGggJ2xlbicgYnl0ZXMuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK21jaF9kaXJuYW1lKGJ1ZiwgbGVuKQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbGVuOworeworI2lmIGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pCisgICAgcmV0dXJuIEZBSUw7IC8qIE5vIHNvbHV0aW9uIHlldCAqLworI2Vsc2UKKyAgICAvKiBUaGUgbGFzdCA6IGlzIGFscmVhZHkgcHV0IGJ5IGdldGN3ZCAqLworICAgIGlmIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgPT0gTlVMTCkKKwl7CisJICAgIFNUUkNQWShidWYsIHN0cmVycm9yKGVycm5vKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKyMgaWZuZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICBlbHNlIGlmICgqYnVmICE9IE5VTCAmJiBidWZbU1RSTEVOKGJ1ZikgLSAxXSA9PSAnOicpCisJYnVmW1NUUkxFTihidWYpIC0gMV0gPSBOVUw7CS8qIHJlbW92ZSB0cmFpbGluZyAnOicgKi8KKyMgZW5kaWYKKyAgICByZXR1cm4gT0s7CisjZW5kaWYKK30KKworICAgIHZvaWQKK3NsYXNoX3RvX2NvbG9uKHApCisgICAgY2hhcl91CSpwOworeworICAgIGZvciAoIDsgKnA7ICsrcCkKKwlpZiAoKnAgPT0gJy8nKQorCSAgICAqcCA9ICc6JzsKK30KKworICAgIGNoYXJfdSAqCitzbGFzaF90b19jb2xvbl9zYXZlIChwKQorICAgIGNoYXJfdSAgKnA7Cit7CisgICAgY2hhcl91CSpyZXM7CisKKyAgICByZXMgPSB2aW1fc3Ryc2F2ZShwKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisJcmV0dXJuIHA7CisgICAgc2xhc2hfdG9fY29sb24ocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisgICAgdm9pZAorc2xhc2hfbl9jb2xvbl9hZGp1c3QgKGJ1ZikKKyAgICBjaGFyX3UgKmJ1ZjsKK3sKKyAgICAvKgorICAgICAqIFRPRE86IE1ha2UgaXQgZmFzdGVyCisgICAgICovCisjaWZuZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICBjaGFyX3UgIHRlbXBbTUFYUEFUSExdOworICAgIGNoYXJfdSAgKmZpcnN0X2NvbG9uID0gdmltX3N0cmNocihidWYsICc6Jyk7CisgICAgY2hhcl91ICAqZmlyc3Rfc2xhc2ggPSB2aW1fc3RyY2hyKGJ1ZiwgJy8nKTsKKyAgICBpbnQgICAgIGZ1bGwgPSBUUlVFOworICAgIGNoYXJfdSAgKnNjYW5uaW5nOworICAgIGNoYXJfdSAgKmZpbGxpbmc7CisgICAgY2hhcl91ICBsYXN0X2NvcGllZCA9IE5VTDsKKworICAgIGlmICgqYnVmID09IE5VTCkKKwlyZXR1cm4gOworCisgICAgaWYgKChmaXJzdF9jb2xvbiA9PSBOVUxMKSAmJiAoZmlyc3Rfc2xhc2ggPT0gTlVMTCkpCisJZnVsbCA9IEZBTFNFOworICAgIGlmICgoZmlyc3Rfc2xhc2ggPT0gTlVMTCkgJiYgKGZpcnN0X2NvbG9uICE9IE5VTEwpKQorCWZ1bGwgPSBUUlVFOworICAgIGlmICgoZmlyc3RfY29sb24gPT0gTlVMTCkgJiYgKGZpcnN0X3NsYXNoICE9IE5VTEwpKQorCWZ1bGwgPQlGQUxTRTsKKyAgICBpZiAoKGZpcnN0X3NsYXNoIDwgZmlyc3RfY29sb24pICYmIChmaXJzdF9zbGFzaCAhPSBOVUxMKSkKKwlmdWxsID0gRkFMU0U7CisgICAgaWYgKChmaXJzdF9jb2xvbiA8IGZpcnN0X3NsYXNoKSAmJiAoZmlyc3RfY29sb24gIT0gTlVMTCkpCisJZnVsbCA9IFRSVUU7CisgICAgaWYgKGZpcnN0X3NsYXNoID09IGJ1ZikKKwlmdWxsID0gVFJVRTsKKyAgICBpZiAoZmlyc3RfY29sb24gPT0gYnVmKQorCWZ1bGwgPSBGQUxTRTsKKworICAgIHNjYW5uaW5nID0gYnVmOworICAgIGZpbGxpbmcgID0gdGVtcDsKKworICAgIHdoaWxlICgqc2Nhbm5pbmcgIT0gTlVMKQorICAgIHsKKwlpZiAoKnNjYW5uaW5nID09ICcvJykKKwl7CisJICAgIGlmICgoc2Nhbm5pbmdbMV0gIT0gJy8nKSAmJiAoc2Nhbm5pbmdbLTFdICE9ICc6JykpCisJICAgIHsKKwkJKmZpbGxpbmcrKyA9ICc6JzsKKwkJc2Nhbm5pbmcrKzsKKwkgICAgfQorCSAgICBlbHNlCisJCXNjYW5uaW5nKys7CisJfQorCWVsc2UgaWYgKCpzY2FubmluZyA9PSAnLicpCisJeworCSAgICBpZiAoKHNjYW5uaW5nWzFdID09IE5VTCkgfHwgc2Nhbm5pbmdbMV0gPT0gJy8nKQorCSAgICB7CisJCWlmIChzY2FubmluZ1sxXSA9PSBOVUwpCisJCSAgICBzY2FubmluZyArPSAxOworCQllbHNlCisJCSAgICBzY2FubmluZyArPSAyOworCSAgICB9CisJICAgIGVsc2UgaWYgKHNjYW5uaW5nWzFdID09ICcuJykKKwkgICAgeworCQlpZiAoKHNjYW5uaW5nWzJdID09IE5VTCkgfHwgc2Nhbm5pbmdbMl0gPT0gJy8nKQorCQl7CisJCSAgICAqZmlsbGluZysrID0gJzonOworCQkgICAgaWYgKHNjYW5uaW5nWzJdID09IE5VTCkKKwkJCXNjYW5uaW5nICs9MjsKKwkJICAgIGVsc2UKKwkJCXNjYW5uaW5nICs9IDM7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAqZmlsbGluZysrID0gKnNjYW5uaW5nKys7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJKmZpbGxpbmcrKyA9ICpzY2FubmluZysrOworCSAgICB9CisKKwl9CisJZWxzZQorCXsKKwkgICAgKmZpbGxpbmcrKyA9ICpzY2FubmluZysrOworCX0KKworICAgIH0KKworICAgICpmaWxsaW5nID0gMDsKKyAgICBmaWxsaW5nID0gdGVtcDsKKworICAgIGlmICghZnVsbCkKKyAgICB7CisJaWYgKGJ1ZlswXSAhPSAnOicpCisJeworCSAgICBidWZbMF0gPSAnOic7CisJICAgIGJ1ZlsxXSA9IE5VTDsKKwl9CisJZWxzZQorCSAgICBidWZbMF0gPSBOVUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJYnVmWzBdID0gTlVMOworCWlmIChmaWxsaW5nWzBdID09ICc6JykKKwkgICAgZmlsbGluZysrOworICAgIH0KKworICAgIFNUUkNBVCAoYnVmLCBmaWxsaW5nKTsKKyNlbmRpZgorfQorCisvKgorICogR2V0IGFic29sdXRlIGZpbGVuYW1lIGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgZm9yIHN1Y2Nlc3MKKyAqLworICAgIGludAorbWNoX0Z1bGxOYW1lKGZuYW1lLCBidWYsIGxlbiwgZm9yY2UpCisgICAgY2hhcl91ICAqZm5hbWUsICpidWY7CisgICAgaW50ICAgICBsZW47CisgICAgaW50ICAgICBmb3JjZTsJICAgIC8qIGFsc28gZXhwYW5kIHdoZW4gYWxyZWFkeSBhYnNvbHV0ZSBwYXRoIG5hbWUgKi8KK3sKKyAgICAvKgorICAgICAqIFRPRE86IEZpbmQgd2hhdCBUT0RPCisgICAgICovCisgICAgaW50CQlsOworICAgIGNoYXJfdQlvbGRkaXJbTUFYUEFUSExdOworICAgIGNoYXJfdQluZXdkaXJbTUFYUEFUSExdOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJYzsKKyAgICBpbnQJCXJldHZhbCA9IE9LOworCisgICAgaWYgKGZvcmNlIHx8ICFtY2hfaXNGdWxsTmFtZShmbmFtZSkpCisgICAgeworCS8qCisJICogRm9yY2VkIG9yIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAqIElmIHRoZSBmaWxlIG5hbWUgaGFzIGEgcGF0aCwgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGZvciBhIG1vbWVudCwKKwkgKiBhbmQgdGhlbiBkbyB0aGUgZ2V0d2QoKSAoYW5kIGdldCBiYWNrIHRvIHdoZXJlIHdlIHdlcmUpLgorCSAqIFRoaXMgd2lsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lIHdpdGggIi4uLyIgdGhpbmdzLgorCSAqLworCWlmICgocCA9IHZpbV9zdHJyY2hyKGZuYW1lLCAnOicpKSAhPSBOVUxMKQorCXsKKwkgICAgcCsrOworCSAgICBpZiAobWNoX2Rpcm5hbWUob2xkZGlyLCBNQVhQQVRITCkgPT0gRkFJTCkKKwkgICAgeworCQlwID0gTlVMTDsJCS8qIGNhbid0IGdldCBjdXJyZW50IGRpcjogZG9uJ3QgY2hkaXIgKi8KKwkJcmV0dmFsID0gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJYyA9ICpwOworCQkqcCA9IE5VTDsKKwkJaWYgKG1jaF9jaGRpcigoY2hhciAqKWZuYW1lKSkKKwkJICAgIHJldHZhbCA9IEZBSUw7CisJCWVsc2UKKwkJICAgIGZuYW1lID0gcDsgLyogKyAxOyovCisJCSpwID0gYzsKKwkgICAgfQorCX0KKwlpZiAobWNoX2Rpcm5hbWUoYnVmLCBsZW4pID09IEZBSUwpCisJeworCSAgICByZXR2YWwgPSBGQUlMOworCSAgICAqbmV3ZGlyID0gTlVMOworCX0KKwlsID0gU1RSTEVOKGJ1Zik7CisJaWYgKFNUUkNNUChmbmFtZSwgIi4iKSAhPSAwKQorCXsKKyNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCisJICAgIGlmIChsID4gMCAmJiBidWZbbCAtIDFdICE9ICcvJyAmJiAqZm5hbWUgIT0gTlVMKQorCQlTVFJDQVQoYnVmLCAiLyIpOworI2Vsc2UKKwkgICAgaWYgKGwgPiAwICYmIGJ1ZltsIC0gMV0gIT0gJzonICYmICpmbmFtZSAhPSBOVUwpCisJCVNUUkNBVChidWYsICI6Iik7CisjZW5kaWYKKwl9CisJaWYgKHAgIT0gTlVMTCkKKwkgICAgbWNoX2NoZGlyKChjaGFyICopb2xkZGlyKTsKKwlpZiAoU1RSQ01QKGZuYW1lLCAiLiIpICE9IDApCisJICAgIFNUUkNBVChidWYsIGZuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlTVFJOQ1BZKGJ1ZiwgZm5hbWUsIGxlbik7CisJYnVmW2xlbiAtIDFdID0gTlVMOworCXNsYXNoX25fY29sb25fYWRqdXN0KGJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJmbmFtZSIgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqLworCWludAorbWNoX2lzRnVsbE5hbWUoZm5hbWUpCisJY2hhcl91CQkqZm5hbWU7Cit7CisjaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQorICAgIHJldHVybiAoKGZuYW1lWzBdID09ICcvJykgfHwgKGZuYW1lWzBdID09ICd+JykpOworI2Vsc2UKKyAgICAvKgorICAgICAqIFRPRE86IE1ha2Ugc3VyZSBmbmFtZSBpcyBhbHdheXMgb2YgbWFjIHN0aWxsCisgICAgICogICAgICAgaS5lOiBwYXNzZWQgdGhyb3VnaHQgc2xhc2hfbl9jb2xvbl9hZGp1c3QKKyAgICAgKi8KKwljaGFyX3UJKmZpcnN0X2NvbG9uID0gdmltX3N0cmNocihmbmFtZSwgJzonKTsKKwljaGFyX3UJKmZpcnN0X3NsYXNoID0gdmltX3N0cmNocihmbmFtZSwgJy8nKTsKKworCWlmIChmaXJzdF9jb2xvbiA9PSBmbmFtZSkKKwkgIHJldHVybiBGQUxTRTsKKwlpZiAoZmlyc3Rfc2xhc2ggPT0gZm5hbWUpCisJICByZXR1cm4gVFJVRTsKKwlpZiAoKGZpcnN0X2NvbG9uIDwgZmlyc3Rfc2xhc2gpICYmIChmaXJzdF9jb2xvbiAhPSBOVUxMKSkKKwkgIHJldHVybiBUUlVFOworCWlmICgoZmlyc3Rfc2xhc2ggPCBmaXJzdF9jb2xvbikgJiYgKGZpcnN0X3NsYXNoICE9IE5VTEwpKQorCSAgcmV0dXJuIEZBTFNFOworCWlmICgoZmlyc3RfY29sb24gPT0gTlVMTCkgJiYgKGZpcnN0X3NsYXNoICE9IE5VTEwpKQorCSAgcmV0dXJuIEZBTFNFOworCWlmICgoZmlyc3Rfc2xhc2ggPT0gTlVMTCkgJiYgKGZpcnN0X2NvbG9uICE9IE5VTEwpKQorCSAgcmV0dXJuIFRSVUU7CisJaWYgKChmaXJzdF9jb2xvbiA9PSBOVUxMKSAmJiAoZmlyc3Rfc2xhc2ggPT0gTlVMTCkpCisJICByZXR1cm4gRkFMU0U7CisJcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoKKyAqIFJlcGxhY2UgYWxsIHNsYXNoZXMgYnkgY29sb25zLgorICovCisgICAgdm9pZAorc2xhc2hfYWRqdXN0KHApCisgICAgY2hhcl91ICAqcDsKK3sKKyNpZm5kZWYgVVNFX1VOSVhGSUxFTkFNRQorICAgIC8qCisgICAgICogVE9ETzoga2VlcCBlc2NhcGVkICcvJworICAgICAqLworCisgICAgd2hpbGUgKCpwKQorICAgIHsKKwlpZiAoKnAgPT0gJy8nKQorCSAgICAqcCA9ICc6JzsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCWVsc2UKKyNlbmRpZgorCSAgICArK3A7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBHZXQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgJ25hbWUnLgorICogUmV0dXJucyAtMSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBsb25nCittY2hfZ2V0cGVybShuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyAgICAvKgorICAgICAqIFRPRE86IE1heWJlIHVzZSBBcHBsZVNoYXJlIGluZm8/PworICAgICAqICAgICAgIFVzZSBsb2NrZWQgZm9yIG5vbiB3cml0YWJsZQorICAgICAqLworCisgICAgc3RydWN0IHN0YXQgc3RhdGI7CisKKyAgICBpZiAoc3RhdCgoY2hhciAqKW5hbWUsICZzdGF0YikpCisJcmV0dXJuIC0xOworICAgIHJldHVybiBzdGF0Yi5zdF9tb2RlOworfQorCisvKgorICogc2V0IGZpbGUgcGVybWlzc2lvbiBmb3IgJ25hbWUnIHRvICdwZXJtJworICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWNoX3NldHBlcm0obmFtZSwgcGVybSkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgbG9uZwlwZXJtOworeworICAgIC8qCisgICAgICogVE9ETzogTWF5YmUgdXNlIEFwcGxlU2hhcmUgaW5mbz8/CisgICAgICogICAgICAgVXNlIGxvY2tlZCBmb3Igbm9uIHdyaXRhYmxlCisgICAgICovCisgICAgcmV0dXJuIChPSyk7Cit9CisKKy8qCisgKiBTZXQgaGlkZGVuIGZsYWcgZm9yICJuYW1lIi4KKyAqLworICAgIHZvaWQKK21jaF9oaWRlKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICAvKgorICAgICAqIFRPRE86IEhpZGUgdGhlIGZpbGUgdGhyb3VnaHQgRmlsZU1hbmFnZXIgRkFRIDgtMzQKKyAgICAgKgorICAgICAqICAqbmFtZSBpcyBtYWMgc3R5bGUgc3RhcnQgd2l0aCA6IGZvciByZWxhdGl2ZQorICAgICAqLworfQorCisKKy8qCisgKiByZXR1cm4gVFJVRSBpZiAibmFtZSIgaXMgYSBkaXJlY3RvcnkKKyAqIHJldHVybiBGQUxTRSBpZiAibmFtZSIgaXMgbm90IGEgZGlyZWN0b3J5CisgKiByZXR1cm4gRkFMU0UgZm9yIGVycm9yCisgKi8KKyAgICBpbnQKK21jaF9pc2RpcihuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBGaW5kIG91dCBieSBGaWxlTWFuYWdlciBjYWxscyAuLi4KKyAgICAgKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworI2lmIGRlZmluZWQoVEFSR0VUX0FQSV9NQUNfQ0FSQk9OKSAmJiBUQVJHRVRfQVBJX01BQ19DQVJCT04KKyAgICAvKiBGb3Igc29tZSByZWFzb24gdGhlIG5hbWUgaXMgc29tZXRpbWVzIGVtcHR5LAorICAgICAqIChzdWNoIGFzIGZvciBhIG5vdCB5ZXQgbmFtZWQgZmlsZSkuIEFuIGVtcHR5CisgICAgICogZmlsZW5hbWUgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIE1hY09TIHZlcnNpb24KKyAgICAgKiBvZiBzdGF0IChhdCBsZWFzdCB1bmRlciBDb2Rld2FycmlvcikgYXMgdGhlCisgICAgICogY3VycmVudCBkaXJlY3RvcnkuCisgICAgICovCisgICAgLyogQUsgMjAwMjA0MTMKKyAgICAgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBDYXJib24gYnV0IGJyZWFrcyB0aGUKKyAgICAgKiBleHBsb3JlciBwbHVnaW4gaW4gQ2xhc3NpYworICAgICAqLworICAgIGlmIChuYW1lWzBdID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgICBpZiAoc3RhdCgoY2hhciAqKW5hbWUsICZzdGF0YikpCisJcmV0dXJuIEZBTFNFOworI2lmIGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pCisgICAgcmV0dXJuIEZBTFNFOyAgIC8qIGRlZmluaXRlbHkgVE9ETyAqLworI2Vsc2UKKyAgICByZXR1cm4gKChzdGF0Yi5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIDEgaWYgIm5hbWUiIGNhbiBiZSBleGVjdXRlZCwgMCBpZiBub3QuCisgKiBSZXR1cm4gLTEgaWYgdW5rbm93bi4KKyAqLworICAgIGludAorbWNoX2Nhbl9leGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgLyogVE9ETyAqLworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZgorCisvKgorICogQ2hlY2sgd2hhdCAibmFtZSIgaXM6CisgKiBOT0RFX05PUk1BTDogZmlsZSBvciBkaXJlY3RvcnkgKG9yIGRvZXNuJ3QgZXhpc3QpCisgKiBOT0RFX1dSSVRBQkxFOiB3cml0YWJsZSBkZXZpY2UsIHNvY2tldCwgZmlmbywgZXRjLgorICogTk9ERV9PVEhFUjogbm9uLXdyaXRhYmxlIHRoaW5ncworICovCisgICAgaW50CittY2hfbm9kZXR5cGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgLyogVE9ETyAqLworICAgIHJldHVybiBOT0RFX05PUk1BTDsKK30KKworICAgIHZvaWQKK21jaF9lYXJseV9pbml0KCkKK3sKK30KKworICAgIHZvaWQKK21jaF9leGl0KHIpCisgICAgaW50ICAgICByOworeworICAgIGRpc3BsYXlfZXJyb3JzKCk7CisKKyAgICBtbF9jbG9zZV9hbGwoVFJVRSk7CQkvKiByZW1vdmUgYWxsIG1lbWZpbGVzICovCisgICAgZXhpdChyKTsKK30KKworCisgICAgdm9pZAorbWNoX3NldHRtb2RlKHRtb2RlKQorICAgIGludCAgICAgdG1vZGU7Cit7CisgICAgLyoKKyAgICAgKiBUT0RPOiByZW1vdmUgdGhlIG5lZWRzIG9mIGl0LgorICAgICAqLworfQorCisjaWZkZWYgRkVBVF9NT1VTRQorLyoKKyAqIHNldCBtb3VzZSBjbGlja3Mgb24gb3Igb2ZmIChvbmx5IHdvcmtzIGZvciB4dGVybXMpCisgKi8KKyAgICB2b2lkCittY2hfc2V0bW91c2Uob24pCisgICAgaW50ICAgICBvbjsKK3sKKyAgICAvKgorICAgICAqIFRPRE86IHJlbW92ZSB0aGUgbmVlZHMgb2YgaXQuCisgICAgICovCit9CisjZW5kaWYKKworLyoKKyAqIHNldCBzY3JlZW4gbW9kZSwgYWx3YXlzIGZhaWxzLgorICovCisgICAgaW50CittY2hfc2NyZWVubW9kZShhcmcpCisgICAgY2hhcl91CSAqYXJnOworeworICAgIEVNU0coXyhlX3NjcmVlbm1vZGUpKTsKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIGludAorbWNoX2NhbGxfc2hlbGwoY21kLCBvcHRpb25zKQorICAgIGNoYXJfdQkqY21kOworICAgIGludAkJb3B0aW9uczsJLyogU0hFTExfKiwgc2VlIHZpbS5oICovCit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBmaW5kIGEgc2hlbGwgb3IgcHNldWRvLXNoZWxsIHRvIGNhbGwKKyAgICAgKiAgICAgICBmb3Igc29tZSBzaW1wbGUgdXNlZnVsIGNvbW1hbmQKKyAgICAgKi8KKworICAgIHJldHVybiAoLTEpOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW5zIGEgd2lsZGNhcmQgdGhhdCBjYW4gYmUgZXhwYW5kZWQgYnkKKyAqIG1jaF9leHBhbmRwYXRoKCkuCisgKi8KKyAgICBpbnQKK21jaF9oYXNfZXhwX3dpbGRjYXJkKHApCisgICAgY2hhcl91CSpwOworeworICAgIGZvciAoIDsgKnA7ICsrcCkKKyAgICB7CisJaWYgKCpwID09ICdcXCcgJiYgcFsxXSAhPSBOVUwpCisJICAgICsrcDsKKwllbHNlIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilXSUxEQ0hBUl9MSVNULCAqcCkgIT0gTlVMTCkKKwkgICAgcmV0dXJuIFRSVUU7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisgICAgaW50CittY2hfaGFzX3dpbGRjYXJkKHApCisgICAgY2hhcl91CSpwOworeworI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKKyAgICBpZiAoKnAgPT0gJ34nICYmIHBbMV0gIT0gTlVMKQorCXJldHVybiBUUlVFOworI2VuZGlmCisgICAgcmV0dXJuIG1jaF9oYXNfZXhwX3dpbGRjYXJkKHApOworfQorCisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBkdXBsaWNhdGUgYSBmaWxlLCBpdCBpcyB1c2VkIGluIG9yZGVyIHRvIGtlZXAKKyAqIHRoZSBmb290cHJpbnQgb2YgdGhlIHByZXZpb3VzIGZpbGUsIHdoZW4gc29tZSBpbmZvIGNhbiBiZSBlYXNpbHkKKyAqIHJlc3RvcmVkIHdpdGggc2V0X3Blcm0oKS4KKyAqCisgKiBSZXR1cm4gLTEgZm9yIGZhaWx1cmUsIDAgZm9yIHN1Y2Nlc3MuCisgKi8KKyAgICBpbnQKK21jaF9jb3B5X2ZpbGUoZnJvbSwgdG8pCisgICAgY2hhcl91ICpmcm9tOworICAgIGNoYXJfdSAqdG87Cit7CisgICAgY2hhcl91ICBmcm9tX3N0clsyNTZdOworICAgIGNoYXJfdSAgdG9fc3RyWzI1Nl07CisgICAgY2hhcl91ICB0b19uYW1lWzI1Nl07CisKKyAgICBIUGFyYW1CbG9ja1JlYyBwYXJhbUJsb2NrOworICAgIGNoYXJfdSAgKmNoYXJfcHRyOworICAgIGludAkgICAgbGVuOworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IEMgc3RyaW5nIHRvIFBhc2NhbCBzdHJpbmcKKyAgICAgKi8KKyAgICAgY2hhcl9wdHIgPSBmcm9tOworICAgICBsZW4gPSAxOworICAgICBmb3IgKDsgKCpjaGFyX3B0ciAhPSAwKSAmJiAobGVuIDwgMjU1KTsgbGVuKyssIGNoYXJfcHRyKyspCisJZnJvbV9zdHJbbGVuXSA9ICpjaGFyX3B0cjsKKyAgICAgZnJvbV9zdHJbMF0gPSBsZW4tMTsKKworICAgICBjaGFyX3B0ciA9IHRvOworICAgICBsZW4gPSAxOworICAgICBmb3IgKDsgKCpjaGFyX3B0ciAhPSAwKSAmJiAobGVuIDwgMjU1KTsgbGVuKyssIGNoYXJfcHRyKyspCisJdG9fc3RyW2xlbl0gPSAqY2hhcl9wdHI7CisgICAgIHRvX3N0clswXSA9IGxlbi0xOworCisgICAgcGFyYW1CbG9jay5jb3B5UGFyYW0uaW9Db21wbGV0aW9uID0gTlVMTDsKKyAgICBwYXJhbUJsb2NrLmNvcHlQYXJhbS5pb05hbWVQdHIgICAgPSBmcm9tX3N0cjsKKyAvKiBwYXJhbUJsb2NrLmNvcHlQYXJhbS5pb1ZSZWZudW0gICAgPSAgb3ZlcmlkZWQgYnkgaW9GaWxlbmFtZTsgKi8KKyAvKiBwYXJhbUJsb2NrLmNvcHlQYXJhbS5pb0RpckkgICAgICAgPSAgb3ZlcmlkZWQgYnkgaW9GaWxlbmFtZTsgKi8KKworICAgIHBhcmFtQmxvY2suY29weVBhcmFtLmlvTmV3TmFtZSAgICA9IHRvX3N0cjsKKyAgICBwYXJhbUJsb2NrLmNvcHlQYXJhbS5pb0NvcHlOYW1lICAgPSB0b19uYW1lOyAgICAgLyogTklMICovCisgLyogcGFyYW1CbG9jay5jb3B5UGFyYW0uaW9Ec3RWUmVmTnVtID0gb3ZlcmlkZWQgYnkgaW9OZXdOYW1lOyAgICovCisgLyogcGFyYW1CbG9jay5jb3B5UGFyYW0uaW9OZXdEaXJJRCAgID0gb3ZlcmlkZWQgYnkgaW9OZXdOYW1lOyAgICovCisKKworCisgICAgLyoKKyAgICAgKiBGaXJzdCBkZWxldGUgdGhlICJ0byIgZmlsZSwgdGhpcyBpcyByZXF1aXJlZCBvbiBzb21lIHN5c3RlbXMgdG8gbWFrZQorICAgICAqIHRoZSByZW5hbWUoKSB3b3JrLCBvbiBvdGhlciBzeXN0ZW1zIGl0IG1ha2VzIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlCisgICAgICogdHdvIGZpbGVzIHdoZW4gdGhlIHJlbmFtZSgpIGZhaWxzLgorICAgICAqLworICAgIG1jaF9yZW1vdmUodG8pOworCisgICAgLyoKKyAgICAgKiBGaXJzdCB0cnkgYSBub3JtYWwgcmVuYW1lLCByZXR1cm4gaWYgaXQgd29ya3MuCisgICAgICovCisgICAgKHZvaWQpIFBCSENvcHlGaWxlKCZwYXJhbUJsb2NrLCBmYWxzZSk7CisgICAgcmV0dXJuIDA7CisKK30KKworCisgICAgaW50CittY2hfY29weV9maWxlX2F0dHJpYnV0ZShmcm9tLCB0bykKKyAgICBjaGFyX3UgKmZyb207CisgICAgY2hhcl91ICp0bzsKK3sKKyAgICBGU1NwZWMgIGZyRlNTcGVjOworICAgIEZTU3BlYyAgdG9GU1NwZWM7CisgICAgRkluZm8gICBmbmRySW5mbzsKKyAgICAgU3RyMjU1CW5hbWU7CisgICAgIFJlc1R5cGUJdHlwZTsKKyAgICAgUmVzVHlwZQlzaW5rOworICAgICBIYW5kbGUJcmVzb3VyY2U7CisgICAgIHNob3J0CWlkeFR5cGVzOworICAgICBzaG9ydCAgICBuYlR5cGVzOworICAgICBzaG9ydAlpZHhSZXNvdXJjZXM7CisgICAgIHNob3J0CW5iUmVzb3VyY2VzOworICAgICBzaG9ydAlJRDsKKyAgICBzaG9ydCBmclJGaWQ7CisgICAgc2hvcnQgdG9SRmlkOworICAgIHNob3J0IGF0dHJzX29yaWc7CisgICAgc2hvcnQgYXR0cnNfY29weTsKKyAgICBzaG9ydCB0ZW1wOworCisgICAgLyogVE9ETzogSGFuZGxlIGVycm9yICovCisgICAgKHZvaWQpIEdldEZTU3BlY0Zyb21QYXRoIChmcm9tLCAmZnJGU1NwZWMpOworICAgICh2b2lkKSBHZXRGU1NwZWNGcm9tUGF0aCAodG8gICwgJnRvRlNTcGVjKTsKKworICAgIC8qIENvcHkgcmVzb3VyY2UgZm9yayAqLworICAgIHRlbXAgPSAwOworCisjaWYgMQorICAgICBmclJGaWQgPSBGU3BPcGVuUmVzRmlsZSAoJmZyRlNTcGVjLCBmc0N1clBlcm0pOworCisgICAgIGlmIChmclJGaWQgIT0gLTEpCisgICAgIHsKKwkgRlNwQ3JlYXRlUmVzRmlsZSgmdG9GU1NwZWMsICdURVhUJywgVU5LTk9XTl9DUkVBVE9SLCAwKTsKKwkgdG9SRmlkID0gRlNwT3BlblJlc0ZpbGUgKCZ0b0ZTU3BlYywgZnNSZFdyUGVybSk7CisKKwkgVXNlUmVzRmlsZSAoZnJSRmlkKTsKKworCSBuYlR5cGVzID0gQ291bnQxVHlwZXMoKTsKKworCSBmb3IgKGlkeFR5cGVzID0gMTsgaWR4VHlwZXMgPD0gbmJUeXBlczsgaWR4VHlwZXMrKykKKwkgeworCSAgIEdldDFJbmRUeXBlICgmdHlwZSwgaWR4VHlwZXMpOworCSAgIG5iUmVzb3VyY2VzID0gQ291bnQxUmVzb3VyY2VzKHR5cGUpOworCisJICAgZm9yIChpZHhSZXNvdXJjZXMgPSAxOyBpZHhSZXNvdXJjZXMgPD0gbmJSZXNvdXJjZXM7IGlkeFJlc291cmNlcysrKQorCSAgIHsKKwkgICAgIGF0dHJzX29yaWcgPSAwOyAvKiBpbiBjYXNlIEdldFJlcyBmYWlscyAqLworCSAgICAgYXR0cnNfY29weSA9IDA7IC8qIGluIGNhc2UgR2V0UmVzIGZhaWxzICovCisJICAgICByZXNvdXJjZSA9IEdldDFJbmRSZXNvdXJjZSh0eXBlLCBpZHhSZXNvdXJjZXMpOworCSAgICAgR2V0UmVzSW5mbyAocmVzb3VyY2UsICZJRCwgJnNpbmssIG5hbWUpOworCSAgICAgSExvY2sgKHJlc291cmNlKTsKKwkgICAgIGF0dHJzX29yaWcgPSBHZXRSZXNBdHRycyAocmVzb3VyY2UpOworCSAgICAgRGV0YWNoUmVzb3VyY2UgKHJlc291cmNlKTsKKworCisJICAgICBVc2VSZXNGaWxlICh0b1JGaWQpOworCSAgICAgQWRkUmVzb3VyY2UgKHJlc291cmNlLCB0eXBlLCBJRCwgbmFtZSk7CisJICAgICBhdHRyc19jb3B5ID0gR2V0UmVzQXR0cnMgKHJlc291cmNlKTsKKwkgICAgIGF0dHJzX2NvcHkgPSAoYXR0cnNfY29weSAmIDB4MikgfCAoYXR0cnNfb3JpZyAmIDB4RkQpOworCSAgICAgU2V0UmVzQXR0cnMgKHJlc291cmNlLCBhdHRyc19jb3B5KTsKKwkgICAgIFdyaXRlUmVzb3VyY2UgKHJlc291cmNlKTsKKwkgICAgIFVwZGF0ZVJlc0ZpbGUgKHRvUkZpZCk7CisKKwkgICAgIHRlbXAgPSBHZXRSZXNBdHRycyAocmVzb3VyY2UpOworCisJICAgICAvKlNldFJlc0F0dHJzIChyZXNvdXJjZSwgMCk7Ki8KKwkgICAgIEhVbmxvY2socmVzb3VyY2UpOworCSAgICAgUmVsZWFzZVJlc291cmNlIChyZXNvdXJjZSk7CisJICAgICBVc2VSZXNGaWxlIChmclJGaWQpOworCSAgICAgfQorCSB9CisJQ2xvc2VSZXNGaWxlICh0b1JGaWQpOworCUNsb3NlUmVzRmlsZSAoZnJSRmlkKTsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBDb3B5IEZpbmRlciBJbmZvICovCisgICAgKHZvaWQpIEZTcEdldEZJbmZvICgmZnJGU1NwZWMsICZmbmRySW5mbyk7CisgICAgKHZvaWQpIEZTcFNldEZJbmZvICgmdG9GU1NwZWMsICZmbmRySW5mbyk7CisKKyAgICByZXR1cm4gKHRlbXAgPT0gYXR0cnNfY29weSk7Cit9CisKKyAgICBpbnQKK21jaF9oYXNfcmVzb3VyY2VfZm9yayAoZmlsZSkKKyAgICBjaGFyX3UgKmZpbGU7Cit7CisgICAgRlNTcGVjICBmaWxlRlNTcGVjOworICAgIHNob3J0IGZpbGVSRmlkOworCisgICAgLyogVE9ETzogSGFuZGxlIGVycm9yICovCisgICAgKHZvaWQpIEdldEZTU3BlY0Zyb21QYXRoIChmaWxlLCAmZmlsZUZTU3BlYyk7CisgICAgZmlsZVJGaWQgPSBGU3BPcGVuUmVzRmlsZSAoJmZpbGVGU1NwZWMsIGZzQ3VyUGVybSk7CisgICAgaWYgKGZpbGVSRmlkICE9IC0xKQorCUNsb3NlUmVzRmlsZSAoZmlsZVJGaWQpOworCisgICAgcmV0dXJuIChmaWxlUkZpZCAhPSAtMSk7Cit9CisKKyAgICBpbnQKK21jaF9nZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK21jaF9zZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworfQorCisvKgorICogUm93cyBhbmQvb3IgQ29sdW1ucyBoYXMgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK21jaF9uZXdfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworfQorCisvKgorICogVGhvc2UgZnVuY3Rpb24gd2VyZSBzZXQgYXMgI2RlZmluZSBiZWZvcmUsIGJ1dCBpbiBvcmRlcgorICogdG8gYWxsb3cgYW4gZWFzaWVyIHVzIG9mIG9zX3VuaXguYyBmb3IgdGhlIE1hY09TIFggcG9ydCwKKyAqIHRoZXkgYXJlIGNoYW5nZSB0byBwcm9jZWR1cmUuIFRoZWMgb21waWxlIHdob3VsZCBvcHRpbWl6ZQorICogdGhlbSBvdXQuCisgKi8KKworICAgIGludAorbWNoX2Nhbl9yZXN0b3JlX3RpdGxlKCkKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworICAgIGludAorbWNoX2Nhbl9yZXN0b3JlX2ljb24oKQoreworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogSWYgdGhlIG1hY2hpbmUgaGFzIGpvYiBjb250cm9sLCB1c2UgaXQgdG8gc3VzcGVuZCB0aGUgcHJvZ3JhbSwKKyAqIG90aGVyd2lzZSBmYWtlIGl0IGJ5IHN0YXJ0aW5nIGEgbmV3IHNoZWxsLgorICovCisgICAgdm9pZAorbWNoX3N1c3BlbmQoKQoreworICAgIC8qIFRPRE86IGdldCBjYWxsZSBpbiAjaWZuZGVmIE5PX0NPTlNPTEUgKi8KKyAgICBndWlfbWNoX2ljb25pZnkoKTsKK307CisKZGlmZiAtLWdpdCBhL3NyYy9vc19tYWMuaCBiL3NyYy9vc19tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTkxNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX21hYy5oCkBAIC0wLDAgKzEsNDExIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKiBCZWZvcmUgSW5jbHVkaW5nIHRoZSBNYWNPUyBzcGVjaWZpYyBmaWxlcywKKyAqIGxldHMgc2V0IHRoZSBPUEFRVUVfVE9PTEJPWF9TVFJVQ1RTIHRvIDAgc28gd2UKKyAqIGNhbiBhY2Nlc3MgdGhlIGludGVybmFsIHN0cnVjdHVyZXMuCisgKiAoVW50aWwgZnVsbHkgQ2FyYm9uIGNvbXBsaWFudCkKKyAqIFRPRE86IENhbiB3ZSByZW1vdmUgdGhpcz8gKERhbnkpCisgKi8KKyNpZiAwCisjIGRlZmluZSBPUEFRVUVfVE9PTEJPWF9TVFJVQ1RTIDAKKyNlbmRpZgorCisvKgorICogTWFjaW50b3NoIG1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncy4KKyAqLworI2luY2x1ZGUgPFF1aWNrRHJhdy5oPgorI2luY2x1ZGUgPFRvb2xVdGlscy5oPgorI2luY2x1ZGUgPExvd01lbS5oPgorI2luY2x1ZGUgPFNjcmFwLmg+CisjaW5jbHVkZSA8U291bmQuaD4KKyNpbmNsdWRlIDxUZXh0VXRpbHMuaD4KKyNpbmNsdWRlIDxNZW1vcnkuaD4KKyNpbmNsdWRlIDxPU1V0aWxzLmg+CisjaW5jbHVkZSA8RmlsZXMuaD4KKyNpZmRlZiBGRUFUX01CWVRFCisjIGluY2x1ZGUgPFNjcmlwdC5oPgorI2VuZGlmCisKKy8qCisgKiBVbml4IGludGVyZmFjZQorICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAvKiBmb3IgQ29kZVdhcnJpb3IgKi8KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHV0c25hbWUuaD4KKyMgaW5jbHVkZSA8dW5peC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX0NDX18pIC8qIGZvciBQcm9qZWN0IEJ1aWxkZXIgYW5kIC4uLiAqLworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorLyogR2V0IHN0YXQuaCBvciBzb21ldGhpbmcgc2ltaWxhci4gQ29tbWVudDogSG93IGNvbWUgc29tZSBPUyBnZXQgaW4gaW4gdmltLmggKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pCisjIGluY2x1ZGUgPHN0YXQuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoX19BUFBMRV9DQ19fKQorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgLyogZm9yIEFwcGxlIE1QVyBDb21waWxlcnMgKi8KKy8qIFRoZXJlJ3Mgbm8gc3RhdC5oIGZvciBNUFc/ICovCisjIGlmZGVmIHBvd2VyYworIyAgcHJhZ21hIG9wdGlvbnMgYWxpZ249cG93ZXIKKyMgZW5kaWYKKyAgc3RydWN0IHN0YXQKKyAgeworICAgIFVJbnQzMiBzdF9tdGltZTsKKyAgICBVSW50MzIgc3RfbW9kZTsKKyAgICBVSW50MzIgc3Rfc2l6ZTsKKyAgfTsKKyMgaWZkZWYgcG93ZXJjCisjICBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorIyBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX0NDX18pIC8qICYmIGRlZmluZWQoSEFWRV9DVVJTRSkgKi8KKy8qIFRoZSBjdXJzZXMuaCBmcm9tIE1hY09TIFggcHJvdmlkZXMgYnkgZGVmYXVsdCBzb21lIEJBQ0tXQVJEIGNvbXBhdGliaWx0eQorICogZGVmaW5pdGlvbiB3aGljaCBjYW4gY2F1c2UgdXMgcHJvYmxlbSBsYXRlciBvbi4gU28gd2UgdW5kZWZpbmUgYSBmZXcgb2YgdGhlbS4gKi8KKyMgaW5jbHVkZSA8Y3Vyc2VzLmg+CisjIHVuZGVmIHJlZworIyB1bmRlZiBvc3BlZWQKKy8qIE9LIGRlZmluZWQgdG8gMCBpbiBNYWNPUyBYIDEwLjIgY3Vyc2VzISAgUmVtb3ZlIGl0LCB3ZSBkZWZpbmUgaXQgdG8gYmUgMS4gKi8KKyMgdW5kZWYgT0sKKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgTUFDT1NfWAorIyBpbmNsdWRlIDxkaXJlbnQuaD4KKyNlbmRpZgorCisvKgorICogSW5jb21wYXRpYmlsaXR5IGNoZWNrcworICovCisKKy8qIEdvdCBwcm9ibGVtIHRyeWluZyB0byB1c2Ugc2hhcmVkIGxpYnJhcnkgaW4gNjhrICovCisjaWYgIWRlZmluZWQoX19QT1dFUlBDX18pICYmIGRlZmluZWQoRkVBVF9QWVRIT04pCisjIHVuZGVmIEZFQVRfUFlUSE9OCisjIHdhcm5pbmcgQXV0by1kaXNhYmxpbmcgUHl0aG9uLiBOb3QgeWV0IHN1cHBvcnRlZCBpbiA2OGsuCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fUE9XRVJQQ19fKSAmJiAhZGVmaW5lZChfX3BwY19fKQorIyBpZiAhX19vcHRpb24oZW51bXNhbHdheXNpbnQpCisjICBlcnJvciAiWW91IG11c3QgY29tcGlsZSB3aXRoIGVudW1zIGFsd2F5cyBpbnQhIgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmICFkZWZpbmVkKF9fZm91cmJ5dGVpbnRzX18pCisjICBlcnJvciAiWW91IG11c3QgY29tcGlsZSB0aGUgcHJvamVjdCB3aXRoIDQtYnl0ZSBpbnRzIgorLyogTVBXIGludHMgYXJlIGFsd2F5cyA0IGJ5dGUgbG9uZyAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBNYWNPUyBzcGVjaWZpYyAjZGVmaW5lCisgKi8KKworLyogVGhpcyB3aWxsIGdvIGF3YXkgd2hlbiBDTURfS0VZIGZ1bGx5IHRlc3RlZCAqLworI2RlZmluZSBVU0VfQ01EX0tFWQorLyogT24gTWFjT1MgWCB1c2UgdGhlIC8gbm90IHRoZSA6ICovCisvKiBUT0RPOiBTaG91bGQgZmlsZSBzdWNoIGFzIH4vLnZpbXJjIHJlc2lkZSBpbnN0ZWFkIGluCisgKiAgICAgICB+L0xpYnJhcnkvVmltIG9yIH4vTGlicmFyeS9QcmVmZXJlbmNlcy9vcmcudmltLnZpbS8gPyAoRGFueSkKKyAqLworLyogV2hlbiBjb21waWxlZCB1bmRlciBNYWNPUyBYIChpbmNsdWRpbmcgQ0FSQk9OIHZlcnNpb24pCisgKiB3ZSB1c2UgdGhlIFVuaXggRmlsZSBwYXRoIHN0eWxlICovCisjaWYgZGVmaW5lZChUQVJHRVRfQVBJX01BQ19PU1gpICYmIFRBUkdFVF9BUElfTUFDX09TWAorIyB1bmRlZiBDT0xPTl9BU19QQVRIU0VQCisjIGRlZmluZSBVU0VfVU5JWEZJTEVOQU1FCisjZWxzZQorIyBkZWZpbmUgQ09MT05fQVNfUEFUSFNFUAorIyBkZWZpbmUgRE9OVF9BRERfUEFUSFNFUF9UT19ESVIKKyNlbmRpZgorCisKKy8qCisgKiBHZW5lcmljIFZpbSAjZGVmaW5lCisgKi8KKworI2RlZmluZSBGRUFUX1NPVVJDRV9GRlMKKyNkZWZpbmUgRkVBVF9TT1VSQ0VfRkZfTUFDCisKKyNkZWZpbmUgVVNFX0VYRV9OQU1FCQkgICAgLyogdG8gZmluZCAgJFZJTSAqLworI2RlZmluZSBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FICAgLyogaWdub3JlIGNhc2Ugd2hlbiBjb21wYXJpbmcgZmlsZSBuYW1lcyAqLworI2RlZmluZSBTUEFDRV9JTl9GSUxFTkFNRQorI2RlZmluZSBCUkVBS0NIRUNLX1NLSVAJICAgMzIJICAgIC8qIGNhbGwgbWNoX2JyZWFrY2hlY2soKSBlYWNoIHRpbWUsIGl0J3MKKwkJCQkgICAgICAgcXVpdGUgZmFzdC4gRGlkIEkgZm9yZ290IHRvIHVwZGF0ZSB0aGUgY29tbWVudCAqLworCisKKyN1bmRlZiAgVVNFX0ZOQU1FX0NBU0UJICAgIC8qIFNvIHRoYXQgOmUgb3NfTWFjLmMsIDp3LCBzYXZlIGJhY2sgdGhlIGZpbGUgYXMgb3NfbWFjLmMgKi8KKyNkZWZpbmUgQklOQVJZX0ZJTEVfSU8KKyNkZWZpbmUgRU9MX0RFRkFVTFQgRU9MX01BQworI2lmbmRlZiBNQUNPU19YX1VOSVgJICAgIC8qIEkgaG9wZSB0aGF0IHN3aXRjaGluZyB0aGVzZSB0d28gbGluZXMgKi8KKyMgZGVmaW5lIFVTRV9DUgkJICAgIC8qIGRvZXMgd2hhdCBJIHdhbnQgLS0gQk5GICovCisjIGRlZmluZSBOT19DT05TT0xFCQkvKiBkb24ndCBpbmNsdWRlIGNvbnNvbGUgbW9kZSAqLworI2VuZGlmCisjZGVmaW5lIEhBVkVfQVZBSUxfTUVNCisKKyNpZm5kZWYgSEFWRV9DT05GSUdfSAorLyogI2RlZmluZSBTWU5DX0RVUF9DTE9TRQkgICBzeW5jKCkgYSBmaWxlIHdpdGggZHVwKCkgYW5kIGNsb3NlKCkgKi8KKyMgZGVmaW5lIEhBVkVfU1RSSU5HX0gKKyMgZGVmaW5lIEhBVkVfU1RSQ1NQTgorIyBkZWZpbmUgSEFWRV9NRU1TRVQKKyMgZGVmaW5lIFVTRV9UTVBOQU0JCS8qIHVzZSB0bXBuYW0oKSBpbnN0ZWFkIG9mIG1rdGVtcCgpICovCisjIGRlZmluZSBIQVZFX0ZDTlRMX0gKKyMgZGVmaW5lIEhBVkVfUVNPUlQKKyMgZGVmaW5lIEhBVkVfU1RfTU9ERQkJLyogaGF2ZSBzdGF0LnN0X21vZGUgKi8KKworIyBpZiBkZWZpbmVkKF9fREFURV9fKSAmJiBkZWZpbmVkKF9fVElNRV9fKQorIyAgZGVmaW5lIEhBVkVfREFURV9USU1FCisjIGVuZGlmCisjIGRlZmluZSBIQVZFX1NUUkZUSU1FCisjZW5kaWYKKworCisvKgorICogTmFtZXMgZm9yIHRoZSBFWFJDLCBIRUxQIGFuZCB0ZW1wb3JhcnkgZmlsZXMuCisgKiBTb21lIG9mIHRoZXNlIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGUgbWFrZWZpbGUuCisgKi8KKworI2lmbmRlZiBTWVNfVklNUkNfRklMRQorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgU1lTX1ZJTVJDX0ZJTEUgIiRWSU06dmltcmMiCisjIGVsc2UKKyMgIGRlZmluZSBTWVNfVklNUkNfRklMRSAiJFZJTS92aW1yYyIKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTWVNfR1ZJTVJDX0ZJTEUKKyMgaWZkZWYgQ09MT05fQVNfUEFUSFNFUAorIyAgZGVmaW5lIFNZU19HVklNUkNfRklMRSAiJFZJTTpndmltcmMiCisjIGVsc2UKKyMgIGRlZmluZSBTWVNfR1ZJTVJDX0ZJTEUgIiRWSU0vZ3ZpbXJjIgorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNZU19NRU5VX0ZJTEUKKyMgaWZkZWYgQ09MT05fQVNfUEFUSFNFUAorIyAgZGVmaW5lIFNZU19NRU5VX0ZJTEUJIiRWSU1SVU5USU1FOm1lbnUudmltIgorIyBlbHNlCisjICBkZWZpbmUgU1lTX01FTlVfRklMRQkiJFZJTVJVTlRJTUUvbWVudS52aW0iCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU1lTX09QVFdJTl9GSUxFCisjIGlmZGVmIENPTE9OX0FTX1BBVEhTRVAKKyMgIGRlZmluZSBTWVNfT1BUV0lOX0ZJTEUgIiRWSU1SVU5USU1FOm9wdHdpbi52aW0iCisjIGVsc2UKKyMgIGRlZmluZSBTWVNfT1BUV0lOX0ZJTEUgIiRWSU1SVU5USU1FL29wdHdpbi52aW0iCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgRVZJTV9GSUxFCisjIGlmZGVmIENPTE9OX0FTX1BBVEhTRVAKKyMgIGRlZmluZSBFVklNX0ZJTEUJIiRWSU1SVU5USU1FOmV2aW0udmltIgorIyBlbHNlCisjICBkZWZpbmUgRVZJTV9GSUxFCSIkVklNUlVOVElNRS9ldmltLnZpbSIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZuZGVmIFVTUl9HVklNUkNfRklMRQorIyAgaWZkZWYgQ09MT05fQVNfUEFUSFNFUAorIyAgIGRlZmluZSBVU1JfR1ZJTVJDX0ZJTEUgIiRWSU06Lmd2aW1yYyIKKyMgIGVsc2UKKyMgICBkZWZpbmUgVVNSX0dWSU1SQ19GSUxFICJ+Ly5ndmltcmMiCisjICBlbmRpZgorIyBlbmRpZgorIyBpZm5kZWYgR1ZJTVJDX0ZJTEUKKyMgIGRlZmluZSBHVklNUkNfRklMRQkiX2d2aW1yYyIKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBVU1JfVklNUkNfRklMRQorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUJIiRWSU06LnZpbXJjIgorIyBlbHNlCisjICBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUJIn4vLnZpbXJjIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgVVNSX0VYUkNfRklMRQorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgVVNSX0VYUkNfRklMRQkiJFZJTTouZXhyYyIKKyMgZWxzZQorIyAgZGVmaW5lIFVTUl9FWFJDX0ZJTEUJIn4vLmV4cmMiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBWSU1SQ19GSUxFCisjIGRlZmluZSBWSU1SQ19GSUxFCSJfdmltcmMiCisjZW5kaWYKKworI2lmbmRlZiBFWFJDX0ZJTEUKKyMgZGVmaW5lIEVYUkNfRklMRQkiX2V4cmMiCisjZW5kaWYKKworI2lmbmRlZiBERkxUX0hFTFBGSUxFCisjIGlmZGVmIENPTE9OX0FTX1BBVEhTRVAKKyMgIGRlZmluZSBERkxUX0hFTFBGSUxFCSIkVklNUlVOVElNRTpkb2M6aGVscC50eHQiCisjIGVsc2UKKyMgIGRlZmluZSBERkxUX0hFTFBGSUxFCSIkVklNUlVOVElNRS9kb2MvaGVscC50eHQiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGSUxFVFlQRV9GSUxFCisjIGRlZmluZSBGSUxFVFlQRV9GSUxFCSJmaWxldHlwZS52aW0iCisjZW5kaWYKKyNpZm5kZWYgRlRQTFVHSU5fRklMRQorIyBkZWZpbmUgRlRQTFVHSU5fRklMRQkiZnRwbHVnaW4udmltIgorI2VuZGlmCisjaWZuZGVmIElOREVOVF9GSUxFCisjIGRlZmluZSBJTkRFTlRfRklMRQkiaW5kZW50LnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVE9GRl9GSUxFCisjIGRlZmluZSBGVE9GRl9GSUxFCSJmdG9mZi52aW0iCisjZW5kaWYKKyNpZm5kZWYgRlRQTFVHT0ZfRklMRQorIyBkZWZpbmUgRlRQTFVHT0ZfRklMRQkiZnRwbHVnb2YudmltIgorI2VuZGlmCisjaWZuZGVmIElORE9GRl9GSUxFCisjIGRlZmluZSBJTkRPRkZfRklMRQkiaW5kb2ZmLnZpbSIKKyNlbmRpZgorCisjaWZuZGVmIFNZTlRBWF9GTkFNRQorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgU1lOVEFYX0ZOQU1FCSIkVklNUlVOVElNRTpzeW50YXg6JXMudmltIgorIyBlbHNlCisjICBkZWZpbmUgU1lOVEFYX0ZOQU1FCSIkVklNUlVOVElNRS9zeW50YXgvJXMudmltIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKyMgaWZuZGVmIFZJTUlORk9fRklMRQorIyAgaWZkZWYgQ09MT05fQVNfUEFUSFNFUAorIyAgIGRlZmluZSBWSU1JTkZPX0ZJTEUJIiRWSU06dmltaW5mbyIKKyMgIGVsc2UKKyMgICBkZWZpbmUgVklNSU5GT19GSUxFCSJ+Ly52aW1pbmZvIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiBGRUFUX1ZJTUlORk8gKi8KKworI2lmbmRlZiBERkxUX0JESVIKKyMgZGVmaW5lIERGTFRfQkRJUgkiLiIJLyogZGVmYXVsdCBmb3IgJ2JhY2t1cGRpcicgKi8KKyNlbmRpZgorCisjaWZuZGVmIERGTFRfRElSCisjIGRlZmluZSBERkxUX0RJUgkiLiIJLyogZGVmYXVsdCBmb3IgJ2RpcmVjdG9yeScgKi8KKyNlbmRpZgorCisjaWZuZGVmIERGTFRfVkRJUgorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgREZMVF9WRElSCSIkVklNOnZpbWZpbGVzOnZpZXciCS8qIGRlZmF1bHQgZm9yICd2aWV3ZGlyJyAqLworIyBlbHNlCisjICBkZWZpbmUgREZMVF9WRElSCSIkVklNL3ZpbWZpbGVzL3ZpZXciCS8qIGRlZmF1bHQgZm9yICd2aWV3ZGlyJyAqLworIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgREZMVF9FUlJPUkZJTEUJCSJlcnJvcnMuZXJyIgorI2lmZGVmIENPTE9OX0FTX1BBVEhTRVAKKyMgZGVmaW5lIERGTFRfUlVOVElNRVBBVEgJIiRWSU06dmltZmlsZXMsJFZJTVJVTlRJTUUsJFZJTTp2aW1maWxlczphZnRlciIKKyNlbHNlCisjIGRlZmluZSBERkxUX1JVTlRJTUVQQVRICSJ+Ly52aW0sJFZJTS92aW1maWxlcywkVklNUlVOVElNRSwkVklNL3ZpbWZpbGVzL2FmdGVyLH4vLnZpbS9hZnRlciIKKyNlbmRpZgorCisvKgorICogTWFjaW50b3NoIGhhcyBwbGVudHkgb2YgbWVtb3J5LCB1c2UgbGFyZ2UgYnVmZmVycworICovCisjZGVmaW5lIENNREJVRkZTSVpFIDEwMjQJLyogc2l6ZSBvZiB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIGJ1ZmZlciAqLworCisjaWYgZGVmaW5lZChNQUNPU19YX1VOSVgpCisjIGRlZmluZSBNQVhQQVRITAkxMDI0CisjIGRlZmluZSBCQVNFTkFNRUxFTgkoTUFYTkFNTEVOIC0gNSkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZW5hbWUgKi8KKyNlbHNlCisjIGRlZmluZSBNQVhQQVRITAkyNTYJCS8qIExpbWl0ZWQgYnkgdGhlIFBhc2NhbCBTdHJpbmdzICovCisjIGRlZmluZSBCQVNFTkFNRUxFTgkoMzItNS0xKQkvKiBsZW5ndGggb2YgYmFzZSBvZiBmaWxlbmFtZSAqLworI2VuZGlmCisKKyNpZm5kZWYgREZMVF9NQVhNRU0KKyMgZGVmaW5lIERGTFRfTUFYTUVNCTUxMgkvKiB1c2UgdXAgdG8gIDUxMiBLYnl0ZSBmb3IgYnVmZmVyICovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX01BWE1FTVRPVAorIyBkZWZpbmUgREZMVF9NQVhNRU1UT1QJMjA0OAkvKiB1c2UgdXAgdG8gMjA0OCBLYnl0ZSBmb3IgVmltICovCisjZW5kaWYKKworI2RlZmluZSBXSUxEQ0hBUl9MSVNUICIqP1t7YCQiCisKKy8qKioqKioqKioqKioqKi8KKyNkZWZpbmUgbWNoX3JlbmFtZShzcmMsIGRzdCkgcmVuYW1lKHNyYywgZHN0KQorI2RlZmluZSBtY2hfcmVtb3ZlKHgpIHVubGluaygoY2hhciAqKSh4KSkKKyNpZm5kZWYgbWNoX2dldGVudgorIyBpZiBkZWZpbmVkKF9fTVJDX18pIHx8IGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIG1jaF9nZXRlbnYobmFtZSkgICgoY2hhcl91ICopZ2V0ZW52KChjaGFyICopKG5hbWUpKSkKKyMgIGRlZmluZSBtY2hfc2V0ZW52KG5hbWUsIHZhbCwgeCkgc2V0ZW52KChuYW1lKSwgKHZhbCkpCisjIGVsaWYgZGVmaW5lZChfX0FQUExFX0NDX18pCisjICBkZWZpbmUgbWNoX2dldGVudihuYW1lKSAgKChjaGFyX3UgKilnZXRlbnYoKGNoYXIgKikobmFtZSkpKQorLyojIGRlZmluZSBtY2hfc2V0ZW52KG5hbWUsIHZhbCwgeCkgc2V0ZW52KChuYW1lKSwgKHZhbCkpICovIC8qIE9ic29sZXRlZCBieSBEYW55IG9uIE9jdCAzMCwgMjAwMSAqLworIyAgZGVmaW5lIG1jaF9zZXRlbnYobmFtZSwgdmFsLCB4KSBzZXRlbnYobmFtZSwgdmFsLCB4KQorIyBlbHNlCisgIC8qIHZpbV9nZXRlbnYoKSBpcyBpbiBwdHkuYyAqLworIyAgZGVmaW5lIFVTRV9WSU1QVFlfR0VURU5WCisjICBkZWZpbmUgbWNoX2dldGVudih4KSB2aW1wdHlfZ2V0ZW52KHgpCisjICBkZWZpbmUgbWNoX3NldGVudihuYW1lLCB2YWwsIHgpIHNldGVudihuYW1lLCB2YWwsIHgpCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0NPTkZJR19ICisjIGlmZGVmIF9fQVBQTEVfQ0NfXworLyogQXNzdW1pbmcgY29tcGlsaW5nIGZvciBNYWNPUyBYICovCisvKiBUcnlpbmcgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHByZWJpbmRpbmcgKi8KKyMgIGRlZmluZSBIQVZFX1RHRVRFTlQKKyMgIGRlZmluZSBPU1BFRURfRVhURVJOCisjICBkZWZpbmUgVVBfQkNfUENfRVhURVJOCisjIGVuZGlmCisjZW5kaWYKKworLyogU29tZSAicHJlcCB3b3JrIiBkZWZpbml0aW9uIHRvIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgTWFjT1MgWAorICogdmVyc2lvbiB3aXRoIG9zX3VuaXgueCBpbnN0ZWFkIG9mIG9zX21hYy5jLiBCYXNlZCBvbiB0aGUgcmVzdWx0CisgKiBvZiAuL2NvbmZpZ3VyZSBmb3IgY29uc29sZSBNYWNPUyBYLgorICovCisKKyNpZmRlZiBNQUNPU19YX1VOSVgKKyMgZGVmaW5lIFNJR1BST1RPQVJHCShpbnQpCisjIGRlZmluZSBTSUdERUZBUkcocykJKHMpIGludCBzOworIyBkZWZpbmUgU0lHRFVNTVlBUkcJMAorIyB1bmRlZiAgSEFWRV9BVkFJTF9NRU0KKyMgaWZuZGVmIEhBVkVfQ09ORklHX0gKKyMgIGRlZmluZSBSRVRTSUdUWVBFIHZvaWQKKyMgIGRlZmluZSBTSUdSRVRVUk4gIHJldHVybgorLyojIGRlZmluZSBVU0VfU1lTVEVNICovICAvKiBPdXRwdXQgc2hpcCBkbyBkZWJ1Z2dlciA6KCwgYnV0IG90IGNvbXBpbGUgKi8KKyMgIGRlZmluZSBIQVZFX1NZU19XQUlUX0ggMSAvKiBBdHRlbXB0ICovCisjICBkZWZpbmUgSEFWRV9URVJNSU9TX0ggMQorIyAgZGVmaW5lIFNZU19TRUxFQ1RfV0lUSF9TWVNfVElNRSAxCisjICBkZWZpbmUgSEFWRV9TRUxFQ1QgMQorIyAgZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKKyMgIGRlZmluZSBIQVZFX1BVVEVOVgorIyAgZGVmaW5lIEhBVkVfU0VURU5WCisjICBkZWZpbmUgSEFWRV9SRU5BTUUKKyMgZW5kaWYKKyMgZGVmaW5lIG1jaF9jaGRpcihzKSBjaGRpcihzKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1BQ09TX1gpICYmICFkZWZpbmVkKEhBVkVfQ09ORklHX0gpCisjIGRlZmluZSBIQVZFX1BVVEVOVgorI2VuZGlmCisKKy8qIEEgTWFjIGNvbnN0YW50IGNhdXNpbmcgYmlnIHByb2JsZW0gdG8gc3ludGF4IGhpZ2hsaWdodGluZyAqLworI2RlZmluZSBVTktOT1dOX0NSRUFUT1IgJ1w/XD9cP1w/JworCisvKgorICogZm9yIGRlYnVnZ2luZworICovCisjaWZkZWYgTUFDT1NfWAorIyBpZmRlZiBfREVCVUcKKyMgIGRlZmluZSBUUkFDRQkJCVRyYWNlCisgICB2b2lkIFRyYWNlKGNoYXIgKmZtdCwgLi4uKTsKKyMgZWxzZQorIyAgZGVmaW5lIFRSQUNFCQkJMSA/ICh2b2lkKTAgOiBwcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUFDT1NfQ0xBU1NJQworIyAgZGVmaW5lIFRSQUNFCQkJMSA/IChpbnQpMCA6IHByaW50ZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3NfbWFjLnJzci5ocXggYi9zcmMvb3NfbWFjLnJzci5ocXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlOTk3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc19tYWMucnNyLmhxeApAQCAtMCwwICsxLDY1OSBAQAorKFRoaXMgZmlsZSBtdXN0IGJlIGNvbnZlcnRlZCB3aXRoIEJpbkhleCA0LjApCisKKzokJ0dlRDlwWUJALVpGUjBiQmAiNThlKiQ4UDAmNCElISEhISEhISEhSFVVayVgISEhISEiISEhIUdKWCEhKDgKKywhISElUmAhISRFZCxFaDBJR2MtYkMnYVgsUS0jISEhITklOUI5JTBBNTg4IiEycnIjaENURTkiMzNiamJGaCoKK01GTGUlRWZZZUVAOVpHJzlQRUwiJUJBNFBFUjghISgqY0ZRMDU4ZDklITNscnJycnIhISEhISEhISEhISEhISEKKyEhISEhISEhIVgzTjFhISEhISEhISElJy0hISEhISEhISEhITQhISEhJEVkLEVoMElHYy1iQ0FLUCxRLSMhISEKKyE5JTlCOSUwQTU4OCIhMnJycnJtISEhISEkTk4hISEhISRoaSEhJSkhISEhISEhISEhISEhISwjYDgxRGBYJiQKK1EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISc2WSEhJSEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEzISEhISEjYUA1OGRLISEhISE4QzU0OEIhIUohISEpISEhMyMiISEpIUpOUCQ2TC0hIUohISEpKSEhMyMKKyQhISkhISEhISEhRyI4JiItISEhISEhISEiZTQmQCYzISEzISEhISEoK0xTVStKISMhISEhIUohISEycnJycnIKK3JycnJycnJtISEhISEhISRtJCFgLSQhYC0kIWAybSEhISEhISFtLSQhYC1FIWAtJCFjcG0hISEhISEyYC0kIWAKKy0kIWAtJCFyMG0hISEhISRgYVgkJ2FYQ0pCLSQyJDBtISEhISFyIUItIkpCJyJKQi0kcnJybSEhISEyJCFCJyQKKydhWEUnYC0kIWNbISEhISRtJCdhWCJKQiciSmAtJCFsYCEhISFtLSQnYC1FJ2FYRSFgLSQxbSEhISEyYC0kIWAKKy0kIWAtJCFgLSRbISEhISRgYC0kIWAtJCFgLSQhYC1sYCEhISFyIWAtJCFgLSQhYC0kIWAxbSEhISEyJCFgLSQKKyFgLSQhYC0kIWNbISEhISRtJCFgLSQhYC0kIWAtJCFsYCEhISFtLSQhYC0kIWAtJCFgLSQxbSEhISEyYC1DSkIKKy0kIWAtJCFgLSRbISEhISRgYVhDSmAtJCFgLSQhYC1sYCEhISFyIWAtJCFgLSQhYC0kIWAxbSEhISEyJCFgLSQKKyFgLSQhYC0kIWNbISEhISRtJCFgLSQhYC0kIWAtJCFsYCEhISFtLSQhYC0kIWAtJCFgLSQxbSEhISEyYC0kIWAKKy0kIWAtJCFgLSRbISEhISRgYC0kIWAtJCFgLSQhYC1sYCEhISFyIWAtJCFgLSQhYC0kIWAxbSEhISEyJCFDWEUKKyFgLSQhYC0kIWNbISEhISRtIkpDWCQhYC0kIWAtJCFsYCEhISFtLSQhYC0kIWAtJCFgLSQxbSEhISEyYC0kIWAKKy0kIWAtJCFgLSRbISEhISRgYC0kIWAtJCFgLSQhYC1sYCEhISFyIWAtJCFgLSQhYC0kIWAxbSEhISEybFpsWmwKK1psWmxabFpsWmxbISEhISRycnJycnJycnJycnJycnJyYCEhISEhSiRycnJycnJycnJycnJycnJycnJycmBtISEKKyEhISEhISEhISEhISEhISEhbTIhISEhISEhISEhISEhISEhISEhMiRgISEhISEhISEhISEhISEhISEhJGBtISEKKyEhISEhISEhMnJycmAhISEhbTIhIUNKQiEhISEhbUopIyRgISEhMiRgIkpDSiEhISEkYiFKKSMkYCEhJGBtISEKKyEhISEhITIpMm1KKSMkYCEhbTIhISEhISEhISRyckdtSikjJGAhMiRgISEhISEhcnIhW3JycnJtIyRycnJtISEKKyEhISEhJGIhW20jIUopIyRmRXIhISEhISEkR2hiIUopIyFKKSNwUXJgISEhISEhITBoYiFKKSMhSikyQ1ttISEKKyEhISEhITBociFKKSMhSixmRXIhIUNKQiEhISEwaElycnJybUpwUXJgIkpDSiEhISEhMGhHaEdoR3JyQ1ttISEKKyEhISEhISEhIWhHaEdoR2hJcnIhISEhISEhISEhISEhISEhaEdoSSRgISEhISEhISEhISEhISEhISEhJGBtISEKKyEhISEhISEhISEhISdDUUNKbTIhISEhISEhISEhISEhISJRQ1FCMiRgISEhISEhISchISEhISFDUUNRJGBtISEKKyEhISEhISEhISEhISdDUUNKbTIhJ0InISFCJ0IhQ0pCISJRQ1FCMiRgIlEiSiEnISchJyJKQiFDUUNRJGBtISEKKyEiSkIhIkoiSkInISdDUUNKbTIhISEhQichIUIhQiciSiJRQ1FCMiRgIlEhJyJKISchJyJKQiFDUUNRJGBtIUMKK0ohJyEhIlEiSkInISdDUUNKbTIhISEhISEhISEhISEhISJRQ1FCMiRgISEhISEhISEhISEhISEhISEhJGBycnIKK3JycnJycnJycnJycnJycnJybSEhISFKISEkcnJycnJycnJycnJycnJycnIhISEyISEhISEhISEhISEhISEhISEKKzIhIW0hYy1jLWMtYy1jLWMtYy1jLWNbITIkLWxabFpsWmxabFpsWmxabC1sYCRgY1pycnJycnJycnJycnJycSQKKzFtIW0tbHJMMk1ycnJycnJycnJyYGNbITIkMXEyTDJycnJycnJycnJybS1sYCRgY1tycnJycnJycnJycnJyciQKKzFtIW0tbHJycnJycnJycnJycnJyYGNbITIkMXJycnJycnJycnJycnJybS1sYCRgY1tycnJycnJycnJycnJyciQKKzFtIW0tbHJMMk1ycnJycnJycnJyYGNbITIkMXEyTDJycnJycnJycnJybS1sYCRgY1tycnJycnJycnJycnJyciQKKzFtIW0tbHJycnJycnJycnJpTClNYGNbITIkMXJycnJyaXJycnJxKUwpbS1sYCRgY1tycnJycnJycnJyTClMMiQKKzFtIW0tbGlxMnEyTWlNaXJpTClNYGNbITIkMXJyTXJNaXEyTWlxKUwpbS1sYCRgY1tyaXEycTJNaXEyTClMMiQKKzFtIW0tbGlxKXJyTWlxMk1pTClNYGNbITIkMXJycnJycnJycnJycnJybS1sYCRgY1pycnJycnJycnJycnJyYCQKKzFtIW0tYCEhISEhISEhISEhISEhLWNbITIkLWMtYy1jLWMtYy1jLWMtYzFsYCEybFpsWmxabFpsWmxabFpsWmwKK1shISEyYzFjMWMxYzFjMWMxYzFjMW0hISFybWxYbFhsWGxYbFhsWGxYbFttISRyYzFjMWMxYzFjMWMxYzFjMWMKKzFtMnJtbFhsWGxYbFhsWGxYbFhsWGxbcnJycnJycnJycnJycnJycnJycnJyciRycnJycnJycnJycnJycnJycnIKK3JtISEhIUohISEhJHJycnJycnJycnJycnJtISEhISEhIXIhYC0kIWAtJCFgLSQybSEhISEhITIkIWAtJCFgLSQKKyFgLSRxbSEhISEhJG0kIWAtJCFgLSQhYC1ySG0hISEhIW0tJCFgLSQhYC0kIWAyY0htISEhITJgLSQhYC0kIWAKKy0kIWNycnJtIXJycnJycnJycnJycnJtJCFgLSQyJG1jLWMtYy1jLWMtYy1jbSQhYC0kcmNHaEdoR2hHaEdoR2gKK0dsbSQhYC1ybWhabFpsWmxabFpsWmxIbS0kIWAycjBscnJycnJycnEpTW1oW2QtJCFjcmNITWlxMkwyTXJMKXIKKzBsbWQtJCFybWhTcTJNaXEyTWlMMmNIckZgLSQycjBrKXJpcTJNaXEpTW1oW2MzYC0kcmNIcnJycnJycnJycnIKKzBscGMhYC1ybWhbcnJycnJycnJycmNIcjAkIWAycjBsaU1pcnJycnJycm1oW2gtJCFjcmNITWlNcnJycnJycnIKKzBsbWQtJCFybWhbcnJycnJycnJycmNIckZgLSQycjBscnJycnJycnJycm1oW2MzYC0kcmNIcSlxMnJycnJycnIKKzBscGMhYC1ybWhTcSlycnJycnJycmNIcjAkIWAycjBscnJycnJycnJycm1oW2gtJCFjcmNIYy1jLWMtYy1jLWMKKzBsbWQtJCFybWhHaEdoR2hHaEdoR2hIckZgLSQyJHFsWmxabFpsWmxabFpscGMzYC0kYCRycnJycnJycnJycnIKK3JoMCQhYC1tISEhJHBjRmgwY0ZoMGNGZC0kIWAyISEhIXIwY0ZoMGNGaDBjM2AtJCFjYCEhITJgLSQhYC0kIWAKKy0kIWAtJCFtISEhJGBgLSQhYC0kIWAtJCFgLSQyISEhIXJycnJycnJycnJycnJycnJyYCEhIiEhISEhISFycnIKK3JycnJycnJycnJycnJycnJycnJycnJybSEhISEhISEhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2Vycm0hISEhISEhISEhISEhITJyZXBJQWVwSUFlcEhjZXBJQWVwSUFlcElBcnFbbSEhISEhISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJcmhxW20hISEhISEhISEhISRycElBWHBJQWVsMkFYcEhjWHBIY2VwSUEKK2VyckFocVttISEhISEhISEhITJyZXBIY2VwSUFYcEhjZWwyQVhwSGNlcElBcnJycnJycm0hISEhISEhISFyckEKK2VwSGNlbDJBZWwyQVhwSGNlbDJBZXBJQWVwSUFscmAhISEhISEhISRycElBZWwyQVhwSUFYcEhjZWwyQVhwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVsMkFlcEhjZWwyQVhwSGNlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSGNYcEhjZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBWHBIY1hwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSGNYcEhjZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBWHBIY1hwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyckEKK2VwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFscmAhISEhISEhISRycElBZXBJQWVwSUFlcElBZXBJQWVwSUEKK2VwSUFlcElbciEhISEhISEhITJyZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVxcm0hISEhISEhISFyclsKK2xxcltscXJbbHFyW2xxcltscXJbbHFyW2xxcltscmAhISEhISEhISRycnJycnJycnJycnJycnJycnJycnJycnIKK3JycnJycnJyciEhISEhISElITJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybSFyZEsKKyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSylyYCRyNSVLKTUlSyk1JUspNSVLKTUlSyk1JUsKKyk1JUspNSVLKTUlSyk1JU1yITJwKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUybSFyZEsKKyk1JUspNSVLKTUlSyk1JUspNSVNcnJycnJycnApNSVLKTUlSylyYCRyNSVLKWwxYSlsJUspNSVLKTUlSylyYEoKKykjIUopIzJwKTUlSyk1JU1yITJwKTUxYSlsMWEpNSVLKTUlSyk1Mm0pIyFKKSMhSikjMnApNSVLKTUybSFyZEsKKyk1JUspNSVLKTUlSyk1JU1yIyFNcnJgSikjIUopIzJwKTUlSylyYCRyNSVLKTUlSyk1JUspNSVLKTUycnJyaHAKK3JyYEopIyFKKSMycCk1JU1yITJwKTUlSyk1JUspNSVLKXJycnIjIU1ycnJycnJycnJyYEopIzJycnJycnJyZEsKKyk1JUspNSVLKTUlSyk1Mm0pIyFNcnJgSikjIUopIyFKKSMyclhsMnJyNSVLKTUlSyk1JUspNShwcklybSkjIUoKKykjIUopIyFKKSMhSilycWNYcnJwKTUlSyk1JUspNSVLKTUlS3JJcm0pIyFKKSMhSikjIUopIyFNcmwxY3JyZEsKKyk1JUspNSVLKTUlSyk1JUtySXJyciMhSikjIUopIyFKKSMyclhsMnJyNSVLKWwxYSlsJUspNSVLKTUlS3JJaHIKK3JycnJycnJycnJgSilycWNYcnJwKTUxYSlsMWEpNSVLKTUlSyk1JUtySWhwcklocHJJaHBycnJycmwxY3JyZEsKKyk1JUspNSVLKTUlSyk1JUspNSVLKUlocHJJaHBySWhwcklocnJycnJyNSVLKTUlSyk1JUspNSVLKTUlSyk1JUsKKyk1JUspNSVLKUlocHJJaHJyITJwKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUybSFyZEsKKyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JU1YbDFjWGwxYSlyYCRyNSVLKTUlSyk1JUspNSVLKTUlSyk1JUsKKyk1JUspNTFjWGwxY1hsJU1yITJwKTUlSyk1JUspNSVLKTUlTVg1JUspNSVLKTUlSylsMWNYbDFjWDUybSFyZEsKKyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JU1YbDFjWGwxYSlyYCRyNSVNWGwlTVg1JUspbCVNWGwlSylsMWEKKylsJUspNTFjWGwxY1hsJU1yITJwKTUxY1g1MWEpNSVNWDUlTVg1JU1YNTFhKWwlSylsMWNYbDFjWDUybSFyZEsKKyk1JUspNTFhKWwlSyk1MWEpNTFhKWwlTVg1JU1YbDFjWGwxYSlyYCRyNSVLKTUlSylsJU1YNSVLKWwlSylsJU0KK1g1MWEpNTFjWGwxY1hsJU1yITJwKTUxY1g1JU1YNTFhKTUlTVg1JU1YNTFhKWwlSylsMWNYbDFjWDUybSFyZEsKKylsMWEpNSVNWDUlSyk1MWNYNTFhKWwlTVg1JU1YbDFjWGwxYSlyYCRyNSVLKTUlSyk1JUspNSVLKTUlSyk1JUsKKyk1JUspNTFjWGwxY1hsJU1yITJwKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUlSyk1JUspNSVLKTUybSFycnIKK3JycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyYCEhISEzISEhISFycnJycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycnJtISEhISEhMnJlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSW0KKyEhISRycElBaXEyTWlxMk1pcTJNaXEyTWlxMk1pcTJNaXEyTWlxMk1pcjJtISEycmVxMk1tcjJjbXIyY21yMmMKK21yMmNtcjJjbXIyY21yMmNtcTJNbXJgISFyckFpcjJjcnJycnJycnJycnJycnJycnJycnJycnJycnJyY2VxMmMKK3IhISRycElNbXJyck1pcnJNcnJycnJycnJycnJycnJycnJycnJyckFpcjJtISEycmVxMmNyaXJyTWlycnJycnIKK3JycnJycnJycnJycnJycnJycElNbXJgISFyckFpcjJycnJycnJycnJycnJycnJycnJycnJycnJycnJycmVxMmMKK3IhISRycElNbXJycnJycnJycnJycnJycnJycnJycnJycnJycnJyckFpcjJtISEycmVxMmNycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycElNbXJgISFyckFpcjJycnJycnJycnJycnJycnJycnJycnJycnJycnJycmVxMmMKK3IhISRycElNbXJyck1pcnJNcnJycnJycnJycnJycnJycnJycnJyckFpcjJtISEycmVxMmNyaXJyTWlycnJycnIKK3JycnJycnJycnJycnJycnJycElNbXJgISFyckFpcjJycnJycnJycnJycnJycnJycnJycnJycnJycnJycmVxMmMKK3IhISRycElNbXJycnJycnJycnJycnJycnJycnJycnEyTWlxMk1yckFpcjJtISEycmVxMmNycnJycnJycnJycTIKK3JycnJycnJycmlxMk1pcTJycElNbXJgISFyckFpcjJycnJycnJycnJycnJycnJycnJycnJNaXEyTWlycmVxMmMKK3IhISRycElNbXJxMnJpcnJyaXJyTXJxMk1ycTJycnEyTWlxMk1yckFpcjJtISEycmVxMmNycnJyTXJyck1ycTIKK3JpcnJNcnEycmlxMk1pcTJycElNbXJgISFyckFpcjJycnJxMnJpcnJyaXJyTXJxMnJpcnJNaXEyTWlycmVxMmMKK3IhISRycElNbXJxMnJpcTJycnJyTXJxMnJpcnJNcnEyTWlxMk1yckFpcjJtISEycmVxMmNycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycElNbXJgISFyckFpcjJjcnJycnJycnJycnJycnJycnJycnJycnJycnJyQWVxMmMKK3IhISRycElNaXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSU1pcjJtISEycmVxMk1pcTJNaXEyTWlxMk0KK2lxMk1pcTJNaXEyTWlxMk1pcTJjbXJgISEhMnJtcjJjbXIyY21yMmNtcjJjbXIyY21yMmNtcjJjbXIyY21yMm0KKyEhISEhITJyaHByW2hwcltocHJbaHByW2hwcltocHJbaHByW2hwcltyISEhISEhJHJycklscXJJbHFySWxxckkKK2xxcklscXJJbHFySWxxcklscXJyciEhISFycnJocHJbaHByW2hwcltocHJbaHByW2hwcltocHJbaHByW2hwclsKK3IhMnJycnJJbHFySWxxcklscXJJbHFySWxxcklscXJJbHFySWxxcklscXJycnJycnJycnJycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycnJycnJybSFycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnIKK3IhISEhIiEhISEhISEhISRycnJycnJycnJycnJycnJycnJycnJycnJycnJtISEhISEhISEhISEhISEycmZwW0UKK2ZwW0VmcFtFZnBbRWZwW0VmcFtFZnJybSEhISEhISEhISEhISFyckVmcFtFZnBbRWZwW0VmcFtFZnBbRWZwW0UKK3JyMm0hISEhISEhISEhISRycFtFZnBbRWZwW0VmcFtFZnBbRWZwW0VmcFtyanIybSEhISEhISEhISEycmZwW0UKK2ZwW0VmcFtFZnBbRWZwW0VmcFtFZnJyTWpyMm0hISEhISEhISFyckVmcFtFZnBbRWZwW0VmcFtFZnBbRWZwW0UKK3JycnJycnJtISEycnJycnJycnJycnJycnJycnJycnJycnJycnJwW0VmcFtFZnBbRWZyYCRyK2JYVitiWFYrYlgKK1YrYlhWK2JYVitiWFYrYltycFtFZnBbRWZwW0VycmJbanFJUmpxSVJqcUlSanFJUmpxSVJqcUlSanFJY3JwW0UKK2ZwW0VmcFtycityUm1yMmNtcjJjbXIyY21yMmNtcjJjbXIyY2pyMnJmcFtFZnBbRWZycm1WcUljcnJycnJycnIKK3JycnJycnJyTWlxMnIrclJtcnJNZnBbRWZwW0VycmJbanIxMnJpcnJNcnEyTXJxMnJycTJNaXJtVnFJY3JxMk0KK2ZwW0VmcFtycityUm1pcnJNcnEycmlyck1ycTJyaXEyTXJiW2pyMnJpcTJFZnBbRWZycm1WcUljTWlycnJpcnIKK01ycTJyaXJyTWlxMnIrclJtcnJNaXBbRWZwW0VycmJbanIycnJycnJycnJycnJycnJycnJycnJtVnFJY3JxMk0KK2ZwW0VmcFtycityUm1ycnJycnJycnJycnJycnJycnJycnJiW2pyMnJpcTJFZnBbRWZycm1WcUljcmlxMnJpcnIKK3JycnJycnJycnJycnIrclJtcnJNaXBbRWZwW0VycmJbanIxMnJpcTJycnJycnJycnJycnJycnJtVnFJY3JxMk0KK2ZwW0VmcFtycityUm1ycnJycnJycnJycnJycnJycnJycnJiW2pyMnJpcTJFZnBbRWZycm1WcUljcnJycnJycnIKK3JycnJycnJycnJycnIrclJtcnJNaXBbRWZwW0VycmJbanIyck1pcnJNcnJycnJycnJycnJycnJtVnFJY3JxMk0KK2ZwW0VmcFtycityUm1pcnJNaXJycnJycnJycnJycnJycnJiW2pyMnJpcTJFZnBbRWZycm1WcUljcnJycnJycnIKK3JycnJycnJycnJycnIrclJtcnJNaXBbRWZwW0VycmJbanIjWFYrYlhWK2JYVitiWFYrYlhWK2JYVnFJY3JxMk0KK2ZwW0VmcFtycityUmpxSVJqcUlSanFJUmpxSVJqcUlSanFJUmpyMnJpcTJFZnBbRWZyYCRycjJjbXIyY21yMmMKK21yMmNtcjJjbXIyY21yMmNycTJNaXBbRWZwW0VyISEkcnJycnJycnJycnJycnJycnJycnJycnJycnJyTWlxMk0KK2ZwW0VmcFttISEhISEhISRycTJNaXEyTWlxMk1pcTJNaXEyTWlxMk1pcFtFZnBbRWZyYCEhISEhISEycmlxMk0KK2lxMk1pcTJNaXEyTWlxMk1pcTJFZnBbRWZwW0VyISEhISEhISFyckVmcFtFZnBbRWZwW0VmcFtFZnBbRWZwW0UKK2ZwW0VmcFttISEhISEhISRycFtFZnBbRWZwW0VmcFtFZnBbRWZwW0VmcFtFZnBbRWZyYCEhISEhISEycnJycnIKK3JycnJycnJycnJycnJycnJycnJycnJycnJycnJyISEhIiEycnJycmshISEhI0ohISEhUyEhISErISEoaSNNMyMKKyIhVEIiISkrISFRIiNKITEzISMrISgybUlKITRKJGkhIyEhcSEhMyEySiEkISRpZCEybXFAISEhckohISEkaSEKKyEhISshISEhI0ohISJxUyEhIUlVISIhKGtKISEicVRTWGRJVUQqK1JrSjg1VHFTJiVVSVVDNCtSa1EpRFRxUyEKKyEhSVUhISEhI3JycnJyW3JycnJscnJycnFycnJycltycnJybHJycnJxcnJycnJbcnJycmxycnJycXJycnJyW3IKK3JycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJbcnJycmxycnJycXJycnJyW3IKK3JycmxycnJycXJycnJyW3JycnJscnJycnFycnJycltycnJybHJycnJxcnJycnJbcnJycmxycnJycSEhISIhIXIKK3JyYCEpISEnISMhMyIzIUohITUhKiZEJTMjNDk0cSFMUDghSilUOSEpIyU5MyMhSiEhIUopISEhKSMhISEjIUoKKyEhIUopISEhKSMhISEjIU0zISFKKkIhISkjISEhIyFKISEhSikhISEpIyEhISMhSiEhIUopISEhKSMhISEjIU0KKzMhIUoqQiEhKSMhISEjIUohISFKKSEhISkjISEhIyFKISEhSjJycnJpJHJyciEhcnJyaSEycnJyISRycnJpIXIKK3JyciEycnJyaSRycnJxIXJycnJKMnJycmkkcnJycSFycnJySjJycnJpJHJycnEhcnJyckoycnJyaSRycnJxIXIKK3JyckoycnJyaSRycnJxIXJycnJKMnJycmkkcnJycSFycnJySjJycnJpJHJycnEhcnJyckoycnJyaSRycnJxIXIKK3JyckoycnJyaSRycnJxIXJycnJKISEhJSEocnJycSMhISEhNCEhISEjNHJycmlOSiEhIiopISEhNTVEISElTlYKKyEhIiopISEhNTUhISElTkohISIqKlMhITU1WCEhJU5KISEiKikhIUk1NSEzKGROSiEicCorUERJNTUqOUFkTkwKK1A5cCorYTlJNTUhISElTkohISIqKHJyckwzISEhIU0hISEhYElycnJpMFlZWVsnNTU1NUVZWVlZW3JycnJyaHIKK3JycmlJcnJyaTJycnJyKHJycnJqcnJycnFJcnJyclJycnJyanJycnJxSXJycnJScnJycmpycnJycUlycnJyUnIKK3JycmpycnJycUlycnJyUnJycnJqcnJycnFJcnJyclJycnJyanJycnJxSXJycnJScnJycmpycnJycUlycnJyUnIKK3JycmpycnJycTJycnJyInJycnJKcnJycm1JcnJycltycnJycnJycnJySXJycnJKISEhMyEkcnJySiFKISEtISkKKyEhI0ojISEhTiFKISEpSikhISRtcnJyYCIzISEjIUNycnEzJ0ohITgiUyEkUCFEVWRqMydVVVo4IlYrVlAhRCEKKyEiMydKISE4IlRTISYhRFghIjMnSiEhOCJTISEmIUREISIzJ1YhITgiUyEhJiFEISEiMydJcnJOIjMhISMhNnIKK3JyISUjISEhIiFKISEhMykhISElIyEhISIhcnJycmAycnJxISRycnJgIXJycnEhMnJycmAkcnJycSFycnJyY3IKK3JycnBycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycHJycnJyMnJycnJgMnJycm0kcnJyciFycnJyYDIKK3Jycm0kcnJyciEhISEzMnJySiEnOCFESiJKISchIUMzIlUhJyEhQiMiSiEnVVhCVWpUK1EhIUlycnJycnJycnIKK3JycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybSEhISIhSXIiISclUzg5ImohIU4hIzVKKjghTiEKKyMzISo5QlA5YjlBKio4TiEjSXJqcm0ocmlJcmFyclJycUlyanJyUnJxSXJqcnJScnFJcmpyclJycUlyanJySiEKKyEhJSJyclMhIlJyUVAiRFMmUyFAVVtEVXBUK2ZKIkNyakohJnJyTTlARFVZcnJocnFycnJycnJycnJycnJycnIKK3JycnJycnJycnJycnJyaHJxMnJqcnJocnIhISEhMyJyaSUhYDMjUnJySiFRSWJEIVRUVVFWK0QhVFMjUUliQiEKKypJciUzITRycihySklyInJxSXJycnJycnJycnJycnJycnJycnJycnJycnJwcnJhcnIocm0hISEjIXJycnJycnIKK3JycnJtYy1jLWMtYy1jcmMyY21jLWMtYzJyMmNtYy1jLWMtcm1jLWMtYy1jLWNyYy1jLWMtYy1jMnItcjJjLWMKKy1jLXJtcjJjLWMtYy1jcmMtYy1jLWMtYzJyLWMtYzJjLWMtcm1jLWMtYy1jLWNyY21yMmNtcm1jMnItY21yMmMKK3JyLXJtci1yLXIyY21jcmMtYy1jLWMtYzJycnJycnJycnJybSEhISMhJHJycnJycnIhISEyJCFgLSQhcmAhIXIKKyFCJyQhY21tISRgQickIWAycnIhMmAtJCFgLSQxbSFtLSQhYC0kIWxgJG0iSkItJCFjWyEyIkpCLSQhYDFtIXIKKyFgLSQhYC1sYCRgYC0kIWAtJFshMmFYRSdhUSQxbSFtJyJKQidDSmxgJG0iSmFYQ1FjWyEyJCFgLSQhYDFtIXIKK1psWmxabFpsYCRycnJycnJycnIhISEhIyEkcnJycnJycnJyJG1jLWMtYy1jLWNyY1psWmxabFpsW3IxcTJNcnIKK3JyMXJtazJNcnJycm1scmNbcnJycnJyY1tyMU1pcTJMKXIxcm1rMk1pcSlNbWxyY1tNck1pcTJjW3IxcnJycnIKK3JyMXJtbC1jLWMtYy1scmxabFpsWmxabFskcnJycnJycnJyISFyWGwxY1hsMW0hclhsMWNYbDFjciRycnJycnIKK3Jycm0hISEjISEhcnJycnJybSEhISRgYC0kIWNyISEhMmAtJCFgMmhgJHJycnJycnJycnJtYy1jLWMtY2BjcmMKK0doR2hHaFtgMnIwcnJycnJIbS1ybWhyTDJNcGxtJHJjSU1pTXJoWyQycjBycnJyckhyIXJtaHJycnJwbGBjcmMKK0doR2hHaFtgMnIxbFpsWmxabS1tMnJycnJycm0tJGAhMmAtJCFgLSQyISFycnJycnJycm0hISElIXJycnJycnIKK3JycnJycnJycnJycnJycm1VK0xTVStMU1UrTFNVK0xTVStbcnIrTFZyK1ttVStMU1UrTFNVK0xWcnJiVnIrW20KK1UrTFNVK0xTVStMU1Vycm1VK0xTVStMU1UrTFNVK0xTVStbcnIrTFNVK0xTVStMU1UrTFNVK0xWcnJiU1VyYlYKK3IrTFNVK0xTVStMU1Vycm1VcmJWcitMU1UrTFNVK0xTVStbcnIrTFNVK0xTVStMU1UrTFNVK0xWcnJiU1UrTFMKK1UrTFZyK0xTVStMU1Vycm1VK0xTVStMU1UrTFNVK0xTVStbcnIrW21VcmJWcitbbVVycm1VK0xWcnJiU1UrW20KK1VyYlZyK1tycnJiU1Vycm1VcmJTVXJiU1VyYlZyK1ttVStbcnIrTFNVK0xTVStMU1UrTFNVK0xWcnJycnJycnIKK3JycnJycnJycnJycnJyYCEhITMhIXJycnJycnJycnJycnJybSEhISEhITJyZXBJQWVwSUFlcElBcnJgISEhISQKK3JwSUFYcEhjZXBJQWVycklyISEhIXJyQVhwSGNlcElBZXBJcnJycm0hITJyZXBJQWVwSUFlcElBZXBJW3IhISQKK3JwSUFlcElBZXBJQWVwSUFscmAhIXJyQWVsMkFYcElBZXBJQWVxcm0hITJyZWwyQVhwSUFlcElBZXBJW3IhISQKK3JwSUFlcElBZXBJQWVwSUFscmAhIXJyQWVwSUFlcElBZXBJQWVxcm0hITJyZWwyQVhwSGNlbDFjZXBJW3IhISQKK3JwSGNlbDJBWHBIY1hsMkFscmAhIXJyQWVsMkFlbDJBWGwxY2Vxcm0hITJyZXBJQWVwSUFlcElBZXBJW3IhISQKK3JxcltscXJbbHFyW2xxcltscmAhIXJycnJycnJycnJycnJycnJycm0hISEhIiEhJHJycnJycnJycnJycnJycnIKK3JyYCRycFtFZnBbRWZwW0VmcFtFZnBbRXJyckVscXJbbHFyW2xxcltscXJbbHJycmZxcnJNcnEycnJycnJycnIKK2ZxcnJycFtbTXJxMnJycnJycnJycnBbW3JyckVscnJycnJycnJycnJycnJFbHJycmZxcTJyaXJyTXJxMk1pcnIKK2ZxcnJycFtbTXJxMnJpcnJNaXEycnBbW3JyckVscnEycnJxMnJpcnJNcnJFbHJycmZxcnJycnJycnJycnJycnIKK2ZxcnJycFtbZnBbRWZwW0VmcFtFZnBbW3JycltscXJbbHFyW2xxcltscXJbbHJgJHJycnJycnJycnJycnJycnIKK3JyYCEhITJybHBbW2ZxckVscFtbZnFybSEhMnJscFtbZnFyRWxwW1tmcXJFcnJgJHJycnJycnJycnJycnJycnIKK3Jycm0hISElISEhISFycnJycnJycnJycnJyYCEhISEhISEybVYrYlhWK2JYVitycnIhISEhISEkcitiWFYrYlgKK1YrYltycXJtISEycnJycnJycnJycnJycnJycnJycnJtVitiWFYrYlhWK2JYVitybVYrcnJyK3JWa3FbVmtxW1YKK2txW2NyK2JbcnJiW2tycnJycnJycnJyVm1yYlhWcnJtVnFbcnJpcTJyaXJya3IybVYrcnJyK3JWcmlyck1pcnIKK3JxW2NyK2JbcnJiW2tycnJycnJycnJyVm1yYlhWcnJtVnFbcnJycnJycnJya3IybVYrcnJyK3JWa3FbVmtxW1YKK2txW2NyK2JbcnJiW21yMmNtcjJjbXIyY21yYlhWcmAkcnJycnJycnJycnJycnJiWFYrcm0hISEkcitiWFYrYlgKK1YrYlhWK2JbciEhISFycnJycnJycnJycnJycnJycmAhISEiU0M5UVBZKSQ4Wi1iYEopJWVLQmRwNikoKlBFJzkKK0tGZjhKLUohISEhYCErISFTITQzIlNgIyE5OTghISEhTCEhJSEhISEhIS1OIikzJEchOVglIU5wLCEhISEhISEKKzghIzMhWWAmQ0whKkgtISEhISEscnJgISEhIkIhISEhISEhISFFMyFEISklITkhMyczUjlkRydwWiEhISElSiEKKyEhISEhISEhMCEiRiEsMyFoUyEpIUohISEhImAhISEhISEhISEkMyIxISdCIkNTSiw4aDRLRydQTSkmNFBIKDMKKyEhISEhJjMhUyEjSiIlISdSISEhIiEhJSEhISEhISEjISEhISEhIjghNDMiLSEnUyFHYCEmITMhIiEhISEhISEKKyFKMyEhISEhOSEqOCFKISVQITFgISIzJSEhMyEhISEhISEpKSEhISEhJjMhWiEjQiFEMyJkISE4IiEhJSEhISEKKyEhISMkISEhISEiOCExMyFtIS1CIlozISEhMyEiISEhISEhISFLISEhISElISEhJyEhISEjMyEhSXJEcmkpITIKKzMiIyEibSEpMyFySicjIXJtI0pKKHEiMykkciFTIyFJSjghSjJgKyEpImkmYCchbSJxI0onIXJhQiQhW3FaISEKK0FybEopLHJwQiEmcnErISRyciJKIjJySikhNnJgIyEycnEhSicpTDMpIWMhIyMiamMwIUpaQ1EzKUlRQ04jLGMKKy1iITYtNi0zJEtyLWkhITIhISEhIkohISEhQiEhISEyISEicnJsckpycnJybTJycnJyS3JycnJpMnJycnEkcnIKK3JyIXJycnJKMnJycmAkcnJyaSFycnJyIUlycnJpMnJycnIocnJycmxycnJycnJycnJyaHJycnJpcnJycm0ocnIKK3JxIXJycnIhMnJycmkkcnJyciFycnJyaTJycnJtJHJycnIhcnJycmAycnJyaSJtcnJyITEobWNKISFtISEhIScKKyEhISEhIUohISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEhMkwyISEhISEhISEhISEycnJycnJycSpRMiQKK3JycnJybSEhIW0hISEhISEhcUNRMiEhISEhIW0hITIkLWMtYy1jLXFDUmBjLWMtYy1tISEyYy1jLWMtY0lRQ1IKK21jLWMtY0khISEyaC1jLWNHcUNRQ1JwYy1jMGhgISEkYGMtYy1oalFDUUkkLWMtaEkhISEhbS1jLWMwcUNRQ20KKyFjLWNHbSEhISEyJC1jLWNJUUNSYCQtYzBoYCEhISEkYGMtYy1oalFJIS1jLWhJISEhISEhbS1jLWMwcUNtIWMKKy1jR3BbISEhISRyJC1jLWNJUmAkLWMwaGpQWyEhITJNYGMtYy1ociEtYy1oSVFDUFshIXEqbS1jLWMwbSFjLWMKK0dxQ1FDUFskaVFJJC1jLWMzJC1jMGhqUUNRQ1BbcSpSYGMtYy1kLWMtaElRQ1FDUUNFYHEqbS1jLWMwYy1jR3EKK0NRQ1FDUFshIXEyJC1jLWMtYzJyalFDUUNRQG0hISFyYGMtYy1jLXItcUNRQ1FDRWAhISEhbS1jLWMtYzJjMlEKK0NRQ1BbISEhISEyJC1jLWMtaHJxSXJqcnJyciEhISEkYGMtYy1jSWMtci1jbWMyYzIhISEhbS1jLWMwaHJjMnIKKy1jLWMtYzIhISEyJC1jLWhJci1ycmMnRS1ybW0hISEkYGMtY0dxSWMyci1FbWNyYzIhISEhbS1jMGhqUm1jcmMKKzJyLXJtY2AhISEyJC1oSXFJYzJyLXJtY3JjMiEhISEhMmNHbSFybWMyYzJyLXJtYzIhISEhITJyYCEhcnJwW20KKyFyYCRybSEhISEhISEhISEhcFFtISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISUhcVslKCMzLS0KK0thTDEtKTRgTDJRIXJpMmpLSSMoKylOJVI5NXA5J1A4IlVNcW1JcmpycmNycTJyYHJyKHJxcnJycnJScm0ycmkKK3JyY3JyMnJtRXJgJ1UhISEhSiEkcnJyTWBycm0hJGAhISRqbSEhMiEyYy1jMHJtYy1oYCRtYzBxSSQtaGAhMmMKKy1ociQtaGAhIXItY0kkLWhyISFNbWMwJC1oalJgTEljLSQtaGpRQ3Jqci1jLXJqUUNCIXJtYy1yMnJqbSEhMmMKKy1jcnItcjIhIXItY21jbWMtY2AkbWNJcjJjbXIyITJjSVJtcjJjbW0hJHIkbWNtcjJjYCEhISFyYG0yJGAhISEKKyUhISEhISEkcnJycnJycnJycnJycnJycnJycnJycnJyciEhISEhISEhISEhISEhISEhMnJlcElBZXBJQWVwSUEKK2VwSUFlcElBZXBJcnIhISEhISEhISEhISEhISEhcnJBZXBJQWVwSUFlcElBZXBJQWVwSUFlcmJbciEhISEhISEKKyEhISEhISEkcnBJQWVwSUFlcElBZXBJQWVwSUFlcElBcitiW3IhISEhISEhISEhISEhMnJlcElBZXBJQWVwSUEKK2VwSUFlcElBZXBJbVYrYltyISEhISEhISEhISEhcnJBZXBJQWVwSUFlcElBZXBJQWVwSUFlcmJYVitiW3IhISEKKyEhISEhISEkcnBJQWVwSUFlcElBZXBJQWVwSUFlcElBcnJycnJycnJyISEhISEhISEhMnJlcElBZXBJQWVwSUEKK2VwSUFlcElBZXBJQWVwSUFlcEltISEhISEhISEhcnJBZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhISEkcnBJQWVycnJycElycnJyQXJycnJlcnJyZXJycmVwSUFyISEhISEhISEhMnJlcElBZXBJQWVwSUEKK2VwSUFlcElBZXBJQWVwSUFlcEltISEhISEhISEhcnJBZXBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhISEkcnBJQWVycnJycElycnJycmVycnJycnJBcnJycmVwSUFyISEhISEhISEhMnJlcElBZXBJQWVwSUEKK2VwSUFlcElBZXBJQWVwSUFlcEltISEhISEhMnJycnJycnBJcmVycnJycnJBZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISRyISEhISEhJHJwSW0hISEhIXJyQWVyckFycnJyZXJycmVwSUFyISEhISEybVZwckZWcHJScnJiW2hwYlsKK2tyckFlcElBZXBJQWVwSUFlcEltISEhISEhMnJoK3JJanJyQXIhMkZWcVtyZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhcmJbaHByVnJyYCRoK3JWcnBJQWVwSUFlcElBZXBJQWVwSUFyISEhISEhJHJwcklocUltIXBiW2tycnIKK2VwSUFlcElBZXBJQWVwSUFlcEltISEhISEhMm1WcGJbayEjW2hxW3JlcElBZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhcnJGVnBgJGhwclJycElBZXBJQWVwSUFlcElBZXBJQWVwSUFyISEhISEhJHJwckZWcGJbcnJyQWVwSUEKK2VwSUFlcElBZXBJQWVwSUFlcEltISEhISEhMm1WcHJGVnJiW3JycnJlcnJBZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhcnJGVnBySXJycm1WcHJtVnJyQWVwSUFlcElBZXBJQWVwSUFyISEhISEhJHIrcklocnJGVnJyRlZwckYKK1ZyckFlcElBZXBJQWVwSUFlcEltISEhISEhMnJoK3JWcnJySXJwcm1WcnJJcnBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhcmJba3JgJHIrcm1WcnJJcitycmVwSUFlcElBZXBJQWVwSUFyISEhISEhISFycnJlcmJbaHJySXIrcnIKK2hyckFlcElBZXBJQWVwSUFlcEltISEhISEhISEhcnJBZXJycmVyckFycElyZXBJQWVwSUFlcElBZXBJQWVyYCEKKyEhISEhISEkcnBJQWVwSUFlcElBZXBJQWVwSUFlcElBZXBJQWVwSUFyISEhISEhISEhMnJycnJycnJycnJycnIKK3JycnJycnJycnJycnJycnJycnJtISEhISEhISUhJHJycSEhSiEhYCEpISErISMhISMzIUohIUwhKSEhKTMjISEKKyRxIUohISFKKSEhISkjMWxZTCFKISEhSikhISEpIzFwbEwhSiEhIUpxWyEhKTM4KkdMJSQkISFKSzRKISkpaWAKKyEjIyVGISFKTC0hISkpIyEhIyMkISEhSktHISEpKUZTISMjKiIhIUpSOTMhKSw5OCEjIlQ5ISFKKlVKISkjISEKKyEjIXJycnJKMnJyaSEkcnJyISFycnJpITJycnIhJHJycmkhcnJyciEycnJyaSRycnJxIXJycnJKMnJycmkkcnIKK3JxIXJycnJKMnJycmkkcnJycSRycnJyS3JycnJpSXJycnEkcnJyckpycnJyaTJycnJxJHJycnJKcnJycmkycnIKK3JxJHJycnJKcnJycmkycnJycSRycnJySnJycnJpKHJycnEhcnJyckoycnJyaSRycnJxISEhIUohISEycnJycnIKK3JycnJycnIhISEhISEhISRtJCFgLSQhYC0kIWNyISEhISEhISFtLSQhYC0kIWAtJCFyMiEhISEhISEyYC0kIWAKKy0kIWAtJDJjMiEhISEhISRgYC0kIWAtJCFgLSRtYzIhISEhISFyIWAtJCFgLSQhYC1yLWMyISEhISEyJCFgLSQKKyFgLSQhYDJycnJyISEhISRtJCFgLSQhYC0kIWAtJCFjYCEhISFtLSQhYC0kIWAtJCFgLSQhbSEhISEyYC1ycmMKK3JyMnJtcmBybSQyISEhISRgYC0kIWAtJCFgLSQhYC0kYCEhISFyIWAtJCFgLSQhYC0kIWAtbSEhISEyJCFyciQKK3JybXJybTJyYGAyISEhISRtJCFgLSQhYC0kIWAtJCFjYCEhJHJyciRgcnJyIWAtJCFgLSQhbSEhMiEhITIkYCEKKyFyIW0ycmBybSQyISEkbWMtY0lyLWMwciFgLSQhYC0kYCEhJG1jMG0yJC1obSQhYC0kIWAtbSEhIXItY0ltLWMKK0lgLSQhYC0kIWAyISEhMmMtaGBjMHJgYC0kIWAtJCFjYCEhJG1jMCQtaG0kIWAtJCFgLSQhbSEhIXItYC1jSWAKKy0kIWAtJCFgLSQyISEhMmMtYzJyIWAtJCFgLSQhYC0kYCEhJG1jLXIycmBtLSQhYC0kIWAtbSEhIXItYzJybWMKK21tLSQhYC0kIWAyISEhMmMtci1yLWMtbS0kIWAtJCFjYCEhJG1jSXIyY21yMmAtJCFgLSQhbSEhIXIwbTJjbXIKKzJjYGAtJCFgLSQyISEhIXJgci1yMmNtciFgLSQhYC0kYCEhISFyIXJtcjJjbSQhYC0kIWAtbSEhISEyJCFgLSQKKyFgLSQhYC0kIWAyISEhISRycnJycnJycnJycnJycnJyYCEhISEhKSEhcnJycnJybSEhISRgISEhISRyISEhMiEKKyEhISEyY2AhIW0hISEhIXJybSEkYCEhISEhISRgITIhMiRyJHIhMiEhbSEhISEhISFtISRyITJtMiRgJGAkbWMKK3JjMiEhITIhMmMyci1tMm0hbSFyLXItbSEhISRgJG1yLW0hbTIhMiEyYy1tISEhISFtIXItbSEhISEhJGAkbW0KKyEhISEhITIhIXJycnJycnJybSEhISElIXJtIyFCKSIzSihMISMqRSlKIU0wNTYpKi1YTk4jOFAqJSFOSiM4ISkKK3JyTXJgMnJKcnIkcnEycmlyck1ycTJyanJyUnJxSXJqcnJScnFJcmpyck1ycSEhISUhISEhISEhISEhISEhISEKKyEhISEhITJyciEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhJHJaRVJyISEhISEhISEhISEKKyEhISEhISEhISEhJHJycnJycnJycnJycnJybFJQalZSciEycnJycnJycnJycnJgISEhISEhcmAhISEhISEhISEKKyEhISEhcnFBUWpFUnIhISEhISEhISEhISFyYCEhISEkciEjW2hwYltoK3JJaCtyRlZycUFRakltIStySWgrckYKK1ZwckZWcmAhISEhJHJwckZWcHJJaCtySWgrclZyalpBUWpJcmhwYltocHJJaCtyVnIhISEhISEkcnFJSWgrckkKK2grclZrcnFBUWpIRVFqSXJqcHJGVnBiW2txSW0hISEhISEybSErckloK3JJaHFJclBqWkFRakhBciEyRlZwckYKK1ZxW1JyISEhISEhISFyYCRoK3JJaHBiW2tycUVQalpBUXJgISFwckZWcHJWanJgISEhISEhISEkciEySWhwYlsKK2hwclJyakhFUGpbbSEhI1toK3JJa3FJbSEhISEhISEhISEybSErcklocGJbaHFbclBqSEVyISEkaHBiW2hxW1IKK3IhISEhISEhISEhISFyYCRocHJGVnBySWpycUFRcmAhIStyRlZwclZqcnFyciEhISEhISEhITJyciEjW2grckkKK2grclZyalttISEySWhwcklqcVtyUGpacnIhISEhISEkclpJbSFwYltocHJJaHFJcnIhISRoK3JGVnFJVnJqWkEKK1FqSHJyISEhIXJsUlByYCRocGJbaCtySWtyYCEhK3JJaHByVmpycUFQalpBUWpIcnIhMnFqakhFciEjW2hwYlsKK2hwck4hITJJaHBiW2txSXJRakhFUGpaQVFqSHJycmxSUWpJbSFwYltocHJGVnFKIVZwYltocVtScmpIRVBqWkEKK1FqSEVRbTJtIXJsUlFyYCFWcHJJaCtySWpwckZWcHJWanJxQVFqSEVQalpBUWpIcnIhISEhcmxSciEySWgrckkKK2hwckZWcHJJcnJyclBqWkFRakhFUGpaQVtyYCEhISEhIXJybSFwYltocGJbaCtySWhyckZWcnFFUGpaQVFqSEUKK1Bscm0hISEhISEhISFyYCRocGJbaHBiW2hwYltyK3JJcmpIRVBqWkFRakhyciEhISEhISEhISEkciEjW2hwYlsKK2hwckZWcVtycnJxQXJycnJQcnJycnJycnIhISEhISEhISEybSFwYltocGJbaHByVnIrckZWcmJbaHBybVZwYlsKK3IrcklyISEhISEhISFyYCRocHJGVnBySWpxSXJycHJJcnJyRlZwckZWcHJJaHBiW3IhISEhISEkciEjW2hwckYKK1ZxW1ZycmJbaHJycnIrcklgbHJGVnJybVZyYCEhISEhISEybSFwYltoK3JWanJxQXJwYltycmJbaG0ycmgrcnIKK3JwcklyISEhISEhISFyYCRocGJba3FbclBqW3JocHJycnBySXJyYltocnJtVnBybSEhISEhISEkciEjW2hxW1IKK3JycUVycGJbcnJyRlZycm1WcHJycitySXIhISEhISEhISEhJHJwclJrcmAhIXJybVZwcklyK3JJcnJySWhycnIKK2grcklyISEhISEhISEhISRycnJtISEhISFycnJycnFycnJgISFycm0hITJycnJgISEhISEhISEhISEhISEhISEKKyEhISEhcnFyYHJgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISFycm0hISEhISEhISEhISEKKyEhISEhISEhISEhMyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISFycnJycnJyZSEhJHJycnJyISEhISEhISEhISEKKyEhISEhISEhISEhISEhMm0hISEhISEybSFyYCEhISEkciEhISEhISEhISEhISEhISEhISEhISEhIXJiW2hwYlsKK2hxSXJyK3JJaCtyVnIhISEhISEhISEhISEhISEhISEhISEhISFyckZWcHJScnBJbSFwYltrcmAhISEhISEhISEKKyEhISEhISEhISEhISEhISRyK3JJaHFbcnIhMkZWcVttISEhISEhISEhISEhISEhISEhISEhISEhISEycmhwckkKK2pyYCRoK3JWciEhISEhISEhISEhISEhISEhISEhISEhISEhISFyYltoK3JTIStySWtyYCEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISRycGJbaCEySWhxSW0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEycmhwYlsKK2grcklycDMkciEybSEhMm0hcmAhISEhISEhMm0hISEhISEhISFyYltocGJbaHJgISEhMnJycnJycnJycnJycnIKK3JycnJycmAhISEhISEhISRycGJbaHBybSEhISEhISEhISEhISEhMm0hISEhISEhISEhISEhISEhISEybVZwckkKK3IhISRycmAhIXJycnJycnJlISEkcnJycnIhISEhISEhISEhISFyckZWcmAhISEybSEhMm0hISEhISEybSEhISEKKyEhISRyISEhISEhISEhISRyK3JtISEhISFycm0hISEhISEhISEhISEhITJJaCtyVnIhISEhISEhISEhJHIhISEKKyEhISRyISEhIXJycnIhISRycmAhIXBiW2tyYCEhISEhISEhISEhISEhISEhISEybSEhMm0hISEkcnJgISFyYCEKK1ZxW20hISEhISEhISEhISEhISEhISEhISFycm0hITJtIXJgJHIhISRyITJWciEhISEhISEhISEhISEhISEhISEKKyEhISRyISEhIXJgJHJyYCEhcmAhIXJgISEhISEhISEhISEhISEhISEhISEhISEycnJyYCRyITJtISEybSEhMm0KKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITJtISEhJHIhISRycDMhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhIXJgISFyYCEhISEhISEycnIhISRycmAhISEhISEhISEhISEhISEhISEhISRyITJtISEhISEhISQKK3JwcklycnJJaHJgISEhISEhISEhISEhISEhISEhISEkciEhISEhISEhITJyaHBycnJwcklyISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhIXJySWhycklocmAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISQKK3JwcnJocHJtISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITJyaHBySXIhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhIXJySWhyYCEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISQKK3Jwcm0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhMyEhITJycnJycnJaSW0hcnJycnJgISEhMm0KKyEhISEhITJyUHJgISEhISRyISEkcitySWgrcklqcnJtVnByRlZxW20hITJyaCtySWpycUFyITJGVnFbbSEhISQKK3IrcklocVtyciEyRlZxW20hISEhIXJySWhwclJyITJGVnFbcnIhISEhWkltVnBiW2shI1tocVtyUGpbbSFaSEEKK3JwYltoITJJaHFJclBqWkFQcnJyUXJySWgrckZWcnJyUGpaQVFsYCEhcnJtVnByRlZyYltycnJyUXJgISEhISQKK3JwYltocHJycnJiW2hyYltyISEhIXJiW2hwcnJoK3JyaCtySWgrcm0hITJyaCtyVnJycklycHJtVnJySXIhISQKK3IrclZyakltVnJiW3Jwcm1WcmAhISEycnIhMm1WcHJyaHJiW3Jwcm0hISEhISEhISFycm0hcmAkciEybSEhISEKKyIhISEhcnJycnJycnJycnJycmAhISEhISEhMnJlcElBZXBJQWVwSXJyISEhISEhJHJwSUFlcElBZXBJQXIrcm0KKyEhISEhcnJBZXBJQWVwSUFlcnJycnJgISEhMnJlcElBZXBJQWVwSUFlcEltISEhJHJwSUFycElycnBJcnJwSUEKK3IhISEhcnJBZXBJQWVwSUFlcElBZXJgISEhMnJycElBcnJyQXJwSXJlcEltISEycmhwcnJycHJJcnBJQWVwSUEKK3IhISRycHJJcnJySWhyckFycnJBZXJgISFycklocnJJaHJyQWVwSUFlcEltISEycmhycklocnJBZXJyQXJwSUEKK3IhISRycHJJaHJyQWVwSUFlcElBZXJgISFycklocnJBZXBJQWVwSUFlcEltISEycmhyckFlcElBZXBJQWVwSUEKK3IhISEhcnJycnJycnJycnJycnJycnJgISEhISUjISFTISEhISEhIjMiQEohUyFFYCUiJUNURVEzISEhISEhJCEKKyJAMyIlIUVYJSJlKlBGJ2FLQmY5TSEhISEhISIwITlTIUIzJ20iIWo1Q0EiWEJAMFApI0JKNFFQWkMhISEhISEKKyFEMyZEIShkIlshMyw4UTlgRScmTUM1IiJFJ2JRISEhISEhImghJikhTDMjbSIzWSpDZmpbRlE4SjNmJmNDQUYKKyEhISEhIShKIWEhIyshNWkmIlAqUENmOWlGISEhISEhIU1gIjUhKyUhWyE4LDRAamREQSpQKSZHW0ZRNCUhISEKKyEhISE4ISY4ITBKJWwlIVAmQydQZCkmNFBIKDVtISEhISEhIiMhJjghQyElbCUhUCZDJ1BkKSY0UEgoNEQhISEKKyEhISE2ISNkISlgIjVMITknREBqTjFVQiEhISEhISUzISZKIjghJispIyYqUEYnYUtCZjhrISEhISYzIiYhIykKKyFtIShZISEzIiEhJSEhISEhISEjJiEhISEhMUohISEhISExSiEhSiEiIyVHS0ZRQ1RDQGFOISEhISEhISEhISEKKyEhISEhISEhISEhISEhLCUxKFtHIzQhISEhISFbZkphM0hBNFNFZmlKLTVpZSxNJSEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISNyRVhAVDEpSiIKK2ghJkIicUonJHJycnJyYCEhISEhISEhISEhISEhISEhISEhISEhISE4VDhhS0VRR2VCQEdQRmJwNkJoKlRGKDQKK1RFUUYhITMhJSEhIVtmSiEjISNUKEJBKlFEQDlYQyRVUDYnJlpDaDlLQ2Y5YyxlME1GUVBgRydQWkNjVDNIQTQKK1NFZmlKLTVpZSxNKHJyYCEhISEhISUmNCZAJjRkRyhLZCErSmAtNkphISEhISEhKSEhISEhISEhISEhISEhISEKKyEhISEhISEkcnJycnJtISEhISEhISEhISEhISEhbSEhISEybSEhISEhISEhISEhISEhMiRyISEkYG0hISEhISEKKyEhISEhISEkWHJxISFycm0hISEhISEhISEhISEhY2ByYCEhITIhISEhISEhISEhISEhMXJyckohISRxISEhISEKKyEhISEhISEkYCEybSEhIXJKISEhISEhISEhISEyckpscm0hITJpISEhISEhISEhISEhLSEhISEhISQxISEhISEKKyEhISEhISEkYC1gIWAhMnJyYCEhISEhISEhISEhbTEtIS1gJHEkciEhISEhISEhISEhMiExLWMtYHJyciEhISEKKyEhISEhISEkYCEhIWMhMmkybSEhISEhISEhISEhbSEhIS0hJHEkciEhISEhISEhISEhMnJycm1ybXJyciEhISEKKyEhISEhISEhISRabFpsWGMtISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISElISEhISEhJHJKISEhSi0hISEsI0ohISNgbSEhIUAiISEKKyEySkIhISMtJyEhIk1LSiEhISEpISEjYjIhISFYY0IhISpxbSEhIyQwSiEhSk1CISEyZm0hISFJYCEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhMnEhISEkcmAhISFycSEhITJyYCEhJHJtISEhcnJKISEycmkhIShycSEhIXJySiEKKyEycnEhISRyckohIXJyaSEhMnJxISEkcnJKISFycmkhISJybSEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEzJHJybSEKKyFKISIhISkhITMhIyEhJSEhSiEiISEpISEzISMhISUhIUohIiEhKSEhMyEjISElISFKISIhISkhITMhIyEhJSEKKyFKISIhISkhITMhIyEhJSEhSiEiISEycnJgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhMnJyYCEkcnJtISFycnIhITJycmAhJHJybSEKKyFycnIhITJycmAhJHJybSEhcnJyISEycnJgISRycm0hIXJyciEhMnJyYCEkcnJtISFycnIhITJycmAhJHJybSEKKyFycnIhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhIyEycnJycnJycnJycnJgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFtISEhISEhISEhITIhISEhISEhISEyISEhISEhISEhISRgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFtISEhISEhISEhITIhISEhISEhISEyISEhISEhISEhISRgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFtISEhISEhISEhITIhISEhISEhISEyISEhISEhISEhISRgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFtISEhISEhISEhITIhISEhISEhISEyISEhISEhISEhISRgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFtISEhISEhISEhITIhISEhISEhISEyISEhISEhISEhISRgISEhISEhISEkYCEhISEhISEhISFtISEhISEhISEKKyFycnJycnJycnJycnIhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEjISEhISEhISEhISEhISEhISEhISEhISEhISshISEhI0ohISEhISEhISEhISEhIVNrcnJyazFbISEhISEKKyEhISEhISEjTS1rYy1TYzFaISEhISEhISEhISEhI00ta2JNLWtySiEhISEhISEhISEhIXFNLWstY1MyaSEhISEKKyEhISEhISEhMmJNLWMxWCRxISEhISEhISEhISEhJG1iTS1jYyFySiEhISEhISEhISEhIXIrLWMtY2AyaSEhISEKKyEhISEhISEhMlNjMU0tayRxISEhISEhISEhISEhI00ta2JNLWtySiEhISEhISEhISEhKy1jVi1iTS1raSEhISEKKyEhISEhISEhKzFYYy1iTS1rISEhISEhISEhISEhJGtjLWMtYk1WSiEhISEhISEhISEhIW0hISEhIWJbaSEhISEKKyEhISEhISEhMnJycnJycnJxISEhISEhISEhISEhISEkWmxabFpsSiEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEiISEhISEhISkjISEKKyEocmkhISRpcSEhIUlJSiEhKHJTISEiSWIhISE2aUohISZyKSEhInJrISEhSUlKISEyTWkhISJgSSEhIUIkSiEKKyElIUIhISJycSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIUopISEhSXJKISEycm0hISJyciEhIUlyYCEKKyEocm0hISJyciEhIUlyYCEhKHJtISEicnIhISFycmAhIShybSEhInJyISEhSXJgISEocm0hISEyciEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISkhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITJycnIKK3JyciEhISEhISEhISEhISEhJGAhISEhJHEhISEhISEhISEhISEhIW0ycnJycnJycnIhISEhISEhISEhITIhISQKK2AhISEhJGAhISEhISEhISEhJGBycm0ycnJyYHJKISEhISEhISEhIW0hITIhISEhITJpISEhISEhISEhITIkcnIKK2BycnJyJHEhISEhISEhISEhJGAhIW0hISEhIXJKISEhISEhISEhIW0ybTIkcnJybTJpISEhISEhISEhITIhISQKK2AhISEhJHEhISEhISEhISEhJHJycm0ybSEhIXJKISEhISEhISEhISRabFshISEhITJpISEhISEhISEhISEhISQKK3JycnJycnEhISEhISEhISEhISEhISExbFpsWmxKISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISUKKyEhISEhISEhISEhInJpISEhMyQhISEmcnIhISIjITMhIUFbZiEhJSkiSiEiSHJCISEzSichISZWcEohIiMhQiEKKyFJWCchISRpIkohISRyaSEhITJxISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIShySiEhInJtISEKKyFJcm0hIShyciEhInJyaSEhSXJxISEocnJKISJycmkhIUlycSEhKHJySiEicnJpISEycnEhISEyckohISFyaSEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhMyEncSEhISMzMyEhIUojISEhKiQzISEiW1ghISJyckohIWBILSEKKyFCKE0hITBhaWAhI0ZILSEhUihNISEtImlgISJKSC0hITJyciEhInJyYCEhIUghISEhKEohISEhaSEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISFFaSEhITJyISEhJHJpISEhcnIhISEncWAhIShycSEhJHJyYCEicnJtISFycnIhITJycmAhJHJybSEKKyFycnIhIShycmAhIXJybSEhKHJyISEhImkhISEhSCEhISEkSiEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEjISEhISRyJHJyciEKKyEhISEhISEhISEhISEhMiEyISEhMiEhISEhISEhISEhISEhJGAhISEhITIhISEhISEhISEhISEhIW0hbSEhMm0KKzIhISEhISEhISEhISEhIXJgcnJyM3JgISEhISEhISEhISEhJUZgRnJyYEZyMyEhISEhISEhISEhRyU0JUlycCUKKzRyMyEhISEhISEhISJkNCU0KHJyNCVJZCEhISEhISEhISg0Y0YlNHJyZDQocCEhISEhISEhISIlR3I0JUlycCUKKzRyMyEhISEhISEhJDQoMGA0KHJyNCVJZCEhISEhISEhIWhhJTQlNHJyZDQocCEhISEhISEhISFoYSU0JUlycCUKKzRyMyEhISEhISEhISFocnJycnJySXJyZCEhISEhISEhISEhaEdoR3JyaEdoRyEhISEhISEhISEhISEhITJycCEKKyEhISEhISEhISEhISEhISEhJHJyMyEhISEhISEhISEhISEhISEhISRHZCEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISUhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEkcnJycnJycnJycnJtISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhMm0KKyEhISEhISEhIXJybSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhcmAkcnJgISEhISRyITJtISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEkaitycnJxMyEhITJycnJybSEhISEhISEhISEhISEhISEhISEhISEhISEhI1sKK3IhMnJyISEhISEhISFyYCEhISEhISEhISEhISEhISEhISEhISEhISEhcUlycnJycmohISEhISEkcnEzISEhISEKKyEhISEhISEhISEhISEhISEhISEkciEhISFycm0hISEhISEycmohISEhISEhISEhISEhISEhISEhISEhISFycnIKK2ohMlJycnJtISEhISFyck4hISEhISEhISEhISEhISEhISEhISEhISEhK2AhISEhISEhISEhISEhVnEzISEhISEKKyEhISEhISEhISEhISEhISEhISEkciEwTUIhISRCISEhIXJycnJyYlghISEhISEhISEhISEhISEhISEhISEhMm0KKyFxR0ohITBNQiEhJHJyISRycmAhISEhISEhISEhISEhISEhISEhISEhcmAhIXFHTUJmME1CITJycnJybVYhISEKKyEhISEhISEhISEhISEhISEhISEkciEhISEhISRCZiEhIXJyYCFycm0hISEhISEhISEhISEhISEhISEhISEhMm0KKyEhISEhITBKISEhJHJyISRycmAhISEhISEhISEhISEhISEhISEhISEhcnJycnJycnIrcnJyK3JycnJybVYhISEKKyEhISEhISEhISEhISEhISEhISEhISEhJGpxSVJqcUlSaitiWFYrYCEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITMKKyFycnJycnJycnJycnJycnJycnJycnJycnIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEybSEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISEhISEKKyFyYCEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEybSEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISEhISEKKyFyYCEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEybSEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISEhISEKKyFyYCEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEybSEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISEhISEKKyFyYCEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEybSEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEhISEhISEhISEKKyFyYCEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISEhISEhISEhISEycnJycnJycnJycnJycnJycnJycnJycnJgISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEiISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhJEYhISEhISEhISEwYCEhISEhISEhISEhISEhISEhISEhISEhISEhISEhaCMyRXJycnJycnIKK0UpcGNyISEhISEhISEhISEhISEhISEhISEhISEhITBYTSliMkUrYlhWZmItTSlwW2ohISEhISEhISEhISEhISEKKyEhISEhISEhISEwYE0pYjJGK3BgTSliMkZyck4hISEhISEhISEhISEhISEhISEhISEhISEhcnBgTSliMkYpYi0KK01oISRycTMhISEhISEhISEhISEhISEhISEhISEhISEkcitwYE0pYi1NKXBgViEycmohISEhISEhISEhISEhISEKKyEhISEhISEhISEybVYrcGBNKWIyRStiWCFyck4hISEhISEhISEhISEhISEhISEhISEhISEhcmJbRiliLU0pYjIKK0UrYCRycTMhISEhISEhISEhISEhISEhISEhISEhISEkcmZiLU0pcGBNKWIyRiEycmohISEhISEhISEhISEhISEKKyEhISEhISEhISEwWE0pYjJGK3BgTSliMkZyck4hISEhISEhISEhISEhISEhISEhISEhISRGKWItTWZiWFYrcFgKK00pYjJFcTMhISEhISEhISEhISEhISEhISEhISEhISEkRilwYFYrYlhWK3BgTSliMkYhISEhISEhISEhISEhISEKKyEhISEhISEhISEyckYrYlhWK2JYVitwYE1mck4hISEhISEhISEhISEhISEhISEhISEhISEhcmAhISEhISEhISEKKyErcFtycTMhISEhISEhISEhISEhISEhISEhISEhISEkcnJycnJycnJycnJycnJycmohISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhMlJqcUlSanFJUmpxSU4hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISElISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISFycnJycnJycnJycnJyYCEhISEhISEhISEhISEhISEhISEhISEhISEhISEkciEhISEhISEKKyEhISRycTMhISEhISEhISEhISEhISEhISEhISEhISEhISEybSFycnJycnJycnJycnJycnJycmAhISEhISEhISEKKyEhISEhISEhISEhISFyYCEhISEkciEhISEhISEhISEkciEhISEhISEhISEhISEhISEhISEhISEkciEycnJycm0KKyFycnJycnJyciEycmohISEhISEhISEhISEhISEhISEhISEybSEhISEhcmAhISEhISEhISEhcnJOISEhISEhISEKKyEhISEhISEhISEhISFyYCRycnJyciEycnJycnJycmAkcnEzISEhISEhISEhISEhISEhISEhISEkciEhISEhMm0KKyEhISEhISEhISEycmohISEhISEhISEhISEhISEhISEhISEybSFycm0hcmAkcnJycnJycm0hcnJOISEhISEhISEKKyEhISEhISEhISEhISFyYCEhISEkciEhISEhISEhISEkcnEzISEhISEhISEhISEhISEhISEhISEkcnJycnJycm0KKyFycm0hISEhISEycmohISEhISEhISEhISEhISEhISEhISEhJGpxSVJqcmAhISEhISEhISEhcnJOISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEkcnJycnJycnJycnJycnEzISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyFxSVJqcUlSanFJUmohISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhITMhISEhISEhJHJyYCRycnJycnJgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyFyYCEhcmAhISEhISFyYCEhISEhISEhISEhISEhISEhISEhISEhISEhISEkciEhISEhISEhISEhIXJgISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEybSEhMm0hISEhIXJybSFyYCEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhMnJyITJycnJycmohMnJyISEhISEhISEhISEhISEhISEhISEhISEhISElIitiWCIrcnJycmJYIitycUkhISEKKyEhISEhISEhISEhISEhISEhISEhInEzOCYiMzgmcnJycnEzOCYiSXJqISEhISEhISEhISEhISEhISEhISEhSU4KKyYiMzgmIjNBcnJycmoiMzgmcnJOISEhISEhISEhISEhISEhISEhIShqIjVbaitgOCYiSXJycnJOJiIzQXJxMyEKKyEhISEhISEhISEhISEhISEhITM4JnFJcmoiMzgmcnJycnEzOCYiSXJqISEhISEhISEhISEhISEhISEhJGoiMzgKK1ZxNVgmIjNBcnJycmoiMzgmcnJOISEhISEhISEhISEhISEhISEhMlJyIjM4JiIzOCYiSXJycnJOJiIzQXJxMyEKKyEhISEhISEhISEhISEhISEhITJSciIzOCYiMzgmcnJycnEzOCYiSXJqISEhISEhISEhISEhISEhISEhISEhMlIKK3JycnJycnJycnJycmpycnJycnJOISEhISEhISEhISEhISEhISEhISEhITJSanFJUmpxSXJycnJSanFJUmpxMyEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhcnJycnEzISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEkcnJycmohISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISRqcUlOISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIUohISEhISEhISEhISEhISEhISEhISEKKyEhISEyISEhMmkhISEhISEhISEhISEhISEkcSEhJHEhISEhISEhISEhISEhISEhJGAhMmkhISEhISEhISEhISEKKyEhISEhckokcSEhISEhISEhISEhISEhISEhIW0yaSEhISEhISEhISEhISEhISEhITJscSEhISEhISEhISEhISEKKyEhISEhITJpISEhISEhISEhISEhISEhISEhIXJyaSEhISEhISEhISEhISEhISEhbHEhMmkhISEhISEhISEhISEKKyEhISRyckokcm0hISEhISEhISEhISEhITJsW2khckptISEhISEhISEhISEhISRgJHEhMmkyaSEhISEhISEhISEKKyEhIW0hckokcSRxISEhISEhISEhISEhISFycWkhJHJpISEhISEhISEhISEhISExaSEhIWxKISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhMyEhISEhISIiISEhITMzISEhIykhISEhTCEhISEmISEhISIzISEKKyEhKSEhISEoISEhISMpISEhJE1KISEiKU4hISE1KiEhISVMMyEhIWBCISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISUnISEhIktKISEhKWAhISEkLSEhISFAISEhIShKISEhIWAhISEhSCEhISFGYCEhITIxISEKKyEoY2AhISJtcSEhIUkySiEhJGFgISEhYEIhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEiISEhISEhISEhISEKKyEhMnEhISEjIkohISFKQiEhIWknISEhMSJKISJyY0IhIUlxZiEhKHJLSiEicmBCISEhaSchISExIkohISFLaSEKKyEhKnEhISEkckohISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIXJpISEhMnEhISEkckohISRyaSEKKyEhcnEhIShyckohInJyaSEhSXJxISEocnJKISEkcmkhISFycSEhISRySiEhIXJpISEhMnEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISkhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyFycnJycnIhISEhISEhISEhISEhISEyISEhIXJgISEhISEhISEhISEhISEkYCEhITJtISEhISEhISEhISEhISQKK3JtISEhJHIhISEhISEhISEhISEhIW1yISEhIXJgISEhISEhISEhIXJycnItciEybTJtISEhISEhISEhITItYy0KK2MtciRyJHIhISEhISEhISEhJGMtYy1jMmAhIXJgISEhISEhISEhIXJycnItciEhITJtISEhISEhISEhISEhISQKK2NtISEhJHIhISEhISEhISEhISEhIXJyISEhIXJgISEhISEhISEhISEhISEkYCEhcnJtISEhISEhISEhISEhISEKKyFtIXJycnIhISEhISEhISEhISEhISEycnJycnJgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISkKKyEhISEhISEhISEhISEhISEhISEhISEhcnJycnJyISEhISEhISEhISEhISEhMiEhISEkciEhISEhISEhISEhISEKKyEkYCEhISFyMiEhISEhISEhISEhISEhbSEhISEycnIhISEhISEhISEhISEhMiEhISEhISRgISEhISEhISEhISEKKyEkYCEhISFycm0hISEhISEhISEhISEhbSEhISRtYy1tISEhISEhISEhISEhMiEhITJgIWMtbSEhISEhISEhISEKKyEkYCEhJG0kLWMyISEhISEhISEhISEhbSEhIXItYy1jYCEhISEhISEhISEhMiEhITJjLSQtbSEhISEhISEhISEKKyEkYCEhITJjLWNtISEhISEhISEhISEhbSEhISEycnJjciEhISEhISEhISEhMiEhISEhISRgcnIhISEhISEhISEKKyEkcnJycnJycm0hcmAhISEhISEhISEhISFoR2hHaEdkISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhJSEhISEhIShyISEhIiFCISEKKyEzJiEhISUiaSEhIiEjISEhMyhKISElIyUhISIiIUohITMzKSEhJSUjISEiIiFKISEzKTMhISUibCEhIiEjaSEKKyFJclEhISFVUyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIUltISEhKHJKISEicm0hISFJckohIShyaSEhInJxISEKKyFJcmAhIShycSEhInJySiEhSXJpISEocnEhISJyckohIUlybSEhKHJsSiEicnFCISEkcmAhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISIhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISFyYCEKKyEhISEhcnJOISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISRycTMhISEhJHJxMyEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEkciEhISFyck4hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhMnIKK2ohISRycTMhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITJtIXJyTiEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhIXJyUnJxMyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyFyck4hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITJycnJyTiEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhITJScnEzISFyck4hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhJHJycnIKK2ohISRycnJtISEhISEhISEhISEhISEhISEhISEhISEhISEhISFyclJqcnJOISEycmohMm0hISEhISEhISEhISEKKyEhISEhISEhISEhISEhISRyISEkcnEzISFyck4hcnJOISEhISEhISEhISEhISEhISEhISEhISEhISEybSEhMnIKK2ohISRycTMkcnEzISEhISEhISEhISEhISEhISEhISEhISEhISEhMnJycUlOISEhJHJyck4hISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhcUlOISEhISEhMlJqISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISUhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhITJycnJycnJycnJycmAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISFyYCEhISEhISEycnIhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISRyISEhISEhISFycm0hISEhISEhISEhISEhISEhISEhISEhISEKKyEhISRycnJtISEhISEhISRycmAhISEhISEhISEhISEhISEhISEhISEhISEhISEyckJyYCEhISEhISEycnIhISEKKyEhISEhISEhISEhISEhISEhITJycnJycnJycE1CcmAhIXJybSFycm0hISEhISEhISEhISEhISEhISEhISFycE0KK0JmME1CZjBNQnJgJHJyYCRycmAhISEhISEhISEhISEhISEhISEhISRyZjBNQmYwTUJmME1yISEhISEycnIhISEKKyEhISEhISEhISEhISEhISEhITJycnJycnJycE1CcmAhISEhISFycm0hISEhISEhISEhISEhISEhISEhISEhISEKKyEhISRyZjJtISEhISEhISRycmAhISEhISEhISEhISEhISEhISEhISEhISEhISEycnJyYCEhISEhISEycnIhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISRyISEhISEycnJycm0hISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhITJtISEycnJycnJycmAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISFycnJycnJycnJycnIhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhITMKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIXJycnJycnJycnJyciEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEycnIhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISFyYltyISEhISEhISEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEkcnJycnIhISEKKyEhISEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhMm0hISEhISEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhISFycnJycmAhISEhISEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhITJtVnByRlZyYCEKKyEhISEhISEhISEhISEhISEhISEhISEhJHIhISEhISEkcitgISFwckZWcmAhISEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEycmghMkZWcHJJciEhISEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhcnJJaCtySWgrcm0KKyEhISEhISEhISEhISEhISEhISEhISEhJHIhISEhISEkcnBiW2ghI1tocmAhISEhISEhISEhISEhISEhISEhISEKKyEhMm0hISEhISEhJHJwcklocHJtViEhISEhISEhISEhISEhISEhISEhISEhIXJgISEhISEhISEkcnJycnIrcnIKK3IhISEhISEhISEhISEhISEhISEhISEhJHIhISEhISEhISEhISEhMm0hcnJyciEhISEhISEhISEhISEhISEhISEKKyEhMnJycnJycnJycnJycnJycmAhIXJybSEhISEhISEhISEhISEhISEhISEhISEhISFxW1JrcUlWanFbUmtxMyEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyEhISEhISEhISEhISEhISEhISEhISEhISEhMyEhIShCLCEhImUjYCEhIiptLDY1UE4iMmkhISEhRiImUyEkOCoKKzE0JWAhISEiYjRQKiY0SiEjIShqVEJmYGQhIWQhU1FQTUUkSiEkSiYrNTgwMSlgITAhSWpUQmgtTSEhOCNUUVAKK01GYzMhIjMsWkRAMGMxISEmIWNDQDU4ZEshISEkSU4mLThQMyEhITErNCVQODYhISYhakMlNiVwKCEhOCRoUSYKK1hEQS0hISEzUTRlQGg1MyEhIiQpIUoycnIhISEhISEhISEhISFKMnJyISEhIS0hISEhISEhSklyciEhISExYCEKKyEhISEhSltyciEhISE0SiEhISEhJURJcnIhISEhODMhISEhISVEMnJyISEhIzkzISEhISEhSjJyciEhISVAMyEKKyEhISEhSklyciEhISdBMyEhISEhIUpbcnIhISFQaCEhISEhISFKcnJyISEhWVghISEhISEhS0lyciEhIW1VYCEKKyEhISEhS1tyciEhIiFZYCEhISEhIUtycnIhISIjWmAhISEhISFMMnJyISEiJmBgISEhISEhTElyciEhIipjYFkKKzAqZjMhTFtyciEhIklqYFkwKlpKIUxycnIhISJNbWBZMClxMyFNMnJyISEiUHBgWTAqY2AlRElyciEhISlCM1kKKzAqcSElRDJyciEhIS1DM1kwKm0hIUoycnIhISEzRDNZMCptYCFKSXJyISEhOEUzWTAqbEohSltyciEhIWBJIVkKKzAqbUohSnJyciEhIVNVIVkwKm0zIUsycnIhISFkSiFZMCpsYCFLSXJyISEiLGRgWTApJCEhS0ohZCEhIjJlYFkKKzAqbCEhS2AhViEhIjZmYFkwKmtgIUwhIXAhISJBaGBZMCprSiFMSXJyISEiRWlgWTAqazMhTFtyciEhIlNyYFkKKzAoWkohTHJyciEhIlkhYFkwKmRgIU0ycnIhISJhImBZMChaMyVEMnJyISEhQkYzWTAjWkolRElyciEhIUNHM1kKKzArIUohSjJyciEhIURIM1kwKyIzIUpJcnIhISFFSTNZMCskYCFKW3JyISEhTmYhWTArIWAhSnJyciEhIVhWIVkKKzArIiEhS0lyciEhIXFWYCEhISEhIUtbcnIhISFyWGBZMCs0SiFLcnJyISEiJVtgWTArIkohTDJyciEhIihhYFkKKzArITMhTElyciEhIiliYFkwKmhKIUxbcnIhISJLa2BZMCpaISFMcnJyISEiTGxgWTApcjMhTTJyciEhIlJxYFkKKzAqI2AlRDJyciEhIUZKM1kwKyMzJURJcnIhISFGYTNZMCsjYCFKMnJyISEhRyMzWTArJzMhSklyciEhIUc2M1kKKzArIyEhSltyciEhIVJpIVktK1gzIUpycnIhISFgMSFZMCskISVEMnJyISEhR04zWTApWDMlRElyciEhIUgmM1kKKzAoUGAhSjJyciEhIUhRM1kwKiEzIUpJcnIhISFJKDNZMCpgMyFKW3JyISEhUyohWTAoUWAhSnJyciEhIVtZIVkKKzAoUCElRDJyciEhIUlTM1kwKVBgJURJcnIhISFKVDNZMClQISFKMnJyISEhS1UzWTApUSEhSklyciEhIUxWM1kKKzAoaSEhSltyciEhIWlLIVkwKVAzIUpycnIhISFqTCFZMClRMyEhISEhISEhTVgzISEhISEhSjJyciEhIU1jYCEKKyEhISEhSjJyciEhIU1oYCEhISEhIUpJcnIhISFOIjMhISEhISFKW3JyISEhTiNgISEhISEhSnJyciEhIU4qMyEKKyEhISEhSzJyciEhIU4xYCEhISEhIUtJcnIhISFrTSEhISEhISFKMnJyISEhTkBgISEhISEhSjMhMiEhIU5HISEKKyEhISEhSkohOCEhIU5NMyEhISEhIUpgIUYhISFOVEohISEhISFLISFLISEhTltgISEhISEhSzMhUSEhIWxOSiEKKyEhISEhaklyciEhIWxVYCEhISEhUyFJcnIhISFtUGAhISEhITE2aEdaQ0EpSkZROWNFaDliQmY4JTZAJlRFSkcKKyNHQTRkRWZqYyIlUE1FZmklOSc5aUchNCdEQGpOIyg0TEFmMFhFaDBQIyg0TEFmKlhCQGpWImg0TEFmMFtGKFIKK1ZMIToKKwpkaWZmIC0tZ2l0IGEvc3JjL29zX21hYy5zaXQuaHF4IGIvc3JjL29zX21hYy5zaXQuaHF4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDg4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfbWFjLnNpdC5ocXgKQEAgLTAsMCArMSw0MzkgQEAKKyhUaGlzIGZpbGUgbXVzdCBiZSBjb252ZXJ0ZWQgd2l0aCBCaW5IZXggNC4wKQorOiRoQ1RFNWRlLE1CWkVAMGAsUjBURyEiNjU5M2U4ZFA4KTMjMyImJ0IhKiElWkhLNkcoOVFDTlBkKSNLTSs2JQorajE2RlktNk5qMSMiIkUnJk5DJ1BaKSYwakZoNFBFQS1YKSVQWkJiaVgpJ0tkRyghayxicGhOIS1aQkBhS0MnNAorVEVSMGpGYmpNRWZkWzhoNGVDUUMqRyNtMCNLUyEiNCEhISYnQiEqISRGSiEiISohJEZQcmYkREBQOFE5Y0NBKgorZkNANVBUMyNQTiEzIiEhIWwhISNgcTNEJlkrclNUMyMzJDNbUUQzISRoRmQhISYkKCEqISUkYCJmREBkWTA1aQorZixRZU1GISEhR2pLMDY5ImIzZUcqNDMlMSEjSiFqISMzI1MhIU4hRyNgRzVRSDQmJXBSYS1LJUU0VWtaVGFRVQorIi0rWDYpJixLJEBZbSpoR0MpOWhbRDlUKVpFSFNlZUhlJSRscjQ4VDlwJE5wJlBiQXFVKnAjQyEhK3BCcUMyJAorKygzMW1qYihkImNwNklUYkliVSJQcU5GIyVaaTkkY0FYNiEnQU4hISYmVjREQyRpVCVTU1RMQyEhY1tZUWw5RAorUXA1TVJLQUcpNTM1RlZxbU4hTjRsSVslKEFaLEIiRClNWFQhITZKISZkNkZrW20lbVRTUywlMGMmcUtgYGA0TgorYnBBTmozSjEnUmlgTEg1aUZpaGBjZnFVOXI2UEhEMShsMFZUImRiKGEzZko2S2pTRkoxTSYiU0QzITAzLWtiZAorLDVxYVZORmw1Y2hIJ0JobTFDJkliRVRIIWYtWkQ4aVgpcFpDbU1kM1hDJiYybDlHMzAlI0FjUShHKWUhUVVaVQorcGlwMkZHZUFqbE05LE1mWixgQEBsZGNRVURFOSdYcFVZTVRSUzBmSSpkNTMkSWI1VlVmTUZCK0djODgpSDIkTQorTltAWSgoQDBMRDhKW00zYWknMShhSUxpSitsQ2VAYU1GcUEkKk5JKVg0TUcnSzIqazBGRmY5IW0lJUdKYitgNQorJydNIyxaTkRkJTVoa0lTQkwiKnJxLGNJYCIsQElsakVRKmQpOFJsMUorQWJjQGVtajZRZjZKWU5AQC1qYHArRworWE4hI1pZTSxKaC1RakkoKSxkJVAqWERiMklmNSFQYiciIyNLOThqamg2YmRoWCoyJ3JWVUBaRUI0Zk5hVVVraAorJWQyUVpMVSdhRVAkJi1DREE0WWBhJDJoUjJpVWklMi0zIUowNVRiQmUiMXFbcEJoQlFYTjFyIkswNEgyUlIiSworNGlrcipKOGs5WzBhWkk5azQrJyIibDgiJm05VjZVZTlRU1VycnJjZlNMLWVLK1gqJEJDbUxUbDhxYThkbGREagorIUlscjJsZXJOQ2NhJGBVZigkLFROMHIyQ1QkR05VU0tEbFJTMWAiNCVLanFGI2tBW0JtWjMhMCJDSVYyJVBaYQorYU0tWnJbaypsKURQUlRDLEtwWEpGVnA2VmtxajEzYVFgbExRI0ZxLGhZRjEyWzYjIURMZk5WQlFZUWNAKDAmYAorcmxyOSYlVWJtcCtYKCZQRS1iMVYrVWAyQmhNSWBWImhaIU4jOShQNixJNmJsYS1RaCwjWC1hNG0hSmJNSiYjJworJ1BUTUhOISNQbFhrWkIkMEVTKUwoW2BZZVVrM0hHOS0pIS1IS1ZZQyxFbTFCQiVqKWRgOG0taSwqMTBVKk5UYQorTCg2cU1JYGZCWCNWMkRJa2EnbGByMkwjMiY5NTZhIlVCWEhWYkcmJWRYJUcqQUczSkUtM1piVCVmRkYra0lgVgorUGBMUGApVGpiYChTJksjUywzKmErbDBATCU4WSFUcUw1J2ZiaHJRamxCIktHREZmUEBRKzMhK2hjRSFwUltNcAorLWknciZJTjUtWU5HWyJFK1tQI05GbSohIXItakRUSUJbQSlBYHElVCFTSXIqMFU0KDI2TEdVUSxOTlFVbUc5MworZCRGTlpDKCtCSylgbFImJyQnZkQjTlInVFYmRjUlYEVIIlhlRVBRSGNabGpbYnFpbVFLLDIxbCoqQjYzRWZALAorWilVMGRsUSxWYEorQkIpJyYrYjVEaWpONDkjTEVJIWEzNGhKJlNqW2BBUCNwYCZEMCZyalRmaEdJZkZTW2swIQorW1tkMChGNSxlUGMha2MtaFIxUCFkS2BoITVQSWpaciJFcVg5I2RKcFU0KDJWYlNjOGVlODYxKyszISNTcmNZIworbWEzWGZiQXEsYnI0cWsxW0c5ZmRoKmhpJHEkUDNpYFE0W3JEQmUlOGpWQ2pTa2lhR1hSJm1hQGpwJlkzbGJVSQorOShrQyZJQGVIJC1iMSwmQ1VaRkRZaVoxckRHLU1iMmVrKEsxRmRwIi0oNUBRJjgkSiIiJiJIIjFWMnFGRDREOQorMWlbM1NLQWtBMy1KJWROYFVYQlNKKVA5UW1SUiZHaUZyTjhNSmRRQWpiKjIncFVyZTBBR2NtNXJtVTk2JSRrcgorazYhaTZIS2ZVNSY4ZkloUDgsJyIqQHBsSWYnIkZRUzJyJzhkcUhZZllZWjRmNGUsUVtoS1JyZVlWJzYkMEIkRgorQGBLbFlpSEZNVmJBU1NjSk0mZUhMWmBwaTZgWFghYWlhWzBiQSwzcEYkKWYqLUozRihYSlUxSXIlUCRrKichUQorbWNJNTZsUkgjUysyRyNmQjJxKkEjW2w2QzJEUDlxVTZpIzgoWjJiKkBKQDkmWSJqcSdiaUNgUDgqWWElIy1GQgorLCJrRmFKUiJyUDUmW2hwZkRlSWZVamIwTTMxI1E5REpSKEU4WiQnW2hqVlUrIyhNUiI5Y1koJCJINm1KZmhyYAorIVkrYEFwQ1YjJ2kqSShpLGFmVHA2ayNSOS02M1pWZSVKLSdHUCpMYiJiJzNpMk40I0UxQCtHTWBBWFlSImNgUAorKicrSjhgcVRERyohITlTKzBVMVUlQDM5RUImIy1lU2NpNFhjMzBtIkZKWkxaVmkyWSEpY0JLJCdiQEUiMmpAQgorKSpoZmJjbHImJzMlJjEpQCQ0bDZSbUg0I2AiQFoxYVYpImZtOHFaOSUlMCo5QCFQYEtrJ1NsYyMsMFRyKzAnVQorRWktciYxKWktK0g4JkhxTXI5TTMpM1spY0pNInFRZTYqUltaUGYnOUlRTEVZK2xiRUxIVSo1REgjW04kTChWOAoraCVQIjZAZSJxKUtMIkVaVVZMITMrViImKVkrYiJSSjRIRUlbZGJDaSwlaiEhVmgiLWImSk1LVkFiWWEhTGsiNgorYjU1SURWOGoicWE1I0IyRSxMJUg2WmVobW1JZkFCNFFLIVVYRU1CZS1GZDJwRm0yISdxY3FCZDgybXA2WDEpNgorSEVJUWhJR1gjJEI5aTE5YGkrJEMnKVQscmk0JWFUaGFLM1oiNichZk0wOU4rIWJLViIyNisnIUgqakwxRmIlZgorU1ZpNGMjLCZpcVk4JlJWZDYrUyJLJCQhZllgaTMoRlhrbEtSVDYscks4JUcqYSohIWRWNFgiSTFEakkpIlNqUAorNUlSMVkyVGhtbE5jbDhOR1RQMDJBJycpYC0hTWxJRSJxcSNAVVApLHAiIlMoYywjZGFlUiNEYSclUkBjTTVsRQorai0oM3EsJWFTcmM4ZiNAbE5pVjNIQFhtI1ZQSk1SVFhQWUM1KyNSZTE1KUhIKitDWlsrUyFlMyxEKWVNVCNGWAorQkBoOGZabUJMQU0nKTZhMGtJKmpLQVRGSGZBY1JkNTljOTQ1RShxKzVsNFQlR01JNGghITksajJMbSRyS2NKVgorJ0gzY0hGWmwta01pTUtWU0ZGS2szISNUamk1NWokUiNgKHFQODMtSSJqUUZgZlFLMUInMkUpRVplcEhDJlgpTAorLXJTU1RbSFlTNCxOckRxJ0lLZDAiNFMiQSRrRWBBMGtqKm1AZmxrRiVBQko4LTlaRkg5M2RVLEkoaylSZG1DMQorMSoibGAxRWQmZiFWaWMoRGByJDQpQ2ZrYUpsW0dCbWQjJWlaISxjMFFLIyRNM2ZgKCY5cDkkOVkrKi1iJGxMVgorLTRQRG0xZCQxMzYqLWxYNjhNWEZsTVNrQ2wnWk5lR0RDRSlUZGJVIycjWzRyZHIyaDFAQCcmcjNTRHFRU1BoJworNSdrMUVMMzlrM3EoMiZlclRxQVQrIjltYVAya0FJaTVEcSZlOFZxWUJKaltGVmAsJyZGSCVga0NsTUEmKjFoMQorU1MkMllgVCxaJUtZJkRZVGtENFIlUmgmMmNZIUwqRzUrWyM0WzgqQyVCLHBJQ2pJQ3IxcVY0WmNGals5UyQwVAorUmBOTDMhK0hOQ1orckVsYSgjYjRpKCc0SCZKJ0JLWSdQVWUhJmJxcGYlWWpUUE1xMkpRKVtOSzQrU0tLQUcsUQorTlk0NFNJWlhLLVpQIUFMNlQyaFFocUQ5aVVbVEQ5SGkqbEMySWFrMXFyOUhpJWlGMHJqaUcrTltVRVIyUUxtQQorYjlrRU5jM2liKjJFJmMsI3FaOTUrUSI0ITRsa2I0TmJhaFMnLEAiSmFOISRbZDYiQkAyQyZWVFtoMUZETGlyaQorYy1jJEBKSWBJVEZxLXAxQ0lgR2xsNkIwKDAsIURoIzJDNVkpUGwnLWlaUGMzOGBoODFqVWFoUmQ2bFgoWGBWYgorOSdDMC1VJGVBUS1ZVkNYcDIqMnJMcDkxQENrW1JTciNoS2VHVEIrJmBTITZsIWsrITlHImlQaVAwIyU1MjUxKgorOFBMMmZOTUNwW3JpZW1WZUswKG0mWVQhISFRUUZrZmwhcltAYHAyJUwqWlpoVSJAIVlNJy0kajVIJ0RDTiMoagorUzEqODFtWFphZiosLW1VZSpAKjIrMlEnYWkrakpDW21AQyplKUEibEBqYUghZkUhW1VMWm1lTHAoaEBUQmlpIQorbGtiRysycGpUQGlaWGNCNUkwS0wwQGUlcmxSSVFZZVJOKUBNUGhCTEZKZmNFclEkTWJqaSdARlsiUmlSWyklZQorInA1LVVITSRQQTAiOFAiZUhUKlVwSVtTTWkrLEJGWyRFWlJYYlUiQCJmKTFWRWNhQVUsVWJUSy1BKWxmLCZZZgorKERBUlA4QEhmW3BWM0BsbE1xIWZNYjVpMWhEai00KUlGMTVTLWNiKSJjQSNEaSdgNHBYMks4IWlQW3JyUVBlbAoraUA0MiQ1ZlArKkckJGRTIXA1QClHUTQlTEtDcE5gNVM5bGlmLSFjKCMmNXAwaUlbRk5VSkZpNiVZJlRATEQmYAorW1FWSzM0aWgsSjVaYTVjWUJsbFsjY1BHQCsySXItRCYpTlQhIVVxWzg1UktgTGshM2EiYUMjU0RtWiNAUVtNcgorYlRiYiJbIVEwZi0xcmtCSXBMJUMtW2VVRlBYIScnRCtGLCpZViRwaEEmYk0xNVgoNmhEIlRCU1MyUFZFW2glJQoramNGVFBjNWswcTVBOS1YYDZRZlpiSWsiaCtNSCI2JlFbKkNyJkNIa0JrWlk0R01KYzYqSlAjUWZGYnJCLGZNbQorNWBRa0AyTCxiaFQ2JCVjI3EmcTY0SUBgQ0lHWktSSzAlRylWIlM5bTkrNiZhSWwmNlJDSW1gM2NlMTAyKFZCTQorIkQjQSlramlmZCQiZG1GakpGYlRWa2BaWGIjNWw5aEcxWkZWR1ZWW2AkKFowOSJHOFhCNXA1M0UjWEBqW1IlbQorSUglLUwzVSdsJVBNWmhBWEFta1tHTGBjS1QlKTIkZFNpNFtRRlNlWUcpI2hwNExOK2ZgIlY5IWtba1VUaUMlOAorTWBQYWstTUg5LHIpNDZkKExAISMhVilOQFlRYVgnNFZKNEFmNGtlSyVVKUlDNFVVRCxpTkdxIScwY0A4UXAwWgorQDghUGQrRTQiVjBiMGtDREMnKFZKZmZVNCclQlQyaltQJilASkJtWmotVDlrYzQsSnBjSC1iQUxBaFI0UTZgZgorIjNIaSNwUCNLbWA2VkdZTUowQGNDS1JCLCRJKlQmNFokViVBcHBQIixUNEhNU0kyUyZESDhNOVA1JSpxSidyMAorSktSWlpyNEEwSlglLUInYUU1WEpDcmVLQCpjcClZamRFWVJOJzNMaUZHTlhyIVBYS2lrVk0lMEdIR1VNITFHagorVGpgLFolWUFLVFtBWiVhLUlscWtiR0YhJ20jMlY0K0lOaE4sQiw4aiMlWFJEZXJrW0opS1U5ImViUClUUWJYIworUiMkOGtwUSRBKFZgVSsjJ1tyVVZyOGVGaUVDOERMU3ApcU1OZEskKFpTYGUoNTImRmtJUi0jLGFoTDFGNElgaworbCItOU1JUytMU3JVZlFlWUlHKkpDISsxQDQ2JEFIY1ZQclBrI2xDUUVkJWkxKyooZlRVbTRVRS1gaGNNJyRiQAorI1FEW1tiYjMyUFM4YC1kLUBYajZkWkk4OHJlK0JqWWEyaEQtZUAjQStNJmVqQ1NBWCUmRmEybXEhWVNqQUAhRQorKUswa2trZTlRZVFObGtyS01wJDFTQ0tyJCwmcGoyIXE0MGBqOCghJUQoMSVBVXErKlFMUzVMWyVjLGAqU1tFagorWGZiUWpJIzVDJEJxS1tyRmwlNDMrVVVTWC1CTCY5S1lwIkhWZlpSZSpYUmFxIkcqNDRmZThEOWwjJUhicCxMKgorUEMzJDFYQkdoREtTbTYiMUMsaWlGYlVRMyElI2BZOEQ4M1lxckwxVjMrQ1QhK0YhOFhVZmtgIyFHMEFGa05QZQorJUVNTXI4NEBbRzBRbDJDOTJHKywtNFktMzYyOCsiTktUUkhkaGQjJ2lIclRlbW1FaElkYihHKWxQQWNQTiRALQorKGhycEFjYGEsK04zbShWIzMhLDRLLGBIMGRQNnE2MTFbWEJlInIlaFg1KTBbJ0NkImA4cmxxWEFDSSxLUTVTTgorI1tabUQyQDFKJCdiWGtFQyZRciVNOCtLWCJUOCdFOHIwM1QySmhhLUpRNVZDJzMyUk5yZWZWYjlHZSMncGZbYgorSjMhUUNyOTJIUnIlNEdhRFBAWGAnRyxDaXEpTkwlajZULDJWVkciZSlMQktMNWhsUCRrRXJFKEA0K1InQ2M0bAorSTMpS01ENjNJVERlVGhTSiJIaVoxWFAlNS00WFFAYkBLYlJUa1lYVTVyQUdJcVZSTGYnQjJqSSxHVVYoMGk0OQorUTAtUEprMTYnJEZpMFZFM2IiWU0sJ2pgIUA2UFosUSFESWxBbUUwSyhwNTJyW1NQQ1JsKGonU002bScwRSRaMQorRWQkTSVTYkdjNk1obShMJ2EqVHJFM1ExRWhpamUzJ2FoLE0jU2ZicHFVQlMrYFpMcSlGI1M0YVhgKmpCI2wiKworUHBtU2oiWyUzYjUmUS1WRmUwcjhTWlVWWTREKGlyOWtRcXFYSEsxJm0lcCdWSTZHam1kbWstMFQnYjRCaSwlQQorVGZqW0pZSVRCclNFKUYkJ2BtcUlAKjEqKiEnI05qckFoQCtVWWlbYmFyUyowaDlIWWRtS2Nhak5ZJCtxZVhESQorYiYyYTApM01bRFEkTShpSSMtY1oiR1JhVmRaRDlwU0NiYkw5cjEqISFsYSFWOUkrMHJLMktgKSFxKzQqcWpUSworJ1NIQlUyNnJoNGwsZENZRElgYlJNLXFgLShWUjJJQ0IsU1lUMGYrRkshTClSQEBQY1lLUiclaXBBJjRhUDIoUworTjQhQ2VJcXBYRSMjWFJqRG1qTFZxWlQ2OCtWI1pMSGwiTFoxQDZMJlRWKjVWWUVCcEdrLUxHYCUxKmZhZXEhagorLGpZanBxcmRyKzVbWVExNCpZJlFLUzZrQ0hYNShbWSJYWEcoakwzaVVAQ1EzISUqUyQkWiIpMWNmRzE5bWZHMAorOFtYakJAR2UsJiJyRyREWigrIVtsUU5DMy0rMkplNlhIZHJZSk4hIWxhNjYwI1VhNWkzYyciNFRDM1JOLDhoNQorS0pRY0thYSQ4QThVQ2szJWlsVCEhKGMqYjUkQUxCIkpEa2ZAQFlWY0JgJWxxKEpoQCtHYi1MSTFrSVJSZFMjVAorbSIiZmRYcEZqNEloZmU1JWAjUVprY3EpZitOJDRCWTEkTCphI20kS3E5NVBMYjlTJWpWaTA0LShQcipMY2hhYworcHBGJVlsMCtmYVU4QlFVJFtmQWpRLS01RCZSNWlpWkoma1gyI1goSCdgVWEkbTZaUExlIiUxVUJpWkFIcGQtUgorSzEkUilZKGlaVSJkIk1QSSdaQ1M2VCxiUGpLMCdOISRgY05GaTBiYGMwOTNkTVgnRipHKmtrSSFbNlBDVUwyMQorQVEpS3AjVGpVSCxlNGVTS1tAUCdWZChjM002LFNwYXFwVkUnaCoxJVpWVHJSMypKOFMpJEMqZWVRU2MqUFllKgorQywyNVY0WGFQUmghRHE0IyYtS0I2KiNAWUtDLE4oR3BRaSlYNkYqWlQ1Wy1FaEhZQUVKKFg5SEM1TUhyOSRBQgorWSJFTUhxcSIrOXJOMDRKJ0VsRkctS1lFLCZxKzA2R2gkMkloKyskSiMtUTQkSWtkcUMpUyshNWFHNSotMWRmcAoralVrZElCMyxBS0kzRFQkRSpZWTIhJSJwaGM5UVNrZCFUbUViTWVUUjgpQWw1ZlhJMEVxVjVmQzVbUCEoSkxZIworOEBSR2tGIjZycWJIVE1YUkwpKTg4Y1Q4NExGS2YrYFNEUGstMzYnNjVCYGFmM1tQRCpQW0VHJltINCdUWidWUAorJnFCKTUpbSFyJGJKSVRLRFNmQUolQFFHUiEiWDBFVSxyTTFSIjltOVlOTGk0NSlmaFEyaGo4VCEhVSc4KSdRTgora0xTLUhgTlolJVhgJ0glaEUlSTE4M0k4a2pFW2lkZEhTZm0xcVk4ZEppRmInJzMnJUlrIWY0cVs0NmYjaCRtWQorcWZaZGMkIUM5aEZJSTJEckErYHJFUGAzaW1JWDghM2ttIiRFVWJTQiZUWzFYJFJOMUJYYCNDaixgMCkiSTI5KgorKGlTVCU0MDZkUi0oRTYhLCI1QVFGOEtOWEUqWG1FYkRISkliJjZTbG0zcS1pY0koNE40WWtMZSRlJkByTThJMQorLSJGbGElbGtIKmAtLXBCYDMhOFhgOHBKJ0pmJ1tHZkNDOTNJaFVBaEJMJ1hYNklUWiFaU0ppW0doJTk4ZkE5RgorW1okMlZrMmlFW0ZBUSRUVCdCKWtock5HMGI4Ymxga0tsOSJNJjIyJ1stMSRsQCZtRTVkRic2MyMtTDNJQFpgWgorQ0EqOTBYYCFiWVROWDJwNUMnJiZxQzgqOWZQSTMrQmNbZlhHcG0mciFZKiVsK3JBMjMqJkQxTGVZVkJOcVRrZQorcVBMK1BDMSIlTCpjLU5LSihyWVVwVkhaSCxBbWJjVFtVWyQqQkxqLSJhIVNAQGNIaCEmbSZiI0UrWUUpSjVFaworSythRVJMVkkoM0E0RGBHY0xrNSxpMictMlFBSi1BJnFGSENJQClxM1hQQ0AqTS1wZCRhW2RjZGFLM2lgJmNVKgorYUEtYHAnSTQwWVBrRWRMJW1ANWNkKlY4UmU0WnEiQlMmUVBOcENIY0o1YismUSRyRnJWOWtSI3JMZllBaGlbKQorQlpkNnBmU2pRJ1NwOFVFQExyImpMKUNtRCtYLTZBUyxQRFEiWWxhKiVNJ0RDS21GbCtRKThHUm0mYylGYShhYQorJnJGUUw2NkVJMSsiS2Q5KEdHSThGQlBxISUhRUw0YWhrJGxlWU45LTZWKG1UUTYhazlqaUBUSTRaJWJIZSVHUworUidoNSYjVjlHMWlmK1hWOE4oLUxmM05tS0tIMDhlcmEpOElCRmVrU21gJDQhS2FLa1tKJ201JmRra3BZJipOaQorTjBiKU1kUls1ISglVUssYFRsUkxTJi1BRWtxVUFlMUkpKzMjMmBWLWg2S2NCKzZyJiQsYDBtVWhbRklWQjZDJQorS005MWNkQlBCMWNhcVlocmxhVXJFalVqUkUzIUdNaWFMNDAwS2whVDQkZUFFRycrVlQzUSpgZSEqaVhZOVhSWgorYTk0KTlUaltxUmVWSHBwLWoqSjEyWjFYNWBRWSZWaDNHS3Ehck5gYDRALERSSEpAcHBaLUJAMkcpOWFkbUtTcgorJlRxSzFtVSdhQFpkMkByTiQ2S3EsLSlGWVtaLU1RRHBFWDhaUkwzLEFrTDMtaiZjNiMhRFBQYkZTSyZYQyo2YAorbUQhTGgtRHFEQDFqJUdDSiVEJzZMOGNKYk4hIig4R0gqK2VTNGYrJE02MmElSVpxZnIpTGs0Y0NBbDBYZGolbQorYm0xWmlgSVZsIllUOSpqTEMyWThjKzZHW0pGYklFM0QlS0lxcFZDZTIzVmEzakFYbGtZWkI2RnAhIUcjQHJrKQorZWtEOCRJY1syNWYyaylyYkAsNDBBRG1wNk1FZClJUGlrMGZYTDJmYCpRNmosYm1RWjhDWTkwZkRWMisqWEdjMQorVjQmUFVRVGNrUFAnYmtEODFjUE05QTI0Ik5sR04qQmprTSQyIyFFVHIhJltFcVljUlIlQkotaHFxYiRscjhMMgorJFhLVFVNRDM1SEJsOE45WCYqYkk2IUZTMCZjKVkrJSVObU4zYkcpZUEzMGRZUDZULEJgMVBWRWpWIzJkM2lgMworOFtlMDREcjlhcWNVMiVqQ2kjMyImNlUmRCZQVEsoTE1JaShjTVVQbSlhUjFQJzZsUkZbTSxyZUswTkRHOWAsIQoraTJlMlAyaGU0J0NaOCcyLFYqYyhJOGFlK0csR2lEUytNcEVIJ3BUQzlDYipBcjROaDBwOUkoRiprTmY0M1RSSAorS2lVR1tKIWROLWUjLWRLWilScFhpYFshY0kjaWAiZDg1NjlgNkxjW2VMUlQjNnBDMU1INWokbSZrJEZrKWRhaworNG1mLUZyJGs1TG0zWWkjcmVQckBHJVtYM0QiYUI5YmRjWVlCOU1sWGgqZWJMMjkjSSFWZTJLQkEmSlZpNlQnZQorYTRoM0JrLSwtWltjNUlWVFkpYVYwNS1xI3JGLGZYVVpbSDRQWmYhcTRHayIpam1GJDVJYyRMQFstLGNgUCM1VAorYWhUZktZUC0yKFg0NUFwMiZmQCZmJzVDaGgoSUExRWNFVFY2RnBkNWI4NU0yLGMzR0dwSyNyLWEocmJxS0tTRQorI0I0YyszMCQ0WHFMQHJRbUdMUSslZUVLNmwtJkUtWmkrR3BFZWRkYVRVSShNS0AxWCoxM3EsVTItcllHYURLcQorRExGWWBHVWBaUTQmbTE1YllpQFBZRCZRLSM0ZG1FSyglSGRYUyE2ISFTZUw0KkBtWyUrSGpoQUwhMTRKbGNJOQorbTJoVTVWJSdRLXItZUdgYyUjaVNEcDFwQEVEISVlTlkxcWskQzBrUTFLMCRpRCFmayZALCRbQnJbK0g1K1VScQorcEpWMVIsRVopMUZGZUVlYmZCJCpMJ0xma1QsTkFocTQ4SHBQQ3JyIUktSWQ0YHI4aWghLEYpTWwiJiszK1QlYworJkROWVlHS20jVTBoR0IkODlmJ1ZTY0hVQ0UiJjEzaitxM0hAUmtJWTlBQlBiZSIzI1NQKWlmUiMicjVKZVNKOQorR1FoUiI0ayZyKSshQzUyR1RKSTA1LDJpa0RWQ0BTNiZNNmEjOUsiVXJAI20zS2BAKVpwVWRCKFZNMzhaW0xMKAorYzNTaFAwajEiMEBCVjRgUCMyUmohclslQGUmbCIzLURpITlKYVJga01aaGBjRDVKMllEQmVGYitGcSslLWZOSQorJWFEVHBWMSIxWGAzWmshUS1maGw5Tk1lYjMtQFFiY1ImOWIzZWNDZThtREU5cCRyWm1NW2wiSVBsQkk2NCxhaworaTQtYHJNJWlhW0YrcUhJMUc4VVIzRmonSUwySVowRERoOFZgJnBsZCpEYkUyMUZWcmFoWkYiWTFiKWhZbTVVWgorSFZCRW1CMyUzNWw0a1IoaisxQiJATEY4JXJNZlVyUEFRNllrWCVbSThBTidJZlViUipYRydoNkQhVDkialFwQgorQzVLS1pERDRjYDIyKUxsTGVbcUNlMmpmOXFtLSooIjArMHFCRFM0RWwqMUcoOVslUS0tZFsqImYnQFVOYyk1cAorQCpIWVpDSkFZQ1Y1YkJGVSxFISUzS0IjQTVsUFhITlElLFBoLEdRVUYiaFRVZS1JcCNqbVlwI2NKQyM2WlVpVQorUUgqSEsyZCJIZlUnbHIzTUBpJiYhZjglMCtUJ2BULEAsSzFkaGxmKzIpK0cxYU5iVFkrIiorKmpARyhIU1FoOAorJUgiOENZMDMjUDk2ZTZDYFJORFZSaWZQLFQxbSVlcCRISTFKUyElNktLQ0IzQCFYKlNOaEstU2YqYEEiJjRLRgorTik5I1VtTS1oTTItclNhQlBNJTgqQiYqcmNwSUVTIlkmZTRaLEByZDViWDYyOSVHITZCUmg2SUhhTCdxQTNMJQorQU5TSFhSaW1IKGMqVmhYK3FhNiYsZTg2WTJEQUBjRjFoQyFbLCwiIjBYKXJEYk0xQUNBQzA0I0M5Wk5GQmpjMgorU1NNJTAmTllWKkBkNFJWKEJmWENLWyZyVmFTakUoWDhFJForJmlMODhQNXI2MygwRyhYRGlFcWZGRENqVVNbTAorcURFOVEsQiRIWSlbITNSYjMhJDhFY2phNSpRNDkyM1MjJ1hEUmk4cEcnbTRmQkoocUUnQ2prNko2InE1LEFJNAorYmFgKzRWMExgWlFkS1BsVFEpYkNHNWhrWFBETUJyRkUkYTBQTmVNITI1JGwxSFgrIUJLNGJNYlFSSiQlSSVjKworTHI1cVIqJVBqWTlRTk1OWWRlSGNOaltyTCgiOFNyJCdEZVooa2opSCpDRWEyWWVTRilwKlRGM1VqW1NbLTUnNQorSUpIQSlwNEtlQ2QxRU0wTnAkUTArWEtpUkdgcixoVU1DazNWQDVlZUklNiY1RzVLOThkWSRNaHIwIyMsQzZNLAorbWZKMEZlZlYtaSRSWiIjI0c5aUY1WXEnQVJpVDEjMCspJTNoUENiLCpFRSM4M0JUWllQYFJsJFJhaTUray1LIQora1EtZVMhcSNwOSkzODBHIWo2SmRMLEdqZCIkcFhHUCpraGFLWjhoOTFZJ0xmcSI2RnJYYXI5JmA1OFNEUDApNgorJ3BKK1QmTkgqbStbI1NKZk5sUEBpZTZsTDNiIzEnJEkpWXJMVTNMS2okVnFLKGA4Q3BOMlFAJVNVQTZhLVsmKQorTSlqZSMlUjhVZjVZciZHQWFHNkZBLSJgIkxgVmJgS0BmZWoxU2VjbGUwJjklSTk1aWVMVlFiKGIxK01KJUc2TQorITZkMWMwQ2ZMNiw1NmJMMWBEKlJHSzVQRzZbTkgmZlRLaGtwSnIzOC00WTVEUXJBVVtjbEJwOUNiLCdxclVAUQorbG0tbWoxSEJDa04jNSwjMGBZZmMka0w0MFhwY0hkW0RASSo2JlRVWFkoOEM4UyxUNiFhLFQtQyxTbTNjRFhoNAorTTNNalVAJidHOGplamE4WEswVUo5LC1hWUFLQGFyaFBQWDRacVtZcUdOaSNGSSolZTRacGNHOCZwVEJqOUQ5SAorKjlUTDMhITg5NlVRMyEtRVBSMStpWDZBISUsaXEiaGYsOGNQalBKK04lOGtgUCRaRUVwTTUqWWQ0KW1HVUQsKworK2tIQjgtK0EtVWNja3BDOFpOWTNWQy1oJE5pKWtsZWhCSEVgMSJyRUgxSS1JKHFMRks2VUM4TEg1UDNUNTAsbQorMUk0akZlTCw5RylETSdkbU4nJCtJWytoIUpNM0EmcjY1MDE5YSJBIVhGKm1ScVpNcWo0ZVAkUGtwK2glcHJjRgorYmQrWjFSRlhOIThScCpFQHByaUZySUMrK0ZsKlEiYElGVnJbMHBZSyo4Q1hGaVpYS0dNZWtNSTI4SERLYmBSWgorKWJaQGNUa01NSlJCZilrbTBVWUFVQ1spayhCcjZLVClhYVEnQE0yNSUpVGhSayNJJyMrZm1lJFJjVUByaCNNVQorUDJKRXBLa3JAY2ZDMDgxMFE5ZGhEMClRWmImUC1DI2YiMWYoQ0dOSiUsOGNNWU1rMkJhNHAhckxbQERMJCNVYworM0JrcEExLSZtaS1BakhxLDVBaDFsLXAzWi1KNTVGUyFFNlBJYmpSUjYmUDZDI1pAJkhpYUxDKCYkKEhyWzRGTAorSDVaYWlaYUtDR1UtIjMzYSUsWWVoTmsmJChYMzlxcVVrYCFyIlVCYjZSNSlVOUhJRFhtRyEoYFtaVEhgcVFlYgorLSxpKyE0JilVIU5gW3FSU0JKUC0wQCosYSJlM3FYUmE4TSgnJFghZltMI0hBKyVBUkksUVgkUmNFSFAoJEIzRgorYUBxckkoZCI2MUtpUWExRilrOEdtMTQnUkUrTmFraERjQ0pMKmtlUyorQWRqVTY4ZEBOYSMzQSdTWiU1QVFkcAorTHAmKmFCbUlbWmFEMDBYWWVQTHAjJ0YoZitYWmQoKSUyJDFaVWwlUydsTG1GKTElUidNNk1OISQpY3IwSTQkSgorSCFBbCRJOGsqTGomQWYqQUhNVEVJOGtDWiFHajgtUWVwQmIxZiU1VCZIcmAoKDNZTUcrLFliSi0sJlMzWmkzJQorRTlyYDZUMFROUUAsKkFYcFlEYFIyUkhbOHEoa2NWUTUqMnFxaydsLUFCSWVlSzRoJ0BZWzMjSzJoWTVBTDYpcAorQGpjIUhKKUtUOFhNIShaUkNWOCdEJkk1VSMjW04yVEEmITZaJkplKlkqVWIwQDExTEdVIVUwKVBxSkUtcWlITQorNDVjIlNwR21aInJMcDVRcHBFSUs5aGkiTGBrIVVWVCUnWlloSDBFNjFmWSorK0FrQE1icEswMjFiVE1YKjVSQworR2QmbEpDTTVoUVpIYTI2aFAsRCItRiIoIy0nQWBFMiJaaGlGUmJIaCInNVooaCJgbWslMTFDLCZFZUZyJTkrOQorTmYlTjJibVYrQUQ2OTJSQS1LKTY2KzIyLGIxKFNBRmVOIyUrJ3FmKEtbanBBMGMrU2JTZkMpbUkwSkxMOVljLAorR2hIQWglQlNgVTIxKEUkQ1JCck1raW1YNlBWNWxKWnFSQE1KS3FGa3BIbDZEUjQmZGlFTW1oVEstSEFNKWZTJworJEApNUkpRlBZUEEraEpoM2ZsRE0wY2swYWgoRSxRTVkwTVUzTDhxaFkrUiczISNFTFBgTS1jWDlsJzZlSTNRZQoraFMxVDRhUFokYXJYciJKMEltJ0hkVCc2JSk0QkplJSRKcFhqYjhhVlBqQXJaIWBKUDgkTGFOOFEhJFhJKmYrKgorMFJGMTljJE5mRWhBSjknOCgqJmxwaGAoWzNMQ0ZjcEpFUUY4SUYtM1tTRkIyW2UkKCRsYmJDQS0xYyYyKUtIWgorcCZrWVNWI1M1VUtFQCpbOSsoJShpI2lWaXIoMURBVjIsTmpYME0xcjgqWChiQCtGKjgsK0A0Jy1RJXJFRjMzRgorcDhOS0pmK0glMDNWaklRR1BmJlE4KmtVIltRcENAcDhkcENoKXFmbVpsUyYhQjFBQko0R2ApSCttQ1pTYUQrNgorYDVUTVsxcDJTS2tRUixwTUBiaWRtYDhYQzUkJmpCJEdaRSMiUDlsamIlMltkNUshREFlWzRJYSoscCMlZWRQNQorTUlHS21VUCYtYElVYyQlK3FyQyhrYzVUIWVoZGktTXBbJWJAWnBwZjBbRUgoJFlGbW1NQ0MrIkdpZkg4cCpBagorVjgxW0lHZDVQKDllcighVChsWUU5RUpGNUBpayo2W1ZwRVYxQmxaQiFlJWVSazVEQVJYTWgsSnJWS1JJSjRpUQorUFtZK0FDS3I1TiEhLCEkRUonYFYxUSVOTCwtYUwrVGM1OWRTIy0lOTBCayM5bTRiUFtGS2JDNVJsZXEnLWJlWQorTnJUYDYlUlUoWylgSWo0RyhHa1RhRyUiWEVRWm1lS05RKnJJamtDZGptQFJDciUtIitISyhTSDlaRGEwJkgtcgorQ0w2VHAjKUw0KiZmSmxwYSckISpxIWhYTmJRalszM1A4ZlApLVAlKWQmKEpWLFInQlNqJyQzKmZVTkRkIyExWQorR2soaichcE1NK2VyQjlrcEhlQVVwS0RlYFZVIUhScSVybVBSTDZRK2VEKlZpKTFKUXByRSViYkQqK0RZU0pGSQorRSFBZlEzJUhIS1pQJTEncVZGSEpYJmwqakFRYCNHW1tNZWArJllwLGRmNUZOU0otUTFoaEpsaEdmJksxTGNhMgorWnBwVDIpMVYkI2kzWkM0aVhhVWhJLUVHVFUrLXJOISRpcGxrMGUsYmxxMzghSHBNM2FQWDYsUSowSFM1YiZsJgorLSYpcCsyIipOcixiKSVpU05bUDFyVllhKmAmWzgkYltgS3AkKTlUUSIjUWNwU1U0UlUoYjgmU0JwIWo0KCtGZAorUEBZI2NSNGo1Q0xtRzVxZEFSTWVFZUsyS2k0VEckRmtrSi1gIkQ4LUEsSmMqayxyTCcpQWBLIlJyQC1pbWBbcAorQCtqQysyMElWIytiLUw1a0oxNEFtITltQ21Aa04rYUgsWFVpbFRaWGkmVnFgM1hITWMzIUNhVlVaRXFqZCdjKgorOGFOWU1xNS1pZS01UDhtJDYnS2MncGEwKWwkWmtIa1JLUWlSWkVYRkYxJ0BGNlppJkFJIUBjJTRkUEtAakJiYAorIklCK0VgMlsyKkpjWFQpZmpKIk5LayJiKiVBQ0YyIlQ2WDUnREhZYlohQ0JxRzJkSSNiYCYiJVAwOGhoZWYxNAorQDNaa01WJHJOOWUqSmtWWiJUSkxkJVBMbGZVMDJAaiEhSzZiITJZJGAoYGFQazNQIytxWkYkYDVoaHBQaClCJAorRyYmMjRGJnBTK2xBNFZEQTVAWiJlUUo5MFEqISEkVElBUyZGNFZKVVVgRGZkazQhSGhTJzVLVlNBYitWIlk0aworWGErM0BlM0tGRGxBM05lVWNtKSFRZmU0R1MmMixTNU5BIUk1MlhTam1kJmhpQFUoJyY2KWNURSskWDg1LVYrSAorMkEqY3FrQSdASlJgbGJpUCorUDFTOTBDcXFVUlE5aWBaUWA0MDVhSlo1OSZOMU5HU0lTInBaIS1USTQrMyEoTAorJ0pgaFJxVS0iJyEnMDViMWhpYENsRjNbSU1pZmJiUVBOIjVgIzEjR0YnJWYmIlpBSWhDWC1lYChZcmZtazJrLQorYEhZcFJaLUg1WGNpQ0EjcEVTZFgtUVI1IVNII1ooYnIyVkxUWUcmNS1bRy1JajEiOTZFUFFkI3IzWHJgclYmYgorbCMrSXIkS0MxK0hIYkwmM2txVjkwUiJCRiVpamQiSmE5TDRRIVgqYkNLKyZZYTQyaCE2SWtQZFlbRlkxUiFSagorOCxiRCgzcmFjJSxUQmkmaEktbEtpYytsbTkzMyk5NkFsQmlVMyEkSGYqRCskclBbcFJbJVZpJlVgLDhKWVUzSgorQzlBYSNpMS1iRUlCY0UnYSIyVlJjRipHcDVaa0UkaEciU2tBTmVEZS0qaVIhK1tTMmxEcSFKUDJgTGBDcmhVQQorcDFsJkJSIzA1NDQwKW1tbEEkK3EicSUpJSxGSUBwYSI1QlYhZEImWUkmaGVWMk1gRzBQOFkjZkw1cG0hTUNGNQorbGppVkBaMS0iVSohIXByQCxpLENsNElCYkwiW1RjaEVHMFI0NCVQITVFKGk5RnFRYHJWaTkxOUknNTJAKThiIgorY1JScFplNmRYZTUnQjNqbEpgLE05SjVMNkE5bHFMY3EzISdwUW1rU0JNYylrJFhiZmg5LU5mbCkrLUUqMjFLMAorbVtVWVYsWzElVjlhLFhxZmppYWZoVklCJGhhYmBxTDFsY1Y1MShMITRDWjhyMXFpYUpwMFByTS1lQTFbMGhaSAorKilEMlJWWio5QGU0I0g2SlFVOU00aERWLCFSTVJEMFokUWxxKGVRI1pkOCZYUlpNcm1iNkdNaS1QTTNpY0dVOQorUFBwIk1qKFAjKmxSJ2QzQUxxbFEsR0dHLDBAVWtTKiEhIVIoWShqKVAwVktjIlAlSWFjbTEzRyImKiRrMyEsRAorY1BqaWRYbEFOQ3A1NkJHWWlOS1hmOVEzUUhsMk5UaU5OQkwkSFZHTWQiaCtpKmwiWUElVlNAQ0EsOFtTIzNkWAorTnI5YWtsVlVoMGFINWk5MlMqMnJYaWgqMzhiTkgzYDUoa2lVMyEqZkQySVtJNWhEQUNxZERbWkFqKU1iVjlscgorUSwkImljYShZWFZqMFEtSVppIWBDQU5SLStkQmRxW3AsW3InTltsaitlRERSLCNCaWxVMGIpYEBrIWIpWTItIgorQiJgUVs1SWZaQSJHcWsoJ3Jgck02QzhwYGBmbSU5TVUrLEwjYWFiSWFMWDZqREZQQGkqSmxyZUw0QTBDMEZgaworRSVGUCskZkssQUctOUNlNltSOTJwOSpra0goUyZyRCRWNVJDR1pxTmxpQiYiUCxUS0tIS1pCSDZyaipQNidKSAora3AxTjJhNFBlW21jUmtOIyoqTDElcktwJ0NpKjgrMygrSzJFNU5OJFlRNiYsSkE5W1IqSVo5ISgnQGxVNmBFZQorS2BASlFRZFtCQyRLbGRkUkE5Qy1hSEFtRi1lcWhrNGVFSzIwQys5UzZKW2BFJks1WyQpTURJajFNQjY0IilwJQorTFBLMFksJGw0NCxWTTM0UGU0ITRYLW1UbTYqOShGUyVKa0BLJ2VBSiRjJStkLStiRTArYGRpWSVpZSkwJiRAQQorNlFpTDhkUSJbZkFUK01MLUtrUi0xM2xmaThsWmZDZSxQcChqJShkIjRpISknYkNDRmQoVS0nKlM5IXEyakpAaAorQSwlQlU5QUwzISErQmlwRlsiRGkkQ2tiSmAoIyQpSFJacmMkMSQmRjMjSmolK0VHZWYwKGY5WyI4KkxIcSlkUworI0woJzIxRjBrTkgpJFI5WitVcS04MGsmcmNQUyZBZEQqLSVxMyEncSVyUTYzYStkISEmcUhEbUNoOE1CNWEpKgorVGY1WlQwISdRJFlpR0ErckFONWZbLWFUMUlhSjQla2FqJjlTajJpNTVqNVRpRU5EVGYrMGMlRUVTalpSYzlIYgorRWplYVBDLFBHYjFhMFgwYSRFUEBNaFpOYkBtZWpgIVtNYDVSTGRjNGM1aWkjbGtGUCpJLURNKTNQKWpATCctUQora21WMSlAMUgnJzU5TGRJM0lCYyxaIUQwaCRmWltYMmBoM0wocFRTMGtsKTJHZjAqUlY0M0ZKYjBKJExLcVVQOQorTjUmZVttWUlRNUhVamk0aGshKE1HaChGYk4hI0BwQ1EpIVBBRkpJVVgpTSoyLW1VZSNCTEE1Myo1ZSdscWNSKQorYzAkKiczISdGLUxyJFZIWmYwY2JQZi1xWiNhSzRmUzNrUXFWaEBVIyNpISFHWW1ybFtLVVA1ZDBoJklDLStwTgorYUlRSFBDYSUrYihDODhKaSlBRmxqRlJWVEMjJ001UDFgSyYpaktVKSw5IilMYUptWE1BR3JBalBmRVBJKCckWQora2E5YUlLJloqVUxBa01hTkwoYGQxMm1VJjYza2pkKidHKVIhWVFDQEpGSUFQWUwnUjMpalA4aFU0QWRoclBYQQorTFpaQiQnRVpVbSFoZTIxRCNlbWhyJkRgZFtMbDhYS1ltI1FFa2hZZUgzWFVMOFA5VWloaXByYEk5IjkjNUJTTAorK1U2RFI5RyRFYDArYFNxLWVHbSJAaFtbW3JMNE4sLC1OLWNBTGNRZipkVVQpbUwzZDVGITlKZkBiJXAsLSEiYworOSVsJE02ampTI2NwSkJyKjliYTRJSkkrQmUmayJwVG1AcWRaWisqISE1LScsTTlaTCNGR2RScDVAJWZVNWU0MgorKE4hJFZwMU41UGAwKGpyYEckMTA4aDlWaFNHVGZARSIwMVNWRklYcDkzNVZUI2lCcWVNYlopY2tYTGNiaGUnUQorRltrVilxcUtRUClHQmkrZCwmYyVVNjlpVkBSKUlBJUcwOVBDMSxxVkFlNXJwOUZZUDBlKUBabWtNUDY0Ikw1MgorVmVgNkBFUFNbKzNtSDA5QUxZWlljR0UlQkNRQDI0NFZbckklIiUlUSNZSydRTDhEImNjJEVwRmRMWmtBJjRIaQorckszZVptTTYnIWBQbDZOTSU0ZEg4IyZsR0lwJCpIW1ktIS1gRWQyKiZBUUZqcjkmSkkxVFlHQEdMUXA1MlRWUAorM0ZibCYsTVBCTUJGQThAMkssQURsOFUlMDhBKFUjLElSWGFOY2ZUJlEiUyJULGhyMitoR1A5a0wtWnJyMEJILAorMnJHMU4tYkBLQWEtI2BLQihVNVZkOSthTWJlaEBCJjBmRiwxUyVTTCZTR3FoVDg4VWZFLFZWSlZOMWtZLDZMTQoraGVQJVNGMkVLJGJrNCYoMUlJajJNQypbYytIMVhSViMjQFQpJVhGQkdUbGQhR1JpMloqY2pkK1UpViIjKyVkcAorUisoIkRhU1ElNVNCSWBOaThiJGpMTWxlRURKMWJLI21UVlJCSyhqYkEkRmg0Qyk0K1ZTIiJwJEolWCdFayFrUgorQ0RoQTQnLCRSJmI2amRQIUIqcWNZWCpoSFlballZOTVsYEBwRyEtQ0BJLGBwaVptJjZjKS1UUWFJWSNaaE0rTAorW1lETDZVY2Y0KktaKiohNipbUyItIkZHMmlGZkEwcjQwQmAmaUsha0FsOUxZNFZSYidCTWRoZiJRJnBSKkxyZgorUHBKclYhQVpYYEU1aEYhciJEQ0QiIzNwZjQkZnBNKy0mTCdoJEtbVUBxJCMoZVg1IyUscmwmai1LIWJbbShxKQorOWgmMypDcWI2RlZEcUBUaixDcDkpUVlmQkhOKVNlYjBJaktbUyVNcmMwaDJpNjhjNDJyOVBCMUJMLERNcEVrKAorbE1hI1BwclFlU1JOOSJQLTglbWJKMTYiSiFtJzkzcFInRTZiJiYpcC1IJEZaVi1xIUlBZmw1S1FJcFM2bFIsRworTEsxamk1SUQ1RGklR05ZUGpEVmBGJVpqW2JtKXEjJShUR0pTSC1SMkFwWlhpNFJSKFNbR2tBZTZHcU5gZE5kRworY3BHWFEiSUMjTSRIclEzUEZDVlJTIShBRkBSU0hgJ0JFWWBlKlFiWmA1USQ1cFohRW1QVTElNURgK1NyQEwrTAorTWVTWkljYVIjKDJHU0QlJCRMZTYqaUdxckxWUEBbSGJDSXIsWFBlJlpVa0BoZnFjYnFaMFMrQCNOZEtMODJqNQorIlg4ZEpQJmVyYDEwaVAmTidSakMwLU5OTlJiIjkoRHAiS2IlQ1QoIk1NU1JWZlFEZXJVRWlhbTNSZShoSyMhJAorJU4hIUFCZkNtQmoyR1oocUFoMDNLLUIxcCYhVElpJFEoIlByKVMoKCxxcHFkYy1WYGtCbDBMZElCYTVxMyEyOQorREMkSnBTbFRIR2BgNUhhODlxRWYralhOamAobSUyQ2JlKTJSOGpmcVhOSE00TTRrRVlTY0MjS0VBM2ErMCFHUAorUVpSVUdYQltKQ0UhYSFaY0xwZWBJMEdbUXFQaUcwcEZbVEMhITlmVFUkVlFQOVJlaFlTaFIjTSRSVWJQOU01LQorYklSWTI1W0AmNW04TStpYkdpTlBwME4yMShxYDFrUVBqIUNpMCpZS0FUcEFNaUFkQFpbJlFYJDEtUjlSTEIpcAorVm1RajVJSSNxaChSayxEQUZyJU5QSUksbSwnRnAhNDBJR2hQYU0hYS1pZkhbbU5GImFrUi0wJitpJmQoVSpjQQoralFiJytLMktZJUlRWCVxR3JFWFhgU3FOSSw2cWphM3FSMUMyJ1M4YGNIYTVWMzJAQSkkLFkhOWNpIVhraExORAorUyRacUxHTWFJcmNxMlJOQCstcmtIUTAyKyQ1K0ZgQzhNLVprRkNKQyNycidMNkNwRDBEUkQxVmEqWigkOWsjWQorQDkrJihHIUwlMWpta2VASkJIcEgkNmtUcmVUa2syZDNlUjBhNVAoQ0tCbCFbYENVKydhYWgqIzlMYWlaY1loNAorNSJYZVtNQipwJEBTZVNoS0ZbKHIjWnIzSnFCNE1sUVgnakpScUhhJyonaVUkRCYsQElaZCJtNTBhY3JEW3JOMworS04hISQiTEtsa2JSIjlDR0osLHFHKXJaSlEyQyo1ck4sNEkybGRUWGkqYytJNCRbLE5gckdyQGM2OGpUQWZOTgorY0xNZjZETlliMkdpS2EtWTNrVEpNJiksbWVAIidRRUNrYVZUcmJMYFkpRChgQjRybCEwYGBHRTVtRlYyZm1kVgorcmIrIWhRTE5qYlhUals1ZTQwRWEoISRmcU0nSSg4YFhCKkYsI1tLQ0VSTEUsWkc5SWZkNlsjTDlHTiEiVS0qZAorOEVOVTJtNVtQYzY1J2tTVWxHW0whOVAmTFBTJyooNSUyRlpaNkhQM0JgR1hgZFBrVW02alRraTApVHFYKGpxLAorbStYYC02JSRAIkM5YHJgNVgyRyhQVU5AKWJoQyEjRyspREgxUkwhcGxUYE1mbGo4Y1grJ3BVQzQjSVU0WmZoYQorM3JSRyFTKEdKZVRkITIsVSNHIjRWIzJoMnBbaU5Iay1pRDBCMCNwTUpkQDJYMiRmVHJlIlpJQVlJUiZwSFRtaQorITYmKlBbIzBlYTNENCpSW0I0KlljZXBSJSRUSmJgKFAlWUI5K0NOW3BAQVtGa1glcUBgWyJCZDAjRCtScisnKAorK0Q2VXFWRUpVMCFrQCFlYWtCaihjNWU4JVQtcDVUZmUsR2phSCxsKGIrWytiYmhxTmQ1S00ocEJoU2M5WGNpVQorJUdQQVokQ1JhJiRsRjYnQWxENEtqZnBLWmQmNFszViQxMUpJQVAqUFFpNiotcjhNTGglIWhKU1piSGpILEwobQorTHErOVJWSVViJTFkJUlSWio1WCdwJ1InYWxoKCMtJVJTNXAzZFsoLUgxVU5RWVlVaUg0OWtYbWNyNk5xSihqYworcDIoMzklUjBLUCJZa2s1WVJUZicha3FxRFNGaiZZY1onbWNhSWNaVlYmUVVCUiwoNm0iKmwiVHFZaydiIlFlKAorTTVjUyNScVBsJyUjJWhyUShENERGUyMwWmJqciQ4bGRLVjMtIjBGUUdHNFhYSEhmOSQ1ZVtNIzJWUVpxSUM2RworRzEmakYzRUI1U0hrQUVaKjYtamJqQSpZQkVjRmVHaGZyVGk0YyhpRmlsYURrOVkjUkMsKUdiQVUwRlJIQkBbagoraVkkUjRMNXBERkgnVFlsTElTSjI2IihIMyElSFhyMltGLGVpaTNpKEBEVS0wLGgkImMsZFJjKUBtaiY4LVBWMworYiE2WSxyIyc4VCFlKGRQZFNsKW1xSzM4UTJpJChZQmU2aWtGTmk2InJwS3BQcmYrY0wxRClUMkJWJXA1TS01OQorKCNgTkhoJDZHcURxWUdjZG0qSVBpaDVsLVFqS1VrZUttOE1ZWCsiVWBVM0NsaUJAOUNoNFYwa2xbJ1lUa2olTAorbEBKNGNTcDJiM0NDWnBiamJTKlBpaTM0IkJOZitZUltaSytgaEgkLCskMVllSysjNXFYcFlWSWNhY0csIlFKMworRidxU3JMM2pyKjArRCVCZExbJkQ2SyZjYyNBS2RaOCYkVilhIkJITC1UOHJjS0tHcVVSOCdOQmNTSFoyTCknNAorW2tLbSIpQEkkQEkjWWlVcWFDTGFCJ2JMbDMwTUpMZWVWVUIwNWJFY3FtMURaZVgxMCkhJ1s1WElSQ0IrW2A0NgorWiZlTG1mKlhkVEgpVGYlJGtVNiQhQykmNFAxQiVxNERqa2BZUChZcSVjNEUiSEZxaCgkcSxUUmVQW2FmQmYqOAorS3EmNFFqMSwlZGEkMzI4aVBIclljVC1sNDVGTmZHZCkqTiEkKkw1RkNRYWkxW1grVElgJExOaywzNmxiKSloUworYyFqOVgqbS0sQTFaVFZkWEErckBlZUo0SE4hIk4tWGhmJypOa2EkUSVVQGRGIWsrWjgwJ1NoYiVGRGhISChQKworRVZEIiEsZEQ4IjkjaUJrJCYhS1NKS2piMWZrYjFEcmtaTWVqKUdyOHFaKzRsJzNBYCErcGsxNkpaTSFQZGxLcgorSiRjVTUhNmRZYmxVJkxLa0JUS0VoNmIzSGRBWnJCWzIzZkBpcW1BNVVGaiYsbS05MVNpKTM5LG1yZXBgNDUkZAorRThUUi1KMVMiVEFqa0RaYlJoS0AnYkssZVpANVJBODBAUUFDYVNoVkQkYUpAWiJkZEwicUdlNnJTW0MhISkzQworMFVFLS0mOGpkNE4tbCVROCVyJDFGUXJoM1IzUkgiRWpOcSosWmNKW2RHRkkxYVViVWkrKU5JYiMlMEBlYSktMAorWjFGaDlOUWhxMWsrNEMlOU1oYU1kQ2FsZnE2OUZtIyMnWlVHYFZBTWRLSzFsTCoqKy00WkZxKyo5ISNoQSdtKQorJkksQ1NgS1gtQCombCxaRixpcmQ4cVRpOWlwbFplQkUyKSVoamRSbGhwKkwnWDY0JComLDZBSmlhaiEhQ05BRworR2UzUUkjIWU4Kk5WViYtbWpgcmQmJSpUTDRtMUJDYDBxSEUqJEVYY2JQYFVQSU4lcCpNVihlKDNFRzBbMyJlMAorM0IlSSxUakRYMWJlImJhRDhHMjBFQjMwRWpWJmJCUVVCWUQrMThlRUhwIUBDNScoNChDISFDSDVkcUk5W1tWIgorSCQ2RVtbKEYmbWUwSlkpclVsJWsyNmVAIWFVazFaQkAkQEhBKllAYiwpRkwjTmZWLFJbLHFTSVg4MiVocDUtRAorZVIxVGxZKDhhJ0NtaWVlQjNyQlBjS0EmWVFEUChyQUxiU3FhcTUxKUg2VDFYUHBiUlYyaEYiMDhkRkc0QThwRworQEAwM0lNK3JZalBhQypMIVAmW2RgIk5qRClWNGgyK1lrcEAsTjFwMTYpSEdxKS0kMkAnUXFjW1RVJFUnbWohVQorIklaYUIwWSNbIWBlcFVqOHErWUNpMyQmTUNCZGJoJEcrVCxZKCQsQFEqOVFGJEc1SiJGR0wyWm0tSjZAWURlYQorJ2BKJishQEg4TmxtJ2YxSVBpMTExSnBWIUkhWGg4RVYiYzVyKytZKUEiYGtbI2o5WUJjZkEmcUpiS00wTCYkIgorTkU1NFRxJkk0VSwsLCdhcFJZYTEpTTRBbGJjRUNsOU0qRUEhREs1cnJNcllhMWRrJ0FpUzlGclg1K1VkaW0iNgorLEtVUlRBUSssYTlCKVZDLGJNcGtkRm1ELSg2OCUwZktrZlBSWWFMIzQqSDMoZVUyamFSIidsZTknLUg2ZnBLJgorQUglcEtGMytiM3BoYyRVUTJxR1tLKSNlSFsiIVgjRDAoMlBkIVslRnJFJVIpbGRNS0YjRkgzQiRNUzVUWUVWWgorJyRONERJSDVScjhUS1lWRjQ5RVFDTVYybGgtWGs2OFZUQGpIWiQpRDMhKlMoZmsqNGBUQltsbGJSQyU5OShYbQorQ0UhMDg0M20xWmFYJkMrbVk4LCYyKksmYmNQMmBWalU2M3FiYUFJajVwTlAlaDkpYkRpR1hKRmAxRmVTalFTKAorYCpVMkFOQjQtTE4tISkkTVI5J0xoIkBCcVIlQGFmIW1Sa2UiKUJRWjJrWSlIMFEiYmJDakpOUnJOJyQwaFRmIQorNVByKykkODQsK1VCSDZpaHI0NURHUDIlZEZmQS0lYUZBTGsrNlRVQyFmSWAjUlBGNigiaXJtVmozKCstQDVwJgorVkJAMGpwcUNoOTlaU21lZkVLWkcoWTlJZTIiOVJFWltGLEFqISRDaltyJkBZbFFEcFMyYSlNS0E1YWVLRFInRgorJSppVGNMI2phUjk5cEtNQVspVihAMikzImxCVWlBazZEQ3JKIixoUjBlckYpTiEhcWAmSXArYyY1MWwoKihCMQorS3AsMUNOQmolJmhEZllFSCVHZjZlQVAyRTRAVnBEaydsYkUoW1IsQGFNMypWMFZWWGVyVUpKZixIbEMzUSElKQorQ1BlcUpgUUNjKDAxbE5KNTMhMWpbKk5yYSo1QVtjYFJyYmotSixESkVQNUEiM1YiKitFKWplZmVkbStwQltEQworMGhRYzZxKkVwZiZlNk1TQ0BrUU05bEhbRzAlJjgjNUVscVtRR1MhQDlkKzQnU0gxNFsrUTZhNCZMMihKM01jMAorNXEyKFImUmZZSUFFaioqLXBYSU1ELFkqUisrR1pZaEBwW1kpYC0oIiZjKltDSlVGWU1Ja2NtJ3JUU05aIjQ0bAorYEIoJkZlTiZBRVZNMjkpaktGaXJoNUVTcVJDSjFobCo0TlJpQlk0LSdTK0daIVhDMVIiY2s2OHAhKDlkQU40YgorIjlrSjFNaWVIJytNNkAhaXBFKGthVEIxQ2MlckhZODM0cEVtYzEnLVplWkBTKSgxNGRFaCxxalg4R0wjQzMlNgorJTBkallyZmwyYFhAWUNIUTliYzJqWmNILExwbGBoVSROa0FlKCxoMDg1SU45UUphLVUmWDFBcGkyTS0zOUdLUgorSVVCZkltbUwqRihDS2FCRlEjTiJBMExyYU1LWGYrUTFjRCRNRGM2TlomIkZJUkFGYEVmQE1QQllZZkQ2YGIrOQorUUVLQjM4QTFYTFJoVVtlQVYiVCwrSjNVRipkMUpEW1JgUFBlWyooWkQtSEMjSERaKi0nIWZVcSxxJkVCKFIpVAorUWg5UUdAQStmI2YiS2BlUkVHYSNlRzEmOEwqMk0jUVszJFRQZShYTCgwaG1iKENOQXAqS1AxTkAyW1IxWkJbYQorR0xWJ2BmS1hrSihmW1JVIiI4JGxiUGg0RmFhWTBGUUdqUUVZZCs1JkpURG1AbHBgNEZGJVsjcihJLCJbKUJaRQorR2wjTk4zVjNAYWwiZGJCS2FrKXBHNnBNKUZaM2NqaSgycFpCcipqQCIlKkhNYjQrQSVZTjNRaUVTRmFBMjktZQorITlOWydpQ2BFIzAjcUMmOGowVW0xVURQajYxUjlOOWRGYGRhZCtSTVMpJ0tiMm1WJiokQChxLChZNUJOLSkpUQoraVBNWik0K0RxJ1Y5IVAwUWVpQyEhSyxiQ2JNTEkqImVlKSopVjRwSGNBaDAqSDhJcTEiWGxqaUI0VkpjJjU4JgorKmVZK0NbNmBsRWgwVCpWMCtMcDUpU21gaitlTlJmM1gkS1RNRytMRmRoSGUtSUsiR0JoSmpOZlhhOWxIKEFwaworYiRgMkdFM2thWlUsUkVhKWVUMFJrLVQhIUxDJ1lgYlhGNFJWbUhMTUJMWy1IYGIiMEooaURyTjZMVCJFaTghVAorSTFJVlonbDlLVUhqUUREU3BFI2ZOM0FBNUQyRSVWKVopJydYUS0ocUxJVjNKUCFpM0owZjFWUSNsbClRKyEkQgorODBGKExtMCxGaSxyK0BQImVUNDlaNjRBIjJsW0BmWEIkVVJIOCYjKVkxNCQkU0xkMiUsSVUjMls1NWVMOFQkNAorODMkUWxHNUZFK1NyU0lbU1s5UHJUKVA5a2gsQlEqIyZSQUswMzUkMCpacjElQHImbTE5SkVrQUhTZCpsUWZNcgorYFUoZCgwNkwlRFZFRSk2MWJpaWQwNk1CKnBwJSE5amMjRSpTNDFZUUM5QUApSmlVK1BtI1NmIVA1ZmkkMFYxRAorLUYrWGJIaUlMNTlkQEc4TTNUTiE1K0Q1MmA1ISdKMVZlRyZiRUBhbEZtRilrbUEyZU1sMzZgNERRQy1bbDAqYAorKWNJRGhSamwoJVFhTCwsbFhWWzAqSikya1ElIVNOISFxUyhoOGpGU0lrcWEkMUUlI0VkWypkNiprSDNHVmZbWgorWmYkTltRIyphQ3BpcSJOUChRWGE4cWksSmpMIStlMGBNLWJoKjBFSjIxYlBFODEzK3FSUkQsRmIzISlZYEMmQQorNFsnWUw0REVwZEwnNFVZIylISVshaGYnQ0oiZCFsbHE2cDlaMyEsIUNLcEY1U0tIZDNwUGZGIidVbWQ2IWgoJgorJjhtcVhVKXJDWTNqNkw5amNpWVBUU0hJJDJbNidHOCdHIytGQkdARWIrVSxaMG1BYlAjISpVLG0oKks5I1Y4JworNGknUE5NIklxQ2gyUzFKYSwmJmNSQTg2VltEJVpJKTMlUCQtakFkKlFrW0lJQmtZMyQ1IilWWVkoYmtBQCw4KQorWmZENjJmbDRCJCc5MiQlQWZtNFhGTlEpI1pTUDQ2KFkhUCo4W3FURSUtUTlFZmYwa0kpYicrZjItVGlqRy0wJQorWWJgQnFaUzJgbW02LTZjK0ZEMWNlaEU1aygnTCtQNUIxSTUlQjNVNjFCRVUhOEQ4VkcyNjhkQFojYW0tKWlwWgorSlJkK2NESXBsZGhUS2Mra0Q5Ji0wQEFhUTBaaXBBJ21ZYHFbKzFMWykmOShjK0ZGYEdwNispRjNWUCRjUFkwSgorM2BiK2AlJWZsbGhQLGJFJEk4JmZoJiEzLWhTRGJoSForNmBQY1kmMSFyKCopcGZjbVotOVstWUIyQjVpQGQhSAorWCVlRGskVVVRVipoaWRqKERJZkdkVE1NcVpsKVNYISxyNVltYEckNCkxWGlkYSZqK3BFKipUKzhsIUIpOVlgIgorbSNgU0dCOE0lTlosNENRNGpaKUxAK0Ara1UzLSdsSWNTa0sjRjFkcmBaOGJHJ2hWa2RoUWktWWQwSlpRck04RQorJUdtK1FLUFtxTjNTI04hImUhSFtrTk0zUUBELUpKUGpqNFArNiUiQjQwJFtWImRScTRNUjgqVmhOWSIwUTRkRQorYi1xY1VLZkpJIVMnayZkcCxhRlglSmtKUydoaFRiUi1gKlJHZFhkYGswRCE0SjJkMVkxRGBoJEcjTGY5UCZgagoraEhpJnFhNSRYY2soaE4hI0QpRGlhcTNxWCUmOTZCYmFLViQnNTZDaGFwUmMsZmtwYCEmRDlBQDRqcGFKRkJkIworY0ZaVDIqUk0icVRaSmloJyJgcWpTMHBscCwnMC1HQzEzIStwYmVoQVIwVVUiUCtmKkhjSzQjJ1lEQlVpISxNSAorQWE1WGAnYm0oQGUyTSc1WWYpMCJDQ2tgWSohTiMiQzk2cGZxOCNhQWMmTWxqcmNbbWsxWzJkTSZAZmNgSiVBJQorJCJUJ3JGVkI4QFpRbE4hImEnbDk2SlMxUENOVSZAYjZoQzJJKUpIUSpqIiIxcFFEJzFSSktYQ2Q1JGQ0R01DTgorWyNjMjhWUE1Acm1EJUtDISFbLCYzJC1rK2hlKFhjTlFNcE4jTlhbZilaIiZGLFpgNShqWXJMKXIpWGlrS3EjNgorVSgyODYnZEdjQCRhIU1mLVlrYigyMihiRyksYjFHOUByaDlobHJgI1kraDBAQUhQVi02SFJJQ1Q2VnBpVkNkYgorWVo2OWk5W3BiVFtKMmg1bEJwIVtyU0dTMUdmKUMnQyUxcFpqQEBbQGRsNjVAcGpRLDAwUEUiRTFNKUJEWSYpUQorS2FsNWIrbElxKlllK0BhU0hZYWBbJWVaYjEiLGwnaFlGRmNQUkpVYVlBRSJOY2NJUCJHI0k2YGAyK1ZZQSRbOQorJ2MtYEFxbGBIUVVtYjVANCVDQDFHcSNVWzQiVilFUypVLCVJWCZMIiFBLWtKYic1cStIYVQpKEpiJVJaZXJwcgorNE5YQ0dmTGJSKy0yW0BDZS0iZS1wRjQiRFpSQlIlQTRbLVtBNjZCZSQ1VihmSiZEcms1JSpVaVhsZWFpclslZgorUUtpTCUqYDYzSTJqTSxaJTZOQU1ySVFhVVYjVFJtIiIhSFNGQmtUSjlCJGojZSllYkNITjZiYEw4Vk0pJFopTAorTWNjVTBtJ0UrLWxpUycmNVItVmBhYkdpR3FARytMcS1xIiYkNExqcU4oIzkxTkNgQSpbZkg4cEdAYihEVEwqTgorMElYIVZkVmorZjY1S1ZFITMjUiRybENHLChUWEppLEdOWyhbTnImYlBtLTUnKlJGbTNqaCZqWEYtcSIpKzIiRworI1hMNEVLTnExIylTJCRYZDMtUmhGRzE4WjUiTTIyanFAOSU2MENJJGxlRSFRS2FCQFZmQDFgaUhbYENTS1pkYgoraHFZW1pZMDlaUFs0UkZbM1A2Uk5BUEEmakZHYGw2SUtpQ2NgS1BqaWs0VVhDUSUhYSUsZExhalhMSDBYTENUWAorSSU5YDEja1lESkciU0NFKElrSHJlRSNLIzlkWGBKJVtJTCZbOEFiKzQsUnAnaVVQSTlRJVVgcmg2alQ1SkNMRgorcWRIa0osKDYoIWlGYEgoYGpZRDlgTlo1OEhjQCNhaU1DRDEwQGwsYFBkaThZYigoZmUiZWBxNFIzRTZFQyxCVAorbEVobSE5UiRpLSsmWFFjYW1sM1BbakhbJjYlRmZpKkNpJGRAMUAkOTVxalFoTmIkWWRQSWRrJiVhcjNGa05LYworMGw1JGFMQGAkM3BjcCNHSFpNYCcmS2NyOChYcDhBWWMzSEJBSiw1UWpDKGQtTUlyZTlGZWhqVUJJLGBmKDlBLQorLTZxWmRAWFBhSUcqcWwqISEqVTUiNGg4REhaa2g1UCg5UTRsZiIjJVYsYlZLWlNEZlEsJWNYOTMxYHI2VmtOQgorNEFFLCZYVERgVmQoTmtWIVY5QkUtQ1JWSikjaU0yIVI5TGBwQkdELVBRcElWUlg2UExUYFNsTCQrZlRLJ3A2RgorSWNHRCdxQEglKmMyRWJxMUczaCIhMnFVYCZgVUJFcVMzSTRtWUBsIVAnQE0rZDY1bClHZSosYGAjJWxKQGBtcgorSHEqNmVBWzlsYFlyMHItQWlrQVBFTCY2KSFHVmhGKk5JMlVhVkhFYSlZWDJtQ0lHKmJQOE1NciNZRy1YSEtJUgorKmVwKSg0UC0ia2pBbFRWbUAlKEEqVS1WbEkzbSJkIyM5NiEhTE5oODNUVU5LJEpoLWEyTjgtZGZZVCgmY1Y5aAorJEcsamBrLVhtWDA2cUBNciYoa1YkZCItNTEhLVQqTixWU1FYLUlJMyQ0VENBTGgmWWtWbEVUUGZhNHBkKmJEMgorRjJxJEwnQS0xWW1WckJCamZyOUtsImwwYGZEU3EoKiEhRGZgakdxJC1FWUdLTTRDKmFwLSlrI1laTW0jYE1ZVAorSzAlVFtJVkpKIWJjJXFxYGtbKUpyW0hLI2NRbWBRTWAoSiJrQUZtKiJjS3JAcmliW0srLSkiUzhsWGpbaWs1MAorSURtMGkhVTg2IjRIWkwocWphaDIwQzlBMmJRUWlBWWNGSC1LUmhaZk4hMExrMDQtalgyMU5tJ1RIWlBxRHFCKgorLTVZSFEpK1MjKCxFcSNlVWUiQEA2UlpxQ3FjZiVKUGtkciVBbCNsRVlKbG1LTVJsaFYnWTJURmBINmZhOShjMAorVnElQTZySEloNGFEYmRxVUczRFEtKkxJR2NxYXJHNGZbVEUqLHJSWiotSzFpJmlLRXAwRyllWnJQNWMnMExSIgorU1VJUVVVMCxERDU4JmY2cmY1UC1IRiFMTDIyQktCREkpaXFYMCsoMVgiKSlWWUpYQHBlZE5MImlMIUxUIiVoMAorOXIoaSkxU0BaVSJqJjkkWDNAJmVkSiJNaTEnKmxsQklmZURLKiNgalFBWVFgRVQhITZhUVUrUSZrIUdbTkRJRQorMiExNlhlNDJsIydgcGErVmgiJiJpTlFbW0ByKykoY1JyJjIjVGFpZVQsOSEqbERBVWZVU0gmZEpwOVkhIzRWYworUUwnWlRRSWZVKVhJVClaQUkiWVIsWCpCTFI0MVVQY0RsVihrWkJhOCkzSjMwayVGMWktTDlLKWlSK1ZjKCwmKAorcFYsSlIxMnJRZmZyY0VIY0olJGZLKGMoJWxtQGQhZlhYKHFkZCoxQGhpRlRyLTVxU2FmJGVTMWpsKWNpIyVKYworaiVAQXJTckJOcForaDYnJ0RlNEVRK1VmJSVGZCRmbEtrR1RVSFo4JSFJYVZMcmohIWUmWTBgLGotIVNZNWVgJAorU1JCY0VEJCdGIXAxcEFJNlBIZmoxRktGI21jImIiSGJTJCErQFhqJ045NGQ5W04yOGZJVUZgaE42YmlwKTkpUQorLDgoVighOUlJK04rRFoxcmlUTCtoWyo0UWtIKnJGZXIiKkcoIm1wQExsM0VOSydoLFAoWnBEJnBpTSk1TjhiRQorRSVsIltaKSRiYmVxQyVTMUwmQ1BJR1BJZEMhbFRgZXFYKiYtJSEzW2lMTSsjcjhAaGozWzhUQzNIKyEqSUhmMworZHIsaiRFQHJGVk5BUUZhZWRgVSRHJE4lbFMmSVBEMyxUY0pEUy04VXFsMHBwKmNZOHIlZjMhKDZlYzEsVixASworZlZNNkRpW1stLSZOYDEpZk40NmZxaGBBckErMkBEVU5lSXJDIkc1JmksOVMjLSlVJ1RgKCxgYVJxSFBWMThTIQora1E1SGNNaHFDRilEJTgyWkQqbElAckpDaiY5NWlATlFGTVtsYTVyYmNoLHBkRzFTMlBhayNtcGEzYzEpWVA0RAora2okaThCU2BVMGE5YjFjakxbcnJYRCpVViEwKHBaU1YtU0UyKDQkYUohJCNGYyNNSVNNSTBUVElkQWs4OUJZRgorIS1GI0RaNEJOKGBTMFlrVWkrRlBBJiZAZUk1YklMI21GWmk4K0FqTEZYKEMiIzVlTCFtTTQjLHAoUmFEQENrSQorJCQmQyZiZlA2RjQ2UmlCTSQlIzFjWEBJYjgxUHAoLSYsTmZiOFprTTlUJixjK0AjaiRlK2FiUVZqIjNZLEZaaworKjhQVkhEM1ZoQUhgcEIsUyVlbGtjOUxUaiE0JltQY2Fjcjk5TUFJYyxKM1NCKFRNZUcmR2twVkA0YTRKLVMsKgorUUw0ZkJmKigzU1o1SnFWZVBSOUJyRVlZWVRlWCxJcUpARFtINE0jTWxVKnJERGEtalk0TSxYRDFMQSpTR1YpLAorY1FbSWxhbCs5MSQjYVJLclUnUlFZSjViTSZLJCdaR1VMWElwNllgcllOISJNaktNWyVBQSopSGVRQVs2YkZJVgorVUY2KTBWYURLZCppcFNpTWFjOCgnaWEibWJaKHFjZUYwaHAzYVhmY0tAazBOZEtgTlYpZWolVSZiIylMYkQtKQorM3IoI1ZMS1ZIbDQiZThtQ2M4YUIrS0dHQC1YalAyRUNLQCpMIkMhKClpSWVELVhRWkkiKG0oJCFrYStFVmJUYAorbCtbaCY5I2lLUWxgMytSOS0ramhicjBWRShiVktmckVSViQzak42MilyMktNOEVBKyhgRChpZllhLSdiTUhwKAorciM1JjJhYW00VlZYZlhTaSpFQjRkMXBYJEImSiFZLS0qQixiNiNBNicmWHBEciliZkBQSEJLKCxUUihwJi0hJAorQTVgY0wxVDVAMlAsQzhkYkFARiYpYEJiaShgIzU1R1MmbCNsYWEiJUBWUiprRGNqTlhAKWlKISdwYXI1IU1AUQorTGVSWmonKmo2KSRUZWZLWWRUJCcyIkxaYklVRjZNKC0hW0Zxa2RrOGQ2JEU2UkVmYGJYTWsmI2RbNlpgQlEhIQorWikrRGpiS0VoLSJbSi0jMlRIK0ZoTEMxODRpR0xYLGgyJkVHLUoqQmVHUnJhUVBjSyhwUThWamlKSFAzJllOJworMyEmQ0cwcWJbcXFHYk5xK2xTTitJWEtTLSNlYSIsKEQ4LENkZCkmKFpDNDFCWiUsRWAwYFNDRShiNGQqbVIoQworTGtwZCYsJy1wOUFEIzZiTVRoR1UpJkc4UltZISRoSSZkNSJsU1QzJ3EiUiY5YidhQVlaIyFANVIhYmtsTExqagorIWxjcWBSWjRwYWBbSywjbGAwY1gmMGNFSCpEIUlKQCs2bSVrSjZycWtUSlhHSGpwZGRoUHFZRE5TTjkzWChhJgorUyxiKjVOOWBMRENtJUJRcEpNJyksRUohSmQmYzJWLCQlTFBsVFlQYyosRU0mIUEiUipZTEErSE5kU2YiNShhWworRyNaUiwoYSZEWy0wR0hWS3JZLElsWEs4cmZsNCs0REZVRyRgUkljRmhoa1EkMGQzJEdBUiRrVGEjcGApMWJyMworSmJCQmwkIWgwKmpAUmpwJyEnUVNYZjNAUkMiYidaVUMsQCFEU00rUHI0TWpBWC00WlBqMmRrSy1lJiRMWktgZAoraGkjNkNDMFRMUWEnaEFickZGTkpSWjBra21SSGQzaWFGTiEhM0hWIiZhNllbM1IwR0JFWypgJilwTlRJWFMhIworbFZoQDZFRTlsKWQrUCMyJFkrazBRMURKNFpFMTghRypWVWohITkhQ0cmKiEhbCdsTUwyNiwxZWpEa2AlSXBQNQorSEhaUSQiQjJpKGVqNmhgUkFTYlMrQ2tSLCo0OEFrbS0qW3EwaEBsWFlaOGZVQmwkNC1sa0chZE5bJiQjW0YkSgorY2lxVkcyQGgwOUIsZWJOciUxbUkwQktlSVUiWURJLGZWYDVZWSIjZEA2QFtRJTNlNEpgOCMxQCMranJSKGBJbAorYihJZEUqSXBKaCVEYCFxLFRWJFNsS2tQYC1lS0QzKEAwYmhaJ2wwUmE5OTFsMkRJJ2FoNGNYZlY2ZCZEJWBJcAorTSUlYjRZNEpWailkKWgrQnEoMHBMYkhmcUBrK0U1UFZMUXI2RU45VHFNYVVlTk5pcGE1WmZMRFBlcCtpbCZsZQorMzQ4QyhaWUhTLVZDNFJpKywkW1JbQzNHTHFZaW1gUlhmZkRhVDkrNitFaSVVKWtiRmtRQFJVMGozZjEpYmxoMworJSFgM1hBTHBEJmA5SCkzY1smRFpyK2ZwYmUsZSFNQCFaMmtIcCEyUDk0SlozISNVVWkqcSJmOThwLVNDYidpaAorImtqayRWJipla01HJFtUTWQkVEhANHJTJVBYYlIyI0pFMjQiQClmWXJNWFBNMFZsJCZNI01aSGQ2WSFmK1UpSAora1lrKVhZSEIyNWlNM0JqaGFmZEkzZEplVkM4ZGhURkRIJikpR2pOOCgkJGpATFhINltqOCsybSZjYyxtQzErJQorVExpa0VyZWpVVWMrOVZjQEFpRCRJKGxJMklTKCJtMCQlTFtxJCZwZmpFSEBVVUwiTkQqNlRVZkZgLEFNJ0xjYQorYEw5R2YkWENoSTNRckBbYChRVCpqTjRUak04YjlRJmosJUgpWyNFcmBwNDYlJ2tbWSsyMVMlWU1kYS0pIVQ0JgoraUYobDFHalMmcklWbWVoOC1GYFIqZDNlaTBOKEBMNjZNJCQyMEBZQDBqLG1oW0pkJ0dQJCdHKCUoJlYpMlFlIQorQls4MEUoTlZwRzZtYEBKJmVGcCIsRlNoMSRYIyxMKmFTbFZsMTgxJGZyLEEpMVQxU0FiYVJlRSVKRmtibUtwNAorTThHaTArRUsmQUJJaDVJOSVgJiElVkFDNmlCLFZRRmY0WGVRImQ5cXBwMzRrbUpBVExJaVhlMlZONEVQZTAmYworWmgpUCgkWzRwZkFJLENYZGM5WWFIMWJtRFJMWDFjMVhCU2EhNFknQWRCLSRJM2EpJSlsTSptRGRTJSFGbG1oOQorTitLWSVtQWVbZEVsMWhHWEVpZiZFUjhOUDJwUlgiW2JBRydLW2tFTCMhamtyUytiYjQ0SmRsWGtrNGpsa0JJZgorKyhlYUpGNmlKSjJRUiUpWGVTWUYlSShYIS02JTZmamVocHBjQkU1VDMqOVplI2QlQVRGMEMrVCEhUiZFOURGZgorRGMpKWRKMmhqa1lBLS1mNTFMamNQQictYS1aa2xYKypYTUtSQUJUMmBSQ0slYyEhI2QqMGpQI2ZTcUVZSkNNKworTWRDNmxaUFBEWTA1NkBrOVgpSlIzUjNEKiRmLWxQRlY2ITNiLDZZQEVTQGg2TjlOKTQnUUBCNUxjJlQqQnFiJworQWJwK2JZQColK1NGIy0lYCFOUyVyJ2IyJyUhIlpWNjNoJWBgMFVOKCgkQSlIUlZlZChBIXFNZlIoYGpwcEszMQorZitYRzI4LSkzTmZxQVgzJ1kzUigwY1NYRHFYZVhHZUksMSpOSEZkZCNBWmVwRTJRS0QjWTAhQGozKidDWlAnUgorTWNacUIrNCUkYDNQI0AnckghZlRGUSZQQTBmZFBHaCJKY2EsSXEwJGhqbTIxbC0rSkxaMVQqNWNVUlIkRk4hIworYCRBSFlKRWA5bSZLMzEhWUBwa2FQU2JWSSpQUGEnLUBNMllKYiYxYzkyKGM5RlQnRClMKmRwJWxaJiJaMyEnKQorOFYwVFQ0VVJRRSQ2aExOYVk4NCc5I3FKcGBNIVNsMVtGNXAzMDUiMS0oOVAqJlJANioyRVRTWW1qYVBHNCg1NQorKVBQU2VgSyokSmUkS2ZlTDlpS042UUJISUxbUTIlcnBqYURNIUhUJjRsMGw1JS1RaFQ2Ykc0NUEnUVAiJ1YxQAorNHFSWFMqI0ZLI2pLcUclMFJBVjEpKEAycmsscXFyaChkZS0iWVklU2gpZEZNVFRmVVopRWRxRUhsRyJrIlJqUAorcmtQW0MlQGooNCJpcTNoLEFVcnJhMVprLUtwY0kraWBSJ1NJZlgxMFZOSjNHQG0kRmRZYDBbYzQlUCVsTVpOcQorRDNIOEwqTiFJKStZYkBZQDEqWEZoIUMqTiQzSjlrNG1xaS1QKiNsSSlYTWxEalRTQGY1MzZkZEMkNlA1LFRtWworUEYiWFApa1RjMTRaNGhhJzMhKko1aFFUbCZjIzVkRlpINTVSLTNQZFNpUFBoNkpFJFhFbEJoWVE0SEpFRjZUMgorRUtVayZNJmgxRDEzJidQaWxQTHJDWmlMOEYyITAlU1hsUFBwSSNiIUBCRVNKIUBYLSEnbVpOakowJTVlWShSNQorIkRlSVphaDEsKEU5QTNATGtASmMhZSdMayI5YUwtRCc0VTMpZSsnI2FLMmxIOWxATWppamIrVUsiYXJAK3ByYQorOSghVkUsSVBAVkhxRC0naUBVIyJUTENtQ2xaTWM5S1s2bFNWcjVqSVZGUkMsUmM5YUNmQjYsOTJNJjZma1BkQworUjZDTkhKWCQlRyQoQUQ4MHBWImRITk5tKWEobWYtQlUlLERAKzNZYnBORExVI0toRGNQSkhQUyFSS1RRW0ZocgorYTkpMEkxUitySDhoajhKKFgtTDlEWGhITCspVmJYIjIjclotMzQoZScrUUhDIjY4OUImTGM4IWthaWhrWmNyJAorTWZZcjhobFBHJmROQDljKVhlQ2BCMWBhKipYWk5GJVpgbUNpLGxCRFhwTCZGcEsxS0YoVVpaRm0oJTQrbTlYRgorRmpZcGZVWzZSTiEkJFtWKDJGKzZrR2QhYUtoM2tWTUEiNmEkY0AkbCctMlpKM2YxKW0yQEUwOG0kMnJLKVQ1YQorRicxa0dQRnExIUFya0hETTFGYlRYMiwqSmVAMmZobSksZDJFcGBrImpTUUMlVVEkakRqJjErSUZjKjlSMDUkUQorJHBSckYsJTVMZWYtJUA0Q3FCMnAoU3FMYGhyVWEqSkEkciwkalsiQmpMbTkjW1BGS2ZHcmhRSmxCKkJQZE5mIwora1tQWUVWQ0NZTDQ0S2NkKkVtRE5OUmlYK0BiNE1sQjNxUixSSVVNWTVFWkppQzRpYGkocCNAJmlgLSwhJSRiSgorQEkpbGVKTEYiKGBobFtjJTVBU1g1SWAlR2pyRyhrMzMrZkRpUmZAQyYsZWstKGZsNHFmSE0rSjJDU3FjM0BINAorM2tZIkQiRFFQKCpMZSxEVjVZKC0wIS0sKyVtY0pUKWxII1BlRDU1JlonVmNrQGFVTGoiK0NURFk4QTlFJmAyJQorS1JGcWZaYicwUDYzNEEwSiFiSykhISE6CmRpZmYgLS1naXQgYS9zcmMvb3NfbWFjb3N4LmMgYi9zcmMvb3NfbWFjb3N4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxZWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc19tYWNvc3guYwpAQCAtMCwwICsxLDYxMiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIG9zX21hY29zeC5jIC0tIGVsZWN0aW9uIG9mIG9zX21hYy5jIG9yIG9zX3VuaXguYworICoKKyAqLworCisjaWZkZWYgTUFDT1NfWF9VTklYCisjIGlmZGVmIEhBVkVfQ09ORklHX0gJICAgIC8qIFVzaW5nIE1ha2VmaWxlLiAqLworIyAgaW5jbHVkZSAidmltLmgiCisjIGVsc2UKKyMgIGluY2x1ZGUgIm9zX3VuaXguYyIJICAgIC8qIFVzaW5nIFByb2plY3QgQnVpbGRlciAqLworIyBlbmRpZgorI2Vsc2UKKyMgaW5jbHVkZSAib3NfbWFjLmMiCisjIGluY2x1ZGUgPFRleHRFbmNvZGluZ0NvbnZlcnRlci5oPgorI2VuZGlmCisKKyNpZmRlZiBfREVCVUcKKyAgICB2b2lkCitUcmFjZShjaGFyKiBmbXQsIC4uLikKK3sKKyAgICBjaGFyIGJ1ZlsyMDQ4XTsKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIC8qIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOyovCisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGJ1Zik7CisgICAgdmFfZW5kKGFyZ3MpOworfQorI2VuZGlmCisKKyNpZmRlZiBNQUNPU19YX0lDT05WRU1VCisvKgorICogTGliaWNvbnYgZW11bGF0aW9uIGxheWVyCisgKi8KKworc3RydWN0IF9pY29udl90Cit7CisgICAgVEVDT2JqZWN0UmVmIHRlYzsKKyAgICBURUNPYmplY3RSZWYgdGVjUmV2ZXJzZTsKKyAgICBURUNTbmlmZmVyT2JqZWN0UmVmIHNuaWZmOworICAgIFRleHRFbmNvZGluZyBmcm9tOworICAgIFRleHRFbmNvZGluZyB0bzsKK307CisvKiB0eXBlZGVmIHN0cnVjdCBfaWNvbnZfdCAqaWNvbnZfdDsgKi8KKworCitzdGF0aWMgaW50IGxhc3RfZXJybm8gPSAwOworCisvKgorICogR2V0IFRleHRFbmNvZGluZyBmcm9tIGljb252J3MgZW5jb2RpbmcgbmFtZQorICovCisgICAgc3RhdGljIFRleHRFbmNvZGluZworZ2V0X3RleHRlbmNvZGluZyhjb25zdCBjaGFyKiBlbmNvZGVuYW1lKQoreworICAgIHN0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIqIG5hbWU7CisJVGV4dEVuY29kaW5nIGVuY29kZTsKKyAgICB9IGVuY29kZXRhYmxlW10gPSB7CisJLyogSVNPLTg4NTkgZW5jb2RpbmdzIGZhbWlseSAqLworCXsibGF0aW4xIiwga1RleHRFbmNvZGluZ0lTT0xhdGluMX0sCisJeyJsYXRpbjIiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW4yfSwKKwl7ImxhdGluMyIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjN9LAorCXsibGF0aW40Iiwga1RleHRFbmNvZGluZ0lTT0xhdGluNH0sCisJeyJsYXRpbjUiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW41fSwKKwl7ImxhdGluNiIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjZ9LAorCXsibGF0aW43Iiwga1RleHRFbmNvZGluZ0lTT0xhdGluN30sCisJeyJsYXRpbjgiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW44fSwKKwl7ImxhdGluOSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjl9LAorCXsiaXNvLTg4NTktMSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjF9LAorCXsiaXNvLTg4NTktMiIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjJ9LAorCXsiaXNvLTg4NTktMyIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjN9LAorCXsiaXNvLTg4NTktNCIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjR9LAorCXsiaXNvLTg4NTktNSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbkN5cmlsbGljfSwKKwl7Imlzby04ODU5LTYiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW5BcmFiaWN9LAorCXsiaXNvLTg4NTktNyIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbkdyZWVrfSwKKwl7Imlzby04ODU5LTgiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW5IZWJyZXd9LAorCXsiaXNvLTg4NTktOSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjV9LAorCXsiaXNvLTg4NTktMTAiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW42fSwKKworCS8qIFVuaWNvZGUgZW5jb2RpbmdzLiAqLworCS8qIFRPRE86IEFkZCBvdGhlciB0eXBlIG9mIHVuaWNvZGUgKi8KKwl7InVjcy0yIiwga1RleHRFbmNvZGluZ01hY1VuaWNvZGV9LAorCisJLyogSmFwYW5lc2UgZW5jb2RpbmcgYWxpYXNlcyAqLworCXsiY3A5MzIiLCBrVGV4dEVuY29kaW5nU2hpZnRKSVN9LAorCXsic2hpZnQtamlzIiwga1RleHRFbmNvZGluZ1NoaWZ0SklTfSwKKwl7ImV1Yy1qcCIsIGtUZXh0RW5jb2RpbmdFVUNfSlB9LAorCXsiaXNvLTIwMjItanAiLCBrVGV4dEVuY29kaW5nSVNPXzIwMjJfSlB9LAorCXsiaXNvLTIwMjItanAtMSIsIGtUZXh0RW5jb2RpbmdJU09fMjAyMl9KUF8xfSwKKwl7Imlzby0yMDIyLWpwLTIiLCBrVGV4dEVuY29kaW5nSVNPXzIwMjJfSlBfMn0sCisJeyJpc28tMjAyMi1qcC0zIiwga1RleHRFbmNvZGluZ0lTT18yMDIyX0pQXzN9LAorCisJLyogT3RoZXIgYWxpYXNlcy4gVGhlc2UgYWxpYXNlcyBpbiB0aGlzIGJsb2NrIGFyZSBqdXN0IGd1ZXNzZWQuICovCisJLyogVE9ETzogTXVzdCBiZSB2ZXJpZmllZC4gKi8KKwl7ImdiMjMxMiIsIGtUZXh0RW5jb2RpbmdHQl8yMzEyXzgwfSwKKwl7ImNwOTM2Iiwga1RleHRFbmNvZGluZ01hY0NoaW5lc2VTaW1wfSwKKwl7ImV1Yy1jbiIsIGtUZXh0RW5jb2RpbmdFVUNfQ059LAorCXsiY3A5NTAiLCBrVGV4dEVuY29kaW5nTWFjQ2hpbmVzZVRyYWR9LAorCXsiZXVjLXR3Iiwga1RleHRFbmNvZGluZ0VVQ19UV30sCisJeyJjcDk0OSIsIGtUZXh0RW5jb2RpbmdNYWNLb3JlYW59LAorCXsiZXVjLWtyIiwga1RleHRFbmNvZGluZ0VVQ19LUn0sCisKKwkvKgorCSAqIEFsbCBlbmNvZGluZ3Mgc3VwcG9ydGVkIGJ5IE1hY2ludG9zaC4gIFlvdSBjYW4gZmluZCB0aGVzZSB2YWx1ZXMKKwkgKiBpbiBhIGZpbGU6CisJICogIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVTZXJ2aWNlcy5mcmFtZXdvcmsvVmVyc2lvbnMvQS8KKwkgKiAgICBGcmFtZXdvcmtzL0NhcmJvbkNvcmUuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9UZXh0Q29tbW9uLmgKKwkgKi8KKwl7Ik1hY1JvbWFuIiwga1RleHRFbmNvZGluZ01hY1JvbWFufSwKKwl7Ik1hY0phcGFuZXNlIiwga1RleHRFbmNvZGluZ01hY0phcGFuZXNlfSwKKwl7Ik1hY0NoaW5lc2VUcmFkIiwga1RleHRFbmNvZGluZ01hY0NoaW5lc2VUcmFkfSwKKwl7Ik1hY0tvcmVhbiIsIGtUZXh0RW5jb2RpbmdNYWNLb3JlYW59LAorCXsiTWFjQXJhYmljIiwga1RleHRFbmNvZGluZ01hY0FyYWJpY30sCisJeyJNYWNIZWJyZXciLCBrVGV4dEVuY29kaW5nTWFjSGVicmV3fSwKKwl7Ik1hY0dyZWVrIiwga1RleHRFbmNvZGluZ01hY0dyZWVrfSwKKwl7Ik1hY0N5cmlsbGljIiwga1RleHRFbmNvZGluZ01hY0N5cmlsbGljfSwKKwl7Ik1hY0RldmFuYWdhcmkiLCBrVGV4dEVuY29kaW5nTWFjRGV2YW5hZ2FyaX0sCisJeyJNYWNHdXJtdWtoaSIsIGtUZXh0RW5jb2RpbmdNYWNHdXJtdWtoaX0sCisJeyJNYWNHdWphcmF0aSIsIGtUZXh0RW5jb2RpbmdNYWNHdWphcmF0aX0sCisJeyJNYWNPcml5YSIsIGtUZXh0RW5jb2RpbmdNYWNPcml5YX0sCisJeyJNYWNCZW5nYWxpIiwga1RleHRFbmNvZGluZ01hY0JlbmdhbGl9LAorCXsiTWFjVGFtaWwiLCBrVGV4dEVuY29kaW5nTWFjVGFtaWx9LAorCXsiTWFjVGVsdWd1Iiwga1RleHRFbmNvZGluZ01hY1RlbHVndX0sCisJeyJNYWNLYW5uYWRhIiwga1RleHRFbmNvZGluZ01hY0thbm5hZGF9LAorCXsiTWFjTWFsYXlhbGFtIiwga1RleHRFbmNvZGluZ01hY01hbGF5YWxhbX0sCisJeyJNYWNTaW5oYWxlc2UiLCBrVGV4dEVuY29kaW5nTWFjU2luaGFsZXNlfSwKKwl7Ik1hY0J1cm1lc2UiLCBrVGV4dEVuY29kaW5nTWFjQnVybWVzZX0sCisJeyJNYWNLaG1lciIsIGtUZXh0RW5jb2RpbmdNYWNLaG1lcn0sCisJeyJNYWNUaGFpIiwga1RleHRFbmNvZGluZ01hY1RoYWl9LAorCXsiTWFjTGFvdGlhbiIsIGtUZXh0RW5jb2RpbmdNYWNMYW90aWFufSwKKwl7Ik1hY0dlb3JnaWFuIiwga1RleHRFbmNvZGluZ01hY0dlb3JnaWFufSwKKwl7Ik1hY0FybWVuaWFuIiwga1RleHRFbmNvZGluZ01hY0FybWVuaWFufSwKKwl7Ik1hY0NoaW5lc2VTaW1wIiwga1RleHRFbmNvZGluZ01hY0NoaW5lc2VTaW1wfSwKKwl7Ik1hY1RpYmV0YW4iLCBrVGV4dEVuY29kaW5nTWFjVGliZXRhbn0sCisJeyJNYWNNb25nb2xpYW4iLCBrVGV4dEVuY29kaW5nTWFjTW9uZ29saWFufSwKKwl7Ik1hY0V0aGlvcGljIiwga1RleHRFbmNvZGluZ01hY0V0aGlvcGljfSwKKwl7Ik1hY0NlbnRyYWxFdXJSb21hbiIsIGtUZXh0RW5jb2RpbmdNYWNDZW50cmFsRXVyUm9tYW59LAorCXsiTWFjVmlldG5hbWVzZSIsIGtUZXh0RW5jb2RpbmdNYWNWaWV0bmFtZXNlfSwKKwl7Ik1hY0V4dEFyYWJpYyIsIGtUZXh0RW5jb2RpbmdNYWNFeHRBcmFiaWN9LAorCXsiTWFjU3ltYm9sIiwga1RleHRFbmNvZGluZ01hY1N5bWJvbH0sCisJeyJNYWNEaW5nYmF0cyIsIGtUZXh0RW5jb2RpbmdNYWNEaW5nYmF0c30sCisJeyJNYWNUdXJraXNoIiwga1RleHRFbmNvZGluZ01hY1R1cmtpc2h9LAorCXsiTWFjQ3JvYXRpYW4iLCBrVGV4dEVuY29kaW5nTWFjQ3JvYXRpYW59LAorCXsiTWFjSWNlbGFuZGljIiwga1RleHRFbmNvZGluZ01hY0ljZWxhbmRpY30sCisJeyJNYWNSb21hbmlhbiIsIGtUZXh0RW5jb2RpbmdNYWNSb21hbmlhbn0sCisJeyJNYWNDZWx0aWMiLCBrVGV4dEVuY29kaW5nTWFjQ2VsdGljfSwKKwl7Ik1hY0dhZWxpYyIsIGtUZXh0RW5jb2RpbmdNYWNHYWVsaWN9LAorCXsiTWFjS2V5Ym9hcmRHbHlwaHMiLCBrVGV4dEVuY29kaW5nTWFjS2V5Ym9hcmRHbHlwaHN9LAorCXsiTWFjVHJhZENoaW5lc2UiLCBrVGV4dEVuY29kaW5nTWFjVHJhZENoaW5lc2V9LAorCXsiTWFjUlN5bWJvbCIsIGtUZXh0RW5jb2RpbmdNYWNSU3ltYm9sfSwKKwl7Ik1hY1NpbXBDaGluZXNlIiwga1RleHRFbmNvZGluZ01hY1NpbXBDaGluZXNlfSwKKwl7Ik1hY0dlZXoiLCBrVGV4dEVuY29kaW5nTWFjR2Vlen0sCisJeyJNYWNFYXN0RXVyUm9tYW4iLCBrVGV4dEVuY29kaW5nTWFjRWFzdEV1clJvbWFufSwKKwl7Ik1hY1VuaW50ZXJwIiwga1RleHRFbmNvZGluZ01hY1VuaW50ZXJwfSwKKwl7Ik1hY1VuaWNvZGUiLCBrVGV4dEVuY29kaW5nTWFjVW5pY29kZX0sCisJeyJNYWNGYXJzaSIsIGtUZXh0RW5jb2RpbmdNYWNGYXJzaX0sCisJeyJNYWNVa3JhaW5pYW4iLCBrVGV4dEVuY29kaW5nTWFjVWtyYWluaWFufSwKKwl7Ik1hY0ludWl0Iiwga1RleHRFbmNvZGluZ01hY0ludWl0fSwKKwl7Ik1hY1ZUMTAwIiwga1RleHRFbmNvZGluZ01hY1ZUMTAwfSwKKwl7Ik1hY0hGUyIsIGtUZXh0RW5jb2RpbmdNYWNIRlN9LAorCXsiVW5pY29kZURlZmF1bHQiLCBrVGV4dEVuY29kaW5nVW5pY29kZURlZmF1bHR9LAorCXsiVW5pY29kZVYxXzEiLCBrVGV4dEVuY29kaW5nVW5pY29kZVYxXzF9LAorCXsiSVNPMTA2NDZfMTk5MyIsIGtUZXh0RW5jb2RpbmdJU08xMDY0Nl8xOTkzfSwKKwl7IlVuaWNvZGVWMl8wIiwga1RleHRFbmNvZGluZ1VuaWNvZGVWMl8wfSwKKwl7IlVuaWNvZGVWMl8xIiwga1RleHRFbmNvZGluZ1VuaWNvZGVWMl8xfSwKKwl7IlVuaWNvZGVWM18wIiwga1RleHRFbmNvZGluZ1VuaWNvZGVWM18wfSwKKwl7IlVuaWNvZGVWM18xIiwga1RleHRFbmNvZGluZ1VuaWNvZGVWM18xfSwKKwl7IlVuaWNvZGVWM18yIiwga1RleHRFbmNvZGluZ1VuaWNvZGVWM18yfSwKKwl7IklTT0xhdGluMSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjF9LAorCXsiSVNPTGF0aW4yIiwga1RleHRFbmNvZGluZ0lTT0xhdGluMn0sCisJeyJJU09MYXRpbjMiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW4zfSwKKwl7IklTT0xhdGluNCIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjR9LAorCXsiSVNPTGF0aW5DeXJpbGxpYyIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbkN5cmlsbGljfSwKKwl7IklTT0xhdGluQXJhYmljIiwga1RleHRFbmNvZGluZ0lTT0xhdGluQXJhYmljfSwKKwl7IklTT0xhdGluR3JlZWsiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW5HcmVla30sCisJeyJJU09MYXRpbkhlYnJldyIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbkhlYnJld30sCisJeyJJU09MYXRpbjUiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW41fSwKKwl7IklTT0xhdGluNiIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjZ9LAorCXsiSVNPTGF0aW43Iiwga1RleHRFbmNvZGluZ0lTT0xhdGluN30sCisJeyJJU09MYXRpbjgiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW44fSwKKwl7IklTT0xhdGluOSIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjl9LAorCXsiRE9TTGF0aW5VUyIsIGtUZXh0RW5jb2RpbmdET1NMYXRpblVTfSwKKwl7IkRPU0dyZWVrIiwga1RleHRFbmNvZGluZ0RPU0dyZWVrfSwKKwl7IkRPU0JhbHRpY1JpbSIsIGtUZXh0RW5jb2RpbmdET1NCYWx0aWNSaW19LAorCXsiRE9TTGF0aW4xIiwga1RleHRFbmNvZGluZ0RPU0xhdGluMX0sCisJeyJET1NHcmVlazEiLCBrVGV4dEVuY29kaW5nRE9TR3JlZWsxfSwKKwl7IkRPU0xhdGluMiIsIGtUZXh0RW5jb2RpbmdET1NMYXRpbjJ9LAorCXsiRE9TQ3lyaWxsaWMiLCBrVGV4dEVuY29kaW5nRE9TQ3lyaWxsaWN9LAorCXsiRE9TVHVya2lzaCIsIGtUZXh0RW5jb2RpbmdET1NUdXJraXNofSwKKwl7IkRPU1BvcnR1Z3Vlc2UiLCBrVGV4dEVuY29kaW5nRE9TUG9ydHVndWVzZX0sCisJeyJET1NJY2VsYW5kaWMiLCBrVGV4dEVuY29kaW5nRE9TSWNlbGFuZGljfSwKKwl7IkRPU0hlYnJldyIsIGtUZXh0RW5jb2RpbmdET1NIZWJyZXd9LAorCXsiRE9TQ2FuYWRpYW5GcmVuY2giLCBrVGV4dEVuY29kaW5nRE9TQ2FuYWRpYW5GcmVuY2h9LAorCXsiRE9TQXJhYmljIiwga1RleHRFbmNvZGluZ0RPU0FyYWJpY30sCisJeyJET1NOb3JkaWMiLCBrVGV4dEVuY29kaW5nRE9TTm9yZGljfSwKKwl7IkRPU1J1c3NpYW4iLCBrVGV4dEVuY29kaW5nRE9TUnVzc2lhbn0sCisJeyJET1NHcmVlazIiLCBrVGV4dEVuY29kaW5nRE9TR3JlZWsyfSwKKwl7IkRPU1RoYWkiLCBrVGV4dEVuY29kaW5nRE9TVGhhaX0sCisJeyJET1NKYXBhbmVzZSIsIGtUZXh0RW5jb2RpbmdET1NKYXBhbmVzZX0sCisJeyJET1NDaGluZXNlU2ltcGxpZiIsIGtUZXh0RW5jb2RpbmdET1NDaGluZXNlU2ltcGxpZn0sCisJeyJET1NLb3JlYW4iLCBrVGV4dEVuY29kaW5nRE9TS29yZWFufSwKKwl7IkRPU0NoaW5lc2VUcmFkIiwga1RleHRFbmNvZGluZ0RPU0NoaW5lc2VUcmFkfSwKKwl7IldpbmRvd3NMYXRpbjEiLCBrVGV4dEVuY29kaW5nV2luZG93c0xhdGluMX0sCisJeyJXaW5kb3dzQU5TSSIsIGtUZXh0RW5jb2RpbmdXaW5kb3dzQU5TSX0sCisJeyJXaW5kb3dzTGF0aW4yIiwga1RleHRFbmNvZGluZ1dpbmRvd3NMYXRpbjJ9LAorCXsiV2luZG93c0N5cmlsbGljIiwga1RleHRFbmNvZGluZ1dpbmRvd3NDeXJpbGxpY30sCisJeyJXaW5kb3dzR3JlZWsiLCBrVGV4dEVuY29kaW5nV2luZG93c0dyZWVrfSwKKwl7IldpbmRvd3NMYXRpbjUiLCBrVGV4dEVuY29kaW5nV2luZG93c0xhdGluNX0sCisJeyJXaW5kb3dzSGVicmV3Iiwga1RleHRFbmNvZGluZ1dpbmRvd3NIZWJyZXd9LAorCXsiV2luZG93c0FyYWJpYyIsIGtUZXh0RW5jb2RpbmdXaW5kb3dzQXJhYmljfSwKKwl7IldpbmRvd3NCYWx0aWNSaW0iLCBrVGV4dEVuY29kaW5nV2luZG93c0JhbHRpY1JpbX0sCisJeyJXaW5kb3dzVmlldG5hbWVzZSIsIGtUZXh0RW5jb2RpbmdXaW5kb3dzVmlldG5hbWVzZX0sCisJeyJXaW5kb3dzS29yZWFuSm9oYWIiLCBrVGV4dEVuY29kaW5nV2luZG93c0tvcmVhbkpvaGFifSwKKwl7IlVTX0FTQ0lJIiwga1RleHRFbmNvZGluZ1VTX0FTQ0lJfSwKKwl7IkpJU19YMDIwMV83NiIsIGtUZXh0RW5jb2RpbmdKSVNfWDAyMDFfNzZ9LAorCXsiSklTX1gwMjA4XzgzIiwga1RleHRFbmNvZGluZ0pJU19YMDIwOF84M30sCisJeyJKSVNfWDAyMDhfOTAiLCBrVGV4dEVuY29kaW5nSklTX1gwMjA4XzkwfSwKKwl7IkpJU19YMDIxMl85MCIsIGtUZXh0RW5jb2RpbmdKSVNfWDAyMTJfOTB9LAorCXsiSklTX0M2MjI2Xzc4Iiwga1RleHRFbmNvZGluZ0pJU19DNjIyNl83OH0sCisJeyJTaGlmdEpJU19YMDIxM18wMCIsIGtUZXh0RW5jb2RpbmdTaGlmdEpJU19YMDIxM18wMH0sCisJeyJHQl8yMzEyXzgwIiwga1RleHRFbmNvZGluZ0dCXzIzMTJfODB9LAorCXsiR0JLXzk1Iiwga1RleHRFbmNvZGluZ0dCS185NX0sCisJeyJHQl8xODAzMF8yMDAwIiwga1RleHRFbmNvZGluZ0dCXzE4MDMwXzIwMDB9LAorCXsiS1NDXzU2MDFfODciLCBrVGV4dEVuY29kaW5nS1NDXzU2MDFfODd9LAorCXsiS1NDXzU2MDFfOTJfSm9oYWIiLCBrVGV4dEVuY29kaW5nS1NDXzU2MDFfOTJfSm9oYWJ9LAorCXsiQ05TXzExNjQzXzkyX1AxIiwga1RleHRFbmNvZGluZ0NOU18xMTY0M185Ml9QMX0sCisJeyJDTlNfMTE2NDNfOTJfUDIiLCBrVGV4dEVuY29kaW5nQ05TXzExNjQzXzkyX1AyfSwKKwl7IkNOU18xMTY0M185Ml9QMyIsIGtUZXh0RW5jb2RpbmdDTlNfMTE2NDNfOTJfUDN9LAorCXsiSVNPXzIwMjJfSlAiLCBrVGV4dEVuY29kaW5nSVNPXzIwMjJfSlB9LAorCXsiSVNPXzIwMjJfSlBfMiIsIGtUZXh0RW5jb2RpbmdJU09fMjAyMl9KUF8yfSwKKwl7IklTT18yMDIyX0pQXzEiLCBrVGV4dEVuY29kaW5nSVNPXzIwMjJfSlBfMX0sCisJeyJJU09fMjAyMl9KUF8zIiwga1RleHRFbmNvZGluZ0lTT18yMDIyX0pQXzN9LAorCXsiSVNPXzIwMjJfQ04iLCBrVGV4dEVuY29kaW5nSVNPXzIwMjJfQ059LAorCXsiSVNPXzIwMjJfQ05fRVhUIiwga1RleHRFbmNvZGluZ0lTT18yMDIyX0NOX0VYVH0sCisJeyJJU09fMjAyMl9LUiIsIGtUZXh0RW5jb2RpbmdJU09fMjAyMl9LUn0sCisJeyJFVUNfSlAiLCBrVGV4dEVuY29kaW5nRVVDX0pQfSwKKwl7IkVVQ19DTiIsIGtUZXh0RW5jb2RpbmdFVUNfQ059LAorCXsiRVVDX1RXIiwga1RleHRFbmNvZGluZ0VVQ19UV30sCisJeyJFVUNfS1IiLCBrVGV4dEVuY29kaW5nRVVDX0tSfSwKKwl7IlNoaWZ0SklTIiwga1RleHRFbmNvZGluZ1NoaWZ0SklTfSwKKwl7IktPSThfUiIsIGtUZXh0RW5jb2RpbmdLT0k4X1J9LAorCXsiQmlnNSIsIGtUZXh0RW5jb2RpbmdCaWc1fSwKKwl7Ik1hY1JvbWFuTGF0aW4xIiwga1RleHRFbmNvZGluZ01hY1JvbWFuTGF0aW4xfSwKKwl7IkhaX0dCXzIzMTIiLCBrVGV4dEVuY29kaW5nSFpfR0JfMjMxMn0sCisJeyJCaWc1X0hLU0NTXzE5OTkiLCBrVGV4dEVuY29kaW5nQmlnNV9IS1NDU18xOTk5fSwKKwl7Ik5leHRTdGVwTGF0aW4iLCBrVGV4dEVuY29kaW5nTmV4dFN0ZXBMYXRpbn0sCisJeyJFQkNESUNfVVMiLCBrVGV4dEVuY29kaW5nRUJDRElDX1VTfSwKKwl7IkVCQ0RJQ19DUDAzNyIsIGtUZXh0RW5jb2RpbmdFQkNESUNfQ1AwMzd9LAorCXsiTXVsdGlSdW4iLCBrVGV4dEVuY29kaW5nTXVsdGlSdW59LAorCisJLyogVGVybWluYXRvciAqLworCXtOVUxMLCAtMX0sCisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGkgPSAwOworICAgIGZvciAoaSA9IDA7IGVuY29kZXRhYmxlW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgIHsKKwlpZiAoU1RSSUNNUChlbmNvZGVuYW1lLCBlbmNvZGV0YWJsZVtpXS5uYW1lKSA9PSAwKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVuY29kZXRhYmxlW2ldLmVuY29kZTsKK30KKworLyoKKyAqIGljb252IGludGVyZmFjZXMKKyAqLworCisgICAgaWNvbnZfdAoraWNvbnZfb3Blbihjb25zdCBjaGFyKiB0b2NvZGUsIGNvbnN0IGNoYXIqIGZyb21jb2RlKQoreworICAgIFRleHRFbmNvZGluZyB0b0VuYywgZnJvbUVuYzsKKyAgICBpY29udl90IGNkID0gTlVMTDsKKyAgICBPU1N0YXR1cyBzdDsKKworICAgIC8qIFZlcmlmeSB0by9mcm9tIGVuY29kaW5nIG5hbWUgKi8KKyAgICB0b0VuYyA9IGdldF90ZXh0ZW5jb2RpbmcodG9jb2RlKTsKKyAgICBmcm9tRW5jID0gZ2V0X3RleHRlbmNvZGluZyhmcm9tY29kZSk7CisgICAgaWYgKHRvRW5jIDwgMCB8fCBmcm9tRW5jIDwgMCkKKwlnb3RvIElDT05WX09QRU5fRVJSOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIG9iamVjdCAqLworICAgIGNkID0gKGljb252X3QpYWxsb2Moc2l6ZW9mKHN0cnVjdCBfaWNvbnZfdCkpOworICAgIGlmICghY2QpCisJZ290byBJQ09OVl9PUEVOX0VSUjsKKyAgICBtZW1zZXQoY2QsIDAsIHNpemVvZihzdHJ1Y3QgX2ljb252X3QpKTsKKworICAgIC8qIENyZWF0ZSBjb252ZXJ0ZXIgKi8KKyAgICBpZiAoZnJvbUVuYyAhPSB0b0VuYykKKyAgICB7CisJVFJBQ0UoIioqKiBmcm9tRW5jPSVkIHRvRW5jPSVkXG4iLCAoaW50KWZyb21FbmMsIChpbnQpdG9FbmMpOworCXN0ID0gVEVDQ3JlYXRlQ29udmVydGVyKCZjZC0+dGVjLCBmcm9tRW5jLCB0b0VuYyk7CisJaWYgKHN0ICE9IDApCisJeworCSAgICBUUkFDRSgiKioqIFRFQ0NyZWF0ZUNvbnZlcnRlcigpPSVkXG4iLCAoaW50KXN0KTsKKwkgICAgZ290byBJQ09OVl9PUEVOX0VSUjsKKwl9CisJLyogQ3JlYXRlIHJldmVyc2UgY29udmVydGVyICovCisJc3QgPSBURUNDcmVhdGVDb252ZXJ0ZXIoJmNkLT50ZWNSZXZlcnNlLCB0b0VuYywgZnJvbUVuYyk7CisJaWYgKHN0ICE9IDApCisJeworCSAgICBUUkFDRSgiKioqIFRFQ0NyZWF0ZUNvbnZlcnRlcigpPSVkIChyZXZlcnNlKVxuIiwgKGludClzdCk7CisJICAgIGdvdG8gSUNPTlZfT1BFTl9FUlI7CisJfQorCS8qIENyZWF0ZSBTbmlmZmVyICovCisJc3QgPSBURUNDcmVhdGVTbmlmZmVyKCZjZC0+c25pZmYsICZmcm9tRW5jLCAxKTsKKwlpZiAoc3QgIT0gMCkKKwl7CisJICAgIFRSQUNFKCIqKiogVEVDQ3JlYXRlU25pZmZlcigpPSVkXG4iLCAoaW50KXN0KTsKKwkgICAgZ290byBJQ09OVl9PUEVOX0VSUjsKKwl9CisgICAgfQorCisgICAgY2QtPmZyb20gPSBmcm9tRW5jOworICAgIGNkLT50byA9IHRvRW5jOworICAgIGxhc3RfZXJybm8gPSAwOworICAgIHJldHVybiBjZDsKKworSUNPTlZfT1BFTl9FUlI6CisgICAgaWYgKGNkKQorCWljb252X2Nsb3NlKGNkKTsKKyAgICBsYXN0X2Vycm5vID0gRUlOVkFMOworICAgIHJldHVybiAoaWNvbnZfdCktMTsKK30KKworLyoKKyAqIFVzZWQgd2hlbiB0aGVyZSBhcmUgc2FtZSB2YWx1ZSBpbiAnZnJvbSBlbmNvZGluZycgYW5kICd0byBlbmNvZGluZycuCisgKiBURUMgZG9lc24ndCBzdXBwb3J0IGNvbnZlcnNpb24gYmV0d2VlbiBzYW1lIGVuY29kaW5ncywgYW5kCisgKiBURUNDcmVhdGVDb252ZXJ0ZXIoKSBmYWlsZWQuCisgKi8KKyAgICBzdGF0aWMgc2l6ZV90CitudWxsX2NvbnYoaWNvbnZfdCBjZCwgY29uc3QgY2hhcioqIGluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LAorCWNoYXIqKiBvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KQoreworICAgIGNvbnN0IGNoYXIqIGJ1Zl9pbiA9IGluYnVmICYmICppbmJ1ZiA/ICppbmJ1ZiA6IE5VTEw7CisgICAgY2hhciogYnVmX291dCA9IG91dGJ1ZiAmJiAqb3V0YnVmID8gKm91dGJ1ZiA6IE5VTEw7CisKKyAgICBpZiAoYnVmX2luKQorICAgIHsKKwlpbnQgaW5fbGVuID0gaW5ieXRlc2xlZnQgPyAqaW5ieXRlc2xlZnQgOiAwOworCWludCBvdXRfbGVuID0gb3V0Ynl0ZXNsZWZ0ID8gKm91dGJ5dGVzbGVmdCA6IDA7CisKKwlpZiAoIWJ1Zl9vdXQgfHwgb3V0X2xlbiA8PSAwKQorCXsKKwkgICAgbGFzdF9lcnJubyA9IEUyQklHOworCSAgICByZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGluX2xlbiA+IDApCisJeworCSAgICBpbnQgbGVuID0gaW5fbGVuIDwgb3V0X2xlbiA/IGluX2xlbiA6IG91dF9sZW47CisKKwkgICAgbWVtY3B5IChidWZfb3V0LCBidWZfaW4sIGxlbik7CisJICAgICppbmJ1ZiArPSBsZW47CisJICAgICpvdXRidWYgKz0gbGVuOworCSAgICAqaW5ieXRlc2xlZnQgLT0gbGVuOworCSAgICAqb3V0Ynl0ZXNsZWZ0IC09IGxlbjsKKwkgICAgaWYgKCpvdXRieXRlc2xlZnQgPD0gMCkKKwkgICAgeworCQlsYXN0X2Vycm5vID0gRTJCSUc7CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgbGFzdF9lcnJubyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKKyAgICBzaXplX3QKK2ljb252KGljb252X3QgY2QsIGNvbnN0IGNoYXIqKiBpbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwKKwljaGFyKiogb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCkKK3sKKyAgICBDb25zdFRleHRQdHIgYnVmX2luOworICAgIFRleHRQdHIgYnVmX291dDsKKyAgICBCeXRlQ291bnQgb3V0X2xlbiwgb3V0X3RydWU7CisgICAgQnl0ZUNvdW50IGluX2xlbiwgaW5fdHJ1ZTsKKyAgICBPU1N0YXR1cyBzdDsKKworICAgIGlmICghY2QpCisgICAgeworCWxhc3RfZXJybm8gPSBFTk9FTlQ7IC8qIFRPRE86IEFub3RoZXIgZXJyb3IgY29kZSBzaG91bGQgYmUgc2V0ICovCisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY2QtPmZyb20gPT0gY2QtPnRvKQorCXJldHVybiBudWxsX2NvbnYoY2QsIGluYnVmLCBpbmJ5dGVzbGVmdCwgb3V0YnVmLCBvdXRieXRlc2xlZnQpIDsKKworICAgIGJ1Zl9pbiA9IChUZXh0UHRyKSBpbmJ1ZiA7CisgICAgYnVmX291dCA9IChUZXh0UHRyKSBvdXRidWYgOworICAgIG91dF9sZW4gPSBvdXRfdHJ1ZSA9IC0xOworICAgIGluX2xlbiA9IGluX3RydWUgPSAtMTsKKworICAgIGlmIChidWZfaW4gJiYgYnVmX291dCkKKyAgICB7CisJSXRlbUNvdW50IGVycm9yLCBmZWF0dXJlOworCisJLyogTm9ybWFsIGNvbnZlcnQgbW9kZSAqLworCWlmICghaW5ieXRlc2xlZnQgfHwgIW91dGJ5dGVzbGVmdCkKKwl7CisJICAgIGxhc3RfZXJybm8gPSBFRkFVTFQ7CisJICAgIHJldHVybiAtMTsKKwl9CisJaW5fbGVuID0gKmluYnl0ZXNsZWZ0OworCW91dF9sZW4gPSAqb3V0Ynl0ZXNsZWZ0OworCisJLyogQ2hlY2sgc3RyZWFtIGlzIGZvcm0gaW4gZXhwZWN0ZWQgZW5jb2Rpbmcgb3Igbm90ICovCisJc3QgPSBURUNTbmlmZlRleHRFbmNvZGluZyhjZC0+c25pZmYsIChUZXh0UHRyKWJ1Zl9pbiwgaW5fbGVuLAorCQkmY2QtPmZyb20sIDEsICZlcnJvciwgMSwgJmZlYXR1cmUsIDEpOworCVRSQUNFKCJURUNTbmlmZlRleHRFbmNvZGluZygpPSVkIGVycm9yPSVkIGZlYXR1cmU9JWRcbiIsCisJCShpbnQpc3QsIChpbnQpZXJyb3IsIChpbnQpZmVhdHVyZSk7CisJaWYgKChlcnJvciAhPSAwIHx8IGZlYXR1cmUgPT0gMCkKKwkJJiYgIShlcnJvciA9PSAweGZmZmZmZmZmICYmIGZlYXR1cmUgPT0gMHhmZmZmZmZmZikpCisJICAgIC8qIE5vdCBleHBlY3RlZCBlbmNvZGluZyAqLworCSAgICBzdCA9IGtURUNVbm1hcHBhYmxlRWxlbWVudEVycjsKKwllbHNlCisJeworCSAgICAvKiBEbyBjb252ZXJ0ICovCisJICAgIHN0ID0gVEVDQ29udmVydFRleHQoY2QtPnRlYywKKwkJICAgIGJ1Zl9pbiwgaW5fbGVuLCAmaW5fdHJ1ZSwKKwkJICAgIGJ1Zl9vdXQsIG91dF9sZW4sICZvdXRfdHJ1ZSk7CisJICAgIC8qIFZlcmlmeSBjb252ZXJ0ZWQgdGV4dC4gIENvbXBhcmUgb3JpZ2luYWwgdGV4dCB3aXRoIHJldmVyc2UKKwkgICAgICogY29udmVydGVkIHRleHQuICBJZiBub3QgbWF0Y2gsIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBvbgorCSAgICAgKiBjb252ZXJ0aW5nLiAqLworCSAgICBpZiAoc3QgPT0gMCAmJiBpbl90cnVlID4gMCkKKwkgICAgeworCQlCeXRlQ291bnQgcmV2X2luLCByZXZfb3V0OworCQlUZXh0UHRyIGJ1Zl9yZXYgPSAoVGV4dFB0cilhbGxvYyhpbl90cnVlKTsKKworCQlpZiAoYnVmX3JldikKKwkJeworCQkgICAgc3QgPSBURUNDb252ZXJ0VGV4dChjZC0+dGVjUmV2ZXJzZSwKKwkJCSAgICBidWZfb3V0LCBvdXRfdHJ1ZSwgJnJldl9pbiwKKwkJCSAgICBidWZfcmV2LCBpbl90cnVlLCAmcmV2X291dCk7CisJCSAgICBpZiAoc3QgIT0gMCB8fCByZXZfaW4gIT0gb3V0X3RydWUgfHwgcmV2X291dCAhPSBpbl90cnVlCisJCQkgICAgfHwgbWVtY21wKGJ1Zl9yZXYsIGJ1Zl9pbiwgcmV2X291dCkgIT0gMCkKKwkJICAgIHsKKyNpZmRlZiBJQ09OVk9TWF9ERUJVRworCQkJZnByaW50ZihzdGRlcnIsICIgIHJldmVyc2UgY29udmVyc2lvbiBmYWlsZWQuXG4iKTsKKyNlbmRpZgorCQkJc3QgPSBrVEVDVW5tYXBwYWJsZUVsZW1lbnRFcnI7CisJCSAgICB9CisJCSAgICB2aW1fZnJlZShidWZfcmV2KTsKKwkJfQorCQllbHNlCisJCSAgICBzdCA9IGtURUNVbm1hcHBhYmxlRWxlbWVudEVycjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZSBpZiAoIWJ1Zl9pbiAmJiBidWZfb3V0KQorICAgIHsKKwkvKiBGbHVzaCBhbGwgYnVmZmVyZWQgc3RyaW5ncyB0byBidWZmZXIsIGFuZCByZXNldCBzdGF0dXMgKi8KKwlpZiAoIW91dGJ5dGVzbGVmdCkKKwl7CisJICAgIGxhc3RfZXJybm8gPSBFRkFVTFQ7CisJICAgIHJldHVybiAtMTsKKwl9CisJb3V0X2xlbiA9ICpvdXRieXRlc2xlZnQ7CisJc3QgPSBURUNGbHVzaFRleHQoY2QtPnRlYywKKwkJYnVmX291dCwgb3V0X2xlbiwgJm91dF90cnVlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWJ1Zl9pbiAmJiAhYnVmX291dCkKKyAgICB7CisJLyogUmVzZXQgY2QncyBzdGF0dXMgYW5kIGNhbmNlbCBidWZmZXJlZCBzdHJpbmdzICovCisJdW5zaWduZWQgY2hhciB0bXBfb3V0WzI1Nl07CisKKwlidWZfb3V0ID0gdG1wX291dDsKKwlvdXRfbGVuID0gc2l6ZW9mKHRtcF9vdXQpOworCXN0ID0gVEVDRmx1c2hUZXh0KGNkLT50ZWMsCisJCWJ1Zl9vdXQsIG91dF9sZW4sICZvdXRfdHJ1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbGFzdF9lcnJubyA9IEVGQVVMVDsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIFRSQUNFKCJzdD0lZCwgYnVmX2luPSVwLCBpbl9sZW49JWQsIGluX3RydWU9JWRcbiIKKwkgICAgIiAgYnVmX291dD0lcCwgb3V0X2xlbj0lZCwgb3V0X3RydWU9JWRcbiIsIChpbnQpc3QsCisJICAgIGJ1Zl9pbiwgKGludClpbl9sZW4sIChpbnQpaW5fdHJ1ZSwKKwkgICAgYnVmX291dCwgKGludClvdXRfbGVuLCAoaW50KW91dF90cnVlKTsKKworICAgIHN3aXRjaCAoc3QpCisgICAgeworCWNhc2UgMDoKKwkgICAgLyogTm8gZXJyb3IgKi8KKwkgICAgaWYgKGluYnl0ZXNsZWZ0KQorCQkqaW5ieXRlc2xlZnQgLT0gaW5fdHJ1ZTsKKwkgICAgaWYgKG91dGJ5dGVzbGVmdCkKKwkJKm91dGJ5dGVzbGVmdCAtPSBvdXRfdHJ1ZTsKKwkgICAgaWYgKGluYnVmICYmICppbmJ1ZikKKwkJKmluYnVmICs9IGluX3RydWU7CisJICAgIGlmIChvdXRidWYgJiYgKm91dGJ1ZikKKwkJKm91dGJ1ZiArPSBvdXRfdHJ1ZTsKKwkgICAgbGFzdF9lcnJubyA9IDA7CisJICAgIHJldHVybiAwOyAvKiBObyBlcnJvciAqLworCWNhc2Uga1RFQ1VubWFwcGFibGVFbGVtZW50RXJyOgorCSAgICBsYXN0X2Vycm5vID0gRUlMU0VROworCWNhc2Uga1RFQ0luY29tcGxldGVFbGVtZW50RXJyOgorCSAgICBsYXN0X2Vycm5vID0gRUlOVkFMOworCWNhc2Uga1RFQ091dHB1dEJ1ZmZlckZ1bGxTdGF0dXM6CisJICAgIGxhc3RfZXJybm8gPSBFMkJJRzsKKwkgICAgcmV0dXJuIC0xOworCWRlZmF1bHQ6CisJICAgIFRSQUNFKCJpY29udiglcCwgJXAsICVwLCAlcCwgJXApIGZhaWxlZC4gKCVkKVxuIiwKKwkJICAgIGNkLCBpbmJ1ZiwgaW5ieXRlc2xlZnQsIG91dGJ1Ziwgb3V0Ynl0ZXNsZWZ0LCAoaW50KXN0KTsKKwkgICAgbGFzdF9lcnJubyA9IEVGQVVMVDsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworICAgIGludAoraWNvbnZfY2xvc2UoaWNvbnZfdCBjZCkKK3sKKyAgICBpZiAoY2QpCisgICAgeworCS8qIEZyZWUgYWxsIGVsZW1lbnRzIG9mIGljb252X3QgKi8KKwlpZiAoY2QtPnRlYykKKwkgICAgVEVDRGlzcG9zZUNvbnZlcnRlcihjZC0+dGVjKTsKKwlpZiAoY2QtPnRlY1JldmVyc2UpCisJICAgIFRFQ0Rpc3Bvc2VDb252ZXJ0ZXIoY2QtPnRlY1JldmVyc2UpOworCWlmIChjZC0+c25pZmYpCisJICAgIFRFQ0Rpc3Bvc2VTbmlmZmVyKGNkLT5zbmlmZik7CisJdmltX2ZyZWUoY2QpOworCWxhc3RfZXJybm8gPSAwOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWxhc3RfZXJybm8gPSBFSU5WQUw7CisJcmV0dXJuIC0xOworICAgIH0KK30KKworICAgIGludCoKK2ljb252X2Vycm5vKCkKK3sKKyAgICByZXR1cm4gJmxhc3RfZXJybm87Cit9CisjZW5kaWYgLyogTUFDT1NfWF9JQ09OVkVNVSAqLworCisjaWZkZWYgVVNFX01DSF9HRVRURVhUCisKKyNkZWZpbmUgR0VUVEVYVF9CVUZOVU0JCTY0CisjZGVmaW5lIEdFVFRFWFRfQlVGU0laRQkJMjU2CisKKyAgICBjaGFyKgorbWNoX2dldHRleHQoY29uc3QgY2hhciogbXNnaWQpCit7CisgICAgc3RhdGljIGNoYXIJCWJ1ZltHRVRURVhUX0JVRk5VTV1bR0VUVEVYVF9CVUZTSVpFXTsKKyAgICBzdGF0aWMgaW50CQlidWZudW0gPSAwOworICAgIGNvbnN0IGNoYXIJCSptc2cgPSBOVUxMOworICAgIENGU3RyaW5nUmVmCQlzdHJrZXkgPSBOVUxMLCBzdHJtc2cgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcJZW5jOworCisgICAgaWYgKCFtc2dpZCkKKwlnb3RvIE1DSF9HRVRURVhUX0ZJTklTSDsKKyAgICBlbmMgPSBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKCk7CisgICAgVFJBQ0UoIm1jaF9nZXR0ZXh0KCVzKVxuIiwgbXNnaWQpOworCisgICAgc3Rya2V5ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhOVUxMLCBtc2dpZCwgZW5jKTsKKyAgICBpZiAoIXN0cmtleSkKKyAgICB7CisJVFJBQ0UoIiAgQ2FuJ3QgY3JlYXRlIGEgQ0ZTdHJpbmcgZm9yIG1zZ2lkLlxuIik7CisJZ290byBNQ0hfR0VUVEVYVF9GSU5JU0g7CisgICAgfQorCisgICAgc3RybXNnID0gQ0ZDb3B5TG9jYWxpemVkU3RyaW5nKHN0cmtleSwgTlVMTCk7CisgICAgaWYgKCFzdHJtc2cpCisgICAgeworCVRSQUNFKCIgIE5vIGxvY2FsaXplZCBzdHJpbmdzIGZvciBtc2dpZC5cbiIpOworCWdvdG8gTUNIX0dFVFRFWFRfRklOSVNIOworICAgIH0KKworICAgIG1zZyA9IENGU3RyaW5nR2V0Q1N0cmluZ1B0cihzdHJtc2csIGVuYyk7CisgICAgaWYgKCFtc2cpCisgICAgeworCS8qIFRoaXMgaXMgYXMgYmFja3VwIHdoZW4gQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyIHdhcyBmYWlsZWQgKi8KKwlDRlN0cmluZ0dldENTdHJpbmcoc3RybXNnLCBidWZbYnVmbnVtXSwgR0VUVEVYVF9CVUZTSVpFLCBlbmMpOworCW1zZyA9IGJ1ZltidWZudW1dOworCWlmICgrK2J1Zm51bSA+PSBHRVRURVhUX0JVRk5VTSkKKwkgICAgYnVmbnVtID0gMDsKKyAgICB9CisgICAgVFJBQ0UoIiAgTG9jYWxpemVkIHRvOiAlc1xuIiwgbXNnKTsKKworTUNIX0dFVFRFWFRfRklOSVNIOgorICAgIGlmIChzdHJrZXkpCisJQ0ZSZWxlYXNlKHN0cmtleSk7CisgICAgaWYgKHN0cm1zZykKKwlDRlJlbGVhc2Uoc3RybXNnKTsKKyAgICByZXR1cm4gKGNoYXIqKShtc2cgPyBtc2cgOiBtc2dpZCk7Cit9CisKKyAgICBjaGFyKgorbWNoX2JpbmR0ZXh0ZG9tYWluKGNvbnN0IGNoYXIqIGRvbWFpbiwgY29uc3QgY2hhciogZGlybmFtZSkKK3sKKyAgICBUUkFDRSgibWNoX2JpbmR0ZXh0ZG9tYWluKCVzLCAlcylcbiIsIGRvbWFpbiwgZGlybmFtZSk7CisgICAgcmV0dXJuIChjaGFyKilkaXJuYW1lOworfQorCisgICAgY2hhcioKK21jaF90ZXh0ZG9tYWluKGNvbnN0IGNoYXIqIGRvbWFpbikKK3sKKyAgICBUUkFDRSgibWNoX3RleHRkb21haW4oJXMpXG4iLCBkb21haW4pOworICAgIHJldHVybiAoY2hhciopZG9tYWluOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3NfbWludC5oIGIvc3JjL29zX21pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQxOWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX21pbnQuaApAQCAtMCwwICsxLDEzIEBACisvKiB2aW06dHM9OCBzdHM9NDpzdz00CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBBdGFyaSBNaU5UIE1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncy4KKyAqLworCisjZGVmaW5lIEJJTkFSWV9GSUxFX0lPCmRpZmYgLS1naXQgYS9zcmMvb3NfbXNkb3MuYyBiL3NyYy9vc19tc2Rvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGIxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfbXNkb3MuYwpAQCAtMCwwICsxLDMxMTQgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIG9zX21zZG9zLmMKKyAqCisgKiBNU0RPUyBzeXN0ZW0tZGVwZW5kZW50IHJvdXRpbmVzLgorICogQSBjaGVhcCBwbGFzdGljIGltaXRhdGlvbiBvZiB0aGUgYW1pZ2EgZGVwZW5kZW50IGNvZGUuCisgKiBBIGxvdCBpbiB0aGlzIGZpbGUgd2FzIG1hZGUgYnkgSnVlcmdlbiBXZWlnZXJ0IChqdykuCisgKgorICogREpHUFAgY2hhbmdlcyBieSBHZXJ0IHZhbiBBbnR3ZXJwZW4KKyAqIEZhc3RlciB0ZXh0IHNjcmVlbnMgYnkgSm9obiBMYW5nZSAoamxhbmdlQHppbGtlci5uZXQpCisgKiBXaW5kb3dzIGNsaXBib2FyZCBmdW5jdGlvbmFsaXR5IGFkZGVkIGJ5IERhdmlkIEtvdGNoYW4gKGRrKQorICoKKyAqIFNvbWUgZnVuY3Rpb25zIGFyZSBhbHNvIHVzZWQgZm9yIFdpbjE2IChNUy1XaW5kb3dzIDMuMSkuCisgKi8KKworI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSAidmltLmgiCisKKyNpbmNsdWRlIDxjb25pby5oPgorI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKy8qCisgKiBNUy1ET1Mgb25seSBjb2RlLCBub3QgdXNlZCBmb3IgV2luMTYuCisgKi8KKyNpZm5kZWYgV0lOMTYKKworCisjaW5jbHVkZSA8Ymlvcy5oPgorI2lmZGVmIERKR1BQCisjIGluY2x1ZGUgPGRwbWkuaD4KKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjIGluY2x1ZGUgPHN5cy9tb3ZlZGF0YS5oPgorIyBpbmNsdWRlIDxjcnQwLmg+CisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisjICBpbmNsdWRlIDxzeXMvc2VnbWVudHMuaD4KKyMgZW5kaWYKKyNlbHNlCisjIGluY2x1ZGUgPGFsbG9jLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCisjIGRlZmluZSBfY2RlY2wJICAgIC8qIERKR1BQIGRvZXNuJ3QgaGF2ZSB0aGlzICovCisjZW5kaWYKKworc3RhdGljIGludCBjYnJrX3ByZXNzZWQgPSBGQUxTRTsgICAgLyogc2V0IGJ5IGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCitzdGF0aWMgaW50IGN0cmxjX3ByZXNzZWQgPSBGQUxTRTsgICAvKiBzZXQgd2hlbiBjdHJsLUMgb3IgY3RybC1icmVhayBkZXRlY3RlZCAqLworc3RhdGljIGludCBkZWxheWVkX3JlZHJhdyA9IEZBTFNFOyAgLyogc2V0IHdoZW4gY3RybC1DIGRldGVjdGVkICovCisKK3N0YXRpYyBpbnQgYmlvc2tleV9yZWFkID0gX05LRVlCUkRfUkVBRDsgICAvKiBiaW9za2V5KCkgYXJndW1lbnQ6IHJlYWQga2V5ICovCitzdGF0aWMgaW50IGJpb3NrZXlfcmVhZHkgPSBfTktFWUJSRF9SRUFEWTsgLyogYmlvc2tleSgpIGFyZ3VtZW50OiBrZXkgcmVhZHk/ICovCisKKyNpZmRlZiBGRUFUX01PVVNFCitzdGF0aWMgaW50IG1vdXNlX2F2YWlsID0gRkFMU0U7CQkvKiBtb3VzZSBwcmVzZW50ICovCitzdGF0aWMgaW50IG1vdXNlX2FjdGl2ZTsJCS8qIG1vdXNlIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgbW91c2VfaGlkZGVuOwkJLyogbW91c2Ugbm90IHNob3duICovCitzdGF0aWMgaW50IG1vdXNlX2NsaWNrID0gLTE7CQkvKiBtb3VzZSBzdGF0dXMgKi8KK3N0YXRpYyBpbnQgbW91c2VfbGFzdF9jbGljayA9IC0xOwkvKiBwcmV2aW91cyBzdGF0dXMgYXQgY2xpY2sgKi8KK3N0YXRpYyBpbnQgbW91c2VfeCA9IC0xOwkJLyogbW91c2UgeCBjb29kaW5hdGUgKi8KK3N0YXRpYyBpbnQgbW91c2VfeSA9IC0xOwkJLyogbW91c2UgeSBjb29kaW5hdGUgKi8KK3N0YXRpYyBsb25nIG1vdXNlX2NsaWNrX3RpbWUgPSAwOwkvKiBiaW9zdGltZSgpIG9mIGxhc3QgY2xpY2sgKi8KK3N0YXRpYyBpbnQgbW91c2VfY2xpY2tfY291bnQgPSAwOwkvKiBjb3VudCBmb3IgbXVsdGktY2xpY2tzICovCitzdGF0aWMgaW50IG1vdXNlX2NsaWNrX3ggPSAwOwkJLyogeCBvZiBwcmV2aW91cyBtb3VzZSBjbGljayAqLworc3RhdGljIGludCBtb3VzZV9jbGlja195ID0gMDsJCS8qIHkgb2YgcHJldmlvdXMgbW91c2UgY2xpY2sgKi8KK3N0YXRpYyBsaW5lbnJfVCBtb3VzZV90b3BsaW5lID0gMDsJLyogd190b3BsaW5lIGF0IHByZXZpb3VzIG1vdXNlIGNsaWNrICovCisjaWZkZWYgRkVBVF9ESUZGCitzdGF0aWMgaW50IG1vdXNlX3RvcGZpbGwgPSAwOwkJLyogd190b3BmaWxsIGF0IHByZXZpb3VzIG1vdXNlIGNsaWNrICovCisjZW5kaWYKK3N0YXRpYyBpbnQgbW91c2VfeF9kaXYgPSA4OwkJLyogY29sdW1uID0geCBjb29yZCAvIG1vdXNlX3hfZGl2ICovCitzdGF0aWMgaW50IG1vdXNlX3lfZGl2ID0gODsJCS8qIGxpbmUgICA9IHkgY29vcmQgLyBtb3VzZV95X2RpdiAqLworI2VuZGlmCisKKyNkZWZpbmUgQklPU1RJQ0sgICAgNTUJCQkvKiBiaW9zdGltZSgpIGluY3JlYXNlcyBvbmUgdGljayBhYm91dAorCQkJCQkgICBldmVyeSA1NSBtc2VjICovCisKK3N0YXRpYyBpbnQgb3JpZ19hdHRyID0gMHgwNzAwOwkJLyogdmlkZW8gYXR0cmlidXRlcyB3aGVuIHN0YXJ0aW5nICovCisKK3N0YXRpYyBpbnQgU19pTGVmdCA9IDA7CQkJLyogU2Nyb2xsIHdpbmRvdzsgdGhlc2UgYXJlIDEgb2Zmc2V0ICovCitzdGF0aWMgaW50IFNfaVRvcCA9IDA7CitzdGF0aWMgaW50IFNfaVJpZ2h0ID0gMDsKK3N0YXRpYyBpbnQgU19pQm90dG9tID0gMDsKKworLyoKKyAqIE5lZWQgdG8gcmVtZW1iZXIgdGhlIHZhbHVlcywgYmVjYXVzZSB3ZSBzZXQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwKKyAqIGVkZ2VzIHNlcGFyYXRlbHkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbXl3aW5kb3coaW50IGlMZWZ0LCBpbnQgaVRvcCwgaW50IGlSaWdodCwgaW50IGlCb3R0b20pCit7CisgICAgU19pTGVmdCA9IGlMZWZ0OworICAgIFNfaVRvcCA9IGlUb3A7CisgICAgU19pUmlnaHQgPSBpUmlnaHQ7CisgICAgU19pQm90dG9tID0gaUJvdHRvbTsKKyAgICB3aW5kb3coaUxlZnQsIGlUb3AsIGlSaWdodCwgaUJvdHRvbSk7Cit9CisKKyNpZmRlZiBESkdQUAorLyoKKyAqIEZvciBESkdQUCwgdXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBmYXN0IHRleHQgc2NyZWVucy4gIEpNTCAxLzE4Lzk4CisgKi8KKwordW5zaWduZWQgbG9uZwlTX3VsU2NyZWVuQmFzZSA9IDB4YjgwMDA7Cit1bnNpZ25lZCBzaG9ydAlTX3VpQXR0cmlidXRlID0gMDsKK2ludAkJU19pQ3VycmVudFJvdyA9IDA7CS8qIFRoZXNlIGFyZSAwIG9mZnNldCAqLworaW50CQlTX2lDdXJyZW50Q29sdW1uID0gMDsKK3Nob3J0CQlTX3NlbFZpZGVvOwkvKiBTZWxlY3RvciBmb3IgREpHUFAgZGlyZWN0IHZpZGVvIHRyYW5zZmVycyAqLworCisvKgorICogVXNlIGJ1cnN0IHdyaXRlcyB0byBpbXByb3ZlIG1jaF93cml0ZSBzcGVlZCAtIFZKTiAwMS8xMC85OQorICovCit1bnNpZ25lZCBzaG9ydAlTX2xpbmVidWZmZXJbODAwMF07IC8qIDxWTj4gZW5vdWdoIGZvciAxNjB4NTAgKi8KK3Vuc2lnbmVkIHNob3J0CVNfYmxhbmtidWZmZXJbMjU2XTsgLyogPFZOPiBtYXggbGVuZ3RoIG9mIGNvbnNvbGUgbGluZSAqLwordW5zaWduZWQgc2hvcnQJKlNfbGluZWJ1ZmZlcnBvcyA9IFNfbGluZWJ1ZmZlcjsKK2ludAkJU19pQnVmZmVyUm93OworaW50CQlTX2lCdWZmZXJDb2x1bW47CisKKyAgICBzdGF0aWMgdm9pZAorbXlmbHVzaCh2b2lkKQoreworICAgIGlmIChTX2xpbmVidWZmZXJwb3MgIT0gU19saW5lYnVmZmVyKQorICAgIHsKKwlfZG9zbWVtcHV0dyhTX2xpbmVidWZmZXIsIChTX2xpbmVidWZmZXJwb3MgLSBTX2xpbmVidWZmZXIpLAorCQlTX3VsU2NyZWVuQmFzZQorCQkgICAgICArIFNfaUJ1ZmZlclJvdyAqIChDb2x1bW5zIDw8IDEpICsgKFNfaUJ1ZmZlckNvbHVtbiA8PCAxKSk7CisJU19saW5lYnVmZmVycG9zID0gU19saW5lYnVmZmVyOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitteWdvdG94eShpbnQgeCwgaW50IHkpCit7CisgICAgU19pQ3VycmVudFJvdyA9IHkgLSAxOworICAgIFNfaUN1cnJlbnRDb2x1bW4gPSB4IC0gMTsKK30KKworLyoKKyAqIFNldCB0aGUgc3lzdGVtIGN1cnNvciB0byBvdXIgY3Vyc29yIHBvc2l0aW9uLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9zeXNfY3Vyc29yKHZvaWQpCit7CisgICAgaWYgKHRlcm1fY29uc29sZSAmJiBmdWxsX3NjcmVlbikKKyAgICB7CisJbXlmbHVzaCgpOworCWdvdG94eShTX2lDdXJyZW50Q29sdW1uICsgMSwgU19pQ3VycmVudFJvdyArIDEpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCitzZXRibGFua2J1ZmZlcih1bnNpZ25lZCBzaG9ydCB1aVZhbHVlKQoreworICAgIGludAkJCQlpOworICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydAlvbGR1aVZhbHVlID0gMDsKKworICAgIGlmIChvbGR1aVZhbHVlICE9IHVpVmFsdWUpCisgICAgeworCS8qIExvYWQgYmxhbmsgbGluZSBidWZmZXIgd2l0aCBzcGFjZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ29sdW1uczsgKytpKQorCSAgICBTX2JsYW5rYnVmZmVyW2ldID0gdWlWYWx1ZTsKKwlvbGR1aVZhbHVlID0gdWlWYWx1ZTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbXljbHJlb2wodm9pZCkKK3sKKyAgICAvKiBDbGVhciB0byBlbmQgb2YgbGluZSAqLworICAgIHNldGJsYW5rYnVmZmVyKFNfdWlBdHRyaWJ1dGUgfCAnICcpOworICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIFNfaVJpZ2h0IC0gU19pQ3VycmVudENvbHVtbiwgU191bFNjcmVlbkJhc2UKKwkJCSArIChTX2lDdXJyZW50Um93KSAqIChDb2x1bW5zIDw8IDEpCisJCQkgKyAoU19pQ3VycmVudENvbHVtbiA8PCAxKSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbXljbHJzY3Iodm9pZCkKK3sKKyAgICAvKiBDbGVhciB3aG9sZSBzY3JlZW4gKi8KKyAgICBzaG9ydAlpQ29sdW1uOworICAgIGludAkJZW5kcG9pbnQgPSAoUm93cyAqIENvbHVtbnMpIDw8IDE7CisKKyAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKKworICAgIGZvciAoaUNvbHVtbiA9IDA7IGlDb2x1bW4gPCBlbmRwb2ludDsgaUNvbHVtbiArPSAoQ29sdW1ucyA8PCAxKSkKKwlfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCBDb2x1bW5zLCBTX3VsU2NyZWVuQmFzZSArIGlDb2x1bW4pOworfQorCisgICAgc3RhdGljIHZvaWQKK215ZGVsbGluZSh2b2lkKQoreworICAgIHNob3J0IGlSb3csIGlDb2x1bW47CisKKyAgICBpQ29sdW1uID0gKFNfaUxlZnQgLSAxKSA8PCAxOworCisgICAgLyogQ29weSB0aGUgbGluZXMgdW5kZXJuZWF0aCAqLworICAgIGZvciAoaVJvdyA9IFNfaUN1cnJlbnRSb3c7IGlSb3cgPCBTX2lCb3R0b20gLSAxOyBpUm93KyspCisJbW92ZWRhdGEoU19zZWxWaWRlbywgKCgoaVJvdyArIDEpICogQ29sdW1ucykgPDwgMSkgKyBpQ29sdW1uLAorCQlTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCisJCShTX2lSaWdodCAtIFNfaUxlZnQgKyAxKSA8PCAxKTsKKworICAgIC8qIENsZWFyIHRoZSBuZXcgcm93ICovCisgICAgc2V0YmxhbmtidWZmZXIoU191aUF0dHJpYnV0ZSB8ICcgJyk7CisKKyAgICBfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCAoU19pUmlnaHQgLSBTX2lMZWZ0KSArIDEsIFNfdWxTY3JlZW5CYXNlCisJCQkgKyAoU19pQm90dG9tIC0gMSkgKiAoQ29sdW1ucyA8PCAxKSArIGlDb2x1bW4pOworfQorCisgICAgc3RhdGljIHZvaWQKK215aW5zbGluZSh2b2lkKQoreworICAgIHNob3J0IGlSb3csIGlDb2x1bW47CisKKyAgICBpQ29sdW1uID0gKFNfaUxlZnQgLSAxKSA8PCAxOworCisgICAgLyogQ29weSB0aGUgbGluZXMgdW5kZXJuZWF0aCAqLworICAgIGZvciAoaVJvdyA9IFNfaUJvdHRvbSAtIDE7IGlSb3cgPj0gU19pVG9wOyBpUm93LS0pCisJbW92ZWRhdGEoU19zZWxWaWRlbywgKCgoaVJvdyAtIDEpICogQ29sdW1ucykgPDwgMSkgKyBpQ29sdW1uLAorCQlTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCisJCShTX2lSaWdodCAtIFNfaUxlZnQgKyAxKSA8PCAxKTsKKworICAgIC8qIENsZWFyIHRoZSBuZXcgcm93ICovCisgICAgc2V0YmxhbmtidWZmZXIoU191aUF0dHJpYnV0ZSB8ICcgJyk7CisKKyAgICBfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCAoU19pUmlnaHQgLSBTX2lMZWZ0KSArIDEsIFNfdWxTY3JlZW5CYXNlCisJCQkgKyAoU19pVG9wIC0gMSkgKiAoQ29sdW1ucyA8PCAxKSArIGlDb2x1bW4pOworfQorCisvKgorICogU2Nyb2xsIHRoZSBzY3JlZW4gb25lIGxpbmUgdXAsIGNsZWFyIHRoZSBsYXN0IGxpbmUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbXlzY3JvbGwodm9pZCkKK3sKKyAgICBzaG9ydAkJaVJvdywgaUNvbHVtbjsKKworICAgIGlDb2x1bW4gPSAoU19pTGVmdCAtIDEpIDw8IDE7CisKKyAgICAvKiBDb3B5IHRoZSBzY3JlZW4gKi8KKyAgICBmb3IgKGlSb3cgPSBTX2lUb3A7IGlSb3cgPCBTX2lCb3R0b207IGlSb3crKykKKwltb3ZlZGF0YShTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCisJCVNfc2VsVmlkZW8sICgoKGlSb3cgLSAxKSAqIENvbHVtbnMpIDw8IDEpICsgaUNvbHVtbiwKKwkJKFNfaVJpZ2h0IC0gU19pTGVmdCArIDEpIDw8IDEpOworCisgICAgLyogQ2xlYXIgdGhlIGJvdHRvbSByb3cgKi8KKyAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKKworICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIChTX2lSaWdodCAtIFNfaUxlZnQpICsgMSwgU191bFNjcmVlbkJhc2UKKwkJCSArIChTX2lCb3R0b20gLSAxKSAqIChDb2x1bW5zIDw8IDEpICsgaUNvbHVtbik7Cit9CisKKyAgICBzdGF0aWMgaW50CitteXB1dGNoKGludCBpQ2hhcikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCB1aVZhbHVlOworCisgICAgaWYgKGlDaGFyID09ICdcbicpCisgICAgeworCW15Zmx1c2goKTsKKwlpZiAoU19pQ3VycmVudFJvdyA+PSBTX2lCb3R0b20gLSBTX2lUb3ApCisJICAgIG15c2Nyb2xsKCk7CisJZWxzZQorCXsKKwkgICAgU19pQ3VycmVudENvbHVtbiA9IFNfaUxlZnQgLSAxOworCSAgICBTX2lDdXJyZW50Um93Kys7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChpQ2hhciA9PSAnXHInKQorICAgIHsKKwlteWZsdXNoKCk7CisJU19pQ3VycmVudENvbHVtbiA9IFNfaUxlZnQgLSAxOworICAgIH0KKyAgICBlbHNlIGlmIChpQ2hhciA9PSAnXGInKQorICAgIHsKKwlteWZsdXNoKCk7CisJaWYgKFNfaUN1cnJlbnRDb2x1bW4gPj0gU19pTGVmdCkKKwkgICAgU19pQ3VycmVudENvbHVtbi0tOworICAgIH0KKyAgICBlbHNlIGlmIChpQ2hhciA9PSA3KQorICAgIHsKKwlzb3VuZCg0NDApOwkvKiBzaG9ydCBiZWVwICovCisJZGVsYXkoMjAwKTsKKwlub3NvdW5kKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdWlWYWx1ZSA9IFNfdWlBdHRyaWJ1dGUgfCAodW5zaWduZWQgY2hhcilpQ2hhcjsKKworCS8qCisJICogTm9ybWFsIGNoYXIgLSBhcmUgd2Ugc3RhcnRpbmcgdG8gYnVmZmVyPworCSAqLworCWlmIChTX2xpbmVidWZmZXJwb3MgPT0gU19saW5lYnVmZmVyKQorCXsKKwkgICAgU19pQnVmZmVyQ29sdW1uID0gU19pQ3VycmVudENvbHVtbjsKKwkgICAgU19pQnVmZmVyUm93ID0gU19pQ3VycmVudFJvdzsKKwl9CisKKwkqU19saW5lYnVmZmVycG9zKysgPSB1aVZhbHVlOworCisJU19pQ3VycmVudENvbHVtbisrOworCWlmIChTX2lDdXJyZW50Q29sdW1uID49IFNfaVJpZ2h0ICYmIFNfaUN1cnJlbnRSb3cgPj0gU19pQm90dG9tIC0gU19pVG9wKQorCXsKKwkgICAgbXlmbHVzaCgpOworCSAgICBteXNjcm9sbCgpOworCSAgICBTX2lDdXJyZW50Q29sdW1uID0gU19pTGVmdCAtIDE7CisJICAgIFNfaUN1cnJlbnRSb3crKzsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbXl0ZXh0aW5pdChzdHJ1Y3QgdGV4dF9pbmZvICpwVGV4dGluZm8pCit7CisgICAgU19zZWxWaWRlbyA9IF9fZHBtaV9zZWdtZW50X3RvX2Rlc2NyaXB0b3IoU191bFNjcmVlbkJhc2UgPj4gNCk7CisgICAgU191aUF0dHJpYnV0ZSA9IHBUZXh0aW5mby0+bm9ybWF0dHIgPDwgODsKK30KKworICAgIHN0YXRpYyB2b2lkCitnZXRfc2NyZWVuYmFzZSh2b2lkKQoreworICAgIHN0YXRpYyB1bmlvbiBSRUdTCSAgICByZWdzOworCisgICAgLyogb2xkIEhlcmN1bGVzIGdyYWZpYyBjYXJkIGhhcyBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzIChNYWNld2ljeikgKi8KKyAgICByZWdzLmguYWggPSAweDBmOworICAgICh2b2lkKWludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7CS8qIGludCAxMCAwZiAqLworICAgIGlmIChyZWdzLmguYWwgPT0gMHgwNykJCS8qIHZpZGVvIG1vZGUgNyAtLSBoZXJjdWxlcyBtb25vICovCisJU191bFNjcmVlbkJhc2UgPSAweGIwMDAwOworICAgIGVsc2UKKwlTX3VsU2NyZWVuQmFzZSA9IDB4YjgwMDA7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbXl0ZXh0YXR0cihpbnQgaUF0dHJpYnV0ZSkKK3sKKyAgICBTX3VpQXR0cmlidXRlID0gKHVuc2lnbmVkIHNob3J0KWlBdHRyaWJ1dGUgPDwgODsKK30KKworICAgIHN0YXRpYyB2b2lkCitteW5vcm12aWRlbyh2b2lkKQoreworICAgIG15dGV4dGF0dHIob3JpZ19hdHRyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitteXRleHRjb2xvcihpbnQgaVRleHRDb2xvcikKK3sKKyAgICBTX3VpQXR0cmlidXRlID0gKHVuc2lnbmVkIHNob3J0KSgoU191aUF0dHJpYnV0ZSAmIDB4ZjAwMCkKKwkJCQkJICAgfCAodW5zaWduZWQgc2hvcnQpaVRleHRDb2xvciA8PCA4KTsKK30KKworICAgIHN0YXRpYyB2b2lkCitteXRleHRiYWNrZ3JvdW5kKGludCBpQmtnQ29sb3IpCit7CisgICAgU191aUF0dHJpYnV0ZSA9ICh1bnNpZ25lZCBzaG9ydCkoKFNfdWlBdHRyaWJ1dGUgJiAweDBmMDApCisJCQkJCSB8ICh1bnNpZ25lZCBzaG9ydCkoaUJrZ0NvbG9yIDw8IDEyKSk7Cit9CisvKgorICogR2V0ZGlnaXRzOiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZyBhbmQgc2tpcCBvdmVyIGl0LgorICogTm90ZTogdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIGNoYXJfdSBwb2ludGVyIQorICovCisKKyAgICBzdGF0aWMgbG9uZworbXlnZXRkaWdpdHMocHApCisgICAgY2hhcl91ICoqcHA7Cit7CisgICAgY2hhcl91CSpwOworICAgIGxvbmcJcmV0dmFsID0gMDsKKworICAgIHAgPSAqcHA7CisgICAgaWYgKCpwID09ICctJykJCS8qIHNraXAgbmVnYXRpdmUgc2lnbiAqLworCSsrcDsKKyAgICB3aGlsZSAoVklNX0lTRElHSVQoKnApKQorICAgIHsKKwlyZXR2YWwgPSAocmV0dmFsICogMTApICsgKCpwIC0gJzAnKTsKKwkrK3A7CisgICAgfQorICAgIGlmICgqKnBwID09ICctJykJCS8qIHByb2Nlc3MgbmVnYXRpdmUgc2lnbiAqLworCXJldHZhbCA9IC1yZXR2YWw7CisKKyAgICAqcHAgPSBwOworICAgIHJldHVybiByZXR2YWw7Cit9CisjZWxzZQorIyBkZWZpbmUgbXlnb3RveHkgZ290b3h5CisjIGRlZmluZSBteXB1dGNoIHB1dGNoCisjIGRlZmluZSBteXNjcm9sbCBzY3JvbGwKKyMgZGVmaW5lIG15bm9ybXZpZGVvIG5vcm12aWRlbworIyBkZWZpbmUgbXl0ZXh0YXR0ciB0ZXh0YXR0cgorIyBkZWZpbmUgbXl0ZXh0Y29sb3IgdGV4dGNvbG9yCisjIGRlZmluZSBteXRleHRiYWNrZ3JvdW5kIHRleHRiYWNrZ3JvdW5kCisjIGRlZmluZSBteWdldGRpZ2l0cyBnZXRkaWdpdHMKKyMgZGVmaW5lIG15Y2xyZW9sIGNscmVvbAorIyBkZWZpbmUgbXljbHJzY3IgY2xyc2NyCisjIGRlZmluZSBteWluc2xpbmUgaW5zbGluZQorIyBkZWZpbmUgbXlkZWxsaW5lIGRlbGxpbmUKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgICAgY2hhcl91CXNjYW5jb2RlOworICAgIGNoYXJfdQltZXRha2V5OworfSBhbHRrZXlfdGFibGVbXSA9Cit7CisgICAgezB4MWUsIDB4ZTF9LCAvKiBhICovCisgICAgezB4MzAsIDB4ZTJ9LCAvKiBiICovCisgICAgezB4MmUsIDB4ZTN9LCAvKiBjICovCisgICAgezB4MjAsIDB4ZTR9LCAvKiBkICovCisgICAgezB4MTIsIDB4ZTV9LCAvKiBlICovCisgICAgezB4MjEsIDB4ZTZ9LCAvKiBmICovCisgICAgezB4MjIsIDB4ZTd9LCAvKiBnICovCisgICAgezB4MjMsIDB4ZTh9LCAvKiBoICovCisgICAgezB4MTcsIDB4ZTl9LCAvKiBpICovCisgICAgezB4MjQsIDB4ZWF9LCAvKiBqICovCisgICAgezB4MjUsIDB4ZWJ9LCAvKiBrICovCisgICAgezB4MjYsIDB4ZWN9LCAvKiBsICovCisgICAgezB4MzIsIDB4ZWR9LCAvKiBtICovCisgICAgezB4MzEsIDB4ZWV9LCAvKiBuICovCisgICAgezB4MTgsIDB4ZWZ9LCAvKiBvICovCisgICAgezB4MTksIDB4ZjB9LCAvKiBwICovCisgICAgezB4MTAsIDB4ZjF9LCAvKiBxICovCisgICAgezB4MTMsIDB4ZjJ9LCAvKiByICovCisgICAgezB4MWYsIDB4ZjN9LCAvKiBzICovCisgICAgezB4MTQsIDB4ZjR9LCAvKiB0ICovCisgICAgezB4MTYsIDB4ZjV9LCAvKiB1ICovCisgICAgezB4MmYsIDB4ZjZ9LCAvKiB2ICovCisgICAgezB4MTEsIDB4Zjd9LCAvKiB3ICovCisgICAgezB4MmQsIDB4Zjh9LCAvKiB4ICovCisgICAgezB4MTUsIDB4Zjl9LCAvKiB5ICovCisgICAgezB4MmMsIDB4ZmF9LCAvKiB6ICovCisgICAgezB4NzgsIDB4YjF9LCAvKiAxICovCisgICAgezB4NzksIDB4YjJ9LCAvKiAyICovCisgICAgezB4N2EsIDB4YjN9LCAvKiAzICovCisgICAgezB4N2IsIDB4YjR9LCAvKiA0ICovCisgICAgezB4N2MsIDB4YjV9LCAvKiA1ICovCisgICAgezB4N2QsIDB4YjZ9LCAvKiA2ICovCisgICAgezB4N2UsIDB4Yjd9LCAvKiA3ICovCisgICAgezB4N2YsIDB4Yjh9LCAvKiA4ICovCisgICAgezB4ODAsIDB4Yjl9LCAvKiA5ICovCisgICAgezB4ODEsIDB4YjB9LCAvKiAwICovCit9OworCisvKgorICogVHJhbnNsYXRlIGV4dGVuZGVkIGtleWNvZGVzIGludG8gbWV0YS1jaGFycyB3aGVyZSBhcHBsaWNhYmxlCisgKi8KKyAgICBzdGF0aWMgaW50Cit0cmFuc2xhdGVfYWx0a2V5cyhpbnQgcmF3a2V5KQoreworICAgIGludCBpLCBjOworCisgICAgaWYgKChyYXdrZXkgJiAweGZmKSA9PSAwKQorICAgIHsKKwljID0gKHJhd2tleSA+PiA4KTsKKwlmb3IgKGkgPSBzaXplb2YoYWx0a2V5X3RhYmxlKSAvIHNpemVvZihhbHRrZXlfdGFibGVbMF0pOyAtLWkgPj0gMDsgKQorCXsKKwkgICAgaWYgKGMgPT0gYWx0a2V5X3RhYmxlW2ldLnNjYW5jb2RlKQorCQlyZXR1cm4gKGludClhbHRrZXlfdGFibGVbaV0ubWV0YWtleTsKKwl9CisgICAgfQorICAgIHJldHVybiByYXdrZXk7Cit9CisKKy8qCisgKiBTZXQgbm9ybWFsIGZnL2JnIGNvbG9yLCBiYXNlZCBvbiBUX01FLiAgQ2FsbGVkIHdoZW0gdF9tZSBoYXMgYmVlbiBzZXQuCisgKi8KKyAgICB2b2lkCittY2hfc2V0X25vcm1hbF9jb2xvcnMoKQoreworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCW47CisKKyAgICBjdGVybV9ub3JtYWxfZmdfY29sb3IgPSAob3JpZ19hdHRyICYgMHhmKSArIDE7CisgICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChvcmlnX2F0dHIgPj4gNCkgJiAweGYpICsgMTsKKyAgICBpZiAoVF9NRVswXSA9PSBFU0MgJiYgVF9NRVsxXSA9PSAnfCcpCisgICAgeworCXAgPSBUX01FICsgMjsKKwluID0gZ2V0ZGlnaXRzKCZwKTsKKwlpZiAoKnAgPT0gJ20nICYmIG4gPiAwKQorCXsKKwkgICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKG4gJiAweGYpICsgMTsKKwkgICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChuID4+IDQpICYgMHhmKSArIDE7CisJfQorICAgIH0KK30KKworI2lmIGRlZmluZWQoTUNIX0NVUlNPUl9TSEFQRSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTYXZlL3Jlc3RvcmUgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IuCisgKiBjYWxsIHdpdGggRkFMU0UgdG8gc2F2ZSwgVFJVRSB0byByZXN0b3JlCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWNoX3Jlc3RvcmVfY3Vyc29yX3NoYXBlKGludCByZXN0b3JlKQoreworICAgIHN0YXRpYyB1bmlvbiBSRUdTCSAgICByZWdzOworICAgIHN0YXRpYyBpbnQJCSAgICBzYXZlZCA9IEZBTFNFOworCisgICAgaWYgKHJlc3RvcmUpCisgICAgeworCWlmIChzYXZlZCkKKwkgICAgcmVncy5oLmFoID0gMHgwMTsJICAgIC8qU2V0IEN1cnNvciovCisJZWxzZQorCSAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmVncy5oLmFoID0gMHgwMzsJICAgIC8qR2V0IEN1cnNvciovCisJcmVncy5oLmJoID0gMHgwMDsJICAgIC8qUGFnZSAqLworCXNhdmVkID0gVFJVRTsKKyAgICB9CisKKyAgICAodm9pZClpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOworfQorCisvKgorICogU2V0IHRoZSBzaGFwZSBvZiB0aGUgY3Vyc29yLgorICogJ3RoaWNrbmVzcycgY2FuIGJlIGZyb20gMCAodGhpbikgdG8gNyAoYmxvY2spCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWNoX3NldF9jdXJzb3Jfc2hhcGUoaW50IHRoaWNrbmVzcykKK3sKKyAgICB1bmlvbiBSRUdTCSAgICByZWdzOworCisgICAgcmVncy5oLmNoID0gNyAtIHRoaWNrbmVzczsJICAgIC8qU3RhcnRpbmcgTGluZSovCisgICAgcmVncy5oLmNsID0gNzsJCSAgICAvKkVuZGluZyBMaW5lKi8KKyAgICByZWdzLmguYWggPSAweDAxOwkJICAgIC8qU2V0IEN1cnNvciovCisgICAgKHZvaWQpaW50ODYoMHgxMCwgJnJlZ3MsICZyZWdzKTsKK30KKworICAgIHZvaWQKK21jaF91cGRhdGVfY3Vyc29yKHZvaWQpCit7CisgICAgaW50CQlpZHg7CisgICAgaW50CQl0aGlja25lc3M7CisKKyAgICAvKgorICAgICAqIEhvdyB0aGUgY3Vyc29yIGlzIGRyYXduIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbW9kZS4KKyAgICAgKi8KKyAgICBpZHggPSBnZXRfc2hhcGVfaWR4KEZBTFNFKTsKKworICAgIGlmIChzaGFwZV90YWJsZVtpZHhdLnNoYXBlID09IFNIQVBFX0JMT0NLKQorCXRoaWNrbmVzcyA9IDc7CisgICAgZWxzZQorCXRoaWNrbmVzcyA9ICg3ICogc2hhcGVfdGFibGVbaWR4XS5wZXJjZW50YWdlICsgOTApIC8gMTAwOworICAgIG1jaF9zZXRfY3Vyc29yX3NoYXBlKHRoaWNrbmVzcyk7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBhbW91bnQgb2YgbWVtb3J5IGN1cnJlbnRseSBhdmFpbGFibGUuCisgKi8KKyAgICBsb25nX3UKK21jaF9hdmFpbF9tZW0oaW50IHNwZWNpYWwpCit7CisjaWZkZWYgREpHUFAKKyAgICByZXR1cm4gX2dvMzJfZHBtaV9yZW1haW5pbmdfdmlydHVhbF9tZW1vcnkoKTsKKyNlbHNlCisgICAgcmV0dXJuIGNvcmVsZWZ0KCk7CisjZW5kaWYKK30KKworI2lmZGVmIEZFQVRfTU9VU0UKKworLyoKKyAqIFNldCBhcmVhIHdoZXJlIG1vdXNlIGNhbiBiZSBtb3ZlZCB0bzogVGhlIHdob2xlIHNjcmVlbi4KKyAqIFJvd3MgYW5kIENvbHVtbnMgbXVzdCBiZSB2YWxpZCB3aGVuIGNhbGxpbmchCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbW91c2VfYXJlYSh2b2lkKQoreworICAgIHVuaW9uIFJFR1MJICAgIHJlZ3M7CisKKyAgICBpZiAobW91c2VfYXZhaWwpCisgICAgeworCXJlZ3MueC5jeCA9IDA7CS8qIG1vdXNlIHZpc2libGUgYmV0d2VlbiBjeCBhbmQgZHggKi8KKwlyZWdzLnguZHggPSBDb2x1bW5zICogbW91c2VfeF9kaXYgLSAxOworCXJlZ3MueC5heCA9IDc7CisJKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKKworCXJlZ3MueC5jeCA9IDA7CS8qIG1vdXNlIHZpc2libGUgYmV0d2VlbiBjeCBhbmQgZHggKi8KKwlyZWdzLnguZHggPSBSb3dzICogbW91c2VfeV9kaXYgLSAxOworCXJlZ3MueC5heCA9IDg7CisJKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorc2hvd19tb3VzZShpbnQgb24pCit7CisgICAgc3RhdGljIGludAkgICAgd2FzX29uID0gRkFMU0U7CisgICAgdW5pb24gUkVHUwkgICAgcmVnczsKKworICAgIGlmIChtb3VzZV9hdmFpbCkKKyAgICB7CisJaWYgKCFtb3VzZV9hY3RpdmUgfHwgbW91c2VfaGlkZGVuKQorCSAgICBvbiA9IEZBTFNFOworCS8qCisJICogQ2FyZWZ1bDogRWFjaCBzd2l0Y2ggb24gbXVzdCBiZSBjb21wZW5zYXRlZCBieSBleGFjdGx5IG9uZSBzd2l0Y2gKKwkgKiBvZmYKKwkgKi8KKwlpZiAoKG9uICYmICF3YXNfb24pIHx8ICghb24gJiYgd2FzX29uKSkKKwl7CisJICAgIHdhc19vbiA9IG9uOworCSAgICByZWdzLnguYXggPSBvbiA/IDEgOiAyOworCSAgICBpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwkvKiBzaG93IG1vdXNlICovCisJICAgIGlmIChvbikKKwkJbW91c2VfYXJlYSgpOworCX0KKyAgICB9Cit9CisKKyNlbmRpZgorCisvKgorICogVmVyc2lvbiBvZiBrYmhpdCgpIGFuZCBnZXRjaCgpIHRoYXQgdXNlIGRpcmVjdCBjb25zb2xlIEkvTy4KKyAqIFRoaXMgYXZvaWRzIHRyb3VibGUgd2l0aCBDVFJMLVAgYW5kIHRoZSBsaWtlLCBhbmQgc2hvdWxkIHdvcmsgb3ZlciBhIHRlbG5ldAorICogY29ubmVjdGlvbiAoaXQgd29ya3MgZm9yIFh2aSkuCisgKi8KKworc3RhdGljIGludCBjb25zX2tleSA9IC0xOworCisvKgorICogVHJ5IHRvIGdldCBvbmUgY2hhcmFjdGVyIGRpcmVjdGx5IGZyb20gdGhlIGNvbnNvbGUuCisgKiBJZiB0aGVyZSBpcyBhIGtleSwgaXQgaXMgc3RvcmVkIGluIGNvbnNfa2V5LgorICogT25seSBjYWxsIHdoZW4gY29uc19rZXkgaXMgLTEhCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY29uc19nZXRrZXkodm9pZCkKK3sKKyAgICB1bmlvbiBSRUdTIHJlZ3M7CisKKyAgICAvKiBjYWxsIERPUyBmdW5jdGlvbiA2OiBEaXJlY3QgY29uc29sZSBJL08gKi8KKyAgICByZWdzLmguYWggPSAweDA2OworICAgIHJlZ3MuaC5kbCA9IDB4ZmY7CisgICAgKHZvaWQpaW50ZG9zKCZyZWdzLCAmcmVncyk7CisgICAgaWYgKChyZWdzLnguZmxhZ3MgJiAweDQwKSA9PSAwKQkvKiB6ZXJvIGZsYWcgbm90IHNldD8gKi8KKwljb25zX2tleSA9IChyZWdzLmguYWwgJiAweGZmKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NvbnNfa2JoaXQodm9pZCkKK3sKKyAgICBpZiAoY29uc19rZXkgPCAwKQorCWNvbnNfZ2V0a2V5KCk7CisgICAgcmV0dXJuIChjb25zX2tleSA+PSAwKTsKK30KKworLyoKKyAqIFJldHVybiBhIGNoYXJhY3RlciBmcm9tIHRoZSBjb25zb2xlLgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdmltX2tiaGl0KCkgcmV0dXJucyBUUlVFLgorICovCisgICAgc3RhdGljIGludAorY29uc19nZXRjaCh2b2lkKQoreworICAgIGludAkgICAgYyA9IC0xOworCisgICAgaWYgKGNvbnNfa2V5IDwgMCkKKwljb25zX2dldGtleSgpOworICAgIGMgPSBjb25zX2tleTsKKyAgICBjb25zX2tleSA9IC0xOworICAgIHJldHVybiBjOworfQorCisKKyNpZmRlZiBESkdQUAorLyoKKyAqIERKR1BQIHByb3ZpZGVzIGEga2JoaXQoKSBmdW5jdGlvbiB0aGF0IGdvZXMgdG8gdGhlIEJJT1MgaW5zdGVhZCBvZiBET1MuCisgKiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgdGVybWluYWxzIGNvbm5lY3RlZCB0byBhIHNlcmlhbCBwb3J0LgorICogUmVkZWZpbmUga2JoaXQoKSBoZXJlIHRvIG1ha2UgaXQgd29yay4KKyAqLworICAgIHN0YXRpYyBpbnQKK3ZpbV9rYmhpdCh2b2lkKQoreworICAgIHVuaW9uIFJFR1MgcmVnczsKKworICAgIHJlZ3MuaC5haCA9IDB4MGI7CisgICAgKHZvaWQpaW50ZG9zKCZyZWdzLCAmcmVncyk7CisgICAgcmV0dXJuIHJlZ3MuaC5hbDsKK30KKworI2lmZGVmIGtiaGl0CisjIHVuZGVmIGtiaGl0CSAgICAvKiBtaWdodCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBjb25pby5oICovCisjZW5kaWYKKyNkZWZpbmUga2JoaXQoKQl2aW1fa2JoaXQoKQorCisjZW5kaWYKKworLyoKKyAqIFNpbXVsYXRlIFdhaXRGb3JDaGFyKCkgYnkgc2xvd2x5IHBvbGxpbmcgd2l0aCBiaW9za2V5KDEpIG9yIGtiaGl0KCkuCisgKgorICogSWYgVmltIHNob3VsZCB3b3JrIG92ZXIgdGhlIHNlcmlhbCBsaW5lIGFmdGVyIGEgJ2N0dHkgY29tMScgd2UgbXVzdCB1c2UKKyAqIGtiaGl0KCkgYW5kIGdldGNoKCkuIChqdykKKyAqIFVzdWFsbHkga2JoaXQoKSBpcyBub3QgdXNlZCwgYmVjYXVzZSB0aGVuIENUUkwtQyBhbmQgQ1RSTC1QCisgKiB3aWxsIGJlIGNhdGNoZWQgYnkgRE9TIChtb29sKS4KKyAqCisgKiByZXR1cm4gVFJVRSBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIEZBTFNFIG90aGVyd2lzZQorICovCisKKyNkZWZpbmUgRk9SRVZFUiAxOTk5OTk5OTk5TAorCisgICAgc3RhdGljICBpbnQKK1dhaXRGb3JDaGFyKGxvbmcgbXNlYykKK3sKKyAgICB1bmlvbiBSRUdTCXJlZ3M7CisgICAgbG9uZwlzdGFydHRpbWUgPSAwOworICAgIGludAkJeCwgeTsKKworICAgIGlmIChtc2VjICE9IDApCisJc3RhcnR0aW1lID0gYmlvc3RpbWUoMCwgMEwpOworCisgICAgZm9yICg7OykKKyAgICB7CisjaWZkZWYgRkVBVF9NT1VTRQorCWxvbmcJCWNsaWNrdGltZTsKKwlzdGF0aWMgaW50CW9sZF9zdGF0dXMgPSAwOworCisJaWYgKG1vdXNlX2F2YWlsICYmIG1vdXNlX2FjdGl2ZSAmJiBtb3VzZV9jbGljayA8IDApCisJeworCSAgICByZWdzLnguYXggPSAzOworCSAgICBpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwkgICAgLyogY2hlY2sgbW91c2Ugc3RhdHVzICovCisJCS8qIG9ubHkgcmVjb2duaXplIGJ1dHRvbi1kb3duIGFuZCBidXR0b24tdXAgZXZlbnQgKi8KKwkgICAgeCA9IHJlZ3MueC5jeCAvIG1vdXNlX3hfZGl2OworCSAgICB5ID0gcmVncy54LmR4IC8gbW91c2VfeV9kaXY7CisJICAgIGlmICgob2xkX3N0YXR1cyA9PSAwKSAhPSAocmVncy54LmJ4ID09IDApKQorCSAgICB7CisJCWlmIChvbGRfc3RhdHVzKQkvKiBidXR0b24gdXAgKi8KKwkJICAgIG1vdXNlX2NsaWNrID0gTU9VU0VfUkVMRUFTRTsKKwkJZWxzZQkJCS8qIGJ1dHRvbiBkb3duICovCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBUcmFuc2xhdGUgTVNET1MgbW91c2UgZXZlbnRzIHRvIFZpbSBtb3VzZSBldmVudHMuCisJCSAgICAgKiBUT0RPOiBzaG91bGQgaGFuZGxlIG1pZGRsZSBtb3VzZSBidXR0b24sIGJ5IHByZXNzaW5nCisJCSAgICAgKiBsZWZ0IGFuZCByaWdodCBhdCB0aGUgc2FtZSB0aW1lLgorCQkgICAgICovCisJCSAgICBpZiAocmVncy54LmJ4ICYgTVNET1NfTU9VU0VfTEVGVCkKKwkJCW1vdXNlX2NsaWNrID0gTU9VU0VfTEVGVDsKKwkJICAgIGVsc2UgaWYgKHJlZ3MueC5ieCAmIE1TRE9TX01PVVNFX1JJR0hUKQorCQkJbW91c2VfY2xpY2sgPSBNT1VTRV9SSUdIVDsKKwkJICAgIGVsc2UgaWYgKHJlZ3MueC5ieCAmIE1TRE9TX01PVVNFX01JRERMRSkKKwkJCW1vdXNlX2NsaWNrID0gTU9VU0VfTUlERExFOworCisJCSAgICAvKgorCQkgICAgICogRmluZCBvdXQgaWYgdGhpcyBpcyBhIG11bHRpLWNsaWNrCisJCSAgICAgKi8KKwkJICAgIGNsaWNrdGltZSA9IGJpb3N0aW1lKDAsIDBMKTsKKwkJICAgIGlmIChtb3VzZV9jbGlja194ID09IHggJiYgbW91c2VfY2xpY2tfeSA9PSB5CisJCQkgICAgJiYgbW91c2VfdG9wbGluZSA9PSBjdXJ3aW4tPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkJICAgICYmIG1vdXNlX3RvcGZpbGwgPT0gY3Vyd2luLT53X3RvcGZpbGwKKyNlbmRpZgorCQkJICAgICYmIG1vdXNlX2NsaWNrX2NvdW50ICE9IDQKKwkJCSAgICAmJiBtb3VzZV9jbGljayA9PSBtb3VzZV9sYXN0X2NsaWNrCisJCQkgICAgJiYgY2xpY2t0aW1lIDwgbW91c2VfY2xpY2tfdGltZQorCQkJCQkJCSsgcF9tb3VzZXQgLyBCSU9TVElDSykKKwkJCSsrbW91c2VfY2xpY2tfY291bnQ7CisJCSAgICBlbHNlCisJCQltb3VzZV9jbGlja19jb3VudCA9IDE7CisJCSAgICBtb3VzZV9jbGlja190aW1lID0gY2xpY2t0aW1lOworCQkgICAgbW91c2VfbGFzdF9jbGljayA9IG1vdXNlX2NsaWNrOworCQkgICAgbW91c2VfY2xpY2tfeCA9IHg7CisJCSAgICBtb3VzZV9jbGlja195ID0geTsKKwkJICAgIG1vdXNlX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIG1vdXNlX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbmRpZgorCQkgICAgU0VUX05VTV9NT1VTRV9DTElDS1MobW91c2VfY2xpY2ssIG1vdXNlX2NsaWNrX2NvdW50KTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgaWYgKG9sZF9zdGF0dXMgJiYgKHggIT0gbW91c2VfeCB8fCB5ICE9IG1vdXNlX3kpKQorCQltb3VzZV9jbGljayA9IE1PVVNFX0RSQUc7CisJICAgIG9sZF9zdGF0dXMgPSByZWdzLnguYng7CisJICAgIGlmIChtb3VzZV9oaWRkZW4gJiYgbW91c2VfeCA+PSAwICYmIChtb3VzZV94ICE9IHggfHwgbW91c2VfeSAhPSB5KSkKKwkgICAgeworCQltb3VzZV9oaWRkZW4gPSBGQUxTRTsKKwkJc2hvd19tb3VzZShUUlVFKTsKKwkgICAgfQorCSAgICBtb3VzZV94ID0geDsKKwkgICAgbW91c2VfeSA9IHk7CisJfQorI2VuZGlmCisKKwlpZiAoKHBfY29uc2sgPyBjb25zX2tiaGl0KCkKKwkJCQkgOiBwX2Jpb3NrID8gYmlvc2tleShiaW9za2V5X3JlYWR5KSA6IGtiaGl0KCkpCisJCXx8IGNicmtfcHJlc3NlZAorI2lmZGVmIEZFQVRfTU9VU0UKKwkJCQkJCSAgICB8fCBtb3VzZV9jbGljayA+PSAwCisjZW5kaWYKKwkJKQorCSAgICByZXR1cm4gVFJVRTsKKwkvKgorCSAqIFVzZSBiaW9zdGltZSgpIHRvIHdhaXQgdW50aWwgb3VyIHRpbWUgaXMgZG9uZS4KKwkgKiBXZSBidXN5LXdhaXQgaGVyZS4gIFVuZm9ydHVuYXRlbHksIGRlbGF5KCkgYW5kIHVzbGVlcCgpIGhhdmUgYmVlbgorCSAqIHJlcG9ydGVkIHRvIGdpdmUgcHJvYmxlbXMgd2l0aCB0aGUgb3JpZ2luYWwgV2luZG93cyA5NS4gIFRoaXMgaXMKKwkgKiBmaXhlZCBpbiBzZXJ2aWNlIHBhY2sgMSwgYnV0IG5vdCBldmVyeWJvZHkgaW5zdGFsbGVkIHRoYXQuCisJICogVGhlIERKR1BQIGltcGxlbWVudGF0aW9uIG9mIHVzbGVlcCgpIHVzZXMgYSBidXN5LXdhaXQgbG9vcCB0b28uCisJICovCisJaWYgKG1zZWMgPT0gMCB8fCAobXNlYyAhPSBGT1JFVkVSCisJCQkgICAgJiYgYmlvc3RpbWUoMCwgMEwpID4gc3RhcnR0aW1lICsgbXNlYyAvIEJJT1NUSUNLKSkKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBESkdQUAorCS8qIFlpZWxkIHRoZSBDUFUgdG8gdGhlIG5leHQgcHJvY2Vzcy4gKi8KKwlfX2RwbWlfeWllbGQoKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBkb24ndCBkbyBhbnl0aGluZyBmb3IgYWJvdXQgIm1zZWMiIG1zZWMKKyAqLworICAgIHZvaWQKK21jaF9kZWxheSgKKyAgICBsb25nCW1zZWMsCisgICAgaW50CQlpZ25vcmVpbnB1dCkKK3sKKyAgICBsb25nCXN0YXJ0dGltZTsKKworICAgIGlmIChpZ25vcmVpbnB1dCkKKyAgICB7CisJLyoKKwkgKiBXZSBidXN5LXdhaXQgaGVyZS4gIFVuZm9ydHVuYXRlbHksIGRlbGF5KCkgYW5kIHVzbGVlcCgpIGhhdmUgYmVlbgorCSAqIHJlcG9ydGVkIHRvIGdpdmUgcHJvYmxlbXMgd2l0aCB0aGUgb3JpZ2luYWwgV2luZG93cyA5NS4gIFRoaXMgaXMKKwkgKiBmaXhlZCBpbiBzZXJ2aWNlIHBhY2sgMSwgYnV0IG5vdCBldmVyeWJvZHkgaW5zdGFsbGVkIHRoYXQuCisJICovCisJc3RhcnR0aW1lID0gYmlvc3RpbWUoMCwgMEwpOworCXdoaWxlIChiaW9zdGltZSgwLCAwTCkgPCBzdGFydHRpbWUgKyBtc2VjIC8gQklPU1RJQ0spCisJICAgIDsKKyAgICB9CisgICAgZWxzZQorCVdhaXRGb3JDaGFyKG1zZWMpOworfQorCisvKgorICogbWNoX3dyaXRlKCk6IHdyaXRlIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzY3JlZW4KKyAqLworICAgIHZvaWQKK21jaF93cml0ZSgKKyAgICBjaGFyX3UJKnMsCisgICAgaW50CQlsZW4pCit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJcm93LCBjb2w7CisKKyAgICBpZiAodGVybV9jb25zb2xlICYmIGZ1bGxfc2NyZWVuKQorCXdoaWxlIChsZW4tLSkKKwl7CisJICAgIC8qIHRyYW5zbGF0ZSBFU0MgfCBzZXF1ZW5jZXMgaW50byBiaW9zIGNhbGxzICovCisJICAgIGlmIChwX3dkKQkgICAgLyogdGVzdGluZzogd2FpdCBhIGJpdCBmb3IgZWFjaCBjaGFyICovCisJCVdhaXRGb3JDaGFyKHBfd2QpOworCisJICAgIGlmIChzWzBdID09ICdcbicpCisjaWZkZWYgREpHUFAKKwkgICAgeworCQlteWZsdXNoKCk7CisJCVNfaUN1cnJlbnRDb2x1bW4gPSBTX2lMZWZ0IC0gMTsKKwkgICAgfQorI2Vsc2UKKwkJbXlwdXRjaCgnXHInKTsKKyNlbmRpZgorCSAgICBlbHNlIGlmIChzWzBdID09IEVTQyAmJiBsZW4gPiAxICYmIHNbMV0gPT0gJ3wnKQorCSAgICB7CisJCXN3aXRjaCAoc1syXSkKKwkJeworI2lmZGVmIERKR1BQCisJCWNhc2UgJ0InOiAgIFNjcmVlblZpc3VhbEJlbGwoKTsKKwkJCSAgICBnb3RvIGdvdDM7CisjZW5kaWYKKwkJY2FzZSAnSic6CisjaWZkZWYgREpHUFAKKwkJCSAgICBteWZsdXNoKCk7CisjZW5kaWYKKwkJCSAgICBteWNscnNjcigpOworCQkJICAgIGdvdG8gZ290MzsKKworCQljYXNlICdLJzoKKyNpZmRlZiBESkdQUAorCQkJICAgIG15Zmx1c2goKTsKKyNlbmRpZgorCQkJICAgIG15Y2xyZW9sKCk7CisJCQkgICAgZ290byBnb3QzOworCisJCWNhc2UgJ0wnOgorI2lmZGVmIERKR1BQCisJCQkgICAgbXlmbHVzaCgpOworI2VuZGlmCisJCQkgICAgbXlpbnNsaW5lKCk7CisJCQkgICAgZ290byBnb3QzOworCisJCWNhc2UgJ00nOgorI2lmZGVmIERKR1BQCisJCQkgICAgbXlmbHVzaCgpOworI2VuZGlmCisJCQkgICAgbXlkZWxsaW5lKCk7Citnb3QzOgkJCSAgICBzICs9IDM7CisJCQkgICAgbGVuIC09IDI7CisJCQkgICAgY29udGludWU7CisKKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCWNhc2UgJzQnOgorCQljYXNlICc1JzoKKwkJY2FzZSAnNic6CisJCWNhc2UgJzcnOgorCQljYXNlICc4JzoKKwkJY2FzZSAnOSc6ICAgcCA9IHMgKyAyOworCQkJICAgIHJvdyA9IG15Z2V0ZGlnaXRzKCZwKTsgICAgLyogbm8gY2hlY2sgZm9yIGxlbmd0aCEgKi8KKwkJCSAgICBpZiAocCA+IHMgKyBsZW4pCisJCQkJYnJlYWs7CisJCQkgICAgaWYgKCpwID09ICc7JykKKwkJCSAgICB7CisJCQkJKytwOworCQkJCWNvbCA9IG15Z2V0ZGlnaXRzKCZwKTsgLyogbm8gY2hlY2sgZm9yIGxlbmd0aCEgKi8KKwkJCQlpZiAocCA+IHMgKyBsZW4pCisJCQkJICAgIGJyZWFrOworCQkJCWlmICgqcCA9PSAnSCcgfHwgKnAgPT0gJ3InIHx8ICpwID09ICdWJykKKwkJCQl7CisjaWZkZWYgREpHUFAKKwkJCQkgICAgbXlmbHVzaCgpOworI2VuZGlmCisJCQkJICAgIGlmICgqcCA9PSAnSCcpICAvKiBzZXQgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJCW15Z290b3h5KGNvbCwgcm93KTsKKwkJCQkgICAgZWxzZSBpZiAoKnAgPT0gJ1YnKQorCQkJCQlteXdpbmRvdyhyb3csIFNfaVRvcCwgY29sLCBTX2lCb3R0b20pOworCQkJCSAgICBlbHNlCSAgICAvKiBzZXQgc2Nyb2xsIHJlZ2lvbiAgKi8KKwkJCQkJbXl3aW5kb3coU19pTGVmdCwgcm93LCBTX2lSaWdodCwgY29sKTsKKwkJCQkgICAgbGVuIC09IHAgLSBzOworCQkJCSAgICBzID0gcCArIDE7CisJCQkJICAgIGNvbnRpbnVlOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAoKnAgPT0gJ20nIHx8ICpwID09ICdmJyB8fCAqcCA9PSAnYicpCisJCQkgICAgeworCQkJCWlmICgqcCA9PSAnbScpCSAgICAvKiBzZXQgY29sb3IgKi8KKwkJCQl7CisJCQkJICAgIGlmIChyb3cgPT0gMCkKKwkJCQkJbXlub3JtdmlkZW8oKTsvKiByZXNldCBjb2xvciAqLworCQkJCSAgICBlbHNlCisJCQkJCW15dGV4dGF0dHIocm93KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKnAgPT0gJ2YnKSAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLworCQkJCSAgICBteXRleHRjb2xvcihyb3cpOworCQkJCWVsc2UJCSAgICAvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworCQkJCSAgICBteXRleHRiYWNrZ3JvdW5kKHJvdyk7CisKKwkJCQlsZW4gLT0gcCAtIHM7CisJCQkJcyA9IHAgKyAxOworCQkJCWNvbnRpbnVlOworCQkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIG15cHV0Y2goKnMrKyk7CisJfQorICAgIGVsc2UKKyAgICB7CisJd3JpdGUoMSwgcywgKHVuc2lnbmVkKWxlbik7CisgICAgfQorfQorCisvKgorICogbWNoX2luY2hhcigpOiBsb3cgbGV2ZWwgaW5wdXQgZnVuY2lvbi4KKyAqIEdldCBhIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQuCisgKiBJZiB0aW1lID09IDAgZG8gbm90IHdhaXQgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB0aW1lID09IG4gd2FpdCBhIHNob3J0IHRpbWUgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB0aW1lID09IC0xIHdhaXQgZm9yZXZlciBmb3IgY2hhcmFjdGVycy4KKyAqCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9idGFpbmVkCisgKi8KKyAgICBpbnQKK21jaF9pbmNoYXIoCisgICAgY2hhcl91CSpidWYsCisgICAgaW50CQltYXhsZW4sCisgICAgbG9uZwl0aW1lLAorICAgIGludAkJdGJfY2hhbmdlX2NudCkKK3sKKyAgICBpbnQJCWxlbiA9IDA7CisgICAgaW50CQljOworICAgIGludAkJdG1wX2M7CisgICAgc3RhdGljIGludAluZXh0Y2hhciA9IDA7CSAgICAvKiBtYXkga2VlcCBjaGFyYWN0ZXIgd2hlbiBtYXhsZW4gPT0gMSAqLworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIHN0YXRpYyBpbnQJb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBpZiB3ZSBnb3QgYSBjdHJsLUMgd2hlbiB3ZSB3ZXJlIGJ1c3ksIHRoZXJlIHdpbGwgYmUgYSAiXkMiIHNvbWV3aGVyZQorICAgICAqIG9uIHRoZSBzY2Vlbiwgc28gd2UgbmVlZCB0byByZWRpc3BsYXkgaXQuCisgICAgICovCisgICAgaWYgKGRlbGF5ZWRfcmVkcmF3KQorICAgIHsKKwlkZWxheWVkX3JlZHJhdyA9IEZBTFNFOworCXVwZGF0ZV9zY3JlZW4oQ0xFQVIpOworCXNldGN1cnNvcigpOworCW91dF9mbHVzaCgpOworICAgIH0KKworICAgIC8qIHJldHVybiByZW1haW5pbmcgY2hhcmFjdGVyIGZyb20gbGFzdCBjYWxsICovCisgICAgaWYgKG5leHRjaGFyKQorICAgIHsKKwkqYnVmID0gbmV4dGNoYXI7CisJbmV4dGNoYXIgPSAwOworCXJldHVybiAxOworICAgIH0KKworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBpZiAodGltZSAhPSAwKQorCXNob3dfbW91c2UoVFJVRSk7CisjZW5kaWYKKyNpZmRlZiBESkdQUAorICAgIHNldF9zeXNfY3Vyc29yKCk7CisjZW5kaWYKKyAgICBpZiAodGltZSA+PSAwKQorICAgIHsKKwlpZiAoV2FpdEZvckNoYXIodGltZSkgPT0gMCkJLyogbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSAqLworCXsKKyNpZmRlZiBGRUFUX01PVVNFCisJICAgIHNob3dfbW91c2UoRkFMU0UpOworI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIG9uY2VfYWxyZWFkeSA9IDA7CisjZW5kaWYKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICBlbHNlICAgIC8qIHRpbWUgPT0gLTEgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJaWYgKG9uY2VfYWxyZWFkeSA9PSAyKQorCSAgICB1cGRhdGVzY3JpcHQoMCk7CisJZWxzZSBpZiAob25jZV9hbHJlYWR5ID09IDEpCisJeworCSAgICBzZXRjdXJzb3IoKTsKKwkgICAgb25jZV9hbHJlYWR5ID0gMjsKKwkgICAgcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZgorCS8qCisJICogSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSB3aXRoaW4gMiBzZWNvbmRzIChkZWZhdWx0KQorCSAqIHdyaXRlIHRoZSBhdXRvc2NyaXB0IGZpbGUgdG8gZGlzaworCSAqLworCSAgICBpZiAoV2FpdEZvckNoYXIocF91dCkgPT0gMCkKKwl7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJICAgIGlmIChoYXNfY3Vyc29yaG9sZCgpICYmIGdldF9yZWFsX3N0YXRlKCkgPT0gTk9STUFMX0JVU1kpCisJICAgIHsKKwkJYXBwbHlfYXV0b2NtZHMoRVZFTlRfQ1VSU09SSE9MRCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisJCXVwZGF0ZV9zY3JlZW4oVkFMSUQpOworCQlvbmNlX2FscmVhZHkgPSAxOworCQlyZXR1cm4gMDsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJdXBkYXRlc2NyaXB0KDApOworCX0KKyAgICB9CisgICAgV2FpdEZvckNoYXIoRk9SRVZFUik7CS8qIHdhaXQgZm9yIGtleSBvciBtb3VzZSBjbGljayAqLworCisvKgorICogVHJ5IHRvIHJlYWQgYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHRoZXJlIGFyZSwgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxsLgorICovCisgICAgLyoKKyAgICAgKiB3ZSB3aWxsIGdldCBhdCBsZWFzdCBvbmUga2V5LiBHZXQgbW9yZSBpZiB0aGV5IGFyZSBhdmFpbGFibGUKKyAgICAgKiBBZnRlciBhIGN0cmwtYnJlYWsgd2UgaGF2ZSB0byByZWFkIGEgMCAoISkgZnJvbSB0aGUgYnVmZmVyLgorICAgICAqIGJpb3NrZXkoMSkgd2lsbCByZXR1cm4gMCBpZiBubyBrZXkgaXMgYXZhaWxhYmxlIGFuZCB3aGVuIGEKKyAgICAgKiBjdHJsLWJyZWFrIHdhcyB0eXBlZC4gV2hlbiBjdHJsLWJyZWFrIGlzIGhpdCwgdGhpcyBkb2VzIG5vdCBhbHdheXMKKyAgICAgKiBpbXBsaWVzIGEga2V5IGhpdC4KKyAgICAgKi8KKyAgICBjYnJrX3ByZXNzZWQgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgaWYgKG1vdXNlX2NsaWNrID49IDAgJiYgbWF4bGVuID49IDUpCisgICAgeworCWxlbiA9IDU7CisJKmJ1ZisrID0gRVNDICsgMTI4OworCSpidWYrKyA9ICdNJzsKKwkqYnVmKysgPSBtb3VzZV9jbGljazsKKwkqYnVmKysgPSBtb3VzZV94ICsgJyEnOworCSpidWYrKyA9IG1vdXNlX3kgKyAnISc7CisJbW91c2VfY2xpY2sgPSAtMTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworI2lmZGVmIEZFQVRfTU9VU0UKKwltb3VzZV9oaWRkZW4gPSBUUlVFOworI2VuZGlmCisJaWYgKHBfYmlvc2sgJiYgIXBfY29uc2spCisJeworCSAgICB3aGlsZSAoKGxlbiA9PSAwIHx8IGJpb3NrZXkoYmlvc2tleV9yZWFkeSkpICYmIGxlbiA8IG1heGxlbikKKwkgICAgeworCQljID0gdHJhbnNsYXRlX2FsdGtleXMoYmlvc2tleShiaW9za2V5X3JlYWQpKTsgLyogZ2V0IHRoZSBrZXkgKi8KKwkJLyoKKwkJICogdHJhbnNsYXRlIGEgZmV3IHRoaW5ncyBmb3IgaW5jaGFyKCk6CisJCSAqIDB4MDAwMCA9PSBDVFJMLWJyZWFrCQktPiAzCShDVFJMLUMpCisJCSAqIDB4MDMwMCA9PSBDVFJMLUAJCS0+IE5VTAorCQkgKiAweG5uMDAgPT0gZXh0ZW5kZWQga2V5IGNvZGUJLT4gS19OVUwsIG5uCisJCSAqIDB4bm5lMCA9PSBlbmhhbmNlZCBrZXlib2FyZAktPiBLX05VTCwgbm4KKwkJICogS19OVUwJCQktPiBLX05VTCwgMworCQkgKi8KKwkJaWYgKGMgPT0gMCkKKwkJICAgIGMgPSAzOworCQllbHNlIGlmIChjID09IDB4MDMwMCkKKwkJICAgIGMgPSBOVUw7CisJCWVsc2UgaWYgKChjICYgMHhmZikgPT0gMAorCQkJfHwgYyA9PSBLX05VTAorCQkJfHwgYyA9PSAweDRlMmIKKwkJCXx8IGMgPT0gMHg0YTJkCisJCQl8fCBjID09IDB4MzcyYQorCQkJfHwgKChjICYgMHhmZikgPT0gMHhlMCAmJiBjICE9IDB4ZTApKQorCQl7CisJCSAgICBpZiAoYyA9PSBLX05VTCkKKwkJCWMgPSAzOworCQkgICAgZWxzZQorCQkJYyA+Pj0gODsKKwkJICAgICpidWYrKyA9IEtfTlVMOworCQkgICAgKytsZW47CisJCX0KKworCQlpZiAobGVuIDwgbWF4bGVuKQorCQl7CisJCSAgICAqYnVmKysgPSBjOworCQkgICAgbGVuKys7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgLyogQ29udmVydCBmcm9tICd0ZXJtZW5jb2RpbmcnIHRvICdlbmNvZGluZycuIE9ubHkKKwkJICAgICAqIHRyYW5zbGF0ZSBub3JtYWwgY2hhcmFjdGVycywgbm90IGtleSBjb2Rlcy4gKi8KKwkJICAgIGlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FCisJCQkJCSAgICAmJiAobGVuID09IDEgfHwgYnVmWy0yXSAhPSBLX05VTCkpCisJCQlsZW4gKz0gY29udmVydF9pbnB1dChidWYgLSAxLCAxLCBtYXhsZW4gLSBsZW4gKyAxKSAtIDE7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCSAgICBuZXh0Y2hhciA9IGM7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgd2hpbGUgKChsZW4gPT0gMCB8fCAocF9jb25zayA/IGNvbnNfa2JoaXQoKSA6IGtiaGl0KCkpKQorCQkgICAgJiYgbGVuIDwgbWF4bGVuKQorCSAgICB7CisJCXN3aXRjaCAoYyA9IChwX2NvbnNrID8gY29uc19nZXRjaCgpIDogZ2V0Y2goKSkpCisJCXsKKwkJICAgIGNhc2UgMDoKKwkJCS8qIE5VTCBtZWFucyB0aGF0IHRoZXJlIGlzIGFub3RoZXIgY2hhcmFjdGVyLgorCQkJICogR2V0IGl0IGltbWVkaWF0ZWx5LCBiZWNhdXNlIGtiaGl0KCkgZG9lc24ndCBhbHdheXMKKwkJCSAqIHJldHVybiBUUlVFIGZvciB0aGUgc2Vjb25kIGNoYXJhY3Rlci4KKwkJCSAqLworCQkJaWYgKHBfY29uc2spCisJCQkgICAgYyA9IGNvbnNfZ2V0Y2goKTsKKwkJCWVsc2UKKwkJCSAgICBjID0gZ2V0Y2goKTsKKwkJCXRtcF9jID0gdHJhbnNsYXRlX2FsdGtleXMoYyA8PCA4KTsKKwkJCWlmICh0bXBfYyA9PSAoYyA8PCA4KSkKKwkJCXsKKwkJCSAgICAqYnVmKysgPSBLX05VTDsKKwkJCSAgICArK2xlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCSAgICBjID0gdG1wX2M7CisJCQlicmVhazsKKwkJICAgIGNhc2UgS19OVUw6CisJCQkqYnVmKysgPSBLX05VTDsKKwkJCSsrbGVuOworCQkJYyA9IDM7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMzoKKwkJCWNicmtfcHJlc3NlZCA9IFRSVUU7CisJCQkvKkZBTExUSFJPVUdIKi8KKwkJICAgIGRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAobGVuIDwgbWF4bGVuKQorCQl7CisJCSAgICAqYnVmKysgPSBjOworCQkgICAgKytsZW47CisJCX0KKwkJZWxzZQorCQkgICAgbmV4dGNoYXIgPSBjOworCSAgICB9CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX01PVVNFCisgICAgc2hvd19tb3VzZShGQUxTRSk7CisjZW5kaWYKKworICAgIGJlZXBfY291bnQgPSAwOwkgICAgLyogbWF5IGJlZXAgYWdhaW4gbm93IHRoYXQgd2UgZ290IHNvbWUgY2hhcnMgKi8KKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIHJldHVybiBub24temVybyBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKKyAqLworICAgIGludAorbWNoX2NoYXJfYXZhaWwodm9pZCkKK3sKKyAgICByZXR1cm4gV2FpdEZvckNoYXIoMEwpOworfQorCisjaWZkZWYgREpHUFAKKyMgZGVmaW5lIElOVF9BUkcgICAgaW50CisjZWxzZQorIyBkZWZpbmUgSU5UX0FSRworI2VuZGlmCisKKy8qCisgKiBmdW5jdGlvbiBmb3IgY3RybC1icmVhayBpbnRlcnJ1cHQKKyAqLworICAgIHN0YXRpYyB2b2lkIGludGVycnVwdAorI2lmZGVmIERKR1BQCitjYXRjaF9jYnJrKGludCBhKQorI2Vsc2UKK2NhdGNoX2Nicmsodm9pZCkKKyNlbmRpZgoreworICAgIGNicmtfcHJlc3NlZCA9IFRSVUU7CisgICAgY3RybGNfcHJlc3NlZCA9IFRSVUU7Cit9CisKKyNpZm5kZWYgREpHUFAKKy8qCisgKiBjdHJsLWJyZWFrIGhhbmRsZXIgZm9yIERPUy4gTmV2ZXIgY2FsbGVkIHdoZW4gYSBjdHJsLWJyZWFrIGlzIHR5cGVkLCBiZWNhdXNlCisgKiB3ZSBjYXRjaCBpbnRlcnJ1cHQgMWIuIElmIHlvdSB0eXBlIGN0cmwtQyB3aGlsZSBWaW0gaXMgd2FpdGluZyBmb3IgYQorICogY2hhcmFjdGVyIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4gV2hlbiBhIGN0cmwtQyBpcyB0eXBlZCB3aGlsZSBWaW0gaXMKKyAqIGJ1c3kgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkLiBCeSB0aGF0IHRpbWUgYSBeQyBoYXMgYmVlbiBkaXNwbGF5ZWQgb24KKyAqIHRoZSBzY3JlZW4sIHNvIHdlIGhhdmUgdG8gcmVkaXNwbGF5IHRoZSBzY3JlZW4uIFdlIGNhbid0IGRvIHRoYXQgaGVyZSwKKyAqIGJlY2F1c2Ugd2UgbWF5IGJlIGNhbGxlZCBieSBET1MuIFRoZSByZWRyYXcgaXMgaW4gbWNoX2luY2hhcigpLgorICovCisgICAgc3RhdGljIGludCBfY2RlY2wKK2NicmtfaGFuZGxlcih2b2lkKQoreworICAgIGRlbGF5ZWRfcmVkcmF3ID0gVFJVRTsKKyAgICByZXR1cm4gMTsJCSAgICAvKiByZXN1bWUgb3BlcmF0aW9uIGFmdGVyIGN0cmwtYnJlYWsgKi8KK30KKworLyoKKyAqIGZ1bmN0aW9uIGZvciBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQKKyAqIEZvciBET1MgMSBhbmQgMiByZXR1cm4gMCAoSWdub3JlKS4KKyAqIEZvciBET1MgMyBhbmQgbGF0ZXIgcmV0dXJuIDMgKEZhaWwpCisgKi8KKyAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQKK2NhdGNoX2NpbnQoYnAsIGRpLCBzaSwgZHMsIGVzLCBkeCwgY3gsIGJ4LCBheCkKKyAgICB1bnNpZ25lZCBicCwgZGksIHNpLCBkcywgZXMsIGR4LCBjeCwgYngsIGF4OworeworICAgIGF4ID0gKGF4ICYgMHhmZjAwKTsJICAgIC8qIHNldCBBTCB0byAwICovCisgICAgaWYgKF9vc21ham9yID49IDMpCisJYXggfD0gMzsJICAgIC8qIHNldCBBTCB0byAzICovCit9CisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgaW50ZXJydXB0IHZlY3RvcnMgZm9yIHVzZSB3aXRoIFZpbSBvbiBvciBvZmYuCisgKiBvbiA9PSBUUlVFIG1lYW5zIGFzIHVzZWQgd2l0aGluIFZpbQorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9pbnRlcnJ1cHRzKGludCBvbikKK3sKKyAgICBzdGF0aWMgaW50IHNhdmVkX2Nicms7CisjaWZuZGVmIERKR1BQCisgICAgc3RhdGljIHZvaWQgaW50ZXJydXB0ICgqb2xkX2NpbnQpKCk7CisjZW5kaWYKKyAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQgKCpvbGRfY2JyaykoSU5UX0FSRyk7CisKKyAgICBpZiAob24pCisgICAgeworCXNhdmVkX2NicmsgPSBnZXRjYnJrKCk7CQkvKiBzYXZlIG9sZCBjdHJsLWJyZWFrIHNldHRpbmcgKi8KKwlzZXRjYnJrKDApOwkJCS8qIGRvIG5vdCBjaGVjayBmb3IgY3RybC1icmVhayAqLworI2lmZGVmIERKR1BQCisJb2xkX2NicmsgPSBzaWduYWwoU0lHSU5ULCBjYXRjaF9jYnJrKTsJLyogY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCisjZWxzZQorCW9sZF9jaW50ID0gZ2V0dmVjdCgweDI0KTsJLyogc2F2ZSBvbGQgY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCisJc2V0dmVjdCgweDI0LCBjYXRjaF9jaW50KTsJLyogaW5zdGFsbCBvdXIgY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCisJb2xkX2NicmsgPSBnZXR2ZWN0KDB4MUIpOwkvKiBzYXZlIG9sZCBjdHJsLWJyZWFrIGludGVycnVwdCAqLworCXNldHZlY3QoMHgxQiwgY2F0Y2hfY2Jyayk7CS8qIGluc3RhbGwgb3VyIGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCisJY3RybGJyayhjYnJrX2hhbmRsZXIpOwkJLyogdmltJ3MgY3RybC1icmVhayBoYW5kbGVyICovCisjZW5kaWYKKwlpZiAodGVybV9jb25zb2xlKQorCSAgICBvdXRfc3RyKFRfTUUpOwkJLyogc2V0IGNvbG9ycyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworCXNldGNicmsoc2F2ZWRfY2Jyayk7CQkvKiByZXN0b3JlIGN0cmwtYnJlYWsgc2V0dGluZyAqLworI2lmZGVmIERKR1BQCisJc2lnbmFsKFNJR0lOVCxvbGRfY2Jyayk7CS8qIGNyaXRpY2FsIGVycm9yIGludGVycnVwdCAqLworI2Vsc2UKKwlzZXR2ZWN0KDB4MjQsIG9sZF9jaW50KTsJLyogcmVzdG9yZSBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQgKi8KKwlzZXR2ZWN0KDB4MUIsIG9sZF9jYnJrKTsJLyogcmVzdG9yZSBjdHJsLWJyZWFrIGludGVycnVwdCAqLworI2VuZGlmCisJLyogcmVzdG9yZSBjdHJsLWJyZWFrIGhhbmRsZXIsIGhvdyA/Pz8gKi8KKwlpZiAodGVybV9jb25zb2xlKQorCSAgICBteW5vcm12aWRlbygpOwkJLyogcmVzdG9yZSBzY3JlZW4gY29sb3JzICovCisgICAgfQorfQorCisvKgorICogV2UgaGF2ZSBubyBqb2IgY29udHJvbCwgZmFrZSBpdCBieSBzdGFydGluZyBhIG5ldyBzaGVsbC4KKyAqLworICAgIHZvaWQKK21jaF9zdXNwZW5kKHZvaWQpCit7CisgICAgc3VzcGVuZF9zaGVsbCgpOworfQorCitleHRlcm4gaW50IF9mbW9kZTsKKworLyoKKyAqIFByZXBhcmUgd2luZG93IGZvciB1c2UgYnkgVmltLgorICovCisgICAgdm9pZAorbWNoX2luaXQodm9pZCkKK3sKKyAgICB1bmlvbiBSRUdTIHJlZ3M7CisKKyNpZiBkZWZpbmVkKERKR1BQKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQorICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7CisjZW5kaWYKKworICAgIC8qCisgICAgICogR2V0IHRoZSB2aWRlbyBhdHRyaWJ1dGVzIGF0IHRoZSBjdXJzb3IuICBUaGVzZSB3aWxsIGJlIHVzZWQgYXMgdGhlCisgICAgICogZGVmYXVsdCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHJlZ3MuaC5haCA9IDB4MDg7CisgICAgcmVncy5oLmJoID0gMHgwMDsJCS8qIHZpZGVvIHBhZ2UgMCAqLworICAgIGludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7CisgICAgb3JpZ19hdHRyID0gcmVncy5oLmFoOworICAgIG15bm9ybXZpZGVvKCk7CisgICAgaWYgKGN0ZXJtX25vcm1hbF9mZ19jb2xvciA9PSAwKQorCWN0ZXJtX25vcm1hbF9mZ19jb2xvciA9IChvcmlnX2F0dHIgJiAweGYpICsgMTsKKyAgICBpZiAoY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID09IDApCisJY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChvcmlnX2F0dHIgPj4gNCkgJiAweGYpICsgMTsKKworICAgIHRlcm1fY29uc29sZSA9IFRSVUU7ICAgIC8qIGFzc3VtZSB1c2luZyB0aGUgY29uc29sZSBmb3IgdGhlIHRoaW5ncyBoZXJlICovCisgICAgX2Ztb2RlID0gT19CSU5BUlk7CSAgICAvKiB3ZSBkbyBvdXIgb3duIENSLUxGIHRyYW5zbGF0aW9uICovCisgICAgb3V0X2ZsdXNoKCk7CisgICAgc2V0X2ludGVycnVwdHMoVFJVRSk7ICAgLyogY2F0Y2ggaW50ZXJydXB0cyAqLworCisjaWZkZWYgREpHUFAKKyAgICAvKgorICAgICAqIFVzZSBMb25nIEZpbGUgTmFtZXMgYnkgZGVmYXVsdCwgaWYgJExGTiBub3Qgc2V0LgorICAgICAqLworICAgIGlmIChnZXRlbnYoIkxGTiIpID09IE5VTEwpCisJcHV0ZW52KCJMRk49eSIpOworCisgICAgZ2V0X3NjcmVlbmJhc2UoKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NT1VTRQorLyogZmluZCBvdXQgaWYgYSBNUyBjb21wYXRpYmxlIG1vdXNlIGlzIGF2YWlsYWJsZSAqLworICAgIHJlZ3MueC5heCA9IDA7CisgICAgKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKKyAgICBtb3VzZV9hdmFpbCA9IHJlZ3MueC5heDsKKyAgICAvKiBiZXN0IGd1ZXNzIGZvciBtb3VzZSBjb29yZGluYXRlIGNvbXB1dGF0aW9ucyAqLworICAgIG1jaF9nZXRfc2hlbGxzaXplKCk7CisgICAgaWYgKENvbHVtbnMgPD0gNDApCisJbW91c2VfeF9kaXYgPSAxNjsKKyAgICBpZiAoUm93cyA9PSAzMCkKKwltb3VzZV95X2RpdiA9IDE2OworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFRyeSBzd2l0Y2hpbmcgdG8gMTYgY29sb3JzIGZvciBiYWNrZ3JvdW5kLCBpbnN0ZWFkIG9mIDggY29sb3JzIGFuZAorICAgICAqIGJsaW5raW5nLiAgRG9lcyB0aGlzIGFsd2F5cyB3b3JrPyAgQ2FuIHRoZSBvbGQgdmFsdWUgYmUgcmVzdG9yZWQ/CisgICAgICovCisgICAgcmVncy54LmF4ID0gMHgxMDAzOworICAgIHJlZ3MuaC5ibCA9IDB4MDA7CisgICAgcmVncy5oLmJoID0gMHgwMDsKKyAgICBpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOworCisgICAgLyoKKyAgICAgKiBUZXN0IGlmIHdlIGhhdmUgYW4gZW5oYW5jZWQgQVQga2V5Ym9hcmQuICBXcml0ZSAweEZGRkYgdG8gdGhlIGtleWJvYXJkCisgICAgICogYnVmZmVyIGFuZCB0cnkgdG8gcmVhZCBpdCBiYWNrLiAgSWYgd2UgY2FuJ3QgaW4gMTYgdHJpZXMsIGl0J3MgYW4gb2xkCisgICAgICogdHlwZSBYVCBrZXlib2FyZC4KKyAgICAgKi8KKyAgICByZWdzLmguYWggPSAweDA1OworICAgIHJlZ3MueC5jeCA9IDB4ZmZmZjsKKyAgICBpbnQ4NigweDE2LCAmcmVncywgJnJlZ3MpOworICAgIGlmIChyZWdzLmguYWwgIT0gMSkJLyogc2tpcCB0aGlzIHdoZW4ga2V5Ym9hcmQgYnVmZmVyIGlzIGZ1bGwgKi8KKyAgICB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKKwl7CisJICAgIHJlZ3MuaC5haCA9IDB4MTA7CisJICAgIGludDg2KDB4MTYsICZyZWdzLCAmcmVncyk7CisJICAgIGlmIChyZWdzLnguYXggPT0gMHhmZmZmKQorCQlicmVhazsKKwl9CisJaWYgKGkgPT0gMTYpCS8qIDB4ZmZmZiBub3QgcmVhZCwgbXVzdCBiZSBvbGQga2V5Ym9hcmQgKi8KKwl7CisJICAgIGJpb3NrZXlfcmVhZCA9IDA7CisJICAgIGJpb3NrZXlfcmVhZHkgPSAxOworCX0KKyAgICB9CisKKyNpZmRlZiBNQ0hfQ1VSU09SX1NIQVBFCisgICAgLyogU2F2ZSB0aGUgb2xkIGN1cnNvciBzaGFwZSAqLworICAgIG1jaF9yZXN0b3JlX2N1cnNvcl9zaGFwZShGQUxTRSk7CisgICAgLyogSW5pdGlhbGlzZSB0aGUgY3Vyc29yIHNoYXBlICovCisgICAgbWNoX3VwZGF0ZV9jdXJzb3IoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChESkdQUCkgJiYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaXMgYXZhaWxhYmxlLCBpZS4gYXJlIHdlCisgICAgICogcnVubmluZyBmcm9tIGEgRE9TIHNlc3Npb24gd2l0aGluIFdpbmRvd3MuICBPYnZpb3VzbHksIHRoZSBXaW5kb3dzCisgICAgICogY2xpcGJvYXJkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHB1cmUgRE9TLgorICAgICAqCisgICAgICogaW50IDB4MmYsIEFYID0gMHgxNzAwIGlkZW50aWZpZXMgdGhlIFdpbmRvd3MgdmVyc2lvbiB3ZSdyZSBydW5uaW5nCisgICAgICogdW5kZXIuICBVcG9uIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQsIGlmIEFYIGlzIHVuY2hhbmdlZCwgd2UncmUKKyAgICAgKiBydW5uaW5nIHVuZGVyIHB1cmUgRE9TIGFuZCBubyBXaW5kb3dzIGNsaXBib2FyZCBpcyBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBSZW1hcms6IGNvdWxkIHVzZSBpbnQ4NigpIGhlcmUgYnV0IF9fZHBtaV9pbnQoKSBpcyByZWNvbW1lbmRlZCBpbgorICAgICAqIHRoZSBESkdQUCBkb2NzLCBzaW5jZSBpbnQ4NigpIGRvZXNuJ3QgY292ZXIgYWxsIGF2YWlsYWJsZSBpbnRlcnJ1cHRzLgorICAgICAqLworICAgIGRwbWlfcmVncy54LmF4ID0gMHgxNzAwOworICAgIGlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQorCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLworCWRwbWlfcmVncy54LmF4ID0gMHgxNzAwOwkvKiBmb3JjZSBmYWlsdXJlICovCisKKyAgICBpZiAoZHBtaV9yZWdzLnguYXggPT0gMHgxNzAwKQkvKiBubyBjaGFuZ2UgaW4gQVg/ICovCisJY2xpcF9pbml0KEZBTFNFKTsJCS8qIG5vIGNsaXBib2FyZCBhdmFpbGFibGUsIHRvbyBiYWQgKi8KKyAgICBlbHNlCQkJCS8qIGVsc2UsIHJ1bm5pbmcgdW5kZXIgV2luZG93cywgT0sgKi8KKwljbGlwX2luaXQoVFJVRSk7CQkvKiBjbGlwYm9hcmQgaXMgYXZhaWxhYmxlICovCisjZW5kaWYKK30KKworICAgIGludAorbWNoX2NoZWNrX3dpbigKKyAgICBpbnQJCWFyZ2MsCisgICAgY2hhcgkqKmFyZ3YpCit7CisgICAgLyogc3RvcmUgYXJndlswXSwgbWF5IGJlIHVzZWQgZm9yICRWSU0gKi8KKyAgICBpZiAoKmFyZ3ZbMF0gIT0gTlVMKQorCWV4ZV9uYW1lID0gRnVsbE5hbWVfc2F2ZSgoY2hhcl91ICopYXJndlswXSwgRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBUcnkgdGhlIERPUyBzZWFyY2ggcGF0aC4gIFRoZSBleGVjdXRhYmxlIG1heSBpbgorICAgICAqIGZhY3QgYmUgY2FsbGVkIGRpZmZlcmVudGx5LCBzbyB0cnkgdGhpcyBsYXN0LgorICAgICAqLworICAgIGlmIChleGVfbmFtZSA9PSBOVUxMIHx8ICpleGVfbmFtZSA9PSBOVUwpCisJZXhlX25hbWUgPSBzZWFyY2hwYXRoKCJ2aW0uZXhlIik7CisKKyAgICBpZiAoaXNhdHR5KDEpKQorCXJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBpbnB1dCBjb21lcyBmcm9tIGEgdGVybWluYWwsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIGludAorbWNoX2lucHV0X2lzYXR0eSh2b2lkKQoreworICAgIGlmIChpc2F0dHkocmVhZF9jbWRfZmQpKQorCXJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmIGRlZmluZWQoVVNFX0ZOQU1FX0NBU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogZm5hbWVfY2FzZSgpOiBTZXQgdGhlIGNhc2Ugb2YgdGhlIGZpbGUgbmFtZSwgaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgKiBUT0RPOiBzaG91bGQgZXhwYW5kIHNob3J0IHRvIGxvbmcgZmlsZSBuYW1lcy4gIE5lZWQgdG8gdXNlIERPUyBpbnRlcnJ1cHRzLAorICogc2VlIERKR1BQIHNvdXJjZXMgbGliYy9kb3MvZGlyL2ZpbmRmaXJzLmMuCisgKi8KKyAgICB2b2lkCitmbmFtZV9jYXNlKGNoYXJfdSAqbmFtZSwgaW50IGxlbikKK3sKKyAgICBjaGFyX3UJICAgICp0YWlsOworICAgIHN0cnVjdCBmZmJsayAgICBmYjsKKworICAgIHNsYXNoX2FkanVzdChuYW1lKTsKKyAgICBpZiAoZmluZGZpcnN0KG5hbWUsICZmYiwgMCkgPT0gMCkKKyAgICB7CisJdGFpbCA9IGdldHRhaWwobmFtZSk7CisJaWYgKGxlbiA9PSAwID8gU1RSTEVOKHRhaWwpID09IFNUUkxFTihmYi5mZl9uYW1lKQorCQk6ICh0YWlsIC0gbmFtZSkgKyBTVFJMRU4oZmIuZmZfbmFtZSkgPCBsZW4pCisJICAgIFNUUkNQWSh0YWlsLCBmYi5mZl9uYW1lKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIHJldHVybiBwcm9jZXNzIElECisgKi8KKyAgICBsb25nCittY2hfZ2V0X3BpZCh2b2lkKQoreworICAgIHJldHVybiAobG9uZykwOworfQorCisvKgorICogQ2hhbmdlIGRlZmF1bHQgZHJpdmUgKGp1c3QgbGlrZSBfY2hkcml2ZSBvZiBCb3JsYW5kIEMgMy4xKQorICovCisgICAgc3RhdGljIGludAorY2hhbmdlX2RyaXZlKGludCBkcml2ZSkKK3sKKyAgICB1bmlvbiBSRUdTIHJlZ3M7CisKKyAgICByZWdzLmguYWggPSAweDBlOworICAgIHJlZ3MuaC5kbCA9IGRyaXZlIC0gMTsKKyAgICBpbnRkb3MoJnJlZ3MsICZyZWdzKTsgICAvKiBzZXQgZGVmYXVsdCBkcml2ZSAqLworICAgIHJlZ3MuaC5haCA9IDB4MTk7CisgICAgaW50ZG9zKCZyZWdzLCAmcmVncyk7ICAgLyogZ2V0IGRlZmF1bHQgZHJpdmUgKi8KKyAgICBpZiAocmVncy5oLmFsID09IGRyaXZlIC0gMSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBHZXQgYWJzb2x1dGUgZmlsZSBuYW1lIGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KKyAqIEFsbCBzbGFzaGVzIGFyZSByZXBsYWNlZCB3aXRoIGJhY2tzbGFzaGVzLCB0byBhdm9pZCB0cm91YmxlIHdoZW4gY29tcGFyaW5nCisgKiBmaWxlIG5hbWVzLiAgV2hlbiAnc2hlbGxzbGFzaCcgc2V0IGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIGludAorbWNoX0Z1bGxOYW1lKAorICAgIGNoYXJfdQkqZm5hbWUsCisgICAgY2hhcl91CSpidWYsCisgICAgaW50CQlsZW4sCisgICAgaW50CQlmb3JjZSkKK3sKKyAgICBpZiAoIWZvcmNlICYmIG1jaF9pc0Z1bGxOYW1lKGZuYW1lKSkJLyogYWxyZWFkeSBleHBhbmRlZCAqLworICAgIHsKKwlTVFJOQ1BZKGJ1ZiwgZm5hbWUsIGxlbik7CisJYnVmW2xlbiAtIDFdID0gTlVMOworCXNsYXNoX2FkanVzdChidWYpOworCXJldHVybiBPSzsKKyAgICB9CisKKyNpZmRlZiBfX0JPUkxBTkRDX18JCS8qIE9ubHkgQm9ybGFuZCBDKysgaGFzIHRoaXMgKi8KKyAgICBpZiAoX2Z1bGxwYXRoKChjaGFyICopYnVmLCAoY2hhciAqKWZuYW1lLCBsZW4gLSAxKSA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKKyNlbHNlCQkJLyogYWxtb3N0IHRoZSBzYW1lIGFzIG1jaF9GdWxsTmFtZSgpIGluIG9zX3VuaXguYyAqLworICAgIHsKKyMgaWYgMQorCWNoYXJfdQlmdWxscGF0aFtNQVhQQVRITF07CisKKwlpZiAoIV90cnVlbmFtZShmbmFtZSwgZnVsbHBhdGgpKQorCSAgICByZXR1cm4gRkFJTDsKKwlzbGFzaF9hZGp1c3QoZnVsbHBhdGgpOwkgICAgLyogT25seSBuZWVkZWQgd2hlbiAnc2hlbGxzbGFzaCcgc2V0ICovCisJU1RSTkNQWShidWYsIGZ1bGxwYXRoLCBsZW4pOworCWJ1ZltsZW4gLSAxXSA9IE5VTDsKKwlyZXR1cm4gT0s7CisKKyMgZWxzZSAgLyogT2xkIGNvZGUsIHRvIGJlIGRlbGV0ZWQuLi4gKi8KKwlpbnQJbDsKKwljaGFyX3UJb2xkZGlyW01BWFBBVEhMXTsKKwljaGFyX3UJKnAsICpxOworCWludAljOworCWludAlyZXR2YWwgPSBPSzsKKworCSpidWYgPSAwOworCS8qCisJICogY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgZm9yIGEgbW9tZW50LAorCSAqIGFuZCB0aGVuIGRvIHRoZSBnZXR3ZCgpIChhbmQgZ2V0IGJhY2sgdG8gd2hlcmUgd2Ugd2VyZSkuCisJICogVGhpcyB3aWxsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUgd2l0aCAiLi4vIiB0aGluZ3MuCisJICovCisJcCA9IHZpbV9zdHJyY2hyKGZuYW1lLCAnLycpOworCXEgPSB2aW1fc3RycmNocihmbmFtZSwgJ1xcJyk7CisJaWYgKHEgIT0gTlVMTCAmJiAocCA9PSBOVUxMIHx8IHEgPiBwKSkKKwkgICAgcCA9IHE7CisJcSA9IHZpbV9zdHJyY2hyKGZuYW1lLCAnOicpOworCWlmIChxICE9IE5VTEwgJiYgKHAgPT0gTlVMTCB8fCBxID4gcCkpCisJICAgIHAgPSBxOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBpZiAoZ2V0Y3dkKG9sZGRpciwgTUFYUEFUSEwpID09IE5VTEwpCisJICAgIHsKKwkJcCA9IE5VTEw7CS8qIGNhbid0IGdldCBjdXJyZW50IGRpcjogZG9uJ3QgY2hkaXIgKi8KKwkJcmV0dmFsID0gRkFJTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKHAgPT0gZm5hbWUpCQkJLyogL2ZuYW1lCSAgICAqLworCQkgICAgcSA9IHAgKyAxOwkJCS8qIC0+IC8JCSAgICAqLworCQllbHNlIGlmIChxICsgMSA9PSBwKQkJLyogLi4uIGM6XGZvbwkgICAgKi8KKwkJICAgIHEgPSBwICsgMTsJCQkvKiAtPiBjOlwJICAgICovCisJCWVsc2UJCQkJLyogYnV0IGM6XGZvb1xiYXIgICAqLworCQkgICAgcSA9IHA7CQkJLyogLT4gYzpcZm9vCSAgICAqLworCisJCWMgPSAqcTsJCQkvKiB0cnVuY2F0ZSBhdCBzdGFydCBvZiBmbmFtZSAqLworCQkqcSA9IE5VTDsKKyMgaWZkZWYgREpHUFAKKwkJU1RSQ1BZKGJ1ZiwgZm5hbWUpOworCQlzbGFzaF9hZGp1c3QoYnVmKTsJLyogbmVlZGVkIHdoZW4gZm5hbWUgc3RhcnRzIHdpdGggXCAqLworCQlpZiAobWNoX2NoZGlyKGJ1ZikpCS8qIGNoYW5nZSB0byB0aGUgZGlyZWN0b3J5ICovCisjIGVsc2UKKwkJaWYgKG1jaF9jaGRpcihmbmFtZSkpCS8qIGNoYW5nZSB0byB0aGUgZGlyZWN0b3J5ICovCisjIGVuZGlmCisJCSAgICByZXR2YWwgPSBGQUlMOworCQllbHNlCisJCXsKKwkJICAgIGZuYW1lID0gcTsKKwkJICAgIGlmIChjID09IHBzZXBjKQkgICAgLyogaWYgd2UgY3V0IHRoZSBuYW1lIGF0IGEgKi8KKwkJCWZuYW1lKys7CSAgICAvKiAnXCcsIGRvbid0IGFkZCBpdCBhZ2FpbiAqLworCQl9CisJCSpxID0gYzsKKwkgICAgfQorCX0KKwlpZiAoZ2V0Y3dkKGJ1ZiwgbGVuKSA9PSBOVUxMKQorCXsKKwkgICAgcmV0dmFsID0gRkFJTDsKKwkgICAgKmJ1ZiA9IE5VTDsKKwl9CisjICBpZmRlZiBVU0VfRk5BTUVfQ0FTRQorCWVsc2UKKwl7CisJICAgIGNoYXJfdQkqaGVhZDsKKwkgICAgY2hhcl91CSp0YWlsOworCSAgICBzdHJ1Y3QgZmZibGsgZmI7CisJICAgIGludAkJYzsKKwkgICAgaW50CQlhZGRlZDsKKworCSAgICAvKiBBcHBhcmVudGx5ICJsb25nbmF+MSIgaXNuJ3QgZXhwYW5kZWQgYnkgZ2V0Y3dkKCksIGF0IGxlYXN0IG5vdAorCSAgICAgKiBmb3IgREpHUFAuICBFeHBhbmQgaXQgaGVyZS4gIEhhdmUgdG8gZG8gZWFjaCBkaXJuYW1lCisJICAgICAqIHNlcGFyYXRlbHkuICovCisJICAgIHNsYXNoX2FkanVzdChidWYpOworCSAgICBoZWFkID0gYnVmOworCSAgICBpZiAoaXNhbHBoYSgqaGVhZCkgJiYgaGVhZFsxXSA9PSAnOicpCisJCWhlYWQgKz0gMjsJLyogc2tpcCAiYzoiICovCisJICAgIHdoaWxlICgqaGVhZCAhPSBOVUwpCisJICAgIHsKKwkJLyogQWR2YW5jZSAiaGVhZCIgdG8gdGhlIHN0YXJ0IG9mIGEgZGlybmFtZSBhbmQgInRhaWwiIHRvIGp1c3QKKwkJICogYWZ0ZXIgaXQuICovCisJCXdoaWxlICgqaGVhZCA9PSAnLycgfHwgKmhlYWQgPT0gJ1xcJykKKwkJICAgICsraGVhZDsKKwkJZm9yICh0YWlsID0gaGVhZDsgKnRhaWwgIT0gTlVMOyArK3RhaWwpCisJCSAgICBpZiAoKnRhaWwgPT0gJy8nIHx8ICp0YWlsID09ICdcXCcpCisJCQlicmVhazsKKwkJYyA9ICp0YWlsOworCQkqdGFpbCA9IE5VTDsKKworCQlpZiAoZmluZGZpcnN0KGJ1ZiwgJmZiLCBGQV9ESVJFQykgPT0gMCkKKwkJeworCQkgICAgYWRkZWQgPSBTVFJMRU4oZmIuZmZfbmFtZSk7CisJCSAgICBpZiAoKGhlYWQgLSBidWYpICsgYWRkZWQgKyBTVFJMRU4odGFpbCArIDEpICsgMiA8IGxlbikKKwkJICAgIHsKKwkJCWFkZGVkIC09ICh0YWlsIC0gaGVhZCk7CisJCQlpZiAoYWRkZWQgIT0gMCkKKwkJCSAgICBtY2hfbWVtbW92ZSh0YWlsICsgMSArIGFkZGVkLCB0YWlsICsgMSwKKwkJCQkJCQlTVFJMRU4odGFpbCArIDEpICsgMSk7CisJCQlTVFJDUFkoaGVhZCwgZmIuZmZfbmFtZSk7CisJCQl0YWlsICs9IGFkZGVkOworCQkgICAgfQorCQl9CisJCSp0YWlsID0gYzsKKwkJaGVhZCA9IHRhaWw7CisJICAgIH0KKwl9CisjICBlbmRpZgorCWlmIChwICE9IE5VTEwpCisJICAgIG1jaF9jaGRpcihvbGRkaXIpOworCS8qCisJICogQ29uY2F0ZW5hdGUgdGhlIGZpbGUgbmFtZSB0byB0aGUgcGF0aC4KKwkgKi8KKwlpZiAoKmZuYW1lICE9IE5VTCkKKwl7CisJICAgIGwgPSBTVFJMRU4oYnVmKTsKKwkgICAgaWYgKGwgPiAwICYmIGJ1ZltsIC0gMV0gIT0gJy8nICYmIGJ1ZltsIC0gMV0gIT0gJ1xcJykKKwkJc3RyY2F0KGJ1ZiwgcHNlcHMpOworCSAgICBzdHJjYXQoYnVmLCBmbmFtZSk7CisJfQorCXJldHVybiByZXR2YWw7CisjIGVuZGlmCisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBSZXBsYWNlIGFsbCBzbGFzaGVzIGJ5IGJhY2tzbGFzaGVzLgorICogVGhpcyB1c2VkIHRvIGJlIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBidXQgTVMtRE9TIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMKKyAqIHdpdGggc2xhc2hlcyAoZS5nLiBpbiBhIGNvbW1hbmQgbmFtZSkuICBXZSBjYW4ndCBoYXZlIG1peGVkIHNsYXNoZXMgYW5kCisgKiBiYWNrc2xhc2hlcywgYmVjYXVzZSBjb21wYXJpbmcgZmlsZSBuYW1lcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gIFRoZQorICogY29tbWFuZHMgdGhhdCB1c2UgYSBmaWxlIG5hbWUgc2hvdWxkIHRyeSB0byBhdm9pZCB0aGUgbmVlZCB0byB0eXBlIGEKKyAqIGJhY2tzbGFzaCB0d2ljZS4KKyAqIFdoZW4gJ3NoZWxsc2xhc2gnIHNldCBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqLworICAgIHZvaWQKK3NsYXNoX2FkanVzdChjaGFyX3UgKnApCit7CisjaWZkZWYgT0xEX0RKR1BQICAgIC8qIHRoaXMgc2VlbXMgdG8gaGF2ZSBiZWVuIGZpeGVkIGluIERKR1BQIDIuMDEgKi8KKyAgICAvKiBESkdQUCBjYW4ndCBoYW5kbGUgYSBmaWxlIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaCwgYW5kIHdoZW4gaXQKKyAgICAgKiBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZXJlIHNob3VsZCBiZSBubyBiYWNrc2xhc2hlcyAqLworICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICcvJykKKwl3aGlsZSAoKnApCisJeworCSAgICBpZiAoKnAgPT0gJ1xcJykKKwkJKnAgPSAnLyc7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3A7CisJfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHdoaWxlICgqcCkKKyAgICB7CisJaWYgKCpwID09IHBzZXBjTikKKwkgICAgKnAgPSBwc2VwYzsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCWVsc2UKKyNlbmRpZgorCSAgICArK3A7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgImZuYW1lIiBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICovCisgICAgaW50CittY2hfaXNGdWxsTmFtZShjaGFyX3UgKmZuYW1lKQoreworICAgIC8qIEEgbmFtZSBsaWtlICJkOi9mb28iIGFuZCAiLy9zZXJ2ZXIvc2hhcmUiIGlzIGFic29sdXRlICovCisgICAgcmV0dXJuIChmbmFtZVswXSAhPSBOVUwgJiYgZm5hbWVbMV0gPT0gJzonCisJCQkJICAgICAmJiAoZm5hbWVbMl0gPT0gJy8nIHx8IGZuYW1lWzJdID09ICdcXCcpKQorCXx8IChmbmFtZVswXSA9PSBmbmFtZVsxXSAmJiAoZm5hbWVbMF0gPT0gJy8nIHx8IGZuYW1lWzBdID09ICdcXCcpKTsKK30KKworCisgICAgdm9pZAorbWNoX2Vhcmx5X2luaXQodm9pZCkKK3sKK30KKworLyoKKyAqIENhcmVmdWw6IG1jaF9leGl0KCkgbWF5IGJlIGNhbGxlZCBiZWZvcmUgbWNoX2luaXQoKSEKKyAqLworICAgIHZvaWQKK21jaF9leGl0KGludCByKQoreworICAgIHNldHRtb2RlKFRNT0RFX0NPT0spOworICAgIHN0b3B0ZXJtY2FwKCk7CisgICAgc2V0X2ludGVycnVwdHMoRkFMU0UpOwkgICAgLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCisjaWZkZWYgREpHUFAKKyAgICBzZXRfc3lzX2N1cnNvcigpOworI2VuZGlmCisgICAgLyogU29tZWhvdyBvdXRwdXR0aW5nIENSLU5MIGNhdXNlcyB0aGUgb3JpZ2luYWwgY29sb3JzIHRvIGJlIHJlc3RvcmVkICovCisgICAgb3V0X2NoYXIoJ1xyJyk7CisgICAgb3V0X2NoYXIoJ1xuJyk7CisgICAgb3V0X2ZsdXNoKCk7CisgICAgbWxfY2xvc2VfYWxsKFRSVUUpOwkJICAgIC8qIHJlbW92ZSBhbGwgbWVtZmlsZXMgKi8KKyNpZmRlZiBNQ0hfQ1VSU09SX1NIQVBFCisgICAgbWNoX3Jlc3RvcmVfY3Vyc29yX3NoYXBlKFRSVUUpOworI2VuZGlmCisgICAgZXhpdChyKTsKK30KKworLyoKKyAqIHNldCB0aGUgdHR5IGluIChyYXcpID8gInJhdyIgOiAiY29va2VkIiBtb2RlCisgKiBEb2VzIG5vdCBjaGFuZ2UgdGhlIHR0eSwgYXMgYmlvc2tleSgpIGFuZCBrYmhpdCgpIHdvcmsgcmF3IGFsbCB0aGUgdGltZS4KKyAqLworICAgIHZvaWQKK21jaF9zZXR0bW9kZShpbnQgdG1vZGUpCit7Cit9CisKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgdm9pZAorbWNoX3NldG1vdXNlKGludCBvbikKK3sKKyAgICBtb3VzZV9hY3RpdmUgPSBvbjsKKyAgICBtb3VzZV9oaWRkZW4gPSBUUlVFOwkvKiBkb250IHNob3cgaXQgdW50aWwgbW92ZWQgKi8KK30KKyNlbmRpZgorCisvKgorICogc2V0IHNjcmVlbiBtb2RlCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21jaF9zY3JlZW5tb2RlKGNoYXJfdSAqYXJnKQoreworICAgIGludAkJICAgIG1vZGU7CisgICAgaW50CQkgICAgaTsKKyAgICBzdGF0aWMgY2hhcgkgICAqKG5hbWVzW10pID0geyJCVzQwIiwgIkM0MCIsICJCVzgwIiwgIkM4MCIsICJNT05PIiwgIkM0MzUwIn07CisgICAgc3RhdGljIGludAkgICAgbW9kZXNbXSAgID0geyBCVzQwLAkgIEM0MCwJIEJXODAsCSBDODAsCU1PTk8sCUM0MzUwfTsKKworICAgIG1vZGUgPSAtMTsKKyAgICBpZiAoVklNX0lTRElHSVQoKmFyZykpCQkgICAgLyogbW9kZSBudW1iZXIgZ2l2ZW4gKi8KKwltb2RlID0gYXRvaSgoY2hhciAqKWFyZyk7CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG5hbWVzKSAvIHNpemVvZihjaGFyX3UgKik7ICsraSkKKwkgICAgaWYgKHN0cmljbXAobmFtZXNbaV0sIChjaGFyICopYXJnKSA9PSAwKQorCSAgICB7CisJCW1vZGUgPSBtb2Rlc1tpXTsKKwkJYnJlYWs7CisJICAgIH0KKyAgICB9CisgICAgaWYgKG1vZGUgPT0gLTEpCisgICAgeworCUVNU0coIkUzNjI6IFVuc3VwcG9ydGVkIHNjcmVlbiBtb2RlIik7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHRleHRtb2RlKG1vZGUpOwkJICAgIC8qIHVzZSBCb3JsYW5kIGZ1bmN0aW9uICovCisjaWZkZWYgREpHUFAKKyAgICAvKiBiYXNlIGFkZHJlc3MgbWF5IGhhdmUgY2hhbmdlZCAqLworICAgIGdldF9zY3JlZW5iYXNlKCk7CisjZW5kaWYKKworICAgIC8qIFNjcmVlbiBjb2xvcnMgbWF5IGhhdmUgY2hhbmdlZC4gKi8KKyAgICBvdXRfc3RyKFRfTUUpOworCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIGlmIChtb2RlIDw9IDEgfHwgbW9kZSA9PSA0IHx8IG1vZGUgPT0gNSB8fCBtb2RlID09IDEzIHx8IG1vZGUgPT0gMHgxMykKKwltb3VzZV94X2RpdiA9IDE2OworICAgIGVsc2UKKwltb3VzZV94X2RpdiA9IDg7CisgICAgaWYgKG1vZGUgPT0gMHgxMSB8fCBtb2RlID09IDB4MTIpCisJbW91c2VfeV9kaXYgPSAxNjsKKyAgICBlbHNlIGlmIChtb2RlID09IDB4MTApCisJbW91c2VfeV9kaXYgPSAxNDsKKyAgICBlbHNlCisJbW91c2VfeV9kaXYgPSA4OworICAgIHNoZWxsX3Jlc2l6ZWQoKTsKKyNlbmRpZgorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIGJ5IFR1cmJvLUMvQm9ybGFuZC1DIHRvIHN0b3JlIHZpZGVvIHBhcmFtZXRlcnMuCisgKi8KKyNpZm5kZWYgREpHUFAKK2V4dGVybiBzdHJ1Y3QgdGV4dF9pbmZvIF92aWRlbzsKKyNlbmRpZgorCisvKgorICogdHJ5IHRvIGdldCB0aGUgcmVhbCB3aW5kb3cgc2l6ZQorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CittY2hfZ2V0X3NoZWxsc2l6ZSh2b2lkKQoreworICAgIHN0cnVjdCB0ZXh0X2luZm8gdGV4dGluZm87CisKKyAgICAvKgorICAgICAqIFRoZSBzY3JlZW53aWR0aCBpcyByZXR1cm5lZCBieSB0aGUgQklPUyBPSy4KKyAgICAgKiBUaGUgc2NyZWVuaGVpZ2h0IGlzIGluIGEgbG9jYXRpb24gaW4gdGhlIGJpb3MgUkFNLCBpZiB0aGUgZGlzcGxheSBpcworICAgICAqIEVHQSBvciBWR0EuCisgICAgICovCisgICAgaWYgKCF0ZXJtX2NvbnNvbGUpCisJcmV0dXJuIEZBSUw7CisgICAgZ2V0dGV4dGluZm8oJnRleHRpbmZvKTsKKyAgICBDb2x1bW5zID0gdGV4dGluZm8uc2NyZWVud2lkdGg7CisgICAgUm93cyA9IHRleHRpbmZvLnNjcmVlbmhlaWdodDsKKyNpZm5kZWYgREpHUFAKKyAgICBpZiAodGV4dGluZm8uY3Vycm1vZGUgPiAxMCkKKwlSb3dzID0gKihjaGFyIGZhciAqKU1LX0ZQKDB4NDAsIDB4ODQpICsgMTsKKyNlbmRpZgorCisgICAgaWYgKENvbHVtbnMgPCBNSU5fQ09MVU1OUyB8fCBSb3dzIDwgTUlOX0xJTkVTKQorICAgIHsKKwkvKiB0aGVzZSB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRlcm1jYXAgc2l6ZSBvciBkZWZhdWx0ICovCisJQ29sdW1ucyA9IDgwOworCVJvd3MgPSAyNTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisjaWZkZWYgREpHUFAKKyAgICBteXRleHRpbml0KCZ0ZXh0aW5mbyk7ICAgLyogQWRkZWQgYnkgSk1MLCAxLzE1Lzk4ICovCisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFNldCB0aGUgYWN0aXZlIHdpbmRvdyBmb3IgZGVsbGluZS9pbnNsaW5lLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF93aW5kb3codm9pZCkKK3sKKyAgICBpZiAodGVybV9jb25zb2xlKQorICAgIHsKKyNpZm5kZWYgREpHUFAKKwlfdmlkZW8uc2NyZWVuaGVpZ2h0ID0gUm93czsKKyNlbmRpZgorCW15d2luZG93KDEsIDEsIENvbHVtbnMsIFJvd3MpOworICAgIH0KKyAgICBzY3JlZW5fc3RhcnQoKTsKK30KKworICAgIHZvaWQKK21jaF9zZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogU2hvdWxkIHRyeSB0byBzZXQgdGhlIHdpbmRvdyBzaXplIHRvIFJvd3MgYW5kIENvbHVtbnMuCisgICAgICogTWF5IGludm9sdmUgc3dpdGNoaW5nIGRpc3BsYXkgbW9kZS4uLi4KKyAgICAgKiBXZSBhc3N1bWUgdGhlIHVzZXIga25vd3MgdGhlIHNpemUgYW5kIGp1c3QgdXNlIGl0LiAqLworfQorCisvKgorICogUm93cyBhbmQvb3IgQ29sdW1ucyBoYXMgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK21jaF9uZXdfc2hlbGxzaXplKCkKK3sKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgLyogYmVzdCBndWVzcyBmb3IgbW91c2UgY29vcmRpbmF0ZSBjb21wdXRhdGlvbnMgKi8KKyAgICBpZiAoQ29sdW1ucyA8PSA0MCkKKwltb3VzZV94X2RpdiA9IDE2OworICAgIGlmIChSb3dzID09IDMwKQorCW1vdXNlX3lfZGl2ID0gMTY7CisjZW5kaWYKKyAgICBzZXRfd2luZG93KCk7CisjaWZkZWYgRkVBVF9NT1VTRQorICAgIG1vdXNlX2FyZWEoKTsJLyogc2V0IGFyZWEgd2hlcmUgbW91c2UgY2FuIGdvICovCisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2hlY2sgdGhlIG51bWJlciBvZiBDb2x1bW5zIHdpdGggYSBCSU9TIGNhbGwuICBUaGlzIGF2b2lkcyBhIGNyYXNoIG9mIHRoZQorICogRE9TIGNvbnNvbGUgd2hlbiAnY29sdW1ucycgaXMgc2V0IHRvIGEgdG9vIGxhcmdlIHZhbHVlLgorICovCisgICAgdm9pZAorbWNoX2NoZWNrX2NvbHVtbnMoKQoreworICAgIHN0YXRpYyB1bmlvbiBSRUdTCXJlZ3M7CisKKyAgICByZWdzLmguYWggPSAweDBmOworICAgICh2b2lkKWludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7CisgICAgaWYgKCh1bnNpZ25lZClDb2x1bW5zID4gKHVuc2lnbmVkKXJlZ3MuaC5haCkKKwlDb2x1bW5zID0gKHVuc2lnbmVkKXJlZ3MuaC5haDsKK30KKyNlbmRpZgorCisvKgorICogY2FsbCBzaGVsbCwgcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICogb3B0aW9uczogU0hFTExfKiwgc2VlIHZpbS5oLgorICovCisgICAgaW50CittY2hfY2FsbF9zaGVsbCgKKyAgICBjaGFyX3UJKmNtZCwKKyAgICBpbnQJCW9wdGlvbnMpCit7CisgICAgaW50CQl4OworICAgIGludAkJdG1vZGUgPSBjdXJfdG1vZGU7CisjaWZuZGVmIERKR1BQCisgICAgY2hhcl91CSpuZXdjbWQ7CisjZW5kaWYKKworICAgIG91dF9mbHVzaCgpOworI2lmZGVmIERKR1BQCisgICAgc2V0X3N5c19jdXJzb3IoKTsKKyNlbmRpZgorCisgICAgaWYgKG9wdGlvbnMgJiBTSEVMTF9DT09LRUQpCisJc2V0dG1vZGUoVE1PREVfQ09PSyk7CS8qIHNldCB0byBub3JtYWwgbW9kZSAqLworICAgIHNldF9pbnRlcnJ1cHRzKEZBTFNFKTsJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCisKKyNpZmRlZiBESkdQUAorICAgIC8qIGlnbm9yZSBzaWduYWxzIHdoaWxlIGV4dGVybmFsIGNvbW1hbmQgaXMgcnVubmluZyAqLworICAgIHNpZ25hbChTSUdJTlQsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKyAgICBzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7CisjZW5kaWYKKyAgICBpZiAoY21kID09IE5VTEwpCisJeCA9IHN5c3RlbSgoY2hhciAqKXBfc2gpOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgREpHUFAKKwkvKgorCSAqIFVzZSAnc2hlbGwnIGZvciBzeXN0ZW0oKS4KKwkgKi8KKwlzZXRlbnYoIlNIRUxMIiwgKGNoYXIgKilwX3NoLCAxKTsKKwl4ID0gc3lzdGVtKGNtZCk7CisjZWxzZQorCS8qIHdlIHVzZSAiY29tbWFuZCIgdG8gc3RhcnQgdGhlIHNoZWxsLCBzbG93IGJ1dCBlYXN5ICovCisJbmV3Y21kID0gYWxsb2MoU1RSTEVOKHBfc2gpICsgU1RSTEVOKHBfc2hjZikgKyBTVFJMRU4oY21kKSArIDMpOworCWlmIChuZXdjbWQgPT0gTlVMTCkKKwkgICAgeCA9IC0xOworCWVsc2UKKwl7CisJICAgIHNwcmludGYoKGNoYXIgKiluZXdjbWQsICIlcyAlcyAlcyIsIHBfc2gsIHBfc2hjZiwgY21kKTsKKwkgICAgeCA9IHN5c3RlbSgoY2hhciAqKW5ld2NtZCk7CisJICAgIHZpbV9mcmVlKG5ld2NtZCk7CisJfQorI2VuZGlmCisgICAgfQorI2lmZGVmIERKR1BQCisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0hVUCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIGlmICh0bW9kZSA9PSBUTU9ERV9SQVcpCisJc2V0dG1vZGUoVE1PREVfUkFXKTsJLyogc2V0IHRvIHJhdyBtb2RlICovCisgICAgc2V0X2ludGVycnVwdHMoVFJVRSk7CS8qIGNhdGNoIGludGVycnVwdHMgKi8KKworICAgIGlmICh4ICYmICEob3B0aW9ucyAmIFNIRUxMX1NJTEVOVCkgJiYgIWVtc2dfc2lsZW50KQorICAgIHsKKwlNU0dfUFVUUygiXG5zaGVsbCByZXR1cm5lZCAiKTsKKwltc2dfb3V0bnVtKChsb25nKXgpOworCW1zZ19wdXRjaGFyKCdcbicpOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCisvKgorICogY2hlY2sgZm9yIGFuICJpbnRlcnJ1cHQgc2lnbmFsIjogQ1RSTC1icmVhayBvciBDVFJMLUMKKyAqLworICAgIHZvaWQKK21jaF9icmVha2NoZWNrKHZvaWQpCit7CisgICAgaWYgKGN0cmxjX3ByZXNzZWQpCisgICAgeworCWN0cmxjX3ByZXNzZWQgPSBGQUxTRTsKKwlnb3RfaW50ID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAicCIgY29udGFpbiBhIHdpbGRjYXJkIHRoYXQgY2FuIGJlIGV4cGFuZGVkIGJ5CisgKiBkb3NfZXhwYW5kcGF0aCgpLgorICovCisgICAgaW50CittY2hfaGFzX2V4cF93aWxkY2FyZChjaGFyX3UgKnApCit7CisgICAgZm9yICggOyAqcDsgKytwKQorICAgIHsKKwlpZiAodmltX3N0cmNocigoY2hhcl91ICopIj8qWyIsICpwKSAhPSBOVUxMCisJCXx8ICgqcCA9PSAnficgJiYgcFsxXSAhPSBOVUwpKQorCSAgICByZXR1cm4gVFJVRTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAicCIgY29udGFpbiBhIHdpbGRjYXJkIG9yIGEgIn4xIiBraW5kIG9mIHRoaW5nIChjb3VsZCBiZSBhCisgKiBzaG9ydGVuZWQgZmlsZSBuYW1lKS4KKyAqLworICAgIGludAorbWNoX2hhc193aWxkY2FyZChjaGFyX3UgKnApCit7CisgICAgZm9yICggOyAqcDsgKytwKQorICAgIHsKKwlpZiAodmltX3N0cmNocigoY2hhcl91ICopCisjICBpZmRlZiBWSU1fQkFDS1RJQ0sKKwkJCQkgICAgIj8qJFtgIgorIyAgZWxzZQorCQkJCSAgICAiPyokWyIKKyMgIGVuZGlmCisJCQkJCQksICpwKSAhPSBOVUxMCisJCXx8ICgqcCA9PSAnficgJiYgcFsxXSAhPSBOVUwpKQorCSAgICByZXR1cm4gVFJVRTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBDaGFuZ2UgZGlyZWN0b3J5IHRvICJwYXRoIi4KKyAqIFRoZSBub3JtYWwgY2hkaXIoKSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGRlZmF1bHQgZHJpdmUuICBUaGlzIG9uZSBkb2VzLgorICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CittY2hfY2hkaXIoY2hhciAqcGF0aCkKK3sKKyAgICBpZiAocGF0aFswXSA9PSBOVUwpCQkgICAgLyoganVzdCBjaGVja2luZy4uLiAqLworCXJldHVybiAwOworICAgIGlmIChwYXRoWzFdID09ICc6JykJCSAgICAvKiBoYXMgYSBkcml2ZSBuYW1lICovCisgICAgeworCWlmIChjaGFuZ2VfZHJpdmUoVE9MT1dFUl9BU0MocGF0aFswXSkgLSAnYScgKyAxKSkKKwkgICAgcmV0dXJuIC0xOwkJICAgIC8qIGludmFsaWQgZHJpdmUgbmFtZSAqLworCXBhdGggKz0gMjsKKyAgICB9CisgICAgaWYgKCpwYXRoID09IE5VTCkJCSAgICAvKiBkcml2ZSBuYW1lIG9ubHkgKi8KKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gY2hkaXIocGF0aCk7CQkgICAgLyogbGV0IHRoZSBub3JtYWwgY2hkaXIoKSBkbyB0aGUgcmVzdCAqLworfQorCisjaWZkZWYgREpHUFAKKy8qCisgKiBtY2hfcmVuYW1lKCkgd29ya3MgYXJvdW5kIGEgYnVnIGluIHJlbmFtZSAoYWthIE1vdmVGaWxlKSBpbgorICogV2luZG93cyA5NTogcmVuYW1lKCJmb28uYmFyIiwgImZvby5iYXJ+Iikgd2lsbCBnZW5lcmF0ZSBhCisgKiBmaWxlIHdob3NlIHNob3J0IGZpbGUgbmFtZSBpcyAiRk9PLkJBUiIgKGl0cyBsb25nIGZpbGUgbmFtZSB3aWxsCisgKiBiZSBjb3JyZWN0OiAiZm9vLmJhcn4iKS4gIEJlY2F1c2UgYSBmaWxlIGNhbiBiZSBhY2Nlc3NlZCBieQorICogZWl0aGVyIGl0cyBTRk4gb3IgaXRzIExGTiwgImZvby5iYXIiIGhhcyBlZmZlY3RpdmVseSBiZWVuCisgKiByZW5hbWVkIHRvICJmb28uYmFyIiwgd2hpY2ggaXMgbm90IGF0IGFsbCB3aGF0IHdhcyB3YW50ZWQuICBUaGlzCisgKiBzZWVtcyB0byBoYXBwZW4gb25seSB3aGVuIHJlbmFtaW5nIGZpbGVzIHdpdGggdGhyZWUtY2hhcmFjdGVyCisgKiBleHRlbnNpb25zIGJ5IGFwcGVuZGluZyBhIHN1ZmZpeCB0aGF0IGRvZXMgbm90IGluY2x1ZGUgIi4iLgorICogV2luZG93cyBOVCBnZXRzIGl0IHJpZ2h0LCBob3dldmVyLCB3aXRoIGFuIFNGTiBvZiAiRk9PfjEuQkFSIi4KKyAqIFRoaXMgd29ya3MgbGlrZSBtY2hfcmVuYW1lIGluIG9zX3dpbjMyLmMsIGJ1dCBpcyBhIGJpdCBzaW1wbGVyLgorICoKKyAqIExpa2UgcmVuYW1lKCksIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIHVwb24gZmFpbHVyZS4KKyAqIFNob3VsZCBwcm9iYWJseSBzZXQgZXJybm8gYXBwcm9wcmlhdGVseSB3aGVuIGVycm9ycyBvY2N1ci4KKyAqLworCisgICAgaW50CittY2hfcmVuYW1lKGNvbnN0IGNoYXIgKk9sZEZpbGUsIGNvbnN0IGNoYXIgKk5ld0ZpbGUpCit7CisgICAgY2hhcl91ICAqVGVtcEZpbGU7CisgICAgaW50CSAgICByZXR2YWw7CisgICAgaW50CSAgICBmZDsKKworICAgIC8qIHJlbmFtZSgpIHdvcmtzIGNvcnJlY3RseSB3aXRob3V0IGxvbmcgZmlsZSBuYW1lcywgc28gdXNlIHRoYXQgKi8KKyAgICBpZiAoIV9VU0VfTEZOKQorCXJldHVybiByZW5hbWUoT2xkRmlsZSwgTmV3RmlsZSk7CisKKyAgICBpZiAoKFRlbXBGaWxlID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oT2xkRmlsZSkgKyAxMykpKSA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIFNUUkNQWShUZW1wRmlsZSwgT2xkRmlsZSk7CisgICAgU1RSQ1BZKGdldHRhaWwoVGVtcEZpbGUpLCAiYXhscXdxaHkuYmF+Iik7CisgICAgaWYgKHJlbmFtZShPbGRGaWxlLCBUZW1wRmlsZSkpCisJcmV0dmFsID0gLTE7CisgICAgZWxzZQorICAgIHsKKwkvKiBub3cgY3JlYXRlIGFuIGVtcHR5IGZpbGUgY2FsbGVkIE9sZEZpbGU7IHRoaXMgcHJldmVudHMKKwkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB1c2luZyBPbGRGaWxlIGFzIGFuIGFsaWFzIChTRk4pCisJICogaWYgd2UncmUgcmVuYW1pbmcgd2l0aGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLAorCSAqIHdlJ3JlIGVkaXRpbmcgYSBmaWxlIGNhbGxlZCBmaWxlbmFtZS5hc2MudHh0IGJ5IGl0cyBTRk4sCisJICogZmlsZW5hfjEudHh0LiAgSWYgd2UgcmVuYW1lIGZpbGVuYX4xLnR4dCB0byBmaWxlbmF+MS50eHR+CisJICogKGkuZS4sIHdlJ3JlIG1ha2luZyBhIGJhY2t1cCB3aGlsZSB3cml0aW5nIGl0KSwgdGhlIFNGTgorCSAqIGZvciBmaWxlbmF+MS50eHR+IHdpbGwgYmUgZmlsZW5hfjEudHh0LCBieSBkZWZhdWx0LCB3aGljaAorCSAqIHdpbGwgY2F1c2UgYWxsIHNvcnRzIG9mIHByb2JsZW1zIGxhdGVyIGluIGJ1Zl93cml0ZS4gIFNvLCB3ZQorCSAqIGNyZWF0ZSBhbiBlbXB0eSBmaWxlIGNhbGxlZCBmaWxlbmF+MS50eHQgYW5kIHRoZSBzeXN0ZW0gd2lsbCBoYXZlCisJICogdG8gZmluZCBzb21lIG90aGVyIFNGTiBmb3IgZmlsZW5hfjEudHh0fiwgc3VjaCBhcyBmaWxlbmF+Mi50eHQKKwkgKi8KKwlpZiAoKGZkID0gb3BlbihPbGRGaWxlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA0NDQpKSA8IDApCisJICAgIHJldHVybiAtMTsKKwlyZXR2YWwgPSByZW5hbWUoVGVtcEZpbGUsIE5ld0ZpbGUpOworCWNsb3NlKGZkKTsKKwltY2hfcmVtb3ZlKChjaGFyX3UgKilPbGRGaWxlKTsKKworCS8qIElmIHJlbmFtaW5nIHRvIE5ld0ZpbGUgZmFpbGVkLCByZW5hbWUgVGVtcEZpbGUgYmFjayB0byBPbGRGaWxlLCBzbworCSAqIHRoYXQgaXQgbG9va3MgbGlrZSBub3RoaW5nIGhhcHBlbmVkLiAqLworCWlmIChyZXR2YWwpCisJICAgIHJlbmFtZShUZW1wRmlsZSwgT2xkRmlsZSk7CisgICAgfQorICAgIHZpbV9mcmVlKFRlbXBGaWxlKTsKKworICAgIHJldHVybiByZXR2YWw7ICAvKiBzdWNjZXNzICovCit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogc2V0bG9jYWxlKCkgZm9yIERKR1BQIHdpdGggTVMtRE9TIGNvZGVwYWdlIHN1cHBvcnQKKyAqIEF1dGhvcjogQ3lyaWwgU2xvYmluIDxzbG9iaW5AZmUubXNrLnJ1PgorICoKKyAqIFNjYWxlZCBkb3duIGEgbG90IGZvciB1c2UgYnkgVmltOiBPbmx5IHN1cHBvcnQgc2V0bG9jYWxlKExDX0FMTCwgIiIpLgorICovCisKKyN1bmRlZiBzZXRsb2NhbGUKKworI2luY2x1ZGUgPGdvMzIuaD4KKyNpbmNsdWRlIDxpbmxpbmVzL2N0eXBlLmhhPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjZGVmaW5lIFVQQ0FTRSAoX19kal9JU0FMTlVNIHwgX19kal9JU0FMUEhBIHwgX19kal9JU0dSQVBIIHwgX19kal9JU1BSSU5UIHwgX19kal9JU1VQUEVSKQorI2RlZmluZSBMT0NBU0UgKF9fZGpfSVNBTE5VTSB8IF9fZGpfSVNBTFBIQSB8IF9fZGpfSVNHUkFQSCB8IF9fZGpfSVNQUklOVCB8IF9fZGpfSVNMT1dFUikKKworICAgIGNoYXIgKgorZGpncHBfc2V0bG9jYWxlKHZvaWQpCit7CisgICAgX19kcG1pX3JlZ3MgcmVnczsKKyAgICBzdHJ1Y3QgeyBjaGFyIGlkOyB1bnNpZ25lZCBzaG9ydCBvZmYsIHNlZzsgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW5mbzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsweDgyXSwgbG93ZXIsIHVwcGVyOworICAgIGludCBpOworCisgICAgcmVncy54LmF4ID0gMHg2NTAyOworICAgIHJlZ3MueC5ieCA9IDB4ZmZmZjsKKyAgICByZWdzLnguZHggPSAweGZmZmY7CisgICAgcmVncy54LmN4ID0gNTsKKyAgICByZWdzLnguZXMgPSBfX3RiID4+IDQ7CisgICAgcmVncy54LmRpID0gX190YiAmIDB4ZjsKKworICAgIF9fZHBtaV9pbnQoMHgyMSwgJnJlZ3MpOworCisgICAgaWYgKHJlZ3MueC5mbGFncyAmIDEpCisJcmV0dXJuIE5VTEw7CisKKyAgICBkb3NtZW1nZXQoX190YiwgNSwgJmluZm8pOworICAgIGRvc21lbWdldCgoaW5mby5zZWcgPDwgNCkgKyBpbmZvLm9mZiwgMHg4MiwgYnVmZmVyKTsKKworICAgIGlmICgqKHNob3J0ICopYnVmZmVyICE9IDB4ODApCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBGaXggcHJvYmxlbSBvZiB1bmRlcnNjb3JlcyBiZWluZyByZXBsYWNlZCB3aXRoIHktdW1sYXV0LiAoTGV2aW4pICovCisgICAgaWYgKGJ1ZmZlclsyNl0gPT0gMHg1ZikKKwlidWZmZXJbMjZdID0gMHg5ODsKKworICAgIGZvciAoaSA9IDA7IGkgPCAweDgwOyBpKyspCisgICAgeworCWxvd2VyID0gaSArIDB4ODA7CisJdXBwZXIgPSAoYnVmZmVyKzIpW2ldOworCWlmIChsb3dlciAhPSB1cHBlcikKKwl7CisJICAgIF9fZGpfY3R5cGVfZmxhZ3NbbG93ZXIrMV0gPSBMT0NBU0U7CisJICAgIF9fZGpfY3R5cGVfdG91cHBlcltsb3dlcisxXSA9IHVwcGVyOworCSAgICBpZiAoX19kal9jdHlwZV9mbGFnc1t1cHBlcisxXSA9PSAwKQorCQlfX2RqX2N0eXBlX2ZsYWdzW3VwcGVyKzFdID0gVVBDQVNFOworCSAgICBpZiAoX19kal9jdHlwZV90b2xvd2VyW3VwcGVyKzFdID09IHVwcGVyKQorCQlfX2RqX2N0eXBlX3RvbG93ZXJbdXBwZXIrMV0gPSBsb3dlcjsKKwl9CisgICAgfQorCisgICAgcmV0dXJuICJDIjsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBDbGlwYm9hcmQgc3R1ZmYsIGZvciBjdXR0aW5nIGFuZCBwYXN0aW5nIHRleHQgdG8gb3RoZXIgd2luZG93cy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBET1MvV2luZG93cyBjbGlwYm9hcmQgZGF0YSB0cmFuc2ZlcgorICogYnkgRGF2aWQgS290Y2hhbiAoZGtvdGNoYW5Ac3ltcGF0aWNvLmNhKQorICovCisKKyNkZWZpbmUgQ0ZfVEVYVAkgICAgMHgwMSAgICAvKiBXaW5kb3dzIGNsaXBib2FyZCBmb3JtYXQ6IFdpbmRvd3MgKEFOU0kpIHRleHQgKi8KKyNkZWZpbmUgQ0ZfT0VNVEVYVCAgMHgwNyAgICAvKiBXaW5kb3dzIGNsaXBib2FyZCBmb3JtYXQ6IE9FTSAoRE9TKSB0ZXh0ICovCisjZGVmaW5lIENGX1ZJTUNMSVAgIDB4MDQgICAgLyogdHJpY2s6IFNZTEsgY2xpcGJvYXJkIGZvcm1hdCBmb3IgVmltQ2xpcGJvYXJkICovCisKK3N0YXRpYyBpbnQgV2luMTZPcGVuQ2xpcGJvYXJkKHZvaWQpOworc3RhdGljIGludCBXaW4xNkNsb3NlQ2xpcGJvYXJkKHZvaWQpOworc3RhdGljIGludCBXaW4xNkVtcHR5Q2xpcGJvYXJkKHZvaWQpOworc3RhdGljIGNoYXJfdSAqV2luMTZHZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0KTsKK3N0YXRpYyBpbnQgV2luMTZTZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0LCBjaGFyX3UgKmNsaXBfZGF0YSwgaW50IGNsaXBfZGF0YV9zaXplLCBpbnQgY2xpcF9kYXRhX3R5cGUpOworCisvKgorICogTWFrZSB2aW0gdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIFJldHVybiBPSyB1cG9uIHN1Y2Nlc3MuCisgKi8KKyAgICBpbnQKK2NsaXBfbWNoX293bl9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgLyoKKyAgICAgKiBOZXZlciBhY3R1YWxseSBvd24gdGhlIGNsaXBib2FyZC4gIElmIGFub3RoZXIgYXBwbGljYXRpb24gc2V0cyB0aGUKKyAgICAgKiBjbGlwYm9hcmQsIHdlIGRvbid0IHdhbnQgdG8gdGhpbmsgdGhhdCB3ZSBzdGlsbCBvd24gaXQuCisgICAgICovCisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBNYWtlIHZpbSBOT1QgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAqLworICAgIHZvaWQKK2NsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIC8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlICovCit9CisKKy8qCisgKiBSZWFkIHRoZSBXaW5kb3dzIGNsaXBib2FyZCB0ZXh0IGFuZCBwdXQgaXQgaW4gVmltJ3MgY2xpcGJvYXJkIHJlZ2lzdGVyLgorICovCisgICAgdm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgaW50CQl0eXBlID0gTUNIQVI7CisgICAgY2hhcl91CSpwQWxsb2NhdGVkID0gTlVMTDsKKyAgICBjaGFyX3UJKnBDbGlwVGV4dCA9IE5VTEw7CisgICAgaW50CQljbGlwX2RhdGFfZm9ybWF0ID0gMDsKKworICAgIGlmIChXaW4xNk9wZW5DbGlwYm9hcmQoKSkKKyAgICB7CisJLyogQ2hlY2sgZm9yIFZpbSdzIG93biBjbGlwYm9hcmQgZm9ybWF0IGZpcnN0LiAgVGhlIENGX1ZJTUNMSVAgZm9ybWF0CisJICogaXMganVzdCBvcmRpbmFyeSB0ZXh0IChsaWtlIENGX1RFWFQpIGV4Y2VwdCBwcmVwZW5kZWQgYnkgdGhlCisJICogc2VsZWN0aW9uIHR5cGUgKGFzIGEgc2luZ2xlIGNoYXJhY3RlcikuICBOb3RlIHRoYXQgdW5kZXIgRE9TIHdlCisJICogYWN0dWFsbHkgY2Fubm90IGRlZmluZSBhIGN1c3RvbSBDRl9WSU1DTElQIGNsaXBib2FyZCBmb3JtYXQ7IHdlCisJICogdXNlIGluc3RlYWQgb25lIG9mIHRoZSBleGlzdGluZyBXaW5kb3dzLWRlZmluZWQgZm9ybWF0cywgdXN1YWxseQorCSAqICJESUYiIG9yICJTWUxLIi4gIFNlZSBXaW4xNkdldENsaXBib2FyZERhdGEoKSBmb3IgZGV0YWlscy4KKwkgKgorCSAqIE5vdGUgdGhhdCBXaW4xNkdldENsaXBib2FyZERhdGEoKSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKwkgKiBibG9jayBpdCBhbGxvY2F0ZWQuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGNsaXBib2FyZCB0ZXh0IGRhdGE6IHRoZXJlIG1heSBiZSBvdGhlciBieXRlcyBhaGVhZCBvZiB0aGUKKwkgKiB0ZXh0IChwYXJ0aWN1bGFybHkgZm9yIENGX1ZJTUNMSVApIHdoaWNoIGFyZSB1c2VkIGZvciBkYXRhCisJICogbWFuYWdlbWVudC4gIFNvIHBDbGlwVGV4dCBpcyBub3QgbmVjZXNzYXJpbHkgPT0gcEFsbG9jYXRlZC4KKwkgKi8KKworCWlmICgocEFsbG9jYXRlZCA9IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YShDRl9WSU1DTElQKSkgIT0gTlVMTCkKKwl7CisJICAgIGNsaXBfZGF0YV9mb3JtYXQgPSBDRl9WSU1DTElQOworCSAgICBwQ2xpcFRleHQgPSBwQWxsb2NhdGVkOworCisJICAgIHN3aXRjaCAoKnBDbGlwVGV4dCsrKQkvKiBhZnRlciArKywgcENsaXBUZXh0IHBvaW50cyB0byB0ZXh0ICovCisJICAgIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSAnTCc6CXR5cGUgPSBNTElORTsJYnJlYWs7CisJCWNhc2UgJ0MnOgl0eXBlID0gTUNIQVI7CWJyZWFrOworI2lmZGVmIEZFQVRfVklTVUFMCisJCWNhc2UgJ0InOgl0eXBlID0gTUJMT0NLOwlicmVhazsKKyNlbmRpZgorCSAgICB9CisJfQorCisJLyogT3RoZXJ3aXNlLCBjaGVjayBmb3IgdGhlIG5vcm1hbCBXaW5kb3dzIHRleHQgZm9ybWF0cy4gIFRoZXJlIGFyZQorCSAqIHR3byBvZiB0aGVzZTogQ0ZfVEVYVCAoY29tbW9uKSBhbmQgQ0ZfT0VNVEVYVCAodXNlZCBmb3IgRE9TCisJICogY29tcGF0aWJpbGl0eSkuICBFeHBlcmltZW50cyBzaG93IHRoYXQsIHVuZGVyIHRoZSBET1MvV2luZG93cworCSAqIGNsaXBib2FyZCBpbnRlcmZhY2UsIHdyaXRpbmcgQ0ZfVEVYVCBkYXRhIHRvIHRoZSBjbGlwYm9hcmQKKwkgKiBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBDRl9PRU1URVhUIGZvcm1hdCBhcyB3ZWxsLgorCSAqLworCisJZWxzZSBpZiAoKHBBbGxvY2F0ZWQgPSBXaW4xNkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCkpICE9IE5VTEwpCisJeworCSAgICBjbGlwX2RhdGFfZm9ybWF0ID0gQ0ZfVEVYVDsKKwkgICAgcENsaXBUZXh0ID0gcEFsbG9jYXRlZDsKKwkgICAgdHlwZSA9ICh2aW1fc3RyY2hyKChjaGFyKilwQ2xpcFRleHQsICdccicpICE9IE5VTEwpID8gTUxJTkUgOiBNQ0hBUjsKKwl9CisKKwllbHNlIGlmICgocEFsbG9jYXRlZCA9IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YShDRl9PRU1URVhUKSkgIT0gTlVMTCkKKwl7CisJICAgIGNsaXBfZGF0YV9mb3JtYXQgPSBDRl9PRU1URVhUOworCSAgICBwQ2xpcFRleHQgPSBwQWxsb2NhdGVkOworCSAgICB0eXBlID0gKHZpbV9zdHJjaHIoKGNoYXIqKXBDbGlwVGV4dCwgJ1xyJykgIT0gTlVMTCkgPyBNTElORSA6IE1DSEFSOworCX0KKworCS8qIERpZCB3ZSBnZXQgYW55dGhpbmc/ICovCisKKwlpZiAocENsaXBUZXh0ICE9IE5VTEwpCisJeworCSAgICBjaGFyX3UgKnBEZXN0OworCSAgICBjaGFyX3UgKnBTdGFydDsKKwkgICAgY2hhcl91ICpwRW5kOworCisJICAgIGxvbmdfdSBjbGlwX2RhdGFfc2l6ZSA9IDA7CisKKwkgICAgLyogVGhlIFdpbmRvd3MgY2xpcGJvYXJkIG5vcm1hbGx5IHN0b3JlcyBpdHMgdGV4dCBsaW5lcyB0ZXJtaW5hdGVkCisJICAgICAqIGJ5IDxDUj48Tkw+LiAgQnV0IFZpbSB1c2VzIG9ubHkgPE5MPiwgc28gdHJhbnNsYXRlIHRoZSA8Q1I+PE5MPgorCSAgICAgKiBpbnRvIDxOTD4uICBBbHNvLCB3YXRjaCBmb3IgcG9zc2libGUgbnVsbCBieXRlcyBhdCB0aGUgZW5kIG9mCisJICAgICAqIHBDbGlwVGV4dC4gIFRoZXNlIGFyZSBwYWRkaW5nIGFkZGVkIGJ5ICJnZXRfY2xpcGJvYXJkX2RhdGEiCisJICAgICAqIChpbnQgMHgyZiwgQVg9IDB4MTcwNSkgaW4gb3JkZXIgdG8gcm91bmQgdGhlIGRhdGEgc2l6ZSB1cCB0byB0aGUKKwkgICAgICogbmV4dCBtdWx0aXBsZSBvZiAzMiBieXRlcy4gIFNlZSBXaW4xNkdldENsaXBib2FyZERhdGEoKSBmb3IKKwkgICAgICogZGV0YWlscy4KKwkgICAgICovCisKKwkgICAgcERlc3QgPSBzdHJzdHIoIHBDbGlwVGV4dCwgIlxyXG4iICk7ICAgIC8qIGZpbmQgZmlyc3QgPENSPjxOTD4gKi8KKworCSAgICBpZiAocERlc3QgIT0gTlVMTCkJCQkvKiBmb3VuZCBvbmU/ICovCisJICAgIHsKKwkJcFN0YXJ0ID0gcERlc3QgKyAxOwkJLyogcG9pbnRzIHRvIDxOTD4gYWZ0ZXIgPENSPiAqLworCQlwRW5kID0gc3Ryc3RyKCBwU3RhcnQsICJcclxuIiApOy8qIGZpbmQgbmV4dCA8Q1I+PE5MPiAqLworCisJCXdoaWxlIChwRW5kICE9IE5VTEwpCQkvKiBmb3VuZCBvbmU/ICovCisJCXsKKwkJICAgIG1lbW1vdmUocERlc3QsIHBTdGFydCwgKGxvbmcpKHBFbmQgLSBwU3RhcnQpKTsKKwkJCQkJCQkvKiBleGNsdWRlIDxDUj4gKi8KKwkJICAgIHBEZXN0ICs9IChsb25nKShwRW5kIC0gcFN0YXJ0KTsJLyogbmV3IGRlc3RpbmF0aW9uICovCisJCSAgICBwU3RhcnQgPSBwRW5kICsgMTsJCQkvKiBuZXcgc3RhcnRpbmcgcG9pbnQgKi8KKwkJICAgIHBFbmQgPSBzdHJzdHIocFN0YXJ0LCAiXHJcbiIpOwkvKiBmaW5kIG5leHQgPENSPjxOTD4gKi8KKwkJfQorCisJCS8qIEZlbGwgb3V0IG9mIHdoaWxlKCkgbG9vcDogbm8gbW9yZSA8Q1I+PE5MPiBwYWlycy4gIEp1c3QgY29weQorCQkgKiB0aGUgcmVzdCBvZiB0aGUgZGF0YSwgdXAgdG8gdGhlIGZpcnN0IG51bGwgYnl0ZS4gICovCisJCXBFbmQgPSBzdHJjaHIocFN0YXJ0LCAnXDAnKTsJCS8qIGZpbmQgZmlyc3QgbnVsbCAqLworCisJCW1lbW1vdmUocERlc3QsIHBTdGFydCwgKGxvbmcpKHBFbmQgLSBwU3RhcnQpKTsgLyogZXhjbHVkZSBudWwgKi8KKwkJcERlc3QgKz0gKGxvbmcpKHBFbmQgLSBwU3RhcnQpOworCQkqcERlc3QgPSAnXDAnOwkJCQkgICAgLyogdGVybWluYXRlICovCisKKwkJLyogTm93IHRoYXQgYWxsIDxDUj48Tkw+IHBhaXJzIGhhdmUgYmVlbiAiY29tcHJlc3NlZCIgaW50byBqdXN0CisJCSAqIDxOTD4ncywgZGV0ZXJtaW5lIHRoZSB0cnVlIHRleHQgbGVuZ3RoLiAgKi8KKwkJY2xpcF9kYXRhX3NpemUgPSAobG9uZ191KShwRGVzdCAtIHBDbGlwVGV4dCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIG5vIDxDUj48Tkw+IHBhaXJzIGF0IGFsbCAqLworCQkvKiBTaW5jZSB0aGUgZGF0YSBtYXkgaGF2ZSBiZWVuIHBhZGRlZCB3aXRoIHRyYWlsaW5nIG51bGxzLAorCQkgKiBkZXRlcm1pbmUgdGhlIHRydWUgc3RyaW5nIGxlbmd0aC4gKi8KKwkJY2xpcF9kYXRhX3NpemUgPSBTVFJMRU4ocENsaXBUZXh0KTsJLyogdHJ1ZSBkYXRhIGxlbmd0aCAqLworCSAgICB9CisKKwkgICAgLyogQ29weSB0aGUgY2xlYW5lZC11cCBkYXRhIG92ZXIgdG8gVmltJ3MgY2xpcGJvYXJkICIqIiByZWdpc3Rlci4gKi8KKwkgICAgY2xpcF95YW5rX3NlbGVjdGlvbih0eXBlLCBwQ2xpcFRleHQsIGNsaXBfZGF0YV9zaXplLCBjYmQpOworCisJICAgIC8qIEZyZWUgdGhlIG1lbW9yeSB0aGF0IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YSgpIGFsbG9jYXRlZC4gKi8KKwkgICAgdmltX2ZyZWUocEFsbG9jYXRlZCk7CisJfQorCisJV2luMTZDbG9zZUNsaXBib2FyZCgpOworCisgICAgfSAgLy8gZW5kIGlmIChXaW4xNk9wZW5DbGlwYm9hcmQoKSkKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBWaW0gdGV4dCB0byB0aGUgV2luZG93cyBjbGlwYm9hcmQuCisgKi8KKyAgICB2b2lkCitjbGlwX21jaF9zZXRfc2VsZWN0aW9uKCBWaW1DbGlwYm9hcmQgKmNiZCApCit7CisgICAgY2hhcl91CSpwQ2xpcERhdGEgPSBOVUxMOworICAgIGxvbmdfdQljbGlwX2RhdGFfc2l6ZTsKKyAgICBpbnQJCWNsaXBfZGF0YV90eXBlOworCisgICAgLyogSWYgdGhlICcqJyByZWdpc3RlciBpc24ndCBhbHJlYWR5IGZpbGxlZCBpbiwgZmlsbCBpdCBpbiBub3cuICovCisgICAgY2JkLT5vd25lZCA9IFRSVUU7CisgICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CisgICAgY2JkLT5vd25lZCA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZworICAgICAqIHRoZSB0ZXh0IHRvIHNlbmQgdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLCB0b2dldGhlciB3aXRoIGEgY291bnQKKyAgICAgKiBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGJ5dGVzKSBpbiB0aGUgYnVmZmVyLiAgVGhlIGZ1bmN0aW9uJ3MKKyAgICAgKiByZXR1cm4gdmFsdWUgaXMgdGhlICd0eXBlJyBvZiBzZWxlY3Rpb246IE1MSU5FLCBNQ0hBUiwgb3IgTUJMT0NLOworICAgICAqIG9yIC0xIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIGNsaXBfZGF0YV90eXBlID0gY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigmcENsaXBEYXRhLCAmY2xpcF9kYXRhX3NpemUsIGNiZCk7CisKKyAgICBpZiAoY2xpcF9kYXRhX3R5cGUgPCAwKQkgICAgLyogY291bGQgbm90IGNvbnZlcnQ/ICovCisJcmV0dXJuOwkJCSAgICAvKiBlYXJseSBleGl0ICovCisKKyAgICBpZiAoV2luMTZPcGVuQ2xpcGJvYXJkKCkpCisgICAgeworCWlmIChXaW4xNkVtcHR5Q2xpcGJvYXJkKCkpCisJeworCSAgICBpbnQgc2VudE9LOworCisJICAgIHNlbnRPSyA9IFdpbjE2U2V0Q2xpcGJvYXJkRGF0YShDRl9URVhULCBwQ2xpcERhdGEsCisJCQkJCSAgICAgIGNsaXBfZGF0YV9zaXplLCBjbGlwX2RhdGFfdHlwZSk7CisJICAgIHNlbnRPSyA9IFdpbjE2U2V0Q2xpcGJvYXJkRGF0YShDRl9WSU1DTElQLAorCQkJIHBDbGlwRGF0YSwgY2xpcF9kYXRhX3NpemUsIGNsaXBfZGF0YV90eXBlKSAmJiBzZW50T0s7CisKKwkgICAgaWYgKCFzZW50T0spCisJICAgIHsKKwkJLyogb25lIG9yIGJvdGggb2YgV2luMTZTZXRDbGlwYm9hcmREYXRhKCkgZmFpbGVkLiAqLworCQkvKiBUZWNobmljYWxseSB3ZSBkb24ndCBrbm93IHdoeSBXaW4xNlNldENsaXBib2FyZERhdGEoKQorCQkgKiBmYWlsZWQsIGJ1dCBhbG1vc3QgYWx3YXlzIGl0IHdpbGwgYmUgYmVjYXVzZSB0aGVyZSB3YXNuJ3QKKwkJICogZW5vdWdoIERPUyBtZW1vcnkgdG8gYnVmZXIgdGhlIGRhdGEsIHNvIHJlcG9ydCB0aGF0IGFzIHRoZQorCQkgKiBwcm9ibGVtLgorCQkgKgorCQkgKiBXZSByZXBvcnQgdGhlIGVycm9yIGhlcmUgKGluc3RlYWQgb2YgaW4KKwkJICogV2luMTZTZXRDbGlwYm9hcmREYXRhKCkpIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgZXJyb3IKKwkJICogcmVwb3J0ZWQgdHdpY2UuCisJCSAqLworCQlFTVNHKCJFNDUwOiBTZWxlY3Rpb24gdG9vIGxhcmdlLCBjYW5ub3QgYWxsb2NhdGUgRE9TIGJ1ZmZlciIpOworCSAgICB9CisJfQorCisJV2luMTZDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8qIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCkgKi8KKyAgICB2aW1fZnJlZShwQ2xpcERhdGEpOworCisgICAgcmV0dXJuOworfQorCisvKgorICogV2luMTZPcGVuQ2xpcGJvYXJkOiBvcGVuIHRoZSBXaW5kb3dzIGNsaXBib2FyZC4gIFRoZSBjbGlwYm9hcmQgbXVzdCBiZSBvcGVuCisgKiBiZWZvcmUgaXQgY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIGF0IGFsbC4gIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsCisgKiBGQUxTRSBvbiBmYWlsdXJlLgorICovCisgICAgc3RhdGljIGludAorV2luMTZPcGVuQ2xpcGJvYXJkKHZvaWQpCit7CisgICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKKworICAgIGxvbmcgICAgc3RhcnRfdGltZTsKKyAgICBpbnQJICAgIHRpY2tfY291bnQ7CisKKyAgICAvKiBpbnQgMDJ4ZiwgQVggPSAweDE3MDEgYXR0ZW1wdHMgdG8gb3BlbiB0aGUgV2luZG93cyBjbGlwYm9hcmQuICBVcG9uCisgICAgICogcmV0dXJuIGZyb20gdGhlIGludGVycnVwdCwgaWYgQVggaXMgbm9uLXplcm8sIHRoZSBjbGlwYm9hcmQgd2FzCisgICAgICogc3VjY2Vzc2Z1bGx5IG9wZW5lZC4gIElmIEFYIGlzIHplcm8sIHRoZSBjbGlwYm9hcmQgY291bGQgbm90IGJlIG9wZW5lZAorICAgICAqIGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IGluIHVzZSBieSBhbm90aGVyIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBSZW1hcms6IG90aGVyIERPUyBwcm9ncmFtcyBJIChkaykgaGF2ZSB3cml0dGVuIHRoYXQgdXNlIHRoZSBXaW5kb3dzCisgICAgICogY2xpcGJvYXJkIHNvbWV0aW1lcyBlbmNvdW50ZXIgdGhlIHByb2JsZW0gdGhhdCB0aGUgY2xpcGJvYXJkIGNhbm5vdAorICAgICAqIGJlIG9wZW5lZCBldmVuIHRob3VnaCBpdCBpcyBkZW1vbnN0cmFibHkgbm90IGluIHVzZSBieSBhbnkgb3RoZXIKKyAgICAgKiBwcm9jZXNzLiAgSW4gYWxsIGNhc2VzLCByZXBlYXRlZCBhdHRlbXB0cyB0byBvcGVuIHRoZSBjbGlwYm9hcmQKKyAgICAgKiBldmVudHVhbGx5IHN1Y2NlZWQsIGJ1dCB0aGUgaW5pdGlhbCBhdHRlbXB0IG9jY2FzaW9uYWxseSBmYWlscy4KKyAgICAgKgorICAgICAqIFRoZSBwcm9ibGVtIGlzIGludGVybWl0dGVudCBhbmQgYXBwZWFycyB0byBiZSByZWxhdGVkIHRvIERPUyBiZWluZworICAgICAqICJidXN5IiBhdCBjZXJ0YWluIHVucHJlZGljdGFibGUgdGltZXMuICBET1MgbWFpbnRhaW5zIHR3byBpbnRlcm5hbAorICAgICAqIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBpdCdzIGJ1c3k6IEluRE9TIGFuZCBDcml0RXJyLiAgVGhlCisgICAgICogbG9jYXRpb24gb2YgSW5ET1MgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgaW50IDB4MjEsIEFIID0gMHgzNC4gIFRoZQorICAgICAqIGxvY2F0aW9uIG9mIENyaXRFcnIgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgaW50IDB4MjEsIEFYID0gMHg1ZDA2LgorICAgICAqIElmIGVpdGhlciBvZiB0aGVzZSBmbGFncyBpcyBzZXQsIERPUyBpcyAiYnVzeSIgYW5kIGNhbm5vdCBiZQorICAgICAqIGludGVycnVwdGVkLiAgU2VlICJVbmRvY3VtZW50ZWQgRE9TIiBieSBTY2h1bG1hbiBldCBhbCBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEhvd2V2ZXIgaGVyZSBJIHRha2UgdGhlIGVhc2llciBhcHByb2FjaCB0aGF0IGlmIHRoZSBmaXJzdCBjYWxsIHRvIG9wZW4KKyAgICAgKiB0aGUgY2xpcGJvYXJkIGRvZXMgbm90IHN1Y2NlZWQsIGp1c3QgdHJ5IGFnYWluLiAgSW4gZmFjdCwgdHJ5IG9uY2UgcGVyCisgICAgICogYmlvc3RpbWUoKSBjbG9jayB0aWNrLCB1cCB0byAxOCB0aW1lcyAoYWJvdXQgb25lIHNlY29uZCkuCisgICAgICovCisKKyAgICB0aWNrX2NvdW50ID0gMDsKKworICAgIGRwbWlfcmVncy54LmF4ID0gMHgxNzAxOwkvKiBvcGVuIFdpbmRvd3MgY2xpcGJvYXJkICovCisgICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCisgICAgeworCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLworCXJldHVybiBGQUxTRTsJCS8qIEZBTFNFIC0tPiBjbGlwYm9hcmQgbm90IG9wZW4gKi8KKyAgICB9CisKKyAgICAvKiB3YWl0IHVwIHRvIG9uZSBzZWNvbmQgKi8KKyAgICB3aGlsZSAoZHBtaV9yZWdzLnguYXggPT0gMCAmJiB0aWNrX2NvdW50KysgPCAxOCkKKyAgICB7CisJLyogV2FpdCBvbmUgY2xvY2sgdGljayAoMTguMiB0aWNrcy9zZWMgPSA1NSBtc2VjIHBlciB0aWNrKS4KKwkgKgorCSAqIFdlIGJ1c3ktd2FpdCBoZXJlLiAgVW5mb3J0dW5hdGVseSwgZGVsYXkoKSBhbmQgdXNsZWVwKCkgaGF2ZSBiZWVuCisJICogcmVwb3J0ZWQgdG8gZ2l2ZSBwcm9ibGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBXaW5kb3dzIDk1LiAgVGhpcyBpcworCSAqIGZpeGVkIGluIHNlcnZpY2UgcGFjayAxLCBidXQgbm90IGV2ZXJ5Ym9keSBpbnN0YWxsZWQgdGhhdC4KKwkgKi8KKwlzdGFydF90aW1lID0gYmlvc3RpbWUoMCwgMEwpOworCXdoaWxlIChiaW9zdGltZSgwLCAwTCkgPT0gc3RhcnRfdGltZSkKKwkgICAgOworCisJZHBtaV9yZWdzLnguYXggPSAweDE3MDE7ICAgIC8qIG9wZW4gV2luZG93cyBjbGlwYm9hcmQgKi8KKwlpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKKwl7CisJICAgIC8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLworCSAgICByZXR1cm4gRkFMU0U7CQkvKiBGQUxTRSAtLT4gY2xpcGJvYXJkIG5vdCBvcGVuICovCisJfQorICAgIH0KKworICAgIC8qIENvdWxkbid0IG9wZW4gdGhlIGNsaXBib2FyZCwgZXZlbiBhZnRlciAxOCBhdHRlbXB0cz8gKi8KKworICAgIGlmICh0aWNrX2NvdW50ID49IDE4ICYmIGRwbWlfcmVncy54LmF4ID09IDApCisJcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBub3Qgb3BlbiAqLworCisgICAgcmV0dXJuIFRSVUU7CS8qIFRSVUUgLS0+IGNsaXBib2FyZCBvcGVuZWQgc3VjY2Vzc2Z1bGx5LCBPSyAqLworfQorCisvKgorICogV2luMTZDbG9zZUNsaXBib2FyZDogY2xvc2UgdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgUmV0dXJuIFRSVUUgb24KKyAqIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUuICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHdheXMgYmUgY2FsbGVkLAorICogd2hldGhlciB0aGUgY2xpcGJvYXJkIGlzIG9wZW4gb3Igbm90LgorICovCisgICAgc3RhdGljIGludAorV2luMTZDbG9zZUNsaXBib2FyZCh2b2lkKQoreworICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7CisKKyAgICAvKiBDbG9zZSB0aGUgY2xpcGJvYXJkLiAgVGhpcyBpbnRlcnJ1cHQgY2FuIGFsd2F5cyBiZSBjYWxsZWQsIGV2ZW4KKyAgICAgKiBpZiB0aGUgY2xpcGJvYXJkIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAqLworCisgICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDg7CSAgICAvKiBjbG9zZSB0aGUgY2xpcGJvYXJkICovCisgICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCisgICAgeworCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLworCXJldHVybiBGQUxTRTsJCS8qIEZBTFNFIC0tPiBjbGlwYm9hcmQgY291bGQgbm90IGJlIGNsb3NlZCAqLworICAgIH0KKworICAgIHJldHVybiBUUlVFOwkvKiBUUlVFIC0tPiBjbGlwYm9hcmQgY2xvc2VkIHN1Y2Nlc3NmdWxseSwgT0sgKi8KK30KKworLyoKKyAqIFdpbjE2RW1wdHlDbGlwYm9hcmQ6IGVtcHR5IHRoZSAocHJldmlvdXNseSBvcGVuZWQpIFdpbmRvd3MgY2xpcGJvYXJkLgorICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK1dpbjE2RW1wdHlDbGlwYm9hcmQodm9pZCkKK3sKKyAgICBfX2RwbWlfcmVncyAgZHBtaV9yZWdzOworCisgICAgLyogaW50IDAyeGYsIEFYID0gMHgxNzAyIGF0dGVtcHRzIHRvIGVtcHR5IHRoZSBXaW5kb3dzIGNsaXBib2FyZC4gIFVwb24KKyAgICAgKiByZXR1cm4gZnJvbSB0aGUgaW50ZXJydXB0LCBpZiBBWCA9PSAwLCB0aGUgY2xpcGJvYXJkIGNvdWxkIG5vdCBiZQorICAgICAqIGVtcHRpZWQgKGZvciBzb21lIHJlYXNvbikuCisgICAgICovCisgICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDI7ICAgIC8qICBlbXB0eSB0aGUgV2luZG93cyBjbGlwYm9hcmQgKi8KKyAgICBpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKKyAgICB7CisJLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCisJcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBjb3VsZCBub3QgYmUgZW1wdGllZCAqLworICAgIH0KKworICAgIC8qIERpZCB3ZSBzdWNjZWVkIGluIGNsZWFyaW5nIHRoZSBjbGlwYm9hcmQ/ICovCisgICAgaWYgKGRwbWlfcmVncy54LmF4ID09IDApCisJcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBjb3VsZCBub3QgYmUgZW1wdGllZCAqLworCisgICAgcmV0dXJuIFRSVUU7CQkvKiBUUlVFIC0tPiBjbGlwYm9hcmQgd2FzIGVtcHRpZWQsIE9LICovCit9CisKKy8qCisgKiBGcmVlRE9TTWVtb3J5OiBhIGhlbHBlciBmdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBwcmV2aW91c2x5CisgKiBhbGxvY2F0ZWQgYnkgYSBjYWxsIHRvIF9fZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorRnJlZURPU01lbW9yeShpbnQgcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpCit7CisgICAgLyogRnJlZSB0aGUgRE9TIGJ1ZmZlciBhbmQgcmVsZWFzZSB0aGUgRFBNSSBwcm90LW1vZGUgc2VsZWN0b3IuCisgICAgICoKKyAgICAgKiBJdCdzIGltcG9ydGFudCB0aGF0IERPUyBtZW1vcnkgYmUgcHJvcGVybHkgcmVsZWFzZWQgYmVjYXVzZQorICAgICAqIHRoZXJlJ3Mgb25seSBhIGxpbWl0ZWQgYW1vdW50IG9mIGl0LiAgVGhlcmVmb3JlLCBpZiB0aGUgY2FsbAorICAgICAqIHRvIF9fZHBtaV9mcmVlX2Rvc19tZW1vcnkoKSBmYWlscywgZW1pdCBhbiBlcnJvciBtZXNzYWdlCisgICAgICogdW5jb25kaXRpb25hbGx5LgorICAgICAqLworICAgIGlmIChfX2RwbWlfZnJlZV9kb3NfbWVtb3J5KHByb3RlY3RlZF9tb2RlX3NlbGVjdG9yKSA9PSAtMSkKKwlFTVNHKCJFNDUxOiBjb3VsZCBub3QgZnJlZSBET1MgbWVtb3J5IGJ1ZmZlciAoREpHUFApIik7Cit9CisKKy8qCisgKiBXaW4xNkdldENsaXBib2FyZERhdGE6IHF1ZXJ5IHRoZSBXaW5kb3dzIGNsaXBib2FyZCBhcyB0byB3aGV0aGVyIGRhdGEKKyAqIGlzIGF2YWlsYWJsZSBpbiBhIHBhcnRpY3VsYXIgY2xpcGJvYXJkIGZvcm1hdC4gIElmIGRhdGEgaXMKKyAqIGF2YWlsYWJsZSwgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGl0IGFuZCByZWFkIHRoZSBkYXRhIGZyb20gdGhlCisgKiBjbGlwYm9hcmQgaW50byB0aGUgYnVmZmVyLiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiAgSWYKKyAqIG5vIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LCByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIG1lbW9yeSB0byBob2xkIHRoZSByZXRyaWV2ZWQgY2xpcGJvYXJkCisgKiBkYXRhLiAgSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGlzIG1lbW9yeQorICogb25jZSBpdCdzIGZpbmlzaGVkIHVzaW5nIGl0LiAgVGhlIG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgYnkKKyAqIGNhbGxpbmcgdmltX2ZyZWUoKS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorV2luMTZHZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0KQoreworICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7CisKKyAgICBpbnQJCXJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3M7CisgICAgaW50CQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvcjsKKworICAgIGNoYXJfdQkqY2xpcF9kYXRhX2J1ZmZlcjsKKyAgICBsb25nX3UJY2xpcF9kYXRhX3NpemU7CisKKyAgICAvKiBXZSBvbmx5IGhhbmRsZSBjbGlwYm9hcmQgZm9ybWF0cyB3ZSByZWNvZ25pemUsIG90aGVycyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIGN1c3RvbSBjbGlwYm9hcmQgZm9ybWF0IGZvciBWaW1DbGlwYm9hcmQKKyAgICAgKiBkYXRhIHVuZGVyIERPUywgc28gb25lIG9mIHRoZSBwcmVkZWZpbmVkIFdpbmRvd3MgZm9ybWF0cyBoYWQgdG8gYmUKKyAgICAgKiB1c2VkIGZvciBDRl9WSU1DTElQLiAgVHdvIG9ic2N1cmUgZm9ybWF0cywgcG9wdWxhciB3aGVuIFdpbmRvd3MgMy4wCisgICAgICogY2FtZSBvdXQgYnV0IG5vIGxvbmdlciBpbiBtdWNoIHVzZSB0b2RheSwgYXJlIHRoZSBESUYgYW5kIFNZTEsgZm9ybWF0cy4KKyAgICAgKiBESUYgaXMgdGhlIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0LCBTWUxLIGlzIHRoZSBTeW1ib2xpYyBMaW5rIGZvcm1hdC4KKyAgICAgKiBUaGV5IGFyZSBib3RoIHRleHQgZm9ybWF0cyBhbmQgZWl0aGVyIG9uZSBjYW4gYmUgaGlqYWNrZWQgZm9yIHVzZSBhcworICAgICAqICJ0aGUgVmltQ2xpcGJvYXJkIGZvcm1hdCIuICBPZiBjb3Vyc2UsIHRoaXMgY29uZmxpY3RzIHdpdGggYW55b25lIHdobworICAgICAqIHN0aWxsICppcyogdXNpbmcgRElGIG9yIFNZTEsgZGF0YSBmb3JtYXRzLCBidXQgdGhhdCB3aWxsIGJlIHZlcnkgZmV3CisgICAgICogcGVvcGxlLgorICAgICAqCisgICAgICogSSAoZGspIGNob3NlIFNZTEsgYXMgdGhlIG1vcmUgb2JzY3VyZSBmb3JtYXQgYmVjYXVzZSBpdCB3YXMgdXNlZAorICAgICAqIG1vc3RseSBmb3IgTWljcm9zb2Z0IE11bHRpcGxhbiAodGhlIHByZS1jdXJzb3IgdG8gRXhjZWwpIGFuZCBpdCdzIG5vdAorICAgICAqIGxpa2VseSBNdWx0aXBsYW4gaXMgdXNlZCBhbnl3aGVyZSBtdWNoIGFueW1vcmUuICBNaW5kIHlvdSwgRXhjZWwgY2FuCisgICAgICogc3RpbGwgZXhwb3J0IHRvIGJvdGggRElGIGFuZCBTWUxLIGZvcm1hdHMuCisgICAgICovCisKKyAgICBzd2l0Y2ggKGNsaXBfZGF0YV9mb3JtYXQpCisgICAgeworICAgIGNhc2UgQ0ZfVklNQ0xJUDoJCSAgICAvKiBWaW0ncyBvd24gc3BlY2lhbCBjbGlwYm9hcmQgZm9ybWF0ICovCisgICAgY2FzZSBDRl9URVhUOgkJICAgIC8qIFdpbmRvd3MgdGV4dCAqLworICAgIGNhc2UgQ0ZfT0VNVEVYVDoJCSAgICAvKiBET1MgKE9FTSkgdGV4dCAqLworCisJLyogaW50IDAyeGYsIEFYID0gMHgxNzA0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGN1cnJlbnRseQorCSAqIG9uIHRoZSBXaW5kb3dzIGNsaXBib2FyZCwgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LiAgVXBvbiByZXR1cm4KKwkgKiBmcm9tIHRoZSBpbnRlcnJ1cHQsIERYOkFYID0gdGhlIG51bWJlciBvZiBieXRlcywgcm91bmRlZCB1cCB0byB0aGUKKwkgKiBuZWFyZXN0IG11bHRpcGxlIG9mIDMyLgorCSAqLworCisJZHBtaV9yZWdzLnguYXggPSAweDE3MDQ7ICAgIC8qIGdldCBzaXplIG9mIGNsaXBiZCBkYXRhICovCisJZHBtaV9yZWdzLnguZHggPSBjbGlwX2RhdGFfZm9ybWF0OworCWlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQorCXsKKwkgICAgLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCisJICAgIHJldHVybiBOVUxMOwkJCQkgICAgLyogZWFybHkgZXhpdCAqLworCX0KKworCS8qIERpZCB3ZSBnZXQgYW55dGhpbmc/ICBJZiBub3QsIHRoaXMgaXMgbm90IGFuIGVycm9yLiAqLworCWlmIChkcG1pX3JlZ3MueC5keCA9PSAwICYmIGRwbWlfcmVncy54LmF4ID09IDApCisJeworCSAgICAvKiBubyBDRl9WSU1DTElQIGRhdGE/ICovCisJICAgIHJldHVybiBOVUxMOwkJCQkgICAgLyogZWFybHkgZXhpdCAqLworCX0KKworCS8qIFRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0ZWQgY2xpcGJvYXJkIGZvcm1hdC4KKwkgKgorCSAqIENhbGN1bGF0ZSBkYXRhIHNpemUuICBSZW1lbWJlciB0aGlzIGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QKKwkgKiBtdWx0aXBsZSBvZiAzMiwgc28gY2xpcF9kYXRhX3NpemUgaXMgYWN0dWFsbHkgYW4gdXBwZXIgbGltaXQuCisJICogVGhlIGV4dHJhIGJ5dGVzLCBpZiBhbnksIGFyZSBzZXQgdG8gbnVsbCAoMHgwMCkgd2hlbiB0aGUgZGF0YSBpcworCSAqIHJlYWQgZnJvbSB0aGUgY2xpcGJvYXJkLiAgKExhdGVyOikgYWN0dWFsbHkgSSdtIG5vIGxvbmdlciBzdXJlCisJICogdGhpcyBpcyBzdHJpY3RseSB0cnVlOiB0aGUgZW5kLW9mLWRhdGEgaXMgbWFya2VkIGJ5IGEgbnVsbCwgYnV0CisJICogdGhlIGV4dHJhIGJ5dGVzIGFwcGVhciB0byBzb21ldGltZXMgYmUgbnVsbCwgc29tZXRpbWVzIG5vdC4KKwkgKiBUaGV5IG1heSBqdXN0IGJlIGdhcmJhZ2UuCisJICovCisJY2xpcF9kYXRhX3NpemUgPSBkcG1pX3JlZ3MueC5heCArIChkcG1pX3JlZ3MueC5keCA8PCAxNik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gcmV0cmlldmUgdGhlIGRhdGEuICBUaGUgYnVmZmVyIGhhcyB0byBsaWUgaW4gdGhlCisJICogRE9TIG1lbW9yeSByZWdpb24gKGluIHRoZSBmaXJzdCAxIE1CeXRlIG9mIGFkZHJlc3Mgc3BhY2UpIGJlY2F1c2UKKwkgKiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaW50ZXJmYWNlIGV4cGVjdHMgYSAxNi1iaXQgc2VnbWVudDpvZmZzZXQKKwkgKiBwb2ludGVyIHRvIGEgYnVmZmVyIGFkZHJlc3Mgd2l0aGluIHRoZSBET1MgcmVnaW9uLiAgTXVzdCB0aGVyZWZvcmUKKwkgKiB1c2UgX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoKSBpbnN0ZWFkIG9mIGxhbGxvYygpIG9yIGFsbG9jKCkuCisJICovCisJcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9IF9fZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KAorCQkoY2xpcF9kYXRhX3NpemUgKyAxNSkgPj4gNCwJLyogYnVmZmVyIHNpemUsIGluIDE2LWJ5dGUgcGFyYWdyYXBocyAqLworCQkmcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBwcm90LW1vZGUgc2VsZWN0b3IgZm9yIHRoZSBhZGRyZXNzICovCisKKwlpZiAocmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9PSAtMSkKKwl7CisJICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKworCSAgICAvKiBUZWNobmljYWxseSB3ZSBkb24ndCBrbm93IHdoeSB0aGUgYWxsb2NhdGlvbiBmYWlsZWQsIGJ1dAorCSAgICAgKiBhbG1vc3QgYWx3YXlzIGl0IHdpbGwgYmUgYmVjYXVzZSB0aGVyZSB3YXNuJ3QgZW5vdWdoIERPUworCSAgICAgKiBtZW1vcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdCwgc28gcmVwb3J0IHRoYXQgYXMgdGhlIHByb2JsZW0uCisJICAgICAqIE9uIG15IHN5c3RlbSwgREpHUFAgaXMgYWJsZSB0byBzYXRpc2Z5IGEgRE9TIGFsbG9jYXRpb24gcmVxdWVzdAorCSAgICAgKiB1cCB0byBhYm91dCA2MDBLIGluIHNpemUuICBUaGlzIGRlcGVuZHMgb24geW91ciBISU1FTS5TWVMgYW5kCisJICAgICAqIEVNTTM4Ni5FWEUgc2V0dGluZ3MgaG93ZXZlci4KKwkgICAgICovCisJICAgIEVNU0coIkU0NTI6IENsaXBib2FyZCBkYXRhIHRvbyBsYXJnZSwgY2Fubm90IGFsbG9jYXRlIERPUyBidWZmZXIiKTsKKwkgICAgcmV0dXJuIE5VTEw7CQkJCSAgICAvKiBlYXJseSBleGl0ICovCisJfQorCisJLyogQ29weSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCBpbnRvIHRoZSBidWZmZXIuICBFeHBlcmltZW50cyBzaG93IHRoYXQKKwkgKiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaXMgc21hcnQgZW5vdWdoIHRvIGhhbmRsZSBkYXRhIHRyYW5zZmVycworCSAqIGxhcmdlciB0aGFuIDY0SyBwcm9wZXJseSwgZXZlbiB0aG91Z2ggdGhlIGJ1ZmZlciBhZGRyZXNzIGlzIGEgMTYtYml0CisJICogc2VnbWVudDpvZmZzZXQgKHdoaWNoIHdvdWxkIG5vcm1hbGx5IGxpbWl0IHRoZSBibG9jayBzaXplIHRvIDY0SworCSAqIHVubGVzcyBFUyBnZXRzIGluY3JlbWVudGVkKS4KKwkgKi8KKwlkcG1pX3JlZ3MueC5heCA9IDB4MTcwNTsJLyogZ2V0IGNsaXBib2FyZCBkYXRhICovCisJZHBtaV9yZWdzLnguZHggPSBjbGlwX2RhdGFfZm9ybWF0OwkJLyogQ0ZfVklNQ0xJUCAqLworCWRwbWlfcmVncy54LmVzID0gcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzczsJLyogYnVmZmVyIGFkOiBzZWdtZW50ICovCisJZHBtaV9yZWdzLnguYnggPSAwOwkJCQkvKiBidWZmZXIgYWQ6IG9mZnNldCAqLworCWlmIChfX2RwbWlfaW50KCAweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKKwl7CisJICAgIC8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLworCSAgICBFTVNHKCJFNDUzOiBjb3VsZCBub3QgY29weSBjbGlwYm9hcmQgZGF0YSB0byBET1MgYnVmZmVyIik7CisJICAgIEZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBjbGVhbiB1cCBET1MgbWVtICovCisJICAgIHJldHVybiBOVUxMOwkJCQkvKiBlYXJseSBleGl0ICovCisJfQorCisJLyogQ2xpcGJvYXJkIGRhdGEgaXMgbm93IGluIERPUyBtZW1vcnkgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisJICogRVM6QlguICBDb3B5IHRoaXMgaW50byBvcmRpbmFyeSBtZW1vcnkgdGhhdCBWaW0gY2FuIGFjY2VzcyAoaWUuCisJICogcHJvdC1tb2RlIG1lbW9yeSkuICBBbGxvY2F0ZSBvbmUgZXh0cmEgYnl0ZSB0byBlbnN1cmUgdGhlIHRleHQKKwkgKiBpcyB0ZXJtaW5hdGVkIHByb3Blcmx5IChpbiBjYXNlIGl0IHdhcyBzb21laG93IGNvcnJ1cHRlZCkuCisJICovCisJY2xpcF9kYXRhX2J1ZmZlciA9IChjaGFyX3UgKilsYWxsb2MoY2xpcF9kYXRhX3NpemUgKyAxLCBUUlVFKTsKKworCWlmIChjbGlwX2RhdGFfYnVmZmVyID09IE5VTEwpCisJeworCSAgICAvKiBhbGxvY2F0aW9uIGZhaWxlZD8gKi8KKwkgICAgRU1TRygiRTQ1NDogY291bGQgbm90IGFsbG9jYXRlIGNsaXBib2FyZCBtZW1vcnkgYnVmZmVyIik7CisJICAgIEZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBjbGVhbiB1cCBET1MgbWVtICovCisJICAgIHJldHVybiBOVUxMOwkJCQkvKiBlYXJseSBleGl0ICovCisJfQorCisJKihjbGlwX2RhdGFfYnVmZmVyICsgY2xpcF9kYXRhX3NpemUpID0gJ1wwJzsJLyogZW5zdXJlIHRlcm1pbmF0ZWQgKi8KKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBET1MgbWVtb3J5IHRvIFZpbS1hY2Nlc3NpYmxlIG1lbW9yeS4gKi8KKwltb3ZlZGF0YSgJCQkJLyogREpHUFAgdmVyc2lvbiBvZiBtZW1jcHkoKSAqLworCQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvciwgMCwgLyogc291cmNlOiBET1MgYWQgKHZpYSBzZWxlY3RvcikgKi8KKwkJX215X2RzKCksICh1bnNpZ25lZCljbGlwX2RhdGFfYnVmZmVyLAorCQkJCQkJLyogdGFyZ2V0OiBub3JtYWwgbWVtIGFkZHJlc3MgKi8KKwkJY2xpcF9kYXRhX3NpemUpOwkJLyogaG93IG1hbnkgYnl0ZXMgKi8KKworCS8qIEZyZWUgdGhlIERPUyBidWZmZXIgYW5kIHJlbGVhc2UgdGhlIERQTUkgcHJvdC1tb2RlIHNlbGVjdG9yLiAqLworCUZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkgLyogY2xlYW4gdXAgRE9TIG1lbW9yeSAqLworCisJcmV0dXJuIGNsaXBfZGF0YV9idWZmZXI7ICAgIC8qIHJldHVybiBwb2ludGVyIHRvIGFsbG9jYXRlZCBidWZmZXIgKi8KKworICAgIGRlZmF1bHQ6CQkvKiB1bmtub3duIGNsaXBib2FyZCBmb3JtYXQgKi8KKwlyZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKy8qCisgKiBXaW4xNlNldENsaXBib2FyZERhdGE6IHNlbmQgJ2NsaXBfZGF0YV9zaXplJyBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGJ1ZmZlcgorICogcG9pbnRlZCB0byBieSAnY2xpcF9kYXRhJywgdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgVGhlIGRhdGEgaXMKKyAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2xpcGJvYXJkIGFzIGJlaW5nIGluIHRoZSAnY2xpcF9kYXRhX2Zvcm1hdCcKKyAqIGZvcm1hdC4KKyAqLworICAgIHN0YXRpYyBpbnQKK1dpbjE2U2V0Q2xpcGJvYXJkRGF0YSgKKwlpbnQJY2xpcF9kYXRhX2Zvcm1hdCwKKwljaGFyX3UJKmNsaXBfZGF0YSwKKwlpbnQJY2xpcF9kYXRhX3NpemUsCisJaW50CWNsaXBfZGF0YV90eXBlKQoreworICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7CisKKyAgICBpbnQJCXJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3M7CisgICAgaW50CQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvcjsKKyAgICBsb25nX3UJcHJvdGVjdGVkX21vZGVfb2Zmc2V0ID0gMEw7CisgICAgaW50CQl0b3RhbF9zaXplID0gY2xpcF9kYXRhX3NpemU7CisKKyAgICBjaGFyX3UJKmNsaXBfc2VsX3R5cGU7CisKKyAgICAvKiBJZiB3ZSdyZSB1c2luZyB0aGUgQ0ZfVklNQ0xJUCBjdXN0b20gZm9ybWF0LCBhbGxvY2F0ZSBhbiBleHRyYQorICAgICAqIGJ5dGUgZm9yIGNsaXBfc2VsX3R5cGUsIHdoaWNoIGlzIGEgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIHR5cGUKKyAgICAgKiBvZiB0ZXh0IHNlbGVjdGlvbjogTUxJTkUsIE1DSEFSLCBvciBNQkxPQ0suCisgICAgICovCisgICAgaWYgKGNsaXBfZGF0YV9mb3JtYXQgPT0gQ0ZfVklNQ0xJUCkKKwl0b3RhbF9zaXplKys7CQkJLyogZXh0cmEgYnl0ZSBmb3IgbWFya2VyICovCisKKyAgICAvKiBEYXRhIGNhbm5vdCBiZSBzZW50IGRpcmVjdGx5IGZyb20gYSBWaW0gc3RyaW5nIChwQ2xpcERhdGEpIHRvCisgICAgICogdGhlIFdpbmRvd3MgY2xpcGJvYXJkLCBiZWNhdXNlIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBpbnRlcmZhY2UKKyAgICAgKiBleHBlY3RzIGEgMTYtYml0IChET1MpIHNlZ21lbnQ6b2Zmc2V0IGFkZHJlc3MgZm9yIHRoZSBzb3VyY2UKKyAgICAgKiBidWZmZXIuICBUaGVyZWZvcmUgd2UgbXVzdCBjcmVhdGUgYSAidHJhbnNmZXIgYnVmZmVyIiBpbiB0aGUgRE9TCisgICAgICogbWVtb3J5IHJlZ2lvbiAoaW4gdGhlIGZpcnN0IDEgTUJ5dGUgb2YgYWRkcmVzcyBzcGFjZSkgYW5kIGNvcHkKKyAgICAgKiB0aGUgVmltIHN0cmluZyBpbnRvIHRoYXQuICBGcm9tIHRoZXJlLCB0aGUgZGF0YSBjYW4gdGhlbiBiZSBzZW50CisgICAgICogdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLgorICAgICAqCisgICAgICogVG8gYWxsb2NhdGUgRE9TIG1lbW9yeSwgd2UgbXVzdCB1c2UgX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoKQorICAgICAqIGluc3RlYWQgb2YgbGFsbG9jKCkgb3IgYWxsb2MoKS4gIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLCBpdCB3aWxsCisgICAgICogYWxtb3N0IGludmFyaWFibHkgYmUgYmVjYXVzZSB0aGVyZSBpcyBub3QgZW5vdWdoIERPUyBtZW1vcnkKKyAgICAgKiBhdmFpbGFibGUgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgY2xpcF9kYXRhLiAgVGhlcmUgaXMgbm90aGluZworICAgICAqIHdlIGNhbiBkbyBhYm91dCB0aGlzLCB3ZSBzaW1wbHkgaGF2ZSB0byBmYWlsLgorICAgICAqLworICAgIHJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3MgPSBfX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgKKwkgICAgKHRvdGFsX3NpemUgKyAxNSkgPj4gNCwJLyogYnVmZmVyIHNpemUsIGluIDE2LWJ5dGUgcGFyYWdyYXBocyAqLworCSAgICAmcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBwcm90LW1vZGUgc2VsZWN0b3IgZm9yIHRoZSBhZGRyZXNzICovCisKKyAgICBpZiAocmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9PSAtMSkKKyAgICB7CisJLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLworCS8qIFRlY2huaWNhbGx5IHdlIGRvbid0IGtub3cgd2h5IHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgYnV0CisJICogYWxtb3N0IGFsd2F5cyBpdCB3aWxsIGJlIGJlY2F1c2UgdGhlcmUgd2Fzbid0IGVub3VnaCBET1MKKwkgKiBtZW1vcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gIE9uIG15IHN5c3RlbSwgREpHUFAgaXMgYWJsZQorCSAqIHRvIHNhdGlzZnkgYSBET1MgYWxsb2NhdGlvbiByZXF1ZXN0IHVwIHRvIGFib3V0IDYwMEsgaW4gc2l6ZS4KKwkgKiBUaGlzIGRlcGVuZHMgaG93ZXZlciBvbiBISU1FTS5TWVMgYW5kIEVNTTM4Ni5FWEUgc2V0dGluZ3MuCisJICovCisJcmV0dXJuIEZBTFNFOwkJCQkvKiBlYXJseSBleGl0ICovCisgICAgfQorCisgICAgLyogQ29weSBkYXRhIGZyb20gVmltJ3MgYnVmZmVyIChjbGlwX2RhdGEpIGludG8gdGhlIERPUyB0cmFuc2ZlciBidWZmZXIuCisgICAgICogVGhpcyBjYW4gYmUgbGFyZ2VyIHRoYW4gNjRLOyBtb3ZlZGF0YSgpIHRha2VzIGNhcmUgb2YgY3Jvc3NpbmcgYW55CisgICAgICogMTYtYml0IHNlZ21lbnQgYm91bmRhcmllcy4KKyAgICAgKgorICAgICAqIElmIHdlJ3JlIHVzaW5nIFZpbSdzIGN1c3RvbSBjbGlwYm9hcmQgZm9ybWF0LCB3ZSBtdXN0IGNvcHkgb25lIGV4dHJhCisgICAgICogYnl0ZSB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBzZWxlY3Rpb246IGxpbmUsIGNoYXJhY3Rlciwgb3IgYmxvY2suCisgICAgICovCisgICAgaWYgKGNsaXBfZGF0YV9mb3JtYXQgPT0gQ0ZfVklNQ0xJUCkKKyAgICB7CisJc3dpdGNoIChjbGlwX2RhdGFfdHlwZSkKKwl7CisJICAgIGRlZmF1bHQ6CisJICAgIGNhc2UgTUxJTkU6CSAgICBjbGlwX3NlbF90eXBlID0gIkwiOwlicmVhazsKKwkgICAgY2FzZSBNQ0hBUjoJICAgIGNsaXBfc2VsX3R5cGUgPSAiQyI7CWJyZWFrOworI2lmZGVmIEZFQVRfVklTVUFMCisJICAgIGNhc2UgTUJMT0NLOiAgICBjbGlwX3NlbF90eXBlID0gIkIiOwlicmVhazsKKyNlbmRpZgorCX0KKworCW1vdmVkYXRhKAorCQlfbXlfZHMoKSwgKHVuc2lnbmVkKWNsaXBfc2VsX3R5cGUsCisJCQkJCSAgICAvKiBzb3VyY2U6IG5vcm1hbCBtZW1vcnkgYWRkcmVzcyAqLworCQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvciwgMCwgLyogdGFyZ2V0OiBET1MgYWQgKHZpYSBzZWxlY3RvcikgKi8KKwkJMSk7CQkJICAgIC8qIGhvdyBtYW55IGJ5dGVzIHRvIGNvcHkgKi8KKworCXByb3RlY3RlZF9tb2RlX29mZnNldCArPSBTVFJMRU4oY2xpcF9zZWxfdHlwZSk7CS8qIGFsbG93IGZvciBtYXJrZXIgKi8KKyAgICB9CisKKyAgICBtb3ZlZGF0YSgKKwlfbXlfZHMoKSwgKHVuc2lnbmVkKWNsaXBfZGF0YSwJLyogc291cmNlOiBub3JtYWwgbWVtb3J5IGFkZHJlc3MgKi8KKwlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvciwJLyogdGFyZ2V0OiBET1MgYWRkcmVzcyAodmlhIHNlbGVjdG9yKSAqLworCXByb3RlY3RlZF9tb2RlX29mZnNldCwJCS8qIG5vbi16ZXJvLCBpZiB1c2luZyBjbGlwX3NlbF90eXBlICovCisJY2xpcF9kYXRhX3NpemUpOwkJLyogaG93IG1hbnkgYnl0ZXMgdG8gY29weSAqLworCisgICAgLyogU2VuZCBkYXRhIGZyb20gdGhlIERPUyB0cmFuc2ZlciBidWZmZXIgdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLgorICAgICAqIGludCAwMnhmLCBBWCA9IDB4MTcwMyBzZW5kcyBTSTpDWCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGJ1ZmZlcgorICAgICAqIGF0IEVTOkJYLCB0byB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIGRwbWlfcmVncy54LmF4ID0gMHgxNzAzOwkJCS8qIHNlbmQgY2xpcGJvYXJkIGRhdGEgKi8KKyAgICBkcG1pX3JlZ3MueC5keCA9IGNsaXBfZGF0YV9mb3JtYXQ7CQkvKiBmbGFnOiBmb3JtYXQgb2YgdGhlIGRhdGEgKi8KKyAgICBkcG1pX3JlZ3MueC5zaSA9ICgodG90YWxfc2l6ZSA+PiAxNikKKwkgICAgJiAweDAwMDBmZmZmTCk7CQkJLyogaGkgd29yZCBvZiBkYXRhIHNpemUgKi8KKyAgICBkcG1pX3JlZ3MueC5jeCA9ICh0b3RhbF9zaXplICYgMHgwMDAwZmZmZkwpOworCQkJCQkJLyogbG8gd29yZCBvZiBkYXRhIHNpemUgKi8KKyAgICBkcG1pX3JlZ3MueC5lcyA9IHJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3M7CS8qIGJ1ZmZlciBhZGRyZXNzOiBzZWdtZW50ICovCisgICAgZHBtaV9yZWdzLnguYnggPSAwOwkJCQkvKiBidWZmZXIgYWRkcmVzczogb2Zmc2V0ICovCisgICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCisgICAgeworCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkLiAqLworCUZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOyAgIC8qIGNsZWFuIHVwIERPUyBtZW1vcnkgKi8KKwlyZXR1cm4gRkFMU0U7CQkJCSAgLyogZWFybHkgZXhpdCAqLworICAgIH0KKworICAgIC8qIEZyZWUgdGhlIERPUyBidWZmZXIgYW5kIHJlbGVhc2UgdGhlIERQTUkgcHJvdC1tb2RlIHNlbGVjdG9yLiAqLworICAgIEZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkgIC8qIGNsZWFuIHVwIERPUyBtZW1vcnkgKi8KKworICAgIHJldHVybiBUUlVFOwkvKiBUUlVFIC0tPiBkYXRhIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGNsaXBib2FyZCAqLworfQorCisjZW5kaWYJLyogRkVBVF9DTElQQk9BUkQgKi8KKyNlbmRpZiAvKiBESkdQUCAqLworCisvKgorICogRW5kIG9mIE1TLURPUyBvbmx5IGNvZGUKKyAqLworI2VuZGlmIC8qIFdJTjE2ICovCisKKy8qIGNvbW1vbiBNUy1ET1MgYW5kIFdpbjE2IGNvZGUgZm9sbG93cyAqLworCisgICAgc3RhdGljIGludAordmltX2NobW9kKGNoYXJfdSAqbmFtZSkKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlmOworICAgIGludAkJYyA9IDA7CisKKyAgICAvKiBjaG1vZCgpIGNhbid0IGhhbmRsZSBhIGZpbGUgbmFtZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2gsIHJlbW92ZSBpdC4KKyAgICAgKiBCdXQgZG9uJ3QgcmVtb3ZlIGl0IGZvciAiLyIgb3IgImM6LyIuICovCisgICAgcCA9IG5hbWUgKyBTVFJMRU4obmFtZSk7CisgICAgaWYgKHAgPiBuYW1lKQorCS0tcDsKKyAgICBpZiAocCA+IG5hbWUgJiYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKSAmJiBwWy0xXSAhPSAnOicpCisgICAgeworCWMgPSAqcDsJCQkJLyogcmVtb3ZlIHRyYWlsaW5nIChiYWNrKXNsYXNoICovCisJKnAgPSBOVUw7CisgICAgfQorICAgIGVsc2UKKwlwID0gTlVMTDsKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+IDB4NDEwKQorICAgIC8qIHRoaXMgYWxzbyBzZXRzIHRoZSBhcmNoaXZlIGJpdCwgc3VwcG9ydGVkIGJ5IEJvcmxhbmQgQyA0LjAgYW5kIGxhdGVyLAorICAgICAqIHdoZXJlIF9fQk9STEFORENfXyBpcyAweDQ1MCAoMy4xIGlzIDB4NDEwKSAqLworICAgIGYgPSBfcnRsX2NobW9kKChjaGFyICopbmFtZSwgMCwgMCk7CisjZWxzZQorICAgIGYgPSBfY2htb2QoKGNoYXIgKiluYW1lLCAwLCAwKTsKKyNlbmRpZgorICAgIGlmIChwICE9IE5VTEwpCisJKnAgPSBjOwkJCQkvKiBwdXQgYmFjayAoYmFjaylzbGFzaCAqLworICAgIHJldHVybiBmOworfQorCisvKgorICogZ2V0IGZpbGUgcGVybWlzc2lvbnMgZm9yICduYW1lJworICogUmV0dXJucyAtMSBmb3IgZXJyb3IuCisgKiBSZXR1cm5zIEZBX2F0dHJpYnV0ZXMgZGVmaW5lZCBpbiBkb3MuaAorICovCisgICAgbG9uZworbWNoX2dldHBlcm0oY2hhcl91ICpuYW1lKQoreworICAgIHJldHVybiAobG9uZyl2aW1fY2htb2QobmFtZSk7CS8qIGdldCBmaWxlIG1vZGUgKi8KK30KKworLyoKKyAqIHNldCBmaWxlIHBlcm1pc3Npb24gZm9yICduYW1lJyB0byAncGVybScKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21jaF9zZXRwZXJtKAorICAgIGNoYXJfdQkqbmFtZSwKKyAgICBsb25nCXBlcm0pCit7CisgICAgcGVybSB8PSBGQV9BUkNIOwkgICAgLyogZmlsZSBoYXMgY2hhbmdlZCwgc2V0IGFyY2hpdmUgYml0ICovCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPiAweDQxMCkKKyAgICByZXR1cm4gKF9ydGxfY2htb2QoKGNoYXIgKiluYW1lLCAxLCAoaW50KXBlcm0pID09IC0xID8gRkFJTCA6IE9LKTsKKyNlbHNlCisgICAgcmV0dXJuIChfY2htb2QoKGNoYXIgKiluYW1lLCAxLCAoaW50KXBlcm0pID09IC0xID8gRkFJTCA6IE9LKTsKKyNlbmRpZgorfQorCisvKgorICogU2V0IGhpZGRlbiBmbGFnIGZvciAibmFtZSIuCisgKi8KKyAgICB2b2lkCittY2hfaGlkZShjaGFyX3UgKm5hbWUpCit7CisgICAgLyogRE9TIDYuMiBzaGFyZS5leGUgY2F1c2VzICJzZWVrIGVycm9yIG9uIGZpbGUgd3JpdGUiIGVycm9ycyB3aGVuIG1ha2luZworICAgICAqIHRoZSBzd2FwIGZpbGUgaGlkZGVuLiAgVGh1cyBkb24ndCBkbyBpdC4gKi8KK30KKworLyoKKyAqIHJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBhIGRpcmVjdG9yeQorICogcmV0dXJuIEZBTFNFIGlmICJuYW1lIiBpcyBub3QgYSBkaXJlY3RvcnkKKyAqIHJldHVybiBGQUxTRSBmb3IgZXJyb3IKKyAqCisgKiBiZXdhcmUgb2YgYSB0cmFpbGluZyAoYmFjaylzbGFzaAorICovCisgICAgaW50CittY2hfaXNkaXIoY2hhcl91ICpuYW1lKQoreworICAgIGludAkJZjsKKworICAgIGYgPSB2aW1fY2htb2QobmFtZSk7CisgICAgaWYgKGYgPT0gLTEpCisJcmV0dXJuIEZBTFNFOwkJICAgIC8qIGZpbGUgZG9lcyBub3QgZXhpc3QgYXQgYWxsICovCisgICAgaWYgKChmICYgRkFfRElSRUMpID09IDApCisJcmV0dXJuIEZBTFNFOwkJICAgIC8qIG5vdCBhIGRpcmVjdG9yeSAqLworICAgIHJldHVybiBUUlVFOworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIDEgaWYgIm5hbWUiIGNhbiBiZSBleGVjdXRlZCwgMCBpZiBub3QuCisgKiBSZXR1cm4gLTEgaWYgdW5rbm93bi4KKyAqLworICAgIGludAorbWNoX2Nhbl9leGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgcmV0dXJuIChzZWFyY2hwYXRoKG5hbWUpICE9IE5VTEwpOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB3aGF0ICJuYW1lIiBpczoKKyAqIE5PREVfTk9STUFMOiBmaWxlIG9yIGRpcmVjdG9yeSAob3IgZG9lc24ndCBleGlzdCkKKyAqIE5PREVfV1JJVEFCTEU6IHdyaXRhYmxlIGRldmljZSwgc29ja2V0LCBmaWZvLCBldGMuCisgKiBOT0RFX09USEVSOiBub24td3JpdGFibGUgdGhpbmdzCisgKi8KKyAgICBpbnQKK21jaF9ub2RldHlwZShjaGFyX3UgKm5hbWUpCit7CisgICAgaWYgKFNUUklDTVAobmFtZSwgIkFVWCIpID09IDAKKwkgICAgfHwgU1RSSUNNUChuYW1lLCAiQ09OIikgPT0gMAorCSAgICB8fCBTVFJJQ01QKG5hbWUsICJDTE9DSyQiKSA9PSAwCisJICAgIHx8IFNUUklDTVAobmFtZSwgIk5VTCIpID09IDAKKwkgICAgfHwgU1RSSUNNUChuYW1lLCAiUFJOIikgPT0gMAorCSAgICB8fCAoKFNUUk5JQ01QKG5hbWUsICJDT00iLCAzKSA9PSAwCisJCSAgICB8fCBTVFJOSUNNUChuYW1lLCAiTFBUIiwgMykgPT0gMCkKKwkJJiYgVklNX0lTRElHSVQobmFtZVszXSkKKwkJJiYgbmFtZVs0XSA9PSBOVUwpKQorCXJldHVybiBOT0RFX1dSSVRBQkxFOworICAgIC8qIFRPRE86IE5PREVfT1RIRVI/ICovCisgICAgcmV0dXJuIE5PREVfTk9STUFMOworfQorCisvKgorICogR2V0IG5hbWUgb2YgY3VycmVudCBkaXJlY3RvcnkgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLgorICogUmV0dXJuIE9LIGZvciBzdWNjZXNzLCBGQUlMIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CittY2hfZGlybmFtZSgKKyAgICBjaGFyX3UJKmJ1ZiwKKyAgICBpbnQJCWxlbikKK3sKKyNpZmRlZiBESkdQUAorICAgIGlmIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKyAgICAvKiB0dXJuIHRoZSAnLydzIHJldHVybmVkIGJ5IERKR1BQIGludG8gJ1wncyAqLworICAgIHNsYXNoX2FkanVzdChidWYpOworICAgIHJldHVybiBPSzsKKyNlbHNlCisgICAgcmV0dXJuIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgIT0gTlVMTCA/IE9LIDogRkFJTCk7CisjZW5kaWYKK30KKworLyoKKyAqIHRoaXMgdmVyc2lvbiBvZiByZW1vdmUgaXMgbm90IHNjYXJlZCBieSBhIHJlYWRvbmx5IChiYWNrdXApIGZpbGUKKyAqCisgKiByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZSAoanVzdCBsaWtlIHJlbW92ZSgpKQorICovCisgICAgaW50CittY2hfcmVtb3ZlKGNoYXJfdSAqbmFtZSkKK3sKKyAgICAodm9pZCltY2hfc2V0cGVybShuYW1lLCAwKTsgICAgLyogZGVmYXVsdCBwZXJtaXNzaW9ucyAqLworICAgIHJldHVybiB1bmxpbmsoKGNoYXIgKiluYW1lKTsKK30KKworLyoKKyAqIFNwZWNpYWwgdmVyc2lvbiBvZiBnZXRlbnYoKTogVXNlIHVwcGVyY2FzZSBuYW1lLgorICovCisgICAgY2hhcl91ICoKK21jaF9nZXRlbnYoY2hhcl91ICpuYW1lKQoreworICAgIGludAkJaTsKKyNkZWZpbmUgTUFYRU5WTEVOIDUwCisgICAgY2hhcl91CXZhcl9jb3B5W01BWEVOVkxFTiArIDFdOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnJlczsKKworICAgIC8qCisgICAgICogVGFrZSBhIGNvcHkgb2YgdGhlIGFyZ3VtZW50LCBhbmQgZm9yY2UgaXQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgcGFzc2luZworICAgICAqIHRvIGdldGVudigpLiAgT24gRE9TIHN5c3RlbXMsIGdldGVudigpIGRvZXNuJ3QgbGlrZSBsb3dlci1jYXNlIGFyZ3VtZW50CisgICAgICogKHVubGlrZSBXaW4zMiBldCBhbC4pICBJZiB0aGUgbmFtZSBpcyB0b28gbG9uZyB0byBmaXQgaW4gdmFyX2NvcHlbXQorICAgICAqIGFsbG9jYXRlIG1lbW9yeS4KKyAgICAgKi8KKyAgICBpZiAoKGkgPSBTVFJMRU4obmFtZSkpID4gTUFYRU5WTEVOKQorCXAgPSBhbGxvYyhpICsgMSk7CisgICAgZWxzZQorCXAgPSB2YXJfY29weTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXAgPSBuYW1lOyAgIC8qIG91dCBvZiBtZW1vcnksIGZhbGwgYmFjayB0byB1bm1vZGlmaWVkIG5hbWUgKi8KKyAgICBlbHNlCisgICAgeworCWZvciAoaSA9IDA7IG5hbWVbaV0gIT0gTlVMOyArK2kpCisJICAgIHBbaV0gPSB0b3VwcGVyKG5hbWVbaV0pOworCXBbaV0gPSBOVUw7CisgICAgfQorCisgICAgcmVzID0gKGNoYXJfdSAqKWdldGVudigoY2hhciAqKXApOworCisgICAgaWYgKHAgIT0gdmFyX2NvcHkgJiYgcCAhPSBuYW1lKQorCXZpbV9mcmVlKHApOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoKKyAqIEluc2VydCB1c2VyIG5hbWUgaW4gc1tsZW5dLgorICovCisgICAgaW50CittY2hfZ2V0X3VzZXJfbmFtZSgKKyAgICBjaGFyX3UJKnMsCisgICAgaW50CQlsZW4pCit7CisgICAgKnMgPSBOVUw7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBJbnNlcnQgaG9zdCBuYW1lIGlzIHNbbGVuXS4KKyAqLworICAgIHZvaWQKK21jaF9nZXRfaG9zdF9uYW1lKAorICAgIGNoYXJfdQkqcywKKyAgICBpbnQJCWxlbikKK3sKKyNpZmRlZiBESkdQUAorICAgIFNUUk5DUFkocywgIlBDICgzMiBiaXRzIFZpbSkiLCBsZW4pOworI2Vsc2UKKyAgICBTVFJOQ1BZKHMsICJQQyAoMTYgYml0cyBWaW0pIiwgbGVuKTsKKyNlbmRpZgorICAgIHNbbGVuIC0gMV0gPSBOVUw7CS8qIG1ha2Ugc3VyZSBpdCdzIHRlcm1pbmF0ZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NyYy9vc19tc2Rvcy5oIGIvc3JjL29zX21zZG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2YjIzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc19tc2Rvcy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogTVNET1MgTWFjaGluZS1kZXBlbmRlbnQgdGhpbmdzLgorICovCisKKyNpbmNsdWRlICJvc19kb3MuaCIJCS8qIGNvbW1vbiBNUy1ET1MgYW5kIFdpbjMyIHN0dWZmICovCisKKyNkZWZpbmUgQklOQVJZX0ZJTEVfSU8KKyNkZWZpbmUgVVNFX0VYRV9OQU1FCQkvKiB1c2UgYXJndlswXSBmb3IgJFZJTSAqLworI2RlZmluZSBOT19DT09LRURfSU5QVVQJCS8qIG1jaF9pbmNoYXIoKSBkb2Vzbid0IHJldHVybiB3aG9sZSBsaW5lcyAqLworI2RlZmluZSBTWU5DX0RVUF9DTE9TRQkJLyogc3luYygpIGEgZmlsZSB3aXRoIGR1cCgpIGFuZCBjbG9zZSgpICovCisjZGVmaW5lIFVTRV9URVJNX0NPTlNPTEUKKyNpZmRlZiBESkdQUAorIyBpbmNsdWRlIDxmY250bC5oPgkJLyogZGVmaW5lcyBfVVNFX0xGTiAqLworIyBkZWZpbmUgVVNFX0xPTkdfRk5BTUUgX1VTRV9MRk4gICAgLyogZGVjaWRlIGF0IHJ1biB0aW1lICovCisjIGRlZmluZSBVU0VfRk5BTUVfQ0FTRQorIyBkZWZpbmUgSEFWRV9QVVRFTlYKKyNlbHNlCisjIGRlZmluZSBTSE9SVF9GTkFNRQkJLyogYWx3YXlzIDguMyBmaWxlIG5hbWUgKi8KKyNlbmRpZgorI2RlZmluZSBIQVZFX1NURExJQl9ICisjZGVmaW5lIEhBVkVfU1RSSU5HX0gKKyNkZWZpbmUgSEFWRV9GQ05UTF9ICisjZGVmaW5lIEhBVkVfU1RSQ1NQTgorI2RlZmluZSBIQVZFX1NUUklDTVAKKyNkZWZpbmUgSEFWRV9TVFJGVElNRQkJLyogZ3Vlc3NlZCAqLworI2RlZmluZSBIQVZFX1NUUk5JQ01QCisjZGVmaW5lIEhBVkVfTUVNU0VUCisjZGVmaW5lIEhBVkVfUVNPUlQKKyNkZWZpbmUgSEFWRV9TVF9NT0RFCQkvKiBoYXZlIHN0YXQuc3RfbW9kZSAqLworI2lmIGRlZmluZWQoX19EQVRFX18pICYmIGRlZmluZWQoX19USU1FX18pCisjIGRlZmluZSBIQVZFX0RBVEVfVElNRQorI2VuZGlmCisjZGVmaW5lIEJSRUFLQ0hFQ0tfU0tJUAkgICAgMQkvKiBjYWxsIG1jaF9icmVha2NoZWNrKCkgZWFjaCB0aW1lLCBpdCdzIGZhc3QgKi8KKyNkZWZpbmUgSEFWRV9BVkFJTF9NRU0KKworLyoKKyAqIEJvcmxhbmQgQysrIDMuMSBkb2Vzbid0IGhhdmUgX1JUTEVOVFJZRgorICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisjIGlmIF9fQk9STEFORENfXyA8IDB4NDUwCisjICBkZWZpbmUgX1JUTEVOVFJZRgorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRk5BTUVfSUxMRUdBTCAiXCIqPz48fCIgLyogaWxsZWdhbCBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lICovCisKKyNpbmNsdWRlIDxkb3MuaD4KKyNpbmNsdWRlIDxkaXIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBESkdQUAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZGVmaW5lIEhBVkVfTE9DQUxFX0gKKyMgZGVmaW5lIHNldGxvY2FsZShjLCBwKSAgICBkamdwcF9zZXRsb2NhbGUoKQorI2VuZGlmCisKKyNpZm5kZWYgREpHUFAKK3R5cGVkZWYgbG9uZyBvZmZfdDsKKyNlbmRpZgorCisvKgorICogVHJ5IHNldmVyYWwgZGlyZWN0b3JpZXMgdG8gcHV0IHRoZSB0ZW1wIGZpbGVzLgorICovCisjZGVmaW5lIFRFTVBESVJOQU1FUwkiJFRNUCIsICIkVEVNUCIsICJjOlxcVE1QIiwgImM6XFxURU1QIiwgIiIKKyNkZWZpbmUgVEVNUE5BTUVMRU4JMTI4CisKKyNpZm5kZWYgREZMVF9NQVhNRU0KKyMgZGVmaW5lIERGTFRfTUFYTUVNCTI1NgkJLyogdXNlIHVwIHRvIDI1NktieXRlIGZvciBidWZmZXIgKi8KKyNlbmRpZgorI2lmbmRlZiBERkxUX01BWE1FTVRPVAorIyBkZWZpbmUgREZMVF9NQVhNRU1UT1QJMAkJLyogZGVjaWRlIGluIHNldF9pbml0ICovCisjZW5kaWYKKworI2lmZGVmIERKR1BQCisjIGRlZmluZSBCQVNFTkFNRUxFTiAgKF9VU0VfTEZOPzI1MDo4KQkvKiBsZW5ndGggb2YgYmFzZSBvZiBmaWxlIG5hbWUgKi8KKyNlbHNlCisjIGRlZmluZSBCQVNFTkFNRUxFTgkgICAgOAkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZSBuYW1lICovCisjZW5kaWYKKworLyogY29kZXMgZm9yIG1zZG9zIG1vdXNlIGV2ZW50ICovCisjZGVmaW5lIE1TRE9TX01PVVNFX0xFRlQJMHgwMQorI2RlZmluZSBNU0RPU19NT1VTRV9SSUdIVAkweDAyCisjZGVmaW5lIE1TRE9TX01PVVNFX01JRERMRQkweDA0CisKKyNpZmRlZiBESkdQUAoraW50IG1jaF9yZW5hbWUoY29uc3QgY2hhciAqT2xkRmlsZSwgY29uc3QgY2hhciAqTmV3RmlsZSk7CisjZWxzZQorIyBkZWZpbmUgbWNoX3JlbmFtZShzcmMsIGRzdCkgcmVuYW1lKHNyYywgZHN0KQorI2VuZGlmCisKKyNpZmRlZiBESkdQUAorIyBkZWZpbmUgdmltX21rZGlyKHgsIHkpIG1rZGlyKChjaGFyICopKHgpLCB5KQorI2Vsc2UKKyMgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBta2RpcigoY2hhciAqKSh4KSkKKyNlbmRpZgorI2RlZmluZSBtY2hfcm1kaXIoeCkgcm1kaXIoKGNoYXIgKikoeCkpCisKKyNkZWZpbmUgbWNoX3NldGVudihuYW1lLCB2YWwsIHgpIHNldGVudihuYW1lLCB2YWwsIHgpCmRpZmYgLS1naXQgYS9zcmMvb3NfbXN3aW4uYyBiL3NyYy9vc19tc3dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfbXN3aW4uYwpAQCAtMCwwICsxLDMyNDUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIG9zX21zd2luLmMKKyAqCisgKiBSb3V0aW5lcyBjb21tb24gdG8gYm90aCBXaW4xNiBhbmQgV2luMzIuCisgKi8KKworI2lmZGVmIFdJTjE2CisjIGlmZGVmIF9fQk9STEFORENfXworIyAgcHJhZ21hIHdhcm4gLXBhcgorIyAgcHJhZ21hIHdhcm4gLXVjcAorIyAgcHJhZ21hIHdhcm4gLXVzZQorIyAgcHJhZ21hIHdhcm4gLWF1cworIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKyNpZmRlZiBXSU4xNgorIyBkZWZpbmUgU0hPUlRfRk5BTUUJCS8qIGFsd2F5cyA4LjMgZmlsZSBuYW1lICovCisjIGluY2x1ZGUgPGRvcy5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisjdW5kZWYgY2hkaXIKKyNpZmRlZiBfX0dOVUNfXworIyBpZm5kZWYgX19NSU5HVzMyX18KKyMgIGluY2x1ZGUgPGRpcmVudC5oPgorIyBlbmRpZgorI2Vsc2UKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9USVRMRSkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQorIyBpbmNsdWRlIDxzaGVsbGFwaS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfUFJJTlRFUikgJiYgIWRlZmluZWQoRkVBVF9QT1NUU0NSSVBUKQorIyBpbmNsdWRlIDxkbGdzLmg+CisjIGlmZGVmIFdJTjMyNjQKKyMgIGluY2x1ZGUgPHdpbnNwb29sLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHByaW50Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPGNvbW1kbGcuaD4KKyNlbmRpZgorCisjaWZkZWYgX19NSU5HVzMyX18KKyMgaWZuZGVmIEZST01fTEVGVF8xU1RfQlVUVE9OX1BSRVNTRUQKKyMgIGRlZmluZSBGUk9NX0xFRlRfMVNUX0JVVFRPTl9QUkVTU0VEICAgIDB4MDAwMQorIyBlbmRpZgorIyBpZm5kZWYgUklHSFRNT1NUX0JVVFRPTl9QUkVTU0VECisjICBkZWZpbmUgUklHSFRNT1NUX0JVVFRPTl9QUkVTU0VECSAgMHgwMDAyCisjIGVuZGlmCisjIGlmbmRlZiBGUk9NX0xFRlRfMk5EX0JVVFRPTl9QUkVTU0VECisjICBkZWZpbmUgRlJPTV9MRUZUXzJORF9CVVRUT05fUFJFU1NFRCAgICAweDAwMDQKKyMgZW5kaWYKKyMgaWZuZGVmIEZST01fTEVGVF8zUkRfQlVUVE9OX1BSRVNTRUQKKyMgIGRlZmluZSBGUk9NX0xFRlRfM1JEX0JVVFRPTl9QUkVTU0VEICAgIDB4MDAwOAorIyBlbmRpZgorIyBpZm5kZWYgRlJPTV9MRUZUXzRUSF9CVVRUT05fUFJFU1NFRAorIyAgZGVmaW5lIEZST01fTEVGVF80VEhfQlVUVE9OX1BSRVNTRUQgICAgMHgwMDEwCisjIGVuZGlmCisKKy8qCisgKiBFdmVudEZsYWdzCisgKi8KKyMgaWZuZGVmIE1PVVNFX01PVkVECisjICBkZWZpbmUgTU9VU0VfTU9WRUQgICAweDAwMDEKKyMgZW5kaWYKKyMgaWZuZGVmIERPVUJMRV9DTElDSworIyAgZGVmaW5lIERPVUJMRV9DTElDSyAgMHgwMDAyCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIFdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzIGZvciBXaW4zMiBvbiBVbml4LCB0aGVzZSBsaW5lcyBtYWtlIHRoZSBzeW50YXgKKyAqIGVycm9ycyBkaXNhcHBlYXIuICBUaGV5IGRvIG5vdCBuZWVkIHRvIGJlIGNvcnJlY3QuCisgKi8KKyNpZmRlZiBQUk9UTworI2RlZmluZSBXSU5BUEkKKyNkZWZpbmUgV0lOQkFTRUFQSQordHlwZWRlZiBpbnQgQk9PTDsKK3R5cGVkZWYgaW50IENBTExCQUNLOwordHlwZWRlZiBpbnQgQ09MT1JSRUY7Cit0eXBlZGVmIGludCBDT05TT0xFX0NVUlNPUl9JTkZPOwordHlwZWRlZiBpbnQgQ09PUkQ7Cit0eXBlZGVmIGludCBEV09SRDsKK3R5cGVkZWYgaW50IEVOVU1MT0dGT05UOwordHlwZWRlZiBpbnQgSEFORExFOwordHlwZWRlZiBpbnQgSERDOwordHlwZWRlZiBpbnQgSEZPTlQ7Cit0eXBlZGVmIGludCBISUNPTjsKK3R5cGVkZWYgaW50IEhXTkQ7Cit0eXBlZGVmIGludCBJTlBVVF9SRUNPUkQ7Cit0eXBlZGVmIGludCBLRVlfRVZFTlRfUkVDT1JEOwordHlwZWRlZiBpbnQgTE9HRk9OVDsKK3R5cGVkZWYgaW50IExQQVJBTTsKK3R5cGVkZWYgaW50IExQQk9PTDsKK3R5cGVkZWYgaW50IExQQ1NUUjsKK3R5cGVkZWYgaW50IExQQ1dTVFI7Cit0eXBlZGVmIGludCBMUFNUUjsKK3R5cGVkZWYgaW50IExQVFNUUjsKK3R5cGVkZWYgaW50IExQV1NUUjsKK3R5cGVkZWYgaW50IExSRVNVTFQ7Cit0eXBlZGVmIGludCBNT1VTRV9FVkVOVF9SRUNPUkQ7Cit0eXBlZGVmIGludCBORVdURVhUTUVUUklDOwordHlwZWRlZiBpbnQgUEFDTDsKK3R5cGVkZWYgaW50IFBSSU5URExHOwordHlwZWRlZiBpbnQgUFNFQ1VSSVRZX0RFU0NSSVBUT1I7Cit0eXBlZGVmIGludCBQU0lEOwordHlwZWRlZiBpbnQgU0VDVVJJVFlfSU5GT1JNQVRJT047Cit0eXBlZGVmIGludCBTSE9SVDsKK3R5cGVkZWYgaW50IFNNQUxMX1JFQ1Q7Cit0eXBlZGVmIGludCBURVhUTUVUUklDOwordHlwZWRlZiBpbnQgVUlOVDsKK3R5cGVkZWYgaW50IFdDSEFSOwordHlwZWRlZiBpbnQgV09SRDsKK3R5cGVkZWYgaW50IFdQQVJBTTsKK3R5cGVkZWYgdm9pZCBWT0lEOworI2VuZGlmCisKKy8qIFJlY29yZCBhbGwgb3V0cHV0IGFuZCBhbGwga2V5Ym9hcmQgJiBtb3VzZSBpbnB1dCAqLworLyogI2RlZmluZSBNQ0hfV1JJVEVfRFVNUCAqLworCisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKK0ZJTEUqIGZkRHVtcCA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIFdJTjMyNjQKK2V4dGVybiBEV09SRCBnX1BsYXRmb3JtSWQ7CisjZW5kaWYKKworI2lmbmRlZiBGRUFUX0dVSV9NU1dJTgorZXh0ZXJuIGNoYXIgZ19zek9yaWdUaXRsZVtdOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSQorZXh0ZXJuIEhXTkQgc19od25kOworI2Vsc2UKKyMgaWYgKGRlZmluZWQoRkVBVF9QUklOVEVSKSAmJiAhZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpKSBcCisJfHwgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikgXAorCXx8IChkZWZpbmVkKEZFQVRfRVZBTCkgJiYgIWRlZmluZWQoRkVBVF9HVUkpKQorIyAgZGVmaW5lIEhBVkVfR0VUQ09OU09MRUhXTkQKK3N0YXRpYyBIV05EIHNfaHduZCA9IDA7CSAgICAvKiBjb25zb2xlIHdpbmRvdyBoYW5kbGUsIHNldCBieSBHZXRDb25zb2xlSHduZCgpICovCisjIGVuZGlmCisjZW5kaWYKKworZXh0ZXJuIGludCBXU0luaXRpYWxpemVkOworCisvKiBEb24ndCBnZW5lcmF0ZSBwcm90b3R5cGVzIGhlcmUsIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGRvIGhhdmUgdGhlc2UKKyAqIGZ1bmN0aW9ucy4gKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChQUk9UTykKKyMgaWZuZGVmIF9fTUlOR1czMl9fCitpbnQgX3N0cmljb2xsKGNoYXIgKmEsIGNoYXIgKmIpCit7CisgICAgLy8gdGhlIEFOU0ktaXNoIGNvcnJlY3Qgd2F5IGlzIHRvIHVzZSBzdHJ4ZnJtKCk6CisgICAgY2hhciBhX2J1ZmZbNTEyXSwgYl9idWZmWzUxMl07ICAvLyBmaWxlIG5hbWVzLCBzbyB0aGlzIGlzIGVub3VnaCBvbiBXaW4zMgorICAgIHN0cnhmcm0oYV9idWZmLCBhLCA1MTIpOworICAgIHN0cnhmcm0oYl9idWZmLCBiLCA1MTIpOworICAgIHJldHVybiBzdHJjb2xsKGFfYnVmZiwgYl9idWZmKTsKK30KKworY2hhciAqIF9mdWxscGF0aChjaGFyICpidWYsIGNoYXIgKmZuYW1lLCBpbnQgbGVuKQoreworICAgIExQVFNUUiB0b3NzOworCisgICAgcmV0dXJuIChjaGFyICopR2V0RnVsbFBhdGhOYW1lKGZuYW1lLCBsZW4sIGJ1ZiwgJnRvc3MpOworfQorIyBlbmRpZgorCitpbnQgX2NoZHJpdmUoaW50IGRyaXZlKQoreworICAgIGNoYXIgdGVtcCBbM10gPSAiLToiOworICAgIHRlbXBbMF0gPSBkcml2ZSArICdBJyAtIDE7CisgICAgcmV0dXJuICFTZXRDdXJyZW50RGlyZWN0b3J5KHRlbXApOworfQorI2Vsc2UKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisvKiBiZWluZyBhIG1vcmUgQU5TSSBjb21wbGlhbnQgY29tcGlsZXIsIEJvcmxhbmRDIGRvZXNuJ3QgZGVmaW5lIF9zdHJpY29sbDoKKyAqIGJ1dCBpdCBkb2VzIGluIEJDIDUuMDIhICovCisjICBpZiBfX0JPUkxBTkRDX18gPCAweDUwMgoraW50IF9zdHJpY29sbChjaGFyICphLCBjaGFyICpiKQoreworIyAgIGlmIDEKKyAgICAvLyB0aGlzIGlzIGZhc3QgYnV0IG5vdCBjb3JyZWN0OgorICAgIHJldHVybiBzdHJpY21wKGEsIGIpOworIyAgIGVsc2UKKyAgICAvLyB0aGUgQU5TSS1pc2ggY29ycmVjdCB3YXkgaXMgdG8gdXNlIHN0cnhmcm0oKToKKyAgICBjaGFyIGFfYnVmZls1MTJdLCBiX2J1ZmZbNTEyXTsgIC8vIGZpbGUgbmFtZXMsIHNvIHRoaXMgaXMgZW5vdWdoIG9uIFdpbjMyCisgICAgc3RyeGZybShhX2J1ZmYsIGEsIDUxMik7CisgICAgc3RyeGZybShiX2J1ZmYsIGIsIDUxMik7CisgICAgcmV0dXJuIHN0cmNvbGwoYV9idWZmLCBiX2J1ZmYpOworIyAgIGVuZGlmCit9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogR1VJIHZlcnNpb24gb2YgbWNoX2V4aXQoKS4KKyAqIFNodXQgZG93biBhbmQgZXhpdCB3aXRoIHN0YXR1cyBgcicKKyAqIENhcmVmdWw6IG1jaF9leGl0KCkgbWF5IGJlIGNhbGxlZCBiZWZvcmUgbWNoX2luaXQoKSEKKyAqLworICAgIHZvaWQKK21jaF9leGl0KGludCByKQoreworICAgIGRpc3BsYXlfZXJyb3JzKCk7CisKKyAgICBtbF9jbG9zZV9hbGwoVFJVRSk7CQkvKiByZW1vdmUgYWxsIG1lbWZpbGVzICovCisKKyMgaWZkZWYgRkVBVF9PTEUKKyAgICBVbmluaXRPTEUoKTsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgaWYgKFdTSW5pdGlhbGl6ZWQpCisgICAgeworCVdTSW5pdGlhbGl6ZWQgPSBGQUxTRTsKKwlXU0FDbGVhbnVwKCk7CisgICAgfQorIyBlbmRpZgorI2lmZGVmIERZTkFNSUNfR0VUVEVYVAorICAgIGR5bl9saWJpbnRsX2VuZCgpOworI2VuZGlmCisKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfZXhpdChyKTsKKyAgICBleGl0KHIpOworfQorCisjZW5kaWYgLyogRkVBVF9HVUlfTVNXSU4gKi8KKworCisvKgorICogSW5pdCB0aGUgdGFibGVzIGZvciB0b3VwcGVyKCkgYW5kIHRvbG93ZXIoKS4KKyAqLworICAgIHZvaWQKK21jaF9lYXJseV9pbml0KHZvaWQpCit7CisgICAgaW50CQlpOworCisjaWZkZWYgV0lOMzI2NAorICAgIFBsYXRmb3JtSWQoKTsKKyNlbmRpZgorCisgICAgLyogSW5pdCB0aGUgdGFibGVzIGZvciB0b3VwcGVyKCkgYW5kIHRvbG93ZXIoKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKKwl0b3VwcGVyX3RhYltpXSA9IHRvbG93ZXJfdGFiW2ldID0gaTsKKyNpZmRlZiBXSU4zMjY0CisgICAgQ2hhclVwcGVyQnVmZih0b3VwcGVyX3RhYiwgMjU2KTsKKyAgICBDaGFyTG93ZXJCdWZmKHRvbG93ZXJfdGFiLCAyNTYpOworI2Vsc2UKKyAgICBBbnNpVXBwZXJCdWZmKHRvdXBwZXJfdGFiLCAyNTYpOworICAgIEFuc2lMb3dlckJ1ZmYodG9sb3dlcl90YWIsIDI1Nik7CisjZW5kaWYKK30KKworCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIGlucHV0IGNvbWVzIGZyb20gYSB0ZXJtaW5hbCwgRkFMU0Ugb3RoZXJ3aXNlLgorICovCisgICAgaW50CittY2hfaW5wdXRfaXNhdHR5KCkKK3sKKyNpZmRlZiBGRUFUX0dVSV9NU1dJTgorICAgIHJldHVybiBPSzsJICAgIC8qIEdVSSBhbHdheXMgaGFzIGEgdHR5ICovCisjZWxzZQorICAgIGlmIChpc2F0dHkocmVhZF9jbWRfZmQpKQorCXJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisjaWZkZWYgRkVBVF9USVRMRQorLyoKKyAqIG1jaF9zZXR0aXRsZSgpOiBzZXQgdGl0bGViYXIgb2Ygb3VyIHdpbmRvdworICovCisgICAgdm9pZAorbWNoX3NldHRpdGxlKAorICAgIGNoYXJfdSAqdGl0bGUsCisgICAgY2hhcl91ICppY29uKQoreworIyBpZmRlZiBGRUFUX0dVSV9NU1dJTgorICAgIGd1aV9tY2hfc2V0dGl0bGUodGl0bGUsIGljb24pOworIyBlbHNlCisgICAgaWYgKHRpdGxlICE9IE5VTEwpCisJU2V0Q29uc29sZVRpdGxlKHRpdGxlKTsKKyMgZW5kaWYKK30KKworCisvKgorICogUmVzdG9yZSB0aGUgd2luZG93L2ljb24gdGl0bGUuCisgKiB3aGljaCBpcyBvbmUgb2Y6CisgKiAgMTogSnVzdCByZXN0b3JlIHRpdGxlCisgKiAgMjogSnVzdCByZXN0b3JlIGljb24gKHdoaWNoIHdlIGRvbid0IGhhdmUpCisgKiAgMzogUmVzdG9yZSB0aXRsZSBhbmQgaWNvbiAod2hpY2ggd2UgZG9uJ3QgaGF2ZSkKKyAqLworICAgIHZvaWQKK21jaF9yZXN0b3JlX3RpdGxlKAorICAgIGludCB3aGljaCkKK3sKKyNpZm5kZWYgRkVBVF9HVUlfTVNXSU4KKyAgICBtY2hfc2V0dGl0bGUoKHdoaWNoICYgMSkgPyBnX3N6T3JpZ1RpdGxlIDogTlVMTCwgTlVMTCk7CisjZW5kaWYKK30KKworCisvKgorICogUmV0dXJuIFRSVUUgaWYgd2UgY2FuIHJlc3RvcmUgdGhlIHRpdGxlICh3ZSBjYW4pCisgKi8KKyAgICBpbnQKK21jaF9jYW5fcmVzdG9yZV90aXRsZSgpCit7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHdlIGNhbiByZXN0b3JlIHRoZSBpY29uIHRpdGxlICh3ZSBjYW4ndCkKKyAqLworICAgIGludAorbWNoX2Nhbl9yZXN0b3JlX2ljb24oKQoreworICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAvKiBGRUFUX1RJVExFICovCisKKworLyoKKyAqIEdldCBhYnNvbHV0ZSBmaWxlIG5hbWUgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLAorICogdHVybmluZyBhbGwgJy8ncyBpbnRvICdcXCdzIGFuZCBnZXR0aW5nIHRoZSBjb3JyZWN0IGNhc2Ugb2YgZWFjaAorICogY29tcG9uZW50IG9mIHRoZSBmaWxlIG5hbWUuICBBcHBlbmQgYSBiYWNrc2xhc2ggdG8gYSBkaXJlY3RvcnkgbmFtZS4KKyAqIFdoZW4gJ3NoZWxsc2xhc2gnIHNldCBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgaW50CittY2hfRnVsbE5hbWUoCisgICAgY2hhcl91CSpmbmFtZSwKKyAgICBjaGFyX3UJKmJ1ZiwKKyAgICBpbnQJCWxlbiwKKyAgICBpbnQJCWZvcmNlKQoreworICAgIGludAkJblJlc3VsdCA9IEZBSUw7CisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBpZiAoKmZuYW1lID09IE5VTCkgLyogQm9ybGFuZCBiZWhhdmVzIGJhZGx5IGhlcmUgLSBtYWtlIGl0IGNvbnNpc3RlbnQgKi8KKwluUmVzdWx0ID0gbWNoX2Rpcm5hbWUoYnVmLCBsZW4pOworICAgIGVsc2UKKyNlbmRpZgorCWlmIChfZnVsbHBhdGgoYnVmLCBmbmFtZSwgbGVuIC0gMSkgPT0gTlVMTCkKKyAgICB7CisJU1RSTkNQWShidWYsIGZuYW1lLCBsZW4pOyAgIC8qIGZhaWxlZCwgdXNlIHRoZSByZWxhdGl2ZSBwYXRoIG5hbWUgKi8KKwlidWZbbGVuIC0gMV0gPSBOVUw7CisjaWZuZGVmIFVTRV9GTkFNRV9DQVNFCisJc2xhc2hfYWRqdXN0KGJ1Zik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorCW5SZXN1bHQgPSBPSzsKKworI2lmZGVmIFVTRV9GTkFNRV9DQVNFCisgICAgZm5hbWVfY2FzZShidWYsIGxlbik7CisjZW5kaWYKKworICAgIHJldHVybiBuUmVzdWx0OworfQorCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiZm5hbWUiIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKi8KKyAgICBpbnQKK21jaF9pc0Z1bGxOYW1lKGNoYXJfdSAqZm5hbWUpCit7CisgICAgY2hhciBzek5hbWVbX01BWF9QQVRIICsgMV07CisKKyAgICAvKiBBIG5hbWUgbGlrZSAiZDovZm9vIiBhbmQgIi8vc2VydmVyL3NoYXJlIiBpcyBhYnNvbHV0ZSAqLworICAgIGlmICgoZm5hbWVbMF0gJiYgZm5hbWVbMV0gPT0gJzonICYmIChmbmFtZVsyXSA9PSAnLycgfHwgZm5hbWVbMl0gPT0gJ1xcJykpCisJICAgIHx8IChmbmFtZVswXSA9PSBmbmFtZVsxXSAmJiAoZm5hbWVbMF0gPT0gJy8nIHx8IGZuYW1lWzBdID09ICdcXCcpKSkKKwlyZXR1cm4gVFJVRTsKKworICAgIC8qIEEgbmFtZSB0aGF0IGNhbid0IGJlIG1hZGUgYWJzb2x1dGUgcHJvYmFibHkgaXNuJ3QgYWJzb2x1dGUuICovCisgICAgaWYgKG1jaF9GdWxsTmFtZShmbmFtZSwgc3pOYW1lLCBfTUFYX1BBVEgsIEZBTFNFKSA9PSBGQUlMKQorCXJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBwYXRoY21wKGZuYW1lLCBzek5hbWUpID09IDA7Cit9CisKKy8qCisgKiBSZXBsYWNlIGFsbCBzbGFzaGVzIGJ5IGJhY2tzbGFzaGVzLgorICogVGhpcyB1c2VkIHRvIGJlIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBidXQgTVMtRE9TIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMKKyAqIHdpdGggc2xhc2hlcyAoZS5nLiBpbiBhIGNvbW1hbmQgbmFtZSkuICBXZSBjYW4ndCBoYXZlIG1peGVkIHNsYXNoZXMgYW5kCisgKiBiYWNrc2xhc2hlcywgYmVjYXVzZSBjb21wYXJpbmcgZmlsZSBuYW1lcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gIFRoZQorICogY29tbWFuZHMgdGhhdCB1c2UgYSBmaWxlIG5hbWUgc2hvdWxkIHRyeSB0byBhdm9pZCB0aGUgbmVlZCB0byB0eXBlIGEKKyAqIGJhY2tzbGFzaCB0d2ljZS4KKyAqIFdoZW4gJ3NoZWxsc2xhc2gnIHNldCBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqLworICAgIHZvaWQKK3NsYXNoX2FkanVzdChwKQorICAgIGNoYXJfdSAgKnA7Cit7CisgICAgaWYgKHAgIT0gTlVMTCkKKwl3aGlsZSAoKnApCisJeworCSAgICBpZiAoKnAgPT0gcHNlcGNOKQorCQkqcCA9IHBzZXBjOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApOworCSAgICBlbHNlCisjZW5kaWYKKwkJKytwOworCX0KK30KKworCisvKgorICogc3RhdCgpIGNhbid0IGhhbmRsZSBhIHRyYWlsaW5nICcvJyBvciAnXCcsIHJlbW92ZSBpdCBmaXJzdC4KKyAqLworICAgIGludAordmltX3N0YXQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnN0cCkKK3sKKyAgICBjaGFyCWJ1ZltfTUFYX1BBVEggKyAxXTsKKyAgICBjaGFyCSpwOworCisgICAgU1RSTkNQWShidWYsIG5hbWUsIF9NQVhfUEFUSCk7CisgICAgYnVmW19NQVhfUEFUSF0gPSBOVUw7CisgICAgcCA9IGJ1ZiArIHN0cmxlbihidWYpOworICAgIGlmIChwID4gYnVmKQorCS0tcDsKKyAgICBpZiAocCA+IGJ1ZiAmJiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpICYmIHBbLTFdICE9ICc6JykKKwkqcCA9IE5VTDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlCisjIGlmZGVmIF9fQk9STEFORENfXworCSAgICAvKiBXaWRlIGZ1bmN0aW9ucyBvZiBCb3JsYW5kIEMgNS41IGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgOTguICovCisJICAgICYmIGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQKKyMgZW5kaWYKKyAgICAgICApCisgICAgeworCVdDSEFSCSp3cCA9IGVuY190b191Y3MyKGJ1ZiwgTlVMTCk7CisJaW50CW47CisKKwlpZiAod3AgIT0gTlVMTCkKKwl7CisJICAgIG4gPSBfd3N0YXQod3AsIChzdHJ1Y3QgX3N0YXQgKilzdHApOworCSAgICB2aW1fZnJlZSh3cCk7CisJICAgIGlmIChuID49IDApCisJCXJldHVybiBuOworCSAgICAvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuIENhbid0IHVzZQorCSAgICAgKiBHZXRMYXN0RXJyb3IoKSBoZXJlIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCBlcnJubyBnZXRzIHNldCB0byBpZgorCSAgICAgKiB0aGUgX3dzdGF0KCkgZmFpbHMgZm9yIG1pc3Npbmcgd2lkZSBmdW5jdGlvbnMuICovCisJfQorICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzdGF0KGJ1Ziwgc3RwKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorbWNoX3NldHRtb2RlKGludCB0bW9kZSkKK3sKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKKyAgICBpbnQKK21jaF9nZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworICAgIHJldHVybiBPSzsKK30KKworICAgIHZvaWQKK21jaF9zZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworfQorCisvKgorICogUm93cyBhbmQvb3IgQ29sdW1ucyBoYXMgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK21jaF9uZXdfc2hlbGxzaXplKHZvaWQpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworfQorCisjZW5kaWYKKworLyoKKyAqIFdlIGhhdmUgbm8gam9iIGNvbnRyb2wsIHNvIGZha2UgaXQgYnkgc3RhcnRpbmcgYSBuZXcgc2hlbGwuCisgKi8KKyAgICB2b2lkCittY2hfc3VzcGVuZCgpCit7CisgICAgc3VzcGVuZF9zaGVsbCgpOworfQorCisjaWYgZGVmaW5lZChVU0VfTUNIX0VSUk1TRykgfHwgZGVmaW5lZChQUk9UTykKKworI2lmZGVmIGRpc3BsYXlfZXJyb3JzCisjIHVuZGVmIGRpc3BsYXlfZXJyb3JzCisjZW5kaWYKKworLyoKKyAqIERpc3BsYXkgdGhlIHNhdmVkIGVycm9yIG1lc3NhZ2UocykuCisgKi8KKyAgICB2b2lkCitkaXNwbGF5X2Vycm9ycygpCit7CisgICAgY2hhciAqcDsKKworICAgIGlmIChlcnJvcl9nYS5nYV9kYXRhICE9IE5VTEwpCisgICAgeworCS8qIGF2b2lkIHB1dHRpbmcgdXAgYSBtZXNzYWdlIGJveCB3aXRoIGJsYW5rcyBvbmx5ICovCisJZm9yIChwID0gKGNoYXIgKillcnJvcl9nYS5nYV9kYXRhOyAqcDsgKytwKQorCSAgICBpZiAoIWlzc3BhY2UoKnApKQorCSAgICB7CisJCS8qIFRydW5jYXRlIGEgdmVyeSBsb25nIG1lc3NhZ2UsIGl0IHdpbGwgZ28gb2ZmLXNjcmVlbi4gKi8KKwkJaWYgKFNUUkxFTihwKSA+IDIwMDApCisJCXsKKwkJICAgIGNoYXJfdQkqcyA9IHAgKyAyMDAwIC0gMTQ7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJcyAtPSAoKm1iX2hlYWRfb2ZmKShwLCBzKTsKKyNlbmRpZgorCQkgICAgU1RSQ1BZKHMsIF8oIi4uLih0cnVuY2F0ZWQpIikpOworCQl9CisjaWZkZWYgV0lOMzI2NAorCQlNZXNzYWdlQm94KE5VTEwsIHAsICJWaW0iLCBNQl9UQVNLTU9EQUx8TUJfU0VURk9SRUdST1VORCk7CisjZWxzZQorCQlNZXNzYWdlQm94KE5VTEwsIHAsICJWaW0iLCBNQl9UQVNLTU9EQUwpOworI2VuZGlmCisJCWJyZWFrOworCSAgICB9CisJZ2FfY2xlYXIoJmVycm9yX2dhKTsKKyAgICB9Cit9CisjZW5kaWYKKworCisvKgorICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW4gYSB3aWxkY2FyZCB0aGF0IGNhbiBiZSBleHBhbmRlZCBieQorICogZG9zX2V4cGFuZHBhdGgoKS4KKyAqLworICAgIGludAorbWNoX2hhc19leHBfd2lsZGNhcmQoY2hhcl91ICpwKQoreworICAgIGZvciAoIDsgKnA7ICsrcCkKKyAgICB7CisJaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSI/KlsiLCAqcCkgIT0gTlVMTAorCQl8fCAoKnAgPT0gJ34nICYmIHBbMV0gIT0gTlVMKSkKKwkgICAgcmV0dXJuIFRSVUU7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW4gYSB3aWxkY2FyZCBvciBhICJ+MSIga2luZCBvZiB0aGluZyAoY291bGQgYmUgYQorICogc2hvcnRlbmVkIGZpbGUgbmFtZSkuCisgKi8KKyAgICBpbnQKK21jaF9oYXNfd2lsZGNhcmQoY2hhcl91ICpwKQoreworICAgIGZvciAoIDsgKnA7ICsrcCkKKyAgICB7CisJaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKQorIyAgaWZkZWYgVklNX0JBQ0tUSUNLCisJCQkJICAgICI/KiRbYCIKKyMgIGVsc2UKKwkJCQkgICAgIj8qJFsiCisjICBlbmRpZgorCQkJCQkJLCAqcCkgIT0gTlVMTAorCQl8fCAoKnAgPT0gJ34nICYmIHBbMV0gIT0gTlVMKSkKKwkgICAgcmV0dXJuIFRSVUU7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwKSAtIDE7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBUaGUgbm9ybWFsIF9jaGRpcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgZGVmYXVsdCBkcml2ZS4gIFRoaXMgb25lIGRvZXMuCisgKiBSZXR1cm5pbmcgMCBpbXBsaWVzIHN1Y2Nlc3M7IC0xIGltcGxpZXMgZmFpbHVyZS4KKyAqLworICAgIGludAorbWNoX2NoZGlyKGNoYXIgKnBhdGgpCit7CisgICAgaWYgKHBhdGhbMF0gPT0gTlVMKQkJLyoganVzdCBjaGVja2luZy4uLiAqLworCXJldHVybiAtMTsKKworICAgIGlmIChpc2FscGhhKHBhdGhbMF0pICYmIHBhdGhbMV0gPT0gJzonKQkvKiBoYXMgYSBkcml2ZSBuYW1lICovCisgICAgeworCS8qIElmIHdlIGNhbiBjaGFuZ2UgdG8gdGhlIGRyaXZlLCBza2lwIHRoYXQgcGFydCBvZiB0aGUgcGF0aC4gIElmIHdlCisJICogY2FuJ3QgdGhlbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgbWF5IGJlIGludmFsaWQsIHRyeSB1c2luZyBjaGRpcigpCisJICogd2l0aCB0aGUgd2hvbGUgcGF0aC4gKi8KKwlpZiAoX2NoZHJpdmUoVE9MT1dFUl9BU0MocGF0aFswXSkgLSAnYScgKyAxKSA9PSAwKQorCSAgICBwYXRoICs9IDI7CisgICAgfQorCisgICAgaWYgKCpwYXRoID09IE5VTCkJCS8qIGRyaXZlIG5hbWUgb25seSAqLworCXJldHVybiAwOworCisgICAgcmV0dXJuIGNoZGlyKHBhdGgpOwkgICAgICAgLyogbGV0IHRoZSBub3JtYWwgY2hkaXIoKSBkbyB0aGUgcmVzdCAqLworfQorCisKKy8qCisgKiBTd2l0Y2hpbmcgb2ZmIHRlcm1jYXAgbW9kZSBpcyBvbmx5IGFsbG93ZWQgd2hlbiBDb2x1bW5zIGlzIDgwLCBvdGhlcndpc2UgYQorICogY3Jhc2ggbWF5IHJlc3VsdC4gIEl0J3MgYWx3YXlzIGFsbG93ZWQgb24gTlQgb3Igd2hlbiBydW5uaW5nIHRoZSBHVUkuCisgKi8KKyAgICBpbnQKK2Nhbl9lbmRfdGVybWNhcF9tb2RlKAorICAgIGludCBnaXZlX21zZykKK3sKKyNpZmRlZiBGRUFUX0dVSV9NU1dJTgorICAgIHJldHVybiBUUlVFOwkvKiBHVUkgc3RhcnRzIGEgbmV3IGNvbnNvbGUgYW55d2F5ICovCisjZWxzZQorICAgIGlmIChnX1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UIHx8IENvbHVtbnMgPT0gODApCisJcmV0dXJuIFRSVUU7CisgICAgaWYgKGdpdmVfbXNnKQorCW1zZyhfKCInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworI2lmZGVmIEZFQVRfR1VJX01TV0lOCisvKgorICogcmV0dXJuIG5vbi16ZXJvIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZQorICovCisgICAgaW50CittY2hfY2hhcl9hdmFpbCgpCit7CisgICAgLyogbmV2ZXIgdXNlZCAqLworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKworLyoKKyAqIHNldCBzY3JlZW4gbW9kZSwgYWx3YXlzIGZhaWxzLgorICovCisgICAgaW50CittY2hfc2NyZWVubW9kZSgKKyAgICBjaGFyX3UgKmFyZykKK3sKKyAgICBFTVNHKF8oZV9zY3JlZW5tb2RlKSk7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKworI2lmIGRlZmluZWQoRkVBVF9MSUJDQUxMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENhbGwgYSBETEwgcm91dGluZSB3aGljaCB0YWtlcyBlaXRoZXIgYSBzdHJpbmcgb3IgaW50IHBhcmFtCisgKiBhbmQgcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nLgorICogUmV0dXJuIE9LIGlmIGl0IHdvcmtlZCwgRkFJTCBpZiBub3QuCisgKi8KKyMgaWZkZWYgV0lOMzI2NAordHlwZWRlZiBMUFRTVFIgKCpNWVNUUlBST0NTVFIpKExQVFNUUik7Cit0eXBlZGVmIExQVFNUUiAoKk1ZSU5UUFJPQ1NUUikoaW50KTsKK3R5cGVkZWYgaW50ICgqTVlTVFJQUk9DSU5UKShMUFRTVFIpOwordHlwZWRlZiBpbnQgKCpNWUlOVFBST0NJTlQpKGludCk7CisjIGVsc2UKK3R5cGVkZWYgTFBTVFIgKCpNWVNUUlBST0NTVFIpKExQU1RSKTsKK3R5cGVkZWYgTFBTVFIgKCpNWUlOVFBST0NTVFIpKGludCk7Cit0eXBlZGVmIGludCAoKk1ZU1RSUFJPQ0lOVCkoTFBTVFIpOwordHlwZWRlZiBpbnQgKCpNWUlOVFBST0NJTlQpKGludCk7CisjIGVuZGlmCisKKyMgaWZuZGVmIFdJTjE2CisvKgorICogQ2hlY2sgaWYgYSBwb2ludGVyIHBvaW50cyB0byBhIHZhbGlkIE5VTCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwuCisgKiBSZXR1cm5zIDAgZm9yIGFuIGludmFsaWQgcG9pbnRlciwgMSBmb3IgYW4gZW1wdHkgc3RyaW5nLgorICovCisgICAgc3RhdGljIHNpemVfdAorY2hlY2tfc3RyX2xlbihjaGFyX3UgKnN0cikKK3sKKyAgICBTWVNURU1fSU5GTwkJCXNpOworICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTgltYmk7CisgICAgc2l6ZV90CQkJbGVuZ3RoID0gMDsKKyAgICBzaXplX3QJCQlpOworICAgIGNvbnN0IGNoYXIJCQkqcDsKKworICAgIC8qIGdldCBwYWdlIHNpemUgKi8KKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisKKyAgICAvKiBnZXQgbWVtb3J5IGluZm9ybWF0aW9uICovCisgICAgaWYgKFZpcnR1YWxRdWVyeShzdHIsICZtYmksIHNpemVvZihtYmkpKSkKKyAgICB7CisJLyogcHJlIGNhc3QgdGhlc2UgKHR5cGluZyBzYXZlcnMpICovCisJRFdPUkQgZHdTdHIgPSAoRFdPUkQpc3RyOworCURXT1JEIGR3QmFzZUFkZHJlc3MgPSAoRFdPUkQpbWJpLkJhc2VBZGRyZXNzOworCisJLyogZ2V0IHN0YXJ0IGFkZHJlc3Mgb2YgcGFnZSB0aGF0IHN0ciBpcyBvbiAqLworCURXT1JEIHN0clBhZ2UgPSBkd1N0ciAtIChkd1N0ciAtIGR3QmFzZUFkZHJlc3MpICUgc2kuZHdQYWdlU2l6ZTsKKworCS8qIGdldCBsZW5ndGggZnJvbSBzdHIgdG8gZW5kIG9mIHBhZ2UgKi8KKwlEV09SRCBwYWdlTGVuZ3RoID0gc2kuZHdQYWdlU2l6ZSAtIChkd1N0ciAtIHN0clBhZ2UpOworCisJZm9yIChwID0gc3RyOyAhSXNCYWRSZWFkUHRyKHAsIHBhZ2VMZW5ndGgpOworCQkJCSAgcCArPSBwYWdlTGVuZ3RoLCBwYWdlTGVuZ3RoID0gc2kuZHdQYWdlU2l6ZSkKKwkgICAgZm9yIChpID0gMDsgaSA8IHBhZ2VMZW5ndGg7ICsraSwgKytsZW5ndGgpCisJCWlmIChwW2ldID09IE5VTCkKKwkJICAgIHJldHVybiBsZW5ndGggKyAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorIyBlbmRpZgorCisgICAgaW50CittY2hfbGliY2FsbCgKKyAgICBjaGFyX3UJKmxpYm5hbWUsCisgICAgY2hhcl91CSpmdW5jbmFtZSwKKyAgICBjaGFyX3UJKmFyZ3N0cmluZywJLyogTlVMTCB3aGVuIHVzaW5nIGEgYXJnaW50ICovCisgICAgaW50CQlhcmdpbnQsCisgICAgY2hhcl91CSoqc3RyaW5nX3Jlc3VsdCwvKiBOVUxMIHdoZW4gdXNpbmcgbnVtYmVyX3Jlc3VsdCAqLworICAgIGludAkJKm51bWJlcl9yZXN1bHQpCit7CisgICAgSElOU1RBTkNFCQloaW5zdExpYjsKKyAgICBNWVNUUlBST0NTVFIJUHJvY0FkZDsKKyAgICBNWUlOVFBST0NTVFIJUHJvY0FkZEk7CisgICAgY2hhcl91CQkqcmV0dmFsX3N0ciA9IE5VTEw7CisgICAgaW50CQkJcmV0dmFsX2ludCA9IDA7CisgICAgc2l6ZV90CQlsZW47CisKKyAgICBCT09MIGZSdW5UaW1lTGlua1N1Y2Nlc3MgPSBGQUxTRTsKKworICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgRExMIG1vZHVsZS4KKyAgICBoaW5zdExpYiA9IExvYWRMaWJyYXJ5KGxpYm5hbWUpOworCisgICAgLy8gSWYgdGhlIGhhbmRsZSBpcyB2YWxpZCwgdHJ5IHRvIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcy4KKyAgICBpZiAoaGluc3RMaWIgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9UUllfRVhDRVBUCisJX190cnkKKwl7CisjZW5kaWYKKwlpZiAoYXJnc3RyaW5nICE9IE5VTEwpCisJeworCSAgICAvKiBDYWxsIHdpdGggc3RyaW5nIGFyZ3VtZW50ICovCisJICAgIFByb2NBZGQgPSAoTVlTVFJQUk9DU1RSKSBHZXRQcm9jQWRkcmVzcyhoaW5zdExpYiwgZnVuY25hbWUpOworCSAgICBpZiAoKGZSdW5UaW1lTGlua1N1Y2Nlc3MgPSAoUHJvY0FkZCAhPSBOVUxMKSkgIT0gMCkKKwkgICAgeworCQlpZiAoc3RyaW5nX3Jlc3VsdCA9PSBOVUxMKQorCQkgICAgcmV0dmFsX2ludCA9ICgoTVlTVFJQUk9DSU5UKVByb2NBZGQpKGFyZ3N0cmluZyk7CisJCWVsc2UKKwkJICAgIHJldHZhbF9zdHIgPSAoUHJvY0FkZCkoYXJnc3RyaW5nKTsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICAvKiBDYWxsIHdpdGggbnVtYmVyIGFyZ3VtZW50ICovCisJICAgIFByb2NBZGRJID0gKE1ZSU5UUFJPQ1NUUikgR2V0UHJvY0FkZHJlc3MoaGluc3RMaWIsIGZ1bmNuYW1lKTsKKwkgICAgaWYgKChmUnVuVGltZUxpbmtTdWNjZXNzID0gKFByb2NBZGRJICE9IE5VTEwpKSAhPSAwKQorCSAgICB7CisJCWlmIChzdHJpbmdfcmVzdWx0ID09IE5VTEwpCisJCSAgICByZXR2YWxfaW50ID0gKChNWUlOVFBST0NJTlQpUHJvY0FkZEkpKGFyZ2ludCk7CisJCWVsc2UKKwkJICAgIHJldHZhbF9zdHIgPSAoUHJvY0FkZEkpKGFyZ2ludCk7CisJICAgIH0KKwl9CisKKwkvLyBTYXZlIHRoZSBzdHJpbmcgYmVmb3JlIHdlIGZyZWUgdGhlIGxpYnJhcnkuCisJLy8gQXNzdW1lIHRoYXQgYSAiMSIgcmVzdWx0IGlzIGFuIGlsbGVnYWwgcG9pbnRlci4KKwlpZiAoc3RyaW5nX3Jlc3VsdCA9PSBOVUxMKQorCSAgICAqbnVtYmVyX3Jlc3VsdCA9IHJldHZhbF9pbnQ7CisJZWxzZSBpZiAocmV0dmFsX3N0ciAhPSBOVUxMCisjIGlmZGVmIFdJTjE2CisJCSYmIHJldHZhbF9zdHIgIT0gKGNoYXJfdSAqKTEKKwkJJiYgcmV0dmFsX3N0ciAhPSAoY2hhcl91ICopLTEKKwkJJiYgIUlzQmFkU3RyaW5nUHRyKHJldHZhbF9zdHIsIElOVF9NQVgpCisJCSYmIChsZW4gPSBzdHJsZW4ocmV0dmFsX3N0cikgKyAxKSA+IDAKKyMgZWxzZQorCQkmJiAobGVuID0gY2hlY2tfc3RyX2xlbihyZXR2YWxfc3RyKSkgPiAwCisjIGVuZGlmCisJCSkKKwl7CisJICAgICpzdHJpbmdfcmVzdWx0ID0gbGFsbG9jKChsb25nX3UpbGVuLCBUUlVFKTsKKwkgICAgaWYgKCpzdHJpbmdfcmVzdWx0ICE9IE5VTEwpCisJCW1jaF9tZW1tb3ZlKCpzdHJpbmdfcmVzdWx0LCByZXR2YWxfc3RyLCBsZW4pOworCX0KKworI2lmZGVmIEhBVkVfVFJZX0VYQ0VQVAorCX0KKwlfX2V4Y2VwdChFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSKQorCXsKKwkgICAgaWYgKEdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1cpCisJCVJFU0VUU1RLT0ZMVygpOworCSAgICBmUnVuVGltZUxpbmtTdWNjZXNzID0gMDsKKwl9CisjZW5kaWYKKworCS8vIEZyZWUgdGhlIERMTCBtb2R1bGUuCisJKHZvaWQpRnJlZUxpYnJhcnkoaGluc3RMaWIpOworICAgIH0KKworICAgIGlmICghZlJ1blRpbWVMaW5rU3VjY2VzcykKKyAgICB7CisJRU1TRzIoXyhlX2xpYmNhbGwpLCBmdW5jbmFtZSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29udmVydCBhbiBVVEYtOCBzdHJpbmcgdG8gVUNTLTIuCisgKiAiaW5zdHJbaW5sZW5dIiBpcyB0aGUgaW5wdXQuICAiaW5sZW4iIGlzIGluIGJ5dGVzLgorICogV2hlbiAib3V0c3RyIiBpcyBOVUxMIG9ubHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgVUNTLTIgd29yZHMgcHJvZHVjZWQuCisgKiBPdGhlcndpc2UgIm91dHN0ciIgbXVzdCBiZSBhIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVUNTLTIgd29yZHMgcHJvZHVjZWQuCisgKi8KKyAgICBpbnQKK3V0ZjhfdG9fdWNzMihjaGFyX3UgKmluc3RyLCBpbnQgaW5sZW4sIHNob3J0X3UgKm91dHN0ciwgaW50ICp1bmNvbnZsZW5wKQoreworICAgIGludAkJb3V0bGVuID0gMDsKKyAgICBjaGFyX3UJKnAgPSBpbnN0cjsKKyAgICBpbnQJCXRvZG8gPSBpbmxlbjsKKyAgICBpbnQJCWw7CisKKyAgICB3aGlsZSAodG9kbyA+IDApCisgICAgeworCS8qIE9ubHkgY29udmVydCBpZiB3ZSBoYXZlIGEgY29tcGxldGUgc2VxdWVuY2UuICovCisJbCA9IHV0Zl9wdHIybGVuX2NoZWNrX2xlbihwLCB0b2RvKTsKKwlpZiAobCA+IHRvZG8pCisJeworCSAgICAvKiBSZXR1cm4gbGVuZ3RoIG9mIGluY29tcGxldGUgc2VxdWVuY2UuICovCisJICAgIGlmICh1bmNvbnZsZW5wICE9IE5VTEwpCisJCSp1bmNvbnZsZW5wID0gdG9kbzsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKG91dHN0ciAhPSBOVUxMKQorCSAgICAqb3V0c3RyKysgPSB1dGZfcHRyMmNoYXIocCk7CisJKytvdXRsZW47CisJcCArPSBsOworCXRvZG8gLT0gbDsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0bGVuOworfQorCisvKgorICogQ29udmVydCBhbiBVQ1MtMiBzdHJpbmcgdG8gVVRGLTguCisgKiBUaGUgaW5wdXQgaXMgImluc3RyW2lubGVuXSIgd2l0aCAiaW5sZW4iIGluIG51bWJlciBvZiB1Y3MtMiB3b3Jkcy4KKyAqIFdoZW4gIm91dHN0ciIgaXMgTlVMTCBvbmx5IHJldHVybiB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLgorICogT3RoZXJ3aXNlICJvdXRzdHIiIG11c3QgYmUgYSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQuCisgKi8KKyAgICBpbnQKK3VjczJfdG9fdXRmOChzaG9ydF91ICppbnN0ciwgaW50IGlubGVuLCBjaGFyX3UgKm91dHN0cikKK3sKKyAgICBpbnQJCW91dGxlbiA9IDA7CisgICAgaW50CQl0b2RvID0gaW5sZW47CisgICAgc2hvcnRfdQkqcCA9IGluc3RyOworICAgIGludAkJbDsKKworICAgIHdoaWxlICh0b2RvID4gMCkKKyAgICB7CisJaWYgKG91dHN0ciAhPSBOVUxMKQorCXsKKwkgICAgbCA9IHV0Zl9jaGFyMmJ5dGVzKCpwLCBvdXRzdHIpOworCSAgICBvdXRzdHIgKz0gbDsKKwl9CisJZWxzZQorCSAgICBsID0gdXRmX2NoYXIybGVuKCpwKTsKKwkrK3A7CisJb3V0bGVuICs9IGw7CisJLS10b2RvOworICAgIH0KKworICAgIHJldHVybiBvdXRsZW47Cit9CisKKy8qCisgKiBDYWxsIE11bHRpQnl0ZVRvV2lkZUNoYXIoKSBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVzdWx0LgorICogUmV0dXJucyB0aGUgcmVzdWx0IGluICIqb3V0WypvdXRsZW5dIiB3aXRoIGFuIGV4dHJhIHplcm8gYXBwZW5kZWQuCisgKiAib3V0bGVuIiBpcyBpbiB3b3Jkcy4KKyAqLworICAgIHZvaWQKK011bHRpQnl0ZVRvV2lkZUNoYXJfYWxsb2MoVUlOVCBjcCwgRFdPUkQgZmxhZ3MsCisJTFBDU1RSIGluLCBpbnQgaW5sZW4sCisJTFBXU1RSICpvdXQsIGludCAqb3V0bGVuKQoreworICAgICpvdXRsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCBmbGFncywgaW4sIGlubGVuLCAwLCAwKTsKKyAgICAvKiBBZGQgb25lIG9uZSB3b3JkIHRvIGF2b2lkIGEgemVyby1sZW5ndGggYWxsb2MoKS4gKi8KKyAgICAqb3V0ID0gKExQV1NUUilhbGxvYyhzaXplb2YoV0NIQVIpICogKCpvdXRsZW4gKyAxKSk7CisgICAgaWYgKCpvdXQgIT0gTlVMTCkKKyAgICB7CisJTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgZmxhZ3MsIGluLCBpbmxlbiwgKm91dCwgKm91dGxlbik7CisJKCpvdXQpWypvdXRsZW5dID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBDYWxsIFdpZGVDaGFyVG9NdWx0aUJ5dGUoKSBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVzdWx0LgorICogUmV0dXJucyB0aGUgcmVzdWx0IGluICIqb3V0WypvdXRsZW5dIiB3aXRoIGFuIGV4dHJhIE5VTCBhcHBlbmRlZC4KKyAqLworICAgIHZvaWQKK1dpZGVDaGFyVG9NdWx0aUJ5dGVfYWxsb2MoVUlOVCBjcCwgRFdPUkQgZmxhZ3MsCisJTFBDV1NUUiBpbiwgaW50IGlubGVuLAorCUxQU1RSICpvdXQsIGludCAqb3V0bGVuLAorCUxQQ1NUUiBkZWYsIExQQk9PTCB1c2VkZGVmKQoreworICAgICpvdXRsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKGNwLCBmbGFncywgaW4sIGlubGVuLCBOVUxMLCAwLCBkZWYsIHVzZWRkZWYpOworICAgIC8qIEFkZCBvbmUgb25lIGJ5dGUgdG8gYXZvaWQgYSB6ZXJvLWxlbmd0aCBhbGxvYygpLiAqLworICAgICpvdXQgPSBhbGxvYygodW5zaWduZWQpKm91dGxlbiArIDEpOworICAgIGlmICgqb3V0ICE9IE5VTEwpCisgICAgeworCVdpZGVDaGFyVG9NdWx0aUJ5dGUoY3AsIGZsYWdzLCBpbiwgaW5sZW4sICpvdXQsICpvdXRsZW4sIGRlZiwgdXNlZGRlZik7CisJKCpvdXQpWypvdXRsZW5dID0gMDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBGRUFUX01CWVRFICovCisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorLyoKKyAqIENsaXBib2FyZCBzdHVmZiwgZm9yIGN1dHRpbmcgYW5kIHBhc3RpbmcgdGV4dCB0byBvdGhlciB3aW5kb3dzLgorICovCisKKy8qIFR5cGUgdXNlZCBmb3IgdGhlIGNsaXBib2FyZCB0eXBlIG9mIFZpbSdzIGRhdGEuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCB0eXBlOwkJLyogTUNIQVIsIE1CTE9DSyBvciBNTElORSAqLworICAgIGludCB0eHRsZW47CQkvKiBsZW5ndGggb2YgQ0ZfVEVYVCBpbiBieXRlcyAqLworICAgIGludCB1Y3NsZW47CQkvKiBsZW5ndGggb2YgQ0ZfVU5JQ09ERVRFWFQgaW4gd29yZHMgKi8KKyAgICBpbnQgcmF3bGVuOwkJLyogbGVuZ3RoIG9mIGNsaXBfc3Rhci5mb3JtYXRfcmF3LCBpbmNsdWRpbmcgZW5jb2RpbmcsCisJCQkgICBleGNsdWRpbmcgdGVybWluYXRpbmcgTlVMICovCit9IFZpbUNsaXBUeXBlX3Q7CisKKy8qCisgKiBNYWtlIHZpbSB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgUmV0dXJuIE9LIHVwb24gc3VjY2Vzcy4KKyAqLworICAgIGludAorY2xpcF9tY2hfb3duX3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKK3sKKyAgICAvKgorICAgICAqIE5ldmVyIGFjdHVhbGx5IG93biB0aGUgY2xpcGJvYXJkLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzIHRoZQorICAgICAqIGNsaXBib2FyZCwgd2UgZG9uJ3Qgd2FudCB0byB0aGluayB0aGF0IHdlIHN0aWxsIG93biBpdC4KKyAgICAgKi8KKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIE1ha2UgdmltIE5PVCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICovCisgICAgdm9pZAorY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgLyogTm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgKi8KK30KKworLyoKKyAqIENvcHkgInN0clsqc2l6ZV0iIGludG8gYWxsb2NhdGVkIG1lbW9yeSwgY2hhbmdpbmcgQ1ItTkwgdG8gTkwuCisgKiBSZXR1cm4gdGhlIGFsbG9jYXRlZCByZXN1bHQgYW5kIHRoZSBzaXplIGluICIqc2l6ZSIuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjcm5sX3RvX25sKGNvbnN0IGNoYXJfdSAqc3RyLCBpbnQgKnNpemUpCit7CisgICAgaW50CQlwb3MgPSAwOworICAgIGludAkJc3RyX2xlbiA9ICpzaXplOworICAgIGNoYXJfdQkqcmV0OworICAgIGNoYXJfdQkqcmV0cDsKKworICAgIC8qIEF2b2lkIGFsbG9jYXRpbmcgemVybyBieXRlcywgaXQgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UuICovCisgICAgcmV0ID0gbGFsbG9jKChsb25nX3UpKHN0cl9sZW4gPT0gMCA/IDEgOiBzdHJfbGVuKSwgVFJVRSk7CisgICAgaWYgKHJldCAhPSBOVUxMKQorICAgIHsKKwlyZXRwID0gcmV0OworCWZvciAocG9zID0gMDsgcG9zIDwgc3RyX2xlbjsgKytwb3MpCisJeworCSAgICBpZiAoc3RyW3Bvc10gPT0gJ1xyJyAmJiBzdHJbcG9zICsgMV0gPT0gJ1xuJykKKwkgICAgeworCQkrK3BvczsKKwkJLS0oKnNpemUpOworCSAgICB9CisJICAgICpyZXRwKysgPSBzdHJbcG9zXTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBOb3RlOiB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIG9ubHkgZ3VhcmFudGVlZCB0byB3b3JrIHdoZW4gdXNpbmcKKyAqIHZhbGlkIE1TLVdpbmRvd3MgY29kZXBhZ2VzIG9yIHdoZW4gaWNvbnYoKSBpcyBhdmFpbGFibGUuCisgKi8KKworLyoKKyAqIENvbnZlcnQgInN0ciIgZnJvbSAnZW5jb2RpbmcnIHRvIFVDUy0yLgorICogSW5wdXQgaW4gInN0ciIgd2l0aCBsZW5ndGggIipsZW5wIi4gIFdoZW4gImxlbnAiIGlzIE5VTEwsIHVzZSBzdHJsZW4oKS4KKyAqIE91dHB1dCBpcyByZXR1cm5lZCBhcyBhbiBhbGxvY2F0ZWQgc3RyaW5nLiAgIipsZW5wIiBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZgorICogdGhlIHJlc3VsdC4gIEEgdHJhaWxpbmcgTlVMIGlzIGFsd2F5cyBhZGRlZC4KKyAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBzaG9ydF91ICoKK2VuY190b191Y3MyKGNoYXJfdSAqc3RyLCBpbnQgKmxlbnApCit7CisgICAgdmltY29udl9UCWNvbnY7CisgICAgV0NIQVIJKnJldDsKKyAgICBjaGFyX3UJKmFsbG9jYnVmID0gTlVMTDsKKyAgICBpbnQJCWxlbl9sb2M7CisgICAgaW50CQlsZW5ndGg7CisKKyAgICBpZiAobGVucCA9PSBOVUxMKQorICAgIHsKKwlsZW5fbG9jID0gU1RSTEVOKHN0cikgKyAxOworCWxlbnAgPSAmbGVuX2xvYzsKKyAgICB9CisKKyAgICBpZiAoZW5jX2NvZGVwYWdlID4gMCkKKyAgICB7CisJLyogV2UgY2FuIGRvIGFueSBDUCMjIyAtPiBVQ1MtMiBpbiBvbmUgcGFzcywgYW5kIHdlIGNhbiBkbyBpdAorCSAqIHdpdGhvdXQgaWNvbnYoKSAoY29udmVydF8qIG1heSBuZWVkIGljb252KS4gKi8KKwlNdWx0aUJ5dGVUb1dpZGVDaGFyX2FsbG9jKGVuY19jb2RlcGFnZSwgMCwgc3RyLCAqbGVucCwgJnJldCwgJmxlbmd0aCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogVXNlICJsYXRpbjEiIGJ5IGRlZmF1bHQsIHdlIG1pZ2h0IGJlIGNhbGxlZCBiZWZvcmUgd2UgaGF2ZSBwX2VuYworCSAqIHNldCB1cC4gIENvbnZlcnQgdG8gdXRmLTggZmlyc3QsIHdvcmtzIGJldHRlciB3aXRoIGljb252KCkuICBEb2VzCisJICogbm90aGluZyBpZiAnZW5jb2RpbmcnIGlzICJ1dGYtOCIuICovCisJY29udi52Y190eXBlID0gQ09OVl9OT05FOworCWlmIChjb252ZXJ0X3NldHVwKCZjb252LCBwX2VuYyA/IHBfZW5jIDogKGNoYXJfdSAqKSJsYXRpbjEiLAorCQkJCQkJICAgKGNoYXJfdSAqKSJ1dGYtOCIpID09IEZBSUwpCisJICAgIHJldHVybiBOVUxMOworCWlmIChjb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgc3RyID0gYWxsb2NidWYgPSBzdHJpbmdfY29udmVydCgmY29udiwgc3RyLCBsZW5wKTsKKwkgICAgaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl9CisJY29udmVydF9zZXR1cCgmY29udiwgTlVMTCwgTlVMTCk7CisKKwlsZW5ndGggPSB1dGY4X3RvX3VjczIoc3RyLCAqbGVucCwgTlVMTCwgTlVMTCk7CisJcmV0ID0gKFdDSEFSICopYWxsb2MoKHVuc2lnbmVkKSgobGVuZ3RoICsgMSkgKiBzaXplb2YoV0NIQVIpKSk7CisJaWYgKHJldCAhPSBOVUxMKQorCXsKKwkgICAgdXRmOF90b191Y3MyKHN0ciwgKmxlbnAsIChzaG9ydF91ICopcmV0LCBOVUxMKTsKKwkgICAgcmV0W2xlbmd0aF0gPSAwOworCX0KKworCXZpbV9mcmVlKGFsbG9jYnVmKTsKKyAgICB9CisKKyAgICAqbGVucCA9IGxlbmd0aDsKKyAgICByZXR1cm4gKHNob3J0X3UgKilyZXQ7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIFVDUy0yIHN0cmluZyB0byAnZW5jb2RpbmcnLgorICogSW5wdXQgaW4gInN0ciIgd2l0aCBsZW5ndGggKGNvdW50ZWQgaW4gd2lkZSBjaGFyYWN0ZXJzKSAiKmxlbnAiLiAgV2hlbgorICogImxlbnAiIGlzIE5VTEwsIHVzZSB3Y3NsZW4oKS4KKyAqIE91dHB1dCBpcyByZXR1cm5lZCBhcyBhbiBhbGxvY2F0ZWQgc3RyaW5nLiAgSWYgIipsZW5wIiBpcyBub3QgTlVMTCBpdCBpcworICogc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdC4KKyAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBjaGFyX3UgKgordWNzMl90b19lbmMoc2hvcnRfdSAqc3RyLCBpbnQgKmxlbnApCit7CisgICAgdmltY29udl9UCWNvbnY7CisgICAgY2hhcl91CSp1dGY4X3N0ciA9IE5VTEwsICplbmNfc3RyID0gTlVMTDsKKyAgICBpbnQJCWxlbl9sb2M7CisKKyAgICBpZiAobGVucCA9PSBOVUxMKQorICAgIHsKKwlsZW5fbG9jID0gd2NzbGVuKHN0cikgKyAxOworCWxlbnAgPSAmbGVuX2xvYzsKKyAgICB9CisKKyAgICBpZiAoZW5jX2NvZGVwYWdlID4gMCkKKyAgICB7CisJLyogV2UgY2FuIGRvIGFueSBVQ1MtMiAtPiBDUCMjIyBpbiBvbmUgcGFzcy4gKi8KKwlpbnQgbGVuZ3RoOworCisJV2lkZUNoYXJUb011bHRpQnl0ZV9hbGxvYyhlbmNfY29kZXBhZ2UsIDAsIHN0ciwgKmxlbnAsCisJCQkJCSAgICAoTFBTVFIgKikmZW5jX3N0ciwgJmxlbmd0aCwgMCwgMCk7CisJKmxlbnAgPSBsZW5ndGg7CisJcmV0dXJuIGVuY19zdHI7CisgICAgfQorCisgICAgLyogQXZvaWQgYWxsb2NhdGluZyB6ZXJvIGJ5dGVzLCBpdCBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4gKi8KKyAgICB1dGY4X3N0ciA9IGFsbG9jKHVjczJfdG9fdXRmOChzdHIsICpsZW5wID09IDAgPyAxIDogKmxlbnAsIE5VTEwpKTsKKyAgICBpZiAodXRmOF9zdHIgIT0gTlVMTCkKKyAgICB7CisJKmxlbnAgPSB1Y3MyX3RvX3V0Zjgoc3RyLCAqbGVucCwgdXRmOF9zdHIpOworCisJLyogV2UgbWlnaHQgYmUgY2FsbGVkIGJlZm9yZSB3ZSBoYXZlIHBfZW5jIHNldCB1cC4gKi8KKwljb252LnZjX3R5cGUgPSBDT05WX05PTkU7CisJY29udmVydF9zZXR1cCgmY29udiwgKGNoYXJfdSAqKSJ1dGYtOCIsCisJCQkJCSAgICBwX2VuYz8gcF9lbmM6IChjaGFyX3UgKikibGF0aW4xIik7CisJaWYgKGNvbnYudmNfdHlwZSA9PSBDT05WX05PTkUpCisJeworCSAgICAvKiBwX2VuYyBpcyB1dGYtOCwgc28gd2UncmUgZG9uZS4gKi8KKwkgICAgZW5jX3N0ciA9IHV0Zjhfc3RyOworCX0KKwllbHNlCisJeworCSAgICBlbmNfc3RyID0gc3RyaW5nX2NvbnZlcnQoJmNvbnYsIHV0Zjhfc3RyLCBsZW5wKTsKKwkgICAgdmltX2ZyZWUodXRmOF9zdHIpOworCX0KKworCWNvbnZlcnRfc2V0dXAoJmNvbnYsIE5VTEwsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBlbmNfc3RyOworfQorI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHB1dCBpdCBpbiB0aGUgY2xpcGJvYXJkIHJlZ2lzdGVyLgorICoKKyAqIE5PVEU6IE11c3QgdXNlIEdsb2JhbExvY2svVW5sb2NrIGhlcmUgdG8gZW5zdXJlIFdpbjMycyBjb21wYXRpYmlsaXR5LgorICogT24gTlQvVzk1IHRoZSBjbGlwYm9hcmQgZGF0YSBpcyBhIGZpeGVkIGdsb2JhbCBtZW1vcnkgb2JqZWN0IGFuZAorICogc28gaXRzIGhhbmRsZSA9IGl0cyBwb2ludGVyLgorICogT24gV2luMzJzLCBob3dldmVyLCBjby1vcGVyYXRpb24gd2l0aCB0aGUgV2luMTYgc3lzdGVtIG1lYW5zIHRoYXQKKyAqIHRoZSBjbGlwYm9hcmQgZGF0YSBpcyBtb3ZlYWJsZSBhbmQgaXRzIGhhbmRsZSBpcyBub3QgYSBwb2ludGVyIGF0IGFsbCwKKyAqIHNvIHdlIGNhbid0IGp1c3QgY2FzdCB0aGUgcmV0dXJuIHZhbHVlIG9mIEdldENsaXBib2FyZERhdGEgdG8gKGNoYXJfdSopLgorICogPFZOPgorICovCisgICAgdm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCit7CisgICAgVmltQ2xpcFR5cGVfdAltZXRhZGF0YSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKKyAgICBIR0xPQkFMCQloTWVtID0gTlVMTDsKKyAgICBjaGFyX3UJCSpzdHIgPSBOVUxMOworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChXSU4zMjY0KQorICAgIGNoYXJfdQkJKnRvX2ZyZWUgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorICAgIEhHTE9CQUwJCXJhd2ggPSBOVUxMOworI2VuZGlmCisgICAgY2hhcl91CQkqaE1lbVN0ciA9IE5VTEw7CisgICAgaW50CQkJc3RyX3NpemUgPSAwOworICAgIGludAkJCW1heGxlbjsKKyAgICBzaXplX3QJCW47CisKKyAgICAvKgorICAgICAqIERvbid0IHBhc3MgR2V0QWN0aXZlV2luZG93KCkgYXMgYW4gYXJndW1lbnQgdG8gT3BlbkNsaXBib2FyZCgpIGJlY2F1c2UKKyAgICAgKiB0aGVuIHdlIGNhbid0IHBhc3RlIGJhY2sgaW50byB0aGUgc2FtZSB3aW5kb3cgZm9yIHNvbWUgcmVhc29uIC0gd2ViYi4KKyAgICAgKi8KKyAgICBpZiAoIU9wZW5DbGlwYm9hcmQoTlVMTCkpCisJcmV0dXJuOworCisgICAgLyogQ2hlY2sgZm9yIHZpbSdzIG93biBjbGlwYm9hcmQgZm9ybWF0IGZpcnN0LiAgVGhpcyBvbmx5IGdldHMgdGhlIHR5cGUgb2YKKyAgICAgKiB0aGUgZGF0YSwgc3RpbGwgbmVlZCB0byB1c2UgQ0ZfVU5JQ09ERVRFWFQgb3IgQ0ZfVEVYVCBmb3IgdGhlIHRleHQuICovCisgICAgaWYgKElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKGNiZC0+Zm9ybWF0KSkKKyAgICB7CisJVmltQ2xpcFR5cGVfdAkqbWV0YV9wOworCUhHTE9CQUwJCW1ldGFfaDsKKworCS8qIFdlIGhhdmUgbWV0YWRhdGEgb24gdGhlIGNsaXBib2FyZDsgdHJ5IHRvIGdldCBpdC4gKi8KKwlpZiAoKG1ldGFfaCA9IEdldENsaXBib2FyZERhdGEoY2JkLT5mb3JtYXQpKSAhPSBOVUxMCisJCSYmIChtZXRhX3AgPSAoVmltQ2xpcFR5cGVfdCAqKUdsb2JhbExvY2sobWV0YV9oKSkgIT0gTlVMTCkKKwl7CisJICAgIC8qIFRoZSBzaXplIG9mICJWaW1DbGlwVHlwZV90IiBjaGFuZ2VkLCAicmF3bGVuIiB3YXMgYWRkZWQgbGF0ZXIuCisJICAgICAqIE9ubHkgY29weSB3aGF0IGlzIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCisJICAgIG4gPSBzaXplb2YoVmltQ2xpcFR5cGVfdCk7CisJICAgIGlmIChHbG9iYWxTaXplKG1ldGFfaCkgPCBuKQorCQluID0gR2xvYmFsU2l6ZShtZXRhX2gpOworCSAgICBtZW1jcHkoJm1ldGFkYXRhLCBtZXRhX3AsIG4pOworCSAgICBHbG9iYWxVbmxvY2sobWV0YV9oKTsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIENoZWNrIGZvciBWaW0ncyByYXcgY2xpcGJvYXJkIGZvcm1hdCBmaXJzdC4gIFRoaXMgaXMgdXNlZCB3aXRob3V0CisgICAgICogY29udmVyc2lvbiwgYnV0IG9ubHkgaWYgJ2VuY29kaW5nJyBtYXRjaGVzLiAqLworICAgIGlmIChJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShjYmQtPmZvcm1hdF9yYXcpCisJCQkJICAgICAgJiYgbWV0YWRhdGEucmF3bGVuID4gKGludClTVFJMRU4ocF9lbmMpKQorICAgIHsKKwkvKiBXZSBoYXZlIHJhdyBkYXRhIG9uIHRoZSBjbGlwYm9hcmQ7IHRyeSB0byBnZXQgaXQuICovCisJaWYgKChyYXdoID0gR2V0Q2xpcGJvYXJkRGF0YShjYmQtPmZvcm1hdF9yYXcpKSAhPSBOVUxMKQorCXsKKwkgICAgY2hhcl91CSpyYXdwOworCisJICAgIHJhd3AgPSAoY2hhcl91ICopR2xvYmFsTG9jayhyYXdoKTsKKwkgICAgaWYgKHJhd3AgIT0gTlVMTCAmJiBTVFJDTVAocF9lbmMsIHJhd3ApID09IDApCisJICAgIHsKKwkJbiA9IFNUUkxFTihwX2VuYykgKyAxOworCQlzdHIgPSByYXdwICsgbjsKKwkJc3RyX3NpemUgPSBtZXRhZGF0YS5yYXdsZW4gLSBuOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlHbG9iYWxVbmxvY2socmF3aCk7CisJCXJhd2ggPSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkKKyAgICAvKiBUcnkgdG8gZ2V0IHRoZSBjbGlwYm9hcmQgaW4gVW5pY29kZSBpZiBpdCdzIG5vdCBhbiBlbXB0eSBzdHJpbmcuICovCisgICAgaWYgKElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiBtZXRhZGF0YS51Y3NsZW4gIT0gMCkKKyAgICB7CisJSEdMT0JBTCBoTWVtVzsKKworCWlmICgoaE1lbVcgPSBHZXRDbGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhUKSkgIT0gTlVMTCkKKwl7CisJICAgIFdDSEFSICpoTWVtV3N0ciA9IChXQ0hBUiAqKUdsb2JhbExvY2soaE1lbVcpOworCisJICAgIC8qIFVzZSB0aGUgbGVuZ3RoIG9mIG91ciBtZXRhZGF0YSBpZiBwb3NzaWJsZSwgYnV0IGxpbWl0IGl0IHRvIHRoZQorCSAgICAgKiBHbG9iYWxTaXplKCkgZm9yIHNhZmV0eS4gKi8KKwkgICAgbWF4bGVuID0gR2xvYmFsU2l6ZShoTWVtVykgLyBzaXplb2YoV0NIQVIpOworCSAgICBpZiAobWV0YWRhdGEudWNzbGVuID49IDApCisJICAgIHsKKwkJaWYgKG1ldGFkYXRhLnVjc2xlbiA+IG1heGxlbikKKwkJICAgIHN0cl9zaXplID0gbWF4bGVuOworCQllbHNlCisJCSAgICBzdHJfc2l6ZSA9IG1ldGFkYXRhLnVjc2xlbjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZm9yIChzdHJfc2l6ZSA9IDA7IHN0cl9zaXplIDwgbWF4bGVuOyArK3N0cl9zaXplKQorCQkgICAgaWYgKGhNZW1Xc3RyW3N0cl9zaXplXSA9PSBOVUwpCisJCQlicmVhazsKKwkgICAgfQorCSAgICB0b19mcmVlID0gc3RyID0gdWNzMl90b19lbmMoKHNob3J0X3UgKiloTWVtV3N0ciwgJnN0cl9zaXplKTsKKwkgICAgR2xvYmFsVW5sb2NrKGhNZW1XKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIC8qIEdldCB0aGUgY2xpcGJvYXJkIGluIHRoZSBBY3RpdmUgY29kZXBhZ2UuICovCisgICAgaWYgKElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1RFWFQpKQorICAgIHsKKwlpZiAoKGhNZW0gPSBHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpKSAhPSBOVUxMKQorCXsKKwkgICAgc3RyID0gaE1lbVN0ciA9IChjaGFyX3UgKilHbG9iYWxMb2NrKGhNZW0pOworCisJICAgIC8qIFRoZSBsZW5ndGggaXMgZWl0aGVyIHdoYXQgb3VyIG1ldGFkYXRhIHNheXMgb3IgdGhlIHN0cmxlbigpLgorCSAgICAgKiBCdXQgbGltaXQgaXQgdG8gdGhlIEdsb2JhbFNpemUoKSBmb3Igc2FmZXR5LiAqLworCSAgICBtYXhsZW4gPSBHbG9iYWxTaXplKGhNZW0pOworCSAgICBpZiAobWV0YWRhdGEudHh0bGVuID49IDApCisJICAgIHsKKwkJaWYgKG1ldGFkYXRhLnR4dGxlbiA+IG1heGxlbikKKwkJICAgIHN0cl9zaXplID0gbWF4bGVuOworCQllbHNlCisJCSAgICBzdHJfc2l6ZSA9IG1ldGFkYXRhLnR4dGxlbjsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZm9yIChzdHJfc2l6ZSA9IDA7IHN0cl9zaXplIDwgbWF4bGVuOyArK3N0cl9zaXplKQorCQkgICAgaWYgKHN0cltzdHJfc2l6ZV0gPT0gTlVMKQorCQkJYnJlYWs7CisJICAgIH0KKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChXSU4zMjY0KQorCSAgICAvKiBUaGUgdGV4dCBpcyBpbiB0aGUgYWN0aXZlIGNvZGVwYWdlLiAgQ29udmVydCB0byAnZW5jb2RpbmcnLAorCSAgICAgKiBnb2luZyB0aHJvdWdoIFVDUy0yLiAqLworCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyX2FsbG9jKEdldEFDUCgpLCAwLCBzdHIsIHN0cl9zaXplLAorCQkJCQkJIChMUFdTVFIgKikmdG9fZnJlZSwgJm1heGxlbik7CisJICAgIGlmICh0b19mcmVlICE9IE5VTEwpCisJICAgIHsKKwkJc3RyX3NpemUgPSBtYXhsZW47CisJCXN0ciA9IHVjczJfdG9fZW5jKChzaG9ydF91ICopdG9fZnJlZSwgJnN0cl9zaXplKTsKKwkJaWYgKHN0ciAhPSBOVUxMKQorCQl7CisJCSAgICB2aW1fZnJlZSh0b19mcmVlKTsKKwkJICAgIHRvX2ZyZWUgPSBzdHI7CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgKnN0ciAhPSBOVUwpCisgICAgeworCWNoYXJfdSAqdGVtcF9jbGlwYm9hcmQ7CisKKwkvKiBJZiB0aGUgdHlwZSBpcyBub3Qga25vd24gZ3Vlc3MgaXQuICovCisJaWYgKG1ldGFkYXRhLnR5cGUgPT0gLTEpCisJICAgIG1ldGFkYXRhLnR5cGUgPSAodmltX3N0cmNocihzdHIsICdcbicpID09IE5VTEwpID8gTUNIQVIgOiBNTElORTsKKworCS8qIFRyYW5zbGF0ZSA8Q1I+PE5MPiBpbnRvIDxOTD4uICovCisJdGVtcF9jbGlwYm9hcmQgPSBjcm5sX3RvX25sKHN0ciwgJnN0cl9zaXplKTsKKwlpZiAodGVtcF9jbGlwYm9hcmQgIT0gTlVMTCkKKwl7CisJICAgIGNsaXBfeWFua19zZWxlY3Rpb24obWV0YWRhdGEudHlwZSwgdGVtcF9jbGlwYm9hcmQsIHN0cl9zaXplLCBjYmQpOworCSAgICB2aW1fZnJlZSh0ZW1wX2NsaXBib2FyZCk7CisJfQorICAgIH0KKworICAgIC8qIHVubG9jayB0aGUgZ2xvYmFsIG9iamVjdCAqLworICAgIGlmIChoTWVtICE9IE5VTEwpCisJR2xvYmFsVW5sb2NrKGhNZW0pOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAocmF3aCAhPSBOVUxMKQorCUdsb2JhbFVubG9jayhyYXdoKTsKKyNlbmRpZgorICAgIENsb3NlQ2xpcGJvYXJkKCk7CisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFdJTjMyNjQpCisgICAgdmltX2ZyZWUodG9fZnJlZSk7CisjZW5kaWYKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuCisgKi8KKyAgICB2b2lkCitjbGlwX21jaF9zZXRfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQoreworICAgIGNoYXJfdQkJKnN0ciA9IE5VTEw7CisgICAgVmltQ2xpcFR5cGVfdAltZXRhZGF0YTsKKyAgICBsb25nX3UJCXR4dGxlbjsKKyAgICBIR0xPQkFMCQloTWVtUmF3ID0gTlVMTDsKKyAgICBIR0xPQkFMCQloTWVtID0gTlVMTDsKKyAgICBIR0xPQkFMCQloTWVtVmltID0gTlVMTDsKKyMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFdJTjMyNjQpCisgICAgSEdMT0JBTAkJaE1lbVcgPSBOVUxMOworIyBlbmRpZgorCisgICAgLyogSWYgdGhlICcqJyByZWdpc3RlciBpc24ndCBhbHJlYWR5IGZpbGxlZCBpbiwgZmlsbCBpdCBpbiBub3cgKi8KKyAgICBjYmQtPm93bmVkID0gVFJVRTsKKyAgICBjbGlwX2dldF9zZWxlY3Rpb24oY2JkKTsKKyAgICBjYmQtPm93bmVkID0gRkFMU0U7CisKKyAgICAvKiBHZXQgdGhlIHRleHQgdG8gYmUgcHV0IG9uIHRoZSBjbGlwYm9hcmQsIHdpdGggQ1ItTEYuICovCisgICAgbWV0YWRhdGEudHlwZSA9IGNsaXBfY29udmVydF9zZWxlY3Rpb24oJnN0ciwgJnR4dGxlbiwgY2JkKTsKKyAgICBpZiAobWV0YWRhdGEudHlwZSA8IDApCisJcmV0dXJuOworICAgIG1ldGFkYXRhLnR4dGxlbiA9IChpbnQpdHh0bGVuOworICAgIG1ldGFkYXRhLnVjc2xlbiA9IDA7CisgICAgbWV0YWRhdGEucmF3bGVuID0gMDsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBBbHdheXMgc2V0IHRoZSByYXcgYnl0ZXM6ICdlbmNvZGluZycsIE5VTCBhbmQgdGhlIHRleHQuICBUaGlzIGlzIHVzZWQKKyAgICAgKiB3aGVuIGNvcHkvcGFzdGUgZnJvbS90byBWaW0gd2l0aCB0aGUgc2FtZSAnZW5jb2RpbmcnLCBzbyB0aGF0IGlsbGVnYWwKKyAgICAgKiBieXRlcyBjYW4gYWxzbyBiZSBjb3BpZWQgYW5kIG5vIGNvbnZlcnNpb24gaXMgbmVlZGVkLiAqLworICAgIHsKKwlMUFNUUiBscHN6TWVtUmF3OworCisJbWV0YWRhdGEucmF3bGVuID0gdHh0bGVuICsgU1RSTEVOKHBfZW5jKSArIDE7CisJaE1lbVJhdyA9IChMUFNUUilHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFIHwgR01FTV9EREVTSEFSRSwKKwkJCQkJCQkgbWV0YWRhdGEucmF3bGVuICsgMSk7CisJbHBzek1lbVJhdyA9IChMUFNUUilHbG9iYWxMb2NrKGhNZW1SYXcpOworCWlmIChscHN6TWVtUmF3ICE9IE5VTEwpCisJeworCSAgICBTVFJDUFkobHBzek1lbVJhdywgcF9lbmMpOworCSAgICBtZW1jcHkobHBzek1lbVJhdyArIFNUUkxFTihwX2VuYykgKyAxLCBzdHIsIHR4dGxlbiArIDEpOworCSAgICBHbG9iYWxVbmxvY2soaE1lbVJhdyk7CisJfQorCWVsc2UKKwkgICAgbWV0YWRhdGEucmF3bGVuID0gMDsKKyAgICB9CisjZW5kaWYKKworIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkKKyAgICB7CisJV0NIQVIJCSpvdXQ7CisJaW50CQlsZW4gPSBtZXRhZGF0YS50eHRsZW47CisKKwkvKiBDb252ZXJ0IHRoZSB0ZXh0IHRvIFVDUy0yLiBUaGlzIGlzIHB1dCBvbiB0aGUgY2xpcGJvYXJkIGFzCisJICogQ0ZfVU5JQ09ERVRFWFQuICovCisJb3V0ID0gKFdDSEFSICopZW5jX3RvX3VjczIoc3RyLCAmbGVuKTsKKwlpZiAob3V0ICE9IE5VTEwpCisJeworCSAgICBXQ0hBUiAqbHBzek1lbVc7CisKKwkgICAgLyogQ29udmVydCB0aGUgdGV4dCBmb3IgQ0ZfVEVYVCB0byBBY3RpdmUgY29kZXBhZ2UuIE90aGVyd2lzZSBpdCdzCisJICAgICAqIHBfZW5jLCB3aGljaCBoYXMgbm8gcmVsYXRpb24gdG8gdGhlIEFjdGl2ZSBjb2RlcGFnZS4gKi8KKwkgICAgbWV0YWRhdGEudHh0bGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShHZXRBQ1AoKSwgMCwgb3V0LCBsZW4sCisJCQkJCQkJICAgICAgIE5VTEwsIDAsIDAsIDApOworCSAgICB2aW1fZnJlZShzdHIpOworCSAgICBzdHIgPSAoY2hhcl91ICopYWxsb2MoKHVuc2lnbmVkKShtZXRhZGF0YS50eHRsZW4gPT0gMCA/IDEKKwkJCQkJCQkgIDogbWV0YWRhdGEudHh0bGVuKSk7CisJICAgIGlmIChzdHIgPT0gTlVMTCkKKwkgICAgeworCQl2aW1fZnJlZShvdXQpOworCQlyZXR1cm47CQkvKiBvdXQgb2YgbWVtb3J5ICovCisJICAgIH0KKwkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShHZXRBQ1AoKSwgMCwgb3V0LCBsZW4sCisJCQkJCQkgIHN0ciwgbWV0YWRhdGEudHh0bGVuLCAwLCAwKTsKKworCSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBVQ1MtMiB0ZXh0LCBhZGQgb25lIE5VTCB3b3JkIHRvCisJICAgICAqIHRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAqLworCSAgICBoTWVtVyA9IChMUFNUUilHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFIHwgR01FTV9EREVTSEFSRSwKKwkJCQkJCSAgIChsZW4gKyAxKSAqIHNpemVvZihXQ0hBUikpOworCSAgICBscHN6TWVtVyA9IChXQ0hBUiAqKUdsb2JhbExvY2soaE1lbVcpOworCSAgICBpZiAobHBzek1lbVcgIT0gTlVMTCkKKwkgICAgeworCQltZW1jcHkobHBzek1lbVcsIG91dCwgbGVuICogc2l6ZW9mKFdDSEFSKSk7CisJCWxwc3pNZW1XW2xlbl0gPSBOVUw7CisJCUdsb2JhbFVubG9jayhoTWVtVyk7CisJICAgIH0KKwkgICAgdmltX2ZyZWUob3V0KTsKKwkgICAgbWV0YWRhdGEudWNzbGVuID0gbGVuOworCX0KKyAgICB9CisjIGVuZGlmCisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0ZXh0LCBhZGQgb25lIE5VTCBieXRlIHRvIHRlcm1pbmF0ZSB0aGUgc3RyaW5nLgorICAgICAqLworICAgIGhNZW0gPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFIHwgR01FTV9EREVTSEFSRSwgbWV0YWRhdGEudHh0bGVuICsgMSk7CisgICAgeworCUxQU1RSIGxwc3pNZW0gPSAoTFBTVFIpR2xvYmFsTG9jayhoTWVtKTsKKworCWlmIChscHN6TWVtKQorCXsKKwkgICAgU1RSTkNQWShscHN6TWVtLCBzdHIsIG1ldGFkYXRhLnR4dGxlbik7CisJICAgIGxwc3pNZW1bbWV0YWRhdGEudHh0bGVuXSA9IE5VTDsKKwkgICAgR2xvYmFsVW5sb2NrKGhNZW0pOworCX0KKyAgICB9CisKKyAgICAvKiBTZXQgdXAgbWV0YWRhdGE6ICovCisgICAgeworCVZpbUNsaXBUeXBlX3QgKmxwc3pNZW1WaW0gPSBOVUxMOworCisJaE1lbVZpbSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEV8R01FTV9EREVTSEFSRSwKKwkJCQkJCSAgICAgICBzaXplb2YoVmltQ2xpcFR5cGVfdCkpOworCWxwc3pNZW1WaW0gPSAoVmltQ2xpcFR5cGVfdCAqKUdsb2JhbExvY2soaE1lbVZpbSk7CisJbWVtY3B5KGxwc3pNZW1WaW0sICZtZXRhZGF0YSwgc2l6ZW9mKG1ldGFkYXRhKSk7CisJR2xvYmFsVW5sb2NrKGhNZW1WaW0pOworICAgIH0KKworICAgIC8qCisgICAgICogT3BlbiB0aGUgY2xpcGJvYXJkLCBjbGVhciBpdCBhbmQgcHV0IG91ciB0ZXh0IG9uIGl0LgorICAgICAqIEFsd2F5cyBzZXQgb3VyIFZpbSBmb3JtYXQuICBQdXQgVW5pY29kZSBhbmQgcGxhaW4gdGV4dCBvbiBpdC4KKyAgICAgKgorICAgICAqIERvbid0IHBhc3MgR2V0QWN0aXZlV2luZG93KCkgYXMgYW4gYXJndW1lbnQgdG8gT3BlbkNsaXBib2FyZCgpCisgICAgICogYmVjYXVzZSB0aGVuIHdlIGNhbid0IHBhc3RlIGJhY2sgaW50byB0aGUgc2FtZSB3aW5kb3cgZm9yIHNvbWUKKyAgICAgKiByZWFzb24gLSB3ZWJiLgorICAgICAqLworICAgIGlmIChPcGVuQ2xpcGJvYXJkKE5VTEwpKQorICAgIHsKKwlpZiAoRW1wdHlDbGlwYm9hcmQoKSkKKwl7CisJICAgIFNldENsaXBib2FyZERhdGEoY2JkLT5mb3JtYXQsIGhNZW1WaW0pOworCSAgICBoTWVtVmltID0gMDsKKyMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFdJTjMyNjQpCisJICAgIGlmIChoTWVtVyAhPSBOVUxMKQorCSAgICB7CisJCWlmIChTZXRDbGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhULCBoTWVtVykgIT0gTlVMTCkKKwkJICAgIGhNZW1XID0gTlVMTDsKKwkgICAgfQorIyBlbmRpZgorCSAgICAvKiBBbHdheXMgdXNlIENGX1RFWFQuICBPbiBXaW45OCBOb3RlcGFkIHdvbid0IG9idGFpbiB0aGUKKwkgICAgICogQ0ZfVU5JQ09ERVRFWFQgdGV4dCwgb25seSBDRl9URVhULiAqLworCSAgICBTZXRDbGlwYm9hcmREYXRhKENGX1RFWFQsIGhNZW0pOworCSAgICBoTWVtID0gMDsKKwl9CisJQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICB2aW1fZnJlZShzdHIpOworICAgIC8qIEZyZWUgYW55IGFsbG9jYXRpb25zIHdlIGRpZG4ndCBnaXZlIHRvIHRoZSBjbGlwYm9hcmQ6ICovCisgICAgaWYgKGhNZW1SYXcpCisJR2xvYmFsRnJlZShoTWVtUmF3KTsKKyAgICBpZiAoaE1lbSkKKwlHbG9iYWxGcmVlKGhNZW0pOworIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoV0lOMzI2NCkKKyAgICBpZiAoaE1lbVcpCisJR2xvYmFsRnJlZShoTWVtVyk7CisjIGVuZGlmCisgICAgaWYgKGhNZW1WaW0pCisJR2xvYmFsRnJlZShoTWVtVmltKTsKK30KKworI2VuZGlmIC8qIEZFQVRfQ0xJUEJPQVJEICovCisKKworLyoKKyAqIERlYnVnZ2luZyBoZWxwZXI6IGV4cG9zZSB0aGUgTUNIX1dSSVRFX0RVTVAgc3R1ZmYgdG8gb3RoZXIgbW9kdWxlcworICovCisgICAgdm9pZAorRHVtcFB1dFMoCisgICAgY29uc3QgY2hhciAqcHN6KQoreworIyBpZmRlZiBNQ0hfV1JJVEVfRFVNUAorICAgIGlmIChmZER1bXApCisgICAgeworCWZwdXRzKHBzeiwgZmREdW1wKTsKKwlpZiAocHN6W3N0cmxlbihwc3opIC0gMV0gIT0gJ1xuJykKKwkgICAgZnB1dGMoJ1xuJywgZmREdW1wKTsKKwlmZmx1c2goZmREdW1wKTsKKyAgICB9CisjIGVuZGlmCit9CisKKyNpZmRlZiBfREVCVUcKKwordm9pZCBfX2NkZWNsCitUcmFjZSgKKyAgICBjaGFyICpwc3pGb3JtYXQsCisgICAgLi4uKQoreworICAgIENIQVIgc3pCdWZmWzIwNDhdOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIHBzekZvcm1hdCk7CisgICAgdnNwcmludGYoc3pCdWZmLCBwc3pGb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIE91dHB1dERlYnVnU3RyaW5nKHN6QnVmZik7Cit9CisKKyNlbmRpZiAvL19ERUJVRworCisjaWZkZWYgSEFWRV9HRVRDT05TT0xFSFdORAorIyBpZiBkZWZpbmVkKEZFQVRfVElUTEUpICYmIGRlZmluZWQoV0lOMzI2NCkKK2V4dGVybiBIV05EIGdfaFduZDsJLyogVGhpcyBpcyBpbiBvc193aW4zMi5jLiAqLworIyBlbmRpZgorCisvKgorICogU2hvd2luZyB0aGUgcHJpbnRlciBkaWFsb2cgaXMgdHJpY2t5IHNpbmNlIHdlIGhhdmUgbm8gR1VJCisgKiB3aW5kb3cgdG8gcGFyZW50IGl0LiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSBuZWVkZWQgdG8KKyAqIGdldCB0aGUgd2luZG93IHBhcmVudGluZyBhbmQgWi1vcmRlciB0byB3b3JrIHByb3Blcmx5LgorICovCisgICAgc3RhdGljIHZvaWQKK0dldENvbnNvbGVId25kKHZvaWQpCit7CisjIGRlZmluZSBNWV9CVUZTSVpFIDEwMjQgLy8gQnVmZmVyIHNpemUgZm9yIGNvbnNvbGUgd2luZG93IHRpdGxlcy4KKworICAgIGNoYXIgcHN6TmV3V2luZG93VGl0bGVbTVlfQlVGU0laRV07IC8vIENvbnRhaW5zIGZhYnJpY2F0ZWQgV2luZG93VGl0bGUuCisgICAgY2hhciBwc3pPbGRXaW5kb3dUaXRsZVtNWV9CVUZTSVpFXTsgLy8gQ29udGFpbnMgb3JpZ2luYWwgV2luZG93VGl0bGUuCisKKyAgICAvKiBTa2lwIGlmIGl0J3MgYWxyZWFkeSBzZXQuICovCisgICAgaWYgKHNfaHduZCAhPSAwKQorCXJldHVybjsKKworIyBpZiBkZWZpbmVkKEZFQVRfVElUTEUpICYmIGRlZmluZWQoV0lOMzI2NCkKKyAgICAvKiBXaW5kb3cgaGFuZGxlIG1heSBoYXZlIGJlZW4gZm91bmQgYnkgaW5pdCBjb2RlIChXaW5kb3dzIE5UIG9ubHkpICovCisgICAgaWYgKGdfaFduZCAhPSAwKQorICAgIHsKKwlzX2h3bmQgPSBnX2hXbmQ7CisJcmV0dXJuOworICAgIH0KKyMgZW5kaWYKKworICAgIEdldENvbnNvbGVUaXRsZShwc3pPbGRXaW5kb3dUaXRsZSwgTVlfQlVGU0laRSk7CisKKyAgICB3c3ByaW50Zihwc3pOZXdXaW5kb3dUaXRsZSwgIiVzLyVkLyVkIiwKKwkgICAgcHN6T2xkV2luZG93VGl0bGUsCisJICAgIEdldFRpY2tDb3VudCgpLAorCSAgICBHZXRDdXJyZW50UHJvY2Vzc0lkKCkpOworICAgIFNldENvbnNvbGVUaXRsZShwc3pOZXdXaW5kb3dUaXRsZSk7CisgICAgU2xlZXAoNDApOworICAgIHNfaHduZCA9IEZpbmRXaW5kb3coTlVMTCwgcHN6TmV3V2luZG93VGl0bGUpOworCisgICAgU2V0Q29uc29sZVRpdGxlKHBzek9sZFdpbmRvd1RpdGxlKTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoRkVBVF9QUklOVEVSKSAmJiAhZGVmaW5lZChGRUFUX1BPU1RTQ1JJUFQpKSB8fCBkZWZpbmVkKFBST1RPKQorCisjIGlmZGVmIFdJTjE2CisjICBkZWZpbmUgVEVYVChhKSBhCisjIGVuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXaW4zMiBwcmludGVyIHN0dWZmCisgKi8KKworc3RhdGljIEhGT05UCQlwcnRfZm9udF9oYW5kbGVzWzJdWzJdWzJdOworc3RhdGljIFBSSU5URExHCQlwcnRfZGxnOworc3RhdGljIGNvbnN0IGludAlib2xkZmFjZVsyXSA9IHtGV19SRUdVTEFSLCBGV19CT0xEfTsKK3N0YXRpYyBURVhUTUVUUklDCXBydF90bTsKK3N0YXRpYyBpbnQJCXBydF9saW5lX2hlaWdodDsKK3N0YXRpYyBpbnQJCXBydF9udW1iZXJfd2lkdGg7CitzdGF0aWMgaW50CQlwcnRfbGVmdF9tYXJnaW47CitzdGF0aWMgaW50CQlwcnRfcmlnaHRfbWFyZ2luOworc3RhdGljIGludAkJcHJ0X3RvcF9tYXJnaW47CitzdGF0aWMgY2hhcl91CQlzekFwcE5hbWVbXSA9IFRFWFQoIlZJTSIpOworc3RhdGljIEhXTkQJCWhEbGdQcmludDsKK3N0YXRpYyBpbnQJCSpiVXNlckFib3J0ID0gTlVMTDsKK3N0YXRpYyBjaGFyX3UJCSpwcnRfbmFtZSA9IE5VTEw7CisKKy8qIERlZmluZXMgd2hpY2ggYXJlIGFsc28gaW4gdmltLnJjLiAqLworI2RlZmluZSBJRENfQk9YMQkJNDAwCisjZGVmaW5lIElEQ19QUklOVFRFWFQxCQk0MDEKKyNkZWZpbmUgSURDX1BSSU5UVEVYVDIJCTQwMgorI2RlZmluZSBJRENfUFJPR1JFU1MJCTQwMworCisvKgorICogQ29udmVydCBCR1IgdG8gUkdCIGZvciBXaW5kb3dzIEdESSBjYWxscworICovCisgICAgc3RhdGljIENPTE9SUkVGCitzd2FwX21lKENPTE9SUkVGIGNvbG9ycmVmKQoreworICAgIGludCAgdGVtcDsKKyAgICBjaGFyICpwdHIgPSAoY2hhciAqKSZjb2xvcnJlZjsKKworICAgIHRlbXAgPSAqKHB0cik7CisgICAgKihwdHIgKSA9ICoocHRyICsgMik7CisgICAgKihwdHIgKyAyKSA9IHRlbXA7CisgICAgcmV0dXJuIGNvbG9ycmVmOworfQorCisgICAgc3RhdGljIEJPT0wgQ0FMTEJBQ0sKK1ByaW50RGxnUHJvYyhIV05EIGhEbGcsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyNpZmRlZiBGRUFUX0dFVFRFWFQKKyAgICBOT05DTElFTlRNRVRSSUNTIG5tOworICAgIHN0YXRpYyBIRk9OVCBoZm9udDsKKyNlbmRpZgorCisgICAgc3dpdGNoIChtZXNzYWdlKQorICAgIHsKKwljYXNlIFdNX0lOSVRESUFMT0c6CisjaWZkZWYgRkVBVF9HRVRURVhUCisJICAgIG5tLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTKTsKKwkgICAgaWYgKFN5c3RlbVBhcmFtZXRlcnNJbmZvKAorCQkJU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsCisJCQlzaXplb2YoTk9OQ0xJRU5UTUVUUklDUyksCisJCQkmbm0sCisJCQkwKSkKKwkgICAgeworCQljaGFyIGJ1ZmZbTUFYX1BBVEhdOworCQlpbnQgaTsKKworCQkvKiBUcmFuc2xhdGUgdGhlIGRpYWxvZyB0ZXh0cyAqLworCQloZm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmbm0ubGZNZXNzYWdlRm9udCk7CisJCWZvciAoaSA9IElEQ19QUklOVFRFWFQxOyBpIDw9IElEQ19QUk9HUkVTUzsgaSsrKQorCQl7CisJCSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaERsZywgaSwgV01fU0VURk9OVCwgKFdQQVJBTSloZm9udCwgMSk7CisJCSAgICBpZiAoR2V0RGxnSXRlbVRleHQoaERsZyxpLCBidWZmLCBzaXplb2YoYnVmZikpKQorCQkJU2V0RGxnSXRlbVRleHQoaERsZyxpLCBfKGJ1ZmYpKTsKKwkJfQorCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaERsZywgSURDQU5DRUwsCisJCQkJCQlXTV9TRVRGT05ULCAoV1BBUkFNKWhmb250LCAxKTsKKwkJaWYgKEdldERsZ0l0ZW1UZXh0KGhEbGcsSURDQU5DRUwsIGJ1ZmYsIHNpemVvZihidWZmKSkpCisJCSAgICBTZXREbGdJdGVtVGV4dChoRGxnLElEQ0FOQ0VMLCBfKGJ1ZmYpKTsKKwkgICAgfQorI2VuZGlmCisJICAgIFNldFdpbmRvd1RleHQoaERsZywgc3pBcHBOYW1lKTsKKwkgICAgaWYgKHBydF9uYW1lICE9IE5VTEwpCisJICAgIHsKKwkJU2V0RGxnSXRlbVRleHQoaERsZywgSURDX1BSSU5UVEVYVDIsIChMUFNUUilwcnRfbmFtZSk7CisJCXZpbV9mcmVlKHBydF9uYW1lKTsKKwkJcHJ0X25hbWUgPSBOVUxMOworCSAgICB9CisJICAgIEVuYWJsZU1lbnVJdGVtKEdldFN5c3RlbU1lbnUoaERsZywgRkFMU0UpLCBTQ19DTE9TRSwgTUZfR1JBWUVEKTsKKyNpZm5kZWYgRkVBVF9HVUkKKwkgICAgQnJpbmdXaW5kb3dUb1RvcChzX2h3bmQpOworI2VuZGlmCisJICAgIHJldHVybiBUUlVFOworCisJY2FzZSBXTV9DT01NQU5EOgorCSAgICAqYlVzZXJBYm9ydCA9IFRSVUU7CisJICAgIEVuYWJsZVdpbmRvdyhHZXRQYXJlbnQoaERsZyksIFRSVUUpOworCSAgICBEZXN0cm95V2luZG93KGhEbGcpOworCSAgICBoRGxnUHJpbnQgPSBOVUxMOworI2lmZGVmIEZFQVRfR0VUVEVYVAorCSAgICBEZWxldGVPYmplY3QoaGZvbnQpOworI2VuZGlmCisJICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyAgICBzdGF0aWMgQk9PTCBDQUxMQkFDSworQWJvcnRQcm9jKEhEQyBoZGNQcm4sIGludCBpQ29kZSkKK3sKKyAgICBNU0cgbXNnOworCisgICAgd2hpbGUgKCEqYlVzZXJBYm9ydCAmJiBQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9SRU1PVkUpKQorICAgIHsKKwlpZiAoIWhEbGdQcmludCB8fCAhSXNEaWFsb2dNZXNzYWdlKGhEbGdQcmludCwgJm1zZykpCisJeworCSAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCSAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisJfQorICAgIH0KKyAgICByZXR1cm4gISpiVXNlckFib3J0OworfQorCisjaWZuZGVmIEZFQVRfR1VJCisKKyAgICBzdGF0aWMgVUlOVCBDQUxMQkFDSworUHJpbnRIb29rUHJvYygKKwlIV05EIGhEbGcsCS8vIGhhbmRsZSB0byBkaWFsb2cgYm94CisJVUlOVCB1aU1zZywJLy8gbWVzc2FnZSBpZGVudGlmaWVyCisJV1BBUkFNIHdQYXJhbSwJLy8gbWVzc2FnZSBwYXJhbWV0ZXIKKwlMUEFSQU0gbFBhcmFtCS8vIG1lc3NhZ2UgcGFyYW1ldGVyCisJKQoreworICAgIEhXTkQJaHduZE93bmVyOworICAgIFJFQ1QJcmMsIHJjRGxnLCByY093bmVyOworICAgIFBSSU5URExHCSpwUEQ7CisKKyAgICBpZiAodWlNc2cgPT0gV01fSU5JVERJQUxPRykKKyAgICB7CisJLy8gR2V0IHRoZSBvd25lciB3aW5kb3cgYW5kIGRpYWxvZyBib3ggcmVjdGFuZ2xlcy4KKwlpZiAoKGh3bmRPd25lciA9IEdldFBhcmVudChoRGxnKSkgPT0gTlVMTCkKKwkgICAgaHduZE93bmVyID0gR2V0RGVza3RvcFdpbmRvdygpOworCisJR2V0V2luZG93UmVjdChod25kT3duZXIsICZyY093bmVyKTsKKwlHZXRXaW5kb3dSZWN0KGhEbGcsICZyY0RsZyk7CisJQ29weVJlY3QoJnJjLCAmcmNPd25lcik7CisKKwkvLyBPZmZzZXQgdGhlIG93bmVyIGFuZCBkaWFsb2cgYm94IHJlY3RhbmdsZXMgc28gdGhhdAorCS8vIHJpZ2h0IGFuZCBib3R0b20gdmFsdWVzIHJlcHJlc2VudCB0aGUgd2lkdGggYW5kCisJLy8gaGVpZ2h0LCBhbmQgdGhlbiBvZmZzZXQgdGhlIG93bmVyIGFnYWluIHRvIGRpc2NhcmQKKwkvLyBzcGFjZSB0YWtlbiB1cCBieSB0aGUgZGlhbG9nIGJveC4KKworCU9mZnNldFJlY3QoJnJjRGxnLCAtcmNEbGcubGVmdCwgLXJjRGxnLnRvcCk7CisJT2Zmc2V0UmVjdCgmcmMsIC1yYy5sZWZ0LCAtcmMudG9wKTsKKwlPZmZzZXRSZWN0KCZyYywgLXJjRGxnLnJpZ2h0LCAtcmNEbGcuYm90dG9tKTsKKworCS8vIFRoZSBuZXcgcG9zaXRpb24gaXMgdGhlIHN1bSBvZiBoYWxmIHRoZSByZW1haW5pbmcKKwkvLyBzcGFjZSBhbmQgdGhlIG93bmVyJ3Mgb3JpZ2luYWwgcG9zaXRpb24uCisKKwlTZXRXaW5kb3dQb3MoaERsZywKKwkJSFdORF9UT1AsCisJCXJjT3duZXIubGVmdCArIChyYy5yaWdodCAvIDIpLAorCQlyY093bmVyLnRvcCArIChyYy5ib3R0b20gLyAyKSwKKwkJMCwgMCwJCS8vIGlnbm9yZXMgc2l6ZSBhcmd1bWVudHMKKwkJU1dQX05PU0laRSk7CisKKwkvKiAgdGFja2xlIHRoZSBwcmludGRsZyBjb3BpZXNjdHJsIHByb2JsZW0gKi8KKwlwUEQgPSAoUFJJTlRETEcgKilsUGFyYW07CisJcFBELT5uQ29waWVzID0gKFdPUkQpcFBELT5sQ3VzdERhdGE7CisJU2V0RGxnSXRlbUludCggaERsZywgZWR0MywgcFBELT5uQ29waWVzLCBGQUxTRSApOworCS8qICBCcmluZyB0aGUgd2luZG93IHRvIHRvcCAqLworCUJyaW5nV2luZG93VG9Ub3AoR2V0UGFyZW50KGhEbGcpKTsKKwlTZXRGb3JlZ3JvdW5kV2luZG93KGhEbGcpOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorbWNoX3ByaW50X2NsZWFudXAodm9pZCkKK3sKKyAgICBpbnQgcGlmSXRhbGljOworICAgIGludCBwaWZCb2xkOworICAgIGludCBwaWZVbmRlcmxpbmU7CisKKyAgICBmb3IgKHBpZkJvbGQgPSAwOyBwaWZCb2xkIDw9IDE7IHBpZkJvbGQrKykKKwlmb3IgKHBpZkl0YWxpYyA9IDA7IHBpZkl0YWxpYyA8PSAxOyBwaWZJdGFsaWMrKykKKwkgICAgZm9yIChwaWZVbmRlcmxpbmUgPSAwOyBwaWZVbmRlcmxpbmUgPD0gMTsgcGlmVW5kZXJsaW5lKyspCisJCURlbGV0ZU9iamVjdChwcnRfZm9udF9oYW5kbGVzW3BpZkJvbGRdW3BpZkl0YWxpY11bcGlmVW5kZXJsaW5lXSk7CisKKyAgICBpZiAocHJ0X2RsZy5oREMgIT0gTlVMTCkKKwlEZWxldGVEQyhwcnRfZGxnLmhEQyk7CisgICAgaWYgKCEqYlVzZXJBYm9ydCkKKwlTZW5kTWVzc2FnZShoRGxnUHJpbnQsIFdNX0NPTU1BTkQsIDAsIDApOworfQorCisgICAgc3RhdGljIGludAordG9fZGV2aWNlX3VuaXRzKGludCBpZHgsIGludCBkcGksIGludCBwaHlzc2l6ZSwgaW50IG9mZnNldCwgaW50IGRlZl9udW1iZXIpCit7CisgICAgaW50CQlyZXQgPSAwOworICAgIGludAkJdTsKKyAgICBpbnQJCW5yOworCisgICAgdSA9IHBydF9nZXRfdW5pdChpZHgpOworICAgIGlmICh1ID09IFBSVF9VTklUX05PTkUpCisgICAgeworCXUgPSBQUlRfVU5JVF9QRVJDOworCW5yID0gZGVmX251bWJlcjsKKyAgICB9CisgICAgZWxzZQorCW5yID0gcHJpbnRlcl9vcHRzW2lkeF0ubnVtYmVyOworCisgICAgc3dpdGNoICh1KQorICAgIHsKKwljYXNlIFBSVF9VTklUX1BFUkM6CisJICAgIHJldCA9IChwaHlzc2l6ZSAqIG5yKSAvIDEwMDsKKwkgICAgYnJlYWs7CisJY2FzZSBQUlRfVU5JVF9JTkNIOgorCSAgICByZXQgPSAobnIgKiBkcGkpOworCSAgICBicmVhazsKKwljYXNlIFBSVF9VTklUX01NOgorCSAgICByZXQgPSAobnIgKiAxMCAqIGRwaSkgLyAyNTQ7CisJICAgIGJyZWFrOworCWNhc2UgUFJUX1VOSVRfUE9JTlQ6CisJICAgIHJldCA9IChuciAqIDEwICogZHBpKSAvIDcyMDsKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHJldCA8IG9mZnNldCkKKwlyZXR1cm4gMDsKKyAgICBlbHNlCisJcmV0dXJuIHJldCAtIG9mZnNldDsKK30KKworICAgIHN0YXRpYyBpbnQKK3BydF9nZXRfY3BsKHZvaWQpCit7CisgICAgaW50CQlocjsKKyAgICBpbnQJCXBoeXc7CisgICAgaW50CQlkdm9mZjsKKyAgICBpbnQJCXJldl9vZmZzZXQ7CisgICAgaW50CQlkcGk7CisjaWZkZWYgV0lOMTYKKyAgICBQT0lOVAlwYWdlc2l6ZTsKKyNlbmRpZgorCisgICAgR2V0VGV4dE1ldHJpY3MocHJ0X2RsZy5oREMsICZwcnRfdG0pOworICAgIHBydF9saW5lX2hlaWdodCA9IHBydF90bS50bUhlaWdodCArIHBydF90bS50bUV4dGVybmFsTGVhZGluZzsKKworICAgIGhyCSAgICA9IEdldERldmljZUNhcHMocHJ0X2RsZy5oREMsIEhPUlpSRVMpOworI2lmZGVmIFdJTjE2CisgICAgRXNjYXBlKHBydF9kbGcuaERDLCBHRVRQSFlTUEFHRVNJWkUsIE5VTEwsIE5VTEwsICZwYWdlc2l6ZSk7CisgICAgcGh5dyAgICA9IHBhZ2VzaXplLng7CisgICAgRXNjYXBlKHBydF9kbGcuaERDLCBHRVRQUklOVElOR09GRlNFVCwgTlVMTCwgTlVMTCwgJnBhZ2VzaXplKTsKKyAgICBkdm9mZiAgID0gcGFnZXNpemUueDsKKyNlbHNlCisgICAgcGh5dyAgICA9IEdldERldmljZUNhcHMocHJ0X2RsZy5oREMsIFBIWVNJQ0FMV0lEVEgpOworICAgIGR2b2ZmICAgPSBHZXREZXZpY2VDYXBzKHBydF9kbGcuaERDLCBQSFlTSUNBTE9GRlNFVFgpOworI2VuZGlmCisgICAgZHBpCSAgICA9IEdldERldmljZUNhcHMocHJ0X2RsZy5oREMsIExPR1BJWEVMU1gpOworCisgICAgcmV2X29mZnNldCA9IHBoeXcgLSAoZHZvZmYgKyBocik7CisKKyAgICBwcnRfbGVmdF9tYXJnaW4gPSB0b19kZXZpY2VfdW5pdHMoT1BUX1BSSU5UX0xFRlQsIGRwaSwgcGh5dywgZHZvZmYsIDEwKTsKKyAgICBpZiAocHJ0X3VzZV9udW1iZXIoKSkKKyAgICB7CisJcHJ0X251bWJlcl93aWR0aCA9IFBSSU5UX05VTUJFUl9XSURUSCAqIHBydF90bS50bUF2ZUNoYXJXaWR0aDsKKwlwcnRfbGVmdF9tYXJnaW4gKz0gcHJ0X251bWJlcl93aWR0aDsKKyAgICB9CisgICAgZWxzZQorCXBydF9udW1iZXJfd2lkdGggPSAwOworCisgICAgcHJ0X3JpZ2h0X21hcmdpbiA9IGhyIC0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9SSUdIVCwgZHBpLCBwaHl3LAorCQkJCQkJCSAgICAgICByZXZfb2Zmc2V0LCA1KTsKKworICAgIHJldHVybiAocHJ0X3JpZ2h0X21hcmdpbiAtIHBydF9sZWZ0X21hcmdpbikgLyBwcnRfdG0udG1BdmVDaGFyV2lkdGg7Cit9CisKKyAgICBzdGF0aWMgaW50CitwcnRfZ2V0X2xwcCh2b2lkKQoreworICAgIGludCB2cjsKKyAgICBpbnQgcGh5dzsKKyAgICBpbnQgZHZvZmY7CisgICAgaW50IHJldl9vZmZzZXQ7CisgICAgaW50CWJvdHRvbV9tYXJnaW47CisgICAgaW50CWRwaTsKKyNpZmRlZiBXSU4xNgorICAgIFBPSU5UIHBhZ2VzaXplOworI2VuZGlmCisKKyAgICB2cgkgICAgPSBHZXREZXZpY2VDYXBzKHBydF9kbGcuaERDLCBWRVJUUkVTKTsKKyNpZmRlZiBXSU4xNgorICAgIEVzY2FwZShwcnRfZGxnLmhEQywgR0VUUEhZU1BBR0VTSVpFLCBOVUxMLCBOVUxMLCAmcGFnZXNpemUpOworICAgIHBoeXcgICAgPSBwYWdlc2l6ZS55OworICAgIEVzY2FwZShwcnRfZGxnLmhEQywgR0VUUFJJTlRJTkdPRkZTRVQsIE5VTEwsIE5VTEwsICZwYWdlc2l6ZSk7CisgICAgZHZvZmYgICA9IHBhZ2VzaXplLnk7CisjZWxzZQorICAgIHBoeXcgICAgPSBHZXREZXZpY2VDYXBzKHBydF9kbGcuaERDLCBQSFlTSUNBTEhFSUdIVCk7CisgICAgZHZvZmYgICA9IEdldERldmljZUNhcHMocHJ0X2RsZy5oREMsIFBIWVNJQ0FMT0ZGU0VUWSk7CisjZW5kaWYKKyAgICBkcGkJICAgID0gR2V0RGV2aWNlQ2FwcyhwcnRfZGxnLmhEQywgTE9HUElYRUxTWSk7CisKKyAgICByZXZfb2Zmc2V0ID0gcGh5dyAtIChkdm9mZiArIHZyKTsKKworICAgIHBydF90b3BfbWFyZ2luID0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9UT1AsIGRwaSwgcGh5dywgZHZvZmYsIDUpOworCisgICAgLyogYWRqdXN0IHRvcCBtYXJnaW4gaWYgdGhlcmUgaXMgYSBoZWFkZXIgKi8KKyAgICBwcnRfdG9wX21hcmdpbiArPSBwcnRfbGluZV9oZWlnaHQgKiBwcnRfaGVhZGVyX2hlaWdodCgpOworCisgICAgYm90dG9tX21hcmdpbiA9IHZyIC0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9CT1QsIGRwaSwgcGh5dywKKwkJCQkJCQkgICAgICAgcmV2X29mZnNldCwgNSk7CisKKyAgICByZXR1cm4gKGJvdHRvbV9tYXJnaW4gLSBwcnRfdG9wX21hcmdpbikgLyBwcnRfbGluZV9oZWlnaHQ7Cit9CisKKyAgICBpbnQKK21jaF9wcmludF9pbml0KHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MsIGNoYXJfdSAqam9ibmFtZSwgaW50IGZvcmNlaXQpCit7CisgICAgc3RhdGljIEhHTE9CQUwJc3RvcmVkX2RtID0gTlVMTDsKKyAgICBzdGF0aWMgSEdMT0JBTAlzdG9yZWRfZGV2biA9IE5VTEw7CisgICAgc3RhdGljIGludAkJc3RvcmVkX25Db3BpZXMgPSAxOworICAgIHN0YXRpYyBpbnQJCXN0b3JlZF9uRmxhZ3MgPSAwOworCisgICAgTE9HRk9OVAkJZkxvZ0ZvbnQ7CisgICAgaW50CQkJcGlmSXRhbGljOworICAgIGludAkJCXBpZkJvbGQ7CisgICAgaW50CQkJcGlmVW5kZXJsaW5lOworCisgICAgREVWTU9ERQkJKm1lbTsKKyAgICBERVZOQU1FUwkJKmRldm5hbWU7CisgICAgaW50CQkJaTsKKworICAgIGJVc2VyQWJvcnQgPSAmKHBzZXR0aW5ncy0+dXNlcl9hYm9ydCk7CisgICAgbWVtc2V0KCZwcnRfZGxnLCAwLCBzaXplb2YoUFJJTlRETEcpKTsKKyAgICBwcnRfZGxnLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKFBSSU5URExHKTsKKyNpZm5kZWYgRkVBVF9HVUkKKyAgICBHZXRDb25zb2xlSHduZCgpOwkgICAgLyogZ2V0IHZhbHVlIG9mIHNfaHduZCAqLworI2VuZGlmCisgICAgcHJ0X2RsZy5od25kT3duZXIgPSBzX2h3bmQ7CisgICAgcHJ0X2RsZy5GbGFncyA9IFBEX05PUEFHRU5VTVMgfCBQRF9OT1NFTEVDVElPTiB8IFBEX1JFVFVSTkRDOworICAgIGlmICghZm9yY2VpdCkKKyAgICB7CisJcHJ0X2RsZy5oRGV2TW9kZSA9IHN0b3JlZF9kbTsKKwlwcnRfZGxnLmhEZXZOYW1lcyA9IHN0b3JlZF9kZXZuOworCXBydF9kbGcubEN1c3REYXRhID0gc3RvcmVkX25Db3BpZXM7IC8vIHdvcmsgYXJvdW5kIGJ1ZyBpbiBwcmludCBkaWFsb2cKKyNpZm5kZWYgRkVBVF9HVUkKKwkvKgorCSAqIFVzZSBob29rIHRvIHByZXZlbnQgY29uc29sZSB3aW5kb3cgYmVpbmcgc2VudCB0byBiYWNrCisJICovCisJcHJ0X2RsZy5scGZuUHJpbnRIb29rID0gUHJpbnRIb29rUHJvYzsKKwlwcnRfZGxnLkZsYWdzIHw9IFBEX0VOQUJMRVBSSU5USE9PSzsKKyNlbmRpZgorCXBydF9kbGcuRmxhZ3MgfD0gc3RvcmVkX25GbGFnczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIGJhbmcgcHJlc2VudCwgcmV0dXJuIGRlZmF1bHQgcHJpbnRlciBzZXR1cCB3aXRoIG5vIGRpYWxvZworICAgICAqIG5ldmVyIHNob3cgZGlhbG9nIGlmIHdlIGFyZSBydW5uaW5nIG92ZXIgdGVsbmV0CisgICAgICovCisgICAgaWYgKGZvcmNlaXQKKyNpZm5kZWYgRkVBVF9HVUkKKwkgICAgfHwgIXRlcm1fY29uc29sZQorI2VuZGlmCisJICAgICkKKyAgICB7CisJcHJ0X2RsZy5GbGFncyB8PSBQRF9SRVRVUk5ERUZBVUxUOworI2lmZGVmIFdJTjMyNjQKKwkvKgorCSAqIE1TRE4gc3VnZ2VzdHMgc2V0dGluZyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIFdJTlNQT09MIGZvcgorCSAqIE5ULCBidXQgTlVMTCBhcHBlYXJzIHRvIHdvcmsganVzdCBhcyB3ZWxsLgorCSAqLworCWlmICgqcF9wZGV2ICE9IE5VTCkKKwkgICAgcHJ0X2RsZy5oREMgPSBDcmVhdGVEQyhOVUxMLCBwX3BkZXYsIE5VTEwsIE5VTEwpOworCWVsc2UKKyNlbmRpZgorCXsKKwkgICAgcHJ0X2RsZy5GbGFncyB8PSBQRF9SRVRVUk5ERUZBVUxUOworCSAgICBpZiAoUHJpbnREbGcoJnBydF9kbGcpID09IDApCisJCWdvdG8gaW5pdF9mYWlsX2RsZzsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKFByaW50RGxnKCZwcnRfZGxnKSA9PSAwKQorCWdvdG8gaW5pdF9mYWlsX2RsZzsKKyAgICBlbHNlCisgICAgeworCS8qCisJICoga2VlcCB0aGUgcHJldmlvdXMgZHJpdmVyIGNvbnRleHQKKwkgKi8KKwlzdG9yZWRfZG0gPSBwcnRfZGxnLmhEZXZNb2RlOworCXN0b3JlZF9kZXZuID0gcHJ0X2RsZy5oRGV2TmFtZXM7CisJc3RvcmVkX25GbGFncyA9IHBydF9kbGcuRmxhZ3M7CisJc3RvcmVkX25Db3BpZXMgPSBwcnRfZGxnLm5Db3BpZXM7CisgICAgfQorCisgICAgaWYgKHBydF9kbGcuaERDID09IE5VTEwpCisgICAgeworCUVNU0coXygiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIikpOworCW1jaF9wcmludF9jbGVhbnVwKCk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIE5vdCBhbGwgcHJpbnRlciBkcml2ZXJzIHJlcG9ydCB0aGUgc3VwcG9ydCBvZiBjb2xvciAob3IgZ3JleSkgaW4gdGhlCisgICAgICogc2FtZSB3YXkuICBMZXQncyBzZXQgaGFzX2NvbG9yIGlmIHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB3YXkgdG8gcHJpbnQKKyAgICAgKiBtb3JlIHRoYW4gQiZXLiAqLworICAgIGkgPSBHZXREZXZpY2VDYXBzKHBydF9kbGcuaERDLCBOVU1DT0xPUlMpOworICAgIHBzZXR0aW5ncy0+aGFzX2NvbG9yID0gKEdldERldmljZUNhcHMocHJ0X2RsZy5oREMsIEJJVFNQSVhFTCkgPiAxCisJCQkJICAgfHwgR2V0RGV2aWNlQ2FwcyhwcnRfZGxnLmhEQywgUExBTkVTKSA+IDEKKwkJCQkgICB8fCBpID4gMiB8fCBpID09IC0xKTsKKworICAgIC8qIEVuc3VyZSBhbGwgZm9udCBzdHlsZXMgYXJlIGJhc2VsaW5lIGFsaWduZWQgKi8KKyAgICBTZXRUZXh0QWxpZ24ocHJ0X2RsZy5oREMsIFRBX0JBU0VMSU5FfFRBX0xFRlQpOworCisgICAgLyoKKyAgICAgKiBPbiBzb21lIHdpbmRvd3Mgc3lzdGVtcyB0aGUgbkNvcGllcyBwYXJhbWV0ZXIgaXMgbm90CisgICAgICogcGFzc2VkIGJhY2sgY29ycmVjdGx5LiBJdCBtdXN0IGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAqIGhEZXZNb2RlIHN0cnVjdC4KKyAgICAgKi8KKyAgICBtZW0gPSAoREVWTU9ERSAqKUdsb2JhbExvY2socHJ0X2RsZy5oRGV2TW9kZSk7CisgICAgaWYgKG1lbSAhPSBOVUxMKQorICAgIHsKKyNpZmRlZiBXSU4zMjY0CisJaWYgKG1lbS0+ZG1Db3BpZXMgIT0gMSkKKwkgICAgc3RvcmVkX25Db3BpZXMgPSBtZW0tPmRtQ29waWVzOworI2VuZGlmCisJaWYgKChtZW0tPmRtRmllbGRzICYgRE1fRFVQTEVYKSAmJiAobWVtLT5kbUR1cGxleCAmIH5ETURVUF9TSU1QTEVYKSkKKwkgICAgcHNldHRpbmdzLT5kdXBsZXggPSBUUlVFOworCWlmICgobWVtLT5kbUZpZWxkcyAmIERNX0NPTE9SKSAmJiAobWVtLT5kbUNvbG9yICYgRE1DT0xPUl9DT0xPUikpCisJICAgIHBzZXR0aW5ncy0+aGFzX2NvbG9yID0gVFJVRTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKHBydF9kbGcuaERldk1vZGUpOworCisgICAgZGV2bmFtZSA9IChERVZOQU1FUyAqKUdsb2JhbExvY2socHJ0X2RsZy5oRGV2TmFtZXMpOworICAgIGlmIChkZXZuYW1lICE9IDApCisgICAgeworCWNoYXJfdQkqcHJpbnRlcl9uYW1lID0gKGNoYXJfdSAqKWRldm5hbWUgKyBkZXZuYW1lLT53RGV2aWNlT2Zmc2V0OworCWNoYXJfdQkqcG9ydF9uYW1lID0gKGNoYXJfdSAqKWRldm5hbWUgK2Rldm5hbWUtPndPdXRwdXRPZmZzZXQ7CisJY2hhcl91CSp0ZXh0ID0gXygidG8gJXMgb24gJXMiKTsKKworCXBydF9uYW1lID0gYWxsb2MoU1RSTEVOKHByaW50ZXJfbmFtZSkgKyBTVFJMRU4ocG9ydF9uYW1lKQorCQkJCQkJCSAgICAgICsgU1RSTEVOKHRleHQpKTsKKwlpZiAocHJ0X25hbWUgIT0gTlVMTCkKKwkgICAgd3NwcmludGYocHJ0X25hbWUsIHRleHQsIHByaW50ZXJfbmFtZSwgcG9ydF9uYW1lKTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKHBydF9kbGcuaERldk5hbWVzKTsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZm9udCBhY2NvcmRpbmcgdG8gJ3ByaW50Zm9udCcKKyAgICAgKi8KKyAgICBtZW1zZXQoJmZMb2dGb250LCAwLCBzaXplb2YoZkxvZ0ZvbnQpKTsKKyAgICBpZiAoIWdldF9sb2dmb250KCZmTG9nRm9udCwgcF9wZm4sIHBydF9kbGcuaERDKSkKKyAgICB7CisJRU1TRzIoXygiRTYxMzogVW5rbm93biBwcmludGVyIGZvbnQ6ICVzIiksIHBfcGZuKTsKKwltY2hfcHJpbnRfY2xlYW51cCgpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKHBpZkJvbGQgPSAwOyBwaWZCb2xkIDw9IDE7IHBpZkJvbGQrKykKKwlmb3IgKHBpZkl0YWxpYyA9IDA7IHBpZkl0YWxpYyA8PSAxOyBwaWZJdGFsaWMrKykKKwkgICAgZm9yIChwaWZVbmRlcmxpbmUgPSAwOyBwaWZVbmRlcmxpbmUgPD0gMTsgcGlmVW5kZXJsaW5lKyspCisJICAgIHsKKwkJZkxvZ0ZvbnQubGZXZWlnaHQgPSAgYm9sZGZhY2VbcGlmQm9sZF07CisJCWZMb2dGb250LmxmSXRhbGljID0gcGlmSXRhbGljOworCQlmTG9nRm9udC5sZlVuZGVybGluZSA9IHBpZlVuZGVybGluZTsKKwkJcHJ0X2ZvbnRfaGFuZGxlc1twaWZCb2xkXVtwaWZJdGFsaWNdW3BpZlVuZGVybGluZV0KKwkJCQkJICAgICAgPSBDcmVhdGVGb250SW5kaXJlY3QoJmZMb2dGb250KTsKKwkgICAgfQorCisgICAgU2V0QmtNb2RlKHBydF9kbGcuaERDLCBPUEFRVUUpOworICAgIFNlbGVjdE9iamVjdChwcnRfZGxnLmhEQywgcHJ0X2ZvbnRfaGFuZGxlc1swXVswXVswXSk7CisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIHNldHRpbmdzIHN0cnVjdAorICAgICAqLworICAgIHBzZXR0aW5ncy0+Y2hhcnNfcGVyX2xpbmUgPSBwcnRfZ2V0X2NwbCgpOworICAgIHBzZXR0aW5ncy0+bGluZXNfcGVyX3BhZ2UgPSBwcnRfZ2V0X2xwcCgpOworICAgIHBzZXR0aW5ncy0+bl9jb2xsYXRlZF9jb3BpZXMgPSAocHJ0X2RsZy5GbGFncyAmIFBEX0NPTExBVEUpCisJCQkJCQkJPyBwcnRfZGxnLm5Db3BpZXMgOiAxOworICAgIHBzZXR0aW5ncy0+bl91bmNvbGxhdGVkX2NvcGllcyA9IChwcnRfZGxnLkZsYWdzICYgUERfQ09MTEFURSkKKwkJCQkJCQk/IDEgOiBwcnRfZGxnLm5Db3BpZXM7CisKKyAgICBpZiAocHNldHRpbmdzLT5uX2NvbGxhdGVkX2NvcGllcyA9PSAwKQorCXBzZXR0aW5ncy0+bl9jb2xsYXRlZF9jb3BpZXMgPSAxOworCisgICAgaWYgKHBzZXR0aW5ncy0+bl91bmNvbGxhdGVkX2NvcGllcyA9PSAwKQorCXBzZXR0aW5ncy0+bl91bmNvbGxhdGVkX2NvcGllcyA9IDE7CisKKyAgICBwc2V0dGluZ3MtPmpvYm5hbWUgPSBqb2JuYW1lOworCisgICAgcmV0dXJuIFRSVUU7CisKK2luaXRfZmFpbF9kbGc6CisgICAgeworCURXT1JEIGVyciA9IENvbW1EbGdFeHRlbmRlZEVycm9yKCk7CisKKwlpZiAoZXJyKQorCXsKKyNpZmRlZiBXSU4xNgorCSAgICBjaGFyIGJ1ZlsyMF07CisKKwkgICAgc3ByaW50ZihidWYsICIlbGQiLCBlcnIpOworCSAgICBFTVNHMihfKCJFMjM4OiBQcmludCBlcnJvcjogJXMiKSwgYnVmKTsKKyNlbHNlCisJICAgIGNoYXJfdSAqYnVmOworCisJICAgIC8qIEkgc3VzcGVjdCBGb3JtYXRNZXNzYWdlKCkgZG9lc24ndCB3b3JrIGZvciB2YWx1ZXMgcmV0dXJuZWQgYnkKKwkgICAgICogQ29tbURsZ0V4dGVuZGVkRXJyb3IoKS4gIFdoYXQgZG9lcz8gKi8KKwkgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorCQkJICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8CisJCQkgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorCQkJICBOVUxMLCBlcnIsIDAsIChMUFRTVFIpKCZidWYpLCAwLCBOVUxMKTsKKwkgICAgRU1TRzIoXygiRTIzODogUHJpbnQgZXJyb3I6ICVzIiksCisJCQkJICBidWYgPT0gTlVMTCA/IChjaGFyX3UgKilfKCJVbmtub3duIikgOiBidWYpOworCSAgICBMb2NhbEZyZWUoKExQVk9JRCkoYnVmKSk7CisjZW5kaWYKKwl9CisJZWxzZQorCSAgICBtc2dfY2xyX2VvcygpOyAvKiBNYXliZSBjYW5jZWxlZCAqLworCisJbWNoX3ByaW50X2NsZWFudXAoKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisKKyAgICBpbnQKK21jaF9wcmludF9iZWdpbihwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzKQoreworICAgIGludAkJCXJldDsKKyAgICBzdGF0aWMgRE9DSU5GTwlkaTsKKyAgICBjaGFyCQlzekJ1ZmZlclszMDBdOworCisgICAgaERsZ1ByaW50ID0gQ3JlYXRlRGlhbG9nKEdldE1vZHVsZUhhbmRsZShOVUxMKSwgVEVYVCgiUHJpbnREbGdCb3giKSwKKwkJCQkJICAgICBwcnRfZGxnLmh3bmRPd25lciwgUHJpbnREbGdQcm9jKTsKKyNpZmRlZiBXSU4xNgorICAgIEVzY2FwZShwcnRfZGxnLmhEQywgU0VUQUJPUlRQUk9DLCAwLCAoTFBTVFIpQWJvcnRQcm9jLCBOVUxMKTsKKyNlbHNlCisgICAgU2V0QWJvcnRQcm9jKHBydF9kbGcuaERDLCBBYm9ydFByb2MpOworI2VuZGlmCisgICAgd3NwcmludGYoc3pCdWZmZXIsIF8oIlByaW50aW5nICclcyciKSwgZ2V0dGFpbChwc2V0dGluZ3MtPmpvYm5hbWUpKTsKKyAgICBTZXREbGdJdGVtVGV4dChoRGxnUHJpbnQsIElEQ19QUklOVFRFWFQxLCAoTFBTVFIpc3pCdWZmZXIpOworCisgICAgbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKERPQ0lORk8pKTsKKyAgICBkaS5jYlNpemUgPSBzaXplb2YoRE9DSU5GTyk7CisgICAgZGkubHBzekRvY05hbWUgPSBwc2V0dGluZ3MtPmpvYm5hbWU7CisgICAgcmV0ID0gU3RhcnREb2MocHJ0X2RsZy5oREMsICZkaSk7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qIEdpdmUgZm9jdXMgYmFjayB0byBtYWluIHdpbmRvdyAod2hlbiB1c2luZyBNREkpLiAqLworICAgIFNldEZvY3VzKHNfaHduZCk7CisjZW5kaWYKKworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfZW5kKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MpCit7CisgICAgRW5kRG9jKHBydF9kbGcuaERDKTsKKyAgICBpZiAoISpiVXNlckFib3J0KQorCVNlbmRNZXNzYWdlKGhEbGdQcmludCwgV01fQ09NTUFORCwgMCwgMCk7Cit9CisKKyAgICBpbnQKK21jaF9wcmludF9lbmRfcGFnZSh2b2lkKQoreworICAgIHJldHVybiAoRW5kUGFnZShwcnRfZGxnLmhEQykgPiAwKTsKK30KKworICAgIGludAorbWNoX3ByaW50X2JlZ2luX3BhZ2UoY2hhcl91ICptc2cpCit7CisgICAgaWYgKG1zZyAhPSBOVUxMKQorCVNldERsZ0l0ZW1UZXh0KGhEbGdQcmludCwgSURDX1BST0dSRVNTLCAoTFBTVFIpbXNnKTsKKyAgICByZXR1cm4gKFN0YXJ0UGFnZShwcnRfZGxnLmhEQykgPiAwKTsKK30KKworICAgIGludAorbWNoX3ByaW50X2JsYW5rX3BhZ2Uodm9pZCkKK3sKKyAgICByZXR1cm4gKG1jaF9wcmludF9iZWdpbl9wYWdlKE5VTEwpID8gKG1jaF9wcmludF9lbmRfcGFnZSgpKSA6IEZBTFNFKTsKK30KKworc3RhdGljIGludCBwcnRfcG9zX3ggPSAwOworc3RhdGljIGludCBwcnRfcG9zX3kgPSAwOworCisgICAgdm9pZAorbWNoX3ByaW50X3N0YXJ0X2xpbmUobWFyZ2luLCBwYWdlX2xpbmUpCisgICAgaW50CQltYXJnaW47CisgICAgaW50CQlwYWdlX2xpbmU7Cit7CisgICAgaWYgKG1hcmdpbikKKwlwcnRfcG9zX3ggPSAtcHJ0X251bWJlcl93aWR0aDsKKyAgICBlbHNlCisJcHJ0X3Bvc194ID0gMDsKKyAgICBwcnRfcG9zX3kgPSBwYWdlX2xpbmUgKiBwcnRfbGluZV9oZWlnaHQKKwkJCQkgKyBwcnRfdG0udG1Bc2NlbnQgKyBwcnRfdG0udG1FeHRlcm5hbExlYWRpbmc7Cit9CisKKyAgICBpbnQKK21jaF9wcmludF90ZXh0X291dChjaGFyX3UgKnAsIGludCBsZW4pCit7CisjaWZkZWYgRkVBVF9QUk9QT1JUSU9OQUxfRk9OVFMKKyAgICBTSVpFCXN6OworI2VuZGlmCisKKyAgICBUZXh0T3V0KHBydF9kbGcuaERDLCBwcnRfcG9zX3ggKyBwcnRfbGVmdF9tYXJnaW4sCisJCQkJCSAgcHJ0X3Bvc195ICsgcHJ0X3RvcF9tYXJnaW4sIHAsIGxlbik7CisjaWZuZGVmIEZFQVRfUFJPUE9SVElPTkFMX0ZPTlRTCisgICAgcHJ0X3Bvc194ICs9IGxlbiAqIHBydF90bS50bUF2ZUNoYXJXaWR0aDsKKyAgICByZXR1cm4gKHBydF9wb3NfeCArIHBydF9sZWZ0X21hcmdpbiArIHBydF90bS50bUF2ZUNoYXJXaWR0aAorCQkJCSAgICAgKyBwcnRfdG0udG1PdmVyaGFuZyA+IHBydF9yaWdodF9tYXJnaW4pOworI2Vsc2UKKyMgaWZkZWYgV0lOMTYKKyAgICBHZXRUZXh0RXh0ZW50UG9pbnQocHJ0X2RsZy5oREMsIHAsIGxlbiwgJnN6KTsKKyMgZWxzZQorICAgIEdldFRleHRFeHRlbnRQb2ludDMyKHBydF9kbGcuaERDLCBwLCBsZW4sICZzeik7CisjIGVuZGlmCisgICAgcHJ0X3Bvc194ICs9IChzei5jeCAtIHBydF90bS50bU92ZXJoYW5nKTsKKyAgICAvKiBUaGlzIGlzIHdyb25nIHdoZW4gcHJpbnRpbmcgc3BhY2VzIGZvciBhIFRBQi4gKi8KKyAgICBpZiAocFtsZW5dID09IE5VTCkKKwlyZXR1cm4gRkFMU0U7CisjIGlmZGVmIFdJTjE2CisgICAgR2V0VGV4dEV4dGVudFBvaW50KHBydF9kbGcuaERDLCBwICsgbGVuLCAxLCAmc3opOworIyBlbHNlCisgICAgR2V0VGV4dEV4dGVudFBvaW50MzIocHJ0X2RsZy5oREMsIHAgKyBsZW4sIDEsICZzeik7CisjIGVuZGlmCisgICAgcmV0dXJuIChwcnRfcG9zX3ggKyBwcnRfbGVmdF9tYXJnaW4gKyBzei5jeCA+IHBydF9yaWdodF9tYXJnaW4pOworI2VuZGlmCit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfc2V0X2ZvbnQoaW50IGlCb2xkLCBpbnQgaUl0YWxpYywgaW50IGlVbmRlcmxpbmUpCit7CisgICAgU2VsZWN0T2JqZWN0KHBydF9kbGcuaERDLCBwcnRfZm9udF9oYW5kbGVzW2lCb2xkXVtpSXRhbGljXVtpVW5kZXJsaW5lXSk7Cit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfc2V0X2JnKHVuc2lnbmVkIGxvbmcgYmdjb2wpCit7CisgICAgU2V0QmtDb2xvcihwcnRfZGxnLmhEQywgR2V0TmVhcmVzdENvbG9yKHBydF9kbGcuaERDLCBzd2FwX21lKGJnY29sKSkpOworICAgIC8qCisgICAgICogV2l0aCBhIHdoaXRlIGJhY2tncm91bmQgd2UgY2FuIGRyYXcgY2hhcmFjdGVycyB0cmFuc3BhcmVudCwgd2hpY2ggaXMKKyAgICAgKiBnb29kIGZvciBpdGFsaWMgY2hhcmFjdGVycyB0aGF0IG92ZXJsYXAgdG8gdGhlIG5leHQgY2hhciBjZWxsLgorICAgICAqLworICAgIGlmIChiZ2NvbCA9PSAweGZmZmZmZlVMKQorCVNldEJrTW9kZShwcnRfZGxnLmhEQywgVFJBTlNQQVJFTlQpOworICAgIGVsc2UKKwlTZXRCa01vZGUocHJ0X2RsZy5oREMsIE9QQVFVRSk7Cit9CisKKyAgICB2b2lkCittY2hfcHJpbnRfc2V0X2ZnKHVuc2lnbmVkIGxvbmcgZmdjb2wpCit7CisgICAgU2V0VGV4dENvbG9yKHBydF9kbGcuaERDLCBHZXROZWFyZXN0Q29sb3IocHJ0X2RsZy5oREMsIHN3YXBfbWUoZmdjb2wpKSk7Cit9CisKKyNlbmRpZiAvKkZFQVRfUFJJTlRFUiAmJiAhRkVBVF9QT1NUU0NSSVBUKi8KKworI2lmIGRlZmluZWQoRkVBVF9TSE9SVENVVCkgfHwgZGVmaW5lZChQUk9UTykKKyMgaW5jbHVkZSA8c2hsb2JqLmg+CisKKy8qCisgKiBXaGVuICJmbmFtZSIgaXMgdGhlIG5hbWUgb2YgYSBzaG9ydGN1dCAoKi5sbmspIHJlc29sdmUgdGhlIGZpbGUgaXQgcG9pbnRzCisgKiB0byBhbmQgcmV0dXJuIHRoYXQgbmFtZSBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KKyAgICBjaGFyX3UgKgorbWNoX3Jlc29sdmVfc2hvcnRjdXQoY2hhcl91ICpmbmFtZSkKK3sKKyAgICBIUkVTVUxUCQlocjsKKyAgICBJU2hlbGxMaW5rCQkqcHNsID0gTlVMTDsKKyAgICBJUGVyc2lzdEZpbGUJKnBwZiA9IE5VTEw7CisgICAgT0xFQ0hBUgkJd3N6W01BWF9QQVRIXTsKKyAgICBXSU4zMl9GSU5EX0RBVEEJZmZkOyAvLyB3ZSBnZXQgdGhvc2UgZnJlZSBvZiBjaGFyZ2UKKyAgICBUQ0hBUgkJYnVmW01BWF9QQVRIXTsgLy8gY291bGQgaGF2ZSBzaW1wbHkgcmV1c2VkICd3c3onLi4uCisgICAgY2hhcl91CQkqcmZuYW1lID0gTlVMTDsKKyAgICBpbnQJCQlsZW47CisKKyAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBuYW1lIGVuZHMgaW4gIi5sbmsiLiBBdm9pZCBjYWxsaW5nCisgICAgICogQ29DcmVhdGVJbnN0YW5jZSgpLCBpdCdzIHF1aXRlIHNsb3cuICovCisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuIHJmbmFtZTsKKyAgICBsZW4gPSBTVFJMRU4oZm5hbWUpOworICAgIGlmIChsZW4gPD0gNCB8fCBTVFJOSUNNUChmbmFtZSArIGxlbiAtIDQsICIubG5rIiwgNCkgIT0gMCkKKwlyZXR1cm4gcmZuYW1lOworCisgICAgQ29Jbml0aWFsaXplKE5VTEwpOworCisgICAgLy8gY3JlYXRlIGEgbGluayBtYW5hZ2VyIG9iamVjdCBhbmQgcmVxdWVzdCBpdHMgaW50ZXJmYWNlCisgICAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKAorCSAgICAmQ0xTSURfU2hlbGxMaW5rLCBOVUxMLCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKwkgICAgJklJRF9JU2hlbGxMaW5rLCAodm9pZCoqKSZwc2wpOworICAgIGlmIChociAhPSBTX09LKQorCWdvdG8gc2hvcnRjdXRfZXJyb3I7CisKKyAgICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBJUGVyc2lzdEZpbGUgaW50ZXJmYWNlLgorICAgIGhyID0gcHNsLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKAorCSAgICBwc2wsICZJSURfSVBlcnNpc3RGaWxlLCAodm9pZCoqKSZwcGYpOworICAgIGlmIChociAhPSBTX09LKQorCWdvdG8gc2hvcnRjdXRfZXJyb3I7CisKKyAgICAvLyBmdWxsIHBhdGggc3RyaW5nIG11c3QgYmUgaW4gVW5pY29kZS4KKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZm5hbWUsIC0xLCB3c3osIE1BWF9QQVRIKTsKKworICAgIC8vICJsb2FkIiB0aGUgbmFtZSBhbmQgcmVzb3ZlIHRoZSBsaW5rCisgICAgaHIgPSBwcGYtPmxwVnRibC0+TG9hZChwcGYsIHdzeiwgU1RHTV9SRUFEKTsKKyAgICBpZiAoaHIgIT0gU19PSykKKwlnb3RvIHNob3J0Y3V0X2Vycm9yOworI2lmIDAgIC8vIFRoaXMgbWFrZXMgVmltIHdhaXQgYSBsb25nIHRpbWUgaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0LgorICAgIGhyID0gcHNsLT5scFZ0YmwtPlJlc29sdmUocHNsLCBOVUxMLCBTTFJfTk9fVUkpOworICAgIGlmIChociAhPSBTX09LKQorCWdvdG8gc2hvcnRjdXRfZXJyb3I7CisjZW5kaWYKKworICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgbGluayB0YXJnZXQuCisgICAgWmVyb01lbW9yeShidWYsIE1BWF9QQVRIKTsKKyAgICBociA9IHBzbC0+bHBWdGJsLT5HZXRQYXRoKHBzbCwgYnVmLCBNQVhfUEFUSCwgJmZmZCwgMCk7CisgICAgaWYgKGhyID09IFNfT0sgJiYgYnVmWzBdICE9IE5VTCkKKwlyZm5hbWUgPSB2aW1fc3Ryc2F2ZShidWYpOworCitzaG9ydGN1dF9lcnJvcjoKKyAgICAvLyBSZWxlYXNlIGFsbCBpbnRlcmZhY2UgcG9pbnRlcnMgKGJvdGggYmVsb25nIHRvIHRoZSBzYW1lIG9iamVjdCkKKyAgICBpZiAocHBmICE9IE5VTEwpCisJcHBmLT5scFZ0YmwtPlJlbGVhc2UocHBmKTsKKyAgICBpZiAocHNsICE9IE5VTEwpCisJcHNsLT5scFZ0YmwtPlJlbGVhc2UocHNsKTsKKworICAgIENvVW5pbml0aWFsaXplKCk7CisgICAgcmV0dXJuIHJmbmFtZTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoRkVBVF9FVkFMKSAmJiAhZGVmaW5lZChGRUFUX0dVSSkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQnJpbmcgb3Vyc2VsdmVzIHRvIHRoZSBmb3JlZ3JvdW5kLiAgRG9lcyB3b3JrIGlmIHRoZSBPUyBkb2Vzbid0IGFsbG93IGl0LgorICovCisgICAgdm9pZAord2luMzJfc2V0X2ZvcmVncm91bmQoKQoreworIyBpZm5kZWYgRkVBVF9HVUkKKyAgICBHZXRDb25zb2xlSHduZCgpOwkgICAgLyogZ2V0IHZhbHVlIG9mIHNfaHduZCAqLworIyBlbmRpZgorICAgIGlmIChzX2h3bmQgIT0gMCkKKwlTZXRGb3JlZ3JvdW5kV2luZG93KHNfaHduZCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTElFTlRTRVJWRVIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2xpZW50LXNlcnZlciBjb2RlIGZvciBWaW0KKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGF1bCBNb29yZQorICovCisKKy8qIEluIG9yZGVyIHRvIGhhbmRsZSBpbnRlci1wcm9jZXNzIG1lc3NhZ2VzLCB3ZSBuZWVkIHRvIGhhdmUgYSB3aW5kb3cuIEJ1dAorICogdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgbWFpbiBHVUkgd2luZG93IGlzCisgKiBjcmVhdGVkIChhbmQgbWF5IGFsc28gYmUgY2FsbGVkIGluIHRoZSBjb25zb2xlIHZlcnNpb24sIHdoZXJlIHRoZXJlIGlzIG5vCisgKiBHVUkgd2luZG93IGF0IGFsbCkuCisgKgorICogU28gd2UgY3JlYXRlIGEgaGlkZGVuIHdpbmRvdywgYW5kIGFycmFuZ2UgdG8gZGVzdHJveSBpdCBvbiBleGl0LgorICovCitIV05EIG1lc3NhZ2Vfd2luZG93ID0gMDsJICAgIC8qIHdpbmRvdyB0aGF0J3MgaGFuZGxpbmcgbWVzc3NhZ2VzICovCisKKyNkZWZpbmUgVklNX0NMQVNTTkFNRSAgICAgICJWSU1fTUVTU0FHRVMiCisjZGVmaW5lIFZJTV9DTEFTU05BTUVfTEVOICAoc2l6ZW9mKFZJTV9DTEFTU05BTUUpIC0gMSkKKworLyogQ29tbXVuaWNhdGlvbiBpcyB2aWEgV01fQ09QWURBVEEgbWVzc2FnZXMuIFRoZSBtZXNzYWdlIHR5cGUgaXMgc2VuZCBpbgorICogdGhlIGR3RGF0YSBwYXJhbWV0ZXIuIFR5cGVzIGFyZSBkZWZpbmVkIGhlcmUuICovCisjZGVmaW5lIENPUFlEQVRBX0tFWVMJCTAKKyNkZWZpbmUgQ09QWURBVEFfUkVQTFkJCTEKKyNkZWZpbmUgQ09QWURBVEFfRVhQUgkJMTAKKyNkZWZpbmUgQ09QWURBVEFfUkVTVUxUCQkxMQorI2RlZmluZSBDT1BZREFUQV9FUlJPUl9SRVNVTFQJMTIKKworLyogVGhpcyBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgc2VydmVyIEhXTkQgYW5kIGl0cyBuYW1lLiAqLworc3RydWN0IHNlcnZlcl9pZAoreworICAgIEhXTkQgaHduZDsKKyAgICBjaGFyX3UgKm5hbWU7Cit9OworCisvKgorICogQ2xlYW4gdXAgb24gZXhpdC4gVGhpcyBkZXN0cm95cyB0aGUgaGlkZGVuIG1lc3NhZ2Ugd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBfUlRMRU5UUllGCisjZW5kaWYKK0NsZWFuVXBNZXNzYWdpbmcodm9pZCkKK3sKKyAgICBpZiAobWVzc2FnZV93aW5kb3cgIT0gMCkKKyAgICB7CisJRGVzdHJveVdpbmRvdyhtZXNzYWdlX3dpbmRvdyk7CisJbWVzc2FnZV93aW5kb3cgPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBzYXZlX3JlcGx5KEhXTkQgc2VydmVyLCBjaGFyX3UgKnJlcGx5LCBpbnQgZXhwcik7CisKKy8qcworICogVGhlIHdpbmRvdyBwcm9jZWR1cmUgZm9yIHRoZSBoaWRkZW4gbWVzc2FnZSB3aW5kb3cuCisgKiBJdCBoYW5kbGVzIGNhbGxiYWNrIG1lc3NhZ2VzIGFuZCBub3RpZmljYXRpb25zIGZyb20gc2VydmVycy4KKyAqIEluIG9yZGVyIHRvIHByb2Nlc3MgdGhlc2UgbWVzc2FnZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byBydW4gYQorICogbWVzc2FnZSBsb29wLiBDb2RlIHdoaWNoIG1heSBydW4gYmVmb3JlIHRoZSBtYWluIG1lc3NhZ2UgbG9vcAorICogaXMgc3RhcnRlZCAoaW4gdGhlIEdVSSkgaXMgY2FyZWZ1bCB0byBwdW1wIG1lc3NhZ2VzIHdoZW4gaXQgbmVlZHMKKyAqIHRvLiBGZWF0dXJlcyB3aGljaCByZXF1aXJlIG1lc3NhZ2UgZGVsaXZlcnkgZHVyaW5nIG5vcm1hbCB1c2Ugd2lsbAorICogbm90IHdvcmsgaW4gdGhlIGNvbnNvbGUgdmVyc2lvbiAtIHRoaXMgYmFzaWNhbGx5IG1lYW5zIHRob3NlCisgKiBmZWF0dXJlcyB3aGljaCBhbGxvdyBWaW0gdG8gYWN0IGFzIGEgc2VydmVyLCByYXRoZXIgdGhhbiBhIGNsaWVudC4KKyAqLworICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLCitNZXNzYWdpbmdfV25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIGlmIChtc2cgPT0gV01fQ09QWURBVEEpCisgICAgeworCS8qIFRoaXMgaXMgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBWaW0uIFRoZSBkd0RhdGEgbWVtYmVyIG9mIHRoZQorCSAqIENPUFlEQVRBU1RSVUNUIGRldGVybWluZXMgdGhlIHR5cGUgb2YgbWVzc2FnZToKKwkgKiAgIENPUFlEQVRBX0tFWVM6CisJICoJQSBrZXkgc2VxdWVuY2UuIFdlIGFyZSBhIHNlcnZlciwgYW5kIGEgY2xpZW50IHdhbnRzIHRoZXNlIGtleXMKKwkgKglhZGRpbmcgdG8gdGhlIGlucHV0IHF1ZXVlLgorCSAqICAgQ09QWURBVEFfUkVQTFk6CisJICoJQSByZXBseS4gV2UgYXJlIGEgY2xpZW50LCBhbmQgYSBzZXJ2ZXIgaGFzIHNlbnQgdGhpcyBtZXNzYWdlCisJICoJaW4gcmVzcG9uc2UgdG8gYSByZXF1ZXN0LiAgKHNlcnZlcjJjbGllbnQoKSkKKwkgKiAgIENPUFlEQVRBX0VYUFI6CisJICoJQW4gZXhwcmVzc2lvbi4gV2UgYXJlIGEgc2VydmVyLCBhbmQgYSBjbGllbnQgd2FudHMgdXMgdG8KKwkgKglldmFsdWF0ZSB0aGlzIGV4cHJlc3Npb24uCisJICogICBDT1BZREFUQV9SRVNVTFQ6CisJICoJQSByZXBseS4gV2UgYXJlIGEgY2xpZW50LCBhbmQgYSBzZXJ2ZXIgaGFzIHNlbnQgdGhpcyBtZXNzYWdlCisJICoJaW4gcmVzcG9uc2UgdG8gYSBDT1BZREFUQV9FWFBSLgorCSAqICAgQ09QWURBVEFfRVJST1JfUkVTVUxUOgorCSAqCUEgcmVwbHkuIFdlIGFyZSBhIGNsaWVudCwgYW5kIGEgc2VydmVyIGhhcyBzZW50IHRoaXMgbWVzc2FnZQorCSAqCWluIHJlc3BvbnNlIHRvIGEgQ09QWURBVEFfRVhQUiB0aGF0IGZhaWxlZCB0byBldmFsdWF0ZS4KKwkgKi8KKwlDT1BZREFUQVNUUlVDVAkqZGF0YSA9IChDT1BZREFUQVNUUlVDVCopbFBhcmFtOworCUhXTkQJCXNlbmRlciA9IChIV05EKXdQYXJhbTsKKwlDT1BZREFUQVNUUlVDVAlyZXBseTsKKwljaGFyX3UJCSpyZXM7CisJY2hhcl91CQl3aW5zdHJbMzBdOworCWludAkJcmV0dmFsOworCisJc3dpdGNoIChkYXRhLT5kd0RhdGEpCisJeworCWNhc2UgQ09QWURBVEFfS0VZUzoKKwkgICAgLyogUmVtZW1iZXIgd2hvIHNlbnQgdGhpcywgZm9yIDxjbGllbnQ+ICovCisJICAgIGNsaWVudFdpbmRvdyA9IHNlbmRlcjsKKworCSAgICAvKiBBZGQgdGhlIHJlY2VpdmVkIGtleXMgdG8gdGhlIGlucHV0IGJ1ZmZlci4gIFRoZSBsb29wIHdhaXRpbmcKKwkgICAgICogZm9yIHRoZSB1c2VyIHRvIGRvIHNvbWV0aGluZyBzaG91bGQgY2hlY2sgdGhlIGlucHV0IGJ1ZmZlci4gKi8KKwkgICAgc2VydmVyX3RvX2lucHV0X2J1ZigoY2hhcl91ICopKGRhdGEtPmxwRGF0YSkpOworCisjIGlmZGVmIEZFQVRfR1VJCisJICAgIC8qIFdha2UgdXAgdGhlIG1haW4gR1VJIGxvb3AuICovCisJICAgIGlmIChzX2h3bmQgIT0gMCkKKwkJUG9zdE1lc3NhZ2Uoc19od25kLCBXTV9OVUxMLCAwLCAwKTsKKyMgZW5kaWYKKwkgICAgcmV0dXJuIDE7CisKKwljYXNlIENPUFlEQVRBX0VYUFI6CisJICAgIC8qIFJlbWVtYmVyIHdobyBzZW50IHRoaXMsIGZvciA8Y2xpZW50PiAqLworCSAgICBjbGllbnRXaW5kb3cgPSBzZW5kZXI7CisKKwkgICAgcmVzID0gZXZhbF9jbGllbnRfZXhwcl90b19zdHJpbmcoZGF0YS0+bHBEYXRhKTsKKwkgICAgaWYgKHJlcyA9PSBOVUxMKQorCSAgICB7CisJCXJlcyA9IHZpbV9zdHJzYXZlKF8oZV9pbnZleHBybXNnKSk7CisJCXJlcGx5LmR3RGF0YSA9IENPUFlEQVRBX0VSUk9SX1JFU1VMVDsKKwkgICAgfQorCSAgICBlbHNlCisJCXJlcGx5LmR3RGF0YSA9IENPUFlEQVRBX1JFU1VMVDsKKwkgICAgcmVwbHkubHBEYXRhID0gcmVzOworCSAgICByZXBseS5jYkRhdGEgPSBTVFJMRU4ocmVzKSArIDE7CisKKwkgICAgcmV0dmFsID0gU2VuZE1lc3NhZ2Uoc2VuZGVyLCBXTV9DT1BZREFUQSwgKFdQQVJBTSltZXNzYWdlX3dpbmRvdywKKwkJCQkJCQkgICAgKExQQVJBTSkoJnJlcGx5KSk7CisJICAgIHZpbV9mcmVlKHJlcyk7CisJICAgIHJldHVybiByZXR2YWw7CisKKwljYXNlIENPUFlEQVRBX1JFUExZOgorCWNhc2UgQ09QWURBVEFfUkVTVUxUOgorCWNhc2UgQ09QWURBVEFfRVJST1JfUkVTVUxUOgorCSAgICBpZiAoZGF0YS0+bHBEYXRhICE9IE5VTEwpCisJICAgIHsKKwkJc2F2ZV9yZXBseShzZW5kZXIsIGRhdGEtPmxwRGF0YSwKKwkJCSAgIChkYXRhLT5kd0RhdGEgPT0gQ09QWURBVEFfUkVQTFkgPyAgMCA6CisJCQkgICAoZGF0YS0+ZHdEYXRhID09IENPUFlEQVRBX1JFU1VMVCA/IDEgOgorCQkJCQkJCSAgICAgIDIpKSk7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJCWlmIChkYXRhLT5kd0RhdGEgPT0gQ09QWURBVEFfUkVQTFkpCisJCXsKKwkJICAgIHNwcmludGYoKGNoYXIgKil3aW5zdHIsICIweCV4IiwgKHVuc2lnbmVkKXNlbmRlcik7CisJCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9SRU1PVEVSRVBMWSwgd2luc3RyLCBkYXRhLT5scERhdGEsCisJCQkJCQkJCVRSVUUsIGN1cmJ1Zik7CisJCX0KKyNlbmRpZgorCSAgICB9CisJICAgIHJldHVybiAxOworCX0KKworCXJldHVybiAwOworICAgIH0KKworICAgIGVsc2UgaWYgKG1zZyA9PSBXTV9BQ1RJVkFURSAmJiB3UGFyYW0gPT0gV0FfQUNUSVZFKQorICAgIHsKKwkvKiBXaGVuIHRoZSBtZXNzYWdlIHdpbmRvdyBpcyBhY3RpdmF0ZWQgKGJyb3VnaHQgdG8gdGhlIGZvcmVncm91bmQpLAorCSAqIHRoaXMgYWN0dWFsbHkgYXBwbGllcyB0byB0aGUgdGV4dCB3aW5kb3cuICovCisjaWZuZGVmIEZFQVRfR1VJCisJR2V0Q29uc29sZUh3bmQoKTsJICAgIC8qIGdldCB2YWx1ZSBvZiBzX2h3bmQgKi8KKyNlbmRpZgorCWlmIChzX2h3bmQgIT0gMCkKKwl7CisJICAgIFNldEZvcmVncm91bmRXaW5kb3coc19od25kKTsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgbWVzc2FnZSBoYW5kbGluZyBwcm9jZXNzLiAgVGhpcyBpbnZvbHZlcyBjcmVhdGluZyBhIHdpbmRvdworICogdG8gaGFuZGxlIG1lc3NhZ2VzIC0gdGhlIHdpbmRvdyB3aWxsIG5vdCBiZSB2aXNpYmxlLgorICovCisgICAgdm9pZAorc2VydmVySW5pdE1lc3NhZ2luZyh2b2lkKQoreworICAgIFdORENMQVNTIHduZGNsYXNzOworICAgIEhJTlNUQU5DRSBzX2hpbnN0OworCisgICAgLyogQ2xlYW4gdXAgb24gZXhpdCAqLworICAgIGF0ZXhpdChDbGVhblVwTWVzc2FnaW5nKTsKKworICAgIC8qIFJlZ2lzdGVyIGEgd2luZG93IGNsYXNzIC0gd2Ugb25seSByZWFsbHkgY2FyZQorICAgICAqIGFib3V0IHRoZSB3aW5kb3cgcHJvY2VkdXJlCisgICAgICovCisgICAgc19oaW5zdCA9IChISU5TVEFOQ0UpR2V0TW9kdWxlSGFuZGxlKDApOworICAgIHduZGNsYXNzLnN0eWxlID0gMDsKKyAgICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IE1lc3NhZ2luZ19XbmRQcm9jOworICAgIHduZGNsYXNzLmNiQ2xzRXh0cmEgPSAwOworICAgIHduZGNsYXNzLmNiV25kRXh0cmEgPSAwOworICAgIHduZGNsYXNzLmhJbnN0YW5jZSA9IHNfaGluc3Q7CisgICAgd25kY2xhc3MuaEljb24gPSBOVUxMOworICAgIHduZGNsYXNzLmhDdXJzb3IgPSBOVUxMOworICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSBOVUxMOworICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7CisgICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IFZJTV9DTEFTU05BTUU7CisgICAgUmVnaXN0ZXJDbGFzcygmd25kY2xhc3MpOworCisgICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlIHdpbmRvdy4gSXQgd2lsbCBiZSBoaWRkZW4sIHNvIHRoZSBkZXRhaWxzIGRvbid0CisgICAgICogbWF0dGVyLiAgRG9uJ3QgdXNlIFdTX09WRVJMQVBQRURXSU5ET1csIGl0IHdpbGwgbWFrZSBhIHNob3J0Y3V0IHJlbW92ZQorICAgICAqIGZvY3VzIGZyb20gZ3ZpbS4gKi8KKyAgICBtZXNzYWdlX3dpbmRvdyA9IENyZWF0ZVdpbmRvdyhWSU1fQ0xBU1NOQU1FLCAiIiwKKwkJCSBXU19QT1BVUFdJTkRPVyB8IFdTX0NBUFRJT04sCisJCQkgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKKwkJCSAxMDAsIDEwMCwgTlVMTCwgTlVMTCwKKwkJCSBzX2hpbnN0LCBOVUxMKTsKK30KKworLyoKKyAqIEdldCB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdyAiaHduZCIsIHdoaWNoIGlzIHRoZSBWaW0gc2VydmVyIG5hbWUsIGluCisgKiAibmFtZVtuYW1lbGVuXSIgYW5kIHJldHVybiB0aGUgbGVuZ3RoLgorICogUmV0dXJucyB6ZXJvIGlmIHdpbmRvdyAiaHduZCIgaXMgbm90IGEgVmltIHNlcnZlci4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldFZpbVNlcnZlck5hbWUoSFdORCBod25kLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyCWJ1ZmZlcltWSU1fQ0xBU1NOQU1FX0xFTiArIDFdOworCisgICAgLyogSWdub3JlIHdpbmRvd3Mgd2hpY2ggYXJlbid0IFZpbSBtZXNzYWdlIHdpbmRvd3MgKi8KKyAgICBsZW4gPSBHZXRDbGFzc05hbWUoaHduZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgaWYgKGxlbiAhPSBWSU1fQ0xBU1NOQU1FX0xFTiB8fCBTVFJDTVAoYnVmZmVyLCBWSU1fQ0xBU1NOQU1FKSAhPSAwKQorCXJldHVybiAwOworCisgICAgLyogR2V0IHRoZSB0aXRsZSBvZiB0aGUgd2luZG93ICovCisgICAgcmV0dXJuIEdldFdpbmRvd1RleHQoaHduZCwgbmFtZSwgbmFtZWxlbik7Cit9CisKKyAgICBzdGF0aWMgQk9PTCBDQUxMQkFDSworZW51bVdpbmRvd3NHZXRTZXJ2ZXIoSFdORCBod25kLCBMUEFSQU0gbHBhcmFtKQoreworICAgIHN0cnVjdAlzZXJ2ZXJfaWQgKmlkID0gKHN0cnVjdCBzZXJ2ZXJfaWQgKilscGFyYW07CisgICAgY2hhcglzZXJ2ZXJbTUFYX1BBVEhdOworCisgICAgLyogR2V0IHRoZSB0aXRsZSBvZiB0aGUgd2luZG93ICovCisgICAgaWYgKGdldFZpbVNlcnZlck5hbWUoaHduZCwgc2VydmVyLCBzaXplb2Yoc2VydmVyKSkgPT0gMCkKKwlyZXR1cm4gVFJVRTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIHNlcnZlciB3ZSdyZSBsb29raW5nIGZvciwgcmV0dXJuIGl0cyBIV05EICovCisgICAgaWYgKFNUUklDTVAoc2VydmVyLCBpZC0+bmFtZSkgPT0gMCkKKyAgICB7CisJaWQtPmh3bmQgPSBod25kOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBPdGhlcndpc2UsIGtlZXAgbG9va2luZyAqLworICAgIHJldHVybiBUUlVFOworfQorCisgICAgc3RhdGljIEJPT0wgQ0FMTEJBQ0sKK2VudW1XaW5kb3dzR2V0TmFtZXMoSFdORCBod25kLCBMUEFSQU0gbHBhcmFtKQoreworICAgIGdhcnJheV9UCSpnYSA9IChnYXJyYXlfVCAqKWxwYXJhbTsKKyAgICBjaGFyCXNlcnZlcltNQVhfUEFUSF07CisKKyAgICAvKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cgKi8KKyAgICBpZiAoZ2V0VmltU2VydmVyTmFtZShod25kLCBzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKSA9PSAwKQorCXJldHVybiBUUlVFOworCisgICAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBsaXN0ICovCisgICAgZ2FfY29uY2F0KGdhLCBzZXJ2ZXIpOworICAgIGdhX2NvbmNhdChnYSwgIlxuIik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyAgICBzdGF0aWMgSFdORAorZmluZFNlcnZlcihjaGFyX3UgKm5hbWUpCit7CisgICAgc3RydWN0IHNlcnZlcl9pZCBpZDsKKworICAgIGlkLm5hbWUgPSBuYW1lOworICAgIGlkLmh3bmQgPSAwOworCisgICAgRW51bVdpbmRvd3MoZW51bVdpbmRvd3NHZXRTZXJ2ZXIsIChMUEFSQU0pKCZpZCkpOworCisgICAgcmV0dXJuIGlkLmh3bmQ7Cit9CisKKyAgICB2b2lkCitzZXJ2ZXJTZXROYW1lKGNoYXJfdSAqbmFtZSkKK3sKKyAgICBjaGFyX3UJKm9rX25hbWU7CisgICAgSFdORAlod25kID0gMDsKKyAgICBpbnQJCWkgPSAwOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qIExlYXZlIGVub3VnaCBzcGFjZSBmb3IgYSA5LWRpZ2l0IHN1ZmZpeCB0byBlbnN1cmUgdW5pcXVlbmVzcyEgKi8KKyAgICBva19uYW1lID0gYWxsb2MoU1RSTEVOKG5hbWUpICsgMTApOworCisgICAgU1RSQ1BZKG9rX25hbWUsIG5hbWUpOworICAgIHAgPSBva19uYW1lICsgU1RSTEVOKG5hbWUpOworCisgICAgZm9yICg7OykKKyAgICB7CisJLyogVGhpcyBpcyBpbmVmZmljaWVudCAtIHdlJ3JlIGRvaW5nIGFuIEVudW1XaW5kb3dzIGxvb3AgZm9yIGVhY2gKKwkgKiBwb3NzaWJsZSBuYW1lLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZ3JhYiBhbGwgbmFtZXMgaW4gb25lIGdvLAorCSAqIGFuZCBzY2FuIHRoZSBsaXN0IGVhY2ggdGltZS4uLgorCSAqLworCWh3bmQgPSBmaW5kU2VydmVyKG9rX25hbWUpOworCWlmIChod25kID09IDApCisJICAgIGJyZWFrOworCisJKytpOworCWlmIChpID49IDEwMDApCisJICAgIGJyZWFrOworCisJc3ByaW50ZigoY2hhciAqKXAsICIlZCIsIGkpOworICAgIH0KKworICAgIGlmIChod25kICE9IDApCisJdmltX2ZyZWUob2tfbmFtZSk7CisgICAgZWxzZQorICAgIHsKKwkvKiBSZW1lbWJlciB0aGUgbmFtZSAqLworCXNlcnZlck5hbWUgPSBva19uYW1lOworI2lmZGVmIEZFQVRfVElUTEUKKwluZWVkX21ha2V0aXRsZSA9IFRSVUU7CS8qIHVwZGF0ZSBWaW0gd2luZG93IHRpdGxlIGxhdGVyICovCisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgbWVzc2FnZSB3aW5kb3cgdGl0bGUgKi8KKwlTZXRXaW5kb3dUZXh0KG1lc3NhZ2Vfd2luZG93LCBva19uYW1lKTsKKworI2lmZGVmIEZFQVRfRVZBTAorCS8qIFNldCB0aGUgc2VydmVybmFtZSB2YXJpYWJsZSAqLworCXNldF92aW1fdmFyX3N0cmluZyhWVl9TRU5EX1NFUlZFUiwgc2VydmVyTmFtZSwgLTEpOworI2VuZGlmCisgICAgfQorfQorCisgICAgY2hhcl91ICoKK3NlcnZlckdldFZpbU5hbWVzKHZvaWQpCit7CisgICAgZ2FycmF5X1QgZ2E7CisKKyAgICBnYV9pbml0MigmZ2EsIDEsIDEwMCk7CisKKyAgICBFbnVtV2luZG93cyhlbnVtV2luZG93c0dldE5hbWVzLCAoTFBBUkFNKSgmZ2EpKTsKKworICAgIHJldHVybiBnYS5nYV9kYXRhOworfQorCisgICAgaW50CitzZXJ2ZXJTZW5kUmVwbHkobmFtZSwgcmVwbHkpCisgICAgY2hhcl91CSpuYW1lOwkJLyogV2hlcmUgdG8gc2VuZC4gKi8KKyAgICBjaGFyX3UJKnJlcGx5OwkJLyogV2hhdCB0byBzZW5kLiAqLworeworICAgIEhXTkQJdGFyZ2V0OworICAgIENPUFlEQVRBU1RSVUNUIGRhdGE7CisgICAgaW50CQluID0gMDsKKworICAgIC8qIFRoZSAibmFtZSIgYXJndW1lbnQgaXMgYSBtYWdpYyBjb29raWUgb2J0YWluZWQgZnJvbSBleHBhbmQoIjxjbGllbnQ+IikuCisgICAgICogSXQgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDB4WFhYWFggLSBpLmUuIGEgQyBoZXggbGl0ZXJhbCwgd2hpY2ggaXMgdGhlCisgICAgICogdmFsdWUgb2YgdGhlIGNsaWVudCdzIG1lc3NhZ2Ugd2luZG93IEhXTkQuCisgICAgICovCisgICAgc3NjYW5mKChjaGFyICopbmFtZSwgIiV4IiwgJm4pOworICAgIGlmIChuID09IDApCisJcmV0dXJuIC0xOworCisgICAgdGFyZ2V0ID0gKEhXTkQpbjsKKyAgICBpZiAoIUlzV2luZG93KHRhcmdldCkpCisJcmV0dXJuIC0xOworCisgICAgZGF0YS5kd0RhdGEgPSBDT1BZREFUQV9SRVBMWTsKKyAgICBkYXRhLmNiRGF0YSA9IFNUUkxFTihyZXBseSkgKyAxOworICAgIGRhdGEubHBEYXRhID0gcmVwbHk7CisKKyAgICBpZiAoU2VuZE1lc3NhZ2UodGFyZ2V0LCBXTV9DT1BZREFUQSwgKFdQQVJBTSltZXNzYWdlX3dpbmRvdywKKwkJCQkJCQkgICAgIChMUEFSQU0pKCZkYXRhKSkpCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKyAgICBpbnQKK3NlcnZlclNlbmRUb1ZpbShuYW1lLCBjbWQsIHJlc3VsdCwgcHRhcmdldCwgYXNFeHByLCBzaWxlbnQpCisgICAgY2hhcl91CSAqbmFtZTsJCQkvKiBXaGVyZSB0byBzZW5kLiAqLworICAgIGNoYXJfdQkgKmNtZDsJCQkvKiBXaGF0IHRvIHNlbmQuICovCisgICAgY2hhcl91CSAqKnJlc3VsdDsJCS8qIFJlc3VsdCBvZiBldmFsJ2VkIGV4cHJlc3Npb24gKi8KKyAgICB2b2lkCSAqcHRhcmdldDsJCS8qIEhXTkQgb2Ygc2VydmVyICovCisgICAgaW50CQkgYXNFeHByOwkJLyogRXhwcmVzc2lvbiBvciBrZXlzPyAqLworICAgIGludAkJIHNpbGVudDsJCS8qIGRvbid0IGNvbXBsYWluIGFib3V0IG5vIHNlcnZlciAqLworeworICAgIEhXTkQJdGFyZ2V0ID0gZmluZFNlcnZlcihuYW1lKTsKKyAgICBDT1BZREFUQVNUUlVDVCBkYXRhOworICAgIGNoYXJfdQkqcmV0dmFsID0gTlVMTDsKKyAgICBpbnQJCXJldGNvZGUgPSAwOworCisgICAgaWYgKHRhcmdldCA9PSAwKQorICAgIHsKKwlpZiAoIXNpbGVudCkKKwkgICAgRU1TRzIoXyhlX25vc2VydmVyKSwgbmFtZSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChwdGFyZ2V0KQorCSooSFdORCAqKXB0YXJnZXQgPSB0YXJnZXQ7CisKKyAgICBkYXRhLmR3RGF0YSA9IGFzRXhwciA/IENPUFlEQVRBX0VYUFIgOiBDT1BZREFUQV9LRVlTOworICAgIGRhdGEuY2JEYXRhID0gU1RSTEVOKGNtZCkgKyAxOworICAgIGRhdGEubHBEYXRhID0gY21kOworCisgICAgaWYgKFNlbmRNZXNzYWdlKHRhcmdldCwgV01fQ09QWURBVEEsIChXUEFSQU0pbWVzc2FnZV93aW5kb3csCisJCQkJCQkJKExQQVJBTSkoJmRhdGEpKSA9PSAwKQorCXJldHVybiAtMTsKKworICAgIGlmIChhc0V4cHIpCisJcmV0dmFsID0gc2VydmVyR2V0UmVwbHkodGFyZ2V0LCAmcmV0Y29kZSwgVFJVRSwgVFJVRSk7CisKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJdmltX2ZyZWUocmV0dmFsKTsKKyAgICBlbHNlCisJKnJlc3VsdCA9IHJldHZhbDsgLyogQ2FsbGVyIGFzc3VtZXMgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgKi8KKworICAgIHJldHVybiByZXRjb2RlOworfQorCisvKgorICogQnJpbmcgdGhlIHNlcnZlciB0byB0aGUgZm9yZWdyb3VuZC4KKyAqLworICAgIHZvaWQKK3NlcnZlckZvcmVncm91bmQobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgSFdORAl0YXJnZXQgPSBmaW5kU2VydmVyKG5hbWUpOworCisgICAgaWYgKHRhcmdldCAhPSAwKQorCVNldEZvcmVncm91bmRXaW5kb3codGFyZ2V0KTsKK30KKworLyogUmVwbGllcyBmcm9tIHNlcnZlciBuZWVkIHRvIGJlIHN0b3JlZCB1bnRpbCB0aGUgY2xpZW50IHBpY2tzIHRoZW0gdXAgdmlhCisgKiByZW1vdGVfcmVhZCgpLiBTbyB3ZSBtYWludGFpbiBhIGxpc3Qgb2Ygc2VydmVyLWlkL3JlcGx5IHBhaXJzLgorICogTm90ZSB0aGF0IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHJlcGxpZXMgZnJvbSBvbmUgc2VydmVyIHBlbmRpbmcgaWYgdGhlCisgKiBjbGllbnQgaXMgc2xvdyBwaWNraW5nIHRoZW0gdXAuCisgKiBXZSBqdXN0IHN0b3JlIHRoZSByZXBsaWVzIGluIGEgc2ltcGxlIGxpc3QuIFdoZW4gd2UgcmVtb3ZlIGFuIGVudHJ5LCB3ZQorICogbW92ZSBsaXN0IGVudHJpZXMgZG93biB0byBmaWxsIHRoZSBnYXAuCisgKiBUaGUgc2VydmVyIElEIGlzIHNpbXBseSB0aGUgSFdORC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIV05ECXNlcnZlcjsJCS8qIHNlcnZlciB3aW5kb3cgKi8KKyAgICBjaGFyX3UJKnJlcGx5OwkJLyogcmVwbHkgc3RyaW5nICovCisgICAgaW50CQlleHByX3Jlc3VsdDsJLyogMCBmb3IgUkVQTFksIDEgZm9yIFJFU1VMVCAyIGZvciBlcnJvciAqLworfQorcmVwbHlfVDsKKworc3RhdGljIGdhcnJheV9UIHJlcGx5X2xpc3QgPSB7MCwgMCwgc2l6ZW9mKHJlcGx5X1QpLCA1LCAwfTsKKworI2RlZmluZSBSRVBMWV9JVEVNKGkpICgocmVwbHlfVCAqKShyZXBseV9saXN0LmdhX2RhdGEpICsgKGkpKQorI2RlZmluZSBSRVBMWV9DT1VOVCAocmVwbHlfbGlzdC5nYV9sZW4pCisjZGVmaW5lIFJFUExZX1JPT00gKHJlcGx5X2xpc3QuZ2Ffcm9vbSkKKworLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgcmVwbHkgKi8KK3N0YXRpYyBpbnQgcmVwbHlfcmVjZWl2ZWQgPSAwOworCisgICAgc3RhdGljIGludAorc2F2ZV9yZXBseShIV05EIHNlcnZlciwgY2hhcl91ICpyZXBseSwgaW50IGV4cHIpCit7CisgICAgcmVwbHlfVCAqcmVwOworCisgICAgaWYgKGdhX2dyb3coJnJlcGx5X2xpc3QsIDEpID09IEZBSUwpCisJcmV0dXJuIEZBSUw7CisKKyAgICByZXAgPSBSRVBMWV9JVEVNKFJFUExZX0NPVU5UKTsKKyAgICByZXAtPnNlcnZlciA9IHNlcnZlcjsKKyAgICByZXAtPnJlcGx5ID0gdmltX3N0cnNhdmUocmVwbHkpOworICAgIHJlcC0+ZXhwcl9yZXN1bHQgPSBleHByOworICAgIGlmIChyZXAtPnJlcGx5ID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICArK1JFUExZX0NPVU5UOworICAgIC0tUkVQTFlfUk9PTTsKKyAgICByZXBseV9yZWNlaXZlZCA9IDE7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogR2V0IGEgcmVwbHkgZnJvbSBzZXJ2ZXIgInNlcnZlciIuCisgKiBXaGVuICJleHByX3JlcyIgaXMgbm9uIE5VTEwsIGdldCB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24sIG90aGVyd2lzZSBhCisgKiBzZXJ2ZXIyY2xpZW50KCkgbWVzc2FnZS4KKyAqIFdoZW4gbm9uIE5VTEwsIHBvaW50IHRvIHJldHVybiBjb2RlLiAwID0+IE9LLCAtMSA9PiBFUlJPUgorICogSWYgInJlbW92ZSIgaXMgVFJVRSwgY29uc3VtZSB0aGUgbWVzc2FnZSwgdGhlIGNhbGxlciBtdXN0IGZyZWUgaXQgdGhlbi4KKyAqIGlmICJ3YWl0IiBpcyBUUlVFIGJsb2NrIHVudGlsIGEgbWVzc2FnZSBhcnJpdmVzIChvciB0aGUgc2VydmVyIGV4aXRzKS4KKyAqLworICAgIGNoYXJfdSAqCitzZXJ2ZXJHZXRSZXBseShIV05EIHNlcnZlciwgaW50ICpleHByX3JlcywgaW50IHJlbW92ZSwgaW50IHdhaXQpCit7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqcmVwbHk7CisgICAgcmVwbHlfVAkqcmVwOworCisgICAgLyogV2hlbiB3YWl0aW5nLCBsb29wIHVudGlsIHRoZSBtZXNzYWdlIHdhaXRpbmcgZm9yIGlzIHJlY2VpdmVkLiAqLworICAgIGZvciAoOzspCisgICAgeworCS8qIFJlc2V0IHRoaXMgaGVyZSwgaW4gY2FzZSBhIG1lc3NhZ2UgYXJyaXZlcyB3aGlsZSB3ZSBhcmUgZ29pbmcKKwkgKiB0aHJvdWdoIHRoZSBhbHJlYWR5IHJlY2VpdmVkIG1lc3NhZ2VzLiAqLworCXJlcGx5X3JlY2VpdmVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSRVBMWV9DT1VOVDsgKytpKQorCXsKKwkgICAgcmVwID0gUkVQTFlfSVRFTShpKTsKKwkgICAgaWYgKHJlcC0+c2VydmVyID09IHNlcnZlcgorCQkgICAgJiYgKChyZXAtPmV4cHJfcmVzdWx0ICE9IDApID09IChleHByX3JlcyAhPSBOVUxMKSkpCisJICAgIHsKKwkJLyogU2F2ZSB0aGUgdmFsdWVzIHdlJ3ZlIGZvdW5kIGZvciBsYXRlciAqLworCQlyZXBseSA9IHJlcC0+cmVwbHk7CisJCWlmIChleHByX3JlcyAhPSBOVUxMKQorCQkgICAgKmV4cHJfcmVzID0gcmVwLT5leHByX3Jlc3VsdCA9PSAxID8gMCA6IC0xOworCisJCWlmIChyZW1vdmUpCisJCXsKKwkJICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgZG93biB0byBmaWxsIHRoZSBnYXAgKi8KKwkJICAgIG1jaF9tZW1tb3ZlKHJlcCwgcmVwICsgMSwKKwkJCQkgICAgIChSRVBMWV9DT1VOVCAtIGkgLSAxKSAqIHNpemVvZihyZXBseV9UKSk7CisJCSAgICAtLVJFUExZX0NPVU5UOworCQkgICAgKytSRVBMWV9ST09NOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSByZXBseSB0byB0aGUgY2FsbGVyLCB3aG8gdGFrZXMgb24gcmVzcG9uc2liaWxpdHkKKwkJICogZm9yIGZyZWVpbmcgaXQgaWYgInJlbW92ZSIgaXMgVFJVRS4gKi8KKwkJcmV0dXJuIHJlcGx5OworCSAgICB9CisJfQorCisJLyogSWYgd2UgZ290IGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgcmVwbHkuIFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUKKwkgKiAid2FpdCIgcGFyYW1ldGVyIGlzbid0IHNldC4gICovCisJaWYgKCF3YWl0KQorCSAgICBicmVhazsKKworCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByZXBseS4gRW50ZXIgYSBtZXNzYWdlIGxvb3AgdW50aWwgdGhlCisJICogInJlcGx5X3JlY2VpdmVkIiBmbGFnIGdldHMgc2V0LiAqLworCisJLyogTG9vcCB1bnRpbCB3ZSByZWNlaXZlIGEgcmVwbHkgKi8KKwl3aGlsZSAocmVwbHlfcmVjZWl2ZWQgPT0gMCkKKwl7CisJICAgIC8qIFdhaXQgZm9yIGEgU2VuZE1lc3NhZ2UoKSBjYWxsIHRvIHVzLiAgVGhpcyBjb3VsZCBiZSB0aGUgcmVwbHkKKwkgICAgICogd2UgYXJlIHdhaXRpbmcgZm9yLiAgVXNlIGEgdGltZW91dCBvZiBhIHNlY29uZCwgdG8gY2F0Y2ggdGhlCisJICAgICAqIHNpdHVhdGlvbiB0aGF0IHRoZSBzZXJ2ZXIgZGllZCB1bmV4cGVjdGVkbHkuICovCisJICAgIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoMCwgTlVMTCwgVFJVRSwgMTAwMCwgUVNfQUxMSU5QVVQpOworCisJICAgIC8qIElmIHRoZSBzZXJ2ZXIgaGFzIGRpZWQsIGdpdmUgdXAgKi8KKwkgICAgaWYgKCFJc1dpbmRvdyhzZXJ2ZXIpKQorCQlyZXR1cm4gTlVMTDsKKworCSAgICBzZXJ2ZXJQcm9jZXNzUGVuZGluZ01lc3NhZ2VzKCk7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogUHJvY2VzcyBhbnkgbWVzc2FnZXMgaW4gdGhlIFdpbmRvd3MgbWVzc2FnZSBxdWV1ZS4KKyAqLworICAgIHZvaWQKK3NlcnZlclByb2Nlc3NQZW5kaW5nTWVzc2FnZXModm9pZCkKK3sKKyAgICBNU0cgbXNnOworCisgICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX1JFTU9WRSkpCisgICAgeworCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgIH0KK30KKworI2VuZGlmIC8qIEZFQVRfQ0xJRU5UU0VSVkVSICovCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCAoZGVmaW5lZChGRUFUX1BSSU5URVIpICYmICFkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorCitzdHJ1Y3QgY2hhcnNldF9wYWlyCit7CisgICAgY2hhcgkqbmFtZTsKKyAgICBCWVRFCWNoYXJzZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNoYXJzZXRfcGFpcgorY2hhcnNldF9wYWlyc1tdID0KK3sKKyAgICB7IkFOU0kiLAkJQU5TSV9DSEFSU0VUfSwKKyAgICB7IkNISU5FU0VCSUc1IiwJQ0hJTkVTRUJJRzVfQ0hBUlNFVH0sCisgICAgeyJERUZBVUxUIiwJCURFRkFVTFRfQ0hBUlNFVH0sCisgICAgeyJIQU5HRVVMIiwJCUhBTkdFVUxfQ0hBUlNFVH0sCisgICAgeyJPRU0iLAkJT0VNX0NIQVJTRVR9LAorICAgIHsiU0hJRlRKSVMiLAlTSElGVEpJU19DSEFSU0VUfSwKKyAgICB7IlNZTUJPTCIsCQlTWU1CT0xfQ0hBUlNFVH0sCisjaWZkZWYgV0lOMzI2NAorICAgIHsiQVJBQklDIiwJCUFSQUJJQ19DSEFSU0VUfSwKKyAgICB7IkJBTFRJQyIsCQlCQUxUSUNfQ0hBUlNFVH0sCisgICAgeyJFQVNURVVST1BFIiwJRUFTVEVVUk9QRV9DSEFSU0VUfSwKKyAgICB7IkdCMjMxMiIsCQlHQjIzMTJfQ0hBUlNFVH0sCisgICAgeyJHUkVFSyIsCQlHUkVFS19DSEFSU0VUfSwKKyAgICB7IkhFQlJFVyIsCQlIRUJSRVdfQ0hBUlNFVH0sCisgICAgeyJKT0hBQiIsCQlKT0hBQl9DSEFSU0VUfSwKKyAgICB7Ik1BQyIsCQlNQUNfQ0hBUlNFVH0sCisgICAgeyJSVVNTSUFOIiwJCVJVU1NJQU5fQ0hBUlNFVH0sCisgICAgeyJUSEFJIiwJCVRIQUlfQ0hBUlNFVH0sCisgICAgeyJUVVJLSVNIIiwJCVRVUktJU0hfQ0hBUlNFVH0sCisjIGlmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID4gMTAxMCkpIFwKKwkmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID4gMHgwNTAwKSkKKyAgICB7IlZJRVROQU1FU0UiLAlWSUVUTkFNRVNFX0NIQVJTRVR9LAorIyBlbmRpZgorI2VuZGlmCisgICAge05VTEwsCQkwfQorfTsKKworLyoKKyAqIENvbnZlcnQgYSBjaGFyc2V0IElEIHRvIGEgbmFtZS4KKyAqIFJldHVybiBOVUxMIHdoZW4gbm90IHJlY29nbml6ZWQuCisgKi8KKyAgICBjaGFyICoKK2NoYXJzZXRfaWQybmFtZShpbnQgaWQpCit7CisgICAgc3RydWN0IGNoYXJzZXRfcGFpciAqY3A7CisKKyAgICBmb3IgKGNwID0gY2hhcnNldF9wYWlyczsgY3AtPm5hbWUgIT0gTlVMTDsgKytjcCkKKwlpZiAoKEJZVEUpaWQgPT0gY3AtPmNoYXJzZXQpCisJICAgIGJyZWFrOworICAgIHJldHVybiBjcC0+bmFtZTsKK30KKworc3RhdGljIGNvbnN0IExPR0ZPTlQgc19sZkRlZmF1bHQgPQoreworICAgIC0xMiwgMCwgMCwgMCwgRldfTk9STUFMLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsCisgICAgT1VUX0RFRkFVTFRfUFJFQ0lTLCBDTElQX0RFRkFVTFRfUFJFQ0lTLAorICAgIFBST09GX1FVQUxJVFksIEZJWEVEX1BJVENIIHwgRkZfRE9OVENBUkUsCisgICAgIkZpeGVkc3lzIgkvKiBzZWUgX1JlYWRWaW1JbmkgKi8KK307CisKKy8qIEluaXRpYWxpc2UgdGhlICJjdXJyZW50IGhlaWdodCIgdG8gLTEyIChzYW1lIGFzIHNfbGZEZWZhdWx0KSBqdXN0CisgKiBpbiBjYXNlIHRoZSB1c2VyIHNwZWNpZmllcyBhIGZvbnQgaW4gImd1aWZvbnQiIHdpdGggbm8gc2l6ZSBiZWZvcmUgYSBmb250CisgKiB3aXRoIGFuIGV4cGxpY2l0IHNpemUgaGFzIGJlZW4gc2V0LiBUaGlzIGRlZmF1bHRzIHRoZSBzaXplIHRvIHRoaXMgdmFsdWUKKyAqICgtMTIgZXF1YXRlcyB0byByb3VnaGx5IDlwdCkuCisgKi8KK2ludCBjdXJyZW50X2ZvbnRfaGVpZ2h0ID0gLTEyOwkJLyogYWxzbyB1c2VkIGluIGd1aV93NDguYyAqLworCisvKiBDb252ZXJ0IGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBvaW50IHNpemUgaW50byBwaXhlbHMuIFRoZSBzdHJpbmcgc2hvdWxkCisgKiBiZSBhIHBvc2l0aXZlIGRlY2ltYWwgbnVtYmVyLCB3aXRoIGFuIG9wdGlvbmFsIGRlY2ltYWwgcG9pbnQgKGVnLCAiMTIiLCBvcgorICogIjEwLjUiKS4gVGhlIHBpeGVsIHZhbHVlIGlzIHJldHVybmVkLCBhbmQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHVuY29udmVydGVkCisgKiBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluICplbmQuIFRoZSBmbGFnICJ2ZXJ0aWNhbCIgc2F5cyB3aGV0aGVyIHRoaXMKKyAqIGNhbGN1bGF0aW9uIGlzIGZvciBhIHZlcnRpY2FsIChoZWlnaHQpIHNpemUgb3IgYSBob3Jpem9udGFsICh3aWR0aCkgb25lLgorICovCisgICAgc3RhdGljIGludAorcG9pbnRzX3RvX3BpeGVscyhjaGFyX3UgKnN0ciwgY2hhcl91ICoqZW5kLCBpbnQgdmVydGljYWwsIGludCBwcHJpbnRlcl9kYykKK3sKKyAgICBpbnQJCXBpeGVsczsKKyAgICBpbnQJCXBvaW50cyA9IDA7CisgICAgaW50CQlkaXZpc29yID0gMDsKKyAgICBIV05ECWh3bmQgPSAoSFdORCkwOworICAgIEhEQwkJaGRjOworICAgIEhEQwkJcHJpbnRlcl9kYyA9IChIREMpcHByaW50ZXJfZGM7CisKKyAgICB3aGlsZSAoKnN0ciAhPSBOVUwpCisgICAgeworCWlmICgqc3RyID09ICcuJyAmJiBkaXZpc29yID09IDApCisJeworCSAgICAvKiBTdGFydCBrZWVwaW5nIGEgZGl2aXNvciwgZm9yIGxhdGVyICovCisJICAgIGRpdmlzb3IgPSAxOworCX0KKwllbHNlCisJeworCSAgICBpZiAoIVZJTV9JU0RJR0lUKCpzdHIpKQorCQlicmVhazsKKworCSAgICBwb2ludHMgKj0gMTA7CisJICAgIHBvaW50cyArPSAqc3RyIC0gJzAnOworCSAgICBkaXZpc29yICo9IDEwOworCX0KKwkrK3N0cjsKKyAgICB9CisKKyAgICBpZiAoZGl2aXNvciA9PSAwKQorCWRpdmlzb3IgPSAxOworCisgICAgaWYgKHByaW50ZXJfZGMgPT0gTlVMTCkKKyAgICB7CisJaHduZCA9IEdldERlc2t0b3BXaW5kb3coKTsKKwloZGMgPSBHZXRXaW5kb3dEQyhod25kKTsKKyAgICB9CisgICAgZWxzZQorCWhkYyA9IHByaW50ZXJfZGM7CisKKyAgICBwaXhlbHMgPSBNdWxEaXYocG9pbnRzLAorCQkgICAgR2V0RGV2aWNlQ2FwcyhoZGMsIHZlcnRpY2FsID8gTE9HUElYRUxTWSA6IExPR1BJWEVMU1gpLAorCQkgICAgNzIgKiBkaXZpc29yKTsKKworICAgIGlmIChwcmludGVyX2RjID09IE5VTEwpCisJUmVsZWFzZURDKGh3bmQsIGhkYyk7CisKKyAgICAqZW5kID0gc3RyOworICAgIHJldHVybiBwaXhlbHM7Cit9CisKKyAgICBzdGF0aWMgaW50IENBTExCQUNLCitmb250X2VudW1wcm9jKAorICAgIEVOVU1MT0dGT05UCSAgICAqZWxmLAorICAgIE5FV1RFWFRNRVRSSUMgICAqbnRtLAorICAgIGludAkJICAgIHR5cGUsCisgICAgTFBBUkFNCSAgICBscGFyYW0pCit7CisgICAgLyogUmV0dXJuIHZhbHVlOgorICAgICAqCSAgMCA9IHRlcm1pbmF0ZSBub3cgKG1vbm9zcGFjZSAmIEFOU0kpCisgICAgICoJICAxID0gY29udGludWUsIHN0aWxsIG5vIGx1Y2suLi4KKyAgICAgKgkgIDIgPSBjb250aW51ZSwgYnV0IHdlIGhhdmUgYW4gYWNjZXB0YWJsZSBMT0dGT05UCisgICAgICoJICAgICAgKG1vbm9zcGFjZSwgbm90IEFOU0kpCisgICAgICogV2UgdXNlIHRoZXNlIHZhbHVlcywgYXMgRW51bUZvbnRGYW1pbGllcyByZXR1cm5zIDEgaWYgdGhlCisgICAgICogY2FsbGJhY2sgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkLiBTbywgd2UgY2hlY2sgdGhlIHJldHVybiBhcworICAgICAqIDAgPSBwZXJmZWN0LCAyID0gT0ssIDEgPSBubyBnb29kLi4uCisgICAgICogSXQncyBub3QgcHJldHR5LCBidXQgaXQgd29ya3MhCisgICAgICovCisKKyAgICBMT0dGT05UICpsZiA9IChMT0dGT05UICopKGxwYXJhbSk7CisKKyNpZm5kZWYgRkVBVF9QUk9QT1JUSU9OQUxfRk9OVFMKKyAgICAvKiBJZ25vcmUgbm9uLW1vbm9zcGFjZSBmb250cyB3aXRob3V0IGZ1cnRoZXIgYWRvICovCisgICAgaWYgKChudG0tPnRtUGl0Y2hBbmRGYW1pbHkgJiAxKSAhPSAwKQorCXJldHVybiAxOworI2VuZGlmCisKKyAgICAvKiBSZW1lbWJlciB0aGlzIExPR0ZPTlQgYXMgYSAicG9zc2libGUiICovCisgICAgKmxmID0gZWxmLT5lbGZMb2dGb250OworCisgICAgLyogVGVybWluYXRlIHRoZSBzY2FuIGFzIHNvb24gYXMgd2UgZmluZCBhbiBBTlNJIGZvbnQgKi8KKyAgICBpZiAobGYtPmxmQ2hhclNldCA9PSBBTlNJX0NIQVJTRVQKKwkgICAgfHwgbGYtPmxmQ2hhclNldCA9PSBPRU1fQ0hBUlNFVAorCSAgICB8fCBsZi0+bGZDaGFyU2V0ID09IERFRkFVTFRfQ0hBUlNFVCkKKwlyZXR1cm4gMDsKKworICAgIC8qIENvbnRpbnVlIHRoZSBzY2FuIC0gd2UgaGF2ZSBhIG5vbi1BTlNJIGZvbnQgKi8KKyAgICByZXR1cm4gMjsKK30KKworICAgIHN0YXRpYyBpbnQKK2luaXRfbG9nZm9udChMT0dGT05UICpsZikKK3sKKyAgICBpbnQJCW47CisgICAgSFdORAlod25kID0gR2V0RGVza3RvcFdpbmRvdygpOworICAgIEhEQwkJaGRjID0gR2V0V2luZG93REMoaHduZCk7CisKKyAgICBuID0gRW51bUZvbnRGYW1pbGllcyhoZGMsCisJCQkgKExQQ1NUUilsZi0+bGZGYWNlTmFtZSwKKwkJCSAoRk9OVEVOVU1QUk9DKWZvbnRfZW51bXByb2MsCisJCQkgKExQQVJBTSlsZik7CisKKyAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKKworICAgIC8qIElmIHdlIGNvdWxkbid0IGZpbmQgYSB1c2VhYmxlIGZvbnQsIHJldHVybiBmYWlsdXJlICovCisgICAgaWYgKG4gPT0gMSkKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qIFRpZHkgdXAgdGhlIHJlc3Qgb2YgdGhlIExPR0ZPTlQgc3RydWN0dXJlLiBXZSBzZXQgdG8gYSBiYXNpYworICAgICAqIGZvbnQgLSBnZXRfbG9nZm9udCgpIHNldHMgYm9sZCwgaXRhbGljLCBldGMgYmFzZWQgb24gdGhlIHVzZXIncworICAgICAqIGlucHV0LgorICAgICAqLworICAgIGxmLT5sZkhlaWdodCA9IGN1cnJlbnRfZm9udF9oZWlnaHQ7CisgICAgbGYtPmxmV2lkdGggPSAwOworICAgIGxmLT5sZkl0YWxpYyA9IEZBTFNFOworICAgIGxmLT5sZlVuZGVybGluZSA9IEZBTFNFOworICAgIGxmLT5sZlN0cmlrZU91dCA9IEZBTFNFOworICAgIGxmLT5sZldlaWdodCA9IEZXX05PUk1BTDsKKworICAgIC8qIFJldHVybiBzdWNjZXNzICovCisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CitnZXRfbG9nZm9udCgKKyAgICBMT0dGT05UICpsZiwKKyAgICBjaGFyX3UgICpuYW1lLAorICAgIEhEQyBwcmludGVyX2RjKQoreworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWk7CisgICAgc3RhdGljIExPR0ZPTlQgKmxhc3RsZiA9IE5VTEw7CisKKyAgICAqbGYgPSBzX2xmRGVmYXVsdDsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiAxOworCisgICAgaWYgKFNUUkNNUChuYW1lLCAiKiIpID09IDApCisgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUlfVzMyKQorCUNIT09TRUZPTlQJY2Y7CisJLyogaWYgbmFtZSBpcyAiKiIsIGJyaW5nIHVwIHN0ZCBmb250IGRpYWxvZzogKi8KKwltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwljZi5sU3RydWN0U2l6ZSA9IHNpemVvZihjZik7CisJY2YuaHduZE93bmVyID0gc19od25kOworCWNmLkZsYWdzID0gQ0ZfU0NSRUVORk9OVFMgfCBDRl9GSVhFRFBJVENIT05MWSB8IENGX0lOSVRUT0xPR0ZPTlRTVFJVQ1Q7CisJaWYgKGxhc3RsZiAhPSBOVUxMKQorCSAgICAqbGYgPSAqbGFzdGxmOworCWNmLmxwTG9nRm9udCA9IGxmOworCWNmLm5Gb250VHlwZSA9IDAgOyAvL1JFR1VMQVJfRk9OVFRZUEU7CisJaWYgKENob29zZUZvbnQoJmNmKSkKKwkgICAgZ290byB0aGVlbmQ7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgLyoKKyAgICAgKiBTcGxpdCBuYW1lIHVwLCBpdCBjb3VsZCBiZSA8bmFtZT46aDxoZWlnaHQ+Onc8d2lkdGg+IGV0Yy4KKyAgICAgKi8KKyAgICBmb3IgKHAgPSBuYW1lOyAqcCAmJiAqcCAhPSAnOic7IHArKykKKyAgICB7CisJaWYgKHAgLSBuYW1lICsgMSA+IExGX0ZBQ0VTSVpFKQorCSAgICByZXR1cm4gMDsJCQkvKiBOYW1lIHRvbyBsb25nICovCisJbGYtPmxmRmFjZU5hbWVbcCAtIG5hbWVdID0gKnA7CisgICAgfQorICAgIGlmIChwICE9IG5hbWUpCisJbGYtPmxmRmFjZU5hbWVbcCAtIG5hbWVdID0gTlVMOworCisgICAgLyogRmlyc3Qgc2V0IGRlZmF1bHRzICovCisgICAgbGYtPmxmSGVpZ2h0ID0gLTEyOworICAgIGxmLT5sZldpZHRoID0gMDsKKyAgICBsZi0+bGZXZWlnaHQgPSBGV19OT1JNQUw7CisgICAgbGYtPmxmSXRhbGljID0gRkFMU0U7CisgICAgbGYtPmxmVW5kZXJsaW5lID0gRkFMU0U7CisgICAgbGYtPmxmU3RyaWtlT3V0ID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBmb250IGNhbid0IGJlIGZvdW5kLCB0cnkgcmVwbGFjaW5nICdfJyBieSAnICcuCisgICAgICovCisgICAgaWYgKGluaXRfbG9nZm9udChsZikgPT0gRkFJTCkKKyAgICB7CisJaW50CWRpZF9yZXBsYWNlID0gRkFMU0U7CisKKwlmb3IgKGkgPSAwOyBsZi0+bGZGYWNlTmFtZVtpXTsgKytpKQorCSAgICBpZiAobGYtPmxmRmFjZU5hbWVbaV0gPT0gJ18nKQorCSAgICB7CisJCWxmLT5sZkZhY2VOYW1lW2ldID0gJyAnOworCQlkaWRfcmVwbGFjZSA9IFRSVUU7CisJICAgIH0KKwlpZiAoIWRpZF9yZXBsYWNlIHx8IGluaXRfbG9nZm9udChsZikgPT0gRkFJTCkKKwkgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKCpwID09ICc6JykKKwlwKys7CisKKyAgICAvKiBTZXQgdGhlIHZhbHVlcyBmb3VuZCBhZnRlciAnOicgKi8KKyAgICB3aGlsZSAoKnApCisgICAgeworCXN3aXRjaCAoKnArKykKKwl7CisJICAgIGNhc2UgJ2gnOgorCQlsZi0+bGZIZWlnaHQgPSAtIHBvaW50c190b19waXhlbHMocCwgJnAsIFRSVUUsIChpbnQpcHJpbnRlcl9kYyk7CisJCWJyZWFrOworCSAgICBjYXNlICd3JzoKKwkJbGYtPmxmV2lkdGggPSBwb2ludHNfdG9fcGl4ZWxzKHAsICZwLCBGQUxTRSwgKGludClwcmludGVyX2RjKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2InOgorI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisJCWxmLT5sZldlaWdodCA9IEZXX0JPTEQ7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2knOgorI2lmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCisJCWxmLT5sZkl0YWxpYyA9IFRSVUU7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIGNhc2UgJ3UnOgorCQlsZi0+bGZVbmRlcmxpbmUgPSBUUlVFOworCQlicmVhazsKKwkgICAgY2FzZSAncyc6CisJCWxmLT5sZlN0cmlrZU91dCA9IFRSVUU7CisJCWJyZWFrOworCSAgICBjYXNlICdjJzoKKwkJeworCQkgICAgc3RydWN0IGNoYXJzZXRfcGFpciAqY3A7CisKKwkJICAgIGZvciAoY3AgPSBjaGFyc2V0X3BhaXJzOyBjcC0+bmFtZSAhPSBOVUxMOyArK2NwKQorCQkJaWYgKFNUUk5DTVAocCwgY3AtPm5hbWUsIHN0cmxlbihjcC0+bmFtZSkpID09IDApCisJCQl7CisJCQkgICAgbGYtPmxmQ2hhclNldCA9IGNwLT5jaGFyc2V0OworCQkJICAgIHAgKz0gc3RybGVuKGNwLT5uYW1lKTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIGlmIChjcC0+bmFtZSA9PSBOVUxMKQorCQkgICAgeworCQkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiKSwgcCwgbmFtZSk7CisJCQlFTVNHKElPYnVmZik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQl9CisJICAgIGRlZmF1bHQ6CisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYsCisJCQlfKCJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIiksCisJCQlwWy0xXSwgbmFtZSk7CisJCUVNU0coSU9idWZmKTsKKwkJYnJlYWs7CisJfQorCXdoaWxlICgqcCA9PSAnOicpCisJICAgIHArKzsKKyAgICB9CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikKK3RoZWVuZDoKKyNlbmRpZgorICAgIC8qIHJvbjogaW5pdCBsYXN0bGYgKi8KKyAgICBpZiAocHJpbnRlcl9kYyA9PSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShsYXN0bGYpOworCWxhc3RsZiA9IChMT0dGT05UICopYWxsb2Moc2l6ZW9mKExPR0ZPTlQpKTsKKwlpZiAobGFzdGxmICE9IE5VTEwpCisJICAgIG1jaF9tZW1tb3ZlKGxhc3RsZiwgbGYsIHNpemVvZihMT0dGT05UKSk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKEZFQVRfUFJJTlRFUikgKi8KZGlmZiAtLWdpdCBhL3NyYy9vc19vczJfY2ZnLmggYi9zcmMvb3Nfb3MyX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2I0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3Nfb3MyX2NmZy5oCkBAIC0wLDAgKzEsMjUxIEBACisvKiBvc19vczJfY2ZnLmggKi8KKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6ICovCisKKyNkZWZpbmUgQ0FTRV9JTlNFTlNJVElWRV9GSUxFTkFNRSAgIC8qIGlnbm9yZSBjYXNlIHdoZW4gY29tcGFyaW5nIGZpbGUgbmFtZXMgKi8KKyNkZWZpbmUgU1BBQ0VfSU5fRklMRU5BTUUKKyNkZWZpbmUgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisjZGVmaW5lIEJJTkFSWV9GSUxFX0lPCisjZGVmaW5lIFVTRV9DUk5MCQkvKiBsaW5lcyBlbmQgaW4gQ1ItTkwgaW5zdGVhZCBvZiBOTCAqLworI2RlZmluZSBOT19FWFBBTkRQQVRICQkvKiBhbHdheXMgY2FsbCBtY2hfZXhwYW5kX3dpbGRjYXJkcyAqLworI2RlZmluZSBVU0VfRVhFX05BTUUJCS8qIHVzZSBhcmd2WzBdIGZvciAkVklNICovCisjZGVmaW5lIFVTRV9URVJNX0NPTlNPTEUKKyNkZWZpbmUgSEFWRV9EVVAJCS8qIGhhdmUgZHVwKCkgKi8KKworI2RlZmluZSBGTkFNRV9JTExFR0FMICJcIio/Pjx8IiAvKiBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUgKi8KKworLyoKKyAqIFRoZSByZXN0IGlzIG1hbnVhbGx5IGdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBQYXVsIFNsb290bWFuLgorICovCisKKy8qIERlZmluZSB1bmxlc3Mgbm8gWCBzdXBwb3J0IGZvdW5kICovCisjdW5kZWYgSEFWRV9YMTEKKworLyogRGVmaW5lIHdoZW4gdGVybWluZm8gc3VwcG9ydCBmb3VuZCAqLworI3VuZGVmIFRFUk1JTkZPCisKKy8qIERlZmluZSB3aGVuIHRlcm1jYXAuaCBjb250YWlucyBvc3BlZWQgKi8KKyNkZWZpbmUgSEFWRV9PU1BFRUQJMQorCisjZGVmaW5lIEhBVkVfU1RSSUNNUAorI2RlZmluZSBIQVZFX1NUUk5JQ01QCisKKy8qIERlZmluZSB3aGVuIG9zcGVlZCBjYW4gYmUgZXh0ZXJuICovCisjZGVmaW5lIE9TUEVFRF9FWFRFUk4KKworLyogRGVmaW5lIHdoZW4gdGVybWNhcC5oIGNvbnRhaW5zIFVQLCBCQyBhbmQgUEMgKi8KKyNkZWZpbmUgSEFWRV9VUF9CQ19QQwkxCisKKy8qIERlZmluZSB3aGVuIFVQLCBCQyBhbmQgUEMgY2FuIGJlIGV4dGVybiAqLworI2RlZmluZSBVUF9CQ19QQ19FWFRFUk4KKworLyogRGVmaW5lIHdoZW4gdGVybWNhcC5oIGRlZmluZXMgb3V0ZnVudHlwZSAqLworI3VuZGVmIEhBVkVfT1VURlVOVFlQRQorCisvKiBEZWZpbmUgd2hlbiBfX0RBVEVfXyAiICIgX19USU1FX18gY2FuIGJlIHVzZWQgKi8KKyNkZWZpbmUgSEFWRV9EQVRFX1RJTUUJMQorCisjdW5kZWYgVU5JWAkvKiBkZWZpbmUgYWx3YXlzIGJ5IGN1cnJlbnQgY29uZmlndXJlIHNjcmlwdCAqLworCisvKiBEZWZpbmVkIHRvIHRoZSBzaXplIG9mIGFuIGludCAqLworI2RlZmluZSBTSVpFT0ZfSU5UIDQKKworLyoKKyAqIElmIHdlIGNhbm5vdCB0cnVzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBsaWJyYXJpZXMsIHdlIHVzZSBvdXIKKyAqIG93biBzYWZlIGJ1dCBwcm9iYWJseSBzbG93ZXIgbWNoX21lbW1vdmUoKS4KKyAqLworI2RlZmluZSBVU0VCQ09QWQkxCisjdW5kZWYgVVNFTUVNTU9WRQorI3VuZGVmIFVTRU1FTUNQWQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG1vZGVfdAorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgcGlkX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiB1aWRfdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgZ2lkX3QKKworLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAgKi8KKyNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FCTEKKworLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDxzeXMvc2VsZWN0Lmg+LiAgKi8KKyNkZWZpbmUgU1lTX1NFTEVDVF9XSVRIX1NZU19USU1FCTEKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4JKi8KKyNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCisKKy8qIERlZmluZSBhcyB0aGUgY29tbWFuZCBhdCB0aGUgZW5kIG9mIHNpZ25hbCBoYW5kbGVycyAoIiIgb3IgInJldHVybiAwOyIpLiAgKi8KKyNkZWZpbmUgU0lHUkVUVVJOCisKKy8qIERlZmluZSBpZiB0b3V1cGVyL3RvbG93ZXIgb25seSB3b3JrIG9uIGxvd2VyL3VwZXJjYXNlIGNoYXJhY3RlcnMgKi8KKyN1bmRlZiBCUk9LRU5fVE9VUFBFUgorCisvKiBEZWZpbmUgaWYgdGdldHN0cigpIGhhcyBhIHNlY29uZCBhcmd1bWVudCB0aGF0IGlzIChjaGFyICopICovCisjdW5kZWYgVEdFVFNUUl9DSEFSX1AKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdzZXQoKSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdTRVQKKworLyogRGVmaW5lIGlmIHRoZSBnZXRjd2QoKSBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQuCSovCisjdW5kZWYgQkFEX0dFVENXRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCgpIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9HRVRDV0QJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHdkKCkgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX0dFVFdECTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZWxlY3QoKSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfU0VMRUNUCTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjc3BuKCkgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX1NUUkNTUE4JMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvbCgpIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9TVFJUT0wJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRnZXRlbnQoKSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfVEdFVEVOVAkxCisKKyNkZWZpbmUgSEFWRV9TVFJGVElNRQkgICAgLyogZ3Vlc3NlZCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbXNldCgpIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NRU1TRVQJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yKCkgZnVuY3Rpb24uCSovCisjZGVmaW5lIEhBVkVfU1RSRVJST1IJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAoKSBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY2hvd24oKSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9GQ0hPV04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW5hbWUoKSBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9SRU5BTUUJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZzeW5jKCkgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GU1lOQyAgIC8qIGV4aXN0cywgYnV0IGFwcGFyZW50bHkgQmFkIFRoaW5ncyBoYXBwZW4gd2hlbiB1c2VkICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNoZGlyKCkgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GQ0hESVIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYoKSBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudigpIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BVVEVOVgkxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dGltZW9mZGF5KCkgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwd3VpZCgpIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUFdVSUQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwd25hbSgpIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUFdOQU0KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBxc29ydCgpIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1FTT1JUICAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRElSRU5UX0gJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfTkRJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX0RJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkRJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuCSovCisjZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIDxzeXMvd2FpdC5oPiB0aGF0IGlzIG5vdCBQT1NJWC4xIGNvbXBhdGlibGUuICovCisjdW5kZWYgSEFWRV9VTklPTl9XQUlUCisKKy8qIFRoaXMgaXMgY3VycmVudGx5IHVudXNlZCBpbiB2aW06ICovCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisvKiAjdW5kZWYgU1REQ19IRUFERVJTICovCisKKy8qIGluc3RlYWQsIHdlIGNoZWNrIGEgZmV3IFNUREMgdGhpbmdzIG91cnNlbHZlcyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICTEKKyN1bmRlZiBIQVZFX1NUUklOR19ICS8qIE9uIEVNWCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHN0cmluZ3MuaCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdXRzbmFtZS5oPiBoZWFkZXIgZmlsZS4JKi8KKyNkZWZpbmUgSEFWRV9TWVNfVVRTTkFNRV9ICTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGVybWNhcC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfVEVSTUNBUF9ICTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0gJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzZ3R0eS5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU0dUVFlfSAkxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1lTX0lPQ1RMX0gJMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0ZXJtaW8uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVEVSTUlPX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSAkxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJPUFRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSAkxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19ICTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c3RlbWluZm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1lTVEVNSU5GT19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MT0NBTEVfSAkxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdHJlYW0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RSRUFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3B0ZW0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUFRFTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRlcm1pb3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVEVSTUlPU19ICTEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGliYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQkNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdGZzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRGU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1BPTExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwd2QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QV0RfSApkaWZmIC0tZ2l0IGEvc3JjL29zX3FueC5jIGIvc3JjL29zX3FueC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDA2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfcW54LmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBRTlggcG9ydCBieSBKdWxpYW4gS2lucmFpZAorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIG9zX3FueC5jCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikKK2ludCBpc19waG90b25fYXZhaWxhYmxlOworI2VuZGlmCisKK3ZvaWQgcW54X2luaXQoKQoreworI2lmIGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKQorICAgIFBoQ2hhbm5lbFBhcm1zX3QgcGFybXM7CisKKyAgICBtZW1zZXQoICZwYXJtcywgMCwgc2l6ZW9mKCBwYXJtcyApICk7CisgICAgcGFybXMuZmxhZ3MgPSBQaF9EWU5BTUlDX0JVRkZFUjsKKworICAgIGlzX3Bob3Rvbl9hdmFpbGFibGUgPSAoUGhBdHRhY2goIE5VTEwsICZwYXJtcyApICE9IE5VTEwpID8gVFJVRSA6IEZBTFNFOworI2VuZGlmCit9CisKKyNpZiAoZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pICYmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpKSB8fCBkZWZpbmVkKFBST1RPKQorCisjZGVmaW5lIENMSVBfVFlQRV9WSU0gIlZJTVRZUEUiCisjZGVmaW5lIENMSVBfVFlQRV9URVhUICJURVhUIgorCisvKiBUdXJuIG9uIHRoZSBjbGlwYm9hcmQgZm9yIGEgY29uc29sZSB2aW0gd2hlbiBwaG90b24gaXMgcnVubmluZyAqLwordm9pZCBxbnhfY2xpcF9pbml0KCkKK3sKKyAgICBpZiggaXNfcGhvdG9uX2F2YWlsYWJsZSA9PSBUUlVFICYmICFndWkuaW5fdXNlKQorCWNsaXBfaW5pdCggVFJVRSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDbGlwYm9hcmQgKi8KKworLyogTm8gc3VwcG9ydCBmb3Igb3duaW5nIHRoZSBjbGlwYm9hcmQgKi8KK2ludAorY2xpcF9tY2hfb3duX3NlbGVjdGlvbiggVmltQ2xpcGJvYXJkICpjYmQgKQoreworICAgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oIFZpbUNsaXBib2FyZCAqY2JkICkKK3sKK30KKwordm9pZAorY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oIFZpbUNsaXBib2FyZCAqY2JkICkKK3sKKyAgICBpbnQJCSAgICB0eXBlID0gTUxJTkUsIGNsaXBfbGVuZ3RoID0gMCwgaXNfdHlwZV9zZXQgPSBGQUxTRTsKKyAgICB2b2lkCSAgICAqY2JkYXRhOworICAgIFBoQ2xpcEhlYWRlciAgICAqY2xpcF9oZWFkZXI7CisgICAgY2hhcl91CSAgICAqY2xpcF90ZXh0ID0gTlVMTDsKKworICAgIGNiZGF0YSA9IFBoQ2xpcGJvYXJkUGFzdGVTdGFydCggUGhJbnB1dEdyb3VwKCBOVUxMICkpOworICAgIGlmKCBjYmRhdGEgIT0gTlVMTCApCisgICAgeworCS8qIExvb2sgZm9yIHRoZSB2aW0gc3BlY2lmaWMgY2xpcCBmaXJzdCAqLworCWNsaXBfaGVhZGVyID0gUGhDbGlwYm9hcmRQYXN0ZVR5cGUoIGNiZGF0YSwgQ0xJUF9UWVBFX1ZJTSApOworCWlmKCBjbGlwX2hlYWRlciAhPSBOVUxMICYmIGNsaXBfaGVhZGVyLT5kYXRhICE9IE5VTEwgKQorCXsKKwkgICAgc3dpdGNoKCAqKGNoYXIgKikgY2xpcF9oZWFkZXItPmRhdGEgKQorCSAgICB7CisJCWRlZmF1bHQ6IC8qIGZhbGx0aHJvdWdoIHRvIGxpbmUgdHlwZSAqLworCQljYXNlICdMJzogdHlwZSA9IE1MSU5FOyBicmVhazsKKwkJY2FzZSAnQyc6IHR5cGUgPSBNQ0hBUjsgYnJlYWs7CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJY2FzZSAnQic6IHR5cGUgPSBNQkxPQ0s7IGJyZWFrOworI2VuZGlmCisJICAgIH0KKwkgICAgaXNfdHlwZV9zZXQgPSBUUlVFOworCX0KKworCS8qIFRyeSBmb3IganVzdCBub3JtYWwgdGV4dCAqLworCWNsaXBfaGVhZGVyID0gUGhDbGlwYm9hcmRQYXN0ZVR5cGUoIGNiZGF0YSwgQ0xJUF9UWVBFX1RFWFQgKTsKKwlpZiggY2xpcF9oZWFkZXIgIT0gTlVMTCApCisJeworCSAgICBjbGlwX3RleHQgPSBjbGlwX2hlYWRlci0+ZGF0YTsKKwkgICAgY2xpcF9sZW5ndGggID0gY2xpcF9oZWFkZXItPmxlbmd0aCAtIDE7CisKKwkgICAgaWYoIGNsaXBfdGV4dCAhPSBOVUxMICYmIGlzX3R5cGVfc2V0ID09IEZBTFNFICkKKwkJdHlwZSA9IChzdHJjaHIoIGNsaXBfdGV4dCwgJ1xyJyApICE9IE5VTEwpID8gTUxJTkUgOiBNQ0hBUjsKKwl9CisKKwlpZiggKGNsaXBfdGV4dCAhPSBOVUxMKSAmJiAoY2xpcF9sZW5ndGggPiAwKSApCisJeworCSAgICBjbGlwX3lhbmtfc2VsZWN0aW9uKCB0eXBlLCBjbGlwX3RleHQsIGNsaXBfbGVuZ3RoLCBjYmQgKTsKKwl9CisKKwlQaENsaXBib2FyZFBhc3RlRmluaXNoKCBjYmRhdGEgKTsKKyAgICB9Cit9CisKK3ZvaWQKK2NsaXBfbWNoX3NldF9zZWxlY3Rpb24oIFZpbUNsaXBib2FyZCAqY2JkICkKK3sKKyAgICBpbnQgdHlwZTsKKyAgICBsb25nX3UgIGxlbjsKKyAgICBjaGFyX3UgKnRleHRfY2xpcCwgdmltX2NsaXBbMl0sICpzdHIgPSBOVUxMOworICAgIFBoQ2xpcEhlYWRlciBjbGlwX2hlYWRlclsyXTsKKworICAgIC8qIFByZXZlbnQgcmVjdXJzaW9uIGZyb20gY2xpcF9nZXRfc2VsZWN0aW9uKCkgKi8KKyAgICBpZiggY2JkLT5vd25lZCA9PSBUUlVFICkKKwlyZXR1cm47CisKKyAgICBjYmQtPm93bmVkID0gVFJVRTsKKyAgICBjbGlwX2dldF9zZWxlY3Rpb24oIGNiZCApOworICAgIGNiZC0+b3duZWQgPSBGQUxTRTsKKworICAgIHR5cGUgPSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCAmc3RyLCAmbGVuLCBjYmQgKTsKKyAgICBpZiggdHlwZSA+PSAwICkKKyAgICB7CisJdGV4dF9jbGlwID0gbGFsbG9jKCBsZW4gKyAxLCBUUlVFICk7IC8qIE5vcm1hbCB0ZXh0ICovCisKKwlpZiggdGV4dF9jbGlwICYmIHZpbV9jbGlwICkKKwl7CisJICAgIG1lbXNldCggY2xpcF9oZWFkZXIsIDAsIHNpemVvZiggY2xpcF9oZWFkZXIgKSApOworCisJICAgIFNUUk5DUFkoIGNsaXBfaGVhZGVyWzBdLnR5cGUsIENMSVBfVFlQRV9WSU0sIDggKTsKKwkgICAgY2xpcF9oZWFkZXJbMF0ubGVuZ3RoID0gc2l6ZW9mKCB2aW1fY2xpcCApOworCSAgICBjbGlwX2hlYWRlclswXS5kYXRhICAgPSB2aW1fY2xpcDsKKworCSAgICBTVFJOQ1BZKCBjbGlwX2hlYWRlclsxXS50eXBlLCBDTElQX1RZUEVfVEVYVCwgOCApOworCSAgICBjbGlwX2hlYWRlclsxXS5sZW5ndGggPSBsZW4gKyAxOworCSAgICBjbGlwX2hlYWRlclsxXS5kYXRhICAgPSB0ZXh0X2NsaXA7CisKKwkgICAgc3dpdGNoKCB0eXBlICkKKwkgICAgeworCQlkZWZhdWx0OiAvKiBmYWxsdGhyb3VnaCB0byBNTElORSAqLworCQljYXNlIE1MSU5FOgkqdmltX2NsaXAgPSAnTCc7IGJyZWFrOworCQljYXNlIE1DSEFSOgkqdmltX2NsaXAgPSAnQyc7IGJyZWFrOworI2lmZGVmIEZFQVRfVklTVUFMCisJCWNhc2UgTUJMT0NLOgkqdmltX2NsaXAgPSAnQic7IGJyZWFrOworI2VuZGlmCisJICAgIH0KKworCSAgICBTVFJOQ1BZKCB0ZXh0X2NsaXAsIHN0ciwgbGVuICk7CisJICAgIHRleHRfY2xpcFsgbGVuIF0gPSBOVUw7CisKKwkgICAgdmltX2NsaXBbIDEgXSA9IE5VTDsKKworCSAgICBQaENsaXBib2FyZENvcHkoIFBoSW5wdXRHcm91cCggTlVMTCApLCAyLCBjbGlwX2hlYWRlcik7CisJfQorCXZpbV9mcmVlKCB0ZXh0X2NsaXAgKTsKKyAgICB9CisgICAgdmltX2ZyZWUoIHN0ciApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3NfcW54LmggYi9zcmMvb3NfcW54LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkYzY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc19xbnguaApAQCAtMCwwICsxLDE5IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisjaWZkZWYgX19RTlhOVE9fXworIyBpbmNsdWRlIDxzeXMvcHJvY21nci5oPgorI2VuZGlmCisKKyNkZWZpbmUJVVNFX1RNUE5BTQorCisjZGVmaW5lIFBPU0lYCSAgICAvKiBVc2VkIGJ5IHB0eS5jICovCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikKK2V4dGVybiBpbnQgaXNfcGhvdG9uX2F2YWlsYWJsZTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29zX3Jpc2Nvcy5jIGIvc3JjL29zX3Jpc2Nvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2RhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfcmlzY29zLmMKQEAgLTAsMCArMSwxMjg4IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyoKKyAqIG9zX3Jpc2Nvcy5jCisgKgorICogVGhvbWFzIExlb25hcmQgPHRhbDE5N0BlY3Muc290b24uYWMudWs+CisgKi8KKworY29uc3QgY2hhciAqX19keW5hbWljX2RhX25hbWUgPSAiVmltIGhlYXAiOyAvKiBFbmFibGUgYW5kIG5hbWUgb3VyIGR5bmFtaWMgYXJlYSAqLworaW50IHJvX2xpbmVfbW9kZSA9IFRSVUU7ICAvKiBGb3IgRXggbW9kZSB3ZSBtdWNoIGVjaG8gY2hhcnMgdG8gdGhlIHNjcmVlbiBvdXJzZWx2ZXMgKi8KK2ludCB3aW5kb3dlZDsJCS8qIEZsYWcgLSBhcmUgd2UgcnVubmluZyBpbnNpZGUgYSB0ZXh0IHdpbmRvdz8gKi8KK2ludCBXaW5MZWZ0LCBXaW5Ub3A7CS8qIFdlIG1pZ2h0IGJlIHN0YXJ0ZWQgaW5zaWRlIGEgdGV4dCB3aW5kb3cgKi8KK2ludCBTY3JvbGxUb3A7CQkvKiBNYWtlIGN1cnNvciBtb3ZlbWVudHMgcmVsYXRpdmUgdG8gU2Nyb2xsVG9wLiAqLworCitpbnQgb2xkX2VzY2FwZV9zdGF0ZSA9IC0xOworaW50IG9sZF9jdXJzb3Jfc3RhdGUgPSAtMTsKKworI2RlZmluZSByZ2IocixnLGIpICgoYjw8MjQpICsgKGc8PDE2KSArIChyPDw4KSkKKyNkZWZpbmUgTk9STUFMX0ZHIDB4MDAwMDAwMDAKKyNkZWZpbmUgTk9STUFMX0JHIDB4ZmZmZmZmZmYKKworLyogQ29udmVydCBhIERPUyBjb2xvdXIgbnVtYmVyIHRvIGFuIFJHQiBwYWxldHRlIGVudHJ5LgorICogTWFwcGluZ3MgZnJvbSBYMTEgcmdiL3R4dCBmaWxlLgorICovCisgICAgc3RhdGljIGludAorbWFwX2NvbG91cihkb3MpCisgICAgaW50IGRvczsJCS8qIFN0YW5kYXJkIERPUyBjb2xvdXIgbnVtYmVyLiAqLworeworICAgIHN3aXRjaCAoZG9zKQorICAgIHsKKwljYXNlIDA6IHJldHVybiAwOwkJCS8qIEJsYWNrICovCisJY2FzZSAxOiByZXR1cm4gcmdiKDAsMCwxMzkpOwkJLyogRGFya0JsdWUgKi8KKwljYXNlIDI6IHJldHVybiByZ2IoMCwxMDAsMCk7CQkvKiBEYXJrR3JlZW4gKi8KKwljYXNlIDM6IHJldHVybiByZ2IoMCwxMzksMTM5KTsJCS8qIERhcmtDeWFuICovCisJY2FzZSA0OiByZXR1cm4gcmdiKDEzOSwwLDApOwkJLyogRGFya1JlZCAqLworCWNhc2UgNTogcmV0dXJuIHJnYigxMzksMCwxMzkpOwkJLyogRGFya01hZ2VudGEgKi8KKwljYXNlIDY6IHJldHVybiByZ2IoMTY1LDQyLDQyKTsJCS8qIEJyb3duLCBEYXJrWWVsbG93ICovCisJY2FzZSA3OiByZXR1cm4gcmdiKDIxMSwyMTEsMjExKTsJLyogTGlnaHRHcmF5LCBMaWdodEdyZXksIEdyYXksIEdyZXkgKi8KKwljYXNlIDg6IHJldHVybiByZ2IoMTY5LDE2OSwxNjkpOwkvKiBEYXJrR3JheSwgRGFya0dyZXkgKi8KKwljYXNlIDk6IHJldHVybiByZ2IoMTczLDIxNiwyMzApOwkvKiBCbHVlLCBMaWdodEJsdWUgKi8KKwljYXNlIDEwOiByZXR1cm4gcmdiKDE0NCwyMzgsMTQ0KTsJLyogR3JlZW4sIExpZ2h0R3JlZW4gKi8KKwljYXNlIDExOiByZXR1cm4gcmdiKDIyNCwyNTUsMjU1KTsJLyogQ3lhbiwgTGlnaHRDeWFuICovCisJY2FzZSAxMjogcmV0dXJuIHJnYigyNTUsMCwwKTsJCS8qIFJlZCwgTGlnaHRSZWQgKi8KKwljYXNlIDEzOiByZXR1cm4gcmdiKDI1NSwwLDI1NSk7CQkvKiBNYWdlbnRhLCBMaWdodE1hZ2VudGEgKi8KKwljYXNlIDE0OiByZXR1cm4gcmdiKDI1NSwyNTUsMCk7CQkvKiBZZWxsb3csIExpZ2h0WWVsbG93ICovCisJY2FzZSAxNTogcmV0dXJuIHJnYigyNTUsMjU1LDI1NSk7CS8qIFdoaXRlICovCisgICAgfQorICAgIHJldHVybiByZ2IoMTAwLDEwMCwxMDApOworfQorCisgICAgc3RhdGljIHZvaWQKK3RleHRfZmcoZmcpCisgICAgaW50IGZnOwkJLyogRm9yZWdvdW5kIGNvbG91ciBpbiB0aGUgZm9ybSAmQkJHR1JSMDAgKi8KK3sKKyAgICB4c3dpKENvbG91clRyYW5zX1NldFRleHRDb2xvdXIsIGZnLCAwLCAwLCAwKTsKK30KKworICAgIHN0YXRpYyB2b2lkCit0ZXh0X2JnKGJnKQorICAgIGludAkJYmc7CS8qIEJhY2tnb3VuZCBjb2xvdXIgaW4gdGhlIGZvcm0gJkJCR0dSUjAwICovCit7CisgICAgeHN3aShDb2xvdXJUcmFuc19TZXRUZXh0Q29sb3VyLCBiZywgMCwgMCwgMSA8PCA3KTsKK30KKworI2RlZmluZSBPVVRfTk9STUFMIDAKKyNkZWZpbmUgT1VUX05VTUJFUiAxCQkvKiBSZWFkaW5nIGluIGEgbnVtYmVyICovCisKKyAgICB2b2lkCittY2hfd3JpdGUocywgbGVuKQorICAgIGNoYXJfdSAgKnM7CisgICAgaW50CSAgICBsZW47Cit7CisgICAgc3RhdGljIGludCBtb2RlID0gT1VUX05PUk1BTDsKKyAgICBzdGF0aWMgaW50IHgsIHk7CQkJLyogRm9yIHJlYWRpbmcgbnVtYmVycyBpbi4gKi8KKworICAgIGlmICghdGVybV9jb25zb2xlKQorICAgIHsKKwkvKiBNYXliZSB3ZSBhcmUgcnVubmluZyBWaW0gcmVtb3RlbHkgLSBkb24ndCBpbnRlcnByZXQgY2hhcnMgKi8KKwl3aGlsZSAobGVuLS0pCisJeworCSAgICBjaGFyX3UgYyA9ICpzKys7CisJICAgIHN3aShPU19Xcml0ZUMsIGMpOworCSAgICAvKiBXZSBtaWdodCBuZWVkIHRvIHNlbmQgYSBDUiB0b28uIFRoaXMgc2hvdWxkbid0CisJICAgICAqIGh1cnQgaWYgd2UgZG9uJ3QgbmVlZCBpdCwgc2hvdWxkIGl0PworCSAgICAgKi8KKwkgICAgaWYgKGMgPT0gMTApCisJCXN3aShPU19Xcml0ZUkgKyAxMyk7CisJfQorCXJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuLS0pCisgICAgeworCWNoYXJfdSBjID0gKnMrKzsKKwlzd2l0Y2ggKG1vZGUpCisJeworCSAgICBjYXNlIE9VVF9OVU1CRVI6CisJCWlmIChjIDwgJzAnIHx8IGMgPiAnOScpCisJCXsKKwkJICAgIG1vZGUgPSBPVVRfTk9STUFMOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgeCA9ICh4ICogMTApICsgYyAtICcwJzsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIC8qIG5vdGU6IG5vIGJyZWFrIGhlcmUhICovCisKKwkgICAgY2FzZSBPVVRfTk9STUFMOgorCQlzd2l0Y2ggKGMpCisJCXsKKwkJICAgIGNhc2UgMToKKwkJCS8qIE51bWJlciAoaW4gZGVjaW1hbCkgZm9sbG93cy4gKi8KKwkJCW1vZGUgPSBPVVRfTlVNQkVSOworCQkJeSA9IHg7CisJCQl4ID0gMDsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAyOgorCQkJLyogUG9zaXRpb24gY3Vyc29yLiAqLworCQkJc3dpKE9TX1dyaXRlSSArIDMxKTsKKwkJCXN3aShPU19Xcml0ZUMsIHgpOworCQkJc3dpKE9TX1dyaXRlQywgeSAtIFNjcm9sbFRvcCk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMzoKKwkJCS8qIFNldCBzY3JvbGwgcmVnaW9uLiAqLworCQkJaWYgKHggPT0gUm93cyAtMSAmJiB5ID09IDAgJiYgIXdpbmRvd2VkKQorCQkJeworCQkJICAgIC8qIFdob2xlIHNjcmVlbiAtIHJlbW92ZSB0ZXh0IHdpbmRvdy4KKwkJCSAgICAgKiBUaGlzIGlzIE1VQ0ggZmFzdGVyLgorCQkJICAgICAqLworCQkJICAgIHN3aShPU19Xcml0ZUkgKyAyNik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgLyogQ3JlYXRlIGEgdGV4dCB3aW5kb3cuICovCisJCQkgICAgc3dpKE9TX1dyaXRlSSArIDI4KTsKKwkJCSAgICBzd2koT1NfV3JpdGVDLCBXaW5MZWZ0KTsKKwkJCSAgICBzd2koT1NfV3JpdGVDLCBXaW5Ub3AgKyB4KTsKKwkJCSAgICBzd2koT1NfV3JpdGVDLCBXaW5MZWZ0ICsgQ29sdW1ucyAtIDEpOworCQkJICAgIHN3aShPU19Xcml0ZUMsIFdpblRvcCArIHkpOworCQkJfQorCQkJU2Nyb2xsVG9wID0geTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSA0OgorCQkJLyogTm9ybWFsIG1vZGUuICovCisJCQl0ZXh0X2ZnKE5PUk1BTF9GRyk7CisJCQl0ZXh0X2JnKE5PUk1BTF9CRyk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgNToKKwkJCS8qIFJldmVyc2UgbW9kZS4gKi8KKwkJCXRleHRfZmcoTk9STUFMX0JHKTsKKwkJCXRleHRfYmcoTk9STUFMX0ZHKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAxMDoKKwkJCXN3aShPU19OZXdMaW5lKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAxNDoKKwkJCS8qIEN1cnNvciBpbnZpc2libGUuICovCisJCQlzd2koT1NfV3JpdGVOLAorCQkJICAgICAiXDAyN1wwMDFcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCisJCQkgICAgIDEwKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAxNToKKwkJCS8qIEN1cnNvciB2aXNpYmxlLiAqLworCQkJc3dpKE9TX1dyaXRlTiwKKwkJCSAgICAgIlwwMjdcMDAxXDAwMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAorCQkJICAgICAxMCk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMTY6CisJCQkvKiBDdXJzb3IgdmVyeSB2aXNpYmxlIChmbGFzaCkgKi8KKwkJCXN3aShPU19Xcml0ZU4sCisJCQkgICAgICJcMDI3XDAwMVwwMDNcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKwkJCSAgICAgMTApOworCQkgICAgY2FzZSAxNzoKKwkJCS8qIFNldCBmb3JlZ3JvdW5kIGNvbG91ci4gKi8KKwkJCXRleHRfZmcobWFwX2NvbG91cih4KSk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMTg6CisJCQkvKiBTZXQgYmFja2dyb3VuZCBjb2xvdXIuICovCisJCQl0ZXh0X2JnKG1hcF9jb2xvdXIoeCkpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIDE5OgorCQkJLyogU2Nyb2xsIHRleHQgZG93bi4gKi8KKwkJCXN3aShPU19Xcml0ZU4sCisJCQkgICAgICJcMDI3XDAwN1wwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKwkJCSAgICAgMTApOworCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkJc3dpKE9TX1dyaXRlQywgYyk7CisJCX0KKwkJY29udGludWU7CisKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRmKCJbb3V0cHV0IGVycm9yXSIpOworCQltb2RlID0gT1VUX05PUk1BTDsKKwl9CisgICAgfQorfQorCisvKgorICogbWNoX2luY2hhcigpOiBsb3cgbGV2ZWwgaW5wdXQgZnVuY2lvbi4KKyAqIEdldCBhIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZS4KKyAqIElmIHd0aW1lID09IDAgZG8gbm90IHdhaXQgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB3dGltZSA9PSBuIHdhaXQgbiBtc2VjcyBmb3IgY2hhcmFjdGVycy4KKyAqIElmIHd0aW1lID09IC0xIHdhaXQgZm9yZXZlciBmb3IgY2hhcmFjdGVycy4KKyAqCisgKiBUT0RPOiBjYWxsIGNvbnZlcnRfaW5wdXQoKSBmb3IgJ2ZpbGVlbmNvZGluZycgdG8gJ2VuY29kaW5nJyBjb252ZXJzaW9uLgorICovCisgICAgaW50CittY2hfaW5jaGFyKGJ1ZiwgbWF4bGVuLCB3dGltZSwgdGJfY2hhbmdlX2NudCkKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50CSAgICBtYXhsZW47CisgICAgbG9uZyAgICB3dGltZTsKKyAgICBpbnQJICAgIHRiX2NoYW5nZV9jbnQ7Cit7CisgICAgaW50IGdvdD0wOworICAgIHVuc2lnbmVkIGludCBzdGFydF90aW1lID0gY2xvY2soKTsKKworICAgIGlmIChyb19saW5lX21vZGUpCisgICAgeworCS8qIFdlJ3JlIHByb2JhYmx5IGluIEV4IG1vZGUgLSBnZXQgd2hvbGUgbGluZXMgYXQgYSB0aW1lLiAqLworCisJc3RhdGljIGNoYXJfdQlsaW5lX2J1ZmZlclsyNTZdOworCXN0YXRpYyBpbnQJcmVtYWluaW5nX2NoYXJzID0gMDsKKwlzdGF0aWMgaW50CWJ1Zl9wb3MgPSAwOworCisJLyogRG8gd2UgbmVlZCB0byBmZXRjaCBhbm90aGVyIGxpbmU/ICovCisJaWYgKHJlbWFpbmluZ19jaGFycyA9PSAwKQorCXsKKwkgICAgaW50CQlvbGRfZXNjX3N0YXRlOworCSAgICBzd2koT1NfQnl0ZSwgMjAwLCAxLCAweGZlKTsKKwkgICAgb2xkX2VzY19zdGF0ZSA9IHIxOworCisJICAgIGJ1Zl9wb3MgPSAwOworCSAgICBpZiAoeHN3aShPU19SZWFkTGluZSwgbGluZV9idWZmZXIsIDI1NSwgMCwgMjU1KSAmIChjX2ZsYWcgfCB2X2ZsYWcpKQorCSAgICB7CisJCWdvdF9pbnQgPSBUUlVFOwkgICAgLyogRVNDIHByZXNzZWQgKi8KKwkJcjEgPSAwOworCSAgICB9CisJICAgIGxpbmVfYnVmZmVyW3IxXSA9IDEzOworCSAgICByZW1haW5pbmdfY2hhcnMgPSByMSArIDE7CS8qIENvdW50IENSIGFzIHBhcnQgb2YgaW5wdXQgKi8KKworCSAgICBzd2koT1NfQnl0ZSwgMjAwLCBvbGRfZXNjX3N0YXRlLCAwKTsKKwl9CisKKwkvKiBDYW4gd2Ugc2VuZCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIGJhY2sgaW4gb25lIGdvPyAqLworCWlmIChyZW1haW5pbmdfY2hhcnMgPD0gbWF4bGVuKQorCXsKKwkgICAgaW50CSAgICBnb3QgPSByZW1haW5pbmdfY2hhcnM7CisKKwkgICAgbWVtY3B5KGJ1ZiwgbGluZV9idWZmZXIgKyBidWZfcG9zLCBnb3QpOworCSAgICByZW1haW5pbmdfY2hhcnMgPSAwOworCSAgICByZXR1cm4gIGdvdDsKKwl9CisKKwkvKiBTZW5kIGFzIG11Y2ggYXMgd2UgY2FuICovCisJbWVtY3B5KGJ1ZiwgbGluZV9idWZmZXIgKyBidWZfcG9zLCBtYXhsZW4pOworCWJ1Zl9wb3MgKz0gbWF4bGVuOworCXJlbWFpbmluZ19jaGFycyAtPSBtYXhsZW47CisKKwlyZXR1cm4gbWF4bGVuOworICAgIH0KKworICAgIGlmICghdGVybV9jb25zb2xlKQorICAgIHsKKwkvKiBVc2UgT1NfUmVhZEMgZm9yIGFsbCBpbnB1dC4KKwkgKiBBdm9pZHMgcHJvYmxlbXMgd2l0aCByZW1vdGUgYWNjZXNzIGdldHRpbmcgaW50ZXJmZXJlbmNlIGZyb20KKwkgKiB0aGUga2V5Ym9hcmQuCisJICovCisJaWYgKHd0aW1lID09IDApCisJICAgIHJldHVybiAwOwkgICAgLyogSWdub3JlIHF1aWNrIGtleSBjaGVja3MgKi8KKworCWlmICh4c3dpKE9TX1JlYWRDKSAmIGNfZmxhZykKKwl7CisJICAgIGdvdF9pbnQgPSBUUlVFOwkvKiBFU0MgcHJlc3NlZCAtIGNhbiB0aGlzIGhhcHBlbj8gKi8KKwkgICAgc3dpKE9TX0J5dGUsIDEyNCk7CS8qIENsZWFyIEVzY2FwZSBzdGF0ZSAqLworCSAgICByMCA9IDB4MWI7CQkvKiBJdCAqbWlnaHQqIG5vdCBoYXZlIGJlZW4gRXNjYXBlISAqLworCX0KKwlidWZbMF0gPSByMDsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE9LLCBoZXJlJ3MgdGhlIHBsYW46CisgICAgICoKKyAgICAgKiAxKSBXYWl0IHVudGlsIHd0aW1lIGV4cGlyZXMgb3Igd2UgZ2V0IGEga2V5CisgICAgICogMikgR2V0IGtleXMgdW50aWwgdGhlIGtleWJvYXJkIGJ1ZmZlciBpcyBlbXB0eSBvciBidWYgaXMgZnVsbAorICAgICAqLworCisgICAgd2hpbGUgKHhzd2koT1NfQnl0ZSwxNDUsMCkgJiBjX2ZsYWcpCisgICAgeworCS8qIE5vdGhpbmcgYXQgYWxsIGluIHRoZSBrZXlib2FyZCBidWZmZXIuCisJICogSGFzIG91ciB0aW1lIGV4cGlyZWQgeWV0PworCSAqLworCWlmICggKHd0aW1lICE9IC0xKSAmJiAoY2xvY2soKSAtIHN0YXJ0X3RpbWUpID49IHd0aW1lICkKKwkgICAgcmV0dXJuIDA7CQkvKiBOb3RoaW5nIHJlYWQgLSBnaXZpbmcgdXAgKi8KKyAgICB9CisKKyAgICAvKiBXZSd2ZSBnb3Qgb25lIGNoYXIgKGluIHIyKSAtIGFyZSB0aGVyZSBhbnkgbW9yZT8gKi8KKworICAgIHdoaWxlIChnb3QgPCBtYXhsZW4pCisgICAgeworCWJ1Zltnb3QrK10gPSByMjsKKworCWlmICh4c3dpKE9TX0J5dGUsMTQ1LDApICYgY19mbGFnKQorCSAgICByZXR1cm4gZ290OwkJLyogS2V5Ym9hcmQgYnVmZmVyIGVtcHR5ICovCisgICAgfQorICAgIHJldHVybiBnb3Q7CQkJLyogYnVmIGlzIGZ1bGwgKi8KK30KKworLyoKKyAqIHJldHVybiBub24temVybyBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKKyAqLworICAgIGludAorbWNoX2NoYXJfYXZhaWwoKQoreworICAgIGlmICghdGVybV9jb25zb2xlKQorCXJldHVybiAwOwkgICAgLyogQ2FuJ3QgdGVsbCAqLworICAgIGlmICh4c3dpKE9TX0J5dGUsIDE1MiwgMCkgJiBjX2ZsYWcpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIEZpbmQgb3V0IGhvdyBtdWNoIGZyZWUgbWVtb3J5IHdlIGhhdmUuCisgKiBJIGRvbid0IGtub3cgaG93IHRvIHdvcmsgdGhpcyBvdXQgZXhhY3RseSBidXQsIHNpbmNlIHdlIGNhbiBjbGFpbQorICogbW9yZSBtZW1vcnkgZnJvbSB0aGUgT1MsIGxldCdzIGp1c3QgcmVwb3J0IHRoZSBmcmVlIHBvb2wgc2l6ZS4KKyAqIER5bmFtaWMgYXJlYSA2IGRvZXNuJ3QgZXhpc3QgcHJlIDMuNiBhY2NvcmRpbmcgdG8gU3Ryb25nSGVscCwgc28KKyAqIHdlJ2xsIHVzZSBXaW1wX1Nsb3RTaXplLiBJZiB0aGF0IGZhaWxzIChvdXRzaWRlIHRoZSBkZXNrdG9wPykKKyAqIHRoZW4ganVzdCByZXR1cm4gYSBiaWcgbnVtYmVyIGFuZCBob3BlLgorICovCisgICAgbG9uZ191CittY2hfYXZhaWxfbWVtKHNwZWNpYWwpCisgICAgaW50IHNwZWNpYWw7Cit7CisgICAgaWYgKHhzd2koV2ltcF9TbG90U2l6ZSwgLTEsIC0xKSAmIHZfZmxhZykKKwlyZXR1cm4gMHg3ZmZmZmZmZjsKKyAgICByZXR1cm4gcjI7Cit9CisKKyAgICB2b2lkCittY2hfZGVsYXkobXNlYywgaWdub3JlaW5wdXQpCisgICAgbG9uZwltc2VjOworICAgIGludAkJaWdub3JlaW5wdXQ7Cit7CisgICAgaW50CQlzdGFydF90aW1lLCB0aW1lX25vdzsKKyAgICBpbnQJCWNzZWMgPSBtc2VjIC8gMTA7CisKKyAgICBzd2koT1NfUmVhZE1vbm90b25pY1RpbWUpOworICAgIHN0YXJ0X3RpbWUgPSByMDsKKworICAgIGZvciAoOzspCisgICAgeworCXN3aShPU19SZWFkTW9ub3RvbmljVGltZSk7CisJdGltZV9ub3cgPSByMDsKKwlpZiAodGltZV9ub3cgLSBzdGFydF90aW1lID4gY3NlYykKKwkgICAgcmV0dXJuOworI2lmZGVmIEZFQVRfR1VJCisJLyogSW4gdGhlIEdVSSwgYWxsb3cgb3RoZXIgcHJvZ3JhbXMgdG8gcnVuIHdoaWxlIHdhaXRpbmcuICovCisJaWYgKGd1aS5pbl91c2UpCisJICAgIGd1aV9tY2hfd2FpdF9mb3JfY2hhcnMoc3RhcnRfdGltZSArIGNzZWMpOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogSWYgdGhlIG1hY2hpbmUgaGFzIGpvYiBjb250cm9sLCB1c2UgaXQgdG8gc3VzcGVuZCB0aGUgcHJvZ3JhbSwKKyAqIG90aGVyd2lzZSBmYWtlIGl0IGJ5IHN0YXJ0aW5nIGEgbmV3IHNoZWxsLgorICovCisgICAgdm9pZAorbWNoX3N1c3BlbmQoKQoreworICAgIHN1c3BlbmRfc2hlbGwoKTsKK30KKworICAgIHZvaWQKK21jaF9pbml0KCkKK3sKKyAgICAvKgorICAgICAqIFJlYWQgd2luZG93IHNpemUgZmlyc3QuIENhbGxzIHRvIG1jaF9nZXRfc2hlbGxzaXplKCkgd2lsbAorICAgICAqIHNpbXBseSByZXR1cm4gdGhlc2UgdmFsdWVzIGluIGZ1dHVyZSBzbyB0aGF0IHNldHRpbmcgdGhlCisgICAgICogdGV4dCB3aW5kb3cgKHVzZWQgZm9yIHNjcm9sbGluZykgd29uJ3QgZ2l2ZSBzdHJhbmdlIHJlc3VsdHMuCisgICAgICovCisKKyAgICBpbnQgYnVmWzddID0gezEzMiwgMTM1LCAyNTYsIDI1NywgMSwgMiwgLTF9OworCisgICAgLyogQ29tbWFuZCB3aW5kb3dzIGFyZSBubyBsb25nZXIgZm9yY2VkIG9wZW4sIHNpbmNlIGlmIHdlIGFyZQorICAgICAqIGluIHRoZSBkZXNrdG9wIHRoZW4gd2UnbGwgdXNlIHRoZSBHVUkgdmVyc2lvbi4KKyAgICAgKiBPcGVuaW5nIGEgY29tbWFuZCB3aW5kb3cgaGVyZSBtZXNzZXMgdXAgdGhlIEdVSSB2ZXJzaW9uIHN0YXJ0dXAKKyAgICAgKi8KKyNpZm5kZWYgRkVBVF9HVUkKKyAgICBzd2koT1NfV3JpdGVJKTsKKyNlbmRpZgorICAgIHN3aShPU19SZWFkVmR1VmFyaWFibGVzLCBidWYsIGJ1Zik7CisgICAgV2luTGVmdCA9IGJ1ZlswXTsKKyAgICBXaW5Ub3AgID0gYnVmWzFdOworICAgIENvbHVtbnMgPSBidWZbMl07CisgICAgUm93cyAgICA9IGJ1ZlszXSArIDE7CS8qIFNlZW1zIHRvIGJlIG9uZSBvZmYgKFZkdVZhcnMgd3Jvbmc/KSAqLworICAgIFNjcm9sbFRvcCA9IDA7CisKKyAgICAvKiBBcmUgd2UgcnVubmluZyBpbiBhIHRleHR3aW5kb3c/ICovCisgICAgaWYgKFJvd3MgPT0gYnVmWzVdICsgMSAmJiBDb2x1bW5zID09IGJ1Zls0XSArIDEpCisJd2luZG93ZWQgPSAwOworICAgIGVsc2UKKwl3aW5kb3dlZCA9IDE7CisKKyAgICAvKiBDaG9vc2UgYSBuaWNlIGNvbG91ciBzY2hlbWUuICovCisgICAgdGV4dF9mZyhOT1JNQUxfRkcpOworICAgIHRleHRfYmcoTk9STUFMX0JHKTsKK30KKworLyoKKyAqIENoZWNrX3dpbiBjaGVja3Mgd2hldGhlciB3ZSBoYXZlIGFuIGludGVyYWN0aXZlIHN0ZG91dC4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK21jaF9jaGVja193aW4oYXJnYywgYXJndikKKyAgICBpbnQJICAgIGFyZ2M7CisgICAgY2hhciAgICAqKmFyZ3Y7Cit7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIGlucHV0IGNvbWVzIGZyb20gYSB0ZXJtaW5hbCwgRkFMU0Ugb3RoZXJ3aXNlLgorICovCisgICAgaW50CittY2hfaW5wdXRfaXNhdHR5KCkKK3sKKyAgICBpZiAoeHN3aShPU19DaGFuZ2VSZWRpcmVjdGlvbiwgLTEsIC0xKSAmIHZfZmxhZykKKwlyZXR1cm4gVFJVRTsJCS8qIEVycm9yIC0gVFJVRSBpcyBwcm9iYWJseSBjb3JyZWN0IHRob3VnaCAqLworICAgIGlmIChyMCA9PSAwKQorCXJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBpbnQKK21jaF9jYW5fcmVzdG9yZV90aXRsZSgpCit7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisgICAgaW50CittY2hfY2FuX3Jlc3RvcmVfaWNvbigpCit7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisgKiBTZXQgdGhlIHdpbmRvdyB0aXRsZSBhbmQgaWNvbi4KKyAqLworICAgIHZvaWQKK21jaF9zZXR0aXRsZSh0aXRsZSwgaWNvbikKKyAgICBjaGFyX3UgKnRpdGxlOworICAgIGNoYXJfdSAqaWNvbjsKK3sKKyAgICBpZiAodGl0bGUgPT0gTlVMTCkKKwl0aXRsZSA9IChjaGFyX3UgKikgIjx1bnRpdGxlZD4iOworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UgJiYgc3RyY21wKHRpdGxlLCBndWkud2luZG93X3RpdGxlKSkKKyAgICB7CisJaW50IGxlbmd0aDsKKwlsZW5ndGggPSBzdHJsZW4odGl0bGUpOworCWlmIChsZW5ndGggPj0gZ3VpLndpbmRvd190aXRsZV9zaXplKQorCSAgICBsZW5ndGggPSBndWkud2luZG93X3RpdGxlX3NpemUgLSAxOworCXN0cm5jcHkoZ3VpLndpbmRvd190aXRsZSwgdGl0bGUsIGxlbmd0aCk7CisJZ3VpLndpbmRvd190aXRsZVtsZW5ndGhdID0gMDsKKwlyb19yZWRyYXdfdGl0bGUoZ3VpLndpbmRvd19oYW5kbGUpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybjsKK30KKworLyoKKyAqIFJlc3RvcmUgdGhlIHdpbmRvdy9pY29uIHRpdGxlLgorICogIndoaWNoIiBpcyBvbmUgb2Y6CisgKiAgMSAgb25seSByZXN0b3JlIHRpdGxlCisgKiAgMiAgb25seSByZXN0b3JlIGljb24KKyAqICAzICByZXN0b3JlIHRpdGxlIGFuZCBpY29uCisgKi8KKyAgICB2b2lkCittY2hfcmVzdG9yZV90aXRsZSh3aGljaCkKKyAgICBpbnQgd2hpY2g7Cit7CisgICAgcmV0dXJuOworfQorI2VuZGlmCisKKy8qCisgKiBJbnNlcnQgdXNlciBuYW1lIGluIHNbbGVuXS4KKyAqIFJldHVybiBPSyBpZiBhIG5hbWUgZm91bmQuCisgKi8KKyAgICBpbnQKK21jaF9nZXRfdXNlcl9uYW1lKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworICAgIC8qIFJJU0MgT1MgZG9lc24ndCBzdXBwb3J0IHVzZXIgbmFtZXMuICovCisgICAgKnMgPSBOVUw7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBJbnNlcnQgaG9zdCBuYW1lIGluIHNbbGVuXS4KKyAqLworCisgICAgdm9pZAorbWNoX2dldF9ob3N0X25hbWUocywgbGVuKQorICAgIGNoYXJfdSAgKnM7CisgICAgaW50CSAgICBsZW47Cit7CisgICAgaWYgKHhzd2koT1NfUmVhZFZhclZhbCwgIk1hY2hpbmUkTmFtZSIsIHMsIGxlbiwgMCwgMykgJiB2X2ZsYWcpCisgICAgeworCS8qIFZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IChub3JtYWwgb3BlcmF0aW9uKSAqLworCVNUUk5DUFkocywgIih1bmtub3duKSIsIGxlbik7CisgICAgfQorfQorCisvKgorICogcmV0dXJuIHByb2Nlc3MgSUQKKyAqLworICAgIGxvbmcKK21jaF9nZXRfcGlkKCkKK3sKKyAgICBpZiAoeHN3aShXaW1wX1JlYWRTeXNJbmZvLCA1KSAmIHZfZmxhZykKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gcjA7Cit9CisKKy8qCisgKiBHZXQgbmFtZSBvZiBjdXJyZW50IGRpcmVjdG9yeSBpbnRvIGJ1ZmZlciAnYnVmJyBvZiBsZW5ndGggJ2xlbicgYnl0ZXMuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK21jaF9kaXJuYW1lKGJ1ZiwgbGVuKQorICAgIGNoYXJfdSAgKmJ1ZjsKKyAgICBpbnQJICAgIGxlbjsKK3sKKyAgICBpZiAoeHN3aShPU19GU0NvbnRyb2wsIDM3LCAiQCIsIGJ1ZiwgMCwgMCwgbGVuKSAmIHZfZmxhZykKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBHZXQgYWJzb2x1dGUgZmlsZSBuYW1lIGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgZm9yIHN1Y2Nlc3MKKyAqLworICAgIGludAorbWNoX0Z1bGxOYW1lKGZuYW1lLCBidWYsIGxlbiwgZm9yY2UpCisgICAgY2hhcl91ICpmbmFtZSwgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIGludAlmb3JjZTsJCS8qIEFsc28gZXhwYW5kIHdoZW4gYWxyZWFkeSBhYnNvbHV0ZSBwYXRoIG5hbWUuCisJCQkgKiBOb3QgdXNlZCB1bmRlciBSSVNDIE9TLgorCQkJICovCit7CisgICAgaWYgKHhzd2koT1NfRlNDb250cm9sLCAzNywgZm5hbWUsIGJ1ZiwgMCwgMCwgbGVuKSAmIHZfZmxhZykKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiZm5hbWUiIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKi8KKyAgICBpbnQKK21jaF9pc0Z1bGxOYW1lKGZuYW1lKQorICAgIGNoYXJfdQkqZm5hbWU7Cit7CisgICAgaWYgKHN0cnN0cihmbmFtZSwgIjo6IikgJiYgc3Ryc3RyKGZuYW1lLCIuJC4iKSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBHZXQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgJ25hbWUnLgorICogUmV0dXJucyAtMSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBsb25nCittY2hfZ2V0cGVybShuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworICAgIGlmIChzdGF0KChjaGFyICopbmFtZSwgJnN0YXRiKSkKKwlyZXR1cm4gLTE7CisgICAgcmV0dXJuIHN0YXRiLnN0X21vZGU7Cit9CisKKy8qCisgKiBzZXQgZmlsZSBwZXJtaXNzaW9uIGZvciAnbmFtZScgdG8gJ3Blcm0nCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50CittY2hfc2V0cGVybShuYW1lLCBwZXJtKQorICAgIGNoYXJfdSAgKm5hbWU7CisgICAgbG9uZyAgICBwZXJtOworeworICAgIHJldHVybiAoY2htb2QoKGNoYXIgKiluYW1lLCAobW9kZV90KXBlcm0pID09IDAgPyBPSyA6IEZBSUwpOworfQorCisvKgorICogU2V0IGhpZGRlbiBmbGFnIGZvciAibmFtZSIuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgdm9pZAorbWNoX2hpZGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgLyogY2FuJ3QgaGlkZSBhIGZpbGUgKi8KK30KKworLyoKKyAqIHJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBhIGRpcmVjdG9yeQorICogcmV0dXJuIEZBTFNFIGlmICJuYW1lIiBpcyBub3QgYSBkaXJlY3RvcnkKKyAqIHJldHVybiBGQUxTRSBmb3IgZXJyb3IKKyAqLworICAgIGludAorbWNoX2lzZGlyKG5hbWUpCisgICAgY2hhcl91ICpuYW1lOworeworICAgIGlmICh4c3dpKE9TX0ZpbGUsIDE3LCBuYW1lKSAmIHZfZmxhZykKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYgKHIwID09IDIgfHwgcjAgPT0gMykKKwlyZXR1cm4gVFJVRTsJCS8qIENvdW50IGltYWdlIGZpbGVzIGFzIGRpcmVjdG9yaWVzLiAqLworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiAxIGlmICJuYW1lIiBjYW4gYmUgZXhlY3V0ZWQsIDAgaWYgbm90LgorICogUmV0dXJuIC0xIGlmIHVua25vd24uIFJlcXVpcmVzIHdoaWNoIHRvIHdvcmsuCisgKi8KKyAgICBpbnQKK21jaF9jYW5fZXhlKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGNoYXJfdQkqYnVmOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXJldHZhbDsKKworICAgIGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZClTVFJMRU4obmFtZSkgKyA3KTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgIHNwcmludGYoKGNoYXIgKilidWYsICJ3aGljaCAlcyIsIG5hbWUpOworICAgIHAgPSBnZXRfY21kX291dHB1dChidWYsIFNIRUxMX1NJTEVOVCk7CisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybiAtMTsKKyAgICAvKiByZXN1bHQgY2FuIGJlOiAibmFtZTogQ29tbWFuZCBub3QgZm91bmQiICovCisgICAgcmV0dmFsID0gKCpwICE9IE5VTCAmJiBzdHJzdHIoKGNoYXIgKilwLCAibm90IGZvdW5kIikgPT0gTlVMTCk7CisgICAgdmltX2ZyZWUocCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKgorICogQ2hlY2sgd2hhdCAibmFtZSIgaXM6CisgKiBOT0RFX05PUk1BTDogZmlsZSBvciBkaXJlY3RvcnkgKG9yIGRvZXNuJ3QgZXhpc3QpCisgKiBOT0RFX1dSSVRBQkxFOiB3cml0YWJsZSBkZXZpY2UsIHNvY2tldCwgZmlmbywgZXRjLgorICogTk9ERV9PVEhFUjogbm9uLXdyaXRhYmxlIHRoaW5ncworICovCisgICAgaW50CittY2hfbm9kZXR5cGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgLyogVE9ETyAqLworICAgIHJldHVybiBOT0RFX05PUk1BTDsKK30KKworICAgIHZvaWQKK21jaF9lYXJseV9pbml0KCkKK3sKKyAgICAvKiBUdXJuIG9mZiBhbGwgdGhlIGhvcnJpYmxlIGZpbGVuYW1lIG11bmdpbmcgaW4gVW5peExpYi4gKi8KKyAgICBfX3Jpc2Nvc2lmeV9jb250cm9sID0gX19SSVNDT1NJRllfTk9fUFJPQ0VTUzsKK30KKworICAgIHZvaWQKK21jaF9leGl0KHIpCisgICAgaW50IHI7Cit7CisgICAgc2V0dG1vZGUoVE1PREVfQ09PSyk7CisgICAgZXhpdGluZyA9IFRSVUU7CisgICAgb3V0X2ZsdXNoKCk7CisgICAgbWxfY2xvc2VfYWxsKFRSVUUpOwkJLyogcmVtb3ZlIGFsbCBtZW1maWxlcyAqLworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfZXhpdChyKTsKKyNlbmRpZgorICAgIHN3aShPU19OZXdMaW5lKTsKKyAgICBpZiAob2xkX2VzY2FwZV9zdGF0ZSAhPSAtMSkKKwlzd2koT1NfQnl0ZSwgMjI5LCBvbGRfZXNjYXBlX3N0YXRlLCAwKTsKKyAgICBpZiAob2xkX2N1cnNvcl9zdGF0ZSAhPSAtMSkKKwlzd2koT1NfQnl0ZSwgNCwgb2xkX2N1cnNvcl9zdGF0ZSk7CisgICAgZXhpdChyKTsKK30KKworICAgIHZvaWQKK21jaF9zZXR0bW9kZSh0bW9kZSkKKyAgICBpbnQJCXRtb2RlOwkgICAgLyogVE1PREVfUkFXIG9yIFRNT0RFX0NPT0sgKi8KK3sKKyAgICBpZiAodG1vZGUgPT0gVE1PREVfQ09PSykKKyAgICB7CisJcm9fbGluZV9tb2RlID0gVFJVRTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcm9fbGluZV9tb2RlID0gRkFMU0U7CisKKyAgICBpZiAodGVybV9jb25zb2xlKQorICAgIHsKKwkvKiBCbG9jayBjdXJzb3IuICovCisJc3dpKE9TX1dyaXRlTiwKKwkJIlwwMjdcMDAwXDAxMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAorCQkxMCk7CisKKwkvKiBEaXNhYmxlIHRoZSBzdGFuZGFyZCBjdXJzb3Iga2V5IGFjdGlvbnMuICovCisJc3dpKE9TX0J5dGUsIDQsIDEpOworCWlmIChvbGRfY3Vyc29yX3N0YXRlID09IC0xKQorCSAgICBvbGRfY3Vyc29yX3N0YXRlID0gcjE7CisgICAgfQorCisgICAgLyogU3RvcCBFc2NhcGUgZnJvbSBxdWl0dGluZyBWaW0hICovCisgICAgc3dpKE9TX0J5dGUsIDIyOSwgMSwgMCk7CisgICAgaWYgKG9sZF9lc2NhcGVfc3RhdGUgPT0gLTEpCisJb2xkX2VzY2FwZV9zdGF0ZSA9IHIxOworfQorCisvKgorICogc2V0IG1vdXNlIGNsaWNrcyBvbiBvciBvZmYgKG9ubHkgd29ya3MgZm9yIHh0ZXJtcykKKyAqLworICAgIHZvaWQKK21jaF9zZXRtb3VzZShvbikKKyAgICBpbnQJICAgIG9uOworeworfQorCisvKgorICogc2V0IHNjcmVlbiBtb2RlLCBhbHdheXMgZmFpbHMuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgaW50CittY2hfc2NyZWVubW9kZShhcmcpCisgICAgY2hhcl91ICAgKmFyZzsKK3sKKyAgICBFTVNHKF8oZV9zY3Jlbm1vZGUpKTsKKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFRyeSB0byBnZXQgdGhlIGN1cnJlbnQgd2luZG93IHNpemUuCisgKiBSZXR1cm4gT0sgd2hlbiBzaXplIGNvdWxkIGJlIGRldGVybWluZWQsIEZBSUwgb3RoZXJ3aXNlLgorICogU2ltcGx5IHJldHVybiByZXN1bHRzIHN0b3JlZCBieSBtY2hfaW5pdCgpIGlmIHdlIGFyZSB0aGUKKyAqIG1hY2hpbmUncyBjb25zb2xlLiBJZiBub3QsIHdlIGRvbid0IGtub3cgaG93IGJpZyB0aGUgc2NyZWVuIGlzLgorICovCisgICAgaW50CittY2hfZ2V0X3NoZWxsc2l6ZSgpCit7CisgICAgLyogaWYgc2l6ZSBjaGFuZ2VkOiBzY3JlZW5hbGxvYyB3aWxsIGFsbG9jYXRlIG5ldyBzY3JlZW4gYnVmZmVycyAqLworICAgIHJldHVybiB0ZXJtX2NvbnNvbGUgPyBPSyA6IEZBSUw7Cit9CisKKy8qCisgKiBDYW4ndCBjaGFuZ2UgdGhlIHNpemUuCisgKiBBc3N1bWUgdGhlIHVzZXIga25vd3Mgd2hhdCBoZSdzIGRvaW5nIGFuZCB1c2UgdGhlIG5ldyB2YWx1ZXMuCisgKi8KKyAgICB2b2lkCittY2hfc2V0X3NoZWxsc2l6ZSgpCit7CisgICAgLyogQXNzdW1lIHRoZSB1c2VyIGtub3dzIHdoYXQgaGUncyBkb2luZyBhbmQgdXNlIHRoZSBuZXcgdmFsdWVzLiAqLworfQorCisvKgorICogUm93cyBhbmQvb3IgQ29sdW1ucyBoYXMgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK21jaF9uZXdfc2hlbGxzaXplKCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvLiAqLworfQorCisgICAgaW50CittY2hfY2FsbF9zaGVsbChjbWQsIG9wdGlvbnMpCisgICAgY2hhcl91CSpjbWQ7CisgICAgaW50CQlvcHRpb25zOwkvKiBTSEVMTF8qLCBzZWUgdmltLmggKi8KK3sKKyAgICBpbnQJCXJldHZhbDsKKyAgICBpbnQJCXRtb2RlID0gY3VyX3Rtb2RlOworCisgICAgaWYgKGNtZCA9PSBOVUxMKQorCWNtZCA9IChjaGFyX3UgKikgIkdPUyI7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCXJldHVybiBndWlfbWNoX2NhbGxfc2hlbGwoY21kLCBvcHRpb25zKTsKKyNlbmRpZgorICAgIGlmIChvcHRpb25zICYgU0hFTExfQ09PS0VEKQorCXNldHRtb2RlKFRNT0RFX0NPT0spOwkJLyogc2V0IHRvIG5vcm1hbCBtb2RlICovCisgICAgTVNHX1BVVFMoIlxuIik7CisKKyAgIC8qIEkgZG9uJ3QgZXZlbiB3YW50IHRvIHRoaW5rIGFib3V0IHdoYXQgVW5peExpYiBtdXN0CisgICAgKiBiZSBkb2luZyB0byBhbGxvdyB0aGlzIHRvIHdvcmsuLi4KKyAgICAqLworICAgIHJldHZhbCA9IHN5c3RlbShjbWQpOworICAgIGlmIChyZXR2YWwgJiYgIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSkKKwlFTVNHKHN0cmVycm9yKEVPUFNZUykpOwkJLyogRG9lc24ndCBzZWVtIHRvIHNldCBlcnJubz8gKi8KKworICAgIHN3aShPU19CeXRlLCAyMjksIDEsIDApOwkJLyogUmUtZGlzYWJsZSBlc2NhcGUgKi8KKyAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorCXNldHRtb2RlKFRNT0RFX1JBVyk7CQkvKiBzZXQgdG8gcmF3IG1vZGUgKi8KKyAgICByZXR1cm4gcmV0dmFsID8gRkFJTCA6IE9LOworfQorCisvKgorICogQ2hlY2sgZm9yIEVzY2FwZSBiZWluZyBwcmVzc2VkIHJpZ2h0IG5vdy4KKyAqIFsgZGlmZmVyZW50IGlmICF0ZXJtX2NvbnNvbGU/IF0KKyAqLworICAgIHZvaWQKK21jaF9icmVha2NoZWNrKCkKK3sKKyAgICBpZiAoeHN3aShPU19CeXRlLCAxMjEsIDB4ZjApICYgdl9mbGFnKQorCXJldHVybjsKKyAgICBpZiAocjEgPT0gMHhmZikKKyAgICB7CisJZ290X2ludCA9IFRSVUU7CisJc3dpKE9TX0J5dGUsIDE1LCAxKTsJLyogRmx1c2ggaW5wdXQgYnVmZmVyICovCisgICAgfQorfQorCisvKgorICogUmVjdXJzaXZlbHkgZXhwYW5kIG9uZSBwYXRoIGNvbXBvbmVudCBpbnRvIGFsbCBtYXRjaGluZyBmaWxlcyBhbmQvb3IKKyAqIGRpcmVjdG9yaWVzLgorICogInBhdGgiIGhhcyBiYWNrc2xhc2hlcyBiZWZvcmUgY2hhcnMgdGhhdCBhcmUgbm90IHRvIGJlIGV4cGFuZGVkLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZC4KKyAqLworICAgIGludAorbWNoX2V4cGFuZHBhdGgoZ2FwLCBwYXRoLCBmbGFncykKKyAgICBnYXJyYXlfVAkqZ2FwOwkvKiBHcm93IGFycmF5IGZvciByZXN1bHRzLiAqLworICAgIGNoYXJfdQkqcGF0aDsKKyAgICBpbnQJCWZsYWdzOwkvKiBFV18qIGZsYWdzICovCit7CisgICAgaW50CQlnb3Q7CS8qIE51bWJlciBvZiBtYXRjaGVzLiAqLworICAgIGNoYXJfdQkqcGF0dGVybjsKKworICAgLyogUGxhbjoKKyAgICAqCisgICAgKiAxKSBHZXQgZmlyc3QgcGFydCBvZiBwYXRoIC0gbm8gd2lsZGNhcmRzCisgICAgKiAyKSBHZXQgbmV4dCBwYXRoIGVsZW1lbnQgKHdpbGRjYXJkZWQpCisgICAgKiAzKSBHZXQgcmVzdCBvZiBwYXRoCisgICAgKgorICAgICogSWYgKDMpIGlzIG5vdGhpbmcgdGhlbiBvbmx5IHRoZSBsZWFmIGlzIHdpbGRjYXJkZWQgLSBhZGQgdG8gZ2FwCisgICAgKiBPdGhlcndpc2UgY2FsbCByZWN1cnNpdmVseSBmb3IgZWFjaCBwYXRoIGluICgyKSwgcGFzc2luZyAoMykKKyAgICAqCisgICAgKiBUaGlzIGlzIGp1c3QgdGhlIGhlYWRlciBmdW5jdGlvbi4KKyAgICAqLworCisgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIG1vZGlmaXkgcGF0aCwgc28gbWFrZSBhIGNvcHkgKi8KKyAgICBwYXR0ZXJuID0gdmltX3N0cnNhdmUocGF0aCk7CisgICAgaWYgKHBhdHRlcm4gPT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICBnb3QgPSBleHBhbmRfc2VjdGlvbihnYXAsIChjaGFyX3UgKikiIiwgcGF0dGVybiwgZmxhZ3MpOworICAgIHZpbV9mcmVlKHBhdHRlcm4pOworICAgIHJldHVybiBnb3Q7Cit9CisKKy8qCisgKiBleHBhbmRfc2VjdGlvbihnYXAsICIkLkRpcjEuRGlyMiIsICJBQkJBKi5teWxlYWYjIyIpCisgKgorICogY2FsbHMgZXhwYW5kX3NlY3Rpb24oZ2FwLCAiJC5EaXIxLkRpcjIuQUJCQV9Hb2xkIiwgIm15bGVhZiMjIikKKyAqICAgYW5kIGV4cGFuZF9zZWN0aW9uKGdhcCwgIiQuRGlyMS5EaXIyLkFCQkFfTGl2ZSIsICJteWxlYWYjIyIpCisgKgorICogSWYgcmVzdCBpcyBqdXN0IGEgbGVhZiB0aGVuIGFsbCBtYXRjaGVzIGFyZSBhZGRlZCB0byBnYXAuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgaXRlbXMgYWRkZWQgdG8gZ2FwLgorICovCisgICAgaW50CitleHBhbmRfc2VjdGlvbihnYXAsIHJvb3QsIHJlc3QsIGZsYWdzKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSpyb290OwkvKiBOb24td2lsZGNhcmRlZCBwYXRoIHRvIHNlYXJjaCAqLworICAgIGNoYXJfdQkqcmVzdDsJLyogV2lsZGNhcmRlZCByZW1haW5kZXIgb2YgcGF0aCAqLworICAgIGludAkJZmxhZ3M7CS8qIEFkZCBkaXJzL2ZpbGVzL21pc3Npbmcgb2JqZWN0cy4gKi8KK3sKKyAgICBzdGF0aWMgY2hhcl91IGJ1ZltNQVhQQVRITF07CS8qIFRlbXBvcmFyeSBidWZmZXIuICovCisgICAgY2hhcl91IGRpcltNQVhQQVRITF07CisgICAgaW50IHN0YXJ0X2VsZW1lbnQgPSAtMTsJCS8qIFN0YXJ0IG9mIHdpbGRjYXJkZWQgZWxlbWVudCAqLworICAgIGNoYXJfdSBjOworICAgIGludCBpOworICAgIGludCBnb3QsIGRpcl9wb3M7CisgICAgaW50IGJ1ZmxlbjsJCQkvKiBDaGFycyB1c2VkIGluIGJ1ZltdICovCisgICAgaW50IGNvbG9uID0gMDsJCS8qIERpciBlbmRzIGluICc6JyAqLworCisgICAgYnVmbGVuID0gc3RybGVuKHJvb3QpOworICAgIFNUUk5DUFkoYnVmLCByb290LCBidWZsZW4pOwkvKiBDb3B5IHJvb3QgaW50byBidWZmZXIuICovCisKKyAgIC8qCisgICAgKiBGaW5kIGVuZCBvZiBub253aWxkY2FyZGVkIHNlY3Rpb24uCisgICAgKiBDb3VudCAnOicgYXMgYSBwYXRoIHNlcCBzaW5jZSBWaW06QnVnKiBpcyBhIHZhbGlkIHBhdGhuYW1lLgorICAgICovCisKKyAgICBmb3IgKGkgPSAwOyBjID0gcmVzdFtpXTsgaSsrKQorICAgIHsKKwlpZiAoYyA9PSBQQVRIU0VQKQorCXsKKwkgICAgc3RhcnRfZWxlbWVudCA9IGk7CisJICAgIGNvbG9uID0gMDsKKwl9CisJaWYgKGMgPT0gJzonKQorCXsKKwkgICAgc3RhcnRfZWxlbWVudCA9IGkgKyAxOworCSAgICBjb2xvbiA9IDE7CisJfQorCWlmIChjID09ICcjJyB8fCBjID09ICcqJykKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjID09IDApCisJc3RhcnRfZWxlbWVudCA9IGk7CisKKyAgIC8qCisgICAgKiBzdGFydF9lbGVtZW50ICs+IHRlcm1pbmF0b3IgZm9yIG5vbi13aWxkY2FyZGVkIHNlY3Rpb24uCisgICAgKiBUcmFuc2ZlciB0aGlzIGJpdCBpbnRvIGJ1Zi4KKyAgICAqLworICAgIGlmIChidWZsZW4gKyBzdGFydF9lbGVtZW50ICsgNCA+PSBNQVhQQVRITCkKKyAgICAgICByZXR1cm4gMDsJCQkvKiBCdWZmZXIgZnVsbCAqLworICAgIGlmIChzdGFydF9lbGVtZW50ID49IDApCisgICAgeworCWlmICgqcm9vdCAmJiAhY29sb24pCisJICAgIGJ1ZltidWZsZW4rK10gPSBQQVRIU0VQOworCXN0cm5jcHkoYnVmICsgYnVmbGVuLCByZXN0LCBzdGFydF9lbGVtZW50KTsKKwlidWZsZW4gKz0gc3RhcnRfZWxlbWVudDsKKyAgICB9CisgICAgYnVmW2J1Zmxlbl0gPSAwOworCisgICAvKgorICAgICogRGlkIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRob3V0IGhpdHRpbmcgYW55IHdpbGRjYXJkcz8KKyAgICAqLworICAgIGlmIChjID09IDApCisgICAgeworCS8qIFllcyAtIGFkZCBjb21iaW5lZCBwYXRoIHRvIGdyb3cgYXJyYXkgYW5kIHJldHVybi4gKi8KKwlhZGRmaWxlKGdhcCwgYnVmLCBmbGFncyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKHN0YXJ0X2VsZW1lbnQgPCAwIHx8ICFjb2xvbikKKwlzdGFydF9lbGVtZW50Kys7CisgICAgcmVzdCArPSBzdGFydF9lbGVtZW50OworCisgICAvKgorICAgICogcmVzdCBkb2VzIGNvbnRhaW4gd2lsZGNhcmRzIGlmIHdlIGdldCBoZXJlLgorICAgICoKKyAgICAqIE5vdyA6IGhhdmUgd2UgcmVhY2hlZCB0aGUgbGVhZiBuYW1lcyBwYXJ0IHlldD8KKyAgICAqIElmIHNvLCBhZGQgYWxsIG1hdGNoZXMgKGZpbGVzIGFuZCBkaXJzKSB0byBnYXAuCisgICAgKiBJZiBub3QsIGdldCBuZXh0IHBhdGggZWxlbWVudCBhbmQgc2NhbiBhbGwgbWF0Y2hpbmcgZGlyZWN0b3JpZXMuCisgICAgKi8KKworICAgIHN0YXJ0X2VsZW1lbnQgPSAtMTsKKyAgICBmb3IgKGkgPSAwOyByZXN0W2ldOyBpKyspCisgICAgeworCWlmIChyZXN0W2ldID09ICcuJykKKwl7CisJICAgIHN0YXJ0X2VsZW1lbnQgPSBpOworCSAgICByZXN0W2ldID0gMDsJCS8qIEJyZWFrIHN0cmluZyBoZXJlLiAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyogSWYgc3RhcnRfZWxlbWVudCBpcyAtMSB0aGVuIHdlIGFyZSBtYXRjaGluZyBsZWFmIG5hbWVzICovCisKKyAgICByMyA9IDA7CQkJLyogTnVtYmVyIG9mIG9ianMgcmVhZC4gKi8KKyAgICBkaXJfcG9zID0gMDsJCS8qIFBvc2l0aW9uIHRocm91Z2ggZGlyZWN0b3J5LiAqLworICAgIGdvdCA9IDA7CQkJLyogRmlsZXMgYWRkZWQgc28gZmFyLiAqLworICAgIHdoaWxlIChkaXJfcG9zICE9IC0xKQorICAgIHsKKwlidWZbYnVmbGVuXSA9IDA7CisJaWYgKHhzd2koT1NfR0JQQiwgOSwKKwkJYnVmLAkJCQkvKiBEaXJlY3RvcnkgdG8gc2Nhbi4gKi8KKwkJYnVmICsgYnVmbGVuICsgKDEgLSBjb2xvbiksCS8qIEJ1ZmZlciBmb3IgcmVzdWx0LiAqLworCQkxLAkJCS8qIE51bWJlciBvZiBvYmplY3RzIHRvIHJlYWQuICovCisJCWRpcl9wb3MsCQkvKiBTZWFyY2ggcG9zaXRpb24uICovCisJCU1BWFBBVEhMIC0gMiAtIGJ1ZmxlbiwJLyogU2l6ZSBvZiByZXN1bHQgYnVmZmVyLiAqLworCQlyZXN0KQkJCS8qIFdpbGRjYXJkZWQgbGVhZm5hbWUuICovCisJCQkmIHZfZmxhZykKKwl7CisJICAgIEVNU0cocjAgKyA0KTsKKwkgICAgcjQgPSAtMTsKKwl9CisJZGlyX3BvcyA9IHI0OwkJLyogcjQgY29ycnVwdGVkIGJ5IGFkZGZpbGUoKSAqLworCWlmIChyMyA+IDApCisJeworCSAgICBjaGFyX3UgKnBhdGggPSBidWY7CisJICAgIGlmIChidWZsZW4gPT0gMCkKKwkJcGF0aCsrOwkJCS8qIERvbid0IGRvICcuRmlsZScgKi8KKwkgICAgZWxzZSBpZiAoIWNvbG9uKQorCQlidWZbYnVmbGVuXSA9ICcuJzsJCS8qIEpvaW4gcGF0aCBhbmQgbGVhZiAqLworCisJICAgLyogUGF0aCAtPiBmdWxsIHBhdGggb2Ygb2JqZWN0IGZvdW5kICovCisJICAgIGlmIChzdGFydF9lbGVtZW50ID09IC0xKQorCSAgICB7CisJCWFkZGZpbGUoZ2FwLCBwYXRoLCBmbGFncyk7CisJCWdvdCsrOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAvKiBTY2FuIGludG8gc3ViZGlyZWN0b3JpZXMgYW5kIGltYWdlczsgaWdub3JlIGZpbGVzICovCisJCXN3aShPU19GaWxlLCAxNywgcGF0aCk7CisJCWlmIChyMCA9PSAyIHx8IHIwID09IDMpCisJCSAgICBnb3QgKz0gZXhwYW5kX3NlY3Rpb24oZ2FwLAorCQkJCQkJcGF0aCwKKwkJCQkJCXJlc3QgKyBzdGFydF9lbGVtZW50ICsgMSwKKwkJCQkJCWZsYWdzKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIHRoZSBkb3QgaWYgd2UgcmVtb3ZlZCBpdC4gKi8KKyAgICBpZiAoc3RhcnRfZWxlbWVudCA+PSAwKQorCXJlc3Rbc3RhcnRfZWxlbWVudF0gPSAnLic7CisgICAgcmV0dXJuIGdvdDsKK30KKworLyoKKyAqIG1jaF9leHBhbmRfd2lsZGNhcmRzKCkgLSB0aGlzIGNvZGUgZG9lcyB3aWxkLWNhcmQgcGF0dGVybiBtYXRjaGluZyB1c2luZworICogdGhlIHNoZWxsLiBJdCBpc24ndCB1c2VkIHVuZGVyIFJJU0MgT1MuCisgKgorICogcmV0dXJuIE9LIGZvciBzdWNjZXNzLCBGQUlMIGZvciBlcnJvciAoeW91IG1heSBsb3NlIHNvbWUgbWVtb3J5KSBhbmQgcHV0CisgKiBhbiBlcnJvciBtZXNzYWdlIGluICpmaWxlLgorICoKKyAqIG51bV9wYXQgaXMgbnVtYmVyIG9mIGlucHV0IHBhdHRlcm5zCisgKiBwYXQgaXMgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaW5wdXQgcGF0dGVybnMKKyAqIG51bV9maWxlIGlzIHBvaW50ZXIgdG8gbnVtYmVyIG9mIG1hdGNoZWQgZmlsZSBuYW1lcworICogZmlsZSBpcyBwb2ludGVyIHRvIGFycmF5IG9mIHBvaW50ZXJzIHRvIG1hdGNoZWQgZmlsZSBuYW1lcworICovCisgICAgaW50CittY2hfZXhwYW5kX3dpbGRjYXJkcyhudW1fcGF0LCBwYXQsIG51bV9maWxlLCBmaWxlLCBmbGFncykKKyAgICBpbnQJCSAgICBudW1fcGF0OworICAgIGNoYXJfdQkgICoqcGF0OworICAgIGludAkJICAgKm51bV9maWxlOworICAgIGNoYXJfdQkgKioqZmlsZTsKKyAgICBpbnQJCSAgICBmbGFnczsJCS8qIEVXXyogZmxhZ3MgKi8KK3sKKyAgICAvKiBUaGlzIGRvZXNuJ3QgZ2V0IGNhbGxlZCB1bmxlc3MgU1BFQ0lBTF9XSUxEQ0hBUiBpcyBkZWZpbmVkLiAqLworICAgIHJldHVybiBGQUlMOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW5zIHdpbGRjYXJkcyB3aGljaCBjYW4gYmUgZXhwYW5kZWQgYnkKKyAqIG1jaF9leHBhbmRwYXRoKCkuCisgKi8KKyAgICBpbnQKK21jaF9oYXNfZXhwX3dpbGRjYXJkKHApCisgICAgY2hhcl91CSpwOworeworICAgIGlmICh2aW1fc3RycGJyaygoY2hhcl91ICopIiojIiwgcCkpCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKiBSZXR1cm4gVFJVRSBpZiAicCIgY29udGFpbnMgd2lsZGNhcmRzLiAqLworICAgIGludAorbWNoX2hhc193aWxkY2FyZChwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpZiAodmltX3N0cnBicmsoKGNoYXJfdSAqKSIqI2AiLCBwKSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyAgICBpbnQJCQkvKiBzZWUgVW5peCB1bmxpbmsoMikgKi8KK21jaF9yZW1vdmUoZmlsZSkKKyAgICBjaGFyX3UgKmZpbGU7CS8qIE5hbWUgb2YgZmlsZSB0byBkZWxldGUuICovCit7CisgICAgaWYgKHhzd2koT1NfRlNDb250cm9sLCAyNywgZmlsZSwgMCwgMCkgJiB2X2ZsYWcpCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisvKiBUcnkgdG8gbWFrZSBleGlzdGluZyBzY3JpcHRzIHdvcmsgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcgc3RyaW5nIChmcmVlZCBieSBjYWxsZXIpLCBvciBOVUxMCisgKgorICogVHdvIG1haW4gY2FzZXM6CisgKiAtIEFic29sdXRlIDogJFZJTS9zeW50YXgvaGVscC52aW0KKyAqIC0gUmVsYXRpdmUgOiBBZGZzOjo0LiQuIVZpbS5SZXNvdXJjZXMuU3ludGF4L2hlbHAudmltCisgKi8KKyAgICBjaGFyX3UgKgorbWNoX211bmdlX2ZuYW1lKGZuYW1lKQorICAgIGNoYXJfdSAqZm5hbWU7Cit7CisgICAgY2hhcl91IGM7CisgICAgaW50IGxlbjsKKyAgICBjaGFyX3UgKnJldHZhbDsKKworICAgIHJldHZhbCA9IGZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpOworICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKHN0cm5jbXAoZm5hbWUsICIkVklNLyIsIDUpID09IDApCisgICAgeworCXN0cm5jcHkoZm5hbWUsICJWaW06IiwgNCk7CisJZm9yIChmbmFtZSArPSA1OyBjID0gKmZuYW1lOyBmbmFtZSsrKQorCXsKKwkgICAgaWYgKGMgPT0gJy4nKQorCQlicmVhazsKKwkgICAgaWYgKGMgPT0gJy8nKQorCQlmbmFtZVstMV0gPSAnLic7CisJICAgIGVsc2UKKwkJZm5hbWVbLTFdID0gYzsKKwl9CisJZm5hbWVbLTFdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgZXhpc3RzIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAqLworCWlmICh4c3dpKE9TX0ZpbGUsIDE3LCBmbmFtZSkgJiB2X2ZsYWcpCisJICAgIHIwID09IDA7CQkvKiBJbnZhbGlkIGZpbGVuYW1lPyAqLworCWlmIChyMCkKKwkgICAgcmV0dXJuIHJldHZhbDsKKworCWxlbiA9IHN0cmxlbihmbmFtZSk7CisJaWYgKHN0cmNtcChmbmFtZSArIGxlbiAtIDQsICIudmltIikgPT0gMCkKKwl7CisJICAgIGZuYW1lW2xlbiAtIDRdID0gJ1wwJzsKKwkgICAgZm9yICg7IGMgPSAqZm5hbWU7IGZuYW1lKyspCisJICAgIHsKKwkJaWYgKGMgPT0gJy8nKQorCQkgICAgKmZuYW1lID0gJy4nOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiBRdWlja0ZpeCByZWFkcyBtdW5nZWQgbmFtZXMgZnJvbSB0aGUgZXJyb3IgZmlsZS4KKyAqIENvcnJlY3QgdGhlbS4KKyAqLworICAgIGludAorcm9fYnVmbGlzdF9hZGQob2xkX25hbWUpCisgICAgY2hhcl91ICAqb2xkX25hbWU7CS8qIE5hbWUgb2YgZmlsZSBmb3VuZCBieSBxdWlja2ZpeCAqLworeworICAgIGNoYXJfdSAgKmZuYW1lOworICAgIGNoYXJfdSAgKmxlYWY7CS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgbGVhZiBpbiBvbGRfbmFtZSAqLworICAgIGNoYXJfdSAgKnB0cjsKKyAgICBjaGFyX3UgIGM7CisgICAgaW50CSAgICByZXR2YWw7CisKKyAgICBpZiAob2xkX25hbWUgPT0gTlVMTCkKKwlyZXR1cm4gYnVmbGlzdF9hZGQoTlVMTCwgMCk7CisKKyAgICAvKiBDb3B5IHRoZSBuYW1lIHNvIHdlIGNhbiBtZXNzIGFyb3VuZCB3aXRoIGl0LiAqLworICAgIGZuYW1lID0gdmltX3N0cnNhdmUob2xkX25hbWUpOworICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCS8qIE91dCBvZiBtZW1vcnkgLSBjYW4ndCBtb2RpZnkgbmFtZSAqLworCXJldHVybiBidWZsaXN0X2FkZChvbGRfbmFtZSwgMCk7CisKKyAgICAvKiBDaGFuZ2UgYGRpci9tYWluLmMnIGludG8gYGRpci5jLm1haW4nICovCisgICAgbGVhZiA9IGZuYW1lOworICAgIGZvciAocHRyID0gZm5hbWU7IGMgPSAqcHRyOyBwdHIrKykKKyAgICB7CisJaWYgKGMgPT0gJy8nKQorCXsKKwkgICAgbGVhZiA9IHB0ciArIDE7CisJICAgICpwdHIgPSAnLic7CisJfQorCWVsc2UgaWYgKGMgPT0gJy4nKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGMgPT0gJy4nKQorICAgIHsKKwkvKiBDaGFuZ2UgYG1haW4uYycgaW50byBgYy5tYWluJworCSAqCSAgfCAgICB8CisJICogICAgICBsZWFmICBwdHIKKwkgKi8KKwlwdHIgKz0gb2xkX25hbWUgLSBmbmFtZTsKKwkqcHRyID0gJ1wwJzsKKwlzcHJpbnRmKGxlYWYsCisJCSIlcy4lcyIsCisJCXB0ciArIDEsCisJCWxlYWYgLSBmbmFtZSArIG9sZF9uYW1lKTsKKyAgICB9CisKKyAgICByZXR2YWwgPSBidWZsaXN0X2FkZChmbmFtZSwgMCk7CisgICAgZnJlZShmbmFtZSk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogQ2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqIFN0cmlwIHRyYWlsaW5nIGRvdHMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlIHdpdGggZmlsZW5hbWUgY29tcGxldGlvbi4KKyAqIFJldHVybiAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4KKyAqLworICAgIGludAorbWNoX2NoZGlyKGRpcikKKyAgICBjaGFyX3UgICpkaXI7Cit7CisgICAgaW50CSAgICBsZW5ndGg7CisgICAgaW50CSAgICByZXR2YWw7CisgICAgY2hhcl91ICAqbmV3X2RpcjsKKworICAgIGxlbmd0aCA9IHN0cmxlbihkaXIpOworICAgIGlmIChkaXJbbGVuZ3RoIC0gMV0gIT0gJy4nKQorCXJldHVybiBjaGRpcihkaXIpOwkgICAgLyogTm8gdHJhaWxpbmcgZG90cyAtIG5vdGhpbmcgdG8gZG8uICovCisgICAgbmV3X2RpciA9IHZpbV9zdHJzYXZlKGRpcik7CisgICAgaWYgKG5ld19kaXIgPT0gTlVMTCkKKwlyZXR1cm4gY2hkaXIoZGlyKTsJICAgIC8qIENhbid0IGFsbG9jYXRlIG1lbW9yeS4gKi8KKworICAgIHdoaWxlIChuZXdfZGlyWy0tbGVuZ3RoXSA9PSAnLicpCisJbmV3X2RpcltsZW5ndGhdID0gJ1wwJzsKKworICAgIHJldHZhbCA9IGNoZGlyKG5ld19kaXIpOworICAgIHZpbV9mcmVlKG5ld19kaXIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIEV4YW1pbmUgdGhlIG5hbWVkIGZpbGUsIGFuZCBzZXQgdGhlICdvc2ZpbGV0eXBlJyBvcHRpb24KKyAqIChpbiBjdXJidWYpIHRvIHRoZSBmaWxlJ3MgdHlwZS4KKyAqLworICAgIHZvaWQKK21jaF9yZWFkX2ZpbGV0eXBlKGZpbGUpCisgICAgY2hhcl91ICAqZmlsZTsKK3sKKyAgICBpbnQJICAgIHR5cGU7CisgICAgY2hhcl91ICB0eXBlX3N0cmluZ1s5XTsKKyAgICBpbnQJICAgIGk7CisKKyAgICBpZiAoeHN3aShPU19GaWxlLCAyMywgZmlsZSkgJiB2X2ZsYWcpCisJdHlwZSA9IDB4ZmZmOwkJLyogRGVmYXVsdCB0byBUZXh0ICovCisgICAgZWxzZQorCXR5cGUgPSByNjsKKworICAgIC8qIFR5cGUgaXMgdGhlIG51bWVyaWNhbCB2YWx1ZSAtIHNlZSBpZiB3ZSBoYXZlIGEgdGV4dHVhbCBlcXVpdmFsZW50ICovCisgICAgc3dpKE9TX0ZTQ29udHJvbCwgMTgsIDAsIHR5cGUpOworICAgICgoaW50ICopIHR5cGVfc3RyaW5nKVswXSA9IHIyOworICAgICgoaW50ICopIHR5cGVfc3RyaW5nKVsxXSA9IHIzOworICAgIHR5cGVfc3RyaW5nWzhdID0gMDsKKyAgICBmb3IgKGkgPSAwOyB0eXBlX3N0cmluZ1tpXSA+ICcgJzsgaSsrKQorCTsKKyAgICB0eXBlX3N0cmluZ1tpXSA9IDA7CisKKyAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoIm9zZmlsZXR5cGUiLCAtMSwgdHlwZV9zdHJpbmcsIE9QVF9GUkVFKTsKKyAgICByZXR1cm47Cit9CisKKyAgICB2b2lkCittY2hfc2V0X2ZpbGV0eXBlKGZpbGUsIHR5cGUpCisgICAgY2hhcl91ICAqZmlsZTsKKyAgICBjaGFyX3UgICp0eXBlOworeworICAgIGlmICh4c3dpKE9TX0ZTQ29udHJvbCwgMzEsIHR5cGUpICYgdl9mbGFnKQorICAgIHsKKwlFTVNHKF8oIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiKSk7CisJcjIgPSAweGZmZjsKKyAgICB9CisKKyAgICBzd2koT1NfRmlsZSwgMTgsIGZpbGUsIHIyKTsKK30KKworLyogUmV0dXJuIFRSVUUgaWYgdGhlIGZpbGUncyB0eXBlIG1hdGNoZXMgJ3R5cGUnCisgKiBSSVNDIE9TIHR5cGVzIGFsd2F5cyBzdGFydCB3aXRoICcmJworICovCisgICAgaW50CittY2hfY2hlY2tfZmlsZXR5cGUoZm5hbWUsIHR5cGUpCisgICAgY2hhcl91ICAqZm5hbWU7CisgICAgY2hhcl91ICAqdHlwZTsKK3sKKyAgICBpbnQJICAgIHZhbHVlOworICAgIGNoYXIgICAgKmVuZDsKKworICAgIGlmICgqdHlwZSAhPSAnJicpCisJcmV0dXJuIEZBTFNFOworCisgICAgdmFsdWUgPSBzdHJ0b2wodHlwZSArIDEsICZlbmQsIDE2KTsKKyAgICBpZiAoKmVuZCkKKwlyZXR1cm4gRkFMU0U7CQkvKiBJbnZhbGlkIHR5cGUgKHJlcG9ydCBlcnJvcj8pICovCisKKyAgICBpZiAoeHN3aShPU19GaWxlLCAyMywgZm5hbWUpICYgdl9mbGFnKQorCXJldHVybiBGQUxTRTsJCS8qIEludmFsaWQgZmlsZW5hbWU/ICovCisKKyAgICByZXR1cm4gKHIwICYmIHI2ID09IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9vc19yaXNjb3MuaCBiL3NyYy9vc19yaXNjb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzUwMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX3Jpc2Nvcy5oCkBAIC0wLDAgKzEsMTY5IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5peGxpYi9sb2NhbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2RlZmluZSBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FCisjZGVmaW5lIEZFQVRfTU9ESUZZX0ZOQU1FCisjZGVmaW5lIEZFQVRfT1NGSUxFVFlQRQorI2RlZmluZSBERkxUX09GVAkiVGV4dCIKKyNkZWZpbmUgVVNFX1RFUk1fQ09OU09MRQorI2RlZmluZSBIQVZFX0FWQUlMX01FTQorCisvKiBMb25nZXIgZmlsZW5hbWVzIG5vdyBhY2Nlc3NpYmxlIHRvIGFsbCAqLworI2lmbmRlZiBCQVNFTkFNRUxFTgorIyBkZWZpbmUgQkFTRU5BTUVMRU4gNjQgLyogU2FtZSBsZW5ndGggYXMgdW56aXAgKi8KKyNlbmRpZgorCisjaWZuZGVmIFRFTU5BTUUKKyMgZGVmaW5lIFRFTVBOQU1FCSI8V2ltcCRTY3JhcERpcj4udj9YWFhYWFgiCisjIGRlZmluZSBURU1QTkFNRUxFTgkyNQorI2VuZGlmCisKKyNpZm5kZWYgREZMVF9IRUxQRklMRQorIyBkZWZpbmUgREZMVF9IRUxQRklMRSAiVmltOmRvYy5oZWxwIgorI2VuZGlmCisKKyNpZm5kZWYgREZMVF9CRElSCisjIGRlZmluZSBERkxUX0JESVIJIi4sPFdpbXAkU2NyYXBEaXI+LiIJLyogZGVmYXVsdCBmb3IgJ2JhY2t1cGRpcicgKi8KKyNlbmRpZgorCisvKiBQYXRocyB0byB0cnkgcHV0dGluZyBzd2FwIGZpbGUgaW4uICovCisjaWZuZGVmIERGTFRfRElSCisjIGRlZmluZSBERkxUX0RJUgkiPFdpbXAkU2NyYXBEaXI+LiwuIgkvKiBkZWZhdWx0IGZvciAnZGlyZWN0b3J5JyAqLworI2VuZGlmCisKKyNpZm5kZWYgREZMVF9WRElSCisjIGRlZmluZSBERkxUX1ZESVIJIkNob2ljZXM6VmltLnZpZXciCS8qIGRlZmF1bHQgZm9yICd2aWV3ZGlyJyAqLworI2VuZGlmCisKKyNpZm5kZWYgVEVSTUNBUEZJTEUKKyMgZGVmaW5lIFRFUk1DQVBGSUxFCSJWaW06VGVybUNhcCIKKyNlbmRpZgorI2RlZmluZSBIQVZFX1RHRVRFTlQKKworI2lmbmRlZiBTWU5UQVhfRk5BTUUKKyMgZGVmaW5lIFNZTlRBWF9GTkFNRQkiVmltOlN5bnRheC4lcyIKKyNlbmRpZgorCisjaWZuZGVmIEVWSU1fRklMRQorIyBkZWZpbmUgRVZJTV9GSUxFCSJWaW06RXZpbSIKKyNlbmRpZgorCisjZGVmaW5lIEZFQVRfVklNSU5GTworCisjaWZuZGVmIFZJTUlORk9fRklMRQorIyBkZWZpbmUgVklNSU5GT19GSUxFCSI8Q2hvaWNlcyRXcml0ZT4uVmltLlZpbUluZm8iCisjZW5kaWYKKyNpZm5kZWYgVklNSU5GT19GSUxFMgorIyBkZWZpbmUgVklNSU5GT19GSUxFMgkiQ2hvaWNlczpWaW0uVmltSW5mbyIKKyNlbmRpZgorCisjaWZuZGVmIFZJTVJDX0ZJTEUKKyMgZGVmaW5lIFZJTVJDX0ZJTEUJIi92aW1yYyIKKyNlbmRpZgorI2lmbmRlZiBFWFJDX0ZJTEUKKyMgZGVmaW5lIEVYUkNfRklMRQkiL2V4cmMiCisjZW5kaWYKKyNpZm5kZWYgR1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIEdWSU1SQ19GSUxFCSIvZ3ZpbXJjIgorI2VuZGlmCisjaWZuZGVmIFZJRVdfRklMRQorIyBkZWZpbmUgVklFV19GSUxFCSIvVmlldyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfVklNUkNfRklMRQorIyBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUJIlZpbTpFdmltIgorI2VuZGlmCisjaWZuZGVmIFNFU1NJT05fRklMRQorIyBkZWZpbmUgU0VTU0lPTl9GSUxFCSIvU2Vzc2lvbi52aW0iCisjZW5kaWYKKyNpZm5kZWYgVVNSX1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFVTUl9WSU1SQ19GSUxFCSJDaG9pY2VzOlZpbS5WaW1SQyIKKyNlbmRpZgorI2lmbmRlZiBVU1JfR1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFVTUl9HVklNUkNfRklMRSAgICAiQ2hvaWNlczpWaW0uR1ZpbVJDIgorI2VuZGlmCisjaWZuZGVmIFVTUl9FWFJDX0ZJTEUKKyMgZGVmaW5lIFVTUl9FWFJDX0ZJTEUgICAgIkNob2ljZXM6VmltLkV4UkMiCisjZW5kaWYKKyNpZm5kZWYgU1lTX1ZJTVJDX0ZJTEUKKyMgZGVmaW5lIFNZU19WSU1SQ19GSUxFCSAgICAiVmltOlZpbVJDIgorI2VuZGlmCisjaWZuZGVmIFNZU19HVklNUkNfRklMRQorIyBkZWZpbmUgU1lTX0dWSU1SQ19GSUxFICAgICJWaW06R1ZpbVJDIgorI2VuZGlmCisjaWZuZGVmIFNZU19NRU5VX0ZJTEUKKyMgZGVmaW5lIFNZU19NRU5VX0ZJTEUJICAgICJWaW06TWVudSIKKyNlbmRpZgorI2lmbmRlZiBTWVNfT1BUV0lOX0ZJTEUKKyMgZGVmaW5lIFNZU19PUFRXSU5fRklMRSAgICAiVmltOk9wdHdpbiIKKyNlbmRpZgorI2lmbmRlZiBGSUxFVFlQRV9GSUxFCisjIGRlZmluZSBGSUxFVFlQRV9GSUxFCSAgICAiVmltOkZpbGV0eXBlIgorI2VuZGlmCisjaWZuZGVmIEZUUExVR0lOX0ZJTEUKKyMgZGVmaW5lIEZUUExVR0lOX0ZJTEUJICAgICJWaW06RnRwbHVnaW4vdmltIgorI2VuZGlmCisjaWZuZGVmIElOREVOVF9GSUxFCisjIGRlZmluZSBJTkRFTlRfRklMRQkgICAgIlZpbTpJbmRlbnQvdmltIgorI2VuZGlmCisjaWZuZGVmIEZUT0ZGX0ZJTEUKKyMgZGVmaW5lIEZUT0ZGX0ZJTEUJICAgICJWaW06RnRvZmYiCisjZW5kaWYKKyNpZm5kZWYgRlRQTFVHT0ZfRklMRQorIyBkZWZpbmUgRlRQTFVHT0ZfRklMRQkgICAgIlZpbTpGdHBsdWdvZiIKKyNlbmRpZgorI2lmbmRlZiBJTkRPRkZfRklMRQorIyBkZWZpbmUgSU5ET0ZGX0ZJTEUJICAgICJWaW06SW5kb2ZmIgorI2VuZGlmCisKKyNkZWZpbmUgREZMVF9FUlJPUkZJTEUJCSJlcnJvcnMvdmltIgorI2RlZmluZSBERkxUX1JVTlRJTUVQQVRICSJDaG9pY2VzOlZpbSxWaW06LENob2ljZXM6VmltLmFmdGVyIgorCisvKgorICogUklTQyBQQ3MgaGF2ZSBwbGVudHkgb2YgbWVtb3J5LCB1c2UgbGFyZ2UgYnVmZmVycworICovCisjZGVmaW5lIENNREJVRkZTSVpFIDEwMjQJLyogc2l6ZSBvZiB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIGJ1ZmZlciAqLworI2RlZmluZSBNQVhQQVRITCAgICAyNTYJCS8qIHBhdGhzIGFyZSBhbHdheXMgcXVpdGUgc2hvcnQgdGhvdWdoICovCisKKyNpZm5kZWYgREZMVF9NQVhNRU0KKyMgZGVmaW5lIERGTFRfTUFYTUVNCSg1KjEwMjQpICAgIC8qIHVzZSB1cCB0byA1IE1ieXRlIGZvciBhIGJ1ZmZlciAqLworI2VuZGlmCisKKyNpZm5kZWYgREZMVF9NQVhNRU1UT1QKKyMgZGVmaW5lIERGTFRfTUFYTUVNVE9UCSgxMCoxMDI0KSAgICAvKiB1c2UgdXAgdG8gMTAgTWJ5dGUgZm9yIFZpbSAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NJR1NFVAorIyBkZWZpbmUgc2lnbmFsIHNpZ3NldAorI2VuZGlmCisKKyNkZWZpbmUgbl9mbGFnICgxPDwzMSkKKyNkZWZpbmUgel9mbGFnICgxPDwzMCkKKyNkZWZpbmUgY19mbGFnICgxPDwyOSkKKyNkZWZpbmUgdl9mbGFnICgxPDwyOCkKKworLyogVGhlc2UgdGFrZSByMC1yNyBhcyBpbnB1dHMsIHJldHVybnMgcjAtcjcgaW4gZ2xvYmFsIHZhcmlhYmxlcy4gKi8KK3ZvaWQgc3dpKGludCBzd2ludW0sIC4uLik7ICAgICAgLyogSGFuZGxlcyBlcnJvcnMgaXRzZWxmICovCitpbnQgeHN3aShpbnQgc3dpbnVtLCAuLi4pOyAgICAgIC8qIFJldHVybnMgZXJyb3JzIHVzaW5nIHYgZmxhZyAqLworZXh0ZXJuIGludCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjc7ICAvKiBGb3IgcmV0dXJuIHZhbHVlcyAqLworCisjaW5jbHVkZSA8a2VybmVsLmg+CisjaW5jbHVkZSA8c3dpcy5oPgorCisjZGVmaW5lIG1jaF9tZW1tb3ZlKHRvLCBmcm9tLCBsZW4pIG1lbW1vdmUoKGNoYXIgKikodG8pLCAoY2hhciAqKShmcm9tKSwgbGVuKQorI2RlZmluZSBtY2hfcmVuYW1lKHNyYywgZHN0KSByZW5hbWUoc3JjLCBkc3QpCisjZGVmaW5lIG1jaF9nZXRlbnYoeCkgKGNoYXJfdSAqKWdldGVudigoY2hhciAqKXgpCisjZGVmaW5lIG1jaF9zZXRlbnYobmFtZSwgdmFsLCB4KSBzZXRlbnYobmFtZSwgdmFsLCB4KQpkaWZmIC0tZ2l0IGEvc3JjL29zX3VuaXguYyBiL3NyYy9vc191bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5ZDhmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc191bml4LmMKQEAgLTAsMCArMSw2MTg5IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkgICAgICBPUy8yIHBvcnQgYnkgUGF1bCBTbG9vdG1hbgorICoJICAgICAgVk1TIG1lcmdlIGJ5IFpvbHRhbiBBcnBhZGZmeQorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogb3NfdW5peC5jIC0tIGNvZGUgZm9yIGFsbCBmbGF2b3JzIG9mIFVuaXggKEJTRCwgU1lTViwgU1ZSNCwgUE9TSVgsIC4uLikKKyAqCSAgICAgQWxzbyBmb3IgT1MvMiwgdXNpbmcgdGhlIGV4Y2VsbGVudCBFTVggcGFja2FnZSEhIQorICoJICAgICBBbHNvIGZvciBCZU9TIGFuZCBBdGFyaSBNaU5ULgorICoKKyAqIEEgbG90IG9mIHRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEp1ZXJnZW4gV2VpZ2VydCBhbmQgbGF0ZXIKKyAqIGNoYW5nZWQgYmV5b25kIHJlY29nbml0aW9uLgorICovCisKKy8qCisgKiBTb21lIHN5c3RlbXMgaGF2ZSBhIHByb3RvdHlwZSBmb3Igc2VsZWN0KCkgdGhhdCBoYXMgKGludCAqKSBpbnN0ZWFkIG9mCisgKiAoZmRfc2V0ICopLCB3aGljaCBpcyB3cm9uZy4gVGhpcyBkZWZpbmUgcmVtb3ZlcyB0aGF0IHByb3RvdHlwZS4gV2UgZGVmaW5lCisgKiBvdXIgb3duIHByb3RvdHlwZSBiZWxvdy4KKyAqIERvbid0IHVzZSBpdCBmb3IgdGhlIE1hYywgaXQgY2F1c2VzIGEgd2FybmluZyBmb3IgcHJlY29tcGlsZWQgaGVhZGVycy4KKyAqIFRPRE86IHVzZSBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgcHJlY29tcGlsZWQgaGVhZGVycz8KKyAqLworI2lmbmRlZiBfX0FQUExFX18KKyMgZGVmaW5lIHNlbGVjdCBzZWxlY3RfZGVjbGFyZWRfd3JvbmcKKyNlbmRpZgorCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib3NfdW5peHguaCIJICAgIC8qIHVuaXggaW5jbHVkZXMgZm9yIG9zX3VuaXguYyBvbmx5ICovCisKKyNpZmRlZiBVU0VfWFNNUAorIyBpbmNsdWRlIDxYMTEvU00vU01saWIuaD4KKyNlbmRpZgorCisvKgorICogVXNlIHRoaXMgcHJvdG90eXBlIGZvciBzZWxlY3QsIHNvbWUgaW5jbHVkZSBmaWxlcyBoYXZlIGEgd3JvbmcgcHJvdG90eXBlCisgKi8KKyN1bmRlZiBzZWxlY3QKKyNpZmRlZiBfX0JFT1NfXworIyBkZWZpbmUgc2VsZWN0CWJlb3Nfc2VsZWN0CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TRUxFQ1QpCitleHRlcm4gaW50ICAgc2VsZWN0IF9fQVJHUygoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBzdHJ1Y3QgdGltZXZhbCAqKSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTU9VU0VfR1BNCisjIGluY2x1ZGUgPGdwbS5oPgorLyogPGxpbnV4L2tleWJvYXJkLmg+IGNvbnRhaW5zIGRlZmluZXMgY29uZmxpY3Rpbmcgd2l0aCAia2V5bWFwLmgiLAorICogSSBqdXN0IGNvcGllZCByZWxldmFudCBkZWZpbmVzIGhlcmUuIEEgY2xlYW5lciBzb2x1dGlvbiB3b3VsZCBiZSB0byBwdXQgZ3BtCisgKiBjb2RlIGludG8gc2VwYXJhdGUgZmlsZSBhbmQgaW5jbHVkZSB0aGVyZSBsaW51eC9rZXlib2FyZC5oCisgKi8KKy8qICNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPiAqLworIyBkZWZpbmUgS0dfU0hJRlQJMAorIyBkZWZpbmUgS0dfQ1RSTAkyCisjIGRlZmluZSBLR19BTFQJCTMKKyMgZGVmaW5lIEtHX0FMVEdSCTEKKyMgZGVmaW5lIEtHX1NISUZUTAk0CisjIGRlZmluZSBLR19TSElGVFIJNQorIyBkZWZpbmUgS0dfQ1RSTEwJNgorIyBkZWZpbmUgS0dfQ1RSTFIJNworIyBkZWZpbmUgS0dfQ0FQU1NISUZUCTgKKworc3RhdGljIHZvaWQgZ3BtX2Nsb3NlIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBncG1fb3BlbiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgbWNoX2dwbV9wcm9jZXNzIF9fQVJHUygodm9pZCkpOworI2VuZGlmCisKKy8qCisgKiBlbmQgb2YgYXV0b2NvbmYgc2VjdGlvbi4gVG8gYmUgZXh0ZW5kZWQuLi4KKyAqLworCisvKiBBcmUgdGhlIGZvbGxvd2luZyAjaWZkZWZzIHN0aWxsIHJlcXVpcmVkPyBBbmQgd2h5PyBJcyB0aGF0IGZvciBYMTE/ICovCisKKyNpZiBkZWZpbmVkKEVTSVgpIHx8IGRlZmluZWQoTV9VTklYKSAmJiAhZGVmaW5lZChTQ08pCisjIGlmZGVmIFNJR1dJTkNICisjICB1bmRlZiBTSUdXSU5DSAorIyBlbmRpZgorIyBpZmRlZiBUSU9DR1dJTlNaCisjICB1bmRlZiBUSU9DR1dJTlNaCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU0lHV0lORE9XKSAmJiAhZGVmaW5lZChTSUdXSU5DSCkJLyogaHB1eCA5LjAxIGhhcyBpdCAqLworIyBkZWZpbmUgU0lHV0lOQ0ggU0lHV0lORE9XCisjZW5kaWYKKworI2lmZGVmIEZFQVRfWDExCisjIGluY2x1ZGUgPFgxMS9YbGliLmg+CisjIGluY2x1ZGUgPFgxMS9YdXRpbC5oPgorIyBpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyMgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisjICBpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjICBpbmNsdWRlIDxYMTEvU2hlbGwuaD4KKyMgIGluY2x1ZGUgPFgxMS9TdHJpbmdEZWZzLmg+CitzdGF0aWMgV2lkZ2V0CXh0ZXJtX1NoZWxsID0gKFdpZGdldCkwOworc3RhdGljIHZvaWQgeHRlcm1fdXBkYXRlIF9fQVJHUygodm9pZCkpOworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoRkVBVF9YQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKEZFQVRfVElUTEUpCitXaW5kb3cJICAgIHgxMV93aW5kb3cgPSAwOworIyBlbmRpZgorRGlzcGxheQkgICAgKngxMV9kaXNwbGF5ID0gTlVMTDsKKworIyBpZmRlZiBGRUFUX1RJVExFCitzdGF0aWMgaW50ICBnZXRfeDExX3dpbmRpcyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNldF94MTFfdGl0bGUgX19BUkdTKChjaGFyX3UgKikpOworc3RhdGljIHZvaWQgc2V0X3gxMV9pY29uIF9fQVJHUygoY2hhcl91ICopKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9USVRMRQorc3RhdGljIGludCBnZXRfeDExX3RpdGxlIF9fQVJHUygoaW50KSk7CitzdGF0aWMgaW50IGdldF94MTFfaWNvbiBfX0FSR1MoKGludCkpOworCitzdGF0aWMgY2hhcl91CSpvbGR0aXRsZSA9IE5VTEw7CitzdGF0aWMgaW50CWRpZF9zZXRfdGl0bGUgPSBGQUxTRTsKK3N0YXRpYyBjaGFyX3UJKm9sZGljb24gPSBOVUxMOworc3RhdGljIGludAlkaWRfc2V0X2ljb24gPSBGQUxTRTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtYXlfY29yZV9kdW1wIF9fQVJHUygodm9pZCkpOworCitzdGF0aWMgaW50ICBXYWl0Rm9yQ2hhciBfX0FSR1MoKGxvbmcpKTsKKyNpZiBkZWZpbmVkKF9fQkVPU19fKQoraW50ICBSZWFsV2FpdEZvckNoYXIgX19BUkdTKChpbnQsIGxvbmcsIGludCAqKSk7CisjZWxzZQorc3RhdGljIGludCAgUmVhbFdhaXRGb3JDaGFyIF9fQVJHUygoaW50LCBsb25nLCBpbnQgKikpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1hDTElQQk9BUkQKK3N0YXRpYyBpbnQgZG9feHRlcm1fdHJhY2UgX19BUkdTKCh2b2lkKSk7CisjZGVmaW5lIFhUX1RSQUNFX0RFTEFZCTUwCS8qIGRlbGF5IGZvciB4dGVybSB0cmFjaW5nICovCisjZW5kaWYKKworc3RhdGljIHZvaWQgaGFuZGxlX3Jlc2l6ZSBfX0FSR1MoKHZvaWQpKTsKKworI2lmIGRlZmluZWQoU0lHV0lOQ0gpCitzdGF0aWMgUkVUU0lHVFlQRSBzaWdfd2luY2ggX19BUkdTKFNJR1BST1RPQVJHKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHSU5UKQorc3RhdGljIFJFVFNJR1RZUEUgY2F0Y2hfc2lnaW50IF9fQVJHUyhTSUdQUk9UT0FSRyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR1BXUikKK3N0YXRpYyBSRVRTSUdUWVBFIGNhdGNoX3NpZ3B3ciBfX0FSR1MoU0lHUFJPVE9BUkcpOworI2VuZGlmCisjaWYgZGVmaW5lZChTSUdBTFJNKSAmJiBkZWZpbmVkKEZFQVRfWDExKSBcCisJJiYgZGVmaW5lZChGRUFUX1RJVExFKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9HVEspCisjIGRlZmluZSBTRVRfU0lHX0FMQVJNCitzdGF0aWMgUkVUU0lHVFlQRSBzaWdfYWxhcm0gX19BUkdTKFNJR1BST1RPQVJHKTsKK3N0YXRpYyBpbnQgc2lnX2FsYXJtX2NhbGxlZDsKKyNlbmRpZgorc3RhdGljIFJFVFNJR1RZUEUgZGVhdGh0cmFwIF9fQVJHUyhTSUdQUk9UT0FSRyk7CisKK3N0YXRpYyB2b2lkIHNldF9zaWduYWxzIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgY2F0Y2hfc2lnbmFscyBfX0FSR1MoKFJFVFNJR1RZUEUgKCpmdW5jX2RlYWRseSkoKSwgUkVUU0lHVFlQRSAoKmZ1bmNfb3RoZXIpKCkpKTsKKyNpZm5kZWYgX19FTVhfXworc3RhdGljIGludCAgaGF2ZV93aWxkY2FyZCBfX0FSR1MoKGludCwgY2hhcl91ICoqKSk7CitzdGF0aWMgaW50ICBoYXZlX2RvbGxhcnMgX19BUkdTKChpbnQsIGNoYXJfdSAqKikpOworI2VuZGlmCisKKyNpZm5kZWYgTk9fRVhQQU5EUEFUSAorc3RhdGljIGludAlwc3RyY21wIF9fQVJHUygoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3N0YXRpYyBpbnQJdW5peF9leHBhbmRwYXRoIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpwYXRoLCBpbnQgd2lsZG9mZiwgaW50IGZsYWdzKSk7CisjZW5kaWYKKworI2lmbmRlZiBfX0VNWF9fCitzdGF0aWMgaW50IHNhdmVfcGF0dGVybnMgX19BUkdTKChpbnQgbnVtX3BhdCwgY2hhcl91ICoqcGF0LCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSkpOworI2VuZGlmCisKKyNpZm5kZWYgU0lHX0VSUgorIyBkZWZpbmUgU0lHX0VSUgkoKFJFVFNJR1RZUEUgKCopKCkpLTEpCisjZW5kaWYKKworc3RhdGljIGludAlkb19yZXNpemUgPSBGQUxTRTsKKyNpZm5kZWYgX19FTVhfXworc3RhdGljIGNoYXJfdQkqZXh0cmFfc2hlbGxfYXJnID0gTlVMTDsKK3N0YXRpYyBpbnQJc2hvd19zaGVsbF9tZXNzID0gVFJVRTsKKyNlbmRpZgorc3RhdGljIGludAlkZWFkbHlfc2lnbmFsID0gMDsJICAgIC8qIFRoZSBzaWduYWwgd2UgY2F1Z2h0ICovCisKK3N0YXRpYyBpbnQgY3Vycl90bW9kZSA9IFRNT0RFX0NPT0s7CS8qIGNvbnRhaW5zIGN1cnJlbnQgdGVybWluYWwgbW9kZSAqLworCisjaWZkZWYgVVNFX1hTTVAKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgU21jQ29ubiBzbWNjb25uOwkgICAgLyogVGhlIFNNIGNvbm5lY3Rpb24gSUQgKi8KKyAgICBJY2VDb25uIGljZWNvbm47CSAgICAvKiBUaGUgSUNFIGNvbm5lY3Rpb24gSUQgKi8KKyAgICBCb29sIHNhdmVfeW91cnNlbGY7ICAgICAvKiBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2F2ZV95b3Vyc2VsZiAqLworICAgIEJvb2wgc2h1dGRvd247CSAgICAvKiBJZiB3ZSdyZSBpbiBzaHV0ZG93biBtb2RlICovCit9IHhzbXBfY29uZmlnX1Q7CisKK3N0YXRpYyB4c21wX2NvbmZpZ19UIHhzbXA7CisjZW5kaWYKKworI2lmZGVmIFNZU19TSUdMSVNUX0RFQ0xBUkVECisvKgorICogSSBoYXZlIHNlZW4KKyAqICBleHRlcm4gY2hhciAqX3N5c19zaWdsaXN0W05TSUddOworICogb24gSXJpeCwgTGludXgsIE5ldEJTRCBhbmQgU29sYXJpcy4gSXQgY29udGFpbnMgYSBuaWNlIGxpc3Qgb2Ygc3RyaW5ncworICogdGhhdCBkZXNjcmliZSB0aGUgc2lnbmFscy4gVGhhdCBpcyBuZWFybHkgd2hhdCB3ZSB3YW50IGhlcmUuICBCdXQKKyAqIGF1dG9jb25mIGRvZXMgb25seSBjaGVjayBmb3Igc3lzX3NpZ2xpc3QgKHdpdGhvdXQgdGhlIHVuZGVyc2NvcmUpLCBJCisgKiBkbyBub3Qgd2FudCB0byBjaGFuZ2UgZXZlcnl0aGluZyB0b2RheS4uLi4gancuCisgKiBUaGlzIGlzIHdoeSBBQ19ERUNMX1NZU19TSUdMSVNUIGlzIGNvbW1lbnRlZCBvdXQgaW4gY29uZmlndXJlLmluCisgKi8KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNpZ25hbGluZm8KK3sKKyAgICBpbnQJICAgIHNpZzsJLyogU2lnbmFsIG51bWJlciwgZWcuIFNJR1NFR1YgZXRjICovCisgICAgY2hhciAgICAqbmFtZTsJLyogU2lnbmFsIG5hbWUgKG5vdCBjaGFyX3UhKS4gKi8KKyAgICBjaGFyICAgIGRlYWRseTsJLyogQ2F0Y2ggYXMgYSBkZWFkbHkgc2lnbmFsPyAqLworfSBzaWduYWxfaW5mb1tdID0KK3sKKyNpZmRlZiBTSUdIVVAKKyAgICB7U0lHSFVQLAkgICAgIkhVUCIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorICAgIHtTSUdRVUlULAkgICAgIlFVSVQiLAlUUlVFfSwKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorICAgIHtTSUdJTEwsCSAgICAiSUxMIiwJVFJVRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisgICAge1NJR1RSQVAsCSAgICAiVFJBUCIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHQUJSVAorICAgIHtTSUdBQlJULAkgICAgIkFCUlQiLAlUUlVFfSwKKyNlbmRpZgorI2lmZGVmIFNJR0VNVAorICAgIHtTSUdFTVQsCSAgICAiRU1UIiwJVFJVRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdGUEUKKyAgICB7U0lHRlBFLAkgICAgIkZQRSIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHQlVTCisgICAge1NJR0JVUywJICAgICJCVVMiLAlUUlVFfSwKKyNlbmRpZgorI2lmZGVmIFNJR1NFR1YKKyAgICB7U0lHU0VHViwJICAgICJTRUdWIiwJVFJVRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdTWVMKKyAgICB7U0lHU1lTLAkgICAgIlNZUyIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHQUxSTQorICAgIHtTSUdBTFJNLAkgICAgIkFMUk0iLAlGQUxTRX0sCS8qIFBlcmwncyBhbGFybSgpIGNhbiB0cmlnZ2VyIGl0ICovCisjZW5kaWYKKyNpZmRlZiBTSUdURVJNCisgICAge1NJR1RFUk0sCSAgICAiVEVSTSIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisgICAge1NJR1ZUQUxSTSwJICAgICJWVEFMUk0iLAlUUlVFfSwKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKyAgICB7U0lHUFJPRiwJICAgICJQUk9GIiwJVFJVRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdYQ1BVCisgICAge1NJR1hDUFUsCSAgICAiWENQVSIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHWEZTWgorICAgIHtTSUdYRlNaLAkgICAgIlhGU1oiLAlUUlVFfSwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjEKKyAgICB7U0lHVVNSMSwJICAgICJVU1IxIiwJVFJVRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdVU1IyCisgICAge1NJR1VTUjIsCSAgICAiVVNSMiIsCVRSVUV9LAorI2VuZGlmCisjaWZkZWYgU0lHSU5UCisgICAge1NJR0lOVCwJICAgICJJTlQiLAlGQUxTRX0sCisjZW5kaWYKKyNpZmRlZiBTSUdXSU5DSAorICAgIHtTSUdXSU5DSCwJICAgICJXSU5DSCIsCUZBTFNFfSwKKyNlbmRpZgorI2lmZGVmIFNJR1RTVFAKKyAgICB7U0lHVFNUUCwJICAgICJUU1RQIiwJRkFMU0V9LAorI2VuZGlmCisjaWZkZWYgU0lHUElQRQorICAgIHtTSUdQSVBFLAkgICAgIlBJUEUiLAlGQUxTRX0sCisjZW5kaWYKKyAgICB7LTEsCSAgICAiVW5rbm93biEiLCBGQUxTRX0KK307CisKKyAgICB2b2lkCittY2hfd3JpdGUocywgbGVuKQorICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICB3cml0ZSgxLCAoY2hhciAqKXMsIGxlbik7CisgICAgaWYgKHBfd2QpCQkvKiBVbml4IGlzIHRvbyBmYXN0LCBzbG93IGRvd24gYSBiaXQgbW9yZSAqLworCVJlYWxXYWl0Rm9yQ2hhcihyZWFkX2NtZF9mZCwgcF93ZCwgTlVMTCk7Cit9CisKKy8qCisgKiBtY2hfaW5jaGFyKCk6IGxvdyBsZXZlbCBpbnB1dCBmdW5jaW9uLgorICogR2V0IGEgY2hhcmFjdGVycyBmcm9tIHRoZSBrZXlib2FyZC4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXZhaWxhYmxlLgorICogSWYgd3RpbWUgPT0gMCBkbyBub3Qgd2FpdCBmb3IgY2hhcmFjdGVycy4KKyAqIElmIHd0aW1lID09IG4gd2FpdCBhIHNob3J0IHRpbWUgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB3dGltZSA9PSAtMSB3YWl0IGZvcmV2ZXIgZm9yIGNoYXJhY3RlcnMuCisgKi8KKyAgICBpbnQKK21jaF9pbmNoYXIoYnVmLCBtYXhsZW4sIHd0aW1lLCB0Yl9jaGFuZ2VfY250KQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbWF4bGVuOworICAgIGxvbmcJd3RpbWU7CSAgICAvKiBkb24ndCB1c2UgInRpbWUiLCBNSVBTIGNhbm5vdCBoYW5kbGUgaXQgKi8KKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQ7Cit7CisgICAgaW50CQlsZW47CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgc3RhdGljIGludAlvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisKKyAgICAvKiBDaGVjayBpZiB3aW5kb3cgY2hhbmdlZCBzaXplIHdoaWxlIHdlIHdlcmUgYnVzeSwgcGVyaGFwcyB0aGUgIjpzZXQKKyAgICAgKiBjb2x1bW5zPTk5IiBjb21tYW5kIHdhcyB1c2VkLiAqLworICAgIHdoaWxlIChkb19yZXNpemUpCisJaGFuZGxlX3Jlc2l6ZSgpOworCisgICAgaWYgKHd0aW1lID49IDApCisgICAgeworCXdoaWxlIChXYWl0Rm9yQ2hhcih3dGltZSkgPT0gMCkJCS8qIG5vIGNoYXJhY3RlciBhdmFpbGFibGUgKi8KKwl7CisJICAgIGlmICghZG9fcmVzaXplKQkvKiByZXR1cm4gaWYgbm90IGludGVycnVwdGVkIGJ5IHJlc2l6ZSAqLworCSAgICB7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisJCW9uY2VfYWxyZWFkeSA9IDA7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJICAgIH0KKwkgICAgaGFuZGxlX3Jlc2l6ZSgpOworCX0KKyAgICB9CisgICAgZWxzZQkvKiB3dGltZSA9PSAtMSAqLworICAgIHsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlpZiAob25jZV9hbHJlYWR5ID09IDIpCisJICAgIHVwZGF0ZXNjcmlwdCgwKTsKKwllbHNlIGlmIChvbmNlX2FscmVhZHkgPT0gMSkKKwl7CisJICAgIHNldGN1cnNvcigpOworCSAgICBvbmNlX2FscmVhZHkgPSAyOworCSAgICByZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBubyBjaGFyYWN0ZXIgYXZhaWxhYmxlIHdpdGhpbiAndXBkYXRldGltZScgc2Vjb25kcworCSAqIGZsdXNoIGFsbCB0aGUgc3dhcCBmaWxlcyB0byBkaXNrCisJICogQWxzbyBkb25lIHdoZW4gaW50ZXJydXB0ZWQgYnkgU0lHV0lOQ0guCisJICovCisJaWYgKFdhaXRGb3JDaGFyKHBfdXQpID09IDApCisJeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBpZiAoaGFzX2N1cnNvcmhvbGQoKSAmJiBnZXRfcmVhbF9zdGF0ZSgpID09IE5PUk1BTF9CVVNZKQorCSAgICB7CisJCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0NVUlNPUkhPTEQsIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworCQl1cGRhdGVfc2NyZWVuKFZBTElEKTsKKwkJb25jZV9hbHJlYWR5ID0gMTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCXVwZGF0ZXNjcmlwdCgwKTsKKwl9CisgICAgfQorCisgICAgZm9yICg7OykJLyogcmVwZWF0IHVudGlsIHdlIGdvdCBhIGNoYXJhY3RlciAqLworICAgIHsKKwl3aGlsZSAoZG9fcmVzaXplKSAgICAvKiB3aW5kb3cgY2hhbmdlZCBzaXplICovCisJICAgIGhhbmRsZV9yZXNpemUoKTsKKwkvKgorCSAqIHdlIHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgdGhlIHdpbmNoIHNpZ25hbAorCSAqLworCVdhaXRGb3JDaGFyKC0xTCk7CisJaWYgKGRvX3Jlc2l6ZSkJICAgIC8qIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIHNpZ25hbCAqLworCSAgICBjb250aW51ZTsKKworCS8qIElmIGlucHV0IHdhcyBwdXQgZGlyZWN0bHkgaW4gdHlwZWFoZWFkIGJ1ZmZlciBiYWlsIG91dCBoZXJlLiAqLworCWlmICh0eXBlYnVmX2NoYW5nZWQodGJfY2hhbmdlX2NudCkpCisJICAgIHJldHVybiAwOworCisJLyoKKwkgKiBGb3Igc29tZSB0ZXJtaW5hbHMgd2Ugb25seSBnZXQgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUuCisJICogV2Ugd2FudCB0aGUgZ2V0IGFsbCBhdmFpbGFibGUgY2hhcmFjdGVycywgc28gd2UgY291bGQga2VlcCBvbgorCSAqIHRyeWluZyB1bnRpbCBub25lIGlzIGF2YWlsYWJsZQorCSAqIEZvciBzb21lIG90aGVyIHRlcm1pbmFscyB0aGlzIGlzIHF1aXRlIHNsb3csIHRoYXQncyB3aHkgd2UgZG9uJ3QgZG8KKwkgKiBpdC4KKwkgKi8KKwlsZW4gPSByZWFkX2Zyb21faW5wdXRfYnVmKGJ1ZiwgKGxvbmcpbWF4bGVuKTsKKwlpZiAobGVuID4gMCkKKwl7CisjaWZkZWYgT1MyCisJICAgIGludCBpOworCisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKGJ1ZltpXSA9PSAwKQorCQkgICAgYnVmW2ldID0gS19OVUw7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgb25jZV9hbHJlYWR5ID0gMDsKKyNlbmRpZgorCSAgICByZXR1cm4gbGVuOworCX0KKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraGFuZGxlX3Jlc2l6ZSgpCit7CisgICAgZG9fcmVzaXplID0gRkFMU0U7CisgICAgc2hlbGxfcmVzaXplZCgpOworfQorCisvKgorICogcmV0dXJuIG5vbi16ZXJvIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZQorICovCisgICAgaW50CittY2hfY2hhcl9hdmFpbCgpCit7CisgICAgcmV0dXJuIFdhaXRGb3JDaGFyKDBMKTsKK30KKworI2lmIGRlZmluZWQoSEFWRV9UT1RBTF9NRU0pIHx8IGRlZmluZWQoUFJPVE8pCisjIGlmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyMgIGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0NUTF9IKSAmJiBkZWZpbmVkKEhBVkVfU1lTQ1RMKQorIyAgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0lORk9fSCkgJiYgZGVmaW5lZChIQVZFX1NZU0lORk8pCisjICBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorIyBlbmRpZgorCisvKgorICogUmV0dXJuIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlLiAgRG9lc24ndCBjaGFuZ2Ugd2hlbiBtZW1vcnkgaGFzCisgKiBiZWVuIGFsbG9jYXRlZC4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBsb25nX3UKK21jaF90b3RhbF9tZW0oc3BlY2lhbCkKKyAgICBpbnQgc3BlY2lhbDsKK3sKKyMgaWZkZWYgX19FTVhfXworICAgIHJldHVybiB1bGltaXQoMywgMEwpOyAgIC8qIGFsd2F5cyAzMk1CPyAqLworIyBlbHNlCisgICAgbG9uZ191CW1lbSA9IDA7CisKKyMgIGlmZGVmIEhBVkVfU1lTQ1RMCisgICAgaW50CQltaWJbMl0sIHBoeXNtZW07CisgICAgc2l6ZV90CWxlbjsKKworICAgIC8qIEJTRCB3YXkgb2YgZ2V0dGluZyB0aGUgYW1vdW50IG9mIFJBTSBhdmFpbGFibGUuICovCisgICAgbWliWzBdID0gQ1RMX0hXOworICAgIG1pYlsxXSA9IEhXX1VTRVJNRU07CisgICAgbGVuID0gc2l6ZW9mKHBoeXNtZW0pOworICAgIGlmIChzeXNjdGwobWliLCAyLCAmcGh5c21lbSwgJmxlbiwgTlVMTCwgMCkgPT0gMCkKKwltZW0gPSAobG9uZ191KXBoeXNtZW07CisjICBlbmRpZgorCisjICBpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0lORk9fSCkgJiYgZGVmaW5lZChIQVZFX1NZU0lORk8pCisgICAgaWYgKG1lbSA9PSAwKQorICAgIHsKKwlzdHJ1Y3Qgc3lzaW5mbyBzaW5mbzsKKworCS8qIExpbnV4IHdheSBvZiBnZXR0aW5nIGFtb3VudCBvZiBSQU0gYXZhaWxhYmxlICovCisJaWYgKHN5c2luZm8oJnNpbmZvKSA9PSAwKQorCSAgICBtZW0gPSBzaW5mby50b3RhbHJhbTsKKyAgICB9CisjICBlbmRpZgorCisjICBpZmRlZiBIQVZFX1NZU0NPTkYKKyAgICBpZiAobWVtID09IDApCisgICAgeworCWxvbmcJICAgIHBhZ2VzaXplLCBwYWdlY291bnQ7CisKKwkvKiBTb2xhcmlzIHdheSBvZiBnZXR0aW5nIGFtb3VudCBvZiBSQU0gYXZhaWxhYmxlICovCisJcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisJcGFnZWNvdW50ID0gc3lzY29uZihfU0NfUEhZU19QQUdFUyk7CisJaWYgKHBhZ2VzaXplID4gMCAmJiBwYWdlY291bnQgPiAwKQorCSAgICBtZW0gPSAobG9uZ191KXBhZ2VzaXplICogcGFnZWNvdW50OworICAgIH0KKyMgIGVuZGlmCisKKyAgICAvKiBSZXR1cm4gdGhlIG1pbmltdW0gb2YgdGhlIHBoeXNpY2FsIG1lbW9yeSBhbmQgdGhlIHVzZXIgbGltaXQsIGJlY2F1c2UKKyAgICAgKiB1c2luZyBtb3JlIHRoYW4gdGhlIHVzZXIgbGltaXQgbWF5IGNhdXNlIFZpbSB0byBiZSB0ZXJtaW5hdGVkLiAqLworIyAgaWYgZGVmaW5lZChIQVZFX1NZU19SRVNPVVJDRV9IKSAmJiBkZWZpbmVkKEhBVkVfR0VUUkxJTUlUKQorICAgIHsKKwlzdHJ1Y3QgcmxpbWl0CXJscDsKKworCWlmIChnZXRybGltaXQoUkxJTUlUX0RBVEEsICZybHApID09IDAKKwkJJiYgcmxwLnJsaW1fY3VyIDwgKChybGltX3QpMSA8PCAoc2l6ZW9mKGxvbmdfdSkgKiA4IC0gMSkpCisjICAgaWZkZWYgUkxJTV9JTkZJTklUWQorCQkmJiBybHAucmxpbV9jdXIgIT0gUkxJTV9JTkZJTklUWQorIyAgIGVuZGlmCisJCSYmIChsb25nX3UpcmxwLnJsaW1fY3VyIDwgbWVtCisJICAgKQorCSAgICByZXR1cm4gKGxvbmdfdSlybHAucmxpbV9jdXI7CisgICAgfQorIyAgZW5kaWYKKworICAgIGlmIChtZW0gPiAwKQorCXJldHVybiBtZW07CisgICAgcmV0dXJuIChsb25nX3UpMHg3ZmZmZmZmZjsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisgICAgdm9pZAorbWNoX2RlbGF5KG1zZWMsIGlnbm9yZWlucHV0KQorICAgIGxvbmcJbXNlYzsKKyAgICBpbnQJCWlnbm9yZWlucHV0OworeworICAgIGludAkJb2xkX3Rtb2RlOworCisgICAgaWYgKGlnbm9yZWlucHV0KQorICAgIHsKKwkvKiBHbyB0byBjb29rZWQgbW9kZSB3aXRob3V0IGVjaG8sIHRvIGFsbG93IFNJR0lOVCBpbnRlcnJ1cHRpbmcgdXMKKwkgKiBoZXJlICovCisJb2xkX3Rtb2RlID0gY3Vycl90bW9kZTsKKwlpZiAoY3Vycl90bW9kZSA9PSBUTU9ERV9SQVcpCisJICAgIHNldHRtb2RlKFRNT0RFX1NMRUVQKTsKKworCS8qCisJICogRXZlcnlib2R5IHNsZWVwcyBpbiBhIGRpZmZlcmVudCB3YXkuLi4KKwkgKiBQcmVmZXIgbmFub3NsZWVwKCksIHNvbWUgdmVyc2lvbnMgb2YgdXNsZWVwKCkgY2FuIG9ubHkgc2xlZXAgdXAgdG8KKwkgKiBvbmUgc2Vjb25kLgorCSAqLworI2lmZGVmIEhBVkVfTkFOT1NMRUVQCisJeworCSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwkgICAgdHMudHZfc2VjID0gbXNlYyAvIDEwMDA7CisJICAgIHRzLnR2X25zZWMgPSAobXNlYyAlIDEwMDApICogMTAwMDAwMDsKKwkgICAgKHZvaWQpbmFub3NsZWVwKCZ0cywgTlVMTCk7CisJfQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9VU0xFRVAKKwl3aGlsZSAobXNlYyA+PSAxMDAwKQorCXsKKwkgICAgdXNsZWVwKCh1bnNpZ25lZCBpbnQpKDk5OSAqIDEwMDApKTsKKwkgICAgbXNlYyAtPSA5OTk7CisJfQorCXVzbGVlcCgodW5zaWduZWQgaW50KShtc2VjICogMTAwMCkpOworIyBlbHNlCisjICBpZm5kZWYgSEFWRV9TRUxFQ1QKKwlwb2xsKE5VTEwsIDAsIChpbnQpbXNlYyk7CisjICBlbHNlCisjICAgaWZkZWYgX19FTVhfXworCV9zbGVlcDIobXNlYyk7CisjICAgZWxzZQorCXsKKwkgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKwkgICAgdHYudHZfc2VjID0gbXNlYyAvIDEwMDA7CisJICAgIHR2LnR2X3VzZWMgPSAobXNlYyAlIDEwMDApICogMTAwMDsKKwkgICAgLyoKKwkgICAgICogTk9URTogU29sYXJpcyAyLjYgaGFzIGEgYnVnIHRoYXQgbWFrZXMgc2VsZWN0KCkgaGFuZyBoZXJlLiAgR2V0CisJICAgICAqIGEgcGF0Y2ggZnJvbSBTdW4gdG8gZml4IHRoaXMuICBSZXBvcnRlZCBieSBHdW5uYXIgUGVkZXJzZW4uCisJICAgICAqLworCSAgICBzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2KTsKKwl9CisjICAgZW5kaWYgLyogX19FTVhfXyAqLworIyAgZW5kaWYgLyogSEFWRV9TRUxFQ1QgKi8KKyMgZW5kaWYgLyogSEFWRV9OQU5PU0xFRVAgKi8KKyNlbmRpZiAvKiBIQVZFX1VTTEVFUCAqLworCisJc2V0dG1vZGUob2xkX3Rtb2RlKTsKKyAgICB9CisgICAgZWxzZQorCVdhaXRGb3JDaGFyKG1zZWMpOworfQorCisjaWYgZGVmaW5lZChIQVZFX0dFVFJMSU1JVCkgXAorCXx8ICghZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHU1RBQ0spKQorIyBkZWZpbmUgSEFWRV9DSEVDS19TVEFDS19HUk9XVEgKKy8qCisgKiBTdXBwb3J0IGZvciBjaGVja2luZyBmb3IgYW4gYWxtb3N0LW91dC1vZi1zdGFjay1zcGFjZSBzaXR1YXRpb24uCisgKi8KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gaXRlbSBvbiB0aGUgc3RhY2suICBVc2VkIHRvIGZpbmQgb3V0IGlmIHRoZSBzdGFjaworICogZ3Jvd3MgdXAgb3IgZG93bi4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfc3RhY2tfZ3Jvd3RoIF9fQVJHUygoY2hhciAqcCkpOworc3RhdGljIGludCBzdGFja19ncm93c19kb3dud2FyZHM7CisKKy8qCisgKiBGaW5kIG91dCBpZiB0aGUgc3RhY2sgZ3Jvd3MgdXB3YXJkcyBvciBkb3dud2FyZHMuCisgKiAicCIgcG9pbnRzIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrIG9mIHRoZSBjYWxsZXIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfc3RhY2tfZ3Jvd3RoKHApCisgICAgY2hhcgkqcDsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBzdGFja19ncm93c19kb3dud2FyZHMgPSAocCA+IChjaGFyICopJmkpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfR0VUUkxJTUlUKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGNoYXIgKnN0YWNrX2xpbWl0ID0gTlVMTDsKKworI2lmIGRlZmluZWQoX1RIUkVBRF9TQUZFKSAmJiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9OUF9IKQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjIGluY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisvKgorICogRmluZCBvdXQgdW50aWwgaG93IHZhciB0aGUgc3RhY2sgY2FuIGdyb3cgd2l0aG91dCBnZXR0aW5nIGludG8gdHJvdWJsZS4KKyAqIENhbGxlZCB3aGVuIHN0YXJ0aW5nIHVwIGFuZCB3aGVuIHN3aXRjaGluZyB0byB0aGUgc2lnbmFsIHN0YWNrIGluCisgKiBkZWF0aHRyYXAoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitnZXRfc3RhY2tfbGltaXQoKQoreworICAgIHN0cnVjdCBybGltaXQJcmxwOworICAgIGludAkJCWk7CisgICAgbG9uZwkJbGltOworCisgICAgLyogU2V0IHRoZSBzdGFjayBsaW1pdCB0byAxNS8xNiBvZiB0aGUgYWxsb3dhYmxlIHNpemUuICBTa2lwIHRoaXMgd2hlbiB0aGUKKyAgICAgKiBsaW1pdCBkb2Vzbid0IGZpdCBpbiBhIGxvbmcgKHJsaW1fY3VyIG1pZ2h0IGJlICJsb25nIGxvbmciKS4gKi8KKyAgICBpZiAoZ2V0cmxpbWl0KFJMSU1JVF9TVEFDSywgJnJscCkgPT0gMAorCSAgICAmJiBybHAucmxpbV9jdXIgPCAoKHJsaW1fdCkxIDw8IChzaXplb2YobG9uZ191KSAqIDggLSAxKSkKKyMgIGlmZGVmIFJMSU1fSU5GSU5JVFkKKwkgICAgJiYgcmxwLnJsaW1fY3VyICE9IFJMSU1fSU5GSU5JVFkKKyMgIGVuZGlmCisgICAgICAgKQorICAgIHsKKwlsaW0gPSAobG9uZylybHAucmxpbV9jdXI7CisjaWYgZGVmaW5lZChfVEhSRUFEX1NBRkUpICYmIGRlZmluZWQoSEFWRV9QVEhSRUFEX05QX0gpCisJeworCSAgICBwdGhyZWFkX2F0dHJfdCAgYXR0cjsKKwkgICAgc2l6ZV90CSAgICBzaXplOworCisJICAgIC8qIE9uIEZyZWVCU0QgdGhlIGluaXRpYWwgdGhyZWFkIGFsd2F5cyBoYXMgYSBmaXhlZCBzdGFjayBzaXplLCBubworCSAgICAgKiBtYXR0ZXIgd2hhdCB0aGUgbGltaXRzIGFyZSBzZXQgdG8uICBOb3JtYWxseSBpdCdzIDEgTWJ5dGUuICovCisJICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKwkgICAgaWYgKHB0aHJlYWRfYXR0cl9nZXRfbnAocHRocmVhZF9zZWxmKCksICZhdHRyKSA9PSAwKQorCSAgICB7CisJCXB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUoJmF0dHIsICZzaXplKTsKKwkJaWYgKGxpbSA+IChsb25nKXNpemUpCisJCSAgICBsaW0gPSAobG9uZylzaXplOworCSAgICB9CisJICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKwl9CisjZW5kaWYKKwlpZiAoc3RhY2tfZ3Jvd3NfZG93bndhcmRzKQorCXsKKwkgICAgc3RhY2tfbGltaXQgPSAoY2hhciAqKSgobG9uZykmaSAtIChsaW0gLyAxNkwgKiAxNUwpKTsKKwkgICAgaWYgKHN0YWNrX2xpbWl0ID49IChjaGFyICopJmkpCisJCS8qIG92ZXJmbG93LCBzZXQgdG8gMS8xNiBvZiBjdXJyZW50IHN0YWNrIHBvc2l0aW9uICovCisJCXN0YWNrX2xpbWl0ID0gKGNoYXIgKikoKGxvbmcpJmkgLyAxNkwpOworCX0KKwllbHNlCisJeworCSAgICBzdGFja19saW1pdCA9IChjaGFyICopKChsb25nKSZpICsgKGxpbSAvIDE2TCAqIDE1TCkpOworCSAgICBpZiAoc3RhY2tfbGltaXQgPD0gKGNoYXIgKikmaSkKKwkJc3RhY2tfbGltaXQgPSBOVUxMOwkvKiBvdmVyZmxvdyAqLworCX0KKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gRkFJTCB3aGVuIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIHNwYWNlLgorICogInAiIG11c3QgcG9pbnQgdG8gYW55IHZhcmlhYmxlIGxvY2FsIHRvIHRoZSBjYWxsZXIgdGhhdCdzIG9uIHRoZSBzdGFjay4KKyAqLworICAgIGludAorbWNoX3N0YWNrY2hlY2socCkKKyAgICBjaGFyCSpwOworeworICAgIGlmIChzdGFja19saW1pdCAhPSBOVUxMKQorICAgIHsKKwlpZiAoc3RhY2tfZ3Jvd3NfZG93bndhcmRzKQorCXsKKwkgICAgaWYgKHAgPCBzdGFja19saW1pdCkKKwkJcmV0dXJuIEZBSUw7CisJfQorCWVsc2UgaWYgKHAgPiBzdGFja19saW1pdCkKKwkgICAgcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSB8fCBkZWZpbmVkKEhBVkVfU0lHU1RBQ0spCisvKgorICogU3VwcG9ydCBmb3IgdXNpbmcgdGhlIHNpZ25hbCBzdGFjay4KKyAqIFRoaXMgaGVscHMgd2hlbiB3ZSBydW4gb3V0IG9mIHN0YWNrIHNwYWNlLCB3aGljaCBjYXVzZXMgYSBTSUdTRUdWLiAgVGhlCisgKiBzaWduYWwgaGFuZGxlciB0aGVuIG11c3QgcnVuIG9uIGFub3RoZXIgc3RhY2ssIHNpbmNlIHRoZSBub3JtYWwgc3RhY2sgaXMKKyAqIGNvbXBsZXRlbHkgZnVsbC4KKyAqLworCisjaWZuZGVmIFNJR1NUS1NaCisjIGRlZmluZSBTSUdTVEtTWiA4MDAwICAgIC8qIGp1c3QgYSBndWVzcyBvZiBob3cgbXVjaCBzdGFjayBpcyBuZWVkZWQuLi4gKi8KKyNlbmRpZgorCisjIGlmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKK3N0YXRpYyBzdGFja190IHNpZ3N0azsJCQkvKiBmb3Igc2lnYWx0c3RhY2soKSAqLworIyBlbHNlCitzdGF0aWMgc3RydWN0IHNpZ3N0YWNrIHNpZ3N0azsJCS8qIGZvciBzaWdzdGFjaygpICovCisjIGVuZGlmCisKK3N0YXRpYyB2b2lkIGluaXRfc2lnbmFsX3N0YWNrIF9fQVJHUygodm9pZCkpOworc3RhdGljIGNoYXIgKnNpZ25hbF9zdGFjazsKKworICAgIHN0YXRpYyB2b2lkCitpbml0X3NpZ25hbF9zdGFjaygpCit7CisgICAgaWYgKHNpZ25hbF9zdGFjayAhPSBOVUxMKQorICAgIHsKKyMgaWZkZWYgSEFWRV9TSUdBTFRTVEFDSworIyAgaWZkZWYgX19BUFBMRV9fCisJLyogbWlzc2luZyBwcm90b3R5cGUuICBBZGRpbmcgaXQgdG8gb3NkZWY/LmguaW4gZG9lc24ndCB3b3JrLCBiZWNhdXNlCisJICogInN0cnVjdCBzaWdhbHRzdGFjayIgbmVlZHMgdG8gYmUgZGVjbGFyZWQuICovCisJZXh0ZXJuIGludCBzaWdhbHRzdGFjayBfX0FSR1MoKGNvbnN0IHN0cnVjdCBzaWdhbHRzdGFjayAqc3MsIHN0cnVjdCBzaWdhbHRzdGFjayAqb3NzKSk7CisjICBlbmRpZgorCisjICBpZmRlZiBIQVZFX1NTX0JBU0UKKwlzaWdzdGsuc3NfYmFzZSA9IHNpZ25hbF9zdGFjazsKKyMgIGVsc2UKKwlzaWdzdGsuc3Nfc3AgPSBzaWduYWxfc3RhY2s7CisjICBlbmRpZgorCXNpZ3N0ay5zc19zaXplID0gU0lHU1RLU1o7CisJc2lnc3RrLnNzX2ZsYWdzID0gMDsKKwkodm9pZClzaWdhbHRzdGFjaygmc2lnc3RrLCBOVUxMKTsKKyMgZWxzZQorCXNpZ3N0ay5zc19zcCA9IHNpZ25hbF9zdGFjazsKKwlpZiAoc3RhY2tfZ3Jvd3NfZG93bndhcmRzKQorCSAgICBzaWdzdGsuc3Nfc3AgKz0gU0lHU1RLU1ogLSAxOworCXNpZ3N0ay5zc19vbnN0YWNrID0gMDsKKwkodm9pZClzaWdzdGFjaygmc2lnc3RrLCBOVUxMKTsKKyMgZW5kaWYKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFdlIG5lZWQgY29ycmVjdCBwb3RhdG90eXBlcyBmb3IgYSBzaWduYWwgZnVuY3Rpb24sIG90aGVyd2lzZSBtZWFuIGNvbXBpbGVycworICogd2lsbCBiYXJmIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBzaWduYWwoKSBpcyBgYHdyb25nJycuCisgKiBMZXQgbWUgdHJ5IGl0IHdpdGggYSBmZXcgdHJpY2t5IGRlZmluZXMgZnJvbSBteSBvd24gb3NkZWYuaAkoancpLgorICovCisjaWYgZGVmaW5lZChTSUdXSU5DSCkKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIFJFVFNJR1RZUEUKK3NpZ193aW5jaCBTSUdERUZBUkcoc2lnYXJnKQoreworICAgIC8qIHRoaXMgaXMgbm90IHJlcXVpcmVkIG9uIGFsbCBzeXN0ZW1zLCBidXQgaXQgZG9lc24ndCBodXJ0IGFueWJvZHkgKi8KKyAgICBzaWduYWwoU0lHV0lOQ0gsIChSRVRTSUdUWVBFICgqKSgpKXNpZ193aW5jaCk7CisgICAgZG9fcmVzaXplID0gVFJVRTsKKyAgICBTSUdSRVRVUk47Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0lHSU5UKQorLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgUkVUU0lHVFlQRQorY2F0Y2hfc2lnaW50IFNJR0RFRkFSRyhzaWdhcmcpCit7CisgICAgLyogdGhpcyBpcyBub3QgcmVxdWlyZWQgb24gYWxsIHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IGh1cnQgYW55Ym9keSAqLworICAgIHNpZ25hbChTSUdJTlQsIChSRVRTSUdUWVBFICgqKSgpKWNhdGNoX3NpZ2ludCk7CisgICAgZ290X2ludCA9IFRSVUU7CisgICAgU0lHUkVUVVJOOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNJR1BXUikKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIFJFVFNJR1RZUEUKK2NhdGNoX3NpZ3B3ciBTSUdERUZBUkcoc2lnYXJnKQoreworICAgIC8qCisgICAgICogSSdtIG5vdCBzdXJlIHdlIGdldCB0aGUgU0lHUFdSIHNpZ25hbCB3aGVuIHRoZSBzeXN0ZW0gaXMgcmVhbGx5IGdvaW5nCisgICAgICogZG93biBvciB3aGVuIHRoZSBiYXR0ZXJpZXMgYXJlIGFsbW9zdCBlbXB0eS4gIEp1c3QgcHJlc2VydmUgdGhlIHN3YXAKKyAgICAgKiBmaWxlcyBhbmQgZG9uJ3QgZXhpdCwgdGhhdCBjYW4ndCBkbyBhbnkgaGFybS4KKyAgICAgKi8KKyAgICBtbF9zeW5jX2FsbChGQUxTRSwgRkFMU0UpOworICAgIFNJR1JFVFVSTjsKK30KKyNlbmRpZgorCisjaWZkZWYgU0VUX1NJR19BTEFSTQorLyoKKyAqIHNpZ25hbCBmdW5jdGlvbiBmb3IgYWxhcm0oKS4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgUkVUU0lHVFlQRQorc2lnX2FsYXJtIFNJR0RFRkFSRyhzaWdhcmcpCit7CisgICAgLyogZG9lc24ndCBkbyBhbnl0aGluZywganVzdCB0byBicmVhayBhIHN5c3RlbSBjYWxsICovCisgICAgc2lnX2FsYXJtX2NhbGxlZCA9IFRSVUU7CisgICAgU0lHUkVUVVJOOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU0VUSk1QX0gpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQSBzaW1wbGlzdGljIHZlcnNpb24gb2Ygc2V0am1wKCkgdGhhdCBvbmx5IGFsbG93cyBvbmUgbGV2ZWwgb2YgdXNpbmcuCisgKiBEb24ndCBjYWxsIHR3aWNlIGJlZm9yZSBjYWxsaW5nIG1jaF9lbmRqbXAoKSEuCisgKiBVc2FnZToKKyAqCW1jaF9zdGFydGptcCgpOworICoJaWYgKFNFVEpNUChsY19qdW1wX2VudikgIT0gMCkKKyAqCXsKKyAqCSAgICBtY2hfZGlkam1wKCk7CisgKgkgICAgRU1TRygiY3Jhc2ghIik7CisgKgl9CisgKgllbHNlCisgKgl7CisgKgkgICAgZG9fdGhlX3dvcms7CisgKgkgICAgbWNoX2VuZGptcCgpOworICoJfQorICogTm90ZTogQ2FuJ3QgbW92ZSBTRVRKTVAoKSBoZXJlLCBiZWNhdXNlIGEgZnVuY3Rpb24gY2FsbGluZyBzZXRqbXAoKSBtdXN0CisgKiBub3QgcmV0dXJuIGJlZm9yZSB0aGUgc2F2ZWQgZW52aXJvbm1lbnQgaXMgdXNlZC4KKyAqIFJldHVybnMgT0sgZm9yIG5vcm1hbCByZXR1cm4sIEZBSUwgd2hlbiB0aGUgcHJvdGVjdGVkIGNvZGUgY2F1c2VkIGEKKyAqIHByb2JsZW0gYW5kIExPTkdKTVAoKSB3YXMgdXNlZC4KKyAqLworICAgIHZvaWQKK21jaF9zdGFydGptcCgpCit7CisjaWZkZWYgU0lHSEFTQVJHCisgICAgbGNfc2lnbmFsID0gMDsKKyNlbmRpZgorICAgIGxjX2FjdGl2ZSA9IFRSVUU7Cit9CisKKyAgICB2b2lkCittY2hfZW5kam1wKCkKK3sKKyAgICBsY19hY3RpdmUgPSBGQUxTRTsKK30KKworICAgIHZvaWQKK21jaF9kaWRqbXAoKQoreworIyBpZiBkZWZpbmVkKEhBVkVfU0lHQUxUU1RBQ0spIHx8IGRlZmluZWQoSEFWRV9TSUdTVEFDSykKKyAgICAvKiBPbiBGcmVlQlNEIHRoZSBzaWduYWwgc3RhY2sgaGFzIHRvIGJlIHJlc2V0IGFmdGVyIHVzaW5nIHNpZ2xvbmdqbXAoKSwKKyAgICAgKiBvdGhlcndpc2UgY2F0Y2hpbmcgdGhlIHNpZ25hbCBvbmx5IHdvcmtzIG9uY2UuICovCisgICAgaW5pdF9zaWduYWxfc3RhY2soKTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRlYWRseSBzaWduYWxzLgorICogSXQgdHJpZXMgdG8gcHJlc2VydmUgYW55IHN3YXAgZmlsZSBhbmQgZXhpdCBwcm9wZXJseS4KKyAqIChwYXJ0bHkgZnJvbSBFbHZpcykuCisgKi8KKyAgICBzdGF0aWMgUkVUU0lHVFlQRQorZGVhdGh0cmFwIFNJR0RFRkFSRyhzaWdhcmcpCit7CisgICAgc3RhdGljIGludAllbnRlcmVkID0gMDsJICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgd2UgZ290IGhlcmUuCisJCQkJICAgICAgIE5vdGU6IHdoZW4gbWVtb3J5IGhhcyBiZWVuIGNvcnJ1cHRlZAorCQkJCSAgICAgICB0aGlzIG1heSBnZXQgYW4gYXJiaXRyYXJ5IHZhbHVlISAqLworI2lmZGVmIFNJR0hBU0FSRworICAgIGludAkJaTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1NFVEpNUF9IKQorICAgIC8qCisgICAgICogQ2F0Y2ggYSBjcmFzaCBpbiBwcm90ZWN0ZWQgY29kZS4KKyAgICAgKiBSZXN0b3JlcyB0aGUgZW52aXJvbm1lbnQgc2F2ZWQgaW4gbGNfanVtcF9lbnYsIHdoaWNoIGxvb2tzIGxpa2UKKyAgICAgKiBTRVRKTVAoKSByZXR1cm5zIDEuCisgICAgICovCisgICAgaWYgKGxjX2FjdGl2ZSkKKyAgICB7CisjIGlmIGRlZmluZWQoU0lHSEFTQVJHKQorCWxjX3NpZ25hbCA9IHNpZ2FyZzsKKyMgZW5kaWYKKwlsY19hY3RpdmUgPSBGQUxTRTsJLyogZG9uJ3QganVtcCBhZ2FpbiAqLworCUxPTkdKTVAobGNfanVtcF9lbnYsIDEpOworCS8qIE5PVFJFQUNIRUQgKi8KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFJlbWVtYmVyIGhvdyBvZnRlbiB3ZSBoYXZlIGJlZW4gY2FsbGVkLiAqLworICAgICsrZW50ZXJlZDsKKworI2lmZGVmIEZFQVRfRVZBTAorICAgIC8qIFNldCB0aGUgdjpkeWluZyB2YXJpYWJsZS4gKi8KKyAgICBzZXRfdmltX3Zhcl9ucihWVl9EWUlORywgKGxvbmcpZW50ZXJlZCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfR0VUUkxJTUlUCisgICAgLyogU2luY2Ugd2UgYXJlIG5vdyB1c2luZyB0aGUgc2lnbmFsIHN0YWNrLCBuZWVkIHRvIHJlc2V0IHRoZSBzdGFjaworICAgICAqIGxpbWl0LiAgT3RoZXJ3aXNlIHVzaW5nIGEgcmVnZXhwIHdpbGwgZmFpbC4gKi8KKyAgICBnZXRfc3RhY2tfbGltaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgU0lHSEFTQVJHCisgICAgLyogdHJ5IHRvIGZpbmQgdGhlIG5hbWUgb2YgdGhpcyBzaWduYWwgKi8KKyAgICBmb3IgKGkgPSAwOyBzaWduYWxfaW5mb1tpXS5zaWcgIT0gLTE7IGkrKykKKwlpZiAoc2lnYXJnID09IHNpZ25hbF9pbmZvW2ldLnNpZykKKwkgICAgYnJlYWs7CisgICAgZGVhZGx5X3NpZ25hbCA9IHNpZ2FyZzsKKyNlbmRpZgorCisgICAgZnVsbF9zY3JlZW4gPSBGQUxTRTsJLyogZG9uJ3Qgd3JpdGUgbWVzc2FnZSB0byB0aGUgR1VJLCBpdCBtaWdodCBiZQorCQkJCSAqIHBhcnQgb2YgdGhlIHByb2JsZW0uLi4gKi8KKyAgICAvKgorICAgICAqIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGFmdGVyIGVudGVyaW5nIGhlcmUsIHdlIG1heSBnZXQgaGVyZSBhZ2Fpbi4KKyAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgZ2l2ZSBhIG1lc3NhZ2UgYW5kIHRyeSB0byBleGl0IG5pY2VseSAocmVzZXR0aW5nIHRoZQorICAgICAqIHRlcm1pbmFsIG1vZGUsIGV0Yy4pCisgICAgICogV2hlbiB0aGlzIGhhcHBlbnMgdHdpY2UsIGp1c3QgZXhpdCwgZG9uJ3QgZXZlbiB0cnkgdG8gZ2l2ZSBhIG1lc3NhZ2UsCisgICAgICogc3RhY2sgbWF5IGJlIGNvcnJ1cHQgb3Igc29tZXRoaW5nIHdlaXJkLgorICAgICAqIFdoZW4gdGhpcyBzdGlsbCBoYXBwZW5zIGFnYWluIChvciBtZW1vcnkgd2FzIGNvcnJ1cHRlZCBpbiBzdWNoIGEgd2F5CisgICAgICogdGhhdCAiZW50ZXJlZCIgd2FzIGNsb2JiZXJlZCkgdXNlIF9leGl0KCksIGRvbid0IHRyeSBmcmVlaW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBpZiAoZW50ZXJlZCA+PSAzKQorICAgIHsKKwlyZXNldF9zaWduYWxzKCk7CS8qIGRvbid0IGNhdGNoIGFueSBzaWduYWxzIGFueW1vcmUgKi8KKwltYXlfY29yZV9kdW1wKCk7CisJaWYgKGVudGVyZWQgPj0gNCkKKwkgICAgX2V4aXQoOCk7CisJZXhpdCg3KTsKKyAgICB9CisgICAgaWYgKGVudGVyZWQgPT0gMikKKyAgICB7CisJT1VUX1NUUihfKCJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIpKTsKKwlvdXRfZmx1c2goKTsKKwlnZXRvdXQoMSk7CisgICAgfQorCisjaWZkZWYgU0lHSEFTQVJHCisgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIiksCisJCQkJCQkJIHNpZ25hbF9pbmZvW2ldLm5hbWUpOworI2Vsc2UKKyAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iKSk7CisjZW5kaWYKKyAgICBwcmVzZXJ2ZV9leGl0KCk7CQkgICAgLyogcHJlc2VydmUgZmlsZXMgYW5kIGV4aXQgKi8KKworICAgIFNJR1JFVFVSTjsKK30KKworI2lmZGVmIF9SRUVOVFJBTlQKKy8qCisgKiBPbiBTb2xhcmlzIHdpdGggbXVsdGktdGhyZWFkaW5nLCBzdXNwZW5kaW5nIG1pZ2h0IG5vdCB3b3JrIGltbWVkaWF0ZWx5LgorICogQ2F0Y2ggdGhlIFNJR0NPTlQgc2lnbmFsLCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZQorICogc3VzcGVuZGluZyBoYXMgYmVlbiBkb25lIG9yIG5vdC4KKyAqLworc3RhdGljIGludCBzaWdjb250X3JlY2VpdmVkOworc3RhdGljIFJFVFNJR1RZUEUgc2lnY29udF9oYW5kbGVyIF9fQVJHUyhTSUdQUk9UT0FSRyk7CisKKy8qCisgKiBzaWduYWwgaGFuZGxlciBmb3IgU0lHQ09OVAorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBSRVRTSUdUWVBFCitzaWdjb250X2hhbmRsZXIgU0lHREVGQVJHKHNpZ2FyZykKK3sKKyAgICBzaWdjb250X3JlY2VpdmVkID0gVFJVRTsKKyAgICBTSUdSRVRVUk47Cit9CisjZW5kaWYKKworLyoKKyAqIElmIHRoZSBtYWNoaW5lIGhhcyBqb2IgY29udHJvbCwgdXNlIGl0IHRvIHN1c3BlbmQgdGhlIHByb2dyYW0sCisgKiBvdGhlcndpc2UgZmFrZSBpdCBieSBzdGFydGluZyBhIG5ldyBzaGVsbC4KKyAqLworICAgIHZvaWQKK21jaF9zdXNwZW5kKCkKK3sKKyAgICAvKiBCZU9TIGRvZXMgaGF2ZSBTSUdUU1RQLCBidXQgaXQgZG9lc24ndCB3b3JrLiAqLworI2lmIGRlZmluZWQoU0lHVFNUUCkgJiYgIWRlZmluZWQoX19CRU9TX18pCisgICAgb3V0X2ZsdXNoKCk7CSAgICAvKiBuZWVkZWQgdG8gbWFrZSBjdXJzb3IgdmlzaWJsZSBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICBzZXR0bW9kZShUTU9ERV9DT09LKTsKKyAgICBvdXRfZmx1c2goKTsJICAgIC8qIG5lZWRlZCB0byBkaXNhYmxlIG1vdXNlIG9uIHNvbWUgc3lzdGVtcyAqLworCisjIGlmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpICYmIGRlZmluZWQoRkVBVF9YMTEpCisgICAgLyogU2luY2Ugd2UgYXJlIGdvaW5nIHRvIHNsZWVwLCB3ZSBjYW4ndCByZXNwb25kIHRvIHJlcXVlc3RzIGZvciB0aGUgWAorICAgICAqIHNlbGVjdGlvbnMuICBMb3NlIHRoZW0sIG90aGVyd2lzZSBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbCBoYW5nLiAgQnV0CisgICAgICogZmlyc3QgY29weSB0aGUgdGV4dCB0byBjdXQgYnVmZmVyIDAuICovCisgICAgaWYgKGNsaXBfc3Rhci5vd25lZCB8fCBjbGlwX3BsdXMub3duZWQpCisgICAgeworCXgxMV9leHBvcnRfZmluYWxfc2VsZWN0aW9uKCk7CisJaWYgKGNsaXBfc3Rhci5vd25lZCkKKwkgICAgY2xpcF9sb3NlX3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwlpZiAoY2xpcF9wbHVzLm93bmVkKQorCSAgICBjbGlwX2xvc2Vfc2VsZWN0aW9uKCZjbGlwX3BsdXMpOworCWlmICh4MTFfZGlzcGxheSAhPSBOVUxMKQorCSAgICBYRmx1c2goeDExX2Rpc3BsYXkpOworICAgIH0KKyMgZW5kaWYKKworIyBpZmRlZiBfUkVFTlRSQU5UCisgICAgc2lnY29udF9yZWNlaXZlZCA9IEZBTFNFOworIyBlbmRpZgorICAgIGtpbGwoMCwgU0lHVFNUUCk7CSAgICAvKiBzZW5kIG91cnNlbHZlcyBhIFNUT1Agc2lnbmFsICovCisjIGlmZGVmIF9SRUVOVFJBTlQKKyAgICAvKiBXaGVuIHdlIGRpZG4ndCBzdXNwZW5kIGltbWVkaWF0ZWx5IGluIHRoZSBraWxsKCksIGRvIGl0IG5vdy4gIEhhcHBlbnMKKyAgICAgKiBvbiBtdWx0aS10aHJlYWRlZCBTb2xhcmlzLiAqLworICAgIGlmICghc2lnY29udF9yZWNlaXZlZCkKKwlwYXVzZSgpOworIyBlbmRpZgorCisjIGlmZGVmIEZFQVRfVElUTEUKKyAgICAvKgorICAgICAqIFNldCBvbGR0aXRsZSB0byBOVUxMLCBzbyB0aGUgY3VycmVudCB0aXRsZSBpcyBvYnRhaW5lZCBhZ2Fpbi4KKyAgICAgKi8KKyAgICB2aW1fZnJlZShvbGR0aXRsZSk7CisgICAgb2xkdGl0bGUgPSBOVUxMOworIyBlbmRpZgorICAgIHNldHRtb2RlKFRNT0RFX1JBVyk7CisgICAgbmVlZF9jaGVja190aW1lc3RhbXBzID0gVFJVRTsKKyAgICBkaWRfY2hlY2tfdGltZXN0YW1wcyA9IEZBTFNFOworI2Vsc2UKKyAgICBzdXNwZW5kX3NoZWxsKCk7CisjZW5kaWYKK30KKworICAgIHZvaWQKK21jaF9pbml0KCkKK3sKKyAgICBDb2x1bW5zID0gODA7CisgICAgUm93cyA9IDI0OworCisgICAgb3V0X2ZsdXNoKCk7CisgICAgc2V0X3NpZ25hbHMoKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitzZXRfc2lnbmFscygpCit7CisjaWYgZGVmaW5lZChTSUdXSU5DSCkKKyAgICAvKgorICAgICAqIFdJTkRPVyBDSEFOR0Ugc2lnbmFsIGlzIGhhbmRsZWQgd2l0aCBzaWdfd2luY2goKS4KKyAgICAgKi8KKyAgICBzaWduYWwoU0lHV0lOQ0gsIChSRVRTSUdUWVBFICgqKSgpKXNpZ193aW5jaCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2Ugd2FudCB0aGUgU1RPUCBzaWduYWwgdG8gd29yaywgdG8gbWFrZSBtY2hfc3VzcGVuZCgpIHdvcmsuCisgICAgICogRm9yICJydmltIiB0aGUgU1RPUCBzaWduYWwgaXMgaWdub3JlZC4KKyAgICAgKi8KKyNpZmRlZiBTSUdUU1RQCisgICAgc2lnbmFsKFNJR1RTVFAsIHJlc3RyaWN0ZWQgPyBTSUdfSUdOIDogU0lHX0RGTCk7CisjZW5kaWYKKyNpZmRlZiBfUkVFTlRSQU5UCisgICAgc2lnbmFsKFNJR0NPTlQsIHNpZ2NvbnRfaGFuZGxlcik7CisjZW5kaWYKKworICAgIC8qCisgICAgICogV2Ugd2FudCB0byBpZ25vcmUgYnJlYWtpbmcgb2YgUElQRXMuCisgICAgICovCisjaWZkZWYgU0lHUElQRQorICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBXZSB3YW50IHRvIGNhdGNoIENUUkwtQyAob25seSB3b3JrcyB3aGlsZSBpbiBDb29rZWQgbW9kZSkuCisgICAgICovCisjaWZkZWYgU0lHSU5UCisgICAgc2lnbmFsKFNJR0lOVCwgKFJFVFNJR1RZUEUgKCopKCkpY2F0Y2hfc2lnaW50KTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZ25vcmUgYWxhcm0gc2lnbmFscyAoUGVybCdzIGFsYXJtKCkgZ2VuZXJhdGVzIGl0KS4KKyAgICAgKi8KKyNpZmRlZiBTSUdBTFJNCisgICAgc2lnbmFsKFNJR0FMUk0sIFNJR19JR04pOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENhdGNoIFNJR1BXUiAocG93ZXIgZmFpbHVyZT8pIHRvIHByZXNlcnZlIHRoZSBzd2FwIGZpbGVzLCBzbyB0aGF0IG5vCisgICAgICogd29yayB3aWxsIGJlIGxvc3QuCisgICAgICovCisjaWZkZWYgU0lHUFdSCisgICAgc2lnbmFsKFNJR1BXUiwgKFJFVFNJR1RZUEUgKCopKCkpY2F0Y2hfc2lncHdyKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBBcnJhbmdlIGZvciBvdGhlciBzaWduYWxzIHRvIGdyYWNlZnVsbHkgc2h1dGRvd24gVmltLgorICAgICAqLworICAgIGNhdGNoX3NpZ25hbHMoZGVhdGh0cmFwLCBTSUdfRVJSKTsKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoU0lHSFVQKQorICAgIC8qCisgICAgICogV2hlbiB0aGUgR1VJIGlzIHJ1bm5pbmcsIGlnbm9yZSB0aGUgaGFuZ3VwIHNpZ25hbC4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorcmVzZXRfc2lnbmFscygpCit7CisgICAgY2F0Y2hfc2lnbmFscyhTSUdfREZMLCBTSUdfREZMKTsKKyNpZmRlZiBfUkVFTlRSQU5UCisgICAgLyogU0lHQ09OVCBpc24ndCBpbiB0aGUgbGlzdCwgYmVjYXVzZSBpdHMgZGVmYXVsdCBhY3Rpb24gaXMgaWdub3JlICovCisgICAgc2lnbmFsKFNJR0NPTlQsIFNJR19ERkwpOworI2VuZGlmCit9CisKKyAgICBzdGF0aWMgdm9pZAorY2F0Y2hfc2lnbmFscyhmdW5jX2RlYWRseSwgZnVuY19vdGhlcikKKyAgICBSRVRTSUdUWVBFICgqZnVuY19kZWFkbHkpKCk7CisgICAgUkVUU0lHVFlQRSAoKmZ1bmNfb3RoZXIpKCk7Cit7CisgICAgaW50CSAgICBpOworCisgICAgZm9yIChpID0gMDsgc2lnbmFsX2luZm9baV0uc2lnICE9IC0xOyBpKyspCisJaWYgKHNpZ25hbF9pbmZvW2ldLmRlYWRseSkKKwl7CisjaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQorCSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCisJICAgIC8qIFNldHVwIHRvIHVzZSB0aGUgYWx0ZXJuYXRlIHN0YWNrIGZvciB0aGUgc2lnbmFsIGZ1bmN0aW9uLiAqLworCSAgICBzYS5zYV9oYW5kbGVyID0gZnVuY19kZWFkbHk7CisJICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKyMgaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX1JFRU5UUkFOVCkKKwkgICAgLyogT24gTGludXgsIHdpdGggZ2xpYmMgY29tcGlsZWQgZm9yIGtlcm5lbCAyLjIsIHRoZXJlIGlzIGEgYnVnIGluCisJICAgICAqIHRocmVhZCBoYW5kbGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHVzaW5nIHRoZSBhbHRlcm5hdGUgc3RhY2s6CisJICAgICAqIHB0aHJlYWQgbGlicmFyeSBmdW5jdGlvbnMgdHJ5IHRvIHVzZSB0aGUgc3RhY2sgcG9pbnRlciB0bworCSAgICAgKiBpZGVudGlmeSB0aGUgY3VycmVudCB0aHJlYWQsIGNhdXNpbmcgYSBTRUdWIHNpZ25hbCwgd2hpY2gKKwkgICAgICogcmVjdXJzaXZlbHkgY2FsbHMgZGVhdGh0cmFwKCkgYW5kIGhhbmdzLiAqLworCSAgICBzYS5zYV9mbGFncyA9IDA7CisjIGVsc2UKKwkgICAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworIyBlbmRpZgorCSAgICBzaWdhY3Rpb24oc2lnbmFsX2luZm9baV0uc2lnLCAmc2EsIE5VTEwpOworI2Vsc2UKKyMgaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHVkVDKQorCSAgICBzdHJ1Y3Qgc2lndmVjIHN2OworCisJICAgIC8qIFNldHVwIHRvIHVzZSB0aGUgYWx0ZXJuYXRlIHN0YWNrIGZvciB0aGUgc2lnbmFsIGZ1bmN0aW9uLiAqLworCSAgICBzdi5zdl9oYW5kbGVyID0gZnVuY19kZWFkbHk7CisJICAgIHN2LnN2X21hc2sgPSAwOworCSAgICBzdi5zdl9mbGFncyA9IFNWX09OU1RBQ0s7CisJICAgIHNpZ3ZlYyhzaWduYWxfaW5mb1tpXS5zaWcsICZzdiwgTlVMTCk7CisjIGVsc2UKKwkgICAgc2lnbmFsKHNpZ25hbF9pbmZvW2ldLnNpZywgZnVuY19kZWFkbHkpOworIyBlbmRpZgorI2VuZGlmCisJfQorCWVsc2UgaWYgKGZ1bmNfb3RoZXIgIT0gU0lHX0VSUikKKwkgICAgc2lnbmFsKHNpZ25hbF9pbmZvW2ldLnNpZywgZnVuY19vdGhlcik7Cit9CisKKy8qCisgKiBDaGVja193aW4gY2hlY2tzIHdoZXRoZXIgd2UgaGF2ZSBhbiBpbnRlcmFjdGl2ZSBzdGRvdXQuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgaW50CittY2hfY2hlY2tfd2luKGFyZ2MsIGFyZ3YpCisgICAgaW50CSAgICBhcmdjOworICAgIGNoYXIgICAgKiphcmd2OworeworI2lmZGVmIE9TMgorICAgIC8qCisgICAgICogU3RvcmUgYXJndlswXSwgbWF5IGJlIHVzZWQgZm9yICRWSU0uICBPbmx5IHVzZSBpdCBpZiBpdCBpcyBhbiBhYnNvbHV0ZQorICAgICAqIG5hbWUsIG1vc3RseSBpdCdzIGp1c3QgInZpbSIgYW5kIGZvdW5kIGluIHRoZSBwYXRoLCB3aGljaCBpcyB1bnVzYWJsZS4KKyAgICAgKi8KKyAgICBpZiAobWNoX2lzRnVsbE5hbWUoYXJndlswXSkpCisJZXhlX25hbWUgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopYXJndlswXSk7CisjZW5kaWYKKyAgICBpZiAoaXNhdHR5KDEpKQorCXJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBpbnB1dCBjb21lcyBmcm9tIGEgdGVybWluYWwsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIGludAorbWNoX2lucHV0X2lzYXR0eSgpCit7CisgICAgaWYgKGlzYXR0eShyZWFkX2NtZF9mZCkpCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgRkVBVF9YMTEKKworIyBpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkgXAorCSYmIChkZWZpbmVkKEZFQVRfWENMSVBCT0FSRCkgfHwgZGVmaW5lZChGRUFUX1RJVExFKSkKKworc3RhdGljIHZvaWQgeG9wZW5fbWVzc2FnZSBfX0FSR1MoKHN0cnVjdCB0aW1ldmFsICp0dnApKTsKKworLyoKKyAqIEdpdmUgYSBtZXNzYWdlIGFib3V0IHRoZSBlbGFwc2VkIHRpbWUgZm9yIG9wZW5pbmcgdGhlIFggd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKK3hvcGVuX21lc3NhZ2UodHZwKQorICAgIHN0cnVjdCB0aW1ldmFsICp0dnA7CS8qIG11c3QgY29udGFpbiBzdGFydCB0aW1lICovCit7CisgICAgc3RydWN0IHRpbWV2YWwgIGVuZF90djsKKworICAgIC8qIENvbXB1dGUgZWxhcHNlZCB0aW1lLiAqLworICAgIGdldHRpbWVvZmRheSgmZW5kX3R2LCBOVUxMKTsKKyAgICBzbXNnKChjaGFyX3UgKilfKCJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIpLAorCSAgICAoZW5kX3R2LnR2X3NlYyAtIHR2cC0+dHZfc2VjKSAqIDEwMDBMCisJICAgICsgKGVuZF90di50dl91c2VjIC0gdHZwLT50dl91c2VjKSAvIDEwMDBMKTsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1gxMSkgJiYgKGRlZmluZWQoRkVBVF9USVRMRSkgfHwgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpKQorLyoKKyAqIEEgZmV3IGZ1bmN0aW9ucyBzaGFyZWQgYnkgWDExIHRpdGxlIGFuZCBjbGlwYm9hcmQgY29kZS4KKyAqLworc3RhdGljIGludCB4X2Vycm9yX2hhbmRsZXIgX19BUkdTKChEaXNwbGF5ICpkcHksIFhFcnJvckV2ZW50ICplcnJvcl9ldmVudCkpOworc3RhdGljIGludCB4X2Vycm9yX2NoZWNrIF9fQVJHUygoRGlzcGxheSAqZHB5LCBYRXJyb3JFdmVudCAqZXJyb3JfZXZlbnQpKTsKK3N0YXRpYyBpbnQgeF9jb25uZWN0X3RvX3NlcnZlciBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgdGVzdF94MTFfd2luZG93IF9fQVJHUygoRGlzcGxheSAqZHB5KSk7CisKK3N0YXRpYyBpbnQJZ290X3hfZXJyb3IgPSBGQUxTRTsKKworLyoKKyAqIFggRXJyb3IgaGFuZGxlciwgb3RoZXJ3aXNlIFgganVzdCBleGl0cyEgICh2ZXJ5IHJ1ZGUpIC0tIHdlYmIKKyAqLworICAgIHN0YXRpYyBpbnQKK3hfZXJyb3JfaGFuZGxlcihkcHksIGVycm9yX2V2ZW50KQorICAgIERpc3BsYXkJKmRweTsKKyAgICBYRXJyb3JFdmVudAkqZXJyb3JfZXZlbnQ7Cit7CisgICAgWEdldEVycm9yVGV4dChkcHksIGVycm9yX2V2ZW50LT5lcnJvcl9jb2RlLCAoY2hhciAqKUlPYnVmZiwgSU9TSVpFKTsKKyAgICBTVFJDQVQoSU9idWZmLCBfKCJcblZpbTogR290IFggZXJyb3JcbiIpKTsKKworICAgIC8qIFdlIGNhbm5vdCBwcmludCBhIG1lc3NhZ2UgYW5kIGNvbnRpbnVlLCBiZWNhdXNlIG5vIFggY2FsbHMgYXJlIGFsbG93ZWQKKyAgICAgKiBoZXJlIChjYXVzZXMgbXkgc3lzdGVtIHRvIGhhbmcpLiAgU2lsZW50bHkgY29udGludWluZyBtaWdodCBiZSBhbgorICAgICAqIGFsdGVybmF0aXZlLi4uICovCisgICAgcHJlc2VydmVfZXhpdCgpOwkJICAgIC8qIHByZXNlcnZlIGZpbGVzIGFuZCBleGl0ICovCisKKyAgICByZXR1cm4gMDsJCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIEFub3RoZXIgWCBFcnJvciBoYW5kbGVyLCBqdXN0IHVzZWQgdG8gY2hlY2sgZm9yIGVycm9ycy4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgaW50Cit4X2Vycm9yX2NoZWNrKGRweSwgZXJyb3JfZXZlbnQpCisgICAgRGlzcGxheSAqZHB5OworICAgIFhFcnJvckV2ZW50CSplcnJvcl9ldmVudDsKK3sKKyAgICBnb3RfeF9lcnJvciA9IFRSVUU7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfWDExKSAmJiBkZWZpbmVkKEZFQVRfWENMSVBCT0FSRCkKKyMgaWYgZGVmaW5lZChIQVZFX1NFVEpNUF9IKQorLyoKKyAqIEFuIFggSU8gRXJyb3IgaGFuZGxlciwgdXNlZCB0byBjYXRjaCBlcnJvciB3aGlsZSBvcGVuaW5nIHRoZSBkaXNwbGF5LgorICovCitzdGF0aWMgaW50IHhfSU9lcnJvcl9jaGVjayBfX0FSR1MoKERpc3BsYXkgKmRweSkpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyBpbnQKK3hfSU9lcnJvcl9jaGVjayhkcHkpCisgICAgRGlzcGxheSAqZHB5OworeworICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCByZXR1cm4sIGl0IGNhdXNlcyBleGl0KCkuICBMb25nanVtcCBpbnN0ZWFkLiAqLworICAgIExPTkdKTVAobGNfanVtcF9lbnYsIDEpOworICAgIC8qTk9UUkVBQ0hFRCovCisgICAgcmV0dXJuIDA7Cit9CisjIGVuZGlmCisKKy8qCisgKiBBbiBYIElPIEVycm9yIGhhbmRsZXIsIHVzZWQgdG8gY2F0Y2ggdGVybWluYWwgZXJyb3JzLgorICovCitzdGF0aWMgaW50IHhfSU9lcnJvcl9oYW5kbGVyIF9fQVJHUygoRGlzcGxheSAqZHB5KSk7CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIGludAoreF9JT2Vycm9yX2hhbmRsZXIoZHB5KQorICAgIERpc3BsYXkgKmRweTsKK3sKKyAgICB4dGVybV9kcHkgPSBOVUxMOworICAgIHgxMV93aW5kb3cgPSAwOworICAgIHgxMV9kaXNwbGF5ID0gTlVMTDsKKyAgICB4dGVybV9TaGVsbCA9IChXaWRnZXQpMDsKKworICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCByZXR1cm4sIGl0IGNhdXNlcyBleGl0KCkuICBMb25nanVtcCBpbnN0ZWFkLiAqLworICAgIExPTkdKTVAoeF9qdW1wX2VudiwgMSk7CisgICAgLypOT1RSRUFDSEVEKi8KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlciBpcyBkZXNpcmVkLgorICovCisgICAgc3RhdGljIGludAoreF9jb25uZWN0X3RvX3NlcnZlcigpCit7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKworI2lmIGRlZmluZWQoRkVBVF9DTElFTlRTRVJWRVIpCisgICAgaWYgKHhfZm9yY2VfY29ubmVjdCkKKwlyZXR1cm4gVFJVRTsKKyNlbmRpZgorICAgIGlmICh4X25vX2Nvbm5lY3QpCisJcmV0dXJuIEZBTFNFOworCisgICAgLyogQ2hlY2sgZm9yIGEgbWF0Y2ggd2l0aCAiZXhjbHVkZToiIGZyb20gJ2NsaXBib2FyZCcuICovCisgICAgaWYgKGNsaXBfZXhjbHVkZV9wcm9nICE9IE5VTEwpCisgICAgeworCXJlZ21hdGNoLnJtX2ljID0gRkFMU0U7CQkvKiBEb24ndCBpZ25vcmUgY2FzZSAqLworCXJlZ21hdGNoLnJlZ3Byb2cgPSBjbGlwX2V4Y2x1ZGVfcHJvZzsKKwlpZiAodmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBUX05BTUUsIChjb2xucl9UKTApKQorCSAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogVGVzdCBpZiAiZHB5IiBhbmQgeDExX3dpbmRvdyBhcmUgdmFsaWQgYnkgZ2V0dGluZyB0aGUgd2luZG93IHRpdGxlLgorICogSSBkb24ndCBhY3R1YWxseSB3YW50IGl0IHlldCwgc28gdGhlcmUgbWF5IGJlIGEgc2ltcGxlciBjYWxsIHRvIHVzZSwgYnV0CisgKiB0aGlzIHdpbGwgY2F1c2UgdGhlIGVycm9yIGhhbmRsZXIgeF9lcnJvcl9jaGVjaygpIHRvIGJlIGNhbGxlZCBpZiBhbnl0aGluZworICogaXMgd3JvbmcsIHN1Y2ggYXMgdGhlIHdpbmRvdyBwb2ludGVyIGJlaW5nIGludmFsaWQgKGFzIGNhbiBoYXBwZW4gd2hlbiB0aGUKKyAqIHVzZXIgY2hhbmdlcyBoaXMgRElTUExBWSwgYnV0IG5vdCBoaXMgV0lORE9XSUQpIC0tIHdlYmIKKyAqLworICAgIHN0YXRpYyBpbnQKK3Rlc3RfeDExX3dpbmRvdyhkcHkpCisgICAgRGlzcGxheQkqZHB5OworeworICAgIGludAkJCSgqb2xkX2hhbmRsZXIpKCk7CisgICAgWFRleHRQcm9wZXJ0eQl0ZXh0X3Byb3A7CisKKyAgICBvbGRfaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIoeF9lcnJvcl9jaGVjayk7CisgICAgZ290X3hfZXJyb3IgPSBGQUxTRTsKKyAgICBpZiAoWEdldFdNTmFtZShkcHksIHgxMV93aW5kb3csICZ0ZXh0X3Byb3ApKQorCVhGcmVlKCh2b2lkICopdGV4dF9wcm9wLnZhbHVlKTsKKyAgICBYU3luYyhkcHksIEZhbHNlKTsKKyAgICAodm9pZClYU2V0RXJyb3JIYW5kbGVyKG9sZF9oYW5kbGVyKTsKKworICAgIGlmIChwX3ZlcmJvc2UgPiAwICYmIGdvdF94X2Vycm9yKQorCU1TRyhfKCJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIikpOworCisgICAgcmV0dXJuIChnb3RfeF9lcnJvciA/IEZBSUwgOiBPSyk7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVElUTEUKKworI2lmZGVmIEZFQVRfWDExCisKK3N0YXRpYyBpbnQgZ2V0X3gxMV90aGluZyBfX0FSR1MoKGludCBnZXRfdGl0bGUsIGludCB0ZXN0X29ubHkpKTsKKworLyoKKyAqIHRyeSB0byBnZXQgeDExIHdpbmRvdyBhbmQgZGlzcGxheQorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF94MTFfd2luZGlzKCkKK3sKKyAgICBjaGFyCSAgICAqd2luaWQ7CisgICAgc3RhdGljIGludAkgICAgcmVzdWx0ID0gLTE7CisjZGVmaW5lIFhEX05PTkUJIDAJLyogeDExX2Rpc3BsYXkgbm90IHNldCBoZXJlICovCisjZGVmaW5lIFhEX0hFUkUJIDEJLyogeDExX2Rpc3BsYXkgb3BlbmVkIGhlcmUgKi8KKyNkZWZpbmUgWERfR1VJCSAyCS8qIHgxMV9kaXNwbGF5IHVzZWQgZnJvbSBndWkuZHB5ICovCisjZGVmaW5lIFhEX1hURVJNIDMJLyogeDExX2Rpc3BsYXkgdXNlZCBmcm9tIHh0ZXJtX2RweSAqLworICAgIHN0YXRpYyBpbnQJICAgIHgxMV9kaXNwbGF5X2Zyb20gPSBYRF9OT05FOworICAgIHN0YXRpYyBpbnQJICAgIGRpZF9zZXRfZXJyb3JfaGFuZGxlciA9IEZBTFNFOworCisgICAgaWYgKCFkaWRfc2V0X2Vycm9yX2hhbmRsZXIpCisgICAgeworCS8qIFgganVzdCBleGl0cyBpZiBpdCBmaW5kcyBhbiBlcnJvciBvdGhlcndpc2UhICovCisJKHZvaWQpWFNldEVycm9ySGFuZGxlcih4X2Vycm9yX2hhbmRsZXIpOworCWRpZF9zZXRfZXJyb3JfaGFuZGxlciA9IFRSVUU7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKQorICAgIGlmIChndWkuaW5fdXNlKQorICAgIHsKKwkvKgorCSAqIElmIHRoZSBYMTEgZGlzcGxheSB3YXMgb3BlbmVkIGhlcmUgYmVmb3JlLCBmb3IgdGhlIHdpbmRvdyB3aGVyZSBWaW0KKwkgKiB3YXMgc3RhcnRlZCwgY2xvc2UgdGhhdCBvbmUgbm93IHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCisJICovCisJaWYgKHgxMV9kaXNwbGF5X2Zyb20gPT0gWERfSEVSRSAmJiB4MTFfZGlzcGxheSAhPSBOVUxMKQorCXsKKwkgICAgWENsb3NlRGlzcGxheSh4MTFfZGlzcGxheSk7CisJICAgIHgxMV9kaXNwbGF5X2Zyb20gPSBYRF9OT05FOworCX0KKwlpZiAoZ3VpX2dldF94MTFfd2luZGlzKCZ4MTFfd2luZG93LCAmeDExX2Rpc3BsYXkpID09IE9LKQorCXsKKwkgICAgeDExX2Rpc3BsYXlfZnJvbSA9IFhEX0dVSTsKKwkgICAgcmV0dXJuIE9LOworCX0KKwl4MTFfZGlzcGxheSA9IE5VTEw7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIGVsc2UgaWYgKHgxMV9kaXNwbGF5X2Zyb20gPT0gWERfR1VJKQorICAgIHsKKwkvKiBHVUkgbXVzdCBoYXZlIHN0b3BwZWQgc29tZWhvdywgY2xlYXIgeDExX2Rpc3BsYXkgKi8KKwl4MTFfd2luZG93ID0gMDsKKwl4MTFfZGlzcGxheSA9IE5VTEw7CisJeDExX2Rpc3BsYXlfZnJvbSA9IFhEX05PTkU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBXaGVuIHN0YXJ0ZWQgd2l0aCB0aGUgIi1YIiBhcmd1bWVudCwgZG9uJ3QgdHJ5IGNvbm5lY3RpbmcuICovCisgICAgaWYgKCF4X2Nvbm5lY3RfdG9fc2VydmVyKCkpCisJcmV0dXJuIEZBSUw7CisKKyAgICAvKgorICAgICAqIElmIFdJTkRPV0lEIG5vdCBzZXQsIHNob3VsZCB0cnkgYW5vdGhlciBtZXRob2QgdG8gZmluZCBvdXQKKyAgICAgKiB3aGF0IHRoZSBjdXJyZW50IHdpbmRvdyBudW1iZXIgaXMuIFRoZSBvbmx5IGNvZGUgSSBrbm93IGZvcgorICAgICAqIHRoaXMgaXMgdmVyeSBjb21wbGljYXRlZC4KKyAgICAgKiBXZSBhc3N1bWUgdGhhdCB6ZXJvIGlzIGludmFsaWQgZm9yIFdJTkRPV0lELgorICAgICAqLworICAgIGlmICh4MTFfd2luZG93ID09IDAgJiYgKHdpbmlkID0gZ2V0ZW52KCJXSU5ET1dJRCIpKSAhPSBOVUxMKQorCXgxMV93aW5kb3cgPSAoV2luZG93KWF0b2wod2luaWQpOworCisjaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisgICAgaWYgKHh0ZXJtX2RweSAhPSBOVUxMICYmIHgxMV93aW5kb3cgIT0gMCkKKyAgICB7CisJLyogQ2hlY2tlZCBpdCBhbHJlYWR5LiAqLworCWlmICh4MTFfZGlzcGxheV9mcm9tID09IFhEX1hURVJNKQorCSAgICByZXR1cm4gT0s7CisKKwkvKgorCSAqIElmIHRoZSBYMTEgZGlzcGxheSB3YXMgb3BlbmVkIGhlcmUgYmVmb3JlLCBmb3IgdGhlIHdpbmRvdyB3aGVyZSBWaW0KKwkgKiB3YXMgc3RhcnRlZCwgY2xvc2UgdGhhdCBvbmUgbm93IHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCisJICovCisJaWYgKHgxMV9kaXNwbGF5X2Zyb20gPT0gWERfSEVSRSAmJiB4MTFfZGlzcGxheSAhPSBOVUxMKQorCSAgICBYQ2xvc2VEaXNwbGF5KHgxMV9kaXNwbGF5KTsKKwl4MTFfZGlzcGxheSA9IHh0ZXJtX2RweTsKKwl4MTFfZGlzcGxheV9mcm9tID0gWERfWFRFUk07CisJaWYgKHRlc3RfeDExX3dpbmRvdyh4MTFfZGlzcGxheSkgPT0gRkFJTCkKKwl7CisJICAgIC8qIHByb2JhYmx5IGJhZCAkV0lORE9XSUQgKi8KKwkgICAgeDExX3dpbmRvdyA9IDA7CisJICAgIHgxMV9kaXNwbGF5ID0gTlVMTDsKKwkgICAgeDExX2Rpc3BsYXlfZnJvbSA9IFhEX05PTkU7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlyZXR1cm4gT0s7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoeDExX3dpbmRvdyA9PSAwIHx8IHgxMV9kaXNwbGF5ID09IE5VTEwpCisJcmVzdWx0ID0gLTE7CisKKyAgICBpZiAocmVzdWx0ICE9IC0xKQkgICAgLyogSGF2ZSBhbHJlYWR5IGJlZW4gaGVyZSBhbmQgc2V0IHRoaXMgKi8KKwlyZXR1cm4gcmVzdWx0OwkgICAgLyogRG9uJ3QgZG8gYWxsIHRoZXNlIFggY2FsbHMgYWdhaW4gKi8KKworICAgIGlmICh4MTFfd2luZG93ICE9IDAgJiYgeDExX2Rpc3BsYXkgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgU0VUX1NJR19BTEFSTQorCVJFVFNJR1RZUEUgKCpzaWdfc2F2ZSkoKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQorCXN0cnVjdCB0aW1ldmFsICBzdGFydF90djsKKworCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0X3R2LCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgU0VUX1NJR19BTEFSTQorCS8qCisJICogT3BlbmluZyB0aGUgRGlzcGxheSBtYXkgaGFuZyBpZiB0aGUgRElTUExBWSBzZXR0aW5nIGlzIHdyb25nLCBvcgorCSAqIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgYmFkLiAgU2V0IGFuIGFsYXJtIHRpbWVyIHRvIGdldCBvdXQuCisJICovCisJc2lnX2FsYXJtX2NhbGxlZCA9IEZBTFNFOworCXNpZ19zYXZlID0gKFJFVFNJR1RZUEUgKCopKCkpc2lnbmFsKFNJR0FMUk0sCisJCQkJCQkgKFJFVFNJR1RZUEUgKCopKCkpc2lnX2FsYXJtKTsKKwlhbGFybSgyKTsKKyNlbmRpZgorCXgxMV9kaXNwbGF5ID0gWE9wZW5EaXNwbGF5KE5VTEwpOworCisjaWZkZWYgU0VUX1NJR19BTEFSTQorCWFsYXJtKDApOworCXNpZ25hbChTSUdBTFJNLCAoUkVUU0lHVFlQRSAoKikoKSlzaWdfc2F2ZSk7CisJaWYgKHBfdmVyYm9zZSA+IDAgJiYgc2lnX2FsYXJtX2NhbGxlZCkKKwkgICAgTVNHKF8oIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiKSk7CisjZW5kaWYKKwlpZiAoeDExX2Rpc3BsYXkgIT0gTlVMTCkKKwl7CisjIGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQorCSAgICBpZiAocF92ZXJib3NlID4gMCkKKwkJeG9wZW5fbWVzc2FnZSgmc3RhcnRfdHYpOworIyBlbmRpZgorCSAgICBpZiAodGVzdF94MTFfd2luZG93KHgxMV9kaXNwbGF5KSA9PSBGQUlMKQorCSAgICB7CisJCS8qIE1heWJlIHdpbmRvdyBpZCBpcyBiYWQgKi8KKwkJeDExX3dpbmRvdyA9IDA7CisJCVhDbG9zZURpc3BsYXkoeDExX2Rpc3BsYXkpOworCQl4MTFfZGlzcGxheSA9IE5VTEw7CisJICAgIH0KKwkgICAgZWxzZQorCQl4MTFfZGlzcGxheV9mcm9tID0gWERfSEVSRTsKKwl9CisgICAgfQorICAgIGlmICh4MTFfd2luZG93ID09IDAgfHwgeDExX2Rpc3BsYXkgPT0gTlVMTCkKKwlyZXR1cm4gKHJlc3VsdCA9IEZBSUwpOworICAgIHJldHVybiAocmVzdWx0ID0gT0spOworfQorCisvKgorICogRGV0ZXJtaW5lIG9yaWdpbmFsIHgxMSBXaW5kb3cgVGl0bGUKKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF94MTFfdGl0bGUodGVzdF9vbmx5KQorICAgIGludAkJdGVzdF9vbmx5OworeworICAgIGludAkJcmV0dmFsOworCisgICAgcmV0dmFsID0gZ2V0X3gxMV90aGluZyhUUlVFLCB0ZXN0X29ubHkpOworCisgICAgLyogY291bGQgbm90IGdldCBvbGQgdGl0bGU6IG9sZHRpdGxlID09IE5VTEwgKi8KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgb3JpZ2luYWwgeDExIFdpbmRvdyBpY29uCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfeDExX2ljb24odGVzdF9vbmx5KQorICAgIGludAkJdGVzdF9vbmx5OworeworICAgIGludAkJcmV0dmFsID0gRkFMU0U7CisKKyAgICByZXR2YWwgPSBnZXRfeDExX3RoaW5nKEZBTFNFLCB0ZXN0X29ubHkpOworCisgICAgLyogY291bGQgbm90IGdldCBvbGQgaWNvbiwgdXNlIHRlcm1pbmFsIG5hbWUgKi8KKyAgICBpZiAob2xkaWNvbiA9PSBOVUxMICYmICF0ZXN0X29ubHkpCisgICAgeworCWlmIChTVFJOQ01QKFRfTkFNRSwgImJ1aWx0aW5fIiwgOCkgPT0gMCkKKwkgICAgb2xkaWNvbiA9IFRfTkFNRSArIDg7CisJZWxzZQorCSAgICBvbGRpY29uID0gVF9OQU1FOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyAgICBzdGF0aWMgaW50CitnZXRfeDExX3RoaW5nKGdldF90aXRsZSwgdGVzdF9vbmx5KQorICAgIGludAkJZ2V0X3RpdGxlOwkvKiBnZXQgdGl0bGUgc3RyaW5nICovCisgICAgaW50CQl0ZXN0X29ubHk7Cit7CisgICAgWFRleHRQcm9wZXJ0eQl0ZXh0X3Byb3A7CisgICAgaW50CQkJcmV0dmFsID0gRkFMU0U7CisgICAgU3RhdHVzCQlzdGF0dXM7CisKKyAgICBpZiAoZ2V0X3gxMV93aW5kaXMoKSA9PSBPSykKKyAgICB7CisJLyogR2V0IHdpbmRvdy9pY29uIG5hbWUgaWYgYW55ICovCisJaWYgKGdldF90aXRsZSkKKwkgICAgc3RhdHVzID0gWEdldFdNTmFtZSh4MTFfZGlzcGxheSwgeDExX3dpbmRvdywgJnRleHRfcHJvcCk7CisJZWxzZQorCSAgICBzdGF0dXMgPSBYR2V0V01JY29uTmFtZSh4MTFfZGlzcGxheSwgeDExX3dpbmRvdywgJnRleHRfcHJvcCk7CisKKwkvKgorCSAqIElmIHRlcm1pbmFsIGlzIHh0ZXJtLCB0aGVuIHgxMV93aW5kb3cgbWF5IGJlIGEgY2hpbGQgd2luZG93IG9mIHRoZQorCSAqIG91dGVyIHh0ZXJtIHdpbmRvdyB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSB3aW5kb3cvaWNvbiBuYW1lLCBzbworCSAqIGtlZXAgdHJhdmVyc2luZyB1cCB0aGUgdHJlZSB1bnRpbCBhIHdpbmRvdyB3aXRoIGEgdGl0bGUvaWNvbiBpcworCSAqIGZvdW5kLgorCSAqLworCS8qIFByZXZpb3VzbHkgdGhpcyB3YXMgb25seSBkb25lIGZvciB4dGVybSBhbmQgYWxpa2VzLiAgSSBkb24ndCBzZWUgYQorCSAqIHJlYXNvbiB3aHkgaXQgd291bGQgZmFpbCBmb3Igb3RoZXIgdGVybWluYWwgZW11bGF0b3JzLgorCSAqIGlmICh0ZXJtX2lzX3h0ZXJtKSAqLworCXsKKwkgICAgV2luZG93CSAgICByb290OworCSAgICBXaW5kb3cJICAgIHBhcmVudDsKKwkgICAgV2luZG93CSAgICB3aW4gPSB4MTFfd2luZG93OworCSAgICBXaW5kb3cJICAgKmNoaWxkcmVuOworCSAgICB1bnNpZ25lZCBpbnQgICAgbnVtX2NoaWxkcmVuOworCisJICAgIHdoaWxlICghc3RhdHVzIHx8IHRleHRfcHJvcC52YWx1ZSA9PSBOVUxMKQorCSAgICB7CisJCWlmICghWFF1ZXJ5VHJlZSh4MTFfZGlzcGxheSwgd2luLCAmcm9vdCwgJnBhcmVudCwgJmNoaWxkcmVuLAorCQkJCQkJCSAgICAgICAmbnVtX2NoaWxkcmVuKSkKKwkJICAgIGJyZWFrOworCQlpZiAoY2hpbGRyZW4pCisJCSAgICBYRnJlZSgodm9pZCAqKWNoaWxkcmVuKTsKKwkJaWYgKHBhcmVudCA9PSByb290IHx8IHBhcmVudCA9PSAwKQorCQkgICAgYnJlYWs7CisKKwkJd2luID0gcGFyZW50OworCQlpZiAoZ2V0X3RpdGxlKQorCQkgICAgc3RhdHVzID0gWEdldFdNTmFtZSh4MTFfZGlzcGxheSwgd2luLCAmdGV4dF9wcm9wKTsKKwkJZWxzZQorCQkgICAgc3RhdHVzID0gWEdldFdNSWNvbk5hbWUoeDExX2Rpc3BsYXksIHdpbiwgJnRleHRfcHJvcCk7CisJICAgIH0KKwl9CisJaWYgKHN0YXR1cyAmJiB0ZXh0X3Byb3AudmFsdWUgIT0gTlVMTCkKKwl7CisJICAgIHJldHZhbCA9IFRSVUU7CisJICAgIGlmICghdGVzdF9vbmx5KQorCSAgICB7CisjaWZkZWYgRkVBVF9YRk9OVFNFVAorCQlpZiAodGV4dF9wcm9wLmVuY29kaW5nID09IFhBX1NUUklORykKKwkJeworI2VuZGlmCisJCSAgICBpZiAoZ2V0X3RpdGxlKQorCQkJb2xkdGl0bGUgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopdGV4dF9wcm9wLnZhbHVlKTsKKwkJICAgIGVsc2UKKwkJCW9sZGljb24gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopdGV4dF9wcm9wLnZhbHVlKTsKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBjaGFyICAgICoqY2w7CisJCSAgICBTdGF0dXMgIHRyYW5zZm9ybV9zdGF0dXM7CisJCSAgICBpbnQJICAgIG4gPSAwOworCisJCSAgICB0cmFuc2Zvcm1fc3RhdHVzID0gWG1iVGV4dFByb3BlcnR5VG9UZXh0TGlzdCh4MTFfZGlzcGxheSwKKwkJCQkJCQkJICZ0ZXh0X3Byb3AsCisJCQkJCQkJCSAmY2wsICZuKTsKKwkJICAgIGlmICh0cmFuc2Zvcm1fc3RhdHVzID49IFN1Y2Nlc3MgJiYgbiA+IDAgJiYgY2xbMF0pCisJCSAgICB7CisJCQlpZiAoZ2V0X3RpdGxlKQorCQkJICAgIG9sZHRpdGxlID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKSBjbFswXSk7CisJCQllbHNlCisJCQkgICAgb2xkaWNvbiA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKikgY2xbMF0pOworCQkJWEZyZWVTdHJpbmdMaXN0KGNsKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChnZXRfdGl0bGUpCisJCQkgICAgb2xkdGl0bGUgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopdGV4dF9wcm9wLnZhbHVlKTsKKwkJCWVsc2UKKwkJCSAgICBvbGRpY29uID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKXRleHRfcHJvcC52YWx1ZSk7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCSAgICB9CisJICAgIFhGcmVlKCh2b2lkICopdGV4dF9wcm9wLnZhbHVlKTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIEFyZSBYdXRmOCBmdW5jdGlvbnMgYXZhaWxhYmxlPyAgQXZvaWQgZXJyb3IgZnJvbSBvbGQgY29tcGlsZXJzLiAqLworI2lmIGRlZmluZWQoWF9IQVZFX1VURjhfU1RSSU5HKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCisjIGlmIFhfSEFWRV9VVEY4X1NUUklORworIyAgZGVmaW5lIFVTRV9VVEY4X1NUUklORworIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBTZXQgeDExIFdpbmRvdyBUaXRsZQorICoKKyAqIGdldF94MTFfd2luZGlzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgYW5kIGhhdmUgcmV0dXJuZWQgT0sKKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfeDExX3RpdGxlKHRpdGxlKQorICAgIGNoYXJfdQkqdGl0bGU7Cit7CisJLyogWG1iU2V0V01Qcm9wZXJ0aWVzKCkgYW5kIFh1dGY4U2V0V01Qcm9wZXJ0aWVzKCkgc2hvdWxkIHVzZSBhIFNUUklORworCSAqIHdoZW4gcG9zc2libGUsIENPTVBPVU5EX1RFWFQgb3RoZXJ3aXNlLiAgQ09NUE9VTkRfVEVYVCBpc24ndAorCSAqIHN1cHBvcnRlZCBldmVyeXdoZXJlIGFuZCBTVFJJTkcgZG9lc24ndCB3b3JrIGZvciBtdWx0aS1ieXRlIHRpdGxlcy4KKwkgKi8KKyNpZmRlZiBVU0VfVVRGOF9TVFJJTkcKKyAgICBpZiAoZW5jX3V0ZjgpCisJWHV0ZjhTZXRXTVByb3BlcnRpZXMoeDExX2Rpc3BsYXksIHgxMV93aW5kb3csIChjb25zdCBjaGFyICopdGl0bGUsCisJCQkJCSAgICAgTlVMTCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworI2lmIFh0U3BlY2lmaWNhdGlvblJlbGVhc2UgPj0gNAorIyBpZmRlZiBGRUFUX1hGT05UU0VUCisJWG1iU2V0V01Qcm9wZXJ0aWVzKHgxMV9kaXNwbGF5LCB4MTFfd2luZG93LCAoY29uc3QgY2hhciAqKXRpdGxlLAorCQkJCQkgICAgIE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworIyBlbHNlCisJWFRleHRQcm9wZXJ0eQl0ZXh0X3Byb3A7CisKKwkvKiBkaXJlY3RseSBmcm9tIGV4YW1wbGUgMy0xOCAiYmFzaWN3aW4iIG9mIFhsaWIgUHJvZ3JhbW1pbmcgTWFudWFsICovCisJKHZvaWQpWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgoY2hhciAqKikmdGl0bGUsIDEsICZ0ZXh0X3Byb3ApOworCVhTZXRXTVByb3BlcnRpZXMoeDExX2Rpc3BsYXksIHgxMV93aW5kb3csICZ0ZXh0X3Byb3AsCisJCQkJCSAgICAgTlVMTCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjIGVuZGlmCisjZWxzZQorCVhTdG9yZU5hbWUoeDExX2Rpc3BsYXksIHgxMV93aW5kb3csIChjaGFyICopdGl0bGUpOworI2VuZGlmCisgICAgfQorICAgIFhGbHVzaCh4MTFfZGlzcGxheSk7Cit9CisKKy8qCisgKiBTZXQgeDExIFdpbmRvdyBpY29uCisgKgorICogZ2V0X3gxMV93aW5kaXMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBhbmQgaGF2ZSByZXR1cm5lZCBPSworICovCisgICAgc3RhdGljIHZvaWQKK3NldF94MTFfaWNvbihpY29uKQorICAgIGNoYXJfdQkqaWNvbjsKK3sKKyAgICAvKiBTZWUgYWJvdmUgZm9yIGNvbW1lbnRzIGFib3V0IHVzaW5nIFgqU2V0V01Qcm9wZXJ0aWVzKCkuICovCisjaWZkZWYgVVNFX1VURjhfU1RSSU5HCisgICAgaWYgKGVuY191dGY4KQorCVh1dGY4U2V0V01Qcm9wZXJ0aWVzKHgxMV9kaXNwbGF5LCB4MTFfd2luZG93LCBOVUxMLCAoY29uc3QgY2hhciAqKWljb24sCisJCQkJCQkgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisjaWYgWHRTcGVjaWZpY2F0aW9uUmVsZWFzZSA+PSA0CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlYbWJTZXRXTVByb3BlcnRpZXMoeDExX2Rpc3BsYXksIHgxMV93aW5kb3csIE5VTEwsIChjb25zdCBjaGFyICopaWNvbiwKKwkJCQkJCSAgIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworIyBlbHNlCisJWFRleHRQcm9wZXJ0eQl0ZXh0X3Byb3A7CisKKwkodm9pZClYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KChjaGFyICoqKSZpY29uLCAxLCAmdGV4dF9wcm9wKTsKKwlYU2V0V01Qcm9wZXJ0aWVzKHgxMV9kaXNwbGF5LCB4MTFfd2luZG93LCBOVUxMLCAmdGV4dF9wcm9wLAorCQkJCQkJICAgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjIGVuZGlmCisjZWxzZQorCVhTZXRJY29uTmFtZSh4MTFfZGlzcGxheSwgeDExX3dpbmRvdywgKGNoYXIgKilpY29uKTsKKyNlbmRpZgorICAgIH0KKyAgICBYRmx1c2goeDExX2Rpc3BsYXkpOworfQorCisjZWxzZSAgLyogRkVBVF9YMTEgKi8KKworLypBUkdTVVNFRCovCisgICAgc3RhdGljIGludAorZ2V0X3gxMV90aXRsZSh0ZXN0X29ubHkpCisgICAgaW50CSAgICB0ZXN0X29ubHk7Cit7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisgICAgc3RhdGljIGludAorZ2V0X3gxMV9pY29uKHRlc3Rfb25seSkKKyAgICBpbnQJICAgIHRlc3Rfb25seTsKK3sKKyAgICBpZiAoIXRlc3Rfb25seSkKKyAgICB7CisJaWYgKFNUUk5DTVAoVF9OQU1FLCAiYnVpbHRpbl8iLCA4KSA9PSAwKQorCSAgICBvbGRpY29uID0gVF9OQU1FICsgODsKKwllbHNlCisJICAgIG9sZGljb24gPSBUX05BTUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIEZFQVRfWDExICovCisKKyAgICBpbnQKK21jaF9jYW5fcmVzdG9yZV90aXRsZSgpCit7CisgICAgcmV0dXJuIGdldF94MTFfdGl0bGUoVFJVRSk7Cit9CisKKyAgICBpbnQKK21jaF9jYW5fcmVzdG9yZV9pY29uKCkKK3sKKyAgICByZXR1cm4gZ2V0X3gxMV9pY29uKFRSVUUpOworfQorCisvKgorICogU2V0IHRoZSB3aW5kb3cgdGl0bGUgYW5kIGljb24uCisgKi8KKyAgICB2b2lkCittY2hfc2V0dGl0bGUodGl0bGUsIGljb24pCisgICAgY2hhcl91ICp0aXRsZTsKKyAgICBjaGFyX3UgKmljb247Cit7CisgICAgaW50CQl0eXBlID0gMDsKKyAgICBzdGF0aWMgaW50CXJlY3Vyc2l2ZSA9IDA7CisKKyAgICBpZiAoVF9OQU1FID09IE5VTEwpCSAgICAvKiBubyB0ZXJtaW5hbCBuYW1lICh5ZXQpICovCisJcmV0dXJuOworICAgIGlmICh0aXRsZSA9PSBOVUxMICYmIGljb24gPT0gTlVMTCkJICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisKKyAgICAvKiBXaGVuIG9uZSBvZiB0aGUgWDExIGZ1bmN0aW9ucyBjYXVzZXMgYSBkZWFkbHkgc2lnbmFsLCB3ZSBnZXQgaGVyZSBhZ2FpbgorICAgICAqIHJlY3Vyc2l2ZWx5LiAgQXZvaWQgaGFuZ2luZyB0aGVuIChzb21ldGhpbmcgaXMgcHJvYmFibHkgbG9ja2VkKS4gKi8KKyAgICBpZiAocmVjdXJzaXZlKQorCXJldHVybjsKKyAgICArK3JlY3Vyc2l2ZTsKKworICAgIC8qCisgICAgICogaWYgdGhlIHdpbmRvdyBJRCBhbmQgdGhlIGRpc3BsYXkgaXMga25vd24sIHdlIG1heSB1c2UgWDExIGNhbGxzCisgICAgICovCisjaWZkZWYgRkVBVF9YMTEKKyAgICBpZiAoZ2V0X3gxMV93aW5kaXMoKSA9PSBPSykKKwl0eXBlID0gMTsKKyNlbHNlCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfUEhPVE9OKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykgfHwgZGVmaW5lZChGRUFUX0dVSV9HVEspCisgICAgaWYgKGd1aS5pbl91c2UpCisJdHlwZSA9IDE7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfR1VJX0JFT1MKKyAgICAvKiBUT0RPOiBJZiB0aGlzIG1lYW5zIChndWkuaW5fdXNlKSB3aHkgbm90IG1lcmdlIHdpdGggYWJvdmU/IChEYW55KSAqLworICAgIC8qIHdlIGFsd2F5cyBoYXZlIGEgJ3dpbmRvdycgKi8KKyAgICB0eXBlID0gMTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBOb3RlOiBpZiAidF9UUyIgaXMgc2V0LCB0aXRsZSBpcyBzZXQgd2l0aCBlc2NhcGUgc2VxdWVuY2UgcmF0aGVyCisgICAgICoJICAgICB0aGFuIHgxMSBjYWxscywgYmVjYXVzZSB0aGUgeDExIGNhbGxzIGRvbid0IGFsd2F5cyB3b3JrCisgICAgICovCisKKyAgICBpZiAoKHR5cGUgfHwgKlRfVFMgIT0gTlVMKSAmJiB0aXRsZSAhPSBOVUxMKQorICAgIHsKKwlpZiAob2xkdGl0bGUgPT0gTlVMTAorI2lmZGVmIEZFQVRfR1VJCisJCSYmICFndWkuaW5fdXNlCisjZW5kaWYKKwkJKQkJLyogZmlyc3QgY2FsbCBidXQgbm90IGluIEdVSSwgc2F2ZSB0aXRsZSAqLworCSAgICAodm9pZClnZXRfeDExX3RpdGxlKEZBTFNFKTsKKworCWlmICgqVF9UUyAhPSBOVUwpCQkvKiBpdCdzIE9LIGlmIHRfZnMgaXMgZW1wdHkgKi8KKwkgICAgdGVybV9zZXR0aXRsZSh0aXRsZSk7CisjaWZkZWYgRkVBVF9YMTEKKwllbHNlCisjIGlmZGVmIEZFQVRfR1VJX0dUSworCWlmICghZ3VpLmluX3VzZSkJCS8qIGRvbid0IGRvIHRoaXMgaWYgR1RLKyBpcyBydW5uaW5nICovCisjIGVuZGlmCisJICAgIHNldF94MTFfdGl0bGUodGl0bGUpOwkJLyogeDExICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChGRUFUX0dVSV9CRU9TKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pIHx8IGRlZmluZWQoRkVBVF9HVUlfTUFDKQorCWVsc2UKKwkgICAgZ3VpX21jaF9zZXR0aXRsZSh0aXRsZSwgaWNvbik7CisjZW5kaWYKKwlkaWRfc2V0X3RpdGxlID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKHR5cGUgfHwgKlRfQ0lTICE9IE5VTCkgJiYgaWNvbiAhPSBOVUxMKQorICAgIHsKKwlpZiAob2xkaWNvbiA9PSBOVUxMCisjaWZkZWYgRkVBVF9HVUkKKwkJJiYgIWd1aS5pbl91c2UKKyNlbmRpZgorCQkpCQkvKiBmaXJzdCBjYWxsLCBzYXZlIGljb24gKi8KKwkgICAgZ2V0X3gxMV9pY29uKEZBTFNFKTsKKworCWlmICgqVF9DSVMgIT0gTlVMKQorCXsKKwkgICAgb3V0X3N0cihUX0NJUyk7CQkJLyogc2V0IGljb24gc3RhcnQgKi8KKwkgICAgb3V0X3N0cl9uZihpY29uKTsKKwkgICAgb3V0X3N0cihUX0NJRSk7CQkJLyogc2V0IGljb24gZW5kICovCisJICAgIG91dF9mbHVzaCgpOworCX0KKyNpZmRlZiBGRUFUX1gxMQorCWVsc2UKKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisJaWYgKCFndWkuaW5fdXNlKQkJLyogZG9uJ3QgZG8gdGhpcyBpZiBHVEsrIGlzIHJ1bm5pbmcgKi8KKyMgZW5kaWYKKwkgICAgc2V0X3gxMV9pY29uKGljb24pOwkJCS8qIHgxMSAqLworI2VuZGlmCisJZGlkX3NldF9pY29uID0gVFJVRTsKKyAgICB9CisgICAgLS1yZWN1cnNpdmU7Cit9CisKKy8qCisgKiBSZXN0b3JlIHRoZSB3aW5kb3cvaWNvbiB0aXRsZS4KKyAqICJ3aGljaCIgaXMgb25lIG9mOgorICogIDEgIG9ubHkgcmVzdG9yZSB0aXRsZQorICogIDIgIG9ubHkgcmVzdG9yZSBpY29uCisgKiAgMyAgcmVzdG9yZSB0aXRsZSBhbmQgaWNvbgorICovCisgICAgdm9pZAorbWNoX3Jlc3RvcmVfdGl0bGUod2hpY2gpCisgICAgaW50IHdoaWNoOworeworICAgIC8qIG9ubHkgcmVzdG9yZSB0aGUgdGl0bGUgb3IgaWNvbiB3aGVuIGl0IGhhcyBiZWVuIHNldCAqLworICAgIG1jaF9zZXR0aXRsZSgoKHdoaWNoICYgMSkgJiYgZGlkX3NldF90aXRsZSkgPworCQkJKG9sZHRpdGxlID8gb2xkdGl0bGUgOiBwX3RpdGxlb2xkKSA6IE5VTEwsCisJCQkgICAgICAoKHdoaWNoICYgMikgJiYgZGlkX3NldF9pY29uKSA/IG9sZGljb24gOiBOVUxMKTsKK30KKworI2VuZGlmIC8qIEZFQVRfVElUTEUgKi8KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJuYW1lIiBsb29rcyBsaWtlIHNvbWUgeHRlcm0gbmFtZS4KKyAqLworICAgIGludAordmltX2lzX3h0ZXJtKG5hbWUpCisgICAgY2hhcl91ICpuYW1lOworeworICAgIGlmIChuYW1lID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAoU1RSTklDTVAobmFtZSwgInh0ZXJtIiwgNSkgPT0gMAorCQl8fCBTVFJOSUNNUChuYW1lLCAibnh0ZXJtIiwgNikgPT0gMAorCQl8fCBTVFJOSUNNUChuYW1lLCAia3Rlcm0iLCA1KSA9PSAwCisJCXx8IFNUUk5JQ01QKG5hbWUsICJyeHZ0IiwgNCkgPT0gMAorCQl8fCBTVFJDTVAobmFtZSwgImJ1aWx0aW5feHRlcm0iKSA9PSAwKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NT1VTRV9UVFkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIG5vbi16ZXJvIHdoZW4gdXNpbmcgYW4geHRlcm0gbW91c2UsIGFjY29yZGluZyB0byAndHR5bW91c2UnLgorICogUmV0dXJuIDEgZm9yICJ4dGVybSIuCisgKiBSZXR1cm4gMiBmb3IgInh0ZXJtMiIuCisgKi8KKyAgICBpbnQKK3VzZV94dGVybV9tb3VzZSgpCit7CisgICAgaWYgKHR0eW1fZmxhZ3MgPT0gVFRZTV9YVEVSTTIpCisJcmV0dXJuIDI7CisgICAgaWYgKHR0eW1fZmxhZ3MgPT0gVFRZTV9YVEVSTSkKKwlyZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisgICAgaW50Cit2aW1faXNfaXJpcyhuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIChTVFJOSUNNUChuYW1lLCAiaXJpcy1hbnNpIiwgOSkgPT0gMAorCSAgICB8fCBTVFJDTVAobmFtZSwgImJ1aWx0aW5faXJpcy1hbnNpIikgPT0gMCk7Cit9CisKKyAgICBpbnQKK3ZpbV9pc192dDMwMChuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CSAgICAgICAvKiBhY3R1YWxseSBhbGwgQU5TSSBjb21wLiB0ZXJtaW5hbHMgc2hvdWxkIGJlIGhlcmUgICovCisgICAgcmV0dXJuIChTVFJOSUNNUChuYW1lLCAidnQzIiwgMykgPT0gMCAgICAgLyogaXQgd2lsbCBjb3ZlciBhbGwgZnJvbSBWVDEwMC1WVDMwMCAqLworCSAgICB8fCBTVFJOSUNNUChuYW1lLCAidnQyIiwgMykgPT0gMCAgLyogVE9ETzogZnJvbSBWVDM0MCBjYW4gaGFubGUgY29sb3JzICAqLworCSAgICB8fCBTVFJOSUNNUChuYW1lLCAidnQxIiwgMykgPT0gMAorCSAgICB8fCBTVFJDTVAobmFtZSwgImJ1aWx0aW5fdnQzMjAiKSA9PSAwKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBhIHRlcm1pbmFsIGZvciB3aGljaCAndHR5ZmFzdCcgc2hvdWxkIGJlIHNldC4KKyAqIFRoaXMgc2hvdWxkIGluY2x1ZGUgYWxsIHdpbmRvd2VkIHRlcm1pbmFsIGVtdWxhdG9ycy4KKyAqLworICAgIGludAordmltX2lzX2Zhc3R0ZXJtKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAodmltX2lzX3h0ZXJtKG5hbWUpIHx8IHZpbV9pc192dDMwMChuYW1lKSB8fCB2aW1faXNfaXJpcyhuYW1lKSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gKCAgIFNUUk5JQ01QKG5hbWUsICJocHRlcm0iLCA2KSA9PSAwCisJICAgIHx8IFNUUk5JQ01QKG5hbWUsICJzdW4tY21kIiwgNykgPT0gMAorCSAgICB8fCBTVFJOSUNNUChuYW1lLCAic2NyZWVuIiwgNikgPT0gMAorCSAgICB8fCBTVFJOSUNNUChuYW1lLCAiZHR0ZXJtIiwgNikgPT0gMCk7Cit9CisKKy8qCisgKiBJbnNlcnQgdXNlciBuYW1lIGluIHNbbGVuXS4KKyAqIFJldHVybiBPSyBpZiBhIG5hbWUgZm91bmQuCisgKi8KKyAgICBpbnQKK21jaF9nZXRfdXNlcl9uYW1lKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworI2lmZGVmIFZNUworICAgIFNUUk5DUFkoKGNoYXIgKilzLCBjdXNlcmlkKE5VTEwpLCBsZW4pOworICAgIHJldHVybiBPSzsKKyNlbHNlCisgICAgcmV0dXJuIG1jaF9nZXRfdW5hbWUoZ2V0dWlkKCksIHMsIGxlbik7CisjZW5kaWYKK30KKworLyoKKyAqIEluc2VydCB1c2VyIG5hbWUgZm9yICJ1aWQiIGluIHNbbGVuXS4KKyAqIFJldHVybiBPSyBpZiBhIG5hbWUgZm91bmQuCisgKi8KKyAgICBpbnQKK21jaF9nZXRfdW5hbWUodWlkLCBzLCBsZW4pCisgICAgdWlkX3QJdWlkOworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWxlbjsKK3sKKyNpZiBkZWZpbmVkKEhBVkVfUFdEX0gpICYmIGRlZmluZWQoSEFWRV9HRVRQV1VJRCkKKyAgICBzdHJ1Y3QgcGFzc3dkICAgKnB3OworCisgICAgaWYgKChwdyA9IGdldHB3dWlkKHVpZCkpICE9IE5VTEwKKwkgICAgJiYgcHctPnB3X25hbWUgIT0gTlVMTCAmJiAqKHB3LT5wd19uYW1lKSAhPSBOVUwpCisgICAgeworCVNUUk5DUFkocywgcHctPnB3X25hbWUsIGxlbik7CisJcmV0dXJuIE9LOworICAgIH0KKyNlbmRpZgorICAgIHNwcmludGYoKGNoYXIgKilzLCAiJWQiLCAoaW50KXVpZCk7CSAgICAvKiBhc3N1bWVzIHMgaXMgbG9uZyBlbm91Z2ggKi8KKyAgICByZXR1cm4gRkFJTDsJCQkgICAgLyogYSBudW1iZXIgaXMgbm90IGEgbmFtZSAqLworfQorCisvKgorICogSW5zZXJ0IGhvc3QgbmFtZSBpcyBzW2xlbl0uCisgKi8KKworI2lmZGVmIEhBVkVfU1lTX1VUU05BTUVfSAorICAgIHZvaWQKK21jaF9nZXRfaG9zdF9uYW1lKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworICAgIHN0cnVjdCB1dHNuYW1lIHZ1dHNuYW1lOworCisgICAgaWYgKHVuYW1lKCZ2dXRzbmFtZSkgPCAwKQorCSpzID0gTlVMOworICAgIGVsc2UKKwlTVFJOQ1BZKHMsIHZ1dHNuYW1lLm5vZGVuYW1lLCBsZW4pOworICAgIHNbbGVuIC0gMV0gPSBOVUw7CS8qIG1ha2Ugc3VyZSBpdCdzIHRlcm1pbmF0ZWQgKi8KK30KKyNlbHNlIC8qIEhBVkVfU1lTX1VUU05BTUVfSCAqLworCisjIGlmZGVmIEhBVkVfU1lTX1NZU1RFTUlORk9fSAorIyAgZGVmaW5lIGdldGhvc3RuYW1lKG5hbSwgbGVuKSBzeXNpbmZvKFNJX0hPU1ROQU1FLCBuYW0sIGxlbikKKyMgZW5kaWYKKworICAgIHZvaWQKK21jaF9nZXRfaG9zdF9uYW1lKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworIyBpZmRlZiBWQVhDCisgICAgdmF4YyRnZXRob3N0bmFtZSgoY2hhciAqKXMsIGxlbik7CisjIGVsc2UKKyAgICBnZXRob3N0bmFtZSgoY2hhciAqKXMsIGxlbik7CisjIGVuZGlmCisgICAgc1tsZW4gLSAxXSA9IE5VTDsJLyogbWFrZSBzdXJlIGl0J3MgdGVybWluYXRlZCAqLworfQorI2VuZGlmIC8qIEhBVkVfU1lTX1VUU05BTUVfSCAqLworCisvKgorICogcmV0dXJuIHByb2Nlc3MgSUQKKyAqLworICAgIGxvbmcKK21jaF9nZXRfcGlkKCkKK3sKKyAgICByZXR1cm4gKGxvbmcpZ2V0cGlkKCk7Cit9CisKKyNpZiAhZGVmaW5lZChIQVZFX1NUUkVSUk9SKSAmJiBkZWZpbmVkKFVTRV9HRVRDV0QpCitzdGF0aWMgY2hhciAqc3RyZXJyb3IgX19BUkdTKChpbnQpKTsKKworICAgIHN0YXRpYyBjaGFyICoKK3N0cmVycm9yKGVycikKKyAgICBpbnQgZXJyOworeworICAgIGV4dGVybiBpbnQJICAgIHN5c19uZXJyOworICAgIGV4dGVybiBjaGFyCSAgICAqc3lzX2Vycmxpc3RbXTsKKyAgICBzdGF0aWMgY2hhcgkgICAgZXJbMjBdOworCisgICAgaWYgKGVyciA+IDAgJiYgZXJyIDwgc3lzX25lcnIpCisJcmV0dXJuIChzeXNfZXJybGlzdFtlcnJdKTsKKyAgICBzcHJpbnRmKGVyLCAiRXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiBlcjsKK30KKyNlbmRpZgorCisvKgorICogR2V0IG5hbWUgb2YgY3VycmVudCBkaXJlY3RvcnkgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLgorICogUmV0dXJuIE9LIGZvciBzdWNjZXNzLCBGQUlMIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CittY2hfZGlybmFtZShidWYsIGxlbikKKyAgICBjaGFyX3UgICpidWY7CisgICAgaW50CSAgICBsZW47Cit7CisjaWYgZGVmaW5lZChVU0VfR0VUQ1dEKQorICAgIGlmIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgPT0gTlVMTCkKKyAgICB7CisJU1RSQ1BZKGJ1Ziwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworI2Vsc2UKKyAgICByZXR1cm4gKGdldHdkKChjaGFyICopYnVmKSAhPSBOVUxMID8gT0sgOiBGQUlMKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmVwbGFjZSBhbGwgc2xhc2hlcyBieSBiYWNrc2xhc2hlcy4KKyAqIFdoZW4gJ3NoZWxsc2xhc2gnIHNldCBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqLworICAgIHZvaWQKK3NsYXNoX2FkanVzdChwKQorICAgIGNoYXJfdSAgKnA7Cit7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKwlpZiAoKnAgPT0gcHNlcGNOKQorCSAgICAqcCA9IHBzZXBjOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJZWxzZQorI2VuZGlmCisJICAgICsrcDsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIEdldCBhYnNvbHV0ZSBmaWxlIG5hbWUgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBmb3Igc3VjY2VzcworICovCisgICAgaW50CittY2hfRnVsbE5hbWUoZm5hbWUsIGJ1ZiwgbGVuLCBmb3JjZSkKKyAgICBjaGFyX3UJKmZuYW1lLCAqYnVmOworICAgIGludAkJbGVuOworICAgIGludAkJZm9yY2U7CQkvKiBhbHNvIGV4cGFuZCB3aGVuIGFscmVhZHkgYWJzb2x1dGUgcGF0aCAqLworeworICAgIGludAkJbDsKKyNpZmRlZiBPUzIKKyAgICBpbnQJCW9ubHlfZHJpdmU7CS8qIGZpbGUgbmFtZSBpcyBvbmx5IGEgZHJpdmUgbGV0dGVyICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZDSERJUgorICAgIGludAkJZmQgPSAtMTsKKyAgICBzdGF0aWMgaW50CWRvbnRfZmNoZGlyID0gRkFMU0U7CS8qIFRSVUUgd2hlbiBmY2hkaXIoKSBkb2Vzbid0IHdvcmsgKi8KKyNlbmRpZgorICAgIGNoYXJfdQlvbGRkaXJbTUFYUEFUSExdOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXJldHZhbCA9IE9LOworCisjaWZkZWYgVk1TCisgICAgZm5hbWUgPSB2bXNfZml4ZmlsZW5hbWUoZm5hbWUpOworI2VuZGlmCisKKyAgICAvKiBleHBhbmQgaXQgaWYgZm9yY2VkIG9yIG5vdCBhbiBhYnNvbHV0ZSBwYXRoICovCisgICAgaWYgKGZvcmNlIHx8ICFtY2hfaXNGdWxsTmFtZShmbmFtZSkpCisgICAgeworCS8qCisJICogSWYgdGhlIGZpbGUgbmFtZSBoYXMgYSBwYXRoLCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgZm9yIGEgbW9tZW50LAorCSAqIGFuZCB0aGVuIGRvIHRoZSBnZXR3ZCgpIChhbmQgZ2V0IGJhY2sgdG8gd2hlcmUgd2Ugd2VyZSkuCisJICogVGhpcyB3aWxsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUgd2l0aCAiLi4vIiB0aGluZ3MuCisJICovCisjaWZkZWYgT1MyCisJb25seV9kcml2ZSA9IDA7CisJaWYgKCgocCA9IHZpbV9zdHJyY2hyKGZuYW1lLCAnLycpKSAhPSBOVUxMKQorCQl8fCAoKHAgPSB2aW1fc3RycmNocihmbmFtZSwgJ1xcJykpICE9IE5VTEwpCisJCXx8ICgoKHAgPSB2aW1fc3RyY2hyKGZuYW1lLCAgJzonKSkgIT0gTlVMTCkgJiYgKytvbmx5X2RyaXZlKSkKKyNlbHNlCisJaWYgKChwID0gdmltX3N0cnJjaHIoZm5hbWUsICcvJykpICE9IE5VTEwpCisjZW5kaWYKKwl7CisjaWZkZWYgSEFWRV9GQ0hESVIKKwkgICAgLyoKKwkgICAgICogVXNlIGZjaGRpcigpIGlmIHBvc3NpYmxlLCBpdCdzIHNhaWQgdG8gYmUgZmFzdGVyIGFuZCBtb3JlCisJICAgICAqIHJlbGlhYmxlLiAgQnV0IG9uIFN1bk9TIDQgaXQgbWlnaHQgbm90IHdvcmsuICBDaGVjayB0aGlzIGJ5CisJICAgICAqIGRvaW5nIGEgZmNoZGlyKCkgcmlnaHQgbm93LgorCSAgICAgKi8KKwkgICAgaWYgKCFkb250X2ZjaGRpcikKKwkgICAgeworCQlmZCA9IG9wZW4oIi4iLCBPX1JET05MWSB8IE9fRVhUUkEsIDApOworCQlpZiAoZmQgPj0gMCAmJiBmY2hkaXIoZmQpIDwgMCkKKwkJeworCQkgICAgY2xvc2UoZmQpOworCQkgICAgZmQgPSAtMTsKKwkJICAgIGRvbnRfZmNoZGlyID0gVFJVRTsJICAgIC8qIGRvbid0IHRyeSBhZ2FpbiAqLworCQl9CisJICAgIH0KKyNlbmRpZgorCisJICAgIC8qIE9ubHkgY2hhbmdlIGRpcmVjdG9yeSB3aGVuIHdlIGFyZSBzdXJlIHdlIGNhbiByZXR1cm4gdG8gd2hlcmUKKwkgICAgICogd2UgYXJlIG5vdy4gIEFmdGVyIGRvaW5nICJzdSIgY2hkaXIoIi4iKSBtaWdodCBub3Qgd29yay4gKi8KKwkgICAgaWYgKAorI2lmZGVmIEhBVkVfRkNIRElSCisJCWZkIDwgMCAmJgorI2VuZGlmCisJCQkobWNoX2Rpcm5hbWUob2xkZGlyLCBNQVhQQVRITCkgPT0gRkFJTAorCQkJCQkgICB8fCBtY2hfY2hkaXIoKGNoYXIgKilvbGRkaXIpICE9IDApKQorCSAgICB7CisJCXAgPSBOVUxMOwkvKiBjYW4ndCBnZXQgY3VycmVudCBkaXI6IGRvbid0IGNoZGlyICovCisJCXJldHZhbCA9IEZBSUw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgT1MyCisJCS8qCisJCSAqIGNvbXBlbnNhdGUgZm9yIGNhc2Ugd2hlcmUgJzonIGZyb20gIkQ6IiB3YXMgdGhlIG9ubHkKKwkJICogcGF0aCBzZXBhcmF0b3IgZGV0ZWN0ZWQgaW4gdGhlIGZpbGUgbmFtZTsgdGhlIF9uZXh0XworCQkgKiBjaGFyYWN0ZXIgaGFzIHRvIGJlIHJlbW92ZWQsIGFuZCB0aGVuIHJlc3RvcmVkIGxhdGVyLgorCQkgKi8KKwkJaWYgKG9ubHlfZHJpdmUpCisJCSAgICBwKys7CisjZW5kaWYKKwkJLyogVGhlIGRpcmVjdG9yeSBpcyBjb3BpZWQgaW50byBidWZbXSwgdG8gYmUgYWJsZSB0byByZW1vdmUKKwkJICogdGhlIGZpbGUgbmFtZSB3aXRob3V0IGNoYW5naW5nIGl0IChjb3VsZCBiZSBhIHN0cmluZyBpbgorCQkgKiByZWFkLW9ubHkgbWVtb3J5KSAqLworCQlpZiAocCAtIGZuYW1lID49IGxlbikKKwkJICAgIHJldHZhbCA9IEZBSUw7CisJCWVsc2UKKwkJeworCQkgICAgU1RSTkNQWShidWYsIGZuYW1lLCBwIC0gZm5hbWUpOworCQkgICAgYnVmW3AgLSBmbmFtZV0gPSBOVUw7CisJCSAgICBpZiAobWNoX2NoZGlyKChjaGFyICopYnVmKSkKKwkJCXJldHZhbCA9IEZBSUw7CisJCSAgICBlbHNlCisJCQlmbmFtZSA9IHAgKyAxOworCQkgICAgKmJ1ZiA9IE5VTDsKKwkJfQorI2lmZGVmIE9TMgorCQlpZiAob25seV9kcml2ZSkKKwkJeworCQkgICAgcC0tOworCQkgICAgaWYgKHJldHZhbCAhPSBGQUlMKQorCQkJZm5hbWUtLTsKKwkJfQorI2VuZGlmCisJICAgIH0KKwl9CisJaWYgKG1jaF9kaXJuYW1lKGJ1ZiwgbGVuKSA9PSBGQUlMKQorCXsKKwkgICAgcmV0dmFsID0gRkFJTDsKKwkgICAgKmJ1ZiA9IE5VTDsKKwl9CisJaWYgKHAgIT0gTlVMTCkKKwl7CisjaWZkZWYgSEFWRV9GQ0hESVIKKwkgICAgaWYgKGZkID49IDApCisJICAgIHsKKwkJbCA9IGZjaGRpcihmZCk7CisJCWNsb3NlKGZkKTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkJbCA9IG1jaF9jaGRpcigoY2hhciAqKW9sZGRpcik7CisJICAgIGlmIChsICE9IDApCisJCUVNU0coXyhlX3ByZXZfZGlyKSk7CisJfQorCisJbCA9IFNUUkxFTihidWYpOworCWlmIChsID49IGxlbikKKwkgICAgcmV0dmFsID0gRkFJTDsKKyNpZm5kZWYgVk1TCisJZWxzZQorCXsKKwkgICAgaWYgKGwgPiAwICYmIGJ1ZltsIC0gMV0gIT0gJy8nICYmICpmbmFtZSAhPSBOVUwKKwkJCQkJCSAgICYmIFNUUkNNUChmbmFtZSwgIi4iKSAhPSAwKQorCQlTVFJDQVQoYnVmLCAiLyIpOworCX0KKyNlbmRpZgorICAgIH0KKyAgICAvKiBDYXRjaCBmaWxlIG5hbWVzIHdoaWNoIGFyZSB0b28gbG9uZy4gKi8KKyAgICBpZiAocmV0dmFsID09IEZBSUwgfHwgU1RSTEVOKGJ1ZikgKyBTVFJMRU4oZm5hbWUpID49IGxlbikKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qIERvIG5vdCBhcHBlbmQgIi4iLCAiL2Rpci8uIiBpcyBlcXVhbCB0byAiL2RpciIuICovCisgICAgaWYgKFNUUkNNUChmbmFtZSwgIi4iKSAhPSAwKQorCVNUUkNBVChidWYsIGZuYW1lKTsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmICJmbmFtZSIgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqLworICAgIGludAorbWNoX2lzRnVsbE5hbWUoZm5hbWUpCisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyNpZmRlZiBfX0VNWF9fCisgICAgcmV0dXJuIF9mbmlzYWJzKGZuYW1lKTsKKyNlbHNlCisjIGlmZGVmIFZNUworICAgIHJldHVybiAoIGZuYW1lWzBdID09ICcvJwkgICAgICAgfHwgZm5hbWVbMF0gPT0gJy4nCSAgICB8fAorCSAgICAgc3RyY2hyKChjaGFyICopZm5hbWUsJzonKSB8fCBzdHJjaHIoKGNoYXIgKilmbmFtZSwnIicpIHx8CisJICAgIChzdHJjaHIoKGNoYXIgKilmbmFtZSwnWycpICYmIHN0cmNocigoY2hhciAqKWZuYW1lLCddJykpfHwKKwkgICAgKHN0cmNocigoY2hhciAqKWZuYW1lLCc8JykgJiYgc3RyY2hyKChjaGFyICopZm5hbWUsJz4nKSkgICApOworIyBlbHNlCisgICAgcmV0dXJuICgqZm5hbWUgPT0gJy8nIHx8ICpmbmFtZSA9PSAnficpOworIyBlbmRpZgorI2VuZGlmCit9CisKKy8qCisgKiBHZXQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgJ25hbWUnLgorICogUmV0dXJucyAtMSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBsb25nCittY2hfZ2V0cGVybShuYW1lKQorICAgIGNoYXJfdSAqbmFtZTsKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworICAgIC8qIEtlZXAgdGhlICNpZmRlZiBvdXRzaWRlIG9mIHN0YXQoKSwgaXQgbWF5IGJlIGEgbWFjcm8uICovCisjaWZkZWYgVk1TCisgICAgaWYgKHN0YXQoKGNoYXIgKil2bXNfZml4ZmlsZW5hbWUobmFtZSksICZzdGF0YikpCisjZWxzZQorICAgIGlmIChzdGF0KChjaGFyICopbmFtZSwgJnN0YXRiKSkKKyNlbmRpZgorCXJldHVybiAtMTsKKyAgICByZXR1cm4gc3RhdGIuc3RfbW9kZTsKK30KKworLyoKKyAqIHNldCBmaWxlIHBlcm1pc3Npb24gZm9yICduYW1lJyB0byAncGVybScKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK21jaF9zZXRwZXJtKG5hbWUsIHBlcm0pCisgICAgY2hhcl91ICAqbmFtZTsKKyAgICBsb25nICAgIHBlcm07Cit7CisgICAgcmV0dXJuIChjaG1vZCgoY2hhciAqKQorI2lmZGVmIFZNUworCQkgICAgdm1zX2ZpeGZpbGVuYW1lKG5hbWUpLAorI2Vsc2UKKwkJICAgIG5hbWUsCisjZW5kaWYKKwkJICAgIChtb2RlX3QpcGVybSkgPT0gMCA/IE9LIDogRkFJTCk7Cit9CisKKyNpZiBkZWZpbmVkKEhBVkVfQUNMKSB8fCBkZWZpbmVkKFBST1RPKQorIyBpZmRlZiBIQVZFX1NZU19BQ0xfSAorIyAgaW5jbHVkZSA8c3lzL2FjbC5oPgorIyBlbmRpZgorIyBpZmRlZiBIQVZFX1NZU19BQ0NFU1NfSAorIyAgaW5jbHVkZSA8c3lzL2FjY2Vzcy5oPgorIyBlbmRpZgorCisjIGlmZGVmIEhBVkVfU09MQVJJU19BQ0wKK3R5cGVkZWYgc3RydWN0IHZpbV9hY2xfc29sYXJpc19UIHsKKyAgICBpbnQgYWNsX2NudDsKKyAgICBhY2xlbnRfdCAqYWNsX2VudHJ5OworfSB2aW1fYWNsX3NvbGFyaXNfVDsKKyMgZW5kaWYKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIEFDTCBvZiBmaWxlICJmbmFtZSIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFJldHVybiBOVUxMIGlmIHRoZSBBQ0wgaXMgbm90IGF2YWlsYWJsZSBmb3Igd2hhdGV2ZXIgcmVhc29uLgorICovCisgICAgdmltX2FjbF9UCittY2hfZ2V0X2FjbChmbmFtZSkKKyAgICBjaGFyX3UJKmZuYW1lOworeworICAgIHZpbV9hY2xfVAlyZXQgPSBOVUxMOworI2lmZGVmIEhBVkVfUE9TSVhfQUNMCisgICAgcmV0ID0gKHZpbV9hY2xfVClhY2xfZ2V0X2ZpbGUoKGNoYXIgKilmbmFtZSwgQUNMX1RZUEVfQUNDRVNTKTsKKyNlbHNlCisjaWZkZWYgSEFWRV9TT0xBUklTX0FDTAorICAgIHZpbV9hY2xfc29sYXJpc19UICAgKmFjbGVudDsKKworICAgIGFjbGVudCA9IG1hbGxvYyhzaXplb2YodmltX2FjbF9zb2xhcmlzX1QpKTsKKyAgICBpZiAoKGFjbGVudC0+YWNsX2NudCA9IGFjbCgoY2hhciAqKWZuYW1lLCBHRVRBQ0xDTlQsIDAsIE5VTEwpKSA8IDApCisgICAgeworCWZyZWUoYWNsZW50KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYWNsZW50LT5hY2xfZW50cnkgPSBtYWxsb2MoYWNsZW50LT5hY2xfY250ICogc2l6ZW9mKGFjbGVudF90KSk7CisgICAgaWYgKGFjbCgoY2hhciAqKWZuYW1lLCBHRVRBQ0wsIGFjbGVudC0+YWNsX2NudCwgYWNsZW50LT5hY2xfZW50cnkpIDwgMCkKKyAgICB7CisJZnJlZShhY2xlbnQtPmFjbF9lbnRyeSk7CisJZnJlZShhY2xlbnQpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICByZXQgPSAodmltX2FjbF9UKWFjbGVudDsKKyNlbHNlCisjaWYgZGVmaW5lZChIQVZFX0FJWF9BQ0wpCisgICAgaW50CQlhY2xzaXplOworICAgIHN0cnVjdCBhY2wgKmFjbGVudDsKKworICAgIGFjbHNpemUgPSBzaXplb2Yoc3RydWN0IGFjbCk7CisgICAgYWNsZW50ID0gbWFsbG9jKGFjbHNpemUpOworICAgIGlmIChzdGF0YWNsKChjaGFyICopZm5hbWUsIFNUWF9OT1JNQUwsIGFjbGVudCwgYWNsc2l6ZSkgPCAwKQorICAgIHsKKwlpZiAoZXJybm8gPT0gRU5PU1BDKQorCXsKKwkgICAgYWNsc2l6ZSA9IGFjbGVudC0+YWNsX2xlbjsKKwkgICAgYWNsZW50ID0gcmVhbGxvYyhhY2xlbnQsIGFjbHNpemUpOworCSAgICBpZiAoc3RhdGFjbCgoY2hhciAqKWZuYW1lLCBTVFhfTk9STUFMLCBhY2xlbnQsIGFjbHNpemUpIDwgMCkKKwkgICAgeworCQlmcmVlKGFjbGVudCk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIGZyZWUoYWNsZW50KTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKyAgICByZXQgPSAodmltX2FjbF9UKWFjbGVudDsKKyNlbmRpZiAvKiBIQVZFX0FJWF9BQ0wgKi8KKyNlbmRpZiAvKiBIQVZFX1NPTEFSSVNfQUNMICovCisjZW5kaWYgLyogSEFWRV9QT1NJWF9BQ0wgKi8KKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IHRoZSBBQ0wgb2YgZmlsZSAiZm5hbWUiIHRvICJhY2wiICh1bmxlc3MgaXQncyBOVUxMKS4KKyAqLworICAgIHZvaWQKK21jaF9zZXRfYWNsKGZuYW1lLCBhY2xlbnQpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICB2aW1fYWNsX1QJYWNsZW50OworeworICAgIGlmIChhY2xlbnQgPT0gTlVMTCkKKwlyZXR1cm47CisjaWZkZWYgSEFWRV9QT1NJWF9BQ0wKKyAgICBhY2xfc2V0X2ZpbGUoKGNoYXIgKilmbmFtZSwgQUNMX1RZUEVfQUNDRVNTLCAoYWNsX3QpYWNsZW50KTsKKyNlbHNlCisjaWZkZWYgSEFWRV9TT0xBUklTX0FDTAorICAgIGFjbCgoY2hhciAqKWZuYW1lLCBTRVRBQ0wsICgodmltX2FjbF9zb2xhcmlzX1QgKilhY2xlbnQpLT5hY2xfY250LAorCSAgICAoKHZpbV9hY2xfc29sYXJpc19UICopYWNsZW50KS0+YWNsX2VudHJ5KTsKKyNlbHNlCisjaWZkZWYgSEFWRV9BSVhfQUNMCisgICAgY2hhY2woKGNoYXIgKilmbmFtZSwgYWNsZW50LCAoKHN0cnVjdCBhY2wgKilhY2xlbnQpLT5hY2xfbGVuKTsKKyNlbmRpZiAvKiBIQVZFX0FJWF9BQ0wgKi8KKyNlbmRpZiAvKiBIQVZFX1NPTEFSSVNfQUNMICovCisjZW5kaWYgLyogSEFWRV9QT1NJWF9BQ0wgKi8KK30KKworICAgIHZvaWQKK21jaF9mcmVlX2FjbChhY2xlbnQpCisgICAgdmltX2FjbF9UCWFjbGVudDsKK3sKKyAgICBpZiAoYWNsZW50ID09IE5VTEwpCisJcmV0dXJuOworI2lmZGVmIEhBVkVfUE9TSVhfQUNMCisgICAgYWNsX2ZyZWUoKGFjbF90KWFjbGVudCk7CisjZWxzZQorI2lmZGVmIEhBVkVfU09MQVJJU19BQ0wKKyAgICBmcmVlKCgodmltX2FjbF9zb2xhcmlzX1QgKilhY2xlbnQpLT5hY2xfZW50cnkpOworICAgIGZyZWUoYWNsZW50KTsKKyNlbHNlCisjaWZkZWYgSEFWRV9BSVhfQUNMCisgICAgZnJlZShhY2xlbnQpOworI2VuZGlmIC8qIEhBVkVfQUlYX0FDTCAqLworI2VuZGlmIC8qIEhBVkVfU09MQVJJU19BQ0wgKi8KKyNlbmRpZiAvKiBIQVZFX1BPU0lYX0FDTCAqLworfQorI2VuZGlmCisKKy8qCisgKiBTZXQgaGlkZGVuIGZsYWcgZm9yICJuYW1lIi4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICB2b2lkCittY2hfaGlkZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICAvKiBjYW4ndCBoaWRlIGEgZmlsZSAqLworfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgIm5hbWUiIGlzIGEgZGlyZWN0b3J5CisgKiByZXR1cm4gRkFMU0UgaWYgIm5hbWUiIGlzIG5vdCBhIGRpcmVjdG9yeQorICogcmV0dXJuIEZBTFNFIGZvciBlcnJvcgorICovCisgICAgaW50CittY2hfaXNkaXIobmFtZSkKKyAgICBjaGFyX3UgKm5hbWU7Cit7CisgICAgc3RydWN0IHN0YXQgc3RhdGI7CisKKyAgICBpZiAoKm5hbWUgPT0gTlVMKQkgICAgLyogU29tZSBzdGF0KClzIGRvbid0IGZsYWcgIiIgYXMgYW4gZXJyb3IuICovCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChzdGF0KChjaGFyICopbmFtZSwgJnN0YXRiKSkKKwlyZXR1cm4gRkFMU0U7CisjaWZkZWYgX1BPU0lYX1NPVVJDRQorICAgIHJldHVybiAoU19JU0RJUihzdGF0Yi5zdF9tb2RlKSA/IFRSVUUgOiBGQUxTRSk7CisjZWxzZQorICAgIHJldHVybiAoKHN0YXRiLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIgPyBUUlVFIDogRkFMU0UpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKworc3RhdGljIGludCBleGVjdXRhYmxlX2ZpbGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKKworLyoKKyAqIFJldHVybiAxIGlmICJuYW1lIiBpcyBhbiBleGVjdXRhYmxlIGZpbGUsIDAgaWYgbm90IG9yIGl0IGRvZXNuJ3QgZXhpc3QuCisgKi8KKyAgICBzdGF0aWMgaW50CitleGVjdXRhYmxlX2ZpbGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgc3RydWN0IHN0YXQJc3Q7CisKKyAgICBpZiAoc3RhdCgoY2hhciAqKW5hbWUsICZzdCkpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIFNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgbWNoX2FjY2VzcygoY2hhciAqKW5hbWUsIFhfT0spID09IDA7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiAibmFtZSIgY2FuIGJlIGZvdW5kIGluICRQQVRIIGFuZCBleGVjdXRlZCwgMCBpZiBub3QuCisgKiBSZXR1cm4gLTEgaWYgdW5rbm93bi4KKyAqLworICAgIGludAorbWNoX2Nhbl9leGUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgY2hhcl91CSpidWY7CisgICAgY2hhcl91CSpwLCAqZTsKKyAgICBpbnQJCXJldHZhbDsKKworICAgIC8qIElmIGl0J3MgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCBkb24ndCBuZWVkIHRvIHVzZSAkUEFUSC4gKi8KKyAgICBpZiAobWNoX2lzRnVsbE5hbWUobmFtZSkgfHwgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICcvJworCQkJCSAgICAgIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICcvJykpKSkKKwlyZXR1cm4gZXhlY3V0YWJsZV9maWxlKG5hbWUpOworCisgICAgcCA9IChjaGFyX3UgKilnZXRlbnYoIlBBVEgiKTsKKyAgICBpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkKKwlyZXR1cm4gLTE7CisgICAgYnVmID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4obmFtZSkgKyBTVFJMRU4ocCkgKyAyKSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIC8qCisgICAgICogV2FsayB0aHJvdWdoIGFsbCBlbnRyaWVzIGluICRQQVRIIHRvIGNoZWNrIGlmICJuYW1lIiBleGlzdHMgdGhlcmUgYW5kCisgICAgICogaXMgYW4gZXhlY3V0YWJsZSBmaWxlLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCWUgPSAoY2hhcl91ICopc3RyY2hyKChjaGFyICopcCwgJzonKTsKKwlpZiAoZSA9PSBOVUxMKQorCSAgICBlID0gcCArIFNUUkxFTihwKTsKKwlpZiAoZSAtIHAgPD0gMSkJCS8qIGVtcHR5IGVudHJ5IG1lYW5zIGN1cnJlbnQgZGlyICovCisJICAgIFNUUkNQWShidWYsICIuLyIpOworCWVsc2UKKwl7CisJICAgIFNUUk5DUFkoYnVmLCBwLCBlIC0gcCk7CisJICAgIGJ1ZltlIC0gcF0gPSBOVUw7CisJICAgIGFkZF9wYXRoc2VwKGJ1Zik7CisJfQorCVNUUkNBVChidWYsIG5hbWUpOworCXJldHZhbCA9IGV4ZWN1dGFibGVfZmlsZShidWYpOworCWlmIChyZXR2YWwgPT0gMSkKKwkgICAgYnJlYWs7CisKKwlpZiAoKmUgIT0gJzonKQorCSAgICBicmVhazsKKwlwID0gZSArIDE7CisgICAgfQorCisgICAgdmltX2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB3aGF0ICJuYW1lIiBpczoKKyAqIE5PREVfTk9STUFMOiBmaWxlIG9yIGRpcmVjdG9yeSAob3IgZG9lc24ndCBleGlzdCkKKyAqIE5PREVfV1JJVEFCTEU6IHdyaXRhYmxlIGRldmljZSwgc29ja2V0LCBmaWZvLCBldGMuCisgKiBOT0RFX09USEVSOiBub24td3JpdGFibGUgdGhpbmdzCisgKi8KKyAgICBpbnQKK21jaF9ub2RldHlwZShuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBzdHJ1Y3Qgc3RhdAlzdDsKKworICAgIGlmIChzdGF0KChjaGFyICopbmFtZSwgJnN0KSkKKwlyZXR1cm4gTk9ERV9OT1JNQUw7CisgICAgaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgfHwgU19JU0RJUihzdC5zdF9tb2RlKSkKKwlyZXR1cm4gTk9ERV9OT1JNQUw7CisjaWZuZGVmIE9TMgorICAgIGlmIChTX0lTQkxLKHN0LnN0X21vZGUpKQkvKiBibG9jayBkZXZpY2UgaXNuJ3Qgd3JpdGFibGUgKi8KKwlyZXR1cm4gTk9ERV9PVEhFUjsKKyNlbmRpZgorICAgIC8qIEV2ZXJ5dGhpbmcgZWxzZSBpcyB3cml0YWJsZT8gKi8KKyAgICByZXR1cm4gTk9ERV9XUklUQUJMRTsKK30KKworICAgIHZvaWQKK21jaF9lYXJseV9pbml0KCkKK3sKKyNpZmRlZiBIQVZFX0NIRUNLX1NUQUNLX0dST1dUSAorICAgIGludAkJCWk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ0hFQ0tfU1RBQ0tfR1JPV1RICisgICAgY2hlY2tfc3RhY2tfZ3Jvd3RoKChjaGFyICopJmkpOworCisjIGlmZGVmIEhBVkVfR0VUUkxJTUlUCisgICAgZ2V0X3N0YWNrX2xpbWl0KCk7CisjIGVuZGlmCisKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBTZXR1cCBhbiBhbHRlcm5hdGl2ZSBzdGFjayBmb3Igc2lnbmFscy4gIEhlbHBzIHRvIGNhdGNoIHNpZ25hbHMgd2hlbgorICAgICAqIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIHNwYWNlLgorICAgICAqIFVzZSBvZiBzaWdhbHRzdGFjaygpIGlzIHByZWZlcnJlZCwgaXQncyBtb3JlIHBvcnRhYmxlLgorICAgICAqIElnbm9yZSBhbnkgZXJyb3JzLgorICAgICAqLworI2lmIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgfHwgZGVmaW5lZChIQVZFX1NJR1NUQUNLKQorICAgIHNpZ25hbF9zdGFjayA9IG1hbGxvYyhTSUdTVEtTWik7CisgICAgaW5pdF9zaWduYWxfc3RhY2soKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBleGl0X3Njcm9sbCBfX0FSR1MoKHZvaWQpKTsKKworLyoKKyAqIE91dHB1dCBhIG5ld2xpbmUgd2hlbiBleGl0aW5nLgorICogTWFrZSBzdXJlIHRoZSBuZXdsaW5lIGdvZXMgdG8gdGhlIHNhbWUgc3RyZWFtIGFzIHRoZSB0ZXh0LgorICovCisgICAgc3RhdGljIHZvaWQKK2V4aXRfc2Nyb2xsKCkKK3sKKyAgICBpZiAobmV3bGluZV9vbl9leGl0IHx8IG1zZ19kaWRvdXQpCisgICAgeworCWlmIChtc2dfdXNlX3ByaW50ZigpKQorCXsKKwkgICAgaWYgKGluZm9fbWVzc2FnZSkKKwkJbWNoX21zZygiXG4iKTsKKwkgICAgZWxzZQorCQltY2hfZXJybXNnKCJcclxuIik7CisJfQorCWVsc2UKKwkgICAgb3V0X2NoYXIoJ1xuJyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmVzdG9yZV9jdGVybV9jb2xvcnMoKTsJCS8qIGdldCBvcmlnaW5hbCBjb2xvcnMgYmFjayAqLworCW1zZ19jbHJfZW9zX2ZvcmNlKCk7CQkvKiBjbGVhciB0aGUgcmVzdCBvZiB0aGUgZGlzcGxheSAqLworCXdpbmRnb3RvKChpbnQpUm93cyAtIDEsIDApOwkvKiBtYXkgaGF2ZSBtb3ZlZCB0aGUgY3Vyc29yICovCisgICAgfQorfQorCisgICAgdm9pZAorbWNoX2V4aXQocikKKyAgICBpbnQgcjsKK3sKKyAgICBleGl0aW5nID0gVFJVRTsKKworI2lmIGRlZmluZWQoRkVBVF9YMTEpICYmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpCisgICAgeDExX2V4cG9ydF9maW5hbF9zZWxlY3Rpb24oKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoIWd1aS5pbl91c2UpCisjZW5kaWYKKyAgICB7CisJc2V0dG1vZGUoVE1PREVfQ09PSyk7CisjaWZkZWYgRkVBVF9USVRMRQorCW1jaF9yZXN0b3JlX3RpdGxlKDMpOwkvKiByZXN0b3JlIHh0ZXJtIHRpdGxlIGFuZCBpY29uIG5hbWUgKi8KKyNlbmRpZgorCS8qCisJICogV2hlbiB0X3RpIGlzIG5vdCBlbXB0eSBidXQgaXQgZG9lc24ndCBjYXVzZSBzd2FwcGluZyB0ZXJtaW5hbAorCSAqIHBhZ2VzLCBuZWVkIHRvIG91dHB1dCBhIG5ld2xpbmUgd2hlbiBtc2dfZGlkb3V0IGlzIHNldC4gIEJ1dCB3aGVuCisJICogdF90aSBkb2VzIHN3YXAgcGFnZXMgaXQgc2hvdWxkIG5vdCBnbyB0byB0aGUgc2hlbGwgcGFnZS4gIERvIHRoaXMKKwkgKiBiZWZvcmUgc3RvcHRlcm1jYXAoKS4KKwkgKi8KKwlpZiAoc3dhcHBpbmdfc2NyZWVuKCkgJiYgIW5ld2xpbmVfb25fZXhpdCkKKwkgICAgZXhpdF9zY3JvbGwoKTsKKworCS8qIFN0b3AgdGVybWNhcDogTWF5IG5lZWQgdG8gY2hlY2sgZm9yIFRfQ1JWIHJlc3BvbnNlLCB3aGljaAorCSAqIHJlcXVpcmVzIFJBVyBtb2RlLiAqLworCXN0b3B0ZXJtY2FwKCk7CisKKwkvKgorCSAqIEEgbmV3bGluZSBpcyBvbmx5IHJlcXVpcmVkIGFmdGVyIGEgbWVzc2FnZSBpbiB0aGUgYWx0ZXJuYXRlIHNjcmVlbi4KKwkgKiBUaGlzIGlzIHNldCB0byBUUlVFIGJ5IHdhaXRfcmV0dXJuKCkuCisJICovCisJaWYgKCFzd2FwcGluZ19zY3JlZW4oKSB8fCBuZXdsaW5lX29uX2V4aXQpCisJICAgIGV4aXRfc2Nyb2xsKCk7CisKKwkvKiBDdXJzb3IgbWF5IGhhdmUgYmVlbiBzd2l0Y2hlZCBvZmYgd2l0aG91dCBjYWxsaW5nIHN0YXJ0dGVybWNhcCgpCisJICogd2hlbiBkb2luZyAidmltIC11IHZpbXJjIiBhbmQgdmltcmMgY29udGFpbnMgIjpxIi4gKi8KKwlpZiAoZnVsbF9zY3JlZW4pCisJICAgIGN1cnNvcl9vbigpOworICAgIH0KKyAgICBvdXRfZmx1c2goKTsKKyAgICBtbF9jbG9zZV9hbGwoVFJVRSk7CQkvKiByZW1vdmUgYWxsIG1lbWZpbGVzICovCisgICAgbWF5X2NvcmVfZHVtcCgpOworI2lmZGVmIEZFQVRfR1VJCisjIGlmbmRlZiBGRUFUX0dVSV9CRU9TCQkvKiBCZU9TIGFsd2F5cyBoYXMgR1VJICovCisgICAgaWYgKGd1aS5pbl91c2UpCisjIGVuZGlmCisJZ3VpX2V4aXQocik7CisjZW5kaWYKKyNpZmRlZiBfX1FOWF9fCisgICAgLyogQSBjb3JlIGR1bXAgd29uJ3QgYmUgY3JlYXRlZCBpZiB0aGUgc2lnbmFsIGhhbmRsZXIKKyAgICAgKiBkb2Vzbid0IHJldHVybiwgc28gd2UgY2FuJ3QgY2FsbCBleGl0KCkgKi8KKyAgICBpZiAoZGVhZGx5X3NpZ25hbCAhPSAwKQorCXJldHVybjsKKyNlbmRpZgorCisgICAgZXhpdChyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCittYXlfY29yZV9kdW1wKCkKK3sKKyAgICBpZiAoZGVhZGx5X3NpZ25hbCAhPSAwKQorICAgIHsKKwlzaWduYWwoZGVhZGx5X3NpZ25hbCwgU0lHX0RGTCk7CisJa2lsbChnZXRwaWQoKSwgZGVhZGx5X3NpZ25hbCk7CS8qIERpZSB1c2luZyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworICAgIH0KK30KKworI2lmbmRlZiBWTVMKKworICAgIHZvaWQKK21jaF9zZXR0bW9kZSh0bW9kZSkKKyAgICBpbnQJCXRtb2RlOworeworICAgIHN0YXRpYyBpbnQgZmlyc3QgPSBUUlVFOworCisgICAgLyogV2h5IGlzIE5lWFQgZXhjbHVkZWQgaGVyZSAoYW5kIG5vdCBpbiBvc191bml4eC5oKT8gKi8KKyNpZiBkZWZpbmVkKEVDSE9FKSAmJiBkZWZpbmVkKElDQU5PTikgJiYgKGRlZmluZWQoSEFWRV9URVJNSU9fSCkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfSCkpICYmICFkZWZpbmVkKF9fTmVYVF9fKQorICAgIC8qCisgICAgICogZm9yICJuZXciIHR0eSBzeXN0ZW1zCisgICAgICovCisjIGlmZGVmIEhBVkVfVEVSTUlPU19ICisgICAgc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRvbGQ7CisJICAgc3RydWN0IHRlcm1pb3MgdG5ldzsKKyMgZWxzZQorICAgIHN0YXRpYyBzdHJ1Y3QgdGVybWlvIHRvbGQ7CisJICAgc3RydWN0IHRlcm1pbyB0bmV3OworIyBlbmRpZgorCisgICAgaWYgKGZpcnN0KQorICAgIHsKKwlmaXJzdCA9IEZBTFNFOworIyBpZiBkZWZpbmVkKEhBVkVfVEVSTUlPU19IKQorCXRjZ2V0YXR0cihyZWFkX2NtZF9mZCwgJnRvbGQpOworIyBlbHNlCisJaW9jdGwocmVhZF9jbWRfZmQsIFRDR0VUQSwgJnRvbGQpOworIyBlbmRpZgorICAgIH0KKworICAgIHRuZXcgPSB0b2xkOworICAgIGlmICh0bW9kZSA9PSBUTU9ERV9SQVcpCisgICAgeworCS8qCisJICogfklDUk5MIGVuYWJsZXMgdHlwaW5nIF5WXk0KKwkgKi8KKwl0bmV3LmNfaWZsYWcgJj0gfklDUk5MOworCXRuZXcuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBJU0lHIHwgRUNIT0UKKyMgaWYgZGVmaW5lZChJRVhURU4pICYmICFkZWZpbmVkKF9fTUlOVF9fKQorCQkgICAgfCBJRVhURU4JICAgIC8qIElFWFRFTiBlbmFibGVzIHR5cGluZyBeViBvbiBTT0xBUklTICovCisJCQkJICAgIC8qIGJ1dCBpdCBicmVha3MgZnVuY3Rpb24ga2V5cyBvbiBNSU5UICovCisjIGVuZGlmCisJCQkJKTsKKyMgaWZkZWYgT05MQ1IJICAgIC8qIGRvbid0IG1hcCBOTCAtPiBDUiBOTCwgd2UgZG8gaXQgb3Vyc2VsdmVzICovCisJdG5ldy5jX29mbGFnICY9IH5PTkxDUjsKKyMgZW5kaWYKKwl0bmV3LmNfY2NbVk1JTl0gPSAxOwkJLyogcmV0dXJuIGFmdGVyIDEgY2hhciAqLworCXRuZXcuY19jY1tWVElNRV0gPSAwOwkJLyogZG9uJ3Qgd2FpdCAqLworICAgIH0KKyAgICBlbHNlIGlmICh0bW9kZSA9PSBUTU9ERV9TTEVFUCkKKwl0bmV3LmNfbGZsYWcgJj0gfihFQ0hPKTsKKworIyBpZiBkZWZpbmVkKEhBVkVfVEVSTUlPU19IKQorICAgIHsKKwlpbnQJbiA9IDEwOworCisJLyogQSBzaWduYWwgbWF5IGNhdXNlIHRjc2V0YXR0cigpIHRvIGZhaWwgKGUuZy4sIFNJR0NPTlQpLiAgUmV0cnkgYQorCSAqIGZldyB0aW1lcy4gKi8KKwl3aGlsZSAodGNzZXRhdHRyKHJlYWRfY21kX2ZkLCBUQ1NBTk9XLCAmdG5ldykgPT0gLTEKKwkJCQkJCSAgICYmIGVycm5vID09IEVJTlRSICYmIG4gPiAwKQorCSAgICAtLW47CisgICAgfQorIyBlbHNlCisgICAgaW9jdGwocmVhZF9jbWRfZmQsIFRDU0VUQSwgJnRuZXcpOworIyBlbmRpZgorCisjZWxzZQorCisgICAgLyoKKyAgICAgKiBmb3IgIm9sZCIgdHR5IHN5c3RlbXMKKyAgICAgKi8KKyMgaWZuZGVmIFRJT0NTRVROCisjICBkZWZpbmUgVElPQ1NFVE4gVElPQ1NFVFAJLyogZm9yIGhwdXggOS4wICovCisjIGVuZGlmCisgICAgc3RhdGljIHN0cnVjdCBzZ3R0eWIgdHR5Ym9sZDsKKwkgICBzdHJ1Y3Qgc2d0dHliIHR0eWJuZXc7CisKKyAgICBpZiAoZmlyc3QpCisgICAgeworCWZpcnN0ID0gRkFMU0U7CisJaW9jdGwocmVhZF9jbWRfZmQsIFRJT0NHRVRQLCAmdHR5Ym9sZCk7CisgICAgfQorCisgICAgdHR5Ym5ldyA9IHR0eWJvbGQ7CisgICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKKyAgICB7CisJdHR5Ym5ldy5zZ19mbGFncyAmPSB+KENSTU9EIHwgRUNITyk7CisJdHR5Ym5ldy5zZ19mbGFncyB8PSBSQVc7CisgICAgfQorICAgIGVsc2UgaWYgKHRtb2RlID09IFRNT0RFX1NMRUVQKQorCXR0eWJuZXcuc2dfZmxhZ3MgJj0gfihFQ0hPKTsKKyAgICBpb2N0bChyZWFkX2NtZF9mZCwgVElPQ1NFVE4sICZ0dHlibmV3KTsKKyNlbmRpZgorICAgIGN1cnJfdG1vZGUgPSB0bW9kZTsKK30KKworLyoKKyAqIFRyeSB0byBnZXQgdGhlIGNvZGUgZm9yICJ0X2tiIiBmcm9tIHRoZSBzdHR5IHNldHRpbmcKKyAqCisgKiBFdmVuIGlmIHRlcm1jYXAgY2xhaW1zIGEgYmFja3NwYWNlIGtleSwgdGhlIHVzZXIncyBzZXR0aW5nICpzaG91bGQqCisgKiBwcmV2YWlsLiAgc3R0eSBrbm93cyBtb3JlIGFib3V0IHJlYWxpdHkgdGhhbiB0ZXJtY2FwIGRvZXMsIGFuZCBpZgorICogc29tZWJvZHkncyB1c3VhbCBlcmFzZSBrZXkgaXMgREVMICh3aGljaCwgZm9yIG1vc3QgQlNEIHVzZXJzLCBpdCB3aWxsCisgKiBiZSksIHRoZXkncmUgZ29pbmcgdG8gZ2V0IHJlYWxseSBhbm5veWVkIGlmIHRoZWlyIGVyYXNlIGtleSBzdGFydHMKKyAqIGRvaW5nIGZvcndhcmQgZGVsZXRlcyBmb3Igbm8gcmVhc29uLiAoRXJpYyBGaXNjaGVyKQorICovCisgICAgdm9pZAorZ2V0X3N0dHkoKQoreworICAgIGNoYXJfdSAgYnVmWzJdOworICAgIGNoYXJfdSAgKnA7CisKKyAgICAvKiBXaHkgaXMgTmVYVCBleGNsdWRlZCBoZXJlIChhbmQgbm90IGluIG9zX3VuaXh4LmgpPyAqLworI2lmIGRlZmluZWQoRUNIT0UpICYmIGRlZmluZWQoSUNBTk9OKSAmJiAoZGVmaW5lZChIQVZFX1RFUk1JT19IKSB8fCBkZWZpbmVkKEhBVkVfVEVSTUlPU19IKSkgJiYgIWRlZmluZWQoX19OZVhUX18pCisgICAgLyogZm9yICJuZXciIHR0eSBzeXN0ZW1zICovCisjIGlmZGVmIEhBVkVfVEVSTUlPU19ICisgICAgc3RydWN0IHRlcm1pb3Mga2V5czsKKyMgZWxzZQorICAgIHN0cnVjdCB0ZXJtaW8ga2V5czsKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKEhBVkVfVEVSTUlPU19IKQorICAgIGlmICh0Y2dldGF0dHIocmVhZF9jbWRfZmQsICZrZXlzKSAhPSAtMSkKKyMgZWxzZQorICAgIGlmIChpb2N0bChyZWFkX2NtZF9mZCwgVENHRVRBLCAma2V5cykgIT0gLTEpCisjIGVuZGlmCisgICAgeworCWJ1ZlswXSA9IGtleXMuY19jY1tWRVJBU0VdOworCWludHJfY2hhciA9IGtleXMuY19jY1tWSU5UUl07CisjZWxzZQorICAgIC8qIGZvciAib2xkIiB0dHkgc3lzdGVtcyAqLworICAgIHN0cnVjdCBzZ3R0eWIga2V5czsKKworICAgIGlmIChpb2N0bChyZWFkX2NtZF9mZCwgVElPQ0dFVFAsICZrZXlzKSAhPSAtMSkKKyAgICB7CisJYnVmWzBdID0ga2V5cy5zZ19lcmFzZTsKKwlpbnRyX2NoYXIgPSBrZXlzLnNnX2tpbGw7CisjZW5kaWYKKwlidWZbMV0gPSBOVUw7CisJYWRkX3Rlcm1jb2RlKChjaGFyX3UgKikia2IiLCBidWYsIEZBTFNFKTsKKworCS8qCisJICogSWYgPEJTPiBhbmQgPERFTD4gYXJlIG5vdyB0aGUgc2FtZSwgcmVkZWZpbmUgPERFTD4uCisJICovCisJcCA9IGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKSJrRCIpOworCWlmIChwICE9IE5VTEwgJiYgcFswXSA9PSBidWZbMF0gJiYgcFsxXSA9PSBidWZbMV0pCisJICAgIGRvX2ZpeGRlbChOVUxMKTsKKyAgICB9CisjaWYgMAorICAgIH0JICAgIC8qIHRvIGtlZXAgY2luZGVudCBoYXBweSAqLworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBWTVMgICovCisKKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0VfVFRZKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNldCBtb3VzZSBjbGlja3Mgb24gb3Igb2ZmLgorICovCisgICAgdm9pZAorbWNoX3NldG1vdXNlKG9uKQorICAgIGludAkJb247Cit7CisgICAgc3RhdGljIGludAlpc29uID0gRkFMU0U7CisgICAgaW50CQl4dGVybV9tb3VzZV92ZXJzOworCisgICAgaWYgKG9uID09IGlzb24pCS8qIHJldHVybiBxdWlja2x5IGlmIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisKKyAgICB4dGVybV9tb3VzZV92ZXJzID0gdXNlX3h0ZXJtX21vdXNlKCk7CisgICAgaWYgKHh0ZXJtX21vdXNlX3ZlcnMgPiAwKQorICAgIHsKKwlpZiAob24pCS8qIGVuYWJsZSBtb3VzZSBldmVudHMsIHVzZSBtb3VzZSB0cmFja2luZyBpZiBhdmFpbGFibGUgKi8KKwkgICAgb3V0X3N0cl9uZigoY2hhcl91ICopCisJCSAgICAgICAoeHRlcm1fbW91c2VfdmVycyA+IDEKKwkJCT8gSUZfRUIoIlwwMzNbPzEwMDJoIiwgRVNDX1NUUiAiWz8xMDAyaCIpCisJCQk6IElGX0VCKCJcMDMzWz8xMDAwaCIsIEVTQ19TVFIgIls/MTAwMGgiKSkpOworCWVsc2UJLyogZGlzYWJsZSBtb3VzZSBldmVudHMsIGNvdWxkIHByb2JhYmx5IGFsd2F5cyBzZW5kIHRoZSBzYW1lICovCisJICAgIG91dF9zdHJfbmYoKGNoYXJfdSAqKQorCQkgICAgICAgKHh0ZXJtX21vdXNlX3ZlcnMgPiAxCisJCQk/IElGX0VCKCJcMDMzWz8xMDAybCIsIEVTQ19TVFIgIls/MTAwMmwiKQorCQkJOiBJRl9FQigiXDAzM1s/MTAwMGwiLCBFU0NfU1RSICJbPzEwMDBsIikpKTsKKwlpc29uID0gb247CisgICAgfQorCisjIGlmZGVmIEZFQVRfTU9VU0VfREVDCisgICAgZWxzZSBpZiAodHR5bV9mbGFncyA9PSBUVFlNX0RFQykKKyAgICB7CisJaWYgKG9uKQkvKiBlbmFibGUgbW91c2UgZXZlbnRzICovCisJICAgIG91dF9zdHJfbmYoKGNoYXJfdSAqKSJcMDMzWzE7Mid6XDAzM1sxOzMneyIpOworCWVsc2UJLyogZGlzYWJsZSBtb3VzZSBldmVudHMgKi8KKwkgICAgb3V0X3N0cl9uZigoY2hhcl91ICopIlwwMzNbJ3oiKTsKKwlpc29uID0gb247CisgICAgfQorIyBlbmRpZgorCisjIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisgICAgZWxzZQorICAgIHsKKwlpZiAob24pCisJeworCSAgICBpZiAoZ3BtX29wZW4oKSkKKwkJaXNvbiA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJICAgIGdwbV9jbG9zZSgpOworCSAgICBpc29uID0gRkFMU0U7CisJfQorICAgIH0KKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX01PVVNFX0pTQgorICAgIGVsc2UKKyAgICB7CisJaWYgKG9uKQorCXsKKwkgICAgLyogRCAtIEVuYWJsZSBNb3VzZSB1cC9kb3duIG1lc3NhZ2VzCisJICAgICAqIEwgLSBFbmFibGUgTGVmdCBCdXR0b24gUmVwb3J0aW5nCisJICAgICAqIE0gLSBFbmFibGUgTWlkZGxlIEJ1dHRvbiBSZXBvcnRpbmcKKwkgICAgICogUiAtIEVuYWJsZSBSaWdodCBCdXR0b24gUmVwb3J0aW5nCisJICAgICAqIEsgLSBFbmFibGUgU0hJRlQgYW5kIENUUkwga2V5IFJlcG9ydGluZworCSAgICAgKiArIC0gRW5hYmxlIEFkdmFuY2VkIG1lc3NhZ2luZyBvZiBtb3VzZSBtb3ZlcyBhbmQgdXAvZG93biBtZXNzYWdlcworCSAgICAgKiBRIC0gUXVpZXQgTm8gQWNrCisJICAgICAqICMgLSBOdW1lcmljIHZhbHVlIG9mIG1vdXNlIHBvaW50ZXIgcmVxdWlyZWQKKwkgICAgICoJICAwID0gTXVsdGl2aWV3IDIwMDAgY3Vyc29yLCB1c2VkIGFzIHN0YW5kYXJkCisJICAgICAqCSAgMSA9IFdpbmRvd3MgQXJyb3cKKwkgICAgICoJICAyID0gV2luZG93cyBJIEJlYW0KKwkgICAgICoJICAzID0gV2luZG93cyBIb3VyIEdsYXNzCisJICAgICAqCSAgNCA9IFdpbmRvd3MgQ3Jvc3MgSGFpcgorCSAgICAgKgkgIDUgPSBXaW5kb3dzIFVQIEFycm93CisJICAgICAqLworI2lmZGVmIEpTQlRFUk1fTU9VU0VfTk9OQURWQU5DRUQgLyogRGlzYWJsZXMgZnVsbCBmZWVkYmFjayBvZiBwb2ludGVyIG1vdmVtZW50cyAqLworCSAgICBvdXRfc3RyX25mKChjaGFyX3UgKilJRl9FQigiXDAzM1swflp3TE1SSzFRXDAzM1xcIiwKKwkJCQkJIEVTQ19TVFIgIlswflp3TE1SSzFRIiBFU0NfU1RSICJcXCIpKTsKKyNlbHNlCisJICAgIG91dF9zdHJfbmYoKGNoYXJfdSAqKUlGX0VCKCJcMDMzWzB+WndMTVJLKzFRXDAzM1xcIiwKKwkJCQkJRVNDX1NUUiAiWzB+WndMTVJLKzFRIiBFU0NfU1RSICJcXCIpKTsKKyNlbmRpZgorCSAgICBpc29uID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkgICAgb3V0X3N0cl9uZigoY2hhcl91ICopSUZfRUIoIlwwMzNbMH5ad1FcMDMzXFwiLAorCQkJCQkgICAgICBFU0NfU1RSICJbMH5ad1EiIEVTQ19TVFIgIlxcIikpOworCSAgICBpc29uID0gRkFMU0U7CisJfQorICAgIH0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQorICAgIGVsc2UKKyAgICB7CisJLyogMSA9IGJ1dHRvbiBwcmVzcywgNiA9IHJlbGVhc2UsIDcgPSBkcmFnLCAxaC4uLjlsID0gcmlnaHQgYnV0dG9uICovCisJaWYgKG9uKQorCSAgICBvdXRfc3RyX25mKCJcMDMzWz4xaFwwMzNbPjZoXDAzM1s+N2hcMDMzWz4xaFwwMzNbPjlsIik7CisJZWxzZQorCSAgICBvdXRfc3RyX25mKCJcMDMzWz4xbFwwMzNbPjZsXDAzM1s+N2xcMDMzWz4xbFwwMzNbPjloIik7CisJaXNvbiA9IG9uOworICAgIH0KKyMgZW5kaWYKK30KKworLyoKKyAqIFNldCB0aGUgbW91c2UgdGVybWNvZGUsIGRlcGVuZGluZyBvbiB0aGUgJ3Rlcm0nIGFuZCAndHR5bW91c2UnIG9wdGlvbnMuCisgKi8KKyAgICB2b2lkCitjaGVja19tb3VzZV90ZXJtY29kZSgpCit7CisjIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KKyAgICBpZiAodXNlX3h0ZXJtX21vdXNlKCkKKyMgIGlmZGVmIEZFQVRfR1VJCisJICAgICYmICFndWkuaW5fdXNlCisjICBlbmRpZgorCSAgICApCisgICAgeworCXNldF9tb3VzZV90ZXJtY29kZShLU19NT1VTRSwgKGNoYXJfdSAqKSh0ZXJtX2lzXzhiaXQoVF9OQU1FKQorCQkgID8gSUZfRUIoIlwyMzNNIiwgQ1NJX1NUUiAiTSIpIDogSUZfRUIoIlwwMzNbTSIsIEVTQ19TVFIgIltNIikpKTsKKwlpZiAoKnBfbW91c2UgIT0gTlVMKQorCXsKKwkgICAgLyogZm9yY2UgbW91c2Ugb2ZmIGFuZCBtYXliZSBvbiB0byBzZW5kIHBvc3NpYmx5IG5ldyBtb3VzZQorCSAgICAgKiBhY3RpdmF0aW9uIHNlcXVlbmNlIHRvIHRoZSB4dGVybSwgd2l0aChvdXQpIGRyYWcgdHJhY2luZy4gKi8KKwkgICAgbWNoX3NldG1vdXNlKEZBTFNFKTsKKwkgICAgc2V0bW91c2UoKTsKKwl9CisgICAgfQorICAgIGVsc2UKKwlkZWxfbW91c2VfdGVybWNvZGUoS1NfTU9VU0UpOworIyBlbmRpZgorCisjIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisgICAgaWYgKCF1c2VfeHRlcm1fbW91c2UoKQorIyAgaWZkZWYgRkVBVF9HVUkKKwkgICAgJiYgIWd1aS5pbl91c2UKKyMgIGVuZGlmCisJICAgICkKKwlzZXRfbW91c2VfdGVybWNvZGUoS1NfTU9VU0UsIChjaGFyX3UgKilJRl9FQigiXDAzM01HIiwgRVNDX1NUUiAiTUciKSk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9NT1VTRV9KU0IKKyAgICAvKiBjb25mbGljdHMgd2l0aCB4dGVybSBtb3VzZTogIlwwMzNbIiBhbmQgIlwwMzNbTSIgPz8/ICovCisgICAgaWYgKCF1c2VfeHRlcm1fbW91c2UoKQorIyAgaWZkZWYgRkVBVF9HVUkKKwkgICAgJiYgIWd1aS5pbl91c2UKKyMgIGVuZGlmCisJICAgICkKKwlzZXRfbW91c2VfdGVybWNvZGUoS1NfSlNCVEVSTV9NT1VTRSwKKwkJCSAgICAgICAoY2hhcl91ICopSUZfRUIoIlwwMzNbMH56dyIsIEVTQ19TVFIgIlswfnp3IikpOworICAgIGVsc2UKKwlkZWxfbW91c2VfdGVybWNvZGUoS1NfSlNCVEVSTV9NT1VTRSk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9NT1VTRV9ORVQKKyAgICAvKiBUaGVyZSBpcyBubyBjb25mbGljdCwgYnV0IG9uZSBtYXkgdHlwZSBFU0MgfSBmcm9tIEluc2VydCBtb2RlLiAgRG9uJ3QKKyAgICAgKiBkZWZpbmUgaXQgaW4gdGhlIEdVSSBvciB3aGVuIHVzaW5nIGFuIHh0ZXJtLiAqLworICAgIGlmICghdXNlX3h0ZXJtX21vdXNlKCkKKyMgIGlmZGVmIEZFQVRfR1VJCisJICAgICYmICFndWkuaW5fdXNlCisjICBlbmRpZgorCSAgICApCisJc2V0X21vdXNlX3Rlcm1jb2RlKEtTX05FVFRFUk1fTU9VU0UsCisJCQkJICAgICAgIChjaGFyX3UgKilJRl9FQigiXDAzM30iLCBFU0NfU1RSICJ9IikpOworICAgIGVsc2UKKwlkZWxfbW91c2VfdGVybWNvZGUoS1NfTkVUVEVSTV9NT1VTRSk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9NT1VTRV9ERUMKKyAgICAvKiBjb25mbGljdHMgd2l0aCB4dGVybSBtb3VzZTogIlwwMzNbIiBhbmQgIlwwMzNbTSIgKi8KKyAgICBpZiAoIXVzZV94dGVybV9tb3VzZSgpCisjICBpZmRlZiBGRUFUX0dVSQorCSAgICAmJiAhZ3VpLmluX3VzZQorIyAgZW5kaWYKKwkgICAgKQorCXNldF9tb3VzZV90ZXJtY29kZShLU19ERUNfTU9VU0UsCisJCQkJICAgICAgIChjaGFyX3UgKilJRl9FQigiXDAzM1siLCBFU0NfU1RSICJbIikpOworICAgIGVsc2UKKwlkZWxfbW91c2VfdGVybWNvZGUoS1NfREVDX01PVVNFKTsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQorICAgIC8qIHNhbWUgYXMgdGhlIGRlYyBtb3VzZSAqLworICAgIGlmICghdXNlX3h0ZXJtX21vdXNlKCkKKyMgIGlmZGVmIEZFQVRfR1VJCisJICAgICYmICFndWkuaW5fdXNlCisjICBlbmRpZgorCSAgICApCisJc2V0X21vdXNlX3Rlcm1jb2RlKEtTX1BURVJNX01PVVNFLAorCQkJCSAgICAgIChjaGFyX3UgKikgSUZfRUIoIlwwMzNbIiwgRVNDX1NUUiAiWyIpKTsKKyAgICBlbHNlCisJZGVsX21vdXNlX3Rlcm1jb2RlKEtTX1BURVJNX01PVVNFKTsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogc2V0IHNjcmVlbiBtb2RlLCBhbHdheXMgZmFpbHMuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgaW50CittY2hfc2NyZWVubW9kZShhcmcpCisgICAgY2hhcl91ICAgKmFyZzsKK3sKKyAgICBFTVNHKF8oZV9zY3JlZW5tb2RlKSk7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyNpZm5kZWYgVk1TCisKKy8qCisgKiBUcnkgdG8gZ2V0IHRoZSBjdXJyZW50IHdpbmRvdyBzaXplOgorICogMS4gd2l0aCBhbiBpb2N0bCgpLCBtb3N0IGFjY3VyYXRlIG1ldGhvZAorICogMi4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIExJTkVTIGFuZCBDT0xVTU5TCisgKiAzLiBmcm9tIHRoZSB0ZXJtY2FwCisgKiA0LiBrZWVwIHVzaW5nIHRoZSBvbGQgdmFsdWVzCisgKiBSZXR1cm4gT0sgd2hlbiBzaXplIGNvdWxkIGJlIGRldGVybWluZWQsIEZBSUwgb3RoZXJ3aXNlLgorICovCisgICAgaW50CittY2hfZ2V0X3NoZWxsc2l6ZSgpCit7CisgICAgbG9uZwlyb3dzID0gMDsKKyAgICBsb25nCWNvbHVtbnMgPSAwOworICAgIGNoYXJfdQkqcDsKKworICAgIC8qCisgICAgICogRm9yIE9TLzIgdXNlIF9zY3JzaXplKCkuCisgICAgICovCisjIGlmZGVmIF9fRU1YX18KKyAgICB7CisJaW50IHNbMl07CisKKwlfc2Nyc2l6ZShzKTsKKwljb2x1bW5zID0gc1swXTsKKwlyb3dzID0gc1sxXTsKKyAgICB9CisjIGVuZGlmCisKKyAgICAvKgorICAgICAqIDEuIHRyeSB1c2luZyBhbiBpb2N0bC4gSXQgaXMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kLgorICAgICAqCisgICAgICogVHJ5IHVzaW5nIFRJT0NHV0lOU1ogZmlyc3QsIHNvbWUgc3lzdGVtcyB0aGF0IGhhdmUgaXQgYWxzbyBkZWZpbmUKKyAgICAgKiBUSU9DR1NJWkUgYnV0IGRvbid0IGhhdmUgYSBzdHJ1Y3QgdHR5c2l6ZS4KKyAgICAgKi8KKyMgaWZkZWYgVElPQ0dXSU5TWgorICAgIHsKKwlzdHJ1Y3Qgd2luc2l6ZQl3czsKKwlpbnQgZmQgPSAxOworCisJLyogV2hlbiBzdGRvdXQgaXMgbm90IGEgdHR5LCB1c2Ugc3RkaW4gZm9yIHRoZSBpb2N0bCgpLiAqLworCWlmICghaXNhdHR5KGZkKSAmJiBpc2F0dHkocmVhZF9jbWRfZmQpKQorCSAgICBmZCA9IHJlYWRfY21kX2ZkOworCWlmIChpb2N0bChmZCwgVElPQ0dXSU5TWiwgJndzKSA9PSAwKQorCXsKKwkgICAgY29sdW1ucyA9IHdzLndzX2NvbDsKKwkgICAgcm93cyA9IHdzLndzX3JvdzsKKwl9CisgICAgfQorIyBlbHNlIC8qIFRJT0NHV0lOU1ogKi8KKyMgIGlmZGVmIFRJT0NHU0laRQorICAgIHsKKwlzdHJ1Y3QgdHR5c2l6ZQl0czsKKwlpbnQgZmQgPSAxOworCisJLyogV2hlbiBzdGRvdXQgaXMgbm90IGEgdHR5LCB1c2Ugc3RkaW4gZm9yIHRoZSBpb2N0bCgpLiAqLworCWlmICghaXNhdHR5KGZkKSAmJiBpc2F0dHkocmVhZF9jbWRfZmQpKQorCSAgICBmZCA9IHJlYWRfY21kX2ZkOworCWlmIChpb2N0bChmZCwgVElPQ0dTSVpFLCAmdHMpID09IDApCisJeworCSAgICBjb2x1bW5zID0gdHMudHNfY29sczsKKwkgICAgcm93cyA9IHRzLnRzX2xpbmVzOworCX0KKyAgICB9CisjICBlbmRpZiAvKiBUSU9DR1NJWkUgKi8KKyMgZW5kaWYgLyogVElPQ0dXSU5TWiAqLworCisgICAgLyoKKyAgICAgKiAyLiBnZXQgc2l6ZSBmcm9tIGVudmlyb25tZW50CisgICAgICovCisgICAgaWYgKGNvbHVtbnMgPT0gMCB8fCByb3dzID09IDApCisgICAgeworCWlmICgocCA9IChjaGFyX3UgKilnZXRlbnYoIkxJTkVTIikpKQorCSAgICByb3dzID0gYXRvaSgoY2hhciAqKXApOworCWlmICgocCA9IChjaGFyX3UgKilnZXRlbnYoIkNPTFVNTlMiKSkpCisJICAgIGNvbHVtbnMgPSBhdG9pKChjaGFyICopcCk7CisgICAgfQorCisjaWZkZWYgSEFWRV9UR0VURU5UCisgICAgLyoKKyAgICAgKiAzLiB0cnkgcmVhZGluZyAiY28iIGFuZCAibGkiIGVudHJpZXMgZnJvbSB0ZXJtY2FwCisgICAgICovCisgICAgaWYgKGNvbHVtbnMgPT0gMCB8fCByb3dzID09IDApCisJZ2V0bGluZWNvbCgmY29sdW1ucywgJnJvd3MpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIDQuIElmIGV2ZXJ5dGhpbmcgZmFpbHMsIHVzZSB0aGUgb2xkIHZhbHVlcworICAgICAqLworICAgIGlmIChjb2x1bW5zIDw9IDAgfHwgcm93cyA8PSAwKQorCXJldHVybiBGQUlMOworCisgICAgUm93cyA9IHJvd3M7CisgICAgQ29sdW1ucyA9IGNvbHVtbnM7CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogVHJ5IHRvIHNldCB0aGUgd2luZG93IHNpemUgdG8gUm93cyBhbmQgQ29sdW1ucy4KKyAqLworICAgIHZvaWQKK21jaF9zZXRfc2hlbGxzaXplKCkKK3sKKyAgICBpZiAoKlRfQ1dTKQorICAgIHsKKwkvKgorCSAqIE5PVEU6IGlmIHlvdSBnZXQgYW4gZXJyb3IgaGVyZSB0aGF0IHRlcm1fc2V0X3dpbnNpemUoKSBpcworCSAqIHVuZGVmaW5lZCwgY2hlY2sgdGhlIG91dHB1dCBvZiBjb25maWd1cmUuICBJdCBjb3VsZCBwcm9iYWJseSBub3QKKwkgKiBmaW5kIGEgbmN1cnNlcywgdGVybWNhcCBvciB0ZXJtbGliIGxpYnJhcnkuCisJICovCisJdGVybV9zZXRfd2luc2l6ZSgoaW50KVJvd3MsIChpbnQpQ29sdW1ucyk7CisJb3V0X2ZsdXNoKCk7CisJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisgICAgfQorfQorCisjZW5kaWYgLyogVk1TICovCisKKy8qCisgKiBSb3dzIGFuZC9vciBDb2x1bW5zIGhhcyBjaGFuZ2VkLgorICovCisgICAgdm9pZAorbWNoX25ld19zaGVsbHNpemUoKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8uICovCit9CisKKyAgICBpbnQKK21jaF9jYWxsX3NoZWxsKGNtZCwgb3B0aW9ucykKKyAgICBjaGFyX3UJKmNtZDsKKyAgICBpbnQJCW9wdGlvbnM7CS8qIFNIRUxMXyosIHNlZSB2aW0uaCAqLworeworI2lmZGVmIFZNUworICAgIGNoYXIJKmlmbiA9IE5VTEw7CisgICAgY2hhcgkqb2ZuID0gTlVMTDsKKyNlbmRpZgorICAgIGludAkJdG1vZGUgPSBjdXJfdG1vZGU7CisjaWZkZWYgVVNFX1NZU1RFTQkvKiB1c2Ugc3lzdGVtKCkgdG8gc3RhcnQgdGhlIHNoZWxsOiBzaW1wbGUgYnV0IHNsb3cgKi8KKyAgICBpbnQJICAgIHg7CisjIGlmbmRlZiBfX0VNWF9fCisgICAgY2hhcl91ICAqbmV3Y21kOyAgIC8qIG9ubHkgbmVlZGVkIGZvciB1bml4ICovCisjIGVsc2UKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJlZmVycmVkIHNoZWxsIGluIHRoZSBFTVhTSEVMTCBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYnV0CisgICAgICogb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGlzIGFscmVhZHkgaW4gdGhlIGVudmlyb25tZW50KS4KKyAgICAgKiBFbXggdGhlbiB0YWtlcyBjYXJlIG9mIHdoZXRoZXIgdG8gdXNlICIvYyIgb3IgIi1jIiBpbiBhbgorICAgICAqIGludGVsbGlnZW50IHdheS4gU2ltcGx5IHBhc3MgdGhlIHdob2xlIHRoaW5nIHRvIGVteCdzIHN5c3RlbSgpIGNhbGwuCisgICAgICogRW14IGFsc28gc3RhcnRzIGFuIGludGVyYWN0aXZlIHNoZWxsIGlmIHN5c3RlbSgpIGlzIHBhc3NlZCBhbiBlbXB0eQorICAgICAqIHN0cmluZy4KKyAgICAgKi8KKyAgICBjaGFyX3UgKnAsICpvbGQ7CisKKyAgICBpZiAoKChvbGQgPSAoY2hhcl91ICopZ2V0ZW52KCJFTVhTSEVMTCIpKSA9PSBOVUxMKSB8fCBTVFJDTVAob2xkLCBwX3NoKSkKKyAgICB7CisJLyogc2hvdWxkIGNoZWNrIEhBVkVfU0VURU5WLCBidXQgSSBrbm93IHdlIGRvbid0IGhhdmUgaXQuICovCisJcCA9IGFsbG9jKDEwICsgc3RybGVuKHBfc2gpKTsKKwlpZiAocCkKKwl7CisJICAgIHNwcmludGYoKGNoYXIgKilwLCAiRU1YU0hFTEw9JXMiLCBwX3NoKTsKKwkgICAgcHV0ZW52KChjaGFyICopcCk7CS8qIGRvbid0IGZyZWUgdGhlIHBvaW50ZXIhICovCisJfQorICAgIH0KKyMgZW5kaWYKKworICAgIG91dF9mbHVzaCgpOworCisgICAgaWYgKG9wdGlvbnMgJiBTSEVMTF9DT09LRUQpCisJc2V0dG1vZGUoVE1PREVfQ09PSyk7CSAgICAvKiBzZXQgdG8gbm9ybWFsIG1vZGUgKi8KKworIyBpZmRlZiBfX0VNWF9fCisgICAgaWYgKGNtZCA9PSBOVUxMKQorCXggPSBzeXN0ZW0oIiIpOwkvKiB0aGlzIHN0YXJ0cyBhbiBpbnRlcmFjdGl2ZSBzaGVsbCBpbiBlbXggKi8KKyAgICBlbHNlCisJeCA9IHN5c3RlbSgoY2hhciAqKWNtZCk7CisgICAgLyogc3lzdGVtKCkgcmV0dXJucyAtMSB3aGVuIGVycm9yIG9jY3VycyBpbiBzdGFydGluZyBzaGVsbCAqLworICAgIGlmICh4ID09IC0xICYmICFlbXNnX3NpbGVudCkKKyAgICB7CisJTVNHX1BVVFMoXygiXG5DYW5ub3QgZXhlY3V0ZSBzaGVsbCAiKSk7CisJbXNnX291dHRyYW5zKHBfc2gpOworCW1zZ19wdXRjaGFyKCdcbicpOworICAgIH0KKyMgZWxzZSAvKiBub3QgX19FTVhfXyAqLworICAgIGlmIChjbWQgPT0gTlVMTCkKKwl4ID0gc3lzdGVtKChjaGFyICopcF9zaCk7CisgICAgZWxzZQorICAgIHsKKyMgIGlmZGVmIFZNUworCWlmIChvZm4gPSBzdHJjaHIoKGNoYXIgKiljbWQsICc+JykpCisJICAgICpvZm4rKyA9ICdcMCc7CisJaWYgKGlmbiA9IHN0cmNocigoY2hhciAqKWNtZCwgJzwnKSkKKwl7CisJICAgIGNoYXIgKnA7CisKKwkgICAgKmlmbisrID0gJ1wwJzsKKwkgICAgcCA9IHN0cmNocihpZm4sJyAnKTsgLyogY2hvcCBvZmYgYW55IHRyYWlsaW5nIHNwYWNlcyAqLworCSAgICBpZiAocCkKKwkJKnAgPSAnXDAnOworCX0KKwlpZiAob2ZuKQorCSAgICB4ID0gdm1zX3N5cygoY2hhciAqKWNtZCwgb2ZuLCBpZm4pOworCWVsc2UKKwkgICAgeCA9IHN5c3RlbSgoY2hhciAqKWNtZCk7CisjICBlbHNlCisJbmV3Y21kID0gbGFsbG9jKFNUUkxFTihwX3NoKQorCQkrIChleHRyYV9zaGVsbF9hcmcgPT0gTlVMTCA/IDAgOiBTVFJMRU4oZXh0cmFfc2hlbGxfYXJnKSkKKwkJKyBTVFJMRU4ocF9zaGNmKSArIFNUUkxFTihjbWQpICsgNCwgVFJVRSk7CisJaWYgKG5ld2NtZCA9PSBOVUxMKQorCSAgICB4ID0gMDsKKwllbHNlCisJeworCSAgICBzcHJpbnRmKChjaGFyICopbmV3Y21kLCAiJXMgJXMgJXMgJXMiLCBwX3NoLAorCQkgICAgZXh0cmFfc2hlbGxfYXJnID09IE5VTEwgPyAiIiA6IChjaGFyICopZXh0cmFfc2hlbGxfYXJnLAorCQkgICAgKGNoYXIgKilwX3NoY2YsCisJCSAgICAoY2hhciAqKWNtZCk7CisJICAgIHggPSBzeXN0ZW0oKGNoYXIgKiluZXdjbWQpOworCSAgICB2aW1fZnJlZShuZXdjbWQpOworCX0KKyMgIGVuZGlmCisgICAgfQorIyBpZmRlZiBWTVMKKyAgICB4ID0gdm1zX3N5c19zdGF0dXMoeCk7CisjIGVuZGlmCisgICAgaWYgKGVtc2dfc2lsZW50KQorCTsKKyAgICBlbHNlIGlmICh4ID09IDEyNykKKwlNU0dfUFVUUyhfKCJcbkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iKSk7CisjIGVuZGlmCS8qIF9fRU1YX18gKi8KKyAgICBlbHNlIGlmICh4ICYmICEob3B0aW9ucyAmIFNIRUxMX1NJTEVOVCkpCisgICAgeworCU1TR19QVVRTKF8oIlxuc2hlbGwgcmV0dXJuZWQgIikpOworCW1zZ19vdXRudW0oKGxvbmcpeCk7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisgICAgfQorCisgICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKKwlzZXR0bW9kZShUTU9ERV9SQVcpOwkvKiBzZXQgdG8gcmF3IG1vZGUgKi8KKyMgaWZkZWYgRkVBVF9USVRMRQorICAgIHJlc2V0dGl0bGUoKTsKKyMgZW5kaWYKKyAgICByZXR1cm4geDsKKworI2Vsc2UgLyogVVNFX1NZU1RFTSAqLwkgICAgLyogZG9uJ3QgdXNlIHN5c3RlbSgpLCB1c2UgZm9yaygpL2V4ZWMoKSAqLworCisjZGVmaW5lIEVYRUNfRkFJTEVEIDEyMgkgICAgLyogRXhpdCBjb2RlIHdoZW4gc2hlbGwgZGlkbid0IGV4ZWN1dGUuICBEb24ndCB1c2UKKwkJCSAgICAgICAxMjcsIHNvbWUgc2hlbGwgdXNlIHRoYXQgYWxyZWFkeSAqLworCisgICAgY2hhcl91CSpuZXdjbWQgPSBOVUxMOworICAgIHBpZF90CXBpZDsKKyAgICBwaWRfdAl3YWl0X3BpZCA9IDA7CisjIGlmZGVmIEhBVkVfVU5JT05fV0FJVAorICAgIHVuaW9uIHdhaXQJc3RhdHVzOworIyBlbHNlCisgICAgaW50CQlzdGF0dXMgPSAtMTsKKyMgZW5kaWYKKyAgICBpbnQJCXJldHZhbCA9IC0xOworICAgIGNoYXIJKiphcmd2ID0gTlVMTDsKKyAgICBpbnQJCWFyZ2M7CisgICAgaW50CQlpOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWlucXVvdGU7CisjIGlmZGVmIEZFQVRfR1VJCisgICAgaW50CQlwdHlfbWFzdGVyX2ZkID0gLTE7CSAgICAvKiBmb3IgcHR5J3MgKi8KKyAgICBpbnQJCXB0eV9zbGF2ZV9mZCA9IC0xOworICAgIGNoYXIJKnR0eV9uYW1lOworICAgIGludAkJZmRfdG9zaGVsbFsyXTsJICAgIC8qIGZvciBwaXBlcyAqLworICAgIGludAkJZmRfZnJvbXNoZWxsWzJdOworICAgIGludAkJcGlwZV9lcnJvciA9IEZBTFNFOworIyAgaWZkZWYgSEFWRV9TRVRFTlYKKyAgICBjaGFyCWVudmJ1Zls1MF07CisjICBlbHNlCisgICAgc3RhdGljIGNoYXIJZW52YnVmX1Jvd3NbMjBdOworICAgIHN0YXRpYyBjaGFyCWVudmJ1Zl9Db2x1bW5zWzIwXTsKKyMgIGVuZGlmCisjIGVuZGlmCisgICAgaW50CQlkaWRfc2V0dG1vZGUgPSBGQUxTRTsgLyogVFJVRSB3aGVuIHNldHRtb2RlKFRNT0RFX1JBVykgY2FsbGVkICovCisKKyAgICBvdXRfZmx1c2goKTsKKyAgICBpZiAob3B0aW9ucyAmIFNIRUxMX0NPT0tFRCkKKwlzZXR0bW9kZShUTU9ERV9DT09LKTsJCS8qIHNldCB0byBub3JtYWwgbW9kZSAqLworCisgICAgLyoKKyAgICAgKiAxOiBmaW5kIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICAgKiAyOiBzZXBhcmF0ZSB0aGVtIGFuZCBidWlsdCBhcmd2W10KKyAgICAgKi8KKyAgICBuZXdjbWQgPSB2aW1fc3Ryc2F2ZShwX3NoKTsKKyAgICBpZiAobmV3Y21kID09IE5VTEwpCQkvKiBvdXQgb2YgbWVtb3J5ICovCisJZ290byBlcnJvcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQorICAgIHsKKwlwID0gbmV3Y21kOworCWlucXVvdGUgPSBGQUxTRTsKKwlhcmdjID0gMDsKKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKGkgPT0gMSkKKwkJYXJndlthcmdjXSA9IChjaGFyICopcDsKKwkgICAgKythcmdjOworCSAgICB3aGlsZSAoKnAgJiYgKGlucXVvdGUgfHwgKCpwICE9ICcgJyAmJiAqcCAhPSBUQUIpKSkKKwkgICAgeworCQlpZiAoKnAgPT0gJyInKQorCQkgICAgaW5xdW90ZSA9ICFpbnF1b3RlOworCQkrK3A7CisJICAgIH0KKwkgICAgaWYgKCpwID09IE5VTCkKKwkJYnJlYWs7CisJICAgIGlmIChpID09IDEpCisJCSpwKysgPSBOVUw7CisJICAgIHAgPSBza2lwd2hpdGUocCk7CisJfQorCWlmIChpID09IDApCisJeworCSAgICBhcmd2ID0gKGNoYXIgKiopYWxsb2MoKHVuc2lnbmVkKSgoYXJnYyArIDQpICogc2l6ZW9mKGNoYXIgKikpKTsKKwkgICAgaWYgKGFyZ3YgPT0gTlVMTCkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKwkJZ290byBlcnJvcjsKKwl9CisgICAgfQorICAgIGlmIChjbWQgIT0gTlVMTCkKKyAgICB7CisJaWYgKGV4dHJhX3NoZWxsX2FyZyAhPSBOVUxMKQorCSAgICBhcmd2W2FyZ2MrK10gPSAoY2hhciAqKWV4dHJhX3NoZWxsX2FyZzsKKwlhcmd2W2FyZ2MrK10gPSAoY2hhciAqKXBfc2hjZjsKKwlhcmd2W2FyZ2MrK10gPSAoY2hhciAqKWNtZDsKKyAgICB9CisgICAgYXJndlthcmdjXSA9IE5VTEw7CisKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICAvKgorICAgICAqIEZvciB0aGUgR1VJOiBUcnkgdXNpbmcgYSBwc2V1ZG8tdHR5IHRvIGdldCB0aGUgc3RkaW4vc3Rkb3V0IG9mIHRoZQorICAgICAqIGV4ZWN1dGVkIGNvbW1hbmQgaW50byB0aGUgVmltIHdpbmRvdy4gIE9yIHVzZSBhIHBpcGUuCisgICAgICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgc2hvd19zaGVsbF9tZXNzKQorICAgIHsKKwkvKgorCSAqIFRyeSB0byBvcGVuIGEgbWFzdGVyIHB0eS4KKwkgKiBJZiB0aGlzIHdvcmtzLCBvcGVuIHRoZSBzbGF2ZSBwdHkuCisJICogSWYgdGhlIHNsYXZlIGNhbid0IGJlIG9wZW5lZCwgY2xvc2UgdGhlIG1hc3RlciBwdHkuCisJICovCisJaWYgKHBfZ3VpcHR5KQorCXsKKwkgICAgcHR5X21hc3Rlcl9mZCA9IE9wZW5QVFkoJnR0eV9uYW1lKTsJICAgIC8qIG9wZW4gcHR5ICovCisJICAgIGlmIChwdHlfbWFzdGVyX2ZkID49IDAgJiYgKChwdHlfc2xhdmVfZmQgPQorCQkJCSAgICBvcGVuKHR0eV9uYW1lLCBPX1JEV1IgfCBPX0VYVFJBLCAwKSkgPCAwKSkKKwkgICAgeworCQljbG9zZShwdHlfbWFzdGVyX2ZkKTsKKwkJcHR5X21hc3Rlcl9mZCA9IC0xOworCSAgICB9CisJfQorCS8qCisJICogSWYgbm90IG9wZW5pbmcgYSBwdHkgb3IgaXQgZGlkbid0IHdvcmssIHRyeSB1c2luZyBwaXBlcy4KKwkgKi8KKwlpZiAocHR5X21hc3Rlcl9mZCA8IDApCisJeworCSAgICBwaXBlX2Vycm9yID0gKHBpcGUoZmRfdG9zaGVsbCkgPCAwKTsKKwkgICAgaWYgKCFwaXBlX2Vycm9yKQkJCSAgICAvKiBwaXBlIGNyZWF0ZSBPSyAqLworCSAgICB7CisJCXBpcGVfZXJyb3IgPSAocGlwZShmZF9mcm9tc2hlbGwpIDwgMCk7CisJCWlmIChwaXBlX2Vycm9yKQkJCSAgICAvKiBwaXBlIGNyZWF0ZSBmYWlsZWQgKi8KKwkJeworCQkgICAgY2xvc2UoZmRfdG9zaGVsbFswXSk7CisJCSAgICBjbG9zZShmZF90b3NoZWxsWzFdKTsKKwkJfQorCSAgICB9CisJICAgIGlmIChwaXBlX2Vycm9yKQorCSAgICB7CisJCU1TR19QVVRTKF8oIlxuQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIikpOworCQlvdXRfZmx1c2goKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoIXBpcGVfZXJyb3IpCQkJLyogcHR5IG9yIHBpcGUgb3BlbmVkIG9yIG5vdCB1c2VkICovCisjIGVuZGlmCisKKyAgICB7CisjIGlmZGVmIF9fQkVPU19fCisJYmVvc19jbGVhbnVwX3JlYWRfdGhyZWFkKCk7CisjIGVuZGlmCisJaWYgKChwaWQgPSBmb3JrKCkpID09IC0xKQkvKiBtYXliZSB3ZSBzaG91bGQgdXNlIHZmb3JrKCkgKi8KKwl7CisJICAgIE1TR19QVVRTKF8oIlxuQ2Fubm90IGZvcmtcbiIpKTsKKyMgaWZkZWYgRkVBVF9HVUkKKwkgICAgaWYgKGd1aS5pbl91c2UgJiYgc2hvd19zaGVsbF9tZXNzKQorCSAgICB7CisJCWlmIChwdHlfbWFzdGVyX2ZkID49IDApCQkvKiBjbG9zZSB0aGUgcHNldWRvIHR0eSAqLworCQl7CisJCSAgICBjbG9zZShwdHlfbWFzdGVyX2ZkKTsKKwkJICAgIGNsb3NlKHB0eV9zbGF2ZV9mZCk7CisJCX0KKwkJZWxzZQkJCQkvKiBjbG9zZSB0aGUgcGlwZXMgKi8KKwkJeworCQkgICAgY2xvc2UoZmRfdG9zaGVsbFswXSk7CisJCSAgICBjbG9zZShmZF90b3NoZWxsWzFdKTsKKwkJICAgIGNsb3NlKGZkX2Zyb21zaGVsbFswXSk7CisJCSAgICBjbG9zZShmZF9mcm9tc2hlbGxbMV0pOworCQl9CisJICAgIH0KKyMgZW5kaWYKKwl9CisJZWxzZSBpZiAocGlkID09IDApCS8qIGNoaWxkICovCisJeworCSAgICByZXNldF9zaWduYWxzKCk7CQkvKiBoYW5kbGUgc2lnbmFscyBub3JtYWxseSAqLworCisJICAgIGlmICghc2hvd19zaGVsbF9tZXNzIHx8IChvcHRpb25zICYgU0hFTExfRVhQQU5EKSkKKwkgICAgeworCQlpbnQgZmQ7CisKKwkJLyoKKwkJICogRG9uJ3Qgd2FudCB0byBzaG93IGFueSBtZXNzYWdlIGZyb20gdGhlIHNoZWxsLiAgQ2FuJ3QganVzdAorCQkgKiBjbG9zZSBzdGRvdXQgYW5kIHN0ZGVyciB0aG91Z2gsIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIHdpbGwKKwkJICogYnJlYWsgaWYgeW91IHRyeSB0byB3cml0ZSB0byB0aGVtIGFmdGVyIHRoYXQsIHNvIHdlIG11c3QKKwkJICogdXNlIGR1cCgpIHRvIHJlcGxhY2UgdGhlbSB3aXRoIHNvbWV0aGluZyBlbHNlIC0tIHdlYmIKKwkJICogQ29ubmVjdCBzdGRpbiB0byAvZGV2L251bGwgdG9vLCBzbyAiOm4gYGNhdGAiIGRvZXNuJ3QgaGFuZywKKwkJICogd2FpdGluZyBmb3IgaW5wdXQuCisJCSAqLworCQlmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUiB8IE9fRVhUUkEsIDApOworCQlmY2xvc2Uoc3RkaW4pOworCQlmY2xvc2Uoc3Rkb3V0KTsKKwkJZmNsb3NlKHN0ZGVycik7CisKKwkJLyoKKwkJICogSWYgYW55IG9mIHRoZXNlIG9wZW4oKSdzIGFuZCBkdXAoKSdzIGZhaWwsIHdlIGp1c3QgY29udGludWUKKwkJICogYW55d2F5LiAgSXQncyBub3QgZmF0YWwsIGFuZCBvbiBtb3N0IHN5c3RlbXMgaXQgd2lsbCBtYWtlCisJCSAqIG5vIGRpZmZlcmVuY2UgYXQgYWxsLiAgT24gYSBmZXcgaXQgd2lsbCBjYXVzZSB0aGUgZXhlY3ZwKCkKKwkJICogdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gc3RhdHVzIGV2ZW4gd2hlbiB0aGUgY29tcGxldGlvbgorCQkgKiBjb3VsZCBiZSBkb25lLCB3aGljaCBpcyBub3RoaW5nIHRvbyBzZXJpb3VzLiAgSWYgdGhlIG9wZW4oKQorCQkgKiBvciBkdXAoKSBmYWlsZWQgd2UnZCBqdXN0IGRvIHRoZSBzYW1lIHRoaW5nIG91cnNlbHZlcworCQkgKiBhbnl3YXkgLS0gd2ViYgorCQkgKi8KKwkJaWYgKGZkID49IDApCisJCXsKKwkJICAgIGR1cChmZCk7IC8qIFRvIHJlcGxhY2Ugc3RkaW4gIChmaWxlIGRlc2NyaXB0b3IgMCkgKi8KKwkJICAgIGR1cChmZCk7IC8qIFRvIHJlcGxhY2Ugc3Rkb3V0IChmaWxlIGRlc2NyaXB0b3IgMSkgKi8KKwkJICAgIGR1cChmZCk7IC8qIFRvIHJlcGxhY2Ugc3RkZXJyIChmaWxlIGRlc2NyaXB0b3IgMikgKi8KKworCQkgICAgLyogRG9uJ3QgbmVlZCB0aGlzIG5vdyB0aGF0IHdlJ3ZlIGR1cGxpY2F0ZWQgaXQgKi8KKwkJICAgIGNsb3NlKGZkKTsKKwkJfQorCSAgICB9CisjIGlmZGVmIEZFQVRfR1VJCisJICAgIGVsc2UgaWYgKGd1aS5pbl91c2UpCisJICAgIHsKKworIyAgaWZkZWYgSEFWRV9TRVRTSUQKKwkJKHZvaWQpc2V0c2lkKCk7CisjICBlbmRpZgorCQkvKiBwdXNoIHN0cmVhbSBkaXNjaXBsaW5lIG1vZHVsZXMgKi8KKwkJaWYgKG9wdGlvbnMgJiBTSEVMTF9DT09LRUQpCisJCSAgICBTZXR1cFNsYXZlUFRZKHB0eV9zbGF2ZV9mZCk7CisjICBpZmRlZiBUSU9DU0NUVFkKKwkJLyogdHJ5IHRvIGJlY29tZSBjb250cm9sbGluZyB0dHkgKHByb2JhYmx5IGRvZXNuJ3Qgd29yaywKKwkJICogdW5sZXNzIHJ1biBieSByb290KSAqLworCQlpb2N0bChwdHlfc2xhdmVfZmQsIFRJT0NTQ1RUWSwgKGNoYXIgKilOVUxMKTsKKyMgIGVuZGlmCisJCS8qIFNpbXVsYXRlIHRvIGhhdmUgYSBkdW1iIHRlcm1pbmFsIChmb3Igbm93KSAqLworIyAgaWZkZWYgSEFWRV9TRVRFTlYKKwkJc2V0ZW52KCJURVJNIiwgImR1bWIiLCAxKTsKKwkJc3ByaW50ZigoY2hhciAqKWVudmJ1ZiwgIiVsZCIsIFJvd3MpOworCQlzZXRlbnYoIlJPV1MiLCAoY2hhciAqKWVudmJ1ZiwgMSk7CisJCXNwcmludGYoKGNoYXIgKillbnZidWYsICIlbGQiLCBSb3dzKTsKKwkJc2V0ZW52KCJMSU5FUyIsIChjaGFyICopZW52YnVmLCAxKTsKKwkJc3ByaW50ZigoY2hhciAqKWVudmJ1ZiwgIiVsZCIsIENvbHVtbnMpOworCQlzZXRlbnYoIkNPTFVNTlMiLCAoY2hhciAqKWVudmJ1ZiwgMSk7CisjICBlbHNlCisJCS8qCisJCSAqIFB1dGVudiBkb2VzIG5vdCBjb3B5IHRoZSBzdHJpbmcsIGl0IGhhcyB0byByZW1haW4gdmFsaWQuCisJCSAqIFVzZSBhIHN0YXRpYyBhcnJheSB0byBhdm9pZCBsb29zaW5nIGFsbG9jYXRlZCBtZW1vcnkuCisJCSAqLworCQlwdXRlbnYoIlRFUk09ZHVtYiIpOworCQlzcHJpbnRmKGVudmJ1Zl9Sb3dzLCAiUk9XUz0lbGQiLCBSb3dzKTsKKwkJcHV0ZW52KGVudmJ1Zl9Sb3dzKTsKKwkJc3ByaW50ZihlbnZidWZfUm93cywgIkxJTkVTPSVsZCIsIFJvd3MpOworCQlwdXRlbnYoZW52YnVmX1Jvd3MpOworCQlzcHJpbnRmKGVudmJ1Zl9Db2x1bW5zLCAiQ09MVU1OUz0lbGQiLCBDb2x1bW5zKTsKKwkJcHV0ZW52KGVudmJ1Zl9Db2x1bW5zKTsKKyMgIGVuZGlmCisKKwkJaWYgKHB0eV9tYXN0ZXJfZmQgPj0gMCkKKwkJeworCQkgICAgY2xvc2UocHR5X21hc3Rlcl9mZCk7ICAgLyogY2xvc2UgbWFzdGVyIHNpZGUgb2YgcHR5ICovCisKKwkJICAgIC8qIHNldCB1cCBzdGRpbi9zdGRvdXQvc3RkZXJyIGZvciB0aGUgY2hpbGQgKi8KKwkJICAgIGNsb3NlKDApOworCQkgICAgZHVwKHB0eV9zbGF2ZV9mZCk7CisJCSAgICBjbG9zZSgxKTsKKwkJICAgIGR1cChwdHlfc2xhdmVfZmQpOworCQkgICAgY2xvc2UoMik7CisJCSAgICBkdXAocHR5X3NsYXZlX2ZkKTsKKworCQkgICAgY2xvc2UocHR5X3NsYXZlX2ZkKTsgICAgLyogaGFzIGJlZW4gZHVwcGVkLCBjbG9zZSBpdCBub3cgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIHNldCB1cCBzdGRpbiBmb3IgdGhlIGNoaWxkICovCisJCSAgICBjbG9zZShmZF90b3NoZWxsWzFdKTsKKwkJICAgIGNsb3NlKDApOworCQkgICAgZHVwKGZkX3Rvc2hlbGxbMF0pOworCQkgICAgY2xvc2UoZmRfdG9zaGVsbFswXSk7CisKKwkJICAgIC8qIHNldCB1cCBzdGRvdXQgZm9yIHRoZSBjaGlsZCAqLworCQkgICAgY2xvc2UoZmRfZnJvbXNoZWxsWzBdKTsKKwkJICAgIGNsb3NlKDEpOworCQkgICAgZHVwKGZkX2Zyb21zaGVsbFsxXSk7CisJCSAgICBjbG9zZShmZF9mcm9tc2hlbGxbMV0pOworCisJCSAgICAvKiBzZXQgdXAgc3RkZXJyIGZvciB0aGUgY2hpbGQgKi8KKwkJICAgIGNsb3NlKDIpOworCQkgICAgZHVwKDEpOworCQl9CisJICAgIH0KKyMgZW5kaWYgLyogRkVBVF9HVUkgKi8KKwkgICAgLyoKKwkgICAgICogVGhlcmUgaXMgbm8gdHlwZSBjYXN0IGZvciB0aGUgYXJndiwgYmVjYXVzZSB0aGUgdHlwZSBtYXkgYmUKKwkgICAgICogZGlmZmVyZW50IG9uIGRpZmZlcmVudCBtYWNoaW5lcy4gVGhpcyBtYXkgY2F1c2UgYSB3YXJuaW5nCisJICAgICAqIG1lc3NhZ2Ugd2l0aCBzdHJpY3QgY29tcGlsZXJzLCBkb24ndCB3b3JyeSBhYm91dCBpdC4KKwkgICAgICogQ2FsbCBfZXhpdCgpIGluc3RlYWQgb2YgZXhpdCgpIHRvIGF2b2lkIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24KKwkgICAgICogdG8gdGhlIFggc2VydmVyIChlc3AuIHdpdGggR1RLLCB3aGljaCB1c2VzIGF0ZXhpdCgpKS4KKwkgICAgICovCisJICAgIGV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKwkgICAgX2V4aXQoRVhFQ19GQUlMRUQpOwkgICAgLyogZXhlYyBmYWlsZWQsIHJldHVybiBmYWlsdXJlIGNvZGUgKi8KKwl9CisJZWxzZQkJCS8qIHBhcmVudCAqLworCXsKKwkgICAgLyoKKwkgICAgICogV2hpbGUgY2hpbGQgaXMgcnVubmluZywgaWdub3JlIHRlcm1pbmF0aW5nIHNpZ25hbHMuCisJICAgICAqLworCSAgICBjYXRjaF9zaWduYWxzKFNJR19JR04sIFNJR19FUlIpOworCisjIGlmZGVmIEZFQVRfR1VJCisKKwkgICAgLyoKKwkgICAgICogRm9yIHRoZSBHVUkgd2UgcmVkaXJlY3Qgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIHRvIG91ciB3aW5kb3cuCisJICAgICAqLworCSAgICBpZiAoZ3VpLmluX3VzZSAmJiBzaG93X3NoZWxsX21lc3MpCisJICAgIHsKKyMgIGRlZmluZSBCVUZMRU4gMTAwCQkvKiBsZW5ndGggZm9yIGJ1ZmZlciwgcHNldWRvIHR0eSBsaW1pdCBpcyAxMjggKi8KKwkJY2hhcl91CSAgICBidWZmZXJbQlVGTEVOICsgMV07CisjICBpZmRlZiBGRUFUX01CWVRFCisJCWludAkgICAgYnVmZmVyX29mZiA9IDA7CS8qIHZhbGlkIGJ5dGVzIGluIGJ1ZmZlcltdICovCisjICBlbmRpZgorCQljaGFyX3UJICAgIHRhX2J1ZltCVUZMRU4gKyAxXTsJLyogVHlwZUFIZWFkICovCisJCWludAkgICAgdGFfbGVuID0gMDsJCS8qIHZhbGlkIGJ5dGVzIGluIHRhX2J1ZltdICovCisJCWludAkgICAgbGVuOworCQlpbnQJICAgIHBfbW9yZV9zYXZlOworCQlpbnQJICAgIG9sZF9TdGF0ZTsKKwkJaW50CSAgICBjOworCQlpbnQJICAgIHRvc2hlbGxfZmQ7CisJCWludAkgICAgZnJvbXNoZWxsX2ZkOworCisJCWlmIChwdHlfbWFzdGVyX2ZkID49IDApCisJCXsKKwkJICAgIGNsb3NlKHB0eV9zbGF2ZV9mZCk7CS8qIGNsb3NlIHNsYXZlIHNpZGUgb2YgcHR5ICovCisJCSAgICBmcm9tc2hlbGxfZmQgPSBwdHlfbWFzdGVyX2ZkOworCQkgICAgdG9zaGVsbF9mZCA9IGR1cChwdHlfbWFzdGVyX2ZkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGNsb3NlKGZkX3Rvc2hlbGxbMF0pOworCQkgICAgY2xvc2UoZmRfZnJvbXNoZWxsWzFdKTsKKwkJICAgIHRvc2hlbGxfZmQgPSBmZF90b3NoZWxsWzFdOworCQkgICAgZnJvbXNoZWxsX2ZkID0gZmRfZnJvbXNoZWxsWzBdOworCQl9CisKKwkJLyoKKwkJICogV3JpdGUgdG8gdGhlIGNoaWxkIGlmIHRoZXJlIGFyZSB0eXBlZCBjaGFyYWN0ZXJzLgorCQkgKiBSZWFkIGZyb20gdGhlIGNoaWxkIGlmIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGF2YWlsYWJsZS4KKwkJICogICBSZXBlYXQgdGhlIHJlYWRpbmcgYSBmZXcgdGltZXMgaWYgbW9yZSBjaGFyYWN0ZXJzIGFyZQorCQkgKiAgIGF2YWlsYWJsZS4gTmVlZCB0byBjaGVjayBmb3IgdHlwZWQga2V5cyBub3cgYW5kIHRoZW4sIGJ1dAorCQkgKiAgIG5vdCB0b28gb2Z0ZW4gKGRlbGF5cyB3aGVuIG5vIGNoYXJzIGFyZSBhdmFpbGFibGUpLgorCQkgKiBUaGlzIGxvb3AgaXMgcXVpdCBpZiBubyBjaGFyYWN0ZXJzIGNhbiBiZSByZWFkIGZyb20gdGhlIHB0eQorCQkgKiAoV2FpdEZvckNoYXIgZGV0ZWN0ZWQgc3BlY2lhbCBjb25kaXRpb24pLCBvciB0aGVyZSBhcmUgbm8KKwkJICogY2hhcmFjdGVycyBhdmFpbGFibGUgYW5kIHRoZSBjaGlsZCBoYXMgZXhpdGVkLgorCQkgKiBPbmx5IGNoZWNrIGlmIHRoZSBjaGlsZCBoYXMgZXhpdGVkIHdoZW4gdGhlcmUgaXMgbm8gbW9yZQorCQkgKiBvdXRwdXQuIFRoZSBjaGlsZCBtYXkgZXhpdCBiZWZvcmUgYWxsIHRoZSBvdXRwdXQgaGFzCisJCSAqIGJlZW4gcHJpbnRlZC4KKwkJICoKKwkJICogQ3VycmVudGx5IHRoaXMgYnVzeSBsb29wcyEKKwkJICogVGhpcyBjYW4gcHJvYmFibHkgZGVhZC1sb2NrIHdoZW4gdGhlIHdyaXRlIGJsb2NrcyEKKwkJICovCisJCXBfbW9yZV9zYXZlID0gcF9tb3JlOworCQlwX21vcmUgPSBGQUxTRTsKKwkJb2xkX1N0YXRlID0gU3RhdGU7CisJCVN0YXRlID0gRVhURVJOQ01EOwkvKiBkb24ndCByZWRyYXcgYXQgd2luZG93IHJlc2l6ZSAqLworCisJCWZvciAoOzspCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBDaGVjayBpZiBrZXlzIGhhdmUgYmVlbiB0eXBlZCwgd3JpdGUgdGhlbSB0byB0aGUgY2hpbGQKKwkJICAgICAqIGlmIHRoZXJlIGFyZSBhbnkuICBEb24ndCBkbyB0aGlzIGlmIHdlIGFyZSBleHBhbmRpbmcKKwkJICAgICAqIHdpbGQgY2FyZHMgKHdvdWxkIGVhdCB0eXBlYWhlYWQpLiAgRG9uJ3QgZ2V0IGV4dHJhCisJCSAgICAgKiBjaGFyYWN0ZXJzIHdoZW4gd2UgYWxyZWFkeSBoYXZlIG9uZS4KKwkJICAgICAqLworCQkgICAgbGVuID0gMDsKKwkJICAgIGlmICghKG9wdGlvbnMgJiBTSEVMTF9FWFBBTkQpCisJCQkgICAgJiYgKHRhX2xlbiA+IDAKKwkJCQl8fCAobGVuID0gdWlfaW5jaGFyKHRhX2J1ZiwgQlVGTEVOLCAxMEwsCisJCQkJCQkJCSAgICAgMCkpID4gMCkpCisJCSAgICB7CisJCQkvKgorCQkJICogRm9yIHBpcGVzOgorCQkJICogQ2hlY2sgZm9yIENUUkwtQzogc2VuZCBpbnRlcnJ1cHQgc2lnbmFsIHRvIGNoaWxkLgorCQkJICogQ2hlY2sgZm9yIENUUkwtRDogRU9GLCBjbG9zZSBwaXBlIHRvIGNoaWxkLgorCQkJICovCisJCQlpZiAobGVuID09IDEgJiYgKHB0eV9tYXN0ZXJfZmQgPCAwIHx8IGNtZCAhPSBOVUxMKSkKKwkJCXsKKyMgIGlmZGVmIFNJR0lOVAorCQkJICAgIC8qCisJCQkgICAgICogU2VuZCBTSUdJTlQgdG8gdGhlIGNoaWxkJ3MgZ3JvdXAgb3IgYWxsCisJCQkgICAgICogcHJvY2Vzc2VzIGluIG91ciBncm91cC4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAodGFfYnVmW3RhX2xlbl0gPT0gQ3RybF9DCisJCQkJCSAgICAgICB8fCB0YV9idWZbdGFfbGVuXSA9PSBpbnRyX2NoYXIpCisjICAgaWZkZWYgSEFWRV9TRVRTSUQKKwkJCQlraWxsKC1waWQsIFNJR0lOVCk7CisjICAgZWxzZQorCQkJCWtpbGwoMCwgU0lHSU5UKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKwkJCSAgICBpZiAocHR5X21hc3Rlcl9mZCA8IDAgJiYgdG9zaGVsbF9mZCA+PSAwCisJCQkJCSAgICAgICAmJiB0YV9idWZbdGFfbGVuXSA9PSBDdHJsX0QpCisJCQkgICAgeworCQkJCWNsb3NlKHRvc2hlbGxfZmQpOworCQkJCXRvc2hlbGxfZmQgPSAtMTsKKwkJCSAgICB9CisJCQl9CisKKwkJCS8qIHJlcGxhY2UgS19CUyBieSA8QlM+IGFuZCBLX0RFTCBieSA8REVMPiAqLworCQkJZm9yIChpID0gdGFfbGVuOyBpIDwgdGFfbGVuICsgbGVuOyArK2kpCisJCQl7CisJCQkgICAgaWYgKHRhX2J1ZltpXSA9PSBDU0kgJiYgbGVuIC0gaSA+IDIpCisJCQkgICAgeworCQkJCWMgPSBURVJNQ0FQMktFWSh0YV9idWZbaSArIDFdLCB0YV9idWZbaSArIDJdKTsKKwkJCQlpZiAoYyA9PSBLX0RFTCB8fCBjID09IEtfS0RFTCB8fCBjID09IEtfQlMpCisJCQkJeworCQkJCSAgICBtY2hfbWVtbW92ZSh0YV9idWYgKyBpICsgMSwgdGFfYnVmICsgaSArIDMsCisJCQkJCQkgICAgICAgKHNpemVfdCkobGVuIC0gaSAtIDIpKTsKKwkJCQkgICAgaWYgKGMgPT0gS19ERUwgfHwgYyA9PSBLX0tERUwpCisJCQkJCXRhX2J1ZltpXSA9IERFTDsKKwkJCQkgICAgZWxzZQorCQkJCQl0YV9idWZbaV0gPSBDdHJsX0g7CisJCQkJICAgIGxlbiAtPSAyOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAodGFfYnVmW2ldID09ICdccicpCisJCQkJdGFfYnVmW2ldID0gJ1xuJzsKKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJCWkgKz0gKCptYl9wdHIybGVuX2NoZWNrKSh0YV9idWYgKyBpKSAtIDE7CisjICBlbmRpZgorCQkJfQorCisJCQkvKgorCQkJICogRm9yIHBpcGVzOiBlY2hvIHRoZSB0eXBlZCBjaGFyYWN0ZXJzLgorCQkJICogRm9yIGEgcHR5IHRoaXMgZG9lcyBub3Qgc2VlbSB0byB3b3JrLgorCQkJICovCisJCQlpZiAocHR5X21hc3Rlcl9mZCA8IDApCisJCQl7CisJCQkgICAgZm9yIChpID0gdGFfbGVuOyBpIDwgdGFfbGVuICsgbGVuOyArK2kpCisJCQkgICAgeworCQkJCWlmICh0YV9idWZbaV0gPT0gJ1xuJyB8fCB0YV9idWZbaV0gPT0gJ1xiJykKKwkJCQkgICAgbXNnX3B1dGNoYXIodGFfYnVmW2ldKTsKKyMgIGlmZGVmIEZFQVRfTUJZVEUKKwkJCQllbHNlIGlmIChoYXNfbWJ5dGUpCisJCQkJeworCQkJCSAgICBpbnQgbCA9ICgqbWJfcHRyMmxlbl9jaGVjaykodGFfYnVmICsgaSk7CisKKwkJCQkgICAgbXNnX291dHRyYW5zX2xlbih0YV9idWYgKyBpLCBsKTsKKwkJCQkgICAgaSArPSBsIC0gMTsKKwkJCQl9CisjICBlbmRpZgorCQkJCWVsc2UKKwkJCQkgICAgbXNnX291dHRyYW5zX2xlbih0YV9idWYgKyBpLCAxKTsKKwkJCSAgICB9CisJCQkgICAgd2luZGdvdG8obXNnX3JvdywgbXNnX2NvbCk7CisJCQkgICAgb3V0X2ZsdXNoKCk7CisJCQl9CisKKwkJCXRhX2xlbiArPSBsZW47CisKKwkJCS8qCisJCQkgKiBXcml0ZSB0aGUgY2hhcmFjdGVycyB0byB0aGUgY2hpbGQsIHVubGVzcyBFT0YgaGFzCisJCQkgKiBiZWVuIHR5cGVkIGZvciBwaXBlcy4gIFdyaXRlIG9uZSBjaGFyYWN0ZXIgYXQgYQorCQkJICogdGltZSwgdG8gYXZvaWQgbG9vc2luZyB0b28gbXVjaCB0eXBlYWhlYWQuCisJCQkgKi8KKwkJCWlmICh0b3NoZWxsX2ZkID49IDApCisJCQl7CisJCQkgICAgbGVuID0gd3JpdGUodG9zaGVsbF9mZCwgKGNoYXIgKil0YV9idWYsIChzaXplX3QpMSk7CisJCQkgICAgaWYgKGxlbiA+IDApCisJCQkgICAgeworCQkJCXRhX2xlbiAtPSBsZW47CisJCQkJbWNoX21lbW1vdmUodGFfYnVmLCB0YV9idWYgKyBsZW4sIHRhX2xlbik7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICogQ2hlY2sgaWYgdGhlIGNoaWxkIGhhcyBhbnkgY2hhcmFjdGVycyB0byBiZSBwcmludGVkLgorCQkgICAgICogUmVhZCB0aGVtIGFuZCB3cml0ZSB0aGVtIHRvIG91ciB3aW5kb3cuCVJlcGVhdCB0aGlzIGFzCisJCSAgICAgKiBsb25nIGFzIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbywgYXZvaWQgdGhlIDEwbXMgd2FpdAorCQkgICAgICogZm9yIG1jaF9pbmNoYXIoKSwgb3Igc2VuZGluZyB0eXBlYWhlYWQgY2hhcmFjdGVycyB0bworCQkgICAgICogdGhlIGV4dGVybmFsIHByb2Nlc3MuCisJCSAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCBoYW5kbGUgZXNjYXBlIHNlcXVlbmNlcywgY29tcGF0aWJsZQorCQkgICAgICogdG8gc29tZSB0ZXJtaW5hbCAodnQ1Mj8pLgorCQkgICAgICovCisJCSAgICB3aGlsZSAoUmVhbFdhaXRGb3JDaGFyKGZyb21zaGVsbF9mZCwgMTBMLCBOVUxMKSkKKwkJICAgIHsKKwkJCWxlbiA9IHJlYWQoZnJvbXNoZWxsX2ZkLCAoY2hhciAqKWJ1ZmZlcgorIyAgaWZkZWYgRkVBVF9NQllURQorCQkJCSsgYnVmZmVyX29mZiwgKHNpemVfdCkoQlVGTEVOIC0gYnVmZmVyX29mZikKKyMgIGVsc2UKKwkJCQksIChzaXplX3QpQlVGTEVOCisjICBlbmRpZgorCQkJCSk7CisJCQlpZiAobGVuIDw9IDApCQkgICAgLyogZW5kIG9mIGZpbGUgb3IgZXJyb3IgKi8KKwkJCSAgICBnb3RvIGZpbmlzaGVkOworIyAgaWZkZWYgRkVBVF9NQllURQorCQkJbGVuICs9IGJ1ZmZlcl9vZmY7CisJCQlidWZmZXJbbGVuXSA9IE5VTDsKKwkJCWlmIChoYXNfbWJ5dGUpCisJCQl7CisJCQkgICAgaW50CQlsOworCisJCQkgICAgLyogQ2hlY2sgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGluIGJ1ZmZlcltdIGlzCisJCQkgICAgICogaW5jb21wbGV0ZSwga2VlcCB0aGVzZSBieXRlcyBmb3IgdGhlIG5leHQKKwkJCSAgICAgKiByb3VuZC4gKi8KKwkJCSAgICBmb3IgKHAgPSBidWZmZXI7IHAgPCBidWZmZXIgKyBsZW47IHAgKz0gbCkKKwkJCSAgICB7CisJCQkJaWYgKGVuY191dGY4KQkvKiBleGNsdWRlIGNvbXBvc2luZyBjaGFycyAqLworCQkJCSAgICBsID0gdXRmX3B0cjJsZW5fY2hlY2socCk7CisJCQkJZWxzZQorCQkJCSAgICBsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwkJCQlpZiAobCA9PSAwKQorCQkJCSAgICBsID0gMTsgIC8qIE5VTCBieXRlPyAqLworCQkJCWVsc2UgaWYgKE1CX0JZVEUyTEVOKCpwKSAhPSBsKQorCQkJCSAgICBicmVhazsKKwkJCSAgICB9CisJCQkgICAgaWYgKHAgPT0gYnVmZmVyKQkvKiBubyBjb21wbGV0ZSBjaGFyYWN0ZXIgKi8KKwkJCSAgICB7CisJCQkJLyogYXZvaWQgZ2V0dGluZyBzdHVjayBhdCBhbiBpbGxlZ2FsIGJ5dGUgKi8KKwkJCQlpZiAobGVuID49IDEyKQorCQkJCSAgICArK3A7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkgICAgYnVmZmVyX29mZiA9IGxlbjsKKwkJCQkgICAgY29udGludWU7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICBjID0gKnA7CisJCQkgICAgKnAgPSBOVUw7CisJCQkgICAgbXNnX3B1dHMoYnVmZmVyKTsKKwkJCSAgICBpZiAocCA8IGJ1ZmZlciArIGxlbikKKwkJCSAgICB7CisJCQkJKnAgPSBjOworCQkJCWJ1ZmZlcl9vZmYgPSAoYnVmZmVyICsgbGVuKSAtIHA7CisJCQkJbWNoX21lbW1vdmUoYnVmZmVyLCBwLCBidWZmZXJfb2ZmKTsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQkgICAgYnVmZmVyX29mZiA9IDA7CisJCQl9CisJCQllbHNlCisjICBlbmRpZiAvKiBGRUFUX01CWVRFICovCisJCQl7CisJCQkgICAgYnVmZmVyW2xlbl0gPSBOVUw7CisJCQkgICAgbXNnX3B1dHMoYnVmZmVyKTsKKwkJCX0KKworCQkJd2luZGdvdG8obXNnX3JvdywgbXNnX2NvbCk7CisJCQljdXJzb3Jfb24oKTsKKwkJCW91dF9mbHVzaCgpOworCQkJaWYgKGdvdF9pbnQpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICAgIC8qCisJCSAgICAgKiBDaGVjayBpZiB0aGUgY2hpbGQgc3RpbGwgZXhpc3RzLCBiZWZvcmUgY2hlY2tpbmcgZm9yCisJCSAgICAgKiB0eXBlZCBjaGFyYWN0ZXJzIChvdGhlcndpc2Ugd2Ugd291bGQgbG9vc2UgdHlwZWFoZWFkKS4KKwkJICAgICAqLworIyAgaWZkZWYgX19OZVhUX18KKwkJICAgIHdhaXRfcGlkID0gd2FpdDQocGlkLCAmc3RhdHVzLCBXTk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKSAwKTsKKyMgIGVsc2UKKwkJICAgIHdhaXRfcGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOworIyAgZW5kaWYKKwkJICAgIGlmICgod2FpdF9waWQgPT0gKHBpZF90KS0xICYmIGVycm5vID09IEVDSElMRCkKKwkJCSAgICB8fCAod2FpdF9waWQgPT0gcGlkICYmIFdJRkVYSVRFRChzdGF0dXMpKSkKKwkJICAgIHsKKwkJCXdhaXRfcGlkID0gcGlkOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICB3YWl0X3BpZCA9IDA7CisJCX0KK2ZpbmlzaGVkOgorCQlwX21vcmUgPSBwX21vcmVfc2F2ZTsKKworIyAgaWZuZGVmIE1BQ09TX1hfVU5JWCAvKiBUT0RPOiBJcyBpdCBuZWVkZWQgZm9yIE1BQ09TX1ggPyAqLworCQkvKgorCQkgKiBHaXZlIGFsbCB0eXBlYWhlYWQgdGhhdCB3YXNuJ3QgdXNlZCBiYWNrIHRvIHVpX2luY2hhcigpLgorCQkgKi8KKwkJaWYgKHRhX2xlbikKKwkJICAgIHVpX2luY2hhcl91bmRvKHRhX2J1ZiwgdGFfbGVuKTsKKyMgIGVuZGlmCisJCVN0YXRlID0gb2xkX1N0YXRlOworCQlpZiAodG9zaGVsbF9mZCA+PSAwKQorCQkgICAgY2xvc2UodG9zaGVsbF9mZCk7CisJCWNsb3NlKGZyb21zaGVsbF9mZCk7CisJICAgIH0KKyMgZW5kaWYgLyogRkVBVF9HVUkgKi8KKworCSAgICAvKgorCSAgICAgKiBXYWl0IHVudGlsIG91ciBjaGlsZCBoYXMgZXhpdGVkLgorCSAgICAgKiBJZ25vcmUgd2FpdCgpIHJldHVybmluZyBwaWRzIG9mIG90aGVyIGNoaWxkcmVuIGFuZCByZXR1cm5pbmcKKwkgICAgICogYmVjYXVzZSBvZiBzb21lIHNpZ25hbCBsaWtlIFNJR1dJTkNILgorCSAgICAgKiBEb24ndCB3YWl0IGlmIHdhaXRfcGlkIHdhcyBhbHJlYWR5IHNldCBhYm92ZSwgaW5kaWNhdGluZyB0aGUKKwkgICAgICogY2hpbGQgYWxyZWFkeSBleGl0ZWQuCisJICAgICAqLworCSAgICB3aGlsZSAod2FpdF9waWQgIT0gcGlkKQorCSAgICB7CisjaWZkZWYgX1RIUkVBRF9TQUZFCisJCS8qIFVnbHkgaGFjazogd2hlbiBjb21waWxlZCB3aXRoIFB5dGhvbiB0aHJlYWRzIGFyZSBwcm9iYWJseQorCQkgKiB1c2VkLCBpbiB3aGljaCBjYXNlIHdhaXQoKSBzb21ldGltZXMgaGFuZ3MgZm9yIG5vIG9idmlvdXMKKwkJICogcmVhc29uLiAgVXNlIHdhaXRwaWQoKSBpbnN0ZWFkIGFuZCBsb29wIChsaWtlIHRoZSBHVUkpLiAqLworIyAgaWZkZWYgX19OZVhUX18KKwkJd2FpdF9waWQgPSB3YWl0NChwaWQsICZzdGF0dXMsIFdOT0hBTkcsIChzdHJ1Y3QgcnVzYWdlICopMCk7CisjICBlbHNlCisJCXdhaXRfcGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOworIyAgZW5kaWYKKwkJaWYgKHdhaXRfcGlkID09IDApCisJCXsKKwkJICAgIC8qIFdhaXQgZm9yIDEvMTAwIHNlYyBiZWZvcmUgdHJ5aW5nIGFnYWluLiAqLworCQkgICAgbWNoX2RlbGF5KDEwTCwgVFJVRSk7CisJCSAgICBjb250aW51ZTsKKwkJfQorI2Vsc2UKKwkJd2FpdF9waWQgPSB3YWl0KCZzdGF0dXMpOworI2VuZGlmCisJCWlmICh3YWl0X3BpZCA8PSAwCisjIGlmZGVmIEVDSElMRAorCQkJJiYgZXJybm8gPT0gRUNISUxECisjIGVuZGlmCisJCSAgICkKKwkJICAgIGJyZWFrOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogU2V0IHRvIHJhdyBtb2RlIHJpZ2h0IG5vdywgb3RoZXJ3aXNlIGEgQ1RSTC1DIGFmdGVyCisJICAgICAqIGNhdGNoX3NpZ25hbHMoKSB3aWxsIGtpbGwgVmltLgorCSAgICAgKi8KKwkgICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKKwkJc2V0dG1vZGUoVE1PREVfUkFXKTsKKwkgICAgZGlkX3NldHRtb2RlID0gVFJVRTsKKwkgICAgc2V0X3NpZ25hbHMoKTsKKworCSAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJICAgIHsKKwkJcmV0dmFsID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkJaWYgKHJldHZhbCAmJiAhZW1zZ19zaWxlbnQpCisJCXsKKwkJICAgIGlmIChyZXR2YWwgPT0gRVhFQ19GQUlMRUQpCisJCSAgICB7CisJCQlNU0dfUFVUUyhfKCJcbkNhbm5vdCBleGVjdXRlIHNoZWxsICIpKTsKKwkJCW1zZ19vdXR0cmFucyhwX3NoKTsKKwkJCW1zZ19wdXRjaGFyKCdcbicpOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAoIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSkKKwkJICAgIHsKKwkJCU1TR19QVVRTKF8oIlxuc2hlbGwgcmV0dXJuZWQgIikpOworCQkJbXNnX291dG51bSgobG9uZylyZXR2YWwpOworCQkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJCU1TR19QVVRTKF8oIlxuQ29tbWFuZCB0ZXJtaW5hdGVkXG4iKSk7CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShhcmd2KTsKKworZXJyb3I6CisgICAgaWYgKCFkaWRfc2V0dG1vZGUpCisJaWYgKHRtb2RlID09IFRNT0RFX1JBVykKKwkgICAgc2V0dG1vZGUoVE1PREVfUkFXKTsJLyogc2V0IHRvIHJhdyBtb2RlICovCisjIGlmZGVmIEZFQVRfVElUTEUKKyAgICByZXNldHRpdGxlKCk7CisjIGVuZGlmCisgICAgdmltX2ZyZWUobmV3Y21kKTsKKworICAgIHJldHVybiByZXR2YWw7CisKKyNlbmRpZiAvKiBVU0VfU1lTVEVNICovCit9CisKKy8qCisgKiBDaGVjayBmb3IgQ1RSTC1DIHR5cGVkIGJ5IHJlYWRpbmcgYWxsIGF2YWlsYWJsZSBjaGFyYWN0ZXJzLgorICogSW4gY29va2VkIG1vZGUgd2Ugc2hvdWxkIGdldCBTSUdJTlQsIG5vIG5lZWQgdG8gY2hlY2suCisgKi8KKyAgICB2b2lkCittY2hfYnJlYWtjaGVjaygpCit7CisgICAgaWYgKGN1cnJfdG1vZGUgPT0gVE1PREVfUkFXICYmIFJlYWxXYWl0Rm9yQ2hhcihyZWFkX2NtZF9mZCwgMEwsIE5VTEwpKQorCWZpbGxfaW5wdXRfYnVmKEZBTFNFKTsKK30KKworLyoKKyAqIFdhaXQgIm1zZWMiIG1zZWMgdW50aWwgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlIGZyb20gdGhlIGtleWJvYXJkIG9yIGZyb20KKyAqIGluYnVmW10uIG1zZWMgPT0gLTEgd2lsbCBibG9jayBmb3JldmVyLgorICogV2hlbiBhIEdVSSBpcyBiZWluZyB1c2VkLCB0aGlzIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZCAtLSB3ZWJiCisgKi8KKyAgICBzdGF0aWMgaW50CitXYWl0Rm9yQ2hhcihtc2VjKQorICAgIGxvbmcJbXNlYzsKK3sKKyNpZmRlZiBGRUFUX01PVVNFX0dQTQorICAgIGludAkJZ3BtX3Byb2Nlc3Nfd2FudGVkOworI2VuZGlmCisjaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisgICAgaW50CQlyZXN0OworI2VuZGlmCisgICAgaW50CQlhdmFpbDsKKworICAgIGlmIChpbnB1dF9hdmFpbGFibGUoKSkJICAgIC8qIHNvbWV0aGluZyBpbiBpbmJ1ZltdICovCisJcmV0dXJuIDE7CisKKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKQorICAgIC8qIE1heSBuZWVkIHRvIHF1ZXJ5IHRoZSBtb3VzZSBwb3NpdGlvbi4gKi8KKyAgICBpZiAoV2FudFF1ZXJ5TW91c2UpCisgICAgeworCVdhbnRRdWVyeU1vdXNlID0gMDsKKwltY2hfd3JpdGUoKGNoYXJfdSAqKUlGX0VCKCJcMDMzWzEnfCIsIEVTQ19TVFIgIlsxJ3wiKSwgNSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZvciBGRUFUX01PVVNFX0dQTSBhbmQgRkVBVF9YQ0xJUEJPQVJEIHdlIGxvb3AgaGVyZSB0byBwcm9jZXNzIG1vdXNlCisgICAgICogZXZlbnRzLiAgVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGV5IG1pZ2h0IGJvdGggYmUgZGVmaW5lZC4KKyAgICAgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0VfR1BNKSB8fCBkZWZpbmVkKEZFQVRfWENMSVBCT0FSRCkKKyMgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisgICAgcmVzdCA9IDA7CisgICAgaWYgKGRvX3h0ZXJtX3RyYWNlKCkpCisJcmVzdCA9IG1zZWM7CisjIGVuZGlmCisgICAgZG8KKyAgICB7CisjIGlmZGVmIEZFQVRfWENMSVBCT0FSRAorCWlmIChyZXN0ICE9IDApCisJeworCSAgICBtc2VjID0gWFRfVFJBQ0VfREVMQVk7CisJICAgIGlmIChyZXN0ID49IDAgJiYgcmVzdCA8IFhUX1RSQUNFX0RFTEFZKQorCQltc2VjID0gcmVzdDsKKwkgICAgaWYgKHJlc3QgPj0gMCkKKwkJcmVzdCAtPSBtc2VjOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKwlncG1fcHJvY2Vzc193YW50ZWQgPSAwOworCWF2YWlsID0gUmVhbFdhaXRGb3JDaGFyKHJlYWRfY21kX2ZkLCBtc2VjLCAmZ3BtX3Byb2Nlc3Nfd2FudGVkKTsKKyMgZWxzZQorCWF2YWlsID0gUmVhbFdhaXRGb3JDaGFyKHJlYWRfY21kX2ZkLCBtc2VjLCBOVUxMKTsKKyMgZW5kaWYKKwlpZiAoIWF2YWlsKQorCXsKKwkgICAgaWYgKGlucHV0X2F2YWlsYWJsZSgpKQorCQlyZXR1cm4gMTsKKyMgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisJICAgIGlmIChyZXN0ID09IDAgfHwgIWRvX3h0ZXJtX3RyYWNlKCkpCisjIGVuZGlmCisJCWJyZWFrOworCX0KKyAgICB9CisgICAgd2hpbGUgKEZBTFNFCisjIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisJICAgfHwgKGdwbV9wcm9jZXNzX3dhbnRlZCAmJiBtY2hfZ3BtX3Byb2Nlc3MoKSA9PSAwKQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwkgICB8fCAoIWF2YWlsICYmIHJlc3QgIT0gMCkKKyMgZW5kaWYKKwkgICk7CisKKyNlbHNlCisgICAgYXZhaWwgPSBSZWFsV2FpdEZvckNoYXIocmVhZF9jbWRfZmQsIG1zZWMsIE5VTEwpOworI2VuZGlmCisgICAgcmV0dXJuIGF2YWlsOworfQorCisvKgorICogV2FpdCAibXNlYyIgbXNlYyB1bnRpbCBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUgZnJvbSBmaWxlIGRlc2NyaXB0b3IgImZkIi4KKyAqIFRpbWUgPT0gLTEgd2lsbCBibG9jayBmb3JldmVyLgorICogV2hlbiBhIEdVSSBpcyBiZWluZyB1c2VkLCB0aGlzIHdpbGwgbm90IGJlIHVzZWQgZm9yIGlucHV0IC0tIHdlYmIKKyAqIFJldHVybnMgYWxzbywgd2hlbiBhIHJlcXVlc3QgZnJvbSBTbmlmZiBpcyB3YWl0aW5nIC0tIHRvbmkuCisgKiBPciB3aGVuIGEgTGludXggR1BNIG1vdXNlIGV2ZW50IGlzIHdhaXRpbmcuCisgKi8KKy8qIEFSR1NVU0VEICovCisjaWYgZGVmaW5lZChfX0JFT1NfXykKKyAgICBpbnQKKyNlbHNlCisgICAgc3RhdGljICBpbnQKKyNlbmRpZgorUmVhbFdhaXRGb3JDaGFyKGZkLCBtc2VjLCBjaGVja19mb3JfZ3BtKQorICAgIGludAkJZmQ7CisgICAgbG9uZwltc2VjOworICAgIGludAkJKmNoZWNrX2Zvcl9ncG07Cit7CisgICAgaW50CQlyZXQ7CisjaWYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpIHx8IGRlZmluZWQoVVNFX1hTTVApCisgICAgc3RhdGljIGludAlidXN5ID0gRkFMU0U7CisKKyAgICAvKiBNYXkgcmV0cnkgZ2V0dGluZyBjaGFyYWN0ZXJzIGFmdGVyIGFuIGV2ZW50IHdhcyBoYW5kbGVkLiAqLworIyBkZWZpbmUgTUFZX0xPT1AKKworIyBpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkKKyAgICAvKiBSZW1lbWJlciBhdCB3aGF0IHRpbWUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBrbm93IGhvdyBtdWNoIGxvbmdlciB3ZQorICAgICAqIHNob3VsZCB3YWl0IGFmdGVyIGJlaW5nIGludGVycnVwdGVkLiAqLworIyAgZGVmaW5lIFVTRV9TVEFSVF9UVgorICAgIHN0cnVjdCB0aW1ldmFsICBzdGFydF90djsKKworICAgIGlmIChtc2VjID4gMCAmJiAoCisjICBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwkgICAgeHRlcm1fU2hlbGwgIT0gKFdpZGdldCkwCisjICAgaWZkZWYgVVNFX1hTTVAKKwkgICAgfHwKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIFVTRV9YU01QCisJICAgIHhzbXBfaWNlZmQgIT0gLTEKKyMgIGVuZGlmCisJICAgICkpCisJZ2V0dGltZW9mZGF5KCZzdGFydF90diwgTlVMTCk7CisjIGVuZGlmCisKKyAgICAvKiBIYW5kbGUgYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZWx5LiAgVGhpcyBtYXkgaGFwcGVuIGZvciB0aGUgc2Vzc2lvbgorICAgICAqIG1hbmFnZXIgc3R1ZmYsIGl0IG1heSBzYXZlIHRoZSBmaWxlLCB3aGljaCBkb2VzIGEgYnJlYWtjaGVjay4gKi8KKyAgICBpZiAoYnVzeSkKKwlyZXR1cm4gMDsKKyNlbmRpZgorCisjaWZkZWYgTUFZX0xPT1AKKyAgICB3aGlsZSAoMSkKKyNlbmRpZgorICAgIHsKKyNpZmRlZiBNQVlfTE9PUAorCWludAkJZmluaXNoZWQgPSBUUlVFOyAvKiBkZWZhdWx0IGlzIHRvICdsb29wJyBqdXN0IG9uY2UgKi8KKyNlbmRpZgorI2lmbmRlZiBIQVZFX1NFTEVDVAorCXN0cnVjdCBwb2xsZmQgICBmZHNbNV07CisJaW50CQluZmQ7CisjIGlmZGVmIEZFQVRfWENMSVBCT0FSRAorCWludAkJeHRlcm1faWR4ID0gLTE7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisJaW50CQlncG1faWR4ID0gLTE7CisjIGVuZGlmCisjIGlmZGVmIFVTRV9YU01QCisJaW50CQl4c21wX2lkeCA9IC0xOworIyBlbmRpZgorCisJZmRzWzBdLmZkID0gZmQ7CisJZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKwluZmQgPSAxOworCisjIGlmZGVmIEZFQVRfU05JRkYKKyMgIGRlZmluZSBTTklGRl9JRFggMQorCWlmICh3YW50X3NuaWZmX3JlcXVlc3QpCisJeworCSAgICBmZHNbU05JRkZfSURYXS5mZCA9IGZkX2Zyb21fc25pZmY7CisJICAgIGZkc1tTTklGRl9JRFhdLmV2ZW50cyA9IFBPTExJTjsKKwkgICAgbmZkKys7CisJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwlpZiAoeHRlcm1fU2hlbGwgIT0gKFdpZGdldCkwKQorCXsKKwkgICAgeHRlcm1faWR4ID0gbmZkOworCSAgICBmZHNbbmZkXS5mZCA9IENvbm5lY3Rpb25OdW1iZXIoeHRlcm1fZHB5KTsKKwkgICAgZmRzW25mZF0uZXZlbnRzID0gUE9MTElOOworCSAgICBuZmQrKzsKKwl9CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisJaWYgKGNoZWNrX2Zvcl9ncG0gIT0gTlVMTCAmJiBncG1fZmxhZyAmJiBncG1fZmQgPj0gMCkKKwl7CisJICAgIGdwbV9pZHggPSBuZmQ7CisJICAgIGZkc1tuZmRdLmZkID0gZ3BtX2ZkOworCSAgICBmZHNbbmZkXS5ldmVudHMgPSBQT0xMSU47CisJICAgIG5mZCsrOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgVVNFX1hTTVAKKwlpZiAoeHNtcF9pY2VmZCAhPSAtMSkKKwl7CisJICAgIHhzbXBfaWR4ID0gbmZkOworCSAgICBmZHNbbmZkXS5mZCA9IHhzbXBfaWNlZmQ7CisJICAgIGZkc1tuZmRdLmV2ZW50cyA9IFBPTExJTjsKKwkgICAgbmZkKys7CisJfQorIyBlbmRpZgorCisJcmV0ID0gcG9sbChmZHMsIG5mZCwgKGludCltc2VjKTsKKworIyBpZmRlZiBGRUFUX1NOSUZGCisJaWYgKHJldCA8IDApCisJICAgIHNuaWZmX2Rpc2Nvbm5lY3QoMSk7CisJZWxzZSBpZiAod2FudF9zbmlmZl9yZXF1ZXN0KQorCXsKKwkgICAgaWYgKGZkc1tTTklGRl9JRFhdLnJldmVudHMgJiBQT0xMSFVQKQorCQlzbmlmZl9kaXNjb25uZWN0KDEpOworCSAgICBpZiAoZmRzW1NOSUZGX0lEWF0ucmV2ZW50cyAmIFBPTExJTikKKwkJc25pZmZfcmVxdWVzdF93YWl0aW5nID0gMTsKKwl9CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfWENMSVBCT0FSRAorCWlmICh4dGVybV9TaGVsbCAhPSAoV2lkZ2V0KTAgJiYgKGZkc1t4dGVybV9pZHhdLnJldmVudHMgJiBQT0xMSU4pKQorCXsKKwkgICAgeHRlcm1fdXBkYXRlKCk7ICAgICAgLyogTWF5YmUgd2Ugc2hvdWxkIGhhbmQgb3V0IGNsaXBib2FyZCAqLworCSAgICBpZiAoLS1yZXQgPT0gMCAmJiAhaW5wdXRfYXZhaWxhYmxlKCkpCisJCS8qIFRyeSBhZ2FpbiAqLworCQlmaW5pc2hlZCA9IEZBTFNFOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKwlpZiAoZ3BtX2lkeCA+PSAwICYmIChmZHNbZ3BtX2lkeF0ucmV2ZW50cyAmIFBPTExJTikpCisJeworCSAgICAqY2hlY2tfZm9yX2dwbSA9IDE7CisJfQorIyBlbmRpZgorIyBpZmRlZiBVU0VfWFNNUAorCWlmICh4c21wX2lkeCA+PSAwICYmIChmZHNbeHNtcF9pZHhdLnJldmVudHMgJiAoUE9MTElOIHwgUE9MTEhVUCkpKQorCXsKKwkgICAgaWYgKGZkc1t4c21wX2lkeF0ucmV2ZW50cyAmIFBPTExJTikKKwkgICAgeworCQlidXN5ID0gVFJVRTsKKwkJeHNtcF9oYW5kbGVfcmVxdWVzdHMoKTsKKwkJYnVzeSA9IEZBTFNFOworCSAgICB9CisJICAgIGVsc2UgaWYgKGZkc1t4c21wX2lkeF0ucmV2ZW50cyAmIFBPTExIVVApCisJICAgIHsKKwkJaWYgKHBfdmVyYm9zZSA+IDApCisJCSAgICBNU0coXygiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIikpOworCQl4c21wX2Nsb3NlKCk7CisJICAgIH0KKwkgICAgaWYgKC0tcmV0ID09IDApCisJCS8qIFRyeSBhZ2FpbiAqLworCQlmaW5pc2hlZCA9IEZBTFNFOworCX0KKyMgZW5kaWYKKworCisjZWxzZSAvKiBIQVZFX1NFTEVDVCAqLworCisJc3RydWN0IHRpbWV2YWwgIHR2OworCWZkX3NldAkJcmZkcywgZWZkczsKKwlpbnQJCW1heGZkOworCisjIGlmZGVmIF9fRU1YX18KKwkvKiBkb24ndCBjaGVjayBmb3IgaW5jb21pbmcgY2hhcnMgaWYgbm90IGluIHJhdyBtb2RlLCBiZWNhdXNlIHNlbGVjdCgpCisJICogYWx3YXlzIHJldHVybnMgVFJVRSB0aGVuIChpbiBzb21lIHZlcnNpb24gb2YgZW14LmRsbCkgKi8KKwlpZiAoY3Vycl90bW9kZSAhPSBUTU9ERV9SQVcpCisJICAgIHJldHVybiAwOworIyBlbmRpZgorCisJaWYgKG1zZWMgPj0gMCkKKwl7CisJICAgIHR2LnR2X3NlYyA9IG1zZWMgLyAxMDAwOworCSAgICB0di50dl91c2VjID0gKG1zZWMgJSAxMDAwKSAqICgxMDAwMDAwLzEwMDApOworCX0KKworCS8qCisJICogU2VsZWN0IG9uIHJlYWR5IGZvciByZWFkaW5nIGFuZCBleGNlcHRpb25hbCBjb25kaXRpb24gKGVuZCBvZiBmaWxlKS4KKwkgKi8KKwlGRF9aRVJPKCZyZmRzKTsgLyogY2FsbHMgYnplcm8oKSBvbiBhIHN1biAqLworCUZEX1pFUk8oJmVmZHMpOworCUZEX1NFVChmZCwgJnJmZHMpOworIyBpZiAhZGVmaW5lZChfX1FOWF9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTjMyX18pCisJLyogRm9yIFFOWCBzZWxlY3QoKSBhbHdheXMgcmV0dXJucyAxIGlmIHRoaXMgaXMgc2V0LiAgV2h5PyAqLworCUZEX1NFVChmZCwgJmVmZHMpOworIyBlbmRpZgorCW1heGZkID0gZmQ7CisKKyMgaWZkZWYgRkVBVF9TTklGRgorCWlmICh3YW50X3NuaWZmX3JlcXVlc3QpCisJeworCSAgICBGRF9TRVQoZmRfZnJvbV9zbmlmZiwgJnJmZHMpOworCSAgICBGRF9TRVQoZmRfZnJvbV9zbmlmZiwgJmVmZHMpOworCSAgICBpZiAobWF4ZmQgPCBmZF9mcm9tX3NuaWZmKQorCQltYXhmZCA9IGZkX2Zyb21fc25pZmY7CisJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwlpZiAoeHRlcm1fU2hlbGwgIT0gKFdpZGdldCkwKQorCXsKKwkgICAgRkRfU0VUKENvbm5lY3Rpb25OdW1iZXIoeHRlcm1fZHB5KSwgJnJmZHMpOworCSAgICBpZiAobWF4ZmQgPCBDb25uZWN0aW9uTnVtYmVyKHh0ZXJtX2RweSkpCisJCW1heGZkID0gQ29ubmVjdGlvbk51bWJlcih4dGVybV9kcHkpOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKwlpZiAoY2hlY2tfZm9yX2dwbSAhPSBOVUxMICYmIGdwbV9mbGFnICYmIGdwbV9mZCA+PSAwKQorCXsKKwkgICAgRkRfU0VUKGdwbV9mZCwgJnJmZHMpOworCSAgICBGRF9TRVQoZ3BtX2ZkLCAmZWZkcyk7CisJICAgIGlmIChtYXhmZCA8IGdwbV9mZCkKKwkJbWF4ZmQgPSBncG1fZmQ7CisJfQorIyBlbmRpZgorIyBpZmRlZiBVU0VfWFNNUAorCWlmICh4c21wX2ljZWZkICE9IC0xKQorCXsKKwkgICAgRkRfU0VUKHhzbXBfaWNlZmQsICZyZmRzKTsKKwkgICAgRkRfU0VUKHhzbXBfaWNlZmQsICZlZmRzKTsKKwkgICAgaWYgKG1heGZkIDwgeHNtcF9pY2VmZCkKKwkJbWF4ZmQgPSB4c21wX2ljZWZkOworCX0KKyMgZW5kaWYKKworIyBpZmRlZiBPTERfVk1TCisJLyogT2xkIFZNUyBhcyB2Ni4yIGFuZCBvbGRlciBoYXZlIGJyb2tlbiBzZWxlY3QoKS4gSXQgd2FpdHMgbW9yZSB0aGFuCisJICogcmVxdWlyZWQuIFNob3VsZCBub3QgYmUgdXNlZCAqLworCXJldCA9IDA7CisjIGVsc2UKKwlyZXQgPSBzZWxlY3QobWF4ZmQgKyAxLCAmcmZkcywgTlVMTCwgJmVmZHMsIChtc2VjID49IDApID8gJnR2IDogTlVMTCk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9TTklGRgorCWlmIChyZXQgPCAwICkKKwkgICAgc25pZmZfZGlzY29ubmVjdCgxKTsKKwllbHNlIGlmIChyZXQgPiAwICYmIHdhbnRfc25pZmZfcmVxdWVzdCkKKwl7CisJICAgIGlmIChGRF9JU1NFVChmZF9mcm9tX3NuaWZmLCAmZWZkcykpCisJCXNuaWZmX2Rpc2Nvbm5lY3QoMSk7CisJICAgIGlmIChGRF9JU1NFVChmZF9mcm9tX3NuaWZmLCAmcmZkcykpCisJCXNuaWZmX3JlcXVlc3Rfd2FpdGluZyA9IDE7CisJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwlpZiAocmV0ID4gMCAmJiB4dGVybV9TaGVsbCAhPSAoV2lkZ2V0KTAKKwkJJiYgRkRfSVNTRVQoQ29ubmVjdGlvbk51bWJlcih4dGVybV9kcHkpLCAmcmZkcykpCisJeworCSAgICB4dGVybV91cGRhdGUoKTsJICAgICAgLyogTWF5YmUgd2Ugc2hvdWxkIGhhbmQgb3V0IGNsaXBib2FyZCAqLworCSAgICAvKiBjb250aW51ZSBsb29waW5nIHdoZW4gd2Ugb25seSBnb3QgdGhlIFggZXZlbnQgYW5kIHRoZSBpbnB1dAorCSAgICAgKiBidWZmZXIgaXMgZW1wdHkgKi8KKwkgICAgaWYgKC0tcmV0ID09IDAgJiYgIWlucHV0X2F2YWlsYWJsZSgpKQorCSAgICB7CisJCS8qIFRyeSBhZ2FpbiAqLworCQlmaW5pc2hlZCA9IEZBTFNFOworCSAgICB9CisJfQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX0dQTQorCWlmIChyZXQgPiAwICYmIGdwbV9mbGFnICYmIGNoZWNrX2Zvcl9ncG0gIT0gTlVMTCAmJiBncG1fZmQgPj0gMCkKKwl7CisJICAgIGlmIChGRF9JU1NFVChncG1fZmQsICZlZmRzKSkKKwkJZ3BtX2Nsb3NlKCk7CisJICAgIGVsc2UgaWYgKEZEX0lTU0VUKGdwbV9mZCwgJnJmZHMpKQorCQkqY2hlY2tfZm9yX2dwbSA9IDE7CisJfQorIyBlbmRpZgorIyBpZmRlZiBVU0VfWFNNUAorCWlmIChyZXQgPiAwICYmIHhzbXBfaWNlZmQgIT0gLTEpCisJeworCSAgICBpZiAoRkRfSVNTRVQoeHNtcF9pY2VmZCwgJmVmZHMpKQorCSAgICB7CisJCWlmIChwX3ZlcmJvc2UgPiAwKQorCQkgICAgTVNHKF8oIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIpKTsKKwkJeHNtcF9jbG9zZSgpOworCQlpZiAoLS1yZXQgPT0gMCkKKwkJICAgIGZpbmlzaGVkID0gRkFMU0U7ICAgLyoga2VlcCBnb2luZyBpZiBldmVudCB3YXMgb25seSBvbmUgKi8KKwkgICAgfQorCSAgICBlbHNlIGlmIChGRF9JU1NFVCh4c21wX2ljZWZkLCAmcmZkcykpCisJICAgIHsKKwkJYnVzeSA9IFRSVUU7CisJCXhzbXBfaGFuZGxlX3JlcXVlc3RzKCk7CisJCWJ1c3kgPSBGQUxTRTsKKwkJaWYgKC0tcmV0ID09IDApCisJCSAgICBmaW5pc2hlZCA9IEZBTFNFOyAgIC8qIGtlZXAgZ29pbmcgaWYgZXZlbnQgd2FzIG9ubHkgb25lICovCisJICAgIH0KKwl9CisjIGVuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1NFTEVDVCAqLworCisjaWZkZWYgTUFZX0xPT1AKKwlpZiAoZmluaXNoZWQgfHwgbXNlYyA9PSAwKQorCSAgICBicmVhazsKKworCS8qIFdlJ3JlIGdvaW5nIHRvIGxvb3AgYXJvdW5kIGFnYWluLCBmaW5kIG91dCBmb3IgaG93IGxvbmcgKi8KKwlpZiAobXNlYyA+IDApCisJeworIyBpZmRlZiBVU0VfU1RBUlRfVFYKKwkgICAgc3RydWN0IHRpbWV2YWwgIG10djsKKworCSAgICAvKiBDb21wdXRlIHJlbWFpbmluZyB3YWl0IHRpbWUuICovCisJICAgIGdldHRpbWVvZmRheSgmbXR2LCBOVUxMKTsKKwkgICAgbXNlYyAtPSAobXR2LnR2X3NlYyAtIHN0YXJ0X3R2LnR2X3NlYykgKiAxMDAwTAorCQkJCSAgICsgKG10di50dl91c2VjIC0gc3RhcnRfdHYudHZfdXNlYykgLyAxMDAwTDsKKyMgZWxzZQorCSAgICAvKiBHdWVzcyB3ZSBnb3QgaW50ZXJydXB0ZWQgaGFsZndheS4gKi8KKwkgICAgbXNlYyA9IG1zZWMgLyAyOworIyBlbmRpZgorCSAgICBpZiAobXNlYyA8PSAwKQorCQlicmVhazsJLyogd2FpdGVkIGxvbmcgZW5vdWdoICovCisJfQorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworI2lmbmRlZiBWTVMKKworI2lmbmRlZiBOT19FWFBBTkRQQVRICisgICAgc3RhdGljIGludAorcHN0cmNtcChhLCBiKQorICAgIGNvbnN0IHZvaWQgKmEsICpiOworeworICAgIHJldHVybiAocGF0aGNtcCgqKGNoYXIgKiopYSwgKihjaGFyICoqKWIpKTsKK30KKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGV4cGFuZCBvbmUgcGF0aCBjb21wb25lbnQgaW50byBhbGwgbWF0Y2hpbmcgZmlsZXMgYW5kL29yCisgKiBkaXJlY3Rvcmllcy4KKyAqICJwYXRoIiBoYXMgYmFja3NsYXNoZXMgYmVmb3JlIGNoYXJzIHRoYXQgYXJlIG5vdCB0byBiZSBleHBhbmRlZCwgc3RhcnRpbmcKKyAqIGF0ICJwYXRoICsgd2lsZG9mZiIuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICovCisgICAgaW50CittY2hfZXhwYW5kcGF0aChnYXAsIHBhdGgsIGZsYWdzKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSpwYXRoOworICAgIGludAkJZmxhZ3M7CQkvKiBFV18qIGZsYWdzICovCit7CisgICAgcmV0dXJuIHVuaXhfZXhwYW5kcGF0aChnYXAsIHBhdGgsIDAsIGZsYWdzKTsKK30KKworICAgIHN0YXRpYyBpbnQKK3VuaXhfZXhwYW5kcGF0aChnYXAsIHBhdGgsIHdpbGRvZmYsIGZsYWdzKQorICAgIGdhcnJheV9UCSpnYXA7CisgICAgY2hhcl91CSpwYXRoOworICAgIGludAkJd2lsZG9mZjsKKyAgICBpbnQJCWZsYWdzOwkJLyogRVdfKiBmbGFncyAqLworeworICAgIGNoYXJfdQkqYnVmOworICAgIGNoYXJfdQkqcGF0aF9lbmQ7CisgICAgY2hhcl91CSpwLCAqcywgKmU7CisgICAgaW50CQlzdGFydF9sZW4sIGM7CisgICAgY2hhcl91CSpwYXQ7CisgICAgRElSCQkqZGlycDsKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworICAgIHN0cnVjdCBkaXJlbnQgKmRwOworICAgIGludAkJc3RhcnRzX3dpdGhfZG90OworICAgIGludAkJbWF0Y2hlczsKKyAgICBpbnQJCWxlbjsKKworICAgIHN0YXJ0X2xlbiA9IGdhcC0+Z2FfbGVuOworICAgIGJ1ZiA9IGFsbG9jKFNUUkxFTihwYXRoKSArIEJBU0VOQU1FTEVOICsgNSk7LyogbWFrZSByb29tIGZvciBmaWxlIG5hbWUgKi8KKyAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIDA7CisKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCBwYXJ0IGluIHRoZSBwYXRoIG5hbWUgdGhhdCBjb250YWlucyBhIHdpbGRjYXJkLgorICogQ29weSBpdCBpbnRvIGJ1ZiwgaW5jbHVkaW5nIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVycy4KKyAqLworICAgIHAgPSBidWY7CisgICAgcyA9IGJ1ZjsKKyAgICBlID0gTlVMTDsKKyAgICBwYXRoX2VuZCA9IHBhdGg7CisgICAgd2hpbGUgKCpwYXRoX2VuZCAhPSBOVUwpCisgICAgeworCS8qIE1heSBpZ25vcmUgYSB3aWxkY2FyZCB0aGF0IGhhcyBhIGJhY2tzbGFzaCBiZWZvcmUgaXQ7IGl0IHdpbGwKKwkgKiBiZSByZW1vdmVkIGJ5IHJlbV9iYWNrc2xhc2goKSBvciBmaWxlX3BhdF90b19yZWdfcGF0KCkgYmVsb3cuICovCisJaWYgKHBhdGhfZW5kID49IHBhdGggKyB3aWxkb2ZmICYmIHJlbV9iYWNrc2xhc2gocGF0aF9lbmQpKQorCSAgICAqcCsrID0gKnBhdGhfZW5kKys7CisJZWxzZSBpZiAoKnBhdGhfZW5kID09ICcvJykKKwl7CisJICAgIGlmIChlICE9IE5VTEwpCisJCWJyZWFrOworCSAgICBzID0gcCArIDE7CisJfQorCWVsc2UgaWYgKHBhdGhfZW5kID49IHBhdGggKyB3aWxkb2ZmCisJCQkgJiYgdmltX3N0cmNocigoY2hhcl91ICopIio/W3t+JCIsICpwYXRoX2VuZCkgIT0gTlVMTCkKKwkgICAgZSA9IHA7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICBsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKHBhdGhfZW5kKTsKKwkgICAgU1RSTkNQWShwLCBwYXRoX2VuZCwgbGVuKTsKKwkgICAgcCArPSBsZW47CisJICAgIHBhdGhfZW5kICs9IGxlbjsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgICpwKysgPSAqcGF0aF9lbmQrKzsKKyAgICB9CisgICAgZSA9IHA7CisgICAgKmUgPSBOVUw7CisKKyAgICAvKiBub3cgd2UgaGF2ZSBvbmUgd2lsZGNhcmQgY29tcG9uZW50IGJldHdlZW4gcyBhbmQgZSAqLworICAgIC8qIFJlbW92ZSBiYWNrc2xhc2hlcyBiZXR3ZWVuICJ3aWxkb2ZmIiBhbmQgdGhlIHN0YXJ0IG9mIHRoZSB3aWxkY2FyZAorICAgICAqIGNvbXBvbmVudC4gKi8KKyAgICBmb3IgKHAgPSBidWYgKyB3aWxkb2ZmOyBwIDwgczsgKytwKQorCWlmIChyZW1fYmFja3NsYXNoKHApKQorCXsKKwkgICAgU1RSQ1BZKHAsIHAgKyAxKTsKKwkgICAgLS1lOworCSAgICAtLXM7CisJfQorCisgICAgLyogY29udmVydCB0aGUgZmlsZSBwYXR0ZXJuIHRvIGEgcmVnZXhwIHBhdHRlcm4gKi8KKyAgICBzdGFydHNfd2l0aF9kb3QgPSAoKnMgPT0gJy4nKTsKKyAgICBwYXQgPSBmaWxlX3BhdF90b19yZWdfcGF0KHMsIGUsIE5VTEwsIEZBTFNFKTsKKyAgICBpZiAocGF0ID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY29tcGlsZSB0aGUgcmVnZXhwIGludG8gYSBwcm9ncmFtICovCisjaWZkZWYgTUFDT1NfWCAvKiBDYW4vU2hvdWxkIHdlIHVzZSBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FIGluc3RlYWQgPyovCisgICAgcmVnbWF0Y2gucm1faWMgPSBUUlVFOwkJLyogQmVoYXZlIGxpa2UgVGVybWluYWwuYXBwICovCisjZWxzZQorICAgIHJlZ21hdGNoLnJtX2ljID0gRkFMU0U7CQkvKiBEb24ndCBldmVyIGlnbm9yZSBjYXNlICovCisjZW5kaWYKKyAgICByZWdtYXRjaC5yZWdwcm9nID0gdmltX3JlZ2NvbXAocGF0LCBSRV9NQUdJQyk7CisgICAgdmltX2ZyZWUocGF0KTsKKworICAgIGlmIChyZWdtYXRjaC5yZWdwcm9nID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogb3BlbiB0aGUgZGlyZWN0b3J5IGZvciBzY2FubmluZyAqLworICAgIGMgPSAqczsKKyAgICAqcyA9IE5VTDsKKyAgICBkaXJwID0gb3BlbmRpcigqYnVmID09IE5VTCA/ICIuIiA6IChjaGFyICopYnVmKTsKKyAgICAqcyA9IGM7CisKKyAgICAvKiBGaW5kIGFsbCBtYXRjaGluZyBlbnRyaWVzICovCisgICAgaWYgKGRpcnAgIT0gTlVMTCkKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIGRwID0gcmVhZGRpcihkaXJwKTsKKwkgICAgaWYgKGRwID09IE5VTEwpCisJCWJyZWFrOworCSAgICBpZiAoKGRwLT5kX25hbWVbMF0gIT0gJy4nIHx8IHN0YXJ0c193aXRoX2RvdCkKKwkJICAgICYmIHZpbV9yZWdleGVjKCZyZWdtYXRjaCwgKGNoYXJfdSAqKWRwLT5kX25hbWUsIChjb2xucl9UKTApKQorCSAgICB7CisJCVNUUkNQWShzLCBkcC0+ZF9uYW1lKTsKKwkJbGVuID0gU1RSTEVOKGJ1Zik7CisJCVNUUkNQWShidWYgKyBsZW4sIHBhdGhfZW5kKTsKKwkJaWYgKG1jaF9oYXNfZXhwX3dpbGRjYXJkKHBhdGhfZW5kKSkgLyogaGFuZGxlIG1vcmUgd2lsZGNhcmRzICovCisJCXsKKwkJICAgIC8qIG5lZWQgdG8gZXhwYW5kIGFub3RoZXIgY29tcG9uZW50IG9mIHRoZSBwYXRoICovCisJCSAgICAvKiByZW1vdmUgYmFja3NsYXNoZXMgZm9yIHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBvbmx5ICovCisJCSAgICAodm9pZCl1bml4X2V4cGFuZHBhdGgoZ2FwLCBidWYsIGxlbiArIDEsIGZsYWdzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIG5vIG1vcmUgd2lsZGNhcmRzLCBjaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoICovCisJCSAgICAvKiByZW1vdmUgYmFja3NsYXNoZXMgZm9yIHRoZSByZW1haW5pbmcgY29tcG9uZW50cyBvbmx5ICovCisJCSAgICBpZiAoKnBhdGhfZW5kICE9IE5VTCkKKwkJCWJhY2tzbGFzaF9oYWx2ZShidWYgKyBsZW4gKyAxKTsKKwkJICAgIGlmIChtY2hfZ2V0cGVybShidWYpID49IDApCS8qIGFkZCBleGlzdGluZyBmaWxlICovCisJCQlhZGRmaWxlKGdhcCwgYnVmLCBmbGFncyk7CisJCX0KKwkgICAgfQorCX0KKworCWNsb3NlZGlyKGRpcnApOworICAgIH0KKworICAgIHZpbV9mcmVlKGJ1Zik7CisgICAgdmltX2ZyZWUocmVnbWF0Y2gucmVncHJvZyk7CisKKyAgICBtYXRjaGVzID0gZ2FwLT5nYV9sZW4gLSBzdGFydF9sZW47CisgICAgaWYgKG1hdGNoZXMgPiAwKQorCXFzb3J0KCgoY2hhcl91ICoqKWdhcC0+Z2FfZGF0YSkgKyBzdGFydF9sZW4sIG1hdGNoZXMsCisJCQkJCQkgICBzaXplb2YoY2hhcl91ICopLCBwc3RyY21wKTsKKyAgICByZXR1cm4gbWF0Y2hlczsKK30KKyNlbmRpZgorCisvKgorICogbWNoX2V4cGFuZF93aWxkY2FyZHMoKSAtIHRoaXMgY29kZSBkb2VzIHdpbGQtY2FyZCBwYXR0ZXJuIG1hdGNoaW5nIHVzaW5nCisgKiB0aGUgc2hlbGwKKyAqCisgKiByZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGVycm9yICh5b3UgbWF5IGxvc2Ugc29tZSBtZW1vcnkpIGFuZCBwdXQKKyAqIGFuIGVycm9yIG1lc3NhZ2UgaW4gKmZpbGUuCisgKgorICogbnVtX3BhdCBpcyBudW1iZXIgb2YgaW5wdXQgcGF0dGVybnMKKyAqIHBhdCBpcyBhcnJheSBvZiBwb2ludGVycyB0byBpbnB1dCBwYXR0ZXJucworICogbnVtX2ZpbGUgaXMgcG9pbnRlciB0byBudW1iZXIgb2YgbWF0Y2hlZCBmaWxlIG5hbWVzCisgKiBmaWxlIGlzIHBvaW50ZXIgdG8gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbWF0Y2hlZCBmaWxlIG5hbWVzCisgKi8KKworI2lmbmRlZiBTRUVLX1NFVAorIyBkZWZpbmUgU0VFS19TRVQgMAorI2VuZGlmCisjaWZuZGVmIFNFRUtfRU5ECisjIGRlZmluZSBTRUVLX0VORCAyCisjZW5kaWYKKworLyogQVJHU1VTRUQgKi8KKyAgICBpbnQKK21jaF9leHBhbmRfd2lsZGNhcmRzKG51bV9wYXQsIHBhdCwgbnVtX2ZpbGUsIGZpbGUsIGZsYWdzKQorICAgIGludAkJICAgbnVtX3BhdDsKKyAgICBjaGFyX3UJICoqcGF0OworICAgIGludAkJICAqbnVtX2ZpbGU7CisgICAgY2hhcl91CSoqKmZpbGU7CisgICAgaW50CQkgICBmbGFnczsJLyogRVdfKiBmbGFncyAqLworeworICAgIGludAkJaTsKKyAgICBzaXplX3QJbGVuOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWRpcjsKKyNpZmRlZiBfX0VNWF9fCisjIGRlZmluZSBFWFBMX0FMTE9DX0lOQwkxNgorICAgIGNoYXJfdQkqKmV4cGxfZmlsZXM7CisgICAgc2l6ZV90CWZpbGVzX2FsbG9jZWQsIGZpbGVzX2ZyZWU7CisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQloYXNfd2lsZGNhcmQ7CisKKyAgICAqbnVtX2ZpbGUgPSAwOwkvKiBkZWZhdWx0OiBubyBmaWxlcyBmb3VuZCAqLworICAgIGZpbGVzX2FsbG9jZWQgPSBFWFBMX0FMTE9DX0lOQzsgLyogaG93IG11Y2ggc3BhY2UgaXMgYWxsb2NhdGVkICovCisgICAgZmlsZXNfZnJlZSA9IEVYUExfQUxMT0NfSU5DOyAgICAvKiBob3cgbXVjaCBzcGFjZSBpcyBub3QgdXNlZCAgKi8KKyAgICAqZmlsZSA9IChjaGFyX3UgKiopYWxsb2Moc2l6ZW9mKGNoYXJfdSAqKikgKiBmaWxlc19hbGxvY2VkKTsKKyAgICBpZiAoKmZpbGUgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIGZvciAoOyBudW1fcGF0ID4gMDsgbnVtX3BhdC0tLCBwYXQrKykKKyAgICB7CisJZXhwbF9maWxlcyA9IE5VTEw7CisJaWYgKHZpbV9zdHJjaHIoKnBhdCwgJyQnKSB8fCB2aW1fc3RyY2hyKCpwYXQsICd+JykpCisJICAgIC8qIGV4cGFuZCBlbnZpcm9ubWVudCB2YXIgb3IgaG9tZSBkaXIgKi8KKwkgICAgYnVmID0gZXhwYW5kX2Vudl9zYXZlKCpwYXQpOworCWVsc2UKKwkgICAgYnVmID0gdmltX3N0cnNhdmUoKnBhdCk7CisJZXhwbF9maWxlcyA9IE5VTEw7CisJaGFzX3dpbGRjYXJkID0gbWNoX2hhc19leHBfd2lsZGNhcmQoYnVmKTsgIC8qIChzdGlsbCkgd2lsZGNhcmRzIGluIHRoZXJlPyAqLworCWlmIChoYXNfd2lsZGNhcmQpICAgLyogeWVzLCBzbyBleHBhbmQgdGhlbSAqLworCSAgICBleHBsX2ZpbGVzID0gKGNoYXJfdSAqKilfZm5leHBsb2RlKGJ1Zik7CisKKwkvKgorCSAqIHJldHVybiB2YWx1ZSBvZiBidWYgaWYgbm8gd2lsZGNhcmRzIGxlZnQsCisJICogT1IgaWYgbm8gbWF0Y2ggQU5EIEVXX05PVEZPVU5EIGlzIHNldC4KKwkgKi8KKwlpZiAoKCFoYXNfd2lsZGNhcmQgJiYgKChmbGFncyAmIEVXX05PVEZPVU5EKSB8fCBtY2hfZ2V0cGVybShidWYpID49IDApKQorCQl8fCAoZXhwbF9maWxlcyA9PSBOVUxMICYmIChmbGFncyAmIEVXX05PVEZPVU5EKSkpCisJeyAgIC8qIHNpbXBseSBzYXZlIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mICpidWYgKi8KKwkgICAgZXhwbF9maWxlcyA9IChjaGFyX3UgKiopYWxsb2Moc2l6ZW9mKGNoYXJfdSAqKikgKiAyKTsKKwkgICAgaWYgKGV4cGxfZmlsZXMgIT0gTlVMTCkKKwkgICAgeworCQlleHBsX2ZpbGVzWzBdID0gdmltX3N0cnNhdmUoYnVmKTsKKwkJZXhwbF9maWxlc1sxXSA9IE5VTEw7CisJICAgIH0KKwl9CisJdmltX2ZyZWUoYnVmKTsKKworCS8qCisJICogQ291bnQgbnVtYmVyIG9mIG5hbWVzIHJlc3VsdGluZyBmcm9tIGV4cGFuc2lvbiwKKwkgKiBBdCB0aGUgc2FtZSB0aW1lIGFkZCBhIGJhY2tzbGFzaCB0byB0aGUgZW5kIG9mIG5hbWVzIHRoYXQgaGFwcGVuIHRvCisJICogYmUgZGlyZWN0b3JpZXMsIGFuZCByZXBsYWNlIHNsYXNoZXMgd2l0aCBiYWNrc2xhc2hlcy4KKwkgKi8KKwlpZiAoZXhwbF9maWxlcykKKwl7CisJICAgIGZvciAoaSA9IDA7IChwID0gZXhwbF9maWxlc1tpXSkgIT0gTlVMTDsgaSsrKQorCSAgICB7CisJCWRpciA9IG1jaF9pc2RpcihwKTsKKwkJLyogSWYgd2UgZG9uJ3Qgd2FudCBkaXJzIGFuZCB0aGlzIGlzIG9uZSwgc2tpcCBpdCAqLworCQlpZiAoKGRpciAmJiAhKGZsYWdzICYgRVdfRElSKSkgfHwgKCFkaXIgJiYgIShmbGFncyAmIEVXX0ZJTEUpKSkKKwkJICAgIGNvbnRpbnVlOworCisJCWlmICgtLWZpbGVzX2ZyZWUgPT0gMCkKKwkJeworCQkgICAgLyogbmVlZCBtb3JlIHJvb20gaW4gdGFibGUgb2YgcG9pbnRlcnMgKi8KKwkJICAgIGZpbGVzX2FsbG9jZWQgKz0gRVhQTF9BTExPQ19JTkM7CisJCSAgICAqZmlsZSA9IChjaGFyX3UgKiopdmltX3JlYWxsb2MoKmZpbGUsCisJCQkJCSAgIHNpemVvZihjaGFyX3UgKiopICogZmlsZXNfYWxsb2NlZCk7CisJCSAgICBpZiAoKmZpbGUgPT0gTlVMTCkKKwkJICAgIHsKKwkJCUVNU0coXyhlX291dG9mbWVtKSk7CisJCQkqbnVtX2ZpbGUgPSAwOworCQkJcmV0dXJuIEZBSUw7CisJCSAgICB9CisJCSAgICBmaWxlc19mcmVlID0gRVhQTF9BTExPQ19JTkM7CisJCX0KKwkJc2xhc2hfYWRqdXN0KHApOworCQlpZiAoZGlyKQorCQl7CisJCSAgICAvKiBGb3IgYSBkaXJlY3Rvcnkgd2UgYWRkIGEgJy8nLCB1bmxlc3MgaXQncyBhbHJlYWR5CisJCSAgICAgKiB0aGVyZS4gKi8KKwkJICAgIGxlbiA9IFNUUkxFTihwKTsKKwkJICAgIGlmICgoKCpmaWxlKVsqbnVtX2ZpbGVdID0gYWxsb2MobGVuICsgMikpICE9IE5VTEwpCisJCSAgICB7CisJCQlTVFJDUFkoKCpmaWxlKVsqbnVtX2ZpbGVdLCBwKTsKKwkJCWlmICghdmltX2lzcGF0aHNlcCgoKmZpbGUpWypudW1fZmlsZV1bbGVuIC0gMV0pKQorCQkJeworCQkJICAgICgqZmlsZSlbKm51bV9maWxlXVtsZW5dID0gcHNlcGM7CisJCQkgICAgKCpmaWxlKVsqbnVtX2ZpbGVdW2xlbiArIDFdID0gMDsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgICgqZmlsZSlbKm51bV9maWxlXSA9IHZpbV9zdHJzYXZlKHApOworCQl9CisKKwkJLyoKKwkJICogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IGdpdmVuIGJ5IGVpdGhlciBhbGxvYyBvciB2aW1fc3Ryc2F2ZS4KKwkJICogU2hvdWxkIHJldHVybiBGQUlMLCBidXQgcmV0dXJuaW5nIE9LIHdvcmtzIGFsc28uCisJCSAqLworCQlpZiAoKCpmaWxlKVsqbnVtX2ZpbGVdID09IE5VTEwpCisJCSAgICBicmVhazsKKwkJKCpudW1fZmlsZSkrKzsKKwkgICAgfQorCSAgICBfZm5leHBsb2RlZnJlZSgoY2hhciAqKilleHBsX2ZpbGVzKTsKKwl9CisgICAgfQorICAgIHJldHVybiBPSzsKKworI2Vsc2UgLyogX19FTVhfXyAqLworCisgICAgaW50CQlqOworICAgIGNoYXJfdQkqdGVtcG5hbWU7CisgICAgY2hhcl91CSpjb21tYW5kOworICAgIEZJTEUJKmZkOworICAgIGNoYXJfdQkqYnVmZmVyOworI2RlZmluZSBTVFlMRV9FQ0hPICAwCSAgICAvKiB1c2UgImVjaG8iIHRvIGV4cGFuZCAqLworI2RlZmluZSBTVFlMRV9HTE9CICAxCSAgICAvKiB1c2UgImdsb2IiIHRvIGV4cGFuZCwgZm9yIGNzaCAqLworI2RlZmluZSBTVFlMRV9QUklOVCAyCSAgICAvKiB1c2UgInByaW50IC1OIiB0byBleHBhbmQsIGZvciB6c2ggKi8KKyNkZWZpbmUgU1RZTEVfQlQgICAgMwkgICAgLyogYGNtZGAgZXhwYW5zaW9uLCBleGVjdXRlIHRoZSBwYXR0ZXJuIGRpcmVjdGx5ICovCisgICAgaW50CQlzaGVsbF9zdHlsZSA9IFNUWUxFX0VDSE87CisgICAgaW50CQljaGVja19zcGFjZXM7CisgICAgc3RhdGljIGludAlkaWRfZmluZF9udWwgPSBGQUxTRTsKKyAgICBpbnQJCWFtcGVyc2VudCA9IEZBTFNFOworCisgICAgKm51bV9maWxlID0gMDsJLyogZGVmYXVsdDogbm8gZmlsZXMgZm91bmQgKi8KKyAgICAqZmlsZSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGFyZSBubyB3aWxkY2FyZHMsIGp1c3QgY29weSB0aGUgbmFtZXMgdG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAgICAgKiBTYXZlcyBhIGxvdCBvZiB0aW1lLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8gc3RhcnQgYSBuZXcgc2hlbGwuCisgICAgICovCisgICAgaWYgKCFoYXZlX3dpbGRjYXJkKG51bV9wYXQsIHBhdCkpCisJcmV0dXJuIHNhdmVfcGF0dGVybnMobnVtX3BhdCwgcGF0LCBudW1fZmlsZSwgZmlsZSk7CisKKyAgICAvKgorICAgICAqIERvbid0IGFsbG93IHRoZSB1c2Ugb2YgYmFja3RpY2tzIGluIHNlY3VyZSBhbmQgcmVzdHJpY3RlZCBtb2RlLgorICAgICAqLworICAgIGlmIChzZWN1cmUgfHwgcmVzdHJpY3RlZCkKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdDsgKytpKQorCSAgICBpZiAodmltX3N0cmNocihwYXRbaV0sICdgJykgIT0gTlVMTAorCQkgICAgJiYgKGNoZWNrX3Jlc3RyaWN0ZWQoKSB8fCBjaGVja19zZWN1cmUoKSkpCisJCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBnZXQgYSBuYW1lIGZvciB0aGUgdGVtcCBmaWxlCisgICAgICovCisgICAgaWYgKCh0ZW1wbmFtZSA9IHZpbV90ZW1wbmFtZSgnbycpKSA9PSBOVUxMKQorICAgIHsKKwlFTVNHKF8oZV9ub3RtcCkpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qCisgICAgICogTGV0IHRoZSBzaGVsbCBleHBhbmQgdGhlIHBhdHRlcm5zIGFuZCB3cml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIHRlbXAKKyAgICAgKiBmaWxlLiAgaWYgZXhwYW5kaW5nIGBjbWRgIGV4ZWN1dGUgaXQgZGlyZWN0bHkuCisgICAgICogSWYgd2UgdXNlIGNzaCwgZ2xvYiB3aWxsIHdvcmsgYmV0dGVyIHRoYW4gZWNoby4KKyAgICAgKiBJZiB3ZSB1c2UgenNoLCBwcmludCAtTiB3aWxsIHdvcmsgYmV0dGVyIHRoYW4gZ2xvYi4KKyAgICAgKi8KKyAgICBpZiAobnVtX3BhdCA9PSAxICYmICpwYXRbMF0gPT0gJ2AnCisJICAgICYmIChsZW4gPSBTVFJMRU4ocGF0WzBdKSkgPiAyCisJICAgICYmICoocGF0WzBdICsgbGVuIC0gMSkgPT0gJ2AnKQorCXNoZWxsX3N0eWxlID0gU1RZTEVfQlQ7CisgICAgZWxzZSBpZiAoKGxlbiA9IFNUUkxFTihwX3NoKSkgPj0gMykKKyAgICB7CisJaWYgKFNUUkNNUChwX3NoICsgbGVuIC0gMywgImNzaCIpID09IDApCisJICAgIHNoZWxsX3N0eWxlID0gU1RZTEVfR0xPQjsKKwllbHNlIGlmIChTVFJDTVAocF9zaCArIGxlbiAtIDMsICJ6c2giKSA9PSAwKQorCSAgICBzaGVsbF9zdHlsZSA9IFNUWUxFX1BSSU5UOworICAgIH0KKworICAgIC8qICJ1bnNldCBub25vbWF0Y2g7IHByaW50IC1OID4iIHBsdXMgdHdvIGlzIDI5ICovCisgICAgbGVuID0gU1RSTEVOKHRlbXBuYW1lKSArIDI5OworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGF0OyArK2kpCS8qIGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIHBhdHRlcm5zICovCisJbGVuICs9IFNUUkxFTihwYXRbaV0pICsgMzsJLyogYWRkIHNwYWNlIGFuZCB0d28gcXVvdGVzICovCisgICAgY29tbWFuZCA9IGFsbG9jKGxlbik7CisgICAgaWYgKGNvbW1hbmQgPT0gTlVMTCkKKyAgICB7CisJLyogb3V0IG9mIG1lbW9yeSAqLworCXZpbV9mcmVlKHRlbXBuYW1lKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBzaGVsbCBjb21tYW5kOgorICAgICAqIC0gU2V0ICRub25vbWF0Y2ggZGVwZW5kaW5nIG9uIEVXX05PVEZPVU5EIChob3BlZnVsbHkgdGhlIHNoZWxsCisgICAgICoJIHJlY29nbml6ZXMgdGhpcykuCisgICAgICogLSBBZGQgdGhlIHNoZWxsIGNvbW1hbmQgdG8gcHJpbnQgdGhlIGV4cGFuZGVkIG5hbWVzLgorICAgICAqIC0gQWRkIHRoZSB0ZW1wIGZpbGUgbmFtZS4KKyAgICAgKiAtIEFkZCB0aGUgZmlsZSBuYW1lIHBhdHRlcm5zLgorICAgICAqLworICAgIGlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9CVCkKKyAgICB7CisJU1RSQ1BZKGNvbW1hbmQsIHBhdFswXSArIDEpOwkJLyogZXhjbHVkZSBmaXJzdCBiYWNrdGljayAqLworCXAgPSBjb21tYW5kICsgU1RSTEVOKGNvbW1hbmQpIC0gMTsKKwkqcCA9ICcgJzsJCQkJLyogcmVtb3ZlIGxhc3QgYmFja3RpY2sgKi8KKwl3aGlsZSAocCA+IGNvbW1hbmQgJiYgdmltX2lzd2hpdGUoKnApKQorCSAgICAtLXA7CisJaWYgKCpwID09ICcmJykJCQkJLyogcmVtb3ZlIHRyYWlsaW5nICcmJyAqLworCXsKKwkgICAgYW1wZXJzZW50ID0gVFJVRTsKKwkgICAgKnAgPSAnICc7CisJfQorCVNUUkNBVChjb21tYW5kLCAiPiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChmbGFncyAmIEVXX05PVEZPVU5EKQorCSAgICBTVFJDUFkoY29tbWFuZCwgInNldCBub25vbWF0Y2g7ICIpOworCWVsc2UKKwkgICAgU1RSQ1BZKGNvbW1hbmQsICJ1bnNldCBub25vbWF0Y2g7ICIpOworCWlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9HTE9CKQorCSAgICBTVFJDQVQoY29tbWFuZCwgImdsb2IgPiIpOworCWVsc2UgaWYgKHNoZWxsX3N0eWxlID09IFNUWUxFX1BSSU5UKQorCSAgICBTVFJDQVQoY29tbWFuZCwgInByaW50IC1OID4iKTsKKwllbHNlCisJICAgIFNUUkNBVChjb21tYW5kLCAiZWNobyA+Iik7CisgICAgfQorICAgIFNUUkNBVChjb21tYW5kLCB0ZW1wbmFtZSk7CisgICAgaWYgKHNoZWxsX3N0eWxlICE9IFNUWUxFX0JUKQorCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0OyArK2kpCisJeworCSAgICAvKiBXaGVuIHVzaW5nIHN5c3RlbSgpIGFsd2F5cyBhZGQgZXh0cmEgcXVvdGVzLCBiZWNhdXNlIHRoZSBzaGVsbAorCSAgICAgKiBpcyBzdGFydGVkIHR3aWNlLiAgT3RoZXJ3aXNlIG9ubHkgcHV0IHF1b3RlcyBhcm91bmQgc3BhY2VzIGFuZAorCSAgICAgKiBzaW5nbGUgcXVvdGVzLiAqLworI2lmZGVmIFVTRV9TWVNURU0KKwkgICAgU1RSQ0FUKGNvbW1hbmQsICIgXCIiKTsKKwkgICAgU1RSQ0FUKGNvbW1hbmQsIHBhdFtpXSk7CisJICAgIFNUUkNBVChjb21tYW5kLCAiXCIiKTsKKyNlbHNlCisJICAgIHAgPSBjb21tYW5kICsgU1RSTEVOKGNvbW1hbmQpOworCSAgICAqcCsrID0gJyAnOworCSAgICBmb3IgKGogPSAwOyBwYXRbaV1bal0gIT0gTlVMOyApCisJCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiICciLCBwYXRbaV1bal0pICE9IE5VTEwpCisJCXsKKwkJICAgICpwKysgPSAnIic7CisJCSAgICB3aGlsZSAocGF0W2ldW2pdICE9IE5VTAorCQkJICAgICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIgJyIsIHBhdFtpXVtqXSkgIT0gTlVMTCkKKwkJCSpwKysgPSBwYXRbaV1baisrXTsKKwkJICAgICpwKysgPSAnIic7CisJCX0KKwkJZWxzZQorCQkgICAgKnArKyA9IHBhdFtpXVtqKytdOworCSAgICAqcCA9IE5VTDsKKyNlbmRpZgorCX0KKyAgICBpZiAoZmxhZ3MgJiBFV19TSUxFTlQpCisJc2hvd19zaGVsbF9tZXNzID0gRkFMU0U7CisgICAgaWYgKGFtcGVyc2VudCkKKwlTVFJDQVQoY29tbWFuZCwgIiYiKTsJCS8qIHB1dCB0aGUgJyYnIGJhY2sgYWZ0ZXIgdGhlCisJCQkJCSAgIHJlZGlyZWN0aW9uICovCisKKyAgICAvKgorICAgICAqIFVzaW5nIHpzaCAtRzogSWYgYSBwYXR0ZXJuIGhhcyBubyBtYXRjaGVzLCBpdCBpcyBqdXN0IGRlbGV0ZWQgZnJvbQorICAgICAqIHRoZSBhcmd1bWVudCBsaXN0LCBvdGhlcndpc2UgenNoIGdpdmVzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGRvZXNuJ3QKKyAgICAgKiBleHBhbmQgYW55IG90aGVyIHBhdHRlcm4uCisgICAgICovCisgICAgaWYgKHNoZWxsX3N0eWxlID09IFNUWUxFX1BSSU5UKQorCWV4dHJhX3NoZWxsX2FyZyA9IChjaGFyX3UgKikiLUciOyAgIC8qIFVzZSB6c2ggTlVMTF9HTE9CIG9wdGlvbiAqLworCisgICAgLyoKKyAgICAgKiBJZiB3ZSB1c2UgLWYgdGhlbiBzaGVsbCB2YXJpYWJsZXMgc2V0IGluIC5jc2hyYyB3b24ndCBnZXQgZXhwYW5kZWQuCisgICAgICogdmkgY2FuIGRvIGl0LCBzbyB3ZSB3aWxsIHRvbywgYnV0IGl0IGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHRoZXJlIGlzIGEgIiQiCisgICAgICogaW4gb25lIG9mIHRoZSBwYXR0ZXJucywgb3RoZXJ3aXNlIHdlIGNhbiBzdGlsbCB1c2UgdGhlIGZhc3Qgb3B0aW9uLgorICAgICAqLworICAgIGVsc2UgaWYgKHNoZWxsX3N0eWxlID09IFNUWUxFX0dMT0IgJiYgIWhhdmVfZG9sbGFycyhudW1fcGF0LCBwYXQpKQorCWV4dHJhX3NoZWxsX2FyZyA9IChjaGFyX3UgKikiLWYiOwkvKiBVc2UgY3NoIGZhc3Qgb3B0aW9uICovCisKKyAgICAvKgorICAgICAqIGV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQKKyAgICAgKi8KKyAgICBpID0gY2FsbF9zaGVsbChjb21tYW5kLCBTSEVMTF9FWFBBTkQgfCBTSEVMTF9TSUxFTlQpOworCisgICAgLyogV2hlbiBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLCBnaXZlIGl0IHNvbWUgdGltZSB0byBjcmVhdGUgdGhlIHRlbXAKKyAgICAgKiBmaWxlLCBidXQgZG9uJ3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLiAqLworICAgIGlmIChhbXBlcnNlbnQpCisJbWNoX2RlbGF5KDEwTCwgVFJVRSk7CisKKyAgICBleHRyYV9zaGVsbF9hcmcgPSBOVUxMOwkJLyogY2xlYW51cCAqLworICAgIHNob3dfc2hlbGxfbWVzcyA9IFRSVUU7CisgICAgdmltX2ZyZWUoY29tbWFuZCk7CisKKyAgICBpZiAoaSkJCQkJLyogbWNoX2NhbGxfc2hlbGwoKSBmYWlsZWQgKi8KKyAgICB7CisJbWNoX3JlbW92ZSh0ZW1wbmFtZSk7CisJdmltX2ZyZWUodGVtcG5hbWUpOworCS8qCisJICogV2l0aCBpbnRlcmFjdGl2ZSBjb21wbGV0aW9uLCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3QgcHJpbnRlZC4KKwkgKiBIb3dldmVyIHdpdGggVVNFX1NZU1RFTSwgSSBkb24ndCBrbm93IGhvdyB0byB0dXJuIG9mZiBlcnJvciBtZXNzYWdlcworCSAqIGZyb20gdGhlIHNoZWxsLCBzbyBzY3JlZW4gbWF5IHN0aWxsIGdldCBtZXNzZWQgdXAgLS0gd2ViYi4KKwkgKi8KKyNpZm5kZWYgVVNFX1NZU1RFTQorCWlmICghKGZsYWdzICYgRVdfU0lMRU5UKSkKKyNlbmRpZgorCXsKKwkgICAgcmVkcmF3X2xhdGVyX2NsZWFyKCk7CS8qIHByb2JhYmx5IG1lc3NlZCB1cCBzY3JlZW4gKi8KKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CQkvKiBjbGVhciBib3R0b20gbGluZSBxdWlja2x5ICovCisJICAgIGNtZGxpbmVfcm93ID0gUm93cyAtIDE7CS8qIGNvbnRpbnVlIG9uIGxhc3QgbGluZSAqLworI2lmZGVmIFVTRV9TWVNURU0KKwkgICAgaWYgKCEoZmxhZ3MgJiBFV19TSUxFTlQpKQorI2VuZGlmCisJICAgIHsKKwkJTVNHKF8oZV93aWxkZXhwYW5kKSk7CisJCW1zZ19zdGFydCgpOwkJLyogZG9uJ3Qgb3ZlcndyaXRlIHRoaXMgbWVzc2FnZSAqLworCSAgICB9CisJfQorCS8qIElmIGEgYGNtZGAgZXhwYW5zaW9uIGZhaWxlZCwgZG9uJ3QgbGlzdCBgY21kYCBhcyBhIG1hdGNoLCBldmVuIHdoZW4KKwkgKiBFV19OT1RGT1VORCBpcyBnaXZlbiAqLworCWlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9CVCkKKwkgICAgcmV0dXJuIEZBSUw7CisJZ290byBub3Rmb3VuZDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHJlYWQgdGhlIG5hbWVzIGZyb20gdGhlIGZpbGUgaW50byBtZW1vcnkKKyAgICAgKi8KKyAgICBmZCA9IGZvcGVuKChjaGFyICopdGVtcG5hbWUsIFJFQURCSU4pOworICAgIGlmIChmZCA9PSBOVUxMKQorICAgIHsKKwkvKiBTb21ldGhpbmcgd2VudCB3cm9uZywgcGVyaGFwcyBhIGZpbGUgbmFtZSB3aXRoIGEgc3BlY2lhbCBjaGFyLiAqLworCWlmICghKGZsYWdzICYgRVdfU0lMRU5UKSkKKwl7CisJICAgIE1TRyhfKGVfd2lsZGV4cGFuZCkpOworCSAgICBtc2dfc3RhcnQoKTsJCS8qIGRvbid0IG92ZXJ3cml0ZSB0aGlzIG1lc3NhZ2UgKi8KKwl9CisJdmltX2ZyZWUodGVtcG5hbWUpOworCWdvdG8gbm90Zm91bmQ7CisgICAgfQorICAgIGZzZWVrKGZkLCAwTCwgU0VFS19FTkQpOworICAgIGxlbiA9IGZ0ZWxsKGZkKTsJCQkvKiBnZXQgc2l6ZSBvZiB0ZW1wIGZpbGUgKi8KKyAgICBmc2VlayhmZCwgMEwsIFNFRUtfU0VUKTsKKyAgICBidWZmZXIgPSBhbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgeworCS8qIG91dCBvZiBtZW1vcnkgKi8KKwltY2hfcmVtb3ZlKHRlbXBuYW1lKTsKKwl2aW1fZnJlZSh0ZW1wbmFtZSk7CisJZmNsb3NlKGZkKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgaSA9IGZyZWFkKChjaGFyICopYnVmZmVyLCAxLCBsZW4sIGZkKTsKKyAgICBmY2xvc2UoZmQpOworICAgIG1jaF9yZW1vdmUodGVtcG5hbWUpOworICAgIGlmIChpICE9IGxlbikKKyAgICB7CisJLyogdW5leHBlY3RlZCByZWFkIGVycm9yICovCisJRU1TRzIoXyhlX25vdHJlYWQpLCB0ZW1wbmFtZSk7CisJdmltX2ZyZWUodGVtcG5hbWUpOworCXZpbV9mcmVlKGJ1ZmZlcik7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHZpbV9mcmVlKHRlbXBuYW1lKTsKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0NZR1dJTjMyX18pCisgICAgLyogVHJhbnNsYXRlIDxDUj48Tkw+IGludG8gPE5MPi4gIENhdXRpb24sIGJ1ZmZlciBtYXkgY29udGFpbiBOVUwuICovCisgICAgcCA9IGJ1ZmZlcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJaWYgKCEoYnVmZmVyW2ldID09IENBUiAmJiBidWZmZXJbaSArIDFdID09IE5MKSkKKwkgICAgKnArKyA9IGJ1ZmZlcltpXTsKKyAgICBsZW4gPSBwIC0gYnVmZmVyOworIyBlbmRpZgorCisKKyAgICAvKiBmaWxlIG5hbWVzIGFyZSBzZXBhcmF0ZWQgd2l0aCBTcGFjZSAqLworICAgIGlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9FQ0hPKQorICAgIHsKKwlidWZmZXJbbGVuXSA9ICdcbic7CQkvKiBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBlbmRzIGluIE5MICovCisJcCA9IGJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyAqcCAhPSAnXG4nOyArK2kpCS8qIGNvdW50IG51bWJlciBvZiBlbnRyaWVzICovCisJeworCSAgICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcbicpCisJCSsrcDsKKwkgICAgcCA9IHNraXB3aGl0ZShwKTsJCS8qIHNraXAgdG8gbmV4dCBlbnRyeSAqLworCX0KKyAgICB9CisgICAgLyogZmlsZSBuYW1lcyBhcmUgc2VwYXJhdGVkIHdpdGggTkwgKi8KKyAgICBlbHNlIGlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9CVCkKKyAgICB7CisJYnVmZmVyW2xlbl0gPSBOVUw7CQkvKiBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBlbmRzIGluIE5VTCAqLworCXAgPSBidWZmZXI7CisJZm9yIChpID0gMDsgKnAgIT0gTlVMOyArK2kpCS8qIGNvdW50IG51bWJlciBvZiBlbnRyaWVzICovCisJeworCSAgICB3aGlsZSAoKnAgIT0gJ1xuJyAmJiAqcCAhPSBOVUwpCisJCSsrcDsKKwkgICAgaWYgKCpwICE9IE5VTCkKKwkJKytwOworCSAgICBwID0gc2tpcHdoaXRlKHApOwkJLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisJfQorICAgIH0KKyAgICAvKiBmaWxlIG5hbWVzIGFyZSBzZXBhcmF0ZWQgd2l0aCBOVUwgKi8KKyAgICBlbHNlCisgICAgeworCS8qCisJICogU29tZSB2ZXJzaW9ucyBvZiB6c2ggdXNlIHNwYWNlcyBpbnN0ZWFkIG9mIE5VTHMgdG8gc2VwYXJhdGUKKwkgKiByZXN1bHRzLiAgT25seSBkbyB0aGlzIHdoZW4gdGhlcmUgaXMgbm8gTlVMIGJlZm9yZSB0aGUgZW5kIG9mIHRoZQorCSAqIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIHdvdWxkIG5ldmVyIGJlIGFibGUgdG8gdXNlIGZpbGUgbmFtZXMgd2l0aAorCSAqIGVtYmVkZGVkIHNwYWNlcyB3aGVuIHpzaCBkb2VzIHVzZSBOVUxzLgorCSAqIFdoZW4gd2UgZm91bmQgYSBOVUwgb25jZSwgd2Uga25vdyB6c2ggaXMgT0ssIHNldCBkaWRfZmluZF9udWwgYW5kCisJICogZG9uJ3QgY2hlY2sgZm9yIHNwYWNlcyBhZ2Fpbi4KKwkgKi8KKwljaGVja19zcGFjZXMgPSBGQUxTRTsKKwlpZiAoc2hlbGxfc3R5bGUgPT0gU1RZTEVfUFJJTlQgJiYgIWRpZF9maW5kX251bCkKKwl7CisJICAgIC8qIElmIHRoZXJlIGlzIGEgTlVMLCBzZXQgZGlkX2ZpbmRfbnVsLCBlbHNlIHNldCBjaGVja19zcGFjZXMgKi8KKwkgICAgaWYgKGxlbiAmJiAoaW50KVNUUkxFTihidWZmZXIpIDwgbGVuIC0gMSkKKwkJZGlkX2ZpbmRfbnVsID0gVFJVRTsKKwkgICAgZWxzZQorCQljaGVja19zcGFjZXMgPSBUUlVFOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBidWZmZXIgZW5kcyB3aXRoIGEgTlVMLiAgRm9yIFNUWUxFX1BSSU5UIHRoZXJlCisJICogYWxyZWFkeSBpcyBvbmUsIGZvciBTVFlMRV9HTE9CIGl0IG5lZWRzIHRvIGJlIGFkZGVkLgorCSAqLworCWlmIChsZW4gJiYgYnVmZmVyW2xlbiAtIDFdID09IE5VTCkKKwkgICAgLS1sZW47CisJZWxzZQorCSAgICBidWZmZXJbbGVuXSA9IE5VTDsKKwlpID0gMDsKKwlmb3IgKHAgPSBidWZmZXI7IHAgPCBidWZmZXIgKyBsZW47ICsrcCkKKwkgICAgaWYgKCpwID09IE5VTCB8fCAoKnAgPT0gJyAnICYmIGNoZWNrX3NwYWNlcykpICAgLyogY291bnQgZW50cnkgKi8KKwkgICAgeworCQkrK2k7CisJCSpwID0gTlVMOworCSAgICB9CisJaWYgKGxlbikKKwkgICAgKytpOwkJCS8qIGNvdW50IGxhc3QgZW50cnkgKi8KKyAgICB9CisgICAgaWYgKGkgPT0gMCkKKyAgICB7CisJLyoKKwkgKiBDYW4gaGFwcGVuIHdoZW4gdXNpbmcgL2Jpbi9zaCBhbmQgdHlwaW5nICI6ZSAkTk9fU1VDSF9WQVJeSSIuCisJICogL2Jpbi9zaCB3aWxsIGhhcHBpbHkgZXhwYW5kIGl0IHRvIG5vdGhpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuCisJICogZXJyb3I7IGFuZCBoZXksIGl0J3MgZ29vZCB0byBjaGVjayBhbnl3YXkgLS0gd2ViYi4KKwkgKi8KKwl2aW1fZnJlZShidWZmZXIpOworCWdvdG8gbm90Zm91bmQ7CisgICAgfQorICAgICpudW1fZmlsZSA9IGk7CisgICAgKmZpbGUgPSAoY2hhcl91ICoqKWFsbG9jKHNpemVvZihjaGFyX3UgKikgKiBpKTsKKyAgICBpZiAoKmZpbGUgPT0gTlVMTCkKKyAgICB7CisJLyogb3V0IG9mIG1lbW9yeSAqLworCXZpbV9mcmVlKGJ1ZmZlcik7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJc29sYXRlIHRoZSBpbmRpdmlkdWFsIGZpbGUgbmFtZXMuCisgICAgICovCisgICAgcCA9IGJ1ZmZlcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKm51bV9maWxlOyArK2kpCisgICAgeworCSgqZmlsZSlbaV0gPSBwOworCS8qIFNwYWNlIG9yIE5MIHNlcGFyYXRlcyAqLworCWlmIChzaGVsbF9zdHlsZSA9PSBTVFlMRV9FQ0hPIHx8IHNoZWxsX3N0eWxlID09IFNUWUxFX0JUKQorCXsKKwkgICAgd2hpbGUgKCEoc2hlbGxfc3R5bGUgPT0gU1RZTEVfRUNITyAmJiAqcCA9PSAnICcpICYmICpwICE9ICdcbicpCisJCSsrcDsKKwkgICAgaWYgKHAgPT0gYnVmZmVyICsgbGVuKQkJLyogbGFzdCBlbnRyeSAqLworCQkqcCA9IE5VTDsKKwkgICAgZWxzZQorCSAgICB7CisJCSpwKysgPSBOVUw7CisJCXAgPSBza2lwd2hpdGUocCk7CQkvKiBza2lwIHRvIG5leHQgZW50cnkgKi8KKwkgICAgfQorCX0KKwllbHNlCQkvKiBOVUwgc2VwYXJhdGVzICovCisJeworCSAgICB3aGlsZSAoKnAgJiYgcCA8IGJ1ZmZlciArIGxlbikJLyogc2tpcCBlbnRyeSAqLworCQkrK3A7CisJICAgICsrcDsJCQkJLyogc2tpcCBOVUwgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNb3ZlIHRoZSBmaWxlIG5hbWVzIHRvIGFsbG9jYXRlZCBtZW1vcnkuCisgICAgICovCisgICAgZm9yIChqID0gMCwgaSA9IDA7IGkgPCAqbnVtX2ZpbGU7ICsraSkKKyAgICB7CisJLyogUmVxdWlyZSB0aGUgZmlsZXMgdG8gZXhpc3QuCUhlbHBzIHdoZW4gdXNpbmcgL2Jpbi9zaCAqLworCWlmICghKGZsYWdzICYgRVdfTk9URk9VTkQpICYmIG1jaF9nZXRwZXJtKCgqZmlsZSlbaV0pIDwgMCkKKwkgICAgY29udGludWU7CisKKwkvKiBjaGVjayBpZiB0aGlzIGVudHJ5IHNob3VsZCBiZSBpbmNsdWRlZCAqLworCWRpciA9IChtY2hfaXNkaXIoKCpmaWxlKVtpXSkpOworCWlmICgoZGlyICYmICEoZmxhZ3MgJiBFV19ESVIpKSB8fCAoIWRpciAmJiAhKGZsYWdzICYgRVdfRklMRSkpKQorCSAgICBjb250aW51ZTsKKworCXAgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTigoKmZpbGUpW2ldKSArIDEgKyBkaXIpKTsKKwlpZiAocCkKKwl7CisJICAgIFNUUkNQWShwLCAoKmZpbGUpW2ldKTsKKwkgICAgaWYgKGRpcikKKwkJU1RSQ0FUKHAsICIvIik7CSAgICAvKiBhZGQgJy8nIHRvIGEgZGlyZWN0b3J5IG5hbWUgKi8KKwkgICAgKCpmaWxlKVtqKytdID0gcDsKKwl9CisgICAgfQorICAgIHZpbV9mcmVlKGJ1ZmZlcik7CisgICAgKm51bV9maWxlID0gajsKKworICAgIGlmICgqbnVtX2ZpbGUgPT0gMCkJICAgIC8qIHJlamVjdGVkIGFsbCBlbnRyaWVzICovCisgICAgeworCXZpbV9mcmVlKCpmaWxlKTsKKwkqZmlsZSA9IE5VTEw7CisJZ290byBub3Rmb3VuZDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CisKK25vdGZvdW5kOgorICAgIGlmIChmbGFncyAmIEVXX05PVEZPVU5EKQorCXJldHVybiBzYXZlX3BhdHRlcm5zKG51bV9wYXQsIHBhdCwgbnVtX2ZpbGUsIGZpbGUpOworICAgIHJldHVybiBGQUlMOworCisjZW5kaWYgLyogX19FTVhfXyAqLworfQorCisjZW5kaWYgLyogVk1TICovCisKKyNpZm5kZWYgX19FTVhfXworICAgIHN0YXRpYyBpbnQKK3NhdmVfcGF0dGVybnMobnVtX3BhdCwgcGF0LCBudW1fZmlsZSwgZmlsZSkKKyAgICBpbnQJCW51bV9wYXQ7CisgICAgY2hhcl91CSoqcGF0OworICAgIGludAkJKm51bV9maWxlOworICAgIGNoYXJfdQkqKipmaWxlOworeworICAgIGludAkJaTsKKworICAgICpmaWxlID0gKGNoYXJfdSAqKilhbGxvYyhudW1fcGF0ICogc2l6ZW9mKGNoYXJfdSAqKSk7CisgICAgaWYgKCpmaWxlID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXQ7IGkrKykKKwkoKmZpbGUpW2ldID0gdmltX3N0cnNhdmUocGF0W2ldKTsKKyAgICAqbnVtX2ZpbGUgPSBudW1fcGF0OworICAgIHJldHVybiBPSzsKK30KKyNlbmRpZgorCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgc3RyaW5nICJwIiBjb250YWlucyBhIHdpbGRjYXJkIHRoYXQgbWNoX2V4cGFuZHBhdGgoKSBjYW4KKyAqIGV4cGFuZC4KKyAqLworICAgIGludAorbWNoX2hhc19leHBfd2lsZGNhcmQocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIGZvciAoIDsgKnA7ICsrcCkKKyAgICB7CisjaWZuZGVmIE9TMgorCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCSAgICArK3A7CisJZWxzZQorI2VuZGlmCisJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikKKyNpZmRlZiBWTVMKKwkJCQkgICAgIio/JSIKKyNlbHNlCisjIGlmZGVmIE9TMgorCQkJCSAgICAiKj8iCisjIGVsc2UKKwkJCQkgICAgIio/W3snIgorIyBlbmRpZgorI2VuZGlmCisJCQkJCQksICpwKSAhPSBOVUxMKQorCSAgICByZXR1cm4gVFJVRTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgc3RyaW5nICJwIiBjb250YWlucyBhIHdpbGRjYXJkLgorICogRG9uJ3QgcmVjb2duaXplICd+JyBhdCB0aGUgZW5kIGFzIGEgd2lsZGNhcmQuCisgKi8KKyAgICBpbnQKK21jaF9oYXNfd2lsZGNhcmQocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIGZvciAoIDsgKnA7ICsrcCkKKyAgICB7CisjaWZuZGVmIE9TMgorCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQorCSAgICArK3A7CisJZWxzZQorI2VuZGlmCisJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikKKyNpZmRlZiBWTVMKKwkJCQkgICAgIio/JSQiCisjZWxzZQorIyBpZmRlZiBPUzIKKyMgIGlmZGVmIFZJTV9CQUNLVElDSworCQkJCSAgICAiKj8kYCIKKyMgIGVsc2UKKwkJCQkgICAgIio/JCIKKyMgIGVuZGlmCisjIGVsc2UKKwkJCQkgICAgIio/W3tgJyQiCisjIGVuZGlmCisjZW5kaWYKKwkJCQkJCSwgKnApICE9IE5VTEwKKwkJfHwgKCpwID09ICd+JyAmJiBwWzFdICE9IE5VTCkpCisJICAgIHJldHVybiBUUlVFOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmbmRlZiBfX0VNWF9fCisgICAgc3RhdGljIGludAoraGF2ZV93aWxkY2FyZChudW0sIGZpbGUpCisgICAgaW50CSAgICBudW07CisgICAgY2hhcl91ICAqKmZpbGU7Cit7CisgICAgaW50CSAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCWlmIChtY2hfaGFzX3dpbGRjYXJkKGZpbGVbaV0pKQorCSAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworICAgIHN0YXRpYyBpbnQKK2hhdmVfZG9sbGFycyhudW0sIGZpbGUpCisgICAgaW50CSAgICBudW07CisgICAgY2hhcl91ICAqKmZpbGU7Cit7CisgICAgaW50CSAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCWlmICh2aW1fc3RyY2hyKGZpbGVbaV0sICckJykgIT0gTlVMTCkKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCS8qIGlmbmRlZiBfX0VNWF9fICovCisKKyNpZm5kZWYgSEFWRV9SRU5BTUUKKy8qCisgKiBTY2FsZWQtZG93biB2ZXJzaW9uIG9mIHJlbmFtZSgpLCB3aGljaCBpcyBtaXNzaW5nIGluIFhlbml4LgorICogVGhpcyB2ZXJzaW9uIGNhbiBvbmx5IG1vdmUgcmVndWxhciBmaWxlcyBhbmQgd2lsbCBmYWlsIGlmIHRoZQorICogZGVzdGluYXRpb24gZXhpc3RzLgorICovCisgICAgaW50CittY2hfcmVuYW1lKHNyYywgZGVzdCkKKyAgICBjb25zdCBjaGFyICpzcmMsICpkZXN0OworeworICAgIHN0cnVjdCBzdGF0CSAgICBzdDsKKworICAgIGlmIChzdGF0KGRlc3QsICZzdCkgPj0gMCkJICAgIC8qIGZhaWwgaWYgZGVzdGluYXRpb24gZXhpc3RzICovCisJcmV0dXJuIC0xOworICAgIGlmIChsaW5rKHNyYywgZGVzdCkgIT0gMCkJICAgIC8qIGxpbmsgZmlsZSB0byBuZXcgbmFtZSAqLworCXJldHVybiAtMTsKKyAgICBpZiAobWNoX3JlbW92ZShzcmMpID09IDApCSAgICAvKiBkZWxldGUgbGluayB0byBvbGQgbmFtZSAqLworCXJldHVybiAwOworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZiAvKiAhSEFWRV9SRU5BTUUgKi8KKworI2lmZGVmIEZFQVRfTU9VU0VfR1BNCisvKgorICogSW5pdGlhbGl6ZXMgY29ubmVjdGlvbiB3aXRoIGdwbSAoaWYgaXQgaXNuJ3QgYWxyZWFkeSBvcGVuZWQpCisgKiBSZXR1cm4gMSBpZiBzdWNjZWVkZWQgKG9yIGNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuZWQpLCAwIGlmIGZhaWxlZAorICovCisgICAgc3RhdGljIGludAorZ3BtX29wZW4oKQoreworICAgIHN0YXRpYyBHcG1fQ29ubmVjdCBncG1fY29ubmVjdDsgLyogTXVzdCBpdCBiZSBrZXB0IHRpbGwgY2xvc2luZyA/ICovCisKKyAgICBpZiAoIWdwbV9mbGFnKQorICAgIHsKKwlncG1fY29ubmVjdC5ldmVudE1hc2sgPSAoR1BNX1VQIHwgR1BNX0RSQUcgfCBHUE1fRE9XTik7CisJZ3BtX2Nvbm5lY3QuZGVmYXVsdE1hc2sgPSB+R1BNX0hBUkQ7CisJLyogRGVmYXVsdCBoYW5kbGluZyBmb3IgbW91c2UgbW92ZSovCisJZ3BtX2Nvbm5lY3QubWluTW9kID0gMDsgLyogSGFuZGxlIGFueSBtb2RpZmllciBrZXlzICovCisJZ3BtX2Nvbm5lY3QubWF4TW9kID0gMHhmZmZmOworCWlmIChHcG1fT3BlbigmZ3BtX2Nvbm5lY3QsIDApID4gMCkKKwl7CisJICAgIC8qIGdwbSBsaWJyYXJ5IHRyaWVzIHRvIGhhbmRsaW5nIFRTVFAgY2F1c2VzCisJICAgICAqIHByb2JsZW1zLiBBbnl3YXlzLCB3ZSBjbG9zZSBjb25uZWN0aW9uIHRvIEdwbSB3aGVuZXZlcgorCSAgICAgKiB3ZSBhcmUgZ29pbmcgdG8gc3VzcGVuZCBvciBzdGFydGluZyBhbiBleHRlcm5hbCBwcm9jZXNzCisJICAgICAqIHNvIHdlIHNob3VsZCdudCAgaGF2ZSBwcm9ibGVtIHdpdGggdGhpcworCSAgICAgKi8KKwkgICAgc2lnbmFsKFNJR1RTVFAsIHJlc3RyaWN0ZWQgPyBTSUdfSUdOIDogU0lHX0RGTCk7CisJICAgIHJldHVybiAxOyAvKiBzdWNjZWVkICovCisJfQorCWlmIChncG1fZmQgPT0gLTIpCisJICAgIEdwbV9DbG9zZSgpOyAvKiBXZSBkb24ndCB3YW50IHRvIHRhbGsgdG8geHRlcm0gdmlhIGdwbSAqLworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsgLyogYWxyZWFkeSBvcGVuICovCit9CisKKy8qCisgKiBDbG9zZXMgY29ubmVjdGlvbiB0byBncG0KKyAqIHJldHVybnMgbm9uLXplcm8gaWYgY29ubmVjdGlvbiBzdWNjZXNmdWxseSBjbG9zZWQKKyAqLworICAgIHN0YXRpYyB2b2lkCitncG1fY2xvc2UoKQoreworICAgIGlmIChncG1fZmxhZyAmJiBncG1fZmQgPj0gMCkgLyogaWYgT3BlbiAqLworCUdwbV9DbG9zZSgpOworfQorCisvKiBSZWFkcyBncG0gZXZlbnQgYW5kIGFkZHMgc3BlY2lhbCBrZXlzIHRvIGlucHV0IGJ1Zi4gUmV0dXJucyBsZW5ndGggb2YKKyAqIGdlbmVyYXRlZCBrZXkgc2VxdWVuY2UuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1hZGUgYWZ0ZXIgZ3VpX3NlbmRfbW91c2VfZXZlbnQKKyAqLworICAgIHN0YXRpYyBpbnQKK21jaF9ncG1fcHJvY2VzcygpCit7CisgICAgaW50CQkJYnV0dG9uOworICAgIHN0YXRpYyBHcG1fRXZlbnQJZ3BtX2V2ZW50OworICAgIGNoYXJfdQkJc3RyaW5nWzZdOworICAgIGludF91CQl2aW1fbW9kaWZpZXJzOworICAgIGludAkJCXJvdyxjb2w7CisgICAgdW5zaWduZWQgY2hhcglidXR0b25zX21hc2s7CisgICAgdW5zaWduZWQgY2hhcglncG1fbW9kaWZpZXJzOworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG9sZF9idXR0b25zID0gMDsKKworICAgIEdwbV9HZXRFdmVudCgmZ3BtX2V2ZW50KTsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogRG9uJ3QgcHV0IGV2ZW50cyBpbiB0aGUgaW5wdXQgcXVldWUgbm93LiAqLworICAgIGlmIChob2xkX2d1aV9ldmVudHMpCisJcmV0dXJuIDA7CisjZW5kaWYKKworICAgIHJvdyA9IGdwbV9ldmVudC55IC0gMTsKKyAgICBjb2wgPSBncG1fZXZlbnQueCAtIDE7CisKKyAgICBzdHJpbmdbMF0gPSBFU0M7IC8qIE91ciB0ZXJtY29kZSAqLworICAgIHN0cmluZ1sxXSA9ICdNJzsKKyAgICBzdHJpbmdbMl0gPSAnRyc7CisgICAgc3dpdGNoIChHUE1fQkFSRV9FVkVOVFMoZ3BtX2V2ZW50LnR5cGUpKQorICAgIHsKKwljYXNlIEdQTV9EUkFHOgorCSAgICBzdHJpbmdbM10gPSBNT1VTRV9EUkFHOworCSAgICBicmVhazsKKwljYXNlIEdQTV9ET1dOOgorCSAgICBidXR0b25zX21hc2sgPSBncG1fZXZlbnQuYnV0dG9ucyAmIH5vbGRfYnV0dG9uczsKKwkgICAgb2xkX2J1dHRvbnMgPSBncG1fZXZlbnQuYnV0dG9uczsKKwkgICAgc3dpdGNoIChidXR0b25zX21hc2spCisJICAgIHsKKwkJY2FzZSBHUE1fQl9MRUZUOgorCQkgICAgYnV0dG9uID0gTU9VU0VfTEVGVDsKKwkJICAgIGJyZWFrOworCQljYXNlIEdQTV9CX01JRERMRToKKwkJICAgIGJ1dHRvbiA9IE1PVVNFX01JRERMRTsKKwkJICAgIGJyZWFrOworCQljYXNlIEdQTV9CX1JJR0hUOgorCQkgICAgYnV0dG9uID0gTU9VU0VfUklHSFQ7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHJldHVybiAwOworCQkgICAgLypEb24ndCBrbm93IHdoYXQgdG8gZG8uIENhbiBtb3JlIHRoYW4gb25lIGJ1dHRvbiBiZQorCQkgICAgICogcmVwb3J0ZWQgaW4gb25lIGV2ZW50PyAqLworCSAgICB9CisJICAgIHN0cmluZ1szXSA9IChjaGFyX3UpKGJ1dHRvbiB8IDB4MjApOworCSAgICBTRVRfTlVNX01PVVNFX0NMSUNLUyhzdHJpbmdbM10sIGdwbV9ldmVudC5jbGlja3MgKyAxKTsKKwkgICAgYnJlYWs7CisJY2FzZSBHUE1fVVA6CisJICAgIHN0cmluZ1szXSA9IE1PVVNFX1JFTEVBU0U7CisJICAgIG9sZF9idXR0b25zICY9IH5ncG1fZXZlbnQuYnV0dG9uczsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGd1aV94MTFfbW91c2VfY2IgaW4gZ3VpX3gxMS5jICovCisgICAgZ3BtX21vZGlmaWVycyA9IGdwbV9ldmVudC5tb2RpZmllcnM7CisgICAgdmltX21vZGlmaWVycyA9IDB4MDsKKyAgICAvKiBJIGlnbm9yZSBjYXBzbG9jayBzdGF0cy4gQXJlbid0IHdlIGFsbCBqdXN0IGhhdGUgY2Fwc2xvY2sgbWl4aW5nIHdpdGgKKyAgICAgKiBWaW0gY29tbWFuZHMgPyBCZXNpZGVzLCBncG1fZXZlbnQubW9kaWZpZXJzIGlzIHVuc2lnbmVkIGNoYXIsIGFuZAorICAgICAqIEtfQ0FQU1NISUZUIGlzIGRlZmluZWQgOCwgc28gaXQgcHJvYmFibHkgaXNuJ3QgZXZlbiByZXBvcnRlZAorICAgICAqLworICAgIGlmIChncG1fbW9kaWZpZXJzICYgKCgxIDw8IEtHX1NISUZUKSB8ICgxIDw8IEtHX1NISUZUUikgfCAoMSA8PCBLR19TSElGVEwpKSkKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX1NISUZUOworCisgICAgaWYgKGdwbV9tb2RpZmllcnMgJiAoKDEgPDwgS0dfQ1RSTCkgfCAoMSA8PCBLR19DVFJMUikgfCAoMSA8PCBLR19DVFJMTCkpKQorCXZpbV9tb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKKyAgICBpZiAoZ3BtX21vZGlmaWVycyAmICgoMSA8PCBLR19BTFQpIHwgKDEgPDwgS0dfQUxUR1IpKSkKKwl2aW1fbW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKKyAgICBzdHJpbmdbM10gfD0gdmltX21vZGlmaWVyczsKKyAgICBzdHJpbmdbNF0gPSAoY2hhcl91KShjb2wgKyAnICcgKyAxKTsKKyAgICBzdHJpbmdbNV0gPSAoY2hhcl91KShyb3cgKyAnICcgKyAxKTsKKyAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgNik7CisgICAgcmV0dXJuIDY7Cit9CisjZW5kaWYgLyogRkVBVF9NT1VTRV9HUE0gKi8KKworI2lmIGRlZmluZWQoRkVBVF9MSUJDQUxMKSB8fCBkZWZpbmVkKFBST1RPKQordHlwZWRlZiBjaGFyX3UgKiAoKlNUUlBST0NTVFIpX19BUkdTKChjaGFyX3UgKikpOwordHlwZWRlZiBjaGFyX3UgKiAoKklOVFBST0NTVFIpX19BUkdTKChpbnQpKTsKK3R5cGVkZWYgaW50ICgqU1RSUFJPQ0lOVClfX0FSR1MoKGNoYXJfdSAqKSk7Cit0eXBlZGVmIGludCAoKklOVFBST0NJTlQpX19BUkdTKChpbnQpKTsKKworLyoKKyAqIENhbGwgYSBETEwgcm91dGluZSB3aGljaCB0YWtlcyBlaXRoZXIgYSBzdHJpbmcgb3IgaW50IHBhcmFtCisgKiBhbmQgcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nLgorICovCisgICAgaW50CittY2hfbGliY2FsbChsaWJuYW1lLCBmdW5jbmFtZSwgYXJnc3RyaW5nLCBhcmdpbnQsIHN0cmluZ19yZXN1bHQsIG51bWJlcl9yZXN1bHQpCisgICAgY2hhcl91CSpsaWJuYW1lOworICAgIGNoYXJfdQkqZnVuY25hbWU7CisgICAgY2hhcl91CSphcmdzdHJpbmc7CS8qIE5VTEwgd2hlbiB1c2luZyBhIGFyZ2ludCAqLworICAgIGludAkJYXJnaW50OworICAgIGNoYXJfdQkqKnN0cmluZ19yZXN1bHQ7LyogTlVMTCB3aGVuIHVzaW5nIG51bWJlcl9yZXN1bHQgKi8KKyAgICBpbnQJCSpudW1iZXJfcmVzdWx0OworeworIyBpZiBkZWZpbmVkKFVTRV9ETE9QRU4pCisgICAgdm9pZAkqaGluc3RMaWI7CisjIGVsc2UKKyAgICBzaGxfdAloaW5zdExpYjsKKyMgZW5kaWYKKyAgICBTVFJQUk9DU1RSCVByb2NBZGQ7CisgICAgSU5UUFJPQ1NUUglQcm9jQWRkSTsKKyAgICBjaGFyX3UJKnJldHZhbF9zdHIgPSBOVUxMOworICAgIGludAkJcmV0dmFsX2ludCA9IDA7CisgICAgaW50CQlzdWNjZXNzID0gRkFMU0U7CisKKyAgICAvKiBHZXQgYSBoYW5kbGUgdG8gdGhlIERMTCBtb2R1bGUuICovCisjIGlmIGRlZmluZWQoVVNFX0RMT1BFTikKKyAgICBoaW5zdExpYiA9IGRsb3BlbigoY2hhciAqKWxpYm5hbWUsIFJUTERfTEFaWQorIyAgaWZkZWYgUlRMRF9MT0NBTAorCSAgICB8IFJUTERfTE9DQUwKKyMgIGVuZGlmCisJICAgICk7CisjIGVsc2UKKyAgICBoaW5zdExpYiA9IHNobF9sb2FkKChjb25zdCBjaGFyKilsaWJuYW1lLCBCSU5EX0lNTUVESUFURXxCSU5EX1ZFUkJPU0UsIDBMKTsKKyMgZW5kaWYKKworICAgIC8qIElmIHRoZSBoYW5kbGUgaXMgdmFsaWQsIHRyeSB0byBnZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MuICovCisgICAgaWYgKGhpbnN0TGliICE9IE5VTEwpCisgICAgeworIyBpZmRlZiBIQVZFX1NFVEpNUF9ICisJLyoKKwkgKiBDYXRjaCBhIGNyYXNoIHdoZW4gY2FsbGluZyB0aGUgbGlicmFyeSBmdW5jdGlvbi4gIEZvciBleGFtcGxlIHdoZW4KKwkgKiB1c2luZyBhIG51bWJlciB3aGVyZSBhIHN0cmluZyBwb2ludGVyIGlzIGV4cGVjdGVkLgorCSAqLworCW1jaF9zdGFydGptcCgpOworCWlmIChTRVRKTVAobGNfanVtcF9lbnYpICE9IDApCisJeworCSAgICBzdWNjZXNzID0gRkFMU0U7CisJICAgIG1jaF9kaWRqbXAoKTsKKwl9CisJZWxzZQorIyBlbmRpZgorCXsKKwkgICAgcmV0dmFsX3N0ciA9IE5VTEw7CisJICAgIHJldHZhbF9pbnQgPSAwOworCisJICAgIGlmIChhcmdzdHJpbmcgIT0gTlVMTCkKKwkgICAgeworIyBpZiBkZWZpbmVkKFVTRV9ETE9QRU4pCisJCVByb2NBZGQgPSAoU1RSUFJPQ1NUUilkbHN5bShoaW5zdExpYiwgKGNvbnN0IGNoYXIgKilmdW5jbmFtZSk7CisjIGVsc2UKKwkJaWYgKHNobF9maW5kc3ltKCZoaW5zdExpYiwgKGNvbnN0IGNoYXIgKilmdW5jbmFtZSwKKwkJCQkJVFlQRV9QUk9DRURVUkUsICh2b2lkICopJlByb2NBZGQpIDwgMCkKKwkJICAgIFByb2NBZGQgPSBOVUxMOworIyBlbmRpZgorCQlpZiAoKHN1Y2Nlc3MgPSAoUHJvY0FkZCAhPSBOVUxMKSkpCisJCXsKKwkJICAgIGlmIChzdHJpbmdfcmVzdWx0ID09IE5VTEwpCisJCQlyZXR2YWxfaW50ID0gKChTVFJQUk9DSU5UKVByb2NBZGQpKGFyZ3N0cmluZyk7CisJCSAgICBlbHNlCisJCQlyZXR2YWxfc3RyID0gKFByb2NBZGQpKGFyZ3N0cmluZyk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKyMgaWYgZGVmaW5lZChVU0VfRExPUEVOKQorCQlQcm9jQWRkSSA9IChJTlRQUk9DU1RSKWRsc3ltKGhpbnN0TGliLCAoY29uc3QgY2hhciAqKWZ1bmNuYW1lKTsKKyMgZWxzZQorCQlpZiAoc2hsX2ZpbmRzeW0oJmhpbnN0TGliLCAoY29uc3QgY2hhciAqKWZ1bmNuYW1lLAorCQkJCSAgICAgICBUWVBFX1BST0NFRFVSRSwgKHZvaWQgKikmUHJvY0FkZEkpIDwgMCkKKwkJICAgIFByb2NBZGRJID0gTlVMTDsKKyMgZW5kaWYKKwkJaWYgKChzdWNjZXNzID0gKFByb2NBZGRJICE9IE5VTEwpKSkKKwkJeworCQkgICAgaWYgKHN0cmluZ19yZXN1bHQgPT0gTlVMTCkKKwkJCXJldHZhbF9pbnQgPSAoKElOVFBST0NJTlQpUHJvY0FkZEkpKGFyZ2ludCk7CisJCSAgICBlbHNlCisJCQlyZXR2YWxfc3RyID0gKFByb2NBZGRJKShhcmdpbnQpOworCQl9CisJICAgIH0KKworCSAgICAvKiBTYXZlIHRoZSBzdHJpbmcgYmVmb3JlIHdlIGZyZWUgdGhlIGxpYnJhcnkuICovCisJICAgIC8qIEFzc3VtZSB0aGF0IGEgIjEiIG9yICItMSIgcmVzdWx0IGlzIGFuIGlsbGVnYWwgcG9pbnRlci4gKi8KKwkgICAgaWYgKHN0cmluZ19yZXN1bHQgPT0gTlVMTCkKKwkJKm51bWJlcl9yZXN1bHQgPSByZXR2YWxfaW50OworCSAgICBlbHNlIGlmIChyZXR2YWxfc3RyICE9IE5VTEwKKwkJICAgICYmIHJldHZhbF9zdHIgIT0gKGNoYXJfdSAqKTEKKwkJICAgICYmIHJldHZhbF9zdHIgIT0gKGNoYXJfdSAqKS0xKQorCQkqc3RyaW5nX3Jlc3VsdCA9IHZpbV9zdHJzYXZlKHJldHZhbF9zdHIpOworCX0KKworIyBpZmRlZiBIQVZFX1NFVEpNUF9ICisJbWNoX2VuZGptcCgpOworIyAgaWZkZWYgU0lHSEFTQVJHCisJaWYgKGxjX3NpZ25hbCAhPSAwKQorCXsKKwkgICAgaW50IGk7CisKKwkgICAgLyogdHJ5IHRvIGZpbmQgdGhlIG5hbWUgb2YgdGhpcyBzaWduYWwgKi8KKwkgICAgZm9yIChpID0gMDsgc2lnbmFsX2luZm9baV0uc2lnICE9IC0xOyBpKyspCisJCWlmIChsY19zaWduYWwgPT0gc2lnbmFsX2luZm9baV0uc2lnKQorCQkgICAgYnJlYWs7CisJICAgIEVNU0cyKCJFMzY4OiBnb3QgU0lHJXMgaW4gbGliY2FsbCgpIiwgc2lnbmFsX2luZm9baV0ubmFtZSk7CisJfQorIyAgZW5kaWYKKyMgZW5kaWYKKworCS8qIEZyZWUgdGhlIERMTCBtb2R1bGUuICovCisjIGlmIGRlZmluZWQoVVNFX0RMT1BFTikKKwkodm9pZClkbGNsb3NlKGhpbnN0TGliKTsKKyMgZWxzZQorCSh2b2lkKXNobF91bmxvYWQoaGluc3RMaWIpOworIyBlbmRpZgorICAgIH0KKworICAgIGlmICghc3VjY2VzcykKKyAgICB7CisJRU1TRzIoXyhlX2xpYmNhbGwpLCBmdW5jbmFtZSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChGRUFUX1gxMSkgJiYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludAl4dGVybV90cmFjZSA9IC0xOwkvKiBkZWZhdWx0OiBkaXNhYmxlZCAqLworc3RhdGljIGludAl4dGVybV9idXR0b247CisKKy8qCisgKiBTZXR1cCBhIGR1bW15IHdpbmRvdyBmb3IgWCBzZWxlY3Rpb25zIGluIGEgdGVybWluYWwuCisgKi8KKyAgICB2b2lkCitzZXR1cF90ZXJtX2NsaXAoKQoreworICAgIGludAkJeiA9IDA7CisgICAgY2hhcgkqc3RycCA9ICIiOworICAgIFdpZGdldAlBcHBTaGVsbDsKKworICAgIGlmICgheF9jb25uZWN0X3RvX3NlcnZlcigpKQorCXJldHVybjsKKworICAgIG9wZW5fYXBwX2NvbnRleHQoKTsKKyAgICBpZiAoYXBwX2NvbnRleHQgIT0gTlVMTCAmJiB4dGVybV9TaGVsbCA9PSAoV2lkZ2V0KTApCisgICAgeworCWludCAoKm9sZGhhbmRsZXIpKCk7CisjaWYgZGVmaW5lZChIQVZFX1NFVEpNUF9IKQorCWludCAoKm9sZElPaGFuZGxlcikoKTsKKyNlbmRpZgorIyBpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkKKwlzdHJ1Y3QgdGltZXZhbCAgc3RhcnRfdHY7CisKKwlpZiAocF92ZXJib3NlID4gMCkKKwkgICAgZ2V0dGltZW9mZGF5KCZzdGFydF90diwgTlVMTCk7CisjIGVuZGlmCisKKwkvKiBJZ25vcmUgWCBlcnJvcnMgd2hpbGUgb3BlbmluZyB0aGUgZGlzcGxheSAqLworCW9sZGhhbmRsZXIgPSBYU2V0RXJyb3JIYW5kbGVyKHhfZXJyb3JfY2hlY2spOworCisjaWYgZGVmaW5lZChIQVZFX1NFVEpNUF9IKQorCS8qIElnbm9yZSBYIElPIGVycm9ycyB3aGlsZSBvcGVuaW5nIHRoZSBkaXNwbGF5ICovCisJb2xkSU9oYW5kbGVyID0gWFNldElPRXJyb3JIYW5kbGVyKHhfSU9lcnJvcl9jaGVjayk7CisJbWNoX3N0YXJ0am1wKCk7CisJaWYgKFNFVEpNUChsY19qdW1wX2VudikgIT0gMCkKKwl7CisJICAgIG1jaF9kaWRqbXAoKTsKKwkgICAgeHRlcm1fZHB5ID0gTlVMTDsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICB4dGVybV9kcHkgPSBYdE9wZW5EaXNwbGF5KGFwcF9jb250ZXh0LCB4dGVybV9kaXNwbGF5LAorCQkgICAgInZpbV94dGVybSIsICJWaW1feHRlcm0iLCBOVUxMLCAwLCAmeiwgJnN0cnApOworI2lmIGRlZmluZWQoSEFWRV9TRVRKTVBfSCkKKwkgICAgbWNoX2VuZGptcCgpOworI2VuZGlmCisJfQorCisjaWYgZGVmaW5lZChIQVZFX1NFVEpNUF9IKQorCS8qIE5vdyBoYW5kbGUgWCBJTyBlcnJvcnMgbm9ybWFsbHkuICovCisJKHZvaWQpWFNldElPRXJyb3JIYW5kbGVyKG9sZElPaGFuZGxlcik7CisjZW5kaWYKKwkvKiBOb3cgaGFuZGxlIFggZXJyb3JzIG5vcm1hbGx5LiAqLworCSh2b2lkKVhTZXRFcnJvckhhbmRsZXIob2xkaGFuZGxlcik7CisKKwlpZiAoeHRlcm1fZHB5ID09IE5VTEwpCisJeworCSAgICBpZiAocF92ZXJib3NlID4gMCkKKwkJTVNHKF8oIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiKSk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBDYXRjaCB0ZXJtaW5hdGluZyBlcnJvciBvZiB0aGUgWCBzZXJ2ZXIgY29ubmVjdGlvbi4gKi8KKwkodm9pZClYU2V0SU9FcnJvckhhbmRsZXIoeF9JT2Vycm9yX2hhbmRsZXIpOworCisjIGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQorCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICB4b3Blbl9tZXNzYWdlKCZzdGFydF90dik7CisjIGVuZGlmCisKKwkvKiBDcmVhdGUgYSBTaGVsbCB0byBtYWtlIGNvbnZlcnRlcnMgd29yay4gKi8KKwlBcHBTaGVsbCA9IFh0VmFBcHBDcmVhdGVTaGVsbCgidmltX3h0ZXJtIiwgIlZpbV94dGVybSIsCisJCWFwcGxpY2F0aW9uU2hlbGxXaWRnZXRDbGFzcywgeHRlcm1fZHB5LAorCQlOVUxMKTsKKwlpZiAoQXBwU2hlbGwgPT0gKFdpZGdldCkwKQorCSAgICByZXR1cm47CisJeHRlcm1fU2hlbGwgPSBYdFZhQ3JlYXRlUG9wdXBTaGVsbCgiVklNIiwKKwkJdG9wTGV2ZWxTaGVsbFdpZGdldENsYXNzLCBBcHBTaGVsbCwKKwkJWHRObWFwcGVkV2hlbk1hbmFnZWQsIDAsCisJCVh0TndpZHRoLCAxLAorCQlYdE5oZWlnaHQsIDEsCisJCU5VTEwpOworCWlmICh4dGVybV9TaGVsbCA9PSAoV2lkZ2V0KTApCisJICAgIHJldHVybjsKKworCXgxMV9zZXR1cF9hdG9tcyh4dGVybV9kcHkpOworCWlmICh4MTFfZGlzcGxheSA9PSBOVUxMKQorCSAgICB4MTFfZGlzcGxheSA9IHh0ZXJtX2RweTsKKworCVh0UmVhbGl6ZVdpZGdldCh4dGVybV9TaGVsbCk7CisJWFN5bmMoeHRlcm1fZHB5LCBGYWxzZSk7CisJeHRlcm1fdXBkYXRlKCk7CisgICAgfQorICAgIGlmICh4dGVybV9TaGVsbCAhPSAoV2lkZ2V0KTApCisgICAgeworCWNsaXBfaW5pdChUUlVFKTsKKwlpZiAoeDExX3dpbmRvdyA9PSAwICYmIChzdHJwID0gZ2V0ZW52KCJXSU5ET1dJRCIpKSAhPSBOVUxMKQorCSAgICB4MTFfd2luZG93ID0gKFdpbmRvdylhdG9sKHN0cnApOworCS8qIENoZWNrIGlmICRXSU5ET1dJRCBpcyB2YWxpZC4gKi8KKwlpZiAodGVzdF94MTFfd2luZG93KHh0ZXJtX2RweSkgPT0gRkFJTCkKKwkgICAgeDExX3dpbmRvdyA9IDA7CisJaWYgKHgxMV93aW5kb3cgIT0gMCkKKwkgICAgeHRlcm1fdHJhY2UgPSAwOworICAgIH0KK30KKworICAgIHZvaWQKK3N0YXJ0X3h0ZXJtX3RyYWNlKGJ1dHRvbikKKyAgICBpbnQgYnV0dG9uOworeworICAgIGlmICh4MTFfd2luZG93ID09IDAgfHwgeHRlcm1fdHJhY2UgPCAwIHx8IHh0ZXJtX1NoZWxsID09IChXaWRnZXQpMCkKKwlyZXR1cm47CisgICAgeHRlcm1fdHJhY2UgPSAxOworICAgIHh0ZXJtX2J1dHRvbiA9IGJ1dHRvbjsKKyAgICBkb194dGVybV90cmFjZSgpOworfQorCisKKyAgICB2b2lkCitzdG9wX3h0ZXJtX3RyYWNlKCkKK3sKKyAgICBpZiAoeHRlcm1fdHJhY2UgPCAwKQorCXJldHVybjsKKyAgICB4dGVybV90cmFjZSA9IDA7Cit9CisKKy8qCisgKiBRdWVyeSB0aGUgeHRlcm0gcG9pbnRlciBhbmQgZ2VuZXJhdGUgbW91c2UgdGVybWNvZGVzIGlmIG5lY2Vzc2FyeQorICogcmV0dXJuIFRSVUUgaWYgZHJhZ2dpbmcgaXMgYWN0aXZlLCBlbHNlIEZBTFNFCisgKi8KKyAgICBzdGF0aWMgaW50Citkb194dGVybV90cmFjZSgpCit7CisgICAgV2luZG93CQlyb290LCBjaGlsZDsKKyAgICBpbnQJCQlyb290X3gsIHJvb3RfeTsKKyAgICBpbnQJCQl3aW5feCwgd2luX3k7CisgICAgaW50CQkJcm93LCBjb2w7CisgICAgaW50X3UJCW1hc2tfcmV0dXJuOworICAgIGNoYXJfdQkJYnVmWzUwXTsKKyAgICBjaGFyX3UJCSpzdHJwOworICAgIGxvbmcJCWdvdF9oaW50czsKKyAgICBzdGF0aWMgY2hhcl91CSptb3VzZV9jb2RlOworICAgIHN0YXRpYyBjaGFyX3UJbW91c2VfbmFtZVsyXSA9IHtLU19NT1VTRSwgS0VfRklMTEVSfTsKKyAgICBzdGF0aWMgaW50CQlwcmV2X3JvdyA9IDAsIHByZXZfY29sID0gMDsKKyAgICBzdGF0aWMgWFNpemVIaW50cwl4dGVybV9oaW50czsKKworICAgIGlmICh4dGVybV90cmFjZSA8PSAwKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmICh4dGVybV90cmFjZSA9PSAxKQorICAgIHsKKwkvKiBHZXQgdGhlIGhpbnRzIGp1c3QgYmVmb3JlIHRyYWNraW5nIHN0YXJ0cy4gIFRoZSBmb250IHNpemUgbWlnaHQKKwkgKiBoYXZlIGNoYW5nZWQgcmVjZW50bHkgKi8KKwlYR2V0V01Ob3JtYWxIaW50cyh4dGVybV9kcHksIHgxMV93aW5kb3csICZ4dGVybV9oaW50cywgJmdvdF9oaW50cyk7CisJaWYgKCEoZ290X2hpbnRzICYgUFJlc2l6ZUluYykKKwkJfHwgeHRlcm1faGludHMud2lkdGhfaW5jIDw9IDEKKwkJfHwgeHRlcm1faGludHMuaGVpZ2h0X2luYyA8PSAxKQorCXsKKwkgICAgeHRlcm1fdHJhY2UgPSAtMTsgIC8qIE5vdCBlbm91Z2ggZGF0YSAtLSBkaXNhYmxlIHRyYWNpbmcgKi8KKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFJlbHkgb24gdGhlIHNhbWUgbW91c2UgY29kZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgKi8KKwltb3VzZV9jb2RlID0gZmluZF90ZXJtY29kZShtb3VzZV9uYW1lKTsKKwlwcmV2X3JvdyA9IG1vdXNlX3JvdzsKKwlwcmV2X3JvdyA9IG1vdXNlX2NvbDsKKwl4dGVybV90cmFjZSA9IDI7CisKKwkvKiBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJzLCB0aGVyZSBtaWdodCBiZSBhIHNjcm9sbGJhciBvbiB0aGUKKwkgKiBsZWZ0IG9mIHRoZSB3aW5kb3cgYW5kL29yIGEgbWVudSBvbiB0aGUgdG9wIChldGVybSBldGMuKSAqLworCVhRdWVyeVBvaW50ZXIoeHRlcm1fZHB5LCB4MTFfd2luZG93LCAmcm9vdCwgJmNoaWxkLCAmcm9vdF94LCAmcm9vdF95LAorCQkgICAgICAmd2luX3gsICZ3aW5feSwgJm1hc2tfcmV0dXJuKTsKKwl4dGVybV9oaW50cy55ID0gd2luX3kgLSAoeHRlcm1faGludHMuaGVpZ2h0X2luYyAqIG1vdXNlX3JvdykKKwkJCSAgICAgIC0gKHh0ZXJtX2hpbnRzLmhlaWdodF9pbmMgLyAyKTsKKwlpZiAoeHRlcm1faGludHMueSA8PSB4dGVybV9oaW50cy5oZWlnaHRfaW5jIC8gMikKKwkgICAgeHRlcm1faGludHMueSA9IDI7CisJeHRlcm1faGludHMueCA9IHdpbl94IC0gKHh0ZXJtX2hpbnRzLndpZHRoX2luYyAqIG1vdXNlX2NvbCkKKwkJCSAgICAgIC0gKHh0ZXJtX2hpbnRzLndpZHRoX2luYyAvIDIpOworCWlmICh4dGVybV9oaW50cy54IDw9IHh0ZXJtX2hpbnRzLndpZHRoX2luYyAvIDIpCisJICAgIHh0ZXJtX2hpbnRzLnggPSAyOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobW91c2VfY29kZSA9PSBOVUxMKQorICAgIHsKKwl4dGVybV90cmFjZSA9IDA7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIFhRdWVyeVBvaW50ZXIoeHRlcm1fZHB5LCB4MTFfd2luZG93LCAmcm9vdCwgJmNoaWxkLCAmcm9vdF94LCAmcm9vdF95LAorCQkgICZ3aW5feCwgJndpbl95LCAmbWFza19yZXR1cm4pOworCisgICAgcm93ID0gY2hlY2tfcm93KCh3aW5feSAtIHh0ZXJtX2hpbnRzLnkpIC8geHRlcm1faGludHMuaGVpZ2h0X2luYyk7CisgICAgY29sID0gY2hlY2tfY29sKCh3aW5feCAtIHh0ZXJtX2hpbnRzLngpIC8geHRlcm1faGludHMud2lkdGhfaW5jKTsKKyAgICBpZiAocm93ID09IHByZXZfcm93ICYmIGNvbCA9PSBwcmV2X2NvbCkKKwlyZXR1cm4gVFJVRTsKKworICAgIFNUUkNQWShidWYsIG1vdXNlX2NvZGUpOworICAgIHN0cnAgPSBidWYgKyBTVFJMRU4oYnVmKTsKKyAgICAqc3RycCsrID0gKHh0ZXJtX2J1dHRvbiB8IE1PVVNFX0RSQUcpICYgfjB4MjA7CisgICAgKnN0cnArKyA9IChjaGFyX3UpKGNvbCArICcgJyArIDEpOworICAgICpzdHJwKysgPSAoY2hhcl91KShyb3cgKyAnICcgKyAxKTsKKyAgICAqc3RycCA9IDA7CisgICAgYWRkX3RvX2lucHV0X2J1ZihidWYsIFNUUkxFTihidWYpKTsKKworICAgIHByZXZfcm93ID0gcm93OworICAgIHByZXZfY29sID0gY29sOworICAgIHJldHVybiBUUlVFOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRGVzdHJveSB0aGUgZGlzcGxheSwgd2luZG93IGFuZCBhcHBfY29udGV4dC4gIFJlcXVpcmVkIGZvciBHVEsuCisgKi8KKyAgICB2b2lkCitjbGVhcl94dGVybV9jbGlwKCkKK3sKKyAgICBpZiAoeHRlcm1fU2hlbGwgIT0gKFdpZGdldCkwKQorICAgIHsKKwlYdERlc3Ryb3lXaWRnZXQoeHRlcm1fU2hlbGwpOworCXh0ZXJtX1NoZWxsID0gKFdpZGdldCkwOworICAgIH0KKyAgICBpZiAoeHRlcm1fZHB5ICE9IE5VTEwpCisgICAgeworI2lmIDAKKwkvKiBMZXNzdGlmIGFuZCBTb2xhcmlzIGNyYXNoIGhlcmUsIGxvc2Ugc29tZSBtZW1vcnkgKi8KKwlYdENsb3NlRGlzcGxheSh4dGVybV9kcHkpOworI2VuZGlmCisJaWYgKHgxMV9kaXNwbGF5ID09IHh0ZXJtX2RweSkKKwkgICAgeDExX2Rpc3BsYXkgPSBOVUxMOworCXh0ZXJtX2RweSA9IE5VTEw7CisgICAgfQorI2lmIDAKKyAgICBpZiAoYXBwX2NvbnRleHQgIT0gKFh0QXBwQ29udGV4dClOVUxMKQorICAgIHsKKwkvKiBMZXNzdGlmIGFuZCBTb2xhcmlzIGNyYXNoIGhlcmUsIGxvc2Ugc29tZSBtZW1vcnkgKi8KKwlYdERlc3Ryb3lBcHBsaWNhdGlvbkNvbnRleHQoYXBwX2NvbnRleHQpOworCWFwcF9jb250ZXh0ID0gKFh0QXBwQ29udGV4dClOVUxMOworICAgIH0KKyNlbmRpZgorfQorIyBlbmRpZgorCisvKgorICogQ2F0Y2ggdXAgd2l0aCBhbnkgcXVldWVkIFggZXZlbnRzLiAgVGhpcyBtYXkgcHV0IGtleWJvYXJkIGlucHV0IGludG8gdGhlCisgKiBpbnB1dCBidWZmZXIsIGNhbGwgcmVzaXplIGNhbGwtYmFja3MsIHRyaWdnZXIgdGltZXJzIGV0Yy4gIElmIHRoZXJlIGlzCisgKiBub3RoaW5nIGluIHRoZSBYIGV2ZW50IHF1ZXVlICgmIG5vIHRpbWVycyBwZW5kaW5nKSwgdGhlbiB3ZSByZXR1cm4KKyAqIGltbWVkaWF0ZWx5LgorICovCisgICAgc3RhdGljIHZvaWQKK3h0ZXJtX3VwZGF0ZSgpCit7CisgICAgWEV2ZW50IGV2ZW50OworCisgICAgd2hpbGUgKFh0QXBwUGVuZGluZyhhcHBfY29udGV4dCkgJiYgIXZpbV9pc19pbnB1dF9idWZfZnVsbCgpKQorICAgIHsKKwlYdEFwcE5leHRFdmVudChhcHBfY29udGV4dCwgJmV2ZW50KTsKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorCXsKKwkgICAgWFByb3BlcnR5RXZlbnQgKmUgPSAoWFByb3BlcnR5RXZlbnQgKikmZXZlbnQ7CisKKwkgICAgaWYgKGUtPnR5cGUgPT0gUHJvcGVydHlOb3RpZnkgJiYgZS0+d2luZG93ID09IGNvbW1XaW5kb3cKKwkJICAgJiYgZS0+YXRvbSA9PSBjb21tUHJvcGVydHkgJiYgZS0+c3RhdGUgPT0gUHJvcGVydHlOZXdWYWx1ZSkKKwkJc2VydmVyRXZlbnRQcm9jKHh0ZXJtX2RweSwgJmV2ZW50KTsKKwl9CisjZW5kaWYKKwlYdERpc3BhdGNoRXZlbnQoJmV2ZW50KTsKKyAgICB9Cit9CisKKyAgICBpbnQKK2NsaXBfeHRlcm1fb3duX3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkICpjYmQ7Cit7CisgICAgaWYgKHh0ZXJtX1NoZWxsICE9IChXaWRnZXQpMCkKKwlyZXR1cm4gY2xpcF94MTFfb3duX3NlbGVjdGlvbih4dGVybV9TaGVsbCwgY2JkKTsKKyAgICByZXR1cm4gRkFJTDsKK30KKworICAgIHZvaWQKK2NsaXBfeHRlcm1fbG9zZV9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZCAqY2JkOworeworICAgIGlmICh4dGVybV9TaGVsbCAhPSAoV2lkZ2V0KTApCisJY2xpcF94MTFfbG9zZV9zZWxlY3Rpb24oeHRlcm1fU2hlbGwsIGNiZCk7Cit9CisKKyAgICB2b2lkCitjbGlwX3h0ZXJtX3JlcXVlc3Rfc2VsZWN0aW9uKGNiZCkKKyAgICBWaW1DbGlwYm9hcmQgKmNiZDsKK3sKKyAgICBpZiAoeHRlcm1fU2hlbGwgIT0gKFdpZGdldCkwKQorCWNsaXBfeDExX3JlcXVlc3Rfc2VsZWN0aW9uKHh0ZXJtX1NoZWxsLCB4dGVybV9kcHksIGNiZCk7Cit9CisKKyAgICB2b2lkCitjbGlwX3h0ZXJtX3NldF9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZCAqY2JkOworeworICAgIGNsaXBfeDExX3NldF9zZWxlY3Rpb24oY2JkKTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKFVTRV9YU01QKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENvZGUgZm9yIFggU2Vzc2lvbiBNYW5hZ2VtZW50IFByb3RvY29sLgorICovCitzdGF0aWMgdm9pZCB4c21wX2hhbmRsZV9zYXZlX3lvdXJzZWxmIF9fQVJHUygoU21jQ29ubiBzbWNfY29ubiwgU21Qb2ludGVyIGNsaWVudF9kYXRhLCBpbnQgc2F2ZV90eXBlLCBCb29sIHNodXRkb3duLCBpbnQgaW50ZXJhY3Rfc3R5bGUsIEJvb2wgZmFzdCkpOworc3RhdGljIHZvaWQgeHNtcF9kaWUgX19BUkdTKChTbWNDb25uIHNtY19jb25uLCBTbVBvaW50ZXIgY2xpZW50X2RhdGEpKTsKK3N0YXRpYyB2b2lkIHhzbXBfc2F2ZV9jb21wbGV0ZSBfX0FSR1MoKFNtY0Nvbm4gc21jX2Nvbm4sIFNtUG9pbnRlciBjbGllbnRfZGF0YSkpOworc3RhdGljIHZvaWQgeHNtcF9zaHV0ZG93bl9jYW5jZWxsZWQgX19BUkdTKChTbWNDb25uIHNtY19jb25uLCBTbVBvaW50ZXIJY2xpZW50X2RhdGEpKTsKK3N0YXRpYyB2b2lkIHhzbXBfaWNlX2Nvbm5lY3Rpb24gX19BUkdTKChJY2VDb25uIGljZUNvbm4sIEljZVBvaW50ZXIgY2xpZW50RGF0YSwgQm9vbCBvcGVuaW5nLCBJY2VQb2ludGVyICp3YXRjaERhdGEpKTsKKworCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoVVNFX1hTTVBfSU5URVJBQ1QpCitzdGF0aWMgdm9pZCB4c21wX2hhbmRsZV9pbnRlcmFjdGlvbiBfX0FSR1MoKFNtY0Nvbm4gc21jX2Nvbm4sIFNtUG9pbnRlciBjbGllbnRfZGF0YSkpOworCisvKgorICogVGhpcyBpcyBvdXIgY2hhbmNlIHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gc2F2ZSwKKyAqIG9yIGFib3J0IHRoZSBsb2dvdXQKKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3hzbXBfaGFuZGxlX2ludGVyYWN0aW9uKHNtY19jb25uLCBjbGllbnRfZGF0YSkKKyAgICBTbWNDb25uCXNtY19jb25uOworICAgIFNtUG9pbnRlcgljbGllbnRfZGF0YTsKK3sKKyAgICBjbWRtb2RfVAlzYXZlX2NtZG1vZDsKKyAgICBpbnQJCWNhbmNlbF9zaHV0ZG93biA9IEZhbHNlOworCisgICAgc2F2ZV9jbWRtb2QgPSBjbWRtb2Q7CisgICAgY21kbW9kLmNvbmZpcm0gPSBUUlVFOworICAgIGlmIChjaGVja19jaGFuZ2VkX2FueShGQUxTRSkpCisJLyogTXVzdG4ndCBsb2dvdXQgKi8KKwljYW5jZWxfc2h1dGRvd24gPSBUcnVlOworICAgIGNtZG1vZCA9IHNhdmVfY21kbW9kOworICAgIHNldGN1cnNvcigpOwkJLyogcG9zaXRpb24gY3Vyc29yICovCisgICAgb3V0X2ZsdXNoKCk7CisKKyAgICAvKiBEb25lIGludGVyYWN0aW9uICovCisgICAgU21jSW50ZXJhY3REb25lKHNtY19jb25uLCBjYW5jZWxfc2h1dGRvd24pOworCisgICAgLyogRmluaXNoIG9mZgorICAgICAqIE9ubHkgZW5kIHNhdmUteW91cnNlbGYgaGVyZSBpZiB3ZSdyZSBub3QgY2FuY2VsbGluZyBzaHV0ZG93bjsKKyAgICAgKiB3ZSdsbCBnZXQgYSBjYW5jZWxsZWQgY2FsbGJhY2sgbGF0ZXIgaW4gd2hpY2ggd2UnbGwgZW5kIGl0LgorICAgICAqIEhvcGVmdWxseSBnZXQgYXJvdW5kIGdsaXRjaHkgU01zIChsaWtlIEdOT01FLTEpCisgICAgICovCisgICAgaWYgKCFjYW5jZWxfc2h1dGRvd24pCisgICAgeworCXhzbXAuc2F2ZV95b3Vyc2VsZiA9IEZhbHNlOworCVNtY1NhdmVZb3Vyc2VsZkRvbmUoc21jX2Nvbm4sIFRydWUpOworICAgIH0KK30KKyMgZW5kaWYKKworLyoKKyAqIENhbGxiYWNrIHRoYXQgc3RhcnRzIHNhdmUteW91cnNlbGYuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit4c21wX2hhbmRsZV9zYXZlX3lvdXJzZWxmKHNtY19jb25uLCBjbGllbnRfZGF0YSwgc2F2ZV90eXBlLAorCQkJCQkgICAgICAgc2h1dGRvd24sIGludGVyYWN0X3N0eWxlLCBmYXN0KQorICAgIFNtY0Nvbm4Jc21jX2Nvbm47CisgICAgU21Qb2ludGVyCWNsaWVudF9kYXRhOworICAgIGludAkJc2F2ZV90eXBlOworICAgIEJvb2wJc2h1dGRvd247CisgICAgaW50CQlpbnRlcmFjdF9zdHlsZTsKKyAgICBCb29sCWZhc3Q7Cit7CisgICAgLyogSGFuZGxlIGFscmVhZHkgYmVpbmcgaW4gc2F2ZXlvdXJzZWxmICovCisgICAgaWYgKHhzbXAuc2F2ZV95b3Vyc2VsZikKKwlTbWNTYXZlWW91cnNlbGZEb25lKHNtY19jb25uLCBUcnVlKTsKKyAgICB4c21wLnNhdmVfeW91cnNlbGYgPSBUcnVlOworICAgIHhzbXAuc2h1dGRvd24gPSBzaHV0ZG93bjsKKworICAgIC8qIEZpcnN0IHVwLCBwcmVzZXJ2ZSBhbGwgZmlsZXMgKi8KKyAgICBvdXRfZmx1c2goKTsKKyAgICBtbF9zeW5jX2FsbChGQUxTRSwgRkFMU0UpOwkvKiBwcmVzZXJ2ZSBhbGwgc3dhcCBmaWxlcyAqLworCisgICAgaWYgKHBfdmVyYm9zZSA+IDApCisJTVNHKF8oIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IikpOworCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoVVNFX1hTTVBfSU5URVJBQ1QpCisgICAgLyogTm93IHNlZSBpZiB3ZSBjYW4gYXNrIGFib3V0IHVuc2F2ZWQgZmlsZXMgKi8KKyAgICBpZiAoc2h1dGRvd24gJiYgIWZhc3QgJiYgZ3VpLmluX3VzZSkKKwkvKiBOZWVkIHRvIGludGVyYWN0IHdpdGggdXNlciwgYnV0IG5lZWQgU00ncyBwZXJtaXNzaW9uICovCisJU21jSW50ZXJhY3RSZXF1ZXN0KHNtY19jb25uLCBTbURpYWxvZ0Vycm9yLAorCQkJCQl4c21wX2hhbmRsZV9pbnRlcmFjdGlvbiwgY2xpZW50X2RhdGEpOworICAgIGVsc2UKKyMgZW5kaWYKKyAgICB7CisJLyogQ2FuIHN0b3AgdGhlIGN5Y2xlIGhlcmUgKi8KKwlTbWNTYXZlWW91cnNlbGZEb25lKHNtY19jb25uLCBUcnVlKTsKKwl4c21wLnNhdmVfeW91cnNlbGYgPSBGYWxzZTsKKyAgICB9Cit9CisKKworLyoKKyAqIENhbGxiYWNrIHRvIHdhcm4gdXMgb2YgaW1taW5lbnQgZGVhdGguCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit4c21wX2RpZShzbWNfY29ubiwgY2xpZW50X2RhdGEpCisgICAgU21jQ29ubglzbWNfY29ubjsKKyAgICBTbVBvaW50ZXIJY2xpZW50X2RhdGE7Cit7CisgICAgeHNtcF9jbG9zZSgpOworCisgICAgLyogcXVpdCBxdWlja2x5IGxlYXZpbmcgc3dhcGZpbGVzIGZvciBtb2RpZmllZCBidWZmZXJzIGJlaGluZCAqLworICAgIGdldG91dF9wcmVzZXJ2ZV9tb2RpZmllZCgwKTsKK30KKworCisvKgorICogQ2FsbGJhY2sgdG8gdGVsbCB1cyB0aGF0IHNhdmUteW91cnNlbGYgaGFzIGNvbXBsZXRlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgc3RhdGljIHZvaWQKK3hzbXBfc2F2ZV9jb21wbGV0ZShzbWNfY29ubiwgY2xpZW50X2RhdGEpCisgICAgU21jQ29ubglzbWNfY29ubjsKKyAgICBTbVBvaW50ZXIJY2xpZW50X2RhdGE7Cit7CisgICAgeHNtcC5zYXZlX3lvdXJzZWxmID0gRmFsc2U7Cit9CisKKworLyoKKyAqIENhbGxiYWNrIHRvIHRlbGwgdXMgdGhhdCBhbiBpbnN0aWdhdGVkIHNodXRkb3duIHdhcyBjYW5jZWxsZWQKKyAqIChtYXliZSBldmVuIGJ5IHVzKQorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAoreHNtcF9zaHV0ZG93bl9jYW5jZWxsZWQoc21jX2Nvbm4sIGNsaWVudF9kYXRhKQorICAgIFNtY0Nvbm4Jc21jX2Nvbm47CisgICAgU21Qb2ludGVyCWNsaWVudF9kYXRhOworeworICAgIGlmICh4c21wLnNhdmVfeW91cnNlbGYpCisJU21jU2F2ZVlvdXJzZWxmRG9uZShzbWNfY29ubiwgVHJ1ZSk7CisgICAgeHNtcC5zYXZlX3lvdXJzZWxmID0gRmFsc2U7CisgICAgeHNtcC5zaHV0ZG93biA9IEZhbHNlOworfQorCisKKy8qCisgKiBDYWxsYmFjayB0byB0ZWxsIHVzIHRoYXQgYSBuZXcgSUNFIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHN0YXRpYyB2b2lkCit4c21wX2ljZV9jb25uZWN0aW9uKGljZUNvbm4sIGNsaWVudERhdGEsIG9wZW5pbmcsIHdhdGNoRGF0YSkKKyAgICBJY2VDb25uCWljZUNvbm47CisgICAgSWNlUG9pbnRlcgljbGllbnREYXRhOworICAgIEJvb2wJb3BlbmluZzsKKyAgICBJY2VQb2ludGVyCSp3YXRjaERhdGE7Cit7CisgICAgLyogSW50ZXJjZXB0IGNyZWF0aW9uIG9mIElDRSBjb25uZWN0aW9uIGZkICovCisgICAgaWYgKG9wZW5pbmcpCisgICAgeworCXhzbXBfaWNlZmQgPSBJY2VDb25uZWN0aW9uTnVtYmVyKGljZUNvbm4pOworCUljZVJlbW92ZUNvbm5lY3Rpb25XYXRjaCh4c21wX2ljZV9jb25uZWN0aW9uLCBOVUxMKTsKKyAgICB9Cit9CisKKworLyogSGFuZGxlIGFueSBJQ0UgcHJvY2Vzc2luZyB0aGF0J3MgcmVxdWlyZWQ7IHJldHVybiBGQUlMIGlmIFNNIGxvc3QgKi8KKyAgICBpbnQKK3hzbXBfaGFuZGxlX3JlcXVlc3RzKCkKK3sKKyAgICBCb29sIHJlcDsKKworICAgIGlmIChJY2VQcm9jZXNzTWVzc2FnZXMoeHNtcC5pY2Vjb25uLCBOVUxMLCAmcmVwKQorCQkJCQkJID09IEljZVByb2Nlc3NNZXNzYWdlc0lPRXJyb3IpCisgICAgeworCS8qIExvc3QgSUNFICovCisJaWYgKHBfdmVyYm9zZSA+IDApCisJICAgIE1TRyhfKCJYU01QIGxvc3QgSUNFIGNvbm5lY3Rpb24iKSk7CisJeHNtcF9jbG9zZSgpOworCXJldHVybiBGQUlMOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIE9LOworfQorCitzdGF0aWMgaW50IGR1bW15OworCisvKiBTZXQgdXAgWCBTZXNzaW9uIE1hbmFnZW1lbnQgUHJvdG9jb2wgKi8KKyAgICB2b2lkCit4c21wX2luaXQodm9pZCkKK3sKKyAgICBjaGFyCQllcnJvcnN0cmluZ1s4MF07CisgICAgY2hhcgkJKmNsaWVudGlkOworICAgIFNtY0NhbGxiYWNrcwlzbWNhbGxiYWNrczsKKyNpZiAwCisgICAgU21Qcm9wVmFsdWUJCXNtbmFtZTsKKyAgICBTbVByb3AJCXNtbmFtZXByb3A7CisgICAgU21Qcm9wCQkqc21wcm9wc1sxXTsKKyNlbmRpZgorCisgICAgaWYgKHBfdmVyYm9zZSA+IDApCisJTVNHKF8oIlhTTVAgb3BlbmluZyBjb25uZWN0aW9uIikpOworCisgICAgeHNtcC5zYXZlX3lvdXJzZWxmID0geHNtcC5zaHV0ZG93biA9IEZhbHNlOworCisgICAgLyogU2V0IHVwIFNNIGNhbGxiYWNrcyAtIG11c3QgaGF2ZSBhbGwsIGV2ZW4gaWYgdGhleSdyZSBub3QgdXNlZCAqLworICAgIHNtY2FsbGJhY2tzLnNhdmVfeW91cnNlbGYuY2FsbGJhY2sgPSB4c21wX2hhbmRsZV9zYXZlX3lvdXJzZWxmOworICAgIHNtY2FsbGJhY2tzLnNhdmVfeW91cnNlbGYuY2xpZW50X2RhdGEgPSBOVUxMOworICAgIHNtY2FsbGJhY2tzLmRpZS5jYWxsYmFjayA9IHhzbXBfZGllOworICAgIHNtY2FsbGJhY2tzLmRpZS5jbGllbnRfZGF0YSA9IE5VTEw7CisgICAgc21jYWxsYmFja3Muc2F2ZV9jb21wbGV0ZS5jYWxsYmFjayA9IHhzbXBfc2F2ZV9jb21wbGV0ZTsKKyAgICBzbWNhbGxiYWNrcy5zYXZlX2NvbXBsZXRlLmNsaWVudF9kYXRhID0gTlVMTDsKKyAgICBzbWNhbGxiYWNrcy5zaHV0ZG93bl9jYW5jZWxsZWQuY2FsbGJhY2sgPSB4c21wX3NodXRkb3duX2NhbmNlbGxlZDsKKyAgICBzbWNhbGxiYWNrcy5zaHV0ZG93bl9jYW5jZWxsZWQuY2xpZW50X2RhdGEgPSBOVUxMOworCisgICAgLyogU2V0IHVwIGEgd2F0Y2ggb24gSUNFIGNvbm5lY3Rpb24gY3JlYXRpb25zLiAgVGhlICJkdW1teSIgYXJndW1lbnQgaXMKKyAgICAgKiBhcHBhcmVudGx5IHJlcXVpcmVkIGZvciBGcmVlQlNEICh3ZSBnZXQgYSBCVVMgZXJyb3Igd2hlbiB1c2luZyBOVUxMKS4gKi8KKyAgICBpZiAoSWNlQWRkQ29ubmVjdGlvbldhdGNoKHhzbXBfaWNlX2Nvbm5lY3Rpb24sICZkdW1teSkgPT0gMCkKKyAgICB7CisJaWYgKHBfdmVyYm9zZSA+IDApCisJICAgIE1TRyhfKCJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQ3JlYXRlIGFuIFNNIGNvbm5lY3Rpb24gKi8KKyAgICB4c21wLnNtY2Nvbm4gPSBTbWNPcGVuQ29ubmVjdGlvbigKKwkgICAgTlVMTCwKKwkgICAgTlVMTCwKKwkgICAgU21Qcm90b01ham9yLAorCSAgICBTbVByb3RvTWlub3IsCisJICAgIFNtY1NhdmVZb3Vyc2VsZlByb2NNYXNrIHwgU21jRGllUHJvY01hc2sKKwkJICAgICB8IFNtY1NhdmVDb21wbGV0ZVByb2NNYXNrIHwgU21jU2h1dGRvd25DYW5jZWxsZWRQcm9jTWFzaywKKwkgICAgJnNtY2FsbGJhY2tzLAorCSAgICBOVUxMLAorCSAgICAmY2xpZW50aWQsCisJICAgIHNpemVvZihlcnJvcnN0cmluZyksCisJICAgIGVycm9yc3RyaW5nKTsKKyAgICBpZiAoeHNtcC5zbWNjb25uID09IE5VTEwpCisgICAgeworCWNoYXIgZXJyb3JyZXBvcnRbMTMyXTsKKwlzcHJpbnRmKGVycm9ycmVwb3J0LCBfKCJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiKSwKKwkJZXJyb3JzdHJpbmcpOworCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICBNU0coZXJyb3JyZXBvcnQpOworCXJldHVybjsKKyAgICB9CisgICAgeHNtcC5pY2Vjb25uID0gU21jR2V0SWNlQ29ubmVjdGlvbih4c21wLnNtY2Nvbm4pOworCisjaWYgMAorICAgIC8qIElEIG91cnNlbHZlcyAqLworICAgIHNtbmFtZS52YWx1ZSA9ICJ2aW0iOworICAgIHNtbmFtZS5sZW5ndGggPSAzOworICAgIHNtbmFtZXByb3AubmFtZSA9ICJTbVByb2dyYW0iOworICAgIHNtbmFtZXByb3AudHlwZSA9ICJTbUFSUkFZOCI7CisgICAgc21uYW1lcHJvcC5udW1fdmFscyA9IDE7CisgICAgc21uYW1lcHJvcC52YWxzID0gJnNtbmFtZTsKKworICAgIHNtcHJvcHNbMF0gPSAmc21uYW1lcHJvcDsKKyAgICBTbWNTZXRQcm9wZXJ0aWVzKHhzbXAuc21jY29ubiwgMSwgc21wcm9wcyk7CisjZW5kaWYKK30KKworCisvKiBTaHV0IGRvd24gWFNNUCBjb21tcy4gKi8KKyAgICB2b2lkCit4c21wX2Nsb3NlKCkKK3sKKyAgICBpZiAoeHNtcF9pY2VmZCAhPSAtMSkKKyAgICB7CisJU21jQ2xvc2VDb25uZWN0aW9uKHhzbXAuc21jY29ubiwgMCwgTlVMTCk7CisJeHNtcF9pY2VmZCA9IC0xOworICAgIH0KK30KKyNlbmRpZiAvKiBVU0VfWFNNUCAqLworCisKKyNpZmRlZiBFQkNESUMKKy8qIFRyYW5zbGF0ZSBjaGFyYWN0ZXIgdG8gaXRzIENUUkwtIHZhbHVlICovCitjaGFyIEN0cmxUYWJsZVtdID0KK3sKKy8qIDAwIC0gNUUgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKy8qIF4gKi8gMHgxRSwKKy8qIC0gKi8gMHgxRiwKKy8qIDYxIC0gNkMgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorLyogXyAqLyAweDFGLAorLyogNkUgLSA4MCAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisvKiBhICovIDB4MDEsCisvKiBiICovIDB4MDIsCisvKiBjICovIDB4MDMsCisvKiBkICovIDB4MzcsCisvKiBlICovIDB4MkQsCisvKiBmICovIDB4MkUsCisvKiBnICovIDB4MkYsCisvKiBoICovIDB4MTYsCisvKiBpICovIDB4MDUsCisvKiA4QSAtIDkwICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwKKy8qIGogKi8gMHgxNSwKKy8qIGsgKi8gMHgwQiwKKy8qIGwgKi8gMHgwQywKKy8qIG0gKi8gMHgwRCwKKy8qIG4gKi8gMHgwRSwKKy8qIG8gKi8gMHgwRiwKKy8qIHAgKi8gMHgxMCwKKy8qIHEgKi8gMHgxMSwKKy8qIHIgKi8gMHgxMiwKKy8qIDlBIC0gQTEgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorLyogcyAqLyAweDEzLAorLyogdCAqLyAweDNDLAorLyogdSAqLyAweDNELAorLyogdiAqLyAweDMyLAorLyogdyAqLyAweDI2LAorLyogeCAqLyAweDE4LAorLyogeSAqLyAweDE5LAorLyogeiAqLyAweDNGLAorLyogQUEgLSBBQyAqLworCTAsIDAsIDAsCisvKiBbICovIDB4MjcsCisvKiBBRSAtIEJDICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKy8qIF0gKi8gMHgxRCwKKy8qIEJFIC0gQzAgKi8gMCwgMCwgMCwKKy8qIEEgKi8gMHgwMSwKKy8qIEIgKi8gMHgwMiwKKy8qIEMgKi8gMHgwMywKKy8qIEQgKi8gMHgzNywKKy8qIEUgKi8gMHgyRCwKKy8qIEYgKi8gMHgyRSwKKy8qIEcgKi8gMHgyRiwKKy8qIEggKi8gMHgxNiwKKy8qIEkgKi8gMHgwNSwKKy8qIENBIC0gRDAgKi8gMCwgMCwgMCwgMCwgMCwgMCwgMCwKKy8qIEogKi8gMHgxNSwKKy8qIEsgKi8gMHgwQiwKKy8qIEwgKi8gMHgwQywKKy8qIE0gKi8gMHgwRCwKKy8qIE4gKi8gMHgwRSwKKy8qIE8gKi8gMHgwRiwKKy8qIFAgKi8gMHgxMCwKKy8qIFEgKi8gMHgxMSwKKy8qIFIgKi8gMHgxMiwKKy8qIERBIC0gREYgKi8gMCwgMCwgMCwgMCwgMCwgMCwKKy8qIFwgKi8gMHgxQywKKy8qIEUxICovIDAsCisvKiBTICovIDB4MTMsCisvKiBUICovIDB4M0MsCisvKiBVICovIDB4M0QsCisvKiBWICovIDB4MzIsCisvKiBXICovIDB4MjYsCisvKiBYICovIDB4MTgsCisvKiBZICovIDB4MTksCisvKiBaICovIDB4M0YsCisvKiBFQSAtIEZGKi8gMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworY2hhciBNZXRhQ2hhclRhYmxlW109Cit7LyogICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGICovCisgICAgICAwLCAgMCwgIDAsICAwLCdcXCcsIDAsJ0YnLCAgMCwnVycsJ00nLCdOJywgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgMCwgIDAsICAwLCAgMCwnXScsICAwLCAgMCwnRycsICAwLCAgMCwnUicsJ08nLCAgMCwgIDAsICAwLCAgMCwKKyAgICAnQCcsJ0EnLCdCJywnQycsJ0QnLCdFJywgIDAsICAwLCdIJywnSScsJ0onLCdLJywnTCcsICAwLCAgMCwgIDAsCisgICAgJ1AnLCdRJywgIDAsJ1MnLCdUJywnVScsJ1YnLCAgMCwnWCcsJ1knLCdaJywnWycsICAwLCAgMCwnXicsICAwCit9OworCisKKy8qIFRPRE86IFVzZSBjaGFyYWN0ZXJzIE5PVCBudW1iZXJzISEhICovCitjaGFyIEN0cmxDaGFyVGFibGVbXT0KK3svKiAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KKyAgICAxMjQsMTkzLDE5NCwxOTUsICAwLDIwMSwgIDAsICAwLCAgMCwgIDAsICAwLDIxMCwyMTEsMjEyLDIxMywyMTQsCisgICAgMjE1LDIxNiwyMTcsMjI2LCAgMCwyMDksMjAwLCAgMCwyMzEsMjMyLCAgMCwgIDAsMjI0LDE4OSwgOTUsMTA5LAorICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLDIzMCwxNzMsICAwLCAgMCwgIDAsICAwLCAgMCwxOTcsMTk4LDE5OSwKKyAgICAgIDAsICAwLDIyOSwgIDAsICAwLCAgMCwgIDAsMTk2LCAgMCwgIDAsICAwLCAgMCwyMjcsMjI4LCAgMCwyMzMsCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29zX3VuaXguaCBiL3NyYy9vc191bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4YjIzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc191bml4LmgKQEAgLTAsMCArMSw1MzEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBOZXh0U3RlcCBoYXMgYSBwcm9ibGVtIHdpdGggY29uZmlndXJlLCB1bmRlZmluZSBhIGZldyB0aGluZ3M6CisgKi8KKyNpZmRlZiBOZVhUCisjIGlmZGVmIEhBVkVfVVRJTUUKKyMgIHVuZGVmIEhBVkVfVVRJTUUKKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9TWVNfVVRTTkFNRV9ICisjICB1bmRlZiBIQVZFX1NZU19VVFNOQU1FX0gKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgVkFYQworIyBpbmNsdWRlIDx0eXBlcy5oPgorIyBpbmNsdWRlIDxzdGF0Lmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgX19FTVhfXworIyBkZWZpbmUgSEFWRV9UT1RBTF9NRU0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykKKyMgZGVmaW5lIFdJTjMyVU5JWAkvKiBDb21waWxpbmcgZm9yIFdpbjMyIHVzaW5nIFVuaXggZmlsZXMuICovCisjIGRlZmluZSBCSU5BUllfRklMRV9JTworI2VuZGlmCisKKy8qIE9uIEFJWCA0LjIgdGhlcmUgaXMgYSBjb25mbGljdGluZyBwcm90b3R5cGUgZm9yIGlvY3RsKCkgaW4gc3Ryb3B0cy5oIGFuZAorICogdW5pc3RkLmguICBUaGlzIGhhY2sgc2hvdWxkIGZpeCB0aGF0IChzdWdnZXN0ZWQgYnkgSmVmZiBHZW9yZ2UpLgorICogQnV0IG9uIEFJWCA0LjMgaXQncyBhbHJpZ2h0IChzdWdnZXN0ZWQgYnkgSmFrZSBIYW1ieSkuICovCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChfQUlYKSAmJiAhZGVmaW5lZChfQUlYNDMpICYmICFkZWZpbmVkKF9OT19QUk9UTykKKyMgZGVmaW5lIF9OT19QUk9UTworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJQkNfSAorIyBpbmNsdWRlIDxsaWJjLmg+CQkgICAgLyogZm9yIE5lWFQgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4JICAgIC8qIGRlZmluZXMgQlNELCBpZiBpdCdzIGEgQlNEIHN5c3RlbSAqLworI2VuZGlmCisKKy8qCisgKiBTdW4gZGVmaW5lcyBGSUxFIG9uIFN1bk9TIDQueC54LCBTb2xhcmlzIGhhcyBhIHR5cGVkZWYgZm9yIEZJTEUKKyAqLworI2lmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChGSUxFKQorIyBkZWZpbmUgU09MQVJJUworI2VuZGlmCisKKy8qCisgKiBVc2luZyBnZXRjd2QoKSBpcyBwcmVmZXJyZWQsIGJlY2F1c2UgaXQgY2hlY2tzIGZvciBhIGJ1ZmZlciBvdmVyZmxvdy4KKyAqIERvbid0IHVzZSBnZXRjd2QoKSBvbiBzeXN0ZW1zIGRvIHVzZSBzeXN0ZW0oInNoIC1jIHB3ZCIpLiAgVGhlcmUgaXMgYW4KKyAqIGF1dG9jb25mIGNoZWNrIGZvciB0aGlzLgorICogVXNlIGdldGN3ZCgpIGFueXdheSBpZiBnZXR3ZCgpIGlzbid0IHByZXNlbnQuCisgKi8KKyNpZiBkZWZpbmVkKEhBVkVfR0VUQ1dEKSAmJiAhKGRlZmluZWQoQkFEX0dFVENXRCkgJiYgZGVmaW5lZChIQVZFX0dFVFdEKSkKKyMgZGVmaW5lIFVTRV9HRVRDV0QKKyNlbmRpZgorCisjaWZuZGVmIF9fQVJHUworICAgIC8qIFRoZSBBSVggVmlzdWFsQWdlIGNjIGNvbXBpbGVyIGRlZmluZXMgX19FWFRFTkRFRF9fIGluc3RlYWQgb2YgX19TVERDX18KKyAgICAgKiBiZWNhdXNlIGl0IGluY2x1ZGVzIHByZS1hbnNpIGZlYXR1cmVzLiAqLworIyBpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fRVhURU5ERURfXykKKyMgIGRlZmluZSBfX0FSR1MoeCkgeAorIyBlbHNlCisjICBkZWZpbmUgX19BUkdTKHgpICgpCisjIGVuZGlmCisjZW5kaWYKKworLyogYWx3YXlzIHVzZSB1bmxpbmsoKSB0byByZW1vdmUgZmlsZXMgKi8KKyNpZm5kZWYgUFJPVE8KKyMgaWZkZWYgVk1TCisjICBkZWZpbmUgbWNoX3JlbW92ZSh4KSBkZWxldGUoKGNoYXIgKikoeCkpCisjICBkZWZpbmUgdmltX21rZGlyKHgsIHkpIG1rZGlyKChjaGFyICopKHgpLCB5KQorIyAgaWZkZWYgVkFYCisjICBlbHNlCisjICAgZGVmaW5lIG1jaF9ybWRpcih4KSBybWRpcigoY2hhciAqKSh4KSkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSB2aW1fbWtkaXIoeCwgeSkgbWtkaXIoKGNoYXIgKikoeCksIHkpCisjICBkZWZpbmUgbWNoX3JtZGlyKHgpIHJtZGlyKChjaGFyICopKHgpKQorIyAgZGVmaW5lIG1jaF9yZW1vdmUoeCkgdW5saW5rKChjaGFyICopKHgpKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGEgc2lnbmFsIGhhbmRsZXIgaXMgY29uZmlndXJlZCBoZXJlLiAqLworLyogSXQgdXNlZCB0byBiZSBhIGxvbmcgbGlzdCBvZiBhbG1vc3QgYWxsIHN5c3RlbXMuIEFueSBzeXN0ZW0gdGhhdCBkb2Vzbid0CisgKiBoYXZlIGFuIGFyZ3VtZW50Pz8/ICovCisjZGVmaW5lIFNJR0hBU0FSRworCisvKiBMaXN0IDMgYXJnIHN5c3RlbXMgaGVyZS4gSSBndWVzcyBfX3NnaSwgcGxlYXNlIHRlc3QgYW5kIGNvcnJlY3QgbWUuIGp3LiAqLworI2lmIGRlZmluZWQoX19zZ2kpICYmIGRlZmluZWQoSEFWRV9TSUdDT05URVhUKQorIyBkZWZpbmUgU0lHSEFTM0FSR1MKKyNlbmRpZgorCisjaWZkZWYgU0lHSEFTQVJHCisjIGlmZGVmIFNJR0hBUzNBUkdTCisjICBkZWZpbmUgU0lHUFJPVE9BUkcJKGludCwgaW50LCBzdHJ1Y3Qgc2lnY29udGV4dCAqKQorIyAgZGVmaW5lIFNJR0RFRkFSRyhzKQkocywgc2lnMiwgc2NvbnQpIGludCBzLCBzaWcyOyBzdHJ1Y3Qgc2lnY29udGV4dCAqc2NvbnQ7CisjICBkZWZpbmUgU0lHRFVNTVlBUkcJMCwgMCwgKHN0cnVjdCBzaWdjb250ZXh0ICopMAorIyBlbHNlCisjICBkZWZpbmUgU0lHUFJPVE9BUkcJKGludCkKKyMgIGRlZmluZSBTSUdERUZBUkcocykJKHMpIGludCBzOworIyAgZGVmaW5lIFNJR0RVTU1ZQVJHCTAKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBTSUdQUk9UT0FSRyAgICh2b2lkKQorIyBkZWZpbmUgU0lHREVGQVJHKHMpICAoKQorIyBkZWZpbmUgU0lHRFVNTVlBUkcKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ESVJFTlRfSAorIyBpbmNsdWRlIDxkaXJlbnQuaD4KKyMgaWZuZGVmIE5BTUxFTgorIyAgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIGRpcmVudCBkaXJlY3QKKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbgorIyBpZiBIQVZFX1NZU19ORElSX0gKKyMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfU1lTX0RJUl9ICisjICBpbmNsdWRlIDxzeXMvZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfTkRJUl9ICisjICBpbmNsdWRlIDxuZGlyLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfU1lTX1RJTUVfSCkgfHwgZGVmaW5lZChUSU1FX1dJVEhfU1lTX1RJTUUpCisjIGluY2x1ZGUgPHRpbWUuaD4JICAgIC8qIG9uIHNvbWUgc3lzdGVtcyB0aW1lLmggc2hvdWxkIG5vdCBiZQorCQkJICAgICAgIGluY2x1ZGVkIHRvZ2V0aGVyIHdpdGggc3lzL3RpbWUuaCAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWYgZGVmaW5lZChESVJTSVopICYmICFkZWZpbmVkKE1BWE5BTUxFTikKKyMgZGVmaW5lIE1BWE5BTUxFTiBESVJTSVoKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVRlNfTUFYTkFNTEVOKSAmJiAhZGVmaW5lZChNQVhOQU1MRU4pCisjIGRlZmluZSBNQVhOQU1MRU4gVUZTX01BWE5BTUxFTiAgICAvKiBmb3IgZHluaXgvcHR4ICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTkFNRV9NQVgpICYmICFkZWZpbmVkKE1BWE5BTUxFTikKKyMgZGVmaW5lIE1BWE5BTUxFTiBOQU1FX01BWAkgICAgLyogZm9yIExpbnV4IGJlZm9yZSAuOTlwMyAqLworI2VuZGlmCisKKy8qCisgKiBOb3RlOiBpZiBNQVhOQU1MRU4gaGFzIHRoZSB3cm9uZyB2YWx1ZSwgeW91IHdpbGwgZ2V0IGVycm9yIG1lc3NhZ2VzCisgKgkgZm9yIG5vdCBiZWluZyBhYmxlIHRvIG9wZW4gdGhlIHN3YXAgZmlsZS4KKyAqLworI2lmICFkZWZpbmVkKE1BWE5BTUxFTikKKyMgZGVmaW5lIE1BWE5BTUxFTiA1MTIJCSAgICAvKiBmb3IgYWxsIG90aGVyIFVuaXggKi8KKyNlbmRpZgorCisjZGVmaW5lIEJBU0VOQU1FTEVOCShNQVhOQU1MRU4gLSA1KQorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfUFdEX0gKKyMgaW5jbHVkZSA8cHdkLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQ09IRVJFTlRfXworIyB1bmRlZiBfX0FSR1MKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoSEFWRV9TWVNfUkVTT1VSQ0VfSCkgJiYgZGVmaW5lZChIQVZFX0dFVFJMSU1JVCkpIFwKKwl8fCAoZGVmaW5lZChIQVZFX1NZU19TWVNJTkZPX0gpICYmIGRlZmluZWQoSEFWRV9TWVNJTkZPKSkgXAorCXx8IGRlZmluZWQoSEFWRV9TWVNDVEwpIHx8IGRlZmluZWQoSEFWRV9TWVNDT05GKQorIyBkZWZpbmUgSEFWRV9UT1RBTF9NRU0KKyNlbmRpZgorCisjaWZkZWYgVk1TCisjaW5jbHVkZSA8dW5peGlvLmg+CisjaW5jbHVkZSA8dW5peGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZpbGUuaD4KKyNpbmNsdWRlIDxzc2RlZi5oPgorI2luY2x1ZGUgPGRlc2NyaXAuaD4KKyNpbmNsdWRlIDxsaWJjbGlkZWYuaD4KKyNpbmNsdWRlIDxsbm1kZWYuaD4KKyNpbmNsdWRlIDxwc2xkZWYuaD4KKyNpbmNsdWRlIDxwcnZkZWYuaD4KKyNpbmNsdWRlIDxkdmlkZWYuaD4KKyNpbmNsdWRlIDxkY2RlZi5oPgorI2luY2x1ZGUgPHN0c2RlZi5oPgorI2luY2x1ZGUgPGlvZGVmLmg+CisjaW5jbHVkZSA8dHRkZWYuaD4KKyNpbmNsdWRlIDx0dDJkZWYuaD4KKyNpbmNsdWRlIDxqcGlkZWYuaD4KKyNpbmNsdWRlIDxybXMuaD4KKyNpbmNsdWRlIDx0cm1kZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGFybGV0Lmg+CisjaW5jbHVkZSA8c29ja2V0Lmg+CisjaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+CisKK3R5cGVkZWYgc3RydWN0IGRzYyRkZXNjcmlwdG9yICAgREVTQzsKKyNlbmRpZgorCisvKgorICogVW5peCBzeXN0ZW0tZGVwZW5kZW50IGZpbGUgbmFtZXMKKyAqLworI2lmbmRlZiBTWVNfVklNUkNfRklMRQorIyBkZWZpbmUgU1lTX1ZJTVJDX0ZJTEUgIiRWSU0vdmltcmMiCisjZW5kaWYKKyNpZm5kZWYgU1lTX0dWSU1SQ19GSUxFCisjIGRlZmluZSBTWVNfR1ZJTVJDX0ZJTEUgIiRWSU0vZ3ZpbXJjIgorI2VuZGlmCisjaWZuZGVmIERGTFRfSEVMUEZJTEUKKyMgZGVmaW5lIERGTFRfSEVMUEZJTEUJIiRWSU1SVU5USU1FL2RvYy9oZWxwLnR4dCIKKyNlbmRpZgorI2lmbmRlZiBGSUxFVFlQRV9GSUxFCisjIGRlZmluZSBGSUxFVFlQRV9GSUxFCSJmaWxldHlwZS52aW0iCisjZW5kaWYKKyNpZm5kZWYgRlRQTFVHSU5fRklMRQorIyBkZWZpbmUgRlRQTFVHSU5fRklMRQkiZnRwbHVnaW4udmltIgorI2VuZGlmCisjaWZuZGVmIElOREVOVF9GSUxFCisjIGRlZmluZSBJTkRFTlRfRklMRQkiaW5kZW50LnZpbSIKKyNlbmRpZgorI2lmbmRlZiBGVE9GRl9GSUxFCisjIGRlZmluZSBGVE9GRl9GSUxFCSJmdG9mZi52aW0iCisjZW5kaWYKKyNpZm5kZWYgRlRQTFVHT0ZfRklMRQorIyBkZWZpbmUgRlRQTFVHT0ZfRklMRQkiZnRwbHVnb2YudmltIgorI2VuZGlmCisjaWZuZGVmIElORE9GRl9GSUxFCisjIGRlZmluZSBJTkRPRkZfRklMRQkiaW5kb2ZmLnZpbSIKKyNlbmRpZgorI2lmbmRlZiBTWVNfTUVOVV9GSUxFCisjIGRlZmluZSBTWVNfTUVOVV9GSUxFCSIkVklNUlVOVElNRS9tZW51LnZpbSIKKyNlbmRpZgorCisjaWZuZGVmIFVTUl9FWFJDX0ZJTEUKKyMgaWZkZWYgVk1TCisjICBkZWZpbmUgVVNSX0VYUkNfRklMRSAic3lzJGxvZ2luOi5leHJjIgorIyBlbHNlCisjICBkZWZpbmUgVVNSX0VYUkNfRklMRSAiJEhPTUUvLmV4cmMiCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFVTUl9FWFJDX0ZJTEUyKSAmJiBkZWZpbmVkKE9TMikKKyMgZGVmaW5lIFVTUl9FWFJDX0ZJTEUyICIkVklNLy5leHJjIgorI2VuZGlmCisjaWYgIWRlZmluZWQoVVNSX0VYUkNfRklMRTIpICYmIGRlZmluZWQoVk1TKQorIyBkZWZpbmUgVVNSX0VYUkNfRklMRTIgInN5cyRsb2dpbjpfZXhyYyIKKyNlbmRpZgorCisjaWZuZGVmIFVTUl9WSU1SQ19GSUxFCisjIGlmZGVmIFZNUworIyBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUgICJzeXMkbG9naW46LnZpbXJjIgorIyBlbHNlCisjICBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUgIiRIT01FLy52aW1yYyIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVVNSX1ZJTVJDX0ZJTEUyKSAmJiBkZWZpbmVkKE9TMikKKyMgZGVmaW5lIFVTUl9WSU1SQ19GSUxFMiAiJFZJTS8udmltcmMiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChVU1JfVklNUkNfRklMRTIpICYmIGRlZmluZWQoVk1TKQorIyBkZWZpbmUgVVNSX1ZJTVJDX0ZJTEUyICJzeXMkbG9naW46X3ZpbXJjIgorI2VuZGlmCisKKyNpZm5kZWYgVVNSX0dWSU1SQ19GSUxFCisjIGlmZGVmIFZNUworIyAgZGVmaW5lIFVTUl9HVklNUkNfRklMRSAic3lzJGxvZ2luOi5ndmltcmMiCisjIGVsc2UKKyMgIGRlZmluZSBVU1JfR1ZJTVJDX0ZJTEUgIiRIT01FLy5ndmltcmMiCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFZNUworIyBpZm5kZWYgVVNSX0dWSU1SQ19GSUxFMgorIyAgZGVmaW5lIFVTUl9HVklNUkNfRklMRTIgICJzeXMkbG9naW46X2d2aW1yYyIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVWSU1fRklMRQorIyBkZWZpbmUgRVZJTV9GSUxFCSIkVklNUlVOVElNRS9ldmltLnZpbSIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisjIGlmbmRlZiBWSU1JTkZPX0ZJTEUKKyMgIGlmZGVmIFZNUworIyAgIGRlZmluZSBWSU1JTkZPX0ZJTEUgICJzeXMkbG9naW46LnZpbWluZm8iCisjICBlbHNlCisjICAgZGVmaW5lIFZJTUlORk9fRklMRSAiJEhPTUUvLnZpbWluZm8iCisjICBlbmRpZgorIyBlbmRpZgorIyBpZiAhZGVmaW5lZChWSU1JTkZPX0ZJTEUyKSAmJiBkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBWSU1JTkZPX0ZJTEUyICIkVklNLy52aW1pbmZvIgorIyBlbmRpZgorIyBpZiAhZGVmaW5lZChWSU1JTkZPX0ZJTEUyKSAmJiBkZWZpbmVkKFZNUykKKyMgIGRlZmluZSBWSU1JTkZPX0ZJTEUyICJzeXMkbG9naW46X3ZpbWluZm8iCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFWFJDX0ZJTEUKKyMgZGVmaW5lIEVYUkNfRklMRQkiLmV4cmMiCisjZW5kaWYKKworI2lmbmRlZiBWSU1SQ19GSUxFCisjIGRlZmluZSBWSU1SQ19GSUxFCSIudmltcmMiCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisjIGlmbmRlZiBHVklNUkNfRklMRQorIyAgZGVmaW5lIEdWSU1SQ19GSUxFCSIuZ3ZpbXJjIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1lOVEFYX0ZOQU1FCisjIGRlZmluZSBTWU5UQVhfRk5BTUUJIiRWSU1SVU5USU1FL3N5bnRheC8lcy52aW0iCisjZW5kaWYKKworI2lmbmRlZiBERkxUX0JESVIKKyMgaWZkZWYgT1MyCisjICBkZWZpbmUgREZMVF9CRElSICAgICAiLixjOi90bXAsfi90bXAsfi8iCisjIGVsc2UKKyMgIGlmZGVmIFZNUworIyAgIGRlZmluZSBERkxUX0JESVIgICAgIi4vLHN5cyRsb2dpbjosdG1wOiIKKyMgIGVsc2UKKyMgICBkZWZpbmUgREZMVF9CRElSICAgICIuLH4vdG1wLH4vIiAgICAvKiBkZWZhdWx0IGZvciAnYmFja3VwZGlyJyAqLworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERGTFRfRElSCisjIGlmZGVmIE9TMgorIyAgZGVmaW5lIERGTFRfRElSICAgICAgIi4sfi90bXAsYzovdG1wLC90bXAiCisjIGVsc2UKKyMgIGlmZGVmIFZNUworIyAgIGRlZmluZSBERkxUX0RJUiAgICAgIi4vLHN5cyRsb2dpbjosdG1wOiIKKyMgIGVsc2UKKyMgICBkZWZpbmUgREZMVF9ESVIgICAgICIuLH4vdG1wLC92YXIvdG1wLC90bXAiIC8qIGRlZmF1bHQgZm9yICdkaXJlY3RvcnknICovCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgREZMVF9WRElSCisjIGlmZGVmIE9TMgorIyAgZGVmaW5lIERGTFRfVkRJUiAgICAgIiRWSU0vdmltZmlsZXMvdmlldyIKKyMgZWxzZQorIyAgaWZkZWYgVk1TCisjICAgZGVmaW5lIERGTFRfVkRJUiAgICAic3lzJGxvZ2luOnZpbWZpbGVzL3ZpZXciCisjICBlbHNlCisjICAgZGVmaW5lIERGTFRfVkRJUiAgICAiJEhPTUUvLnZpbS92aWV3IiAgICAgICAvKiBkZWZhdWx0IGZvciAndmlld2RpcicgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBERkxUX0VSUk9SRklMRQkJImVycm9ycy5lcnIiCisKKyNpZmRlZiBPUzIKKyMgZGVmaW5lIERGTFRfUlVOVElNRVBBVEgJIiRIT01FL3ZpbWZpbGVzLCRWSU0vdmltZmlsZXMsJFZJTVJVTlRJTUUsJFZJTS92aW1maWxlcy9hZnRlciwkSE9NRS92aW1maWxlcy9hZnRlciIKKyNlbHNlCisjIGlmZGVmIFZNUworIyAgZGVmaW5lIERGTFRfUlVOVElNRVBBVEggICAgICAic3lzJGxvZ2luOnZpbWZpbGVzLCRWSU0vdmltZmlsZXMsJFZJTVJVTlRJTUUsJFZJTS92aW1maWxlcy9hZnRlcixzeXMkbG9naW46dmltZmlsZXMvYWZ0ZXIiCisjIGVsc2UKKyMgIGlmZGVmIFJVTlRJTUVfR0xPQkFMCisjICAgZGVmaW5lIERGTFRfUlVOVElNRVBBVEgJIn4vLnZpbSwiIFJVTlRJTUVfR0xPQkFMICIsJFZJTVJVTlRJTUUsIiBSVU5USU1FX0dMT0JBTCAiL2FmdGVyLH4vLnZpbS9hZnRlciIKKyMgIGVsc2UKKyMgICBkZWZpbmUgREZMVF9SVU5USU1FUEFUSAkifi8udmltLCRWSU0vdmltZmlsZXMsJFZJTVJVTlRJTUUsJFZJTS92aW1maWxlcy9hZnRlcix+Ly52aW0vYWZ0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPUzIKKy8qCisgKiBUcnkgc2V2ZXJhbCBkaXJlY3RvcmllcyB0byBwdXQgdGhlIHRlbXAgZmlsZXMuCisgKi8KKyMgZGVmaW5lIFRFTVBESVJOQU1FUwkiJFRNUCIsICIkVEVNUCIsICJjOlxcVE1QIiwgImM6XFxURU1QIiwgIiIKKyMgZGVmaW5lIFRFTVBOQU1FTEVOCTEyOAorI2Vsc2UKKyMgaWZkZWYgVk1TCisjICBpZm5kZWYgVkFYCisjICAgZGVmaW5lIFZNU19URU1QTkFNICAgIC8qIHRvIGZpeCBkZWZhdWx0IC5MSVMgZXh0ZW5zaW9uICovCisjICBlbmRpZgorIyAgZGVmaW5lIFRFTVBOQU1FICAgICAgICJUTVA6dj9YWFhYWFgudHh0IgorIyAgZGVmaW5lIFRFTVBOQU1FTEVOICAgIDI4CisjIGVsc2UKKyMgIGRlZmluZSBURU1QRElSTkFNRVMgICIkVE1QRElSIiwgIi90bXAiLCAiLiIsICIkSE9NRSIKKyMgIGRlZmluZSBURU1QTkFNRUxFTiAgICAyNTYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTcGVjaWFsIHdpbGRjYXJkcyB0aGF0IG5lZWQgdG8gYmUgaGFuZGxlZCBieSB0aGUgc2hlbGwgKi8KKyNkZWZpbmUgU1BFQ0lBTF9XSUxEQ0hBUiAgICAiYCd7IgorCisjaWZuZGVmIEhBVkVfT1BFTkRJUgorIyBkZWZpbmUgTk9fRVhQQU5EUEFUSAorI2VuZGlmCisKKy8qCisgKiBVbml4IGhhcyBwbGVudHkgb2YgbWVtb3J5LCB1c2UgbGFyZ2UgYnVmZmVycworICovCisjZGVmaW5lIENNREJVRkZTSVpFIDEwMjQJLyogc2l6ZSBvZiB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIGJ1ZmZlciAqLworI2RlZmluZSBNQVhQQVRITCAgICAxMDI0CS8qIFVuaXggaGFzIGxvbmcgcGF0aHMgYW5kIHBsZW50eSBvZiBtZW1vcnkgKi8KKworI2RlZmluZSBDSEVDS19JTk9ERQkJLyogdXNlZCB3aGVuIGNoZWNraW5nIGlmIGEgc3dhcCBmaWxlIGFscmVhZHkKKwkJCQkgICAgZXhpc3RzIGZvciBhIGZpbGUgKi8KKyNpZmRlZiBWTVMgIC8qIFVzZSBsZXNzIG1lbW9yeSBiZWNhdXNlIG9mIG9sZGVyIHN5c3RlbXMgICovCisjIGlmbmRlZiBERkxUX01BWE1FTQorIyAgZGVmaW5lIERGTFRfTUFYTUVNICgyKjEwMjQpCisjIGVuZGlmCisjIGlmbmRlZiBERkxUX01BWE1FTVRPVAorIyAgZGVmaW5lIERGTFRfTUFYTUVNVE9UICg1KjEwMjQpCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgREZMVF9NQVhNRU0KKyMgIGRlZmluZSBERkxUX01BWE1FTQkoNSoxMDI0KQkgLyogdXNlIHVwIHRvIDUgTWJ5dGUgZm9yIGEgYnVmZmVyICovCisjIGVuZGlmCisjIGlmbmRlZiBERkxUX01BWE1FTVRPVAorIyAgZGVmaW5lIERGTFRfTUFYTUVNVE9UCSgxMCoxMDI0KSAgICAvKiB1c2UgdXAgdG8gMTAgTWJ5dGUgZm9yIFZpbSAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qIG1lbW1vdmUgaXMgbm90IHByZXNlbnQgb24gYWxsIHN5c3RlbXMsIHVzZSBtZW1tb3ZlLCBiY29weSwgbWVtY3B5IG9yIG91cgorICogb3duIHZlcnNpb24gKi8KKy8qIFNvbWUgc3lzdGVtcyBoYXZlICh2b2lkICopIGFyZ3VtZW50cywgc29tZSAoY2hhciAqKS4gSWYgd2UgdXNlIChjaGFyICopIGl0CisgKiB3b3JrcyBmb3IgYWxsICovCisjaWZkZWYgVVNFTUVNTU9WRQorIyBkZWZpbmUgbWNoX21lbW1vdmUodG8sIGZyb20sIGxlbikgbWVtbW92ZSgoY2hhciAqKSh0byksIChjaGFyICopKGZyb20pLCBsZW4pCisjZWxzZQorIyBpZmRlZiBVU0VCQ09QWQorIyAgZGVmaW5lIG1jaF9tZW1tb3ZlKHRvLCBmcm9tLCBsZW4pIGJjb3B5KChjaGFyICopKGZyb20pLCAoY2hhciAqKSh0byksIGxlbikKKyMgZWxzZQorIyAgaWZkZWYgVVNFTUVNQ1BZCisjICAgZGVmaW5lIG1jaF9tZW1tb3ZlKHRvLCBmcm9tLCBsZW4pIG1lbWNweSgoY2hhciAqKSh0byksIChjaGFyICopKGZyb20pLCBsZW4pCisjICBlbHNlCisjICAgZGVmaW5lIFZJTV9NRU1NT1ZFCSAgICAvKiBmb3VuZCBpbiBtaXNjMi5jICovCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUFJPVE8KKyMgaWZkZWYgSEFWRV9SRU5BTUUKKyMgIGRlZmluZSBtY2hfcmVuYW1lKHNyYywgZHN0KSByZW5hbWUoc3JjLCBkc3QpCisjIGVsc2UKK2ludCBtY2hfcmVuYW1lIF9fQVJHUygoY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkZXN0KSk7CisjIGVuZGlmCisjIGlmZGVmIFZNUworIyAgZGVmaW5lIG1jaF9jaGRpcihzKSBjaGRpcih2bXNfZml4ZmlsZW5hbWUocykpCisjIGVsc2UKKyMgIGRlZmluZSBtY2hfY2hkaXIocykgY2hkaXIocykKKyMgZW5kaWYKKyMgaWZuZGVmIFZNUworIyAgaWZkZWYgX19NVlNfXworICAvKiBvbiBPUzM5MCBVbml4IGdldGVudigpIGRvZXNuJ3QgcmV0dXJuIGEgcG9pbnRlciB0byBwZXJzaXN0YW50CisgICAqIHN0b3JhZ2UgLT4gdXNlIF9fZ2V0ZW52KCkgKi8KKyMgICBkZWZpbmUgbWNoX2dldGVudih4KSAoY2hhcl91ICopX19nZXRlbnYoKGNoYXIgKikoeCkpCisjICBlbHNlCisjICAgZGVmaW5lIG1jaF9nZXRlbnYoeCkgKGNoYXJfdSAqKWdldGVudigoY2hhciAqKSh4KSkKKyMgIGVuZGlmCisjICBkZWZpbmUgbWNoX3NldGVudihuYW1lLCB2YWwsIHgpIHNldGVudihuYW1lLCB2YWwsIHgpCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKKyMgZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTX0lTUkVHKSAmJiBkZWZpbmVkKFNfSUZSRUcpCisjIGRlZmluZQlTX0lTUkVHKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2VuZGlmCisjaWYgIWRlZmluZWQoU19JU0JMSykgJiYgZGVmaW5lZChTX0lGQkxLKQorIyBkZWZpbmUJU19JU0JMSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNTT0NLKSAmJiBkZWZpbmVkKFNfSUZTT0NLKQorIyBkZWZpbmUJU19JU1NPQ0sobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZTT0NLKQorI2VuZGlmCisjaWYgIWRlZmluZWQoU19JU0ZJRk8pICYmIGRlZmluZWQoU19JRklGTykKKyMgZGVmaW5lCVNfSVNGSUZPKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2VuZGlmCisKKy8qIE5vdGU6IFNvbWUgc3lzdGVtcyBuZWVkIGJvdGggc3RyaW5nLmggYW5kIHN0cmluZ3MuaCAoU2F2YWdlKS4gIEhvd2V2ZXIsCisgKiBzb21lIHN5c3RlbXMgY2FuJ3QgaGFuZGxlIGJvdGgsIG9ubHkgdXNlIHN0cmluZy5oIGluIHRoYXQgY2FzZS4gKi8KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NUUklOR1NfSCkgJiYgIWRlZmluZWQoTk9fU1RSSU5HU19XSVRIX1NUUklOR19IKQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TRVRKTVBfSCkKKyMgaW5jbHVkZSA8c2V0am1wLmg+CisjIGlmZGVmIEhBVkVfU0lHU0VUSk1QCisjICBkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCisjICBkZWZpbmUgU0VUSk1QKHgpIHNpZ3NldGptcCgoeCksIDEpCisjICBkZWZpbmUgTE9OR0pNUCBzaWdsb25nam1wCisjIGVsc2UKKyMgIGRlZmluZSBKTVBfQlVGIGptcF9idWYKKyMgIGRlZmluZSBTRVRKTVAoeCkgc2V0am1wKHgpCisjICBkZWZpbmUgTE9OR0pNUCBsb25nam1wCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBIQVZFX0RVUAkJLyogaGF2ZSBkdXAoKSAqLworI2RlZmluZSBIQVZFX1NUX01PREUJCS8qIGhhdmUgc3RhdC5zdF9tb2RlICovCisKKy8qIFdlIGhhdmUgdGhyZWUga2luZHMgb2YgQUNMIHN1cHBvcnQuICovCisjZGVmaW5lIEhBVkVfQUNMIChIQVZFX1BPU0lYX0FDTCB8fCBIQVZFX1NPTEFSSVNfQUNMIHx8IEhBVkVfQUlYX0FDTCkKZGlmZiAtLWdpdCBhL3NyYy9vc191bml4eC5oIGIvc3JjL29zX3VuaXh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0ZjdlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc191bml4eC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogb3NfdW5peHguaCAtLSBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG9ubHkgdXNlZCBpbiBvc191bml4LmMKKyAqLworCisvKgorICogU3R1ZmYgZm9yIHNpZ25hbHMKKyAqLworI2lmIGRlZmluZWQoSEFWRV9TSUdTRVQpICYmICFkZWZpbmVkKHNpZ25hbCkKKyMgZGVmaW5lIHNpZ25hbCBzaWdzZXQKKyNlbmRpZgorCisgICAvKiBzdW4ncyBzeXMvaW9jdGwuaCByZWRlZmluZXMgc3ltYm9scyBmcm9tIHRlcm1pbyB3b3JsZCAqLworI2lmIGRlZmluZWQoSEFWRV9TWVNfSU9DVExfSCkgJiYgIWRlZmluZWQoc3VuKQorIyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisjaWZuZGVmIFVTRV9TWVNURU0JLyogdXNlIGZvcmsvZXhlYyB0byBzdGFydCB0aGUgc2hlbGwgKi8KKworIyBpZiBkZWZpbmVkKEhBVkVfU1lTX1dBSVRfSCkgfHwgZGVmaW5lZChIQVZFX1VOSU9OX1dBSVQpCisjICBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoSEFWRV9TWVNfU0VMRUNUX0gpICYmIFwKKwkoIWRlZmluZWQoSEFWRV9TWVNfVElNRV9IKSB8fCBkZWZpbmVkKFNZU19TRUxFQ1RfV0lUSF9TWVNfVElNRSkpCisjICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjIGVuZGlmCisKKyMgaWZuZGVmIFdFWElUU1RBVFVTCisjICBpZmRlZiBIQVZFX1VOSU9OX1dBSVQKKyMgICBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgoc3RhdF92YWwpLndfVC53X1JldGNvZGUpCisjICBlbHNlCisjICAgZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgPj4gOCkgJiAwMzc3KQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgV0lGRVhJVEVECisjICBpZmRlZiBIQVZFX1VOSU9OX1dBSVQKKyMgICBkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKHN0YXRfdmFsKS53X1Qud19UZXJtc2lnID09IDApCisjICBlbHNlCisjICAgZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQorIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qICFVU0VfU1lTVEVNICovCisKKyNpZmRlZiBIQVZFX1NUUk9QVFNfSAorI2lmZGVmIHNpbml4CisjZGVmaW5lIGJ1Zl9UIF9fc3lzdGVtX2J1Zl90X18KKyNlbmRpZgorIyBpbmNsdWRlIDxzdHJvcHRzLmg+CisjaWZkZWYgc2luaXgKKyN1bmRlZiBidWZfVAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NFTEVDVAorIyBpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyMgIGluY2x1ZGUgPHN5cy9wb2xsLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfUE9MTF9ICisjICAgaW5jbHVkZSA8cG9sbC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU1RSRUFNX0gKKyMgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19VVFNOQU1FX0gKKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU1lTVEVNSU5GT19ICisvKgorICogZm9vbGlzaCBTaW5peCA8c3lzL3N5c3RlbWluZm8uaD4gdXNlcyBTWVNfTk1MTiBidXQgZG9lc24ndCBpbmNsdWRlCisgKiA8bGltaXRzLmg+LCB3aGVyZSBpdCBpcyBkZWZpbmVkLiBQZXJoYXBzIG90aGVyIHN5c3RlbXMgaGF2ZSB0aGUgc2FtZQorICogcHJvYmxlbT8gSW5jbHVkZSBpdCBoZXJlLiAtLSBTbG9vdG1hbgorICovCisjIGlmIGRlZmluZWQoSEFWRV9MSU1JVFNfSCkgJiYgIWRlZmluZWQoX0xJTUlUU19IKQorIyAgaW5jbHVkZSA8bGltaXRzLmg+CQkvKiBmb3IgU1lTX05NTE4gKFNpbml4IDUuNDEgLyBVbml4IFN5c1YuNCkgKi8KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3lzL3N5c3RlbWluZm8uaD4JLyogZm9yIHN5c2luZm8gKi8KKyNlbmRpZgorCisvKgorICogV2UgdXNlIHRlcm1pb3MuaCBpZiBib3RoIHRlcm1pb3MuaCBhbmQgdGVybWlvLmggYXJlIGF2YWlsYWJsZS4KKyAqIFRlcm1pb3MgaXMgc3VwcG9zZWQgdG8gYmUgYSBzdXBlcnNldCBvZiB0ZXJtaW8uaC4gIERvbid0IGluY2x1ZGUgdGhlbSBib3RoLAorICogaXQgbWF5IGdpdmUgcHJvYmxlbXMgb24gc29tZSBzeXN0ZW1zIChlLmcuIGhwdXgpLgorICogSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB3ZSBkb24ndCB3YW50IHRlcm1pb3MuaCBmb3IgYXBvbGxvLgorICovCisjaWYgZGVmaW5lZChIQVZFX1RFUk1JT1NfSCkgJiYgIWRlZmluZWQoYXBvbGxvKQorIyAgaW5jbHVkZSA8dGVybWlvcy5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9URVJNSU9fSAorIyAgaW5jbHVkZSA8dGVybWlvLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfU0dUVFlfSAorIyAgIGluY2x1ZGUgPHNndHR5Lmg+CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19QVEVNX0gKKyMgaW5jbHVkZSA8c3lzL3B0ZW0uaD4JLyogbXVzdCBiZSBhZnRlciB0ZXJtaW9zLmggZm9yIFNpbml4ICovCisjIGlmbmRlZiBfSU9fUFRFTV9ICS8qIEZvciBVbml4V2FyZSB0aGF0IHNob3VsZCBjaGVjayBmb3IgX0lPX1BUX1BURU1fSCAqLworIyAgZGVmaW5lIF9JT19QVEVNX0gKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBzaGFyZWQgbGlicmFyeSBhY2Nlc3MgKi8KKyNpZiBkZWZpbmVkKEhBVkVfRExGQ05fSCkgJiYgZGVmaW5lZChVU0VfRExPUEVOKQorIyBpbmNsdWRlIDxkbGZjbi5oPgorI2Vsc2UKKyMgaWYgZGVmaW5lZChIQVZFX0RMX0gpICYmIGRlZmluZWQoSEFWRV9TSExfTE9BRCkKKyMgIGluY2x1ZGUgPGRsLmg+CisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9vc192bXMuYyBiL3NyYy9vc192bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVlY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX3Ztcy5jCkBAIC0wLDAgKzEsNjU3IEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCQlieSBCcmFtIE1vb2xlbmFhcgorICogVk1TIHBvcnQJCQlieSBIZW5rIEVsYmVycworICogVk1TIGRlcG9ydAkJCWJ5IFpvbHRhbiBBcnBhZGZmeQorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZQkidmltLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhcgljbGFzczsKKyAgICBjaGFyCXR5cGU7CisgICAgc2hvcnQJd2lkdGg7CisgICAgdW5pb24KKyAgICB7CisJc3RydWN0CisJeworCSAgICBjaGFyCV9iYXNpY1szXTsKKwkgICAgY2hhcglsZW5ndGg7CisJfQl5OworCWludAliYXNpYzsKKyAgICB9CXg7CisgICAgaW50CQlleHRlbmRlZDsKK30JVFRfTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzaG9ydAlidWZsZW47CisgICAgc2hvcnQJaXRlbWNvZGU7CisgICAgY2hhcgkqYnVmYWRyczsKKyAgICBpbnQJCSpyZXRsZW47Cit9CUlURU07CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSVRFTQllcXU7CisgICAgaW50CQludWw7Cit9CUlUTUxTVDE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSVRFTQlpbmRleDsKKyAgICBJVEVNCXN0cmluZzsKKyAgICBpbnQJbnVsOworfQlJVE1MU1QyOworCitzdGF0aWMgVFRfTU9ERQlvcmdtb2RlOworc3RhdGljIHNob3J0CWlvY2hhbjsJCQkvKiBUVFkgSS9PIGNoYW5uZWwgKi8KK3N0YXRpYyBzaG9ydAlpb3NiWzRdOwkJLyogSU8gc3RhdHVzIGJsb2NrICovCisKK3N0YXRpYyBpbnQgdm1zX21hdGNoX251bSA9IDA7CitzdGF0aWMgaW50IHZtc19tYXRjaF9mcmVlID0gMDsKK3N0YXRpYyBjaGFyX3UgKip2bXNfZm1hdGNoID0gTlVMTDsKK3N0YXRpYyBjaGFyICpGc3BlY19SbXM7CQkgICAgICAgLyogcm1zIGZpbGUgc3BlYywgcGFzc2VkIGltcGxpY2l0bHkgYmV0d2VlbiByb3V0aW5lcyAqLworCisKKworc3RhdGljIFRUX01PREUJZ2V0X3R0eSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCXNldF90dHkgX19BUkdTKChpbnQgcm93LCBpbnQgY29sKSk7CisKKyNkZWZpbmUgRVhQTF9BTExPQ19JTkMgNjQKKworI2RlZmluZSBFUU4oUzEsUzIsTE4pIChzdHJuY21wKFMxLFMyLExOKSA9PSAwKQorI2RlZmluZSBTS0lQX0ZPTExPV0lOR19TTEFTSEVTKFN0cikgd2hpbGUgKFN0clsxXSA9PSAnLycpICsrU3RyCisKKworLyoKKyAqCXZ1bF9kZXNjCXZ1bHQgZWVuIGRlc2NyaXB0b3IgbWV0IGVlbiBzdHJpbmcgZW4gZGUgbGVuZ3RlCisgKgkJCWhpZXIgdmFuLgorICovCisgICAgc3RhdGljIHZvaWQKK3Z1bF9kZXNjKERFU0MgKmRlcywgY2hhciAqc3RyKQoreworICAgIGRlcy0+ZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworICAgIGRlcy0+ZHNjJGJfY2xhc3MgPSBEU0MkS19DTEFTU19TOworICAgIGRlcy0+ZHNjJGFfcG9pbnRlciA9IHN0cjsKKyAgICBkZXMtPmRzYyR3X2xlbmd0aCA9IHN0ciA/IHN0cmxlbihzdHIpIDogMDsKK30KKworLyoKKyAqCXZ1bF9pdGVtCXZ1bHQgZWVuIGl0ZW0gbWV0IGVlbiBhYW50YWwgd2FhcmRlbgorICovCisgICAgc3RhdGljIHZvaWQKK3Z1bF9pdGVtKElURU0gKml0bSwgc2hvcnQgbGVuLCBzaG9ydCBjb2QsIGNoYXIgKmFkciwgaW50ICpyZXQpCit7CisgICAgaXRtLT5idWZsZW4gICA9IGxlbjsKKyAgICBpdG0tPml0ZW1jb2RlID0gY29kOworICAgIGl0bS0+YnVmYWRycyAgPSBhZHI7CisgICAgaXRtLT5yZXRsZW4gICA9IHJldDsKK30KKworICAgIHZvaWQKK21jaF9zZXR0bW9kZShpbnQgdG1vZGUpCit7CisgICAgaW50CXN0YXR1czsKKworICAgIGlmICggdG1vZGUgPT0gVE1PREVfUkFXICkKKwlzZXRfdHR5KDAsIDApOworICAgIGVsc2V7CisJc3dpdGNoIChvcmdtb2RlLndpZHRoKQorCXsKKwkgICAgY2FzZSAxMzI6CU9VVF9TVFJfTkYoKGNoYXJfdSAqKSJcMDMzWz8zaFwwMzM+Iik7CWJyZWFrOworCSAgICBjYXNlIDgwOglPVVRfU1RSX05GKChjaGFyX3UgKikiXDAzM1s/M2xcMDMzPiIpOwlicmVhazsKKwkgICAgZGVmYXVsdDoJYnJlYWs7CisJfQorCW91dF9mbHVzaCgpOworCXN0YXR1cyA9IHN5cyRxaW93KDAsIGlvY2hhbiwgSU8kX1NFVE1PREUsIGlvc2IsIDAsIDAsCisJCQkJCSAgJm9yZ21vZGUsIHNpemVvZihUVF9NT0RFKSwgMCwwLDAsMCk7CisJaWYgKHN0YXR1cyE9U1MkX05PUk1BTCB8fCAoaW9zYlswXSYweEZGRkYpIT1TUyRfTk9STUFMKQorCSAgICByZXR1cm47CisJKHZvaWQpc3lzJGRhc3Nnbihpb2NoYW4pOworCWlvY2hhbiA9IDA7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3NldF90dHkoaW50IHJvdywgaW50IGNvbCkKK3sKKyAgICBpbnQJCSAgICBzdGF0dXM7CisgICAgVFRfTU9ERQkgICAgbmV3bW9kZTsJCS8qIE5ldyBUVFkgbW9kZSBiaXRzCQkqLworICAgIHN0YXRpYyBzaG9ydCAgICBmaXJzdF90aW1lID0gVFJVRTsKKworICAgIGlmIChmaXJzdF90aW1lKQorICAgIHsKKwlvcmdtb2RlID0gZ2V0X3R0eSgpOworCWZpcnN0X3RpbWUgPSBGQUxTRTsKKyAgICB9CisgICAgbmV3bW9kZSA9IGdldF90dHkoKTsKKyAgICBpZiAoY29sKQorCW5ld21vZGUud2lkdGgJCSA9IGNvbDsKKyAgICBpZiAocm93KQorCW5ld21vZGUueC55Lmxlbmd0aCAgICAgICA9IHJvdzsKKyAgICBuZXdtb2RlLnguYmFzaWMJCXw9IChUVCRNX05PRUNITyB8IFRUJE1fSE9TVFNZTkMpOworICAgIG5ld21vZGUueC5iYXNpYwkJJj0gflRUJE1fVFRTWU5DOworICAgIG5ld21vZGUuZXh0ZW5kZWQJCXw9IFRUMiRNX1BBU1RIUlU7CisgICAgc3RhdHVzID0gc3lzJHFpb3coMCwgaW9jaGFuLCBJTyRfU0VUTU9ERSwgaW9zYiwgMCwgMCwKKwkJCSAgJm5ld21vZGUsIHNpemVvZihuZXdtb2RlKSwgMCwgMCwgMCwgMCk7CisgICAgaWYgKHN0YXR1cyE9U1MkX05PUk1BTCB8fCAoaW9zYlswXSYweEZGRkYpIT1TUyRfTk9STUFMKQorCXJldHVybjsKK30KKworICAgIHN0YXRpYyBUVF9NT0RFCitnZXRfdHR5KHZvaWQpCit7CisKKyAgICBzdGF0aWMgJERFU0NSSVBUT1Iob2RzYywiU1lTJE9VVFBVVCIpOyAgIC8qIG91dHB1dCBkZXNjcmlwdG9yICovCisKKyAgICBpbnQJCXN0YXR1czsKKyAgICBUVF9NT0RFCXR0X21vZGU7CisKKyAgICBpZiAoIWlvY2hhbikKKwlzdGF0dXMgPSBzeXMkYXNzaWduKCZvZHNjLCZpb2NoYW4sMCwwKTsKKworICAgIHN0YXR1cyA9IHN5cyRxaW93KDAsIGlvY2hhbiwgSU8kX1NFTlNFTU9ERSwgaW9zYiwgMCwgMCwKKwkJICAgICAgJnR0X21vZGUsIHNpemVvZih0dF9tb2RlKSwgMCwgMCwgMCwgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBTUyRfTk9STUFMIHx8IChpb3NiWzBdICYgMHhGRkZGKSAhPSBTUyRfTk9STUFMKQorICAgIHsKKwl0dF9tb2RlLndpZHRoCQk9IDA7CisJdHRfbW9kZS50eXBlCQk9IDA7CisJdHRfbW9kZS5jbGFzcwkJPSAwOworCXR0X21vZGUueC5iYXNpYwkJPSAwOworCXR0X21vZGUueC55Lmxlbmd0aAk9IDA7CisJdHRfbW9kZS5leHRlbmRlZAk9IDA7CisgICAgfQorICAgIHJldHVybih0dF9tb2RlKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCB3aW5kb3cgc2l6ZSBpbiBSb3dzIGFuZCBDb2x1bW5zLgorICovCisgICAgaW50CittY2hfZ2V0X3NoZWxsc2l6ZSh2b2lkKQoreworICAgIFRUX01PREUJdG1vZGU7CisKKyAgICB0bW9kZSA9IGdldF90dHkoKTsJCQkvKiBnZXQgc2l6ZSBmcm9tIFZNUwkqLworICAgIENvbHVtbnMgPSB0bW9kZS53aWR0aDsKKyAgICBSb3dzID0gdG1vZGUueC55Lmxlbmd0aDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBUcnkgdG8gc2V0IHRoZSB3aW5kb3cgc2l6ZSB0byBSb3dzIGFuZCBuZXdfQ29sdW1ucy4KKyAqLworICAgIHZvaWQKK21jaF9zZXRfc2hlbGxzaXplKHZvaWQpCit7CisgICAgc2V0X3R0eShSb3dzLCBDb2x1bW5zKTsKKyAgICBzd2l0Y2ggKENvbHVtbnMpCisgICAgeworCWNhc2UgMTMyOglPVVRfU1RSX05GKChjaGFyX3UgKikiXDAzM1s/M2hcMDMzPiIpOwlicmVhazsKKwljYXNlIDgwOglPVVRfU1RSX05GKChjaGFyX3UgKikiXDAzM1s/M2xcMDMzPiIpOwlicmVhazsKKwlkZWZhdWx0OglicmVhazsKKyAgICB9CisgICAgb3V0X2ZsdXNoKCk7CisgICAgc2NyZWVuX3N0YXJ0KCk7Cit9CisKKyAgICBjaGFyX3UgKgorbWNoX2dldGVudihjaGFyX3UgKmxvZ25hbSkKK3sKKyAgICBERVNDCQlkX2ZpbGVfZGV2LCBkX2xvZ25hbSAgOworICAgIHN0YXRpYyBjaGFyCQlidWZmZXJbTE5NJENfTkFNTEVOR1RIKzFdOworICAgIGNoYXJfdQkJKmNwID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nCWF0dHJpYjsKKyAgICBpbnQJCQlsZW5ndGUgPSAwLCBkdW0gPSAwLCBpZHggPSAwOworICAgIElUTUxTVDIJCWl0bWxzdDsKKyAgICBjaGFyCQkqc2J1ZiA9IE5VTEw7CisKKyAgICB2dWxfZGVzYygmZF9sb2duYW0sIChjaGFyICopbG9nbmFtKTsKKyAgICB2dWxfZGVzYygmZF9maWxlX2RldiwgIkxOTSRGSUxFX0RFViIpOworICAgIGF0dHJpYiA9IExOTSRNX0NBU0VfQkxJTkQ7CisgICAgdnVsX2l0ZW0oJml0bWxzdC5pbmRleCwgc2l6ZW9mKGludCksIExOTSRfSU5ERVgsIChjaGFyICopJmlkeCwgJmR1bSk7CisgICAgdnVsX2l0ZW0oJml0bWxzdC5zdHJpbmcsIExOTSRDX05BTUxFTkdUSCwgTE5NJF9TVFJJTkcsIGJ1ZmZlciwgJmxlbmd0ZSk7CisgICAgaXRtbHN0Lm51bAk9IDA7CisgICAgaWYgKHN5cyR0cm5sbm0oJmF0dHJpYiwgJmRfZmlsZV9kZXYsICZkX2xvZ25hbSwgTlVMTCwmaXRtbHN0KSA9PSBTUyRfTk9STUFMKQorICAgIHsKKwlidWZmZXJbbGVuZ3RlXSA9ICdcMCc7CisJaWYgKGNwID0gKGNoYXJfdSAqKWFsbG9jKCh1bnNpZ25lZCkobGVuZ3RlKzEpKSkKKwkgICAgc3RyY3B5KChjaGFyICopY3AsIGJ1ZmZlcik7CisJcmV0dXJuKGNwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHNidWYgPSBnZXRlbnYoKGNoYXIgKilsb2duYW0pKSkKKyAgICB7CisJbGVuZ3RlID0gc3RybGVuKHNidWYpICsgMTsKKwljcCA9IChjaGFyX3UgKiltYWxsb2MoKHNpemVfdClsZW5ndGUpOworCWlmIChjcCkKKwkgICAgc3RyY3B5KChjaGFyICopY3AsIHNidWYpOworCXJldHVybiBjcDsKKyAgICB9CisgICAgZWxzZQorCXJldHVybihOVUxMKTsKK30KKworLyoKKyAqCW1jaF9zZXRlbnYJVk1TIHZlcnNpb24gb2Ygc2V0ZW52KCkKKyAqLworICAgIGludAorbWNoX3NldGVudihjaGFyICp2YXIsIGNoYXIgKnZhbHVlLCBpbnQgeCkKK3sKKyAgICBpbnQJCXJlcywgZHVtOworICAgIGxvbmcJYXR0cmliID0gMEw7CisgICAgY2hhcglhY21vZGUgPSBQU0wkQ19TVVBFUjsJLyogbmVlZHMgU1lTTkFNIHByaXZpbGVnZSAqLworICAgIERFU0MJdGFibmFtLCBsb2duYW07CisgICAgSVRNTFNUMQlpdG1sc3Q7CisKKyAgICB2dWxfZGVzYygmdGFibmFtLCAiTE5NJEpPQiIpOworICAgIHZ1bF9kZXNjKCZsb2duYW0sIHZhcik7CisgICAgdnVsX2l0ZW0oJml0bWxzdC5lcXUsIHZhbHVlID8gc3RybGVuKHZhbHVlKSA6IDAsIHZhbHVlID8gTE5NJF9TVFJJTkcgOiAwLAorCSAgICB2YWx1ZSwgJmR1bSk7CisgICAgaXRtbHN0Lm51bAk9IDA7CisgICAgcmVzID0gc3lzJGNyZWxubSgmYXR0cmliLCAmdGFibmFtLCAmbG9nbmFtLCAmYWNtb2RlLCAmaXRtbHN0KTsKKyAgICByZXR1cm4oKHJlcyA9PSAxKSA/IDAgOiAtMSk7Cit9CisKKyAgICBpbnQKK3Ztc19zeXMoY2hhciAqY21kLCBjaGFyICpvdXQsIGNoYXIgKmlucCkKK3sKKyAgICBERVNDCWNkc2MsIG9kc2MsIGlkc2M7CisgICAgbG9uZwlzdGF0dXM7CisKKyAgICBpZiAoY21kKQorCXZ1bF9kZXNjKCZjZHNjLCBjbWQpOworICAgIGlmIChvdXQpCisJdnVsX2Rlc2MoJm9kc2MsIG91dCk7CisgICAgaWYgKGlucCkKKwl2dWxfZGVzYygmaWRzYywgaW5wKTsKKworICAgIGxpYiRzcGF3bihjbWQgPyAmY2RzYyA6IE5VTEwsCQkvKiBjb21tYW5kIHN0cmluZyAqLworCSAgICAgIGlucCA/ICZpZHNjIDogTlVMTCwJCS8qIGlucHV0IGZpbGUgKi8KKwkgICAgICBvdXQgPyAmb2RzYyA6IE5VTEwsCQkvKiBvdXRwdXQgZmlsZSAqLworCSAgICAgIDAsIDAsIDAsICZzdGF0dXMsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDb252ZXJ0IFZNUyBzeXN0ZW0oKSBvciBsaWIkc3Bhd24oKSByZXR1cm4gY29kZSB0byBVbml4LWxpa2UgZXhpdCB2YWx1ZS4KKyAqLworICAgIGludAordm1zX3N5c19zdGF0dXMoaW50IHN0YXR1cykKK3sKKyAgICBpZiAoc3RhdHVzICE9IFNTJF9OT1JNQUwgJiYgKHN0YXR1cyAmIFNUUyRNX1NVQ0NFU1MpID09IDApCisJcmV0dXJuIHN0YXR1czsJCS8qIENvbW1hbmQgZmFpbGVkLiAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogdm1zX3JlYWQoKQorICogZnVuY3Rpb24gZm9yIGxvdyBsZXZlbCBjaGFyIGlucHV0CisgKgorICogUmV0dXJuczogaW5wdXQgbGVuZ3RoCisgKi8KKyAgICBpbnQKK3Ztc19yZWFkKGNoYXIgKmluYnVmLCBzaXplX3QgbmJ5dGVzKQoreworICAgIGludAkJc3RhdHVzLCBmdW5jdGlvbiwgbGVuOworICAgIFRUX01PREUJdHRfbW9kZTsKKyAgICBJVEVNCWl0bWxzdFsyXTsKKyAgICBzdGF0aWMgbG9uZyB0cm1fbWFza1s4XSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisgICAgLyogd2hhdGV2ZXIgaGFwcGVuZWQgZWFybGllciB3ZSBuZWVkIGFuIGlvY2hhbiBoZXJlICovCisgICAgaWYgKCFpb2NoYW4pCisJdHRfbW9kZSA9IGdldF90dHkoKTsKKworICAgIHZ1bF9pdGVtKCZpdG1sc3RbMF0sIDAsIFRSTSRfTU9ESUZJRVJTLAorCSAgICAoY2hhciAqKShUUk0kTV9UTV9FU0NBUEUgfCBUUk0kTV9UTV9OT0VDSE8gfCBUUk0kTV9UTV9OT0VESVQgfAorCSAgICAgICBUUk0kTV9UTV9OT0ZJTFRSIHwgVFJNJE1fVE1fTk9SRUNBTEwgfCBUUk0kTV9UTV9UUk1OT0VDSE8pLCAwKTsKKyAgICB2dWxfaXRlbSgmaXRtbHN0WzFdLCBzaXplb2YodHJtX21hc2spLCBUUk0kX1RFUk0sIChjaGFyICopJnRybV9tYXNrLCAwKTsKKworICAgIGZ1bmN0aW9uID0gKElPJF9SRUFETEJMSyB8IElPJE1fRVhURU5EKTsKKyAgICBtZW1zZXQoaW5idWYsIDAsIG5ieXRlcyk7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisJc3RhdHVzID0gc3lzJHFpb3coMCwgaW9jaGFuLCBmdW5jdGlvbiwgJmlvc2IsIDAsIDAsIGluYnVmLCBuYnl0ZXMgLSAxLAorCQkJCQkgICAgICAgMCwgMCwgJml0bWxzdCwgc2l6ZW9mKGl0bWxzdCkpOworCWxlbiA9IHN0cmxlbihpbmJ1Zik7CisJaWYgKGxlbiA+IDApCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCisvKgorICogdm1zX3dwcm9jKCkgaXMgY2FsbGVkIGZvciBlYWNoIG1hdGNoaW5nIGZpbGVuYW1lIGJ5IGRlY2MkdG9fdm1zKCkuCisgKiBXZSB3YW50IHRvIHNhdmUgZWFjaCBtYXRjaCBmb3IgbGF0ZXIgcmV0cmlldmFsLgorICoKKyAqIFJldHVybnM6ICAxIC0gY29udGludWUgZmluZGluZyBtYXRjaGVzCisgKgkgICAgIDAgLSBzdG9wIHRyeWluZyB0byBmaW5kIGFueSBmdXJ0aGVyIG1hdGhjZXMKKyAqLworICAgIHN0YXRpYyBpbnQKK3Ztc193cHJvYyhjaGFyICpuYW1lLCBpbnQgdmFsKQoreworICAgIGludCBpOworICAgIGludCBubGVuOworICAgIHN0YXRpYyBpbnQgdm1zX21hdGNoX2FsbG9jZWQgPSAwOworCisgICAgaWYgKHZhbCAhPSBERUNDJEtfRklMRSkgLyogRGlyZWN0b3JpZXMgYW5kIGZvcmVpbmcgbm9uIFZNUyBmaWxlcyBhcmUgbm90IGNvdW50aW5nICAqLworCXJldHVybiAxOworCisgICAgaWYgKHZtc19tYXRjaF9udW0gPT0gMCkgeworCS8qIGZpcnN0IHRpbWUgdGhyb3VnaCwgc2V0dXAgc29tZSB0aGluZ3MgKi8KKwlpZiAoTlVMTCA9PSB2bXNfZm1hdGNoKSB7CisJICAgIHZtc19mbWF0Y2ggPSAoY2hhcl91ICoqKWFsbG9jKEVYUExfQUxMT0NfSU5DICogc2l6ZW9mKGNoYXIgKikpOworCSAgICBpZiAoIXZtc19mbWF0Y2gpCisJCXJldHVybiAwOworCSAgICB2bXNfbWF0Y2hfYWxsb2NlZCA9IEVYUExfQUxMT0NfSU5DOworCSAgICB2bXNfbWF0Y2hfZnJlZSA9IEVYUExfQUxMT0NfSU5DOworCX0KKwllbHNlIHsKKwkgICAgLyogcmUtdXNlIGV4aXN0aW5nIHNwYWNlICovCisJICAgIHZtc19tYXRjaF9mcmVlID0gdm1zX21hdGNoX2FsbG9jZWQ7CisJfQorICAgIH0KKworICAgIHZtc19yZW1vdmVfdmVyc2lvbihuYW1lKTsKKworICAgIC8qIGNvbnZlcnQgZmlsZW5hbWUgdG8gbG93ZXJjYXNlICovCisgICAgbmxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmxlbjsgaSsrKQorCW5hbWVbaV0gPSBUT0xPV0VSX0FTQyhuYW1lW2ldKTsKKworICAgIC8qIGlmIG5hbWUgYWxyZWFkeSBleGlzdHMsIGRvbid0IGFkZCBpdCAqLworICAgIGZvciAoaSA9IDA7IGk8dm1zX21hdGNoX251bTsgaSsrKSB7CisJaWYgKDAgPT0gU1RSQ01QKChjaGFyX3UgKiluYW1lLHZtc19mbWF0Y2hbaV0pKQorCSAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKC0tdm1zX21hdGNoX2ZyZWUgPT0gMCkgeworCS8qIGFkZCBtb3JlIHNwYWNlIHRvIHN0b3JlIG1hdGNoZXMgKi8KKwl2bXNfbWF0Y2hfYWxsb2NlZCArPSBFWFBMX0FMTE9DX0lOQzsKKwl2bXNfZm1hdGNoID0gKGNoYXJfdSAqKilyZWFsbG9jKHZtc19mbWF0Y2gsCisJCXNpemVvZihjaGFyICoqKSAqIHZtc19tYXRjaF9hbGxvY2VkKTsKKwlpZiAoIXZtc19mbWF0Y2gpCisJICAgIHJldHVybiAwOworCXZtc19tYXRjaF9mcmVlID0gRVhQTF9BTExPQ19JTkM7CisgICAgfQorICAgIHZtc19mbWF0Y2hbdm1zX21hdGNoX251bV0gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopbmFtZSk7CisKKyAgICArK3Ztc19tYXRjaF9udW07CisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKgltY2hfZXhwYW5kX3dpbGRjYXJkcwl0aGlzIGNvZGUgZG9lcyB3aWxkLWNhcmQgcGF0dGVybgorICoJCQkJbWF0Y2hpbmcgTk9UIHVzaW5nIHRoZSBzaGVsbAorICoKKyAqCXJldHVybiBPSyBmb3Igc3VjY2VzcywgRkFJTCBmb3IgZXJyb3IgKHlvdSBtYXkgbG9vc2Ugc29tZQorICoJbWVtb3J5KSBhbmQgcHV0IGFuIGVycm9yIG1lc3NhZ2UgaW4gKmZpbGUuCisgKgorICoJbnVtX3BhdAkgICBudW1iZXIgb2YgaW5wdXQgcGF0dGVybnMKKyAqCXBhdAkgICBhcnJheSBvZiBwb2ludGVycyB0byBpbnB1dCBwYXR0ZXJucworICoJbnVtX2ZpbGUgICBwb2ludGVyIHRvIG51bWJlciBvZiBtYXRjaGVkIGZpbGUgbmFtZXMKKyAqCWZpbGUJICAgcG9pbnRlciB0byBhcnJheSBvZiBwb2ludGVycyB0byBtYXRjaGVkIGZpbGUgbmFtZXMKKyAqCisgKi8KKyAgICBpbnQKK21jaF9leHBhbmRfd2lsZGNhcmRzKGludCBudW1fcGF0LCBjaGFyX3UgKipwYXQsIGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlLCBpbnQgZmxhZ3MpCit7CisgICAgaW50CQlpLCBqID0gMCwgY250ID0gMDsKKyAgICBjaGFyCSpjcDsKKyAgICBjaGFyX3UJYnVmW01BWFBBVEhMXTsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQgZmlsZXNfYWxsb2NlZCwgZmlsZXNfZnJlZTsKKworICAgICpudW1fZmlsZSA9IDA7CQkJLyogZGVmYXVsdDogbm8gZmlsZXMgZm91bmQJKi8KKyAgICBmaWxlc19hbGxvY2VkID0gRVhQTF9BTExPQ19JTkM7CisgICAgZmlsZXNfZnJlZSA9IEVYUExfQUxMT0NfSU5DOworICAgICpmaWxlID0gKGNoYXJfdSAqKikgYWxsb2Moc2l6ZW9mKGNoYXJfdSAqKikgKiBmaWxlc19hbGxvY2VkKTsKKyAgICBpZiAoKmZpbGUgPT0gTlVMTCkKKyAgICB7CisJKm51bV9maWxlID0gMDsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXQ7IGkrKykKKyAgICB7CisJLyogZXhwYW5kIGVudmlyb25tZW50IHZhciBvciBob21lIGRpciAqLworCWlmICh2aW1fc3RyY2hyKHBhdFtpXSwnJCcpIHx8IHZpbV9zdHJjaHIocGF0W2ldLCd+JykpCisJICAgIGV4cGFuZF9lbnYocGF0W2ldLGJ1ZixNQVhQQVRITCk7CisJZWxzZQorCSAgICBTVFJDUFkoYnVmLHBhdFtpXSk7CisKKwl2bXNfbWF0Y2hfbnVtID0gMDsgLyogcmVzZXQgY29sbGVjdGlvbiBjb3VudGVyICovCisJY250ID0gZGVjYyR0b192bXMoZGVjYyR0cmFuc2xhdGVfdm1zKHZtc19maXhmaWxlbmFtZShidWYpKSwgdm1zX3dwcm9jLCAxLCAwKTsKKwkJCQkJCSAgICAgIC8qIGFsbG93IHdpbGQsIG5vIGRpciAqLworCWlmIChjbnQgPiAwKQorCSAgICBjbnQgPSB2bXNfbWF0Y2hfbnVtOworCisJaWYgKGNudCA8IDEpCisJICAgIGNvbnRpbnVlOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCXsKKwkgICAgLyogZmlsZXMgc2hvdWxkIGV4aXN0IGlmIGV4cGFuZGluZyBpbnRlcmFjdGl2ZWx5ICovCisJICAgIGlmICghKGZsYWdzICYgRVdfTk9URk9VTkQpICYmIG1jaF9nZXRwZXJtKHZtc19mbWF0Y2hbaV0pIDwgMCkKKwkJY29udGludWU7CisJICAgIC8qIGRvIG5vdCBpbmNsdWRlIGRpcmVjdG9yaWVzICovCisJICAgIGRpciA9IChtY2hfaXNkaXIodm1zX2ZtYXRjaFtpXSkpOworCSAgICBpZiAoKCBkaXIgJiYgIShmbGFncyAmIEVXX0RJUikpIHx8ICghZGlyICYmICEoZmxhZ3MgJiBFV19GSUxFKSkpCisJCWNvbnRpbnVlOworCSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvaW50ZXJzICovCisJICAgIGlmICgtLWZpbGVzX2ZyZWUgPCAxKQorCSAgICB7CisJCWZpbGVzX2FsbG9jZWQgKz0gRVhQTF9BTExPQ19JTkM7CisJCSpmaWxlID0gKGNoYXJfdSAqKilyZWFsbG9jKCpmaWxlLAorCQkgICAgc2l6ZW9mKGNoYXJfdSAqKikgKiBmaWxlc19hbGxvY2VkKTsKKwkJaWYgKCpmaWxlID09IE5VTEwpCisJCXsKKwkJICAgICpmaWxlID0gKGNoYXJfdSAqKikiIjsKKwkJICAgICpudW1fZmlsZSA9IDA7CisJCSAgICByZXR1cm4oRkFJTCk7CisJCX0KKwkJZmlsZXNfZnJlZSA9IEVYUExfQUxMT0NfSU5DOworCSAgICB9CisKKwkgICAgKCpmaWxlKVsqbnVtX2ZpbGUrK10gPSB2bXNfZm1hdGNoW2ldOworCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CittY2hfZXhwYW5kcGF0aChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnBhdGgsIGludCBmbGFncykKK3sKKyAgICBpbnQJCWksY250ID0gMDsKKyAgICBjaGFyCSpjcDsKKyAgICB2bXNfbWF0Y2hfbnVtID0gMDsKKworICAgIGNudCA9IGRlY2MkdG9fdm1zKGRlY2MkdHJhbnNsYXRlX3Ztcyh2bXNfZml4ZmlsZW5hbWUocGF0aCkpLCB2bXNfd3Byb2MsIDEsIDApOworCQkJCQkJICAgICAgLyogYWxsb3cgd2lsZCwgbm8gZGlyICovCisgICAgaWYgKGNudCA+IDApCisJY250ID0gdm1zX21hdGNoX251bTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisgICAgeworCWlmIChtY2hfZ2V0cGVybSh2bXNfZm1hdGNoW2ldKSA+PSAwKSAvKiBhZGQgZXhpc3RpbmcgZmlsZSAqLworCSAgICBhZGRmaWxlKGdhcCwgdm1zX2ZtYXRjaFtpXSwgZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gY250OworfQorCisvKgorICogYXR0ZW1wdCB0byB0cmFuc2xhdGUgYSBtaXhlZCB1bml4LXZtcyBmaWxlIHNwZWNpZmljYXRpb24gdG8gcHVyZSB2bXMKKyAqLworICAgIHN0YXRpYyB2b2lkCit2bXNfdW5peF9taXhlZF9maWxlc3BlYyhjaGFyICppbiwgY2hhciAqb3V0KQoreworICAgIGNoYXIgKmxhc3Rjb2xvbjsKKyAgICBjaGFyICplbmRfb2ZfZGlyOworICAgIGNoYXIgY2g7CisgICAgaW50IGxlbjsKKworICAgIC8qIGNvcHkgdm1zIGZpbGVuYW1lIHBvcnRpb24gdXAgdG8gbGFzdCBjb2xvbgorICAgICAqIChub2RlIGFuZC9vciBkaXNrKQorICAgICAqLworICAgIGxhc3Rjb2xvbiA9IHN0cnJjaHIoaW4sICc6Jyk7ICAgLyogZmluZCBsYXN0IGNvbG9uICovCisgICAgaWYgKGxhc3Rjb2xvbiAhPSBOVUxMKSB7CisJbGVuID0gbGFzdGNvbG9uIC0gaW4gKyAxOworCXN0cm5jcHkob3V0LCBpbiwgbGVuKTsKKwlvdXQgKz0gbGVuOworCWluICs9IGxlbjsKKyAgICB9CisKKyAgICBlbmRfb2ZfZGlyID0gTlVMTDsJLyogZGVmYXVsdDogbm8gZGlyZWN0b3J5ICovCisKKyAgICAvKiBzdGFydCBvZiBkaXJlY3RvcnkgcG9ydGlvbiAqLworICAgIGNoID0gKmluOworICAgIGlmICgoY2ggPT0gJ1snKSB8fCAoY2ggPT0gJy8nKSB8fCAoY2ggPT0gJzwnKSApIHsJLyogc3RhcnQgb2YgZGlyZWN0b3J5KHMpID8gKi8KKwljaCA9ICdbJzsKKwlTS0lQX0ZPTExPV0lOR19TTEFTSEVTKGluKTsKKyAgICB9IGVsc2UgaWYgKEVRTihpbiwgIi4uLyIsIDMpKSB7IC8qIFVuaXggcGFyZW50IGRpcmVjdG9yeT8gKi8KKwkqb3V0KysgPSAnWyc7CisJKm91dCsrID0gJy0nOworCWVuZF9vZl9kaXIgPSBvdXQ7CisJY2ggPSAnLic7CisJaW4gKz0gMjsKKwlTS0lQX0ZPTExPV0lOR19TTEFTSEVTKGluKTsKKyAgICB9IGVsc2UgewkJICAgIC8qIG5vdCBhIHNwZWNpYWwgY2hhcmFjdGVyICovCisJd2hpbGUgKEVRTihpbiwgIi4vIiwgMikpIHsJLyogSWdub3JlIFVuaXggImN1cnJlbnQgZGlyIiAqLworCSAgICBpbiArPSAyOworCSAgICBTS0lQX0ZPTExPV0lOR19TTEFTSEVTKGluKTsKKyAgICB9CisgICAgaWYgKHN0cmNocihpbiwgJy8nKSA9PSBOVUxMKSB7ICAvKiBhbnkgbW9yZSBVbml4IGRpcmVjdG9yaWVzID8gKi8KKwlzdHJjcHkob3V0LCBpbik7CS8qIE5vIC0gZ2V0IHJlc3Qgb2YgdGhlIHNwZWMgKi8KKwlyZXR1cm47CisgICAgfSBlbHNlIHsKKwkqb3V0KysgPSAnWyc7CSAgICAvKiBZZXMsIGRlbm90ZSBhIFZtcyBzdWJkaXJlY3RvcnkgKi8KKwljaCA9ICcuJzsKKwktLWluOworCX0KKyAgICB9CisKKyAgICAvKiBpZiB3ZSBnZXQgaGVyZSwgdGhlcmUgaXMgYSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgZmlsZW5hbWUgKi8KKworICAgIC8qIGluaXRpYWxpemUgb3V0cHV0IGZpbGUgc3BlYyAqLworICAgICpvdXQrKyA9IGNoOworICAgICsraW47CisKKyAgICB3aGlsZSAoKmluICE9ICdcMCcpIHsKKwljaCA9ICppbjsKKwlpZiAoKGNoID09ICddJykgfHwgKGNoID09ICcvJykgfHwgKGNoID09ICc+JykgKSB7CS8qIGVuZCBvZiAoc3ViKWRpcmVjdG9yeSA/ICovCisJICAgIGVuZF9vZl9kaXIgPSBvdXQ7CisJICAgIGNoID0gJy4nOworCSAgICBTS0lQX0ZPTExPV0lOR19TTEFTSEVTKGluKTsKKwkgICAgfQorCWVsc2UgaWYgKEVRTihpbiwgIi4uLyIsIDMpKSB7CS8qIFVuaXggcGFyZW50IGRpcmVjdG9yeT8gKi8KKwkgICAgKm91dCsrID0gJy0nOworCSAgICBlbmRfb2ZfZGlyID0gb3V0OworCSAgICBjaCA9ICcuJzsKKwkgICAgaW4gKz0gMjsKKwkgICAgU0tJUF9GT0xMT1dJTkdfU0xBU0hFUyhpbik7CisJICAgIH0KKwllbHNlIHsKKwkgICAgd2hpbGUgKEVRTihpbiwgIi4vIiwgMikpIHsgIC8qIElnbm9yZSBVbml4ICJjdXJyZW50IGRpciIgKi8KKwkgICAgZW5kX29mX2RpciA9IG91dDsKKwkgICAgaW4gKz0gMjsKKwkgICAgU0tJUF9GT0xMT1dJTkdfU0xBU0hFUyhpbik7CisJICAgIGNoID0gKmluOworCSAgICB9CisJfQorCisgICAgLyogUGxhY2UgbmV4dCBjaGFyYWN0ZXIgaW50byBvdXRwdXQgZmlsZSBzcGVjICovCisJKm91dCsrID0gY2g7CisJKytpbjsKKyAgICB9CisKKyAgICAqb3V0ID0gJ1wwJzsgICAgLyogVGVybWluYXRlIG91dHB1dCBmaWxlIHNwZWMgKi8KKworICAgIGlmIChlbmRfb2ZfZGlyICE9IE5VTEwpIC8qIFRlcm1pbmF0ZSBkaXJlY3RvcnkgcG9ydGlvbiAqLworCSplbmRfb2ZfZGlyID0gJ10nOworfQorCisKKy8qCisgKiBmb3IgZGVjYyR0b192bXMgaW4gdm1zX2ZpeGZpbGVuYW1lCisgKi8KKyAgICBzdGF0aWMgaW50Cit2bXNfZnNwZWNfcHJvYyhjaGFyICpmaWwsIGludCB2YWwpCit7CisgICAgc3RyY3B5KEZzcGVjX1JtcyxmaWwpOworICAgIHJldHVybigxKTsKK30KKworLyoKKyAqIGNoYW5nZSB1bml4IGFuZCBtaXhlZCBmaWxlbmFtZXMgdG8gVk1TCisgKi8KKyAgICB2b2lkICoKK3Ztc19maXhmaWxlbmFtZSh2b2lkICppbnN0cmluZykKK3sKKyAgICBzdGF0aWMgY2hhcgkJKmJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIHNpemVfdAlidWZsZW4gPSAwOworICAgIHNpemVfdAkJbGVuOworCisgICAgLyogZ2V0IGEgYmlnLWVub3VnaCBidWZmZXIgKi8KKyAgICBsZW4gPSBzdHJsZW4oaW5zdHJpbmcpICsgMTsKKyAgICBpZiAobGVuID4gYnVmbGVuKQorICAgIHsKKwlidWZsZW4gPSBsZW4gKyAxMjg7CisJaWYgKGJ1ZikKKwkgICAgYnVmID0gKGNoYXIgKilyZWFsbG9jKGJ1ZiwgYnVmbGVuKTsKKwllbHNlCisJICAgIGJ1ZiA9IChjaGFyICopY2FsbG9jKGJ1Zmxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgICBjaGFyCQkgKnRtcGJ1ZiA9IE5VTEw7CisgICAgIHRtcGJ1ZiA9IChjaGFyICopY2FsbG9jKGJ1Zmxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgc3RyY3B5KHRtcGJ1ZiwgaW5zdHJpbmcpOworI2VuZGlmCisKKyAgICBGc3BlY19SbXMgPSBidWY7CQkJCS8qIGZvciBkZWNjJHRvX3ZtcyAqLworCisgICAgaWYgKCBzdHJjaHIoaW5zdHJpbmcsJy8nKSA9PSBOVUxMICkKKwkvKiBJdCBpcyBhbHJlYWR5IGEgVk1TIGZpbGUgc3BlYyAqLworCXN0cmNweShidWYsIGluc3RyaW5nKTsKKyAgICBlbHNlIGlmICggc3RyY2hyKGluc3RyaW5nLCciJykgPT0gTlVMTCApeyAgICAgLyogcGFzc3dvcmQgaW4gdGhlIHBhdGggPyAgICovCisJLyogU2VlbXMgaXQgaXMgYSByZWd1bGFyIGZpbGUsIGxldCBndWVzcyB0aGF0IGl0IGlzIHB1cmUgVW5peCBmc3BlYyAqLworCWlmICggZGVjYyR0b192bXMoaW5zdHJpbmcsIHZtc19mc3BlY19wcm9jLCAwLCAwKSA8PSAwICkKKwkgICAgLyogTm8uLi4gaXQgbXVzdCBiZSBtaXhlZCAqLworCSAgICB2bXNfdW5peF9taXhlZF9maWxlc3BlYyhpbnN0cmluZywgYnVmKTsKKyAgICB9CisgICAgZWxzZQorCS8qIHdlIGhhdmUgYSBwYXNzd29yZCBpbiB0aGUgcGF0aCAgICovCisJLyogZGVjYyQgZnVuY3Rpb25zIGNhbiBub3QgaGFuZGxlICAgKi8KKwkvKiB0aGlzIGlzIG91ciBvbmx5IGhvcGUgdG8gcmVzb2x2ICAqLworCXZtc191bml4X21peGVkX2ZpbGVzcGVjKGluc3RyaW5nLCBidWYpOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKy8qCisgKiBSZW1vdmUgdmVyc2lvbiBudW1iZXIgZnJvbSBmaWxlIG5hbWUKKyAqIHdlIG5lZWQgaXQgaW4gc29tZSBzcGVjaWFsIGNhc2VzIGFzOgorICogY3JlYXRpbmcgc3dhcCBmaWxlIG5hbWUgYW5kIHdyaXRpbmcgbmV3IGZpbGUKKyAqLworICAgIHZvaWQKK3Ztc19yZW1vdmVfdmVyc2lvbih2b2lkICogZm5hbWUpCit7CisgICAgY2hhcl91CSpjcDsKKyAgICBjaGFyX3UJKmZwOworCisgICAgaWYgKChjcCA9IHZpbV9zdHJjaHIoIGZuYW1lLCAnOycpKSAhPSBOVUxMKSAvKiByZW1vdmUgdmVyc2lvbiAqLworCSpjcCA9ICdcMCc7CisgICAgZWxzZSBpZiAoKGNwID0gdmltX3N0cnJjaHIoIGZuYW1lLCAnLicpKSAhPSBOVUxMICkKKyAgICB7CisJaWYgICAgICAoKGZwID0gdmltX3N0cnJjaHIoIGZuYW1lLCAnXScpKSAhPSBOVUxMICkgezt9CisJZWxzZSBpZiAoKGZwID0gdmltX3N0cnJjaHIoIGZuYW1lLCAnPicpKSAhPSBOVUxMICkgezt9CisJZWxzZSBmcCA9IGZuYW1lOworCisJd2hpbGUgKCAqZnAgIT0gJ1wwJyAmJiBmcCA8IGNwICkKKwkgICAgaWYgKCAqZnArKyA9PSAnLicgKQorCQkqY3AgPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gOworfQpkaWZmIC0tZ2l0IGEvc3JjL29zX3Ztc19jb25mLmggYi9zcmMvb3Nfdm1zX2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX3Ztc19jb25mLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qIG9zX3Ztc19jb25mLmguICBSZXBsYWNlcyBhdXRvL2NvbmZpZy5oIGZvciBWTVMgKi8KKworI2RlZmluZSBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FICAgLyogT3BlbiBWTVMgaXMgY2FzZSBpbnNlbnNpdGl2ZSAqLworI2RlZmluZSBTUEFDRV9JTl9GSUxFTkFNRQkgICAgLyogVGhlcmUgY291bGQgYmUgc3BhY2UgYmV0d2VlbiB1c2VyIGFuZCBwYXNzd2QgKi8KKyNkZWZpbmUgRk5BTUVfSUxMRUdBTCAifCojPyUiICAgICAgIC8qIElsbGVnYWwgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZSAqLworI2RlZmluZSBCSU5BUllfRklMRV9JTwkJICAgIC8qIFVzZSBiaW5hcnkgZmlsZWlvICovCisjZGVmaW5lIFVTRV9HRVRDV0QKKyNkZWZpbmUgVVNFX1NZU1RFTQorCisvKiBEZWZpbmUgd2hlbiB0ZXJtaW5mbyBzdXBwb3J0IGZvdW5kICovCisjdW5kZWYgVEVSTUlORk8KKworLyogRGVmaW5lIHdoZW4gdGVybWNhcC5oIGNvbnRhaW5zIG9zcGVlZCAqLworLyogI2RlZmluZSBIQVZFX09TUEVFRCAqLworCisvKiBEZWZpbmUgd2hlbiB0ZXJtY2FwLmggY29udGFpbnMgVVAsIEJDIGFuZCBQQyAqLworLyogI2RlZmluZSBIQVZFX1VQX0JDX1BDICovCisKKy8qIERlZmluZSB3aGVuIHRlcm1jYXAuaCBkZWZpbmVzIG91dGZ1bnR5cGUgKi8KKy8qI2RlZmluZSBIQVZFX09VVEZVTlRZUEUgKi8KKworLyogRGVmaW5lIHdoZW4gX19EQVRFX18gIiAiIF9fVElNRV9fIGNhbiBiZSB1c2VkICovCisjZGVmaW5lIEhBVkVfREFURV9USU1FCisKKy8qIERlZmluZWQgdG8gdGhlIHNpemUgb2YgYW4gaW50ICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiAjdW5kZWYgVVNFQkNPUFkgKi8KKyNkZWZpbmUgVVNFTUVNTU9WRQorLyogI3VuZGVmIFVTRU1FTUNQWSAqLworCisvKiBEZWZpbmUgd2hlbiAibWFuIC1zIDIiIGlzIHRvIGJlIHVzZWQgKi8KKy8qICN1bmRlZiBVU0VNQU5fUyAqLworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisvKiAjdW5kZWYgY29uc3QgKi8KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworLyogI3VuZGVmIG1vZGVfdCAqLworCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworLyogI3VuZGVmIG9mZl90ICovCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisvKiAjdW5kZWYgcGlkX3QgKi8KKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisvKiAjdW5kZWYgc2l6ZV90ICovCisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKy8qICN1bmRlZiB1aWRfdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisvKiAjdW5kZWYgZ2lkX3QgKi8KKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKy8qICN1bmRlZiBpbm9fdCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG5hbm9zbGVlcCgpIGZ1bmN0aW9uLiAgKi8KKy8qICN1bmRlZiBIQVZFX05BTk9TTEVFUCAqLworCisvKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICAqLworI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDxzeXMvc2VsZWN0Lmg+LiAgKi8KKy8qICN1bmRlZiBTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUgKi8KKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCisjZGVmaW5lIFJFVFNJR1RZUEUgdm9pZAorCisvKiBEZWZpbmUgYXMgdGhlIGNvbW1hbmQgYXQgdGhlIGVuZCBvZiBzaWduYWwgaGFuZGxlcnMgKCIiIG9yICJyZXR1cm4gMDsiKS4gICovCisjZGVmaW5lIFNJR1JFVFVSTiByZXR1cm4KKworLyogRGVmaW5lIGlmIHN0cnVjdCBzaWdjb250ZXh0IGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgSEFWRV9TSUdDT05URVhUCisKKy8qIERlZmluZSBpZiB0b3VwcGVyL3RvbG93ZXIgb25seSB3b3JrIG9uIGxvd2VyL3VwZXJjYXNlIGNoYXJhY3RlcnMgKi8KKy8qICNkZWZpbmUgQlJPS0VOX1RPVVBQRVIgKi8KKworLyogRGVmaW5lIGlmIHRnZXRzdHIoKSBoYXMgYSBzZWNvbmQgYXJndW1lbnQgdGhhdCBpcyAoY2hhciAqKSAqLworLyogI3VuZGVmIFRHRVRTVFJfQ0hBUl9QICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnc2V0KCkgZnVuY3Rpb24uICAqLworLyogI3VuZGVmIEhBVkVfU0lHU0VUICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0cGdpZCgpIGZ1bmN0aW9uLiAgKi8KKy8qICN1bmRlZiBIQVZFX1NFVFBHSUQgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRzaWQoKSBmdW5jdGlvbi4gICovCisvKiAjdW5kZWYgSEFWRV9TRVRTSUQgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdzZXQoKSBmdW5jdGlvbi4gICovCisvKiAjdW5kZWYgSEFWRV9TSUdTRVQgKi8KKworI2RlZmluZSBUR0VURU5UX1pFUk9fRVJSCisjZGVmaW5lIEhBVkVfR0VUQ1dECisjZGVmaW5lIEhBVkVfU1RSQ1NQTgorI2RlZmluZSBIQVZFX1NUUlRPTAorI2RlZmluZSBIQVZFX1RHRVRFTlQKKyNkZWZpbmUgSEFWRV9NRU1TRVQKKyNkZWZpbmUgSEFWRV9NRU1DTVAKKyNkZWZpbmUgSEFWRV9TVFJFUlJPUgorI2RlZmluZSBIQVZFX0ZDSE9XTgorI2RlZmluZSBIQVZFX1JFTkFNRQorI2RlZmluZSBIQVZFX1FTT1JUCisjZGVmaW5lIEhBVkVfRlNZTkMKKyNkZWZpbmUgSEFWRV9HRVRQV1VJRAorI2RlZmluZSBIQVZFX0dFVFBXTkFNCisjZGVmaW5lCUhBVkVfU1RETElCX0gKKyNkZWZpbmUJSEFWRV9TVFJJTkdfSAorI2RlZmluZQlIQVZFX0VSUk5PX0gKKyNkZWZpbmUgSEFWRV9PUEVORElSCisjZGVmaW5lIEhBVkVfUFVURU5WCisjZGVmaW5lIEhBVkVfU0VURU5WCisjZGVmaW5lIEhBVkVfU0VUSk1QX0gKKworI3VuZGVmCUhBVkVfRElSRU5UX0gKKyN1bmRlZglIQVZFX1NZU19ORElSX0gKKyN1bmRlZglIQVZFX1NZU19ESVJfSAorI3VuZGVmCUhBVkVfTkRJUl9ICisjdW5kZWYJSEFWRV9TWVNfV0FJVF9ICisjdW5kZWYJSEFWRV9VTklPTl9XQUlUCisjdW5kZWYgIEhBVkVfU1lTX1NFTEVDVF9ICisjdW5kZWYgIEhBVkVfU1lTX1VUU05BTUVfSAorI3VuZGVmICBIQVZFX1NZU19TWVNURU1JTkZPX0gKKyN1bmRlZiAgSEFWRV9URVJNQ0FQX0gKKyN1bmRlZglIQVZFX1NHVFRZX0gKKyN1bmRlZglIQVZFX1NZU19JT0NUTF9ICisjdW5kZWYJSEFWRV9URVJNSU9fSAorI3VuZGVmCUhBVkVfU1RST1BUU19ICisjdW5kZWYJSEFWRV9TWVNfU1RSRUFNX0gKKyN1bmRlZglIQVZFX1NZU19QVEVNX0gKKyN1bmRlZglIQVZFX1RFUk1JT1NfSAorI3VuZGVmCUhBVkVfTElCQ19ICisjdW5kZWYJSEFWRV9TWVNfU1RBVEZTX0gKKyN1bmRlZglIQVZFX1NZU19QT0xMX0gKKyN1bmRlZglIQVZFX1BXRF9ICisjdW5kZWYgIEhBVkVfRkNIRElSCisKKy8qIEhhcmR3YXJlIHNwZWNpZmljICovCisjaWZkZWYgIFZBWAorI3VuZGVmICBIQVZFX0dFVFRJTUVPRkRBWQorI3VuZGVmICBIQVZFX1VTTEVFUAorI3VuZGVmICBIQVZFX1NUUkNBU0VDTVAKKyN1bmRlZiAgSEFWRV9TVFJJTkdTX0gKKyN1bmRlZglIQVZFX1NJR1NFVEpNUAorI2Vsc2UKKyNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyNkZWZpbmUgSEFWRV9VU0xFRVAKKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QCisjZGVmaW5lIEhBVkVfU1RSSU5HU19ICisjZGVmaW5lCUhBVkVfU0lHU0VUSk1QCisjZW5kaWYKKworLyogQ29tcGlsZXIgc3BlY2lmaWMgKi8KKyNpZmRlZiAgVkFYQworI3VuZGVmICBIQVZFX1NFTEVDVAorI3VuZGVmICBIQVZFX0ZDTlRMX0gKKyN1bmRlZiAgSEFWRV9VTklTVERfSAorI3VuZGVmICBIQVZFX1NZU19USU1FX0gKKyN1bmRlZiAgSEFWRV9MT0NBTEVfSAorI2RlZmluZSBCUk9LRU5fTE9DQUxFCisjdW5kZWYgIEhBVkVfSUNPTlZfSAorI3VuZGVmICBIQVZFX0lDT05WCisjdW5kZWYgIERZTkFNSUNfSUNPTlYKKyN1bmRlZglIQVZFX1NUUkZUSU1FCisjZWxzZQorI2RlZmluZSBIQVZFX1NFTEVDVAorI2RlZmluZSBIQVZFX0ZDTlRMX0gKKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSAorI2RlZmluZSBIQVZFX0xPQ0FMRV9ICisjZGVmaW5lIEJST0tFTl9MT0NBTEUKKyN1bmRlZiAgSEFWRV9JQ09OVl9ICisjdW5kZWYgIEhBVkVfSUNPTlYKKyN1bmRlZiAgRFlOQU1JQ19JQ09OVgorI2RlZmluZQlIQVZFX1NUUkZUSU1FCisjZW5kaWYKKworLyogR1VJIHN1cHBvcnQgZGVmaW5lcyAqLworI2lmZGVmIEZFQVRfR1VJX01PVElGCisjZGVmaW5lIEhBVkVfWDExCisjZGVmaW5lIFVTRV9GT05UU0VUCisjdW5kZWYgIFhfTE9DQUxFCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9vc192bXNfZml4LmNvbSBiL3NyYy9vc192bXNfZml4LmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU1YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX3Ztc19maXguY29tCkBAIC0wLDAgKzEsMjc2IEBACiskIQorJCEgT1NfVk1TX0ZJWC5DT00KKyQhIENvcHlyaWdodCAoQykgMjAwMCwgU3RlcGhlbiBQLiBXYWxsCiskIQorJCEgRmlsdGVyIGZpbGVzIGZvciAiI2lmIiBsaW5lIGNvbnRpbnVhdGlvbnMgdXNpbmcgYSAnXCcgYW5kIGNvbnZlcnQKKyQhIHRoZW0gdG8gdXNlIGNvbW1lbnRzIGZvciB0aGUgY29udGludWF0aW9uLiAgTmVjZXNzYXJ5IGZvciBWQVhDIC0gaXQKKyQhIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgJ1wnLgorJCEKKyQhIFllcywgdGhpcyBpcyBob25raW4nIHVnbHkgY29kZSwgYnV0IEkgZGVsaWJlcmF0ZWx5IGF2b2lkZWQKKyQhICAgICBpZiAuLi4KKyQhICAgICB0aGVuCiskIQkgICAuLi4uCiskISAgICAgZW5kaWYKKyQhIGFuZCBjYWxsL3N1YnJvdXRpbmUvZW5kc3Vicm91dGluZSBjb25zdHJ1Y3RzLCBiZWNhdXNlIEkgY2FuIHN0aWxsCiskISByZW1lbWJlciB3aGVuIERDTCBkaWRuJ3QgaGF2ZSB0aGVtLCBhbmQgSSB3YW50ZWQgdGhpcyB0byBiZSBhcworJCEgcG9ydGFibGUgYXMgcG9zc2libGUsIHNvLi4uICBJZiB5b3Ugd2FudCB0byBzdHJ1Y3R1cmUgaXQgbmljZXIgZm9yCiskISB5b3VyIG93biB1c2UsIHBsZWFzZSBmZWVsIGZyZWUgdG8gZG8gc28uICBIb3dldmVyLCBwbGVhc2Ugb25seQorJCEgZGlzdHJpYnV0ZSBpdCBpbiBpdCdzIG9yaWdpbmFsIGZvcm0uCiskIQorJCEgSSB3cm90ZSBpdCBpbiBEQ0wgZm9yIHBvcnRhYmlsaXR5IGFuZCBlYXNlIG9mIHVzZSAtIGEgQyB2ZXJzaW9uCiskISB3b3VsZCBkZWZpbml0ZWx5IHJ1biBmYXN0ZXIsIGJ1dCB0aGVuIEknZCBoYXZlIHRvIGRlYWwgd2l0aCBjb21waWxlcgorJCEgZGlmZmVyZW5jZXMsIGFuZCB1c2VycyB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBjb25maWd1cmluZyBhbmQKKyQhIGJ1aWxkaW5nIGl0LiAgV2l0aCBEQ0wsIGl0IHJ1bnMgb3V0LW9mLXRoZS1ib3guCiskIQorJCEgTm90ZSB0aGF0IGlmIHlvdSB1c2UgdGhpcyBmcm9tIGEgVk1TIHN5c3RlbSB0byBtb2RpZnkgZmlsZXMgb24gYQorJCEgbW91bnRlZCBuZXR3b3JrIGRyaXZlLCBmJHNlYXJjaCgpIG1heSByZXR1cm4gb25seSB0aGUgZmlyc3QgbWF0Y2hpbmcKKyQhIGZpbGUgd2hlbiBpdCB0cmllcyB0byByZXNvbHZlIHdpbGRjYXJkcy4gIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBmaW5kCiskISBhIHdheSBhcm91bmQgdGhpcy4gIEVpdGhlciBjb3B5IHRoZSBmaWxlcyB0byBhIGxvY2FsIGRpc2ssIG9yIHNwZWNpZnkKKyQhIGVhY2ggZmlsZSBpbmRpdmlkdWFsbHkgKEtlZXAgaW4gbWluZCBpZiB5b3UgZG8gdGhpcyB0aGF0IFZNUyBsaW1pdHMKKyQhIHlvdSB0byBlaWdodCBwYXJhbWV0ZXJzLCBzbyB5b3UnbGwgb25seSBiZSBhYmxlIHRvIGZpbHRlciBlaWdodCBmaWxlcworJCEgYXQgYSB0aW1lKS4KKyQhCiskISBJZGVhcy4uLgorJCEgLSBVc2UgJ3NlYXJjaCBmaWxlc3BlYyAiIyIsImlmIiwiXCIvbWF0PWFuZCcgdG8gcXVpY2tseSBlbGltaW5hdGUKKyQhICAgZmlsZXMgdGhhdCBkZWZpbml0ZWx5IGRvbid0IG5lZWQgZmlsdGVyaW5nLiAgVGhpcyBzaG91bGQgc3BlZWQKKyQhICAgdGhpbmdzIHVwIGNvbnNpZGVyYWJsZS4gIFJlYWRpbmcgYW5kIHdyaXRpbmcgZXZlcnkgbGluZSBmcm9tIGV2ZXJ5CiskISAgIGZpbGUgdGFrZXMgcXVpdGUgYSBiaXQgb2YgdGltZS4uLgorJCEgLSBFcnJvciBoYW5kbGluZyBpc24ndCBncmVhdC4gIENvbWUgdXAgd2l0aCBzb21ldGhpbmcgYmV0dGVyLi4uLgorJCEKKyQhIEUtbWFpbCBhZGRyZXNzZXM6CiskISBTdGV2ZSBXYWxsCQloaXRjaGVkOTdAdmVsbmV0LmNvbQorJCEgWm9sdGFuIEFycGFkZmZ5ICAgICAgYXJwYWRmZnlAcG9sYXJob21lLmNvbQorJCEgSm9obiBXLiBIYW1pbGwgICAgICAgamhhbWlsbDNAZm9yZC5jb20KKyQhCiskISBNb2RpZmljYXRpb24gSGlzdG9yeToKKyQhIDEzSnVsMDAgU1dhbGwJSW5pdGlhbCBWZXJzaW9uCiskISAxNEp1bDAwIFpBcnBhZGZmeSAgICBEaXNwbGF5IHVzYWdlCiskISAwNk1hcjAxIEpIYW1pbGwgICAgICBDdHJsLU0gcHJvYmxlbSBmaXgKKyQhCiskISBJZiBubyBwYXJhbWV0ZXJzLCBvciAiLWgiIGZvciBhIHBhcmFtZXRlciwgcHJpbnQgdXNhZ2UgYW5kIGV4aXQKKyQKKyQgYWxsID0gIicncDEnJydwMicnJ3AzJycncDQnJydwNScnJ3A2JycncDcnJydwOCciCiskIGlmIChhbGwgLm5lcy4gIiIpIC5hbmQuIChwMSAubmVzLiAiLWgiKSAuYW5kLiAocDEgLm5lcy4gIi1IIikgdGhlbiBnb3RvIHN0YXJ0dXAKKyQKKyQgd3JpdGUgc3lzJG91dHB1dCAiT1NfVk1TX0ZJWCAtIERFQ0MtPlZBWEMgcHJlLXByb2Nlc3NvciBkaXJlY3RpdmUgY29udmVydCBzY3JpcHQiCiskIHdyaXRlIHN5cyRvdXRwdXQgIlVzYWdlOiBAT1NfVk1TX0ZJWCA8ZmlsZW5hbWVfMT4gPGZpbGVuYW1lXzI+IDwuLi4+IgorJCB3cml0ZSBzeXMkb3V0cHV0ICIgICAgICAgQE9TX1ZNU19GSVggPGZpbGVuYW1lIHdpdGggd2lsZGNhcmQ+IDwuLi4+IgorJCB3cml0ZSBzeXMkb3V0cHV0ICIiCiskIHdyaXRlIHN5cyRvdXRwdXQgIkV4YW1wbGU6IEBPU19WTVNfRklYICouYyAqLmggWy5wcm90b10qLnBybyIKKyQgd3JpdGUgc3lzJG91dHB1dCAiUGxlYXNlIG5vdGUsIHlvdSBjYW4gZGVmaW5lIHVwIHRvIDggcGFyYW1ldGVycy4iCiskIHdyaXRlIHN5cyRvdXRwdXQgIiIKKyQgZXhpdAorJAorJCEgQ3JlYXRlIGFuIEZETCBmaWxlIHRvIGNvbnZlcnQgVkZDIGZvcm1hdCBmaWxlcyB0byBTdHJlYW1fTEYuCiskISBWTVMgT1BFTi9XUklURSBjb21tYW5kIGNyZWF0ZXMgVkZDIGZpbGVzLiAgV2hlbiBWRkMgZmlsZXMgYXJlIHJlYWQKKyQhIG91dCB1bmRlciB1bml4LCB0aGV5IGFwcGVhciB0byBoYXZlIGJpbmFyeSBkYXRhIGVtYmVkZGVkIGluIHRoZW0uCiskISBUbyBiZSBmcmllbmRseSwgd2UnbGwgY29udmVydCB0aGVtIHRvIFN0cmVhbV9MRiwgd2hpY2ggcmVhZHMganVzdAorJCEgZmlsZSBvbiB1bml4LgorJAorJHN0YXJ0dXA6CiskIG9uIGNvbnRyb2xfeSB0aGVuIGdvdG8gc3RvcGZkbAorJCBvcGVuL3dyaXRlIGZkbCBbXWNvbnZlcnQuZmRsCiskIHdyaXRlIGZkbCAiU1lTVEVNIgorJCB3cml0ZSBmZGwgIiBTT1VSQ0UgVkFYL1ZNUyIKKyQgd3JpdGUgZmRsICJGSUxFIgorJCB3cml0ZSBmZGwgIiBPUkdBTklaQVRJT04gU0VRVUVOVElBTCIKKyQgd3JpdGUgZmRsICJSRUNPUkQiCiskIHdyaXRlIGZkbCAiIEJMT0NLX1NQQU4gWUVTIgorJCB3cml0ZSBmZGwgIiBDQVJSSUFHRV9DT05UUk9MIENBUlJJQUdFX1JFVFVSTiIKKyQgd3JpdGUgZmRsICIgRk9STUFUIFNUUkVBTSIKKyQgd3JpdGUgZmRsICIgU0laRSAwIgorJCBjbG9zZSBmZGwKKyQgb24gY29udHJvbF95IHRoZW4gZ290byBlbmRwYXJhbWxvb3AKKyQKKyQhIFNvbWUgc3ltYm9scyBmb3IgdXNlIGxhdGVyIG9uLi4uCiskCiskIHNwYyA9ICIiCiskIHNwY1swLDhdID0gMzIKKyQgdGFiID0gIiIKKyQgdGFiWzAsOF0gPSA5CiskCiskISBTY2FuIGFsbCBwb3NpdGlvbmFsIGFyZ3VtZW50cywgZG8gd2lsZGNhcmQgZXhwYW5zaW9uLCBhbmQgY2FsbCB0aGUKKyQhIGZpbHRlciByb3V0aW5lIG9uIGVhY2ggcmVzdWx0aW5nIGZpbGVuYW1lLgorJAorJCBjbnQgPSAwCiskcGFyYW1sb29wOgorJCBjbnQgPSBjbnQgKyAxCiskCiskISBWTVMgb25seSBhbGxvd3MgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgUDEgLSBQOCwgc28gc3RvcCBhZnRlcgorJCEgcHJvY2Vzc2luZyA4IGFyZ3VtZW50cy4KKyQKKyQgaWYgY250IC5lcS4gOSB0aGVuIGdvdG8gZW5kcGFyYW1sb29wCiskCiskISBTa2lwIGFueSBlbXB0eSBwYXJhbWV0ZXIuCiskCiskIGlmIFAnY250JyAuZXFzLiAiIiB0aGVuIGdvdG8gcGFyYW1sb29wCiskCiskISBHb3QgYSBwYXJhbWV0ZXIgLSBkbyB3aWxkY2FyZCBleHBhbnNpb24uCiskCiskIGFyZyA9IGYkcGFyc2UoUCdjbnQnKQorJCB3cml0ZSBzeXMkb3V0cHV0ICJQYXJzaW5nICcnYXJnJy4uLiIKKyQgbGFzdCA9ICIiCiskZmlsZWxvb3A6CiskIGZpbGUgPSBmJHNlYXJjaChhcmcsIDEpCiskCiskISBmJHNlYXJjaCgpIHJldHVybnMgIiIgYWZ0ZXIgdGhlIGxhc3Qgb2YgbXVsdGlwbGUgbWF0Y2hlcy4KKyQKKyQgaWYgZmlsZSAuZXFzLiAiIiB0aGVuIGdvdG8gZW5kZmlsZWxvb3AKKyQKKyQhIFN0cmlwIHRoZSB2ZXJzaW9uIG51bWJlci4KKyQKKyQgZmlsZSA9IGYkcGFyc2UoZmlsZSwsLCJERVZJQ0UiKSArIGYkcGFyc2UoZmlsZSwsLCJESVJFQ1RPUlkiKSArIC0KKyAgICAgICAgIGYkcGFyc2UoZmlsZSwsLCJOQU1FIikgKyBmJHBhcnNlKGZpbGUsLCwiVFlQRSIpCiskCiskISBmJHNlYXJjaCgpIHJldHVybnMgdGhlIHNhbWUgZmlsZW5hbWUgb3ZlciBhbmQgb3ZlciBpZiB0aGVyZSBhcmUgbm8KKyQhIHdpbGRjYXJkcyBpbiBpdC4KKyQKKyQgaWYgZmlsZSAuZXFzLiBsYXN0IHRoZW4gZ290byBlbmRmaWxlbG9vcAorJCBsYXN0ID0gZmlsZQorJAorJCEgR290IGEgdmFsaWQgZmlsZSAtIGZpbHRlciBpdC4KKyQKKyQgZ29zdWIgZmlsdGVyCiskCiskISBSZXNldCBvdXIgZXJyb3IgaGFuZGxpbmcuCiskCiskIG9uIGNvbnRyb2xfeSB0aGVuIGdvdG8gZW5kcGFyYW1sb29wCiskCiskISBTZWUgaWYgdGhlcmUncyBhbm90aGVyIG1hdGNoaW5nIGZpbGVuYW1lLgorJAorJCBnb3RvIGZpbGVsb29wCiskZW5kZmlsZWxvb3A6CiskCiskISBDaGVjayBmb3IgYW5vdGhlciBwYXJhbWV0ZXIuCiskCiskIGdvdG8gcGFyYW1sb29wCiskZW5kcGFyYW1sb29wOgorJAorJCEgRmluaXNoZWQgLSBkZWxldGUgdGhlIEZETCBmaWxlLgorJAorJCBkZWxldGUgW11jb252ZXJ0LmZkbDsKKyQKKyQhIFNvIGxvbmcsIGFuZCB0aGFua3MgZm9yIGFsbCB0aGUgZmlzaC4uLgorJAorJCBleGl0CiskCiskCiskISBVc2VyIGFib3J0ZWQgd2l0aCBDb250cm9sLVkgZHVyaW5nIGNyZWF0aW9uIG9mIEZETCBmaWxlLgorJCEgQ2xvc2UgdGhlIGZpbGUsIGRlbGV0ZSBpdCwgYW5kIGV4aXQgd2l0aCBhbiBlcnJvciBzdGF0dXMuCiskCiskc3RvcGZkbDoKKyQgY2xvc2UgZmRsCiskIGRlbGV0ZSBbXWNvbnZlcnQuZmRsOworJCBleGl0ICVYMTAwMDAwMDAKKyQKKyQKKyQhIEZpbHRlciBhIGZpbGUuCiskCiskZmlsdGVyOgorJCB3cml0ZSBzeXMkb3V0cHV0ICJGaWx0ZXJpbmcgJydmaWxlJy4uLiIKKyQKKyQhIEdldCBhIHRlbXBvcmFyeSBmaWxlbmFtZSBmcm9tIHRoZSBzdWJyb3V0aW5lIHBhcmFtZXRlci4KKyQKKyQgdG1wID0gZiRwYXJzZShmaWxlLCwsIkRFVklDRSIpICsgZiRwYXJzZShmaWxlLCwsIkRJUkVDVE9SWSIpICsgLQorICAgICAgICAidG1wXyIgKyBmJHBhcnNlKGZpbGUsLCwiTkFNRSIpICsgZiRwYXJzZShmaWxlLCwsIlRZUEUiKQorJCBvbiBjb250cm9sX3kgdGhlbiBnb3RvIGFib3J0ZWQKKyQgb3BlbiAvcmVhZCBpbnB1dCAnZmlsZScKKyQgb3BlbiAvd3JpdGUgb3V0cHV0ICd0bXAnCiskIGNoYW5nZWQgPSAwCiskcmVhZGxvb3A6CiskIHJlYWQvZW5kX29mX2ZpbGU9ZW5kcmVhZGxvb3AvZXJyb3I9cmVhZGxvb3BlcnJvciBpbnB1dCBsaW5lCiskCiskISBHZXQgdGhlIGZpcnN0IDMgbm9uLWJsYW5rIGNoYXJhY3RlciBvbiB0aGUgbGluZS4KKyQKKyQgc3RhcnQgPSBmJGV4dHJhY3QoMCwzLGYkZWRpdChsaW5lLCJDT0xMQVBTRSxMT1dFUkNBU0UiKSkKKyQKKyQhIElmIHRoZSBsaW5lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBzb21lIGZvcm0gb2YgIiNpZiIsIGp1c3Qgd3JpdGUgaXQgdG8KKyQhIHRoZSB0ZW1wIGZpbGUuCiskCiskIGlmIHN0YXJ0IC5uZXMuICIjaWYiIHRoZW4gZ290byB3cml0ZWl0CiskY2hrYmtzbHNoOgorJAorJCEgU2VlIGlmIHRoZSBsaW5lIGVuZHMgaW4gYSBiYWNrc2xhc2guICBJZiBub3QsIHdyaXRlIGl0IHRvIHRoZSB0ZW1wIGZpbGUuCiskCiskIGlmIGYkZXh0cmFjdChmJGxlbmd0aChsaW5lKS0xLDEsbGluZSkgLm5lcy4gIlwiIHRoZW4gZ290byB3cml0ZWl0CiskCiskISBPaywgZ290IGEgbGluZSB0aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLiAgTWFyayB0aGlzIGZpbGUgYXMgY2hhbmdlZCwKKyQhIHRoZW4gcmVwbGFjZSB0aGUgYmFja3NsYXNoIGF0IHRoZSBlbmQgd2l0aCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tbWVudAorJCEgKC8qKSwgYW5kIHdyaXRlIGl0IHRvIHRoZSB0ZW1wIGZpbGUuCiskCiskIGNoYW5nZWQgPSAxCiskIGxpbmUgPSBmJGV4dHJhY3QoMCxmJGxlbmd0aChsaW5lKS0xLGxpbmUpICsgIi8qIgorJCB3cml0ZS9zeW1ib2wgb3V0cHV0IGxpbmUKKyQKKyQhIEdldCBhbm90aGVyIGxpbmUgZnJvbSB0aGUgaW5wdXQuCiskCiskIHJlYWQvZW5kX29mX2ZpbGU9ZW5kcmVhZGxvb3AvZXJyb3I9cmVhZGxvb3BlcnJvciBpbnB1dCBsaW5lCiskCiskISBHcmFiIGFsbCB0aGUgYmxhbmsgc3BhY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgorJAorJCBzcGFjZXMgPSAiIgorJHNwYWNlbG9vcDoKKyQgaWYgKGYkZXh0cmFjdCgwLDEsbGluZSkgLm5lcy4gc3BjKSAuYW5kLiAoZiRleHRyYWN0KDAsMSxsaW5lKSAubmVzLiB0YWIpIC0KKyAgICAgICAgdGhlbiBnb3RvIGVuZHNwYWNlbG9vcAorJCBzcGFjZXMgPSBzcGFjZXMgKyBmJGV4dHJhY3QoMCwxLGxpbmUpCiskIGxpbmUgPSBmJGV4dHJhY3QoMSxmJGxlbmd0aChsaW5lKS0xLGxpbmUpCiskIGdvdG8gc3BhY2Vsb29wCiskZW5kc3BhY2Vsb29wOgorJAorJCEgU3RpY2sgYW4gZW5kLWNvbW1lbnQgKCovKSBhZnRlciB0aGUgbGVhZGluZyBibGFua3MsIHRoZW4gZ28gYmFjayBhbmQKKyQhIGNoZWNrIGZvciBhIHRyYWlsaW5nIGJhY2tzbGFzaCBhZ2FpbiwgdG8gY2F0Y2ggY29kZSB0aGF0IGNvbnRpbnVlcworJCEgYWNyb3NzIG11bHRpcGxlIGxpbmVzLgorJAorJCBsaW5lID0gc3BhY2VzICsgIiovICIgKyBsaW5lCiskIGdvdG8gY2hrYmtzbHNoCiskCiskISBXcml0ZSB0aGUgY3VycmVudCBsaW5lLCAod2lsbCBlaXRoZXIgYmUgYW4gdW50b3VjaGVkIGxpbmUsIG9yIHRoZQorJCEgbGFzdCBsaW5lIG9mIGEgY29udGludWF0aW9uKSB0byB0aGUgdGVtcCBmaWxlLCBhbmQgZ28gYmFjayB0byBsb29rCiskISBmb3IgbW9yZSBpbnB1dC4KKyQhCiskd3JpdGVpdDoKKyQgd3JpdGUvc3ltYm9sIG91dHB1dCBsaW5lCiskIGdvdG8gcmVhZGxvb3AKKyQKKyQhIEhpdCBFT0YuICBDbG9zZSB0aGUgaW5wdXQgJiBvdXRwdXQsIGFuZCBpZiB0aGUgZmlsZSB3YXMgbWFya2VkIGFzCiskISBjaGFuZ2VkLCBjb252ZXJ0IGl0IGZyb20gVk1TIFZGQyBmb3JtYXQsIHRvIHRoZSBtb3JlIGNvbW1vbiBTdHJlYW1fTEYKKyQhIGZvcm1hdCwgc28gaXQgZG9lc24ndCBzaG93IHVwIGZ1bGwgb2YgZ2FyYmFnZSBpZiBzb21lb25lIHRyaWVzIHRvCiskISBlZGl0IGl0IG9uIGFub3RoZXIgT1MuCiskIQorJGVuZHJlYWRsb29wOgorJCBjbG9zZSBpbnB1dAorJCBjbG9zZSBvdXRwdXQKKyQgaWYgY2hhbmdlZCAuZXEuIDAgdGhlbiBnb3RvIG5vY29weQorJCBjb252ZXJ0ICd0bXAnICdmaWxlJyAvZmRsPVtdY29udmVydC5mZGwKKyRub2NvcHk6CiskIGRlbGV0ZSAndG1wJzsKKyQKKyQhIEV4aXQgdGhpcyBzdWJyb3V0aW5lLgorJAorJCBnb3RvIGVuZGZ1bmMKKyQKKyQhIEdvdCBhIHJlYWQgZXJyb3IuICBTYXkgc28sIGFuZCB0cmFzaCB0aGUgdGVtcCBmaWxlLgorJAorJHJlYWRsb29wZXJyb3I6CiskIHdyaXRlIHN5cyRlcnJvciAiRXJyb3IgcHJvY2Vzc2luZyBmaWxlICcnZmlsZSciCiskIGdvdG8gZXJyb3JlbmQKKyQKKyQhIEdvdCBhbiBpbnRlcnJ1cHQuICBTYXkgc28sIGFuZCB0cmFzaCB0aGUgdGVtcCBmaWxlLgorJAorJGFib3J0ZWQ6CiskIHdyaXRlIHN5cyRlcnJvciAiQWJvcnRlZCB3aGlsZSBwcm9jZXNzaW5nIGZpbGUgJydmaWxlJyIKKyQKKyQhIENvbW1vbiBjb2RlIGZvciByZWFkIGVycm9ycyBhbmQgaW50ZXJydXB0cy4KKyQKKyRlcnJvcmVuZDoKKyQgY2xvc2UgaW5wdXQKKyQgY2xvc2Ugb3V0cHV0CiskIGRlbGV0ZSAndG1wJzsKKyQgcmV0dXJuICVYMTAwMDAwMDAKKyQKKyQhIEVuZCBvZiBmaWx0ZXIgc3Vicm91dGluZS4KKyQKKyRlbmRmdW5jOgorJCByZXR1cm4KKyQKKyQhIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL29zX3Ztc19tbXMuYyBiL3NyYy9vc192bXNfbW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1Mzg2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc192bXNfbW1zLmMKQEAgLTAsMCArMSw3NiBAQAorI2luY2x1ZGUJPHN0ZGlvLmg+CisjaW5jbHVkZQk8c3RkbGliLmg+CisjaW5jbHVkZQk8c3RyaW5nLmg+CisjaW5jbHVkZQk8dW5peGlvLmg+CisjaW5jbHVkZQkidmltLmgiCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIEZJTEUJKmZwaSwgKmZwbzsKKyAgICBjaGFyCWNtZFsxMzJdLCBidWZbQlVGU0laXSwgKmFyZ3AsICplcnJvcl9maWxlLCB0YXJnZXRbMTMyXSwgKm1tczsKKyAgICBpbnQJCWVyciA9IDAsIGVycl9saW5lID0gMDsKKworICAgIG1tcyA9ICJtbXMiOworICAgIGFyZ2MtLTsKKyAgICBhcmd2Kys7CisgICAgd2hpbGUgKGFyZ2MtLSA+IDApCisgICAgeworCWFyZ3AgPSAqYXJndisrOworCWlmICgqYXJncCA9PSAnLScpCisJeworCSAgICBzd2l0Y2ggKCorK2FyZ3ApCisJICAgIHsKKwkJY2FzZSAnbSc6CisJCSAgICBtbXMgPSArK2FyZ3A7CisJCSAgICBicmVhazsKKwkJY2FzZSAnZSc6CisJCSAgICBpZiAoISooZXJyb3JfZmlsZSA9ICsrYXJncCkpCisJCSAgICB7CisJCQllcnJvcl9maWxlID0gKmFyZ3YrKzsKKwkJCWFyZ2MtLTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgYnJlYWs7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKCp0YXJnZXQpCisJCXN0cmNhdCh0YXJnZXQsICIgIik7CisJICAgIHN0cmNhdCh0YXJnZXQsIGFyZ3ApOworCX0KKyAgICB9CisgICAgc3ByaW50ZihjbWQsICIlcy9vdXRwdXQ9dG1wOmVycm9ycy52aW1fdG1wICVzIiwgbW1zLCB0YXJnZXQpOworICAgIHN5c3RlbShjbWQpOworICAgIGZwaSA9IGZvcGVuKCJ0bXA6ZXJyb3JzLnZpbV90bXAiLCAiciIpOworICAgIGZwbyA9IGZvcGVuKGVycm9yX2ZpbGUsICJ3Iik7CisgICAgd2hpbGUgKGZnZXRzKGJ1ZiwgQlVGU0laLCBmcGkpKQorICAgIHsKKwlpZiAoIW1lbWNtcChidWYsICIlQ0MtIiwgNCkpCisJeworCSAgICBlcnJfbGluZSsrOworCSAgICBidWZbc3RybGVuKGJ1ZiktMV0gPSAnXDAnOworCSAgICBlcnIrKzsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGVycl9saW5lKQorCSAgICB7CisJCWlmIChzdHJzdHIoYnVmLCBfKCJBdCBsaW5lIikpKQorCQl7CisJCSAgICBlcnJfbGluZSA9IDA7CisJCSAgICBmcHJpbnRmKGZwbywgIkAiKTsKKwkJfQorCQllbHNlCisJCSAgICBidWZbc3RybGVuKGJ1ZiktMV0gPSAnXDAnOworCSAgICB9CisJfQorCWZwcmludGYoZnBvLCAiJXMiLCBidWYpOworICAgIH0KKyAgICBmY2xvc2UoZnBpKTsKKyAgICBmY2xvc2UoZnBvKTsKKyAgICB3aGlsZSAoIWRlbGV0ZSgidG1wOmVycm9ycy52aW1fdG1wIikpCisJLypub3AqLzsKKyAgICBleGl0KGVyciA/IDQ0IDogMSk7CisgICAgcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvc3JjL29zX3czMmRsbC5jIGIvc3JjL29zX3czMmRsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZmVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3NfdzMyZGxsLmMKQEAgLTAsMCArMSwyNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCUdVSSBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogV2luZG93cyBHVUk6IG1haW4gcHJvZ3JhbSAoRExMKSBlbnRyeSBwb2ludDoKKyAqCisgKiBSb24gQWFyb24gPHJvbmFoYXJvbkB5YWhvby5jb20+IHdyb3RlIHRoaXMgYW5kICB0aGUgRExMIHN1cHBvcnQgY29kZS4KKyAqLworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK0JPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFICBoaW5zdERMTCwgRFdPUkQJZmR3UmVhc29uLCBMUFZPSUQgIGxwdlJlc2VydmVkKQoreworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9zcmMvb3NfdzMyZXhlLmMgYi9zcmMvb3NfdzMyZXhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ODczYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc193MzJleGUuYwpAQCAtMCwwICsxLDEzNiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJCUdVSSBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogV2luZG93cyBHVUk6IG1haW4gcHJvZ3JhbSAoRVhFKSBlbnRyeSBwb2ludDoKKyAqCisgKiBSb24gQWFyb24gPHJvbmFoYXJvbkB5YWhvby5jb20+IHdyb3RlIHRoaXMgYW5kICB0aGUgRExMIHN1cHBvcnQgY29kZS4KKyAqLworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgX19NSU5HVzMyX18KKyMgaWZuZGVmIF9jZGVjbAorIyAgZGVmaW5lIF9jZGVjbAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNwcm90byBkb2Vzbid0IGNyZWF0ZSBhIHByb3RvdHlwZSBmb3IgbWFpbigpICovCitpbnQgX2NkZWNsCisjaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpCitWaW1NYWluCisjZWxzZQorICAgIG1haW4KKyNlbmRpZgorCV9fQVJHUygoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgKF9jZGVjbCAqcG1haW4pKGludCwgY2hhciAqKik7CisKKyNpZm5kZWYgUFJPVE8KKyNpZmRlZiBGRUFUX0dVSQorI2lmbmRlZiBWSU1ETEwKK3ZvaWQgX2NkZWNsIFNhdmVJbnN0KEhJTlNUQU5DRSBoSW5zdCk7CisjZW5kaWYKK3ZvaWQgKF9jZGVjbCAqcFNhdmVJbnN0KShISU5TVEFOQ0UpOworI2VuZGlmCisKKyAgICBpbnQgV0lOQVBJCitXaW5NYWluKAorICAgIEhJTlNUQU5DRQloSW5zdGFuY2UsCisgICAgSElOU1RBTkNFCWhQcmV2SW5zdCwKKyAgICBMUFNUUglscHN6Q21kTGluZSwKKyAgICBpbnQJCW5DbWRTaG93KQoreworICAgIGludAkJYXJnYzsKKyAgICBjaGFyCSoqYXJndjsKKyAgICBjaGFyCSp0b2ZyZWU7CisgICAgY2hhcglwcm9nWzI1Nl07CisjaWZkZWYgVklNRExMCisgICAgY2hhcgkqcDsKKyAgICBIQU5ETEUJaExpYjsKKyNlbmRpZgorCisgICAgLyogUm9uOiBhZGRlZCBmdWxsIHBhdGggbmFtZSBzbyB0aGF0IHRoZSAkVklNIHZhcmlhYmxlIHdpbGwgZ2V0IHNldCB0byBvdXIKKyAgICAgKiBzdGFydHVwIHBhdGggKHNvIHRoZSAudmltcmMgZmlsZSBjYW4gYmUgZm91bmQgdy9vIGEgVklNIGVudi4gdmFyLikgKi8KKyAgICBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwcm9nLCAyNTUpOworCisgICAgLyogU2VwYXJhdGUgdGhlIGNvbW1hbmQgbGluZSBpbnRvIGFyZ3VtZW50cy4gKi8KKyAgICBhcmdjID0gZ2V0X2NtZF9hcmdzKHByb2csIChjaGFyICopbHBzekNtZExpbmUsICZhcmd2LCAmdG9mcmVlKTsKKyAgICBpZiAoYXJnYyA9PSAwKQorICAgIHsKKwlNZXNzYWdlQm94KDAsIF8oIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iKSwKKwkJCQkJCQkgICBfKCJWSU0gRXJyb3IiKSwgMCk7CisJcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgRFlOQU1JQ19HRVRURVhUCisgICAgLyogSW5pdGlhbGl6ZSBnZXR0ZXh0IGxpYnJhcnkgKi8KKyAgICBkeW5fbGliaW50bF9pbml0KE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBWSU1ETEwKKyAgICAvLyBMb2FkTGlicmFyeSAtIGdldCBuYW1lIG9mIGRsbCB0byBsb2FkIGluIGhlcmU6CisgICAgcCA9IHN0cnJjaHIocHJvZywgJ1xcJyk7CisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisjIGlmZGVmIERFQlVHCisJc3RyY3B5KHArMSwgInZpbTMyZC5kbGwiKTsKKyMgZWxzZQorCXN0cmNweShwKzEsICJ2aW0zMi5kbGwiKTsKKyMgZW5kaWYKKyAgICB9CisgICAgaExpYiA9IExvYWRMaWJyYXJ5KHByb2cpOworICAgIGlmIChoTGliID09IE5VTEwpCisgICAgeworCU1lc3NhZ2VCb3goMCwgXygiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIpLCBfKCJWSU0gRXJyb3IiKSwgMCk7CisJZ290byBlcnJvdXQ7CisgICAgfQorICAgIC8vIGZpeCB1cCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICBwU2F2ZUluc3QgPSBHZXRQcm9jQWRkcmVzcyhoTGliLCAoTFBDU1RSKTIpOworIyBlbmRpZgorICAgIHBtYWluID0gR2V0UHJvY0FkZHJlc3MoaExpYiwgKExQQ1NUUikxKTsKKyAgICBpZiAocG1haW4gPT0gTlVMTCkKKyAgICB7CisJTWVzc2FnZUJveCgwLCBfKCJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIiksCisJCQkJCQkJICAgIF8oIlZJTSBFcnJvciIpLDApOworCWdvdG8gZXJyb3V0OworICAgIH0KKyNlbHNlCisjIGlmZGVmIEZFQVRfR1VJCisgICAgcFNhdmVJbnN0ID0gU2F2ZUluc3Q7CisjIGVuZGlmCisgICAgcG1haW4gPQorIyBpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikKKyAgICAvLyYmIGRlZmluZWQoX19NSU5HVzMyX18pCisJVmltTWFpbgorIyBlbHNlCisJbWFpbgorIyBlbmRpZgorCTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisgICAgcFNhdmVJbnN0KAorI2lmZGVmIF9fTUlOR1czMl9fCisJICAgIEdldE1vZHVsZUhhbmRsZShOVUxMKQorI2Vsc2UKKwkgICAgaEluc3RhbmNlCisjZW5kaWYKKwkgICAgKTsKKyNlbmRpZgorICAgIHBtYWluKGFyZ2MsIGFyZ3YpOworCisjaWZkZWYgVklNRExMCisgICAgRnJlZUxpYnJhcnkoaExpYik7CitlcnJvdXQ6CisjZW5kaWYKKyAgICBmcmVlKGFyZ3YpOworICAgIGZyZWUodG9mcmVlKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3Nfd2luMTYuYyBiL3NyYy9vc193aW4xNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWNjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3Nfd2luMTYuYwpAQCAtMCwwICsxLDQyNCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIG9zX3dpbjE2LmMKKyAqCisgKiBXaW4xNiAoV2luZG93cyAzLjF4KSBzeXN0ZW0tZGVwZW5kZW50IHJvdXRpbmVzLgorICogQ2FydmVkIGJydXRhbGx5IGZyb20gb3Nfd2luMzIuYyBieSBWaW5jZSBOZWdyaSA8dm5AYXNsbmV0LmNvLnVrPgorICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisjIHByYWdtYSB3YXJuIC1wYXIKKyMgcHJhZ21hIHdhcm4gLXVjcAorIyBwcmFnbWEgd2FybiAtdXNlCisjIHByYWdtYSB3YXJuIC1hdXMKKyMgcHJhZ21hIHdhcm4gLW9icworI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgInZpbS5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkb3MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworI3VuZGVmIGNoZGlyCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSA8c2hlbGxhcGkuaD4JLyogcmVxdWlyZWQgZm9yIEZpbmRFeGVjdXRhYmxlKCkgKi8KKworCisvKiBSZWNvcmQgYWxsIG91dHB1dCBhbmQgYWxsIGtleWJvYXJkICYgbW91c2UgaW5wdXQgKi8KKy8qICNkZWZpbmUgTUNIX1dSSVRFX0RVTVAgKi8KKworI2lmZGVmIE1DSF9XUklURV9EVU1QCitGSUxFKiBmZER1bXAgPSBOVUxMOworI2VuZGlmCisKKworLyoKKyAqIFdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzIGZvciBXaW4zMiBvbiBVbml4LCB0aGVzZSBsaW5lcyBtYWtlIHRoZSBzeW50YXgKKyAqIGVycm9ycyBkaXNhcHBlYXIuICBUaGV5IGRvIG5vdCBuZWVkIHRvIGJlIGNvcnJlY3QuCisgKi8KKyNpZmRlZiBQUk9UTwordHlwZWRlZiBpbnQgSEFORExFOwordHlwZWRlZiBpbnQgU01BTExfUkVDVDsKK3R5cGVkZWYgaW50IENPT1JEOwordHlwZWRlZiBpbnQgU0hPUlQ7Cit0eXBlZGVmIGludCBXT1JEOwordHlwZWRlZiBpbnQgRFdPUkQ7Cit0eXBlZGVmIGludCBCT09MOwordHlwZWRlZiBpbnQgTFBTVFI7Cit0eXBlZGVmIGludCBMUFRTVFI7Cit0eXBlZGVmIGludCBLRVlfRVZFTlRfUkVDT1JEOwordHlwZWRlZiBpbnQgTU9VU0VfRVZFTlRfUkVDT1JEOworIyBkZWZpbmUgV0lOQVBJCit0eXBlZGVmIGludCBDT05TT0xFX0NVUlNPUl9JTkZPOwordHlwZWRlZiBjaGFyICogTFBDU1RSOworIyBkZWZpbmUgV0lOQkFTRUFQSQordHlwZWRlZiBpbnQgSU5QVVRfUkVDT1JEOworIyBkZWZpbmUgX2NkZWNsCisjZW5kaWYKKworI2lmZGVmIF9fQk9STEFORENfXworLyogYmVpbmcgYSBtb3JlIEFOU0kgY29tcGxpYW50IGNvbXBpbGVyLCBCb3JsYW5kQyBkb2Vzbid0IGRlZmluZSBfc3RyaWNvbGw6CisgKiBidXQgaXQgZG9lcyBpbiBCQyA1LjAyISAqLworIyBpZiBfX0JPUkxBTkRDX18gPCAweDUwMgoraW50IF9zdHJpY29sbChjaGFyICphLCBjaGFyICpiKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjcHJvdG8gZG9lc24ndCBjcmVhdGUgYSBwcm90b3R5cGUgZm9yIG1haW4oKSAqLworaW50IF9jZGVjbAorVmltTWFpbgorX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCAoX2NkZWNsICpwbWFpbikoaW50LCBjaGFyICoqKTsKKworI2lmbmRlZiBQUk9UTwordm9pZCBfY2RlY2wgU2F2ZUluc3QoSElOU1RBTkNFIGhJbnN0KTsKK3ZvaWQgKF9jZGVjbCAqcFNhdmVJbnN0KShISU5TVEFOQ0UpOworCitpbnQgV0lOQVBJCitXaW5NYWluKAorICAgIEhJTlNUQU5DRQloSW5zdGFuY2UsCisgICAgSElOU1RBTkNFCWhQcmV2SW5zdCwKKyAgICBMUFNUUglscHN6Q21kTGluZSwKKyAgICBpbnQJCW5DbWRTaG93KQoreworICAgIGludAkJYXJnYzsKKyAgICBjaGFyCSoqYXJndjsKKyAgICBjaGFyCSp0b2ZyZWU7CisgICAgY2hhcglwcm9nWzI1Nl07CisKKyAgICAvKgorICAgICAqIFJvbjogYWRkZWQgZnVsbCBwYXRoIG5hbWUgc28gdGhhdCB0aGUgJFZJTSB2YXJpYWJsZSB3aWxsIGdldCBzZXQgdG8gb3VyCisgICAgICogc3RhcnR1cCBwYXRoIChzbyB0aGUgLnZpbXJjIGZpbGUgY2FuIGJlIGZvdW5kIHcvbyBhIFZJTSBlbnYuIHZhci4pCisgICAgICogUmVtb3ZlIHRoZSAiLmV4ZSIgZXh0ZW5zaW9uLCBhbmQgZmluZCB0aGUgMXN0IG5vbi1zcGFjZS4KKyAgICAgKi8KKyAgICBHZXRNb2R1bGVGaWxlTmFtZShoSW5zdGFuY2UsIHByb2csIDI1NSk7CisgICAgaWYgKCpwcm9nICE9IE5VTCkKKwlleGVfbmFtZSA9IEZ1bGxOYW1lX3NhdmUoKGNoYXJfdSAqKXByb2csIEZBTFNFKTsKKworICAgIC8qIFNlcGFyYXRlIHRoZSBjb21tYW5kIGxpbmUgaW50byBhcmd1bWVudHMuICovCisgICAgYXJnYyA9IGdldF9jbWRfYXJncyhwcm9nLCAoY2hhciAqKWxwc3pDbWRMaW5lLCAmYXJndiwgJnRvZnJlZSk7CisgICAgaWYgKGFyZ2MgPT0gMCkKKyAgICB7CisJLyogRXJyb3IgbWVzc2FnZT8gKi8KKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBwU2F2ZUluc3QgPSBTYXZlSW5zdDsKKyAgICBwbWFpbiA9IFZpbU1haW47CisgICAgcFNhdmVJbnN0KGhJbnN0YW5jZSk7CisgICAgcG1haW4oYXJnYywgYXJndik7CisKKyAgICBmcmVlKGFyZ3YpOworICAgIGZyZWUodG9mcmVlKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKworCisKKworCisjaWZkZWYgRkVBVF9NT1VTRQorCisvKgorICogRm9yIHRoZSBHVUkgdGhlIG1vdXNlIGhhbmRsaW5nIGlzIGluIGd1aV93MzIuYy4KKyAqLworICAgIHZvaWQKK21jaF9zZXRtb3VzZSgKKyAgICBpbnQgb24pCit7Cit9CisjZW5kaWYgLyogRkVBVF9NT1VTRSAqLworCisKKworLyoKKyAqIEdVSSB2ZXJzaW9uIG9mIG1jaF9pbml0KCkuCisgKi8KKyAgICB2b2lkCittY2hfaW5pdCgpCit7CisgICAgZXh0ZXJuIGludCBfZm1vZGU7CisKKworICAgIC8qIExldCBjcml0aWNhbCBlcnJvcnMgcmVzdWx0IGluIGEgZmFpbHVyZSwgbm90IGluIGEgZGlhbG9nIGJveC4gIFJlcXVpcmVkCisgICAgICogZm9yIHRoZSB0aW1lc3RhbXAgdGVzdCB0byB3b3JrIG9uIHJlbW92ZWQgZmxvcHBpZXMuICovCisgICAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworCisgICAgX2Ztb2RlID0gT19CSU5BUlk7CQkvKiB3ZSBkbyBvdXIgb3duIENSLUxGIHRyYW5zbGF0aW9uICovCisKKyAgICAvKiBTcGVjaWZ5IHdpbmRvdyBzaXplLiAgSXMgdGhlcmUgYSBwbGFjZSB0byBnZXQgdGhlIGRlZmF1bHQgZnJvbT8gKi8KKyAgICBSb3dzID0gMjU7CisgICAgQ29sdW1ucyA9IDgwOworCisKKyAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikiZ3JlcHByZyIsIDAsIChjaGFyX3UgKikiZ3JlcCAtbiIsIDApOworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICBjbGlwX2luaXQoVFJVRSk7CisKKyAgICAvKgorICAgICAqIFZpbSdzIG93biBjbGlwYm9hcmQgZm9ybWF0IHJlY29nbmlzZXMgd2hldGhlciB0aGUgdGV4dCBpcyBjaGFyLCBsaW5lLAorICAgICAqIG9yIHJlY3Rhbmd1bGFyIGJsb2NrLiAgT25seSB1c2VmdWwgZm9yIGNvcHlpbmcgYmV0d2VlbiB0d28gVmltcy4KKyAgICAgKiAiVmltQ2xpcGJvYXJkIiB3YXMgdXNlZCBmb3IgcHJldmlvdXMgdmVyc2lvbnMsIHVzaW5nIHRoZSBmaXJzdAorICAgICAqIGNoYXJhY3RlciB0byBzcGVjaWZ5IE1DSEFSLCBNTElORSBvciBNQkxPQ0suCisgICAgICovCisgICAgY2xpcF9zdGFyLmZvcm1hdCA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KCJWaW1DbGlwYm9hcmQyIik7CisgICAgY2xpcF9zdGFyLmZvcm1hdF9yYXcgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdCgiVmltUmF3Qnl0ZXMiKTsKKyNlbmRpZgorfQorCisKKworLyoKKyAqIERvIHdlIGhhdmUgYW4gaW50ZXJhY3RpdmUgd2luZG93PworICovCisgICAgaW50CittY2hfY2hlY2tfd2luKAorICAgIGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICAgIGludAkJaTsKKworICAgIHJldHVybiBPSzsJICAgIC8qIEdVSSBhbHdheXMgaGFzIGEgdHR5ICovCit9CisKKworLyoKKyAqIHJldHVybiBwcm9jZXNzIElECisgKi8KKyAgICBsb25nCittY2hfZ2V0X3BpZCgpCit7CisgICAgcmV0dXJuIChsb25nKUdldEN1cnJlbnRUYXNrKCk7Cit9CisKKworLyoKKyAqIFNwZWNpYWxpc2VkIHZlcnNpb24gb2Ygc3lzdGVtKCkuCisgKiBUaGlzIHZlcnNpb24gcHJvY2VlZHMgYXMgZm9sbG93czoKKyAqICAgIDEuIFN0YXJ0IHRoZSBwcm9ncmFtIHdpdGggV2luRXhlYworICogICAgMi4gV2FpdCBmb3IgdGhlIG1vZHVsZSB1c2UgY291bnQgb2YgdGhlIHByb2dyYW0gdG8gZ28gdG8gMAorICoJIChUaGlzIGlzIHRoZSBiZXN0IHdheSBvZiBkZXRlY3RpbmcgdGhlIHByb2dyYW0gaGFzIGZpbmlzaGVkKQorICovCisKKyAgICBzdGF0aWMgaW50CittY2hfc3lzdGVtKGNoYXIgKmNtZCwgaW50IG9wdGlvbnMpCit7CisgICAgRFdPUkQJCXJldCA9IDA7CisgICAgVUlOVAkJd1Nob3dXaW5kb3c7CisgICAgVUlOVAkJaF9tb2R1bGU7CisgICAgTVNHCQkJbXNnOworICAgIEJPT0wJCWFnYWluID0gVFJVRTsKKworICAgIC8qCisgICAgICogSXQncyBuaWNlciB0byBydW4gYSBmaWx0ZXIgY29tbWFuZCBpbiBhIG1pbmltaXplZCB3aW5kb3csIGJ1dCBpbgorICAgICAqLworICAgIGlmIChvcHRpb25zICYgU0hFTExfRE9PVVQpCisJd1Nob3dXaW5kb3cgPSBTV19TSE9XTUlOSU1JWkVEOworICAgIGVsc2UKKwl3U2hvd1dpbmRvdyA9IFNXX1NIT1dOT1JNQUw7CisKKyAgICAvKiBOb3csIHJ1biB0aGUgY29tbWFuZCAqLworICAgIGhfbW9kdWxlID0gV2luRXhlYygoTFBDU1RSKWNtZCwgd1Nob3dXaW5kb3cpOworCisgICAgaWYgKGhfbW9kdWxlIDwgMzIpCisgICAgeworCS8qZXJyb3IqLworCXJldCA9IC1oX21vZHVsZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byB0ZXJtaW5hdGUgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwl3aGlsZSAoR2V0TW9kdWxlVXNhZ2UoKEhJTlNUQU5DRSloX21vZHVsZSkgPiAwICYmIGFnYWluICkKKwl7CisJICAgIHdoaWxlKCBQZWVrTWVzc2FnZSggJm1zZywgTlVMTCwgMCwgMCwgUE1fUkVNT1ZFICkgJiYgYWdhaW4gKQorCSAgICB7CisJCWlmKG1zZy5tZXNzYWdlID09IFdNX1FVSVQpCisKKwkJeworCQkgICAgUG9zdFF1aXRNZXNzYWdlKG1zZy53UGFyYW0pOworCQkgICAgYWdhaW4gPSBGQUxTRTsKKwkJfQorCQlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEVpdGhlciBleGVjdXRlIGEgY29tbWFuZCBieSBjYWxsaW5nIHRoZSBzaGVsbCBvciBzdGFydCBhIG5ldyBzaGVsbAorICovCisgICAgaW50CittY2hfY2FsbF9zaGVsbCgKKyAgICBjaGFyX3UgKmNtZCwKKyAgICBpbnQgb3B0aW9ucykJICAgIC8qIFNIRUxMXywgc2VlIHZpbS5oICovCit7CisgICAgaW50CQl4OworICAgIGludAkJdG1vZGUgPSBjdXJfdG1vZGU7CisKKyAgICBvdXRfZmx1c2goKTsKKworCisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKKyAgICBpZiAoZmREdW1wKQorICAgIHsKKwlmcHJpbnRmKGZkRHVtcCwgIm1jaF9jYWxsX3NoZWxsKFwiJXNcIiwgJWQpXG4iLCBjbWQsIG9wdGlvbnMpOworCWZmbHVzaChmZER1bXApOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDYXRjaCBhbGwgZGVhZGx5IHNpZ25hbHMgd2hpbGUgcnVubmluZyB0aGUgZXh0ZXJuYWwgY29tbWFuZCwgYmVjYXVzZSBhCisgICAgICogQ1RSTC1DLCBDdHJsLUJyZWFrIG9yIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gIG1pZ2h0IG90aGVyd2lzZSBraWxsIHVzLgorICAgICAqLworICAgIHNpZ25hbChTSUdJTlQsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdJTEwsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdGUEUsIFNJR19JR04pOworICAgIHNpZ25hbChTSUdTRUdWLCBTSUdfSUdOKTsKKyAgICBzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7CisgICAgc2lnbmFsKFNJR0FCUlQsIFNJR19JR04pOworCisgICAgaWYgKG9wdGlvbnMgJiBTSEVMTF9DT09LRUQpCisJc2V0dG1vZGUoVE1PREVfQ09PSyk7CS8qIHNldCB0byBub3JtYWwgbW9kZSAqLworCisgICAgaWYgKGNtZCA9PSBOVUxMKQorICAgIHsKKwl4ID0gbWNoX3N5c3RlbShwX3NoLCBvcHRpb25zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiB3ZSB1c2UgImNvbW1hbmQiIG9yICJjbWQiIHRvIHN0YXJ0IHRoZSBzaGVsbDsgc2xvdyBidXQgZWFzeSAqLworCWNoYXJfdSAqbmV3Y21kOworCisJbmV3Y21kID0gbGFsbG9jKAorCQlTVFJMRU4ocF9zaCkgKyBTVFJMRU4ocF9zaGNmKSArIFNUUkxFTihjbWQpICsgMTAsIFRSVUUpOworCWlmIChuZXdjbWQgIT0gTlVMTCkKKwl7CisJICAgIGlmIChTVFJOSUNNUChjbWQsICJzdGFydCAiLCA2KSA9PSAwKQorCSAgICB7CisJCXNwcmludGYoKGNoYXIgKiluZXdjbWQsICIlc1wwIiwgY21kKzYpOworCQlpZiAoV2luRXhlYygoTFBDU1RSKW5ld2NtZCwgU1dfU0hPV05PUk1BTCkgPiAzMSkKKwkJICAgIHggPSAwOworCQllbHNlCisJCSAgICB4ID0gLTE7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXNwcmludGYoKGNoYXIgKiluZXdjbWQsICIlcyVzICVzICVzIiwKKwkJCSIiLAorCQkJcF9zaCwKKwkJCXBfc2hjZiwKKwkJCWNtZCk7CisJCXggPSBtY2hfc3lzdGVtKChjaGFyICopbmV3Y21kLCBvcHRpb25zKTsKKwkgICAgfQorCSAgICB2aW1fZnJlZShuZXdjbWQpOworCX0KKyAgICB9CisKKyAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorCXNldHRtb2RlKFRNT0RFX1JBVyk7CS8qIHNldCB0byByYXcgbW9kZSAqLworCisgICAgaWYgKHggJiYgIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSAmJiAhZW1zZ19zaWxlbnQpCisgICAgeworCXNtc2coXygic2hlbGwgcmV0dXJuZWQgJWQiKSwgeCk7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisgICAgfQorI2lmZGVmIEZFQVRfVElUTEUKKyAgICByZXNldHRpdGxlKCk7CisjZW5kaWYKKworICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdJTEwsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdTRUdWLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOworCisKKyAgICByZXR1cm4geDsKK30KKworCisvKgorICogRGVsYXkgZm9yIGhhbGYgYSBzZWNvbmQuCisgKi8KKyAgICB2b2lkCittY2hfZGVsYXkoCisgICAgbG9uZyAgICBtc2VjLAorICAgIGludAkgICAgaWdub3JlaW5wdXQpCit7CisjaWZkZWYgTVVTVF9GSVgKKyAgICBTbGVlcCgoaW50KW1zZWMpOwkgICAgLyogbmV2ZXIgd2FpdCBmb3IgaW5wdXQgKi8KKyNlbmRpZgorfQorCisKKy8qCisgKiBjaGVjayBmb3IgYW4gImludGVycnVwdCBzaWduYWwiOiBDVFJMLWJyZWFrIG9yIENUUkwtQworICovCisgICAgdm9pZAorbWNoX2JyZWFrY2hlY2soKQoreworICAgIC8qIG5ldmVyIHVzZWQgKi8KK30KKworCisvKgorICogSG93IG11Y2ggbWVtb3J5IGlzIGF2YWlsYWJsZT8KKyAqLworICAgIGxvbmdfdQorbWNoX2F2YWlsX21lbSgKKyAgICBpbnQgc3BlY2lhbCkKK3sKKyAgICByZXR1cm4gR2V0RnJlZVNwYWNlKDApOworfQorCisKKy8qCisgKiBMaWtlIHJlbmFtZSgpLCByZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBub24temVybyB1cG9uIGZhaWx1cmUuCisgKiBTaG91bGQgcHJvYmFibHkgc2V0IGVycm5vIGFwcHJvcHJpYXRlbHkgd2hlbiBlcnJvcnMgb2NjdXIuCisgKi8KKyAgICBpbnQKK21jaF9yZW5hbWUoCisgICAgY29uc3QgY2hhcgkqcHN6T2xkRmlsZSwKKyAgICBjb25zdCBjaGFyCSpwc3pOZXdGaWxlKQoreworCisgICAgLyoKKyAgICAgKiBObyBuZWVkIHRvIHBsYXkgdHJpY2tzLCB0aGlzIGlzbid0IHJ1YmJpc2ggbGlrZSBXaW5kb3dzIDk1IDxnPgorICAgICAqLworICAgIHJldHVybiByZW5hbWUocHN6T2xkRmlsZSwgcHN6TmV3RmlsZSk7CisKK30KKworLyoKKyAqIEdldCB0aGUgZGVmYXVsdCBzaGVsbCBmb3IgdGhlIGN1cnJlbnQgaGFyZHdhcmUgcGxhdGZvcm0KKyAqLworICAgIGNoYXIqCitkZWZhdWx0X3NoZWxsKCkKK3sKKyAgICBjaGFyKiBwc3ogPSBOVUxMOworCisgICAgcHN6ID0gImNvbW1hbmQuY29tIjsKKworICAgIHJldHVybiBwc3o7Cit9CmRpZmYgLS1naXQgYS9zcmMvb3Nfd2luMTYuaCBiL3NyYy9vc193aW4xNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjU4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvb3Nfd2luMTYuaApAQCAtMCwwICsxLDE0MiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIFdpbjE2IChXaW5kb3dzIDMuMXgpIG1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncy4KKyAqLworCisjaW5jbHVkZSAib3NfZG9zLmgiCQkvKiBjb21tb24gTVMtRE9TIGFuZCBXaW5kb3dzIHN0dWZmICovCisKKyNkZWZpbmUgQklOQVJZX0ZJTEVfSU8KKyNkZWZpbmUgVVNFX0VYRV9OQU1FCQkvKiB1c2UgYXJndlswXSBmb3IgJFZJTSAqLworI2RlZmluZSBOT19DT09LRURfSU5QVVQJCS8qIG1jaF9pbmNoYXIoKSBkb2Vzbid0IHJldHVybiB3aG9sZSBsaW5lcyAqLworI2RlZmluZSBTWU5DX0RVUF9DTE9TRQkJLyogc3luYygpIGEgZmlsZSB3aXRoIGR1cCgpIGFuZCBjbG9zZSgpICovCisjZGVmaW5lIFVTRV9URVJNX0NPTlNPTEUKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSAorI2RlZmluZSBIQVZFX1NUUkNTUE4KKyNkZWZpbmUgSEFWRV9TVFJJQ01QCisjZGVmaW5lIEhBVkVfU1RSTklDTVAKKyNkZWZpbmUgSEFWRV9TVFJGVElNRQkJLyogZ3Vlc3NlZCAqLworI2RlZmluZSBIQVZFX01FTVNFVAorI2RlZmluZSBVU0VfVE1QTkFNCQkvKiB1c2UgdG1wbmFtKCkgaW5zdGVhZCBvZiBta3RlbXAoKSAqLworI2RlZmluZSBIQVZFX0xPQ0FMRV9ICisjZGVmaW5lIEhBVkVfRkNOVExfSAorI2RlZmluZSBIQVZFX1FTT1JUCisjZGVmaW5lIEhBVkVfU1RfTU9ERQkJLyogaGF2ZSBzdGF0LnN0X21vZGUgKi8KKy8vI2RlZmluZSBVU0VfRk5BTUVfQ0FTRQkvKiBhZGp1c3QgY2FzZSBvZiBmaWxlIG5hbWVzICovCisjaWZuZGVmIEZFQVRfQ0xJUEJPQVJECisjIGRlZmluZSBGRUFUX0NMSVBCT0FSRAkJLyogaW5jbHVkZSBjbGlwYm9hcmQgc3VwcG9ydCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChfX0RBVEVfXykgJiYgZGVmaW5lZChfX1RJTUVfXykKKyMgZGVmaW5lIEhBVkVfREFURV9USU1FCisjZW5kaWYKKyNkZWZpbmUgSEFWRV9BVkFJTF9NRU0KKworI2RlZmluZSBTSE9SVF9GTkFNRQkJLyogYWx3YXlzIDguMyBmaWxlIG5hbWUgKi8KKworI2RlZmluZSBTTUFMTF9NQUxMT0MJCS8qIDE2IGJpdCBzdG9yYWdlIGFsbG9jYXRpb24gKi8KKworI2lmZGVmIF9fQk9STEFORENfXworIyBkZWZpbmUgSEFWRV9QVVRFTlYJCS8qIGF0IGxlYXN0IEJjYyA1LjIgaGFzIGl0ICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJX1cxNgorIyBkZWZpbmUgTk9fQ09OU09MRQkJLyogZG9uJ3QgaW5jbHVkZWQgY29uc29sZS1vbmx5IGNvZGUgKi8KKyNlbmRpZgorCisvKiB0b3VwcGVyKCkgaXMgbm90IHJlYWxseSBicm9rZW4sIGJ1dCBpdCdzIHZlcnkgc2xvdy4JUHJvYmFibHkgYmVjYXVzZSBvZgorICogdXNpbmcgdW5pY2RlIGNoYXJhY3RlcnMgb24gV2luZG93cyBOVCAqLworI2RlZmluZSBCUk9LRU5fVE9VUFBFUgorCisjZGVmaW5lIEZOQU1FX0lMTEVHQUwgIlwiKj8+PHwiIC8qIGlsbGVnYWwgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZSAqLworCisjaWZuZGVmIFNJWkVPRl9JTlQKKyMgZGVmaW5lIFNJWkVPRl9JTlQgMgorI2VuZGlmCisKK3R5cGVkZWYgbG9uZyBvZmZfdDsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxkb3MuaD4KKyNpbmNsdWRlIDxkaXIuaD4KKworI2lmbmRlZiBTVFJJQ1QKKyMgZGVmaW5lIFNUUklDVAorI2VuZGlmCisjaWZuZGVmIENPQkpNQUNST1MKKyMgZGVmaW5lIENPQkpNQUNST1MJLyogRm9yIE9MRTogRW5hYmxlICJmcmllbmRsaWVyIiBhY2Nlc3MgdG8gb2JqZWN0cyAqLworI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKgorICogIHBsZW50eSBvZiBtZW1vcnksIHVzZSBsYXJnZSBidWZmZXJzCisgKi8KKyNkZWZpbmUgQ01EQlVGRlNJWkUgMTAyNAkvKiBzaXplIG9mIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcgYnVmZmVyICovCisKKworI2RlZmluZSBCQVNFTkFNRUxFTgkoTUFYUEFUSEwtNSkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZSBuYW1lICovCisKKyNpZm5kZWYgREZMVF9NQVhNRU0KKyMgZGVmaW5lIERGTFRfTUFYTUVNCSgyNTYpICAgIC8qIHVzZSB1cCB0byAyNTZLIGZvciBhIGJ1ZmZlciovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX01BWE1FTVRPVAorIyBkZWZpbmUgREZMVF9NQVhNRU1UT1QJKDUqMTAyNCkgICAgLyogdXNlIHVwIHRvIDUgTWJ5dGUgZm9yIFZpbSAqLworI2VuZGlmCisKKy8qCisgKiBTb21lIHNpbXBsZSBkZWJ1Z2dpbmcgbWFjcm9zIHRoYXQgbG9vayBhbmQgYmVoYXZlIGEgbG90IGxpa2UgdGhlaXIKKyAqIG5hbWVzYWtlcyBpbiBNRkMuCisgKi8KKworI2lmZGVmIF9ERUJVRworCisjIGlmIGRlZmluZWQoX01TQ19WRVIpCSYmICAoX01TQ19WRVIgPj0gMTAwMCkKKyAgIC8qIFVzZSB0aGUgbmV3IGRlYnVnZ2luZyB0b29scyBpbiBWaXN1YWwgQysrIDQueCAqLworIyAgaW5jbHVkZSA8Y3J0ZGJnLmg+CisjICBkZWZpbmUgQVNTRVJUKGYpIF9BU1NFUlQoZikKKyMgZWxzZQorIyAgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjICBkZWZpbmUgQVNTRVJUKGYpIGFzc2VydChmKQorIyBlbmRpZgorCisjIGRlZmluZSBWRVJJRlkoZikJCUFTU0VSVChmKQorIyBkZWZpbmUgREVCVUdfT05MWShmKQkJKGYpCisjIGRlZmluZSBUUkFDRQkJCVRyYWNlCisjIGRlZmluZSBUUkFDRTAoc3opCQlUcmFjZShfVCgiJXMiKSwgX1Qoc3opKQorIyBkZWZpbmUgVFJBQ0UxKHN6LCBwMSkJCVRyYWNlKF9UKHN6KSwgcDEpCisjIGRlZmluZSBUUkFDRTIoc3osIHAxLCBwMikJVHJhY2UoX1Qoc3opLCBwMSwgcDIpCisjIGRlZmluZSBUUkFDRTMoc3osIHAxLCBwMiwgcDMpIFRyYWNlKF9UKHN6KSwgcDEsIHAyLCBwMykKKworLyogSW4gZGVidWcgdmVyc2lvbiwgd3JpdGVzIHRyYWNlIG1lc3NhZ2VzIHRvIGRlYnVnIHN0cmVhbSAqLwordm9pZCBfX2NkZWNsCitUcmFjZShjaGFyICpwc3pGb3JtYXQsIC4uLik7CisKKyNlbHNlIC8qICFfREVCVUcgKi8KKworICAvKiBUaGVzZSBtYWNyb3Mgc2hvdWxkIGFsbCBjb21waWxlIGF3YXkgdG8gbm90aGluZyAqLworIyBkZWZpbmUgQVNTRVJUKGYpCQkoKHZvaWQpMCkKKyMgZGVmaW5lIFZFUklGWShmKQkJKCh2b2lkKWYpCisjIGRlZmluZSBERUJVR19PTkxZKGYpCQkoKHZvaWQpMCkKKyMgZGVmaW5lIFRSQUNFCQkJMSA/ICh2b2lkKTAgOiBwcmludGYKKyMgZGVmaW5lIFRSQUNFMChzeikKKyMgZGVmaW5lIFRSQUNFMShzeiwgcDEpCisjIGRlZmluZSBUUkFDRTIoc3osIHAxLCBwMikKKyMgZGVmaW5lIFRSQUNFMyhzeiwgcDEsIHAyLCBwMykKKworI2VuZGlmIC8qICFfREVCVUcgKi8KKworCisjZGVmaW5lIEFTU0VSVF9QT0lOVEVSKHAsIHR5cGUpIFwKKyAgICBBU1NFUlQoKChwKSAhPSBOVUxMKSAgJiYgIElzVmFsaWRBZGRyZXNzKChwKSwgc2l6ZW9mKHR5cGUpLCBGQUxTRSkpCisKKyNkZWZpbmUgQVNTRVJUX05VTExfT1JfUE9JTlRFUihwLCB0eXBlKSBcCisgICAgQVNTRVJUKCgocCkgPT0gTlVMTCkgIHx8ICBJc1ZhbGlkQWRkcmVzcygocCksIHNpemVvZih0eXBlKSwgRkFMU0UpKQorCisjZGVmaW5lIG1jaF9zZXRlbnYobmFtZSwgdmFsLCB4KSBzZXRlbnYobmFtZSwgdmFsLCB4KQpkaWZmIC0tZ2l0IGEvc3JjL29zX3dpbjMyLmMgYi9zcmMvb3Nfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI4OTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zX3dpbjMyLmMKQEAgLTAsMCArMSw0NzkwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisvKgorICogb3Nfd2luMzIuYworICoKKyAqIFVzZWQgZm9yIGJvdGggdGhlIGNvbnNvbGUgdmVyc2lvbiBhbmQgdGhlIFdpbjMyIEdVSS4gIEEgbG90IG9mIGNvZGUgaXMgZm9yCisgKiB0aGUgY29uc29sZSB2ZXJzaW9uIG9ubHksIHNvIHRoZXJlIGlzIGEgbG90IG9mICIjaWZuZGVmIEZFQVRfR1VJX1czMiIuCisgKgorICogV2luMzIgKFdpbmRvd3MgTlQgYW5kIFdpbmRvd3MgOTUpIHN5c3RlbS1kZXBlbmRlbnQgcm91dGluZXMuCisgKiBQb3J0aW9ucyBsaWZ0ZWQgZnJvbSB0aGUgV2luMzIgU0RLIHNhbXBsZXMsIHRoZSBNU0RPUy1kZXBlbmRlbnQgY29kZSwKKyAqIE5ldEhhY2sgMy4xLjMsIEdOVSBFbWFjcyAxOS4zMCwgYW5kIFZpbGUgNS41LgorICoKKyAqIEdlb3JnZSBWLiBSZWlsbHkgPGdlb3JnZUByZWlsbHkub3JnPiB3cm90ZSBtb3N0IG9mIHRoaXMuCisgKiBSb2dlciBLbm9iYmUgPHJvZ2Vya0B3b25kZXJ3YXJlLmNvbT4gZGlkIHRoZSBpbml0aWFsIHBvcnQgb2YgVmltIDMuMC4KKyAqLworCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKyN1bmRlZiBjaGRpcgorI2lmZGVmIF9fR05VQ19fCisjIGlmbmRlZiBfX01JTkdXMzJfXworIyAgaW5jbHVkZSA8ZGlyZW50Lmg+CisjIGVuZGlmCisjZWxzZQorIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1RJVExFKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCisjIGluY2x1ZGUgPHNoZWxsYXBpLmg+CisjZW5kaWYKKworI2lmZGVmIF9fTUlOR1czMl9fCisjIGlmbmRlZiBGUk9NX0xFRlRfMVNUX0JVVFRPTl9QUkVTU0VECisjICBkZWZpbmUgRlJPTV9MRUZUXzFTVF9CVVRUT05fUFJFU1NFRCAgICAweDAwMDEKKyMgZW5kaWYKKyMgaWZuZGVmIFJJR0hUTU9TVF9CVVRUT05fUFJFU1NFRAorIyAgZGVmaW5lIFJJR0hUTU9TVF9CVVRUT05fUFJFU1NFRAkgIDB4MDAwMgorIyBlbmRpZgorIyBpZm5kZWYgRlJPTV9MRUZUXzJORF9CVVRUT05fUFJFU1NFRAorIyAgZGVmaW5lIEZST01fTEVGVF8yTkRfQlVUVE9OX1BSRVNTRUQgICAgMHgwMDA0CisjIGVuZGlmCisjIGlmbmRlZiBGUk9NX0xFRlRfM1JEX0JVVFRPTl9QUkVTU0VECisjICBkZWZpbmUgRlJPTV9MRUZUXzNSRF9CVVRUT05fUFJFU1NFRCAgICAweDAwMDgKKyMgZW5kaWYKKyMgaWZuZGVmIEZST01fTEVGVF80VEhfQlVUVE9OX1BSRVNTRUQKKyMgIGRlZmluZSBGUk9NX0xFRlRfNFRIX0JVVFRPTl9QUkVTU0VEICAgIDB4MDAxMAorIyBlbmRpZgorCisvKgorICogRXZlbnRGbGFncworICovCisjIGlmbmRlZiBNT1VTRV9NT1ZFRAorIyAgZGVmaW5lIE1PVVNFX01PVkVEICAgMHgwMDAxCisjIGVuZGlmCisjIGlmbmRlZiBET1VCTEVfQ0xJQ0sKKyMgIGRlZmluZSBET1VCTEVfQ0xJQ0sgIDB4MDAwMgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFJlY29yZCBhbGwgb3V0cHV0IGFuZCBhbGwga2V5Ym9hcmQgJiBtb3VzZSBpbnB1dCAqLworLyogI2RlZmluZSBNQ0hfV1JJVEVfRFVNUCAqLworCisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKK0ZJTEUqIGZkRHVtcCA9IE5VTEw7CisjZW5kaWYKKworLyoKKyAqIFdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzIGZvciBXaW4zMiBvbiBVbml4LCB0aGVzZSBsaW5lcyBtYWtlIHRoZSBzeW50YXgKKyAqIGVycm9ycyBkaXNhcHBlYXIuICBUaGV5IGRvIG5vdCBuZWVkIHRvIGJlIGNvcnJlY3QuCisgKi8KKyNpZmRlZiBQUk9UTworI2RlZmluZSBXSU5BUEkKKyNkZWZpbmUgV0lOQkFTRUFQSQordHlwZWRlZiBjaGFyICogTFBDU1RSOwordHlwZWRlZiBpbnQgQUNDRVNTX01BU0s7Cit0eXBlZGVmIGludCBCT09MOwordHlwZWRlZiBpbnQgQ09MT1JSRUY7Cit0eXBlZGVmIGludCBDT05TT0xFX0NVUlNPUl9JTkZPOwordHlwZWRlZiBpbnQgQ09PUkQ7Cit0eXBlZGVmIGludCBEV09SRDsKK3R5cGVkZWYgaW50IEhBTkRMRTsKK3R5cGVkZWYgaW50IEhEQzsKK3R5cGVkZWYgaW50IEhGT05UOwordHlwZWRlZiBpbnQgSElDT047Cit0eXBlZGVmIGludCBISU5TVEFOQ0U7Cit0eXBlZGVmIGludCBIV05EOwordHlwZWRlZiBpbnQgSU5QVVRfUkVDT1JEOwordHlwZWRlZiBpbnQgS0VZX0VWRU5UX1JFQ09SRDsKK3R5cGVkZWYgaW50IExPR0ZPTlQ7Cit0eXBlZGVmIGludCBMUEJPT0w7Cit0eXBlZGVmIGludCBMUENUU1RSOwordHlwZWRlZiBpbnQgTFBEV09SRDsKK3R5cGVkZWYgaW50IExQU1RSOwordHlwZWRlZiBpbnQgTFBUU1RSOwordHlwZWRlZiBpbnQgTFBWT0lEOwordHlwZWRlZiBpbnQgTU9VU0VfRVZFTlRfUkVDT1JEOwordHlwZWRlZiBpbnQgUEFDTDsKK3R5cGVkZWYgaW50IFBEV09SRDsKK3R5cGVkZWYgaW50IFBIQU5ETEU7Cit0eXBlZGVmIGludCBQUklOVERMRzsKK3R5cGVkZWYgaW50IFBTRUNVUklUWV9ERVNDUklQVE9SOwordHlwZWRlZiBpbnQgUFNJRDsKK3R5cGVkZWYgaW50IFNFQ1VSSVRZX0lORk9STUFUSU9OOwordHlwZWRlZiBpbnQgU0hPUlQ7Cit0eXBlZGVmIGludCBTTUFMTF9SRUNUOwordHlwZWRlZiBpbnQgVEVYVE1FVFJJQzsKK3R5cGVkZWYgaW50IFRPS0VOX0lORk9STUFUSU9OX0NMQVNTOwordHlwZWRlZiBpbnQgVFJVU1RFRTsKK3R5cGVkZWYgaW50IFdPUkQ7Cit0eXBlZGVmIGludCBXQ0hBUjsKK3R5cGVkZWYgdm9pZCBWT0lEOworI2VuZGlmCisKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCisvKiBVbmRvY3VtZW50ZWQgQVBJIGluIGtlcm5lbDMyLmRsbCBuZWVkZWQgdG8gd29yayBhcm91bmQgZGVhZCBrZXkgYnVnIGluCisgKiBjb25zb2xlLW1vZGUgYXBwbGljYXRpb25zIGluIE5UIDQuMC4gIElmIHlvdSBzd2l0Y2gga2V5Ym9hcmQgbGF5b3V0cworICogaW4gYSBjb25zb2xlIGFwcCB0byBhIGxheW91dCB0aGF0IGluY2x1ZGVzIGRlYWQga2V5cyBhbmQgdGhlbiBoaXQgYQorICogZGVhZCBrZXksIGEgY2FsbCB0byBUb0FzY2lpIHdpbGwgdHJhc2ggdGhlIHN0YWNrLiAgTXkgdGhhbmtzIHRvIElhbiBKYW1lcworICogYW5kIE1pY2hhZWwgRGlldHJpY2ggZm9yIGhlbHBpbmcgbWUgZmlndXJlIG91dCB0aGlzIHdvcmthcm91bmQuCisgKi8KKworLyogV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBHZXRDb25zb2xlS2V5Ym9hcmRMYXlvdXROYW1lQShMUFNUUik7ICovCisjaWZuZGVmIFdJTkJBU0VBUEkKKyMgZGVmaW5lIFdJTkJBU0VBUEkgX19zdGRjYWxsCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykKK3R5cGVkZWYgQk9PTCAoX19zdGRjYWxsICpQRk5HQ0tMTikoTFBTVFIpOworI2Vsc2UKK3R5cGVkZWYgV0lOQkFTRUFQSSBCT09MIChXSU5BUEkgKlBGTkdDS0xOKShMUFNUUik7CisjZW5kaWYKK1BGTkdDS0xOICAgIHNfcGZuR2V0Q29uc29sZUtleWJvYXJkTGF5b3V0TmFtZSA9IE5VTEw7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorLyogU3RyYW5nZWx5IEJvcmxhbmQgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lLiAqLworIyBkZWZpbmUgd2NzaWNtcChhLCBiKSB3Y3NjbXBpKChhKSwgKGIpKQorI2VuZGlmCisKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCisvKiBXaW4zMiBDb25zb2xlIGhhbmRsZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQgKi8KK3N0YXRpYyBIQU5ETEUgZ19oQ29uSW4gID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CitzdGF0aWMgSEFORExFIGdfaENvbk91dCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCisvKiBXaW4zMiBTY3JlZW4gYnVmZmVyLGNvb3JkaW5hdGUsY29uc29sZSBJL08gaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBTTUFMTF9SRUNUIGdfc3JTY3JvbGxSZWdpb247CitzdGF0aWMgQ09PUkQJICBnX2Nvb3JkOyAgLyogMC1iYXNlZCwgYnV0IGV4dGVybmFsIGNvb3JkcyBhcmUgMS1iYXNlZCAqLworCisvKiBUaGUgYXR0cmlidXRlIG9mIHRoZSBzY3JlZW4gd2hlbiB0aGUgZWRpdG9yIHdhcyBzdGFydGVkICovCitzdGF0aWMgV09SRCAgZ19hdHRyRGVmYXVsdCA9IDc7ICAvKiBsaWdodGdyYXkgdGV4dCBvbiBibGFjayBiYWNrZ3JvdW5kICovCitzdGF0aWMgV09SRCAgZ19hdHRyQ3VycmVudDsKKworc3RhdGljIGludCBnX2ZDQnJrUHJlc3NlZCA9IEZBTFNFOyAgLyogc2V0IGJ5IGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCitzdGF0aWMgaW50IGdfZkN0cmxDUHJlc3NlZCA9IEZBTFNFOyAvKiBzZXQgd2hlbiBjdHJsLUMgb3IgY3RybC1icmVhayBkZXRlY3RlZCAqLworc3RhdGljIGludCBnX2ZGb3JjZUV4aXQgPSBGQUxTRTsgICAgLyogc2V0IHdoZW4gZm9yY2VmdWxseSBleGl0aW5nICovCisKK3N0YXRpYyB2b2lkIHRlcm1jYXBfbW9kZV9zdGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHRlcm1jYXBfbW9kZV9lbmQodm9pZCk7CitzdGF0aWMgdm9pZCBjbGVhcl9jaGFycyhDT09SRCBjb29yZCwgRFdPUkQgbik7CitzdGF0aWMgdm9pZCBjbGVhcl9zY3JlZW4odm9pZCk7CitzdGF0aWMgdm9pZCBjbGVhcl90b19lbmRfb2ZfZGlzcGxheSh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3RvX2VuZF9vZl9saW5lKHZvaWQpOworc3RhdGljIHZvaWQgc2Nyb2xsKHVuc2lnbmVkIGNMaW5lcyk7CitzdGF0aWMgdm9pZCBzZXRfc2Nyb2xsX3JlZ2lvbih1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCB0b3AsCisJCQkgICAgICB1bnNpZ25lZCByaWdodCwgdW5zaWduZWQgYm90dG9tKTsKK3N0YXRpYyB2b2lkIGluc2VydF9saW5lcyh1bnNpZ25lZCBjTGluZXMpOworc3RhdGljIHZvaWQgZGVsZXRlX2xpbmVzKHVuc2lnbmVkIGNMaW5lcyk7CitzdGF0aWMgdm9pZCBnb3RveHkodW5zaWduZWQgeCwgdW5zaWduZWQgeSk7CitzdGF0aWMgdm9pZCBub3JtdmlkZW8odm9pZCk7CitzdGF0aWMgdm9pZCB0ZXh0YXR0cihXT1JEIHdBdHRyKTsKK3N0YXRpYyB2b2lkIHRleHRjb2xvcihXT1JEIHdBdHRyKTsKK3N0YXRpYyB2b2lkIHRleHRiYWNrZ3JvdW5kKFdPUkQgd0F0dHIpOworc3RhdGljIHZvaWQgc3RhbmRvdXQodm9pZCk7CitzdGF0aWMgdm9pZCBzdGFuZGVuZCh2b2lkKTsKK3N0YXRpYyB2b2lkIHZpc3VhbF9iZWxsKHZvaWQpOworc3RhdGljIHZvaWQgY3Vyc29yX3Zpc2libGUoQk9PTCBmVmlzaWJsZSk7CitzdGF0aWMgQk9PTCB3cml0ZV9jaGFycyhMUENTVFIgcGNoQnVmLCBEV09SRCBjY2hUb1dyaXRlKTsKK3N0YXRpYyBjaGFyX3UgdGdldGNoKGludCAqcG1vZGlmaWVycywgY2hhcl91ICpwY2gyKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9jb25pbih2b2lkKTsKK3N0YXRpYyBpbnQgc19jdXJzb3JfdmlzaWJsZSA9IFRSVUU7CitzdGF0aWMgaW50IGRpZF9jcmVhdGVfY29uaW4gPSBGQUxTRTsKKyNlbHNlCitzdGF0aWMgaW50IHNfZG9udF91c2VfdmltcnVuID0gVFJVRTsKK3N0YXRpYyBpbnQgbmVlZF92aW1ydW5fd2FybmluZyA9IEZBTFNFOworc3RhdGljIGNoYXIgKnZpbXJ1bl9wYXRoID0gInZpbXJ1biAiOworI2VuZGlmCisKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCitzdGF0aWMgaW50IHN1cHByZXNzX3dpbnNpemUgPSAxOwkvKiBkb24ndCBmaWRkbGUgd2l0aCBjb25zb2xlICovCisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCitnZXRfZXhlX25hbWUodm9pZCkKK3sKKyAgICBjaGFyCXRlbXBbMjU2XTsKKworICAgIGlmIChleGVfbmFtZSA9PSBOVUxMKQorICAgIHsKKwkvKiBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSwgbWF5IGJlIHVzZWQgZm9yICRWSU0gKi8KKwlHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCB0ZW1wLCAyNTUpOworCWlmICgqdGVtcCAhPSBOVUwpCisJICAgIGV4ZV9uYW1lID0gRnVsbE5hbWVfc2F2ZSgoY2hhcl91ICopdGVtcCwgRkFMU0UpOworICAgIH0KK30KKworI2lmIGRlZmluZWQoRFlOQU1JQ19HRVRURVhUKSB8fCBkZWZpbmVkKFBST1RPKQorIyBpZm5kZWYgR0VUVEVYVF9ETEwKKyMgIGRlZmluZSBHRVRURVhUX0RMTCAibGliaW50bC5kbGwiCisjIGVuZGlmCisvKiBEdW1teSBmdW5jaXRvbnMgKi8KK3N0YXRpYyBjaGFyKiBudWxsX2xpYmludGxfZ2V0dGV4dChjb25zdCBjaGFyICopOworc3RhdGljIGNoYXIqIG51bGxfbGliaW50bF90ZXh0ZG9tYWluKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgY2hhciogbnVsbF9saWJpbnRsX2JpbmR0ZXh0ZG9tYWluKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworc3RhdGljIEhJTlNUQU5DRSBoTGliaW50bERMTCA9IDA7CitjaGFyKiAoKmR5bl9saWJpbnRsX2dldHRleHQpKGNvbnN0IGNoYXIgKikgPSBudWxsX2xpYmludGxfZ2V0dGV4dDsKK2NoYXIqICgqZHluX2xpYmludGxfdGV4dGRvbWFpbikoY29uc3QgY2hhciAqKSA9IG51bGxfbGliaW50bF90ZXh0ZG9tYWluOworY2hhciogKCpkeW5fbGliaW50bF9iaW5kdGV4dGRvbWFpbikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopCisJCQkJCQk9IG51bGxfbGliaW50bF9iaW5kdGV4dGRvbWFpbjsKKworICAgIGludAorZHluX2xpYmludGxfaW5pdChjaGFyICpsaWJuYW1lKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBzdHJ1Y3QKKyAgICB7CisJY2hhcgkgICAgKm5hbWU7CisJRkFSUFJPQwkgICAgKnB0cjsKKyAgICB9IGxpYmludGxfZW50cnlbXSA9CisgICAgeworCXsiZ2V0dGV4dCIsIChGQVJQUk9DKikmZHluX2xpYmludGxfZ2V0dGV4dH0sCisJeyJ0ZXh0ZG9tYWluIiwgKEZBUlBST0MqKSZkeW5fbGliaW50bF90ZXh0ZG9tYWlufSwKKwl7ImJpbmR0ZXh0ZG9tYWluIiwgKEZBUlBST0MqKSZkeW5fbGliaW50bF9iaW5kdGV4dGRvbWFpbn0sCisJe05VTEwsIE5VTEx9CisgICAgfTsKKworICAgIC8qIE5vIG5lZWQgdG8gaW5pdGlhbGl6ZSB0d2ljZS4gKi8KKyAgICBpZiAoaExpYmludGxETEwpCisJcmV0dXJuIDE7CisgICAgLyogTG9hZCBnZXR0ZXh0IGxpYnJhcnkgKGxpYmludGwuZGxsKSAqLworICAgIGhMaWJpbnRsRExMID0gTG9hZExpYnJhcnkobGlibmFtZSAhPSBOVUxMID8gbGlibmFtZSA6IEdFVFRFWFRfRExMKTsKKyAgICBpZiAoIWhMaWJpbnRsRExMKQorICAgIHsKKwljaGFyX3UJICAgIGRpcm5hbWVbX01BWF9QQVRIXTsKKworCS8qIFRyeSB1c2luZyB0aGUgcGF0aCBmcm9tIGd2aW0uZXhlIHRvIGZpbmQgdGhlIC5kbGwgdGhlcmUuICovCisJZ2V0X2V4ZV9uYW1lKCk7CisJU1RSQ1BZKGRpcm5hbWUsIGV4ZV9uYW1lKTsKKwlTVFJDUFkoZ2V0dGFpbChkaXJuYW1lKSwgR0VUVEVYVF9ETEwpOworCWhMaWJpbnRsRExMID0gTG9hZExpYnJhcnkoKGNoYXIgKilkaXJuYW1lKTsKKwlpZiAoIWhMaWJpbnRsRExMKQorCXsKKwkgICAgaWYgKHBfdmVyYm9zZSA+IDApCisJCUVNU0cyKF8oZV9sb2FkbGliKSwgR0VUVEVYVF9ETEwpOworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGxpYmludGxfZW50cnlbaV0ubmFtZSAhPSBOVUxMCisJCQkJCSAmJiBsaWJpbnRsX2VudHJ5W2ldLnB0ciAhPSBOVUxMOyArK2kpCisgICAgeworCWlmICgoKmxpYmludGxfZW50cnlbaV0ucHRyID0gKEZBUlBST0MpR2V0UHJvY0FkZHJlc3MoaExpYmludGxETEwsCisJCQkJCSAgICAgIGxpYmludGxfZW50cnlbaV0ubmFtZSkpID09IE5VTEwpCisJeworCSAgICBkeW5fbGliaW50bF9lbmQoKTsKKwkgICAgaWYgKHBfdmVyYm9zZSA+IDApCisJCUVNU0cyKF8oZV9sb2FkZnVuYyksIGxpYmludGxfZW50cnlbaV0ubmFtZSk7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyAgICB2b2lkCitkeW5fbGliaW50bF9lbmQoKQoreworICAgIGlmIChoTGliaW50bERMTCkKKwlGcmVlTGlicmFyeShoTGliaW50bERMTCk7CisgICAgaExpYmludGxETEwJCQk9IE5VTEw7CisgICAgZHluX2xpYmludGxfZ2V0dGV4dAkJPSBudWxsX2xpYmludGxfZ2V0dGV4dDsKKyAgICBkeW5fbGliaW50bF90ZXh0ZG9tYWluCT0gbnVsbF9saWJpbnRsX3RleHRkb21haW47CisgICAgZHluX2xpYmludGxfYmluZHRleHRkb21haW4JPSBudWxsX2xpYmludGxfYmluZHRleHRkb21haW47Cit9CisKKyAgICBzdGF0aWMgY2hhciAqCitudWxsX2xpYmludGxfZ2V0dGV4dChjb25zdCBjaGFyKiBtc2dpZCkKK3sKKyAgICByZXR1cm4gKGNoYXIqKW1zZ2lkOworfQorCisgICAgc3RhdGljIGNoYXIgKgorbnVsbF9saWJpbnRsX2JpbmR0ZXh0ZG9tYWluKGNvbnN0IGNoYXIqIGRvbWFpbm5hbWUsIGNvbnN0IGNoYXIqIGRpcm5hbWUpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyAgICBzdGF0aWMgY2hhciAqCitudWxsX2xpYmludGxfdGV4dGRvbWFpbihjb25zdCBjaGFyKiBkb21haW5uYW1lKQoreworICAgIHJldHVybiBOVUxMOworfQorCisjZW5kaWYgLyogRFlOQU1JQ19HRVRURVhUICovCisKKy8qIFRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBTREsgb3IgVmlzdWFsIEMrKyAqLworCisjaWZuZGVmIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTCisjIGRlZmluZSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUyAxCisjZW5kaWYKKworRFdPUkQgZ19QbGF0Zm9ybUlkOworCisjaWZkZWYgSEFWRV9BQ0wKKyMgaW5jbHVkZSA8YWNsYXBpLmg+CisvKgorICogVGhlc2UgYXJlIG5lZWRlZCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSBBRFZBUEkgRExMLCB3aGljaCBpcyBub3QKKyAqIGltcGxlbWVudGVkIHVuZGVyIFdpbmRvd3MgOTUgKGFuZCBjYXVzZXMgVklNIHRvIGNyYXNoKQorICovCit0eXBlZGVmIERXT1JEIChXSU5BUEkgKlBTTlNFQ0lORk8pIChMUFRTVFIsIGVudW0gU0VfT0JKRUNUX1RZUEUsCisJU0VDVVJJVFlfSU5GT1JNQVRJT04sIFBTSUQsIFBTSUQsIFBBQ0wsIFBBQ0wpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpQR05TRUNJTkZPKSAoTFBTVFIsIGVudW0gU0VfT0JKRUNUX1RZUEUsCisJU0VDVVJJVFlfSU5GT1JNQVRJT04sIFBTSUQgKiwgUFNJRCAqLCBQQUNMICosIFBBQ0wgKiwKKwlQU0VDVVJJVFlfREVTQ1JJUFRPUiAqKTsKKworc3RhdGljIEhBTkRMRSBhZHZhcGlfbGliID0gTlVMTDsJLyogSGFuZGxlIGZvciBBRFZBUEkgbGlicmFyeSAqLworc3RhdGljIFBTTlNFQ0lORk8gcFNldE5hbWVkU2VjdXJpdHlJbmZvOworc3RhdGljIFBHTlNFQ0lORk8gcEdldE5hbWVkU2VjdXJpdHlJbmZvOworI2VuZGlmCisKKy8qCisgKiBTZXQgZ19QbGF0Zm9ybUlkIHRvIFZFUl9QTEFURk9STV9XSU4zMl9OVCAoTlQpIG9yCisgKiBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUyAoV2luOTUpLgorICovCisgICAgdm9pZAorUGxhdGZvcm1JZCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgZG9uZSA9IEZBTFNFOworCisgICAgaWYgKCFkb25lKQorICAgIHsKKwlPU1ZFUlNJT05JTkZPIG92aTsKKworCW92aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKG92aSk7CisJR2V0VmVyc2lvbkV4KCZvdmkpOworCisJZ19QbGF0Zm9ybUlkID0gb3ZpLmR3UGxhdGZvcm1JZDsKKworI2lmZGVmIEhBVkVfQUNMCisJLyoKKwkgKiBMb2FkIHRoZSBBRFZBUEkgcnVudGltZSBpZiB3ZSBhcmUgb24gYW55dGhpbmcKKwkgKiBvdGhlciB0aGFuIFdpbmRvd3MgOTUKKwkgKi8KKwlpZiAoZ19QbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCkKKwl7CisJICAgIC8qCisJICAgICAqIGRvIHRoaXMgbG9hZC4gIFByb2JsZW1zOiBEb2Vzbid0IHVubG9hZCBhdCBlbmQgb2YgcnVuICh0aGlzIGlzCisJICAgICAqIHRoZW9yZXRpY2FsbHkgb2theSwgc2luY2UgV2luZG93cyBzaG91bGQgdW5sb2FkIGl0IHdoZW4gVklNCisJICAgICAqIHRlcm1pbmF0ZXMpLiAgU2hvdWxkIHdlIGJlIHVzaW5nIHRoZSAnbWNoX2xpYmNhbGwnIHJvdXRpbmVzPworCSAgICAgKiBTZWVtcyBsaWtlIGEgbG90IG9mIG92ZXJoZWFkIHRvIGxvYWQvdW5sb2FkIEFEVkFQSTMyLkRMTCBlYWNoCisJICAgICAqIHRpbWUgd2UgdmVyaWZ5IHNlY3VyaXR5Li4uCisJICAgICAqLworCSAgICBhZHZhcGlfbGliID0gTG9hZExpYnJhcnkoIkFEVkFQSTMyLkRMTCIpOworCSAgICBpZiAoYWR2YXBpX2xpYiAhPSBOVUxMKQorCSAgICB7CisJCXBTZXROYW1lZFNlY3VyaXR5SW5mbyA9IChQU05TRUNJTkZPKUdldFByb2NBZGRyZXNzKGFkdmFwaV9saWIsCisJCQkJCQkgICAgICAiU2V0TmFtZWRTZWN1cml0eUluZm9BIik7CisJCXBHZXROYW1lZFNlY3VyaXR5SW5mbyA9IChQR05TRUNJTkZPKUdldFByb2NBZGRyZXNzKGFkdmFwaV9saWIsCisJCQkJCQkgICAgICAiR2V0TmFtZWRTZWN1cml0eUluZm9BIik7CisJCWlmIChwU2V0TmFtZWRTZWN1cml0eUluZm8gPT0gTlVMTAorCQkJfHwgcEdldE5hbWVkU2VjdXJpdHlJbmZvID09IE5VTEwpCisJCXsKKwkJICAgIC8qIElmIHdlIGNhbid0IGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzc2VzLCBzZXQgYWR2YXBpX2xpYgorCQkgICAgICogdG8gTlVMTCBzbyB0aGF0IHdlIGRvbid0IHVzZSB0aGVtLiAqLworCQkgICAgRnJlZUxpYnJhcnkoYWR2YXBpX2xpYik7CisJCSAgICBhZHZhcGlfbGliID0gTlVMTDsKKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisJZG9uZSA9IFRSVUU7CisgICAgfQorfQorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBydW5uaW5nIG9uIFdpbmRvd3MgOTUgKG9yIDk4IG9yIE1FKS4KKyAqIE9ubHkgdG8gYmUgdXNlZCBhZnRlciBtY2hfaW5pdCgpLgorICovCisgICAgaW50CittY2hfd2luZG93czk1KHZvaWQpCit7CisgICAgcmV0dXJuIGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUzsKK30KKworI2lmZGVmIEZFQVRfR1VJX1czMgorLyoKKyAqIFVzZWQgdG8gd29yayBhcm91bmQgdGhlICJjYW4ndCBkbyBzeW5jaHJvbm91cyBzcGF3biIKKyAqIHByb2JsZW0gb24gV2luMzJzLCB3aXRob3V0IHJlc29ydGluZyB0byBVbml2ZXJzYWwgVGh1bmsuCisgKi8KK3N0YXRpYyBpbnQgb2xkX251bV93aW5kb3dzOworc3RhdGljIGludCBudW1fd2luZG93czsKKworICAgIHN0YXRpYyBCT09MIENBTExCQUNLCit3aW4zMnNzeW5jaF9jYihIV05EIGh3bmQsIExQQVJBTSBscGFyYW0pCit7CisgICAgbnVtX3dpbmRvd3MrKzsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEZFQVRfR1VJX1czMgorCisjZGVmaW5lIFNISUZUICAoU0hJRlRfUFJFU1NFRCkKKyNkZWZpbmUgQ1RSTCAgIChSSUdIVF9DVFJMX1BSRVNTRUQgfCBMRUZUX0NUUkxfUFJFU1NFRCkKKyNkZWZpbmUgQUxUICAgIChSSUdIVF9BTFRfUFJFU1NFRCAgfCBMRUZUX0FMVF9QUkVTU0VEKQorI2RlZmluZSBBTFRfR1IgKFJJR0hUX0FMVF9QUkVTU0VEICB8IExFRlRfQ1RSTF9QUkVTU0VEKQorCisKKy8qIFdoZW4gdUNoYXIuQXNjaWlDaGFyIGlzIDAsIHRoZW4gd2UgbmVlZCB0byBsb29rIGF0IHdWaXJ0dWFsS2V5Q29kZS4KKyAqIFdlIG1hcCBmdW5jdGlvbiBrZXlzIHRvIHRoZWlyIEFOU0kgdGVybWluYWwgZXF1aXZhbGVudHMsIGFzIHByb2R1Y2VkCisgKiBieSBBTlNJLlNZUywgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTVMtRE9TIHZlcnNpb24gb2YgVmltLiAgQW55CisgKiBBTlNJIGtleSB3aXRoIGEgdmFsdWUgPj0gJ1wzMDAnIGlzIG5vbnN0YW5kYXJkLCBidXQgcHJvdmlkZWQgYW55d2F5CisgKiBzbyB0aGF0IHRoZSB1c2VyIGNhbiBoYXZlIGFjY2VzcyB0byBhbGwgU0hJRlQtLCBDVFJMLSwgYW5kIEFMVC0KKyAqIGNvbWJpbmF0aW9ucyBvZiBmdW5jdGlvbi9hcnJvdy9ldGMga2V5cy4KKyAqLworCitjb25zdCBzdGF0aWMgc3RydWN0Cit7CisgICAgV09SRCAgICB3VmlydEtleTsKKyAgICBCT09MICAgIGZBbnNpS2V5OworICAgIGludAkgICAgY2hBbG9uZTsKKyAgICBpbnQJICAgIGNoU2hpZnQ7CisgICAgaW50CSAgICBjaEN0cmw7CisgICAgaW50CSAgICBjaEFsdDsKK30gVmlydEtleU1hcFtdID0KK3sKKworLyogICAgS2V5CUFOU0kJYWxvbmUJc2hpZnQJY3RybAkgICAgYWx0ICovCisgICAgeyBWS19FU0NBUEUsRkFMU0UsCUVTQywJRVNDLAlFU0MsCSAgICBFU0MsICAgIH0sCisKKyAgICB7IFZLX0YxLAlUUlVFLAknOycsCSdUJywJJ14nLAkgICAgJ2gnLCB9LAorICAgIHsgVktfRjIsCVRSVUUsCSc8JywJJ1UnLAknXycsCSAgICAnaScsIH0sCisgICAgeyBWS19GMywJVFJVRSwJJz0nLAknVicsCSdgJywJICAgICdqJywgfSwKKyAgICB7IFZLX0Y0LAlUUlVFLAknPicsCSdXJywJJ2EnLAkgICAgJ2snLCB9LAorICAgIHsgVktfRjUsCVRSVUUsCSc/JywJJ1gnLAknYicsCSAgICAnbCcsIH0sCisgICAgeyBWS19GNiwJVFJVRSwJJ0AnLAknWScsCSdjJywJICAgICdtJywgfSwKKyAgICB7IFZLX0Y3LAlUUlVFLAknQScsCSdaJywJJ2QnLAkgICAgJ24nLCB9LAorICAgIHsgVktfRjgsCVRSVUUsCSdCJywJJ1snLAknZScsCSAgICAnbycsIH0sCisgICAgeyBWS19GOSwJVFJVRSwJJ0MnLAknXFwnLAknZicsCSAgICAncCcsIH0sCisgICAgeyBWS19GMTAsCVRSVUUsCSdEJywJJ10nLAknZycsCSAgICAncScsIH0sCisgICAgeyBWS19GMTEsCVRSVUUsCSdcMjA1JywJJ1wyMDcnLAknXDIxMScsCSAgICAnXDIxMycsIH0sCisgICAgeyBWS19GMTIsCVRSVUUsCSdcMjA2JywJJ1wyMTAnLAknXDIxMicsCSAgICAnXDIxNCcsIH0sCisKKyAgICB7IFZLX0hPTUUsCVRSVUUsCSdHJywJJ1wzMDInLAkndycsCSAgICAnXDMwMycsIH0sCisgICAgeyBWS19VUCwJVFJVRSwJJ0gnLAknXDMwNCcsCSdcMzA1JywJICAgICdcMzA2JywgfSwKKyAgICB7IFZLX1BSSU9SLAlUUlVFLAknSScsCSdcMzA3JywJJ1wyMDQnLAkgICAgJ1wzMTAnLCB9LCAvKlBnVXAqLworICAgIHsgVktfTEVGVCwJVFJVRSwJJ0snLAknXDMxMScsCSdzJywJICAgICdcMzEyJywgfSwKKyAgICB7IFZLX1JJR0hULAlUUlVFLAknTScsCSdcMzEzJywJJ3QnLAkgICAgJ1wzMTQnLCB9LAorICAgIHsgVktfRU5ELAlUUlVFLAknTycsCSdcMzE1JywJJ3UnLAkgICAgJ1wzMTYnLCB9LAorICAgIHsgVktfRE9XTiwJVFJVRSwJJ1AnLAknXDMxNycsCSdcMzIwJywJICAgICdcMzIxJywgfSwKKyAgICB7IFZLX05FWFQsCVRSVUUsCSdRJywJJ1wzMjInLAkndicsCSAgICAnXDMyMycsIH0sIC8qUGdEbiovCisgICAgeyBWS19JTlNFUlQsVFJVRSwJJ1InLAknXDMyNCcsCSdcMzI1JywJICAgICdcMzI2JywgfSwKKyAgICB7IFZLX0RFTEVURSxUUlVFLAknUycsCSdcMzI3JywJJ1wzMzAnLAkgICAgJ1wzMzEnLCB9LAorCisgICAgeyBWS19TTkFQU0hPVCxUUlVFLAkwLAkwLAkwLAkgICAgJ3InLCB9LCAvKlBydFNjcm4qLworCisjaWYgMAorICAgIC8qIE1vc3QgcGVvcGxlIGRvbid0IGhhdmUgRjEzLUYyMCwgYnV0IHdoYXQgdGhlIGhlbGwuLi4gKi8KKyAgICB7IFZLX0YxMywJVFJVRSwJJ1wzMzInLAknXDMzMycsCSdcMzM0JywJICAgICdcMzM1JywgfSwKKyAgICB7IFZLX0YxNCwJVFJVRSwJJ1wzMzYnLAknXDMzNycsCSdcMzQwJywJICAgICdcMzQxJywgfSwKKyAgICB7IFZLX0YxNSwJVFJVRSwJJ1wzNDInLAknXDM0MycsCSdcMzQ0JywJICAgICdcMzQ1JywgfSwKKyAgICB7IFZLX0YxNiwJVFJVRSwJJ1wzNDYnLAknXDM0NycsCSdcMzUwJywJICAgICdcMzUxJywgfSwKKyAgICB7IFZLX0YxNywJVFJVRSwJJ1wzNTInLAknXDM1MycsCSdcMzU0JywJICAgICdcMzU1JywgfSwKKyAgICB7IFZLX0YxOCwJVFJVRSwJJ1wzNTYnLAknXDM1NycsCSdcMzYwJywJICAgICdcMzYxJywgfSwKKyAgICB7IFZLX0YxOSwJVFJVRSwJJ1wzNjInLAknXDM2MycsCSdcMzY0JywJICAgICdcMzY1JywgfSwKKyAgICB7IFZLX0YyMCwJVFJVRSwJJ1wzNjYnLAknXDM2NycsCSdcMzcwJywJICAgICdcMzcxJywgfSwKKyNlbmRpZgorICAgIHsgVktfQURELAlUUlVFLCAgICdOJywgICAgJ04nLCAgICAnTicsCSdOJywJfSwgLyoga2V5cCAnKycgKi8KKyAgICB7IFZLX1NVQlRSQUNULCBUUlVFLCdKJywJJ0onLCAgICAnSicsCSdKJywJfSwgLyoga2V5cCAnLScgKi8KKyAvKiB7IFZLX0RJVklERSwgICBUUlVFLCdOJywJJ04nLCAgICAnTicsCSdOJywJfSwgICAga2V5cCAnLycgKi8KKyAgICB7IFZLX01VTFRJUExZLCBUUlVFLCc3JywJJzcnLCAgICAnNycsCSc3JywJfSwgLyoga2V5cCAnKicgKi8KKworICAgIHsgVktfTlVNUEFEMCxUUlVFLCAgJ1wzMzInLAknXDMzMycsCSdcMzM0JywJICAgICdcMzM1JywgfSwKKyAgICB7IFZLX05VTVBBRDEsVFJVRSwgICdcMzM2JywJJ1wzMzcnLAknXDM0MCcsCSAgICAnXDM0MScsIH0sCisgICAgeyBWS19OVU1QQUQyLFRSVUUsICAnXDM0MicsCSdcMzQzJywJJ1wzNDQnLAkgICAgJ1wzNDUnLCB9LAorICAgIHsgVktfTlVNUEFEMyxUUlVFLCAgJ1wzNDYnLAknXDM0NycsCSdcMzUwJywJICAgICdcMzUxJywgfSwKKyAgICB7IFZLX05VTVBBRDQsVFJVRSwgICdcMzUyJywJJ1wzNTMnLAknXDM1NCcsCSAgICAnXDM1NScsIH0sCisgICAgeyBWS19OVU1QQUQ1LFRSVUUsICAnXDM1NicsCSdcMzU3JywJJ1wzNjAnLAkgICAgJ1wzNjEnLCB9LAorICAgIHsgVktfTlVNUEFENixUUlVFLCAgJ1wzNjInLAknXDM2MycsCSdcMzY0JywJICAgICdcMzY1JywgfSwKKyAgICB7IFZLX05VTVBBRDcsVFJVRSwgICdcMzY2JywJJ1wzNjcnLAknXDM3MCcsCSAgICAnXDM3MScsIH0sCisgICAgeyBWS19OVU1QQUQ4LFRSVUUsICAnXDM3MicsCSdcMzczJywJJ1wzNzQnLAkgICAgJ1wzNzUnLCB9LAorICAgIC8qIFNvcnJ5LCBvdXQgb2YgbnVtYmVyIHNwYWNlISA8bmVncmk+Ki8KKyAgICB7IFZLX05VTVBBRDksVFJVRSwgICdcMzc2JywJJ1wzNzcnLAknXDM3NycsCSAgICAnXDM2NycsIH0sCisKK307CisKKworI2lmZGVmIF9NU0NfVkVSCisvLyBUaGUgVG9Bc2NpaSBidWcgZGVzdHJveXMgc2V2ZXJhbCByZWdpc3RlcnMuCU5lZWQgdG8gdHVybiBvZmYgb3B0aW1pemF0aW9uCisvLyBvciB0aGUgR2V0Q29uc29sZUtleWJvYXJkTGF5b3V0TmFtZSBoYWNrIHdpbGwgZmFpbCBpbiBub24tZGVidWcgdmVyc2lvbnMKKyMgcHJhZ21hIG9wdGltaXplKCIiLCBvZmYpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIEFDaGFyIEFzY2lpQ2hhcgorI2Vsc2UKKyMgZGVmaW5lIEFDaGFyIHVDaGFyLkFzY2lpQ2hhcgorI2VuZGlmCisKKy8qIFRoZSByZXR1cm4gY29kZSBpbmRpY2F0ZXMga2V5IGNvZGUgc2l6ZS4gKi8KKyAgICBzdGF0aWMgaW50CisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgX19zdGRjYWxsCisjZW5kaWYKK3dpbjMyX2tiZF9wYXRjaF9rZXkoCisgICAgS0VZX0VWRU5UX1JFQ09SRCogcGtlcikKK3sKKyAgICBVSU5UIHVNb2RzID0gcGtlci0+ZHdDb250cm9sS2V5U3RhdGU7CisgICAgc3RhdGljIGludCBzX2lJc0RlYWQgPSAwOworICAgIHN0YXRpYyBXT1JEIGF3QW5zaUNvZGVbMl07CisgICAgc3RhdGljIEJZVEUgYWJLZXlzdGF0ZVsyNTZdOworCisKKyAgICBpZiAoc19pSXNEZWFkID09IDIpCisgICAgeworCXBrZXItPkFDaGFyID0gKENIQVIpIGF3QW5zaUNvZGVbMV07CisJc19pSXNEZWFkID0gMDsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocGtlci0+QUNoYXIgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIG1lbXNldChhYktleXN0YXRlLCAwLCBzaXplb2YgKGFiS2V5c3RhdGUpKTsKKworICAgIC8vIFNob3VsZCBvbmx5IGJlIG5vbi1OVUxMIG9uIE5UIDQuMAorICAgIGlmIChzX3BmbkdldENvbnNvbGVLZXlib2FyZExheW91dE5hbWUgIT0gTlVMTCkKKyAgICB7CisJQ0hBUiBzektMSURbS0xfTkFNRUxFTkdUSF07CisKKwlpZiAoKCpzX3BmbkdldENvbnNvbGVLZXlib2FyZExheW91dE5hbWUpKHN6S0xJRCkpCisJICAgICh2b2lkKUxvYWRLZXlib2FyZExheW91dChzektMSUQsIEtMRl9BQ1RJVkFURSk7CisgICAgfQorCisgICAgLyogQ2xlYXIgYW55IHBlbmRpbmcgZGVhZCBrZXlzICovCisgICAgVG9Bc2NpaShWS19TUEFDRSwgTWFwVmlydHVhbEtleShWS19TUEFDRSwgMCksIGFiS2V5c3RhdGUsIGF3QW5zaUNvZGUsIDApOworCisgICAgaWYgKHVNb2RzICYgU0hJRlRfUFJFU1NFRCkKKwlhYktleXN0YXRlW1ZLX1NISUZUXSA9IDB4ODA7CisgICAgaWYgKHVNb2RzICYgQ0FQU0xPQ0tfT04pCisJYWJLZXlzdGF0ZVtWS19DQVBJVEFMXSA9IDE7CisKKyAgICBpZiAoKHVNb2RzICYgQUxUX0dSKSA9PSBBTFRfR1IpCisgICAgeworCWFiS2V5c3RhdGVbVktfQ09OVFJPTF0gPSBhYktleXN0YXRlW1ZLX0xDT05UUk9MXSA9CisJICAgIGFiS2V5c3RhdGVbVktfTUVOVV0gPSBhYktleXN0YXRlW1ZLX1JNRU5VXSA9IDB4ODA7CisgICAgfQorCisgICAgc19pSXNEZWFkID0gVG9Bc2NpaShwa2VyLT53VmlydHVhbEtleUNvZGUsIHBrZXItPndWaXJ0dWFsU2NhbkNvZGUsCisJCQlhYktleXN0YXRlLCBhd0Fuc2lDb2RlLCAwKTsKKworICAgIGlmIChzX2lJc0RlYWQgPiAwKQorCXBrZXItPkFDaGFyID0gKENIQVIpIGF3QW5zaUNvZGVbMF07CisKKyAgICByZXR1cm4gc19pSXNEZWFkOworfQorCisjaWZkZWYgX01TQ19WRVIKKy8qIE1VU1Qgc3dpdGNoIG9wdGltaXphdGlvbiBvbiBhZ2FpbiBoZXJlLCBvdGhlcndpc2UgYSBjYWxsIHRvCisgKiBkZWNvZGVfa2V5X2V2ZW50KCkgbWF5IGNyYXNoIChlLmcuIHdoZW4gaGl0dGluZyBjYXBzLWxvY2spICovCisjIHByYWdtYSBvcHRpbWl6ZSgiIiwgb24pCisKKyMgaWYgKF9NU0NfVkVSIDwgMTEwMCkKKy8qIE1VU1QgdHVybiBvZmYgZ2xvYmFsIG9wdGltaXNhdGlvbiBmb3IgdGhpcyBuZXh0IGZ1bmN0aW9uLCBvcgorICogcHJlc3NpbmcgY3RybC1taW51cyBpbiBpbnNlcnQgbW9kZSBjcmFzaGVzIFZpbSB3aGVuIGJ1aWx0IHdpdGgKKyAqIFZDNC4xLiAtLSBuZWdyaS4gKi8KKyMgIHByYWdtYSBvcHRpbWl6ZSgiZyIsIG9mZikKKyMgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgQk9PTCBnX2ZKdXN0R290Rm9jdXMgPSBGQUxTRTsKKworLyoKKyAqIERlY29kZSBhIEtFWV9FVkVOVCBpbnRvIG9uZSBvciB0d28ga2V5c3Ryb2tlcworICovCisgICAgc3RhdGljIEJPT0wKK2RlY29kZV9rZXlfZXZlbnQoCisgICAgS0VZX0VWRU5UX1JFQ09SRAkqcGtlciwKKyAgICBjaGFyX3UJCSpwY2gsCisgICAgY2hhcl91CQkqcGNoMiwKKyAgICBpbnQJCQkqcG1vZGlmaWVycywKKyAgICBCT09MCQlmRG9Qb3N0KQoreworICAgIGludCBpOworICAgIGNvbnN0IGludCBuTW9kaWZzID0gcGtlci0+ZHdDb250cm9sS2V5U3RhdGUgJiAoU0hJRlQgfCBBTFQgfCBDVFJMKTsKKworICAgICpwY2ggPSAqcGNoMiA9IE5VTDsKKyAgICBnX2ZKdXN0R290Rm9jdXMgPSBGQUxTRTsKKworICAgIC8qIGlnbm9yZSBrZXkgdXAgZXZlbnRzICovCisgICAgaWYgKCFwa2VyLT5iS2V5RG93bikKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKiBpZ25vcmUgc29tZSBrZXlzdHJva2VzICovCisgICAgc3dpdGNoIChwa2VyLT53VmlydHVhbEtleUNvZGUpCisgICAgeworICAgIC8qIG1vZGlmaWVycyAqLworICAgIGNhc2UgVktfU0hJRlQ6CisgICAgY2FzZSBWS19DT05UUk9MOgorICAgIGNhc2UgVktfTUVOVTogICAvKiBBbHQga2V5ICovCisJcmV0dXJuIEZBTFNFOworCisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CisKKyAgICAvKiBzcGVjaWFsIGNhc2VzICovCisgICAgaWYgKChuTW9kaWZzICYgQ1RSTCkgIT0gMCAmJiAobk1vZGlmcyAmIH5DVFJMKSA9PSAwICYmIHBrZXItPkFDaGFyID09IE5VTCkKKyAgICB7CisJLyogQ3RybC02IGlzIEN0cmwtXiAqLworCWlmIChwa2VyLT53VmlydHVhbEtleUNvZGUgPT0gJzYnKQorCXsKKwkgICAgKnBjaCA9IEN0cmxfSEFUOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJLyogQ3RybC0yIGlzIEN0cmwtQCAqLworCWVsc2UgaWYgKHBrZXItPndWaXJ0dWFsS2V5Q29kZSA9PSAnMicpCisJeworCSAgICAqcGNoID0gTlVMOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJLyogQ3RybC0tIGlzIEN0cmwtXyAqLworCWVsc2UgaWYgKHBrZXItPndWaXJ0dWFsS2V5Q29kZSA9PSAweEJEKQorCXsKKwkgICAgKnBjaCA9IEN0cmxfXzsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorICAgIH0KKworICAgIC8qIFNoaWZ0LVRBQiAqLworICAgIGlmIChwa2VyLT53VmlydHVhbEtleUNvZGUgPT0gVktfVEFCICYmIChuTW9kaWZzICYgU0hJRlRfUFJFU1NFRCkpCisgICAgeworCSpwY2ggPSBLX05VTDsKKwkqcGNoMiA9ICdcMDE3JzsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBzaXplb2YoVmlydEtleU1hcCkgLyBzaXplb2YoVmlydEtleU1hcFswXSk7ICAtLWkgPj0gMDsgICkKKyAgICB7CisJaWYgKFZpcnRLZXlNYXBbaV0ud1ZpcnRLZXkgPT0gcGtlci0+d1ZpcnR1YWxLZXlDb2RlKQorCXsKKwkgICAgaWYgKG5Nb2RpZnMgPT0gMCkKKwkJKnBjaCA9IFZpcnRLZXlNYXBbaV0uY2hBbG9uZTsKKwkgICAgZWxzZSBpZiAoKG5Nb2RpZnMgJiBTSElGVCkgIT0gMCAmJiAobk1vZGlmcyAmIH5TSElGVCkgPT0gMCkKKwkJKnBjaCA9IFZpcnRLZXlNYXBbaV0uY2hTaGlmdDsKKwkgICAgZWxzZSBpZiAoKG5Nb2RpZnMgJiBDVFJMKSAhPSAwICYmIChuTW9kaWZzICYgfkNUUkwpID09IDApCisJCSpwY2ggPSBWaXJ0S2V5TWFwW2ldLmNoQ3RybDsKKwkgICAgZWxzZSBpZiAoKG5Nb2RpZnMgJiBBTFQpICE9IDAgJiYgKG5Nb2RpZnMgJiB+QUxUKSA9PSAwKQorCQkqcGNoID0gVmlydEtleU1hcFtpXS5jaEFsdDsKKworCSAgICBpZiAoKnBjaCAhPSAwKQorCSAgICB7CisJCWlmIChWaXJ0S2V5TWFwW2ldLmZBbnNpS2V5KQorCQl7CisJCSAgICAqcGNoMiA9ICpwY2g7CisJCSAgICAqcGNoID0gS19OVUw7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpID0gd2luMzJfa2JkX3BhdGNoX2tleShwa2VyKTsKKworICAgIGlmIChpIDwgMCkKKwkqcGNoID0gTlVMOworICAgIGVsc2UKKyAgICB7CisJKnBjaCA9IChpID4gMCkgPyBwa2VyLT5BQ2hhciA6IE5VTDsKKworCWlmIChwbW9kaWZpZXJzICE9IE5VTEwpCisJeworCSAgICAvKiBQYXNzIG9uIHRoZSBBTFQga2V5IGFzIGEgbW9kaWZpZXIsIGJ1dCBvbmx5IHdoZW4gbm90IGNvbWJpbmVkCisJICAgICAqIHdpdGggQ1RSTCAod2hpY2ggaXMgQUxUR1IpLiAqLworCSAgICBpZiAoKG5Nb2RpZnMgJiBBTFQpICE9IDAgJiYgKG5Nb2RpZnMgJiBDVFJMKSA9PSAwKQorCQkqcG1vZGlmaWVycyB8PSBNT0RfTUFTS19BTFQ7CisKKwkgICAgLyogUGFzcyBvbiBTSElGVCBvbmx5IGZvciBzcGVjaWFsIGtleXMsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGVuCisJICAgICAqIGl0J3MgYWxyZWFkeSBpbmNsdWRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIuICovCisJICAgIGlmICgobk1vZGlmcyAmIFNISUZUKSAhPSAwICYmICpwY2ggPD0gMHgyMCkKKwkJKnBtb2RpZmllcnMgfD0gTU9EX01BU0tfU0hJRlQ7CisKKwkgICAgLyogUGFzcyBvbiBDVFJMIG9ubHkgZm9yIG5vbi1zcGVjaWFsIGtleXMsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdworCSAgICAgKiB3aGVuIGl0J3MgYWxyZWFkeSBpbmNsdWRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIuICBBbmQgbm90IHdoZW4KKwkgICAgICogY29tYmluZWQgd2l0aCBBTFQgKHdoaWNoIGlzIEFMVEdSKS4gKi8KKwkgICAgaWYgKChuTW9kaWZzICYgQ1RSTCkgIT0gMCAmJiAobk1vZGlmcyAmIEFMVCkgPT0gMAorCQkJCQkgICAgICAgJiYgKnBjaCA+PSAweDIwICYmICpwY2ggPCAweDgwKQorCQkqcG1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gKCpwY2ggIT0gTlVMKTsKK30KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSBvcHRpbWl6ZSgiIiwgb24pCisjZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfR1VJX1czMiAqLworCisKKyNpZmRlZiBGRUFUX01PVVNFCisKKy8qCisgKiBGb3IgdGhlIEdVSSB0aGUgbW91c2UgaGFuZGxpbmcgaXMgaW4gZ3VpX3czMi5jLgorICovCisjIGlmZGVmIEZFQVRfR1VJX1czMgorICAgIHZvaWQKK21jaF9zZXRtb3VzZSgKKyAgICBpbnQgb24pCit7Cit9CisjIGVsc2UKK3N0YXRpYyBpbnQgZ19mTW91c2VBdmFpbCA9IEZBTFNFOyAgIC8qIG1vdXNlIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgZ19mTW91c2VBY3RpdmUgPSBGQUxTRTsgIC8qIG1vdXNlIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgZ19uTW91c2VDbGljayA9IC0xOwkgICAgLyogbW91c2Ugc3RhdHVzICovCitzdGF0aWMgaW50IGdfeE1vdXNlOwkJICAgIC8qIG1vdXNlIHggY29vcmRpbmF0ZSAqLworc3RhdGljIGludCBnX3lNb3VzZTsJCSAgICAvKiBtb3VzZSB5IGNvb3JkaW5hdGUgKi8KKworLyoKKyAqIEVuYWJsZSBvciBkaXNhYmxlIG1vdXNlIGlucHV0CisgKi8KKyAgICB2b2lkCittY2hfc2V0bW91c2UoCisgICAgaW50IG9uKQoreworICAgIERXT1JEIGNtb2RlaW47CisKKyAgICBpZiAoIWdfZk1vdXNlQXZhaWwpCisJcmV0dXJuOworCisgICAgZ19mTW91c2VBY3RpdmUgPSBvbjsKKyAgICBHZXRDb25zb2xlTW9kZShnX2hDb25JbiwgJmNtb2RlaW4pOworCisgICAgaWYgKGdfZk1vdXNlQWN0aXZlKQorCWNtb2RlaW4gfD0gRU5BQkxFX01PVVNFX0lOUFVUOworICAgIGVsc2UKKwljbW9kZWluICY9IH5FTkFCTEVfTU9VU0VfSU5QVVQ7CisKKyAgICBTZXRDb25zb2xlTW9kZShnX2hDb25JbiwgY21vZGVpbik7Cit9CisKKworLyoKKyAqIERlY29kZSBhIE1PVVNFX0VWRU5ULiAgSWYgaXQncyBhIHZhbGlkIGV2ZW50LCByZXR1cm4gTU9VU0VfTEVGVCwKKyAqIE1PVVNFX01JRERMRSwgb3IgTU9VU0VfUklHSFQgZm9yIGEgY2xpY2s7IE1PVVNFX0RSQUcgZm9yIGEgbW91c2UKKyAqIG1vdmUgd2l0aCBhIGJ1dHRvbiBoZWxkIGRvd247IGFuZCBNT1VTRV9SRUxFQVNFIGFmdGVyIGEgTU9VU0VfRFJBRworICogb3IgYSBNT1VTRV9MRUZULCBfTUlERExFLCBvciBfUklHSFQuICBXZSBlbmNvZGUgdGhlIGJ1dHRvbiB0eXBlLAorICogdGhlIG51bWJlciBvZiBjbGlja3MsIGFuZCB0aGUgU2hpZnQvQ3RybC9BbHQgbW9kaWZpZXJzIGluIGdfbk1vdXNlQ2xpY2ssCisgKiBhbmQgd2UgcmV0dXJuIHRoZSBtb3VzZSBwb3NpdGlvbiBpbiBnX3hNb3VzZSBhbmQgZ195TW91c2UuCisgKgorICogRXZlcnkgTU9VU0VfTEVGVCwgX01JRERMRSwgb3IgX1JJR0hUIHdpbGwgYmUgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlCisgKiBNT1VTRV9EUkFHcyBhbmQgb25lIE1PVVNFX1JFTEVBU0UuICBNT1VTRV9SRUxFQVNFIHdpbGwgYmUgZm9sbG93ZWQgb25seQorICogYnkgTU9VU0VfTEVGVCwgX01JRERMRSwgb3IgX1JJR0hULgorICoKKyAqIEZvciBtdWx0aXBsZSBjbGlja3MsIHdlIHNlbmQsIHNheSwgTU9VU0VfTEVGVC8xIGNsaWNrLCBNT1VTRV9SRUxFQVNFLAorICogTU9VU0VfTEVGVC8yIGNsaWNrcywgTU9VU0VfUkVMRUFTRSwgTU9VU0VfTEVGVC8zIGNsaWNrcywgTU9VU0VfUkVMRUFTRSwgLi4uLgorICoKKyAqIFdpbmRvd3Mgd2lsbCBzZW5kIHVzIE1PVVNFX01PVkVEIG5vdGlmaWNhdGlvbnMgd2hlbmV2ZXIgdGhlIG1vdXNlCisgKiBtb3ZlcywgZXZlbiBpZiBpdCBzdGF5cyB3aXRoaW4gdGhlIHNhbWUgY2hhcmFjdGVyIGNlbGwuICBXZSBpZ25vcmUKKyAqIGFsbCBNT1VTRV9NT1ZFRCBtZXNzYWdlcyBpZiB0aGUgcG9zaXRpb24gaGFzbid0IHJlYWxseSBjaGFuZ2VkLCBhbmQKKyAqIHdlIGlnbm9yZSBhbGwgTU9VU0VfTU9WRUQgbWVzc2FnZXMgd2hlcmUgbm8gYnV0dG9uIGlzIGhlbGQgZG93biAoaS5lLiwKKyAqIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBNT1VTRV9EUkFHKS4KKyAqCisgKiBBbGwgb2YgdGhpcyBpcyBjb21wbGljYXRlZCBieSB0aGUgY29kZSB0aGF0IGZha2VzIE1PVVNFX01JRERMRSBvbgorICogMi1idXR0b24gbW91c2VzIGJ5IHByZXNzaW5nIHRoZSBsZWZ0ICYgcmlnaHQgYnV0dG9ucyBzaW11bHRhbmVvdXNseS4KKyAqIEluIHByYWN0aWNlLCBpdCdzIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGNsaWNrIGJvdGggYXQgdGhlIHNhbWUgdGltZSwKKyAqIHNvIHdlIG5lZWQgdG8gZGVsYXkgYSBsaXR0bGUuICBBbHNvLCB3ZSB0ZW5kIG5vdCB0byBnZXQgTU9VU0VfUkVMRUFTRQorICogaW4gc3VjaCBjYXNlcywgaWYgdGhlIHVzZXIgaXMgY2xpY2tpbmcgcXVpY2tseS4KKyAqLworICAgIHN0YXRpYyBCT09MCitkZWNvZGVfbW91c2VfZXZlbnQoCisgICAgTU9VU0VfRVZFTlRfUkVDT1JEKiBwbWVyKQoreworICAgIHN0YXRpYyBpbnQgc19uT2xkQnV0dG9uID0gLTE7CisgICAgc3RhdGljIGludCBzX25PbGRNb3VzZUNsaWNrID0gLTE7CisgICAgc3RhdGljIGludCBzX3hPbGRNb3VzZSA9IC0xOworICAgIHN0YXRpYyBpbnQgc195T2xkTW91c2UgPSAtMTsKKyAgICBzdGF0aWMgbGluZW5yX1Qgc19vbGRfdG9wbGluZSA9IDA7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgc3RhdGljIGludCBzX29sZF90b3BmaWxsID0gMDsKKyNlbmRpZgorICAgIHN0YXRpYyBpbnQgc19jQ2xpY2tzID0gMTsKKyAgICBzdGF0aWMgQk9PTCBzX2ZSZWxlYXNlZCA9IFRSVUU7CisgICAgc3RhdGljIERXT1JEIHNfZHdMYXN0Q2xpY2tUaW1lID0gMDsKKyAgICBzdGF0aWMgQk9PTCBzX2ZOZXh0SXNNaWRkbGUgPSBGQUxTRTsKKworICAgIHN0YXRpYyBEV09SRCBjQnV0dG9ucyA9IDA7CS8qIG51bWJlciBvZiBidXR0b25zIHN1cHBvcnRlZCAqLworCisgICAgY29uc3QgRFdPUkQgTEVGVCA9IEZST01fTEVGVF8xU1RfQlVUVE9OX1BSRVNTRUQ7CisgICAgY29uc3QgRFdPUkQgTUlERExFID0gRlJPTV9MRUZUXzJORF9CVVRUT05fUFJFU1NFRDsKKyAgICBjb25zdCBEV09SRCBSSUdIVCA9IFJJR0hUTU9TVF9CVVRUT05fUFJFU1NFRDsKKyAgICBjb25zdCBEV09SRCBMRUZUX1JJR0hUID0gTEVGVCB8IFJJR0hUOworCisgICAgaW50IG5CdXR0b247CisKKyAgICBpZiAoY0J1dHRvbnMgPT0gMCAmJiAhR2V0TnVtYmVyT2ZDb25zb2xlTW91c2VCdXR0b25zKCZjQnV0dG9ucykpCisJY0J1dHRvbnMgPSAyOworCisgICAgaWYgKCFnX2ZNb3VzZUF2YWlsIHx8ICFnX2ZNb3VzZUFjdGl2ZSkKKyAgICB7CisJZ19uTW91c2VDbGljayA9IC0xOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBnZXQgYSBzcHVyaW91cyBNT1VTRV9FVkVOVCBpbW1lZGlhdGVseSBhZnRlciByZWNlaXZpbmcgZm9jdXM7IGlnbm9yZSAqLworICAgIGlmIChnX2ZKdXN0R290Rm9jdXMpCisgICAgeworCWdfZkp1c3RHb3RGb2N1cyA9IEZBTFNFOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiB1bnByb2Nlc3NlZCBtb3VzZSBjbGljaz8gKi8KKyAgICBpZiAoZ19uTW91c2VDbGljayAhPSAtMSkKKwlyZXR1cm4gVFJVRTsKKworICAgIG5CdXR0b24gPSAtMTsKKyAgICBnX3hNb3VzZSA9IHBtZXItPmR3TW91c2VQb3NpdGlvbi5YOworICAgIGdfeU1vdXNlID0gcG1lci0+ZHdNb3VzZVBvc2l0aW9uLlk7CisKKyAgICBpZiAocG1lci0+ZHdFdmVudEZsYWdzID09IE1PVVNFX01PVkVEKQorICAgIHsKKwkvKiBpZ25vcmUgTU9VU0VfTU9WRUQgZXZlbnRzIGlmICh4LCB5KSBoYXNuJ3QgY2hhbmdlZC4JKFdlIGdldCB0aGVzZQorCSAqIGV2ZW50cyBldmVuIHdoZW4gdGhlIG1vdXNlIG1vdmVzIG9ubHkgd2l0aGluIGEgY2hhciBjZWxsLikgKi8KKwlpZiAoc194T2xkTW91c2UgPT0gZ194TW91c2UgJiYgc195T2xkTW91c2UgPT0gZ195TW91c2UpCisJICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBJZiBubyBidXR0b25zIGFyZSBwcmVzc2VkLi4uICovCisgICAgaWYgKChwbWVyLT5kd0J1dHRvblN0YXRlICYgKCgxIDw8IGNCdXR0b25zKSAtIDEpKSA9PSAwKQorICAgIHsKKwkvKiBJZiB0aGUgbGFzdCB0aGluZyByZXR1cm5lZCB3YXMgTU9VU0VfUkVMRUFTRSwgaWdub3JlIHRoaXMgKi8KKwlpZiAoc19mUmVsZWFzZWQpCisJICAgIHJldHVybiBGQUxTRTsKKworCW5CdXR0b24gPSBNT1VTRV9SRUxFQVNFOworCXNfZlJlbGVhc2VkID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSAgICAvKiBvbmUgb3IgbW9yZSBidXR0b25zIHByZXNzZWQgKi8KKyAgICB7CisJLyogb24gYSAyLWJ1dHRvbiBtb3VzZSwgaG9sZCBkb3duIGxlZnQgYW5kIHJpZ2h0IGJ1dHRvbnMKKwkgKiBzaW11bHRhbmVvdXNseSB0byBnZXQgTUlERExFLiAqLworCisJaWYgKGNCdXR0b25zID09IDIgJiYgc19uT2xkQnV0dG9uICE9IE1PVVNFX0RSQUcpCisJeworCSAgICBEV09SRCBkd0xSID0gKHBtZXItPmR3QnV0dG9uU3RhdGUgJiBMRUZUX1JJR0hUKTsKKworCSAgICAvKiBpZiBlaXRoZXIgbGVmdCBvciByaWdodCBidXR0b24gb25seSBpcyBwcmVzc2VkLCBzZWUgaWYgdGhlCisJICAgICAqIHRoZSBuZXh0IG1vdXNlIGV2ZW50IGhhcyBib3RoIG9mIHRoZW0gcHJlc3NlZCAqLworCSAgICBpZiAoZHdMUiA9PSBMRUZUIHx8IGR3TFIgPT0gUklHSFQpCisJICAgIHsKKwkJZm9yICg7OykKKwkJeworCQkgICAgLyogd2FpdCBhIHNob3J0IHRpbWUgZm9yIG5leHQgaW5wdXQgZXZlbnQgKi8KKwkJICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGdfaENvbkluLCBwX21vdXNldCAvIDMpCisJCQkJCQkJICAgICAhPSBXQUlUX09CSkVDVF8wKQorCQkJYnJlYWs7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlEV09SRCBjUmVjb3JkcyA9IDA7CisJCQlJTlBVVF9SRUNPUkQgaXI7CisJCQlNT1VTRV9FVkVOVF9SRUNPUkQqIHBtZXIyID0gJmlyLkV2ZW50Lk1vdXNlRXZlbnQ7CisKKwkJCVBlZWtDb25zb2xlSW5wdXQoZ19oQ29uSW4sICZpciwgMSwgJmNSZWNvcmRzKTsKKworCQkJaWYgKGNSZWNvcmRzID09IDAgfHwgaXIuRXZlbnRUeXBlICE9IE1PVVNFX0VWRU5UCisJCQkJfHwgIShwbWVyMi0+ZHdCdXR0b25TdGF0ZSAmIExFRlRfUklHSFQpKQorCQkJICAgIGJyZWFrOworCQkJZWxzZQorCQkJeworCQkJICAgIGlmIChwbWVyMi0+ZHdFdmVudEZsYWdzICE9IE1PVVNFX01PVkVEKQorCQkJICAgIHsKKwkJCQlSZWFkQ29uc29sZUlucHV0KGdfaENvbkluLCAmaXIsIDEsICZjUmVjb3Jkcyk7CisKKwkJCQlyZXR1cm4gZGVjb2RlX21vdXNlX2V2ZW50KHBtZXIyKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAoc194T2xkTW91c2UgPT0gcG1lcjItPmR3TW91c2VQb3NpdGlvbi5YICYmCisJCQkJICAgICBzX3lPbGRNb3VzZSA9PSBwbWVyMi0+ZHdNb3VzZVBvc2l0aW9uLlkpCisJCQkgICAgeworCQkJCS8qIHRocm93IGF3YXkgc3B1cmlvdXMgbW91c2UgbW92ZSAqLworCQkJCVJlYWRDb25zb2xlSW5wdXQoZ19oQ29uSW4sICZpciwgMSwgJmNSZWNvcmRzKTsKKworCQkJCS8qIGFyZSB0aGVyZSBhbnkgbW9yZSBtb3VzZSBldmVudHMgaW4gcXVldWU/ICovCisJCQkJUGVla0NvbnNvbGVJbnB1dChnX2hDb25JbiwgJmlyLCAxLCAmY1JlY29yZHMpOworCisJCQkJaWYgKGNSZWNvcmRzPT0wIHx8IGlyLkV2ZW50VHlwZSAhPSBNT1VTRV9FVkVOVCkKKwkJCQkgICAgYnJlYWs7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCQlicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJaWYgKHNfZk5leHRJc01pZGRsZSkKKwl7CisJICAgIG5CdXR0b24gPSAocG1lci0+ZHdFdmVudEZsYWdzID09IE1PVVNFX01PVkVEKQorCQk/IE1PVVNFX0RSQUcgOiBNT1VTRV9NSURETEU7CisJICAgIHNfZk5leHRJc01pZGRsZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChjQnV0dG9ucyA9PSAyCSYmCisJICAgICgocG1lci0+ZHdCdXR0b25TdGF0ZSAmIExFRlRfUklHSFQpID09IExFRlRfUklHSFQpKQorCXsKKwkgICAgbkJ1dHRvbiA9IE1PVVNFX01JRERMRTsKKworCSAgICBpZiAoISBzX2ZSZWxlYXNlZCAmJiBwbWVyLT5kd0V2ZW50RmxhZ3MgIT0gTU9VU0VfTU9WRUQpCisJICAgIHsKKwkJc19mTmV4dElzTWlkZGxlID0gVFJVRTsKKwkJbkJ1dHRvbiA9IE1PVVNFX1JFTEVBU0U7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoKHBtZXItPmR3QnV0dG9uU3RhdGUgJiBMRUZUKSA9PSBMRUZUKQorCSAgICBuQnV0dG9uID0gTU9VU0VfTEVGVDsKKwllbHNlIGlmICgocG1lci0+ZHdCdXR0b25TdGF0ZSAmIE1JRERMRSkgPT0gTUlERExFKQorCSAgICBuQnV0dG9uID0gTU9VU0VfTUlERExFOworCWVsc2UgaWYgKChwbWVyLT5kd0J1dHRvblN0YXRlICYgUklHSFQpID09IFJJR0hUKQorCSAgICBuQnV0dG9uID0gTU9VU0VfUklHSFQ7CisKKwlpZiAoISBzX2ZSZWxlYXNlZCAmJiAhIHNfZk5leHRJc01pZGRsZQorCQkmJiBuQnV0dG9uICE9IHNfbk9sZEJ1dHRvbiAmJiBzX25PbGRCdXR0b24gIT0gTU9VU0VfRFJBRykKKwkgICAgcmV0dXJuIEZBTFNFOworCisJc19mUmVsZWFzZWQgPSBzX2ZOZXh0SXNNaWRkbGU7CisgICAgfQorCisgICAgaWYgKHBtZXItPmR3RXZlbnRGbGFncyA9PSAwIHx8IHBtZXItPmR3RXZlbnRGbGFncyA9PSBET1VCTEVfQ0xJQ0spCisgICAgeworCS8qIGJ1dHRvbiBwcmVzc2VkIG9yIHJlbGVhc2VkLCB3aXRob3V0IG1vdXNlIG1vdmluZyAqLworCWlmIChuQnV0dG9uICE9IC0xICYmIG5CdXR0b24gIT0gTU9VU0VfUkVMRUFTRSkKKwl7CisJICAgIERXT1JEIGR3Q3VycmVudFRpbWUgPSBHZXRUaWNrQ291bnQoKTsKKworCSAgICBpZiAoc194T2xkTW91c2UgIT0gZ194TW91c2UKKwkJICAgIHx8IHNfeU9sZE1vdXNlICE9IGdfeU1vdXNlCisJCSAgICB8fCBzX25PbGRCdXR0b24gIT0gbkJ1dHRvbgorCQkgICAgfHwgc19vbGRfdG9wbGluZSAhPSBjdXJ3aW4tPndfdG9wbGluZQorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgfHwgc19vbGRfdG9wZmlsbCAhPSBjdXJ3aW4tPndfdG9wZmlsbAorI2VuZGlmCisJCSAgICB8fCAoaW50KShkd0N1cnJlbnRUaW1lIC0gc19kd0xhc3RDbGlja1RpbWUpID4gcF9tb3VzZXQpCisJICAgIHsKKwkJc19jQ2xpY2tzID0gMTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgrK3NfY0NsaWNrcyA+IDQpCisJICAgIHsKKwkJc19jQ2xpY2tzID0gMTsKKwkgICAgfQorCisJICAgIHNfZHdMYXN0Q2xpY2tUaW1lID0gZHdDdXJyZW50VGltZTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKHBtZXItPmR3RXZlbnRGbGFncyA9PSBNT1VTRV9NT1ZFRCkKKyAgICB7CisJaWYgKG5CdXR0b24gIT0gLTEgJiYgbkJ1dHRvbiAhPSBNT1VTRV9SRUxFQVNFKQorCSAgICBuQnV0dG9uID0gTU9VU0VfRFJBRzsKKworCXNfY0NsaWNrcyA9IDE7CisgICAgfQorCisgICAgaWYgKG5CdXR0b24gPT0gLTEpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG5CdXR0b24gIT0gTU9VU0VfUkVMRUFTRSkKKwlzX25PbGRCdXR0b24gPSBuQnV0dG9uOworCisgICAgZ19uTW91c2VDbGljayA9IG5CdXR0b247CisKKyAgICBpZiAocG1lci0+ZHdDb250cm9sS2V5U3RhdGUgJiBTSElGVF9QUkVTU0VEKQorCWdfbk1vdXNlQ2xpY2sgfD0gTU9VU0VfU0hJRlQ7CisgICAgaWYgKHBtZXItPmR3Q29udHJvbEtleVN0YXRlICYgKFJJR0hUX0NUUkxfUFJFU1NFRCB8IExFRlRfQ1RSTF9QUkVTU0VEKSkKKwlnX25Nb3VzZUNsaWNrIHw9IE1PVVNFX0NUUkw7CisgICAgaWYgKHBtZXItPmR3Q29udHJvbEtleVN0YXRlICYgKFJJR0hUX0FMVF9QUkVTU0VEICB8IExFRlRfQUxUX1BSRVNTRUQpKQorCWdfbk1vdXNlQ2xpY2sgfD0gTU9VU0VfQUxUOworCisgICAgaWYgKG5CdXR0b24gIT0gTU9VU0VfRFJBRyAmJiBuQnV0dG9uICE9IE1PVVNFX1JFTEVBU0UpCisJU0VUX05VTV9NT1VTRV9DTElDS1MoZ19uTW91c2VDbGljaywgc19jQ2xpY2tzKTsKKworICAgIC8qIG9ubHkgcGFzcyBvbiBpbnRlcmVzdGluZyAoaS5lLiwgZGlmZmVyZW50KSBtb3VzZSBldmVudHMgKi8KKyAgICBpZiAoc194T2xkTW91c2UgPT0gZ194TW91c2UKKwkgICAgJiYgc195T2xkTW91c2UgPT0gZ195TW91c2UKKwkgICAgJiYgc19uT2xkTW91c2VDbGljayA9PSBnX25Nb3VzZUNsaWNrKQorICAgIHsKKwlnX25Nb3VzZUNsaWNrID0gLTE7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHNfeE9sZE1vdXNlID0gZ194TW91c2U7CisgICAgc195T2xkTW91c2UgPSBnX3lNb3VzZTsKKyAgICBzX29sZF90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgc19vbGRfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisgICAgc19uT2xkTW91c2VDbGljayA9IGdfbk1vdXNlQ2xpY2s7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworIyBlbmRpZiAvKiBGRUFUX0dVSV9XMzIgKi8KKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKworI2lmZGVmIE1DSF9DVVJTT1JfU0hBUEUKKy8qCisgKiBTZXQgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IuCisgKiAndGhpY2tuZXNzJyBjYW4gYmUgZnJvbSAxICh0aGluKSB0byA5OSAoYmxvY2spCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWNoX3NldF9jdXJzb3Jfc2hhcGUoaW50IHRoaWNrbmVzcykKK3sKKyAgICBDT05TT0xFX0NVUlNPUl9JTkZPIENvbnNvbGVDdXJzb3JJbmZvOworICAgIENvbnNvbGVDdXJzb3JJbmZvLmR3U2l6ZSA9IHRoaWNrbmVzczsKKyAgICBDb25zb2xlQ3Vyc29ySW5mby5iVmlzaWJsZSA9IHNfY3Vyc29yX3Zpc2libGU7CisKKyAgICBTZXRDb25zb2xlQ3Vyc29ySW5mbyhnX2hDb25PdXQsICZDb25zb2xlQ3Vyc29ySW5mbyk7CisgICAgaWYgKHNfY3Vyc29yX3Zpc2libGUpCisJU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGdfaENvbk91dCwgZ19jb29yZCk7Cit9CisKKyAgICB2b2lkCittY2hfdXBkYXRlX2N1cnNvcih2b2lkKQoreworICAgIGludAkJaWR4OworICAgIGludAkJdGhpY2tuZXNzOworCisgICAgLyoKKyAgICAgKiBIb3cgdGhlIGN1cnNvciBpcyBkcmF3biBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IG1vZGUuCisgICAgICovCisgICAgaWR4ID0gZ2V0X3NoYXBlX2lkeChGQUxTRSk7CisKKyAgICBpZiAoc2hhcGVfdGFibGVbaWR4XS5zaGFwZSA9PSBTSEFQRV9CTE9DSykKKwl0aGlja25lc3MgPSA5OTsJLyogMTAwIGRvZXNuJ3Qgd29yayBvbiBXOTUgKi8KKyAgICBlbHNlCisJdGhpY2tuZXNzID0gc2hhcGVfdGFibGVbaWR4XS5wZXJjZW50YWdlOworICAgIG1jaF9zZXRfY3Vyc29yX3NoYXBlKHRoaWNrbmVzcyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGRUFUX0dVSV9XMzIJICAgIC8qIHRoaXMgaXNuJ3QgdXNlZCBmb3IgdGhlIEdVSSAqLworLyoKKyAqIEhhbmRsZSBGT0NVU19FVkVOVC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitoYW5kbGVfZm9jdXNfZXZlbnQoSU5QVVRfUkVDT1JEIGlyKQoreworICAgIGdfZkp1c3RHb3RGb2N1cyA9IGlyLkV2ZW50LkZvY3VzRXZlbnQuYlNldEZvY3VzOworICAgIHVpX2ZvY3VzX2NoYW5nZSgoaW50KWdfZkp1c3RHb3RGb2N1cyk7Cit9CisKKy8qCisgKiBXYWl0IHVudGlsIGNvbnNvbGUgaW5wdXQgZnJvbSBrZXlib2FyZCBvciBtb3VzZSBpcyBhdmFpbGFibGUsCisgKiBvciB0aGUgdGltZSBpcyB1cC4KKyAqIFJldHVybiBUUlVFIGlmIHNvbWV0aGluZyBpcyBhdmFpbGFibGUgRkFMU0UgaWYgbm90LgorICovCisgICAgc3RhdGljIGludAorV2FpdEZvckNoYXIobG9uZyBtc2VjKQoreworICAgIERXT1JECSAgICBkd05vdyA9IDAsIGR3RW5kVGltZSA9IDA7CisgICAgSU5QVVRfUkVDT1JEICAgIGlyOworICAgIERXT1JECSAgICBjUmVjb3JkczsKKyAgICBjaGFyX3UJICAgIGNoLCBjaDI7CisKKyAgICBpZiAobXNlYyA+IDApCisJLyogV2FpdCB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgaGFzIGVsYXBzZWQuICovCisJZHdFbmRUaW1lID0gR2V0VGlja0NvdW50KCkgKyBtc2VjOworICAgIGVsc2UgaWYgKG1zZWMgPCAwKQorCS8qIFdhaXQgZm9yZXZlci4gKi8KKwlkd0VuZFRpbWUgPSBJTkZJTklURTsKKworICAgIC8qIFdlIG5lZWQgdG8gbG9vcCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB0aW1lIHBlcmlvZCwgYmVjYXVzZQorICAgICAqIHdlIG1pZ2h0IGdldCBtdWx0aXBsZSB1bnVzYWJsZSBtb3VzZSBldmVudHMgaW4gdGhhdCB0aW1lLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisJc2VydmVyUHJvY2Vzc1BlbmRpbmdNZXNzYWdlcygpOworI2VuZGlmCisJaWYgKDAKKyNpZmRlZiBGRUFUX01PVVNFCisJCXx8IGdfbk1vdXNlQ2xpY2sgIT0gLTEKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisJCXx8IGlucHV0X2F2YWlsYWJsZSgpCisjZW5kaWYKKwkgICApCisJICAgIHJldHVybiBUUlVFOworCisJaWYgKG1zZWMgPiAwKQorCXsKKwkgICAgLyogSWYgdGhlIHNwZWNpZmllZCB3YWl0IHRpbWUgaGFzIHBhc3NlZCwgcmV0dXJuLiAqLworCSAgICBkd05vdyA9IEdldFRpY2tDb3VudCgpOworCSAgICBpZiAoZHdOb3cgPj0gZHdFbmRUaW1lKQorCQlicmVhazsKKwl9CisJaWYgKG1zZWMgIT0gMCkKKwl7CisjaWZkZWYgRkVBVF9DTElFTlRTRVJWRVIKKwkgICAgLyogV2FpdCBmb3IgZWl0aGVyIGFuIGV2ZW50IG9uIHRoZSBjb25zb2xlIGlucHV0IG9yIGEgbWVzc2FnZSBpbgorCSAgICAgKiB0aGUgY2xpZW50LXNlcnZlciB3aW5kb3cuICovCisJICAgIGlmIChNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDEsICZnX2hDb25JbiwgRkFMU0UsCisJCQkgIGR3RW5kVGltZSAtIGR3Tm93LCBRU19TRU5ETUVTU0FHRSkgIT0gV0FJVF9PQkpFQ1RfMCkKKyNlbHNlCisJICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGdfaENvbkluLCBkd0VuZFRpbWUgLSBkd05vdykKKwkJCQkJCQkgICAgICE9IFdBSVRfT0JKRUNUXzApCisjZW5kaWYKKwkJICAgIGNvbnRpbnVlOworCX0KKworCWNSZWNvcmRzID0gMDsKKwlQZWVrQ29uc29sZUlucHV0KGdfaENvbkluLCAmaXIsIDEsICZjUmVjb3Jkcyk7CisKKyNpZmRlZiBGRUFUX01CWVRFX0lNRQorCWlmIChTdGF0ZSAmIENNRExJTkUgJiYgbXNnX3JvdyA9PSBSb3dzIC0gMSkKKwl7CisJICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmk7CisKKwkgICAgaWYgKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGdfaENvbk91dCwgJmNzYmkpKQorCSAgICB7CisJCWlmIChjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWSAhPSBtc2dfcm93KQorCQl7CisJCSAgICAvKiBUaGUgc2NyZWVuIGlzIG5vdyBtZXNzZWQgdXAsIG11c3QgcmVkcmF3IHRoZQorCQkgICAgICogY29tbWFuZCBsaW5lIGFuZCBsYXRlciBhbGwgdGhlIHdpbmRvd3MuICovCisJCSAgICByZWRyYXdfYWxsX2xhdGVyKENMRUFSKTsKKwkJICAgIGNtZGxpbmVfcm93IC09IChtc2dfcm93IC0gY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkpOworCQkgICAgcmVkcmF3Y21kKCk7CisJCX0KKwkgICAgfQorCX0KKyNlbmRpZgorCisJaWYgKGNSZWNvcmRzID4gMCkKKwl7CisJICAgIGlmIChpci5FdmVudFR5cGUgPT0gS0VZX0VWRU5UICYmIGlyLkV2ZW50LktleUV2ZW50LmJLZXlEb3duKQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURV9JTUUKKwkJLyogV2luZG93cyBJTUUgc2VuZHMgdHdvICdcbidzIHdpdGggb25seSBvbmUgJ0VOVEVSJy4gIEZpcnN0OgorCQkgKiB3VmlydHVhbEtleUNvZGUgPT0gMTMuIHNlY29uZDogd1ZpcnR1YWxLZXlDb2RlID09IDAgKi8KKwkJaWYgKGlyLkV2ZW50LktleUV2ZW50LnVDaGFyLlVuaWNvZGVDaGFyID09IDAKKwkJCSYmIGlyLkV2ZW50LktleUV2ZW50LndWaXJ0dWFsS2V5Q29kZSA9PSAxMykKKwkJeworCQkgICAgUmVhZENvbnNvbGVJbnB1dChnX2hDb25JbiwgJmlyLCAxLCAmY1JlY29yZHMpOworCQkgICAgY29udGludWU7CisJCX0KKyNlbmRpZgorCQlpZiAoZGVjb2RlX2tleV9ldmVudCgmaXIuRXZlbnQuS2V5RXZlbnQsICZjaCwgJmNoMiwKKwkJCQkJCQkJIE5VTEwsIEZBTFNFKSkKKwkJICAgIHJldHVybiBUUlVFOworCSAgICB9CisKKwkgICAgUmVhZENvbnNvbGVJbnB1dChnX2hDb25JbiwgJmlyLCAxLCAmY1JlY29yZHMpOworCisJICAgIGlmIChpci5FdmVudFR5cGUgPT0gRk9DVVNfRVZFTlQpCisJCWhhbmRsZV9mb2N1c19ldmVudChpcik7CisJICAgIGVsc2UgaWYgKGlyLkV2ZW50VHlwZSA9PSBXSU5ET1dfQlVGRkVSX1NJWkVfRVZFTlQpCisJCXNoZWxsX3Jlc2l6ZWQoKTsKKyNpZmRlZiBGRUFUX01PVVNFCisJICAgIGVsc2UgaWYgKGlyLkV2ZW50VHlwZSA9PSBNT1VTRV9FVkVOVAorCQkgICAgJiYgZGVjb2RlX21vdXNlX2V2ZW50KCZpci5FdmVudC5Nb3VzZUV2ZW50KSkKKwkJcmV0dXJuIFRSVUU7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAobXNlYyA9PSAwKQorCSAgICBicmVhazsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorICAgIC8qIFNvbWV0aGluZyBtaWdodCBoYXZlIGJlZW4gcmVjZWl2ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nLiAqLworICAgIGlmIChpbnB1dF9hdmFpbGFibGUoKSkKKwlyZXR1cm4gVFJVRTsKKyNlbmRpZgorICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmbmRlZiBGRUFUX0dVSV9NU1dJTgorLyoKKyAqIHJldHVybiBub24temVybyBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKKyAqLworICAgIGludAorbWNoX2NoYXJfYXZhaWwoKQoreworICAgIHJldHVybiBXYWl0Rm9yQ2hhcigwTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZSB0aGUgY29uc29sZSBpbnB1dC4gIFVzZWQgd2hlbiByZWFkaW5nIHN0ZGluIGRvZXNuJ3Qgd29yay4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjcmVhdGVfY29uaW4odm9pZCkKK3sKKyAgICBnX2hDb25JbiA9CUNyZWF0ZUZpbGUoIkNPTklOJCIsIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFLAorCQkJRklMRV9TSEFSRV9SRUFEfEZJTEVfU0hBUkVfV1JJVEUsCisJCQkoTFBTRUNVUklUWV9BVFRSSUJVVEVTKSBOVUxMLAorCQkJT1BFTl9FWElTVElORywgKERXT1JEKU5VTEwsIChIQU5ETEUpTlVMTCk7CisgICAgZGlkX2NyZWF0ZV9jb25pbiA9IFRSVUU7Cit9CisKKy8qCisgKiBHZXQgYSBrZXlzdHJva2Ugb3IgYSBtb3VzZSBldmVudAorICovCisgICAgc3RhdGljIGNoYXJfdQordGdldGNoKGludCAqcG1vZGlmaWVycywgY2hhcl91ICpwY2gyKQoreworICAgIGNoYXJfdSBjaDsKKworICAgIGZvciAoOzspCisgICAgeworCUlOUFVUX1JFQ09SRCBpcjsKKwlEV09SRCBjUmVjb3JkcyA9IDA7CisKKyNpZmRlZiBGRUFUX0NMSUVOVFNFUlZFUgorCSh2b2lkKVdhaXRGb3JDaGFyKC0xTCk7CisJaWYgKGlucHV0X2F2YWlsYWJsZSgpKQorCSAgICByZXR1cm4gMDsKKyMgaWZkZWYgRkVBVF9NT1VTRQorCWlmIChnX25Nb3VzZUNsaWNrICE9IC0xKQorCSAgICByZXR1cm4gMDsKKyMgZW5kaWYKKyNlbmRpZgorCWlmIChSZWFkQ29uc29sZUlucHV0KGdfaENvbkluLCAmaXIsIDEsICZjUmVjb3JkcykgPT0gMCkKKwl7CisJICAgIGlmIChkaWRfY3JlYXRlX2NvbmluKQorCQlyZWFkX2Vycm9yX2V4aXQoKTsKKwkgICAgY3JlYXRlX2NvbmluKCk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChpci5FdmVudFR5cGUgPT0gS0VZX0VWRU5UKQorCXsKKwkgICAgaWYgKGRlY29kZV9rZXlfZXZlbnQoJmlyLkV2ZW50LktleUV2ZW50LCAmY2gsIHBjaDIsCisJCQkJCQkJICAgIHBtb2RpZmllcnMsIFRSVUUpKQorCQlyZXR1cm4gY2g7CisJfQorCWVsc2UgaWYgKGlyLkV2ZW50VHlwZSA9PSBGT0NVU19FVkVOVCkKKwkgICAgaGFuZGxlX2ZvY3VzX2V2ZW50KGlyKTsKKwllbHNlIGlmIChpci5FdmVudFR5cGUgPT0gV0lORE9XX0JVRkZFUl9TSVpFX0VWRU5UKQorCSAgICBzaGVsbF9yZXNpemVkKCk7CisjaWZkZWYgRkVBVF9NT1VTRQorCWVsc2UgaWYgKGlyLkV2ZW50VHlwZSA9PSBNT1VTRV9FVkVOVCkKKwl7CisJICAgIGlmIChkZWNvZGVfbW91c2VfZXZlbnQoJmlyLkV2ZW50Lk1vdXNlRXZlbnQpKQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisjZW5kaWYgLyogIUZFQVRfR1VJX1czMiAqLworCisKKy8qCisgKiBtY2hfaW5jaGFyKCk6IGxvdy1sZXZlbCBpbnB1dCBmdW5jaW9uLgorICogR2V0IG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQgb3IgdGhlIG1vdXNlLgorICogSWYgdGltZSA9PSAwLCBkbyBub3Qgd2FpdCBmb3IgY2hhcmFjdGVycy4KKyAqIElmIHRpbWUgPT0gbiwgd2FpdCBhIHNob3J0IHRpbWUgZm9yIGNoYXJhY3RlcnMuCisgKiBJZiB0aW1lID09IC0xLCB3YWl0IGZvcmV2ZXIgZm9yIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8gYnVmLgorICovCisgICAgaW50CittY2hfaW5jaGFyKAorICAgIGNoYXJfdQkqYnVmLAorICAgIGludAkJbWF4bGVuLAorICAgIGxvbmcJdGltZSwKKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQpCit7CisjaWZuZGVmIEZFQVRfR1VJX1czMgkgICAgLyogdGhpcyBpc24ndCB1c2VkIGZvciB0aGUgR1VJICovCisKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWM7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgc3RhdGljIGludAlvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisjZGVmaW5lIFRZUEVBSEVBRExFTiAyMAorICAgIHN0YXRpYyBjaGFyX3UgICB0eXBlYWhlYWRbVFlQRUFIRUFETEVOXTsJLyogcHJldmlvdXNseSB0eXBlZCBieXRlcy4gKi8KKyAgICBzdGF0aWMgaW50CSAgICB0eXBlYWhlYWRsZW4gPSAwOworCisgICAgLyogRmlyc3QgdXNlIGFueSB0eXBlYWhlYWQgdGhhdCB3YXMga2VwdCBiZWNhdXNlICJidWYiIHdhcyB0b28gc21hbGwuICovCisgICAgaWYgKHR5cGVhaGVhZGxlbiA+IDApCisJZ290byB0aGVlbmQ7CisKKyNpZmRlZiBGRUFUX1NOSUZGCisgICAgaWYgKHdhbnRfc25pZmZfcmVxdWVzdCkKKyAgICB7CisJaWYgKHNuaWZmX3JlcXVlc3Rfd2FpdGluZykKKwl7CisJICAgIC8qIHJldHVybiBLX1NOSUZGICovCisJICAgIHR5cGVhaGVhZFt0eXBlYWhlYWRsZW4rK10gPSBDU0k7CisJICAgIHR5cGVhaGVhZFt0eXBlYWhlYWRsZW4rK10gPSAoY2hhcl91KUtTX0VYVFJBOworCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuKytdID0gKGNoYXJfdSlLRV9TTklGRjsKKwkgICAgc25pZmZfcmVxdWVzdF93YWl0aW5nID0gMDsKKwkgICAgd2FudF9zbmlmZl9yZXF1ZXN0ID0gMDsKKwkgICAgZ290byB0aGVlbmQ7CisJfQorCWVsc2UgaWYgKHRpbWUgPCAwIHx8IHRpbWUgPiAyNTApCisJeworCSAgICAvKiBkb24ndCB3YWl0IHRvbyBsb25nLCBhIHJlcXVlc3QgbWlnaHQgYmUgcGVuZGluZyAqLworCSAgICB0aW1lID0gMjUwOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICh0aW1lID49IDApCisgICAgeworCWlmICghV2FpdEZvckNoYXIodGltZSkpICAgICAvKiBubyBjaGFyYWN0ZXIgYXZhaWxhYmxlICovCisJeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCSAgICBvbmNlX2FscmVhZHkgPSAwOworI2VuZGlmCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgZWxzZSAgICAvKiB0aW1lID09IC0xLCB3YWl0IGZvcmV2ZXIgKi8KKyAgICB7CisJbWNoX3NldF93aW5zaXplX25vdygpOwkvKiBBbGxvdyB3aW5zaXplIGNoYW5nZXMgZnJvbSBub3cgb24gKi8KKworI2lmZGVmIEZFQVRfQVVUT0NNRAorCS8qIElmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciBhdmFpbGFibGUgd2l0aGluIDIgc2Vjb25kcyAoZGVmYXVsdCksCisJICogd3JpdGUgdGhlIGF1dG9zY3JpcHQgZmlsZSB0byBkaXNrICovCisJaWYgKG9uY2VfYWxyZWFkeSA9PSAyKQorCSAgICB1cGRhdGVzY3JpcHQoMCk7CisJZWxzZSBpZiAob25jZV9hbHJlYWR5ID09IDEpCisJeworCSAgICBzZXRjdXJzb3IoKTsKKwkgICAgb25jZV9hbHJlYWR5ID0gMjsKKwkgICAgcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBpZiAoIVdhaXRGb3JDaGFyKHBfdXQpKQorCXsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgaWYgKGhhc19jdXJzb3Job2xkKCkgJiYgZ2V0X3JlYWxfc3RhdGUoKSA9PSBOT1JNQUxfQlVTWSkKKwkgICAgeworCQlhcHBseV9hdXRvY21kcyhFVkVOVF9DVVJTT1JIT0xELCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwkJdXBkYXRlX3NjcmVlbihWQUxJRCk7CisJCW9uY2VfYWxyZWFkeSA9IDE7CisJCXJldHVybiAwOworCSAgICB9CisjZW5kaWYKKwkgICAgdXBkYXRlc2NyaXB0KDApOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyeSB0byByZWFkIGFzIG1hbnkgY2hhcmFjdGVycyBhcyB0aGVyZSBhcmUsIHVudGlsIHRoZSBidWZmZXIgaXMgZnVsbC4KKyAgICAgKi8KKworICAgIC8qIHdlIHdpbGwgZ2V0IGF0IGxlYXN0IG9uZSBrZXkuIEdldCBtb3JlIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICBnX2ZDQnJrUHJlc3NlZCA9IEZBTFNFOworCisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKKyAgICBpZiAoZmREdW1wKQorCWZwdXRjKCdbJywgZmREdW1wKTsKKyNlbmRpZgorCisgICAgLyogS2VlcCBsb29waW5nIHVudGlsIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlciBhbmQgbW9yZQorICAgICAqIHRvIGdldCBhbmQgc3RpbGwgcm9vbSBpbiB0aGUgYnVmZmVyICh1cCB0byB0d28gYnl0ZXMgZm9yIGEgY2hhciBhbmQKKyAgICAgKiB0aHJlZSBieXRlcyBmb3IgYSBtb2RpZmllcikuICovCisgICAgd2hpbGUgKCh0eXBlYWhlYWRsZW4gPT0gMCB8fCBXYWl0Rm9yQ2hhcigwTCkpCisJCQkJCSAgJiYgdHlwZWFoZWFkbGVuICsgNSA8PSBUWVBFQUhFQURMRU4pCisgICAgeworCWlmICh0eXBlYnVmX2NoYW5nZWQodGJfY2hhbmdlX2NudCkpCisJeworCSAgICAvKiAiYnVmIiBtYXkgYmUgaW52YWxpZCBub3cgaWYgYSBjbGllbnQgcHV0IHNvbWV0aGluZyBpbiB0aGUKKwkgICAgICogdHlwZWFoZWFkIGJ1ZmZlciBhbmQgImJ1ZiIgaXMgaW4gdGhlIHR5cGVhaGVhZCBidWZmZXIuICovCisJICAgIHR5cGVhaGVhZGxlbiA9IDA7CisJICAgIGJyZWFrOworCX0KKyNpZmRlZiBGRUFUX01PVVNFCisJaWYgKGdfbk1vdXNlQ2xpY2sgIT0gLTEpCisJeworIyBpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCSAgICBpZiAoZmREdW1wKQorCQlmcHJpbnRmKGZkRHVtcCwgInslMDJ4IEAgJWQsICVkfSIsCisJCQlnX25Nb3VzZUNsaWNrLCBnX3hNb3VzZSwgZ195TW91c2UpOworIyBlbmRpZgorCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuKytdID0gRVNDICsgMTI4OworCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuKytdID0gJ00nOworCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuKytdID0gZ19uTW91c2VDbGljazsKKwkgICAgdHlwZWFoZWFkW3R5cGVhaGVhZGxlbisrXSA9IGdfeE1vdXNlICsgJyEnOworCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuKytdID0gZ195TW91c2UgKyAnISc7CisJICAgIGdfbk1vdXNlQ2xpY2sgPSAtMTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBjaGFyX3UJY2gyID0gTlVMOworCSAgICBpbnQJCW1vZGlmaWVycyA9IDA7CisKKwkgICAgYyA9IHRnZXRjaCgmbW9kaWZpZXJzLCAmY2gyKTsKKworCSAgICBpZiAodHlwZWJ1Zl9jaGFuZ2VkKHRiX2NoYW5nZV9jbnQpKQorCSAgICB7CisJCS8qICJidWYiIG1heSBiZSBpbnZhbGlkIG5vdyBpZiBhIGNsaWVudCBwdXQgc29tZXRoaW5nIGluIHRoZQorCQkgKiB0eXBlYWhlYWQgYnVmZmVyIGFuZCAiYnVmIiBpcyBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlci4gKi8KKwkJdHlwZWFoZWFkbGVuID0gMDsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBpZiAoYyA9PSBDdHJsX0MgJiYgY3RybF9jX2ludGVycnVwdHMpCisJICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKQorCQl0cmFzaF9pbnB1dF9idWYoKTsKKyNlbmRpZgorCQlnb3RfaW50ID0gVFJVRTsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9NT1VTRQorCSAgICBpZiAoZ19uTW91c2VDbGljayA9PSAtMSkKKyNlbmRpZgorCSAgICB7CisJCWludAluID0gMTsKKworCQkvKiBBIGtleSBtYXkgaGF2ZSBvbmUgb3IgdHdvIGJ5dGVzLiAqLworCQl0eXBlYWhlYWRbdHlwZWFoZWFkbGVuXSA9IGM7CisJCWlmIChjaDIgIT0gTlVMKQorCQl7CisJCSAgICB0eXBlYWhlYWRbdHlwZWFoZWFkbGVuICsgMV0gPSBjaDI7CisJCSAgICArK247CisJCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJCS8qIE9ubHkgY29udmVydCBub3JtYWwgY2hhcmFjdGVycywgbm90IHNwZWNpYWwga2V5cy4gIE5lZWQgdG8KKwkJICogY29udmVydCBiZWZvcmUgYXBwbHlpbmcgQUxULCBvdGhlcndpc2UgbWFwcGluZyA8TS14PiBicmVha3MKKwkJICogd2hlbiAndGVuYycgaXMgc2V0LiAqLworCQlpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORQorCQkJCQkJJiYgKGNoMiA9PSBOVUwgfHwgYyAhPSBLX05VTCkpCisJCSAgICBuID0gY29udmVydF9pbnB1dCh0eXBlYWhlYWQgKyB0eXBlYWhlYWRsZW4sIG4sCisJCQkJCQkgVFlQRUFIRUFETEVOIC0gdHlwZWFoZWFkbGVuKTsKKyNlbmRpZgorCisJCS8qIFVzZSB0aGUgQUxUIGtleSB0byBzZXQgdGhlIDh0aCBiaXQgb2YgdGhlIGNoYXJhY3RlcgorCQkgKiB3aGVuIGl0J3Mgb25lIGJ5dGUsIHRoZSA4dGggYml0IGlzbid0IHNldCB5ZXQgYW5kIG5vdAorCQkgKiB1c2luZyBhIGRvdWJsZS1ieXRlIGVuY29kaW5nICh3b3VsZCBiZWNvbWUgYSBsZWFkCisJCSAqIGJ5dGUpLiAqLworCQlpZiAoKG1vZGlmaWVycyAmIE1PRF9NQVNLX0FMVCkKKwkJCSYmIG4gPT0gMQorCQkJJiYgKHR5cGVhaGVhZFt0eXBlYWhlYWRsZW5dICYgMHg4MCkgPT0gMAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSYmICFlbmNfZGJjcworI2VuZGlmCisJCSAgICkKKwkJeworCQkgICAgdHlwZWFoZWFkW3R5cGVhaGVhZGxlbl0gfD0gMHg4MDsKKwkJICAgIG1vZGlmaWVycyAmPSB+TU9EX01BU0tfQUxUOworCQl9CisKKwkJaWYgKG1vZGlmaWVycyAhPSAwKQorCQl7CisJCSAgICAvKiBQcmVwZW5kIG1vZGlmaWVycyB0byB0aGUgY2hhcmFjdGVyLiAqLworCQkgICAgbWNoX21lbW1vdmUodHlwZWFoZWFkICsgdHlwZWFoZWFkbGVuICsgMywKKwkJCQkJCSB0eXBlYWhlYWQgKyB0eXBlYWhlYWRsZW4sIG4pOworCQkgICAgdHlwZWFoZWFkW3R5cGVhaGVhZGxlbisrXSA9IEtfU1BFQ0lBTDsKKwkJICAgIHR5cGVhaGVhZFt0eXBlYWhlYWRsZW4rK10gPSAoY2hhcl91KUtTX01PRElGSUVSOworCQkgICAgdHlwZWFoZWFkW3R5cGVhaGVhZGxlbisrXSA9ICBtb2RpZmllcnM7CisJCX0KKworCQl0eXBlYWhlYWRsZW4gKz0gbjsKKworI2lmZGVmIE1DSF9XUklURV9EVU1QCisJCWlmIChmZER1bXApCisJCSAgICBmcHV0YyhjLCBmZER1bXApOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorCisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKKyAgICBpZiAoZmREdW1wKQorICAgIHsKKwlmcHV0cygiXVxuIiwgZmREdW1wKTsKKwlmZmx1c2goZmREdW1wKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIG9uY2VfYWxyZWFkeSA9IDA7CisjZW5kaWYKKwordGhlZW5kOgorICAgIC8qIE1vdmUgdHlwZWFoZWFkIHRvICJidWYiLCBhcyBtdWNoIGFzIGZpdHMuICovCisgICAgbGVuID0gMDsKKyAgICB3aGlsZSAobGVuIDwgbWF4bGVuICYmIHR5cGVhaGVhZGxlbiA+IDApCisgICAgeworCWJ1ZltsZW4rK10gPSB0eXBlYWhlYWRbMF07CisJbWNoX21lbW1vdmUodHlwZWFoZWFkLCB0eXBlYWhlYWQgKyAxLCAtLXR5cGVhaGVhZGxlbik7CisgICAgfQorICAgIHJldHVybiBsZW47CisKKyNlbHNlIC8qIEZFQVRfR1VJX1czMiAqLworICAgIHJldHVybiAwOworI2VuZGlmIC8qIEZFQVRfR1VJX1czMiAqLworfQorCisjaWZuZGVmIF9fTUlOR1czMl9fCisjIGluY2x1ZGUgPHNoZWxsYXBpLmg+CS8qIHJlcXVpcmVkIGZvciBGaW5kRXhlY3V0YWJsZSgpICovCisjZW5kaWYKKworICAgIHN0YXRpYyBpbnQKK2V4ZWN1dGFibGVfZXhpc3RzKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciBsb2NhdGlvblsyICogX01BWF9QQVRIICsgMl07CisgICAgY2hhciB3aWRlbmFtZVsyICogX01BWF9QQVRIXTsKKworICAgIC8qIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gRmluZEV4ZWN1dGFibGVBKCkgb24gV2luZG93cyBOVC4KKyAgICAgKiBVc2UgRmluZEV4ZWN1dGFibGVXKCkgaW5zdGVhZC4uLiAqLworICAgIGlmIChnX1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UKQorICAgIHsKKwlNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgKExQQ1RTVFIpbmFtZSwgLTEsCisJCQkJCQkgKExQV1NUUil3aWRlbmFtZSwgX01BWF9QQVRIKTsKKwlpZiAoRmluZEV4ZWN1dGFibGVXKChMUENXU1RSKXdpZGVuYW1lLCAoTFBDV1NUUikiIiwKKwkJCQkJICAgIChMUFdTVFIpbG9jYXRpb24pID4gKEhJTlNUQU5DRSkzMikKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKEZpbmRFeGVjdXRhYmxlQSgoTFBDVFNUUiluYW1lLCAoTFBDVFNUUikiIiwKKwkJCQkJICAgIChMUFRTVFIpbG9jYXRpb24pID4gKEhJTlNUQU5DRSkzMikKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIEZFQVRfR1VJX1czMgorCisvKgorICogR1VJIHZlcnNpb24gb2YgbWNoX2luaXQoKS4KKyAqLworICAgIHZvaWQKK21jaF9pbml0KCkKK3sKKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgICBleHRlcm4gaW50IF9mbW9kZTsKKyNlbmRpZgorCisgICAgLyogTGV0IGNyaXRpY2FsIGVycm9ycyByZXN1bHQgaW4gYSBmYWlsdXJlLCBub3QgaW4gYSBkaWFsb2cgYm94LiAgUmVxdWlyZWQKKyAgICAgKiBmb3IgdGhlIHRpbWVzdGFtcCB0ZXN0IHRvIHdvcmsgb24gcmVtb3ZlZCBmbG9wcGllcy4gKi8KKyAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CisKKyAgICBfZm1vZGUgPSBPX0JJTkFSWTsJCS8qIHdlIGRvIG91ciBvd24gQ1ItTEYgdHJhbnNsYXRpb24gKi8KKworICAgIC8qIFNwZWNpZnkgd2luZG93IHNpemUuICBJcyB0aGVyZSBhIHBsYWNlIHRvIGdldCB0aGUgZGVmYXVsdCBmcm9tPyAqLworICAgIFJvd3MgPSAyNTsKKyAgICBDb2x1bW5zID0gODA7CisKKyAgICAvKiBMb29rIGZvciAndmltcnVuJyAqLworICAgIGlmICghZ3VpX2lzX3dpbjMycygpKQorICAgIHsKKwljaGFyX3UgdmltcnVuX2xvY2F0aW9uW19NQVhfUEFUSCArIDRdOworCisJLyogRmlyc3QgdHJ5IGluIHNhbWUgZGlyZWN0b3J5IGFzIGd2aW0uZXhlICovCisJU1RSQ1BZKHZpbXJ1bl9sb2NhdGlvbiwgZXhlX25hbWUpOworCVNUUkNQWShnZXR0YWlsKHZpbXJ1bl9sb2NhdGlvbiksICJ2aW1ydW4uZXhlIik7CisJaWYgKG1jaF9nZXRwZXJtKHZpbXJ1bl9sb2NhdGlvbikgPj0gMCkKKwl7CisJICAgIGlmICgqc2tpcHRvd2hpdGUodmltcnVuX2xvY2F0aW9uKSAhPSBOVUwpCisJICAgIHsKKwkJLyogRW5jbG9zZSBwYXRoIHdpdGggd2hpdGUgc3BhY2UgaW4gZG91YmxlIHF1b3Rlcy4gKi8KKwkJbWNoX21lbW1vdmUodmltcnVuX2xvY2F0aW9uICsgMSwgdmltcnVuX2xvY2F0aW9uLAorCQkJCQkJIFNUUkxFTih2aW1ydW5fbG9jYXRpb24pICsgMSk7CisJCSp2aW1ydW5fbG9jYXRpb24gPSAnIic7CisJCVNUUkNQWShnZXR0YWlsKHZpbXJ1bl9sb2NhdGlvbiksICJ2aW1ydW5cIiAiKTsKKwkgICAgfQorCSAgICBlbHNlCisJCVNUUkNQWShnZXR0YWlsKHZpbXJ1bl9sb2NhdGlvbiksICJ2aW1ydW4gIik7CisKKwkgICAgdmltcnVuX3BhdGggPSAoY2hhciAqKXZpbV9zdHJzYXZlKHZpbXJ1bl9sb2NhdGlvbik7CisJICAgIHNfZG9udF91c2VfdmltcnVuID0gRkFMU0U7CisJfQorCWVsc2UgaWYgKGV4ZWN1dGFibGVfZXhpc3RzKCJ2aW1ydW4uZXhlIikpCisJICAgIHNfZG9udF91c2VfdmltcnVuID0gRkFMU0U7CisKKwkvKiBEb24ndCBnaXZlIHRoZSB3YXJuaW5nIGZvciBhIG1pc3NpbmcgdmltcnVuLmV4ZSByaWdodCBub3csIGJ1dCBvbmx5CisJICogd2hlbiB2aW1ydW4gd2FzIHN1cHBvc2VkIHRvIGJlIHVzZWQuICBEb24ndCBib3RoZXIgcGVvcGxlIHRoYXQgZG8KKwkgKiBub3QgbmVlZCB2aW1ydW4uZXhlLiAqLworCWlmIChzX2RvbnRfdXNlX3ZpbXJ1bikKKwkgICAgbmVlZF92aW1ydW5fd2FybmluZyA9IFRSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiAiZmluc3RyLmV4ZSIgZG9lc24ndCBleGlzdCwgdXNlICJncmVwIC1uIiBmb3IgJ2dyZXBwcmcnLgorICAgICAqIE90aGVyd2lzZSB0aGUgZGVmYXVsdCAiZmluZHN0ciAvbiIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBpZiAoIWV4ZWN1dGFibGVfZXhpc3RzKCJmaW5kc3RyLmV4ZSIpKQorCXNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJncmVwcHJnIiwgMCwgKGNoYXJfdSAqKSJncmVwIC1uIiwgMCk7CisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIGNsaXBfaW5pdChUUlVFKTsKKworICAgIC8qCisgICAgICogVmltJ3Mgb3duIGNsaXBib2FyZCBmb3JtYXQgcmVjb2duaXNlcyB3aGV0aGVyIHRoZSB0ZXh0IGlzIGNoYXIsIGxpbmUsIG9yCisgICAgICogcmVjdGFuZ3VsYXIgYmxvY2suICBPbmx5IHVzZWZ1bCBmb3IgY29weWluZyBiZXR3ZWVuIHR3byBWaW1zLgorICAgICAqICJWaW1DbGlwYm9hcmQiIHdhcyB1c2VkIGZvciBwcmV2aW91cyB2ZXJzaW9ucywgdXNpbmcgdGhlIGZpcnN0CisgICAgICogY2hhcmFjdGVyIHRvIHNwZWNpZnkgTUNIQVIsIE1MSU5FIG9yIE1CTE9DSy4KKyAgICAgKi8KKyAgICBjbGlwX3N0YXIuZm9ybWF0ID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoIlZpbUNsaXBib2FyZDIiKTsKKyAgICBjbGlwX3N0YXIuZm9ybWF0X3JhdyA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KCJWaW1SYXdCeXRlcyIpOworI2VuZGlmCit9CisKKworI2Vsc2UgLyogRkVBVF9HVUlfVzMyICovCisKKyNkZWZpbmUgU1JXSURUSChzcikgKChzcikuUmlnaHQgLSAoc3IpLkxlZnQgKyAxKQorI2RlZmluZSBTUkhFSUdIVChzcikgKChzcikuQm90dG9tIC0gKHNyKS5Ub3AgKyAxKQorCisvKgorICogQ2xlYXJDb25zb2xlQnVmZmVyKCkKKyAqIERlc2NyaXB0aW9uOgorICogIENsZWFycyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBjb25zb2xlIHNjcmVlbiBidWZmZXIsIHVzaW5nIHRoZQorICogIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgKiBSZXR1cm5zOgorICogIFRSVUUgb24gc3VjY2VzcworICovCisgICAgc3RhdGljIEJPT0wKK0NsZWFyQ29uc29sZUJ1ZmZlcihXT1JEIHdBdHRyaWJ1dGUpCit7CisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaTsKKyAgICBDT09SRCBjb29yZDsKKyAgICBEV09SRCBOdW1DZWxscywgZHVtbXk7CisKKyAgICBpZiAoIUdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGdfaENvbk91dCwgJmNzYmkpKQorCXJldHVybiBGQUxTRTsKKworICAgIE51bUNlbGxzID0gY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdTaXplLlk7CisgICAgY29vcmQuWCA9IDA7CisgICAgY29vcmQuWSA9IDA7CisgICAgaWYgKCFGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihnX2hDb25PdXQsICcgJywgTnVtQ2VsbHMsCisJICAgIGNvb3JkLCAmZHVtbXkpKQorICAgIHsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoZ19oQ29uT3V0LCB3QXR0cmlidXRlLCBOdW1DZWxscywKKwkgICAgY29vcmQsICZkdW1teSkpCisgICAgeworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEZpdENvbnNvbGVXaW5kb3coKQorICogRGVzY3JpcHRpb246CisgKiAgQ2hlY2tzIGlmIHRoZSBjb25zb2xlIHdpbmRvdyB3aWxsIGZpdCB3aXRoaW4gZ2l2ZW4gYnVmZmVyIGRpbWVuc2lvbnMuCisgKiAgQWxzbywgaWYgcmVxdWVzdGVkLCB3aWxsIHNocmluayB0aGUgd2luZG93IHRvIGZpdC4KKyAqIFJldHVybnM6CisgKiAgVFJVRSBvbiBzdWNjZXNzCisgKi8KKyAgICBzdGF0aWMgQk9PTAorRml0Q29uc29sZVdpbmRvdygKKyAgICBDT09SRCBkd0J1ZmZlclNpemUsCisgICAgQk9PTCBXYW50QWRqdXN0KQoreworICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmk7CisgICAgQ09PUkQgZHdXaW5kb3dTaXplOworICAgIEJPT0wgTmVlZEFkanVzdCA9IEZBTFNFOworCisgICAgaWYgKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGdfaENvbk91dCwgJmNzYmkpKQorICAgIHsKKwkvKgorCSAqIEEgYnVmZmVyIHJlc2l6ZSB3aWxsIGZhaWwgaWYgdGhlIGN1cnJlbnQgY29uc29sZSB3aW5kb3cgZG9lcworCSAqIG5vdCBsaWUgY29tcGxldGVseSB3aXRoaW4gdGhhdCBidWZmZXIuICBUbyBhdm9pZCB0aGlzLCB3ZSBtaWdodAorCSAqIGhhdmUgdG8gbW92ZSBhbmQgcG9zc2libHkgc2hyaW5rIHRoZSB3aW5kb3cuCisJICovCisJaWYgKGNzYmkuc3JXaW5kb3cuUmlnaHQgPj0gZHdCdWZmZXJTaXplLlgpCisJeworCSAgICBkd1dpbmRvd1NpemUuWCA9IFNSV0lEVEgoY3NiaS5zcldpbmRvdyk7CisJICAgIGlmIChkd1dpbmRvd1NpemUuWCA+IGR3QnVmZmVyU2l6ZS5YKQorCQlkd1dpbmRvd1NpemUuWCA9IGR3QnVmZmVyU2l6ZS5YOworCSAgICBjc2JpLnNyV2luZG93LlJpZ2h0ID0gZHdCdWZmZXJTaXplLlggLSAxOworCSAgICBjc2JpLnNyV2luZG93LkxlZnQgPSBkd0J1ZmZlclNpemUuWCAtIGR3V2luZG93U2l6ZS5YOworCSAgICBOZWVkQWRqdXN0ID0gVFJVRTsKKwl9CisJaWYgKGNzYmkuc3JXaW5kb3cuQm90dG9tID49IGR3QnVmZmVyU2l6ZS5ZKQorCXsKKwkgICAgZHdXaW5kb3dTaXplLlkgPSBTUkhFSUdIVChjc2JpLnNyV2luZG93KTsKKwkgICAgaWYgKGR3V2luZG93U2l6ZS5ZID4gZHdCdWZmZXJTaXplLlkpCisJCWR3V2luZG93U2l6ZS5ZID0gZHdCdWZmZXJTaXplLlk7CisJICAgIGNzYmkuc3JXaW5kb3cuQm90dG9tID0gZHdCdWZmZXJTaXplLlkgLSAxOworCSAgICBjc2JpLnNyV2luZG93LlRvcCA9IGR3QnVmZmVyU2l6ZS5ZIC0gZHdXaW5kb3dTaXplLlk7CisJICAgIE5lZWRBZGp1c3QgPSBUUlVFOworCX0KKwlpZiAoTmVlZEFkanVzdCAmJiBXYW50QWRqdXN0KQorCXsKKwkgICAgaWYgKCFTZXRDb25zb2xlV2luZG93SW5mbyhnX2hDb25PdXQsIFRSVUUsICZjc2JpLnNyV2luZG93KSkKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3R5cGVkZWYgc3RydWN0IENvbnNvbGVCdWZmZXJTdHJ1Y3QKK3sKKyAgICBCT09MIElzVmFsaWQ7CisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gSW5mbzsKKyAgICBQQ0hBUl9JTkZPIEJ1ZmZlcjsKKyAgICBDT09SRCBCdWZmZXJTaXplOworfSBDb25zb2xlQnVmZmVyOworCisvKgorICogU2F2ZUNvbnNvbGVCdWZmZXIoKQorICogRGVzY3JpcHRpb246CisgKiAgU2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25zb2xlIGJ1ZmZlciwgaW5jbHVkaW5nIHRoZQorICogIGFjdHVhbCBidWZmZXIgY29udGVudHMuICBUaGUgc2F2ZWQgaW5mb3JtYXRpb24gaXMgc3VpdGFibGUgZm9yIGxhdGVyCisgKiAgcmVzdG9yYXRpb24gYnkgUmVzdG9yZUNvbnNvbGVCdWZmZXIoKS4KKyAqIFJldHVybnM6CisgKiAgVFJVRSBpZiBhbGwgaW5mb3JtYXRpb24gd2FzIHNhdmVkOyBGQUxTRSBvdGhlcndpc2UKKyAqICBJZiBGQUxTRSwgc3RpbGwgc2V0cyBjYi0+SXNWYWxpZCBpZiBidWZmZXIgY2hhcmFjdGVyaXN0aWNzIHdlcmUgc2F2ZWQuCisgKi8KKyAgICBzdGF0aWMgQk9PTAorU2F2ZUNvbnNvbGVCdWZmZXIoCisgICAgQ29uc29sZUJ1ZmZlciAqY2IpCit7CisgICAgRFdPUkQgTnVtQ2VsbHM7CisgICAgQ09PUkQgQnVmZmVyQ29vcmQ7CisgICAgU01BTExfUkVDVCBSZWFkUmVnaW9uOworICAgIFdPUkQgWSwgWV9pbmNyOworCisgICAgaWYgKGNiID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhnX2hDb25PdXQsICZjYi0+SW5mbykpCisgICAgeworCWNiLT5Jc1ZhbGlkID0gRkFMU0U7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBjYi0+SXNWYWxpZCA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgY29uc29sZSBzY3JlZW4KKyAgICAgKiBidWZmZXIuICBJZiB0aGlzIENvbnNvbGVCdWZmZXIgc3RydWN0dXJlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKKyAgICAgKiB3aXRoIGEgYnVmZmVyIG9mIHRoZSBjb3JyZWN0IHNpemUsIHRoZW4ganVzdCB1c2UgdGhhdCBvbmUuCisgICAgICovCisgICAgaWYgKCFjYi0+SXNWYWxpZCB8fCBjYi0+QnVmZmVyID09IE5VTEwgfHwKKwkgICAgY2ItPkJ1ZmZlclNpemUuWCAhPSBjYi0+SW5mby5kd1NpemUuWCB8fAorCSAgICBjYi0+QnVmZmVyU2l6ZS5ZICE9IGNiLT5JbmZvLmR3U2l6ZS5ZKQorICAgIHsKKwljYi0+QnVmZmVyU2l6ZS5YID0gY2ItPkluZm8uZHdTaXplLlg7CisJY2ItPkJ1ZmZlclNpemUuWSA9IGNiLT5JbmZvLmR3U2l6ZS5ZOworCU51bUNlbGxzID0gY2ItPkJ1ZmZlclNpemUuWCAqIGNiLT5CdWZmZXJTaXplLlk7CisJaWYgKGNiLT5CdWZmZXIgIT0gTlVMTCkKKwkgICAgdmltX2ZyZWUoY2ItPkJ1ZmZlcik7CisJY2ItPkJ1ZmZlciA9IChQQ0hBUl9JTkZPKWFsbG9jKE51bUNlbGxzICogc2l6ZW9mKENIQVJfSU5GTykpOworCWlmIChjYi0+QnVmZmVyID09IE5VTEwpCisJICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIHdpbGwgbm93IGNvcHkgdGhlIGNvbnNvbGUgc2NyZWVuIGJ1ZmZlciBpbnRvIG91ciBidWZmZXIuCisgICAgICogUmVhZENvbnNvbGVPdXRwdXQoKSBzZWVtcyB0byBiZSBsaW1pdGVkIGFzIGZhciBhcyBob3cgbXVjaCB5b3UKKyAgICAgKiBjYW4gcmVhZCBhdCBhIHRpbWUuICBFbXBpcmljYWxseSwgdGhpcyBudW1iZXIgc2VlbXMgdG8gYmUgYWJvdXQKKyAgICAgKiAxMjAwMCBjZWxscyAocm93cyAqIGNvbHVtbnMpLiAgU3RhcnQgYXQgcG9zaXRpb24gKDAsIDApIGFuZCBjb3B5CisgICAgICogaW4gY2h1bmtzIHVudGlsIGl0IGlzIGFsbCBjb3BpZWQuICBUaGUgY2h1bmtzIHdpbGwgYWxsIGhhdmUgdGhlCisgICAgICogc2FtZSBob3Jpem9udGFsIGNoYXJhY3RlcmlzdGljcywgc28gaW5pdGlhbGl6ZSB0aGVtIG5vdy4gIFRoZQorICAgICAqIGhlaWdodCBvZiBlYWNoIGNodW5rIHdpbGwgYmUgKDEyMDAwIC8gd2lkdGgpLgorICAgICAqLworICAgIEJ1ZmZlckNvb3JkLlggPSAwOworICAgIFJlYWRSZWdpb24uTGVmdCA9IDA7CisgICAgUmVhZFJlZ2lvbi5SaWdodCA9IGNiLT5JbmZvLmR3U2l6ZS5YIC0gMTsKKyAgICBZX2luY3IgPSAxMjAwMCAvIGNiLT5JbmZvLmR3U2l6ZS5YOworICAgIGZvciAoWSA9IDA7IFkgPCBjYi0+QnVmZmVyU2l6ZS5ZOyBZICs9IFlfaW5jcikKKyAgICB7CisJLyoKKwkgKiBSZWFkIGludG8gcG9zaXRpb24gKDAsIFkpIGluIG91ciBidWZmZXIuCisJICovCisJQnVmZmVyQ29vcmQuWSA9IFk7CisJLyoKKwkgKiBSZWFkIHRoZSByZWdpb24gd2hvc2UgdG9wIGxlZnQgY29ybmVyIGlzICgwLCBZKSBhbmQgd2hvc2UgYm90dG9tCisJICogcmlnaHQgY29ybmVyIGlzICh3aWR0aCAtIDEsIFkgKyBZX2luY3IgLSAxKS4gIFRoaXMgc2hvdWxkIGRlZmluZQorCSAqIGEgcmVnaW9uIG9mIHNpemUgd2lkdGggYnkgWV9pbmNyLiAgRG9uJ3Qgd29ycnkgaWYgdGhpcyByZWdpb24gaXMKKwkgKiB0b28gbGFyZ2UgZm9yIHRoZSByZW1haW5pbmcgYnVmZmVyOyBpdCB3aWxsIGJlIGNyb3BwZWQuCisJICovCisJUmVhZFJlZ2lvbi5Ub3AgPSBZOworCVJlYWRSZWdpb24uQm90dG9tID0gWSArIFlfaW5jciAtIDE7CisJaWYgKCFSZWFkQ29uc29sZU91dHB1dChnX2hDb25PdXQsCS8qIG91dHB1dCBoYW5kbGUgKi8KKwkJY2ItPkJ1ZmZlciwJCQkvKiBvdXIgYnVmZmVyICovCisJCWNiLT5CdWZmZXJTaXplLAkJCS8qIGRpbWVuc2lvbnMgb2Ygb3VyIGJ1ZmZlciAqLworCQlCdWZmZXJDb29yZCwJCQkvKiBvZmZzZXQgaW4gb3VyIGJ1ZmZlciAqLworCQkmUmVhZFJlZ2lvbikpCQkJLyogcmVnaW9uIHRvIHNhdmUgKi8KKwl7CisJICAgIHZpbV9mcmVlKGNiLT5CdWZmZXIpOworCSAgICBjYi0+QnVmZmVyID0gTlVMTDsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFJlc3RvcmVDb25zb2xlQnVmZmVyKCkKKyAqIERlc2NyaXB0aW9uOgorICogIFJlc3RvcmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc29sZSBidWZmZXIsIGluY2x1ZGluZyB0aGUKKyAqICBhY3R1YWwgYnVmZmVyIGNvbnRlbnRzLCBpZiBkZXNpcmVkLiAgVGhlIGluZm9ybWF0aW9uIHRvIHJlc3RvcmUgaXMgaW4KKyAqICB0aGUgc2FtZSBmb3JtYXQgdXNlZCBieSBTYXZlQ29uc29sZUJ1ZmZlcigpLgorICogUmV0dXJuczoKKyAqICBUUlVFIG9uIHN1Y2Nlc3MKKyAqLworICAgIHN0YXRpYyBCT09MCitSZXN0b3JlQ29uc29sZUJ1ZmZlcigKKyAgICBDb25zb2xlQnVmZmVyICpjYiwKKyAgICBCT09MIFJlc3RvcmVTY3JlZW4pCit7CisgICAgQ09PUkQgQnVmZmVyQ29vcmQ7CisgICAgU01BTExfUkVDVCBXcml0ZVJlZ2lvbjsKKworICAgIGlmIChjYiA9PSBOVUxMIHx8ICFjYi0+SXNWYWxpZCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKgorICAgICAqIEJlZm9yZSByZXN0b3JpbmcgdGhlIGJ1ZmZlciBjb250ZW50cywgY2xlYXIgdGhlIGN1cnJlbnQgYnVmZmVyLCBhbmQKKyAgICAgKiByZXN0b3JlIHRoZSBjdXJzb3IgcG9zaXRpb24gYW5kIHdpbmRvdyBpbmZvcm1hdGlvbi4gIERvaW5nIHRoaXMgbm93CisgICAgICogcHJldmVudHMgb2xkIGJ1ZmZlciBjb250ZW50cyBmcm9tICJmbGFzaGluZyIgb250byB0aGUgc2NyZWVuLgorICAgICAqLworICAgIGlmIChSZXN0b3JlU2NyZWVuKQorCUNsZWFyQ29uc29sZUJ1ZmZlcihjYi0+SW5mby53QXR0cmlidXRlcyk7CisKKyAgICBGaXRDb25zb2xlV2luZG93KGNiLT5JbmZvLmR3U2l6ZSwgVFJVRSk7CisgICAgaWYgKCFTZXRDb25zb2xlU2NyZWVuQnVmZmVyU2l6ZShnX2hDb25PdXQsIGNiLT5JbmZvLmR3U2l6ZSkpCisJcmV0dXJuIEZBTFNFOworICAgIGlmICghU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoZ19oQ29uT3V0LCBjYi0+SW5mby53QXR0cmlidXRlcykpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFSZXN0b3JlU2NyZWVuKQorICAgIHsKKwkvKgorCSAqIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgc2NyZWVuIGJ1ZmZlciBjb250ZW50cywgc28gd2UncmUgZG9uZS4KKwkgKi8KKwlyZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoIVNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihnX2hDb25PdXQsIGNiLT5JbmZvLmR3Q3Vyc29yUG9zaXRpb24pKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAoIVNldENvbnNvbGVXaW5kb3dJbmZvKGdfaENvbk91dCwgVFJVRSwgJmNiLT5JbmZvLnNyV2luZG93KSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIHNjcmVlbiBidWZmZXIgY29udGVudHMuCisgICAgICovCisgICAgaWYgKGNiLT5CdWZmZXIgIT0gTlVMTCkKKyAgICB7CisJQnVmZmVyQ29vcmQuWCA9IDA7CisJQnVmZmVyQ29vcmQuWSA9IDA7CisJV3JpdGVSZWdpb24uTGVmdCA9IDA7CisJV3JpdGVSZWdpb24uVG9wID0gMDsKKwlXcml0ZVJlZ2lvbi5SaWdodCA9IGNiLT5JbmZvLmR3U2l6ZS5YIC0gMTsKKwlXcml0ZVJlZ2lvbi5Cb3R0b20gPSBjYi0+SW5mby5kd1NpemUuWSAtIDE7CisJaWYgKCFXcml0ZUNvbnNvbGVPdXRwdXQoZ19oQ29uT3V0LAkvKiBvdXRwdXQgaGFuZGxlICovCisJCWNiLT5CdWZmZXIsCQkJLyogb3VyIGJ1ZmZlciAqLworCQljYi0+QnVmZmVyU2l6ZSwJCQkvKiBkaW1lbnNpb25zIG9mIG91ciBidWZmZXIgKi8KKwkJQnVmZmVyQ29vcmQsCQkJLyogb2Zmc2V0IGluIG91ciBidWZmZXIgKi8KKwkJJldyaXRlUmVnaW9uKSkJCQkvKiByZWdpb24gdG8gcmVzdG9yZSAqLworCXsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEZFQVRfUkVTVE9SRV9PUklHX1NDUkVFTgorc3RhdGljIENvbnNvbGVCdWZmZXIgZ19jYk9yaWcgPSB7IDAgfTsKKyNlbmRpZgorc3RhdGljIENvbnNvbGVCdWZmZXIgZ19jYk5vblRlcm1jYXAgPSB7IDAgfTsKK3N0YXRpYyBDb25zb2xlQnVmZmVyIGdfY2JUZXJtY2FwID0geyAwIH07CisKKyNpZmRlZiBGRUFUX1RJVExFCisjaWZkZWYgX19CT1JMQU5EQ19fCit0eXBlZGVmIEhXTkQgKF9fc3RkY2FsbCAqR0VUQ09OU09MRVdJTkRPV1BST0MpKFZPSUQpOworI2Vsc2UKK3R5cGVkZWYgV0lOQkFTRUFQSSBIV05EIChXSU5BUEkgKkdFVENPTlNPTEVXSU5ET1dQUk9DKShWT0lEKTsKKyNlbmRpZgorY2hhciBnX3N6T3JpZ1RpdGxlWzI1Nl0gPSB7IDAgfTsKK0hXTkQgZ19oV25kID0gTlVMTDsJLyogYWxzbyB1c2VkIGluIG9zX21zd2luLmMgKi8KK3N0YXRpYyBISUNPTiBnX2hPcmlnSWNvblNtYWxsID0gTlVMTDsKK3N0YXRpYyBISUNPTiBnX2hPcmlnSWNvbiA9IE5VTEw7CitzdGF0aWMgSElDT04gZ19oVmltSWNvbiA9IE5VTEw7CitzdGF0aWMgQk9PTCBnX2ZDYW5DaGFuZ2VJY29uID0gRkFMU0U7CisKKy8qIElDT04qIGFyZSBub3QgZGVmaW5lZCBpbiBWQysrIDQuMCAqLworI2lmbmRlZiBJQ09OX1NNQUxMCisjZGVmaW5lIElDT05fU01BTEwgMAorI2VuZGlmCisjaWZuZGVmIElDT05fQklHCisjZGVmaW5lIElDT05fQklHIDEKKyNlbmRpZgorLyoKKyAqIEdldENvbnNvbGVJY29uKCkKKyAqIERlc2NyaXB0aW9uOgorICogIEF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBzbWFsbCBpY29uIGFuZC9vciB0aGUgYmlnIGljb24gY3VycmVudGx5IGluCisgKiAgdXNlIGJ5IGEgZ2l2ZW4gd2luZG93LgorICogUmV0dXJuczoKKyAqICBUUlVFIG9uIHN1Y2Nlc3MKKyAqLworICAgIHN0YXRpYyBCT09MCitHZXRDb25zb2xlSWNvbigKKyAgICBIV05EIGhXbmQsCisgICAgSElDT04gKnBoSWNvblNtYWxsLAorICAgIEhJQ09OICpwaEljb24pCit7CisgICAgaWYgKGhXbmQgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocGhJY29uU21hbGwgIT0gTlVMTCkKKyAgICB7CisJKnBoSWNvblNtYWxsID0gKEhJQ09OKSBTZW5kTWVzc2FnZShoV25kLCBXTV9HRVRJQ09OLAorCQkJICAgIChXUEFSQU0pIElDT05fU01BTEwsIChMUEFSQU0pIDApOworICAgIH0KKyAgICBpZiAocGhJY29uICE9IE5VTEwpCisgICAgeworCSpwaEljb24gPSAoSElDT04pIFNlbmRNZXNzYWdlKGhXbmQsIFdNX0dFVElDT04sCisJCQkgICAgKFdQQVJBTSkgSUNPTl9CSUcsIChMUEFSQU0pIDApOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFNldENvbnNvbGVJY29uKCkKKyAqIERlc2NyaXB0aW9uOgorICogIEF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgc21hbGwgaWNvbiBhbmQvb3IgdGhlIGJpZyBpY29uIGN1cnJlbnRseSBpbgorICogIHVzZSBieSBhIGdpdmVuIHdpbmRvdy4KKyAqIFJldHVybnM6CisgKiAgVFJVRSBvbiBzdWNjZXNzCisgKi8KKyAgICBzdGF0aWMgQk9PTAorU2V0Q29uc29sZUljb24oCisgICAgSFdORCBoV25kLAorICAgIEhJQ09OIGhJY29uU21hbGwsCisgICAgSElDT04gaEljb24pCit7CisgICAgSElDT04gaFByZXZJY29uU21hbGw7CisgICAgSElDT04gaFByZXZJY29uOworCisgICAgaWYgKGhXbmQgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoaEljb25TbWFsbCAhPSBOVUxMKQorICAgIHsKKwloUHJldkljb25TbWFsbCA9IChISUNPTikgU2VuZE1lc3NhZ2UoaFduZCwgV01fU0VUSUNPTiwKKwkJCSAgICAoV1BBUkFNKSBJQ09OX1NNQUxMLCAoTFBBUkFNKSBoSWNvblNtYWxsKTsKKyAgICB9CisgICAgaWYgKGhJY29uICE9IE5VTEwpCisgICAgeworCWhQcmV2SWNvbiA9IChISUNPTikgU2VuZE1lc3NhZ2UoaFduZCwgV01fU0VUSUNPTiwKKwkJCSAgICAoV1BBUkFNKSBJQ09OX0JJRywgKExQQVJBTSkgaEljb24pOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFNhdmVDb25zb2xlVGl0bGVBbmRJY29uKCkKKyAqIERlc2NyaXB0aW9uOgorICogIFNhdmVzIHRoZSBjdXJyZW50IGNvbnNvbGUgd2luZG93IHRpdGxlIGluIGdfc3pPcmlnVGl0bGUsIGZvciBsYXRlcgorICogIHJlc3RvcmF0aW9uLiAgQWxzbywgYXR0ZW1wdHMgdG8gb2J0YWluIGEgaGFuZGxlIHRvIHRoZSBjb25zb2xlIHdpbmRvdywKKyAqICBhbmQgdXNlIGl0IHRvIHNhdmUgdGhlIHNtYWxsIGFuZCBiaWcgaWNvbnMgY3VycmVudGx5IGluIHVzZSBieSB0aGUKKyAqICBjb25zb2xlIHdpbmRvdy4gIFRoaXMgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSBvbiBzb21lIHZlcnNpb25zIG9mIFdpbmRvd3M7CisgKiAgbm9yIGlzIGl0IHBvc3NpYmxlIHdoZW4gcnVubmluZyBWaW0gcmVtb3RlbHkgdXNpbmcgVGVsbmV0IChzaW5jZSB0aGUKKyAqICBjb25zb2xlIHdpbmRvdyB0aGUgdXNlciBzZWVzIGlzIG93bmVkIGJ5IGEgcmVtb3RlIHByb2Nlc3MpLgorICovCisgICAgc3RhdGljIHZvaWQKK1NhdmVDb25zb2xlVGl0bGVBbmRJY29uKHZvaWQpCit7CisgICAgR0VUQ09OU09MRVdJTkRPV1BST0MgR2V0Q29uc29sZVdpbmRvd1Byb2M7CisKKyAgICAvKiBTYXZlIHRoZSBvcmlnaW5hbCB0aXRsZS4gKi8KKyAgICBpZiAoIUdldENvbnNvbGVUaXRsZShnX3N6T3JpZ1RpdGxlLCBzaXplb2YoZ19zek9yaWdUaXRsZSkpKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBjb25zb2xlIHdpbmRvdyB1c2luZyBHZXRDb25zb2xlV2luZG93KCkgZnJvbQorICAgICAqIEtFUk5FTDMyLkRMTDsgd2UgbmVlZCB0byBoYW5kbGUgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSB3aW5kb3cgaWNvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIG9uIE5ULWJhc2VkIFdpbmRvd3MsIHN0YXJ0aW5nIHdpdGggV2luZG93cworICAgICAqIDIwMDAuICBPbiBvbGRlciBvcGVyYXRpbmcgc3lzdGVtcywgd2UgY2FuJ3QgY2hhbmdlIHRoZSB3aW5kb3cgaWNvbgorICAgICAqIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoKEdldENvbnNvbGVXaW5kb3dQcm9jID0gKEdFVENPTlNPTEVXSU5ET1dQUk9DKQorCSAgICBHZXRQcm9jQWRkcmVzcyhHZXRNb2R1bGVIYW5kbGUoIktFUk5FTDMyLkRMTCIpLAorCQkgICAgIkdldENvbnNvbGVXaW5kb3ciKSkgIT0gTlVMTCkKKyAgICB7CisJZ19oV25kID0gKCpHZXRDb25zb2xlV2luZG93UHJvYykoKTsKKyAgICB9CisgICAgaWYgKGdfaFduZCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIFNhdmUgdGhlIG9yaWdpbmFsIGNvbnNvbGUgd2luZG93IGljb24uICovCisgICAgR2V0Q29uc29sZUljb24oZ19oV25kLCAmZ19oT3JpZ0ljb25TbWFsbCwgJmdfaE9yaWdJY29uKTsKKyAgICBpZiAoZ19oT3JpZ0ljb25TbWFsbCA9PSBOVUxMIHx8IGdfaE9yaWdJY29uID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyogRXh0cmFjdCB0aGUgZmlyc3QgaWNvbiBjb250YWluZWQgaW4gdGhlIFZpbSBleGVjdXRhYmxlLiAqLworICAgIGdfaFZpbUljb24gPSBFeHRyYWN0SWNvbihOVUxMLCBleGVfbmFtZSwgMCk7CisgICAgaWYgKGdfaFZpbUljb24gIT0gTlVMTCkKKwlnX2ZDYW5DaGFuZ2VJY29uID0gVFJVRTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdfZldpbmRJbml0Q2FsbGVkID0gRkFMU0U7CitzdGF0aWMgaW50IGdfZlRlcm1jYXBNb2RlID0gRkFMU0U7CitzdGF0aWMgQ09OU09MRV9DVVJTT1JfSU5GTyBnX2NjaTsKK3N0YXRpYyBEV09SRCBnX2Ntb2RlaW4gPSAwOworc3RhdGljIERXT1JEIGdfY21vZGVvdXQgPSAwOworCisvKgorICogbm9uLUdVSSB2ZXJzaW9uIG9mIG1jaF9pbml0KCkuCisgKi8KKyAgICB2b2lkCittY2hfaW5pdCgpCit7CisjaWZuZGVmIEZFQVRfUkVTVE9SRV9PUklHX1NDUkVFTgorICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmk7CisjZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgICBleHRlcm4gaW50IF9mbW9kZTsKKyNlbmRpZgorCisgICAgLyogTGV0IGNyaXRpY2FsIGVycm9ycyByZXN1bHQgaW4gYSBmYWlsdXJlLCBub3QgaW4gYSBkaWFsb2cgYm94LiAgUmVxdWlyZWQKKyAgICAgKiBmb3IgdGhlIHRpbWVzdGFtcCB0ZXN0IHRvIHdvcmsgb24gcmVtb3ZlZCBmbG9wcGllcy4gKi8KKyAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CisKKyAgICBfZm1vZGUgPSBPX0JJTkFSWTsJCS8qIHdlIGRvIG91ciBvd24gQ1ItTEYgdHJhbnNsYXRpb24gKi8KKyAgICBvdXRfZmx1c2goKTsKKworICAgIC8qIE9idGFpbiBoYW5kbGVzIGZvciB0aGUgc3RhbmRhcmQgQ29uc29sZSBJL08gZGV2aWNlcyAqLworICAgIGlmIChyZWFkX2NtZF9mZCA9PSAwKQorCWdfaENvbkluID0gIEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKKyAgICBlbHNlCisJY3JlYXRlX2NvbmluKCk7CisgICAgZ19oQ29uT3V0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKworI2lmZGVmIEZFQVRfUkVTVE9SRV9PUklHX1NDUkVFTgorICAgIC8qIFNhdmUgdGhlIGluaXRpYWwgY29uc29sZSBidWZmZXIgZm9yIGxhdGVyIHJlc3RvcmF0aW9uICovCisgICAgU2F2ZUNvbnNvbGVCdWZmZXIoJmdfY2JPcmlnKTsKKyAgICBnX2F0dHJDdXJyZW50ID0gZ19hdHRyRGVmYXVsdCA9IGdfY2JPcmlnLkluZm8ud0F0dHJpYnV0ZXM7CisjZWxzZQorICAgIC8qIEdldCBjdXJyZW50IHRleHQgYXR0cmlidXRlcyAqLworICAgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGdfaENvbk91dCwgJmNzYmkpOworICAgIGdfYXR0ckN1cnJlbnQgPSBnX2F0dHJEZWZhdWx0ID0gY3NiaS53QXR0cmlidXRlczsKKyNlbmRpZgorICAgIGlmIChjdGVybV9ub3JtYWxfZmdfY29sb3IgPT0gMCkKKwljdGVybV9ub3JtYWxfZmdfY29sb3IgPSAoZ19hdHRyQ3VycmVudCAmIDB4ZikgKyAxOworICAgIGlmIChjdGVybV9ub3JtYWxfYmdfY29sb3IgPT0gMCkKKwljdGVybV9ub3JtYWxfYmdfY29sb3IgPSAoKGdfYXR0ckN1cnJlbnQgPj4gNCkgJiAweGYpICsgMTsKKworICAgIC8qIHNldCB0ZXJtY2FwIGNvZGVzIHRvIGN1cnJlbnQgdGV4dCBhdHRyaWJ1dGVzICovCisgICAgdXBkYXRlX3RjYXAoZ19hdHRyQ3VycmVudCk7CisKKyAgICBHZXRDb25zb2xlQ3Vyc29ySW5mbyhnX2hDb25PdXQsICZnX2NjaSk7CisgICAgR2V0Q29uc29sZU1vZGUoZ19oQ29uSW4sICAmZ19jbW9kZWluKTsKKyAgICBHZXRDb25zb2xlTW9kZShnX2hDb25PdXQsICZnX2Ntb2Rlb3V0KTsKKworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBTYXZlQ29uc29sZVRpdGxlQW5kSWNvbigpOworICAgIC8qCisgICAgICogU2V0IGJvdGggdGhlIHNtYWxsIGFuZCBiaWcgaWNvbnMgb2YgdGhlIGNvbnNvbGUgd2luZG93IHRvIFZpbSdzIGljb24uCisgICAgICogTm90ZSB0aGF0IFZpbSBwcmVzZW50bHkgb25seSBoYXMgb25lIHNpemUgb2YgaWNvbiAoMzJ4MzIpLCBidXQgaXQKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGdldHMgc2NhbGVkIGRvd24gdG8gMTZ4MTYgd2hlbiBzZXR0aW5nIHRoZSBzbWFsbCBpY29uLgorICAgICAqLworICAgIGlmIChnX2ZDYW5DaGFuZ2VJY29uKQorCVNldENvbnNvbGVJY29uKGdfaFduZCwgZ19oVmltSWNvbiwgZ19oVmltSWNvbik7CisjZW5kaWYKKworICAgIHVpX2dldF9zaGVsbHNpemUoKTsKKworI2lmZGVmIE1DSF9XUklURV9EVU1QCisgICAgZmREdW1wID0gZm9wZW4oImR1bXAiLCAid3QiKTsKKworICAgIGlmIChmZER1bXApCisgICAgeworCXRpbWVfdCB0OworCisJdGltZSgmdCk7CisJZnB1dHMoY3RpbWUoJnQpLCBmZER1bXApOworCWZmbHVzaChmZER1bXApOworICAgIH0KKyNlbmRpZgorCisgICAgZ19mV2luZEluaXRDYWxsZWQgPSBUUlVFOworCisjaWZkZWYgRkVBVF9NT1VTRQorICAgIGdfZk1vdXNlQXZhaWwgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX01PVVNFUFJFU0VOVCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgY2xpcF9pbml0KFRSVUUpOworCisgICAgLyoKKyAgICAgKiBWaW0ncyBvd24gY2xpcGJvYXJkIGZvcm1hdCByZWNvZ25pc2VzIHdoZXRoZXIgdGhlIHRleHQgaXMgY2hhciwgbGluZSwgb3IKKyAgICAgKiByZWN0YW5ndWxhciBibG9jay4gIE9ubHkgdXNlZnVsIGZvciBjb3B5aW5nIGJldHdlZW4gdHdvIFZpbXMuCisgICAgICogIlZpbUNsaXBib2FyZCIgd2FzIHVzZWQgZm9yIHByZXZpb3VzIHZlcnNpb25zLCB1c2luZyB0aGUgZmlyc3QKKyAgICAgKiBjaGFyYWN0ZXIgdG8gc3BlY2lmeSBNQ0hBUiwgTUxJTkUgb3IgTUJMT0NLLgorICAgICAqLworICAgIGNsaXBfc3Rhci5mb3JtYXQgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdCgiVmltQ2xpcGJvYXJkMiIpOworICAgIGNsaXBfc3Rhci5mb3JtYXRfcmF3ID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoIlZpbVJhd0J5dGVzIik7CisjZW5kaWYKKworICAgIC8qIFRoaXMgd2lsbCBiZSBOVUxMIG9uIGFueXRoaW5nIGJ1dCBOVCA0LjAgKi8KKyAgICBzX3BmbkdldENvbnNvbGVLZXlib2FyZExheW91dE5hbWUgPQorCShQRk5HQ0tMTikgR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlKCJrZXJuZWwzMi5kbGwiKSwKKwkJCQkgICJHZXRDb25zb2xlS2V5Ym9hcmRMYXlvdXROYW1lQSIpOworfQorCisvKgorICogbm9uLUdVSSB2ZXJzaW9uIG9mIG1jaF9leGl0KCkuCisgKiBTaHV0IGRvd24gYW5kIGV4aXQgd2l0aCBzdGF0dXMgYHInCisgKiBDYXJlZnVsOiBtY2hfZXhpdCgpIG1heSBiZSBjYWxsZWQgYmVmb3JlIG1jaF9pbml0KCkhCisgKi8KKyAgICB2b2lkCittY2hfZXhpdChpbnQgcikKK3sKKyAgICBzdG9wdGVybWNhcCgpOworCisgICAgaWYgKGdfZldpbmRJbml0Q2FsbGVkKQorCXNldHRtb2RlKFRNT0RFX0NPT0spOworCisgICAgbWxfY2xvc2VfYWxsKFRSVUUpOwkJLyogcmVtb3ZlIGFsbCBtZW1maWxlcyAqLworCisgICAgaWYgKGdfZldpbmRJbml0Q2FsbGVkKQorICAgIHsKKyNpZmRlZiBGRUFUX1RJVExFCisJbWNoX3Jlc3RvcmVfdGl0bGUoMyk7CisJLyoKKwkgKiBSZXN0b3JlIGJvdGggdGhlIHNtYWxsIGFuZCBiaWcgaWNvbnMgb2YgdGhlIGNvbnNvbGUgd2luZG93IHRvCisJICogd2hhdCB0aGV5IHdlcmUgYXQgc3RhcnR1cC4gIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgd2luZG93IGlzCisJICogY2xvc2VkLCBWaW0gd291bGQgaGFuZyBoZXJlLgorCSAqLworCWlmIChnX2ZDYW5DaGFuZ2VJY29uICYmICFnX2ZGb3JjZUV4aXQpCisJICAgIFNldENvbnNvbGVJY29uKGdfaFduZCwgZ19oT3JpZ0ljb25TbWFsbCwgZ19oT3JpZ0ljb24pOworI2VuZGlmCisKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCWlmIChmZER1bXApCisJeworCSAgICB0aW1lX3QgdDsKKworCSAgICB0aW1lKCZ0KTsKKwkgICAgZnB1dHMoY3RpbWUoJnQpLCBmZER1bXApOworCSAgICBmY2xvc2UoZmREdW1wKTsKKwl9CisJZmREdW1wID0gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIFNldENvbnNvbGVDdXJzb3JJbmZvKGdfaENvbk91dCwgJmdfY2NpKTsKKyAgICBTZXRDb25zb2xlTW9kZShnX2hDb25JbiwgIGdfY21vZGVpbik7CisgICAgU2V0Q29uc29sZU1vZGUoZ19oQ29uT3V0LCBnX2Ntb2Rlb3V0KTsKKworI2lmZGVmIERZTkFNSUNfR0VUVEVYVAorICAgIGR5bl9saWJpbnRsX2VuZCgpOworI2VuZGlmCisKKyAgICBleGl0KHIpOworfQorI2VuZGlmIC8qICFGRUFUX0dVSV9XMzIgKi8KKworCisvKgorICogRG8gd2UgaGF2ZSBhbiBpbnRlcmFjdGl2ZSB3aW5kb3c/CisgKi8KKyAgICBpbnQKK21jaF9jaGVja193aW4oCisgICAgaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgICAgZ2V0X2V4ZV9uYW1lKCk7CisKKyNpZmRlZiBGRUFUX0dVSV9XMzIKKyAgICByZXR1cm4gT0s7CSAgICAvKiBHVUkgYWx3YXlzIGhhcyBhIHR0eSAqLworI2Vsc2UKKyAgICBpZiAoaXNhdHR5KDEpKQorCXJldHVybiBPSzsKKyAgICByZXR1cm4gRkFJTDsKKyNlbmRpZgorfQorCisKKy8qCisgKiBmbmFtZV9jYXNlKCk6IFNldCB0aGUgY2FzZSBvZiB0aGUgZmlsZSBuYW1lLCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqIFdoZW4gImxlbiIgaXMgPiAwLCBhbHNvIGV4cGFuZCBzaG9ydCB0byBsb25nIGZpbGVuYW1lcy4KKyAqLworICAgIHZvaWQKK2ZuYW1lX2Nhc2UoCisgICAgY2hhcl91CSpuYW1lLAorICAgIGludAkJbGVuKQoreworICAgIGNoYXIJCXN6VHJ1ZU5hbWVbX01BWF9QQVRIICsgMl07CisgICAgY2hhcgkJKnB0cnVlLCAqcHRydWVQcmV2OworICAgIGNoYXIJCSpwb3JpZywgKnBvcmlnUHJldjsKKyAgICBpbnQJCQlmbGVuOworICAgIFdJTjMyX0ZJTkRfREFUQQlmYjsKKyAgICBIQU5ETEUJCWhGaW5kOworICAgIGludAkJCWM7CisKKyAgICBmbGVuID0gKG5hbWUgIT0gTlVMTCkgPyAoaW50KVNUUkxFTihuYW1lKSA6IDA7CisgICAgaWYgKGZsZW4gPT0gMCB8fCBmbGVuID4gX01BWF9QQVRIKQorCXJldHVybjsKKworICAgIHNsYXNoX2FkanVzdChuYW1lKTsKKworICAgIC8qIEJ1aWxkIHRoZSBuZXcgbmFtZSBpbiBzelRydWVOYW1lW10gb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuICovCisgICAgcG9yaWcgPSBuYW1lOworICAgIHB0cnVlID0gc3pUcnVlTmFtZTsKKworICAgIGlmIChpc2FscGhhKHBvcmlnWzBdKSAmJiBwb3JpZ1sxXSA9PSAnOicpCisgICAgeworCS8qIGNvcHkgbGVhZGluZyBkcml2ZSBsZXR0ZXIgKi8KKwkqcHRydWUrKyA9ICpwb3JpZysrOworCSpwdHJ1ZSsrID0gKnBvcmlnKys7CisJKnB0cnVlID0gTlVMOwkgICAgLyogaW4gY2FzZSBub3RoaW5nIGZvbGxvd3MgKi8KKyAgICB9CisKKyAgICB3aGlsZSAoKnBvcmlnICE9IE5VTCkKKyAgICB7CisJLyogY29weSBcIGNoYXJhY3RlcnMgKi8KKwl3aGlsZSAoKnBvcmlnID09IHBzZXBjKQorCSAgICAqcHRydWUrKyA9ICpwb3JpZysrOworCisJcHRydWVQcmV2ID0gcHRydWU7CisJcG9yaWdQcmV2ID0gcG9yaWc7CisJd2hpbGUgKCpwb3JpZyAhPSBOVUwgJiYgKnBvcmlnICE9IHBzZXBjKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGludCBsOworCisJICAgIGlmIChlbmNfZGJjcykKKwkgICAgeworCQlsID0gKCptYl9wdHIybGVuX2NoZWNrKShwb3JpZyk7CisJCXdoaWxlICgtLWwgPj0gMCkKKwkJICAgICpwdHJ1ZSsrID0gKnBvcmlnKys7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCSpwdHJ1ZSsrID0gKnBvcmlnKys7CisJfQorCSpwdHJ1ZSA9IE5VTDsKKworCS8qIFNraXAgIiIsICIuIiBhbmQgIi4uIi4gKi8KKwlpZiAocHRydWUgPiBwdHJ1ZVByZXYKKwkJJiYgKHB0cnVlUHJldlswXSAhPSAnLicKKwkJICAgIHx8IChwdHJ1ZVByZXZbMV0gIT0gTlVMCisJCQkmJiAocHRydWVQcmV2WzFdICE9ICcuJyB8fCBwdHJ1ZVByZXZbMl0gIT0gTlVMKSkpCisJCSYmIChoRmluZCA9IEZpbmRGaXJzdEZpbGUoc3pUcnVlTmFtZSwgJmZiKSkKKwkJCQkJCSAgICAgICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorCXsKKwkgICAgYyA9ICpwb3JpZzsKKwkgICAgKnBvcmlnID0gTlVMOworCisJICAgIC8qIE9ubHkgdXNlIHRoZSBtYXRjaCB3aGVuIGl0J3MgdGhlIHNhbWUgbmFtZSAoaWdub3JpbmcgY2FzZSkgb3IKKwkgICAgICogZXhwYW5zaW9uIGlzIGFsbG93ZWQgYW5kIHRoZXJlIGlzIGEgbWF0Y2ggd2l0aCB0aGUgc2hvcnQgbmFtZQorCSAgICAgKiBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20uICovCisJICAgIGlmIChfc3RyaWNvbGwocG9yaWdQcmV2LCBmYi5jRmlsZU5hbWUpID09IDAKKwkJICAgIHx8IChsZW4gPiAwCisJCQkmJiAoX3N0cmljb2xsKHBvcmlnUHJldiwgZmIuY0FsdGVybmF0ZUZpbGVOYW1lKSA9PSAwCisJCQkgICAgJiYgKGludCkocHRydWVQcmV2IC0gc3pUcnVlTmFtZSkKKwkJCQkJICAgKyAoaW50KXN0cmxlbihmYi5jRmlsZU5hbWUpIDwgbGVuKSkpCisJICAgIHsKKwkJU1RSQ1BZKHB0cnVlUHJldiwgZmIuY0ZpbGVOYW1lKTsKKworCQkvKiBMb29rIGZvciBleGFjdCBtYXRjaCBhbmQgcHJlZmVyIGl0IGlmIGZvdW5kLiAgTXVzdCBiZSBhCisJCSAqIGxvbmcgbmFtZSwgb3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG9ubHkgb25lIG1hdGNoLiAqLworCQl3aGlsZSAoRmluZE5leHRGaWxlKGhGaW5kLCAmZmIpKQorCQl7CisJCSAgICBpZiAoKmZiLmNBbHRlcm5hdGVGaWxlTmFtZSAhPSBOVUwKKwkJCSAgICAmJiAoc3RyY29sbChwb3JpZ1ByZXYsIGZiLmNGaWxlTmFtZSkgPT0gMAorCQkJCXx8IChsZW4gPiAwCisJCQkJICAgICYmIChfc3RyaWNvbGwocG9yaWdQcmV2LAorCQkJCQkJICAgZmIuY0FsdGVybmF0ZUZpbGVOYW1lKSA9PSAwCisJCQkJICAgICYmIChpbnQpKHB0cnVlUHJldiAtIHN6VHJ1ZU5hbWUpCisJCQkJCSArIChpbnQpc3RybGVuKGZiLmNGaWxlTmFtZSkgPCBsZW4pKSkpCisJCSAgICB7CisJCQlTVFJDUFkocHRydWVQcmV2LCBmYi5jRmlsZU5hbWUpOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBGaW5kQ2xvc2UoaEZpbmQpOworCSAgICAqcG9yaWcgPSBjOworCSAgICBwdHJ1ZSA9IHB0cnVlUHJldiArIHN0cmxlbihwdHJ1ZVByZXYpOworCX0KKyAgICB9CisKKyAgICBTVFJDUFkobmFtZSwgc3pUcnVlTmFtZSk7Cit9CisKKworLyoKKyAqIEluc2VydCB1c2VyIG5hbWUgaW4gc1tsZW5dLgorICovCisgICAgaW50CittY2hfZ2V0X3VzZXJfbmFtZSgKKyAgICBjaGFyX3UgKnMsCisgICAgaW50IGxlbikKK3sKKyAgICBjaGFyIHN6VXNlck5hbWVbTUFYX0NPTVBVVEVSTkFNRV9MRU5HVEggKyAxXTsKKyAgICBEV09SRCBjY2ggPSBzaXplb2Ygc3pVc2VyTmFtZTsKKworICAgIGlmIChHZXRVc2VyTmFtZShzelVzZXJOYW1lLCAmY2NoKSkKKyAgICB7CisJU1RSTkNQWShzLCBzelVzZXJOYW1lLCBsZW4pOworCXJldHVybiBPSzsKKyAgICB9CisgICAgc1swXSA9IE5VTDsKKyAgICByZXR1cm4gRkFJTDsKK30KKworCisvKgorICogSW5zZXJ0IGhvc3QgbmFtZSBpbiBzW2xlbl0uCisgKi8KKyAgICB2b2lkCittY2hfZ2V0X2hvc3RfbmFtZSgKKyAgICBjaGFyX3UJKnMsCisgICAgaW50CQlsZW4pCit7CisgICAgRFdPUkQgY2NoID0gbGVuOworCisgICAgaWYgKCFHZXRDb21wdXRlck5hbWUocywgJmNjaCkpCisgICAgeworCVNUUk5DUFkocywgIlBDIChXaW4zMiBWaW0pIiwgbGVuKTsKKwlzW2xlbiAtIDFdID0gTlVMOwkvKiBtYWtlIHN1cmUgaXQncyB0ZXJtaW5hdGVkICovCisgICAgfQorfQorCisKKy8qCisgKiByZXR1cm4gcHJvY2VzcyBJRAorICovCisgICAgbG9uZworbWNoX2dldF9waWQoKQoreworICAgIHJldHVybiAobG9uZylHZXRDdXJyZW50UHJvY2Vzc0lkKCk7Cit9CisKKworLyoKKyAqIEdldCBuYW1lIG9mIGN1cnJlbnQgZGlyZWN0b3J5IGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KKyAqIFJldHVybiBPSyBmb3Igc3VjY2VzcywgRkFJTCBmb3IgZmFpbHVyZS4KKyAqLworICAgIGludAorbWNoX2Rpcm5hbWUoCisgICAgY2hhcl91CSpidWYsCisgICAgaW50CQlsZW4pCit7CisgICAgLyoKKyAgICAgKiBPcmlnaW5hbGx5IHRoaXMgd2FzOgorICAgICAqICAgIHJldHVybiAoZ2V0Y3dkKGJ1ZiwgbGVuKSAhPSBOVUxMID8gT0sgOiBGQUlMKTsKKyAgICAgKiBCdXQgdGhlIFdpbjMycyBrbm93biBidWcgbGlzdCBzYXlzIHRoYXQgZ2V0Y3dkKCkgZG9lc24ndCB3b3JrCisgICAgICogc28gdXNlIHRoZSBXaW4zMiBzeXN0ZW0gY2FsbCBpbnN0ZWFkLiA8TmVncmk+CisgICAgICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChlbmNfY29kZXBhZ2UgPj0gMCAmJiAoaW50KUdldEFDUCgpICE9IGVuY19jb2RlcGFnZSkKKyAgICB7CisJV0NIQVIJd2J1ZltfTUFYX1BBVEggKyAxXTsKKworCWlmIChHZXRDdXJyZW50RGlyZWN0b3J5VyhfTUFYX1BBVEgsIHdidWYpICE9IDApCisJeworCSAgICBjaGFyX3UgICpwID0gdWNzMl90b19lbmMod2J1ZiwgTlVMTCk7CisKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkgICAgeworCQlTVFJOQ1BZKGJ1ZiwgcCwgbGVuIC0gMSk7CisJCWJ1ZltsZW4gLSAxXSA9IE5VTDsKKwkJdmltX2ZyZWUocCk7CisJCXJldHVybiBPSzsKKwkgICAgfQorCX0KKwkvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuICovCisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChHZXRDdXJyZW50RGlyZWN0b3J5KGxlbiwgYnVmKSAhPSAwID8gT0sgOiBGQUlMKTsKK30KKworLyoKKyAqIGdldCBmaWxlIHBlcm1pc3Npb25zIGZvciBgbmFtZScKKyAqIC0xIDogZXJyb3IKKyAqIGVsc2UgRklMRV9BVFRSSUJVVEVfKiBkZWZpbmVkIGluIHdpbm50LmgKKyAqLworICAgIGxvbmcKK21jaF9nZXRwZXJtKAorICAgIGNoYXJfdSAqbmFtZSkKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlKQorICAgIHsKKwlXQ0hBUgkqcCA9IGVuY190b191Y3MyKG5hbWUsIE5VTEwpOworCWxvbmcJbjsKKworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBuID0gKGxvbmcpR2V0RmlsZUF0dHJpYnV0ZXNXKHApOworCSAgICB2aW1fZnJlZShwKTsKKwkgICAgaWYgKG4gPj0gMCB8fCBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkJcmV0dXJuIG47CisJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwl9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChsb25nKUdldEZpbGVBdHRyaWJ1dGVzKChjaGFyICopbmFtZSk7Cit9CisKKworLyoKKyAqIHNldCBmaWxlIHBlcm1pc3Npb24gZm9yIGBuYW1lJyB0byBgcGVybScKKyAqLworICAgIGludAorbWNoX3NldHBlcm0oCisgICAgY2hhcl91ICpuYW1lLAorICAgIGxvbmcgcGVybSkKK3sKKyAgICBwZXJtIHw9IEZJTEVfQVRUUklCVVRFX0FSQ0hJVkU7CS8qIGZpbGUgaGFzIGNoYW5nZWQsIHNldCBhcmNoaXZlIGJpdCAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX2NvZGVwYWdlID49IDAgJiYgKGludClHZXRBQ1AoKSAhPSBlbmNfY29kZXBhZ2UpCisgICAgeworCVdDSEFSCSpwID0gZW5jX3RvX3VjczIobmFtZSwgTlVMTCk7CisJbG9uZwluOworCisJaWYgKHAgIT0gTlVMTCkKKwl7CisJICAgIG4gPSAobG9uZylTZXRGaWxlQXR0cmlidXRlc1cocCwgcGVybSk7CisJICAgIHZpbV9mcmVlKHApOworCSAgICBpZiAobiB8fCBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkJcmV0dXJuIG4gPyBPSyA6IEZBSUw7CisJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwl9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIFNldEZpbGVBdHRyaWJ1dGVzKChjaGFyICopbmFtZSwgcGVybSkgPyBPSyA6IEZBSUw7Cit9CisKKy8qCisgKiBTZXQgaGlkZGVuIGZsYWcgZm9yICJuYW1lIi4KKyAqLworICAgIHZvaWQKK21jaF9oaWRlKGNoYXJfdSAqbmFtZSkKK3sKKyAgICBpbnQJCXBlcm07CisjaWZkZWYgRkVBVF9NQllURQorICAgIFdDSEFSCSpwID0gTlVMTDsKKworICAgIGlmIChlbmNfY29kZXBhZ2UgPj0gMCAmJiAoaW50KUdldEFDUCgpICE9IGVuY19jb2RlcGFnZSkKKwlwID0gZW5jX3RvX3VjczIobmFtZSwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAocCAhPSBOVUxMKQorICAgIHsKKwlwZXJtID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHApOworCWlmIChwZXJtIDwgMCAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwl7CisJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwkgICAgdmltX2ZyZWUocCk7CisJICAgIHAgPSBOVUxMOworCX0KKyAgICB9CisgICAgaWYgKHAgPT0gTlVMTCkKKyNlbmRpZgorCXBlcm0gPSBHZXRGaWxlQXR0cmlidXRlcygoY2hhciAqKW5hbWUpOworICAgIGlmIChwZXJtID49IDApCisgICAgeworCXBlcm0gfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAocCAhPSBOVUxMKQorCXsKKwkgICAgaWYgKFNldEZpbGVBdHRyaWJ1dGVzVyhwLCBwZXJtKSA9PSAwCisJCSAgICAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkgICAgeworCQkvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuICovCisJCXZpbV9mcmVlKHApOworCQlwID0gTlVMTDsKKwkgICAgfQorCX0KKwlpZiAocCA9PSBOVUxMKQorI2VuZGlmCisJICAgIFNldEZpbGVBdHRyaWJ1dGVzKChjaGFyICopbmFtZSwgcGVybSk7CisgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1fZnJlZShwKTsKKyNlbmRpZgorfQorCisvKgorICogcmV0dXJuIFRSVUUgaWYgIm5hbWUiIGlzIGEgZGlyZWN0b3J5CisgKiByZXR1cm4gRkFMU0UgaWYgIm5hbWUiIGlzIG5vdCBhIGRpcmVjdG9yeSBvciB1cG9uIGVycm9yCisgKi8KKyAgICBpbnQKK21jaF9pc2RpcihjaGFyX3UgKm5hbWUpCit7CisgICAgaW50IGYgPSBtY2hfZ2V0cGVybShuYW1lKTsKKworICAgIGlmIChmID09IC0xKQorCXJldHVybiBGQUxTRTsJCSAgICAvKiBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IGFsbCAqLworCisgICAgcmV0dXJuIChmICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSAwOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgZmlsZSBvciBkaXJlY3RvcnkgIm5hbWUiIGlzIHdyaXRhYmxlIChub3QgcmVhZG9ubHkpLgorICogU3RyYW5nZSBzZW1hbnRpY3Mgb2YgV2luMzI6IGEgcmVhZG9ubHkgZGlyZWN0b3J5IGlzIHdyaXRhYmxlLCBidXQgeW91IGNhbid0CisgKiBkZWxldGUgYSBmaWxlLiAgTGV0J3Mgc2F5IHRoaXMgbWVhbnMgaXQgaXMgd3JpdGFibGUuCisgKi8KKyAgICBpbnQKK21jaF93cml0YWJsZShjaGFyX3UgKm5hbWUpCit7CisgICAgaW50IHBlcm0gPSBtY2hfZ2V0cGVybShuYW1lKTsKKworICAgIHJldHVybiAocGVybSAhPSAtMSAmJiAoIShwZXJtICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCisJCQkJICAgICAgIHx8IChwZXJtICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkpOworfQorCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIDEgaWYgIm5hbWUiIGNhbiBiZSBleGVjdXRlZCwgMCBpZiBub3QuCisgKiBSZXR1cm4gLTEgaWYgdW5rbm93bi4KKyAqLworICAgIGludAorbWNoX2Nhbl9leGUoY2hhcl91ICpuYW1lKQoreworICAgIHJldHVybiBleGVjdXRhYmxlX2V4aXN0cygoY2hhciAqKW5hbWUpOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB3aGF0ICJuYW1lIiBpczoKKyAqIE5PREVfTk9STUFMOiBmaWxlIG9yIGRpcmVjdG9yeSAob3IgZG9lc24ndCBleGlzdCkKKyAqIE5PREVfV1JJVEFCTEU6IHdyaXRhYmxlIGRldmljZSwgc29ja2V0LCBmaWZvLCBldGMuCisgKiBOT0RFX09USEVSOiBub24td3JpdGFibGUgdGhpbmdzCisgKi8KKyAgICBpbnQKK21jaF9ub2RldHlwZShjaGFyX3UgKm5hbWUpCit7CisgICAgSEFORExFCWhGaWxlOworICAgIGludAkJdHlwZTsKKworICAgIGhGaWxlID0gQ3JlYXRlRmlsZShuYW1lLAkJLyogZmlsZSBuYW1lICovCisJCUdFTkVSSUNfV1JJVEUsCQkvKiBhY2Nlc3MgbW9kZSAqLworCQkwLAkJCS8qIHNoYXJlIG1vZGUgKi8KKwkJTlVMTCwJCQkvKiBzZWN1cml0eSBkZXNjcmlwdG9yICovCisJCU9QRU5fRVhJU1RJTkcsCQkvKiBjcmVhdGlvbiBkaXNwb3NpdGlvbiAqLworCQkwLAkJCS8qIGZpbGUgYXR0cmlidXRlcyAqLworCQlOVUxMKTsJCQkvKiBoYW5kbGUgdG8gdGVtcGxhdGUgZmlsZSAqLworCisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCXJldHVybiBOT0RFX05PUk1BTDsKKworICAgIHR5cGUgPSBHZXRGaWxlVHlwZShoRmlsZSk7CisgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgIGlmICh0eXBlID09IEZJTEVfVFlQRV9DSEFSKQorCXJldHVybiBOT0RFX1dSSVRBQkxFOworICAgIGlmICh0eXBlID09IEZJTEVfVFlQRV9ESVNLKQorCXJldHVybiBOT0RFX05PUk1BTDsKKyAgICByZXR1cm4gTk9ERV9PVEhFUjsKK30KKworI2lmZGVmIEhBVkVfQUNMCitzdHJ1Y3QgbXlfYWNsCit7CisgICAgUFNFQ1VSSVRZX0RFU0NSSVBUT1IgICAgcFNlY3VyaXR5RGVzY3JpcHRvcjsKKyAgICBQU0lECQkgICAgcFNpZE93bmVyOworICAgIFBTSUQJCSAgICBwU2lkR3JvdXA7CisgICAgUEFDTAkJICAgIHBEYWNsOworICAgIFBBQ0wJCSAgICBwU2FjbDsKK307CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIEFDTCBvZiBmaWxlICJmbmFtZSIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFJldHVybiBOVUxMIGlmIHRoZSBBQ0wgaXMgbm90IGF2YWlsYWJsZSBmb3Igd2hhdGV2ZXIgcmVhc29uLgorICovCisgICAgdmltX2FjbF9UCittY2hfZ2V0X2FjbChmbmFtZSkKKyAgICBjaGFyX3UJKmZuYW1lOworeworI2lmbmRlZiBIQVZFX0FDTAorICAgIHJldHVybiAodmltX2FjbF9UKU5VTEw7CisjZWxzZQorICAgIHN0cnVjdCBteV9hY2wgICAqcCA9IE5VTEw7CisKKyAgICAvKiBUaGlzIG9ubHkgd29ya3Mgb24gV2luZG93cyBOVCBhbmQgMjAwMC4gKi8KKyAgICBpZiAoZ19QbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCAmJiBhZHZhcGlfbGliICE9IE5VTEwpCisgICAgeworCXAgPSAoc3RydWN0IG15X2FjbCAqKWFsbG9jX2NsZWFyKCh1bnNpZ25lZClzaXplb2Yoc3RydWN0IG15X2FjbCkpOworCWlmIChwICE9IE5VTEwpCisJeworCSAgICBpZiAocEdldE5hbWVkU2VjdXJpdHlJbmZvKAorCQkJKExQVFNUUilmbmFtZSwJCS8vIEFic3RyYWN0IGZpbGVuYW1lCisJCQlTRV9GSUxFX09CSkVDVCwJCS8vIEZpbGUgT2JqZWN0CisJCQkvLyBSZXRyaWV2ZSB0aGUgZW50aXJlIHNlY3VyaXR5IGRlc2NyaXB0b3IuCisJCQlPV05FUl9TRUNVUklUWV9JTkZPUk1BVElPTiB8CisJCQlHUk9VUF9TRUNVUklUWV9JTkZPUk1BVElPTiB8CisJCQlEQUNMX1NFQ1VSSVRZX0lORk9STUFUSU9OIHwKKwkJCVNBQ0xfU0VDVVJJVFlfSU5GT1JNQVRJT04sCisJCQkmcC0+cFNpZE93bmVyLAkJLy8gT3duZXJzaGlwIGluZm9ybWF0aW9uLgorCQkJJnAtPnBTaWRHcm91cCwJCS8vIEdyb3VwIG1lbWJlcnNoaXAuCisJCQkmcC0+cERhY2wsCQkvLyBEaXNjcmV0aW9uYXJ5IGluZm9ybWF0aW9uLgorCQkJJnAtPnBTYWNsLAkJLy8gRm9yIGF1ZGl0aW5nIHB1cnBvc2VzLgorCQkJJnAtPnBTZWN1cml0eURlc2NyaXB0b3IKKwkJCQkgICAgKSAhPSBFUlJPUl9TVUNDRVNTKQorCSAgICB7CisJCW1jaF9mcmVlX2FjbCgodmltX2FjbF9UKXApOworCQlwID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gKHZpbV9hY2xfVClwOworI2VuZGlmCit9CisKKy8qCisgKiBTZXQgdGhlIEFDTCBvZiBmaWxlICJmbmFtZSIgdG8gImFjbCIgKHVubGVzcyBpdCdzIE5VTEwpLgorICogRXJyb3JzIGFyZSBpZ25vcmVkLgorICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggImFjbCIgZXF1YWwgdG8gd2hhdCBtY2hfZ2V0X2FjbCgpIHJldHVybmVkLgorICovCisgICAgdm9pZAorbWNoX3NldF9hY2woZm5hbWUsIGFjbCkKKyAgICBjaGFyX3UJKmZuYW1lOworICAgIHZpbV9hY2xfVAlhY2w7Cit7CisjaWZkZWYgSEFWRV9BQ0wKKyAgICBzdHJ1Y3QgbXlfYWNsICAgKnAgPSAoc3RydWN0IG15X2FjbCAqKWFjbDsKKworICAgIGlmIChwICE9IE5VTEwgJiYgYWR2YXBpX2xpYiAhPSBOVUxMKQorCSh2b2lkKXBTZXROYW1lZFNlY3VyaXR5SW5mbygKKwkJICAgIChMUFRTVFIpZm5hbWUsCQkvLyBBYnN0cmFjdCBmaWxlbmFtZQorCQkgICAgU0VfRklMRV9PQkpFQ1QsCQkvLyBGaWxlIE9iamVjdAorCQkgICAgLy8gUmV0cmlldmUgdGhlIGVudGlyZSBzZWN1cml0eSBkZXNjcmlwdG9yLgorCQkgICAgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT04gfAorCQkJR1JPVVBfU0VDVVJJVFlfSU5GT1JNQVRJT04gfAorCQkJREFDTF9TRUNVUklUWV9JTkZPUk1BVElPTiB8CisJCQlTQUNMX1NFQ1VSSVRZX0lORk9STUFUSU9OLAorCQkgICAgcC0+cFNpZE93bmVyLAkJLy8gT3duZXJzaGlwIGluZm9ybWF0aW9uLgorCQkgICAgcC0+cFNpZEdyb3VwLAkJLy8gR3JvdXAgbWVtYmVyc2hpcC4KKwkJICAgIHAtPnBEYWNsLAkJCS8vIERpc2NyZXRpb25hcnkgaW5mb3JtYXRpb24uCisJCSAgICBwLT5wU2FjbAkJCS8vIEZvciBhdWRpdGluZyBwdXJwb3Nlcy4KKwkJICAgICk7CisjZW5kaWYKK30KKworICAgIHZvaWQKK21jaF9mcmVlX2FjbChhY2wpCisgICAgdmltX2FjbF9UCWFjbDsKK3sKKyNpZmRlZiBIQVZFX0FDTAorICAgIHN0cnVjdCBteV9hY2wgICAqcCA9IChzdHJ1Y3QgbXlfYWNsICopYWNsOworCisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisJTG9jYWxGcmVlKHAtPnBTZWN1cml0eURlc2NyaXB0b3IpOwkvLyBGcmVlIHRoZSBtZW1vcnkganVzdCBpbiBjYXNlCisJdmltX2ZyZWUocCk7CisgICAgfQorI2VuZGlmCit9CisKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCisKKy8qCisgKiBoYW5kbGVyIGZvciBjdHJsLWJyZWFrLCBjdHJsLWMgaW50ZXJydXB0cywgYW5kIGZhdGFsIGV2ZW50cy4KKyAqLworICAgIHN0YXRpYyBCT09MIFdJTkFQSQoraGFuZGxlcl9yb3V0aW5lKAorICAgIERXT1JEIGR3Q3RybFR5cGUpCit7CisgICAgc3dpdGNoIChkd0N0cmxUeXBlKQorICAgIHsKKyAgICBjYXNlIENUUkxfQ19FVkVOVDoKKwlpZiAoY3RybF9jX2ludGVycnVwdHMpCisJICAgIGdfZkN0cmxDUHJlc3NlZCA9IFRSVUU7CisJcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIENUUkxfQlJFQUtfRVZFTlQ6CisJZ19mQ0Jya1ByZXNzZWQJPSBUUlVFOworCXJldHVybiBUUlVFOworCisgICAgLyogZmF0YWwgZXZlbnRzOiBzaHV0IGRvd24gZ3JhY2VmdWxseSAqLworICAgIGNhc2UgQ1RSTF9DTE9TRV9FVkVOVDoKKyAgICBjYXNlIENUUkxfTE9HT0ZGX0VWRU5UOgorICAgIGNhc2UgQ1RSTF9TSFVURE9XTl9FVkVOVDoKKwl3aW5kZ290bygoaW50KVJvd3MgLSAxLCAwKTsKKwlnX2ZGb3JjZUV4aXQgPSBUUlVFOworCisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIpLAorCQkoZHdDdHJsVHlwZSA9PSBDVFJMX0NMT1NFX0VWRU5UCisJCSAgICAgPyBfKCJjbG9zZSIpCisJCSAgICAgOiBkd0N0cmxUeXBlID09IENUUkxfTE9HT0ZGX0VWRU5UCisJCQkgPyBfKCJsb2dvZmYiKQorCQkJIDogXygic2h1dGRvd24iKSkpOworI2lmZGVmIERFQlVHCisJT3V0cHV0RGVidWdTdHJpbmcoSU9idWZmKTsKKyNlbmRpZgorCisJcHJlc2VydmVfZXhpdCgpOwkvKiBvdXRwdXQgSU9idWZmLCBwcmVzZXJ2ZSBmaWxlcyBhbmQgZXhpdCAqLworCisJcmV0dXJuIFRSVUU7CQkvKiBub3QgcmVhY2hlZCAqLworCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisKKy8qCisgKiBzZXQgdGhlIHR0eSBpbiAocmF3KSA/ICJyYXciIDogImNvb2tlZCIgbW9kZQorICovCisgICAgdm9pZAorbWNoX3NldHRtb2RlKAorICAgIGludCB0bW9kZSkKK3sKKyAgICBEV09SRCBjbW9kZWluOworICAgIERXT1JEIGNtb2Rlb3V0OworICAgIEJPT0wgYkVuYWJsZUhhbmRsZXI7CisKKyAgICBHZXRDb25zb2xlTW9kZShnX2hDb25JbiwgJmNtb2RlaW4pOworICAgIEdldENvbnNvbGVNb2RlKGdfaENvbk91dCwgJmNtb2Rlb3V0KTsKKyAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorICAgIHsKKwljbW9kZWluICY9IH4oRU5BQkxFX0xJTkVfSU5QVVQgfCBFTkFCTEVfUFJPQ0VTU0VEX0lOUFVUIHwKKwkJICAgICBFTkFCTEVfRUNIT19JTlBVVCk7CisjaWZkZWYgRkVBVF9NT1VTRQorCWlmIChnX2ZNb3VzZUFjdGl2ZSkKKwkgICAgY21vZGVpbiB8PSBFTkFCTEVfTU9VU0VfSU5QVVQ7CisjZW5kaWYKKwljbW9kZW91dCAmPSB+KEVOQUJMRV9QUk9DRVNTRURfT1VUUFVUIHwgRU5BQkxFX1dSQVBfQVRfRU9MX09VVFBVVCk7CisJYkVuYWJsZUhhbmRsZXIgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIC8qIGNvb2tlZCAqLworICAgIHsKKwljbW9kZWluIHw9IChFTkFCTEVfTElORV9JTlBVVCB8IEVOQUJMRV9QUk9DRVNTRURfSU5QVVQgfAorCQkgICAgRU5BQkxFX0VDSE9fSU5QVVQpOworCWNtb2Rlb3V0IHw9IChFTkFCTEVfUFJPQ0VTU0VEX09VVFBVVCB8IEVOQUJMRV9XUkFQX0FUX0VPTF9PVVRQVVQpOworCWJFbmFibGVIYW5kbGVyID0gRkFMU0U7CisgICAgfQorICAgIFNldENvbnNvbGVNb2RlKGdfaENvbkluLCBjbW9kZWluKTsKKyAgICBTZXRDb25zb2xlTW9kZShnX2hDb25PdXQsIGNtb2Rlb3V0KTsKKyAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoaGFuZGxlcl9yb3V0aW5lLCBiRW5hYmxlSGFuZGxlcik7CisKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorICAgIGlmIChmZER1bXApCisgICAgeworCWZwcmludGYoZmREdW1wLCAibWNoX3NldHRtb2RlKCVzLCBpbiA9ICV4LCBvdXQgPSAleClcbiIsCisJCXRtb2RlID09IFRNT0RFX1JBVyA/ICJyYXciIDoKKwkJCQkgICAgdG1vZGUgPT0gVE1PREVfQ09PSyA/ICJjb29rZWQiIDogIm5vcm1hbCIsCisJCWNtb2RlaW4sIGNtb2Rlb3V0KTsKKwlmZmx1c2goZmREdW1wKTsKKyAgICB9CisjZW5kaWYKK30KKworCisvKgorICogR2V0IHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHdpbmRvdyBpbiBgUm93cycgYW5kIGBDb2x1bW5zJworICogUmV0dXJuIE9LIHdoZW4gc2l6ZSBjb3VsZCBiZSBkZXRlcm1pbmVkLCBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIGludAorbWNoX2dldF9zaGVsbHNpemUoKQoreworICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmk7CisKKyAgICBpZiAoIWdfZlRlcm1jYXBNb2RlICYmIGdfY2JUZXJtY2FwLklzVmFsaWQpCisgICAgeworCS8qCisJICogRm9yIHNvbWUgcmVhc29uLCB3ZSBhcmUgdHJ5aW5nIHRvIGdldCB0aGUgc2NyZWVuIGRpbWVuc2lvbnMKKwkgKiBldmVuIHRob3VnaCB3ZSBhcmUgbm90IGluIHRlcm1jYXAgbW9kZS4gIFRoZSAnUm93cycgYW5kICdDb2x1bW5zJworCSAqIHZhcmlhYmxlcyBhcmUgcmVhbGx5IGludGVuZGVkIHRvIG1lYW4gdGhlIHNpemUgb2YgVmltIHNjcmVlbgorCSAqIHdoaWxlIGluIHRlcm1jYXAgbW9kZS4KKwkgKi8KKwlSb3dzID0gZ19jYlRlcm1jYXAuSW5mby5kd1NpemUuWTsKKwlDb2x1bW5zID0gZ19jYlRlcm1jYXAuSW5mby5kd1NpemUuWDsKKyAgICB9CisgICAgZWxzZSBpZiAoR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oZ19oQ29uT3V0LCAmY3NiaSkpCisgICAgeworCVJvd3MgPSBjc2JpLnNyV2luZG93LkJvdHRvbSAtIGNzYmkuc3JXaW5kb3cuVG9wICsgMTsKKwlDb2x1bW5zID0gY3NiaS5zcldpbmRvdy5SaWdodCAtIGNzYmkuc3JXaW5kb3cuTGVmdCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUm93cyA9IDI1OworCUNvbHVtbnMgPSA4MDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogU2V0IGEgY29uc29sZSB3aW5kb3cgdG8gYHhTaXplJyAqIGB5U2l6ZScKKyAqLworICAgIHN0YXRpYyB2b2lkCitSZXNpemVDb25CdWZBbmRXaW5kb3coCisgICAgSEFORExFIGhDb25zb2xlLAorICAgIGludCB4U2l6ZSwKKyAgICBpbnQgeVNpemUpCit7CisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaTsJLyogaG9sZCBjdXJyZW50IGNvbnNvbGUgYnVmZmVyIGluZm8gKi8KKyAgICBTTUFMTF9SRUNUCSAgICBzcldpbmRvd1JlY3Q7CS8qIGhvbGQgdGhlIG5ldyBjb25zb2xlIHNpemUgKi8KKyAgICBDT09SRAkgICAgY29vcmRTY3JlZW47CisKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorICAgIGlmIChmZER1bXApCisgICAgeworCWZwcmludGYoZmREdW1wLCAiUmVzaXplQ29uQnVmQW5kV2luZG93KCVkLCAlZClcbiIsIHhTaXplLCB5U2l6ZSk7CisJZmZsdXNoKGZkRHVtcCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBnZXQgdGhlIGxhcmdlc3Qgc2l6ZSB3ZSBjYW4gc2l6ZSB0aGUgY29uc29sZSB3aW5kb3cgdG8gKi8KKyAgICBjb29yZFNjcmVlbiA9IEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZShoQ29uc29sZSk7CisKKyAgICAvKiBkZWZpbmUgdGhlIG5ldyBjb25zb2xlIHdpbmRvdyBzaXplIGFuZCBzY3JvbGwgcG9zaXRpb24gKi8KKyAgICBzcldpbmRvd1JlY3QuTGVmdCA9IHNyV2luZG93UmVjdC5Ub3AgPSAoU0hPUlQpIDA7CisgICAgc3JXaW5kb3dSZWN0LlJpZ2h0ID0gIChTSE9SVCkgKG1pbih4U2l6ZSwgY29vcmRTY3JlZW4uWCkgLSAxKTsKKyAgICBzcldpbmRvd1JlY3QuQm90dG9tID0gKFNIT1JUKSAobWluKHlTaXplLCBjb29yZFNjcmVlbi5ZKSAtIDEpOworCisgICAgaWYgKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGdfaENvbk91dCwgJmNzYmkpKQorICAgIHsKKwlpbnQgc3gsIHN5OworCisJc3ggPSBjc2JpLnNyV2luZG93LlJpZ2h0IC0gY3NiaS5zcldpbmRvdy5MZWZ0ICsgMTsKKwlzeSA9IGNzYmkuc3JXaW5kb3cuQm90dG9tIC0gY3NiaS5zcldpbmRvdy5Ub3AgKyAxOworCWlmIChzeSA8IHlTaXplIHx8IHN4IDwgeFNpemUpCisJeworCSAgICAvKgorCSAgICAgKiBJbmNyZWFzaW5nIG51bWJlciBvZiBsaW5lcy9jb2x1bW5zLCBkbyBidWZmZXIgZmlyc3QuCisJICAgICAqIFVzZSB0aGUgbWF4aW1hbCBzaXplIGluIHggYW5kIHkgZGlyZWN0aW9uLgorCSAgICAgKi8KKwkgICAgaWYgKHN5IDwgeVNpemUpCisJCWNvb3JkU2NyZWVuLlkgPSB5U2l6ZTsKKwkgICAgZWxzZQorCQljb29yZFNjcmVlbi5ZID0gc3k7CisJICAgIGlmIChzeCA8IHhTaXplKQorCQljb29yZFNjcmVlbi5YID0geFNpemU7CisJICAgIGVsc2UKKwkJY29vcmRTY3JlZW4uWCA9IHN4OworCSAgICBTZXRDb25zb2xlU2NyZWVuQnVmZmVyU2l6ZShoQ29uc29sZSwgY29vcmRTY3JlZW4pOworCX0KKyAgICB9CisKKyAgICBpZiAoIVNldENvbnNvbGVXaW5kb3dJbmZvKGdfaENvbk91dCwgVFJVRSwgJnNyV2luZG93UmVjdCkpCisgICAgeworI2lmZGVmIE1DSF9XUklURV9EVU1QCisJaWYgKGZkRHVtcCkKKwl7CisJICAgIGZwcmludGYoZmREdW1wLCAiU2V0Q29uc29sZVdpbmRvd0luZm8gZmFpbGVkOiAlbHhcbiIsCisJCSAgICBHZXRMYXN0RXJyb3IoKSk7CisJICAgIGZmbHVzaChmZER1bXApOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIC8qIGRlZmluZSB0aGUgbmV3IGNvbnNvbGUgYnVmZmVyIHNpemUgKi8KKyAgICBjb29yZFNjcmVlbi5YID0geFNpemU7CisgICAgY29vcmRTY3JlZW4uWSA9IHlTaXplOworCisgICAgaWYgKCFTZXRDb25zb2xlU2NyZWVuQnVmZmVyU2l6ZShoQ29uc29sZSwgY29vcmRTY3JlZW4pKQorICAgIHsKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCWlmIChmZER1bXApCisJeworCSAgICBmcHJpbnRmKGZkRHVtcCwgIlNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplIGZhaWxlZDogJWx4XG4iLAorCQkgICAgR2V0TGFzdEVycm9yKCkpOworCSAgICBmZmx1c2goZmREdW1wKTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKworLyoKKyAqIFNldCB0aGUgY29uc29sZSB3aW5kb3cgdG8gYFJvd3MnICogYENvbHVtbnMnCisgKi8KKyAgICB2b2lkCittY2hfc2V0X3NoZWxsc2l6ZSgpCit7CisgICAgQ09PUkQgY29vcmRTY3JlZW47CisKKyAgICAvKiBEb24ndCBjaGFuZ2Ugd2luZG93IHNpemUgd2hpbGUgc3RpbGwgc3RhcnRpbmcgdXAgKi8KKyAgICBpZiAoc3VwcHJlc3Nfd2luc2l6ZSAhPSAwKQorICAgIHsKKwlzdXBwcmVzc193aW5zaXplID0gMjsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHRlcm1fY29uc29sZSkKKyAgICB7CisJY29vcmRTY3JlZW4gPSBHZXRMYXJnZXN0Q29uc29sZVdpbmRvd1NpemUoZ19oQ29uT3V0KTsKKworCS8qIENsYW1wIFJvd3MgYW5kIENvbHVtbnMgdG8gcmVhc29uYWJsZSB2YWx1ZXMgKi8KKwlpZiAoUm93cyA+IGNvb3JkU2NyZWVuLlkpCisJICAgIFJvd3MgPSBjb29yZFNjcmVlbi5ZOworCWlmIChDb2x1bW5zID4gY29vcmRTY3JlZW4uWCkKKwkgICAgQ29sdW1ucyA9IGNvb3JkU2NyZWVuLlg7CisKKwlSZXNpemVDb25CdWZBbmRXaW5kb3coZ19oQ29uT3V0LCBDb2x1bW5zLCBSb3dzKTsKKyAgICB9Cit9CisKKy8qCisgKiBSb3dzIGFuZC9vciBDb2x1bW5zIGhhcyBjaGFuZ2VkLgorICovCisgICAgdm9pZAorbWNoX25ld19zaGVsbHNpemUoKQoreworICAgIHNldF9zY3JvbGxfcmVnaW9uKDAsIDAsIENvbHVtbnMgLSAxLCBSb3dzIC0gMSk7Cit9CisKKworLyoKKyAqIENhbGxlZCB3aGVuIHN0YXJ0ZWQgdXAsIHRvIHNldCB0aGUgd2luc2l6ZSB0aGF0IHdhcyBkZWxheWVkLgorICovCisgICAgdm9pZAorbWNoX3NldF93aW5zaXplX25vdygpCit7CisgICAgaWYgKHN1cHByZXNzX3dpbnNpemUgPT0gMikKKyAgICB7CisJc3VwcHJlc3Nfd2luc2l6ZSA9IDA7CisJbWNoX3NldF9zaGVsbHNpemUoKTsKKwlzaGVsbF9yZXNpemVkKCk7CisgICAgfQorICAgIHN1cHByZXNzX3dpbnNpemUgPSAwOworfQorI2VuZGlmIC8qIEZFQVRfR1VJX1czMiAqLworCisKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfVzMyKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogU3BlY2lhbGlzZWQgdmVyc2lvbiBvZiBzeXN0ZW0oKSBmb3IgV2luMzIgR1VJIG1vZGUuCisgKiBUaGlzIHZlcnNpb24gcHJvY2VlZHMgYXMgZm9sbG93czoKKyAqICAgIDEuIENyZWF0ZSBhIGNvbnNvbGUgd2luZG93IGZvciB1c2UgYnkgdGhlIHN1YnByb2Nlc3MKKyAqICAgIDIuIFJ1biB0aGUgc3VicHJvY2VzcyAoaXQgZ2V0cyB0aGUgYWxsb2NhdGVkIGNvbnNvbGUgYnkgZGVmYXVsdCkKKyAqICAgIDMuIFdhaXQgZm9yIHRoZSBzdWJwcm9jZXNzIHRvIHRlcm1pbmF0ZSBhbmQgZ2V0IGl0cyBleGl0IGNvZGUKKyAqICAgIDQuIFByb21wdCB0aGUgdXNlciB0byBwcmVzcyBhIGtleSB0byBjbG9zZSB0aGUgY29uc29sZSB3aW5kb3cKKyAqLworICAgIHN0YXRpYyBpbnQKK21jaF9zeXN0ZW0oY2hhciAqY21kLCBpbnQgb3B0aW9ucykKK3sKKyAgICBTVEFSVFVQSU5GTwkJc2k7CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgICBEV09SRAkJcmV0ID0gMDsKKyAgICBIV05ECQlod25kID0gR2V0Rm9jdXMoKTsKKworICAgIHNpLmNiID0gc2l6ZW9mKHNpKTsKKyAgICBzaS5scFJlc2VydmVkID0gTlVMTDsKKyAgICBzaS5scERlc2t0b3AgPSBOVUxMOworICAgIHNpLmxwVGl0bGUgPSBOVUxMOworICAgIHNpLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVzsKKyAgICAvKgorICAgICAqIEl0J3MgbmljZXIgdG8gcnVuIGEgZmlsdGVyIGNvbW1hbmQgaW4gYSBtaW5pbWl6ZWQgd2luZG93LCBidXQgaW4KKyAgICAgKiBXaW5kb3dzIDk1IHRoaXMgbWFrZXMgdGhlIGNvbW1hbmQgTVVDSCBzbG93ZXIuICBXZSBjYW4ndCBkbyBpdCB1bmRlcgorICAgICAqIFdpbjMycyBlaXRoZXIgYXMgaXQgc3RvcHMgdGhlIHN5bmNocm9ub3VzIHNwYXduIHdvcmthcm91bmQgd29ya2luZy4KKyAgICAgKi8KKyAgICBpZiAoKG9wdGlvbnMgJiBTSEVMTF9ET09VVCkgJiYgIW1jaF93aW5kb3dzOTUoKSAmJiAhZ3VpX2lzX3dpbjMycygpKQorCXNpLndTaG93V2luZG93ID0gU1dfU0hPV01JTklNSVpFRDsKKyAgICBlbHNlCisJc2kud1Nob3dXaW5kb3cgPSBTV19TSE9XTk9STUFMOworICAgIHNpLmNiUmVzZXJ2ZWQyID0gMDsKKyAgICBzaS5scFJlc2VydmVkMiA9IE5VTEw7CisKKyAgICAvKiBUaGVyZSBpcyBhIHN0cmFuZ2UgZXJyb3Igb24gV2luZG93cyA5NSB3aGVuIHVzaW5nICJjOlxcY29tbWFuZC5jb20iLgorICAgICAqIFdoZW4gdGhlICJjOlxcIiBpcyBsZWZ0IG91dCBpdCB3b3JrcyBPSy4uLj8gKi8KKyAgICBpZiAobWNoX3dpbmRvd3M5NSgpCisJICAgICYmIChTVFJOSUNNUChjbWQsICJjOi9jb21tYW5kLmNvbSIsIDE0KSA9PSAwCisJCXx8IFNUUk5JQ01QKGNtZCwgImM6XFxjb21tYW5kLmNvbSIsIDE0KSA9PSAwKSkKKwljbWQgKz0gMzsKKworICAgIC8qIE5vdywgcnVuIHRoZSBjb21tYW5kICovCisgICAgQ3JlYXRlUHJvY2VzcyhOVUxMLAkJCS8qIEV4ZWN1dGFibGUgbmFtZSAqLworCQkgIGNtZCwJCQkvKiBDb21tYW5kIHRvIGV4ZWN1dGUgKi8KKwkJICBOVUxMLAkJCS8qIFByb2Nlc3Mgc2VjdXJpdHkgYXR0cmlidXRlcyAqLworCQkgIE5VTEwsCQkJLyogVGhyZWFkIHNlY3VyaXR5IGF0dHJpYnV0ZXMgKi8KKwkJICBGQUxTRSwJCS8qIEluaGVyaXQgaGFuZGxlcyAqLworCQkgIENSRUFURV9ERUZBVUxUX0VSUk9SX01PREUgfAkvKiBDcmVhdGlvbiBmbGFncyAqLworCQkJQ1JFQVRFX05FV19DT05TT0xFLAorCQkgIE5VTEwsCQkJLyogRW52aXJvbm1lbnQgKi8KKwkJICBOVUxMLAkJCS8qIEN1cnJlbnQgZGlyZWN0b3J5ICovCisJCSAgJnNpLAkJCS8qIFN0YXJ0dXAgaW5mb3JtYXRpb24gKi8KKwkJICAmcGkpOwkJCS8qIFByb2Nlc3MgaW5mb3JtYXRpb24gKi8KKworCisgICAgLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gdGVybWluYXRlIGJlZm9yZSBjb250aW51aW5nICovCisgICAgaWYgKGdfUGxhdGZvcm1JZCAhPSBWRVJfUExBVEZPUk1fV0lOMzJzKQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSQorCWludAkgICAgZGVsYXkgPSAxOworCisJLyogS2VlcCB1cGRhdGluZyB0aGUgd2luZG93IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBzaGVsbCB0byBmaW5pc2guICovCisJZm9yICg7OykKKwl7CisJICAgIE1TRwltc2c7CisKKwkgICAgaWYgKFBlZWtNZXNzYWdlKCZtc2csIChIV05EKU5VTEwsIDAsIDAsIFBNX1JFTU9WRSkpCisJICAgIHsKKwkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKwkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworCSAgICB9CisJICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHBpLmhQcm9jZXNzLCBkZWxheSkgIT0gV0FJVF9USU1FT1VUKQorCQlicmVhazsKKworCSAgICAvKiBXZSBzdGFydCB3YWl0aW5nIGZvciBhIHZlcnkgc2hvcnQgdGltZSBhbmQgdGhlbiBpbmNyZWFzZSBpdCwgc28KKwkgICAgICogdGhhdCB3ZSByZXNwb25kIHF1aWNrbHkgd2hlbiB0aGUgcHJvY2VzcyBpcyBxdWljaywgYW5kIGRvbid0CisJICAgICAqIGNvbnN1bWUgdG9vIG11Y2ggb3ZlcmhlYWQgd2hlbiBpdCdzIHNsb3cuICovCisJICAgIGlmIChkZWxheSA8IDUwKQorCQlkZWxheSArPSAxMDsKKwl9CisjZWxzZQorCVdhaXRGb3JTaW5nbGVPYmplY3QocGkuaFByb2Nlc3MsIElORklOSVRFKTsKKyNlbmRpZgorCisJLyogR2V0IHRoZSBjb21tYW5kIGV4aXQgY29kZSAqLworCUdldEV4aXRDb2RlUHJvY2VzcyhwaS5oUHJvY2VzcywgJnJldCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBUaGlzIHVnbHkgY29kZSBpcyB0aGUgb25seSBxdWljayB3YXkgb2YgcGVyZm9ybWluZworCSAqIGEgc3luY2hyb25vdXMgc3Bhd24gdW5kZXIgV2luMzJzLiBZdWsuCisJICovCisJbnVtX3dpbmRvd3MgPSAwOworCUVudW1XaW5kb3dzKHdpbjMyc3N5bmNoX2NiLCAwKTsKKwlvbGRfbnVtX3dpbmRvd3MgPSBudW1fd2luZG93czsKKwlkbworCXsKKwkgICAgU2xlZXAoMTAwMCk7CisJICAgIG51bV93aW5kb3dzID0gMDsKKwkgICAgRW51bVdpbmRvd3Mod2luMzJzc3luY2hfY2IsIDApOworCX0gd2hpbGUgKG51bV93aW5kb3dzID09IG9sZF9udW1fd2luZG93cyk7CisJcmV0ID0gMDsKKyAgICB9CisKKyAgICAvKiBDbG9zZSB0aGUgaGFuZGxlcyB0byB0aGUgc3VicHJvY2Vzcywgc28gdGhhdCBpdCBnb2VzIGF3YXkgKi8KKyAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKKyAgICBDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7CisKKyAgICAvKiBUcnkgdG8gZ2V0IGlucHV0IGZvY3VzIGJhY2suICBEb2Vzbid0IGFsd2F5cyB3b3JrIHRob3VnaC4gKi8KKyAgICBQb3N0TWVzc2FnZShod25kLCBXTV9TRVRGT0NVUywgMCwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorI2Vsc2UKKworIyBkZWZpbmUgbWNoX3N5c3RlbShjLCBvKSBzeXN0ZW0oYykKKworI2VuZGlmCisKKy8qCisgKiBFaXRoZXIgZXhlY3V0ZSBhIGNvbW1hbmQgYnkgY2FsbGluZyB0aGUgc2hlbGwgb3Igc3RhcnQgYSBuZXcgc2hlbGwKKyAqLworICAgIGludAorbWNoX2NhbGxfc2hlbGwoCisgICAgY2hhcl91ICpjbWQsCisgICAgaW50IG9wdGlvbnMpCS8qIFNIRUxMXyosIHNlZSB2aW0uaCAqLworeworICAgIGludAkJeCA9IDA7CisgICAgaW50CQl0bW9kZSA9IGN1cl90bW9kZTsKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgY2hhciBzelNoZWxsVGl0bGVbNTEyXTsKKworICAgIC8qIENoYW5nZSB0aGUgdGl0bGUgdG8gcmVmbGVjdCB0aGF0IHdlIGFyZSBpbiBhIHN1YnNoZWxsLiAqLworICAgIGlmIChHZXRDb25zb2xlVGl0bGUoc3pTaGVsbFRpdGxlLCBzaXplb2Yoc3pTaGVsbFRpdGxlKSAtIDQpID4gMCkKKyAgICB7CisJaWYgKGNtZCA9PSBOVUxMKQorCSAgICBzdHJjYXQoc3pTaGVsbFRpdGxlLCAiIDpzaCIpOworCWVsc2UKKwl7CisJICAgIHN0cmNhdChzelNoZWxsVGl0bGUsICIgLSAhIik7CisJICAgIGlmICgoc3RybGVuKHN6U2hlbGxUaXRsZSkgKyBzdHJsZW4oY21kKSA8IHNpemVvZihzelNoZWxsVGl0bGUpKSkKKwkJc3RyY2F0KHN6U2hlbGxUaXRsZSwgY21kKTsKKwl9CisJbWNoX3NldHRpdGxlKHN6U2hlbGxUaXRsZSwgTlVMTCk7CisgICAgfQorI2VuZGlmCisKKyAgICBvdXRfZmx1c2goKTsKKworI2lmZGVmIE1DSF9XUklURV9EVU1QCisgICAgaWYgKGZkRHVtcCkKKyAgICB7CisJZnByaW50ZihmZER1bXAsICJtY2hfY2FsbF9zaGVsbChcIiVzXCIsICVkKVxuIiwgY21kLCBvcHRpb25zKTsKKwlmZmx1c2goZmREdW1wKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ2F0Y2ggYWxsIGRlYWRseSBzaWduYWxzIHdoaWxlIHJ1bm5pbmcgdGhlIGV4dGVybmFsIGNvbW1hbmQsIGJlY2F1c2UgYQorICAgICAqIENUUkwtQywgQ3RybC1CcmVhayBvciBpbGxlZ2FsIGluc3RydWN0aW9uICBtaWdodCBvdGhlcndpc2Uga2lsbCB1cy4KKyAgICAgKi8KKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBzaWduYWwoU0lHS0lMTCwgU0lHX0lHTik7CisjZWxzZQorICAgIHNpZ25hbChTSUdCUkVBSywgU0lHX0lHTik7CisjZW5kaWYKKyAgICBzaWduYWwoU0lHSUxMLCBTSUdfSUdOKTsKKyAgICBzaWduYWwoU0lHRlBFLCBTSUdfSUdOKTsKKyAgICBzaWduYWwoU0lHU0VHViwgU0lHX0lHTik7CisgICAgc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOworICAgIHNpZ25hbChTSUdBQlJULCBTSUdfSUdOKTsKKworICAgIGlmIChvcHRpb25zICYgU0hFTExfQ09PS0VEKQorCXNldHRtb2RlKFRNT0RFX0NPT0spOwkvKiBzZXQgdG8gbm9ybWFsIG1vZGUgKi8KKworICAgIGlmIChjbWQgPT0gTlVMTCkKKyAgICB7CisJeCA9IG1jaF9zeXN0ZW0ocF9zaCwgb3B0aW9ucyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogd2UgdXNlICJjb21tYW5kIiBvciAiY21kIiB0byBzdGFydCB0aGUgc2hlbGw7IHNsb3cgYnV0IGVhc3kgKi8KKwljaGFyX3UgKm5ld2NtZDsKKworCW5ld2NtZCA9IGxhbGxvYygobG9uZ191KSAoCisjaWZkZWYgRkVBVF9HVUlfVzMyCisJCVNUUkxFTih2aW1ydW5fcGF0aCkgKworI2VuZGlmCisJCVNUUkxFTihwX3NoKSArIFNUUkxFTihwX3NoY2YpICsgU1RSTEVOKGNtZCkgKyAxMCksIFRSVUUpOworCWlmIChuZXdjbWQgIT0gTlVMTCkKKwl7CisJICAgIGNoYXJfdSAqY21kYmFzZSA9ICgqY21kID09ICciJyA/IGNtZCArIDEgOiBjbWQpOworCisJICAgIGlmICgoU1RSTklDTVAoY21kYmFzZSwgInN0YXJ0IiwgNSkgPT0gMCkgJiYgdmltX2lzd2hpdGUoY21kYmFzZVs1XSkpCisJICAgIHsKKwkJU1RBUlRVUElORk8JCXNpOworCQlQUk9DRVNTX0lORk9STUFUSU9OCXBpOworCisJCXNpLmNiID0gc2l6ZW9mKHNpKTsKKwkJc2kubHBSZXNlcnZlZCA9IE5VTEw7CisJCXNpLmxwRGVza3RvcCA9IE5VTEw7CisJCXNpLmxwVGl0bGUgPSBOVUxMOworCQlzaS5kd0ZsYWdzID0gMDsKKwkJc2kuY2JSZXNlcnZlZDIgPSAwOworCQlzaS5scFJlc2VydmVkMiA9IE5VTEw7CisKKwkJY21kYmFzZSA9IHNraXB3aGl0ZShjbWRiYXNlICsgNSk7CisJCWlmICgoU1RSTklDTVAoY21kYmFzZSwgIi9taW4iLCA0KSA9PSAwKQorCQkJJiYgdmltX2lzd2hpdGUoY21kYmFzZVs0XSkpCisJCXsKKwkJICAgIGNtZGJhc2UgPSBza2lwd2hpdGUoY21kYmFzZSArIDQpOworCQkgICAgc2kuZHdGbGFncyA9IFNUQVJURl9VU0VTSE9XV0lORE9XOworCQkgICAgc2kud1Nob3dXaW5kb3cgPSBTV19TSE9XTUlOTk9BQ1RJVkU7CisJCX0KKworCQkvKiBXaGVuIHRoZSBjb21tYW5kIGlzIGluIGRvdWJsZSBxdW90ZXMsIGJ1dCAnc2hlbGx4cXVvdGUnIGlzCisJCSAqIGVtcHR5LCBrZWVwIHRoZSBkb3VibGUgcXVvdGVzIGFyb3VuZCB0aGUgY29tbWFuZC4KKwkJICogT3RoZXJ3aXNlIHJlbW92ZSB0aGUgZG91YmxlIHF1b3RlcywgdGhleSBhcmVuJ3QgbmVlZGVkCisJCSAqIGhlcmUsIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlIGEgc2hlbGwgdG8gcnVuIHRoZSBjb21tYW5kLiAqLworCQlpZiAoKmNtZCA9PSAnIicgJiYgKnBfc3hxID09IE5VTCkKKwkJeworCQkgICAgbmV3Y21kWzBdID0gJyInOworCQkgICAgU1RSQ1BZKG5ld2NtZCArIDEsIGNtZGJhc2UpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgU1RSQ1BZKG5ld2NtZCwgY21kYmFzZSk7CisJCSAgICBpZiAoKmNtZCA9PSAnIicgJiYgKm5ld2NtZCAhPSBOVUwpCisJCQluZXdjbWRbU1RSTEVOKG5ld2NtZCkgLSAxXSA9IE5VTDsKKwkJfQorCisJCS8qCisJCSAqIE5vdywgc3RhcnQgdGhlIGNvbW1hbmQgYXMgYSBwcm9jZXNzLCBzbyB0aGF0IGl0IGRvZXNuJ3QKKwkJICogaW5oZXJpdCBvdXIgaGFuZGxlcyB3aGljaCBjYXVzZXMgdW5wbGVhc2FudCBkYW5nbGluZyBzd2FwCisJCSAqIGZpbGVzIGlmIHdlIGV4aXQgYmVmb3JlIHRoZSBzcGF3bmVkIHByb2Nlc3MKKwkJICovCisJCWlmIChDcmVhdGVQcm9jZXNzIChOVUxMLAkvLyBFeGVjdXRhYmxlIG5hbWUKKwkJCW5ld2NtZCwJCQkvLyBDb21tYW5kIHRvIGV4ZWN1dGUKKwkJCU5VTEwsCQkJLy8gUHJvY2VzcyBzZWN1cml0eSBhdHRyaWJ1dGVzCisJCQlOVUxMLAkJCS8vIFRocmVhZCBzZWN1cml0eSBhdHRyaWJ1dGVzCisJCQlGQUxTRSwJCQkvLyBJbmhlcml0IGhhbmRsZXMKKwkJCUNSRUFURV9ORVdfQ09OU09MRSwJLy8gQ3JlYXRpb24gZmxhZ3MKKwkJCU5VTEwsCQkJLy8gRW52aXJvbm1lbnQKKwkJCU5VTEwsCQkJLy8gQ3VycmVudCBkaXJlY3RvcnkKKwkJCSZzaSwJCQkvLyBTdGFydHVwIGluZm9ybWF0aW9uCisJCQkmcGkpKQkJCS8vIFByb2Nlc3MgaW5mb3JtYXRpb24KKwkJICAgIHggPSAwOworCQllbHNlCisJCXsKKwkJICAgIHggPSAtMTsKKyNpZmRlZiBGRUFUX0dVSV9XMzIKKwkJICAgIEVNU0coXygiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiKSk7CisjZW5kaWYKKwkJfQorCQkvKiBDbG9zZSB0aGUgaGFuZGxlcyB0byB0aGUgc3VicHJvY2Vzcywgc28gdGhhdCBpdCBnb2VzIGF3YXkgKi8KKwkJQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7CisJCUNsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikKKwkJaWYgKG5lZWRfdmltcnVuX3dhcm5pbmcpCisJCXsKKwkJICAgIE1lc3NhZ2VCb3goTlVMTCwKKwkJCSAgICBfKCJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorCQkJCSJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorCQkJCSJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiksCisJCQkgICAgXygiVmltIFdhcm5pbmciKSwKKwkJCSAgICBNQl9JQ09OV0FSTklORyk7CisJCSAgICBuZWVkX3ZpbXJ1bl93YXJuaW5nID0gRkFMU0U7CisJCX0KKwkJaWYgKCFzX2RvbnRfdXNlX3ZpbXJ1bikKKwkJICAgIC8qIFVzZSB2aW1ydW4gdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4gIEl0IG9wZW5zIGEgY29uc29sZQorCQkgICAgICogd2luZG93LCB3aGljaCBjYW4gYmUgY2xvc2VkIHdpdGhvdXQga2lsbGluZyBWaW0uICovCisJCSAgICBzcHJpbnRmKChjaGFyICopbmV3Y21kLCAiJXMlcyVzICVzICVzIiwKKwkJCSAgICB2aW1ydW5fcGF0aCwKKwkJCSAgICAobXNnX3NpbGVudCAhPSAwIHx8IChvcHRpb25zICYgU0hFTExfRE9PVVQpKQorCQkJCQkJCQkgPyAiLXMgIiA6ICIiLAorCQkJICAgIHBfc2gsIHBfc2hjZiwgY21kKTsKKwkJZWxzZQorI2VuZGlmCisJCSAgICBzcHJpbnRmKChjaGFyICopbmV3Y21kLCAiJXMgJXMgJXMiLCBwX3NoLCBwX3NoY2YsIGNtZCk7CisJCXggPSBtY2hfc3lzdGVtKChjaGFyICopbmV3Y21kLCBvcHRpb25zKTsKKwkgICAgfQorCSAgICB2aW1fZnJlZShuZXdjbWQpOworCX0KKyAgICB9CisKKyAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorCXNldHRtb2RlKFRNT0RFX1JBVyk7CS8qIHNldCB0byByYXcgbW9kZSAqLworCisgICAgLyogUHJpbnQgdGhlIHJldHVybiB2YWx1ZSwgdW5sZXNzICJ2aW1ydW4iIHdhcyB1c2VkLiAqLworICAgIGlmICh4ICE9IDAgJiYgIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSAmJiAhZW1zZ19zaWxlbnQKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikKKwkJJiYgKChvcHRpb25zICYgU0hFTExfRE9PVVQpIHx8IHNfZG9udF91c2VfdmltcnVuKQorI2VuZGlmCisJICAgICkKKyAgICB7CisJc21zZyhfKCJzaGVsbCByZXR1cm5lZCAlZCIpLCB4KTsKKwltc2dfcHV0Y2hhcignXG4nKTsKKyAgICB9CisjaWZkZWYgRkVBVF9USVRMRQorICAgIHJlc2V0dGl0bGUoKTsKKyNlbmRpZgorCisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisgICAgc2lnbmFsKFNJR0tJTEwsIFNJR19ERkwpOworI2Vsc2UKKyAgICBzaWduYWwoU0lHQlJFQUssIFNJR19ERkwpOworI2VuZGlmCisgICAgc2lnbmFsKFNJR0lMTCwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7CisgICAgc2lnbmFsKFNJR1NFR1YsIFNJR19ERkwpOworICAgIHNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7CisKKyAgICByZXR1cm4geDsKK30KKworCisjaWZuZGVmIEZFQVRfR1VJX1czMgorCisvKgorICogU3RhcnQgdGVybWNhcCBtb2RlCisgKi8KKyAgICBzdGF0aWMgdm9pZAordGVybWNhcF9tb2RlX3N0YXJ0KHZvaWQpCit7CisgICAgRFdPUkQgY21vZGVpbjsKKworICAgIGlmIChnX2ZUZXJtY2FwTW9kZSkKKwlyZXR1cm47CisKKyAgICBTYXZlQ29uc29sZUJ1ZmZlcigmZ19jYk5vblRlcm1jYXApOworCisgICAgaWYgKGdfY2JUZXJtY2FwLklzVmFsaWQpCisgICAgeworCS8qCisJICogV2UndmUgYmVlbiBpbiB0ZXJtY2FwIG1vZGUgYmVmb3JlLiAgUmVzdG9yZSBjZXJ0YWluIHNjcmVlbgorCSAqIGNoYXJhY3RlcmlzdGljcywgaW5jbHVkaW5nIHRoZSBidWZmZXIgc2l6ZSBhbmQgdGhlIHdpbmRvdworCSAqIHNpemUuICBTaW5jZSB3ZSB3aWxsIGJlIHJlZHJhd2luZyB0aGUgc2NyZWVuLCB3ZSBkb24ndCBuZWVkCisJICogdG8gcmVzdG9yZSB0aGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisJICovCisJUmVzdG9yZUNvbnNvbGVCdWZmZXIoJmdfY2JUZXJtY2FwLCBGQUxTRSk7CisJU2V0Q29uc29sZVdpbmRvd0luZm8oZ19oQ29uT3V0LCBUUlVFLCAmZ19jYlRlcm1jYXAuSW5mby5zcldpbmRvdyk7CisJUm93cyA9IGdfY2JUZXJtY2FwLkluZm8uZHdTaXplLlk7CisJQ29sdW1ucyA9IGdfY2JUZXJtY2FwLkluZm8uZHdTaXplLlg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBUaGlzIGlzIG91ciBmaXJzdCB0aW1lIGVudGVyaW5nIHRlcm1jYXAgbW9kZS4gIENsZWFyIHRoZSBjb25zb2xlCisJICogc2NyZWVuIGJ1ZmZlciwgYW5kIHJlc2l6ZSB0aGUgYnVmZmVyIHRvIG1hdGNoIHRoZSBjdXJyZW50IHdpbmRvdworCSAqIHNpemUuICBXZSB3aWxsIHVzZSB0aGlzIGFzIHRoZSBzaXplIG9mIG91ciBlZGl0aW5nIGVudmlyb25tZW50LgorCSAqLworCUNsZWFyQ29uc29sZUJ1ZmZlcihnX2F0dHJDdXJyZW50KTsKKwlSZXNpemVDb25CdWZBbmRXaW5kb3coZ19oQ29uT3V0LCBDb2x1bW5zLCBSb3dzKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1RJVExFCisgICAgcmVzZXR0aXRsZSgpOworI2VuZGlmCisKKyAgICBHZXRDb25zb2xlTW9kZShnX2hDb25JbiwgJmNtb2RlaW4pOworI2lmZGVmIEZFQVRfTU9VU0UKKyAgICBpZiAoZ19mTW91c2VBY3RpdmUpCisJY21vZGVpbiB8PSBFTkFCTEVfTU9VU0VfSU5QVVQ7CisgICAgZWxzZQorCWNtb2RlaW4gJj0gfkVOQUJMRV9NT1VTRV9JTlBVVDsKKyNlbmRpZgorICAgIGNtb2RlaW4gfD0gRU5BQkxFX1dJTkRPV19JTlBVVDsKKyAgICBTZXRDb25zb2xlTW9kZShnX2hDb25JbiwgY21vZGVpbik7CisKKyAgICByZWRyYXdfbGF0ZXJfY2xlYXIoKTsKKyAgICBnX2ZUZXJtY2FwTW9kZSA9IFRSVUU7Cit9CisKKworLyoKKyAqIEVuZCB0ZXJtY2FwIG1vZGUKKyAqLworICAgIHN0YXRpYyB2b2lkCit0ZXJtY2FwX21vZGVfZW5kKHZvaWQpCit7CisgICAgRFdPUkQgY21vZGVpbjsKKyAgICBDb25zb2xlQnVmZmVyICpjYjsKKyAgICBDT09SRCBjb29yZDsKKyAgICBEV09SRCBkd0R1bW15OworCisgICAgaWYgKCFnX2ZUZXJtY2FwTW9kZSkKKwlyZXR1cm47CisKKyAgICBTYXZlQ29uc29sZUJ1ZmZlcigmZ19jYlRlcm1jYXApOworCisgICAgR2V0Q29uc29sZU1vZGUoZ19oQ29uSW4sICZjbW9kZWluKTsKKyAgICBjbW9kZWluICY9IH4oRU5BQkxFX01PVVNFX0lOUFVUIHwgRU5BQkxFX1dJTkRPV19JTlBVVCk7CisgICAgU2V0Q29uc29sZU1vZGUoZ19oQ29uSW4sIGNtb2RlaW4pOworCisjaWZkZWYgRkVBVF9SRVNUT1JFX09SSUdfU0NSRUVOCisgICAgY2IgPSBleGl0aW5nID8gJmdfY2JPcmlnIDogJmdfY2JOb25UZXJtY2FwOworI2Vsc2UKKyAgICBjYiA9ICZnX2NiTm9uVGVybWNhcDsKKyNlbmRpZgorICAgIFJlc3RvcmVDb25zb2xlQnVmZmVyKGNiLCBwX3JzKTsKKyAgICBTZXRDb25zb2xlQ3Vyc29ySW5mbyhnX2hDb25PdXQsICZnX2NjaSk7CisKKyAgICBpZiAocF9ycyB8fCBleGl0aW5nKQorICAgIHsKKwkvKgorCSAqIENsZWFyIGFueXRoaW5nIHRoYXQgaGFwcGVucyB0byBiZSBvbiB0aGUgY3VycmVudCBsaW5lLgorCSAqLworCWNvb3JkLlggPSAwOworCWNvb3JkLlkgPSAoU0hPUlQpIChwX3JzID8gY2ItPkluZm8uZHdDdXJzb3JQb3NpdGlvbi5ZIDogKFJvd3MgLSAxKSk7CisJRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoZ19oQ29uT3V0LCAnICcsCisJCWNiLT5JbmZvLmR3U2l6ZS5YLCBjb29yZCwgJmR3RHVtbXkpOworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBqdXN0IGZvciBhZXN0aGV0aWNzLiAgSWYgd2UgYXJlIGV4aXRpbmcgd2l0aG91dAorCSAqIHJlc3RvcmluZyB0aGUgc2NyZWVuLCB0aGVuIHdlIHdhbnQgdG8gaGF2ZSBhIHByb21wdCBzdHJpbmcKKwkgKiBhcHBlYXIgYXQgdGhlIGJvdHRvbSBsaW5lLiAgSG93ZXZlciwgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIKKwkgKiBzZWVtcyB0byBhbHdheXMgYWR2YW5jZSB0aGUgY3Vyc29yIG9uZSBsaW5lIGJlZm9yZSBkaXNwbGF5aW5nCisJICogdGhlIHByb21wdCBzdHJpbmcsIHdoaWNoIGNhdXNlcyB0aGUgc2NyZWVuIHRvIHNjcm9sbC4gIFRvCisJICogY291bnRlciB0aGlzLCBtb3ZlIHRoZSBjdXJzb3IgdXAgb25lIGxpbmUgYmVmb3JlIGV4aXRpbmcuCisJICovCisJaWYgKGV4aXRpbmcgJiYgIXBfcnMpCisJICAgIGNvb3JkLlktLTsKKwkvKgorCSAqIFBvc2l0aW9uIHRoZSBjdXJzb3IgYXQgdGhlIGxlZnRtb3N0IGNvbHVtbiBvZiB0aGUgZGVzaXJlZCByb3cuCisJICovCisJU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGdfaENvbk91dCwgY29vcmQpOworICAgIH0KKworICAgIGdfZlRlcm1jYXBNb2RlID0gRkFMU0U7Cit9CisjZW5kaWYgLyogRkVBVF9HVUlfVzMyICovCisKKworI2lmZGVmIEZFQVRfR1VJX1czMgorICAgIHZvaWQKK21jaF93cml0ZSgKKyAgICBjaGFyX3UgICpzLAorICAgIGludAkgICAgbGVuKQoreworICAgIC8qIG5ldmVyIHVzZWQgKi8KK30KKworI2Vsc2UKKworLyoKKyAqIGNsZWFyIGBuJyBjaGFycywgc3RhcnRpbmcgZnJvbSBgY29vcmQnCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfY2hhcnMoCisgICAgQ09PUkQgY29vcmQsCisgICAgRFdPUkQgbikKK3sKKyAgICBEV09SRCBkd0R1bW15OworCisgICAgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoZ19oQ29uT3V0LCAnICcsIG4sIGNvb3JkLCAmZHdEdW1teSk7CisgICAgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoZ19oQ29uT3V0LCBnX2F0dHJDdXJyZW50LCBuLCBjb29yZCwgJmR3RHVtbXkpOworfQorCisKKy8qCisgKiBDbGVhciB0aGUgc2NyZWVuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfc2NyZWVuKHZvaWQpCit7CisgICAgZ19jb29yZC5YID0gZ19jb29yZC5ZID0gMDsKKyAgICBjbGVhcl9jaGFycyhnX2Nvb3JkLCBSb3dzICogQ29sdW1ucyk7Cit9CisKKworLyoKKyAqIENsZWFyIHRvIGVuZCBvZiBkaXNwbGF5CisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfdG9fZW5kX29mX2Rpc3BsYXkodm9pZCkKK3sKKyAgICBjbGVhcl9jaGFycyhnX2Nvb3JkLCAoUm93cyAtIGdfY29vcmQuWSAtIDEpCisJCQkJCSAgICogQ29sdW1ucyArIChDb2x1bW5zIC0gZ19jb29yZC5YKSk7Cit9CisKKworLyoKKyAqIENsZWFyIHRvIGVuZCBvZiBsaW5lCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfdG9fZW5kX29mX2xpbmUodm9pZCkKK3sKKyAgICBjbGVhcl9jaGFycyhnX2Nvb3JkLCBDb2x1bW5zIC0gZ19jb29yZC5YKTsKK30KKworCisvKgorICogU2Nyb2xsIHRoZSBzY3JvbGwgcmVnaW9uIHVwIGJ5IGBjTGluZXMnIGxpbmVzCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2Nyb2xsKAorICAgIHVuc2lnbmVkIGNMaW5lcykKK3sKKyAgICBDT09SRCBvbGRjb29yZCA9IGdfY29vcmQ7CisKKyAgICBnb3RveHkoZ19zclNjcm9sbFJlZ2lvbi5MZWZ0ICsgMSwgZ19zclNjcm9sbFJlZ2lvbi5Ub3AgKyAxKTsKKyAgICBkZWxldGVfbGluZXMoY0xpbmVzKTsKKworICAgIGdfY29vcmQgPSBvbGRjb29yZDsKK30KKworCisvKgorICogU2V0IHRoZSBzY3JvbGwgcmVnaW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2V0X3Njcm9sbF9yZWdpb24oCisgICAgdW5zaWduZWQgbGVmdCwKKyAgICB1bnNpZ25lZCB0b3AsCisgICAgdW5zaWduZWQgcmlnaHQsCisgICAgdW5zaWduZWQgYm90dG9tKQoreworICAgIGlmIChsZWZ0ID49IHJpZ2h0CisJICAgIHx8IHRvcCA+PSBib3R0b20KKwkgICAgfHwgcmlnaHQgPiAodW5zaWduZWQpIENvbHVtbnMgLSAxCisJICAgIHx8IGJvdHRvbSA+ICh1bnNpZ25lZCkgUm93cyAtIDEpCisJcmV0dXJuOworCisgICAgZ19zclNjcm9sbFJlZ2lvbi5MZWZ0ID0gICBsZWZ0OworICAgIGdfc3JTY3JvbGxSZWdpb24uVG9wID0gICAgdG9wOworICAgIGdfc3JTY3JvbGxSZWdpb24uUmlnaHQgPSAgcmlnaHQ7CisgICAgZ19zclNjcm9sbFJlZ2lvbi5Cb3R0b20gPSBib3R0b207Cit9CisKKworLyoKKyAqIEluc2VydCBgY0xpbmVzJyBsaW5lcyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbnNlcnRfbGluZXMoCisgICAgdW5zaWduZWQgY0xpbmVzKQoreworICAgIFNNQUxMX1JFQ1QJICAgIHNvdXJjZTsKKyAgICBDT09SRAkgICAgZGVzdDsKKyAgICBDSEFSX0lORk8JICAgIGZpbGw7CisKKyAgICBkZXN0LlggPSAwOworICAgIGRlc3QuWSA9IGdfY29vcmQuWSArIGNMaW5lczsKKworICAgIHNvdXJjZS5MZWZ0ICAgPSAwOworICAgIHNvdXJjZS5Ub3AJICA9IGdfY29vcmQuWTsKKyAgICBzb3VyY2UuUmlnaHQgID0gZ19zclNjcm9sbFJlZ2lvbi5SaWdodDsKKyAgICBzb3VyY2UuQm90dG9tID0gZ19zclNjcm9sbFJlZ2lvbi5Cb3R0b20gLSBjTGluZXM7CisKKyAgICBmaWxsLkNoYXIuQXNjaWlDaGFyID0gJyAnOworICAgIGZpbGwuQXR0cmlidXRlcyA9IGdfYXR0ckN1cnJlbnQ7CisKKyAgICBTY3JvbGxDb25zb2xlU2NyZWVuQnVmZmVyKGdfaENvbk91dCwgJnNvdXJjZSwgTlVMTCwgZGVzdCwgJmZpbGwpOworCisgICAgLyogSGVyZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhIHdpbjMyIGNvbnNvbGUgZmxha2U6IElmIHRoZSBzY3JvbGwKKyAgICAgKiByZWdpb24gbG9va3MgbGlrZSBhYmMgYW5kIHdlIHNjcm9sbCBjIHRvIGEgYW5kIGZpbGwgd2l0aCBkIHdlIGdldAorICAgICAqIGNiZC4uLiBpZiB3ZSBzY3JvbGwgYmxvY2sgYyBvbmUgbGluZSBhdCBhIHRpbWUgdG8gYSwgd2UgZ2V0IGNkZC4uLgorICAgICAqIHZpbSBleHBlY3RzIGNkZCBjb25zaXN0ZW50bHkuLi4gU28gd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhhdAorICAgICAqIGhlcmUuLi4gKHRoaXMgYWxzbyBvY2N1cnMgc2Nyb2xsaW5nIHRoZSBzYW1lIHdheSBpbiB0aGUgb3RoZXIKKyAgICAgKiBkaXJlY3Rpb24pLiAgKi8KKworICAgIGlmIChzb3VyY2UuQm90dG9tIDwgZGVzdC5ZKQorICAgIHsKKwlDT09SRCBjb29yZDsKKworCWNvb3JkLlggPSAwOworCWNvb3JkLlkgPSBzb3VyY2UuQm90dG9tOworCWNsZWFyX2NoYXJzKGNvb3JkLCBDb2x1bW5zICogKGRlc3QuWSAtIHNvdXJjZS5Cb3R0b20pKTsKKyAgICB9Cit9CisKKworLyoKKyAqIERlbGV0ZSBgY0xpbmVzJyBsaW5lcyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KKyAqLworICAgIHN0YXRpYyB2b2lkCitkZWxldGVfbGluZXMoCisgICAgdW5zaWduZWQgY0xpbmVzKQoreworICAgIFNNQUxMX1JFQ1QJICAgIHNvdXJjZTsKKyAgICBDT09SRAkgICAgZGVzdDsKKyAgICBDSEFSX0lORk8JICAgIGZpbGw7CisgICAgaW50CQkgICAgbmI7CisKKyAgICBkZXN0LlggPSAwOworICAgIGRlc3QuWSA9IGdfY29vcmQuWTsKKworICAgIHNvdXJjZS5MZWZ0ICAgPSAwOworICAgIHNvdXJjZS5Ub3AJICA9IGdfY29vcmQuWSArIGNMaW5lczsKKyAgICBzb3VyY2UuUmlnaHQgID0gZ19zclNjcm9sbFJlZ2lvbi5SaWdodDsKKyAgICBzb3VyY2UuQm90dG9tID0gZ19zclNjcm9sbFJlZ2lvbi5Cb3R0b207CisKKyAgICBmaWxsLkNoYXIuQXNjaWlDaGFyID0gJyAnOworICAgIGZpbGwuQXR0cmlidXRlcyA9IGdfYXR0ckN1cnJlbnQ7CisKKyAgICBTY3JvbGxDb25zb2xlU2NyZWVuQnVmZmVyKGdfaENvbk91dCwgJnNvdXJjZSwgTlVMTCwgZGVzdCwgJmZpbGwpOworCisgICAgLyogSGVyZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhIHdpbjMyIGNvbnNvbGUgZmxha2U6IElmIHRoZSBzY3JvbGwKKyAgICAgKiByZWdpb24gbG9va3MgbGlrZSBhYmMgYW5kIHdlIHNjcm9sbCBjIHRvIGEgYW5kIGZpbGwgd2l0aCBkIHdlIGdldAorICAgICAqIGNiZC4uLiBpZiB3ZSBzY3JvbGwgYmxvY2sgYyBvbmUgbGluZSBhdCBhIHRpbWUgdG8gYSwgd2UgZ2V0IGNkZC4uLgorICAgICAqIHZpbSBleHBlY3RzIGNkZCBjb25zaXN0ZW50bHkuLi4gU28gd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhhdAorICAgICAqIGhlcmUuLi4gKHRoaXMgYWxzbyBvY2N1cnMgc2Nyb2xsaW5nIHRoZSBzYW1lIHdheSBpbiB0aGUgb3RoZXIKKyAgICAgKiBkaXJlY3Rpb24pLiAgKi8KKworICAgIG5iID0gZGVzdC5ZICsgKHNvdXJjZS5Cb3R0b20gLSBzb3VyY2UuVG9wKSArIDE7CisKKyAgICBpZiAobmIgPCBzb3VyY2UuVG9wKQorICAgIHsKKwlDT09SRCBjb29yZDsKKworCWNvb3JkLlggPSAwOworCWNvb3JkLlkgPSBuYjsKKwljbGVhcl9jaGFycyhjb29yZCwgQ29sdW1ucyAqIChzb3VyY2UuVG9wIC0gbmIpKTsKKyAgICB9Cit9CisKKworLyoKKyAqIFNldCB0aGUgY3Vyc29yIHBvc2l0aW9uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ290b3h5KAorICAgIHVuc2lnbmVkIHgsCisgICAgdW5zaWduZWQgeSkKK3sKKyAgICBpZiAoeCA8IDEgfHwgeCA+ICh1bnNpZ25lZClDb2x1bW5zIHx8IHkgPCAxIHx8IHkgPiAodW5zaWduZWQpUm93cykKKwlyZXR1cm47CisKKyAgICAvKiBleHRlcm5hbCBjdXJzb3IgY29vcmRzIGFyZSAxLWJhc2VkOyBpbnRlcm5hbCBhcmUgMC1iYXNlZCAqLworICAgIGdfY29vcmQuWCA9IHggLSAxOworICAgIGdfY29vcmQuWSA9IHkgLSAxOworICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihnX2hDb25PdXQsIGdfY29vcmQpOworfQorCisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBhdHRyaWJ1dGUgPSAoZm9yZWdyb3VuZCB8IGJhY2tncm91bmQpCisgKiBTZWUgLi4vZG9jL29zX3dpbjMyLnR4dCBmb3IgdGhlIG51bWJlcnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordGV4dGF0dHIoCisgICAgV09SRCB3QXR0cikKK3sKKyAgICBnX2F0dHJDdXJyZW50ID0gd0F0dHI7CisKKyAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShnX2hDb25PdXQsIHdBdHRyKTsKK30KKworCisgICAgc3RhdGljIHZvaWQKK3RleHRjb2xvcigKKyAgICBXT1JEIHdBdHRyKQoreworICAgIGdfYXR0ckN1cnJlbnQgPSAoZ19hdHRyQ3VycmVudCAmIDB4ZjApICsgd0F0dHI7CisKKyAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShnX2hDb25PdXQsIGdfYXR0ckN1cnJlbnQpOworfQorCisKKyAgICBzdGF0aWMgdm9pZAordGV4dGJhY2tncm91bmQoCisgICAgV09SRCB3QXR0cikKK3sKKyAgICBnX2F0dHJDdXJyZW50ID0gKGdfYXR0ckN1cnJlbnQgJiAweDBmKSArICh3QXR0ciA8PCA0KTsKKworICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKGdfaENvbk91dCwgZ19hdHRyQ3VycmVudCk7Cit9CisKKworLyoKKyAqIHJlc3RvcmUgdGhlIGRlZmF1bHQgdGV4dCBhdHRyaWJ1dGUgKHdoYXRldmVyIHdlIHN0YXJ0ZWQgd2l0aCkKKyAqLworICAgIHN0YXRpYyB2b2lkCitub3JtdmlkZW8oKQoreworICAgIHRleHRhdHRyKGdfYXR0ckRlZmF1bHQpOworfQorCisKK3N0YXRpYyBXT1JEIGdfYXR0clByZVN0YW5kb3V0ID0gMDsKKworLyoKKyAqIE1ha2UgdGhlIHRleHQgc3RhbmRvdXQsIGJ5IGJyaWdodGVuaW5nIGl0CisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3RhbmRvdXQodm9pZCkKK3sKKyAgICBnX2F0dHJQcmVTdGFuZG91dCA9IGdfYXR0ckN1cnJlbnQ7CisgICAgdGV4dGF0dHIoKFdPUkQpIChnX2F0dHJDdXJyZW50fEZPUkVHUk9VTkRfSU5URU5TSVRZfEJBQ0tHUk9VTkRfSU5URU5TSVRZKSk7Cit9CisKKworLyoKKyAqIFR1cm4gb2ZmIHN0YW5kb3V0IG1vZGUKKyAqLworICAgIHN0YXRpYyB2b2lkCitzdGFuZGVuZCgpCit7CisgICAgaWYgKGdfYXR0clByZVN0YW5kb3V0KQorICAgIHsKKwl0ZXh0YXR0cihnX2F0dHJQcmVTdGFuZG91dCk7CisJZ19hdHRyUHJlU3RhbmRvdXQgPSAwOworICAgIH0KK30KKworCisvKgorICogU2V0IG5vcm1hbCBmZy9iZyBjb2xvciwgYmFzZWQgb24gVF9NRS4gIENhbGxlZCB3aGVtIHRfbWUgaGFzIGJlZW4gc2V0LgorICovCisgICAgdm9pZAorbWNoX3NldF9ub3JtYWxfY29sb3JzKCkKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQluOworCisgICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKGdfYXR0ckRlZmF1bHQgJiAweGYpICsgMTsKKyAgICBjdGVybV9ub3JtYWxfYmdfY29sb3IgPSAoKGdfYXR0ckRlZmF1bHQgPj4gNCkgJiAweGYpICsgMTsKKyAgICBpZiAoVF9NRVswXSA9PSBFU0MgJiYgVF9NRVsxXSA9PSAnfCcpCisgICAgeworCXAgPSBUX01FICsgMjsKKwluID0gZ2V0ZGlnaXRzKCZwKTsKKwlpZiAoKnAgPT0gJ20nICYmIG4gPiAwKQorCXsKKwkgICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKG4gJiAweGYpICsgMTsKKwkgICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChuID4+IDQpICYgMHhmKSArIDE7CisJfQorICAgIH0KK30KKworCisvKgorICogdmlzdWFsIGJlbGw6IGZsYXNoIHRoZSBzY3JlZW4KKyAqLworICAgIHN0YXRpYyB2b2lkCit2aXN1YWxfYmVsbCgpCit7CisgICAgQ09PUkQgICBjb29yZE9yaWdpbiA9IHswLCAwfTsKKyAgICBXT1JEICAgIGF0dHJGbGFzaCA9IH5nX2F0dHJDdXJyZW50ICYgMHhmZjsKKworICAgIERXT1JEICAgZHdEdW1teTsKKyAgICBMUFdPUkQgIG9sZGF0dHJzID0gKExQV09SRClhbGxvYyhSb3dzICogQ29sdW1ucyAqIHNpemVvZihXT1JEKSk7CisKKyAgICBpZiAob2xkYXR0cnMgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgUmVhZENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoZ19oQ29uT3V0LCBvbGRhdHRycywgUm93cyAqIENvbHVtbnMsCisJCQkgICAgICAgY29vcmRPcmlnaW4sICZkd0R1bW15KTsKKyAgICBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShnX2hDb25PdXQsIGF0dHJGbGFzaCwgUm93cyAqIENvbHVtbnMsCisJCQkgICAgICAgY29vcmRPcmlnaW4sICZkd0R1bW15KTsKKworICAgIFNsZWVwKDE1KTsJICAgIC8qIHdhaXQgZm9yIDE1IG1zZWMgKi8KKyAgICBXcml0ZUNvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoZ19oQ29uT3V0LCBvbGRhdHRycywgUm93cyAqIENvbHVtbnMsCisJCQkJY29vcmRPcmlnaW4sICZkd0R1bW15KTsKKyAgICB2aW1fZnJlZShvbGRhdHRycyk7Cit9CisKKworLyoKKyAqIE1ha2UgdGhlIGN1cnNvciB2aXNpYmxlIG9yIGludmlzaWJsZQorICovCisgICAgc3RhdGljIHZvaWQKK2N1cnNvcl92aXNpYmxlKAorICAgIEJPT0wgZlZpc2libGUpCit7CisgICAgc19jdXJzb3JfdmlzaWJsZSA9IGZWaXNpYmxlOworI2lmZGVmIE1DSF9DVVJTT1JfU0hBUEUKKyAgICBtY2hfdXBkYXRlX2N1cnNvcigpOworI2VuZGlmCit9CisKKworLyoKKyAqIHdyaXRlIGBjY2hUb1dyaXRlJyBjaGFyYWN0ZXJzIGluIGBwY2hCdWYnIHRvIHRoZSBzY3JlZW4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHdyaXR0ZW4gKGF0IGxlYXN0IG9uZSkuCisgKi8KKyAgICBzdGF0aWMgQk9PTAord3JpdGVfY2hhcnMoCisgICAgTFBDU1RSIHBjaEJ1ZiwKKyAgICBEV09SRCAgY2NoVG9Xcml0ZSkKK3sKKyAgICBDT09SRCBjb29yZCA9IGdfY29vcmQ7CisgICAgRFdPUkQgd3JpdHRlbjsKKworICAgIEZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGdfaENvbk91dCwgZ19hdHRyQ3VycmVudCwgY2NoVG9Xcml0ZSwKKwkJCQljb29yZCwgJndyaXR0ZW4pOworICAgIC8qIFdoZW4gd3JpdGluZyBmYWlscyBvciBkaWRuJ3Qgd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLCBwcmV0ZW5kIG9uZQorICAgICAqIGNoYXJhY3RlciB3YXMgd3JpdHRlbiwgb3RoZXJ3aXNlIHdlIGdldCBzdHVjay4gKi8KKyAgICBpZiAoV3JpdGVDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKGdfaENvbk91dCwgcGNoQnVmLCBjY2hUb1dyaXRlLAorCQkJCWNvb3JkLCAmd3JpdHRlbikgPT0gMAorCSAgICB8fCB3cml0dGVuID09IDApCisJd3JpdHRlbiA9IDE7CisKKyAgICBnX2Nvb3JkLlggKz0gKFNIT1JUKSB3cml0dGVuOworCisgICAgd2hpbGUgKGdfY29vcmQuWCA+IGdfc3JTY3JvbGxSZWdpb24uUmlnaHQpCisgICAgeworCWdfY29vcmQuWCAtPSAoU0hPUlQpIENvbHVtbnM7CisJaWYgKGdfY29vcmQuWSA8IGdfc3JTY3JvbGxSZWdpb24uQm90dG9tKQorCSAgICBnX2Nvb3JkLlkrKzsKKyAgICB9CisKKyAgICBnb3RveHkoZ19jb29yZC5YICsgMSwgZ19jb29yZC5ZICsgMSk7CisKKyAgICByZXR1cm4gd3JpdHRlbjsKK30KKworCisvKgorICogbWNoX3dyaXRlKCk6IHdyaXRlIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzY3JlZW4sIHRyYW5zbGF0aW5nIEVTQworICogc2VxdWVuY2VzIGludG8gY2FsbHMgdG8gY29uc29sZSBvdXRwdXQgcm91dGluZXMuCisgKi8KKyAgICB2b2lkCittY2hfd3JpdGUoCisgICAgY2hhcl91ICAqcywKKyAgICBpbnQJICAgIGxlbikKK3sKKyAgICBzW2xlbl0gPSBOVUw7CisKKyAgICBpZiAoIXRlcm1fY29uc29sZSkKKyAgICB7CisJd3JpdGUoMSwgcywgKHVuc2lnbmVkKWxlbik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIHRyYW5zbGF0ZSBFU0MgfCBzZXF1ZW5jZXMgaW50byBmYWtlZCBiaW9zIGNhbGxzICovCisgICAgd2hpbGUgKGxlbi0tKQorICAgIHsKKwkvKiBvcHRpbWl6YXRpb246IHVzZSBvbmUgc2luZ2xlIHdyaXRlX2NoYXJzIGZvciBydW5zIG9mIHRleHQsCisJICogcmF0aGVyIHRoYW4gb25jZSBwZXIgY2hhcmFjdGVyICBJdCBhaW4ndCBjdXJzZXMsIGJ1dCBpdCBoZWxwcy4gKi8KKwlEV09SRCAgcHJlZml4ID0gc3RyY3NwbihzLCAiXG5cclxiXGFcMDMzIik7CisKKwlpZiAocF93ZCkKKwl7CisJICAgIFdhaXRGb3JDaGFyKHBfd2QpOworCSAgICBpZiAocHJlZml4ICE9IDApCisJCXByZWZpeCA9IDE7CisJfQorCisJaWYgKHByZWZpeCAhPSAwKQorCXsKKwkgICAgRFdPUkQgbldyaXR0ZW47CisKKwkgICAgbldyaXR0ZW4gPSB3cml0ZV9jaGFycyhzLCBwcmVmaXgpOworI2lmZGVmIE1DSF9XUklURV9EVU1QCisJICAgIGlmIChmZER1bXApCisJICAgIHsKKwkJZnB1dGMoJz4nLCBmZER1bXApOworCQlmd3JpdGUocywgc2l6ZW9mKGNoYXJfdSksIG5Xcml0dGVuLCBmZER1bXApOworCQlmcHV0cygiPFxuIiwgZmREdW1wKTsKKwkgICAgfQorI2VuZGlmCisJICAgIGxlbiAtPSAobldyaXR0ZW4gLSAxKTsKKwkgICAgcyArPSBuV3JpdHRlbjsKKwl9CisJZWxzZSBpZiAoc1swXSA9PSAnXG4nKQorCXsKKwkgICAgLyogXG4sIG5ld2xpbmU6IGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSBvciBzY3JvbGwgKi8KKwkgICAgaWYgKGdfY29vcmQuWSA9PSBnX3NyU2Nyb2xsUmVnaW9uLkJvdHRvbSkKKwkgICAgeworCQlzY3JvbGwoMSk7CisJCWdvdG94eShnX3NyU2Nyb2xsUmVnaW9uLkxlZnQgKyAxLCBnX3NyU2Nyb2xsUmVnaW9uLkJvdHRvbSArIDEpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlnb3RveHkoZ19zclNjcm9sbFJlZ2lvbi5MZWZ0ICsgMSwgZ19jb29yZC5ZICsgMik7CisJICAgIH0KKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCSAgICBpZiAoZmREdW1wKQorCQlmcHV0cygiXFxuXG4iLCBmZER1bXApOworI2VuZGlmCisJICAgIHMrKzsKKwl9CisJZWxzZSBpZiAoc1swXSA9PSAnXHInKQorCXsKKwkgICAgLyogXHIsIGNhcnJpYWdlIHJldHVybjogZ28gdG8gYmVnaW5uaW5nIG9mIGxpbmUgKi8KKwkgICAgZ290b3h5KGdfc3JTY3JvbGxSZWdpb24uTGVmdCsxLCBnX2Nvb3JkLlkgKyAxKTsKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCSAgICBpZiAoZmREdW1wKQorCQlmcHV0cygiXFxyXG4iLCBmZER1bXApOworI2VuZGlmCisJICAgIHMrKzsKKwl9CisJZWxzZSBpZiAoc1swXSA9PSAnXGInKQorCXsKKwkgICAgLyogXGIsIGJhY2tzcGFjZTogbW92ZSBjdXJzb3Igb25lIHBvc2l0aW9uIGxlZnQgKi8KKwkgICAgaWYgKGdfY29vcmQuWCA+IGdfc3JTY3JvbGxSZWdpb24uTGVmdCkKKwkJZ19jb29yZC5YLS07CisJICAgIGVsc2UgaWYgKGdfY29vcmQuWSA+IGdfc3JTY3JvbGxSZWdpb24uVG9wKQorCSAgICB7CisJCWdfY29vcmQuWCA9IGdfc3JTY3JvbGxSZWdpb24uUmlnaHQ7CisJCWdfY29vcmQuWS0tOworCSAgICB9CisJICAgIGdvdG94eShnX2Nvb3JkLlggKyAxLCBnX2Nvb3JkLlkgKyAxKTsKKyNpZmRlZiBNQ0hfV1JJVEVfRFVNUAorCSAgICBpZiAoZmREdW1wKQorCQlmcHV0cygiXFxiXG4iLCBmZER1bXApOworI2VuZGlmCisJICAgIHMrKzsKKwl9CisJZWxzZSBpZiAoc1swXSA9PSAnXGEnKQorCXsKKwkgICAgLyogXGEsIGJlbGwgKi8KKwkgICAgTWVzc2FnZUJlZXAoMHhGRkZGRkZGRik7CisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKKwkgICAgaWYgKGZkRHVtcCkKKwkJZnB1dHMoIlxcYVxuIiwgZmREdW1wKTsKKyNlbmRpZgorCSAgICBzKys7CisJfQorCWVsc2UgaWYgKHNbMF0gPT0gRVNDICYmIGxlbiA+PSAzLTEgJiYgc1sxXSA9PSAnfCcpCisJeworI2lmZGVmIE1DSF9XUklURV9EVU1QCisJICAgIGNoYXJfdSogb2xkX3MgPSBzOworI2VuZGlmCisJICAgIGNoYXJfdSogcDsKKwkgICAgaW50IGFyZzEgPSAwLCBhcmcyID0gMDsKKworCSAgICBzd2l0Y2ggKHNbMl0pCisJICAgIHsKKwkgICAgLyogb25lIG9yIHR3byBudW1lcmljIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5ICc7JyAqLworCisJICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQlwID0gcyArIDI7CisJCWFyZzEgPSBnZXRkaWdpdHMoJnApOwkgICAgLyogbm8gY2hlY2sgZm9yIGxlbmd0aCEgKi8KKwkJaWYgKHAgPiBzICsgbGVuKQorCQkgICAgYnJlYWs7CisKKwkJaWYgKCpwID09ICc7JykKKwkJeworCQkgICAgKytwOworCQkgICAgYXJnMiA9IGdldGRpZ2l0cygmcCk7ICAgLyogbm8gY2hlY2sgZm9yIGxlbmd0aCEgKi8KKwkJICAgIGlmIChwID4gcyArIGxlbikKKwkJCWJyZWFrOworCisJCSAgICBpZiAoKnAgPT0gJ0gnKQorCQkJZ290b3h5KGFyZzIsIGFyZzEpOworCQkgICAgZWxzZSBpZiAoKnAgPT0gJ3InKQorCQkJc2V0X3Njcm9sbF9yZWdpb24oMCwgYXJnMSAtIDEsIENvbHVtbnMgLSAxLCBhcmcyIC0gMSk7CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ0EnKQorCQl7CisJCSAgICAvKiBtb3ZlIGN1cnNvciB1cCBhcmcxIGxpbmVzIGluIHNhbWUgY29sdW1uICovCisJCSAgICBnb3RveHkoZ19jb29yZC5YICsgMSwKKwkJCSAgIG1heChnX3NyU2Nyb2xsUmVnaW9uLlRvcCwgZ19jb29yZC5ZIC0gYXJnMSkgKyAxKTsKKwkJfQorCQllbHNlIGlmICgqcCA9PSAnQycpCisJCXsKKwkJICAgIC8qIG1vdmUgY3Vyc29yIHJpZ2h0IGFyZzEgY29sdW1ucyBpbiBzYW1lIGxpbmUgKi8KKwkJICAgIGdvdG94eShtaW4oZ19zclNjcm9sbFJlZ2lvbi5SaWdodCwgZ19jb29yZC5YICsgYXJnMSkgKyAxLAorCQkJICAgZ19jb29yZC5ZICsgMSk7CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ0gnKQorCQl7CisJCSAgICBnb3RveHkoMSwgYXJnMSk7CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ0wnKQorCQl7CisJCSAgICBpbnNlcnRfbGluZXMoYXJnMSk7CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ20nKQorCQl7CisJCSAgICBpZiAoYXJnMSA9PSAwKQorCQkJbm9ybXZpZGVvKCk7CisJCSAgICBlbHNlCisJCQl0ZXh0YXR0cigoV09SRCkgYXJnMSk7CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ2YnKQorCQl7CisJCSAgICB0ZXh0Y29sb3IoKFdPUkQpIGFyZzEpOworCQl9CisJCWVsc2UgaWYgKCpwID09ICdiJykKKwkJeworCQkgICAgdGV4dGJhY2tncm91bmQoKFdPUkQpIGFyZzEpOworCQl9CisJCWVsc2UgaWYgKCpwID09ICdNJykKKwkJeworCQkgICAgZGVsZXRlX2xpbmVzKGFyZzEpOworCQl9CisKKwkJbGVuIC09IHAgLSBzOworCQlzID0gcCArIDE7CisJCWJyZWFrOworCisKKwkgICAgLyogVGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKworCSAgICBjYXNlICdBJzoKKwkJLyogbW92ZSBjdXJzb3IgdXAgb25lIGxpbmUgaW4gc2FtZSBjb2x1bW4gKi8KKwkJZ290b3h5KGdfY29vcmQuWCArIDEsCisJCSAgICAgICBtYXgoZ19zclNjcm9sbFJlZ2lvbi5Ub3AsIGdfY29vcmQuWSAtIDEpICsgMSk7CisJCWdvdG8gZ290MzsKKworCSAgICBjYXNlICdCJzoKKwkJdmlzdWFsX2JlbGwoKTsKKwkJZ290byBnb3QzOworCisJICAgIGNhc2UgJ0MnOgorCQkvKiBtb3ZlIGN1cnNvciByaWdodCBvbmUgY29sdW1uIGluIHNhbWUgbGluZSAqLworCQlnb3RveHkobWluKGdfc3JTY3JvbGxSZWdpb24uUmlnaHQsIGdfY29vcmQuWCArIDEpICsgMSwKKwkJICAgICAgIGdfY29vcmQuWSArIDEpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAnRSc6CisJCXRlcm1jYXBfbW9kZV9lbmQoKTsKKwkJZ290byBnb3QzOworCisJICAgIGNhc2UgJ0YnOgorCQlzdGFuZG91dCgpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAnZic6CisJCXN0YW5kZW5kKCk7CisJCWdvdG8gZ290MzsKKworCSAgICBjYXNlICdIJzoKKwkJZ290b3h5KDEsIDEpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAnaic6CisJCWNsZWFyX3RvX2VuZF9vZl9kaXNwbGF5KCk7CisJCWdvdG8gZ290MzsKKworCSAgICBjYXNlICdKJzoKKwkJY2xlYXJfc2NyZWVuKCk7CisJCWdvdG8gZ290MzsKKworCSAgICBjYXNlICdLJzoKKwkJY2xlYXJfdG9fZW5kX29mX2xpbmUoKTsKKwkJZ290byBnb3QzOworCisJICAgIGNhc2UgJ0wnOgorCQlpbnNlcnRfbGluZXMoMSk7CisJCWdvdG8gZ290MzsKKworCSAgICBjYXNlICdNJzoKKwkJZGVsZXRlX2xpbmVzKDEpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAnUyc6CisJCXRlcm1jYXBfbW9kZV9zdGFydCgpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAnVic6CisJCWN1cnNvcl92aXNpYmxlKFRSVUUpOworCQlnb3RvIGdvdDM7CisKKwkgICAgY2FzZSAndic6CisJCWN1cnNvcl92aXNpYmxlKEZBTFNFKTsKKwkJZ290byBnb3QzOworCisJICAgIGdvdDM6CisJCXMgKz0gMzsKKwkJbGVuIC09IDI7CisJICAgIH0KKworI2lmZGVmIE1DSF9XUklURV9EVU1QCisJICAgIGlmIChmZER1bXApCisJICAgIHsKKwkJZnB1dHMoIkVTQyB8ICIsIGZkRHVtcCk7CisJCWZ3cml0ZShvbGRfcyArIDIsIHNpemVvZihjaGFyX3UpLCBzIC0gb2xkX3MgLSAyLCBmZER1bXApOworCQlmcHV0YygnXG4nLCBmZER1bXApOworCSAgICB9CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKwkgICAgLyogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyICovCisJICAgIERXT1JEIG5Xcml0dGVuOworCisJICAgIG5Xcml0dGVuID0gd3JpdGVfY2hhcnMocywgMSk7CisjaWZkZWYgTUNIX1dSSVRFX0RVTVAKKwkgICAgaWYgKGZkRHVtcCkKKwkgICAgeworCQlmcHV0YygnPicsIGZkRHVtcCk7CisJCWZ3cml0ZShzLCBzaXplb2YoY2hhcl91KSwgbldyaXR0ZW4sIGZkRHVtcCk7CisJCWZwdXRzKCI8XG4iLCBmZER1bXApOworCSAgICB9CisjZW5kaWYKKworCSAgICBsZW4gLT0gKG5Xcml0dGVuIC0gMSk7CisJICAgIHMgKz0gbldyaXR0ZW47CisJfQorICAgIH0KKworI2lmZGVmIE1DSF9XUklURV9EVU1QCisgICAgaWYgKGZkRHVtcCkKKwlmZmx1c2goZmREdW1wKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogRkVBVF9HVUlfVzMyICovCisKKworLyoKKyAqIERlbGF5IGZvciBoYWxmIGEgc2Vjb25kLgorICovCisgICAgdm9pZAorbWNoX2RlbGF5KAorICAgIGxvbmcgICAgbXNlYywKKyAgICBpbnQJICAgIGlnbm9yZWlucHV0KQoreworI2lmZGVmIEZFQVRfR1VJX1czMgorICAgIFNsZWVwKChpbnQpbXNlYyk7CSAgICAvKiBuZXZlciB3YWl0IGZvciBpbnB1dCAqLworI2Vsc2UKKyAgICBpZiAoaWdub3JlaW5wdXQpCisJU2xlZXAoKGludCltc2VjKTsKKyAgICBlbHNlCisJV2FpdEZvckNoYXIobXNlYyk7CisjZW5kaWYKK30KKworCisvKgorICogdGhpcyB2ZXJzaW9uIG9mIHJlbW92ZSBpcyBub3Qgc2NhcmVkIGJ5IGEgcmVhZG9ubHkgKGJhY2t1cCkgZmlsZQorICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CittY2hfcmVtb3ZlKGNoYXJfdSAqbmFtZSkKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgV0NIQVIJKnduID0gTlVMTDsKKyAgICBpbnQJCW47CisKKyAgICBpZiAoZW5jX2NvZGVwYWdlID49IDAgJiYgKGludClHZXRBQ1AoKSAhPSBlbmNfY29kZXBhZ2UpCisgICAgeworCXduID0gZW5jX3RvX3VjczIobmFtZSwgTlVMTCk7CisJaWYgKHduICE9IE5VTEwpCisJeworCSAgICBTZXRGaWxlQXR0cmlidXRlc1cod24sIEZJTEVfQVRUUklCVVRFX05PUk1BTCk7CisJICAgIG4gPSBEZWxldGVGaWxlVyh3bikgPyAwIDogLTE7CisJICAgIHZpbV9mcmVlKHduKTsKKwkgICAgaWYgKG4gPT0gMCB8fCBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkJcmV0dXJuIG47CisJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwl9CisgICAgfQorI2VuZGlmCisgICAgU2V0RmlsZUF0dHJpYnV0ZXMobmFtZSwgRklMRV9BVFRSSUJVVEVfTk9STUFMKTsKKyAgICByZXR1cm4gRGVsZXRlRmlsZShuYW1lKSA/IDAgOiAtMTsKK30KKworCisvKgorICogY2hlY2sgZm9yIGFuICJpbnRlcnJ1cHQgc2lnbmFsIjogQ1RSTC1icmVhayBvciBDVFJMLUMKKyAqLworICAgIHZvaWQKK21jaF9icmVha2NoZWNrKCkKK3sKKyNpZm5kZWYgRkVBVF9HVUlfVzMyCSAgICAvKiBuZXZlciB1c2VkICovCisgICAgaWYgKGdfZkN0cmxDUHJlc3NlZCB8fCBnX2ZDQnJrUHJlc3NlZCkKKyAgICB7CisJZ19mQ3RybENQcmVzc2VkID0gZ19mQ0Jya1ByZXNzZWQgPSBGQUxTRTsKKwlnb3RfaW50ID0gVFJVRTsKKyAgICB9CisjZW5kaWYKK30KKworCisvKgorICogSG93IG11Y2ggbWVtb3J5IGlzIGF2YWlsYWJsZT8KKyAqIFJldHVybiBzdW0gb2YgYXZhaWxhYmxlIHBoeXNpY2FsIGFuZCBwYWdlIGZpbGUgbWVtb3J5LgorICovCisgICAgbG9uZ191CittY2hfYXZhaWxfbWVtKAorICAgIGludCBzcGVjaWFsKQoreworICAgIE1FTU9SWVNUQVRVUwltczsKKworICAgIG1zLmR3TGVuZ3RoID0gc2l6ZW9mKE1FTU9SWVNUQVRVUyk7CisgICAgR2xvYmFsTWVtb3J5U3RhdHVzKCZtcyk7CisgICAgcmV0dXJuIChsb25nX3UpIChtcy5kd0F2YWlsUGh5cyArIG1zLmR3QXZhaWxQYWdlRmlsZSk7Cit9CisKKyNpZmRlZiBGRUFUX01CWVRFCisvKgorICogU2FtZSBjb2RlIGFzIGJlbG93LCBidXQgd2l0aCB3aWRlIGZ1bmN0aW9ucyBhbmQgbm8gY29tbWVudHMuCisgKiBSZXR1cm4gMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK21jaF93cmVuYW1lKFdDSEFSICp3b2xkLCBXQ0hBUiAqd25ldykKK3sKKyAgICBXQ0hBUgkqcDsKKyAgICBpbnQJCWk7CisgICAgV0NIQVIJc3pUZW1wRmlsZVtfTUFYX1BBVEggKyAxXTsKKyAgICBXQ0hBUglzek5ld1BhdGhbX01BWF9QQVRIICsgMV07CisgICAgSEFORExFCWhmOworCisgICAgaWYgKCFtY2hfd2luZG93czk1KCkpCisgICAgeworCXAgPSB3b2xkOworCWZvciAoaSA9IDA7IHdvbGRbaV0gIT0gTlVMOyArK2kpCisJICAgIGlmICgod29sZFtpXSA9PSAnLycgfHwgd29sZFtpXSA9PSAnXFwnIHx8IHdvbGRbaV0gPT0gJzonKQorCQkgICAgJiYgd29sZFtpICsgMV0gIT0gMCkKKwkJcCA9IHdvbGQgKyBpICsgMTsKKwlpZiAoKGludCkod29sZCArIGkgLSBwKSA8IDggfHwgcFs2XSAhPSAnficpCisJICAgIHJldHVybiAoTW92ZUZpbGVXKHdvbGQsIHduZXcpID09IDApOworICAgIH0KKworICAgIGlmIChHZXRGdWxsUGF0aE5hbWVXKHduZXcsIF9NQVhfUEFUSCwgc3pOZXdQYXRoLCAmcCkgPT0gMCB8fCBwID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgICpwID0gTlVMOworCisgICAgaWYgKEdldFRlbXBGaWxlTmFtZVcoc3pOZXdQYXRoLCBMIlZJTSIsIDAsIHN6VGVtcEZpbGUpID09IDApCisJcmV0dXJuIC0yOworCisgICAgaWYgKCFEZWxldGVGaWxlVyhzelRlbXBGaWxlKSkKKwlyZXR1cm4gLTM7CisKKyAgICBpZiAoIU1vdmVGaWxlVyh3b2xkLCBzelRlbXBGaWxlKSkKKwlyZXR1cm4gLTQ7CisKKyAgICBpZiAoKGhmID0gQ3JlYXRlRmlsZVcod29sZCwgR0VORVJJQ19XUklURSwgMCwgTlVMTCwgQ1JFQVRFX05FVywKKwkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCkpID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCXJldHVybiAtNTsKKyAgICBpZiAoIUNsb3NlSGFuZGxlKGhmKSkKKwlyZXR1cm4gLTY7CisKKyAgICBpZiAoIU1vdmVGaWxlVyhzelRlbXBGaWxlLCB3bmV3KSkKKyAgICB7CisJKHZvaWQpTW92ZUZpbGVXKHN6VGVtcEZpbGUsIHdvbGQpOworCXJldHVybiAtNzsKKyAgICB9CisKKyAgICBEZWxldGVGaWxlVyhzelRlbXBGaWxlKTsKKworICAgIGlmICghRGVsZXRlRmlsZVcod29sZCkpCisJcmV0dXJuIC04OworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKgorICogbWNoX3JlbmFtZSgpIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiByZW5hbWUgKGFrYSBNb3ZlRmlsZSkgaW4KKyAqIFdpbmRvd3MgOTU6IHJlbmFtZSgiZm9vLmJhciIsICJmb28uYmFyfiIpIHdpbGwgZ2VuZXJhdGUgYQorICogZmlsZSB3aG9zZSBzaG9ydCBmaWxlIG5hbWUgaXMgIkZPTy5CQVIiIChpdHMgbG9uZyBmaWxlIG5hbWUgd2lsbAorICogYmUgY29ycmVjdDogImZvby5iYXJ+IikuICBCZWNhdXNlIGEgZmlsZSBjYW4gYmUgYWNjZXNzZWQgYnkKKyAqIGVpdGhlciBpdHMgU0ZOIG9yIGl0cyBMRk4sICJmb28uYmFyIiBoYXMgZWZmZWN0aXZlbHkgYmVlbgorICogcmVuYW1lZCB0byAiZm9vLmJhciIsIHdoaWNoIGlzIG5vdCBhdCBhbGwgd2hhdCB3YXMgd2FudGVkLiAgVGhpcworICogc2VlbXMgdG8gaGFwcGVuIG9ubHkgd2hlbiByZW5hbWluZyBmaWxlcyB3aXRoIHRocmVlLWNoYXJhY3RlcgorICogZXh0ZW5zaW9ucyBieSBhcHBlbmRpbmcgYSBzdWZmaXggdGhhdCBkb2VzIG5vdCBpbmNsdWRlICIuIi4KKyAqIFdpbmRvd3MgTlQgZ2V0cyBpdCByaWdodCwgaG93ZXZlciwgd2l0aCBhbiBTRk4gb2YgIkZPT34xLkJBUiIuCisgKgorICogVGhlcmUgaXMgYW5vdGhlciBwcm9ibGVtLCB3aGljaCBpc24ndCByZWFsbHkgYSBidWcgYnV0IGlzbid0IHJpZ2h0IGVpdGhlcjoKKyAqIFdoZW4gcmVuYW1pbmcgImFiY2RlZn4xLnR4dCIgdG8gImFiY2RlZn4xLnR4dH4iLCB0aGUgc2hvcnQgbmFtZSBjYW4gYmUKKyAqICJhYmNkZWZ+MS50eHQiIGFnYWluLiAgVGhpcyBoYXMgYmVlbiByZXBvcnRlZCBvbiBXaW5kb3dzIE5UIDQuMCB3aXRoCisgKiBzZXJ2aWNlIHBhY2sgNi4gIERvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gb24gV2luZG93cyA5OC4KKyAqCisgKiBMaWtlIHJlbmFtZSgpLCByZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBub24temVybyB1cG9uIGZhaWx1cmUuCisgKiBTaG91bGQgcHJvYmFibHkgc2V0IGVycm5vIGFwcHJvcHJpYXRlbHkgd2hlbiBlcnJvcnMgb2NjdXIuCisgKi8KKyAgICBpbnQKK21jaF9yZW5hbWUoCisgICAgY29uc3QgY2hhcgkqcHN6T2xkRmlsZSwKKyAgICBjb25zdCBjaGFyCSpwc3pOZXdGaWxlKQoreworICAgIGNoYXIJc3pUZW1wRmlsZVtfTUFYX1BBVEgrMV07CisgICAgY2hhcglzek5ld1BhdGhbX01BWF9QQVRIKzFdOworICAgIGNoYXIJKnBzekZpbGVQYXJ0OworICAgIEhBTkRMRQloZjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgV0NIQVIJKndvbGQgPSBOVUxMOworICAgIFdDSEFSCSp3bmV3ID0gTlVMTDsKKyAgICBpbnQJCXJldHZhbCA9IC0xOworCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlKQorICAgIHsKKwl3b2xkID0gZW5jX3RvX3VjczIoKGNoYXJfdSAqKXBzek9sZEZpbGUsIE5VTEwpOworCXduZXcgPSBlbmNfdG9fdWNzMigoY2hhcl91ICopcHN6TmV3RmlsZSwgTlVMTCk7CisJaWYgKHdvbGQgIT0gTlVMTCAmJiB3bmV3ICE9IE5VTEwpCisJICAgIHJldHZhbCA9IG1jaF93cmVuYW1lKHdvbGQsIHduZXcpOworCXZpbV9mcmVlKHdvbGQpOworCXZpbV9mcmVlKHduZXcpOworCWlmIChyZXR2YWwgPT0gMCB8fCBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkgICAgcmV0dXJuIHJldHZhbDsKKwkvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuICovCisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIE5vIG5lZWQgdG8gcGxheSB0cmlja3MgaWYgbm90IHJ1bm5pbmcgV2luZG93cyA5NSwgdW5sZXNzIHRoZSBmaWxlIG5hbWUKKyAgICAgKiBjb250YWlucyBhICJ+IiBhcyB0aGUgc2V2ZW50aCBjaGFyYWN0ZXIuCisgICAgICovCisgICAgaWYgKCFtY2hfd2luZG93czk1KCkpCisgICAgeworCXBzekZpbGVQYXJ0ID0gKGNoYXIgKilnZXR0YWlsKChjaGFyX3UgKilwc3pPbGRGaWxlKTsKKwlpZiAoU1RSTEVOKHBzekZpbGVQYXJ0KSA8IDggfHwgcHN6RmlsZVBhcnRbNl0gIT0gJ34nKQorCSAgICByZXR1cm4gcmVuYW1lKHBzek9sZEZpbGUsIHBzek5ld0ZpbGUpOworICAgIH0KKworICAgIC8qIEdldCBiYXNlIHBhdGggb2YgbmV3IGZpbGUgbmFtZS4gIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiBJZiBwc3pOZXdGaWxlIGlzCisgICAgICogYSBkaXJlY3RvcnksIG5vIGVycm9yIGlzIHJldHVybmVkIGFuZCBwc3pGaWxlUGFydCB3aWxsIGJlIE5VTEwuICovCisgICAgaWYgKEdldEZ1bGxQYXRoTmFtZShwc3pOZXdGaWxlLCBfTUFYX1BBVEgsIHN6TmV3UGF0aCwgJnBzekZpbGVQYXJ0KSA9PSAwCisJICAgIHx8IHBzekZpbGVQYXJ0ID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgICpwc3pGaWxlUGFydCA9IE5VTDsKKworICAgIC8qIEdldCAoYW5kIGNyZWF0ZSkgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBpbiBkaXJlY3Rvcnkgb2YgbmV3IGZpbGUgKi8KKyAgICBpZiAoR2V0VGVtcEZpbGVOYW1lKHN6TmV3UGF0aCwgIlZJTSIsIDAsIHN6VGVtcEZpbGUpID09IDApCisJcmV0dXJuIC0yOworCisgICAgLyogYmxvdyB0aGUgdGVtcCBmaWxlIGF3YXkgKi8KKyAgICBpZiAoIURlbGV0ZUZpbGUoc3pUZW1wRmlsZSkpCisJcmV0dXJuIC0zOworCisgICAgLyogcmVuYW1lIG9sZCBmaWxlIHRvIHRoZSB0ZW1wIGZpbGUgKi8KKyAgICBpZiAoIU1vdmVGaWxlKHBzek9sZEZpbGUsIHN6VGVtcEZpbGUpKQorCXJldHVybiAtNDsKKworICAgIC8qIG5vdyBjcmVhdGUgYW4gZW1wdHkgZmlsZSBjYWxsZWQgcHN6T2xkRmlsZTsgdGhpcyBwcmV2ZW50cyB0aGUgb3BlcmF0aW5nCisgICAgICogc3lzdGVtIHVzaW5nIHBzek9sZEZpbGUgYXMgYW4gYWxpYXMgKFNGTikgaWYgd2UncmUgcmVuYW1pbmcgd2l0aGluIHRoZQorICAgICAqIHNhbWUgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIHdlJ3JlIGVkaXRpbmcgYSBmaWxlIGNhbGxlZAorICAgICAqIGZpbGVuYW1lLmFzYy50eHQgYnkgaXRzIFNGTiwgZmlsZW5hfjEudHh0LiAgSWYgd2UgcmVuYW1lIGZpbGVuYX4xLnR4dAorICAgICAqIHRvIGZpbGVuYX4xLnR4dH4gKGkuZS4sIHdlJ3JlIG1ha2luZyBhIGJhY2t1cCB3aGlsZSB3cml0aW5nIGl0KSwgdGhlCisgICAgICogU0ZOIGZvciBmaWxlbmF+MS50eHR+IHdpbGwgYmUgZmlsZW5hfjEudHh0LCBieSBkZWZhdWx0LCB3aGljaCB3aWxsCisgICAgICogY2F1c2UgYWxsIHNvcnRzIG9mIHByb2JsZW1zIGxhdGVyIGluIGJ1Zl93cml0ZS4gIFNvLCB3ZSBjcmVhdGUgYW4gZW1wdHkKKyAgICAgKiBmaWxlIGNhbGxlZCBmaWxlbmF+MS50eHQgYW5kIHRoZSBzeXN0ZW0gd2lsbCBoYXZlIHRvIGZpbmQgc29tZSBvdGhlcgorICAgICAqIFNGTiBmb3IgZmlsZW5hfjEudHh0fiwgc3VjaCBhcyBmaWxlbmF+Mi50eHQKKyAgICAgKi8KKyAgICBpZiAoKGhmID0gQ3JlYXRlRmlsZShwc3pPbGRGaWxlLCBHRU5FUklDX1dSSVRFLCAwLCBOVUxMLCBDUkVBVEVfTkVXLAorCQkgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJcmV0dXJuIC01OworICAgIGlmICghQ2xvc2VIYW5kbGUoaGYpKQorCXJldHVybiAtNjsKKworICAgIC8qIHJlbmFtZSB0aGUgdGVtcCBmaWxlIHRvIHRoZSBuZXcgZmlsZSAqLworICAgIGlmICghTW92ZUZpbGUoc3pUZW1wRmlsZSwgcHN6TmV3RmlsZSkpCisgICAgeworCS8qIFJlbmFtaW5nIGZhaWxlZC4gIFJlbmFtZSB0aGUgZmlsZSBiYWNrIHRvIGl0cyBvbGQgbmFtZSwgc28gdGhhdCBpdAorCSAqIGxvb2tzIGxpa2Ugbm90aGluZyBoYXBwZW5lZC4gKi8KKwkodm9pZClNb3ZlRmlsZShzelRlbXBGaWxlLCBwc3pPbGRGaWxlKTsKKworCXJldHVybiAtNzsKKyAgICB9CisKKyAgICAvKiBTZWVtcyB0byBiZSBsZWZ0IGFyb3VuZCBvbiBOb3ZlbGwgZmlsZXN5c3RlbXMgKi8KKyAgICBEZWxldGVGaWxlKHN6VGVtcEZpbGUpOworCisgICAgLyogZmluYWxseSwgcmVtb3ZlIHRoZSBlbXB0eSBvbGQgZmlsZSAqLworICAgIGlmICghRGVsZXRlRmlsZShwc3pPbGRGaWxlKSkKKwlyZXR1cm4gLTg7CisKKyAgICByZXR1cm4gMDsJLyogc3VjY2VzcyAqLworfQorCisvKgorICogR2V0IHRoZSBkZWZhdWx0IHNoZWxsIGZvciB0aGUgY3VycmVudCBoYXJkd2FyZSBwbGF0Zm9ybQorICovCisgICAgY2hhciAqCitkZWZhdWx0X3NoZWxsKCkKK3sKKyAgICBjaGFyKiBwc3ogPSBOVUxMOworCisgICAgUGxhdGZvcm1JZCgpOworCisgICAgaWYgKGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpCQkvKiBXaW5kb3dzIE5UICovCisJcHN6ID0gImNtZC5leGUiOworICAgIGVsc2UgaWYgKGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUykgLyogV2luZG93cyA5NSAqLworCXBzeiA9ICJjb21tYW5kLmNvbSI7CisKKyAgICByZXR1cm4gcHN6OworfQorCisvKgorICogbWNoX2FjY2VzcygpIGV4dGVuZHMgYWNjZXNzKCkgdG8gZG8gbW9yZSBkZXRhaWxlZCBjaGVjayBvbiBuZXR3b3JrIGRyaXZlcy4KKyAqIFJldHVybnMgMCBpZiBmaWxlICJuIiBoYXMgYWNjZXNzIHJpZ2h0cyBhY2NvcmRpbmcgdG8gInAiLCAtMSBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK21jaF9hY2Nlc3MoY2hhciAqbiwgaW50IHApCit7CisgICAgSEFORExFCWhGaWxlOworICAgIERXT1JECWFtOworICAgIGludAkJcmV0dmFsID0gLTE7CSAgICAvKiBkZWZhdWx0OiBmYWlsICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIFdDSEFSCSp3biA9IE5VTEw7CisKKyAgICBpZiAoZW5jX2NvZGVwYWdlID49IDAgJiYgKGludClHZXRBQ1AoKSAhPSBlbmNfY29kZXBhZ2UpCisJd24gPSBlbmNfdG9fdWNzMihuLCBOVUxMKTsKKyNlbmRpZgorCisgICAgaWYgKG1jaF9pc2RpcihuKSkKKyAgICB7CisJY2hhciBUZW1wTmFtZVtfTUFYX1BBVEggKyAxNl0gPSAiIjsKKyNpZmRlZiBGRUFUX01CWVRFCisJV0NIQVIgVGVtcE5hbWVXW19NQVhfUEFUSCArIDE2XSA9IEwiIjsKKyNlbmRpZgorCisJaWYgKHAgJiBSX09LKQorCXsKKwkgICAgLyogUmVhZCBjaGVjayBpcyBwZXJmb3JtZWQgYnkgc2VlaW5nIGlmIHdlIGNhbiBkbyBhIGZpbmQgZmlsZSBvbgorCSAgICAgKiB0aGUgZGlyZWN0b3J5IGZvciBhbnkgZmlsZS4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmICh3biAhPSBOVUxMKQorCSAgICB7CisJCWludAkJICAgIGk7CisJCVdJTjMyX0ZJTkRfREFUQVcgICAgZDsKKworCQlmb3IgKGkgPSAwOyBpIDwgX01BWF9QQVRIICYmIHduW2ldICE9IDA7ICsraSkKKwkJICAgIFRlbXBOYW1lV1tpXSA9IHduW2ldOworCQlpZiAoVGVtcE5hbWVXW2kgLSAxXSAhPSAnXFwnICYmIFRlbXBOYW1lV1tpIC0gMV0gIT0gJy8nKQorCQkgICAgVGVtcE5hbWVXW2krK10gPSAnXFwnOworCQlUZW1wTmFtZVdbaSsrXSA9ICcqJzsKKwkJVGVtcE5hbWVXW2krK10gPSAwOworCisJCWhGaWxlID0gRmluZEZpcnN0RmlsZVcoVGVtcE5hbWVXLCAmZCk7CisJCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJeworCQkgICAgaWYgKEdldExhc3RFcnJvcigpICE9IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQkJZ290byBnZXRvdXQ7CisKKwkJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwkJICAgIHZpbV9mcmVlKHduKTsKKwkJICAgIHduID0gTlVMTDsKKwkJfQorCQllbHNlCisJCSAgICAodm9pZClGaW5kQ2xvc2UoaEZpbGUpOworCSAgICB9CisJICAgIGlmICh3biA9PSBOVUxMKQorI2VuZGlmCisJICAgIHsKKwkJY2hhcgkJICAgICpwY2g7CisJCVdJTjMyX0ZJTkRfREFUQQkgICAgZDsKKworCQlTVFJOQ1BZKFRlbXBOYW1lLCBuLCBfTUFYX1BBVEgpOworCQlwY2ggPSBUZW1wTmFtZSArIFNUUkxFTihUZW1wTmFtZSkgLSAxOworCQlpZiAoKnBjaCAhPSAnXFwnICYmICpwY2ggIT0gJy8nKQorCQkgICAgKisrcGNoID0gJ1xcJzsKKwkJKisrcGNoID0gJyonOworCQkqKytwY2ggPSBOVUw7CisKKwkJaEZpbGUgPSBGaW5kRmlyc3RGaWxlKFRlbXBOYW1lLCAmZCk7CisJCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJICAgIGdvdG8gZ2V0b3V0OworCQkodm9pZClGaW5kQ2xvc2UoaEZpbGUpOworCSAgICB9CisJfQorCisJaWYgKHAgJiBXX09LKQorCXsKKwkgICAgLyogVHJ5aW5nIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGNhdGNoCisJICAgICAqIGRpcmVjdG9yaWVzIG9uIHJlYWQtb25seSBuZXR3b3JrIHNoYXJlcy4gIEhvd2V2ZXIsIGluCisJICAgICAqIGRpcmVjdG9yaWVzIHdob3NlIEFDTCBhbGxvd3Mgd3JpdGVzIGJ1dCBkZW5pZXMgZGVsZXRlcyB3aWxsIGVuZAorCSAgICAgKiB1cCBrZWVwaW5nIHRoZSB0ZW1wb3JhcnkgZmlsZSA6LSguICovCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAod24gIT0gTlVMTCkKKwkgICAgeworCQlpZiAoIUdldFRlbXBGaWxlTmFtZVcod24sIEwiVklNIiwgMCwgVGVtcE5hbWVXKSkKKwkJeworCQkgICAgaWYgKEdldExhc3RFcnJvcigpICE9IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQorCQkJZ290byBnZXRvdXQ7CisKKwkJICAgIC8qIFJldHJ5IHdpdGggbm9uLXdpZGUgZnVuY3Rpb24gKGZvciBXaW5kb3dzIDk4KS4gKi8KKwkJICAgIHZpbV9mcmVlKHduKTsKKwkJICAgIHduID0gTlVMTDsKKwkJfQorCQllbHNlCisJCSAgICBEZWxldGVGaWxlVyhUZW1wTmFtZVcpOworCSAgICB9CisJICAgIGlmICh3biA9PSBOVUxMKQorI2VuZGlmCisJICAgIHsKKwkJaWYgKCFHZXRUZW1wRmlsZU5hbWUobiwgIlZJTSIsIDAsIFRlbXBOYW1lKSkKKwkJICAgIGdvdG8gZ2V0b3V0OworCQltY2hfcmVtb3ZlKChjaGFyX3UgKilUZW1wTmFtZSk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogVHJ5aW5nIHRvIG9wZW4gdGhlIGZpbGUgZm9yIHRoZSByZXF1aXJlZCBhY2Nlc3MgZG9lcyBBQ0wsIHJlYWQtb25seQorCSAqIG5ldHdvcmsgc2hhcmUsIGFuZCBmaWxlIGF0dHJpYnV0ZSBjaGVja3MuICAqLworCWFtID0gKChwICYgV19PSykgPyBHRU5FUklDX1dSSVRFIDogMCkKKwkJfCAoKHAgJiBSX09LKSA/IEdFTkVSSUNfUkVBRCA6IDApOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAod24gIT0gTlVMTCkKKwl7CisJICAgIGhGaWxlID0gQ3JlYXRlRmlsZVcod24sIGFtLCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLCAwLCBOVUxMKTsKKwkgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFCisJCQkgICAgICAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkKKwkgICAgeworCQkvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuICovCisJCXZpbV9mcmVlKHduKTsKKwkJd24gPSBOVUxMOworCSAgICB9CisJfQorCWlmICh3biA9PSBOVUxMKQorI2VuZGlmCisJICAgIGhGaWxlID0gQ3JlYXRlRmlsZShuLCBhbSwgMCwgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCk7CisJaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCSAgICBnb3RvIGdldG91dDsKKwlDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgfQorCisgICAgcmV0dmFsID0gMDsJICAgIC8qIHN1Y2Nlc3MgKi8KK2dldG91dDoKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgdmltX2ZyZWUod24pOworI2VuZGlmCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBWZXJzaW9uIG9mIG9wZW4oKSB0aGF0IG1heSB1c2UgdWNzMiBmaWxlIG5hbWUuCisgKi8KKyAgICBpbnQKK21jaF9vcGVuKGNoYXIgKm5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisgICAgV0NIQVIJKnduOworICAgIGludAkJZjsKKworICAgIGlmIChlbmNfY29kZXBhZ2UgPj0gMCAmJiAoaW50KUdldEFDUCgpICE9IGVuY19jb2RlcGFnZQorIyBpZmRlZiBfX0JPUkxBTkRDX18KKwkgICAgLyogV2lkZSBmdW5jdGlvbnMgb2YgQm9ybGFuZCBDIDUuNSBkbyBub3Qgd29yayBvbiBXaW5kb3dzIDk4LiAqLworCSAgICAmJiBnX1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UCisjIGVuZGlmCisgICAgICAgKQorICAgIHsKKwl3biA9IGVuY190b191Y3MyKG5hbWUsIE5VTEwpOworCWlmICh3biAhPSBOVUxMKQorCXsKKwkgICAgZiA9IF93b3Blbih3biwgZmxhZ3MsIG1vZGUpOworCSAgICB2aW1fZnJlZSh3bik7CisJICAgIGlmIChmID49IDApCisJCXJldHVybiBmOworCSAgICAvKiBSZXRyeSB3aXRoIG5vbi13aWRlIGZ1bmN0aW9uIChmb3IgV2luZG93cyA5OCkuIENhbid0IHVzZQorCSAgICAgKiBHZXRMYXN0RXJyb3IoKSBoZXJlIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCBlcnJubyBnZXRzIHNldCB0byBpZgorCSAgICAgKiB0aGUgX3dvcGVuKCkgZmFpbHMgZm9yIG1pc3Npbmcgd2lkZSBmdW5jdGlvbnMuICovCisJfQorICAgIH0KKworICAgIHJldHVybiBvcGVuKG5hbWUsIGZsYWdzLCBtb2RlKTsKK30KKworLyoKKyAqIFZlcnNpb24gb2YgZm9wZW4oKSB0aGF0IG1heSB1c2UgdWNzMiBmaWxlIG5hbWUuCisgKi8KKyAgICBGSUxFICoKK21jaF9mb3BlbihjaGFyICpuYW1lLCBjaGFyICptb2RlKQoreworICAgIFdDSEFSCSp3biwgKndtOworICAgIEZJTEUJKmYgPSBOVUxMOworCisgICAgaWYgKGVuY19jb2RlcGFnZSA+PSAwICYmIChpbnQpR2V0QUNQKCkgIT0gZW5jX2NvZGVwYWdlCisjIGlmZGVmIF9fQk9STEFORENfXworCSAgICAvKiBXaWRlIGZ1bmN0aW9ucyBvZiBCb3JsYW5kIEMgNS41IGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgOTguICovCisJICAgICYmIGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQKKyMgZW5kaWYKKyAgICAgICApCisgICAgeworCXduID0gZW5jX3RvX3VjczIobmFtZSwgTlVMTCk7CisJd20gPSBlbmNfdG9fdWNzMihtb2RlLCBOVUxMKTsKKwlpZiAod24gIT0gTlVMTCAmJiB3bSAhPSBOVUxMKQorCSAgICBmID0gX3dmb3Blbih3biwgd20pOworCXZpbV9mcmVlKHduKTsKKwl2aW1fZnJlZSh3bSk7CisJaWYgKGYgIT0gTlVMTCkKKwkgICAgcmV0dXJuIGY7CisJLyogUmV0cnkgd2l0aCBub24td2lkZSBmdW5jdGlvbiAoZm9yIFdpbmRvd3MgOTgpLiBDYW4ndCB1c2UKKwkgKiBHZXRMYXN0RXJyb3IoKSBoZXJlIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCBlcnJubyBnZXRzIHNldCB0byBpZgorCSAqIHRoZSBfd2ZvcGVuKCkgZmFpbHMgZm9yIG1pc3Npbmcgd2lkZSBmdW5jdGlvbnMuICovCisgICAgfQorCisgICAgcmV0dXJuIGZvcGVuKG5hbWUsIG1vZGUpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisvKgorICogU1VCIFNUUkVBTSAoYWthIGluZm8gc3RyZWFtKSBoYW5kbGluZzoKKyAqCisgKiBOVEZTIGNhbiBoYXZlIHN1YiBzdHJlYW1zIGZvciBlYWNoIGZpbGUuICBOb3JtYWwgY29udGVudHMgb2YgZmlsZSBpcworICogc3RvcmVkIGluIHRoZSBtYWluIHN0cmVhbSwgYW5kIGV4dHJhIGNvbnRlbnRzIChhdXRob3IgaW5mb3JtYXRpb24gYW5kCisgKiB0aXRsZSBhbmQgc28gb24pIGNhbiBiZSBzdG9yZWQgaW4gc3ViIHN0cmVhbS4gIEFmdGVyIFdpbmRvd3MgMjAwMCwgdXNlcgorICogY2FuIGFjY2VzcyBhbmQgc3RvcmUgdGhvc2UgaW5mb3JtYXRpb25zIGluIHN1YiBzdHJlYW1zIHZpYSBleHBsb3JlcidzCisgKiBwcm9wZXJ0eSBtZW51aXRlbSBpbiByaWdodCBjbGljayBtZW51LiAgVGhvc2UgaW5mb3JtYXRpb25zIGluIHN1YiBzdHJlYW1zCisgKiB3ZXJlIGxvc3Qgd2hlbiBjb3B5aW5nIG9ubHkgdGhlIG1haW4gc3RyZWFtLiAgU28gd2UgaGF2ZSB0byBjb3B5IHN1YgorICogc3RyZWFtcy4KKyAqCisgKiBJbmNvbXBsZXRlIGV4cGxhbmF0aW9uOgorICoJaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2RudzJrL2h0bWwvbnRmczUuYXNwCisgKiBNb3JlIHVzZWZ1bCBpbmZvIGFuZCBhbiBleGFtcGxlOgorICoJaHR0cDovL3d3dy5zeXNpbnRlcm5hbHMuY29tL250dzJrL3NvdXJjZS9taXNjLnNodG1sI3N0cmVhbXMKKyAqLworCisvKgorICogQ29weSBpbmZvIHN0cmVhbSBkYXRhICJzdWJzdHJlYW0iLiAgUmVhZCBmcm9tIHRoZSBmaWxlIHdpdGggQmFja3VwUmVhZChzaCkKKyAqIGFuZCB3cml0ZSB0byBzdHJlYW0gInN1YnN0cmVhbSIgb2YgZmlsZSAidG8iLgorICogRXJyb3JzIGFyZSBpZ25vcmVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvcHlfc3Vic3RyZWFtKEhBTkRMRSBzaCwgdm9pZCAqY29udGV4dCwgV0NIQVIgKnRvLCBXQ0hBUiAqc3Vic3RyZWFtLCBsb25nIGxlbikKK3sKKyAgICBIQU5ETEUgIGhUbzsKKyAgICBXQ0hBUiAgICp0b19uYW1lOworCisgICAgdG9fbmFtZSA9IG1hbGxvYygod2NzbGVuKHRvKSArIHdjc2xlbihzdWJzdHJlYW0pICsgMSkgKiBzaXplb2YoV0NIQVIpKTsKKyAgICB3Y3NjcHkodG9fbmFtZSwgdG8pOworICAgIHdjc2NhdCh0b19uYW1lLCBzdWJzdHJlYW0pOworCisgICAgaFRvID0gQ3JlYXRlRmlsZVcodG9fbmFtZSwgR0VORVJJQ19XUklURSwgMCwgTlVMTCwgT1BFTl9BTFdBWVMsCisJCQkJCQkgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgICBpZiAoaFRvICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKwlsb25nCWRvbmU7CisJRFdPUkQJdG9kbzsKKwlEV09SRAlyZWFkY250LCB3cml0dGVuOworCWNoYXIJYnVmWzQwOTZdOworCisJLyogQ29weSBibG9jayBvZiBieXRlcyBhdCBhIHRpbWUuICBBYm9ydCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLiAqLworCWZvciAoZG9uZSA9IDA7IGRvbmUgPCBsZW47IGRvbmUgKz0gd3JpdHRlbikKKwl7CisJICAgIC8qIChzaXplX3QpIGNhc3QgZm9yIEJvcmxhbmQgQyA1LjUgKi8KKwkgICAgdG9kbyA9IChzaXplX3QpKGxlbiAtIGRvbmUpID4gc2l6ZW9mKGJ1ZikgPyBzaXplb2YoYnVmKQorCQkJCQkJICAgICAgIDogKHNpemVfdCkobGVuIC0gZG9uZSk7CisJICAgIGlmICghQmFja3VwUmVhZChzaCwgKExQQllURSlidWYsIHRvZG8sICZyZWFkY250LAorCQkJCQkJICAgICAgIEZBTFNFLCBGQUxTRSwgY29udGV4dCkKKwkJICAgIHx8IHJlYWRjbnQgIT0gdG9kbworCQkgICAgfHwgIVdyaXRlRmlsZShoVG8sIGJ1ZiwgdG9kbywgJndyaXR0ZW4sIE5VTEwpCisJCSAgICB8fCB3cml0dGVuICE9IHRvZG8pCisJCWJyZWFrOworCX0KKwlDbG9zZUhhbmRsZShoVG8pOworICAgIH0KKworICAgIGZyZWUodG9fbmFtZSk7Cit9CisKKy8qCisgKiBDb3B5IGluZm8gc3RyZWFtcyBmcm9tIGZpbGUgImZyb20iIHRvIGZpbGUgInRvIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjb3B5X2luZm9zdHJlYW1zKGNoYXJfdSAqZnJvbSwgY2hhcl91ICp0bykKK3sKKyAgICBXQ0hBUgkJKmZyb213OworICAgIFdDSEFSCQkqdG93OworICAgIEhBTkRMRQkJc2g7CisgICAgV0lOMzJfU1RSRUFNX0lECXNpZDsKKyAgICBpbnQJCQloZWFkZXJzaXplOworICAgIFdDSEFSCQlzdHJlYW1uYW1lW19NQVhfUEFUSF07CisgICAgRFdPUkQJCXJlYWRjb3VudDsKKyAgICB2b2lkCQkqY29udGV4dCA9IE5VTEw7CisgICAgRFdPUkQJCWxvLCBoaTsKKyAgICBpbnQJCQlsZW47CisKKyAgICAvKiBDb252ZXJ0IHRoZSBmaWxlIG5hbWVzIHRvIHdpZGUgY2hhcmFjdGVycy4gKi8KKyAgICBmcm9tdyA9IGVuY190b191Y3MyKGZyb20sIE5VTEwpOworICAgIHRvdyA9IGVuY190b191Y3MyKHRvLCBOVUxMKTsKKyAgICBpZiAoZnJvbXcgIT0gTlVMTCAmJiB0b3cgIT0gTlVMTCkKKyAgICB7CisJLyogT3BlbiB0aGUgZmlsZSBmb3IgcmVhZGluZy4gKi8KKwlzaCA9IENyZWF0ZUZpbGVXKGZyb213LCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKwkJCSAgICAgT1BFTl9FWElTVElORywgRklMRV9GTEFHX0JBQ0tVUF9TRU1BTlRJQ1MsIE5VTEwpOworCWlmIChzaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwl7CisJICAgIC8qIFVzZSBCYWNrdXBSZWFkKCkgdG8gZmluZCB0aGUgaW5mbyBzdHJlYW1zLiAgUmVwZWF0IHVudGlsIHdlCisJICAgICAqIGhhdmUgZG9uZSB0aGVtIGFsbC4qLworCSAgICBmb3IgKDs7KQorCSAgICB7CisJCS8qIEdldCB0aGUgaGVhZGVyIHRvIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtIG5hbWUuICBJZgorCQkgKiB0aGUgInJlYWRjb3VudCIgaXMgemVybyB3ZSBoYXZlIGRvbmUgYWxsIGluZm8gc3RyZWFtcy4gKi8KKwkJWmVyb01lbW9yeSgmc2lkLCBzaXplb2YoV0lOMzJfU1RSRUFNX0lEKSk7CisJCWhlYWRlcnNpemUgPSAoY2hhciAqKSZzaWQuY1N0cmVhbU5hbWUgLSAoY2hhciAqKSZzaWQuZHdTdHJlYW1JZDsKKwkJaWYgKCFCYWNrdXBSZWFkKHNoLCAoTFBCWVRFKSZzaWQsIGhlYWRlcnNpemUsCisJCQkJCSAgICZyZWFkY291bnQsIEZBTFNFLCBGQUxTRSwgJmNvbnRleHQpCisJCQl8fCByZWFkY291bnQgPT0gMCkKKwkJICAgIGJyZWFrOworCisJCS8qIFdlIG9ubHkgZGVhbCB3aXRoIHN0cmVhbXMgdGhhdCBoYXZlIGEgbmFtZS4gIFRoZSBub3JtYWwKKwkJICogZmlsZSBkYXRhIGFwcGVhcnMgdG8gYmUgd2l0aG91dCBhIG5hbWUsIGV2ZW4gdGhvdWdoIGRvY3MKKwkJICogc3VnZ2VzdCBpdCBpcyBjYWxsZWQgIjo6JERBVEEiLiAqLworCQlpZiAoc2lkLmR3U3RyZWFtTmFtZVNpemUgPiAwKQorCQl7CisJCSAgICAvKiBSZWFkIHRoZSBzdHJlYW0gbmFtZS4gKi8KKwkJICAgIGlmICghQmFja3VwUmVhZChzaCwgKExQQllURSlzdHJlYW1uYW1lLAorCQkJCQkJCSBzaWQuZHdTdHJlYW1OYW1lU2l6ZSwKKwkJCQkJICAmcmVhZGNvdW50LCBGQUxTRSwgRkFMU0UsICZjb250ZXh0KSkKKwkJCWJyZWFrOworCisJCSAgICAvKiBDb3B5IGFuIGluZm8gc3RyZWFtIHdpdGggYSBuYW1lICI6YW55dGhpbmc6JERBVEEiLgorCQkgICAgICogU2tpcCAiOjokREFUQSIsIGl0IGhhcyBubyBzdHJlYW0gbmFtZSAoZXhhbXBsZXMgc3VnZ2VzdAorCQkgICAgICogaXQgbWlnaHQgYmUgdXNlZCBmb3IgdGhlIG5vcm1hbCBmaWxlIGNvbnRlbnRzKS4KKwkJICAgICAqIE5vdGUgdGhhdCBCYWNrdXBSZWFkKCkgY291bnRzIGJ5dGVzLCBidXQgdGhlIG5hbWUgaXMgaW4KKwkJICAgICAqIHdpZGUgY2hhcmFjdGVycy4gKi8KKwkJICAgIGxlbiA9IHJlYWRjb3VudCAvIHNpemVvZihXQ0hBUik7CisJCSAgICBzdHJlYW1uYW1lW2xlbl0gPSAwOworCQkgICAgaWYgKGxlbiA+IDcgJiYgd2NzaWNtcChzdHJlYW1uYW1lICsgbGVuIC0gNiwKKwkJCQkJCQkgICAgICBMIjokREFUQSIpID09IDApCisJCSAgICB7CisJCQlzdHJlYW1uYW1lW2xlbiAtIDZdID0gMDsKKwkJCWNvcHlfc3Vic3RyZWFtKHNoLCAmY29udGV4dCwgdG93LCBzdHJlYW1uYW1lLAorCQkJCQkJICAgICAgKGxvbmcpc2lkLlNpemUuTG93UGFydCk7CisJCSAgICB9CisJCX0KKworCQkvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHN0cmVhbS4gIFdlIG1pZ2h0IHRyeSBzZWVraW5nIHRvbyBmYXIsCisJCSAqIGJ1dCBCYWNrdXBTZWVrKCkgZG9lc24ndCBza2lwIG92ZXIgc3RyZWFtIGJvcmRlcnMsIHRodXMKKwkJICogdGhhdCdzIE9LLiAqLworCQkodm9pZClCYWNrdXBTZWVrKHNoLCBzaWQuU2l6ZS5Mb3dQYXJ0LCBzaWQuU2l6ZS5IaWdoUGFydCwKKwkJCQkJCQkgICZsbywgJmhpLCAmY29udGV4dCk7CisJICAgIH0KKworCSAgICAvKiBDbGVhciB0aGUgY29udGV4dC4gKi8KKwkgICAgKHZvaWQpQmFja3VwUmVhZChzaCwgTlVMTCwgMCwgJnJlYWRjb3VudCwgVFJVRSwgRkFMU0UsICZjb250ZXh0KTsKKworCSAgICBDbG9zZUhhbmRsZShzaCk7CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShmcm9tdyk7CisgICAgdmltX2ZyZWUodG93KTsKK30KKyNlbmRpZgorCisvKgorICogQ29weSBmaWxlIGF0dHJpYnV0ZXMgZnJvbSBmaWxlICJmcm9tIiB0byBmaWxlICJ0byIuCisgKiBGb3IgV2luZG93cyBOVCBhbmQgbGF0ZXIgd2UgY29weSBpbmZvIHN0cmVhbXMuCisgKiBBbHdheXMgcmV0dXJucyB6ZXJvLCBlcnJvcnMgYXJlIGlnbm9yZWQuCisgKi8KKyAgICBpbnQKK21jaF9jb3B5X2ZpbGVfYXR0cmlidXRlKGNoYXJfdSAqZnJvbSwgY2hhcl91ICp0bykKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogRmlsZSBzdHJlYW1zIG9ubHkgd29yayBvbiBXaW5kb3dzIE5UIGFuZCBsYXRlci4gKi8KKyAgICBQbGF0Zm9ybUlkKCk7CisgICAgaWYgKGdfUGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpCisJY29weV9pbmZvc3RyZWFtcyhmcm9tLCB0byk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoTVlSRVNFVFNUS09GTFcpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmVjcmVhdGUgYSBkZXN0cm95ZWQgc3RhY2sgZ3VhcmQgcGFnZSBpbiB3aW4zMi4KKyAqIFdyaXR0ZW4gYnkgQmVuamFtaW4gUGV0ZXJzb24uCisgKi8KKworLyogVGhlc2UgbWFnaWMgbnVtYmVycyBhcmUgZnJvbSB0aGUgTVMgaGVhZGVyIGZpbGVzICovCisjZGVmaW5lIE1JTl9TVEFDS19XSU45WCAxNworI2RlZmluZSBNSU5fU1RBQ0tfV0lOTlQgMgorCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIF9yZXNldHN0a29mbHcoKSwgd2hpY2ggaXMgb25seQorICogYXZhaWxhYmxlIGluIERldlN0dWRpbyAubmV0IGFuZCBsYXRlci4KKyAqIFJldHVybnMgMCBmb3IgZmFpbHVyZSwgMSBmb3Igc3VjY2Vzcy4KKyAqLworICAgIGludAorbXlyZXNldHN0a29mbHcodm9pZCkKK3sKKyAgICBCWVRFCSpwU3RhY2tQdHI7CisgICAgQllURQkqcEd1YXJkUGFnZTsKKyAgICBCWVRFCSpwU3RhY2tCYXNlOworICAgIEJZVEUJKnBMb3dlc3RQb3NzaWJsZVBhZ2U7CisgICAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1iaTsKKyAgICBTWVNURU1fSU5GTyBzaTsKKyAgICBEV09SRAluUGFnZVNpemU7CisgICAgRFdPUkQJZHVtbXk7CisKKyAgICAvKiBUaGlzIGNvZGUgd2lsbCBub3Qgd29yayBvbiB3aW4zMnMuICovCisgICAgUGxhdGZvcm1JZCgpOworICAgIGlmIChnX1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMycykKKwlyZXR1cm4gMDsKKworICAgIC8qIFdlIG5lZWQgdG8ga25vdyB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZS4gKi8KKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgblBhZ2VTaXplID0gc2kuZHdQYWdlU2l6ZTsKKworICAgIC8qIC4uLmFuZCB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyICovCisgICAgcFN0YWNrUHRyID0gKEJZVEUqKV9hbGxvY2EoMSk7CisKKyAgICAvKiAuLi5hbmQgdGhlIGJhc2Ugb2YgdGhlIHN0YWNrLiAqLworICAgIGlmIChWaXJ0dWFsUXVlcnkocFN0YWNrUHRyLCAmbWJpLCBzaXplb2YgbWJpKSA9PSAwKQorCXJldHVybiAwOworICAgIHBTdGFja0Jhc2UgPSAoQllURSopbWJpLkFsbG9jYXRpb25CYXNlOworCisgICAgLyogLi4uYW5kIHRoZSBwYWdlIHRoYXRzIG1pbl9zdGFja19yZXEgcGFnZXMgYXdheSBmcm9tIHN0YWNrIGJhc2U7IHRoaXMgaXMKKyAgICAgKiB0aGUgbG93ZXN0IHBhZ2Ugd2UgY291bGQgdXNlLiAqLworICAgIHBMb3dlc3RQb3NzaWJsZVBhZ2UgPSBwU3RhY2tCYXNlICsgKChnX1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UKQorCQkJICAgICA/IE1JTl9TVEFDS19XSU5OVCA6IE1JTl9TVEFDS19XSU45WCkgKiBuUGFnZVNpemU7CisKKyAgICAvKiBPbiBXaW45NSwgd2Ugd2FudCB0aGUgbmV4dCBwYWdlIGRvd24gZnJvbSB0aGUgZW5kIG9mIHRoZSBzdGFjay4gKi8KKyAgICBpZiAoZ19QbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKQorICAgIHsKKwkvKiBGaW5kIHRoZSBwYWdlIHRoYXQncyBvbmx5IDEgcGFnZSBkb3duIGZyb20gdGhlIHBhZ2UgdGhhdCB0aGUgc3RhY2sKKwkgKiBwdHIgaXMgaW4uICovCisJcEd1YXJkUGFnZSA9IChCWVRFKikoKERXT1JEKW5QYWdlU2l6ZSAqICgoKERXT1JEKXBTdGFja1B0cgorCQkJCQkJICAgIC8gKERXT1JEKW5QYWdlU2l6ZSkgLSAxKSk7CisJaWYgKHBHdWFyZFBhZ2UgPCBwTG93ZXN0UG9zc2libGVQYWdlKQorCSAgICByZXR1cm4gMDsKKworCS8qIEFwcGx5IHRoZSBub2FjY2VzcyBhdHRyaWJ1dGUgdG8gdGhlIHBhZ2UgLS0gdGhlcmUncyBubyBndWFyZAorCSAqIGF0dHJpYnV0ZSBpbiB3aW45NS10eXBlIE9TZXMuICovCisJaWYgKCFWaXJ0dWFsUHJvdGVjdChwR3VhcmRQYWdlLCBuUGFnZVNpemUsIFBBR0VfTk9BQ0NFU1MsICZkdW1teSkpCisJICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIE9uIE5ULCBob3dldmVyLCB3ZSB3YW50IHRoZSBmaXJzdCBjb21taXR0ZWQgcGFnZSBpbiB0aGUgc3RhY2sgU3RhcnQKKwkgKiBhdCB0aGUgc3RhY2sgYmFzZSBhbmQgbW92ZSBmb3J3YXJkIHRocm91Z2ggbWVtb3J5IHVudGlsIHdlIGZpbmQgYQorCSAqIGNvbW1pdHRlZCBibG9jay4gKi8KKwlCWVRFICpwQmxvY2sgPSBwU3RhY2tCYXNlOworCisJd2hpbGUgKDEpCisJeworCSAgICBpZiAoVmlydHVhbFF1ZXJ5KHBCbG9jaywgJm1iaSwgc2l6ZW9mIG1iaSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkgICAgcEJsb2NrICs9IG1iaS5SZWdpb25TaXplOworCisJICAgIGlmIChtYmkuU3RhdGUgJiBNRU1fQ09NTUlUKQorCQlicmVhazsKKwl9CisKKwkvKiBtYmkgbm93IGRlc2NyaWJlcyB0aGUgZmlyc3QgY29tbWl0dGVkIGJsb2NrIGluIHRoZSBzdGFjay4gKi8KKwlpZiAobWJpLlByb3RlY3QgJiBQQUdFX0dVQVJEKQorCSAgICByZXR1cm4gMTsKKworCS8qIGRlY2lkZSB3aGVyZSB0aGUgZ3VhcmQgcGFnZSBzaG91bGQgc3RhcnQgKi8KKwlpZiAoKGxvbmdfdSkobWJpLkJhc2VBZGRyZXNzKSA8IChsb25nX3UpcExvd2VzdFBvc3NpYmxlUGFnZSkKKwkgICAgcEd1YXJkUGFnZSA9IHBMb3dlc3RQb3NzaWJsZVBhZ2U7CisJZWxzZQorCSAgICBwR3VhcmRQYWdlID0gKEJZVEUqKW1iaS5CYXNlQWRkcmVzczsKKworCS8qIGFsbG9jYXRlIHRoZSBndWFyZCBwYWdlICovCisJaWYgKCFWaXJ0dWFsQWxsb2MocEd1YXJkUGFnZSwgblBhZ2VTaXplLCBNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSkpCisJICAgIHJldHVybiAwOworCisJLyogYXBwbHkgdGhlIGd1YXJkIGF0dHJpYnV0ZSB0byB0aGUgcGFnZSAqLworCWlmICghVmlydHVhbFByb3RlY3QocEd1YXJkUGFnZSwgblBhZ2VTaXplLCBQQUdFX1JFQURXUklURSB8IFBBR0VfR1VBUkQsCisJCQkJCQkJCSAgICAgICZkdW1teSkpCisJICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9vc193aW4zMi5oIGIvc3JjL29zX3dpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhYWE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc193aW4zMi5oCkBAIC0wLDAgKzEsMTkwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisvKgorICogV2luMzIgKFdpbmRvd3MgTlQgYW5kIFdpbmRvd3MgOTUpIG1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncy4KKyAqLworCisjaW5jbHVkZSAib3NfZG9zLmgiCQkvKiBjb21tb24gTVMtRE9TIGFuZCBXaW4zMiBzdHVmZiAqLworI2lmbmRlZiBfX0NZR1dJTl9fCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CQkvKiBmb3IgX21rZGlyKCkgKi8KKyNlbmRpZgorCisjZGVmaW5lIEJJTkFSWV9GSUxFX0lPCisjZGVmaW5lIFVTRV9FWEVfTkFNRQkJLyogdXNlIGFyZ3ZbMF0gZm9yICRWSU0gKi8KKyNkZWZpbmUgTk9fQ09PS0VEX0lOUFVUCQkvKiBtY2hfaW5jaGFyKCkgZG9lc24ndCByZXR1cm4gd2hvbGUgbGluZXMgKi8KKyNkZWZpbmUgU1lOQ19EVVBfQ0xPU0UJCS8qIHN5bmMoKSBhIGZpbGUgd2l0aCBkdXAoKSBhbmQgY2xvc2UoKSAqLworI2RlZmluZSBVU0VfVEVSTV9DT05TT0xFCisjaWZuZGVmIEhBVkVfU1RSSU5HX0gKKyMgZGVmaW5lIEhBVkVfU1RSSU5HX0gKKyNlbmRpZgorI2RlZmluZSBIQVZFX1NUUkNTUE4KKyNpZm5kZWYgX19HTlVDX18KKyNkZWZpbmUgSEFWRV9TVFJJQ01QCisjZGVmaW5lIEhBVkVfU1RSTklDTVAKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1NUUkZUSU1FCisjIGRlZmluZSBIQVZFX1NUUkZUSU1FCQkvKiBndWVzc2VkICovCisjZW5kaWYKKyNkZWZpbmUgSEFWRV9NRU1TRVQKKyNpZm5kZWYgSEFWRV9MT0NBTEVfSAorIyBkZWZpbmUgSEFWRV9MT0NBTEVfSCAxCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9GQ05UTF9ICisjIGRlZmluZSBIQVZFX0ZDTlRMX0gKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1NUREFSR19ICisjIGRlZmluZSBIQVZFX1NUREFSR19ICisjZW5kaWYKKyNkZWZpbmUgSEFWRV9RU09SVAorI2RlZmluZSBIQVZFX1NUX01PREUJCS8qIGhhdmUgc3RhdC5zdF9tb2RlICovCisKKyNkZWZpbmUgRkVBVF9TSE9SVENVVAkJLyogcmVzb2x2ZSBzaG9ydGN1dHMgKi8KKworI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKSBcCisJJiYgIWRlZmluZWQoX19DWUdXSU5fXykgXAorCSYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IF9fQk9STEFORENfXyA+PSAweDU1MCkgXAorCSYmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPiAxMDIwKQorLyoKKyAqIEFjY2VzcyBDb250cm9sIExpc3QgKGFjdHVhbGx5IHNlY3VyaXR5IGluZm8pLgorICogTWluZ3cgYW5kIEN5Z3dpbiBkb24ndCBoYXZlIHRoZSBhY2wgc3R1ZmYuCisgKiBCb3JsYW5kIG9ubHkgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLgorICogTVNWQyBpbiA1LjAsIG5vdCBpbiA0LjIsIGRvbid0IGtub3cgYWJvdXQgNC4zLgorICovCisjIGRlZmluZSBIQVZFX0FDTAorI2VuZGlmCisKKyNkZWZpbmUgVVNFX0ZOQU1FX0NBU0UJCS8qIGFkanVzdCBjYXNlIG9mIGZpbGUgbmFtZXMgKi8KKyNpZiAhZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkgJiYgZGVmaW5lZChGRUFUX1ZJU1VBTCkgJiYgZGVmaW5lZChGRUFUX01PVVNFKQorIyBkZWZpbmUgRkVBVF9DTElQQk9BUkQJCS8qIGluY2x1ZGUgY2xpcGJvYXJkIHN1cHBvcnQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19EQVRFX18pICYmIGRlZmluZWQoX19USU1FX18pCisjIGRlZmluZSBIQVZFX0RBVEVfVElNRQorI2VuZGlmCisjaWZuZGVmIEZFQVRfR1VJX1czMgkJLyogR1VJIHdvcmtzIGRpZmZlcmVudCAqLworIyBkZWZpbmUgQlJFQUtDSEVDS19TS0lQICAgIDEJLyogY2FsbCBtY2hfYnJlYWtjaGVjaygpIGVhY2ggdGltZSwgaXQncyBmYXN0ICovCisjZW5kaWYKKyNkZWZpbmUgSEFWRV9BVkFJTF9NRU0KKworI2RlZmluZSBIQVZFX1BVVEVOVgkJLyogYXQgbGVhc3QgQmNjIDUuMiBhbmQgTVNDIGhhdmUgaXQgKi8KKworI2lmZGVmIEZFQVRfR1VJX1czMgorIyBkZWZpbmUgTk9fQ09OU09MRQkJLyogZG9uJ3QgaW5jbHVkZWQgY29uc29sZS1vbmx5IGNvZGUgKi8KKyNlbmRpZgorCisvKiB0b3VwcGVyKCkgaXMgbm90IHJlYWxseSBicm9rZW4sIGJ1dCBpdCdzIHZlcnkgc2xvdy4JUHJvYmFibHkgYmVjYXVzZSBvZgorICogdXNpbmcgVW5pY29kZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3MgTlQgKi8KKyNkZWZpbmUgQlJPS0VOX1RPVVBQRVIKKworI2RlZmluZSBGTkFNRV9JTExFR0FMICJcIio/Pjx8IiAvKiBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBTVFJJQ1QKKyMgZGVmaW5lIFNUUklDVAorI2VuZGlmCisjaWZuZGVmIENPQkpNQUNST1MKKyMgZGVmaW5lIENPQkpNQUNST1MJLyogRm9yIE9MRTogRW5hYmxlICJmcmllbmRsaWVyIiBhY2Nlc3MgdG8gb2JqZWN0cyAqLworI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKgorICogV2luMzIgaGFzIHBsZW50eSBvZiBtZW1vcnksIHVzZSBsYXJnZSBidWZmZXJzCisgKi8KKyNkZWZpbmUgQ01EQlVGRlNJWkUgMTAyNAkvKiBzaXplIG9mIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcgYnVmZmVyICovCisKKy8qIF9NQVhfUEFUSCBpcyBvbmx5IDI1NiAoc3RkbGliLmgpLCBidXQgd2Ugd2FudCBtb3JlIGZvciB0aGUgJ3BhdGgnIG9wdGlvbiwKKyAqIHRodXMgdXNlIGEgbGFyZ2VyIG51bWJlci4gKi8KKyNkZWZpbmUgTUFYUEFUSEwJMTAyNAorCisjaWZuZGVmIEJBU0VOQU1FTEVOCisjIGRlZmluZSBCQVNFTkFNRUxFTgkoX01BWF9QQVRIIC0gNSkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZSBuYW1lICovCisjZW5kaWYKKworI2RlZmluZSBURU1QTkFNRUxFTglfTUFYX1BBVEgJLyogbGVuZ3RoIG9mIHRlbXAgZmlsZSBuYW1lIHBhdGggKi8KKworI2lmbmRlZiBERkxUX01BWE1FTQorIyBkZWZpbmUgREZMVF9NQVhNRU0JKDIqMTAyNCkgICAgLyogdXNlIHVwIHRvIDIgTWJ5dGUgZm9yIGEgYnVmZmVyICovCisjZW5kaWYKKworI2lmbmRlZiBERkxUX01BWE1FTVRPVAorIyBkZWZpbmUgREZMVF9NQVhNRU1UT1QJKDUqMTAyNCkgICAgLyogdXNlIHVwIHRvIDUgTWJ5dGUgZm9yIFZpbSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgICAvKiBTdXBwb3J0IGZvciBfX3RyeSAvIF9fZXhjZXB0LiAgQWxsIHZlcnNpb25zIG9mIE1TVkMgYW5kIEJvcmxhbmQgQyBhcmUKKyAgICAgKiBleHBlY3RlZCB0byBoYXZlIHRoaXMuICBBbnkgb3RoZXIgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBpdD8gKi8KKyMgZGVmaW5lIEhBVkVfVFJZX0VYQ0VQVCAxCisjIGluY2x1ZGUgPG1hbGxvYy5oPgkJLyogZm9yIF9yZXNldHN0a29mbHcoKSAqLworIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTMwMCkKKyMgIGRlZmluZSBSRVNFVFNUS09GTFcgX3Jlc2V0c3Rrb2ZsdworIyBlbHNlCisjICBkZWZpbmUgUkVTRVRTVEtPRkxXIG15cmVzZXRzdGtvZmx3CisjICBkZWZpbmUgTVlSRVNFVFNUS09GTFcKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogU29tZSBzaW1wbGUgZGVidWdnaW5nIG1hY3JvcyB0aGF0IGxvb2sgYW5kIGJlaGF2ZSBhIGxvdCBsaWtlIHRoZWlyCisgKiBuYW1lc2FrZXMgaW4gTUZDLgorICovCisKKyNpZmRlZiBfREVCVUcKKworIyBpZiBkZWZpbmVkKF9NU0NfVkVSKQkmJiAgKF9NU0NfVkVSID49IDEwMDApCisgICAvKiBVc2UgdGhlIG5ldyBkZWJ1Z2dpbmcgdG9vbHMgaW4gVmlzdWFsIEMrKyA0LnggKi8KKyMgIGluY2x1ZGUgPGNydGRiZy5oPgorIyAgZGVmaW5lIEFTU0VSVChmKSBfQVNTRVJUKGYpCisjIGVsc2UKKyMgIGluY2x1ZGUgPGFzc2VydC5oPgorIyAgZGVmaW5lIEFTU0VSVChmKSBhc3NlcnQoZikKKyMgZW5kaWYKKworIyBkZWZpbmUgVkVSSUZZKGYpCQlBU1NFUlQoZikKKyMgZGVmaW5lIERFQlVHX09OTFkoZikJCShmKQorIyBkZWZpbmUgVFJBQ0UJCQlUcmFjZQorIyBkZWZpbmUgVFJBQ0UwKHN6KQkJVHJhY2UoX1QoIiVzIiksIF9UKHN6KSkKKyMgZGVmaW5lIFRSQUNFMShzeiwgcDEpCQlUcmFjZShfVChzeiksIHAxKQorIyBkZWZpbmUgVFJBQ0UyKHN6LCBwMSwgcDIpCVRyYWNlKF9UKHN6KSwgcDEsIHAyKQorIyBkZWZpbmUgVFJBQ0UzKHN6LCBwMSwgcDIsIHAzKSBUcmFjZShfVChzeiksIHAxLCBwMiwgcDMpCisjIGRlZmluZSBUUkFDRTQoc3osIHAxLCBwMiwgcDMsIHA0KSBUcmFjZShfVChzeiksIHAxLCBwMiwgcDMsIHA0KQorCisvKiBJbiBkZWJ1ZyB2ZXJzaW9uLCB3cml0ZXMgdHJhY2UgbWVzc2FnZXMgdG8gZGVidWcgc3RyZWFtICovCit2b2lkIF9fY2RlY2wKK1RyYWNlKGNoYXIgKnBzekZvcm1hdCwgLi4uKTsKKworI2Vsc2UgLyogIV9ERUJVRyAqLworCisgIC8qIFRoZXNlIG1hY3JvcyBzaG91bGQgYWxsIGNvbXBpbGUgYXdheSB0byBub3RoaW5nICovCisjIGRlZmluZSBBU1NFUlQoZikJCSgodm9pZCkwKQorIyBkZWZpbmUgVkVSSUZZKGYpCQkoKHZvaWQpZikKKyMgZGVmaW5lIERFQlVHX09OTFkoZikJCSgodm9pZCkwKQorIyBkZWZpbmUgVFJBQ0UJCQkxID8gKHZvaWQpMCA6IHByaW50ZgorIyBkZWZpbmUgVFJBQ0UwKHN6KQorIyBkZWZpbmUgVFJBQ0UxKHN6LCBwMSkKKyMgZGVmaW5lIFRSQUNFMihzeiwgcDEsIHAyKQorIyBkZWZpbmUgVFJBQ0UzKHN6LCBwMSwgcDIsIHAzKQorIyBkZWZpbmUgVFJBQ0U0KHN6LCBwMSwgcDIsIHAzLCBwNCkKKworI2VuZGlmIC8qICFfREVCVUcgKi8KKworCisjZGVmaW5lIEFTU0VSVF9QT0lOVEVSKHAsIHR5cGUpIFwKKyAgICBBU1NFUlQoKChwKSAhPSBOVUxMKSAgJiYgIElzVmFsaWRBZGRyZXNzKChwKSwgc2l6ZW9mKHR5cGUpLCBGQUxTRSkpCisKKyNkZWZpbmUgQVNTRVJUX05VTExfT1JfUE9JTlRFUihwLCB0eXBlKSBcCisgICAgQVNTRVJUKCgocCkgPT0gTlVMTCkgIHx8ICBJc1ZhbGlkQWRkcmVzcygocCksIHNpemVvZih0eXBlKSwgRkFMU0UpKQorCisjZGVmaW5lIG1jaF9zZXRlbnYobmFtZSwgdmFsLCB4KSBzZXRlbnYobmFtZSwgdmFsLCB4KQorI2RlZmluZSBtY2hfZ2V0ZW52KHgpIChjaGFyX3UgKilnZXRlbnYoKGNoYXIgKikoeCkpCisjaWZkZWYgX19CT1JMQU5EQ19fCisjIGRlZmluZSB2aW1fbWtkaXIoeCwgeSkgbWtkaXIoeCkKKyNlbHNlCisjIGRlZmluZSB2aW1fbWtkaXIoeCwgeSkgX21rZGlyKHgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9vc2RlZi5zaCBiL3NyYy9vc2RlZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kN2Q0ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zZGVmLnNoCkBAIC0wLDAgKzEsOTkgQEAKKyMhIC9iaW4vc2gKKyMKKyMgb3NkZWYuc2ggLS0gY29weSBvc2RlZi5oLmluIHRvIG9zZGVmLmggd2hpbGUgcmVtb3ZpbmcgZGVjbGFyYXRpb25zCisjIGZvdW5kIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiBDYXV0aW9uOiB3ZWlyZCBzZWQgbWFnaWMgZ29pbmcgb24gaGVyZS4KKyMgV2FybmluZ3MgYXJlIHByaW50ZWQgaWYgc2VkIGRpZCBub3Qgc3Vydml2ZS4KKyMKKyMgKEMpIE1pY2hhZWwgU2Nocm9lZGVyLCBKdWVyZ2VuIFdlaWdlcnQKKyMKKyMgb3NkZWYuaC5pbiBoYXMgYmVlbiBzcGxpdCBpbnRvIG9zZGVmMS5oLmluIGFuZCBvc2RlZjIuaC5pbiwgYmVjYXVzZSBzb21lCisjIHNlZCdzIGNvdWxkIG5vdCBoYW5kbGUgdGhlIGFtb3VudCBvZiBjb21tYW5kcyAoaXMgNTAgY29tbWFuZHMgdGhlIGxpbWl0PykuCisjCisjIDMxLjEwLjk1IGp3LgorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIENDPWNjCitmaQoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisKK3JtIC1mIGNvcmUqICouY29yZQorCitjYXQgPDwgRU9GID4gb3NkZWYwLmMKKyNpZm5kZWYgX19BUFBMRV9fCisjIGRlZmluZSBzZWxlY3Qgc2VsZWN0X2RlY2xhcmVkX3dyb25nCisjZW5kaWYKKyNkZWZpbmUgdGdldHN0ciB0Z2V0c3RyX2RlY2xhcmVkX3dyb25nCisjaW5jbHVkZSAiYXV0by9jb25maWcuaCIKKyNpbmNsdWRlICJvc191bml4LmgiCS8qIGJyaW5nIGluIG1vc3QgaGVhZGVyIGZpbGVzLCBtb3JlIGZvbGxvdyBiZWxvdyAqLworI2luY2x1ZGUgIm9zX3VuaXh4LmgiCS8qIGJyaW5nIGluIGhlYWRlciBmaWxlcyBmb3Igb3NfdW5peC5jICovCisKKyNpZmRlZiBIQVZFX1RFUk1DQVBfSAorIyBpbmNsdWRlIDx0ZXJtY2FwLmg+CS8qIG9ubHkgZm9yIHRlcm0uYyAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4JCS8qIG9ubHkgdXNlZCBpbiBhIGZldyBmaWxlcyAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgkvKiBvbmx5IGZvciBtZW1maWxlLmMgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YMTEKKyMgaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2VuZGlmCitFT0YKKworIyBNYWMgdXNlcyBwcmVjb21waWxlZCBoZWFkZXJzLCBidXQgd2UgbmVlZCByZWFsIGhlYWRlcnMgaGVyZS4KK2Nhc2UgYHVuYW1lYCBpbgorICAgIERhcndpbikJJENDIC1JLiAtSSRzcmNkaXIgLUUgLW5vLWNwcC1wcmVjb21wIG9zZGVmMC5jID5vc2RlZjAuY2M7OworICAgICopCQkkQ0MgLUkuIC1JJHNyY2RpciAtRSBvc2RlZjAuYyA+b3NkZWYwLmNjOzsKK2VzYWMKKworIyBpbnNlcnQgYSBzcGFjZSBpbiBmcm9udCBvZiBlYWNoIGxpbmUsIHNvIHRoYXQgYSBmdW5jdGlvbiBuYW1lIGF0IHRoZQorIyBzdGFydCBvZiB0aGUgbGluZSBpcyBtYXRjaGVkIHdpdGggIlspKiwgCV1cMVsgCShdIgorc2VkIDwgb3NkZWYwLmNjIC1lICcvXCguLipcKS9zLy8gXDEvJyA+IG9zZGVmMC5jY2MKKworc2VkIDwgJHNyY2Rpci9vc2RlZjEuaC5pbiAtbiAtZSAnL15leHRlcm4vc0AuKlspKiAJXVspKiAJXSpcKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKSBfX0FSR1MuKkAvWykqLCAJXVsoXSpcMVspXSpbIAkoXS9pXFxcCitcXC9cXFteYS16QS1aX1xcXVwxIF9fQVJHU1xcL2RAcCcgPiBvc2RlZjExLnNlZAorCitzZWQgPCAkc3JjZGlyL29zZGVmMi5oLmluIC1uIC1lICcvXmV4dGVybi9zQC4qWykqIAldWykqIAldKlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpIF9fQVJHUy4qQC9bKSosIAldWyhdKlwxWyldKlsgCShdL2lcXFwKK1xcL1xcW15hLXpBLVpfXFxdXDEgX19BUkdTXFwvZEBwJyA+IG9zZGVmMjEuc2VkCisKK2NhdCA8PCBFT0YgPiBvc2RlZjIuc2VkCisxaVxcCisvKgorMWlcXAorICogb3NkZWYuaCBpcyBhdXRvbWFnaWNhbGx5IGNyZWF0ZWQgZnJvbSBvc2RlZj8uaC5pbiBieSBvc2RlZi5zaCAtLSBETyBOT1QgRURJVAorMWlcXAorICovCitFT0YKKworY2F0IG9zZGVmMC5jY2MgfCBzZWQgLW4gLWYgb3NkZWYxMS5zZWQgPj4gb3NkZWYyLnNlZAorc2VkIC1mIG9zZGVmMi5zZWQgPCAkc3JjZGlyL29zZGVmMS5oLmluID4gYXV0by9vc2RlZi5oCisKK2NhdCBvc2RlZjAuY2NjIHwgc2VkIC1uIC1mIG9zZGVmMjEuc2VkID4gb3NkZWYyLnNlZAorc2VkIC1mIG9zZGVmMi5zZWQgPCAkc3JjZGlyL29zZGVmMi5oLmluID4+IGF1dG8vb3NkZWYuaAorCitybSBvc2RlZjAuYyBvc2RlZjAuY2Mgb3NkZWYwLmNjYyBvc2RlZjExLnNlZCBvc2RlZjIxLnNlZCBvc2RlZjIuc2VkCisKK2lmIHRlc3QgLWYgY29yZSo7IHRoZW4KKyAgZmlsZSBjb3JlKgorICBlY2hvICIgIFNvcnJ5LCB5b3VyIHNlZCBpcyBicm9rZW4uIENhbGwgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yLiIKKyAgZWNobyAiICBNZWFud2hpbGUsIHlvdSBtYXkgdHJ5IHRvIGNvbXBpbGUgVmltIHdpdGggYW4gZW1wdHkgb3NkZWYuaCBmaWxlLiIKKyAgZWNobyAiICBJZiB5b3UgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvdG90eXBlcywgbW92ZSB0aGUgbmVlZGVkIgorICBlY2hvICIgIG9uZXMgZnJvbSBvc2RlZjEuaC5pbiBhbmQgb3NkZWYyLmguaW4gdG8gb3NkZWYuaC4iCisgIGV4aXQgMQorZmkKK2NhdCAkc3JjZGlyL29zZGVmMS5oLmluICRzcmNkaXIvb3NkZWYyLmguaW4gPm9zZGVmWC5oLmluCitpZiBldmFsIHRlc3QgImBkaWZmIGF1dG8vb3NkZWYuaCBvc2RlZlguaC5pbiB8IHdjIC1sYCIgLWVxIDQ7IHRoZW4KKyAgZWNobyAiICBIbW0sIHNlZCBpcyB2ZXJ5IHBlc3NpbWlzdGljIGFib3V0IHlvdXIgc3lzdGVtIGhlYWRlciBmaWxlcy4iCisgIGVjaG8gIiAgQnV0IGl0IGRpZCBub3QgZHVtcCBjb3JlIC0tIHN0cmFuZ2UhIExldCdzIGNvbnRpbnVlIGNhcmVmdWxseS4uLiIKKyAgZWNobyAiICBJZiB0aGlzIGZhaWxzLCB5b3UgbWF5IHdhbnQgdG8gcmVtb3ZlIG9mZmVuZGluZyBsaW5lcyBmcm9tIG9zZGVmLmgiCisgIGVjaG8gIiAgb3IgdHJ5IHdpdGggYW4gZW1wdHkgb3NkZWYuaCBmaWxlLCBpZiB5b3VyIGNvbXBpbGVyIGNhbiBkbyB3aXRob3V0IgorICBlY2hvICIgIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4iCitmaQorcm0gb3NkZWZYLmguaW4KZGlmZiAtLWdpdCBhL3NyYy9vc2RlZjEuaC5pbiBiL3NyYy9vc2RlZjEuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWM3OGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zZGVmMS5oLmluCkBAIC0wLDAgKzEsMTM3IEBACisvKiBhdXRvY29uZiBjYW5ub3QgZmlkZGxlIG91dCBkZWNsYXJhdGlvbnMuIFVzZSBvdXIgaG9tZWJyZXduIHRvb2xzLiAoancpICovCisvKgorICogRGVjbGFyYXRpb25zIHRoYXQgbWF5IGNhdXNlIGNvbmZsaWN0cyBiZWxvbmcgaGVyZSBzbyB0aGF0IG9zZGVmLnNoCisgKiBjYW4gY2xlYW4gb3V0IHRoZSBmb3Jlc3QuIEV2ZXJ5dGhpbmcgZWxzZSBiZWxvbmdzIGluIG9zX3VuaXguaAorICoKKyAqIEhvdyB0aGlzIHdvcmtzOgorICogLSBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHVuaXggcHJvdG90eXBlcyB0aGF0IFZpbSBtaWdodCBuZWVkLgorICogLSBUaGUgc2hlbGwgc2NyaXB0IG9zZGVmLnNoIGlzIGV4ZWN1dGVkIGF0IGNvbXBpbGUgdGltZSB0byByZW1vdmUgYWxsIHRoZQorICogICBwcm90b3R5cGVzIHRoYXQgYXJlIGluIGFuIGluY2x1ZGUgZmlsZS4gVGhpcyByZXN1bHRzIGluIG9zZGVmLmguCisgKiAtIG9zZGVmLmggaXMgaW5jbHVkZWQgaW4gdmltLmguCisgKgorICogc2VkIGNhbm5vdCBhbHdheXMgaGFuZGxlIHNvIG1hbnkgY29tbWFuZHMsIHRoaXMgaXMgZmlsZSAxIG9mIDIKKyAqLworCitleHRlcm4gaW50CXByaW50ZiBfX0FSR1MoKGNoYXIgKiwgLi4uKSk7CitleHRlcm4gaW50CWZwcmludGYgX19BUkdTKChGSUxFICosIGNoYXIgKiwgLi4uKSk7CitleHRlcm4gaW50CXNwcmludGYgX19BUkdTKChjaGFyICosIGNoYXIgKiwgLi4uKSk7CitleHRlcm4gaW50CXNzY2FuZiBfX0FSR1MoKGNoYXIgKiwgY2hhciAqLCAuLi4pKTsKKyNpZm5kZWYgZm9wZW4JLyogY291bGQgYmUgcmVkZWZpbmVkIHRvIGZvcGVuNjQoKSAqLworZXh0ZXJuIEZJTEUJKmZvcGVuIF9fQVJHUygoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyNlbmRpZgorZXh0ZXJuIGludAlmY2xvc2UgX19BUkdTKChGSUxFICopKTsKK2V4dGVybiBpbnQJZnNlZWsgX19BUkdTKChGSUxFICosIGxvbmcsIGludCkpOworI2lmZGVmIEhBVkVfRlNFRUtPCitleHRlcm4gaW50CWZzZWVrbyBfX0FSR1MoKEZJTEUgKiwgb2ZmX3QsIGludCkpOworI2VuZGlmCitleHRlcm4gbG9uZwlmdGVsbCBfX0FSR1MoKEZJTEUgKikpOworI2lmZGVmIEhBVkVfRlRFTExPCitleHRlcm4gb2ZmX3QJZnRlbGxvIF9fQVJHUygoRklMRSAqKSk7CisjZW5kaWYKK2V4dGVybiB2b2lkCXJld2luZCBfX0FSR1MoKEZJTEUgKikpOworZXh0ZXJuIGludAlmcmVhZCBfX0FSR1MoKGNoYXIgKiwgaW50LCBpbnQsIEZJTEUgKikpOworZXh0ZXJuIGludAlmd3JpdGUgX19BUkdTKChjaGFyICosIGludCwgaW50LCBGSUxFICopKTsKK2V4dGVybiBpbnQJZnB1dHMgX19BUkdTKChjaGFyICosIEZJTEUgKikpOworI2lmbmRlZiBmZXJyb3IJLyogbGV0IG1lIHNheSBpdCBhZ2FpbjogIm1hY3JvcyBzaG91bGQgbmV2ZXIgaGF2ZSBwcm90b3R5cGVzIiAqLworZXh0ZXJuIGludAlmZXJyb3IgX19BUkdTKChGSUxFICopKTsKKyNlbmRpZgorZXh0ZXJuIGludAlmZmx1c2ggX19BUkdTKChGSUxFICopKTsKKyNpZiBkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChfU0VRVUVOVF8pCisvKiB1c2VkIGluc2lkZSBvZiBzdGRpbyBtYWNyb3MgZ2V0YygpLCBwdXRzKCksIHB1dGNoYXIoKS4uLiAqLworZXh0ZXJuIGludAlfZmxzYnVmIF9fQVJHUygoaW50LCBGSUxFICopKTsKK2V4dGVybiBpbnQJX2ZpbGJ1ZiBfX0FSR1MoKEZJTEUgKikpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NFTEVDVCkKK3N0cnVjdCBwb2xsZmQ7CQkJLyogZm9yIHBvbGwgX19BUkdTICovCitleHRlcm4gaW50CXBvbGwgX19BUkdTKChzdHJ1Y3QgcG9sbGZkICosIGxvbmcsIGludCkpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX01FTVNFVAorZXh0ZXJuIHZvaWQJKm1lbXNldCBfX0FSR1MoKHZvaWQgKiwgaW50LCBzaXplX3QpKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQkNNUAorZXh0ZXJuIGludAliY21wIF9fQVJHUygodm9pZCAqLCB2b2lkICosIHNpemVfdCkpOworI2VuZGlmCisjaWZkZWYgSEFWRV9NRU1DTVAKK2V4dGVybiBpbnQJbWVtY21wIF9fQVJHUygoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJQQlJLCitleHRlcm4gY2hhcgkqc3RycGJyayBfX0FSR1MoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisjZW5kaWYKKyNpZmRlZiBVU0VCQ09QWQorZXh0ZXJuIHZvaWQJYmNvcHkgX19BUkdTKChjaGFyICosIGNoYXIgKiwgaW50KSk7CisjZWxzZQorIyBpZmRlZiBVU0VNRU1DUFkKK2V4dGVybiB2b2lkCW1lbWNweSBfX0FSR1MoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKKyMgZWxzZQorIyAgaWZkZWYgVVNFTUVNTU9WRQorZXh0ZXJuIHZvaWQJbWVtbW92ZSBfX0FSR1MoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKy8qIHVzZWQgaW5zaWRlIG9mIEZEX1pFUk8gbWFjcm86ICovCitleHRlcm4gdm9pZAliemVybyBfX0FSR1MoKHZvaWQgKiwgc2l6ZV90KSk7CisjaWZkZWYgSEFWRV9TRVRTSUQKK2V4dGVybiBwaWRfdAlzZXRzaWQgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NFVFBHSUQKK2V4dGVybiBpbnQJc2V0cGdpZCBfX0FSR1MoKHBpZF90LCBwaWRfdCkpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJUT0wKK2V4dGVybiBpbnQJc3RydG9sIF9fQVJHUygoY2hhciAqLCBjaGFyICoqLCBpbnQpKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSRlRJTUUKK2V4dGVybiBzaXplX3QJc3RyZnRpbWUgX19BUkdTKChjaGFyICosIHNpemVfdCwgY2hhciAqLCBzdHJ1Y3QgdG0gKikpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJDQVNFQ01QCitleHRlcm4gaW50CXN0cmNhc2VjbXAgX19BUkdTKChjaGFyICosIGNoYXIgKikpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJOQ0FTRUNNUAorZXh0ZXJuIGludAlzdHJuY2FzZWNtcCBfX0FSR1MoKGNoYXIgKiwgY2hhciAqLCBzaXplX3QpKTsKKyNlbmRpZgorI2lmbmRlZiBzdHJkdXAKK2V4dGVybiBjaGFyCSpzdHJkdXAgX19BUkdTKChjb25zdCBjaGFyICopKTsKKyNlbmRpZgorZXh0ZXJuIGludAlhdG9pIF9fQVJHUygoY2hhciAqKSk7CitleHRlcm4gaW50CWF0b2wgX19BUkdTKChjaGFyICopKTsKKworI2lmbmRlZiBVU0VfU1lTVEVNCitleHRlcm4gaW50CWZvcmsgX19BUkdTKCh2b2lkKSk7CitleHRlcm4gaW50CWV4ZWN2cCBfX0FSR1MoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKikpOworZXh0ZXJuIGludAl3YWl0IF9fQVJHUygoaW50ICopKTsgLyogd2lsbCB0aGlzIGJyZWFrIHRoaW5ncyAuLi4/ICovCitleHRlcm4gaW50CXdhaXRwaWQgX19BUkdTKChwaWRfdCwgaW50ICosIGludCkpOworI2VuZGlmCisKK2V4dGVybiBpbnQJdG91cHBlciBfX0FSR1MoKGludCkpOworZXh0ZXJuIGludAl0b2xvd2VyIF9fQVJHUygoaW50KSk7CisKK2V4dGVybiBSRVRTSUdUWVBFICgqc2lnbmFsIF9fQVJHUygoaW50LCBSRVRTSUdUWVBFICgqZnVuYykgU0lHUFJPVE9BUkcpKSkgX19BUkdTKFNJR1BST1RPQVJHKTsKKyNpZmRlZiBIQVZFX1NJR1NFVAorZXh0ZXJuIFJFVFNJR1RZUEUgKCpzaWdzZXQgX19BUkdTKChpbnQsIFJFVFNJR1RZUEUgKCpmdW5jKSBTSUdQUk9UT0FSRykpKSBfX0FSR1MoU0lHUFJPVE9BUkcpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU0VUSk1QX0gpCisjIGlmZGVmIEhBVkVfU0lHU0VUSk1QCitleHRlcm4gaW50CXNpZ3NldGptcCBfX0FSR1MoKHNpZ2ptcF9idWYsIGludCkpOworZXh0ZXJuIHZvaWQJc2lnbG9uZ2ptcCBfX0FSR1MoKHNpZ2ptcF9idWYsIGludCkpOworIyBlbHNlCitleHRlcm4gaW50CXNldGptcCBfX0FSR1MoKGptcF9idWYpKTsKK2V4dGVybiB2b2lkCWxvbmdqbXAgX19BUkdTKChqbXBfYnVmLCBpbnQpKTsKKyMgZW5kaWYKKyNlbmRpZgorCitleHRlcm4gaW50CWtpbGwgX19BUkdTKChpbnQsIGludCkpOworCitleHRlcm4gaW50CWFjY2VzcyBfX0FSR1MoKGNoYXIgKiwgaW50KSk7CitleHRlcm4gaW50CWZzeW5jIF9fQVJHUygoaW50KSk7CitleHRlcm4gaW50CWZjaG93biBfX0FSR1MoKGludCwgaW50LCBpbnQpKTsKKyNpZiBkZWZpbmVkKEhBVkVfR0VUQ1dEKSAmJiAhZGVmaW5lZChzdW4pCitleHRlcm4gY2hhcgkqZ2V0Y3dkIF9fQVJHUygoY2hhciAqLCBpbnQpKTsKKyNlbHNlCitleHRlcm4gY2hhcgkqZ2V0d2QgX19BUkdTKChjaGFyICopKTsKKyNlbmRpZgorI2lmbmRlZiBfX2FscGhhCS8qIHN1Z2dlc3RlZCBieSBDYW1wYmVsbCAqLworZXh0ZXJuIGludAlpb2N0bCBfX0FSR1MoKGludCwgaW50LCAuLi4pKTsKKyNlbmRpZgorZXh0ZXJuIGludAljaG1vZCBfX0FSR1MoKGNvbnN0IGNoYXIgKiwgbW9kZV90KSk7CmRpZmYgLS1naXQgYS9zcmMvb3NkZWYyLmguaW4gYi9zcmMvb3NkZWYyLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNzhiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vc2RlZjIuaC5pbgpAQCAtMCwwICsxLDg4IEBACisvKgorICogb3NkZWYyLmguaW4gLSBTZWUgb3NkZWYxLmguaW4gZm9yIGEgZGVzY3JpcHRpb24uCisgKi8KKworZXh0ZXJuIGludAlyZW1vdmUgX19BUkdTKChjb25zdCBjaGFyICopKTsKK2V4dGVybiBpbnQJcmVuYW1lIF9fQVJHUygoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBpbnQJZnJlZSBfX0FSR1MoKGNoYXIgKikpOworZXh0ZXJuIGNoYXIJKm1hbGxvYyBfX0FSR1MoKHVuc2lnbmVkIGludCkpOworZXh0ZXJuIGNoYXIJKnJlYWxsb2MgX19BUkdTKChjaGFyICosIGludCkpOworZXh0ZXJuIGNoYXIJKmdldGVudiBfX0FSR1MoKGNoYXIgKikpOworZXh0ZXJuIGludAlzZXRlbnYgX19BUkdTKChjaGFyICosIGNoYXIgKiwgaW50KSk7CitleHRlcm4gaW50CXB1dGVudiBfX0FSR1MoKGNvbnN0IGNoYXIgKikpOworCitleHRlcm4gaW50CWdldGhvc3RuYW1lIF9fQVJHUygoY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkCXBlcnJvciBfX0FSR1MoKGNoYXIgKikpOworCitleHRlcm4gaW50CXNsZWVwIF9fQVJHUygoaW50KSk7CitleHRlcm4gaW50CXVzbGVlcCBfX0FSR1MoKHVuc2lnbmVkIGludCkpOworZXh0ZXJuIHVuc2lnbmVkIGludAlhbGFybSBfX0FSR1MoKHVuc2lnbmVkIGludCkpOworZXh0ZXJuIGludAljaGRpciBfX0FSR1MoKGNoYXIgKikpOworZXh0ZXJuIGludAlmY2hkaXIgX19BUkdTKChpbnQpKTsKKyNpZm5kZWYgc3RhdAkvKiBjb3VsZCBiZSByZWRlZmluZWQgdG8gc3RhdDY0KCkgKi8KK2V4dGVybiBpbnQJc3RhdCBfX0FSR1MoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKikpOworI2VuZGlmCisjaWZuZGVmIGxzdGF0CS8qIGNvdWxkIGJlIHJlZGVmaW5lZCB0byBsc3RhdDY0KCkgKi8KK2V4dGVybiBpbnQJbHN0YXQgX19BUkdTKChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKTsKKyNlbmRpZgorZXh0ZXJuIGludAlmc3RhdCBfX0FSR1MoKGludCwgc3RydWN0IHN0YXQgKikpOworZXh0ZXJuIGludAlvcGVuIF9fQVJHUygoY29uc3QgY2hhciAqLCBpbnQsIC4uLikpOworZXh0ZXJuIGludAljbG9zZSBfX0FSR1MoKGludCkpOworZXh0ZXJuIGludAlyZWFkIF9fQVJHUygoaW50LCBjaGFyICosIHNpemVfdCkpOworZXh0ZXJuIGludAl3cml0ZSBfX0FSR1MoKGludCwgY2hhciAqLCBzaXplX3QpKTsKK2V4dGVybiBpbnQJcGlwZSBfX0FSR1MoKGludCAqKSk7CitleHRlcm4gb2ZmX3QJbHNlZWsgX19BUkdTKChpbnQsIG9mZl90LCBpbnQpKTsKK2V4dGVybiB2b2lkCXN5bmMgX19BUkdTKCh2b2lkKSk7CitleHRlcm4gdWlkX3QJZ2V0dWlkIF9fQVJHUygodm9pZCkpOworZXh0ZXJuIGdpZF90CWdldGdpZCBfX0FSR1MoKHZvaWQpKTsKK2V4dGVybiB2b2lkCXFzb3J0IF9fQVJHUygodm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKTsKKworZXh0ZXJuIGludAlpc2F0dHkgX19BUkdTKChpbnQpKTsKK2V4dGVybiBpbnQJZ2V0cGlkIF9fQVJHUygodm9pZCkpOworZXh0ZXJuIGludAlkdXAgX19BUkdTKChpbnQpKTsKK2V4dGVybiBpbnQJdW5saW5rIF9fQVJHUygoY29uc3QgY2hhciAqKSk7CitleHRlcm4gaW50CWxpbmsgX19BUkdTKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGludAlta2RpciBfX0FSR1MoKGNvbnN0IGNoYXIgKiwgbW9kZV90KSk7CitleHRlcm4gaW50CXJtZGlyIF9fQVJHUygoY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiBpbnQJdGdldGVudCBfX0FSR1MoKGNoYXIgKiwgY2hhciAqKSk7CitleHRlcm4gaW50CXRnZXRudW0gX19BUkdTKChjaGFyICopKTsKK2V4dGVybiBpbnQJdGdldGZsYWcgX19BUkdTKChjaGFyICopKTsKK2V4dGVybiBjaGFyCSp0Z290byBfX0FSR1MoKGNoYXIgKiwgaW50LCBpbnQpKTsKK2V4dGVybiBpbnQJdHB1dHMgX19BUkdTKChjaGFyICosIGludCwgaW50ICgqKShpbnQpKSk7CisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorc3RydWN0IHRlcm1pb3M7CQkvKiBmb3IgdGNnZXRhdHRyIF9fQVJHUyAqLworZXh0ZXJuIGludAl0Y2dldGF0dHIgX19BUkdTKChpbnQsIHN0cnVjdCB0ZXJtaW9zICopKTsKK2V4dGVybiBpbnQJdGNzZXRhdHRyIF9fQVJHUygoaW50LCBpbnQsIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICopKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKK3N0cnVjdCBzdGF0ZnM7CQkvKiBmb3IgZnN0YXRmcyBfX0FSR1MgKi8KK2V4dGVybiBpbnQJZnN0YXRmcyBfX0FSR1MoKGludCwgc3RydWN0IHN0YXRmcyAqLCBpbnQsIGludCkpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorc3RydWN0IHRpbWV2YWw7CQkvKiBmb3IgZ2V0dGltZW9mZGF5IF9fQVJHUyAqLworc3RydWN0IHRpbWV6b25lOwkvKiBmb3IgZ2V0dGltZW9mZGF5IF9fQVJHUyAqLworZXh0ZXJuIGludAlnZXR0aW1lb2ZkYXkgX19BUkdTKChzdHJ1Y3QgdGltZXZhbCAqdHAsIHN0cnVjdCB0aW1lem9uZSAqdHpwKSk7CitleHRlcm4gdGltZV90CXRpbWUgX19BUkdTKCh0aW1lX3QgKikpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dFVFBXTkFNCitzdHJ1Y3QgcGFzc3dkOwkJLyogZm9yIGdldHB3bmFtIF9fQVJHUyAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3bmFtIF9fQVJHUygoY29uc3QgY2hhciAqKSk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9UTVBOQU0KK2V4dGVybiBjaGFyCSp0bXBuYW0gX19BUkdTKChjaGFyICopKTsKKyNlbHNlCitleHRlcm4gY2hhcgkqbWt0ZW1wIF9fQVJHUygoY2hhciAqKSk7CisjZW5kaWYKKworI2lmZGVmIElTQworZXh0ZXJuIGludAlfWG1ibGVuIF9fQVJHUygoY2hhciBjb25zdCAqLCBzaXplX3QpKTsKKyNlbHNlCisJCS8qIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhlYWRlciBidXQgbWF0Y2hlcyBtYmxlbigpICovCitleHRlcm4gaW50CV9YbWJsZW4gX19BUkdTKChjaGFyICosIHNpemVfdCkpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvcGF0aGRlZi5zaCBiL3NyYy9wYXRoZGVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyYTgzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGF0aGRlZi5zaApAQCAtMCwwICsxLDExIEBACisjISAvYmluL3NoCisjCisjIHBhdGhkZWYuc2g6IGFkanVzdCBwYXRoZGVmLmMgZm9yIGF1dG8vbGluay5zZWQsIGlmIGl0IGV4aXN0cworIworaWYgdGVzdCAtcyBhdXRvL2xpbmsuc2VkOyB0aGVuCisgIGNwIGF1dG8vcGF0aGRlZi5jIGF1dG8vcGF0aGRlZi50bXAKKyAgc2VkIC1mIGF1dG8vbGluay5zZWQgPGF1dG8vcGF0aGRlZi50bXAgPmF1dG8vcGF0aGRlZi5jCisgIHJtIC1mIGF1dG8vcGF0aGRlZi50bXAKK2ZpCisKKyMgdmltOnNldCBzdz0yIGV0OgpkaWZmIC0tZ2l0IGEvc3JjL3BvL01ha2VfbWluZy5tYWsgYi9zcmMvcG8vTWFrZV9taW5nLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBlZmIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL01ha2VfbWluZy5tYWsKQEAgLTAsMCArMSw2NyBAQAorIyBNYWtlZmlsZSBmb3IgdGhlIFZpbSBtZXNzYWdlIHRyYW5zbGF0aW9ucyBmb3IgbWluZ3czMgorIworIyBFZHVhcmRvIEYuIEFtYXRyaWEgPGVmZXJuYTFAcGxhdGVhLnBudGljLm1lYy5lcz4KKyMKKyMgUmVhZCB0aGUgUkVBRE1FX21pbmcudHh0IGZpbGUgYmVmb3JlIHVzaW5nIGl0LgorIworIyBVc2UgYXQgeW91ciBvd24gcmlzayBidXQgd2l0aCBjYXJlLCBpdCBjb3VsZCBldmVuIGtpbGwgeW91ciBjYW5hcnkuCisjCisjIFByZXZpb3VzIHRvIGFsbCB5b3UgbXVzdCBoYXZlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMQU5HVUFHRSBzZXQgdG8geW91cgorIyBsYW5ndWFnZSAoeHgpIGFuZCBhZGQgaXQgdG8gdGhlIG5leHQgdGhyZWUgbGluZXMuCisjCisKK0xBTkdVQUdFUyA9CWFmIGNhIGNzIGRlIGVuX0dCIGVzIGZyIGl0IGphIGtvIG5vIHBsIHJ1IHNrIHN2IHVrIHpoX1RXIFwKKwkJemhfVFcuVVRGLTggemhfQ04gemhfQ04uVVRGLTgKK01PRklMRVMgPQlhZi5tbyBjYS5tbyBjcy5tbyBkZS5tbyBlbl9HQi5tbyBlcy5tbyBmci5tbyBpdC5tbyBqYS5tbyBcCisJCWtvLm1vIG5vLm1vIHBsLm1vIHJ1Lm1vIHNrLm1vIHN2Lm1vIHVrLm1vIFwKKwkJemhfVFcubW8gemhfVFcuVVRGLTgubW8gemhfQ04ubW8gemhfQ04uVVRGLTgubW8KKworUEFDS0FHRSA9IHZpbQorCisjIFVuY29tbWVudCBvbmUgb2YgdGhlIGxpbmVzIGJlbG93IG9yIG1vZGlmeSBpdCB0byBwdXQgdGhlIHBhdGggdG8geW91cgorIyBnZXR0ZXggYmluYXJpZXM7IEkgdXNlIHRoZSBmaXJzdAorI0dFVFRFWFRfUEFUSCA9IEM6L2dldHRleHQud2luMzIvYmluLworI0dFVFRFWFRfUEFUSCA9IEM6L2dldHRleHQtMC4xMC4zNS13MzIvd2luMzIvUmVsZWFzZS8KKyNHRVRURVhUX1BBVEggPSBDOi9jeWd3aW4vYmluLworCitNU0dGTVQgPSAkKEdFVFRFWFRfUEFUSCltc2dmbXQKK1hHRVRURVhUID0gJChHRVRURVhUX1BBVEgpeGdldHRleHQKK01TR01FUkdFID0gJChHRVRURVhUX1BBVEgpbXNnbWVyZ2UKKworTVYgPSBtb3ZlCitDUCA9IGNvcHkKK1JNID0gZGVsCitNS0QgPSBta2RpcgorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5wbyAubW8gLnBvdAorLlBIT05ZOiBmaXJzdF90aW1lIGFsbCBpbnN0YWxsIGNsZWFuICQoTEFOR1VBR0VTKQorCisucG8ubW86CisJJChNU0dGTVQpIC1vICRAICQ8CisKK2FsbDogJChNT0ZJTEVTKQorCitmaXJzdF90aW1lOgorCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChMQU5HVUFHRSkgXAorCQktLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gJCh3aWxkY2FyZCAuLi8qLmMpIC4uL2lmX3BlcmwueHMgJCh3aWxkY2FyZCAuLi9nbG9iYWxzLmgpCisKKyQoTEFOR1VBR0VTKToKKwkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgXAorCQktLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gJCh3aWxkY2FyZCAuLi8qLmMpIC4uL2lmX3BlcmwueHMgJCh3aWxkY2FyZCAuLi9nbG9iYWxzLmgpCisJJChNVikgJChQQUNLQUdFKS5wbyAkKFBBQ0tBR0UpLnBvdAorCSQoQ1ApICRALnBvICRALnBvLm9yaWcKKwkkKE1WKSAkQC5wbyAkQC5wby5vbGQKKwkkKE1TR01FUkdFKSAkQC5wby5vbGQgJChQQUNLQUdFKS5wb3QgLW8gJEAucG8KKwkkKFJNKSAkQC5wby5vbGQKKworaW5zdGFsbDoKKwkkKE1LRCkgJChWSU1SVU5USU1FKVxsYW5nXCQoTEFOR1VBR0UpCisJJChNS0QpICQoVklNUlVOVElNRSlcbGFuZ1wkKExBTkdVQUdFKVxMQ19NRVNTQUdFUworCSQoQ1ApICQoTEFOR1VBR0UpLm1vICQoVklNUlVOVElNRSlcbGFuZ1wkKExBTkdVQUdFKVxMQ19NRVNTQUdFU1wkKFBBQ0tBR0UpLm1vCisKK2NsZWFuOgorCSQoUk0pICoubW8KKwkkKFJNKSAqLnBvdAorCisKZGlmZiAtLWdpdCBhL3NyYy9wby9NYWtlX212Yy5tYWsgYi9zcmMvcG8vTWFrZV9tdmMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OWI1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vTWFrZV9tdmMubWFrCkBAIC0wLDAgKzEsNjIgQEAKKyMgTWFrZWZpbGUgZm9yIHRoZSBWaW0gbWVzc2FnZSB0cmFuc2xhdGlvbnMgZm9yIE1TVkMKKyMgKGJhc2VkIG9uIG1ha2VfbWluZy5tYWspCisjCisjIE1pa2UgV2lsbGlhbXMgPG1yd0BlYW5kZW0uY28udWs+CisjCisjIFBsZWFzZSByZWFkIFJFQURNRV9tdmMudHh0IGJlZm9yZSB1c2luZyB0aGlzIGZpbGUuCisjCisKK0xBTkdVQUdFUyA9CWFmIGNhIGNzIGRlIGVuX0dCIGVzIGZyIGl0IGphIGtvIG5vIHBsIHJ1IHNrIHN2IHVrIHpoX1RXIFwKKwkJemhfVFcuVVRGLTggemhfQ04gemhfQ04uVVRGLTgKK01PRklMRVMgPQlhZi5tbyBjYS5tbyBjcy5tbyBkZS5tbyBlbl9HQi5tbyBlcy5tbyBmci5tbyBpdC5tbyBqYS5tbyBcCisJCWtvLm1vIG5vLm1vIHBsLm1vIHJ1Lm1vIHNrLm1vIHN2Lm1vIHVrLm1vIFwKKwkJemhfVFcubW8gemhfVFcuVVRGLTgubW8gemhfQ04ubW8gemhfQ04uVVRGLTgubW8KKworUEFDS0FHRSA9IHZpbQorCisjIENvcnJlY3QgdGhlIGZvbGxvd2luZyBsaW5lIGZvciB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBnZXR0ZXh0CitHRVRURVhUX1BBVEggPSBIOlxnZXR0ZXh0LndpbjMyLm1zdmNydFxiaW4KKworTVNHRk1UID0gJChHRVRURVhUX1BBVEgpXG1zZ2ZtdAorWEdFVFRFWFQgPSAkKEdFVFRFWFRfUEFUSClceGdldHRleHQKK01TR01FUkdFID0gJChHRVRURVhUX1BBVEgpXG1zZ21lcmdlCisKK01WID0gbW92ZQorQ1AgPSBjb3B5CitSTSA9IGRlbAorTUtEID0gbWtkaXIKK0xTID0gZGlyCisKK0xTRkxBR1MgPSAvYiAvb24gL2wgL3MKKworSU5TVEFMTERJUiA9ICQoVklNUlVOVElNRSlcbGFuZ1wkKExBTkdVQUdFKVxMQ19NRVNTQUdFUworCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5wbyAubW8gLnBvdAorCisucG8ubW86CisJJChNU0dGTVQpIC1vICRAICQ8CisKK2FsbDogJChNT0ZJTEVTKQorCitmaWxlczoKKwkkKExTKSAkKExTRkxBR1MpIC4uXCouYyAuLlxpZl9wZXJsLnhzIC4uXGdsb2JhbHMuaCA+IC5cZmlsZXMKKworZmlyc3RfdGltZTogZmlsZXMKKwkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoTEFOR1VBR0UpIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyAtLWZpbGVzLWZyb209LlxmaWxlcworCiskKExBTkdVQUdFUyk6IGZpbGVzCisJJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyAtLWZpbGVzLWZyb209LlxmaWxlcworCSQoTVYpICQoUEFDS0FHRSkucG8gJChQQUNLQUdFKS5wb3QKKwkkKENQKSAkQC5wbyAkQC5wby5vcmlnCisJJChNVikgJEAucG8gJEAucG8ub2xkCisJJChNU0dNRVJHRSkgJEAucG8ub2xkICQoUEFDS0FHRSkucG90IC1vICRALnBvCisJJChSTSkgJEAucG8ub2xkCisKK2luc3RhbGw6CisJaWYgbm90IGV4aXN0ICQoSU5TVEFMTERJUikgJChNS0QpICQoSU5TVEFMTERJUikKKwkkKENQKSAkKExBTkdVQUdFKS5tbyAkKElOU1RBTExESVIpXCQoUEFDS0FHRSkubW8KKworY2xlYW46CisJJChSTSkgKi5tbworCSQoUk0pICoucG90CmRpZmYgLS1naXQgYS9zcmMvcG8vTWFrZWZpbGUgYi9zcmMvcG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0OTEzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9NYWtlZmlsZQpAQCAtMCwwICsxLDEzNSBAQAorIyBNYWtlZmlsZSBmb3IgdGhlIFZpbSBtZXNzYWdlIHRyYW5zbGF0aW9ucy4KKworIyBUT0RPIG1ha2UgdGhpcyBjb25maWd1cmFibGUKKyMgTm90ZTogamEuc2ppcywgKi5jcDEyNTAgYW5kIHpoX0NOLmNwOTM2IGFyZSBvbmx5IGZvciBNUy1XaW5kb3dzLCB0aGV5IGFyZQorIyBub3QgaW5zdGFsbGVkIG9uIFVuaXgKKworTEFOR1VBR0VTID0JYWYgY2EgY3MgZGUgZW5fR0IgZXMgZnIgaXQgamEga28gbm8gcGwgcnUgc2sgc3YgdWsgemhfVFcgXAorCQl6aF9UVy5VVEYtOCB6aF9DTiB6aF9DTi5VVEYtOAorTU9GSUxFUyA9CWFmLm1vIGNhLm1vIGNzLm1vIGRlLm1vIGVuX0dCLm1vIGVzLm1vIGZyLm1vIGl0Lm1vIGphLm1vIFwKKwkJa28ubW8gbm8ubW8gcGwubW8gcnUubW8gc2subW8gc3YubW8gdWsubW8gXAorCQl6aF9UVy5tbyB6aF9UVy5VVEYtOC5tbyB6aF9DTi5tbyB6aF9DTi5VVEYtOC5tbworCitQQUNLQUdFID0gdmltCitTSEVMTCA9IC9iaW4vc2gKKworIyBUaGUgT0xEX1BPX0ZJTEVfSU5QVVQgYW5kIE9MRF9QT19GSUxFX09VVFBVVCBhcmUgZm9yIHRoZSBuZXcgR05VIGdldHRleHQKKyMgdG9vbHMgMC4xMC4zNywgd2hpY2ggdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IC5wbyBmaWxlIGZvcm1hdCB0aGF0IGlzIG5vdAorIyBjb21wYXRpYmxlIHdpdGggU29sYXJpcyAoYW5kIG9sZCBnZXR0ZXh0IGltcGxlbWVudGF0aW9ucykgdW5sZXNzIHRoZXNlIGFyZQorIyBzZXQuICBnZXR0ZXh0IDAuMTAuMzYgd2lsbCBub3Qgd29yayEKK01TR0ZNVCA9IE9MRF9QT19GSUxFX0lOUFVUPXllcyBtc2dmbXQgLXYKK1hHRVRURVhUID0gT0xEX1BPX0ZJTEVfSU5QVVQ9eWVzIE9MRF9QT19GSUxFX09VVFBVVD15ZXMgeGdldHRleHQKK01TR01FUkdFID0gT0xEX1BPX0ZJTEVfSU5QVVQ9eWVzIE9MRF9QT19GSUxFX09VVFBVVD15ZXMgbXNnbWVyZ2UKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucG8gLm1vIC5wb3QKKy5QSE9OWTogYWxsIGluc3RhbGwgdW5pbnN0YWxsIGNoZWNrIGNsZWFuIGRpc3RjbGVhbiAkKExBTkdVQUdFUykKKworLnBvLm1vOgorCSQoTVNHRk1UKSAtbyAkQCAkPAorCithbGw6ICQoTU9GSUxFUykKKworaW5zdGFsbDogJChNT0ZJTEVTKQorCUAkKE1BS0UpIGNoZWNrCisJZm9yIGxhbmcgaW4gJChMQU5HVUFHRVMpOyBkbyBcCisJICBkaXI9JChMT0NBTEVESVIpLyQkbGFuZy87IFwKKwkgIGlmIHRlc3QgISAteCAiJCRkaXIiOyB0aGVuIFwKKwkgICAgbWtkaXIgJCRkaXI7IGNobW9kIDc1NSAkJGRpcjsgXAorCSAgZmk7IFwKKwkgIGRpcj0kKExPQ0FMRURJUikvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICBpZiB0ZXN0ICEgLXggIiQkZGlyIjsgdGhlbiBcCisJICAgIG1rZGlyICQkZGlyOyBjaG1vZCA3NTUgJCRkaXI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1yICQkbGFuZy5tbzsgdGhlbiBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGxhbmcubW8gJCRkaXIvJChQQUNLQUdFKS5tbzsgXAorCSAgICBjaG1vZCAkKEZJTEVNT0QpICQkZGlyLyQoUEFDS0FHRSkubW87IFwKKwkgIGZpOyBcCisJZG9uZQorCit1bmluc3RhbGw6CisJQCQoTUFLRSkgY2hlY2sKKwlmb3IgY2F0IGluICQoTU9GSUxFUyk7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIHJtIC1mICQoTE9DQUxFRElSKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKS5tbzsgXAorCWRvbmUKKworY29udmVydGVkOiBqYS5zamlzLm1vIGNzLmNwMTI1MC5tbyBwbC5jcDEyNTAubW8gc2suY3AxMjUwLm1vIHpoX0NOLmNwOTM2Lm1vIFwKKwkJcnUuY3AxMjUxLm1vCisKKyMgQ29udmVydCBqYS5wbyB0byBjcmVhdGUgamEuc2ppcy5wby4gIFJlcXVpcmVzIGRvdWJsaW5nIGJhY2tzbGFzaGVzIGluIHRoZQorIyBzZWNvbmQgYnl0ZS4gIERvbid0IGRlcGVuZCBvbiBzamlzY29yciwgaXQgc2hvdWxkIG9ubHkgYmUgY29tcGlsZWQgd2hlbgorIyBqYS5zamlzLnBvIGlzIG91dGRhdGVkLgoramEuc2ppcy5wbzogamEucG8KKwlAJChNQUtFKSBzamlzY29ycgorCXJtIC1mIGphLnNqaXMucG8KKwlpY29udiAtZiBldWMtanAgLXQgY3A5MzIgamEucG8gfCAuL3NqaXNjb3JyID4gamEuc2ppcy5wbworCitzamlzY29ycjogc2ppc2NvcnIuYworCSQoQ0MpIC1vIHNqaXNjb3JyIHNqaXNjb3JyLmMKKworIyBDb252ZXJ0IGNzLnBvIHRvIGNyZWF0ZSBjcy5jcDEyNTAucG8uCitjcy5jcDEyNTAucG86IGNzLnBvCisJcm0gLWYgY3MuY3AxMjUwLnBvCisJaWNvbnYgLWYgaXNvLTg4NTktMiAtdCBjcDEyNTAgY3MucG8gfCBcCisJCXNlZCAtZSAncy9jaGFyc2V0PUlTTy04ODU5LTIvY2hhcnNldD1jcDEyNTAvJyAtZSAncy8jIE9yaWdpbmFsIHRyYW5zbGF0aW9ucy8jIEdlbmVyYXRlZCBmcm9tIGNzLnBvLCBETyBOT1QgRURJVC8nID4gY3MuY3AxMjUwLnBvCisKKyMgQ29udmVydCBwbC5wbyB0byBjcmVhdGUgcGwuY3AxMjUwLnBvLgorcGwuY3AxMjUwLnBvOiBwbC5wbworCXJtIC1mIHBsLmNwMTI1MC5wbworCWljb252IC1mIGlzby04ODU5LTIgLXQgY3AxMjUwIHBsLnBvIHwgXAorCQlzZWQgLWUgJ3MvY2hhcnNldD1JU08tODg1OS0yL2NoYXJzZXQ9Y3AxMjUwLycgLWUgJ3MvIyBPcmlnaW5hbCB0cmFuc2xhdGlvbnMvIyBHZW5lcmF0ZWQgZnJvbSBwbC5wbywgRE8gTk9UIEVESVQvJyA+IHBsLmNwMTI1MC5wbworCisjIENvbnZlcnQgc2sucG8gdG8gY3JlYXRlIHNrLmNwMTI1MC5wby4KK3NrLmNwMTI1MC5wbzogc2sucG8KKwlybSAtZiBzay5jcDEyNTAucG8KKwlpY29udiAtZiBpc28tODg1OS0yIC10IGNwMTI1MCBzay5wbyB8IFwKKwkJc2VkIC1lICdzL2NoYXJzZXQ9SVNPLTg4NTktMi9jaGFyc2V0PWNwMTI1MC8nIC1lICdzLyMgT3JpZ2luYWwgdHJhbnNsYXRpb25zLyMgR2VuZXJhdGVkIGZyb20gc2sucG8sIERPIE5PVCBFRElULycgPiBzay5jcDEyNTAucG8KKworIyBDb252ZXJ0IHpoX0NOLnBvIHRvIGNyZWF0ZSB6aF9DTi5jcDkzNi5wby4KKyMgc2V0ICdjaGFyc2V0JyB0byBnYmsgdG8gYXZvaWQgdGhhdCBtc2ZtdCBnZW5lcmF0ZXMgYSB3YXJuaW5nCit6aF9DTi5jcDkzNi5wbzogemhfQ04ucG8KKwlybSAtZiB6aF9DTi5jcDkzNi5wbworCWljb252IC1mIGdiMjMxMiAtdCBjcDkzNiB6aF9DTi5wbyB8IFwKKwkJc2VkIC1lICdzL2NoYXJzZXQ9Z2IyMzEyL2NoYXJzZXQ9Z2JrLycgLWUgJ3MvIyBPcmlnaW5hbCB0cmFuc2xhdGlvbnMvIyBHZW5lcmF0ZWQgZnJvbSB6aF9DTi5wbywgRE8gTk9UIEVESVQvJyA+IHpoX0NOLmNwOTM2LnBvCisKKyMgQ29udmVydCBydS5wbyB0byBjcmVhdGUgcnUuY3AxMjUxLnBvLgorcnUuY3AxMjUxLnBvOiBydS5wbworCXJtIC1mIHJ1LmNwMTI1MS5wbworCWljb252IC1mIGtvaTgtciAtdCBjcDEyNTEgcnUucG8gfCBcCisJCXNlZCAtZSAncy9jaGFyc2V0PWtvaTgtci9jaGFyc2V0PWNwMTI1MS8nIC1lICdzLyMgT3JpZ2luYWwgdHJhbnNsYXRpb25zLyMgR2VuZXJhdGVkIGZyb20gcnUucG8sIERPIE5PVCBFRElULycgPiBydS5jcDEyNTEucG8KKworY2hlY2s6CisJQGlmIHRlc3QgIngiID0gIngkKHByZWZpeCkiOyB0aGVuIFwKKwkgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7IFwKKwkgIGVjaG8gIiAgcGxlYXNlIHVzZSBtYWtlIGZyb20gdGhlIHNyYyBkaXJlY3RvcnkgICI7IFwKKwkgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7IFwKKwkgIGV4aXQgMTsgXAorCWZpCisKK2NsZWFuOgorCXJtIC1mIGNvcmUgY29yZS4qICoub2xkLnBvICoubW8gKi5wb3Qgc2ppc2NvcnIKKworZGlzdGNsZWFuOiBjbGVhbgorCisjCisjIE5PVEU6IElmIHlvdSBnZXQgYW4gZXJyb3IgZm9yIGd2aW1leHQuY3BwIG5vdCBmb3VuZCwgeW91IG5lZWQgdG8gdW5wYWNrIHRoZQorIyBleHRyYSBhcmNoaXZlLgorIworJChQQUNLQUdFKS5wb3Q6IC4uLyouYyAuLi9pZl9wZXJsLnhzIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHAgLi4vZ2xvYmFscy5oCisJY2QgLi47ICQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSBcCisJCS0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCisJCSouYyBpZl9wZXJsLnhzIEd2aW1FeHQvZ3ZpbWV4dC5jcHAgZ2xvYmFscy5oCisJbXYgLWYgLi4vJChQQUNLQUdFKS5wbyAkKFBBQ0tBR0UpLnBvdAorCisjIERvbid0IGFkZCBhIGRlcGVuZGVuY3kgaGVyZSwgd2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGUgLnBvIGZpbGVzIG1hbnVhbGx5CiskKExBTkdVQUdFUyk6CisJQCQoTUFLRSkgJChQQUNLQUdFKS5wb3QKKwlpZiB0ZXN0ICEgLWYgJEAucG8ub3JpZzsgdGhlbiBjcCAkQC5wbyAkQC5wby5vcmlnOyBmaQorCW12ICRALnBvICRALnBvLm9sZAorCWlmICQoTVNHTUVSR0UpICRALnBvLm9sZCAkKFBBQ0tBR0UpLnBvdCAtbyAkQC5wbzsgdGhlbiBcCisJICAgIHJtIC1mICRALnBvLm9sZDsgXAorCWVsc2UgXAorCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJEAucG8gZmFpbGVkISI7IG12ICRALnBvLm9sZCAkQC5wbzsgXAorCWZpCmRpZmYgLS1naXQgYS9zcmMvcG8vUkVBRE1FLnR4dCBiL3NyYy9wby9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjNlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vUkVBRE1FLnR4dApAQCAtMCwwICsxLDEwNCBAQAorVFJBTlNMQVRJTkcgVklNIE1FU1NBR0VTCisKK0luIHRoaXMgZGlyZWN0b3J5IHlvdSB3aWxsIGZpbmQgeHgucG8gZmlsZXMsIHdoZXJlICJ4eCIgaXMgYSBsYW5ndWFnZSBjb2RlLgorRWFjaCBmaWxlIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBvZiBFbmdsaXNoIFZpbSBtZXNzYWdlcyBmb3Igb25lIGxhbmd1YWdlLgorVGhlIGZpbGVzIGFyZSBpbiAicG8iIGZvcm1hdCwgdXNlZCBieSB0aGUgZ2V0dGV4dCBwYWNrYWdlLiAgUGxlYXNlIHJlZmVyIHRvCit0aGUgZ2V0dGV4dCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitUaGUgR05VIGdldHRleHQgbGlicmFyeSwgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDAuMTAuMzcsIHN1cHBvcnRzIGNvbnZlcnRpbmcKK21lc3NhZ2VzIGZyb20gb25lIGVuY29kaW5nIHRvIGFub3RoZXIuICBUaGlzIHJlcXVpcmVzIHRoYXQgaXQgd2FzIGNvbXBpbGVkCit3aXRoIEhBVkVfSUNPTlYuICBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIG1lc3NhZ2VzIG1heSBiZSBpbiBhbnkgZW5jb2RpbmcKK3N1cHBvcnRlZCBieSBpY29udiBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgY3VycmVudGx5IHVzZWQKK2VuY29kaW5nLgorCitUaGUgR05VIGdldHRleHQgbGlicmFyeSwgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDAuMTAuMzYsIHVzZXMgYSBuZXcgZm9ybWF0IGZvcgorc29tZSBlbmNvZGluZ3MuICBUaGlzIGZvbG93cyB0aGUgQzk5IHN0YW5kYXJkIGZvciBzdHJpbmdzLiAgSXQgbWVhbnMgdGhhdCB3aGVuCithIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGluY2x1ZGVzIHRoZSAweDVjIGJ5dGUsIHRoaXMgaXMgbm90IHJlY29nbml6ZWQgYXMgYQorYmFja3NsYXNoLiAgU2luY2UgdGhpcyBmb3JtYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggU29sYXJpcywgVmltIHVzZXMgdGhlIG9sZAorZm9ybWF0LiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgdGhlIE9MRF9QT19GSUxFX09VVFBVVCBhbmQgT0xEX1BPX0ZJTEVfSU5QVVQKK2Vudmlyb25tZW50IHZhcmlhYmxlcy4gIFdoZW4geW91IHVzZSB0aGUgTWFrZWZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgdGhhdCB3aWxsCitiZSBkb25lIGZvciB5b3UuICBUaGlzIGRvZXMgTk9UIHdvcmsgd2l0aCBnZXR0ZXh0IDAuMTAuMzYuICBEb24ndCB1c2UgaXQsIGdldAorMC4xMC4zNy4KKworCitPTiBNUy1XSU5ET1dTCisKK1RoZSBkaXN0cmlidXRlZCBmaWxlcyBhcmUgZ2VuZXJhdGVkIG9uIFVuaXgsIGJ1dCB0aGlzIHNob3VsZCBhbHNvIGJlIHBvc3NpYmxlCitvbiBNUy1XaW5kb3dzLiAgRG93bmxvYWQgdGhlIGdldHRleHQgcGFja2FnZXMsIGZvciBleGFtcGxlIGZyb206CisKKwlodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2dldHRleHQKKworWW91IG1pZ2h0IGhhdmUgdG8gZG8gdGhlIGNvbW1hbmRzIG1hbnVhbGx5LiAgRXhhbXBsZToKKworICAgY2QgYzpcdmltXHZpbTYwCisgICBta2RpciBydW50aW1lXGxhbmdcamFcTENfTUVTU0FHRVMKKyAgIG1zZ2ZtdCAtbyBydW50aW1lXGxhbmdcamFcTENfTUVTU0FHRVNcdmltLm1vIHNyY1xwb1xqYS5wbworCisKK1dIRU4gVEhFUkUgSVMgQSBNSVNUQUtFCisKK0lmIHlvdSBmaW5kIHRoZXJlIGlzIGEgbWlzdGFrZSBpbiBvbmUgb2YgdGhlIHRyYW5zbGF0aW9ucywgcGxlYXNlIHJlcG9ydCB0aGlzCit0byB0aGUgbWFpbnRhaW5lciBvZiB0aGUgdHJhbnNsYXRpb24uICBIaXMvaGVyIEUtbWFpbCBhZGRyZXNzIGlzIGluIHRoZQorY29tbWVudHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgWW91IGNhbiBhbHNvIHNlZSB0aGlzIHdpdGggdGhlICI6bWVzc2FnZXMiCitjb21tYW5kIGluIFZpbSB3aGVuIHRoZSB0cmFuc2xhdGlvbiBpcyBiZWluZyB1c2VkLgorCisKK0NSRUFUSU5HIEEgTkVXIFBPIEZJTEUKKworV2Ugd2lsbCB1c2UgInh4LnBvIiBhcyBhbiBleGFtcGxlIGhlcmUsIHJlcGxhY2UgInh4IiB3aXRoIHRoZSBuYW1lIG9mIHlvdXIKK2xhbmd1YWdlLgorCistIEVkaXQgTWFrZWZpbGUgdG8gYWRkIHh4IHRvIExBTkdVQUdFUyBhbmQgeHgubW8gdG8gTU9GSUxFUy4KKy0gQ29weSB0aGUgaGVhZGVyIG9mIGFuIGV4aXN0aW5nIGZpbGUsIGUuZy4sIGRlLnBvLCB0byB4eC5wby4gIERvIG5vdCBjb3B5IGFueQorICBvZiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlcywgZGVsZXRlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlICJtc2dzdHIiLgorLSBUaGUgcmVtYWluaW5nIHdvcmsgaXMgbGlrZSB1cGRhdGluZywgc2VlIHRoZSBuZXh0IHNlY3Rpb24uCisKKworVVBEQVRJTkcgQSBQTyBGSUxFCisKK0lmIHlvdSBhcmUgdGhlIG1haW50YWluZXIgb2YgYSAucG8gZmlsZSwgdGhpcyBpcyBob3cgeW91IHVwZGF0ZSB0aGUgZmlsZS4gIFdlCit3aWxsIHVzZSAieHgucG8iIGFzIGFuIGV4YW1wbGUgaGVyZSwgcmVwbGFjZSAieHgiIHdpdGggdGhlIG5hbWUgb2YgeW91cgorbGFuZ3VhZ2UuCisKKygxKSBBZGQgbmV3IGFuZCBjaGFuZ2VkIG1lc3NhZ2VzIGZyb20gdGhlIFZpbSBzb3VyY2VzOgorCisJbWFrZSB4eAorCisgICAgVGhpcyB3aWxsIGV4dHJhY3QgYWxsIHRoZSBzdHJpbmdzIGZyb20gVmltIGFuZCBtZXJnZSB0aGVtIGluIHdpdGggdGhlCisgICAgZXhpc3RpbmcgdHJhbnNsYXRpb25zLiAgUmVxdWlyZXMgdGhlIEdOVSBnZXR0ZXh0IHV0aWxpdGllcy4gIEFsc28gcmVxdWlyZXMKKyAgICB1bnBhY2tpbmcgdGhlIGV4dHJhIGFyY2hpdmUuCisgICAgWW91ciBvcmlnaW5hbCB4eC5wbyBmaWxlIHdpbGwgYmUgY29waWVkIHRvIHh4LnBvLm9yaWcKKworICAgIC0tIEFmdGVyIHlvdSBkbyB0aGlzLCB5b3UgTVVTVCBkbyB0aGUgbmV4dCB0aHJlZSBzdGVwcyEgLS0KKworKDIpIFRyYW5zbGF0ZQorICAgIFNlZSB0aGUgZ2V0dGV4dCBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBkbyB0aGlzLiAgWW91IGNhbiBhbHNvIGZpbmQKKyAgICBleGFtcGxlcyBpbiB0aGUgb3RoZXIgcG8gZmlsZXMuCisgICAgU2VhcmNoIHRoZSBwbyBmaWxlIGZvciBpdGVtcyB0aGF0IHJlcXVpcmUgdHJhbnNsYXRpb246CisKKwkvZnV6enlcfF5tc2dzdHIgIiJcKFxuIlwpXEAhCisKKyAgICBSZW1vdmUgdGhlICIjLCBmdXp6eSIgbGluZSBhZnRlciBhZGRpbmcgdGhlIHRyYW5zbGF0aW9uLgorCisgICAgVGhlcmUgaXMgb25lIHNwZWNpYWwgbWVzc2FnZToKKwltc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCisgICAgWW91IHNob3VsZCBpbmNsdWRlIHlvdXIgbmFtZSBhbmQgRS1tYWlsIGFkZHJlc3MgaW5zdGVhZCwgZm9yIGV4YW1wbGU6CisJbXNnc3RyICJCZXJpY2h0ZW4g/GJlcnNldHp0IGJlaTogSm9obiBEb2UgPGpvaG5AZG9lLm9yZz4iCisKKygzKSBDbGVhbiB1cAorICAgIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc2xhdGlvbiB3b3JrcyBvbiBhbGwgc3lzdGVtcy4KKyAgICBDb21tZW50LW91dCBhbGwgbm9uLXRyYW5zbGF0ZWQgc3RyaW5ncy4gIFRoZXJlIGFyZSB0d28gdHlwZXM6CisgICAgLSBpdGVtcyBtYXJrZWQgd2l0aCAiIywgZnV6enkiCisgICAgLSBpdGVtcyB3aXRoIGFuIGVtcHR5IG1zZ3N0cgorICAgIFlvdSBjYW4gZG8gdGhpcyB3aXRoIHRoZSBjbGVhbnVwLnZpbSBzY3JpcHQ6CisKKwk6c291cmNlIGNsZWFudXAudmltCisKKyAgICBCYWNrZ3JvdW5kOiBvbiBTb2xhcmlzIGFuIGVtcHR5IG1zZ3N0ciByZXN1bHRzIGluIGFuIGVtcHR5IG1lc3NhZ2U7IEdOVQorICAgIGdldHRleHQgaWdub3JlcyBlbXB0eSBzdHJpbmdzIGFuZCBpdGVtcyBtYXJrZWQgd2l0aCAiIywgZnV6enkiLgorCisoNCkgQ2hlY2s6CisKKwltYWtlIHh4Lm1vCisKKyAgICBMb29rIG91dCBmb3Igc3ludGF4IGVycm9ycyBhbmQgZml4IHRoZW0uCmRpZmYgLS1naXQgYS9zcmMvcG8vUkVBRE1FX21pbmd3LnR4dCBiL3NyYy9wby9SRUFETUVfbWluZ3cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTk4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vUkVBRE1FX21pbmd3LnR4dApAQCAtMCwwICsxLDEwMSBAQAorVFJBTlNMQVRJTkcgVklNIE1FU1NBR0VTCisKK1RoaXMgZmlsZSBleHBsYWlucyBob3cgdG8gY3JlYXRlIGFuZCBtYWludGFpbiBwbyBmaWxlcyB1c2luZworZ251LWdldHRleHQud2luMzIsIGEgTUlOR1czMiBXaW5kb3dzIHBvcnQgb2YgZ2V0dGV4dCBieSBGcmFuY28gQmV6Cis8ZnJhbmNvLmJlekBnbXguZGU+LiAgWW91IGNhbiBmaW5kIGl0IGF0OgorCisJaHR0cDovL2hvbWUuYS1jaXR5LmRlL2ZyYW5jby5iZXovZ2V0dGV4dC9nZXR0ZXh0X3dpbjMyX2VuLmh0bWwKKworRmlyc3QgcmVhZCB0aGUgUkVBRE1FLnR4dCBmaWxlIGZvciB0aGUgZ2VuZXJhbCByZW1hcmtzCisKKworVGhlIGZpbGUgdGhhdCBkb2VzIHRoZSB3b3JrIGlzIE1ha2VfbWluZy5tYWsgaW4gdGhlIHBvIGRpcmVjdG9yeS4gSXQgaXMgYW4KK2FkYXB0YXRpb24gb2YgdGhlIFVuaXggTWFrZWZpbGUsIGJ1dCBpdCBkb2VzIE5PVCB0ZXN0IHRoZSBwcmVzZW5jZSBvZiBhbnkgcG8sCitwb3QsIG9yIG1vIGZpbGVzLCBzbyB1c2UgaXQgYXQgeW91ciBvd24gcmlzayBidXQgd2l0aCBjYXJlOiBpdCBjb3VsZCBldmVuIGtpbGwKK3lvdXIgY2FuYXJ5LiBJdCBoYXMgYmVlbiB0ZXN0ZWQgYnkgbWUgc2V2ZXJhbCB0aW1lcyAoYW5kIHdpdGggZGlmZmVyZW50CitsYW5ndWFnZXMpIHdpdGggc3VjY2Vzcy4KKworVGhlIG1ha2UgdXRpbGl0eSBtdXN0IGJlIHJ1biBmcm9tIHRoZSBwbyBkaXJlY3RvcnkuCisKK0ZpcnN0IG9mIGFsbCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb21lbnQgdmFyaWFibGUgTEFOR1VBR0UgdG8geHgsIHdoZXJlIHh4IGlzCit0aGUgbmFtZSBvZiB5b3VyIGxhbmd1YWdlLiBZb3UgY2FuIGRvIGl0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciBhZGRpbmcgYQorbGluZSB0byB5b3VyIGF1dG9leGVjLmJhdCBmaWxlOiBzZXQgTEFOR1VBR0U9eHguIFlvdSBtdXN0IGFsc28gYWRkIHlvdXIKK2xhbmd1YWdlIHRvIHRoZSBNYWtlX21pbmcubWFrIGZpbGUgaW4gdGhlIGxpbmVzIExBTkdVQUdFUywgTU9GSUxFUywgQU5ECitQT0ZJTEVTLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhIHh4LnBvIGZpbGUsIHlvdSBtdXN0IGNyZWF0ZSBpdCB3aXRoIHRoZSBjb21tYW5kOgorCisJbWFrZSAtZiBNYWtlX21pbmcubWFrIGZpcnN0X3RpbWUKKworVGhpcyB3aWxsIHByb2R1Y2UgYSBuZXcgYnJhbmQgeHgucG8gZmlsZSB3aXRoIGFsbCB0aGUgbWVzc2FnZXMgaW4gVmltIHJlYWR5Citmb3IgdHJhbnNsYXRpb24uIFRoZW4geW91IG11c3Qgc291cmNlIHRoZSBjbGVhbnVwLnZpbSBzY3JpcHQgZnJvbSBpbnNpZGUgVmltOworaXQgd2lsbCBjb21tZW50IHRoZSB1bnRyYW5zbGF0ZWQgbWVzc2FnZXMgKG5vdywgYWxsKS4gSSByZWNvbW1lbmQgdG8gdXNlCitzeW50YXggaGlnaGxpZ2h0aW5nIHNvIHlvdSBjYW4gaWRlbnRpZnkgdGhlIHVudHJhbnNsYXRlZCBtZXNzYWdlcyBlYXNpbHkuCitZb3UgYWxzbyBtdXN0IHJlbW92ZSB0aGUgJy4uXCcgdGhhdCBwcmVwZW5kcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGVzLgorKEkgZG9uJ3Qgbm8gd2h5LCBidXQgbWFrZSBpcyB1bmFibGUgdG8gY2hhbmdlIHRoZSBkaXJlY3RvcnkgZnJvbSBwbyB0byBzcmMgYW5kCitiYWNrIHRvIHBvLCBzbyBhbGwgdGhlIHdvcmsgbXVzdCBiZSBkb25lIGZyb20gdGhlIHBvIGRpciwgaGVuY2UgdGhlICcuLlwnKQorCitUaGVuIHlvdSBtdXN0IGdvIHN0ZXAgKDIpIGJlbG93LgorCitJZiB5b3UgYXJlIHVwZGF0aW5nIGEgcG8gZmlsZSB5b3UgbXVzdCBmb2xsb3cgdGhlIG5leHQgc3RlcHMgKHRoZXkgYXJlIG5lYXJseQordGhlIHNhbWUgYXMgaW4gdGhlIFVuaXggY2FzZSwgb25seSB0aGUgY29tbWFuZHMgY2hhbmdlKToKKworKDEpIEFkZCBuZXcgYW5kIGNoYW5nZWQgbWVzc2FnZXMgZnJvbSB0aGUgVmltIHNvdXJjZXM6CisKKwltYWtlIC1mIE1ha2VfbWluZy5tYWsgeHgKKworICAgIFRoaXMgd2lsbCBleHRyYWN0IGFsbCB0aGUgc3RyaW5ncyBmcm9tIFZpbSBhbmQgbWVyZ2UgdGhlbSBpbiB3aXRoIHRoZQorICAgIGV4aXN0aW5nIHRyYW5zbGF0aW9ucy4gIFJlcXVpcmVzIHRoZSBHTlUgZ2V0dGV4dCB1dGlsaXRpZXMuICBBbHNvIHJlcXVpcmVzCisgICAgdW5wYWNraW5nIHRoZSBleHRyYSBhcmNoaXZlLgorICAgIFlvdXIgb3JpZ2luYWwgeHgucG8gZmlsZSB3aWxsIGJlIGNvcGllZCB0byB4eC5wby5vcmlnCisKKyAgICAtLSBBZnRlciB5b3UgZG8gdGhpcywgeW91IE1VU1QgZG8gdGhlIG5leHQgdGhyZWUgc3RlcHMhIC0tCisKKygyKSBUcmFuc2xhdGUKKyAgICBTZWUgdGhlIGdldHRleHQgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gZG8gdGhpcy4gIFlvdSBjYW4gYWxzbyBmaW5kCisgICAgZXhhbXBsZXMgaW4gdGhlIG90aGVyIHBvIGZpbGVzLgorICAgIFNlYXJjaCB0aGUgcG8gZmlsZSBmb3IgaXRlbXMgdGhhdCByZXF1aXJlIHRyYW5zbGF0aW9uOgorCS9cI1x+ICAgYW5kIGFsc28gdGhlIGZ1enp5IHRyYW5zbGF0aW9ucywgL1wjLCBmdXp6eQorICAgIFJlbW92ZSAiI34iIGFuZCAiIywgZnV6enkiIGFmdGVyIGFkZGluZyB0aGUgdHJhbnNsYXRpb24uCisKKyAgICBUaGVyZSBpcyBvbmUgc3BlY2lhbCBtZXNzYWdlOgorCW1zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKKyAgICBZb3Ugc2hvdWxkIGluY2x1ZGUgeW91ciBuYW1lIGFuZCBFLW1haWwgYWRkcmVzcyBpbnN0ZWFkLCBmb3IgZXhhbXBsZToKKwltc2dzdHIgIkJlcmljaHRlbiD8YmVyc2V0enQgYmVpOiBKb2huIERvZSA8am9obkBkb2Uub3JnPiIKKworKDMpIENsZWFuIHVwCisgICAgVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhlIHRyYW5zbGF0aW9uIHdvcmtzIG9uIGFsbCBzeXN0ZW1zLgorICAgIENvbW1lbnQtb3V0IGFsbCBub24tdHJhbnNsYXRlZCBzdHJpbmdzLiAgVGhlcmUgYXJlIHR3byB0eXBlczoKKyAgICAtIGl0ZW1zIG1hcmtlZCB3aXRoICIjLCBmdXp6eSIKKyAgICAtIGl0ZW1zIHdpdGggYW4gZW1wdHkgbXNnc3RyCisgICAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlIGNsZWFudXAudmltIHNjcmlwdDoKKworCTpzb3VyY2UgY2xlYW51cC52aW0KKworKDQpIENoZWNrOgorCisJbWFrZSAtZiBNYWtlX21pbmcubWFrIHh4Lm1vCisKKyAgICBMb29rIG91dCBmb3Igc3ludGF4IGVycm9ycyBhbmQgZml4IHRoZW0uCisKKyg1KSBUaGlzIGlzIGFuIGV4dHJhIHN0ZXAsIDstKS4gSWYgeW91IHdhbnQgdGhlIHZpbS5tbyBmaWxlIGluc3RhbGxlZCBpbiB5b3VyCisgICAgc3lzdGVtIHlvdSBtdXN0IHJ1bjoKKworCW1ha2UgLWYgTWFrZV9taW5nLm1hayBpbnN0YWxsCisKKyAgICBUaGlzIHdpbGwgY3JlYXRlIHRoZSB4eFxMQ19NRVNTQUdFUyBkaXJlY3RvcnkgKGlmIGl0IGRvZXMgbm90IGV4aXN0KSBhbmQKKyAgICB3aWxsIGNvcHkgdmltLnBvIHRvIGl0LgorCisoNikgQW5vdGhlciBleHRyYSBzdGVwIDstKSkuIFRoZSBjb21tYW5kOgorCisJbWFrZSAtZiBNYWtlX21pbmcubWFrIGNsZWFuCisKKyAgICB3aWxsIGRlbGV0ZSB0aGUgdGVtcCBmaWxlcyBjcmVhdGVkIGR1cmluZyB0aGUgcHJvY2Vzcy4KKworU3VnZ2VzdGlvbnMgd2lsbCBiZSB3ZWxjb21lZC4KKworRWR1YXJkbyBGLiBBbWF0cmlhIDxlZmVybmExQHBsYXRlYS5wbnRpYy5tZWMuZXM+CisKK0hhcHB5IFZpbW1pbmcgd2l0aCBOTFMhIQorCit2aW06dHc9Nzg6CmRpZmYgLS1naXQgYS9zcmMvcG8vUkVBRE1FX212Yy50eHQgYi9zcmMvcG8vUkVBRE1FX212Yy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMDdkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9SRUFETUVfbXZjLnR4dApAQCAtMCwwICsxLDk0IEBACitUUkFOU0xBVElORyBWSU0gTUVTU0FHRVMKKworVGhpcyBmaWxlIGV4cGxhaW5zIGhvdyB0byBjcmVhdGUgYW5kIG1haW50YWluIHBvIGZpbGVzIHVzaW5nCitnbnUtZ2V0dGV4dC53aW4zMiwgYSBXaW5kb3dzIHBvcnQgb2YgZ2V0dGV4dCBieSBGcmFuY28gQmV6Cis8ZnJhbmNvLmJlekBnbXguZGU+LiAgWW91IGNhbiBmaW5kIGl0IGF0OgorCisJaHR0cDovL2hvbWUuYS1jaXR5LmRlL2ZyYW5jby5iZXovZ2V0dGV4dC9nZXR0ZXh0X3dpbjMyX2VuLmh0bWwKKworRmlyc3QgcmVhZCB0aGUgUkVBRE1FLnR4dCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGZvciBnZW5lcmFsIHJlbWFya3Mgb24KK3RyYW5zbGF0aW5nIFZpbSBtZXNzYWdlcy4KKworCitTRVRVUAorCitTZXQgdGhlIGVudmlyb21lbnQgdmFyaWFibGUgTEFOR1VBR0UgdG8gdGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBsYW5ndWFnZSB5b3UKK2FyZSB0cmFuc2xhdGluZyBWaW0gbWVzc2FnZXMgdG8uICBMYW5ndWFnZGUgY29kZXMgYXJlIHR5cGljYWxseSB0d28gY2hhcmFjdGVycworYW5kIHlvdSBjYW4gZmluZCBhIGxpc3Qgb2YgdGhlbSBhdDoKKworCWh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9jbGljazJzcGVhay9sYW5ndWFnZXMuaHRtbAorCitUaGUgTEFOR1VBR0UgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGJ5IGFkZGluZworYSBsaW5lIHRvIHlvdXIgYXV0b2V4ZWMuYmF0IGZpbGUsIG9yIGJ5IGRlZmluaW5nIGEgdXNlciB2YXJpYWJsZSBmcm9tIHRoZQorQWR2YW5jZWQgdGFiIGluIHRoZSBTeXN0ZW0gY29udHJvbCBwYW5lbC4KKworTmV4dCwgZWRpdCBNYWtlX212Yy5tYWsgc28gdGhhdCBHRVRURVhUX1BBVEggcG9pbnRzIHRoZSBiaW5hcnkgZGlyZWN0b3J5IG9mCit0aGUgaW50YWxsYXRpb24uCisKKworQ1JFQVRJTkcgQSBORVcgVFJBTlNMQVRJT04KKworV2hlbiBjcmVhdGluZyBhIG5ldyB0cmFuc2xhdGlvbiB5b3UgbXVzdCBhZGQgeW91ciBsYW5ndWFnZSBjb2RlIHRvIHRoZQorTWFrZV9tdmMubWFrIGZpbGUgaW4gdGhlIGxpbmVzIGRlZmluaW5nIExBTkdVQUdFUyBhbmQgTU9GSUxFUy4gIFRvIGNyZWF0ZSB0aGUKK2luaXRpYWwgLnBvIGZpbGUgZm9yIHlvdXIgbGFuZ3VhZ2UgeW91IG11c3QgdXNlIHRoZSBjb21tYW5kOgorCisJbWFrZSAtZiBtYWtlX212Yy5tYWsgZmlyc3RfdGltZQorCitOb3RlOiBZb3UgbmVlZCB0byBiZSBpbiB0aGUgcG8gZGlyZWN0b3J5IHdoZW4gdXNpbmcgdGhpcyBtYWtlZmlsZS4KKworT25jZSB5b3UgaGF2ZSB5b3VyIG5ldyAucG8gZmlsZSBsb2FkIGl0IGludG8gVmltIGFuZCBzb3VyY2UgY2xlYW51cC52aW0sIHRoaXMKK3dpbGwgY29udmVydCB1bnRyYW5zbGF0ZWQgbWVzc2FnZXMgdG8gY29tbWVudHMuICBJZiB5b3UgaGF2ZSBzeW50YXgKK2hpZ2hsaWdodGluZyB0dXJuZWQgb24gdGhlbiB1bnRyYW5zbGF0ZWQgbWVzc2FnZXMgd2lsbCBzdGFuZCBvdXQgbW9yZSBlYXNpbHkuCisKK1lvdSB3aWxsIGFsc28gbmVlZCB0byBlZGl0IHRoZSBmaWxlIG5hbWVzIGluIHRoZSBjb21tZW50cyBpbiB0aGUgLnBvIGZpbGUuCitZb3UgbmVlZCB0byByZW1vdmUgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uICh3aGljaCBoYXMgdGhlIGZvcm0KK2M6XHZpbTYxXHNyY1wpLiAgWW91IGNhbiBkbyB0aGlzIGluIFZpbSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB3aXRoIHRoZQorYXBwcm9wcmlhdGUgZGlyZWN0b3J5IHNwZWNmaWNhdGlvbiBmb3Igd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHRoZSBWaW0KK3NvdXJjZToKKworCSVzL2M6XFx2aW02MVxcc3JjXFwvL2cKKworCitVUERBVElORyBBIFRSQU5TTEFUSU9OCisKK0lmIHRoZXJlIGFyZSBuZXcgb3IgY2hhbmdlZCBtZXNzYWdlcyBpbiBWaW0gdGhhdCBuZWVkIHRyYW5zbGF0aW5nLCB0aGVuIHRoZQorZmlyc3QgdGhpbmcgdG8gZG8gaXMgbWVyZ2UgdGhlbSBpbnRvIHRoZSBleGlzdGluZyB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGRvbmUKK3dpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJbm1ha2UgLWYgTWFrZV9tdmMubWFrIHh4LnBvCisKK3doZXJlIHh4IGlzIHRoZSBsYW5nYXVnZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UgbmVlZGluZyB0cmFuc2xhdGlvbnMuICBUaGUKK29yaWdpbmFsIC5wbyBmaWxlIGlzIGNvcGllZCB0byB4eC5wby5vcmlnLgorCisKK0RPSU5HIFRIRSBUUkFOU0xBVElPTgorCitOb3cgdGhhdCB5b3UgaGF2ZSBhIC5wbyBmaWxlIHlvdSBjYW4gZG8gdGhlIHRyYW5zbGF0aW9ucyBmb3IgYWxsIG1lc3NhZ2VzIHRoYXQKK25lZWQgaXQuICBTZWUgUkVBRE1FLnR4dCBmb3Igc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLgorCitPbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHRyYW5zbGF0aW5nIHRoZSBtZXNzYWdlcyB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSBhbGwKK25vbi10cmFuc2xhdGVkIHN0cmluZ3MgYXJlIGNvbW1lbnRlZCBvdXQuICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNvdXJjaW5nCitjbGVhbnVwLnZpbSBvbmNlIGFnYWluLgorCisKK0NIRUNLSU5HIFRIRSBUUkFOU0xBVElPTgorCitDaGVjayB0aGUgdHJhbnNsYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKwlubWFrZSAtZiBtYWtlX212Yy5tYWsgeHgubW8KKworQ29ycmVjdCBhbnkgc3ludGF4IGVycm9ycyByZXBvcnRlZC4gIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZXJyb3JzLCB0aGUKK3RyYW5zbGF0aW9uIGlzIHJlYWR5IHRvIGJlIGluc3RhbGxlZC4KKworCitJTlNUQUxMSU5HIFRIRSBUUkFOU0xBVElPTgorCitJbnN0YWxsIHlvdXIgdHJhbnNsYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKwlubWFrZSAtZiBtYWtlX212Yy5tYWsgaW5zdGFsbAorCitUaGlzIHdpbGwgY3JlYXRlIHRoZSB4eFxMQ19NRVNTQUdFUyBkaXJlY3RvcnkgaW4gcnVudGltZVxsYW5nIGlmIGl0IGRvZXMgbm90CithbHJlYWR5IGV4aXN0LgorCisKK3ZpbTp0dz03ODoKZGlmZiAtLWdpdCBhL3NyYy9wby9hZi5wbyBiL3NyYy9wby9hZi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODI4NDgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL2FmLnBvCkBAIC0wLDAgKzEsNjI0NCBAQAorIyBBZnJpa2FhbnMgdHJhbnNsYXRpb24gZm9yIFZpbQorIyBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyMgRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisjIERhbmllIFJvdXggPGRyb3V4QHR1a3MuY28uemE+LCAyMDAxCisjIEVkaXRlZDogSmVhbiBKb3JkYWFuIChuamopIDxqZWFuQHVwZnJvbnRzeXN0ZW1zLmNvLnphPiwgMTAvMDEvMjAwMQorIyBFZGl0ZWQgYnkgRGFuaWUgb24gMTAvMzEvMjAwMQorIworIyBuamo6IFNhdmUgPT0gU3Rvb3IuIFdyaXRlID09IFNrcnlmLgorIyBuamo6ICJkZWxldGVkIiA9PSAiZ2Vza3JhcCI7ICJyZW1vdmUiID09ICJ2ZXJ3eWRlciIKKyMgbmpqOiAic291cmNlIiA9PSAidWl0dm9lciIsIHdhbnQgInNvdXJjZWQiIGzqZXJzIHdvcmQgdWl0Z2V2b2VyCisjIG5qajogImFib3J0IiA9PSAic3RhYWsiCisjIGNsb3NlID09IHNsdWl0CisjIE9uc2VrZXI6CisjIFggRGlzcGxheSAtIHZlcnRvb25za2VybT8gKG5qajogZWsgZGluayBkaXMgcmVnLikKKyMgb3BlbiB2aW0gaW4gYW5vdGhlciBHVEsgV2lkZ2V0IC0gaGV0IHZlcnRhYWwgYXMgZWxlbWVudCAobmpqOiBPSywgbWFhcgorIyAnbiBlbGVtZW50IGlzIGFsZ2VtZW5lciBhcyAnbiB3aWRnZXQ6IG1lbnMga3J5IGJ5dm9vcmJlZWxkIEhUTUwKKyMgZW4gWE1MIGVsZW1lbnRlLiBNYWFyIGVrIGthbiBuaWUgbm91IGFhbiAnbiBzcGVzaWZpZWtlciB3b29yZCBkaW5rCisjIG5pZS4pCisjIFByaW50aW5nIGFib3J0ZWQgLSBkcnVra2VyeSBnZXN0YWFrPyAobmpqOiBlayBkaW5rIGRpcyByZWcuKQorCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0gNi4wXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDEtMTAtMzEgMTI6NDMrMDIwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IFdlZCBPY3QgMzEgMTM6NDEgU0FTVCAyMDAxXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBEYW5pZSBSb3V4IDxkcm91eEB0dWtzLmNvLnphPlxuIgorIkxhbmd1YWdlLVRlYW06IERhbmllIFJvdXggPGRyb3V4QHR1a3MuY28uemE+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPXzg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDgtYml0XG4iCisKKyM6IGJ1ZmZlci5jOjk3Cittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiBLYW4gbmllIGJ1ZmZlciB0b2VrZW4gbmllLCBwcm9ncmFtIHNsdWl0Li4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBLYW4gbmllIGJ1ZmZlciB0b2VrZW4gbmllLCBnYWFuIGFuZGVyIGVlbiBnZWJydWlrLi4uIgorCisjOiBidWZmZXIuYzo2OTgKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkdlZW4gYnVmZmVycyBpcyB1aXRnZWxhYWkgbmllIgorCisjOiBidWZmZXIuYzo3MDAKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiR2VlbiBidWZmZXJzIGlzIGdlc2tyYXAgbmllIgorCisjOiBidWZmZXIuYzo3MDIKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJHZWVuIGJ1ZmZlcnMgaXMgZ2Vza3JhcCBuaWUiCisKKyM6IGJ1ZmZlci5jOjcxMAorbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICIxIGJ1ZmZlciB1aXRnZWxhYWkiCisKKyM6IGJ1ZmZlci5jOjcxMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICIlZCBidWZmZXJzIHVpdGdlbGFhaSIKKworIzogYnVmZmVyLmM6NzE3Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSBidWZmZXIgZ2Vza3JhcCIKKworIzogYnVmZmVyLmM6NzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAiJWQgYnVmZmVycyBnZXNrcmFwIgorCisjOiBidWZmZXIuYzo3MjQKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIjEgYnVmZmVyIGdlc2tyYXAiCisKKyM6IGJ1ZmZlci5jOjcyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiJWQgYnVmZmVycyBnZXNrcmFwIgorCisjOiBidWZmZXIuYzo3ODMKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiBHZWVuIHZlcmFuZGVyZGUgYnVmZmVyIGdldmluZCBuaWUiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo4MjIKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogRGFhciBpcyBnZWVuIGdlbHlzdGUgYnVmZmVyIG5pZSIKKworIzogYnVmZmVyLmM6ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQ2Fubm90IGdvIHRvIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU4NjogS2FuIG5pZSBuYSBidWZmZXIgJWxkIGdhYW4gbmllIgorCisjOiBidWZmZXIuYzo4MzcKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogS2FuIG5pZSB2ZXJieSBsYWFzdGUgYnVmZmVyIGdhYW4gbmllIgorCisjOiBidWZmZXIuYzo4MzkKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IEthbiBuaWUgdvPzciBlZXJzdGUgYnVmZmVyIGdhYW4gbmllIgorCisjOiBidWZmZXIuYzo4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTg5OiBCdWZmZXIgJWxkIG5vZyBvbmdlc3Rvb3Igc2VkZXJ0IHZvcmlnZSB3eXNpZ2luZyAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogYnVmZmVyLmM6ODc5Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IEthbiBuaWUgbGFhc3RlIGJ1ZmZlciB1aXRsYWFpIG5pZSIKKworIzogYnVmZmVyLmM6MTMxNAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IFdhYXJza3V3aW5nOiBM6mVybHlzIGxvb3Agb29yIgorCisjOiBidWZmZXIuYzoxNDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5MjogYnVmZmVyICVsZCBrb24gbmllIGdldmluZCB3b3JkIG5pZSIKKworIzogYnVmZmVyLmM6MTcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IE1lZXIgYXMgZWVuIHRyZWZmZXIgdmlyICVzIgorCisjOiBidWZmZXIuYzoxNzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NDogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvciAlcyIKK21zZ3N0ciAiRTk0OiBHZWVuIGJ1ZmZlciB3YXQgYnkgJXMgcGFzIG5pZSIKKworIzogYnVmZmVyLmM6MjEwNSBleF9kb2NtZC5jOjYwNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgInJl62wgJWxkIgorCisjOiBidWZmZXIuYzoyMTg4Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogQnVmZmVyIG1ldCBoaWVyZGllIG5hYW0gYmVzdGFhbiBhbHJlZWRzIgorCisjOiBidWZmZXIuYzoyNDgxCittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbR2V3eXNpZ10iCisKKyM6IGJ1ZmZlci5jOjI0ODYKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIltPbmdld3lzaWddIgorCisjOiBidWZmZXIuYzoyNDkxCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW051d2UgbOplcl0iCisKKyM6IGJ1ZmZlci5jOjI0OTIKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbTGVlc2ZvdXRlXSIKKworIzogYnVmZmVyLmM6MjQ5NCBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW2xlZXMgYWxsZWVuXSIKKworIzogYnVmZmVyLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIjEgcmXrbCAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCByZetscyAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAicmXrbCAlbGQgdmFuICVsZCAtLSVkJSUtLSBrb2xvbSAiCisKKyM6IGJ1ZmZlci5jOjI2MDYKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIltHZWVuIGzqZXJdIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI2NDYKK21zZ2lkICJoZWxwIgorbXNnc3RyICJoZWxwIgorCisjOiBidWZmZXIuYzozMTUxIHNjcmVlbi5jOjQ2NzEKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIltoZWxwXSIKKworIzogYnVmZmVyLmM6MzE4MyBzY3JlZW4uYzo0Njc3Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbVm9vcnNrb3VdIgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQWxsIgorbXNnc3RyICJBbGxlcyIKKworIzogYnVmZmVyLmM6MzM4OQorbXNnaWQgIkJvdCIKK21zZ3N0ciAiT25kIgorCisjOiBidWZmZXIuYzozMzkxCittc2dpZCAiVG9wIgorbXNnc3RyICJCbyIKKworIzogYnVmZmVyLmM6NDEyNworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBCdWZmZXIgbHlzOlxuIgorCisjOiBidWZmZXIuYzo0MTYwCittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbRm91dGx5c10iCisKKyM6IGJ1ZmZlci5jOjQxNzMgbWVtbGluZS5jOjE1MTMKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIltHZWVuIGzqZXJdIgorCisjOiBidWZmZXIuYzo0MzkzCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVGVrZW5zIC0tLSIKKworIzogYnVmZmVyLmM6NDQwMworIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICJUZWtlbnMgdmlyICVzOiIKKworIzogYnVmZmVyLmM6NDQwOQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgcmXrbD0lbGQgIGlkPSVkICBuYWFtPSVzIgorCisjOiBkaWZmLmM6MTMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NjogQ2FuIG5vdCBkaWZmIG1vcmUgdGhhbiAlbGQgYnVmZmVycyIKK21zZ3N0ciAiRTk2OiBLYW4gbmllIG1lZXIgYXMgJWxkIGJ1ZmZlcnMgJ2RpZmYnIG5pZSIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBLYW4gbmllICdkaWZmcycgc2tlcCBuaWUgIgorCisjOiBkaWZmLmM6NzQ3Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiTGFzbGFwIGzqZXIiCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IEthbiBuaWUgJ2RpZmYnIGFmdm9lciBsZWVzIG5pZSIKKworIzogZGlmZi5jOjE3MDQKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogSHVpZGlnZSBidWZmZXIgaXMgbmllIGluICdkaWZmJyBtb2R1cyBuaWUiCisKKyM6IGRpZmYuYzoxNzE2Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogR2VlbiBhbmRlciBidWZmZXIgaW4gJ2RpZmYnIG1vZHVzIG5pZSIKKworIzogZGlmZi5jOjE3MjQKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIiIKKyJFMTAxOiBNZWVyIGFzIHR3ZWUgYnVmZmVycyBpbiAnZGlmZicgbW9kdXMsIHdlZXQgbmllIHdhdHRlciBlZW4gb20gdGUgIgorImdlYnJ1aWsgbmllIgorCisjOiBkaWZmLmM6MTc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IEthbiBidWZmZXIgJXMgbmllIHZpbmQgbmllIgorCisjOiBkaWZmLmM6MTc1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbmllIGluICdkaWZmJyBtb2R1cyBuaWUiCisKKyM6IGRpZ3JhcGguYzoyMTY4Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6ICdFc2NhcGUnIG5pZSB0b2VnZWxhYXQgaW4gZGlncmFhZiBuaWUiCisKKyM6IGRpZ3JhcGguYzoyMzQwCittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJTbGV1dGVsYmluZGluZ2zqZXIgbmllIGdldmluZCBuaWUiCisKKyM6IGRpZ3JhcGguYzoyMzY3Cittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiA6bG9hZGtleW1hcCB3b3JkIGJ1aXRlICduIHVpdHZvZXJs6mVyIGdlYnJ1aWsiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIFNsZXV0ZWx3b29yZCB2b2x0b29paW5nICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIG1vZHVzICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eTi9eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBTbGV1dGVsd29vcmQgTG9rYWxlIHZvbHRvb2lpbmcgKF5OL15QKSIKKworIzogZWRpdC5jOjQ1Cittc2dpZCAiIFdob2xlIGxpbmUgY29tcGxldGlvbiAoXkwvXk4vXlApIgorbXNnc3RyICIgSGVsZS1yZetsIHZvbHRvb2lpbmcgKF5ML15OL15QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRi9eTi9eUCkiCittc2dzdHIgIiBM6mVybmFhbSB2b2x0b29paW5nICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgRXRpa2V0dm9sdG9vaWluZyAoXl0vXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIEdpZHNwYXRyb29uIHZvbHRvb2lpbmcgKF5OL15QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkQvXk4vXlApIgorbXNnc3RyICIgRGVmaW5pc2lldm9sdG9vaWluZyAoXkQvXk4vXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheSy9eTi9eUCkiCittc2dzdHIgIiBXb29yZGVib2Vrdm9sdG9vaWluZyAoXksvXk4vXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIFRlc291cnVzdm9sdG9vaWluZyAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIEJldmVscmXrbHZvbHRvb2lpbmcgKF5WL15OL15QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIkhldCBlaW5kZSB2YW4gcGFyYWdyYWFmIGdldHJlZiIKKworIzogZWRpdC5jOjg5NAorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ3RoZXNhdXJ1cycgb3BzaWUgaXMgbGVlZyIKKworIzogZWRpdC5jOjEwNzAKK21zZ2lkICInZGljdGlvbmFyeScgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICInZGljdGlvbmFyeScgb3BzaWUgaXMgbGVlZyIKKworIzogZWRpdC5jOjE5OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIkRldXJzb2VrIHdvb3JkZWJvZWs6ICVzIgorCisjOiBlZGl0LmM6MjE4MworbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnZvZWcpIFJvbCAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjE4NQorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAodmVydmFuZykgUm9sICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiU29layB2aXI6ICVzIgorCisjOiBlZGl0LmM6MjUzMQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJEZXVyc29layBldGlrZXR0ZS4iCisKKyM6IGVkaXQuYzozMTg5Cittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiIFdvcmQgYnlnZXZvZWciCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzIzOAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gU29la2VuZC4uLiIKKworIzogZWRpdC5jOjMyOTQKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICJUZXJ1ZyBieSBvb3JzcHJvbmtsaWtlIgorCisjOiBlZGl0LmM6MzI5OQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICJXb29yZCB2YW4gYW5kZXIgcmXrbCIKKworIzogZWRpdC5jOjMzMDQKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiRGllIGVuaWdzdGUgdHJlZmZlciIKKworIzogZWRpdC5jOjMzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgInRyZWZmZXIgJWQgdmFuICVkIgorCisjOiBlZGl0LmM6MzM2NgorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAidHJlZmZlciAlZCIKKworIzogZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IE9uYmVrZW5kZSB2ZXJhbmRlcmxpa2U6IFwiJXNcIiIKKworIzogZXZhbC5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IE9udGJyZWtlbmRlIGhha2llczogJXMiCisKKyM6IGV2YWwuYzoxMDQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogR2VlbiB2ZXJhbmRlcmxpa2U6IFwiJXNcIiIKKworIzogZXZhbC5jOjEyODQKK21zZ2lkICJFMTA5OiBNaXNzaW5nICc6JyBhZnRlciAnPyciCittc2dzdHIgIkUxMDk6IE9udGJyZWtlbmRlICc6JyBuYSAnPyciCisKKyM6IGV2YWwuYzoxODk4Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IE9udGJyZWtlbmRlICcpJyIKKworIzogZXZhbC5jOjE5NDgKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogT250YnJla2VuZGUgJ10nIgorCisjOiBldmFsLmM6MjAyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjogT3BzaWVuYWFtIG9udGJyZWVrOiAlcyIKKworIzogZXZhbC5jOjIwNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBPbmJla2VuZGUgb3BzaWU6ICVzIgorCisjOiBldmFsLmM6MjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogT250YnJla2VuZGUgYWFuaGFsaW5nc3Rla2VuOiAlcyIKKworIzogZXZhbC5jOjIyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IE9udGJyZWtlbmRlIGFhbmhhbGluZ3N0ZWtlbjogJXMiCisKKyM6IGV2YWwuYzoyNTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjogT25nZWxkaWdlIHBhcmFtZXRlcnMgdmlyIGZ1bmtzaWUgJXMiCisKKyM6IGV2YWwuYzoyNTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBPbmJla2VuZGUgZnVua3NpZTogJXMiCisKKyM6IGV2YWwuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBUZSB2ZWVsIHBhcmFtZXRlcnMgdmlyIGZ1bmtzaWU6ICVzIgorCisjOiBldmFsLmM6MjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiBUZSBtaW4gcGFyYW1ldGVycyB2aXIgZnVua3NpZTogJXMiCisKKyM6IGV2YWwuYzoyNTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4gd29yZCBidWl0ZSBza3JpcGtvbnRla3MgZ2VicnVpazogJXMiCisKKyM6IGV2YWwuYzozNTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIHJl62xzOiAiCisKKyM6IGV2YWwuYzo0NjkwCittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT0tcbiIKKyImS2Fuc2VsbGVlciIKKworIzogZXZhbC5jOjU1MTMKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IEdlZW4gdmVyYmluZGluZyBtZXQgVmltIGJlZGllbmVyIgorCisjOiBldmFsLmM6NTYwMworbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiBLb24gYmVkaWVuZXItdGVydWd2b2VyIG5pZSBsZWVzIG5pZSIKKworIzogZXZhbC5jOjU2MjgKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IEthbiBuaWUgbmEga2xp6250IHN0dXVyIG5pZSIKKworIzogZXZhbC5jOjU2NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IEthbiBuaWUgbmEgJXMgc3R1dXIgbmllIgorCisjOiBldmFsLmM6NTc2NworbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKE9uZ2VsZGlnKSIKKworIzogZXZhbC5jOjY3NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogT25nZWRlZmluaWVlcmRlIHZlcmFuZGVybGlrZTogJXMiCisKKyM6IGV2YWwuYzo3NDY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTIyOiBGdW5rc2llICVzIGJlc3RhYW4gYWxyZWVkcywgZ2VicnVpayAhIG9tIHRlIHZlcnZhbmciCisKKyM6IGV2YWwuYzo3NTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IE9uZ2VkZWZpbmllZXJkZSBmdW5rc2llOiAlcyIKKworIzogZXZhbC5jOjc1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiBPbnRicmVrZW5kZSAnKCc6ICVzIgorCisjOiBldmFsLmM6NzU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI1OiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTEyNTogT25nZWxkaWdlIHBhcmFtZXRlcjogJXMiCisKKyM6IGV2YWwuYzo3NjQxCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IE9udGJyZWtlbmRlICc6ZW5kZnVuY3Rpb24nIgorCisjOiBldmFsLmM6NzcyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzogS2FuIGZ1bmtzaWUgJXMgbmllIGhlcmRlZmluaWVlciBuaWU6IERpdCBpcyBpbiBnZWJydWlrIgorCisjOiBldmFsLmM6Nzc3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBGdW5rc2llbmFhbSBtb2V0IG1ldCAnbiBob29mbGV0dGVyIGJlZ2luOiAlcyIKKworIzogZXZhbC5jOjc3ODMKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiBGdW5rc2llbmFhbSB2ZXJlaXMiCisKKyM6IGV2YWwuYzo3ODc2Cittc2dpZCAiZnVuY3Rpb24gIgorbXNnc3RyICJmdW5rc2llICIKKworIzogZXZhbC5jOjc5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogT25nZWRlZmluaWVlcmRlIGZ1bmtzaWU6ICVzIgorCisjOiBldmFsLmM6Nzk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IEthbiBmdW5rc2llICVzIG5pZSB2ZXJ3eWRlciBuaWU6IERpdCBpcyBpbiBnZWJydWlrIgorCisjOiBldmFsLmM6ODA0MworbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IEZ1bmtzaWVyb2VwZGllcHRlIGlzIGdyb3RlciBhcyAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJyb2VwICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MTE5IGV4X2NtZHMyLmM6MTk3MworIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJ2ZXJ2b2xnIGluICVzIgorCisjOiBldmFsLmM6ODE3MworbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiAnOnJldHVybicgYnVpdGUgZnVua3NpZSIKKworIzogZXZhbC5jOjgyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIGxld2VyICMlbGQgb3AiCisKKyM6IGV2YWwuYzo4MjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIGxld2VyIFwiJXNcIiBvcCIKKworIzogZXZhbC5jOjgzOTUKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBnbG9iYWxlIHZlcmFuZGVybGlrZXM6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2t0YWFsICUwM28iCisKKyM6IGV4X2NtZHMuYzo0MjgKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogU2t1aWYgcmXrbHMgaW4gaHVsc2VsZiBpbiIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSByZetsIGdlc2t1aWYiCisKKyM6IGV4X2NtZHMuYzo0OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICIlbGQgcmXrbHMgZ2Vza3VpZiIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCByZetscyBmaWx0cmVlciIKKworIzogZXhfY21kcy5jOjkxOAorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0ZXIqIE91dG9iZXZlbGUgbWFnIG5pZSBkaWUgaHVpZGlnZSBidWZmZXIgdmVyYW5kZXIgbmllIgorCisjOiBleF9jbWRzLmM6MTAwMworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW09uZ2VzdG9vciBzZWRlcnQgdm9yaWdlIHZlcmFuZGVyaW5nXVxuIgorCisjOiBleF9jbWRzLmM6MTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgInZpbWluZm86ICVzIGluIHJl62w6ICIKKworIzogZXhfY21kcy5jOjEyNTMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogVGUgdmVlbCBmb3V0ZSwgc2xhYW4gZGllIHJlcyB2YW4gZGllIGzqZXIgb29yIgorCisjOiBleF9jbWRzLmM6MTI4MgorIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgIkJlc2lnIG9tIHZpbWluZm8gbOplciBcIiVzXCIlcyVzJXMgdGUgbGVlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIGlubGlndGluZyIKKworIzogZXhfY21kcy5jOjEyODQKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIiBtZXJrZXJzIgorCisjOiBleF9jbWRzLmM6MTI4NQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBHRUZBQUwiCisKKyM6IGV4X2NtZHMuYzoxMzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBWaW1pbmZvIGzqZXIgaXMgbmllIHNrcnlmYmFhciBuaWU6ICVzIgorCisjOiBleF9jbWRzLmM6MTUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiBLYW4gbmllIHZpbWluZm8gbOplciAlcyBzdG9vciBuaWUhIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIkJlc2lnIG9tIHZpbWluZm8gbOplciBcIiVzXCIgdGUgc3Rvb3IiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBIaWVyZGllIHZpbWluZm8gbOplciBpcyBnZWdlbmVyZWVyIGRldXIgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgSnkgbWFnIGRpdCB3eXNpZyBhcyBqeSB2ZXJzaWd0aWcgaXMhXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjE0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgV2FhcmRlIHZhbiAnZW5jb2RpbmcnIHRvZSBoaWVyZGllIGzqZXIgZ2VzdG9vciBpc1xuIgorCisjOiBleF9jbWRzLmM6MTcxMworbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiT25nZWxkaWdlIGJlZ2lua2FyYWt0ZXIiCisKKyM6IGV4X2NtZHMuYzoyMDUzIGV4X2NtZHMuYzoyMjg5IGV4X2NtZHMyLmM6NjAyCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAiU3Rvb3IgQXMiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjA5NgorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiBM6mVyIGlzIGdlbGFhaSBpbiBhbmRlciBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoyMTMwCittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiU2tyeWYgZ2VkZWVsdGVsaWtlIGzqZXI/IgorCisjOiBleF9jbWRzLmM6MjEzNworbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBHZWJydWlrICEgb20gZ2VkZWVsdGVsaWtlIGJ1ZmZlciB0ZSBza3J5ZiIKKworIzogZXhfY21kcy5jOjIyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICJPb3Jza3J5ZiBiZXN0YWFuZGUgbOplciBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogR2VlbiBs6mVybmFhbSB2aXIgYnVmZmVyICVsZCBuaWUiCisKKyM6IGV4X2NtZHMuYzoyMzMyCittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogTOplciBuaWUgZ2VzdG9vciBuaWU6IFN0b29yIGlzIGFmZ2Vza2FrZWwgZGV1ciBkaWUgJ3dyaXRlJyBvcHNpZSIKKworIzogZXhfY21kcy5jOjIzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIidyZWFkb25seScgb3BzaWUgaXMgYWFuIHZpciBcIiUuKnNcIi5cbiIKKyJXaWwgankgZGl0IGZvcnNlZXI/IgorCisjOiBleF9jbWRzLmM6MjUxNworbXNnaWQgIkVkaXQgRmlsZSIKK21zZ3N0ciAiVmVyYW5kZXIgbOplciIKKworIzogZXhfY21kcy5jOjMwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IE91dG9iZXZlbGUgaGV0IG51d2UgYnVmZmVyICVzIG9udmVyd2FncyBnZXNrcmFwIgorCisjOiBleF9jbWRzLmM6MzE1NgorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiBuaWUtbnVtZXJpZXNlIHBhcmFtZXRlciB2aXIgOnoiCisKKyM6IGV4X2NtZHMuYzozMjQxCittc2dpZCAiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIKK21zZ3N0ciAiRTE0NTogRG9wIGJldmVsZSBuaWUgdG9lZ2VsYWF0IGluIHJ2aW0iCisKKyM6IGV4X2NtZHMuYzozMzQ4Cittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0NjogUGF0cm9uZSBrYW4gbmllIGRldXIgbGV0dGVycyBhZmdlYmFrZW4gd29yZCBuaWUiCisKKyM6IGV4X2NtZHMuYzozNjg2CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgInZlcnZhbmcgbWV0ICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQwNTAKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKE9uZGVyYnJlZWspICIKKworIzogZXhfY21kcy5jOjQwNTQKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSB2ZXJ2YW5naW5nIgorCisjOiBleF9jbWRzLmM6NDA1NgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAiJWxkIHZlcnZhbmdpbmdzIgorCisjOiBleF9jbWRzLmM6NDA1OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBvcCAxIHJl62wiCisKKyM6IGV4X2NtZHMuYzo0MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiBvcCAlbGQgcmXrbHMiCisKKyM6IGV4X2NtZHMuYzo0MTEyCittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiBLYW4gbmllIDpnbG9iYWwgcmVrdXJzaWVmIGRvZW4gbmllICIKKworIzogZXhfY21kcy5jOjQxNDcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogUGF0cm9vbiBvbnRicmVlayB1aXQgZ2xvYmFhbCIKKworIzogZXhfY21kcy5jOjQxOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiUGF0cm9vbiBnZXZpbmQgaW4gZWxrZSByZetsOiAlcyIKKworIzogZXhfY21kcy5jOjQyNzcKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIFZvcmlnZSBWZXJ2YW5nc3RyaW5nOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0Mzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogSmFtbWVyLCBnZWVuIGh1bHAgdmlyICVzIG5pZSIKKworIzogZXhfY21kcy5jOjQ0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICJKYW1tZXIsIGh1bHBs6mVyIFwiJXNcIiBrYW4gbmllIGdldmluZCB3b3JkIG5pZSIKKworIzogZXhfY21kcy5jOjQ4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogTmllICduIGdpZHMgbmllOiAlcyIKKworIzogZXhfY21kcy5jOjQ4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IEthbiBuaWUgJXMgb29wbWFhayBvbSB0ZSBza3J5ZiBuaWUiCisKKyM6IGV4X2NtZHMuYzo0ODk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiBLYW4gbmllICVzIG9vcCBtYWFrIG9tIHRlIGxlZXMgbmllIgorCisjOiBleF9jbWRzLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiBEdXBsaWthYXQgZXRpa2V0IFwiJXNcIiBpbiBs6mVyICVzIgorCisjOiBleF9jbWRzLmM6NTA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IE9uYmVrZW5kZSBmdW5rc2llOiAlcyIKKworIzogZXhfY21kcy5jOjUwOTgKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1NjogT250YnJla2VuZGUgdGVrZW5uYWFtIgorCisjOiBleF9jbWRzLmM6NTE0NAorbXNnaWQgIkUyNTU6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU3NzogVGUgdmVlbCB0ZWtlbnMgZ2VkZWZpbmllZXIiCisKKyM6IGV4X2NtZHMuYzo1MTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzk6IEludmFsaWQgc2lnbiB0ZXh0OiAlcyIKK21zZ3N0ciAiRTIzOTogT25nZWxkaWdlIHRla2VudGVrczogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjEwIGV4X2NtZHMuYzo1Mzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IE9uYmVrZW5kZSBvcHNpZTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjU2Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogT250YnJla2VuZGUgdGVrZW5ub21tZXIiCisKKyM6IGV4X2NtZHMuYzo1MzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiBPbmdlbGRpZ2UgYnVmZmVybmFhbTogJXMiCisKKyM6IGV4X2NtZHMuYzo1Mzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiBPbmdlbGRpZ2UgdGVrZW4gSUQ6ICVsZCIKKworIzogZXhfY21kcy5jOjU1NDYKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltHZXNrcmFwXSIKKworIzogZXhfY21kczIuYzo3MAorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGxlYXZlLiIKK21zZ3N0ciAiT250Zm91dG1vZHVzIGJlZ2luIG5vdS4gIFRpayBcImNvbnRcIiBvbSB0ZSB2ZXJsYWF0LiIKKworIzogZXhfY21kczIuYzo3NCBleF9kb2NtZC5jOjc3MQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgInJl62wgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJjbWQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJJbnNwZWtzaWVwdW50IGluIFwiJXMlc1wiIHJl62wgJWxkIgorCisjOiBleF9jbWRzMi5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IEluc3Bla3NpZXB1bnQga29uIG5pZSBnZXZpbmQgd29yZCBuaWU6ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIkdlZW4gaW5zcGVrc2llcHVudGUgZ2VkZWZpbmllZXIgbmllIgorCisjOiBleF9jbWRzMi5jOjQxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgcmXrbCAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgIlN0b29yIHZlcmFuZGVyaW5nZSBuYSBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6NjI3IGV4X2RvY21kLmM6ODYxMgorbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICJPbmdldGl0ZWxkIgorCisjOiBleF9jbWRzMi5jOjc2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2MjogQnVmZmVyIFwiJXNcIiBpcyBuaWUgZ2Vza3J5ZiBzZWRlcnQgdm9yaWdlIHd5c2lnaW5nIG5pZSIKKworIzogZXhfY21kczIuYzo4MzIKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgIldhYXJza3V3aW5nOiBBbmRlciBidWZmZXIgb252ZXJ3YWdzIGJldHJlZSAoa3lrIG5hIG91dG9iZXZlbGUpIgorCisjOiBleF9jbWRzMi5jOjEyMDgKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IERhYXIgaXMgbmV0IGVlbiBs6mVyIG9tIHRlIGJld2VyayIKKworIzogZXhfY21kczIuYzoxMjEwCittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBLYW4gbmllIHbz83IgZGllIGVlcnN0ZSBs6mVyIGdhYW4gbmllIgorCisjOiBleF9jbWRzMi5jOjEyMTIKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogS2FuIG5pZSB2ZXJieSBkaWUgbGFhc3RlIGzqZXIgZ2FhbiBuaWUiCisKKyM6IGV4X2NtZHMyLmM6MTYzMgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIkJlc2lnIG9tIHRlIHNvZWsgdmlyIFwiJXNcIiBpbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiQmVzaWcgb20gdGUgc29layB2aXIgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE2NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAia29uIG5pZSBpbiAncnVudGltZXBhdGgnIGdldmluZCB3b3JkIG5pZTogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE3MTIKK21zZ2lkICJSdW4gTWFjcm8iCittc2dzdHIgIlZvZXIgTWFrcm8gdWl0IgorCisjOiBleF9jbWRzMi5jOjE4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJLYW4gbmllIGdpZHMgdWl0dm9lciBuaWU6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJrb24gbmllIFwiJXNcIiB1aXR2b2VyIG5pZSIKKworIzogZXhfY21kczIuYzoxODQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAicmXrbCAlbGQ6IGtvbiBuaWUgXCIlc1wiIHVpdHZvZXIgbmllIgorCisjOiBleF9jbWRzMi5jOjE4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJiZXNpZyBvbSBcIiVzXCIgdWl0IHRlIHZvZXIiCisKKyM6IGV4X2NtZHMyLmM6MTg2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJyZetsICVsZDogdm9lciBub3UgXCIlc1wiIHVpdCIKKworIzogZXhfY21kczIuYzoxOTcxCisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICIlcyBrbGFhciB1aXRnZXZvZXIiCisKKyM6IGV4X2NtZHMyLmM6MjI3MgorbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6IFdhYXJza3V3aW5nOiBWZXJrZWVyZGUgcmXrbHNrZWlkaW5nLCBeTSBvbnRicmVlayBkYWxrIgorCisjOiBleF9jbWRzMi5jOjIzMjEKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiAnOnNjcmlwdGVuY29kaW5nJyBidWl0ZSAnbiB1aXR2b2VybOplciBnZWJydWlrIgorCisjOiBleF9jbWRzMi5jOjIzNTQKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogJzpmaW5pc2gnIGJ1aXRlICduIHVpdHZvZXJs6mVyIGdlYnJ1aWsiCisKKyM6IGV4X2NtZHMyLmM6MjgyMAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAiR2VlbiB0ZWtzIG9tIHRlIGRydWsgbmllIgorCisjOiBleF9jbWRzMi5jOjI4OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIkRydWsgbm91IGJsYWRzeSAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MjkwNworIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIEtvcGllICVkIHZhbiAlZCIKKworIzogZXhfY21kczIuYzoyOTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICJHZWRydWs6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5NjYKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICJEcnVra2VyeSBnZXN0YWFrIgorCisjOiBleF9jbWRzMi5jOjMzNDQKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEthbiBuaWUgbmEgJ1Bvc3RTY3JpcHQnIGFmdm9lcmzqZXIgc2tyeWYgbmllIgorCisjOiBleF9jbWRzMi5jOjQwMTkKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IEthbiBuaWUgJ1Bvc3RTY3JpcHQnIGFmdm9lcmzqZXIgb29wbWFhayBuaWUiCisKKyM6IGV4X2NtZHMyLmM6NDA1NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBLYW4gbmllIGzqZXIgJXMgb29wbWFhayBuaWUiCisKKyM6IGV4X2NtZHMyLmM6NDA2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IEthbiBuaWUgJ1Bvc3RTY3JpcHQnIGh1bHBicm9uLWzqZXIgXCIlc1wiIGxlZXMgbmllIgorCisjOiBleF9jbWRzMi5jOjQyNjYKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIkJlc2lnIG9tIHRlIHN0dXVyIG5hIGRydWtrZXIuLi4iCisKKyM6IGV4X2NtZHMyLmM6NDI3MAorbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IEtvbiBuaWUgJ1Bvc3RTY3JpcHQnIGzqZXIgZHJ1ayBuaWUiCisKKyM6IGV4X2NtZHMyLmM6NDI3MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiRHJ1a3RhYWsgZ2VzdHV1ci4iCisKKyM6IGV4X2NtZHMyLmM6NDY1MQorIywgYy1mb3JtYXQKK21zZ2lkICJDdXJyZW50ICVzbGFuZ3VhZ2U6IFwiJXNcIiIKK21zZ3N0ciAiSHVpZGlnZSAlc3RhYWw6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0NjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBLYW4gbmllIHRhYWwgbmEgXCIlc1wiIHZlcmFuZGVyIG5pZSIKKworIzogZXhfZG9jbWQuYzo0OTEKK21zZ2lkICJFbnRlcmluZyBFeCBtb2RlLiAgVHlwZSBcInZpc3VhbFwiIHRvIGdvIHRvIE5vcm1hbCBtb2RlLiIKK21zZ3N0ciAiQmV0cmVlIEV4IG1vZHVzLiAgVGlrIFwidmlzdWFsXCIgb20gbmEgTm9ybWFsZSBtb2R1cyB0ZXJ1ZyB0ZSBrZWVyLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTI3Cittc2dpZCAiQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkJ5IGzqZXJlaW5kZSIKKworIzogZXhfZG9jbWQuYzo2MDIKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IEJldmVsIHRlIHJla3Vyc2llZiIKKworIzogZXhfZG9jbWQuYzo5MTEKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogT250YnJla2VuZGUgJzplbmR3aGlsZSciCisKKyM6IGV4X2RvY21kLmM6OTEzCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IE9udGJyZWtlbmRlICc6ZW5kaWYnIgorCisjOiBleF9kb2NtZC5jOjkyMworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkVpbmRlIHZhbiB1aXR2b2VybOplciIKKworIzogZXhfZG9jbWQuYzo5MjQKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIkVpbmRlIHZhbiBmdW5rc2llICIKKworIzogZXhfZG9jbWQuYzoxMzQ0Cittc2dpZCAiQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRHViYmVsc2lubmlnZSBnZWJydWlrIHZhbiBnZWJydWlrZXItZ2VkZWZpbmllZXJkZSBiZXZlbCIKKworIzogZXhfZG9jbWQuYzoxMzU4Cittc2dpZCAiTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJOaWUgJ24gdmVyd2Vya2VyYmV2ZWwgbmllIgorCisjOiBleF9kb2NtZC5jOjE0NDEKK21zZ2lkICJEb24ndCBwYW5pYyEiCittc2dzdHIgIkJseSBrYWxtISIKKworIzogZXhfZG9jbWQuYzoxNDYwCittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuIgorbXNnc3RyICJUZXJ1Z3dhYXJkc2Ugb212YW5nIGdlZ2VlIgorCisjOiBleF9kb2NtZC5jOjE0NjkKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIlRlcnVnd2FhcmRzZSBvbXZhbmcgZ2VnZWUsIE9LIG9tIHRlIHJ1aWwiCisKKyM6IGV4X2RvY21kLmM6MTU4MAorbXNnaWQgIlVzZSB3IG9yIHc+PiIKK21zZ3N0ciAiR2VicnVpayB3IG9mIHc+PiIKKworIzogZXhfZG9jbWQuYzozMDg2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiBKYW1tZXIsIGRpZSBiZXZlbCBpcyBuaWUgZ2XvbXBsZW1lbnRlZXIgbmllIgorCisjOiBleF9kb2NtZC5jOjMyNTYKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogU2xlZ3MgZWVuIGzqZXJuYWFtIHRvZWdlbGFhdCIKKworIzogZXhfZG9jbWQuYzozODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiTm9nICVkIGzqZXJzIG9tIHRlIGJld2Vyay4gIFN0b3AgaW4gZWxrIGdldmFsPyIKKworIzogZXhfZG9jbWQuYzozODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IE5vZyAlbGQgbOplcnMgb20gdGUgYmV3ZXJrIgorCisjOiBleF9kb2NtZC5jOjM5MTEKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiB1c2UgISB0byByZWRlZmluZSIKK21zZ3N0ciAiRTE3NDogQmV2ZWwgYmVzdGFhbiBhbHJlZWRzOiBnZWJydWlrICEgb20gdGUgaGVyZGVmaW5pZWVyIgorCisjOiBleF9kb2NtZC5jOjQwMTYKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgTmFhbSAgICAgICAgQXJncyBSZWVrcyBLbGFhciAgICAgRGVmaW5pc2llIgorCisjOiBleF9kb2NtZC5jOjQxMDUKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIkdlZW4gZ2VicnVpa2VyLWdlZGVmaW5pZWVyZGUgYmV2ZWxlIGdldmluZCBuaWUiCisKKyM6IGV4X2RvY21kLmM6NDEzNgorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IEdlZW4gZWllbnNrYXBwZSBnZXNwZXNpZmlzZWVyIG5pZSIKKworIzogZXhfZG9jbWQuYzo0MTg4Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiBPbmdlbGRpZ2UgYWFudGFsIHBhcmFtZXRlcnMiCisKKyM6IGV4X2RvY21kLmM6NDIwMworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IFRlbGxpbmcga2FuIG5pZSB0d2VlIGtlZXIgZ2VzcGVzaWZpc2VlciB3b3JkIG5pZSIKKworIzogZXhfZG9jbWQuYzo0MjEzCittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogT25nZWxkaWdlIHZlcnN0ZWt3YWFyZGUgdmlyIHRlbGxpbmciCisKKyM6IGV4X2RvY21kLmM6NDI0MQorbXNnaWQgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcmVkIGZvciBjb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogcGFyYW1ldGVyIG5vZGlnIHZpciB2b2x0b29paW5nIgorCisjOiBleF9kb2NtZC5jOjQyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IE9uZ2VsZGlnZSB2b2x0b29paW5nc3dhYXJkZTogJXMiCisKKyM6IGV4X2RvY21kLmM6NDI2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IE9uZ2VsZGlnZSBlaWVuc2thcDogJXMiCisKKyM6IGV4X2RvY21kLmM6NDMwOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBPbmdlbGRpZ2UgYmV2ZWxuYWFtIgorCisjOiBleF9kb2NtZC5jOjQzMjQKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIkUxODM6IEdlYnJ1aWtlci1nZWRlZmluaWVlcmRlIGJldmVsZSBtb2V0IG1ldCAnbiBob29mbGV0dGVyIGJlZ2luIgorCisjOiBleF9kb2NtZC5jOjQzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IEdlZW4gZ2VicnVpa2VyLWdlZGVmaW5pZWVyZGUgYmV2ZWwgbmllOiAlcyIKKworIzogZXhfZG9jbWQuYzo0ODQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogS2FuIG5pZSBrbGV1cnNrZW1hICVzIHZpbmQgbmllIgorCisjOiBleF9kb2NtZC5jOjQ4NTIKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAiR29laWVkYWcsIFZpbSBnZWJydWlrZXIhIgorCisjOiBleF9kb2NtZC5jOjU1NDkKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiQmV3ZXJrIGzqZXIgaW4gbnV3ZSB2ZW5zdGVyIgorCisjOiBleF9kb2NtZC5jOjU4MTUKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIkdlZW4gcnVpbGzqZXIiCisKKyM6IGV4X2RvY21kLmM6NTkxOQorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJMYXMgYWFuIGJ5IGzqZXIiCisKKyM6IGV4X2RvY21kLmM6NTk3OAorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4NjogR2VlbiB2b3JpZ2UgZ2lkcyBuaWUiCisKKyM6IGV4X2RvY21kLmM6NjA1NQorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IE9uYmVrZW5kIgorCisjOiBleF9kb2NtZC5jOjYxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICJWZW5zdGVycG9zaXNpZTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo2MTc4Cittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiBWZXJrcnlnaW5nIHZhbiB2ZW5zdGVycG9zaXNpZSBpcyBuaWUgdmlyIGhpZXJkaWUgcGxhdGZvcm0gIgorImdl721wbGVtZW50ZWVyIG5pZSIKKworIzogZXhfZG9jbWQuYzo2NDQ0Cittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAiU3Rvb3IgSGVydmVyc3R1cmluZyIKKworIzogZXhfZG9jbWQuYzo2NTkzCittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICJTdG9vciBPb3JzaWciCisKKyM6IGV4X2RvY21kLmM6NjU5NAorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiU3Rvb3IgU2Vzc2llIgorCisjOiBleF9kb2NtZC5jOjY1OTYKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJTdG9vciBrb25maWd1cmFzaWUiCisKKyM6IGV4X2RvY21kLmM6Njc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiBiZXN0YWFuIChnZWJydWlrICEgb20gdGUgZHdpbmcpIgorCisjOiBleF9kb2NtZC5jOjY3NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiBLYW4gXCIlc1wiIG5pZSBvb3BtYWFrIHZpciBza3J5ZiBuaWUiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY3NzQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIiIKKyJFMTkxOiBQYXJhbWV0ZXIgbW9ldCAnbiBsZXR0ZXIgb2YgJ24gdGVydWcvdm9yZW50b2UgYWFuaGFsaW5nc3Rla2VuIHdlZXMiCisKKyM6IGV4X2RvY21kLmM6NjgwMworbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogUmVrdXJzaWV3ZSBnZWJydWlrIHZhbiAnOm5vcm1hbCcgdGUgZGllcCIKKworIzogZXhfZG9jbWQuYzo3MTcxCittc2dpZCAiOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgImdlbmVzdGUgJzppZicgdGUgZGllcCIKKworIzogZXhfZG9jbWQuYzo3MjA2Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICInOmVuZGlmJyBzb25kZXIgJzppZiciCisKKyM6IGV4X2RvY21kLmM6NzIyNgorbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICInOmVsc2UnIHNvbmRlciAnOmlmJyIKKworIzogZXhfZG9jbWQuYzo3MjI4Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiJzplbHNlaWYnIHNvbmRlciAnOmlmJyIKKworIzogZXhfZG9jbWQuYzo3MjgwCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIic6d2hpbGUnIHRlIGRpZXAgZ2VuZXMiCisKKyM6IGV4X2RvY21kLmM6NzMyNgorbXNnaWQgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiJzpjb250aW51ZScgc29uZGVyICc6d2hpbGUnIgorCisjOiBleF9kb2NtZC5jOjczNTMKK21zZ2lkICI6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIic6YnJlYWsnIHNvbmRlciAnOndoaWxlJyIKKworIzogZXhfZG9jbWQuYzo3Mzc2IGV4X2RvY21kLmM6NzM4MQorbXNnaWQgIjplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiJzplbmR3aGlsZScgc29uZGVyICc6d2hpbGUnIgorCisjOiBleF9kb2NtZC5jOjc0MDIKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiAnOmVuZGZ1bmN0aW9uJyBuaWUgaW4gJ24gZnVua3NpZSBuaWUiCisKKyM6IGV4X2RvY21kLmM6NzU4MgorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiBHZWVuIGFsdGVybmF0aWV3ZSBs6mVybmFhbSB2aXIgJyMnIG5pZSIKKworIzogZXhfZG9jbWQuYzo3NjEzCittc2dpZCAibm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJnZWVuIG91dG9iZXZlbC1s6mVybmFhbSBvbSBcIjxhZmlsZT5cIiBtZWUgdGUgdmVydmFuZyBuaWUiCisKKyM6IGV4X2RvY21kLmM6NzYyMQorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAiZ2VlbiBvdXRvYmV2ZWwgYnVmZmVybm9tbWVyIG9tIFwiPGFidWY+XCIgbWVlIHRlIHZlcnZhbmcgbmllIgorCisjOiBleF9kb2NtZC5jOjc2MzIKK21zZ2lkICJubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiZ2VlbiBvdXRvYmV2ZWwgdHJlZmZlcm5hYW0gb20gXCI8YW1hdGNoPlwiIG1lZSB0ZSB2ZXJ2YW5nIG5pZSIKKworIzogZXhfZG9jbWQuYzo3NjQyCittc2dpZCAibm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiCittc2dzdHIgImdlZW4gJzpzb3VyY2UnIGzqZXJuYWFtIG9tIFwiPHNmaWxlPlwiIG1lZSB0ZSB2ZXJ2YW5nIG5pZSIKKworIzogZXhfZG9jbWQuYzo3NjgzCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJMZesgbOplcm5hYW0gdmlyICclJyBvZiAnIycsIHdlcmsgc2xlZ3MgbWV0IFwiOnA6aFwiIgorCisjOiBleF9kb2NtZC5jOjc2ODUKK21zZ2lkICJFdmFsdWF0ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFdmFsdWVlciBuYSAnbiBsZesgc3RyaW5nIgorCisjOiBleF9kb2NtZC5jOjg1OTQKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IEthbiAndmltaW5mbycgbOplciBuaWUgb29wbWFhayBvbSB0ZSBsZWVzIG5pZSIKKworIzogZXhfZG9jbWQuYzo4NzY3Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBHZWVuIGRpZ3Jhd2UgaW4gaGllcmRpZSB3ZWVyZ2F3ZSBuaWUiCisKKyM6IGV4X2dldGxuLmM6Mjc4NQorbXNnaWQgInRhZ25hbWUiCittc2dzdHIgImV0aWtldG5hYW0iCisKKyM6IGV4X2dldGxuLmM6Mjc4OAorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIHRpcGUgbOplclxuIgorCisjOiBleF9nZXRsbi5jOjM5OTcKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIidoaXN0b3J5JyBvcHNpZSBpcyBudWwiCisKKyM6IGV4X2dldGxuLmM6NDIzNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgJXMgR2Vza2llZGVuaXMgKHZhbiBudXV0c3RlIG5hIG91ZHN0ZSk6XG4iCisKKyM6IGV4X2dldGxuLmM6NDIzOAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAiQmV2ZWxyZetsIgorCisjOiBleF9nZXRsbi5jOjQyMzkKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICJTb2Vrc3RyaW5nIgorCisjOiBleF9nZXRsbi5jOjQyNDAKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJVaXRkcnVra2luZyIKKworIzogZXhfZ2V0bG4uYzo0MjQxCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiSW52b2VyIEx5biIKKworIzogZXhfZ2V0bG4uYzo0MjcxCittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6ICdjbWRfcGNoYXInIHZlcmJ5IGRpZSBlaW5kZSB2YW4gb3BkcmFnbGVuZ3RlIgorCisjOiBleF9nZXRsbi5jOjQ0MzUKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBBa3RpZXdlIHZlbnN0ZXIgb2YgYnVmZmVyIGdlc2tyYXAiCisKKyM6IGZpbGVpby5jOjM0NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICJPbmdlbGRpZ2UgbOplcm5hYW0iCisKKyM6IGZpbGVpby5jOjM3MSBmaWxlaW8uYzo0OTUgZmlsZWlvLmM6MjQ5MSBmaWxlaW8uYzoyNTI5Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgImlzICduIGdpZHMiCisKKyM6IGZpbGVpby5jOjM3MworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgImlzIG5pZSAnbiBs6mVyIG5pZSIKKworIzogZmlsZWlvLmM6NTE1IGZpbGVpby5jOjM1ODEKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbTnV3ZSBs6mVyXSIKKworIzogZmlsZWlvLmM6NTMyCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW1RvZXN0ZW1taW5nIEdld2VpZXJdIgorCisjOiBmaWxlaW8uYzo2MjQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiAnKlJlYWRQcmUnIG91dG9iZXZlbGUgaGV0IGRpZSBs6mVyIG9ubGVlc2JhYXIgZ2VtYWFrIgorCisjOiBmaWxlaW8uYzo2MjYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAnKlJlYWRQcmUnIG91dG9iZXZlbGUgbWFnIG5pZSBkaWUgaHVpZGlnZSBidWZmZXIgdmVyYW5kZXIgbmllIgorCisjOiBmaWxlaW8uYzo2NDYKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IExlZXMgbm91IHZhbmFmICdzdGRpbicuLi5cbiIKKworIzogZmlsZWlvLmM6NjUyCittc2dpZCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uIgorbXNnc3RyICJMZWVzIG5vdSB2YW5hZiBzdGRpbi4uLiAiCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6ODc2Cittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IE9tc2V0dGluZyBoZXQgbOplciBvbmxlZXNiYWFyIGdlbWFhayEiCisKKyM6IGZpbGVpby5jOjE3MzIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxNzM5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjE3NDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE3NTQKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoxNzY0Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbQ1Igb250YnJlZWtdIgorCisjOiBmaWxlaW8uYzoxNzY5Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW05MIGdldmluZF0iCisKKyM6IGZpbGVpby5jOjE3NzQKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIltsYW5nIHJl62xzIHZlcmRlZWxdIgorCisjOiBmaWxlaW8uYzoxNzgwIGZpbGVpby5jOjM1NjUKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltOSUUgb21nZXNpdCBuaWVdIgorCisjOiBmaWxlaW8uYzoxNzg1IGZpbGVpby5jOjM1NzAKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW29tZ2VzaXRdIgorCisjOiBmaWxlaW8uYzoxNzkyIGZpbGVpby5jOjM1OTUKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIltnZWtvZGVlcl0iCisKKyM6IGZpbGVpby5jOjE3OTkKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltPTVNFVFRJTkdTRk9VVF0iCisKKyM6IGZpbGVpby5jOjE4MDYKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbTEVFU0ZPVVRFXSIKKworIzogZmlsZWlvLmM6MjAxMworbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICJLYW4gbmllIHR5ZGVsaWtlIGzqZXIgdmlyIG9tc2V0dGluZyB2aW5kIG5pZSIKKworIzogZmlsZWlvLmM6MjAyMAorbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiT21zZXR0aW5nIG1ldCAnY2hhcmNvbnZlcnQnIGhldCBnZWZhYWwiCisKKyM6IGZpbGVpby5jOjIwMjMKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICJrYW4gYWZ2b2VyIHZhbiAnY2hhcmNvbnZlcnQnIG5pZSBsZWVzIG5pZSIKKworIzogZmlsZWlvLmM6MjQwNworbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiBPdXRvYmV2ZWxlIGhldCBkaWUgc2tyeWZidWZmZXIgZ2Vza3JhcCBvZiB1aXRnZWxhYWkiCisKKyM6IGZpbGVpby5jOjI0MzAKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogT3V0b2JldmVsIGhldCBldGxpa2UgcmXrbHMgb3Agb252ZXJ3YWdzZSB3eXNlIHZlcmFuZGVyICIKKworIzogZmlsZWlvLmM6MjQ5NiBmaWxlaW8uYzoyNTEzCittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgImlzIG5pZSAnbiBs6mVyIG9mICduIHNrcnlmYmFyZSB0b2VzdGVsIG5pZSIKKworIzogZmlsZWlvLmM6MjU1NQorbXNnaWQgImlzIHJlYWQtb25seSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJpcyBsZWVzLWFsbGVlbiAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZmlsZWlvLmM6Mjg1MQorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkthbiBuaWUgbmEgcnVnc3RldW5s6mVyIHNrcnlmIG5pZSAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZmlsZWlvLmM6Mjg2MworbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJTbHVpdGZvdXQgdmlyIHJ1Z3N0ZXVubOplciAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZmlsZWlvLmM6Mjg2NQorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkthbiBydWdzdGV1bmzqZXIgbmllIGxlZXMgbmllIChnZWJydWlrICEgb20gdGUgZHdpbmcpIgorCisjOiBmaWxlaW8uYzoyODgxCittc2dpZCAiQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJLYW4gcnVnc3RldW5s6mVyIG5pZSBza2VwIG5pZSAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZmlsZWlvLmM6Mjk3MAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiS2FuIHJ1Z3N0ZXVubOplciBuaWUgc2tlcCBuaWUgKGdlYnJ1aWsgISBvbSB0ZSBkd2luZykiCisKKyM6IGZpbGVpby5jOjMwMzIKK21zZ2lkICJUaGUgcmVzb3VyY2UgZm9yayB3aWxsIGJlIGxvc3QgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRGllIGh1bHBicm9udnVyayBzYWwgdmVybG9yZSBnYWFuIChnZWJydWlrICEgb20gdGUgZHdpbmcpIgorCisjOiBmaWxlaW8uYzozMTIxCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IEthbiBuaWUgdHlkZWxpa2UgbOplciB2aW5kIHZpciBza3J5ZiBuaWUiCisKKyM6IGZpbGVpby5jOjMxMzkKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAodXNlICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogS2FuIG5pZSBvbXNpdCBuaWUgKGdlYnJ1aWsgISBvbSB0ZSBza3J5ZiBzb25kZXIgb21zZXR0aW5nKSIKKworIzogZmlsZWlvLmM6MzE3NgorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IEthbiBs6mVyIG5pZSBvb3BtYWFrIHZpciBza3J5ZiBuaWUiCisKKyM6IGZpbGVpby5jOjMxODAKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IEthbiBs6mVyIG5pZSBvb3BtYWFrIHZpciBza3J5ZiBuaWUiCisKKyM6IGZpbGVpby5jOjM0MjMKK21zZ2lkICJDbG9zZSBmYWlsZWQiCittc2dzdHIgIlNsdWl0aW5nIGdlZmFhbCIKKworIzogZmlsZWlvLmM6MzQ4MQorbXNnaWQgIndyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAic2tyeWZmb3V0LCBvbXNldHRpbmcgZ2VmYWFsIgorCisjOiBmaWxlaW8uYzozNDg3Cittc2dpZCAid3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIKK21zZ3N0ciAic2tyeWZmb3V0IChs6mVyc3RlbHNlbCB2b2w/KSIKKworIzogZmlsZWlvLmM6MzU2MAorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICIgT01TRVRUSU5HU0ZPVVQiCisKKyM6IGZpbGVpby5jOjM1NzYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW1RvZXN0ZWxdIgorCisjOiBmaWxlaW8uYzozNTgxCittc2dpZCAiW05ld10iCittc2dzdHIgIltOdXV0XSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbYV0iCisKKyM6IGZpbGVpby5jOjM2MDMKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiBieWdldm9lZyIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiBbd10iCittc2dzdHIgIiBbd10iCisKKyM6IGZpbGVpby5jOjM2MDUKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIGdlc2tyeWYiCisKKyM6IGZpbGVpby5jOjM2NTUKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTogcGF0Y2htb2RlOiBrYW4gb29yc3Byb25rbGlrZSBs6mVyIG5pZSBzdG9vciBuaWUiCisKKyM6IGZpbGVpby5jOjM2NzcKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZToga2FuIGxl6yBvb3JzcHJvbmds6mVyIG5pZSAndG91Y2gnIG5pZSIKKworIzogZmlsZWlvLmM6MzY5MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogS2FuIHJ1Z3N0ZXVubOplciBuaWUgdmVyd3lkZXIgbmllIgorCisjOiBmaWxlaW8uYzozNzQ0Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisiV0FBUlNLVVdJTkc6IE9vcnNwcm9ua2xpa2UgbOplciBtYWcgdmVybG9yZSBvZiBiZXNrYWRpZyB3ZWVzXG4iCisKKyM6IGZpbGVpby5jOjM3NDYKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICJtb2VuaWUgZGllIHZlcndlcmtlciB2ZXJsYWF0IHZvb3IgZGllIGzqZXIgc3Vrc2Vzdm9sIGdlc2tyeWYgaXMgbmllISIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2RvcyBmb3JtYWF0XSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyBmb3JtYWF0XSIKKworIzogZmlsZWlvLmM6Mzg0MAorbXNnaWQgIlt1bml4XSIKK21zZ3N0ciAiW3VuaXhdIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW3VuaXggZm9ybWF0XSIKK21zZ3N0ciAiW3VuaXggZm9ybWFhdF0iCisKKyM6IGZpbGVpby5jOjM4NjcKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSByZetsLCAiCisKKyM6IGZpbGVpby5jOjM4NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCByZetscywgIgorCisjOiBmaWxlaW8uYzozODcyCittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgIjEga2FyYWt0ZXIiCisKKyM6IGZpbGVpby5jOjM4NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCBrYXJha3RlcnMiCisKKyM6IGZpbGVpby5jOjM4ODQKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzozODg0Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW09udm9sdG9vaWRlIGxhYXN0ZSByZetsXSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzozOTAzCittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICJXQUFSU0tVV0lORzogRGllIGzqZXIgaGV0IHZlcmFuZGVyIHNlZGVydCBkaXQgZ2VsZWVzIGlzISEhIgorCisjOiBmaWxlaW8uYzozOTA1Cittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJXaWwgankgcmVndGlnIHNvb250b2Ugc2tyeWY/IgorCisjOiBmaWxlaW8uYzo0ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBLYW4gbmllIHNrcnlmIG5hIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NDg2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogS2FuIFwiJXNcIiBuaWUgc2x1aXQgbmllIgorCisjOiBmaWxlaW8uYzo0ODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBLYW4gXCIlc1wiIG5pZSBsZWVzIG5pZSIKKworIzogZmlsZWlvLmM6NTAzNQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6ICdGaWxlQ2hhbmdlZFNoZWxsJyBvdXRvYmV2ZWwgaGV0IGJ1ZmZlciB2ZXJ3eWRlciIKKworIzogZmlsZWlvLmM6NTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiBXYWFyc2t1d2luZzogTOplciBcIiVzXCIgaXMgbmllIG1lZXIgYmVza2lrYmFhciBuaWUiCisKKyM6IGZpbGVpby5jOjUwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBXYWFyc2t1d2luZzogTOplciBcIiVzXCIgaGV0IHZlcmFuZGVyIHNlZGVydCBiZXdlcmtpbmcgYmVnaW4gaGV0IGVuIGRpZSAiCisiYnVmZmVyIGluIFZpbSBoZXQgb29rIHZlcmFuZGVyIgorCisjOiBmaWxlaW8uYzo1MDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IFdhYXJza3V3aW5nOiBM6mVyIFwiJXNcIiBoZXQgdmVyYW5kZXIgc2VkZXJ0IGJld2Vya2luZyBiZWdpbiBoZXQiCisKKyM6IGZpbGVpby5jOjUwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiIgorIlcxNjogV2FhcnNrdXdpbmc6IE1vZHVzIHZhbiBs6mVyIFwiJXNcIiBoZXQgdmVyYW5kZXIgc2VkZXJ0IGJld2Vya2luZyBiZWdpbiAiCisiaGV0IgorCisjOiBmaWxlaW8uYzo1MDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogV2FhcnNrdXdpbmc6IEzqZXIgXCIlc1wiIGlzIGdlc2tlcCBzZWRlcnQgYmV3ZXJraW5nIGJlZ2luIGhldCIKKworIzogZmlsZWlvLmM6NTA4OAorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIldhYXJza3V3aW5nIgorCisjOiBmaWxlaW8uYzo1MDg5Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImTGFhaSBM6mVyIgorCisjOiBmaWxlaW8uYzo1MTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjE6IENvdWxkIG5vdCByZWxvYWQgXCIlc1wiIgorbXNnc3RyICJFMzIxOiBLb24gbmllIFwiJXNcIiBoZXJsYWFpIG5pZSIKKworIzogZmlsZWlvLmM6NTY3MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLUdlc2tyYXAtLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjU4MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBHZWVuIHNvZGFuaWdlIGdyb2VwIG5pZTogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1OTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBPbmdlbGRpZ2Uga2FyYWt0ZXIgbmEgKjogJXMiCisKKyM6IGZpbGVpby5jOjU5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IEdlZW4gc29kYW5pZ2UgZ2ViZXVydGVuaXMgbmllOiAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo2MTE1Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBPdXRvYmV2ZWxlIC0tLSIKKworIzogZmlsZWlvLmM6NjM4NgorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBLYW4gbmllIG91dG9iZXZlbGUgdWl0dm9lciB2aXIgJ0FMTCcgZ2ViZXVydGVuaXNzZSBuaWUiCisKKyM6IGZpbGVpby5jOjY0MDkKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIkdlZW4gcGFzc2VuZGUgb3V0b2JldmVsZSBuaWUiCisKKyM6IGZpbGVpby5jOjY2ODEKK21zZ2lkICJFMjE4OiBhdXRvY29tbWFuZCBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFMjE4OiBvdXRvYmV2ZWxlIHRlIGRpZXAgZ2VuZXMiCisKKyM6IGZpbGVpby5jOjY5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBvdXRvYmV2ZWxlIHZpciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY5NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJWb2VyICVzIHVpdCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJvdXRvYmV2ZWwgJXMiCisKKyM6IGZpbGVpby5jOjc1NjYKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBPbnRicmVrZW5kZSB7LiIKKworIzogZmlsZWlvLmM6NzU2OAorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IE9udGJyZWtlbmRlIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICJHZWVuIHZvdSBnZXZpbmQgbmllIgorCisjOiBmb2xkLmM6NTU0Cittc2dpZCAiRTM1MDogQ2Fubm90IGNyZWF0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTA6IEthbiBuaWUgdm91IHNrZXAgbWV0IGh1aWRpZ2UgJ2ZvbGRtZXRob2QnIG5pZSIKKworIzogZm9sZC5jOjU1NgorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiBLYW4gbmllIHZvdSBza3JhcCBtZXQgaHVpZGlnZSAnZm9sZG1ldGhvZCcgbmllIgorCisjOiBmb2xkLmM6MTcwMAorbXNnaWQgIkUyMjE6ICdjb21tZW50c3RyaW5nJyBpcyBlbXB0eSIKK21zZ3N0ciAiRTIyMTogJ2NvbW1lbnRzdHJpbmcnIG9wc2llIGlzIGxlZWciCisKKyM6IGdldGNoYXIuYzoyNjgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IFZvZWcgYnkgbGVlc2J1ZmZlciIKKworIzogZ2V0Y2hhci5jOjIxMTQKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJzaWV3ZSBiaW5kaW5nIgorCisjOiBnZXRjaGFyLmM6Mjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogZ2xvYmFsZSBhZmtvcnRpbmcgYmVzdGFhbiBhbHJlZWRzIHZpciAlcyIKKworIzogZ2V0Y2hhci5jOjI5NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBnbG9iYWxlIGJpbmRpbmcgYmVzdGFhbiBhbHJlZWRzIHZpciAlcyIKKworIzogZ2V0Y2hhci5jOjMwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogYWZrb3J0aW5nIGJlc3RhYW4gYWxyZWFkeSB2aXIgJXMiCisKKyM6IGdldGNoYXIuYzozMDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiBiaW5kaW5nIGJlc3RhYW4gYWxyZWVkcyB2aXIgJXMiCisKKyM6IGdldGNoYXIuYzozMTYzCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJHZWVuIGFma29ydGluZyBnZXZpbmQgbmllIgorCisjOiBnZXRjaGFyLmM6MzE2NQorbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIkdlZW4gYmluZGluZyBnZXZpbmQgbmllIgorCisjOiBnZXRjaGFyLmM6Mzk5MAorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDogT25nZWxkaWdlIG1vZHVzIgorCisjOiBndWkuYzoxODEKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogS2FuIG5pZSBkaWUgR1VJIGJlZ2luIG5pZSIKKworIzogZ3VpLmM6MzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBLYW4gbmllIGxlZXMgdWl0IFwiJXNcIiBuaWUiCisKKyM6IGd1aS5jOjQzMQorbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogJ2d1aWZvbnR3aWRlJyBvbmdlbGRpZyIKKworIzogZ3VpLmM6MzkyNgorbXNnaWQgIkVycm9yIgorbXNnc3RyICJGb3V0IgorCisjOiBndWkuYzozOTI3Cittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGd1aV9hdF9mcy5jOjI5MAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8a2FuIG5pZSBvb3BtYWFrIG5pZT4gIgorCisjOiBndWlfYXRfZnMuYzoxMTE1CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAiJ3ZpbV9TZWxGaWxlJzoga2FuIGZvbnQgJXMgbmllIGtyeSBuaWUiCisKKyM6IGd1aV9hdF9mcy5jOjI1MzgKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICIndmltX1NlbEZpbGUnOiBLYW4gbmllIHRlcnVna2VlciBuYSBodWlkaWdlIGdpZHMgbmllIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJHaWRzbmFhbToiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjMKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTogS2FuIG5pZSBodWlkaWdlIGdpZHMgdmVya3J5IG5pZSIKKworIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfbW90aWYuYzoxNjA3Cittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjLiAnQ2FuY2VsJyBidXR0b24KKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX2d0ay5jOjE2ODMgZ3VpX21vdGlmLmM6MTYwMiBndWlfbW90aWYuYzoyODIzCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJLYW5zZWxsZWVyIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlJvbHN0YWFmZWxlbWVudDogS29uIG5pZSBwaWtzZWxtYXRyaWtzLWR1aW1uYWVsIHNlIGdlb21ldHJpZSBrcnkgbmllIgorCisjOiBndWlfYXRoZW5hLmM6MTkyOCBndWlfbW90aWYuYzoxODU1Cittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltIGRpYWxvb2dob2traWUiCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IEthbiBuaWUgQmFsbG9vbkV2YWwgc2tlcCBtZXQgYmVpZGUgYm9vZHNrYXAgZW4gdGVydWdyb2VwIG5pZSIKKworIzogZ3VpX2d0ay5jOjExNDQKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gZGlhbG9vZ2hva2tpZS4uLiIKKworIzogZ3VpX2d0ay5jOjE1MTkgZ3VpX21vdGlmLmM6Mjc0MgorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gU29layBlbiBWZXJ2YW5nLi4uIgorCisjOiBndWlfZ3RrLmM6MTUyNCBndWlfbW90aWYuYzoyNzQ0Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBTb2VrLi4uIgorCisjOiBndWlfZ3RrLmM6MTU0NyBndWlfbW90aWYuYzoyODYyCittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAiU29layBuYToiCisKKyM6IGd1aV9ndGsuYzoxNTY1IGd1aV9tb3RpZi5jOjI4OTQKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICJWZXJ2YW5nIG1ldDoiCisKKyMuIGV4YWN0IG1hdGNoIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTU5NyBndWlfbW90aWYuYzoyOTk2Cittc2dpZCAiTWF0Y2ggZXhhY3Qgd29yZCBvbmx5IgorbXNnc3RyICJUcmVmIHNsZWdzIHByZXNpZXNlIHdvb3JkIgorCisjOiBndWlfZ3RrLmM6MTYwOSBndWlfbW90aWYuYzoyOTY0Cittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICJSaWd0aW5nIgorCisjLiAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIzogZ3VpX2d0ay5jOjE2MjEgZ3VpX21vdGlmLmM6Mjk3NgorbXNnaWQgIlVwIgorbXNnc3RyICJPcCIKKworIzogZ3VpX2d0ay5jOjE2MjUgZ3VpX21vdGlmLmM6Mjk4NAorbXNnaWQgIkRvd24iCittc2dzdHIgIkFmIgorCisjLiAnRmluZCBOZXh0JyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjQ3IGd1aV9tb3RpZi5jOjI3NjYKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIlZpbmQgdm9sZ2VuZGUiCisKKyMuICdSZXBsYWNlJyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjY0IGd1aV9tb3RpZi5jOjI3ODMKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJWZXJ2YW5nIgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NzMgZ3VpX21vdGlmLmM6Mjc5NgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJWZXJ2YW5nIGFsbGVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjEwNzYgZ3VpX3gxMS5jOjExOTkKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBrYW4gbmllIHZlcnRvb25za2VybSBvb3BtYWFrIG5pZSIKKworIzogZ3VpX2d0a194MTEuYzoyNDMzIGd1aV94MTEuYzoyMDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IE9uYmVrZW5kZSBmb250c3RlbDogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjQ2MAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJGb250a2V1c2UiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcwMiBndWlfbWFjLmM6Mjc4MCBndWlfdzQ4LmM6MTE5NyBndWlfeDExLmM6MTgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiBPbmJla2VuZGUgZm9udDogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcxMyBndWlfeDExLmM6MTg2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5pZSAnbiB2YXN0ZS13eWR0ZSBmb250IG5pZSIKKworIzogZ3VpX2d0a194MTEuYzoyODQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDI6IENvbG9yIG5hbWUgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFMjQyOiBLbGV1cm5hYW0gaXMgb25iZWtlbmQ6ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkgdWkuYzoxOTI5Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiJ0NVVF9CVUZGRVIwJyBpcyBnZWJydWlrIGluIHBsYWFzIHZhbiBsZesgc2VsZWtzaWUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDEgZ3VpX21vdGlmLmM6MTYwNAorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiRmlsdGVyIgorCisjOiBndWlfbW90aWYuYzoxNjAzCittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIkdpZHNlIgorCisjOiBndWlfbW90aWYuYzoxNjA1Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiSHVscCIKKworIzogZ3VpX21vdGlmLmM6MTYwNgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJM6mVycyIKKworIzogZ3VpX21vdGlmLmM6MTYwOAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiU2VsZWtzaWUiCisKKyM6IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJVbmRvIgorbXNnc3RyICJIZXJyb2VwIgorCisjOiBndWlfcmlzY29zLmM6OTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTIzNTogS2FuIG5pZSBaYXAgZm9udCAnJXMnIGxhYWkgbmllIgorCisjOiBndWlfcmlzY29zLmM6MTA0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTogS2FuIG5pZSBmb250ICVzIGdlYnJ1aWsgbmllIgorCisjOiBndWlfcmlzY29zLmM6MTE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBNaXNzaW5nIGNvbG9yOiAlcyIKK21zZ3N0ciAiRTI0MjogT250YnJla2VuZGUga2xldXI6ICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJCZXNpZyBvbSBkb29kc2Jvb2Rza2FwIGFhbiBraW5kcHJvc2VzIHRlIHN0dXVyLlxuIgorCisjOiBndWlfdzMyLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBQYXJhbWV0ZXIgbmllIGJla2VuZDogXCItJXNcIjsgR2VicnVpayBkaWUgT0xFIHdlZXJnYXdlLiIKKworIzogZ3VpX3c0OC5jOjIwNjgKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJWaW5kIHN0cmluZyAoZ2VicnVpayAnXFxcXCcgb20gJ24gJ1xcJyB0ZSB2aW5kIgorCisjOiBndWlfdzQ4LmM6MjA5MworbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlZpbmQgJiB2ZXJ2YW5nIHN0cmluZyAoZ2VicnVpayAnXFxcXCcgb20gJ24gJ1xcJyB0ZSB2aW5kIgorCisjOiBndWlfeDExLmM6MTQxOQorbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODogS2FuIG5pZSBrbGV1cmthYXJ0LWluc2tyeXdpbmcgdG9la2VuIG5pZSwgc29tbWlnZSBrbGV1cmUgbWFnICIKKyJ2ZXJrZWVyZCB3ZWVzIgorCisjOiBndWlfeDExLmM6MTk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiIgorIkUyNTA6IEZvbnRlIHZpciBkaWUgdm9sZ2VuZGUga2FyYWt0ZXJzdGVsbGUgb250YnJlZWsgaW4gZm9udHZlcnNhbWVsaW5nICVzOiIKKworIzogZ3VpX3gxMS5jOjIwMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogRm9udHN0ZWwgbmFhbTogJXMiCisKKyM6IGd1aV94MTEuYzoyMDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkZvbnQgJyVzJyBpcyBuaWUgJ24gdmFzdGUtd3lkdGUgZm9udCBuaWUiCisKKyM6IGd1aV94MTEuYzoyMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogRm9uc3RlbCBuYWFtOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA1NgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MDogJXNcbiIKK21zZ3N0ciAiRm9udDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJGb250MTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIkZvbnQlZCB3eWR0ZSBpcyBuaWUgdHdlZSBrZWVyIGTtZSB2YW4gZm9udDAgbmllXG4iCisKKyM6IGd1aV94MTEuYzoyMDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiRm9udDAgd3lkdGU6ICVsZFxuIgorCisjOiBndWlfeDExLmM6MjA2MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisiRm9udDEgd3lkdGU6ICVsZFxuIgorIlxuIgorCisjOiBndWlfeDExLmM6MjIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IEthbiBuaWUga2xldXIgJXMgdG9la2VuIG5pZSIKKworIzogZ3VpX3gxMS5jOjMyNTYKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IEZvdXQgLS0ga29uIG5pZSB0ZWtlbmRhdGEgbGVlcyBuaWUhIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogSGFuZ3VsIG91dG9tYXRpc2VyaW5ncyBGT1VUIgorCisjOiBpZl9jc2NvcGUuYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkdlYnJ1aWs6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzo2NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiVm9lZyAnbiBudXdlIGRhdGFiYXNpcyBieSIKKworIzogaWZfY3Njb3BlLmM6NjkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICJTb2VrIHZpciAnbiBwYXRyb29uIgorCisjOiBpZl9jc2NvcGUuYzo3MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICJXeXMgaGllcmRpZSBib29kc2thcCIKKworIzogaWZfY3Njb3BlLmM6NzMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiU2x1aXQgJ24gdmVyYmluZGluZyIKKworIzogaWZfY3Njb3BlLmM6NzUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICJIZXJzdGVsIGFsbGUgdmVyYmluZGluZ3MiCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiV3lzIHZlcmJpbmRpbmdzIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIiIKKyJIaWVyZGllICdjc2NvcGUnIGJldmVsIG9uZGVyc3RldW4gbmllIGRpZSBzcGxpdHNpbmcgdmFuIGRpZSB2ZW5zdGVyIG5pZS5cbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIkdlYnJ1aWs6ICdjc3RhZyA8aWRlbnQ+JyIKKworIzogaWZfY3Njb3BlLmM6MTk5Cittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6ICdjc3RhZyc6IGV0aWtldCBuaWUgZ2V2aW5kIG5pZSIKKworIzogaWZfY3Njb3BlLmM6NDA3IGlmX2NzY29wZS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgIidzdGF0KCVzKScgZm91dDogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQ2MCBpZl9jc2NvcGUuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICInY3Njb3BlJyBkYXRhYmFzaXMgJXMgYnlnZXZvZWciCisKKyM6IGlmX2NzY29wZS5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIiVzIGlzIG5pZSAnbiBnaWRzIG9mICduIGdlbGRpZ2UgJ2NzY29wZScgZGF0YWJhc2lzIG5pZSIKKworIzogaWZfY3Njb3BlLmM6NTU3CisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIidjc2NvcGUnIHZlcmJpbmRpbmcgJWQga29uIG5pZSBnZWxlZXMgd29yZCBuaWUiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJvbmJla2VuZGUgJ2NzY29wZScgc29la3RpcGUiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJLb24gbmllICdjc2NvcGUnIHB5cGUgc2tlcCBuaWUiCisKKyM6IGlmX2NzY29wZS5jOjc0NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICInY3NfY3JlYXRlX2Nvbm5lY3Rpb24nIHVpdHZvZXJpbmcgaGV0IG1pc2x1ayIKKworIzogaWZfY3Njb3BlLmM6NzU1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIgorbXNnc3RyICInY3NfY3JlYXRlX2Nvbm5lY3Rpb24nOiAnZmRvcGVuJyB2aXIgJ3RvX2ZwJyBoZXQgbWlzbHVrIgorCisjOiBpZl9jc2NvcGUuYzo3NTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgIidjc19jcmVhdGVfY29ubmVjdGlvbic6ICdmZG9wZW4nIHZpciAnZnJfZnAnIGhldCBtaXNsdWsiCisKKyM6IGlmX2NzY29wZS5jOjc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiZ2VlbiAnY3Njb3BlJyB2ZXJiaW5kaW5ncyBuaWUiCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGdlZW4gdHJlZmZlcnMgZ2V2aW5kIHZpciAnY3Njb3BlJyB2ZXJzb2VrICVzIHZhbiAlcyBuaWUiCisKKyM6IGlmX2NzY29wZS5jOjg5OQorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiJ2NzY29wZScgYmV2ZWxlOlxuIgorCisjOiBpZl9jc2NvcGUuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcylcbiIKK21zZ3N0ciAiJS01czogJS0zMHMgKEdlYnJ1aWs6ICVzKVxuIgorCisjOiBpZl9jc2NvcGUuYzo5NzAKK21zZ2lkICJkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiZHVwbGlrYWF0ICdjc2NvcGUnIGRhdGFiYXNpcyBuaWUgYnlnZXZvZWcgbmllIgorCisjOiBpZl9jc2NvcGUuYzo5ODEKK21zZ2lkICJtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAibWFrc2ltdW0gYWFudGFsICdjc2NvcGUnIHZlcmJpbmRpbmdzIGJlcmVpayIKKworIzogaWZfY3Njb3BlLmM6MTEwMgorbXNnaWQgIkUyNjA6IGNzY29wZSBjb25uZWN0aW9uIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MDogJ2NzY29wZScgdmVyYmluZGluZyBuaWUgZ2V2aW5kIG5pZSIKKworIzogaWZfY3Njb3BlLmM6MTEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6ICdjc2NvcGUnIHZlcmJpbmRpbmcgJXMgbmllIGdldmluZCBuaWUiCisKKyM6IGlmX2NzY29wZS5jOjExNDEKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiBjbG9zZWQiCittc2dzdHIgIidjc2NvcGUnIHZlcmJpbmRpbmcgZ2VzbHVpdCIKKworIzogaWZfY3Njb3BlLmM6MTE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWRcbiIKK21zZ3N0ciAiJ2NzY29wZScgdmVyYmluZGluZyAlcyBnZXNsdWl0XG4iCisKKyMuIHNob3VsZCBub3QgcmVhY2ggaGVyZQorIzogaWZfY3Njb3BlLmM6MTI5MAorbXNnaWQgImZhdGFsIGVycm9yIGluIGNzX21hbmFnZV9tYXRjaGVzIgorbXNnc3RyICJmYXRhbGUgZm91dCBpbiAnY3NfbWFuYWdlX21hdGNoZXMnIgorCisjOiBpZl9jc2NvcGUuYzoxMzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6ICdjc2NvcGUnIHZlcmJpbmRpbmcgJWQga29uIG5pZSBnZWxlZXMgd29yZCBuaWUiCisKKyMgbmpqOiBkYWxrICd2ZXJiaW5kaW5nJyBpcHYgJ3ZlcmJpbmRpbmcnIG9yYWxzPworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICJrb24gbmllICdtYWxsb2MnIG5pZVxuIgorCisjOiBpZl9jc2NvcGUuYzoxNDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzXG4iCittc2dzdHIgIkNzY29wZSBldGlrZXQ6ICVzXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTgKK21zZ2lkICIgICAjICAgbGluZSIKK21zZ3N0ciAiICAgIyAgIHJl62wiCisKKyM6IGlmX2NzY29wZS5jOjE0NjAKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgImzqZXJuYWFtIC8ga29udGVrcyAvIHJl62xcbiIKKworIzogaWZfY3Njb3BlLmM6MTcxOAorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICJBbGxlICdjc2NvcGUnIGRhdGFiYXNpc3NlIGhlcnN0ZWwiCisKKyM6IGlmX2NzY29wZS5jOjE3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAiZ2VlbiAnY3Njb3BlJyB2ZXJiaW5kaW5ncyBuaWVcbiIKKworIzogaWZfY3Njb3BlLmM6MTc4OQorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgIGRhdGFiYXNpcyBuYWFtICAgICAgICAgICAgICAgICAgICAgIGdpZHN2b29ydm9lZ3NlbFxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA8Z2Vlbj5cbiIKKworIzogaWZfcHl0aG9uLmM6Mzc2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjYzOiBKYW1tZXIsIGhpZXJkaWUgYmV2ZWwgaXMgYWZnZXNrYWtlbCwgZGllIFB5dGhvbiBiaWJsaW90ZWVrIGzqZXIga29uICIKKyJuaWUgZ2VsYWFpIHdvcmQgbmllLiIKKworIzogaWZfcHl0aG9uLmM6NTc2Cittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJrYW4gbmllICdPdXRwdXRPYmplY3QnIGVpZW5za2FwcGUgc2tyYXAgbmllIgorCisjOiBpZl9weXRob24uYzo1ODMKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICInc29mdHNwYWNlJyBtb2V0ICduIGhlZWxnZXRhbCB3ZWVzIgorCisjOiBpZl9weXRob24uYzo1OTEKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAib25nZWxkaWdlIGVpZW5za2FwIgorCisjOiBpZl9weXRob24uYzo2MzAgaWZfcHl0aG9uLmM6NjQ0Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAiJ3dyaXRlbGluZXMoKScgYmVub2RpZyAnbiBseXMgdmFuIHN0cmluZ2UiCisKKyM6IGlmX3B5dGhvbi5jOjc3MAorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IEtvbiBuaWUgSS9PIG9iamVrdGUgaW53eSBuaWUiCisKKyMgbmpqOiBuZXQgJ24gdm9vcnN0ZWwgLi4KKyM6IGlmX3B5dGhvbi5jOjk1NSBpZl90Y2wuYzoxMzkxCittc2dpZCAiaW52YWxpZCBleHByZXNzaW9uIgorbXNnc3RyICJvbmdlbGRpZ2UgdWl0ZHJ1a2tpbmciCisKKyM6IGlmX3B5dGhvbi5jOjk2OSBpZl90Y2wuYzoxMzk2Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJ1aXRkcnVra2luZ3MgYWZnZXNrYWtlbCB0eWRlbnMga29tcGlsZXJpbmciCisKKyM6IGlmX3B5dGhvbi5jOjk4MgorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgInBvZ2luZyBvbSBuYSAnbiBnZXNrcmFwdGUgYnVmZmVyIHRlIHZlcnd5cyIKKworIzogaWZfcHl0aG9uLmM6OTk3IGlmX3B5dGhvbi5jOjEwMzggaWZfcHl0aG9uLmM6MTEwMiBpZl90Y2wuYzoxMjAzCittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICJyZetsbm9tbWVyIGJ1aXRlIG9tdmFuZyIKKworIzogaWZfcHl0aG9uLmM6MTIzNQorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXJ2b29yd2VycCAoZ2Vza3JhcCkgYnkgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjEzMjYgaWZfdGNsLmM6ODI1Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIm9uYmVrZW5kZSBtZXJrbmFhbSIKKworIzogaWZfcHl0aG9uLmM6MTYwMQorbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICJidWZmZXIgYmVzdGFhbiBuaWUiCisKKyM6IGlmX3B5dGhvbi5jOjE2ODkKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICJwb2dpbmcgb20gbmEgZ2Vza3JhcHRlIHZlbnN0ZXIgdGUgdmVyd3lzIgorCisjOiBpZl9weXRob24uYzoxNzM0Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJsZWVzYWxsZWVuIGVpZW5za2FwIgorCisjOiBpZl9weXRob24uYzoxNzQ3Cittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICJsb3BlcnBvc2lzaWUgYnVpdGUgYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxODI0CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjx2ZW5zdGVyIHZvb3J3ZXJwIChnZXNrcmFwKSBieSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPHZlcnd5ZGVyIHZvb3J3ZXJwIChvbmJla2VuZCkgYnkgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODM4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI8dmVuc3RlciAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5MTQKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAiZ2VlbiBzb2RhbmlnZSB2ZW5zdGVyIG5pZSIKKworIzogaWZfcHl0aG9uLmM6MjE0NCBpZl9weXRob24uYzoyMTc1IGlmX3B5dGhvbi5jOjIyMjUgaWZfcHl0aG9uLmM6MjI4NQorIzogaWZfcHl0aG9uLmM6MjQwMiBpZl9weXRob24uYzoyNDU0IGlmX3RjbC5jOjY3MyBpZl90Y2wuYzo3MTggaWZfdGNsLmM6NzkyCisjOiBpZl90Y2wuYzo4NjIgaWZfdGNsLmM6MTk4NworbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgImthbiBuaWUgaGVyd2luLWlubGlndGluZyBzdG9vciBuaWUiCisKKyM6IGlmX3B5dGhvbi5jOjIxNDYgaWZfcHl0aG9uLmM6MjIzMiBpZl9weXRob24uYzoyMjk2Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICJrYW4gcmXrbCBuaWUgdmVyd3lkZXIgbmllIgorCisjOiBpZl9weXRob24uYzoyMTc3IGlmX3B5dGhvbi5jOjIzMTIgaWZfdGNsLmM6Njc5IGlmX3RjbC5jOjIwMDkKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICJrYW4gcmXrbCBuaWUgdmVydmFuZyBuaWUiCisKKyM6IGlmX3B5dGhvbi5jOjIzMjggaWZfcHl0aG9uLmM6MjQwNCBpZl9weXRob24uYzoyNDYyCittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICJrYW4gcmXrbCBuaWUgYnl2b2VnIG5pZSIKKworIzogaWZfcHl0aG9uLmM6MjU2NgorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAic3RyaW5nIGthbiBuaWUgJ25ld2xpbmVzJyBiZXZhdCBuaWUiCisKKyM6IGlmX3J1YnkuYzozOTQKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6IEphbW1lciwgaGllcmRpZSBiZXZlbCBpcyBhZmdlc2tha2VsLCBkaWUgUnVieSBiaWJsaW90ZWVrbOplciBrb24gbmllICIKKyJnZWxhYWkgd29yZCBuaWUuIgorCisjOiBpZl9ydWJ5LmM6NDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IE9uYmVrZW5kZSAnbG9uZ2ptcCcgc3RhdHVzICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIlN0ZWwgZW4gaGVyc3RlbCBpbXBsaW1lbnRhc2llL2RlZmluaXNpZSIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAiV3lzIGJhc2lza2xhcyB2YW4iCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJXeXMgdmVydmFuZ2RlIGxpZGZ1bmtzaWUiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIkdhYW4gaGFhbCB1aXQgbOplciIKKworIzogaWZfc25pZmYuYzo3MQorbXNnaWQgIlJldHJpZXZlIGZyb20gcHJvamVjdCIKK21zZ3N0ciAiR2FhbiBoYWFsIHVpdCBwcm9qZWsiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiR2FhbiBoYWFsIHVpdCBhbGxlIHByb2pla3RlIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIkdhYW4gaGFhbCIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICJXeXMga29kZSB2YW4iCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAiVmluZCBzaW1ib29sIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJLeWsga2xhcyBkZXVyIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIld5cyBrbGFzIGluIGhp63JhcmdpZSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIld5cyBrbGFzIGluIGJlcGVya3RlIGhp63JhcmdpZSIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmIHZlcnd5cyBuYSIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgIlhyZWYgdmVyd3lzIGRldXIiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIGhldCAnbiIKKworIzogaWZfc25pZmYuYzo4MworbXNnaWQgIlhyZWYgdXNlZCBieSIKK21zZ3N0ciAiWHJlZiBnZWJydWlrIGRldXIiCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIld5cyAnZG9jdScgdmFuIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIkdlbmVyZWVyICdkb2N1JyB2aXIiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJLYW4gbmllICduIHZlcmJpbmRpbmcgbWV0ICdTTmlGRisnIG1hYWsgbmllLiBLeWsgb2YgZGllIG9tZ2V3aW5nIHJlZyBpcyAiCisiKCdzbmlmZmVtYWNzJyBtb2V0IGluICckUEFUSCcgZ2V2aW5kIHdvcmQpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogRm91dCBnZWR1cmVuZGUgbGVlcy4gVmVyYmluZGluZyBnZWJyZWVrIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICJTTmlGRisgaXMgdGFucyIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICJuaWUgIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAiZ2Vrb25uZWt0ZWVyIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogT25iZWtlbmRlIFNOaUZGKyB2ZXJzb2VrOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRm91dCBpbiBrb25uZWt0ZWVyIG1ldCBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAxMAorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgaXMgbmllIGdla29ubmVrdGVlciBuaWUiCisKKyM6IGlmX3NuaWZmLmM6MTAxOQorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IE5pZSAnbiBTTmlGRisgYnVmZmVyIG5pZSIKKworIzogaWZfc25pZmYuYzoxMDg0Cittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogRm91dCBnZWR1cmVuZGUgc3Rvb3IuIFZlcmJpbmRpbmcgZ2VicmVlayIKKworIzogaWZfdGNsLmM6NDA3Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJvbmdlbGRpZ2UgYnVmZmVybm9tbWVyIgorCisjOiBpZl90Y2wuYzo0NTMgaWZfdGNsLmM6OTIwIGlmX3RjbC5jOjEwOTkKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICJub2cgbmllIGdl721wbGVtZW50ZWVyIG5pZSIKKworIzogaWZfdGNsLmM6NDkwCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm9uYmVrZW5kZSBvcHNpZSIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NjMKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgImthbiBuaWUgcmXrbChzKSBzdGVsIG5pZSIKKworIzogaWZfdGNsLmM6ODM0Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJtZXJrZXIgbmllIGdlc3RlbCBuaWUiCisKKyM6IGlmX3RjbC5jOjg0MCBpZl90Y2wuYzoxMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgInJ5ICVkIGtvbG9tICVkIgorCisjOiBpZl90Y2wuYzo4NzAKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICJrYW4gbmllIHJl62wgaW52b2VnL2FhbmxhcyBuaWUiCisKKyM6IGlmX3RjbC5jOjEyNTcKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAib25iZWtlbmRlIHZsYWc6ICIKKworIzogaWZfdGNsLmM6MTMyNworbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICJvbmJla2VuZGUgJ3ZpbU9wdGlvbiciCisKKyM6IGlmX3RjbC5jOjE0MTIKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgInNsZXV0ZWxib3Jkb25kZXJicmVraW5nIgorCisjOiBpZl90Y2wuYzoxNDE3Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICJ2aW0gZm91dCIKKworIzogaWZfdGNsLmM6MTQ2MAorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAia2FuIG5pZSBidWZmZXIvdmVuc3RlciBiZXZlbCBza2VwIG5pZTogdm9vcndlcnAgd29yZCBnZXNrcmFwIgorCisjOiBpZl90Y2wuYzoxNTM0Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorImthbiBuaWUgdGVydWdyb2VwYmV2ZWwgcmVnaXN0cmVlciBuaWU6IGJ1ZmZlci92ZW5zdGVyIHdvcmQgYWxyZWVkcyBnZXNrcmFwIgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU1MQorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogVENMIEZBVEFMRSBGT1VUOiB2ZXJ3bHlzIGtvcnJ1cCE/IFJhcHBvcnRlZXIgZGl0IGFzYi4gYWFuIDx2aW0tZGV2QHZpbS4iCisib3JnPiIKKworIzogaWZfdGNsLmM6MTU1MgorbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJrYW4gdGVydWdyb2VwYmV2ZWwgbmllIHJlZ2lzdHJlZXIgbmllOiBidWZmZXIvdmVuc3RlcnZlcnd5c2luZyBuaWUgZ2V2aW5kIG5pZSIKKworIzogaWZfdGNsLmM6MTcxMworbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkphbW1lciwgaGllcmRpZSBiZXZlbCBpcyBhZmdlc2tha2VsLCBkaWUgVGNsIGJpYmxpb3RlZWsga29uIG5pZSBnZWxhYWkgIgorIndvcmRuaWUuIgorCisjOiBpZl90Y2wuYzoxODc1Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MTogVENMIEZPVVQ6IHZlcmxhYXRrb2RlIGlzIG5pZSAnbiAnaW50JyE/IFJhcHBvcnRlZXIgZGl0IGFzYi4gYWFuIDx2aW0tIgorImRldkB2aW0ub3JnPiIKKworIzogaWZfdGNsLmM6MTk5NQorbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAia2FuIG5pZSByZetsIGtyeSBuaWUiCisKKyM6IGlmX3hjbWRzcnYuYzoyMDQKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJLb24gbmllIGJldmVsYmVkaWVuZXIgbmFhbSByZWdpc3RyZWVyIG5pZSIKKworIzogaWZfeGNtZHNydi5jOjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IGdlZW4gZ2VyZWdpc3RyZWVyZGUgYmVkaWVuZXIgZ2VuYWFtZCBcIiVzXCIiCisKKyM6IGlmX3hjbWRzcnYuYzo0NDYKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBIZXQgZ2VmYWFsIG9tIGJldmVsIG5hIGRvZWwgcHJvZ3JhbSB0ZSBzdHV1ciIKKworIzogaWZfeGNtZHNydi5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIKK21zZ3N0ciAiT25nZWxkaWdlIGJlZGllbmVyLWlkIGdlYnJ1aWs6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA2MQorbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorbXNnc3RyICJFMjQ5OiBrb24gbmllIFZJTSBpbnN0YW5zaWUgcmVnaXN0ZXIta2VubWVyayBsZWVzIG5pZSIKKworIzogaWZfeGNtZHNydi5jOjEwNzIKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IFZJTSBpbnN0YW5zaWUgcmVnaXN0ZXIta2VubWVyayBpcyBzd2FrIGdldm9ybS4gR2Vza3JhcCEiCisKKyM6IG1haW4uYzo1MyBvcHRpb24uYzozMTYyIG9wdGlvbi5jOjMyNjkKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiT25iZWtlbmRlIG9wc2llIgorCisjOiBtYWluLmM6NTUKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiVGUgdmVlbCByZWRpZ2Vlci1wYXJhbWV0ZXJzIgorCisjOiBtYWluLmM6NTcKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJQYXJhbWV0ZXIgb250YnJlZWsgbmEiCisKKyM6IG1haW4uYzo1OQorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICJHZW1vcnMgbmEgb3BzaWUiCisKKyM6IG1haW4uYzo2MQorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiBvciBcIi1jIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlRlIHZlZWwgXCIrY29tbWFuZFwiIG9mIFwiLWMgY29tbWFuZFwiIHBhcmFtZXRlcnMiCisKKyM6IG1haW4uYzo2MworbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorbXNnc3RyICJPbmdlbGRpZ2UgcGFyYW1ldGVyIHZpciIKKworIzogbWFpbi5jOjQzNgorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiSGllcmRpZSBWaW0gaXMgbmllIGdla29tcGlsZWVyIG1ldCAnZGlmZicgZnVua3Npb25hbGl0ZWl0IG5pZS4iCisKKyM6IG1haW4uYzo4NTgKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICJQcm9iZWVyIHdlZXIgb20gc2tyaXBs6mVyIG9vcCB0ZSBtYWFrOiBcIiIKKworIzogbWFpbi5jOjg2MiBtYWluLmM6ODY5IG1haW4uYzo5MTMgbWVtbGluZS5jOjM2NzMgbWVtbGluZS5jOjM2NzcKKyM6IHZlcnNpb24uYzo4MTYgdmVyc2lvbi5jOjgyMSB2ZXJzaW9uLmM6ODI2IHZlcnNpb24uYzo4MzEgdmVyc2lvbi5jOjgzNgorIzogdmVyc2lvbi5jOjg0MSB2ZXJzaW9uLmM6ODQ3IHZlcnNpb24uYzo4NTEgdmVyc2lvbi5jOjg1NSB2ZXJzaW9uLmM6ODYwCisjOiB2ZXJzaW9uLmM6ODY3IHZlcnNpb24uYzo4NzUgdmVyc2lvbi5jOjg4MQorbXNnaWQgIlwiXG4iCittc2dzdHIgIlwiXG4iCisKKyM6IG1haW4uYzo4NjcKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIkthbiBuaWUgb29wbWFhayBvbSB0ZSBsZWVzIG5pZTogXCIiCisKKyM6IG1haW4uYzo5MTEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIkthbiBuaWUgb29wbWFhayB2aXIgc2tyaXAtYWZ2b2VyIG5pZTogXCIiCisKKyM6IG1haW4uYzoxMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiJWQgbOplcnMgb20gdGUgYmV3ZXJrXG4iCisKKyM6IG1haW4uYzoxMDk0Cittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBXYWFyc2t1d2luZzogQWZ2b2VyIGdhYW4gbmllIG5hICduIHRlcm1pbmFhbCBuaWVcbiIKKworIzogbWFpbi5jOjEwOTYKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBXYWFyc2t1d2luZzogSW52b2VyIGtvbSBuaWUgdmFuYWYgJ24gdGVybWluYWFsIG5pZVxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjExNzEKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJ28/NyLSd2aW1yYycgYmV2ZWxyZetsIgorCisjOiBtYWluLmM6MTIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogS2FuIG5pZSBsZWVzIHVpdCBcIiVzXCIgbmllIgorCisjOiBtYWluLmM6MjE1NworbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiTWVlciBpbmxpZ3RpbmcgbWV0OiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMTkwCittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIlts6mVyIC4uXSAgICAgICBiZXdlcmsgbOplcihzKSIKKworIzogbWFpbi5jOjIxOTEKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICBsZWVzIHRla3MgdWl0ICdzdGRpbiciCisKKyM6IG1haW4uYzoyMTkyCittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQgdGFnICAgICAgICAgIGJld2VyayBs6mVyIHdhYXIgZXRpa2V0IGdlZGVmaW5pZWVyIGlzIgorCisjOiBtYWluLmM6MjE5NAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2ZvdXRs6mVyXSAgIGJld2VyayBs6mVyIG1ldCBlZXJzdGUgZm91dCIKKworIzogbWFpbi5jOjIyMDMKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiZ2VicnVpazoiCisKKyM6IG1haW4uYzoyMjA2Cittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgIiB2aW0gW3BhcmFtZXRlcnNdICIKKworIzogbWFpbi5jOjIyMTAKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgb2Y6IgorCisjOiBtYWluLmM6MjIxMworbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJQYXJhbWV0ZXJzOlxuIgorCisjOiBtYWluLmM6MjIxNAorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0U2xlZ3MgbOplcm5hbWUgaGllcm5hIgorCisjOiBtYWluLmM6MjIxNgorbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdFJlZ2lzdHJlZXIgaGllcmRpZSBndmltIHZpciBPTEUiCisKKyM6IG1haW4uYzoyMjE3Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi11bnJlZ2lzdGVyXHRcdE9ucmVnaXN0cmVlciBndmltIHZpciBPTEUiCisKKyM6IG1haW4uYzoyMjIwCittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRWb2VyIHVpdCBtZXQgZGllIEdVSSAoc29vcyBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyMjIxCittc2dpZCAiLWZcdFx0XHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZlx0XHRcdFZvb3Jncm9uZDogTW9lbmllIHZ1cmsgd2FubmVlciBHVUkgYmVnaW4gbmllIgorCisjOiBtYWluLmM6MjIyMworbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIG1vZHVzIChzb29zIFwidmlcIikiCisKKyM6IG1haW4uYzoyMjI0Cittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0RXggbW9kdXMgKHNvb3MgXCJleFwiKSIKKworIzogbWFpbi5jOjIyMjUKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0U3RpbCAoYm9uZGVsKSBtb2R1cyAoc2xlZ3MgdmlyIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjI3Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdERpZmYgbW9kdXMgKHNvb3MgXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjIyOQorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0RWFzeSBtb2R1cyAoc29vcyBcImV2aW1cIiwgbW9kdXNsb29zKSIKKworIzogbWFpbi5jOjIyMzAKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdExlZXNhbGxlZW4gbW9kdXMgKHNvb3MgXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjIzMQorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHRCZXBlcmt0ZSBtb2R1cyAoc29vcyBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyMjMyCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHRWZXJhbmRlcmluZ3MgKHNrcnlmIHZhbiBs6mVycykgbmllIHRvZWdlbGFhdCBuaWUiCisKKyM6IG1haW4uYzoyMjMzCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0VmVyYW5kZXJpbmdzIGFhbiB0ZWtzIG5pZSB0b2VnZWxhYXQgbmllIgorCisjOiBtYWluLmM6MjIzNAorbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0Qmlu6nJlIG1vZHVzIgorCisjOiBtYWluLmM6MjIzNgorbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRcdExpc3AgbW9kdXMiCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHRWZXJzb2VuYmFhciBtZXQgVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjIyMzkKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHROaWUgdGVuIHZvbGxlIFZpLXZlcnNvZW5iYWFyIG5pZTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyMjQwCittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0T21zbGFndGlnaGVpZHNncmFhZCIKKworIzogbWFpbi5jOjIyNDEKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdE9udGZvdXRtb2R1cyIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdEdlZW4gcnVpbGzqZXIsIGdlYnJ1aWsgc2xlZ3MgZ2VoZXVlIgorCisjOiBtYWluLmM6MjI0MworbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdEx5cyBydWlsbOplcnMgZW4gdmVybGFhdCB2aW0iCisKKyM6IG1haW4uYzoyMjQ0Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIChtZXQgbOplciBuYWFtKVx0SGVyd2luIGluZWVuZ2VzdG9ydGUgc2Vzc2llIgorCisjOiBtYWluLmM6MjI0NQorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRTZWxmZGUgYXMgLXIiCisKKyM6IG1haW4uYzoyMjQ3Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdE1vZXQgbmllICduZXdjbGknIGdlYnJ1aWsgb20gdmVuc3RlciBvb3AgdGUgbWFhayBuaWUiCisKKyM6IG1haW4uYzoyMjQ4Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8dG9lc3RlbD5cdFx0R2VicnVpayA8dG9lc3RlbD4gdmlyIEkvTyIKKworIzogbWFpbi5jOjIyNTEKK21zZ2lkICItSFx0XHRcdHN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdGJlZ2luIGluIEhlYnJlZXVzZSBtb2R1cyIKKworIzogbWFpbi5jOjIyNTQKK21zZ2lkICItRlx0XHRcdHN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0YmVnaW4gaW4gRmFyc2kgbW9kdXMiCisKKyM6IG1haW4uYzoyMjU2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFhbD5cdFN0ZWwgdGVybWluYWFsdGlwZSBuYSA8dGVybWluYWFsPiIKKworIzogbWFpbi5jOjIyNTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRHZWJydWlrIDx2aW1yYz4gaW4gcGxhYXMgdmFuIGVuaWdlIGFuZGVyIC52aW1yYyIKKworIzogbWFpbi5jOjIyNTkKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx0R2VicnVpayA8Z3ZpbXJjPiBpbiBwbGFhcyB2YW4gZW5pZ2UgLmd2aW1yYyIKKworIzogbWFpbi5jOjIyNjEKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0TW9ldCBuaWUgaW5wcm9wc2tyaXB0ZSBsYWFpIG5pZSIKKworIzogbWFpbi5jOjIyNjIKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHRNYWFrIE4gdmVuc3RlcnMgb29wICh2ZXJzdGVrOiBlZW4gdmlyIGVsa2UgbOplcikiCisKKyM6IG1haW4uYzoyMjYzCittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0c29vcyAtbyBtYWFyIHZlcmRlZWwgdmVydGlrYWFsIgorCisjOiBtYWluLmM6MjI2NAorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdEJlZ2luIGJ5IGVpbmRlIHZhbiBs6mVyIgorCisjOiBtYWluLmM6MjI2NQorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG51bT5cdFx0QmVnaW4gYnkgcmXrbCA8bG51bT4iCisKKyM6IG1haW4uYzoyMjY3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPGJldmVsPlx0Vm9lciA8YmV2ZWw+IHVpdCB2b29yIGVuaWdlIC52aW1yYy1s6mVyIGdlbGFhaSB3b3JkIgorCisjOiBtYWluLmM6MjI2OQorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8YmV2ZWw+XHRcdFZvZXIgPGJldmVsPiB1aXQgbmEgZWVyc3RlIGzqZXIgZ2VsYWFpIGlzIgorCisjOiBtYWluLmM6MjI3MAorbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiIgorIi1TIDxzZXNzaWU+XHRcdFZvZXIgYmV2ZWxlIGluIGzqZXIgPHNlc3NpZT4gdWl0IG5hIGVlcnN0ZSBs6mVyIGdlbGFhaSBpcyIKKworIzogbWFpbi5jOjIyNzEKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2tyaXBpbj5cdFx0TGVlcyBOb3JtYWxlLW1vZHVzIGJldmVsZSB2YW4gbOplciA8c2tyaXBpbj4iCisKKyM6IG1haW4uYzoyMjcyCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNrcmlwdWl0Plx0TGFzIGFsbGUgZ2V0aWt0ZSBiZXZlbGUgYWFuIGJ5IGzqZXIgPHNrcmlwdWl0PiIKKworIzogbWFpbi5jOjIyNzMKK21zZ2lkICItVyA8c2NyaXB0b3V0Plx0V3JpdGUgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi1XIDxza3JpcHVpdD5cdFNrcnlmIGFsbGUgZ2V0aWt0ZSBiZXZlbGUgbmEgbOplciA8c2tyaXB1aXQ+IgorCisjOiBtYWluLmM6MjI3NQorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0QmV3ZXJrIGdl625rcmlwdGVlcmRlIGzqZXJzIgorCisjOiBtYWluLmM6MjI3OQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdEtvcHBlbCB2aW0gYWFuIGhpZXJkaWUgWC1iZWRpZW5lciIKKworIzogbWFpbi5jOjIyODEKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdE1vZXQgbmllIHZlcmJpbmRpbmcgbWV0IFgtYmVkaWVuZXIgbWFhayBuaWUiCisKKyM6IG1haW4uYzoyMjgzCittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0TWFhayBWaW0gaW4gJ24gYW5kZXIgR1RLIGVsZW1lbnQgb29wIgorCisjOiBtYWluLmM6MjI4NworbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlIDxs6mVycz5cdFd5c2lnIGRpZSA8bOplcnM+IGluIGEgVmltIGJlZGllbmVyIGVuIHZlcmxhYXQiCisKKyM6IG1haW4uYzoyMjg4Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxs6mVycz4gU29vcyAnLS1yZW1vdGUnLCBtYWFyIHdhZyB2aXIgbOplcnMgb20gZ2V3eXNpZ3RlIHdvcmQiCisKKyM6IG1haW4uYzoyMjg5Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXNlbmQgPHNsZXV0ZWxzPlx0U3R1dXIgPHNsZXV0ZWxzPiBuYSAnbiBWaW0tYmVkaWVuZXIgZW4gdmVybGFhdCIKKworIzogbWFpbi5jOjIyOTAKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICIiCisiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1ZWVyIDxleHByPiBpbiAnbiBWaW0tYmVkaWVuZXIgZW4gZHJ1ayByZXN1bHRhYXQiCisKKyM6IG1haW4uYzoyMjkxCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRMeXMgYmVza2lrYmFyZSBWaW0tYmVkaWVuZXIgbmFtZSBlbiB2ZXJsYWF0IgorCisjOiBtYWluLmM6MjI5MgorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxuYWFtPlx0U3R1dXIgbmEvd29yZCBkaWUgVmltLWJlZGllbmVyIDxuYWFtPiIKKworIzogbWFpbi5jOjIyOTUKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0R2VicnVpayA8dmltaW5mbz4gaW4gcGxhYXMgdmFuIC52aW1pbmZvIgorCisjOiBtYWluLmM6MjI5NworbXNnaWQgIi1oXHRcdFx0cHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWhcdFx0XHRza3J5ZiBIdWxwIChoaWVyZGllIGJvb2Rza2FwKSBlbiBzbHVpdCIKKworIzogbWFpbi5jOjIyOTgKK21zZ2lkICItLXZlcnNpb25cdFx0cHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdHNrcnlmIHdlZXJnYXdlLWlubGlndGluZyBlbiBzbHVpdCIKKworIzogbWFpbi5jOjIzMDIKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQYXJhbWV0ZXJzIGRldXIgZ3ZpbSBoZXJrZW4gKE1vdGlmIHdlZXJnYXdlKTpcbiIKKworIzogbWFpbi5jOjIzMDUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUGFyYW1ldGVycyBkZXVyIGd2aW0gaGVya2VuIChBdGhlbmEgd2Vlcmdhd2UpOlxuIgorCisjOiBtYWluLmM6MjMwOAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Vm9lciB2aW0gb3AgPGRpc3BsYXk+IHVpdCIKKworIzogbWFpbi5jOjIzMDkKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0QmVnaW4gdmltIGFzIGlrb29uIgorCisjOiBtYWluLmM6MjMxMQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYW1lPlx0XHRHZWJydWlrIGh1bHBicm9uIGFzb2YgdmltIDxuYW1lPiB3YXMiCisKKyM6IG1haW4uYzoyMzEyCittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAoTm9nIG5pZSBnZe9tcGxlbWVudGVlciBuaWUpXG4iCisKKyM6IG1haW4uYzoyMzE0Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8a2xldXI+XHRHZWJydWlrIDxrbGV1cj4gdmlyIGRpZSBhZ3Rlcmdyb25kIChvb2s6IC1iZykiCisKKyM6IG1haW4uYzoyMzE1Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItdm9vcmdyb25kIDxrbGV1cj5cdEdlYnJ1aWsgPGtsZXVyPiB2aXIgbm9ybWFsZSB0ZWtzIChvb2s6IC1mZykiCisKKyM6IG1haW4uYzoyMzE2IG1haW4uYzoyMzM2Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdFx0R2VicnVpayA8Zm9udD4gdmlyIG5vcm1hbGUgdGVrcyAob29rIC1mbikiCisKKyM6IG1haW4uYzoyMzE3Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICKtYm9sZGZvbnQgPGZvbnQ+XHQgR2VicnVpayA8Zm9udD4gdmlyIHZldGxldHRlciB0ZWtzIgorCisjOiBtYWluLmM6MjMxOAorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxmb250Plx0R2VicnVpayA8Zm9udD4gdmlyIGt1cnNpZXdlIHRla3MiCisKKyM6IG1haW4uYzoyMzE5IG1haW4uYzoyMzM3Cittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHRHZWJydWlrIDxnZW9tPiB2aXIgYWFudmFua2xpa2UgZ2VvbWV0cmllIgorCisjOiBtYWluLmM6MjMyMAorbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDx3eWR0ZT5cdEdlYnJ1aWsgJ24gZ3JlbnN3eWR0ZSB2YW4gPHd5ZHRlPiAob29rOiAtYncpIgorCisjOiBtYWluLmM6MjMyMQorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiIgorIi1zY3JvbGxiYXJ3aWR0aCA8d3lkdGU+XHRHZWJydWlrICduIHJvbHN0YWFmd3lkdGUgdmFuIDx3eWR0ZT4gKG9vazogLXN3PiIKKworIzogbWFpbi5jOjIzMjMKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICIiCisiLW1lbnVoZWlnaHQgPGhvb2d0ZT5cdEdlYnJ1aWsgYSBraWVzbHlzc3RhYWZob29ndGUgdmFuIDxob29ndGU+IChvb2s6IC1taCkiCisKKyM6IG1haW4uYzoyMzI1IG1haW4uYzoyMzM4Cittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdEdlYnJ1aWsgdHJ1LXZpZGVvIChvb2s6IC1ydikiCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdE1vZXQgbmllIHRydS12aWRlbyBnZWJydWlrIG5pZSAob29rOiArcnYpIgorCisjOiBtYWluLmM6MjMyNworbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPGh1bHBicm9uPlx0U3RlbCBkaWUgZ2VzcGVzaWZpc2VlcmRlIGh1bHBicm9uIgorCisjOiBtYWluLmM6MjMzMAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUGFyYW1ldGVycyB3YXQgZ3ZpbSB2ZXJzdGFhbiAoUklTQyBPUyB3ZWVyZ2F3ZSk6XG4iCisKKyM6IG1haW4uYzoyMzMxCittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPGFhbnRhbD5cdEFhbnZhbmtsaWtlIHd5ZHRlIHZhbiB2ZW5zdGVyIGluIGtvbG9tbWUiCisKKyM6IG1haW4uYzoyMzMyCittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxhYW50YWw+XHRBYW52YW5rbGlrZSBob29ndGUgdmFuIHZlbnN0ZXIgaW4gcnllIgorCisjOiBtYWluLmM6MjMzNQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChHVEsrIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUGFyYW1ldGVycyB3YXQgZ3ZpbSB2ZXJzdGFhbiAoR1RLKyB3ZWVyZ2F3ZSk6XG4iCisKKyM6IG1haW4uYzoyMzM5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPHNrZXJtPlx0Vm9lciB2aW0gb3AgPHNrZXJtPiB1aXQ6IChvb2sgLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLWhlbHBcdFx0U2hvdyBHbm9tZSBhcmd1bWVudHMiCittc2dzdHIgIi0taGVscFx0XHRXeXMgR25vbWUgcGFyYW1ldGVycyIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI1NjYKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJTdHV1ciBoZXQgZ2VmYWFsLlxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI1NzEKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiIgorIlxuIgorIlN0dXVyIGhldCBnZWZhYWwuIFByb2JlZXIgb20gbG9rYWFsIHVpdCB0ZSB2b2VyXG4iCisKKyM6IG1haW4uYzoyNjA0IG1haW4uYzoyNjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQgdmFuICVkIGzqZXJzIGJld2VyayIKKworIzogbWFpbi5jOjI2NDgKK21zZ2lkICJTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICJTdHV1ciB2YW4gdWl0ZHJ1a2tpbmcgaGV0IGdlZmFhbC5cbiIKKworIzogbWFyay5jOjY2MAorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiR2VlbiBtZXJrZXJzIGdlc3RlbCBuaWUiCisKKyM6IG1hcmsuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBHZWVuIG1lcmtlcnMgcGFzIG9wIFwiJXNcIiBuaWUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjY3MworbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJtZXJrIHJl62wgICBrb2wgbOplci90ZWtzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MTEKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBzcHJpbmcgcmXrbCBrb2wgbOplci90ZWtzIgorCisjOiBtYXJrLmM6MTA3MworbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEzqZXJtZXJrZXJzOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDgKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgU3ByaW5nbHlzIChudXV0c3RlIGVlcnN0ZSk6XG4iCisKKyM6IG1hcmsuYzoxMjAzCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBHZXNraWVkZW5pcyB2YW4gbWVya2VycyBpbiBs6mVycyAobnV1dHN0ZSB0b3Qgb3Vkc3RlKTpcbiIKKworIzogbWFyay5jOjEyODYKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiT250YnJla2VuZGUgJz4nIgorCisjOiBtYnl0ZS5jOjM5NQorbXNnaWQgIk5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJOaWUgJ24gZ2VsZGlnZSBrb2RlYmxhZCBuaWUiCisKKyM6IG1ieXRlLmM6MzAxNAorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBLYW4gbmllIElDIHdhYXJkZXMgc3RlbCBuaWUiCisKKyM6IG1ieXRlLmM6MzE2NgorbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogR2VmYWFsIG1ldCBkaWUgc2tlcCB2YW4gaW52b2Vya29udGVrcyIKKworIzogbWJ5dGUuYzozMzEzCittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiBHZWZhYWwgb20gaW52b2VybWV0b2RlIG9vcCB0ZSBtYWFrIgorCisjOiBtYnl0ZS5jOjMzMjQKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IFdhYXJza3V3aW5nOiBLb24gbmllIHVpdHdpcy10ZXJ1Z3JvZXAgbmEgSU0gc3RlbCBuaWUiCisKKyM6IG1ieXRlLmM6MzMzMAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBpbnZvZXJtZXRvZGUgb25kZXJzdGV1biBnZWVuIHN0eWwgbmllIgorCisjOiBtYnl0ZS5jOjMzODcKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogaW52b2VybWV0b2RlIG9uZGVyc3RldW4gbmllIG15IHZvb3ItYmV3ZXJraW5nIHRpcGUgbmllIgorCisjOiBtYnl0ZS5jOjM0NjEKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IG9vci1kaWUtcGxlayBzdHlsIHZlcmVpcyBmb250c3RlbCIKKworIzogbWJ5dGUuYzozNDg5Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBKb3UgR1RLKyBpcyBvdWVyIGFzIDEuMi4zLiBTdGF0dXNhcmVhIGFmZ2Vza2FrZWwiCisKKyM6IG1ieXRlLmM6MzcyNgorbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IEludm9lcm1ldG9kZWJlZGllbmVyIHZvZXIgbmllIHVpdCBuaWUiCisKKyM6IG1lbWZpbGUuYzo0NzMKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogYmxvayB3YXMgbmllIGdlc2x1aXQgbmllIgorCisjOiBtZW1maWxlLmM6OTcyCittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogU29la2ZvdXQgaW4gbGVlcyB2YW4gcnVpbGzqZXIiCisKKyM6IG1lbWZpbGUuYzo5NzcKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogTGVlc2ZvdXQgaW4gcnVpbGzqZXIiCisKKyM6IG1lbWZpbGUuYzoxMDI5Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IFNvZWtmb3V0IGluIHNrcnlmIHZhbiBydWlsbOplciIKKworIzogbWVtZmlsZS5jOjEwNDcKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IFNrcnlmZm91dCBpbiBydWlsbOplciIKKworIzogbWVtZmlsZS5jOjEyNDQKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IFJ1aWxs6mVyIGJlc3RhYW4gYWxyZWVkcyEgKCdzeW1saW5rJyBwcm9ibGVlbT8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogSGV0IG5pZSBibG9rIG5vIDAgZ2VrcnkgbmllPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IEhldCBuaWUgYmxvayBubyAxIGdla3J5IG5pZT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiBIZXQgbmllIGJsb2sgbm8gMiBnZWtyeSBuaWU/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiBIaWVydCwgZGllIHJ1aWxs6mVyIGlzIHdlZyEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBLb24gbmllIHJ1aWxs6mVyIHZlcm5vZW0gbmllIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiBLb24gbmllIHJ1aWxs6mVyIG9vcG1hYWsgdmlyIFwiJXNcIiBuaWUsIGhlcndpbm5pbmcgb25tb29udGxpayIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6ICdtbF90aW1lc3RhbXAnOiBIZXQgbmllIGJsb2sgMCBnZWtyeSBuaWU/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBHZWVuIHJ1aWxs6mVyIGdldmluZCB2aXIgJXMgbmllIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiVGlrIGRpZSBub21tZXIgdmFuIGRpZSBydWlsbOplciBvbSB0ZSBnZWJydWlrICgwIG9tIHRlIHN0b3ApIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiBLYW4gJXMgbmllIG9vcG1hYWsgbmllIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiS2FuIG5pZSBibG9rIDAgbGVlcyB2YW5hZiAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiVmltIGhldCBkaWUgcnVpbGzqZXIgbmllIG9wZ2VkYXRlZXIgbmllLiBEYWxrIHdhcyBuaWtzIHZlcmFuZGVyIG5pZS4iCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiBrYW4gbmllIGdlYnJ1aWsgd29yZCBtZXQgaGllcmRpZSB3ZWVyZ2F3ZSB2YW4gVmltIG5pZS5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIkdlYnJ1aWsgVmltIHdlZXJnYXdlIDMuMC5cbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyBseWsgbmllIHNvb3MgJ24gVmltIHJ1aWxs6mVyIG5pZSIKKworIzogbWVtbGluZS5jOjg2OAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIgorbXNnc3RyICIga2FuIG5pZSBnZWJydWlrIHdvcmQgb3AgaGllcmRpZSByZWtlbmFhciBuaWUuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIkRpZSBs6mVyIGlzIGdlc2tlcCBvcCAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIm9mIGRpZSBs6mVyIGlzIGJlc2thZGlnLiIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICJHZWJydWlrIHJ1aWxs6mVyIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiT29yc3Byb25rbGlrZSBs6mVyIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkzNAorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiBXYWFyc2t1d2luZzogT29yc3Byb25rbGlrZSBs6mVyIGlzIGRhbGsgZ2V3eXNpZyIKKworIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IEthbiBuaWUgYmxvY2sgMSBsZWVzIHZhbiAlcyIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/QkFJRSBSRctMUyBXRUciCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz9SRctMVEVMTElORyBGT1VUSUVGIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9MRcsgQkxPSyIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9SRctMUyBXRUciCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBCbG9rIDEgc2UgSUQgaXMgZm91dGllZiAoJXMgbmllICduIC5zd3AgbOplciBuaWU/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CTE9LIFdFRyIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gdmFuIGhpZXIgdG90ID8/P0VORCBtYWcgcmXrbHMgZGV1cm1la2FhciB3ZWVzIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IHZhbiBoaWVyIHRvdCA/Pz9FTkQgbWFnIGRhYXIgcmXrbHMgaW5nZXZvZWcvZ2Vza3JhcCB3ZWVzIgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/RU5EIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiBIZXJ3aW5uaW5nIG9uZGVyYnJlZWsiCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IEZvdXRlIHJhYWtnZXNpZW4gZ2VkdXJlbmRlIGhlcndpbm5pbmc7IHNvZWsgdmlyIHJl62xzIHdhdCBiZWdpbiBtZXQgPz8/IgorCisjOiBtZW1saW5lLmM6MTE0OAorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAiSGVyd2lubmluZyBpcyBrbGFhci4gS3lrIG9mIGFsbGVzIHJlZyBpcy4iCisKKyM6IG1lbWxpbmUuYzoxMTQ5Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKEp5IHdpbCBkYWxrIGRpZSBs6mVyIHN0b29yIG9uZGVyICduIGFuZGVyIG5hYW1cbiIKKworIzogbWVtbGluZS5jOjExNTAKK21zZ2lkICJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIKK21zZ3N0ciAiZW4gZGl0IFwiZGlmZlwiIHRlZW4gZGllIG9vcnNwcm9ua2xpa2UgbOplciBvbSB3eXNpZ2luZ3MgdGUgc29laylcbiIKKworIzogbWVtbGluZS5jOjExNTEKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIlZlcnd5ZGVyIGRpZSAuc3dwLWzqZXIgbmEgZGllIHR5ZC5cbiIKKyJcbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMjA3Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIlJ1aWxs6mVycyBnZXZpbmQ6IgorCisjOiBtZW1saW5lLmM6MTM4NQorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICBJbiBodWlkaWdlIGdpZHM6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzg3Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIFdhdCBnZXNwZXNpZmlzZWVyZGUgbmFhbSBnZWJydWlrOlxuIgorCisjOiBtZW1saW5lLmM6MTM5MQorbXNnaWQgIiAgIEluIGRpcmVjdG9yeSAiCittc2dzdHIgIiAgIEluIGdpZHMgIgorCisjOiBtZW1saW5lLmM6MTQwOQorbXNnaWQgIiAgICAgIC0tIG5vbmUgLS1cbiIKK21zZ3N0ciAiICAgICAgLS0gZ2VlbiAtLVxuIgorCisjOiBtZW1saW5lLmM6MTQ4MQorbXNnaWQgIiAgICAgICAgICBvd25lZCBieTogIgorbXNnc3RyICIgICAgICAgICAgZWllbmFhcjogIgorCisjOiBtZW1saW5lLmM6MTQ4MworbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgIGdlZGF0ZWVyOiAiCisKKyM6IG1lbWxpbmUuYzoxNDg3IG1lbWxpbmUuYzozNjgwCittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICAgICBnZWRhdGVlcjogIgorCisjOiBtZW1saW5lLmM6MTUwMworbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgIFt2YW4gVmltIHdlZXJnYXdlIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTA3Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbbHlrIG5pZSBzb29zICduIFZpbSBydWlsbOplciBuaWVdIgorCisjOiBtZW1saW5lLmM6MTUxMQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICBs6mVybmFhbTogIgorCisjOiBtZW1saW5lLmM6MTUyMworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICBnZXd5c2lnOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiWUVTIgorbXNnc3RyICJKQSIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICJubyIKK21zZ3N0ciAibmVlIgorCisjOiBtZW1saW5lLmM6MTUyOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIGdlYnJ1aWtlcnNuYWFtOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM1Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIGdhc2hlZXJuYWFtOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgZ2FzaGVlcm5hYW06ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBwcm9zZXMgSUQ6ICIKKworIzogbWVtbGluZS5jOjE1NDkKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKG5vZyBzdGVlZHMgYWFuIGRpZSB1aXR2b2VyKSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuaWUgYnJ1aWtiYWFyIG1ldCBoaWVyZGllIHdlZXJnYXdlIHZhbiBWaW0gbmllXSIKKworIzogbWVtbGluZS5jOjE1NjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbbmllIGJydWlrYmFhciBvcCBoaWVyZGllIHJla2VuYWFyIG5pZV0iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW2thbiBuaWUgZ2VsZWVzIHdvcmQgbmllXSIKKworIzogbWVtbGluZS5jOjE1NzMKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFtrYW4gbmllIG9vcGdlbWFhayB3b3JkIG5pZV0iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IEthbiBuaWUgYmV3YWFyIG5pZSwgZGFhciBpcyBnZWVuIHJ1aWxs6mVyIG5pZSIKKworIzogbWVtbGluZS5jOjE4MTYKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAiTOplciBiZXdhYXIiCisKKyM6IG1lbWxpbmUuYzoxODE4Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBLb24gbmllIGJld2FhciBuaWUiCisKKyM6IG1lbWxpbmUuYzoxODg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6ICdtbF9nZXQnOiBvbmdlbGRpZ2UgJ2xudW0nOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6ICdtbF9nZXQnOiBrYW4gcmXrbCAlbGQgbmllIHZpbmQgbmllIgorCisjOiBtZW1saW5lLmM6MjMwMworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzogd3lzZXIgYmxvayBpZCB2ZXJrZWVyZCAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAiJ3N0YWNrX2lkeCcgbW9ldCAwIHdlZXMiCisKKyM6IG1lbWxpbmUuYzoyNDQ1Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBUZSB2ZWVsIGJsb2trZSBvcGdlZGF0ZWVyPyIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IHd5c2VyIGJsb2sgaWQgdmVya2VlcmQgNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJ2ZXJ3eWRlciBibG9rIDE/IgorCisjOiBtZW1saW5lLmM6MjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogS2FuIG5pZSByZetsICVsZCB2aW5kIG5pZSIKKworIzogbWVtbGluZS5jOjMwNzIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiB3eXNlciBibG9rIGlkIHZlcmtlZXJkIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAiJ3BlX2xpbmVfY291bnQnIGlzIG51bCIKKworIzogbWVtbGluZS5jOjMxMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiByZetsbm9tbWVyIGJ1aXRlIHBlcmtlOiAlbGQgdmVyYnkgZGllIGVpbmRlIgorCisjOiBtZW1saW5lLmM6MzEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzogcmXrbHRlbGxpbmcgbWFnIHZlcmtlZXJkIHdlZXMgaW4gYmxvayAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTcwCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIlN0YXBlbCBncm9vdHRlIHZlcmhvb2ciCisKKyM6IG1lbWxpbmUuYzozMjE2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiB3eXNlciBibG9rIGlkIHZlcmtlZXJkIDIiCisKKyM6IG1lbWxpbmUuYzozNjcwCittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiBMRVQgT1AiCisKKyM6IG1lbWxpbmUuYzozNjcxCittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisiSGV0ICduIHJ1aWxs6mVyIGdldmluZCBtZXQgZGllIG5hYW0gXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJUeWRlbnMgb29wbWFhayB2YW4gbOplciBcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgTlVXRVIgYXMgZGllIHJ1aWxs6mVyIVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjg4Cittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpICduIEFuZGVyIHByb2dyYW0gbWFnIGJlc2lnIHdlZXMgbWV0IGhpZXJkaWUgbOplci5cbiIKKyIgICAgSW5kaWVuIHdlbCwgcGFzIG9wIG9tIG5pZSBtZXQgdHdlZSB2ZXJza2lsbGVuZGUgd2Vlcmdhd2VzXG4iCisiICAgIHZhbiBkaWVzZWxmZGUgbOplciB0ZSBzaXQgd2FubmVlciB2ZXJhbmRlcmluZ2UgZ2VtYWFrIHdvcmQgbmllLlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBTdG9wLCBvZiBnYWFuIHZlcnNpZ3RpZyB2b29ydC5cbiIKKworIzogbWVtbGluZS5jOjM2OTAKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgJ24gQmV3ZXJraW5nc2Vzc2llIHZhbiBoaWVyZGllIGzqZXIgaGV0IGluZWVuZ2VzdG9ydC5cbiIKKworIzogbWVtbGluZS5jOjM2OTEKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICBJbmRpZW4gd2VsLCBnZWJydWlrIFwiOnJlY292ZXJcIiBvZiBcInZpbSAtciIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBvbSBkaWUgdmVyYW5kZXJpbmdlIHRlIGhlcndpbiAoc2llbiBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICBJbmRpZW4gankgZGl0IGFscmVlZHMgZ2Vkb2VuIGhldCwgdmVyd3lkZXIgZGllIHJ1aWxs6mVyIFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBvbSBoaWVyZGllIGJvb2Rza2FwIHRlIHZlcm15LlxuIgorCisjOiBtZW1saW5lLmM6MzcxMCBtZW1saW5lLmM6MzcxNAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiUnVpbGzqZXIgXCIiCisKKyM6IG1lbWxpbmUuYzozNzExIG1lbWxpbmUuYzozNzE3Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiBiZXN0YWFuIGFscmVlZHMhIgorCisjOiBtZW1saW5lLmM6MzcyMAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gTEVUIE9QIgorCisjOiBtZW1saW5lLmM6MzcyMgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlJ1aWxs6mVyIGJlc3RhYW4gYWxyZWVkcyEiCisKKyM6IG1lbWxpbmUuYzozNzI2Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXQiCittc2dzdHIgIiIKKyImTWFhayBhcyBsZWVzLWFsbGVlbiBvb3BcbiIKKyImQmV3ZXJrIGluIGVsayBnZXZhbFxuIgorIiZIZXJ3aW5cbiIKKyImU3RvcCIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImTWFhayBhcyBsZWVzLWFsbGVlbiBvb3BcbiIKKyImQmV3ZXJrIGluIGVsayBnZXZhbFxuIgorIiZIZXJ3aW5cbiIKKyImU3RvcFxuIgorIlMma3JhcCBkaXQiCisKKyM6IG1lbWxpbmUuYzozNzgxCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogVGUgdmVlbCBydWlsbOplcnMgZ2V2aW5kIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogRGVlbCB2YW4ga2llc2x5cy1pdGVtIHBhZCBpcyBuaWUgJ24gc3ViLWtpZXNseXMgbmllIgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogS2llc2x5cyBiZXN0YWFuIHNsZWdzIGluICduIGFuZGVyIG1vZHVzIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogR2VlbiBraWVzbHlzIG1ldCBkYWFyZGllIG5hYW0gbmllIgorCisjOiBtZW51LmM6NTAzCittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogS2llc2x5c3BhZCBtb2VuaWUgbGVpIG5hICduIHN1Yi1raWVzbHlzIG5pZSIKKworIzogbWVudS5jOjU0MgorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBNb2VuaWUga2llc2x5c2l0ZW1zIGRpcmVrIGJ5IGtpZXNseXNzdGFhZiB2b2VnIG5pZSIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogVmVyZGVsZXIga2FuIG5pZSBkZWVsIHdlZXMgdmFuIGtpZXNseXNwYWQgbmllIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDYzCittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS2llc2x5c3RlIC0tLSIKKworIzogbWVudS5jOjE5ODkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIlNrZXVyIGRpZSBraWVzbHlzIGFmIgorCisjOiBtZW51LmM6MjA1NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IEtpZXNseXNwYWQgbW9ldCBsZWkgbmEgJ24ga2llc2x5c2l0ZW0iCisKKyM6IG1lbnUuYzoyMDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogS2llc2x5cyBuaWUgZ2V2aW5kIG5pZTogJXMiCisKKyM6IG1lbnUuYzoyMTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IEtpZXNseXMgbmllIGdlZGVmaW5pZWVyIHZpciAlcyBtb2R1cyBuaWUiCisKKyM6IG1lbnUuYzoyMTgxCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBLaWVzbHlzcGFkIG1vZXQgbGVpIG5hICduIHN1Yi1raWVzbHlzIgorCisjOiBtZW51LmM6MjIwMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogS2llc2x5cyBuaWUgZ2V2aW5kIG5pZSAtIG1hYWsgc2VrZXIgb29yIGRpZSBraWVzbHlzIG5hbWUiCisKKyM6IG1lc3NhZ2UuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIkZvdXQgb250ZGVrIHR5ZGVucyB2ZXJ3ZXJraW5nIHZhbiAlczogIgorCisjOiBtZXNzYWdlLmM6NDgzCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgInJl62wgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1MjMKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW3N0cmluZyB0ZSBsYW5rXSIKKworIzogbWVzc2FnZS5jOjY2OQorbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICJCb29kc2thcHBlIG9uZGVyaG91ZXJzOiBEYW5pZSBSb3V4IGVuIEplYW4gSm9yZGFhbiA8ZHJvdXhAdHVrcy5jby56YT4iCisKKyM6IG1lc3NhZ2UuYzo4ODEKK21zZ2lkICJJbnRlcnJ1cHQ6ICIKK21zZ3N0ciAiT25kZXJicmVlazogIgorCisjOiBtZXNzYWdlLmM6ODg0Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICJEcnVrIEVOVEVSIG9tIHZvb3J0IHRlIGdhYW4iCisKKyM6IG1lc3NhZ2UuYzo4ODYKK21zZ2lkICJIaXQgRU5URVIgb3IgdHlwZSBjb21tYW5kIHRvIGNvbnRpbnVlIgorbXNnc3RyICJEcnVrIEVOVEVSIG9mIHRpayAnbiBiZXZlbCBvbSB2b29ydCB0ZSBnYWFuIgorCisjOiBtZXNzYWdlLmM6MTk0MAorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIE1lZXIgLS0iCisKKyM6IG1lc3NhZ2UuYzoxOTQzCittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IHJl62wsIFNQQUNFL2I6IGJsYWRzeSwgZC91OiBoYWx3ZSBibGFkc3ksIHE6IGxvcyBkaXQiCisKKyM6IG1lc3NhZ2UuYzoxOTQ0Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDogcmXrbCwgU1BBQ0U6IGJsYWRzeSwgZDogaGFsd2UgYmxhZHN5LCBxOiBsb3MgZGl0IgorCisjOiBtZXNzYWdlLmM6MjQxOSBtZXNzYWdlLmM6MjQzNAorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJWcmFhZyIKKworIzogbWVzc2FnZS5jOjI0MjEKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZKYVxuIgorIiZOZWUiCisKKyM6IG1lc3NhZ2UuYzoyNDM2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkphXG4iCisiJk5lZVxuIgorIiZLYW5zZWxsZWVyIgorCisjOiBtZXNzYWdlLmM6MjQ1NAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZKYVxuIgorIiZOZWVcbiIKKyJTdG9vciAmYWxsZXNcbiIKKyImR29vaSBhbGxlcyB3ZWdcbiIKKyImS2Fuc2VsbGVlciIKKworIzogbWVzc2FnZS5jOjI0OTQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICJTdG9vciBM6mVyIGRpYWxvb2dob2traWUiCisKKyM6IG1lc3NhZ2UuYzoyNDk2Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiTWFhayBs6mVyIG9vcCBkaWFsb29naG9ra2llIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI1NDcKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogSmFtbWVyLCBs6mVyYmxhYWllciBuaWUgYmVza2lrYmFhciBpbiBrb25zb2xlLW1vZHVzIG5pZSIKKworIzogbWlzYzEuYzoyNDQ5Cittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogV2FhcnNrdXdpbmc6IEp5IHd5c2lnIGFhbiAnbiBsZWVzYWxsZWVuIGzqZXIiCisKKyM6IG1pc2MxLmM6MjY3OAorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICIxIHJl62wgbWVlciIKKworIzogbWlzYzEuYzoyNjgwCittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIjEgcmXrbCBtaW5kZXIiCisKKyM6IG1pc2MxLmM6MjY4NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiJWxkIG1lZXIgcmXrbHMiCisKKyM6IG1pc2MxLmM6MjY4NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIiVsZCBtaW5kZXIgcmXrbHMiCisKKyM6IG1pc2MxLmM6MjY5MAorbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKE9uZGVyYnJlZWspIgorCisjOiBtaXNjMS5jOjYyNDUKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiBiZXdhYXIgbOplcnMuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjYyNTUKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IEtsYWFyLlxuIgorCisjOiBtaXNjMi5jOjY0NyBtaXNjMi5jOjY2MworbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIkZPVVQ6ICIKKworIzogbWlzYzIuYzo2NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbZ3JlcGVdIHRvdGFhbCAnYWxsb2MnLXZyeWdlbGFhdCAlbHUtJWx1LCBpbiBnZWJydWlrICVsdSwgcGlla2dlYnJ1aWsgJWx1XG4iCisKKyM6IG1pc2MyLmM6NjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIltyb2VwZV0gdG90YWFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbGUgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCisKKyM6IG1pc2MyLmM6NzI0Cittc2dpZCAiRTM0MDogTGluZSBpcyBiZWNvbWluZyB0b28gbG9uZyIKK21zZ3N0ciAiRTM0MDogUutlbCB3b3JkIHRlIGxhbmsiCisKKyM6IG1pc2MyLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiBJbnRlcm5lIGZvdXQ6ICdsYWxsb2MoJWxkLCApJyIKKworIzogbWlzYzIuYzo4NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IEdlaGV1ZSBpcyBvcCEgKGtlbiAlbHUgZ3JlcGUgdG9lKSIKKworIzogbWlzYzIuYzoyNTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJSb2VwIGRvcCBvbSB1aXQgdGUgdm9lcjogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI3MDYgbWlzYzIuYzo1MTQ4IG9wdGlvbi5jOjQ1ODQKK21zZ2lkICJNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJPbnRicmVrZW5kZSBkdWJiZWxwdW50IgorCisjOiBtaXNjMi5jOjI3MDggbWlzYzIuYzoyNzM1Cittc2dpZCAiSWxsZWdhbCBtb2RlIgorbXNnc3RyICJPbmdlbGRpZ2UgbW9kdXMiCisKKyM6IG1pc2MyLmM6Mjc3NAorbXNnaWQgIklsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiT25nZWxkaWdlIG11aXN2b3JtIgorCisjOiBtaXNjMi5jOjI4MTQgbWlzYzIuYzo1MTY4Cittc2dpZCAiZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgInN5ZmVyIHZlcndhZyIKKworIzogbWlzYzIuYzoyODE5Cittc2dpZCAiSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJPbmdlbGRpZ2UgcGVyc2VudGFzaWUiCisKKyM6IG1pc2MyLmM6MzEyMworbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIlZvZXIgZW5rcmlwc2llLXNsZXV0ZWwgaW46ICIKKworIzogbWlzYzIuYzozMTI0Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiVm9lciBkaWUgc2xldXRlbCB3ZWVyIGluOiAiCisKKyM6IG1pc2MyLmM6MzEzNAorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICJTbGV1dGVscyB2ZXJza2lsISIKKworIzogbWlzYzIuYzozNjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICIiCisiRTM0MzogT25nZWxkaWdlIHBhZDogJyoqW25vbW1lcl0nIG1vZXQgYWFuIGRpZSBlaW5kZSB2YW4gJ24gcGFkIHdlZXMgb2YgIgorImdldm9sZyB3ZWVzIGRldXIgJXMnLiIKKworIzogbWlzYzIuYzo0OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IEthbiBuaWUgZ2lkcyBcIiVzXCIgaW4gJ2NkcGF0aCcgdmluZCBuaWUiCisKKyM6IG1pc2MyLmM6NDkwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IEthbiBs6mVyIFwiJXNcIiBuaWUgdmluZCBpbiBwYWQgbmllIgorCisjOiBtaXNjMi5jOjQ5MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogR2VlbiBnaWRzIFwiJXNcIiBtZWVyIGdldmluZCBpbiAnY2RwYXRoJyBuaWUiCisKKyM6IG1pc2MyLmM6NDkxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IEdlZW4gbOplciBcIiVzXCIgbWVlciBnZXZpbmQgaW4gcGFkIG5pZSIKKworIzogbWlzYzIuYzo1MTYwCittc2dpZCAiSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIk9uZ2VsZGlnZSBrb21wb25lbnQiCisKKyM6IG5vcm1hbC5jOjI4MTMKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJXYWFyc2t1d2luZzogdGVybWluYWFsIGthbiBuaWUgdGVrcyB1aXRsaWcgbmllIgorCisjOiBub3JtYWwuYzozMDA4Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogR2VlbiBzdHJpbmcgb25kZXIgbG9wZXIgbmllIgorCisjOiBub3JtYWwuYzozMDEwCittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IEdlZW4gaWRlbnRpZmlzZWVyZGVyIG9uZGVyIGxvcGVyIG5pZSIKKworIzogbm9ybWFsLmM6NDE3NQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiBLYW4gbmllIHZvdWUgdmVyd3lkZXIgbWV0IGh1aWRpZ2UgJ2ZvbGRtZXRob2QnIG5pZSIKKworIyBIZXQgdGUgZG9lbiBtZXQgPCBlbiA+CisjOiBvcHMuYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICIxIHJl62wgMSBrZWVyIGdlLSVzIgorCisjOiBvcHMuYzoyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIjEgcmXrbCBnZS0lcyAlZCBrZWVyIgorCisjOiBvcHMuYzoyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQgcmXrbHMgMSBrZWVyIGdlLSVzIgorCisjOiBvcHMuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCByZetscyBnZS0lcyAlZCBrZWVyIgorCisjOiBvcHMuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIiVsZCByZetscyBvbSBpbiB0ZSBrZWVwLi4uIgorCisjOiBvcHMuYzo2ODgKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxIHJl62wgaW5nZWtlZXAgIgorCisjOiBvcHMuYzo2OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGluZGVudGVkICIKK21zZ3N0ciAiJWxkIHJl62xzIGluZ2VrZWVwICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE1MjgKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAia2FuIG5pZSBwbHVrIG5pZTogdmVyd3lkZXIgaW4gZWxrIGdldmFsIgorCisjOiBvcHMuYzoyMDE4Cittc2dpZCAiMSBsaW5lIH5lZCIKK21zZ3N0ciAiMSByZetsIGdlLX4iCisKKyM6IG9wcy5jOjIwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIH5lZCIKK21zZ3N0ciAiJWxkIHJl62xzIGdlLX4iCisKKyM6IG9wcy5jOjIzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgImxhYXQgJWxkIHJl62xzIGdhYW4iCisKKyM6IG9wcy5jOjI2NTgKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICIxIHJl62wgZ2VwbHVrIgorCisjOiBvcHMuYzoyNjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB5YW5rZWQiCittc2dzdHIgIiVsZCByZetscyBnZXBsdWsiCisKKyM6IG9wcy5jOjI5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogTmlrcyBpbiByZWdpc3RlciAlcyBuaWUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6MzQ1NAorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorCisjOiBvcHMuYzo0NTY1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJPbmdlbGRpZ2UgcmVnaXN0ZXJuYWFtIgorCisjOiBvcHMuYzo0NjQ1Cittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCisKKyM6IG9wcy5jOjQ2NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJPbmJla2VuZGUgcmVnaXN0ZXJ0aXBlICVkIgorCisjOiBvcHMuYzo1MDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogT25nZWxkaWdlIHJlZ2lzdGVybmFhbTogJyVzJyIKKworIzogb3BzLmM6NTM5MworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICIlbGQgS29sb21tZTsgIgorCisjOiBvcHMuYzo1NDAwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiJXMlbGQgdmFuICVsZCByZetscyBnZWtpZXM7ICVsZCB2YW4gJWxkIFdvb3JkZTsgJWxkIHZhbiAlbGQgR3JlcGUiCisKKyMgbmpqOiBLYXJha3RlcnMga2FuIG1lZXJkZXJlIGdyZXBlIHdlZXMsIHNpZW4gJzpoIG11bHRpYnl0ZScKKyM6IG9wcy5jOjU0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICJLb2wgJXMgdmFuICVzOyBSZetsICVsZCB2YW4gJWxkOyBXb29yZCAlbGQgdmFuICVsZDsgR3JlZXAgJWxkIHZhbiAlbGQiCisKKyM6IG9wcy5jOjU0MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHZpciAnQk9NJykiCisKKyM6IG9wdGlvbi5jOjE5ODkKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIkRhbmtpZSBkYXQgankgdmxpZWcgbWV0IFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJPcHNpZSBpcyBuaWUgb25kZXJzdGV1biBuaWUiCisKKyM6IG9wdGlvbi5jOjMyMDAKK21zZ2lkICJOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJOaWUgdG9lZ2VsYWF0IGluICduIG1vZHVzbHluIG5pZSIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRMYWFzIGdlc3RlbCB2YW5hZiAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiTm9tbWVyIHZlcmVpcyBuYSA9IgorCisjOiBvcHRpb24uYzozNzAyIG9wdGlvbi5jOjQzMDkKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiTmllIGdldmluZCBpbiAndGVybWNhcCcgbmllIgorCisjOiBvcHRpb24uYzozNzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIk9uZ2VsZGlnZSBrYXJha3RlciA8JXM+IgorCisjOiBvcHRpb24uYzo0Mjk0IG9wdGlvbi5jOjU0OTcKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJOaWUgaGllciB0b2VnZWxhYXQgbmllIgorCisjOiBvcHRpb24uYzo0MzAxCittc2dpZCAiQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJLYW4gbmllICd0ZXJtJyBzdGVsIG5hIGxl6yBzdHJpbmcgbmllIgorCisjOiBvcHRpb24uYzo0MzA0Cittc2dpZCAiQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiS2FuIG5pZSAndGVybScgdmVyYW5kZXIgaW4gR1VJIG5pZSIKKworIzogb3B0aW9uLmM6NDMwNgorbXNnaWQgIlVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJHZWJydWlrIFwiOmd1aVwiIG9tIGRpZSBHVUkgdGUgYmVnaW4iCisKKyM6IG9wdGlvbi5jOjQzMjcKK21zZ2lkICInYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICInYmFja3VwZXh0JyBlbiAncGF0Y2htb2RlJyBpcyBkaWVzZWxmZGUiCisKKyM6IG9wdGlvbi5jOjQ1ODYKK21zZ2lkICJaZXJvIGxlbmd0aCBzdHJpbmciCittc2dzdHIgIk51bC1sZW5ndGUgc3RyaW5nIgorCisjOiBvcHRpb24uYzo0NjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIk9udGJyZWtlbmRlIG5vbW1lciBuYSA8JXM+IgorCisjOiBvcHRpb24uYzo0NjY4Cittc2dpZCAiTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiT250YnJla2VuZGUga29tbWEiCisKKyM6IG9wdGlvbi5jOjQ2NzUKK21zZ2lkICJNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJNb2V0ICduICcgd2FhcmRlIHNwZXNpZmlzZWVyIgorCisjOiBvcHRpb24uYzo0NzE1Cittc2dpZCAiY29udGFpbnMgdW5wcmludGFibGUgY2hhcmFjdGVyIgorbXNnc3RyICJiZXZhdCAnbiBvbmRydWtiYXJlIGthcmFrdGVyIgorCisjOiBvcHRpb24uYzo0NzI4Cittc2dpZCAiSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJPbmdlbGRpZ2UgZm9udChlKSIKKworIzogb3B0aW9uLmM6NDczNAorbXNnaWQgImNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJrYW4gbmllIGZvbnRzdGVsIGtpZXMgbmllIgorCisjOiBvcHRpb24uYzo0NzM2Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJPbmdlbGRpZ2UgZm9udHN0ZWwiCisKKyM6IG9wdGlvbi5jOjQ3NDMKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJrYW4gbmllIHd5ZSBmb250IGtpZXMgbmllIgorCisjOiBvcHRpb24uYzo0NzQ1Cittc2dpZCAiSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIk9uZ2VsZGlnZSB3eWUgZm9udCIKKworIzogb3B0aW9uLmM6NTAxNAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICJPbmdlbGRpZ2Uga2FyYWt0ZXIgbmEgPCVjPiIKKworIzogb3B0aW9uLmM6NTA5NworbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJrb21tYSBiZW5vZGlnIgorCisjOiBvcHRpb24uYzo1MTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIidjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIidjb21tZW50c3RyaW5nJyBtb2V0IGxlZWcgd2VlcyBvZiAlcyBiZXZhdCIKKworIzogb3B0aW9uLmM6NTE1MworbXNnaWQgIk5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkdlZW4gbXVpc29uZGVyc3RldW5pbmcgbmllIgorCisjOiBvcHRpb24uYzo1Mzk5Cittc2dpZCAiVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiT252b2x0b29pZGUgdWl0ZHJ1a2tpbmdyZWVrcyIKKworIzogb3B0aW9uLmM6NTQwMworbXNnaWQgInRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJ0ZSB2ZWVsIGl0ZW1zIgorCisjOiBvcHRpb24uYzo1NDA1Cittc2dpZCAidW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIm9uZ2ViYWxhbnNlZXJkZSBncm9lcGUiCisKKyM6IG9wdGlvbi5jOjU2MjAKK21zZ2lkICJBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJEYWFyIGJlc3RhYW4gcmVlZHMgJ24gdm9vcnNrb3V2ZW5zdGVyIgorCisjOiBvcHRpb24uYzo1ODgxIG9wdGlvbi5jOjU5MTAKK21zZ2lkICInd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICInd2luaGVpZ2h0JyBrYW4gbmllIGtsZWluZXIgYXMgJ3dpbm1pbmhlaWdodCcgd2VlcyBuaWUiCisKKyM6IG9wdGlvbi5jOjU5MjYgb3B0aW9uLmM6NTk0NQorbXNnaWQgIid3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICInd2lud2lkdGgnIGthbiBuaWUga2xlaW5lciBhcyAnd2lubWlud2lkdGgnIHdlZXMgbmllIgorCisjOiBvcHRpb24uYzo2MDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkJlbm9kaWcgdGVuIG1pbnN0ZSAlZCByZetscyIKKworIzogb3B0aW9uLmM6NjA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIkJlbm9kaWcgdGVuIG1pbnN0ZSAlZCBrb2xvbW1lIgorCisjOiBvcHRpb24uYzo2MzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogT25iZWtlbmRlIG9wc2llOiAlcyIKKworIzogb3B0aW9uLmM6NjUwMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwgY29kZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRlcm1pbmFhbCBrb2RlcyAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDIKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBHbG9iYWxlIG9wc2llIHdhYXJkZXMgLS0tIgorCisjOiBvcHRpb24uYzo2NTA0Cittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBMb2thbGUgb3BzaWUgd2FhcmRlcyAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDYKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE9wc2llcyAtLS0iCisKKyM6IG9wdGlvbi5jOjcxOTYKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogJ2dldF92YXJwJyBGT1VUIgorCisjOiBvcHRpb24uYzo4MTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IFBhc3NlbmRlIGthcmFrdGVyIG9udGJyZWVrIHZpciAlcyIKKworIzogb3B0aW9uLmM6ODE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXA6IEVrc3RyYSBrYXJha3RlcnMgbmEga29tbWFwdW50OiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgImthbiBuaWUgb29wbWFhayBuaWUgIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogS2FuIG5pZSB2ZW5zdGVyIG9vcG1hYWsgbmllIVxuIgorCisjOiBvc19hbWlnYS5jOjMyOQorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIkJlbm9kaWcgQW1pZ2Fkb3Mgd2Vlcmdhd2UgMi4wNCBvZiBsYXRlclxuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIkJlbm9kaWcgJXMgd2Vlcmdhd2UgJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJLYW4gbmllIE5JTDogb29wbWFhayBuaWVcbiIKKworIzogb3NfYW1pZ2EuYzo0MTgKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAiS2FuIG5pZSBza2VwIG5pZTogIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSBzdG9wIG1ldCAlZFxuIgorCisjOiBvc19hbWlnYS5jOjkyOAorbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgImthbiBrb25zb2xlLW1vZHVzIG5pZSB2ZXJhbmRlciBuaWUgPyFcbiIKKworIzogb3NfYW1pZ2EuYzo5Mzggb3NfbWFjLmM6MTE2OCBvc19tc3dpbi5jOjYxOSBvc19yaXNjb3MuYzo3Mjggb3NfdW5peC5jOjI3MjYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IFNrZXJtbW9kdXMgaW5zdGVsbGluZyBuaWUgb25kZXJzdGV1biBuaWUiCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICInbWNoX2dldF9zaGVsbHNpemUnOiBuaWUgJ24ga29uc29sZSBuaWU/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTQyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IEthbiBuaWUgZG9wIG1ldCAtZiBvcHNpZSB1aXR2b2VyIG5pZSIKKworIzogb3NfYW1pZ2EuYzoxMTgzIG9zX2FtaWdhLmM6MTI3MworbXNnaWQgIkNhbm5vdCBleGVjdXRlICIKK21zZ3N0ciAiS2FuIG5pZSB1aXR2b2VyIG5pZSAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NiBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgImRvcCAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNiBvc19hbWlnYS5jOjEzMDgKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIHRlcnVnZ2VrZWVyXG4iCisKKyM6IG9zX2FtaWdhLmM6MTQ0OAorbXNnaWQgIkFOQ0hPUl9CVUZfU0laRSB0b28gc21hbGwuIgorbXNnc3RyICInQU5DSE9SX0JVRl9TSVpFJyBpcyB0ZSBrbGVpbiIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gRk9VVCIKKworIzogb3NfbXN3aW4uYzo1MDMKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiLi4uKGFmZ2VrYXApIgorCisjOiBvc19tc3dpbi5jOjU5NAorbXNnaWQgIidjb2x1bW5zJyBpcyBub3QgODAsIGNhbm5vdCBleGVjdXRlIGV4dGVybmFsIGNvbW1hbmRzIgorbXNnc3RyICInY29sdW1ucycgaXMgbmllIDgwIG5pZSwga2FuIG5pZSBla3N0ZXJuZSBiZXZlbGUgdWl0dm9lciBuaWUiCisKKyM6IG9zX21zd2luLmM6NzA2IG9zX3VuaXguYzo0OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBCaWJsaW90ZWVrcm9lcCBoZXQgZ2VmYWFsIHZpciBcIiVzXCIoKSIKKworIzogb3NfbXN3aW4uYzoxMzQwCittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBEcnVra2VyLXNlbGVrc2llIGhldCBnZWZhYWwiCisKKyM6IG9zX21zd2luLmM6MTM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAibmEgJXMgb3AgJXMiCisKKyM6IG9zX21zd2luLmM6MTQ0OSBvc19tc3dpbi5jOjE0NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBEcnVrZm91dDogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ2MAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIk9uYmVrZW5kIgorCisjOiBvc19tc3dpbi5jOjE0ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiRHJ1ayBub3UgJyVzJyIKKworIzogb3NfbXN3aW4uYzoyNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBPbmdlbGRpZ2Uga2FyYWt0ZXJzdGVsbmFhbSBcIiVzXCIgaW4gZm9udG5hYW0gXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjI1NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogT25nZWxkaWdlIGthcmFrdGVyICclYycgaW4gZm9udG5hYW0gXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjI3Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogT25nZWxkaWdlICdvc2ZpbGV0eXBlJyBvcHNpZSAtIGdhYW4gVGV4dCBnZWJydWlrIgorCisjOiBvc191bml4LmM6ODAwCittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogRHViYmVsIHNlaW4sIHN0YWFrXG4iCisKKyM6IG9zX3VuaXguYzo4MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IEhldCBkb2RlbGlrZSBzZWluICVzIGdldmFuZ1xuIgorCisjOiBvc191bml4LmM6ODA5Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IEhldCBkb2RlbGlrZSBzZWluIGdldmFuZ1xuIgorCisjOiBvc191bml4LmM6MTA2MworIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAiT20gZGllIFgtdmVydG9vbnNrZXJtIG9vcCB0ZSBtYWFrIGhldCAlbGQgbXNlayBnZXZhdCIKKworIzogb3NfdW5peC5jOjEwOTAKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBIZXQgWCBmb3V0IG9udHZhbmdcbiIKKworIzogb3NfdW5peC5jOjExNTcKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJUb2V0c2luZyB2YW4gZGllIFgtdmVydG9vbnNrZXJtIGhldCBnZWZhYWwiCisKKyM6IG9zX3VuaXguYzoxMzAxCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAiT29wbWFhayB2YW4gZGllIFgtdmVydG9vbnNrZXJtIGhldCB1aXRnZXRlbCIKKworIzogb3NfdW5peC5jOjI4OTkgb3NfdW5peC5jOjM0ODMKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiS2FuIG5pZSBkb3AgdWl0dm9lciBuaWUgIgorCisjOiBvc191bml4LmM6Mjk0NAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisiS2FuIG5pZSBkb3AgJ3NoJyB1aXR2b2VyIG5pZVxuIgorCisjOiBvc191bml4LmM6Mjk0OCBvc191bml4LmM6MzQ4OQorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJkb3AgbGV3ZXIgIgorCisjOiBvc191bml4LmM6MzA4MgorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyJLYW4gbmllIHB5cGUgc2tlcCBuaWVcbiIKKworIzogb3NfdW5peC5jOjMwOTcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIkthbiBuaWUgdnVyayBuaWVcbiIKKworIzogb3NfdW5peC5jOjM0OTYKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJCZXZlbCBiZetpbmRpZ1xuIgorCisjOiBvc191bml4LmM6NDk5MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIk9vcG1hYWsgdmFuIGRpZSBYIHZlcnRvb25za2VybSBoZXQgZ2VmYWFsIgorCisjOiBvc192bXNfbW1zLmM6NTkKK21zZ2lkICJBdCBsaW5lIgorbXNnc3RyICJCeSByZetsIgorCisjOiBvc193MzJleGUuYzoxNjkKK21zZ2lkICJDb3VsZCBub3QgbG9hZCB2aW0zMi5kbGwhIgorbXNnc3RyICJLb24gbmllICd2aW0zMi5kbGwnIGxhYWkgbmllISIKKworIzogb3NfdzMyZXhlLmM6MTY5IG9zX3czMmV4ZS5jOjE3OQorbXNnaWQgIlZJTSBFcnJvciIKK21zZ3N0ciAiVklNIEZvdXQiCisKKyM6IG9zX3czMmV4ZS5jOjE3OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIktvbiBuaWUgZnVua3NpZXd5c2VycyBuYSBkaWUgRExMIG9wc3RlbCBuaWUhIgorCisjOiBvc193aW4xNi5jOjU3OCBvc193aW4zMi5jOjMwMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgImRvcCBoZXQgJWQgZ2VsZXdlciIKKworIzogb3Nfd2luMzIuYzoyNDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogSGV0ICVzIGdlYmV1cnRlbmlzIGdldmFuZ1xuIgorCisjOiBvc193aW4zMi5jOjI0OTEKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAibWFhayB0b2UiCisKKyM6IG9zX3dpbjMyLmM6MjQ5MworbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAidGVrZW4gdWl0IgorCisjOiBvc193aW4zMi5jOjI0OTQKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAic2l0IGFmIgorCisjOiBvc193aW4zMi5jOjI5NzUKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogQmV2ZWwgbmllIGdldmluZCBuaWUiCisKKyM6IG9zX3dpbjMyLmM6Mjk4OAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIidWSU1SVU4uRVhFJyBuaWUgZ2V2aW5kIGluICckUEFUSCcgbmllLlxuIgorIkVrc3Rlcm5lIG9wZHJhZ3RlIHNhbCBuaWUgd2FnIG5hIHZvbHRvb2lpbmcgbmllXG4iCisiU2llbiAnOmhlbHAgd2luMzItdmltcnVuJyB2aXIgbWVlciBpbmxpZ3RpbmcuIgorCisjOiBvc193aW4zMi5jOjI5OTEKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiVmltIFdhYXJza3V3aW5nIgorCisjOiBxdWlja2ZpeC5jOjI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IFRlIHZlZWwgJSUlYyBpbiBmb3JtYWF0c3RyaW5nIgorCisjOiBxdWlja2ZpeC5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MzogT252ZXJ3YWd0ZSAlJSVjIGluIGZvcm1hYXRzdHJpbmciCisKKyM6IHF1aWNrZml4LmM6MzQ4Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IE9udGJyZWtlbmRlIF0gaW4gZm9ybWFhdHN0cmluZyIKKworIzogcXVpY2tmaXguYzozNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiBPbmdlc3RldW5kZSAlJSVjIGluIGZvcm1hYXRzdHJpbmciCisKKyM6IHF1aWNrZml4LmM6MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogT25nZWxkaWdlICUlJWMgaW4gZm9ybWFhdHN0cmluZ3Zvb3J2b2Vnc2VsIgorCisjOiBxdWlja2ZpeC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogT25nZWxkaWdlICUlJWMgaW4gZm9ybWFhdHN0cmluZyIKKworIzogcXVpY2tmaXguYzo0MTQKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgYmV2YXQgZ2VlbiBwYXRyb29uIG5pZSIKKworIzogcXVpY2tmaXguYzo1MjAKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBPbnRicmVrZW5kZSBvZiBsZesgZ2lkc25hYW0iCisKKyM6IHF1aWNrZml4LmM6OTMxCittc2dpZCAiTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiR2VlbiBpdGVtcyBtZWVyIG5pZSIKKworIzogcXVpY2tmaXguYzoxMTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCB2YW4gJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjExNTQKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAocmXrbCB2ZXJ3eWRlcikiCisKKyM6IHF1aWNrZml4LmM6MTM2MAorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDogT25kZXIgYWFuICdxdWlja2ZpeCcgc3RhcGVsIgorCisjOiBxdWlja2ZpeC5jOjEzNjkKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IEJvIGFhbiAncXVpY2tmaXgnIHN0YXBlbCIKKworIzogcXVpY2tmaXguYzoxMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAiZm91dGVseXMgJWQgdmFuICVkOyAlZCBmb3V0ZSIKKworIzogcXVpY2tmaXguYzoxODQyCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogS2FuIG5pZSBza3J5ZiBuaWUsICdidWZ0eXBlJyBvcHNpZSBpcyBhYW4iCisKKyM6IHJlZ2V4cC5jOjgwMQorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFBhdHJvb24gdGUgbGFuayIKKworIzogcmVnZXhwLmM6MTMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogR2VuZXN0ZSAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiBHZW5lc3RlICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIHZvbGcgbmlrcyIKKworIzogcmVnZXhwLmM6MjQ2OQorIywgYy1mb3JtYXQKK21zZ2lkICJTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAiU2ludGFrc2ZvdXQgaW4gJXN7Li4ufSIKKworIzogcmVnZXhwLmM6MjcxNgorbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiBJbmVlbnN0b3J0aW5nIG9uZGVyc2tlcC4gUGF0cm9vbiB0ZSBrb21wbGVrcz8iCisKKyM6IHJlZ2V4cC5jOjI4NTEKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IHBhdHJvb24gaGV0IGzrZS1zdGFwZWwgZm91dCB2ZXJvb3JzYWFrIgorCisjOiByZWdleHAuYzozMDg3Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAiRWtzdGVybmUgc3VidHJlZmZlcnM6XG4iCisKKyM6IHNjcmVlbi5jOjIwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkIHJl62xzIGdldm91ICIKKworIzogc2NyZWVuLmM6NzQyNgorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiIFZWRVJWQU5HIgorCisjOiBzY3JlZW4uYzo3NDMwCittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiBWRVJWQU5HIgorCisjOiBzY3JlZW4uYzo3NDM1Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiBPTUtFRVIiCisKKyM6IHNjcmVlbi5jOjc0MzcKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgSU5WT0VHIgorCisjOiBzY3JlZW4uYzo3NDQwCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKGludm9lZykiCisKKyM6IHNjcmVlbi5jOjc0NDIKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKHZlcnZhbmcpIgorCisjOiBzY3JlZW4uYzo3NDQ0Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAodnZlcnZhbmcpIgorCisjOiBzY3JlZW4uYzo3NDQ3Cittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIEhlYnJlZXVzIgorCisjOiBzY3JlZW4uYzo3NDU1Cittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiICh0YWFsKSIKKworIzogc2NyZWVuLmM6NzQ1OAorbXNnaWQgIiAocGFzdGUpIgorbXNnc3RyICIgKHBsYWspIgorCisjOiBzY3JlZW4uYzo3NDY0Cittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIEtJRVMiCisKKyM6IHNjcmVlbi5jOjc0NjYKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIgVklTVUVMRSIKKworIzogc2NyZWVuLmM6NzQ2OAorbXNnaWQgIiBCTE9DSyIKK21zZ3N0ciAiIEJMT0siCisKKyM6IHNjcmVlbi5jOjc0NzAKK21zZ2lkICIgTElORSIKK21zZ3N0ciAiIFJFy0wiCisKKyM6IHNjcmVlbi5jOjc0ODMgc2NyZWVuLmM6NzUzNworbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAiYmVzaWcgb20gb3AgdGUgbmVlbSIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgInNvZWt0b2cgaGV0IEJPIGdldHJlZiwgZ2FhbiB2b29ydCB2YW4gT05ERVIgYWYiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICJzb2VrdG9nIGhldCBPTkRFUiBnZXRyZWYsIGdhYW4gdm9vcnQgdmFuIEJPIGFmIgorCisjOiBzZWFyY2guYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogT25nZWxkaWdlIHNvZWtzdHJpbmc6ICVzIgorCisjOiBzZWFyY2guYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBzb2VrdG9nIGhldCBCTyBnZXRyZWYgc29uZGVyIHRyZWZmZXIgdmlyOiAlcyIKKworIzogc2VhcmNoLmM6NzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTogc29la3RvZyBoZXQgT05ERVIgZ2V0cmVmIHNvbmRlciB0cmVmZmVyIHZpcjogJXMiCisKKyM6IHNlYXJjaC5jOjExMDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IFZlcndhZyAnPycgb2YgJy8nIG5hICc7JyIKKworIzogc2VhcmNoLmM6MzQ3NgorbXNnaWQgIiAoaW5jbHVkZXMgcHJldmlvdXNseSBsaXN0ZWQgbWF0Y2gpIgorbXNnc3RyICIgKHNsdWl0IGluIHZvcmlnZSBnZWx5c3RlIHRyZWZmZXIpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM0OTYKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gSW5nZXNsb3RlIGzqZXJzIgorCisjOiBzZWFyY2guYzozNDk4Cittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAibmllIGdldmluZCBuaWUgIgorCisjOiBzZWFyY2guYzozNDk5Cittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiaW4gcGFkIC0tLVxuIgorCisjOiBzZWFyY2guYzozNTM4Cittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgKEFscmVlZHMgZ2VseXMpIgorCisjOiBzZWFyY2guYzozNTQwCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAgTklFIEdFVklORCBOSUUiCisKKyM6IHNlYXJjaC5jOjM1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIkRldXJzb2VrIGluZ2VzbG90ZSBs6mVyOiAlcyIKKworIzogc2VhcmNoLmM6MzgxMAorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogVHJlZmZlciBpcyBvcCBodWlkaWdlIHJl62wiCisKKyM6IHNlYXJjaC5jOjM5NTAKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiQWxsZSBpbmdlc2xvdGUgbOplcnMgaXMgZ2V2aW5kIgorCisjOiBzZWFyY2guYzozOTUyCittc2dpZCAiTm8gaW5jbHVkZWQgZmlsZXMiCittc2dzdHIgIkdlZW4gaW5nZXNsb3RlIGzqZXJzIG5pZSIKKworIzogc2VhcmNoLmM6Mzk2OAorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogS29uIGRlZmluaXNpZSBuaWUgdmluZCBuaWUiCisKKyM6IHNlYXJjaC5jOjM5NzAKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IEtvbiBwYXRyb29uIG5pZSB2aW5kIG5pZSIKKworIzogc3ludGF4LmM6Mjk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDogT25nZWxkaWdlIHBhcmFtZXRlcjogJXMiCisKKyM6IHN5bnRheC5jOjMxNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IEdlZW4gc29kYW5pZ2Ugc2ludGFrc2tsdXN0ZXIgbmllOiAlcyIKKworIzogc3ludGF4LmM6MzMzMgorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiR2VlbiBTaW50YWtzLWl0ZW1zIGdlZGVmaW5pZWVyIHZpciBoaWVyZGllIGJ1ZmZlciBuaWUiCisKKyM6IHN5bnRheC5jOjMzNDAKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgInNpbmNocm9uaXNlZXIgbWV0IEMtc3R5bCBrb21tZW50YWFyIgorCisjOiBzeW50YXguYzozMzQ4Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAiZ2VlbiBzaW5jaHJvbmlzZXJpbmciCisKKyM6IHN5bnRheC5jOjMzNTEKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgInNpbmNocm9uaXNhc2llIGJlZ2luICIKKworIzogc3ludGF4LmM6MzM1MyBzeW50YXguYzozNDIyCittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiIHJl62xzIHZvb3IgYm9vbnN0ZSBseW4iCisKKyM6IHN5bnRheC5jOjMzNTcKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBTaW50YWtzIHN5bmMgaXRlbXMgLS0tIgorCisjOiBzeW50YXguYzozMzYwCittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyJzaW5jaHJvbmlzZXJpbmcgbWV0IGl0ZW1zIgorCisjOiBzeW50YXguYzozMzY1Cittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFNpbnRha3MgaXRlbXMgLS0tIgorCisjOiBzeW50YXguYzozMzg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiBHZWVuIHNvZGFuaWdlIHNpbnRha3NrbHVzdGVyIG5pZTogJXMiCisKKyM6IHN5bnRheC5jOjM0MTIKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAibWluaW1hYWwgIgorCisjOiBzeW50YXguYzozNDE5Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm1ha3NpbWFhbCAiCisKKyM6IHN5bnRheC5jOjQwNDcKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6ICdncm91cFt0XWhlcmUnIG5pZSBoaWVyIGFhbnZhYXIgbmllIgorCisjOiBzeW50YXguYzo0MDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTQ6IERpZG4ndCBmaW5kIHJlZ2lvbiBpdGVtIGZvciAlcyIKK21zZ3N0ciAiRTM5NDogS29uIG5pZSBvbWdld2luZ3NpdGVtIHZpbmQgdmlyICVzIG5pZSIKKworIzogc3ludGF4LmM6NDA5OQorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBiZXZhdCBwYXJhbWV0ZXJzIG5pZSBoaWVyIGFhbnZhYXIgbmllIgorCisjOiBzeW50YXguYzo0MTEwCittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6ICdjb250YWluZWRpbicgcGFyYW1ldGVyIG5pZSBoaWVyIGFhbnZhYXIgbmllIgorCisjOiBzeW50YXguYzo0MTg4Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6IEzqZXJuYWFtIGJlbm9kaWciCisKKyM6IHN5bnRheC5jOjQ1MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBPbnRicmVrZW5kZSAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBOaWUgZ2Vub2VnIHBhcmFtZXRlcnMgbmllOiBzaW50YWtzb21nZXdpbmcgJXMiCisKKyM6IHN5bnRheC5jOjUwMTEKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogR2VlbiBrbHVzdGVyIGdlc3Blc2lmaXNlZXIgbmllIgorCisjOiBzeW50YXguYzo1MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IFBhdHJvb25iZWdyZW5zZXIgbmllIGdldmluZCBuaWU6ICVzIgorCisjOiBzeW50YXguYzo1MTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6IEdlbW9ycyBuYSBwYXRyb29uOiAlcyIKKworIzogc3ludGF4LmM6NTIwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHNpbnRha3Mgc3luYzogcmXrbHZvb3J0Z2FhbnBhdHJvb24gdHdlZSBrZWVyIGdlc3Blc2lmaXNlZXIiCisKKyM6IHN5bnRheC5jOjUyNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBPbmdlbGRpZ2UgcGFyYW1ldGVyczogJXMiCisKKyM6IHN5bnRheC5jOjUzMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogT250YnJla2VuZGUgZ2VseWthYW50ZWtlbjogJXMiCisKKyM6IHN5bnRheC5jOjUzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBMZesgcGFyYW1ldGVyOiAlcyIKKworIzogc3ludGF4LmM6NTM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyBuaWUgdG9lZ2VsYWF0IGhpZXIgbmllIgorCisjOiBzeW50YXguYzo1MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgbW9ldCB28/NyIGluICdjb250YWlucycgbHlzIHdlZXMiCisKKyM6IHN5bnRheC5jOjU0MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogT25iZWtlbmRlIGdyb2VwbmFhbTogJXMiCisKKyM6IHN5bnRheC5jOjU2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiBPbmdlbGRpZ2UgOnN5bnRheCBzdWJiZXZlbCAlcyIKKworIzogc3ludGF4LmM6NjAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogdWl0bGlnZ3JvZXAgbmllIGdldmluZCBuaWU6ICVzIgorCisjOiBzeW50YXguYzo2MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBUZSBtaW4gcGFyYW1ldGVyczogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IFRlIHZlZWwgcGFyYW1ldGVyczogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjA3NQorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiIgorIkU0MTQ6IGdyb2VwIGhldCBpbnN0ZWxsaW5ncywgdWl0bGlnc2tha2VsICgnaGlnaGxpZ2h0IGxpbmsnKSBnZe9nbm9yZWVyIgorCisjOiBzeW50YXguYzo2MjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IG9udmVyd2FndGUgZ2VseWthYW50ZWtlbjogJXMiCisKKyM6IHN5bnRheC5jOjYyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogb250YnJla2VuZGUgZ2VseWthYW50ZWtlbjogJXMiCisKKyM6IHN5bnRheC5jOjYyNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IG9udGJyZWtlbmRlIHBhcmFtZXRlcjogJXMiCisKKyM6IHN5bnRheC5jOjYyOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IE9uZ2VsZGlnZSB3YWFyZGU6ICVzIgorCisjOiBzeW50YXguYzo2NDE4Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogRkcga2xldXIgb25iZWtlbmQiCisKKyM6IHN5bnRheC5jOjY0MjkKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiBCRyBrbGV1ciBvbmJla2VuZCIKKworIzogc3ludGF4LmM6NjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IEtsZXVybmFhbSBvZiAtbm9tbWVyIG5pZSBoZXJrZW4gbmllOiAlcyIKKworIzogc3ludGF4LmM6NjY4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogdGVybWluYWFsa29kZSB0ZSBsYW5rOiAlcyIKKworIzogc3ludGF4LmM6NjczNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogT25nZWxkaWdlIHBhcmFtZXRlcjogJXMiCisKKyM6IHN5bnRheC5jOjcyNjQKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBUZSB2ZWVsIHZlcnNraWxsZW5kZSB1aXRsaWctZWllbnNrYXBwZSBpbiBnZWJydWlrIgorCisjIG5qajogJ2lua2xldXInIHZpciAndWl0bGlnJz8gbmV0ICduIGlkZWUgLi4KKyM6IHRhZy5jOjkwCittc2dpZCAiYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAib25kZXJhYW4gZXRpa2V0c3RhcGVsIgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgImJvLWFhbiBldGlrZXRzdGFwZWwiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiBLYW4gbmllIHbz83IgZWVyc3RlIGV0aWtldC10cmVmZmVyIGdhYW4gbmllIgorCisjOiB0YWcuYzo1MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IGV0aWtldCBuaWUgZ2V2aW5kIG5pZTogJXMiCisKKyM6IHRhZy5jOjU0NQorbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmkgdGlwZSBldGlrZXQiCisKKyM6IHRhZy5jOjU0OAorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAibOplclxuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzA2Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICJTbGV1dGVsIG5vbW1lciB2YW4ga2V1c2UgaW4gKDxDUj4gb20gdGUgc3RvcCk6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiBEYWFyIGlzIHNsZWdzIGVlbiBldGlrZXQtdHJlZmZlciIKKworIzogdGFnLmM6NzQ4Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogS2FuIG5pZSB2ZXJieSBsYWFzdGUgZXRpa2V0LXRyZWZmZXIgZ2FhbiBuaWUiCisKKyM6IHRhZy5jOjc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiTOplciBcIiVzXCIgYmVzdGFhbiBuaWUiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4MAorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAiZXRpa2V0ICVkIHZhbiAlZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIG9mIG1lZXIiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgR2FhbiBldGlrZXQgbWV0IGFuZGVyIGthcyBnZWJydWlrISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBM6mVyIFwiJXNcIiBiZXN0YWFuIG5pZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIE5BIGV0aWtldCAgICAgIFZBTiByZetsICAgaW4gbOplci90ZWtzIgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIkxpbmnqcmUgZXRpa2V0c29layIKKworIzogdGFnLmM6MTE0NgorbXNnaWQgIkJpbmFyeSB0YWcgc2VhcmNoIgorbXNnc3RyICJCaW7qcmUgZXRpa2V0c29layIKKworIzogdGFnLmM6MTE3MgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJEZXVyc29layBldGlrZXRs6mVyICVzIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBFdGlrZXRs6mVyZ2lkcyBhZmdla2FwIHZpciAlc1xuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBGb3JtYWF0Zm91dCBpbiBldGlrZXRs6mVyIFwiJXNcIiIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIlZvb3IgZ3JlZXAgJWxkIgorCisjOiB0YWcuYzoxODcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogRXRpa2V0bOplciBvbmdlc29ydGVlcjogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiBHZWVuIGV0aWtldGzqZXIgbmllIgorCisjOiB0YWcuYzoyNTgzCittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogS2FuIG5pZSBldGlrZXRwYXRyb29uIHZpbmQgbmllIgorCisjOiB0YWcuYzoyNTk0Cittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiBLb24gbmllIGV0aWtldCB2aW5kIG5pZSwgZWsgcmFhaSBtYWFyISIKKworIzogdGVybS5jOjE3MjMKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicgb25iZWtlbmQuIEJlc2tpa2JhcmUgaW5nZWJvdWRlIHRlcm1pbmFsZSBpczoiCisKKyM6IHRlcm0uYzoxNzQ3Cittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJnZWJydWlrIHZlcnN0ZWsgJyIKKworIzogdGVybS5jOjIxMDAKK21zZ2lkICJDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkthbiBuaWUgJ3Rlcm1jYXAnLWzqZXIgb29wbWFhayBuaWUiCisKKyM6IHRlcm0uYzoyMTAzCittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJUZXJtaW5hYWxpbnNrcnl3aW5nIG5pZSBpbiAndGVybWluZm8nIGdldmluZCBuaWUiCisKKyM6IHRlcm0uYzoyMTA1Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIlRlcm1pbmFhbGluc2tyeXdpbmcgbmllIGluICd0ZXJtY2FwJyBnZXZpbmQgbmllIgorCisjOiB0ZXJtLmM6MjI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogR2VlbiBcIiVzXCIgaW5za3J5d2luZyBpbiB0ZXJtY2FwIG5pZSIKKworIzogdGVybS5jOjI3MzgKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzogdGVybWluYWFsdmVybW/rIFwiY21cIiB2ZXJlaXMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ4NzgKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRlcm1pbmFhbCBzbGV1dGVscyAtLS0iCisKKyM6IHVpLmM6MjQwCittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAibnV3ZSBkb3AgYmVnaW5cbiIKKworIzogdWkuYzoxNzA1Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogRm91dCBtZXQgbGVlcyB2YW4gaW52b2VyLCB2ZXJsYWF0Li4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6MzUxCittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICJHZWVuIGhlcnN0ZWwgbW9vbnRsaWs7IGdhYW4gaW4gZWxrIGdldmFsIHZvb3J0IgorCisjOiB1bmRvLmM6NTA2Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogcmXrbG5vbW1lcnMgZm91dGllZiIKKworIzogdW5kby5jOjY3NQorbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICIxIHZlcmFuZGVyaW5nIgorCisjOiB1bmRvLmM6Njc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGQgdmVyYW5kZXJpbmdlIgorCisjOiB1bmRvLmM6NzIxCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IGhlcnN0ZWxseXMga29ycnVwIgorCisjOiB1bmRvLmM6NzUxCittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IGhlcnN0ZWxyZetsIG9udGJyZWVrIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6NjU1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMi1iaXMgR1VJIHdlZXJnYXdlIgorCisjOiB2ZXJzaW9uLmM6NjU3Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMi1iaXMgR1VJIHZlcnNpb24iCisKKyM6IHZlcnNpb24uYzo2NjAKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiBpbiBXaW4zMnMgbW9kdXMiCisKKyM6IHZlcnNpb24uYzo2NjIKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIG1ldCBPTEUgb25kZXJzdGV1bmluZyIKKworIzogdmVyc2lvbi5jOjY2NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyLWJpcyBrb25zb2xlIHdlZXJnYXdlIgorCisjOiB2ZXJzaW9uLmM6NjY5Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LWJpcyB3ZWVyZ2F3ZSIKKworIzogdmVyc2lvbi5jOjY3MworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMi1iaXMgTVMtRE9TIHdlZXJnYXdlIgorCisjOiB2ZXJzaW9uLmM6Njc1Cittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2LWJpcyBNUy1ET1Mgd2Vlcmdhd2UiCisKKyM6IHZlcnNpb24uYzo2ODEKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHdlZXJnYXdlIgorCisjOiB2ZXJzaW9uLmM6NjgzCittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggd2Vlcmdhd2UiCisKKyM6IHZlcnNpb24uYzo2ODYKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIHdlZXJnYXdlIgorCisjOiB2ZXJzaW9uLmM6NjkxCittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlJJU0MgT1Mgd2Vlcmdhd2UiCisKKyM6IHZlcnNpb24uYzo3MDEKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICIiCisiXG4iCisiSW5nZXNsb3RlIGxhc2xhcHBpZXM6IgorCisjOiB2ZXJzaW9uLmM6NzI4Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIkdla29tcGlsZWVyIG9wICIKKworIzogdmVyc2lvbi5jOjczMQorbXNnaWQgImJ5ICIKK21zZ3N0ciAiZGV1ciAiCisKKyM6IHZlcnNpb24uYzo3NDMKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkVub3JtZSB3ZWVyZ2F3ZSAiCisKKyM6IHZlcnNpb24uYzo3NDYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiR3Jvb3Qgd2Vlcmdhd2UgIgorCisjOiB2ZXJzaW9uLmM6NzQ5Cittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk5vcm1hbGUgd2Vlcmdhd2UgIgorCisjOiB2ZXJzaW9uLmM6NzUyCittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiS2xlaW4gd2Vlcmdhd2UgIgorCisjOiB2ZXJzaW9uLmM6NzU0Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJQaWVwa2xlaW4gd2Vlcmdhd2UgIgorCisjOiB2ZXJzaW9uLmM6NzYwCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJzb25kZXIgR1VJLiIKKworIzogdmVyc2lvbi5jOjc2NAorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgIm1ldCBHVEstR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjc2NgorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgIm1ldCBHVEsgR1VJIgorCisjOiB2ZXJzaW9uLmM6NzcwCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAibWV0IFgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6NzczCittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIm1ldCBYMTEtQXRoZW5hIEdVSSIKKworIzogdmVyc2lvbi5jOjc3NgorbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICJtZXQgQmVPUyBHVUkiCisKKyM6IHZlcnNpb24uYzo3NzkKK21zZ2lkICJ3aXRoIFBob3RvbiBHVUkuIgorbXNnc3RyICJtZXQgUGhvdG9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzo3ODIKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgIm1ldCBHVUkuIgorCisjOiB2ZXJzaW9uLmM6Nzg1Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAibWV0IENhcmJvbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6Nzg4Cittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJtZXQgQ29jb2EgR1VJLiIKKworIzogdmVyc2lvbi5jOjc5MQorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgIm1ldCAoa2xhc3NpZWtlKSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODAyCittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICBLZW5tZXJrZSBpbi0gKCspIG9mIHVpdGdlc2x1aXQgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6ODE0Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBzdGVsc2VsIHZpbXJjLWzqZXI6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODE5Cittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIGdlYnJ1aWtlciB2aW1yYy1s6mVyOiBcIiIKKworIzogdmVyc2lvbi5jOjgyNAorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDJkZSBnZWJydWlrZXIgdmltcmMtbOplciBcIiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDNkZSBnZWJydWlrZXIgdmltcmMtbOplciBcIiIKKworIzogdmVyc2lvbi5jOjgzNAorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgZ2VicnVpa2VyIGV4cmMtbOplcjogXCIiCisKKyM6IHZlcnNpb24uYzo4MzkKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgMmRlIGdlYnJ1aWtlciBleHJjLWzqZXI6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODQ1Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIHN0ZWxzZWwgZ3ZpbXJjLWzqZXI6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgZ2VicnVpa2VyIGd2aW1yYy1s6mVyOiBcIiIKKworIzogdmVyc2lvbi5jOjg1MworbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiMmRlIGdlYnJ1aWtlciBndmltcmMtbOplcjogXCIiCisKKyM6IHZlcnNpb24uYzo4NTgKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIjNkZSBnZWJydWlrZXIgZ3ZpbXJjLWzqZXI6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODY1Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgc3RlbHNlbCBraWVzbHlzLWzqZXI6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODczCittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgIGJ5c3RhbmQgdmlyICRWSU06IFwiIgorCisjOiB2ZXJzaW9uLmM6ODc5Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgYnlzdGFuZCB2aXIgJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODgzCittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAiS29tcGlsZXJpbmc6ICIKKworIzogdmVyc2lvbi5jOjg4OQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIktvbXBpbGVlcmRlcjogIgorCisjOiB2ZXJzaW9uLmM6ODk0Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICJLb3BwZWxpbmc6ICIKKworIzogdmVyc2lvbi5jOjg5OQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgT05URk9VVElOR1MtS09NUElMRVJJTkciCisKKyM6IHZlcnNpb24uYzo5MzQKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgTWV0IHNrb3AiCisKKyMgbmpqOiA6KSkKKyM6IHZlcnNpb24uYzo5MzYKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAiV2Vlcmdhd2UgIgorCisjOiB2ZXJzaW9uLmM6OTM3Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJkZXVyIEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKKworIzogdmVyc2lvbi5jOjkzOAorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBpcyB2cnlla29kZSwgZW4gdnJ5bGlrIHZlcnNwcmVpYmFhciIKKworIzogdmVyc2lvbi5jOjk0MAorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICJIZWxwIGFybSBraW5kZXJzIGluIFVnYW5kYSEiCisKKyM6IHZlcnNpb24uYzo5NDEKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJ0aWsgICA6aGVscCBpY2NmPEVudGVyPiB2aXIgbWVlciBpbmxpZ3RpbmcgaGllcm9vciAiCisKKyM6IHZlcnNpb24uYzo5NDMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJ0aWsgICA6cTxFbnRlcj4gICAgICAgICAgICAgICBvbSBwcm9ncmFtIHZlcmxhYXQgICAgIgorCisjOiB2ZXJzaW9uLmM6OTQ0Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAidGlrICAgOmhlbHA8RW50ZXI+ICBvZiAgPEYxPiAgdmlyIGFhbmx5biBodWxwICAgICAgICIKKworIzogdmVyc2lvbi5jOjk0NQorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgInRpayAgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIHZpciB3ZWVyZ2F3ZS1pbmxpZ3RpbmciCisKKyM6IHZlcnNpb24uYzo5NDgKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiVm9lciB0YW5zIHVpdCBpbiBWaS12ZXJzb2VuYmFyZSBtb2R1cyIKKworIzogdmVyc2lvbi5jOjk0OQorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgInRpayAgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIHZpciBWaW0gdmVyc3Rla3dhYXJkZXMgICAiCisKKyM6IHZlcnNpb24uYzo5NTAKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ0aWsgICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiB2aXIgbWVlciBpbmxpZ3RpbmcgaGllcm9vciIKKworIzogdmVyc2lvbi5jOjk5MAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIldBQVJTS1VXSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGJlc3BldXIiCisKKyM6IHZlcnNpb24uYzo5OTMKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ0aWsgICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICB2aXIgbWVlciBpbmxpZ3RpbmcgaGllcm9vciIKKworIzogd2luZG93LmM6MjAxCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IERhYXIgaXMgbmllICduIHZvb3Jza291LXZlbnN0ZXIgbmllIgorCisjOiB3aW5kb3cuYzo1NjgKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiBLYW4gbmllIGJvLWxpbmtzIGVuIG9uZGVyLXJlZ3MgdGVyc2VsZmRlcnR5ZCB2ZXJkZWVsIG5pZSIKKworIzogd2luZG93LmM6MTMyNworbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogS2FuIG5pZSByb3RlZXIgdGVyd3lsICduIGFuZGVyIHZlbnN0ZXIgdmVyZGVlbCBpcyBuaWUiCisKKyM6IHdpbmRvdy5jOjE4MTAKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IEthbiBuaWUgbGFhc3RlIHZlbnN0ZXIgdG9lbWFhayBuaWUiCisKKyM6IHdpbmRvdy5jOjI0NzQKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAiRGFhciBpcyBhbHJlZWRzIHNsZWdzIGVlbiB2ZW5zdGVyIgorCisjOiB3aW5kb3cuYzoyNTIxCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IERpZSBhbmRlciB2ZW5zdGVyIGJldmF0IHZlcmFuZGVyaW5nZSIKKworIzogd2luZG93LmM6NDM0MQorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IEdlZW4gbOplcm5hYW0gb25kZXIgbG9wZXIiCisKKyM6IHdpbmRvdy5jOjQ0NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiBLYW4gbOplciBcIiVzXCIgbmllIHZpbmQgaW4gcGFkIG5pZSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIld5c2lnIG1ldCAmbWVlciBhcyBlZW4gVmltIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjU5MgorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiV3lzaWcgbWV0ICduIGVua2VsICZWaW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjA0Cittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIld5c2lnIG1ldCAmVmltIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIld5c2lnIG1ldCBiZXN0YWFuZGUgVmltIC0gJiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo3NTIKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiV3lzaWcgZGllIGdla29zZSBs6mVyKHMpIG1ldCBWaW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkxIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY5Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICJGT3V0IG1ldCBkaWUgc2tlcCB2YW4gcHJvc2VzOiBLeWsgb2YgZ3ZpbSBpbiBqb3UgcGFkIGlzISIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTIgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDYKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTcwCittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgIidndmltZXh0LmRsbCcgZm91dCIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDUKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIlBhZC1sZW5ndGUgdGUgbGFuayIKKworIzogZ2xvYmFscy5oOjg3OAorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tR2VlbiByZetscyBpbiBidWZmZXItLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDE5Cittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJCZXZlbCBnZWthbnNlbGxsZWVyIgorCisjOiBnbG9iYWxzLmg6MTAyMAorbXNnaWQgIkFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJQYXJhbWV0ZXIgYmVub2RpZyIKKworIzogZ2xvYmFscy5oOjEwMjEKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogXFwgbW9ldCBnZXZvbGcgd29yZCBkZXVyIC8sID8gb2YgJiIKKworIzogZ2xvYmFscy5oOjEwMjMKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6IE9uZ2VsZGlnIGluIGJldmVscmXrbCB2ZW5zdGVyOiA8Q1I+IHZvZXIgdWl0LCBDVFJMLUMgc3RvcCIKKworIzogZ2xvYmFscy5oOjEwMjUKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIiIKKyJFMTI6IEJldmVsIHVpdCBleHJjL3ZpbXJjIG5pZSB0b2VnZWxhYXQgaW4gaHVpZGlnZSBnaWRzLSBvZiBldGlrZXRzb2VrdG9nIG5pZSIKKworIzogZ2xvYmFscy5oOjEwMjYKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogTOplciBiZXN0YWFuIChnZWJydWlrICEgb20gdGUgZHdpbmcpIgorCisjOiBnbG9iYWxzLmg6MTAyNworbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJCZXZlbCBoZXQgZ2VmYWFsIgorCisjOiBnbG9iYWxzLmg6MTAyOAorbXNnaWQgIkludGVybmFsIGVycm9yIgorbXNnc3RyICJJbnRlcm5lIGZvdXQiCisKKyM6IGdsb2JhbHMuaDoxMDI5Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIk9uZGVyYnJlZWsiCisKKyM6IGdsb2JhbHMuaDoxMDMwCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogT25nZWxkaWdlIGFkcmVzIgorCisjOiBnbG9iYWxzLmg6MTAzMQorbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIk9uZ2VsZGlnZSBwYXJhbWV0ZXIiCisKKyM6IGdsb2JhbHMuaDoxMDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJPbmdlbGRpZ2UgcGFyYW1ldGVyOiAlcyIKKworIzogZ2xvYmFscy5oOjEwMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IE9uZ2VsZGlnZSB1aXRkcnVra2luZzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDM2Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IE9uZ2VsZGlnZSBvbXZhbmciCisKKyM6IGdsb2JhbHMuaDoxMDM3Cittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJPbmdlbGRpZ2UgYmV2ZWwiCisKKyM6IGdsb2JhbHMuaDoxMDM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiBpcyAnbiBnaWRzIgorCisjOiBnbG9iYWxzLmg6MTA0MgorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogT252ZXJ3YWd0ZSBrYXJha3RlcnMgdm9vciAnPSciCisKKyM6IGdsb2JhbHMuaDoxMDQ0Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IE1lcmtlciBoZXQgb25nZWxkaWdlIHJl62xub21tZXIiCisKKyM6IGdsb2JhbHMuaDoxMDQ1Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogTWVya2VyIG5pZSBnZXN0ZWwgbmllIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBLYW4gbmllIHd5c2lnIG5pZSwgJ21vZGlmaWFibGUnIGlzIGFmIgorCisjOiBnbG9iYWxzLmg6MTA0NworbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogU2tyaXB0ZSB0ZSBkaWVwIGdlLW5lcyIKKworIzogZ2xvYmFscy5oOjEwNDgKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IEdlZW4gYWx0ZXJuYXRpZXdlIGzqZXIgbmllIgorCisjOiBnbG9iYWxzLmg6MTA0OQorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogQWZrb3J0aW5nIGJlc3RhYW4gbmllIgorCisjOiBnbG9iYWxzLmg6MTA1MAorbXNnaWQgIk5vICEgYWxsb3dlZCIKK21zZ3N0ciAiR2VlbiAhIHRvZWdlbGFhdCBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDUyCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBHVUkga2FuIG5pZSBnZWJydWlrIHdvcmQgbmllOiBOaWUgdHlkZW5zIGtvbXBpbGVyaW5nIGdla2llcyBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDU1Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICIiCisiRTI2OiBIZWJyZWV1cyBrYW4gbmllIGdlYnJ1aWsgd29yZCBuaWU6IE5pZSB0eWRlbnMga29tcGlsZXJpbmcgZ2VraWVzIG5pZVxuIgorCisjOiBnbG9iYWxzLmg6MTA1OAorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICIiCisiRTI3OiBGYXJzaSBrYW4gbmllIGdlYnJ1aWsgd29yZCBuaWU6IE5pZSB0eWRlbnMga29tcGlsZXJpbmcgZ2VraWVzIG5pZVxuIgorCisjOiBnbG9iYWxzLmg6MTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IEdlZW4gc29kYW5pZ2UgdWl0bGlnZ3JvZXBuYWFtIG5pZTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDYzCittc2dpZCAiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIKK21zZ3N0ciAiRTI5OiBOb2cgZ2VlbiBpbmdldm9lZ2RlIHRla3MgbmllIgorCisjOiBnbG9iYWxzLmg6MTA2NAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IEdlZW4gdm9yaWdlIGJldmVscmXrbCBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDY1Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogR2VlbiBzbyAnbiBiaW5kaW5nIG5pZSIKKworIzogZ2xvYmFscy5oOjEwNjYKK21zZ2lkICJObyBtYXRjaCIKK21zZ3N0ciAiR2VlbiB0cmVmZmVyIG5pZSIKKworIzogZ2xvYmFscy5oOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJHZWVuIHRyZWZmZXI6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA2OAorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IEdlZW4gbOplcm5hYW0iCisKKyM6IGdsb2JhbHMuaDoxMDY5Cittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiBHZWVuIHZvcmlnZSB2ZXJ2YW5naW5nc3BhdHJvb24gbmllIgorCisjOiBnbG9iYWxzLmg6MTA3MAorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiBHZWVuIHZvcmlnZSBiZXZlbCBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDcxCittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTogR2VlbiB2b3JpZ2UgcGF0cm9vbiBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDcyCittc2dpZCAiTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAiR2VlbiBvbXZhbmcgdG9lZ2VsYWF0IG5pZSIKKworIzogZ2xvYmFscy5oOjEwNzQKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBUZSBtaW4gcGxlayIKKworIzogZ2xvYmFscy5oOjEwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkthbiBuaWUgbOplciAlcyBza2VwIG5pZSIKKworIzogZ2xvYmFscy5oOjEwNzcKK21zZ2lkICJDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIkthbiBuaWUgdHlkZWxpa2UgbOplcm5hYW0ga3J5IG5pZSIKKworIzogZ2xvYmFscy5oOjEwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJLYW4gbmllIGzqZXIgJXMgb29wbWFhayBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiS2FuIG5pZSBs6mVyICVzIGxlZXMgbmllIgorCisjOiBnbG9iYWxzLmg6MTA4MAorbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiBPbmdlc2tyeWYgc2VkZXJ0IHZvcmlnZSB2ZXJhbmRlcmluZyAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZ2xvYmFscy5oOjEwODEKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODogTnVsIHBhcmFtZXRlciIKKworIyBuamo6IGhtbSwgaG9lIGhhbnRlZXIgbWVucyBkaWUgb25kZXJza2VpZCB0dXNzZW4gJ051bGwnIChhZndlc2lnKSBlbgorIyBuamo6ICdaZXJvJyAoZGllIG5vbW1lcik/CisjOiBnbG9iYWxzLmg6MTA4MworbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IE5vbW1lciB2ZXJ3YWciCisKKyM6IGdsb2JhbHMuaDoxMDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogS2FuIG5pZSBmb3V0bOplciAlcyBvb3BtYWFrIG5pZSIKKworIzogZ2xvYmFscy5oOjEwODkKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IEdlaGV1ZSBvcCEiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIlBhdHJvb24gbmllIGdldmluZCBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiUGF0cm9vbiBuaWUgZ2V2aW5kIG5pZTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDk1Cittc2dpZCAiQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiUGFyYW1ldGVyIG1vZXQgcG9zaXRpZWYgd2VlcyIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiBHZWVuIEZvdXRlIgorCisjOiBnbG9iYWxzLmg6MTA5OQorbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogQmVza2FkaWdlIHRyZWZmZXJzdHJpbmciCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogS29ycnVwdGUgcGF0cm9vbnByb2dyYW0iCisKKyM6IGdsb2JhbHMuaDoxMTAxCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiAncmVhZG9ubHknIG9wc2llIGlzIGFhbiAoZ2VicnVpayAhIG9tIHRlIGR3aW5nKSIKKworIzogZ2xvYmFscy5oOjExMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0NjogS2FuIG5pZSBsZWVzLWFsbGVlbiB2ZXJhbmRlcmxpa2Ugc3RlbCBuaWUgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTEwNgorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0NzogRm91dCB0eWRlbnMgbGVlcyB2YW4gJ2Vycm9yZmlsZSciCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IE5pZSB0b2VnZWxhYXQgaW4gc2FuZHB1dCBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMTExCittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IE9uZ2VsZGlnZSByb2xncm9vdHRlIgorCisjOiBnbG9iYWxzLmg6MTExMgorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogJ3NoZWxsJyAoZG9wKSBvcHNpZSBpcyBsZWVnIgorCisjOiBnbG9iYWxzLmg6MTExMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IFNsdWl0Zm91dCBtZXQgcnVpbGzqZXIiCisKKyM6IGdsb2JhbHMuaDoxMTE0Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3MzogZXRpa2V0c3RhcGVsIGxlZWciCisKKyM6IGdsb2JhbHMuaDoxMTE1Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IEJldmVsIHRlIGtvbXBsZWtzIgorCisjOiBnbG9iYWxzLmg6MTExNgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiBOYWFtIHRlIGxhbmsiCisKKyM6IGdsb2JhbHMuaDoxMTE3Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFRlIHZlZWwgWyIKKworIzogZ2xvYmFscy5oOjExMTgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogVGUgdmVlbCBs6mVybmFtZSIKKworIzogZ2xvYmFscy5oOjExMTkKK21zZ2lkICJUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICJPb3Jib2RpZ2Uga2FyYWt0ZXJzIgorCisjOiBnbG9iYWxzLmg6MTEyMAorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IE9uYmVrZW5kZSBtZXJrZXIiCisKKyM6IGdsb2JhbHMuaDoxMTIxCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBLYW4gbmllIHBsZWtob3VlcnMgdWl0YnJlaSBuaWUiCisKKyM6IGdsb2JhbHMuaDoxMTIyCittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IEZvdXQgdHlkZW5zIHNrcnlmb3BlcmFzaWUiCisKKyM6IGdsb2JhbHMuaDoxMTIzCittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAiTnVsIHRlbGxpbmciCisKKyM6IGdsb2JhbHMuaDoxMTI1Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBHZWJydWlrIHZhbiAnPFNJRD4nIGJ1aXRlIHNrcmlwa29udGVrcyIKKworI34gbXNnaWQgIkUyNTg6IG5vIG1hdGNoZXMgZm91bmQgaW4gY3Njb3BlIGNvbm5lY3Rpb25zIgorI34gbXNnc3RyICJFMjU4OiBnZWVuIHRyZWZmZXJzIGdldmluZCBpbiAnY3Njb3BlJyB2ZXJiaW5kaW5ncyBuaWUiCisKKyN+IG1zZ2lkICJObyBzZXJ2ZXJzIGZvdW5kIGZvciB0aGlzIGRpc3BsYXkiCisjfiBtc2dzdHIgIkdlZW4gYmVkaWVuZXJzIGdldmluZCB2aXIgZGllICdkaXNwbGF5JyBuaWUiCisKKyN+IG1zZ2lkICJNaXNzaW5nIGZpbGVuYW1lIgorI34gbXNnc3RyICJPbnRicmVrZW5kZSBs6mVybmFhbSIKKworI34gbXNnaWQgIkludmFsaWQgbGluZSBudW1iZXI6ICVsZCIKKyN+IG1zZ3N0ciAiT25nZWxkaWdlIHJl62xub21tZXI6ICVsZCIKKworI34gbXNnaWQgIkNhbm5vdCB1c2UgOm5vcm1hbCBmcm9tIGV2ZW50IGhhbmRsZXIiCisjfiBtc2dzdHIgIkthbiAnOm5vcm1hbCcgbmllIHZhbnVpdCBnZWJldXJ0ZW5pc2hhbnRlZXJkZXIgZ2VicnVpayBuaWUiCisKKyN+IG1zZ2lkICIlbGRMLCAlbGRDIgorI34gbXNnc3RyICIlbGRSLCAlbGRLIgorCisjfiBtc2dpZCAiVklNIC0gSGVscCBvbi4uLiIKKyN+IG1zZ3N0ciAiVklNIC0gSHVscCBtZXQuLiIKKworI34gbXNnaWQgIlRvcGljOiIKKyN+IG1zZ3N0ciAiT25kZXJ3ZXJwOiIKKworI34gbXNnaWQgIkVycm9yOiBEdXJpbmcgbG9hZGluZyBmb250c2V0ICVzIgorI34gbXNnc3RyICJGb3V0OiBHZWR1cmVuZGUgZGllIGxhYWkgdmFuIGZvbnRzdGVsICVzIgorCisjfiBtc2dpZCAibG9jYWxlIGlzIG5vdCBzZXQgY29ycmVjdGx5IgorI34gbXNnc3RyICJsb2thYWwgaXMgbmllIGtvcnJlayBnZXN0ZWwgbmllIgorCisjfiBtc2dpZCAiU2V0IExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8geW91ciBsb2NhbGUiCisjfiBtc2dzdHIgIlN0ZWwgZGllICdMQU5HJyBvbWdld2luZ3N2ZXJhbmRlcmxpa2UgbmEgam91IGxva2FhbCB0b2UiCisKKyN+IG1zZ2lkICJGb3Iga29yZWFuOiIKKyN+IG1zZ3N0ciAiVmlyIEFmcmlrYWFuczoiCisKKyN+IG1zZ2lkICIgICBjc2g6IHNldGVudiBMQU5HIGtvIgorI34gbXNnc3RyICIgICBjc2g6IHNldGVudiBMQU5HIGFmIgorCisjfiBtc2dpZCAiICAgc2ggOiBleHBvcnQgTEFORz1rbyIKKyN+IG1zZ3N0ciAiICAgc2g6IGV4cG9ydCBMQU5HPWFmIgorCisjfiBtc2dpZCAiZm9udHNldCBuYW1lOiAlcyIKKyN+IG1zZ3N0ciAiZm9udHN0ZWwgbmFhbTogJXMiCisKKyN+IG1zZ2lkICJZb3VyIGxhbmd1YWdlIEZvbnQgbWlzc2luZyIKKyN+IG1zZ3N0ciAiSm91IHRhYWwgRm9udCBvbnRicmVlayIKKworI34gbXNnaWQgImxvYWRlZCBmb250bmFtZTogJXMiCisjfiBtc2dzdHIgImdlbGFhaWRlIGZvbnRuYWFtOiAlcyIKKworI34gbXNnaWQgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlYnVnZ2VyIHNpZ24iCisjfiBtc2dzdHIgIkthbiBuaWUgZ2VoZXVlIHRvZWtlbiB2aXIgb250Zm91dGVydGVrZW4gbmllIgorCisjfiBtc2dpZCAiYXV0b21hdGEgRVJST1I6IGludGVybmFsIgorI34gbXNnc3RyICJhdXRvbWF0YSBGT1VUOiBpbnRlcm4iCisKKyN+IG1zZ2lkICJjc19hZGRfY29tbW9uOiBhbGxvYyBmYWlsICMxIgorI34gbXNnc3RyICInY3NfYWRkX2NvbW1vbic6IHRvZWtlbiBvbnN1a3Nlc3ZvbCAjMSIKKworI34gbXNnaWQgImNzX2FkZF9jb21tb246IGFsbG9jIGZhaWwgIzIiCisjfiBtc2dzdHIgIidjc19hZGRfY29tbW9uJzogdG9la2VuIG9uc3Vrc2Vzdm9sICMyIgorCisjfiBtc2dpZCAiY3NfYWRkX2NvbW1vbjogYWxsb2MgZmFpbCAjMyIKKyN+IG1zZ3N0ciAiJ2NzX2FkZF9jb21tb24nOiB0b2VrZW4gb25zdWtzZXN2b2wgIzMiCisKKyN+IG1zZ2lkICJjc19hZGRfY29tbW9uOiBhbGxvYyBmYWlsICM0IgorI34gbXNnc3RyICInY3NfYWRkX2NvbW1vbic6IHRvZWtlbiBvbnN1a3Nlc3ZvbCAjNCIKKworI34gbXNnaWQgIlJldHJpZXZlIG5leHQgc3ltYm9sIgorI34gbXNnc3RyICJLcnkgdm9sZ2VuZGUgc2ltYm9vbCIKKworI34gbXNnaWQgIi0tIFNOaUZGKyBjb21tYW5kcyAtLSIKKyN+IG1zZ3N0ciAiLS0gU05pRkYrIGJldmVsZSAtLSIKKworI34gbXNnaWQgIlVucmVjb2duaXplZCBzbmlmZiByZXF1ZXN0IFslc10iCisjfiBtc2dzdHIgIk9uYmVrZW5kZSBzbmlmZiB2ZXJzb2VrIFslc10iCisKKyN+IG1zZ2lkICJDYW4ndCBjcmVhdGUgaW5wdXQgY29udGV4dC4iCisjfiBtc2dzdHIgIkthbiBuaWUgaW52b2Vya29udGVrcyBza2VwIG5pZS4iCisKKyN+IG1zZ2lkICJTb3JyeSwgZGVsZXRpbmcgYSBtZW51IGlzIG5vdCBwb3NzaWJsZSBpbiB0aGUgQXRoZW5hIHZlcnNpb24iCisjfiBtc2dzdHIgIiIKKyN+ICJKYW1tZXIsIGluIGRpZSBBdGhlbmEgd2Vlcmdhd2UgaXMgZGl0IG9ubW9vbnRsaWsgb20gJ24ga2llc2x5cyB0ZSBza3JhcCIKKworI34gbXNnaWQgIk91dCBvZiBtZW1vcnkiCisjfiBtc2dzdHIgIkdlaGV1ZSBvcCIKKworI34gbXNnaWQgIlBDICgzMiBiaXRzIFZpbSkiCisjfiBtc2dzdHIgIlBDICgzMiBiaXNzZSBWaW0pIgorCisjfiBtc2dpZCAiUEMgKDE2IGJpdHMgVmltKSIKKyN+IG1zZ3N0ciAiUEMgKDE2IGJpc3NlIFZpbSkiCisKKyN+IG1zZ2lkICJVbnN1cHBvcnRlZCBzY3JlZW4gbW9kZSIKKyN+IG1zZ3N0ciAiT25nZXN0ZXVuZGUgc2tlcm1tb2R1cyIKKworI34gbXNnaWQgImRlYWRseSBzaWduYWwiCisjfiBtc2dzdHIgImRvZGVsaWtlIHNlaW4iCisKKyN+IG1zZ2lkICJzb21lIgorI34gbXNnc3RyICJzb21taWdlIgorCisjfiBtc2dpZCAiTGlicmFyeSBjYWxsIGZhaWxlZCIKKyN+IG1zZ3N0ciAiQmlibGlvdGVla2Z1bmtzaWVyb2VwIGhldCBnZWZhYWwiCisKKyN+IG1zZ2lkICJDYW5ub3QgY2xlYXIgYWxsIGhpZ2hsaWdodCBncm91cHMiCisjfiBtc2dzdHIgIkthbiBuaWUgYWxsZSB1aXRsaWdncm9lcGUgbGVlZ21hYWsgbmllIgorCisjfiBtc2dpZCAiR1VJIGlzIG5vdCBydW5uaW5nIgorI34gbXNnc3RyICJHVUkgdm9lciBuaWUgdWl0IG5pZSIKKworI34gbXNnaWQgIkNvbW1hbmQgdG9vIGxvbmciCisjfiBtc2dzdHIgIkJldmVsIHRlIGxhbmsiCisKKyN+IG1zZ2lkICJBbWJpZ3VvdXMgbWFwcGluZyIKKyN+IG1zZ3N0ciAiRHViYmVsc2lubmlnZSBiaW5kaW5nIgorCisjfiBtc2dpZCAiQW1iaWd1b3VzIG1hcHBpbmcsIGNvbmZsaWN0cyB3aXRoIFwiJXNcIiIKKyN+IG1zZ3N0ciAiRHViYmVsc2lubmlnZSBiaW5kaW5nLCBib3RzIG1ldCBcIiVzXCIiCisKKyN+IG1zZ2lkICJUb28gbWFueSBcXHooIgorI34gbXNnc3RyICJUZSB2ZWVsIFxceigiCisKKyN+IG1zZ2lkICJUb28gbWFueSBcXCgiCisjfiBtc2dzdHIgIlRlIHZlZWwgXFwoIgorCisjfiBtc2dpZCAiVW5tYXRjaGVkIFxceigiCisjfiBtc2dzdHIgIk9ucGFhciBcXHooIgorCisjfiBtc2dpZCAiVW5tYXRjaGVkIFxcJSgiCisjfiBtc2dzdHIgIk9ucGFhciBcXHoiCisKKyN+IG1zZ2lkICJVbm1hdGNoZWQgXFwoIgorI34gbXNnc3RyICJPbnBhYXIgXFwoIgorCisjfiBtc2dpZCAiVW5tYXRjaGVkIFxcKSIKKyN+IG1zZ3N0ciAiT25wYWFyIFxcKSIKKworI34gbXNnaWQgIiosIFxcKyBvciBcXHsgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKKyN+IG1zZ3N0ciAiKiwgXFwrIG9mIFxceyBvcGVyYW5kIG1hZyBsZWVnIHdlZXMiCisKKyN+IG1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXEAiCisjfiBtc2dzdHIgIm9uZ2VsZGlnZSBrYXJha3RlciBuYSBcXEAiCisKKyN+IG1zZ2lkICJUb28gbWFueSBjb21wbGV4IFxcey4uLn1zIgorI34gbXNnc3RyICJUZSB2ZWVsIGtvbXBsZWtzZSBcXHsuLi59aWVzIgorCisjfiBtc2dpZCAiTmVzdGVkICosIFxcPSwgXFwrLCBcXCEgb3IgXFx7IgorI34gbXNnc3RyICJHZW5lc3RlICosIFxcPSwgXFwrLCBcXCEgb2YgXFx7IgorCisjfiBtc2dpZCAiaW52YWxpZCB1c2Ugb2YgXFxfIgorI34gbXNnc3RyICJvbmdlbGRpZ2UgZ2VicnVpayB2YW4gXFxfIgorCisjfiBtc2dpZCAiXFw9IGZvbGxvd3Mgbm90aGluZyIKKyN+IG1zZ3N0ciAiXFw9IHZvbGcgbmlrcyIKKworI34gbXNnaWQgIlxcKyBmb2xsb3dzIG5vdGhpbmciCisjfiBtc2dzdHIgIlxcKyB2b2xnIG5pa3MiCisKKyN+IG1zZ2lkICJcXEAgZm9sbG93cyBub3RoaW5nIgorI34gbXNnc3RyICJcXEAgdm9sZyBuaWtzIgorCisjfiBtc2dpZCAiXFx7IGZvbGxvd3Mgbm90aGluZyIKKyN+IG1zZ3N0ciAiXFx7IHZvbGcgbmlrcyIKKworI34gbXNnaWQgIlxcKiBmb2xsb3dzIG5vdGhpbmciCisjfiBtc2dzdHIgIlxcKiB2b2xnIG5pa3MiCisKKyN+IG1zZ2lkICJJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorI34gbXNnc3RyICJPbmdlbGRpZ2UgdHJ1LXZlcnd5c2luZyIKKworI34gbXNnaWQgIlxceiggbm90IGFsbG93ZWQgaGVyZSIKKyN+IG1zZ3N0ciAiXFx6KCBuaWUgaGllciB0b2VnZWxhYXQgbmllIgorCisjfiBtc2dpZCAiXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKKyN+IG1zZ3N0ciAiXFx6MSBlLmEuIG5pZSBoaWVyIHRvZWdlbGFhdCBuaWUiCisKKyN+IG1zZ2lkICJJbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXHoiCisjfiBtc2dzdHIgIm9uZ2VsZGlnZSBrYXJha3RlciBuYSBcXHoiCisKKyN+IG1zZ2lkICJNaXNzaW5nIF0gYWZ0ZXIgXFwlWyIKKyN+IG1zZ3N0ciAiT250YnJla2VuZGUgXSBuYSBcXCVbIgorCisjfiBtc2dpZCAiRW1wdHkgXFwlW10iCisjfiBtc2dzdHIgIkxl6yBcXCVbXSIKKworI34gbXNnaWQgIkludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxcJSIKKyN+IG1zZ3N0ciAib25nZWxkaWdlIGthcmFrdGVyIG5hIFxcJSIKKworI34gbXNnaWQgIlVuZXhwZWN0ZWQgbWFnaWMgY2hhcmFjdGVyOyBjaGVjayBNRVRBLiIKKyN+IG1zZ3N0ciAiT252ZXJ3YWd0ZSB0b29ya2FyYWt0ZXI7IGt5ayBuYSBNRVRBLiIKKworI34gbXNnaWQgInR5cGUgIDpoZWxwIHVnYW5kYTxFbnRlcj4gICAgIGlmIHlvdSBsaWtlIFZpbSAiCisjfiBtc2dzdHIgInRpayAgIDpoZWxwIHVnYW5kYTxFbnRlcj4gICAgIGFzIGp5IGhvdSB2YW4gVmltICAgICAiCisKKyN+IG1zZ2lkICIgICAgIFdBUk5JTkc6IEludGVsIENQVSBkZXRlY3RlZC4gICAgIgorI34gbXNnc3RyICIgICAgIFdBQVJTS1VXSU5HOiBJbnRlbCBTVkUgYmVzcGV1ci4gICAgIgorCisjfiBtc2dpZCAiIFBQQyBoYXMgYSBtdWNoIGJldHRlciBhcmNoaXRlY3R1cmUuICIKKyN+IG1zZ3N0ciAiIFBQQyBoZXQgJ24gdmVlbCBiZXRlciBhcmdpdGVrdHV1ci4gIgorCisjfiBtc2dpZCAiU2VjdXJpdHkgZXJyb3I6IG5ldyB2aW1pbmZvIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rIgorI34gbXNnc3RyICJTZWt1cml0ZWl0c2ZvdXQ6IG51d2UgdmltaW5mbyBs6mVyIGlzIGEgc2ltYm9saWVzZSBza2FrZWwiCisKKyN+IG1zZ2lkICJsaW5lIH4lbGQ6ICVzIgorI34gbXNnc3RyICJyZetsIH4lbGQ6ICVzIgorCisjfiBtc2dpZCAibWFrZWVmIG9wdGlvbiBub3Qgc2V0IgorI34gbXNnc3RyICInbWFrZWVmJyBvcHNpZSBuaWUgYWFuIG5pZSIKKworI34gbXNnaWQgIlNlY3VyaXR5IGVycm9yOiBmaWx0ZXIgb3V0cHV0IGlzIGEgc3ltYm9saWMgbGluazogJXMiCisjfiBtc2dzdHIgIlNla3VyaXRlaXRzZm91dDogZmlsdGVyIGFmdm9lciBpcyAnbiBzaW1ib2xpZXNlIHNrYWtlbCIKKworI34gbXNnaWQgIlNlY3VyaXR5IGVycm9yOiAnY2hhcmNvbnZlcnQnIG91dHB1dCBpcyBhIHN5bWJvbGljIGxpbmsiCisjfiBtc2dzdHIgIlNla3VyaXRlaXRzZm91dDogJ2NoYXJjb252ZXJ0JyBhZnZvZXIgaXMgJ24gc2ltYm9saWVzZSBza2FrZWwiCisKKyN+IG1zZ2lkICJTZWN1cml0eSBlcnJvcjogZmlsdGVyIGlucHV0IGlzIGEgc3ltYm9saWMgbGluazogJXMiCisjfiBtc2dzdHIgIlNla3VyaXRlaXRzZm91dDogZmlsdGVyIGludm9lciBpcyAnbiBzaW1ib2xpZXNlIHNrYWtlbCIKKworI34gbXNnaWQgIkZvbGQgbXVzdCBiZSBhdCBsZWFzdCB0d28gbGluZXMiCisjfiBtc2dzdHIgIiduIFZvdSBtb2V0IHRlbiBtaW5zdGUgMiByZetscyB3ZWVzIgorCisjfiBtc2dpZCAiTm8gZm9sZCBhdCB0aGlzIGxpbmUiCisjfiBtc2dzdHIgIkdlZW4gdm91IGJ5IGhpZXJkaWUgcmXrbCBuaWUiCisKKyN+IG1zZ2lkICJTZWN1cml0eSBlcnJvcjogc2hlbGwgY29tbWFuZCBvdXRwdXQgaXMgYSBzeW1ib2xpYyBsaW5rIgorI34gbXNnc3RyICJTZWt1cml0ZWl0c2ZvdXQ6IERvcC1iZXZlbCBhZnZvZXIgaXMgJ24gc2ltYm9saWVzZSBza2FrZWwiCisKKyN+IG1zZ2lkICJXYXJuaW5nOiAlcyBvcHRpb24gY2hhbmdlZCBmcm9tIG1vZGVsaW5lIgorI34gbXNnc3RyICJXYWFyc2t1d2luZzogJXMgb3BzaWUgdmVyYW5kZXIgdmFuYWYgbW9kdXNseW4iCisKKyN+IG1zZ2lkICJDaGFuZ2UgZGlyIGRlYnVnZ2luZyBlbmFibGVkLiIKKyN+IG1zZ3N0ciAiVmVyYW5kZXJnaWRzIG9udGZvdXRpbmcgaW4gc3RhYXQgZ2VzdGVsIgorCisjfiBtc2dpZCAiTm90IGEgcHJvcGVyIGZpbGUgbmFtZTogJyVzJyIKKyN+IG1zZ3N0ciAiTmllICduIGdlbGRpZ2UgbOplcm5hYW0gbmllOiAnJXMnIgorCisjfiBtc2dpZCAiRmlsZSBuYW1lICclcycgaXMgdmFsaWQiCisjfiBtc2dzdHIgImzqZXJuYWFtICclcyBpcyBvbmdlbGRpZyIKKworI34gbXNnaWQgIkxlYXZlOiAlcyIKKyN+IG1zZ3N0ciAiVmVybGFhdDogJXMiCisKKyN+IG1zZ2lkICJXQVJOSU5HOiB0YWcgY29tbWFuZCBjaGFuZ2VkIGEgYnVmZmVyISEhIgorI34gbXNnc3RyICJXQUFSU0tVV0lORzogZXRpa2V0YmV2ZWwgaGV0IGJ1ZmZlciB2ZXJhbmRlciEhISIKZGlmZiAtLWdpdCBhL3NyYy9wby9jYS5wbyBiL3NyYy9wby9jYS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTUwZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL2NhLnBvCkBAIC0wLDAgKzEsNjM0MSBAQAorIyBDYXRhbGFuIG1lc3NhZ2VzIGZvciB2aW0uCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgRXJuZXN0IEFkcm9ndekgPGVhZHJvZ3VlQGdteC5uZXQ+LgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogdmltIDYuMlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAzLTExLTAxIDIwOjEwKzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTAxLTE5IDEzOjU3KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEVybmVzdCBBZHJvZ3XpIDxlYWRyb2d1ZUBnbXgubmV0PlxuIgorIkxhbmd1YWdlLVRlYW06IENhdGFsYW4gPGNhQGRvZGRzLm5ldD5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogTm8gcydoYSBwb2d1dCBhc3NpZ25hciBtZW3ycmlhIHBlciBjYXAgYnVmZmVyLCBzb3J0aW50Li4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBObyBzJ2hhIHBvZ3V0IGFzc2lnbmFyIG1lbfJyaWEgcGVsIGJ1ZmZlciwgdXNhbnQtbmUgdW4gYWx0cmUuLi4iCisKKyMgdW5sb2FkOiBUcmV1IGVsIGJ1ZmZlciBkZSBsYSBtZW3ycmlhIHBlcvIgZWwgZGVpeGEgYSBsYSBsbGlzdGEKKyMgZGVsZXRlOiBUcmV1IGVsIGJ1ZmZlciBkZSBsYSBtZW3ycmlhIGkgZGUgbGEgbGxpc3RhIGRlIGJ1ZmZlcnMKKyMgd2lwZSBvdXQ6IEVsaW1pbmEgZWwgYnVmZmVyIGFtYiB0b3RlcyBsZXMgb3BjaW9ucywgbWFycXVlcywgZXRjLgorIworIzogYnVmZmVyLmM6Nzk3Cittc2dpZCAiRTUxNTogTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICJFNTE1OiBObyBzJ2hhIGFsbGliZXJhdCBjYXAgYnVmZmVyIgorCisjOiBidWZmZXIuYzo3OTkKK21zZ2lkICJFNTE2OiBObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiRTUxNjogTm8gcydoYSBlbGltaW5hdCBjYXAgYnVmZmVyIgorCisjOiBidWZmZXIuYzo4MDEKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiBObyBzJ2hhIGRlc3Ryde90IGNhcCBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjgwOQorbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICJTJ2hhIGFsbGliZXJhdCAxIGJ1ZmZlciIKKworIzogYnVmZmVyLmM6ODExCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgIlMnaGFuIGFsbGliZXJhdCAlZCBidWZmZXJzIgorCisjOiBidWZmZXIuYzo4MTYKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJTJ2hhIGVsaW1pbmF0IDEgYnVmZmVyIgorCisjOiBidWZmZXIuYzo4MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICJTJ2hhbiBlbGltaW5hdCAlZCBidWZmZXJzIgorCisjOiBidWZmZXIuYzo4MjMKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIlMnaGEgZGVzdHJ173QgMSBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjgyNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiUydoYW4gZGVzdHJ173QgJWQgYnVmZmVycyIKKworIzogYnVmZmVyLmM6ODg2Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogTm8gcydoYSB0cm9iYXQgY2FwIGJ1ZmZlciBtb2RpZmljYXQiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MjUKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogTm8gaGkgaGEgY2FwIGJ1ZmZlciBhIGxhIGxsaXN0YSIKKworIzogYnVmZmVyLmM6OTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQ2Fubm90IGdvIHRvIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU4NjogTm8gcydoYSBwb2d1dCBhbmFyIGFsIGJ1ZmZlciAlbGQiCisKKyM6IGJ1ZmZlci5jOjk0MAorbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiBObyBlcyBwb3QgYW5hciBt6XMgZW5sbOAgZGUgbCf6bHRpbSBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjk0MgorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogTm8gZXMgcG90IGFuYXIgbelzIGVubGzgIGRlbCBwcmltZXIgYnVmZmVyIgorCisjOiBidWZmZXIuYzo5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6IE5vIHMnaGEgZGVzYXQgZWwgYnVmZmVyICVsZCAoYWZlZ2l1ICEgcGVyIGNvbmZpcm1hcikiCisKKyM6IGJ1ZmZlci5jOjk4MgorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiBObyBlcyBwb3QgYWxsaWJlcmFyIGwn+mx0aW0gYnVmZmVyIgorCisjOiBidWZmZXIuYzoxNTAwCittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogQXRlbmNp8zogUydoYSBkZXNib3JkYXQgbGEgbGxpc3RhIGRlIG5vbXMgZGUgZml0eGVycyIKKworIzogYnVmZmVyLmM6MTY3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IE5vIHMnaGEgdHJvYmF0IGVsIGJ1ZmZlciAlbGQiCisKKyM6IGJ1ZmZlci5jOjE5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBIaSBoYSBt6XMgZCd1bmEgY29pbmNpZOhuY2lhIHBlciAlcyIKKworIzogYnVmZmVyLmM6MTkwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogTm8gaGkgaGEgY2FwIGNvaW5jaWTobmNpYSBwZXIgJXMiCisKKyM6IGJ1ZmZlci5jOjIyOTkgZXhfZG9jbWQuYzo2NTYwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICJs7W5pYSAlbGQiCisKKyM6IGJ1ZmZlci5jOjIzODIKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiBKYSBleGlzdGVpeCB1biBidWZmZXIgYW1iIGFxdWVzdCBub20iCisKKyM6IGJ1ZmZlci5jOjI2NzUKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFtNb2RpZmljYXRdIgorCisjOiBidWZmZXIuYzoyNjgwCittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbTm8gZWRpdGF0XSIKKworIzogYnVmZmVyLmM6MjY4NQorbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIltGaXR4ZXIgbm91XSIKKworIzogYnVmZmVyLmM6MjY4NgorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltMZWN0dXJhIGVycvJuaWFdIgorCisjOiBidWZmZXIuYzoyNjg4IGZpbGVpby5jOjE5MTgKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbbm9t6XMgbGVjdHVyYV0iCisKKyM6IGJ1ZmZlci5jOjI3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICIxIGztbmlhIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIGztbmllcyAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjcxMgorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAibO1uaWEgJWxkIGRlICVsZCAtLSVkJSUtLSBjb2wgIgorCisjOiBidWZmZXIuYzoyODEzCittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbQ2FwIGZpdHhlcl0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6Mjg1MworbXNnaWQgImhlbHAiCittc2dzdHIgImFqdWRhIgorCisjOiBidWZmZXIuYzozNDEyIHNjcmVlbi5jOjQ5OTYKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIlthanVkYV0iCisKKyM6IGJ1ZmZlci5jOjM0NDQgc2NyZWVuLmM6NTAwMgorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW1Zpc3RhIHBy6HZpYV0iCisKKyM6IGJ1ZmZlci5jOjM3MjQKK21zZ2lkICJBbGwiCittc2dzdHIgIlRvdCIKKworIzogYnVmZmVyLmM6MzcyNAorbXNnaWQgIkJvdCIKK21zZ3N0ciAiQmFpeCIKKworIzogYnVmZmVyLmM6MzcyNgorbXNnaWQgIlRvcCIKK21zZ3N0ciAiRGFsdCIKKworIzogYnVmZmVyLmM6NDQ3MAorbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICJcbiMgTGxpc3RhIGRlIGJ1ZmZlcnM6XG4iCisKKyM6IGJ1ZmZlci5jOjQ1MDMKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIltMbGlzdGEgZCdlcnJvcnNdIgorCisjOiBidWZmZXIuYzo0NTE2IG1lbWxpbmUuYzoxNTAxCittc2dpZCAiW05vIEZpbGVdIgorbXNnc3RyICJbQ2FwIGZpdHhlcl0iCisKKyM6IGJ1ZmZlci5jOjQ4MTkKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiXG4tLS0gU2VueWFscyAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiU2VueWFscyBwZXIgJXM6IgorCisjOiBidWZmZXIuYzo0ODQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICBs7W5pYT0lbGQgIGlkPSVkICBub209JXMiCisKKyM6IGRpZmYuYzoxMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IE5vIGVzIHBvZGVuIG1vc3RyYXIgZGlmZXLobmNpZXMgYW1iIG3pcyBkZSAlbGQgYnVmZmVycyIKKworIzogZGlmZi5jOjY1MQorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBObyBzJ2hhbiBwb2d1dCBtb3N0cmFyIGxlcyBkaWZlcuhuY2llcyIKKworIyDJcyBlbCBub20gZCd1biBkaeBsZWcuIE1lbvogIlNwbGl0IHBhdGNoZWQgYnkuLi4iCisjOiBkaWZmLmM6NzUwCittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiRml0eGVyIGRlIGRpZmVy6G5jaWVzIgorCisjOiBkaWZmLmM6MTAwMQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogTm8gcydoYSBwb2d1dCBsbGVnaXIgbGEgc29ydGlkYSBkZSBkaWZmIgorCisjOiBkaWZmLmM6MTc0MgorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiBFbCBidWZmZXIgYWN0dWFsIG5vIGVzIHRyb2JhIGVuIG1vZGUgZGlmZiIKKworIzogZGlmZi5jOjE3NTQKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiBObyBoaSBoYSBjYXAgYWx0cmUgYnVmZmVyIGVuIG1vZGUgZGlmZiIKKworIzogZGlmZi5jOjE3NjIKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IEhpIGhhIG3pcyBkZSAyIGJ1ZmZlcnMgZW4gbW9kZSBkaWZmLCBubyBzZSBzYXAgcXVpbiB1c2FyIgorCisjOiBkaWZmLmM6MTc4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IE5vIHMnaGEgdHJvYmF0IGVsIGJ1ZmZlciBcIiVzXCIiCisKKyM6IGRpZmYuYzoxNzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogRWwgYnVmZmVyIFwiJXNcIiBubyBlcyB0cm9iYSBlbiBtb2RlIGRpZmYiCisKKyM6IGRpZ3JhcGguYzoyMTcyCittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IE5vIGVzIHBlcm1ldGVuIGNhcuBjdGVycyBkJ2VzY2FwYWRhIGVuIHVuIGTtZ3JhZiIKKworIzogZGlncmFwaC5jOjIzNDQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IE5vIHMnaGEgdHJvYmF0IGVsIGZpdHhlciBkZSBtYXBhIGRlIHRlY2xlcyIKKworIyB0cmFkdWNjafMgZGUgq3NvdXJjZWQgZmlsZbsuICBlYWMKKyM6IGRpZ3JhcGguYzoyMzcxCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiBMJ29yZHJlIDpsb2Fka2V5bWFwIG5vbelzIGVzIHBvdCB1c2FyIGVuIGZpdHhlcnMiCisKKyMgYnVzY2FyIHVuIG5vbSwgZW4gbGxvYyBkZWwgdmVyYiCrY29tcGxldGFyuy4gIGVhYworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgQ29tcGxldGFyIHBhcmF1bGVzIGNsYXUgKF5OL15QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorbXNnc3RyICIgTW9kZSBeWCAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorCisjIGJ1c2NhciB1biBub20sIGVuIGxsb2MgZGVsIHZlcmIgq2NvbXBsZXRhcrsuICBlYWMKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBDb21wbGV0YXIgcGFyYXVsZXMgY2xhdSBsb2NhbHMgKF5OL15QKSIKKworIyBidXNjYXIgdW4gbm9tLCBlbiBsbG9jIGRlbCB2ZXJiIKtjb21wbGV0YXK7LiAgZWFjCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiBDb21wbGV0YXIgbO1uaWVzIHNlbmNlcmVzICheTC9eTi9eUCkiCisKKyMgYnVzY2FyIHVuIG5vbSwgZW4gbGxvYyBkZWwgdmVyYiCrY29tcGxldGFyuy4gIGVhYworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRi9eTi9eUCkiCittc2dzdHIgIiBDb21wbGV0YXIgbm9tcyBkZSBmaXR4ZXIgKF5GL15OL15QKSIKKworIyBidXNjYXIgdW4gbm9tLCBlbiBsbG9jIGRlbCB2ZXJiIKtjb21wbGV0YXK7LiAgZWFjCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiIENvbXBsZXRhciBldGlxdWV0ZXMgKF5dL15OL15QKSIKKworIyBidXNjYXIgdW4gbm9tLCBlbiBsbG9jIGRlbCB2ZXJiIKtjb21wbGV0YXK7LiAgZWFjCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIENvbXBsZXRhciB1YmljYWNpb25zICheTi9eUCkiCisKKyMgYnVzY2FyIHVuIG5vbSwgZW4gbGxvYyBkZWwgdmVyYiCrY29tcGxldGFyuy4gIGVhYworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkQvXk4vXlApIgorbXNnc3RyICIgQ29tcGxldGFyIGRlZmluaWNpb25zICheRC9eTi9eUCkiCisKKyMgYnVzY2FyIHVuIG5vbSwgZW4gbGxvYyBkZWwgdmVyYiCrY29tcGxldGFyuy4gIGVhYworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgQ29tcGxldGFyIHBhcmF1bGVzIGRlIGRpY2Npb25hcmkgKF5LL15OL15QKSIKKworIyBidXNjYXIgdW4gbm9tLCBlbiBsbG9jIGRlbCB2ZXJiIKtjb21wbGV0YXK7LiAgZWFjCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIENvbXBsZXRhciBzaW7ybmltcyAoXlQvXk4vXlApIgorCisjIGJ1c2NhciB1biBub20sIGVuIGxsb2MgZGVsIHZlcmIgq2NvbXBsZXRhcrsuICBlYWMKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgQ29tcGxldGFyIG9yZHJlcyAoXlYvXk4vXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAiUydoYSBhcnJpYmF0IGFsIGZpbmFsIGRlbCBwYXLgZ3JhZiIKKworIzogZWRpdC5jOjk1NQorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiTCdvcGNp8yAndGhlc2F1cnVzJyBubyBlc3TgIGRlZmluaWRhIgorCisjOiBlZGl0LmM6MTE1OQorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkwnb3BjafMgJ2RpY3Rpb25hcnknIG5vIGVzdOAgZGVmaW5pZGEiCisKKyM6IGVkaXQuYzoyMTQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJTJ2VzdOAgZXhhbWluYW50IGVsIGRpY2Npb25hcmk6ICVzIgorCisjOiBlZGl0LmM6MjM1MAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnNlcmlyKSBEZXNwbGHnYXIgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzNTIKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHN1YnN0aXR1aXIpIERlc3BsYedhciAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZzogJXMiCittc2dzdHIgIkV4YW1pbmFudDogJXMiCisKKyM6IGVkaXQuYzoyNzAxCittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIlMnZXN0YW4gZXhhbWluYW50IGxlcyBldGlxdWV0ZXMuIgorCisjOiBlZGl0LmM6MzM2MworbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiBBZmVnaW50IgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjM0MTIKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIENlcmNhbnQuLi4iCisKKyM6IGVkaXQuYzozNDY4Cittc2dpZCAiQmFjayBhdCBvcmlnaW5hbCIKK21zZ3N0ciAiT3JpZ2luYWwiCisKKyM6IGVkaXQuYzozNDczCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIlBhcmF1bGEgZCd1bmEgYWx0cmEgbO1uaWEiCisKKyM6IGVkaXQuYzozNDc4Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgItpuaWNhIGNvaW5jaWTobmNpYSIKKworIzogZWRpdC5jOjM1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgImNvaW5jaWTobmNpYSAlZCBkZSAlZCIKKworIzogZWRpdC5jOjM1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgImNvaW5jaWTobmNpYSAlZCIKKworIy4gU2tpcCBmdXJ0aGVyIGFyZ3VtZW50cyBidXQgZG8gY29udGludWUgdG8KKyMuICogc2VhcmNoIGZvciBhIHRyYWlsaW5nIGNvbW1hbmQuCisjOiBldmFsLmM6OTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogTGEgdmFyaWFibGUg6XMgZGVzY29uZWd1ZGE6IFwiJXNcIiIKKworIzogZXZhbC5jOjEyNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiBGYWx0ZW4gcGFy6G50ZXNpczogJXMiCisKKyM6IGV2YWwuYzoxMzgwIGV2YWwuYzoxMzk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogTm8gZXhpc3RlaXggdGFsIHZhcmlhYmxlOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNjUwCittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBGYWx0YSB1biAnOicgZGVzcHLpcyBkZSAnPyciCisKKyM6IGV2YWwuYzoyMjY2Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IEZhbHRhIHVuICcpJyIKKworIzogZXZhbC5jOjIzMjMKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogRmFsdGEgdW4gJ10nIgorCisjOiBldmFsLmM6MjM5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjogRmFsdGEgZWwgbm9tIGRlIGwnb3BjafM6ICVzIgorCisjOiBldmFsLmM6MjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IEwnb3BjafMg6XMgZGVzY29uZWd1ZGE6ICVzIgorCisjOiBldmFsLmM6MjQ4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogRmFsdGVuIGNvbWV0ZXM6ICVzIgorCisjOiBldmFsLmM6MjYxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogRmFsdGVuIGNvbWV0ZXM6ICVzIgorCisjOiBldmFsLmM6Mjk2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IEFyZ3VtZW50cyBubyB24GxpZHMgcGVyIGxhIGZ1bmNp8yAlcyIKKworIzogZXZhbC5jOjI5OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IExhIGZ1bmNp8yDpcyBkZXNjb25lZ3VkYTogJXMiCisKKyM6IGV2YWwuYzoyOTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBNYXNzYSBhcmd1bWVudHMgcGVyIGxhIGZ1bmNp8zogJXMiCisKKyM6IGV2YWwuYzoyOTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IEZhbHRlbiBhcmd1bWVudHMgcGVyIGxhIGZ1bmNp8zogJXMiCisKKyMgdHJhZHVjY2nzICJsbGl1cmUiLiAgZWFjCisjOiBldmFsLmM6Mjk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IEhldSB1c2F0IDxTSUQ+IGVuIHVuIGNvbnRleHQgbm8gduBsaWQ6ICVzIgorCisjLgorIy4gKiBZZXMgdGhpcyBpcyB1Z2x5LCBJIGRvbid0IHBhcnRpY3VsYXJseSBsaWtlIGl0IGVpdGhlci4gIEJ1dCBkb2luZyBpdAorIy4gKiB0aGlzIHdheSBoYXMgdGhlIGNvbXBlbGxpbmcgYWR2YW50YWdlIHRoYXQgdHJhbnNsYXRpb25zIG5lZWQgbm90IHRvCisjLiAqIGJlIHRvdWNoZWQgYXQgYWxsLiAgU2VlIGJlbG93IHdoYXQgJ29rJyBhbmQgJ3luYycgYXJlIHVzZWQgZm9yLgorIy4KKyM6IGV2YWwuYzozNTg2IGd1aS5jOjQyNTQgZ3VpX2d0ay5jOjE5OTcKK21zZ2lkICImT2siCittc2dzdHIgIiZEJ2Fjb3JkIgorCisjOiBldmFsLmM6NDEyMQorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCBs7W5pZXM6ICIKKworIzogZXZhbC5jOjUzNDYKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZEJ2Fjb3JkXG4iCisiJkNhbmNlbLdsYSIKKworIzogZXZhbC5jOjUzODYKK21zZ2lkICJjYWxsZWQgaW5wdXRyZXN0b3JlKCkgbW9yZSBvZnRlbiB0aGFuIGlucHV0c2F2ZSgpIgorbXNnc3RyICJzJ2hhIGNyaWRhdCBpbnB1dHJlc3RvcmUoKSBt6XMgc292aW50IHF1ZSBpbnB1dHNhdmUoKSIKKworIzogZXZhbC5jOjYzMDEKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IE5vIGhpIGhhIGNvbm5leGnzIGFtYiBlbCBzZXJ2aWRvciBWaW0iCisKKyM6IGV2YWwuYzo2Mzk4Cittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6IE5vIHMnaGEgcG9ndXQgbGxlZ2lyIGxhIHJlc3Bvc3RhIGRlbCBzZXJ2aWRvciIKKworIyCrcmVzuyA/ICBlYWMKKyM6IGV2YWwuYzo2NDI2Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBObyBzJ2hhIHBvZ3V0IGVudmlhciByZXMgYWwgY2xpZW50IgorCisjIKtyZXO7ID8gIGVhYworIzogZXZhbC5jOjY0NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IE5vIHMnaGEgcG9ndXQgZW52aWFyIHJlcyBhICVzIgorCisjOiBldmFsLmM6NjU3NAorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKE5vIHbgbGlkKSIKKworIzogZXZhbC5jOjc2ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogTGEgdmFyaWFibGUgbm8gZXN04CBkZWZpbmlkYTogJXMiCisKKyM6IGV2YWwuYzo4MTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IEVsIG5vbSBkZSBsYSB2YXJpYWJsZSDpcyBpbLdsZWdhbDogJXMiCisKKyM6IGV2YWwuYzo4NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTIyOiBMYSBmdW5jafMgJXMgamEgZXhpc3RlaXgsIGFmZWdpdSAhIHBlciBzdWJzdGl0dWlyLWxhIgorCisjOiBldmFsLmM6ODQ3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIzOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTIzOiBMYSBmdW5jafMgbm8gZXN04CBkZWZpbmlkYTogJXMiCisKKyM6IGV2YWwuYzo4NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogRmFsdGEgdW4gJygnOiAlcyIKKworIzogZXZhbC5jOjg1MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IEwnYXJndW1lbnQg6XMgaWy3bGVnYWw6ICVzIgorCisjOiBldmFsLmM6ODYwMQorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiBGYWx0YSB1bmEgZGVjbGFyYWNp8yA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo4Njg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiBObyBzJ2hhIHBvZ3V0IHJlZGVmaW5pciBsYSBmdW5jafMgJXM6IHMnZXN04CB1dGlsaXR6YW50IgorCisjOiBldmFsLmM6ODc1MgorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IEVzIHJlcXVlcmVpeCB1biBub20gZGUgZnVuY2nzIgorCisjOiBldmFsLmM6ODgwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBFbCBub20gZGUgbGEgZnVuY2nzIGhhIGRlIGNvbWVu52FyIGVuIG1havpzY3VsYTogJXMiCisKKyM6IGV2YWwuYzo4OTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6IExhIGZ1bmNp8yBubyBlc3TgIGRlZmluaWRhOiAlcyIKKworIzogZXZhbC5jOjkwMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiBObyBzJ2hhIHBvZ3V0IGVsaW1pbmFyIGxhIGZ1bmNp8yAlczogcydlc3TgIHV0aWxpdHphbnQiCisKKyM6IGV2YWwuYzo5MDQ4Cittc2dpZCAiRTEzMjogRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIKK21zZ3N0ciAiRTEzMjogTGEgcHJvZnVuZGl0YXQgZGUgY3JpZGVzIGEgZnVuY2lvbnMg6XMgc3VwZXJpb3IgYSAnbWF4ZnVuY2RlcHRnJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTEwMQorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJjcmlkYW50IGEgJXMiCisKKyM6IGV2YWwuYzo5MTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgInMnaGEgYXZvcnRhdCAlcyIKKworIzogZXZhbC5jOjkxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIGhhIHJldG9ybmF0ICMlbGQiCisKKyM6IGV2YWwuYzo5MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIGhhIHJldG9ybmF0IFwiJXNcIiIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTE4OCBleF9jbWRzMi5jOjIyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAiY29udGludWFudCBhICVzIgorCisjOiBldmFsLmM6OTIxNAorbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiBMJ29yZHJlIDpyZXR1cm4gbm8gZXMgdHJvYmEgZGlucyBkJ3VuYSBmdW5jafMiCisKKyM6IGV2YWwuYzo5NTQ1Cittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiXG4jIHZhcmlhYmxlcyBnbG9iYWxzOlxuIgorCisjOiBleF9jbWRzMi5jOjgzCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICJNb2RlIGRlIGRlcHVyYWNp8y4gRXNjcml2aXUgXCJjb250XCIgcGVyIGNvbnRpbnVhci4iCisKKyM6IGV4X2NtZHMyLmM6ODcgZXhfZG9jbWQuYzo4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICJs7W5pYSAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjg5CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgIm9yZHJlOiAlcyIKKworIzogZXhfY21kczIuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiUHVudCBkZSBydXB0dXJhIGEgXCIlcyVzXCIgbO1uaWEgJWxkIgorCisjOiBleF9jbWRzMi5jOjUzMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IE5vIHMnaGEgdHJvYmF0IGVsIHB1bnQgZGUgcnVwdHVyYTogJXMiCisKKyM6IGV4X2NtZHMyLmM6NTU3Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAiTm8gcydoYW4gZGVmaW5pdCBwdW50cyBkZSBydXB0dXJhIgorCisjOiBleF9jbWRzMi5jOjU2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgbO1uaWEgJWxkIgorCisjIFTtdG9sIGQndW4gZGngbGVnIFs6YnJvd3NlIHddLiAgZWFjCisjOiBleF9jbWRzLmM6MjA4MiBleF9jbWRzLmM6MjM0NyBleF9jbWRzMi5jOjc1NAorbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIkFub21lbmEgaSBkZXNhIgorCisjOiBleF9jbWRzMi5jOjc3NworIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJWb2xldSBkZXNhciBlbHMgY2FudmlzIGEgXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjc3OSBleF9kb2NtZC5jOjg5MTcKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiU2Vuc2Utbm9tIgorCisjOiBleF9jbWRzMi5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2MjogTm8gcydoYW4gZGVzYXQgZWxzIGNhbnZpcyBlbiBlbCBidWZmZXIgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjk4NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiQXRlbmNp8zogUydoYSBjYW52aWF0IGRlIGJ1ZmZlciBpbmVzcGVyYWRhbWVudCAocmV2aXNldSBsZXMgYXV0by1vcmRyZXMpIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IE5vbelzIGhpIGhhIHVuIGZpdHhlciBwZXIgZWRpdGFyIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IE5vIGVzIHBvdCBhbmFyIG3pcyBlbmxs4CBkZWwgcHJpbWVyIGZpdHhlciIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IE5vIGVzIHBvdCBhbmFyIG3pcyBlbmxs4CBkZSBsJ/psdGltIGZpdHhlciIKKworIzogZXhfY21kczIuYzoxODQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiQ2VyY2FudCBcIiVzXCIgYSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2MworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiQ2VyY2FudCBcIiVzXCIiCisKKyMgq3J1bnRpbWVwYXRouy4gIGVhYworIzogZXhfY21kczIuYzoxODg0CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIm5vIHMnaGEgdHJvYmF0IGVuIGVsICdydW50aW1lcGF0aCc6IFwiJXNcIiIKKworIyBU7XRvbCBkJ3VuIGRp4GxlZyBbOmJyb3dzZSBzb3VyY2VdLiAgZWFjCisjOiBleF9jbWRzMi5jOjE5MTgKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiRXhlY3V0YSB1biBzY3JpcHQgVmltIgorCisjOiBleF9jbWRzMi5jOjIwNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJObyBlcyBwb3QgZXhlY3V0YXIgdW4gZGlyZWN0b3JpOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjA5OQorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBleGVjdXRhciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjEwMQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgImztbmlhICVsZDogbm8gcydoYSBwb2d1dCBleGVjdXRhciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImV4ZWN1dGFudCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjExNworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJs7W5pYSAlbGQ6IGV4ZWN1dGFudCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjI0MgorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiaGEgZmluYWxpdHphdCBsJ2V4ZWN1Y2nzIGRlICVzIgorCisjOiBleF9jbWRzMi5jOjI1ODAKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiBBdGVuY2nzOiBFbCBzZXBhcmFkb3IgZGUgbO1uaWEgbm8g6XMgduBsaWQsIHBvdHNlciBmYWx0YSB1biBeTSIKKworIyCrc291cmNlZCBmaWxluy4gIGVhYworIzogZXhfY21kczIuYzoyNjI5Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2NzogTCdvcmRyZSA6c2NyaXB0ZW5jb2Rpbmcgbm9t6XMgZXMgcG90IHV0aWxpdHphciBlbiBzY3JpcHRzIgorCisjIKtzb3VyY2VkIGZpbGW7LiAgZWFjCisjOiBleF9jbWRzMi5jOjI2NjIKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogTCdvcmRyZSA6ZmluaXNoIG5vbelzIGVzIHBvdCB1dGlsaXR6YXIgZW4gc2NyaXB0cyIKKworIzogZXhfY21kczIuYzozMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIlDgZ2luYSAlZCIKKworIzogZXhfY21kczIuYzozMjYxCittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICJObyBoaSBoYSB0ZXh0IHBlciBpbXByaW1pciIKKworIzogZXhfY21kczIuYzozMzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJTJ2VzdOAgaW1wcmltaW50IGxhIHDgZ2luYSAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MzM0OAorIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIEPycGlhICVkIGRlICVkIgorCisjOiBleF9jbWRzMi5jOjM0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIlMnaGEgaW1wcuhzOiAlcyIKKworIzogZXhfY21kczIuYzozNDEzCittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiUydoYSBhdm9ydGF0IGwnaW1wcmVzc2nzIgorCisjOiBleF9jbWRzMi5jOjM3NzgKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEVycm9yIGVuIGVzY3JpdXJlIGVsIGZpdHhlciBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQwNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNDogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTYyNDogTm8gcydoYSBwb2d1dCBvYnJpciBlbCBmaXR4ZXIgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQwNjMgZXhfY21kczIuYzo0Njg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTm8gcydoYSBwb2d1dCBsbGVnaXIgZWwgZml0eGVyIGRlIHJlY3Vyc29zIFBvc3RTY3JpcHQgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxODogZmlsZSBcIiVzXCIgaXMgbm90IGEgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE4OiBFbCBmaXR4ZXIgXCIlc1wiIG5vIOlzIHVuIGZpdHhlciBkZSByZWN1cnNvcyBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQwODYgZXhfY21kczIuYzo0MTA2IGV4X2NtZHMyLmM6NDEyMSBleF9jbWRzMi5jOjQxNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOTogZmlsZSBcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxOTogRWwgZml0eGVyIGRlIHJlY3Vyc29zIFBvc3RTY3JpcHQgXCIlc1wiIG5vIGVzdOAgc3Vwb3J0YXQiCisKKyM6IGV4X2NtZHMyLmM6NDE3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjIxOiBcIiVzXCIgcmVzb3VyY2UgZmlsZSBoYXMgd3JvbmcgdmVyc2lvbiIKK21zZ3N0ciAiRTYyMTogTGEgdmVyc2nzIGRlbCBmaXR4ZXIgZGUgcmVjdXJzb3MgXCIlc1wiIG5vIOlzIHbgbGlkYSIKKworIzogZXhfY21kczIuYzo0NjQwCittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiBObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGZpdHhlciBQb3N0U2NyaXB0IGdlbmVyYXQiCisKKyM6IGV4X2NtZHMyLmM6NDY3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGZpdHhlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDc5MgorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwicHJvbG9nLnBzXCIiCittc2dzdHIgIkU0NTY6IE5vIHMnaGEgdHJvYmF0IGVsIGZpdHhlciBkZSByZWN1cnNvcyBQb3N0U2NyaXB0IFwicHJvbG9nLnBzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDgyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiCittc2dzdHIgIkU0NTY6IE5vIHMnaGEgdHJvYmF0IGVsIGZpdHhlciBkZSByZWN1cnNvcyBQb3N0U2NyaXB0IFwiJXMucHNcIiIKKworIzogZXhfY21kczIuYzo0ODQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gbXVsdGktYnl0ZSB0byBcIiVzXCIgZW5jb2RpbmciCittc2dzdHIgIkU2MjA6IE5vIHMnaGEgcG9ndXQgY29udmVydGlyIGxhIGNvZGlmaWNhY2nzIG11bHRpLW9jdGV0IGEgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5NjYKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIlMnZXN04CBlbnZpYW50IGEgbGEgaW1wcmVzc29yYS4uLiIKKworIzogZXhfY21kczIuYzo0OTcwCittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogRXJyb3IgZW4gaW1wcmltaXIgZWwgZml0eGVyIFBvc3RTY3JpcHQiCisKKyM6IGV4X2NtZHMyLmM6NDk3MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiUydoYSBlbnZpYXQgbGEgdGFzY2EgZCdpbXByZXNzafMuIgorCisjIGxlcyBjYWRlbmVzIHN1YnN0aXR172RlcyBubyBlcyBwb2RlbiB0cmFkde9yLiAgZWFjCisjOiBleF9jbWRzMi5jOjUzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIklkaW9tYSBhY3R1YWwgKCAlcyk6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo1MzkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBObyBzJ2hhIHBvZ3V0IGNhbnZpYXIgbCdpZGlvbWEgYSBcIiVzXCIiCisKKyMgRS5HOiA6YXNjaWkKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKKworIzogZXhfY21kcy5jOjQzMworbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiBObyBlcyBwb2RlbiBtb3VyZSBs7W5pZXMgY2FwIGEgZWxsZXMgbWF0ZWl4ZXMiCisKKyM6IGV4X2NtZHMuYzo1MDIKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIjEgbO1uaWEgZGVzcGxh52FkYSIKKworIzogZXhfY21kcy5jOjUwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgIiVsZCBs7W5pZXMgZGVzcGxh52FkZXMiCisKKyM6IGV4X2NtZHMuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGZpbHRlcmVkIgorbXNnc3RyICIlbGQgbO1uaWVzIGZpbHRyYWRlcyIKKworIzogZXhfY21kcy5jOjkzNworbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6IExlcyBhdXRvLW9yZHJlcyAqRmlsdGVyKiBubyBwb2RlbiBjYW52aWFyIGVsIGJ1ZmZlciBhY3R1YWwiCisKKyM6IGV4X2NtZHMuYzoxMDIyCittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbTm8gcydoYW4gZGVzYXQgZWxzIPpsdGltcyBjYW52aXNdXG4iCisKKyM6IGV4X2NtZHMuYzoxMjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzIGEgbGEgbO1uaWE6ICIKKworIzogZXhfY21kcy5jOjEyNzMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogSGkgaGFuIG1hc3NhIGVycm9ycywgcydvbWV0IGxhIHJlc3RhIGRlbCBmaXR4ZXIiCisKKyMgbGVzIHRyZXMgc2Vn/GVudHMgdmFuIGp1bnRlcy4gIGVhYworIzogZXhfY21kcy5jOjEzMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJMbGVnaW50IGVsIGZpdHhlciB2aW1pbmZvIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEzMDkKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIHBlciBpbmZvIgorCisjOiBleF9jbWRzLmM6MTMxMAorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIHBlciBtYXJxdWVzIgorCisjOiBleF9jbWRzLmM6MTMxMQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBFUlJPUiIKKworIzogZXhfY21kcy5jOjE0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IEVsIGZpdHhlciB2aW1pbmZvIG5vIGVzIHBvdCBlc2NyaXVyZTogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IE5vIHMnaGEgcG9ndXQgZXNjcml1cmUgZWwgZml0eGVyIHZpbWluZm8gJXMhIgorCisjOiBleF9jbWRzLmM6MTUzNgorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIkVzY3JpdmludCBlbCBmaXR4ZXIgdmltaW5mbyBcIiVzXCIiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBBcXVlc3QgZml0eGVyIHZpbWluZm8gaGEgZXN0YXQgZ2VuZXJhdCBwZWwgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTYzNgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIyBFbCBwb2RldSBlZGl0YXIsIHNpIGFuZXUgYW1iIGNvbXB0ZSFcblxuIgorCisjOiBleF9jbWRzLmM6MTYzOAorbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjIFZhbG9yIGRlICdlbmNvZGluZycgZW4gZWwgbW9tZW50IGQnZXNjcml1cmUgYXF1ZXN0IGZpdHhlclxuIgorCisjOiBleF9jbWRzLmM6MTczNworbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiQ2Fy4GN0ZXIgaW5pY2lhbCBpbLdsZWdhbCIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTI1Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IEVsIGZpdHhlciBlc3TgIGNhcnJlZ2F0IGVuIHVuIGFsdHJlIGJ1ZmZlciIKKworIzogZXhfY21kcy5jOjIxNTkKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICJWb2xldSBlc2NyaXVyZSB1biBmaXR4ZXIgcGFyY2lhbD8iCisKKyM6IGV4X2NtZHMuYzoyMTY2Cittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IFVzZXUgISBwZXIgZGVzYXIgdW5hIHBhcnQgZGVsIGJ1ZmZlciIKKworIzogZXhfY21kcy5jOjIyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICJWb2xldSBzb2JyZXNjcml1cmUgZWwgZml0eGVyIGV4aXN0ZW50IFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiBObyBoaSBoYSBub20gZGUgZml0eGVyIHBlbCBidWZmZXIgJWxkIgorCisjOiBleF9jbWRzLmM6MjM5MAorbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IE5vIHMnaGEgZXNjcml0IGVsIGZpdHhlcjogTCdvcGNp8yAnd3JpdGUnIGhvIGltcGVkZWl4IgorCisjOiBleF9jbWRzLmM6MjQxMAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiTCdvcGNp8yAncmVhZG9ubHknIGVzdOAgYWN0aXZhIHBlciBcIiUuKnNcIixcbiIKKyJWb2xldSBlc2NyaXVyZSdsIGRlIHRvdGVzIG1hbmVyZXM/IgorCisjIOlzIHVuIHTtdG9sIGRlIGRp4GxlZyBbOmJyb3dzZSBlZGl0XS4gIGVhYworIzogZXhfY21kcy5jOjI1NzUKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIkVkaXRhIHVuIGZpdHhlciIKKworIzogZXhfY21kcy5jOjMxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IFVuYSBhdXRvLW9yZHJlIGhhIGVsaW1pbmF0IGVsIGJ1ZmZlciBub3UgJXMgaW5lc3BlcmFkYW1lbnQiCisKKyM6IGV4X2NtZHMuYzozMjc5Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IEFyZ3VtZW50IG5vIG51behyaWMgcGVyIDp6IgorCisjOiBleF9jbWRzLmM6MzM2NAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IExlcyBvcmRyZXMgc2hlbGwgbm8gZXN0YW4gcGVybWVzZXMgZW4gcnZpbSIKKworIzogZXhfY21kcy5jOjM0NzEKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiBMZXMgZXhwcmVzc2lvbnMgcmVndWxhcnMgbm8gcG9kZW4gZXN0YXIgZGVsaW1pdGFkZXMgcGVyIGxsZXRyZXMiCisKKyMgq2FtYrsgbyCrcGVyuyArIHRlY2xlcy4gIGVhYworIzogZXhfY21kcy5jOjM4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAic3Vic3RpdHVpciBhbWIgJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDE4OQorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIoSW50ZXJyb21wdXQpICIKKworIzogZXhfY21kcy5jOjQxOTMKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSBzdWJzdGl0dWNp8yIKKworIzogZXhfY21kcy5jOjQxOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBzdWJzdGl0dWNpb25zIgorCisjOiBleF9jbWRzLmM6NDE5OAorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBlbiAxIGztbmlhIgorCisjOiBleF9jbWRzLmM6NDIwMAorIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgZW4gJWxkIGztbmllcyIKKworIzogZXhfY21kcy5jOjQyNTEKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IE5vIGVzIHBvdCBleGVjdXRhciB1bmEgb3JkcmUgZ2xvYmFsIGRlIGZvcm1hIHJlY3Vyc2l2YSIKKworIzogZXhfY21kcy5jOjQyODYKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogTGVzIG9yZHJlcyBnbG9iYWxzIHJlcXVlcmVpeGVuIHVuYSBleHByZXNzafMgcmVndWxhciIKKworIzogZXhfY21kcy5jOjQzMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiUydoYSB0cm9iYXQgZWwgcGF0cvMgYSBjYWRhIGztbmlhOiAlcyIKKworIzogZXhfY21kcy5jOjQ0MTYKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjINpsdGltYSBjYWRlbmEgc3Vic3RpdHXvZGE6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ1MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBObyBoaSBoYSBhanVkYSBwZXIgJXMiCisKKyM6IGV4X2NtZHMuYzo0NTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiRWwgZml0eGVyIGQnYWp1ZGEgXCIlc1wiIG5vIHMnaGEgdHJvYmF0IgorCisjOiBleF9jbWRzLmM6NTAzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiBObyDpcyB1biBkaXJlY3Rvcmk6ICVzIgorCisjOiBleF9jbWRzLmM6NTA2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1MjogTm8gcydoYSBwb2d1dCBvYnJpciAlcyBhbWIgcGVybe1zIGQnZXNjcmlwdHVyYSIKKworIzogZXhfY21kcy5jOjUxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IE5vIHMnaGEgcG9ndXQgb2JyaXIgJXMgYW1iIHBlcm3tcyBkZSBsZWN0dXJhIgorCisjOiBleF9jbWRzLmM6NTE4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiBMJ2V0aXF1ZXRhIFwiJXNcIiBlc3TgIGR1cGxpY2FkYSBlbiBlbCBmaXR4ZXIgJXMiCisKKyM6IGV4X2NtZHMuYzo1Mjg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogT3JkcmUgZGUgc2VueWFsaXR6YWNp8yBkZXNjb25lZ3VkYTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MzA4Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IEZhbHRhIGVsIG5vbSBkZWwgc2VueWFsIgorCisjOiBleF9jbWRzLmM6NTM1NAorbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IEhpIGhhbiBtYXNzYSBzZW55YWxzIGRlZmluaXRzIgorCisjOiBleF9jbWRzLmM6NTQyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IEVsIHRleHQgZGVsIHNlbnlhbCBubyDpcyB24GxpZDogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDUyIGV4X2NtZHMuYzo1NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IEVsIHNlbnlhbCDpcyBkZXNjb25lZ3V0OiAlcyIKKworIzogZXhfY21kcy5jOjU0OTgKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBGYWx0YSBlbCBu+m1lcm8gZGVsIHNlbnlhbCIKKworIzogZXhfY21kcy5jOjU1NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IEVsIG5vbSBkZWwgYnVmZmVyIG5vIOlzIHbgbGlkOiAlcyIKKworIzogZXhfY21kcy5jOjU2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IEwnSUQgZGVsIHNlbnlhbCBubyDpcyB24GxpZGE6ICVsZCIKKworIzogZXhfY21kcy5jOjU3ODgKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltFbGltaW5hdF0iCisKKyM6IGV4X2RvY21kLmM6NDg5Cittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIk1vZGUgRXguIEVzY3Jpdml1IFwidmlzdWFsXCIgcGVyIHRvcm5hciBhbCBtb2RlIE5vcm1hbC4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkU1MDE6IEF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJFNTAxOiBGaW5hbCBkZWwgZml0eGVyIgorCisjOiBleF9kb2NtZC5jOjYyNworbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogTCdvcmRyZSDpcyBtYXNzYSByZWN1cnNpdmEiCisKKyM6IGV4X2RvY21kLmM6MTA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA1OiBFeGNlcHRpb24gbm90IGNhdWdodDogJXMiCittc2dzdHIgIkU2MDU6IE5vIHMnaGEgaW50ZXJjZXB0YXQgbCdleGNlcGNp8zogJXMiCisKKyM6IGV4X2RvY21kLmM6MTE4MAorbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkZpbmFsIGRlbCBmaXR4ZXIgZXhlY3V0YXQiCisKKyM6IGV4X2RvY21kLmM6MTE4MQorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiRmluYWwgZGUgbGEgZnVuY2nzIgorCisjOiBleF9kb2NtZC5jOjE2MzMKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiDacyBhbWJpZ3UgZCd1bmEgb3JkcmUgZGVmaW5pZGEgcGVyIGwndXN1YXJpIgorCisjOiBleF9kb2NtZC5jOjE2NDcKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IE5vIOlzIHVuYSBvcmRyZSBkJ2VkaWNp8yIKKworIzogZXhfZG9jbWQuYzoxNzM3Cittc2dpZCAiRTQ3ODogRG9uJ3QgcGFuaWMhIgorbXNnc3RyICJFNDc4OiBDYWxtYSEiCisKKyM6IGV4X2RvY21kLmM6MTc1NgorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5MzogSGV1IGVzcGVjaWZpY2F0IHVuIGludGVydmFsIGRlY3JlaXhlbnQiCisKKyMg6XMgdW5hIHByZWd1bnRhLiAgZWFjCisjOiBleF9kb2NtZC5jOjE3NjUKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIkhldSBlc3BlY2lmaWNhdCB1biBpbnRlcnZhbCBkZWNyZWl4ZW50LiBFbCB2b2xldSBpbnZlcnRpciIKKworIzogZXhfZG9jbWQuYzoxODc2Cittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiBVc2V1IHcgbyBi6SB3Pj4iCisKKyM6IGV4X2RvY21kLmM6MzQ2MworbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogQXF1ZXN0YSBvcmRyZSBubyBlc3TgIGRpc3BvbmlibGUgZW4gYXF1ZXN0YSB2ZXJzafMiCisKKyM6IGV4X2RvY21kLmM6MzY0OQorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiBOb23pcyBlc3TgIHBlcm3ocyB1biBub20gZGUgZml0eGVyIgorCisjOiBleF9kb2NtZC5jOjQyMTEKK21zZ2lkICIxIG1vcmUgZmlsZSB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICJRdWVkYSAxIGZpdHhlciBwZXIgZWRpdGFyLiBWb2xldSBzb3J0aXIgZGUgdG90ZXMgbWFuZXJlcz8iCisKKyM6IGV4X2RvY21kLmM6NDIxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIlF1ZWRlbiAlZCBmaXR4ZXJzIHBlciBlZGl0YXIuIFZvbGV1IHNvcnRpciBkZSB0b3RlcyBtYW5lcmVzPyIKKworIzogZXhfZG9jbWQuYzo0MjIxCittc2dpZCAiRTE3MzogMSBtb3JlIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogUXVlZGEgMSBmaXR4ZXIgcGVyIGVkaXRhciIKKworIzogZXhfZG9jbWQuYzo0MjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IFF1ZWRlbiAlbGQgZml0eGVycyBwZXIgZWRpdGFyIgorCisjOiBleF9kb2NtZC5jOjQzMTgKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTc0OiBMJ29yZHJlIGphIGV4aXN0ZWl4OiBhZmVnaXUgISBwZXIgc3Vic3RpdHVpci1sYSIKKworIzogZXhfZG9jbWQuYzo0NDI4Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICJcbiAgICBOb20gICAgICAgICBBcmdzIEFiYXN0IENvbXBsZXRhciBEZWZpbmljafMiCisKKyM6IGV4X2RvY21kLmM6NDUxNworbXNnaWQgIk5vIHVzZXItZGVmaW5lZCBjb21tYW5kcyBmb3VuZCIKK21zZ3N0ciAiTm8gcydoYW4gdHJvYmF0IG9yZHJlcyBkZWZpbmlkZXMgcGVyIGwndXN1YXJpIgorCisjOiBleF9kb2NtZC5jOjQ1NDkKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBObyBoZXUgZXNwZWNpZmljYXQgY2FwIGF0cmlidXQiCisKKyM6IGV4X2RvY21kLmM6NDYwMQorbXNnaWQgIkUxNzY6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTE3NjogRWwgbm9tYnJlIGQnYXJndW1lbnRzIG5vIOlzIHbgbGlkIgorCisjOiBleF9kb2NtZC5jOjQ2MTYKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBFbCBjb21wdGFkb3Igbm8gZXMgcG90IGVzcGVjaWZpY2FyIGRvcyBjb3BzIgorCisjOiBleF9kb2NtZC5jOjQ2MjYKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBFbCB2YWxvciBwZXIgb21pc3Np8yBkZWwgY29tcHRhZG9yIG5vIOlzIHbgbGlkIgorCisjIKtjb21wbGV0YXK7ICBlYWMKKyM6IGV4X2RvY21kLmM6NDY1NworbXNnaWQgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcmVkIGZvciBjb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogTGEgZnVuY2nzIGNvbXBsZXRhciByZXF1ZXJlaXggdW4gYXJndW1lbnQiCisKKyMgq2NvbXBsZXRhcrsgIGVhYworIzogZXhfZG9jbWQuYzo0Njg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiBFbCB2YWxvciBwZXIgbGEgZnVuY2nzIGNvbXBsZXRhciBubyDpcyB24GxpZDogJXMiCisKKyMgq2NvbXBsZXRhcrsgIGVhYworIzogZXhfZG9jbWQuYzo0Njk0Cittc2dpZCAiRTQ2NzogQ3VzdG9tIGNvbXBsZXRpb24gcmVxdWlyZXMgYSBmdW5jdGlvbiBhcmd1bWVudCIKK21zZ3N0ciAiRTQ2NzogRWxzIGVzcXVlbWVzIGRlIGNvbXBsZXRhciByZXF1ZXJlaXhlbiB1bmEgZnVuY2nzIGNvbSBhIGFyZ3VtZW50IgorCisjIKtjb21wbGV0YXK7ICBlYWMKKyM6IGV4X2RvY21kLmM6NDY5OQorbXNnaWQgIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIKK21zZ3N0ciAiRTQ2ODogTCdhcmd1bWVudCBkZSBjb21wbGV0YXIgbm9t6XMgZXN04CBwZXJt6HMgZW4gZXNxdWVtZXMgcGVyc29uYWxpdHphdHMiCisKKyM6IGV4X2RvY21kLmM6NDcwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IEwnYXRyaWJ1dCBubyDpcyB24GxpZDogJXMiCisKKyM6IGV4X2RvY21kLmM6NDc1MgorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBFbCBub20gZGUgbCdvcmRyZSBubyDpcyB24GxpZCIKKworIzogZXhfZG9jbWQuYzo0NzY3Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBMZXMgb3JkcmVzIGRlZmluaWRlcyBwZXIgbCd1c3VhcmkgaGFuIGRlIGNvbWVu52FyIGVuIG1havpzY3VsYSIKKworIzogZXhfZG9jbWQuYzo0ODM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiBObyBleGlzdGVpeCB0YWwgb3JkcmUgZGVmaW5pZGEgcGVyIGwndXN1YXJpOiAlcyIKKworIzogZXhfZG9jbWQuYzo1Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogTm8gcydoYSB0cm9iYXQgbCdlc3F1ZW1hIGRlIGNvbG9ycyAlcyIKKworIzogZXhfZG9jbWQuYzo1MzAyCittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIlNhbHV0YWNpb25zLCB1c3VhcmkgZGUgVmltISIKKworIyBU7XRvbCBkJ3VuIGRp4GxlZyBbOmJyb3dzZSBzcGxpdF0gIGVhYworIzogZXhfZG9jbWQuYzo2MDEzCittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIkVkaXRhIHVuIGZpdHhlciBlbiB1bmEgZmluZXN0cmEgbm92YSIKKworIzogZXhfZG9jbWQuYzo2MzAwCittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICJObyBoaSBoYSBmaXR4ZXIgZCdpbnRlcmNhbnZpIgorCisjIMlzIHVuIHTtdG9sIGQndW4gZGngbGVnIFs6YnJvd3NlIHJlYWRdICBlYWMKKyM6IGV4X2RvY21kLmM6NjQwNAorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJBZmVnZWl4IHVuIGZpdHhlciIKKworIzogZXhfZG9jbWQuYzo2NDY4Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiBObyBoaSBoYSBjYXAgZGlyZWN0b3JpIGFudGVyaW9yIgorCisjOiBleF9kb2NtZC5jOjY1NTAKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiBEZXNjb25lZ3V0IgorCisjOiBleF9kb2NtZC5jOjY2MzUKK21zZ2lkICJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NTogTCdvcmRyZSA6d2luc2l6ZSByZXF1ZXJlaXggZG9zIGFyZ3VtZW50cyBudW3ocmljcyIKKworIzogZXhfZG9jbWQuYzo2Njg2CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiUG9zaWNp8yBkZSBsYSBmaW5lc3RyYTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo2NjkxCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIkUxODg6IEVuIGFxdWVzdGEgcGxhdGFmb3JtYSBubyBlcyBwb3Qgb2J0ZW5pciBsYSBwb3NpY2nzIGRlIGxhIGZpbmVzdHJhIgorCisjOiBleF9kb2NtZC5jOjY3MDEKK21zZ2lkICJFNDY2OiA6d2lucG9zIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY2OiBMJ29yZHJlIDp3aW5wb3MgcmVxdWVyZWl4IGRvcyBhcmd1bWVudHMgbnVt6HJpY3MiCisKKyMgyXMgZWwgdO10b2wgZCd1biBkaeBsZWcuICBlYWMKKyM6IGV4X2RvY21kLmM6Njk4MAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIkRlc2EgbGEgcmVkaXJlY2Np8yIKKworIyDJcyBlbCB07XRvbCBkJ3VuIGRp4GxlZy4gIGVhYworIzogZXhfZG9jbWQuYzo3MTMxCittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICJEZXNhIGxhIHZpc3RhIgorCisjIMlzIGVsIHTtdG9sIGQndW4gZGngbGVnLiAgZWFjCisjOiBleF9kb2NtZC5jOjcxMzIKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIkRlc2EgbGEgc2Vzc2nzIgorCisjIMlzIGVsIHTtdG9sIGQndW4gZGngbGVnLiAgZWFjCisjOiBleF9kb2NtZC5jOjcxMzQKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJEZXNhIGxhIGNvbmZpZ3VyYWNp8yIKKworIzogZXhfZG9jbWQuYzo3Mjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIGV4aXN0ZWl4IChhZmVnaXUgISBwZXIgY29uZmlybWFyKSIKKworIzogZXhfZG9jbWQuYzo3MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTm8gcydoYSBwb2d1dCBvYnJpciBcIiVzXCIgYW1iIHBlcm3tcyBkJ2VzY3JpcHR1cmEiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjczMTQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IEwnYXJndW1lbnQgaGEgZGUgc2VyIHVuYSBsbGV0cmEgbyBi6SB1biBhY2NlbnQgb2JlcnQgbyB0YW5jYXQiCisKKyM6IGV4X2RvY21kLmM6NzM1NgorbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5Mjog2nMgcmVjdXJzaXUgZGUgOm5vcm1hbCBtYXNzYSBwcm9mdW5kIgorCisjOiBleF9kb2NtZC5jOjc4NjkKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogTm8gaGkgaGEgY2FwIG5vbSBkZSBmaXR4ZXIgYWx0ZXJuYXRpdSBwZXIgc3Vic3RpdHVpciAnIyciCisKKyM6IGV4X2RvY21kLmM6NzkwMAorbXNnaWQgIkU0OTU6IG5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAiRTQ5NTogTm8gaGkgaGEgY2FwIG5vbSBkZSBmaXR4ZXIgZCdhdXRvLW9yZHJlcyBwZXIgc3Vic3RpdHVpciBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3OTA4Cittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiBObyBoaSBoYSBjYXAgbm9tYnJlIGRlIGJ1ZmZlciBkJ2F1dG8tb3JkcmVzIHBlciBzdWJzdGl0dWlyIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6NzkxOQorbXNnaWQgIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICJFNDk3OiBObyBoaSBoYSBjYXAgbm9tIGQnYXV0by1vcmRyZSBwZXIgc3Vic3RpdHVpciBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6NzkyOQorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICJFNDk4OiBObyBoaSBoYSBjYXAgc2NyaXB0IHBlciBzdWJzdGl0dWlyIFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjc5NzAKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIkU0OTk6IEVsIG5vbSBkZSBmaXR4ZXIgcGVyICclJyBvICcjJyBlc3TgIGJ1aXQsIG5vbelzIGZ1bmNpb25hIGFtYiBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3OTcyCittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDogUydldmFsdWEgY29tIGEgY2FkZW5hIGJ1aWRhIgorCisjOiBleF9kb2NtZC5jOjg4OTkKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IE5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZml0eGVyIHZpbWluZm8gYW1iIHBlcm3tcyBkZSBsZWN0dXJhIgorCisjOiBleF9kb2NtZC5jOjkwNzIKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IEFxdWVzdGEgdmVyc2nzIG5vIHN1cG9ydGEgZO1ncmFmcyIKKworIzogZXhfZXZhbC5jOjQyMworbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiRTYwODogTm8gZXMgcG9kZW4gZ2VuZXJhciBleGVwY2lvbnMgYW1iIGVsIHByZWZpeCAnVmltJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICJFeGNlcGNp8yBnZW5lcmFkYTogJXMiCisKKyM6IGV4X2V2YWwuYzo1NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAiRXhlcGNp8yBmaW5hbGl0emFkYTogJXMiCisKKyM6IGV4X2V2YWwuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGRpc2NhcmRlZDogJXMiCittc2dzdHIgIkV4ZXBjafMgZGVzY2FydGFkYTogJXMiCisKKyM6IGV4X2V2YWwuYzo2MDAgZXhfZXZhbC5jOjY0NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCBs7W5pYSAlbGQiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjYxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gY2F1Z2h0OiAlcyIKK21zZ3N0ciAiRXhjZXBjafMgaW50ZXJjZXB0YWRhOiAlcyIKKworIzogZXhfZXZhbC5jOjY5MworIywgYy1mb3JtYXQKK21zZ2lkICIlcyBtYWRlIHBlbmRpbmciCittc2dzdHIgIiVzIGVzdOAgcGVuZGVudCIKKworIzogZXhfZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICIlcyBzJ2hhIGNvbnRpbnVhdCIKKworIzogZXhfZXZhbC5jOjcwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzIHMnaGEgZGVzY2FydGF0IgorCisjOiBleF9ldmFsLmM6NzI2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICJFeGVwY2nzIgorCisjOiBleF9ldmFsLmM6NzMyCittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiRXJyb3IgaSBpbnRlcnJ1cGNp8yIKKworIzogZXhfZXZhbC5jOjczNCBndWkuYzo0MjUzCittc2dpZCAiRXJyb3IiCittc2dzdHIgIkVycm9yIgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjczNgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAiSW50ZXJydXBjafMiCisKKyM6IGV4X2V2YWwuYzo4MTAKK21zZ2lkICJFNTc5OiA6aWYgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU3OTogSW1icmljYWNp8yBkZSA6aWYgbWFzc2EgcHJvZnVuZGEiCisKKyM6IGV4X2V2YWwuYzo4NDcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IERlY2xhcmFjafMgOmVuZGlmIHNlbnNlIDppZiIKKworIzogZXhfZXZhbC5jOjg5MQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiBEZWNsYXJhY2nzIDplbHNlIHNlbnNlIDppZiIKKworIzogZXhfZXZhbC5jOjg5NAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IERlY2xhcmFjafMgOmVsc2VpZiBzZW5zZSA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MDEKK21zZ2lkICJFNTgzOiBtdWx0aXBsZSA6ZWxzZSIKK21zZ3N0ciAiRTU4MzogTfpsdGlwbGVzIDplbHNlIgorCisjOiBleF9ldmFsLmM6OTA0Cittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogRGVjbGFyYWNp8yA6ZWxzZWlmIGRlc3By6XMgZGUgOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5NzEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogSW1icmljYWNp8yBkZSA6d2hpbGUgbWFzc2EgcHJvZnVuZGEiCisKKyM6IGV4X2V2YWwuYzoxMDI3Cittc2dpZCAiRTU4NjogOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg2OiBEZWNsYXJhY2nzIDpjb250aW51ZSBzZW5zZSA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDY3Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiBEZWNsYXJhY2nzIDpicmVhayBzZW5zZSA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMjY2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiBJbWJyaWNhY2nzIGRlIDp0cnkgbWFzc2EgcHJvZnVuZGEiCisKKyM6IGV4X2V2YWwuYzoxMzQ2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogRGVjbGFyYWNp8yA6Y2F0Y2ggc2Vuc2UgOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjLiAqIEp1c3QgcGFyc2UuCisjOiBleF9ldmFsLmM6MTM2OAorbXNnaWQgIkU2MDQ6IDpjYXRjaCBhZnRlciA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNDogRGVjbGFyYWNp8yA6Y2F0Y2ggZGVzcHLpcyBkZSA6ZmluYWxseSIKKworIzogZXhfZXZhbC5jOjE1MDEKK21zZ2lkICJFNjA2OiA6ZmluYWxseSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDY6IERlY2xhcmFjafMgOmZpbmFsbHkgc2Vuc2UgOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSBtdWx0aXBsZSAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjOiBleF9ldmFsLmM6MTUyNQorbXNnaWQgIkU2MDc6IG11bHRpcGxlIDpmaW5hbGx5IgorbXNnc3RyICJFNjA3OiBN+mx0aXBsZXMgOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNjM0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IERlY2xhcmFjafMgOmVuZHRyeSBzZW5zZSA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTk2NgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IERlY2xhcmFjafMgOmVuZGZ1bmN0aW9uIGZvcmEgZCd1bmEgZnVuY2nzIgorCisjIGNvbnRleHQ/ICBlYWMKKyM6IGV4X2dldGxuLmM6MzE1MworbXNnaWQgInRhZ25hbWUiCittc2dzdHIgIm5vbSBkZSBsJ2V0aXF1ZXRhIgorCisjIGNvbnRleHQ/ICBlYWMKKyM6IGV4X2dldGxuLmM6MzE1NgorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIHRpcHVzIGRlIGZpdHhlclxuIgorCisjOiBleF9nZXRsbi5jOjQ1MDcKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgImwnb3BjafMgJ2hpc3RvcnknIOlzIHplcm8iCisKKyM6IGV4X2dldGxuLmM6NDc0NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiXG4jIEhpc3RvcmlhbCAlcyAoZGUgbelzIGEgbWVueXMgcmVjZW50KTpcbiIKKworIzogZXhfZ2V0bG4uYzo0NzQ4Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJkJ29yZHJlcyIKKworIzogZXhfZ2V0bG4uYzo0NzQ5Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAiZGUgY2FkZW5lcyBjZXJjYWRlcyIKKworIzogZXhfZ2V0bG4uYzo0NzUwCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAiZCdleHByZXNzaW9ucyIKKworIzogZXhfZ2V0bG4uYzo0NzUxCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiZGUgbO1uaWVzIGQnZW50cmFkYSIKKworIzogZXhfZ2V0bG4uYzo0NzgxCittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciBmb3JhIGRlIGwn4HJlYSBkZSBsJ29yZHJlIgorCisjOiBleF9nZXRsbi5jOjQ5NTgKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBTJ2hhIGVsaW1pbmF0IGxhIGZpbmVzdHJhIG8gZWwgYnVmZmVyIGFjdGl1IgorCisjOiBmaWxlaW8uYzozNzMKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiRWwgbm9tIGRlIGZpdHhlciDpcyBpbLdsZWdhbCIKKworIzogZmlsZWlvLmM6Mzk3IGZpbGVpby5jOjUyMiBmaWxlaW8uYzoyNjkwIGZpbGVpby5jOjI3MzEKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAi6XMgdW4gZGlyZWN0b3JpIgorCisjOiBmaWxlaW8uYzozOTkKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJubyDpcyB1biBmaXR4ZXIiCisKKyM6IGZpbGVpby5jOjU0NCBmaWxlaW8uYzozODQwCittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW0ZpdHhlciBub3VdIgorCisjOiBmaWxlaW8uYzo1NjYKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJbUGVybe1zIGRlbmVnYXRdIgorCisjOiBmaWxlaW8uYzo2NzAKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiBBdXRvLW9yZHJlcyAqUmVhZFByZSBoYW4gZGVpeGF0IGVsIGZpdHhlciBpbGxlZ2libGUiCisKKyM6IGZpbGVpby5jOjY3MgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6IExlcyBhdXRvLW9yZHJlcyAqUmVhZFByZSBubyBwb2RlbiBjYW52aWFyIGVsIGJ1ZmZlciBhY3R1YWwiCisKKyM6IGZpbGVpby5jOjY5MworbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTogTGxlZ2ludCBsJ2VudHJhZGEgZXN04G5kYXJkLi4uXG4iCisKKyM6IGZpbGVpby5jOjY5OQorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAiTGxlZ2ludCBsJ2VudHJhZGEgZXN04G5kYXJkLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjk0NAorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiBMYSBjb252ZXJzafMgaGEgZGVpeGF0IGVsIGZpdHhlciBpbGxlZ2libGUhIgorCisjOiBmaWxlaW8uYzoxODk2Cittc2dpZCAiW2ZpZm8vc29ja2V0XSIKK21zZ3N0ciAiW2ZpZm8vc29ja2V0XSIKKworIzogZmlsZWlvLmM6MTkwMworbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW2ZpZm9dIgorCisjOiBmaWxlaW8uYzoxOTEwCittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIltzb2NrZXRdIgorCisjIGVhYyAgbm9t6XMtbGVjdHVyYSAobmwpCisjOiBmaWxlaW8uYzoxOTE4Cittc2dpZCAiW1JPXSIKK21zZ3N0ciAiW05MXSIKKworIzogZmlsZWlvLmM6MTkyOAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW2ZhbHRlbiBjYXLgY3RlcnMgQ1JdIgorCisjIGVudHJhIGVuIGNvbmZsaWN0ZSBhbWIgTkwgKG5vbelzIGxlY3R1cmEpCisjOiBmaWxlaW8uYzoxOTMzCittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW3MnaGFuIHRyb2JhdCBjYXLgY3RlcnMgTkxdIgorCisjOiBmaWxlaW8uYzoxOTM4Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbbO1uaWVzIGxsYXJndWVzIHBhcnRpZGVzXSIKKworIzogZmlsZWlvLmM6MTk0NCBmaWxlaW8uYzozODI0Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbTk8gY29udmVydGl0XSIKKworIzogZmlsZWlvLmM6MTk0OSBmaWxlaW8uYzozODI5Cittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIltjb252ZXJ0aXRdIgorCisjOiBmaWxlaW8uYzoxOTU2IGZpbGVpby5jOjM4NTQKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlt4aWZyYXRdIgorCisjOiBmaWxlaW8uYzoxOTYzCittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbRVJST1IgREUgQ09OVkVSU0nTXSIKKworIzogZmlsZWlvLmM6MTk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJbSUxMRUdBTCBCWVRFIGluIGxpbmUgJWxkXSIKK21zZ3N0ciAiW09DVEVUIElMt0xFR0FMIGEgbGEgbO1uaWEgJWxkXSIKKworIzogZmlsZWlvLmM6MTk3NgorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltFUlJPUlMgREUgTEVDVFVSQV0iCisKKyM6IGZpbGVpby5jOjIxOTIKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAiTm8gcydoYSB0cm9iYXQgZWwgZml0eGVyIHRlbXBvcmFsIHBlciBsYSBjb252ZXJzafMiCisKKyM6IGZpbGVpby5jOjIxOTkKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIkxhIGNvbnZlcnNp8yBhbWIgJ2NoYXJjb252ZXJ0JyBoYSBmYWxsYXQiCisKKyM6IGZpbGVpby5jOjIyMDIKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGxsZWdpciBsYSBzb3J0aWRhIGRlICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI2MDUKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogQXV0by1vcmRyZXMgaGFuIGVsaW1pbmF0IG8gYWxsaWJlcmF0IGVsIGJ1ZmZlciBhIGVzY3JpdXJlIgorCisjOiBmaWxlaW8uYzoyNjI4Cittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IFVuYSBhdXRvLW9yZHJlIGhhIGNhbnZpYXQgZWwgbm9tYnJlIGRlIGztbmllcyBkZSBmb3JtYSBpbmVzcGVyYWRhIgorCisjOiBmaWxlaW8uYzoyNjk2IGZpbGVpby5jOjI3MTQKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAibm8g6XMgdW4gZml0eGVyIG8gZGlzcG9zaXRpdSBxdWUgZXMgcHVndWkgZXNjcml1cmUiCisKKyM6IGZpbGVpby5jOjI3NjYKK21zZ2lkICJpcyByZWFkLW9ubHkgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAi6XMgdW4gZml0eGVyIGRlIG5vbelzIGxlY3R1cmEgKGFmZWdpdSAhIHBlciBjb25maXJtYXIpIgorCisjOiBmaWxlaW8uYzozMDcyCittc2dpZCAiRTUwNjogQ2FuJ3Qgd3JpdGUgdG8gYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNjogTm8gcydoYSBwb2d1dCBlc2NyaXVyZSBsYSBj8nBpYSBkZSBzZWd1cmV0YXQgKGFmZWdpdSAhIHBlciBjb25maXJtYXIpIgorCisjOiBmaWxlaW8uYzozMDg0Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDc6IEVycm9yIGVuIHRhbmNhciBlbCBmaXR4ZXIgY/JwaWEgZGUgc2VndXJldGF0IChhZmVnaXUgISBwZXIgY29uZmlybWFyKSIKKworIzogZmlsZWlvLmM6MzA4NgorbXNnaWQgIkU1MDg6IENhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDg6IEVycm9yIGRlIGxlY3R1cmEgZW4gZmVyIGxhIGPycGlhIGRlIHNlZ3VyZXRhdCAoYWZlZ2l1ICEgcGVyIGNvbmZpcm1hcikiCisKKyM6IGZpbGVpby5jOjMxMDIKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IE5vIHMnaGEgcG9ndXQgY3JlYXIgbGEgY/JwaWEgZGUgc2VndXJldGF0IChhZmVnaXUgISBwZXIgY29uZmlybWFyKSIKKworIzogZmlsZWlvLmM6MzIwNQorbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDogTm8gcydoYSBwb2d1dCBmZXIgbGEgY/JwaWEgZGUgc2VndXJldGF0IChhZmVnaXUgISBwZXIgY29uZmlybWFyKSIKKworIyCrcmVzb3VyY2UgZm9ya7sgKE1hY09TKSA/CisjOiBmaWxlaW8uYzozMjY3Cittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiBMYSBiaWZ1cmNhY2nzIGRlIHJlY3Vyc29zIGVzIHBlcmRy4CAoYWZlZ2l1ICEgcGVyIGNvbmZpcm1hcikiCisKKyM6IGZpbGVpby5jOjMzNjgKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogTm8gcydoYSB0cm9iYXQgZWwgZml0eGVyIHRlbXBvcmFsIHBlciBlc2NyaXVyZS1oaSIKKworIzogZmlsZWlvLmM6MzM4NgorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0IChhZGQgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiBObyBzJ2hhIHBvZ3V0IGNvbnZlcnRpciAoYWZlZ2l1ICEgcGVyIGRlc2FyIHNlbnNlIGNvbnZlcnNp8ykiCisKKyM6IGZpbGVpby5jOjM0MjEKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiBObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGZpdHhlciBlbmxsYedhdCBwZXIgZXNjcml1cmUtaGkiCisKKyM6IGZpbGVpby5jOjM0MjUKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IE5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZml0eGVyIGFtYiBwZXJt7XMgZCdlc2NyaXB0dXJhIgorCisjOiBmaWxlaW8uYzozNjc1Cittc2dpZCAiRTUxMjogQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJFNTEyOiBFcnJvciBlbiB0YW5jYXIiCisKKyM6IGZpbGVpby5jOjM3NDYKK21zZ2lkICJFNTEzOiB3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIkU1MTI6IEVycm9yIGQnZXNjcmlwdHVyYSwgaGEgZmFsbGF0IGxhIGNvbnZlcnNp8yIKKworIzogZmlsZWlvLmM6Mzc1MgorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IEVycm9yIGQnZXNjcmlwdHVyYSAoc2lzdGVtYSBkZSBmaXR4ZXJzIHBsZT8pIgorCisjOiBmaWxlaW8uYzozODE5Cittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBFUlJPUiBERSBDT05WRVJTSdMiCisKKyM6IGZpbGVpby5jOjM4MzUKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW0Rpc3Bvc2l0aXVdIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW05ld10iCittc2dzdHIgIltOb3VdIgorCisjOiBmaWxlaW8uYzozODYyCittc2dpZCAiIFthXSIKK21zZ3N0ciAiIFthXSIKKworIzogZmlsZWlvLmM6Mzg2MgorbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIGFmZWdpdHMiCisKKyM6IGZpbGVpby5jOjM4NjQKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW2VdIgorCisjOiBmaWxlaW8uYzozODY0Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiBlc2NyaXRzIgorCisjOiBmaWxlaW8uYzozOTE3Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IHBhdGNobW9kZTogbm8gcydoYSBwb2d1dCBkZXNhciBlbCBmaXR4ZXIgb3JpZ2luYWwiCisKKyM6IGZpbGVpby5jOjM5MzkKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogbm8gcydoYSBwb2d1dCB0b2NhciBlbCBmaXR4ZXIgb3JpZ2luYWwgYnVpdCIKKworIzogZmlsZWlvLmM6Mzk1NAorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogTm8gcydoYSBwb2d1dCBlbGltaW5hciBsYSBj8nBpYSBkZSBzZWd1cmV0YXQiCisKKyM6IGZpbGVpby5jOjQwMTgKK21zZ2lkICIiCisiXG4iCisiV0FSTklORzogT3JpZ2luYWwgZmlsZSBtYXkgYmUgbG9zdCBvciBkYW1hZ2VkXG4iCittc2dzdHIgIlxuQVRFTkNJ0zogRWwgZml0eGVyIG9yaWdpbmFsIGVzIHBvdCBoYXZlciBmZXQgbWFsYulcbiIKKworIzogZmlsZWlvLmM6NDAyMAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIm5vIHNvcnRpdSBkZSBsJ2VkaXRvciBmaW5zIHF1ZSBzJ2hhZ2kgZGVzYXQgZWwgZml0eGVyIGFtYiDoeGl0ISIKKworIzogZmlsZWlvLmM6NDEwOQorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDEwOQorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2Zvcm1hdCBkb3NdIgorCisjOiBmaWxlaW8uYzo0MTE2Cittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzo0MTE2Cittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0IG1hY10iCisKKyM6IGZpbGVpby5jOjQxMjMKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6NDEyMworbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIltmb3JtYXQgdW5peF0iCisKKyM6IGZpbGVpby5jOjQxNTAKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSBs7W5pYSwgIgorCisjOiBmaWxlaW8uYzo0MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQgbO1uaWVzLCAiCisKKyM6IGZpbGVpby5jOjQxNTUKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSBjYXLgY3RlciIKKworIzogZmlsZWlvLmM6NDE1NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhcmFjdGVycyIKK21zZ3N0ciAiJWxkIGNhcuBjdGVycyIKKworIyCrbm8gZmluYWwgZGUgbO1uaWG7ICBlYWMKKyM6IGZpbGVpby5jOjQxNjcKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9mbF0iCisKKyM6IGZpbGVpby5jOjQxNjcKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJb2mx0aW1hIGztbmlhIGluY29tcGxldGFdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjQxODYKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIkFURU5DSdM6IEVsIGZpdHhlciBoYSBjYW52aWF0IGRlcyBkZSBxdWUgcydoYSBsbGVnaXQhISEiCisKKyMgcHJlZ3VudGEgYXNrX3llc25vKCkgICBlYWMKKyM6IGZpbGVpby5jOjQxODgKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIkVzdGV1IHNlZ3VycyBxdWUgdm9sZXUgZXNjcml1cmUnbCIKKworIzogZmlsZWlvLmM6NTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogRXJyb3IgZW4gZXNjcml1cmUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiBFcnJvciBlbiB0YW5jYXIgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MjM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBFcnJvciBlbiBsbGVnaXIgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NDU5Cittc2dpZCAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTI0NjogTCdhdXRvLW9yZHJlIEZpbGVDaGFuZ2VkU2hlbGwgaGEgZWxpbWluYXQgZWwgYnVmZmVyIgorCisjOiBmaWxlaW8uYzo1NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IEF0ZW5jafM6IEVsIGZpdHhlciBcIiVzXCIgaGEgZGVpeGF0IGQnZXN0YXIgZGlzcG9uaWJsZSIKKworIzogZmlsZWlvLmM6NTQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIlcxMjogQXRlbmNp8zogVGFudCBlbCBmaXR4ZXIgXCIlc1wiIGNvbSBlbCBidWZmZXIgZGVsIFZpbSBoYW4gY2FudmlhdCIKKworIyBtYXNzYSBsbGFyZz8gIGVhYworIzogZmlsZWlvLmM6NTQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBBdGVuY2nzOiBFbCBmaXR4ZXIgXCIlc1wiIGhhIGNhbnZpYXQgZGVzIGRlIHF1ZSBzJ2hhIGNvbWVu52F0IGEgZWRpdGFyIgorCisjIG1hc3NhIGxsYXJnPyAgZWFjCisjOiBmaWxlaW8uYzo1NDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogQXRlbmNp8zogRWxzIHBlcm1pc29zIGRlIFwiJXNcIiBoYW4gY2FudmlhdCBkZXMgcXVlIHMnaGEgY29tZW7nYXQgYSBlZGl0YXIiCisKKyMgbWFzc2EgbGxhcmc/ICBlYWMKKyM6IGZpbGVpby5jOjU0OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzEzOiBBdGVuY2nzOiBFbCBmaXR4ZXIgXCIlc1wiIGhhIGVzdGF0IGNyZWF0IGRlc3By6XMgcXVlIHMnaGEgY29tZW7nYXQgYSBlZGl0YXIiCisKKyM6IGZpbGVpby5jOjU1MTIKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICJBdGVuY2nzIgorCisjOiBmaWxlaW8uYzo1NTEzCittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImRCdhY29yZFxuIgorIiZDYXJyZWdhIGVsIGZpdHhlciIKKworIzogZmlsZWlvLmM6NTYxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2MjogTm8gcydoYW4gcG9ndXQgZmVyIGxlcyBwcmVwYXJhY2lvbnMgcGVyIHJlbGxlZ2lyIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTYzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogTm8gcydoYSBwb2d1dCByZWxsZWdpciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjYyMTIKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS1FbGltaW5hdC0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NjM3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6IE5vIGV4aXN0ZWl4IHRhbCBncnVwOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6IENhcuBjdGVyIGlst2xlZ2FsIGRlc3By6XMgZGUgKjogJXMiCisKKyM6IGZpbGVpby5jOjY1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IE5vIGV4aXN0ZWl4IHRhbCBlc2RldmVuaW1lbnQ6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjY2NTcKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICJcbi0tLSBBdXRvLW9yZHJlcyAtLS0iCisKKyM6IGZpbGVpby5jOjY5MjgKK21zZ2lkICJFMjE3OiBDYW4ndCBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgQUxMIGV2ZW50cyIKK21zZ3N0ciAiRTIxNzogTm8gZXMgcG9kZW4gZXhlY3V0YXIgYXV0by1vcmRyZXMgcGVyIFRPVFMgZWxzIGVzZGV2ZW5pbWVudHMiCisKKyM6IGZpbGVpby5jOjY5NTEKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIk5vIGNvaW5jaWRlaXggY2FwIGF1dG8tb3JkcmUiCisKKyM6IGZpbGVpby5jOjcyNzEKK21zZ2lkICJFMjE4OiBhdXRvY29tbWFuZCBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFMjE4OiBJbWJyaWNhY2nzIGQnYXV0by1vcmRyZXMgbWFzc2EgcHJvZnVuZGEiCisKKyM6IGZpbGVpby5jOjc1MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICJhdXRvLW9yZHJlcyAlcyBwZXIgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3NTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiRXhlY3V0YW50ICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjc2MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG8tb3JkcmUgJXMiCisKKyM6IGZpbGVpby5jOjgxODIKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBGYWx0YSB1biB7LiIKKworIzogZmlsZWlvLmM6ODE4NAorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IEZhbHRhIHVuIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiBObyBzJ2hhIHRyb2JhdCBjYXAgcGxlYyIKKworIzogZm9sZC5jOjU1MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBObyBlcyBwb3QgY3JlYXIgY2FwIHBsZWMgYW1iIGVsICdmb2xkbWV0aG9kJyBhY3R1YWwiCisKKyM6IGZvbGQuYzo1NTUKK21zZ2lkICJFMzUxOiBDYW5ub3QgZGVsZXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MTogTm8gcG90IGVsaW1pbmFyIGVsIHBsZWMgYW1iIGVsICdmb2xkbWV0aG9kJyBhY3R1YWwiCisKKyM6IGdldGNoYXIuYzoyNDYKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IE5vIGVzIHBvdCBtb2RpZmljYXIgdW4gYnVmZmVyIGRlIGxlY3R1cmEiCisKKyM6IGdldGNoYXIuYzoyMTU2Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6IGFzc2lnbmFjafMgcmVjdXJzaXZhIgorCisjOiBnZXRjaGFyLmM6MzAyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogamEgZXhpc3RlaXggdW5hIGFicmV2aWFjafMgZ2xvYmFsIHBlciAlcyIKKworIzogZ2V0Y2hhci5jOjMwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBqYSBleGlzdGVpeCB1bmEgYXNzaWduYWNp8yBnbG9iYWwgcGVyICVzIgorCisjOiBnZXRjaGFyLmM6MzE1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiBqYSBleGlzdGVpeCB1bmEgYWJyZXZpYWNp8yBwZXIgJXMiCisKKyM6IGdldGNoYXIuYzozMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiBqYSBleGlzdGVpeCB1bmEgYXNzaWduYWNp8yBwZXIgJXMiCisKKyM6IGdldGNoYXIuYzozMjE5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJObyBzJ2hhIHRyb2JhdCBjYXAgYWJyZXZpYWNp8yIKKworIzogZ2V0Y2hhci5jOjMyMjEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICJObyBzJ2hhIHRyb2JhdCBjYXAgYXNzaWduYWNp8yIKKworIzogZ2V0Y2hhci5jOjQxMTEKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IE1vZGUgaWy3bGVnYWwiCisKKyM6IGd1aV9hdF9mcy5jOjMwMAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8bm8gZXMgcG90IG9icmlyPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogbm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIGZvbnQgJXMiCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiB2aW1fU2VsRmlsZTogbm8gcydoYSBwb2d1dCB0b3JuYXIgYWwgZGlyZWN0b3JpIGFjdHVhbCIKKworIzogZ3VpX2F0X2ZzLmM6MjgwMQorbXNnaWQgIlBhdGhuYW1lOiIKK21zZ3N0ciAiVWJpY2FjafM6IgorCisjOiBndWlfYXRfZnMuYzoyODA3Cittc2dpZCAiRTYxNTogdmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNTogdmltX1NlbEZpbGU6IG5vIHMnaGEgcG9ndXQgb2J0ZW5pciBlbCBkaXJlY3RvcmkgYWN0dWFsIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9tb3RpZi5jOjE2MjMKK21zZ2lkICJPSyIKK21zZ3N0ciAiRCdhY29yZCIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfZ3RrLmM6MjYzNCBndWlfbW90aWYuYzoxNjE4IGd1aV9tb3RpZi5jOjI4NDkKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIkNhbmNlbLdsYSIKKworIzogZ3VpX2F0aGVuYS5jOjIwNDcgZ3VpX21vdGlmLmM6MTg3MQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIkRp4GxlZyBkZWwgVmltIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIkJhcnJhIGRlIGRlc3BsYedhbWVudDogTm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIG1pZGEgZGVsIG1hcGEgZGUgYml0cy4iCisKKyM6IGd1aV9iZXZhbC5jOjk4CisjfiBtc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCisjfiBtc2dzdHIgIiIKKworIzogZ3VpLmM6MjE5Cittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IE5vIHMnaGEgcG9ndXQgaW5pY2lhciBsJ2ludGVyZu1jaWUgZ3LgZmljYSIKKworIzogZ3VpLmM6MzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBObyBzJ2hhIHBvZ3V0IGxsZWdpciBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MworbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogRWwgdmFsb3IgZGUgJ2d1aWZvbnR3aWRlJyBubyDpcyB24GxpZCIKKworIzogZ3VpLmM6MzkzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IE5vIHMnaGEgcG9ndXQgYXNzaWduYXIgbWVt8nJpYSBwZWwgY29sb3IgJXMiCisKKyM6IGd1aV9ndGsuYzoxNTYzCittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiRGngbGVnIGRlbCBWaW0uLi4iCisKKyM6IGd1aV9ndGsuYzoxOTk4IG1lc3NhZ2UuYzoyNzY2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlPtXG4iCisiJk5vXG4iCisiJkNhbmNlbLdsYSIKKworIzogZ3VpX2d0ay5jOjIxNjEKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAiX03odG9kZXMgZCdlbnRyYWRhIgorCisjOiBndWlfZ3RrLmM6MjQyNyBndWlfbW90aWYuYzoyNzY4Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSBDZXJjYSBpIHN1YnN0aXR1ZWl4Li4uIgorCisjOiBndWlfZ3RrLmM6MjQzNSBndWlfbW90aWYuYzoyNzcwCittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBDZXJjYS4uLiIKKworIzogZ3VpX2d0ay5jOjI0NjcgZ3VpX21vdGlmLmM6Mjg4OAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIkNlcmNhOiIKKworIzogZ3VpX2d0ay5jOjI0ODcgZ3VpX21vdGlmLmM6MjkyMAorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIlN1YnN0aXR1aWVpeCBhbWI6IgorCisjLiB3aG9sZSB3b3JkIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjUxOSBndWlfbW90aWYuYzozMDM2Cittc2dpZCAiTWF0Y2ggd2hvbGUgd29yZCBvbmx5IgorbXNnc3RyICJOb23pcyBwYXJhdWxlcyBzZW5jZXJlcyIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNTMyIGd1aV9tb3RpZi5jOjMwNDgKK21zZ2lkICJNYXRjaCBjYXNlIgorbXNnc3RyICJTZW5zaWJsZSBhIGxlcyBtYWr6c2N1bGVzIgorCisjOiBndWlfZ3RrLmM6MjU0NCBndWlfbW90aWYuYzoyOTkwCittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICJEaXJlY2Np8yIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNTU2IGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAiQW11bnQiCisKKyM6IGd1aV9ndGsuYzoyNTYwIGd1aV9tb3RpZi5jOjMwMTAKK21zZ2lkICJEb3duIgorbXNnc3RyICJBdmFsbCIKKworIzogZ3VpX2d0ay5jOjI1ODYgZ3VpX2d0ay5jOjI1ODggZ3VpX21vdGlmLmM6Mjc5MgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAiQ2VyY2EgZWwgc2Vn/GVudCIKKworIzogZ3VpX2d0ay5jOjI2MDUgZ3VpX2d0ay5jOjI2MDcgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIlN1YnN0aXR1ZWl4IgorCisjOiBndWlfZ3RrLmM6MjYxOCBndWlfZ3RrLmM6MjYyMCBndWlfbW90aWYuYzoyODIyCittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIlN1YnN0aXR1ZWl4LWxlcyB0b3RlcyIKKworIzogZ3VpX2d0a194MTEuYzoyMjg1Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiBTJ2hhIHJlYnV0IHVuYSBwZXRpY2nzIFwiZGllXCIgZGVsIGdlc3RvciBkZSBzZXNzaW9uc1xuIgorCisjOiBndWlfZ3RrX3gxMS5jOjM0NzQKK21zZ2lkICJWaW06IE1haW4gd2luZG93IHVuZXhwZWN0ZWRseSBkZXN0cm95ZWRcbiIKK21zZ3N0ciAiVmltOiBMYSBmaW5lc3RyYSBwcmluY2lwYWwgaGEgZXN0YXQgZGVzdHJ172RhIGluZXNwZXJhZGFtZW50XG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDA4OAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJTZWxlY2Np8yBkZSB0aXB1cyBkZSBsbGV0cmEiCisKKyM6IGd1aV9ndGtfeDExLmM6NTk0NCB1aS5jOjIwMDkKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICJTJ2hhIHVzYXQgQ1VUX0JVRkZFUjAgZW4gbGxvYyBkJ3VuYSBzZWxlY2Np8yBidWlkYSIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0cmUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiRGlyZWN0b3JpcyIKKworIzogZ3VpX21vdGlmLmM6MTYyMQorbXNnaWQgIkhlbHAiCittc2dzdHIgIkFqdWRhIgorCisjOiBndWlfbW90aWYuYzoxNjIyCittc2dpZCAiRmlsZXMiCittc2dzdHIgIkZpdHhlcnMiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIlNlbGVjY2nzIgorCisjOiBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiRGVzZulzIgorCisjOiBndWlfcmlzY29zLmM6OTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTA6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTYxMDogTm8gcydoYSBwb2d1dCBjYXJyZWdhciBlbCB0aXB1cyBaYXAgJyVzJyIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkU2MTE6IE5vIGVzIHBvdCB1dGlsaXR6YXIgZWwgdGlwdXMgJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjcwCittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiXG5FbnZpYW50IHVuIG1pc3NhdGdlIHBlciBmaW5hbGl0emFyIGVsIHByb2PpcyBmaWxsLlxuIgorCisjOiBndWlfdzMyLmM6NzYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBBcmd1bWVudCBubyBzdXBvcnRhdDogXCItJXNcIjsgVXNldSBsYSB2ZXJzafMgT0xFLiIKKworIzogZ3VpX3c0OC5jOjIwNDgKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJDZXJjYSB1bmEgY2FkZW5hICh1c2V1ICdcXFxcJyBwZXIgY2VyY2FyICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjA3MworbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIkNlcmNhIGkgc3Vic3RpdHVlaXggKHVzZXUgJ1xcXFwnIHBlciBjZXJjYXIgJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNDc5Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiVmltIEU0NTg6IE5vIHMnaGEgcG9ndXQgYXNzaWduYXIgbWVt8nJpYSBwZXIgY29sb3JzLCBwb2RlbiBzZXIgaW5jb3JyZWN0ZXMiCisKKyM6IGd1aV94MTEuYzoyMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBFbiBlbCBjb25qdW50ICVzIGZhbHRlbiB0aXB1cyBwZWxzIHNlZ/xlbnRzIGpvY3MgZGUgY2Fy4GN0ZXJzOiIKKworIzogZ3VpX3gxMS5jOjIxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogTm9tIGRlbCBjb25qdW50IGRlIHRpcHVzOiAlcyIKKworIzogZ3VpX3gxMS5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCAnJXMnIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRWwgdGlwdXMgJyVzJyBubyDpcyBkJ2FtcGxhZGEgZml4YSIKKworIzogZ3VpX3gxMS5jOjIxMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiBOb20gZGVsIGNvbmp1bnQgZGUgdGlwdXM6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJUaXB1czA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJUaXB1czE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJMJ2FtcGxhZGEgZGVsIHRpcHVzJWQgbm8g6XMgZWwgZG9ibGUgcXVlIGxhIGRlbCB0aXB1czBcbiIKKworIzogZ3VpX3gxMS5jOjIxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICJBbXBsYWRhIGRlbCB0aXB1czA6ICVsZFxuIgorCisjOiBndWlfeDExLmM6MjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICJBbXBsYWRhIGRlbCB0aXB1czE6ICVsZFxuXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBFUlJPUiBkZSBsJ2F1dPJtYXRhIGhhbmd1bCIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIkFmZWdlaXggdW5hIGJhc2UgZGUgZGFkZXMgbm92YSIKKworIzogaWZfY3Njb3BlLmM6NzkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICJDb25zdWx0YSB1biBwYXRy8yIKKworIzogaWZfY3Njb3BlLmM6ODEKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiTW9zdHJhIGFxdWVzdCBtaXNzYXRnZSIKKworIzogaWZfY3Njb3BlLmM6ODMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiVGFsbGEgdW5hIGNvbm5leGnzIgorCisjOiBpZl9jc2NvcGUuYzo4NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlJlaW5pY2lhIHRvdGVzIGxlcyBjb25uZXhpb25zIgorCisjOiBpZl9jc2NvcGUuYzo4NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIk1vc3RyYSBsZXMgY29ubmV4aW9ucyIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiBGb3JtYSBkJ/pzOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICJBcXVlc3RhIG9yZHJlIGRlIGNzY29wZSBubyBzdXBvcnRhIGRpdmlzafMgZGUgZmluZXN0cmVzLlxuIgorCisjOiBpZl9jc2NvcGUuYzoxNzAKK21zZ2lkICJFNTYyOiBVc2FnZTogY3N0YWcgPGlkZW50PiIKK21zZ3N0ciAiRTU2MjogRm9ybWEgZCf6czogY3N0YWcgPGRlc3BsPiIKKworIzogaWZfY3Njb3BlLmM6MjI2Cittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiBObyBzJ2hhIHRyb2JhdCBsJ2V0aXF1ZXRhIgorCisjOiBpZl9jc2NvcGUuYzo0MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBFcnJvciBkZSBzdGF0KCVzKTogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQxNAorbXNnaWQgIkU1NjM6IHN0YXQgZXJyb3IiCittc2dzdHIgIkU1NjM6IEVycm9yIGRlIHN0YXQoKSIKKworIzogaWZfY3Njb3BlLmM6NTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgbm8g6XMgdW4gZGlyZWN0b3JpIG8gdW5hIGJhc2UgZGUgZGFkZXMgZGUgY3Njb3BlIHbgbGlkYSIKKworIzogaWZfY3Njb3BlLmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiUydoYSBhZmVnaXQgbGEgYmFzZSBkZSBkYWRlcyBjc2NvcGUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjU4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogRXJyb3IgZW4gbGxlZ2lyIGxhIGNvbm5leGnzIGNzY29wZSAlbGQiCisKKyM6IGlmX2NzY29wZS5jOjY4NgorbXNnaWQgIkU1NjE6IHVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJFNTYxOiBUaXB1cyBkZSBjZXJjYSBjc2NvcGUgZGVzY29uZWd1ZGEiCisKKyM6IGlmX2NzY29wZS5jOjcyOAorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBObyBzJ2hhbiBwb2d1dCBjcmVhciBjYW5vbmFkZXMgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo3NDUKK21zZ2lkICJFNjIyOiBDb3VsZCBub3QgZm9yayBmb3IgY3Njb3BlIgorbXNnc3RyICJFNjIyOiBObyBzJ2hhIHBvZ3V0IGJpZnVyY2FyIGVsIHByb2PpcyBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjgzOSBpZl9jc2NvcGUuYzo4ODkKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAibCdleGVjdWNp8yBkZSBjc19jcmVhdGVfY29ubmVjdGlvbiBoYSBmYWxsYXQiCisKKyM6IGlmX2NzY29wZS5jOjg5MAorbXNnaWQgIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIKK21zZ3N0ciAiRTYyMzogTm8gcydoYSBwb2d1dCBnZW5lcmFyIHVuIHByb2PpcyBwZXIgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo5MDMKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gcGVyIHRvX2ZwIGhhIGZhbGxhdCIKKworIzogaWZfY3Njb3BlLmM6OTA1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIHBlciBmcl9mcCBoYSBmYWxsYXQiCisKKyM6IGlmX2NzY29wZS5jOjk0MworbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2NzogTm8gaGkgaGFuIGNvbm5leGlvbnMgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTogQ2FwIHJlc3VsdGF0IHBlciBsYSBjb25zdWx0YSBjc2NvcGUgJXMgZGUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjEwNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OTogaW52YWxpZCBjc2NvcGVxdWlja2ZpeCBmbGFnICVjIGZvciAlYyIKK21zZ3N0ciAiRTQ2OTogRWwgc2VueWFsIGNzY29wZXF1aWNrZml4ICVjIG5vIOlzIHbgbGlkIHBlciAlYyIKKworIzogaWZfY3Njb3BlLmM6MTEzMQorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAib3JkcmVzIGRlIGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6MTEzNAorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKSIKK21zZ3N0ciAiJS01czogJS0zMHMgKEZvcm1hIGQn+nM6ICVzKSIKKworIzogaWZfY3Njb3BlLmM6MTIzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI1OiBjYW5ub3Qgb3BlbiBjc2NvcGUgZGF0YWJhc2U6ICVzIgorbXNnc3RyICJFNjI1OiBObyBzJ2hhIHBvZ3V0IG9icmlyIGxhIGJhc2UgZGUgZGFkZXMgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI1MAorbXNnaWQgIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIgorbXNnc3RyICJFNjI2OiBObyBzJ2hhIHBvZ3V0IG9idGVuaXIgbCdpbmZvcm1hY2nzIGRlIGxhIGJhc2UgZGUgZGFkZXMgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMjc1Cittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IE5vIHMnaGEgYWZlZ2l0IHVuYSBiYXNlIGRlIGRhZGVzIGNzY29wZSBkdXBsaWNhZGEiCisKKyM6IGlmX2NzY29wZS5jOjEyODYKK21zZ2lkICJFNTY5OiBtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAiRTU2OTogUydoYSBhc3NvbGl0IGVsIG3geGltIG5vbWJyZSBkZSBjb25uZXhpb25zIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MTQwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IE5vIHMnaGEgdHJvYmF0IGxhIGNvbm5leGnzIGNzY29wZSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTQzNgorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgInMnaGEgdGFuY2F0IGxhIGNvbm5leGnzIGNzY29wZSAlcyIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTc2Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IEVycm9yIGZhdGFsIGEgY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjE4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIkV0aXF1ZXRhIGNzY29wZTogJXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NDAKK21zZ2lkICIiCisiXG4iCisiICAgIyAgIGxpbmUiCittc2dzdHIgIlxuICAgIyAgIGztbmlhIgorCisjOiBpZl9jc2NvcGUuYzoxODQyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICJmaXR4ZXIgLyBjb250ZXh0IC8gbO1uaWFcbiIKKworIzogaWZfY3Njb3BlLmM6MTk5MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjA5OiBDc2NvcGUgZXJyb3I6ICVzIgorbXNnc3RyICJFNjA5OiBFcnJvciBkZSBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoyMTU1Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIlMnaGFuIHJlaW5pY2lhdCB0b3RlcyBsZXMgYmFzZXMgZGUgZGFkZXMgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoyMjIzCittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIm5vIGhpIGhhIGNvbm5leGlvbnMgY3Njb3BlXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyMjcKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBiYXNlIGRlIGRhZGVzICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggZCd1YmljYWNp81xuIgorCisjOiBpZl9weXRob24uYzozOTQKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2MzogQXF1ZXN0YSBvcmRyZSBlc3TgIGRlc2hhYmlsaXRhZGEsIG5vIHMnaGEgcG9ndXQgY2FycmVnYXIgUHl0aG9uLiIKKworIzogaWZfcHl0aG9uLmM6NTk2Cittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJubyBzJ2hhbiBwb2d1dCBlbGltaW5hciBlbHMgYXRyaWJ1dHMgZGUgbCdPdXRwdXRPYmplY3QiCisKKyM6IGlmX3B5dGhvbi5jOjYwMworbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgIidzb2Z0c3BhY2UnIGhhIGRlIHNlciB1biBub21icmUgZW50ZXIiCisKKyM6IGlmX3B5dGhvbi5jOjYxMQorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJsJ2F0cmlidXQgbm8g6XMgduBsaWQiCisKKyM6IGlmX3B5dGhvbi5jOjY1MCBpZl9weXRob24uYzo2NjQKK21zZ2lkICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgbGlzdCBvZiBzdHJpbmdzIgorbXNnc3RyICJsYSBmdW5jafMgd3JpdGVsaW5lcygpIHJlcXVlcmVpeCB1bmEgbGxpc3RhIGRlIGNhZGVuZXMiCisKKyM6IGlmX3B5dGhvbi5jOjc5MAorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IEVycm9yIGVuIGluaWNpYWxpdHphciBlbHMgb2JqZWN0ZXMgZCdFL1MiCisKKyM6IGlmX3B5dGhvbi5jOjk3NSBpZl90Y2wuYzoxNDAyCittc2dpZCAiaW52YWxpZCBleHByZXNzaW9uIgorbXNnc3RyICJsJ2V4cHJlc3Np8yBubyDpcyB24GxpZGEiCisKKyM6IGlmX3B5dGhvbi5jOjk4OSBpZl90Y2wuYzoxNDA3Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJubyBzJ2hhIGNvbXBpbGF0IHN1cG9ydCBwZXIgZXhwcmVzc2lvbnMiCisKKyM6IGlmX3B5dGhvbi5jOjEwMDIKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJpbnRlbnQgZGUgcmVmZXLobmNpYSBhIHVuIGJ1ZmZlciBlbGltaW5hdCIKKworIzogaWZfcHl0aG9uLmM6MTAxNyBpZl9weXRob24uYzoxMDU4IGlmX3B5dGhvbi5jOjExMjIgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAibm9tYnJlIGRlIGztbmlhIGZvcmEgZCdhYmFzdCIKKworIzogaWZfcHl0aG9uLmM6MTI1NworIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxvYmplY3RlIGJ1ZmZlciAoZWxpbWluYXQpIGEgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjEzNDggaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIm5vbSBkZSBtYXJjYSBubyB24GxpZCIKKworIzogaWZfcHl0aG9uLmM6MTYyMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICJubyBleGlzdGVpeCB0YWwgYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxNzExCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAiaW50ZW50IGRlIHJlZmVyaXItc2UgYSB1bmEgZmluZXN0cmEgZWxpbWluYWRhIgorCisjOiBpZl9weXRob24uYzoxNzU2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJhdHJpYnV0IGRlIG5vbelzIGxlY3R1cmEiCisKKyM6IGlmX3B5dGhvbi5jOjE3NjkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgInBvc2ljafMgZGVsIGN1cnNvciBmb3JhIGRlbCBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjE4NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iamVjdGUgZmluZXN0cmEgKGVsaW1pbmF0KSBhICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTg1OAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAodW5rbm93bikgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZWN0ZSBmaW5lc3RyYSAoZGVzY29uZWd1dCkgYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxmaW5lc3RyYSAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5MzYKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAibm8gZXhpc3RlaXggdGFsIGZpbmVzdHJhIgorCisjOiBpZl9weXRob24uYzoyMTkzIGlmX3B5dGhvbi5jOjIyMjggaWZfcHl0aG9uLmM6MjI3OCBpZl9weXRob24uYzoyMzQ2CisjOiBpZl9weXRob24uYzoyNDY2IGlmX3B5dGhvbi5jOjI1MTggaWZfdGNsLmM6Njg0IGlmX3RjbC5jOjcyOSBpZl90Y2wuYzo4MDMKKyM6IGlmX3RjbC5jOjg3MyBpZl90Y2wuYzoxOTk4Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBkZXNhciBsJ2luZm9ybWFjafMgZGUgZGVzZmVyIgorCisjOiBpZl9weXRob24uYzoyMTk1IGlmX3B5dGhvbi5jOjIyODUgaWZfcHl0aG9uLmM6MjM1NworbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBlc2JvcnJhciBsYSBs7W5pYSIKKworIzogaWZfcHl0aG9uLmM6MjIzMCBpZl9weXRob24uYzoyMzczIGlmX3RjbC5jOjY5MCBpZl90Y2wuYzoyMDIwCittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBzdWJzdGl0dWlyIGxhIGztbmlhIgorCisjOiBpZl9weXRob24uYzoyMzg5IGlmX3B5dGhvbi5jOjI0NjggaWZfcHl0aG9uLmM6MjUyNgorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBpbnNlcmlyIGxhIGztbmlhIgorCisjOiBpZl9weXRob24uYzoyNjMwCittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICJsYSBjYWRlbmEgbm8gcG90IGNvbnRlbmlyIHNhbHRzIGRlIGztbmlhIgorCisjOiBpZl9ydWJ5LmM6Mzk2Cittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkUyNjY6IE9yZHJlIGRlc2hhYmlsaXRhZGEsIG5vIHMnaGEgcG9ndXQgY2FycmVnYXIgbGEgYmlibGlvdGVjYSBSdWJ5LiIKKworIzogaWZfcnVieS5jOjQ1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBlc3RhdCBkZSBsb25nam1wIGRlc2NvbmVndXQgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiQ29tbXV0YSBpbXBsZW1lbnRhY2nzL2RlZmluaWNp8yIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAiTW9zdHJhIGxhIGNsYXNzZSBiYXNlIGRlIgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAiTW9zdHJhIGVsIG1lbWJyZSBkZSBsYSBmdW5jafMgaW52YWxpZGF0IgorCisjOiBpZl9zbmlmZi5jOjcwCittc2dpZCAiUmV0cmlldmUgZnJvbSBmaWxlIgorbXNnc3RyICJPYnRlbmlyIGQndW4gZml0eGVyIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJPYnRlbmlyIGQndW4gcHJvamVjdGUiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiT2J0ZW5pciBkZSB0b3RzIGVscyBwcm9qZWN0ZXMiCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiT2J0ZW5pciIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICJNb3N0cmEgZWwgY29kaSBmb250IGRlIgorCisjOiBpZl9zbmlmZi5jOjc2Cittc2dpZCAiRmluZCBzeW1ib2wiCittc2dzdHIgIkNlcmNhIHVuIHPtbWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAiRXhwbG9yYSBsZXMgY2xhc3NlcyIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICJNb3N0cmEgbGEgamVyYXJxdWlhIGRlIGNsYXNzZXMiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJNb3N0cmEgbGEgamVyYXJxdWlhIGRlIGNsYXNzZXMgcmVzdHJpbmdpZGEiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiBlcyByZWZlcmVpeCBhIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiByZWZlcmVuY2lhZGEgcGVyIgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiB06SB1biIKKworIzogaWZfc25pZmYuYzo4MworbXNnaWQgIlhyZWYgdXNlZCBieSIKK21zZ3N0ciAiWHJlZiB1c2FkYSBwZXIiCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIk1vc3RyYSBkb2N1IGRlIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIkdlbmVyYSBkb2N1IHBlciIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBjb25uZWN0YXIgYW1iIFNOaUZGKy4gUmV2aXNldSBsJ2VudG9ybiAoc25pZmZlbWFjcyBoYSBkJ2VzdGFyIGVuIGVsICRQQVRIKS5cbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IEVycm9yIGRlIGxlY3R1cmEuIERlc2Nvbm5lY3RhdCIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrICIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICJubyAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJlc3TgIGNvbm5lY3RhdCIKKworIzogaWZfc25pZmYuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3NTogVW5rbm93biBTTmlGRisgcmVxdWVzdDogJXMiCittc2dzdHIgIkUyNzU6IFBldGljafMgU05pRkYrIGRlc2NvbmVndWRhOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRXJyb3IgZW4gY29ubmVjdGFyIGEgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIG5vIGNvbm5lY3RhdCIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogTm8g6XMgdW4gYnVmZmVyIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogRXJyb3IgZCdlc2NyaXB0dXJhLiBEZXNjb25uZWN0YXQiCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAibm9tYnJlIGRlIGJ1ZmZlciBubyB24GxpZCIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibm8gaW1wbGVtZW50YXQgKGVuY2FyYSkiCisKKyM6IGlmX3RjbC5jOjUwMQorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICJvcGNp8yBkZXNjb25lZ3VkYSIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzQKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIm5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgZWwgbm9tYnJlIGRlIGztbmllcyIKKworIzogaWZfdGNsLmM6ODQ1Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJtYXJjYSBubyBlc3RhYmxlcnRhIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICJmaWxhICVkIGNvbHVtbmEgJWQiCisKKyM6IGlmX3RjbC5jOjg4MQorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIm5vIHMnaGEgcG9ndXQgaW5zZXJpci9hZmVnaXIgbGEgbO1uaWEiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAic2VueWFsIGRlc2NvbmVndXQ6ICIKKworIzogaWZfdGNsLmM6MTMzOAorbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICJ2aW1PcHRpb24gZGVzY29uZWd1ZGEiCisKKyM6IGlmX3RjbC5jOjE0MjMKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgImludGVycnVwY2nzIGRlIHRlY2xhdCIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAiZXJyb3IgZGUgdmltIgorCisjOiBpZl90Y2wuYzoxNDcxCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICJubyBzJ2hhIHBvZ3V0IGNyZWFyIGwnb3JkcmUgZGUgYnVmZmVyL2ZpbmVzdHJhOiBsJ29iamVjdGUgZXN04CBzaWd1ZW50IGVsaW1pbmF0IgorCisjOiBpZl90Y2wuYzoxNTQ1CisjfiBtc2dpZCAiIgorI34gImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKKyN+IG1zZ3N0ciAiIgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MgorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICJFMjgwOiBFUlJPUiBGQVRBTCBERSBUQ0w6IGxsaXN0YSBkZSByZWZlcuhuY2llcyBjb3JydXB0YSE/IENvbXVuaXF1ZXUtaG8gYSB2aW0tZGV2QHZpbS5vcmcuIgorCisjOiBpZl90Y2wuYzoxNTYzCisjfiBtc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiIgorIkU1NzE6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiRTU3MTogQXF1ZXN0YSBvcmRyZSBlc3TgIGRlc2hhYmlsaXRhZGE6IE5vIHMnaGEgcG9ndXQgY2FycmVnYXIgbGEgbGxpYnJlcmlhIFRjbC4iCisKKyM6IGlmX3RjbC5jOjE4ODYKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIkUyODE6IEVSUk9SIERFIFRDTDogZWwgY29kaSBkZSByZXRvcm4gbm8g6XMgdW4gZW50ZXIhPyBDb211bmlxdWV1LWhvIGEgdmltLWRldkB2aW0ub3JnLiIKKworIzogaWZfdGNsLmM6MjAwNgorbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAibm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIGztbmlhIgorCisjOiBpZl94Y21kc3J2LmM6MjE1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCByZWdpc3RyYXIgdW4gbm9tIGRlIHNlcnZpZG9yIGQnb3JkcmVzIgorCisjOiBpZl94Y21kc3J2LmM6NDY1Cittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODogTm8gcydoYSBwb2d1dCBlbnZpYXIgbCdvcmRyZSBhbCBwcm9ncmFtYSBkZXN0aW5hdGFyaSIKKworIzogaWZfeGNtZHNydi5jOjczNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTczOiBJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIKK21zZ3N0ciAiRTU3MzogUydoYSB1c2F0IHVuYSBJRCBkZSBzZXJ2aWRvciBubyB24GxpZGE6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA5OAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogRWwgcmVnaXN0cmUgZGUgbCdpbnN04G5jaWEgZGUgVklNIGVzdOAgbWFsIGZvcm1hdC4gUydoYSBlc2JvcnJhdCEiCisKKyM6IG1haW4uYzo2MAorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICJMJ29wY2nzIOlzIGRlc2NvbmVndWRhIgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiTWFzc2EgYXJndW1lbnRzIGQnZWRpY2nzIgorCisjOiBtYWluLmM6NjQKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJGYWx0YSB1biBhcmd1bWVudCBkZXNwculzIGRlIgorCisjOiBtYWluLmM6NjYKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAiUG9ycXVlcmlhIGRlc3By6XMgZGUgbCdvcGNp8yIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIk1hc3NhIGFyZ3VtZW50cyBcIitvcmRyZVwiLCBcIi1jIG9yZHJlXCIgbyBcIi0tY21kIG9yZHJlXCIiCisKKyM6IG1haW4uYzo3MAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorbXNnc3RyICJBcmd1bWVudCBubyB24GxpZCBwZXIiCisKKyM6IG1haW4uYzo0NjkKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIkFxdWVzdCBWaW0gbm8gaGEgZXN0YXQgY29tcGlsYXQgYW1iIHN1cG9ydCBwZXIgZGlmZi4iCisKKyM6IG1haW4uYzo5MjgKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICJSZWludGVudCBkJ29icmlyIGwnc2NyaXB0OiBcIiIKKworIzogbWFpbi5jOjkzMiBtYWluLmM6OTM5IG1haW4uYzo5ODMgbWVtbGluZS5jOjM2ODIgbWVtbGluZS5jOjM2ODYKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6OTM3Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9icmlyIGFtYiBwZXJt7XMgZGUgbGVjdHVyYTogXCIiCisKKyM6IG1haW4uYzo5ODEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgb2JyaXIgcGVyIGRlc2FyLWhpIGwnZXhpZGEgZGUgbCdzY3JpcHQ6IFwiIgorCisjOiBtYWluLmM6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIiVkIGZpdHhlcnMgcGVyIGVkaXRhclxuIgorCisjOiBtYWluLmM6MTIwNQorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogQXRlbmNp8zogTGEgc29ydGlkYSBubyBlc3TgIGNvbm5lY3RhZGEgYSB1biB0ZXJtaW5hbFxuIgorCisjOiBtYWluLmM6MTIwNworbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IEF0ZW5jafM6IEwnZW50cmFkYSBubyBlc3TgIGNvbm5lY3RhZGEgYSB1biB0ZXJtaW5hbFxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyNjkKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJs7W5pYSBkJ29yZHJlcyBwcmUtdmltcmMiCisKKyM6IG1haW4uYzoxMzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiBObyBzJ2hhIHBvZ3V0IGxsZWdpciBcIiVzXCIiCisKKyM6IG1haW4uYzoyMzQ2Cittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIlxuTelzIGluZm9ybWFjafMgYW1iOiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMzc5Cittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIltmaXR4ZXIgLi4uXSAgICBlZGl0YSBlbChzKSBmaXR4ZXIocykgZXNwZWNpZmljYXQocykiCisKKyM6IG1haW4uYzoyMzgwCittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgZWRpdGEgZWwgdGV4dCBkZSBsJ2VudHJhZGEgZXN04G5kYXJkIgorCisjOiBtYWluLmM6MjM4MQorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IGV0aXF1ZXRhICAgICBlZGl0YSBlbCBmaXR4ZXIgb24gaGkgaGEgbCdldGlxdWV0YSIKKworIzogbWFpbi5jOjIzODMKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtmdHhlcnJvcnNdICBlZGl0YSBlbCBmaXR4ZXIgb24gaGkgaGEgZWwgcHJpbWVyIGVycm9yIgorCisjOiBtYWluLmM6MjM5MgorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIlxuXG4gIPpzOiIKKworIzogbWFpbi5jOjIzOTUKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbYXJndW1lbnRzXSAiCisKKyM6IG1haW4uYzoyMzk5Cittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiXG5vIGLpOiIKKworIzogbWFpbi5jOjI0MDIKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICJcblxuQXJndW1lbnRzOlxuIgorCisjOiBtYWluLmM6MjQwMworbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0RGVzcHLpcyBkJ2FpePIgbm9t6XMgbm9tcyBkZSBmaXR4ZXJzIgorCisjOiBtYWluLmM6MjQwNQorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx0Tm8gZXhwYW5kZWl4IHBhdHJvbnMgZGUgbm9tcyIKKworIzogbWFpbi5jOjI0MDgKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRSZWdpc3RyYSBhcXVlc3QgZ3ZpbSBwZXIgT0xFIgorCisjOiBtYWluLmM6MjQwOQorbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHREZXNyZWdpc3RyYSBhcXVlc3QgZ3ZpbSBwZXIgT0xFIgorCisjOiBtYWluLmM6MjQxMgorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0VXNhIHVuYSBpbnRlcmbtY2llIGdy4GZpY2EgKGNvbSBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyNDEzCittc2dpZCAiLWYgIG9yICAtLW5vZm9ya1x0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWYgIG8gICAtLW5vZm9ya1x0Tm8gY3JlYSB1biBwcm9j6XMgbm91IHBlciBsYSBHVUkiCisKKyM6IG1haW4uYzoyNDE1Cittc2dpZCAiLXZcdFx0XHRWaSBtb2RlIChsaWtlIFwidmlcIikiCittc2dzdHIgIi12XHRcdFx0TW9kZSBWaSAoY29tIFwidmlcIikiCisKKyM6IG1haW4uYzoyNDE2Cittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0TW9kZSBFeCAoY29tIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDE3Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdE1vZGUgc2lsZW5jafNzIChub23pcyBwZXIgXCJleFwiKSIKKworIzogbWFpbi5jOjI0MTkKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx0TW9kZSBkaWZmIChjb20gXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjQyMQorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0TW9kZSBzZW56aWxsIChjb20gXCJldmltXCIsIHNlbnNlIG1vZGVzKSIKKworIzogbWFpbi5jOjI0MjIKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdE1vZGUgbm9t6XMgbGVjdHVyYSAoY29tIFwidmlld1wiKSIKKworIzogbWFpbi5jOjI0MjMKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0TW9kZSByZXN0cmluZ2l0IChjb20gXCJydmltKSIKKworIzogbWFpbi5jOjI0MjQKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdE5vIHBlcm1ldCBtb2RpZmljYXIgKGVzY3JpdXJlKSBmaXR4ZXJzIgorCisjOiBtYWluLmM6MjQyNQorbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdE5vIHBlcm1ldCBtb2RpZmljYXIgZWwgdGV4dCIKKworIzogbWFpbi5jOjI0MjYKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdE1vZGUgYmluYXJpIgorCisjOiBtYWluLmM6MjQyOAorbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRcdE1vZGUgTGlzcCIKKworIzogbWFpbi5jOjI0MzAKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdENvbXBhdGlibGUgYW1iIFZpIgorCisjOiBtYWluLmM6MjQzMQorbXNnaWQgIi1OXHRcdFx0Tm90IGZ1bGx5IFZpIGNvbXBhdGlibGU6ICdub2NvbXBhdGlibGUnIgorbXNnc3RyICItTlx0XHRcdE5vIGRlbCB0b3QgY29tcGF0aWJsZSBhbWIgVmkiCisKKyM6IG1haW4uYzoyNDMyCittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0Tml2ZWxsIGRlIGxvcXVhY2l0YXQiCisKKyM6IG1haW4uYzoyNDMzCittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHRNb2RlIGRlIGRlcHVyYWNp8yIKKworIzogbWFpbi5jOjI0MzQKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdE5vIHVzYSBmaXR4ZXJzIGQnaW50ZXJjYW52aSwgbm9t6XMgbWVt8nJpYSIKKworIzogbWFpbi5jOjI0MzUKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRMbGlzdGEgZWxzIGZpdHhlcnMgZCdpbnRlcmNhbnZpIGkgc3VydCIKKworIzogbWFpbi5jOjI0MzYKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKGFtYiBub20gZGUgZml0eGVyKSAgUmVjdXBlcmEgdW5hIHNlc3Np8yBhY2NpZGVudGFkYSIKKworIzogbWFpbi5jOjI0MzcKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0SWd1YWwgcXVlIC1yIgorCisjOiBtYWluLmM6MjQzOQorbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHRObyBvYnJlIHVuYSBmaW5lc3RyYSBub3ZhIGFtYiBuZXdjbGkiCisKKyM6IG1haW4uYzoyNDQwCittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGlzcG9zaXRpdT5cdFx0VXNhIDxkaXNwb3NpdGl1PiBwZXIgbCdFL1MiCisKKyM6IG1haW4uYzoyNDQzCittc2dpZCAiLUFcdFx0XHRzdGFydCBpbiBBcmFiaWMgbW9kZSIKK21zZ3N0ciAiLUFcdFx0XHRDb21lbudhIGVuIG1vZGUg4HJhYiIKKworIzogbWFpbi5jOjI0NDYKK21zZ2lkICItSFx0XHRcdFN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdENvbWVu52EgZW4gbW9kZSBoZWJyZXUiCisKKyM6IG1haW4uYzoyNDQ5Cittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdCBDb21lbudhIGVuIG1vZGUgZmFyc2kiCisKKyM6IG1haW4uYzoyNDUxCittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0RGVmaW5laXggZWwgdGlwdXMgZGUgdGVybWluYWwiCisKKyM6IG1haW4uYzoyNDUyCittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx0VXNhIDx2aW1yYz4gZW4gbGxvYyBkZSBxdWFsc2V2b2wgYWx0cmUgLnZpbXJjIgorCisjOiBtYWluLmM6MjQ1NAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRVc2EgPGd2aW1yYz4gZW4gbGxvYyBkZSBxdWFsc2V2b2wgYWx0cmUgLmd2aW1yYyIKKworIzogbWFpbi5jOjI0NTYKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0Tm8gY2FycmVnYSBjYXAgcGx1Z2luIgorCisjOiBtYWluLmM6MjQ1NworbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdE9icmUgTiBmaW5lc3RyZXMgKHBlciBvbWlzc2nzOiB1bmEgcGVyIGZpdHhlcikiCisKKyM6IG1haW4uYzoyNDU4Cittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0Q29tIC1vIHBlcvIgYW1iIGRpdmlzaW9ucyB2ZXJ0aWNhbHMiCisKKyM6IG1haW4uYzoyNDU5Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0Q29tZW7nYSBhbCBmaW5hbCBkZWwgZml0eGVyIgorCisjOiBtYWluLmM6MjQ2MAorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG76bT5cdFx0Q29tZW7nYSBhIGxhIGztbmlhIDxsbvptPiIKKworIzogbWFpbi5jOjI0NjIKK21zZ2lkICItLWNtZCA8Y29tbWFuZD5cdEV4ZWN1dGUgPGNvbW1hbmQ+IGJlZm9yZSBsb2FkaW5nIGFueSB2aW1yYyBmaWxlIgorbXNnc3RyICItLWNtZCA8b3JkcmU+XHRFeGVjdXRhIDxvcmRyZT4gYWJhbnMgZGUgbGxlZ2lyIGVscyBmaXR4ZXJzIHZpbXJjIgorCisjOiBtYWluLmM6MjQ2NAorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8b3JkcmU+XHRcdEV4ZWN1dGEgPG9yZHJlPiBkZXNwculzIGRlIGNhcnJlZ2FyIGVsIHByaW1lciBmaXR4ZXIiCisKKyM6IG1haW4uYzoyNDY1Cittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8Zml0eGVyPlx0XHRFdmFsdWEgPGZpdHhlcj4gdW4gY29wIGNhcnJlZ2F0IGVsIHByaW1lciBmaXR4ZXIiCisKKyM6IG1haW4uYzoyNDY2Cittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdD5cdFx0TGxlZ2VpeCBvcmRyZXMgZGVsIG1vZGUgTm9ybWFsIGRlbCBmaXR4ZXIgPHNjcmlwdD4iCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNjcmlwdD5cdFx0QWZlZ2VpeCB0b3RlcyBsZXMgb3JkcmVzIGV4ZWN1dGFkZXMgYWwgZml0eGVyIDxzY3JpcHQ+IgorCisjOiBtYWluLmM6MjQ2OAorbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNjcmlwdD5cdFx0RXNjcml1IHRvdGVzIGxlcyBvcmRyZXMgZXhlY3V0YWRlcyBhbCBmaXR4ZXIgPHNjcmlwdD4iCisKKyM6IG1haW4uYzoyNDcwCittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHRFZGl0YSBmaXR4ZXJzIGFtYiB4aWZyYXQiCisKKyM6IG1haW4uYzoyNDc0Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDxwYW50YWxsYT5cdENvbm5lY3RhIGVsIFZpbSBhIHVuIHNlcnZpZG9yIFggcGFydGljdWxhciIKKworIzogbWFpbi5jOjI0NzYKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdE5vIGVzIGNvbm5lY3RhIGEgY2FwIHNlcnZpZG9yIFgiCisKKyM6IG1haW4uYzoyNDc5Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpdHhlcnM+XHRFZGl0YSA8Zml0eGVycz4gZW4gdW4gc2Vydmlkb3IgVmltLCBzaSDpcyBwb3NzaWJsZSIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxlbnQgPGZpdHhlcnM+ICBJZ3VhbCwgbm8gZXMgcXVlaXhhIHNpIG5vIGhpIGhhIHNlcnZpZG9yIgorCisjOiBtYWluLmM6MjQ4MQorbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlcz4gIEFzIC0tcmVtb3RlIGJ1dCB3YWl0IGZvciBmaWxlcyB0byBoYXZlIGJlZW4gZWRpdGVkIgorbXNnc3RyICItLXJlbW90ZS13YWl0IDxmaXR4ZXJzPiAgQ29tIC0tcmVtb3RlLCBwZXLyIGVzcGVyYSBxdWUgcydlZGl0aW4gZWxzIGZpdHhlcnMiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpdHhlcnM+ICBJZ3VhbCwgbm8gZXMgcXVlaXhhIHNpIG5vIGhpIGhhIHNlcnZpZG9yIgorCisjOiBtYWluLmM6MjQ4MworbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPHRlY2xlcz4gIEVudmlhIDx0ZWNsZXM+IGEgdW4gc2Vydmlkb3IgVmltIGkgc3VydCIKKworIzogbWFpbi5jOjI0ODQKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhdWxhIDxleHByPiBlbiB1biBzZXJ2aWRvciBWaW0gaSBtb3N0cmEgZWwgcmVzdWx0YXQiCisKKyM6IG1haW4uYzoyNDg1Cittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRMbGlzdGEgZWxzIG5vbXMgZGVscyBzZXJ2aWRvcnMgVmltIGFjY2Vzc2libGVzIgorCisjOiBtYWluLmM6MjQ4NgorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxub20+XHRFbnZpYSBhIG8gZXMgY29udmVydGVpeCBlbiBzZXJ2aWRvciBWaW0gPG5vbT4iCisKKyM6IG1haW4uYzoyNDg5Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdFVzYSA8dmltaW5mbz4gZW4gbGxvYyBkZSAudmltaW5mbyIKKworIzogbWFpbi5jOjI0OTEKK21zZ2lkICItaCAgb3IgIC0taGVscFx0UHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWggIG8gICAtLWhlbHBcdE1vc3RyYSBhcXVlc3RhIGFqdWRhIGkgc3VydCIKKworIzogbWFpbi5jOjI0OTIKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdE1vc3RyYSBpbmZvcm1hY2nzIHNvYnJlIGxhIHZlcnNp8yBpIHN1cnQiCisKKyM6IG1haW4uYzoyNDk2Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICJcbkFyZ3VtZW50cyByZWNvbmVndXRzIHBlbCBndmltICh2ZXJzafMgTW90aWYpOlxuIgorCisjOiBtYWluLmM6MjUwMAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChuZVh0YXcgdmVyc2lvbik6XG4iCittc2dzdHIgIlxuQXJndW1lbnRzIHJlY29uZWd1dHMgcGVsIGd2aW0gKHZlcnNp8yBuZVh0YXc+OlxuIgorCisjOiBtYWluLmM6MjUwMgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIlxuQXJndW1lbnRzIHJlY29uZWd1dHMgcGVsIGd2aW0gKHZlcnNp8yBBdGhlbmEpOlxuIgorCisjOiBtYWluLmM6MjUwNgorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxwYW50YWxsYT5cdEV4ZWN1dGEgdmltIGEgPHBhbnRhbGxhPiIKKworIzogbWFpbi5jOjI1MDcKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0Q29tZW7nYSBpY29uaWZpY2F0IgorCisjOiBtYWluLmM6MjUwOQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxub20+XHRcdFVzYSBlbHMgcmVjdXJzb3MgY29tIHNpIHZpbSBm83MgPG5vbT4iCisKKyM6IG1haW4uYzoyNTEwCittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0IChObyBpbXBsZW1lbnRhdClcbiIKKworIzogbWFpbi5jOjI1MTIKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzYSA8Y29sb3I+IHBlbCBmb25zICh0YW1i6TogLWJnKSIKKworIzogbWFpbi5jOjI1MTMKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzYSA8Y29sb3I+IHBlbCB0ZXh0IG5vcm1hbCAodGFtYuk6IC1mZykiCisKKyM6IG1haW4uYzoyNTE0IG1haW4uYzoyNTM0Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8dGlwdXM+XHRVc2EgPHRpcHVzPiBwZWwgdGV4dCBub3JtYWwgKHRhbWLpOiAtZm4pIgorCisjOiBtYWluLmM6MjUxNQorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDx0aXB1cz5cdFVzYSA8dGlwdXM+IHBlbCB0ZXh0IGVuIG5lZ3JldGEiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPHRpcHVzPlx0VXNhIDx0aXB1cz4gcGVsIHRleHQgZW4gY3Vyc2l2YSIKKworIzogbWFpbi5jOjI1MTcgbWFpbi5jOjI1MzUKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzYSA8Z2VvbT4gY29tIGEgZ2VvbWV0cmlhIGluaWNpYWwgKHRhbWLpOiAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNTE4Cittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPGFtcGxhZGE+XHRVc2EgdW4gbWFyZ2UgZCdhbXBsYWRhIDxhbXBsYWRhPiAodGFtYuk6IC1idykiCisKKyM6IG1haW4uYzoyNTE5Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICItc2Nyb2xsYmFyd2lkdGggPGFtcGxhZGE+ICBBbXBsYWRhIGRlIGxhIGJhcnJhIGRlIGRlc3BsYedhbWVudCAodGFtYuk6IC1zdykiCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGFs52FkYT5cdEFs52FkYSBkZSBsYSBiYXJyYSBkZSBtZW76ICh0YW1i6TogLW1oKSIKKworIzogbWFpbi5jOjI1MjMgbWFpbi5jOjI1MzYKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0VXNhIGVsIG1vZGUgZGUgdmlkZW8gaW52ZXJzICh0YW1i6TogLXJ2KSIKKworIzogbWFpbi5jOjI1MjQKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0Tm8gdXNhIGVsIG1vZGUgZGUgdmlkZW8gaW52ZXJzICh0YW1i6TogK3J2KSIKKworIzogbWFpbi5jOjI1MjUKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZWN1cnM+XHRFc3RhYmxlaXggZWwgcmVjdXJzIGVzcGVjaWZpY2F0IgorCisjOiBtYWluLmM6MjUyOAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICJcbkFyZ3VtZW50cyByZWNvbmVndXRzIHBlbCBndmltICh2ZXJzafMgUklTQyBPUyk6XG4iCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPG5vbWJyZT5cdEFtcGxhZGEgaW5pY2lhbCBkZSBsYSBmaW5lc3RyYSBlbiBjb2x1bW5lcyIKKworIzogbWFpbi5jOjI1MzAKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPG5vbWJyZT5cdEFs52FkYSBpbmljaWFsIGRlIGxhIGZpbmVzdHJhIGVuIGZpbGVzIgorCisjOiBtYWluLmM6MjUzMworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChHVEsrIHZlcnNpb24pOlxuIgorbXNnc3RyICJcbkFyZ3VtZW50cyByZWNvbmVndXRzIHBlbCBndmltICh2ZXJzafMgR1RLKyk6XG4iCisKKyM6IG1haW4uYzoyNTM3Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPHBhbnRhbGxhPlx0RXhlY3V0YSB2aW0gYSA8cGFudGFsbGE+ICh0YW1i6TogLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjI1MzkKK21zZ2lkICItLXJvbGUgPHJvbGU+XHRTZXQgYSB1bmlxdWUgcm9sZSB0byBpZGVudGlmeSB0aGUgbWFpbiB3aW5kb3ciCittc2dzdHIgIi0tcm9sZSA8cm9sPlx0XHRVc2EgdW4g+m5pYyByb2wgcGVyIGlkZW50aWZpY2FyIGxhIGZpbmVzdHJhIHByaW5jaXBhbCIKKworIzogbWFpbi5jOjI1NDEKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHRPYnJlIGVsIHZpbSBkaW5zIGQndW5hIGFsdHJhIGFwbGljYWNp8yBHVEsiCisKKyM6IG1haW4uYzoyNTQzCittc2dpZCAiLS1oZWxwXHRcdFNob3cgR25vbWUgYXJndW1lbnRzIgorbXNnc3RyICItLWhlbHBcdFx0TW9zdHJhIGVscyBhcmd1bWVudHMgcGVyIEdub21lIgorCisjOiBtYWluLmM6Mjc3NQorbXNnaWQgIk5vIGRpc3BsYXkiCittc2dzdHIgIk5vIGhpIGhhIGNhcCBwYW50YWxsYSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI3OTAKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6IEVycm9yIGVuIGVudmlhci5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNzk2Cittc2dpZCAiOiBTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICI6IEVycm9yIGVuIGVudmlhci4gSW50ZW50YW50IGwnZXhlY3VjafMgbG9jYWxcbiIKKworIzogbWFpbi5jOjI4MzQgbWFpbi5jOjI4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICJlZGl0YXQgJWQgZGUgJWQiCisKKyM6IG1haW4uYzoyODc3Cittc2dpZCAiTm8gZGlzcGxheTogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiTm8gaGkgaGEgY2FwIHBhbnRhbGxhOiBFcnJvciBlbiBlbnZpYXIgbCdleHByZXNzafMuXG4iCisKKyM6IG1haW4uYzoyODg5Cittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IEVycm9yIGVuIGVudmlhciBsJ2V4cHJlc3Np8y5cbiIKKworIzogbWFyay5jOjY1NgorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiTm8gaGkgaGEgbWFycXVlcyBkZWZpbmlkZXMiCisKKyM6IG1hcmsuYzo2NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBDYXAgbWFyY2EgY29pbmNpZGVpeCBhbWIgXCIlc1wiIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo2NjkKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICJcbm1hcmNhIGztbiAgY29sIGZpdHhlci90ZXh0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MDcKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiXG4gc2FsdCAgbO1uICBjb2wgZml0eGVyL3RleHQiCisKKyM6IG1hcmsuYzoxMDcyCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiXG4jIE1hcnF1ZXMgZGUgZml0eGVyOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDcKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiXG4jIExsaXN0YSBkZSBzYWx0cyAoZGUgbelzIGEgbWVueXMgcmVjZW50KTpcbiIKKworIzogbWFyay5jOjEyMDIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIlxuIyBIaXN0b3JpYWwgZGUgbWFycXVlcyBlbiBmaXR4ZXJzIChkZSBt6XMgYSBtZW55cyByZWNlbnQpOlxuIgorCisjOiBtYXJrLmM6MTI4NQorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICJGYWx0YSB1biAnPiciCisKKyM6IG1ieXRlLmM6NDA5Cittc2dpZCAiRTU0MzogTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIkU1NDM6IE5vIOlzIHVuIGNvZGkgZGUgcOBnaW5hIHbgbGlkIgorCisjOiBtYnl0ZS5jOjQwODEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogTm8gcydoYW4gcG9ndXQgZXN0YWJsaXIgZWxzIHZhbG9ycyBkZWwgY29udGV4dCBkJ2VudHJhZGEiCisKKyM6IG1ieXRlLmM6NDIzMworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogRXJyb3IgZW4gY3JlYXIgZWwgY29udGV4dCBkJ2VudHJhZGEiCisKKyM6IG1ieXRlLmM6NDM4MAorbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4NjogRXJyb3IgZW4gb2JyaXIgZWwgbeh0b2RlIGQnZW50cmFkYSIKKworIzogbWJ5dGUuYzo0MzkxCisjfiBtc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorI34gbXNnc3RyICIiCisKKyM6IG1ieXRlLmM6NDM5NworbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBlbCBt6HRvZGUgZCdlbnRyYWRhIG5vIHN1cG9ydGEgY2FwIGVzdGlsIgorCisjOiBtYnl0ZS5jOjQ0NTQKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogZWwgbeh0b2RlIGQnZW50cmFkYSBubyBzdXBvcnRhIGVsIHRpcHVzIGRlIHByZWVkaWNp8yIKKworIzogbWJ5dGUuYzo0NTI4Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBMJ2VzdGlsIG92ZXItdGhlLXNwb3QgcmVxdWVyZWl4IHVuIGNvbmp1bnQgZGUgdGlwdXMiCisKKyM6IG1ieXRlLmM6NDU2MAorbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogTGEgbGxpYnJlcmlhIEdUSysg6XMgYW50ZXJpb3IgYSAxLjIuMy4gRXMgZGVzaGFiaWxpdGEgbCfgcmVhIGQnZXN0YXQiCisKKyM6IG1ieXRlLmM6NDgzOQorbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IEVsIHNlcnZpZG9yIGRlIG3odG9kZXMgZCdlbnRyYWRhIChJTVMpIG5vIGVzdOAgZnVuY2lvbmFudCIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBFbCBibG9jIG5vIGVzdGF2YSBibG9xdWVqYXQiCisKKyM6IG1lbWZpbGUuYzo5ODkKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiBFcnJvciBkZSBwb3NpY2nzIHF1YW4gZXMgbGxlZ2lhIGVsIGZpdHhlciBkJ2ludGVyY2FudmkiCisKKyM6IG1lbWZpbGUuYzo5OTQKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogRXJyb3IgZGUgbGVjdHVyYSBlbiBlbCBmaXR4ZXIgZCdpbnRlcmNhbnZpIgorCisjOiBtZW1maWxlLmM6MTA0NgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBFcnJvciBkZSBwb3NpY2nzIHF1YW4gcydlc2NyaXZpYSBlbCBmaXR4ZXIgZCdpbnRlcmNhbnZpIgorCisjOiBtZW1maWxlLmM6MTA2NAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NzogRXJyb3IgZCdlc2NyaXB0dXJhIGVuIGVsIGZpdHhlciBkJ2ludGVyY2FudmkiCisKKyM6IG1lbWZpbGUuYzoxMjYxCittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiBFbCBmaXR4ZXIgZCdpbnRlcmNhbnZpIGVuY2FyYSBleGlzdGVpeCIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IE5vIHMnaGEgcG9ndXQgb2J0ZW5pciBlbCBibG9jIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogTm8gcydoYSBwb2d1dCBvYnRlbmlyIGVsIGJsb2MgMT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiBObyBzJ2hhIHBvZ3V0IG9idGVuaXIgZWwgYmxvYyAzPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTogRXAhIEVsIGZpdHhlciBkJ2ludGVyY2FudmkgcydoYSBwZXJkdXQhISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogTm8gcydoYSBwb2d1dCByZWFub21lbmFyIGVsIGZpdHhlciBkJ2ludGVyY2FudmkiCisKKyM6IG1lbWxpbmUuYzo1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwMzogVW5hYmxlIHRvIG9wZW4gc3dhcCBmaWxlIGZvciBcIiVzXCIsIHJlY292ZXJ5IGltcG9zc2libGUiCittc2dzdHIgIkUzMDM6IEVycm9yIGVuIG9icmlyIGVsIGZpdHhlciBkJ2ludGVyY2FudmkgZGUgXCIlc1wiLCBubyBlcyBwb2Ry4CByZWN1cGVyYXIiCisKKyM6IG1lbWxpbmUuYzo2MTcKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6IE5vIHMnaGEgcG9ndXQgb2J0ZW5pciBlbCBibG9jIDA/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBObyBzJ2hhIHRyb2JhdCBlbCBmaXR4ZXIgZCdpbnRlcmNhbnZpIGRlICVzIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiRW50cmV1IGVsIG76bWVybyBkZWwgZml0eGVyIGQnaW50ZXJjYW52aSBhIHV0aWxpdHphciAoMCBwZXIgc29ydGlyKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiBObyBzJ2hhIHBvZ3V0IG9icmlyICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBsbGVnaXIgZWwgYmxvYyAwIGRlICIKKworIzogbWVtbGluZS5jOjgzNworbXNnaWQgIiIKKyJcbiIKKyJNYXliZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSBvciBWaW0gZGlkIG5vdCB1cGRhdGUgdGhlIHN3YXAgZmlsZS4iCittc2dzdHIgIlxuTyBi6SBubyBzJ2hhbiBmZXQgY2FudmlzLCBvIGVsIFZpbSBubyBoYSBhY3R1YWxpdHphdCBlbCBmaXR4ZXIgZCdpbnRlcmNhbnZpLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5vIGVzIHBvdCB1dGlsaXR6YXIgYW1iIGFxdWVzdGEgdmVyc2nzIGRlIFZpbS5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIlVzZXUgVmltIHZlcnNp8yAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgbm8gc2VtYmxhIHVuIGZpdHhlciBkJ2ludGVyY2FudmkgZGUgVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBubyBlcyBwb3QgdXRpbGl0emFyIGVuIGFxdWVzdCBvcmRpbmFkb3IuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIkVsIGZpdHhlciB2YSBzZXIgY3JlYXQgZWwgIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyJvIGVsIGZpdHhlciBlc3TgIGZldCBtYWxi6S4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiUydlc3TgIHV0aWxpdHphbnQgZWwgZml0eGVyIGQnaW50ZXJjYW52aSBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIkZpdHhlciBvcmlnaW5hbCBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MjIKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogQXRlbmNp8zogRWwgZml0eGVyIG9yaWdpbmFsIHBvdCBoYXZlciBjYW52aWF0IgorCisjOiBtZW1saW5lLmM6OTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogTm8gcydoYSBwb2d1dCBsbGVnaXIgZWwgYmxvYyAxIGRlICVzIgorCisjOiBtZW1saW5lLmM6OTY3Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9GQUxURU4gTU9MVEVTIEzNTklFUyIKKworIzogbWVtbGluZS5jOjk4MworbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P0NPTVBUQURPUiBERSBMzU5JQSBJTkNPUlJFQ1RFIgorCisjOiBtZW1saW5lLmM6OTkwCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P0JMT0MgQlVJVCIKKworIzogbWVtbGluZS5jOjEwMTYKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9GQUxURU4gTM1OSUVTIgorCisjOiBtZW1saW5lLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogTCdJRCBkZWwgYmxvYyAxIG5vIOlzIGNvcnJlY3RhICglcyBubyDpcyB1biBmaXR4ZXIgLnN3cD8pIgorCisjOiBtZW1saW5lLmM6MTA1MworbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P0ZBTFRBIFVOIEJMT0MiCisKKyM6IG1lbWxpbmUuYzoxMDY5Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IERlcyBkJ2Fxde0gZmlucyA/Pz9GSU5BTCBsZXMgbO1uaWVzIHBvZGVuIGVzdGFyIGVxdWl2b2NhZGVzIgorCisjOiBtZW1saW5lLmM6MTA4NQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IERlcyBkJ2Fxde0gZmlucyA/Pz9GSU5BTCBoaSBwb3QgaGF2ZXIgbO1uaWVzIGluc2VyaWRlcy9lbGltaW5hZGVzIgorCisjOiBtZW1saW5lLmM6MTEwNQorbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/RklOQUwiCisKKyM6IG1lbWxpbmUuYzoxMTMxCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IFMnaGEgaW50ZXJyb21wdXQgbGEgcmVjdXBlcmFjafMiCisKKyM6IG1lbWxpbmUuYzoxMTMzCittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjogUydoYW4gZGV0ZWN0YXQgZXJyb3JzIGVuIGxhIHJlY3VwZXJhY2nzOyBidXNxdWV1IGztbmllcyBhbWIgPz8/IgorCisjOiBtZW1saW5lLmM6MTEzNgorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAiUydoYSBjb21wbGV0YXQgbGEgcmVjdXBlcmFjafMuIEhhdXJpZXUgZGUgcmV2aXNhciBxdWUgdG90IHNpZ3VpIGNvcnJlY3RlLiIKKworIzogbWVtbGluZS5jOjExMzcKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIlxuKFBvdHNlciB2b2xldSBkZXNhciBhcXVlc3QgZml0eGVyIGFtYiB1biBhbHRyZSBub21cbiIKKworIzogbWVtbGluZS5jOjExMzgKK21zZ2lkICJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIKK21zZ3N0ciAiaSBmZXIgdW4gZGlmZiBhbWIgZWwgZml0eGVyIG9yaWdpbmFsIHBlciB2ZXVyZSBlbHMgY2FudmlzKVxuIgorCisjOiBtZW1saW5lLmM6MTEzOQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICJFbGltaW5hIGVsIGZpdHhlciAuc3dwIHRvdCBzZWd1aXQuXG5cbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMTk1Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIkZpdHhlcnMgZCdpbnRlcmNhbnZpIHRyb2JhdHM6IgorCisjOiBtZW1saW5lLmM6MTM3MworbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICBFbiBlbCBkaXJlY3RvcmkgYWN0dWFsOlxuIgorCisjOiBtZW1saW5lLmM6MTM3NQorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBVc2FudCBlbCBub20gZXNwZWNpZmljYXQ6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzc5Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgRW4gZWwgZGlyZWN0b3JpICIKKworIzogbWVtbGluZS5jOjEzOTcKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIGNhcCAtLVxuIgorCisjOiBtZW1saW5lLmM6MTQ2OQorbXNnaWQgIiAgICAgICAgICBvd25lZCBieTogIgorbXNnc3RyICIgICAgICBwcm9waWV0YXQgZGU6ICIKKworIzogbWVtbGluZS5jOjE0NzEKK21zZ2lkICIgICBkYXRlZDogIgorbXNnc3RyICIgICBhbWIgZGF0YTogIgorCisjOiBtZW1saW5lLmM6MTQ3NSBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgYW1iIGRhdGE6ICIKKworIzogbWVtbGluZS5jOjE0OTEKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbZGVsIFZpbSB2ZXJzafMgMy4wXSIKKworIzogbWVtbGluZS5jOjE0OTUKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgIFtubyBzZW1ibGEgdW4gZml0eGVyIGQnaW50ZXJjYW52aSBkZSBWaW1dIgorCisjOiBtZW1saW5lLmM6MTQ5OQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgbm9tIGRlbCBmaXR4ZXI6ICIKKworIzogbWVtbGluZS5jOjE1MDUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIlxuICAgICAgICAgbW9kaWZpY2F0OiAiCisKKyM6IG1lbWxpbmUuYzoxNTA2Cittc2dpZCAiWUVTIgorbXNnc3RyICJTzSIKKworIzogbWVtbGluZS5jOjE1MDYKK21zZ2lkICJubyIKK21zZ3N0ciAibm8iCisKKyM6IG1lbWxpbmUuYzoxNTEwCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICJcbiAgIG5vbSBkZSBsJ3VzdWFyaTogIgorCisjOiBtZW1saW5lLmM6MTUxNworbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgICAgbeBxdWluYTogIgorCisjOiBtZW1saW5lLmM6MTUxOQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiXG4gICAgICAgICAgIG3gcXVpbmE6ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIlxuICAgICBJRCBkZWwgcHJvY+lzOiAiCisKKyM6IG1lbWxpbmUuYzoxNTMxCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChlbmNhcmEgZnVuY2lvbmFudCkiCisKKyM6IG1lbWxpbmUuYzoxNTQzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbV0iCittc2dzdHIgIlxuICAgICAgICAgIFtubyB1c2FibGUgYW1iIGFxdWVzdGEgdmVyc2nzIGRlIFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTQ2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICJcbiAgICAgICAgICBbbm8gdXNhYmxlIGVuIGFxdWVzdGEgY29tcHV0YWRvcmFdIgorCisjOiBtZW1saW5lLmM6MTU1MQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFtubyBlcyBwb3QgbGxlZ2lyXSIKKworIzogbWVtbGluZS5jOjE1NTUKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFtubyBlcyBwb3Qgb2JyaXJdIgorCisjOiBtZW1saW5lLmM6MTc0NQorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBObyBzJ2hhIHBvZ3V0IHByZXNlcnZhciwgbm8gaGkgaGEgZml0eGVyIGQnaW50ZXJjYW52aSIKKworIzogbWVtbGluZS5jOjE3OTgKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAiUydoYSBwcmVzZXJ2YXQgZWwgZml0eGVyIgorCisjOiBtZW1saW5lLmM6MTgwMAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogTGEgcHJlc2VydmFjafMgaGEgZmFsbGF0IgorCisjOiBtZW1saW5lLmM6MTg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IGxudW0gbm8gduBsaWQ6ICVsZCIKKworIzogbWVtbGluZS5jOjE4OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiBubyBzJ2hhIHRyb2JhdCBsYSBs7W5pYSAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMjg3Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBQdW50ZXIgYSBsYSBpZCBkJ3VuIGJsb2MgaW5jb3JyZWN0ZSAzIgorCisjOiBtZW1saW5lLmM6MjM2NworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGhhdXJpYSBkZSBzZXIgMCIKKworIzogbWVtbGluZS5jOjI0MjkKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IFMnaGFuIGFjdHVhbGl0emF0IG1hc3NhIGJsb2NzPyIKKworIzogbWVtbGluZS5jOjI2MTEKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IFB1bnRlciBhIGxhIGlkIGQndW4gYmxvYyBpbmNvcnJlY3RlIDQiCisKKyM6IG1lbWxpbmUuYzoyNjM4Cittc2dpZCAiZGVsZXRlZCBibG9jayAxPyIKK21zZ3N0ciAicydoYSBlbGltaW5hdCBlbCBibG9jIDE/IgorCisjOiBtZW1saW5lLmM6MjgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTm8gcydoYSB0cm9iYXQgbGEgbO1uaWEgJWxkIgorCisjOiBtZW1saW5lLmM6MzA4MQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IFB1bnRlciBhIGxhIGlkIGQndW4gYmxvYyBpbmNvcnJlY3RlIgorCisjOiBtZW1saW5lLmM6MzA5NworbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicG9fbGluZV9jb3VudCDpcyB6ZXJvIgorCisjOiBtZW1saW5lLmM6MzEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IE5vbWJyZSBkZSBs7W5pYSBmb3JhIGQnYWJhc3Q6ICVsZCBwYXNzYXQgZWwgZmluYWwiCisKKyM6IG1lbWxpbmUuYzozMTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiBDb21wdGFkb3IgZGUgbO1uaWEgaW5jb3JyZWN0ZSBhbCBibG9jICVsZCIKKworIzogbWVtbGluZS5jOjMxNzkKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAiTGEgbWlkYSBkZSBsYSBwaWxhIHMnaW5jcmVtZW50YSIKKworIzogbWVtbGluZS5jOjMyMjUKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IFB1bnRlciBhIGxhIGlkIGQndW4gYmxvYyBpbmNvcnJlY3RlIDIiCisKKyM6IG1lbWxpbmUuYzozNjc5Cittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiBBVEVOQ0nTIgorCisjOiBtZW1saW5lLmM6MzY4MAorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiXG5TJ2hhIHRyb2JhdCB1biBmaXR4ZXIgZCdpbnRlcmNhbnZpIGRlIG5vbSBcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIk1lbnRyZSBzJ29icmlhIGVsIGZpdHhlciBcIiIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgTclTIE5PVSBxdWUgZWwgZml0eGVyIGQnaW50ZXJjYW52aSFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY5NworbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSBVbiBhbHRyZSBwcm9ncmFtYSBwb3QgZXN0YXIgZWRpdGFudCBhcXVlc3QgbWF0ZWl4IGZpdHhlci5cbiIKKyIgICAgRW4gYXF1ZXN0IGNhcywgYW5ldSBhbWIgY29tcHRlIGRlIG5vIGFjYWJhciBhbWIgZHVlc1xuIgorIiAgICBpbnN04G5jaWVzIGRpZmVyZW50cyBkZWwgbWF0ZWl4IGZpdHhlciBxdWFuIGZldSBjYW52aXMuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIFNvcnRpdSwgbyBjb250aW51ZXUgYW1iIHByZWNhdWNp8y5cbiIKKworIzogbWVtbGluZS5jOjM2OTkKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIlxuKDIpIEVsIFZpbSBzJ2hhIGVzdHJlbGxhdCBtZW50cmUgcydlZGl0YXZhIGFxdWVzdCBmaXR4ZXIuXG4iCisKKyM6IG1lbWxpbmUuYzozNzAwCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgRW4gYXF1ZXN0IGNhcywgdXNldSBcIjpyZWNvdmVyXCIgbyBi6SBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNzAyCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgcGVyIHJlY3VwZXJhciBlbHMgY2FudmlzICh2ZWdldSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzcwMworbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICBTaSBqYSBobyBoZXUgZmV0LCBlbGltaW5ldSBlbCBmaXR4ZXIgXCIiCisKKyM6IG1lbWxpbmUuYzozNzA1Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIHBlciBldml0YXIgYXF1ZXN0IG1pc3NhdGdlLlxuIgorCisjOiBtZW1saW5lLmM6MzcxOSBtZW1saW5lLmM6MzcyMworbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiRWwgZml0eGVyIGQnaW50ZXJjYW52aSBcIiIKKworIzogbWVtbGluZS5jOjM3MjAgbWVtbGluZS5jOjM3MjYKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlwiIGphIGV4aXN0ZWl4ISIKKworIzogbWVtbGluZS5jOjM3MjkKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIEFURU5DSdMiCisKKyM6IG1lbWxpbmUuYzozNzMxCittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiRWwgZml0eGVyIGQnaW50ZXJjYW52aSBqYSBleGlzdGVpeCEiCisKKyM6IG1lbWxpbmUuYzozNzM1Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXQiCittc2dzdHIgIiIKKyImT2JyZSBlbiBtb2RlIG5vbelzIGxlY3R1cmFcbiIKKyImRWRpdGFcbiIKKyImUmVjdXBlcmFcbiIKKyImU3VydCIKKworIzogbWVtbGluZS5jOjM3MzcKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImT2JyZSBlbiBtb2RlIG5vbelzIGxlY3R1cmFcbiIKKyImRWRpdGFcbiIKKyImUmVjdXBlcmFcbiIKKyImU3VydFxuIgorIkUmbGltaW5hJ2wiCisKKyM6IG1lbWxpbmUuYzozNzkwCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogUydoYW4gdHJvYmF0IG1hc3NhIGZpdHhlcnMgZCdpbnRlcmNhbnZpIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogUGFydCBkZSBsJ3ViaWNhY2nzIGRlbCBtZW76IG5vIOlzIHN1Ym1lbvoiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBFbCBtZW76IG5vbelzIGV4aXN0ZWl4IGVuIHVuIGFsdHJlIG1vZGUiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiBObyBoaSBoYSBjYXAgbWVu+iBhbWIgYXF1ZXN0IG5vbSIKKworIzogbWVudS5jOjUwOQorbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IEwndWJpY2FjafMgZGVsIG1lbvogbm8gcG90IHBvcnRhciBhIHVuIHN1Ym1lbvoiCisKKyM6IG1lbnUuYzo1NDgKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiRTMzMTogTm8gZXMgcG9kZW4gYWZlZ2lyIO10ZW1zIGRlIG1lbvogZGlyZWN0YW1lbnQgYSBsYSBiYXJyYSBkZSBtZW76IgorCisjOiBtZW51LmM6NTU0Cittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiBVbiBzZXBhcmFkb3Igbm8gcG90IGZvcm1hciBwYXJ0IGRlIGwndWJpY2FjafMgZGUgbWVu+iIKKworIy4gTm93IHdlIGhhdmUgZm91bmQgdGhlIG1hdGNoaW5nIG1lbnUsIGFuZCB3ZSBsaXN0IHRoZSBtYXBwaW5ncworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtZW51LmM6MTA3OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorbXNnc3RyICJcbi0tLSBNZW76cyAtLS0iCisKKyM6IG1lbnUuYzoxOTk2Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJFc3RyaXBhIGFxdWVzdCBtZW76IgorCisjOiBtZW51LmM6MjA2MQorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IEwndWJpY2FjafMgZGUgbWVu+iBoYSBkZSBwb3J0YXIgYSB1biDtdGVtIGRlIG1lbvoiCisKKyM6IG1lbnUuYzoyMDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogTm8gcydoYSB0cm9iYXQgZWwgbWVu+jogJXMiCisKKyM6IG1lbnUuYzoyMTUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IEVsIG1lbvogbm8gZXN04CBkZWZpbml0IHBlbCBtb2RlICVzIgorCisjOiBtZW51LmM6MjE4OAorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjogTCd1YmljYWNp8yBkZSBtZW76IGhhIGRlIHBvcnRhciBhIHVuIHN1Ym1lbvoiCisKKyM6IG1lbnUuYzoyMjA5Cittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBObyBzJ2hhIHRyb2JhdCBlbCBtZW76IC0gcmV2aXNldSBlbHMgbm9tcyBkZWxzIG1lbvpzIgorCisjOiBtZXNzYWdlLmM6NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICJTJ2hhIGRldGVjdGF0IHVuIGVycm9yIGVuIHByb2Nlc3NhciAlczoiCisKKyM6IG1lc3NhZ2UuYzo1MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAibO1uaWEgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1NzUKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW2NhZGVuYSBtYXNzYSBsbGFyZ2FdIgorCisjOiBtZXNzYWdlLmM6NzIxCittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIlRyYWR1Y2Np8yBkZWxzIG1pc3NhdGdlczogRXJuZXN0IEFkcm9ndekgPGVhZHJvZ3VlQGdteC5uZXQ+IgorCisjOiBtZXNzYWdlLmM6OTQ1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIkludGVycnVwY2nzOiAiCisKKyM6IG1lc3NhZ2UuYzo5NDgKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIlByZW1ldSBFTlRSQVIgcGVyIGNvbnRpbnVhciIKKworIzogbWVzc2FnZS5jOjk1MAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlByZW1ldSBFTlRSQVIgbyBpbnRyb2R173UgdW5hIG9yZHJlIHBlciBjb250aW51YXIiCisKKyM6IG1lc3NhZ2UuYzoyMjUzCittc2dpZCAiLS0gTW9yZSAtLSIKK21zZ3N0ciAiLS0gTelzIC0tIgorCisjOiBtZXNzYWdlLmM6MjI1NgorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoRU5UUkFSL1JFVFJPQ8lTOiBs7W5pYSwgRVNQQUkvYjsgcOBnaW5hLCBkL3U7IG1pdGphIHDgZ2luYSwgcTogc3VydCkiCisKKyM6IG1lc3NhZ2UuYzoyMjU3Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKEVOVFJBUjogbO1uaWEsIEVTUEFJOiBw4GdpbmEsIGQ6IG1pdGphIHDgZ2luYSwgcTogc3VydCkiCisKKyM6IG1lc3NhZ2UuYzoyNzQ5IG1lc3NhZ2UuYzoyNzY0Cittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIlByZWd1bnRhIgorCisjOiBtZXNzYWdlLmM6Mjc1MQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlPtXG4iCisiJk5vIgorCisjOiBtZXNzYWdlLmM6Mjc4NAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZT7VxuIgorIiZOb1xuIgorIkRlc2EtaG8gJnRvdFxuIgorIiZEZXNjYXJ0YS1obyB0b3RcbiIKKyImQ2FuY2Vst2xhIgorCisjOiBtZXNzYWdlLmM6MjgyNQorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIkRp4GxlZyBkZSBkZXNhciBmaXR4ZXIiCisKKyM6IG1lc3NhZ2UuYzoyODI3Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGngbGVnIGQnb2JyaXIgZml0eGVyIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI4OTgKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogTm8gaGkgaGEgdW4gZXhwbG9yYWRvciBkZSBmaXR4ZXJzIGVuIG1vZGUgY29uc29sYSIKKworIzogbWlzYzEuYzoyNjgxCittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogQXRlbmNp8zogUydlc3TgIGNhbnZpYW50IHVuIGZpdHhlciBkZSBub23pcyBsZWN0dXJhIgorCisjOiBtaXNjMS5jOjI5MTYKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAiMSBs7W5pYSBt6XMiCisKKyM6IG1pc2MxLmM6MjkxOAorbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICIxIGztbmlhIG1lbnlzIgorCisjOiBtaXNjMS5jOjI5MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiVsZCBs7W5pZXMgbelzIgorCisjOiBtaXNjMS5jOjI5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICIlbGQgbO1uaWVzIG1lbnlzIgorCisjOiBtaXNjMS5jOjI5MjgKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiIChJbnRlcnJvbXB1dCkiCisKKyM6IG1pc2MxLmM6NjYyMAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IHByZXNlcnZhbnQgZWxzIGZpdHhlcnMuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjY2MzAKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IEZpbmFsaXR6YXQuXG4iCisKKyM6IG1pc2MyLmM6NjcwIG1pc2MyLmM6Njg2Cittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRVJST1I6ICIKKworIzogbWlzYzIuYzo2OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIlxuW29jdGV0c10gdG90YWwgYXNzaWduYXQtYWxsaWJlcmF0ICVsdS0lbHUsIGVuIPpzICVsdSwgbeB4aW0g+nMgJWx1XG4iCisKKyM6IG1pc2MyLmM6NjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiW2NyaWRlc10gdG90YWwgcmUvbWFsbG9jKCkgJWx1LCB0b3RhbCBmcmVlKCkgJWx1XG5cbiIKKworIzogbWlzYzIuYzo3NDcKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBMYSBs7W5pYSBzJ2VzdOAgdG9ybmFudCBtYXNzYSBsbGFyZ2EiCisKKyM6IG1pc2MyLmM6NzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiBFcnJvciBpbnRlcm46IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6ODk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiBNZW3ycmlhIGV4aGF1cmlkYSEgKGFzc2lnbmFudCAlbHUgb2N0ZXRzKSIKKworIzogbWlzYzIuYzoyNTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJTJ2VzdOAgY3JpZGFudCBsJ2ludOhycHJldCBkJ29yZHJlcyBwZXIgZXhlY3V0YXI6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyNzg2Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTogRmFsdGEgdW4gY2Fy4GN0ZXIgXCI6XCIiCisKKyM6IG1pc2MyLmM6Mjc4OCBtaXNjMi5jOjI4MTUKK21zZ2lkICJFNTQ2OiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkU1NDY6IE1vZGUgaWy3bGVnYWwiCisKKyM6IG1pc2MyLmM6Mjg1NAorbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogTGEgZm9ybWEgZGVsIHB1bnRlciBkZWwgcmF0b2ztIOlzIGlst2xlZ2FsIgorCisjOiBtaXNjMi5jOjI4OTQKK21zZ2lkICJFNTQ4OiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU0ODogUydlc3BlcmF2YSB1biBk7WdpdCIKKworIzogbWlzYzIuYzoyODk5Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiBQZXJjZW50YXRnZSBpbLdsZWdhbCIKKworIzogbWlzYzIuYzozMjA5Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiSW50cm9kde91IGxhIGNsYXUgZGUgeGlmcmF0OiAiCisKKyM6IG1pc2MyLmM6MzIxMAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIkludHJvZHXvdSBsYSBtYXRlaXhhIGNsYXUgdW4gYWx0cmUgY29wOiAiCisKKyM6IG1pc2MyLmM6MzIyMAorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICJMYSBjbGF1cyBubyBjb2luY2lkZWl4ZW4hIgorCisjOiBtaXNjMi5jOjM3NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIkUzNDM6IFBhdGggbm8gduBsaWQ6ICcqKltu+m1dJyBoYSBkJ2VzdGFyIGFsIGZpbmFsIGRlbCBwYXRoLCBvIHNlZ3VpdCBkZSAnJXMnIgorCisjOiBtaXNjMi5jOjUwNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogTm8gcydoYSB0cm9iYXQgZWwgZGlyZWN0b3JpIFwiJXNcIiBlbiBlbCBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IE5vIHMnaGEgdHJvYmF0IGVsIGZpdHhlciBcIiVzXCIgZW4gZWwgcGF0aCIKKworIzogbWlzYzIuYzo1MDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IE5vIHMnaGEgdHJvYmF0IGNhcCBt6XMgZGlyZWN0b3JpIFwiJXNcIiBlbiBlbCBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IE5vIHMnaGEgdHJvYmF0IGNhcCBt6XMgZml0eGVyIFwiJXNcIiBlbiBlbCBwYXRoIgorCisjOiBtaXNjMi5jOjUyOTEKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiBGYWx0YSB1biBjYXLgY3RlciBcIjpcIiIKKworIzogbWlzYzIuYzo1MzAzCittc2dpZCAiRTU1MTogSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIkU1NTE6IENvbXBvbmVudCBpbLdsZWdhbCIKKworIzogbWlzYzIuYzo1MzExCittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IFMnZXNwZXJhdmEgdW4gZO1naXQiCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6MjgyCittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgY29ubmVjdGFyIGFtYiBOZXRiZWFucyAjMiIKKworIzogbmV0YmVhbnMuYzoyOTAKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBjb25uZWN0YXIgYW1iIE5ldGJlYW5zIgorCisjOiBuZXRiZWFucy5jOjU2NAorbXNnaWQgInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiCittc2dzdHIgImxlY3R1cmEgZCd1biBzb2NrZXQgTmV0YmVhbnMiCisKKyM6IG5vcm1hbC5jOjI5MTYKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJBdGVuY2nzOiBlbCB0ZXJtaW5hbCBubyBzdXBvcnRhIHJlc3NhbHQiCisKKyM6IG5vcm1hbC5jOjMxMzEKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiBObyBoaSBoYSBjYXAgY2FkZW5hIHNvdGEgZWwgY3Vyc29yIgorCisjOiBub3JtYWwuYzozMTMzCittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IE5vIGhpIGhhIGNhcCBpZGVudGlmaWNhZG9yIHNvdGEgZWwgY3Vyc29yIgorCisjOiBub3JtYWwuYzo0MzUxCittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IE5vIGVzIHBvZGVuIGVsaW1pbmFyIHBsZWNzIGFtYiBlbCAnZm9sZG1ldGhvZCcgYWN0dWFsIgorCisjOiBvcHMuYzoyOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICIxIGztbmlhICVzYWRhIDEgdmVnYWRhIgorCisjOiBvcHMuYzoyOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIjEgbO1uaWEgJXNhZGEgJWQgdmVnYWRlcyIKKworIzogb3BzLmM6MzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkIGztbmllcyAlc2FkZXMgMSB2ZWdhZGEiCisKKyM6IG9wcy5jOjMwNQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkIGztbmllcyAlc2FkZXMgJWQgdmVnYWRlcyIKKworIzogb3BzLmM6NjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICIlbGQgbO1uaWVzIGEgc2FnbmFyLi4uICIKKworIzogb3BzLmM6NzEzCittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAiMSBs7W5pYSBzYWduYWRhICIKKworIzogb3BzLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIiVsZCBs7W5pZXMgc2FnbmFkZXMgIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogb3BzLmM6MTY0NworbXNnaWQgImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IgorbXNnc3RyICJubyBzJ2hhIHBvZ3V0IGNvcGlhcjsgdm9sZXUgZWxpbWlhciBlbCB0ZXh0IGRlIHRvdGVzIG1hbmVyZXMiCisKKyM6IG9wcy5jOjIxNTUKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAiMSBs7W5pYSBjYW52aWFkYSIKKworIzogb3BzLmM6MjE1NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiJWxkIGztbmllcyBjYW52aWFkZXMiCisKKyM6IG9wcy5jOjI1NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgImFsbGliZXJhbnQgJWxkIGztbmllcyIKKworIzogb3BzLmM6MjgyMgorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIjEgbO1uaWEgY29waWFkYSIKKworIzogb3BzLmM6MjgyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICIlbGQgbO1uaWVzIGNvcGlhZGVzIgorCisjOiBvcHMuYzozMTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IE5vIGhpIGhhIHJlcyBlbiBlbCByZWdpc3RyZSAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNjY2Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICJcbi0tLSBSZWdpc3RyZXMgLS0tIgorCisjOiBvcHMuYzo0ODc1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJFbCBub20gZGUgcmVnaXN0cmUg6XMgaWy3bGVnYWwiCisKKyM6IG9wcy5jOjQ5NjEKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIlxuIyBSZWdpc3RyZXM6XG4iCisKKyM6IG9wcy5jOjQ5OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJFNTc0OiBFbCB0aXB1cyBkZSByZWdpc3RyZSAlZCDpcyBkZXNjb25lZ3V0IgorCisjOiBvcHMuYzo1NDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogRWwgbm9tIGRlIHJlZ2lzdHJlIG5vIOlzIHbgbGlkOiAnJXMnIgorCisjOiBvcHMuYzo1ODQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCBDb2xzOyAiCisKKyM6IG9wcy5jOjU4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VsZWN0ZWQgJXMlbGQgb2YgJWxkIExpbmVzOyAlbGQgb2YgJWxkIFdvcmRzOyAlbGQgb2YgJWxkIEJ5dGVzIgorbXNnc3RyICIlcyVsZCBkZSAlbGQgTO1uaWVzIHNlbGVjY2lvbmFkZXM7ICVsZCBkZSAlbGQgUGFyYXVsZXM7ICVsZCBkZSAlbGQgT2N0ZXRzIgorCisjOiBvcHMuYzo1ODY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAiQ29sICVzIGRlICVzOyBM7W5pYSAlbGQgZGUgJWxkOyBQYXJhdWxhICVsZCBkZSAlbGQ7IE9jdGV0ICVsZCBkZSAlbGQiCisKKyM6IG9wcy5jOjU4NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHBlciBsYSBCT00pIgorCisjOiBvcHRpb24uYzoxNjIzCittc2dpZCAiJTwlZiVoJW0lPVBhZ2UgJU4iCittc2dzdHIgIiU8JWYlaCVtJT1Q4GdpbmEgJU4iCisKKyM6IG9wdGlvbi5jOjIwNzIKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIkdy4GNpZXMgcGVyIHV0aWxpdHphciBlbCBWaW0iCisKKyM6IG9wdGlvbi5jOjMzNDQgb3B0aW9uLmM6MzQ1MQorbXNnaWQgIkU1MTg6IFVua25vd24gb3B0aW9uIgorbXNnc3RyICJFNTE4OiBMJ29wY2nzIOlzIGRlc2NvbmVndWRhIgorCisjOiBvcHRpb24uYzozMzU3Cittc2dpZCAiRTUxOTogT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkU1MTk6IEwnb3BjafMgbm8gZXN04CBzdXBvcnRhZGEiCisKKyM6IG9wdGlvbi5jOjMzODIKK21zZ2lkICJFNTIwOiBOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJFNTIwOiBObyBlc3TgIHBlcm3ocyBlbiB1bmEgbO1uaWEgZGUgbW9kZSIKKworIzogb3B0aW9uLmM6MzQzOAorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICJcbiAgICAgICAgRGVmaW5pdCBwZXIg+mx0aW0gY29wIGEgIgorCisjOiBvcHRpb24uYzozNTc3Cittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6IEVzIHJlcXVlcmVpeCB1biBu+m1lcm8gZGVzcHLpcyBkZSA9IgorCisjOiBvcHRpb24uYzozOTAzIG9wdGlvbi5jOjQ1MjAKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogTm8gcydoYSB0cm9iYXQgYSBsYSBiYXNlIGRlIGRhZGVzIHRlcm1jYXAiCisKKyM6IG9wdGlvbi5jOjM5NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOTogSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiRTUzOTogQ2Fy4GN0ZXIgaWy3bGVnYWwgPCVzPiIKKworIzogb3B0aW9uLmM6NDUxMgorbXNnaWQgIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUyOTogTm8gZXMgcG90IGRlZmluaXIgJ3Rlcm0nIGNvbSBhIGNhZGVuYSBidWlkYSIKKworIzogb3B0aW9uLmM6NDUxNQorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IE5vIGVzIHBvdCBjYW52aWFyIGRlIHRlcm1pbmFsIGVuIG1vZGUgR1VJIgorCisjOiBvcHRpb24uYzo0NTE3Cittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IFVzZXUgXCI6Z3VpXCIgcGVyIGluaW5jaWFyIGwnaW50ZXJm7WNpZSBkJ3VzdWFyaSBncuBmaWNhIgorCisjOiBvcHRpb24uYzo0NTM4Cittc2dpZCAiRTU4OTogJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiRTU4OTogTGVzIG9wY2lvbnMgJ2JhY2t1cGV4dCcgaSAncGF0Y2htb2RlJyBjb2luY2lkZWl4ZW4iCisKKyM6IG9wdGlvbi5jOjQ3MjMKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogTCdpbnRlcmbtY2llIEdUSysgMiBubyBwZXJtZXQgY2FudmlhciBsYSBjb2RpZmljYWNp8yIKKworIzogb3B0aW9uLmM6NDg3OQorbXNnaWQgIkU1MjQ6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1MjQ6IEZhbHRhIHVuIGNhcuBjdGVyIFwiOlwiIgorCisjOiBvcHRpb24uYzo0ODgxCittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiBMYSBsbGFyZ2FkYSBkZSBsYSBjYWRlbmEg6XMgemVybyIKKworIzogb3B0aW9uLmM6NDk0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiBGYWx0YSB1biBu+m1lcm8gZGVzcHLpcyBkZSA8JXM+IgorCisjOiBvcHRpb24uYzo0OTYzCittc2dpZCAiRTUyNzogTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiRTUyNzogRmFsdGEgdW5hIGNvbWEiCisKKyM6IG9wdGlvbi5jOjQ5NzAKK21zZ2lkICJFNTI4OiBNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJFNTI4OiBIZXUgZCdlc3BlY2lmaWNhciB1biB2YWxvciAnIgorCisjOiBvcHRpb24uYzo1MDExCittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IENvbnTpIHVuIGNhcuBjdGVyIG5vIGltcHJpbWlibGUgbyBhbXBsZSIKKworIzogb3B0aW9uLmM6NTA2MAorbXNnaWQgIkU1OTY6IEludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiRTU5NjogRWwgdGlwdXMgZGUgbGxldHJhIG5vIOlzIHbgbGlkIgorCisjOiBvcHRpb24uYzo1MDY4Cittc2dpZCAiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIkU1OTc6IE5vIHMnaGEgcG9ndXQgc2VsZWNjaW9uYXIgZWwgY29uanVudCBkZSB0aXB1cyIKKworIzogb3B0aW9uLmM6NTA3MAorbXNnaWQgIkU1OTg6IEludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiRTU5ODogRWwgY29uanVudCBkZSB0aXB1cyBkZSBsbGV0cmEgbm8g6XMgduBsaWQiCisKKyM6IG9wdGlvbi5jOjUwNzcKK21zZ2lkICJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJFNTMzOiBObyBzJ2hhIHBvZ3V0IHNlbGVjY2lvbmFyIGVsIHRpcHVzIGRlIGxsZXRyYSBhbXBsZSIKKworIzogb3B0aW9uLmM6NTA3OQorbXNnaWQgIkU1MzQ6IEludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJFNTM0OiBFbCB0aXB1cyBkZSBsbGV0cmEgYW1wbGUgbm8g6XMgduBsaWQiCisKKyM6IG9wdGlvbi5jOjUzNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogQ2Fy4GN0ZXIgaWy3bGVnYWwgZGVzcHLpcyBkZSA8JWM+IgorCisjOiBvcHRpb24uYzo1NDU0Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IEVzIHJlcXVlcmVpeCB1bmEgY29tYSIKKworIzogb3B0aW9uLmM6NTQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM3OiAnY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICJFNTM3OiBMJ29wY2nzICdjb21tZW50c3RyaW5nJyBoYSBkJ2VzdGFyIGluZGVmaW5pZGEgbyBjb250ZW5pciAlcyIKKworIzogb3B0aW9uLmM6NTUzNworbXNnaWQgIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkU1Mzg6IE5vIGhpIGhhIHN1cG9ydCBwZXIgcmF0b2ztIgorCisjOiBvcHRpb24uYzo1ODA1Cittc2dpZCAiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiRTU0MDogTGEgc2Vx/OhuY2lhIGQnZXhwcmVzc2lvbnMgbm8gZXN04CBhY2FiYWRhIgorCisjOiBvcHRpb24uYzo1ODA5Cittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6IEhpIGhhbiBtYXNzYSDtdGVtcyIKKworIzogb3B0aW9uLmM6NTgxMQorbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiBHcnVwcyBkZXNlcXVpbGlicmF0cyIKKworIzogb3B0aW9uLmM6NjAzMgorbXNnaWQgIkU1OTA6IEEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU1OTA6IEphIGhpIGhhIHVuYSBmaW5lc3RyYSBkZSB2aXN0YSBwcuh2aWEiCisKKyM6IG9wdGlvbi5jOjYyODkKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICJXMTc6IEwn4HJhYiByZXF1ZXJlaXggVVRGLTgsIGZldSAnOnNldCBlbmNvZGluZz11dGYtOCciCisKKyM6IG9wdGlvbi5jOjY2MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAiRTU5MzogRXMgbmVjZXNzaXRlbiBjb20gYSBt7W5pbSAlZCBs7W5pZXMiCisKKyM6IG9wdGlvbi5jOjY2MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5NDogTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICJFNTk0OiBFcyBuZWNlc3NpdGVuIGNvbSBhIG3tbmltICVkIGNvbHVtbmVzIgorCisjOiBvcHRpb24uYzo2OTIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogTCdvcGNp8yDpcyBkZXNjb25lZ3VkYTogJXMiCisKKyM6IG9wdGlvbi5jOjcwMjkKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiXG4tLS0gQ29kaXMgZGUgdGVybWluYWwgLS0tIgorCisjOiBvcHRpb24uYzo3MDMxCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIlxuLS0tIFZhbG9ycyBkZSBsZXMgb3BjaW9ucyBnbG9iYWxzIC0tLSIKKworIzogb3B0aW9uLmM6NzAzMworbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIlxuLS0tIFZhbG9ycyBkZSBsZXMgb3BjaW9ucyBsb2NhbHMgLS0tIgorCisjOiBvcHRpb24uYzo3MDM1Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiXG4tLS0gT3BjaW9ucyAtLS0iCisKKyM6IG9wdGlvbi5jOjc3MzYKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogRXJyb3IgZW4gZ2V0X3ZhcnAoKSIKKworIzogb3B0aW9uLmM6ODcwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiBObyBzJ2hhIHRyb2JhdCBlbCBjYXLgY3RlciBjb3JyZXNwb25lbnQgYSAlcyIKKworIzogb3B0aW9uLmM6ODc0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiBTb2JyZW4gY2Fy4GN0ZXJzIGRlc3By6XMgZGVsIHB1bnQgaSBjb21hOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIm5vIHMnaGEgcG9ndXQgb2JyaXIgIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogTm8gcydoYSBwb2d1dCBvYnJpciBsYSBmaW5lc3RyYSFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJFcyByZXF1ZXJlaXggQW1pZ2Fkb3MgdmVyc2nzIDIuMDQgbyBwb3N0ZXJpb3JcbiIKKworIzogb3NfYW1pZ2EuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJFcyByZXF1ZXJlaXggJXMgdmVyc2nzICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQwNworbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnJpciBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDE4Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgY3JlYXIgIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSBoYSBmaW5hbGl0emF0IGFtYiAlZFxuIgorCisjOiBvc19hbWlnYS5jOjkyOAorbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgIm5vIHMnaGEgcG9ndXQgY2FudmlhciBlbCBtb2RlIGRlIGNvbnNvbGEgPyFcbiIKKworIzogb3NfYW1pZ2EuYzo5OTQKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiBubyDpcyB1bmEgY29uc29sYT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNDMKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogTm8gcydoYSBwb2d1dCBleGVjdXRhciBsJ2ludOhycHJldCBkJ29yZHJlcyBhbWIgbCdvcGNp8yAtZiIKKworIzogb3NfYW1pZ2EuYzoxMTg0IG9zX2FtaWdhLmM6MTI3NAorbXNnaWQgIkNhbm5vdCBleGVjdXRlICIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBleGVjdXRhciAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NyBvc19hbWlnYS5jOjEyODQKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgImwnaW506HJwcmV0IGQnb3JkcmVzICIKKworIzogb3NfYW1pZ2EuYzoxMjA3IG9zX2FtaWdhLmM6MTMwOQorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgaGEgcmV0b3JuYXRcbiIKKworIzogb3NfYW1pZ2EuYzoxNDUwCittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgInVuIHZhbG9yIEFOQ0hPUl9CVUZfU0laRSBtYXNzYSBwZXRpdC4iCisKKyM6IG9zX2FtaWdhLmM6MTQ1NAorbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAiRVJST1IgZCdFL1MiCisKKyM6IG9zX21zd2luLmM6NTE3Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLih0cnVuY2F0KSIKKworIzogb3NfbXN3aW4uYzo2MTkKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiTCdvcGNp8yAnY29sdW1ucycgbm8g6XMgODAsIG5vIGVzIHBvZGVuIGV4ZWN1dGFyIG9yZHJlcyBleHRlcm5lcyIKKworIzogb3NfbXN3aW4uYzoxODU0Cittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBMYSBzZWxlY2Np8yBkJ2ltcHJlc3NvcmEgaGEgZmFsbGF0IgorCisjIGEgSU1QUkVTU09SQSBhIFBPUlQgPworIzogb3NfbXN3aW4uYzoxODk0CisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICJhICVzIGEgJXMiCisKKyM6IG9zX21zd2luLmM6MTkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IFRpcHVzIGRlIGxsZXRyYSBkJ2ltcHJlc3Np8yBkZXNjb25lZ3V0OiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTU5IG9zX21zd2luLmM6MTk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM4OiBQcmludCBlcnJvcjogJXMiCittc2dzdHIgIkUyMzg6IEVycm9yIGQnaW1wcmVzc2nzOiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTcwCittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiRGVzY29uZWd1dCIKKworIzogb3NfbXN3aW4uYzoxOTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nICclcyciCittc2dzdHIgIlMnZXN04CBpbXByaW1pbnQgJyVzJyIKKworIzogb3NfbXN3aW4uYzozMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBDb25qdW50IGRlIGNhcuBjdGVycyBcIiVzXCIgaWy3bGVnYWwgZW4gZWwgdGlwdXMgXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjMwOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogQ2Fy4GN0ZXIgJyVjJyBpbLdsZWdhbCBlbiBlbCB0aXB1cyBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyNTgKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiBMJ29wY2nzICdvc2ZpbGV0eXBlJyBubyDpcyB24GxpZGEgLSBzJ3VzYSBUZXh0IgorCisjOiBvc191bml4LmM6ODg3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogUydoYSByZWJ1dCB1biBkb2JsZSBzZW55YWwsIHNvcnRpbnRcbiIKKworIzogb3NfdW5peC5jOjg5MworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogUydoYSByZWJ1dCB1biBzZW55YWwgbGV0YWwgJXNcbiIKKworIzogb3NfdW5peC5jOjg5NgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiBTJ2hhIHJlYnV0IHVuIHNlbnlhbCBsZXRhbFxuIgorCisjIGRpc3BsYXkKKyM6IG9zX3VuaXguYzoxMTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJTJ2hhIHRyaWdhdCAlbGQgbXNlZyBlbiBvYnJpciBlbCBkaXNwbGF5IFgiCisKKyM6IG9zX3VuaXguYzoxMTg2Cittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiXG5WaW06IEVycm9yIGRlIFhcbiIKKworIyBkaXNwbGF5CisjOiBvc191bml4LmM6MTI5NAorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIkhhIGZhbGxhdCBsYSBjb21wcm92YWNp8yBkZWwgZGlzcGxheSBYIgorCisjIGRpc3BsYXkKKyM6IG9zX3VuaXguYzoxNDMzCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAiUydoYSBlc2dvdGF0IGVsIHRlbXBzIG1lbnRyZSBlcyB0cmFjdGF2YSBkJ29icmlyIGVsIGRpc3BsYXkgWCIKKworIzogb3NfdW5peC5jOjMxNzMgb3NfdW5peC5jOjM4NTMKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICJcbk5vIHMnaGEgcG9ndXQgZXhlY3V0YXIgbGEgc2hlbGwgIgorCisjOiBvc191bml4LmM6MzIyMQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICJcbk5vIHMnaGEgcG9ndXQgZXhlY3V0YXIgbGEgc2hlbGwgc2hcbiIKKworIzogb3NfdW5peC5jOjMyMjUgb3NfdW5peC5jOjM4NTkKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICJcbmxhIHNoZWxsIGhhIHJldG9ybmF0ICIKKworIzogb3NfdW5peC5jOjMzNjAKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICJcbk5vIHMnaGFuIHBvZ3V0IGNyZWFyIGNhbm9uYWRlc1xuIgorCisjOiBvc191bml4LmM6MzM3NQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICJcbk5vIHMnaGEgcG9ndXQgYmlmdXJjYXJcbiIKKworIzogb3NfdW5peC5jOjM4NjYKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIlxuTCdvcmRyZSBoYSBmaW5hbGl0emF0XG4iCisKKyM6IG9zX3VuaXguYzo0MTE5IG9zX3VuaXguYzo0MjQ0IG9zX3VuaXguYzo1OTAyCittc2dpZCAiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QOiBzJ2hhIHBlcmR1dCBsYSBjb25uZXhp8yBJQ0UiCisKKyMgZGlzcGxheQorIzogb3NfdW5peC5jOjU0ODYKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJIYSBmYWxsYXQgbCdvYmVydHVyYSBkZWwgZGlzcGxheSBYIgorCisjOiBvc191bml4LmM6NTgwOAorbXNnaWQgIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IgorbXNnc3RyICJYU01QOiBzJ2VzdOAgZHVlbnQgYSB0ZXJtZSBsYSBwZXRpY2nzIHNhdmUteW91cnNlbGYiCisKKyM6IG9zX3VuaXguYzo1OTI1Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVA6IG9icmludCBsYSBjb25uZXhp8yIKKworIzogb3NfdW5peC5jOjU5NDMKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiWFNNUDogSGEgZmFsbGF0IGwnaW5zcGVjY2nzIGRlIGxhIGNvbm5leGnzIElDRSIKKworIzogb3NfdW5peC5jOjU5NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICJYU01QOiBIYSBmYWxsYXQgbGEgcnV0aW5hIFNtY09wZW5Db25uZWN0aW9uOiAlcyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiQSBsYSBs7W5pYSIKKworIzogb3NfdzMyZXhlLmM6NjUKK21zZ2lkICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIGxpbmUuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGFzc2lnbmFyIG1lbfJyaWEgcGVyIGxhIGztbmlhIGQnb3JkcmVzLiIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJFcnJvciBkZWwgVklNIgorCisjOiBvc193MzJleGUuYzo4OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgY2FycmVnYXIgdmltMzIuZGxsISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJObyBzJ2hhbiBwb2d1dCByZWFzc2lnbmFyIGVscyBwdW50ZXJzIGRlIGZ1bmNpb25zIGEgbGEgRExMISIKKworIzogb3Nfd2luMTYuYzozNDEgb3Nfd2luMzIuYzozMDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJsYSBzaGVsbCBoYSByZXRvcm5hdCAlZCIKKworIzogb3Nfd2luMzIuYzoyNTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogUydoYSByZWJ1dCB1biBldmVudCAlc1xuIgorCisjOiBvc193aW4zMi5jOjI1MDkKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAiZGUgZmluYWxpdHphY2nzIgorCisjOiBvc193aW4zMi5jOjI1MTEKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgImRlIGZpbmFsIGRlIHNlc3Np8yIKKworIzogb3Nfd2luMzIuYzoyNTEyCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgImQnYXBhZ2FtZW50IGRlbCBzaXN0ZW1hIgorCisjOiBvc193aW4zMi5jOjMwMDIKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogTm8gcydoYSB0cm9iYXQgbCdvcmRyZSIKKworIzogb3Nfd2luMzIuYzozMDE1Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiRWwgcHJvZ3JhbWEgVklNUlVOLkVYRSBubyBlcyB0cm9iYSBlbiBlbCAkUEFUSC5cbiIKKyJMZXMgb3JkcmVzIGV4dGVybmVzIG5vIGZhcmFuIHVuYSBwYXVzYSB1biBjb3AgZmluYWxpdHphZGVzLlxuIgorIlZlZ2V1ICA6aGVscCB3aW4zMi12aW1ydW4gIHBlciBhIG3pcyBpbmZvcm1hY2nzLiIKKworIzogb3Nfd2luMzIuYzozMDE4Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSBBdGVuY2nzIgorCisjOiBxdWlja2ZpeC5jOjI1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IFNvYnJlbiAlJSVjIGEgbGEgY2FkZW5hIGRlIGZvcm1hdCIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6ICUlJWMgaW5lc3BlcmF0IGEgbGEgY2FkZW5hIGRlIGZvcm1hdCIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM2NDogRmFsdGEgdW4gXSBhIGxhIGNhZGVuYSBkZSBmb3JtYXQiCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogJSUlYyBubyBzdXBvcnRhdCBhIGxhIGNhZGVuYSBkZSBmb3JtYXQiCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogJSUlYyBubyB24GxpZCBlbiBlbCBwcmVmaXggZGUgbGEgY2FkZW5hIGRlIGZvcm1hdCIKKworIzogcXVpY2tmaXguYzozNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6ICUlJWMgbm8gduBsaWQgYSBsYSBjYWRlbmEgZGUgZm9ybWF0IgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogTCdvcGNp8yAnZXJyb3Jmb3JtYXQnIG5vIGNvbnTpIGNhcCBwYXRy8yIKKworIzogcXVpY2tmaXguYzo0OTcKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBGYWx0YSB1biBub20gZGUgZGlyZWN0b3JpIgorCisjOiBxdWlja2ZpeC5jOjk4NAorbXNnaWQgIkU1NTM6IE5vIG1vcmUgaXRlbXMiCittc2dzdHIgIkU1NTM6IE5vIGhpIGhhIG3pcyDtdGVtcyIKKworIzogcXVpY2tmaXguYzoxMjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCBkZSAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIyMworbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiIChs7W5pYSBlbGltaW5hZGEpIgorCisjOiBxdWlja2ZpeC5jOjE0MzIKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IEJhaXggZGUgbGEgcGlsYSBxdWlja2ZpeCIKKworIzogcXVpY2tmaXguYzoxNDQxCittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBEYWx0IGRlIGxhIHBpbGEgcXVpY2tmaXgiCisKKyM6IHF1aWNrZml4LmM6MTQ1MworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgImxsaXN0YSBkJ2Vycm9ycyAlZCBkZSAlZDsgJWQgZXJyb3JzIgorCisjOiBxdWlja2ZpeC5jOjE5MjcKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiBObyBzJ2hhIHBvZ3V0IGVzY3JpdXJlLCBsJ29wY2nzICdidWZ0eXBlJyBubyBlc3TgIGRlZmluaWRhIgorCisjOiByZWdleHAuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2OTogaW52YWxpZCBpdGVtIGluICVzJSVbXSIKK21zZ3N0ciAiRTM2OTogzXRlbSBubyB24GxpZCBhICVzJSVbXSIKKworIzogcmVnZXhwLmM6ODI3Cittc2dpZCAiRTMzOTogUGF0dGVybiB0b28gbG9uZyIKK21zZ3N0ciAiRTMzOTogRWwgcGF0cvMg6XMgbWFzc2EgbGxhcmciCisKKyM6IHJlZ2V4cC5jOjk5NgorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiBTb2JyZW4gXFx6KCIKKworIzogcmVnZXhwLmM6MTAwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiBTb2JyZW4gJXMoIgorCisjOiByZWdleHAuYzoxMDY0Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiBcXHooIGRlc2VxdWlsaWJyYXQiCisKKyM6IHJlZ2V4cC5jOjEwNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1MzogJXMlJSggZGVzZXF1aWxpYnJhdCIKKworIzogcmVnZXhwLmM6MTA3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTQ6IFVubWF0Y2hlZCAlcygiCittc2dzdHIgIkU1NDogJXMoIGRlc2VxdWlsaWJyYXQiCisKKyM6IHJlZ2V4cC5jOjEwNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6ICVzKSBkZXNlcXVpbGlicmF0IgorCisjOiByZWdleHAuYzoxMjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NjogTCdvcGVyYW5kICVzKiBwb2RyaWEgZXN0YXIgYnVpdCIKKworIzogcmVnZXhwLmM6MTI0NworIywgYy1mb3JtYXQKK21zZ2lkICJFNTc6ICVzKyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTc6IEwnb3BlcmFuZCAlcysgcG9kcmlhIGVzdGFyIGJ1aXQiCisKKyM6IHJlZ2V4cC5jOjEzMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTogSGkgaGEgdW4gY2Fy4GN0ZXIgbm8gduBsaWQgZGVzcHLpcyBkZSAlc0AiCisKKyM6IHJlZ2V4cC5jOjEzMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU4OiBMJ29wZXJhbmQgJXN7IHBvZHJpYSBlc3RhciBidWl0IgorCisjOiByZWdleHAuYzoxMzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiBMYSBjb25zdHJ1Y2Np8yAlc3suLi59IOlzIG1hc3NhIGNvbXBsZXhhIgorCisjOiByZWdleHAuYzoxMzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiAlcyogaW1icmljYXRzIgorCisjOiByZWdleHAuYzoxMzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogJXMlYyBpbWJyaWNhdHMiCisKKyM6IHJlZ2V4cC5jOjE0NzMKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiDacyBubyB24GxpZCBkZSBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTQ2OiBObyBoYSBoYSByZXMgYWJhbnMgZGUgJXMlYyIKKworIzogcmVnZXhwLmM6MTU3NAorbXNnaWQgIkU2NTogSWxsZWdhbCBiYWNrIHJlZmVyZW5jZSIKK21zZ3N0ciAiRTY1OiBSZWZlcuhuY2lhIGlst2xlZ2FsIGEgbCdlbGVtZW50IGFudGVyaW9yIgorCisjOiByZWdleHAuYzoxNTg3Cittc2dpZCAiRTY2OiBcXHooIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NjogXFx6KCBubyBlc3TgIHBlcm3ocyBhcXXtIgorCisjOiByZWdleHAuYzoxNjA2Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgZXQgYWwuIG5vIGVzdGFuIHBlcm1lc29zIGFxde0iCisKKyM6IHJlZ2V4cC5jOjE2MTcKK21zZ2lkICJFNjg6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxceiIKK21zZ3N0ciAiRTY4OiBIaSBoYSB1biBjYXLgY3RlciBubyB24GxpZCBkZXNwculzIGRlIFxceiIKKworIzogcmVnZXhwLmM6MTY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiBGYWx0YSB1biBdIGRlc3By6XMgZGUgJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE2ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogRWxlbWVudCAlcyUlW10gYnVpdCIKKworIzogcmVnZXhwLmM6MTc0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNzE6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyICVzJSUiCittc2dzdHIgIkU3MTogSGkgaGEgdW4gY2Fy4GN0ZXIgaW524GxpZCBkZXNwculzIGRlICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6IEVycm9yIGRlIHNpbnRheGkgYSAlc3suLi59IgorCisjOiByZWdleHAuYzoyODAwCittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IFByb2dyYW1hIGluZXN0YWJsZTsgZXhwcmVzc2nzIHJlZ3VsYXIgbWFzc2EgY29tcGxleGE/IgorCisjOiByZWdleHAuYzoyOTQxCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiBFbCBwYXRy8yBoYSBwcm92b2NhdCB1biBlcnJvciBkZSBkZXNib3JkYW1lbnQgZGUgcGlsYSIKKworIzogcmVnZXhwLmM6MzE4MAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlN1YmNvaW5jaWTobmNpZXMgZXh0ZXJuZXM6XG4iCisKKyM6IHNjcmVlbi5jOjIxMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkIGztbmllcyBwbGVnYWRlcyAiCisKKyM6IHNjcmVlbi5jOjc4OTIKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBTVUJTVElUVUlSViIKKworIzogc2NyZWVuLmM6Nzg5NgorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgU1VCU1RJVFVJUiIKKworIyBFbiBlbCBtb2RlIGQnZXNjcmlwdHVyYSBkZSBkcmV0YSBhIGVzcXVlcnJhCisjIHN1cnQgZWwgbWlzc2F0Z2Ugq1JFVkVSU0UgSU5TRVJUuworIzogc2NyZWVuLmM6NzkwMQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgSU5WRVJTIgorCisjOiBzY3JlZW4uYzo3OTAzCittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiIElOU0VSSVIiCisKKyM6IHNjcmVlbi5jOjc5MDYKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAoaW5zZXJpcikiCisKKyM6IHNjcmVlbi5jOjc5MDgKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKHN1YnN0aXR1aXIpIgorCisjOiBzY3JlZW4uYzo3OTEwCittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAoc3Vic3RpdHVpcnYpIgorCisjOiBzY3JlZW4uYzo3OTEzCittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIEhlYnJldSIKKworIzogc2NyZWVuLmM6NzkyNAorbXNnaWQgIiBBcmFiaWMiCittc2dzdHIgIiDAcmFiIgorCisjOiBzY3JlZW4uYzo3OTI3Cittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiIChsYW5nKSIKKworIzogc2NyZWVuLmM6NzkzMQorbXNnaWQgIiAocGFzdGUpIgorbXNnc3RyICIgKGVuZ2FueGFyKSIKKworIzogc2NyZWVuLmM6NzkzNworbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBTRUxFQ0NJT05BUiIKKworIzogc2NyZWVuLmM6NzkzOQorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBWSVNVQUwiCisKKyM6IHNjcmVlbi5jOjc5NDEKK21zZ2lkICIgQkxPQ0siCittc2dzdHIgIiBCTE9DIgorCisjOiBzY3JlZW4uYzo3OTQzCittc2dpZCAiIExJTkUiCittc2dzdHIgIiBMzU5JQSIKKworIzogc2NyZWVuLmM6Nzk1NiBzY3JlZW4uYzo4MDE2Cittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICJlbnJlZ2lzdHJhbnQiCisKKyM6IHNlYXJjaC5jOjM2Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJsYSBjZXJjYSBoYSBhcnJpYmF0IGEgREFMVCwgZXMgY29udGludWEgYSBCQUlYIgorCisjOiBzZWFyY2guYzozNworbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAibGEgY2VyY2EgaGEgYXJyaWJhdCBhIEJBSVgsIGVzIGNvbnRpbnVhIGEgREFMVCIKKworIzogc2VhcmNoLmM6NTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IENhZGVuYSBkZSBjZXJjYSBubyB24GxpZGE6ICVzIgorCisjOiBzZWFyY2guYzo4NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBsYSBjZXJjYSBoYSBhcnJpYmF0IGEgREFMVCBzZW5zZSByZXN1bHRhdHMgcGVyOiAlcyIKKworIzogc2VhcmNoLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTogbGEgY2VyY2EgaGEgYXJyaWJhdCBhIEJBSVggc2Vuc2UgcmVzdWx0YXRzIHBlcjogJXMiCisKKyM6IHNlYXJjaC5jOjEyNDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IFMnZXNwZXJhdmEgJz8nIG8gJy8nIGRlc3By6XMgZGUgJzsnIgorCisjOiBzZWFyY2guYzozNjg1Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAoaW5jbG91IHJlc3VsdGF0cyBsbGlzdGF0cyBhbnRlcmlvcm1lbnQpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3MDUKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gRml0eGVycyBpbmNsb3NvcyAiCisKKyM6IHNlYXJjaC5jOjM3MDcKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICJubyBzJ2hhIHRyb2JhdCIKKworIzogc2VhcmNoLmM6MzcwOAorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgImVuIGVsIHBhdGggLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM3NDcKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKEphIHMnaGF2aWEgbGxpc3RhdCkiCisKKyM6IHNlYXJjaC5jOjM3NDkKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICBOTyBUUk9CQVQiCisKKyM6IHNlYXJjaC5jOjM4MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIkV4YW1pbmFudCBlbCBmaXR4ZXIgaW5jbPJzOiAlcyIKKworIzogc2VhcmNoLmM6NDAxOQorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogRWwgcmVzdWx0YXQgZXMgdHJvYmEgYSBsYSBs7W5pYSBhY3R1YWwiCisKKyM6IHNlYXJjaC5jOjQxNjIKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiUydoYW4gdHJvYmF0IHRvdHMgZWxzIGZpdHhlcnMgaW5jbG9zb3MiCisKKyM6IHNlYXJjaC5jOjQxNjQKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiTm8gaGkgaGFuIGZpdHhlcnMgaW5jbG9zb3MiCisKKyM6IHNlYXJjaC5jOjQxODAKK21zZ2lkICJFMzg4OiBDb3VsZG4ndCBmaW5kIGRlZmluaXRpb24iCittc2dzdHIgIkUzODg6IE5vIHMnaGEgdHJvYmF0IGxhIGRlZmluaWNp8yIKKworIzogc2VhcmNoLmM6NDE4MgorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTm8gcydoYSB0cm9iYXQgZWwgcGF0cvMiCisKKyM6IHN5bnRheC5jOjMwMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IEwnYXJndW1lbnQg6XMgaWy3bGVnYWw6ICVzIgorCisjOiBzeW50YXguYzozMTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiBObyBleGlzdGVpeCB0YWwgZ3J1cCBkZSBzaW50YXhpOiAlcyIKKworIzogc3ludGF4LmM6MzM1OQorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiTm8gaGkgaGEg7XRlbXMgZGUgc2ludGF4aSBkZWZpbml0cyBlbiBhcXVlc3QgYnVmZmVyIgorCisjOiBzeW50YXguYzozMzY3Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzJ2VzdOAgc2luY3Jvbml0emFudCBhIHBhcnRpciBkZSBjb21lbnRhcmlzIGVzdGlsIEMiCisKKyM6IHN5bnRheC5jOjMzNzUKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICJubyBlcyBzaW5jcm9uaXR6YSIKKworIyB2YSBqdW50YSBhbWIgbGEgc2Vn/GVudAorIzogc3ludGF4LmM6MzM3OAorbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAiY29tZW7nYSBsYSBzaW5jcm9uaXR6YWNp8yIKKworIyB2YSBqdW50YSBhbWIgbCdhbnRlcmlvcgorIzogc3ludGF4LmM6MzM4MCBzeW50YXguYzozNDU1Cittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiIGztbmllcyBhYmFucyBkZSBsYSBs7W5pYSBzdXBlcmlvciIKKworIzogc3ludGF4LmM6MzM4NQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICJcbi0tLSDNdGVtcyBkZSBzaW5jcm9uaXR6YWNp8yBkZSBzaW50YXhpIC0tLSIKKworIzogc3ludGF4LmM6MzM5MAorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICJcbnMnZXN04CBzaW5jcm9uaXR6YW50IGEgcGFydGlyIGQn7XRlbXMiCisKKyM6IHN5bnRheC5jOjMzOTYKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIlxuLS0tIM10ZW1zIGRlIHNpbnRheGkgLS0tIgorCisjOiBzeW50YXguYzozNDE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiBObyBleGlzdGVpeCB0YWwgZ3J1cCBkZSBzaW50YXhpOiAlcyIKKworIzogc3ludGF4LmM6MzQ0NQorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICJt7W5pbSAiCisKKyM6IHN5bnRheC5jOjM0NTIKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibeB4aW0gIgorCisjOiBzeW50YXguYzozNDY0Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgY29pbmNpZOhuY2lhICIKKworIzogc3ludGF4LmM6MzQ2NgorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIHNhbHRzIGRlIGztbmlhIgorCisjOiBzeW50YXguYzo0MTAwCittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiBMJ29wY2nzIGdyb3VwW3RdaGVyZSBubyBzJ2FjY2VwdGEgYXF17SIKKworIzogc3ludGF4LmM6NDEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IE5vIHMnaGEgdHJvYmF0IGNhcCByZWdp8yBkJ+10ZW1zIHBlciAlcyIKKworIzogc3ludGF4LmM6NDE1MgorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBDb2506SB1biBhcmd1bWVudCBxdWUgbm8gcydhY2NlcHRhIGFxde0iCisKKyM6IHN5bnRheC5jOjQxNjMKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogTCdhcmd1bWVudCAnY29udGFpbmVkaW4nIG5vIHMnYWNjZXB0YSBhcXXtIgorCisjOiBzeW50YXguYzo0MjQxCittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6IEVzIHJlcXVlcmVpeCB1biBub20gZGUgZml0eGVyIgorCisjOiBzeW50YXguYzo0NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTg6IE1pc3NpbmcgJz0nOiAlcyIKK21zZ3N0ciAiRTM5ODogRmFsdGEgdW4gJz0nOiAlcyIKKworIyAnc3ludGF4IHJlZ2lvbicg6XMgdW5hIG9yZHJlCisjOiBzeW50YXguYzo0NzM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBGYWx0ZW4gYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorCisjOiBzeW50YXguYzo1MDY4Cittc2dpZCAiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiCittc2dzdHIgIkU0MDA6IE5vIGhldSBlc3BlY2lmaWNhdCBjYXAgZ3J1cCIKKworIzogc3ludGF4LmM6NTEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiBObyBzJ2hhIHRyb2JhdCBlbCBwYXRy8yBkZSBkZWxpbWl0YWNp8zogJXMiCisKKyM6IHN5bnRheC5jOjUxODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogSGkgaGEgcG9ycXVlcmlhIGRlc3By6XMgZGVsIHBhdHLzOiAlcyIKKworIzogc3ludGF4LmM6NTI3MAorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bnRheCBzeW5jOiBlbCBwYXRy8yBkZSBjb250aW51YWNp8yBkZSBs7W5pYSBlc3TgIHJlcGV0aXQiCisKKyM6IHN5bnRheC5jOjUzMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBBcmd1bWVudHMgaWy3bGVnYWxzOiAlcyIKKworIzogc3ludGF4LmM6NTM3NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA1OiBNaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDA1OiBGYWx0YSB1biBzaWduZSBkJ2lndWFsOiAlcyIKKworIzogc3ludGF4LmM6NTM4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IEFyZ3VtZW50IGJ1aXQ6ICVzIgorCisjOiBzeW50YXguYzo1NDEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDI6ICVzIG5vIGVzdOAgcGVybehzIGFxde0iCisKKyM6IHN5bnRheC5jOjU0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyBoYSBkJ2FuYXIgYWwgcHJpbmNpcGkgZGUgbGEgbGxpc3RhICdjb250YWlucyciCisKKyM6IHN5bnRheC5jOjU0ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogRWwgbm9tIGRlbCBncnVwIOlzIGRlc2NvbmVndXQ6ICVzIgorCisjOiBzeW50YXguYzo1NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogU3ViLW9yZHJlIGRlIHNpbnRheGkgbm8gduBsaWRhOiAlcyIKKworIzogc3ludGF4LmM6NjA5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogTm8gcydoYSB0cm9iYXQgZWwgZ3J1cCBkZSByZXNzYWx0OiAlcyIKKworIzogc3ludGF4LmM6NjEyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogRmFsdGVuIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IFNvYnJlbiBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxNTAKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IEVsIGdydXAgamEgaGEgZXN0YXQgZGVmaW5pdCwgcydpZ25vcmEgbCdlbmxsYecgZGUgcmVzc2FsdCIKKworIzogc3ludGF4LmM6NjI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiBTaWduZSBkJ2lndWFsIGluZXNwZXJhdDogJXMiCisKKyM6IHN5bnRheC5jOjYzMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogRmFsdGEgdW4gc2lnbmUgZCdpZ3VhbDogJXMiCisKKyM6IHN5bnRheC5jOjYzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IEZhbHRhIHVuIGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NjM3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogRWwgdmFsb3Ig6XMgaWy3bGVnYWw6ICVzIgorCisjOiBzeW50YXguYzo2NDkzCittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogQ29sb3IgZGUgcHJpbWVyIHRlcm1lIGRlc2NvbmVndXQiCisKKyM6IHN5bnRheC5jOjY1MDQKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiBDb2xvciBkZSBmb25zIGRlc2NvbmVndXQiCisKKyM6IHN5bnRheC5jOjY1NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiBOb20gbyBu+m1lcm8gZGUgY29sb3Igbm8gaWRlbnRpZmljYXQ6ICVzIgorCisjOiBzeW50YXguYzo2NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiBFbCBjb2RpIGRlIHRlcm1pbmFsIOlzIG1hc3NhIGxsYXJnOiAlcyIKKworIzogc3ludGF4LmM6NjgxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogTCdhcmd1bWVudCDpcyBpbLdsZWdhbDogJXMiCisKKyM6IHN5bnRheC5jOjczNDcKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBIaSBoYSBtYXNzYSBhdHJpYnV0cyBkZSByZXNzYWx0IGRpZmVyZW50cyBlbiD6cyIKKworIzogdGFnLmM6OTAKK21zZ2lkICJFNTU1OiBhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU1OiBCYWl4IGRlIGxhIHBpbGEgZCdldGlxdWV0ZXMiCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogRGFsdCBkZSBsYSBwaWxhIGQnZXRpcXVldGVzIgorCisjOiB0YWcuYzozOTYKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogTm8gZXMgcG90IGFuYXIgYWJhbnMgZGUgbGEgcHJpbWVyYSBldGlxdWV0YSBjb2luY2lkZW50IgorCisjOiB0YWcuYzo1MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IE5vIHMnaGEgdHJvYmF0IGwnZXRpcXVldGE6ICVzIgorCisjOiB0YWcuYzo1NDkKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMgcHJpIHRpcCAgZXRpcXVldGEiCisKKyM6IHRhZy5jOjU1MgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAiZml0eGVyXG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3MTAKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIkVudHJldSB1biBu+m1lcm8gKDxFbnRyYXI+IHBlciBhdm9ydGFyKTogIgorCisjOiB0YWcuYzo3NTAKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IE5vbelzIGhpIGhhIHVuYSBzb2xhIGV0aXF1ZXRhIHF1ZSBjb2luY2lkZWl4aSIKKworIzogdGFnLmM6NzUyCittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogTm8gZXMgcG90IGFuYXIgbelzIGVubGzgIGRlIGwn+mx0aW1hIGV0aXF1ZXRhIGNvaW5jaWRlbnQiCisKKyM6IHRhZy5jOjc3MgorIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRWwgZml0eGVyIFwiJXNcIiBubyBleGlzdGVpeCIKKworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6Nzg1CisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICJldGlxdWV0YSAlZCBkZSAlZCVzIgorCisjOiB0YWcuYzo3ODgKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIG8gbelzIgorCisjOiB0YWcuYzo3OTAKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICBObyBlcyBmYSBkaXN0aW5jafMgZW50cmUgbWFq+nNjdWxlcyBpIG1pbvpzY3VsZXMhIgorCisjOiB0YWcuYzo4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IEVsIGZpdHhlciBcIiVzXCIgbm8gZXhpc3RlaXgiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6OTAzCittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiXG4gICMgIEEgZXRpcSAgICAgREVTIERFIGztbmlhICBlbiBmaXR4ZXIvdGV4dCIKKworIzogdGFnLmM6MTIwNAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJDZXJjYW50IGVuIGVsIGZpdHhlciBkJ2V0aXF1ZXRlcyAlcyIKKworIzogdGFnLmM6MTM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogUydoYSB0cnVuY2F0IGwndWJpY2FjafMgZGVsIGZpdHhlciBkJ2V0aXF1ZXRlcyBwZXIgJXNcbiIKKworIzogdGFnLmM6MTkxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogRXJyb3IgZGUgZm9ybWF0IGVuIGVsIGZpdHhlciBkJ2V0aXF1ZXRlcyBcIiVzXCIiCisKKyM6IHRhZy5jOjE5MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICJBYmFucyBkZSBsJ29jdGV0ICVsZCIKKworIzogdGFnLmM6MTk0MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IEVsIGZpdHhlciBkJ2V0aXF1ZXRlcyBubyBlc3TgIG9yZGVuYXQ6ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MTk4MworbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogTm8gaGkgaGEgY2FwIGZpdHhlciBkJ2V0aXF1ZXRlcyIKKworIzogdGFnLmM6MjY4NAorbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IE5vIHMnaGEgdHJvYmF0IGwnZXRpcXVldGEiCisKKyM6IHRhZy5jOjI2OTUKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IE5vIHMnaGEgdHJvYmF0IGwnZXRpcXVldGEgZXhhY3RhISIKKworIyCrdGVybWluYWy7IOlzIG1hc2N1bO0KKyM6IHRlcm0uYzoxNzQ1Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIG5vIGlkZW50aWZpY2F0LiBFbHMgdGVybWluYWxzIGRpc3BvbmlibGVzIHPzbjoiCisKKyM6IHRlcm0uYzoxNzY5Cittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJwZXIgb21pc3Np8yAnIgorCisjOiB0ZXJtLmM6MjEyNworbXNnaWQgIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiRTU1NzogTm8gcydoYSBwb2d1dCBvYnJpciBlbCBmaXR4ZXIgdGVybWNhcCIKKworIzogdGVybS5jOjIxMzEKK21zZ2lkICJFNTU4OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIkU1NTg6IE5vIHMnaGEgdHJvYmF0IGwnaW5mb3JtYWNp8yBkZWwgdGVybWluYWwgYSB0ZXJtaW5mbyIKKworIzogdGVybS5jOjIxMzMKK21zZ2lkICJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTU1OTogTm8gcydoYSB0cm9iYXQgbCdpbmZvcm1hY2nzIGRlbCB0ZXJtaW5hbCBhIHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyMjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBObyBoaSBoYSBjYXAgZW50cmFkYSBcIiVzXCIgYSB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6Mjc2NgorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiBFcyByZXF1ZXJlaXggbGEgY2FwYWNpdGF0IFwiY21cIiBwZXIgcGFydCBkZWwgdGVybWluYWwiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5NzAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICJcbi0tLSBUZWNsZXMgZGVsIHRlcm1pbmFsIC0tLSIKKworIzogdWkuYzoyNTIKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJzJ2hhIGluaWNpYXQgdW5hIG5vdmEgc2hlbGxcbiIKKworIzogdWkuYzoxNzg0Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogRXJyb3IgZW4gbGxlZ2lyIGwnZW50cmFkYSwgc29ydGludC4uLlxuIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogdW5kby5jOjM5NAorbXNnaWQgIk5vIHVuZG8gcG9zc2libGU7IGNvbnRpbnVlIGFueXdheSIKK21zZ3N0ciAiTm8gZXMgcG90IGRlc2ZlciByZXM7IHZvbGV1IGNvbnRpbnVhciIKKworIzogdW5kby5jOjU0OQorbXNnaWQgIkU0Mzg6IHVfdW5kbzogbGluZSBudW1iZXJzIHdyb25nIgorbXNnc3RyICJFNDM4OiB1X3VuZG86IGVscyBub21icmVzIGRlIGztbmlhIG5vIHPzbiBjb3JyZWN0ZXMiCisKKyM6IHVuZG8uYzo3MTgKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAiMSBjYW52aSIKKworIzogdW5kby5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIGNhbnZpcyIKKworIzogdW5kby5jOjc2NAorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiBMYSBsbGlzdGEgZGUgZGVzZmVyIGVzdOAgY29ycm9tcHVkYSIKKworIzogdW5kby5jOjc5NgorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiBGYWx0YSB1bmEgbO1uaWEgZGUgZGVzZmVyIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6Njk2Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICJcblZlcnNp8yBHVUkgcGVyIE1TLVdpbmRvd3MgMTYvMzIgYml0cyIKKworIzogdmVyc2lvbi5jOjY5OAorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgR1VJIHBlciBNUy1XaW5kb3dzIDMyIGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MDEKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiBlbiBtb2RlIFdpbjMycyIKKworIzogdmVyc2lvbi5jOjcwMworbXNnaWQgIiB3aXRoIE9MRSBzdXBwb3J0IgorbXNnc3RyICIgYW1iIHN1cG9ydCBwZXIgT0xFIgorCisjOiB2ZXJzaW9uLmM6NzA2Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgY29uc29sYSBwZXIgTVMtV2luZG93cyAzMiBiaXRzIgorCisjOiB2ZXJzaW9uLmM6NzEwCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIlxuVmVyc2nzIHBlciBNUy1XaW5kb3dzIDE2IGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MTQKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICJcblZlcnNp8yBwZXIgTVMtRE9TIDMyIGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MTYKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICJcblZlcnNp8yBwZXIgTVMtRE9TIDE2IGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MjIKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgcGVyIE1hY09TIFggKFVuaXgpIgorCisjOiB2ZXJzaW9uLmM6NzI0Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgcGVyIE1hY09TIFgiCisKKyM6IHZlcnNpb24uYzo3MjcKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgcGVyIE1hY09TIgorCisjOiB2ZXJzaW9uLmM6NzMyCittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiXG5WZXJzafMgcGVyIFJJU0MgT1MiCisKKyM6IHZlcnNpb24uYzo3NDIKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICJcbk1vZGlmaWNhY2lvbnMgaW5jbG9zZXM6ICIKKworIzogdmVyc2lvbi5jOjc2OCB2ZXJzaW9uLmM6MTExNworbXNnaWQgIk1vZGlmaWVkIGJ5ICIKK21zZ3N0ciAiTW9kaWZpY2F0IHBlciAiCisKKyM6IHZlcnNpb24uYzo3NzUKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICJcbkNvbXBpbGF0ICIKKworIzogdmVyc2lvbi5jOjc3OAorbXNnaWQgImJ5ICIKK21zZ3N0ciAicGVyICIKKworIzogdmVyc2lvbi5jOjc5MAorbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICJcblZlcnNp8yBlbm9ybWUgIgorCisjOiB2ZXJzaW9uLmM6NzkzCittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiXG5WZXJzafMgZ3JhbiAiCisKKyM6IHZlcnNpb24uYzo3OTYKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICJcblZlcnNp8yBub3JtYWwgIgorCisjOiB2ZXJzaW9uLmM6Nzk5Cittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICJcblZlcnNp8yByZWR172RhICIKKworIzogdmVyc2lvbi5jOjgwMQorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICJcblZlcnNp8yBt7W5pbWEgIgorCisjOiB2ZXJzaW9uLmM6ODA3Cittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJzZW5zZSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODEyCittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgImFtYiBHVUkgR1RLMi1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4MTQKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJhbWIgR1VJIEdUSy1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAiYW1iIEdVSSBHVEsyLiIKKworIzogdmVyc2lvbi5jOjgyMAorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgImFtYiBHVUkgR1RLLiIKKworIzogdmVyc2lvbi5jOjgyNQorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgImFtYiBHVUkgWDExLU1vdGlmLiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJhbWIgR1VJIFgxMS1uZVh0YXcuIgorCisjOiB2ZXJzaW9uLmM6ODMxCittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgImFtYiBHVUkgWDExLUF0aGVuYS4iCisKKyM6IHZlcnNpb24uYzo4MzUKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAiYW1iIEdVSSBCZU9TLiIKKworIzogdmVyc2lvbi5jOjgzOAorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgImFtYiBHVUkgUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjg0MQorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAiYW1iIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NDQKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJhbWIgR1VJIENhcmJvbi4iCisKKyM6IHZlcnNpb24uYzo4NDcKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgImFtYiBHVUkgQ29jb2EuIgorCisjOiB2ZXJzaW9uLmM6ODUwCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAiYW1iIEdVSSAoY2zgc3NpYykuIgorCisjOiB2ZXJzaW9uLmM6ODYxCittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICBGdW5jaW9ucyBpbmNsb3NlcyAoKykgbyBleGNsb3NlcyAoLSk6XG4iCisKKyMgMjkgY2Fy4GN0ZXJzIGZpbnMgZWwgIjoiIChpbmNs8nMpCisjOiB2ZXJzaW9uLmM6ODczCittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgZml0eGVyIHZpbXJjIGRlbCBzaXN0ZW1hOiBcIiIKKworIyAyOSBjYXLgY3RlcnMgZmlucyBlbCAiOiIgKGluY2zycykKKyM6IHZlcnNpb24uYzo4NzgKK21zZ2lkICIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICBmaXR4ZXIgdmltcmMgZGUgbCd1c3Vhcmk6IFwiIgorCisjIDI5IGNhcuBjdGVycyBmaW5zIGVsICI6IiAoaW5jbPJzKQorIzogdmVyc2lvbi5jOjg4MworbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDJuIGZpdHhlciB2aW1yYyBkZSBsJ3VzdWFyaTogXCIiCisKKyMgMjkgY2Fy4GN0ZXJzIGZpbnMgZWwgIjoiIChpbmNs8nMpCisjOiB2ZXJzaW9uLmM6ODg4Cittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgM3IgZml0eGVyIHZpbXJjIGRlIGwndXN1YXJpOiBcIiIKKworIyAyOSBjYXLgY3RlcnMgZmlucyBlbCAiOiIgKGluY2zycykKKyM6IHZlcnNpb24uYzo4OTMKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgZml0eGVyIGV4cmMgZGUgbCd1c3Vhcmk6IFwiIgorCisjIDI5IGNhcuBjdGVycyBmaW5zIGVsICI6IiAoaW5jbPJzKQorIzogdmVyc2lvbi5jOjg5OAorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAybiBmaXR4ZXIgZXhyYyBkZSBsJ3VzdWFyaTogXCIiCisKKyMgMjkgY2Fy4GN0ZXJzIGZpbnMgZWwgIjoiIChpbmNs8nMpCisjOiB2ZXJzaW9uLmM6OTA0Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBmaXR4ZXIgZ3ZpbXJjIGRlbCBzaXN0ZW1hOiBcIiIKKworIyAyOSBjYXLgY3RlcnMgZmlucyBlbCAiOiIgKGluY2zycykKKyM6IHZlcnNpb24uYzo5MDgKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgIGZpdHhlciBndmltcmMgZGUgbCd1c3Vhcmk6IFwiIgorCisjIDI5IGNhcuBjdGVycyBmaW5zIGVsICI6IiAoaW5jbPJzKQorIzogdmVyc2lvbi5jOjkxMgorbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiMm4gZml0eGVyIGd2aW1yYyBkZSBsJ3VzdWFyaTogXCIiCisKKyMgMjkgY2Fy4GN0ZXJzIGZpbnMgZWwgIjoiIChpbmNs8nMpCisjOiB2ZXJzaW9uLmM6OTE3Cittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIzciBmaXR4ZXIgZ3ZpbXJjIGRlIGwndXN1YXJpOiBcIiIKKworIyAyOSBjYXLgY3RlcnMgZmlucyBlbCAiOiIgKGluY2zycykKKyM6IHZlcnNpb24uYzo5MjQKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgZml0eGVyIGRlIG1lbvogZGVsIHNpc3RlbWE6IFwiIgorCisjIDI5IGNhcuBjdGVycyBmaW5zIGVsICI6IiAoaW5jbPJzKQorIzogdmVyc2lvbi5jOjkzMgorbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgYWx0ZXJuYXRpdmEgcGVyIGEgJFZJTTogXCIiCisKKyMgMjkgY2Fy4GN0ZXJzIGZpbnMgZWwgIjoiIChpbmNs8nMpCisjOiB2ZXJzaW9uLmM6OTM4Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgICAgICAgYWx0IHBlciBhICRWSU1SVU5USU1FOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MgorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIkNvbXBpbGF0IGFtYjogIgorCisjOiB2ZXJzaW9uLmM6OTQ4Cittc2dpZCAiQ29tcGlsZXI6ICIKK21zZ3N0ciAiQ29tcGlsYWRvcjogIgorCisjOiB2ZXJzaW9uLmM6OTUzCittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICJFbmxsYedhdCBhbWI6ICIKKworIzogdmVyc2lvbi5jOjk1OAorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgVkVSU0nTIERFIERFUFVSQUNJ0yIKKworIzogdmVyc2lvbi5jOjk5NgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjk5OAorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJ2ZXJzafMgIgorCisjOiB2ZXJzaW9uLmM6OTk5Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJwZXIgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorCisjOiB2ZXJzaW9uLmM6MTAwMworbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSDpcyB1biBwcm9ncmFtYSBkZSBjb2RpIG9iZXJ0IGkgbGxpdXJlIGRpc3RyaWJ1Y2nzIgorCisjOiB2ZXJzaW9uLmM6MTAwNQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICJBanVkZXUgZWxzIG5lbnMgcG9icmVzIGQnVWdhbmRhISIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMDYKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJmZXUgIDpoZWxwIGljY2Y8RW50cmFyPiAgICAgICBwZXIgbelzIGluZm9ybWFjafMgICAgICIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMDgKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJmZXUgIDpxPEVudHJhcj4gICAgICAgICAgICAgICBwZXIgc29ydGlyICAgICAgICAgICAgICIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMDkKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJmZXUgIDpoZWxwPEVudHJhcj4gbyA8RjE+ICAgICBwZXIgb2J0ZW5pciBhanVkYSAgICAgICIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMTAKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICJmZXUgIDpoZWxwIHZlcnNpb242PEVudHJhcj4gICBwZXIgaW5mbyBkZSBsYSB2ZXJzafMgICIKKworIzogdmVyc2lvbi5jOjEwMTMKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiRnVuY2lvbmFudCBlbiBtb2RlIGNvbXBhdGlibGUgYW1iIFZpIgorCisjIGFtcGxhZGEgNTMgY2Fy4GN0ZXJzCisjOiB2ZXJzaW9uLmM6MTAxNAorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgImZldSAgOnNldCBub2NwPEVudHJhcj4gICAgICAgIHBlbHMgdmFsb3JzIHBlciBvbWlzc2nzIgorCisjIGFtcGxhZGEgNTMgY2Fy4GN0ZXJzCisjOiB2ZXJzaW9uLmM6MTAxNQorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgImZldSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRyYXI+IHBlciBpbmZvIHNvYnJlIGVsIHRlbWEgIgorCisjIGFtcGxhZGEgNTMgY2Fy4GN0ZXJzCisjOiB2ZXJzaW9uLmM6MTAzMAorbXNnaWQgIm1lbnUgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbvogIEFqdWRhLT5PcmZlcyAgICAgICAgICAgICAgICAgICAgIHBlciBpbmZvcm1hY2nzIgorCisjOiB2ZXJzaW9uLmM6MTAzMgorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIkZ1bmNpb25hbnQgc2Vuc2UgbW9kZXMsIGVsIHRleHQgZXNjcml0IHMnaW5zZXJlaXgiCisKKyMgQWl48iBoYSBkZSBsbGlnYXIgYW1iIGxhIHRyYWR1Y2Np8yBkZWwgbWVu+gorIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMzMKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBJbnNlcnQgTW9kZSAgIgorbXNnc3RyICJtZW76ICBFZGl0YS0+T3BjaW9ucyBnbG9iYWxzLT5Nb2RlIGQnaW5zZXJjafMgICAgICAgICIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwMzQKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyIGRvcyBtb2RlcyIKKworIyBBaXjyIGhhIGRlIGxsaWdhciBhbWIgbGEgdHJhZHVjY2nzIGRlbCBtZW76CisjIGFtcGxhZGEgNTMgY2Fy4GN0ZXJzCisjOiB2ZXJzaW9uLmM6MTAzOAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIm1lbvogIEVkaXRhLT5PcGNpb25zIGdsb2JhbHMtPkNvbXBhdGlibGUgYW1iIFZpICAgICAgIgorCisjIGFtcGxhZGEgNTMgY2Fy4GN0ZXJzCisjOiB2ZXJzaW9uLmM6MTAzOQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbHMgdmFsb3JzIHBlciBvbWlzc2nzIgorCisjOiB2ZXJzaW9uLmM6MTA4NQorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIkFURU5DSdM6IFMnaGEgZGV0ZWN0YXQgV2luZG93cyA5NS85OC9NRSIKKworIyBhbXBsYWRhIDUzIGNhcuBjdGVycworIzogdmVyc2lvbi5jOjEwODgKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJmZXUgIDpoZWxwIHdpbmRvd3M5NTxFbnRyYXI+ICBwZXIgaW5mbyBzb2JyZSBlbCB0ZW1hICIKKworIzogd2luZG93LmM6MjA0Cittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IE5vIGhpIGhhIGNhcCBmaW5lc3RyYSBkZSBwcmV2aXN1YWxpdHphY2nzIgorCisjOiB3aW5kb3cuYzo1ODIKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiBObyBlcyBwb3QgZGl2aWRpciBob3JpdHpvbnRhbCBpIHZlcnRpY2FsbWVudCBhbCBtYXRlaXggdGVtcHMiCisKKyM6IHdpbmRvdy5jOjEzNDEKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDI6IE5vIGhpIHBvdCBoYXZlciByb3RhY2nzIHF1YW4gaGkgaGEgZmluZXN0cmVzIGRpdmlkaWRlcyIKKworIzogd2luZG93LmM6MTgzNgorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogTm8gZXMgcG90IHRhbmNhciBsJ/psdGltYSBmaW5lc3RyYSIKKworIzogd2luZG93LmM6MjU2NworbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJOb23pcyBoaSBoYSB1bmEgZmluZXN0cmEiCisKKyM6IHdpbmRvdy5jOjI2MTQKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogSGkgaGFuIGFsdHJlcyBmaW5lc3RyZXMgcXVlIGNvbnRlbmVuIGNhbnZpcyIKKworIzogd2luZG93LmM6NDQ2MAorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IE5vIGhpIGhhIGNhcCBub20gZGUgZml0eGVyIHNvdGEgZWwgY3Vyc29yIgorCisjOiB3aW5kb3cuYzo0NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogTm8gcydoYSB0cm9iYXQgZWwgZml0eGVyIFwiJXNcIiBlbiBlbCBwYXRoIgorCisjOiBnbG9iYWxzLmg6MTIwOCBpZl9wZXJsLnhzOjM2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiBObyBzJ2hhIHBvZ3V0IGNhcnJlZ2FyIGxhIGJpYmxpb3RlY2EgJXMiCisKKyM6IGlmX3BlcmwueHM6NTkxCittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFBlcmwgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiQXF1ZXN0YSBvcmRyZSBubyBlc3TgIGhhYmlsaXRhZGE6IG5vIHMnaGEgcG9ndXQgY2FycmVnYXIgbGEgYmlibGlvdGVjYSBQZXJsLiIKKworIzogaWZfcGVybC54czo2MzcKKyN+IG1zZ2lkICJFMjk5OiBQZXJsIGV2YWx1YXRpb24gZm9yYmlkZGVuIGluIHNhbmRib3ggd2l0aG91dCB0aGUgU2FmZSBtb2R1bGUiCisjfiBtc2dzdHIgIiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODMKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIkVkaXRhIGVuICZt+mx0aXBsZXMgVmltcyIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODkKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIkVkaXRhIGVuIHVuIHNvbCAmVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICJNb3N0cmEgbGVzICZkaWZlcuhuY2llcyBhbWIgVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYxMQorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJFZGl0YSBhbWIgZWwgJlZpbSIKKworIy4gTm93IGNvbmNhdGVuYXRlCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYzMworbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorbXNnc3RyICJFZGl0YSBhbWIgZWwgVmltIGV4aXN0ZW50IC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiRWRpdGEgZWwocykgZml0eGVyKHMpIHNlbGVjY2lvbmF0KHMpIGFtYiBlbCBWaW0iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg1IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY2Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICJFcnJvciBlbiBjcmVhciBlbCBwcm9j6XM6IENvbXByb3ZldSBxdWUgZ3ZpbSBlcyB0cm9iaSBlbiBlbCBwYXRoISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZXJyb3IgZGUgbGEgYmlibGlvdGVjYSBndmltZXh0LmRsbCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTkKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIkxhIGxsYXJnYWRhIGRlbCBwYXRoIOlzIGV4Y2Vzc2l2YSIKKworIzogZ2xvYmFscy5oOjk5OAorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tQ2FwIGztbmlhIGVuIGVsIGJ1ZmZlci0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjExNjEKK21zZ2lkICJFNDcwOiBDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIkU0NzA6IFMnaGEgYXZvcnRhdCBsJ29yZHJlIgorCisjOiBnbG9iYWxzLmg6MTE2MgorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiBFcyByZXF1ZXJlaXggdW4gYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMTYzCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIGhhdXJpYSBkZSBjb250aW51YXIgYW1iIC8sID8gbyAmIgorCisjOiBnbG9iYWxzLmg6MTE2NQorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIkUxMTogTm8g6XMgduBsaWQgYSBsYSBs7W5pYSBkJ29yZHJlczogPEVOVFJBUj4gZXhlY3V0YSwgQ1RSTC1DIHN1cnQiCisKKyM6IGdsb2JhbHMuaDoxMTY3Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICJFMTI6IE9yZHJlIGVuIGV4cmMvdmltcmMgbm8gcGVybWVzYSBlbiBsJ2FjdHVhbCBjZXJjYSBkJ2V0aXF1ZXRlcyBvIGRpcmVjdG9yaXMiCisKKyM6IGdsb2JhbHMuaDoxMTY5Cittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IEZhbHRhIHVuYSBkZWNsYXJhY2nzIDplbmRpZiIKKworIzogZ2xvYmFscy5oOjExNzAKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IEZhbHRhIHVuYSBkZWNsYXJhY2nzIDplbmR0cnkiCisKKyM6IGdsb2JhbHMuaDoxMTcxCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IEZhbHRhIHVuYSBkZWNsYXJhY2nzIDplbmR3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNzIKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IERlY2xhcmFjafMgOmVuZHdoaWxlIHNlbnNlIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNzQKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogRWwgZml0eGVyIGV4aXN0ZWl4IChhZmVnaXUgISBwZXIgY29uZmlybWFyKSIKKworIzogZ2xvYmFscy5oOjExNzUKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjogTCdvcmRyZSBoYSBmYWxsYXQiCisKKyM6IGdsb2JhbHMuaDoxMTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IENvbmp1bnQgZGUgdGlwdXMgZGVzY29uZWd1dDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IFRpcHVzIGRlIGxsZXRyYSBkZXNjb25lZ3V0OiAlcyIKKworIzogZ2xvYmFscy5oOjExODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBFbCB0aXB1cyBkZSBsbGV0cmEgXCIlc1wiIG5vIOlzIGQnYW1wbGFkYSBmaXhhIgorCisjOiBnbG9iYWxzLmg6MTE4NgorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiBFcnJvciBpbnRlcm4iCisKKyM6IGdsb2JhbHMuaDoxMTg3Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIkludGVycm9tcHV0IgorCisjOiBnbG9iYWxzLmg6MTE4OAorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IEwnYWRyZedhIG5vIOlzIHbgbGlkYSIKKworIzogZ2xvYmFscy5oOjExODkKK21zZ2lkICJFNDc0OiBJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICJFNDc0OiBMJ2FyZ3VtZW50IG5vIOlzIHbgbGlkIgorCisjOiBnbG9iYWxzLmg6MTE5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQ3NTogTCdhcmd1bWVudCBubyDpcyB24GxpZDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiBMJ2V4cHJlc3Np8yBubyDpcyB24GxpZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTE5NAorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiBMJ2ludGVydmFsIG5vIOlzIHbgbGlkIgorCisjOiBnbG9iYWxzLmg6MTE5NQorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogTCdvcmRyZSBubyDpcyB24GxpZGEiCisKKyM6IGdsb2JhbHMuaDoxMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDpcyB1biBkaXJlY3RvcmkiCisKKyM6IGdsb2JhbHMuaDoxMjAwCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiBDYXLgY3RlcnMgaW5lc3BlcmF0cyBhYmFucyBkZSAnPSciCisKKyM6IGdsb2JhbHMuaDoxMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBMYSBjcmlkYSBhIGxhIGJpYmxpb3RlY2EgYSBmYWxsYXQgcGVyIFwiJXMoKVwiIgorCisjOiBnbG9iYWxzLmg6MTIwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiBObyBzJ2hhIHBvZ3V0IGNhcnJlZ2FyIGxhIGZ1bmNp8yAlcyIKKworIzogZ2xvYmFscy5oOjEyMTEKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTogTWFyY2EgYW1iIHVuIG76bWVybyBkZSBs7W5pYSBubyB24GxpZCIKKworIzogZ2xvYmFscy5oOjEyMTIKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBNYXJjYSBubyBlc3RhYmxlcnRhIgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBObyBlcyBwb2RlbiBmZXIgY2FudmlzLCBsJ29wY2nzICdtb2RpZmlhYmxlJyBlc3TgIGRlc2FjdGl2YWRhIgorCisjOiBnbG9iYWxzLmg6MTIxNAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogSW1icmljYWNp8yBkJ3NjcmlwdHMgbWFzc2EgcHJvZnVuZGEiCisKKyM6IGdsb2JhbHMuaDoxMjE1Cittc2dpZCAiRTIzOiBObyBhbHRlcm5hdGUgZmlsZSIKK21zZ3N0ciAiRTIzOiBObyBoaSBoYSBjYXAgZml0eGVyIGFsdGVybmF0aXUiCisKKyM6IGdsb2JhbHMuaDoxMjE2Cittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBObyBleGlzdGVpeCB0YWwgYWJyZXZpYWNp8yIKKworIzogZ2xvYmFscy5oOjEyMTcKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6ICEgbm8gcGVybehzIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogTm8gZXMgcG90IHVzYXIgbGEgR1VJOiBObyBoYSBlc3RhdCBjb21waWxhZGEiCisKKyM6IGdsb2JhbHMuaDoxMjIyCittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IE5vIGVzIHBvdCB1c2FyIGVsIG1vZGUgSGVicmV1OiBObyBoYSBlc3RhdCBjb21waWxhdFxuIgorCisjOiBnbG9iYWxzLmg6MTIyNQorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IE5vIGVzIHBvdCB1c2FyIGVsIG1vZGUgRmFyc2k6IE5vIGhhIGVzdGF0IGNvbXBpbGF0XG4iCisKKyM6IGdsb2JhbHMuaDoxMjI4Cittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogTm8gZXMgcG90IHVzYXIgZWwgbW9kZSDgcmFiOiBObyBoYSBlc3RhdCBjb21waWxhdFxuIgorCisjOiBnbG9iYWxzLmg6MTIzMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IE5vIGV4aXN0ZWl4IHRhbCBncnVwIGRlIHJlc3NhbHQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIzMworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogRW5jYXJhIG5vIHMnaGEgaW5zZXJpdCB0ZXh0IgorCisjOiBnbG9iYWxzLmg6MTIzNAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IE5vIGhpIGhhIGNhcCBvcmRyZSBhbnRlcmlvciIKKworIzogZ2xvYmFscy5oOjEyMzUKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiBObyBleGlzdGVpeCB0YWwgYXNzaWduYWNp8yIKKworIzogZ2xvYmFscy5oOjEyMzYKK21zZ2lkICJFNDc5OiBObyBtYXRjaCIKK21zZ3N0ciAiRTQ3OTogQ2FwIGNvaW5jaWTobmNpYSIKKworIzogZ2xvYmFscy5oOjEyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiBDYXAgY29pbmNpZOhuY2lhOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMzgKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiBGYWx0YSB1biBub20gZGUgZml0eGVyIgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogTm8gaGkgaGEgY2FwIGV4cHJlc3Np8yBkZSBzdWJzdGl0dWNp8yBhbnRlcmlvciIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIkUzNDogTm8gaGkgaGEgY2FwIG9yZHJlIGFudGVyaW9yIgorCisjOiBnbG9iYWxzLmg6MTI0MQorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IE5vIGhpIGhhIGNhcCBleHByZXNzafMgcmVndWxhciBhbnRlcmlvciIKKworIzogZ2xvYmFscy5oOjEyNDIKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiBObyBlcyBwZXJtZXQgY2FwIGludGVydmFsIgorCisjOiBnbG9iYWxzLmg6MTI0NAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IE5vIGhpIGhhIHByb3UgZXNwYWkiCisKKyM6IGdsb2JhbHMuaDoxMjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogTm8gaGkgaGEgY2FwIHNlcnZpZG9yIHJlZ2lzdHJhdCBhbWIgYXF1ZXN0IG5vbSBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiBObyBlcyBwb3QgY3JlYXIgZWwgZml0eGVyICVzIgorCisjOiBnbG9iYWxzLmg6MTI1MAorbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogTm8gcydoYSBwb2d1dCBvYnRlbmlyIGVsIG5vbSBkZWwgZml0eGVyIHRlbXBvcmFsIgorCisjOiBnbG9iYWxzLmg6MTI1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6IE5vIGVzIHBvdCBvYnJpciBlbCBmaXR4ZXIgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogTm8gZXMgcG90IGxsZWdpciBlbCBmaXR4ZXIgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjUzCittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMzc6IE5vIHMnaGFuIGRlc2F0IGVscyBjYW52aXMgKGFmZWdpdSAhIHBlciBjb25maXJtYXIpIgorCisjOiBnbG9iYWxzLmg6MTI1NAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiBBcmd1bWVudCBudWwiCisKKyM6IGdsb2JhbHMuaDoxMjU2Cittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogUydlc3BlcmF2YSB1biBu+m1lcm8iCisKKyM6IGdsb2JhbHMuaDoxMjU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTm8gcydoYSBwb2d1dCBvYnJpciBlbCBmaXR4ZXIgZCdlcnJvcnMgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjYyCittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogTm8gcydoYSBwb2d1dCBvYnJpciBsYSBwYW50YWxsYSIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE1lbfJyaWEgZXhoYXVyaWRhISIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiTm8gcydoYSB0cm9iYXQgZWwgcGF0cvMiCisKKyM6IGdsb2JhbHMuaDoxMjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4NjogTm8gcydoYSB0cm9iYXQgZWwgcGF0cvM6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2OQorbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IEwnYXJndW1lbnQgaGEgZGUgc2VyIHVuIG76bWVybyBwb3NpdGl1IgorCisjOiBnbG9iYWxzLmg6MTI3MQorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTogTm8gZXMgcG90IHRvcm5hciBhbCBkaXJlY3RvcmkgYW50ZXJpb3IiCisKKyM6IGdsb2JhbHMuaDoxMjc1Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0MjogTm8gaGkgaGFuIGVycm9ycyIKKworIzogZ2xvYmFscy5oOjEyNzcKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6IFMnaGEgY29ycm9tcHV0IGxhIGNhZGVuYSBhbWIgbCdleHByZXNzafMgcmVndWxhciIKKworIzogZ2xvYmFscy5oOjEyNzgKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiBTJ2hhIGNvcnJvbXB1dCBlbCBwcm9ncmFtYSBkJ2V4cHJlc3Np8yByZWd1bGFyIgorCisjOiBnbG9iYWxzLmg6MTI3OQorbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTogTCdvcGNp8yAncmVhZG9ubHknIGVzdOAgZGVmaW5pZGEgKGFmZWdpdSAhIHBlciBjb25maXJtYXIpIgorCisjOiBnbG9iYWxzLmg6MTI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBObyBzJ2hhIHBvZ3V0IGRlZmluaXIgbGEgdmFyaWFibGUgZGUgbm9t6XMgbGVjdHVyYSBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMjg0Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBFcnJvciBlbiBsbGVnaXIgZWwgZml0eGVyIGQnZXJyb3JzIgorCisjOiBnbG9iYWxzLmg6MTI4NworI34gbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKKyN+IG1zZ3N0ciAiIgorCisjOiBnbG9iYWxzLmg6MTI4OQorbXNnaWQgIkU1MjM6IE5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU1MjM6IE5vIGVzdOAgcGVybehzIGFxde0iCisKKyM6IGdsb2JhbHMuaDoxMjkyCittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBMYSBmdW5jafMgZCdhanVzdGFyIGVsIG1vZGUgZGUgcGFudGFsbGEgbm8gZXN04CBzdXBvcnRhZGEiCisKKyM6IGdsb2JhbHMuaDoxMjk0Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IExhIGRpc3TgbmNpYSBkZSBkZXNwbGHnYW1lbnQgbm8g6XMgduBsaWRhIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogTCdvcGNp8yAnc2hlbGwnIG5vIGNvbnTpIHJlcyIKKworIzogZ2xvYmFscy5oOjEyOTcKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IE5vIHMnaGFuIHBvZ3V0IGxsZWdpciBsZXMgZGFkZXMgZGVsIHNlbnlhbCEiCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiRTcyOiBDbG9zZSBlcnJvciBvbiBzd2FwIGZpbGUiCittc2dzdHIgIkU3MjogRXJyb3IgZW4gdGFuY2FyIGVsIGZpdHhlciBkJ2ludGVyY2FudmkiCisKKyM6IGdsb2JhbHMuaDoxMzAwCittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3MzogTGEgcGlsYSBkJ2V0aXF1ZXRlcyBlc3TgIGJ1aWRhIgorCisjOiBnbG9iYWxzLmg6MTMwMQorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiBMJ29yZHJlIOlzIG1hc3NhIGNvbXBsZXhhIgorCisjOiBnbG9iYWxzLmg6MTMwMgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiBFbCBub20g6XMgbWFzc2EgbGxhcmciCisKKyM6IGdsb2JhbHMuaDoxMzAzCittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFNvYnJlbiBjYXLgY3RlcnMgWyIKKworIzogZ2xvYmFscy5oOjEzMDQKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogU29icmVuIG5vbXMgZGUgZml0eGVyIgorCisjOiBnbG9iYWxzLmg6MTMwNQorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IFNvYnJlbiBjYXLgY3RlcnMiCisKKyM6IGdsb2JhbHMuaDoxMzA2Cittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODogTGEgbWFyY2Eg6XMgZGVzY29uZWd1ZGEiCisKKyM6IGdsb2JhbHMuaDoxMzA3Cittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBObyBzJ2hhIHBvZ3V0IGV4cGFuZGlyIGVsIG5vbSBkZSBmaXR4ZXIiCisKKyM6IGdsb2JhbHMuaDoxMzA5Cittc2dpZCAiRTU5MTogJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiRTU5MTogTCdvcGNp8yAnd2luaGVpZ2h0JyBubyBwb3Qgc2VyIG1lbm9yIHF1ZSAnd2lubWluaGVpZ2h0JyIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNTkyOiAnd2lud2lkdGgnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbndpZHRoJyIKK21zZ3N0ciAiRTU5MjogTCdvcGNp8yAnd2lud2lkdGgnIG5vIHBvdCBzZXIgbWVub3IgcXVlICd3aW5taW53aWR0aCciCisKKyM6IGdsb2JhbHMuaDoxMzE0Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IEVycm9yIGQnZXNjcmlwdHVyYSIKKworIzogZ2xvYmFscy5oOjEzMTUKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICJDb21wdGFkb3IgYSB6ZXJvIgorCisjOiBnbG9iYWxzLmg6MTMxNworbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTog2nMgZGUgPFNJRD4gZW4gdW4gY29udGV4dCBlcXVpdm9jYXQiCisKKyM6IGdsb2JhbHMuaDoxMzIwCittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiBTJ2hhIHJlYnV0IHVuYSBleHByZXNzafMgbm8gduBsaWRhIgorCisjOiBnbG9iYWxzLmg6MTMyMworbXNnaWQgIkU0NjM6IFJlZ2lvbiBpcyBndWFyZGVkLCBjYW5ub3QgbW9kaWZ5IgorbXNnc3RyICJFNDYzOiBMYSByZWdp8yBlc3TgIHByb3RlZ2lkYSwgbm8gZXMgcG90IG1vZGlmaWNhciIKZGlmZiAtLWdpdCBhL3NyYy9wby9jbGVhbnVwLnZpbSBiL3NyYy9wby9jbGVhbnVwLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY5N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL2NsZWFudXAudmltCkBAIC0wLDAgKzEsNyBAQAorIiBWaW0gc2NyaXB0IHRvIGNsZWFudXAgYSAucG8gZmlsZTogY29tbWVudC1vdXQgZnV6enkgYW5kIGVtcHR5IG1lc3NhZ2VzLgorIiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBzcGFjZSBiZWZvcmUgdGhlIHN0cmluZyAocmVxdWlyZWQgZm9yIFNvbGFyaXMpLgorIiBSZXF1aXJlcyBWaW0gNi4wIChiZWNhdXNlIG9mIG11bHRpLWxpbmUgc2VhcmNoIHBhdHRlcm5zKS4KK2cvXiMsIGZ1enp5XCgsIC4qXClcPVxubXNnaWQgIiJcQCEvLisxLC9eJC8tMXMvXi8jXH4gLworZy9ebXNnc3RyIi9zLy9tc2dzdHIgIi8KK2cvXm1zZ2lkIi9zLy9tc2dpZCAiLworZy9ebXNnc3RyICIiXChcbiJcKVxAIS8/Xm1zZ2lkPywucy9eLyNcfiAvCmRpZmYgLS1naXQgYS9zcmMvcG8vY3MuY3AxMjUwLnBvIGIvc3JjL3BvL2NzLmNwMTI1MC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM3MGRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL2NzLmNwMTI1MC5wbwpAQCAtMCwwICsxLDU5NTQgQEAKKyMgQ3plY2ggdHJhbnNsYXRpb24gb2YgdmltCisjIEpp+O0gUGF2bG92c2v9IDxqcGF2bG92c2t5QG1ib3gudm9sLmN6PiwgMjAwMCAtIDIwMDIuCisjIFNvbWUgY29tcGxldGlvbiBmb3IgdmltNi4wIGFkZGVkIGJ5IEpp+O0gQvhlemluYSA8YnJ6QGNlbnRydW0uY3o+CisjIFNvbWUgYnVnZml4ZXMgYnkgVG9t4ZogWmVsbGVyaW4gPHplbGxlcmluQHZvbG55LmN6PgorIworIyBHZW5lcmF0ZWQgZnJvbSBjcy5wbywgRE8gTk9UIEVESVQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiB2aW0tNi4wXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDEtMTAtMDggMDg6MjctMDcwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDItMDItMDYgMjI6MjkrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogSmn47SBQYXZsb3Zza/0gPGpwYXZsb3Zza3lAbWJveC52b2wuY3o+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ3plY2ggPGNzQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1jcDEyNTBcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IGJ1ZmZlci5jOjk3Cittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiBOZWx6ZSBhbG9rb3ZhdCCe4WRu/SBidWZmZXIsIGtvbujtbS4uLiIKKworIzogYnVmZmVyLmM6MTAwCittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogTmVsemUgYWxva292YXQgYnVmZmVyLCBwb3WeaWppIGppbv0uLi4iCisKKyM6IGJ1ZmZlci5jOjY5OAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAijuFkbv0gYnVmZmVyIG5lYnlsIGRlYWt0aXZvduFuIgorCisjOiBidWZmZXIuYzo3MDAKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAijuFkbv0gYnVmZmVyIG5lYnlsIHNtYXrhbiIKKworIzogYnVmZmVyLmM6NzAyCittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAijuFkbv0gYnVmZmVyIG5lYnlsIHphaG96ZW4iCisKKyM6IGJ1ZmZlci5jOjcxMAorbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICJQb+hldCBkZWFrdGl2b3Zhbv1jaCBidWZmZXL5OiAxIgorCisjOiBidWZmZXIuYzo3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAiUG/oZXQgZGVha3Rpdm92YW79Y2ggYnVmZmVy+TogJWQiCisKKyM6IGJ1ZmZlci5jOjcxNworbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIlBv6GV0IHNtYXphbv1jaCBidWZmZXL5OiAxIgorCisjOiBidWZmZXIuYzo3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICJQb+hldCBzbWF6YW79Y2ggYnVmZmVy+TogJWQiCisKKyM6IGJ1ZmZlci5jOjcyNAorbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAiUG/oZXQgemFob3plbv1jaCBidWZmZXL5OiAxIgorCisjOiBidWZmZXIuYzo3MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgIlBv6GV0IHphaG96ZW79Y2ggYnVmZmVy+TogJWQiCisKKyM6IGJ1ZmZlci5jOjc4MworbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IE5lYnlsIG5hbGV6ZW4gnuFkbv0gem3sbuxu/SBidWZmZXIiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo4MjIKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogU2V6bmFtIGJ1ZmZlcvkgamUgcHLhemRu/SIKKworIzogYnVmZmVyLmM6ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQ2Fubm90IGdvIHRvIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU4NjogTmVsemUgcPhlc2tv6Gl0IG5hIGJ1ZmZlciAlbGQiCisKKyM6IGJ1ZmZlci5jOjgzNworbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiBaYSBwb3NsZWRu7SBidWZmZXIgbmVsemUgcPhlc2tv6Gl0IgorCisjOiBidWZmZXIuYzo4MzkKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IFD4ZWQgcHJ2bu0gYnVmZmVyIG5lbHplIHD4ZXNrb+hpdCIKKworIzogYnVmZmVyLmM6ODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5OiBabexueSB2IGJ1ZmZlcnUgJWxkIG5lYnlseSB1bG+eZW55ICghIHBybyB2eW51Y2Vu7SkiCisKKyM6IGJ1ZmZlci5jOjg3OQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiBQb3NsZWRu7SBidWZmZXIgbmVsemUgZGVha3Rpdm92YXQiCisKKyM6IGJ1ZmZlci5jOjEzMTQKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiBWYXJvduFu7TogcPhldGXoZW7tIHNlem5hbXUgcyBu4Xp2eSBzb3Vib3L5IgorCisjOiBidWZmZXIuYzoxNDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5MjogQnVmZmVyICVsZCBuZW5hbGV6ZW4iCisKKyM6IGJ1ZmZlci5jOjE3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBWem9ydSAlcyB2eWhvdnVqZSB27WNlIGJ1ZmZlcvkiCisKKyM6IGJ1ZmZlci5jOjE3MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IFZ6b3J1ICVzIG5ldnlob3Z1amUgnuFkbv0gYnVmZmVyIgorCisjOiBidWZmZXIuYzoyMTA1IGV4X2RvY21kLmM6NjA2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAi+OFkZWsgJWxkIgorCisjOiBidWZmZXIuYzoyMTg4Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogQnVmZmVyIHRvaG90byBqbeluYSBqaZ4gZXhpc3R1amUiCisKKyM6IGJ1ZmZlci5jOjI0ODEKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFtabexu7G79XSIKKworIzogYnVmZmVyLmM6MjQ4NgorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW05lZWRpdG92YW79XSIKKworIzogYnVmZmVyLmM6MjQ5MQorbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIltOb3b9IHNvdWJvcl0iCisKKyM6IGJ1ZmZlci5jOjI0OTIKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbQ2h5YnkgcPhpIOh0ZW7tXSIKKworIzogYnVmZmVyLmM6MjQ5NCBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW1BvdXplIHBybyDodGVu7V0iCisKKyM6IGJ1ZmZlci5jOjI1MTAKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIvjhZGv5OiAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxMAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAi+OFka/k6ICVsZCAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxOAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICL44WRlayAlbGQvJWxkIC0tJWQlJS0tIHNsb3VwZWMiCisKKyM6IGJ1ZmZlci5jOjI2MDYKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIluO4WRu/SBzb3Vib3JdIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI2NDYKK21zZ2lkICJoZWxwIgorbXNnc3RyICJu4XBvduxkYSIKKworIzogYnVmZmVyLmM6MzE1MSBzY3JlZW4uYzo0NjcxCittc2dpZCAiW2hlbHBdIgorbXNnc3RyICJbbuFwb3bsZGFdIgorCisjOiBidWZmZXIuYzozMTgzIHNjcmVlbi5jOjQ2NzcKK21zZ2lkICJbUHJldmlld10iCittc2dzdHIgIltu4WhsZWRdIgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQWxsIgorbXNnc3RyICJWmmUiCisKKyM6IGJ1ZmZlci5jOjMzODkKK21zZ2lkICJCb3QiCittc2dzdHIgIktvbmVjIgorCisjOiBidWZmZXIuYzozMzkxCittc2dpZCAiVG9wIgorbXNnc3RyICJaYejhdGVrIgorCisjOiBidWZmZXIuYzo0MTI3Cittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFNlem5hbSBidWZmZXL5OlxuIgorCisjOiBidWZmZXIuYzo0MTYwCittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbc2V6bmFtIGNoeWJdIgorCisjOiBidWZmZXIuYzo0MTczIG1lbWxpbmUuYzoxNTEzCittc2dpZCAiW05vIEZpbGVdIgorbXNnc3RyICJbnuFkbv0gc291Ym9yXSIKKworIzogYnVmZmVyLmM6NDM5MworbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFpuYWt5IC0tLSIKKworIzogYnVmZmVyLmM6NDQwMworIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICJabmFreSBwcm8gJXM6IgorCisjOiBidWZmZXIuYzo0NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICD44WRlaz0lbGQgaWQ9JWQgam3pbm89JXMiCisKKyM6IGRpZmYuYzoxMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IE5lbHplIHD4ZWtyb+hpdCBtYXhpbeFsbu0gcG/oZXQgJWxkIGRpZmYgYnVmZmVy+SIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBOZWx6ZSB2eXR2b/hpdCBkaWZmeSIKKworIzogZGlmZi5jOjc0NworbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIlNvdWJvciBzZSB64XBsYXRvdSIKKworIzogZGlmZi5jOjk5MQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogTmVsemUg6O1zdCB2/XN0dXAgcHJvZ3JhbXUgZGlmZiIKKworIzogZGlmZi5jOjE3MDQKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogQWt0deFsbu0gYnVmZmVyIG5lbu0gdiBkaWZmIHJlnmltdSIKKworIzogZGlmZi5jOjE3MTYKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiBUbyBieWwgcG9zbGVkbu0gYnVmZmVyIHYgZGlmZiByZZ5pbXUiCisKKyM6IGRpZmYuYzoxNzI0Cittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiBWIGRpZmYgcmWeaW11IGpzb3Ugdu1jZSBuZZ4gZHZhIGJ1ZmZlcnkuIE5ldu1tLCBrdGVy/SBt4W0gcG91nu10LiIKKworIzogZGlmZi5jOjE3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiBOZWx6ZSBuYWzpenQgYnVmZmVyIFwiJXNcIiIKKworIzogZGlmZi5jOjE3NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiBCdWZmZXIgXCIlc1wiIG5lbu0gdiBkaWZmIHJlnmltdSIKKworIzogZGlncmFwaC5jOjIxNjgKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDogZGlncmFwaCBuZXNt7SBvYnNhaG92YXQgRXNjYXBlIgorCisjOiBkaWdyYXBoLmM6MjM0MAorbXNnaWQgIktleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiU291Ym9yIHMgbWFwb3Uga2zhdmVzbmljZSBuZWJ5bCBuYWxlemVuIgorCisjOiBkaWdyYXBoLmM6MjM2NworbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogOmxvYWRrZXltYXAgbWltbyBpbnRlcnByZXRvdmFu/SBzb3Vib3IiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0ga2zt6G92/WNoIHNsb3YgKF5OL15QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorbXNnc3RyICIgXlggcmWeaW0gKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIExva+Fsbu0gZG9wbPJvduFu7SBrbO3ob3b9Y2ggc2xvdiAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m924W7tIGNlbP1jaCD44WRr+SAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gbuF6dvkgc291Ym9y+SAoXkYvXk4vXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gdGFn+SAoXkkvXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gdnpvcnUgY2VzdCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m924W7tIGRlZmluaWMgKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SBwb2RsZSBzbG92bu1rdSAoXksvXk4vXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gcG9kbGUgdGV6YXVydSAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gcPjta2F6b3bpIPjhZGt5ICheSS9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJLb25lYyBvZHN0YXZjZSIKKworIzogZWRpdC5jOjg5NAorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAidm9sYmEgJ3RoZXNhdXJ1cycgamUgcHLhemRu4SIKKworIzogZWRpdC5jOjEwNzAKK21zZ2lkICInZGljdGlvbmFyeScgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJ2b2xiYSAnZGljdGlvbmFyeScgamUgcHLhemRu4SIKKworIzogZWRpdC5jOjE5OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIlByb2hsZWThduFtIHNsb3Zu7WsgJXMiCisKKyM6IGVkaXQuYzoyMTgzCittc2dpZCAiIChpbnNlcnQpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKGluc2VydCkgUm9sb3bhbu0gKF5FL15ZKSIKKworIzogZWRpdC5jOjIxODUKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHJlcGxhY2UpIFJvbG924W7tICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiUHJvaGxlZOF24W0gJXMiCisKKyM6IGVkaXQuYzoyNTMxCittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIlByb2hsZWThduFtIHRhZ3kiCisKKyM6IGVkaXQuYzozMTg5Cittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiUPhpZOF24W0iCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzIzOAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gSGxlZOFtLi4uIgorCisjOiBlZGl0LmM6MzI5NAorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIlb9Y2hveu0gcG9kb2JhIgorCisjOiBlZGl0LmM6MzI5OQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICJTbG92byB6IGppbulobyD44WRrdSIKKworIzogZWRpdC5jOjMzMDQKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiSmVkaW7hIHNob2RhIgorCisjOiBlZGl0LmM6MzM2MworIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCBvZiAlZCIKK21zZ3N0ciAic2hvZGEgJWQvJWQiCisKKyM6IGVkaXQuYzozMzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIgorbXNnc3RyICJzaG9kYSAlZCIKKworIzogZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IE5lem7hbeEgcHJvbexubuE6IFwiJXNcIiIKKworIzogZXZhbC5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IENoeWLtIHrhdm9ya3k6ICVzIgorCisjOiBldmFsLmM6MTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IFByb23sbm7hIFwiJXNcIiBuZWV4aXN0dWplIgorCisjOiBldmFsLmM6MTI4NAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogUG8gJz8nIGNoeWLtICc6JyIKKworIzogZXZhbC5jOjE4OTgKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogQ2h5Yuxq7WPtICcpJyIKKworIzogZXZhbC5jOjE5NDgKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogQ2h5Yuxq7WPtICddJyIKKworIzogZXZhbC5jOjIwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IENoeWLtIGpt6W5vIHZvbGJ5OiAlcyIKKworIzogZXZhbC5jOjIwNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBOZXpu4W3hIHZvbGJhOiAlcyIKKworIzogZXZhbC5jOjIxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IENoeWLtIHV2b3pvdmt5OiAlcyIKKworIzogZXZhbC5jOjIyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IENoeWLtIHV2b3pvdmt5OiAlcyIKKworIzogZXZhbC5jOjI1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBDaHlibukgYXJndW1lbnR5IHBybyBmdW5rY2kgJXMiCisKKyM6IGV2YWwuYzoyNTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBOZXpu4W3hIGZ1bmtjZTogJXMiCisKKyM6IGV2YWwuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBQ+O1saZogbW5vaG8gYXJndW1lbnT5IHBybyBmdW5rY2kgJXMiCisKKyM6IGV2YWwuYzoyNTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IFD47WxpmiBt4WxvIGFyZ3VtZW50+SBwcm8gZnVua2NpICVzIgorCisjOiBldmFsLmM6MjU0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IFBvdZ5pdO0gPFNJRD4gbWltbyBrb250ZXh0IHNrcmlwdHU6ICVzIgorCisjOiBldmFsLmM6MzU3NQorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCD44WRr+ToiCisKKyM6IGV2YWwuYzo0NjkwCittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT0tcbiIKKyImWnJ1mml0IgorCisjOiBldmFsLmM6NTUxMworbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogTmVleGlzdHVqZSBw+Glwb2plbu0gayBWaW0gc2VydmVydSIKKworIzogZXZhbC5jOjU2MDMKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3NzogTmVsemUg6O1zdCBvZHBvduzvIHNlcnZlcnUiCisKKyM6IGV2YWwuYzo1NjI4Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBOZWx6ZSBw+GVkYXQga2xpZW50b3ZpIgorCisjOiBldmFsLmM6NTY2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogTmVsemUgcPhlZGF0IGRvICVzIgorCisjOiBldmFsLmM6NTc2NworbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKENoeWJu/SkiCisKKyM6IGV2YWwuYzo2NzcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IE5lZGVmaW5vdmFu4SBwcm9t7G5u4TogJXMiCisKKyM6IGV2YWwuYzo3NDY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTIyOiBGdW5rY2UgJXMgammeIGV4aXN0dWplLiBQb3WeaWp0ZSAhIHBybyBqZWrtIG5haHJhemVu7S4iCisKKyM6IGV2YWwuYzo3NTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IE5lZGVmaW5vdmFu4SBmdW5rY2U6ICVzIgorCisjOiBldmFsLmM6NzUyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IENoeWLtICcoJzogJXMiCisKKyM6IGV2YWwuYzo3NTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBOZXD47XB1c3Ru/SBhcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo3NjQxCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IENoeWLtIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjc3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IE5lbHplIHD4ZWRlZmlub3ZhdCBmdW5rY2kgJXM6IGplIHBvdZ7tduFuYSIKKworIzogZXZhbC5jOjc3NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogTuF6ZXYgZnVua2NlIG11c+0gemHo7W5hdCB2ZWxr/W0gcO1zbWVuZW06ICVzIgorCisjOiBldmFsLmM6Nzc4MworbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IEplIHZ5nmFkb3bhbm8gam3pbm8gZnVua2NlIgorCisjOiBldmFsLmM6Nzg3NgorbXNnaWQgImZ1bmN0aW9uICIKK21zZ3N0ciAiZnVua2NlICIKKworIzogZXZhbC5jOjc5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogTmVkZWZpbm92YW7hIGZ1bmtjZTogJXMiCisKKyM6IGV2YWwuYzo3OTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogTmVsemUgc21hemF0IGZ1bmtjaSAlczogamUgammeIHBvdZ7tduFuYSIKKworIzogZXZhbC5jOjgwNDMKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiBaYW5v+GVu7SBmdW5rY2UgamUgaGx1YprtIG5lniAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJ2b2zhbSAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODExOSBleF9jbWRzMi5jOjE5NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAicG9rcmHodWppIHYgJXMiCisKKyM6IGV2YWwuYzo4MTczCittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gbWltbyBmdW5rY2kiCisKKyM6IGV2YWwuYzo4MjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICJkb2tvbuhlbm8gcHJvduFk7G7tICVzLiBO4XZyYXRvduEgaG9kbm90YSAjJWxkIgorCisjOiBldmFsLmM6ODI1NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICJkb2tvbuhlbm8gcHJvduFk7G7tICVzLiBO4XZyYXRvduEgaG9kbm90YSBcIiVzXCIiCisKKyM6IGV2YWwuYzo4Mzk1Cittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgZ2xvYuFsbu0gcHJvbexubuk6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIJplc3Ru4WN0a2927CAlMDJ4LCAgb3Ntaehrb3bsICUwM28iCisKKyM6IGV4X2NtZHMuYzo0MjgKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogTmVsemUgcPhlc3Vub3V0IPjhZGt5IG5hIHD5dm9kbu0gbe1zdG8iCisKKyM6IGV4X2NtZHMuYzo0OTcKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgInBv6GV0IHD4ZXN1bnV0/WNoIPjhZGv5OiAxIgorCisjOiBleF9jbWRzLmM6NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiUG/oZXQgcPhlc3VudXT9Y2gg+OFka/k6ICVsZCIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIlBv6GV0IGZpbHRyb3Zhbv1jaCD44WRr+TogJWxkIgorCisjOiBleF9jbWRzLmM6OTE4Cittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogQXV0b21hdGlja+kgcPjta2F6eSAqRmlsdGVyKiBuZXNt7SBt7G5pdCBha3R14Wxu7SBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoxMDAzCittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbTmV1bG+eZW7pIHpt7G55XVxuIgorCisjOiBleF9jbWRzLmM6MTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgInZpbWluZm86ICVzIG5hIPjhZGt1OiAiCisKKyM6IGV4X2NtZHMuYzoxMjUzCittc2dpZCAiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiCittc2dzdHIgIkUxMzY6IHZpbWluZm86IHD47WxpmiBtbm9obyBjaHliLCBw+GVza2FrdWppIHpieXRlayBzb3Vib3J1IgorCisjOiBleF9jbWRzLmM6MTI4MgorIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgIsh0dSB2aW1pbmZvIHNvdWJvciBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMjgzCittc2dpZCAiIGluZm8iCittc2dzdHIgIiBpbmZvcm1hY2UiCisKKyM6IGV4X2NtZHMuYzoxMjg0Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgem5h6Gt5IgorCisjOiBleF9jbWRzLmM6MTI4NQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBzZSBuZXpkYfhpbG8iCisKKyM6IGV4X2NtZHMuYzoxMzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBkbyB2aW1pbmZvIHNvdWJvcnUgJXMgbmVsemUgemFwaXNvdmF0IgorCisjOiBleF9jbWRzLmM6MTUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiBOZWx6ZSB1bG+eaXQgdmltaW5mbyBzb3Vib3IgJXMhIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIlVrbOFk4W0gdmltaW5mbyBzb3Vib3J1IFwiJXNcIiIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTYxMAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgVGVudG8gdmltaW5mbyBzb3Vib3IgYnlsIHZ5dHZv+GVuIGVkaXRvcmVtIFZpbSAlcy5cbiIKKworIzogZXhfY21kcy5jOjE2MTIKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIFBva3VkIGJ1ZGV0ZSBvcGF0cm79LCBt+Z5ldGUgamVqIHVwcmF2b3ZhdC5cbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2MTQKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyBIb2Rub3RhIHZvbGJ5ICdlbmNvZGluZycgdiBkb2LsIHVsb55lbu0gdG9ob3RvIHNvdWJvcnVcbiIKKworIzogZXhfY21kcy5jOjE3MTMKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIk5lcPjtcHVzdG79IHBv6OF0Zehu7SB6bmFrIgorCisjOiBleF9jbWRzLmM6MjA1MyBleF9jbWRzLmM6MjI4OSBleF9jbWRzMi5jOjYwMgorbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIlVsb55pdCBqYWtvIgorCisjLiBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMuICogZ29vZCBpZGVhLgorIzogZXhfY21kcy5jOjIwOTYKK21zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKK21zZ3N0ciAiRTEzOTogU291Ym9yIGplIG5haHLhbiB2IGppbultIGJ1ZmZlcnUiCisKKyM6IGV4X2NtZHMuYzoyMTMwCittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiVWxvnml0IG5l+nBsbv0gc291Ym9yPyIKKworIzogZXhfY21kcy5jOjIxMzcKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogUG91nmlqdGUgISBwcm8gdWxvnmVu7SBuZfpwbG7paG8gYnVmZmVydSIKKworIzogZXhfY21kcy5jOjIyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICJQ+GVwc2F0IHNvdWJvciBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogjuFkbv0gbuF6ZXYgc291Ym9ydSBwcm8gYnVmZmVyICVsZCIKKworIzogZXhfY21kcy5jOjIzMzIKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiBTb3Vib3IgbmVieWwgdWxvnmVuOiBVa2zhZOFu7SBqZSB6YWvheuFubyB2b2xib3UgJ3dyaXRlJyIKKworIzogZXhfY21kcy5jOjIzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIlBybyBcIiUuKnNcIiBqZSBuYXN0YXZlbmEgdm9sYmEgJ3JlYWRvbmx5Jy5cbiIKKyJQ+GVqZXRlIHNpIGppIHBvdGxh6Gl0PyIKKworIzogZXhfY21kcy5jOjI1MTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIkVkaXRvdmF0IHNvdWJvciIKKworIzogZXhfY21kcy5jOjMwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9tYXRpY2vpIHD47WthenkgbmVv6GVr4XZhbuwgc21hemFseSBub3b9IGJ1ZmZlciAlcyIKKworIzogZXhfY21kcy5jOjMxNTYKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogbmXo7XNlbG79IGFyZ3VtZW50IHBybyA6eiIKKworIzogZXhfY21kcy5jOjMyNDEKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltIG5lcG92b2x1amUgcG91nml07SBw+O1rYXr5IHNoZWxsdSIKKworIzogZXhfY21kcy5jOjMzNDgKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiBSZWd1bOFybu0gdv1yYXp5IG5lc23tIGL9dCBvZGTsbGVueSBw7XNtZW55IgorCisjOiBleF9jbWRzLmM6MzY4NgorIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICJuYWhyYWRpdCB6YSAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCisKKyM6IGV4X2NtZHMuYzo0MDUwCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIihQ+GVydZplbm8pICIKKworIzogZXhfY21kcy5jOjQwNTQKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSBuYWhyYXplbu0iCisKKyM6IGV4X2NtZHMuYzo0MDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICIlbGQgbmFocmF6ZW7tIgorCisjOiBleF9jbWRzLmM6NDA1OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBuYSBqZWRub20g+OFka3UiCisKKyM6IGV4X2NtZHMuYzo0MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiBuYSAlbGQg+OFkY+1jaCIKKworIzogZXhfY21kcy5jOjQxMTIKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IDpnbG9iYWwgbmVsemUgdm9sYXQgcmVrdXJ6aXZu7CIKKworIzogZXhfY21kcy5jOjQxNDcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogVSBw+O1rYXp1ICdnbG9iYWwnIGNoeWLtIHJlZ3Vs4XJu7SB2/XJheiIKKworIzogZXhfY21kcy5jOjQxOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiVnpvciBuYWxlemVuIG5hIGthnmTpbSD44WRrdTogJXMiCisKKyM6IGV4X2NtZHMuYzo0Mjc3Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBQb3NsZWRu7SBuYWhyYXp1au1j7SD4ZXTsemVjOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0Mzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogTGl0dWppLCBwcm8gJXMgbmVu7SCe4WRu4SBu4XBvduxkYSIKKworIzogZXhfY21kcy5jOjQ0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICJMaXR1amksIHNvdWJvciBcIiVzXCIgcyBu4XBvduxkb3UgbmVieWwgbmFsZXplbiIKKworIzogZXhfY21kcy5jOjQ4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogJXMgbmVu7SBhZHJlc+H4ZW0iCisKKyM6IGV4X2NtZHMuYzo0ODg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBOZWx6ZSBvdGV2+O10ICVzIHBybyB64XBpcyIKKworIzogZXhfY21kcy5jOjQ4OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IE5lbHplIG90ZXb47XQgJXMgcHJvIHrhcGlzIgorCisjOiBleF9jbWRzLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiBEdXBsaWNpdG7tIHRhZyBcIiVzXCIgdiBzb3Vib3J1ICVzIgorCisjOiBleF9jbWRzLmM6NTA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IE5lem7hbeEgdm9sYmEgcPjta2F6dTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MDk4Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IENoeWLtIGpt6W5vIHZvbGJ5IgorCisjOiBleF9jbWRzLmM6NTE0NAorbXNnaWQgIkUyNTU6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkUyNTU6IE5hc3RhdmVubyBw+O1saZogbW5vaG8gdm9sZWIiCisKKyM6IGV4X2NtZHMuYzo1MTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzk6IEludmFsaWQgc2lnbiB0ZXh0OiAlcyIKK21zZ3N0ciAiRTIzOTogTmVwbGF0bv0gdGV4dCB2b2xieTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjEwIGV4X2NtZHMuYzo1Mzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IE5lem7hbeEgdm9sYmE6ICVzIgorCisjOiBleF9jbWRzLmM6NTI1NgorbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IENoeWLtIGlkZW50aWZpa+F0b3Igdm9sYnkiCisKKyM6IGV4X2NtZHMuYzo1MzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiBjaHlibukgam3pbm8gYnVmZmVydTogJXMiCisKKyM6IGV4X2NtZHMuYzo1Mzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiBDaHlibukgSUQgdm9sYnk6ICVsZCIKKworIzogZXhfY21kcy5jOjU1NDYKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltWeW1heuFub10iCisKKyM6IGV4X2NtZHMyLmM6NzAKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBsZWF2ZS4iCittc2dzdHIgIlNwb3WadO1tIGxhZO1j7SByZZ5pbS4gUHJvIHVrb27oZW7tIG5hcGmadGUgXCJjb250XCIuIgorCisjOiBleF9jbWRzMi5jOjc0IGV4X2RvY21kLmM6NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAi+OFkZWsgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJw+O1rYXo6ICVzIgorCisjOiBleF9jbWRzMi5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJCb2QgcPhlcnWaZW7tIHYgXCIlcyVzXCIgbmEg+OFka3UgJWxkIgorCisjOiBleF9jbWRzMi5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IEJvZCBw+GVydZplbu0gbmVuYWxlemVuOiAlcyIKKworIzogZXhfY21kczIuYzo0MTQKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICJOZWJ5bHkgZGVmaW5vduFudSCe4WRu6SBib2R5IHD4ZXJ1mmVu7SIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgIPjhZGVrICVsZCIKKworIzogZXhfY21kczIuYzo2MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAiVWxvnml0IHpt7G55IGRvIFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo2MjcgZXhfZG9jbWQuYzo4NjEyCittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIk5lcG9qbWVub3bhbm8iCisKKyM6IGV4X2NtZHMyLmM6NzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiBCdWZmZXIgXCIlc1wiIG9ic2FodWplIG5ldWxvnmVu6SB6bexueSIKKworIzogZXhfY21kczIuYzo4MzIKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgIiIKKyJWYXJvduFu7TogTmXoZWthbv0gdnN0dXAgZG8gamlu6WhvIGJ1ZmZlcnUgKHprb250cm9sdWp0ZSBhdXRvbWF0aWNr6SBw+O1rYXp5KSIKKworIzogZXhfY21kczIuYzoxMjA4Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiBQcm8gZWRpdGFjaSBieWwgemFk4W4gcG91emUgamVkZW4gc291Ym9yIgorCisjOiBleF9jbWRzMi5jOjEyMTAKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IFD4ZWQgcHJ2bu0gc291Ym9yIG5lbHplIHD4ZXNrb+hpdCIKKworIzogZXhfY21kczIuYzoxMjEyCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IFphIHBvc2xlZG7tIHNvdWJvciBuZWx6ZSBw+GVza2/oaXQiCisKKyM6IGV4X2NtZHMyLmM6MTYzMgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIkhsZWThbSBcIiVzXCIgdiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiSGxlZOFtIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgInNvdWJvciBcIiVzXCIgbmVieWwgbmFsZXplbiB2ICdydW50aW1lcGF0aCciCisKKyM6IGV4X2NtZHMyLmM6MTcxMgorbXNnaWQgIlJ1biBNYWNybyIKK21zZ3N0ciAiU3B1c3RpdCBtYWtybyIKKworIzogZXhfY21kczIuYzoxODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAibmVsemUgaW50ZXJwcmV0b3ZhdCBhZHJlc+H4OiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg0NworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAibmVsemUgaW50ZXJwcmV0b3ZhdCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg0OQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIvjhZGVrICVsZDogbmVsemUgaW50ZXJwcmV0b3ZhdCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2MworIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImludGVycHJldHVqaSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICL44WRlayAlbGQ6IGludGVycHJldHVqaSAlcyIKKworIzogZXhfY21kczIuYzoxOTcxCisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICJkb2tvbuhlbmEgaW50ZXJwcmV0YWNlICVzIgorCisjOiBleF9jbWRzMi5jOjIyNzIKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiBWYXJvduFu7TogY2h5Ym79IG9kZOxsb3Zh6CD44WRr+S4gTW+ebuEgY2h5Yu0gXk0uIgorCisjOiBleF9jbWRzMi5jOjIzMjEKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgcG91nml0byBtaW1vIGludGVycHJldG92YW79IHNvdWJvciIKKworIzogZXhfY21kczIuYzoyMzU0Cittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IDpmaW5pc2ggcG91nml0byBtaW1vIGludGVycHJldG92YW79IHNvdWJvciIKKworIzogZXhfY21kczIuYzoyODIwCittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICKO4WRu/SB0ZXh0IGsgdnl0aZp07G7tIgorCisjOiBleF9jbWRzMi5jOjI4OTgKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAiVGlza251IHN0cmFudSAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MjkwNworIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIEtvcGllICVkIHogJWQiCisKKyM6IGV4X2NtZHMyLmM6Mjk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiVnl0aZp07G5vOiAlcyIKKworIzogZXhfY21kczIuYzoyOTY2Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiVGlzayB6cnWaZW4iCisKKyM6IGV4X2NtZHMyLmM6MzM0NAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogTmVsemUgemFwaXNvdmF0IGRvIHb9c3R1cG7taG8gUG9zdFNjcmlwdG926WhvIHNvdWJvcnUiCisKKyM6IGV4X2NtZHMyLmM6NDAxOQorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDogTmVsemUgb3RldvjtdCB2/XN0dXBu7SBQb3N0U2NyaXB0b3b9IHNvdWJvciIKKworIzogZXhfY21kczIuYzo0MDU3Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogTmVsemUgb3RldvjtdCBzb3Vib3IgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQwNjgKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IE5lbHplIOjtc3QgemRyb2pvdv0gUG9zdFNjcmlwdG92/SBzb3Vib3IgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQyNjYKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIk9kZXPtbOFtIG5hIHRpc2vhcm51Li4uIgorCisjOiBleF9jbWRzMi5jOjQyNzAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiBTZWxoYWwgdGlzayBQb3N0U2NyaXB0b3bpaG8gc291Ym9ydSIKKworIzogZXhfY21kczIuYzo0MjcyCittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJUaXNrb3bhIPpsb2hhIG9kZXNs4W5hLiIKKworIzogZXhfY21kczIuYzo0NjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICJBa3R14Wxu7SAlc2phenlrOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDY1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogTmVsemUgbmFzdGF2aXQgamF6eWsgbmEgXCIlc1wiIgorCisjOiBleF9kb2NtZC5jOjQ5MQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJTcG91mnTtbSBFeCBt82QuIE5hcGmadGUgXCJ2aXN1YWxcIiBwcm8gbuF2cmF0IGRvIG5vcm3hbG7taG8gbfNkdS4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjUyNworbXNnaWQgIkF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJLb25lYyBzb3Vib3J1IgorCisjOiBleF9kb2NtZC5jOjYwMgorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogUPjta2F6IGplIHD47WxpmiByZWt1cnppdm7tIgorCisjOiBleF9kb2NtZC5jOjkxMQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiBDaHli7SA6ZW5kd2hpbGUiCisKKyM6IGV4X2RvY21kLmM6OTEzCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IENoeWLtIDplbmRpZiIKKworIzogZXhfZG9jbWQuYzo5MjMKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICJLb25lYyBpbnRlcnByZXRvdmFu6WhvIHNvdWJvcnUiCisKKyM6IGV4X2RvY21kLmM6OTI0Cittc2dpZCAiRW5kIG9mIGZ1bmN0aW9uIgorbXNnc3RyICJLb25lYyBmdW5rY2UiCisKKyM6IGV4X2RvY21kLmM6MTM0NAorbXNnaWQgIkFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgIk5lamVkbm96bmHobukgcG91nml07SB1nml2YXRlbHNreSBkZWZpbm92YW7paG8gcPjta2F6dSIKKworIzogZXhfZG9jbWQuYzoxMzU4Cittc2dpZCAiTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJOZW7tIHD47WthemVtIGVkaXRvcnUiCisKKyM6IGV4X2RvY21kLmM6MTQ0MQorbXNnaWQgIkRvbid0IHBhbmljISIKK21zZ3N0ciAiTmVwYW5pa2H4dGUhIgorCisjOiBleF9kb2NtZC5jOjE0NjAKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIlphZOFuIHpw7HRu/SByb3pzYWgiCisKKyM6IGV4X2RvY21kLmM6MTQ2OQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAiWmFk4W4genDsdG79IHJvenNhaC4gUHJvaG9kaXQgaHJhbmljZSIKKworIzogZXhfZG9jbWQuYzoxNTgwCittc2dpZCAiVXNlIHcgb3Igdz4+IgorbXNnc3RyICJQb3WeaWp0ZSB3IOhpIHc+PiIKKworIzogZXhfZG9jbWQuYzozMDg2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiBQ+O1rYXogbmVu7SB06XRvIHZlcnppIGJvaHWeZWwgaW1wbGVtZW50b3bhbiIKKworIzogZXhfZG9jbWQuYzozMjU2Cittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IFD47XB1c3Ru/SBqZSBwb3V6ZSBqZWRlbiBu4XpldiBzb3Vib3J1IgorCisjOiBleF9kb2NtZC5jOjM4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICJKZZp07CB6Yv12YWrtIHNvdWJvcnkgayBlZGl0YWNpICglZCkuIENoY2V0ZSBw+GVzdG8gdWtvbuhpdCBlZGl0b3I/IgorCisjOiBleF9kb2NtZC5jOjM4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogSmWadOwgemL9dmFq7SBzb3Vib3J5IGsgZWRpdGFjaSAoJWxkKS4iCisKKyM6IGV4X2RvY21kLmM6MzkxMQorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IHVzZSAhIHRvIHJlZGVmaW5lIgorbXNnc3RyICJFMTc0OiBQ+O1rYXogammeIGV4aXN0dWplOiBwb3WeaWp0ZSAhIHBybyBw+GVkZWZpbm924W7tIgorCisjOiBleF9kb2NtZC5jOjQwMTYKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgSm3pbm8gICAgICAgQXJncyBSb3pzYWgg2nBsbm9zdCAgRGVmaW5pY2UiCisKKyM6IGV4X2RvY21kLmM6NDEwNQorbXNnaWQgIk5vIHVzZXItZGVmaW5lZCBjb21tYW5kcyBmb3VuZCIKK21zZ3N0ciAiTmVieWx5IG5hbGV6ZW55IJ7hZG7pIHWeaXZhdGVsc2t5IGRlZmlub3ZhbukgcPjta2F6eSIKKworIzogZXhfZG9jbWQuYzo0MTM2Cittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTogTmVieWx5IHphZOFueSCe4WRu6SBhdHJpYnV0eSIKKworIzogZXhfZG9jbWQuYzo0MTg4Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiBDaHlibv0gcG/oZXQgYXJndW1lbnT5IgorCisjOiBleF9kb2NtZC5jOjQyMDMKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBPcGFrb3bhbu0gbmVt+Z5lIGL9dCB6YWThbm8gZHZha3LhdCIKKworIzogZXhfZG9jbWQuYzo0MjEzCittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogQ2h5Ym7hIGltcGxpY2l0bu0gaG9kbm90YSBwcm8gcG/oZXQiCisKKyM6IGV4X2RvY21kLmM6NDI0MQorbXNnaWQgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcmVkIGZvciBjb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogY2h5Ym7hIGltcGxpY2l0bu0gaG9kbm90YSBwcm8gb3Bha2924W7tIgorCisjOiBleF9kb2NtZC5jOjQyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IENoeWJu4SBob2Rub3RhIGRvcGxu7G7tOiAlcyIKKworIzogZXhfZG9jbWQuYzo0MjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODE6IEludmFsaWQgYXR0cmlidXRlOiAlcyIKK21zZ3N0ciAiRTE4MTogQ2h5Ym79IGF0cmlidXQ6ICVzIgorCisjOiBleF9kb2NtZC5jOjQzMDkKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogQ2h5Ym7pIGpt6W5vIHD47WthenUiCisKKyM6IGV4X2RvY21kLmM6NDMyNAorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiRTE4MzogVZ5pdmF0ZWxza3kgZGVmaW5vdmFu6SBw+O1rYXp5IG11c+0gemHo7W5hdCB2ZWxpa/1tIHDtc21lbmVtLiIKKworIzogZXhfZG9jbWQuYzo0MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiBVnml2YXRlbHNreSBkZWZpbm92YW79IHD47WtheiAlcyBuZWV4aXN0dWplIgorCisjOiBleF9kb2NtZC5jOjQ4NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBOZWx6ZSBuYWzpenQgYmFyZXZu6SBzY2jpbWEgJXMiCisKKyM6IGV4X2RvY21kLmM6NDg1MgorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICJCbGFob3D4ZWppLCB1nml2YXRlbGkgVmltdSEiCisKKyM6IGV4X2RvY21kLmM6NTU0OQorbXNnaWQgIkVkaXQgRmlsZSBpbiBuZXcgd2luZG93IgorbXNnc3RyICJFZGl0b3ZhdCBzb3Vib3IgdiBub3bpbSBva27sIgorCisjOiBleF9kb2NtZC5jOjU4MTUKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIo7hZG79IG9ka2zhZGFj7SBzb3Vib3IiCisKKyM6IGV4X2RvY21kLmM6NTkxOQorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJVbG+eaXQgc291Ym9yIgorCisjOiBleF9kb2NtZC5jOjU5NzgKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6II7hZG79IHD4ZWRjaG967SBhZHJlc+H4IgorCisjOiBleF9kb2NtZC5jOjYwNTUKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiBOZXpu4W39IgorCisjOiBleF9kb2NtZC5jOjYxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICJVbe1zdOxu7SBva25hOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjYxNzgKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogTmEgdOl0byBwbGF0Zm9ybewgbmVsemUgdW3tc3Tsbu0gb2tuYSB6amlzdGl0IgorCisjOiBleF9kb2NtZC5jOjY0NDQKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICJVbG+eaXQgcPhlc23scm924W7tIgorCisjOiBleF9kb2NtZC5jOjY1OTMKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIlVsb55pdCBwb2hsZWQiCisKKyM6IGV4X2RvY21kLmM6NjU5NAorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiVWxvnml0IHNlemVu7SIKKworIzogZXhfZG9jbWQuYzo2NTk2Cittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAiVWxvnml0IG5hc3RhdmVu7SIKKworIzogZXhfZG9jbWQuYzo2NzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIGV4aXN0dWplIChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGV4X2RvY21kLmM6Njc1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6IE5lbHplIG90ZXb47XQgXCIlc1wiIHBybyB64XBpcyIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Njc3NAorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogQXJndW1lbnRlbSBt+Z5lIGL9dCBwb3V6ZSBw7XNtZW5vIG5lYm8gcHJhdv0g6GkgbGV2/SBhcG9zdHJvZiIKKworIzogZXhfZG9jbWQuYzo2ODAzCittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBWbm/4ZW7tIDpub3JtYWwgamUgcPjtbGmaIGhsdWJva+kiCisKKyM6IGV4X2RvY21kLmM6NzE3MQorbXNnaWQgIjppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJ2bm/4ZW7tIDppZiBqZSBw+O1saZogaGx1Ym9r6SIKKworIzogZXhfZG9jbWQuYzo3MjA2Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYgYmV6IG9kcG927WRhau1j7WhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjI2Cittc2dpZCAiOmVsc2Ugd2l0aG91dCA6aWYiCittc2dzdHIgIjplbHNlIGJleiBvZHBvdu1kYWrtY+1obyA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzIyOAorbXNnaWQgIjplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIjplbHNlaWYgYmV6IG9kcG927WRhau1j7WhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjgwCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgInZub/hlbu0gOndoaWxlIGplIHD47WxpmiBobHVib2vpIgorCisjOiBleF9kb2NtZC5jOjczMjYKK21zZ2lkICI6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjpjb250aW51ZSBiZXogb2Rwb3btZGFq7WPtaG8gOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjczNTMKK21zZ2lkICI6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjpicmVhayBiZXogb2Rwb3btZGFq7WPtaG8gOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjczNzYgZXhfZG9jbWQuYzo3MzgxCittc2dpZCAiOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6ZW5kd2hpbGUgYmV6IG9kcG927WRhau1j7WhvIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3NDAyCittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uIG1pbW8gZnVua2NpIgorCisjOiBleF9kb2NtZC5jOjc1ODIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiIgorIkUxOTQ6II7hZG79IGFsdGVybmF0aXZu7SBu4XpldiBzb3Vib3J1LCBrdGVy/W0gYnkgYnlsbyBtb55u6SBuYWhyYWRpdCAnIyciCisKKyM6IGV4X2RvY21kLmM6NzYxMworbXNnaWQgIm5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAijuFkbv0gbuF6ZXYgc291Ym9ydSwga3Rlcv1tIGJ5IGJ5bG8gbW+ebukgbmFocmFkaXQgXCI8YWZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzYyMQorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAijuFkbukg6O1zbG8gYnVmZmVydSwga3Rlcv1tIGJ5IGJ5bG8gbW+ebukgbmFocmFkaXQgXCI8YWJ1Zj5cIiIKKworIzogZXhfZG9jbWQuYzo3NjMyCittc2dpZCAibm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIiIKKyKO4WRu4SBzaG9kYSBhdXRvbWF0aWNr/WNoIHD47WthevksIGt0ZXJvdSBieSBieWxvIG1vnm7pIG5haHJhZGl0IFwiPGFtYXRjaD5cIiIKKworIzogZXhfZG9jbWQuYzo3NjQyCittc2dpZCAibm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiCittc2dzdHIgIo7hZG79IGludGVycHJldG92YW79IHNvdWJvciwga3Rlcv1tIGJ5IGJ5bG8gbW+ebukgbmFocmFkaXQgXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY4MworIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiUHLhemRu/SBu4XpldiBzb3Vib3J1IHBybyAnJScg6GkgJyMnIGZ1bmd1amUgcG91emUgcyBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3Njg1Cittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiVv1zbGVka2VtIHZ5aG9kbm9jZW7tIGplIHBy4Xpkbv0g+GV07HplYyIKKworIzogZXhfZG9jbWQuYzo4NTk0Cittc2dpZCAiRTE5NTogQ2Fubm90IG9wZW4gdmltaW5mbyBmaWxlIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTk1OiBOZWx6ZSBvdGV2+O10IHBybyDodGVu7SB2aW1pbmZvIHNvdWJvciIKKworIzogZXhfZG9jbWQuYzo4NzY3Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBWIHTpdG8gdmVyemkgbmVqc291IHNw+GWea3kgcG9kcG9yb3bhbnkiCisKKyM6IGV4X2dldGxuLmM6Mjc4NQorbXNnaWQgInRhZ25hbWUiCittc2dzdHIgImpt6W5vIHRhZ3UiCisKKyM6IGV4X2dldGxuLmM6Mjc4OAorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIHR5cCBzb3Vib3JcbiIKKworIzogZXhfZ2V0bG4uYzozOTk3Cittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICIndm9sYmEgJ2hpc3RvcnknIGplIG5hc3RhdmVuYSBuYSBudWx1IgorCisjOiBleF9nZXRsbi5jOjQyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmllICVzIChwb+jtbmFqZSBuZWpub3bsaprtIHBvbG+ea291KTpcbiIKKworIzogZXhfZ2V0bG4uYzo0MjM4Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJw+O1rYXpvdukg+OFka3kiCisKKyM6IGV4X2dldGxuLmM6NDIzOQorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgInZ5aGxlZOF2YW79Y2gg+GV07Hpj+SIKKworIzogZXhfZ2V0bG4uYzo0MjQwCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAidv1yYXr5IgorCisjOiBleF9nZXRsbi5jOjQyNDEKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICJ2c3R1cG7tIPjhZGt5IgorCisjOiBleF9nZXRsbi5jOjQyNzEKK21zZ2lkICJFMTk4OiBjbWRfcGNoYXIgYmV5b25kIHRoZSBjb21tYW5kIGxlbmd0aCIKK21zZ3N0ciAiRTE5ODogY21kX3BjaGFyIHD4ZWtyYeh1amUgZOlsa3UgcPjta2F6dSIKKworIzogZXhfZ2V0bG4uYzo0NDM1Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogU21heuFubyBha3Rpdm7tIG9rbm8g6GkgYnVmZmVyIgorCisjOiBmaWxlaW8uYzozNDcKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAibmVw+O1wdXN0bv0gbuF6ZXYgc291Ym9ydSIKKworIzogZmlsZWlvLmM6MzcxIGZpbGVpby5jOjQ5NSBmaWxlaW8uYzoyNDkxIGZpbGVpby5jOjI1MjkKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiamUgYWRyZXPh+GVtIgorCisjOiBmaWxlaW8uYzozNzMKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJuZW7tIHNvdWJvcmVtIgorCisjOiBmaWxlaW8uYzo1MTUgZmlsZWlvLmM6MzU4MQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltub3b9IHNvdWJvcl0iCisKKyM6IGZpbGVpby5jOjUzMgorbXNnaWQgIltQZXJtaXNzaW9uIERlbmllZF0iCittc2dzdHIgIltw+O1zdHVwIG9kbe10bnV0XSIKKworIzogZmlsZWlvLmM6NjI0Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgYXV0b21hdGlja+kgcPjta2F6eSB16GluaWx5IHNvdWJvciBuZehpdGVsbv1tIgorCisjOiBmaWxlaW8uYzo2MjYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqUmVhZFByZSBhdXRvbWF0aWNr6SBw+O1rYXp5IG5lc23tIG3sbml0IGFrdHXhbG7tIGJ1ZmZlciIKKworIzogZmlsZWlvLmM6NjQ2Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiDIdHUgemUgc3RhbmRhcmRu7WhvIHZzdHVwdS4uLlxuIgorCisjOiBmaWxlaW8uYzo2NTIKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIsh0dSB6ZSBzdGFuZGFyZG7taG8gdnN0dXB1Li4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjg3NgorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiBQbyBrb252ZXJ6aSBqZSBzb3Vib3IgbmXoaXRlbG79ISIKKworIzogZmlsZWlvLmM6MTczMgorbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltwb2ptZW5vdmFu4SByb3VyYS9zb2tldF0iCisKKyM6IGZpbGVpby5jOjE3MzkKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltwb2ptZW5vdmFu4SByb3VyYV0iCisKKyM6IGZpbGVpby5jOjE3NDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3Nva2V0XSIKKworIzogZmlsZWlvLmM6MTc1NAorbXNnaWQgIltST10iCittc2dzdHIgIltST10iCisKKyM6IGZpbGVpby5jOjE3NjQKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIltjaHli7SBDUl0iCisKKyM6IGZpbGVpby5jOjE3NjkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbbmFsZXplbm8gTkxdIgorCisjOiBmaWxlaW8uYzoxNzc0Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbZGxvdWjpIPjhZGt5IHphbG9tZW55XSIKKworIzogZmlsZWlvLmM6MTc4MCBmaWxlaW8uYzozNTY1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbbmV6a29udmVydG924W5dIgorCisjOiBmaWxlaW8uYzoxNzg1IGZpbGVpby5jOjM1NzAKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW3prb252ZXJ0b3bhbl0iCisKKyM6IGZpbGVpby5jOjE3OTIgZmlsZWlvLmM6MzU5NQorbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW3phmmlmcm924W5dIgorCisjOiBmaWxlaW8uYzoxNzk5Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbQ0hZQkEgUNhFVk9EVV0iCisKKyM6IGZpbGVpby5jOjE4MDYKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbQ0hZQlkgyFRFTs1dIgorCisjOiBmaWxlaW8uYzoyMDEzCittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIk5lbHplIG5hbOl6dCBkb+hhc279IHNvdWJvciBwcm8ga29udmVyemkiCisKKyM6IGZpbGVpby5jOjIwMjAKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIktvbnZlcnplIHMgJ2NoYXJjb252ZXJ0JyBzZSBuZXpkYfhpbGEiCisKKyM6IGZpbGVpby5jOjIwMjMKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICJuZWx6ZSDo7XN0IHb9c3R1cCAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyNDA3Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIiIKKyJFMjAzOiBBdXRvbWF0aWNr6SBw+O1rYXp5IHNtYXphbHkg6GkgZGVha3Rpdm92YWx5IGJ1ZmZlciwga3Rlcv0gbexsIGL9dCAiCisidWxvnmVuIgorCisjOiBmaWxlaW8uYzoyNDMwCittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IEF1dG9tYXRpY2v9IHD47WtheiBuZehla2Fu/W0genD5c29iZW0gem3sbmlsIHBv6GV0IPjhZGv5IgorCisjOiBmaWxlaW8uYzoyNDk2IGZpbGVpby5jOjI1MTMKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAibmVu7SBzb3Vib3JlbSBhbmkgemH47Xplbu1tIG5hIG7sniBsemUgemFwaXNvdmF0IgorCisjOiBmaWxlaW8uYzoyNTU1Cittc2dpZCAiaXMgcmVhZC1vbmx5ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgImplIHBvdXplIHBybyDodGVu7SAocG91nmlqdGUgISBwcm8gdnludWNlbu0pIgorCisjOiBmaWxlaW8uYzoyODUxCittc2dpZCAiQ2FuJ3Qgd3JpdGUgdG8gYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVsemUgemFwaXNvdmF0IGRvIHrhbG+ebu1obyBzb3Vib3J1IChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjI4NjMKK21zZ2lkICJDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiQ2h5YmEgcPhpIHV6YXbtcuFu7SB64Wxvnm7taG8gc291Ym9ydSAocG91nmlqdGUgISBwcm8gdnludWNlbu0pIgorCisjOiBmaWxlaW8uYzoyODY1Cittc2dpZCAiQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVsemUgbmHo7XN0IHNvdWJvciBwcm8geuFsb2h1IChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjI4ODEKK21zZ2lkICJDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIk5lbHplIHZ5dHZv+Gl0IHrhbG+ebu0gc291Ym9yIChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjI5NzAKK21zZ2lkICJDYW4ndCBtYWtlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIk5lbHplIHZ5dHZv+Gl0IHrhbG+ebu0gc291Ym9yIChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyMgcmVzb3VyY2UgZm9yayA/IQorIzogZmlsZWlvLmM6MzAzMgorbXNnaWQgIlRoZSByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICInUmVzb3VyY2UgZm9yaycgYnVkZSB6dHJhY2VuIChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjMxMjEKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogTmVsemUgbmFq7XQgZG/oYXNu/SB0ZW1wIHNvdWJvciBwcm8geuFwaXMiCisKKyM6IGZpbGVpby5jOjMxMzkKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAodXNlICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogTmVsemUgcPhldulzdCAocG91nmlqdGUgISBwcm8geuFwaXMgYmV6IHD4ZXZvZHUpIgorCisjOiBmaWxlaW8uYzozMTc2Cittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogTmVsemUgb3RldvjtdCBw+Glwb2plbv0gc291Ym9yIHBybyB64XBpcyIKKworIzogZmlsZWlvLmM6MzE4MAorbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogTmVsemUgb3RldvjtdCBzb3Vib3IgcHJvIHrhcGlzIgorCisjOiBmaWxlaW8uYzozNDIzCittc2dpZCAiQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJWb2zhbu0gY2xvc2Ugc2VsaGFsbyIKKworIzogZmlsZWlvLmM6MzQ4MQorbXNnaWQgIndyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiY2h5YmEgcPhpIHrhcGlzdSwga29udmVyemUgc2UgbmV6ZGH4aWxhIgorCisjOiBmaWxlaW8uYzozNDg3Cittc2dpZCAid3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIKK21zZ3N0ciAiY2h5YmEgcPhpIHVrbOFk4W7tIChqZSB2b2xu6SBt7XN0byBuYSBkaXNrdT8pIgorCisjOiBmaWxlaW8uYzozNTYwCittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBDSFlCQSBQ2EVWT0RVIgorCisjOiBmaWxlaW8uYzozNTc2Cittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIlt6YfjtemVu7V0iCisKKyM6IGZpbGVpby5jOjM1ODEKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW05vdv1dIgorCisjOiBmaWxlaW8uYzozNjAzCittc2dpZCAiIFthXSIKK21zZ3N0ciAiIFtwXSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIHD4aXBvamVuIgorCisjOiBmaWxlaW8uYzozNjA1Cittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt1XSIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgdWxvnmVuIgorCisjOiBmaWxlaW8uYzozNjU1Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IHBhdGNobW9kZTogbmVsemUgdWxvnml0IHD5dm9kbu0gc291Ym9yIgorCisjOiBmaWxlaW8uYzozNjc3Cittc2dpZCAiRTIwNjogcGF0Y2htb2RlOiBjYW4ndCB0b3VjaCBlbXB0eSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA2OiBwYXRjaG1vZGU6IG5lbHplIHphcGlzb3ZhdCBkbyBwcuF6ZG7paG8gcPl2b2Ru7WhvIHNvdWJvcnUiCisKKyM6IGZpbGVpby5jOjM2OTIKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IE5lbHplIHNtYXphdCB64Wxvnm7tIHNvdWJvciIKKworIzogZmlsZWlvLmM6Mzc0NAorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZBUk9WwU7NOiBPYnNhaCBw+XZvZG7taG8gc291Ym9ydSBt+Z5lIGL9dCB6dHJhY2VuIOhpIHBvmmtvemVuXG4iCisKKyM6IGZpbGVpby5jOjM3NDYKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICJuZXVrb27odWp0ZSBlZGl0b3IgZPjtdmUsIG5lniBidWRlIHNvdWJvciD6c3Dsmm7sIHVsb55lbiEiCisKKyM6IGZpbGVpby5jOjM4MjYKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjM4MjYKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MgZm9ybeF0XSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM4NDAKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozODY3Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEg+OFkZWssICIKKworIzogZmlsZWlvLmM6Mzg2OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIPjhZGv5LCAiCisKKyM6IGZpbGVpby5jOjM4NzIKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSB6bmFrIgorCisjOiBmaWxlaW8uYzozODc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgem5ha/ksICIKKworIzogZmlsZWlvLmM6Mzg4NAorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIlue4WRu/SBlb2xdIgorCisjOiBmaWxlaW8uYzozODg0Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW25l+nBsbv0gcG9zbGVkbu0g+OFkZWtdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjM5MDMKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIlZBUk9WwU7NOiBvZCBqZWhvIG5h6HRlbu0gYnlsIG9ic2FoIHNvdWJvcnUgem3sbuxuISEhISIKKworIzogZmlsZWlvLmM6MzkwNQorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiQ2hjZXRlIGplaiBvcHJhdmR1IHVsb55pdCIKKworIzogZmlsZWlvLmM6NDg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogQ2h5YmEgcPhpIHrhcGlzdSBkbyBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ4NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IENoeWIgcPhpIHV6YXbtcuFu7SBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ4NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IENoeWJhIHD4aSDodGVu7SBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjUwMzUKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIHpydZppbCBidWZmZXIiCisKKyM6IGZpbGVpby5jOjUwNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogd2ExOiBzb3Vib3IgXCIlc1wiIGppniBuZW7tIGRvc3R1cG79IgorCisjOiBmaWxlaW8uYzo1MDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiIgorIlcxMjogVmFyb3bhbu06IHNvdWJvciBcIiVzXCIgYnlsIHBvIHBv6OF0a3UgZWRpdGFjZSB6bexu7G4gYSBidWZmZXIgdmUgVmltICIKKyJ0YWvpIgorCisjOiBmaWxlaW8uYzo1MDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IHdjMjogc291Ym9yIFwiJXNcIiBieWwgcG8gcG/o4XRrdSBlZGl0YWNlIHpt7G7sbiIKKworIzogZmlsZWlvLmM6NTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTY6IFZhcm924W7tOiBN82Qgc291Ym9ydSBcIiVzXCIgYnlsIHpt7G7sbiBvZCB6YXBv6G51dO0gZWRpdGFjZSIKKworIzogZmlsZWlvLmM6NTA3MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IHdjNDogcG8gcG/o4XRrdSBlZGl0YWNlIHZ5dHZv+GVuIHNvdWJvciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjUwODgKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICJWYXJvduFu7SIKKworIzogZmlsZWlvLmM6NTA4OQorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisiJk5haHLhdCBzb3Vib3IiCisKKyM6IGZpbGVpby5jOjUxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IE5lbHplIHpub3Z1b3RldvjtdCBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU2NzAKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS1WeW1heuFuby0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NTgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6IFNrdXBpbmEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGZpbGVpby5jOjU5NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6IE5lcPjtcHVzdG79IHpuYWsgcG8gKjogJXMiCisKKyM6IGZpbGVpby5jOjU5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IFVk4Wxvc3QgJXMgbmVleGlzdHVqZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo2MTE1Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBBdXRvbWF0aWNr6SBw+O1rYXp5IC0tLSIKKworIzogZmlsZWlvLmM6NjM4NgorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBBdXRvbWF0aWNr6SBw+O1rYXp5IG5lbHplIHNwdXN0aXQgcHJvIFaKRUNITlkgdWThbG9zdGkiCisKKyM6IGZpbGVpby5jOjY0MDkKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIo7hZG7pIHZ5aG92dWrtY+0gYXV0b21hdGlja+kgcPjta2F6eSIKKworIzogZmlsZWlvLmM6NjY4MQorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IHZub/hlbu0gYXV0b21hdGlja+lobyBw+O1rYXp1IHD47WxpmiBobHVib2vhIgorCisjOiBmaWxlaW8uYzo2OTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgYXV0b21hdGlja+kgcPjta2F6eSBwcm8gXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2OTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAic3BvdZp07W0gJXMiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6NzA0NAorIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiQXV0b21hdGlja/0gcPjta2F6ICVzIgorCisjOiBmaWxlaW8uYzo3NTY2Cittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogQ2h5Yu0gey4iCisKKyM6IGZpbGVpby5jOjc1NjgKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiBDaHli7SB9LiIKKworIzogZm9sZC5jOjY2Cittc2dpZCAiTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAijuFkbv0geuFoeWIgbmVieWwgbmFsZXplbiIKKworIzogZm9sZC5jOjU1NAorbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBwb21vY+0gYWt0deFsbu0gJ2ZvbGRtZXRob2QnIG5lbHplIHZ5dHZv+Gl0IHrhaHliIgorCisjOiBmb2xkLmM6NTU2Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IHBvbW9j7SBha3R14Wxu7SAnZm9sZG1ldGhvZCcgbmVsemUgdnl0dm/4aXQgeuFoeWIiCisKKyM6IGZvbGQuYzoxNzAwCittc2dpZCAiRTIyMTogJ2NvbW1lbnRzdHJpbmcnIGlzIGVtcHR5IgorbXNnc3RyICJFMjIxOiB2b2xiYSAnY29tbWVudHN0cmluZycgamUgcHLhemRu4SIKKworIzogZ2V0Y2hhci5jOjI2OAorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjogUPhpZGF0IGRvIGJ1ZmZlcnUgcHJvIOh0ZW7tIgorCisjOiBnZXRjaGFyLmM6MjExNAorbXNnaWQgIkUyMjM6IHJlY3Vyc2l2ZSBtYXBwaW5nIgorbXNnc3RyICJFMjIzOiByZWt1cnppdm7tIG1hcG924W7tIgorCisjOiBnZXRjaGFyLmM6Mjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogcHJvICVzIGppniBnbG9i4Wxu7SB6a3JhdGthIGppniBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjI5NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBwcm8gJXMgammeIGdsb2LhbG7tIG1hcG924W7tIGppniBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjMwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogcHJvICVzIGppniB6a3JhdGthIGppniBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjMwOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IHBybyAlcyBqaZ4gbWFwb3bhbu0gammeIGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6MzE2MworbXNnaWQgIk5vIGFiYnJldmlhdGlvbiBmb3VuZCIKK21zZ3N0ciAijuFkbuEgemtyYXRrYSBuZWJ5bCBuYWxlemVuYSIKKworIzogZ2V0Y2hhci5jOjMxNjUKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICKO4WRu6SBtYXBvduFu7SBuZWJ5bG8gbmFsZXplbm8iCisKKyM6IGdldGNoYXIuYzozOTkwCittc2dpZCAiRTIyODogbWFrZW1hcDogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFMjI4OiBtYWtlbWFwOiBuZXD47XB1c3Ru/SBt82QiCisKKyM6IGd1aS5jOjE4MQorbXNnaWQgIkUyMjk6IENhbm5vdCBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFMjI5OiBOZWx6ZSBzcHVzdGl0IEdVSSIKKworIzogZ3VpLmM6MzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBOZWx6ZSDo7XN0IHogXCIlc1wiIgorCisjOiBndWkuYzo0MzEKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IHZvbGJhICdndWlmb250d2lkZScgamUgY2h5Ym7sIG5hc3RhdmVuYSIKKworIzogZ3VpLmM6MzkyNgorbXNnaWQgIkVycm9yIgorbXNnc3RyICJDaHliYSIKKworIzogZ3VpLmM6MzkyNworbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPG5lbHplIG90ZXb47XQ+ICIKKworIzogZ3VpX2F0X2ZzLmM6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGZvbnQgJXMiCittc2dzdHIgInZpbV9TZWxGaWxlOiBw7XNtbyAlcyBuZW7tIGRvc3R1cG7pIgorCisjOiBndWlfYXRfZnMuYzoyNTM4Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAidmltX1NlbEZpbGU6IG5lbHplIHNlIHZy4XRpdCBkbyBha3R14Wxu7WhvIGFkcmVz4fhlIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJO4XpldiBjZXN0eToiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjMKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTogbmVsemUgemppc3RpdCBha3R14Wxu7SBhZHJlc+H4IgorCisjOiBndWlfYXRfZnMuYzoyNTcxIGd1aV9tb3RpZi5jOjE2MDcKK21zZ2lkICJPSyIKK21zZ3N0ciAiT0siCisKKyMuICdDYW5jZWwnIGJ1dHRvbgorIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfZ3RrLmM6MTY4MyBndWlfbW90aWYuYzoxNjAyIGd1aV9tb3RpZi5jOjI4MjMKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIlpydZppdCIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICJQ+O1wcmF2ZWsgcG9zdW5vdmFj7SBsaZp0eTogbmVsemUgemppc3RpdCBnZW9tZXRyaWkgb2Jy4XprdSIKKworIzogZ3VpX2F0aGVuYS5jOjE5MjggZ3VpX21vdGlmLmM6MTg1NQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIlZpbSBkaWFsb2ciCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IEJhbGxvb25FdmFsIG5lbHplIHZ5dHZv+Gl0IHNlIHpwcuF2b3UgYSB64XJvdmXyIHpw7HRu/W0gdm9s4W7tbSIKKworIzogZ3VpX2d0ay5jOjExNDQKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gZGlhbG9nLi4iCisKKyM6IGd1aV9ndGsuYzoxNTE5IGd1aV9tb3RpZi5jOjI3NDIKK21zZ2lkICJWSU0gLSBTZWFyY2ggYW5kIFJlcGxhY2UuLi4iCittc2dzdHIgIlZJTSAtIE5hbOl6dCBhIG5haHJhZGl0Li4uIgorCisjOiBndWlfZ3RrLmM6MTUyNCBndWlfbW90aWYuYzoyNzQ0Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBOYWzpenQuLi4iCisKKyM6IGd1aV9ndGsuYzoxNTQ3IGd1aV9tb3RpZi5jOjI4NjIKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICJWeWhsZWRhdDoiCisKKyM6IGd1aV9ndGsuYzoxNTY1IGd1aV9tb3RpZi5jOjI4OTQKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICJOb3b9IHRleHQ6IgorCisjLiBleGFjdCBtYXRjaCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE1OTcgZ3VpX21vdGlmLmM6Mjk5NgorbXNnaWQgIk1hdGNoIGV4YWN0IHdvcmQgb25seSIKK21zZ3N0ciAiaGxlZGF0IHBvdXplIGNlbOEgc2xvdmEiCisKKyM6IGd1aV9ndGsuYzoxNjA5IGd1aV9tb3RpZi5jOjI5NjQKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIlNt7HIiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MTYyMSBndWlfbW90aWYuYzoyOTc2Cittc2dpZCAiVXAiCittc2dzdHIgIk5haG9ydSIKKworIzogZ3VpX2d0ay5jOjE2MjUgZ3VpX21vdGlmLmM6Mjk4NAorbXNnaWQgIkRvd24iCittc2dzdHIgIkRvbPkiCisKKyMuICdGaW5kIE5leHQnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NDcgZ3VpX21vdGlmLmM6Mjc2NgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAiTmFq7XQgZGFsmu0iCisKKyMuICdSZXBsYWNlJyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjY0IGd1aV9tb3RpZi5jOjI3ODMKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJOYWhyYWRpdCIKKworIy4gJ1JlcGxhY2UgQWxsJyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjczIGd1aV9tb3RpZi5jOjI3OTYKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAiTmFocmFkaXQgdpplIgorCisjOiBndWlfZ3RrX3gxMS5jOjEwNzYgZ3VpX3gxMS5jOjExOTkKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBuZWx6ZSBvdGV2+O10IGRpc3BsYXkiCisKKyM6IGd1aV9ndGtfeDExLmM6MjQzMyBndWlfeDExLmM6MjAwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiBOZXpu4W3hIHNhZGEgcO1zZW06ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0NjAKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAiVv1i7HIgcO1zbWEiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcwMiBndWlfbWFjLmM6Mjc4MCBndWlfdzQ4LmM6MTE5NyBndWlfeDExLmM6MTgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiBOZXpu4W3pIHDtc21vOiAlcyIKKworIzogZ3VpX2d0a194MTEuYzoyNzEzIGd1aV94MTEuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogUO1zbW8gXCIlc1wiIG5lbeEgcGV2bm91IJrt+Gt1IgorCisjOiBndWlfZ3RrX3gxMS5jOjI4NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MjogQ29sb3IgbmFtZSBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkUyNDI6IE5lem7hbekgam3pbm8gYmFydnk6ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkgdWkuYzoxOTI5Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiTe1zdG8gcHLhZG7pIHNjaHLhbmt5IHBvdZ5pdG8gQ1VUX0JVRkZFUjAiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDEgZ3VpX21vdGlmLmM6MTYwNAorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiRmlsdHIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDMKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiQWRyZXPh+GUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDUKK21zZ2lkICJIZWxwIgorbXNnc3RyICJO4XBvduxkYSIKKworIzogZ3VpX21vdGlmLmM6MTYwNgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJTb3Vib3J5IgorCisjOiBndWlfbW90aWYuYzoxNjA4Cittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICJW/WLsciIKKworIzogZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIlpw7HQiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFMjM1OiBOZWx6ZSBuYejtc3QgWmFwIGZvbnQgJyVzJyIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkUyMzU6IE5lbHplIHBvdZ7tdCBmb250ICVzIgorCisjOiBndWlfcmlzY29zLmM6MTE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBNaXNzaW5nIGNvbG9yOiAlcyIKK21zZ3N0ciAiRTI0MjogQ2h5Yu0gYmFydmE6ICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJQb3PtbOFtIHNpZ27hbCBrIHVrb27oZW7tIHN5bm92c2vpaG8gcHJvY2VzdS5cbiIKKworIzogZ3VpX3czMi5jOjgyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogQXJndW1lbnQgbmVwb2Rwb3JvduFuOiBcIi0lc1wiOyBQb3WeaWp0ZSBPTEUgdmVyemkuIgorCisjOiBndWlfdzQ4LmM6MjA2OAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk5hau10IPhldOx6ZWMgKHBvdZ5panRlICdcXFxcJyBrIG5hbGV6ZW7tICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjA5MworbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk5hau10ICYgTmFocmFkaXQgKHBvdZ5panRlICdcXFxcJyBrIG5hbGV6ZW7tICdcXCcpIgorCisjOiBndWlfeDExLmM6MTQxOQorbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODogbmVsemUgYWxva292YXQgcG9sb55rdSBiYXJldm7pIG1hcHkuIE7sa3RlcukgYmFydnkgbW9ob3UgYv10ICIKKyJuZXNwcuF2bukiCisKKyM6IGd1aV94MTEuYzoxOTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBw7XNtYSBwcm8gbuFzbGVkdWrtY+0gem5ha2926SBzYWR5IGNoeWLtIHYgc2Fk7CBw7XNlbSAlczoiCisKKyM6IGd1aV94MTEuYzoyMDM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IG7hemV2IHNhZHkgcO1zZW06ICVzIgorCisjOiBndWlfeDExLmM6MjAzNgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJQ7XNtbyAnJXMnIG5lbeEgcGV2bm91IJrt+Gt1IgorCisjOiBndWlfeDExLmM6MjA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IG7hemV2IHNhZHkgcO1zZW06ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJQ7XNtbzA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJQ7XNtbzE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICKK7fhrYSBw7XNtYSVkIG5lbu0gZHZvam7hc29ibGVtIJrt+Gt5IHDtc21hMFxuIgorCisjOiBndWlfeDExLmM6MjA1OQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIort+GthIHDtc21hMDogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyKK7fhrYSBw7XNtYTE6ICVsZFxuIgorIlxuIgorCisjOiBndWlfeDExLmM6MjIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IG5lbHplIGFsb2tvdmF0IGJhcnZ1ICVzIgorCisjOiBndWlfeDExLmM6MzI1NgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogQ2h5YmEgLS0gbmVsemUgcPhl6O1zdCBzaWduIGRhdGEhIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogQ1lCQSBIYW5ndWwgYXV0b21hdHUiCisKKyM6IGlmX2NzY29wZS5jOjY3Cittc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgorbXNnc3RyICJQ+GlkYXQgbm92b3UgZGF0YWLhemkiCisKKyM6IGlmX2NzY29wZS5jOjY5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiSGxlZOFu7SB2em9ya3UiCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIlpvYnJheml0IHR1dG8genBy4XZ1IgorCisjOiBpZl9jc2NvcGUuYzo3MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJVa29u6Gl0IHNwb2plbu0iCisKKyM6IGlmX2NzY29wZS5jOjc1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAiWm5vdnUgaW5pY2lhbGl6b3ZhdCB2mmVjaG5hIHNwb2plbu0iCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiWm9icmF6aXQgc3BvamVu7SIKKworIzogaWZfY3Njb3BlLmM6MTA4Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICJUZW50byBjc2NvcGUgcPjta2F6IG5lcG9kcG9ydWplIHJvemTsbGVu7SBva25hLlxuIgorCisjOiBpZl9jc2NvcGUuYzoxNDMKK21zZ2lkICJVc2FnZTogY3N0YWcgPGlkZW50PiIKK21zZ3N0ciAiUG91nml07TogY3N0YWcgPG9kc2F6ZW7tPiIKKworIzogaWZfY3Njb3BlLmM6MTk5Cittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiB0YWcgbmVuYWxlemVuIgorCisjOiBpZl9jc2NvcGUuYzo0MDcgaWZfY3Njb3BlLmM6NDUxCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAic3RhdCglcykgY2h5YmE6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0NjAgaWZfY3Njb3BlLmM6NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiUPhpZOFuYSBjc2NvcGUgZGF0YWLhemUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIiVzIG5lbu0gYW5pIGFkcmVz4fhlbSBhbmkgc3By4XZub3UgY3Njb3BlIGRhdGFi4XrtIgorCisjOiBpZl9jc2NvcGUuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiY2h5YmEgcPhpIOh0ZW7tIGNzY29wZSBzcG9qZW7tICVkIgorCisjOiBpZl9jc2NvcGUuYzo2MzMKK21zZ2lkICJ1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAibmV6buFt/SB0eXAgY3Njb3BlIGhsZWThbu0iCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJuZWx6ZSB2eXR2b/hpdCBjc2NvcGUgcm91cnkiCisKKyM6IGlmX2NzY29wZS5jOjc0NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJzcHWadOxu7SBjc19jcmVhdGVfY29ubmVjdGlvbiBzZWxoYWxvIgorCisjOiBpZl9jc2NvcGUuYzo3NTUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiB2b2zhbu0gZmRvcGVuIHBybyB0b19mcCBzZWxoYWxvIgorCisjOiBpZl9jc2NvcGUuYzo3NTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiB2b2zhbu0gZmRvcGVuIHBybyBmcl9mcCBzZWxoYWxvIgorCisjOiBpZl9jc2NvcGUuYzo3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIp7hZG7hIGNzY29wZSBzcG9qZW7tIgorCisjOiBpZl9jc2NvcGUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1OTogbm8gbWF0Y2hlcyBmb3VuZCBmb3IgY3Njb3BlIHF1ZXJ5ICVzIG9mICVzIgorbXNnc3RyICJFMjU5OiBjc2NvcGUgaGxlZOFu7SAlcyB2em9ya3UgJXMgbmVuYZpsbyCe4WRub3Ugc2hvZHUiCisKKyM6IGlmX2NzY29wZS5jOjg5OQorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAicPjta2F6eSBjc2NvcGU6XG4iCisKKyM6IGlmX2NzY29wZS5jOjkwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKVxuIgorbXNnc3RyICIlLTVzOiAlLTMwcyAoUG91nml07TogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJkdXBsaWNpdG7tIGNzY29wZSBkYXRhYuF6ZSBuZWJ5bGEgcPhpZOFuYSIKKworIzogaWZfY3Njb3BlLmM6OTgxCittc2dpZCAibWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgImRvc2GeZW4gbWF4aW3hbG7tIHBv6GV0IGNzY29wZSBzcG9qZW7tIgorCisjOiBpZl9jc2NvcGUuYzoxMTAyCittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiBjb25uZWN0aW9uIHNwb2plbu0gbmVuYWxlemVubyIKKworIzogaWZfY3Njb3BlLmM6MTEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IGNvbm5lY3Rpb24gc3BvamVu7SAlcyBuZW5hbGV6ZW5vIgorCisjOiBpZl9jc2NvcGUuYzoxMTQxCittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gY2xvc2VkIgorbXNnc3RyICJjbG9zZWQgc3BvamVu7SB1emF2+GVubyIKKworIzogaWZfY3Njb3BlLmM6MTE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWRcbiIKK21zZ3N0ciAiY3Njb3BlIHNwb2plbu0gJXMgdXphdvhlbm9cbiIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxMjkwCittc2dpZCAiZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIm9zdWRvduEgY2h5YmEgdiBjc19tYW5hZ2VfbWF0Y2hlcyIKKworIzogaWZfY3Njb3BlLmM6MTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJFMjYyOiBw+Gkg6HRlbu0gY3Njb3BlIHNwb2plbu0gJWQiCisKKyM6IGlmX2NzY29wZS5jOjE0NDkKK21zZ2lkICJjb3VsZG4ndCBtYWxsb2NcbiIKK21zZ3N0ciAidm9s4W7tIG1hbGxvYyBzZWxoYWxvXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIHRhZzogJXNcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorbXNnaWQgIiAgICMgICBsaW5lIgorbXNnc3RyICIgICAjICAg+OFkZWsiCisKKyM6IGlmX2NzY29wZS5jOjE0NjAKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgIm7hemV2IHNvdWJvcnUvIGtvbnRleHQvIPjhZGVrXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MTgKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAiVpplY2hueSBjc2NvcGUgZGF0YWLhemUgcmVzZXRvduFueSIKKworIzogaWZfY3Njb3BlLmM6MTc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICKe4WRu6SBjc2NvcGUgc3BvamVu7VxuIgorCisjOiBpZl9jc2NvcGUuYzoxNzg5Cittc2dpZCAiICMgcGlkICAgIGRhdGFiYXNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorbXNnc3RyICIgIyBwaWQgICAgbuF6ZXYgZGF0YWLhemUgICAgICAgICAgICAgICAgICAgICAgcPhlZHBvbmEgY2VzdHlcbiIKKworIzogaWZfY3Njb3BlLmM6MTgwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlMmQgJS01bGQgICUtMzRzICA8bm9uZT5cbiIKK21zZ3N0ciAiJTJkICUtNWxkICAlLTM0cyAgPJ7hZG79PlxuIgorCisjOiBpZl9weXRob24uYzozNzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IExpdHVqaSwgdGVudG8gcPjta2F6IGplIGRlYWt0aXZvduFuOyBrbmlob3ZudSBqYXp5a2EgUHl0aG9uIG5lbHplICIKKyJuYWhy4XQuIgorCisjOiBpZl9weXRob24uYzo1NzYKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIm5lbHplIHNtYXphdCBhdHJpYnV0eSBPdXRwdXRPYmplY3QiCisKKyM6IGlmX3B5dGhvbi5jOjU4MworbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgInNvZnRzcGFjZSBtdXPtIGL9dCBrbGFkbukgY2Vs6SDo7XNsbyIKKworIzogaWZfcHl0aG9uLmM6NTkxCittc2dpZCAiaW52YWxpZCBhdHRyaWJ1dGUiCittc2dzdHIgImNoeWJu/SBhdHJpYnV0IgorCisjOiBpZl9weXRob24uYzo2MzAgaWZfcHl0aG9uLmM6NjQ0Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpIHZ5nmFkdWplIHNlem5hbSD4ZXTsemP5IgorCisjOiBpZl9weXRob24uYzo3NzAKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBjaHliYSBw+GkgaW5pY2lhbGl6YWNpIEkvTyBvYmpla3T5IgorCisjOiBpZl9weXRob24uYzo5NTUgaWZfdGNsLmM6MTM5MQorbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAiQ2h5Ym79IHb9cmF6IgorCisjOiBpZl9weXRob24uYzo5NjkgaWZfdGNsLmM6MTM5NgorbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAicG9kcG9yYSB2/XJhevkgYnlsYSB2eXBudXRhIHD4aSBw+GVrbGFkdSBwcm9ncmFtdSIKKworIzogaWZfcHl0aG9uLmM6OTgyCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAicG9rdXMgbyBvZGtheiBuYSBzbWF6YW79IGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6OTk3IGlmX3B5dGhvbi5jOjEwMzggaWZfcHl0aG9uLmM6MTEwMiBpZl90Y2wuYzoxMjAzCittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICLo7XNsbyD44WRrdSBtaW1vIHJvenNhaCIKKworIzogaWZfcHl0aG9uLmM6MTIzNQorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXIgb2JqZWt0IChzbWF64W4pIG5hICU4bFg+IgorCisjOiBpZl9weXRob24uYzoxMzI2IGlmX3RjbC5jOjgyNQorbXNnaWQgImludmFsaWQgbWFyayBuYW1lIgorbXNnc3RyICJjaHlibukgam3pbm8gem5h6Gt5IgorCisjOiBpZl9weXRob24uYzoxNjAxCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIp7hZG79IHRha292/SBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjE2ODkKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICJwb2t1cyBvIG9ka2F6IG5hIHNtYXphbukgb2tubyIKKworIzogaWZfcHl0aG9uLmM6MTczNAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAiYXRyaWJ1dCBwb3V6ZV9wcm9f6HRlbu0iCisKKyM6IGlmX3B5dGhvbi5jOjE3NDcKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgInVt7XN07G7tIGt1cnpvcnUgbWltbyBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iamVrdCBva25hIChzbWF64W4pIG5hICU4bFg+IgorCisjOiBpZl9weXRob24uYzoxODM2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjxvYmpla3Qgb2tuYSAobmV6buFt/SkgbmEgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxva25vICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkxNAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICKe4WRu6SB0YWtvdukgb2tubyIKKworIzogaWZfcHl0aG9uLmM6MjE0NCBpZl9weXRob24uYzoyMTc1IGlmX3B5dGhvbi5jOjIyMjUgaWZfcHl0aG9uLmM6MjI4NQorIzogaWZfcHl0aG9uLmM6MjQwMiBpZl9weXRob24uYzoyNDU0IGlmX3RjbC5jOjY3MyBpZl90Y2wuYzo3MTggaWZfdGNsLmM6NzkyCisjOiBpZl90Y2wuYzo4NjIgaWZfdGNsLmM6MTk4NworbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIm5lbHplIHVsb55pdCBpbmZvcm1hY2UgcHJvIHD47WtheiB1bmRvIgorCisjOiBpZl9weXRob24uYzoyMTQ2IGlmX3B5dGhvbi5jOjIyMzIgaWZfcHl0aG9uLmM6MjI5NgorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAibmVsemUgc21hemF0IPjhZGVrIgorCisjOiBpZl9weXRob24uYzoyMTc3IGlmX3B5dGhvbi5jOjIzMTIgaWZfdGNsLmM6Njc5IGlmX3RjbC5jOjIwMDkKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICJuZWx6ZSBuYWhyYWRpdCD44WRlayIKKworIzogaWZfcHl0aG9uLmM6MjMyOCBpZl9weXRob24uYzoyNDA0IGlmX3B5dGhvbi5jOjI0NjIKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIm5lbHplIHZsb55pdCD44WRlayIKKworIzogaWZfcHl0aG9uLmM6MjU2NgorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAi+GV07HplYyBuZXNt7SBvYnNhaG92YXQgem5ha3kgbm926WhvIPjhZGt1IgorCisjOiBpZl9ydWJ5LmM6Mzk0Cittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjY2OiBMaXR1amksIGFsZSB0ZW50byBw+O1rYXogamUgZGVha3Rpdm924W47IGtuaWhvdm51IGphenlrYSBSdWJ5IG5lbHplICIKKyJuYWhy4XQuIgorCisjOiBpZl9ydWJ5LmM6NDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IG5lem7hbf0gbG9uZ2ptcCBzdGF2ICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIlByb2hvemVu7SBpbXBsZW1lbnRhY2UvZGVmaW5pY2UiCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlpvYnJhemVu7SBiYXNlIGNsYXNzIHoiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJab2JyYXplbu0gb3ZlcnJpZGRlbiBtZW1iZXIgZnVua2NlIgorCisjOiBpZl9zbmlmZi5jOjcwCittc2dpZCAiUmV0cmlldmUgZnJvbSBmaWxlIgorbXNnc3RyICJabm92dXrtc2vhbm8gemUgc291Ym9ydSIKKworIzogaWZfc25pZmYuYzo3MQorbXNnaWQgIlJldHJpZXZlIGZyb20gcHJvamVjdCIKK21zZ3N0ciAiWm5vdnV67XNr4W5vIHogcHJvamVrdHUiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiWm5vdnrtc2vhbm8gemUgdpplY2ggcHJvamVrdPkiCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiWm5vdnV67XNr4W5vIgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIlpvYnJhemVu7SB6ZHJvamUiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAiTmFq7XQgc3ltYm9sIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJQcm9obO2eZXQgY2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiWm9icmF6ZW7tIGNsYXNzIHYgaGllcmFyY2hpaSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIlpvYnJhemVu7SBjbGFzcyB2IHJlc3RyaWN0ZWQgaGllcmFyY2hpaSIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmIG9ka2F6dWplIG5hIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiBvZGthem92YWwgbmEiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIG3hIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHBvdZ5pdCIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAiWm9icmF6ZW7tIGRvY3VtZW50YWNlIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIkdlbmVyb3bhbmEgZG9rdW1lbnRhY2UgcHJvIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisiTmVsemUgc2UgcPhpcG9qaXQgayBTTmlGRisuIFprb250cm9sdWp0ZSBwcm9t7G5u6SAoc25pZmZlbWFjcyBtdXPtICIKKyJi/XQpdXZlZGVuYSB2ICRQQVRILlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogQ2h5YmEgcPhpIOh0ZW7tLiBPZHBvamVubyIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrIGplIHBy4XbsICIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICJuZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJw+Glwb2plbiIKKworIzogaWZfc25pZmYuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3NTogVW5rbm93biBTTmlGRisgcmVxdWVzdDogJXMiCittc2dzdHIgIkUyNzU6IE5lem7hbf0gcG+eYWRhdmVrIFNOaUZGKzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IENoeWJu6SBw+Glwb2plbu0gayBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAxMAorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgbmVw+Glwb2plbiIKKworIzogaWZfc25pZmYuYzoxMDE5Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogTmVu7SBTTmlGRisgYnVmZmVyIgorCisjOiBpZl9zbmlmZi5jOjEwODQKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiBDaHliYSBw+GkgeuFwaXN1LiBPZHBvamVuby4iCisKKyM6IGlmX3RjbC5jOjQwNworbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAiY2h5Ym79IG7hemV2IGJ1ZmZlcnUiCisKKyM6IGlmX3RjbC5jOjQ1MyBpZl90Y2wuYzo5MjAgaWZfdGNsLmM6MTA5OQorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgIm5lbu0gamWadOwgcG9kcG9yb3bhbm8iCisKKyM6IGlmX3RjbC5jOjQ5MAorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICJuZXpu4W3hIHZvbGJhIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc2MworbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAibmVsemUgbmFzdGF2aXQg+OFka3kiCisKKyM6IGlmX3RjbC5jOjgzNAorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAiem5h6GthIG5lbu0gbmFzdGF2ZW5hIgorCisjOiBpZl90Y2wuYzo4NDAgaWZfdGNsLmM6MTA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICL44WRlayAlZCBzbG91cGVjICVkIgorCisjOiBpZl90Y2wuYzo4NzAKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICJuZWx6ZSB2bG+eaXQvcPhpcG9qaXQg+OFkZWsiCisKKyM6IGlmX3RjbC5jOjEyNTcKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAibmV6buFt/SBw+O16bmFrOiAiCisKKyM6IGlmX3RjbC5jOjEzMjcKK21zZ2lkICJ1bmtub3duIHZpbU9wdGlvbiIKK21zZ3N0ciAibmV6buFt4SB2aW1PcHRpb24iCisKKyM6IGlmX3RjbC5jOjE0MTIKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgInD4ZXJ1mmVu7SB6IGts4XZlc25pY2UiCisKKyM6IGlmX3RjbC5jOjE0MTcKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgImNoeWJhIHZpbSIKKworIzogaWZfdGNsLmM6MTQ2MAorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAibmVsemUgdnl0dm/4aXQgcPjta2F6IGJ1ZmZlcnUvb2tuYTogb2JqZWt0IHNtYXrhbiIKKworIzogaWZfdGNsLmM6MTUzNAorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyJuZWx6ZSB6YXJlZ2lzdHJvdmF0IHD47WtheiB6cOx0bulobyB2b2zhbu06IGJ1ZmZlci9va25vIGppniBieWxvIHNtYXrhbm8iCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTUxCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvICIKKyJ2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgcG+aa296ZW4hPyBPem5hbXRlLCBwcm9z7W0sIHR1dG8gY2h5YnUgbmEgIgorInZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU1MgorbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJuZWx6ZSB6YXJlZ2lzdHJvdmF0IHD47WtheiB6cOx0bulobyB2b2zhbu06IG9ka2F6IG5hIGJ1ZmZlci9va25vIG5lbmFsZXplbiIKKworIzogaWZfdGNsLmM6MTcxMworbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkxpdHVqaSwgYWxlIHRlbnRvIHD47WtheiBqZSBkZWFrdGl2b3bhbjsga25paG92bnUgamF6eWthIFRjbCBuZWx6ZSBuYWhy4XQuIgorCisjOiBpZl90Y2wuYzoxODc1Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MTogVENMIENIWUJBOiBu4XZyYXRvdv0ga/NkIG5lbu0gY2Vs6SDo7XNsbyE/IE96bmFtdGUsIHByb3PtbSwgdHV0byBjaHlidSAiCisibmEgdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxOTk1Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICJuZWx6ZSBw+GXo7XN0IPjhZGVrIgorCisjOiBpZl94Y21kc3J2LmM6MjA0Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiTmVu7SBtb55u6SB6YXpuYW1lbmF0IGpt6W5vIGNvbW1hbmQgc2VydmVydSIKKworIzogaWZfeGNtZHNydi5jOjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IE5lZXhpc3R1amUgcmVnaXN0cm92YW79IHNlcnZlciBqbeluZW0gXCIlc1wiIgorCisjOiBpZl94Y21kc3J2LmM6NDQ2Cittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODogU2VsaGFsbyB6YXNs4W7tIHD47WthenUgdXLoZW7pbXUgcHJvZ3JhbXUiCisKKyM6IGlmX3hjbWRzcnYuYzo3MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIlBvdZ5pdCBjaHlibv0gaWQgc2VydmVydTogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMDYxCittc2dpZCAiRTI0OTogY291bGRuJ3QgcmVhZCBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkiCittc2dzdHIgIkUyNDk6IG5lbHplIOjtc3QgVklNIGluc3RhbmNpIHJlZ2lzdHJ5IHByb3BlcnR5IgorCisjOiBpZl94Y21kc3J2LmM6MTA3MgorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiIgorIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBieWxhIJpwYXRu7CB2eXR2b/hlbmFhIGJ5bGEgc21heuFuYSEiCisKKyM6IG1haW4uYzo1MyBvcHRpb24uYzozMTYyIG9wdGlvbi5jOjMyNjkKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiTmV6buFt4SB2b2xiYSIKKworIzogbWFpbi5jOjU1Cittc2dpZCAiVG9vIG1hbnkgZWRpdCBhcmd1bWVudHMiCittc2dzdHIgIlD47WxpmiBtbm9obyBlZGl0IGFyZ3VtZW50+SIKKworIzogbWFpbi5jOjU3Cittc2dpZCAiQXJndW1lbnQgbWlzc2luZyBhZnRlciIKK21zZ3N0ciAiQ2h5Yu0gYXJndW1lbnQgcG8iCisKKyM6IG1haW4uYzo1OQorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICJDaHlieSB6YSB2b2xib3UiCisKKyM6IG1haW4uYzo2MQorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiBvciBcIi1jIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlD47WxpmiBtbm9obyBcIitw+O1rYXpcIiDoaSBcIi1jIHD47WthelwiIGFyZ3VtZW50+SIKKworIzogbWFpbi5jOjYzCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIkNoeWJu/SBhcmd1bWVudCBwcm8iCisKKyM6IG1haW4uYzo0MzYKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIlZJTSBuZWJ5bCBw+GVsb55lbiBzIHZvbGJvdSArZGlmZiIKKworIzogbWFpbi5jOjg1OAorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIlBva3VzIG8gb3DsdG92bukgb3Rldvhlbu0gc2tyaXB0dTogXCIiCisKKyM6IG1haW4uYzo4NjIgbWFpbi5jOjg2OSBtYWluLmM6OTEzIG1lbWxpbmUuYzozNjczIG1lbWxpbmUuYzozNjc3CisjOiB2ZXJzaW9uLmM6ODE2IHZlcnNpb24uYzo4MjEgdmVyc2lvbi5jOjgyNiB2ZXJzaW9uLmM6ODMxIHZlcnNpb24uYzo4MzYKKyM6IHZlcnNpb24uYzo4NDEgdmVyc2lvbi5jOjg0NyB2ZXJzaW9uLmM6ODUxIHZlcnNpb24uYzo4NTUgdmVyc2lvbi5jOjg2MAorIzogdmVyc2lvbi5jOjg2NyB2ZXJzaW9uLmM6ODc1IHZlcnNpb24uYzo4ODEKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6ODY3Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJOZWx6ZSBvdGV2+O10IHBybyB64XBpczogXCIiCisKKyM6IG1haW4uYzo5MTEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIk5lbHplIG90ZXb47XQgcHJvIHb9c3R1cCBza3JpcHR1OiBcIiIKKworIzogbWFpbi5jOjEwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICJwb+hldCBzb3Vib3L5IHBybyBlZGl0YWNpOiAlZFxuIgorCisjOiBtYWluLmM6MTA5NAorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFyb3bhbu06IHb9c3R1cCBuZXNt7Ph1amUgbmEgdGVybWlu4WxcbiIKKworIzogbWFpbi5jOjEwOTYKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBWYXJvduFu7TogdnN0dXAgbmVwb2No4XrtIHogdGVybWlu4Wx1XG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE3MQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyBw+O1rYXpvdv0g+OFkZWsiCisKKyM6IG1haW4uYzoxMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiBOZWx6ZSDo7XN0IHogXCIlc1wiIgorCisjOiBtYWluLmM6MjE1NworbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiUG9kcm9ibuxqmu0gaW5mb3JtYWNlIHrtc2vhdGUgcG9tb2PtIFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjIxOTAKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW1NPVUJPUl0gLi4gICAgICAgICAgZWRpdG92YXQgU09VQk9SKHkpIgorCisjOiBtYWluLmM6MjE5MQorbXNnaWQgIi0gICAgICAgICAgICAgICByZWFkIHRleHQgZnJvbSBzdGRpbiIKK21zZ3N0ciAiLSAgICAgICAgICAgICAgICAgICAg6O1zdCB0ZXh0IHplIHN0YW5kYXJkbu1obyB2c3R1cHUiCisKKyM6IG1haW4uYzoyMTkyCittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQgVEFHICAgICAgICAgIGVkaXRvdmF0IHNvdWJvciBuYSBt7XN07CBkZWZpbmljZSBUQUdVIgorCisjOiBtYWluLmM6MjE5NAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2NoeWJvdv0gc291Ym9yXSAgZWRpdG92YXQgc291Ym9yIG5hIG3tc3TsIHb9c2t5dHUgcHJ2bu0gY2h5YnkiCisKKyM6IG1haW4uYzoyMjAzCittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorInBvdZ5pdO06IgorCisjOiBtYWluLmM6MjIwNgorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICJ2aW0gW3D4ZXDtbmHoZV0gIgorCisjOiBtYWluLmM6MjIxMAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICBuZWJvIgorCisjOiBtYWluLmM6MjIxMworbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHk6XG4iCisKKyM6IG1haW4uYzoyMjE0Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHRNb2hvdSBu4XNsZWRvdmF0IHBvdXplIG7henZ5IHNvdWJvcvkiCisKKyM6IG1haW4uYzoyMjE2Cittc2dpZCAiLXJlZ2lzdGVyXHRcdFJlZ2lzdGVyIHRoaXMgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx0cPhpaGzhc2l0IGd2aW0gbmEgT0xFIgorCisjOiBtYWluLmM6MjIxNworbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx0b2RobOFzaXQgZ3ZpbSB6IE9MRSIKKworIzogbWFpbi5jOjIyMjAKK21zZ2lkICItZ1x0XHRcdFJ1biB1c2luZyBHVUkgKGxpa2UgXCJndmltXCIpIgorbXNnc3RyICItZ1x0XHRcdHNwdXN0aXQgdiBHVUkgcmWeaW11IChzdGVqbukgamFrbyBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyMjIxCittc2dpZCAiLWZcdFx0XHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZlx0XHRcdFBvcPhlZO06IHD4aSBzdGFydHUgR1VJIHNlIG5lb2Rk7GztIG9kIHNoZWxsdSIKKworIzogbWFpbi5jOjIyMjMKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaSBt82QgKHN0ZWpu6SBqYWtvIFwidmlcIikiCisKKyM6IG1haW4uYzoyMjI0Cittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi12XHRcdFx0RXggbfNkIChzdGVqbukgamFrbyBcImV4XCIpIgorCisjOiBtYWluLmM6MjIyNQorbXNnaWQgIi1zXHRcdFx0U2lsZW50IChiYXRjaCkgbW9kZSAob25seSBmb3IgXCJleFwiKSIKK21zZ3N0ciAiLXNcdFx0XHRUaWNo/SAoZOF2a292/SkgcmWeaW0gKHBvdXplIHBybyBcImV4XCIpIgorCisjOiBtYWluLmM6MjIyNworbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmIHJlnmltIChzdGVqbukgamFrbyBcInZpbWRpZmZcIikiCisKKyM6IG1haW4uYzoyMjI5Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXZcdFx0XHRTbmFkbv0gcmWeaW0gKHN0ZWpu6SBqYWtvIFwiZXZpbVwiLCCe4WRu6SBt82R5ICkiCisKKyM6IG1haW4uYzoyMjMwCittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHRSZZ5pbSBwb3V6ZV9wcm9f6HRlbu0gKGpha28gXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjIzMQorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHRPbWV6ZW79IHJlnmltIChzdGVqbukgamFrbyBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyMjMyCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHRabexueSAodWts4WThbu0gc291Ym9y+SkgemFr4XrhbnkiCisKKyM6IG1haW4uYzoyMjMzCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0Wm3sbnkgKHVrbOFk4W7tIHNvdWJvcvkpIHpha+F64W55IgorCisjOiBtYWluLmM6MjIzNAorbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0Qmlu4XJu7SByZZ5pbSIKKworIzogbWFpbi5jOjIyMzYKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwIHJlnmltIgorCisjOiBtYWluLmM6MjIzOAorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0S29tcGF0YWJpbG7tIHMgVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjIyMzkKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHRLb21wYXRpYmlsaXRhIHMgVmkgdnlwbnV0YTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyMjQwCittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx02nJvdmXyIHb9cGlzdSBobOGaZWsiCisKKyM6IG1haW4uYzoyMjQxCittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHRMYWTtY+0gcmWeaW0iCisKKyM6IG1haW4uYzoyMjQyCittc2dpZCAiLW5cdFx0XHRObyBzd2FwIGZpbGUsIHVzZSBtZW1vcnkgb25seSIKK21zZ3N0ciAiLW5cdFx0XHROZWJ1ZGUgdnl0duH4ZXQgb2RrbOFkYWPtIHNvdWJvciwgYnVkZSBwb3We7XZhdCBwb3V6ZSBwYW3snSIKKworIzogbWFpbi5jOjIyNDMKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRWeXDtmmUgc2V6bmFtIG9ka2zhZGFj7WNoIHNvdWJvcvkgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjQ0Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIG7hemV2IHNvdWJvcnVcdE9ibm927SBw+GVydZplbukgc2V6ZW7tIgorCisjOiBtYWluLmM6MjI0NQorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRTdGVqbukgamFrbyAtciIKKworIzogbWFpbi5jOjIyNDcKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0TmVidWRlIHBvdZ7tdmF0IG5ld2NsaSBwcm8gb3Rldvhlbu0gb2tuYSIKKworIzogbWFpbi5jOjIyNDgKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDx6YfjtemVu7T5cdFx0UG91nu10IDx6YfjtemVu7T4gcHJvIEkvTyIKKworIzogbWFpbi5jOjIyNTEKK21zZ2lkICItSFx0XHRcdHN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdG5hc3RhcnR1amUgdiBoZWJyZWpza+ltIHJlnmltdSIKKworIzogbWFpbi5jOjIyNTQKK21zZ2lkICItRlx0XHRcdHN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0bmFzdGFydHVqZSB2ZSBGYXJzaSByZZ5pbXUiCisKKyM6IG1haW4uYzoyMjU2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbuFsPlx0TmFzdGF27SB0eXAgdGVybWlu4Wx1IG5hIDx0ZXJtaW7hbD4iCisKKyM6IG1haW4uYzoyMjU3Cittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx0UG91nmlqZSA8dmltcmM+IG3tc3RvIGpha+lob2tvbGl2IC52aW1yYyIKKworIzogbWFpbi5jOjIyNTkKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx0UG91nmlqZSA8Z3ZpbXJjPiBt7XN0byBqYWvpaG9rb2xpdiAuZ3ZpbXJjIgorCisjOiBtYWluLmM6MjI2MQorbXNnaWQgIi0tbm9wbHVnaW5cdFx0RG9uJ3QgbG9hZCBwbHVnaW4gc2NyaXB0cyIKK21zZ3N0ciAiLS1ub3BsdWdpblx0XHROZW5haHJhamUgJ3BsdWdpbicgc2tyaXB0eSIKKworIzogbWFpbi5jOjIyNjIKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHRPdGV2+GUgTiBva2VuIChpbXBsaWNpdG7sIGplZG5vIHBybyBrYZ5k/SBzb3Vib3IpIgorCisjOiBtYWluLmM6MjI2MworbXNnaWQgIi1PW05dXHRcdGxpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdEpha28gLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCisKKyM6IG1haW4uYzoyMjY0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0TmFzdGF27SBrdXJ6b3IgbmEga29uZWMgc291Ym9ydSIKKworIzogbWFpbi5jOjIyNjUKK21zZ2lkICIrPGxudW0+XHRcdFN0YXJ0IGF0IGxpbmUgPGxudW0+IgorbXNnc3RyICIrPPjhZGVrPlx0XHROYXN0YXbtIGt1cnpvciBuYSA8+OFkZWs+IgorCisjOiBtYWluLmM6MjI2NworbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxw+O1rYXo+XHRQbyBuYWhy4W7tIHBydm7taG8gc291Ym9ydSB2eWtvbuEgPHD47Wthej4iCisKKyM6IG1haW4uYzoyMjY5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxw+O1rYXo+XHRcdFBvIG5haHLhbu0gcHJ2bu1obyBzb3Vib3J1IHZ5a29u4SA8cPjta2F6PiIKKworIzogbWFpbi5jOjIyNzAKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIiIKKyItUyA8c2V6ZW7tPlx0XHRQbyBuYWhy4W7tIHBydm7taG8gc291Ym9ydSB2eWtvbuEgcPjta2F6eSB2IHNvdWJvcnUgPHNlemVu7T4iCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNrcmlwdD5cdFx0TmHodGUgcPjta2F6eSBub3Jt4Wxu7WhvIG3zZHUgemUgPHNrcmlwdHU+IgorCisjOiBtYWluLmM6MjI3MgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxza3JpcHQ+XHRcdFD4aXBvau0gdpplY2hueSBuYXBzYW7pIHD47WthenkgZG8gc291Ym9ydSA8c2tyaXB0PiIKKworIzogbWFpbi5jOjIyNzMKK21zZ2lkICItVyA8c2NyaXB0b3V0Plx0V3JpdGUgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi1XIDxza3JpcHQ+XHRcdFVsb57tIHaaZWNobnkgbmFwc2Fu6SBw+O1rYXp5IGRvIHNvdWJvcnUgPHNrcmlwdD4iCisKKyM6IG1haW4uYzoyMjc1Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHRFZGl0YWNlIHphmmlmcm92YW79Y2ggc291Ym9y+SIKKworIzogbWFpbi5jOjIyNzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRTcHVzdO0gdmltIG5hIGRhbv0gWC1zZXJ2ZXIiCisKKyM6IG1haW4uYzoyMjgxCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHROZXD4aXBvau0gc2UgayBYIHNlcnZlcnUiCisKKyM6IG1haW4uYzoyMjgzCittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0T3RldvhlIFZpbSB1dm5pdPggamlu6WhvIEdUSyB3aWRnZXR1IgorCisjOiBtYWluLmM6MjI4NworbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlIDxzb3Vib3J5Plx0RWRpdHVqZSA8c291Ym9yeT4gbmEgVmltIHNlcnZlcnUgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjg4Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxzb3Vib3J5PiBKYWtvIC0tcmVtb3RlLCBhbGUg6GVr4SBuYSBzb3Vib3J5IGsgZWRpdGFjaSIKKworIzogbWFpbi5jOjIyODkKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDxrbOF2ZXN5Plx0UPhlZOEgPGts4XZlc3k+IFZpbSBzZXJ2ZXJ1IGEgc2tvbujtIgorCisjOiBtYWluLmM6MjI5MAorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPHb9cmF6Plx0UHJvdmVkZSA8dv1yYXo+IG5hIHNlcnZlcnUgYSB6b2JyYXrtIHb9c2xlZGVrIgorCisjOiBtYWluLmM6MjI5MQorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0Vnlw7ZplIHNlem5hbSBkb3N0dXBu/WNoIFZpbSBzZXJ2ZXL5IGEgc2tvbujtIgorCisjOiBtYWluLmM6MjI5MgorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiIgorIi0tc2VydmVybmFtZSA8am3pbm8+XHRaYZpsZSBzZXJ2ZXJ1IDxqbelubz4vc3RhbmUgc2UgVmltIHNlcnZlcmVtIDxqbelubz4iCisKKyM6IG1haW4uYzoyMjk1Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdFBvdZ5pamUgPHZpbWluZm8+IG3tc3RvIGpha+lob2tvbGl2IC52aW1pbmZvIgorCisjOiBtYWluLmM6MjI5NworbXNnaWQgIi1oXHRcdFx0cHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWhcdFx0XHRWeXDtmmUgdHV0byBu4XBvduxkdSBhIHNrb27o7SIKKworIzogbWFpbi5jOjIyOTgKK21zZ2lkICItLXZlcnNpb25cdFx0cHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdHZ5cO2aZSBpbmZvcm1hY2UgbyB2ZXJ6aSBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzMDIKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+GVw7W5h6GUgcHJvIGd2aW0gKE1vdGlmIHZlcnppKTpcbiIKKworIzogbWFpbi5jOjIzMDUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUPhlcO1uYehlIHBybyBndmltIChBdGhlbmEgdmVyemkpOlxuIgorCisjOiBtYWluLmM6MjMwOAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0U3B1c3TtIHZpbSBuYSA8ZGlzcGxheT4iCisKKyM6IG1haW4uYzoyMzA5Cittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdFNwdXN07SB2aW0gbWluaW1hbGl6b3ZhbukiCisKKyM6IG1haW4uYzoyMzExCittc2dpZCAiLW5hbWUgPG5hbWU+XHRcdFVzZSByZXNvdXJjZSBhcyBpZiB2aW0gd2FzIDxuYW1lPiIKK21zZ3N0ciAiLW5hbWUgPG7hemV2Plx0XHRQb3WeaWplIHJlc291cmNlIGpha28gYnkgdmltIG3sbCA8buF6ZXY+IgorCisjOiBtYWluLmM6MjMxMgorbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKG5lbu0gaW1wbGVtZW50b3bhbm8pXG4iCisKKyM6IG1haW4uYzoyMzE0Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8YmFydmE+XHROYXN0YXbtIDxiYXJ2dT4gcG96YWTtICh0YWvpIC1iZykiCisKKyM6IG1haW4uYzoyMzE1Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8YmFydmE+XHROYXN0YXbtIDxiYXJ2dT4gcG9w+GVk7SAodGFr6SAtZmcpIgorCisjOiBtYWluLmM6MjMxNiBtYWluLmM6MjMzNgorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPHDtc21vPlx0XHROYXN0YXbtIDxw7XNtbz4gbm9ybeFsbu1obyB0ZXh0dSAodGFr6SAtZm4pIgorCisjOiBtYWluLmM6MjMxNworbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxw7XNtbz5cdE5hc3Rhdu0gPHDtc21vPiBwcm8genb9cmF6buxu/SB0ZXh0IgorCisjOiBtYWluLmM6MjMxOAorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxw7XNtbz5cdE5hc3Rhdu0gPHDtc21vPiBwcm8ga3Vyeu12dSIKKworIzogbWFpbi5jOjIzMTkgbWFpbi5jOjIzMzcKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIi1nZW9tZXRyeSA8Z2VvbWV0cmllPlx0TmFzdGF27SA8Z2VvbWV0cmlpPiAodGFr6SAtZ2VvbSkiCisKKyM6IG1haW4uYzoyMzIwCittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPJrt+GthPlx0TmFzdGF27SA8mu34a3U+IG9rcmFq+SAodGFr6SAtYncpIgorCisjOiBtYWluLmM6MjMyMQorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiLXNjcm9sbGJhcndpZHRoIDya7fhrdT4gTmFzdGF27SA8mu34a3U+IHBvc3Vub3ZhY+0gbGmadHkgKHRha+k6IC1zdykiCisKKyM6IG1haW4uYzoyMzIzCittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPHb9mmthPlx0TmFzdGF27SA8dv2aa3U+IG5hYu1ka3kgKHRha+kgLW1oKSIKKworIzogbWFpbi5jOjIzMjUgbWFpbi5jOjIzMzgKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0UG91nmlqZSByZXZlcnpu7SBiYXJ2eSAodGFr6SAtcnYpIgorCisjOiBtYWluLmM6MjMyNgorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHROZXBvdZ5pamUgcmV2ZXJ6bu0gYmFydnkgKHRha+kgK3J2KSIKKworIzogbWFpbi5jOjIzMjcKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZXNvdXJjZT5cdE5hc3Rhdu0gemFkYW79IDxyZXNvdXJjZT4iCisKKyM6IG1haW4uYzoyMzMwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+GVw7W5h6GUgcHJvIGd2aW0gKFJJU0MgT1MgdmVyemkpOlxuIgorCisjOiBtYWluLmM6MjMzMQorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxwb+hldD5cdDxwb+hldD4gc2xvdXBj+SBuYSBva25vIgorCisjOiBtYWluLmM6MjMzMgorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8cG/oZXQ+XHQ8cG/oZXQ+IPjhZGv5IG5hIG9rbm8iCisKKyM6IG1haW4uYzoyMzM1Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+GVw7W5h6GUgcHJvIGd2aW0gKEdUSysgdmVyemkpOlxuIgorCisjOiBtYWluLmM6MjMzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0U3B1c3TtIHZpbSBuYSA8ZGlzcGxheT4gKHRha+kgLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLWhlbHBcdFx0U2hvdyBHbm9tZSBhcmd1bWVudHMiCittc2dzdHIgIi0taGVscFx0XHRWeXDtmmUgR25vbWUgcPhlcO1uYehlIgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6MjU2NgorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlD4ZWThbu0gdv1yYXp1IHNlbGhhbG8uXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICIiCisiXG4iCisiUPhlZOFu7SBzZWxoYWxvLiBaa291mu1tIHByb3bpc3QgbG9r4Wxu7FxuIgorCisjOiBtYWluLmM6MjYwNCBtYWluLmM6MjYyNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIiVkIHogJWQgZWRpdG924W5vIgorCisjOiBtYWluLmM6MjY0OAorbXNnaWQgIlNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIlD4ZWThbu0gdv1yYXp1IHNlbGhhbG8uXG4iCisKKyM6IG1hcmsuYzo2NjAKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIk5lanNvdSBuYXN0YXZlbnkgnuFkbukgem5h6Gt5IgorCisjOiBtYXJrLmM6NjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4MzogXCIlc1wiIG5ldnlob3Z1au0gnuFkbukgem5h6Gt5IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo2NzMKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiem5h6GthIPjhZGVrICBzbG91cGVjIHNvdWJvci90ZXh0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MTEKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBza29rIPjhZGVrIHNsb3VwZWMgc291Ym9yL3RleHQiCisKKyM6IG1hcmsuYzoxMDczCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgU291Ym9yb3bpIHpuYehreTpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMTA4Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFNlem5hbSBza29r+SAocG/o7W5hamUgbmVqbm927Gqa7SBwb2xvnmtvdSk6XG4iCisKKyM6IG1hcmsuYzoxMjAzCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBIaXN0b3JpZSB6bmHoZWsgdiBzb3Vib3JlY2ggKHBv6O1uYWplIG5lam5vduxqmu0gcG9sb55rb3UpOlxuIgorCisjOiBtYXJrLmM6MTI4NgorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICJDaHli7SAnPiciCisKKyM6IG1ieXRlLmM6Mzk1Cittc2dpZCAiTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIkNoeWJu4SBr82RvduEgc3Ry4W5rYSIKKworIzogbWJ5dGUuYzozMDE0Cittc2dpZCAiRTI4NDogQ2Fubm90IHNldCBJQyB2YWx1ZXMiCittc2dzdHIgIkUyODQ6IE5lbHplIG5hc3Rhdml0IElDIGhvZG5vdHkiCisKKyM6IG1ieXRlLmM6MzE2NgorbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogTmVwb2Rh+GlsbyBzZSB2eXR2b/hpdCB2c3R1cG7tIGtvbnRleHQiCisKKyM6IG1ieXRlLmM6MzMxMworbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4NjogTmVwb2Rh+GlsbyBzZSBvdGV2+O10IHZzdHVwbu0gbWV0b2R1IgorCisjOiBtYnl0ZS5jOjMzMjQKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IFZhcm924W7tOiBsaWt2aWRh6G7tIHpw7HRu6SB2b2zhbu0gbmVsemUgbmFzdGF2aXQgbmEgSU0iCisKKyM6IG1ieXRlLmM6MzMzMAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiB2c3R1cG7tIG1ldG9kYSBuZXBvZHBvcnVqZSCe4WRu/SBzdHlsIgorCisjOiBtYnl0ZS5jOjMzODcKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogdnN0dXBu7SBtZXRvZGEgbmVwb2Rwb3J1amUgbflqICdwcmVlZGl0JyB0eXAiCisKKyM6IG1ieXRlLmM6MzQ2MQorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogTmFkYm9kb3b9IHN0eWwgdnmeYWR1amUgZm9udHNldCIKKworIzogbWJ5dGUuYzozNDg5Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBN4XRlIEdUSysgdmVyemUgc3RhcprtIG5lniAxLjIuMy4gU3Rhdm924SBwbG9jaGEgdnlwbnV0YS4iCisKKyM6IG1ieXRlLmM6MzcyNgorbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IFNlcnZlciB2c3R1cG7tY2ggbWV0b2QgbmVi7J7tIgorCisjOiBtZW1maWxlLmM6NDczCittc2dpZCAiRTI5MzogYmxvY2sgd2FzIG5vdCBsb2NrZWQiCittc2dzdHIgIkUyOTM6IGJsb2sgbmVieWwgemFta251dCIKKworIzogbWVtZmlsZS5jOjk3MgorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IENoeWJhIHBvc3VudSB1a2F6b3bhdGthIHD4aSDodGVu7SBvZGts4WRhY+1obyBzb3Vib3J1IgorCisjOiBtZW1maWxlLmM6OTc3Cittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IENoeWJhIHD4aSDodGVu7SBvZGts4WRhY+1obyBzb3Vib3J1IgorCisjOiBtZW1maWxlLmM6MTAyOQorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBDaHliYSBwb3N1bnUgdWthem924XRrYSBw+GkgdWts4WThbu0gZG8gb2RrbOFkYWPtaG8gc291Ym9ydSIKKworIzogbWVtZmlsZS5jOjEwNDcKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IENoeWJhIHD4aSB1a2zhZOFu7SBkbyBvZGts4WRhY+1obyBzb3Vib3J1IgorCisjOiBtZW1maWxlLmM6MTI0NAorbXNnaWQgIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIKK21zZ3N0ciAiIgorIkUzMDA6IE9ka2zhZGFj7SBzb3Vib3IgammeIGV4aXN0dWplISAoTuxrZG8gaGFja3VqZXD4ZXMgbmFzdHJhnmVu/SBzeW1saW5rPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBOZWx6ZSB67XNrYXQgYmxvayAwPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IE5lbHplIHrtc2thdCBibG9rIDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogbmVsemUgeu1za2F0IGJsb2sgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IErpamUsIG9ka2zhZGFj7SBzb3Vib3IgYnlsIHp0cmFjZW4hISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogTmVsemUgcPhlam1lbm92YXQgb2RrbOFkYWPtIHNvdWJvciIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogTmVsemUgb3RldvjtdCBvZGts4WRhY+0gc291Ym9yIHBybyBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo2MTcKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6IG5lbHplIHrtc2thdCBibG9rIDA/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBPZGts4WRhY+0gc291Ym9yIHBybyAlcyBuZWJ5bCBuYWxlemVuIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiIgorIlphZGVqdGUg6O1zbG8gb2RrbOFkYWPtaG8gc291Ym9ydSwga3Rlcv0gc2UgbeEgcG91nu10ICgwIHBybyB1a29u6GVu7Sk6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogTmVsemUgb3RldvjtdCAlcyIKKworIzogbWVtbGluZS5jOjgzNAorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIk5lbHplIOjtc3QgYmxvayAwIHogIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIk1vnm7hIG5lZG+abG8gayCe4WRu/W0gem3sbuFtLCBuZWJvIFZpbSBuZWFrdHVhbGl6b3ZhbCBvZGts4WRhY+0gc291Ym9yLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5lbHplIHBvdZ7tdCBzIHRvdXRvIHZlcnrtIFZpbS5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIlBvdZ5panRlIFZpbSB2ZXJ6ZSAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgc2UgbmV6ZOEgYv10IG9ka2zhZGFj7W0gc291Ym9yZW0gVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBuZWx6ZSBwb3We7XQgbmEgdG9tdG8gcG/o7XRh6GkuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIlNvdWJvciBieWwgdnl0dm/4ZW4gIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyJuZWJvIGJ5bCBzb3Vib3IgcG+aa296ZW4uIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlBvdZ7tduFtIG9ka2zhZGFj7SBzb3Vib3IgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICJQ+XZvZG7tIHNvdWJvciBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MzQKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogVmFyb3bhbu06IFD5dm9kbu0gc291Ym9yIG1vaGwgYv10IHpt7G7sbiIKKworIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IE5lbHplIOjtc3QgYmxvayAxIHogJXMiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P0NIWULNIE1OT0hPINjBREvZIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/Q0hZQk7dIFBPyEVUINjBREvZIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9QUsFaRE7dIEJMT0siCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0hZQsxKzUPNINjBREtZIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogSUQgYmxva3UgMSBqZSBjaHlibukgKGplICVzIG9ka2zhZGFj7W0gc291Ym9yZW0/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9DSFlCzSBCTE9LIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbW9ob3UgYv10IPjhZGt5IHBvbe1jaGFu6SIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbW9ob3UgYv10IHZsb55lbukvc21hemFu6SD44WRreSIKKworIzogbWVtbGluZS5jOjExMTcKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/P0tPTkVDIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiBPYm5vdmEgcPhlcnWaZW5hIgorCisjOiBtZW1saW5lLmM6MTE0NQorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIiIKKyJFMzEyOiBWIHBy+WLsaHUgb2Jub3Z5IGRvmmxvIGsgY2h5YuFtOyB6a29udHJvbHVqdGUg+OFka3kgemHo7W5hau1j7SBuYSA/Pz8iCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICJPYm5vdmEgZG9rb27oZW5hLiBaa29udHJvbHVqdGUsIHpkYSBqZSB2mmUgdiBwb/jhZGt1LiIKKworIzogbWVtbGluZS5jOjExNDkKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoWnZhnnRlIHVsb55lbu0gdG9ob3RvIHNvdWJvcnUgcG9kIGppbv1tIG7henZlbVxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICJhIGtvbnRyb2x1IHpt7G4gcG9tb2PtIHByb2dyYW11IGRpZmYuKVxuIgorCisjOiBtZW1saW5lLmM6MTE1MQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICJQb3TpIHNtYZ50ZSBvZGts4WRhY+0gc291Ym9yLlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMDcKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAiTmFsZXplbukgb2RrbOFkYWPtIHNvdWJvcnk6IgorCisjOiBtZW1saW5lLmM6MTM4NQorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICBWIGFrdHXhbG7tbSBhZHJlc+H4aTpcbiIKKworIzogbWVtbGluZS5jOjEzODcKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgU2UgemFkYW79bSBu4Xp2ZW06XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgViBhZHJlc+H4aSAiCisKKyM6IG1lbWxpbmUuYzoxNDA5Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSCe4WRu6SAtLVxuIgorCisjOiBtZW1saW5lLmM6MTQ4MQorbXNnaWQgIiAgICAgICAgICBvd25lZCBieTogIgorbXNnc3RyICIgICAgICAgICAgdmxhc3Ru7Ws6ICIKKworIzogbWVtbGluZS5jOjE0ODMKK21zZ2lkICIgICBkYXRlZDogIgorbXNnc3RyICIgICBkYXR1bSB2eXR2b/hlbu06ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM2ODAKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGRhdHVtIHZ5dHZv+GVu7TogIgorCisjOiBtZW1saW5lLmM6MTUwMworbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgIFtvZCBWaW0gdmVyemUgMy4wXSIKKworIzogbWVtbGluZS5jOjE1MDcKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgIFtuZXZ5cGFk4SBqYWtvIG9ka2zhZGFj7SBzb3Vib3IgVmltXSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgbuF6ZXYgc291Ym9ydTogIgorCisjOiBtZW1saW5lLmM6MTUyMworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICBkYXR1bSB6bexueTogIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIllFUyIKK21zZ3N0ciAiQU5PIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIm5vIgorbXNnc3RyICJuZSIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICB1nml2YXRlbHNr6SBqbelubzogIgorCisjOiBtZW1saW5lLmM6MTUzNQorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgICBu4XpldiBwb+jtdGHoZTogIgorCisjOiBtZW1saW5lLmM6MTUzNworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIG7hemV2IHBv6O10YehlOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBJRCBwcm9jZXN1IDogIgorCisjOiBtZW1saW5lLmM6MTU0OQorbXNnaWQgIiAoc3RpbGwgcnVubmluZykiCittc2dzdHIgIiAoc3ThbGUgYWt0aXZu7SkiCisKKyM6IG1lbWxpbmUuYzoxNTYxCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbV0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbbmVwb3WeaXRlbG7pIHMgdG91dG8gdmVyeu0gVmltXSIKKworIzogbWVtbGluZS5jOjE1NjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbbmVwb3WeaXRlbG7pIG5hIHRvbXRvIHBv6O10YehpXSIKKworIzogbWVtbGluZS5jOjE1NjkKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICBbbmVsemUgcPhl6O1zdF0iCisKKyM6IG1lbWxpbmUuYzoxNTczCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbbmVsemUgb3RldvjtdF0iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IE5lbHplIHphY2hvdmF0IC0gb2RrbOFkYWPtIHNvdWJvciBuZWV4aXN0dWplLiIKKworIzogbWVtbGluZS5jOjE4MTYKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAiU291Ym9yIHphY2hvduFuIgorCisjOiBtZW1saW5lLmM6MTgxOAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogVWNob3bhbu0gc2UgbmV6ZGH4aWxvIgorCisjOiBtZW1saW5lLmM6MTg4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IGNoeWJu6SDo7XNsbyD44WRrdTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IG5lbHplIG5hbOl6dCD44WRlayAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzAzCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthemF0ZWxlIG5hIGJsb2sgMyIKKworIzogbWVtbGluZS5jOjIzODMKK21zZ2lkICJzdGFja19pZHggc2hvdWxkIGJlIDAiCittc2dzdHIgInN0YWNrX2lkeCBieSBt7GxvIG3tdCBob2Rub3R1IDMiCisKKyM6IG1lbWxpbmUuYzoyNDQ1Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBBa3R1YWxpem924W5vIHD47WxpmiBtbm9obyBibG9r+T8iCisKKyM6IG1lbWxpbmUuYzoyNjAyCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthemF0ZWxlIG5hIGJsb2sgNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJzbWF64W4gYmxvayAxPyIKKworIzogbWVtbGluZS5jOjI4MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IE5lbHplIG5hbOl6dCD44WRlayAlbGQiCisKKyM6IG1lbWxpbmUuYzozMDcyCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogY2h5Ym7pIGlkIHVrYXphdGVsZSBuYSBibG9rIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCBt4SBudWxvdm91IGhvZG5vdHUiCisKKyM6IG1lbWxpbmUuYzozMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogcG/oZXQg+OFka/kgbWltbyByb3pzYWg6ICVsZCA+IGNlbGtvdv0gcG/oZXQg+OFka/kiCisKKyM6IG1lbWxpbmUuYzozMTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiBjaHlibv0gcG/oZXQg+OFka/kgdiBibG9rdSAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTcwCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIk7hcvlzdCB2ZWxpa29zdGkgeuFzb2Ju7Wt1IgorCisjOiBtZW1saW5lLmM6MzIxNgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogY2h5Ym7pIGlkIHVrYXphdGVsZSBuYSBibG9rIDIiCisKKyM6IG1lbWxpbmUuYzozNjcwCittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiBQT1pPUiIKKworIzogbWVtbGluZS5jOjM2NzEKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJOYWxlemVuIG9ka2zhZGFj7SBzb3Vib3Igc2Ugam3pbmVtIFwiIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKK21zZ3N0ciAiUPhpIG90ZXbtcuFu7SBzb3Vib3J1XCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIE5PVsxKis0gbmWeIG9ka2zhZGFj7SBzb3Vib3IhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgU291Ym9yIG35nmUgYv10IGVkaXRvduFuIGppbv1tIHByb2dyYW1lbS5cbiIKKyIgICAgSmUtbGkgdG9tdSB0YWssIHBhayBzaSBkZWp0ZSBwb3pvciwgYWJ5IGpzdGUgcG8gdWxvnmVu7SB6bexuXG4iCisiICAgIG5lbexsaSBkduwgcvl6bukgdmVyemUgdOlob54gc291Ym9ydS5cbiIKKworIzogbWVtbGluZS5jOjM2ODkKK21zZ2lkICIgICAgUXVpdCwgb3IgY29udGludWUgd2l0aCBjYXV0aW9uLlxuIgorbXNnc3RyICIgICAgVWtvbuhldGUgcHJvZ3JhbSwgbmVibyBvcGF0cm7sIHBva3Jh6HVqdGUgdiBlZGl0YWNpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5MAorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSBFZGl0YWNlIHRvaG90byBzb3Vib3J1IGJ5bGEgcPhlcnWaZW5hIG5l6GVrYW79bSB1a29u6GVu7W0gcHJvZ3JhbXUuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkxCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgSmUtbGkgdG9tdSB0YWssIHBhayBwb3WeaWp0ZSBcIjpyZWNvdmVyXCIg6GkgXCJ2aW0gLXIgIgorCisjOiBtZW1saW5lLmM6MzY5MworbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIHBybyBvZHN0cmFu7G7tIHpt7G4gKHZpeiBcIjpoZWxwIHJlY292ZXJ5KVwiLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICBQb2t1ZCBqc3RlIHRhayBqaZ4gdehpbmlsLCB0YWsgc21hnnRlIG9ka2zhZGFj7SBzb3Vib3IgXCIiCisKKyM6IG1lbWxpbmUuYzozNjk2Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIGEgdGF0byB6cHLhdmEgc2UgammeIG5lYnVkZSBvYmpldm92YXQuXG4iCisKKyM6IG1lbWxpbmUuYzozNzEwIG1lbWxpbmUuYzozNzE0Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICJPZGts4WRhY+0gc291Ym9yIFwiIgorCisjOiBtZW1saW5lLmM6MzcxMSBtZW1saW5lLmM6MzcxNworbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIgammeIGV4aXN0dWplISIKKworIzogbWVtbGluZS5jOjM3MjAKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIFBPWk9SIgorCisjOiBtZW1saW5lLmM6MzcyMgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIk9ka2zhZGFj7SBzb3Vib3IgammeIGV4aXN0dWplISIKKworIzogbWVtbGluZS5jOjM3MjYKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdCIKK21zZ3N0ciAiIgorIiZPdGV2+O10IHBvdXplIHBybyDodGVu7VxuIgorIiZQb2tyYehvdmF0IHYgZWRpdGFjaVxuIgorIk8mYm5vdml0IHNvdWJvclxuIgorIiZLb25lYyIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImT3RldvjtdCBwb3V6ZSBwcm8g6HRlbu1cbiIKKyImUG9rcmHob3ZhdCB2IGVkaXRhY2lcbiIKKyJPJmJub3ZpdCBzb3Vib3JcbiIKKyImS29uZWNcbiIKKyImU21hemF0IgorCisjOiBtZW1saW5lLmM6Mzc4MQorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6IFD47WxpmiBtbm9obyBvZGts4WRhY+1jaCBzb3Vib3L5IgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogyOFzdGkgY2VzdHkgayBw+GVkbex0dSBuYWLtZGt5IG5lbu0gcG9kbmFi7WRrb3UiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBOYWLtZGthIGV4aXN0dWplIHBvdXplIHYgamlu6W0gbfNkdSIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IE5hYu1ka2EgdG9ob3RvIGpt6W5hIG5lZXhpc3R1amUiCisKKyM6IG1lbnUuYzo1MDMKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiBDZXN0YSBuYWLtZGtvdSBuZXNt7SB26XN0IGRvIHBvZG5hYu1ka3kiCisKKyM6IG1lbnUuYzo1NDIKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiRTMzMTogUG9sb55reSBuYWLtZGt5IG5lbHplIHD4aWThdmF0IHD47W1vIG5hIGxpmnR1IgorCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiBPZGTsbG92YeggbmVzbe0gYv10IOjhc3TtIGNlc3R5IG5hYu1ka291IgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDYzCittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTmFi7WRreSAtLS0iCisKKyM6IG1lbnUuYzoxOTg5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJPZHRyaG5vdXQgdHV0byBuYWLtZGt1IgorCisjOiBtZW51LmM6MjA1NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IENlc3RhIG5hYu1ka291IG11c+0gdulzdCBrIHBvbG+eY2UgbmFi7WRreSIKKworIzogbWVudS5jOjIwNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBWem9yIG5lbmFsZXplbjogJXMiCisKKyM6IG1lbnUuYzoyMTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IFYgJXMgbfNkdSBuZW7tIG5hYu1ka2EgZGVmaW5vduFuYSIKKworIzogbWVudS5jOjIxODEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IENlc3RhIG5hYu1ka291IG11c+0gdulzdCBkbyBwb2RuYWLtZGt5IgorCisjOiBtZW51LmM6MjIwMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogTmFi7WRrYSBuZW5hbGV6ZW5hIC0gemtvbnRyb2x1anRlIG7henZ5IG5hYu1kZWsiCisKKyM6IG1lc3NhZ2UuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIkNoeWJhIHD4aSB6cHJhY2924W7tICVzOiIKKworIzogbWVzc2FnZS5jOjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICL44WRlayAlNGxkOiIKKworIzogbWVzc2FnZS5jOjUyMworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJbcPjtbGmaIGRsb3Vo/SD4ZXTsemVjXSIKKworIzogbWVzc2FnZS5jOjY2OQorbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICJTcHLhdmNlIHpwcuF2OiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKKworIzogbWVzc2FnZS5jOjg4MQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJQ+GVydZplbu06ICIKKworIzogbWVzc2FnZS5jOjg4NAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAicG9rcmHob3bhbu0gc3Rpc2tlbSBFTlRFUiIKKworIzogbWVzc2FnZS5jOjg4NgorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlBybyBwb2tyYehvduFu7SBzdGlza27sdGUgRU5URVIgbmVibyB6YWRlanRlIHD47WtheiIKKworIzogbWVzc2FnZS5jOjE5NDAKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBQb2tyYehvduFu7SAtLSIKKworIzogbWVzc2FnZS5jOjE5NDMKK21zZ2lkICIgKFJFVC9CUzogbGluZSwgU1BBQ0UvYjogcGFnZSwgZC91OiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVC9CUzog+OFkZWssIE1FWkVSTs1LL2I6IHN0cuFua2EsIGQvdTogMC41IHN0cuFua3ksIHE6IGtvbmVjKSIKKworIzogbWVzc2FnZS5jOjE5NDQKK21zZ2lkICIgKFJFVDogbGluZSwgU1BBQ0U6IHBhZ2UsIGQ6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUOiD44WRlaywgTUVaRVJOzUs6IHN0cuFua2EsIGQ6IDAuNSBzdHLhbmt5LCBxOiBrb25lYykiCisKKyM6IG1lc3NhZ2UuYzoyNDE5IG1lc3NhZ2UuYzoyNDM0Cittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIk904XprYSIKKworIzogbWVzc2FnZS5jOjI0MjEKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZBbm9cbiIKKyImTmUiCisKKyM6IG1lc3NhZ2UuYzoyNDM2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkFub1xuIgorIiZOZVxuIgorIiZacnWaaXQiCisKKyM6IG1lc3NhZ2UuYzoyNDU0Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkFub1xuIgorIiZOZVxuIgorIiZVbG+eaXQgdpplXG4iCisiWmFob2RpdCAmdpplXG4iCisiJlpydZppdCIKKworIzogbWVzc2FnZS5jOjI0OTQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICJEaWFsb2cgcHJvIHVrbOFk4W7tIHNvdWJvcvkiCisKKyM6IG1lc3NhZ2UuYzoyNDk2Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGlhbG9nIHBybyBvdGV27XLhbu0gc291Ym9y+SIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzoyNTQ3Cittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6IExpdHVqaSwgYWxlIGtvbnpvbG924SB2ZXJ6ZSBuZXBvZHBvcnVqZSBwcm9obO2eZeggc291Ym9y+SIKKworIzogbWlzYzEuYzoyNDQ5Cittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogd2MxOiBt7G7tbSBzb3Vib3IgcG91emVfcHJvX+h0ZW7tIgorCisjOiBtaXNjMS5jOjI2NzgKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAicG/oZXQgbm92/WNoIPjhZGv5OiAxIgorCisjOiBtaXNjMS5jOjI2ODAKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAicG/oZXQgc21hemFu/WNoIPjhZGv5OiAxIgorCisjOiBtaXNjMS5jOjI2ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgInBv6GV0IG5vdv1jaCD44WRr+TogJWxkIgorCisjOiBtaXNjMS5jOjI2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICJwb+hldCBzbWF6YW79Y2gg+OFka/k6ICVsZCIKKworIzogbWlzYzEuYzoyNjkwCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIihQ+GVydZplbm8pIgorCisjOiBtaXNjMS5jOjYyNDUKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiB6YWNob3bhduFtIHNvdWJvcnkuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjYyNTUKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IHVrb27oZW5cbiIKKworIzogbWlzYzIuYzo2NDcgbWlzYzIuYzo2NjMKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICJDSFlCQTogIgorCisjOiBtaXNjMi5jOjY2NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltiYWp0+V0gY2Vsa2VtIHV2b2xu7G5vLWFsb2tvduFubyAlbHUtJWx1LCB2eXWeaXRvICVsdSwgbWF4aW3hbG7tIHZ5dZ5pdO0gIgorIiVsdVxuIgorCisjOiBtaXNjMi5jOjY2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbdm9s4W7tXSBjZWxrZW0gcmUvbWFsbG9jKCk6ICVsdSwgY2Vsa2VtIGZyZWUoKSAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3MjQKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiDY4WRlayBzZSBzdOF24SBw+O1saZogZGxvdWj9bSIKKworIzogbWlzYzIuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IFZuaXT4bu0gY2h5YmE6IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6ODc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiBOZWRvc3RhdGVrIHBhbex0aSEgKHBvdPhlYnVqaSBhbG9rb3ZhdCBiYWp0+TogJWx1KSIKKworIzogbWlzYzIuYzoyNTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJTcG91mnTtbSBw+O1rYXogXCIlc1wiIHBvbW9j7SBzaGVsbHUiCisKKyM6IG1pc2MyLmM6MjcwNiBtaXNjMi5jOjUxNDggb3B0aW9uLmM6NDU4NAorbXNnaWQgIk1pc3NpbmcgY29sb24iCittc2dzdHIgIkNoeWLtIGR2b2p0ZehrYSIKKworIzogbWlzYzIuYzoyNzA4IG1pc2MyLmM6MjczNQorbXNnaWQgIklsbGVnYWwgbW9kZSIKK21zZ3N0ciAibmVw+O1wdXN0bv0gbfNkIgorCisjOiBtaXNjMi5jOjI3NzQKK21zZ2lkICJJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkNoeWJu/SB0dmFyIG15mmkiCisKKyM6IG1pc2MyLmM6MjgxNCBtaXNjMi5jOjUxNjgKK21zZ2lkICJkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAib+hla+F24W5hIOjtc2xpY2UiCisKKyM6IG1pc2MyLmM6MjgxOQorbXNnaWQgIklsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAibmVw+O1wdXN0bukgcHJvY2VudG8iCisKKyM6IG1pc2MyLmM6MzEyMworbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIlphZGVqdGUgmmlmcm92YWPtIGts7eg6ICIKKworIzogbWlzYzIuYzozMTI0Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiWmFkZWp0ZSBqZZp07CBqZWRub3UgdGVudP2eIGts7eg6IgorCisjOiBtaXNjMi5jOjMxMzQKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAiS2zt6GUgc2UgbmVzaG9kdWrtIgorCisjOiBtaXNjMi5jOjM2NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBDaHlibuEgY2VzdGE6ICcqKlvo7XNsb10gbXVz7SBi/XQgYnXvIG5hIGtvbmNpIGNlc3R5LCBuZWJvIG11c+0gYv10XG4iCisibuFzbGVkb3bhbm8nJXMuIFZpeiA6aGVscCBwYXRoLiIKKworIzogbWlzYzIuYzo0OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IEFkcmVz4fggXCIlc1wiIG5lbHplIHYgY2RwYXRoIG5hbOl6dCIKKworIzogbWlzYzIuYzo0OTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogU291Ym9yIFwiJXNcIiBuZWx6ZSB2IHBhdGggbmFs6Xp0IgorCisjOiBtaXNjMi5jOjQ5MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogjuFkbv0gZGFsmu0gYWRyZXPh+CBcIiVzXCIgbmVieWwgdiBjZHBhdGggbmFsZXplbiIKKworIzogbWlzYzIuYzo0OTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NzogjuFkbv0gZGFsmu0gc291Ym9yIFwiJXNcIiBuZWJ5bCB2IGNlc3TsIG5hbGV6ZW4iCisKKyM6IG1pc2MyLmM6NTE2MAorbXNnaWQgIklsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJuZXD47XB1c3Ru4SBzb3Xo4XN0IgorCisjOiBub3JtYWwuYzoyODEzCittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAiVmFyb3bhbu06IHRlcm1pbuFsIG5lcG9kcG9ydWplIHp2/XJhevJvduFu7SIKKworIzogbm9ybWFsLmM6MzAwOAorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IHBvZCBrdXJ6b3JlbSBuZW7tIJ7hZG79IPhldOx6ZWMiCisKKyM6IG5vcm1hbC5jOjMwMTAKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogcG9kIGt1cnpvcmVtIG5lbu0gnuFkbv0gaWRlbnRpZmlr4XRvciIKKworIzogbm9ybWFsLmM6NDE3NQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiBwb21vY+0gYWt0deFsbu0gJ2ZvbGRtZXRob2QnIG5lbHplIG1hemF0IHrhaHlieSIKKworIzogb3BzLmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAicG/oZXQg+OFka/kgcG9zdW51dP1jaCBqZWRub3UgcG9tb2PtICVzIDogMSIKKworIzogb3BzLmM6MjczCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkICVkIHRpbWVzIgorbXNnc3RyICJQb+hldCD44WRr+SBwb3N1bnV0/WNoIHBvbW9j7SAlcyAlZC1rcuF0IDogMSIKKworIzogb3BzLmM6Mjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiUG/oZXQg+OFka/k6ICVsZCAocG9zdW51dP1jaCBqZWRub3UgcG9tb2PtICVzKSIKKworIzogb3BzLmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICJQb+hldCD44WRr+TogJWxkIChwb3N1bnV0/WNoIHBvbW9j7SAlcyAlZC1rcuF0KSIKKworIzogb3BzLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICJwb+hldCD44WRr+SBrIG9kc2F6ZW7tOiAlbGQiCisKKyM6IG9wcy5jOjY4OAorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgInBv6GV0IPjhZGv5IGsgb2RzYXplbu06IDEiCisKKyM6IG9wcy5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICJwb+hldCBvZHNhemVu/WNoIPjhZGv5OiAlbGQiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNTI4Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIm5lbHplIGtvcO1yb3ZhdDsgcPhlc3RvIHNtYXrhbm8iCisKKyM6IG9wcy5jOjIwMTgKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAicG/oZXQg+OFkZWsgc2Ugem3sbuxub3UgdmVsaWtvc3TtIHDtc21lbjogMSIKKworIzogb3BzLmM6MjAyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAicG/oZXQg+OFkZWsgc2Ugem3sbuxub3UgdmVsaWtvc3TtIHDtc21lbjogJWxkIgorCisjOiBvcHMuYzoyMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICJwb+hldCB1dm9s8m92YW79Y2gg+OFka/k6ICVsZCIKKworIzogb3BzLmM6MjY1OAorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgInBv6GV0IHprb3Dtcm92YW79Y2gg+OFka/k6IDEiCisKKyM6IG9wcy5jOjI2NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAicG/oZXQgemtvcO1yb3Zhbv1jaCD44WRr+TogJWxkIgorCisjOiBvcHMuYzoyOTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IFJlZ2lzdHIgJXMgamUgcHLhemRu/SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNDU0Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFJlZ2lzdHJ5IC0tLSIKKworIzogb3BzLmM6NDU2NQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAibmVw+O1wdXN0bv0gbuF6ZXYgcmVnaXN0cnUiCisKKyM6IG9wcy5jOjQ2NDUKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlZ2lzdHJ5OlxuIgorCisjOiBvcHMuYzo0NjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiJWQgbmVu7SB6buFt/W0gdHlwZW0gcmVnaXN0cnUiCisKKyM6IG9wcy5jOjUwNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiAnJXMnIG5lbu0gcPjtcHVzdG7pIGpt6W5vIHJlZ2lzdHJ1IgorCisjOiBvcHMuYzo1MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIvjhZGv5OiAlbGQ7IgorCisjOiBvcHMuYzo1NDAwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiVnlicuFubyAlcyVsZCB6ICVsZCD44WRr+TsgJWxkIHogJWxkIHNsb3Y7ICVsZCB6ICVsZCBCeXT5IgorCisjOiBvcHMuYzo1NDE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAiU2xvdXBlYyAlcyB6ICVzOyDY4WRlayAlbGQgeiAlbGQ7IFNsb3ZvICVsZCB6ICVsZDsgQnl0ZSAlbGQgeiAlbGQiCisKKyM6IG9wcy5jOjU0MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHBybyBCT00pIgorCisjOiBvcHRpb24uYzoxOTg5Cittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICJE7Gt1amkgemEgcG91nml07SBWaW0iCisKKyM6IG9wdGlvbi5jOjMxNzUKK21zZ2lkICJPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiVm9sYmEgbmVu7SBwb2Rwb3JvduFuYSIKKworIzogb3B0aW9uLmM6MzIwMAorbXNnaWQgIk5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIk5lbu0gdiBtb2RlbGluZSBwb3ZvbGVubyIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHROYXBvc2xlZHkgbmFzdGF2ZW5hIHogIgorCisjOiBvcHRpb24uYzozMzk1Cittc2dpZCAiTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIlBvID0gamUgdnmeYWRvduFubyDo7XNsbyIKKworIzogb3B0aW9uLmM6MzcwMiBvcHRpb24uYzo0MzA5Cittc2dpZCAiTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIk5lbmFsZXplbiB2IHRlcm1jYXB1IgorCisjOiBvcHRpb24uYzozNzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIk5lcPjtcHVzdG79IHpuYWsgPCVzPiIKKworIzogb3B0aW9uLmM6NDI5NCBvcHRpb24uYzo1NDk3Cittc2dpZCAiTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiVG90byB6ZGUgbmVu7SBwb3ZvbGVubyIKKworIzogb3B0aW9uLmM6NDMwMQorbXNnaWQgIkNhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAidm9sYmEgJ3Rlcm0nIG5lbfmeZSBi/XQgcHLhemRu4SIKKworIzogb3B0aW9uLmM6NDMwNAorbXNnaWQgIkNhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIlYgR1VJIG5lbHplIG3sbml0IHRlcm0iCisKKyM6IG9wdGlvbi5jOjQzMDYKK21zZ2lkICJVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiUG91nmlqdGUgXCJndWlcIiBwcm8gc3B1mnTsbu0gR1VJIgorCisjOiBvcHRpb24uYzo0MzI3Cittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAidm9sYnkgJ2JhY2t1cGV4dCcgYSAncGF0Y2htb2RlJyBtYWrtIHN0ZWpub3UgaG9kbm90dSIKKworIzogb3B0aW9uLmM6NDU4NgorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAi+GV07HplYyBvIG51bG926SBk6WxjZSIKKworIzogb3B0aW9uLmM6NDY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJQbyA8JXM+IGNoeWLtIOjtc2xvIgorCisjOiBvcHRpb24uYzo0NjY4Cittc2dpZCAiTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiQ2h5Yu0g6OFya2EiCisKKyM6IG9wdGlvbi5jOjQ2NzUKK21zZ2lkICJNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJKZSBudXRu6SB6YWRhdCBob2Rub3R1ICciCisKKyM6IG9wdGlvbi5jOjQ3MTUKK21zZ2lkICJjb250YWlucyB1bnByaW50YWJsZSBjaGFyYWN0ZXIiCittc2dzdHIgIm9ic2FodWplIG5ldGlza251dGVsbukgem5ha3kiCisKKyM6IG9wdGlvbi5jOjQ3MjgKK21zZ2lkICJJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIkNoeWJu4SBw7XNtYSIKKworIzogb3B0aW9uLmM6NDczNAorbXNnaWQgImNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJuZWx6ZSB2eWJyYXQgc2FkdSBw7XNlbSIKKworIzogb3B0aW9uLmM6NDczNgorbXNnaWQgIkludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiY2h5Ym7hIHNhZGEgcO1zZW0iCisKKyM6IG9wdGlvbi5jOjQ3NDMKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJuZWx6ZSB2eWJyYXQgmmlyb2v9IGZvbnQiCisKKyM6IG9wdGlvbi5jOjQ3NDUKK21zZ2lkICJJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiQ2h5Ym7pIJppcm9r6SBw7XNtbyIKKworIzogb3B0aW9uLmM6NTAxNAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICJOZXD47XB1c3Ru/SB6bmFrIHBvIDwlYz4iCisKKyM6IG9wdGlvbi5jOjUwOTcKK21zZ2lkICJjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAiamUgbnV0buEg6OFya2EiCisKKyM6IG9wdGlvbi5jOjUxMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAidm9sYmEgYGNvbW1lbnRzdHJpbmdgIG11c+0gYv10IGJ17yBwcuF6ZG7hIG5lYm8gbmFzdGF2ZW7hIG5hICVzIgorCisjOiBvcHRpb24uYzo1MTUzCittc2dpZCAiTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiQmV6IHBvZHBvcnkgbXmaaSIKKworIzogb3B0aW9uLmM6NTM5OQorbXNnaWQgIlVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIm5ldXphdvhlbuEgc2VrdmVuY2Ugdv1yYXr5IgorCisjOiBvcHRpb24uYzo1NDAzCittc2dpZCAidG9vIG1hbnkgaXRlbXMiCittc2dzdHIgInD47WxpmiBtbm9obyBwb2xvnmVrIgorCisjOiBvcHRpb24uYzo1NDA1Cittc2dpZCAidW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIm5ldnl24Z5lbukgc2t1cGlueSIKKworIzogb3B0aW9uLmM6NTYyMAorbXNnaWQgIkEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIk9rbm8gbuFobGVkdSBqaZ4gZXhpc3R1amUiCisKKyM6IG9wdGlvbi5jOjU4ODEgb3B0aW9uLmM6NTkxMAorbXNnaWQgIid3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIiIKKyJob2Rub3RhIHZvbGJ5ICd3aW5oZWlnaHQnIG5lc23tIGL9dCBtZW6a7SBuZZ4gaG9kbm90YSB2b2xieSAnd2lubWluaGVpZ2h0JyIKKworIzogb3B0aW9uLmM6NTkyNiBvcHRpb24uYzo1OTQ1Cittc2dpZCAiJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIiIKKyJob2Rub3RhIHZvbGJ5ICd3aW53aWR0aCcgbmVzbe0gYv10IG1lbprtIG5lniBob2Rub3RhIHZvbGJ5ICd3aW5taW53aWR0aCciCisKKyM6IG9wdGlvbi5jOjYwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAibWluaW3hbG7tIHBvdPhlYm79IHBv6GV0IPjhZGv5OiAlZCIKKworIzogb3B0aW9uLmM6NjA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIm1pbmlt4Wxu7SBwb3T4ZWJu/SBwb+hldCBzbG91cGP5OiAlZCIKKworIzogb3B0aW9uLmM6NjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE5lem7hbeEgdm9sYmE6ICVzIgorCisjOiBvcHRpb24uYzo2NTAwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS/NkeSB0ZXJtaW7hbHUgLS0tIgorCisjOiBvcHRpb24uYzo2NTAyCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTmFzdGF2ZW7tIGdsb2LhbG7tY2ggdm9sZWIgLS0tIgorCisjOiBvcHRpb24uYzo2NTA0Cittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBOYXN0YXZlbu0gbG9r4Wxu7WNoIHZvbGViIC0tLSIKKworIzogb3B0aW9uLmM6NjUwNgorbXNnaWQgIiIKKyJcbiIKKyItLS0gT3B0aW9ucyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVm9sYnkgLS0tIgorCisjOiBvcHRpb24uYzo3MTk2Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwIENIWUJBIgorCisjOiBvcHRpb24uYzo4MTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IHBybyAlcyBjaHli7SB2eWhvdnVq7WPtIHpuYWsiCisKKyM6IG9wdGlvbi5jOjgxNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogbmFkYnl0Zehu6SB6bmFreSBwbyBzdPhlZG7ta3U6ICVzIgorCisjOiBvc19hbWlnYS5jOjI3MworbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAibmVsemUgb3RldvjtdCAiCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiBOZWx6ZSBvdGV2+O10IG5vdukgb2tubyFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJWeZ5hZHVqZSBBbWlnYWRvcyB2ZXJ6ZSAyLjA0IG5lYm8gdnmamu1cbiIKKworIzogb3NfYW1pZ2EuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJWeZ5hZHVqZSAlcyB2ZXJ6ZSAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MDcKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIk5lbHplIG90ZXb47XQgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQxOAorbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICIgTmVsemUgdnl0dm/4aXQgIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSBidWRlIHVrb27oZW4gJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJOZWx6ZSB6bexuaXQgbfNkIGtvbnpvbGUgPyFcbiIKKworIzogb3NfYW1pZ2EuYzo5Mzggb3NfbWFjLmM6MTE2OCBvc19tc3dpbi5jOjYxOSBvc19yaXNjb3MuYzo3Mjggb3NfdW5peC5jOjI3MjYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IE5hc3Rhdm924W7tIHJlnmltdSBvYnJhem92a3kgbmVu7SBwb2Rwb3JvduFubyIKKworIzogb3NfYW1pZ2EuYzo5OTQKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiBuZW5pIGtvbnpvbGU/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTQyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IE5lbHplIHNwdXN0aXQgc2hlbGwgcyBwYXJhbWV0cmVtIC1mIgorCisjOiBvc19hbWlnYS5jOjExODMgb3NfYW1pZ2EuYzoxMjczCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJOZWx6ZSBzcHVzdGl0ICIKKworIzogb3NfYW1pZ2EuYzoxMTg2IG9zX2FtaWdhLmM6MTI4MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAic2hlbGwgIgorCisjOiBvc19hbWlnYS5jOjEyMDYgb3NfYW1pZ2EuYzoxMzA4Cittc2dpZCAiIHJldHVybmVkXG4iCittc2dzdHIgIiBu4XZyYXRvduEgaG9kbm90YSBzaGVsbHVcbiIKKworIzogb3NfYW1pZ2EuYzoxNDQ4Cittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIkFOQ0hPUl9CVUZfU0laRSBqZSBw+O1saZogbWFs4S4iCisKKyM6IG9zX2FtaWdhLmM6MTQ1MgorbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAiSS9PIENIWUJBIgorCisjOiBvc19tc3dpbi5jOjUwMworbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4oa3LhY2VubykiCisKKyM6IG9zX21zd2luLmM6NTk0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyBuZW7tIDgwLCBuZWx6ZSBzcHVzdGl0IGV4dGVybu0gcPjta2F6IgorCisjOiBvc19tc3dpbi5jOjcwNiBvc191bml4LmM6NDk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogVm9s4W7tIGtuaWhvdm7tIGZ1bmtjZSBcIiVzKClcIiBzZWxoYWxvIgorCisjOiBvc19tc3dpbi5jOjEzNDAKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IE5lbHplIHp2b2xpdCB0aXNr4XJudSIKKworIzogb3NfbXN3aW4uYzoxMzg4CisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICJkbyAlcyB2ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NDkgb3NfbXN3aW4uYzoxNDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogQ2h5YmEgdGlza3U6ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NjAKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICJOZXpu4W39IgorCisjOiBvc19tc3dpbi5jOjE0ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiVnl0aZp07G5vICclcyciCisKKyM6IG9zX21zd2luLmM6MjU1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDogTmVw+O1wdXN0buEgam3pbm8gem5ha2926SBzYWR5IFwiJXNcIiB2ZSBmb250dSBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjU1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBOZXD47XB1c3Ru/SB6bmFrICclYycgdmUgZm9udHUgXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjI3Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogTmVwbGF0bv0gJ29zZmlsZXR5cGUnIC0gcG91nml0IFRleHQiCisKKyM6IG9zX3VuaXguYzo4MDAKK21zZ2lkICJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIKK21zZ3N0ciAiVkltOiBkdm9qaXT9IHNpZ27hbCwga29u6O1tXG4iCisKKyM6IG9zX3VuaXguYzo4MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IFphY2h5Y2VuIHNtcnRlbG79IHNpZ27hbCAlc1xuIgorCisjOiBvc191bml4LmM6ODA5Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IFphY2h5Y2VuIHNtcnRlbG79IHNpZ27hbFxuIgorCisjOiBvc191bml4LmM6MTA2MworIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAiRG9iYSBvdGV27XLhbu0gWCBkaXNwbGVqZSAodiBtcyk6ICVsZCIKKworIzogb3NfdW5peC5jOjEwOTAKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBjaHliYSBYMTFcbiIKKworIzogb3NfdW5peC5jOjExNTcKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJUZXN0IFggZGlzcGxlamUgc2UgbmV6ZGH4aWwiCisKKyM6IG9zX3VuaXguYzoxMzAxCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAiVnlwcpplbCDoYXMgcPhpIOhla+Fu7SBuYSBvdGV2+GVu7SBYIGRpc3BsZWplIgorCisjOiBvc191bml4LmM6Mjg5OSBvc191bml4LmM6MzQ4MworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyJuZWx6ZSBzcHVzdGl0IHNoZWxsICIKKworIzogb3NfdW5peC5jOjI5NDQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5lbHplIHNwdXN0aXQgc2ggc2hlbGxcbiIKKworIzogb3NfdW5peC5jOjI5NDggb3NfdW5peC5jOjM0ODkKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisiIG7hdnJhdG924SBob2Rub3RhIHNoZWxsdSAiCisKKyM6IG9zX3VuaXguYzozMDgyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5lbHplIHZ5dHZv+Gl0IHJvdXJ5XG4iCisKKyM6IG9zX3VuaXguYzozMDk3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWb2zhbu0gZm9yayBzZWxoYWxvXG4iCisKKyM6IG9zX3VuaXguYzozNDk2Cittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiUPjta2F6IHVrb27oZW5cbiIKKworIzogb3NfdW5peC5jOjQ5OTMKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJPdGV2+GVu7SBYIGRpc3BsZWplIHNlIG5lemRh+GlsbyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiTmEg+OFka3UiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5lbHplIG5h6O1zdCB2aW0zMi5kbGwhIgorCisjOiBvc193MzJleGUuYzoxNjkgb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJDaHliYSBWSU11IgorCisjOiBvc193MzJleGUuYzoxNzkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJOZWx6ZSBuYXN0YXZpdCB1a2F6YXRlbGUgZnVua2PtIG5hIERMTCIKKworIzogb3Nfd2luMTYuYzo1Nzggb3Nfd2luMzIuYzozMDIxCisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJu4XZyYXRvduEgaG9kbm90YSBzaGVsbHUgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjQ4OQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IFphY2h5Y2VuICVzIHNpZ27hbFxuIgorCisjOiBvc193aW4zMi5jOjI0OTEKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAiemF2+O10IgorCisjOiBvc193aW4zMi5jOjI0OTMKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgImxvZ29mZiIKKworIzogb3Nfd2luMzIuYzoyNDk0Cittc2dpZCAic2h1dGRvd24iCittc2dzdHIgInNodXRkb3duIgorCisjOiBvc193aW4zMi5jOjI5NzUKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogUPjta2F6IG5lbu0gayBkaXNwb3ppY2kiCisKKyM6IG9zX3dpbjMyLmM6Mjk4OAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEUgc2UgbmV2eXNreXR1amUgdmUgVmGa7SAkUEFUSC5cbiIKKyJFeHRlcm7tIHD47WthenkgbmVidWRvdSAiCisKKyM6IG9zX3dpbjMyLmM6Mjk5MQorbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWYXJvduFu7SIKKworIzogcXVpY2tmaXguYzoyODEKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IFD47WxpmiBtbm9obyAlJSVjIHZlIGZvcm3hdG92YWPtbSD4ZXTsemNpIgorCisjOiBxdWlja2ZpeC5jOjI5NAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiBOZW/oZWvhdmFu/SB2/XNreXQgJSUlYyB2ZSBmb3Jt4XRvdmFj7W0g+GV07HpjaSIKKworIzogcXVpY2tmaXguYzozNDgKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogVmUgZm9ybeF0b3ZhY+1tIPhldOx6Y2kgY2h5Yu0gXSIKKworIzogcXVpY2tmaXguYzozNjIKK21zZ2lkICJFMzc1OiBVbnN1cHBvcnRlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzU6ICUlJWMgTmVwb2Rwb3JvdmFu4SBmb3Jt4XRvduEgc3BlY2lmaWthY2UgdmUgZm9ybeF0b3ZhY+1tIPhldOx6Y2kiCisKKyM6IHF1aWNrZml4LmM6MzgwCittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiBOZXD47XB1c3Ru6SAlJSVjIHYgcHJlZml4dSBmb3Jt4XRvdmFj7WhvIPhldOx6Y2UiCisKKyM6IHF1aWNrZml4LmM6Mzg4Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IE5lcPjtcHVzdG7pICUlJWMgdmUgZm9ybeF0b3ZhY+1tIPhldOx6Y2kiCisKKyM6IHF1aWNrZml4LmM6NDE0Cittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIG5lb2JzYWh1amUgnuFkbv0gdnpvcmVrIgorCisjOiBxdWlja2ZpeC5jOjUyMAorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IENoeWLsau1j7SBuZWJvIHBy4Xpkbv0gbuF6ZXYgYWRyZXPh+GUiCisKKyM6IHF1aWNrZml4LmM6OTMxCittc2dpZCAiTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAijuFkbukgZGFsmu0gcG9sb55reSIKKworIzogcXVpY2tmaXguYzoxMTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZC8lZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTE1NAorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiICj44WRlayBzbWF64W4pIgorCisjOiBxdWlja2ZpeC5jOjEzNjAKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IEtvbmVjIHF1aWNrZml4IHNlem5hbXUiCisKKyM6IHF1aWNrZml4LmM6MTM2OQorbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogWmHo4XRlayBxdWlja2ZpeCBzZXpuYW11IgorCisjOiBxdWlja2ZpeC5jOjEzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJzZXpuYW0gY2h5YiAlZCB6ICVkOyBwb+hldCBjaHliOiAlZCIKKworIzogcXVpY2tmaXguYzoxODQyCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogTmVsemUgdWxvnml0LCBqZSBuYXN0YXZlbmEgdm9sYmEgJ2J1ZnR5cGUnIgorCisjOiByZWdleHAuYzo4MDEKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiBWem9yIGplIHD47WxpmiBkbG91aP0iCisKKyM6IHJlZ2V4cC5jOjEzMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6ICVzKiIKKworIzogcmVnZXhwLmM6MTMxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6ICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIG5pYyBuZW7tIgorCisjOiByZWdleHAuYzoyNDY5CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJDaHliYSBzeW50YXhlIHYgJXN7Li4ufSIKKworIzogcmVnZXhwLmM6MjcxNgorbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiBaYWNoeWNlbm8gcPhldGXoZW7tIHrhc29ibu1rdTogcPjtbGmaIHNsb55pdP0gcmVndWzhcm7tIHb9cmF6PyIKKworIzogcmVnZXhwLmM6Mjg1MQorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogdnpvcmVrIHpw+XNvYmlsIHD4ZXRl6GVu7SB64XNvYm7ta3UiCisKKyM6IHJlZ2V4cC5jOjMwODcKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICJWbuxqmu0gcG9k+GF6ZW7pIHNob2R5OlxuIgorCisjOiBzY3JlZW4uYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAicG/oZXQg+OFka/kgdiB64Wh5YnU6ICUzbGQiCisKKyM6IHNjcmVlbi5jOjc0MjYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWUkVQTEFDRSIKKworIzogc2NyZWVuLmM6NzQzMAorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgUkVQTEFDRSIKKworIzogc2NyZWVuLmM6NzQzNQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgUkVWRVJTRSIKKworIzogc2NyZWVuLmM6NzQzNworbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiBJTlNFUlQiCisKKyM6IHNjcmVlbi5jOjc0NDAKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAoaW5zZXJ0KSIKKworIzogc2NyZWVuLmM6NzQ0MgorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAocmVwbGFjZSkiCisKKyM6IHNjcmVlbi5jOjc0NDQKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2cmVwbGFjZSkiCisKKyM6IHNjcmVlbi5jOjc0NDcKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIgaGVicmVqc2v9IgorCisjOiBzY3JlZW4uYzo3NDU1Cittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiIChsYW5nKSIKKworIzogc2NyZWVuLmM6NzQ1OAorbXNnaWQgIiAocGFzdGUpIgorbXNnc3RyICIgKHBhc3RlKSIKKworIzogc2NyZWVuLmM6NzQ2NAorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBTSE9EWSIKKworIzogc2NyZWVuLmM6NzQ2NgorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBWSVpVwUxOzSIKKworIzogc2NyZWVuLmM6NzQ2OAorbXNnaWQgIiBCTE9DSyIKK21zZ3N0ciAiIEJMT0siCisKKyM6IHNjcmVlbi5jOjc0NzAKK21zZ2lkICIgTElORSIKK21zZ3N0ciAiINjBREVLIgorCisjOiBzY3JlZW4uYzo3NDgzIHNjcmVlbi5jOjc1MzcKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgIm5haHLhduFtIgorCisjOiBzZWFyY2guYzozNgorbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAiaGxlZOFu7SBkb3PhaGxvIHph6OF0a3UsIHBva3Jh6G924W7tIG9kIGtvbmNlIgorCisjOiBzZWFyY2guYzozNworbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAiaGxlZOFu7SBkb3PhaGxvIGtvbmNlLCBwb2tyYehvduFu7SBvZCB6YejhdGt1IgorCisjOiBzZWFyY2guYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogTmVw+O1wdXN0bv0gaGxlZGFu/SD4ZXTsemVjOiAlcyIKKworIzogc2VhcmNoLmM6NzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDogaGxlZGFu/SBkb3PhaGxvIHph6OF0a3UgYmV6IG5hbGV6ZW7tICVzIgorCisjOiBzZWFyY2guYzo3NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiBobGVkYW79IGRvc+FobG8ga29uY2UgYmV6IG5hbGV6ZW7tICVzIgorCisjOiBzZWFyY2guYzoxMTA3Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiBQbyAnOycgb+hla+F24W0gJz8nIG5lYm8gJy8nIgorCisjOiBzZWFyY2guYzozNDc2Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAoduhldG7sIGppniB2eXBzYW79Y2ggc2hvZCkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6MzQ5NgorbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBWbG+eZW7pIHNvdWJvcnkiCisKKyM6IHNlYXJjaC5jOjM0OTgKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICIgbmVuYWxlemVueSIKKworIzogc2VhcmNoLmM6MzQ5OQorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgInYgY2VzdOwgLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM1MzgKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKEppniB2eXBz4W5vKSIKKworIzogc2VhcmNoLmM6MzU0MAorbXNnaWQgIiAgTk9UIEZPVU5EIgorbXNnc3RyICIgTkVOQUxFWkVOWSIKKworIzogc2VhcmNoLmM6MzU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAiUHJvaGxlZOF24W0gdmxvnmVu6SBzb3Vib3J5OiAlcyIKKworIzogc2VhcmNoLmM6MzgxMAorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogU2hvZGEgamUgbmEgYWt0deFsbu1tIPjhZGt1IgorCisjOiBzZWFyY2guYzozOTUwCittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIlaaZWNobnkgdmxvnmVu6SBzb3Vib3J5IGJ5bHkgbmFsZXplbnkiCisKKyM6IHNlYXJjaC5jOjM5NTIKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAijuFkbukgdmxvnmVu6SBzb3Vib3J5IgorCisjOiBzZWFyY2guYzozOTY4Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBOZWx6ZSBuYWzpenQgZGVmaW5pY2kiCisKKyM6IHNlYXJjaC5jOjM5NzAKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IE5lbHplIG5hbOl6dCB2em9yZWsiCisKKyM6IHN5bnRheC5jOjI5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IG5lcPjtcHVzdG79IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6MzE2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogU3ludGFrdGlja+Egc2VzdGF2YSAlcyBuZWV4aXN0dWplIgorCisjOiBzeW50YXguYzozMzMyCittc2dpZCAiTm8gU3ludGF4IGl0ZW1zIGRlZmluZWQgZm9yIHRoaXMgYnVmZmVyIgorbXNnc3RyICJQcm8gdGVudG8gYnVmZmVyIG5lanNvdSBkZWZpbm924W55IJ7hZG7pIHD4ZWRt7HR5IHN5bnRheGUiCisKKyM6IHN5bnRheC5jOjMzNDAKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgInN5bmNocm9uaXp1amkga29tZW504fhlIHYgQyBzdHlsdSIKKworIzogc3ludGF4LmM6MzM0OAorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgIp7hZG7hIHN5bmNocm9uaXphY2UiCisKKyM6IHN5bnRheC5jOjMzNTEKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgInN5bmNocm9uaXphY2UgemHo7W7hICIKKworIzogc3ludGF4LmM6MzM1MyBzeW50YXguYzozNDIyCittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiIPjhZGv5IHD4ZWQgemHo4XRrZW0iCisKKyM6IHN5bnRheC5jOjMzNTcKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBQb2xvnmt5IHN5bmNocm9uaXphY2Ugc3ludGF4ZSAtLS0iCisKKyM6IHN5bnRheC5jOjMzNjAKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorInN5bmNocm9uaXp1amkgcPhlZG3sdHkiCisKKyM6IHN5bnRheC5jOjMzNjUKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUPhlZG3sdHkgc3ludGF4ZSAtLS0iCisKKyM6IHN5bnRheC5jOjMzODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IFN5bnRha3RpY2vhIHNlc3RhdmEgJXMgbmVleGlzdHVqZSIKKworIzogc3ludGF4LmM6MzQxMgorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICJtaW5pbeFsbu0gIgorCisjOiBzeW50YXguYzozNDE5Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm1heGlt4Wxu7SAiCisKKyM6IHN5bnRheC5jOjQwNDcKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IGdyb3VwW3RdaGVyZSBuZXNt7SBi/XQgbmEgdG9tdG8gbe1zdOwiCisKKyM6IHN5bnRheC5jOjQwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIgorbXNnc3RyICJFMzk0OiBQcm8gJXMgY2h5Yu0gcG9sb55rYSByZWdpb251IgorCisjOiBzeW50YXguYzo0MDk5Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IG9ic2FodWplIGFyZ3VtZW50eSwga3RlcukgemRlIG5lanNvdSBwb3ZvbGVueSIKKworIzogc3ludGF4LmM6NDExMAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiBvYnNhaHVqZSBhcmd1bWVudHksIGt0ZXLpIHpkZSBuZWpzb3UgcG92b2xlbnkiCisKKyM6IHN5bnRheC5jOjQxODgKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5NzogVnmeYWRvduFuIG7hemV2IHNvdWJvcnUiCisKKyM6IHN5bnRheC5jOjQ1MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBDaHli7SAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBQ+O1saZogbeFsbyBhcmd1bWVudPk6IG9ibGFzdCBzeW50YXhlICVzIgorCisjOiBzeW50YXguYzo1MDExCittc2dpZCAiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiCittc2dzdHIgIkU0MDA6IE5lYnlsYSB6YWThbmEgnuFkbuEgc2VzdGF2YSIKKworIzogc3ludGF4LmM6NTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiBPZGTsbG92Yeggdnpvcmt1ICVzIG5lbmFsZXplbiIKKworIzogc3ludGF4LmM6NTEyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiBDaHliYSB6YSB2em9ya2VtICVzIgorCisjOiBzeW50YXguYzo1MjA1Cittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTQwMzogc3luY2hyb25pemFjZSBzeW50YXhlOiB2em9yZWsgcG9rcmHob3bhbu0g+OFka/kgemFk4W4gZHZha3LhdCIKKworIzogc3ludGF4LmM6NTI2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IG5lcPjtcHVzdG79IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NTMxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA1OiBNaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDA1OiBDaHli7SByb3Zu7XRrbzogJXMiCisKKyM6IHN5bnRheC5jOjUzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBQcuF6ZG79IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NTM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyB6ZGUgbmVu7SBwb3ZvbGVubyIKKworIzogc3ludGF4LmM6NTM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG11c+0gYv10IHBydm7tIHYgJ2NvbnRhaW5zJyBzZXpuYW11IgorCisjOiBzeW50YXguYzo1NDIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IE5lem7hbeEgbuF6ZXYgc2t1cGlueTogJXMiCisKKyM6IHN5bnRheC5jOjU2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiBjaHlibv0gcG9k+GF6ZW79IHD47WtheiA6c3ludGF4IDogJXMgIgorCisjOiBzeW50YXguYzo2MDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiBza3VwaW5hIHp2/XJhem7sbu0gJXMgbmVieWxhIG5hbGV6ZW5hIgorCisjOiBzeW50YXguYzo2MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBQ+O1saZogbeFsbyBhcmd1bWVudPk6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiBQ+O1saZogbW5vaG8gYXJndW1lbnT5OiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MDc1Cittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiBza3VwaW5hIGplIG5hc3RhdmVuYSwgb2RrYXogbmEgenb9cmF68m92YWPtIHNrdXBpbnUgaWdub3JvduFuIgorCisjOiBzeW50YXguYzo2MjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IG5l6GVrYW7pIHJvdm7tdGtvIDogJXMiCisKKyM6IHN5bnRheC5jOjYyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogY2h5Ym7pIHJvdm7tdGtvOiAlcyIKKworIzogc3ludGF4LmM6NjI2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogY2h5Yu0gYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo2Mjk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTg6IElsbGVnYWwgdmFsdWU6ICVzIgorbXNnc3RyICJFNDE4OiBuZXD47XB1c3Ru4SBob2Rub3RhOiAlcyIKKworIzogc3ludGF4LmM6NjQxOAorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IGJhcnZhIHBvcPhlZO0gbmVu7SB6buFt4SIKKworIzogc3ludGF4LmM6NjQyOQorbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IGJhcnZhIHBvcPhlZO0gbmVu7SB6buFt4SIKKworIzogc3ludGF4LmM6NjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IG7hemV2IOhpIOjtc2xvIGJhcnZ5ICVzIG5lYnlsbyByb3pwb3pu4W5vIgorCisjOiBzeW50YXguYzo2Njg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiB0ZXJtaW7hbG92/SBr82QgJXMgamUgcPjtbGmaIGRsb3Vo/SIKKworIzogc3ludGF4LmM6NjczNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogbmVw+O1wdXN0bv0gYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo3MjY0Cittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiIgorIkU0MjQ6IEplIHBvdZ7tduFubyBw+O1saZogdmVsa+kgbW5vnnN0du0gb2RsaZpu/WNoIHp2/XJhevJvdmFj7WNoIGF0cmlidXT5IgorCisjOiB0YWcuYzo5MAorbXNnaWQgImF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgImtvbmVjIHNlem5hbXUgdGFn+SIKKworIzogdGFnLmM6OTEKK21zZ2lkICJhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJ6YejhdGVrIHNlem5hbXUgdGFn+SIKKworIzogdGFnLmM6MzkyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IFD4ZWQgcHJ2bu0gdnlob3Z1au1j7SB0YWcgbmVsemUgcPhlc2tv6Gl0IgorCisjOiB0YWcuYzo1MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IHRhZyAlcyBuZW5hbGV6ZW4iCisKKyM6IHRhZy5jOjU0NQorbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmkgdHlwIHRhZyIKKworIzogdGFnLmM6NTQ4Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICJzb3Vib3JcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiWmFkZWp0ZSDo7XNsbyAoPENSPiBwcm8gdWtvbuhlbu0pOiAiCisKKyM6IHRhZy5jOjc0NgorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogVnlob3Z1amUgcG91emUgamVkZW4gdGFnIgorCisjOiB0YWcuYzo3NDgKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI4OiBaYSBwb3NsZWRu7SB2eWhvdnVq7WPtIHRhZyBuZWx6ZSBw+GVza2/oaXQiCisKKyM6IHRhZy5jOjc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiU291Ym9yIFwiJXNcIiBuZWV4aXN0dWplIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgInRhZyAlZCB6IGNlbGtvdulobyBwb+h0dSAlZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIG5lYm8gdu1jZSIKKworIzogdGFnLmM6Nzg1Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAgUG91nu124W0gdGFnIHMgcO1zbWVueSBqaW7pIHZlbGlrb3N0aSEiCisKKyM6IHRhZy5jOjgyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTogXCIlc1wiIG5lZXhpc3R1amUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6ODk3Cittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyBDzUwgdGFnICAgICAgICBTVEFSVCD44WRlayAgdiBzb3Vib3J1L3RleHR1IgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIkxpbmXhcm7tIGhsZWThbu0gdGFndSIKKworIzogdGFnLmM6MTE0NgorbXNnaWQgIkJpbmFyeSB0YWcgc2VhcmNoIgorbXNnc3RyICJCaW7hcm7tIGhsZWThbu0gdGFndSIKKworIzogdGFnLmM6MTE3MgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJQcm9obGVk4XbhbSBzb3Vib3IgdGFn+SAlcyIKKworIzogdGFnLmM6MTM1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogU291Ym9yIHRhZ/kgJXMgYnlsIG/4ZXrhblxuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBDaHliYSBmb3Jt4XR1IHYgc291Ym9ydSB0YWf5IFwiJXNcIiIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIlD4ZWQgYmFqdGVtICVsZCIKKworIzogdGFnLmM6MTg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IE9ic2FoIHNvdWJvciB0YWf5ICVzIG5lbu0gc2X4YXplbiIKKworIy4gbmV2ZXIgb3BlbmVkIGFueSB0YWdzIGZpbGUKKyM6IHRhZy5jOjE5MTEKK21zZ2lkICJFNDMzOiBObyB0YWdzIGZpbGUiCittc2dzdHIgIkU0MzM6II7hZG79IHNvdWJvciB0YWf5IgorCisjOiB0YWcuYzoyNTgzCittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogTmVsemUgbmFq7XQgdnpvcmVrIHRhZ/kiCisKKyM6IHRhZy5jOjI1OTQKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IFRhZyBuZWx6ZSBuYWzpenQsIHBvdXplIGjhZOFtISIKKworIzogdGVybS5jOjE3MjMKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicgbmVu7SB6buFtLiBEb3N0dXBu6SB2ZXN0YXbsbukgdGVybWlu4Wx5OiIKKworIzogdGVybS5jOjE3NDcKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgImltcGxpY2l0bu0gdGVybWlu4WwgJyIKKworIzogdGVybS5jOjIxMDAKK21zZ2lkICJDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIk5lbHplIG90ZXb47XQgdGVybWNhcCIKKworIzogdGVybS5jOjIxMDMKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIlRlcm1pbmZvIG5lb2JzYWh1amUgcG9sb55rdSBwcm8gdGVudG8gdGVybWlu4WwiCisKKyM6IHRlcm0uYzoyMTA1Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIlRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvnmt1IHBybyB0ZW50byB0ZXJtaW7hbCIKKworIzogdGVybS5jOjIyNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IFRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvnmt1IHBybyBcIiVzXCIiCisKKyM6IHRlcm0uYzoyNzM4Cittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IFRlcm1pbuFsIG11c+0gbe10IHNjaG9wbm9zdCBcImNtXCIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ4NzgKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEts4XZlc3kgdGVybWlu4Wx1IC0tLSIKKworIzogdWkuYzoyNDAKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJzcHWadOxuIG5vdv0gc2hlbGxcbiIKKworIzogdWkuYzoxNzA1Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogY2h5YmEgcPhpIOh0ZW7tIHZzdHVwdSwga29u6O1tLi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6MzUxCittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICJvZHN0cmFu7G7tIHpt7G4gbmVu7SBtb55u6TsgY2hjZXRlIHD4ZXN0byBwb2tyYehvdmF0IgorCisjOiB1bmRvLmM6NTA2Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzog6O1zbGEg+OFka/kganNvdSBjaHlibuEiCisKKyM6IHVuZG8uYzo2NzUKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAicG/oZXQgem3sbjogMSIKKworIzogdW5kby5jOjY3NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAicG/oZXQgem3sbjogJWxkIgorCisjOiB1bmRvLmM6NzIxCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IHrhem5hbSBvIHpt7G7hY2ggcG+aa296ZW4iCisKKyM6IHVuZG8uYzo3NTEKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDogY2h5Yu0gdW5kbyD44WRlayIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjY1NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2LzMyIGJpdG924SBHVUkgdmVyemUgcHJvIE1TIFdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzo2NTcKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvduEgR1VJIHZlcnplIHBybyBNUyBXaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6NjYwCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgdmUgV2luMzJzIHJlnmltdSIKKworIzogdmVyc2lvbi5jOjY2MgorbXNnaWQgIiB3aXRoIE9MRSBzdXBwb3J0IgorbXNnc3RyICIgcyBPTEUgcG9kcG9yb3UiCisKKyM6IHZlcnNpb24uYzo2NjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgYml0b3bhIHZlcnplIHBybyBNUyBXaW5kb3dzIGtvbnpvbHUiCisKKyM6IHZlcnNpb24uYzo2NjkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IGJpdG924SB2ZXJ6ZSBwcm8gTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjY3MworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvduEgdmVyemUgcHJvIE1TIFdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzo2NzUKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIE1TLURPUyB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjY4MQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyemUiCisKKyM6IHZlcnNpb24uYzo2ODMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjY4NgorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgdmVyemUiCisKKyM6IHZlcnNpb24uYzo2OTEKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUyB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjcwMQorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJQb3WeaXTpIHrhcGxhdHk6ICIKKworIzogdmVyc2lvbi5jOjcyOAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyJw+GVsb55pbCAiCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICJieSAiCittc2dzdHIgIiAiCisKKyM6IHZlcnNpb24uYzo3NDMKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIm1heGlt4Wxu7SB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjc0NgorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJ2ZWxr4SB2ZXJ6ZSAiCisKKyM6IHZlcnNpb24uYzo3NDkKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisibm9ybeFsbu0gdmVyemUiCisKKyM6IHZlcnNpb24uYzo3NTIKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJtYWzhIHZlcnplICIKKworIzogdmVyc2lvbi5jOjc1NAorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisibWluaW3hbG7tIHZlcnplIgorCisjOiB2ZXJzaW9uLmM6NzYwCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJiZXogZ3JhZmlja+lobyByb3pocmFu7SIKKworIzogdmVyc2lvbi5jOjc2NAorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEdUSy1HTk9NRSIKKworIzogdmVyc2lvbi5jOjc2NgorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEdUSyIKKworIzogdmVyc2lvbi5jOjc3MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIFgxMS1Nb3RpZiIKKworIzogdmVyc2lvbi5jOjc3MworbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICJTIHJvemhyYW7tbSBYMTEtQXRoZW5hIgorCisjOiB2ZXJzaW9uLmM6Nzc2Cittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEJlT1MiCisKKyM6IHZlcnNpb24uYzo3NzkKK21zZ2lkICJ3aXRoIFBob3RvbiBHVUkuIgorbXNnc3RyICJzIHJvemhyYW7tbSBQaG90b24iCisKKyM6IHZlcnNpb24uYzo3ODIKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgInMgZ3JhZmlja/1tIHJvemhyYW7tbSIKKworIzogdmVyc2lvbi5jOjc4NQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgInMgZ3JhZmlja/1tIHJvemhyYW7tbSBDYXJib24iCisKKyM6IHZlcnNpb24uYzo3ODgKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgInMgZ3JhZmlja/1tIHJvemhyYW7tbSBDb2NvYSIKKworIzogdmVyc2lvbi5jOjc5MQorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgInMgKGNsYXNpY2v9bSkgZ3JhZmlja/1tIHJvemhyYW7tbSIKKworIzogdmVyc2lvbi5jOjgwMgorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiBWbGFzdG5vc3RpIHphaHJudXTpICgrKSBhIG5lemFocm51dOkgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6ODE0Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBzeXN06W1vdv0gdmltcmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjgxOQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICB1nml2YXRlbHNr/SB2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODI0Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgZHJ1aP0gdZ5pdmF0ZWxza/0gdmltcmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIHT4ZXTtIHWeaXZhdGVsc2v9IHZpbXJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4MzQKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgIHWeaXZhdGVsc2v9IGV4cmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjgzOQorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICBkcnVo/SB1nml2YXRlbHNr/SBleHJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4NDUKK21zZ2lkICIgIHN5c3RlbSBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgc3lzdOltb3b9IGd2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgdZ5pdmF0ZWxza/0gZ3ZpbXJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4NTMKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgImRydWj9IHWeaXZhdGVsc2v9IGd2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODU4Cittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICJ0+GV07SB1nml2YXRlbHNr/SBndmltcmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjg2NQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIHN5c3TpbW92/SBzb3Vib3IgcyBtZW51OiBcIiIKKworIzogdmVyc2lvbi5jOjg3MworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICBpbXBsaWNpdG7tIGhvZG5vdGEgJFZJTTpcIiIKKworIzogdmVyc2lvbi5jOjg3OQorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICBpbXBsaWNpdG7tIGhvZG5vdGEgJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODgzCittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAiUPhla2xhZDogIgorCisjOiB2ZXJzaW9uLmM6ODg5Cittc2dpZCAiQ29tcGlsZXI6ICIKK21zZ3N0ciAiUPhla2xhZGHoOiAiCisKKyM6IHZlcnNpb24uYzo4OTQKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIkxpbmt1amk6ICIKKworIzogdmVyc2lvbi5jOjg5OQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgUE9EUE9SQSBMQUTMTs0iCisKKyM6IHZlcnNpb24uYzo5MzQKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgSU1wcm92ZWQiCisKKyM6IHZlcnNpb24uYzo5MzYKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyemUgIgorCisjOiB2ZXJzaW9uLmM6OTM3Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJBdXRvcjogQnJhbSBNb29sZW5hYXIgYSBkYWya7SIKKworIzogdmVyc2lvbi5jOjkzOAorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBqZSB2b2xu7CCaafhpdGVsbv0gcHJvZ3JhbSBzIG90ZXb4ZW79bSB6ZHJvam92/W0ga/NkZW0iCisKKyM6IHZlcnNpb24uYzo5NDAKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAiUG9tb3p0ZSBjaHVk/W0gZOx0ZW0gdiBVZ2FuZOwhIgorCisjOiB2ZXJzaW9uLmM6OTQxCittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAicG9kcm9ibuxqmu0gaW5mb3JtYWNlIHrtc2vhdGUgcG9tb2PtIDpoZWxwIGljY2Y8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTQzCittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAiemFkZWp0ZSA6cTxFbnRlcj4gICAgICAgICAgICAgcHJvIHVrb27oZW7tIHByb2dyYW11IgorCisjOiB2ZXJzaW9uLmM6OTQ0Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAiemFkZWp0ZSA6aGVscDxFbnRlcj4gIOhpIDxGMT4gcHJvIG7hcG927GR1IgorCisjOiB2ZXJzaW9uLmM6OTQ1Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiemFkZWp0ZSA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gIHBybyBpbmZvcm1hY2UgbyB2ZXJ6aSA2IgorCisjOiB2ZXJzaW9uLmM6OTQ4Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIkLsnu1tIHYgcmWeaW11IGtvbXBhdGliaWxpdHkgcyBWaSIKKworIzogdmVyc2lvbi5jOjk0OQorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgInphZGVqdGUgOnNldCBub2NwPEVudGVyPiAgICAgcHJvIGltcGxpY2l0bu0gbmFzdGF2ZW7tIFZpbSIKKworIzogdmVyc2lvbi5jOjk1MAorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInBvZHJvYm7saprtIGluZm9ybWFjZSB67XNr4XRlIHBvbW9j7SA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiIKKworIzogdmVyc2lvbi5jOjk5MAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIlZBUk9WwU7NOiBkZXRla2924W55IFdpbmRvd3MgOTUvOTgvTUUiCisKKyM6IHZlcnNpb24uYzo5OTMKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ6YWRlanRlIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gcHJvIHBvZHJvYm7saprtIGluZm9ybWFjZSIKKworIzogd2luZG93LmM6MjAxCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IE5lbu0gnuFkbukgcHJldmlldyBva25vIG5lbu0iCisKKyM6IHdpbmRvdy5jOjU2OAorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6IE9rbm8gbmVsemUgcm96ZOxsaXQgeuFyb3Zl8iB0b3BsZWZ0IGEgYm90cmlnaHQiCisKKyM6IHdpbmRvdy5jOjEzMjcKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IE5lbHplIHJvdG92YXQsIHBva3VkIGplIGppbukgb2tubyByb3pk7Gxlbm8iCisKKyM6IHdpbmRvdy5jOjE4MTAKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IFBvc2xlZG7tIG9rbm8gbmVsemUgdXphdvjtdCIKKworIzogd2luZG93LmM6MjQ3NAorbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJKaZ4gZXhpc3R1amUgcG91emUgamVkbm8gb2tubyIKKworIzogd2luZG93LmM6MjUyMQorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiBKaW7pIG9rbm8gb2JzYWh1amUgem3sbnkiCisKKyM6IHdpbmRvdy5jOjQzNDEKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiBQb2Qga3Vyem9yZW0gc2UgbmVuYWNo4XrtIG7hemV2IHNvdWJvcnUiCisKKyM6IHdpbmRvdy5jOjQ0NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiBTb3Vib3IgXCIlc1wiIG5lbHplIHYgcGF0aCBuYWzpenQiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg2Cittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJFZGl0YWNlICZtdWx0aXBsZSBWaW15IgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjU5MgorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiRWRpdGFjZSBqZWRu7W0gJFZpbSAtZW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjA0Cittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIkVkaXRhY2UgJlZpbSAtZW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIkVkaXRhY2UgZXhpc3R1au1j7W0gVmltZW0gLSAmIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjc1MgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICJFZGl0YWNlIHZ5YnJhbv1jaCBzb3Vib3L5IFZpbWVtIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MSAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk2OQorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAiQ2h5YmEgcPhpIHNwb3WadOxu7SBwcm9jZXN1OiBaa29udHJvbHVqdGUgemRhbGkgamUgZ3ZpbSB2ICRQQVRIISIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTIgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDYKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTcwCittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImNoeWJhIGd2aW1leHQuZGxsIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAiTuF6ZXYgKHYgcGF0aCkgamUgcPjtbGmaIGRsb3Vo/SIKKworIzogZ2xvYmFscy5oOjg3OAorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tQnVmZmVyIG5lb2JzYWh1amUgnuFkbv0g+OFkZWstLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDE5Cittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJQ+O1rYXogcPhlcnWaZW4iCisKKyM6IGdsb2JhbHMuaDoxMDIwCittc2dpZCAiQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkplIHZ5nmFkb3bhbiBhcmd1bWVudCIKKworIzogZ2xvYmFscy5oOjEwMjEKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogcG8gXFwgYnkgbexsIG7hc2xlZG92YXQgLy4gPyBuZWJvICYiCisKKyM6IGdsb2JhbHMuaDoxMDIzCittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiIgorIkUxMTogQ2h5YmEgdiBva27sIHD47Wthem926SD44WRreTsgPENSPiBwcm8gc3B1mnSabu0sIENUUkwtQyBwcm8gdWtvbuhlbu0iCisKKyM6IGdsb2JhbHMuaDoxMDI1Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiBQ+O1rYXogbmVu7SB6IGV4cmMvdmltcmMgdiBha3R14Wxu7W0gYWRyZXPh+Gkg6GkgcPhpIGhsZWThbu0gdGFndSAiCisicG92b2xlbi4iCisKKyM6IGdsb2JhbHMuaDoxMDI2Cittc2dpZCAiRTEzOiBGaWxlIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTM6IFNvdWJvciBleGlzdHVqZSAocG91nmlqdGUgISBwcm8gdnludWNlbu0pIgorCisjOiBnbG9iYWxzLmg6MTAyNworbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJQ+O1rYXogc2VsaGFsIgorCisjOiBnbG9iYWxzLmg6MTAyOAorbXNnaWQgIkludGVybmFsIGVycm9yIgorbXNnc3RyICJWbml0+G7tIGNoeWJhIgorCisjOiBnbG9iYWxzLmg6MTAyOQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICJQ+GVydZplbm8iCisKKyM6IGdsb2JhbHMuaDoxMDMwCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogQ2h5Ym7hIGFkcmVzYSIKKworIzogZ2xvYmFscy5oOjEwMzEKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICJDaHlibv0gYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJDaHlibv0gYXJndW1lbnQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTAzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTogQ2h5Ym79IHb9cmF6OiAlcyIKKworIzogZ2xvYmFscy5oOjEwMzYKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogQ2h5Ym79IHJvenNhaCIKKworIzogZ2xvYmFscy5oOjEwMzcKK21zZ2lkICJJbnZhbGlkIGNvbW1hbmQiCittc2dzdHIgIkNoeWJu/SBw+O1rYXoiCisKKyM6IGdsb2JhbHMuaDoxMDM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiBqZSBhZHJlc+H4ZW0iCisKKyM6IGdsb2JhbHMuaDoxMDQyCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiBOZW/oZWvhdmFu6SB6bmFreSBw+GVkICc9JyIKKworIzogZ2xvYmFscy5oOjEwNDQKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTogWm5h6GthIG3hIGNoeWJu6SDo7XNsbyD44WRrdSIKKworIzogZ2xvYmFscy5oOjEwNDUKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBuZW7tIG5hc3RhdmVuYSIKKworIzogZ2xvYmFscy5oOjEwNDYKK21zZ2lkICJFMjE6IENhbm5vdCBtYWtlIGNoYW5nZXMsICdtb2RpZmlhYmxlJyBpcyBvZmYiCittc2dzdHIgIkUyMTogTmVsemUgbexuaXQsIGplIG5hc3RhdmVuYSB2b2xiYSAnbW9kaWZpYWJsZSciCisKKyM6IGdsb2JhbHMuaDoxMDQ3Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiBTa3JpcHQgdm5v+GVuIHD47WxpmiBobHVib2tvIgorCisjOiBnbG9iYWxzLmg6MTA0OAorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogjuFkbv0gYWx0ZXJuYXRpdm7tIHNvdWJvciIKKworIzogZ2xvYmFscy5oOjEwNDkKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IFRha2924SB6a3JhdGthIG5lZXhpc3R1amUiCisKKyM6IGdsb2JhbHMuaDoxMDUwCittc2dpZCAiTm8gISBhbGxvd2VkIgorbXNnc3RyICIhIG5lbu0gcG92b2xlbm8iCisKKyM6IGdsb2JhbHMuaDoxMDUyCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBOZWx6ZSBwb3We7XQgR1VJOiBuZWJ5bG8gemFwbnV0byBw+GkgcPhla2xhZHUgcHJvZ3JhbXUiCisKKyM6IGdsb2JhbHMuaDoxMDU1Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICIiCisiRTI2OiBuZWx6ZSBwb3We7XQgaGVicmVqc2v9IHJlnmltOiAgbmVieWwgemFwbnV0IHD4aSBw+GVrbGFkdSBwcm9ncmFtdVxuIgorCisjOiBnbG9iYWxzLmg6MTA1OAorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IE5lbHplIHBvdZ7tdCBmYXJzaSByZZ5pbTogIG5lYnlsIHphcG51dCBw+GkgcPhla2xhZHUgcHJvZ3JhbXVcbiIKKworIzogZ2xvYmFscy5oOjEwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiBTa3VwaW5hIHp2/XJhem7sbu0gJXMgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwNjMKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IFphdO1tIG5lbu0gnuFkbv0gdmxvnmVu/SB0ZXh0IgorCisjOiBnbG9iYWxzLmg6MTA2NAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6II7hZG7hIHD4ZWRjaG967SBw+O1rYXpvduEg+OFka2EiCisKKyM6IGdsb2JhbHMuaDoxMDY1Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogjuFkbukgdGFrb3bpIG1hcG924W7tIgorCisjOiBnbG9iYWxzLmg6MTA2NgorbXNnaWQgIk5vIG1hdGNoIgorbXNnc3RyICKO4WRu4SBzaG9kYSIKKworIzogZ2xvYmFscy5oOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICKO4WRu4SBzaG9kYTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDY4Cittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIkUzMjogjuFkbv0gbuF6ZXYgc291Ym9ydSIKKworIzogZ2xvYmFscy5oOjEwNjkKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IJ7hZG79IHD4ZWRjaG967SByZWd1bOFybu0gdv1yYXoiCisKKyM6IGdsb2JhbHMuaDoxMDcwCittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6II7hZG79IHD4ZWRjaG967SBw+O1rYXoiCisKKyM6IGdsb2JhbHMuaDoxMDcxCittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTognuFkbv0gcPhlZGNob3rtIHJlZ3Vs4XJu7SB2/XJheiIKKworIzogZ2xvYmFscy5oOjEwNzIKK21zZ2lkICJObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJSb3pzYWggbmVu7SBwb3ZvbGVuIgorCisjOiBnbG9iYWxzLmg6MTA3NAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IE5lZG9zdGF0ZWsgbe1zdGEiCisKKyM6IGdsb2JhbHMuaDoxMDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJOZWx6ZSB2eXR2b/hpdCBzb3Vib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc3Cittc2dpZCAiQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJOZWx6ZSB67XNrYXQgbuF6ZXYgZG/oYXNu6WhvIHNvdWJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAiTmVsemUgb3RldvjtdCBzb3Vib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiTmVsemUg6O1zdCBzb3Vib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDgwCittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMzc6IE5ldWxvnmVu6SB6bexueSAocG91nmlqdGUgISBwcm8gdnludWNlbu0pIgorCisjOiBnbG9iYWxzLmg6MTA4MQorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiBOdWxvdv0gYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMDgzCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogT+hla+F24W5vIOjtc2xvIgorCisjOiBnbG9iYWxzLmg6MTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIgorbXNnc3RyICJFNDA6IE5lbHplIG90ZXb47XQgY2h5Ym92/SBzb3Vib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiBOZWRvc3RhdGVrIHBhbex0aSEiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIlZ6b3IgbmVuYWxlemVuIgorCisjOiBnbG9iYWxzLmg6MTA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIlZ6b3IgbmVuYWxlemVuOiAlcyIKKworIzogZ2xvYmFscy5oOjEwOTUKK21zZ2lkICJBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICJBcmd1bWVudCBtdXPtIGL9dCBrbGFkbv0iCisKKyM6IGdsb2JhbHMuaDoxMDk3Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0MjogjuFkbukgY2h5YnkiCisKKyM6IGdsb2JhbHMuaDoxMDk5Cittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBQb5prb3plbv0g+GV07HplYyBwcm8gdnlobGVk4Xbhbu0iCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogcG+aa296ZW79IHJlZ2V4cCBwcm9ncmFtIgorCisjOiBnbG9iYWxzLmg6MTEwMQorbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTogJ25hc3RhdmVuYSB2b2xiYSAncmVhZG9ubHknIChwb3WeaWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGdsb2JhbHMuaDoxMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IE5lbHplIG5hc3Rhdml0IHBvdXplX3Byb1/odGVu7SBwcm9t7G5ub3UgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTEwNgorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0NzogQ2h5YmEgcPhpIOh0ZW7tIGNoeWJvdulobyBzb3Vib3J1IgorCisjOiBnbG9iYWxzLmg6MTEwOQorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBOZW7tIHYgYmV6cGXobm9zdG7tIHNjaHLhbmNlIHBvdm9sZW5vIgorCisjOiBnbG9iYWxzLmg6MTExMQorbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiBDaHlibuEgaG9kbm90YSB2b2xieSAnc2Nyb2xsJyIKKworIzogZ2xvYmFscy5oOjExMTIKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IHZvbGJhICdzaGVsbCcgamUgcHLhemRu4SIKKworIzogZ2xvYmFscy5oOjExMTMKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiBDaHliYSBw+GkgdXphdu1y4W7tIG9ka2zhZGFj7WhvIHNvdWJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMTE0Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3Mzogc2V6bmFtIHRhZ/kgamUgcHLhemRu/SIKKworIzogZ2xvYmFscy5oOjExMTUKK21zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCittc2dzdHIgIkU3NDogUPjta2F6IGplIHD47WxpmiBzbG+eaXT9IgorCisjOiBnbG9iYWxzLmg6MTExNgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiBO4XpldiBqZSBw+O1saZogZGxvdWj9IgorCisjOiBnbG9iYWxzLmg6MTExNworbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiBw+O1saZogbW5vaG8gWyIKKworIzogZ2xvYmFscy5oOjExMTgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogUPjtbGmaIG1ub2hvIG7henb5IHNvdWJvcvkiCisKKyM6IGdsb2JhbHMuaDoxMTE5Cittc2dpZCAiVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAiTmFkYnl0Zehu6SB6bmFreSBuYSBrb25jaSIKKworIzogZ2xvYmFscy5oOjExMjAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiBOZXpu4W3hIHpuYehrYSIKKworIzogZ2xvYmFscy5oOjExMjEKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6IE5lbHplIGV4cGFuZG92YXQgnm9s7Wtvdukgem5ha3kiCisKKyM6IGdsb2JhbHMuaDoxMTIyCittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IENoeWJhIHD4aSB1a2zhZOFu7SIKKworIzogZ2xvYmFscy5oOjExMjMKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICJOdWxvdv0gcG/oZXQiCisKKyM6IGdsb2JhbHMuaDoxMTI1Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBQb3WeaXTtIDxTSUQ+IG1pbW8ga29udGV4dCBza3JpcHR1IgpkaWZmIC0tZ2l0IGEvc3JjL3BvL2NzLnBvIGIvc3JjL3BvL2NzLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGM2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vY3MucG8KQEAgLTAsMCArMSw1OTU0IEBACisjIEN6ZWNoIHRyYW5zbGF0aW9uIG9mIHZpbQorIyBKafjtIFBhdmxvdnNr/SA8anBhdmxvdnNreUBtYm94LnZvbC5jej4sIDIwMDAgLSAyMDAyLgorIyBTb21lIGNvbXBsZXRpb24gZm9yIHZpbTYuMCBhZGRlZCBieSBKafjtIEL4ZXppbmEgPGJyekBjZW50cnVtLmN6PgorIyBTb21lIGJ1Z2ZpeGVzIGJ5IFRvbeG5IFplbGxlcmluIDx6ZWxsZXJpbkB2b2xueS5jej4KKyMKKyMgT3JpZ2luYWwgdHJhbnNsYXRpb25zLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogdmltLTYuMFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAxLTEwLTA4IDA4OjI3LTA3MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAyLTAyLTA2IDIyOjI5KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEpp+O0gUGF2bG92c2v9IDxqcGF2bG92c2t5QG1ib3gudm9sLmN6PlxuIgorIkxhbmd1YWdlLVRlYW06IEN6ZWNoIDxjc0BsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMlxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYnVmZmVyLmM6OTcKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IE5lbHplIGFsb2tvdmF0IL7hZG79IGJ1ZmZlciwga29u6O1tLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBOZWx6ZSBhbG9rb3ZhdCBidWZmZXIsIHBvdb5pamkgamlu/S4uLiIKKworIzogYnVmZmVyLmM6Njk4Cittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICKu4WRu/SBidWZmZXIgbmVieWwgZGVha3Rpdm924W4iCisKKyM6IGJ1ZmZlci5jOjcwMAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICKu4WRu/SBidWZmZXIgbmVieWwgc21heuFuIgorCisjOiBidWZmZXIuYzo3MDIKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICKu4WRu/SBidWZmZXIgbmVieWwgemFob3plbiIKKworIzogYnVmZmVyLmM6NzEwCittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIlBv6GV0IGRlYWt0aXZvdmFu/WNoIGJ1ZmZlcvk6IDEiCisKKyM6IGJ1ZmZlci5jOjcxMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICJQb+hldCBkZWFrdGl2b3Zhbv1jaCBidWZmZXL5OiAlZCIKKworIzogYnVmZmVyLmM6NzE3Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiUG/oZXQgc21hemFu/WNoIGJ1ZmZlcvk6IDEiCisKKyM6IGJ1ZmZlci5jOjcxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIlBv6GV0IHNtYXphbv1jaCBidWZmZXL5OiAlZCIKKworIzogYnVmZmVyLmM6NzI0Cittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICJQb+hldCB6YWhvemVu/WNoIGJ1ZmZlcvk6IDEiCisKKyM6IGJ1ZmZlci5jOjcyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiUG/oZXQgemFob3plbv1jaCBidWZmZXL5OiAlZCIKKworIzogYnVmZmVyLmM6NzgzCittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogTmVieWwgbmFsZXplbiC+4WRu/SB6bexu7G79IGJ1ZmZlciIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjgyMgorbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiBTZXpuYW0gYnVmZmVy+SBqZSBwcuF6ZG79IgorCisjOiBidWZmZXIuYzo4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiBOZWx6ZSBw+GVza2/oaXQgbmEgYnVmZmVyICVsZCIKKworIzogYnVmZmVyLmM6ODM3Cittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6IFphIHBvc2xlZG7tIGJ1ZmZlciBuZWx6ZSBw+GVza2/oaXQiCisKKyM6IGJ1ZmZlci5jOjgzOQorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogUPhlZCBwcnZu7SBidWZmZXIgbmVsemUgcPhlc2tv6Gl0IgorCisjOiBidWZmZXIuYzo4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6IFpt7G55IHYgYnVmZmVydSAlbGQgbmVieWx5IHVsb75lbnkgKCEgcHJvIHZ5bnVjZW7tKSIKKworIzogYnVmZmVyLmM6ODc5Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IFBvc2xlZG7tIGJ1ZmZlciBuZWx6ZSBkZWFrdGl2b3ZhdCIKKworIzogYnVmZmVyLmM6MTMxNAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IFZhcm924W7tOiBw+GV0Zehlbu0gc2V6bmFtdSBzIG7henZ5IHNvdWJvcvkiCisKKyM6IGJ1ZmZlci5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiBCdWZmZXIgJWxkIG5lbmFsZXplbiIKKworIzogYnVmZmVyLmM6MTcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IFZ6b3J1ICVzIHZ5aG92dWplIHbtY2UgYnVmZmVy+SIKKworIzogYnVmZmVyLmM6MTcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogVnpvcnUgJXMgbmV2eWhvdnVqZSC+4WRu/SBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjIxMDUgZXhfZG9jbWQuYzo2MDY1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICL44WRlayAlbGQiCisKKyM6IGJ1ZmZlci5jOjIxODgKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiBCdWZmZXIgdG9ob3RvIGpt6W5hIGppviBleGlzdHVqZSIKKworIzogYnVmZmVyLmM6MjQ4MQorbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW1pt7G7sbv1dIgorCisjOiBidWZmZXIuYzoyNDg2Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbTmVlZGl0b3Zhbv1dIgorCisjOiBidWZmZXIuYzoyNDkxCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW05vdv0gc291Ym9yXSIKKworIzogYnVmZmVyLmM6MjQ5MgorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltDaHlieSBw+Gkg6HRlbu1dIgorCisjOiBidWZmZXIuYzoyNDk0IGZpbGVpby5jOjE3NTQKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbUG91emUgcHJvIOh0ZW7tXSIKKworIzogYnVmZmVyLmM6MjUxMAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAi+OFka/k6IC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNTEwCittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICL44WRr+TogJWxkIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNTE4Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIvjhZGVrICVsZC8lbGQgLS0lZCUlLS0gc2xvdXBlYyIKKworIzogYnVmZmVyLmM6MjYwNgorbXNnaWQgIltObyBmaWxlXSIKK21zZ3N0ciAiW67hZG79IHNvdWJvcl0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjY0NgorbXNnaWQgImhlbHAiCittc2dzdHIgIm7hcG927GRhIgorCisjOiBidWZmZXIuYzozMTUxIHNjcmVlbi5jOjQ2NzEKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIltu4XBvduxkYV0iCisKKyM6IGJ1ZmZlci5jOjMxODMgc2NyZWVuLmM6NDY3NworbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW27haGxlZF0iCisKKyM6IGJ1ZmZlci5jOjMzODkKK21zZ2lkICJBbGwiCittc2dzdHIgIla5ZSIKKworIzogYnVmZmVyLmM6MzM4OQorbXNnaWQgIkJvdCIKK21zZ3N0ciAiS29uZWMiCisKKyM6IGJ1ZmZlci5jOjMzOTEKK21zZ2lkICJUb3AiCittc2dzdHIgIlph6OF0ZWsiCisKKyM6IGJ1ZmZlci5jOjQxMjcKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgU2V6bmFtIGJ1ZmZlcvk6XG4iCisKKyM6IGJ1ZmZlci5jOjQxNjAKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIltzZXpuYW0gY2h5Yl0iCisKKyM6IGJ1ZmZlci5jOjQxNzMgbWVtbGluZS5jOjE1MTMKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIlu+4WRu/SBzb3Vib3JdIgorCisjOiBidWZmZXIuYzo0MzkzCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gWm5ha3kgLS0tIgorCisjOiBidWZmZXIuYzo0NDAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIlpuYWt5IHBybyAlczoiCisKKyM6IGJ1ZmZlci5jOjQ0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIPjhZGVrPSVsZCBpZD0lZCBqbelubz0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogTmVsemUgcPhla3Jv6Gl0IG1heGlt4Wxu7SBwb+hldCAlbGQgZGlmZiBidWZmZXL5IgorCisjOiBkaWZmLmM6NjQ4Cittc2dpZCAiRTk3OiBDYW5ub3QgY3JlYXRlIGRpZmZzIgorbXNnc3RyICJFOTc6IE5lbHplIHZ5dHZv+Gl0IGRpZmZ5IgorCisjOiBkaWZmLmM6NzQ3Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiU291Ym9yIHNlIHrhcGxhdG91IgorCisjOiBkaWZmLmM6OTkxCittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiBOZWx6ZSDo7XN0IHb9c3R1cCBwcm9ncmFtdSBkaWZmIgorCisjOiBkaWZmLmM6MTcwNAorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiBBa3R14Wxu7SBidWZmZXIgbmVu7SB2IGRpZmYgcmW+aW11IgorCisjOiBkaWZmLmM6MTcxNgorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IFRvIGJ5bCBwb3NsZWRu7SBidWZmZXIgdiBkaWZmIHJlvmltdSIKKworIzogZGlmZi5jOjE3MjQKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IFYgZGlmZiByZb5pbXUganNvdSB27WNlIG5lviBkdmEgYnVmZmVyeS4gTmV27W0sIGt0ZXL9IG3hbSBwb3W+7XQuIgorCisjOiBkaWZmLmM6MTc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IE5lbHplIG5hbOl6dCBidWZmZXIgXCIlc1wiIgorCisjOiBkaWZmLmM6MTc1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgbmVu7SB2IGRpZmYgcmW+aW11IgorCisjOiBkaWdyYXBoLmM6MjE2OAorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiBkaWdyYXBoIG5lc23tIG9ic2Fob3ZhdCBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQwCittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJTb3Vib3IgcyBtYXBvdSBrbOF2ZXNuaWNlIG5lYnlsIG5hbGV6ZW4iCisKKyM6IGRpZ3JhcGguYzoyMzY3Cittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiA6bG9hZGtleW1hcCBtaW1vIGludGVycHJldG92YW79IHNvdWJvciIKKworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SBrbO3ob3b9Y2ggc2xvdiAoXk4vXlApIgorCisjLiBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyM6IGVkaXQuYzo0MQorbXNnaWQgIiBeWCBtb2RlICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCittc2dzdHIgIiBeWCByZb5pbSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgTG9r4Wxu7SBkb3Bs8m924W7tIGts7ehvdv1jaCBzbG92ICheTi9eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5ML15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gY2Vs/WNoIPjhZGv5ICheTC9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NgorbXNnaWQgIiBGaWxlIG5hbWUgY29tcGxldGlvbiAoXkYvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SBu4Xp2+SBzb3Vib3L5ICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SB0YWf5ICheSS9eTi9eUCkiCisKKyM6IGVkaXQuYzo0OAorbXNnaWQgIiBQYXRoIHBhdHRlcm4gY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SB2em9ydSBjZXN0ICheTi9eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3bhbu0gZGVmaW5pYyAoXkQvXk4vXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheSy9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m924W7tIHBvZGxlIHNsb3Zu7Wt1ICheSy9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlQvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SBwb2RsZSB0ZXphdXJ1ICheVC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvduFu7SBw+O1rYXpvdukg+OFka3kgKF5JL15OL15QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIktvbmVjIG9kc3RhdmNlIgorCisjOiBlZGl0LmM6ODk0Cittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJ2b2xiYSAndGhlc2F1cnVzJyBqZSBwcuF6ZG7hIgorCisjOiBlZGl0LmM6MTA3MAorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgInZvbGJhICdkaWN0aW9uYXJ5JyBqZSBwcuF6ZG7hIgorCisjOiBlZGl0LmM6MTk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBkaWN0aW9uYXJ5OiAlcyIKK21zZ3N0ciAiUHJvaGxlZOF24W0gc2xvdm7tayAlcyIKKworIzogZWRpdC5jOjIxODMKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAoaW5zZXJ0KSBSb2xvduFu7SAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjE4NQorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAocmVwbGFjZSkgUm9sb3bhbu0gKF5FL15ZKSIKKworIzogZWRpdC5jOjI0OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICJQcm9obGVk4XbhbSAlcyIKKworIzogZWRpdC5jOjI1MzEKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAiUHJvaGxlZOF24W0gdGFneSIKKworIzogZWRpdC5jOjMxODkKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICJQ+Glk4XbhbSIKKworIy4gc2hvd21vZGUgbWlnaHQgcmVzZXQgdGhlIGludGVybmFsIGxpbmUgcG9pbnRlcnMsIHNvIGl0IG11c3QKKyMuICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisjLiAqIGxvbmdlciBuZWVkZWQuICAtLSBBY2V2ZWRvLgorIy4KKyM6IGVkaXQuYzozMjM4Cittc2dpZCAiLS0gU2VhcmNoaW5nLi4uIgorbXNnc3RyICItLSBIbGVk4W0uLi4iCisKKyM6IGVkaXQuYzozMjk0Cittc2dpZCAiQmFjayBhdCBvcmlnaW5hbCIKK21zZ3N0ciAiVv1jaG967SBwb2RvYmEiCisKKyM6IGVkaXQuYzozMjk5Cittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIlNsb3ZvIHogamlu6WhvIPjhZGt1IgorCisjOiBlZGl0LmM6MzMwNAorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJKZWRpbuEgc2hvZGEiCisKKyM6IGVkaXQuYzozMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICJzaG9kYSAlZC8lZCIKKworIzogZWRpdC5jOjMzNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgInNob2RhICVkIgorCisjOiBldmFsLmM6Njk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogTmV6buFt4SBwcm9t7G5u4TogXCIlc1wiIgorCisjOiBldmFsLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogQ2h5Yu0geuF2b3JreTogJXMiCisKKyM6IGV2YWwuYzoxMDQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogUHJvbexubuEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGV2YWwuYzoxMjg0Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBQbyAnPycgY2h5Yu0gJzonIgorCisjOiBldmFsLmM6MTg5OAorbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiBDaHli7GrtY+0gJyknIgorCisjOiBldmFsLmM6MTk0OAorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBDaHli7GrtY+0gJ10nIgorCisjOiBldmFsLmM6MjAyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjogQ2h5Yu0gam3pbm8gdm9sYnk6ICVzIgorCisjOiBldmFsLmM6MjA0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE5lem7hbeEgdm9sYmE6ICVzIgorCisjOiBldmFsLmM6MjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogQ2h5Yu0gdXZvem92a3k6ICVzIgorCisjOiBldmFsLmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogQ2h5Yu0gdXZvem92a3k6ICVzIgorCisjOiBldmFsLmM6MjUzNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IENoeWJu6SBhcmd1bWVudHkgcHJvIGZ1bmtjaSAlcyIKKworIzogZXZhbC5jOjI1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IE5lem7hbeEgZnVua2NlOiAlcyIKKworIzogZXZhbC5jOjI1MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IFD47WxpuSBtbm9obyBhcmd1bWVudPkgcHJvIGZ1bmtjaSAlcyIKKworIzogZXZhbC5jOjI1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTogUPjtbGm5IG3hbG8gYXJndW1lbnT5IHBybyBmdW5rY2kgJXMiCisKKyM6IGV2YWwuYzoyNTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogUG91vml07SA8U0lEPiBtaW1vIGtvbnRleHQgc2tyaXB0dTogJXMiCisKKyM6IGV2YWwuYzozNTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIPjhZGv5OiIKKworIzogZXZhbC5jOjQ2OTAKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPS1xuIgorIiZacnW5aXQiCisKKyM6IGV2YWwuYzo1NTEzCittc2dpZCAiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIgorbXNnc3RyICJFMjQwOiBOZWV4aXN0dWplIHD4aXBvamVu7SBrIFZpbSBzZXJ2ZXJ1IgorCisjOiBldmFsLmM6NTYwMworbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiBOZWx6ZSDo7XN0IG9kcG927O8gc2VydmVydSIKKworIzogZXZhbC5jOjU2MjgKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IE5lbHplIHD4ZWRhdCBrbGllbnRvdmkiCisKKyM6IGV2YWwuYzo1NjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiBOZWx6ZSBw+GVkYXQgZG8gJXMiCisKKyM6IGV2YWwuYzo1NzY3Cittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIoQ2h5Ym79KSIKKworIzogZXZhbC5jOjY3NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogTmVkZWZpbm92YW7hIHByb23sbm7hOiAlcyIKKworIzogZXZhbC5jOjc0NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIHVzZSAhIHRvIHJlcGxhY2UiCittc2dzdHIgIkUxMjI6IEZ1bmtjZSAlcyBqab4gZXhpc3R1amUuIFBvdb5panRlICEgcHJvIGplau0gbmFocmF6ZW7tLiIKKworIzogZXZhbC5jOjc1MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogTmVkZWZpbm92YW7hIGZ1bmtjZTogJXMiCisKKyM6IGV2YWwuYzo3NTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogQ2h5Yu0gJygnOiAlcyIKKworIzogZXZhbC5jOjc1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IE5lcPjtcHVzdG79IGFyZ3VtZW50OiAlcyIKKworIzogZXZhbC5jOjc2NDEKK21zZ2lkICJFMTI2OiBNaXNzaW5nIDplbmRmdW5jdGlvbiIKK21zZ3N0ciAiRTEyNjogQ2h5Yu0gOmVuZGZ1bmN0aW9uIgorCisjOiBldmFsLmM6NzcyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzogTmVsemUgcPhlZGVmaW5vdmF0IGZ1bmtjaSAlczogamUgcG91vu124W5hIgorCisjOiBldmFsLmM6Nzc3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBO4XpldiBmdW5rY2UgbXVz7SB6YejtbmF0IHZlbGv9bSBw7XNtZW5lbTogJXMiCisKKyM6IGV2YWwuYzo3NzgzCittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTogSmUgdnm+YWRvduFubyBqbelubyBmdW5rY2UiCisKKyM6IGV2YWwuYzo3ODc2Cittc2dpZCAiZnVuY3Rpb24gIgorbXNnc3RyICJmdW5rY2UgIgorCisjOiBldmFsLmM6Nzk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBOZWRlZmlub3ZhbuEgZnVua2NlOiAlcyIKKworIzogZXZhbC5jOjc5OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiBOZWx6ZSBzbWF6YXQgZnVua2NpICVzOiBqZSBqab4gcG91vu124W5hIgorCisjOiBldmFsLmM6ODA0MworbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IFphbm/4ZW7tIGZ1bmtjZSBqZSBobHViue0gbmW+ICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MDk0CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgInZvbOFtICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MTE5IGV4X2NtZHMyLmM6MTk3MworIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJwb2tyYeh1amkgdiAlcyIKKworIzogZXZhbC5jOjgxNzMKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybiBtaW1vIGZ1bmtjaSIKKworIzogZXZhbC5jOjgyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgImRva29u6GVubyBwcm924WTsbu0gJXMuIE7hdnJhdG924SBob2Rub3RhICMlbGQiCisKKyM6IGV2YWwuYzo4MjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgImRva29u6GVubyBwcm924WTsbu0gJXMuIE7hdnJhdG924SBob2Rub3RhIFwiJXNcIiIKKworIzogZXZhbC5jOjgzOTUKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBnbG9i4Wxu7SBwcm9t7G5u6TpcbiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAguWVzdG7hY3Rrb3bsICUwMngsICBvc21p6GtvduwgJTAzbyIKKworIzogZXhfY21kcy5jOjQyOAorbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiBOZWx6ZSBw+GVzdW5vdXQg+OFka3kgbmEgcPl2b2Ru7SBt7XN0byIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAicG/oZXQgcPhlc3VudXT9Y2gg+OFka/k6IDEiCisKKyM6IGV4X2NtZHMuYzo0OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICJQb+hldCBw+GVzdW51dP1jaCD44WRr+TogJWxkIgorCisjOiBleF9jbWRzLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAiUG/oZXQgZmlsdHJvdmFu/WNoIPjhZGv5OiAlbGQiCisKKyM6IGV4X2NtZHMuYzo5MTgKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiBBdXRvbWF0aWNr6SBw+O1rYXp5ICpGaWx0ZXIqIG5lc23tIG3sbml0IGFrdHXhbG7tIGJ1ZmZlciIKKworIzogZXhfY21kcy5jOjEwMDMKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIltOZXVsb75lbukgem3sbnldXG4iCisKKyM6IGV4X2NtZHMuYzoxMjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAidmltaW5mbzogJXMgbmEg+OFka3U6ICIKKworIzogZXhfY21kcy5jOjEyNTMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogcPjtbGm5IG1ub2hvIGNoeWIsIHD4ZXNrYWt1amkgemJ5dGVrIHNvdWJvcnUiCisKKyM6IGV4X2NtZHMuYzoxMjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAiyHR1IHZpbWluZm8gc291Ym9yIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIGluZm9ybWFjZSIKKworIzogZXhfY21kcy5jOjEyODQKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIiB6bmHoa3kiCisKKyM6IGV4X2NtZHMuYzoxMjg1Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIHNlIG5lemRh+GlsbyIKKworIzogZXhfY21kcy5jOjEzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IGRvIHZpbWluZm8gc291Ym9ydSAlcyBuZWx6ZSB6YXBpc292YXQiCisKKyM6IGV4X2NtZHMuYzoxNTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IE5lbHplIHVsb75pdCB2aW1pbmZvIHNvdWJvciAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiVWts4WThbSB2aW1pbmZvIHNvdWJvcnUgXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjEwCittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBUZW50byB2aW1pbmZvIHNvdWJvciBieWwgdnl0dm/4ZW4gZWRpdG9yZW0gVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgUG9rdWQgYnVkZXRlIG9wYXRybv0sIG35vmV0ZSBqZWogdXByYXZvdmF0LlxuIgorIlxuIgorCisjOiBleF9jbWRzLmM6MTYxNAorbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjIEhvZG5vdGEgdm9sYnkgJ2VuY29kaW5nJyB2IGRvYuwgdWxvvmVu7SB0b2hvdG8gc291Ym9ydVxuIgorCisjOiBleF9jbWRzLmM6MTcxMworbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiTmVw+O1wdXN0bv0gcG/o4XRl6G7tIHpuYWsiCisKKyM6IGV4X2NtZHMuYzoyMDUzIGV4X2NtZHMuYzoyMjg5IGV4X2NtZHMyLmM6NjAyCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAiVWxvvml0IGpha28iCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjA5NgorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiBTb3Vib3IgamUgbmFocuFuIHYgamlu6W0gYnVmZmVydSIKKworIzogZXhfY21kcy5jOjIxMzAKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICJVbG++aXQgbmX6cGxu/SBzb3Vib3I/IgorCisjOiBleF9jbWRzLmM6MjEzNworbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBQb3W+aWp0ZSAhIHBybyB1bG++ZW7tIG5l+nBsbulobyBidWZmZXJ1IgorCisjOiBleF9jbWRzLmM6MjIyMworIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIlD4ZXBzYXQgc291Ym9yIFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiCu4WRu/SBu4XpldiBzb3Vib3J1IHBybyBidWZmZXIgJWxkIgorCisjOiBleF9jbWRzLmM6MjMzMgorbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IFNvdWJvciBuZWJ5bCB1bG++ZW46IFVrbOFk4W7tIGplIHpha+F64W5vIHZvbGJvdSAnd3JpdGUnIgorCisjOiBleF9jbWRzLmM6MjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiUHJvIFwiJS4qc1wiIGplIG5hc3RhdmVuYSB2b2xiYSAncmVhZG9ubHknLlxuIgorIlD4ZWpldGUgc2kgamkgcG90bGHoaXQ/IgorCisjOiBleF9jbWRzLmM6MjUxNworbXNnaWQgIkVkaXQgRmlsZSIKK21zZ3N0ciAiRWRpdG92YXQgc291Ym9yIgorCisjOiBleF9jbWRzLmM6MzAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogQXV0b21hdGlja+kgcPjta2F6eSBuZW/oZWvhdmFu7CBzbWF6YWx5IG5vdv0gYnVmZmVyICVzIgorCisjOiBleF9jbWRzLmM6MzE1NgorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiBuZejtc2Vsbv0gYXJndW1lbnQgcHJvIDp6IgorCisjOiBleF9jbWRzLmM6MzI0MQorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IHJ2aW0gbmVwb3ZvbHVqZSBwb3W+aXTtIHD47Wthevkgc2hlbGx1IgorCisjOiBleF9jbWRzLmM6MzM0OAorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3Vs4XJu7SB2/XJhenkgbmVzbe0gYv10IG9kZOxsZW55IHDtc21lbnkiCisKKyM6IGV4X2NtZHMuYzozNjg2CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgIm5haHJhZGl0IHphICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQwNTAKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKFD4ZXJ1uWVubykgIgorCisjOiBleF9jbWRzLmM6NDA1NAorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICIxIG5haHJhemVu7SIKKworIzogZXhfY21kcy5jOjQwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBuYWhyYXplbu0iCisKKyM6IGV4X2NtZHMuYzo0MDU5Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIG5hIGplZG5vbSD44WRrdSIKKworIzogZXhfY21kcy5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiIG5hICVsZCD44WRj7WNoIgorCisjOiBleF9jbWRzLmM6NDExMgorbXNnaWQgIkUxNDc6IENhbm5vdCBkbyA6Z2xvYmFsIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE0NzogOmdsb2JhbCBuZWx6ZSB2b2xhdCByZWt1cnppdm7sIgorCisjOiBleF9jbWRzLmM6NDE0NworbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiBVIHD47WthenUgJ2dsb2JhbCcgY2h5Yu0gcmVndWzhcm7tIHb9cmF6IgorCisjOiBleF9jbWRzLmM6NDE5NgorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICJWem9yIG5hbGV6ZW4gbmEga2G+ZOltIPjhZGt1OiAlcyIKKworIzogZXhfY21kcy5jOjQyNzcKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIFBvc2xlZG7tIG5haHJhenVq7WPtIPhldOx6ZWM6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBMaXR1amksIHBybyAlcyBuZW7tIL7hZG7hIG7hcG927GRhIgorCisjOiBleF9jbWRzLmM6NDQxMAorIywgYy1mb3JtYXQKK21zZ2lkICJTb3JyeSwgaGVscCBmaWxlIFwiJXNcIiBub3QgZm91bmQiCittc2dzdHIgIkxpdHVqaSwgc291Ym9yIFwiJXNcIiBzIG7hcG927GRvdSBuZWJ5bCBuYWxlemVuIgorCisjOiBleF9jbWRzLmM6NDg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiAlcyBuZW7tIGFkcmVz4fhlbSIKKworIzogZXhfY21kcy5jOjQ4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IE5lbHplIG90ZXb47XQgJXMgcHJvIHrhcGlzIgorCisjOiBleF9jbWRzLmM6NDg5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogTmVsemUgb3RldvjtdCAlcyBwcm8geuFwaXMiCisKKyM6IGV4X2NtZHMuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IER1cGxpY2l0bu0gdGFnIFwiJXNcIiB2IHNvdWJvcnUgJXMiCisKKyM6IGV4X2NtZHMuYzo1MDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogTmV6buFt4SB2b2xiYSBw+O1rYXp1OiAlcyIKKworIzogZXhfY21kcy5jOjUwOTgKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1NjogQ2h5Yu0gam3pbm8gdm9sYnkiCisKKyM6IGV4X2NtZHMuYzo1MTQ0Cittc2dpZCAiRTI1NTogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTI1NTogTmFzdGF2ZW5vIHD47WxpuSBtbm9obyB2b2xlYiIKKworIzogZXhfY21kcy5jOjUxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBOZXBsYXRu/SB0ZXh0IHZvbGJ5OiAlcyIKKworIzogZXhfY21kcy5jOjUyMTAgZXhfY21kcy5jOjUzOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogTmV6buFt4SB2b2xiYTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjU2Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogQ2h5Yu0gaWRlbnRpZmlr4XRvciB2b2xieSIKKworIzogZXhfY21kcy5jOjUzMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IGNoeWJu6SBqbelubyBidWZmZXJ1OiAlcyIKKworIzogZXhfY21kcy5jOjUzNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IENoeWJu6SBJRCB2b2xieTogJWxkIgorCisjOiBleF9jbWRzLmM6NTU0NgorbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW1Z5bWF64W5vXSIKKworIzogZXhfY21kczIuYzo3MAorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGxlYXZlLiIKK21zZ3N0ciAiU3Bvdbl07W0gbGFk7WPtIHJlvmltLiBQcm8gdWtvbuhlbu0gbmFwabl0ZSBcImNvbnRcIi4iCisKKyM6IGV4X2NtZHMyLmM6NzQgZXhfZG9jbWQuYzo3NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICL44WRlayAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgInD47WthejogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIkJvZCBw+GVydbllbu0gdiBcIiVzJXNcIiBuYSD44WRrdSAlbGQiCisKKyM6IGV4X2NtZHMyLmM6Mzg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTogQm9kIHD4ZXJ1uWVu7SBuZW5hbGV6ZW46ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIk5lYnlseSBkZWZpbm924W51IL7hZG7pIGJvZHkgcPhlcnW5ZW7tIgorCisjOiBleF9jbWRzMi5jOjQxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAg+OFkZWsgJWxkIgorCisjOiBleF9jbWRzMi5jOjYyNQorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJVbG++aXQgem3sbnkgZG8gXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjYyNyBleF9kb2NtZC5jOjg2MTIKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiTmVwb2ptZW5vduFubyIKKworIzogZXhfY21kczIuYzo3NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IEJ1ZmZlciBcIiVzXCIgb2JzYWh1amUgbmV1bG++ZW7pIHpt7G55IgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiIgorIlZhcm924W7tOiBOZehla2Fu/SB2c3R1cCBkbyBqaW7paG8gYnVmZmVydSAoemtvbnRyb2x1anRlIGF1dG9tYXRpY2vpIHD47WthenkpIgorCisjOiBleF9jbWRzMi5jOjEyMDgKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IFBybyBlZGl0YWNpIGJ5bCB6YWThbiBwb3V6ZSBqZWRlbiBzb3Vib3IiCisKKyM6IGV4X2NtZHMyLmM6MTIxMAorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDogUPhlZCBwcnZu7SBzb3Vib3IgbmVsemUgcPhlc2tv6Gl0IgorCisjOiBleF9jbWRzMi5jOjEyMTIKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogWmEgcG9zbGVkbu0gc291Ym9yIG5lbHplIHD4ZXNrb+hpdCIKKworIzogZXhfY21kczIuYzoxNjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiSGxlZOFtIFwiJXNcIiB2IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICJIbGVk4W0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE2NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAic291Ym9yIFwiJXNcIiBuZWJ5bCBuYWxlemVuIHYgJ3J1bnRpbWVwYXRoJyIKKworIzogZXhfY21kczIuYzoxNzEyCittc2dpZCAiUnVuIE1hY3JvIgorbXNnc3RyICJTcHVzdGl0IG1ha3JvIgorCisjOiBleF9jbWRzMi5jOjE4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJuZWx6ZSBpbnRlcnByZXRvdmF0IGFkcmVz4fg6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJuZWx6ZSBpbnRlcnByZXRvdmF0IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAi+OFkZWsgJWxkOiBuZWx6ZSBpbnRlcnByZXRvdmF0IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODYzCisjLCBjLWZvcm1hdAorbXNnaWQgInNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAiaW50ZXJwcmV0dWppIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODY1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIvjhZGVrICVsZDogaW50ZXJwcmV0dWppICVzIgorCisjOiBleF9jbWRzMi5jOjE5NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgImRva29u6GVuYSBpbnRlcnByZXRhY2UgJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI3MgorbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6IFZhcm924W7tOiBjaHlibv0gb2Rk7GxvdmHoIPjhZGv5LiBNb75u4SBjaHli7SBeTS4iCisKKyM6IGV4X2NtZHMyLmM6MjMyMQorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyBwb3W+aXRvIG1pbW8gaW50ZXJwcmV0b3Zhbv0gc291Ym9yIgorCisjOiBleF9jbWRzMi5jOjIzNTQKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogOmZpbmlzaCBwb3W+aXRvIG1pbW8gaW50ZXJwcmV0b3Zhbv0gc291Ym9yIgorCisjOiBleF9jbWRzMi5jOjI4MjAKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIq7hZG79IHRleHQgayB2eXRpuXTsbu0iCisKKyM6IGV4X2NtZHMyLmM6Mjg5OAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJUaXNrbnUgc3RyYW51ICVkICglZCUlKSIKKworIzogZXhfY21kczIuYzoyOTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIgS29waWUgJWQgeiAlZCIKKworIzogZXhfY21kczIuYzoyOTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICJWeXRpuXTsbm86ICVzIgorCisjOiBleF9jbWRzMi5jOjI5NjYKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICJUaXNrIHpydbllbiIKKworIzogZXhfY21kczIuYzozMzQ0Cittc2dpZCAiRTQ1NTogRXJyb3Igd3JpdGluZyB0byBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFNDU1OiBOZWx6ZSB6YXBpc292YXQgZG8gdv1zdHVwbu1obyBQb3N0U2NyaXB0b3bpaG8gc291Ym9ydSIKKworIzogZXhfY21kczIuYzo0MDE5Cittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiBOZWx6ZSBvdGV2+O10IHb9c3R1cG7tIFBvc3RTY3JpcHRvdv0gc291Ym9yIgorCisjOiBleF9jbWRzMi5jOjQwNTcKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBOZWx6ZSBvdGV2+O10IHNvdWJvciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDA2OAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTmVsemUg6O1zdCB6ZHJvam92/SBQb3N0U2NyaXB0b3b9IHNvdWJvciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDI2NgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAiT2Rlc+1s4W0gbmEgdGlza+FybnUuLi4iCisKKyM6IGV4X2NtZHMyLmM6NDI3MAorbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IFNlbGhhbCB0aXNrIFBvc3RTY3JpcHRvdulobyBzb3Vib3J1IgorCisjOiBleF9jbWRzMi5jOjQyNzIKK21zZ2lkICJQcmludCBqb2Igc2VudC4iCittc2dzdHIgIlRpc2tvduEg+mxvaGEgb2Rlc2zhbmEuIgorCisjOiBleF9jbWRzMi5jOjQ2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIkFrdHXhbG7tICVzamF6eWs6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0NjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBOZWx6ZSBuYXN0YXZpdCBqYXp5ayBuYSBcIiVzXCIiCisKKyM6IGV4X2RvY21kLmM6NDkxCittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIlNwb3W5dO1tIEV4IG3zZC4gTmFwabl0ZSBcInZpc3VhbFwiIHBybyBu4XZyYXQgZG8gbm9ybeFsbu1obyBt82R1LiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTI3Cittc2dpZCAiQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIktvbmVjIHNvdWJvcnUiCisKKyM6IGV4X2RvY21kLmM6NjAyCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBQ+O1rYXogamUgcPjtbGm5IHJla3Vyeml2bu0iCisKKyM6IGV4X2RvY21kLmM6OTExCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IENoeWLtIDplbmR3aGlsZSIKKworIzogZXhfZG9jbWQuYzo5MTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogQ2h5Yu0gOmVuZGlmIgorCisjOiBleF9kb2NtZC5jOjkyMworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIktvbmVjIGludGVycHJldG92YW7paG8gc291Ym9ydSIKKworIzogZXhfZG9jbWQuYzo5MjQKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIktvbmVjIGZ1bmtjZSIKKworIzogZXhfZG9jbWQuYzoxMzQ0Cittc2dpZCAiQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiTmVqZWRub3puYehu6SBwb3W+aXTtIHW+aXZhdGVsc2t5IGRlZmlub3ZhbulobyBw+O1rYXp1IgorCisjOiBleF9kb2NtZC5jOjEzNTgKK21zZ2lkICJOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIk5lbu0gcPjta2F6ZW0gZWRpdG9ydSIKKworIzogZXhfZG9jbWQuYzoxNDQxCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICJOZXBhbmlrYfh0ZSEiCisKKyM6IGV4X2RvY21kLmM6MTQ2MAorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiWmFk4W4genDsdG79IHJvenNhaCIKKworIzogZXhfZG9jbWQuYzoxNDY5Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJaYWThbiB6cOx0bv0gcm96c2FoLiBQcm9ob2RpdCBocmFuaWNlIgorCisjOiBleF9kb2NtZC5jOjE1ODAKK21zZ2lkICJVc2UgdyBvciB3Pj4iCittc2dzdHIgIlBvdb5panRlIHcg6Gkgdz4+IgorCisjOiBleF9kb2NtZC5jOjMwODYKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IFD47WtheiBuZW7tIHTpdG8gdmVyemkgYm9odb5lbCBpbXBsZW1lbnRvduFuIgorCisjOiBleF9kb2NtZC5jOjMyNTYKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogUPjtcHVzdG79IGplIHBvdXplIGplZGVuIG7hemV2IHNvdWJvcnUiCisKKyM6IGV4X2RvY21kLmM6MzgxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIkpluXTsIHpi/XZhau0gc291Ym9yeSBrIGVkaXRhY2kgKCVkKS4gQ2hjZXRlIHD4ZXN0byB1a29u6Gl0IGVkaXRvcj8iCisKKyM6IGV4X2RvY21kLmM6MzgxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiBKZbl07CB6Yv12YWrtIHNvdWJvcnkgayBlZGl0YWNpICglbGQpLiIKKworIzogZXhfZG9jbWQuYzozOTExCittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogdXNlICEgdG8gcmVkZWZpbmUiCittc2dzdHIgIkUxNzQ6IFD47WtheiBqab4gZXhpc3R1amU6IHBvdb5panRlICEgcHJvIHD4ZWRlZmlub3bhbu0iCisKKyM6IGV4X2RvY21kLmM6NDAxNgorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICBKbelubyAgICAgICBBcmdzIFJvenNhaCDacGxub3N0ICBEZWZpbmljZSIKKworIzogZXhfZG9jbWQuYzo0MTA1Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICJOZWJ5bHkgbmFsZXplbnkgvuFkbukgdb5pdmF0ZWxza3kgZGVmaW5vdmFu6SBw+O1rYXp5IgorCisjOiBleF9kb2NtZC5jOjQxMzYKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBOZWJ5bHkgemFk4W55IL7hZG7pIGF0cmlidXR5IgorCisjOiBleF9kb2NtZC5jOjQxODgKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IENoeWJu/SBwb+hldCBhcmd1bWVudPkiCisKKyM6IGV4X2RvY21kLmM6NDIwMworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IE9wYWtvduFu7SBuZW35vmUgYv10IHphZOFubyBkdmFrcuF0IgorCisjOiBleF9kb2NtZC5jOjQyMTMKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBDaHlibuEgaW1wbGljaXRu7SBob2Rub3RhIHBybyBwb+hldCIKKworIzogZXhfZG9jbWQuYzo0MjQxCittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiBjaHlibuEgaW1wbGljaXRu7SBob2Rub3RhIHBybyBvcGFrb3bhbu0iCisKKyM6IGV4X2RvY21kLmM6NDI2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDogQ2h5Ym7hIGhvZG5vdGEgZG9wbG7sbu06ICVzIgorCisjOiBleF9kb2NtZC5jOjQyNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiBDaHlibv0gYXRyaWJ1dDogJXMiCisKKyM6IGV4X2RvY21kLmM6NDMwOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBDaHlibukgam3pbm8gcPjta2F6dSIKKworIzogZXhfZG9jbWQuYzo0MzI0Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBVvml2YXRlbHNreSBkZWZpbm92YW7pIHD47WthenkgbXVz7SB6YejtbmF0IHZlbGlr/W0gcO1zbWVuZW0uIgorCisjOiBleF9kb2NtZC5jOjQzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IFW+aXZhdGVsc2t5IGRlZmlub3Zhbv0gcPjta2F6ICVzIG5lZXhpc3R1amUiCisKKyM6IGV4X2RvY21kLmM6NDg0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCittc2dzdHIgIkUxODU6IE5lbHplIG5hbOl6dCBiYXJldm7pIHNjaOltYSAlcyIKKworIzogZXhfZG9jbWQuYzo0ODUyCittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIkJsYWhvcPhlamksIHW+aXZhdGVsaSBWaW11ISIKKworIzogZXhfZG9jbWQuYzo1NTQ5Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIkVkaXRvdmF0IHNvdWJvciB2IG5vdultIG9rbuwiCisKKyM6IGV4X2RvY21kLmM6NTgxNQorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiruFkbv0gb2RrbOFkYWPtIHNvdWJvciIKKworIzogZXhfZG9jbWQuYzo1OTE5Cittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIlVsb75pdCBzb3Vib3IiCisKKyM6IGV4X2RvY21kLmM6NTk3OAorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4NjogruFkbv0gcPhlZGNob3rtIGFkcmVz4fgiCisKKyM6IGV4X2RvY21kLmM6NjA1NQorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IE5lem7hbf0iCisKKyM6IGV4X2RvY21kLmM6NjE3MworIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIlVt7XN07G7tIG9rbmE6IFggJWQsIFkgJWQiCisKKyM6IGV4X2RvY21kLmM6NjE3OAorbXNnaWQgIkUxODg6IE9idGFpbmluZyB3aW5kb3cgcG9zaXRpb24gbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtIgorbXNnc3RyICJFMTg4OiBOYSB06XRvIHBsYXRmb3Jt7CBuZWx6ZSB1be1zdOxu7SBva25hIHpqaXN0aXQiCisKKyM6IGV4X2RvY21kLmM6NjQ0NAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIlVsb75pdCBw+GVzbexyb3bhbu0iCisKKyM6IGV4X2RvY21kLmM6NjU5MworbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiVWxvvml0IHBvaGxlZCIKKworIzogZXhfZG9jbWQuYzo2NTk0Cittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICJVbG++aXQgc2V6ZW7tIgorCisjOiBleF9kb2NtZC5jOjY1OTYKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJVbG++aXQgbmFzdGF2ZW7tIgorCisjOiBleF9kb2NtZC5jOjY3NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgZXhpc3R1amUgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZXhfZG9jbWQuYzo2NzUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTmVsemUgb3RldvjtdCBcIiVzXCIgcHJvIHrhcGlzIgorCisjLiBzZXQgbWFyaworIzogZXhfZG9jbWQuYzo2Nzc0Cittc2dpZCAiRTE5MTogQXJndW1lbnQgbXVzdCBiZSBhIGxldHRlciBvciBmb3J3YXJkL2JhY2t3YXJkIHF1b3RlIgorbXNnc3RyICJFMTkxOiBBcmd1bWVudGVtIG35vmUgYv10IHBvdXplIHDtc21lbm8gbmVibyBwcmF2/SDoaSBsZXb9IGFwb3N0cm9mIgorCisjOiBleF9kb2NtZC5jOjY4MDMKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IFZub/hlbu0gOm5vcm1hbCBqZSBw+O1sabkgaGx1Ym9r6SIKKworIzogZXhfZG9jbWQuYzo3MTcxCittc2dpZCAiOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgInZub/hlbu0gOmlmIGplIHD47WxpuSBobHVib2vpIgorCisjOiBleF9kb2NtZC5jOjcyMDYKK21zZ2lkICI6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIjplbmRpZiBiZXogb2Rwb3btZGFq7WPtaG8gOmlmIgorCisjOiBleF9kb2NtZC5jOjcyMjYKK21zZ2lkICI6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2UgYmV6IG9kcG927WRhau1j7WhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjI4Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2VpZiBiZXogb2Rwb3btZGFq7WPtaG8gOmlmIgorCisjOiBleF9kb2NtZC5jOjcyODAKK21zZ2lkICI6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAidm5v+GVu7SA6d2hpbGUgamUgcPjtbGm5IGhsdWJva+kiCisKKyM6IGV4X2RvY21kLmM6NzMyNgorbXNnaWQgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmNvbnRpbnVlIGJleiBvZHBvdu1kYWrtY+1obyA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM1MworbXNnaWQgIjpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmJyZWFrIGJleiBvZHBvdu1kYWrtY+1obyA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM3NiBleF9kb2NtZC5jOjczODEKK21zZ2lkICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjplbmR3aGlsZSBiZXogb2Rwb3btZGFq7WPtaG8gOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjc0MDIKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiA6ZW5kZnVuY3Rpb24gbWltbyBmdW5rY2kiCisKKyM6IGV4X2RvY21kLmM6NzU4MgorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICIiCisiRTE5NDogruFkbv0gYWx0ZXJuYXRpdm7tIG7hemV2IHNvdWJvcnUsIGt0ZXL9bSBieSBieWxvIG1vvm7pIG5haHJhZGl0ICcjJyIKKworIzogZXhfZG9jbWQuYzo3NjEzCittc2dpZCAibm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICKu4WRu/SBu4XpldiBzb3Vib3J1LCBrdGVy/W0gYnkgYnlsbyBtb75u6SBuYWhyYWRpdCBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjIxCittc2dpZCAibm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICKu4WRu6SDo7XNsbyBidWZmZXJ1LCBrdGVy/W0gYnkgYnlsbyBtb75u6SBuYWhyYWRpdCBcIjxhYnVmPlwiIgorCisjOiBleF9kb2NtZC5jOjc2MzIKK21zZ2lkICJubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiIgorIq7hZG7hIHNob2RhIGF1dG9tYXRpY2v9Y2ggcPjta2F6+Swga3Rlcm91IGJ5IGJ5bG8gbW++bukgbmFocmFkaXQgXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjc2NDIKK21zZ2lkICJubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiruFkbv0gaW50ZXJwcmV0b3Zhbv0gc291Ym9yLCBrdGVy/W0gYnkgYnlsbyBtb75u6SBuYWhyYWRpdCBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjgzCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJQcuF6ZG79IG7hemV2IHNvdWJvcnUgcHJvICclJyDoaSAnIycgZnVuZ3VqZSBwb3V6ZSBzIFwiOnA6aFwiIgorCisjOiBleF9kb2NtZC5jOjc2ODUKK21zZ2lkICJFdmFsdWF0ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJW/XNsZWRrZW0gdnlob2Rub2Nlbu0gamUgcHLhemRu/SD4ZXTsemVjIgorCisjOiBleF9kb2NtZC5jOjg1OTQKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IE5lbHplIG90ZXb47XQgcHJvIOh0ZW7tIHZpbWluZm8gc291Ym9yIgorCisjOiBleF9kb2NtZC5jOjg3NjcKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IFYgdOl0byB2ZXJ6aSBuZWpzb3Ugc3D4Zb5reSBwb2Rwb3JvduFueSIKKworIzogZXhfZ2V0bG4uYzoyNzg1Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAiam3pbm8gdGFndSIKKworIzogZXhfZ2V0bG4uYzoyNzg4Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgdHlwIHNvdWJvclxuIgorCisjOiBleF9nZXRsbi5jOjM5OTcKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIid2b2xiYSAnaGlzdG9yeScgamUgbmFzdGF2ZW5hIG5hIG51bHUiCisKKyM6IGV4X2dldGxuLmM6NDIzNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSGlzdG9yaWUgJXMgKHBv6O1uYWplIG5lam5vduxque0gcG9sb75rb3UpOlxuIgorCisjOiBleF9nZXRsbi5jOjQyMzgKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgInD47Wthem926SD44WRreSIKKworIzogZXhfZ2V0bG4uYzo0MjM5Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAidnlobGVk4XZhbv1jaCD4ZXTsemP5IgorCisjOiBleF9nZXRsbi5jOjQyNDAKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJ2/XJhevkiCisKKyM6IGV4X2dldGxuLmM6NDI0MQorbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgInZzdHVwbu0g+OFka3kiCisKKyM6IGV4X2dldGxuLmM6NDI3MQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgcPhla3Jh6HVqZSBk6WxrdSBw+O1rYXp1IgorCisjOiBleF9nZXRsbi5jOjQ0MzUKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBTbWF64W5vIGFrdGl2bu0gb2tubyDoaSBidWZmZXIiCisKKyM6IGZpbGVpby5jOjM0NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICJuZXD47XB1c3Ru/SBu4XpldiBzb3Vib3J1IgorCisjOiBmaWxlaW8uYzozNzEgZmlsZWlvLmM6NDk1IGZpbGVpby5jOjI0OTEgZmlsZWlvLmM6MjUyOQorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJqZSBhZHJlc+H4ZW0iCisKKyM6IGZpbGVpby5jOjM3MworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIm5lbu0gc291Ym9yZW0iCisKKyM6IGZpbGVpby5jOjUxNSBmaWxlaW8uYzozNTgxCittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW25vdv0gc291Ym9yXSIKKworIzogZmlsZWlvLmM6NTMyCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW3D47XN0dXAgb2Rt7XRudXRdIgorCisjOiBmaWxlaW8uYzo2MjQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiAqUmVhZFByZSBhdXRvbWF0aWNr6SBw+O1rYXp5IHXoaW5pbHkgc291Ym9yIG5l6Gl0ZWxu/W0iCisKKyM6IGZpbGVpby5jOjYyNgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6ICpSZWFkUHJlIGF1dG9tYXRpY2vpIHD47WthenkgbmVzbe0gbexuaXQgYWt0deFsbu0gYnVmZmVyIgorCisjOiBmaWxlaW8uYzo2NDYKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IMh0dSB6ZSBzdGFuZGFyZG7taG8gdnN0dXB1Li4uXG4iCisKKyM6IGZpbGVpby5jOjY1MgorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAiyHR1IHplIHN0YW5kYXJkbu1obyB2c3R1cHUuLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6ODc2Cittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IFBvIGtvbnZlcnppIGplIHNvdWJvciBuZehpdGVsbv0hIgorCisjOiBmaWxlaW8uYzoxNzMyCittc2dpZCAiW2ZpZm8vc29ja2V0XSIKK21zZ3N0ciAiW3Bvam1lbm92YW7hIHJvdXJhL3Nva2V0XSIKKworIzogZmlsZWlvLmM6MTczOQorbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW3Bvam1lbm92YW7hIHJvdXJhXSIKKworIzogZmlsZWlvLmM6MTc0NgorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJbc29rZXRdIgorCisjOiBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW1JPXSIKK21zZ3N0ciAiW1JPXSIKKworIzogZmlsZWlvLmM6MTc2NAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW2NoeWLtIENSXSIKKworIzogZmlsZWlvLmM6MTc2OQorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIltuYWxlemVubyBOTF0iCisKKyM6IGZpbGVpby5jOjE3NzQKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIltkbG91aOkg+OFka3kgemFsb21lbnldIgorCisjOiBmaWxlaW8uYzoxNzgwIGZpbGVpby5jOjM1NjUKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltuZXprb252ZXJ0b3bhbl0iCisKKyM6IGZpbGVpby5jOjE3ODUgZmlsZWlvLmM6MzU3MAorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJbemtvbnZlcnRvduFuXSIKKworIzogZmlsZWlvLmM6MTc5MiBmaWxlaW8uYzozNTk1Cittc2dpZCAiW2NyeXB0ZWRdIgorbXNnc3RyICJbemG5aWZyb3bhbl0iCisKKyM6IGZpbGVpby5jOjE3OTkKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltDSFlCQSBQ2EVWT0RVXSIKKworIzogZmlsZWlvLmM6MTgwNgorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltDSFlCWSDIVEVOzV0iCisKKyM6IGZpbGVpby5jOjIwMTMKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAiTmVsemUgbmFs6Xp0IGRv6GFzbv0gc291Ym9yIHBybyBrb252ZXJ6aSIKKworIzogZmlsZWlvLmM6MjAyMAorbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiS29udmVyemUgcyAnY2hhcmNvbnZlcnQnIHNlIG5lemRh+GlsYSIKKworIzogZmlsZWlvLmM6MjAyMworbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIm5lbHplIOjtc3Qgdv1zdHVwICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI0MDcKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiIgorIkUyMDM6IEF1dG9tYXRpY2vpIHD47Wthenkgc21hemFseSDoaSBkZWFrdGl2b3ZhbHkgYnVmZmVyLCBrdGVy/SBt7GwgYv10ICIKKyJ1bG++ZW4iCisKKyM6IGZpbGVpby5jOjI0MzAKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b21hdGlja/0gcPjta2F6IG5l6GVrYW79bSB6cPlzb2JlbSB6bexuaWwgcG/oZXQg+OFka/kiCisKKyM6IGZpbGVpby5jOjI0OTYgZmlsZWlvLmM6MjUxMworbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICJuZW7tIHNvdWJvcmVtIGFuaSB6YfjtemVu7W0gbmEgbuy+IGx6ZSB6YXBpc292YXQiCisKKyM6IGZpbGVpby5jOjI1NTUKK21zZ2lkICJpcyByZWFkLW9ubHkgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiamUgcG91emUgcHJvIOh0ZW7tIChwb3W+aWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjI4NTEKK21zZ2lkICJDYW4ndCB3cml0ZSB0byBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWx6ZSB6YXBpc292YXQgZG8geuFsb75u7WhvIHNvdWJvcnUgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZmlsZWlvLmM6Mjg2MworbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJDaHliYSBw+GkgdXphdu1y4W7tIHrhbG++bu1obyBzb3Vib3J1IChwb3W+aWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGZpbGVpby5jOjI4NjUKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWx6ZSBuYejtc3Qgc291Ym9yIHBybyB64WxvaHUgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZmlsZWlvLmM6Mjg4MQorbXNnaWQgIkNhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVsemUgdnl0dm/4aXQgeuFsb75u7SBzb3Vib3IgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZmlsZWlvLmM6Mjk3MAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVsemUgdnl0dm/4aXQgeuFsb75u7SBzb3Vib3IgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIyByZXNvdXJjZSBmb3JrID8hCisjOiBmaWxlaW8uYzozMDMyCittc2dpZCAiVGhlIHJlc291cmNlIGZvcmsgd2lsbCBiZSBsb3N0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIidSZXNvdXJjZSBmb3JrJyBidWRlIHp0cmFjZW4gKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZmlsZWlvLmM6MzEyMQorbXNnaWQgIkUyMTQ6IENhbid0IGZpbmQgdGVtcCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjE0OiBOZWx6ZSBuYWrtdCBkb+hhc279IHRlbXAgc291Ym9yIHBybyB64XBpcyIKKworIzogZmlsZWlvLmM6MzEzOQorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0ICh1c2UgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiBOZWx6ZSBw+GV26XN0IChwb3W+aWp0ZSAhIHBybyB64XBpcyBiZXogcPhldm9kdSkiCisKKyM6IGZpbGVpby5jOjMxNzYKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiBOZWx6ZSBvdGV2+O10IHD4aXBvamVu/SBzb3Vib3IgcHJvIHrhcGlzIgorCisjOiBmaWxlaW8uYzozMTgwCittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiBOZWx6ZSBvdGV2+O10IHNvdWJvciBwcm8geuFwaXMiCisKKyM6IGZpbGVpby5jOjM0MjMKK21zZ2lkICJDbG9zZSBmYWlsZWQiCittc2dzdHIgIlZvbOFu7SBjbG9zZSBzZWxoYWxvIgorCisjOiBmaWxlaW8uYzozNDgxCittc2dpZCAid3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICJjaHliYSBw+GkgeuFwaXN1LCBrb252ZXJ6ZSBzZSBuZXpkYfhpbGEiCisKKyM6IGZpbGVpby5jOjM0ODcKK21zZ2lkICJ3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJjaHliYSBw+GkgdWts4WThbu0gKGplIHZvbG7pIG3tc3RvIG5hIGRpc2t1PykiCisKKyM6IGZpbGVpby5jOjM1NjAKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIENIWUJBIFDYRVZPRFUiCisKKyM6IGZpbGVpby5jOjM1NzYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW3ph+O16ZW7tXSIKKworIzogZmlsZWlvLmM6MzU4MQorbXNnaWQgIltOZXddIgorbXNnc3RyICJbTm92/V0iCisKKyM6IGZpbGVpby5jOjM2MDMKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW3BdIgorCisjOiBmaWxlaW8uYzozNjAzCittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgcPhpcG9qZW4iCisKKyM6IGZpbGVpby5jOjM2MDUKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3VdIgorCisjOiBmaWxlaW8uYzozNjA1Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiB1bG++ZW4iCisKKyM6IGZpbGVpby5jOjM2NTUKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTogcGF0Y2htb2RlOiBuZWx6ZSB1bG++aXQgcPl2b2Ru7SBzb3Vib3IiCisKKyM6IGZpbGVpby5jOjM2NzcKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogbmVsemUgemFwaXNvdmF0IGRvIHBy4XpkbulobyBw+XZvZG7taG8gc291Ym9ydSIKKworIzogZmlsZWlvLmM6MzY5MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogTmVsemUgc21hemF0IHrhbG++bu0gc291Ym9yIgorCisjOiBmaWxlaW8uYzozNzQ0Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisiVkFST1bBTs06IE9ic2FoIHD5dm9kbu1obyBzb3Vib3J1IG35vmUgYv10IHp0cmFjZW4g6GkgcG+5a296ZW5cbiIKKworIzogZmlsZWlvLmM6Mzc0NgorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIm5ldWtvbuh1anRlIGVkaXRvciBk+O12ZSwgbmW+IGJ1ZGUgc291Ym9yIPpzcOy5buwgdWxvvmVuISIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2RvcyBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozODMzCittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzozODMzCittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbbWFjIGZvcm3hdF0iCisKKyM6IGZpbGVpby5jOjM4NDAKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6Mzg0MAorbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIlt1bml4IGZvcm3hdF0iCisKKyM6IGZpbGVpby5jOjM4NjcKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSD44WRlaywgIgorCisjOiBmaWxlaW8uYzozODY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQg+OFka/ksICIKKworIzogZmlsZWlvLmM6Mzg3MgorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIHpuYWsiCisKKyM6IGZpbGVpby5jOjM4NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCB6bmFr+SwgIgorCisjOiBmaWxlaW8uYzozODg0Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW77hZG79IGVvbF0iCisKKyM6IGZpbGVpby5jOjM4ODQKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJbbmX6cGxu/SBwb3NsZWRu7SD44WRla10iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6MzkwMworbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiVkFST1bBTs06IG9kIGplaG8gbmHodGVu7SBieWwgb2JzYWggc291Ym9ydSB6bexu7G4hISEhIgorCisjOiBmaWxlaW8uYzozOTA1Cittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJDaGNldGUgamVqIG9wcmF2ZHUgdWxvvml0IgorCisjOiBmaWxlaW8uYzo0ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBDaHliYSBw+GkgeuFwaXN1IGRvIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NDg2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogQ2h5YiBw+GkgdXphdu1y4W7tIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NDg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDogQ2h5YmEgcPhpIOh0ZW7tIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTAzNQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgenJ1uWlsIGJ1ZmZlciIKKworIzogZmlsZWlvLmM6NTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiB3YTE6IHNvdWJvciBcIiVzXCIgamm+IG5lbu0gZG9zdHVwbv0iCisKKyM6IGZpbGVpby5jOjUwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBWYXJvduFu7Togc291Ym9yIFwiJXNcIiBieWwgcG8gcG/o4XRrdSBlZGl0YWNlIHpt7G7sbiBhIGJ1ZmZlciB2ZSBWaW0gIgorInRha+kiCisKKyM6IGZpbGVpby5jOjUwNTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMTogd2MyOiBzb3Vib3IgXCIlc1wiIGJ5bCBwbyBwb+jhdGt1IGVkaXRhY2Ugem3sbuxuIgorCisjOiBmaWxlaW8uYzo1MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogVmFyb3bhbu06IE3zZCBzb3Vib3J1IFwiJXNcIiBieWwgem3sbuxuIG9kIHphcG/obnV07SBlZGl0YWNlIgorCisjOiBmaWxlaW8uYzo1MDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogd2M0OiBwbyBwb+jhdGt1IGVkaXRhY2Ugdnl0dm/4ZW4gc291Ym9yIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTA4OAorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIlZhcm924W7tIgorCisjOiBmaWxlaW8uYzo1MDg5Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImTmFocuF0IHNvdWJvciIKKworIzogZmlsZWlvLmM6NTE2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogTmVsemUgem5vdnVvdGV2+O10IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTY3MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLVZ5bWF64W5vLS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo1ODMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogU2t1cGluYSBcIiVzXCIgbmVleGlzdHVqZSIKKworIzogZmlsZWlvLmM6NTk1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogTmVw+O1wdXN0bv0gem5hayBwbyAqOiAlcyIKKworIzogZmlsZWlvLmM6NTk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogVWThbG9zdCAlcyBuZWV4aXN0dWplIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYxMTUKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9tYXRpY2vpIHD47WthenkgLS0tIgorCisjOiBmaWxlaW8uYzo2Mzg2Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IEF1dG9tYXRpY2vpIHD47WthenkgbmVsemUgc3B1c3RpdCBwcm8gVqlFQ0hOWSB1ZOFsb3N0aSIKKworIzogZmlsZWlvLmM6NjQwOQorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAiruFkbukgdnlob3Z1au1j7SBhdXRvbWF0aWNr6SBw+O1rYXp5IgorCisjOiBmaWxlaW8uYzo2NjgxCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogdm5v+GVu7SBhdXRvbWF0aWNr6WhvIHD47WthenUgcPjtbGm5IGhsdWJva+EiCisKKyM6IGZpbGVpby5jOjY5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBhdXRvbWF0aWNr6SBw+O1rYXp5IHBybyBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY5NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJzcG91uXTtbSAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJBdXRvbWF0aWNr/SBw+O1rYXogJXMiCisKKyM6IGZpbGVpby5jOjc1NjYKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBDaHli7SB7LiIKKworIzogZmlsZWlvLmM6NzU2OAorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IENoeWLtIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICKu4WRu/SB64Wh5YiBuZWJ5bCBuYWxlemVuIgorCisjOiBmb2xkLmM6NTU0Cittc2dpZCAiRTM1MDogQ2Fubm90IGNyZWF0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTA6IHBvbW9j7SBha3R14Wxu7SAnZm9sZG1ldGhvZCcgbmVsemUgdnl0dm/4aXQgeuFoeWIiCisKKyM6IGZvbGQuYzo1NTYKK21zZ2lkICJFMzUxOiBDYW5ub3QgZGVsZXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MTogcG9tb2PtIGFrdHXhbG7tICdmb2xkbWV0aG9kJyBuZWx6ZSB2eXR2b/hpdCB64Wh5YiIKKworIzogZm9sZC5jOjE3MDAKK21zZ2lkICJFMjIxOiAnY29tbWVudHN0cmluZycgaXMgZW1wdHkiCittc2dzdHIgIkUyMjE6IHZvbGJhICdjb21tZW50c3RyaW5nJyBqZSBwcuF6ZG7hIgorCisjOiBnZXRjaGFyLmM6MjY4Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBQ+GlkYXQgZG8gYnVmZmVydSBwcm8g6HRlbu0iCisKKyM6IGdldGNoYXIuYzoyMTE0Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6IHJla3Vyeml2bu0gbWFwb3bhbu0iCisKKyM6IGdldGNoYXIuYzoyOTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiBwcm8gJXMgamm+IGdsb2LhbG7tIHprcmF0a2Egamm+IGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6Mjk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6IHBybyAlcyBqab4gZ2xvYuFsbu0gbWFwb3bhbu0gamm+IGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6MzA5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiBwcm8gJXMgamm+IHprcmF0a2Egamm+IGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6MzA5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI3OiBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNzogcHJvICVzIGppviBtYXBvduFu7SBqab4gZXhpc3R1amUiCisKKyM6IGdldGNoYXIuYzozMTYzCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICKu4WRu4SB6a3JhdGthIG5lYnlsIG5hbGV6ZW5hIgorCisjOiBnZXRjaGFyLmM6MzE2NQorbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIq7hZG7pIG1hcG924W7tIG5lYnlsbyBuYWxlemVubyIKKworIzogZ2V0Y2hhci5jOjM5OTAKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IG5lcPjtcHVzdG79IG3zZCIKKworIzogZ3VpLmM6MTgxCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IE5lbHplIHNwdXN0aXQgR1VJIgorCisjOiBndWkuYzozMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6IE5lbHplIOjtc3QgeiBcIiVzXCIiCisKKyM6IGd1aS5jOjQzMQorbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogdm9sYmEgJ2d1aWZvbnR3aWRlJyBqZSBjaHlibuwgbmFzdGF2ZW5hIgorCisjOiBndWkuYzozOTI2Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIkNoeWJhIgorCisjOiBndWkuYzozOTI3Cittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGd1aV9hdF9mcy5jOjI5MAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8bmVsemUgb3RldvjtdD4gIgorCisjOiBndWlfYXRfZnMuYzoxMTE1CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAidmltX1NlbEZpbGU6IHDtc21vICVzIG5lbu0gZG9zdHVwbukiCisKKyM6IGd1aV9hdF9mcy5jOjI1MzgKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTogbmVsemUgc2UgdnLhdGl0IGRvIGFrdHXhbG7taG8gYWRyZXPh+GUiCisKKyM6IGd1aV9hdF9mcy5jOjI1NTcKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIk7hemV2IGNlc3R5OiIKKworIzogZ3VpX2F0X2ZzLmM6MjU2MworbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiBuZWx6ZSB6amlzdGl0IGFrdHXhbG7tIGFkcmVz4fgiCisKKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX21vdGlmLmM6MTYwNworbXNnaWQgIk9LIgorbXNnc3RyICJPSyIKKworIy4gJ0NhbmNlbCcgYnV0dG9uCisjOiBndWlfYXRfZnMuYzoyNTcxIGd1aV9ndGsuYzoxNjgzIGd1aV9tb3RpZi5jOjE2MDIgZ3VpX21vdGlmLmM6MjgyMworbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiWnJ1uWl0IgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlD47XByYXZlayBwb3N1bm92YWPtIGxpuXR5OiBuZWx6ZSB6amlzdGl0IGdlb21ldHJpaSBvYnLhemt1IgorCisjOiBndWlfYXRoZW5hLmM6MTkyOCBndWlfbW90aWYuYzoxODU1Cittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltIGRpYWxvZyIKKworIzogZ3VpX2JldmFsLmM6NjgKK21zZ2lkICJFMjMyOiBDYW5ub3QgY3JlYXRlIEJhbGxvb25FdmFsIHdpdGggYm90aCBtZXNzYWdlIGFuZCBjYWxsYmFjayIKK21zZ3N0ciAiRTIzMjogQmFsbG9vbkV2YWwgbmVsemUgdnl0dm/4aXQgc2UgenBy4XZvdSBhIHrhcm92ZfIgenDsdG79bSB2b2zhbu1tIgorCisjOiBndWlfZ3RrLmM6MTE0NAorbXNnaWQgIlZpbSBkaWFsb2cuLi4iCittc2dzdHIgIlZpbSBkaWFsb2cuLiIKKworIzogZ3VpX2d0ay5jOjE1MTkgZ3VpX21vdGlmLmM6Mjc0MgorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gTmFs6Xp0IGEgbmFocmFkaXQuLi4iCisKKyM6IGd1aV9ndGsuYzoxNTI0IGd1aV9tb3RpZi5jOjI3NDQKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIE5hbOl6dC4uLiIKKworIzogZ3VpX2d0ay5jOjE1NDcgZ3VpX21vdGlmLmM6Mjg2MgorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIlZ5aGxlZGF0OiIKKworIzogZ3VpX2d0ay5jOjE1NjUgZ3VpX21vdGlmLmM6Mjg5NAorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIk5vdv0gdGV4dDoiCisKKyMuIGV4YWN0IG1hdGNoIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTU5NyBndWlfbW90aWYuYzoyOTk2Cittc2dpZCAiTWF0Y2ggZXhhY3Qgd29yZCBvbmx5IgorbXNnc3RyICJobGVkYXQgcG91emUgY2Vs4SBzbG92YSIKKworIzogZ3VpX2d0ay5jOjE2MDkgZ3VpX21vdGlmLmM6Mjk2NAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAiU23sciIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoxNjIxIGd1aV9tb3RpZi5jOjI5NzYKK21zZ2lkICJVcCIKK21zZ3N0ciAiTmFob3J1IgorCisjOiBndWlfZ3RrLmM6MTYyNSBndWlfbW90aWYuYzoyOTg0Cittc2dpZCAiRG93biIKK21zZ3N0ciAiRG9s+SIKKworIy4gJ0ZpbmQgTmV4dCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY0NyBndWlfbW90aWYuYzoyNzY2Cittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICJOYWrtdCBkYWy57SIKKworIy4gJ1JlcGxhY2UnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NjQgZ3VpX21vdGlmLmM6Mjc4MworbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIk5haHJhZGl0IgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NzMgZ3VpX21vdGlmLmM6Mjc5NgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJOYWhyYWRpdCB2uWUiCisKKyM6IGd1aV9ndGtfeDExLmM6MTA3NiBndWlfeDExLmM6MTE5OQorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IG5lbHplIG90ZXb47XQgZGlzcGxheSIKKworIzogZ3VpX2d0a194MTEuYzoyNDMzIGd1aV94MTEuYzoyMDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IE5lem7hbeEgc2FkYSBw7XNlbTogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjQ2MAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJW/WLsciBw7XNtYSIKKworIzogZ3VpX2d0a194MTEuYzoyNzAyIGd1aV9tYWMuYzoyNzgwIGd1aV93NDguYzoxMTk3IGd1aV94MTEuYzoxODM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IE5lem7hbekgcO1zbW86ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI3MTMgZ3VpX3gxMS5jOjE4NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBQ7XNtbyBcIiVzXCIgbmVt4SBwZXZub3Ugue34a3UiCisKKyM6IGd1aV9ndGtfeDExLmM6Mjg0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBDb2xvciBuYW1lIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTI0MjogTmV6buFt6SBqbelubyBiYXJ2eTogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOSB1aS5jOjE5MjkKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICJN7XN0byBwcuFkbukgc2NocuFua3kgcG91vml0byBDVVRfQlVGRkVSMCIKKworIzogZ3VpX21vdGlmLmM6MTYwMSBndWlfbW90aWYuYzoxNjA0Cittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0ciIKKworIzogZ3VpX21vdGlmLmM6MTYwMworbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICJBZHJlc+H4ZSIKKworIzogZ3VpX21vdGlmLmM6MTYwNQorbXNnaWQgIkhlbHAiCittc2dzdHIgIk7hcG927GRhIgorCisjOiBndWlfbW90aWYuYzoxNjA2Cittc2dpZCAiRmlsZXMiCittc2dzdHIgIlNvdWJvcnkiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDgKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIlb9YuxyIgorCisjOiBndWlfbW90aWYuYzoyODA5Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiWnDsdCIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkUyMzU6IE5lbHplIG5h6O1zdCBaYXAgZm9udCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTogTmVsemUgcG91vu10IGZvbnQgJXMiCisKKyM6IGd1aV9yaXNjb3MuYzoxMTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDI6IE1pc3NpbmcgY29sb3I6ICVzIgorbXNnc3RyICJFMjQyOiBDaHli7SBiYXJ2YTogJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjY5Cittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlBvc+1s4W0gc2lnbuFsIGsgdWtvbuhlbu0gc3lub3Zza+lobyBwcm9jZXN1LlxuIgorCisjOiBndWlfdzMyLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBBcmd1bWVudCBuZXBvZHBvcm924W46IFwiLSVzXCI7IFBvdb5panRlIE9MRSB2ZXJ6aS4iCisKKyM6IGd1aV93NDguYzoyMDY4Cittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiTmFq7XQg+GV07HplYyAocG91vmlqdGUgJ1xcXFwnIGsgbmFsZXplbu0gJ1xcJykiCisKKyM6IGd1aV93NDguYzoyMDkzCittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiTmFq7XQgJiBOYWhyYWRpdCAocG91vmlqdGUgJ1xcXFwnIGsgbmFsZXplbu0gJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNDE5Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBuZWx6ZSBhbG9rb3ZhdCBwb2xvvmt1IGJhcmV2bukgbWFweS4gTuxrdGVy6SBiYXJ2eSBtb2hvdSBi/XQgIgorIm5lc3By4XZu6SIKKworIzogZ3VpX3gxMS5jOjE5OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IHDtc21hIHBybyBu4XNsZWR1au1j7SB6bmFrb3bpIHNhZHkgY2h5Yu0gdiBzYWTsIHDtc2VtICVzOiIKKworIzogZ3VpX3gxMS5jOjIwMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogbuF6ZXYgc2FkeSBw7XNlbTogJXMiCisKKyM6IGd1aV94MTEuYzoyMDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIlDtc21vICclcycgbmVt4SBwZXZub3Ugue34a3UiCisKKyM6IGd1aV94MTEuYzoyMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogbuF6ZXYgc2FkeSBw7XNlbTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIlDtc21vMDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIlDtc21vMTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIqnt+GthIHDtc21hJWQgbmVu7SBkdm9qbuFzb2JsZW0gue34a3kgcO1zbWEwXG4iCisKKyM6IGd1aV94MTEuYzoyMDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiqe34a2EgcO1zbWEwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIqnt+GthIHDtc21hMTogJWxkXG4iCisiXG4iCisKKyM6IGd1aV94MTEuYzoyMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogbmVsemUgYWxva292YXQgYmFydnUgJXMiCisKKyM6IGd1aV94MTEuYzozMjU2Cittc2dpZCAiRTI1NTogQ291bGRuJ3QgcmVhZCBpbiBzaWduIGRhdGEhIgorbXNnc3RyICJFMjU1OiBDaHliYSAtLSBuZWx6ZSBw+GXo7XN0IHNpZ24gZGF0YSEiCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBDWUJBIEhhbmd1bCBhdXRvbWF0dSIKKworIzogaWZfY3Njb3BlLmM6NjcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIlD4aWRhdCBub3ZvdSBkYXRhYuF6aSIKKworIzogaWZfY3Njb3BlLmM6NjkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICJIbGVk4W7tIHZ6b3JrdSIKKworIzogaWZfY3Njb3BlLmM6NzEKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiWm9icmF6aXQgdHV0byB6cHLhdnUiCisKKyM6IGlmX2NzY29wZS5jOjczCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIlVrb27oaXQgc3BvamVu7SIKKworIzogaWZfY3Njb3BlLmM6NzUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICJabm92dSBpbmljaWFsaXpvdmF0IHa5ZWNobmEgc3BvamVu7SIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJTaG93IGNvbm5lY3Rpb25zIgorbXNnc3RyICJab2JyYXppdCBzcG9qZW7tIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIlRlbnRvIGNzY29wZSBw+O1rYXogbmVwb2Rwb3J1amUgcm96ZOxsZW7tIG9rbmEuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0MworbXNnaWQgIlVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJQb3W+aXTtOiBjc3RhZyA8b2RzYXplbu0+IgorCisjOiBpZl9jc2NvcGUuYzoxOTkKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IHRhZyBuZW5hbGV6ZW4iCisKKyM6IGlmX2NzY29wZS5jOjQwNyBpZl9jc2NvcGUuYzo0NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJzdGF0KCVzKSBjaHliYTogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQ2MCBpZl9jc2NvcGUuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICJQ+Glk4W5hIGNzY29wZSBkYXRhYuF6ZSAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiJXMgbmVu7SBhbmkgYWRyZXPh+GVtIGFuaSBzcHLhdm5vdSBjc2NvcGUgZGF0YWLheu0iCisKKyM6IGlmX2NzY29wZS5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJjaHliYSBw+Gkg6HRlbu0gY3Njb3BlIHNwb2plbu0gJWQiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJuZXpu4W39IHR5cCBjc2NvcGUgaGxlZOFu7SIKKworIzogaWZfY3Njb3BlLmM6NjgwCittc2dpZCAiQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIm5lbHplIHZ5dHZv+Gl0IGNzY29wZSByb3VyeSIKKworIzogaWZfY3Njb3BlLmM6NzQ1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgInNwdbl07G7tIGNzX2NyZWF0ZV9jb25uZWN0aW9uIHNlbGhhbG8iCisKKyM6IGlmX2NzY29wZS5jOjc1NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHZvbOFu7SBmZG9wZW4gcHJvIHRvX2ZwIHNlbGhhbG8iCisKKyM6IGlmX2NzY29wZS5jOjc1NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHZvbOFu7SBmZG9wZW4gcHJvIGZyX2ZwIHNlbGhhbG8iCisKKyM6IGlmX2NzY29wZS5jOjc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAivuFkbuEgY3Njb3BlIHNwb2plbu0iCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGNzY29wZSBobGVk4W7tICVzIHZ6b3JrdSAlcyBuZW5huWxvIL7hZG5vdSBzaG9kdSIKKworIzogaWZfY3Njb3BlLmM6ODk5Cittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJw+O1rYXp5IGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpXG4iCittc2dzdHIgIiUtNXM6ICUtMzBzIChQb3W+aXTtOiAlcylcbiIKKworIzogaWZfY3Njb3BlLmM6OTcwCittc2dpZCAiZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgImR1cGxpY2l0bu0gY3Njb3BlIGRhdGFi4XplIG5lYnlsYSBw+Glk4W5hIgorCisjOiBpZl9jc2NvcGUuYzo5ODEKK21zZ2lkICJtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAiZG9zYb5lbiBtYXhpbeFsbu0gcG/oZXQgY3Njb3BlIHNwb2plbu0iCisKKyM6IGlmX2NzY29wZS5jOjExMDIKK21zZ2lkICJFMjYwOiBjc2NvcGUgY29ubmVjdGlvbiBub3QgZm91bmQiCittc2dzdHIgIkUyNjA6IGNvbm5lY3Rpb24gc3BvamVu7SBuZW5hbGV6ZW5vIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY29ubmVjdGlvbiBzcG9qZW7tICVzIG5lbmFsZXplbm8iCisKKyM6IGlmX2NzY29wZS5jOjExNDEKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiBjbG9zZWQiCittc2dzdHIgImNsb3NlZCBzcG9qZW7tIHV6YXb4ZW5vIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgc3BvamVu7SAlcyB1emF2+GVub1xuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjEyOTAKK21zZ2lkICJmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAib3N1ZG924SBjaHliYSB2IGNzX21hbmFnZV9tYXRjaGVzIgorCisjOiBpZl9jc2NvcGUuYzoxMzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6IHD4aSDodGVu7SBjc2NvcGUgc3BvamVu7SAlZCIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICJ2b2zhbu0gbWFsbG9jIHNlbGhhbG9cbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlc1xuIgorbXNnc3RyICJDc2NvcGUgdGFnOiAlc1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4Cittc2dpZCAiICAgIyAgIGxpbmUiCittc2dzdHIgIiAgICMgICD44WRlayIKKworIzogaWZfY3Njb3BlLmM6MTQ2MAorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAibuF6ZXYgc291Ym9ydS8ga29udGV4dC8g+OFkZWtcbiIKKworIzogaWZfY3Njb3BlLmM6MTcxOAorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICJWuWVjaG55IGNzY29wZSBkYXRhYuF6ZSByZXNldG924W55IgorCisjOiBpZl9jc2NvcGUuYzoxNzg1Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIr7hZG7pIGNzY29wZSBzcG9qZW7tXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBu4XpldiBkYXRhYuF6ZSAgICAgICAgICAgICAgICAgICAgICBw+GVkcG9uYSBjZXN0eVxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA8vuFkbv0+XG4iCisKKyM6IGlmX3B5dGhvbi5jOjM3NgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogTGl0dWppLCB0ZW50byBw+O1rYXogamUgZGVha3Rpdm924W47IGtuaWhvdm51IGphenlrYSBQeXRob24gbmVsemUgIgorIm5haHLhdC4iCisKKyM6IGlmX3B5dGhvbi5jOjU3NgorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAibmVsemUgc21hemF0IGF0cmlidXR5IE91dHB1dE9iamVjdCIKKworIzogaWZfcHl0aG9uLmM6NTgzCittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIG11c+0gYv10IGtsYWRu6SBjZWzpIOjtc2xvIgorCisjOiBpZl9weXRob24uYzo1OTEKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAiY2h5Ym79IGF0cmlidXQiCisKKyM6IGlmX3B5dGhvbi5jOjYzMCBpZl9weXRob24uYzo2NDQKK21zZ2lkICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgbGlzdCBvZiBzdHJpbmdzIgorbXNnc3RyICJ3cml0ZWxpbmVzKCkgdnm+YWR1amUgc2V6bmFtIPhldOx6Y/kiCisKKyM6IGlmX3B5dGhvbi5jOjc3MAorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IGNoeWJhIHD4aSBpbmljaWFsaXphY2kgSS9PIG9iamVrdPkiCisKKyM6IGlmX3B5dGhvbi5jOjk1NSBpZl90Y2wuYzoxMzkxCittc2dpZCAiaW52YWxpZCBleHByZXNzaW9uIgorbXNnc3RyICJDaHlibv0gdv1yYXoiCisKKyM6IGlmX3B5dGhvbi5jOjk2OSBpZl90Y2wuYzoxMzk2Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJwb2Rwb3JhIHb9cmF6+SBieWxhIHZ5cG51dGEgcPhpIHD4ZWtsYWR1IHByb2dyYW11IgorCisjOiBpZl9weXRob24uYzo5ODIKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJwb2t1cyBvIG9ka2F6IG5hIHNtYXphbv0gYnVmZmVyIgorCisjOiBpZl9weXRob24uYzo5OTcgaWZfcHl0aG9uLmM6MTAzOCBpZl9weXRob24uYzoxMTAyIGlmX3RjbC5jOjEyMDMKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIujtc2xvIPjhZGt1IG1pbW8gcm96c2FoIgorCisjOiBpZl9weXRob24uYzoxMjM1CisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPGJ1ZmZlciBvYmpla3QgKHNtYXrhbikgbmEgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjEzMjYgaWZfdGNsLmM6ODI1Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgImNoeWJu6SBqbelubyB6bmHoa3kiCisKKyM6IGlmX3B5dGhvbi5jOjE2MDEKK21zZ2lkICJubyBzdWNoIGJ1ZmZlciIKK21zZ3N0ciAivuFkbv0gdGFrb3b9IGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTY4OQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInBva3VzIG8gb2RrYXogbmEgc21hemFu6SBva25vIgorCisjOiBpZl9weXRob24uYzoxNzM0Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJhdHJpYnV0IHBvdXplX3Byb1/odGVu7SIKKworIzogaWZfcHl0aG9uLmM6MTc0NworbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAidW3tc3Tsbu0ga3Vyem9ydSBtaW1vIGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTgyNAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZWt0IG9rbmEgKHNtYXrhbikgbmEgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iamVrdCBva25hIChuZXpu4W39KSBuYSAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTgzOAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93ICVkPiIKK21zZ3N0ciAiPG9rbm8gJWQ+IgorCisjOiBpZl9weXRob24uYzoxOTE0Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgIr7hZG7pIHRha2926SBva25vIgorCisjOiBpZl9weXRob24uYzoyMTQ0IGlmX3B5dGhvbi5jOjIxNzUgaWZfcHl0aG9uLmM6MjIyNSBpZl9weXRob24uYzoyMjg1CisjOiBpZl9weXRob24uYzoyNDAyIGlmX3B5dGhvbi5jOjI0NTQgaWZfdGNsLmM6NjczIGlmX3RjbC5jOjcxOCBpZl90Y2wuYzo3OTIKKyM6IGlmX3RjbC5jOjg2MiBpZl90Y2wuYzoxOTg3Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAibmVsemUgdWxvvml0IGluZm9ybWFjZSBwcm8gcPjta2F6IHVuZG8iCisKKyM6IGlmX3B5dGhvbi5jOjIxNDYgaWZfcHl0aG9uLmM6MjIzMiBpZl9weXRob24uYzoyMjk2Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICJuZWx6ZSBzbWF6YXQg+OFkZWsiCisKKyM6IGlmX3B5dGhvbi5jOjIxNzcgaWZfcHl0aG9uLmM6MjMxMiBpZl90Y2wuYzo2NzkgaWZfdGNsLmM6MjAwOQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIm5lbHplIG5haHJhZGl0IPjhZGVrIgorCisjOiBpZl9weXRob24uYzoyMzI4IGlmX3B5dGhvbi5jOjI0MDQgaWZfcHl0aG9uLmM6MjQ2MgorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAibmVsemUgdmxvvml0IPjhZGVrIgorCisjOiBpZl9weXRob24uYzoyNTY2Cittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICL4ZXTsemVjIG5lc23tIG9ic2Fob3ZhdCB6bmFreSBub3bpaG8g+OFka3UiCisKKyM6IGlmX3J1YnkuYzozOTQKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6IExpdHVqaSwgYWxlIHRlbnRvIHD47WtheiBqZSBkZWFrdGl2b3bhbjsga25paG92bnUgamF6eWthIFJ1YnkgbmVsemUgIgorIm5haHLhdC4iCisKKyM6IGlmX3J1YnkuYzo0NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogbmV6buFt/SBsb25nam1wIHN0YXYgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiUHJvaG96ZW7tIGltcGxlbWVudGFjZS9kZWZpbmljZSIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAiWm9icmF6ZW7tIGJhc2UgY2xhc3MgeiIKKworIzogaWZfc25pZmYuYzo2OQorbXNnaWQgIlNob3cgb3ZlcnJpZGRlbiBtZW1iZXIgZnVuY3Rpb24iCittc2dzdHIgIlpvYnJhemVu7SBvdmVycmlkZGVuIG1lbWJlciBmdW5rY2UiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIlpub3Z1eu1za+FubyB6ZSBzb3Vib3J1IgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJabm92dXrtc2vhbm8geiBwcm9qZWt0dSIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICJabm92eu1za+FubyB6ZSB2uWVjaCBwcm9qZWt0+SIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICJabm92dXrtc2vhbm8iCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAiWm9icmF6ZW7tIHpkcm9qZSIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJOYWrtdCBzeW1ib2wiCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIlByb2hs7b5ldCBjbGFzcyIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICJab2JyYXplbu0gY2xhc3MgdiBoaWVyYXJjaGlpIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAiWm9icmF6ZW7tIGNsYXNzIHYgcmVzdHJpY3RlZCBoaWVyYXJjaGlpIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgb2RrYXp1amUgbmEiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIG9ka2F6b3ZhbCBuYSIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYgbeEiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgcG91vml0IgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICJab2JyYXplbu0gZG9jdW1lbnRhY2UiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiR2VuZXJvduFuYSBkb2t1bWVudGFjZSBwcm8iCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJOZWx6ZSBzZSBw+Glwb2ppdCBrIFNOaUZGKy4gWmtvbnRyb2x1anRlIHByb23sbm7pIChzbmlmZmVtYWNzIG11c+0gIgorImL9dCl1dmVkZW5hIHYgJFBBVEguXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiBDaHliYSBw+Gkg6HRlbu0uIE9kcG9qZW5vIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICJTTmlGRisgamUgcHLhduwgIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIm5lICIKKworIzogaWZfc25pZmYuYzo1NTYKK21zZ2lkICJjb25uZWN0ZWQiCittc2dzdHIgInD4aXBvamVuIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogTmV6buFt/SBwb75hZGF2ZWsgU05pRkYrOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogQ2h5Ym7pIHD4aXBvamVu7SBrIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDEwCittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IFNOaUZGKyBuZXD4aXBvamVuIgorCisjOiBpZl9zbmlmZi5jOjEwMTkKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBOZW7tIFNOaUZGKyBidWZmZXIiCisKKyM6IGlmX3NuaWZmLmM6MTA4NAorbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6IENoeWJhIHD4aSB64XBpc3UuIE9kcG9qZW5vLiIKKworIzogaWZfdGNsLmM6NDA3Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJjaHlibv0gbuF6ZXYgYnVmZmVydSIKKworIzogaWZfdGNsLmM6NDUzIGlmX3RjbC5jOjkyMCBpZl90Y2wuYzoxMDk5Cittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibmVu7SBqZbl07CBwb2Rwb3JvduFubyIKKworIzogaWZfdGNsLmM6NDkwCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm5lem7hbeEgdm9sYmEiCisKKyMuID8/PworIzogaWZfdGNsLmM6NzYzCittc2dpZCAiY2Fubm90IHNldCBsaW5lKHMpIgorbXNnc3RyICJuZWx6ZSBuYXN0YXZpdCD44WRreSIKKworIzogaWZfdGNsLmM6ODM0Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJ6bmHoa2EgbmVu7SBuYXN0YXZlbmEiCisKKyM6IGlmX3RjbC5jOjg0MCBpZl90Y2wuYzoxMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgIvjhZGVrICVkIHNsb3VwZWMgJWQiCisKKyM6IGlmX3RjbC5jOjg3MAorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIm5lbHplIHZsb75pdC9w+Glwb2ppdCD44WRlayIKKworIzogaWZfdGNsLmM6MTI1NworbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICJuZXpu4W39IHD47XpuYWs6ICIKKworIzogaWZfdGNsLmM6MTMyNworbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICJuZXpu4W3hIHZpbU9wdGlvbiIKKworIzogaWZfdGNsLmM6MTQxMgorbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAicPhlcnW5ZW7tIHoga2zhdmVzbmljZSIKKworIzogaWZfdGNsLmM6MTQxNworbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAiY2h5YmEgdmltIgorCisjOiBpZl90Y2wuYzoxNDYwCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICJuZWx6ZSB2eXR2b/hpdCBw+O1rYXogYnVmZmVydS9va25hOiBvYmpla3Qgc21heuFuIgorCisjOiBpZl90Y2wuYzoxNTM0Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorIm5lbHplIHphcmVnaXN0cm92YXQgcPjta2F6IHpw7HRu6WhvIHZvbOFu7TogYnVmZmVyL29rbm8gamm+IGJ5bG8gc21heuFubyIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NTEKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gIgorInZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBwb7lrb3plbiE/IE96bmFtdGUsIHByb3PtbSwgdHV0byBjaHlidSBuYSAiCisidmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTUyCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorIm5lbHplIHphcmVnaXN0cm92YXQgcPjta2F6IHpw7HRu6WhvIHZvbOFu7Togb2RrYXogbmEgYnVmZmVyL29rbm8gbmVuYWxlemVuIgorCisjOiBpZl90Y2wuYzoxNzEzCittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiTGl0dWppLCBhbGUgdGVudG8gcPjta2F6IGplIGRlYWt0aXZvduFuOyBrbmlob3ZudSBqYXp5a2EgVGNsIG5lbHplIG5haHLhdC4iCisKKyM6IGlmX3RjbC5jOjE4NzUKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wgQ0hZQkE6IG7hdnJhdG92/SBr82QgbmVu7SBjZWzpIOjtc2xvIT8gT3puYW10ZSwgcHJvc+1tLCB0dXRvIGNoeWJ1ICIKKyJuYSB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjE5OTUKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIm5lbHplIHD4Zejtc3Qg+OFkZWsiCisKKyM6IGlmX3hjbWRzcnYuYzoyMDQKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJOZW7tIG1vvm7pIHphem5hbWVuYXQgam3pbm8gY29tbWFuZCBzZXJ2ZXJ1IgorCisjOiBpZl94Y21kc3J2LmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogTmVleGlzdHVqZSByZWdpc3Ryb3Zhbv0gc2VydmVyIGpt6W5lbSBcIiVzXCIiCisKKyM6IGlmX3hjbWRzcnYuYzo0NDYKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBTZWxoYWxvIHphc2zhbu0gcPjta2F6dSB1cuhlbultdSBwcm9ncmFtdSIKKworIzogaWZfeGNtZHNydi5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIKK21zZ3N0ciAiUG91vml0IGNoeWJu/SBpZCBzZXJ2ZXJ1OiAlcyIKKworIzogaWZfeGNtZHNydi5jOjEwNjEKK21zZ2lkICJFMjQ5OiBjb3VsZG4ndCByZWFkIFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSIKK21zZ3N0ciAiRTI0OTogbmVsemUg6O1zdCBWSU0gaW5zdGFuY2kgcmVnaXN0cnkgcHJvcGVydHkiCisKKyM6IGlmX3hjbWRzcnYuYzoxMDcyCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICIiCisiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGJ5bGEguXBhdG7sIHZ5dHZv+GVuYWEgYnlsYSBzbWF64W5hISIKKworIzogbWFpbi5jOjUzIG9wdGlvbi5jOjMxNjIgb3B0aW9uLmM6MzI2OQorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICJOZXpu4W3hIHZvbGJhIgorCisjOiBtYWluLmM6NTUKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiUPjtbGm5IG1ub2hvIGVkaXQgYXJndW1lbnT5IgorCisjOiBtYWluLmM6NTcKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJDaHli7SBhcmd1bWVudCBwbyIKKworIzogbWFpbi5jOjU5Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIkNoeWJ5IHphIHZvbGJvdSIKKworIzogbWFpbi5jOjYxCittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiIG9yIFwiLWMgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAiUPjtbGm5IG1ub2hvIFwiK3D47WthelwiIOhpIFwiLWMgcPjta2F6XCIgYXJndW1lbnT5IgorCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50IHBybyIKKworIzogbWFpbi5jOjQzNgorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiVklNIG5lYnlsIHD4ZWxvvmVuIHMgdm9sYm91ICtkaWZmIgorCisjOiBtYWluLmM6ODU4Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiUG9rdXMgbyBvcOx0b3Zu6SBvdGV2+GVu7SBza3JpcHR1OiBcIiIKKworIzogbWFpbi5jOjg2MiBtYWluLmM6ODY5IG1haW4uYzo5MTMgbWVtbGluZS5jOjM2NzMgbWVtbGluZS5jOjM2NzcKKyM6IHZlcnNpb24uYzo4MTYgdmVyc2lvbi5jOjgyMSB2ZXJzaW9uLmM6ODI2IHZlcnNpb24uYzo4MzEgdmVyc2lvbi5jOjgzNgorIzogdmVyc2lvbi5jOjg0MSB2ZXJzaW9uLmM6ODQ3IHZlcnNpb24uYzo4NTEgdmVyc2lvbi5jOjg1NSB2ZXJzaW9uLmM6ODYwCisjOiB2ZXJzaW9uLmM6ODY3IHZlcnNpb24uYzo4NzUgdmVyc2lvbi5jOjg4MQorbXNnaWQgIlwiXG4iCittc2dzdHIgIlwiXG4iCisKKyM6IG1haW4uYzo4NjcKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIk5lbHplIG90ZXb47XQgcHJvIHrhcGlzOiBcIiIKKworIzogbWFpbi5jOjkxMQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTmVsemUgb3RldvjtdCBwcm8gdv1zdHVwIHNrcmlwdHU6IFwiIgorCisjOiBtYWluLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgInBv6GV0IHNvdWJvcvkgcHJvIGVkaXRhY2k6ICVkXG4iCisKKyM6IG1haW4uYzoxMDk0Cittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBWYXJvduFu7Togdv1zdHVwIG5lc23s+HVqZSBuYSB0ZXJtaW7hbFxuIgorCisjOiBtYWluLmM6MTA5NgorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IFZhcm924W7tOiB2c3R1cCBuZXBvY2jheu0geiB0ZXJtaW7hbHVcbiIKKworIy4ganVzdCBpbiBjYXNlLi4KKyM6IG1haW4uYzoxMTcxCittc2dpZCAicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAicHJlLXZpbXJjIHD47Wthem92/SD44WRlayIKKworIzogbWFpbi5jOjEyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6IE5lbHplIOjtc3QgeiBcIiVzXCIiCisKKyM6IG1haW4uYzoyMTU3Cittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIiIKKyJcbiIKKyJQb2Ryb2Ju7Gq57SBpbmZvcm1hY2Ugeu1za+F0ZSBwb21vY+0gXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjE5MAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbU09VQk9SXSAuLiAgICAgICAgICBlZGl0b3ZhdCBTT1VCT1IoeSkiCisKKyM6IG1haW4uYzoyMTkxCittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgICAgICDo7XN0IHRleHQgemUgc3RhbmRhcmRu7WhvIHZzdHVwdSIKKworIzogbWFpbi5jOjIxOTIKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCBUQUcgICAgICAgICAgZWRpdG92YXQgc291Ym9yIG5hIG3tc3TsIGRlZmluaWNlIFRBR1UiCisKKyM6IG1haW4uYzoyMTk0Cittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbY2h5Ym92/SBzb3Vib3JdICBlZGl0b3ZhdCBzb3Vib3IgbmEgbe1zdOwgdv1za3l0dSBwcnZu7SBjaHlieSIKKworIzogbWFpbi5jOjIyMDMKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisicG91vml07ToiCisKKyM6IG1haW4uYzoyMjA2Cittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgInZpbSBbcPhlcO1uYehlXSAiCisKKyM6IG1haW4uYzoyMjEwCittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIG5lYm8iCisKKyM6IG1haW4uYzoyMjEzCittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50eTpcbiIKKworIzogbWFpbi5jOjIyMTQKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdE1vaG91IG7hc2xlZG92YXQgcG91emUgbuF6dnkgc291Ym9y+SIKKworIzogbWFpbi5jOjIyMTYKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRw+GlobOFzaXQgZ3ZpbSBuYSBPTEUiCisKKyM6IG1haW4uYzoyMjE3Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRvZGhs4XNpdCBndmltIHogT0xFIgorCisjOiBtYWluLmM6MjIyMAorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0c3B1c3RpdCB2IEdVSSByZb5pbXUgKHN0ZWpu6SBqYWtvIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjIyMjEKK21zZ2lkICItZlx0XHRcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mXHRcdFx0UG9w+GVk7TogcPhpIHN0YXJ0dSBHVUkgc2UgbmVvZGTsbO0gb2Qgc2hlbGx1IgorCisjOiBtYWluLmM6MjIyMworbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIG3zZCAoc3Rlam7pIGpha28gXCJ2aVwiKSIKKworIzogbWFpbi5jOjIyMjQKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLXZcdFx0XHRFeCBt82QgKHN0ZWpu6SBqYWtvIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjI1Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdFRpY2j9IChk4XZrb3b9KSByZb5pbSAocG91emUgcHJvIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjI3Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdERpZmYgcmW+aW0gKHN0ZWpu6SBqYWtvIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjIyMjkKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICItdlx0XHRcdFNuYWRu/SByZb5pbSAoc3Rlam7pIGpha28gXCJldmltXCIsIL7hZG7pIG3zZHkgKSIKKworIzogbWFpbi5jOjIyMzAKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdFJlvmltIHBvdXplX3Byb1/odGVu7SAoamFrbyBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyMjMxCittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdE9tZXplbv0gcmW+aW0gKHN0ZWpu6SBqYWtvIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjIyMzIKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdFpt7G55ICh1a2zhZOFu7SBzb3Vib3L5KSB6YWvheuFueSIKKworIzogbWFpbi5jOjIyMzMKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHRabexueSAodWts4WThbu0gc291Ym9y+SkgemFr4XrhbnkiCisKKyM6IG1haW4uYzoyMjM0Cittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHRCaW7hcm7tIHJlvmltIgorCisjOiBtYWluLmM6MjIzNgorbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRcdExpc3AgcmW+aW0iCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHRLb21wYXRhYmlsbu0gcyBWaTogJ2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjIzOQorbXNnaWQgIi1OXHRcdFx0Tm90IGZ1bGx5IFZpIGNvbXBhdGlibGU6ICdub2NvbXBhdGlibGUnIgorbXNnc3RyICItTlx0XHRcdEtvbXBhdGliaWxpdGEgcyBWaSB2eXBudXRhOiAnbm9jb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjIyNDAKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0XHTacm92ZfIgdv1waXN1IGhs4bllayIKKworIzogbWFpbi5jOjIyNDEKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdExhZO1j7SByZb5pbSIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdE5lYnVkZSB2eXR24fhldCBvZGts4WRhY+0gc291Ym9yLCBidWRlIHBvdb7tdmF0IHBvdXplIHBhbey7IgorCisjOiBtYWluLmM6MjI0MworbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdFZ5cO25ZSBzZXpuYW0gb2RrbOFkYWPtY2ggc291Ym9y+SBhIHNrb27o7SIKKworIzogbWFpbi5jOjIyNDQKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgbuF6ZXYgc291Ym9ydVx0T2Jub3btIHD4ZXJ1uWVu6SBzZXplbu0iCisKKyM6IG1haW4uYzoyMjQ1Cittc2dpZCAiLUxcdFx0XHRTYW1lIGFzIC1yIgorbXNnc3RyICItTFx0XHRcdFN0ZWpu6SBqYWtvIC1yIgorCisjOiBtYWluLmM6MjI0NworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHROZWJ1ZGUgcG91vu12YXQgbmV3Y2xpIHBybyBvdGV2+GVu7SBva25hIgorCisjOiBtYWluLmM6MjI0OAorbXNnaWQgIi1kZXYgPGRldmljZT5cdFx0VXNlIDxkZXZpY2U+IGZvciBJL08iCittc2dzdHIgIi1kZXYgPHph+O16ZW7tPlx0XHRQb3W+7XQgPHph+O16ZW7tPiBwcm8gSS9PIgorCisjOiBtYWluLmM6MjI1MQorbXNnaWQgIi1IXHRcdFx0c3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0bmFzdGFydHVqZSB2IGhlYnJlanNr6W0gcmW+aW11IgorCisjOiBtYWluLmM6MjI1NAorbXNnaWQgIi1GXHRcdFx0c3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0XHRuYXN0YXJ0dWplIHZlIEZhcnNpIHJlvmltdSIKKworIzogbWFpbi5jOjIyNTYKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA8dGVybWlu4Ww+XHROYXN0YXbtIHR5cCB0ZXJtaW7hbHUgbmEgPHRlcm1pbuFsPiIKKworIzogbWFpbi5jOjIyNTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRQb3W+aWplIDx2aW1yYz4gbe1zdG8gamFr6Whva29saXYgLnZpbXJjIgorCisjOiBtYWluLmM6MjI1OQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRQb3W+aWplIDxndmltcmM+IG3tc3RvIGpha+lob2tvbGl2IC5ndmltcmMiCisKKyM6IG1haW4uYzoyMjYxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdE5lbmFocmFqZSAncGx1Z2luJyBza3JpcHR5IgorCisjOiBtYWluLmM6MjI2MgorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdE90ZXb4ZSBOIG9rZW4gKGltcGxpY2l0buwgamVkbm8gcHJvIGthvmT9IHNvdWJvcikiCisKKyM6IG1haW4uYzoyMjYzCittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0SmFrbyAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKKworIzogbWFpbi5jOjIyNjQKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHROYXN0YXbtIGt1cnpvciBuYSBrb25lYyBzb3Vib3J1IgorCisjOiBtYWluLmM6MjI2NQorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8+OFkZWs+XHRcdE5hc3Rhdu0ga3Vyem9yIG5hIDz44WRlaz4iCisKKyM6IG1haW4uYzoyMjY3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPHD47Wthej5cdFBvIG5haHLhbu0gcHJ2bu1obyBzb3Vib3J1IHZ5a29u4SA8cPjta2F6PiIKKworIzogbWFpbi5jOjIyNjkKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPHD47Wthej5cdFx0UG8gbmFocuFu7SBwcnZu7WhvIHNvdWJvcnUgdnlrb27hIDxw+O1rYXo+IgorCisjOiBtYWluLmM6MjI3MAorbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiIgorIi1TIDxzZXplbu0+XHRcdFBvIG5haHLhbu0gcHJ2bu1obyBzb3Vib3J1IHZ5a29u4SBw+O1rYXp5IHYgc291Ym9ydSA8c2V6ZW7tPiIKKworIzogbWFpbi5jOjIyNzEKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2tyaXB0Plx0XHROYeh0ZSBw+O1rYXp5IG5vcm3hbG7taG8gbfNkdSB6ZSA8c2tyaXB0dT4iCisKKyM6IG1haW4uYzoyMjcyCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNrcmlwdD5cdFx0UPhpcG9q7SB2uWVjaG55IG5hcHNhbukgcPjta2F6eSBkbyBzb3Vib3J1IDxza3JpcHQ+IgorCisjOiBtYWluLmM6MjI3MworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNrcmlwdD5cdFx0VWxvvu0gdrllY2hueSBuYXBzYW7pIHD47WthenkgZG8gc291Ym9ydSA8c2tyaXB0PiIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdEVkaXRhY2UgemG5aWZyb3Zhbv1jaCBzb3Vib3L5IgorCisjOiBtYWluLmM6MjI3OQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdFNwdXN07SB2aW0gbmEgZGFu/SBYLXNlcnZlciIKKworIzogbWFpbi5jOjIyODEKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdE5lcPhpcG9q7SBzZSBrIFggc2VydmVydSIKKworIzogbWFpbi5jOjIyODMKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHRPdGV2+GUgVmltIHV2bml0+CBqaW7paG8gR1RLIHdpZGdldHUiCisKKyM6IG1haW4uYzoyMjg3Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUgPHNvdWJvcnk+XHRFZGl0dWplIDxzb3Vib3J5PiBuYSBWaW0gc2VydmVydSBhIHNrb27o7SIKKworIzogbWFpbi5jOjIyODgKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXdhaXQgPHNvdWJvcnk+IEpha28gLS1yZW1vdGUsIGFsZSDoZWvhIG5hIHNvdWJvcnkgayBlZGl0YWNpIgorCisjOiBtYWluLmM6MjI4OQorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPGts4XZlc3k+XHRQ+GVk4SA8a2zhdmVzeT4gVmltIHNlcnZlcnUgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8dv1yYXo+XHRQcm92ZWRlIDx2/XJhej4gbmEgc2VydmVydSBhIHpvYnJheu0gdv1zbGVkZWsiCisKKyM6IG1haW4uYzoyMjkxCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRWeXDtuWUgc2V6bmFtIGRvc3R1cG79Y2ggVmltIHNlcnZlcvkgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjkyCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICIiCisiLS1zZXJ2ZXJuYW1lIDxqbelubz5cdFphuWxlIHNlcnZlcnUgPGpt6W5vPi9zdGFuZSBzZSBWaW0gc2VydmVyZW0gPGpt6W5vPiIKKworIzogbWFpbi5jOjIyOTUKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0UG91vmlqZSA8dmltaW5mbz4gbe1zdG8gamFr6Whva29saXYgLnZpbWluZm8iCisKKyM6IG1haW4uYzoyMjk3Cittc2dpZCAiLWhcdFx0XHRwcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaFx0XHRcdFZ5cO25ZSB0dXRvIG7hcG927GR1IGEgc2tvbujtIgorCisjOiBtYWluLmM6MjI5OAorbXNnaWQgIi0tdmVyc2lvblx0XHRwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0dnlw7bllIGluZm9ybWFjZSBvIHZlcnppIGEgc2tvbujtIgorCisjOiBtYWluLmM6MjMwMgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlD4ZXDtbmHoZSBwcm8gZ3ZpbSAoTW90aWYgdmVyemkpOlxuIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+GVw7W5h6GUgcHJvIGd2aW0gKEF0aGVuYSB2ZXJ6aSk6XG4iCisKKyM6IG1haW4uYzoyMzA4Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRTcHVzdO0gdmltIG5hIDxkaXNwbGF5PiIKKworIzogbWFpbi5jOjIzMDkKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0U3B1c3TtIHZpbSBtaW5pbWFsaXpvdmFu6SIKKworIzogbWFpbi5jOjIzMTEKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8buF6ZXY+XHRcdFBvdb5pamUgcmVzb3VyY2UgamFrbyBieSB2aW0gbexsIDxu4Xpldj4iCisKKyM6IG1haW4uYzoyMzEyCittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAobmVu7SBpbXBsZW1lbnRvduFubylcbiIKKworIzogbWFpbi5jOjIzMTQKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxiYXJ2YT5cdE5hc3Rhdu0gPGJhcnZ1PiBwb3phZO0gKHRha+kgLWJnKSIKKworIzogbWFpbi5jOjIzMTUKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxiYXJ2YT5cdE5hc3Rhdu0gPGJhcnZ1PiBwb3D4ZWTtICh0YWvpIC1mZykiCisKKyM6IG1haW4uYzoyMzE2IG1haW4uYzoyMzM2Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8cO1zbW8+XHRcdE5hc3Rhdu0gPHDtc21vPiBub3Jt4Wxu7WhvIHRleHR1ICh0YWvpIC1mbikiCisKKyM6IG1haW4uYzoyMzE3Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHBybyB6dv1yYXpu7G79IHRleHQiCisKKyM6IG1haW4uYzoyMzE4Cittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHBybyBrdXJ67XZ1IgorCisjOiBtYWluLmM6MjMxOSBtYWluLmM6MjMzNworbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tZXRyaWU+XHROYXN0YXbtIDxnZW9tZXRyaWk+ICh0YWvpIC1nZW9tKSIKKworIzogbWFpbi5jOjIzMjAKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8ue34a2E+XHROYXN0YXbtIDy57fhrdT4gb2tyYWr5ICh0YWvpIC1idykiCisKKyM6IG1haW4uYzoyMzIxCittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICItc2Nyb2xsYmFyd2lkdGggPLnt+Gt1PiBOYXN0YXbtIDy57fhrdT4gcG9zdW5vdmFj7SBsabl0eSAodGFr6TogLXN3KSIKKworIzogbWFpbi5jOjIzMjMKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICItbWVudWhlaWdodCA8dv25a2E+XHROYXN0YXbtIDx2/blrdT4gbmFi7WRreSAodGFr6SAtbWgpIgorCisjOiBtYWluLmM6MjMyNSBtYWluLmM6MjMzOAorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHRQb3W+aWplIHJldmVyem7tIGJhcnZ5ICh0YWvpIC1ydikiCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdE5lcG91vmlqZSByZXZlcnpu7SBiYXJ2eSAodGFr6SArcnYpIgorCisjOiBtYWluLmM6MjMyNworbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHJlc291cmNlPlx0TmFzdGF27SB6YWRhbv0gPHJlc291cmNlPiIKKworIzogbWFpbi5jOjIzMzAKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlD4ZXDtbmHoZSBwcm8gZ3ZpbSAoUklTQyBPUyB2ZXJ6aSk6XG4iCisKKyM6IG1haW4uYzoyMzMxCittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPHBv6GV0Plx0PHBv6GV0PiBzbG91cGP5IG5hIG9rbm8iCisKKyM6IG1haW4uYzoyMzMyCittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxwb+hldD5cdDxwb+hldD4g+OFka/kgbmEgb2tubyIKKworIzogbWFpbi5jOjIzMzUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlD4ZXDtbmHoZSBwcm8gZ3ZpbSAoR1RLKyB2ZXJ6aSk6XG4iCisKKyM6IG1haW4uYzoyMzM5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRTcHVzdO0gdmltIG5hIDxkaXNwbGF5PiAodGFr6SAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjM0MQorbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdFZ5cO25ZSBHbm9tZSBw+GVw7W5h6GUiCisKKyMuIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyM6IG1haW4uYzoyNTY2Cittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiUPhlZOFu7SB2/XJhenUgc2VsaGFsby5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNTcxCittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+GVk4W7tIHNlbGhhbG8uIFprb3W57W0gcHJvdulzdCBsb2vhbG7sXG4iCisKKyM6IG1haW4uYzoyNjA0IG1haW4uYzoyNjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQgeiAlZCBlZGl0b3bhbm8iCisKKyM6IG1haW4uYzoyNjQ4Cittc2dpZCAiU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiUPhlZOFu7SB2/XJhenUgc2VsaGFsby5cbiIKKworIzogbWFyay5jOjY2MAorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiTmVqc291IG5hc3RhdmVueSC+4WRu6SB6bmHoa3kiCisKKyM6IG1hcmsuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBcIiVzXCIgbmV2eWhvdnVq7SC+4WRu6SB6bmHoa3kiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjY3MworbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJ6bmHoa2Eg+OFkZWsgIHNsb3VwZWMgc291Ym9yL3RleHQiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcxMQorbXNnaWQgIiIKKyJcbiIKKyIganVtcCBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiIHNrb2sg+OFkZWsgc2xvdXBlYyBzb3Vib3IvdGV4dCIKKworIzogbWFyay5jOjEwNzMKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBTb3Vib3Jvdukgem5h6Gt5OlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDgKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgU2V6bmFtIHNrb2v5IChwb+jtbmFqZSBuZWpub3bsarntIHBvbG++a291KTpcbiIKKworIzogbWFyay5jOjEyMDMKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmllIHpuYehlayB2IHNvdWJvcmVjaCAocG/o7W5hamUgbmVqbm927Gq57SBwb2xvvmtvdSk6XG4iCisKKyM6IG1hcmsuYzoxMjg2Cittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIkNoeWLtICc+JyIKKworIzogbWJ5dGUuYzozOTUKK21zZ2lkICJOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiQ2h5Ym7hIGvzZG924SBzdHLhbmthIgorCisjOiBtYnl0ZS5jOjMwMTQKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogTmVsemUgbmFzdGF2aXQgSUMgaG9kbm90eSIKKworIzogbWJ5dGUuYzozMTY2Cittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiBOZXBvZGH4aWxvIHNlIHZ5dHZv+Gl0IHZzdHVwbu0ga29udGV4dCIKKworIzogbWJ5dGUuYzozMzEzCittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiBOZXBvZGH4aWxvIHNlIG90ZXb47XQgdnN0dXBu7SBtZXRvZHUiCisKKyM6IG1ieXRlLmM6MzMyNAorbXNnaWQgIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIKK21zZ3N0ciAiRTI4NzogVmFyb3bhbu06IGxpa3ZpZGHobu0genDsdG7pIHZvbOFu7SBuZWx6ZSBuYXN0YXZpdCBuYSBJTSIKKworIzogbWJ5dGUuYzozMzMwCittc2dpZCAiRTI4ODogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgc3R5bGUiCittc2dzdHIgIkUyODg6IHZzdHVwbu0gbWV0b2RhIG5lcG9kcG9ydWplIL7hZG79IHN0eWwiCisKKyM6IG1ieXRlLmM6MzM4NworbXNnaWQgIkUyODk6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgbXkgcHJlZWRpdCB0eXBlIgorbXNnc3RyICJFMjg5OiB2c3R1cG7tIG1ldG9kYSBuZXBvZHBvcnVqZSBt+WogJ3ByZWVkaXQnIHR5cCIKKworIzogbWJ5dGUuYzozNDYxCittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBOYWRib2Rvdv0gc3R5bCB2eb5hZHVqZSBmb250c2V0IgorCisjOiBtYnl0ZS5jOjM0ODkKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IE3hdGUgR1RLKyB2ZXJ6ZSBzdGFyue0gbmW+IDEuMi4zLiBTdGF2b3bhIHBsb2NoYSB2eXBudXRhLiIKKworIzogbWJ5dGUuYzozNzI2Cittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogU2VydmVyIHZzdHVwbu1jaCBtZXRvZCBuZWLsvu0iCisKKyM6IG1lbWZpbGUuYzo0NzMKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogYmxvayBuZWJ5bCB6YW1rbnV0IgorCisjOiBtZW1maWxlLmM6OTcyCittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogQ2h5YmEgcG9zdW51IHVrYXpvduF0a2EgcPhpIOh0ZW7tIG9ka2zhZGFj7WhvIHNvdWJvcnUiCisKKyM6IG1lbWZpbGUuYzo5NzcKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogQ2h5YmEgcPhpIOh0ZW7tIG9ka2zhZGFj7WhvIHNvdWJvcnUiCisKKyM6IG1lbWZpbGUuYzoxMDI5Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IENoeWJhIHBvc3VudSB1a2F6b3bhdGthIHD4aSB1a2zhZOFu7SBkbyBvZGts4WRhY+1obyBzb3Vib3J1IgorCisjOiBtZW1maWxlLmM6MTA0NworbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NzogQ2h5YmEgcPhpIHVrbOFk4W7tIGRvIG9ka2zhZGFj7WhvIHNvdWJvcnUiCisKKyM6IG1lbWZpbGUuYzoxMjQ0Cittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICIiCisiRTMwMDogT2RrbOFkYWPtIHNvdWJvciBqab4gZXhpc3R1amUhIChO7GtkbyBoYWNrdWplcPhlcyBuYXN0cmG+ZW79IHN5bWxpbms/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IE5lbHplIHrtc2thdCBibG9rIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogTmVsemUgeu1za2F0IGJsb2sgMT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiBuZWx6ZSB67XNrYXQgYmxvayAyPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTogSulqZSwgb2RrbOFkYWPtIHNvdWJvciBieWwgenRyYWNlbiEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBOZWx6ZSBw+GVqbWVub3ZhdCBvZGts4WRhY+0gc291Ym9yIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiBOZWx6ZSBvdGV2+O10IG9ka2zhZGFj7SBzb3Vib3IgcHJvIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogbmVsemUgeu1za2F0IGJsb2sgMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IE9ka2zhZGFj7SBzb3Vib3IgcHJvICVzIG5lYnlsIG5hbGV6ZW4iCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICIiCisiWmFkZWp0ZSDo7XNsbyBvZGts4WRhY+1obyBzb3Vib3J1LCBrdGVy/SBzZSBt4SBwb3W+7XQgKDAgcHJvIHVrb27oZW7tKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiBOZWx6ZSBvdGV2+O10ICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiTmVsemUg6O1zdCBibG9rIDAgeiAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiTW++buEgbmVkb7lsbyBrIL7hZG79bSB6bexu4W0sIG5lYm8gVmltIG5lYWt0dWFsaXpvdmFsIG9ka2zhZGFj7SBzb3Vib3IuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgbmVsemUgcG91vu10IHMgdG91dG8gdmVyeu0gVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODQ5Cittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiUG91vmlqdGUgVmltIHZlcnplIDMuMC5cbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyBzZSBuZXpk4SBi/XQgb2RrbOFkYWPtbSBzb3Vib3JlbSBWaW0iCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIG5lbHplIHBvdb7tdCBuYSB0b210byBwb+jtdGHoaS5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAiU291Ym9yIGJ5bCB2eXR2b/hlbiAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIm5lYm8gYnlsIHNvdWJvciBwb7lrb3plbi4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiUG91vu124W0gb2RrbOFkYWPtIHNvdWJvciBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIlD5dm9kbu0gc291Ym9yIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkzNAorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiBWYXJvduFu7TogUPl2b2Ru7SBzb3Vib3IgbW9obCBi/XQgem3sbuxuIgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogTmVsemUg6O1zdCBibG9rIDEgeiAlcyIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0hZQs0gTU5PSE8g2MFES9kiCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz9DSFlCTt0gUE/IRVQg2MFES9kiCisKKyM6IG1lbWxpbmUuYzoxMDAyCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P1BSwVpETt0gQkxPSyIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9DSFlCzErNQ80g2MFES1kiCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBJRCBibG9rdSAxIGplIGNoeWJu6SAoamUgJXMgb2RrbOFkYWPtbSBzb3Vib3JlbT8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P0NIWULNIEJMT0siCisKKyM6IG1lbWxpbmUuYzoxMDgxCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAib2QgPz8/IHBvID8/P0VORCBtb2hvdSBi/XQg+OFka3kgcG9t7WNoYW7pIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAib2QgPz8/IHBvID8/P0VORCBtb2hvdSBi/XQgdmxvvmVu6S9zbWF6YW7pIPjhZGt5IgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/S09ORUMiCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IE9ibm92YSBw+GVydbllbmEiCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IFYgcHL5YuxodSBvYm5vdnkgZG+5bG8gayBjaHli4W07IHprb250cm9sdWp0ZSD44WRreSB6YejtbmFq7WPtIG5hID8/PyIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIk9ibm92YSBkb2tvbuhlbmEuIFprb250cm9sdWp0ZSwgemRhIGplIHa5ZSB2IHBv+OFka3UuIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihadmG+dGUgdWxvvmVu7SB0b2hvdG8gc291Ym9ydSBwb2Qgamlu/W0gbuF6dmVtXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUwCittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgImEga29udHJvbHUgem3sbiBwb21vY+0gcHJvZ3JhbXUgZGlmZi4pXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIlBvdOkgc21hvnRlIG9ka2zhZGFj7SBzb3Vib3IuXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIwNworbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJOYWxlemVu6SBvZGts4WRhY+0gc291Ym9yeToiCisKKyM6IG1lbWxpbmUuYzoxMzg1Cittc2dpZCAiICAgSW4gY3VycmVudCBkaXJlY3Rvcnk6XG4iCittc2dzdHIgIiAgIFYgYWt0deFsbu1tIGFkcmVz4fhpOlxuIgorCisjOiBtZW1saW5lLmM6MTM4NworbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBTZSB6YWRhbv1tIG7henZlbTpcbiIKKworIzogbWVtbGluZS5jOjEzOTEKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICBWIGFkcmVz4fhpICIKKworIzogbWVtbGluZS5jOjE0MDkKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIL7hZG7pIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDgxCittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICB2bGFzdG7tazogIgorCisjOiBtZW1saW5lLmM6MTQ4MworbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgIGRhdHVtIHZ5dHZv+GVu7TogIgorCisjOiBtZW1saW5lLmM6MTQ4NyBtZW1saW5lLmM6MzY4MAorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgICAgZGF0dW0gdnl0dm/4ZW7tOiAiCisKKyM6IG1lbWxpbmUuYzoxNTAzCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW29kIFZpbSB2ZXJ6ZSAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUwNworbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW25ldnlwYWThIGpha28gb2RrbOFkYWPtIHNvdWJvciBWaW1dIgorCisjOiBtZW1saW5lLmM6MTUxMQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICBu4XpldiBzb3Vib3J1OiAiCisKKyM6IG1lbWxpbmUuYzoxNTIzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIGRhdHVtIHpt7G55OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiWUVTIgorbXNnc3RyICJBTk8iCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAibm8iCittc2dzdHIgIm5lIgorCisjOiBtZW1saW5lLmM6MTUyOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIHW+aXZhdGVsc2vpIGpt6W5vOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM1Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIG7hemV2IHBv6O10YehlOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgbuF6ZXYgcG/o7XRh6GU6ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIElEIHByb2Nlc3UgOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChzdOFsZSBha3Rpdm7tKSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuZXBvdb5pdGVsbukgcyB0b3V0byB2ZXJ67SBWaW1dIgorCisjOiBtZW1saW5lLmM6MTU2NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuZXBvdb5pdGVsbukgbmEgdG9tdG8gcG/o7XRh6GldIgorCisjOiBtZW1saW5lLmM6MTU2OQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFtuZWx6ZSBw+GXo7XN0XSIKKworIzogbWVtbGluZS5jOjE1NzMKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFtuZWx6ZSBvdGV2+O10XSIKKworIzogbWVtbGluZS5jOjE3NjMKK21zZ2lkICJFMzEzOiBDYW5ub3QgcHJlc2VydmUsIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMxMzogTmVsemUgemFjaG92YXQgLSBvZGts4WRhY+0gc291Ym9yIG5lZXhpc3R1amUuIgorCisjOiBtZW1saW5lLmM6MTgxNgorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJTb3Vib3IgemFjaG924W4iCisKKyM6IG1lbWxpbmUuYzoxODE4Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBVY2hvduFu7SBzZSBuZXpkYfhpbG8iCisKKyM6IG1lbWxpbmUuYzoxODg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogY2h5Ym7pIOjtc2xvIPjhZGt1OiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDogbmVsemUgbmFs6Xp0IPjhZGVrICVsZCIKKworIzogbWVtbGluZS5jOjIzMDMKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6IGNoeWJu6SBpZCB1a2F6YXRlbGUgbmEgYmxvayAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGJ5IG3sbG8gbe10IGhvZG5vdHUgMyIKKworIzogbWVtbGluZS5jOjI0NDUKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IEFrdHVhbGl6b3bhbm8gcPjtbGm5IG1ub2hvIGJsb2v5PyIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IGNoeWJu6SBpZCB1a2F6YXRlbGUgbmEgYmxvayA0IgorCisjOiBtZW1saW5lLmM6MjYyOQorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgInNtYXrhbiBibG9rIDE/IgorCisjOiBtZW1saW5lLmM6MjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTmVsemUgbmFs6Xp0IPjhZGVrICVsZCIKKworIzogbWVtbGluZS5jOjMwNzIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthemF0ZWxlIG5hIGJsb2siCisKKyM6IG1lbWxpbmUuYzozMDg4Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IG3hIG51bG92b3UgaG9kbm90dSIKKworIzogbWVtbGluZS5jOjMxMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiBwb+hldCD44WRr+SBtaW1vIHJvenNhaDogJWxkID4gY2Vsa292/SBwb+hldCD44WRr+SIKKworIzogbWVtbGluZS5jOjMxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IGNoeWJu/SBwb+hldCD44WRr+SB2IGJsb2t1ICVsZCIKKworIzogbWVtbGluZS5jOjMxNzAKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAiTuFy+XN0IHZlbGlrb3N0aSB64XNvYm7ta3UiCisKKyM6IG1lbWxpbmUuYzozMjE2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthemF0ZWxlIG5hIGJsb2sgMiIKKworIzogbWVtbGluZS5jOjM2NzAKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IFBPWk9SIgorCisjOiBtZW1saW5lLmM6MzY3MQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIk5hbGV6ZW4gb2RrbOFkYWPtIHNvdWJvciBzZSBqbeluZW0gXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJQ+Gkgb3Rldu1y4W7tIHNvdWJvcnVcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgTk9WzEqpzSBuZb4gb2RrbOFkYWPtIHNvdWJvciFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSBTb3Vib3Igbfm+ZSBi/XQgZWRpdG924W4gamlu/W0gcHJvZ3JhbWVtLlxuIgorIiAgICBKZS1saSB0b211IHRhaywgcGFrIHNpIGRlanRlIHBvem9yLCBhYnkganN0ZSBwbyB1bG++ZW7tIHpt7G5cbiIKKyIgICAgbmVt7GxpIGR27CBy+Xpu6SB2ZXJ6ZSB06WhvviBzb3Vib3J1LlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBVa29u6GV0ZSBwcm9ncmFtLCBuZWJvIG9wYXRybuwgcG9rcmHodWp0ZSB2IGVkaXRhY2kuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkwCittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpIEVkaXRhY2UgdG9ob3RvIHNvdWJvcnUgYnlsYSBw+GVydbllbmEgbmXoZWthbv1tIHVrb27oZW7tbSBwcm9ncmFtdS5cbiIKKworIzogbWVtbGluZS5jOjM2OTEKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICBKZS1saSB0b211IHRhaywgcGFrIHBvdb5panRlIFwiOnJlY292ZXJcIiDoaSBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgcHJvIG9kc3RyYW7sbu0gem3sbiAodml6IFwiOmhlbHAgcmVjb3ZlcnkpXCIuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIFBva3VkIGpzdGUgdGFrIGppviB16GluaWwsIHRhayBzbWG+dGUgb2RrbOFkYWPtIHNvdWJvciBcIiIKKworIzogbWVtbGluZS5jOjM2OTYKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgYSB0YXRvIHpwcuF2YSBzZSBqab4gbmVidWRlIG9iamV2b3ZhdC5cbiIKKworIzogbWVtbGluZS5jOjM3MTAgbWVtbGluZS5jOjM3MTQKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIk9ka2zhZGFj7SBzb3Vib3IgXCIiCisKKyM6IG1lbWxpbmUuYzozNzExIG1lbWxpbmUuYzozNzE3Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiBqab4gZXhpc3R1amUhIgorCisjOiBtZW1saW5lLmM6MzcyMAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gUE9aT1IiCisKKyM6IG1lbWxpbmUuYzozNzIyCittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiT2RrbOFkYWPtIHNvdWJvciBqab4gZXhpc3R1amUhIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisiJk90ZXb47XQgcG91emUgcHJvIOh0ZW7tXG4iCisiJlBva3Jh6G92YXQgdiBlZGl0YWNpXG4iCisiTyZibm92aXQgc291Ym9yXG4iCisiJktvbmVjIgorCisjOiBtZW1saW5lLmM6MzcyOAorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIiZPdGV2+O10IHBvdXplIHBybyDodGVu7VxuIgorIiZQb2tyYehvdmF0IHYgZWRpdGFjaVxuIgorIk8mYm5vdml0IHNvdWJvclxuIgorIiZLb25lY1xuIgorIiZTbWF6YXQiCisKKyM6IG1lbWxpbmUuYzozNzgxCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogUPjtbGm5IG1ub2hvIG9ka2zhZGFj7WNoIHNvdWJvcvkiCisKKyM6IG1lbnUuYzo2NAorbXNnaWQgIkUzMjc6IFBhcnQgb2YgbWVudS1pdGVtIHBhdGggaXMgbm90IHN1Yi1tZW51IgorbXNnc3RyICJFMzI3OiDI4XN0aSBjZXN0eSBrIHD4ZWRt7HR1IG5hYu1ka3kgbmVu7SBwb2RuYWLtZGtvdSIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IE5hYu1ka2EgZXhpc3R1amUgcG91emUgdiBqaW7pbSBt82R1IgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogTmFi7WRrYSB0b2hvdG8gam3pbmEgbmVleGlzdHVqZSIKKworIzogbWVudS5jOjUwMworbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IENlc3RhIG5hYu1ka291IG5lc23tIHbpc3QgZG8gcG9kbmFi7WRreSIKKworIzogbWVudS5jOjU0MgorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBQb2xvvmt5IG5hYu1ka3kgbmVsemUgcPhpZOF2YXQgcPjtbW8gbmEgbGm5dHUiCisKKyM6IG1lbnUuYzo1NDgKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6IE9kZOxsb3Zh6CBuZXNt7SBi/XQg6OFzdO0gY2VzdHkgbmFi7WRrb3UiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNjMKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBOYWLtZGt5IC0tLSIKKworIzogbWVudS5jOjE5ODkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIk9kdHJobm91dCB0dXRvIG5hYu1ka3UiCisKKyM6IG1lbnUuYzoyMDU0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogQ2VzdGEgbmFi7WRrb3UgbXVz7SB26XN0IGsgcG9sb75jZSBuYWLtZGt5IgorCisjOiBtZW51LmM6MjA3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IFZ6b3IgbmVuYWxlemVuOiAlcyIKKworIzogbWVudS5jOjIxNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogViAlcyBt82R1IG5lbu0gbmFi7WRrYSBkZWZpbm924W5hIgorCisjOiBtZW51LmM6MjE4MQorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjogQ2VzdGEgbmFi7WRrb3UgbXVz7SB26XN0IGRvIHBvZG5hYu1ka3kiCisKKyM6IG1lbnUuYzoyMjAyCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBOYWLtZGthIG5lbmFsZXplbmEgLSB6a29udHJvbHVqdGUgbuF6dnkgbmFi7WRlayIKKworIzogbWVzc2FnZS5jOjQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAiQ2h5YmEgcPhpIHpwcmFjb3bhbu0gJXM6IgorCisjOiBtZXNzYWdlLmM6NDgzCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgIvjhZGVrICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTIzCittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIltw+O1sabkgZGxvdWj9IPhldOx6ZWNdIgorCisjOiBtZXNzYWdlLmM6NjY5Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIlNwcuF2Y2UgenBy4XY6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorCisjOiBtZXNzYWdlLmM6ODgxCittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIlD4ZXJ1uWVu7TogIgorCisjOiBtZXNzYWdlLmM6ODg0Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICJwb2tyYehvduFu7SBzdGlza2VtIEVOVEVSIgorCisjOiBtZXNzYWdlLmM6ODg2Cittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAiUHJvIHBva3Jh6G924W7tIHN0aXNrbux0ZSBFTlRFUiBuZWJvIHphZGVqdGUgcPjta2F6IgorCisjOiBtZXNzYWdlLmM6MTk0MAorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIFBva3Jh6G924W7tIC0tIgorCisjOiBtZXNzYWdlLmM6MTk0MworbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiD44WRlaywgTUVaRVJOzUsvYjogc3Ry4W5rYSwgZC91OiAwLjUgc3Ry4W5reSwgcToga29uZWMpIgorCisjOiBtZXNzYWdlLmM6MTk0NAorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IPjhZGVrLCBNRVpFUk7NSzogc3Ry4W5rYSwgZDogMC41IHN0cuFua3ksIHE6IGtvbmVjKSIKKworIzogbWVzc2FnZS5jOjI0MTkgbWVzc2FnZS5jOjI0MzQKK21zZ2lkICJRdWVzdGlvbiIKK21zZ3N0ciAiT3ThemthIgorCisjOiBtZXNzYWdlLmM6MjQyMQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJkFub1xuIgorIiZOZSIKKworIzogbWVzc2FnZS5jOjI0MzYKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImQW5vXG4iCisiJk5lXG4iCisiJlpydblpdCIKKworIzogbWVzc2FnZS5jOjI0NTQKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIlNhdmUgJkFsbFxuIgorIiZEaXNjYXJkIEFsbFxuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImQW5vXG4iCisiJk5lXG4iCisiJlVsb75pdCB2uWVcbiIKKyJaYWhvZGl0ICZ2uWVcbiIKKyImWnJ1uWl0IgorCisjOiBtZXNzYWdlLmM6MjQ5NAorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIkRpYWxvZyBwcm8gdWts4WThbu0gc291Ym9y+SIKKworIzogbWVzc2FnZS5jOjI0OTYKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICJEaWFsb2cgcHJvIG90ZXbtcuFu7SBzb3Vib3L5IgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI1NDcKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogTGl0dWppLCBhbGUga29uem9sb3bhIHZlcnplIG5lcG9kcG9ydWplIHByb2hs7b5l6CBzb3Vib3L5IgorCisjOiBtaXNjMS5jOjI0NDkKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiB3YzE6IG3sbu1tIHNvdWJvciBwb3V6ZV9wcm9f6HRlbu0iCisKKyM6IG1pc2MxLmM6MjY3OAorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICJwb+hldCBub3b9Y2gg+OFka/k6IDEiCisKKyM6IG1pc2MxLmM6MjY4MAorbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICJwb+hldCBzbWF6YW79Y2gg+OFka/k6IDEiCisKKyM6IG1pc2MxLmM6MjY4NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAicG/oZXQgbm92/WNoIPjhZGv5OiAlbGQiCisKKyM6IG1pc2MxLmM6MjY4NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgInBv6GV0IHNtYXphbv1jaCD44WRr+TogJWxkIgorCisjOiBtaXNjMS5jOjI2OTAKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiKFD4ZXJ1uWVubykiCisKKyM6IG1pc2MxLmM6NjI0NQorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IHphY2hvduF24W0gc291Ym9yeS4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjI1NQorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogdWtvbuhlblxuIgorCisjOiBtaXNjMi5jOjY0NyBtaXNjMi5jOjY2MworbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIkNIWUJBOiAiCisKKyM6IG1pc2MyLmM6NjY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW2JhanT5XSBjZWxrZW0gdXZvbG7sbm8tYWxva2924W5vICVsdS0lbHUsIHZ5db5pdG8gJWx1LCBtYXhpbeFsbu0gdnl1vml07SAiCisiJWx1XG4iCisKKyM6IG1pc2MyLmM6NjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlt2b2zhbu1dIGNlbGtlbSByZS9tYWxsb2MoKTogJWx1LCBjZWxrZW0gZnJlZSgpICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjcyNAorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6INjhZGVrIHNlIHN04XbhIHD47WxpuSBkbG91aP1tIgorCisjOiBtaXNjMi5jOjc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogVm5pdPhu7SBjaHliYTogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IE5lZG9zdGF0ZWsgcGFt7HRpISAocG90+GVidWppIGFsb2tvdmF0IGJhanT5OiAlbHUpIgorCisjOiBtaXNjMi5jOjI1MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiCittc2dzdHIgIlNwb3W5dO1tIHD47WtheiBcIiVzXCIgcG9tb2PtIHNoZWxsdSIKKworIzogbWlzYzIuYzoyNzA2IG1pc2MyLmM6NTE0OCBvcHRpb24uYzo0NTg0Cittc2dpZCAiTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiQ2h5Yu0gZHZvanRl6GthIgorCisjOiBtaXNjMi5jOjI3MDggbWlzYzIuYzoyNzM1Cittc2dpZCAiSWxsZWdhbCBtb2RlIgorbXNnc3RyICJuZXD47XB1c3Ru/SBt82QiCisKKyM6IG1pc2MyLmM6Mjc3NAorbXNnaWQgIklsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiQ2h5Ym79IHR2YXIgbXm5aSIKKworIzogbWlzYzIuYzoyODE0IG1pc2MyLmM6NTE2OAorbXNnaWQgImRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJv6GVr4XbhbmEg6O1zbGljZSIKKworIzogbWlzYzIuYzoyODE5Cittc2dpZCAiSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJuZXD47XB1c3Ru6SBwcm9jZW50byIKKworIzogbWlzYzIuYzozMTIzCittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiWmFkZWp0ZSC5aWZyb3ZhY+0ga2zt6DogIgorCisjOiBtaXNjMi5jOjMxMjQKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICJaYWRlanRlIGpluXTsIGplZG5vdSB0ZW50/b4ga2zt6DoiCisKKyM6IG1pc2MyLmM6MzEzNAorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICJLbO3oZSBzZSBuZXNob2R1au0iCisKKyM6IG1pc2MyLmM6MzY0OAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRTM0MzogSW52YWxpZCBwYXRoOiAnKipbbnVtYmVyXScgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIG9yIGJlICIKKyJmb2xsb3dlZCBieSAnJXMnLiIKK21zZ3N0ciAiIgorIkUzNDM6IENoeWJu4SBjZXN0YTogJyoqW+jtc2xvXSBtdXPtIGL9dCBide8gbmEga29uY2kgY2VzdHksIG5lYm8gbXVz7SBi/XRcbiIKKyJu4XNsZWRvduFubyclcy4gVml6IDpoZWxwIHBhdGguIgorCisjOiBtaXNjMi5jOjQ5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogQWRyZXPh+CBcIiVzXCIgbmVsemUgdiBjZHBhdGggbmFs6Xp0IgorCisjOiBtaXNjMi5jOjQ5MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiBTb3Vib3IgXCIlc1wiIG5lbHplIHYgcGF0aCBuYWzpenQiCisKKyM6IG1pc2MyLmM6NDkxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiCu4WRu/SBkYWy57SBhZHJlc+H4IFwiJXNcIiBuZWJ5bCB2IGNkcGF0aCBuYWxlemVuIgorCisjOiBtaXNjMi5jOjQ5MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiCu4WRu/SBkYWy57SBzb3Vib3IgXCIlc1wiIG5lYnlsIHYgY2VzdOwgbmFsZXplbiIKKworIzogbWlzYzIuYzo1MTYwCittc2dpZCAiSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIm5lcPjtcHVzdG7hIHNvdejhc3QiCisKKyM6IG5vcm1hbC5jOjI4MTMKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJWYXJvduFu7TogdGVybWlu4WwgbmVwb2Rwb3J1amUgenb9cmF68m924W7tIgorCisjOiBub3JtYWwuYzozMDA4Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogcG9kIGt1cnpvcmVtIG5lbu0gvuFkbv0g+GV07HplYyIKKworIzogbm9ybWFsLmM6MzAxMAorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiBwb2Qga3Vyem9yZW0gbmVu7SC+4WRu/SBpZGVudGlmaWvhdG9yIgorCisjOiBub3JtYWwuYzo0MTc1Cittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IHBvbW9j7SBha3R14Wxu7SAnZm9sZG1ldGhvZCcgbmVsemUgbWF6YXQgeuFoeWJ5IgorCisjOiBvcHMuYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICJwb+hldCD44WRr+SBwb3N1bnV0/WNoIGplZG5vdSBwb21vY+0gJXMgOiAxIgorCisjOiBvcHMuYzoyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIlBv6GV0IPjhZGv5IHBvc3VudXT9Y2ggcG9tb2PtICVzICVkLWty4XQgOiAxIgorCisjOiBvcHMuYzoyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICJQb+hldCD44WRr+TogJWxkIChwb3N1bnV0/WNoIGplZG5vdSBwb21vY+0gJXMpIgorCisjOiBvcHMuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIlBv6GV0IPjhZGv5OiAlbGQgKHBvc3VudXT9Y2ggcG9tb2PtICVzICVkLWty4XQpIgorCisjOiBvcHMuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgInBv6GV0IPjhZGv5IGsgb2RzYXplbu06ICVsZCIKKworIzogb3BzLmM6Njg4Cittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAicG/oZXQg+OFka/kgayBvZHNhemVu7TogMSIKKworIzogb3BzLmM6NjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgInBv6GV0IG9kc2F6ZW79Y2gg+OFka/k6ICVsZCIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE1MjgKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAibmVsemUga29w7XJvdmF0OyBw+GVzdG8gc21heuFubyIKKworIzogb3BzLmM6MjAxOAorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICJwb+hldCD44WRlayBzZSB6bexu7G5vdSB2ZWxpa29zdO0gcO1zbWVuOiAxIgorCisjOiBvcHMuYzoyMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICJwb+hldCD44WRlayBzZSB6bexu7G5vdSB2ZWxpa29zdO0gcO1zbWVuOiAlbGQiCisKKyM6IG9wcy5jOjIzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgInBv6GV0IHV2b2zyb3Zhbv1jaCD44WRr+TogJWxkIgorCisjOiBvcHMuYzoyNjU4Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAicG/oZXQgemtvcO1yb3Zhbv1jaCD44WRr+TogMSIKKworIzogb3BzLmM6MjY2MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICJwb+hldCB6a29w7XJvdmFu/WNoIPjhZGv5OiAlbGQiCisKKyM6IG9wcy5jOjI5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogUmVnaXN0ciAlcyBqZSBwcuF6ZG79IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM0NTQKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUmVnaXN0cnkgLS0tIgorCisjOiBvcHMuYzo0NTY1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJuZXD47XB1c3Ru/SBu4XpldiByZWdpc3RydSIKKworIzogb3BzLmM6NDY0NQorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgUmVnaXN0cnk6XG4iCisKKyM6IG9wcy5jOjQ2NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICIlZCBuZW7tIHpu4W39bSB0eXBlbSByZWdpc3RydSIKKworIzogb3BzLmM6NTA1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6ICclcycgbmVu7SBw+O1wdXN0bukgam3pbm8gcmVnaXN0cnUiCisKKyM6IG9wcy5jOjUzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAi+OFka/k6ICVsZDsiCisKKyM6IG9wcy5jOjU0MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VsZWN0ZWQgJXMlbGQgb2YgJWxkIExpbmVzOyAlbGQgb2YgJWxkIFdvcmRzOyAlbGQgb2YgJWxkIEJ5dGVzIgorbXNnc3RyICJWeWJy4W5vICVzJWxkIHogJWxkIPjhZGv5OyAlbGQgeiAlbGQgc2xvdjsgJWxkIHogJWxkIEJ5dPkiCisKKyM6IG9wcy5jOjU0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICJTbG91cGVjICVzIHogJXM7INjhZGVrICVsZCB6ICVsZDsgU2xvdm8gJWxkIHogJWxkOyBCeXRlICVsZCB6ICVsZCIKKworIzogb3BzLmM6NTQyNworIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgcHJvIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE5ODkKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIkTsa3VqaSB6YSBwb3W+aXTtIFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJWb2xiYSBuZW7tIHBvZHBvcm924W5hIgorCisjOiBvcHRpb24uYzozMjAwCittc2dpZCAiTm90IGFsbG93ZWQgaW4gYSBtb2RlbGluZSIKK21zZ3N0ciAiTmVu7SB2IG1vZGVsaW5lIHBvdm9sZW5vIgorCisjOiBvcHRpb24uYzozMjU2Cittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdE5hcG9zbGVkeSBuYXN0YXZlbmEgeiAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiUG8gPSBqZSB2eb5hZG924W5vIOjtc2xvIgorCisjOiBvcHRpb24uYzozNzAyIG9wdGlvbi5jOjQzMDkKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiTmVuYWxlemVuIHYgdGVybWNhcHUiCisKKyM6IG9wdGlvbi5jOjM3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiTmVw+O1wdXN0bv0gem5hayA8JXM+IgorCisjOiBvcHRpb24uYzo0Mjk0IG9wdGlvbi5jOjU0OTcKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJUb3RvIHpkZSBuZW7tIHBvdm9sZW5vIgorCisjOiBvcHRpb24uYzo0MzAxCittc2dpZCAiQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJ2b2xiYSAndGVybScgbmVt+b5lIGL9dCBwcuF6ZG7hIgorCisjOiBvcHRpb24uYzo0MzA0Cittc2dpZCAiQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiViBHVUkgbmVsemUgbexuaXQgdGVybSIKKworIzogb3B0aW9uLmM6NDMwNgorbXNnaWQgIlVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJQb3W+aWp0ZSBcImd1aVwiIHBybyBzcHW5dOxu7SBHVUkiCisKKyM6IG9wdGlvbi5jOjQzMjcKK21zZ2lkICInYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICJ2b2xieSAnYmFja3VwZXh0JyBhICdwYXRjaG1vZGUnIG1hau0gc3Rlam5vdSBob2Rub3R1IgorCisjOiBvcHRpb24uYzo0NTg2Cittc2dpZCAiWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICL4ZXTsemVjIG8gbnVsb3bpIGTpbGNlIgorCisjOiBvcHRpb24uYzo0NjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIlBvIDwlcz4gY2h5Yu0g6O1zbG8iCisKKyM6IG9wdGlvbi5jOjQ2NjgKK21zZ2lkICJNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJDaHli7SDo4XJrYSIKKworIzogb3B0aW9uLmM6NDY3NQorbXNnaWQgIk11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkplIG51dG7pIHphZGF0IGhvZG5vdHUgJyIKKworIzogb3B0aW9uLmM6NDcxNQorbXNnaWQgImNvbnRhaW5zIHVucHJpbnRhYmxlIGNoYXJhY3RlciIKK21zZ3N0ciAib2JzYWh1amUgbmV0aXNrbnV0ZWxu6SB6bmFreSIKKworIzogb3B0aW9uLmM6NDcyOAorbXNnaWQgIkludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiQ2h5Ym7hIHDtc21hIgorCisjOiBvcHRpb24uYzo0NzM0Cittc2dpZCAiY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIm5lbHplIHZ5YnJhdCBzYWR1IHDtc2VtIgorCisjOiBvcHRpb24uYzo0NzM2Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJjaHlibuEgc2FkYSBw7XNlbSIKKworIzogb3B0aW9uLmM6NDc0MworbXNnaWQgImNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIm5lbHplIHZ5YnJhdCC5aXJva/0gZm9udCIKKworIzogb3B0aW9uLmM6NDc0NQorbXNnaWQgIkludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJDaHlibukguWlyb2vpIHDtc21vIgorCisjOiBvcHRpb24uYzo1MDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIk5lcPjtcHVzdG79IHpuYWsgcG8gPCVjPiIKKworIzogb3B0aW9uLmM6NTA5NworbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJqZSBudXRu4SDo4XJrYSIKKworIzogb3B0aW9uLmM6NTEwNgorIywgYy1mb3JtYXQKK21zZ2lkICInY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICJ2b2xiYSBgY29tbWVudHN0cmluZ2AgbXVz7SBi/XQgYnXvIHBy4XpkbuEgbmVibyBuYXN0YXZlbuEgbmEgJXMiCisKKyM6IG9wdGlvbi5jOjUxNTMKK21zZ2lkICJObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJCZXogcG9kcG9yeSBteblpIgorCisjOiBvcHRpb24uYzo1Mzk5Cittc2dpZCAiVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAibmV1emF2+GVu4SBzZWt2ZW5jZSB2/XJhevkiCisKKyM6IG9wdGlvbi5jOjU0MDMKK21zZ2lkICJ0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAicPjtbGm5IG1ub2hvIHBvbG++ZWsiCisKKyM6IG9wdGlvbi5jOjU0MDUKK21zZ2lkICJ1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAibmV2eXbhvmVu6SBza3VwaW55IgorCisjOiBvcHRpb24uYzo1NjIwCittc2dpZCAiQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiT2tubyBu4WhsZWR1IGppviBleGlzdHVqZSIKKworIzogb3B0aW9uLmM6NTg4MSBvcHRpb24uYzo1OTEwCittc2dpZCAiJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiIgorImhvZG5vdGEgdm9sYnkgJ3dpbmhlaWdodCcgbmVzbe0gYv10IG1lbrntIG5lviBob2Rub3RhIHZvbGJ5ICd3aW5taW5oZWlnaHQnIgorCisjOiBvcHRpb24uYzo1OTI2IG9wdGlvbi5jOjU5NDUKK21zZ2lkICInd2lud2lkdGgnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbndpZHRoJyIKK21zZ3N0ciAiIgorImhvZG5vdGEgdm9sYnkgJ3dpbndpZHRoJyBuZXNt7SBi/XQgbWVuue0gbmW+IGhvZG5vdGEgdm9sYnkgJ3dpbm1pbndpZHRoJyIKKworIzogb3B0aW9uLmM6NjA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICJtaW5pbeFsbu0gcG90+GVibv0gcG/oZXQg+OFka/k6ICVkIgorCisjOiBvcHRpb24uYzo2MDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAibWluaW3hbG7tIHBvdPhlYm79IHBv6GV0IHNsb3VwY/k6ICVkIgorCisjOiBvcHRpb24uYzo2MzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogTmV6buFt4SB2b2xiYTogJXMiCisKKyM6IG9wdGlvbi5jOjY1MDAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBL82R5IHRlcm1pbuFsdSAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDIKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBOYXN0YXZlbu0gZ2xvYuFsbu1jaCB2b2xlYiAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE5hc3RhdmVu7SBsb2vhbG7tY2ggdm9sZWIgLS0tIgorCisjOiBvcHRpb24uYzo2NTA2Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBWb2xieSAtLS0iCisKKyM6IG9wdGlvbi5jOjcxOTYKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgQ0hZQkEiCisKKyM6IG9wdGlvbi5jOjgxMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogcHJvICVzIGNoeWLtIHZ5aG92dWrtY+0gem5hayIKKworIzogb3B0aW9uLmM6ODE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiBuYWRieXRl6G7pIHpuYWt5IHBvIHN0+GVkbu1rdTogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjczCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICJuZWx6ZSBvdGV2+O10ICIKKworIzogb3NfYW1pZ2EuYzozMDcKK21zZ2lkICJWSU06IENhbid0IG9wZW4gd2luZG93IVxuIgorbXNnc3RyICJWSU06IE5lbHplIG90ZXb47XQgbm926SBva25vIVxuIgorCisjOiBvc19hbWlnYS5jOjMyOQorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIlZ5vmFkdWplIEFtaWdhZG9zIHZlcnplIDIuMDQgbmVibyB2ebm57VxuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIlZ5vmFkdWplICVzIHZlcnplICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQwNworbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTmVsemUgb3RldvjtdCBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDE4Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIiBOZWx6ZSB2eXR2b/hpdCAiCisKKyM6IG9zX2FtaWdhLmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIGJ1ZGUgdWtvbuhlbiAlZFxuIgorCisjOiBvc19hbWlnYS5jOjkyOAorbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgIk5lbHplIHpt7G5pdCBt82Qga29uem9sZSA/IVxuIgorCisjOiBvc19hbWlnYS5jOjkzOCBvc19tYWMuYzoxMTY4IG9zX21zd2luLmM6NjE5IG9zX3Jpc2Nvcy5jOjcyOCBvc191bml4LmM6MjcyNgorbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogTmFzdGF2b3bhbu0gcmW+aW11IG9icmF6b3ZreSBuZW7tIHBvZHBvcm924W5vIgorCisjOiBvc19hbWlnYS5jOjk5NAorbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF9zaGVsbHNpemU6IG5lbmkga29uem9sZT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNDIKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogTmVsemUgc3B1c3RpdCBzaGVsbCBzIHBhcmFtZXRyZW0gLWYiCisKKyM6IG9zX2FtaWdhLmM6MTE4MyBvc19hbWlnYS5jOjEyNzMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIk5lbHplIHNwdXN0aXQgIgorCisjOiBvc19hbWlnYS5jOjExODYgb3NfYW1pZ2EuYzoxMjgzCittc2dpZCAic2hlbGwgIgorbXNnc3RyICJzaGVsbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNiBvc19hbWlnYS5jOjEzMDgKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIG7hdnJhdG924SBob2Rub3RhIHNoZWxsdVxuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIGplIHD47WxpuSBtYWzhLiIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gQ0hZQkEiCisKKyM6IG9zX21zd2luLmM6NTAzCittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLihrcuFjZW5vKSIKKworIzogb3NfbXN3aW4uYzo1OTQKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIG5lbu0gODAsIG5lbHplIHNwdXN0aXQgZXh0ZXJu7SBw+O1rYXoiCisKKyM6IG9zX21zd2luLmM6NzA2IG9zX3VuaXguYzo0OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBWb2zhbu0ga25paG92bu0gZnVua2NlIFwiJXMoKVwiIHNlbGhhbG8iCisKKyM6IG9zX21zd2luLmM6MTM0MAorbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogTmVsemUgenZvbGl0IHRpc2vhcm51IgorCisjOiBvc19tc3dpbi5jOjEzODgKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgImRvICVzIHYgJXMiCisKKyM6IG9zX21zd2luLmM6MTQ0OSBvc19tc3dpbi5jOjE0NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBDaHliYSB0aXNrdTogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ2MAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIk5lem7hbf0iCisKKyM6IG9zX21zd2luLmM6MTQ4NworIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJWeXRpuXTsbm8gJyVzJyIKKworIzogb3NfbXN3aW4uYzoyNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBOZXD47XB1c3Ru4SBqbelubyB6bmFrb3bpIHNhZHkgXCIlc1wiIHZlIGZvbnR1IFwiJXNcIiIKKworIzogb3NfbXN3aW4uYzoyNTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6IE5lcPjtcHVzdG79IHpuYWsgJyVjJyB2ZSBmb250dSBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyMjcKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiBOZXBsYXRu/SAnb3NmaWxldHlwZScgLSBwb3W+aXQgVGV4dCIKKworIzogb3NfdW5peC5jOjgwMAorbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWSW06IGR2b2ppdP0gc2lnbuFsLCBrb27o7W1cbiIKKworIzogb3NfdW5peC5jOjgwNgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogWmFjaHljZW4gc21ydGVsbv0gc2lnbuFsICVzXG4iCisKKyM6IG9zX3VuaXguYzo4MDkKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogWmFjaHljZW4gc21ydGVsbv0gc2lnbuFsXG4iCisKKyM6IG9zX3VuaXguYzoxMDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJEb2JhIG90ZXbtcuFu7SBYIGRpc3BsZWplICh2IG1zKTogJWxkIgorCisjOiBvc191bml4LmM6MTA5MAorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IGNoeWJhIFgxMVxuIgorCisjOiBvc191bml4LmM6MTE1NworbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIlRlc3QgWCBkaXNwbGVqZSBzZSBuZXpkYfhpbCIKKworIzogb3NfdW5peC5jOjEzMDEKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICJWeXByuWVsIOhhcyBw+Gkg6GVr4W7tIG5hIG90ZXb4ZW7tIFggZGlzcGxlamUiCisKKyM6IG9zX3VuaXguYzoyODk5IG9zX3VuaXguYzozNDgzCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIm5lbHplIHNwdXN0aXQgc2hlbGwgIgorCisjOiBvc191bml4LmM6Mjk0NAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisiTmVsemUgc3B1c3RpdCBzaCBzaGVsbFxuIgorCisjOiBvc191bml4LmM6Mjk0OCBvc191bml4LmM6MzQ4OQorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyIgbuF2cmF0b3bhIGhvZG5vdGEgc2hlbGx1ICIKKworIzogb3NfdW5peC5jOjMwODIKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiTmVsemUgdnl0dm/4aXQgcm91cnlcbiIKKworIzogb3NfdW5peC5jOjMwOTcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZvbOFu7SBmb3JrIHNlbGhhbG9cbiIKKworIzogb3NfdW5peC5jOjM0OTYKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJQ+O1rYXogdWtvbuhlblxuIgorCisjOiBvc191bml4LmM6NDk5MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIk90ZXb4ZW7tIFggZGlzcGxlamUgc2UgbmV6ZGH4aWxvIgorCisjOiBvc192bXNfbW1zLmM6NTkKK21zZ2lkICJBdCBsaW5lIgorbXNnc3RyICJOYSD44WRrdSIKKworIzogb3NfdzMyZXhlLmM6MTY5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAiTmVsemUgbmHo7XN0IHZpbTMyLmRsbCEiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIkNoeWJhIFZJTXUiCisKKyM6IG9zX3czMmV4ZS5jOjE3OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIk5lbHplIG5hc3Rhdml0IHVrYXphdGVsZSBmdW5rY+0gbmEgRExMIgorCisjOiBvc193aW4xNi5jOjU3OCBvc193aW4zMi5jOjMwMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgIm7hdnJhdG924SBob2Rub3RhIHNoZWxsdSAlZCIKKworIzogb3Nfd2luMzIuYzoyNDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogWmFjaHljZW4gJXMgc2lnbuFsXG4iCisKKyM6IG9zX3dpbjMyLmM6MjQ5MQorbXNnaWQgImNsb3NlIgorbXNnc3RyICJ6YXb47XQiCisKKyM6IG9zX3dpbjMyLmM6MjQ5MworbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAibG9nb2ZmIgorCisjOiBvc193aW4zMi5jOjI0OTQKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAic2h1dGRvd24iCisKKyM6IG9zX3dpbjMyLmM6Mjk3NQorbXNnaWQgIkUzNzE6IENvbW1hbmQgbm90IGZvdW5kIgorbXNnc3RyICJFMzcxOiBQ+O1rYXogbmVu7SBrIGRpc3BvemljaSIKKworIzogb3Nfd2luMzIuYzoyOTg4Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSBzZSBuZXZ5c2t5dHVqZSB2ZSBWYbntICRQQVRILlxuIgorIkV4dGVybu0gcPjta2F6eSBuZWJ1ZG91ICIKKworIzogb3Nfd2luMzIuYzoyOTkxCittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZhcm924W7tIgorCisjOiBxdWlja2ZpeC5jOjI4MQorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogUPjtbGm5IG1ub2hvICUlJWMgdmUgZm9ybeF0b3ZhY+1tIPhldOx6Y2kiCisKKyM6IHF1aWNrZml4LmM6Mjk0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6IE5lb+hla+F2YW79IHb9c2t5dCAlJSVjIHZlIGZvcm3hdG92YWPtbSD4ZXTsemNpIgorCisjOiBxdWlja2ZpeC5jOjM0OAorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiBWZSBmb3Jt4XRvdmFj7W0g+GV07HpjaSBjaHli7SBdIgorCisjOiBxdWlja2ZpeC5jOjM2MgorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogJSUlYyBOZXBvZHBvcm92YW7hIGZvcm3hdG924SBzcGVjaWZpa2FjZSB2ZSBmb3Jt4XRvdmFj7W0g+GV07HpjaSIKKworIzogcXVpY2tmaXguYzozODAKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6IE5lcPjtcHVzdG7pICUlJWMgdiBwcmVmaXh1IGZvcm3hdG92YWPtaG8g+GV07HpjZSIKKworIzogcXVpY2tmaXguYzozODgKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogTmVw+O1wdXN0bukgJSUlYyB2ZSBmb3Jt4XRvdmFj7W0g+GV07HpjaSIKKworIzogcXVpY2tmaXguYzo0MTQKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgbmVvYnNhaHVqZSC+4WRu/SB2em9yZWsiCisKKyM6IHF1aWNrZml4LmM6NTIwCittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTogQ2h5Yuxq7WPtIG5lYm8gcHLhemRu/SBu4XpldiBhZHJlc+H4ZSIKKworIzogcXVpY2tmaXguYzo5MzEKK21zZ2lkICJObyBtb3JlIGl0ZW1zIgorbXNnc3RyICKu4WRu6SBkYWy57SBwb2xvvmt5IgorCisjOiBxdWlja2ZpeC5jOjExNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkLyVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMTU0Cittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKPjhZGVrIHNtYXrhbikiCisKKyM6IHF1aWNrZml4LmM6MTM2MAorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDogS29uZWMgcXVpY2tmaXggc2V6bmFtdSIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBaYejhdGVrIHF1aWNrZml4IHNlem5hbXUiCisKKyM6IHF1aWNrZml4LmM6MTM4MQorIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgInNlem5hbSBjaHliICVkIHogJWQ7IHBv6GV0IGNoeWI6ICVkIgorCisjOiBxdWlja2ZpeC5jOjE4NDIKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiBOZWx6ZSB1bG++aXQsIGplIG5hc3RhdmVuYSB2b2xiYSAnYnVmdHlwZSciCisKKyM6IHJlZ2V4cC5jOjgwMQorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFZ6b3IgamUgcPjtbGm5IGRsb3Vo/SIKKworIzogcmVnZXhwLmM6MTMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogJXMqIgorCisjOiByZWdleHAuYzoxMzE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogJXMlYyIKKworIzogcmVnZXhwLmM6MTQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6ICVzJWMgbmljIG5lbu0iCisKKyM6IHJlZ2V4cC5jOjI0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkNoeWJhIHN5bnRheGUgdiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IFphY2h5Y2VubyBw+GV0Zehlbu0geuFzb2Ju7Wt1OiBw+O1sabkgc2xvvml0/SByZWd1bOFybu0gdv1yYXo/IgorCisjOiByZWdleHAuYzoyODUxCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiB2em9yZWsgenD5c29iaWwgcPhldGXoZW7tIHrhc29ibu1rdSIKKworIzogcmVnZXhwLmM6MzA4NworbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlZu7Gq57SBwb2T4YXplbukgc2hvZHk6XG4iCisKKyM6IHNjcmVlbi5jOjIwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICJwb+hldCD44WRr+SB2IHrhaHlidTogJTNsZCIKKworIzogc2NyZWVuLmM6NzQyNgorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiIFZSRVBMQUNFIgorCisjOiBzY3JlZW4uYzo3NDMwCittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiBSRVBMQUNFIgorCisjOiBzY3JlZW4uYzo3NDM1Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiBSRVZFUlNFIgorCisjOiBzY3JlZW4uYzo3NDM3Cittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiIElOU0VSVCIKKworIzogc2NyZWVuLmM6NzQ0MAorbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiIChpbnNlcnQpIgorCisjOiBzY3JlZW4uYzo3NDQyCittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiIChyZXBsYWNlKSIKKworIzogc2NyZWVuLmM6NzQ0NAorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKHZyZXBsYWNlKSIKKworIzogc2NyZWVuLmM6NzQ0NworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBoZWJyZWpza/0iCisKKyM6IHNjcmVlbi5jOjc0NTUKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKGxhbmcpIgorCisjOiBzY3JlZW4uYzo3NDU4Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAocGFzdGUpIgorCisjOiBzY3JlZW4uYzo3NDY0Cittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIFNIT0RZIgorCisjOiBzY3JlZW4uYzo3NDY2Cittc2dpZCAiIFZJU1VBTCIKK21zZ3N0ciAiIFZJWlXBTE7NIgorCisjOiBzY3JlZW4uYzo3NDY4Cittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIgQkxPSyIKKworIzogc2NyZWVuLmM6NzQ3MAorbXNnaWQgIiBMSU5FIgorbXNnc3RyICIg2MFERUsiCisKKyM6IHNjcmVlbi5jOjc0ODMgc2NyZWVuLmM6NzUzNworbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAibmFocuF24W0iCisKKyM6IHNlYXJjaC5jOjM2Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJobGVk4W7tIGRvc+FobG8gemHo4XRrdSwgcG9rcmHob3bhbu0gb2Qga29uY2UiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICJobGVk4W7tIGRvc+FobG8ga29uY2UsIHBva3Jh6G924W7tIG9kIHph6OF0a3UiCisKKyM6IHNlYXJjaC5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiBOZXD47XB1c3Ru/SBobGVkYW79IPhldOx6ZWM6ICVzIgorCisjOiBzZWFyY2guYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBobGVkYW79IGRvc+FobG8gemHo4XRrdSBiZXogbmFsZXplbu0gJXMiCisKKyM6IHNlYXJjaC5jOjc0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IGhsZWRhbv0gZG9z4WhsbyBrb25jZSBiZXogbmFsZXplbu0gJXMiCisKKyM6IHNlYXJjaC5jOjExMDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IFBvICc7JyBv6GVr4XbhbSAnPycgbmVibyAnLyciCisKKyM6IHNlYXJjaC5jOjM0NzYKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICh26GV0buwgamm+IHZ5cHNhbv1jaCBzaG9kKSIKKworIy4gY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjOiBzZWFyY2guYzozNDk2Cittc2dpZCAiLS0tIEluY2x1ZGVkIGZpbGVzICIKK21zZ3N0ciAiLS0tIFZsb75lbukgc291Ym9yeSIKKworIzogc2VhcmNoLmM6MzQ5OAorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIiBuZW5hbGV6ZW55IgorCisjOiBzZWFyY2guYzozNDk5Cittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAidiBjZXN07CAtLS1cbiIKKworIzogc2VhcmNoLmM6MzUzOAorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAoSmm+IHZ5cHPhbm8pIgorCisjOiBzZWFyY2guYzozNTQwCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiBORU5BTEVaRU5ZIgorCisjOiBzZWFyY2guYzozNTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICJQcm9obGVk4XbhbSB2bG++ZW7pIHNvdWJvcnk6ICVzIgorCisjOiBzZWFyY2guYzozODEwCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBTaG9kYSBqZSBuYSBha3R14Wxu7W0g+OFka3UiCisKKyM6IHNlYXJjaC5jOjM5NTAKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiVrllY2hueSB2bG++ZW7pIHNvdWJvcnkgYnlseSBuYWxlemVueSIKKworIzogc2VhcmNoLmM6Mzk1MgorbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICKu4WRu6SB2bG++ZW7pIHNvdWJvcnkiCisKKyM6IHNlYXJjaC5jOjM5NjgKK21zZ2lkICJFMzg4OiBDb3VsZG4ndCBmaW5kIGRlZmluaXRpb24iCittc2dzdHIgIkUzODg6IE5lbHplIG5hbOl6dCBkZWZpbmljaSIKKworIzogc2VhcmNoLmM6Mzk3MAorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTmVsemUgbmFs6Xp0IHZ6b3JlayIKKworIzogc3ludGF4LmM6Mjk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDogbmVw+O1wdXN0bv0gYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzozMTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiBTeW50YWt0aWNr4SBzZXN0YXZhICVzIG5lZXhpc3R1amUiCisKKyM6IHN5bnRheC5jOjMzMzIKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIlBybyB0ZW50byBidWZmZXIgbmVqc291IGRlZmlub3bhbnkgvuFkbukgcPhlZG3sdHkgc3ludGF4ZSIKKworIzogc3ludGF4LmM6MzM0MAorbXNnaWQgInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIKK21zZ3N0ciAic3luY2hyb25penVqaSBrb21lbnTh+GUgdiBDIHN0eWx1IgorCisjOiBzeW50YXguYzozMzQ4Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAivuFkbuEgc3luY2hyb25pemFjZSIKKworIzogc3ludGF4LmM6MzM1MQorbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAic3luY2hyb25pemFjZSB6YejtbuEgIgorCisjOiBzeW50YXguYzozMzUzIHN5bnRheC5jOjM0MjIKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIg+OFka/kgcPhlZCB6YejhdGtlbSIKKworIzogc3ludGF4LmM6MzM1NworbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFBvbG++a3kgc3luY2hyb25pemFjZSBzeW50YXhlIC0tLSIKKworIzogc3ludGF4LmM6MzM2MAorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisic3luY2hyb25penVqaSBw+GVkbex0eSIKKworIzogc3ludGF4LmM6MzM2NQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBQ+GVkbex0eSBzeW50YXhlIC0tLSIKKworIzogc3ludGF4LmM6MzM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogU3ludGFrdGlja+Egc2VzdGF2YSAlcyBuZWV4aXN0dWplIgorCisjOiBzeW50YXguYzozNDEyCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmlt4Wxu7SAiCisKKyM6IHN5bnRheC5jOjM0MTkKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibWF4aW3hbG7tICIKKworIzogc3ludGF4LmM6NDA0NworbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogZ3JvdXBbdF1oZXJlIG5lc23tIGL9dCBuYSB0b210byBt7XN07CIKKworIzogc3ludGF4LmM6NDA3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IFBybyAlcyBjaHli7SBwb2xvvmthIHJlZ2lvbnUiCisKKyM6IHN5bnRheC5jOjQwOTkKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogb2JzYWh1amUgYXJndW1lbnR5LCBrdGVy6SB6ZGUgbmVqc291IHBvdm9sZW55IgorCisjOiBzeW50YXguYzo0MTEwCittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IG9ic2FodWplIGFyZ3VtZW50eSwga3RlcukgemRlIG5lanNvdSBwb3ZvbGVueSIKKworIzogc3ludGF4LmM6NDE4OAorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiBWeb5hZG924W4gbuF6ZXYgc291Ym9ydSIKKworIzogc3ludGF4LmM6NDUyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IENoeWLtICc9JzogJXMiCisKKyM6IHN5bnRheC5jOjQ2ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5OTogTm90IGVub3VnaCBhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCittc2dzdHIgIkUzOTk6IFD47WxpuSBt4WxvIGFyZ3VtZW50+Togb2JsYXN0IHN5bnRheGUgJXMiCisKKyM6IHN5bnRheC5jOjUwMTEKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogTmVieWxhIHphZOFuYSC+4WRu4SBzZXN0YXZhIgorCisjOiBzeW50YXguYzo1MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IE9kZOxsb3Zh6CB2em9ya3UgJXMgbmVuYWxlemVuIgorCisjOiBzeW50YXguYzo1MTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6IENoeWJhIHphIHZ6b3JrZW0gJXMiCisKKyM6IHN5bnRheC5jOjUyMDUKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFNDAzOiBzeW5jaHJvbml6YWNlIHN5bnRheGU6IHZ6b3JlayBwb2tyYehvduFu7SD44WRr+SB6YWThbiBkdmFrcuF0IgorCisjOiBzeW50YXguYzo1MjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogbmVw+O1wdXN0bv0gYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1MzEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IENoeWLtIHJvdm7tdGtvOiAlcyIKKworIzogc3ludGF4LmM6NTMxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IFBy4Xpkbv0gYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1MzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIHpkZSBuZW7tIHBvdm9sZW5vIgorCisjOiBzeW50YXguYzo1MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgbXVz7SBi/XQgcHJ2bu0gdiAnY29udGFpbnMnIHNlem5hbXUiCisKKyM6IHN5bnRheC5jOjU0MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogTmV6buFt4SBu4XpldiBza3VwaW55OiAlcyIKKworIzogc3ludGF4LmM6NTY0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IGNoeWJu/SBwb2T4YXplbv0gcPjta2F6IDpzeW50YXggOiAlcyAiCisKKyM6IHN5bnRheC5jOjYwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IHNrdXBpbmEgenb9cmF6buxu7SAlcyBuZWJ5bGEgbmFsZXplbmEiCisKKyM6IHN5bnRheC5jOjYwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IFD47WxpuSBt4WxvIGFyZ3VtZW50+TogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IFD47WxpuSBtbm9obyBhcmd1bWVudPk6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNzUKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IHNrdXBpbmEgamUgbmFzdGF2ZW5hLCBvZGtheiBuYSB6dv1yYXryb3ZhY+0gc2t1cGludSBpZ25vcm924W4iCisKKyM6IHN5bnRheC5jOjYyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogbmXoZWthbukgcm92bu10a28gOiAlcyIKKworIzogc3ludGF4LmM6NjI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiBjaHlibukgcm92bu10a286ICVzIgorCisjOiBzeW50YXguYzo2MjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiBjaHli7SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjYyOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IG5lcPjtcHVzdG7hIGhvZG5vdGE6ICVzIgorCisjOiBzeW50YXguYzo2NDE4Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogYmFydmEgcG9w+GVk7SBuZW7tIHpu4W3hIgorCisjOiBzeW50YXguYzo2NDI5Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogYmFydmEgcG9w+GVk7SBuZW7tIHpu4W3hIgorCisjOiBzeW50YXguYzo2NDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogbuF6ZXYg6Gkg6O1zbG8gYmFydnkgJXMgbmVieWxvIHJvenBvem7hbm8iCisKKyM6IHN5bnRheC5jOjY2ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMjogdGVybWluYWwgY29kZSB0b28gbG9uZzogJXMiCittc2dzdHIgIkU0MjI6IHRlcm1pbuFsb3b9IGvzZCAlcyBqZSBw+O1sabkgZGxvdWj9IgorCisjOiBzeW50YXguYzo2NzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiBuZXD47XB1c3Ru/SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjcyNjQKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICIiCisiRTQyNDogSmUgcG91vu124W5vIHD47WxpuSB2ZWxr6SBtbm++c3R27SBvZGxpuW79Y2ggenb9cmF68m92YWPtY2ggYXRyaWJ1dPkiCisKKyM6IHRhZy5jOjkwCittc2dpZCAiYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAia29uZWMgc2V6bmFtdSB0YWf5IgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgInph6OF0ZWsgc2V6bmFtdSB0YWf5IgorCisjOiB0YWcuYzozOTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogUPhlZCBwcnZu7SB2eWhvdnVq7WPtIHRhZyBuZWx6ZSBw+GVza2/oaXQiCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogdGFnICVzIG5lbmFsZXplbiIKKworIzogdGFnLmM6NTQ1Cittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSB0eXAgdGFnIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgInNvdWJvclxuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzA2Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICJaYWRlanRlIOjtc2xvICg8Q1I+IHBybyB1a29u6GVu7Sk6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiBWeWhvdnVqZSBwb3V6ZSBqZWRlbiB0YWciCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IFphIHBvc2xlZG7tIHZ5aG92dWrtY+0gdGFnIG5lbHplIHD4ZXNrb+hpdCIKKworIzogdGFnLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJTb3Vib3IgXCIlc1wiIG5lZXhpc3R1amUiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4MAorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAidGFnICVkIHogY2Vsa2926WhvIHBv6HR1ICVkJXMiCisKKyM6IHRhZy5jOjc4MworbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgbmVibyB27WNlIgorCisjOiB0YWcuYzo3ODUKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICBQb3W+7XbhbSB0YWcgcyBw7XNtZW55IGppbukgdmVsaWtvc3RpISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBcIiVzXCIgbmVleGlzdHVqZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIEPNTCB0YWcgICAgICAgIFNUQVJUIPjhZGVrICB2IHNvdWJvcnUvdGV4dHUiCisKKyM6IHRhZy5jOjExNDQKK21zZ2lkICJMaW5lYXIgdGFnIHNlYXJjaCIKK21zZ3N0ciAiTGluZeFybu0gaGxlZOFu7SB0YWd1IgorCisjOiB0YWcuYzoxMTQ2Cittc2dpZCAiQmluYXJ5IHRhZyBzZWFyY2giCittc2dzdHIgIkJpbuFybu0gaGxlZOFu7SB0YWd1IgorCisjOiB0YWcuYzoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIlByb2hsZWThduFtIHNvdWJvciB0YWf5ICVzIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBTb3Vib3IgdGFn+SAlcyBieWwgb/hleuFuXG4iCisKKyM6IHRhZy5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IENoeWJhIGZvcm3hdHUgdiBzb3Vib3J1IHRhZ/kgXCIlc1wiIgorCisjOiB0YWcuYzoxODUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkJlZm9yZSBieXRlICVsZCIKK21zZ3N0ciAiUPhlZCBiYWp0ZW0gJWxkIgorCisjOiB0YWcuYzoxODcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogT2JzYWggc291Ym9yIHRhZ/kgJXMgbmVu7SBzZfhhemVuIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MTkxMQorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogruFkbv0gc291Ym9yIHRhZ/kiCisKKyM6IHRhZy5jOjI1ODMKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBOZWx6ZSBuYWrtdCB2em9yZWsgdGFn+SIKKworIzogdGFnLmM6MjU5NAorbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTogVGFnIG5lbHplIG5hbOl6dCwgcG91emUgaOFk4W0hIgorCisjOiB0ZXJtLmM6MTcyMworbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyBuZW7tIHpu4W0uIERvc3R1cG7pIHZlc3Rhduxu6SB0ZXJtaW7hbHk6IgorCisjOiB0ZXJtLmM6MTc0NworbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAiaW1wbGljaXRu7SB0ZXJtaW7hbCAnIgorCisjOiB0ZXJtLmM6MjEwMAorbXNnaWQgIkNhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiTmVsemUgb3RldvjtdCB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6MjEwMworbXNnaWQgIlRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiVGVybWluZm8gbmVvYnNhaHVqZSBwb2xvvmt1IHBybyB0ZW50byB0ZXJtaW7hbCIKKworIzogdGVybS5jOjIxMDUKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiVGVybWNhcCBuZW9ic2FodWplIHBvbG++a3UgcHJvIHRlbnRvIHRlcm1pbuFsIgorCisjOiB0ZXJtLmM6MjI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogVGVybWNhcCBuZW9ic2FodWplIHBvbG++a3UgcHJvIFwiJXNcIiIKKworIzogdGVybS5jOjI3MzgKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzogVGVybWlu4WwgbXVz7SBt7XQgc2Nob3Bub3N0IFwiY21cIiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDg3OAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS2zhdmVzeSB0ZXJtaW7hbHUgLS0tIgorCisjOiB1aS5jOjI0MAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgInNwdbl07G4gbm92/SBzaGVsbFxuIgorCisjOiB1aS5jOjE3MDUKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiBjaHliYSBw+Gkg6HRlbu0gdnN0dXB1LCBrb27o7W0uLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozNTEKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIm9kc3RyYW7sbu0gem3sbiBuZW7tIG1vvm7pOyBjaGNldGUgcPhlc3RvIHBva3Jh6G92YXQiCisKKyM6IHVuZG8uYzo1MDYKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiDo7XNsYSD44WRr+SBqc291IGNoeWJu4SIKKworIzogdW5kby5jOjY3NQorbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICJwb+hldCB6bexuOiAxIgorCisjOiB1bmRvLmM6Njc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICJwb+hldCB6bexuOiAlbGQiCisKKyM6IHVuZG8uYzo3MjEKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogeuF6bmFtIG8gem3sbuFjaCBwb7lrb3plbiIKKworIzogdW5kby5jOjc1MQorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiBjaHli7SB1bmRvIPjhZGVrIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6NjU1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYvMzIgYml0b3bhIEdVSSB2ZXJ6ZSBwcm8gTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjY1NworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SBHVUkgdmVyemUgcHJvIE1TIFdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzo2NjAKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiB2ZSBXaW4zMnMgcmW+aW11IgorCisjOiB2ZXJzaW9uLmM6NjYyCittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIiBzIE9MRSBwb2Rwb3JvdSIKKworIzogdmVyc2lvbi5jOjY2NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvduEgdmVyemUgcHJvIE1TIFdpbmRvd3Mga29uem9sdSIKKworIzogdmVyc2lvbi5jOjY2OQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIHZlcnplIHBybyBNUyBXaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6NjczCittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SB2ZXJ6ZSBwcm8gTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjY3NQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiBiaXRvduEgTVMtRE9TIHZlcnplIgorCisjOiB2ZXJzaW9uLmM6NjgxCittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjY4MworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnplIgorCisjOiB2ZXJzaW9uLmM6Njg2Cittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjY5MQorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnplIgorCisjOiB2ZXJzaW9uLmM6NzAxCittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIlBvdb5pdOkgeuFwbGF0eTogIgorCisjOiB2ZXJzaW9uLmM6NzI4Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorInD4ZWxvvmlsICIKKworIzogdmVyc2lvbi5jOjczMQorbXNnaWQgImJ5ICIKK21zZ3N0ciAiICIKKworIzogdmVyc2lvbi5jOjc0MworbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisibWF4aW3hbG7tIHZlcnplIgorCisjOiB2ZXJzaW9uLmM6NzQ2Cittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorInZlbGvhIHZlcnplICIKKworIzogdmVyc2lvbi5jOjc0OQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJub3Jt4Wxu7SB2ZXJ6ZSIKKworIzogdmVyc2lvbi5jOjc1MgorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIm1hbOEgdmVyemUgIgorCisjOiB2ZXJzaW9uLmM6NzU0Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJtaW5pbeFsbu0gdmVyemUiCisKKyM6IHZlcnNpb24uYzo3NjAKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgImJleiBncmFmaWNr6WhvIHJvemhyYW7tIgorCisjOiB2ZXJzaW9uLmM6NzY0Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gR1RLLUdOT01FIgorCisjOiB2ZXJzaW9uLmM6NzY2Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gR1RLIgorCisjOiB2ZXJzaW9uLmM6NzcwCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gWDExLU1vdGlmIgorCisjOiB2ZXJzaW9uLmM6NzczCittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIlMgcm96aHJhbu1tIFgxMS1BdGhlbmEiCisKKyM6IHZlcnNpb24uYzo3NzYKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gQmVPUyIKKworIzogdmVyc2lvbi5jOjc3OQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIFBob3RvbiIKKworIzogdmVyc2lvbi5jOjc4MgorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAicyBncmFmaWNr/W0gcm96aHJhbu1tIgorCisjOiB2ZXJzaW9uLmM6Nzg1Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAicyBncmFmaWNr/W0gcm96aHJhbu1tIENhcmJvbiIKKworIzogdmVyc2lvbi5jOjc4OAorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAicyBncmFmaWNr/W0gcm96aHJhbu1tIENvY29hIgorCisjOiB2ZXJzaW9uLmM6NzkxCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAicyAoY2xhc2lja/1tKSBncmFmaWNr/W0gcm96aHJhbu1tIgorCisjOiB2ZXJzaW9uLmM6ODAyCittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiIFZsYXN0bm9zdGkgemFocm51dOkgKCspIGEgbmV6YWhybnV06SAoLSk6XG4iCisKKyM6IHZlcnNpb24uYzo4MTQKK21zZ2lkICIgICBzeXN0ZW0gdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgIHN5c3TpbW92/SB2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODE5Cittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIHW+aXZhdGVsc2v9IHZpbXJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4MjQKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiBkcnVo/SB1vml2YXRlbHNr/SB2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODI5Cittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgdPhldO0gdb5pdmF0ZWxza/0gdmltcmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjgzNAorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgdb5pdmF0ZWxza/0gZXhyYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODM5Cittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgIGRydWj9IHW+aXZhdGVsc2v9IGV4cmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjg0NQorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICBzeXN06W1vdv0gZ3ZpbXJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4NDkKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICB1vml2YXRlbHNr/SBndmltcmMgc291Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjg1MworbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiZHJ1aP0gdb5pdmF0ZWxza/0gZ3ZpbXJjIHNvdWJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo4NTgKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgInT4ZXTtIHW+aXZhdGVsc2v9IGd2aW1yYyBzb3Vib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODY1Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgc3lzdOltb3b9IHNvdWJvciBzIG1lbnU6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODczCittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgIGltcGxpY2l0bu0gaG9kbm90YSAkVklNOlwiIgorCisjOiB2ZXJzaW9uLmM6ODc5Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgIGltcGxpY2l0bu0gaG9kbm90YSAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzo4ODMKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJQ+GVrbGFkOiAiCisKKyM6IHZlcnNpb24uYzo4ODkKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICJQ+GVrbGFkYeg6ICIKKworIzogdmVyc2lvbi5jOjg5NAorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiTGlua3VqaTogIgorCisjOiB2ZXJzaW9uLmM6ODk5Cittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICBQT0RQT1JBIExBRMxOzSIKKworIzogdmVyc2lvbi5jOjkzNAorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjkzNgorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJ2ZXJ6ZSAiCisKKyM6IHZlcnNpb24uYzo5MzcKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIkF1dG9yOiBCcmFtIE1vb2xlbmFhciBhIGRhbLntIgorCisjOiB2ZXJzaW9uLmM6OTM4Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIGplIHZvbG7sILlp+Gl0ZWxu/SBwcm9ncmFtIHMgb3Rldvhlbv1tIHpkcm9qb3b9bSBr82RlbSIKKworIzogdmVyc2lvbi5jOjk0MAorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICJQb21venRlIGNodWT9bSBk7HRlbSB2IFVnYW5k7CEiCisKKyM6IHZlcnNpb24uYzo5NDEKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJwb2Ryb2Ju7Gq57SBpbmZvcm1hY2Ugeu1za+F0ZSBwb21vY+0gOmhlbHAgaWNjZjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NDMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJ6YWRlanRlIDpxPEVudGVyPiAgICAgICAgICAgICBwcm8gdWtvbuhlbu0gcHJvZ3JhbXUiCisKKyM6IHZlcnNpb24uYzo5NDQKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJ6YWRlanRlIDpoZWxwPEVudGVyPiAg6GkgPEYxPiBwcm8gbuFwb3bsZHUiCisKKyM6IHZlcnNpb24uYzo5NDUKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICJ6YWRlanRlIDpoZWxwIHZlcnNpb242PEVudGVyPiAgcHJvIGluZm9ybWFjZSBvIHZlcnppIDYiCisKKyM6IHZlcnNpb24uYzo5NDgKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiQuy+7W0gdiByZb5pbXUga29tcGF0aWJpbGl0eSBzIFZpIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAiemFkZWp0ZSA6c2V0IG5vY3A8RW50ZXI+ICAgICBwcm8gaW1wbGljaXRu7SBuYXN0YXZlbu0gVmltIgorCisjOiB2ZXJzaW9uLmM6OTUwCittc2dpZCAidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAicG9kcm9ibuxque0gaW5mb3JtYWNlIHrtc2vhdGUgcG9tb2PtIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTkwCittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAiVkFST1bBTs06IGRldGVrb3bhbnkgV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjk5MworbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInphZGVqdGUgOmhlbHAgd2luZG93czk1PEVudGVyPiBwcm8gcG9kcm9ibuxque0gaW5mb3JtYWNlIgorCisjOiB3aW5kb3cuYzoyMDEKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogTmVu7SC+4WRu6SBwcmV2aWV3IG9rbm8gbmVu7SIKKworIzogd2luZG93LmM6NTY4Cittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogT2tubyBuZWx6ZSByb3pk7GxpdCB64XJvdmXyIHRvcGxlZnQgYSBib3RyaWdodCIKKworIzogd2luZG93LmM6MTMyNworbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogTmVsemUgcm90b3ZhdCwgcG9rdWQgamUgamlu6SBva25vIHJvemTsbGVubyIKKworIzogd2luZG93LmM6MTgxMAorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogUG9zbGVkbu0gb2tubyBuZWx6ZSB1emF2+O10IgorCisjOiB3aW5kb3cuYzoyNDc0Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIkppviBleGlzdHVqZSBwb3V6ZSBqZWRubyBva25vIgorCisjOiB3aW5kb3cuYzoyNTIxCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IEppbukgb2tubyBvYnNhaHVqZSB6bexueSIKKworIzogd2luZG93LmM6NDM0MQorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IFBvZCBrdXJ6b3JlbSBzZSBuZW5hY2jheu0gbuF6ZXYgc291Ym9ydSIKKworIzogd2luZG93LmM6NDQ2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IFNvdWJvciBcIiVzXCIgbmVsemUgdiBwYXRoIG5hbOl6dCIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIkVkaXRhY2UgJm11bHRpcGxlIFZpbXkiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTkyCittc2dpZCAiRWRpdCB3aXRoIHNpbmdsZSAmVmltIgorbXNnc3RyICJFZGl0YWNlIGplZG7tbSAkVmltIC1lbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MDQKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiRWRpdGFjZSAmVmltIC1lbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MjgKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAiRWRpdGFjZSBleGlzdHVq7WPtbSBWaW1lbSAtICYiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NzUyCittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIkVkaXRhY2UgdnlicmFu/WNoIHNvdWJvcvkgVmltZW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkxIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY5Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICJDaHliYSBw+Gkgc3Bvdbl07G7tIHByb2Nlc3U6IFprb250cm9sdWp0ZSB6ZGFsaSBqZSBndmltIHYgJFBBVEghIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNgorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NzAKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiY2h5YmEgZ3ZpbWV4dC5kbGwiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA1Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICJO4XpldiAodiBwYXRoKSBqZSBw+O1sabkgZGxvdWj9IgorCisjOiBnbG9iYWxzLmg6ODc4Cittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS1CdWZmZXIgbmVvYnNhaHVqZSC+4WRu/SD44WRlay0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjEwMTkKK21zZ2lkICJDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIlD47WtheiBw+GVydbllbiIKKworIzogZ2xvYmFscy5oOjEwMjAKK21zZ2lkICJBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAiSmUgdnm+YWRvduFuIGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTAyMQorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBwbyBcXCBieSBt7GwgbuFzbGVkb3ZhdCAvLiA/IG5lYm8gJiIKKworIzogZ2xvYmFscy5oOjEwMjMKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICIiCisiRTExOiBDaHliYSB2IG9rbuwgcPjta2F6b3bpIPjhZGt5OyA8Q1I+IHBybyBzcHW5dLlu7SwgQ1RSTC1DIHBybyB1a29u6GVu7SIKKworIzogZ2xvYmFscy5oOjEwMjUKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIiIKKyJFMTI6IFD47WtheiBuZW7tIHogZXhyYy92aW1yYyB2IGFrdHXhbG7tbSBhZHJlc+H4aSDoaSBw+GkgaGxlZOFu7SB0YWd1ICIKKyJwb3ZvbGVuLiIKKworIzogZ2xvYmFscy5oOjEwMjYKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogU291Ym9yIGV4aXN0dWplIChwb3W+aWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGdsb2JhbHMuaDoxMDI3Cittc2dpZCAiQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIlD47WtheiBzZWxoYWwiCisKKyM6IGdsb2JhbHMuaDoxMDI4Cittc2dpZCAiSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIlZuaXT4bu0gY2h5YmEiCisKKyM6IGdsb2JhbHMuaDoxMDI5Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIlD4ZXJ1uWVubyIKKworIzogZ2xvYmFscy5oOjEwMzAKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiBDaHlibuEgYWRyZXNhIgorCisjOiBnbG9iYWxzLmg6MTAzMQorbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkNoeWJu/SBhcmd1bWVudCIKKworIzogZ2xvYmFscy5oOjEwMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIkNoeWJu/SBhcmd1bWVudDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiBDaHlibv0gdv1yYXo6ICVzIgorCisjOiBnbG9iYWxzLmg6MTAzNgorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiBDaHlibv0gcm96c2FoIgorCisjOiBnbG9iYWxzLmg6MTAzNworbXNnaWQgIkludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiQ2h5Ym79IHD47WtheiIKKworIzogZ2xvYmFscy5oOjEwMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIGplIGFkcmVz4fhlbSIKKworIzogZ2xvYmFscy5oOjEwNDIKK21zZ2lkICJFMTg6IFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBiZWZvcmUgJz0nIgorbXNnc3RyICJFMTg6IE5lb+hla+F2YW7pIHpuYWt5IHD4ZWQgJz0nIgorCisjOiBnbG9iYWxzLmg6MTA0NAorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiBabmHoa2EgbeEgY2h5Ym7pIOjtc2xvIPjhZGt1IgorCisjOiBnbG9iYWxzLmg6MTA0NQorbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICJFMjA6IG5lbu0gbmFzdGF2ZW5hIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBOZWx6ZSBt7G5pdCwgamUgbmFzdGF2ZW5hIHZvbGJhICdtb2RpZmlhYmxlJyIKKworIzogZ2xvYmFscy5oOjEwNDcKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6IFNrcmlwdCB2bm/4ZW4gcPjtbGm5IGhsdWJva28iCisKKyM6IGdsb2JhbHMuaDoxMDQ4Cittc2dpZCAiRTIzOiBObyBhbHRlcm5hdGUgZmlsZSIKK21zZ3N0ciAiRTIzOiCu4WRu/SBhbHRlcm5hdGl2bu0gc291Ym9yIgorCisjOiBnbG9iYWxzLmg6MTA0OQorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogVGFrb3bhIHprcmF0a2EgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwNTAKK21zZ2lkICJObyAhIGFsbG93ZWQiCittc2dzdHIgIiEgbmVu7SBwb3ZvbGVubyIKKworIzogZ2xvYmFscy5oOjEwNTIKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6IE5lbHplIHBvdb7tdCBHVUk6IG5lYnlsbyB6YXBudXRvIHD4aSBw+GVrbGFkdSBwcm9ncmFtdSIKKworIzogZ2xvYmFscy5oOjEwNTUKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIiIKKyJFMjY6IG5lbHplIHBvdb7tdCBoZWJyZWpza/0gcmW+aW06ICBuZWJ5bCB6YXBudXQgcPhpIHD4ZWtsYWR1IHByb2dyYW11XG4iCisKKyM6IGdsb2JhbHMuaDoxMDU4Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogTmVsemUgcG91vu10IGZhcnNpIHJlvmltOiAgbmVieWwgemFwbnV0IHD4aSBw+GVrbGFkdSBwcm9ncmFtdVxuIgorCisjOiBnbG9iYWxzLmg6MTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IFNrdXBpbmEgenb9cmF6buxu7SAlcyBuZWV4aXN0dWplIgorCisjOiBnbG9iYWxzLmg6MTA2MworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogWmF07W0gbmVu7SC+4WRu/SB2bG++ZW79IHRleHQiCisKKyM6IGdsb2JhbHMuaDoxMDY0Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogruFkbuEgcPhlZGNob3rtIHD47Wthem924SD44WRrYSIKKworIzogZ2xvYmFscy5oOjEwNjUKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiCu4WRu6SB0YWtvdukgbWFwb3bhbu0iCisKKyM6IGdsb2JhbHMuaDoxMDY2Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgIq7hZG7hIHNob2RhIgorCisjOiBnbG9iYWxzLmg6MTA2NworIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaDogJXMiCittc2dzdHIgIq7hZG7hIHNob2RhOiAlcyIKKworIzogZ2xvYmFscy5oOjEwNjgKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiCu4WRu/SBu4XpldiBzb3Vib3J1IgorCisjOiBnbG9iYWxzLmg6MTA2OQorbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogvuFkbv0gcPhlZGNob3rtIHJlZ3Vs4XJu7SB2/XJheiIKKworIzogZ2xvYmFscy5oOjEwNzAKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIkUzNDogruFkbv0gcPhlZGNob3rtIHD47WtheiIKKworIzogZ2xvYmFscy5oOjEwNzEKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiC+4WRu/SBw+GVkY2hveu0gcmVndWzhcm7tIHb9cmF6IgorCisjOiBnbG9iYWxzLmg6MTA3MgorbXNnaWQgIk5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIlJvenNhaCBuZW7tIHBvdm9sZW4iCisKKyM6IGdsb2JhbHMuaDoxMDc0Cittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIkUzNjogTmVkb3N0YXRlayBt7XN0YSIKKworIzogZ2xvYmFscy5oOjEwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIk5lbHplIHZ5dHZv+Gl0IHNvdWJvciAlcyIKKworIzogZ2xvYmFscy5oOjEwNzcKK21zZ2lkICJDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIk5lbHplIHrtc2thdCBu4XpldiBkb+hhc27paG8gc291Ym9ydSIKKworIzogZ2xvYmFscy5oOjEwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJOZWx6ZSBvdGV2+O10IHNvdWJvciAlcyIKKworIzogZ2xvYmFscy5oOjEwNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJOZWx6ZSDo7XN0IHNvdWJvciAlcyIKKworIzogZ2xvYmFscy5oOjEwODAKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzogTmV1bG++ZW7pIHpt7G55IChwb3W+aWp0ZSAhIHBybyB2eW51Y2Vu7SkiCisKKyM6IGdsb2JhbHMuaDoxMDgxCittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IE51bG92/SBhcmd1bWVudCIKKworIzogZ2xvYmFscy5oOjEwODMKK21zZ2lkICJFMzk6IE51bWJlciBleHBlY3RlZCIKK21zZ3N0ciAiRTM5OiBP6GVr4Xbhbm8g6O1zbG8iCisKKyM6IGdsb2JhbHMuaDoxMDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTmVsemUgb3RldvjtdCBjaHlib3b9IHNvdWJvciAlcyIKKworIzogZ2xvYmFscy5oOjEwODkKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE5lZG9zdGF0ZWsgcGFt7HRpISIKKworIzogZ2xvYmFscy5oOjEwOTIKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiVnpvciBuZW5hbGV6ZW4iCisKKyM6IGdsb2JhbHMuaDoxMDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiVnpvciBuZW5hbGV6ZW46ICVzIgorCisjOiBnbG9iYWxzLmg6MTA5NQorbXNnaWQgIkFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkFyZ3VtZW50IG11c+0gYv10IGtsYWRu/SIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiCu4WRu6SBjaHlieSIKKworIzogZ2xvYmFscy5oOjEwOTkKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6IFBvuWtvemVu/SD4ZXTsemVjIHBybyB2eWhsZWThduFu7SIKKworIzogZ2xvYmFscy5oOjExMDAKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiBwb7lrb3plbv0gcmVnZXhwIHByb2dyYW0iCisKKyM6IGdsb2JhbHMuaDoxMTAxCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiAnbmFzdGF2ZW5hIHZvbGJhICdyZWFkb25seScgKHBvdb5panRlICEgcHJvIHZ5bnVjZW7tKSIKKworIzogZ2xvYmFscy5oOjExMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0NjogTmVsemUgbmFzdGF2aXQgcG91emVfcHJvX+h0ZW7tIHByb23sbm5vdSBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMTA2Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBDaHliYSBw+Gkg6HRlbu0gY2h5Ym926WhvIHNvdWJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IE5lbu0gdiBiZXpwZehub3N0bu0gc2NocuFuY2UgcG92b2xlbm8iCisKKyM6IGdsb2JhbHMuaDoxMTExCittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IENoeWJu4SBob2Rub3RhIHZvbGJ5ICdzY3JvbGwnIgorCisjOiBnbG9iYWxzLmg6MTExMgorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogdm9sYmEgJ3NoZWxsJyBqZSBwcuF6ZG7hIgorCisjOiBnbG9iYWxzLmg6MTExMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IENoeWJhIHD4aSB1emF27XLhbu0gb2RrbOFkYWPtaG8gc291Ym9ydSIKKworIzogZ2xvYmFscy5oOjExMTQKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiBzZXpuYW0gdGFn+SBqZSBwcuF6ZG79IgorCisjOiBnbG9iYWxzLmg6MTExNQorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiBQ+O1rYXogamUgcPjtbGm5IHNsb75pdP0iCisKKyM6IGdsb2JhbHMuaDoxMTE2Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IE7hemV2IGplIHD47WxpuSBkbG91aP0iCisKKyM6IGdsb2JhbHMuaDoxMTE3Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IHD47WxpuSBtbm9obyBbIgorCisjOiBnbG9iYWxzLmg6MTExOAorbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiBQ+O1sabkgbW5vaG8gbuF6dvkgc291Ym9y+SIKKworIzogZ2xvYmFscy5oOjExMTkKK21zZ2lkICJUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICJOYWRieXRl6G7pIHpuYWt5IG5hIGtvbmNpIgorCisjOiBnbG9iYWxzLmg6MTEyMAorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IE5lem7hbeEgem5h6GthIgorCisjOiBnbG9iYWxzLmg6MTEyMQorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTogTmVsemUgZXhwYW5kb3ZhdCC+b2zta2926SB6bmFreSIKKworIzogZ2xvYmFscy5oOjExMjIKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDogQ2h5YmEgcPhpIHVrbOFk4W7tIgorCisjOiBnbG9iYWxzLmg6MTEyMworbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIk51bG92/SBwb+hldCIKKworIzogZ2xvYmFscy5oOjExMjUKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IFBvdb5pdO0gPFNJRD4gbWltbyBrb250ZXh0IHNrcmlwdHUiCmRpZmYgLS1naXQgYS9zcmMvcG8vZGUucG8gYi9zcmMvcG8vZGUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMjYyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9kZS5wbwpAQCAtMCwwICsxLDYwOTEgQEAKKyMgR2VybWFuIFRyYW5zbGF0aW9uIGZvciBWaW0JCXZpbTpzZXQgZm9sZG1ldGhvZD1tYXJrZXI6CisjCisjIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorIyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyMKKyMgUHJldmlvdXMtVHJhbnNsYXRvcihzKTogSm9oYW5uZXMgWmVsbG5lciA8am9oYW5uZXNAemVsbG5lci5vcmc+CisjCisjIHRob3VnaHRzIChHZWRhbmtlbikKKyMKKyMgLSBtYXJrICAgIDogTWFya2llcnVuZyBvZGVyIE1hcmtlPworIyAtIGFtYmlnb3VzOiBNZWhyZGV1dGlnLCBOaWNodC1laW5kZXV0aWcKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFZpbShkZXV0c2NoKVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAyLTA0LTIwIDE4OjE1KzAyMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA1LTEyIDIwOjQ5KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEdlcmZyaWVkIEZ1Y2hzIDxhbGZpZUBpc3Qub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IEdlcm1hbiA8ZGVAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTT184ODU5LTFcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4LWJpdFxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogS2VpbiBQdWZmZXIga2FubiBhbGxvemllcnQgd2VyZGVuOyBiZWVuZGVuLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBQdWZmZXIga2FubiBuaWNodCBhbGxvemllcnQgd2VyZGVuOyBiZW51dHplIGVpbmVuIGFuZGVyZW4uLi4iCisKKyM6IGJ1ZmZlci5jOjcwNgorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiS2VpbmUgUHVmZmVyIHd1cmRlbiBhdXNnZWxhZGVuIgorCisjOiBidWZmZXIuYzo3MDgKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiS2VpbmUgUHVmZmVyIHd1cmRlbiBnZWz2c2NodCIKKworIzogYnVmZmVyLmM6NzEwCittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiS2VpbmUgUHVmZmVyIHd1cmRlbiBnZWz2c2NodCIKKworIzogYnVmZmVyLmM6NzE4Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIjEgUHVmZmVyIGF1c2dlbGFkZW4iCisKKyM6IGJ1ZmZlci5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICIlZCBQdWZmZXIgYXVzZ2VsYWRlbiIKKworIzogYnVmZmVyLmM6NzI1Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSBQdWZmZXIgZ2Vs9nNjaHQiCisKKyM6IGJ1ZmZlci5jOjcyNworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIFB1ZmZlciBnZWz2c2NodCIKKworIzogYnVmZmVyLmM6NzMyCittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICIxIFB1ZmZlciBnZWz2c2NodCIKKworIzogYnVmZmVyLmM6NzM0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICIlZCBQdWZmZXIgZ2Vs9nNjaHQiCisKKyM6IGJ1ZmZlci5jOjc5MQorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IEVzIHd1cmRlIGtlaW5lIHZlcuRuZGVydGVuIFB1ZmZlciBnZWZ1bmRlbiIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjgzMAorbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiBFcyBnaWJ0IGtlaW5lIGFuZ2V6ZWlndGUgUHVmZmVyIgorCisjOiBidWZmZXIuYzo4NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiBLYW5uIG5pY2h0IHp1bSBQdWZmZXIgJWxkIHdlY2hzZWxuIgorCisjOiBidWZmZXIuYzo4NDUKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogS2FubiBuaWNodCD8YmVyIGRlbiBsZXR6dGVuIFB1ZmZlciBoaW5hdXMgZ2VoZW4iCisKKyM6IGJ1ZmZlci5jOjg0NworbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogS2FubiBuaWNodCB2b3IgZGVuIGVyc3RlbiBQdWZmZXIgZ2VoZW4iCisKKyM6IGJ1ZmZlci5jOjg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFODk6IFB1ZmZlciAlbGQgd3VyZGUgc2VpdCBkZXIgbGV0enRlbiDEbmRlcnVuZyBuaWNodCBnZXNjaHJpZWJlbiAoZXJ6d2luZ2UgIgorIm1pdCAhKSIKKworIzogYnVmZmVyLmM6ODg3Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IGxldHp0ZXIgUHVmZmVyIGthbm4gbmljaHQgaGVyYXVzLWdlbGFkZW4gd2VyZGVuIgorCisjOiBidWZmZXIuYzoxMzQyCittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogQWNodHVuZzog3GJlcmxhdWYgZGVyIExpc3RlIGRlciBEYXRlaW5hbWVuIgorCisjOiBidWZmZXIuYzoxNTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5Mjoga2VpbiBQdWZmZXIgJWxkIGdlZnVuZGVuIgorCisjOiBidWZmZXIuYzoxNzM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5MzogTWVociBhbHMgZWluZSBN9mdsaWNoa2VpdCBm/HIgJXMiCisKKyM6IGJ1ZmZlci5jOjE3MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IEtlaW4gUHVmZmVyIHBhc3N0IHp1ICVzIgorCisjOiBidWZmZXIuYzoyMTQxIGV4X2RvY21kLmM6NjA4OQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAiWmVpbGUgJWxkIgorCisjOiBidWZmZXIuYzoyMjI0Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogRWluIFB1ZmZlciBtaXQgZGllc2VtIE5hbWVuIGV4aXN0aWVydCBiZXJlaXRzIgorCisjOiBidWZmZXIuYzoyNTE3Cittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbVmVy5G5kZXJ0XSIKKworIzogYnVmZmVyLmM6MjUyMgorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW05pY2h0IGVkaXRpZXJ0XSIKKworIzogYnVmZmVyLmM6MjUyNworbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIltOZXVlIERhdGVpXSIKKworIzogYnVmZmVyLmM6MjUyOAorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltMZXNlLUZlaGxlcl0iCisKKyM6IGJ1ZmZlci5jOjI1MzAgZmlsZWlvLmM6MTc3NworbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIltudXIgTGVzZW5dIgorCisjOiBidWZmZXIuYzoyNTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAiMSBaZWlsZSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjU0NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCBaZWlsZW4gLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIlplaWxlICVsZCB2b24gJWxkIC0tJWQlJS0tIFNwYWx0ZSAiCisKKyM6IGJ1ZmZlci5jOjI2NDIKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIltLZWluZSBEYXRlaV0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjY4MgorbXNnaWQgImhlbHAiCittc2dzdHIgIltIaWxmZV0iCisKKyM6IGJ1ZmZlci5jOjMxOTMgc2NyZWVuLmM6NDc1NAorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW0hpbGZlXSIKKworIzogYnVmZmVyLmM6MzIyNSBzY3JlZW4uYzo0NzYwCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbVm9yYW5zaWNodF0iCisKKyM6IGJ1ZmZlci5jOjM0MzEKK21zZ2lkICJBbGwiCittc2dzdHIgIkFsbGVzIgorCisjIEVuZGUgc291bmRzIGJldHRlciB0aGFuICJVbnRlbiIKKyM6IGJ1ZmZlci5jOjM0MzEKK21zZ2lkICJCb3QiCittc2dzdHIgIkVuZGUiCisKKyMgQW5mYW5nIHNvdW5kcyBiZXR0ZXIgdGhhbiAiT2JlbiIKKyM6IGJ1ZmZlci5jOjM0MzMKK21zZ2lkICJUb3AiCittc2dzdHIgIkFuZmFuZyIKKworIzogYnVmZmVyLmM6NDE2OQorbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBMaXN0ZSBkZXIgUHVmZmVyOlxuIgorCisjOiBidWZmZXIuYzo0MjAyCittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbRmVobGVybGlzdGVdIgorCisjOiBidWZmZXIuYzo0MjE1IG1lbWxpbmUuYzoxNTEzCittc2dpZCAiW05vIEZpbGVdIgorbXNnc3RyICJbS2VpbmUgRGF0ZWldIgorCisjOiBidWZmZXIuYzo0NDM1Cittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gT3B0aW9uZW4gLS0tIgorCisjOiBidWZmZXIuYzo0NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIlZvcnplaWNoZW4gZvxyICVzOiIKKworIzogYnVmZmVyLmM6NDQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgWmVpbGU9JWxkICBpZD0lZCAgTmFtZT0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogXCJkaWZmXCIgaXN0IGb8ciBtZWhyIGFscyAlbGQgUHVmZmVyIG5pY2h0IG32Z2xpY2giCisKKyM6IGRpZmYuYzo2NDgKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogS2FubiBrZWluZSBcImRpZmZzXCIgZXJzdGVsbGVuIgorCisjOiBkaWZmLmM6NzQ3Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiUGF0Y2gtRGF0ZWkiCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IFwiZGlmZlwiLUF1c2dhYmUga2FubiBuaWNodCBnZWxlc2VuIHdlcmRlbiIKKworIzogZGlmZi5jOjE3MzIKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogQWt0dWVsbGVyIFB1ZmZlciBpc3QgbmljaHQgaW0gXCJkaWZmXCItTW9kdXMiCisKKyM6IGRpZmYuYzoxNzQ0Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogS2VpbiB3ZWl0ZXJlciBQdWZmZXIgaXN0IGltIFwiZGlmZlwiLU1vZHVzIgorCisjOiBkaWZmLmM6MTc1MgorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiRTEwMTogbWVocmRldXRpZzogTWVociBhbHMgendlaSBQdWZmZXIgaW0gXCJkaWZmXCItTW9kdXMiCisKKyM6IGRpZmYuYzoxNzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogUHVmZmVyIFwiJXNcIiBrYW5uIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiIKKworIzogZGlmZi5jOjE3ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiBQdWZmZXIgXCIlc1wiIGlzdCBuaWNodCBpbSBcImRpZmZcIi1Nb2R1cyIKKworIzogZGlncmFwaC5jOjIxNzIKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDogJ0VzY2FwZScgaXN0IGluIGVpbmVtIERpZ3JhcGhlbiBuaWNodCBlcmxhdWJ0IgorCisjOiBkaWdyYXBoLmM6MjM0NAorbXNnaWQgIktleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiXCJLZXltYXBcIi1EYXRlaSBuaWNodCBnZWZ1bmRlbiIKKworIzogZGlncmFwaC5jOjIzNzEKK21zZ2lkICJFMTA1OiBVc2luZyA6bG9hZGtleW1hcCBub3QgaW4gYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxMDU6IDpsb2Fka2V5bWFwIGF132VyaGFsYiBlaW5lciBlaW5nZWxlc2VuZW4gRGF0ZWkiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIFN0aWNod29ydC1Fcmfkbnp1bmcgKF5OL15QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorbXNnc3RyICIgXlgtTW9kdXMgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIGxva2FsZSBTdGljaHdvcnQtRXJn5G56dW5nICheTi9eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5ML15OL15QKSIKK21zZ3N0ciAiIFplaWxlbi1Fcmfkbnp1bmcgKF5ML15OL15QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRi9eTi9eUCkiCittc2dzdHIgIiBEYXRlaS1OYW1lbnMtRXJn5G56dW5nICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgVGFnLUVyZ+RuenVuZyAoXl0vXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIFBmYWQtTXVzdGVyLUVyZ+RuenVuZyAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiBEZWZpbml0aW9ucy1Fcmfkbnp1bmcgKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgV/ZydGVyYnVjaC1Fcmfkbnp1bmcgKF5LL15OL15QKSAiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlQvXk4vXlApIgorbXNnc3RyICIgVGhlc2F1cnVzLUVyZ+RuenVuZyAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIEtvbW1hbmRvLVplaWxlbi1Fcmfkbnp1bmcgKF5WL15OL15QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIlN0aWXfIGFuIGRhcyBFbmRlIGVpbmVzIEFic2F0emVzIgorCisjOiBlZGl0LmM6OTA3Cittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJEaWUgT3B0aW9uICd0aGVzYXVydXMnIGlzdCBsZWVyIgorCisjOiBlZGl0LmM6MTA4MworbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkRpZSBPcHRpb24gJ2RpY3Rpb25hcnknIGlzdCBsZWVyIgorCisjOiBlZGl0LmM6MjAwNworIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBkaWN0aW9uYXJ5OiAlcyIKK21zZ3N0ciAiRHVyY2hzdWNoZW4gZGVzIFf2cnRlcmJ1Y2hzOiAlcyIKKworIzogZWRpdC5jOjIxOTgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAoRWluZvxnZW4pIFNjcm9sbGVuICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMjAwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChFcnNldHplbikgU2Nyb2xsZW4gKF5FL15ZKSIKKworIzogZWRpdC5jOjI1MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICJEdXJjaHN1Y2hlOiAlcyIKKworIzogZWRpdC5jOjI1NDcKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAiRHVyY2hzdWNoZW4gdm9uIFRhZ3MuIgorCisjOiBlZGl0LmM6MzIwNworbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiBIaW56dWb8Z3VuZyBkZXIiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzI1NgorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gU3VjaGUuLi4iCisKKyM6IGVkaXQuYzozMzEyCittc2dpZCAiQmFjayBhdCBvcmlnaW5hbCIKK21zZ3N0ciAiWnVy/GNrIGFtIFVyc3BydW5nIgorCisjOiBlZGl0LmM6MzMxNworbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICJXb3J0IGF1cyBhbmRlcmVyIFplaWxlIgorCisjOiBlZGl0LmM6MzMyMgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJFaW56aWdlciBUcmVmZmVyIgorCisjOiBlZGl0LmM6MzM4MQorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCBvZiAlZCIKK21zZ3N0ciAiVHJlZmZlciAlZCB2b24gJWQiCisKKyM6IGVkaXQuYzozMzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIgorbXNnc3RyICJUcmVmZmVyICVkIgorCisjOiBldmFsLmM6Njk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogVW5iZWthbm50ZSBWYXJpYWJsZTogXCIlc1wiIgorCisjOiBldmFsLmM6OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogRmVobGVuZGUgS2xhbW1lcm46ICVzIgorCisjOiBldmFsLmM6MTA1NyBldmFsLmM6MTA3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IEtlaW5lIHNvbGNoZSBWYXJpYWJsZTogXCIlc1wiIgorCisjOiBldmFsLmM6MTMxNQorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogZmVobGVuZGVyICc6JyBuYWNoICc/JyIKKworIzogZXZhbC5jOjE5MjkKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogZmVobGVuZGUgJyknIgorCisjOiBldmFsLmM6MTk3OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBmZWhsZW5kZSAnXSciCisKKyM6IGV2YWwuYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiBPcHRpb25zLUJlemVpY2hudW5nIGZlaGx0OiAlcyIKKworIzogZXZhbC5jOjIwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBVbmJla2FubnRlIE9wdGlvbjogJXMiCisKKyM6IGV2YWwuYzoyMTM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiBGZWhsZW5kZXMgQW5m/GhydW5nc3plaWNoZW46ICVzIgorCisjOiBldmFsLmM6MjI1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogRmVobGVuZGVzIEFuZvxocnVuZ3N6ZWljaGVuOiAlcyIKKworIzogZXZhbC5jOjI1NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBVbnp1bORzc2lnZSBBcmd1bWVudGUgZvxyIEZ1bmt0aW9uICVzIgorCisjOiBldmFsLmM6MjU3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE3OiBVbmtub3duIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExNzogVW5iZWthbm50ZSBGdW5rdGlvbjogJXMiCisKKyM6IGV2YWwuYzoyNTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBadSB2aWVsZSBBcmd1bWVudGUgZvxyIEZ1bmt0aW9uOiAlcyIKKworIzogZXZhbC5jOjI1NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTogTmljaHQgZ2VudWcgQXJndW1lbnRlIGb8ciBGdW5rdGlvbjogJXMiCisKKyM6IGV2YWwuYzoyNTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4gd3VyZGUgbmljaHQgaW4gZWluZXIgU2tyaXB0LVVtZ2VidW5nIGJlbnV0enQ6ICVzIgorCisjOiBldmFsLmM6MzE3MiBndWkuYzozOTkwCittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGV2YWwuYzozNjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIFplaWxlbjogIgorCisjOiBldmFsLmM6NDc5NAorbXNnaWQgIiIKKyImT0tcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJk9LXG4iCisiJkFiYnJlY2hlbiIKKworIzogZXZhbC5jOjU2MjYKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IEtlaW5lIFZlcmJpbmR1bmcgenVtIFZpbS1TZXJ2ZXIiCisKKyM6IGV2YWwuYzo1NzE2Cittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6IFNlcnZlci1BbnR3b3J0IGthbm4gbmljaHQgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IGV2YWwuYzo1NzQxCittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBLYW5uIG5pY2h0IHp1bSBDbGllbnQgc2VuZGVuIgorCisjOiBldmFsLmM6NTc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogS2FubiBuaWNodCB6dSAlcyBzZW5kZW4iCisKKyM6IGV2YWwuYzo1ODg0Cittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIodW5n/Gx0aWcpIgorCisjOiBldmFsLmM6Njg5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiBWYXJpYWJsZSBuaWNodCBkZWZpbmllcnQ6ICVzIgorCisjOiBldmFsLmM6NzU5MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgdXNlICEgdG8gcmVwbGFjZSIKK21zZ3N0ciAiRTEyMjogRGllIEZ1bmt0aW9uICVzIGV4aXN0aWVydCBiZXJlaXRzOyBlcnNldHplIHNpZSBtaXQgISIKKworIzogZXZhbC5jOjc2MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogRnVua3Rpb24gbmljaHQgZGVmaW5pZXJ0OiAlcyIKKworIzogZXZhbC5jOjc2NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiBmZWhsZW5kZXMgJygnOiAlcyIKKworIzogZXZhbC5jOjc2ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IFVuenVs5HNzaWdlcyBBcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo3NzY2Cittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IGZlaGxlbmRlcyA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo3ODQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiBGdW5rdGlvbiAlcyBrYW5uIG5pY2h0IHVtZGVmaW5pZXJ0IHdlcmRlbjogc2llIGlzdCBpbiBWZXJ3ZW5kdW5nIgorCisjOiBldmFsLmM6NzkwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBGdW5rdGlvbnMtTmFtZSBtdXNzIG1pdCBHcm/fYnVjaHN0YWJlbiBiZWdpbm5lbjogJXMiCisKKyM6IGV2YWwuYzo3OTA5Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTogRnVua3Rpb25zLU5hbWUgd2lyZCB2ZXJsYW5ndCIKKworIzogZXZhbC5jOjgwMDIKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgIkZ1bmt0aW9uICIKKworIzogZXZhbC5jOjgxMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogRnVua3Rpb24gbmljaHQgZGVmaW5pZXJ0OiAlcyIKKworIzogZXZhbC5jOjgxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiBGdW5rdGlvbiAlcyBrYW5uIG5pY2h0IGdlbPZzY2h0IHdlcmRlbjogc2llIGlzdCBpbiBWZXJ3ZW5kdW5nIgorCisjOiBldmFsLmM6ODE2OQorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IEZ1bmt0aW9uc2F1ZnJ1Zi1UaWVmZSD8YmVyc2NocmVpdGV0ICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgInJ1ZmUgJXMgYXVmIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjQ1IGV4X2NtZHMyLmM6MTk4OAorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJ3ZWl0ZXIgaW4gJXMiCisKKyM6IGV2YWwuYzo4Mjk5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gYXXfZXJoYWxiIGVpbmVyIEZ1bmt0aW9uIgorCisjOiBldmFsLmM6ODM3NworIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgbGllZmVydGUgIyVsZCB6dXL8Y2siCisKKyM6IGV2YWwuYzo4MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIGxpZWZlcnRlIFwiJXNcIiB6dXL8Y2siCisKKyM6IGV2YWwuYzo4NTIxCittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgZ2xvYmFsZSBWYXJpYWJsZW46XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2t0YWwgJTAzbyIKKworIzogZXhfY21kcy5jOjQyOAorbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiBWZXJzY2hpZWJlIFplaWxlbiBpbiBzaWNoIHNlbGJzdCIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSBaZWlsZSB2ZXJzY2hvYmVuIgorCisjOiBleF9jbWRzLmM6NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiJWxkIFplaWxlbiB2ZXJzY2hvYmVuIgorCisjOiBleF9jbWRzLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAiJWxkIFplaWxlbiBnZWZpbHRlcnQiCisKKyM6IGV4X2NtZHMuYzo5MTgKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiAqRmlsdGVyKi1BdXRvLUtvbW1hbmRvcyBk/HJmZW4gZGVuIGFrdHVlbGxlbiBQdWZmZXIgbmljaHQg5G5kZXJuIgorCisjOiBleF9jbWRzLmM6MTAwMworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW0tlaW4gU2NocmVpYmVuIHNlaXQgZGVyIGxldHp0ZW4gxG5kZXJ1bmddXG4iCisKKyM6IGV4X2NtZHMuYzoxMjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAidmltaW5mbzogJXMgaW4gWmVpbGU6ICIKKworIzogZXhfY21kcy5jOjEyNTMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogWnUgdmllbGUgRmVobGVyOyD8YmVyc3ByaW5nZSBSZXN0IGRlciBEYXRlaSIKKworIzogZXhfY21kcy5jOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJMZXNlbiBkZXIgdmltaW5mby1EYXRlaSBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMjgzCittc2dpZCAiIGluZm8iCittc2dzdHIgIiBJbmZvcm1hdGlvbiIKKworIzogZXhfY21kcy5jOjEyODQKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIk1hcmtpZXJ1bmdlbiIKKworIzogZXhfY21kcy5jOjEyODUKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgRFVSQ0hHRUZBTExFTiIKKworIzogZXhfY21kcy5jOjEzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IFZpbWluZm8tRGF0ZWkgaXN0IG5pY2h0IHNjaHJlaWJiYXI6ICVzIgorCisjOiBleF9jbWRzLmM6MTUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiBTY2hyZWliZW4gaW4gZGllIHZpbWluZm8tRGF0ZWkgJXMgaXN0IG5pY2h0IG32Z2xpY2ghIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIlNjaHJlaWJlbiBkZXIgdmltaW5mby1EYXRlaSBcIiVzXCIiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBEaWVzZSB2aW1pbmZvLURhdGVpIHd1cmRlIHZvbiBWaW0gJXMgZ2VuZXJpZXJ0LlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgU2llIGv2bm5lbiBzaWUgdmVy5G5kZXJuLCB3ZW5uIFNpZSB2b3JzaWNodGlnIHZvcmdlaGVuIVxuIgorIlxuIgorCisjOiBleF9jbWRzLmM6MTYxNAorbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjIFdlcnQgdm9uICdlbmNvZGluZycsIGFscyBkaWVzZSBEYXRlaSBnZXNjaHJpZWJlbiB3dXJkZVxuIgorCisjOiBleF9jbWRzLmM6MTcxMworbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiVW56dWzkc3NpZ2VzIFplaWNoZW4gYW0gQW5mYW5nIgorCisjOiBleF9jbWRzLmM6MjA1MyBleF9jbWRzLmM6MjMxMCBleF9jbWRzMi5jOjYwMgorbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIlNjaHJlaWJlIEFscyIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMDk2Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IERhdGVpIGlzdCBpbiBlaW5lbSBhbmRlcmVuIFB1ZmZlciBnZWxhZGVuIgorCisjOiBleF9jbWRzLmM6MjEzMAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIlBhcnRpZWxsZSBEYXRlaSBzY2hyZWliZW4/IgorCisjOiBleF9jbWRzLmM6MjEzNworbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBWZXJ3ZW5kZW4gU2llICEgenVtIFNjaHJlaWJlbiB2b24gcGFydGllbGxlbiBQdWZmZXJuIgorCisjOiBleF9jbWRzLmM6MjI0NAorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgItxiZXJzY2hyZWliZSBleGlzdGllcmVuZGUgRGF0ZWkgXCIlLipzXCI/IgorCisjIEN1cnNvcjogU2NocmVpYm1hcmtlIFBvc2l0aW9uc21hcmtlCisjOiBleF9jbWRzLmM6MjMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6IEtlaW4gRGF0ZWluYW1lIGb8ciBQdWZmZXIgJWxkIgorCisjOiBleF9jbWRzLmM6MjM1MworbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIiIKKyJFMTQyOiBEYXRlaSB3dXJkZSBuaWNodCBnZXNjaHJpZWJlbjogU2NocmVpYmVuIGlzdCBkdXJjaCBkaWUgJ3dyaXRlJy1PcHRpb24gIgorImF1c2dlc2NoYWx0ZXQiCisKKyM6IGV4X2NtZHMuYzoyMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyIncmVhZG9ubHknLU9wdGlvbiBpc3QgZvxyIFwiJS4qc1wiIGdlc2V0enQuXG4iCisiTfZjaHRlbiBTaWUgdHJvdHpkZW0gc2NocmVpYmVuPyIKKworIzogZXhfY21kcy5jOjI1MzgKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIkVkaXRpZXJlIERhdGVpIgorCisjOiBleF9jbWRzLmM6MzA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogQXV0by1Lb21tYW5kb3MgbPZzY2h0ZW4gdW5lcndhcnRldCBuZXVlbiBQdWZmZXIgJXMiCisKKyM6IGV4X2NtZHMuYzozMTkzCittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IG5pY2h0IG51bWVyaXNjaGVzIEFyZ3VtZW50IGb8ciA6eiIKKworIzogZXhfY21kcy5jOjMyNzgKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBTaGVsbCBCZWZlaGxlIHNpbmQgaW4gcnZpbSBuaWNodCBlcmxhdWJ0IgorCisjOiBleF9jbWRzLmM6MzM4NQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3Vs5HJlIEF1c2Ry/GNrZSBr9m5uZW4gbmljaHQgZHVyY2ggQnVjaHN0YWJlbiBiZWdyZW56dCB3ZXJkZW4iCisKKyM6IGV4X2NtZHMuYzozNzI3CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgImVyc2V0emUgZHVyY2ggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDA5MgorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIoVW50ZXJicm9jaGVuKSAiCisKKyM6IGV4X2NtZHMuYzo0MDk2Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgImVpbmUgRXJzZXR6dW5nIgorCisjOiBleF9jbWRzLmM6NDA5OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAiJWxkIEVyc2V0enVuZ2VuIgorCisjOiBleF9jbWRzLmM6NDEwMQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBhdWYgZWluZXIgWmVpbGUiCisKKyM6IGV4X2NtZHMuYzo0MTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiBhdWYgJWxkIFplaWxlbiIKKworIzogZXhfY21kcy5jOjQxNTQKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IEthbm4gOmdsb2JhbCBuaWNodCByZWt1cnNpdiBhdXNm/GhyZW4iCisKKyM6IGV4X2NtZHMuYzo0MTg5Cittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IFJlZ3Vs5HJlciBBdXNkcnVjayBmZWhsdCBpbiBnbG9iYWwiCisKKyM6IGV4X2NtZHMuYzo0MjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIk11c3RlciBpbiBqZWRlciBaZWlsZSBnZWZ1bmRlbjogJXMiCisKKyM6IGV4X2NtZHMuYzo0MzE5Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBMZXR6dGUgZXJzZXR6dGUgWmVpY2hlbmtldHRlOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NDIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogU2NoYWRlLCBrZWluZSBIaWxmZSBm/HIgJXMiCisKKyM6IGV4X2NtZHMuYzo0NDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiSGlsZmUtRGF0ZWkgXCIlc1wiIG5pY2h0IGdlZnVuZGVuIgorCisjOiBleF9jbWRzLmM6NDkxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiBrZWluIFZlcnplaWNobmlzOiAlcyIKKworIzogZXhfY21kcy5jOjQ5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6ICVzIGthbm4gbmljaHQgenVtIFNjaHJlaWJlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IGV4X2NtZHMuYzo0OTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiAlcyBrYW5uIG5pY2h0IHp1bSBMZXNlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IGV4X2NtZHMuYzo1MDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IFRhZyBcIiVzXCIgaXN0IG1laHJtYWxzIGluIGRlciBEYXRlaSAlcyIKKworIzogZXhfY21kcy5jOjUxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiBVbmJla2FubnRlciBcInNpZ25cIi1CZWZlaGw6ICVzIgorCisjOiBleF9jbWRzLmM6NTE1OQorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBOYW1lIGRlcyBaZWljaGVucyBmZWhsdCIKKworIzogZXhfY21kcy5jOjUyMDUKK21zZ2lkICJFMjU1OiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFMjU1OiBadSB2aWVsZSBaZWljaGVuIGRlZmluaWVydCIKKworIzogZXhfY21kcy5jOjUyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBVbmf8bHRpZ2VyIFRleHQgZvxyIGVpbiBaZWljaGVuOiAlcyIKKworIzogZXhfY21kcy5jOjUyNzEgZXhfY21kcy5jOjU0NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogVW5iZWthbm50ZXMgWmVpY2hlbjogJXMiCisKKyM6IGV4X2NtZHMuYzo1MzE3Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogRmVobGVuZGUgWmVpY2hlbi1OdW1tZXIiCisKKyM6IGV4X2NtZHMuYzo1Mzk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiB1bmf8bHRpZ2UgUHVmZmVyLU51bW1lcjogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiB1bmf8bHRpZ2UgWmVpY2hlbi1JRDogJWxkIgorCisjOiBleF9jbWRzLmM6NTYwNworbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW2dlbPZzY2h0XSIKKworIzogZXhfY21kczIuYzo3MAorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGxlYXZlLiIKK21zZ3N0ciAiRGVidWctTW9kdXMuIEdlYmVuIFNpZSBcImNvbnRcIiB6dW0gVmVybGFzc2VuIGVpbi4iCisKKyM6IGV4X2NtZHMyLmM6NzQgZXhfZG9jbWQuYzo3NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICJaZWlsZSAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgIkJlZmVobDogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIkhhbHRlcHVua3QgaW4gXCIlcyVzXCIgWmVpbGUgJWxkIgorCisjOiBleF9jbWRzMi5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IEhhbHRlcHVua3QgbmljaHQgZ2VmdW5kZW46ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIktlaW5lIEhhbHRlcHVua3RlIGRlZmluaWVydCIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgIFplaWxlICVsZCIKKworIzogZXhfY21kczIuYzo2MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAixG5kZXJ1bmdlbiBpbiBcIiUuKnNcIiBzcGVpY2hlcm4/IgorCisjOiBleF9jbWRzMi5jOjYyNyBleF9kb2NtZC5jOjg2NzMKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiVW5iZW5hbm50IgorCisjOiBleF9jbWRzMi5jOjc2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2MjogUHVmZmVyIFwiJXNcIiB3dXJkZSBzZWl0IGRlciBsZXR6dGVuIMRuZGVydW5nIG5pY2h0IGdlc2NocmllYmVuIgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiIgorIkFjaHR1bmc6IFVuZXJ3YXJ0ZXRlciBFaW50cml0dCBpbiBlaW5lbiBhbmRyZW4gUHVmZmVyICj8YmVycHL8ZmVuIFNpZWRpZSAiCisiQXV0b2NvbW1hbmRzKSIKKworIzogZXhfY21kczIuYzoxMjA4Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiBFcyBnaWJ0IG51ciBlaW5lIERhdGVpIHp1bSBFZGl0aWVyZW4iCisKKyM6IGV4X2NtZHMyLmM6MTIxMAorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDogS2FubiBuaWNodCD8YmVyIGRpZSBlcnN0ZSBEYXRlaSBoaW5hdXNnZWhlbiIKKworIzogZXhfY21kczIuYzoxMjEyCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IEthbm4gbmljaHQg/GJlciBkaWUgbGV0enRlIERhdGVpIGhpbmF1c2dlaGVuIgorCisjOiBleF9jbWRzMi5jOjE2MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICJTdWNoZSBuYWNoIFwiJXNcIiBpbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY1NgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiU3VjaGUgbmFjaCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY4MAorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgZm91bmQgaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorbXNnc3RyICJpbSAncnVudGltZXBhdGgnIG5pY2h0IGdlZnVuZGVuOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTcxNAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICJWaW0gU2tyaXB0IgorCisjOiBleF9jbWRzMi5jOjE4MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJLYW5uIGtlaW4gVmVyemVpY2huaXMgZWlubGVzZW46IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJcIiVzXCIga29ubnRlIG5pY2h0IGdlbGVzZW4gd2VyZGVuIgorCisjOiBleF9jbWRzMi5jOjE4NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJaZWlsZSAlbGQ6IFwiJXNcIiBrb25udGUgbmljaHQgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IGV4X2NtZHMyLmM6MTg3OAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImxlc2UgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAiWmVpbGUgJWxkOiBsZXNlIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTg2CisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICJMZXNlbiB2b24gJXMgYmVlbmRldCIKKworIzogZXhfY21kczIuYzoyMjg3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTogQWNodHVuZzogRmFsc2NoZXIgWmVpbGVudHJlbm5lciwgdmllbGxlaWNodCBmZWhsdCBlaW4gXk0iCisKKyM6IGV4X2NtZHMyLmM6MjMzNgorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyBhdd9lcmhhbGIgZWluZXIgZWluZ2VsZXNlbmVuIERhdGVpIgorCisjOiBleF9jbWRzMi5jOjIzNjkKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogOmZpbmlzaCBhdd9lcmhhbGIgZWluZXIgZWluZ2VsZXNlbmVuIERhdGVpIgorCisjOiBleF9jbWRzMi5jOjI4MzgKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIktlaW4gVGV4dCB6dW0gRHJ1Y2tlbiIKKworIzogZXhfY21kczIuYzoyOTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJEcnVja2UgU2VpdGUgJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjI5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIiBLb3BpZSAlZCB2b24gJWQiCisKKyM6IGV4X2NtZHMyLmM6Mjk3NworIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiR2VkcnVja3Q6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5ODQKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICJEcnVja2VuIGFiZ2Vicm9jaGVuIgorCisjOiBleF9jbWRzMi5jOjMzNjcKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEZlaGxlciBiZWltIFNjaHJlaWJlbiBkZXIgUG9zdFNjcmlwdCBBdXNnYWJlLURhdGVpIgorCisjOiBleF9jbWRzMi5jOjQwNDIKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IFBvc3RTY3JpcHQgQXVzZ2FiZS1EYXRlaSBrYW5uIG5pY2h0IGdl9mZmbmV0IHdlcmRlbiIKKworIzogZXhfY21kczIuYzo0MDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IERhdGVpIFwiJXNcIiBrYW5uIG5pY2h0IGdl9mZmbmV0IHdlcmRlbiIKKworIzogZXhfY21kczIuYzo0MDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogUG9zdFNjcmlwdCAncmVzb3VyY2UnLURhdGVpIFwiJXNcIiBrYW5uIG5pY2h0IGdlbGVzZW4gd2VyZGVuIgorCisjOiBleF9jbWRzMi5jOjQyODkKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIlNjaGlja2UgenVtIERydWNrZXIuLi4iCisKKyM6IGV4X2NtZHMyLmM6NDI5MworbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IERydWNrIGRlciBQb3N0U2NyaXB0LURhdGVpIHNjaGx1ZyBmZWhsIgorCisjOiBleF9jbWRzMi5jOjQyOTUKK21zZ2lkICJQcmludCBqb2Igc2VudC4iCittc2dzdHIgIkRydWNrYXVmdHJhZyBhYmdlc2NoaWNrdCIKKworIzogZXhfY21kczIuYzo0NjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICJNb21lbnRhbmUgJXNTcHJhY2hlOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogU3ByYWNoZSBrYW5uIG5pY2h0IGF1ZiBcIiVzXCIgZ2VzZXR6dCB3ZXJkZW4iCisKKyM6IGV4X2RvY21kLmM6NDkwCittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIiIKKyJFeC1Nb2R1cy4gIEdlYmVuIFNpZSBcInZpc3VhbFwiIGVpbiwgdW0genVtIE5vcm1hbC1Nb2R1cyB6dXL8Y2t6dWtlaHJlbi4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjUyNgorbXNnaWQgIkF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJBbSBEYXRlaWVuZGUiCisKKyM6IGV4X2RvY21kLmM6NjAxCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBCZWZlaGwgenUgcmVrdXJzaXYiCisKKyM6IGV4X2RvY21kLmM6OTExCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IGZlaGxlbmRlcyA6ZW5kd2hpbGUiCisKKyM6IGV4X2RvY21kLmM6OTEzCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IGZlaGxlbmRlcyA6ZW5kaWYiCisKKyM6IGV4X2RvY21kLmM6OTIzCittc2dpZCAiRW5kIG9mIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRW5kZSBkZXIgZWluZ2VsZXNlbmVuIERhdGVpIgorCisjOiBleF9kb2NtZC5jOjkyNAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiRW5kZSBkZXIgRnVua3Rpb24iCisKKyM6IGV4X2RvY21kLmM6MTM0NAorbXNnaWQgIkFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgIk5pY2h0LWVpbmRldXRpZ2UgVmVyd2VuZHVuZyBlaW5lcyBiZW51dHplcmRlZmluaWVydGVuIEJlZmVobHMiCisKKyM6IGV4X2RvY21kLmM6MTM1OAorbXNnaWQgIk5vdCBhbiBlZGl0b3IgY29tbWFuZCIKK21zZ3N0ciAiS2VpbiBFZGl0b3ItQmVmZWhsIgorCisjOiBleF9kb2NtZC5jOjE0NDEKK21zZ2lkICJEb24ndCBwYW5pYyEiCittc2dzdHIgIk51ciBrZWluZSBQYW5payEiCisKKyM6IGV4X2RvY21kLmM6MTQ2MAorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiQmVyZWljaHNncmVuemVuIHL8Y2t35HJ0cyIKKworIzogZXhfZG9jbWQuYzoxNDY5Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJCZXJlaWNoc2dyZW56ZW4gcvxja3fkcnRzOyB2ZXJ0YXVzY2hlbiIKKworIzogZXhfZG9jbWQuYzoxNTgwCittc2dpZCAiVXNlIHcgb3Igdz4+IgorbXNnc3RyICJWZXJ3ZW5kZW4gU2llIHcgb2RlciB3Pj4iCisKKyM6IGV4X2RvY21kLmM6MzA5NworbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogRGVyIEJlZmVobCBpc3QgaW4gZGllc2VyIFZlcnNpb24gbmljaHQgaW1wbGVtZW50aWVydCIKKworIzogZXhfZG9jbWQuYzozMjY3Cittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IE51ciBlaW4gRGF0ZWluYW1lIGVybGF1YnQiCisKKyM6IGV4X2RvY21kLmM6MzgyMworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIiVkIHdlaXRlcmUgRGF0ZWllbiB6dW0gRWRpdGllcmVuLiAgVHJvdHpkZW0gYmVlbmRlbj8iCisKKyM6IGV4X2RvY21kLmM6MzgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiAlbGQgd2VpdGVyZSBEYXRlaWVuIHp1bSBFZGl0aWVyZW4iCisKKyM6IGV4X2RvY21kLmM6MzkyNAorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IHVzZSAhIHRvIHJlZGVmaW5lIgorbXNnc3RyICJFMTc0OiBCZWZlaGwgZXhpc3RpZXJ0IGJlcmVpdHM6IHZlcndlbmRlbiBTaWUgISB6dW0gVW1kZWZpbmllcnRlbiIKKworIzogZXhfZG9jbWQuYzo0MDI5Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgTmFtZSAgICAgICAgQXJncyBCZXJlaWNoIEZlcnRpZyAgRGVmaW5pdGlvbiIKKworIzogZXhfZG9jbWQuYzo0MTE4Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICJLZWluZSB2b20gQmVudXR6ZXIgZGVmaW5pZXJ0ZW4gQmVmZWhsZSBnZWZ1bmRlbiIKKworIzogZXhfZG9jbWQuYzo0MTQ5Cittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTogS2VpbiBBdHRyaWJ1dCBhbmdlZ2ViZW4iCisKKyM6IGV4X2RvY21kLmM6NDIwMQorbXNnaWQgIkUxNzY6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTE3NjogRmFsc2NoZSBBbnphaGwgdm9uIEFyZ3VtZW50ZW4iCisKKyM6IGV4X2RvY21kLmM6NDIxNgorbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IFrkaGxlciBrYW5uIG5pY2h0IHp3ZWltYWwgYW5nZWdlYmVuIHdlcmRlbiIKKworIzogZXhfZG9jbWQuYzo0MjI2Cittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogVW5n/Gx0aWdlIFZvcmVpbnN0ZWxsdW5nIGb8ciBkZW4gWuRobGVyIgorCisjOiBleF9kb2NtZC5jOjQyNTQKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IEFyZ3VtZW50IHdpcmQgenVyIFZlcnZvbGxzdORuZGlndW5nIGJlbvZ0aWd0IgorCisjOiBleF9kb2NtZC5jOjQyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IFVuZ/xsdGlnZXIgVmVydm9sbHN05G5kaWd1bmdzLVdlcnQ6ICVzIgorCisjOiBleF9kb2NtZC5jOjQyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiBVbmf8bHRpZ2VzIEF0dHJpYnV0OiAlcyIKKworIzogZXhfZG9jbWQuYzo0MzIyCittc2dpZCAiRTE4MjogSW52YWxpZCBjb21tYW5kIG5hbWUiCittc2dzdHIgIkUxODI6IFVuZ/xsdGlnZXIgQmVmZWhscy1OYW1lIgorCisjOiBleF9kb2NtZC5jOjQzMzcKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIkUxODM6IEJlbnV0emVyZGVmaW5pZXJ0ZSBCZWZlaGxlIG38c3NlbiBtaXQgR3Jv32J1Y2hzdGFiZW4gYmVnaW5uZW4iCisKKyM6IGV4X2RvY21kLmM6NDQwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogVW5iZWthbm50ZXIgYmVudXR6ZXJkZWZpbmllcnRlciBCZWZlaGw6ICVzIgorCisjOiBleF9kb2NtZC5jOjQ4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBaZWlsZSAlcyBrYW5uIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiIKKworIzogZXhfZG9jbWQuYzo0ODY1Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIkhlcnpsaWNoZSBHcvzfZSwgVmltIEJlbnV0emVyISIKKworIzogZXhfZG9jbWQuYzo1NTY5Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIkVkaXRpZXJlIERhdGVpIGluIGVpbmVtIG5ldWVuIEZlbnN0ZXIiCisKKyM6IGV4X2RvY21kLmM6NTgzOQorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiS2VpbmUgQXVzbGFnZXJ1bmdzLURhdGVpIgorCisjOiBleF9kb2NtZC5jOjU5NDMKK21zZ2lkICJBcHBlbmQgRmlsZSIKK21zZ3N0ciAiRvxnZSBEYXRlaSBhbiIKKworIzogZXhfZG9jbWQuYzo2MDAyCittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiBLZWluIHZvcmhlcmlnZXMgVmVyemVpY2huaXMiCisKKyM6IGV4X2RvY21kLmM6NjA3OQorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IFVuYmVrYW5udCIKKworIzogZXhfZG9jbWQuYzo2MTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiRmVuc3Rlci1Qb3NpdGlvbjogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo2MjAyCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiBkaWUgRmVuc3Rlci1Qb3NpdGlvbiBrYW5uIGb8ciBkaWVzZXMgVGVybWluYWwgbmljaHQgYmVzdGltbXQgd2VyZGVuIgorCisjOiBleF9kb2NtZC5jOjY0NzQKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICJVbWxlaXR1bmcgU3BlaWNoZXJuIgorCisjOiBleF9kb2NtZC5jOjY2MjMKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIkFuc2ljaHRlbiBTcGVpY2hlcm4iCisKKyM6IGV4X2RvY21kLmM6NjYyNAorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiU2l0enVuZyBTcGVpY2hlcm4iCisKKyM6IGV4X2RvY21kLmM6NjYyNgorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIkVpbnN0ZWxsdW5nZW4gU3BlaWNoZXJuIgorCisjOiBleF9kb2NtZC5jOjY3NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgZXhpc3RpZXJ0IChlcnp3aW5nZSBkdXJjaCAhKSIKKworIzogZXhfZG9jbWQuYzo2NzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogXCIlc1wiIGthbm4gbmljaHQgenVtIFNjaHJlaWJlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY4MDQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIiIKKyJFMTkxOiBBcmd1bWVudCBtdXNzIGVpbiBCdWNoc3RhYmUgb2RlciB2b3J35HJ0cy9y/GNrd+RydHMtQW5m/GhydW5nc3plaWNoZW4gIgorInNlaW4iCisKKyM6IGV4X2RvY21kLmM6Njg0NworbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogUmVrdXJzaXZlIFZlcndlbmR1bmcgdm9uIDpub3JtYWwgenUgdGllZiIKKworIzogZXhfZG9jbWQuYzo3MjA4Cittc2dpZCAiOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIjppZiBTY2hhY2h0ZWx1bmcgenUgdGllZiIKKworIzogZXhfZG9jbWQuYzo3MjQzCittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYgb2huZSA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzI2MworbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZWxzZSBvaG5lIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjY1Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2VpZiBvaG5lIDppZiIKKworIzogZXhfZG9jbWQuYzo3MzE3Cittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIjp3aGlsZSBTY2hhY2h0ZWx1bmcgenUgdGllZiIKKworIzogZXhfZG9jbWQuYzo3MzYzCittc2dpZCAiOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6Y29udGludWUgb2huZSA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM5MAorbXNnaWQgIjpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmJyZWFrIG9obmUgOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjc0MTMgZXhfZG9jbWQuYzo3NDE4Cittc2dpZCAiOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6ZW5kd2hpbGUgb2huZSA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzQzOQorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IDplbmRmdW5jdGlvbiBhdd9lcmhhbGIgZWluZXIgRnVua3Rpb24iCisKKyM6IGV4X2RvY21kLmM6NzYxOQorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiBLZWluIGFuZGVyZXIgRGF0ZWluYW1lIHp1ciBFcnNldHp1bmcgbWl0ICcjJyIKKworIzogZXhfZG9jbWQuYzo3NjUwCittc2dpZCAibm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJrZWluIEF1dG8tS29tbWFuZG8tRGF0ZWktTmFtZSB6dXIgRXJzZXR6dW5nIG1pdCBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjU4Cittc2dpZCAibm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJrZWluZSBBdXRvLUtvbW1hbmRvLVB1ZmZlci1OdW1tZXIgenVyIEVyc2V0enVuZyBtaXQgXCI8YWJ1Zj5cIiIKKworIzogZXhfZG9jbWQuYzo3NjY5Cittc2dpZCAibm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIiIKKyJrZWluIHBhc3NlbmRlciBOYW1lIGVpbmVzIEF1dG8tS29tbWFuZG9zIHp1ciBFcnNldHp1bmcgbWl0IFwiPGFtYXRjaD5cIiIKKworIzogZXhfZG9jbWQuYzo3Njc5Cittc2dpZCAibm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiCittc2dzdHIgImtlaW4gOnNvdXJjZSBEYXRlaW5hbWUgenVyIEVyc2V0enVuZyBtaXQgXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzcyMAorIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiTGVlcmVyIERhdGVpbmFtZSBm/HIgJyUnIG9kZXIgJyMnLCBmdW5rdGlvbmllcnQgbnVyIG1pdCBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3NzIyCittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRXJnaWJ0IGVpbmUgbGVlcmUgWmVpY2hlbmtldHRlIgorCisjOiBleF9kb2NtZC5jOjg2NTUKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IHZpbWluZm8ga2FubiBuaWNodCB6dW0gTGVzZW4gZ2X2ZmZuZXQgd2VyZGVuIgorCisjOiBleF9kb2NtZC5jOjg4MjgKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgImVkOSkgS2VpbmUgRGlncmFwaGVuIGluIGRpZXNlciBWZXJzaW9uIgorCisjOiBleF9nZXRsbi5jOjI4MzMKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICJUYWctTmFtZSIKKworIzogZXhfZ2V0bG4uYzoyODM2Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgdmVyd2FuZHRlIERhdGVpXG4iCisKKyM6IGV4X2dldGxuLmM6NDA0OQorbXNnaWQgIidoaXN0b3J5JyBvcHRpb24gaXMgemVybyIKK21zZ3N0ciAiJ2hpc3RvcnknLU9wdGlvbiBpc3QgTnVsbCIKKworIzogZXhfZ2V0bG4uYzo0Mjg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcyBHZXNjaGljaHRlIChuZXVlc3RlIGJpcyDkbHRlc3RlKTpcbiIKKworIzogZXhfZ2V0bG4uYzo0MjkwCittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJCZWZlaGxzemVpbGUiCisKKyM6IGV4X2dldGxuLmM6NDI5MQorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgIlN1Y2hhdXNkcnVjayIKKworIzogZXhfZ2V0bG4uYzo0MjkyCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAiQXVzZHJ1Y2siCisKKyM6IGV4X2dldGxuLmM6NDI5MworbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIkVpbmdhYmUtWmVpbGUiCisKKyM6IGV4X2dldGxuLmM6NDMyMworbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIg/GJlciBkaWUgTORuZ2UgZGVzIEJlZmVobHMgaGluYXVzIgorCisjOiBleF9nZXRsbi5jOjQ0OTEKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBha3RpdmVzIEZlbnN0ZXIgb2RlciBQdWZmZXIgZ2Vs9nNjaHQiCisKKyM6IGZpbGVpby5jOjM1MQorbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICJ1bnp1bORzc2lnZXIgRGF0ZWluYW1lIgorCisjOiBmaWxlaW8uYzozNzUgZmlsZWlvLmM6NTAwIGZpbGVpby5jOjI1MTYgZmlsZWlvLmM6MjU1NAorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJpc3QgZWluIFZlcnplaWNobmlzIgorCisjOiBmaWxlaW8uYzozNzcKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJpc3Qga2VpbmUgRGF0ZWkiCisKKyM6IGZpbGVpby5jOjUyMiBmaWxlaW8uYzozNjQ2Cittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW05ldWUgRGF0ZWldIgorCisjOiBmaWxlaW8uYzo1NDAKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJbS2VpbmUgRXJsYXVibmlzXSIKKworIzogZmlsZWlvLmM6NjM0Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgQXV0by1Lb21tYW5kb3MgaGFiZW4gZGllIERhdGVpIHVubGVzYmFyIGdlbWFjaHQiCisKKyM6IGZpbGVpby5jOjYzNgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIiIKKyJFMjAxOiAqUmVhZFByZSBBdXRvLUtvbW1hbmRvcyBk/HJmZW4gbmljaHQgZGVuIGFrdHVlbGxlbiBQdWZmZXIgd2VjaHNlbG4iCisKKyM6IGZpbGVpby5jOjY1NworbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTogTGVzZSB2b24gc3RkaW4uLi5cbiIKKworIzogZmlsZWlvLmM6NjYzCittc2dpZCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uIgorbXNnc3RyICJMZXNlIHZvbiBzdGRpbi4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo4OTIKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogRGF0ZWkgd3VyZGUgdW5sZXNiYXIgZHVyY2ggVW13YW5kbHVuZyIKKworIzogZmlsZWlvLmM6MTc1NQorbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltmaWZvL3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE3NjIKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltmaWZvXSIKKworIzogZmlsZWlvLmM6MTc2OQorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJbc29ja2V0XSIKKworIzogZmlsZWlvLmM6MTc3NworbXNnaWQgIltST10iCittc2dzdHIgIltST10iCisKKyM6IGZpbGVpby5jOjE3ODcKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIltDUiBmZWhsdF0iCisKKyM6IGZpbGVpby5jOjE3OTIKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbTkwgZ2VmdW5kZW5dIgorCisjOiBmaWxlaW8uYzoxNzk3Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbbGFuZ2UgWmVpbGVuIGdldGVpbHRdIgorCisjOiBmaWxlaW8uYzoxODAzIGZpbGVpby5jOjM2MzAKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltOSUNIVCBrb252ZXJ0aWVydF0iCisKKyM6IGZpbGVpby5jOjE4MDggZmlsZWlvLmM6MzYzNQorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJba29udmVydGllcnRdIgorCisjOiBmaWxlaW8uYzoxODE1IGZpbGVpby5jOjM2NjAKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlt2ZXJzY2hs/HNzZWx0XSIKKworIzogZmlsZWlvLmM6MTgyMgorbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW1VNV0FORExVTkdTLUZFSExFUl0iCisKKyM6IGZpbGVpby5jOjE4MjkKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbTEVTRS1GRUhMRVJdIgorCisjOiBmaWxlaW8uYzoyMDM2Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgInRlbXBvcuRyZSBEYXRlaSBrYW5uIG5pY2h0IHp1bSBVbXdhbmRlbG4gZ2X2ZmZuZXQgd2VyZGVuIgorCisjOiBmaWxlaW8uYzoyMDQzCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICJGZWhsZXIgYmVpIGRlciBVbXdhbmRsdW5nIG1pdCAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyMDQ2Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAiQXVzZ2FiZSB2b24gJ2NoYXJjb252ZXJ0JyBrYW5uIG5pY2h0IGdlbGVzZW4gd2VyZGVuIgorCisjOiBmaWxlaW8uYzoyNDMyCittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIiIKKyJFMjAzOiBBdXRvLUtvbW1hbmRvcyBoYWJlbiBkZW4genUgc2NocmVpYmVuZGVuIFB1ZmZlciBnZWz2c2NodCBvZGVyIGhlcmF1cyAiCisiZ2VsYWRlbiIKKworIzogZmlsZWlvLmM6MjQ1NQorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICIiCisiRTIwNDogQXV0by1Lb21tYW5kb3MgaGFiZW4gZGllIEFuemFobCBkZXIgWmVpbGVuIGluIHVuZXJ3YXJ0ZXRlciBXZWlzZSAiCisidmVy5G5kZXJ0IgorCisjOiBmaWxlaW8uYzoyNTIxIGZpbGVpby5jOjI1MzgKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAiaXN0IGtlaW5lIERhdGVpIG9kZXIgYmVzY2hyZWliYmFyZXMgRGV2aWNlIgorCisjOiBmaWxlaW8uYzoyNTg0Cittc2dpZCAiaXMgcmVhZC1vbmx5ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgImlzdCBTY2hyZWliZ2VzY2j8dHp0IChlcnp3aW5nZSBkdXJjaCAhKSIKKworIzogZmlsZWlvLmM6Mjg4NgorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIlNpY2hlcnVuZ3MtRGF0ZWkga2FubiBuaWNodCBnZXNjaHJpZWJlbiB3ZXJkZW4gKGVyendpbmdlIG1pdCAhKSIKKworIzogZmlsZWlvLmM6Mjg5OAorbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJGZWhsZXIgYmVpbSBTY2hsaWXfZW4gZGVyIFNpY2hlcnVuZ3MtRGF0ZWkgKGVyendpbmdlIG1pdCAhKSIKKworIzogZmlsZWlvLmM6MjkwMAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkRhdGVpIHp1bSBCYWNrdXAga2FubiBuaWNodCBnZWxlc2VuIHdlcmRlbiAoZXJ6d2luZ2UgbWl0ICEpIgorCisjOiBmaWxlaW8uYzoyOTE2Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJCYWNrdXAtRGF0ZWkga2FubiBuaWNodCBhbmdlbGVndCB3ZXJkZW4gKGVyendpbmdlIG1pdCAhKSIKKworIzogZmlsZWlvLmM6MzAxOAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiQmFja3VwLURhdGVpIGthbm4gbmljaHQgZXJzdGVsbHQgd2VyZGVuIChlcnp3aW5nZSBtaXQgISkiCisKKyM6IGZpbGVpby5jOjMwODAKK21zZ2lkICJUaGUgcmVzb3VyY2UgZm9yayB3aWxsIGJlIGxvc3QgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRGVyIFJlc291cmNlZm9yayBnZWh0IHZlcmxvcmVuIChlcnp3aW5nZSBtaXQgISkiCisKKyM6IGZpbGVpby5jOjMxNjkKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogdGVtcG9y5HJlIERhdGVpIGthbm4gbmljaHQgenVtIFNjaHJlaWJlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IGZpbGVpby5jOjMxODcKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAodXNlICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogRmVobGVyIGJlaSBkZXIgVW13YW5kbHVuZyAoc2NocmVpYmUgb2huZSBVbXdhbmRsdW5nIG1pdCAhKSIKKworIzogZmlsZWlvLmM6MzIyMgorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IEdlbGlua3RlIERhdGVpIGthbm4gbmljaHQgenVtIFNjaHJlaWJlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IGZpbGVpby5jOjMyMjYKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IERhdGVpIGthbm4gbmljaHQgenVtIFNjaHJlaWJlbiBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IGZpbGVpby5jOjM0NzUKK21zZ2lkICJDbG9zZSBmYWlsZWQiCittc2dzdHIgIkZlaGxlciBiZWltIFNjaGxpZd9lbiIKKworIzogZmlsZWlvLmM6MzU0NgorbXNnaWQgIndyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiU2NocmVpYi1GZWhsZXIsIFVtd2FuZGx1bmcgc2NobHVnIGZlaGwiCisKKyM6IGZpbGVpby5jOjM1NTIKK21zZ2lkICJ3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJTY2hyZWliZmVobGVyIChEYXRlaXN5c3RlbSB2b2xsPykiCisKKyM6IGZpbGVpby5jOjM2MjUKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiS09OVkVSVElFUlVOR1MtRkVITEVSIgorCisjOiBmaWxlaW8uYzozNjQxCittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIltBdXNnYWJlZ2Vy5HRdIgorCisjOiBmaWxlaW8uYzozNjQ2Cittc2dpZCAiW05ld10iCittc2dzdHIgIltOZXVdIgorCisjOiBmaWxlaW8uYzozNjY4Cittc2dpZCAiIFthXSIKK21zZ3N0ciAiIFthXSIKKworIzogZmlsZWlvLmM6MzY2OAorbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIGFuZ2Vm/Gd0IgorCisjOiBmaWxlaW8uYzozNjcwCittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt3XSIKKworIzogZmlsZWlvLmM6MzY3MAorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgZ2VzY2hyaWViZW4iCisKKyM6IGZpbGVpby5jOjM3MjAKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTogcGF0Y2htb2RlOiBPcmlnaW5hbC1EYXRlaSBrYW5uIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbiIKKworIzogZmlsZWlvLmM6Mzc0MgorbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogcGF0Y2htb2RlOiBsZWVyZSBPcmlnaW5hbC1EYXRlaSBrYW5uIG5pY2h0IHZlcuRuZGVydCB3ZXJkZW4iCisKKyM6IGZpbGVpby5jOjM3NTcKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IEJhY2t1cC1EYXRlaSBrYW5uIG5pY2h0IGdlbPZzY2h0IHdlcmRlbiIKKworIzogZmlsZWlvLmM6MzgwOQorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFDSFRVTkc6IE9yaWdpbmFsLURhdGVpIGthbm4gdmVybG9yZW4gb2RlciB6ZXJzdPZydCBzZWluXG4iCisKKyM6IGZpbGVpby5jOjM4MTEKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICJiZWVuZGUgbmljaHQgZGVuIEVkaXRvciBiaXMgZGllIERhdGVpIGVyZm9sZ3JlaWNoIGdlc2NocmllYmVuIHd1cmRlISIKKworIzogZmlsZWlvLmM6Mzg5MQorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6Mzg5MQorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2RvcyBGb3JtYXRdIgorCisjOiBmaWxlaW8uYzozODk4Cittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzozODk4Cittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbbWFjIEZvcm1hdF0iCisKKyM6IGZpbGVpby5jOjM5MDUKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6MzkwNQorbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIlt1bml4IEZvcm1hdF0iCisKKyM6IGZpbGVpby5jOjM5MzIKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSBaZWlsZSwgIgorCisjOiBmaWxlaW8uYzozOTM0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQgWmVpbGVuLCAiCisKKyM6IGZpbGVpby5jOjM5MzcKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSBaZWljaGVuIgorCisjOiBmaWxlaW8uYzozOTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgWmVpY2hlbiIKKworIzogZmlsZWlvLmM6Mzk0OQorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltub2VvbF0iCisKKyM6IGZpbGVpby5jOjM5NDkKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJbVW52b2xsc3TkbmRpZ2UgbGV0enRlIFplaWxlXSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzozOTY4Cittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICJBQ0hUVU5HOiBEaWUgRGF0ZWkgd3VyZGUgc2VpdCBkZW0gbGV0enRlbiBMZXNlbiBnZeRuZGVydCEhISIKKworIzogZmlsZWlvLmM6Mzk3MAorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiTfZjaHRlbiBTaWUgZXMgd2lya2xpY2ggc2NocmVpYmVuIgorCisjOiBmaWxlaW8uYzo0OTMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBGZWhsZXIgd+RocmVuZCBkZXMgU2NocmVpYmVucyBuYWNoIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NDk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogRmVobGVyIGJlaW0gU2NobGll32VuIHZvbiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ5NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IEZlaGxlciBiZWltIExlc2VuIHZvbiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjUxMTUKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIEF1dG9rb21tYW5kbyBs9nNjaHRlIFB1ZmZlciIKKworIzogZmlsZWlvLmM6NTEyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiBBY2h0dW5nOiBEYXRlaSBcIiVzXCIgaXN0IG5pY2h0IGzkbmdlciB2b3JoYW5kZW4iCisKKyM6IGZpbGVpby5jOjUxMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBBY2h0dW5nOiBEYXRlaSBcIiVzXCIgd3VyZGUgdmVy5G5kZXJ0IHVuZCBkZXIgUHVmZmVyIHd1cmRlIGViZW5mYWxscyBpbiAiCisiVmltIHZlcuRuZGVydCIKKworIzogZmlsZWlvLmM6NTEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiIgorIlcxMTogQWNodHVuZzogRGF0ZWkgXCIlc1wiIHd1cmRlIHZlcuRuZGVydCwgc2VpdCBtaXQgZGVtIEVkaXRpZXJlbiAiCisiYW5nZWZhbmdlbiB3dXJkZSIKKworIzogZmlsZWlvLmM6NTE0MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzExOiBBY2h0dW5nOiBNb2RlIGRlciBEYXRlaSBcIiVzXCIgd3VyZGUgdmVy5G5kZXJ0IHNlaXQgbWl0IGRlbSBFZGl0aWVyZW4gIgorImFuZ2VmYW5nZW4gd3VyZGUiCisKKyM6IGZpbGVpby5jOjUxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiIgorIlcxMzogQWNodHVnOiBEYXRlaSBcIiVzXCIgd3VyZGUgZXJzdGVsbHQsIG5hY2hkZW0gbWl0IGRlbSBFZGl0aWVyZW4gYmVnb25uZW4gIgorInd1cmRlIgorCisjOiBmaWxlaW8uYzo1MTY4Cittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAiV2FybnVuZyIKKworIzogZmlsZWlvLmM6NTE2OQorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisiJkxlc2UgRGF0ZWkiCisKKyM6IGZpbGVpby5jOjUyNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IFwiJXNcIiBrb25udGUgbmljaHQgbmV1IGdlbGFkZW4gd2VyZGVuIgorCisjOiBmaWxlaW8uYzo1Nzc5Cittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0tZ2Vs9nNjaHQtLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjU5MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBLZWluZSBzb2xjaGUgR3J1cHBlOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjYwNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6IFVuenVs5HNzaWdlcyBaZWljaGVuIG5hY2ggKjogJXMiCisKKyM6IGZpbGVpby5jOjYwNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IEtlaW4gZGVyYXJ0aWdlcyBFcmVpZ25pczogJXMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogZmlsZWlvLmM6NjIyNAorbXNnaWQgIiIKKyJcbiIKKyItLS0gQXV0by1Db21tYW5kcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gQXV0by1Lb21tYW5kb3MgLS0tIgorCisjOiBmaWxlaW8uYzo2NDk1Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IEF1dG8tS29tbWFuZG9zIGv2bm5lbiBuaWNodCBm/HIgQUxMIEVyZWlnbmlzc2UgYXVzZ2Vm/GhydCB3ZXJkZW4iCisKKyM6IGZpbGVpby5jOjY1MTgKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIktlaW5lIHBhc3NlbmRlbiBBdXRvLUtvbW1hbmRvcyIKKworIzogZmlsZWlvLmM6Njc5MAorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IEF1dG8tS29tbWFuZG8gU2NoYWNodGVsdW5nIHp1IHRpZWYiCisKKyM6IGZpbGVpby5jOjcwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBBdXRvLUtvbW1hbmRvcyBm/HIgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3MDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiQXVzZvxocnVuZyB2b24gJXMiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6NzE1MworIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiQXV0b2tvbW1hbmRvICVzIgorCisjOiBmaWxlaW8uYzo3Njc1Cittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogRXMgZmVobHQgZWluIHsuIgorCisjOiBmaWxlaW8uYzo3Njc3Cittc2dpZCAiRTIyMDogTWlzc2luZyB9LiIKK21zZ3N0ciAiRTIyMDogRXMgZmVobHQgZWluIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICJLZWluZSBGYWx0dW5nIGdlZnVuZGVuIgorCisjOiBmb2xkLmM6NTUzCittc2dpZCAiRTM1MDogQ2Fubm90IGNyZWF0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIiIKKyJFMzUwOiBGYWx0dW5nIGthbm4gbWl0IGRlciBlaW5nZXN0ZWxsdGVuIE1ldGhvZGUgJ2ZvbGRtZXRob2QnIG5pY2h0IGVyemV1Z3QgIgorIndlcmRlbiIKKworIzogZm9sZC5jOjU1NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICIiCisiRTM1MTogRmFsdHVuZyBrYW5uIG1pdCBkZXIgZWluZ2VzdGVsbHRlbiBNZXRob2RlICdmb2xkbWV0aG9kJyBuaWNodCBlbnRmZXJudCAiCisid2VyZGVuIgorCisjOiBnZXRjaGFyLmM6MjQ3Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBadW0gTGVzZS1QdWZmZXIgSGluenVm/GdlbiIKKworIzogZ2V0Y2hhci5jOjIxMDYKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJzaXZlIFp1b3JkbnVuZyIKKworIzogZ2V0Y2hhci5jOjI5NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6IEdsb2JhbGUgQWJr/HJ6dW5nIGb8ciAlcyBleGlzdGllcnQgYmVyZWl0cyIKKworIzogZ2V0Y2hhci5jOjI5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBHbG9iYWxlIFp1b3JkbnVuZyBm/HIgJXMgZXhpc3RpZXJ0IGJlcmVpdHMiCisKKyM6IGdldGNoYXIuYzozMDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjY6IGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjY6IEFia/xyenVuZyBm/HIgJXMgZXhpc3RpZXJ0IGJlcmVpdHMiCisKKyM6IGdldGNoYXIuYzozMDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiBadW9yZG51bmcgZvxyICVzIGV4aXN0aWVydCBiZXJlaXRzIgorCisjOiBnZXRjaGFyLmM6MzE0NQorbXNnaWQgIk5vIGFiYnJldmlhdGlvbiBmb3VuZCIKK21zZ3N0ciAiS2VpbmUgQWJr/HJ6dW5nIGdlZnVuZGVuIgorCisjOiBnZXRjaGFyLmM6MzE0NworbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIktlaW5lIFp1b3JkbnVuZyBnZWZ1bmRlbiIKKworIzogZ2V0Y2hhci5jOjM5OTIKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IFVuenVs5HNzaWdlciBNb2R1cyIKKworIzogZ3VpLmM6MjAzCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IEdVSSBrYW5uIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW4iCisKKyM6IGd1aS5jOjMyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogS2FubiBuaWNodCB2b24gXCIlc1wiIGxlc2VuIgorCisjOiBndWkuYzo0NTMKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ICdndWlmb250d2lkZScgdW5n/Gx0aWciCisKKyM6IGd1aS5jOjM3MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiBGYXJiZSBm/HIgJXMga2FubiBuaWNodCBhbGxvemllcnQgd2VyZGVuIgorCisjOiBndWkuYzozOTg5Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIkZlaGxlciIKKworIzogZ3VpX2F0X2ZzLmM6MjkwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjxrYW5uIG5pY2h0IPZmZm5lbj4iCisKKyM6IGd1aV9hdF9mcy5jOjExMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJ2aW1fU2VsRmlsZTogU2NocmlmdGFydCAlcyBrYW5uIG5pY2h0IGVyaGFsdGVuIHdlcmRlbiIKKworIzogZ3VpX2F0X2ZzLmM6MjUzOAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiBrYW5uIG5pY2h0IHp1bSBsYXVmZW5kZW4gVmVyemVpY2huaXMgenVy/GNra2VocmVuIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJQZmFkOiIKKworIzogZ3VpX2F0X2ZzLmM6MjU2MworbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiBsYXVmZW5kZXMgVmVyemVpY2huaXMga2FubiBuaWNodCBlcm1pdHRlbHQgd2VyZGVuIgorCisjOiBndWlfYXRfZnMuYzoyNTcxIGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJPSyIKK21zZ3N0ciAiT0siCisKKyMuICdDYW5jZWwnIGJ1dHRvbgorIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfZ3RrLmM6MTc0MCBndWlfbW90aWYuYzoxNjE0IGd1aV9tb3RpZi5jOjI4MzUKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIkFiYnJlY2hlbiIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICJTY3JvbGxiYXIgV2lkZ2V0OiBHZW9tZXRyaWUgZGVzIEJpbGRjaGVucyBrYW5uIG5pY2h0IGVybWl0dGVsdCB3ZXJkZW4iCisKKyM6IGd1aV9hdGhlbmEuYzoxOTU2IGd1aV9tb3RpZi5jOjE4NjcKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWSU0gLSBEaWFsb2cuLi4iCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIiIKKyJFMjMyOiBCYWxsb29uRXZhbCBrYW5uIG5pY2h0IG1pdCBzb3dvaGwgXCJtZXNzYWdlXCIgdW5kIFwiY2FsbGJhY2tcIiBlcnpldWd0ICIKKyJ3ZXJkZW4iCisKKyM6IGd1aV9ndGsuYzoxMTkwCittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiVklNIC0gRGlhbG9nLi4uIgorCisjOiBndWlfZ3RrLmM6MTU3NiBndWlfbW90aWYuYzoyNzU0Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSBTdWNoZW4gdW5kIEVyc2V0emVuLi4uIgorCisjOiBndWlfZ3RrLmM6MTU4MSBndWlfbW90aWYuYzoyNzU2Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBTdWNoZW4uLi4iCisKKyM6IGd1aV9ndGsuYzoxNjA0IGd1aV9tb3RpZi5jOjI4NzQKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICJXb25hY2ggc3VjaGVuOiIKKworIzogZ3VpX2d0ay5jOjE2MjIgZ3VpX21vdGlmLmM6MjkwNgorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIkVyc2V0emVuIG1pdDoiCisKKyMuIGV4YWN0IG1hdGNoIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY1NCBndWlfbW90aWYuYzozMDA4Cittc2dpZCAiTWF0Y2ggZXhhY3Qgd29yZCBvbmx5IgorbXNnc3RyICJQYXNzZW5kIGb8ciBlaW56ZWxuZSBX9nJ0ZXIiCisKKyM6IGd1aV9ndGsuYzoxNjY2IGd1aV9tb3RpZi5jOjI5NzYKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIlJpY2h0dW5nIgorCisjLiAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIzogZ3VpX2d0ay5jOjE2NzggZ3VpX21vdGlmLmM6Mjk4OAorbXNnaWQgIlVwIgorbXNnc3RyICJBdWYiCisKKyM6IGd1aV9ndGsuYzoxNjgyIGd1aV9tb3RpZi5jOjI5OTYKK21zZ2lkICJEb3duIgorbXNnc3RyICJBYiIKKworIy4gJ0ZpbmQgTmV4dCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTcwNCBndWlfbW90aWYuYzoyNzc4Cittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICJTdWNoZSBO5GNoc3RlcyIKKworIy4gJ1JlcGxhY2UnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MjEgZ3VpX21vdGlmLmM6Mjc5NQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIkVyc2V0emVuIgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MzAgZ3VpX21vdGlmLmM6MjgwOAorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJBbGxlIEVyc2V0emVuIgorCisjOiBndWlfZ3RrX3gxMS5jOjEwNzkgZ3VpX3gxMS5jOjExOTkKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBEaXNwbGF5IGthbm4gbmljaHQgZ2X2ZmZuZXQgd2VyZGVuIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0OTQgZ3VpX3gxMS5jOjE5OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDogVW5iZWthbm50ZXIgRm9udHNldDogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjUxOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJBdXN3YWhsIGRlciBTY2hyaWZ0YXJ0IgorCisjOiBndWlfZ3RrX3gxMS5jOjI3NjQgZ3VpX21hYy5jOjI5ODIgZ3VpX3c0OC5jOjExOTcgZ3VpX3gxMS5jOjE4MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTogVW5iZWthbm50ZSBTY2hyaWZ0YXJ0OiAlcyIKKworIzogZ3VpX2d0a194MTEuYzoyNzc1IGd1aV94MTEuYzoxODU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogU2NocmlmdGFydCBcIiVzXCIgaGF0IGtlaW5lIGZlc3RlIEJyZWl0ZSIKKworIzogZ3VpX2d0a194MTEuYzozNTgwIHVpLmM6MTk3MQorbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIkNVVF9CVUZGRVIwIGFuc3RhdHQgZGVyIGxlZXJlbiBBdXN3YWhsIGJlbnV0enQiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTMgZ3VpX21vdGlmLmM6MTYxNgorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiRmlsdGVyIgorCisjOiBndWlfbW90aWYuYzoxNjE1Cittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIlZlcnplaWNobmlzc2UiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcKK21zZ2lkICJIZWxwIgorbXNnc3RyICJIaWxmZSIKKworIzogZ3VpX21vdGlmLmM6MTYxOAorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJEYXRlaWVuIgorCisjOiBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICJBdXN3YWhsIgorCisjOiBndWlfbW90aWYuYzoyODIxCittc2dpZCAiVW5kbyIKK21zZ3N0ciAiUvxja2fkbmdpZyIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkUyMzU6IFphcC1TY2hyaWZ0YXJ0ICclcycga2FubiBuaWNodCBnZWxhZGVuIHdlcmRlbiIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkUyMzU6IFNjaHJpZnRhcnQgJXMga2FubiBuaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJTZW5kZSBOYWNocmljaHQgenVtIEJlZW5kZW4gZGVzIEtpbmQtUHJvemVzc2VzLlxuIgorCisjOiBndWlfdzMyLmM6ODQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICIiCisiRTI0MzogQXJndW1lbnQgd2lyZCBuaWNodCB1bnRlcnN0/HR6dDogXCItJXNcIjsgdmVyd2VuZGUgZGllIE9MRSBWZXJzaW9uLiIKKworIy4gVE9ETzogTWF5IGJlIGNoYW5nZWQgdGhpcyBtZXNzYWdlCisjOiBndWlfdzMyLmM6MzQ0OCBndWlfdzMyLmM6MzQ4MSBndWlfeDExLmM6MzI1MgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogRmVobGVyIC0tIERhdGVuIGb8ciBEZWJ1Z2dlci1TeW1ib2wga29ubnRlbiBuaWNodCBnZWxlc2VuIHdlcmRlbiIKKworIzogZ3VpX3c0OC5jOjIwODEKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJTdWNoZSBaZWljaGVua2V0dGUgKGJlbvx0emUgJ1xcXFwnIHVtIGVpbiAnXFwnIHp1IGZpbmRlbikiCisKKyM6IGd1aV93NDguYzoyMTA2Cittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiU3VjaGUgJiBFcnNldHplICh1c2UgJ1xcXFwnIHVtIGVpbiAnXFwnIHp1IGZpbmRlbikiCisKKyM6IGd1aV94MTEuYzoxNDE5Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBcIkNvbG9ybWFwXCItRWludHJhZyBrYW5uIG5pY2h0IGFsbG96aWVydCB3ZXJkZW4sIGVpbmlnZSBGYXJiZW4gIgorImv2bm5lbiBmYWxzY2ggc2VpbiIKKworIzogZ3VpX3gxMS5jOjE5ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIiIKKyJFMjUwOiBTY2hyaWZ0YXJ0ZW4gZvxyIGRpZSBmb2xnZW5kZW4gWmVpY2hlbnPkdHplIGZlaGxlbiBpbSBcImZvbnRzZXRcIiAlczoiCisKKyM6IGd1aV94MTEuYzoyMDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IEZvbnRzZXQgTmFtZTogJXMiCisKKyM6IGd1aV94MTEuYzoyMDMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIlNjaHJpZnRhcnQgJyVzJyBoYXQga2VpbmUgZmVzdGUgYnJlaXRlIgorCisjOiBndWlfeDExLmM6MjA1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IEZvbnRzZXQgTmFtZTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIlNjaHJpZnRhcnQgMDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIlNjaHJpZnRhcnQgMTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIlNjaHJpZnRhcnQlZCBpc3QgbmljaHQgZG9wcGVsdCBzbyBicmVpdCB3aWUgU2NocmlmdGFydDBcbiIKKworIzogZ3VpX3gxMS5jOjIwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICJTY2hyaWZ0YXJ0MCBCcmVpdGU6ICVsZFxuIgorCisjOiBndWlfeDExLmM6MjA1NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisiU2NocmlmdGFydDEgQnJlaXRlOiAlbGRcbiIKKyJcbiIKKworIzogaGFuZ3VsaW4uYzo2MTAKK21zZ2lkICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCittc2dzdHIgIkUyNTY6IEhhbmd1bC1BdXRvbWF0IEZlaGxlciIKKworIzogaWZfY3Njb3BlLmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJWZXJ3ZW5kdW5nOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6NjcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIkRhdGVuYmFuayBoaW56dWb8Z2VuIgorCisjOiBpZl9jc2NvcGUuYzo2OQorbXNnaWQgIlF1ZXJ5IGZvciBhIHBhdHRlcm4iCittc2dzdHIgIk11c3RlciBzdWNoZW4iCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgImRpZXNlIE5hY2hyaWNodCBhbnplaWdlbiIKKworIzogaWZfY3Njb3BlLmM6NzMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiVmVyYmluZHVuZyBhYmJyZWNoZW4iCisKKyM6IGlmX2NzY29wZS5jOjc1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAiVmVyYmluZHVuZ2VuIHJlaW5pdGlhbGlzaWVyZW4iCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiVmVyYmluZHVuZ2VuIGFuemVpZ2VuIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIkRpZXNlciBjc2NvcGUtQmVmZWhsIHVudGVyc3T8dHp0IG5pY2h0IFRlaWxlbiBkZXMgRmVuc3RlcnMuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0MworbXNnaWQgIlVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJWZXJ3ZW5kdW5nOiBjc3RhZyA8aWRlbnQ+IgorCisjOiBpZl9jc2NvcGUuYzoxOTkKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IFRhZyBuaWNodCBnZWZ1bmRlbiIKKworIzogaWZfY3Njb3BlLmM6NDA3IGlmX2NzY29wZS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgInN0YXQoJXMpIEZlaGxlcjogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQ2MCBpZl9jc2NvcGUuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICJjc29wZSBEYXRlbmJhbmsgJXMgaGluenVnZWb8Z3QiCisKKyM6IGlmX2NzY29wZS5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIiVzIGlzdCBrZWluIFZlcnplaWNobmlzIG9kZXIgenVs5HNzaWdlIGNzY29wZSBEYXRlbmJhbmsiCisKKyM6IGlmX2NzY29wZS5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJGZWhsZXIgYmVpbSBMZXNlbiBhdXMgZGVyIGNzY29wZSBWZXJiaW5kdW5nICVkIgorCisjOiBpZl9jc2NvcGUuYzo2MzMKK21zZ2lkICJ1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAidW5iZWthbm50ZXIgY3Njb3BlIFN1Y2h0eXAiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJjc2NvcGUgUGlwZXMga29ubnRlbiBuaWNodCBhbmdlbGVndCB3ZXJkZW4iCisKKyM6IGlmX2NzY29wZS5jOjc0NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIG1pc3NsYW5nIgorCisjOiBpZl9jc2NvcGUuYzo3NTUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gdm9uIHRvX2ZwIG1pc3NsYW5nIgorCisjOiBpZl9jc2NvcGUuYzo3NTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gdm9uIGZyX2ZwIG1pc3NsYW5nIgorCisjOiBpZl9jc2NvcGUuYzo3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgImtlaW5lIFZlcmJpbmR1bmdlbiB6dSBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGtlaW5lIFRyZWZmZXIgZ2VmdW5kZW4gZvxyIGNzY29wZSBBbmZyYWdlbiAlcyBhdXMgJXMiCisKKyM6IGlmX2NzY29wZS5jOjg5OQorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY3Njb3BlIEJlZmVobGU6XG4iCisKKyM6IGlmX2NzY29wZS5jOjkwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKVxuIgorbXNnc3RyICIlLTVzOiAlLTMwcyAoVmVyd2VuZHVuZzogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJjc2NvcGUgRGF0ZW5iYW5rIG5pY2h0IGRvcHBlbHQgaGluenVnZWb8Z3QiCisKKyM6IGlmX2NzY29wZS5jOjk4MQorbXNnaWQgIm1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJtYXhpbWFsZSBBbnphaGwgdm9uIGNzY29wZSBWZXJiaW5kdW5nZW4gZXJyZWljaHQiCisKKyM6IGlmX2NzY29wZS5jOjExMDIKK21zZ2lkICJFMjYwOiBjc2NvcGUgY29ubmVjdGlvbiBub3QgZm91bmQiCittc2dzdHIgIkUyNjA6IGtlaW5lIGNzY29wZSBWZXJiaW5kdW5nIGdlZnVuZGVuIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY3Njb3BlIFZlcmJpbmR1bmcgJXMgbmljaHQgZ2VmdW5kZW4iCisKKyM6IGlmX2NzY29wZS5jOjExNDEKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiBjbG9zZWQiCittc2dzdHIgImNzY29wZSBWZXJiaW5kdW5nIGdlc2NobG9zc2VuIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgVmVyYmluZHVuZyAlcyBnZXNjaGxvc3NlblxuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjEyOTAKK21zZ2lkICJmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiZmF0YWxlciBGZWhsZXIgaW4gY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjEzNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MjogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiRTI2MjogRmVobGVyIGJlaW0gTGVzZW4gYXVzIGRlciBjc2NvcGUgVmVyYmluZHVuZyAlZCIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICJGZWhsZXIgYmVpbSBhbGxvemllcmVuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIFRhZzogJXNcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorbXNnaWQgIiAgICMgICBsaW5lIgorbXNnc3RyICIgICAjICBaZWlsZSIKKworIzogaWZfY3Njb3BlLmM6MTQ2MAorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAiRGF0ZWluYW1lIC8gS29udGV4dCAvIFplaWxlXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MTgKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAiYWxsZSBjc2NvcGUgRGF0ZW5iYW5rZW4genVy/GNrZ2VzZXR6dCIKKworIzogaWZfY3Njb3BlLmM6MTc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICJrZWluZSBjc2NvcGUtVmVyYmluZHVuZ2VuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgIERhdGVuYmFuayBOYW1lXHQgICAgICAgICAgICAgICAgICAgIGb8aHJlbmRlciBQZmFkXG4iCisKKyM6IGlmX2NzY29wZS5jOjE4MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTJkICUtNWxkICAlLTM0cyAgPG5vbmU+XG4iCittc2dzdHIgIiUyZCAlLTVsZCAgJS0zNHMgIDxrZWluZT5cbiIKKworIzogaWZfcHl0aG9uLmM6MjU1IGlmX3J1YnkuYzoyNjAgaWZfdGNsLmM6MTk1IG1ieXRlLmM6MjYzMyBvc193aW4zMi5jOjI2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiBCaWJsaW90aGVrICVzIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbiIKKworIzogaWZfcHl0aG9uLmM6MjY3IGlmX3J1YnkuYzoyNzIgaWZfdGNsLmM6MjA2IG1ieXRlLmM6MjY0OSBvc193aW4zMi5jOjI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiBCaWJsaW90aGVrcy1GdW5rdGlvbiAlcyBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJkZW4iCisKKyM6IGlmX3B5dGhvbi5jOjM5MgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogRGllc2VyIEJlZmVobCBpc3QgbmljaHQgdmVyZvxnYmFyLCBkaWUgUHl0aG9uIEJpYmxpb3RoZWsga29ubnRlIG5pY2h0ICIKKyJnZWxhZGVuIHdlcmRlbiIKKworIzogaWZfcHl0aG9uLmM6NTkyCittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJPdXRwdXRPYmplY3QtQXR0cmlidXRlIGv2bm5lbiBuaWNodCBnZWz2c2NodCB3ZXJkZW4iCisKKyM6IGlmX3B5dGhvbi5jOjU5OQorbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgIlwic29mdHNwYWNlXCIgbXVzcyBlaW5lIGdhbnplIFphaGwgc2VpbiIKKworIzogaWZfcHl0aG9uLmM6NjA3Cittc2dpZCAiaW52YWxpZCBhdHRyaWJ1dGUiCittc2dzdHIgInVuenVs5HNzaWdlcyBBdHRyaWJ1dCIKKworIzogaWZfcHl0aG9uLmM6NjQ2IGlmX3B5dGhvbi5jOjY2MAorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSB2ZXJsYW5ndCBlaW5lIExpc3RlIHZvbiBaZWljaGVuZm9sZ2VuIgorCisjOiBpZl9weXRob24uYzo3ODYKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBGZWhsZXIgYmVpIGRlciBJbml0aWFsaXNpZXJ1bmcgdm9uIEkvTyBPYmpla3RlbiIKKworIzogaWZfcHl0aG9uLmM6OTcxIGlmX3RjbC5jOjE0MDMKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgInVuZ/xsdGlnZXIgQXVzZHJ1Y2siCisKKyM6IGlmX3B5dGhvbi5jOjk4NSBpZl90Y2wuYzoxNDA4Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJBdXNkcvxja2Ugd3VyZGVuIHp1ciBaZWl0IGRlcyDcYmVyc2V0emVucyBuaWNodCB6dWdlbGFzc2VuIgorCisjOiBpZl9weXRob24uYzo5OTgKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJWZXJzdWNoLCBCZXp1ZyBhdWYgZWluZW4gZ2Vs9nNjaHRlbiBQdWZmZXIgenUgbmVobWVuIgorCisjOiBpZl9weXRob24uYzoxMDEzIGlmX3B5dGhvbi5jOjEwNTQgaWZfcHl0aG9uLmM6MTExOCBpZl90Y2wuYzoxMjE1Cittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICJaZWlsZW5udW1tZXIgYXXfZXJoYWxiIGRlcyB6dWzkc3NpZ2VuIEJlcmVpY2hzIgorCisjOiBpZl9weXRob24uYzoxMjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPFB1ZmZlcm9iamVrdCAoZ2Vs9nNjaHQpIGJlaSAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM0MiBpZl90Y2wuYzo4MzcKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAidW5n/Gx0aWdlciBOYW1lIGVpbmVyIE1hcmtpZXJ1bmciCisKKyM6IGlmX3B5dGhvbi5jOjE2MTcKK21zZ2lkICJubyBzdWNoIGJ1ZmZlciIKK21zZ3N0ciAia2VpbiBzb2xjaGVyIFB1ZmZlciB2b3JoYW5kZW4iCisKKyM6IGlmX3B5dGhvbi5jOjE3MDUKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICJWZXJzdWNoLCBCZXp1ZyBhdWYgZWluZSBnZWz2c2NodGVzIEZlbnN0ZXIgenUgbmVobWVuIgorCisjOiBpZl9weXRob24uYzoxNzUwCittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJudXItTGVzZW4gQXR0cmlidXQiCisKKyM6IGlmX3B5dGhvbi5jOjE3NjMKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIkN1cnNvciBQb3NpdGlvbiBhdd9lcmhhbGIgZGVzIFB1ZmZlcnMiCisKKyM6IGlmX3B5dGhvbi5jOjE4NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPEZlbnN0ZXJvYmpla3QgKGdlbPZzY2h0KSBiZWkgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODUyCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjxGZW5zdGVyb2JqZWt0ICh1bmJla2FubnQpIGJlaSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxGZW5zdGVyICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzMAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICJ1bmf8bHRpZ2VzIEZlbnN0ZXIiCisKKyM6IGlmX3B5dGhvbi5jOjIxODcgaWZfcHl0aG9uLmM6MjIyMiBpZl9weXRob24uYzoyMjcyIGlmX3B5dGhvbi5jOjIzMzUKKyM6IGlmX3B5dGhvbi5jOjI0NTUgaWZfcHl0aG9uLmM6MjUwNyBpZl90Y2wuYzo2ODUgaWZfdGNsLmM6NzMwIGlmX3RjbC5jOjgwNAorIzogaWZfdGNsLmM6ODc0IGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICJSZXZlcnRpZXJ1bmdzLUluZm9ybWF0aW9uIGthbm4gbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuIgorCisjOiBpZl9weXRob24uYzoyMTg5IGlmX3B5dGhvbi5jOjIyNzkgaWZfcHl0aG9uLmM6MjM0NgorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAiWmVpbGUga2FubiBuaWNodCBnZWz2c2NodCB3ZXJkZW4iCisKKyM6IGlmX3B5dGhvbi5jOjIyMjQgaWZfcHl0aG9uLmM6MjM2MiBpZl90Y2wuYzo2OTEgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIlplaWxlIGthbm4gbmljaHQgZXJzZXR6dCB3ZXJkZW4iCisKKyM6IGlmX3B5dGhvbi5jOjIzNzggaWZfcHl0aG9uLmM6MjQ1NyBpZl9weXRob24uYzoyNTE1Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICJaZWlsZSBrYW5uIG5pY2h0IGVpbmdlZvxndCB3ZXJkZW4iCisKKyM6IGlmX3B5dGhvbi5jOjI2MTkKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgIlplaWNoZW5mb2xnZSBrYW5uIGtlaW5lIFplaWxlbi13ZWNoc2VsIGVudGhhbHRlbiIKKworIzogaWZfcnVieS5jOjQwMQorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2NjogRGllc2VyIEJlZmVobCBpc3QgbmljaHQgdmVyZvxnYmFyLCBkaWUgUnVieSBCaWJsaW90aGVrIGtvbm50ZSBuaWNodCAiCisiZ2VsYWRlbiB3ZXJkZW4iCisKKyM6IGlmX3J1YnkuYzo0NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogVW5iZWthbm50ZXIgbG9uZ2ptcCBTdGF0dXMgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiVW1zY2hhbHR1bmcgendpc2NoZW4gSW1wbGVtZW50aWVydW5nL0RlZmluaXRpb24iCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlplaWdlIEJhc2lzLUtsYXNzZSB2b24iCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJaZWlnZSD8YmVyc2NocmllYmVuZSBNaXRnbGllZHMtRnVua3Rpb24iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIkJlemllaGUgYXVzIERhdGVpIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJCZXppZWhlIGF1cyBQcm9qZWt0IgorCisjOiBpZl9zbmlmZi5jOjczCittc2dpZCAiUmV0cmlldmUgZnJvbSBhbGwgcHJvamVjdHMiCittc2dzdHIgIkJlemllaGUgYXVzIGFsbGVuIFByb2pla3RlbiIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICJCZXppZWhlIgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIlplaWdlIGRpZSBRdWVsbGUgdm9uIgorCisjOiBpZl9zbmlmZi5jOjc2Cittc2dpZCAiRmluZCBzeW1ib2wiCittc2dzdHIgIkZpbmRlIFN5bWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAiRHVyY2hzZWhlIEtsYXNzZW4iCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiWmVpZ2UgS2xhc3NlIGluIEhpZXJhcmNoaWUiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJaZWlnZSBLbGFzc2UgaW4gZWluZ2VzY2hy5G5rdGVyIEhpZXJhcmNoaWUiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiBiZXppZWh0IHNpY2ggYXVmIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiBoYXQgQmV6/GdlIHp1IgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiBoYXQgZWluIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHdpcmQgdmVyd2VuZGV0IHZvbiIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAiWmVpZ2UgRG9jdSBhdXMiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiR2VuZXJpZXJlIERvY3UgZvxyIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisiS2FubiBrZWluZSB2ZXJiaW5kdW5nIHp1IFNOaUZGKyBhdWZuZWhlbWVuLiBQcvxmZSBkaWUgVW1nZWJ1bmcgKHNuaWZmZW1hY3MgIgorIm11c3MgaW4gJFBBVEgpIHp1IGZpbmRlbiBzZWluLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogRmVobGVyIGJlaW0gTGVzZW4uIFZlcmJpbmR1bmcgYWJnZWJyb2NoZW4iCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBpc3QgenVyIFplaXQiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAibmljaHQiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJ2ZXJidW5kZW4iCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBVbmJla2FubnRlIFNOaUZGKyBBbmZyYWdlOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRmVobGVyIGJlaW0gSGVyc3RlbGxlbiBkZXIgVmVyYmluZHVuZyBtaXQgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIGlzdCBuaWNodCB2ZXJidW5kZW4iCisKKyM6IGlmX3NuaWZmLmM6MTAxOAorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IElzdCBrZWluIFNOaUZGKyBQdWZmZXIiCisKKyM6IGlmX3NuaWZmLmM6MTA4MworbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6IEZlaGxlciBiZWltIFNjaHJlaWJlbi4gVmVyYmluZHVuZyBhYmdlYnJvY2hlbiIKKworIzogaWZfdGNsLmM6NDE5Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJ1bmf8bHRpZ2UgUHVmZmVyLU51bW1lciIKKworIzogaWZfdGNsLmM6NDY1IGlmX3RjbC5jOjkzMiBpZl90Y2wuYzoxMTExCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibmljaHQgaW1wbGVtZW50aWVydCIKKworIzogaWZfdGNsLmM6NTAyCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgInVuYmVrYW5udGUgT3B0aW9uIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NQorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAia2FubiBrZWluZSBaZWlsZS9aZWlsZW4gc2V0emVuIgorCisjOiBpZl90Y2wuYzo4NDYKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIk1hcmtlIG5pY2h0IGdlc2V0enQiCisKKyM6IGlmX3RjbC5jOjg1MiBpZl90Y2wuYzoxMDY3CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgIlplaWxlICVkIFNwYWx0ZSAlZCIKKworIzogaWZfdGNsLmM6ODgyCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAia2FubiBaZWlsZSBuaWNodCBlaW4tL2FuZvxnZW4iCisKKyM6IGlmX3RjbC5jOjEyNjkKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAidW5iZWthbm50ZXMgRmxhZzogIgorCisjOiBpZl90Y2wuYzoxMzM5Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgInVuYmVrYW5udGUgdmltIE9wdGlvbiIKKworIzogaWZfdGNsLmM6MTQyNAorbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAiVGFzdGF0dXItVW50ZXJicmVjaHVuZyIKKworIzogaWZfdGNsLmM6MTQyOQorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAidmltIEZlaGxlciIKKworIzogaWZfdGNsLmM6MTQ3MgorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorIlB1ZmZlci9GZW5zdGVyLUJlZmVobCBrYW5uIG5pY2h0IGF1c2dlZvxocnQgd2VyZGVuOiBkYXMgT2JqZWt0IHdpcmQgZ2Vs9nNjaHQiCisKKyM6IGlmX3RjbC5jOjE1NDYKK21zZ2lkICIiCisiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgaXMgYWxyZWFkeSBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisia2FubiBrZWluZW4gQ2FsbGJhY2stQmVmZWhsIHJlZ2lzdHJpZXJlbjogUHVmZmVyL0ZlbnN0ZXIgaXN0IGJlcmVpdHMgZ2Vs9nNjaHQiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wgRkFUQUxFUiBGRUhMRVI6IHJlZmxpc3Qga2FwdXR0IT8gQml0dGUgYmVuYWNocmljaHRpZ2VuIFNpZSB2aW0tIgorImRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTY0Cittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorImthbm4ga2VpbmVuIENhbGxiYWNrLUJlZmVobCByZWdpc3RyaWVyZW46IFB1ZmZlci9GZW5zdGVyLVJlZmVyZW56IG5pY2h0ICIKKyJnZWZ1bmRlbiIKKworIzogaWZfdGNsLmM6MTcyNQorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkRpZXNlciBCZWZlaGwgaXN0IG5pY2h0IHZlcmb8Z2JhciwgZGEgZGllIFRjbCBCaWJsaW90aGVrIG5pY2h0IGdlbGFkZW4gIgorIndlcmRlbiBrb25udGUiCisKKyM6IGlmX3RjbC5jOjE4ODcKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wgRkVITEVSOiBFeGl0LUNvZGUgaXN0IG5pY2h0IGludCE/IEJpdHRlIGJlbmFjaHJpY2h0aWdlbiBTaWUgdmltLSIKKyJkZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNworbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAia2FubiBaZWlsZSBuaWNodCBlcmhhbHRlbiIKKworIzogaWZfeGNtZHNydi5jOjIxMworbXNnaWQgIlVuYWJsZSB0byByZWdpc3RlciBhIGNvbW1hbmQgc2VydmVyIG5hbWUiCittc2dzdHIgIkJlZmVobHMtU2VydmVyIE5hbWUga2FubiBuaWNodCByZWdpc3RyaWVydCB3ZXJkZW4iCisKKyM6IGlmX3hjbWRzcnYuYzo0MzQgb3NfbXN3aW4uYzoyMTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogS2VpbiByZWdpc3RyaWVydGVyIFNlcnZlci1OYW1lIFwiJXNcIiIKKworIzogaWZfeGNtZHNydi5jOjQ2MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IFNjaGlja2VuIGRlcyBCZWZlaGxzIHp1bSBaaWVsLVByb2dyYW1tIHNjaGx1ZyBmZWhsIgorCisjOiBpZl94Y21kc3J2LmM6NzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJVbmf8bHRpZ2UgU2VydmVyLUlEIHZlcndlbmRldDogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMDc5Cittc2dpZCAiRTI0OTogY291bGRuJ3QgcmVhZCBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkiCittc2dzdHIgIkUyNDk6IFJlZ2lzdHJ5LUVpZ2Vuc2NoYWZ0IGRlciBWSU0gSW5zdGFueiBrb25udGUgbmljaHQgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IGlmX3hjbWRzcnYuYzoxMDkwCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiBSZWdpc3RyeS1FaWdlbnNjaGFmdCBkZXIgVklNIEluc3RhbnogaXN0IGZlaGxlcmhhZnQuICBHZWz2c2NodCEiCisKKyM6IG1haW4uYzo1MyBvcHRpb24uYzozMTYyIG9wdGlvbi5jOjMyNjkKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiVW5iZWthbm50ZSBPcHRpb24iCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJadSB2aWVsZSBFZGl0b3IgQXJndW1lbnRlIgorCisjOiBtYWluLmM6NTcKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJBcmd1bWVudCBmZWhsdCBuYWNoIgorCisjOiBtYWluLmM6NTkKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAiU2Nocm90dCBuYWNoIGRlciBPcHRpb24iCisKKyM6IG1haW4uYzo2MQorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiBvciBcIi1jIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlp1IHZpZWxlIFwiK2NvbW1hbmRcIiBvZGVyIFwiLWMgY29tbWFuZFwiIEFyZ3VtZW50ZSIKKworIzogbWFpbi5jOjYzCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIlVuZ/xsdGlnZXMgQXJndW1lbnQgZvxyIgorCisjOiBtYWluLmM6NDUwCittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICJWaW0gd3VyZGUgbmljaHQgbWl0IGRlciBcImRpZmZcIi1FaWdlbnNjaGFmdCD8YmVyc2V0enQiCisKKyM6IG1haW4uYzo4NzUKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICJWZXJzdWNoZSwgZGllIFNrcmlwdC1EYXRlaSBlcm5ldXQgenUg9mZmbmVuOiBcIiIKKworIzogbWFpbi5jOjg3OSBtYWluLmM6ODg2IG1haW4uYzo5MzAgbWVtbGluZS5jOjM2NzMgbWVtbGluZS5jOjM2NzcKKyM6IHZlcnNpb24uYzo4NTggdmVyc2lvbi5jOjg2MyB2ZXJzaW9uLmM6ODY4IHZlcnNpb24uYzo4NzMgdmVyc2lvbi5jOjg3OAorIzogdmVyc2lvbi5jOjg4MyB2ZXJzaW9uLmM6ODg5IHZlcnNpb24uYzo4OTMgdmVyc2lvbi5jOjg5NyB2ZXJzaW9uLmM6OTAyCisjOiB2ZXJzaW9uLmM6OTA5IHZlcnNpb24uYzo5MTcgdmVyc2lvbi5jOjkyMworbXNnaWQgIlwiXG4iCittc2dzdHIgIlwiXG4iCisKKyM6IG1haW4uYzo4ODQKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgImthbm4gbmljaHQgenVtIExlc2VuIGdl9mZmbmV0IHdlcmRlbjogXCIiCisKKyM6IG1haW4uYzo5MjgKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgImthbm4gbmljaHQgenVyIFNrcmlwdC1BdXNnYWJlIGdl9mZmbmV0IHdlcmRlbjogXCIiCisKKyM6IG1haW4uYzoxMDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiJWQgRGF0ZWllbiB6dXIgQmVhcmJlaXR1bmdcbiIKKworIzogbWFpbi5jOjExMTgKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IFdhcm51bmc6IERpZSBBdXNnYWJlIGVyZm9sZ3QgbmljaHQgYXVmIGVpbmVtIFRlcm1pbmFsXG4iCisKKyM6IG1haW4uYzoxMTIwCittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogV2FybnVuZzogRGllIEVpbmdhYmUga29tbXQgbmljaHQgdm9uIGVpbmVtIFRlcm1pbmFsXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE5NQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyBCZWZlaGxzLVplaWxlIgorCisjOiBtYWluLmM6MTIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogS2FubiBuaWNodCB2b24gXCIlc1wiIGxlc2VuIgorCisjOiBtYWluLmM6MjIwOQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiV2VpdGVyZSBJbmZvcm1hdGlvbmVuIG1pdDogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjI0MgorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbRGF0ZWkgLi5dICAgICAgZWRpdGllcmUgZGllIGFuZ2VnZWJlbmVuIERhdGVpKC1lbikiCisKKyM6IG1haW4uYzoyMjQzCittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgbGVzZSBUZXh0IHZvbiBzdGRpbiIKKworIzogbWFpbi5jOjIyNDQKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCB0YWcgICAgICAgICAgZWRpdGllcmUgRGF0ZWkgaW4gZGVyIGRlciBUYWcgZGVmaW5pZXJ0IHd1cmRlIgorCisjOiBtYWluLmM6MjI0NgorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW0ZlaGxlci1EYXRlaV0gIGVkaXRpZXJlIERhdGVpIG1pdCBlcnN0ZW0gRmVobGVyIgorCisjOiBtYWluLmM6MjI1NQorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJWZXJ3ZW5kdW5nOiIKKworIzogbWFpbi5jOjIyNTgKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbQXJndW1lbnRlXSAiCisKKyM6IG1haW4uYzoyMjYyCittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIG9kZXI6IgorCisjOiBtYWluLmM6MjI2NQorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudGU6XG4iCisKKyM6IG1haW4uYzoyMjY2Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHRIaWVybmFjaCBudXIgRGF0ZWktTmFtZW4iCisKKyM6IG1haW4uYzoyMjY4Cittc2dpZCAiLS1saXRlcmFsXHRcdERvbid0IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIi0tbGl0ZXJhbFx0XHRQbGF0emhhbHRlciB3ZXJkZW4gbmljaHQgYXVzZ2V3ZXJ0ZXQiCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLXJlZ2lzdGVyXHRcdFJlZ2lzdGVyIHRoaXMgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx0UmVnaXN0cmllcmUgZGllc2VuIGd2aW0gaW4gT0xFIgorCisjOiBtYWluLmM6MjI3MgorbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHREZXJlZ2lzdHJpZXJlIGd2aW0gYXVzIE9MRSIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICItZ1x0XHRcdFJ1biB1c2luZyBHVUkgKGxpa2UgXCJndmltXCIpIgorbXNnc3RyICItZ1x0XHRcdFN0YXJ0IGFscyBHVUkgKHdpZSBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyMjc2Cittc2dpZCAiLWZcdFx0XHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZlx0XHRcdEZvcmRlcmdydW5kOiBLZWluIFwiZm9ya1wiIGJlaW0gU3RhcnQgZGVzIEdVSSIKKworIzogbWFpbi5jOjIyNzgKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaSBNb2R1cyAod2llIFwidmlcIikiCisKKyM6IG1haW4uYzoyMjc5Cittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0RXggTW9kdXMgKHdpZSBcImV4XCIpIgorCisjOiBtYWluLmM6MjI4MAorbXNnaWQgIi1zXHRcdFx0U2lsZW50IChiYXRjaCkgbW9kZSAob25seSBmb3IgXCJleFwiKSIKK21zZ3N0ciAiLXNcdFx0XHRMZWlzZXIgKGJhdGNoKSBNb2R1cyAobnVyIGb8ciBcImV4XCIpIgorCisjOiBtYWluLmM6MjI4MgorbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmIE1vZHVzICh3aWUgXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjI4NAorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0TGVpY2h0ZXIgTW9kdXMgKHdpZSBcImV2aW1cIiwgb2huZSBNb2RpKSIKKworIzogbWFpbi5jOjIyODUKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdE1vZHVzIG9obmUgU2NocmVpYnJlY2h0ZSAod2llIFwidmlld1wiKSIKKworIzogbWFpbi5jOjIyODYKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0RWluZ2VzY2hy5G5rdGVyIE1vZHVzICh3aWUgXCJydmltXCIpIgorCisjOiBtYWluLmM6MjI4NworbXNnaWQgIi1tXHRcdFx0TW9kaWZpY2F0aW9ucyAod3JpdGluZyBmaWxlcykgbm90IGFsbG93ZWQiCittc2dzdHIgIi1tXHRcdFx0TW9kaWZpa2F0aW9lbiAoYmVpbSBTY2hyZWliZW4gdm9uIERhdGVpZW4pIHNpbmQgbmljaHQgZXJsYXVidCIKKworIzogbWFpbi5jOjIyODgKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHRNb2RpZmlrYXRpb2VuIGltIFRleHQgbmljaHQgZXJsYXVidCIKKworIzogbWFpbi5jOjIyODkKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdEJpbuRybW9kdXMiCisKKyM6IG1haW4uYzoyMjkxCittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx0TGlzdCBNb2R1cyIKKworIzogbWFpbi5jOjIyOTMKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdEtvbXBhdGliZWwgenUgVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjIyOTQKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHROaWNodCBnYW56IGtvbXBhdGliZWwgenUgVmk6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjI5NQorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdFZlcmJvc2UgU3R1ZmUiCisKKyM6IG1haW4uYzoyMjk2Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHREZWJ1ZyBNb2R1cyIKKworIzogbWFpbi5jOjIyOTcKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdEtlaW5lIEF1c2xhZ2VydW5ncy1EYXRlaSwgdmVyd2VuZGUgbnVyIFNwZWljaGVyIgorCisjOiBtYWluLmM6MjI5OAorbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdExpc3RlIG51ciBBdXNsYWdlcnVuZ3MtRGF0ZWllbiBhdWYiCisKKyM6IG1haW4uYzoyMjk5Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIChtaXQgRGF0ZWluYW1lKVx0U3RlbGxlIGFiZ2VzdPxyenRlIFNlc3Npb24gd2llZGVyIGhlciIKKworIzogbWFpbi5jOjIzMDAKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0R2VuYXVzbyB3aWUgeiAtciIKKworIzogbWFpbi5jOjIzMDIKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0VmVyd2VuZGUgbmljaHQgbmV3Y2xpIHp1bSDWZmZuZW4gZWluZXMgbmV1ZW4gRmVuc3RlcnMiCisKKyM6IG1haW4uYzoyMzAzCittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHRWZXJ3ZW5kZSA8ZGV2aWNlPiBmb3IgSS9PIgorCisjOiBtYWluLmM6MjMwNgorbXNnaWQgIi1IXHRcdFx0c3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0U3RhcnQgaW0gSGVicuRpc2NoZW4gTW9kdXMiCisKKyM6IG1haW4uYzoyMzA5Cittc2dpZCAiLUZcdFx0XHRzdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdFN0YXJ0IGltIEZhcnNpIE1vZHVzIgorCisjOiBtYWluLmM6MjMxMQorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdFNldHplIFRlcm1pbmFsLVR5cCBhdWYgPHRlcm1pbmFsPiIKKworIzogbWFpbi5jOjIzMTIKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRCZW51dHplIDx2aW1yYz4gYW5zdGF0dCBqZWdsaWNoZXIgLnZpbXJjIgorCisjOiBtYWluLmM6MjMxNAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRCZW51dHplIDxndmltcmM+IGFuc3RhdHQgamVnbGljaGVyIC5ndmltcmMiCisKKyM6IG1haW4uYzoyMzE2Cittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdGxhZGUga2VpbmUgXCJwbHVnaW5cIi1Ta3JpcHRlIgorCisjOiBtYWluLmM6MjMxNworbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdNZmZm5lIE4gRmVuc3RlciAoVm9yZ2FiZTogZWluemVsbiBm/HIgamVkZSBEYXRlaSkiCisKKyM6IG1haW4uYzoyMzE4Cittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0d2llIC1vLCBhYmVyIHRlaWxlIHZlcnRpa2FsIgorCisjOiBtYWluLmM6MjMxOQorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdFN0YXJ0ZSBhbSBFbmRlIGRlciBEYXRlaSIKKworIzogbWFpbi5jOjIzMjAKK21zZ2lkICIrPGxudW0+XHRcdFN0YXJ0IGF0IGxpbmUgPGxudW0+IgorbXNnc3RyICIrPGxudW0+XHRcdFN0YXJ0IGluIFplaWxlIDxsbnVtPiIKKworIzogbWFpbi5jOjIzMjIKK21zZ2lkICItLWNtZCA8Y29tbWFuZD5cdEV4ZWN1dGUgPGNvbW1hbmQ+IGJlZm9yZSBsb2FkaW5nIGFueSB2aW1yYyBmaWxlIgorbXNnc3RyICItLWNtZCA8QmVmZWhsPlx0RvxocmUgPEJlZmVobD4gdm9yIGRlbSBMYWRlbiBqZWdsaWNoZXIgdmltcmMgRGF0ZWkgYXVzIgorCisjOiBtYWluLmM6MjMyNAorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8QmVmZWhsPlx0XHRG/GhyZSA8QmVmZWhsPiBuYWNoIGRlbSBMYWRlbiBkZXIgZXJzdGVuIERhdGVpIGF1cyIKKworIzogbWFpbi5jOjIzMjUKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNzaW9uPlx0XHRMZXNlIERhdGVpIDxzZXNzaW9uPiBuYWNoIGRlbSBMYWRlbiBkZXIgZXJzdGVuIERhdGVpIgorCisjOiBtYWluLmM6MjMyNgorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIiIKKyItcyA8c2NyaXB0aW4+XHRMZXNlIE5vcm1hbC1Nb2R1cyBCZWZlaGxlIGF1cyBkZXIgU2tyaXB0LURhdGVpIDxzY3JpcHRpbj4iCisKKyM6IG1haW4uYzoyMzI3Cittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNjcmlwdG91dD5cdEJlZmVobGUgYW0gRW5kZSBkZXIgU2tyaXB0LURhdGVpIDxzY3JpcHRvdXQ+IGFuZvxnZW4iCisKKyM6IG1haW4uYzoyMzI4Cittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx0U2NocmVpYmUgQmVmZWhsZSBpbiBkaWUgU2tyaXB0LURhdGVpIDxzY3JpcHRvdXQ+IgorCisjOiBtYWluLmM6MjMzMAorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0RWRpdGllcmUga29kaWVydGUgRGF0ZWllbiIKKworIzogbWFpbi5jOjIzMzQKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRTdGFydGUgdmltIDxkaXNwbGF5PiIKKworIzogbWFpbi5jOjIzMzYKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdHN0ZWxsZSBrZWluZSBWZXJiaW5kdW5nIHp1bSBYLXNlcnZlciBoZXIiCisKKyM6IG1haW4uYzoyMzM4Cittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx01mZmbmUgVmltIGluIGVpbmVtIGFuZGVyZW4gR1RLIHdpZGdldCIKKworIzogbWFpbi5jOjIzNDIKK21zZ2lkICItLXJlbW90ZSA8ZmlsZXM+XHRFZGl0IDxmaWxlcz4gaW4gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZSA8RGF0ZWllbj5cdEVkaXRpZXJlIDxEYXRlaWVuPiBpbiBlaW5lbSBWaW0gU2VydmVyIHVuZCBiZWVuZGUiCisKKyM6IG1haW4uYzoyMzQzCittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxEYXRlaWVuPiAgV2llIC0tcmVtb3RlLCBhYmVyIHdhcnRlLCBiaXMgZGllIDxEYXRlaWVuPiAiCisiZWRpdGllcnQgd3VyZGVuIgorCisjOiBtYWluLmM6MjM0NAorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTY2hpY2tlIDxrZXlzPiB6dSBlaW5lbSBWaW0gU2VydmVyIHVuZCBiZWVuZGUiCisKKyM6IG1haW4uYzoyMzQ1Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLWV4cHIgPEF1c2RydWNrPlx0RvxocmUgPEF1c2RydWNrPiBpbiBlaW5lbSBWaW0gU2VydmVyIGF1cyB1bmQgIgorImRydWNrZSBkYXMgRXJnZWJuaXMiCisKKyM6IG1haW4uYzoyMzQ2Cittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHREcnVja2UgdmVyZvxnYmFyZSBWaW0gU2VydmVyIE5hbWVuIHVuZCBiZWVuZGUiCisKKyM6IG1haW4uYzoyMzQ3Cittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlcm5hbWUgPE5hbWU+XHRCZW51dHplIGRlbiBWaW0gc2VydmVyIDxOYW1lPiIKKworIzogbWFpbi5jOjIzNTAKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0QmVudXR6ZSA8dmltaW5mbz4gc3RhdHQgLnZpbWluZm8iCisKKyM6IG1haW4uYzoyMzUyCittc2dpZCAiLWhcdFx0XHRwcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaFx0XHRcdGRydWNrZSBudXIgSGlsZmUgKGRpZXNlIE5hY2hyaWNodCkiCisKKyM6IG1haW4uYzoyMzUzCittc2dpZCAiLS12ZXJzaW9uXHRcdHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHREcnVja2UgbnVyIFZlcnNpb25zLUluZm9ybWF0aW9uZW4iCisKKyM6IG1haW4uYzoyMzU3Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnRlIGb8ciBkaWUgZ3ZpbSBNb3RpZiBWZXJzaW9uOlxuIgorCisjOiBtYWluLmM6MjM2MAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudGUgZvxyIGRpZSBndmltIEF0aGVuYSBWZXJzaW9uOlxuIgorCisjOiBtYWluLmM6MjM2MworbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0U3RhcnRlIHZpbSBhdWYgPGRpc3BsYXk+IgorCisjOiBtYWluLmM6MjM2NAorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHRTdGFydGUgdmltIGFscyBJY29uIgorCisjOiBtYWluLmM6MjM2NgorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYW1lPlx0XHRCZW51dHplIHNvIGFscyBvYiB2aW0gPG5hbWU+IGhpZd9lIgorCisjOiBtYWluLmM6MjM2NworbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKE5pY2h0IGltcGxlbWVudGllcnQpXG4iCisKKyM6IG1haW4uYzoyMzY5Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICIiCisiLWJhY2tncm91bmQgPEZhcmJlPlx0QmVudXR6ZSA8RmFyYmU+IGb8ciBkZW4gSGludGVyZ3J1bmQgKGF1Y2ggbWl0OiAtYmcpIgorCisjOiBtYWluLmM6MjM3MAorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiIgorIi1mb3JlZ3JvdW5kIDxGYXJiZT5cdEJlbnV0emUgPEZhcmJlPiBm/HIgZGVuIFRleHQgVm9yZGVyZ3J1bmQgKGF1Y2ggbWl0OiAtZmcpIgorCisjOiBtYWluLmM6MjM3MSBtYWluLmM6MjM5MQorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiIgorIi1mb250IDxTY2hyaWZ0YXJ0Plx0QmVudXR6ZSA8U2NocmlmdGFydD4gZvxyIG5vcm1hbGVuIFRleHQgKGF1Y2ggbWl0OiAtZm4pIgorCisjOiBtYWluLmM6MjM3MgorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxTY2hyaWZ0YXJ0Plx0QmVudXR6ZSA8U2NocmlmdGFydD4gZvxyIEZldHRzY2hyaWZ0IgorCisjOiBtYWluLmM6MjM3MworbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxTY2hyaWZ0YXJ0Plx0QmVudXR6ZSA8U2NocmlmdGFydD4gZvxyIGdlbmVpZ3RlbiBUZXh0IgorCisjOiBtYWluLmM6MjM3NCBtYWluLmM6MjM5MgorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiIgorIi1nZW9tZXRyeSA8Z2VvbT5cdGJlbnV0emUgPGdlb20+IGb8ciBkaWUgQW5mYW5ncyBBYm1lc3N1bmdlbiAoYXVjaCBtaXQ6IC0iCisiZ2VvbSkiCisKKyM6IG1haW4uYzoyMzc1Cittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICIiCisiLWJvcmRlcndpZHRoIDxCcmVpdGU+XHRCZW51dHplIGVpbmVuIFJhaG1lbiBkZXIgQnJlaXRlIDxCcmVpdGU+IChhdWNoIG1pdDogLSIKKyJidykiCisKKyM6IG1haW4uYzoyMzc2Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICIiCisiLXNjcm9sbGJhcndpZHRoIDxCcmVpdGU+ICBCZW51dHplIGVpbmUgU2Nyb2xsYmFyIGRlciBCcmVpdGUgPEJyZWl0ZT4gKGF1Y2ggIgorIm1pdDogLXN3KSIKKworIzogbWFpbi5jOjIzNzgKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICIiCisiLW1lbnVoZWlnaHQgPEj2aGU+XHRCZW51dHplIGVpbmVuIE1lbvwtQmFsa2VuIGRlciBI9mhlIDxI9mhlPiAoYXVjaCBtaXQ6IC1taCkiCisKKyM6IG1haW4uYzoyMzgwIG1haW4uYzoyMzkzCittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdEJlbnV0emUgaW52ZXJ0aWVydGUgRmFyYmVuIChhdWNoIG1pdDogLXJ2KSIKKworIzogbWFpbi5jOjIzODEKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0QmVudXR6ZSBrZWluZSBpbnZlcnRpZXJ0ZW4gRmFyYmVuIChhdWNoIG1pdDogK3J2KSIKKworIzogbWFpbi5jOjIzODIKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZXNvdXJjZT5cdFNldHplIGRpZSBnZWdlYmVuZSBSZXNvdXJjZSIKKworIzogbWFpbi5jOjIzODUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50ZSBm/HIgZGllIGd2aW0gUklTQy1PUyBWZXJzaW9uOlxuIgorCisjOiBtYWluLmM6MjM4NgorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxOdW1tZXI+XHRBbmZhbmdzYnJlaXRlIGRlcyBGZW5zdGVycyBpbiBTcGFsdGVuIgorCisjOiBtYWluLmM6MjM4NworbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8TnVtbWVyPlx0QW5mYW5nc2j2aGUgZGVzIEZlbnN0ZXJzIGluIFplaWxlbiIKKworIzogbWFpbi5jOjIzOTAKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50ZSBm/HIgZGllIGd2aW0gR1RLKyBWZXJzaW9uOlxuIgorCisjOiBtYWluLmM6MjM5NAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0U3RhcnRlIHZpbSBhdWYgPGRpc3BsYXk+IChhdWNoIG1pdDogLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjIzOTYKK21zZ2lkICItLWhlbHBcdFx0U2hvdyBHbm9tZSBhcmd1bWVudHMiCittc2dzdHIgIi0taGVscFx0XHRaZWlnZSBHbm9tZS1Bcmd1bWVudGUiCisKKyMuIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyM6IG1haW4uYzoyNjM4Cittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiU2NoaWNrZW4gZGVzIEF1c2RydWNrcyBzY2hsdWcgZmVobC5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNjQzCittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIiIKKyJcbiIKKyJTY2hpY2tlbiBzY2hsdWcgZmVobC4gVmVyc3VjaGUgbG9rYWwgYXVzenVm/GhyZW5cbiIKKworIzogbWFpbi5jOjI2NzYgbWFpbi5jOjI2OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCB2b24gJWQgZWRpdGllcnQiCisKKyM6IG1haW4uYzoyNzIwCittc2dpZCAiU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiU2NoaWNrZW4gZGVzIEF1c2RydWNrcyBzY2hsdWcgZmVobC5cbiIKKworIzogbWFyay5jOjY2MAorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiS2VpbmUgTWFya2llcnVuZ2VuIGdlc2V0enQiCisKKyM6IG1hcmsuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBLZWluZSBNYXJraWVydW5nZW4gcGFzc2VuIHp1IFwiJXNcIiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjczCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIk1hcmsgWmVpbGUgU3AgIERhdGVpL1RleHQiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcxMQorbXNnaWQgIiIKKyJcbiIKKyIganVtcCBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiIFNwcnVuZyBaZWlsZSBTcCBEYXRlaS9UZXh0IgorCisjOiBtYXJrLmM6MTA3MworbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIERhdGVpLU1hcmtlbjpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMTA4Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEdlc2NoaWNodGUgKG5ldWVzdGUgYmlzIORsdGVzdGUpOlxuIgorCisjOiBtYXJrLmM6MTIwMworbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgR2VzY2hpY2h0ZSBkZXIgTWFya2llcnVuZ2VuIGlubmVyaGFsYiB2b24gRGF0ZWllbiAobmV1ZXN0ZSBiaXMg5Gx0ZXN0ZSk6XG4iCisKKyM6IG1hcmsuYzoxMjg2Cittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIic+JyBmZWhsdCIKKworIzogbWJ5dGUuYzozOTUKK21zZ2lkICJOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiSXN0IG5pY2h0IGVpbmUgenVs5HNzaWdlIENvZGUtU2VpdGUiCisKKyM6IG1ieXRlLmM6MzEwNworbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBLYW5uIGRpZSBJQyBXZXJ0ZSBuaWNodCBzZXR6ZW4iCisKKyM6IG1ieXRlLmM6MzI1OQorbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogRWluZ2FiZS1Lb250ZXh0IGtvbm50ZSBuaWNodCBlcnpldWd0IHdlcmRlbiIKKworIzogbWJ5dGUuYzozNDA2Cittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiBFaW5nYWJlLU1ldGhvZGUga29ubnRlIGdl9mZmbmV0IHdlcmRlbiIKKworIzogbWJ5dGUuYzozNDE3Cittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBBY2h0dW5nOiBEZXN0cm95IENhbGxhYmNrIGtvbm50ZSBuaWNodCBhdWYgSU0gZ2VzZXR6dCB3ZXJkZW4iCisKKyM6IG1ieXRlLmM6MzQyMworbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBFaW5nYWJlLU1ldGhvZGUgdW50ZXJzdPx0enQga2VpbmVuIGVpbnppZ2VuIFN0aWwiCisKKyM6IG1ieXRlLmM6MzQ4MAorbXNnaWQgIkUyODk6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgbXkgcHJlZWRpdCB0eXBlIgorbXNnc3RyICJFMjg5OiBFaW5nYWJlLU1ldGhvZGUgdW50ZXJzdPx0enQgbmljaHQgbWVpbmVuIFZvcmVkaXRpZXItVHlwZW4iCisKKyM6IG1ieXRlLmM6MzU1NAorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogZGVyINxiZXItZGVtLVB1bmt0IFN0aWwgYmVu9nRpZ3QgZm9udHNldCIKKworIzogbWJ5dGUuYzozNTgyCittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICIiCisiRTI5MTogSWhyIEdUSysgaXN0IORsdGVyIGFscyAxLjIuMy4gRGVyIFN0YXR1cy1CZXJlaWNoIHdpcmQgYWJnZXNjaGFsdGV0IgorCisjOiBtYnl0ZS5jOjM4NDkKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiBTZXJ2ZXIgZGVyIEVpbmdhYmUtTWV0aG9kZSBs5HVmdCBuaWNodCIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBCbG9jayB3YXIgbmljaHQgZ2VzcGVycnQiCisKKyM6IG1lbWZpbGUuYzo5ODkKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiBQb3NpdGlvbmllci1GZWhsZXIgYmVpbSBMZXNlbiBkZXIgQXVzbGFnZXJ1bmdzLURhdGVpIgorCisjOiBtZW1maWxlLmM6OTk0Cittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IExlc2UtRmVobGVyIGluIGRlciBBdXNsYWdlcnVuZ3MtRGF0ZWkiCisKKyM6IG1lbWZpbGUuYzoxMDQ2Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IFBvc2l0aW9uaWVyLUZlaGxlciBiZWltIFNjaHJlaWJlbiBpbiBkaWUgQXVzbGFnZXJ1bmdzLURhdGVpIgorCisjOiBtZW1maWxlLmM6MTA2NAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NzogRmVobGVyIGJlaW0gU2NocmVpYmVuIGluIGRpZSBBdXNsYWdlcnVuZ3MtRGF0ZWkiCisKKyM6IG1lbWZpbGUuYzoxMjYxCittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiBBdXNsYWdlcnVuZ3MtRGF0ZWkgaXN0IGJlcmVpdHMgdm9yaGFuZGVuIChzeW1saW5rIEF0dGFja2U/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IEJsb2NrIE5yLiAwIG5pY2h0IGVyaGFsdGVuPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IEJsb2NrIE5yLiAxIG5pY2h0IGVyaGFsdGVuPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IEJsb2NrIE5yLiAyIG5pY2h0IGVyaGFsdGVuPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTogVXBzLCBWZXJsdXN0IGRlciBBdXNsYWdlcnVuZ3MtRGF0ZWkhISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogQXVzbGFnZXJ1bmdzLURhdGVpIGtvbm50ZSBuaWNodCB1bWJlbmFubnQgd2VyZGVuIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICIiCisiRTMwMzogQXVzbGFnZXJ1bmdzLURhdGVpIGb8ciBcIiVzXCIga29ubnRlIG5pY2h0IGdl9mZmbmV0IHdlcmRlbiwgIgorIldpZWRlcmhlcnN0ZWxsdW5nIHVubfZnbGljaCIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogQmxvY2sgTnIuIDAgbmljaHQgZXJoYWx0ZW4/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IEtlaW5lIEF1c2xhZ2VydW5ncy1EYXRlaSBm/HIgJXMgZ2VmdW5kZW4iCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICIiCisiR2ViZW4gU2llIGRpZSBOdW1tZXIgZGVyIEF1c2xhZ2VydW5ncy1EYXRlaSBlaW4gZGllIHZlcndlbmRldCB3ZXJkZW4gc29sbCAoMCAiCisidW0gYWJ6dWJyZWNoZW4pOiAiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6ICVzIGthbm4gbmljaHQgZ2X2ZmZuZXQgd2VyZGVuIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiQmxvY2sgMCBrYW5uIG5pY2h0IGdlbGVzZW4gd2VyZGVuIGF1cyAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiVmllbGxlaWNodCB3dXJkZW4ga2VpbmUgxG5kZXJ1bmdlbiB2b3JnZW5vbW1lbiBvZGVyIFZpbSBoYXR0ZSBkaWUgIgorIkF1c2xhZ2VydW5ncy1EYXRlaSBuaWNodCBha3R1YWxpc2llcnQuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIga2FubiBuaWNodCB6dXNhbW1lbiBtaXQgZGllc2VyIFZpbSBWZXJzaW9uIHZlcndlbmRldCB3ZXJkZW4uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJCZW51dHplIFZpbSBWZXJzaW9uIDMuMC5cbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyBzaWVodCBuaWNodCB3aWUgZWluZSBWaW0gQXVzbGFnZXJ1bmdzLURhdGVpIGF1cyIKKworIzogbWVtbGluZS5jOjg2OAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIgorbXNnc3RyICIga2FubiBhdWYgZGllc2VtIFJlY2huZXIgbmljaHQgdmVyd2VuZGV0IHdlcmRlbi5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAiRGllIERhdGVpIHd1cmRlIGVyc3RlbGx0IHVtICIKKworIzogbWVtbGluZS5jOjg3NAorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisib2RlciBkaWUgRGF0ZWkgd3VyZGUgemVyc3T2cnQuIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlZlcndlbmRlIEF1c2xhZ2VydW5ncy1EYXRlaSBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIk9yaWdpbmFsLURhdGVpIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkzNAorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiBXYXJudW5nOiBEaWUgT3JpZ2luYWwtRGF0ZWkga/ZubnRlIHZlcuRuZGVydCB3b3JkZW4gc2VpbiIKKworIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IEJsb2NrIDEga2FubiBuaWNodCBuaWNodCB2b24gJXMgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P1ZJRUxFIFpFSUxFTiBGRUhMRU4iCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz9aRUlMRU4gWsRITEVSIEZBTFNDSCIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/TEVFUkVSIEJMT0NLIgorCisjOiBtZW1saW5lLmM6MTAyOAorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P1pFSUxFTiBGRUhMRU4iCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBCbG9jayAxIElEIGZhbHNjaCAoaXN0ICVzIGtlaW5lIC5zd3AtRGF0ZWk/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CTE9DSyBGRUhMVCIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gdm9uIGhpZXIgYmlzID8/P0VOREUga/ZubnRlbiBkaWUgWmVpbGVuIGZhbHNjaCBzZWluIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IHZvbiBoaWVyIGJpcyA/Pz9FTkRFIGv2bm50ZW4gWmVpbGVuIGVpbmdlZvxndCBvZGVyIGdlbPZzY2h0IHNlaW4iCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9FTkRFIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiBXaWVkZXJoZXJzdGVsbHVuZyB1bnRlcmJyb2NoZW4iCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IEZlaGxlciB3dXJkZW4gZmVzdGdlc3RlbGx0IHfkaHJlbmQgZGVyIFdpZWRlcmhlcnN0ZWxsdW5nOiBzdWNoZSBuYWNoICIKKyJaZWlsZW4gZGllIG1pdCA/Pz8gYmVnaW5uZW4iCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICJXaWVkZXJoZXJzdGVsbHVuZyBiZWVuZGV0LiBQcvxmZW4gU2llLCBvYiBhbGxlcyBhbGxlcyBPSyBpc3QuIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihXb2xsZW4gU2llIHZpZWxsZWljaHQgZGllc2UgRGF0ZWkgdW50ZXIgZWluZW0gbmV1ZW4gTmFtZW4gc3BlaWNoZXJuXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUwCittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgInVuZCBcImRpZmZcIiB6dXIgT3JpZ2luYWwtRGF0ZWkgbWFjaGVuLCB1bSDEbmRlcnVuZ2VuIHp1IHBy/GZlbilcbiIKKworIzogbWVtbGluZS5jOjExNTEKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIkz2c2NoZW4gU2llIGRpZSAuc3dwLURhdGVpIGRhbmFjaC5cbiIKKyJcbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMjA3Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIkF1c2xhZ2VydW5ncy1EYXRlaWVuIGdlZnVuZGVuOiIKKworIzogbWVtbGluZS5jOjEzODUKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgSW0gbGF1ZmVuZGVuIFZlcnplaWNobmlzOlxuIgorCisjOiBtZW1saW5lLmM6MTM4NworbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBCZW51dHplIGdlZ2ViZW5lbiBOYW1lbjpcbiIKKworIzogbWVtbGluZS5jOjEzOTEKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICBJbSBWZXJ6ZWljaG5pcyAiCisKKyM6IG1lbWxpbmUuYzoxNDA5Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSBOaWNodHMgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgRWlnZW50dW0gdm9uOiAiCisKKyM6IG1lbWxpbmUuYzoxNDgzCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICB2b206ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM2ODAKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgdm9tOiAiCisKKyM6IG1lbWxpbmUuYzoxNTAzCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW3ZvbiBWaW0gVmVyc2lvbiAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUwNworbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW3NpZWh0IG5pY2h0IHdpZSBlaW5lIFZpbSBBdXNsYWdlcnVuZ3MtRGF0ZWkgYXVzXSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgRGF0ZWluYW1lOiAiCisKKyM6IG1lbWxpbmUuYzoxNTIzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgdmVy5G5kZXJ0OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiWUVTIgorbXNnc3RyICJKQSIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICJubyIKK21zZ3N0ciAibmVpbiIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgIEJlbnV0emVyIE5hbWU6ICIKKworIzogbWVtbGluZS5jOjE1MzUKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgSG9zdCBOYW1lOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgSG9zdCBOYW1lOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBQcm9jZXNzIElEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChs5HVmdCBub2NoKSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuaWNodCB2ZXJ3ZW5kYmFyIHp1c2FtbWVuIG1pdCBkaWVzZXIgVmltLVZlcnNpb25dIgorCisjOiBtZW1saW5lLmM6MTU2NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuaWNodCB2ZXJ3ZW5kYmFyIGF1ZiBkaWVzZW0gUmVjaG5lcl0iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW2thbm4gbmljaHQgZ2VsZXNlbiB3ZXJkZW5dIgorCisjOiBtZW1saW5lLmM6MTU3MworbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW2thbm4gbmljaHQgZ2X2ZmZuZXQgd2VyZGVuXSIKKworIzogbWVtbGluZS5jOjE3NjMKK21zZ2lkICJFMzEzOiBDYW5ub3QgcHJlc2VydmUsIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMxMzogS2FubiBuaWNodCBhYnNpY2hlcm4sIGVzIGdpYnQga2VpbmUgQXVzbGFnZXJ1bmdzLURhdGVpIgorCisjOiBtZW1saW5lLmM6MTgxNgorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJEYXRlaSBnZXNpY2hlcnQiCisKKyM6IG1lbWxpbmUuYzoxODE4Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBBYnNpY2hlcnVuZyBmZWhsZ2VzY2hsYWdlbiIKKworIzogbWVtbGluZS5jOjE4ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiB1bnp1bORzc2lnZSBsbnVtOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDogWmVpbGUgJWxkIGthbm4gbmljaHQgZ2VmdW5kZW4gd2VyZGVuIgorCisjOiBtZW1saW5lLmM6MjMwMworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzogWmVpZ2VyLUJsb2NrIGlkIGZhbHNjaCAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IHNvbGx0ZSAwIHNlaW4iCisKKyM6IG1lbWxpbmUuYzoyNDQ1Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBadSB2aWVsZSBCbG9ja3MgYWt0dWFsaXNpZXJ0PyIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IFplaWdlciBCbG9jayBpZCBmYWxzY2ggNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJCbG9jayAxIGdlbPZzY2h0PyIKKworIzogbWVtbGluZS5jOjI4MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IFplaWxlICVsZCBrYW5uIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiIKKworIzogbWVtbGluZS5jOjMwNzIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiBaZWlnZXIgQmxvY2sgaWQgaXN0IGZhbHNjaCIKKworIzogbWVtbGluZS5jOjMwODgKK21zZ2lkICJwZV9saW5lX2NvdW50IGlzIHplcm8iCittc2dzdHIgInBlX2xpbmVfY291bnQgaXN0IE51bGwiCisKKyM6IG1lbWxpbmUuYzozMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogWmVpbGVubnVtbWVyIG5pY2h0IGltIHp1bORzc2lnZW4gQmVyZWljaDogJWxkIG5hY2ggZGVtIEVuZGUiCisKKyM6IG1lbWxpbmUuYzozMTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiBaZWlsZW4gWuRobGVyIGZhbHNjaCBpbiBCbG9jayAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTcwCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIlN0YXBlbCBHcvbfZSB35GNoc3QiCisKKyM6IG1lbWxpbmUuYzozMjE2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiBaZWlnZXIgQmxvY2sgaWQgZmFsc2NoIDIiCisKKyM6IG1lbWxpbmUuYzozNjcwCittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiBBQ0hUVU5HIgorCisjOiBtZW1saW5lLmM6MzY3MQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIkF1c2xhZ2VydW5ncy1EYXRlaSBtaXQgZm9sZ2VuZGVtIE5hbWVuIGdlZnVuZGVuOiBcIiIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIkJlaW0g1mZmbmVuIGRlciBEYXRlaSBcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgbmV1ZXIgYWxzIEF1c2xhZ2VydW5ncy1EYXRlaSFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSBFaW4gYW5kZXJlcyBQcm9ncmFtbSBlZGl0aWVydCBt9mdsaWNoZXJ3ZWlzZSBkaWVzZSBEYXRlaS5cbiIKKyIgICAgV2VubiBkaWVzIGRlciBGYWxsIGlzdCwgc29sbHRlbiBTaWUgdm9yc2ljaHRpZyBzZWluLCBkYW1pdFxuIgorIiAgICBlcyBuaWNodCB6dSDcYmVyc2NobmVpZHVuZ2VuIGtvbW10LlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBFbmRlLCBvZGVyIEZvcnRzZXR6dW5nIG1pdCBWb3JzaWNodC5cbiIKKworIzogbWVtbGluZS5jOjM2OTAKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgRWluZSBFZGl0aWVyLVNpdHp1bmcgZvxyIGRpZXNlIERhdGVpIGlzdCBhYmdlc3T8cnp0LlxuIgorCisjOiBtZW1saW5lLmM6MzY5MQorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiIgorIiAgICBXZW5uIGRpZXMgZGVyIEZhbGwgaXN0LCBzbyB2ZXJ3ZW5kZW4gU2llIFwiOnJlY292ZXJcIiBvZGVyIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICB1bSBkaWUgxG5kZXJ1bmdlbiB3aWVkZXJoZXJ6dXN0ZWxsZW4gKHNpZWhlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiIgorIiAgICBXZW5uIGRpZXMgYmVyZWl0cyBnZXNjaGVoZW4gaXN0LCBs9nNjaGVuIFNpZSBkaWUgQXVzbGFnZXJ1bmdzLURhdGVpIFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICB1bSBkaWVzZSBOYWNocmljaHQgenUgdmVybWVpZGVuLlxuIgorCisjOiBtZW1saW5lLmM6MzcxMCBtZW1saW5lLmM6MzcxNAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiQXVzbGFnZXJ1bmdzLURhdGVpIFwiIgorCisjOiBtZW1saW5lLmM6MzcxMSBtZW1saW5lLmM6MzcxNworbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIgaXN0IGJlcmVpdHMgdm9yaGFuZGVuISIKKworIzogbWVtbGluZS5jOjM3MjAKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIEFDSFRVTkciCisKKyM6IG1lbWxpbmUuYzozNzIyCittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiQXVzbGFnZXJ1bmdzLURhdGVpIGlzdCBiZXJlaXRzIHZvcmhhbmRlbiEiCisKKyM6IG1lbWxpbmUuYzozNzI2Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXQiCittc2dzdHIgIiIKKyLWZmZuZW4gbnVyIHp1bSAmTGVzZW5cbiIKKyJUcm90emRlbSAmZWRpdGllcmVuXG4iCisiJldpZWRlcmhlcnN0ZWxsZW5cbiIKKyImQWJicmVjaGVuIgorCisjOiBtZW1saW5lLmM6MzcyOAorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorItZmZm5lbiBudXIgenVtICZMZXNlblxuIgorIlRyb3R6ZGVtICZlZGl0aWVyZW5cbiIKKyImV2llZGVyaGVyc3RlbGxlblxuIgorIiZBYmJyZWNoZW5cbiIKKyJFbnQmZmVybmVuIgorCisjOiBtZW1saW5lLmM6Mzc4MQorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6IFp1IHZpZWxlIEF1c2xhZ2VydW5ncy1EYXRlaWVuIGdlZnVuZGVuIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogVGVpbCBkZXMgTWVu/HB1bmt0LVBmYWRlcyBtdXNzIHp1bSBVbnRlcm1lbvwgZvxocmVuIgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogTWVu/CBleGlzdGllcnQgbnVyIGluIGFuZGVyZW4gTW9kdXMiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiBLZWluIE1lbvwgbWl0IGRpZXNlbSBOYW1lbiIKKworIzogbWVudS5jOjUwOQorbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IE1lbvwtUGZhZCBkYXJmIG5pY2h0IHp1bSBVbnRlcm1lbvwgZvxocmVuIgorCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIiIKKyJFMzMxOiBNZW78LVB1bmt0IGv2bm5lbiBuaWNodCBkaXJla3QgenVtIE1lbvwtQmFsa2VuIGhpbnp1Z2Vm/Gd0IHdlcmRlbiIKKworIzogbWVudS5jOjU1NAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogVHJlbm5lciBrYW5uIG5pY2h0IFRlaWwgZGVzIE1lbvwtUGZhZGVzIHNlaW4iCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNzAKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBNZW78cyAtLS0iCisKKyM6IG1lbnUuYzoxOTg3Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJSZWnfZSBkaWVzZXMgTWVu/CBhYiIKKworIzogbWVudS5jOjIwNTIKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBNZW78LVBmYWQgbXVzcyB6dSBlaW5lbSBNZW78LVB1bmt0IGb8aHJlbiIKKworIzogbWVudS5jOjIwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBNZW78IG5pY2h0IGdlZnVuZGVuOiAlcyIKKworIzogbWVudS5jOjIxNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogTWVu/CBpc3QgZvxyICVzIE1vZHVzIG5pY2h0IGRlZmluaWVydCIKKworIzogbWVudS5jOjIxNzkKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IE1lbvwtUGZhZCBtdXNzIHp1bSBVbnRlcm1lbvwgZvxocmVuIgorCisjOiBtZW51LmM6MjIwMAorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogTWVu/CBuaWNodCBnZWZ1bmRlbiAtIPxiZXJwcvxmZSBNZW78LU5hbWVuIgorCisjOiBtZXNzYWdlLmM6NDcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICJGZWhsZXIgYmVpbSBBdXNm/GhyZW4gdm9uIFwiJXNcIjoiCisKKyM6IG1lc3NhZ2UuYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAiWmVpbGUgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1MjYKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW1plaWNoZW5rZXR0ZSB6dSBsYW5nXSIKKworIzogbWVzc2FnZS5jOjY3MgorbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICLcYmVyc2V0enQgdm9uIEpvaGFubmVzIFplbGxuZXIgPGpvaGFubmVzQHplbGxuZXIub3JnPiIKKworIzogbWVzc2FnZS5jOjg4NQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJVbnRlcmJyZWNodW5nOiAiCisKKyM6IG1lc3NhZ2UuYzo4ODgKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIndlaXRlciBtaXQgZGVyIEVJTkdBQkVUQVNURSIKKworIzogbWVzc2FnZS5jOjg5MAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIkRy/GNrZW4gU2llIGRpZSBFSU5HQUJFVEFTVEUgb2RlciBnZWJlbiBTaWUgZWluZW4gQmVmZWhsIGVpbiIKKworIzogbWVzc2FnZS5jOjE5NjEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBNZWhyIC0tIgorCisjOiBtZXNzYWdlLmM6MTk2NAorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiBaZWlsZSwgTEVFUlpFSUNIRU4vYjogU2VpdGUsIGQvdTogSGFsYmUgU2VpdGUsIHE6IEVuZGUpIgorCisjOiBtZXNzYWdlLmM6MTk2NQorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IFplaWxlLCBMRUVSWkVJQ0hFTjogU2VpdGUsIGQ6IEhhbGJlIFNlaXRlLCBxOiBFbmRlKSIKKworIzogbWVzc2FnZS5jOjI0NDEgbWVzc2FnZS5jOjI0NTYKK21zZ2lkICJRdWVzdGlvbiIKK21zZ3N0ciAiRnJhZ2UiCisKKyM6IG1lc3NhZ2UuYzoyNDQzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyImSmFcbiIKKyImTmVpbiIKKworIzogbWVzc2FnZS5jOjI0NTgKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImSmFcbiIKKyImTmVpblxuIgorIiZBYmJyZWNoZW4iCisKKyM6IG1lc3NhZ2UuYzoyNDc2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkphXG4iCisiJk5laW5cbiIKKyJBbGxlICZTcGVpY2hlcm5cbiIKKyJBbGxlICZWZXJ3ZXJmZW5cbiIKKyImQWJicmVjaGVuIgorCisjOiBtZXNzYWdlLmM6MjUxNworbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIkRhdGVpIFNwZWljaGVybiBEaWFsb2ciCisKKyM6IG1lc3NhZ2UuYzoyNTE5Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGF0ZWkg1mZmbmVuIERpYWxvZyIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzoyNTkwCittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6IGtlaW4gRGF0ZWktRGlhbG9nIGltIEtvbnNvbGUtTW9kdXMiCisKKyM6IG1pc2MxLmM6MjQ2MgorbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6IFdhcm51bmc6IMRuZGVybiBlaW5lciBzY2hyZWliZ2VzY2j8dHp0ZW4gRGF0ZWkiCisKKyM6IG1pc2MxLmM6MjY5MQorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICJlaW5lIFplaWxlIG1laHIiCisKKyM6IG1pc2MxLmM6MjY5MworbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICJlaW5lIFplaWxlIHdlbmlnZXIiCisKKyM6IG1pc2MxLmM6MjY5OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiJWxkIFplaWxlbiBtZWhyIgorCisjOiBtaXNjMS5jOjI3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICIlbGQgWmVpbGVuIHdlbmlnZXIiCisKKyM6IG1pc2MxLmM6MjcwMworbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKFVudGVyYnJvY2hlbikiCisKKyM6IG1pc2MxLmM6NjMyMQorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IFNpY2hlcm4gZGVyIERhdGVpZW4uLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjYzMzEKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IEJlZW5kZXQuXG4iCisKKyM6IG1pc2MyLmM6NjY2IG1pc2MyLmM6NjgyCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRkVITEVSOiAiCisKKyM6IG1pc2MyLmM6Njg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW0J5dGVzXSBnZXNhbXQgYWxsb3ppZXJ0LWZyZWkgJWx1LSVsdSwgaW4gVmVyd2VuZHVuZyAlbHUsIG1heGltYWxlICIKKyJWZXJ3ZW5kdW5nICVsdVxuIgorCisjOiBtaXNjMi5jOjY4OAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbQXVmcnVmZV0gZ2VzYW10IHJlL21hbGxvYygpcyAlbHUsIGdlc2FtdCBmcmVlKClzICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc0MworbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6IFplaWxlIHdpcmQgenUgbGFuZyIKKworIzogbWlzYzIuYzo3ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IEludGVybmVyIEZlaGxlcjogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IEtlaW4gU3BlaWNoZXJwbGF0eiBtZWhyIHZvcmhhbmRlbiAoJWx1IGJ5dGVzIGFsbG96aWVydCkiCisKKyM6IG1pc2MyLmM6MjU0NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAiUnVmZSBTaGVsbCBhdWYsIHVtIFwiJXNcIiBhdXN6dWb8aHJlbiIKKworIzogbWlzYzIuYzoyNzQ1IG1pc2MyLmM6NTIzMCBvcHRpb24uYzo0NjM2Cittc2dpZCAiTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiZmVobGVuZGVzIEtvbW1hIgorCisjOiBtaXNjMi5jOjI3NDcgbWlzYzIuYzoyNzc0Cittc2dpZCAiSWxsZWdhbCBtb2RlIgorbXNnc3RyICJVbnp1bORzc2lnZXIgTW9kdXMiCisKKyM6IG1pc2MyLmM6MjgxMworbXNnaWQgIklsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiVW56dWzkc3NpZ2UgTWF1cy1Gb3JtIgorCisjOiBtaXNjMi5jOjI4NTMgbWlzYzIuYzo1MjUwCittc2dpZCAiZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIlppZmZlciBlcndhcnRldCIKKworIzogbWlzYzIuYzoyODU4Cittc2dpZCAiSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJVbnp1bORzc2lnZSBQcm96ZW50YW5nYWJlIgorCisjOiBtaXNjMi5jOjMxNjIKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICJHZWJlbiBTaWUgYml0dGUgZGVuIFNjaGz8c3NlbCBlaW46ICIKKworIzogbWlzYzIuYzozMTYzCittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiR2ViZW4gU2llIGRlbiBnbGVpY2hlbiBTY2hs/HNzZWwgbm9jaG1hbHMgZWluOiIKKworIzogbWlzYzIuYzozMTczCittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIkRpZSBTY2hs/HNzZWwgc3RpbW1lbiBuaWNodCD8YmVyZWluISIKKworIzogbWlzYzIuYzozNzEyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICIiCisiRTM0MzogVW5n/Gx0aWdlciBQZmFkOiAnKipbTnVtbWVyXScgbXVzcyBhbSBFbmRlIGRlcyBQZmFkcyBzZWluLCBvZGVyIHZvbiAiCisiJyVzJyBnZWZvbGd0IHdlcmRlbi4gU2llaGUgOmhlbHAgcGF0aC4iCisKKyM6IG1pc2MyLmM6NDk4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ0OiBWZXJ6ZWljaG5pcyBcIiVzXCIga2FubiBpbSAnY2RwYXRoJyBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4iCisKKyM6IG1pc2MyLmM6NDk4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IERhdGVpIFwiJXNcIiBrYW5uIGltIFBmYWQgbmljaHQgZ2VmdW5kZW4gd2VyZGVuIgorCisjOiBtaXNjMi5jOjQ5OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogS2VpbiB3ZWl0ZXJlcyBWZXJ6ZWljaG5pcyBcIiVzXCIgaW0gJ2NkcGF0aCcgZ2VmdW5kZW4iCisKKyM6IG1pc2MyLmM6NDk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IEtlaW5lIHdlaXRlcmUgRGF0ZWkgXCIlc1wiIGltIFBmYWQgZ2VmdW5kZW4iCisKKyM6IG1pc2MyLmM6NTI0MgorbXNnaWQgIklsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJVbnp1bORzc2lnZSBLb21wb25lbnRlIgorCisjOiBub3JtYWwuYzoyODU3Cittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAiQWNodHVuZzogVGVybWluYWwgdW50ZXJzdPx0enQga2VpbmUgSGVydm9yaGVidW5nIgorCisjOiBub3JtYWwuYzozMDUyCittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogS2VpbmUgWmVpY2hlbmtldHRlIHVudGVyIGRlbSBDdXJzb3IiCisKKyMgSWRlbnRpZml6aWVydW5nc3plaWNoZW4vbWVya21hbCwgQmV6ZWljaG5lcgorIzogbm9ybWFsLmM6MzA1NAorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiBLZWluIE1lcmttYWwgdW50ZXIgZGVtIEN1cnNvciIKKworIzogbm9ybWFsLmM6NDIyNQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICIiCisiRTM1MjogRmFsdHVuZyBrYW5uIG1pdCBkZXIgZWluZ2VzdGVsbHRlbiBNZXRob2RlICdmb2xkbWV0aG9kJyBuaWNodCBnZWz2c2NodCAiCisid2VyZGVuIgorCisjOiBvcHMuYzoyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICJlaW5lIFplaWxlIGVpbiBNYWwgJXMiCisKKyM6IG9wcy5jOjI4NQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSBaZWlsZSAlcyAlZCBNYWwiCisKKyM6IG9wcy5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCBaZWlsZW4gJXMgZWluIE1hbCIKKworIzogb3BzLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQgWmVpbGVuICVzICVkIE1hbCIKKworIzogb3BzLmM6NjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICIlbGQgWmVpbGVuIHp1bSBFaW5y/GNrZW4uLi4gIgorCisjOiBvcHMuYzo3MDEKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxIFplaWxlIGVpbmdlcvxja3QuLi4gIgorCisjOiBvcHMuYzo3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGluZGVudGVkICIKK21zZ3N0ciAiJWxkIFplaWxlbiBlaW5nZXL8Y2t0Li4uICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE1NDYKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAia2FubiBuaWNodCBrb3BpZXJlbjsgbPZzY2hlIHRyb3R6ZGVtIgorCisjOiBvcHMuYzoyMDc5Cittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgWmVpbGUgfiIKKworIzogb3BzLmM6MjA4MQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiJWxkIFplaWxlbiBnZeRuZGVydCIKKworIzogb3BzLmM6MjQzOAorIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAiZ2ViZSAlbGQgWmVpbGVuIGZyZWkiCisKKyM6IG9wcy5jOjI3MTkKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICJFaW5lIFplaWxlIGtvcGllcnQiCisKKyM6IG9wcy5jOjI3MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAiJWxkIFplaWxlbiBrb3BpZXJ0IgorCisjOiBvcHMuYzozMDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IFJlZ2lzdGVyICVzIGlzdCBsZWVyIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM1NzIKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXIgLS0tIgorCisjOiBvcHMuYzo0NzMwCittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJVbnp1bORzc2lnZXIgUmVnaXN0ZXIgTmFtZSIKKworIzogb3BzLmM6NDgxNgorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgUmVnaXN0ZXI6XG4iCisKKyM6IG9wcy5jOjQ4NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJVbmJla2FubnRlciBSZWdpc3RlciBUeXAgJWQiCisKKyM6IG9wcy5jOjUyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiBVbnp1bORzc2lnZXIgUmVnaXN0ZXIgTmFtZTogJyVzJyIKKworIzogb3BzLmM6NTU4NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICIlbGQgU3BhbHRlbjsgIgorCisjOiBvcHMuYzo1NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiJXMlbGQgdm9uICVsZCBaZWlsZW47ICVsZCB2b24gJWxkIFdvcnRlbjsgJWxkIHZvbiAlbGQgQnl0ZXMiCisKKyM6IG9wcy5jOjU2MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICJTcGFsICVzIHZvbiAlczsgWmVpbGUgJWxkIHZvbiAlbGQ7IFdvcnQgJWxkIHZvbiAlbGQ7IEJ5dGUgJWxkIHZvbiAlbGQiCisKKyM6IG9wcy5jOjU2MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIGb8ciBCT00pIgorCisjOiBvcHRpb24uYzoxOTg5Cittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICJEYW5rZSBm/HIgZGllIEJlbnV0enVuZyB2b24gVmltIgorCisjOiBvcHRpb24uYzozMTc1Cittc2dpZCAiT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIk9wdGlvbiBuaWNodCB1bnRlcnN0/HR6dCIKKworIzogb3B0aW9uLmM6MzIwMAorbXNnaWQgIk5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIk5pY2h0IGVybGF1YnQgaW4gZWluZXIgJ21vZGVsaW5lJyIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRadWxldHp0IGdlc2V0enQgdm9uICIKKworIzogb3B0aW9uLmM6MzM5NQorbXNnaWQgIk51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJCcmF1Y2hlIFphaGwgbmFjaCA9IgorCisjOiBvcHRpb24uYzozNzE0IG9wdGlvbi5jOjQzMjIKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiTmljaHQgZ2VmdW5kZW4gaW4gdGVybWNhcCIKKworIzogb3B0aW9uLmM6Mzc4MAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICJVbnp1bORzc2lnZXMgWmVpY2hlbiA8JXM+IgorCisjOiBvcHRpb24uYzo0MzA3IG9wdGlvbi5jOjU1NzMKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJoaWVyIG5pY2h0IGVybGF1YnQiCisKKyM6IG9wdGlvbi5jOjQzMTQKK21zZ2lkICJDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIid0ZXJtJyBrYW5uIGtlaW5lIGxlZXJlIFplaWNoZW5rZXR0ZSBzZWluIgorCisjOiBvcHRpb24uYzo0MzE3Cittc2dpZCAiQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiJ3Rlcm0nIGthbm4gaW0gR1VJIG5pY2h0IHZlcuRuZGVydCB3ZXJkZW4iCisKKyM6IG9wdGlvbi5jOjQzMTkKK21zZ2lkICJVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiVmVyd2VuZGUgXCI6Z3VpXCIsIHVtIGRpZSBHVUktVmVyc2lvbiB6dSBzdGFydGVuIgorCisjOiBvcHRpb24uYzo0MzQwCittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiJ2JhY2t1cGV4dCcgdW5kICdwYXRjaG1vZGUnIHNpbmQgZ2xlaWNoIgorCisjOiBvcHRpb24uYzo0NjM4Cittc2dpZCAiWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJaZWljaGVua2V0dGUgZGVyIEzkbmdlIE51bGwiCisKKyM6IG9wdGlvbi5jOjQ3MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWlzc2luZyBudW1iZXIgYWZ0ZXIgPCVzPiIKK21zZ3N0ciAiZmVobGVuZGUgWmFobCBuYWNoIDwlcz4iCisKKyM6IG9wdGlvbi5jOjQ3MjAKK21zZ2lkICJNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJLb21tYSBmZWhsdCIKKworIzogb3B0aW9uLmM6NDcyNworbXNnaWQgIk11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgImVpbiAnLVdlcnQgbXVzcyBhbmdlZ2ViZW4gd2VyZGVuIgorCisjOiBvcHRpb24uYzo0NzY3Cittc2dpZCAiY29udGFpbnMgdW5wcmludGFibGUgY2hhcmFjdGVyIgorbXNnc3RyICJlbnRo5Gx0IG5pY2h0LWRydWNrYmFyZSBaZWljaGVuIgorCisjOiBvcHRpb24uYzo0ODAwCittc2dpZCAiSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJVbmf8bHRpZ2VyIFNjaHJpZnRzYXR6IgorCisjIHdoYXQncyB0aGUgZGlmZmVyZW5jZSA/CisjOiBvcHRpb24uYzo0ODA3Cittc2dpZCAiY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIlwiZm9udHNldFwiIGthbm4gbmljaHQgZWluZ2VzdGVsbHQgd2VyZGVuIgorCisjOiBvcHRpb24uYzo0ODA5Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJVbmf8bHRpZ2VyIEZvbnRzZXQiCisKKyM6IG9wdGlvbi5jOjQ4MTYKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJXZWl0ZXIgU2NocmlmdGFydCBrYW5uIG5pY2h0IGVuZ2VzdGVsbHQgd2VyZGVuIgorCisjOiBvcHRpb24uYzo0ODE4Cittc2dpZCAiSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIlVuZ/xsdGlnZXIgd2VpdGVyIFNjaHJpZnRzYXR6IgorCisjOiBvcHRpb24uYzo1MDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIlVuenVs5HNzaWdlcyBaZWljaGVuIG5hY2ggPCVjPiIKKworIzogb3B0aW9uLmM6NTE3MQorbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJLb21tYSBiZW72dGlndCIKKworIzogb3B0aW9uLmM6NTE3OQorIywgYy1mb3JtYXQKK21zZ2lkICInY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICInY29tbWVudHN0cmluZycgbXXfIGxlZXIgc2Vpbiwgb2RlciAlcyBlbnRoYWx0ZW4iCisKKyM6IG9wdGlvbi5jOjUyMjYKK21zZ2lkICJObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJLZWluZSBNYXVzLVVudGVyc3T8dHp1bmciCisKKyMgWFhYCisjOiBvcHRpb24uYzo1NDc1Cittc2dpZCAiVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiTmljaHQgZ2VzY2hsb3NzZW5lIEF1c2RydWNrcyBGb2xnZSIKKworIzogb3B0aW9uLmM6NTQ3OQorbXNnaWQgInRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJ6dSB2aWVsZSBQdW5rdGUiCisKKyM6IG9wdGlvbi5jOjU0ODEKK21zZ2lkICJ1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAibmljaHQgYXVzZ2V3b2dlbmUgR3J1cHBlbiIKKworIzogb3B0aW9uLmM6NTY5NgorbXNnaWQgIkEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkVpbiBGZW5zdGVyIHp1ciBWb3JhbnNpY2h0IGV4aXN0aWVydCBiZXJlaXRzIgorCisjOiBvcHRpb24uYzo1OTU3IG9wdGlvbi5jOjU5ODYKK21zZ2lkICInd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICInd2luaGVpZ2h0JyBrYW5uIG5pY2h0IGtsZWluZXIgc2VpbiBhbHMgJ3dpbm1pbmhlaWdodCciCisKKyM6IG9wdGlvbi5jOjYwMDIgb3B0aW9uLmM6NjAyMQorbXNnaWQgIid3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICInd2lud2lkdGgnIGthbm4gbmljaHQga2xlaW5lciBzZWluIGFscyAnd2lubWlud2lkdGgnIgorCisjOiBvcHRpb24uYzo2MTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIm1pbmRlc3RlbnMgJWQgWmVpbGVuIHdlcmRlbiBiZW72dGlndCIKKworIzogb3B0aW9uLmM6NjE3MQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIm1pbmRlc3RlbnMgJWQgU3BhbHRlbiB3ZXJkZW4gYmVu9nRpZ3QiCisKKyM6IG9wdGlvbi5jOjY0NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiBVbmJla2FubnRlIE9wdGlvbjogJXMiCisKKyM6IG9wdGlvbi5jOjY1NzcKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBDb2RlcyAtLS0iCisKKyM6IG9wdGlvbi5jOjY1NzkKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBXZXJ0ZSBnbG9iYWxlciBPcHRpb25lbiAtLS0iCisKKyM6IG9wdGlvbi5jOjY1ODEKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFdlcnRlIGxva2FsZXIgT3B0aW9uZW4gLS0tIgorCisjOiBvcHRpb24uYzo2NTgzCittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBPcHRpb25lbiAtLS0iCisKKyM6IG9wdGlvbi5jOjcyNzIKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgRkVITEVSIgorCisjOiBvcHRpb24uYzo4MjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IFBhc3NlbmRlcyBaZWljaGVuIGZlaGx0IGb8ciAlcyIKKworIzogb3B0aW9uLmM6ODI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiDcYmVyc2No/HNzaWdlIFplaWNoZW4gbmFjaCBkZW0gU2VtaWtvbG9uOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgImthbm4gbmljaHQg9mZmbmVuIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogRmVuc3RlciBrYW5uIG5pY2h0IGdl9mZmbmV0IHdlcmRlbiFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJCcmF1Y2hlIEFtaWdhZG9zIFZlcnNpb24gMi4wNCBvZGVyIG5ldWVyZVxuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIkJlbvZ0aWdlICVzIFZlcnNpb24gJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJLYW5uIE5JTCBuaWNodCD2ZmZuZW46XG4iCisKKyM6IG9zX2FtaWdhLmM6NDE4Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIkthbm4gbmljaHQgYW5sZWdlbiAiCisKKyM6IG9zX2FtaWdhLmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIHN0ZWlndCBhdXMgbWl0ICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTI4Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAia2FubiBLb25zb2xlbiBNb2R1cyBuaWNodCB3ZWNoc2VsbiA/IVxuIgorCisjOiBvc19hbWlnYS5jOjkzOCBvc19tYWMuYzoxMTc3IG9zX21zd2luLmM6NjI5IG9zX3Jpc2Nvcy5jOjc1NyBvc191bml4LmM6MjgwMworbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogQmlsZHNjaGlybSBNb2R1cyB3aXJkIG5pY2h0IHVudGVyc3T8dHp0IgorCisjOiBvc19hbWlnYS5jOjk5NAorbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF93aW5zaXplOiBpc3Qga2VpbmUgS29uc29sZT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNDIKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogS2FubiBTaGVsbCBuaWNodCBtaXQgZGVyIC1mIE9wdGlvbiBhdXMgZvxocmVuIgorCisjOiBvc19hbWlnYS5jOjExODMgb3NfYW1pZ2EuYzoxMjczCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJLYW5uIG5pY2h0IGF1c2b8aHJlbiAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NiBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgIlNoZWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjA2IG9zX2FtaWdhLmM6MTMwOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgenVy/GNrZ2VnZWJlblxuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIHp1IGtsZWluLiIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gRkVITEVSIgorCisjOiBvc19tc3dpbi5jOjUwMworbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4oYWJnZXNjaG5pdHRlbikiCisKKyM6IG9zX21zd2luLmM6NjA0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyBiZXRy5Gd0IG5pY2h0IDgwLCBrYW5uIGV4dGVybmUgQmVmZWhsZSBuaWNodCBhdXNm/GhyZW4iCisKKyM6IG9zX21zd2luLmM6NzE2IG9zX3VuaXguYzo1MTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBCaWJsaW90aGVrcy1BdWZydWYgZvxyIFwiJXMoKVwiIHNjaGx1ZyBmZWhsIgorCisjOiBvc19tc3dpbi5jOjEzNjUKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IERydWNrZXItQXVzd2FobCBmZWhsZ2VzY2hsYWdlbiIKKworIzogb3NfbXN3aW4uYzoxNDA1CisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICJuYWNoICVzIGF1ZiAlcyIKKworIzogb3NfbXN3aW4uYzoxNDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkU0NDg6IFVuYmVrYW5udGUgU2NocmlmdGFydDogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ3MCBvc19tc3dpbi5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBGZWhsZXIgYmVpbSBEcnVja2VuOiAlcyIKKworIzogb3NfbXN3aW4uYzoxNDgxCittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiVW5iZWthbm50IgorCisjOiBvc19tc3dpbi5jOjE1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiRHJ1Y2tlICclcyciCisKKyM6IG9zX21zd2luLmM6MjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDogVW56dWzkc3NpZ2VyIFplaWNoZW5zYXR6LU5hbWUgXCIlc1wiIGltIFNjaHJpZnRhcnQtTmFtZW4gXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjI2MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogVW56dWzkc3NpZ2VzIFplaWNoZW4gJyVjJyBpbiBkZXIgU2NocmlmdGFydCBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyNTYKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiBVbnp1bORzc2lnZSAnb3NmaWxldHlwZSctT3B0aW9uIC0gdmVyd2VuZGUgVGV4dCIKKworIzogb3NfdW5peC5jOjg2MgorbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IERvcHBlbC1TaWduYWwsIGJlZW5kZW5cbiIKKworIzogb3NfdW5peC5jOjg2OAorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogRXJoaWVsdCB09mRsaWNoZXMgU2lnbmFsICVzXG4iCisKKyM6IG9zX3VuaXguYzo4NzEKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogRXJoaWVsdCB09mRsaWNoZXMgU2lnbmFsXG4iCisKKyM6IG9zX3VuaXguYzoxMTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICLWZmZuZW4gZGVzIFgtRGlzcGxheXMgZGF1ZXJ0ZSAlbGQgbXNlYyIKKworIzogb3NfdW5peC5jOjExNTIKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBlaW4gWDExIEZlaGxlciB0cmF0IGF1ZlxuIgorCisjOiBvc191bml4LmM6MTIxOQorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIlRlc3QgZGVzIFgtRGlzcGxheXMgc2NobHVnIGZlaGwiCisKKyM6IG9zX3VuaXguYzoxMzYzCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAiWmVpdPxiZXJzY2hyZWl0dW5nIHfkaHJlbmQgZGVzINZmZm5lbnMgZGVzIFgtRGlzcGxheXMiCisKKyM6IG9zX3VuaXguYzoyOTc2IG9zX3VuaXguYzozNjM0Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIlNoZWxsIGthbm4gbmljaHQgYXVzZvxocnQgd2VyZGVuICIKKworIzogb3NfdW5peC5jOjMwMjEKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIlNoZWxsIHNoIGthbm4gbmljaHQgYXVzZvxocnQgd2VyZGVuXG4iCisKKyM6IG9zX3VuaXguYzozMDI1IG9zX3VuaXguYzozNjQwCittc2dpZCAiIgorIlxuIgorInNoZWxsIHJldHVybmVkICIKK21zZ3N0ciAiIgorIlxuIgorIlNoZWxsIGJlZW5kZXQgIgorCisjOiBvc191bml4LmM6MzE1OQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyJQaXBlcyBr9m5uZW4gbmljaHQgYW5nZWxlZ3Qgd2VyZGVuXG4iCisKKyM6IG9zX3VuaXguYzozMTc0Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyInZm9yaycgc2NobHVnIGZlaGxcbiIKKworIzogb3NfdW5peC5jOjM2NDcKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJCZWZlaGwgYmVlbmRldFxuIgorCisjOiBvc191bml4LmM6NTE2NAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgItZmZm5lbiBkZXMgWC1EaXNwbGF5cyBzY2hsdWcgZmVobCIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiSW4gWmVpbGUiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIktvbm50ZSB2aW0zMi5kbGwgbmljaHQgbGFkZW4hIgorCisjOiBvc193MzJleGUuYzoxNjkgb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJWSU0gRmVobGVyIgorCisjOiBvc193MzJleGUuYzoxNzkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJLb25udGUgRnVua3Rpb25zLVplaWdlciBpbiBkZXIgRExMIG5pY2h0IGtvcnJpZ2llcmVuISIKKworIzogb3Nfd2luMTYuYzo1Nzggb3Nfd2luMzIuYzozMDM3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJTaGVsbCBnYWIgJWQgenVy/GNrIgorCisjOiBvc193aW4zMi5jOjI1MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiBGaW5nIEVyZWlnbmlzICVzIGVpblxuIgorCisjOiBvc193aW4zMi5jOjI1MDcKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAic2NobGll32UiCisKKyM6IG9zX3dpbjMyLmM6MjUwOQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAiYXVzLWxvZ2dlbiIKKworIzogb3Nfd2luMzIuYzoyNTEwCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgImJlZW5kZW4iCisKKyM6IG9zX3dpbjMyLmM6Mjk5MQorbXNnaWQgIkUzNzE6IENvbW1hbmQgbm90IGZvdW5kIgorbXNnc3RyICJFMzcxOiBCZWZlaGwgbmljaHQgZ2VmdW5kZW4iCisKKyM6IG9zX3dpbjMyLmM6MzAwNAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEUgd3VyZGUgaW0gUGZhZCAkUEFUSCBuaWNodCBnZWZ1bmRlbi5cbiIKKyJFeHRlcm5lIEJlZmVobGUgd2VyZGVuIG5hY2ggQXVzZvxocnVuZyBuaWNodCBhbmhhbHRlbi5cbiIKKyJTaWVoZSAgOmhlbHAgd2luMzItdmltcnVuICBm/HIgbWVociBJbmZvcm1hdGlvbi4iCisKKyM6IG9zX3dpbjMyLmM6MzAwNworbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWaW0gV2FybnVuZyIKKworIzogcXVpY2tmaXguYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiBadSB2aWVsZSAlJSVjIGltIEZvcm1hdCIKKworIzogcXVpY2tmaXguYzoyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6IFVuZXJ3YXJ0ZXRlcyAlJSVjIGltIEZvcm1hdCIKKworIzogcXVpY2tmaXguYzozNDgKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogZmVobGVuZGVzIF0gaW0gRm9ybWF0IgorCisjOiBxdWlja2ZpeC5jOjM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc1OiBVbnN1cHBvcnRlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzU6ICUlJWMgd2lyZCBpbSBGb3JtYXQgbmljaHQgdW50ZXJzdPx0enQiCisKKyM6IHF1aWNrZml4LmM6MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogVW56dWzkc3NpZ2VzICUlJWMgaW0gUHJlZml4IGRlcyBGb3JtYXRzIgorCisjOiBxdWlja2ZpeC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogVW56dWzkc3NpZ2VzICUlJWMgaW0gRm9ybWF0IgorCisjOiBxdWlja2ZpeC5jOjQxNAorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogJ2Vycm9yZm9ybWF0JyBlbnRo5Gx0IGtlaW4gTXVzdGVyIgorCisjOiBxdWlja2ZpeC5jOjUyMAorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IEZlaGxlbmRlciBvZGVyIGxlZXJlciBWZXJ6ZWljaG5pc25hbWUiCisKKyM6IHF1aWNrZml4LmM6OTMxCittc2dpZCAiTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiS2VpbmUgd2VpdGVyZW4gUHVua3RlIgorCisjOiBxdWlja2ZpeC5jOjExNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIGF1cyAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTE1NAorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiIChaZWlsZSBnZWz2c2NodCkiCisKKyM6IHF1aWNrZml4LmM6MTM2MAorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDogQW0gQW5mYW5nIGRlciBxdWlja2ZpeCBMaXN0ZSIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBBbiBFbmRlIGRlciBxdWlja2ZpeCBMaXN0ZSIKKworIzogcXVpY2tmaXguYzoxMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAiRmVobGVybGlzdGUgJWQgYXVzICVkOyAlZCBGZWhsZXIiCisKKyM6IHF1aWNrZml4LmM6MTg0MgorbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIkUzODI6IEthbm4gbmljaHQgc2NocmVpYmVuLCAnYnVmdHlwZSctT3B0aW9uIGlzdCBnZXNldHp0IgorCisjOiByZWdleHAuYzo4MjIKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiBNdXN0ZXIgenUgbGFuZyIKKworIzogcmVnZXhwLmM6MTMzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogVmVyc2NoYWNodGVsdGVzICVzKiIKKworIzogcmVnZXhwLmM6MTM0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6IFZlcnNjaGFjaHRlbHRlcyAlcyVjIgorCisjOiByZWdleHAuYzoxNDkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyBuYWNoIE5pY2h0cyIKKworIzogcmVnZXhwLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICJTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAiU3ludGF4IEZlaGxlciBpbiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzU3Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IEFic3R1cnogdmVyaGluZGVydDsgSXN0IGRlciByZWd1bORyZSBBdXNkcnVjayB6dSBrb21wbGl6aWVydD8iCisKKyM6IHJlZ2V4cC5jOjI4OTIKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IE11c3RlciBlcnpldWd0ZSBlaW5lbiBTdGFwZWwt3GJlcmxhdWYtRmVobGVyIgorCisjOiByZWdleHAuYzozMTI4Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAiZXh0ZXJuZSAnc3VibWF0Y2hlcyc6XG4iCisKKyM6IHNjcmVlbi5jOjIwNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkIFplaWxlbiBnZWZhbHRldCAiCisKKyM6IHNjcmVlbi5jOjc1MzUKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLUVSU0VUWkVOIgorCisjOiBzY3JlZW4uYzo3NTM5Cittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiBFUlNFVFpFTiIKKworIzogc2NyZWVuLmM6NzU0NAorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgSU5WRVJUSUVSVCIKKworIzogc2NyZWVuLmM6NzU0NgorbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiBFSU5G3EdFTiIKKworIzogc2NyZWVuLmM6NzU0OQorbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiIChlaW5m/GdlbikiCisKKyM6IHNjcmVlbi5jOjc1NTEKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKGVyc2V0emVuKSIKKworIzogc2NyZWVuLmM6NzU1MworbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKHYtZXJzZXR6ZW4pIgorCisjOiBzY3JlZW4uYzo3NTU2Cittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIEhlYnLkaXNjaCIKKworIzogc2NyZWVuLmM6NzU2NAorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAoU3ByYWNoZSkiCisKKyMgZWlua2xlYmVuIGlzdCBlY2h0IFNjaGVp32UsIGFiZXIgZWluZvxnZW4KKyMgZ2lidHMgc2Nob24gLi4uCisjOiBzY3JlZW4uYzo3NTY3Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAoZWlua2xlYmVuKSIKKworIzogc2NyZWVuLmM6NzU3MworbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBBVVNXQUhMIgorCisjOiBzY3JlZW4uYzo3NTc1Cittc2dpZCAiIFZJU1VBTCIKK21zZ3N0ciAiIFZJU1VFTEwiCisKKyM6IHNjcmVlbi5jOjc1NzcKK21zZ2lkICIgQkxPQ0siCittc2dzdHIgIkVSIEJMT0NLIgorCisjOiBzY3JlZW4uYzo3NTc5Cittc2dpZCAiIExJTkUiCittc2dzdHIgIkUgWkVJTEUiCisKKyM6IHNjcmVlbi5jOjc1OTIgc2NyZWVuLmM6NzY1MgorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAiYXVmemVpY2huZW4iCisKKyM6IHNlYXJjaC5jOjM2Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJTdWNoZSBlcnJlaWNodGUgZGVuIEFORkFORyB1bmQgd3VyZGUgYW0gRU5ERSBmb3J0Z2VzZXR6dCIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgIlN1Y2hlIGVycmVpY2h0ZSBkYXMgRU5ERSB1bmQgd3VyZGUgYW0gQU5GQU5HIGZvcnRnZXNldHp0IgorCisjOiBzZWFyY2guYzo0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogVW56dWzkc3NpZ2VzIFN1Y2htdXN0ZXI6ICVzIgorCisjOiBzZWFyY2guYzo3ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBTdWNoZSBlcnJlaWNodGUgZGVuIEFORkFORyBvaG5lIFRyZWZmZXIgZvxyOiAlcyIKKworIzogc2VhcmNoLmM6Nzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTogU3VjaGUgZXJyZWljaHRlIGRhcyBFTkRFIG9obmUgVHJlZmZlciBm/HI6ICVzIgorCisjOiBzZWFyY2guYzoxMTU3Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiBFcndhcnRlICc/JyBvZGVyICcvJyAgbmFjaCAnOyciCisKKyM6IHNlYXJjaC5jOjM1MzcKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiIChlbnRo5Gx0IGJlcmVpdHMgdm9yaGVyIGF1ZmdleuRobHRlIFRyZWZmZXIpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM1NTcKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gRWluZ2Vm/Gd0ZSBEYXRlaWVuICIKKworIzogc2VhcmNoLmM6MzU1OQorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIm5pY2h0IGdlZnVuZGVuICIKKworIzogc2VhcmNoLmM6MzU2MAorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgImltIFBmYWQgLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM1OTkKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKEJlcmVpdHMgYXVmZ2VsaXN0ZXQpIgorCisjOiBzZWFyY2guYzozNjAxCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAgTklDSFQgR0VGVU5ERU4iCisKKyM6IHNlYXJjaC5jOjM2NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIlNjYW5uZSBlaW5nZWb8Z3RlIERhdGVpOiAlcyIKKworIzogc2VhcmNoLmM6Mzg3MQorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogVHJlZmZlciBpc3QgYXVmIGRlciBtb21lbnRhbmVuIFplaWxlIgorCisjOiBzZWFyY2guYzo0MDExCittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIkFsbGUgZWluZ2Vm/Gd0ZW4gRGF0ZWllbiB3dXJkZW4gZ2VmdW5kZW4iCisKKyM6IHNlYXJjaC5jOjQwMTMKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiS2VpbmUgZWluZ2Vm/Gd0ZW4gRGF0ZWllbiIKKworIzogc2VhcmNoLmM6NDAyOQorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogRGVmaW5pdGlvbiBrb25udGUgbmljaHQgZ2VmdW5kZW4gd2VyZGVuIgorCisjOiBzZWFyY2guYzo0MDMxCittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiBNdXN0ZXIga29ubnRlIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiIKKworIzogc3ludGF4LmM6Mjk5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDogVW56dWzkc3NpZ2VzIEFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6MzE3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogS2VpbiBzb2xjaGVzIFN5bnRheC1DbHVzdGVyOiAlcyIKKworIzogc3ludGF4LmM6MzM0MworbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiS2VpbmUgU3ludGF4LUVsZW1lbnRlIGRlZmluaWVydCBm/HIgZGllc2VuIFB1ZmZlciIKKworIzogc3ludGF4LmM6MzM1MQorbXNnaWQgInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIKK21zZ3N0ciAiU3luY2hyb25pc2F0aW9uIGFuIEMtU3RpbCBLb21tZW50YXJlbiIKKworIzogc3ludGF4LmM6MzM1OQorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgImtlaW5lIFN5bmNocm9uaXNhdGlvbiIKKworIzogc3ludGF4LmM6MzM2MgorbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAiU3luY2hyb25pc2F0aW9uIGJlZ2lubnQgIgorCisjOiBzeW50YXguYzozMzY0IHN5bnRheC5jOjM0MzkKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgWmVpbGVuIHZvciBkZXIgb2JlcnN0ZW4gWmVpbGUiCisKKyM6IHN5bnRheC5jOjMzNjkKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBTeW50YXggU3luY2hyb25pc2F0aW9ucy1FbGVtZW50ZSAtLS0iCisKKyM6IHN5bnRheC5jOjMzNzQKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorIlN5bmNocm9uaXNhdGlvbiBhbiBFbGVtZW50ZW4iCisKKyM6IHN5bnRheC5jOjMzODAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU2F0emJhdSBFbGVtZW50ZSAtLS0iCisKKyM6IHN5bnRheC5jOjM0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IEtlaW4gc29sY2hlcyBTeW50YXgtQ2x1c3RlcjogJXMiCisKKyM6IHN5bnRheC5jOjM0MjkKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAibWluaW1hbCAiCisKKyM6IHN5bnRheC5jOjM0MzYKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibWF4aW1hbCAiCisKKyM6IHN5bnRheC5jOjM0NDgKK21zZ2lkICI7IG1hdGNoICIKK21zZ3N0ciAiOyBUcmVmZmVyICIKKworIzogc3ludGF4LmM6MzQ1MAorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIFplaWxlbi1VbWJy/GNoZSIKKworIzogc3ludGF4LmM6NDA3OAorbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogXCJncm91cFt0XWhlcmVcIiBpc3QgYW4gZGllc2VyIFN0ZWxsZSB1bmf8bHRpZyIKKworIzogc3ludGF4LmM6NDEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IFwicmVnaW9uXCItRWxlbWVudCBm/HIgXCIlc1wiIGtvbm50ZSBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4iCisKKyM6IHN5bnRheC5jOjQxMzAKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogXCJjb250YWluc1wiLUFyZ3VtZW50IGlzdCBhbiBkaWVzZXIgU3RlbGxlIHVuZ/xsdGlnIgorCisjOiBzeW50YXguYzo0MTQxCittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IFwiY29udGFpbmVkaW5cIi1Bcmd1bWVudCBpc3QgYW4gZGllc2VyIFN0ZWxsZSB1bmf8bHRpZyIKKworIzogc3ludGF4LmM6NDIxOQorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiBEYXRlaW5hbWUgd2lyZCBiZW72dGlndCIKKworIzogc3ludGF4LmM6NDU1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IEZlaGxlbmRlcyAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBOaWNodCBhdXNyZWljaGVuZCB2aWVsZSBBcmd1bWVudGU6IHN5bnRheCByZWdpb24gJXMiCisKKyM6IHN5bnRheC5jOjUwNDYKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogS2VpbiBDbHVzdGVyIGFuZ2VnZWJlbiIKKworIzogc3ludGF4LmM6NTA4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiBNdXN0ZXIgQWJncmVuemVyIG5pY2h0IGdlZnVuZGVuOiAlcyIKKworIzogc3ludGF4LmM6NTE1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiBTY2hyb3R0IG5hY2ggTXVzdGVyOiAlcyIKKworIzogc3ludGF4LmM6NTI0NQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bnRheCBzeW5jOiBaZWlsZW4gRm9ydHNldHp1bmdzIE11c3RlciB6d2VpZmFjaCBhbmdlZ2ViZW4iCisKKyM6IHN5bnRheC5jOjUzMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBVbnp1bORzc2lnZSBBcmd1bWVudGU7ICVzIgorCisjOiBzeW50YXguYzo1MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IEdsZWljaGhlaXRzemVpY2hlbiBmZWhsdDogJXMiCisKKyM6IHN5bnRheC5jOjUzNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBMZWVyZXMgQXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIGlzdCBoaWVyIG5pY2h0IGVybGF1YnQiCisKKyM6IHN5bnRheC5jOjUzOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICIiCisiRTQwODogJXMgbXVzcyBhbHMgRXJzdGVzIGluIGRlciBMaXN0ZSBkZXIgZW50aGFsdGVuZW4gRWxlbWVudGUgYXVmdHJldGVuIgorCisjOiBzeW50YXguYzo1NDYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IFVuYmVrYW5udGVyIEdydXBwZW4tTmFtZTogJXMiCisKKyM6IHN5bnRheC5jOjU2OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiBVbmf8bHRpZ2VyIDpzeW50YXggQmVmZWhsOiAlcyIKKworIzogc3ludGF4LmM6NjA3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogSGVydm9yaGVidW5ncy1HcnVwcGUgbmljaHQgZ2VmdW5kZW46ICVzIgorCisjOiBzeW50YXguYzo2MDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBOaWNodCBhdXNyZWljaGVuZCB2aWVsZSBBcmd1bWVudGU6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBadSB2aWVsZSBBcmd1bWVudGU6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxMjIKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IEdydXBwZSBoYXQgRWluc3RlbGx1bmdlbiwgVW50ZXJzdHJlaWNodW5ncyBMaW5rIGlnbm9yaWVydCIKKworIzogc3ludGF4LmM6NjI1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiB1bmVyd2FydGV0ZXMgR2xlaWNoaGVpdHN6ZWljaGVuOiAlcyIKKworIzogc3ludGF4LmM6NjI4NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiBmZWhsZW5kZXMgR2xlaWNoaGVpdHN6ZWljaGVuOiAlcyIKKworIzogc3ludGF4LmM6NjMwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogZmVobGVuZGVzIEFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NjM0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogVW56dWzkc3NpZ2VyIFdlcnQ6ICVzIgorCisjOiBzeW50YXguYzo2NDY1Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogRkcgRmFyYmUgdW5iZWthbm50IgorCisjOiBzeW50YXguYzo2NDc2Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogQkcgRmFyYmUgdW5iZWthbm50IgorCisjOiBzeW50YXguYzo2NTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogVW5iZWthbm50ZSBGYXJiLUJlemVpY2hudW5nIG9kZXIgLU51bW1lcjogJXMiCisKKyM6IHN5bnRheC5jOjY3NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMjogdGVybWluYWwgY29kZSB0b28gbG9uZzogJXMiCittc2dzdHIgIkU0MjI6IFRlcm1pbmFsLUNvZGUgenUgbGFuZzogJXMiCisKKyM6IHN5bnRheC5jOjY3OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IFVuenVs5HNzaWdlcyBBcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjczMjEKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBadSB2aWVsZSB2ZXJzY2hpZWRlbiBIZXJ2b3JoZWJ1bmdzLUF0dHJpYnV0ZSBpbiBHZWJyYXVjaCIKKworIzogdGFnLmM6OTAKK21zZ2lkICJhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICJhbSBBbmZhbmcgZGVyIFRhZy1MaXN0ZSIKKworIzogdGFnLmM6OTEKK21zZ2lkICJhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJhbSBFbmRlIGRlciBUYWctTGlzdGUiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiBLYW5uIG5pY2h0IHZvciBkZW4gZXJzdGVuIHBhc3NlbmRlbiBUYWcgaGluYXVzZ2VoZW4iCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogVGFnIFwiJXNcIiBrb25udGUgbmljaHQgZ2VmdW5kZW4gd2VyZGVuIgorCisjOiB0YWcuYzo1NDUKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICAjIHByaSB2ZXJ3LiB0YWciCisKKyM6IHRhZy5jOjU0OAorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAiRGF0ZWlcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiR2V3/G5zY2h0ZSBOdW1tZXIgKGFiYnJlY2hlbiBtaXQgPENSPik6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiBFcyBnaWJ0IG51ciBlaW5lbiBwYXNzZW5kZW4gVGFnIgorCisjOiB0YWcuYzo3NDgKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI4OiBLYW5uIG5pY2h0IPxiZXIgZGVuIGxldHp0ZW4gcGFzc2VuZGVuIFRhZyBoaW5hdXNnZWhlbiIKKworIzogdGFnLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJEaWUgRGF0ZWkgXCIlc1wiIGV4aXN0aWVydCBuaWNodCIKKworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6NzgwCisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICJUYWcgJWQgYXVzICVkJXMiCisKKyM6IHRhZy5jOjc4MworbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgb2RlciBtZWhyIgorCisjOiB0YWcuYzo3ODUKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICBWZXJ3ZW5kdW5nIGVpbmVzIFRhZ3MgbWl0IGFiZ2V3YW5kZWx0ZXIgR3Jv3y9LbGVpbi1TY2hyZWlidW5nIgorCisjOiB0YWcuYzo4MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IERpZSBEYXRlaSBcIiVzXCIgZXhpc3RpZXJ0IG5pY2h0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRhZy5jOjg5NworbXNnaWQgIiIKKyJcbiIKKyIgICMgVE8gdGFnICAgICAgICAgRlJPTSBsaW5lICBpbiBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgICMgTkFDSCBUQUcgICAgICAgVk9OIFplaWxlICBpbiBEYXRlaS9UZXh0IgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIkxpbmVhcmUgVGFnLVN1Y2hlIgorCisjOiB0YWcuYzoxMTQ2Cittc2dpZCAiQmluYXJ5IHRhZyBzZWFyY2giCittc2dzdHIgIkJpbuRyZSBUYWctU3VjaGUiCisKKyM6IHRhZy5jOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAidGFncyBmaWxlICVzIHdpcmQgZHVyY2hzdWNodCIKKworIzogdGFnLmM6MTM1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogVGFnLURhdGVpcGZhZCB3dXJkZSBhYmdlc2Nobml0dGVuIGb8ciAlc1xuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBGb3JtYXQgRmVobGVyIGluIFRhZy1EYXRlaSBcIiVzXCIiCisKKyM6IHRhZy5jOjE4NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICJ2b3IgYnl0ZSAlbGQiCisKKyM6IHRhZy5jOjE4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiBUYWctRGF0ZWkgaXN0IG5pY2h0IHNvcnRpZXJ0OiAlcyIKKworIy4gbmV2ZXIgb3BlbmVkIGFueSB0YWdzIGZpbGUKKyM6IHRhZy5jOjE5MTEKK21zZ2lkICJFNDMzOiBObyB0YWdzIGZpbGUiCittc2dzdHIgIkU0MzM6IEtlaW5lIFRhZy1EYXRlaSIKKworIzogdGFnLmM6MjU4MworbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IFRhZy1NdXN0ZXIga2FubiBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4iCisKKyM6IHRhZy5jOjI1OTQKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IFRhZyBrb25udGUgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLCBkYXMgaXN0IG51ciBlaW5lIFZlcm11dHVuZyEiCisKKyM6IHRlcm0uYzoxNzM3Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICIiCisiJyBuaWNodCBiZWthbm50LiBadXIgVmVyZvxndW5nIHN0ZWhlbiBkaWUgZm9sZ2VuZGVuIGVpbmdlYmF1dGVuIFRlcm1pbmFsczoiCisKKyM6IHRlcm0uYzoxNzYxCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJWb3JlaW5zdGVsbHVuZyAnIgorCisjOiB0ZXJtLmM6MjExNAorbXNnaWQgIkNhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAidGVybXBjYXAtRGF0ZWkga2FubiBuaWNodCBnZfZmZm5ldCB3ZXJkZW4iCisKKyM6IHRlcm0uYzoyMTE3Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJUZXJtaW5hbC1FaW50cmFnIGtvbm50ZSBpbiBkZXIgdGVybWluZm8tRGF0ZWkgbmljaHQgZ2VmdW5kZW4gd2VyZGVuIgorCisjOiB0ZXJtLmM6MjExOQorbXNnaWQgIlRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJUZXJtaW5hbC1FaW50cmFnIGtvbm50ZSBpbiBkZXIgdGVybWNhcC1EYXRlaSBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4iCisKKyM6IHRlcm0uYzoyMjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBLZWluIFwiJXNcIiBFaW50cmFnIGluIHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyNzUyCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IFRlcm1pbmFsLUbkaGlna2VpdCBcImNtXCIgd2lyZCBiZW72dGlndCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDg5MQorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVGVybWluYWwgVGFzdGVuIC0tLSIKKworIzogdWkuYzoyNTEKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJuZXVlIFNoZWxsIGdlc3RhcnRldFxuIgorCisjOiB1aS5jOjE3NDcKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiBGZWhsZXIgYmVpbSBMZXNlbiBkZXIgRWluZ2FiZSwgQWJicnVjaC4uLlxuIgorCisjIFRPRE86IG5lZWQgbW9yZSB3b3JrIQorIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozODMKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIlL8Y2tn5G5naWdtYWNodW5nIG5pY2h0IG32Z2xpY2g7IHNldHplIHRyb3R6IGRlbSBmb3J0IgorCisjOiB1bmRvLmM6NTM4Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogWmVpbGVubnVtbWVyIGZhbHNjaCIKKworIzogdW5kby5jOjcwNworbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICIxIMRuZGVydW5nIgorCisjOiB1bmRvLmM6NzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGQgxG5kZXJ1bmdlbiIKKworIzogdW5kby5jOjc1MworbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiBS/GNrZ2FuZ2JhcmtlaXRzbGlzdGUga2FwdXR0IgorCisjOiB1bmRvLmM6Nzg1Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IFL8Y2tnYW5nYmFya2VpdHNsaXN0ZSBmZWhsdCIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjY5MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgQml0IEdVSSBWZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6NjkzCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBCaXQgR1VJIFZlcnNpb24iCisKKyM6IHZlcnNpb24uYzo2OTYKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiBpbiBXaW4zMnMgTW9kdXMiCisKKyM6IHZlcnNpb24uYzo2OTgKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIG1pdCBPTEUgVW50ZXJzdPx0enVuZyIKKworIzogdmVyc2lvbi5jOjcwMQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIEJpdCBLb25zb2xlbiBWZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6NzA1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IEJpdCBWZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6NzA5Cittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIEJpdCBNUy1ET1MgVmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjcxMQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiBCaXQgTVMtRE9TIFZlcnNpb24iCisKKyM6IHZlcnNpb24uYzo3MTcKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIFZlcnNpb24iCisKKyM6IHZlcnNpb24uYzo3MTkKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCBWZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6NzIyCittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBWZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6NzI3Cittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlJJU0MgT1MgVmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjczNworbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJJbmNsdXNpdmUgZGVyIEtvcnJla3R1cmVuOiAiCisKKyM6IHZlcnNpb24uYzo3NjMgdmVyc2lvbi5jOjEwOTgKK21zZ2lkICJNb2RpZmllZCBieSAiCittc2dzdHIgIlZlcuRuZGVydCB2b24gIgorCisjOiB2ZXJzaW9uLmM6NzcwCittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorItxiZXJzZXR6dCAiCisKKyM6IHZlcnNpb24uYzo3NzMKK21zZ2lkICJieSAiCittc2dzdHIgInZvbiAiCisKKyM6IHZlcnNpb24uYzo3ODUKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1vbnN0ZXIgVmVyc2lvbiAiCisKKyM6IHZlcnNpb24uYzo3ODgKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiR3Jv32UgVmVyc2lvbiAiCisKKyM6IHZlcnNpb24uYzo3OTEKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiTm9ybWFsZSBWZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjc5NAorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIktsZWluZSBWZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjc5NgorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiV2luemlnZSBWZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjgwMgorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAib2huZSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODA2Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAibWl0IEdUSy1HTk9NRSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODA4Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAibWl0IEdUSyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODEyCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAibWl0IFgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODE1Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIm1pdCBYMTEtQXRoZW5hIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAibWl0IEJlT1MgR1VJLiIKKworIzogdmVyc2lvbi5jOjgyMQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgIm1pdCBQaG90b24gR1VJLiIKKworIzogdmVyc2lvbi5jOjgyNAorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAibWl0IEdUSy4iCisKKyM6IHZlcnNpb24uYzo4MjcKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJtaXQgQ2FyYm9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MzAKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIm1pdCBDb2NvYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODMzCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAibWl0IChrbGFzc2lzY2hlbSkgR1VJLiIKKworIzogdmVyc2lvbi5jOjg0NAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiBFaW4tICgrKSBvZGVyIGF1c3NjaGxpZd9saWNoICgtKSBkZXIgRWlnZW5zY2hhZnRlbjpcbiIKKworIzogdmVyc2lvbi5jOjg1NgorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgIFN5c3RlbS12aW1yYy1EYXRlaTogXCIiCisKKyM6IHZlcnNpb24uYzo4NjEKK21zZ2lkICIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgQmVudXR6ZXItdmltcmMtRGF0ZWk6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODY2Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgendlaXRlIEJlbnV0emVyLXZpbXJjLURhdGVpOiBcIiIKKworIzogdmVyc2lvbi5jOjg3MQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIGRyaXR0ZSBCZW51dHplci12aW1yYy1EYXRlaTogXCIiCisKKyM6IHZlcnNpb24uYzo4NzYKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgIEJlbnV0emVyLWV4cmMtRGF0ZWk6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODgxCittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgendlaXRlIEJlbnV0emVyLXZpbXJjLURhdGVpOiBcIiIKKworIzogdmVyc2lvbi5jOjg4NworbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgU3lzdGVtLWd2aW1yYy1EYXRlaTogXCIiCisKKyM6IHZlcnNpb24uYzo4OTEKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICBCZW51dHplci1ndmltcmMtRGF0ZWk6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODk1Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICJ6d2VpdGUgQmVudXR6ZXItZ3ZpbXJjLURhdGVpOiBcIiIKKworIzogdmVyc2lvbi5jOjkwMAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiZHJpdHRlIEJlbnV0emVyLWd2aW1yYy1EYXRlaTogXCIiCisKKyM6IHZlcnNpb24uYzo5MDcKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgICAgU3lzdGVtLU1lbvwtRGF0ZWk6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE1Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgIFZvcmVpbnN0ZWxsdW5nIGb8ciAkVklNOiBcIiIKKworIzogdmVyc2lvbi5jOjkyMQorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICAgICAgICAgdW5kIGb8ciAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzo5MjUKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICLcYmVyc2V0enQ6ICIKKworIzogdmVyc2lvbi5jOjkzMQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIkNvbXBpbGVyOiAiCisKKyM6IHZlcnNpb24uYzo5MzYKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIkxpbmtlbjogIgorCisjOiB2ZXJzaW9uLmM6OTQxCittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICBERUJVRy1WRVJTSU9OIgorCisjOiB2ZXJzaW9uLmM6OTc3Cittc2dpZCAiVklNIC0gVmkgSU1wcm92ZWQiCittc2dzdHIgIlZJTSAtIHZlcmJlc3NlcnRlciBWaSIKKworIzogdmVyc2lvbi5jOjk3OQorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJWZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjk4MAorbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAidm9uIEJyYW0gTW9vbGVuYWFyIHVuZCBBbmRlcmVuIgorCisjOiB2ZXJzaW9uLmM6OTg0Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIGlzdCBPcGVuIFNvdXJjZSB1bmQga2FubiBmcmVpIHdlaXRlcmdlZ2ViZW4gd2VyZGVuIgorCisjOiB2ZXJzaW9uLmM6OTg2Cittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIkhlbGZlbiBTaWUgYXJtZW4gS2luZGVybiBpbiBVZ2FuZGEhIgorCisjOiB2ZXJzaW9uLmM6OTg3Cittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAidGlwcGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgICBm/HIgSW5mb3JtYXRpb25lbiBkYXL8YmVyICIKKworIzogdmVyc2lvbi5jOjk4OQorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgInRpcHBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICAgenVtIEJlZW5kZW4gICAgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5OTAKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJ0aXBwZSAgOmhlbHA8RW50ZXI+ICBvZGVyIDxGMT4gIGb8ciBPbmxpbmUgSGlsZmUgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6OTkxCittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAidGlwcGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgICBm/HIgVmVyc2lvbnMtSW5mb3JtYXRpb25lbiIKKworIzogdmVyc2lvbi5jOjk5NAorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJWaSBrb21wYXRpYmxlIEVpbnN0ZWxsdW5nIgorCisjOiB2ZXJzaW9uLmM6OTk1Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAidGlwcGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgICBm/HIgVmltLVZvcmVpbnN0ZWxsdW5nZW4gICIKKworIzogdmVyc2lvbi5jOjk5NgorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInRpcHBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiAgZvxyIEluZm9ybWF0aW9uZW4gZGFy/GJlciAiCisKKyM6IHZlcnNpb24uYzoxMDExCittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAiTWVu/CAgSGlsZmUtPldhaXNlbiAgICAgICAgICAgZvxyIEluZm9ybWF0aW9uZW4gZGFy/GJlciAgICAiCisKKyM6IHZlcnNpb24uYzoxMDEzCittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiTW9kZS1mcmVpZXIgQmV0cmllYiwgZ2V0aXBwdGVyIFRleHQgd2lyZCBlaW5nZWb8Z3QiCisKKyM6IHZlcnNpb24uYzoxMDE0Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAiTWVu/CAgRWRpdGllcmVuLT5HbG9iYWxlIEVpbnN0ZWxsdW5nLT5FaW5m/GdlLU1vZHVzIGVpbi0gdW5kIGF1c3NjaGFsdGVuICAiCisKKyM6IHZlcnNpb24uYzoxMDE1Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZvxyIHp3ZWkgTW9kaSAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDE5Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAiTWVu/CAgRWRpdGllcmVuLT5HbG9iYWxlIEVpbnN0ZWxsdW5nLT5WaS1Lb21wYXRpYmlsaXTkdCBlaW4tIHVuZCBhdXNzY2hhbHRlbiIKKworIzogdmVyc2lvbi5jOjEwMjAKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm/HIgVmltIFZvcmVpbnN0ZWxsdW5nZW4gICAiCisKKyM6IHZlcnNpb24uYzoxMDY2Cittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAiQUNIVFVORzogV2luZG93cyA5NS85OC9NRSB3dXJkZSBlcmthbm50IgorCisjOiB2ZXJzaW9uLmM6MTA2OQorbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInRpcHBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICAgZvxyIEluZm9ybWF0aW9uZW4gZGFy/GJlciAiCisKKyM6IHdpbmRvdy5jOjIwMQorbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiBFcyBnaWJ0IGtlaW4gRmVuc3RlciB6dXIgVm9yYW5zaWNodCIKKworIyBzaG91bGQgcmVhZDogdG9wbGVmdCAvIGJvdHJpZ2h0CisjOiB3aW5kb3cuYzo1ODAKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiB0b3BsZWZ0IHVuZCBib3RyaWdodCBr9m5uZW4gbmljaHQgZ2xlaWNoemVpdGlnIHZlcndlbmRldCB3ZXJkZW4iCisKKyM6IHdpbmRvdy5jOjEzMzkKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IFJvdGllcmVuIG5pY2h0IG32Z2xpY2ggd2VubiBlaW4gYW5kZXJlcyBGZW5zdGVyIGdldGVpbHQgaXN0IgorCisjOiB3aW5kb3cuYzoxODQxCittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiBMZXR6dGVzIEZlbnN0ZXIga2FubiBuaWNodCBnZXNjaGxvc3NlbiB3ZXJkZW4iCisKKyM6IHdpbmRvdy5jOjI1MDUKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAiQmVyZWl0cyBudXIgZWluIEZlbnN0ZXIiCisKKyM6IHdpbmRvdy5jOjI1NTIKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogQW5kZXJlcyBGZW5zdGVyIGVudGjkbHQgxG5kZXJ1bmdlbiIKKworIyBDdXJzb3I6IFNjaHJlaWJtYXJrZSBQb3NpdGlvbnNtYXJrZQorIzogd2luZG93LmM6NDM3OQorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IEtlaW4gRGF0ZWluYW1lIHVudGVyIGRlbSBDdXJzb3IiCisKKyM6IHdpbmRvdy5jOjQ0OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiBEYXRlaSBcIiVzXCIga2FubiBpbSBQZmFkIG5pY2h0IGdlZnVuZGVuIHdlcmRlbiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIkVkaXRpZXJlIG1pdCAmbWVocmVyZW4gVmltcyIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTIKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIkVkaXRpZXJlIG1pdCBlaW5lbSAmVmltIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYwNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJFZGl0aWVyZSBtaXQgJlZpbSIKKworIy4gTm93IGNvbmNhdGVuYXRlCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYyOAorbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorbXNnc3RyICJFZGl0aWVyZSBtaXQgZXhpc3RpZXJlbmRlbSBWaW0gLSAmIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjc1MgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICJFZGl0aWVyZSBkaWUgYXVzZ2V35GhsdGVuIERhdGVpKGVuKSBtaXQgVmltIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MSAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk2OQorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU3RhcnRlbiBkZXMgUHJvemVzc2VzOiBJc3QgZ3ZpbSBpbSBQZmFkPyIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTIgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDYKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTcwCittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImd2aW1leHQuZGxsIEZlaGxlciIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDUKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIlBmYWQtTORuZ2UgenUgbGFuZyEiCisKKyM6IGdsb2JhbHMuaDo5MDAKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLUtlaW5lIFplaWxlbiBpbSBQdWZmZXItLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDQ4Cittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJCZWZlaGwgYWJnZWJyb2NoZW4iCisKKyM6IGdsb2JhbHMuaDoxMDQ5Cittc2dpZCAiQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkFyZ3VtZW50IHdpcmQgYmVu9nRpZ3QiCisKKyM6IGdsb2JhbHMuaDoxMDUwCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIHNvbGx0ZSB2b24gLywgPyBvciAmIGdlZm9sZ3Qgd2VyZGVuIgorCisjOiBnbG9iYWxzLmg6MTA1MgorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIiIKKyJFMTE6IFVuZ/xsdGlnIGltIEtvbW1hbmRvLVplaWxlbiBGZW5zdGVyOyA8Q1I+IGb8aHJ0IGF1cywgQ1RSTC1DIGJlZW5kZXQiCisKKyM6IGdsb2JhbHMuaDoxMDU0Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiBCZWZlaGwgbmljaHQgenVs5HNzaWcgdm9tIGV4cmMvdmltcmMgaW4gZGVyIG1vbWVudGFuZW4gVmVyemVpY2huaXMtICIKKyJvZGVyIFRhZy1TdWNoZSIKKworIzogZ2xvYmFscy5oOjEwNTUKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogRGF0ZWkgZXhpc3RpZXJ0IGJlcmVpdHMgKGVyendpbmdlIGR1cmNoICEpIgorCisjOiBnbG9iYWxzLmg6MTA1NgorbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJCZWZlaGwgc2NobHVnIGZlaGwiCisKKyM6IGdsb2JhbHMuaDoxMDU3Cittc2dpZCAiSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIkludGVybmVyIEZlaGxlciIKKworIzogZ2xvYmFscy5oOjEwNTgKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiVW50ZXJicm9jaGVuIgorCisjOiBnbG9iYWxzLmg6MTA1OQorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IFVuZ/xsdGlnZSBBZHJlc3NlIgorCisjOiBnbG9iYWxzLmg6MTA2MAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIlVuZ/xsdGlnZXMgQXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJVbmf8bHRpZ2VzIEFyZ3VtZW50OiAlcyIKKworIzogZ2xvYmFscy5oOjEwNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IHVuZ/xsdGlnZXIgQXVzZHJ1Y2s6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA2NQorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiBVbmf8bHRpZ2VyIEJlcmVpY2giCisKKyM6IGdsb2JhbHMuaDoxMDY2Cittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJVbmf8bHRpZ2VyIEJlZmVobHMtTmFtZSIKKworIzogZ2xvYmFscy5oOjEwNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIGlzdCBlaW4gVmVyemVpY2huaXMiCisKKyM6IGdsb2JhbHMuaDoxMDcxCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiBVbmVyd2FydGV0ZXMgWmVpY2hlbiB2b3IgJz0nIgorCisjOiBnbG9iYWxzLmg6MTA3MworbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiBNYXJrZSBoYXQgdW5n/Gx0aWdlIFplaWxlbm51bW1lciIKKworIzogZ2xvYmFscy5oOjEwNzQKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBNYXJrZSBuaWNodCBnZXNldHp0IgorCisjOiBnbG9iYWxzLmg6MTA3NQorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBLYW5uIGtlaW5lIMRuZGVydW5nZW4gbWFjaGVuLCAnbW9kaWZpYWJsZScgaXN0IGF1cyIKKworIzogZ2xvYmFscy5oOjEwNzYKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6IFNrcmlwdC1TY2hhY2h0ZWx1bmcgenUgdGllZiIKKworIzogZ2xvYmFscy5oOjEwNzcKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IEtlaW5lIGFsdGVybmF0aXZlIERhdGVpIgorCisjOiBnbG9iYWxzLmg6MTA3OAorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogS2VpbmUgQWJr/HJ6dW5nIGdlZnVuZGVuIgorCisjOiBnbG9iYWxzLmg6MTA3OQorbXNnaWQgIk5vICEgYWxsb3dlZCIKK21zZ3N0ciAiISBuaWNodCBlcmxhdWJ0IgorCisjOiBnbG9iYWxzLmg6MTA4MQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIiIKKyJFMjU6IEdVSSBrYW5uIG5pY2h0IGJlbnV0enQgd2VyZGVuOiB3dXJkZSB6dW0gWmVpdHB1bmt0IGRlcyDcYmVyc2V0emVucyAiCisibmljaHQgZWluZ2VzY2hhbHRldC4iCisKKyM6IGdsb2JhbHMuaDoxMDg0Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICIiCisiRTI2OiBIZWJy5GlzY2gga2FubiBuaWNodCBiZW51dHp0IHdlcmRlbjogd3VyZGUgenVtIFplaXRwdW5rdCBkZXMgIgorItxiZXJzZXR6ZW5zIG5pY2h0IGVpbmdlc2NoYWx0ZXQuXG4iCisKKyM6IGdsb2JhbHMuaDoxMDg3Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIiIKKyJFMjc6IEZhcnNpIGthbm4gbmljaHQgYmVudXR6dCB3ZXJkZW46IHd1cmRlIHp1bSBaZWl0cHVua3QgZGVzINxiZXJzZXR6ZW5zICIKKyJuaWNodCBlaW5nZXNjaGFsdGV0LlxuIgorCisjOiBnbG9iYWxzLmg6MTA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IEhlcnZvcmhlYnVuZ3MtR3J1cHBlIGV4aXN0aWVydCBuaWNodDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIKK21zZ3N0ciAiRTI5OiBOb2NoIGtlaW4gZWluZ2Vm/Gd0ZXIgVGV4dCIKKworIzogZ2xvYmFscy5oOjEwOTMKK21zZ2lkICJFMzA6IE5vIHByZXZpb3VzIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiRTMwOiBLZWluZSB2b3JoZXJpZ2UgQmVmZWhsc3plaWxlIgorCisjOiBnbG9iYWxzLmg6MTA5NAorbXNnaWQgIkUzMTogTm8gc3VjaCBtYXBwaW5nIgorbXNnc3RyICJFMzE6IEtlaW5lIFp1b3JkbnVuZyBnZWZ1bmRlbiIKKworIzogZ2xvYmFscy5oOjEwOTUKK21zZ2lkICJObyBtYXRjaCIKK21zZ3N0ciAiS2VpbiBUcmVmZmVyIgorCisjOiBnbG9iYWxzLmg6MTA5NgorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaDogJXMiCittc2dzdHIgIktlaW4gVHJlZmZlciBm/HI6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA5NworbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IEtlaW4gRGF0ZWluYW1lIgorCisjOiBnbG9iYWxzLmg6MTA5OAorbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogS2VpbiB2b3JoZXJpZ2VyIHJlZ3Vs5HJlciBFcnNldHp1bmdzLUF1c2RydWNrIgorCisjOiBnbG9iYWxzLmg6MTA5OQorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiBLZWluIHZvcmhlcmlnZXIgQmVmZWhsIgorCisjOiBnbG9iYWxzLmg6MTEwMAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IEtlaW5lIHZvcmhlcmlnZXIgcmVndWzkcmVyIEF1c2RydWNrIgorCisjOiBnbG9iYWxzLmg6MTEwMQorbXNnaWQgIk5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkJlcmVpY2ggdW56dWzkc3NpZyIKKworIzogZ2xvYmFscy5oOjExMDMKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiB6dSB3ZW5pZyBQbGF0eiIKKworIzogZ2xvYmFscy5oOjExMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkRhdGVpIGthbm4gbmljaHQgZXJ6ZXVndCB3ZXJkZW46ICVzIgorCisjOiBnbG9iYWxzLmg6MTEwNgorbXNnaWQgIkNhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAidGVtcC1EYXRlaSBrYW5uIG5pY2h0IGVyemV1Z3Qgd2VyZGVuIgorCisjOiBnbG9iYWxzLmg6MTEwNworIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkRhdGVpICVzIGthbm4gbmljaHQgZ2X2ZmZuZXQgd2VyZGVuIgorCisjOiBnbG9iYWxzLmg6MTEwOAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIkRhdGVpICVzIGthbm4gbmljaHQgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTM3OiBzZWl0IGRlciBsZXR6dGVuIMRuZGVydW5nIHd1cmRlIG5pY2h0IGdlc2NocmllYmVuIChlcnp3aW5nZSBtaXQgISkiCisKKyM6IGdsb2JhbHMuaDoxMTEwCittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IE51bGwtQXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMTEyCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogTnVtbWVyIGVyd2FydGV0IgorCisjOiBnbG9iYWxzLmg6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIgorbXNnc3RyICJFNDA6IEZlaGxlci1EYXRlaSAlcyBrYW5uIG5pY2h0IGdl9mZmbmV0IHdlcmRlbiIKKworIzogZ2xvYmFscy5oOjExMTgKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IFNwZWljaGVyIGVyc2No9nBmdCEiCisKKyM6IGdsb2JhbHMuaDoxMTIxCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIk11c3RlciBuaWNodCBnZWZ1bmRlbiIKKworIzogZ2xvYmFscy5oOjExMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJNdXN0ZXIgbmljaHQgZ2VmdW5kZW46ICVzIgorCisjOiBnbG9iYWxzLmg6MTEyNAorbXNnaWQgIkFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkFyZ3VtZW50IG11c3MgcG9zaXRpdiBzZWluIgorCisjOiBnbG9iYWxzLmg6MTEyNgorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IEtlaW4gRmVobGVyIgorCisjOiBnbG9iYWxzLmg6MTEyOAorbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogQmVzY2jkZGlndGVyIFN1Y2hhdXNkcnVjayIKKworIzogZ2xvYmFscy5oOjExMjkKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiBzY2hhZGhhZnRlcyByZWdleHAgUHJvZ3JhbW0iCisKKyM6IGdsb2JhbHMuaDoxMTMwCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU0NTogRGllIFNjaHJlaWJzY2h1dHotT3B0aW9uICdyZWFkb25seScgaXN0IGdlc2V0enQgKGVyendpbmdlIGR1cmNoICEpIgorCisjOiBnbG9iYWxzLmg6MTEzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBWYXJpYWJsZSBcIiVzXCIga2FubiBudXIgZ2VsZXNlbiB3ZXJkZW4iCisKKyM6IGdsb2JhbHMuaDoxMTM1Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBGZWhsZXIgd+RocmVuZCBkZXMgTGVzZW5zIGRlciBGZWhsZXItRGF0ZWkiCisKKyM6IGdsb2JhbHMuaDoxMTM4Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IEluIGVpbmVyIFNhbmRib3ggbmljaHQgZXJsYXVidCIKKworIzogZ2xvYmFscy5oOjExNDAKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogVW5n/Gx0aWdlIFNjcm9sbC1HcvbfZSIKKworIzogZ2xvYmFscy5oOjExNDEKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IERpZSBPcHRpb24gJ3NoZWxsJyBpc3QgbGVlciIKKworIzogZ2xvYmFscy5oOjExNDIKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiBGZWhsZXIgYmVpbSBTY2hsaWXfZW4gZGVyIEF1c2xhZ2VydW5ncy1EYXRlaSIKKworIzogZ2xvYmFscy5oOjExNDMKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiB0YWcgU3RhcGVsIGxlZXIuIgorCisjOiBnbG9iYWxzLmg6MTE0NAorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiBCZWZlaGwgenUga29tcGxpemllcnQiCisKKyM6IGdsb2JhbHMuaDoxMTQ1Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IE5hbWUgenUgbGFuZyIKKworIzogZ2xvYmFscy5oOjExNDYKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3NjogenUgdmllbGUgWyIKKworIzogZ2xvYmFscy5oOjExNDcKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogenUgdmllbGUgRGF0ZWktTmFtZW4iCisKKyM6IGdsb2JhbHMuaDoxMTQ4Cittc2dpZCAiVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAi3GJlcnNjaPxzc2lnZSBaZWljaGVuIgorCisjOiBnbG9iYWxzLmg6MTE0OQorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IFVuYmVrYW5udGUgTWFyayIKKworIzogZ2xvYmFscy5oOjExNTAKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6IEthbm4gXCJ3aWxkY2FyZHNcIiBuaWNodCBlcndlaXRlcm4iCisKKyM6IGdsb2JhbHMuaDoxMTUxCittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IEZlaGxlciB35GhyZW5kIGRlcyBTY2hyZWliZW5zIgorCisjOiBnbG9iYWxzLmg6MTE1MgorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIk51bGwtWuRobGVyIgorCisjOiBnbG9iYWxzLmg6MTE1NAorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogPFNJRD4gd3VyZGUgbmljaHQgaW4gZWluZXIgU2tyaXB0LVVtZ2VidW5nIGJlbnV0enQiCisKKyM6IGdsb2JhbHMuaDoxMTU3Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiB1bmf8bHRpZ2VyIEF1c2RydWNrIgpkaWZmIC0tZ2l0IGEvc3JjL3BvL2VuX0dCLnBvIGIvc3JjL3BvL2VuX0dCLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjA5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vZW5fR0IucG8KQEAgLTAsMCArMSw0OCBAQAorIyBVSyBFbmdsaXNoIFRyYW5zbGF0aW9uIGZvciBWaW0JCXZpbTpzZXQgZm9sZG1ldGhvZD1tYXJrZXI6CisjCisjIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorIyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyMKKyMgRklSU1QgQVVUSE9SIE1pa2UgV2lsbGlhbXMgPG1yd0BlYW5kZW0uY28udWs+LCAyMDAzLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogVmltKFVLIEVuZ2xpc2gpXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDMtMDItMjMgMTA6MjcrMDAwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDMtMDItMjUgMTE6MDUrMDAwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWlrZSBXaWxsaWFtcyA8bXJ3QGVhbmRlbS5jby51az5cbiIKKyJMYW5ndWFnZS1UZWFtOiBNaWtlIFdpbGxpYW1zIDxtcndAZWFuZGVtLmNvLnVrPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTT184ODU5LTFcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XG4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvdXIgc2NoZW1lICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG91ciAlcyIKKworbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG91cm1hcCBlbnRyeSwgc29tZSBjb2xvdXJzIG1heSBiZSBpbmNvcnJlY3QiCisKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvdXI+XHRVc2UgPGNvbG91cj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorCittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8Y29sb3VyPlx0VXNlIDxjb2xvdXI+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKKworbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICJNZXNzYWdlcyBtYWludGFpbmVyOiBNaWtlIFdpbGxpYW1zIDxtcndAZWFuZGVtLmNvLnVrPiIKKworbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IEZHIGNvbG91ciB1bmtub3duIgorCittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogQkcgY29sb3VyIHVua25vd24iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiBDb2xvdXIgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbmlzZWQ6ICVzIgpkaWZmIC0tZ2l0IGEvc3JjL3BvL2VzLnBvIGIvc3JjL3BvL2VzLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZmRlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vZXMucG8KQEAgLTAsMCArMSw2NzgwIEBACisjIFNwYW5pc2ggdHJhbnNsYXRpb24gZm9yIFZpbSAgICAgICAgICAgICB2aW06c2V0IGZvbGRtZXRob2Q9bWFya2VyOgorIworIyBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyMgRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisjCisjIEZJUlNUIEFVVEhPUiBFZHVhcmRvIEYuIEFtYXRyaWEgPGVmZXJuYTFAcGxhdGVhLnBudGljLm1lYy5lcz4sIDIwMDEuCisjCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0gNi4zYS4xNiAoRXNwYfFvbClcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogQWxlamFuZHJvIEzzcGV6LVZhbGVuY2lhIDxkcmFkdWxAeWFob28uY29tPlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA0LTA1LTEyIDE4OjM4LTA1MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA1LTEyIDIwOjM0LTA1MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEFsZWphbmRybyBM83Blei1WYWxlbmNpYSA8ZHJhZHVsQHlhaG9vLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBBbGVqYW5kcm8gTPNwZXotVmFsZW5jaWEgPGRyYWR1bEB5YWhvby5jb20+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiBObyBzZSBwdWVkZSBhc2lnbmFyIG1lbW9yaWEgcGFyYSBuaW5n+m4gq2J1ZmZlcrssIHNhbGllbmRvLi4uIgorCisjOiBidWZmZXIuYzoxMDUKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBObyBzZSBwdWVkZSBhc2lnbmFyIG1lbW9yaWEgcGFyYSBlbCCrYnVmZmVyuywgdXNhbmRvIG90cm8uLi4iCisKKyM6IGJ1ZmZlci5jOjgwNQorbXNnaWQgIkU1MTU6IE5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiRTUxNTogTm8gc2UgZGVzY2FyZ/MgbmluZ/puIKtidWZmZXK7LiIKKworIzogYnVmZmVyLmM6ODA3Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6IE5vIHNlIGJvcnLzIG5pbmf6biCrYnVmZmVyuy4iCisKKyM6IGJ1ZmZlci5jOjgwOQorbXNnaWQgIkU1MTc6IE5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiCittc2dzdHIgIkU1MTc6IE5vIHNlIGVsaW1pbvMgbmluZ/puIKtidWZmZXK7LiIKKworIzogYnVmZmVyLmM6ODE3Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIlVuIKtidWZmZXK7IGRlc2NhcmdhZG8uIgorCisjOiBidWZmZXIuYzo4MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAiJWQgq2J1ZmZlcnO7IGRlc2NhcmdhZG9zLiIKKworIzogYnVmZmVyLmM6ODI0Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiVW4gq2J1ZmZlcrsgc3VwcmltaWRvLiIKKworIzogYnVmZmVyLmM6ODI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAiJWQgq2J1ZmZlcnO7IHN1cHJpbWlkb3MuIgorCisjOiBidWZmZXIuYzo4MzEKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIjEgq2J1ZmZlcrsgZWxpbWluYWRvLiIKKworIzogYnVmZmVyLmM6ODMzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICIlZCCrYnVmZmVyc7sgZWxpbWluYWRvcy4iCisKKyM6IGJ1ZmZlci5jOjg5NAorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IE5vIGhlIGVuY29udHJhZG8gbmluZ/puIKtidWZmZXK7IG1vZGlmaWNhZG8uIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTMzCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IE5vIGhheSCrYnVmZmVyc7sgZW4gbGEgbGlzdGEuIgorCisjOiBidWZmZXIuYzo5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBCdWZmZXIgJWxkIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFODY6IEVsIKtidWZmZXK7ICVsZCBubyBleGlzdGUuIgorCisjOiBidWZmZXIuYzo5NDgKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogTm8gcHVlZG8gaXIgbeFzIGFsbOEgZGVsIPpsdGltbyCrYnVmZmVyuy4iCisKKyM6IGJ1ZmZlci5jOjk1MAorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogTm8gcHVlZG8gaXIgbeFzIGF0cuFzIGRlbCBwcmltZXIgYnVmZmVyLiIKKworIzogYnVmZmVyLmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU4OTogTm8gaGEgZ3VhcmRhZG8gZWwgZmljaGVybyBkZXNkZSBlbCD6bHRpbW8gY2FtYmlvIGRlbCCrYnVmZmVyuyAlbGQgIgorIihh8WFkYSAhIHBhcmEgZm9yemFyKS4iCisKKyM6IGJ1ZmZlci5jOjEwMDUKK21zZ2lkICJFOTA6IENhbm5vdCB1bmxvYWQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU5MDogTm8gc2UgcHVlZGUgZGVzY2FyZ2FyIGVsIPpsdGltbyBidWZmZXIuIgorCisjOiBidWZmZXIuYzoxNTM4Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogQWR2ZXJ0ZW5jaWE6IGxpc3RhIGRlIG5vbWJyZXMgZGUgZmljaGVyb3MgZGVtYXNpYWRvIGxhcmdhLiIKKworIzogYnVmZmVyLmM6MTcwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IE5vIHNlIGhhIGVuY29udHJhZG8gZWwgYnVmZmVyICVsZCIKKworIzogYnVmZmVyLmM6MTk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IE3hcyBkZSB1bmEgY29pbmNpZGVuY2lhIGNvbiAlcy4iCisKKyM6IGJ1ZmZlci5jOjE5NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IE5vIGhheSB1biBidWZmZXIgcXVlIGNvaW5jaWRhIGNvbiAlcy4iCisKKyM6IGJ1ZmZlci5jOjIzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgImztbmVhICVsZCIKKworIzogYnVmZmVyLmM6MjQyMAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IFlhIGV4aXN0ZSB1biBidWZmZXIgY29uIGVzdGUgbm9tYnJlLiIKKworIzogYnVmZmVyLmM6MjcxMworbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW01vZGlmaWNhZG9dIgorCisjOiBidWZmZXIuYzoyNzE4Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbU2luIGVkaXRhcl0iCisKKyM6IGJ1ZmZlci5jOjI3MjMKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbRmljaGVybyBudWV2b10iCisKKyM6IGJ1ZmZlci5jOjI3MjQKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbRXJyb3JlcyBkZSBsZWN0dXJhXSIKKworIzogYnVmZmVyLmM6MjcyNiBmaWxlaW8uYzoyMTEyCittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW1PzbG8gbGVjdHVyYV0iCisKKyM6IGJ1ZmZlci5jOjI3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICIxIGztbmVhIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIGztbmVhcyAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc1NgorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAibO1uZWEgJWxkIGRlICVsZCAtLSVkJSUtLSBjb2wgIgorCisjOiBidWZmZXIuYzoyODY0Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbU2luIGZpY2hlcm9dIgorCisjICBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjkwNAorbXNnaWQgImhlbHAiCittc2dzdHIgImF5dWRhIgorCisjOiBidWZmZXIuYzozNDYzIHNjcmVlbi5jOjUwNzUKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIltheXVkYV0iCisKKyM6IGJ1ZmZlci5jOjM0OTUgc2NyZWVuLmM6NTA4MQorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW1Zpc3RhIHByZXZpYV0iCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJBbGwiCittc2dzdHIgIlRvZG8iCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJCb3QiCittc2dzdHIgIkZpbmFsIgorCisjOiBidWZmZXIuYzozNzc3Cittc2dpZCAiVG9wIgorbXNnc3RyICJDb21pZW56byIKKworIzogYnVmZmVyLmM6NDUyMworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBMaXN0YSBkZSCrYnVmZmVyc7s6XG4iCisKKyM6IGJ1ZmZlci5jOjQ1NTYKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIltMaXN0YSBkZSBlcnJvcmVzXSIKKworIzogYnVmZmVyLmM6NDU2OSBtZW1saW5lLmM6MTUyMAorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW1NpbiBmaWNoZXJvXSIKKworIzogYnVmZmVyLmM6NDg4MgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFNpZ25vcyAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ5MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiU2lnbm9zIHBhcmEgJXMiCisKKyM6IGJ1ZmZlci5jOjQ5MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIGztbmVhPSVsZCBpZD0lZCBub21icmU9JXMiCisKKyM6IGRpZmYuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IE5vIHB1ZWRvIHVzYXIgq2RpZma7IGNvbiBt4XMgZGUgJWxkIKtidWZmZXJzuy4iCisKKyM6IGRpZmYuYzo3MTMKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogTm8gcHVlZG8gY3JlYXIgq2RpZmZzuy4iCisKKyM6IGRpZmYuYzo4MTgKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJGaWNoZXJvIGRlIHBhcmNoZXMuIgorCisjOiBkaWZmLmM6MTA2OQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogbm8gcHVlZG8gbGVlciBsYSBzYWxpZGEgZGUgq2RpZma7LiIKKworIzogZGlmZi5jOjE4MTkKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogRWwgq2J1ZmZlcrsgYWN0dWFsIG5vIGVzdOEgZW4gbW9kbyCrZGlmZrsuIgorCisjOiBkaWZmLmM6MTgzMQorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IE5pbmf6biBvdHJvIKtidWZmZXK7IGVzdOEgZW4gbW9kbyCrZGlmZrsuIgorCisjOiBkaWZmLmM6MTgzOQorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiRTEwMTogTeFzIGRlIGRvcyCrYnVmZmVyc7sgZW4gbW9kbyCrZGlmZrssIG5vIHNlIGN1YWwgdXNhci4iCisKKyM6IGRpZmYuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogTm8gcHVlZG8gZW5jb250cmFyIGVsIKtidWZmZXK7IKslc7suIgorCisjOiBkaWZmLmM6MTg2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDM6IEVsIKtidWZmZXK7IKslc7sgbm8gZXN04SBlbiBtb2RvIKtkaWZmuy4iCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IEVsIGPzZGlnbyBkZSBlc2NhcGUgbm8gc2UgcGVybWl0ZSBlbiB1biBk7WdyYWZvLiIKKworIzogZGlncmFwaC5jOjIzODQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IE5vIGVuY29udHLpIGVsIGZpY2hlcm8gq2tleW1hcLsuIgorCisjOiBkaWdyYXBoLmM6MjQxMQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogqzpsb2Fka2V5bWFwuyBlbiB1biBmaWNoZXJvIHF1ZSBubyBjb250aWVuZSBpbnN0cnVjY2lvbmVzIGVqZWN1dGFibGVzLiIKKworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk5eUCkiCittc2dzdHIgIiBDb21wbGV0YXIgcGFsYWJyYSBjbGF2ZSAoXk5eUCkuIgorCisjICBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FXlleTF5dXkZeSV5LXkReVl5OXlApIgorbXNnc3RyICIgbW9kbyBeWCAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkuIgorCisjICBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMgICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIHBhbGFicmEgY2xhdmUgbG9jYWwgKF5OXlApLiIKKworIzogZWRpdC5jOjQ1Cittc2dpZCAiIFdob2xlIGxpbmUgY29tcGxldGlvbiAoXkxeTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhciB0b2RhIGxhIGztbmVhICheTF5OXlApLiIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRl5OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIG5vbWJyZSBkZSBmaWNoZXJvICheRl5OXlApLiIKKworIzogZWRpdC5jOjQ3Cittc2dpZCAiIFRhZyBjb21wbGV0aW9uICheXV5OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIKt0YWe7ICheXV5OXlApLiIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhciBwYXRy824gZGUgcnV0YSAoXk5eUCkuIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRF5OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIGRlZmluaWNp824gKF5EXk5eUCkuIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheS15OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIGRpY2Npb25hcmlvICheS15OXlApLiIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVF5OXlApIgorbXNnc3RyICIgQ29tcGxldGFyIGRpY2Npb25hcmlvIGRlIHNpbvNuaW1vcyAoXlReTl5QKS4iCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlZeTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhciBs7W5lYSBkZSBjb21hbmRvcyAoXlZeTl5QKS4iCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJIZSBsbGVnYWRvIGFsIGZpbmFsIGRlbCBw4XJyYWZvLiIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiTGEgb3BjafNuIKt0aGVzYXVydXO7IGVzdOEgdmFj7WEuIgorCisjOiBlZGl0LmM6MTE2NgorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkxhIG9wY2nzbiCrZGljdGlvbmFyebsgZXN04SB2YWPtYS4iCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJCdXNjYW5kbyBlbiBlbCBkaWNjaW9uYXJpbzogJXMuIgorCisjOiBlZGl0LmM6MjM2OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnNlcnRhcikgq1Njcm9sbLsgKF5FL15ZKS4iCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChyZWVtcGxhemFyKSCrU2Nyb2xsuyAoXkUvXlkpLiIKKworIzogZWRpdC5jOjI2ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICJCdXNjYW5kbzogJXMuIgorCisjOiBlZGl0LmM6MjcxOQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJCdXNjYW5kbyCrdGFnc7suIgorCisjOiBlZGl0LmM6MzM4MQorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIkHxYWRpZW5kby4iCisKKyMgIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjICAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIyAgKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQzMAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gQnVzY2FuZG8uLi4iCisKKyM6IGVkaXQuYzozNDg2Cittc2dpZCAiQmFjayBhdCBvcmlnaW5hbCIKK21zZ3N0ciAiRGUgdnVlbHRhIGFsIG9yaWdpbmFsLiIKKworIzogZWRpdC5jOjM0OTEKK21zZ2lkICJXb3JkIGZyb20gb3RoZXIgbGluZSIKK21zZ3N0ciAiUGFsYWJyYSBkZSBvdHJhIGztbmVhLiIKKworIzogZWRpdC5jOjM0OTYKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiTGEg+m5pY2EgY29pbmNpZGVuY2lhLiIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgImNvaW5jaWRlbmNpYSAlZCBkZSAlZC4iCisKKyM6IGVkaXQuYzozNTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIgorbXNnc3RyICJjb2luY2lkZW5jaWEgJWQuIgorCisjICBTa2lwIGZ1cnRoZXIgYXJndW1lbnRzIGJ1dCBkbyBjb250aW51ZSB0bworIyAgKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4KKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjEwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiBWYXJpYWJsZSBkZXNjb25vY2lkYTogqyVzuy4iCisKKyM6IGV2YWwuYzoxMzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogRmFsdGFuIGxsYXZlczogJXMuIgorCisjOiBldmFsLmM6MTQzNSBldmFsLmM6MTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IE5vIGV4aXN0ZSB0YWwgdmFyaWFibGU6IKslc7suIgorCisjOiBldmFsLmM6MTcwNQorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogRmFsdGEgqzq7IGRlc3B16XMgZGUgqz+7LiIKKworIzogZXZhbC5jOjIzMjcKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogRmFsdGEgdW4gqym7LiIKKworIzogZXZhbC5jOjIzODkKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogRmFsdGEgdW4gq127LiIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IEZhbHRhIGVsIG5vbWJyZSBkZSBsYSBvcGNp8246ICVzLiIKKworIzogZXZhbC5jOjI0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBPcGNp824gZGVzY29ub2NpZGE6ICVzLiIKKworIzogZXZhbC5jOjI1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IEZhbHRhbiBjb21pbGxhczogJXMuIgorCisjOiBldmFsLmM6MjY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogRmFsdGFuIGNvbWlsbGFzOiAlcy4iCisKKyM6IGV2YWwuYzozMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjogQXJndW1lbnRvcyBubyB24WxpZG9zIHBhcmEgbGEgZnVuY2nzbiAlcy4iCisKKyM6IGV2YWwuYzozMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBGdW5jafNuIGRlc2Nvbm9jaWRhOiAlcy4iCisKKyM6IGV2YWwuYzozMDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBEZW1hc2lhZG9zIGFyZ3VtZW50b3MgcGFyYSBsYSBmdW5jafNuOiAlcy4iCisKKyM6IGV2YWwuYzozMDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IEFyZ3VtZW50b3MgaW5zdWZpY2llbnRlcyBwYXJhIGxhIGZ1bmNp8246ICVzLiIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiBVc2FuZG8gPFNJRD4gZW4gdW4gY29udGV4dG8gcXVlIG5vIGVzIGRlIKtzY3JpcHS7OiAlcy4iCisKKyMgICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMgICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIyAgKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjLiAqIFllcyB0aGlzIGlzIHVnbHksIEkgZG9uJ3QgcGFydGljdWxhcmx5IGxpa2UgaXQgZWl0aGVyLiAgQnV0IGRvaW5nIGl0CisjLiAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyMuICogYmUgdG91Y2hlZCBhdCBhbGwuICBTZWUgYmVsb3cgd2hhdCAnb2snIGFuZCAneW5jJyBhcmUgdXNlZCBmb3IuCisjLgorIzogZXZhbC5jOjM2ODcgZ3VpLmM6NDM4MiBndWlfZ3RrLmM6MjA1OQorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6NDIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCBs7W5lYXM6ICIKKworIzogZXZhbC5jOjU0NzcKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZBY2VwdGFyXG4iCisiJkNhbmNlbGFyIgorCisjOiBldmFsLmM6NTUxNworbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgIkhlIGxsYW1hZG8gYSCraW5wdXRyZXN0b3JlKCm7IG3hcyB2ZWNlcyBxdWUgYSCraW5wdXRzYXZlKCm7LiIKKworIzogZXZhbC5jOjU5NzcKK21zZ2lkICJFNjU1OiBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyAoY3ljbGU/KSIKK21zZ3N0ciAiRTY1NTogSGF5IGRlbWFzaWFkb3MgZW5sYWNlcyBzeW1i82xpY29zICi/cmVmZXJlbmNpYSBjaXJjdWxhcj8pIgorCisjOiBldmFsLmM6NjYwOQorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogU2luIGNvbmV4afNuIGFsIHNlcnZpZG9yIFZpbS4iCisKKyM6IGV2YWwuYzo2NzA2Cittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6IEluY2FwYXogZGUgbGVlciB1bmEgcmVzcHVlc3RhIGRlbCBzZXJ2aWRvci4iCisKKyM6IGV2YWwuYzo2NzM0Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBJbmNhcGF6IGRlIGVudmlhciBhbCBjbGllbnRlLiIKKworIzogZXZhbC5jOjY3ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IEluY2FwYXogZGUgZW52aWFyIGEgJXMuIgorCisjOiBldmFsLmM6Njg4MgorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKE5vIHbhbGlkbykiCisKKyM6IGV2YWwuYzo4MDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IFZhcmlhYmxlIHNpbiBkZWZpbmlyOiAlcy4iCisKKyM6IGV2YWwuYzo4NDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkUyNDQ6IKFOb21icmUgaWxlZ2FsIHBhcmEgdW5hIHZhcmlhYmxlISAlcyIKKworIzogZXZhbC5jOjg3ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUyMjY6IExhIGZ1bmNp824gJXMgeWEgZXhpc3RlLCBh8WFkYSCrIbsgcGFyYSByZWVtcGxhemFybGEuIgorCisjOiBldmFsLmM6ODg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIzOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTIzOiBGdW5jafNuIHNpbiBkZWZpbmlyOiAlcy4iCisKKyM6IGV2YWwuYzo4ODcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogRmFsdGEgqyi7OiAlcy4iCisKKyM6IGV2YWwuYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBBcmd1bWVudG8gaWxlZ2FsOiAlcy4iCisKKyM6IGV2YWwuYzo4OTgyCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IEZhbHRhIKs6ZW5kZnVuY3Rpb267LiIKKworIzogZXZhbC5jOjkwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IE5vIHNlIHB1ZWRlIHJlZGVmaW5pciBsYSBmdW5jafNuICVzOiBlc3ThIGVuIHVzby4iCisKKyM6IGV2YWwuYzo5MTU5Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTogU2UgcmVxdWllcmUgZWwgbm9tYnJlIGRlIGxhIGZ1bmNp824uIgorCisjOiBldmFsLmM6OTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBFbCBub21icmUgZGUgbGEgZnVuY2nzbiBkZWJlIGVtcGV6YXIgY29uIG1hefpzY3VsYTogJXMuIgorCisjOiBldmFsLmM6OTQwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBGdW5jafNuIHNpbiBkZWZpbmlyOiAlcy4iCisKKyM6IGV2YWwuYzo5NDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogTm8gc2UgcHVlZGUgZWxpbWluYXIgbGEgZnVuY2nzbiAlczogZXN04SBlbiB1c28uIgorCisjOiBldmFsLmM6OTQ1NQorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIiIKKyJFMTMyOiBMYSBwcm9mdW5kaWRhZCBkZSBsYSBsbGFtYWRhIGEgbGEgZnVuY2nzbiBlcyBtYXlvciBxdWUgq21heGZ1bmNkZXB0aLsuIgorCisjICBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FsbGluZyAlcyIKK21zZ3N0ciAiTGxhbWFuZG8gYSAlcy4iCisKKyM6IGV2YWwuYzo5NTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIkhlIGFib3J0YWRvIGEgJXMuIgorCisjOiBldmFsLmM6OTU3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgZGV2dWVsdmUgIyVsZC4iCisKKyM6IGV2YWwuYzo5NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIGRldnVlbHZlIKslc7suIgorCisjICBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1OTUgZXhfY21kczIuYzoyMzY1CisjLCBjLWZvcm1hdAorbXNnaWQgImNvbnRpbnVpbmcgaW4gJXMiCittc2dzdHIgImNvbnRpbnVhbmRvIGVuICVzLiIKKworIzogZXZhbC5jOjk2MjEKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogqzpyZXR1cm67IG5vIGVzdOEgZGVudHJvIGRlIHVuYSBmdW5jafNuLiIKKworIzogZXZhbC5jOjk5NTIKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyB2YXJpYWJsZXMgZ2xvYmFsZXM6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKKworIzogZXhfY21kcy5jOjExOAorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA0eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKKworIzogZXhfY21kcy5jOjExOQorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIKKworIzogZXhfY21kcy5jOjQzMAorbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiBNb3ZpZW5kbyBs7W5lYXMgc29icmUgc+0gbWlzbWFzLiIKKworIzogZXhfY21kcy5jOjQ5OQorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSBs7W5lYSBtb3ZpZGEuIgorCisjOiBleF9jbWRzLmM6NTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiJWxkIGztbmVhcyBtb3ZpZGFzLiIKKworIzogZXhfY21kcy5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCBs7W5lYXMgZmlsdHJhZGFzLiIKKworIzogZXhfY21kcy5jOjk1MgorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0cm8qIExvcyBhdXRvY29tYW5kb3Mgbm8gZGViZW4gY2FtYmlhciBlbCCrYnVmZmVyuyBlbiBjdXJzby4iCisKKyM6IGV4X2NtZHMuYzoxMDM3Cittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbTm8gc2UgaGEgZXNjcml0byBhbCBkaXNjbyBuYWRhIGRlc2RlIGVsIPpsdGltbyBjYW1iaW9dXG4iCisKKyM6IGV4X2NtZHMuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzIGVuIGxhIGztbmVhOiAiCisKKyM6IGV4X2NtZHMuYzoxMjg4Cittc2dpZCAiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiCittc2dzdHIgIkUxMzY6IHZpbWluZm86IEhheSBkZW1hc2lhZG9zIGVycm9yZXMsIG9taXRpZW5kbyBlbCByZXN0byBkZWwgZmljaGVyby4iCisKKyM6IGV4X2NtZHMuYzoxMzIzCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAiTGV5ZW5kbyBlbCBmaWNoZXJvIKt2aW1pbmZvuyCrJXO7JXMlcyVzIgorCisjOiBleF9jbWRzLmM6MTMyNAorbXNnaWQgIiBpbmZvIgorbXNnc3RyICIgaW5mbyIKKworIzogZXhfY21kcy5jOjEzMjUKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIiBtYXJjYXMiCisKKyM6IGV4X2NtZHMuYzoxMzI2Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIEZBTEzTIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogTm8gaGF5IHBlcm1pc28gZGUgZXNjcml0dXJhIHBhcmEgZWwgZmljaGVybyB2aW1pbmZvOiAlcyIKKworIzogZXhfY21kcy5jOjE1NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzODogQ2FuJ3Qgd3JpdGUgdmltaW5mbyBmaWxlICVzISIKK21zZ3N0ciAiRTEzODogoU5vIHB1ZWRvIGVzY3JpYmlyIGVsIGZpY2hlcm8gdmltaW5mbyAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRXNjcmliaWVuZG8gZmljaGVybyB2aW1pbmZvIKslc7siCisKKyMgIFdyaXRlIHRoZSBpbmZvOgorIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTY0OQorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIEVzdGUgZmljaGVybyB2aW1pbmZvIGZ1ZSBnZW5lcmFkbyBwb3IgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgVXN0ZWQgcHVlZGUgZWRpdGFybG8sIKFzb2xvIHNpIHRpZW5lIGN1aWRhZG8hXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjUzCittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgVmFsb3IgZGUgq2VuY29kaW5nuyBjdWFuZG8gc2UgZXNjcmliafMgZXN0ZSBmaWNoZXJvXG4iCisKKyM6IGV4X2NtZHMuYzoxNzUyCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICJDYXLhY3RlciBkZSBjb21pZW56byBpbGVnYWwiCisKKyM6IGV4X2NtZHMuYzoyMDk3IGV4X2NtZHMuYzoyMzYyIGV4X2NtZHMyLmM6NzYzCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAiR3VhcmRhciBjb21vIgorCisjICBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMgICogZ29vZCBpZGVhLgorIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTQwCittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IEVsIGZpY2hlcm8gZXN04SBjYXJnYWRvIGVuIG90cm8gq2J1ZmZlcrsuIgorCisjOiBleF9jbWRzLmM6MjE3NAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIr9Fc2NyaWJpciB1biBmaWNoZXJvIHBhcmNpYWw/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBVc2UgISBwYXJhIGVzY3JpYmlyIHVuIKtidWZmZXK7IHBhcmNpYWwuIgorCisjOiBleF9jbWRzLmM6MjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIr9Fc2NyaWJpciBzb2JyZSBlbCBmaWNoZXJvIGV4aXN0ZW50ZSCrJS4qc7s/IgorCisjOiBleF9jbWRzLmM6MjM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6IE5vIGV4aXN0ZSB1biBub21icmUgZGUgZmljaGVybyBwYXJhIGVsIKtidWZmZXK7ICVsZCIKKworIzogZXhfY21kcy5jOjI0MDUKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICIiCisiRTE0MjogTm8gc2UgaGEgZXNjcml0byBlbCBmaWNoZXJvOiBlc2NyaXR1cmEgZGVzYWN0aXZhZGEgcG9yIGxhIG9wY2nzbiAiCisiq3dyaXRluy4iCisKKyM6IGV4X2NtZHMuYzoyNDI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyJTZSBoYSBhY3RpdmFkbyBsYSBvcGNp824gq3JlYWRvbmx5uyBwYXJhIKslLipzuy5cbiIKKyK/UXVpZXJlIGVzY3JpYmlybG8gZGUgdG9kYXMgZm9ybWFzPyIKKworIzogZXhfY21kcy5jOjI1OTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIkVkaXRhciBmaWNoZXJvIgorCisjOiBleF9jbWRzLmM6MzIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiIgorIkUxNDM6IExvcyBhdXRvY29tYW5kb3MgaGFuIGVsaW1pbmFkbyBpbmVzcGVyYWRhbWVudGUgZWwgbnVldm8gq2J1ZmZlcrsgJXMiCisKKyM6IGV4X2NtZHMuYzozMzM5Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IEFyZ3VtZW50byBubyBudW3pcmljbyBwYXJhIKs6ersuIgorCisjOiBleF9jbWRzLmM6MzQyNAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IFJ2aW0gbm8gcGVybWl0ZSBhY2Nlc28gYWwgcHJvY2VzYWRvciBkZSBjb21hbmRvcy4iCisKKyM6IGV4X2NtZHMuYzozNTMxCittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0NjogTGFzIGV4cHJlc2lvbmVzIHJlZ3VsYXJlcyBubyBzZSBwdWVkZW4gZGVsaW1pdGFyIGNvbiBsZXRyYXMuIgorCisjOiBleF9jbWRzLmM6Mzg3NworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICK/UmVlbXBsYXphciBjb24gJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDI3MAorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIoSW50ZXJydW1waWRvKSIKKworIzogZXhfY21kcy5jOjQyNzQKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSBzdXN0aXR1Y2nzbiIKKworIzogZXhfY21kcy5jOjQyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBzdXN0aXR1Y2lvbmVzIgorCisjOiBleF9jbWRzLmM6NDI3OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBlbiAxIGztbmVhIgorCisjOiBleF9jbWRzLmM6NDI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgZW4gJWxkIGztbmVhcyIKKworIzogZXhfY21kcy5jOjQzMzIKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IKs6Z2xvYmFsuyBubyBwdWVkZSBzZXIgcmVjdXJzaXZvLiIKKworIzogZXhfY21kcy5jOjQzNjcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogRmFsdGEgdW5hIGV4cHJlc2nzbiByZWd1bGFyIGVuIGVsIGNvbWFuZG8gZ2xvYmFsLiIKKworIzogZXhfY21kcy5jOjQ0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiUGF0cvNuIGVuY29udHJhZG8gZW4gY2FkYSBs7W5lYTogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDk3Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyDabHRpbWEgY2FkZW5hIGRlIHN1c3RpdHVjafNuOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NTk4Cittc2dpZCAiRTQ3ODogRG9uJ3QgcGFuaWMhIgorbXNnc3RyICJFNDc4OiChTm8gZW50cmUgZW4gcOFuaWNvISIKKworIzogZXhfY21kcy5jOjQ2NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2MTogU29ycnksIG5vICclcycgaGVscCBmb3IgJXMiCittc2dzdHIgIkUxNDk6IExvIHNpZW50bywgbm8gaGF5IGF5dWRhIKslc7sgcGFyYSAlcy4iCisKKyM6IGV4X2NtZHMuYzo0NjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogTG8gc2llbnRvLCBubyBoYXkgYXl1ZGEgcGFyYSAlcyIKKworIzogZXhfY21kcy5jOjQ2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICJMbyBzaWVudG8sIG5vIGVuY3VlbnRybyBlbCBmaWNoZXJvIGRlIGF5dWRhIKslc7suIgorCisjOiBleF9jbWRzLmM6NTE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiBObyBlcyB1biBkaXJlY3RvcmlvOiAlcyIKKworIzogZXhfY21kcy5jOjUzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IE5vIHNlIHB1ZWRlIGFicmlyICVzIHBhcmEgZXNjcml0dXJhLiIKKworIzogZXhfY21kcy5jOjUzNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IEluY2FwYXogZGUgYWJyaXIgJXMgcGFyYSBsZWN0dXJhIgorCisjOiBleF9jbWRzLmM6NTM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjcwOiBNaXggb2YgaGVscCBmaWxlIGVuY29kaW5ncyB3aXRoaW4gYSBsYW5ndWFnZTogJXMiCittc2dzdHIgIiIKKyJFNjcwOiBNZXpjbGEgZGUgY29kaWZpY2FjaW9uZXMgZGUgZmljaGVyb3MgZGUgYXl1ZGEgZGVudHJvIGRlIHVuIGxlbmd1YWplOiAlcyIKKworIzogZXhfY21kcy5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogVGFnIKslc7sgZHVwbGljYWRhIGVuIGVsIGZpY2hlcm8gJXMiCisKKyM6IGV4X2NtZHMuYzo1NTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogQ29tYW5kbyBkZXNjb25vY2lkbyBkZSBzaWdubzogJXMiCisKKyM6IGV4X2NtZHMuYzo1NTc3Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IEZhbHRhIGVsIG5vbWJyZSBkZWwgc2lnbm8uIgorCisjOiBleF9jbWRzLmM6NTYyMworbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IERlbWFzaWFkb3Mgc2lnbm9zIGRlZmluaWRvcy4iCisKKyM6IGV4X2NtZHMuYzo1NjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzk6IEludmFsaWQgc2lnbiB0ZXh0OiAlcyIKK21zZ3N0ciAiRTIzOTogVGV4dG8gZGUgc2lnbm8gbm8gduFsaWRvOiAlcyIKKworIzogZXhfY21kcy5jOjU3MjIgZXhfY21kcy5jOjU5MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogU2lnbm8gZGVzY29ub2NpZGE6ICVzIgorCisjOiBleF9jbWRzLmM6NTc3MQorbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IEZhbHRhIGVsIG76bWVybyBkZWwgc2lnbm8uIgorCisjOiBleF9jbWRzLmM6NTg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1OTogRWwgbm9tYnJlIGRlbCCrYnVmZmVyuyBubyBlcyB24WxpZG86ICVzIgorCisjOiBleF9jbWRzLmM6NTg5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogRWwgaWQgZGVsIHNpZ25vIG5vIGVzIHbhbGlkbzogJWxkIgorCisjOiBleF9jbWRzLmM6NTk2MgorbXNnaWQgIiAoTk9UIEZPVU5EKSIKK21zZ3N0ciAiIChOTyBFTkNPTlRSQURPKSIKKworIzogZXhfY21kcy5jOjU5NjQKK21zZ2lkICIgKG5vdCBzdXBwb3J0ZWQpIgorbXNnc3RyICIgKG5vIGhheSBhcG95byBwYXJhIGxhIGZ1bmNp824gcGVkaWRhKSIKKworIzogZXhfY21kcy5jOjYwNjMKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltTdXByaW1pZG9dIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICJFbnRyYW5kbyBhbCBtb2RvIGRlIGRlcHVyYWNp824uIE9wcmltYSBcImNvbnRcIiBwYXJhIGNvbnRpbnVhci4iCisKKyM6IGV4X2NtZHMyLmM6OTYgZXhfZG9jbWQuYzo5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICJs7W5lYSAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgImNtZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIqtCcmVha3BvaW50uyBlbiCrJXMlc7sgbO1uZWEgJWxkIgorCisjOiBleF9jbWRzMi5jOjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IE5vIHNlIGhhIGVuY29udHJhZG8gZWwgq2JyZWFrcG9pbnS7OiAlcyIKKworIzogZXhfY21kczIuYzo1NjYKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICJObyBoYXkgq2JyZWFrcG9pbnRzuyBkZWZpbmlkb3MuIgorCisjOiBleF9jbWRzMi5jOjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgbO1uZWEgJWxkIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICK/R3VhcmRhciBsb3MgY2FtYmlvcyBlbiCrJS4qc7s/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkzNzgKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiU2luIHTtdHVsbyIKKworIzogZXhfY21kczIuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IE5vIHNlIGhhIGdyYWJhZG8gbmFkYSBkZXNkZSBlbCD6bHRpbW8gY2FtYmlvIGVuIGVsIGJ1ZmZlciCrJXO7IgorCisjOiBleF9jbWRzMi5jOjk4NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiIgorIkFkdmVydGVuY2lhOiBzZSBoYSBlbnRyYWRvIGVuIG90cm8gq2J1ZmZlcrsgZW4gZm9ybWEgaW5lc3BlcmFkYSAodmVyaWZpcXVlICIKKyJsb3MgYXV0b2NvbWFuZG9zKS4iCisKKyM6IGV4X2NtZHMyLmM6MTM4NworbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogSGF5IHPzbG8gdW4gZmljaGVybyBxdWUgZWRpdGFyLiIKKworIzogZXhfY21kczIuYzoxMzg5Cittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBObyBzZSBwdWVkZSBpciBhbnRlcyBkZWwgcHJpbWVyIGZpY2hlcm8uIgorCisjOiBleF9jbWRzMi5jOjEzOTEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogTm8gc2UgcHVlZGUgaXIgbeFzIGFsbOEgZGVsIPpsdGltbyBmaWNoZXJvLiIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiBFbCBjb21waWxhZG9yIG5vIHRpZW5lIGFwb3lvIGVuIGVzdGEgdmVyc2nzbjogJXMiCisKKyM6IGV4X2NtZHMyLmM6MTg5NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIkJ1c2NhbmRvIKslc7sgZW4gqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6MTkxOQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiQnVzY2FuZG8gqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6MTk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgZm91bmQgaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorbXNnc3RyICJObyBzZSBoYSBlbmNvbnRyYWRvIGVuIKtydW50aW1lcGF0aLs6IKslc7siCisKKyM6IGV4X2NtZHMyLmM6MTk3NAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICJFamVjdXRlIHNjcmlwdCBkZSBWaW0uIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJObyBzZSBwdWVkZSBlamVjdXRhciB1biBkaXJlY3RvcmlvOiCrJXO7LiIKKworIzogZXhfY21kczIuYzoyMjAyCisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJObyBzZSBwdWRvIGVqZWN1dGFyIKslc7suIgorCisjOiBleF9jbWRzMi5jOjIyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJs7W5lYSAlbGQ6IG5vIHNlIHB1ZG8gZWplY3V0YXIgqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6MjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImVqZWN1dGFuZG8gqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJs7W5lYSAlbGQ6IGVqZWN1dGFuZG8gqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6MjM2MworIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiTGEgZWplY3VjafNuIGRlIKslc7sgaGEgdGVybWluYWRvLiIKKworIzogZXhfY21kczIuYzoyNzA3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTogQWR2ZXJ0ZW5jaWE6IHNlcGFyYWRvciBkZSBs7W5lYSBlcXVpdm9jYWRvLCBwdWVkZSBxdWUgZmFsdGUgXk0iCisKKyM6IGV4X2NtZHMyLmM6Mjc1NgorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IEhhIHVzYWRvIKs6c2NyaXB0ZW5jb2Rpbme7IGZ1ZXJhIGRlIHVuIGZpY2hlcm8gZGUgaW5zdHJ1Y2Npb25lcyBlamVjdXRhYmxlcy4iCisKKyM6IGV4X2NtZHMyLmM6Mjc4OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiBIYSB1c2FkbyCrOmZpbmlzaLsgZnVlcmEgZGUgdW4gZmljaGVybyBkZSBpbnN0cnVjY2lvbmVzIGVqZWN1dGFibGVzLiIKKworIzogZXhfY21kczIuYzozMjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIlDhZ2luYSAlZCIKKworIzogZXhfY21kczIuYzozMzk0Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICJObyBoYXkgdGV4dG8gcXVlIGltcHJpbWlyLiIKKworIzogZXhfY21kczIuYzozNDcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJJbXByaW1pZW5kbyBsYSBw4WdpbmEgJWQgKCVkJSUpLiIKKworIzogZXhfY21kczIuYzozNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICJDb3BpYSAlZCBkZSAlZCIKKworIzogZXhfY21kczIuYzozNTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICJJbXByZXNvOiAlcy4iCisKKyM6IGV4X2NtZHMyLmM6MzU0OQorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIkltcHJlc2nzbiBhYm9ydGFkYS4iCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogRXJyb3IgZXNjcmliaWVuZG8gYWwgZmljaGVybyBQb3N0U2NyaXB0IGRlIHNhbGlkYS4iCisKKyM6IGV4X2NtZHMyLmM6NDE4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI0OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBObyBzZSBwdWVkZSBhYnJpciBlbCBmaWNoZXJvIKslc7suIgorCisjOiBleF9jbWRzMi5jOjQxOTkgZXhfY21kczIuYzo0ODI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTm8gc2UgcHVlZGUgbGVlciBlbCBmaWNoZXJvIGRlIHJlY3Vyc29zIGRlIFBvc3RTY3JpcHQgqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6NDIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IEVsIGZpY2hlcm8gXCIlc1wiIG5vIGVzIHVuIGZpY2hlcm8gZGUgcmVjdXJzb3MgUG9zdFNjcmlwdC4iCisKKyM6IGV4X2NtZHMyLmM6NDIyMiBleF9jbWRzMi5jOjQyNDIgZXhfY21kczIuYzo0MjU3IGV4X2NtZHMyLmM6NDI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE5OiBFbCBmaWNoZXJvIKslc7sgbm8gZXMgdW4gcmVjdXJzbyBQb3N0U2NyaXB0IHF1ZSBwdWVkYSB1c2FyLiIKKworIzogZXhfY21kczIuYzo0MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIgorbXNnc3RyICJFNjIxOiBFbCBmaWNoZXJvIGRlIHJlY3Vyc29zIKslc7sgdGllbmUgbGEgdmVyc2nzbiBlcXVpdm9jYWRhLiIKKworIzogZXhfY21kczIuYzo0Nzc2Cittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiBObyBwdWVkbyBhYnJpciBlbCBmaWNoZXJvIFBvc3RTY3JpcHQgZGUgc2FsaWRhLiIKKworIzogZXhfY21kczIuYzo0ODA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IE5vIHB1ZWRvIGFicmlyIGVsIGZpY2hlcm8gqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6NDkyOAorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwicHJvbG9nLnBzXCIiCittc2dzdHIgIiIKKyJFNDU2OiBObyBlbmN1ZW50cm8gZWwgZmljaGVybyBkZSByZWN1cnNvcyBQb3N0U2NyaXB0IKtwcm9sb2cucHO7LiIKKworIzogZXhfY21kczIuYzo0OTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXMucHNcIiIKK21zZ3N0ciAiRTQ1NjogTm8gaGFsbG8gZWwgZmljaGVybyBkZSByZWN1cnNvcyBQb3N0U2NyaXB0IKslcy5wc7suIgorCisjOiBleF9jbWRzMi5jOjQ5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMDogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIFwiJXNcIiBlbmNvZGluZyIKK21zZ3N0ciAiRTYyMDogTm8gcHVlZG8gY29udmVydGlyIGRlIKttdWx0aS1ieXRluyBhIGxhIGNvZGlmaWNhY2nzbiBcIiVzXCIuIgorCisjOiBleF9jbWRzMi5jOjUxMDIKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIkVudu1hbmRvIGEgbGEgaW1wcmVzb3JhLi4uIgorCisjOiBleF9jbWRzMi5jOjUxMDYKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiBObyBwdWRlIGltcHJpbWlyIGVsIGZpY2hlcm8gUG9zdFNjcmlwdC4iCisKKyM6IGV4X2NtZHMyLmM6NTEwOAorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiVGFyZWEgZGUgaW1wcmVzafNuIGVudu1hZGEuIgorCisjOiBleF9jbWRzMi5jOjU2MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIklkaW9tYSBhY3R1YWwgqyVzuzogqyVzuy4iCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogTm8gc2UgcHVlZGUgZXN0YWJsZWNlciBsYSBvcGNp824gZGVsIGlkaW9tYSBhIKslc7suIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJFbnRyYW5kbyBhbCBtb2RvIEV4LiBFc2NyaWJhIKt2aXN1YWy7IHBhcmEgaXIgYWwgbW9kbyBOb3JtYWwuIgorCisjICBtdXN0IGJlIGF0IEVPRgorIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTYxCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IEVzdG95IGFsIGZpbmFsIGRlbCBmaWNoZXJvLiIKKworIzogZXhfZG9jbWQuYzo2NjkKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IEVsIGNvbWFuZG8gcmVjdXJyZSBleGNlc2l2YW1lbnRlLiIKKworIzogZXhfZG9jbWQuYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDU6IEV4Y2VwdGlvbiBub3QgY2F1Z2h0OiAlcyIKK21zZ3N0ciAiRTYwNTogTGEgZXhjZXBjafNuICVzIG5vIHNlIGF0cmFw8y4iCisKKyM6IGV4X2RvY21kLmM6MTMxNworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkZpbiBkZWwgZmljaGVybyBkZSBpbnN0cmN1Y2Npb25lcyBlamVjdXRhYmxlcy4iCisKKyM6IGV4X2RvY21kLmM6MTMxOAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiRmluIGRlIGxhIGZ1bmNp824uIgorCisjOiBleF9kb2NtZC5jOjE5MDcKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiBVc28gYW1iaWd1byBkZSB1biBjb21hbmRvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvLiIKKworIzogZXhfZG9jbWQuYzoxOTIxCittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFMzcxOiBObyBlcyB1biBjb21hbmRvIGRlbCBlZGl0b3IuIgorCisjOiBleF9kb2NtZC5jOjIwMjgKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IE1lIGhhIGRhZG8gdW4gcmFuZ28gaW52ZXJ0aWRvLiIKKworIzogZXhfZG9jbWQuYzoyMDM3Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJNZSBoYSBkYWRvIHVuIHJhbmdvIGludmVydGlkbywgv2VzdOEgYmllbiBpbnRlcmNhbWJpYXJsbz8iCisKKyM6IGV4X2RvY21kLmM6MjE2MAorbXNnaWQgIkU0OTQ6IFVzZSB3IG9yIHc+PiIKK21zZ3N0ciAiRTQ5NDogVXNlIKt3uyBvIKt3Pj67LiIKKworIzogZXhfZG9jbWQuYzozNzg2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiBMbyBzaWVudG8sIGVsIGNvbWFuZG8gbm8gZXN04SBkaXNwb25pYmxlIGVuIGVzdGEgdmVyc2nzbi4iCisKKyM6IGV4X2RvY21kLmM6Mzk4OQorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiBT82xvIHNlIHBlcm1pdGUgdW4gbm9tYnJlIGRlIGZpY2hlcm8uIgorCisjOiBleF9kb2NtZC5jOjQ1NjkKK21zZ2lkICIxIG1vcmUgZmlsZSB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICJVbiBmaWNoZXJvIG3hcyBwYXJhIGVkaXRhci4gv1Rlcm1pbm8gZGUgdG9kYXMgZm9ybWFzPyIKKworIzogZXhfZG9jbWQuYzo0NTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiSGF5ICVkIGZpY2hlcm9zIG3hcyBlbiBlZGljafNuLiC/VGVybWlubyBkZSB0b2RhcyBmb3JtYXM/IgorCisjOiBleF9kb2NtZC5jOjQ1NzkKK21zZ2lkICJFMTczOiAxIG1vcmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTczOiBVbiBmaWNoZXJvIG3hcyBwYXJhIGVkaXRhci4iCisKKyM6IGV4X2RvY21kLmM6NDU4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiBIYXkgJWxkIGZpY2hlcm9zIGVuIGVkaWNp824uIgorCisjOiBleF9kb2NtZC5jOjQ2NzYKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTc0OiBFbCBjb21hbmRvIHlhIGV4aXN0ZS4gQfFhZGEgqyG7IHBhcmEgcmVlbXBsYXphcmxvLiIKKworIzogZXhfZG9jbWQuYzo0Nzg3Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgIE5vbWJyZSAgICAgIEFyZ3MgUmFuZ28gQ29tcGxldGFyICBEZWZpbmljafNuIgorCisjOiBleF9kb2NtZC5jOjQ4NzYKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIk5vIHNlIGhhbiBlbmNvbnRyYWRvIGNvbWFuZG9zIGRlZmluaWRvcyBwb3IgZWwgdXN1YXJpbyIKKworIzogZXhfZG9jbWQuYzo0OTA4Cittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTogTm8gc2UgaGEgZXNwZWNpZmljYWRvIGVsIGF0cmlidXRvLiIKKworIzogZXhfZG9jbWQuYzo0OTYwCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiBFbCBu+m1lcm8gZGUgYXJndW1lbnRvcyBubyBlcyB24WxpZG8uIgorCisjOiBleF9kb2NtZC5jOjQ5NzUKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBFbCByZWN1ZW50byBubyBzZSBwdWVkZSBlc3BlY2lmaWNhciBkb3MgdmVjZXMuIgorCisjOiBleF9kb2NtZC5jOjQ5ODUKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBFbCB2YWxvciBwcmVkZXRlcm1pbmFkbyBwYXJhIGVsIHJlY3VlbnRvIG5vIGVzIHbhbGlkby4iCisKKyM6IGV4X2RvY21kLmM6NTAxNgorbXNnaWQgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcmVkIGZvciBjb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogc2UgbmVjZXNpdGEgdW4gYXJndW1lbnRvIHBhcmEgY29tcGxldGFyLiIKKworIzogZXhfZG9jbWQuYzo1MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiBFbCB2YWxvciBwYXJhIGNvbXBsZXRhciBubyBlcyB24WxpZG86ICVzLiIKKworIzogZXhfZG9jbWQuYzo1MDU3Cittc2dpZCAiRTQ2ODogQ29tcGxldGlvbiBhcmd1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGN1c3RvbSBjb21wbGV0aW9uIgorbXNnc3RyICIiCisiRTQ2ODogRWwgYXJndW1lbnRvIGRlIGZpbmFsaXphY2nzbiBzb2xvIHNlIHBlcm1pdGUgZW4gZmluYWxpemFjaW9uZXMgIgorImRlZmluaWRhcyBwb3IgZWwgdXN1YXJpby4iCisKKyM6IGV4X2RvY21kLmM6NTA2MworbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIiIKKyJFNDY3OiBMYXMgZmluYWxpemF0aW5lcyBkZWZpbmlkYWQgcG9yIGVsIHVzdWFyaW8gcmVxdWllcmVuIGRlIHVuIGFyZ3VtZW50byAiCisiZGUgZnVuY2nzbi4iCisKKyM6IGV4X2RvY21kLmM6NTA3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IEVsIGF0cmlidXRvIG5vIGVzIHbhbGlkbzogJXMiCisKKyM6IGV4X2RvY21kLmM6NTExNworbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBFbCBub21icmUgZGUgY29tYW5kbyBubyBlcyB24WxpZG8uIgorCisjOiBleF9kb2NtZC5jOjUxMzIKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIiIKKyJFMTgzOiBMb3MgY29tYW5kb3MgZGVmaW5pZG9zIHBvciBlbCB1c3VhcmlvIGRlYmVuIGNvbWVuemFyIGNvbiB1bmEgbGV0cmEgIgorIm1hefpzY3VsYS4iCisKKyM6IGV4X2RvY21kLmM6NTIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogTm8gZXhpc3RlIHRhbCBjb21hbmRvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvOiAlcyIKKworIzogZXhfZG9jbWQuYzo1NjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogTm8gc2UgcHVlZGUgZW5jb250cmFyIGVsIGVzcXVlbWEgZGUgY29sb3JlcyAlcyIKKworIzogZXhfZG9jbWQuYzo1NjcyCittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIqFTYWx1ZG9zLCB1c3VhcmlvIGRlIFZpbSEiCisKKyM6IGV4X2RvY21kLmM6NjM4OQorbXNnaWQgIkVkaXQgRmlsZSBpbiBuZXcgd2luZG93IgorbXNnc3RyICJFZGl0YXIgZmljaGVybyBlbiB1bmEgdmVudGFuYSBudWV2YSIKKworIzogZXhfZG9jbWQuYzo2Njg0Cittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICJObyBoYXkgZmljaGVybyBkZSBpbnRlcmNhbWJpbyIKKworIzogZXhfZG9jbWQuYzo2Nzg4Cittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIkHxYWRpciBmaWNoZXJvIgorCisjOiBleF9kb2NtZC5jOjY4NTIKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IE5vIGhheSBkaXJlY3RvcmlvIHByZXZpby4iCisKKyM6IGV4X2RvY21kLmM6NjkzNAorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IERlc2Nvbm9jaWRvLiIKKworIzogZXhfZG9jbWQuYzo3MDE5Cittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IKs6d2luc2l6ZbsgcmVxdWllcmUgZGUgZG9zIGFyZ3VtZW50b3MgbnVt6XJpY29zLiIKKworIzogZXhfZG9jbWQuYzo3MDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiUG9zaWNp824gZGUgbGEgdmVudGFuYTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDgwCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiBMYSBvYnRlbmNp824gZGUgbGEgcG9zaWNp824gZGUgbGEgdmVudGFuYSBubyBlc3ThIGltcGxlbWVudGFkYSBlbiBlc3RhICIKKyJwbGF0YWZvcm1hLiIKKworIzogZXhfZG9jbWQuYzo3MDkwCittc2dpZCAiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2Njogqzp3aW5wb3O7IHJlcXVpcmUgZGUgZG9zIGFyZ3VtZW50b3MgbnVt6XJpY29zLiIKKworIzogZXhfZG9jbWQuYzo3MzY4Cittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAiR3VhcmRhciByZWRpcmVjY2nzbi4iCisKKyM6IGV4X2RvY21kLmM6NzU1OAorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiR3VhcmRhciB2aXN0YSIKKworIzogZXhfZG9jbWQuYzo3NTU5Cittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICJHdWFyZGFyIHNlc2nzbiIKKworIzogZXhfZG9jbWQuYzo3NTYxCittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAiR3VhcmRhciBjb25maWd1cmFjafNuIgorCisjOiBleF9kb2NtZC5jOjc3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgeWEgZXhpc3RlIChh8WFkYSAhIHBhcmEgc29icmVlc2NyaWJpci4pIgorCisjOiBleF9kb2NtZC5jOjc3MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiBObyBzZSBwdWVkZSBhYnJpciCrJXO7IHBhcmEgZXNjcml0dXJhIgorCisjICBzZXQgbWFyaworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Nzc0MgorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiIgorIkUxOTE6IEVsIGFyZ3VtZW50byBkZWJlIHNlciB1bmEgbGV0cmEgbyB1biBhcPNzdHJvZm8vYXDzc3Ryb2ZvIGludmVydGlkbyIKKworIzogZXhfZG9jbWQuYzo3Nzg0Cittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBVc28gcmVjdXJzaXZvIGRlbWFzaWFkbyBwcm9mdW5kbyBkZSCrOm5vcm1hbLsuIgorCisjOiBleF9kb2NtZC5jOjgzMDIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogTm8gaGF5IHVuIG5vbWJyZSBkZSBmaWNoZXJvIGFsdGVybmF0aXZvIHF1ZSBzdXN0aXR1eWEgYSCrI7suIgorCisjOiBleF9kb2NtZC5jOjgzMzMKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIiIKKyJFNDk1OiBObyBoYSBkYWRvIHVuIG5vbWJyZSBkZSBmaWNoZXJvIGRlIGF1dG9jb21hbmRvcyBwYXJhIHN1c3RpdHVpciBhICIKKyJcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo4MzQxCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICIiCisiRTQ5NjogTm8gZXhpc3RlIHVuIKtidWZmZXK7IGRlIGF1dG9jb21hbmRvIHBhcmEgc3VzdGl0dWlyIHBvciBcIjxhYnVmPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNTIKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiIgorIkU0OTc6IE5pbmf6biBub21icmUgZGUgYXV0b2NvbWFuZG8gY29uY3VlcmRhIHBhcmEgc3VzdGl0dWlyIKs8YW1hdGNoPrsuIgorCisjOiBleF9kb2NtZC5jOjgzNjIKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiIgorIkU0OTg6IE5vIGhheSB1biBub21icmUgZGUgZmljaGVybyCrOnNvdXJjZbsgcXVlIHN1c3RpdHV5YSBhIFwiPHNmaWxlPlwiLiIKKworIzogZXhfZG9jbWQuYzo4NDAzCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiBVbiBub21icmUgZGUgZmljaGVybyB2YWNpbyBzb2xvIGZ1bmNpb25hIGNvbiBcIjpwOmhcIi4iCisKKyM6IGV4X2RvY21kLmM6ODQwNQorbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6IExhIGV4cHJlc2nzbiBldmFsdWEgYSB1biCrc3RyaW5nuyB2YWNpby4iCisKKyM6IGV4X2RvY21kLmM6OTM2MAorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogTm8gc2UgcHVlZGUgYWJyaXIgZWwgZmljaGVybyCrdmltaW5mb7sgcGFyYSBsZWN0dXJhLiIKKworIzogZXhfZG9jbWQuYzo5NTMzCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBObyBoYXkgZO1ncmFmb3MgZW4gZXN0YSB2ZXJzafNuLiIKKworIzogZXhfZXZhbC5jOjQ0MAorbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiIgorIkU2MDg6IE5vIHB1ZWRvIGxhbnphciAoJzp0aHJvdycpIGV4Y2VwY2lvbmVzIHNpIHRpZW5lbiBlbCBwcmVmaWpvICdWaW0nLiIKKworIyAgYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo1MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIHRocm93bjogJXMiCittc2dzdHIgIkhlIGVuY29udHJhZG8gdW5hIGV4Y2VwY2nzbjogJXMuIgorCisjOiBleF9ldmFsLmM6NTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBmaW5pc2hlZDogJXMiCittc2dzdHIgIkV4ZXBjafNuIGZpbmFsaXphZGE6ICVzIgorCisjOiBleF9ldmFsLmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICJIZSBkZXNjYXJ0YWRvIHVuYSBleGNlcGNp8246ICVzIgorCisjOiBleF9ldmFsLmM6NjIwIGV4X2V2YWwuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMsIGxpbmUgJWxkIgorbXNnc3RyICIlcywgZW4gbGEgbO1uZWEgJWxkLiIKKworIyAgYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGNhdWdodDogJXMiCittc2dzdHIgIkV4Y2VwdGlvbiBhdHJhcGFkYTogJXMiCisKKyM6IGV4X2V2YWwuYzo3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICJIZSBwdWVzdG8gYSAlcyBlbiBsYSBsaXN0YSBkZSBwZW5kaWVudGVzLiIKKworIzogZXhfZXZhbC5jOjcxNgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICJIZSByZXN1bWlkbyBhICVzLiIKKworIzogZXhfZXZhbC5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIkhlIGRlc2NhcnRhZG8gYSAlcy4iCisKKyM6IGV4X2V2YWwuYzo3NDYKK21zZ2lkICJFeGNlcHRpb24iCittc2dzdHIgIkV4ZXBjafNuLiIKKworIzogZXhfZXZhbC5jOjc1MgorbXNnaWQgIkVycm9yIGFuZCBpbnRlcnJ1cHQiCittc2dzdHIgIkVycm9yIGUgaW50ZXJydXBjafNuIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzODEKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiRXJyb3IiCisKKyMgIGlmIChwZW5kaW5nICYgQ1NUUF9JTlRFUlJVUFQpCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAiSW50ZXJydXBjafNuIgorCisjOiBleF9ldmFsLmM6ODMwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IEFuaWRhbWluZW90IGRlIKs6aWa7IGRlbWFzaWFkbyBwcm9mdW5kby4iCisKKyM6IGV4X2V2YWwuYzo4NjcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IKE6ZW5kaWYgc2luIHVuIDppZiEiCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2Ugc2luIHVuIDppZiIKKworIzogZXhfZXZhbC5jOjkxNAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYgc2luIHVuIDppZiIKKworIzogZXhfZXZhbC5jOjkyMQorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiCrOmVsc2W7IG36bHRpcGxlLiIKKworIzogZXhfZXZhbC5jOjkyNAorbXNnaWQgIkU1ODQ6IDplbHNlaWYgYWZ0ZXIgOmVsc2UiCittc2dzdHIgIkU1ODQ6IDplbHNlaWYgZGVzcHXpcyBkZSA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjk5MQorbXNnaWQgIkU1ODU6IDp3aGlsZSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTg1OiChqzp3aGlsZbsgc2UgYW5pZGEgbXV5IHByb2Z1bmRhbWVudGUhIgorCisjOiBleF9ldmFsLmM6MTA0NworbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOmNvbnRpbnVlIHNpbiB1biA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDg3Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiA6YnJlYWsgc2luIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEyODYKK21zZ2lkICJFNjAxOiA6dHJ5IG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IKGrOnRyebsgc2UgYW5pZGEgbXV5IHByb2Z1bmRhbWVudGUhIgorCisjOiBleF9ldmFsLmM6MTM2NgorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDpjYXRjaCBzaW4gdW4gOnRyeSIKKworIyAgR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjICAqIEp1c3QgcGFyc2UuCisjICBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMgICogSnVzdCBwYXJzZS4KKyMuIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gKiBKdXN0IHBhcnNlLgorIzogZXhfZXZhbC5jOjEzODgKK21zZ2lkICJFNjA0OiA6Y2F0Y2ggYWZ0ZXIgOmZpbmFsbHkiCittc2dzdHIgIkU2MDQ6IDpjYXRjaCBkZXNwdelzIGRlIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgc2luIHVuIDp0cnkiCisKKyMgIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gR2l2ZSB1cCBmb3IgYSBtdWx0aXBsZSAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjOiBleF9ldmFsLmM6MTU0NQorbXNnaWQgIkU2MDc6IG11bHRpcGxlIDpmaW5hbGx5IgorbXNnc3RyICJFNjA3OiChqzpmaW5hbGx5uyBt+mx0aXBsZSEiCisKKyM6IGV4X2V2YWwuYzoxNjU0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDplbmR0cnkgc2luIHVuIDp0cnkiCisKKyM6IGV4X2V2YWwuYzoxOTg2Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogqzplbmRmdW5jdGlvbrsgbm8gZXN04SBkZW50cm8gZGUgdW5hIGZ1bmNp824uIgorCisjOiBleF9nZXRsbi5jOjMyOTYKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICJOb21icmUgZGVsIKt0YWe7IgorCisjOiBleF9nZXRsbi5jOjMyOTkKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIiB0aXBvIGRlIGZpY2hlcm9cbiIKKworIzogZXhfZ2V0bG4uYzo0NzUyCittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICJMYSBvcGNp824gJ2hpc3RvcnknIGVzIGNlcm8uIgorCisjOiBleF9nZXRsbi5jOjUwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmlhIGRlIKslc7sgKGRlIGxvIG3hcyBudWV2byBhIGxvIG3hcyBhbnRpZ3VvKTpcbiIKKworIzogZXhfZ2V0bG4uYzo1MDI0Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJM7W5lYSBkZSBjb21hbmRvcyIKKworIzogZXhfZ2V0bG4uYzo1MDI1Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAiQ2FkZW5hIGRlIGL6c3F1ZWRhIgorCisjOiBleF9nZXRsbi5jOjUwMjYKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJFeHByZXNp824iCisKKyM6IGV4X2dldGxuLmM6NTAyNworbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIkztbmVhIGRlIGVudHJhZGEiCisKKyM6IGV4X2dldGxuLmM6NTA2NQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiCrY21kX3BjaGFyuyBt4XMgYWxs4SBkZSBsYSBsb25naXR1ZCBkZWwgY29tYW5kby4iCisKKyM6IGV4X2dldGxuLmM6NTI0MgorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IFNlIGhhIHN1cHJpbWlkbyBsYSB2ZW50YW5hIG8gZWwgYnVmZmVyIGFjdGl2b3MuIgorCisjOiBmaWxlaW8uYzozNzcKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiTm9tYnJlIGRlIGZpY2hlcm8gaWxlZ2FsIgorCisjOiBmaWxlaW8uYzo0MDEgZmlsZWlvLmM6NTM1IGZpbGVpby5jOjI5MTMgZmlsZWlvLmM6Mjk1NAorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJlcyB1biBkaXJlY3RvcmlvIgorCisjOiBmaWxlaW8uYzo0MDMKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJubyBlcyB1biBmaWNoZXJvIgorCisjOiBmaWxlaW8uYzo1NTcgZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltGaWNoZXJvIG51ZXZvXSIKKworIzogZmlsZWlvLmM6NTkwCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW1Blcm1pc28gbmVnYWRvXSIKKworIzogZmlsZWlvLmM6Njk0Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogTG9zIGF1dG9jb21hbmRvcyCrKlJlYWRQcmW7IGhpY2llcm9uIGlsZWdpYmxlIGFsIGZpY2hlcm8uIgorCisjOiBmaWxlaW8uYzo2OTYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiBMb3MgYXV0b2NvbWFuZG9zIKsqUmVhZFByZbsgbm8gZGViZW4gY2FtYmlhciBlbCBidWZmZXIgZW4gY3Vyc28uIgorCisjOiBmaWxlaW8uYzo3MTcKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IGxleWVuZG8gbGEgZW50cmFkYSBlc3ThbmRhci4uLlxuIgorCisjOiBmaWxlaW8uYzo3MjMKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIkxleWVuZG8gbGEgZW50cmFkYSBlc3ThbmRhci4uLiIKKworIyAgUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjEwMDAKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogoUxhIGNvbnZlcnNp824gaGEgaGVjaG8gZWwgZmljaGVybyBpbGVnaWJsZSEiCisKKyM6IGZpbGVpby5jOjIwOTAKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoyMDk3Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjIxMDQKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjIxMTIKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoyMTIyCittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbRmFsdGEgdW4gQ1JdIgorCisjOiBmaWxlaW8uYzoyMTI3Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW1NlIGhhIGVuY29udHJhZG8gdW4gTkxdIgorCisjOiBmaWxlaW8uYzoyMTMyCittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbaGUgcGFydGlkbyBsYXMgbO1uZWFzIGxhcmdhc10iCisKKyM6IGZpbGVpby5jOjIxMzggZmlsZWlvLmM6NDExNQorbXNnaWQgIltOT1QgY29udmVydGVkXSIKK21zZ3N0ciAiW05PIGNvbnZlcnRpZG9dIgorCisjOiBmaWxlaW8uYzoyMTQzIGZpbGVpby5jOjQxMjAKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW2NvbnZlcnRpZG9dIgorCisjOiBmaWxlaW8uYzoyMTUwIGZpbGVpby5jOjQxNDUKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIltlbmNyaXB0YWRvXSIKKworIzogZmlsZWlvLmM6MjE1NworbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW0VSUk9SIERFIENPTlZFUlNJ005dIgorCisjOiBmaWxlaW8uYzoyMTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIltJTExFR0FMIEJZVEUgaW4gbGluZSAlbGRdIgorbXNnc3RyICJbQllURSBJTEVHQUwgZW4gbGEgbO1uZWEgJWxkXSIKKworIzogZmlsZWlvLmM6MjE3MAorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltFUlJPUkVTIERFIExFQ1RVUkFdIgorCisjOiBmaWxlaW8uYzoyMzg2Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIk5vIHNlIHB1ZWRlIGVuY29udHJhciBlbCBmaWNoZXJvIHRlbXBvcmFsIHBhcmEgbGEgY29udmVyc2nzbi4iCisKKyM6IGZpbGVpby5jOjIzOTMKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIkxhIGNvbnZlcnNp824gY29uICerY2hhcmNvbnZlcnS7JyBoYSBmYWxsYWRvLiIKKworIzogZmlsZWlvLmM6MjM5NgorbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIk5vIHB1ZWRvIGxlZXIgbGEgc2FsaWRhIGRlIKtjaGFyY29udmVydLsuIgorCisjOiBmaWxlaW8uYzoyNzk2Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIiIKKyJFMjAzOiBMb3MgYXV0b2NvbWFuZG9zIGZ1ZXJvbiBzdXByaW1pZG9zIG8gZWwgq2J1ZmZlcrsgc2UgZGVzY2FyZ/MgcGFyYSBzZXIgIgorImdyYWJhZG8gZW4gZGlzY28uIgorCisjOiBmaWxlaW8uYzoyODE5Cittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIiIKKyJFMjA0OiBFbCBhdXRvY29tYW5kbyBoYSBjYW1iaWFkbyBlbCBu+m1lcm8gZGUgbO1uZWFzIGVuIGZvcm1hIGluZXNwZXJhZGEuIgorCisjOiBmaWxlaW8uYzoyODU3Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyBubyBwZXJtaXRlIHF1ZSBzZSBlc2NyaWJhIHNvYnJlIKtidWZmZXJzuyBzaW4gbW9kaWZpY2FyLiIKKworIzogZmlsZWlvLmM6Mjg2NQorbXNnaWQgIlBhcnRpYWwgd3JpdGVzIGRpc2FsbG93ZWQgZm9yIE5ldEJlYW5zIGJ1ZmZlcnMiCittc2dzdHIgIk5vIHNlIHBlcm1pdGUgbGEgZXNjcml0dXJhIHBhcmNpYWwgZGUgbG9zIKtidWZmZXJzuyBkZSBOZXRCZWFucy4iCisKKyM6IGZpbGVpby5jOjI5MTkgZmlsZWlvLmM6MjkzNworbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICJubyBlcyB1biBmaWNoZXJvIG8gZGlzcG9zaXRpdm8gZW4gZWwgcXVlIHNlIHB1ZWRhIGVzY3JpYmlyLiIKKworIzogZmlsZWlvLmM6Mjk4OQorbXNnaWQgImlzIHJlYWQtb25seSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFcyBkZSBzb2xvIGxlY3R1cmEgKGHxYWRhICEgcGFyYSBvYnJlZXNjcmliaXIpLiIKKworIzogZmlsZWlvLmM6MzMzNQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNTA2OiBObyBwdWVkbyBlc2NyaWJpciBhbCBmaWNoZXJvIGRlIHJlc3BhbGRvIChh8WFkYSAhIHBhcmEgZm9yemFyIGVsICIKKyJjb21hbmRvKS4iCisKKyM6IGZpbGVpby5jOjMzNDcKK21zZ2lkICJFNTA3OiBDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU1MDc6IEVycm9yIGFsIGNlcnJhciBlbCBmaWNoZXJvIGRlIGxhIGNvcGlhIGRlIHJlc3BhbGRvIChh8WFkYSAhIHBhcmEgIgorImZvcnphciBlbCBjb21hbmRvKS4iCisKKyM6IGZpbGVpby5jOjMzNDkKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUwODogTm8gcHVlZG8gbGVlciBlbCBmaWNoZXJvIHBhcmEgY3JlYXIgbGEgY29waWEgZGUgcmVzcGFsZG8gKGHxYWRhICEgcGFyYSAiCisiZm9yemFyIGVsIGNvbWFuZG8pLiIKKworIzogZmlsZWlvLmM6MzM2NQorbXNnaWQgIkU1MDk6IENhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU1MDk6IE5vIHB1ZWRvIGNyZWFyIGVsIGZpY2hlcm8gcGFyYSBsYSBjb3BpYSBkZSByZXNwYWxkbyAoYfFhZGEgISBwYXJhICIKKyJmb3J6YXIgZWwgY29tYW5kbykuIgorCisjOiBmaWxlaW8uYzozNDY4Cittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUxMDogTm8gcHVlZG8gaGFjZXIgdW4gZmljaGVybyBkZSBjb3BpYSBkZSByZXNwYWxkbyAoYfFhZGEgISBwYXJhIGZvcnphciBlbCAiCisiY29tYW5kbykuIgorCisjOiBmaWxlaW8uYzozNTMwCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTQ2MDogU2UgcGVyZGVy7WEgZWwgc2VnbWVudG8gKKtmb3JruykgZGUgcmVjdXJzb3MhIChh8WFkYSAhIHBhcmEgZm9yemFyIGVsICIKKyJjb21hbmRvKS4iCisKKyM6IGZpbGVpby5jOjM2NDAKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogTm8gcHVlZG8gZW5jb250cmFyIGVsIGZpY2hlcm8gdGVtcG9yYWwgcGFyYSBlc2NyaWJpciBlbiDpbC4iCisKKyM6IGZpbGVpby5jOjM2NTgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiIgorIkUyMTM6IE5vIHB1ZWRvIGNvbnZlcnRpcmxvIChh8WFkYSAhIHBhcmEgZXNjcmliaXIgZWwgZmljaGVybyBzaW4gY29udmVyc2nzbikuIgorCisjOiBmaWxlaW8uYzozNjkzCittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogTm8gcHVlZG8gYWJyaXIgZWwgZmljaGVybyBlbmxhemFkbyBwYXJhIGVzY3JpYmlyIGVuIOlsLiIKKworIzogZmlsZWlvLmM6MzY5NworbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogTm8gcHVlZG8gYWJyaXIgZWwgZmljaGVybyBwYXJhIGVzY3JpYmlyIGVuIOlsLiIKKworIzogZmlsZWlvLmM6Mzk1OQorbXNnaWQgIkU2Njc6IEZzeW5jIGZhaWxlZCIKK21zZ3N0ciAiRTY2NzogZmFsbPMgq2ZzeW5juyIKKworIzogZmlsZWlvLmM6Mzk2NgorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogRmFsbPMgZWwgY2llcnJlIGRlbCBmaWNoZXJvLiIKKworIzogZmlsZWlvLmM6NDAzNworbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzogRXJyb3IgZGUgZXNjcml0dXJhLCBsYSBjb252ZXJzafNuIGZhbGzzLiIKKworIzogZmlsZWlvLmM6NDA0MworbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IEVycm9yIGRlIGVzY3JpdHVyYSAov1Npc3RlbWEgZGUgZmljaGVyb3MgbGxlbm8/IgorCisjOiBmaWxlaW8uYzo0MTEwCittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIkVSUk9SIERFIENPTlZFUlNJ004iCisKKyM6IGZpbGVpby5jOjQxMjYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW0Rpc3Bvc2l0aXZvXSIKKworIzogZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXddIgorbXNnc3RyICJbTnVldm9dIgorCisjOiBmaWxlaW8uYzo0MTUzCittc2dpZCAiIFthXSIKK21zZ3N0ciAiIFthXSIKKworIzogZmlsZWlvLmM6NDE1MworbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIGHxYWRpZG8iCisKKyM6IGZpbGVpby5jOjQxNTUKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3ddIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiBlc2NyaXRvcyIKKworIzogZmlsZWlvLmM6NDIwNQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBNb2RvIKtwYXRjaLs6IG5vIHNlIHB1ZWRlIGd1YXJkYXIgZWwgZmljaGVybyBvcmlnaW5hbC4iCisKKyM6IGZpbGVpby5jOjQyMjcKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IE1vZG8gq3BhdGNouzogbm8gc2UgcHVlZGUgdG9jYXIgZWwgZmljaGVybyBvcmlnaW5hbCB2YWPtby4iCisKKyM6IGZpbGVpby5jOjQyNDIKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IE5vIHNlIHB1ZWRlIGJvcnJhciBlbCBmaWNoZXJvIGRlIHJlc3BhbGRvLiIKKworIzogZmlsZWlvLmM6NDMwNgorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFWSVNPOiBlbCBmaWNoZXJvIG9yaWdpbmFsIHB1ZWRlIGhhYmVyc2UgcGVyZGlkbyBvIGhhYmVyc2UgZGHxYWRvXG4iCisKKyM6IGZpbGVpby5jOjQzMDgKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICKhbm8gc2FsZ2EgZGVsIGVkaXRvciBoYXN0YSBxdWUgZWwgZmljaGVybyBzZSBoYXlhIGVzY3JpdG8hIgorCisjOiBmaWxlaW8uYzo0Mzk3Cittc2dpZCAiW2Rvc10iCittc2dzdHIgIltET1NdIgorCisjOiBmaWxlaW8uYzo0Mzk3Cittc2dpZCAiW2RvcyBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0byBET1NdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hY10iCittc2dzdHIgIltNYWNdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0byBNYWNdIgorCisjOiBmaWxlaW8uYzo0NDExCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbVU5JWF0iCisKKyM6IGZpbGVpby5jOjQ0MTEKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0byBVTklYXSIKKworIzogZmlsZWlvLmM6NDQzOAorbXNnaWQgIjEgbGluZSwgIgorbXNnc3RyICIxIGztbmVhLCAiCisKKyM6IGZpbGVpby5jOjQ0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCBs7W5lYXMsICIKKworIzogZmlsZWlvLmM6NDQ0MworbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIGNhcuFjdGVyIgorCisjOiBmaWxlaW8uYzo0NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgY2FyYWN0ZXJlcyIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltubyBoYXkgZmluIGRlIGztbmVhXSIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIlvabHRpbWEgbO1uZWEgaW5jb21wbGV0YV0iCisKKyMgIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjICBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMgIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzo0NDc0Cittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICJBRFZFUlRFTkNJQTogoaGhRWwgZmljaGVybyBoYSBjYW1iaWFkbyBkZXNkZSBxdWUgc2UgbGV58yEhISIKKworIzogZmlsZWlvLmM6NDQ3NgorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiv1F1aWVyZSByZWFsbWVudGUgZXNjcmliaXIgYSDpbD8iCisKKyM6IGZpbGVpby5jOjU3MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwODogRXJyb3Igd3JpdGluZyB0byBcIiVzXCIiCittc2dzdHIgIkUyMDg6IEVycm9yIGFsIGVzY3JpYmlyIGEgqyVzuy4iCisKKyM6IGZpbGVpby5jOjU3MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IEVycm9yIGFsIGNlcnJhciCrJXO7LiIKKworIzogZmlsZWlvLmM6NTczNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDogRXJyb3IgYWwgbGVlciCrJXO7LiIKKworIzogZmlsZWlvLmM6NTk3MAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IGVsIGF1dG9jb21hbmRvIKtGaWxlQ2hhbmdlZFNoZWxsuyBoYSBib3JyYWRvIGVsIGJ1ZmZlci4iCisKKyM6IGZpbGVpby5jOjU5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogQWR2ZXJ0ZW5jaWE6IGVsIGZpY2hlcm8gqyVzuyB5YSBubyBlc3ThIGRpc3BvbmlibGUiCisKKyM6IGZpbGVpby5jOjU5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBBZHZlcnRlbmNpYTogZWwgZmljaGVybyCrJXO7IGhhIGNhbWJpYWRvIHkgZWwgYnVmZmVyIGZ1ZSBjYW1iaWFkbyAiCisidGFtYmnpbiBlbiBWaW0uIgorCisjOiBmaWxlaW8uYzo1OTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzExOiBBZHZlcnRlbmNpYTogZWwgZmljaGVybyCrJXO7IGhhIGNhbWJpYWRvIGRlc2RlIHF1ZSBjb21lbnrzIGxhIGVkaWNp824uIgorCisjOiBmaWxlaW8uYzo1OTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIiIKKyJXMTY6IEFkdmVydGVuY2lhOiBlbCBtb2RvIGRlbCBmaWNoZXJvIKslc7sgaGEgY2FtYmlhZG8gZGVzZGUgcXVlIGNvbWVuevMgbGEgIgorImVkaWNp824uIgorCisjOiBmaWxlaW8uYzo2MDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIiIKKyJXMTM6IEFkdmVydGVuY2lhOiBlbCBmaWNoZXJvIKslc7sgaGEgc2lkbyBjcmVhZG8gZGVzcHXpcyBkZSBjb21lbnphciBsYSAiCisiZWRpY2nzbi4iCisKKyM6IGZpbGVpby5jOjYwMTkKK21zZ2lkICJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIKK21zZ3N0ciAiVmVhIKs6aGVscCB3MTG7IHBhcmEgbeFzIGluZm9ybWFjafNuLiIKKworIzogZmlsZWlvLmM6NjAzMworbXNnaWQgIldhcm5pbmciCittc2dzdHIgIkFkdmVydGVuY2lhIgorCisjOiBmaWxlaW8uYzo2MDM0Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImQ2FyZ2FyIGZpY2hlcm8iCisKKyM6IGZpbGVpby5jOjYxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MjogQ291bGQgbm90IHByZXBhcmUgZm9yIHJlbG9hZGluZyBcIiVzXCIiCittc2dzdHIgIkU0NjI6IE5vIHB1ZGUgcHJlcGFyYXJtZSBwYXJhIHJlY2FyZ2FyIGEgXCIlc1wiLiIKKworIzogZmlsZWlvLmM6NjE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogTm8gc2UgcHVkbyByZWNhcmdhciCrJXO7LiIKKworIzogZmlsZWlvLmM6Njc0MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLVN1cHJpbWlkby0tIgorCisjICB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjY5MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBObyBleGlzdGUgZWwgZ3J1cG86IKslc7suIgorCisjOiBmaWxlaW8uYzo3MDI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBDYXLhY3RlciBpbGVnYWwgZGVzcHXpcyBkZSAqOiCrJXO7LiIKKworIzogZmlsZWlvLmM6NzAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogTm8gZXhpc3RlIHRhbCBoZWNobzogqyVzuyIKKworIzogZmlsZWlvLmM6NzA0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGdyb3VwIG9yIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogTm8gZXhpc3RlIHRhbCBncnVwbyBvIGV2ZW50bzogJXMiCisKKyMgIEhpZ2hsaWdodCB0aXRsZQorIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo3MTk4Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBBdXRvLWNvbWFuZG9zIC0tLSIKKworIzogZmlsZWlvLmM6NzQ2OQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICIiCisiRTIxNzogTm8gc2UgcHVlZGVuIGVqZWN1dGFyIGxvcyBhdXRvY29tYW5kb3MgcGFyYSBUT0RPUyBsb3MgZXZlbnRvcyBkZSAiCisiZWplY3VjafNuLiIKKworIzogZmlsZWlvLmM6NzQ5MgorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAiTmluZ/puIGF1dG9jb21hbmRvIGNvaW5jaWRlLiIKKworIzogZmlsZWlvLmM6NzgxMworbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IEVsIGF1dG9jb21hbmRvIHNlIGFuaWRhIGVuIGRlbWFzaWFkb3MgYnVjbGVzLiIKKworIzogZmlsZWlvLmM6ODA4OAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG8gY29tYW5kb3MgcGFyYSCrJXO7IgorCisjOiBmaWxlaW8uYzo4MDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiRWplY3V0YW5kbyAlcyIKKworIyAgYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjgxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9jb21hbmRvICVzIgorCisjOiBmaWxlaW8uYzo4NzMxCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogRmFsdGEgdW4gey4iCisKKyM6IGZpbGVpby5jOjg3MzMKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiBGYWx0YSB1biB9LiIKKworIzogZm9sZC5jOjY4Cittc2dpZCAiRTQ5MDogTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAiRTQ5MDogTm8gZW5jb250cukgbmluZ/puIHBsaWVndWUuIgorCisjOiBmb2xkLmM6NTkzCittc2dpZCAiRTM1MDogQ2Fubm90IGNyZWF0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTA6IE5vIHB1ZWRvIGNyZWFyIGVsIHBsaWVndWUgY29uIGVsICdmb2xtZXRob2QnIGFjdGl2by4iCisKKyM6IGZvbGQuYzo1OTUKK21zZ2lkICJFMzUxOiBDYW5ub3QgZGVsZXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MTogTm8gcHVlZG8gYm9ycmFyIGVsIHBsaWVndWUgY29uIGVsICdmb2xkbWV0aG9kJyBhY3Rpdm8uIgorCisjOiBnZXRjaGFyLmM6MjQ4Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBB8WFkaXIgYWwgq2J1ZmZlcrsgZGUgbGVjdHVyYSIKKworIzogZ2V0Y2hhci5jOjIxOTgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogYXNvY2lhY2nzbiByZWN1cnNpdmEiCisKKyM6IGdldGNoYXIuYzozMDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiB5YSBleGlzdGUgdW5hIGFicmV2aWF0dXJhIGdsb2JhbCBwYXJhIKslc7suIgorCisjOiBnZXRjaGFyLmM6MzA4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6IHlhIGV4aXN0ZSB1bmEgYXNvY2lhY2nzbiBnbG9iYWwgcGFyYSCrJXO7LiIKKworIzogZ2V0Y2hhci5jOjMyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogeWEgZXhpc3RlIHVuYSBhYnJldmlhdHVyYSBwYXJhIKslc7suIgorCisjOiBnZXRjaGFyLmM6MzIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI3OiBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNzogeWEgZXhpc3RlIHVuYSBhc29jaWFjafNuIHBhcmEgqyVzuy4iCisKKyM6IGdldGNoYXIuYzozMjc5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJObyBlbmNvbnRy6SBuaW5ndW5hIGFicmV2aWF0dXJhLiIKKworIzogZ2V0Y2hhci5jOjMyODEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICJObyBlbmNvbnRy6SBuaW5ndW5hIGFzb2NpYWNp824uIgorCisjOiBnZXRjaGFyLmM6NDE3MworbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogq21ha2VtYXC7OiBtb2RvIGlsZWdhbC4iCisKKyM6IGd1aS5jOjIyMAorbXNnaWQgIkUyMjk6IENhbm5vdCBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFMjI5OiBObyBzZSBwdWVkZSBpbmljaWFyIGxhIGludGVyZmFjZSBncuFmaWNhICirR1VJuykuIgorCisjOiBndWkuYzozNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6IE5vIHB1ZWRvIGxlZXIgYSCrJXO7LiIKKworIzogZ3VpLmM6NDcyCittc2dpZCAiRTY2NTogQ2Fubm90IHN0YXJ0IEdVSSwgbm8gdmFsaWQgZm9udCBmb3VuZCIKK21zZ3N0ciAiIgorIkU2NjU6IE5vIHB1ZWRvIGluaWNpYWwgbGEgaW50ZXJmYXNlIGdy4WZpY2EgKEdVSSksIG5vIGVuY29udHLpIG5pbmd1bmEgIgorImZ1ZW50ZSBkZSBpbXByZXNp824gduFsaWRhLiIKKworIzogZ3VpLmM6NDc3Cittc2dpZCAiRTIzMTogJ2d1aWZvbnR3aWRlJyBpbnZhbGlkIgorbXNnc3RyICJFMjMxOiBFbCB2YWxvciBkZSCrZ3VpZm9udHdpZGW7IG5vIGVzIHbhbGlkby4iCisKKyM6IGd1aS5jOjU0NworbXNnaWQgIkU1OTk6IFZhbHVlIG9mICdpbWFjdGl2YXRla2V5JyBpcyBpbnZhbGlkIgorbXNnc3RyICJFNTk5OiBFbCB2YWxvciBkZSCraW1hY3RpdmF0ZWtlebsgbm8gZXMgduFsaWRvLiIKKworIzogZ3VpLmM6NDA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IE5vIHNlIHB1ZWRlIGFzaWduYXIgZWwgY29sb3IgqyVzuy4iCisKKyM6IGd1aV9hdF9mcy5jOjMwMAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8bm8gcHVlZG8gYWJyaXJsbz4iCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiCrdmltX1NlbEZpbGW7OiBObyBwdWVkbyBoYWxsYXIgbGEgZnVlbnRlIGRlIGltcHJlc2nzbiAlcy4iCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiCrdmltX1NlbEZpbGW7OiBubyBwdWVkbyByZWdyZXNhciBhbCBkaXJlY3RvcmlvIGFjdHVhbC4iCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIk5vbWJyZSBkZSBsYSBydXRhOiIKKworIzogZ3VpX2F0X2ZzLmM6MjgwNworbXNnaWQgIkU2MTU6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIiIKKyJFNjE1OiB2q3ZpbV9TZWxGaWxluzogTm8gcHVlZG8gb2J0ZW5lciBsYSBsb2NhbGl6YWNp824gZGVsIGRpcmVjdG9yaW8gYWN0dWFsLiIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQ2FuY2VsYXIiCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAiU2Nyb2xsYmFyIFdpZGdldDogTm8gcHVkZSBvYnRlbmVyIGxhIGdlb21ldHLtYSBkZWwgq3BpeG1hcLsgbWluaWF0dXJhLiIKKworIzogZ3VpX2F0aGVuYS5jOjIwNDcgZ3VpX21vdGlmLmM6MTg3MQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIkRp4WxvZ28gZGUgVmltIgorCisjOiBndWlfYmV2YWwuYzoxMDEgZ3VpX3czMi5jOjM5NDUKK21zZ2lkICJFMjMyOiBDYW5ub3QgY3JlYXRlIEJhbGxvb25FdmFsIHdpdGggYm90aCBtZXNzYWdlIGFuZCBjYWxsYmFjayIKK21zZ3N0ciAiIgorIkUyMzI6IE5vIHB1ZWRvIGNyZWFyIHVuIKtCYWxsb29uRXZhbLsgcXVlIGNvbnRlbmdhIHRhbnRvIGVsIG1lbnNhamUgY29tbyBlbCAiCisiq2NhbGxiYWNruy4iCisKKyM6IGd1aV9ndGsuYzoxNjA3Cittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiRGnhbG9nbyBkZSBWaW0uLi4iCisKKyM6IGd1aV9ndGsuYzoyMDYwIG1lc3NhZ2UuYzoyOTk5Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlNpXG4iCisiJk5vXG4iCisiJkNhbmNlbGFyIgorCisjOiBndWlfZ3RrLmM6MjI2OAorbXNnaWQgIklucHV0IF9NZXRob2RzIgorbXNnc3RyICJN6XRvZG9zIGRlIEVudHJhZGEgKKtJbnB1dF9NZXRob2RzuykiCisKKyM6IGd1aV9ndGsuYzoyNTM0IGd1aV9tb3RpZi5jOjI3NjgKK21zZ2lkICJWSU0gLSBTZWFyY2ggYW5kIFJlcGxhY2UuLi4iCittc2dzdHIgIlZJTSAtIEJ1c2NhciB5IHJlZW1wbGF6YXIuLi4iCisKKyM6IGd1aV9ndGsuYzoyNTQyIGd1aV9tb3RpZi5jOjI3NzAKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIEJ1c2Nhci4uLiIKKworIzogZ3VpX2d0ay5jOjI1NzQgZ3VpX21vdGlmLmM6Mjg4OAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIr9FbmNvbnRyYXIgcXXpPzoiCisKKyM6IGd1aV9ndGsuYzoyNTkyIGd1aV9tb3RpZi5jOjI5MjAKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICJSZWVtcGxhemFyIGNvbjoiCisKKyMgIHdob2xlIHdvcmQgb25seSBidXR0b24KKyMuIHdob2xlIHdvcmQgb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjI0IGd1aV9tb3RpZi5jOjMwMzYKK21zZ2lkICJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiCittc2dzdHIgIkVuY29udHJhciBzb2xvIHBhbGFicmFzIGNvbXBsZXRhcy4iCisKKyMgIG1hdGNoIGNhc2UgYnV0dG9uCisjLiBtYXRjaCBjYXNlIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MzUgZ3VpX21vdGlmLmM6MzA0OAorbXNnaWQgIk1hdGNoIGNhc2UiCittc2dzdHIgIkxhIPpuaWNhIGNvaW5jaWRlbmNpYSIKKworIzogZ3VpX2d0ay5jOjI2NDUgZ3VpX21vdGlmLmM6Mjk5MAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAiRGlyZWNjafNuIgorCisjICAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNjU3IGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAiSGFjaWEgYXJyaWJhIgorCisjOiBndWlfZ3RrLmM6MjY2MSBndWlfbW90aWYuYzozMDEwCittc2dpZCAiRG93biIKK21zZ3N0ciAiSGFjaWEgYWJham8iCisKKyM6IGd1aV9ndGsuYzoyNjgzIGd1aV9ndGsuYzoyNjg1IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIkVuY29udHJhciBzaWd1aWVudGUiCisKKyM6IGd1aV9ndGsuYzoyNzAyIGd1aV9ndGsuYzoyNzA0IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJSZWVtcGxhemFyIgorCisjOiBndWlfZ3RrLmM6MjcxNSBndWlfZ3RrLmM6MjcxNyBndWlfbW90aWYuYzoyODIyCittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIlJlZW1wbGF6YXIgdG9kb3MiCisKKyM6IGd1aV9ndGtfeDExLmM6MjMyNworbXNnaWQgIlZpbTogUmVjZWl2ZWQgXCJkaWVcIiByZXF1ZXN0IGZyb20gc2Vzc2lvbiBtYW5hZ2VyXG4iCittc2dzdHIgIlZpbTogUmVjaWLtIHVuYSBzb2xpY2l0dWQgXCJkaWVcIiBkZWwgYWRtaW5pc3RyYWRvciBkZSBzZXNpb25lcy5cbiIKKworIzogZ3VpX2d0a194MTEuYzozNTE5Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIlZpbTogTGEgdmVudGFuYSBwcmluY2lwYWwgZnVlIGRlc3RydWlkYSBpbmVzcGVyYWRhbWVudGUuXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDEzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJTZWxlY2Np824gZGUgdGlwb3MgZGUgbGV0cmEiCisKKyM6IGd1aV9ndGtfeDExLmM6NjAzNSB1aS5jOjIxMjAKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICJTZSBoYSB1c2FkbyCrQ1VUX0JVRkZFUjC7IGVuIHZleiBkZSB1bmEgc2VsZWNjafNuIHZhY+1hLiIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0cm8iCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiRGlyZWN0b3Jpb3MiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjEKK21zZ2lkICJIZWxwIgorbXNnc3RyICJBeXVkYSIKKworIzogZ3VpX21vdGlmLmM6MTYyMgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJGaWNoZXJvcyIKKworIzogZ3VpX21vdGlmLmM6MTYyNAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiU2VsZWNjafNuIgorCisjOiBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiRGVzaGFjZXIiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiBObyBwdWVkbyBjYXJnYXIgbGEgZnVlbnRlIGRlIGltcHJlc2nzbiBaYXAgJyVzJy4iCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiBObyBwdWVkbyB1c2FyIGxhIGZ1ZW50ZSBkZSBpbXByZXNp824gJXMuIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJFbnZpYW5kbyBtZW5zYWplIHBhcmEgdGVybWluYXIgbG9zIHByb2Nlc29zIGRlcGVuZGllbnRlcyAoq2hpam+7KS5cbiIKKworIzogZ3VpX3czMi5jOjgzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogQXJndW1lbnRvIG5vIGFkbWl0aWRvOiCrLSVzuzsgdXNlIGxhIHZlcnNp824gT0xFLiIKKworIzogZ3VpX3c0OC5jOjIxNDcKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJCdXNjYXIgY2FkZW5hICh1c2Ugq1xcXFy7IHBhcmEgZW5jb250cmFyIHVuIKtcXLspIgorCisjOiBndWlfdzQ4LmM6MjE3MgorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIkJ1c2NhciB5IHJlZW1wbGF6YXIgKHVzZSCrXFxcXLsgcGFyYSBlbmNvbnRyYSB1bmEgq1xcuykiCisKKyM6IGd1aV94MTEuYzoxNTM3Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBubyBzZSBwdWVkZSBhc2lnbmFyIHVuYSBlbnRyYWRhIGFsIG1hcGEgZGUgY29sb3JlczsgYWxndW5vcyAiCisiY29sb3JlcyB0YWwgdmV6IG5vIHNlYW4gY29ycmVjdG9zLiIKKworIzogZ3VpX3gxMS5jOjIxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIiIKKyJFMjUwOiBGYWx0YW4gbGFzIGZ1ZW50ZXMgZGUgaW1wcmVzafNuIHBhcmEgbG9zIHNpZ3VpZW50ZXMgY29uanVudG9zIGRlICIKKyJjYXJhY3RlcmVzIGVuIGVsIGNvbmp1bnRvIGRlIGZ1ZW50ZXMgqyVzuzoiCisKKyM6IGd1aV94MTEuYzoyMTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IE5vbWJyZSBkZWwgY29uanVudG8gZGUgZnVlbnRlcyBkZSBpbXByZXNp8246IKslc7siCisKKyM6IGd1aV94MTEuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkxhIGZ1ZW50ZSBkZSBpbXByZXNp824gqyVzuyBubyBlcyBkZSBhbmNobyBmaWpvLiIKKworIzogZ3VpX3gxMS5jOjIxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiBOb21icmUgZGVsIGNvbmp1bnRvIGRlIGZ1ZW50ZXMgZGUgaW1wcmVzafNuOiCrJXO7XG4iCisKKyM6IGd1aV94MTEuYzoyMTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJGdWVudGUgZGUgaW1wcmVzafNuIDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJGdWVudGUgZGUgaW1wcmVzafNuIDE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlbGQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAiIgorIkxhIGFuY2h1cmEgZGUgbGEgZnVlbnRlIGRlIGltcHJlc2nzbiAgJWxkIG5vIGVzIGVsIGRvYmxlIGRlIGxhIGRlIGxhIGZ1ZW50ZSAiCisiZGUgaW1wcmVzafNuIDBcbiIKKworIzogZ3VpX3gxMS5jOjIxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICJBbmNodXJhIGRlIGxhIGZ1ZW50ZSBkZSBpbXByZXNp824gMDogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyJBbmNodXJhIGRlIGxhIGZ1ZW50ZSBkZSBpbXByZXNp824gMTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBFUlJPUiBkZWwgYXV0821hdGEgSGFuZ3VsLiIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIkHxYWRpciB1bmEgbnVldmEgYmFzZSBkZSBkYXRvcy4iCisKKyM6IGlmX2NzY29wZS5jOjc5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiUGV0aWNp824gZGUgdW4gcGF0cvNuLiIKKworIzogaWZfY3Njb3BlLmM6ODEKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiTW9zdHJhciBlc3RlIG1lbnNhamUuIgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJNYXRhciB1bmEgY29uZXhp824uIgorCisjOiBpZl9jc2NvcGUuYzo4NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlJlaW5pY2lhciB0b2RhcyBsYXMgY29uZXhpb25lcy4iCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiTW9zdHJhciBsYXMgY29uZXhpb25lcy4iCisKKyM6IGlmX2NzY29wZS5jOjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjA6IFVzYWdlOiBjc1tjb3BlXSAlcyIKK21zZ3N0ciAiRTU2MDogRm9ybWEgZGUgdXNvOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICJFc3RlIGNvbWFuZG8gq2NzY29wZbsgbm8gYWRtaXRlIGxhIGRpdmlzafNuIGRlIGxhIHZlbnRhbmEuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiBGb3JtYSBkZSB1c286IGNzdGFnIDxpZGVudGlmaWNhZG9yPiIKKworIzogaWZfY3Njb3BlLmM6MjMxCittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiCrdGFnuyBubyBlbmNvbnRyYWRvLiIKKworIzogaWZfY3Njb3BlLmM6NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAiRTU2MzogRXJyb3IgZW4gc3RhdCglcyk6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0MTkKK21zZ2lkICJFNTYzOiBzdGF0IGVycm9yIgorbXNnc3RyICJFNTYzOiBlcnJvciBlbiBsYSBmdW5jafNuIKtzdGF0KCm7LiIKKworIzogaWZfY3Njb3BlLmM6NTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgbm8gZXMgdW4gZGlyZWN0b3JpbyBuaSB1bmEgYmFzZSBkZSBkYXRvcyB24WxpZGEgZGUgY3Njb3BlLiIKKworIzogaWZfY3Njb3BlLmM6NTM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiU2UgaGEgYfFhZGlkbyBsYSBiYXNlIGRlIGRhdG9zIKtjc2NvcGW7ICVzIgorCisjOiBpZl9jc2NvcGUuYzo1ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MjogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlbGQiCittc2dzdHIgIkUyNjI6IEVycm9yIGFsIGxlZXIgbGEgY29uZXhp824gJWxkIGNvbiBjc2NvcGUuIgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogVGlwbyBkZSBi+nNxdWVkYSBkZXNjb25vY2lkbyBwYXJhIGNzY29wZS4iCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBObyBwdWRlIGNyZWFyIGxhIGNvbmV4afNuIKtwaXBluyBwYXJhIGNvbXVuaWNhcm1lIGNvbiBjc2NvcGUuIgorCisjOiBpZl9jc2NvcGUuYzo3NTMKK21zZ2lkICJFNjIyOiBDb3VsZCBub3QgZm9yayBmb3IgY3Njb3BlIgorbXNnc3RyICJFNjIyOiBObyBwdWRlIGNyZWFyIHVuIG51ZXZvIHByb2Nlc28gKKtmb3JruykgcGFyYSB1c2FyIGNzY29wZS4iCisKKyM6IGlmX2NzY29wZS5jOjg0NyBpZl9jc2NvcGUuYzo4OTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAiRmFsbPMgbGEgZWplY3VjafNuIGRlIKtjc19jcmVhdGVfY29ubmVjdGlvbrsiCisKKyM6IGlmX2NzY29wZS5jOjg5OAorbXNnaWQgIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIKK21zZ3N0ciAiRTYyMzogTm8gcHVkZSBjcmVhciB1biBudWV2byBwcm9jZXNvICirc3Bhd267KSBkZSBjc2NvcGUuIgorCisjOiBpZl9jc2NvcGUuYzo5MTEKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgIqtjc19jcmVhdGVfY29ubmVjdGlvbrs6IEZhbGzzIKtmZG9wZW67IHBhcmEgq3RvX2Zwuy4iCisKKyM6IGlmX2NzY29wZS5jOjkxMworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiq2NzX2NyZWF0ZV9jb25uZWN0aW9uuzogRmFsbPMgq2Zkb3BlbrsgcGFyYSCrZnJfZnC7LiIKKworIzogaWZfY3Njb3BlLmM6OTUxCittc2dpZCAiRTU2Nzogbm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICJFNTY3OiBObyBoYXkgY29uZXhpb25lcyBjb24gY3Njb3BlLiIKKworIzogaWZfY3Njb3BlLmM6MTAyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIiIKKyJFMjU5OiBObyBzZSBlbmNvbnRyYXJvbiBjb2luY2lkZW5jaWFzIHBhcmEgbGEgYvpzcXVlZGEgY3Njb3BlICVzIGRlICVzLiIKKworIzogaWZfY3Njb3BlLmM6MTA4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY5OiBpbnZhbGlkIGNzY29wZXF1aWNrZml4IGZsYWcgJWMgZm9yICVjIgorbXNnc3RyICJFNDY5OiBMYSBtYXJjYSCrY3Njb3BlcXVpY2tmaXi7ICVjIHBhcmEgJWMgbm8gZXMgduFsaWRhLiIKKworIzogaWZfY3Njb3BlLmM6MTE1MgorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY29tYW5kb3MgZGUgq2NzY29wZbs6XG4iCisKKyM6IGlmX2NzY29wZS5jOjExNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcykiCittc2dzdHIgIiUtNXM6ICUtMzBzIChNb2RvIGRlIHVzbzogJXMpIgorCisjOiBpZl9jc2NvcGUuYzoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjU6IGNhbm5vdCBvcGVuIGNzY29wZSBkYXRhYmFzZTogJXMiCittc2dzdHIgIkU2MjU6IE5vIHB1ZWRvIGFicmlyIGxhIGJhc2UgZGUgZGF0b3MgY3Njb3BlOiAlcy4iCisKKyM6IGlmX2NzY29wZS5jOjEyNzEKK21zZ2lkICJFNjI2OiBjYW5ub3QgZ2V0IGNzY29wZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiRTYyNjogTm8gcHVlZG8gb2J0ZW5lciBpbmZvcm1hY2nzbiBhY2VyY2EgZGUgbGEgYmFzZSBkZSBkYXRvcyBjc2NvcGUuIgorCisjOiBpZl9jc2NvcGUuYzoxMjk2Cittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IE5vIHNlIGHxYWRp8yB1bmEgYmFzZSBkZSBkYXRvcyBkZSBjc2NvcGUgZHVwbGljYWRhLiIKKworIzogaWZfY3Njb3BlLmM6MTMwNworbXNnaWQgIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJFNTY5OiBTZSBoYSBhbGNhbnphZG8gZWwgbvptZXJvIG3heGltbyBkZSBjb25leGlvbmVzIGNvbiBjc2NvcGUuIgorCisjOiBpZl9jc2NvcGUuYzoxNDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogbm8gc2UgaGEgZW5jb250cmFkbyBsYSBjb25leGnzbiCrY3Njb3BluyAlcyIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgIkNvbmV4afNuIKtjc2NvcGW7ICVzIGNlcnJhZGEuIgorCisjICBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyMuIHNob3VsZCBub3QgcmVhY2ggaGVyZQorIzogaWZfY3Njb3BlLmM6MTU5OAorbXNnaWQgIkU1NzA6IGZhdGFsIGVycm9yIGluIGNzX21hbmFnZV9tYXRjaGVzIgorbXNnc3RyICJFNTcwOiBFcnJvciBmYXRhbCBlbiCrY3NfbWFuYWdlX21hdGNoZXO7LiIKKworIzogaWZfY3Njb3BlLmM6MTg0OAorIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlcyIKK21zZ3N0ciAiq3RhZ7sgZGUgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTg3MAorbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICBs7W5lYSIKKworIzogaWZfY3Njb3BlLmM6MTg3MgorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAibm9tYnJlIGRlbCBmaWNoZXJvIC8gY29udGV4dG8gLyBs7W5lYVxuIgorCisjOiBpZl9jc2NvcGUuYzoxOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDk6IENzY29wZSBlcnJvcjogJXMiCittc2dzdHIgIkU2MDk6IEVycm9yIGRlIKtjc2NvcGW7OiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICJTZSBoYW4gdmFjaWFkbyB0b2RhcyBsYXMgYmFzZXMgZGUgZGF0b3MgZGUgq2NzY29wZbsiCisKKyM6IGlmX2NzY29wZS5jOjIyNDQKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAibm8gaGF5IGNvbmV4aW9uZXMgq2NzY29wZbtcbiIKKworIzogaWZfY3Njb3BlLmM6MjI0OAorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiIG66IHBpZCAgICBiYXNlIGRlIGRhdG9zICAgICAgICAgICAgICAgICAgICAgICBwcmVmaWpvIHJ1dGFcbiIKKworIzogaWZfcHl0aG9uLmM6NDM2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjYzOiBMbyBzaWVudG8sIGVzdGUgY29tYW5kbyBlc3ThIGRlc2FjdGl2YWRvIHB1ZXMgbm8gc2UgcHVkbyBjYXJnYXIgbGEgIgorImJpYmxpb3RlY2EgZGUgUHl0aG9uLiIKKworIzogaWZfcHl0aG9uLmM6NTAwCittc2dpZCAiRTY1OTogQ2Fubm90IGludm9rZSBQeXRob24gcmVjdXJzaXZlbHkiCittc2dzdHIgIkU2NTk6IE5vIHB1ZWRvIGludm9jYXIgYSBQeXRob24gcmVjdXJzaXZhbWVudGUuIgorCisjOiBpZl9weXRob24uYzo3MDEKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIm5vIHNlIHB1ZWRlbiBib3JyYXIgbG9zIGF0cmlidXRvcyBkZSCrT3V0cHV0T2JqZWN0uy4iCisKKyM6IGlmX3B5dGhvbi5jOjcwOAorbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgIqtzb2Z0c3BhY2W7IGRlYmUgc2VyIHVuIGVudGVyby4iCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJhdHJpYnV0byBubyB24WxpZG8uIgorCisjOiBpZl9weXRob24uYzo3NTUgaWZfcHl0aG9uLmM6NzY5Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAiq3dyaXRlbGluZXMoKbsgcmVxdWllcmUgdW5hIGxpc3RhIGRlIGNhZGVuYXMuIgorCisjOiBpZl9weXRob24uYzo4OTUKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBlcnJvciBkZSBpbmljaWFsaXphY2nzbiBkZSBvYmpldG9zIGRlIEUvUy4iCisKKyM6IGlmX3B5dGhvbi5jOjEwODAgaWZfdGNsLmM6MTQwMgorbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAiZXhwcmVzafNuIG5vIHbhbGlkYS4iCisKKyM6IGlmX3B5dGhvbi5jOjEwOTQgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiZXhwcmVzaW9uZXMgZGVzYWN0aXZhZGFzIGFsIGNvbXBpbGFyLiIKKworIzogaWZfcHl0aG9uLmM6MTEwNworbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgImludGVudG8gZGUgcmVmZXJpcnNlIGEgdW4gYnVmZmVyIHN1cHJpbWlkby4iCisKKyM6IGlmX3B5dGhvbi5jOjExMjIgaWZfcHl0aG9uLmM6MTE2MyBpZl9weXRob24uYzoxMjI3IGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIm76bWVybyBkZSBsYSBs7W5lYSBmdWVyYSBkZWwgcmFuZ28uIgorCisjOiBpZl9weXRob24uYzoxMzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPG9iamV0byCrYnVmZmVyuyAoc3VwcmltaWRvKSBlbiAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTQ1MyBpZl90Y2wuYzo4MzYKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAibm9tYnJlIGRlIG1hcmNhIG5vIHbhbGlkbyIKKworIzogaWZfcHl0aG9uLmM6MTczMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICJubyBleGlzdGUgdGFsIGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTgyMQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgImludGVudG8gZGUgcmVmZXJpcnNlIGEgdW5hIHZlbnRhbmEgc3VwcmltaWRhIgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJhdHJpYnV0byBkZSBz82xvIGxlY3R1cmEiCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgInBvc2ljafNuIGRlbCBjdXJzb3IgZnVlcmEgZGVsIGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTk1NgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZXRvIHZlbnRhbmEgKHN1cHJpbWlkbykgZW4gJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjxvYmpldG8gdmVudGFuYSAoZGVzY29ub2NpZG8pIGVuICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTk3MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93ICVkPiIKK21zZ3N0ciAiPHZlbnRhbmEgJWQ+IgorCisjOiBpZl9weXRob24uYzoyMDQ2Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgIm5vIGV4aXN0ZSB0YWwgdmVudGFuYSIKKworIzogaWZfcHl0aG9uLmM6MjMwNyBpZl9weXRob24uYzoyMzQxIGlmX3B5dGhvbi5jOjIzOTYgaWZfcHl0aG9uLmM6MjQ2NAorIzogaWZfcHl0aG9uLmM6MjU4NiBpZl9weXRob24uYzoyNjM4IGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OQorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIk5vIHB1ZWRvIGd1YXJkYXIgbGEgaW5mb3JtYWNp824gcGFyYSBkZXNoYWNlci4iCisKKyM6IGlmX3B5dGhvbi5jOjIzMDkgaWZfcHl0aG9uLmM6MjQwMyBpZl9weXRob24uYzoyNDc1Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICJubyBwdWVkbyBzdXByaW1pciBsYSBs7W5lYSIKKworIzogaWZfcHl0aG9uLmM6MjM0NiBpZl9weXRob24uYzoyNDkxIGlmX3RjbC5jOjY5MCBpZl90Y2wuYzoyMDIxCittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAibm8gcHVlZG8gcmVlbXBsYXphciBsYSBs7W5lYSIKKworIzogaWZfcHl0aG9uLmM6MjUwOSBpZl9weXRob24uYzoyNTg4IGlmX3B5dGhvbi5jOjI2NDYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIm5vIHB1ZWRvIGluc2VydGFyIGxhIGztbmVhIgorCisjOiBpZl9weXRob24uYzoyNzUwCittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICJMYSBjYWRlbmEgbm8gcHVlZGUgY29udGVuZXIgcXVpZWJyZXMgZGUgbO1uZWEiCisKKyM6IGlmX3J1YnkuYzo0MjIKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6IExvIHNpZW50bywgZXN0ZSBjb21hbmRvIGVzdOEgZGVzYWN0aXZhZG8gcHVlcyBubyBzZSBwdWRvIGNhcmdhciBsYSAiCisiYmlibGlvdGVjYSBkZSBSdWJ5LiIKKworIzogaWZfcnVieS5jOjQ4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBFbCBlc3RhdHVzICVkIGRlIKtsb25nam1wuyBubyBlcyBjb25vY2lkby4iCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiSW50ZXJjYW1iaWFyIGltcGxlbWVudGFjafNuL2RlZmluaWNp824iCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIk1vc3RyYXIgbGEgY2xhc2UgYmFzZSBkZSIKKworIzogaWZfc25pZmYuYzo2OQorbXNnaWQgIlNob3cgb3ZlcnJpZGRlbiBtZW1iZXIgZnVuY3Rpb24iCittc2dzdHIgIk1vc3RyYXIgbGEgZnVuY2nzbiBtaWVtYnJvIHF1ZSBzZSBoYSBzb2JyZXBhc2FkbyBjb24gZWwgY/NkaWdvIG51ZXZvLiIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAiUmVzdGF1cmFyIGRlbCBmaWNoZXJvIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJSZXN0YXVyYXIgZGVsIHByb3llY3RvIgorCisjOiBpZl9zbmlmZi5jOjczCittc2dpZCAiUmV0cmlldmUgZnJvbSBhbGwgcHJvamVjdHMiCittc2dzdHIgIlJlc3RhdXJhciBkZSB0b2RvcyBsb3MgcHJveWVjdG9zIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIlJlc3RhdXJhciIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICJNb3N0cmFyIGVsIG9y7WdlbiBkZSAiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAiQnVzY2FyIHPtbWJvbG8iCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIkhvamVhciBsYSBjbGFzZSIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICJNb3N0cmFyIGxhIGNsYXNlIGVuIHN1IGplcmFycXXtYSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIk1vc3RyYXIgbGEgY2xhc2UgZW4gamVyYXJxde1hIHJlc3RyaW5naWRhIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgc2UgcmVmaWVyZSBhIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiByZWZlcmlkYSBwb3IiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIHRpZW5lIHVuIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHVzYWRhIHBvciIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAiTW9zdHJhciBkb2N1IGRlIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIkdlbmVyYXIgZG9jdSBkZSIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiIgorIk5vIHB1ZWRvIGNvbmVjdGFybWUgYSBTTmlGRisuIFZlcmlmaXF1ZSBlbCBlbnRvcm5vICirc25pZmZlbWFjc7sgZGViZSBlc3RhciAiCisiZW4gJFBBVEgpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogRXJyb3IgYWwgbGVlci4gRGVzY29uZWN0YWRvIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICJTTmlGRisgZXN04SBhY3R1YWxtZW50ZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAibm8gIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAiY29uZWN0YWRvIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogUGV0aWNp824gZGUgU05pRkYrIGRlc2Nvbm9jaWRhOiCrJXO7IgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiBFcnJvciBhbCBjb25lY3Rhcm1lIGEgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIG5vIGVzdOEgY29uZWN0YWRvIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBObyBlcyB1biCrYnVmZmVyuyBkZSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTA4MworbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6IGVycm9yIGFsIGVzY3JpYmlyLiBEZXNjb25lY3RhZG8iCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAibvptZXJvIGRlIKtidWZmZXK7IG5vIHbhbGlkbyIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibm8gaW1wbGVtZW50YWRvIGH6biIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm9wY2nzbiBkZXNjb25vY2lkYSIKKworIyAgPz8/CisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAibm8gc2UgcHVlZGUobikgcG9uZXIgbGEocykgbO1uZWEocykiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAibWFyY2Egc2luIHBvbmVyIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICJmaWxhICVkIGNvbHVtbmEgJWQiCisKKyM6IGlmX3RjbC5jOjg4MQorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIm5vIHNlIHB1ZWRlIGluc2VydGFyL2HxYWRpciBs7W5lYSIKKworIzogaWZfdGNsLmM6MTI2OAorbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICJpbmRpY2Fkb3IgZGVzY29ub2NpZG86ICIKKworIzogaWZfdGNsLmM6MTMzOAorbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICKrdmltT3B0aW9uuyBkZXNjb25vY2lkYSIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAiaW50ZXJydXBjafNuIGRlc2RlIGVsIHRlY2xhZG8iCisKKyM6IGlmX3RjbC5jOjE0MjgKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgImVycm9yIGRlIHZpbSIKKworIzogaWZfdGNsLmM6MTQ3MQorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAibm8gcHVlZG8gY3JlYXIgZWwgY29tYW5kbyBkZSBidWZmZXIvdmVudGFuYTogZWwgb2JqZXRvIHNlcuEgc3VwcmltaWRvIgorCisjOiBpZl90Y2wuYzoxNTQ1Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorIk5vIHB1ZWRvIHJlZ2lzdHJhciBlbCBjb21hbmRvIKtjYWxsYmFja7s6IEVsIKtidWZmZXK7IG8gbGEgdmVudGFuYSB5YSBmdekgIgorImVsaW1pbmFkby4iCisKKyMgIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MgorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogRVJST1IgRkFUQUwgREUgVENMOiC/oatyZWZsaXN0uyBjb3JydXB0YSE/IFBvciBmYXZvciwgaW5mb3JtZSBkZSBlc3RvICIKKyJhIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJObyBwdWVkbyByZWdpc3RyYXIgZWwgY29tYW5kbyCrY2FsbGJhY2u7OiBObyBwdWVkbyBlbmNvbnRyYXIgbGEgcmVmZXJlbmNpYSAiCisiYWwgq2J1ZmZlcrsgbyBsYSB2ZW50YW5hLiIKKworIzogaWZfdGNsLmM6MTcyNAorbXNnaWQgIiIKKyJFNTcxOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFNTcxOiBMbyBzaWVudG8sIGVzdGUgY29tYW5kbyBlc3ThIGRlc2FjdGl2YWRvIHB1ZXMgbm8gc2UgcHVkbyBjYXJnYXIgbGEgIgorImJpYmxpb3RlY2EgZGUgVGNsLiIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODE6IEVSUk9SIERFIFRDTDogv6FlbCBj82RpZ28gZGUgc2FsaWRhIG5vIGVzIKtpbnS7IT8gUG9yIGZhdm9yIGluZm9ybWUgZGUgIgorImVzdG8gYSB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjIwMDcKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIm5vIHB1ZWRvIG9idGVuZXIgbGEgbO1uZWEiCisKKyM6IGlmX3hjbWRzcnYuYzoyMjUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJJbmNhcGF6IGRlIHJlZ2lzdHJhciB1biBub21icmUgZGUgc2Vydmlkb3IgZGUgY29tYW5kb3MiCisKKyM6IGlmX3hjbWRzcnYuYzo0NzMKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBObyBwdWRlIGVudmlhciBlbCBjb21hbmRvIGFsIHByb2dyYW1hIGRlIGRlc3Rpbm8iCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IEVsIElEIGRlbCB1c3VhcmlvIGRlbCBzZXJ2aWRvciBubyBlcyB24WxpZG86IKslc7suIgorCisjOiBpZl94Y21kc3J2LmM6MTExMAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiT3BjafNuIGRlc2Nvbm9jaWRhIgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiRGVtYXNpYWRvcyBhcmd1bWVudG9zIGRlIGVkaWNp824uIgorCisjOiBtYWluLmM6NjQKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJGYWx0YSBlbCBhcmd1bWVudG8gZGVzcHXpcyBkZSIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIkJhc3VyYSBkZXNwdelzIGRlIGxhIG9wY2nzbiIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIiIKKyJEZW1hc2lhZG9zIGFyZ3VtZW50b3MgdGFsZXMgY29tbzogqytjb21hbmRvuywgqy1jIGNvbWFuZG+7IG8gqy0tY21kIGNvbWFuZG+7LiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIkFyZ3VtZW50byBubyB24WxpZG8gcGFyYSIKKworIzogbWFpbi5jOjQ2NgorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiRXN0ZSBWaW0gbm8gaGEgc2lkbyBjb21waWxhZG8gY29uIGxhIGNhcmFjdGVy7XN0aWNhIKtkaWZmuy4iCisKKyM6IG1haW4uYzo5MzIKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICJJbnRlbnRvIGRlIGFicmlyIGRlIG51ZXZvIGVsIGZpY2hlcm8gq3NjcmlwdLs6IKsiCisKKyM6IG1haW4uYzo5NDEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIk5vIHB1ZWRvIGFicmlyIHBhcmEgbGVlcjogqyIKKworIzogbWFpbi5jOjk4NQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTm8gcHVlZG8gYWJyaXIgcGFyYSBlc2NyaWJpciBsYSBzYWxpZGEgZGVsIKtzY3JpcHS7OiCrIgorCisjOiBtYWluLmM6MTEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIiVkIGZpY2hlcm9zIHF1ZSBlZGl0YXJcbiIKKworIzogbWFpbi5jOjEyMzMKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IEFkdmVydGVuY2lhOiBsYSBzYWxpZGEgbm8gZXMgYSB1biB0ZXJtaW5hbFxuIgorCisjOiBtYWluLmM6MTIzNQorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IEFkdmVydGVuY2lhOiBsYSBlbnRyYWRhIG5vIGVzIGRlc2RlIHVuIHRlcm1pbmFsXG4iCisKKyMgIGp1c3QgaW4gY2FzZS4uCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJM7W5lYSBkZSBjb21hbmRvcyBhbnRlciBkZSCrdmltcmO7IgorCisjOiBtYWluLmM6MTMzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogTm8gcHVlZG8gbGVlciBkZXNkZSCrJXO7IgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiTeFzIGluZm9ybWFjafNuIGNvbjogq3ZpbSAtaLtcbiIKKworIzogbWFpbi5jOjI0NDQKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW2ZpY2hlcm8gLi4uXSAgIGVkaXRhIGVsL2xvcyBmaWNoZXJvKHMpIGVzcGVjaWZpY2FkbyhzKSIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICBsZWUgdGV4dG8gZGUgbGEgZW50cmFkYSBlc3ThbmRhciIKKworIzogbWFpbi5jOjI0NDYKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCCrdGFnuyAgICAgICAgZWRpdGEgZWwgZmljaGVybyBkb25kZSBlc3ThIGRlZmluaWRvIKt0YWe7IgorCisjOiBtYWluLmM6MjQ0OAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2ZpY2guIGVyci5dIGVkaXRhIGVsIGZpY2hlcm8gY29uIGVsIHByaW1lciBlcnJvciIKKworIzogbWFpbi5jOjI0NTcKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiVXNvOiIKKworIzogbWFpbi5jOjI0NjAKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbYXJndW1lbnRvc10iCisKKyM6IG1haW4uYzoyNDY0Cittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgbzoiCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50b3M6XG4iCisKKyM6IG1haW4uYzoyNDY4Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHRT82xvIG5vbWJyZXMgZGUgZmljaGVyb3MgZGVzcHXpcyBkZSBlc3RvIgorCisjOiBtYWluLmM6MjQ3MAorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx0Tm8gZXhwYW5kaXIgY29tb2RpbmVzIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdFJlZ2lzdHJhciBlc3RlIKtndmltuyBwYXJhIKtPTEW7IgorCisjOiBtYWluLmM6MjQ3NAorbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHRTdXByaW1pciBlbCByZWdpc3RybyBkZSBndmltIHBhcmEgT0xFIgorCisjOiBtYWluLmM6MjQ3NworbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0RWplY3V0YXIgdXNhbmRvIGVsIEdVSSAoY29tbyCrZ3ZpbbspIgorCisjOiBtYWluLmM6MjQ3OAorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIiIKKyItZiAgbyAgLS1ub2ZvcmtcdFByaW1lciBwbGFubzogTm8gc2VwYXJhcnNlICirZm9ya7spIGN1YW5kbyBzZSBpbmljaWEgbGEgIgorImludGVyZmFjZSBncuFmaWNhIChHVUkpLiIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRNb2RvIFZpIChjb21vIKt2abspIgorCisjOiBtYWluLmM6MjQ4MQorbXNnaWQgIi1lXHRcdFx0RXggbW9kZSAobGlrZSBcImV4XCIpIgorbXNnc3RyICItZVx0XHRcdE1vZG8gRXggKGNvbW8gq2V4uykiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdE1vZG8gc2lsZW5jaW9zbyBvIKtiYXRjaLsgKHPzbG8gcGFyYSCrZXi7KSIKKworIzogbWFpbi5jOjI0ODQKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx0TW9kbyCrZGlmZrsgKGNvbW8gq3ZpbWRpZma7KSIKKworIzogbWFpbi5jOjI0ODYKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdE1vZG8gZuFjaWwgKGNvbW8gq2V2aW27LCBzaW4gbW9kbykiCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHRNb2RvIGRlIHPzbG8gbGVjdHVyYSAoY29tbyCrdmlld7spIgorCisjOiBtYWluLmM6MjQ4OAorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHRNb2RvIHJlc3RyaW5naWRvIChjb21vIKtydmltuykiCisKKyM6IG1haW4uYzoyNDg5Cittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHRNb2RpZmljYWNpb25lcyBubyBwZXJtaXRpZGFzIChlc2NyaXR1cmEgZGUgZmljaGVyb3MpIgorCisjOiBtYWluLmM6MjQ5MAorbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdE1vZGlmaWNhY2lvbmVzIGVuIGVsIHRleHRvIG5vIHBlcm1pdGlkYXMiCisKKyM6IG1haW4uYzoyNDkxCittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHRNb2RvIGJpbmFyaW8iCisKKyM6IG1haW4uYzoyNDkzCittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx0TW9kbyBsaXNwIgorCisjOiBtYWluLmM6MjQ5NQorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0Q29tcGF0aWJsZSBjb24gVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0OTYKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHRObyB0b3RhbG1lbnRlIGNvbXBhdGlibGUgY29uIFZpOiAnbm9jb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0OTcKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0XHROaXZlbCBkZSBkZXRhbGxlIGRlIGxhIGVqZWN1Y2nzbiIKKworIzogbWFpbi5jOjI0OTgKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdE1vZG8gZGUgZGVwdXJhY2nzbiIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdFNpbiBmaWNoZXJvIGRlIGludGVyY2FtYmlvLCB1c2Egc/NsbyBsYSBtZW1vcmlhIgorCisjOiBtYWluLmM6MjUwMAorbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdERhciB1bmEgbGlzdGEgZGUgbG9zIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8geSBzYWxpciIKKworIzogbWFpbi5jOjI1MDEKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKGNvbiBub21icmUgZGVsIGZpY2hlcm8pXHRSZWN1cGVyYXIgc2VzafNuIGZhbGxpZGEiCisKKyM6IG1haW4uYzoyNTAyCittc2dpZCAiLUxcdFx0XHRTYW1lIGFzIC1yIgorbXNnc3RyICItTFx0XHRcdElndWFsIHF1ZSAtciIKKworIzogbWFpbi5jOjI1MDQKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0Tm8gdXNhciCrbmV3Y2xpuyBwYXJhIGFicmlyIGxhIHZlbnRhbmEiCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGlzcG9zaXRpdm8+XHRcdFVzZSA8ZGlzcG9zaXRpdm8+IHBhcmEgRS9TIgorCisjOiBtYWluLmM6MjUwOAorbXNnaWQgIi1BXHRcdFx0c3RhcnQgaW4gQXJhYmljIG1vZGUiCittc2dzdHIgIi1BXHRcdFx0SW5pY2lhciBlbiBtb2RvIOFyYWJlIgorCisjOiBtYWluLmM6MjUxMQorbXNnaWQgIi1IXHRcdFx0U3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0SW5pY2lhciBlbiBtb2RvIGhlYnJlbyIKKworIzogbWFpbi5jOjI1MTQKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0SW5pY2lhciBlbiBtb2RvIHBlcnNhIChmYXJzaSkiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0RGV0ZXJtaW5hIGVsIHRpcG8gZGUgdGVybWluYWwgYSA8PHRlcm1pbmFsPj4iCisKKyM6IG1haW4uYzoyNTE3Cittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx0VXNhIDx2aW1yYz4gZW4gbHVnYXIgZGUgY3VhbHF1aWVyIC52aW1yYyIKKworIzogbWFpbi5jOjI1MTkKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx0VXNhIDxndmltcmM+IGVuIGx1Z2FyIGRlIGN1YWxxdWllciAuZ3ZpbXJjIgorCisjOiBtYWluLmM6MjUyMQorbXNnaWQgIi0tbm9wbHVnaW5cdFx0RG9uJ3QgbG9hZCBwbHVnaW4gc2NyaXB0cyIKK21zZ3N0ciAiLS1ub3BsdWdpblx0XHRObyBjYXJnYSBsb3Mgq3BsdWdpbiBzY3JpcHRzuyIKKworIzogbWFpbi5jOjI1MjIKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHRBYnJlIE4gdmVudGFuYXMgKHZhbG9yIHByZWRldGVybWluYWRvOiB1bmEgcG9yIGZpY2hlcm8pIgorCisjOiBtYWluLmM6MjUyMworbXNnaWQgIi1PW05dXHRcdExpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdENvbW8gqy1vuyBwZXJvIGRpdmlkZSBsYXMgdmVudGFuYXMgdmVydGljYWxtZW50ZS4iCisKKyM6IG1haW4uYzoyNTI0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0Q29taWVuemEgYWwgZmluYWwgZGVsIGZpY2hlcm8iCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHRDb21pZW56YSBlbiBsYSBs7W5lYSA8bG51bT4iCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPGNvbWFuZG8+XHRFamVjdXRhIDxjb21hbmRvPiBhbnRlcyBkZSBjYXJnYXIgYWxn+m4gZmljaGVybyB2aW1yYyIKKworIzogbWFpbi5jOjI1MjkKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPGNvbWFuZG8+XHRcdEVqZWN1dGEgPGNvbWFuZG8+IGRlc3B16XMgZGUgY2FyZ2FyIGVsIHByaW1lciBmaWNoZXJvIgorCisjOiBtYWluLmM6MjUzMAorbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiIgorIi1TIDxzZXNp824+XHRcdEVqZWN1dGEgbG9zIGNvbWFuZG9zIGRlbCBmaWNoZXJvIDxzZXNp824+IGRlc3B16XNcbiIKKyIgICAgICAgICAgIFx0XHRkZSBjYXJnYXIgZWwgcHJpbWVyIGZpY2hlcm8iCisKKyM6IG1haW4uYzoyNTMxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdGluPlx0TGVlIGxvcyBjb21hbmRvcyBlbiBtb2RvIE5vcm1hbCBkZWwgZmljaGVybyA8c2NyaXB0aW4+IgorCisjOiBtYWluLmM6MjUzMgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIiIKKyItdyA8c2NyaXB0b3V0Plx0QfFhZGUgdG9kb3MgbG9zIGNvbWFuZG9zIGVzY3JpdG9zIGFsIGZpY2hlcm8gPHNjcmlwdG91dD4iCisKKyM6IG1haW4uYzoyNTMzCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICIiCisiLVcgPHNjcmlwdG91dD5cdEdyYWJhIHRvZG9zIGxvcyBjb21hbmRvcyBlc2NyaXRvcyBhbCBmaWNoZXJvIDxzY3JpcHRvdXQ+IgorCisjOiBtYWluLmM6MjUzNQorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0RWRpdGEgZmljaGVyb3MgY2lmcmFkb3MiCisKKyM6IG1haW4uYzoyNTM5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDxwYW50YWxsYT5cdENvbmVjdGEgdmltIGEgZXN0ZSBzZXJ2aWRvciBYMTEgZW4gcGFydGljdWxhciIKKworIzogbWFpbi5jOjI1NDEKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdE5vIHNlIGNvbmVjdGEgYWwgc2Vydmlkb3IgWDExIgorCisjOiBtYWluLmM6MjU0NAorbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgaWYgcG9zc2libGUiCittc2dzdHIgIiIKKyItLXJlbW90ZSA8ZmljaGVyb3M+XHRFZGl0YSBsb3MgPGZpY2hlcm9zPiBlbiB1biBzZXJ2aWRvciBWaW0gc2kgZXMgcG9zaWJsZS4iCisKKyM6IG1haW4uYzoyNTQ1Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXNpbGVudCA8ZmljaGVyb3M+ICBMbyBtaXNtbyBwZXJvIG5vIHNlIHF1ZWphIHNpIG5vIGV4aXN0ZSB1biAiCisic2Vydmlkb3IgZGlzcG9uaWJsZS4iCisKKyM6IG1haW4uYzoyNTQ2Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxmaWNoZXJvcz5cdENvbW8gLS1yZW1vdGUgcGVybyBlc3BlcmEgYSBxdWUgbG9zIGZpY2hlcm9zICIKKyJ0ZXJtaW5lbiBkZSBlZGl0YXJzZSIKKworIzogbWFpbi5jOjI1NDcKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpY2hlcm9zPiAgTG8gbWlzbW8gcGVybyBubyBzZSBxdWVqYSBzaSBubyBoYXkgdW4gIgorInNlcnZpZG9yIGRpc3BvbmlibGUuIgorCisjOiBtYWluLmM6MjU0OAorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPHRlY2xhcz5cdEVudu1hIDx0ZWNsYXM+IGEgdW4gc2Vydmlkb3IgVmltIHkgc2FsZSIKKworIzogbWFpbi5jOjI1NDkKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICIiCisiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWz6YSA8ZXhwcj4gZW4gc2Vydmlkb3IgVmltIGUgaW1wcmltZSBlbCByZXN1bHRhZG8iCisKKyM6IG1haW4uYzoyNTUwCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIiIKKyItLXNlcnZlcmxpc3RcdFx0RW1pdGUgdW5hIGxpc3RhIGRlIGxvcyBzZXJ2aWRvcmVzIFZpbSBkaXNwb25pYmxlcyB5IHNhbGUiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICIiCisiLS1zZXJ2ZXJuYW1lIDxub21icmU+XHRFbnbtYSBhL3NlIGNvbnZpZXJ0ZSBlbiBlbCBzZXJ2aWRvciBWaW0gZGUgbm9tYnJlICIKKyI8bm9tYnJlPiIKKworIzogbWFpbi5jOjI1NTQKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0VXNhIDx2aW1pbmZvPiBlbiBsdWdhciBkZSAudmltaW5mbyIKKworIzogbWFpbi5jOjI1NTYKK21zZ2lkICItaCAgb3IgIC0taGVscFx0UHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWggIG9yICAtLWhlbHBcdEltcHJpbWUgbGEgYXl1ZGEgZGUgY29tYW5kb3MgKGVzdGUgbWVuc2FqZSkgeSB0ZXJtaW5hLiIKKworIzogbWFpbi5jOjI1NTcKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdEltcHJpbWUgbGEgaW5mb3JtYWNp824gZGUgdmVyc2nzbiB5IHRlcm1pbmEuIgorCisjOiBtYWluLmM6MjU2MQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50b3MgcmVjb25vY2lkb3MgcG9yIGd2aW0gKHZlcnNp824gTW90aWYpOlxuIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChuZVh0YXcgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudG9zIHJlY29ub2NpZG9zIHBvciBndmltICh2ZXJzafNuIG5lWHRhdyk6XG4iCisKKyM6IG1haW4uYzoyNTY3Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50b3MgcmVjb25vY2lkb3MgcG9yIGd2aW0gKHZlcnNp824gQXRoZW5hKTpcbiIKKworIzogbWFpbi5jOjI1NzEKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8cGFudGFsbGE+XHRFamVjdXRhIHZpbSBlbiA8cGFudGFsbGE+IgorCisjOiBtYWluLmM6MjU3MgorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHRBcnJhbmNhIHZpbSCraWNvbml6YWRvuyIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bm9tYnJlPlx0XHRVc2EgdW4gcmVjdXJzbyBjb21vIHNpIHZpbSBmdWVzZSA8bm9tYnJlPiIKKworIzogbWFpbi5jOjI1NzUKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgIChTaW4gaW1wbGVtZW50YXIpXG4iCisKKyM6IG1haW4uYzoyNTc3Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2EgPGNvbG9yPiBwYXJhIGVsIGZvbmRvICh0YW1iaeluOiAtYmcpIgorCisjOiBtYWluLmM6MjU3OAorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNhIDxjb2xvcj4gcGFyYSBlbCB0ZXh0byBub3JtYWwgKHRhbWJp6W46IC1mZykiCisKKyM6IG1haW4uYzoyNTc5IG1haW4uYzoyNTk5Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICIiCisiLWZvbnQgPHRpcG8+XHRcdFVzYSA8ZnVlbnRlIGRlIGltcHJlc2nzbj4gcGFyYSBlbCB0ZXh0byBub3JtYWwgKHRhbWJp6W46IC1mbikiCisKKyM6IG1haW4uYzoyNTgwCittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPHRpcG8+XHRVc2EgPGZ1ZW50ZSBkZSBpbXByZXNp824+IHBhcmEgdGV4dG8gZW4gbmVncml0YSIKKworIzogbWFpbi5jOjI1ODEKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8dGlwbz5cdFVzYSA8ZnVlbnRlIGRlIGltcHJlc2nzbj4gcGFyYSB0ZXh0byBlbiBjdXJzaXZhIgorCisjOiBtYWluLmM6MjU4MiBtYWluLmM6MjYwMAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiIgorIi1nZW9tZXRyeSA8Z2VvbT5cdFVzYSA8Z2VvbT4gcGFyYSBsYSBnZW9tZXRy7WEgaW5pY2lhbCAodGFtYmnpbjogLWdlb20pIgorCisjOiBtYWluLmM6MjU4MworbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDxhbmNobz5cdFVzYSB1biBhbmNobyBkZSBib3JkZSBkZSA8YW5jaG8+ICh0YW1iaeluOiAtYncpIgorCisjOiBtYWluLmM6MjU4NAorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiIgorIi1zY3JvbGxiYXJ3aWR0aCA8YW5jaG8+ICBVc2EgdW5hIGJhcnJhIGRlIGRlc3BsYXphbWllbnRvIGRlIGFuY2hvIDxhbmNobz4gIgorIih0YW1iaeluOiAtc3cpIgorCisjOiBtYWluLmM6MjU4NgorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIiIKKyItbWVudWhlaWdodCA8YWx0Plx0VXNhIHVuYSBiYXJyYSBkZSBtZW76IGRlIGFsdHVyYSA8YWx0PiAodGFtYmnpbjogLW1oKSIKKworIzogbWFpbi5jOjI1ODggbWFpbi5jOjI2MDEKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0VXNhciB27WRlbyBpbnZlcnNvICh0YW1iaeluOiAtcnYpIgorCisjOiBtYWluLmM6MjU4OQorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHRObyB1c2FyIHbtZGVvIGludmVyc28gKHRhbWJp6W46ICtydikiCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVjdXJzbz5cdEVzdGFibGVjZSBlbCByZWN1cnNvIGVzcGVjaWZpY2FkbyIKKworIzogbWFpbi5jOjI1OTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50b3MgcmVjb25vY2lkb3MgcG9yIGd2aW0gKHZlcnNp824gcGFyYSBSSVNDIE9TKTpcbiIKKworIzogbWFpbi5jOjI1OTQKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bvptZXJvPlx0QW5jaHVyYSBpbmljaWFsIGRlIGxhIHZlbnRhbmEsIGVuIGNvbHVtbmFzIgorCisjOiBtYWluLmM6MjU5NQorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8bvptZXJvPlx0QWx0dXJhIGluaWNpYWwgZGUgbGEgdmVudGFuYSwgZW4gZmlsYXMiCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudG9zIHJlY29ub2NpZG9zIHBvciBndmltICh2ZXJzafNuIEdUSyspOlxuIgorCisjOiBtYWluLmM6MjYwMgorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxwYW50YWxsYT5cdEVqZWN1dGEgdmltIGVuIDxwYW50YWxsYT4gKHRhbWJp6W46IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNjA0Cittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICIiCisiLS1yb2xlIDxyb2xlPlx0RGVmaW5lIHVuIHJvbCD6bmljbyBwYXJhIGlkZW50aWZpY2FyIGxhIHZlbnRhbmEgcHJpbmNpcGFsLiIKKworIzogbWFpbi5jOjI2MDYKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHRBYnJlIGEgVmltIGRlbnRybyBkZSBvdHJvIKt3aWRnZXS7IEdUSy4iCisKKyM6IG1haW4uYzoyNjA5Cittc2dpZCAiLVAgPHBhcmVudCB0aXRsZT5cdE9wZW4gVmltIGluc2lkZSBwYXJlbnQgYXBwbGljYXRpb24iCittc2dzdHIgIi1QIDx07XR1bG8gdmVudGFuYSBwYWRyZT5cdEFicmlyIGEgVmltIGRlbnRybyBkZSBsYSBhcGxpY2FjafNuIHBhZHJlLiIKKworIzogbWFpbi5jOjI4NDcKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICJObyBoYXkgdW5hIHZlbnRhbmEiCisKKyMgIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyMuIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyM6IG1haW4uYzoyODYyCittc2dpZCAiOiBTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiOiBGYWxs8yBlbCBlbnZpby5cbiIKKworIyAgTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjg2OAorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiIgorIjogRmFsbPMgZWwgaW5pY2lvIGRlIHNlc2nzbiByZW1vdGEgKKtzZW5kuykuIEludGVudGFkbyB1bmEgZWplY3VjafNuIGxvY2FsLlxuIgorCisjOiBtYWluLmM6MjkwNiBtYWluLmM6MjkyNworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIiVkIGRlICVkIGVkaXRhZG9zIgorCisjOiBtYWluLmM6Mjk0OQorbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIk5vIGhheSB1bmEgdmVudGFuYSBlbiBlbCBkZXN0aW5vOiBFbCBlbnZpbyBkZSBsYSBleHByZXNp824gZmFsbPMuXG4iCisKKyM6IG1haW4uYzoyOTYxCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IEZhbGzzIGVsIGVudmlvIGRlIGxhIGV4cHJlc2nzbi5cbiIKKworIzogbWFyay5jOjcwOQorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiTm8gaGF5IG5pbmd1bmEgbWFyY2EgZmlqYWRhIgorCisjOiBtYXJrLmM6NzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4MzogTm8gaGF5IG1hcmNhcyBxdWUgY29pbmNpZGFuIGNvbiCrJXO7IgorCisjICBIaWdobGlnaHQgdGl0bGUKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcyMgorbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJtYXJjYSBs7W5lYSAgY29sIGZpY2hlcm8vdGV4dG8iCisKKyMgIEhpZ2hsaWdodCB0aXRsZQorIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzYwCittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgc2FsdG8gbO1uZWEgIGNvbCBmaWNoZXJvL3RleHRvIgorCisjICBIaWdobGlnaHQgdGl0bGUKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJjaGFuZ2UgbGluZSAgY29sIHRleHQiCittc2dzdHIgIiIKKyJcbiIKKyJtYXJjYSBs7W5lYSAgY29sIGZpY2hlcm8vdGV4dG8iCisKKyM6IG1hcmsuYzoxMjgxCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTWFyY2FzIGVuIGVsIGZpY2hlcm86XG4iCisKKyMgIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjEzMTYKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTGlzdGEgZGUgc2FsdG9zIChlbCBt4XMgcmVjaWVudGUgdmEgcHJpbWVybyk6XG4iCisKKyM6IG1hcmsuYzoxNDEyCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBIaXN0b3JpYSBkZSBsYXMgbWFyY2FzIGVuIGxvcyBmaWNoZXJvcyAoZGUgbGEgbeFzIHJlY2llbnRlIGEgbGEgbeFzICIKKyJhbnRpZ3VhKTpcbiIKKworIzogbWFyay5jOjE1MDEKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiRmFsdGEgqz67IgorCisjOiBtYnl0ZS5jOjQ2NworbXNnaWQgIkU1NDM6IE5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJFNTQzOiBObyBlcyB1bmEgcOFnaW5hIGRlIGPzZGlnbyB24WxpZGEuIgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogTm8gc2UgcHVlZGVuIGZpamFyIGxvcyB2YWxvcmVzIElDIgorCisjOiBtYnl0ZS5jOjQ1ODMKK21zZ2lkICJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiCittc2dzdHIgIkUyODU6IEZhbGzzIGxhIGNyZWFjafNuIGRlbCBjb250ZXh0byBkZSBlbnRyYWRhIgorCisjOiBtYnl0ZS5jOjQ3NDEKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IEZhbGzzIGxhIGFwZXJ0dXJhIGRlbCBt6XRvZG8gZGUgZW50cmFkYSIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBBZHZlcnRlbmNpYTogTm8gcHVkZSBjcmVhciB1biBjYWxsYmFjbCBkZSBkZXN0cnVjY2nzbiBhbCBJTS4iCisKKyM6IG1ieXRlLmM6NDc1OAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBlbCBt6XRvZG8gZGUgZW50cmFkYSBubyBhZG1pdGUgbmluZ/puIGVzdGlsbyIKKworIzogbWJ5dGUuYzo0ODE1Cittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6IEVsIG3pdG9kbyBkZSBlbnRyYWRhIG5vIHNvcG9ydGEgbWkgdGlwbyBkZSBwcmVlZGljafNuLiIKKworIzogbWJ5dGUuYzo0ODg5Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBFbCBlc3RpbG8gq3NvYnJlIGVsIHB1bnRvuyByZXF1aWVyZSBkZWwgdXNvIGRlIHVuIKtmb250c2V0uy4iCisKKyM6IG1ieXRlLmM6NDkyNQorbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogU3UgR1RLKyBlcyBhbnRlcmlvciBhIDEuMi4zLiDBcmVhIGRlIGVzdGFkbyBkZXNhY3RpdmFkYSIKKworIzogbWJ5dGUuYzo1MjMyCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogRWwgc2Vydmlkb3IgZGUgbel0b2RvIGRlIGVudHJhZGEgKElNRSkgbm8gZXN04SBmdW5jaW9uYW5kbyIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBFbCBibG9xdWUgbm8gZXN0YWJhIGFzZWd1cmFkbyIKKworIzogbWVtZmlsZS5jOjEwMDUKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiBFcnJvciBkZSBi+nNxdWVkYSBhbCBsZWVyIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8iCisKKyM6IG1lbWZpbGUuYzoxMDEwCittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IEVycm9yIGRlIGxlY3R1cmEgZW4gZWwgZmljaGVybyBkZSBpbnRlcmNhbWJpbyIKKworIzogbWVtZmlsZS5jOjEwNjIKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5NjogRXJyb3IgZGUgYvpzcXVlZGEgYWwgZXNjcmliaXIgZW4gZWwgZmljaGVybyBkZSBpbnRlcmNhbWJpbyIKKworIzogbWVtZmlsZS5jOjEwODAKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IEVycm9yIGRlIGVzY3JpdHVyYSBlbiBlbCBmaWNoZXJvIGRlIGludGVyY2FtYmlvIgorCisjOiBtZW1maWxlLmM6MTI3NworbXNnaWQgIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIKK21zZ3N0ciAiRTMwMDogWWEgZXhpc3RlIHVuIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8gKL9hdGFxdWUgZGUgc3ltbGluaz8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogv05vIHNlIG9idHV2byBlbCBibG9xdWUgbrogMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiC/Tm8gc2Ugb2J0dXZvIGVsIGJsb3F1ZSBuuiAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IL9ObyBzZSBvYnR1dm8gZWwgYmxvcXVlIG66IDI/IgorCisjICBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiChoaFFZWVoLCBzZSBoYSBwZXJkaWRvIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8hISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogTm8gc2UgcHVkbyBjYW1iaWFyIGVsIG5vbWJyZSBkZWwgZmljaGVybyBkZSBpbnRlcmNhbWJpbyIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiIgorIkUzMDM6IEluY2FwYXogZGUgYWJyaXIgZWwgZmljaGVybyBkZSBpbnRlcmNhbWJpbyBwYXJhIKslc7ssIHJlY3VwZXJhY2nzbiAiCisiaW1wb3NpYmxlIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogq21sX3RpbWVzdGFtcLs6IL9ObyBzZSBvYnR1dm8gZWwgYmxvcXVlIDA/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IE5vIHNlIGVuY29udHLzIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8gcGFyYSAlcyIKKworIzogbWVtbGluZS5jOjc2NworbXNnaWQgIkVudGVyIG51bWJlciBvZiBzd2FwIGZpbGUgdG8gdXNlICgwIHRvIHF1aXQpOiAiCittc2dzdHIgIiIKKyJJbnRyb2R1emNhIGVsIG76bWVybyBkZWwgZmljaGVybyBkZSBpbnRlcmNhbWJpbyBhIHVzYXIgKDAgcGFyYSBzYWxpcik6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogTm8gcHVlZG8gYWJyaXIgJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICJJbmNhcGF6IGRlIGxlZXIgZWwgYmxvcXVlIDAgZGUgIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIlRhbCB2ZXogbm8gc2UgaGFuIGhlY2hvIGNhbWJpb3MgbyBWaW0gbm8gYWN0dWFsaXrzIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8iCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiBubyBwdWVkZSB1c2Fyc2UgY29uIGVzdGEgdmVyc2nzbiBkZSBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJVc2UgbGEgdmVyc2nzbiAzLjAgZGUgVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIG5vIHBhcmVjZSB1biBmaWNoZXJvIGRlIGludGVyY2FtYmlvIGRlIFZpbSIKKworIzogbWVtbGluZS5jOjg2OAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIgorbXNnc3RyICJubyBwdWVkZSB1c2Fyc2UgZW4gZXN0ZSBvcmRlbmFkb3IuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIkVsIGZpY2hlcm8gZnVlIGNyZWFkbyBlbCAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIm8gZWwgZmljaGVybyBoYSBzaWRvIGRh8WFkby4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiVXNhbmRvIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8gqyVzuyIKKworIzogbWVtbGluZS5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRmljaGVybyBvcmlnaW5hbCCrJXO7IgorCisjOiBtZW1saW5lLmM6OTIyCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IEFkdmVydGVuY2lhOiBlbCBmaWNoZXJvIG9yaWdpbmFsIHB1ZWRlIGhhYmVyIHNpZG8gY2FtYmlhZG8iCisKKyM6IG1lbWxpbmUuYzo5NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiBJbmNhcGF6IGRlIGxlZXIgZWwgYmxvcXVlIDEgZGUgJXMiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P0ZBTFRBTiBNVUNIQVMgTM1ORUFTIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/UkVDVUVOVE8gREUgTM1ORUFTIEVRVUlWT0NBRE8iCisKKyM6IG1lbWxpbmUuYzoxMDAyCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P0JMT1FVRSBWQUPNTyIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9GQUxUQU4gTM1ORUFTIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogSUQgZGVsIGJsb3F1ZSAxIGVxdWl2b2NhZG8gKL9ubyBlcyAlcyB1biBmaWNoZXJvIC5zd3A/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9GQUxUQSBVTiBCTE9RVUUiCisKKyM6IG1lbWxpbmUuYzoxMDgxCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IGRlc2RlIGFxde0gaGFzdCA/Pz9GSU4gbGFzIGztbmVhcyBwdWVkZW4gZXN0YXIgZGVzb3JkZW5hZGFzIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiIgorIj8/PyBkZXNkZSBhcXXtIGhhc3RhID8/P0ZJTiBsYXMgbO1uZWFzIHB1ZWRlbiBoYWJlciBzaWRvIGluc2VydGFkYXMvYm9ycmFkYXMiCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9GSU4iCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IFJlY3VwZXJhY2nzbiBpbnRlcnJ1bXBpZGEiCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IFNlIGhhbiBkZXRlY3RhZG8gZXJyb3JlcyBhbCByZWN1cGVyYXI7IGJ1c3F1ZSBs7W5lYXMgcXVlIGVtcGllY2VuICIKKyJjb24gPz8/IgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgIlNlZSBcIjpoZWxwIEUzMTJcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIlZlYSCrOmhlbHAgRTMxMrsgcGFyYSBt4XMgaW5mb3JtYWNp824uIgorCisjOiBtZW1saW5lLmM6MTE1NQorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAiUmVjdXBlcmFjafNuIGNvbXBsZXRhZGEuIFVkLiBkZWJlcu1hIGNvbXByb2JhciBxdWUgdG9kbyBlc3ThIGJpZW4uIgorCisjOiBtZW1saW5lLmM6MTE1NgorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihQb2Ry7WEgcXVlcmVyIGd1YXJkYXIgZXN0ZSBmaWNoZXJvIGNvbiBvdHJvIG5vbWJyZVxuIgorCisjOiBtZW1saW5lLmM6MTE1NworbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICIiCisieSBlamVjdXRhciCrZGlmZrsgY29uIGVsIGZpY2hlcm8gb3JpZ2luYWwgcGFyYSBjb21wcm9iYXIgbG9zIGNhbWJpb3MpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU4Cittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyJTdXByaW1pciBlbCBmaWNoZXJvIC5zd3AsIGRlc3B16XMgZGUgdGVybWluYXIuXG4iCisiXG4iCisKKyMgIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMTQKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAiU2UgaGFuIGVuY29udHJhZG8gZmljaGVyb3MgZGUgaW50ZXJjYW1iaW86IgorCisjOiBtZW1saW5lLmM6MTM5MgorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICBFbiBlbCBkaXJlY3RvcmlvIGFjdHVhbDpcbiIKKworIzogbWVtbGluZS5jOjEzOTQKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgVXNhbmRvIGVsIG5vbWJyZSBlc3BlY2lmaWNhZG86XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk4Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgRW4gZWwgZGlyZWN0b3JpbyAiCisKKyM6IG1lbWxpbmUuYzoxNDE2Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSBuaW5ndW5vIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDg4Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICBwcm9waWVkYWQgZGU6ICIKKworIzogbWVtbGluZS5jOjE0OTAKK21zZ2lkICIgICBkYXRlZDogIgorbXNnc3RyICIgICBkZSBmZWNoYTogIgorCisjOiBtZW1saW5lLmM6MTQ5NCBtZW1saW5lLmM6MzY4NAorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgICAgZGUgZmVjaGE6ICIKKworIzogbWVtbGluZS5jOjE1MTAKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICBbZGVzZGUgbGEgdmVyc2nzbiAzLjAgZGUgVmltXSIKKworIzogbWVtbGluZS5jOjE1MTQKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgIFtubyBwYXJlY2UgdW4gZmljaGVybyBkZSBpbnRlcmNhbWJpbyBkZSBWaW1dIgorCisjOiBtZW1saW5lLmM6MTUxOAorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICBub21icmUgZGVsIGZpY2hlcm86ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBtb2RpZmljYWRvOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAiWUVTIgorbXNnc3RyICJTSSIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJubyIKK21zZ3N0ciAibm8iCisKKyM6IG1lbWxpbmUuYzoxNTI5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiIG5vbWJyZSBkZWwgdXN1YXJpbzogIgorCisjOiBtZW1saW5lLmM6MTUzNgorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgIG5vbWJyZSBkZWwgq2hvc3S7OiAiCisKKyM6IG1lbWxpbmUuYzoxNTM4Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgIG5vbWJyZSBkZWwgq2hvc3S7OiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgSUQgZGVsIHByb2Nlc286ICIKKworIzogbWVtbGluZS5jOjE1NTAKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKGH6biBlbiBlamVjdWNp824pIgorCisjOiBtZW1saW5lLmM6MTU2MgorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW25vIHNlIHBldWRlIHVzYXIgY29uIGVzdGEgdmVyc2nzbiBkZSBWaW1dIgorCisjOiBtZW1saW5lLmM6MTU2NQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtubyBzZSBwdWVkZSB1c2FyIGVuIGVzdGUgb3JkZW5hZG9yXSIKKworIzogbWVtbGluZS5jOjE1NzAKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICBbbm8gc2UgcHVlZGUgbGVlcl0iCisKKyM6IG1lbWxpbmUuYzoxNTc0Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbbm8gc2UgcHVlZGUgYWJyaXJdIgorCisjOiBtZW1saW5lLmM6MTc2NAorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBObyBwdWVkbyBwcmVzZXJ2YXJsbywgbm8gZXhpc3RlIHVuIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8iCisKKyM6IG1lbWxpbmUuYzoxODE3Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgImZpY2hlcm8gcHJlc2VydmFkbyIKKworIzogbWVtbGluZS5jOjE4MTkKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6IEZhbGzzIGxhIHByZXNlcnZhY2nzbiBkZWwgZmljaGVybyIKKworIzogbWVtbGluZS5jOjE4OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogq21sX2dldLs6IG76bWVybyBkZSBs7W5lYSBubyB24WxpZG86ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogq21sX2dldLs6IG5vIHB1ZWRvIGVuY29udHJhciBsYSBs7W5lYSAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzA2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBFbCBpZCBkZWwgYmxvcXVlIGRlIHB1bnRlcm9zIGVzdOEgZXF1aXZvY2Fkby4gMyIKKworIzogbWVtbGluZS5jOjIzODYKK21zZ2lkICJzdGFja19pZHggc2hvdWxkIGJlIDAiCittc2dzdHIgIqtzdGFja19pZHi7IGRlYmVy7WEgc2VyIDAiCisKKyM6IG1lbWxpbmUuYzoyNDQ4Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiC/RGVtYXNpYWRvcyBibG9xdWVzIGFjdHVhbGl6YWRvcz8iCisKKyM6IG1lbWxpbmUuYzoyNjMwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiBFbCBpZCBkZWwgYmxvcXVlIGRlIHB1bnRlcm9zIGVzdOEgZXF1aXZvY2Fkby4gNCIKKworIzogbWVtbGluZS5jOjI2NTcKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICK/YmxvcXVlIDEgc3VwcmltaWRvPyIKKworIzogbWVtbGluZS5jOjI4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IE5vIHB1ZWRvIGVuY29udHJhciBsYSBs7W5lYSAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTAwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogRWwgaWQgZGVsIGJsb3F1ZSBkZSBwdW50ZXJvcyBlc3ThIGVxdWl2b2NhZG8uIgorCisjOiBtZW1saW5lLmM6MzExNgorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAiq3BlX2xpbmVfY291bnS7IGVzIGNlcm8iCisKKyM6IG1lbWxpbmUuYzozMTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogbvptZXJvIGRlIGztbmVhIGZ1ZXJhIGRlIHJhbmdvOiAlbGQgbeFzIGFsbOEgZGVsIGZpbmFsIgorCisjOiBtZW1saW5lLmM6MzE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzogcmVjdWVudG8gZGUgbO1uZWFzIGVycvNuZW8gZW4gZWwgYmxvcXVlICVsZCIKKworIzogbWVtbGluZS5jOjMxOTgKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAiRWwgdGFtYfFvIGRlIGxhIHBpbGEgYXVtZW50YSIKKworIzogbWVtbGluZS5jOjMyNDQKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTA6IEVsIGlkIGRlbCBibG9xdWUgZGUgcHVudGVyb3MgZXN04SBlcXVpdm9jYWRvLiAyIgorCisjOiBtZW1saW5lLmM6MzY3NAorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTogQVRFTkNJ004iCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisiU2UgaGEgZW5jb250cmFkbyB1biBmaWNoZXJvIGRlIGludGVyY2FtYmlvIGNvbiBlbCBub21icmUgqyIKKworIzogbWVtbGluZS5jOjM2NzkKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgImFsIGFicmlyIGVsIGZpY2hlcm8gqyIKKworIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICBNwVMgTlVFVk8gcXVlIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8hXG4iCisKKyMgIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMgICogb3RoZXIgbGFuZ3VhZ2VzLgorIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY5MgorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSBPdHJvIHByb2dyYW1hIHB1ZWRlIGVzdGFyIGVkaXRhbmRvIGVsIG1pc21vIGZpY2hlcm8uXG4iCisiICAgIERlIHNlciBhc+0sIHRlbmdhIGN1aWRhZG8gZGUgbm8gYWNhYmFyIGNvbiBkb3NcbiIKKyIgICAgZWplbXBsYXJlcyBkaWZlcmVudGVzIGRlbCBtaXNtbyBmaWNoZXJvIGFsIGhhY2VyIGNhbWJpb3MuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIFNhbGdhIGRlbCBwcm9ncmFtYSBvIGNvbnRpbnVlIGNvbiBwcmVjYXVjafNuLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSBGYWxs8yB1bmEgc2VzafNuIGRlIGVkaWNp824gZGUgZXN0ZSBmaWNoZXJvLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NQorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiICAgIFNpIGVzIGFz7SwgdXNlIKs6cmVjb3ZlcrsgbyCrdmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTcKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyK7XG4iCisiICAgIHBhcmEgcmVjdXBlcmFyIGxvcyBjYW1iaW9zICh26WEgqzpoZWxwIHJlY292ZXJ5uykuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIFNpIFVkLiB5YSBoYSBoZWNobyBlc3RvLCBib3JyZSBlbCBmaWNoZXJvIGRlIGludGVyY2FtYmlvIKsiCisKKyM6IG1lbWxpbmUuYzozNzAwCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIrtcbiIKKyIgICAgcGFyYSBldml0YXIgZXN0ZSBtZW5zYWplLlxuIgorCisjOiBtZW1saW5lLmM6MzcxNCBtZW1saW5lLmM6MzcxOAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAioUVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8gqyIKKworIzogbWVtbGluZS5jOjM3MTUgbWVtbGluZS5jOjM3MjEKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIrsgeWEgZXhpc3RlISIKKworIzogbWVtbGluZS5jOjM3MjQKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIEFURU5DSdNOIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIqFZYSBleGlzdGUgdW4gZmljaGVybyBkZSBpbnRlcmNhbWJpbyEiCisKKyM6IG1lbWxpbmUuYzozNzMwCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnQiCittc2dzdHIgIiIKKyImQWJyaXIgcGFyYSBsZWN0dXJhIPpuaWNhbWVudGVcbiIKKyImRWRpdGFyIGRlIHRvZGFzIGZvcm1hc1xuIgorIiZSZWN1cGVyYXJcbiIKKyImU2FsaXJcbiIKKyImQWJvcnRhciIKKworIzogbWVtbGluZS5jOjM3MzIKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImQWJyaXIgcGFyYSBsZWN0dXJhIPpuaWNhbWVudGVcbiIKKyImRWRpdGFyIGRlIHRvZGFzIGZvcm1hc1xuIgorIiZSZWN1cGVyYXJcbiIKKyImU2FsaXJcbiIKKyImQWJvcnRhclxuIgorIiZCb3JyYXJsbyIKKworIzogbWVtbGluZS5jOjM3ODkKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiBTZSBoYW4gZW5jb250cmFkbyBkZW1hc2lhZG9zIGZpY2hlcm9zIGRlIGludGVyY2FtYmlvIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogUGFydGUgZGUgbGEgcnV0YSBkZWwgaXRlbSBkZWwgbWVu+iBubyBlcyB1biBzdWItbWVu+iIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IEVsIG1lbvogc/NsbyBleGlzdGUgZW4gb3RybyBtb2RvIGRlIG9wZXJhY2nzbiIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IE5vIGV4aXN0ZSB1biBtZW76IGNvbiBlc2Ugbm9tYnJlIgorCisjOiBtZW51LmM6NTI1Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogTGEgcnV0YSBkZWwgbWVu+iBubyBkZWJlIGNvbmR1Y2lyIGEgdW4gc3ViLW1lbvoiCisKKyM6IG1lbnUuYzo1NjQKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiIgorIkUzMzE6IE5vIHNlIGRlYmVuIGHxYWRpciBpdGVtcyBkZWwgbWVu+iBkaXJlY3RhbWVudGUgYSBsYSBiYXJyYSBkZWwgbWVu+iIKKworIzogbWVudS5jOjU3MAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogRWwgc2VwYXJhZG9yIG5vIHB1ZWRlIHNlciBwYXJ0ZSBkZSB1bmEgcnV0YSBkZSBtZW76IgorCisjICBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjICBIaWdobGlnaHQgdGl0bGUKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwOTcKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBNZW76cyAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJEZXNwcmVuZGVyIHkgZmxvdGFyIGVzdGUgbWVu+iIKKworIzogbWVudS5jOjIwODQKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBMYSBydXRhIGRlbCBtZW51IGRlYmUgY29uZHVjaXIgYSB1biBpdGVtIGRlbCBtZW76IgorCisjOiBtZW51LmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IE5vIHNlIGhhIGVuY29udHJhZG8gZWwgbWVu+jogJXMiCisKKyM6IG1lbnUuYzoyMTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IEVsIG1lbvogbm8gZXN04SBkZWZpbmlkbyBwYXJhIGVsIG1vZG8gJXMiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBMYSBydXRhIGRlbCBtZW76IGRlYmUgY29uZHVjaXIgYSB1biBzdWItbWVu+iIKKworIzogbWVudS5jOjIyMzIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6IE5vIHNlIGhhIGVuY29udHJhZG8gZWwgbWVu+iAtIHZlcmlmaXF1ZSBsb3Mgbm9tYnJlcyBkZSBsb3MgbWVu+nMiCisKKyM6IG1lc3NhZ2UuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIlNlIGhhIGRldGVjdGFkbyB1biBlcnJvciBhbCBwcm9jZXNhciAlczoiCisKKyM6IG1lc3NhZ2UuYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAibO1uZWEgJTRsZCIKKworIzogbWVzc2FnZS5jOjY0NworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJbY2FkZW5hIGRlbWFzaWFkbyBsYXJnYV0iCisKKyM6IG1lc3NhZ2UuYzo3OTcKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiIgorIk1hbnRlbmVkb3IgZGUgbG9zIG1lbnNhamVzOiBBbGVqYW5kcm8gTPNwZXotVmFsZW5jaWEgPGRyYWR1bEB5YWhvby5jb20+IgorCisjOiBtZXNzYWdlLmM6MTAyNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJJbnRlcnJ1cGNp8246ICIKKworIzogbWVzc2FnZS5jOjEwMjgKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIlB1bHNlIElOVFJPIHBhcmEgY29udGludWFyIgorCisjOiBtZXNzYWdlLmM6MTAzMAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlB1bHNlIElOVFJPIG8gZXNjcmliYSB1biBjb21hbmRvIHBhcmEgY29udGludWFyIgorCisjOiBtZXNzYWdlLmM6MjM1MQorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIE3hcyAtLSIKKworIzogbWVzc2FnZS5jOjIzNTQKK21zZ2lkICIgKFJFVC9CUzogbGluZSwgU1BBQ0UvYjogcGFnZSwgZC91OiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVC9CUzogbO1uZWEsIEVTUEFDSU8vYjogcOFnaW5hLCBkL3U6IG1lZGlhIHDhZ2luYSwgcTogc2FsaXIpIgorCisjOiBtZXNzYWdlLmM6MjM1NQorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IGztbmVhLCBFU1BBQ0lPOiBw4WdpbmEsIGQ6IG1lZGlhIHDhZ2luYSwgcTogc2FsaXIpIgorCisjOiBtZXNzYWdlLmM6Mjk4MiBtZXNzYWdlLmM6Mjk5NworbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJQcmVndW50YSIKKworIzogbWVzc2FnZS5jOjI5ODQKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZTaVxuIgorIiZObyIKKworIzogbWVzc2FnZS5jOjMwMTcKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIlNhdmUgJkFsbFxuIgorIiZEaXNjYXJkIEFsbFxuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImU2lcbiIKKyImTm9cbiIKKyImR3VhcmRhciB0b2RvXG4iCisiJkRlc2NhcnRhciB0b2RvXG4iCisiJkNhbmNlbGFyIgorCisjOiBtZXNzYWdlLmM6MzA1OAorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIkRp4WxvZ28gZGUgR3VhcmRhciBGaWNoZXJvIgorCisjOiBtZXNzYWdlLmM6MzA2MAorbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIkRp4WxvZ28gZGUgQWJyaXIgRmljaGVybyIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzozMTMxCittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6IExvIHNpZW50bywgbm8gaGF5IGhvamVhZG9yIGRlIGZpY2hlcm9zIGVuIG1vZG8gZGUgY29uc29sYSIKKworIzogbWlzYzEuYzoyNzczCittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogQWR2ZXJ0ZW5jaWE6IGNhbWJpYW5kbyB1biBmaWNoZXJvIGRlIHPzbG8gbGVjdHVyYSIKKworIzogbWlzYzEuYzozMDIxCittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIjEgbO1uZWEgbeFzIgorCisjOiBtaXNjMS5jOjMwMjMKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAiMSBs7W5lYSBtZW5vcyIKKworIzogbWlzYzEuYzozMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICIlbGQgbO1uZWFzIG3hcyIKKworIzogbWlzYzEuYzozMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAiJWxkIGztbmVhcyBtZW5vcyIKKworIzogbWlzYzEuYzozMDMzCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAoSW50ZXJydW1waWRvKSIKKworIzogbWlzYzEuYzo3NTg4Cittc2dpZCAiVmltOiBwcmVzZXJ2aW5nIGZpbGVzLi4uXG4iCittc2dzdHIgIlZpbTogcHJlc2VydmFuZG8gZmljaGVyb3MuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjc1OTgKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IGZpbmFsaXphZG8uXG4iCisKKyM6IG1pc2MyLmM6Njk1IG1pc2MyLmM6NzExCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRVJST1I6ICIKKworIzogbWlzYzIuYzo3MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGxpYmVyYWRvIHBvciBhbGxvYyAlbHUtJWx1LCBlbiB1c28gJWx1LCB1c28gbeF4aW1vICVsdVxuIgorCisjOiBtaXNjMi5jOjcxNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbbGFtYWRhc10gdG90YWwgcmUvbWFsbG9jKCkncyAlbHUsIHRvdGFsIGZyZWUoKSdzICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc3MgorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6IExhIGztbmVhIHNlIGVzdOEgaGFjaWVuZG8gZGVtYXNpYWRvIGxhcmdhIgorCisjOiBtaXNjMi5jOjgxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogRXJyb3IgaW50ZXJubzogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IKFNZW1vcmlhIGFnb3RhZGEhIChhbCBhc2lnbmFyICVsdSBieXRlcykiCisKKyM6IG1pc2MyLmM6MjU5NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAiTGxhbWFuZG8gYSBsYSCrc2hlbGy7IHBhcmEgZWplY3V0YXI6IKslc7siCisKKyM6IG1pc2MyLmM6MjgxNgorbXNnaWQgIkU1NDU6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NDU6IEZhbHRhIHVuIHPtbWJvbG8gZGUgZG9zIHB1bnRvcy4iCisKKyM6IG1pc2MyLmM6MjgxOCBtaXNjMi5jOjI4NDUKK21zZ2lkICJFNTQ2OiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkU1NDY6IE1vZG8gZGUgb3BlcmFjafNuIGlsZWdhbC4iCisKKyM6IG1pc2MyLmM6Mjg4NAorbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogRWwgq21vdXNlc2hhcGW7IG5vIGVzIHbhbGlkby4iCisKKyM6IG1pc2MyLmM6MjkyNAorbXNnaWQgIkU1NDg6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTQ4OiBTZSBlc3BlcmFiYSB1biBk7WdpdG8uIgorCisjOiBtaXNjMi5jOjI5MjkKK21zZ2lkICJFNTQ5OiBJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIkU1NDk6IFBvcmNlbnRhamUgaWxlZ2FsLiIKKworIzogbWlzYzIuYzozMjM5Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiSW50cm9kdXpjYSBsYSBjbGF2ZSBkZSBjaWZyYWRvOiAiCisKKyM6IG1pc2MyLmM6MzI0MAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIkludHJvZHV6Y2EgbGEgbWlzbWEgY2xhdmUgZGUgY2lmcmFkbyBvdHJhIHZlejogIgorCisjOiBtaXNjMi5jOjMyNTAKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAioUxhcyBjbGF2ZXMgZGUgY2lmcmFkbyBubyBjb2luY2lkZW4hIgorCisjOiBtaXNjMi5jOjM3OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBSdXRhIG5vIHbhbGlkYTogJyoqW276bWVyb10nIGRlYmUgZXN0YXIgYWwgZmluYWwgZGUgbGEgcnV0YSBvIHNlZ3VpZG8gIgorImRlIKslc7suIgorCisjOiBtaXNjMi5jOjUwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogTm8gc2UgcHVlZGUgZW5jb250cmFyIGVsIGRpcmVjdG9yaW8gqyVzuyBlbiCrY2RwYXRouyIKKworIzogbWlzYzIuYzo1MDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogTm8gc2UgcHVlZGUgZW5jb250cmFyIGVsIGZpY2hlcm8gqyVzuyBlbiBsYSBydXRhIgorCisjOiBtaXNjMi5jOjUwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogTm8gc2UgaGFuIGVuY29udHJhZG8gbWFzIGRpcmVjdG9yaW9zIKslc7sgZW4gq2NkcGF0aLsiCisKKyM6IG1pc2MyLmM6NTA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IE5vIHNlIGhhbiBlbmNvbnRyYWRvIG1hcyBmaWNoZXJvcyCrJXO7IGVuIGxhIHJ1dGEiCisKKyM6IG1pc2MyLmM6NTMyNAorbXNnaWQgIkU1NTA6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NTA6IEZhbHRhIHVuIHPtbWJvbG8gZGUgZG9zIHB1bnRvcy4iCisKKyM6IG1pc2MyLmM6NTMzNgorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiBDb21wb25lbnRlIGlsZWdhbC4iCisKKyM6IG1pc2MyLmM6NTM0NAorbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiBzZSBlc3BlcmFiYSB1biBk7WdpdG8uIgorCisjICBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjLiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjOiBuZXRiZWFucy5jOjM5NgorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zICMyIgorbXNnc3RyICJObyBwdWVkbyBjb25lY3Rhcm1lIGEgTmV0YmVhbnMgIzIiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIk5vIHB1ZWRvIGNvbmVjdGFybWUgYSBOZXRiZWFucyIKKworIyBjLWZvcm1hdAorIzogbmV0YmVhbnMuYzo0NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2ODogV3JvbmcgYWNjZXNzIG1vZGUgZm9yIE5ldEJlYW5zIGNvbm5lY3Rpb24gaW5mbyBmaWxlOiBcIiVzXCIiCittc2dzdHIgIkU2Njg6IEVsIGR1ZfFvKGEpIGRlbCBmaWNoZXJvIGRlIGNvbmV4afNuIE5ldEJlYW5zIG5vIGVzIHbhbGlkbzogqyVzuyIKKworIzogbmV0YmVhbnMuYzo3NDkKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICJsZWlkbyBkZWwgc29ja2V0IE5ldGJlYW5zIgorCisjOiBuZXRiZWFucy5jOjE2NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY1ODogTmV0QmVhbnMgY29ubmVjdGlvbiBsb3N0IGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFNjU4OiBTZSBwZXJkafMgbGEgY29uZXhp824gTmV0QmVhbnMgcGFyYSBlbCAgq2J1ZmZlcrsgJWxkLiIKKworIzogbm9ybWFsLmM6Mjk4MAorbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgIkFkdmVydGVuY2lhOiBlbCB0ZXJtaW5hbCBubyBwdWVkZSByZWFsemFyIGVsIHRleHRvIgorCisjOiBub3JtYWwuYzozMjc2Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogTm8gaGF5IG5pbmd1bmEgY2FkZW5hIGJham8gZWwgY3Vyc29yIgorCisjOiBub3JtYWwuYzozMjc4Cittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IE5vIGhheSBuaW5n+m4gaWRlbnRpZmljYWRvciBiYWpvIGVsIGN1cnNvciIKKworIzogbm9ybWFsLmM6NDUxOQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiBObyBwdWVkbyBib3JhciBwbGllZ3VlcyBjb24gZWwgq2ZvbG1ldGhvZLsgYWN0dWFsLiIKKworIzogbm9ybWFsLmM6Njc0MAorbXNnaWQgIkU2NjQ6IGNoYW5nZWxpc3QgaXMgZW1wdHkiCittc2dzdHIgIkU2NjQ6IExhIGxpc3RhIGRlIGNhbWJpb3MgZXN04SB2YWPtYS4iCisKKyM6IG5vcm1hbC5jOjY3NDIKK21zZ2lkICJFNjYyOiBBdCBzdGFydCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYyOiBBbCBjb21pZW56byBkZSBsYSBsaXN0YSBkZSBjYW1iaW9zLiIKKworIzogbm9ybWFsLmM6Njc0NAorbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYzOiBBbCBmaW5hbCBkZSBsYSBsaXN0YSBkZSBjYW1iaW9zLiIKKworIzogbm9ybWFsLmM6ODAwNQorbXNnaWQgIlR5cGUgIDpxdWl0PEVudGVyPiAgdG8gZXhpdCBWaW0iCittc2dzdHIgIkVzY3JpYmEgOnF1aXQ8ZW50ZXI+IHBhcmEgdGVybWluYXIgbGEgZWplY3VjafNuIGRlIFZpbS4iCisKKyM6IG9wcy5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgIjEgbO1uZWEgJXNlZCAxIHZlei4iCisKKyM6IG9wcy5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSBs7W5lYSAlc2VkICVkIHZlY2VzLiIKKworIzogb3BzLmM6MzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkIGztbmVhcyAlc2VkIDEgdmV6LiIKKworIzogb3BzLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQgbO1uZWFzICVzZWQgJWQgdmVjZXMuIgorCisjOiBvcHMuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIiVsZCBs7W5lYXMgcG9yIHNhbmdyYXIuLi4iCisKKyM6IG9wcy5jOjcxMgorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIjEgbO1uZWEgc2FuZ3JhZGEiCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgbO1uZWFzIHNhbmdyYWRhcyIKKworIyBEZWJlIG1vc3RyYXIgbGEgbO1uZWEgZGUgY29tYW5kb3MuCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogb3BzLmM6MTY3NQorbXNnaWQgImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IgorbXNnc3RyICJObyBwdWVkbyBoYWNlciB1biCreWFua7s7IL9MbyBib3JybyBkZSB0b2RhcyBmb3JtYXM/IgorCisjOiBvcHMuYzoyMjYxCittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgbO1uZWEgY2FtYmlhZGEiCisKKyM6IG9wcy5jOjIyNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiVsZCBs7W5lYXMgY2FtYmlhZGFzIgorCisjOiBvcHMuYzoyNjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICJsaWJlcmFuZG8gJWxkIGztbmVhcyIKKworIzogb3BzLmM6MjkyOAorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIjEgbO1uZWEgY29waWFkYSIKKworIzogb3BzLmM6MjkzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICIlbGQgbO1uZWFzIGNvcGlhZGFzIgorCisjOiBvcHMuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IE5vIGhheSBuYWRhIGVuIGVsIHJlZ2lzdHJvICVzIgorCisjICBIaWdobGlnaHQgdGl0bGUKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6Mzc2NgorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBSZWdpc3Ryb3MgLS0tIgorCisjOiBvcHMuYzo1MDc1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJOb21icmUgZGUgcmVnaXN0cm8gaWxlZ2FsIgorCisjOiBvcHMuYzo1MTYzCittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBSZWdpc3Ryb3M6XG4iCisKKyM6IG9wcy5jOjUyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJFNTc0OiBSZWdpc3RybyBkZXNjb25vY2lkbyBkZSB0aXBvIKslZLsuIgorCisjOiBvcHMuYzo1Njk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogTm9tYnJlIGRlIHJlZ2lzdHJvIG5vIHbhbGlkbzogJyVzJyIKKworIzogb3BzLmM6NjA1OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICIlbGQgQ29sczsgIgorCisjOiBvcHMuYzo2MDY1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiIgorIlNlbGVjY2lvbmFkYXMgJXMlbGQgZGUgJWxkIEztbmVhczsgJWxkIGRlICVsZCBQYWxhYnJhczsgJWxkIGRlICVsZCBDYXJhY3RlcmVzIgorCisjOiBvcHMuYzo2MDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAiIgorIkNvbCAlcyBkZSAlczsgTO1uZWEgJWxkIGRlICVsZDsgUGFsYWJyYSAlbGQgZGUgJWxkOyBDYXLhY3RlciAlbGQgZGUgJWxkIgorCisjOiBvcHMuYzo2MDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBwYXJhIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE2NDMKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPVDhZ2luYSAlTiIKKworIzogb3B0aW9uLmM6MjA5MgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAiR3JhY2lhcyBwb3Igdm9sYXIgY29uIFZpbSIKKworIzogb3B0aW9uLmM6MzQxOSBvcHRpb24uYzozNTM1Cittc2dpZCAiRTUxODogVW5rbm93biBvcHRpb24iCittc2dzdHIgIkU1MTg6IE9wY2nzbiBkZXNjb25vY2lkYS4iCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogT3BjafNuIG5vIGFkbWl0aWRhIgorCisjOiBvcHRpb24uYzozNDU3Cittc2dpZCAiRTUyMDogTm90IGFsbG93ZWQgaW4gYSBtb2RlbGluZSIKK21zZ3N0ciAiRTUyMDogTm8gc2UgcGVybWl0ZSBlbiB1bmEgq21vZGVsaW5luyIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRTZSBkZWZpbmnzIHBvciD6bHRpbWEgdmV6IGVuICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiBTZSBuZWNlc2l0YSB1biBu+m1lcm8gZGVzcHVlcyBkZSCrPbsiCisKKyM6IG9wdGlvbi5jOjM5ODkgb3B0aW9uLmM6NDYxOQorbXNnaWQgIkU1MjI6IE5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTIyOiBObyBsbyBlbmNvbnRy6SBlbiBlbCCrdGVybWNhcLsuIgorCisjOiBvcHRpb24uYzo0MDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IENhcuFjdGVyIGlsZWdhbCA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiBObyBwdWVkbyBkZWZpbmlyIKt0ZXJtuyBjb21vIHVuYSBjYWRlbmEgZGUgY2FyYWN0ZXJlcyB2YWPtYS4iCisKKyM6IG9wdGlvbi5jOjQ2MTQKK21zZ2lkICJFNTMwOiBDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJFNTMwOiBObyBwdWVkbyBjYW1iaWFyIKt0ZXJtuyBlbiBsYSBHVUkuIgorCisjOiBvcHRpb24uYzo0NjE2Cittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IFVzZSCrOmd1absgcGFyYSBpbmljaWFyIGxhIEdVSS4iCisKKyM6IG9wdGlvbi5jOjQ2NDUKK21zZ2lkICJFNTg5OiAnYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICJFNTg5OiCrYmFja3VwZXh0uyB5IKtwYXRjaG1vZGW7IHNvbiBpZ3VhbGVzLiIKKworIzogb3B0aW9uLmM6NDg2MAorbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiBObyBwdWVkZSBjYW1iaWFyc2UgZW4gZWwgR1VJIGRlIEdUSysgMi4iCisKKyM6IG9wdGlvbi5jOjUwMTYKK21zZ2lkICJFNTI0OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTI0OiBGYWx0YSB1biBz7W1ib2xvIGRlIGRvcyBwdW50b3MuIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiBDYWRlbmEgZGUgY2FyYWN0ZXJlcyBkZSBsYXJnbyBjZXJvLiIKKworIzogb3B0aW9uLmM6NTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiBGYWx0YSBlbCBu+m1lcm8gZGVzcHVlcyBkZSA8JXM+LiIKKworIzogb3B0aW9uLmM6NTEwMAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IEZhbHRhIHVuYSBjb21hLiIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IERlYmUgZXNwZWNpZmljYXIgdW4gdmFsb3IgJyIKKworIzogb3B0aW9uLmM6NTE0OAorbXNnaWQgIkU1OTU6IGNvbnRhaW5zIHVucHJpbnRhYmxlIG9yIHdpZGUgY2hhcmFjdGVyIgorbXNnc3RyICJFNTk1OiBDb250aWVuZSB1biBjYXJhY3RlciBubyBpbXByaW1pYmxlIG8gZGUgbeFzIGRlIHVuIGJ5dGUgZGUgYW5jaG8uIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBMYXMgZnVlbnRlKHMpIGRlIGltcHJlc2nzbiBubyBzb24gduFsaWRhcy4iCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5NzogTm8gcHVlZG8gc2VsZWNjaW9uYXIgZXNlIKtmb250c2V0uy4iCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IEVsIGNvbmp1bnRvIGRlIGZ1ZW50ZXMgZGUgaW1wcmVzafNuIG5vIGVzIHbhbGlkby4iCisKKyM6IG9wdGlvbi5jOjUyMTQKK21zZ2lkICJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICIiCisiRTUzMzogTm8gcHVlZG8gc2VsZWNjaW9uYXIgbGEgZnVlbnRlIGRlIGltcHJlc2nzbiCrYW5jaGG7IChkZSBieXRlIGRvYmxlKS4iCisKKyM6IG9wdGlvbi5jOjUyMTYKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDogRnVlbnRlIGRlIGltcHJlc2nzbiCrYW5jaGG7IGluduFsaWRhLiIKKworIzogb3B0aW9uLmM6NTQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICJFNTM1OiBhcuFjdGVyIGlsZWdhbCBkZXNwdelzIGRlIDwlYz4uIgorCisjOiBvcHRpb24uYzo1NTk3Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IFNlIHJlcXVpZXJlIHVuYSBjb21hLiIKKworIzogb3B0aW9uLmM6NTYwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNTM3OiAnY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICJFNTM3OiCrY29tbWVudHN0cmluZ7sgZGViZSBlc3RhciB2YWNpbyBvIGNvbnRlbmVyIKslc7suIgorCisjOiBvcHRpb24uYzo1Njc5Cittc2dpZCAiRTUzODogTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiRTUzODogTm8gaGF5IHNvcG9ydGUgcGFyYSBlbCByYXTzbi4iCisKKyM6IG9wdGlvbi5jOjU5NDcKK21zZ2lkICJFNTQwOiBVbmNsb3NlZCBleHByZXNzaW9uIHNlcXVlbmNlIgorbXNnc3RyICJFNTQwOiBTRWN1ZW5jaWEgZGUgZXhwcmVzafNuIHNpbiBjZXJyYXIuIgorCisjOiBvcHRpb24uYzo1OTUxCittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6IERlbWFzaWFkb3Mg7XRlbXMuIgorCisjOiBvcHRpb24uYzo1OTUzCittc2dpZCAiRTU0MjogdW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIkU1NDI6IEdydXBvcyBkZXNiYWxhbmNlYWRvcy4iCisKKyM6IG9wdGlvbi5jOjYxOTMKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiBZYSBleGlzdGUgdW5hIHZlbnRhbmEgZGUgdmlzdWFsaXphY2nzbiBwcmV2aWEuIgorCisjOiBvcHRpb24uYzo2NDUwCittc2dpZCAiVzE3OiBBcmFiaWMgcmVxdWlyZXMgVVRGLTgsIGRvICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKK21zZ3N0ciAiIgorIlcxNzogRWwgdXNvIGRlIOFyYWJlIHJlcXVpZXJlIGxhIGNvZGlmaWNhY2nzbiBVVEYtOCwgdXNlIKs6c2V0IGVuY29kaW5nPXV0Zi0iCisiOLsgcHJpbWVyby4iCisKKyM6IG9wdGlvbi5jOjY3ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAiRTU5MzogTmVjZXNpdGEgYWwgbWVub3MgJWQgbO1uZWFzLiIKKworIzogb3B0aW9uLmM6Njc5MworIywgYy1mb3JtYXQKK21zZ2lkICJFNTk0OiBOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIkU1OTQ6IE5lY2VzaXRhIGFsIG1lbm9zICVkIGNvbHVtbmFzLiIKKworIzogb3B0aW9uLmM6NzEwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE9wY2nzbiBkZXNjb25vY2lkYTogJXMiCisKKyM6IG9wdGlvbi5jOjcyMjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBD82RpZ29zIGRlIHRlcm1pbmFsIC0tLSIKKworIzogb3B0aW9uLmM6NzIyMgorbXNnaWQgIiIKKyJcbiIKKyItLS0gR2xvYmFsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFZhbG9yZXMgZGUgbGFzIG9wY2lvbmVzIGdsb2JhbGVzIC0tLSIKKworIzogb3B0aW9uLmM6NzIyNAorbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVmFsb3JlcyBkZSBsYXMgb3BjaW9uZXMgbG9jYWxlcyAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjYKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE9wY2lvbmVzIC0tLSIKKworIzogb3B0aW9uLmM6NzkzMgorbXNnaWQgIkUzNTY6IGdldF92YXJwIEVSUk9SIgorbXNnc3RyICJFMzU2OiBFUlJPUiBkZSCrZ2V0X3ZhcnC7IgorCisjOiBvcHRpb24uYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiCrbGFuZ21hcLs6IGZhbHRhIGNhcuFjdGVyIGNvaW5jaWRlbnRlIHBhcmEgJXMiCisKKyM6IG9wdGlvbi5jOjg5MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6IKtsYW5nbWFwuzogY2FyYWN0ZXJlcyBleHRyYSBkZXNwdelzIGRlbCBwdW50byB5IGNvbWE6ICVzIgorCisjOiBvc19hbWlnYS5jOjI4MAorbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAiTm8gcHVlZG8gYWJyaXJsbyIKKworIzogb3NfYW1pZ2EuYzozMTQKK21zZ2lkICJWSU06IENhbid0IG9wZW4gd2luZG93IVxuIgorbXNnc3RyICJWSU06IKFObyBwdWVkbyBhYnJpciBsYSB2ZW50YW5hIVxuIgorCisjOiBvc19hbWlnYS5jOjMzOAorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIk5lY2VzaXRvIGxhIHZlcnNp824gMi4wNCBvIHBvc3RlcmlvciBkZSBBbWlnYWRvc1xuIgorCisjOiBvc19hbWlnYS5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIk5lY2VzaXRvICVzIHZlcnNp824gJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDE2Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJObyBwdWVkbyBhYnJpciBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDI3Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIk5vIHB1ZWRvIGNyZWFyICIKKworIzogb3NfYW1pZ2EuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICJTYWxpZW5kbyBkZSBWaW0gY29uICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTM3Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAiob9ObyBwdWVkbyBjYW1iaWFyIGVsIG1vZG8gZGUgbGEgY29uc29sYT8hXG4iCisKKyM6IG9zX2FtaWdhLmM6MTAwMworbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAiq21jaF9nZXRfc2hlbGxzaXpluzogv05vIGVzIHVuYSBjb25zb2xhP1xuIgorCisjICBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE1MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiBObyBzZSBwdWVkZSBlamVjdXRhciBsYSCrc2hlbGy7IGNvbiBsYSBvcGNp824gLWYiCisKKyM6IG9zX2FtaWdhLmM6MTE5MyBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIk5vIHB1ZWRvIGVqZWN1dGFybG8gIgorCisjOiBvc19hbWlnYS5jOjExOTYgb3NfYW1pZ2EuYzoxMjkzCittc2dpZCAic2hlbGwgIgorbXNnc3RyICKrc2hlbGy7ICIKKworIzogb3NfYW1pZ2EuYzoxMjE2IG9zX2FtaWdhLmM6MTMxOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgZGV2dWVsdG9cbiIKKworIzogb3NfYW1pZ2EuYzoxNDU5Cittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIqtBTkNIT1JfQlVGX1NJWkW7IGRlbWFzaWFkbyBwZXF1ZfFvIgorCisjOiBvc19hbWlnYS5jOjE0NjMKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkVSUk9SIEUvUyIKKworIzogb3NfbXN3aW4uYzo1MzkKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiLi4uKHRydW5jYWRvKSIKKworIzogb3NfbXN3aW4uYzo2NDEKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIG5vIGVzIDgwLCBubyBzZSBwdWVkZW4gZWplY3V0YXIgY29tYW5kb3MgZXh0ZXJub3MiCisKKyM6IG9zX21zd2luLmM6MTk3MworbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogRkFsbPMgbGEgc2VsZWN0afNuIGRlIGltcHJlc29yYS4iCisKKyM6IG9zX21zd2luLmM6MjAxMworIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAicGFyYSAlcyBlbiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTM6IFVua25vd24gcHJpbnRlciBmb250OiAlcyIKK21zZ3N0ciAiRTYxMzogRnVlbnRlIGRlIGltcHJlc2nzbiBkZXNjb25vY2lkYSBlbiBsYSBpbXByZXNvcmE6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwNzcgb3NfbXN3aW4uYzoyMDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogRXJyb3IgZGUgaW1wcmVzafNuOiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDg4Cittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiRGVzY29ub2NpZG8iCisKKyM6IG9zX21zd2luLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJJbXByaW1pZW5kbyCrJXO7IgorCisjOiBvc19tc3dpbi5jOjMyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIiIKKyJFMjQ0OiBFbCBub21icmUgZGVsIGNvbmp1bnRvIGRlIGNhcmFjdGVyZXMgqyVzuyBubyBlcyB24WxpZG8gZW4gZWwgbm9tYnJlIGRlICIKKyJsYSBmdWVudGUgZGUgaW1wcmVzafNuIKslc7siCisKKyM6IG9zX21zd2luLmM6MzIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBDYXLhY3RlciCrJWO7IGlsZWdhbCBlbiBlbCBub21icmUgZGUgbGEgZnVlbnRlIGRlIGltcHJlc2nzbiCrJXO7IgorCisjOiBvc19yaXNjb3MuYzoxMjU5Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogT3BjafNuIKtvc2ZpbGV0eXBluyBpbnbhbGlkYSAtIHVzYW5kbyBUZXh0IgorCisjOiBvc191bml4LmM6OTI3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogZG9ibGUgc2XxYWwsIHNhbGllbmRvXG4iCisKKyM6IG9zX3VuaXguYzo5MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IGNhcHTpIHVuYSBzZfFhbCBkZSBtdWVydGUgJXNcbiIKKworIzogb3NfdW5peC5jOjkzNgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiBjYXB06SB1bmEgc2XxYWwgZGUgbXVlcnRlXG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJBYnJpciBsYSBwYW50YWxsYSBYIHRvbfMgJWxkIG1zIgorCisjOiBvc191bml4LmM6MTIyNgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IEhheSB1biBlcnJvciBkZSBYMTFcbiIKKworIzogb3NfdW5peC5jOjEzMzQKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJGYWxs8yBsYSBwcnVlYmEgZGVsIHNpc3RlbWEgWDExIgorCisjOiBvc191bml4LmM6MTQ3MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIkVsIKtkaXNwbGF5uyBkZSBYIG5vIGFicmnzIGEgdGllbXBvLiIKKworIzogb3NfdW5peC5jOjMyMzAgb3NfdW5peC5jOjM5MTAKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiTm8gcHVlZG8gZWplY3V0YXIgbGEgq3NoZWxsuyAiCisKKyM6IG9zX3VuaXguYzozMjc4Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyJObyBwdWVkbyBlamVjdXRhciBsYSCrc2hlbGy7IKtzaLtcbiIKKworIzogb3NfdW5peC5jOjMyODIgb3NfdW5peC5jOjM5MTYKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisiTGEgq3NoZWxsuyBoYSBkZXZ1ZWx0byAiCisKKyM6IG9zX3VuaXguYzozNDE3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5vIHB1ZWRvIGNyZWFyIKtwaXBlc7tcbiIKKworIzogb3NfdW5peC5jOjM0MzIKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5vIHB1ZWRvIHVzYXIgq2Zvcmu7XG4iCisKKyM6IG9zX3VuaXguYzozOTIzCittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiQ29tYW5kbyBmaW5hbGl6YWRvXG4iCisKKyM6IG9zX3VuaXguYzo0MTg3IG9zX3VuaXguYzo0MzEyIG9zX3VuaXguYzo1OTc4Cittc2dpZCAiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QIHBlcmRp8yBsYSBjb25leGnzbiBJQ0UuIgorCisjOiBvc191bml4LmM6NTU2MQorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIkZhbGzzIGxhIGFwZXJ0dXJhIGRlIGxhIHBhbnRhbGxhIFgxMSIKKworIzogb3NfdW5peC5jOjU4ODMKK21zZ2lkICJYU01QIGhhbmRsaW5nIHNhdmUteW91cnNlbGYgcmVxdWVzdCIKK21zZ3N0ciAiWFNNUCBlc3ThIG1hbmVqYW5kbyB1bmEgc29saWNpdHVkIGRlIKtndWFyZGVsbyB1c3RlZCBtaXNtb7suIgorCisjOiBvc191bml4LmM6NjAwMgorbXNnaWQgIlhTTVAgb3BlbmluZyBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QIGVzdOEgYWJyaWVuZG8gdW5hIGNvbmV4afNuLiIKKworIzogb3NfdW5peC5jOjYwMjEKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiWFNNUCBGYWxs8yBlbCBtb25pdG9yZW8gZGUgbGEgY29uZXhp824gSUNFLiIKKworIzogb3NfdW5peC5jOjYwNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGhhIGZhbGxhZG86ICVzLiIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiRW4gbGEgbO1uZWEiCisKKyM6IG9zX3czMmV4ZS5jOjY1Cittc2dpZCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tbWFuZCBsaW5lLiIKK21zZ3N0ciAiTm8gcHVkZSBkZXNpZ25hciBtZW1vcmlhIHBhcmEgbGEgbO1uZWEgZGUgY29tYW5kb3MuIgorCisjOiBvc193MzJleGUuYzo2NiBvc193MzJleGUuYzo4OSBvc193MzJleGUuYzoxMDAKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIkVycm9yIGRlIFZpbSIKKworIzogb3NfdzMyZXhlLmM6ODkKK21zZ2lkICJDb3VsZCBub3QgbG9hZCB2aW0zMi5kbGwhIgorbXNnc3RyICKhTm8gcHVkZSBjYXJnYXIgdmltMzIuZGxsISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICKhTm8gcHVkZSBmaWphciBsb3MgcHVudGVyb3MgZGUgbGEgZnVuY2nzbiBhIGxhIERMTCEiCisKKyM6IG9zX3dpbjE2LmM6MzQyIG9zX3dpbjMyLmM6MzI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAiTGEgq3NoZWxsuyBoYSBkZXZ1ZWx0byAlZCIKKworIzogb3Nfd2luMzIuYzoyNzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogQ2FwdOkgZWwgZXZlbnRvICVzXG4iCisKKyM6IG9zX3dpbjMyLmM6MjcwOAorbXNnaWQgImNsb3NlIgorbXNnc3RyICJjZXJyYXIiCisKKyM6IG9zX3dpbjMyLmM6MjcxMAorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAic2FsaWRhIgorCisjOiBvc193aW4zMi5jOjI3MTEKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAiYXBhZ2FyIgorCisjOiBvc193aW4zMi5jOjMyMDEKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogTm8gc2UgZW5jdWVudHJhIGVsIGNvbWFuZG8iCisKKyM6IG9zX3dpbjMyLmM6MzIxNAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEUgbm8gc2UgZW5jdWVudHJhIGVuIHN1ICRQQVRILlxuIgorIkxvcyBjb21hbmRvcyBleHRlcm5vcyBubyBoYXLhbiB1bmEgcGF1c2EgYWwgZmluYWxpemFyLlxuIgorIlbpYXNlICA6aGVscCB3aW4zMi12aW1ydW4gIHBhcmEgbeFzIGluZm9ybWFjafNuIgorCisjOiBvc193aW4zMi5jOjMyMTcKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiQWR2ZXJ0ZW5jaWEgZGUgVmltIgorCisjOiBxdWlja2ZpeC5jOjI1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IERlbWFzaWFkb3MgJSUlYyBlbiBsYSBjYWRlbmEgZGUgZm9ybWF0byIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6ICUlJWMgaW5lc3BlcmFkbyBlbiBsYSBjYWRlbmEgZGUgZm9ybWF0byIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogRmFsdGEgXSBlbiBsYSBjYWRlbmEgZGUgZm9ybWF0byIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjIG5vIGFkbWl0aWRvIGVuIGNhZGVuYSBkZSBmb3JtYXRvIgorCisjOiBxdWlja2ZpeC5jOjM1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6ICUlJWMgbm8gduFsaWRvIGVuIGVsIHByZWZpam8gZGUgdW5hIGNhZGVuYSBkZSBmb3JtYXRvIgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogJSUlYyBubyB24WxpZG8gZW4gdW5hIGNhZGVuYSBkZSBmb3JtYXRvIgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogq2Vycm9yZm9ybWF0uyBubyBjb250aWVuZSB1biBwYXRy824iCisKKyM6IHF1aWNrZml4LmM6NTAxCittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTogRWwgbm9tYnJlIGRlbCBkaXJlY3RvcmlvIGZhbHRhIG8gZXN04SB2YWPtbyIKKworIzogcXVpY2tmaXguYzo5OTAKK21zZ2lkICJFNTUzOiBObyBtb3JlIGl0ZW1zIgorbXNnc3RyICJFNTUzOiBObyBoYXkgbeFzIO10ZW1zLiIKKworIzogcXVpY2tmaXguYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCBkZSAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIzMQorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiIChs7W5lYSBib3JyYWRhKSIKKworIzogcXVpY2tmaXguYzoxNDQ0Cittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBBbCBmaW5hbCBkZSBsYSBwaWxhIGRlIGNvcnJlY2nzbiBy4XBpZGEiCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogQWwgcHJpbmNpcGlvIGRlIGxhIHBpbGEgZGUgY29ycmVjafNuIHLhcGlkYSIKKworIzogcXVpY2tmaXguYzoxNDY1CisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAibGlzdGEgZGUgZXJyb3JlcyAlZCBkZSAlZDogJWQgZXJyb3JlcyIKKworIzogcXVpY2tmaXguYzoxOTQzCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogTm8gc2UgcHVlZGUgZ3JhYmFyLCBsYSBvcGNp824gq2J1ZnR5cGW7IGVzdOEgYWN0aXZhZGEiCisKKyM6IHJlZ2V4cC5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY5OiBpbnZhbGlkIGl0ZW0gaW4gJXMlJVtdIgorbXNnc3RyICJFMzY5OiBFbCDtdGVtIGVuICVzJSVbXSBubyBlcyB24WxpZG8uIgorCisjOiByZWdleHAuYzo4MzgKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiBQYXRy824gZGVtYXNpYWRvIGxhcmdvIgorCisjOiByZWdleHAuYzoxMDA5Cittc2dpZCAiRTUwOiBUb28gbWFueSBcXHooIgorbXNnc3RyICJFNTA6IERlbWFzaWFkb3MgXFx6KCIKKworIzogcmVnZXhwLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiBIYXkgZGVtYXNpYWRvcyAlcygiCisKKyM6IHJlZ2V4cC5jOjEwNzcKK21zZ2lkICJFNTI6IFVubWF0Y2hlZCBcXHooIgorbXNnc3RyICJFNTI6IFxceiggc2luIGNvbXBsZW1lbnRvLiIKKworIzogcmVnZXhwLmM6MTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiAlcyUlKCBzaW4gY29tcGxlbWVudG8uIgorCisjOiByZWdleHAuYzoxMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiAlcyggc2luIGNvbXBsZW1lbnRvLiIKKworIzogcmVnZXhwLmM6MTA4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTU6IFVubWF0Y2hlZCAlcykiCittc2dzdHIgIkU1NTogJXMpIHNpbiBjb21wbGVtZW50by4iCisKKyM6IHJlZ2V4cC5jOjEyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiBFbCBvcGVyYW5kbyAlcyogcG9kcu1hIGVzdGFyIHZhY+1vLiIKKworIzogcmVnZXhwLmM6MTI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc6ICVzKyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTc6IEVMIG9wZXJhbmRvICVzKyBwb2Ry7WEgZXN0YXIgdmFj7W8uIgorCisjOiByZWdleHAuYzoxMzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IENhcuFjdGVyIGluduFsaWRvIGRlc3B16XMgZGUgJXNAIgorCisjOiByZWdleHAuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1ODogRUwgb3BlcmFuZG8gJXN7IHBvZHLtYSBlc3RhciB2YWPtby4iCisKKyM6IHJlZ2V4cC5jOjEzNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOiBUb28gbWFueSBjb21wbGV4ICVzey4uLn1zIgorbXNnc3RyICJFNjA6IEhheSBkZW1hc2lhZG9zICVzey4uLn1zIGNvbXBsZWpvcy4iCisKKyM6IHJlZ2V4cC5jOjEzNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IEFuaWRhZG8gJXMqIgorCisjOiByZWdleHAuYzoxMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogQW5pZGFkbyAlcyVjIgorCisjOiByZWdleHAuYzoxNDkxCittc2dpZCAiRTYzOiBpbnZhbGlkIHVzZSBvZiBcXF8iCittc2dzdHIgIkU2MzogVXNvIGluduFsaWRvIGRlIFxcXyIKKworIzogcmVnZXhwLmM6MTUzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6ICVzJWMgbm8gc2lndWUgYSBuYWRhIgorCisjOiByZWdleHAuYzoxNTkyCittc2dpZCAiRTY1OiBJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorbXNnc3RyICJFNjU6IFJlZmVybmVjaWEgcmV2ZXJzYSBpbGVnYWwuIgorCisjOiByZWdleHAuYzoxNjA1Cittc2dpZCAiRTY2OiBcXHooIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NjogTm8gc2UgcGVybWl0ZSBcXHooIGFxde0uIgorCisjOiByZWdleHAuYzoxNjI0Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgZXQgYWwuIG5vIGVzdOFuIHBlcm1pdGlkb3MgYXF17S4iCisKKyMgRXMgcHJlZmVyaWJsZSB0cmFkdWNpciAiaW52YWxpZCIgcG9yICJubyBbZXNdIHbhbGlkbyIgcHVlcyAiaW524WxpZG8iIG5vIGVzIGxvIHN1ZmljaWVudGVtZW50ZSBjbGFyby4gQWRlbeFzLCBubyBlcyBwb2ztdGljYW1lbnRlIGNvcnJlY3RvIDotKQorIzogcmVnZXhwLmM6MTYzNQorbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IEhheSB1biBjYXLhY3RlciBubyB24WxpZG8gZGVzcHXpcyBkZSBcXHoiCisKKyM6IHJlZ2V4cC5jOjE2ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY5OiBNaXNzaW5nIF0gYWZ0ZXIgJXMlJVsiCittc2dzdHIgIkU2OTogRmFsdGEgXSBkZXNwdWVzIGRlICVzJSVbIgorCisjOiByZWdleHAuYzoxNzAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MDogRW1wdHkgJXMlJVtdIgorbXNnc3RyICJFNzA6ICVzJSVbXSB2YWPtby4iCisKKyM6IHJlZ2V4cC5jOjE3NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6IENhcuFjdGVyIGlsZWdhbCBkZXNwdelzIGRlICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6IEVyb3IgZGUgc2ludOF4aXMgZW4gJXN7Li4ufS4iCisKKyM6IHJlZ2V4cC5jOjI4NjMgcmVnZXhwLmM6MzAxNgorbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiBJbnRlcmNlcHTpIHVuIKtjcmFzaLs7IL9leHByZXNp824gcmVndWxhciBtdXkgY29tcGxlamE/IgorCisjOiByZWdleHAuYzozMDA0IHJlZ2V4cC5jOjMwMTMKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IGVsIHBhdHLzbiBoYSBwcm92b2NhZG8gdW4gZXJyb3Igq291dC1vZi1zdGFja7siCisKKyM6IHJlZ2V4cC5jOjMyNTgKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICJTdWJjb2luY2lkZW5jaWFzIGV4dGVybmFzOlxuIgorCisjOiBzY3JlZW4uYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0tJTNsZCBs7W5lYXMgcGxlZ2FkYXMiCisKKyM6IHNjcmVlbi5jOjc5OTYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBSRUVNUExBWkFNSUVOVE8gVklSVFVBTCIKKworIzogc2NyZWVuLmM6ODAwMAorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgUkVFTVBMQVpBUiIKKworIzogc2NyZWVuLmM6ODAwNQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgSU5WRVJUSVIiCisKKyM6IHNjcmVlbi5jOjgwMDcKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgSU5TRVJUQVIiCisKKyM6IHNjcmVlbi5jOjgwMTAKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAoaW5zZXJ0YXIpIgorCisjOiBzY3JlZW4uYzo4MDEyCittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiIChyZWVtcGxhemFyKSIKKworIzogc2NyZWVuLmM6ODAxNAorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKHJlZW1wbGF6YW1pZW50byB2aXJ0dWFsKSIKKworIzogc2NyZWVuLmM6ODAxNworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBIZWJyZW8iCisKKyM6IHNjcmVlbi5jOjgwMjgKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIg4XJhYmUiCisKKyM6IHNjcmVlbi5jOjgwMzEKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKGlkaW9tYSkiCisKKyM6IHNjcmVlbi5jOjgwMzUKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiIChwZWdhcikiCisKKyM6IHNjcmVlbi5jOjgwNDgKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIgVklTVUFMIgorCisjOiBzY3JlZW4uYzo4MDQ5Cittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgTM1ORUEgVklTVUFMIgorCisjOiBzY3JlZW4uYzo4MDUwCittc2dpZCAiIFZJU1VBTCBCTE9DSyIKK21zZ3N0ciAiIEJMT1FVRSBWSVNVQUwiCisKKyM6IHNjcmVlbi5jOjgwNTEKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIgU0VMRUNDSU9OQVIiCisKKyM6IHNjcmVlbi5jOjgwNTIKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiBTRUxFQ0NJT05BUiBMzU5FQSIKKworIzogc2NyZWVuLmM6ODA1MworbXNnaWQgIiBTRUxFQ1QgQkxPQ0siCittc2dzdHIgIiBTRUxFQ0NJT05BUiBCTE9RVUUiCisKKyM6IHNjcmVlbi5jOjgwNjggc2NyZWVuLmM6ODEzMQorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAiZ3JhYmFuZG8iCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJMYSBi+nNxdWVkYSBoYSBsbGVnYWRvIGFsIFBSSU5DSVBJTywgY29udGludWFuZG8gZGVzZGUgZWwgRklOQUwuIgorCisjOiBzZWFyY2guYzozOAorbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAiTGEgYvpzcXVlZGEgaGEgbGxlZ2FkbyBhbCBGSU5BTCwgY29udGludWFuZG8gZGVzZGUgZWwgUFJJTkNJUElPIgorCisjOiBzZWFyY2guYzo1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogQ2FkZW5hIGRlIGL6c3F1ZWRhIG5vIHbhbGlkYTogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IExhIGL6c3F1ZWRhIGhhIGxsZWdhZG8gYWwgUFJJTkNJUElPIHNpbiBjb2luY2lkZW5jaWFzIGNvbjogJXMiCisKKyM6IHNlYXJjaC5jOjg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IExhIGL6c3F1ZWRhIGhhIGxsZWdhZG8gYWwgRklOQUwgc2luIGNvaW5jaWRlbmNpYXMgY29uOiAlcyIKKworIzogc2VhcmNoLmM6MTI0OQorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogRXNwZXJhYmEgqz+7IG8gqy+7IGRlc3B16XMgZGUgqzu7IgorCisjOiBzZWFyY2guYzozNzU5Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAoaW5jbHV5ZSBsYSBjb2luY2lkZW5jaWEgbW9zdHJhZGEgcHJldmlhbWVudGUpLiIKKworIyAgY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3NzkKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gRmljaGVyb3MgaW5jbHVpZG9zICIKKworIzogc2VhcmNoLmM6Mzc4MQorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIm5vIGxvIGVuY29udHLpIgorCisjOiBzZWFyY2guYzozNzgyCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiZW4gbGEgcnV0YSAtLS1cbiIKKworIzogc2VhcmNoLmM6MzgzOQorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAoWWEgbG8gZW51bWVy6SkiCisKKyM6IHNlYXJjaC5jOjM4NDEKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICBOTyBTRSBFTkNPTlRS0yIKKworIzogc2VhcmNoLmM6Mzg5MworIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAiRXhwbG9yYW5kbyBlbCBmaWNoZXJvIGluY2x1aWRvOiAlcyIKKworIzogc2VhcmNoLmM6NDExMQorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogTGEgY29pbmNpZGVuY2lhIGVzdOEgZW4gbGEgbO1uZWEgZW4gY3Vyc28uIgorCisjOiBzZWFyY2guYzo0MjU0Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIlNlIGhhbiBlbmNvbnRyYWRvIHRvZG9zIGxvcyBmaWNoZXJvcyBpbmNsdWlkb3MiCisKKyM6IHNlYXJjaC5jOjQyNTYKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiTm8gaGF5IGZpY2hlcm9zIGluY2x1aWRvcyIKKworIzogc2VhcmNoLmM6NDI3MgorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogTm8gc2UgcHVkbyBlbmNvbnRyYXIgbGEgZGVmaW5pY2nzbiIKKworIzogc2VhcmNoLmM6NDI3NAorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTm8gc2UgcHVkbyBlbmNvbnRyYXIgZWwgcGF0cvNuIgorCisjOiBzeW50YXguYzozMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiBBcmd1bWVudG8gaWxlZ2FsOiAlcyIKKworIzogc3ludGF4LmM6MzIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogTm8gZXhpc3RlIHRhbCBhZ3J1cGFtaWVudG8gc2ludOFjdGljbzogJXMiCisKKyM6IHN5bnRheC5jOjMzOTQKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIk5vIGhheSDtdGVtcyBzaW504WN0aWNvcyBkZWZpbmlkb3MgcGFyYSBlc3RlIKtidWZmZXK7IgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJTaW5jcm9uaXphbmRvIGVuIGxvcyBjb21lbnRhcmlvcyBkZSBlc3RpbG8gq0O7LiIKKworIzogc3ludGF4LmM6MzQxMAorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgIm5vIGhheSBzaW5jcm9uaXphY2nzbiIKKworIzogc3ludGF4LmM6MzQxMworbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAiQ29tZW56YW5kbyBzaW5jcm9uaXphY2nzbi4iCisKKyM6IHN5bnRheC5jOjM0MTUgc3ludGF4LmM6MzQ5MAorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIiBs7W5lYXMgYW50ZXMgZGUgbGEgbO1uZWEgc3VwZXJpb3IiCisKKyM6IHN5bnRheC5jOjM0MjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDNdGVtcyBkZSBzaW5jcm9uaXphY2nzbiBkZSBzaW504XhpcyAtLS0iCisKKyM6IHN5bnRheC5jOjM0MjUKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorInNpbmNyb25pemFuZG8gZW4gbG9zIO10ZW1zIgorCisjOiBzeW50YXguYzozNDMxCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEl0ZW1zIHNpbnThY3RpY29zIC0tLSIKKworIzogc3ludGF4LmM6MzQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogTm8gZXhpc3RlIHRhbCBhZ3J1cGFtaWVudG8gc2ludOFjdGljbzogJXMiCisKKyM6IHN5bnRheC5jOjM0ODAKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAibe1uaW1vIgorCisjOiBzeW50YXguYzozNDg3Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm3heGltbyIKKworIzogc3ludGF4LmM6MzQ5OQorbXNnaWQgIjsgbWF0Y2ggIgorbXNnc3RyICI7IGNvaW5jaWRlIgorCisjOiBzeW50YXguYzozNTAxCittc2dpZCAiIGxpbmUgYnJlYWtzIgorbXNnc3RyICIgbO1uZWFzIGRlIHF1aWVicmUiCisKKyM6IHN5bnRheC5jOjQxMzUKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKKworIzogc3ludGF4LmM6NDE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IE5vIHNlIGVuY3VlbnRyYSBlbCBpdGVtIGRlIHJlZ2nzbiBwYXJhICVzIgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IGVsIGNvbnRlbmlkbyBkZWwgYXJndW1lbnRvIG5vIHNlIGFjZXB0YSBhcXXtIgorCisjOiBzeW50YXguYzo0MTk4Cittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IGVsIGFyZ3VtZW50byCrY29udGFpbmVkaW67IG5vIHNlIGFjZXB0YSBhcXXtIgorCisjOiBzeW50YXguYzo0Mjc2Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6IEhhY2UgZmFsdGEgdW4gbm9tYnJlIGRlIGZpY2hlcm8iCisKKyM6IHN5bnRheC5jOjQ2MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBGYWx0YSBlbCCrPbs6ICVzIgorCisjOiBzeW50YXguYzo0NzcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBBcmd1bWVudG9zIGluc3VmaWNpZW50ZXM6IHJlZ2nzbiBkZSBzaW50YXhpcyAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBObyBzZSBoYSBlc3BlY2lmaWNhZG8gdW5hIGFncnVwYWNp824iCisKKyM6IHN5bnRheC5jOjUxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogTm8gaGF5IHVuIGRlbGltaXRhZG9yIGRlIHBhdHLzbjogJXMiCisKKyM6IHN5bnRheC5jOjUyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogQmFzdXJhIGRlc3B16XMgZGVsIHBhdHLzbjogJXMiCisKKyM6IHN5bnRheC5jOjUzMDUKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICIiCisiRTQwMzogU2luY3Jvbml6YWNp824gZGUgc2ludOF4aXM6IFNlIGVzcGVjaWZpY/MgZG9zIHZlY2VzIHVuIHBhdHLzbiBkZSAiCisiY29udGludWFjaW9uZXMgZGUgbO1uZWEuIgorCisjOiBzeW50YXguYzo1MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogQXJndW1lbnRvcyBpbGVnYWxlczogJXMiCisKKyM6IHN5bnRheC5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogRmFsdGEgZWwgc2lnbm8gaWd1YWw6ICVzIgorCisjOiBzeW50YXguYzo1NDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogQXJndW1lbnRvIHZhY+1vOiAlcyIKKworIzogc3ludGF4LmM6NTQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyBubyBlc3ThIHBlcm1pdGlkbyBhcXXtIgorCisjOiBzeW50YXguYzo1NDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgZGViZSBzZXIgZWwgcHJpbWVybyBlbiBsYSBsaXN0YSBkZSBjb250ZW5pZG8iCisKKyM6IHN5bnRheC5jOjU1MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogTm9tYnJlIGRlIGdydXBvIGRlc2Nvbm9jaWRvOiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IFN1YmNvbWFuZG8gqzpzeW50YXi7IG5vIHbhbGlkbzogJXMiCisKKyM6IHN5bnRheC5jOjYxMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IGdydXBvIHJlYWx6YWRvIG5vIGVuY29udHJhZG86ICVzIgorCisjOiBzeW50YXguYzo2MTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBBcmd1bWVudG9zIGluc3VmaWNpZW50ZXM6IKs6aGlnaGxpZ2h0IGxpbmsgJXO7IgorCisjOiBzeW50YXguYzo2MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogRGVtYXNpYWRvcyBhcmd1bWVudG9zOiCrOmhpZ2hsaWdodCBsaW5rICVzuyIKKworIzogc3ludGF4LmM6NjE4NworbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiIgorIkU0MTQ6IEVsIGdydXBvIHRpZW5lIG9wY2lvbmVzIGFzaWduYWRhcywgc2UgaGEgaWdub3JhZG8gZWwgZW5sYWNlIGRlICIKKyJjb2xvcml6YWNp824uIgorCisjOiBzeW50YXguYzo2MzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IFNpZ25vIGlndWFsIGluZXNwZXJhZG86ICVzIgorCisjOiBzeW50YXguYzo2MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6IGZhbHRhIGVsIHNpZ25vIGlndWFsOiAlcyIKKworIzogc3ludGF4LmM6NjM4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogZmFsdGEgZWwgYXJndW1lbnRvOiAlcyIKKworIzogc3ludGF4LmM6NjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogVmFsb3IgaWxlZ2FsOiAlcyIKKworIzogc3ludGF4LmM6NjUzNgorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IGNvbG9yIGRlIHByaW1lciBwbGFubyBkZXNjb25vY2lkbyIKKworIzogc3ludGF4LmM6NjU0NworbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IENvbG9yIGRlIGZvbmRvIGRlc2Nvbm9jaWRvIgorCisjOiBzeW50YXguYzo2NjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogTm9tYnJlIG8gbvptZXJvIGRlIGNvbG9yIGRlc2Nvbm9jaWRvOiAlcyIKKworIzogc3ludGF4LmM6NjgxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogY/NkaWdvIGRlIHRlcm1pbmFsIGRlbWFzaWFkbyBsYXJnbzogJXMiCisKKyM6IHN5bnRheC5jOjY4NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IEFyZ3VtZW50byBpbGVnYWw6ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDogSGF5IGRlbWFzaWFkb3MgYXRyaWJ1dG9zIGRlIHJlYWx6YWRvIGVuIHVzbyIKKworIzogc3ludGF4LmM6NzkxMQorbXNnaWQgIkU2Njk6IFVucHJpbnRhYmxlIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJFNjY5OiBDYXJhY3RlciBubyBpbXByaW1pYmxlIGVuIGVsIG5vbWJyZSBkZWwgZ3J1cG8uIgorCisjIEVzIHByZWZlcmlibGUgdHJhZHVjaXIgImludmFsaWQiIHBvciAibm8gW2VzXSB24WxpZG8iIHB1ZXMgImluduFsaWRvIiAKKyMgbm8gZXMgbG8gc3VmaWNpZW50ZW1lbnRlIGNsYXJvLiBBZGVt4XMsIG5vIGVzIHBvbO10aWNhbWVudGUgY29ycmVjdG8gOi0pCisjIEFMVgorIy4gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHNpbmNlIHRoZXJlIHByZXZpb3VzbHkgd2FzIG5vIGNoZWNrIG9ubHkKKyMuICogZ2l2ZSBhIHdhcm5pbmcuCisjOiBzeW50YXguYzo3OTE4Cittc2dpZCAiVzE4OiBJbnZhbGlkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJXMTg6IEhheSB1biBjYXLhY3RlciBubyB24WxpZG8gZW4gZWwgbm9icmUgZGVsIGdydXBvLiIKKworIzogdGFnLmM6OTAKK21zZ2lkICJFNTU1OiBhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU1OiBFbiBlbCBmaW5hbCBkZSBsYSBwaWxhIGRlIGNvcnJlY2nzbiBy4XBpZGEiCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogRW4gZWwgcHJpbmNpcGlvIGRlIGxhIHBpbGEgZGUgY29ycmVjafNuIHLhcGlkYSIKKworIzogdGFnLmM6NDEyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IE5vIHNlIHB1ZWRlIGlyIGFudGVzIGRlbCBwcmltZXIgq3RhZ7sgY29pbmNpZGVudGUiCisKKyM6IHRhZy5jOjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogq3RhZ7sgbm8gZW5jb250cmFkbzogJXMiCisKKyM6IHRhZy5jOjU4MworbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBtYXJjYSB0aXBvIHByaSIKKworIzogdGFnLmM6NTg2Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICJmaWNoZXJvXG4iCisKKyMgICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIyAgKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjc0NAorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiSW50cm9kdXpjYSBlbCBuuiBkZSBsYSBlbGVjY2nzbiAoPElOVFJPPiBwYXJhIGFib3J0YXIpOiAiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogSGF5IHPzbG8gdW4gq3RhZ7sgcXVlIGNvaW5jaWRlIgorCisjOiB0YWcuYzo3ODYKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDIwOiBObyBzZSBwdWVkZSBpciBt4XMgYWxs4SBkZWwg+mx0aW1vIKt0YWe7IHF1ZSBjb2luY2lkYSIKKworIzogdGFnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJObyBleGlzdGUgZWwgZmljaGVybyCrJXO7LiIKKworIyAgR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICKrdGFnuyAlZCBkZSAlZCVzIgorCisjOiB0YWcuYzo4MjYKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIG8gbeFzIgorCisjOiB0YWcuYzo4MjgKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICBVc28gZGUgdW4gq3RhZ7sgY29uIGNhamEgZGlmZXJlbnRlIgorCisjOiB0YWcuYzo4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IEVsIGZpY2hlcm8gqyVzuyBubyBleGlzdGUiCisKKyMgIEhpZ2hsaWdodCB0aXRsZQorIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIEEgq3RhZ7sgICAgICAgIERFU0RFIGxhIGztbmVhICAgZW4gZWwgZmljaGVyby90ZXh0byIKKworIzogdGFnLmM6MTM2MworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJCdXNjYW5kbyBlbCBmaWNoZXJvIGRlIKt0YWdzuyAlcyIKKworIzogdGFnLmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogUnV0YSBkZWwgZmljaGVybyBkZSCrdGFnc7sgdHJ1bmNhZGEgcGFyYSAlc1xuIgorCisjOiB0YWcuYzoyMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBFcnJvciBkZSBmb3JtYXRvIGVuIGVsIGZpY2hlcm8gZGUgq3RhZ3O7IKslc7siCisKKyM6IHRhZy5jOjIyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICJBZGVsYW50ZSBkZWwgYnl0ZSAlbGQiCisKKyM6IHRhZy5jOjIyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiBGaWNoZXJvIGRlIKt0YWdzuyBzaW4gb3JkZW5hcjogJXMiCisKKyMgIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjI4MAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogTm8gaGF5IGZpY2hlcm8gZGUgq3RhZ3O7IgorCisjOiB0YWcuYzozMDE2Cittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogTm8gc2UgcHVlZGUgZW5jb250cmFyIGVsIHBhdHLzbiBkZSCrdGFnc7siCisKKyM6IHRhZy5jOjMwMjcKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IE5vIHNlIHB1ZG8gZW5jb250cmFyIGVsIKt0YWe7LCChYWRpdmlubyBzb2xhbWVudGUhIgorCisjOiB0ZXJtLmM6MTc1OQorbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyBkZXNjb25vY2lkby4gTG9zIHRlcm1pbmFsZXMgaW5jb3Jwb3JhZG9zIGRpc3BvbmlibGVzIHNvbjoiCisKKyM6IHRlcm0uYzoxNzgzCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJVc2FuZG8gJyBwb3IgZGVmZWN0by4iCisKKyM6IHRlcm0uYzoyMTQxCittc2dpZCAiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJFNTU3OiBObyBwdWVkbyBhYnJpciBlbCBmaWNoZXJvIKt0ZXJtY2Fwuy4iCisKKyM6IHRlcm0uYzoyMTQ1Cittc2dpZCAiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJFNTU4OiBObyBzZSBoYSBlbmNvbnRyYWRvIGxhIGRlZmluaWNp824gZGVsIHRlcm1pbmFsIGVuIKt0ZXJtaW5mb7suIgorCisjOiB0ZXJtLmM6MjE0NworbXNnaWQgIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTU5OiBObyBzZSBoYSBlbmNvbnRyYWRvIGxhIGRlZmluaWNp824gZGVsIHRlcm1pbmFsIGVuIKt0ZXJtY2Fwuy4iCisKKyM6IHRlcm0uYzoyMzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBsYSBlbnRyYWRhIKslc7sgbm8gZXhpc3RlIGVuIGVsIGZpY2hlcm8gq3Rlcm1jYXC7LiIKKworIzogdGVybS5jOjI3ODAKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzogU2UgbmVjZXNpdGEgbGEgY2FwYWNpZGFkIGRlIHRlcm1pbmFsIKtjbbsiCisKKyMgIEhpZ2hsaWdodCB0aXRsZQorIyAgSGlnaGxpZ2h0IHRpdGxlCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTkwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBUZWNsYXMgZGVsIHRlcm1pbmFsIC0tLSIKKworIzogdWkuYzoyNTgKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJJbmljaekgdW5hIKtzaGVsbLsgbnVldmFcbiIKKworIzogdWkuYzoxODQxCittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogZXJyb3IgYWwgbGVlciBsYSBlbnRyYWRhLCBzYWxpZW5kby4uLlxuIgorCisjICBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzo0MDUKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIk5vIGVzIHBvc2libGUgZGVzaGFjZXI7IGNvbnRpbnVhbmRvIGRlIHRvZG9zIG1vZG9zIgorCisjOiB1bmRvLmM6NTYxCittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IKt1X3VuZG+7OiBu+m1lcm9zIGRlIGztbmVhIGVycvNuZW9zIgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIjEgY2FtYmlvIgorCisjOiB1bmRvLmM6NzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGQgY2FtYmlvcyIKKworIzogdW5kby5jOjgxMgorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiBsYSBsaXN0YSBkZSBkZXNoYWNlciBzZSBkYfHzLiIKKworIzogdW5kby5jOjg0NAorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiBmYWx0YSBsYSBs7W5lYSBkZXNoYWNlci4iCisKKyMgIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzo3MzkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzafNuIEdVSSBkZSAxNi8zMiBiaXRzIHBhcmEgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjc0MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNp824gR1VJIGRlIDMyIGJpdHMgcGFyYSBNUy1XaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6NzQ0Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgZW4gbW9kbyBXaW4zMnMiCisKKyM6IHZlcnNpb24uYzo3NDYKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIGNvbiBzb3BvcnRlIHBhcmEgT0xFIgorCisjOiB2ZXJzaW9uLmM6NzQ5Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNp824gZGUgMzIgYml0cyBwYXJhIGNvbnNvbGEgZGUgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjc1MworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiBkZSAxNiBiaXRzIHBhcmEgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjc1NworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzafNuIGRlIDMyIGJpdHMgcGFyYSBNUy1ET1MiCisKKyM6IHZlcnNpb24uYzo3NTkKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiBkZSAxNiBiaXRzIHBhcmEgTVMtRE9TIgorCisjOiB2ZXJzaW9uLmM6NzY1Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzafNuIFggKHVuaXgpIHBhcmEgTWFjT1MiCisKKyM6IHZlcnNpb24uYzo3NjcKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiBYIHBhcmEgTWFjT1MiCisKKyM6IHZlcnNpb24uYzo3NzAKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNp824gcGFyYSBNYWNPUyIKKworIzogdmVyc2lvbi5jOjc3NQorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzafNuIHBhcmEgUklTQyBPUyIKKworIzogdmVyc2lvbi5jOjc4NQorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJQYXJjaGVzIGluY2x1aWRvczogIgorCisjOiB2ZXJzaW9uLmM6ODExIHZlcnNpb24uYzoxMTc5Cittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJNb2RpZmljYWRvIHBvciAiCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiQ29tcGlsYWRvICIKKworIzogdmVyc2lvbi5jOjgyMQorbXNnaWQgImJ5ICIKK21zZ3N0ciAicG9yICIKKworIzogdmVyc2lvbi5jOjgzMworbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiCrZW5vcm1luyAiCisKKyM6IHZlcnNpb24uYzo4MzYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiCrZ3JhbmRluyAiCisKKyM6IHZlcnNpb24uYzo4MzkKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2nzbiCrbm9ybWFsuyAiCisKKyM6IHZlcnNpb24uYzo4NDIKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzafNuIKtwZXF1ZfFhuyAiCisKKyM6IHZlcnNpb24uYzo4NDQKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNp824gq2RpbWludXRhuyAiCisKKyM6IHZlcnNpb24uYzo4NTAKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgInNpbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgImNvbiBHVUkgR1RLMi1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4NTcKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJjb24gR1VJIEdUSy1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4NjEKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAiY29uIEdVSSBHVEsyLiIKKworIzogdmVyc2lvbi5jOjg2MworbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgImNvbiBHVUkgR1RLLiIKKworIzogdmVyc2lvbi5jOjg2OAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgImNvbiBHVUkgWDExLU1vdGlmLiIKKworIzogdmVyc2lvbi5jOjg3MgorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJjb24gR1VJIFgxMS1uZVh0YXcuIgorCisjOiB2ZXJzaW9uLmM6ODc0Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgImNvbiBHVUkgWDExLUF0aGVuYS4iCisKKyM6IHZlcnNpb24uYzo4NzgKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAiY29uIEdVSSBwYXJhIEJlT1MuIgorCisjOiB2ZXJzaW9uLmM6ODgxCittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAiY29uIEdVSSBwYXJhIFBob3Rvbi4iCisKKyM6IHZlcnNpb24uYzo4ODQKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgImNvbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODg3Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAiY29uIENhcmJvbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODkwCittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJjb24gQ29jb2EgR1VJLiIKKworIzogdmVyc2lvbi5jOjg5MworbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgImNvbiBHVUkgKGNs4XNpY28pLiIKKworIzogdmVyc2lvbi5jOjkwNAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgQXNwZWN0b3MgaW5jbHVpZG9zICgrKSBvIG5vICgtKTpcbiIKKworIzogdmVyc2lvbi5jOjkxNgorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICBmaWNoZXJvIKt2aW1yY7sgZGVsIHNpc3RlbWE6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTIxCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIGZpY2hlcm8gq3ZpbXJjuyBkZWwgdXN1YXJpbzogXCIiCisKKyM6IHZlcnNpb24uYzo5MjYKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgMrogZmljaGVybyCrdmltcmO7IGRlbCB1c3VhcmlvOiBcIiIKKworIzogdmVyc2lvbi5jOjkzMQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDNlciBmaWNoZXJvIKt2aW1yY7sgZGVsIHVzdWFyaW86IFwiIgorCisjOiB2ZXJzaW9uLmM6OTM2Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICBmaWNoZXJvIKtleHJjuyBkZWwgdXN1YXJpbzogXCIiCisKKyM6IHZlcnNpb24uYzo5NDEKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgIDK6IGZpY2hlcm8gq2V4cmO7IGRlbCB1c3VhcmlvOiBcIiIKKworIzogdmVyc2lvbi5jOjk0NworbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIGZpY2hlcm8gq2d2aW1yY7sgZGVsIHNpc3RlbWE6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTUxCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgZmljaGVybyCrZ3ZpbXJjuyBkZWwgdXN1YXJpbzogXCIiCisKKyM6IHZlcnNpb24uYzo5NTUKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAyuiBmaWNoZXJvIKtndmltcmO7IGRlbCB1c3VhcmlvOiBcIiIKKworIzogdmVyc2lvbi5jOjk2MAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiM2VyIGZpY2hlcm8gq2d2aW1yY7sgZGVsIHVzdWFyaW86IFwiIgorCisjOiB2ZXJzaW9uLmM6OTY3Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgIGZpY2hlcm8gZGUgbWVu+iBkZWwgc2lzdGVtYTogXCIiCisKKyM6IHZlcnNpb24uYzo5NzUKK21zZ2lkICIgIGZhbGwtYmFjayBmb3IgJFZJTTogXCIiCittc2dzdHIgIiAgICAgICAgICAgIGxvY2FsaXphY2nzbiBkZSAkVklNOiBcIiIKKworIzogdmVyc2lvbi5jOjk4MQorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICAgICBsb2NhbGl6YWNp824gZGUgJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTg1Cittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAiQ29tcGlsYWNp8246ICIKKworIzogdmVyc2lvbi5jOjk5MQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIkNvbXBpbGFkb3I6ICIKKworIzogdmVyc2lvbi5jOjk5NgorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiRW5sYXphZG86ICIKKworIzogdmVyc2lvbi5jOjEwMDEKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIENPTVBJTEFDSdNOIENPTiBTzU1CT0xPUyBERSBERVBVUkFDSdNOIgorCisjOiB2ZXJzaW9uLmM6MTA0MAorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWSSBNZWpvcmFkbyIKKworIzogdmVyc2lvbi5jOjEwNDIKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyc2nzbiAiCisKKyM6IHZlcnNpb24uYzoxMDQzCittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJwb3IgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorCisjOiB2ZXJzaW9uLmM6MTA0NworbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBlcyBj82RpZ28gYWJpZXJ0byB5IHNlIHB1ZWRlIGRpc3RyaWJ1aXIgbGlicmVtZW50ZSIKKworIzogdmVyc2lvbi5jOjEwNDkKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAioUF5dWRlIGEgbG9zIG5p8W9zIHBvYnJlcyBkZSBVZ2FuZGEhIgorCisjOiB2ZXJzaW9uLmM6MTA1MAorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgImVzY3JpYmEgIKs6aGVscCBpY2NmPEludHJvPrsgICAgcGFyYSBt4XMgaW5mb3JtYWNp824gICIKKworIzogdmVyc2lvbi5jOjEwNTIKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJlc2NyaWJhICCrOnE8SW50cm8+uyAgICAgICAgICAgIHBhcmEgc2FsaXIgICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTA1MworbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgImVzY3JpYmEgIKs6aGVscDxJbnRybz4gbyA8RjE+uyAgcGFyYSBvYnRlbmVyIGF5dWRhICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDU0Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiZXNjcmliYSCrOmhlbHAgdmVyc2lvbjY8SW50cm8+uyBwYXJhIGluZm9ybWFjafNuIGRlIGxhIHZlcnNp824iCisKKyM6IHZlcnNpb24uYzoxMDU3Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIkVqZWN1dGFuZG8gZW4gbW9kbyBjb21wYXRpYmxlIGNvbiBWaSIKKworIzogdmVyc2lvbi5jOjEwNTgKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICJlc2NyaWJhICCrOnNldCBub2NwPEludHJvPrsgIHBhcmEgbG9zIHZhbG9yZXMgcHJlZGVmaW5pZG9zIGRlIFZpbSIKKworIzogdmVyc2lvbi5jOjEwNTkKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJlc2NyaWJhIKs6aGVscCBjcC1kZWZhdWx0PEludHJvPrsgICAgICAgIHBhcmEgbeFzIGluZm9ybWFjafNuIgorCisjOiB2ZXJzaW9uLmM6MTA3NAorbXNnaWQgIm1lbnUgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbvogIEF5dWRhLT5BeXVkZSBhIGxvcyBuafFvcyBodelyZmFub3MgICAgICBwYXJhIG3hcyBpbmZvcm1hY2nzbiAiCisKKyM6IHZlcnNpb24uYzoxMDc2Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiRWplY3VjafNuIG5vIG1vZGFsLCBlbCB0ZXh0byBlc2NyaXRvIHNlIGluc2VydGEgZGlyZWN0YW1lbnRlIgorCisjOiB2ZXJzaW9uLmM6MTA3NworbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIm1lbnUgRWRpdGFyLT5PcGNpb25lcyBnbG9iYWxlcy0+QWN0aXZhci9EZXNhY3RpdmFyIG1vZG8gZGUgaW5zZXJjafNuIgorCisjOiB2ZXJzaW9uLmM6MTA3OAorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhIGRvcyBtb2RvcyAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTA4MgorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIiIKKyJtZW51IEVkaXRhci0+T3BjaW9uZXMgZ2xvYmFsZXMtPkFjdGl2YXIvRGVzYWN0aXZhciBjb21wYXRpYmlsaWRhZCBjb24gVmkiCisKKyM6IHZlcnNpb24uYzoxMDgzCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmEgbG9zIHZhbG9yZXMgcHJlZGV0ZXJtaW5hZG9zIGRlIFZpbSIKKworIzogdmVyc2lvbi5jOjExMzAKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIqFQYXRyb2NpbmUgZWwgZGVzYXJyb2xsbyBkZSBWaW0hIgorCisjOiB2ZXJzaW9uLmM6MTEzMQorbXNnaWQgIkJlY29tZSBhIHJlZ2lzdGVyZWQgVmltIHVzZXIhIgorbXNnc3RyICKhQ29udmllcnRhc2UgZW4gdW4gdXN1YXJpbyByZWdpc3RyYWRvIGRlIFZpbSEiCisKKyM6IHZlcnNpb24uYzoxMTM0Cittc2dpZCAidHlwZSAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAiZXNjcmliYSAgOmhlbHAgc3BvbnNvcjxJbnRybz4gICAgIHBhcmEgbeFzIGluZm9ybWFjafNuICAiCisKKyM6IHZlcnNpb24uYzoxMTM1Cittc2dpZCAidHlwZSAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAiZXNjcmliYSCrOmhlbHAgcmVnaXN0ZXI8SW50cm8+uyAgICBwYXJhIG3hcyBpbmZvcm1hY2nzbiAgIgorCisjOiB2ZXJzaW9uLmM6MTEzNworbXNnaWQgIm1lbnUgIEhlbHAtPlNwb25zb3IvUmVnaXN0ZXIgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbnUgIEF5dWRhLT5CZW5lZmFjdG9yL1JlZ+1zdHJlc2UgIHBhcmEgbeFzIGluZm9ybWFjafNuLiIKKworIzogdmVyc2lvbi5jOjExNDcKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICJBVklTTzogc2UgaGEgZGV0ZWN0YWRvIFdpbmRvd3MgOTUvOTgvTUUiCisKKyM6IHZlcnNpb24uYzoxMTUwCittc2dpZCAidHlwZSAgOmhlbHAgd2luZG93czk1PEVudGVyPiAgZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAiZXNjcmliYTogqzpoZWxwIHdpbmRvd3M5NTxJbnRybz67IHBhcmEgbeFzIGluZm9ybWFjafNuIgorCisjOiB3aW5kb3cuYzoyMDMKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogTm8gaGF5IHVuYSB2ZW50YW5hIGRlIHZpc3RhIHByZXZpYSIKKworIzogd2luZG93LmM6NTgxCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogTm8gc2UgcHVlZGUgZGl2aWRpciBhcnJpYmEtaXpxIHkgYWJham8tZGVyIGFsIG1pc21vIHRpZW1wbyIKKworIzogd2luZG93LmM6MTM0MAorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogTm8gc2UgcHVlZGUgcm90YXIgY3VhbmRvIG90cmEgdmVudGFuYSBlc3ThIGRpdmlkaWRhLiIKKworIzogd2luZG93LmM6MTgzNgorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogTm8gc2UgcHVlZGUgY2VycmFyIGxhIPpsdGltYSB2ZW50YW5hLiIKKworIzogd2luZG93LmM6MjU2NworbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJT82xvIGhheSB1bmEgdmVudGFuYS4iCisKKyM6IHdpbmRvdy5jOjI2MTQKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogT3RyYSB2ZW50YW5hIGNvbnRpZW5lIGNhbWJpb3MuIgorCisjOiB3aW5kb3cuYzo0NDgwCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogTm8gaGF5IHVuIG5vbWJyZSBkZSBmaWNoZXJvIGJham8gZWwgY3Vyc29yIgorCisjOiB3aW5kb3cuYzo0NTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogTm8gc2UgcHVlZGUgZW5jb250cmFyIGVsIGZpY2hlcm8gqyVzuyBlbiBsYSBydXRhIgorCisjOiBpZl9wZXJsLnhzOjMyNiBnbG9iYWxzLmg6MTIzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiBObyBzZSBwdWRvIGNhcmdhciBsYSBiaWJsaW90ZWNhIGRpbuFtaWNhICVzLiIKKworIzogaWZfcGVybC54czo1NTQKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgUGVybCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogTG8gc2llbnRvLCBlc3RlIGNvbWFuZG8gZXN04SBkZXNhY3RpdmFkbywgbm8gc2UgcHVkbyBjYXJnYXIgbGEgIgorImJpYmxpb3RlY2EgZGlu4W1pY2EgZGUgUGVybC4iCisKKyM6IGlmX3BlcmwueHM6NjA3Cittc2dpZCAiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIgorbXNnc3RyICIiCisiRTI5OTogTm8gc2UgcGVybWl0ZSBsYSBldmFsdWFjafNuIGRlIGPzZGlnbyBQZXJsIGVuIGxhIGNhamEgZGUgYXJlbmEgc2luIGVsICIKKyJ1c28gZGVsIG3zZHVsbyCrU2FmZbsuIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4MworbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAiRWRpdGFyIGNvbiBWaW1zICZt+mx0aXBsZXMiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg5Cittc2dpZCAiRWRpdCB3aXRoIHNpbmdsZSAmVmltIgorbXNnc3RyICJFZGl0YXIgY29uIHVuIHNvbG8gJlZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTgKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAiJkRpZmYgY29uIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTEKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiRWRpdGFyIGNvbiAmVmltIgorCisjICBOb3cgY29uY2F0ZW5hdGUKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MzMKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAiRWRpdGFyIGNvbiB1biBWaW0gZXhpc3RlbnRlIC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiRWRpdGFyIGVsKGxvcykgZmljaGVyb3Mgc2VsZWNjaW9uYWRvKHMpIGNvbiBWaW0iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg1IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY2Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICJFcnJvciBhbCBjcmVhciBlbCBwcm9jZXNvOiBBc2Vn+nJlc2UgZGUgcXVlIGd2aW0gZXMgZW4gc3Ugq3BhdGi7ISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZXJyb3IgZW4gZ3ZpbWV4dC5kbGwiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODk5Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICKhTGEgcnV0YSBkZSBhY2Nlc28gZXMgZGVtYXNpYWRvIGxhcmdhISIKKworIzogZ2xvYmFscy5oOjEwMjYKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLU5vIGhheSBs7W5lYXMgZW4gZWwgYnVmZmVyLS0iCisKKyMgICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMgICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTg5Cittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiBFbCBjb21hbmRvIGFib3J08y4iCisKKyM6IGdsb2JhbHMuaDoxMTkwCittc2dpZCAiRTQ3MTogQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkU0NzE6IFNlIHJlcXVpZXJlIHVuIGFyZ3VtZW50by4iCisKKyM6IGdsb2JhbHMuaDoxMTkxCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIGRlYmVy7WEgaXIgc2VndWlkbyBkZSAvLCA/IG8gJi4iCisKKyM6IGdsb2JhbHMuaDoxMTkzCittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiIgorIkUxMTogTm8gZXMgduFsaWRvIGVuIGxhIHZlbnRhbmEgZGUgbGEgbO1uZWEgZGUgY29tYW5kb3M6IDxDUj4gZWplY3V0YSwgQ1RSTC0iCisiQyBzYWxlLiIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIiIKKyJFMTI6IENvbWFuZG8gbm8gcGVybWl0aWRvIGRlc2RlIGV4cmMvdmltcmMgZW4gZWwgZGlyIGVuIGN1cnNvIG8gYWwgYnVzY2FyICIKKyKrdGFnc7siCisKKyM6IGdsb2JhbHMuaDoxMTk3Cittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IEZhbHRhIKs6ZW5kaWa7IgorCisjOiBnbG9iYWxzLmg6MTE5OAorbXNnaWQgIkU2MDA6IE1pc3NpbmcgOmVuZHRyeSIKK21zZ3N0ciAiRTYwMDogRmFsdGEgqzplbmR0cnm7IgorCisjOiBnbG9iYWxzLmg6MTE5OQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiBGYWx0YSCrOmVuZHdoaWxluyIKKworIzogZ2xvYmFscy5oOjEyMDAKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IKs6ZW5kd2hpbGW7IHNpbiCrOndoaWxluy4iCisKKyM6IGdsb2JhbHMuaDoxMjAyCittc2dpZCAiRTEzOiBGaWxlIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTM6IEVsIGZpY2hlcm8geWEgZXhpc3RlICh1c2UgISBwYXJhIHNvYnJlZXNjcmliaXIpIgorCisjOiBnbG9iYWxzLmg6MTIwMworbXNnaWQgIkU0NzI6IENvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJFNDcyOiBGYWxs8yBlbCBjb21hbmRvIgorCisjOiBnbG9iYWxzLmg6MTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiBDb25qdW50byBkZSBmdWVudGVzIGRlIGltcHJlc2nzbiBkZXNjb25vY2lkbzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IEZ1ZW50ZSBkZSBpbXByZXNp824gZGVzY29ub2NpZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IExhIGZ1ZW50ZSBkZSBpbXByZXNp824gqyVzuyBubyBlcyBkZSBhbmNobyBmaWpvIgorCisjOiBnbG9iYWxzLmg6MTIxNAorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiBFcnJvciBpbnRlcm5vLiIKKworIzogZ2xvYmFscy5oOjEyMTUKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiSW50ZXJydW1waWRvIgorCisjOiBnbG9iYWxzLmg6MTIxNgorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IERpcmVjY2nzbiBubyB24WxpZGEiCisKKyM6IGdsb2JhbHMuaDoxMjE3Cittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogYXJndW1lbnRvIG5vIHbhbGlkbyIKKworIzogZ2xvYmFscy5oOjEyMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ3NTogSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0NzU6IEFyZ3VtZW50byBubyB24WxpZG86ICVzLiIKKworIzogZ2xvYmFscy5oOjEyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IEV4cHJlc2nzbiBubyB24WxpZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIyMgorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiBSYW5nbyBubyB24WxpZG8iCisKKyM6IGdsb2JhbHMuaDoxMjIzCittc2dpZCAiRTQ3NjogSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJFNDc2OiBOb21icmUgZGUgY29tYW5kbyBubyB24WxpZG8iCisKKyM6IGdsb2JhbHMuaDoxMjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IKslc7sgZXMgdW4gZGlyZWN0b3JpbyIKKworIzogZ2xvYmFscy5oOjEyMjgKK21zZ2lkICJFMTg6IFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBiZWZvcmUgJz0nIgorbXNnc3RyICJFMTg6IENhcmFjdGVyZXMgaW5lc3BlcmFkb3MgZGVsYW50ZSBkZSCrPbsiCisKKyM6IGdsb2JhbHMuaDoxMjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBGYWxs8yBsYSBsbGFtYWRhIGEgYmlibGlvdGVjYSBwYXJhIKslc7soKSIKKworIzogZ2xvYmFscy5oOjEyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKKworIzogZ2xvYmFscy5oOjEyMzkKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTogTGEgbWFyY2EgdGllbmUgdW4gbvptZXJvIGRlIGztbmVhIG5vIHbhbGlkbyIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBNYXJjYSBzaW4gcG9uZXIiCisKKyM6IGdsb2JhbHMuaDoxMjQxCittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IE5vIHNlIHB1ZWRlbiBoYWNlciBjYW1iaW9zLCCrbW9kaWZpYWJsZbsgZXN04SBkZXNhY3RpdmFkbyIKKworIzogZ2xvYmFscy5oOjEyNDIKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6IERlbWFzaWFkb3Mgq3NjcmlwdHO7IGFuaWRhZG9zIgorCisjOiBnbG9iYWxzLmg6MTI0MworbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogTm8gaGF5IHVuIGZpY2hlcm8gYWx0ZXJuYXRpdm8iCisKKyM6IGdsb2JhbHMuaDoxMjQ0Cittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBUYWwgYWJyZXZpYXR1cmEgbm8gZXhpc3RlIgorCisjOiBnbG9iYWxzLmg6MTI0NQorbXNnaWQgIkU0Nzc6IE5vICEgYWxsb3dlZCIKK21zZ3N0ciAiRTQ3NzogqyG7IG5vIGVzdOEgcGVybWl0aWRvLiIKKworIzogZ2xvYmFscy5oOjEyNDcKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6IE5vIHNlIHB1ZWRlIHVzYXIgZWwgR1VJOiBubyBzZSBoYSBhY3RpdmFkbyBhbCBjb21waWxhci4iCisKKyM6IGdsb2JhbHMuaDoxMjUwCittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IE5vIHNlIHB1ZWRlIHVzYXIgZWwgaGVicmVvOiBubyBzZSBoYSBhY3RpdmFkbyBhbCBjb21waWxhclxuIgorCisjOiBnbG9iYWxzLmg6MTI1MworbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICIiCisiRTI3OiBObyBzZSBwdWVkZSB1c2FyIGVsIHBlcnNhIChmYXJzaSk6IG5vIHNlIGhhIGFjdGl2YWRvIGFsIGNvbXBpbGFyXG4iCisKKyM6IGdsb2JhbHMuaDoxMjU2Cittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogTm8gc2UgcHVlZGUgdXNhciBlbCDhcmFiZTogbm8gc2UgaGEgYWN0aXZhZG8gYWwgY29tcGlsYXJcbiIKKworIzogZ2xvYmFscy5oOjEyNTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiBObyBleGlzdGUgZWwgZ3J1cG8gZGUgcmVhbHphZG8gY29uIGVzZSBub21icmU6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2MQorbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogQfpuIG5vIGhhIGluc2VydGFkbyB0ZXh0by4iCisKKyM6IGdsb2JhbHMuaDoxMjYyCittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogTm8gaGF5IHVuYSBs7W5lYSBkZSBjb21hbmRvcyBwcmV2aWEiCisKKyM6IGdsb2JhbHMuaDoxMjYzCittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogTm8gZXhpc3RlIHRhbCBhc29jaWFjafNuLiIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFNDc5OiBObyBtYXRjaCIKK21zZ3N0ciAiRTQ3OTogTm8gaGF5IGNvaW5jaWRlbmNpYS4iCisKKyM6IGdsb2JhbHMuaDoxMjY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDogTm8gY29pbmNpZGU6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2NgorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IE5vIGhheSB1biBub21icmUgZGUgZmljaGVyby4iCisKKyM6IGdsb2JhbHMuaDoxMjY3Cittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiBObyBleGlzdGUgdW5hIGV4cHJlc2nzbiByZWd1bGFyIGRlIHN1c3RpdHVjafNuIHByZXZpYS4iCisKKyM6IGdsb2JhbHMuaDoxMjY4Cittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IE5vIGV4aXN0ZSB1biBjb21hbmRvIHByZXZpby4iCisKKyM6IGdsb2JhbHMuaDoxMjY5Cittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTogTm8gZXhpc3RlIHVuYSBleHByZXNp824gcmVndWxhciBwcmV2aWEuIgorCisjOiBnbG9iYWxzLmg6MTI3MAorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IEVsIHJhbmdvIG5vIGVzdOEgcGVybWl0aWRvLiIKKworIzogZ2xvYmFscy5oOjEyNzIKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBObyBoYXkgZXNwYWNpbyBzdWZpY2llbnRlLiIKKworIzogZ2xvYmFscy5oOjEyNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0Nzogbm8gcmVnaXN0ZXJlZCBzZXJ2ZXIgbmFtZWQgXCIlc1wiIgorbXNnc3RyICJFMjQ3OiBFbCBzZXJ2aWRvciCrJXO7IG5vIGVzdOEgcmVnaXN0cmFkby4iCisKKyM6IGdsb2JhbHMuaDoxMjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiBObyBzZSBwdWVkZSBjcmVhciBlbCBmaWNoZXJvIKslc7siCisKKyM6IGdsb2JhbHMuaDoxMjc4Cittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiBObyBwdWVkbyBvYnRlbmVyIGVsIG5vbWJyZSBkZWwgZmljaGVybyB0ZW1wb3JhbC4iCisKKyM6IGdsb2JhbHMuaDoxMjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODQ6IENhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NDogTm8gcHVlZG8gYWJyaXIgZWwgZmljaGVybyCrJXO7IgorCisjOiBnbG9iYWxzLmg6MTI4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg1OiBDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIkU0ODU6IE5vIHB1ZWRvIGxlZXIgZWwgZmljaGVybyCrJXO7LiIKKworIzogZ2xvYmFscy5oOjEyODEKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFMzc6IE5vIHNlIGhhIGd1YXJkYWRvIGVsIGZpY2hlcm8gZGVzZGUgZWwg+mx0aW1vIGNhbWJpbyAoYfFhZGEgISBwYXJhICIKKyJmb3J6YXIpLiIKKworIzogZ2xvYmFscy5oOjEyODIKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODogQXJndW1lbnRvIG51bG8uIgorCisjOiBnbG9iYWxzLmg6MTI4NAorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IEVzcGVyYWJhIHVuIG76bWVyby4iCisKKyM6IGdsb2JhbHMuaDoxMjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTm8gcHVlZG8gYWJyaXIgZWwgZmljaGVybyBkZSBlcnJvcmVzICVzLiIKKworIzogZ2xvYmFscy5oOjEyOTAKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBObyBzZSBwdWVkZSBhYnJpciBsYSBwYW50YWxsYS4iCisKKyM6IGdsb2JhbHMuaDoxMjkyCittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiChTWVtb3JpYSBhZ290YWRhISIKKworIzogZ2xvYmFscy5oOjEyOTQKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiTm8gc2UgZW5jb250cvMgZWwgcGF0cvNuIGRlIGL6c3F1ZWRhLiIKKworIzogZ2xvYmFscy5oOjEyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NjogUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDg2OiBObyBzZSBlbmNvbnRy8yBlbCBwYXRy824gZGUgYvpzcXVlZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI5NworbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IEVsIGFyZ3VtZW50byBkZWJlIHNlciBwb3NpdGl2by4iCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiBObyBwdWVkbyByZWdyZXNhciBhbCBkaXJlY3RvcmlvIHByZXZpby4iCisKKyM6IGdsb2JhbHMuaDoxMzAzCittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0MjogTm8gaGF5IGVycm9yZXMiCisKKyM6IGdsb2JhbHMuaDoxMzA1Cittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBDYWRlbmEgZGUgY29uY2lkZW5jaWEgZGHxYWRhLiIKKworIzogZ2xvYmFscy5oOjEzMDYKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiBFbCBwcm9ncmFtYSCrcmVnZXhwuyBlc3ThIGNvcnJ1cHRvLiIKKworIzogZ2xvYmFscy5oOjEzMDcKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IEVzdOEgYWN0aXZhIGxhIG9wY2nzbiCrcmVhZG9ubHm7IChh8WFkYSCrIbsgcGFyYSBmb3J6YXIpLiIKKworIzogZ2xvYmFscy5oOjEzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0NjogTm8gc2UgcHVlZGUgZGVmaW5pciBsYSB2YXJpYWJsZSBkZSBz82xvIGxlY3R1cmEgqyVzuy4iCisKKyM6IGdsb2JhbHMuaDoxMzEyCittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBFcnJvciBhbCBsZWVyIGVsIGZpY2hlcm8gZGUgZXJyb3Jlcy4iCisKKyM6IGdsb2JhbHMuaDoxMzE1Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IE5vIHNlIHBlcm1pdGUgZW4gZWwgYW1iaWVudGUgcHJvdGVnaWRvLiIKKworIzogZ2xvYmFscy5oOjEzMTcKK21zZ2lkICJFNTIzOiBOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNTIzOiBObyBzZSBwZXJtaXRlIGFxde0uIgorCisjOiBnbG9iYWxzLmg6MTMyMAorbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogTGEgY29uZmlndXJhY2nzbiBkZSBsYSBwYW50YWxsYSBubyBlcyB24WxpZGEuIgorCisjOiBnbG9iYWxzLmg6MTMyMgorbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiBFbCB0YW1h8W8gZGUgZGVzcGxhemFtaWVudG8gbm8gduFsaWRvLiIKKworIzogZ2xvYmFscy5oOjEzMjMKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IExhIG9wY2nzbiCrc2hlbGy7IGVzdOEgdmFj7WEuIgorCisjOiBnbG9iYWxzLmg6MTMyNQorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogoU5vIHNlIHB1ZG8gbGVlciBsb3MgZGF0b3MgZGUgbG9zIHNpZ25vcyEiCisKKyM6IGdsb2JhbHMuaDoxMzI3Cittc2dpZCAiRTcyOiBDbG9zZSBlcnJvciBvbiBzd2FwIGZpbGUiCittc2dzdHIgIkU3MjogRXJyb3IgZGUgY2llcnJlIGVuIGVsIGZpY2hlcm8gZGUgaW50ZXJjYW1iaW8iCisKKyM6IGdsb2JhbHMuaDoxMzI4Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3MzogTGEgcGlsYSBkZSCrdGFnc7sgZXN04SB2YWPtYS4iCisKKyM6IGdsb2JhbHMuaDoxMzI5Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IEVsIGNvbWFuZG8gZXMgZGVtYXNpYWRvIGNvbXBsZWpvLiIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTogRWwgbm9tYnJlIGVzIGRlbWFzaWFkbyBsYXJnby4iCisKKyM6IGdsb2JhbHMuaDoxMzMxCittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IEhheSBkZW1hc2lhZG9zIFsiCisKKyM6IGdsb2JhbHMuaDoxMzMyCittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6IEhheSBkZW1hc2lhZG9zIG5vbWJyZXMgZGUgZmljaGVyb3MuIgorCisjOiBnbG9iYWxzLmg6MTMzMworbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IENhcmFjdGVyZXMgZW4gZXhjZXNvIGFsIGZpbmFsIGRlIGxhIGztbmVhLiIKKworIzogZ2xvYmFscy5oOjEzMzQKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiBNYXJjYSBkZXNjb25vY2lkYS4iCisKKyM6IGdsb2JhbHMuaDoxMzM1Cittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBObyBwdWVkbyBleHBhbmRpciBsb3MgY29tb2RpbmVzLiIKKworIzogZ2xvYmFscy5oOjEzMzcKK21zZ2lkICJFNTkxOiAnd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICJFNTkxOiCrd2luaGVpZ2h0uyBubyBwdWVkZSBzZXIgbeFzIHBlcXVl8W8gcXVlIKt3aW5taW5oZWlnaHS7LiIKKworIzogZ2xvYmFscy5oOjEzMzkKK21zZ2lkICJFNTkyOiAnd2lud2lkdGgnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbndpZHRoJyIKK21zZ3N0ciAiRTU5Mjogq3dpbndpZHRouyBubyBwdWVkZSBzZXIgbeFzIHBlcXVl8W8gcXVlIKt3aW5taW53aWR0aLsuIgorCisjOiBnbG9iYWxzLmg6MTM0MgorbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiBFcnJvciBhbCBlc2NyaWJpciBlbCBmaWNoZXJvLiIKKworIzogZ2xvYmFscy5oOjEzNDMKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICJFbCByZWN1ZW50byBlcyBjZXJvLiIKKworIzogZ2xvYmFscy5oOjEzNDUKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IFVzYW5kbyA8U0lEPiBlbiB1biBjb250ZXh0byBxdWUgbm8gZXMgZGUgq3NjcmlwdLsiCisKKyM6IGdsb2JhbHMuaDoxMzQ4Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiBSZWNpYu0gdW5hIGV4cHJlc2nzbiBpbnbhbGlkYS4iCisKKyM6IGdsb2JhbHMuaDoxMzUxCittc2dpZCAiRTQ2MzogUmVnaW9uIGlzIGd1YXJkZWQsIGNhbm5vdCBtb2RpZnkiCittc2dzdHIgIkU0NjM6IExhIHJlZ2nzbiBlc3ThIHByb3RlZ2lkYSwgbm8gcHVlZG8gbW9kaWZpY2FybGEuIgorCisjfiBtc2dpZCAiXCJcbiIKKyN+IG1zZ3N0ciAiu1xuIgorCisjfiBtc2dpZCAiIEJMT0NLIgorI34gbXNnc3RyICIgQkxPUVVFIgorCisjfiBtc2dpZCAiIExJTkUiCisjfiBtc2dzdHIgIiBMzU5FQSIKZGlmZiAtLWdpdCBhL3NyYy9wby9mci5wbyBiL3NyYy9wby9mci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFlNGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL2ZyLnBvCkBAIC0wLDAgKzEsNjg4OCBAQAorIyBGcmVuY2ggVHJhbnNsYXRpb24gZm9yIFZpbQorIworIyBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyMgRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisjCisjICBGSVJTVCBBVVRIT1IgIERpbmRpblggICAgICA8RGF2aWQuT2RpbkBiaWdmb290LmNvbT4JICAgMjAwMC4KKyMgU0VDT05EIEFVVEhPUiAgQWRyaWVuIEJlYXUgIDx2ZXJzaW9uLmZyYW5jYWlzZUBmcmVlLmZyPiAgMjAwMiwgMjAwMy4KKyMKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgQ2UgZmljaGllciBuJ2VzdCBwYXMgZmluYWxpc+kgISBMZSBncm9zIGR1IHRyYXZhaWwgYSDpdOkgZmFpdCwgbWFpcyBsYSB0b3VjaGUKKyMgZmluYWxlIHJlc3RlIOAgYXBwb3J0ZXIuIEplIHBlbnNlIHF1ZSB0b3V0IHNlcmEgYmVsIGV0IGJpZW4gZmluaSBwb3VyIFZpbSA2LjMKKyMgKGh1bSwgYyfpdGFpdCBjZW5z6SDqdHJlIGxlIGNhcyBwb3VyIFZpbSA2LjIpLgorIworIyBDb25zdWx0ZXogaHR0cDovL3ZlcnNpb24uZnJhbmNhaXNlLmZyZWUuZnIvIHBvdXIgbGVzIG1pc2VzIOAgam91ciBkZSBjZQorIyBmaWNoaWVyLCBhaW5zaSBxdWUgcG91ciBsZXMgdmVyc2lvbnMgZnJhbudhaXNlcyBkZXMgbWVudXMgZXQgZHUgdHV0b3JpZWwuCisjCisjIFNpIHZvdXMgYXZleiBkZXMgcmVtYXJxdWVzIOAgZmFpcmUgc3VyIGNlIGZpY2hpZXIsIOljcml2ZXog4AorIyB2ZXJzaW9uLmZyYW5jYWlzZUBmcmVlLmZyLiBDZXR0ZSBhZHJlc3NlIGVzdCBjb25zdWx06WUgculndWxp6HJlbWVudC4KKyMKKyMgRW4gY2FzIGQnZXJyZXVyIHRlY2huaXF1ZSBhdSBuaXZlYXUgZGUgdmVyc2lvbi5mcmFuY2Fpc2VAZnJlZS5mciwgb3Ugc2kgdm91cworIyBuZSByZWNldmV6IGF1Y3VuZSBy6XBvbnNlIHBsdXNpZXVycyBqb3VycyBhcHLocyB2b3RyZSBlbnZvaSwgdulyaWZpZXogc2kgdW4KKyMgbWVzc2FnZSBuJ2EgcGFzIOl06SBwb3N06SBzdXIgbGUgc2l0ZSB3ZWIuIFNpIGNldHRlIG9wdGlvbiBzZSBy6XbobGUKKyMgaW5mcnVjdHVldXNlLCBlc3NheWV6IGRlIG1lIGNvbnRhY3RlciDgIG1lcyBhdXRyZXMgYWRyZXNzZXMsIGNoZXogZnJlZS5mciBvdQorIyBjaGV6IHlhaG9vLmNvbS4gTW9uIG5vbSBkJ3V0aWxpc2F0ZXVyIGVzdCBsYSBjb25jYXTpbmF0aW9uIGRlIG1vbiBwculub20gZXQKKyMgZGUgbW9uIG5vbS4KKyMKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgVGhpcyBmaWxlIHN0aWxsIG5lZWRzIHdvcmshIFRoZSByb3VnaCB3b3JrIGhhcyBiZWVuIGRvbmUsIHNvbWUgcG9saXNoaW5nCisjIG5lZWRzIHRvIGJlIGFwcGxpZWQuIEkgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgYnJpZ2h0IGFuZCBzaGlueSBmb3IgVmltIDYuMworIyAoZXJyLCB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZSBWaW0gNi4yKS4KKyMKKyMgR28gdG8gaHR0cDovL3ZlcnNpb24uZnJhbmNhaXNlLmZyZWUuZnIvIGZvciB1cGRhdGVzIHRvIHRoaXMgZmlsZSwgYW5kIHRvIHRoZQorIyBGcmVuY2ggdmVyc2lvbnMgb2YgdGhlIG1lbnVzIGFuZCB0aGUgdHV0b3IuCisjCisjIFNlbmQgeW91ciBjb21tZW50cyBhYm91dCB0aGlzIGZpbGUgYnkgZW1haWwsIHRvIHZlcnNpb24uZnJhbmNhaXNlQGZyZWUuZnIuCisjIFRoaXMgYWRkcmVzcyBpcyBjaGVja2VkIHJlZ3VsYXJseS4KKyMKKyMgSW4gY2FzZSBvZiB0ZWNobmljYWwgZXJyb3IgYXQgdmVyc2lvbi5mcmFuY2Fpc2VAZnJlZS5mciwgb3IgaWYgeW91IGRvbid0IGdldAorIyBhbnkgYW5zd2VyIHNldmVyYWwgZGF5cyBhZnRlciB3cml0aW5nLCBjaGVjayBpZiB0aGVyZSBpcyBhIG1lc3NhZ2UgYXQKKyMgaHR0cDovL3ZlcnNpb24uZnJhbmNhaXNlLmZyZWUuZnIvLiBJZiB0aGlzIG9wdGlvbiBmYWlscyB0byB3b3JrLCB0cnkgdG8KKyMgd3JpdGUgdG8gbXkgb3RoZXIgYWRkcmVzc2VzIGF0IGZyZWUuZnIgYW5kIHlhaG9vLmNvbS4gQ29uY2F0ZW5lIG15IGZpcnN0IGFuZAorIyBsYXN0IG5hbWUgdG8gZ2V0IG15IHVzZXJuYW1lLgorIworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyBDaGFuZ2VMb2c6CisjCisjIDIwMDItMDMtMDQJQUIJQnVsayB0cmFuc2xhdGlvbiAoZG9uZSBpbiAxNiBob3VycyEpCisjIAkJCSAgLSBUaGF0J3MgMS4zNSBtc2cvbWluIGZvciB5YQorIyAyMDAyLTAzLTIzCUFCCUluaXRpYWwgcmVsZWFzZSAoc2hpcHMgd2l0aCBWaW0gNi4xKQorIyAJCQkgIC0gTXVjaCBjbGVhbmVyIHRoYW4gdGhlIGZpcnN0IHZlcnNpb24gOikKKyMgMjAwMi0wOS0zMAlBQglQYXRjaCAjMjAwIHVwZGF0ZSAocmVsZWFzZWQgb24gd2ViIHNpdGUpCisjIAkJCSAgLSBGaXZlIG5ldyBtZXNzYWdlcworIyAJCQkgIC0gQ29ycmVjdGVkIHRocmVlIHR5cG9zIGluIHByaW50ZigpLXN0eWxlIGV4cHJlc3Npb25zCisjIAkJCSAgICAodGhhbmtzIE1paykKKyMgMjAwMy0wNS0wOQlBQglQYXRjaCAjNDc0IHVwZGF0ZSAodW5yZWxlYXNlZCkKKyMgCQkJICAtIFBvbGlzaGluZyBkb25lIG9uIHRocmVlIG1vcmUgZmlsZXMgKHRoZSB0aHJlZSBmaXJzdAorIyAJCQkgICAgb25lcyBoYXZlIGJlZW4gcmV3b3JrZWQsIHRvbykKKyMgCQkJICAtIE1hbnkgY29tbWVudHMgaGF2ZSBiZWVuIGFkZGVkIGluIHRoZSBwb2xpc2hlZAorIyAJCQkgICAgc2VjdGlvbgorIyAyMDAzLTA1LTI5CUFCCVZpbSA2LjIgcGVuZGluZyByZWxlYXNlCisjIAkJCSAgLSBGaW5pc2ggd29yayBvbiBWaW0gNi4xLjQ3NCAocXVpY2tseSEpCisjIAkJCSAgLSBUaGlydHktdGhyZWUgbmV3IG1lc3NhZ2VzIChyb3VnaCB0cmFuc2xhdGlvbikKKyMgCQkJICAtIFNvbWUgb2YgdGhlIEVuZ2xpc2ggbWVzc2FnZXMgaGF2ZSBiZWVuIGFsdGVyZWQKKyMgCQkJICAgIChmdXp6eSBlbnRyaWVzKSwgZGVhbCB3aXRoIGl0CisjIDIwMDMtMDUtMjkJQUIJVmltIDYuMiByZWxlYXNlIGNhbmRpZGF0ZSAoc2VudCB0byBCcmFtIE1vb2xlbmFhcikKKyMgCQkJICAtIFVwZGF0ZSB0byBWaW0gNi4yZi4wMTQgKHF1aWNrbHksIHRvbykKKyMgCQkJICAtIEZpZnR5LW5pbmUgbmV3IG1lc3NhZ2VzIChyb3VnaCB0cmFuc2xhdGlvbikKKyMgCQkJICAtIEh1bmRyZWRzIG9mIGVycm9yIG1lc3NhZ2VzIG51bWJlcnMgYWRkZWQgKHdvdykKKyMKKyMgVHJhbnNsYXRlZDoJIDEzOTIvMTM5MiAoMTAwLjAwJSkKKyMKKyMgUG9saXNoaW5nIGRvbmUgb246CisjICBidWZmZXIuYworIyAgZGlmZi5jCisjICBkaWdyYXBoLmMKKyMgIGVkaXQuYworIyAgZXZhbC5jCisjICBleF9jbWRzLmMKKyMKKyMgT3RoZXIgZmlsZXMgc3RpbGwgdG8gZG8uCisjCisjIE5vdGF0aW9ucyB1c2VkIGluIHRoZSBjb21tZW50cyBvZiB0aGUgdW5wb2xpc2hlZCBwYXJ0IG9mIHRoaXMgZmlsZToKKyMgVE9ETwkJVGhlcmUncyB3b3JrIHRvIGRvIHRoZXJlLCBhbmQgaXQncyBpbXBvcnRhbnQKKyMgdG9kbwkJVGhlcmUncyB3b3JrIHRvIGRvIHRoZXJlLCBidXQgaXQncyBsZXNzIGltcG9ydGFudAorIyAobm8gY29tbWVudCkJUGVyaGFwcyB0aGVyZSdzIHdvcmsgdG8gZG8gdGhlcmU/CisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0oRnJhbudhaXMpXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDMtMDUtMjggMjM6MDkrMDIwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDMtMDUtMjkgMDQ6MDErMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQWRyaWVuIEJlYXUgPHZlcnNpb24uZnJhbmNhaXNlQGZyZWUuZnI+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQWRyaWVuIEJlYXUgPHZlcnNpb24uZnJhbmNhaXNlQGZyZWUuZnI+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPXzg4NTktMTVcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyMgQUIgLSBJbCBmYXV0IHJlc3BlY3RlciBsJ2VzcHJpdCBwbHVzIHF1ZSBsYSBsZXR0cmUuCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogQXVjdW4gdGFtcG9uIG5lIHBldXQg6nRyZSBhbGxvdeksIFZpbSBkb2l0IHMnYXJy6nRlciIKKworIyBBQiAtIExhIHNpdHVhdGlvbiBlc3QgcHJvYmFibGVtZW50IHBsdXMgZ3JhdmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UgbmUgbGUKKyMgICAgICBsYWlzc2UgZW50ZW5kcmUgKHZvaXIgbCdhaWRlIGVuIGxpZ25lKS4gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IHBsdXMKKyMgICAgICBleHBsaWNpdGUuCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBMJ2FsbG9jYXRpb24gZHUgdGFtcG9uIGEg6WNob3XpOiBhcnLqdGV6IFZpbSwgbGli6XJleiBkZSBsYSBt6W1vaXJlIgorCisjOiBidWZmZXIuYzo3OTcKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6IEF1Y3VuIHRhbXBvbiBuJ2Eg6XTpIGTpY2hhcmfpIgorCisjOiBidWZmZXIuYzo3OTkKK21zZ2lkICJFNTE2OiBObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiRTUxNjogQXVjdW4gdGFtcG9uIG4nYSDpdOkgZWZmYWPpIgorCisjOiBidWZmZXIuYzo4MDEKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiBBdWN1biB0YW1wb24gbidhIOl06SBk6XRydWl0IgorCisjOiBidWZmZXIuYzo4MDkKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAiMSB0YW1wb24gYSDpdOkgZOljaGFyZ+kiCisKKyM6IGJ1ZmZlci5jOjgxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICIlZCB0YW1wb25zIG9udCDpdOkgZOljaGFyZ+lzIgorCisjOiBidWZmZXIuYzo4MTYKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICIxIHRhbXBvbiBhIOl06SBlZmZhY+kiCisKKyM6IGJ1ZmZlci5jOjgxOAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIHRhbXBvbnMgb250IOl06SBlZmZhY+lzIgorCisjOiBidWZmZXIuYzo4MjMKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIjEgdGFtcG9uIGEg6XTpIGTpdHJ1aXQiCisKKyM6IGJ1ZmZlci5jOjgyNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiJWQgdGFtcG9ucyBvbnQg6XTpIGTpdHJ1aXRzIgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZS4KKyM6IGJ1ZmZlci5jOjg4NgorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IEF1Y3VuIHRhbXBvbiBuJ2VzdCBtb2RpZmnpIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTI1Cittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IEF1Y3VuIHRhbXBvbiBuJ2VzdCBsaXN06SIKKworIyBBQiAtIFZ1IGxlIGNvZGUgc291cmNlLCBsYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYQorIyAgICAgIHZlcnNpb24gYW5nbGFpc2UuCisjOiBidWZmZXIuYzo5MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiBMZSB0YW1wb24gJWxkIG4nZXhpc3RlIHBhcyIKKworIyBBQiAtIEplIG5lIHN1aXMgcGFzIHP7ciBxdWUgbCdvbiBwdWlzc2Ugb2J0ZW5pciBjZSBtZXNzYWdlLgorIzogYnVmZmVyLmM6OTQwCittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6IEltcG9zc2libGUgZCdhbGxlciBhcHLocyBsZSBkZXJuaWVyIHRhbXBvbiIKKworIyBBQiAtIEplIG5lIHN1aXMgcGFzIHP7ciBxdWUgbCdvbiBwdWlzc2Ugb2J0ZW5pciBjZSBtZXNzYWdlLgorIzogYnVmZmVyLmM6OTQyCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiBJbXBvc3NpYmxlIGQnYWxsZXIgYXZhbnQgbGUgcHJlbWllciB0YW1wb24iCisKKyM6IGJ1ZmZlci5jOjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU4OTogTGUgdGFtcG9uICVsZCBuJ2EgcGFzIOl06SBlbnJlZ2lzdHLpIChham91dGV6ICEgcG91ciBwYXNzZXIgb3V0cmUpIgorCisjOiBidWZmZXIuYzo5ODIKK21zZ2lkICJFOTA6IENhbm5vdCB1bmxvYWQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU5MDogSW1wb3NzaWJsZSBkZSBk6WNoYXJnZXIgbGUgZGVybmllciB0YW1wb24iCisKKyM6IGJ1ZmZlci5jOjE1MDAKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiBBbGVydGU6IExhIGxpc3RlIGRlcyBub21zIGRlIGZpY2hpZXIgZOlib3JkZSIKKworIyBBQiAtIFZ1IGxlIGNvZGUgc291cmNlLCBsYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYQorIyAgICAgIHZlcnNpb24gYW5nbGFpc2UuIENlIG1lc3NhZ2UgZXN0IHNpbWlsYWlyZSBhdSBtZXNzYWdlIEU4Ni4KKyM6IGJ1ZmZlci5jOjE2NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiBMZSB0YW1wb24gJWxkIG4nZXhpc3RlIHBhcyIKKworIyBBQiAtIElsIGZhdXQgcmVzcGVjdGVyIGwnZXNwcml0IHBsdXMgcXVlIGxhIGxldHRyZS4KKyM6IGJ1ZmZlci5jOjE5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBQbHVzaWV1cnMgdGFtcG9ucyBjb3JyZXNwb25kZW50IOAgJXMiCisKKyM6IGJ1ZmZlci5jOjE5MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IEF1Y3VuIHRhbXBvbiBuZSBjb3JyZXNwb25kIOAgJXMiCisKKyM6IGJ1ZmZlci5jOjIyOTkgZXhfZG9jbWQuYzo2NTYwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICJsaWduZSAlbGQiCisKKyM6IGJ1ZmZlci5jOjIzODIKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiBVbiB0YW1wb24gcG9ydGUgZOlq4CBjZSBub20iCisKKyM6IGJ1ZmZlci5jOjI2NzUKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiW01vZGlmaeldIgorCisjIEFCIC0gIltJbulkaXTpXSIgZXN0IHBsdXMgY29ycmVjdCwgbWFpcyBzb25uZSBmYXV4LgorIzogYnVmZmVyLmM6MjY4MAorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW1BhcyDpZGl06V0iCisKKyM6IGJ1ZmZlci5jOjI2ODUKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbTm91dmVhdSBmaWNoaWVyXSIKKworIzogYnVmZmVyLmM6MjY4NgorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltFcnJldXJzIGRlIGxlY3R1cmVdIgorCisjIEFCIC0gTGEgdmVyc2lvbiBjb3VydGUsICJbUk9dIiwgZGV2cmFpdC1lbGxlIOp0cmUgdHJhZHVpdGUgcGFyICJbTFNdIiA/CisjICAgICAgSWwgZmF1ZHJhaXQgZmFpcmUgdW4gc29uZGFnZSBhdXBy6HMgZGVzIHV0aWxpc2F0ZXVycyBmcmFuY29waG9uZXMuCisjOiBidWZmZXIuYzoyNjg4IGZpbGVpby5jOjE5MTQKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbbGVjdHVyZS1zZXVsZV0iCisKKyM6IGJ1ZmZlci5jOjI3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICIxIGxpZ25lIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIGxpZ25lcyAtLSVkJSUtLSIKKworIyBBQiAtIEZhdXQtaWwgcmVtcGxhY2VyICJzdXIiIHBhciAiZGUiID8KKyM6IGJ1ZmZlci5jOjI3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgImxpZ25lICVsZCBzdXIgJWxkIC0tJWQlJS0tIGNvbCAiCisKKyM6IGJ1ZmZlci5jOjI4MTMKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIltQYXMgZGUgZmljaGllcl0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6Mjg1MworbXNnaWQgImhlbHAiCittc2dzdHIgImFpZGUiCisKKyM6IGJ1ZmZlci5jOjM0MTIgc2NyZWVuLmM6NDk5NgorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW2FpZGVdIgorCisjIEFCIC0gIlBy6XZpc3VhbGlzYXRpb24iIHByZW5kIGJlYXVjb3VwIGRlIHBsYWNlLiAiUHLpdmlzaW9uIiBlc3QgdW5lCisjICAgICAgdHJhZHVjdGlvbiBsaXR06XJhbGUgZXQgYnLodmUsIG1haXMgcXVpIHJpc3F1ZSBmb3J0IGQn6nRyZSBtYWwgY29tcHJpc2UuCisjICAgICAgSidhaSBmaW5hbGVtZW50IGNob2lzaSBkJ3V0aWxpc2VyIHVuZSBhYnLpdmlhdGlvbiwgbWFpcyBjZWxhIG5lIG1lCisjICAgICAgc2F0aXNmYWl0IHBhcy4KKyM6IGJ1ZmZlci5jOjM0NDQgc2NyZWVuLmM6NTAwMgorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW1By6XZpc3VdIgorCisjOiBidWZmZXIuYzozNzI0Cittc2dpZCAiQWxsIgorbXNnc3RyICJUb3V0IgorCisjOiBidWZmZXIuYzozNzI0Cittc2dpZCAiQm90IgorbXNnc3RyICJCYXMiCisKKyMgQUIgLSBBdHRlbnRpb24sIG9uIHBhc3NlIGRlIHRyb2lzIOAgcXVhdHJlIGxldHRyZXMuCisjOiBidWZmZXIuYzozNzI2Cittc2dpZCAiVG9wIgorbXNnc3RyICJIYXV0IgorCisjOiBidWZmZXIuYzo0NDcwCittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIExpc3RlIGRlcyB0YW1wb25zOlxuIgorCisjOiBidWZmZXIuYzo0NTAzCittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbTGlzdGUgZCdlcnJldXJzXSIKKworIyBBQiAtIENlIG1lc3NhZ2UgZXN0IGTpauAgcHLpc2VudCBxdWVscXVlcyBsaWduZXMgcGx1cyBoYXV0LgorIzogYnVmZmVyLmM6NDUxNiBtZW1saW5lLmM6MTUwMQorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW1BhcyBkZSBmaWNoaWVyXSIKKworIzogYnVmZmVyLmM6NDgxOQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFN5bWJvbGVzIC0tLSIKKworIzogYnVmZmVyLmM6NDgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICJTeW1ib2xlcyBkYW5zICVzOiIKKworIzogYnVmZmVyLmM6NDg0NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgbGlnbmU9JWxkICBpZD0lZCAgbm9tPSVzIgorCisjIEFCIC0gSmUgbidhaSBwYXMgdHJvdXbpIGRlIHRyYWR1Y3Rpb24gc2F0aXNmYWlzYW50ZSBhdSB2ZXJiZSAiZGlmZiIuIENvbW1lCisjICAgICAgVmltIGZhaXQgZW4gcHJhdGlxdWUgYXBwZWwgYXUgcHJvZ3JhbW1lICJkaWZmIiBwb3VyIGV2YWx1ZXIgbGVzCisjICAgICAgZGlmZulyZW5jZXMgZW50cmUgZmljaGllcnMsICJ0byBkaWZmIiBhIOl06SB0cmFkdWl0IHBhciAidXRpbGlzZXIgZGlmZiIKKyMgICAgICBldCBkJ2F1dHJlcyBleHByZXNzaW9ucyBhcHByb3Byaellcy4KKyM6IGRpZmYuYzoxMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IEltcG9zc2libGUgZCd1dGlsaXNlciBkaWZmIHN1ciBwbHVzIGRlICVsZCB0YW1wb25zIgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZS4KKyM6IGRpZmYuYzo2NTEKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogZGlmZiBuZSBmb25jdGlvbm5lIHBhcyIKKworIyBBQiAtIENlY2kgZXN0IHVuIHRpdHJlIGRlIGJv7nRlIGRlIGRpYWxvZ3VlLgorIzogZGlmZi5jOjc1MAorbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIlPpbGVjdGlvbm5lciB1biBwYXRjaCAtIFZpbSIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBjb3JyZWN0ZSwgbWFpcyB0cm9wIHRlY2huaXF1ZS4KKyMgQUIgLSAib3V0cHV0IiBlc3QgZGlmZmljaWxlIOAgdHJhZHVpcmUgY2xhaXJlbWVudC4KKyM6IGRpZmYuYzoxMDAxCittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiBMZSBmaWNoaWVyIGludGVybelkaWFpcmUgcHJvZHVpdCBwYXIgZGlmZiBuJ2EgcHUg6nRyZSBsdSIKKworIzogZGlmZi5jOjE3NDIKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogTGUgdGFtcG9uIGNvdXJhbnQgbidlc3QgcGFzIGVuIG1vZGUgZGlmZiIKKworIzogZGlmZi5jOjE3NTQKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiBBdWN1biBhdXRyZSB0YW1wb24gbidlc3QgZW4gbW9kZSBkaWZmIgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZSwgbWFpcyBlbGxlCisjICAgICAgcGV1dCDqdHJlIGFt6Wxpb3LpZS4KKyM6IGRpZmYuYzoxNzYyCittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiBQbHVzIGRlIGRldXggdGFtcG9ucyBzb250IGVuIG1vZGUgZGlmZiwgc295ZXogcGx1cyBwculjaXMiCisKKyM6IGRpZmYuYzoxNzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogTGUgdGFtcG9uICVzIGVzdCBpbnRyb3V2YWJsZSIKKworIzogZGlmZi5jOjE3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiBMZSB0YW1wb24gJXMgbidlc3QgcGFzIGVuIG1vZGUgZGlmZiIKKworIyBBQiAtIEplIGNoZXJjaGUgdW5lIHRyYWR1Y3Rpb24gcGx1cyBjb25jaXNlIHBvdXIgImVzY2FwZSIuCisjOiBkaWdyYXBoLmM6MjE3MgorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiBVbiBkaWdyYXBoZSBuZSBwZXV0IGNvbnRlbmlyIGxlIGNhcmFjdOhyZSBkJ+ljaGFwcGVtZW50IgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IHRyb3AgdmVyYmV1c2UuCisjOiBkaWdyYXBoLmM6MjM0NAorbXNnaWQgIkU1NDQ6IEtleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTU0NDogTGUgZmljaGllciBkZXNjcmlwdGV1ciBkZSBjbGF2aWVyIGVzdCBpbnRyb3V2YWJsZSIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBkaWdyYXBoLmM6MjM3MQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogOmxvYWRrZXltYXAgbmUgcGV1dCDqdHJlIHV0aWxpc+kgcXVlIGRhbnMgdW4gc2NyaXB0IFZpbSIKKworIyBBQiAtIFJlbXBsYWNlciAiY29tcGzpdGlvbiIgcGFyICJjb21wbOh0ZW1lbnQiID8gVm9pciBsJ+l0aHltb2xvZ2llCisjICAgICAgZCciYWNjcul0aW9uIi4KKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIENvbXBs6XRpb24gZGUgbW90LWNs6SAoXk4vXlApIgorCisjLiBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyM6IGVkaXQuYzo0MQorbXNnaWQgIiBeWCBtb2RlICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCittc2dzdHIgIiBtb2RlIF5YICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCisKKyMgQUIgLSBSZW1wbGFjZXIgImNvbXBs6XRpb24iIHBhciAiY29tcGzodGVtZW50IiA/IFZvaXIgbCfpdGh5bW9sb2dpZQorIyAgICAgIGQnImFjY3LpdGlvbiIuCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBsb2NhbGUgZGUgbW90LWNs6SAoXk4vXlApIgorCisjIEFCIC0gUmVtcGxhY2VyICJjb21wbOl0aW9uIiBwYXIgImNvbXBs6HRlbWVudCIgPyBWb2lyIGwn6XRoeW1vbG9naWUKKyMgICAgICBkJyJhY2Ny6XRpb24iLgorIzogZWRpdC5jOjQ1Cittc2dpZCAiIFdob2xlIGxpbmUgY29tcGxldGlvbiAoXkwvXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBkZSBsaWduZSBlbnRp6HJlICheTC9eTi9eUCkiCisKKyMgQUIgLSBSZW1wbGFjZXIgImNvbXBs6XRpb24iIHBhciAiY29tcGzodGVtZW50IiA/IFZvaXIgbCfpdGh5bW9sb2dpZQorIyAgICAgIGQnImFjY3LpdGlvbiIuCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIENvbXBs6XRpb24gZGUgbm9tIGRlIGZpY2hpZXIgKF5GL15OL15QKSIKKworIyBBQiAtIFJlbXBsYWNlciAiY29tcGzpdGlvbiIgcGFyICJjb21wbOh0ZW1lbnQiID8gVm9pciBsJ+l0aHltb2xvZ2llCisjICAgICAgZCciYWNjcul0aW9uIi4KKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBkJ+l0aXF1ZXR0ZSAoXl0vXk4vXlApIgorCisjIEFCIC0gUmVtcGxhY2VyICJjb21wbOl0aW9uIiBwYXIgImNvbXBs6HRlbWVudCIgPyBWb2lyIGwn6XRoeW1vbG9naWUKKyMgICAgICBkJyJhY2Ny6XRpb24iLgorIyBBQiAtIEonYWkgZPsgYXZvaXIgdW5lIGJvbm5lIHJhaXNvbiBkZSBmYWlyZSB1bmUgdmVyc2lvbiBmcmFu52Fpc2UgYXVzc2kKKyMgICAgICBkaWZm6XJlbnRlIGRlIGxhIHZlcnNpb24gYW5nbGFpc2UuIElsIG1lIGZhdXQgbGEgcmV0cm91dmVyLgorIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBDb21wbOl0aW9uIGdsb2JhbGUgZGUgbW90LWNs6SAoXk4vXlApIgorCisjIEFCIC0gUmVtcGxhY2VyICJjb21wbOl0aW9uIiBwYXIgImNvbXBs6HRlbWVudCIgPyBWb2lyIGwn6XRoeW1vbG9naWUKKyMgICAgICBkJyJhY2Ny6XRpb24iLgorIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkQvXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBkZSBk6WZpbml0aW9uICheRC9eTi9eUCkiCisKKyMgQUIgLSBSZW1wbGFjZXIgImNvbXBs6XRpb24iIHBhciAiY29tcGzodGVtZW50IiA/IFZvaXIgbCfpdGh5bW9sb2dpZQorIyAgICAgIGQnImFjY3LpdGlvbiIuCisjIEFCIC0gVHJvdXZlciB1bmUgbWVpbGxldXJlIGZvcm11bGF0aW9uIHF1ZSAic2Vsb24gbGUiLgorIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBzZWxvbiBsZSBkaWN0aW9ubmFpcmUgKF5LL15OL15QKSIKKworIyBBQiAtIFJlbXBsYWNlciAiY29tcGzpdGlvbiIgcGFyICJjb21wbOh0ZW1lbnQiID8gVm9pciBsJ+l0aHltb2xvZ2llCisjICAgICAgZCciYWNjcul0aW9uIi4KKyMgQUIgLSBUcm91dmVyIHVuZSBtZWlsbGV1cmUgZm9ybXVsYXRpb24gcXVlICJzZWxvbiBsZSIuCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIENvbXBs6XRpb24gc2Vsb24gbGUgdGjpc2F1cnVzICheVC9eTi9eUCkiCisKKyMgQUIgLSBSZW1wbGFjZXIgImNvbXBs6XRpb24iIHBhciAiY29tcGzodGVtZW50IiA/IFZvaXIgbCfpdGh5bW9sb2dpZQorIyAgICAgIGQnImFjY3LpdGlvbiIuCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZS4KKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgQ29tcGzpdGlvbiBkZSBjb21tYW5kZSBWaW0gKF5WL15OL15QKSIKKworIyBBQiAtIENlIHRleHRlIHMnYWpvdXRlIOAgbGEgZmluIGQndW4gZGVzIG1lc3NhZ2VzIGRlIGNvbXBs6XRpb24gY2ktZGVzc3VzLgorIyAgICAgIElsIGZhdXQg6XZpdGVyIGRlIGxlIGZhaXJlIHRyb3AgbG9uZy4gSmUgcGVuc2UgcXVlIGxhIHZlcnNpb24gZnJhbudhaXNlCisjICAgICAgZXN0IHN1ZmZpc2FtbWVudCBjb21wculoZW5zaWJsZSBkYW5zIGxlIGNvbnRleHRlIGRhbnMgbGVxdWVsIGVsbGUgZXN0CisjICAgICAgYWZmaWNo6WUuCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAiRmluIGR1IHBhcmFncmFwaGUiCisKKyM6IGVkaXQuYzo5NTUKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkwnb3B0aW9uICd0aGVzYXVydXMnIGVzdCB2aWRlIgorCisjOiBlZGl0LmM6MTE1OQorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkwnb3B0aW9uICdkaWN0aW9uYXJ5JyBlc3QgdmlkZSIKKworIzogZWRpdC5jOjIxNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIkV4YW1lbiBkdSBkaWN0aW9ubmFpcmU6ICVzIgorCisjOiBlZGl0LmM6MjM1MAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnNlcnRpb24pIETpZmlsZW1lbnQgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzNTIKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHJlbXBsYWNlbWVudCkgROlmaWxlbWVudCAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZzogJXMiCittc2dzdHIgIkV4YW1lbjogJXMiCisKKyM6IGVkaXQuYzoyNzAxCittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIkV4YW1lbiBkZXMg6XRpcXVldHRlcy4iCisKKyMgQUIgLSBDZXR0ZSBjaGHubmUgZGUgY2FyYWN06HJlcyBlc3QgYWpvdXTpZSBlbiBk6WJ1dCBkZSBsaWduZSBsb3JzcXUndW5lCisjICAgICAgb3DpcmF0aW9uIGRlIGNvbXBs6XRpb24gZXN0IHLpcOl06WUgKHR5cGlxdWVtZW50IGF2ZWMgQ1RSTC1YIENUUkwtTikuCisjICAgICAgUXVlIGNlIHNvaXQgZW4gYW5nbGFpcyBvdSBlbiBmcmFu52FpcywgaWwgeSBhIHVuIHByb2Js6G1lIGRlIG1hanVzY3VsZXMuCisjICAgICAgQmllbiBxdSdpbnNhdGlzZmFpc2FudGUsIGNldHRlIHRyYWR1Y3Rpb24gc2VtYmxlIG9wdGltYWxlLgorIzogZWRpdC5jOjMzNjMKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIgQWpvdXQiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQxMgorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gUmVjaGVyY2hlIGVuIGNvdXJzLi4uIgorCisjIEFCIC0gQ2UgdGV4dGUgcydham91dGUg4CBsYSBmaW4gZCd1biBkZXMgbWVzc2FnZXMgZGUgY29tcGzpdGlvbiBjaS1kZXNzdXMuCisjIEFCIC0gRmF1dC1pbCB1dGlsaXNlciAib3JpZ2luZSIgb3UgIm9yaWdpbmVsIiBhdSBsaWV1IGQnIm9yaWdpbmFsIiA/CisjOiBlZGl0LmM6MzQ2OAorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIkRlIHJldG91ciDgIGwnb3JpZ2luYWwiCisKKyMgQUIgLSBDZSB0ZXh0ZSBzJ2Fqb3V0ZSDgIGxhIGZpbiBkJ3VuIGRlcyBtZXNzYWdlcyBkZSBjb21wbOl0aW9uIGNpLWRlc3N1cy4KKyM6IGVkaXQuYzozNDczCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIk1vdCBkJ3VuZSBhdXRyZSBsaWduZSIKKworIyBBQiAtIENlIHRleHRlIHMnYWpvdXRlIOAgbGEgZmluIGQndW4gZGVzIG1lc3NhZ2VzIGRlIGNvbXBs6XRpb24gY2ktZGVzc3VzLgorIzogZWRpdC5jOjM0NzgKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiTGEgc2V1bGUgY29ycmVzcG9uZGFuY2UiCisKKyMgQUIgLSBDZSB0ZXh0ZSBzJ2Fqb3V0ZSDgIGxhIGZpbiBkJ3VuIGRlcyBtZXNzYWdlcyBkZSBjb21wbOl0aW9uIGNpLWRlc3N1cy4KKyMgQUIgLSBGYXV0LWlsIHJlbXBsYWNlciAic3VyIiBwYXIgImRlIiA/CisjOiBlZGl0LmM6MzUzNworIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCBvZiAlZCIKK21zZ3N0ciAiQ29ycmVzcG9uZGFuY2UgJWQgc3VyICVkIgorCisjIEFCIC0gQ2UgdGV4dGUgcydham91dGUg4CBsYSBmaW4gZCd1biBkZXMgbWVzc2FnZXMgZGUgY29tcGzpdGlvbiBjaS1kZXNzdXMuCisjOiBlZGl0LmM6MzU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAiQ29ycmVzcG9uZGFuY2UgJWQiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjk3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IFZhcmlhYmxlIGluY29ubnVlOiAlcyIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjIEFCIC0gSmUgc3VpcyBwYXJ0YWfpIGVudHJlIGxhIGNvbmNpc2lvbiBkJ3VuZSB0cmFkdWN0aW9uIGFzc2V6IGxpdHTpcmFsZSBldAorIyAgICAgIGxhIGxvdXJkZXVyIGQndW5lIHRyYWR1Y3Rpb24gcGx1cyBjb3JyZWN0ZS4KKyM6IGV2YWwuYzoxMjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogSWwgbWFucXVlICcoJyBhcHLocyAlcyIKKworIzogZXZhbC5jOjEzODAgZXZhbC5jOjEzOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiBWYXJpYWJsZSBpbmV4aXN0YW50ZTogJXMiCisKKyMgQUIgLSBKZSBzdWlzIHBhcnRhZ+kgZW50cmUgbGEgY29uY2lzaW9uIGQndW5lIHRyYWR1Y3Rpb24gYXNzZXogbGl0dOlyYWxlIGV0CisjICAgICAgbGEgbG91cmRldXIgZCd1bmUgdHJhZHVjdGlvbiBwbHVzIGNvcnJlY3RlLgorIzogZXZhbC5jOjE2NTAKK21zZ2lkICJFMTA5OiBNaXNzaW5nICc6JyBhZnRlciAnPyciCittc2dzdHIgIkUxMDk6IElsIG1hbnF1ZSAnOicgYXBy6HMgJz8nIgorCisjIEFCIC0gSmUgc3VpcyBwYXJ0YWfpIGVudHJlIGxhIGNvbmNpc2lvbiBkJ3VuZSB0cmFkdWN0aW9uIGFzc2V6IGxpdHTpcmFsZSBldAorIyAgICAgIGxhIGxvdXJkZXVyIGQndW5lIHRyYWR1Y3Rpb24gcGx1cyBjb3JyZWN0ZS4KKyM6IGV2YWwuYzoyMjY2Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IElsIG1hbnF1ZSAnKSciCisKKyMgQUIgLSBKZSBzdWlzIHBhcnRhZ+kgZW50cmUgbGEgY29uY2lzaW9uIGQndW5lIHRyYWR1Y3Rpb24gYXNzZXogbGl0dOlyYWxlIGV0CisjICAgICAgbGEgbG91cmRldXIgZCd1bmUgdHJhZHVjdGlvbiBwbHVzIGNvcnJlY3RlLgorIzogZXZhbC5jOjIzMjMKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogSWwgbWFucXVlICddJyIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjIEFCIC0gSmUgc3VpcyBwYXJ0YWfpIGVudHJlIGxhIGNvbmNpc2lvbiBkJ3VuZSB0cmFkdWN0aW9uIGFzc2V6IGxpdHTpcmFsZSBldAorIyAgICAgIGxhIGxvdXJkZXVyIGQndW5lIHRyYWR1Y3Rpb24gcGx1cyBjb3JyZWN0ZS4KKyM6IGV2YWwuYzoyMzk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiBJbCBtYW5xdWUgdW4gbm9tIGQnb3B0aW9uIGFwcuhzICVzIgorCisjOiBldmFsLmM6MjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE9wdGlvbiBpbmNvbm51ZTogJXMiCisKKyMgQUIgLSBMYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYSB2ZXJzaW9uIGFuZ2xhaXNlLCBxdWkgZXN0CisjICAgICAgZXJyb27pZSwgZCdhaWxsZXVycyA6IGlsIHMnYWdpdCBkJ3VuZSAiZG91YmxlIHF1b3RlIiBldCBub24gZCd1bmUKKyMgICAgICAicXVvdGUiLgorIzogZXZhbC5jOjI0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IElsIG1hbnF1ZSBcIiDgIGxhIGZpbiBkZSAlcyIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBldmFsLmM6MjYxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogSWwgbWFucXVlICcg4CBsYSBmaW4gZGUgJXMiCisKKyMgQUIgLSBMYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYSB2ZXJzaW9uIGFuZ2xhaXNlLgorIzogZXZhbC5jOjI5NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBVbiBhcmd1bWVudCBkZSBsYSBmb25jdGlvbiAlcyBlc3QgaW52YWxpZGUiCisKKyM6IGV2YWwuYzoyOTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBGb25jdGlvbiBpbmNvbm51ZTogJXMiCisKKyM6IGV2YWwuYzoyOTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiBMYSBmb25jdGlvbiAlcyBhIHRyb3AgZCdhcmd1bWVudHMiCisKKyM6IGV2YWwuYzoyOTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IExhIGZvbmN0aW9uICVzIG4nYSBwYXMgYXNzZXogZCdhcmd1bWVudHMiCisKKyM6IGV2YWwuYzoyOTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4gbmUgcGV1dCDqdHJlIHV0aWxpc+kgZW4gZGVob3JzIGQndW4gc2NyaXB0OiAlcyIKKworIyBBQiAtIFRleHRlIHBhciBk6WZhdXQgZHUgYm91dG9uIGRlIGxhIGJv7nRlIGRlIGRpYWxvZ3VlIGFmZmljaOllIHBhciBsYQorIyAgICAgIGZvbmN0aW9uIGNvbmZpcm0oKS4KKyMuCisjLiAqIFllcyB0aGlzIGlzIHVnbHksIEkgZG9uJ3QgcGFydGljdWxhcmx5IGxpa2UgaXQgZWl0aGVyLiAgQnV0IGRvaW5nIGl0CisjLiAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyMuICogYmUgdG91Y2hlZCBhdCBhbGwuICBTZWUgYmVsb3cgd2hhdCAnb2snIGFuZCAneW5jJyBhcmUgdXNlZCBmb3IuCisjLgorIzogZXZhbC5jOjM1ODUgZ3VpLmM6NDI1NCBndWlfZ3RrLmM6MTk5NworbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6NDEyMAorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCBsaWduZXM6ICIKKworIyBBQiAtIFRleHRlcyBkZXMgYm91dG9ucyBkZSBsYSBib+50ZSBkZSBkaWFsb2d1ZSBhZmZpY2jpZSBwYXIgaW5wdXRkaWFsb2coKS4KKyM6IGV2YWwuYzo1MzQ1Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT2tcbiIKKyImQW5udWxlciIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBldmFsLmM6NTM4NQorbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgImlucHV0cmVzdG9yZSgpIGEg6XTpIGFwcGVs6SBwbHVzIGRlIGZvaXMgcXUnaW5wdXRzYXZlKCkiCisKKyMgQUIgLSDAIG1vbiBhdmlzLCBsYSB2ZXJzaW9uIGFuZ2xhaXNlIGVzdCBlcnJvbullLgorIzogZXZhbC5jOjYzMDAKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IFBhcyBkZSBjb25uZWN0aW9uIGF1IHNlcnZldXIgWCIKKworIzogZXZhbC5jOjYzOTcKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3NzogTGEgculwb25zZSBkdSBzZXJ2ZXVyIG4nYSBwdSDqdHJlIGx1ZSIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBldmFsLmM6NjQyNQorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODogTGEgculwb25zZSBuJ2EgcHUg6nRyZSBlbnZveellIGF1IGNsaWVudCIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBldmFsLmM6NjQ3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogTCdlbnZvaSBhdSBzZXJ2ZXVyICVzIOAg6WNob3XpIgorCisjOiBldmFsLmM6NjU3MworbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKEludmFsaWRlKSIKKworIzogZXZhbC5jOjc2ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogVmFyaWFibGUgaW5k6WZpbmllOiAlcyIKKworIyBBQiAtICJpbGzpZ2FsIiBlc3QgdW4gdGVybWUgdHJvcCBmb3J0IOAgbW9uIGdv+3QuCisjOiBldmFsLmM6ODEyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYxOiBJbGxlZ2FsIHZhcmlhYmxlIG5hbWU6ICVzIgorbXNnc3RyICJFNDYxOiBOb20gZGUgdmFyaWFibGUgaWxs6WdhbDogJXMiCisKKyM6IGV2YWwuYzo4NDA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTIyOiBMYSBmb25jdGlvbiAlcyBleGlzdGUgZOlq4CAoYWpvdXRleiAhIHBvdXIgbGEgcmVtcGxhY2VyKSIKKworIzogZXZhbC5jOjg0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogRm9uY3Rpb24gaW5k6WZpbmllOiAlcyIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBwbHVzIGNvbnNpc3RhbnRlIHF1ZSBsYSB2ZXJzaW9uIGFuZ2xhaXNlLgorIyBBQiAtIEplIHN1aXMgcGFydGFn6SBlbnRyZSBsYSBjb25jaXNpb24gZCd1bmUgdHJhZHVjdGlvbiBhc3NleiBsaXR06XJhbGUgZXQKKyMgICAgICBsYSBsb3VyZGV1ciBkJ3VuZSB0cmFkdWN0aW9uIHBsdXMgY29ycmVjdGUuCisjOiBldmFsLmM6ODQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IElsIG1hbnF1ZSAnKCcgYXBy6HMgJXMiCisKKyMgQUIgLSAiaWxs6WdhbCIgZXN0IHVuIHRlcm1lIHRyb3AgZm9ydCDgIG1vbiBnb/t0LgorIzogZXZhbC5jOjg1MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IEFyZ3VtZW50IGlsbOlnYWw6ICVzIgorCisjOiBldmFsLmM6ODYwMAorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiBJbCBtYW5xdWUgOmVuZGZ1bmN0aW9uIgorCisjIEFCIC0gSWwgZXN0IGRpZmZpY2lsZSBkZSBjcullciB1bmUgdmVyc2lvbiBmcmFu52Fpc2UgcXVpIGZhc3NlIG1vaW5zIGRlIDgwCisjICAgICAgY2FyYWN06HJlcyBkZSBsb25nLCBub20gZGUgbGEgZm9uY3Rpb24gY29tcHJpcyA6ICJJdCBpcyBpbiB1c2UiIGVzdCB1bmUKKyMgICAgICBleHByZXNzaW9uIHRy6HMgZGVuc2UuIFRyYWR1Y3Rpb25zIHBvc3NpYmxlcyA6ICJlbGxlIGVzdCB1dGlsaXPpZSIsCisjICAgICAgImVsbGUgcydleOljdXRlIiBvdSAiZWxsZSBlc3Qgb2NjdXDpZSIuCisjOiBldmFsLmM6ODY4MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzogSW1wb3NzaWJsZSBkZSByZWTpZmluaXIgJXM6IGNldHRlIGZvbmN0aW9uIGVzdCBvY2N1cOllIgorCisjOiBldmFsLmM6ODc1MQorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IE5vbSBkZSBmb25jdGlvbiByZXF1aXMiCisKKyMgQUIgLSBJbCBmYXV0IHJlc3BlY3RlciBsJ2VzcHJpdCBwbHVzIHF1ZSBsYSBsZXR0cmUuCisjOiBldmFsLmM6ODgwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiAlcyBuZSBjb21tZW5jZSBwYXMgcGFyIHVuZSBtYWp1c2N1bGUiCisKKyM6IGV2YWwuYzo4OTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6IEZvbmN0aW9uIGluZOlmaW5pZTogJXMiCisKKyMgQUIgLSBJbCBlc3QgZGlmZmljaWxlIGRlIGNy6WVyIHVuZSB2ZXJzaW9uIGZyYW7nYWlzZSBxdWkgZmFzc2UgbW9pbnMgZGUgODAKKyMgICAgICBjYXJhY3TocmVzIGRlIGxvbmcsIG5vbSBkZSBsYSBmb25jdGlvbiBjb21wcmlzIDogIkl0IGlzIGluIHVzZSIgZXN0IHVuZQorIyAgICAgIGV4cHJlc3Npb24gdHLocyBkZW5zZS4gVHJhZHVjdGlvbnMgcG9zc2libGVzIDogImVsbGUgZXN0IHV0aWxpc+llIiwKKyMgICAgICAiZWxsZSBzJ2V46WN1dGUiIG91ICJlbGxlIGVzdCBvY2N1cOllIi4KKyM6IGV2YWwuYzo4OTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogSW1wb3NzaWJsZSBkJ2VmZmFjZXIgJXM6IGNldHRlIGZvbmN0aW9uIGVzdCBvY2N1cOllIgorCisjIEFCIC0gVulyaWZpZXIgZGFucyBsYSBsaXR06XJhdHVyZSB0ZWNobmlxdWUgcydpbCBuJ2V4aXN0ZSBwYXMgdW5lIG1laWxsZXVyZQorIyAgICAgIHRyYWR1Y3Rpb24gcG91ciAiZnVuY3Rpb24gY2FsbCBkZXB0aCIuCisjOiBldmFsLmM6OTA0NworbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IExhIHByb2ZvbmRldXIgZCdhcHBlbCBkZSBmb25jdGlvbiBlc3Qgc3Vw6XJpZXVyZSDgICdtYXhmdW5jZGVwdGgnIgorCisjIEFCIC0gQ2UgdGV4dGUgZmFpdCBwYXJ0aWUgZCd1biBtZXNzYWdlIGRlIGTpYm9nYWdlLgorIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTEwMAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJhcHBlbCBkZSAlcyIKKworIyBBQiAtIFbpcmlmaWVyLgorIzogZXZhbC5jOjkxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgYWJvcnRlZCIKK21zZ3N0ciAiJXMgYW5udWzpZSIKKworIyBBQiAtIENlIHRleHRlIGZhaXQgcGFydGllIGQndW4gbWVzc2FnZSBkZSBk6WJvZ2FnZS4KKyM6IGV2YWwuYzo5MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICIlcyBhIHJldG91cm7pICMlbGQiCisKKyMgQUIgLSBDZSB0ZXh0ZSBmYWl0IHBhcnRpZSBkJ3VuIG1lc3NhZ2UgZGUgZOlib2dhZ2UuCisjOiBldmFsLmM6OTE3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICIlcyBhIHJldG91cm7pIFwiJXNcIiIKKworIyBBQiAtIENlIHRleHRlIGZhaXQgcGFydGllIGQndW4gbWVzc2FnZSBkZSBk6WJvZ2FnZS4KKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjkxODcgZXhfY21kczIuYzoyMjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgImNvbnRpbnVpbmcgaW4gJXMiCittc2dzdHIgImRlIHJldG91ciBkYW5zICVzIgorCisjOiBldmFsLmM6OTIxMworbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiA6cmV0dXJuIG4nZXN0IHBhcyDgIGwnaW506XJpZXVyIGQndW5lIGZvbmN0aW9uIgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IGNhcGl0YWxpc+llIHBvdXIg6nRyZSBlbiBhY2NvcmQgYXZlYyBsZXMgYXV0cmVzCisjICAgICAgY29tbWVudGFpcmVzIGVucmVnaXN0culzIGRhbnMgbGUgZmljaGllciB2aW1pbmZvLgorIzogZXZhbC5jOjk1NDQKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBWYXJpYWJsZXMgZ2xvYmFsZXM6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKKworIyBBQiAtIExhIHZlcnNpb24gYW5nbGFpc2UgZXN0IHRy6HMgbWF1dmFpc2UsIGNlIHF1aSBtJ29ibGlnZSBhIGludmVudGVyIHVuZQorIyAgICAgIHZlcnNpb24gZnJhbudhaXNlLgorIzogZXhfY21kcy5jOjQzMworbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiBMYSBkZXN0aW5hdGlvbiBlc3QgZGFucyBsYSBwbGFnZSBkJ29yaWdpbmUiCisKKyM6IGV4X2NtZHMuYzo1MDIKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIjEgbGlnbmUgZOlwbGFj6WUiCisKKyM6IGV4X2NtZHMuYzo1MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICIlbGQgbGlnbmVzIGTpcGxhY+llcyIKKworIzogZXhfY21kcy5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCBsaWduZXMgZmlsdHLpZXMiCisKKyMgQUIgLSBKJ2FpIHZvbG9udGFpcmVtZW50IG9taXMgbCdhc3TpcmlzcXVlIGluaXRpYWxlIGNhciBqZSBwZW5zZSBxdWUgbGUKKyMgICAgICBtb3RpZiAiRmlsdGVyKiIgZOljcml0IHBsdXMgY2xhaXJlbWVudCBsZXMgcXVhdHJlIGF1dG9jb21tYW5kZXMgbGnpZXMKKyMgICAgICBhdSBmaWx0cmFnZSAoRmlsdGVyUmVhZFByZSwgRmlsdGVyUmVhZFBvc3QsIEZpbHRlcldyaXRlUHJlIGV0CisjICAgICAgRmlsdGVyV3JpdGVQb3N0KSBxdWUgIipGaWx0ZXIqIiBxdWUgbCdvbiBjb25mb25kIGF2ZWMgdW5lIHRlbnRhdGl2ZSBkZQorIyAgICAgIG1pc2UgZW4gdmFsZXVyLgorIzogZXhfY21kcy5jOjkzNworbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIiIKKyJFMTM1OiBMZXMgYXV0b2NvbW1hbmRlcyBGaWx0ZXIqIG5lIGRvaXZlbnQgcGFzIGNoYW5nZXIgbGUgdGFtcG9uIGNvdXJhbnQiCisKKyMgQUIgLSBJbCBmYXV0IHJlc3BlY3RlciBsJ2VzcHJpdCBwbHVzIHF1ZSBsYSBsZXR0cmUuIERhbnMgbGUgY2FzIHBy6XNlbnQsCisjICAgICAgbmV0dGVtZW50IHBsdXMuCisjOiBleF9jbWRzLmM6MTAyMgorbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW0F0dGVudGlvbjogdG91dCBuJ2VzdCBwYXMgZW5yZWdpc3Ry6V1cbiIKKworIyBBQiAtIExlIG51belybyBldCBsZSBtZXNzYWdlIGQnZXJyZXVyICglcyBjaS1kZXNzb3VzKSBldCBsZSAibnVt6XJvIiBkZSBsaWduZQorIyAgICAgIHNvbnQgZGVzIGNoYe5uZXMgZGUgY2FyYWN06HJlcyBkb250IGxlIGNvbnRlbnUgZXN0IOAgbGEgZGlzY3LpdGlvbiBkZQorIyAgICAgIGwnYXBwZWxhbnQgZGUgbGEgZm9uY3Rpb24gdmltaW5mb19lcnJvcigpLgorIzogZXhfY21kcy5jOjEyNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXN2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgIiVzdmltaW5mbzogJXMg4CBsYSBsaWduZSAiCisKKyMgQUIgLSBMYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYSB2ZXJzaW9uIGFuZ2xhaXNlLgorIzogZXhfY21kcy5jOjEyNzMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiIgorIkUxMzY6IElsIHkgYSB0cm9wIGQnZXJyZXVyczsgaW50ZXJydXB0aW9uIGRlIGxhIGxlY3R1cmUgZHUgZmljaGllciB2aW1pbmZvIgorCisjIEFCIC0gQ2UgdGV4dGUgZmFpdCBwYXJ0aWUgZCd1biBtZXNzYWdlIGRlIGTpYm9nYWdlLgorIzogZXhfY21kcy5jOjEzMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJMZWN0dXJlIGR1IGZpY2hpZXIgdmltaW5mbyBcIiVzXCIlcyVzJXMiCisKKyMgQUIgLSBDZSB0ZXh0ZSBmYWl0IHBhcnRpZSBkJ3VuIG1lc3NhZ2UgZGUgZOlib2dhZ2UuCisjOiBleF9jbWRzLmM6MTMwOQorbXNnaWQgIiBpbmZvIgorbXNnc3RyICIgaW5mbyIKKworIyBBQiAtIENlIHRleHRlIGZhaXQgcGFydGllIGQndW4gbWVzc2FnZSBkZSBk6WJvZ2FnZS4KKyM6IGV4X2NtZHMuYzoxMzEwCittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgbWFycXVlcyIKKworIyBBQiAtIENlIHRleHRlIGZhaXQgcGFydGllIGQndW4gbWVzc2FnZSBkZSBk6WJvZ2FnZS4KKyM6IGV4X2NtZHMuYzoxMzExCittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIMlDSEVDIgorCisjIEFCIC0gSidlc3DocmUgcXVlIGxhIHBsdXBhcnQgZGVzIHV0aWxpc2F0ZXVycyBhdXJhIGwnaWTpZSBkJ2FsbGVyIHbpcmlmaWVyCisjICAgICAgc2VzIGRyb2l0cyBkJ2FjY+hzLgorIyBBQiAtIExlIG1vdCAidmltaW5mbyIgYSDpdOkgcmV0aXLpIHBvdXIgcXVlIGxlIG1lc3NhZ2UgbmUgZOlwYXNzZSBwYXMgODAKKyMgICAgICBjYXJhY3TocmVzIGRhbnMgbGUgY2FzIGNvdXJhbnQgb/kgJXMgPSAvaG9tZS8xMjM0NTY3OC8udmltaW5mbworIzogZXhfY21kcy5jOjE0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IEwn6WNyaXR1cmUgZGFucyBsZSBmaWNoaWVyICVzIGVzdCBpbnRlcmRpdGUiCisKKyMgQUIgLSBMZSBwb2ludCBkJ2V4Y2xhbWF0aW9uIGVzdCBzdXBlcmZsdS4KKyMgQUIgLSBMZSBtb3QgInZpbWluZm8iIGEg6XTpIHJldGly6SBwb3VyIHF1ZSBsZSBtZXNzYWdlIG5lIGTpcGFzc2UgcGFzIDgwCisjICAgICAgY2FyYWN06HJlcyBkYW5zIGxlIGNhcyBjb3VyYW50IG/5ICVzID0gL2hvbWUvMTIzNDU2NzgvLnZpbWluZm8KKyM6IGV4X2NtZHMuYzoxNTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IEltcG9zc2libGUgZCfpY3JpcmUgbGUgZmljaGllciAlcyIKKworIyBBQiAtIENlIHRleHRlIGVzdCB1biBtZXNzYWdlIGRlIGTpYm9nYWdlLgorIzogZXhfY21kcy5jOjE1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICLJY3JpdHVyZSBkdSBmaWNoaWVyIHZpbWluZm8gXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgQ2UgZmljaGllciB2aW1pbmZvIGEg6XTpIGfpbuly6SBwYXIgVmltICVzLlxuIgorCisjIEFCIC0gTGVzIGRldXggdmVyc2lvbnMsIGJpZW4gcXVlIGRpZmbpcmVudGVzLCBzZSB2YWxlbnQuCisjOiBleF9jbWRzLmM6MTYzNgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgVm91cyBwb3V2ZXogbCfpZGl0ZXIsIG1haXMgc295ZXogcHJ1ZGVudC5cbiIKKyJcbiIKKworIyBBQiAtIEplIHBy6WbocmUgIlZhbGV1ciBkZSAnZW5jb2RpbmcnIiDgICJWYWxldXIgZCcnZW5jb2RpbmcnIi4KKyM6IGV4X2NtZHMuYzoxNjM4Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgJ2VuY29kaW5nJyBkYW5zIGxlcXVlbCBjZSBmaWNoaWVyIGEg6XTpIOljcml0XG4iCisKKyMgQUIgLSBDZSB0ZXh0ZSBlc3QgcGFzc+kgZW4gYXJndW1lbnQg4CBsYSBmb25jdGlvbiB2aW1pbmZvX2Vycm9yKCkuCisjIEFCIC0gImlsbOlnYWwiIGVzdCB1biB0ZXJtZSB0cm9wIGZvcnQg4CBtb24gZ2/7dC4KKyM6IGV4X2NtZHMuYzoxNzM3Cittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICJDYXJhY3TocmUgaW5pdGlhbCBpbGzpZ2FsIgorCisjIEFCIC0gQ2VjaSBlc3QgdW4gdGl0cmUgZGUgYm/udGUgZGUgZGlhbG9ndWUuIFbpcmlmaWVyIHF1ZSBsYSB2ZXJzaW9uCisjICAgICAgZnJhbudhaXNlIGVzdCBjb3JyZWN0ZSBwb3VyIGxlcyB0cm9pcyBy6WbpcmVuY2VzIDsgaidhaSB1biBkb3V0ZSBxdWFudAorIyAgICAgIOAgbGEgdHJvaXNp6G1lLgorIzogZXhfY21kcy5jOjIwODIgZXhfY21kcy5jOjIzNDcgZXhfY21kczIuYzo3NTQKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICJFbnJlZ2lzdHJlciBzb3VzIC0gVmltIgorCisjLiBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMuICogZ29vZCBpZGVhLgorIzogZXhfY21kcy5jOjIxMjUKK21zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKK21zZ3N0ciAiRTEzOTogTGUgZmljaGllciBlc3QgY2hhcmfpIGRhbnMgdW4gYXV0cmUgdGFtcG9uIgorCisjIEFCIC0gQ2VjaSBlc3QgdW4gY29udGVudSBkZSBib+50ZSBkZSBkaWFsb2d1ZSAo6XZlbnR1ZWxsZW1lbnQgZW4gbW9kZSB0ZXh0ZSkuCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZS4KKyM6IGV4X2NtZHMuYzoyMTU5Cittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiUGVyZHJlIHVuZSBwYXJ0aWUgZHUgZmljaGllciA/IgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG5ldHRlbWVudCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBleF9jbWRzLmM6MjE2NgorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICIiCisiRTE0MDogVW5lIHBhcnRpZSBkdSBmaWNoaWVyIHNlcmFpdCBwZXJkdWUgKGFqb3V0ZXogISBwb3VyIHBhc3NlciBvdXRyZSkiCisKKyMgQUIgLSBDZWNpIGVzdCB1biBjb250ZW51IGRlIGJv7nRlIGRlIGRpYWxvZ3VlICjpdmVudHVlbGxlbWVudCBlbiBtb2RlIHRleHRlKS4KKyM6IGV4X2NtZHMuYzoyMjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAiyWNyYXNlciBsZSBmaWNoaWVyICUuKnMgZXhpc3RhbnQgPyIKKworIzogZXhfY21kcy5jOjIzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiBQYXMgZGUgbm9tIGRlIGZpY2hpZXIgcG91ciBsZSB0YW1wb24gJWxkIgorCisjIEFCIC0gSWwgZmF1dCByZXNwZWN0ZXIgbCdlc3ByaXQgcGx1cyBxdWUgbGEgbGV0dHJlLgorIzogZXhfY21kcy5jOjIzOTAKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiBMJ29wdGlvbiAnbm93cml0ZScgZXN0IGFjdGl26WUgZXQgZW1w6mNoZSB0b3V0ZSDpY3JpdHVyZSBkZSBmaWNoaWVyIgorCisjIEFCIC0gQ2VjaSBlc3QgdW4gY29udGVudSBkZSBib+50ZSBkZSBkaWFsb2d1ZSAo6XZlbnR1ZWxsZW1lbnQgZW4gbW9kZSB0ZXh0ZSkuCisjIEFCIC0gImFjdGl26WUgcG91ciIgbidlc3QgcGFzIHVuZSBmb3JtdWxhdGlvbiB0cuhzIGhldXJldXNlLgorIzogZXhfY21kcy5jOjI0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIkwnb3B0aW9uICdyZWFkb25seScgZXN0IGFjdGl26WUgcG91ciAlLipzLlxuIgorIlZvdWxlei12b3VzIHF1YW5kIG3qbWUgZW5yZWdpc3RyZXIgPyIKKworIyBBQiAtIENlY2kgZXN0IHVuIHRpdHJlIGRlIGJv7nRlIGRlIGRpYWxvZ3VlLgorIzogZXhfY21kcy5jOjI1NzUKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIk91dnJpciB1biBmaWNoaWVyIC0gVmltIgorCisjIEFCIC0gSWwgZmF1dCByZXNwZWN0ZXIgbCdlc3ByaXQgcGx1cyBxdWUgbGEgbGV0dHJlLgorIyBBQiAtIEonaOlzaXRlIOAgYWpvdXRlciAi4CBzYSBjculhdGlvbiIgYXBy6HMgbGUgbm9tIGR1IHRhbXBvbi4gQ2UgbWVzc2FnZQorIyAgICAgIGRldnJhaXQgbifqdHJlIGFmZmljaOkgcXUnYXBy6HMgdW5lIHRlbnRhdGl2ZSBkJ291dmVydHVyZSBkZSBmaWNoaWVyLAorIyAgICAgIGxhIHZlcnNpb24gYWN0dWVsbGUgZGV2cmFpdCBkb25jIHN1ZmZpcmUuCisjOiBleF9jbWRzLmM6MzE0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogVW5lIGF1dG9jb21tYW5kZSBhIGVmZmFj6SBsZSB0YW1wb24gJXMiCisKKyM6IGV4X2NtZHMuYzozMjc5Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IEwnYXJndW1lbnQgZGUgOnogbidlc3QgcGFzIG51belyaXF1ZSIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGZlcmEgcGV1dC3qdHJlIG1pZXV4IHBhc3NlciBsJ2Ft6HJlIHBpbGx1bGUuCisjICAgICAgTGEgY29uc3VsdGF0aW9uIGRlIGwnYWlkZSBkb25uZXJhIGwnZXhwbGljYXRpb24gY29tcGzodGUg4CBjZXV4IHF1aQorIyAgICAgIG5lIGNvbXByZW5kcmFpZW50IHBhcyDgIHF1b2kgY2UgbWVzc2FnZSBlc3QgZPsuCisjOiBleF9jbWRzLmM6MzM2NAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IExlcyBjb21tYW5kZXMgZXh0ZXJuZXMgc29udCBpbmRpc3BvbmlibGVzIgorCisjOiBleF9jbWRzLmM6MzQ3MQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IExlcyBleHByZXNzaW9ucyBy6Wd1bGnocmVzIG5lIHBldXZlbnQg6nRyZSBk6WxpbWl06WVzIHBhciBkZXMgbGV0dHJlcyIKKworIzogZXhfY21kcy5jOjM4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAicmVtcGxhY2VyIHBhciAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCisKKyM6IGV4X2NtZHMuYzo0MTg5Cittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIihJbnRlcnJvbXB1KSAiCisKKyM6IGV4X2NtZHMuYzo0MTkzCittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIjEgc3Vic3RpdHV0aW9uIgorCisjOiBleF9jbWRzLmM6NDE5NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAiJWxkIHN1YnN0aXR1dGlvbnMiCisKKyM6IGV4X2NtZHMuYzo0MTk4Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIHN1ciAxIGxpZ25lIgorCisjOiBleF9jbWRzLmM6NDIwMAorIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgc3VyICVsZCBsaWduZXMiCisKKyMgQUIgLSBJbCBmYXV0IHJlc3BlY3RlciBsJ2VzcHJpdCBwbHVzIHF1ZSBsYSBsZXR0cmUuCisjIEFCIC0gQ2UgbWVzc2FnZSBkZXZyYWl0IGNvbnRlbmlyIHVuZSBy6WbpcmVuY2Ug4CA6dmdsb2JhbC4KKyM6IGV4X2NtZHMuYzo0MjUxCittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiA6Z2xvYmFsIG5lIHBldXQgZXjpY3V0ZXIgOmdsb2JhbCIKKworIyBBQiAtIENlIG1lc3NhZ2UgZGV2cmFpdCBjb250ZW5pciB1bmUgculm6XJlbmNlIOAgOnZnbG9iYWwuCisjOiBleF9jbWRzLmM6NDI4NgorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiA6Z2xvYmFsIGRvaXQg6nRyZSBzdWl2aSBwYXIgdW5lIGV4cHJlc3Npb24gculndWxp6HJlIgorCisjIEFCIC0gQ2UgbWVzc2FnZSBlc3QgdXRpbGlz6SBsb3JzcXVlIDp2Z2xvYmFsIG5lIHRyb3V2ZSByaWVuLiBMb3JzcXVlIDpnbG9iYWwKKyMgICAgICBuZSB0cm91dmUgcmllbiwgYydlc3QgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIgLyAiTW90aWYgaW50cm91dmFibGU6ICVzIgorIyAgICAgIHF1aSBlc3QgdXRpbGlz6S4KKyM6IGV4X2NtZHMuYzo0MzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIk1vdGlmIHRyb3V26SDgIGNoYXF1ZSBsaWduZTogJXMiCisKKyMgQUIgLSBOZSBwYXMgdHJhZHVpcmUgbGUgZG9sbGFyLgorIyBBQiAtIENlIG1lc3NhZ2Ugbidlc3Qgdm9sb250YWlyZW1lbnQgcGFzIHRyYWR1aXQuIEVuIGVmZmV0LCBpbCBmYWl0IHBhcnRpZQorIyAgICAgIGQndW4gZ3JvdXBlIGRlIHRyb2lzIG1lc3NhZ2VzIGRhbnMgdmltaW5mbywgZG9udCBkZXV4IG5lIHNvbnQgcGFzIHNvdW1pcworIyAgICAgIOAgaW50ZXJuYXRpb25hbGlzYXRpb24uIEonYXR0ZW5kcyBxdWUgbGVzIGRldXggYXV0cmVzIG1lc3NhZ2VzIHNvaWVudAorIyAgICAgIHRyYWR1aXNpYmxlcyBwb3VyIHRyYWR1aXJlIGNlbHVpLWNpLgorIzogZXhfY21kcy5jOjQ0MTYKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ1MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBE6XNvbOksIHBhcyBkJ2FpZGUgcG91ciAlcyIKKworIzogZXhfY21kcy5jOjQ1NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICJE6XNvbOksIGxlIGZpY2hpZXIgZCdhaWRlICVzIGVzdCBpbnRyb3V2YWJsZSIKKworIzogZXhfY21kcy5jOjUwMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogJXMgbidlc3QgcGFzIHVuIHLpcGVydG9pcmUiCisKKyMgQUIgLSBMYSB2ZXJzaW9uIGFuZ2xhaXNlIGVzdCBwbHVzIHBy6WNpc2UsIG1haXMgdHJvcCB0ZWNobmlxdWUuCisjOiBleF9jbWRzLmM6NTA2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1MjogSW1wb3NzaWJsZSBkJ+ljcmlyZSAlcyIKKworIyBBQiAtIExhIHZlcnNpb24gYW5nbGFpc2UgZXN0IHBsdXMgcHLpY2lzZSwgbWFpcyB0cm9wIHRlY2huaXF1ZS4KKyM6IGV4X2NtZHMuYzo1MTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiBJbXBvc3NpYmxlIGRlIGxpcmUgJXMiCisKKyMgQUIgLSBMJ+l0aXF1ZXR0ZSBsYSBwbHVzIGxvbmd1ZSBmYWl0IDI3IGNhcmFjdOhyZXMuIExlIG5vbSBkZSBmaWNoaWVyIGxlIHBsdXMKKyMgICAgICBsb25nIGZhaXQgMTIgY2FyYWN06HJlcy4gSWwgZmF1ZHJhaXQgZG9uYyBpZOlhbGVtZW50IGZhaXJlIHVuZQorIyAgICAgIHRyYWR1Y3Rpb24gZGUgNDAgY2FyYWN06HJlcyBvdSBtb2lucy4gQ2UgcXVpIGVzdCBsb2luIGQn6nRyZSBsZSBjYXMKKyMgICAgICBwculzZW50LgorIzogZXhfY21kcy5jOjUxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogTCfpdGlxdWV0dGUgXCIlc1wiIGFwcGFyYe50IGRldXggZm9pcyBkYW5zIGxlIGZpY2hpZXIgJXMiCisKKyMgQUIgLSBJbCBmYXV0IHJlc3BlY3RlciBsJ2VzcHJpdCBwbHVzIHF1ZSBsYSBsZXR0cmUuCisjOiBleF9jbWRzLmM6NTI4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IENvbW1hbmRlIGluY29ubnVlOiA6c2lnbiAlcyIKKworIyBBQiAtIExhIHZlcnNpb24gZnJhbudhaXNlIGVzdCBtZWlsbGV1cmUgcXVlIGxhIHZlcnNpb24gYW5nbGFpc2UuCisjOiBleF9jbWRzLmM6NTMwOAorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBJbCBtYW5xdWUgbGUgbm9tIGR1IHN5bWJvbGUiCisKKyM6IGV4X2NtZHMuYzo1MzU0Cittc2dpZCAiRTYxMjogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTYxMjogVHJvcCBkZSBzeW1ib2xlcyBzb250IGTpZmluaXMiCisKKyMgQUIgLSBDZXR0ZSB0cmFkdWN0aW9uIG5lIG1lIHNhdGlzZmFpdCBwYXMuCisjOiBleF9jbWRzLmM6NTQyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IExhIHZlcnNpb24gdGV4dGUgZHUgc3ltYm9sZSBlc3QgaW52YWxpZGU6ICVzIgorCisjOiBleF9jbWRzLmM6NTQ1MiBleF9jbWRzLmM6NTYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiBTeW1ib2xlIGluY29ubnU6ICVzIgorCisjIEFCIC0gTGEgdmVyc2lvbiBmcmFu52Fpc2UgZXN0IG1laWxsZXVyZSBxdWUgbGEgdmVyc2lvbiBhbmdsYWlzZS4KKyM6IGV4X2NtZHMuYzo1NDk4Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogSWwgbWFucXVlIGwnSUQgZHUgc3ltYm9sZSIKKworIyBBQiAtIFZ1IGxlIGNvZGUgc291cmNlLCBsYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYQorIyAgICAgIHZlcnNpb24gYW5nbGFpc2UuIENlIG1lc3NhZ2UgZXN0IHNpbWlsYWlyZSBhdSBtZXNzYWdlIEUxMDIuCisjOiBleF9jbWRzLmM6NTU3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODogTGUgdGFtcG9uICVzIGVzdCBpbnRyb3V2YWJsZSIKKworIyBBQiAtIFZ1IGxlIGNvZGUgc291cmNlLCBsYSB2ZXJzaW9uIGZyYW7nYWlzZSBlc3QgbWVpbGxldXJlIHF1ZSBsYQorIyAgICAgIHZlcnNpb24gYW5nbGFpc2UuCisjOiBleF9jbWRzLmM6NTYxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogTGUgc3ltYm9sZSAlbGQgZXN0IGludHJvdXZhYmxlIgorCisjOiBleF9jbWRzLmM6NTc4OAorbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW0VmZmFj6V0iCisKKyMgQUIgLSBMYSB2ZXJzaW9uIGZyYW7nYWlzZSBkZSBsYSBwcmVtaehyZSBwaHJhc2UgbmUgbWUgc2F0aXNmYWl0IHBhcy4KKyM6IGV4X2NtZHMyLmM6ODMKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBjb250aW51ZS4iCittc2dzdHIgIkTpYnV0IGR1IGTpYm9ndWFnZS4gVGFwZXogXCJjb250XCIgcG91ciBjb250aW51ZXIuIgorCisjOiBleF9jbWRzMi5jOjg3IGV4X2RvY21kLmM6ODU0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAibGlnbmUgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo4OQorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJjbWRlOiAlcyIKKworIzogZXhfY21kczIuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiUG9pbnQgZCdpbnRlcnJ1cHRpb24gZGFucyAlcyVzIGxpZ25lICVsZCIKKworIzogZXhfY21kczIuYzo1MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiBMZSBwb2ludCBkJ2ludGVycnVwdGlvbiAlcyBlc3QgaW50cm91dmFibGUiCisKKyM6IGV4X2NtZHMyLmM6NTU3Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAiQXVjdW4gcG9pbnQgZCdpbnRlcnJ1cHRpb24gbidlc3QgZOlmaW5pIgorCisjIEFCIC0gTGUgZGV1eGnobWUgJXMgZXN0IHJlbXBsYWPpIHBhciAiZnVuYyIgb3UgImZpbGUiIHNhbnMgcXVlIGwnb24gcHVpc3NlCisjICAgICAgdHJhZHVpcmUgY2VzIG1vdHMuCisjOiBleF9jbWRzMi5jOjU2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgbGlnbmUgJWxkIgorCisjIEFCIC0gImNoYW5nZXMgdG8iIGVzdCByZWRvbmRhbnQgZXQgYSDpdOkgb21pcyBkZSBsYSB2ZXJzaW9uIGZyYW7nYWlzZS4KKyM6IGV4X2NtZHMyLmM6Nzc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgIkVucmVnaXN0cmVyICUuKnMgPyIKKworIyBBQiAtIFNpIGxlcyBwYXJlbnRo6HNlcyBwb3NlbnQgcHJvYmzobWUsIGlsIGZhdWRyYSByZW1ldHRyZSBsZXMgZ3VpbGxlbWVudHMKKyMgICAgICBjaS1kZXNzdXMuCisjOiBleF9jbWRzMi5jOjc3OSBleF9kb2NtZC5jOjg5MTcKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiKHNhbnMgdGl0cmUpIgorCisjIEFCIC0gSWwgZmF1dCByZXNwZWN0ZXIgbCdlc3ByaXQgcGx1cyBxdWUgbGEgbGV0dHJlLgorIyBBQiAtIENlIG1lc3NhZ2UgZXN0IHNpbWlsYWlyZSBhdSBtZXNzYWdlIEU4OS4KKyM6IGV4X2NtZHMyLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiBMZSB0YW1wb24gJXMgbidhIHBhcyDpdOkgZW5yZWdpc3Ry6SIKKworIyAjIyBIRVJFICMjIworIzogZXhfY21kczIuYzo5ODQKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgIkFsZXJ0ZTogRW50cullIGluYXR0ZW5kdWUgZGFucyB1biBhdXRyZSB0YW1wb24gKHbpcmlmaWVyIGF1dG9jbWRlcykiCisKKyM6IGV4X2NtZHMyLmM6MTM4NworbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogSWwgbid5IGEgcXUndW4gc2V1bCBmaWNoaWVyIOAg6WRpdGVyIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IE5lIHBldXQgYWxsZXIgYXZhbnQgbGUgcHJlbWllciBmaWNoaWVyIgorCisjOiBleF9jbWRzMi5jOjEzOTEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogTmUgcGV1dCBhbGxlciBhdSBkZWzgIGR1IGRlcm5pZXIgZmljaGllciIKKworIzogZXhfY21kczIuYzoxODQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiUmVjaGVyY2hlIGRlIFwiJXNcIiBkYW5zIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICJSZWNoZXJjaGUgZGUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAiaW50cm91dmFibGUgZGFucyAncnVudGltZXBhdGgnOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTkxOAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICJTb3VyY2VyIHVuIHNjcmlwdCAtIFZpbSIKKworIzogZXhfY21kczIuYzoyMDY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAiTmUgcGV1dCBzb3VyY2VyIHVuIHLpcGVydG9pcmU6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMDk5CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJwYXMgcHUgc291cmNlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjEwMQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgImxpZ25lICVsZDogcGFzIHB1IHNvdXJjZXIgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIxMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJzb3Vy52FnZSBcIiVzXCIiCisKKyMgVE9ETworIzogZXhfY21kczIuYzoyMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImxpZ25lICVsZDogc291cudhZ2UgZGUgXCIlc1wiIgorCisjIHRvZG8KKyM6IGV4X2NtZHMyLmM6MjI0MgorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiZmluIGR1IHNvdXLnYWdlIGRlICVzIgorCisjOiBleF9jbWRzMi5jOjI1ODAKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiBXYXJuaW5nOiBNYXV2YWlzIHPpcGFyYXRldXIgZGUgbGlnbmUsIF5NIG1hbnF1ZSBwZXV0Lep0cmUiCisKKyM6IGV4X2NtZHMyLmM6MjYyOQorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1dGlsaXPpIGVuIGRlaG9ycyBkJ3VuIGZpY2hpZXIgc291cmPpIgorCisjIHRvZG8KKyM6IGV4X2NtZHMyLmM6MjY2MgorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiA6ZmluaXNoIHV0aWxpc+kgZW4gZGVob3JzIGQndW4gZmljaGllciBzb3VyY+kiCisKKyM6IGV4X2NtZHMyLmM6MzEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICJQYWdlICVkIgorCisjOiBleF9jbWRzMi5jOjMyNjEKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIlBhcyBkZSB0ZXh0ZSDgIGltcHJpbWVyIgorCisjOiBleF9jbWRzMi5jOjMzMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIkltcHJlc3Npb24gZGUgbGEgcGFnZSAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MzM0OAorIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIENvcGllICVkIGRlICVkIgorCisjOiBleF9jbWRzMi5jOjM0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIkltcHJpbek6ICVzIgorCisjOiBleF9jbWRzMi5jOjM0MTMKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICJJbXByZXNzaW9uIGludGVycm9tcHVlIgorCisjOiBleF9jbWRzMi5jOjM3NzgKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEVycmV1ciBsb3JzIGRlIGwn6WNyaXR1cmUgZHUgZmljaGllciBQb3N0U2NyaXB0IGRlIHNvcnRpZSIKKworIzogZXhfY21kczIuYzo0MDUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IFBldXQgcGFzIG91dnJpciBsZSBmaWNoaWVyIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MDYzIGV4X2NtZHMyLmM6NDY4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IFBldXQgcGFzIGxpcmUgbGUgZmljaGllciBkZSByZXNzb3VyY2UgUG9zdFNjcmlwdCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDA3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IFwiJXNcIiBuJ2VzdCBwYXMgdW4gZmljaGllciBkZSByZXNzb3VyY2UgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo0MDg2IGV4X2NtZHMyLmM6NDEwNiBleF9jbWRzMi5jOjQxMjEgZXhfY21kczIuYzo0MTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTk6IFwiJXNcIiBuJ2VzdCBwYXMgdW4gZmljaGllciBkZSByZXNzb3VyY2UgUG9zdFNjcmlwdCBzdXBwb3J06SIKKworIzogZXhfY21kczIuYzo0MTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIgorbXNnc3RyICJFNjIxOiBMYSB2ZXJzaW9uIGR1IGZpY2hpZXIgZGUgcmVzc291cmNlIFwiJXNcIiBlc3QgbWF1dmFpc2UiCisKKyM6IGV4X2NtZHMyLmM6NDY0MAorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDogUGV1dCBwYXMgb3V2cmlyIGxlIGZpY2hpZXIgUG9zdFNjcmlwdCBkZSBzb3J0aWUiCisKKyM6IGV4X2NtZHMyLmM6NDY3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBQZXV0IHBhcyBvdXZyaXIgbGUgZmljaGllciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDc5MgorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwicHJvbG9nLnBzXCIiCittc2dzdHIgIkU0NTY6IExlIGZpY2hpZXIgZGUgcmVzc291cmNlIFBvc3RTY3JpcHQgXCJwcm9sb2cucHNcIiBlc3QgaW50cm91dmFibGUiCisKKyM6IGV4X2NtZHMyLmM6NDgyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiCittc2dzdHIgIkU0NTY6IExlIGZpY2hpZXIgZGUgcmVzc291cmNlIFBvc3RTY3JpcHQgXCIlcy5wc1wiIGVzdCBpbnRyb3V2YWJsZSIKKworIyBUT0RPCisjOiBleF9jbWRzMi5jOjQ4NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMDogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIFwiJXNcIiBlbmNvZGluZyIKK21zZ3N0ciAiRTYyMDogTGEgY29udmVyc2lvbiBkdSBtdWx0aS1vY3RldCDgIGwnZW5jb2RhZ2UgXCIlc1wiIGEg6WNob3XpIgorCisjOiBleF9jbWRzMi5jOjQ5NjYKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIkVudm9pIOAgbCdpbXByaW1hbnRlLi4uIgorCisjOiBleF9jbWRzMi5jOjQ5NzAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiBMJ2ltcHJlc3Npb24gZHUgZmljaGllciBQb3N0U2NyaXB0IGEg6WNob3XpIgorCisjOiBleF9jbWRzMi5jOjQ5NzIKK21zZ2lkICJQcmludCBqb2Igc2VudC4iCittc2dzdHIgIkpvYiBkJ2ltcHJlc3Npb24gZW52b3npLiIKKworIzogZXhfY21kczIuYzo1MzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICJMYW5nYWdlICVzY291cmFudDogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjUzOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiCittc2dzdHIgIkUxOTc6IFBhcyBwdSBy6WdsZXIgbGUgbGFuZ2FnZSBzdXIgXCIlc1wiIgorCisjOiBleF9kb2NtZC5jOjQ4OQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJE6W1hcnJhZ2UgZHUgbW9kZSBFeC4gIFRhcGV6IFwidmlzdWFsXCIgcG91ciBhbGxlciBlbiBtb2RlIE5vcm1hbC4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkU1MDE6IEF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJFNTAxOiDAIGxhIGZpbiBkdSBmaWNoaWVyIgorCisjOiBleF9kb2NtZC5jOjYyNworbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogQ29tbWFuZGUgdHJvcCBy6WN1cnNpdmUiCisKKyMgVE9ETworIzogZXhfZG9jbWQuYzoxMDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDU6IEV4Y2VwdGlvbiBub3QgY2F1Z2h0OiAlcyIKK21zZ3N0ciAiRTYwNTogRXhjZXB0aW9uIHBhcyBhdHRyYXDpZTogJXMiCisKKyMgdG9kbworIzogZXhfZG9jbWQuYzoxMTgwCittc2dpZCAiRW5kIG9mIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRmluIGR1IGZpY2hpZXIgc291cmPpIgorCisjOiBleF9kb2NtZC5jOjExODEKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIkZpbiBkZSBsYSBmb25jdGlvbiIKKworIzogZXhfZG9jbWQuYzoxNjMzCittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogVXRpbGlzYXRpb24gYW1iaWf8ZSBkJ3VuZSBjb21tYW5kZSBk6WZpbmllIHBhciBsJ3V0aWxpc2F0ZXVyIgorCisjOiBleF9kb2NtZC5jOjE2NDcKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IFBhcyB1bmUgY29tbWFuZGUgZGUgbCfpZGl0ZXVyIgorCisjIFRPRE8gVGhpcyBtZXNzYWdlIHNob3VsZCAqc28qIGJlIEU0MiEKKyM6IGV4X2RvY21kLmM6MTczNworbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogTmUgcGFuaXF1ZXogcGFzICEiCisKKyM6IGV4X2RvY21kLmM6MTc1NgorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5MzogQ2hhbXAgZCdhY3Rpb24gaW52ZXJz6SByZed1IgorCisjIHRvZG8KKyM6IGV4X2RvY21kLmM6MTc2NQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAiQ2hhbXAgZCdhY3Rpb24gaW52ZXJz6SByZed1LCBPSyBwb3VyIGludmVyc2VyIgorCisjOiBleF9kb2NtZC5jOjE4NzYKK21zZ2lkICJFNDk0OiBVc2UgdyBvciB3Pj4iCittc2dzdHIgIkU0OTQ6IFV0aWxpc2V6IHcgb3Ugdz4+IgorCisjOiBleF9kb2NtZC5jOjM0NjMKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IETpc29s6SwgY2V0dGUgY29tbWFuZGUgbidlc3QgcGFzIGRpc3BvbmlibGUgZGFucyBjZXR0ZSB2ZXJzaW9uIgorCisjOiBleF9kb2NtZC5jOjM2NDkKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogVW4gc2V1bCBub20gZGUgZmljaGllciBhdXRvcmlz6SIKKworIzogZXhfZG9jbWQuYzo0MjExCittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiRW5jb3JlIHVuIGZpY2hpZXIg4CDpZGl0ZXIuICBRdWl0dGVyIHF1YW5kIG3qbWUgPyIKKworIzogZXhfZG9jbWQuYzo0MjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiRW5jb3JlICVkIGZpY2hpZXJzIOAg6WRpdGVyLiAgUXVpdHRlciBxdWFuZCBt6m1lID8iCisKKyM6IGV4X2RvY21kLmM6NDIyMQorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IGVuY29yZSB1biBmaWNoaWVyIOAg6WRpdGVyIgorCisjOiBleF9kb2NtZC5jOjQyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogZW5jb3JlICVsZCBmaWNoaWVycyDgIOlkaXRlciIKKworIzogZXhfZG9jbWQuYzo0MzE4Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDogTGEgY29tbWFuZGUgZXhpc3RlIGTpauA6IGFqb3V0ZXogISBwb3VyIGxhIHJlZOlmaW5pciIKKworIyBUT0RPCisjOiBleF9kb2NtZC5jOjQ0MjgKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgTm9tICAgICAgICAgQXJncyBDaGFtcCBDb21wbOl0LiAgROlmaW5pdGlvbiIKKworIzogZXhfZG9jbWQuYzo0NTE3Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICJBdWN1bmUgY29tbWFuZGUgZOlmaW5pZSBwYXIgbCd1dGlsaXNhdGV1ciB0cm91dullIgorCisjOiBleF9kb2NtZC5jOjQ1NDkKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBQYXMgZCdhdHRyaWJ1dCBzcOljaWZp6SIKKworIzogZXhfZG9jbWQuYzo0NjAxCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiBOb21icmUgZCdhcmd1bWVudHMgaW52YWxpZGUiCisKKyM6IGV4X2RvY21kLmM6NDYxNgorbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IExhIHF1YW50aXTpIG5lIHBldXQg6nRyZSBpbmRpcXXpZSBkZXV4IGZvaXMiCisKKyM6IGV4X2RvY21kLmM6NDYyNgorbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6IExhIHZhbGV1ciBwYXIgZOlmYXV0IGRlIGxhIHF1YW50aXTpIGVzdCBpbnZhbGlkZSIKKworIyBUT0RPCisjOiBleF9kb2NtZC5jOjQ2NTcKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcyBwb3VyIGNvbXBsZXRlIgorCisjOiBleF9kb2NtZC5jOjQ2ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IFZhbGV1ciBjb21wbOh0ZSBpbnZhbGlkZTogJXMiCisKKyM6IGV4X2RvY21kLmM6NDY5NAorbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIkU0Njc6IExhIGNvbXBs6XRpb24gcGVyc29ubmFsaXPpZSByZXF1aWVydCB1bmUgZm9uY3Rpb24gZW4gYXJndW1lbnQiCisKKyM6IGV4X2RvY21kLmM6NDY5OQorbXNnaWQgIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIKK21zZ3N0ciAiRTQ2ODogU2V1bGUgbGEgY29tcGzpdGlvbiBwZXJzb25uYWxpc+llIHByZW5kIHVuIGFyZ3VtZW50IgorCisjOiBleF9kb2NtZC5jOjQ3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiBBdHRyaWJ1dCBpbnZhbGlkZTogJXMiCisKKyM6IGV4X2RvY21kLmM6NDc1MgorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBOb20gZGUgY29tbWFuZGUgaW52YWxpZGUiCisKKyMgVE9ETworIzogZXhfZG9jbWQuYzo0NzY3Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBDb21tYW5kZXMgZOlmaW5pZXMgcGFyIHV0aWxpc2F0ZXVyIGRvaXZlbnQgY29tbWVuY2VyIHBhciBtYWp1c2N1bGUiCisKKyM6IGV4X2RvY21kLmM6NDgzNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogUGFzIGRlIHRlbGxlIGNvbW1hbmRlIGTpZmluaWUgcGFyIGwndXRpbGlzYXRldXI6ICVzIgorCisjOiBleF9kb2NtZC5jOjUyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBOZSBwZXV0IHRyb3V2ZXIgbGUgc3R5bGUgZGUgY291bGV1cnMgJXMiCisKKyM6IGV4X2RvY21kLmM6NTMwMgorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICJCaWVudmVudWUsIHV0aWxpc2F0ZXVyIGRlIFZpbSAhIgorCisjOiBleF9kb2NtZC5jOjYwMTMKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiT3V2cmlyIHVuIGZpY2hpZXIgZGFucyB1bmUgbm91dmVsbGUgZmVu6nRyZSAtIFZpbSIKKworIzogZXhfZG9jbWQuYzo2MzAwCittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICJQYXMgZGUgZmljaGllciBkJ+ljaGFuZ2UiCisKKyM6IGV4X2RvY21kLmM6NjQwNAorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJBam91dGVyIGZpY2hpZXIiCisKKyM6IGV4X2RvY21kLmM6NjQ2OAorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4NjogUGFzIGRlIHLpcGVydG9pcmUgcHLpY+lkZW50IgorCisjOiBleF9kb2NtZC5jOjY1NTAKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiBJbmNvbm51IgorCisjOiBleF9kb2NtZC5jOjY2MzUKK21zZ2lkICJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NTogOndpbnNpemUgcmVxdWllcnQgZGV1eCBhcmd1bWVudHMgbnVt6XJpcXVlcyIKKworIzogZXhfZG9jbWQuYzo2Njg2CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiUG9zaXRpb24gZGUgbGEgZmVu6nRyZTogWCAlZCwgWSAlZCIKKworIyBUT0RPCisjOiBleF9kb2NtZC5jOjY2OTEKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogTGEgculjdXDpcmF0aW9uIGRlIGxhIHBvc2l0aW9uIGRlIGxhIGZlbup0cmUgbidlc3QgcGFzIGRpc3BvLiBpY2kiCisKKyM6IGV4X2RvY21kLmM6NjcwMQorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IDp3aW5wb3MgcmVxdWllcnQgZGV1eCBhcmd1bWVudHMgbnVt6XJpcXVlcyIKKworIyB0b2RvCisjOiBleF9kb2NtZC5jOjY5ODAKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICJFbnJlZ2lzdHJlciBsYSByZWRpcmVjdGlvbiIKKworIyB0b2RvCisjOiBleF9kb2NtZC5jOjcxMzEKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIkVucmVnaXN0cmVyIGxhIHZ1ZSAtIFZpbSIKKworIzogZXhfZG9jbWQuYzo3MTMyCittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICJFbnJlZ2lzdHJlciBsYSBzZXNzaW9uIC0gVmltIgorCisjIFRPRE8KKyM6IGV4X2RvY21kLmM6NzEzNAorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIkVucmVnaXN0cmVyIGxlcyBy6WdsYWdlcyAtIFZpbSIKKworIzogZXhfZG9jbWQuYzo3Mjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIGV4aXN0ZSAoYWpvdXRleiAhIHBvdXIgcGFzc2VyIG91dHJlKSIKKworIzogZXhfZG9jbWQuYzo3MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTmUgcGV1dCBvdXZyaXIgXCIlc1wiIHBvdXIgeSDpY3JpcmUiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjczMTQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IEwnYXJndW1lbnQgZG9pdCDqdHJlIHVuZSBsZXR0cmUgb3UgdW5lIGFwb3N0cm9waGUgYXZhbnQvYXJyaehyZSIKKworIzogZXhfZG9jbWQuYzo3MzU2Cittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBBcHBlbCBy6WN1cnNpZiBkZSA6bm9ybWFsIHRyb3AgaW1wb3J0YW50IgorCisjOiBleF9kb2NtZC5jOjc4NjkKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogUGFzIGRlIG5vbSBkZSBmaWNoaWVyIGFsdGVybmF0aWYg4CBzdWJzdGl0dWVyIOAgJyMnIgorCisjIFRPRE8KKyM6IGV4X2RvY21kLmM6NzkwMAorbXNnaWQgIkU0OTU6IG5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAiRTQ5NTogcGFzIGRlIG5vbSBkZSBmaWNoZXIgZCdhdXRvY29tbW1hbmRlIOAgc3Vic3RpdHVlciDgIFwiPGFmaWxlPlwiIgorCisjIFRPRE8KKyM6IGV4X2RvY21kLmM6NzkwOAorbXNnaWQgIkU0OTY6IG5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAiRTQ5NjogcGFzIGRlIG51belybyBkZSB0YW1wb24gZCdhdXRvY29tbWFuZGUg4CBzdWJzdGl0dWVyIOAgXCI8YWJ1Zj5cIiIKKworIyBUT0RPCisjOiBleF9kb2NtZC5jOjc5MTkKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiRTQ5NzogcGFzIGRlIG5vbSBkZSBjb3JyZXNwLiBkJ2F1dG9jb21tYW5kZSDgIHN1YnN0aXR1ZXIg4CBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6NzkyOQorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICJFNDk4OiBwYXMgZGUgbm9tIGRlIGZpY2hpZXIgOnNvdXJjZSDgIHN1YnN0aXR1ZXIg4CBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3OTcwCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiBOb20gZGUgZmljaGllciB2aWRlIHBvdXIgJyUnIG91ICcjJywgbmUgbWFyY2hlIHF1J2F2ZWMgXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6Nzk3MgorbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6IFLpc3VsdGUgZW4gdW5lIGNoYe5uZSB2aWRlIgorCisjOiBleF9kb2NtZC5jOjg4OTkKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IE5lIHBldXQgb3V2cmlyIHZpbWluZm8gcG91ciB5IGxpcmUiCisKKyM6IGV4X2RvY21kLmM6OTA3MgorbXNnaWQgIkUxOTY6IE5vIGRpZ3JhcGhzIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTE5NjogUGFzIGRlIGRpZ3JhcGhlcyBkYW5zIGNldHRlIHZlcnNpb24iCisKKyM6IGV4X2V2YWwuYzo0MjMKK21zZ2lkICJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiCittc2dzdHIgIkU2MDg6IEltcG9zc2libGUgZGUgbGFuY2VyIGRlcyBleGNlcHRpb25zIGF2ZWMgJ1ZpbScgY29tbWUgcHLpZml4ZSIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICJFeGNlcHRpb24gbGFuY+llOiAlcyIKKworIzogZXhfZXZhbC5jOjU1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZmluaXNoZWQ6ICVzIgorbXNnc3RyICJFeGNlcHRpb24gdGVybWlu6WU6ICVzIgorCisjOiBleF9ldmFsLmM6NTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICJFeGNlcHRpb24gZOlmYXVzc+llOiAlcyIKKworIzogZXhfZXZhbC5jOjYwMCBleF9ldmFsLmM6NjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzLCBsaW5lICVsZCIKK21zZ3N0ciAiJXMsIGxpZ25lICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICJFeGNlcHRpb24gYXR0cmFw6WU6ICVzIgorCisjOiBleF9ldmFsLmM6NjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG1hZGUgcGVuZGluZyIKK21zZ3N0ciAiJXMgYSDpdOkgbWlzZSBlbiBwYXVzZSIKKworIzogZXhfZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICIlcyBhIOl06SByZWxhbmPpZSIKKworIzogZXhfZXZhbC5jOjcwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzIGEg6XTpIGTpZmF1c3PpZSIKKworIzogZXhfZXZhbC5jOjcyNgorbXNnaWQgIkV4Y2VwdGlvbiIKK21zZ3N0ciAiRXhjZXB0aW9uIgorCisjOiBleF9ldmFsLmM6NzMyCittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiRXJyZXVyIGV0IGludGVycnVwdGlvbiIKKworIzogZXhfZXZhbC5jOjczNCBndWkuYzo0MjUzCittc2dpZCAiRXJyb3IiCittc2dzdHIgIkVycmV1ciIKKworIy4gaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkKKyM6IGV4X2V2YWwuYzo3MzYKK21zZ2lkICJJbnRlcnJ1cHQiCittc2dzdHIgIkludGVycnVwdGlvbjogIgorCisjOiBleF9ldmFsLmM6ODEwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IEltYnJpY2F0aW9uIGRlIDppZiB0cm9wIGltcG9ydGFudGUiCisKKyM6IGV4X2V2YWwuYzo4NDcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IDplbmRpZiBzYW5zIDppZiIKKworIzogZXhfZXZhbC5jOjg5MQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6ZWxzZSBzYW5zIDppZiIKKworIzogZXhfZXZhbC5jOjg5NAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYgc2FucyA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MDEKK21zZ2lkICJFNTgzOiBtdWx0aXBsZSA6ZWxzZSIKK21zZ3N0ciAiRTU4MzogSWwgbmUgcGV1dCB5IGF2b2lyIHF1J3VuIHNldWwgOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5MDQKK21zZ2lkICJFNTg0OiA6ZWxzZWlmIGFmdGVyIDplbHNlIgorbXNnc3RyICJFNTg0OiA6ZWxzZWlmIGFwcuhzIDplbHNlIgorCisjOiBleF9ldmFsLmM6OTcxCittc2dpZCAiRTU4NTogOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1ODU6IEltYnJpY2F0aW9uIGRlIDp3aGlsZSB0cm9wIGltcG9ydGFudGUiCisKKyM6IGV4X2V2YWwuYzoxMDI3Cittc2dpZCAiRTU4NjogOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg2OiA6Y29udGludWUgc2FucyA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDY3Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiA6YnJlYWsgc2FucyA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMjY2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiBJbWJyaWNhdGlvbiBkZSA6dHJ5IHRyb3AgaW1wb3J0YW50ZSIKKworIzogZXhfZXZhbC5jOjEzNDYKK21zZ2lkICJFNjAzOiA6Y2F0Y2ggd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAzOiA6Y2F0Y2ggc2FucyA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMuICogSnVzdCBwYXJzZS4KKyM6IGV4X2V2YWwuYzoxMzY4Cittc2dpZCAiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5IgorbXNnc3RyICJFNjA0OiA6Y2F0Y2ggYXBy6HMgOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNTAxCittc2dpZCAiRTYwNjogOmZpbmFsbHkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjA2OiA6ZmluYWxseSBzYW5zIDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIzogZXhfZXZhbC5jOjE1MjUKK21zZ2lkICJFNjA3OiBtdWx0aXBsZSA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNzogSWwgbmUgcGV1dCB5IGF2b2lyIHF1J3VuIHNldWwgOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNjM0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDplbmR0cnkgc2FucyA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTk2NgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IDplbmRmdW5jdGlvbiDgIGwnZXh06XJpZXVyIGQndW5lIGZvbmN0aW9uIgorCisjIFRPRE8KKyM6IGV4X2dldGxuLmM6MzE0NQorbXNnaWQgInRhZ25hbWUiCittc2dzdHIgInRhZ25hbWUiCisKKyMgVE9ETworIzogZXhfZ2V0bG4uYzozMTQ4Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgZ2VucmUgZGUgZmljaGllclxuIgorCisjOiBleF9nZXRsbi5jOjQ0OTkKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgImwnb3B0aW9uICdoaXN0b3J5JyB2YXV0IHrpcm8iCisKKyM6IGV4X2dldGxuLmM6NDczOQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgJXMgSGlzdG9yaXF1ZSAoY2hyb25vbG9naWUgZOljcm9pc3NhbnRlKTpcbiIKKworIzogZXhfZ2V0bG4uYzo0NzQwCittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJMaWduZSBkZSBjb21tYW5kZSIKKworIzogZXhfZ2V0bG4uYzo0NzQxCittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAiQ2hh7m5lIGRlIHJlY2hlcmNoZSIKKworIzogZXhfZ2V0bG4uYzo0NzQyCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAiRXhwcmVzc2lvbiIKKworIzogZXhfZ2V0bG4uYzo0NzQzCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiTGlnbmUgZCdlbnRy6WUiCisKKyM6IGV4X2dldGxuLmM6NDc3MworbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgYXUgZGVs4CBkZSBsYSBsb25ndWV1ciBkZSBsYSBjb21tYW5kZSIKKworIzogZXhfZ2V0bG4uYzo0OTUwCittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogVGFtcG9uIG91IGZlbup0cmUgYWN0aXZlIGVmZmFj6ShlKSIKKworIzogZmlsZWlvLmM6MzczCittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIk5vbSBkZSBmaWNoaWVyIGlsbOlnYWwiCisKKyM6IGZpbGVpby5jOjM5NyBmaWxlaW8uYzo1MjIgZmlsZWlvLmM6MjY4NiBmaWxlaW8uYzoyNzI3Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgImVzdCB1biBy6XBlcnRvaXJlIgorCisjOiBmaWxlaW8uYzozOTkKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJuJ2VzdCBwYXMgdW4gZmljaGllciIKKworIzogZmlsZWlvLmM6NTQ0IGZpbGVpby5jOjM4MzYKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbTm91dmVhdSBmaWNoaWVyXSIKKworIzogZmlsZWlvLmM6NTY2Cittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW0F1dG9yaXNhdGlvbiByZWZ1c+llXSIKKworIzogZmlsZWlvLmM6NjcwCittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogTGVzIGF1dG9jb21tYW5kZXMgKlJlYWRQcmUgb250IHJlbmR1IGxlIGZpY2hpZXIgaWxsaXNpYmxlIgorCisjIFRPRE8KKyM6IGZpbGVpby5jOjY3MgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIiIKKyJFMjAxOiBBdXRvY29tbWFuZGVzICpSZWFkUHJlIG5lIGRvaXZlbnQgcGFzIGNoYW5nZXIgbGUgY29udGVudSBkdSB0YW1wb24gIgorImNvdXJhbnQiCisKKyM6IGZpbGVpby5jOjY5MworbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTogTGVjdHVyZSBkZSBzdGRpbi4uLlxuIgorCisjOiBmaWxlaW8uYzo2OTkKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIkxlY3R1cmUgZGUgc3RkaW4uLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6OTQ0Cittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IExhIGNvbnZlcnNpb24gYSByZW5kdSBsZSBmaWNoaWVyIGlsbGlzYmxlICEiCisKKyM6IGZpbGVpby5jOjE4OTIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxODk5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjE5MDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyMgVE9ETworIzogZmlsZWlvLmM6MTkxNAorbXNnaWQgIltST10iCittc2dzdHIgIltST10iCisKKyM6IGZpbGVpby5jOjE5MjQKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIltDUiBtYW5xdWFudF0iCisKKyM6IGZpbGVpby5jOjE5MjkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbTkwgdHJvdXbpXSIKKworIzogZmlsZWlvLmM6MTkzNAorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW2xvbmd1ZXMgbGlnbmVzIGRpdmlz6WVzXSIKKworIzogZmlsZWlvLmM6MTk0MCBmaWxlaW8uYzozODIwCittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbUEFTIGNvbnZlcnRpXSIKKworIzogZmlsZWlvLmM6MTk0NSBmaWxlaW8uYzozODI1Cittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIltjb252ZXJ0aV0iCisKKyM6IGZpbGVpby5jOjE5NTIgZmlsZWlvLmM6Mzg1MAorbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW2NoaWZmculdIgorCisjOiBmaWxlaW8uYzoxOTU5Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbRVJSRVVSIERFIENPTlZFUlNJT05dIgorCisjOiBmaWxlaW8uYzoxOTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIltJTExFR0FMIEJZVEUgaW4gbGluZSAlbGRdIgorbXNnc3RyICJbT0NURVQgSUxMyUdBTCDgIGxhIGxpZ25lICVsZF0iCisKKyM6IGZpbGVpby5jOjE5NzIKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbRVJSRVVSUyBERSBMRUNUVVJFXSIKKworIzogZmlsZWlvLmM6MjE4OAorbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICJQZXV0IHBhcyB0cm91dmVyIGRlIGZpY2hpZXIgdGVtcG9yYWlyZSBwb3VyIGxhIGNvbnZlcnNpb24iCisKKyM6IGZpbGVpby5jOjIxOTUKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIkxhIGNvbnZlcnNpb24gYXZlYyAnY2hhcmNvbnZlcnQnIGEg6WNob3XpIgorCisjOiBmaWxlaW8uYzoyMTk4Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAicGV1dCBwYXMgbGlyZSBsYSBzb3J0aWUgZGUgJ2NoYXJjb252ZXJ0JyIKKworIzogZmlsZWlvLmM6MjYwMQorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiBEZXMgYXV0b2NvbW1hbmRlcyBvbnQgZWZmYWPpIG91IGTpY2hhcmfpIGxlIHRhbW9uIOAg6WNyaXJlIgorCisjOiBmaWxlaW8uYzoyNjI0Cittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IEwnYXV0b2NvbW1hbmRlIGEgY2hhbmfpIGxlIG5vbWJyZSBkZSBsaWduZXMgZGUgbWFuaehyZSBpbmF0dGVuZHVlIgorCisjOiBmaWxlaW8uYzoyNjkyIGZpbGVpby5jOjI3MTAKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAibidlc3QgcGFzIHVuIGZpY2hpZXIgb3UgdW4gcOlyaXBo6XJpcXVlIGluc2NyaXB0aWJsZSIKKworIzogZmlsZWlvLmM6Mjc2MgorbXNnaWQgImlzIHJlYWQtb25seSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJlc3QgZW4gbGVjdHVyZSBzZXVsZSAoYWpvdXRleiAhIHBvdXIgcGFzc2VyIG91dHJlKSIKKworIzogZmlsZWlvLmM6MzA2OAorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IFBldXQgcGFzIOljcmlyZSBkYW5zIGxhIGNvcGllIGRlIHNlY291cnMgKGFqb3V0ZXogISBwb3VyIHBhc3NlciBvdXRyZSkiCisKKyMgdG9kbworIzogZmlsZWlvLmM6MzA4MAorbXNnaWQgIkU1MDc6IENsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUwNzogRXJyZXVyIGRlIGZlcm1ldHVyZSBkZSBsYSBjb3BpZSBkZSBzZWNvdXJzIChham91dGV6ICEgcG91ciBwYXNzZXIgb3V0cmUpIgorCisjIFRPRE8KKyM6IGZpbGVpby5jOjMwODIKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUwODogUGV1dCBwYXMgbGlyZSBsZSBmaWNoaWVyIHBvdXIgdW5lIGNvcGllIGRlIHNlY291cnMgKGFqb3V0ZXogISBwb3VyIHBhc3NlciBvdXRyZSkiCisKKyM6IGZpbGVpby5jOjMwOTgKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IFBldXQgcGFzIGNy6WVyIGRlIGNvcGllIGRlIHNlY291cnMgKGFqb3V0ZXogISBwb3VyIHBhc3NlciBvdXRyZSkiCisKKyMgVE9ETworIzogZmlsZWlvLmM6MzIwMQorbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDogUGV1dCBwYXMgY3LpZXIgZGUgY29waWUgZGUgc2Vjb3VycyAoYWpvdXRleiAhIHBvdXIgcGFzc2VyIG91dHJlKSIKKworIyBUT0RPCisjOiBmaWxlaW8uYzozMjYzCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTQ2MDogTGEgc2VjdGlvbiBkZXMgcmVzc291cmNlcyBzZXJhaXQgcGVyZHVlIChham91dGV6ICEgcG91ciBwYXNzZXIgb3V0cmUpIgorCisjOiBmaWxlaW8uYzozMzY0Cittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IFBldXQgcGFzIHRyb3V2ZXIgbGUgZmljaGllciB0ZW1wb3JhaXJlIHBvdXIgeSDpY3JpcmUiCisKKyM6IGZpbGVpby5jOjMzODIKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogUGV1dCBwYXMgY29udmVydGlyIChham91dGV6ICEgcG91ciDpY3JpcmUgc2FucyBjb252ZXJ0aXIpIgorCisjIHRvZG8KKyM6IGZpbGVpby5jOjM0MTcKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiBQZXV0IHBhcyBvdXZyaXIgbGUgZmljaGllciBsaekgcG91ciB5IOljcmlyZSIKKworIzogZmlsZWlvLmM6MzQyMQorbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogUGV1dCBwYXMgb3V2cmlyIGxlIGZpY2hpZXIgcG91ciB5IOljcmlyZSIKKworIzogZmlsZWlvLmM6MzY3MQorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTUxMjogRXJyZXVyIGRlIGZlcm1ldHVyZSBkZSBmaWNoaWVyIgorCisjOiBmaWxlaW8uYzozNzQyCittc2dpZCAiRTUxMzogd3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICJFNTEzOiBFcnJldXIgZCfpY3JpdHVyZSwgbGEgY29udmVyc2lvbiBhIOljaG916SIKKworIzogZmlsZWlvLmM6Mzc0OAorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IGVycmV1ciBkJ+ljcml0dXJlIChzeXN06G1lIGRlIGZpY2hpZXJzIHBsZWluID8pIgorCisjOiBmaWxlaW8uYzozODE1Cittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBFUlJFVVIgREUgQ09OVkVSU0lPTiIKKworIzogZmlsZWlvLmM6MzgzMQorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJbUOlyaXBoLl0iCisKKyM6IGZpbGVpby5jOjM4MzYKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW05vdXZlYXVdIgorCisjOiBmaWxlaW8uYzozODU4Cittc2dpZCAiIFthXSIKK21zZ3N0ciAiIFthXSIKKworIzogZmlsZWlvLmM6Mzg1OAorbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIGFqb3V06ShzKSIKKworIzogZmlsZWlvLmM6Mzg2MAorbXNnaWQgIiBbd10iCittc2dzdHIgIiBbZV0iCisKKyM6IGZpbGVpby5jOjM4NjAKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIOljcml0KHMpIgorCisjOiBmaWxlaW8uYzozOTEzCittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IHBhdGNobW9kZTogcGV1dCBwYXMgc2F1dmVyIGxlIGZpY2hpZXIgb3JpZ2luYWwiCisKKyM6IGZpbGVpby5jOjM5MzUKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogcGV1dCBwYXMgdG91Y2hlciBsZSBmaWNoaWVyIG9yaWdpbmFsIHZpZGUiCisKKyM6IGZpbGVpby5jOjM5NTAKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IFBldXQgcGFzIGVmZmFjZXIgbGEgY29waWUgZGUgc2Vjb3VycyIKKworIzogZmlsZWlvLmM6NDAxNAorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFMRVJURTogTGUgZmljaGllciBvcmlnaW5hbCBlc3QgcGV1dC3qdHJlIHBlcmR1IG91IGVuZG9tbWFn6VxuIgorCisjOiBmaWxlaW8uYzo0MDE2Cittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAibmUgcXVpdHRleiBwYXMgbCfpZGl0ZXVyIHNhbnMgcXVlIGxlIGZpY2hpZXIgc29pdCBiaWVuIGVucmVnaXN0cukgISIKKworIzogZmlsZWlvLmM6NDEwNQorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDEwNQorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2Zvcm1hdCBkb3NdIgorCisjOiBmaWxlaW8uYzo0MTEyCittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzo0MTEyCittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0IG1hY10iCisKKyM6IGZpbGVpby5jOjQxMTkKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6NDExOQorbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIltmb3JtYXQgdW5peF0iCisKKyM6IGZpbGVpby5jOjQxNDYKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSBsaWduZSwgIgorCisjOiBmaWxlaW8uYzo0MTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQgbGlnbmVzLCAiCisKKyM6IGZpbGVpby5jOjQxNTEKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSBjYXJhY3TocmUiCisKKyM6IGZpbGVpby5jOjQxNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCBjYXJhY3TocmVzIgorCisjIFRPRE8KKyM6IGZpbGVpby5jOjQxNjMKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzo0MTYzCittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW0Rlcm5p6HJlIGxpZ25lIGluY29tcGzodGVdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjQxODIKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIkFMRVJURTogTGUgZmljaGllciBhIOl06SBtb2RpZmnpIGRlcHVpcyBxdWUgVmltIGwnYSBsdSAhIgorCisjOiBmaWxlaW8uYzo0MTg0Cittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJWb3VsZXotdm91cyB2cmFpbWVudCDpY3JpcmUgZGVkYW5zIgorCisjOiBmaWxlaW8uYzo1MjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBFcnJldXIgbG9ycyBkZSBsJ+ljcml0dXJlIGRhbnMgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiBFcnJldXIgbG9ycyBkZSBsYSBmZXJtZXR1cmUgZGUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MjM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBFcnJldXIgbG9ycyBkZSBsYSBsZWN0dXJlIGRlIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTQ1NQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEwnYXV0by1jb21tYW5kZSBGaWxlQ2hhbmdlZFNoZWxsIGEgZWZmYWPpIGxlIHRhbXBvbiIKKworIzogZmlsZWlvLmM6NTQ2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiBBbGVydGU6IExlIGZpY2hpZXIgXCIlc1wiIG4nZXN0IHBsdXMgZGlzcG9uaWJsZSIKKworIyB0b2RvCisjOiBmaWxlaW8uYzo1NDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiVzEyOiBBbGVydGU6IExlIGZpY2hpZXIgXCIlc1wiIGEgY2hhbmfpIGV0IGxlIHRhbXBvbiBhIHBhciBhaWxsZXVycyDpdOkgbW9kaWZp6SBkYW5zIFZpbSIKKworIzogZmlsZWlvLmM6NTQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBBbGVydGU6IExlIGZpY2hpZXIgXCIlc1wiIGEgY2hhbmfpIGRlcHVpcyBsZSBk6WJ1dCBkZSBsJ+lkaXRpb24iCisKKyM6IGZpbGVpby5jOjU0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzE2OiBBbGVydGU6IExlcyBwZXJtaXNzaW9ucyBkZSBcIiVzXCIgb250IGNoYW5n6SBkZXB1aXMgbGUgZOlidXQgZGUgbCfpZGl0aW9uIgorCisjOiBmaWxlaW8uYzo1NDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogQWxlcnRlOiBMZSBmaWNoaWVyIFwiJXNcIiBhIOl06SBjcunpIGFwcuhzIGxlIGTpYnV0IGRlIGwn6WRpdGlvbiIKKworIzogZmlsZWlvLmM6NTUwOAorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIkFsZXJ0ZSIKKworIzogZmlsZWlvLmM6NTUwOQorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9rXG4iCisiJkNoYXJnZSBsZSBmaWNoaWVyIgorCisjOiBmaWxlaW8uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjI6IENvdWxkIG5vdCBwcmVwYXJlIGZvciByZWxvYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFNDYyOiBQYXMgcHUgcHLpcGFyZXIgbGUgcmVjaGFyZ2VtZW50IGRlIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTYyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogUGFzIHB1IHJlY2hhcmdlciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjYyMDgKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS1FZmZhY+ktLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjYzNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBQYXMgZGUgdGVsIGdyb3VwZTogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2NDkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBDYXJhY3TocmUgaWxs6WdhbCBhcHLocyAqOiAlcyIKKworIzogZmlsZWlvLmM6NjUwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogUGFzIGRlIHRlbCDpduhuZW1lbnQ6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjY2NTMKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tY29tbWFuZGVzIC0tLSIKKworIzogZmlsZWlvLmM6NjkyNAorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBJbXBvc3NpYmxlIGQnZXjpY3V0ZXIgdW5lIGF1dG9jb21tYW5kZSBwb3VyIFRPVVMgbGVzIOl26G5lbWVudHMiCisKKyM6IGZpbGVpby5jOjY5NDcKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIlBhcyBkJ2F1dG9jb21tYW5kZSBjb3JyZXNwb25kYW50ZSIKKworIzogZmlsZWlvLmM6NzI2NworbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IGF1dG9jb21tYW5kZXMgdHJvcCBpbWJyaXF16WVzIgorCisjOiBmaWxlaW8uYzo3NTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgQXV0byBjb21tYW5kZXMgcG91ciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjc1NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJFeOljdXRpb24gZGUgJXMiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6NzYxMQorIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiYXV0b2NvbW1hbmRlICVzIgorCisjOiBmaWxlaW8uYzo4MTc4Cittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogeyBtYW5xdWFudC4iCisKKyM6IGZpbGVpby5jOjgxODAKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiB9IG1hbnF1YW50LiIKKworIzogZm9sZC5jOjY2Cittc2dpZCAiRTQ5MDogTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAiRTQ5MDogUGFzIHRyb3V26SBkZSByZXBsaSIKKworIzogZm9sZC5jOjU1MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBOZSBwZXV0IGNy6WVyIGRlIHJlcGxpIGF2ZWMgbGEgJ2ZvbGRtZXRob2QnIGNvdXJhbnRlIgorCisjOiBmb2xkLmM6NTU1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IE5lIHBldXQgZWZmYWNlciBsZSByZXBsaSBhdmVjIGxhICdmb2xkbWV0aG9kJyBjb3VyYW50ZSIKKworIzogZ2V0Y2hhci5jOjI0NgorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjogQWpvdXQgYXUgdGFtcG9uIGRlIGxlY3R1cmUiCisKKyM6IGdldGNoYXIuYzoyMTU2Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6IG1hcHBpbmcgculjdXJzaWYiCisKKyM6IGdldGNoYXIuYzozMDIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiB1bmUgYWJicul2aWF0aW9uIGdsb2JhbGUgZXhpc3RlIGTpauAgcG91ciAlcyIKKworIzogZ2V0Y2hhci5jOjMwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiB1biBtYXBwaW5nIGdsb2JhbCBleGlzdGUgZOlq4CBwb3VyICVzIgorCisjOiBnZXRjaGFyLmM6MzE1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiB1bmUgYWJicul2aWF0aW9uIGV4aXN0ZSBk6WrgIHBvdXIgJXMiCisKKyM6IGdldGNoYXIuYzozMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiB1biBtYXBwaW5nIGV4aXN0ZSBk6WrgIHBvdXIgJXMiCisKKyM6IGdldGNoYXIuYzozMjE5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJQYXMgZCdhYmJy6XZpYXRpb24gdHJvdXbpZSIKKworIyBUT0RPCisjOiBnZXRjaGFyLmM6MzIyMQorbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIlBhcyBkZSBtYXBwaW5nIHRyb3V26SIKKworIzogZ2V0Y2hhci5jOjQxMTEKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IE1vZGUgaWxs6WdhbCIKKworIzogZ3VpLmM6MjE5Cittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IEltcG9zc2libGUgZGUgZOltYXJyZXIgbCdpbnRlcmZhY2UgZ3JhcGhpcXVlIgorCisjOiBndWkuYzozNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6IFBhcyBwdSBsaXJlIFwiJXNcIiIKKworIzogZ3VpLmM6NDczCittc2dpZCAiRTIzMTogJ2d1aWZvbnR3aWRlJyBpbnZhbGlkIgorbXNnc3RyICJFMjMxOiAnZ3VpZm9udHdpZGUnIGVzdCBpbnZhbGlkZSIKKworIzogZ3VpLmM6MzkzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IFBldXQgcGFzIGFsbG91ZXIgbGEgY291bGV1ciAlcyIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjxwYXMgcHUgb3V2cmlyPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogcGFzIHB1IHLpY3Vw6XJlciBsYSBmb250ZSAlcyIKKworIzogZ3VpX2F0X2ZzLmM6Mjc4MQorbXNnaWQgIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTQ6IHZpbV9TZWxGaWxlOiBwYXMgcHUgcmV2ZW5pciBkYW5zIGxlIHLpcGVydG9pcmUgY291cmFudCIKKworIzogZ3VpX2F0X2ZzLmM6MjgwMQorbXNnaWQgIlBhdGhuYW1lOiIKK21zZ3N0ciAiQ2hlbWluOiIKKworIzogZ3VpX2F0X2ZzLmM6MjgwNworbXNnaWQgIkU2MTU6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTU6IHZpbV9TZWxGaWxlOiBwYXMgcHUgculjdXDpcmVyIGxlIHLpcGVydG9pcmUgY291cmFudCIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9rIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNjM0IGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQW5udWxlciIKKworIyBUT0RPCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIldpZGdldCBzY3JvbGxiYXI6IFBhcyBwdSBy6WN1cOlyZXIgbGEgZ+lvbel0cmllIGR1IHRodW1iIHBpeG1hcC4gJ15fXiIKKworIzogZ3VpX2F0aGVuYS5jOjIwNDcgZ3VpX21vdGlmLmM6MTg3MQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIlZpbSIKKworIyB0b2RvCisjOiBndWlfYmV2YWwuYzo5OAorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICJFMjMyOiBOZSBwZXV0IGNy6WVyIEJhbGxvb25FdmFsIGF2ZWMgbWVzc2FnZSBFVCBjYWxsYmFjayIKKworIzogZ3VpX2d0ay5jOjE1NjMKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0iCisKKyM6IGd1aV9ndGsuYzoxOTk4IG1lc3NhZ2UuYzoyNzU3Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJk91aVxuIgorIiZOb25cbiIKKyImQW5udWxlciIKKworIyB0b2RvICdfJyBpcyBmb3IgaG90a2V5LCBpIGd1ZXNzPworIzogZ3VpX2d0ay5jOjIxNjEKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAiX03pdGhvZGVzIGRlIHNhaXNpZSIKKworIzogZ3VpX2d0ay5jOjI0MjcgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiUmVtcGxhY2VyIC0gVmltIgorCisjOiBndWlfZ3RrLmM6MjQzNSBndWlfbW90aWYuYzoyNzcwCittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJSZWNoZXJjaGVyIC0gVmltIgorCisjOiBndWlfZ3RrLmM6MjQ2NyBndWlfbW90aWYuYzoyODg4Cittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAiUmVjaGVyY2hlciA6IgorCisjOiBndWlfZ3RrLmM6MjQ4NyBndWlfbW90aWYuYzoyOTIwCittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAiUmVtcGxhY2VyIHBhciA6IgorCisjIHRvZG8KKyMuIHdob2xlIHdvcmQgb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNTE5IGd1aV9tb3RpZi5jOjMwMzYKK21zZ2lkICJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiCittc2dzdHIgIk1vdHMgZW50aWVycyBzZXVsZW1lbnQiCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjUzMiBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAiUmVzcGVjdGVyIGNhc3NlIgorCisjOiBndWlfZ3RrLmM6MjU0NCBndWlfbW90aWYuYzoyOTkwCittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICJEaXJlY3Rpb24iCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjU1NiBndWlfbW90aWYuYzozMDAyCittc2dpZCAiVXAiCittc2dzdHIgIkhhdXQiCisKKyM6IGd1aV9ndGsuYzoyNTYwIGd1aV9tb3RpZi5jOjMwMTAKK21zZ2lkICJEb3duIgorbXNnc3RyICJCYXMiCisKKyM6IGd1aV9ndGsuYzoyNTg2IGd1aV9ndGsuYzoyNTg4IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIlN1aXZhbnQiCisKKyM6IGd1aV9ndGsuYzoyNjA1IGd1aV9ndGsuYzoyNjA3IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJSZW1wbGFjZXIiCisKKyM6IGd1aV9ndGsuYzoyNjE4IGd1aV9ndGsuYzoyNjIwIGd1aV9tb3RpZi5jOjI4MjIKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAiUmVtcGxhY2VyIHRvdXQiCisKKyMgdG9kbworIzogZ3VpX2d0a194MTEuYzoyMjg1Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiBVbmUgcmVxdep0ZSBcIm1ldXJzXCIgYSDpdOkgcmXndWUgZHUgZ2VzdGlvbm5haXJlIGRlIHNlc3Npb25cbiIKKworIzogZ3VpX2d0a194MTEuYzozNDc0Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIlZpbTogRmVu6nRyZSBwcmluY2lwYWxlIGTpdHJ1aXRlIGluYXR0ZW5k+21lbnRcbiIKKworIzogZ3VpX2d0a194MTEuYzo0MDg4Cittc2dpZCAiRm9udCBTZWxlY3Rpb24iCittc2dzdHIgIkNob2lzaXIgdW5lIHBvbGljZSAtIFZpbSIKKworIyB0b2RvCisjOiBndWlfZ3RrX3gxMS5jOjU5NDAgdWkuYzoyMDA5Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiVXRpbGlz6SBDVVRfQlVGRkVSMCBhdSBsaWV1IGQndW5lIHPpbGVjdGlvbiB2aWRlIgorCisjOiBndWlfbW90aWYuYzoxNjE3IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIkZpbHRyZSIKKworIzogZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICJS6XBlcnRvaXJlcyIKKworIzogZ3VpX21vdGlmLmM6MTYyMQorbXNnaWQgIkhlbHAiCittc2dzdHIgIkFpZGUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjIKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAiRmljaGllcnMiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIlPpbGVjdGlvbiIKKworIzogZ3VpX21vdGlmLmM6MjgzNQorbXNnaWQgIlVuZG8iCittc2dzdHIgIkFubnVsZXIiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiBOZSBwZXV0IGNoYXJnZXIgbGEgZm9udGUgWmFwICclcyciCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiBOZSBwZXV0IHV0aWxpc2VyIGxhIGZvbnRlICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJFbnZvaSBkJ3VuIG1lc3NhZ2UgcG91ciBpbnRlcnJvbXByZSBsZSBwcm9jZXNzdXMgZmlscy5cbiIKKworIzogZ3VpX3czMi5jOjc2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogQXJndW1lbnQgaW5zdXBwb3J06TogXCItJXNcIjsgVXRpbGlzZXogbGEgdmVyc2lvbiBPTEUuIgorCisjOiBndWlfdzQ4LmM6MjA0OAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlRyb3V2ZXIgdW4gdGV4dGUgKHV0aWxpc2V6ICdcXFxcJyBwb3VyIHRyb3V2ZXIgdW4gJ1xcJykiCisKKyM6IGd1aV93NDguYzoyMDczCittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiQ2hlcmNoZXIgZXQgcmVtcGxhY2VyICh1dGlsaXNleiAnXFxcXCcgcG91ciB0cm91dmVyIHVuICdcXCcpIgorCisjIHRvZG8KKyM6IGd1aV94MTEuYzoxNDc5Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBFcnJldXIgZCdhbGxvY2F0aW9uIGRlIGNvdWxldXIsIGNvdWxldXJzIGluY29ycmVjdGVzIHBvc3NpYmxlcyIKKworIzogZ3VpX3gxMS5jOjIwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IFBhcyBkZSBmb250ZXMgcG91ciBjZXMgY2hhcnNldHMgZGFucyBsZSBmb250c2V0ICVzOiIKKworIzogZ3VpX3gxMS5jOjIxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogTm9tIGR1IGZvbnRzZXQ6ICVzIgorCisjIHRvZG8KKyM6IGd1aV94MTEuYzoyMTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkxhIGZvbnRlICclcycgbidhIHBhcyB1bmUgbGFyZ2V1ciBmaXhlIgorCisjIFRPRE8KKyM6IGd1aV94MTEuYzoyMTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogTm9tIGR1IGZvbnRzZXQ6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJGb250MDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIkZvbnQxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250JWQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAiTGEgbGFyZ2V1ciBkZSBGb250JWQgbidlc3QgcGFzIGxlIGRvdWJsZSBkZSBjZWxsZSBkZSBGb250MFxuIgorCisjOiBndWlfeDExLmM6MjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIkxhcmdldXIgRm9udDA6ICVsZFxuIgorCisjOiBndWlfeDExLmM6MjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisiTGFyZ2V1ciBGb250MTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBFUlJFVVIgZGUgbCdhdXRvbWF0ZSBIYW5ndWwiCisKKyM6IGlmX2NzY29wZS5jOjc2Cittc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgorbXNnc3RyICJBam91dGVyIHVuZSBiYXNlIGRlIGRvbm7pZXMiCisKKyM6IGlmX2NzY29wZS5jOjc4Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiUmVxdep0ZSBzZWxvbiB1biBtb3RpZiIKKworIzogaWZfY3Njb3BlLmM6ODAKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiQWZmaWNoZXIgY2UgbWVzc2FnZSIKKworIzogaWZfY3Njb3BlLmM6ODIKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiQ2Fzc2VyIHVuZSBjb25uZWN0aW9uIgorCisjOiBpZl9jc2NvcGUuYzo4NAorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlLpaW5pdGlhbGlzZXIgbGVzIGNvbm5lY3Rpb25zIgorCisjOiBpZl9jc2NvcGUuYzo4NgorbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIk1vbnRyZXIgbGVzIGNvbm5lY3Rpb25zIgorCisjOiBpZl9jc2NvcGUuYzo5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkU1NjA6IFV0aWxpc2F0aW9uOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI2Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICJDZXR0ZSBjb21tYW5kZSBjc2NvcGUgbmUgc3VwcG9ydGUgcGFzIGxhIHPpcGFyYXRpb24gZGUgbGEgZmVu6nRyZS5cbiIKKworIzogaWZfY3Njb3BlLmM6MTY3Cittc2dpZCAiRTU2MjogVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIkU1NjI6IFV0aWxpc2F0aW9uOiBjc3RhZyA8aWRlbnQ+IgorCisjOiBpZl9jc2NvcGUuYzoyMjMKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IOl0aXF1ZXR0ZSBpbnRyb3V2YWJsZSIKKworIzogaWZfY3Njb3BlLmM6NDAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAiRTU2MzogRXJyZXVyIHN0YXQoJXMpOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDExCittc2dpZCAiRTU2Mzogc3RhdCBlcnJvciIKK21zZ3N0ciAiRTU2MzogRXJyZXVyIHN0YXQiCisKKyM6IGlmX2NzY29wZS5jOjUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY0OiAlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIkU1NjQ6ICVzIG4nZXN0IHBhcyB1biBy6XBlcnRvaXJlIG91IHVuZSBiYXNlIGRlIGRvbm7pZXMgY3Njb3BlIHZhbGlkZSIKKworIzogaWZfY3Njb3BlLmM6NTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiQWpvdXTpIGxhIGJhc2UgZGUgZG9ubullcyBjc2NvcGUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjU3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogZXJyZXVyIGxvcnMgZGUgbGEgbGVjdHVyZSBkZSBsYSBjb25uZWN0aW9uIGNzY29wZSAlbGQiCisKKyM6IGlmX2NzY29wZS5jOjY4MworbXNnaWQgIkU1NjE6IHVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJFNTYxOiB0eXBlIGRlIHJlY2hlcmNoZSBjc2NvcGUgaW5jb25udSIKKworIyB0b2RvCisjOiBpZl9jc2NvcGUuYzo3MjUKK21zZ2lkICJFNTY2OiBDb3VsZCBub3QgY3JlYXRlIGNzY29wZSBwaXBlcyIKK21zZ3N0ciAiRTU2NjogUGFzIHB1IGNy6WVyIGRlIHR1eWF1eCAocGlwZXMpIGNzY29wZSIKKworIyBUT0RPCisjOiBpZl9jc2NvcGUuYzo3NDIKK21zZ2lkICJFNjIyOiBDb3VsZCBub3QgZm9yayBmb3IgY3Njb3BlIgorbXNnc3RyICJFNjIyOiBQYXMgcHUgZm9ya2VyIHBvdXIgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo4MzYgaWZfY3Njb3BlLmM6ODg2Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImV4ZWMgZGUgY3NfY3JlYXRlX2Nvbm5lY3Rpb24gYSDpY2hvdekiCisKKyM6IGlmX2NzY29wZS5jOjg4NworbXNnaWQgIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIKK21zZ3N0ciAiRTYyMzogUGFzIHB1IGVuZ2VuZHJlciBsZSBwcm9jZXNzdXMgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo5MDAKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gcG91ciB0b19mcCBhIOljaG916SIKKworIzogaWZfY3Njb3BlLmM6OTAyCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIHBvdXIgZnJfZnAgYSDpY2hvdekiCisKKyM6IGlmX2NzY29wZS5jOjk0MAorbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2NzogcGFzIGRlIGNvbm5lY3Rpb24gY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTogcGFzIGRlIGNvcnJlc3AuIHRyb3V26WUgcG91ciBsYSByZXF16nRlIGNzY29wZSAlcyBkZSAlcyIKKworIyB0b2RvCisjOiBpZl9jc2NvcGUuYzoxMDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Njk6IGludmFsaWQgY3Njb3BlcXVpY2tmaXggZmxhZyAlYyBmb3IgJWMiCittc2dzdHIgIkU0Njk6IERyYXBlYXUgY3Njb3BlcXVpY2tmaXggJWMgcG91ciAlYyBpbnZhbGlkZSIKKworIzogaWZfY3Njb3BlLmM6MTEyOAorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY29tbWFuZGVzIGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6MTEzMQorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKSIKK21zZ3N0ciAiJS01czogJS0zMHMgKFV0aWxpc2F0aW9uOiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogaW1wb3NzaWJsZSBkJ291dnJpciBsYSBiYXNlIGRlIGRvbm7pZXMgY3Njb3BlOiAlcyIKKworIyB0b2RvCisjOiBpZl9jc2NvcGUuYzoxMjQxCittc2dpZCAiRTYyNjogY2Fubm90IGdldCBjc2NvcGUgZGF0YWJhc2UgaW5mb3JtYXRpb24iCittc2dzdHIgIkU2MjY6IGltcG9zc2libGUgZCdvYnRlbmlyIGRlcyBpbmZvcyBzdXIgbGEgYmFzZSBkZSBkb25u6WVzIGNzY29wZSIKKworIyB0b2RvCisjOiBpZl9jc2NvcGUuYzoxMjYxCittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IGJhc2UgZGUgZG9ubullcyBjc2NvcGUgcmVkb25kYW50ZSBwYXMgYWpvdXTpZSIKKworIzogaWZfY3Njb3BlLmM6MTI3MgorbXNnaWQgIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJFNTY5OiBub21icmUgbWF4aW11bSBkZSBjb25uZWN0aW9ucyBjc2NvcGUgYXR0ZWludCIKKworIzogaWZfY3Njb3BlLmM6MTM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IGxhIGNvbm5lY3Rpb24gY3Njb3BlICVzIG4nYSBwYXMg6XTpIHRyb3V26WUiCisKKyM6IGlmX2NzY29wZS5jOjE0MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gJXMgY2xvc2VkIgorbXNnc3RyICJjb25uZWN0aW9uIGNzY29wZSAlcyBlc3QgZmVybellIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjE1NjIKK21zZ2lkICJFNTcwOiBmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiRTU3MDogZXJyZXVyIGZhdGFsZSBkYW5zIGNzX21hbmFnZV9tYXRjaGVzIgorCisjOiBpZl9jc2NvcGUuYzoxODIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzIgorbXNnc3RyICLJdGlxdWV0dGUgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTgyNgorbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICBsaWduZSIKKworIzogaWZfY3Njb3BlLmM6MTgyOAorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAibm9tLWZpY2hpZXIgLyBjb250ZXh0IC8gbGlnbmVcbiIKKworIzogaWZfY3Njb3BlLmM6MTk3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA5OiBDc2NvcGUgZXJyb3I6ICVzIgorbXNnc3RyICJFNjA5OiBFcnJldXIgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE0MQorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICJUb3V0ZXMgbGVzIGJhc2VzIGRlIGRvbm7pZXMgY3Njb3BlIG9udCDpdOkgcmVtaXNlcyDgIHrpcm8iCisKKyM6IGlmX2NzY29wZS5jOjIyMDkKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAicGFzIGRlIGNvbm5lY3Rpb24gY3Njb3BlXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyMTMKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBub20gZGFucyBiYXNlIGRlIGRvbm7pZXMgICAgICAgICAgICBpbnPpcmVyIGNoZW1pblxuIgorCisjOiBpZl9weXRob24uYzozOTQKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2MzogROlzb2zpLCBjZXR0ZSBjb21tYW5kZSBlc3QgZOlzYWN0aXbpZSwgbGEgYmlibGlvdGjocXVlIFB5dGhvbiBuJ2EgcHUg6nRyZSBjaGFyZ+llLiIKKworIzogaWZfcHl0aG9uLmM6NTk2Cittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJpbXBvc3NpYmxlIGQnZWZmYWNlciBsZXMgYXR0cmlidXRzIGQnT3V0cHV0T2JqZWN0IgorCisjOiBpZl9weXRob24uYzo2MDMKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgZG9pdCDqdHJlIHVuIG5vbWJyZSBlbnRpZXIiCisKKyM6IGlmX3B5dGhvbi5jOjYxMQorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJhdHRyaWJ1dCBpbnZhbGlkZSIKKworIzogaWZfcHl0aG9uLmM6NjUwIGlmX3B5dGhvbi5jOjY2NAorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSByZXF1aWVydCB1bmUgbGlzdGUgZGUgY2hh7m5lcyIKKworIzogaWZfcHl0aG9uLmM6NzkwCittc2dpZCAiRTI2NDogUHl0aG9uOiBFcnJvciBpbml0aWFsaXNpbmcgSS9PIG9iamVjdHMiCittc2dzdHIgIkUyNjQ6IFB5dGhvbjogRXJyZXVyIGQnaW5pdGlhbGlzYXRpb24gZGVzIG9iamV0cyBkJ0UvUyIKKworIzogaWZfcHl0aG9uLmM6OTc1IGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgImV4cHJlc3Npb24gaW52YWxpZGUiCisKKyM6IGlmX3B5dGhvbi5jOjk4OSBpZl90Y2wuYzoxNDA3Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJleHByZXNzaW9ucyBk6XNhY3RpdullIGxvcnMgZGUgbGEgY29tcGlsYXRpb24iCisKKyM6IGlmX3B5dGhvbi5jOjEwMDIKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJ0ZW50YXRpdmUgZGUgculm6XJlbmNlIOAgdW4gdGFtcG9uIGVmZmFj6SIKKworIzogaWZfcHl0aG9uLmM6MTAxNyBpZl9weXRob24uYzoxMDU4IGlmX3B5dGhvbi5jOjExMjIgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAibnVt6XJvIGRlIGxpZ25lIGhvcnMgbGltaXRlcyIKKworIzogaWZfcHl0aG9uLmM6MTI1NworIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxvYmpldCB0YW1wb24gKGVmZmFj6Skg4CAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM0OCBpZl90Y2wuYzo4MzYKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAibm9tIGRlIG1hcnF1ZSBpbnZhbGlkZSIKKworIzogaWZfcHl0aG9uLmM6MTYyMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICJwYXMgZGUgdGVsIHRhbXBvbiIKKworIzogaWZfcHl0aG9uLmM6MTcxMQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInRlbnRhdGl2ZSBkZSBy6WbpcmVuY2Ug4CB1bmUgZmVu6nRyZSBlZmZhY+llIgorCisjOiBpZl9weXRob24uYzoxNzU2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJhdHRyaWJ1dCBlbiBsZWN0dXJlIHNldWxlIgorCisjOiBpZl9weXRob24uYzoxNzY5Cittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICJjdXJzZXVyIHBvc2l0aW9ubukgZW4gZGVob3JzIGR1IHRhbXBvbiIKKworIzogaWZfcHl0aG9uLmM6MTg0NgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZXQgZmVu6nRyZSAoZWZmYWPpKSDgICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTg1OAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAodW5rbm93bikgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZXQgZmVu6nRyZSAoaW5jb25udSkg4CAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxmZW7qdHJlICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzNgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICJwYXMgZGUgdGVsbGUgZmVu6nRyZSIKKworIzogaWZfcHl0aG9uLmM6MjE5MyBpZl9weXRob24uYzoyMjI4IGlmX3B5dGhvbi5jOjIyNzggaWZfcHl0aG9uLmM6MjM0NgorIzogaWZfcHl0aG9uLmM6MjQ2NiBpZl9weXRob24uYzoyNTE4IGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OAorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgImltcG9zc2libGUgZCdlbnJlZ2lzdHJlciBsZXMgaW5mb3JtYXRpb25zIGQnYW5udWxhdGlvbiIKKworIzogaWZfcHl0aG9uLmM6MjE5NSBpZl9weXRob24uYzoyMjg1IGlmX3B5dGhvbi5jOjIzNTcKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgImltcG9zc2libGUgZCdlZmZhY2VyIGxhIGxpZ25lIgorCisjOiBpZl9weXRob24uYzoyMjMwIGlmX3B5dGhvbi5jOjIzNzMgaWZfdGNsLmM6NjkwIGlmX3RjbC5jOjIwMjAKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICJpbXBvc3NpYmxlIGRlIHJlbXBsYWNlciBsYSBsaWduZSIKKworIzogaWZfcHl0aG9uLmM6MjM4OSBpZl9weXRob24uYzoyNDY4IGlmX3B5dGhvbi5jOjI1MjYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgImltcG9zc2libGUgZCdpbnPpcmVyIGxhIGxpZ25lIgorCisjOiBpZl9weXRob24uYzoyNjMwCittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICJsYSBjaGHubmUgbmUgcGV1dCBjb250ZW5pciBkZSByZXRvdXIg4CBsYSBsaWduZSIKKworIzogaWZfcnVieS5jOjM5NgorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICJFMjY2OiBE6XNvbOksIGNvbW1hbmRlIGluYWN0aXZlLCBsYSBiaWJsaW90aOhxdWUgUnVieSBuJ2EgcHUg6nRyZSBjaGFyZ+llLiIKKworIzogaWZfcnVieS5jOjQ1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBzdGF0dXQgbG9uZ2ptcCBpbmNvbm51OiAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICJCYXNjdWxlciBpbXBs6W1lbnRhdGlvbi9k6WZpbml0aW9uIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICJNb250cmVyIGxhIGNsYXNzZSBkZSBiYXNlIGRlIgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAiTW9udHJlciBsZXMgZm9uY3Rpb25zIG1lbWJyZXMgc3VyY2hhcmfpZXMiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIlLpY3Vw6XJlciBkdSBmaWNoaWVyIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJS6WN1cOlyZXIgZHUgcHJvamV0IgorCisjOiBpZl9zbmlmZi5jOjczCittc2dpZCAiUmV0cmlldmUgZnJvbSBhbGwgcHJvamVjdHMiCittc2dzdHIgIlLpY3Vw6XJlciBkZSB0b3VzIGxlcyBwcm9qZXRzIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIlLpY3Vw6XJlciIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICJNb250cmVyIHNvdXJjZSBkZSIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJUcm91dmVyIHN5bWJvbGVzIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJQYXJjb3VyaXIgY2xhc3NlIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIk1vbnRyZXIgY2xhc3NlIGRhbnMgaGnpcmFyY2hpZSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIk1vbnRyZXIgY2xhc3NlIGRhbnMgaGnpcmFyY2hpZSByZXN0cmVpbnRlIgorCisjIHRvZG8KKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiBy6WbpcmVuY2UiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIGVzdCBy6WbpcmVuY+kgcGFyIgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiBhIHVuKGUpIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHV0aWxpc+llIHBhciIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAiTW9udHJlciBkb2N1IGRlIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIkfpbulyYXRpb24gZGUgZG9jdSBwb3VyIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICJDb25uZWN0aW9uIOAgU05pRkYrIGltcG9zc2libGUuIFbpcmlmaWV6IGwnZW52aXJvbm5lbWVudCAoc25pZmZlbWFjcyBkb2l0IOp0cmUgZGFucyBsZSAkUEFUSCkuXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiBFcnJldXIgZGUgbGVjdHVyZS4gROljb25uZWN06SIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrIGVzdCBhY3R1ZWxsZW1lbnQgIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgInBhcyAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJjb25uZWN06SIKKworIzogaWZfc25pZmYuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3NTogVW5rbm93biBTTmlGRisgcmVxdWVzdDogJXMiCittc2dzdHIgIkUyNzU6IFJlcXXqdGUgU05pRkYrIGluY29ubnVlOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRXJyZXVyIGRlIGNvbm5lY3Rpb24g4CBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgbidlc3QgcGFzIGNvbm5lY3TpIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBDZWNpIG4nZXN0IHBhcyB1biB0YW1wb24gU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiBFcnJldXIgZCfpY3JpdHVyZS4gROljb25uZWN0aW9uIgorCisjOiBpZl90Y2wuYzo0MTgKK21zZ2lkICJpbnZhbGlkIGJ1ZmZlciBudW1iZXIiCittc2dzdHIgIm51belybyBkZSB0YW1wb24gaW52YWxpZGUiCisKKyM6IGlmX3RjbC5jOjQ2NCBpZl90Y2wuYzo5MzEgaWZfdGNsLmM6MTExMAorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgInBhcyBlbmNvcmUgaW1wbOltZW506SIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm9wdGlvbiBpbmNvbm51ZSIKKworIyBUT0RPCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAicGV1dCBwYXMgculnbGVyIGxhL2xlcyBsaWduZShzKSAgJ15fXiIKKworIzogaWZfdGNsLmM6ODQ1Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJtYXJxdWUgYWJzZW50ZSIKKworIzogaWZfdGNsLmM6ODUxIGlmX3RjbC5jOjEwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAibGlnbmUgJWQgY29sb25uZSAlZCIKKworIzogaWZfdGNsLmM6ODgxCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAicGV1dCBwYXMgaW5z6XJlci9ham91dGVyIGxpZ25lIgorCisjOiBpZl90Y2wuYzoxMjY4Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgImRyYXBlYXUgaW5jb25udTogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgInZpbU9wdGlvbiBpbmNvbm51ZSIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAiaW50ZXJydXB0aW9uIGNsYXZpZXIiCisKKyM6IGlmX3RjbC5jOjE0MjgKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgImVycmV1ciB2aW0iCisKKyM6IGlmX3RjbC5jOjE0NzEKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgInBldXQgcGFzIGNy6WVyIGNtZGUgdGFtcG9uL2Zlbup0cmU6IG9iamV0IGVuIHRyYWluIGQn6nRyZSBlZmZhY+kiCisKKyMgVE9ETworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgInBldXQgcGFzIGluc2NyaXJlIGNvbW1hbmRlIGRlIHJhcHBlbDogdGFtcG9uL2Zlbup0cmUgZW4gZWZmYWNlbWVudCIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NjIKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0uIgorIm9yZyIKK21zZ3N0ciAiIgorIkUyODA6IEVSUkVVUiBGQVRBTEUgVENMOiByZWZsaXN0IGNvcnJvbXB1ZSA/ISBDb250YWN0ZXogdmltLWRldkB2aW0ub3JnLCBzdnAuIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAicGV1dCBwYXMgaW5zY3JpcmUgY29tbWFuZGUgZGUgcmFwcGVsOiBy6WYuIHRhbXBvbi9mZW7qdHJlIGludHJvdXZhYmxlIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiIgorIkU1NzE6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkU1NzE6IETpc29s6SwgY29tbWFuZGUgZOlzYWN0aXbpZTogbGEgYmlibGlvdGjocXVlIFRjbCBuJ2EgcHUg6nRyZSBjaGFyZ+llLiIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiRTI4MTogRVJSRVVSIFRDTDogY29kZSBkZSBzb3J0aWUgcGFzIGludCA/ISBDb250YWN0ZXIgdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoyMDA2Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICJwYXMgcHUgculjdXDpcmVyIGxhIGxpZ25lIgorCisjIHRvZG8KKyM6IGlmX3hjbWRzcnYuYzoyMTUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJJbmNhcGFibGUgZCdpbnNjcmlyZSB1biBub20gZGUgc2VydmV1ciBkZSBjb21tYW5kZSIKKworIzogaWZfeGNtZHNydi5jOjQ2NQorbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IMljaGVjIGRlIGwnZW52b2kgZGUgbGEgY29tbWFuZGUgYXUgcHJvZ3JhbW1lIGRlIGRlc3RpbmF0aW9uIgorCisjOiBpZl94Y21kc3J2LmM6NzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzM6IEludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJFNTczOiBVdGlsaXPpIHVuZSBJZCBkZSBzZXJ2ZXVyIGludmFsaWRlOiAlcyIKKworIzogaWZfeGNtZHNydi5jOjEwOTgKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IEVudHLpZSByZWdpc3RyZSBkZSBsJ2luc3RhbmNlIGRlIFZpbSBtYWwgZm9ybWF0dOllLiAgRWZmYWPpZSAhIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiT3B0aW9uIGluY29ubnVlIgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiVHJvcCBkJ2FyZ3VtZW50cyBkJ+lkaXRpb24iCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkFyZ3VtZW50IG1hbnF1YW50IGFwcuhzIgorCisjIHRvZG8KKyM6IG1haW4uYzo2NgorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICJE6XRyaXR1cyBhcHLocyBsJ29wdGlvbiIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlRyb3AgZCdhcmd1bWVudHMgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvdSBcIi0tY21kIGNvbW1hbmRcIiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIkFyZ3VtZW50IGludmFsaWRlIHBvdXIiCisKKyM6IG1haW4uYzo0NjkKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIkNlIFZpbSBuJ2EgcGFzIOl06SBjb21waWzpIGF2ZWMgbGEgZm9uY3Rpb25uYWxpdOkgZGlmZiIKKworIzogbWFpbi5jOjkyNgorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIk52bGUgdGVudGF0aXZlIHBvdXIgb3V2cmlyIGxlIHNjcmlwdDogXCIiCisKKyM6IG1haW4uYzo5MzAgbWFpbi5jOjkzNyBtYWluLmM6OTgxIG1lbWxpbmUuYzozNjgyIG1lbWxpbmUuYzozNjg2Cittc2dpZCAiXCJcbiIKK21zZ3N0ciAiXCJcbiIKKworIzogbWFpbi5jOjkzNQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciByZWFkaW5nOiBcIiIKK21zZ3N0ciAiTmUgcGV1dCBvdXZyaXIgZW4gbGVjdHVyZTogXCIiCisKKyMgdG9kbworIzogbWFpbi5jOjk3OQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTmUgcGV1dCBvdXZyaXIgcG91ciBsYSBzb3J0aWUgc2NyaXB0OiBcIiIKKworIzogbWFpbi5jOjExMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICIlZCBmaWNoaWVycyDgIOlkaXRlclxuIgorCisjOiBtYWluLmM6MTIwMworbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogQWxlcnRlOiBMYSBzb3J0aWUgbmUgcydlZmZlY3R1ZSBwYXMgc3VyIHVuIHRlcm1pbmFsXG4iCisKKyM6IG1haW4uYzoxMjA1Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogQWxlcnRlOiBMJ2VudHLpZSBuZSBzZSBmYWl0IHBhcyBzdXIgdW4gdGVybWluYWxcbiIKKworIy4ganVzdCBpbiBjYXNlLi4KKyM6IG1haW4uYzoxMjY3Cittc2dpZCAicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAibGlnbmUgZGUgY29tbWFuZGUgcHJlLXZpbXJjIgorCisjOiBtYWluLmM6MTMwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogTmUgcGV1dCBsaXJlIFwiJXNcIiIKKworIzogbWFpbi5jOjIzNDQKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBsdXMgZCdpbmZvIGF2ZWM6IFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjIzNzcKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW2ZpY2hpZXIgLi4uXSAgb3V2cmlyIGxlL3MgZmljaGllci9zIHNw6WNpZmnpL3MiCisKKyM6IG1haW4uYzoyMzc4Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICBsaXJlIGxlIHRleHRlIOAgcGFydGlyIGRlIHN0ZGluIgorCisjOiBtYWluLmM6MjM3OQorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IOl0aXF1ZXR0ZSAgIG91dnJpciBsZSBmaWNoaWVyIHF1aSBjb250aWVudCBsJ+l0aXF1ZXR0ZSIKKworIzogbWFpbi5jOjIzODEKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtmaWNoRXJyXSAgIG91dnJpciBhdSBuaXZlYXUgZGUgbGEgcHJlbWnocmUgZXJyZXVyIgorCisjOiBtYWluLmM6MjM5MAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJ1dGlsaXNlcjoiCisKKyM6IG1haW4uYzoyMzkzCittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgIiB2aW0gW2FyZ3NdICIKKworIzogbWFpbi5jOjIzOTcKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgICAgb3U6IgorCisjOiBtYWluLmM6MjQwMAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCisKKyM6IG1haW4uYzoyNDAxCittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0UGx1cyBxdWUgZGVzIG5vbXMgZGUgZmljaGllciBhcHLocyBjZWNpIgorCisjOiBtYWluLmM6MjQwMworbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdE5lIHBhcyBk6XZlbG9wcGVyIGxlcyBt6XRhY2FyYWN06HJlcyIKKworIzogbWFpbi5jOjI0MDYKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0SW5zY3JpcmUgY2UgZ3ZpbSBwb3VyIGwnT0xFIgorCisjOiBtYWluLmM6MjQwNworbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0ROlzaW5zY3JpcmUgZ3ZpbSBkZSBsJ09MRSIKKworIzogbWFpbi5jOjI0MTAKK21zZ2lkICItZ1x0XHRcdFJ1biB1c2luZyBHVUkgKGxpa2UgXCJndmltXCIpIgorbXNnc3RyICItZ1x0XHRMYW5jZXIgbCdpbnRlcmZhY2UgZ3JhcGhpcXVlIChjb21tZSBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyNDExCittc2dpZCAiLWYgIG9yICAtLW5vZm9ya1x0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWYsIC0tbm9mb3JrXHRBdmFudC1wbGFuOyBuZSBwYXMgZOl0YWNoZXIgbCdpbnRlcmZhY2UgZ3JhcGhpcXVlIGR1IHRlcm1pbmFsIgorCisjOiBtYWluLmM6MjQxMworbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRNb2RlIFZpIChjb21tZSBcInZpXCIpIgorCisjOiBtYWluLmM6MjQxNAorbXNnaWQgIi1lXHRcdFx0RXggbW9kZSAobGlrZSBcImV4XCIpIgorbXNnc3RyICItZVx0XHRNb2RlIEV4IChjb21tZSBcImV4XCIpIgorCisjOiBtYWluLmM6MjQxNQorbXNnaWQgIi1zXHRcdFx0U2lsZW50IChiYXRjaCkgbW9kZSAob25seSBmb3IgXCJleFwiKSIKK21zZ3N0ciAiLXNcdFx0TW9kZSBzaWxlbmNpZXV4IChiYXRjaCkgKHNldWxlbWVudCBwb3VyIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDE3Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRNb2RlIERpZmYgKGNvbW1lIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjI0MTkKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRNb2RlIGZhY2lsZSAoY29tbWUgXCJldmltXCIsIHZpbSBzYW5zIG1vZGVzKSIKKworIzogbWFpbi5jOjI0MjAKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRNb2RlIGxlY3R1cmUgc2V1bGUgKGNvbW1lIFwidmlld1wiKSIKKworIzogbWFpbi5jOjI0MjEKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdE1vZGUgcmVzdHJlaW50IChjb21tZSBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyNDIyCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0SW50ZXJkaXJlIGwnZW5yZWdpc3RyZW1lbnQgZGUgZmljaGllcnMiCisKKyM6IG1haW4uYzoyNDIzCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdEludGVyZGlyZSB0b3V0ZSBtb2RpZmljYXRpb24gZGUgdGV4dGUiCisKKyM6IG1haW4uYzoyNDI0Cittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0TW9kZSBiaW5haXJlIgorCisjOiBtYWluLmM6MjQyNgorbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRNb2RlIGxpc3AiCisKKyM6IG1haW4uYzoyNDI4Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0Q29tcGF0aWJsZSBhdmVjIFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDI5Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFBhcyB0ZWxsZW1lbnQgY29tcGF0aWJsZSBhdmVjIFZpOiAnbm9jb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0MzAKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0Tml2ZWF1IGRlIHZlcmJvc2l06SIKKworIzogbWFpbi5jOjI0MzEKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRNb2RlIGRlIGTpYm9nYWdlIgorCisjOiBtYWluLmM6MjQzMgorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdE5lIHBhcyB1dGlsaXNlciBkZSBmaWNoaWVyIGQn6WNoYW5nZSwgc2V1bGVtZW50IGxhIG3pbW9pcmUiCisKKyM6IG1haW4uYzoyNDMzCittc2dpZCAiLXJcdFx0XHRMaXN0IHN3YXAgZmlsZXMgYW5kIGV4aXQiCittc2dzdHIgIi1yXHRcdExpc3RlciBsZXMgZmljaGllcnMgZCfpY2hhbmdlIHB1aXMgcXVpdHRlciIKKworIzogbWFpbi5jOjI0MzQKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgPGZpY2hpZXI+XHRS6WN1cOlyZXIgdW5lIHNlc3Npb24gcGxhbnTpZSIKKworIzogbWFpbi5jOjI0MzUKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdENvbW1lIC1yIgorCisjOiBtYWluLmM6MjQzNworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0TmUgcGFzIHV0aWxpc2VyIG5ld2NsaSBwb3VyIGwnb3V2ZXJ0dXJlIGRlcyBmZW7qdHJlcyIKKworIzogbWFpbi5jOjI0MzgKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDxw6XJpZj5cdFV0aWxpc2VyIDxw6XJpcGjpcmlxdWU+IHBvdXIgbGVzIEUvUyIKKworIzogbWFpbi5jOjI0NDEKK21zZ2lkICItQVx0XHRcdHN0YXJ0IGluIEFyYWJpYyBtb2RlIgorbXNnc3RyICItQVx0XHRE6W1hcnJlciBlbiBtb2RlIGFyYWJpcXVlIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIi1IXHRcdFx0U3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdETpbWFycmVyIGVuIG1vZGUgaOlicmV1IgorCisjOiBtYWluLmM6MjQ0NworbXNnaWQgIi1GXHRcdFx0U3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0ROltYXJyZXIgZW4gbW9kZSBmYXJzaSIKKworIzogbWFpbi5jOjI0NDkKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA8dGVybT5cdFLpZ2xlciBsZSB0eXBlIGR1IHRlcm1pbmFsIHN1ciA8dGVybWluYWw+IgorCisjOiBtYWluLmM6MjQ1MAorbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRVdGlsaXNlciA8dmltcmM+IGF1IGxpZXUgZHUgdmltcmMgaGFiaXR1ZWwiCisKKyM6IG1haW4uYzoyNDUyCittc2dpZCAiLVUgPGd2aW1yYz5cdFx0VXNlIDxndmltcmM+IGluc3RlYWQgb2YgYW55IC5ndmltcmMiCittc2dzdHIgIi1VIDxndmltcmM+XHRVdGlsaXNlciA8Z3ZpbXJjPiBhdSBsaWV1IGR1IGd2aW1yYyBoYWJpdHVlbCIKKworIyB0b2RvCisjOiBtYWluLmM6MjQ1NAorbXNnaWQgIi0tbm9wbHVnaW5cdFx0RG9uJ3QgbG9hZCBwbHVnaW4gc2NyaXB0cyIKK21zZ3N0ciAiLS1ub3BsdWdpblx0TmUgY2hhcmdlciBhdWN1biBwbHVnaW4gc2NyaXB06SIKKworIzogbWFpbi5jOjI0NTUKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0T3V2cmlyIE4gZmVu6nRyZXMgKGTpZmF1dDogdW5lIHBvdXIgY2hhcXVlIGZpY2hpZXIpIgorCisjOiBtYWluLmM6MjQ1NgorbXNnaWQgIi1PW05dXHRcdExpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRDb21tZSAtbywgbWFpcyBz6XBhcmVyIHZlcnRpY2FsZW1lbnQiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdETpbWFycmVyIGVuIGJhcyBkdSBmaWNoaWVyIgorCisjOiBtYWluLmM6MjQ1OAorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bnVtTD5cdETpbWFycmVyIOAgbGEgbGlnbmUgPG51bUw+IgorCisjOiBtYWluLmM6MjQ2MAorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxjbWRlPlx0RXjpY3V0ZXIgPGNvbW1hbmRlPiBhdmFudCBt6m1lIGRlIGNoYXJnZXIgbGVzIHZpbXJjIgorCisjOiBtYWluLmM6MjQ2MgorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8Y21kZT5cdEV46WN1dGVyIDxjb21tYW5kZT4gdW5lIGZvaXMgbGUgMWVyIGZpY2hpZXIgY2hhcmfpIgorCisjOiBtYWluLmM6MjQ2MworbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLVMgPHNlc3Npb24+XHRMaXJlIGxlIGZpY2hpZXIgPHNlc3Npb24+IHVuZSBmb2lzIGxlIDFlciBmaWNoaWVyIGNoYXJn6SIKKworIzogbWFpbi5jOjI0NjQKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c3JjPlx0TGlyZSBsZXMgY29tbWFuZGVzIGR1IG1vZGUgTm9ybWFsIOAgcGFydGlyIGR1IGZpY2hpZXIgPHNyYz4iCisKKyM6IG1haW4uYzoyNDY1Cittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPGRlc3Q+XHRBam91dGVyIHRvdXRlcyBsZXMgY29tbWFuZGVzIHRhcOllcyBkYW5zIGxlIGZpY2hpZXIgPGRlc3Q+IgorCisjOiBtYWluLmM6MjQ2NgorbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPGRlc3Q+XHTJY3JpcmUgdG91dGVzIGxlcyBjb21tYW5kZXMgdGFw6WVzIGRhbnMgbGUgZmljaGllciA8ZGVzdD4iCisKKyM6IG1haW4uYzoyNDY4Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHTJZGl0ZXIgZGVzIGZpY2hpZXJzIGVuY29k6XMiCisKKyM6IG1haW4uYzoyNDcyCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDzpY3Jhbj5cdENvbm5lY3RlciBWaW0gYXUgc2VydmV1ciBYIGluZGlxdekgZGFucyA86WNyYW4+IgorCisjOiBtYWluLmM6MjQ3NAorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0TmUgc2UgY29ubmVjdGVyIOAgYXVjdW4gc2VydmV1ciBYIgorCisjOiBtYWluLmM6MjQ3NworbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgaWYgcG9zc2libGUiCittc2dzdHIgIi0tcmVtb3RlIDxmaWNoPlx0yWRpdGVyIGxlcyA8ZmljaGllcnM+IGRhbnMgdW4gc2VydmV1ciBWaW0gc2kgcG9zc2libGUiCisKKyM6IG1haW4uYzoyNDc4Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXNpbGVudCAuLi5cdFBhcmVpbCwgbWFpcyBwYXMgZGUgcGxhaW50ZSBzJ2lsIG4neSBhIHBhcyBkZSBzZXJ2ZXVyIgorCisjOiBtYWluLmM6MjQ3OQorbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlcz4gIEFzIC0tcmVtb3RlIGJ1dCB3YWl0IGZvciBmaWxlcyB0byBoYXZlIGJlZW4gZWRpdGVkIgorbXNnc3RyICItLXJlbW90ZS13YWl0IDxmaWNoPlx0Q29tbWUgLS1yZW1vdGUgbWFpcyBuZSBxdWl0dGVyIHF1J+AgbGEgZmluIGRlIGwn6WRpdGlvbiIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnRcdFBhcmVpbCwgbWFpcyBwYXMgZGUgcGxhaW50ZSBzJ2lsIG4neSBhIHBhcyBkZSAiCisic2VydmV1ciIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDx0Y2hlPlx0RW52b3llciA8dG91Y2hlcz4g4CB1biBzZXJ2ZXVyIFZpbSBwdWlzIHF1aXR0ZXIiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdMl2YWx1ZXIgPGV4cD4gZGFucyB1biBzZXJ2ZXVyIFZpbSwgYWZmaWNoZXIgbGUgculzdWx0YXQiCisKKyM6IG1haW4uYzoyNDgzCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIiIKKyItLXNlcnZlcmxpc3RcdFx0TGlzdGVyIGxlcyBub21zIGRlcyBzZXJ2ZXVycyBWaW0gZGlzcG9uaWJsZXMgZXQgcXVpdHRlciIKKworIzogbWFpbi5jOjI0ODQKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8bm9tPlx0RW52b3llciBhdSAvIERldmVuaXIgbGUgc2VydmV1ciBWaW0gbm9tbekgPG5vbT4iCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdFV0aWxpc2VyIDx2aW1pbmZvPiBhdSBsaWV1IGR1IHZpbWluZm8gaGFiaXR1ZWwiCisKKyM6IG1haW4uYzoyNDg5Cittc2dpZCAiLWggIG9yICAtLWhlbHBcdFByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oIG91IC0taGVscFx0XHRBZmZpY2hlciBsJ2FpZGUgKGNlIG1lc3NhZ2UpIHB1aXMgcXVpdHRlciIKKworIzogbWFpbi5jOjI0OTAKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdEFmZmljaGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBwdWlzIHF1aXR0ZXIiCisKKyM6IG1haW4uYzoyNDk0Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29ubnVzIHBhciBndmltICh2ZXJzaW9uIE1vdGlmKTpcbiIKKworIzogbWFpbi5jOjI0OTgKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29ubnVzIHBhciBndmltICh2ZXJzaW9uIG5lWHRhdyk6XG4iCisKKyM6IG1haW4uYzoyNTAwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvbm51cyBwYXIgZ3ZpbSAodmVyc2lvbiBBdGhlbmEpOlxuIgorCisjOiBtYWluLmM6MjUwNAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDzpY3Jhbj5cdExhbmNlciBWaW0gc3VyIGNldCA86WNyYW4+IgorCisjOiBtYWluLmM6MjUwNQorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHRJY29uaWZpZXIgVmltIGF1IGTpbWFycmFnZSIKKworIzogbWFpbi5jOjI1MDcKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bm9tPlx0XHRFbXBsb3llciBsZXMgcmVzc291cmNlcyBjb21tZSBzaSBWaW0gcydhcHBlbGFpdCA8bm9tPiIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgIChwYXMgaW1wbOltZW506SlcbiIKKworIzogbWFpbi5jOjI1MTAKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb3VsPlx0VXRpbGlzZXIgPGNvdWxldXI+IHBvdXIgbCdhcnJp6HJlLXBsYW5cdCAgICAoYWJydjogLWJnKSIKKworIzogbWFpbi5jOjI1MTEKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIiIKKyItZm9yZWdyb3VuZCA8Y291bD5cdFV0aWxpc2VyIDxjb3VsZXVyPiBwb3VyIGxlIHRleHRlIG5vcm1hbFx0ICAgIChhYnJ2OiAtZmcpIgorCisjOiBtYWluLmM6MjUxMiBtYWluLmM6MjUzMgorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnRlPlx0VXRpbGlzZXIgPGZvbnRlPiBwb3VyIGxlIHRleHRlIG5vcm1hbFx0ICAgIChhYnJ2OiAtZm4pIgorCisjOiBtYWluLmM6MjUxMworbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxmb250ZT5cdFV0aWxpc2VyIDxmb250ZT4gcG91ciBsZSB0ZXh0ZSBncmFzIgorCisjOiBtYWluLmM6MjUxNAorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxmb250ZT5cdFV0aWxpc2VyIDxmb250ZT4gcG91ciBsZSB0ZXh0ZSBpdGFsaXF1ZSIKKworIzogbWFpbi5jOjI1MTUgbWFpbi5jOjI1MzMKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIi1nZW9tZXRyeSA8Z+lvbT5cdFV0aWxpc2VyIGNldHRlIDxn6W9t6XRyaWU+IGluaXRpYWxlXHQgIChhYnJ2OiAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPOlwYWlzPlx0VXRpbGlzZXIgY2V0dGUgPOlwYWlzc2V1cj4gZGUgYm9yZHVyZVx0ICAgIChhYnJ2OiAtYncpIgorCisjOiBtYWluLmM6MjUxNworbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiLXNjcm9sbGJhcndpZHRoIDxsZz5cdFV0aWxpc2VyIGNldHRlIDxsYXJnZXVyPiBkZSBiYXJyZSBkZSBk6WZpbC4gKGFicnY6IC1zdykiCisKKyM6IG1haW4uYzoyNTE5Cittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhhdXQ+XHRVdGlsaXNlciBjZXR0ZSA8aGF1dGV1cj4gZGUgbWVudVx0ICAgIChhYnJ2OiAtbWgpIgorCisjOiBtYWluLmM6MjUyMSBtYWluLmM6MjUzNAorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHRVdGlsaXNlciBsYSB2aWTpbyBpbnZlcnPpZVx0XHQgICAgKGFicnY6IC1ydikiCisKKyM6IG1haW4uYzoyNTIyCittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdE5lIHBhcyB1dGlsaXNlciBkZSB2aWTpbyBpbnZlcnPpZVx0ICAgIChhYnJ2OiArcnYpIgorCisjOiBtYWluLmM6MjUyMworbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHJlc3NvdXJjZT5cdENvbmZpZ3VyZXIgbGEgPHJlc3NvdXJjZT4gc3DpY2lmaellIgorCisjOiBtYWluLmM6MjUyNgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29ubnVzIHBhciBndmltICh2ZXJzaW9uIFJJU0MgT1MpOlxuIgorCisjOiBtYWluLmM6MjUyNworbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxub21icmU+XHROb21icmUgZGUgY29sb25uZXMgaW5pdGlhbCBkZSBsYSBmZW7qdHJlIgorCisjOiBtYWluLmM6MjUyOAorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8bm9tYnJlPlx0Tm9tYnJlIGRlIGxpZ25lcyBpbml0aWFsIGRlIGxhIGZlbup0cmUiCisKKyM6IG1haW4uYzoyNTMxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb25udXMgcGFyIGd2aW0gKHZlcnNpb24gR1RLKyk6XG4iCisKKyM6IG1haW4uYzoyNTM1Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPOljcmFuPlx0TGFuY2VyIFZpbSBzdXIgY2V0IDzpY3Jhbj5cdCAo6WdhbGVtZW50OiAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjUzNworbXNnaWQgIi0tcm9sZSA8cm9sZT5cdFNldCBhIHVuaXF1ZSByb2xlIHRvIGlkZW50aWZ5IHRoZSBtYWluIHdpbmRvdyIKK21zZ3N0ciAiIgorIi0tcm9sZSA8cvRsZT5cdFx0RW5kb3NzZSB1biBy9GxlIHVuaXF1ZSBwb3VyIGlkZW50aWZpZXIgbGEgZmVu6nRyZSBwcmluY2lwYWxlIgorCisjOiBtYWluLmM6MjUzOQorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdE91dnJpciBWaW0gZGFucyB1biBhdXRyZSB3aWRnZXQgR1RLIgorCisjOiBtYWluLmM6MjU0MQorbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdEFmZmljaGVyIGxlcyBhcmd1bWVudHMgR05PTUUiCisKKyMgVE9ETworIzogbWFpbi5jOjI3NzMKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICJQYXMgZGUgZGlzcGxheSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI3ODgKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6IEwnZW52b2kgYSDpY2hvdekuXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjc5NAorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiBMJ2Vudm9pIGEg6WNob3XpLiBUZW50YXRpdmUgZCdleOljdXRpb24gbG9jYWxlXG4iCisKKyM6IG1haW4uYzoyODMyIG1haW4uYzoyODUzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQgZGUgJWQg6WRpdOlzIgorCisjIFRPRE8KKyM6IG1haW4uYzoyODc1Cittc2dpZCAiTm8gZGlzcGxheTogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiUGFzIGRlIGRpc3BsYXk6IEwnZW52b2kgZGUgbCdleHByZXNzaW9uIGEg6WNob3XpLlxuIgorCisjOiBtYWluLmM6Mjg4NworbXNnaWQgIjogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiOiBMJ2Vudm9pIGRlIGwnZXhwcmVzc2lvbiBhIOljaG916S5cbiIKKworIzogbWFyay5jOjY1NgorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiQXVjdW5lIG1hcnF1ZSBhY3RpdullIgorCisjOiBtYXJrLmM6NjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4MzogQXVjdW5lIG1hcnF1ZSBuZSBjb3JyZXNwb25kIOAgXCIlc1wiIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo2NjkKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisibWFycSBsaWduZSBjb2wgZmljaGllci90ZXh0ZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzA3Cittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgc2F1dCBsaWduZSBjb2wgZmljaGllci90ZXh0ZSIKKworIzogbWFyay5jOjEwNzIKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBNYXJxdWVzIGRhbnMgbGUgZmljaGllcjpcbiIKKworIyBUT0RPCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDcKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTGlzdCBkZSBzYXV0IChsZSBwbHVzIHLpY2VudCBlbiBwcmVtaWVyKTpcbiIKKworIzogbWFyay5jOjEyMDIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmlxdWUgZGVzIG1hcnF1ZXMgZGFucyBsZXMgZmljaGllcnMgKGNocm9ub2xvZ2llIGTpY3JvaXNzYW50ZSk6XG4iCisKKyM6IG1hcmsuYzoxMjg1Cittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIic+JyBtYW5xdWFudCIKKworIzogbWJ5dGUuYzo0MDkKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0MzogUGFzIHVuZSBwYWdlIGRlIGNvZGVzIHZhbGFibGUiCisKKyM6IG1ieXRlLmM6NDAxNAorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBJbXBvc3NpYmxlIGRlIHLpZ2xlciBsZXMgdmFsZXVycyBJQyIKKworIzogbWJ5dGUuYzo0MTY2Cittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiBFcnJldXIgZGUgY3LpYXRpb24gZHUgY29udGV4dGUgZGUgc2Fpc2llIgorCisjOiBtYnl0ZS5jOjQzMTMKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IEVycmV1ciBkJ291dmVydHVyZSBkZSBsYSBt6XRob2RlIGRlIHNhaXNpZSIKKworIyBUT0RPCisjOiBtYnl0ZS5jOjQzMjQKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IEFsZXJ0ZTogUGFzIHB1IOl0YWJsaXIgZCdhcHBlbCBkZSBkZXN0cnVjdGlvbiBkYW5zIGxhIE1TIgorCisjOiBtYnl0ZS5jOjQzMzAKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogbGEgbel0aG9kZSBkZSBzYWlzaWUgbmUgc3VwcG9ydGUgYXVjdW4gc3R5bGUiCisKKyM6IG1ieXRlLmM6NDM4NworbXNnaWQgIkUyODk6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgbXkgcHJlZWRpdCB0eXBlIgorbXNnc3RyICJFMjg5OiBsYSBt6XRob2RlIGRlIHNhaXNpZSBuZSBzdXBwb3J0ZSBwYXMgbW9uIHR5cGUgZGUgcHLp6WRpdGlvbiIKKworIyBUT0RPCisjOiBtYnl0ZS5jOjQ0NjEKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IGxlIHN0eWxlIG92ZXItdGhlLXNwb3QgbuljZXNzaXRlIHVuIGZvbnRzZXQiCisKKyM6IG1ieXRlLmM6NDQ5MworbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogVm90cmUgR1RLKyBlc3QgcGx1cyBhbmNpZW4gcXVlIDEuMi4zLiBab25lIGQn6XRhdCBk6XNhY3RpdullIgorCisjOiBtYnl0ZS5jOjQ3NzIKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiBMZSBTZXJ2ZXVyIGRlIE3pdGhvZGVzIGRlIFNhaXNpZSBuJ2VzdCBwYXMgbGFuY+kiCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogbGUgYmxvYyBuJ+l0YWl0IHBhcyB2ZXJvdWlsbOkiCisKKyM6IG1lbWZpbGUuYzo5ODkKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiBFcnJldXIgZGUgcG9zaXRpb25uZW1lbnQgbG9ycyBkZSBsYSBsZWN0dXJlIGR1IGZpY2hpZXIgZCfpY2hhbmdlIgorCisjOiBtZW1maWxlLmM6OTk0Cittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IEVycmV1ciBkZSBsZWN0dXJlIGRhbnMgbGUgZmljaGllciBkJ+ljaGFuZ2UiCisKKyM6IG1lbWZpbGUuYzoxMDQ2Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IEVycmV1ciBkZSBwb3NpdGlvbm5lbWVudCBsb3JzIGRlIGwn6WNyaXR1cmUgZHUgZmljaGllciBkJ+ljaGFuZ2UiCisKKyM6IG1lbWZpbGUuYzoxMDY0Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiBFcnJldXIgZCfpY3JpdHVyZSBkYW5zIGxlIGZpY2hpZXIgZCfpY2hhbmdlIgorCisjOiBtZW1maWxlLmM6MTI2MQorbXNnaWQgIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIKK21zZ3N0ciAiRTMwMDogTGUgZmljaGllciBkJ+ljaGFuZ2UgZXhpc3RlIGTpauAgKGF0dGFxdWUgcGFyIHN5bWxpbmsgPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBQYXMgculjdXDpcukgbGUgYmxvYyBusDAgPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IFBhcyBy6WN1cOly6SBsZSBibG9jIG6wMSA/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogUGFzIHLpY3Vw6XLpIGxlIGJsb2MgbrAyID8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IE91cHMsIG9uIGEgcGVyZHUgbGUgZmljaGllciBkJ+ljaGFuZ2UgISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBQYXMgcHUgcmVub21tZXIgbGUgZmljaGllciBkJ+ljaGFuZ2UiCisKKyM6IG1lbWxpbmUuYzo1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwMzogVW5hYmxlIHRvIG9wZW4gc3dhcCBmaWxlIGZvciBcIiVzXCIsIHJlY292ZXJ5IGltcG9zc2libGUiCittc2dzdHIgIkUzMDM6IFBhcyBwdSBvdXZyaXIgZmljaGllciAuc3dwIHBvdXIgXCIlc1wiLCBy6WN1cC4gaW1wb3NzaWJsZSIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogUGFzIHLpY3Vw6XLpIGxlIGJsb2MgMCA/ISIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBQYXMgZGUgZmljaGllciBkJ+ljaGFuZ2UgdHJvdXbpIHBvdXIgJXMiCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICJFbnRyZSBsZSBudW3pcm8gZHUgZmljaGllciBkJ+ljaGFuZ2Ug4CB1dGlsaXNlciAoMCBwb3VyIHF1aXR0ZXIpOiAiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6IE5lIHBldXQgb3V2cmlyICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiSW5jYXBhYmxlIGRlIGxpcmUgbGUgYmxvYyAwIGRlICIKKworIyBUT0RPCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIlBldXQt6nRyZSBxdSdhdWN1bmUgbW9kaWYuIG4nYSDpdOkgZmFpdGUgb3UgVmltIG4nYSBwYXMgbWlzIOAgam91ciBsZSBmaWNoaWVyIGQn6WNoYW5nZS4iCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiBuZSBwZXV0IOp0cmUgdXRpbGlz6SBhdmVjIGNldHRlIHZlcnNpb24gZGUgVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODQ5Cittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiVXRpbGlzZXogVmltIHZlcnNpb24gMy4wLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIG5lIHNlbWJsZSBwYXMg6nRyZSB1biBmaWNoaWVyIGQn6WNoYW5nZSBkZSBWaW0iCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIG5lIHBldXQg6nRyZSB1dGlsaXPpIHN1ciBjZXQgb3JkaW5hdGV1ci5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAiTGUgZmljaGllciBhIOl06SBjcunpIGxlICIKKworIzogbWVtbGluZS5jOjg3NAorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisib3UgbGUgZmljaGllciBhIOl06SBlbmRvbW1hZ+kuIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlV0aWxpc2F0aW9uIGR1IGZpY2hpZXIgZCfpY2hhbmdlIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRmljaGllciBvcmlnaW5hbCBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MjIKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogQWxlcnRlOiBMZSBmaWNoaWVyIG9yaWdpbmFsIGEgcHUg6nRyZSBjaGFuZ+kiCisKKyM6IG1lbWxpbmUuYzo5NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiBJbmNhcGFibGUgZGUgbGlyZSBsZSBibG9jIDEgZGUgJXMiCisKKyM6IG1lbWxpbmUuYzo5NjcKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P0JFQVVDT1VQIERFIExJR05FUyBNQU5RVUVOVCIKKworIzogbWVtbGluZS5jOjk4MworbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P05PTUJSRSBERSBMSUdORVMgRVJST07JIgorCisjOiBtZW1saW5lLmM6OTkwCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P0JMT0MgVklERSIKKworIzogbWVtbGluZS5jOjEwMTYKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9MSUdORVMgTUFOUVVBTlRFUyIKKworIzogbWVtbGluZS5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IElEIGR1IGJsb2MgMSBlcnJvbullICglcyBuJ2VzdCBwYXMgdW4gZmljaGllciBkJ+ljaGFuZ2UgPykiCisKKyM6IG1lbWxpbmUuYzoxMDUzCittc2dpZCAiPz8/QkxPQ0sgTUlTU0lORyIKK21zZ3N0ciAiPz8/QkxPQyBNQU5RVUFOVCIKKworIzogbWVtbGluZS5jOjEwNjkKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gZCdpY2kganVzcXUn4CA/Pz9GSU4gZGVzIGxpZ25lcyBwZXV2ZW50IOp0cmUgY29ycm9tcHVlcyIKKworIzogbWVtbGluZS5jOjEwODUKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIj8/PyBkJ2ljaSBqdXNxdSfgID8/P0ZJTiBkZXMgbGlnbmVzIG9udCBwdSDqdHJlIGluc+ly6WUvZWZmYWPpZXMiCisKKyM6IG1lbWxpbmUuYzoxMTA1Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9GSU4iCisKKyM6IG1lbWxpbmUuYzoxMTMxCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IFLpY3Vw6XJhdGlvbiBpbnRlcnJvbXB1ZSIKKworIzogbWVtbGluZS5jOjExMzMKK21zZ2lkICIiCisiRTMxMjogRXJyb3JzIGRldGVjdGVkIHdoaWxlIHJlY292ZXJpbmc7IGxvb2sgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPz8/IgorbXNnc3RyICJFMzEyOiBFcnJldXJzIGxvcnMgZGUgbGEgculjdXDpcmF0aW9uOyBleGFtaW5leiBsZXMgbGlnbmVzIGNvbW1lbudhbnQgcGFyID8/PyIKKworIzogbWVtbGluZS5jOjExMzYKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIlLpY3Vw6XJhdGlvbiBhY2hldullLiBW6XJpZmlleiBzaSB0b3V0IGVzdCBPSy4iCisKKyM6IG1lbWxpbmUuYzoxMTM3Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKFZvdXMgdm91ZHJleiBwZXV0Lep0cmUgZW5yZWdpc3RyZXIgY2UgZmljaGllciBzb3VzIHVuIGF1dHJlIG5vbVxuIgorCisjOiBtZW1saW5lLmM6MTEzOAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICJldCBsYW5jZXIgZGlmZiBhdmVjIGxlIGZpY2hpZXIgb3JpZ2luYWwgcG91ciByZXDpcmVyIGxlcyBjaGFuZ2VtZW50cylcbiIKKworIzogbWVtbGluZS5jOjExMzkKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIkVmZmFjZXogbGUgZmljaGllciAuc3dwIGVuc3VpdGUuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTE5NQorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJGaWNoaWVycyBkJ+ljaGFuZ2UgdHJvdXbpczoiCisKKyM6IG1lbWxpbmUuYzoxMzczCittc2dpZCAiICAgSW4gY3VycmVudCBkaXJlY3Rvcnk6XG4iCittc2dzdHIgIiAgIERhbnMgbGUgculwZXJ0b2lyZSBjb3VyYW50OlxuIgorCisjOiBtZW1saW5lLmM6MTM3NQorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICJVdGlsaXNhbnQgbGUgbm9tIGluZGlxdek6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzc5Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgRGFucyBsZSBy6XBlcnRvaXJlICIKKworIzogbWVtbGluZS5jOjEzOTcKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgLS0gYXVjdW4gLS1cbiIKKworIzogbWVtbGluZS5jOjE0NjkKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgcHJvcHJp6XTpIGRlOiAiCisKKyM6IG1lbWxpbmUuYzoxNDcxCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgIGRhdOk6ICIKKworIzogbWVtbGluZS5jOjE0NzUgbWVtbGluZS5jOjM2ODkKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICBkYXTpOiAiCisKKyM6IG1lbWxpbmUuYzoxNDkxCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW2RlIFZpbSB2ZXJzaW9uIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNDk1Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbbmUgc2VtYmxlIHBhcyDqdHJlIHVuIGZpY2hpZXIgZCfpY2hhbmdlIFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNDk5Cittc2dpZCAiICAgICAgICAgZmlsZSBuYW1lOiAiCittc2dzdHIgIiAgICBub20gZGUgZmljaGllcjogIgorCisjOiBtZW1saW5lLmM6MTUwNQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgbW9kaWZp6TogIgorCisjOiBtZW1saW5lLmM6MTUwNgorbXNnaWQgIllFUyIKK21zZ3N0ciAiT1VJIgorCisjOiBtZW1saW5lLmM6MTUwNgorbXNnaWQgIm5vIgorbXNnc3RyICJub24iCisKKyM6IG1lbWxpbmUuYzoxNTEwCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiIG5vbSBkJ3V0aWxpc2F0ZXVyOiAiCisKKyM6IG1lbWxpbmUuYzoxNTE3Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIG5vbSBkJ2j0dGU6ICIKKworIzogbWVtbGluZS5jOjE1MTkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIG5vbSBkJ2j0dGU6ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICBwcm9jZXNzdXMgbrA6ICIKKworIzogbWVtbGluZS5jOjE1MzEKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKGVuIGNvdXJzIGQnZXjpY3V0aW9uKSIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtpbnV0aWxpc2FibGUgYXZlYyBjZXR0ZSB2ZXJzaW9uIGRlIFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTQ2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW2ludXRpbGlzYWJsZSBzdXIgY2V0IG9yZGluYXRldXJdIgorCisjOiBtZW1saW5lLmM6MTU1MQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFtuZSBwZXV0IOp0cmUgbHVdIgorCisjOiBtZW1saW5lLmM6MTU1NQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW25lIHBldXQg6nRyZSBvdXZlcnRdIgorCisjOiBtZW1saW5lLmM6MTc0NQorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBQculzZXJ2YXRpb24gaW1wb3NzaWJsZSwgaWwgbid5IGEgcGFzIGRlIGZpY2hpZXIgZCfpY2hhbmdlIgorCisjOiBtZW1saW5lLmM6MTc5OAorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJGaWNoaWVyIHBy6XNlcnbpIgorCisjIHRvZG8KKyM6IG1lbWxpbmUuYzoxODAwCittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiDJY2hlYyBkZSBsYSBwculzZXJ2YXRpb24iCisKKyM6IG1lbWxpbmUuYzoxODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogbG51bSBpbnZhbGlkZTogJWxkIgorCisjOiBtZW1saW5lLmM6MTg5NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IGxpZ25lICVsZCBpbnRyb3V2YWJsZSIKKworIzogbWVtbGluZS5jOjIyODcKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6IG1hdXZhaXMgaWQgZGUgcG9pbnRldXIgZGUgYmxvYyAzIgorCisjOiBtZW1saW5lLmM6MjM2NworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGRldnJhaXQg6nRyZSAwIgorCisjOiBtZW1saW5lLmM6MjQyOQorbXNnaWQgIkUzMTg6IFVwZGF0ZWQgdG9vIG1hbnkgYmxvY2tzPyIKK21zZ3N0ciAiRTMxODogVHJvcCBkZSBibG9jcyBtaXMg4CBqb3VyID8iCisKKyMgdG9kbworIzogbWVtbGluZS5jOjI2MTEKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IG1hdXZhaXMgaWQgZGUgcG9pbnRldXIgZGUgYmxvYyA0IgorCisjOiBtZW1saW5lLmM6MjYzOAorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgImJsb2MgMSBlZmZhY+kgPyIKKworIzogbWVtbGluZS5jOjI4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IExpZ25lICVsZCBpbnRyb3V2YWJsZSIKKworIyB0b2RvCisjOiBtZW1saW5lLmM6MzA4MQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IG1hdXZhaXMgaWQgZGUgcG9pbnRldXIgZGUgYmxvYyIKKworIzogbWVtbGluZS5jOjMwOTcKK21zZ2lkICJwZV9saW5lX2NvdW50IGlzIHplcm8iCittc2dzdHIgInBlX2xpbmVfY291bnQgdmF1dCB66XJvIgorCisjIHRvZG8gZGVsYSBkZWzgCisjOiBtZW1saW5lLmM6MzEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IG51belybyBkZSBsaWduZSBob3JzIGxpbWl0ZXM6ICVsZCBhdSBkZWxhIGRlIGxhIGZpbiIKKworIzogbWVtbGluZS5jOjMxMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IG5vbWJyZSBkZSBsaWduZXMgZXJyb27pIGRhbnMgbGUgYmxvYyAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTc5Cittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIkxhIHRhaWxsZSBkZSBsYSBwaWxlIHMnYWNjcm/udCIKKworIzogbWVtbGluZS5jOjMyMjUKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IG1hdXZhaXMgaWQgZGUgcG9pbnRldXIgZGUgYmxvY2sgMiIKKworIzogbWVtbGluZS5jOjM2NzkKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IEFUVEVOVElPTiIKKworIzogbWVtbGluZS5jOjM2ODAKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJUcm91dukgdW4gZmljaGllciBkJ+ljaGFuZ2Ugbm9tbekgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJMb3JzIGRlIGwnb3V2ZXJ0dXJlIGR1IGZpY2hpZXIgXCIiCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIFBMVVMgUslDRU5UIHF1ZSBsZSBmaWNoaWVyIGQn6WNoYW5nZSAhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2OTcKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgVW4gYXV0cmUgcHJvZ3JhbW1lIGVzdCBwZXV0Lep0cmUgZW4gdHJhaW4gZCfpZGl0ZXIgY2UgZmljaGllci5cbiIKKyIgICAgU2kgYydlc3QgbGUgY2FzLCBmYWl0ZXMgYXR0ZW50aW9uIOAgbmUgcGFzIHZvdXMgcmV0cm91dmVyIGF2ZWNcbiIKKyIgICAgZGV1eCB2ZXJzaW9uIGRpZmbpcmVudGVzIGR1IG3qbWUgZmljaGllciBlbiBmYWlzYW50IGRlcyBtb2RpZmljYXRpb25zLlxuIgorCisjOiBtZW1saW5lLmM6MzY5OAorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBRdWl0dGV6LCBvdSBjb250aW51ZXogcHJ1ZGVtbWVudC5cbiIKKworIzogbWVtbGluZS5jOjM2OTkKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgVW5lIHNlc3Npb24gZCfpZGl0aW9uIHBvdXIgY2UgZmljaGllciBhIHBsYW506S5cbiIKKworIzogbWVtbGluZS5jOjM3MDAKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICBTaSBjJ2VzdCBsZSBjYXMsIHV0aWxpc2V6IFwiOnJlY292ZXJcIiBvdSBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNzAyCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgcG91ciBy6WN1cOlyZXIgbGVzIGNoYW5nZW1lbnRzICh2b2lyIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNzAzCittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIFNpIHZvdXMgbCdhdmV6IGTpauAgZmFpdCwgZWZmYWNleiBsZSBmaWNoaWVyIGQn6WNoYW5nZSBcIiIKKworIzogbWVtbGluZS5jOjM3MDUKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgcG91ciDpdml0ZXIgY2UgbWVzc2FnZS5cbiIKKworIzogbWVtbGluZS5jOjM3MTkgbWVtbGluZS5jOjM3MjMKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIkxlIGZpY2hpZXIgZCfpY2hhbmdlIFwiIgorCisjOiBtZW1saW5lLmM6MzcyMCBtZW1saW5lLmM6MzcyNgorbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIgZXhpc3RlIGTpauAgISIKKworIzogbWVtbGluZS5jOjM3MjkKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIEFUVEVOVElPTiIKKworIzogbWVtbGluZS5jOjM3MzEKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJVbiBmaWNoaWVyIGQn6WNoYW5nZSBleGlzdGUgZOlq4CAhIgorCisjOiBtZW1saW5lLmM6MzczNQorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisiJk91dnJpciBlbiBsZWN0dXJlIHNldWxlXG4iCisiJkVkaXRlciBxdWFuZCBt6m1lXG4iCisiJlLpY3Vw6XJlclxuIgorIiZRdWl0dGVyIgorCisjOiBtZW1saW5lLmM6MzczNworbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIiZPdXZyaXIgZW4gbGVjdHVyZSBzZXVsZVxuIgorIiZFZGl0ZXIgcXVhbmQgbeptZVxuIgorIiZS6WN1cOlyZXJcbiIKKyImUXVpdHRlclxuIgorIkxlICZzdXBwcmltZXIiCisKKyM6IG1lbWxpbmUuYzozNzkwCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogVHJvcCBkZSBmaWNoaWVycyBkJ+ljaGFuZ2UgdHJvdXbpcyIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IFVuZSBwYXJ0aWUgZHUgY2hlbWluIGQn6WzpbWVudHMgZGUgbWVudSBuJ2VzdCBwYXMgdW4gc291cy1tZW51IgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogTGUgbWVudSBuJ2V4aXN0ZSBxdWUgZGFucyB1biBhdXRyZSBtb2RlIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogUGFzIGRlIG1lbnUgZGUgY2Ugbm9tIgorCisjOiBtZW51LmM6NTA5Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogTGUgY2hlbWluIGRlIG1lbnUgbmUgZG9pdCBwYXMgY29uZHVpcmUg4CB1biBzb3VzLW1lbnUiCisKKyMgdG9kbworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBBam91dCBkJ+ls6W1lbnRzIGRpcmVjdGVtZW50IGRhbnMgYmFycmUgZGUgbWVudSBpbnRlcmRpdCIKKworIzogbWVudS5jOjU1NAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogVW4gc+lwYXJhdGV1ciBuZSBwZXV0IGZhaXJlIHBhcnRpZSBkJ3VuIGNoZW1pbiBkZSBtZW51IgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDc5Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorCisjOiBtZW51LmM6MTk5NgorbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAiQXJyYWNoZXIgY2UgbWVudSIKKworIzogbWVudS5jOjIwNjEKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBMZSBjaGVtaW4gZHUgbWVudSBkb2l0IGNvbmR1aXJlIOAgdW4g6WzpbWVudCBkZSBtZW51IgorCisjOiBtZW51LmM6MjA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IE1lbnUgaW50cm91dmFibGU6ICVzIgorCisjOiBtZW51LmM6MjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiBMZSBtZW51IG4nZXN0IHBhcyBk6WZpbmkgcG91ciBsZSBtb2RlICVzIgorCisjIHRvZG8KKyM6IG1lbnUuYzoyMTg4Cittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBMZSBjaGVtaW4gZHUgbWVudSBkb2l0IGNvbmR1aXJlIOAgdW4gc291cy1tZW51IgorCisjOiBtZW51LmM6MjIwOQorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogTWVudSBpbnRyb3V2YWJsZSAtIHbpcmlmaWV6IGxlcyBub21zIGRlcyBtZW51cyIKKworIyB0b2RvCisjOiBtZXNzYWdlLmM6NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICJFcnJldXIgZOl0ZWN06WUgZW4gdHJhaXRhbnQgJXM6IgorCisjOiBtZXNzYWdlLmM6NTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgImxpZ25lICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTc1Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIltjaGHubmUgdHJvcCBsb25ndWVdIgorCisjIHRvZG8KKyM6IG1lc3NhZ2UuYzo3MjEKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiTWFpbnRlbmV1ciBkZXMgbWVzc2FnZXM6IEFkcmllbiBCZWF1IDx2ZXJzaW9uLmZyYW5jYWlzZUBmcmVlLmZyPiIKKworIzogbWVzc2FnZS5jOjk0NQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJJbnRlcnJ1cHRpb246ICIKKworIzogbWVzc2FnZS5jOjk0OAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiQXBwdXlleiBzdXIgRU5UUslFIHBvdXIgY29udGludWVyIgorCisjOiBtZXNzYWdlLmM6OTUwCittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAiQXBwdXlleiBzdXIgRU5UUslFIG91IHRhcGV6IHVuZSBjb21tYW5kZSBwb3VyIGNvbnRpbnVlciIKKworIzogbWVzc2FnZS5jOjIyNDQKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBQbHVzIC0tIgorCisjIFRPRE8KKyM6IG1lc3NhZ2UuYzoyMjQ3Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChFTlRSL1JBOiBsaWduZSwgRVNQQ0UvYjogcGFnZSwgZC91OiBkZW1pIHBhZ2UsIHE6IHF1aXR0ZSkiCisKKyM6IG1lc3NhZ2UuYzoyMjQ4Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKEVOVFI6IGxpZ25lLCBFU1BDRTogcGFnZSwgZDogZGVtaSBwYWdlLCBxOiBxdWl0dGUpIgorCisjOiBtZXNzYWdlLmM6Mjc0MCBtZXNzYWdlLmM6Mjc1NQorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJRdWVzdGlvbiIKKworIzogbWVzc2FnZS5jOjI3NDIKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZPdWlcbiIKKyImTm9uIgorCisjIHRvZG8KKyM6IG1lc3NhZ2UuYzoyNzc1Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJk91aVxuIgorIiZOb25cbiIKKyJUb3V0ICZzYXV2ZXJcbiIKKyJUb3V0ICZyZWpldGVyXG4iCisiJkFubnVsZXIiCisKKyMgdG9kbworIzogbWVzc2FnZS5jOjI4MTYKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICJCb+50ZSBkZSBkaWFsb2d1ZSAnRW5yZWdpc3RyZXInIgorCisjIHRvZG8KKyM6IG1lc3NhZ2UuYzoyODE4Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiQm/udGUgZGUgZGlhbG9ndWUgJ091dnJpciciCisKKyMgVE9ETworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzoyODg5Cittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6IETpc29s6SwgcGFzIGQnZXhwbG9yYXRldXIgZGUgZmljaGllcnMgZW4gbW9kZSBjb25zb2xlIgorCisjOiBtaXNjMS5jOjI2OTIKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBBbGVydGU6IE1vZGlmaWNhdGlvbiBkJ3VuIGZpY2hpZXIgZW4gbGVjdHVyZSBzZXVsZSIKKworIzogbWlzYzEuYzoyOTI3Cittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIjEgbGlnbmUgZW4gcGx1cyIKKworIzogbWlzYzEuYzoyOTI5Cittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIjEgbGlnbmUgZW4gbW9pbnMiCisKKyM6IG1pc2MxLmM6MjkzNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiJWxkIGxpZ25lcyBlbiBwbHVzIgorCisjOiBtaXNjMS5jOjI5MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICIlbGQgbGlnbmVzIGVuIG1vaW5zIgorCisjOiBtaXNjMS5jOjI5MzkKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiIChJbnRlcnJvbXB1KSIKKworIzogbWlzYzEuYzo2NjMxCittc2dpZCAiVmltOiBwcmVzZXJ2aW5nIGZpbGVzLi4uXG4iCittc2dzdHIgIlZpbTogcHLpc2VydmF0aW9uIGRlcyBmaWNoaWVycy4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjY0MQorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogRmluaS5cbiIKKworIzogbWlzYzIuYzo2NzAgbWlzYzIuYzo2ODYKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICJFUlJFVVI6ICIKKworIzogbWlzYzIuYzo2OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbb2N0ZXRzXSB0b3RhbCBhbGxvdektbGli6XLpICVsdS0lbHUsIHV0aWxpc+kgJWx1LCBwaWMgJWx1XG4iCisKKyM6IG1pc2MyLmM6NjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlthcHBlbHNdIHRvdGFsIHJlL21hbGxvYygpICVsdSwgdG90YWwgZnJlZSgpICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc0NworbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6IExhIGxpZ25lIGRldmllbnQgdHJvcCBsaW5ndWUiCisKKyM6IG1pc2MyLmM6NzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiBFcnJldXIgaW50ZXJuZTogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IE3pbW9pcmUg6XB1aXPpZSAhICAoYWxsb2NhdGlvbiBkZSAlbHUgb2N0ZXRzKSIKKworIzogbWlzYzIuYzoyNTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJBcHBlbCBkdSBzaGVsbCBwb3VyIGV46WN1dGVyOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6Mjc4NgorbXNnaWQgIkU1NDU6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NDU6IERldXgtcG9pbnRzIG1hbnF1YW50IgorCisjOiBtaXNjMi5jOjI3ODggbWlzYzIuYzoyODE1Cittc2dpZCAiRTU0NjogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFNTQ2OiBNb2RlIGlsbOlnYWwiCisKKyM6IG1pc2MyLmM6Mjg1NAorbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogRm9ybWUgZGUgY3Vyc2V1ciBpbGzpZ2FsZSIKKworIzogbWlzYzIuYzoyODk0Cittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IGNoaWZmcmUgYXR0ZW5kdSIKKworIzogbWlzYzIuYzoyODk5Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiBQb3VyY2VudGFnZSBpbGzpZ2FsIgorCisjOiBtaXNjMi5jOjMyMDkKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICJUYXBleiBsYSBjbOkgZCdlbmNvZGFnZTogIgorCisjOiBtaXNjMi5jOjMyMTAKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICJS6WVudHJleiBsYSBt6m1lIGNs6TogIgorCisjOiBtaXNjMi5jOjMyMjAKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAiTGVzIGNs6XMgbmUgY29ycmVzcG9uZGVudCBwYXMgISIKKworIzogbWlzYzIuYzozNzY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICJFMzQzOiBDaGVtaW4gaW52YWxpZGU6ICcqKltub21icmVdJyBkb2l0IOp0cmUg4CBsYSBmaW4gZHUgY2hlbWluIG91IOp0cmUgc3VpdmkgZGUgJyVzJy4iCisKKyM6IG1pc2MyLmM6NTA0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ0OiBS6XBlcnRvaXJlIFwiJXNcIiBpbnRyb3V2YWJsZSBkYW5zIGxlIGNkcGF0aCIKKworIzogbWlzYzIuYzo1MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogRmljaGllciBcIiVzXCIgaW50cm91dmFibGUgZGFucyBsZSBjaGVtaW4iCisKKyMgdG9kbworIzogbWlzYzIuYzo1MDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IFBsdXMgZGUgculwZXJ0b2lyZSBcIiVzXCIgZGFucyBsZSBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IFBsdXMgZGUgZmljaGllciBcIiVzXCIgZGFucyBsZSBjaGVtaW4iCisKKyM6IG1pc2MyLmM6NTI5MQorbXNnaWQgIkU1NTA6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NTA6IERldXgtcG9pbnRzIG1hbnF1YW50IgorCisjOiBtaXNjMi5jOjUzMDMKK21zZ2lkICJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAiRTU1MTogQ29tcG9zYW50IGlsbOlnYWwiCisKKyM6IG1pc2MyLmM6NTMxMQorbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiBjaGlmZnJlIGF0dGVuZHUiCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6MjgzCittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIkltcG9zc2libGUgZGUgc2UgY29ubmVjdGVyIOAgTmV0YmVhbnMgbrAyIgorCisjOiBuZXRiZWFucy5jOjI5MQorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIHNlIGNvbm5lY3RlciDgIE5ldGJlYW5zIgorCisjIFRPRE8KKyM6IG5ldGJlYW5zLmM6NTY1Cittc2dpZCAicmVhZCBmcm9tIE5ldGJlYW5zIHNvY2tldCIKK21zZ3N0ciAibHUgZW4gcHJvdmVuYW5jZSBkdSBzb2NrZXQgTmV0YmVhbnMiCisKKyM6IG5vcm1hbC5jOjI5MTYKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJBbGVydGU6IGxlIHRlcm1pbmFsIG5lIHBldXQgc3VybGlnbmVyIgorCisjOiBub3JtYWwuYzozMTMxCittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogUGFzIGRlIGNoYe5uZSBzb3VzIGxlIGN1cnNldXIiCisKKyM6IG5vcm1hbC5jOjMxMzMKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogUGFzIGQnaWRlbnRpZmlhbnQgc291cyBsZSBjdXJzZXVyIgorCisjOiBub3JtYWwuYzo0MzUxCittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IExlcyByZXBsaXMgbmUgcGV1dmVudCDqdHJlIGVmZmFj6XMgYXZlYyBsYSAnZm9sZG1ldGhvZCcgYWN0dWVsbGUiCisKKyMgVE9ETworIzogb3BzLmM6Mjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiMSBsaWduZSAlc+llIDEgZm9pcyIKKworIyBUT0RPCisjOiBvcHMuYzoyOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIjEgbGlnbmUgJXPpZSAlZCBmb2lzIgorCisjIFRPRE8KKyM6IG9wcy5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCBsaWduZXMgJXPpZXMgMSBmb2lzIgorCisjOiBvcHMuYzozMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCBsaWduZXMgJXPpZXMgJWQgZm9pcyIKKworIzogb3BzLmM6NjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICIlbGQgbGlnbmVzIOAgaW5kZW50ZXIuLi4gIgorCisjOiBvcHMuYzo3MTMKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxIGxpZ25lIGluZGVudOllICIKKworIzogb3BzLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIiVsZCBsaWduZXMgaW5kZW506WVzICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NDcKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAiY29waWUgaW1wb3NzaWJsZTsgZWZmYWNlbWVudCBlbiB0b3V0IGNhcyIKKworIzogb3BzLmM6MjE1NQorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIxIGxpZ25lIG1vZGlmaellIgorCisjOiBvcHMuYzoyMTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIlbGQgbGlnbmVzIG1vZGlmaellcyIKKworIzogb3BzLmM6MjU0MQorIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAibGli6XJhdGlvbiBkZSAlbGQgbGlnbmVzIgorCisjOiBvcHMuYzoyODIyCittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAiMSBsaWduZSBjb3Bp6WUiCisKKyM6IG9wcy5jOjI4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAiJWxkIGxpZ25lcyBjb3Bp6WVzIgorCisjOiBvcHMuYzozMTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IExlIHJlZ2lzdHJlICVzIGVzdCB2aWRlIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM2NjYKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUmVnaXN0cmVzIC0tLSIKKworIzogb3BzLmM6NDg3NQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAiTm9tIGRlIHJlZ2lzdHJlIGlsbOlnYWwiCisKKyM6IG9wcy5jOjQ5NjEKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlc2dpc3RyZXM6XG4iCisKKyM6IG9wcy5jOjQ5OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJFNTc0OiBUeXBlIGRlIHJlZ2lzdHJlICVkIGluY29ubnUiCisKKyM6IG9wcy5jOjU0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiBOb20gZGUgcmVnaXN0cmUgaW52YWxpZGU6ICclcyciCisKKyM6IG9wcy5jOjU4NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIENvbHM7ICIKKworIzogb3BzLmM6NTg0OAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIlPpbGVjdGlvbm7pICVzJWxkIGRlICVsZCBMaWduZXM7ICVsZCBkZSAlbGQgTW90czsgJWxkIGRlICVsZCBPY3RldHMiCisKKyM6IG9wcy5jOjU4NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICJDb2wgJXMgZGUgJXM7IExpZ25lICVsZCBkZSAlbGQ7IE1vdCAlbGQgZGUgJWxkOyBPY3RldCAlbGQgZGUgJWxkIgorCisjIHRvZG8KKyM6IG9wcy5jOjU4NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHBvdXIgbGUgQk9NKSIKKworIzogb3B0aW9uLmM6MTYyMworbXNnaWQgIiU8JWYlaCVtJT1QYWdlICVOIgorbXNnc3RyICIlPCVmJWglbSU9UGFnZSAlTiIKKworIzogb3B0aW9uLmM6MjA3MgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAiTWVyY2kgZCdhdm9pciBjaG9pc2kgVmltIgorCisjOiBvcHRpb24uYzozMzQ0IG9wdGlvbi5jOjM0NTEKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODogT3B0aW9uIGluY29ubnVlIgorCisjOiBvcHRpb24uYzozMzU3Cittc2dpZCAiRTUxOTogT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkU1MTk6IE9wdGlvbiBwYXMgc3VwcG9ydOllIgorCisjIHRvZG8KKyM6IG9wdGlvbi5jOjMzODIKK21zZ2lkICJFNTIwOiBOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJFNTIwOiBJbnRlcmRpdCBkYW5zIHVuZSBsaWduZSBkZSBtb2RlIgorCisjIFRPRE8KKyM6IG9wdGlvbi5jOjM0MzgKK21zZ2lkICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKK21zZ3N0ciAiIgorIlxuIgorIlx0UulnbOkgculjZW1tZW50IGRhbnMgIgorCisjOiBvcHRpb24uYzozNTc3Cittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6IE5vbWJyZSByZXF1aXMgYXBy6HMgPSIKKworIzogb3B0aW9uLmM6MzkwMyBvcHRpb24uYzo0NTIwCittc2dpZCAiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1MjI6IFBhcyB0cm91dukgZGFucyB0ZXJtY2FwIgorCisjOiBvcHRpb24uYzozOTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IENhcmFjdOhyZSA8JXM+IGlsbOlnYWwiCisKKyM6IG9wdGlvbi5jOjQ1MTIKK21zZ2lkICJFNTI5OiBDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1Mjk6ICd0ZXJtJyBuZSBwZXV0IHBhcyDqdHJlIHVuZSBjaGHubmUgdmlkZSIKKworIzogb3B0aW9uLmM6NDUxNQorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IENoYW5nZW1lbnQgZGUgdGVybSBpbXBvc3NpYmxlIGRhbnMgbCdpbnRlcmZhY2UgZ3JhcGhpcXVlIgorCisjOiBvcHRpb24uYzo0NTE3Cittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IFV0aWxpc2V6IFwiOmd1aVwiIHBvdXIgZOltYXJyZXIgbCdpbnRlcmZhY2UgZ3JhcGhpcXVlIgorCisjOiBvcHRpb24uYzo0NTM4Cittc2dpZCAiRTU4OTogJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiRTU4OTogJ2JhY2t1cGV4dCcgZXQgJ3BhdGNobW9kZScgc29udCDpZ2F1eCIKKworIzogb3B0aW9uLmM6NDcyMworbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiBJbmNoYW5nZWFibGUgZGFucyBsJ2ludGVyZmFjZSBHVEsrIDIiCisKKyM6IG9wdGlvbi5jOjQ4NzkKK21zZ2lkICJFNTI0OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTI0OiBEZXV4LXBvaW50cyBtYW5xdWFudCIKKworIzogb3B0aW9uLmM6NDg4MQorbXNnaWQgIkU1MjU6IFplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiRTUyNTogQ2hh7m5lIGRlIGxvbmd1ZXVyIG51bGxlIgorCisjOiBvcHRpb24uYzo0OTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IE5vbWJyZSBtYW5xdWFudCBhcHLocyA8JXM+IgorCisjOiBvcHRpb24uYzo0OTYzCittc2dpZCAiRTUyNzogTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiRTUyNzogVmlyZ3VsZSBtYW5xdWFudGUiCisKKyM6IG9wdGlvbi5jOjQ5NzAKK21zZ2lkICJFNTI4OiBNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJFNTI4OiBVbmUgdmFsZXVyICcgZG9pdCDqdHJlIHNw6WNpZmnpZSIKKworIyB0b2RvCisjOiBvcHRpb24uYzo1MDExCittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IGNvbnRpZW50IGRlcyBjYXJhY3TocmVzIG11bHRpLW9jdGV0cyBvdSBpbmFmZmljaGFibGVzIgorCisjOiBvcHRpb24uYzo1MDYwCittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBGb250ZShzKSBpbnZhbGlkZShzKSIKKworIzogb3B0aW9uLmM6NTA2OAorbXNnaWQgIkU1OTc6IGNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJFNTk3OiBz6WxlY3Rpb24gZGUgZm9udHNldCBpbXBvc3NpYmxlIgorCisjIHRvZG8KKyM6IG9wdGlvbi5jOjUwNzAKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IEZvbnRzZXQgaW52YWxpZGUiCisKKyMgVE9ETworIzogb3B0aW9uLmM6NTA3NworbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IFPpbGVjdGlvbiBkZSBmb250ZSBsYXJnZSBpbXBvc3NpYmxlIgorCisjOiBvcHRpb24uYzo1MDc5Cittc2dpZCAiRTUzNDogSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzQ6IEZvbnRlIGxhcmdlIGludmFsaWRlIgorCisjOiBvcHRpb24uYzo1MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MzU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIkU1MzU6IENhcmFjdOhyZSBpbGzpZ2FsIGFwcuhzIDwlYz4iCisKKyM6IG9wdGlvbi5jOjU0NTMKK21zZ2lkICJFNTM2OiBjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAiRTUzNjogdmlyZ3VsZSByZXF1aXNlIgorCisjOiBvcHRpb24uYzo1NDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBkb2l0IOp0cmUgdmlkZSBvdSBjb250ZW5pciAlcyIKKworIzogb3B0aW9uLmM6NTUzNAorbXNnaWQgIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkU1Mzg6IExhIHNvdXJpcyBuJ2VzdCBwYXMgc3VwcG9ydOllIgorCisjIHRvZG8KKyM6IG9wdGlvbi5jOjU4MDIKK21zZ2lkICJFNTQwOiBVbmNsb3NlZCBleHByZXNzaW9uIHNlcXVlbmNlIgorbXNnc3RyICJFNTQwOiBT6XF1ZW5jZSBkJ2V4cHJlc3Npb24gbWFsIGZlcm3pZSIKKworIzogb3B0aW9uLmM6NTgwNgorbXNnaWQgIkU1NDE6IHRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJFNTQxOiB0cm9wIGQn6WzpbWVudHMiCisKKyM6IG9wdGlvbi5jOjU4MDgKK21zZ2lkICJFNTQyOiB1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAiRTU0MjogZ3JvdXBlcyBk6XPpcXVpbGliculzIgorCisjOiBvcHRpb24uYzo2MDI5Cittc2dpZCAiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTU5MDogSWwgeSBhIGTpauAgdW5lIGZlbup0cmUgZGUgcHLpdmlzdWFsaXNhdGlvbiIKKworIzogb3B0aW9uLmM6NjI4NgorbXNnaWQgIlcxNzogQXJhYmljIHJlcXVpcmVzIFVURi04LCBkbyAnOnNldCBlbmNvZGluZz11dGYtOCciCittc2dzdHIgIlcxNzogTCdhcmFiaXF1ZSByZXF1aWVydCBsJ1VURi04LCB0YXBleiAnOnNldCBlbmNvZGluZz11dGYtOCciCisKKyM6IG9wdGlvbi5jOjY2MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAiRTU5MzogTuljZXNzaXRlIGF1IG1vaW5zICVkIGxpZ25lcyIKKworIzogb3B0aW9uLmM6NjYxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTk0OiBOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIkU1OTQ6IE7pY2Vzc2l0ZSBhdSBtb2lucyAlZCBjb2xvbm5lcyIKKworIzogb3B0aW9uLmM6NjkxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE9wdGlvbiBpbmNvbm51ZTogJXMiCisKKyM6IG9wdGlvbi5jOjcwMjYKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBDb2RlcyBkZSB0ZXJtaW5hbCAtLS0iCisKKyM6IG9wdGlvbi5jOjcwMjgKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBWYWxldXIgZGVzIG9wdGlvbnMgZ2xvYmFsZXMgLS0tIgorCisjOiBvcHRpb24uYzo3MDMwCittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBWYWxldXIgZGVzIG9wdGlvbnMgbG9jYWxlcyAtLS0iCisKKyM6IG9wdGlvbi5jOjcwMzIKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorCisjOiBvcHRpb24uYzo3NzMzCittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IEVSUkVVUiBnZXRfdmFycCIKKworIzogb3B0aW9uLmM6ODcwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiBDYXJhY3TocmUgY29ycmVzcG9uZGFudCBtYW5xdWFudCBwb3VyICVzIgorCisjOiBvcHRpb24uYzo4NzM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IENhcmFjdOhyZXMgc3VybnVt6XJhaXJlcyBhcHLocyBwb2ludC12aXJndWxlOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIm5lIHBldXQgb3V2aXIgIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogT3V2ZXJ0dXJlIGRlIGxhIGZlbup0cmUgaW1wb3NzaWJsZSAhXG4iCisKKyM6IG9zX2FtaWdhLmM6MzI5Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAiTuljZXNzaXRlIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvdSB1bHTpcmlldXJlXG4iCisKKyM6IG9zX2FtaWdhLmM6MzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgJXMgdmVyc2lvbiAlbGRcbiIKK21zZ3N0ciAiTuljZXNzaXTpICVzIHZlcnNpb24gJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJOZSBwZXV0IG91dnJpciBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDE4Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIk5lIHBldXQgY3LpZXIgIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSBzb3J0IGF2ZWMgJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJjaGFuZ2VtZW50IGR1IG1vZGUgZGUgY29uc29sZSBpbXBvc3NpYmxlID8hXG4iCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogcGFzIHVuZSBjb25zb2xlID8hXG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNDMKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogRXjpY3V0aW9uIGRlIHNoZWxsIGltcG9zc2libGUgYXZlYyBsJ29wdGlvbiAtZiIKKworIzogb3NfYW1pZ2EuYzoxMTg0IG9zX2FtaWdhLmM6MTI3NAorbXNnaWQgIkNhbm5vdCBleGVjdXRlICIKK21zZ3N0ciAiTmUgcGV1dCBleOljdXRlciAiCisKKyMgdG9kbworIzogb3NfYW1pZ2EuYzoxMTg3IG9zX2FtaWdhLmM6MTI4NAorbXNnaWQgInNoZWxsICIKK21zZ3N0ciAic2hlbGwgIgorCisjOiBvc19hbWlnYS5jOjEyMDcgb3NfYW1pZ2EuYzoxMzA5Cittc2dpZCAiIHJldHVybmVkXG4iCittc2dzdHIgIiByZXRvdXJu6VxuIgorCisjOiBvc19hbWlnYS5jOjE0NTAKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIHRyb3AgcGV0aXQuIgorCisjOiBvc19hbWlnYS5jOjE0NTQKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkVSUkVVUiBkJ0UvUyIKKworIzogb3NfbXN3aW4uYzo1MTcKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiLi4uKHRyb25xdekpIgorCisjOiBvc19tc3dpbi5jOjYxOQorbXNnaWQgIidjb2x1bW5zJyBpcyBub3QgODAsIGNhbm5vdCBleGVjdXRlIGV4dGVybmFsIGNvbW1hbmRzIgorbXNnc3RyICInY29sdW1ucycgbmUgdmF1dCBwYXMgODAsIGV46WN1dGlvbiBkZSBjb21tYW5kZXMgZXh0ZXJuZXMgaW1wb3NzaWJsZSIKKworIzogb3NfbXN3aW4uYzoxODU0Cittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBMYSBz6WxlY3Rpb24gZGUgbCdpbXByaW1hbnRlIGEg6WNob3XpIgorCisjIFRPRE8KKyM6IG9zX21zd2luLmM6MTg5NAorIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAidmVycyAlcyBzdXIgJXMiCisKKyM6IG9zX21zd2luLmM6MTkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IEZvbnRlIGQnaW1wcmltYW50ZSBpbmNvbm51ZTogJXMiCisKKyM6IG9zX21zd2luLmM6MTk1OSBvc19tc3dpbi5jOjE5NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBFcnJldXIgZCdpbXByZXNzaW9uOiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTcwCittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiSW5jb25udSIKKworIzogb3NfbXN3aW4uYzoxOTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nICclcyciCittc2dzdHIgIkltcHJlc3Npb24gZGUgJyVzJyIKKworIyB0b2RvCisjOiBvc19tc3dpbi5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDQ6IE5vbSBkZSBqZXUgZGUgY2FyYWMuIFwiJXNcIiBpbGzpZ2FsIGRhbnMgbm9tIGRlIGZvbnRlIFwiJXNcIiIKKworIzogb3NfbXN3aW4uYzozMDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6IENhcmFjdOhyZSAnJWMnIGlsbOlnYWwgZGFucyBsZSBub20gZGUgZm9udGUgXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjU4Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogT3B0aW9uICdvc2ZpbGV0eXBlJyBpbnZhbGlkZSAtIFRleHQgZXN0IHV0aWxpc+kiCisKKyM6IG9zX3VuaXguYzo4ODcKK21zZ2lkICJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIKK21zZ3N0ciAiVmltOiBTaWduYWwgZG91YmxlLCBzb3J0aWVcbiIKKworIzogb3NfdW5peC5jOjg5MworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogU2lnbmFsIG1vcnRlbCAlcyBpbnRlcmNlcHTpXG4iCisKKyM6IG9zX3VuaXguYzo4OTYKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogU2lnbmFsIG1vcnRlbCBpbnRlcmNlcHTpXG4iCisKKyM6IG9zX3VuaXguYzoxMTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJMJ291dmVydHVyZSBkZSBsJ2FmZmljaGFnZSBYIGEgcHJpcyAlbGQgbXNlYyIKKworIzogb3NfdW5peC5jOjExODYKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBSZed1IGwnZXJyZXVyIFhcbiIKKworIyBUT0RPCisjOiBvc191bml4LmM6MTI5NAorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIkxlIHRlc3QgZGUgbCdhZmZpY2hhZ2UgWCBhIOljaG916SIKKworIyBUT0RPCisjOiBvc191bml4LmM6MTQzMworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIkwnb3V2ZXJ0dXJlIGRlIGwnYWZmaWNoYWdlIFggYSBk6XBhc3PpIGxlcyBk6WxhaXMiCisKKyM6IG9zX3VuaXguYzozMTY1IG9zX3VuaXguYzozODQ1Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIsljaGVjIGRlIGwnZXjpY3V0aW9uIGR1IHNoZWxsICIKKworIyB0b2RvCisjOiBvc191bml4LmM6MzIxMworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisiyWNoZWMgZGUgbCdleOljdXRpb24gZHUgc2hlbGwgc2hcbiIKKworIzogb3NfdW5peC5jOjMyMTcgb3NfdW5peC5jOjM4NTEKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisibGUgc2hlbGwgYSByZXRvdXJu6SAiCisKKyMgVE9ETworIzogb3NfdW5peC5jOjMzNTIKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiQ3LpYXRpb24gZGUgdHV5YXV4IChwaXBlcykgaW1wb3NzaWJsZVxuIgorCisjIHRvZG8KKyM6IG9zX3VuaXguYzozMzY3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyJT6XBhcmF0aW9uIGltcG9zc2libGVcbiIKKworIzogb3NfdW5peC5jOjM4NTgKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJDb21tYW5kZSBpbnRlcnJvbXB1ZVxuIgorCisjOiBvc191bml4LmM6NDExMSBvc191bml4LmM6NDIzNiBvc191bml4LmM6NTg5NAorbXNnaWQgIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCBhIHBlcmR1IGxhIGNvbm5lY3Rpb24gSUNFIgorCisjIFRPRE8KKyM6IG9zX3VuaXguYzo1NDc4Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiTCdvdXZlcnR1cmUgZGEgbCdhZmZpY2hhZ2UgWCBhIOljaG916SIKKworIyBUT0RPCisjOiBvc191bml4LmM6NTgwMAorbXNnaWQgIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IgorbXNnc3RyICJYU01QIGfocmUgdW5lIHJlcXXqdGUgc2F1dmV6LXZvdXMiCisKKyM6IG9zX3VuaXguYzo1OTE3Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIm91dmVydHVyZSBkZSBjb25uZWN0aW9uIFhTTVAiCisKKyM6IG9zX3VuaXguYzo1OTM1Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIlhTTVA6IOljaGVjIGRlIGxhIHN1cnZlaWxsYW5jZSBkZSBjb25uZWN0aW9uIElDRSIKKworIzogb3NfdW5peC5jOjU5NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGEg6WNob3XpOiAlcyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiwCBsYSBsaWduZSIKKworIzogb3NfdzMyZXhlLmM6NjUKK21zZ2lkICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIGxpbmUuIgorbXNnc3RyICJQYXMgcHUgYWxsb3VlciBkZSBsYSBt6W1vaXJlIHBvdXIgbGEgbGlnbmUgZGUgY29tbWFuZGUuIgorCisjOiBvc193MzJleGUuYzo2NiBvc193MzJleGUuYzo4OSBvc193MzJleGUuYzoxMDAKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIkVycmV1ciBWSU0iCisKKyM6IG9zX3czMmV4ZS5jOjg5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAiTGUgY2hhcmdlbWVudCBkZSB2aW0zMi5kbGwgYSDpY2hvdekgISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJMZXMgcG9pbnRldXJzIGRlIGZvbmN0aW9uIG4nb250IHB1IOp0cmUgYWp1c3TpcyDgIGxhIERMTCAhIgorCisjOiBvc193aW4xNi5jOjM0MSBvc193aW4zMi5jOjMwNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgImxlIHNoZWxsIGEgcmV0b3VybukgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjUwNworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IMl26G5lbWVudCAlcyBpbnRlcmNlcHTpXG4iCisKKyM6IG9zX3dpbjMyLmM6MjUwOQorbXNnaWQgImNsb3NlIgorbXNnc3RyICJmZXJtZXR1cmUiCisKKyM6IG9zX3dpbjMyLmM6MjUxMQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAiZOljb25uZWN0aW9uIgorCisjOiBvc193aW4zMi5jOjI1MTIKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAiYXJy6nQiCisKKyM6IG9zX3dpbjMyLmM6MzAwMgorbXNnaWQgIkUzNzE6IENvbW1hbmQgbm90IGZvdW5kIgorbXNnc3RyICJFMzcxOiBDb21tYW5kZSBpbnRyb3V2YWJsZSIKKworIzogb3Nfd2luMzIuYzozMDE1Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSBuJ2VzdCBwYXMgZGFucyB2b3RyZSAkUEFUSC5cbiIKKyJMZXMgY29tbWFuZGVzIGV4dGVybmVzIG5lIGZlcm9udCBwYXMgZGUgcGF1c2UgdW5lIGZvaXMgdGVybWlu6WVzLlxuIgorIlZvaXIgIDpoZWxwIHdpbjMyLXZpbXJ1biAgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLiIKKworIyB0b2RvCisjOiBvc193aW4zMi5jOjMwMTgKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiQWxlcnRlIFZpbSIKKworIzogcXVpY2tmaXguYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiBUcm9wIGRlICUlJWMgZGFucyBsZSBwYXRyb24gZGUgZm9ybWF0dGFnZSIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6ICUlJWMgaW5hdHRlbmR1IGRhbnMgbGUgcGF0cm9uIGRlIGZvcm1hdHRhZ2UiCisKKyM6IHF1aWNrZml4LmM6MzI1Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IF0gbWFucXVhbnQgZGFucyBsZSBwYXRyb24gZGUgZm9ybWF0dGFnZSIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjIGluc3VwcG9ydOkgZGFucyBsZSBwYXRyb24gZGUgZm9ybWF0dGFnZSIKKworIyB0b2RvCisjOiBxdWlja2ZpeC5jOjM1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6ICUlJWMgaW52YWxpZGUgZGFucyBsZSBwculmaXhlIGR1IHBhdHJvbiBkZSBmb3JtYXR0YWdlIgorCisjIHRvZG8KKyM6IHF1aWNrZml4LmM6MzY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzc6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc3OiAlJSVjIGludmFsaWRlIGRhbnMgbGUgcGF0cm9uIGRlIGZvcm1hdHRhZ2UiCisKKyM6IHF1aWNrZml4LmM6MzkxCittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIG5lIGNvbnRpZW50IGF1Y3VuIG1vdGlmIgorCisjOiBxdWlja2ZpeC5jOjQ5NworbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IE5vbSBkZSBy6XBlcnRvaXJlIHZpZGUgb3UgYWJzZW50IgorCisjOiBxdWlja2ZpeC5jOjk4NAorbXNnaWQgIkU1NTM6IE5vIG1vcmUgaXRlbXMiCittc2dzdHIgIkU1NTM6IFBsdXMgZCfpbOltZW50cyIKKworIzogcXVpY2tmaXguYzoxMjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCBkZSAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIyMworbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiIChsaWduZSBlZmZhY+llKSIKKworIzogcXVpY2tmaXguYzoxNDMzCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBFbiBiYXMgZGUgbGEgcGlsZSBxdWlja2ZpeCIKKworIyB0b2RvCisjOiBxdWlja2ZpeC5jOjE0NDIKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IEF1IHNvbW1ldCBkZSBsYSBwaWxlIHF1aWNrZml4IgorCisjOiBxdWlja2ZpeC5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJsaXN0ZSBkJ2VycmV1cnMgJWQgc3VyICVkOyAlZCBlcnJldXJzIgorCisjOiBxdWlja2ZpeC5jOjE5MjgKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiDJY3JpdHVyZSBpbXBvc3NpYmxlLCBvcHRpb24gJ2J1ZnR5cGUnIGFjdGl26WUiCisKKyMgdG9kbworIzogcmVnZXhwLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjk6IGludmFsaWQgaXRlbSBpbiAlcyUlW10iCittc2dzdHIgIkUzNjk6IOls6W1lbnQgaW52YWxpZGUgZGFucyAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjgyNworbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IE1vdGlmIHRyb3AgbG9uZyIKKworIzogcmVnZXhwLmM6OTk2Cittc2dpZCAiRTUwOiBUb28gbWFueSBcXHooIgorbXNnc3RyICJFNTA6IFRyb3AgZGUgXFx6KCIKKworIzogcmVnZXhwLmM6MTAwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiBUcm9wIGRlICVzKCIKKworIzogcmVnZXhwLmM6MTA2NAorbXNnaWQgIkU1MjogVW5tYXRjaGVkIFxceigiCittc2dzdHIgIkU1MjogUGFzIGRlIGNvcnJlc3BvbmRhbmNlIHBvdXIgXFx6KCIKKworIzogcmVnZXhwLmM6MTA2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiBQYXMgZGUgY29ycmVzcG9uZGFuY2UgcG91ciAlcyUlKCIKKworIzogcmVnZXhwLmM6MTA3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTQ6IFVubWF0Y2hlZCAlcygiCittc2dzdHIgIkU1NDogUGFzIGRlIGNvcnJlc3BvbmRhbmNlIHBvdXIgJXMoIgorCisjOiByZWdleHAuYzoxMDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTogVW5tYXRjaGVkICVzKSIKK21zZ3N0ciAiRTU1OiBQYXMgZGUgY29ycmVzcG9uZGFuY2UgcG91ciAlcykiCisKKyMgVE9ETworIzogcmVnZXhwLmM6MTI0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY6ICVzKiBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTY6IEwnb3DpcmFuZGUgJXMqIHBvdXJyYWl0IOp0cmUgdmlkZSIKKworIyBUT0RPCisjOiByZWdleHAuYzoxMjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzogJXMrIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NzogTCdvcOlyYW5kZSAlcyogcG91cnJhaXQg6nRyZSB2aWRlIgorCisjOiByZWdleHAuYzoxMzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IGNhcmFjdOhyZSBpbnZhbGlkZSBhcHLocyAlc0AiCisKKyMgVE9ETworIzogcmVnZXhwLmM6MTMyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTg6ICVzeyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTg6IEwnb3DpcmFuZGUgJXN7IHBvdXJyYWl0IOp0cmUgdmlkZSIKKworIyB0b2RvCisjOiByZWdleHAuYzoxMzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiBUcm9wIGRlICVzey4uLn1zIGNvbXBsZXhlcyIKKworIzogcmVnZXhwLmM6MTM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogJXMqIGltYnJpcXXpIgorCisjOiByZWdleHAuYzoxMzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogJXMlYyBpbWJyaXF16SIKKworIzogcmVnZXhwLmM6MTQ3MworbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IHV0aWxpc2F0aW9uIGludmFsaWRlIGRlIFxcXyIKKworIzogcmVnZXhwLmM6MTUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6ICVzJWMgbmUgc3VpdCByaWVuIgorCisjIHRvZG8KKyM6IHJlZ2V4cC5jOjE1NzQKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogUul0cm9y6WbpcmVuY2UgaWxs6WdhbGUiCisKKyM6IHJlZ2V4cC5jOjE1ODcKK21zZ2lkICJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY2OiBcXHooIG4nZXN0IHBhcyBhdXRvcmlz6SBpY2kiCisKKyM6IHJlZ2V4cC5jOjE2MDYKK21zZ2lkICJFNjc6IFxcejEgZXQgYWwuIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NzogXFx6MSBldCBjby4gbmUgc29udCBwYXMgYXV0b3Jpc+lzIGljaSIKKworIzogcmVnZXhwLmM6MTYxNworbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IENhcmFjdOhyZSBpbnZhbGlkZSBhcHLocyBcXHoiCisKKyM6IHJlZ2V4cC5jOjE2NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY5OiBNaXNzaW5nIF0gYWZ0ZXIgJXMlJVsiCittc2dzdHIgIkU2OTogSWwgbWFucXVlIF0gYXBy6HMgJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE2ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogJXMlJVtdIHZpZGUiCisKKyM6IHJlZ2V4cC5jOjE3NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6IENhcmFjdOhyZSBpbnZhbGlkZSBhcHLocyAlcyUlIgorCisjOiByZWdleHAuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiBFcnJldXIgZGUgc3ludGF4ZSBkYW5zICVzey4uLn0iCisKKyM6IHJlZ2V4cC5jOjI4MDAKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTogUGxhbnRhZ2UgaW50ZXJjZXB06TsgZXhwLnLpZy4gdHJvcCBjb21wbGV4ZSA/IgorCisjOiByZWdleHAuYzoyOTQxCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiB1biBtb3RpZiBhIGZhaXQgZOlib3JkZXIgbGEgcGlsZSIKKworIzogcmVnZXhwLmM6MzE4MAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlNvdXMtY29ycmVzcG9uZGFuY2VzIGV4dGVybmVzOlxuIgorCisjOiBzY3JlZW4uYzoyMTEzCisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0tJTNsZCBsaWduZXMgcGxp6WVzICIKKworIzogc2NyZWVuLmM6Nzg4NAorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiIFJFTVBMQUNFTUVOVC1WIgorCisjOiBzY3JlZW4uYzo3ODg4Cittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiBSRU1QTEFDRU1FTlQiCisKKyMgVE9ETworIzogc2NyZWVuLmM6Nzg5MworbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgUkVWRVJTRSIKKworIzogc2NyZWVuLmM6Nzg5NQorbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiBJTlNFUlRJT04iCisKKyM6IHNjcmVlbi5jOjc4OTgKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAoaW5zZXJ0aW9uKSIKKworIzogc2NyZWVuLmM6NzkwMAorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAocmVtcGxhY2VtZW50KSIKKworIzogc2NyZWVuLmM6NzkwMgorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKHJlbXBsYWNlbWVudC12KSIKKworIzogc2NyZWVuLmM6NzkwNQorbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBo6WJyZXUiCisKKyM6IHNjcmVlbi5jOjc5MTYKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIgYXJhYmlxdWUiCisKKyM6IHNjcmVlbi5jOjc5MTkKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKGxhbmd1ZSkiCisKKyM6IHNjcmVlbi5jOjc5MjMKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiIChjb2xsYWdlKSIKKworIzogc2NyZWVuLmM6NzkyOQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBTRUxFQ1RJT04iCisKKyM6IHNjcmVlbi5jOjc5MzEKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIgVklTVUVMIgorCisjOiBzY3JlZW4uYzo3OTMzCittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIgQkxPQyIKKworIzogc2NyZWVuLmM6NzkzNQorbXNnaWQgIiBMSU5FIgorbXNnc3RyICIgTElHTkUiCisKKyM6IHNjcmVlbi5jOjc5NDggc2NyZWVuLmM6ODAwOAorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAiZW5yZWdpc3RyZW1lbnQiCisKKyM6IHNlYXJjaC5jOjM2Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJMYSByZWNoZXJjaGUgYSBhdHRlaW50IGxlIEhBVVQsIGV0IGNvbnRpbnVlIGVuIEJBUyIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgIkxhIHJlY2hlcmNoZSBhIGF0dGVpbnQgbGUgQkFTLCBldCBjb250aW51ZSBlbiBIQVVUIgorCisjOiBzZWFyY2guYzo1MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogVGV4dGUgZGUgcmVjaGVyY2hlIGludmFsaWRlOiAlcyIKKworIzogc2VhcmNoLmM6ODUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDogbGEgcmVjaGVyY2hlIGEgYXR0ZWludCBsZSBIQVVUIHNhbnMgdHJvdXZlcjogJXMiCisKKyM6IHNlYXJjaC5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IGxhIHJlY2hlcmNoZSBhIGF0dGVpbnQgbGUgQkFTIHNhbnMgdHJvdXZlcjogJXMiCisKKyM6IHNlYXJjaC5jOjEyNDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6ICc/JyBvdSAnLycgYXR0ZW5kdSBhcHLocyAnOyciCisKKyM6IHNlYXJjaC5jOjM2ODUKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiIChpbmNsdXQgZGVzIGNvcnJlc3BvbmRhbmNlcyBsaXN06WVzIHBy6WPpZGVtbWVudCkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6MzcwNQorbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBGaWNoaWVycyBpbmNsdXMgIgorCisjOiBzZWFyY2guYzozNzA3Cittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAiaW50cm91dmFibGUgIgorCisjOiBzZWFyY2guYzozNzA4Cittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiZGFucyBsZSBjaGVtaW4gLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM3NDcKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKETpauAgbGlzdOkpIgorCisjOiBzZWFyY2guYzozNzQ5Cittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAgSU5UUk9VVkFCTEUiCisKKyM6IHNlYXJjaC5jOjM4MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIkV4YW1lbiBkZXMgZmljaGllcnMgaW5jbHVzOiAlcyIKKworIzogc2VhcmNoLmM6NDAxOQorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogTGEgY29ycmVzcG9uZGFuY2UgZXN0IHN1ciBsYSBsaWduZSBjb3VyYW50ZSIKKworIzogc2VhcmNoLmM6NDE2MgorbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICJUb3VzIGxlcyBmaWNoaWVycyBpbmNsdXMgb250IOl06SB0cm91dulzIgorCisjIHRvZG8KKyM6IHNlYXJjaC5jOjQxNjQKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiUGFzIGRlIGZpY2hpZXJzIGluY2x1cyIKKworIzogc2VhcmNoLmM6NDE4MAorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogROlmaW5pdGlvbiBpbnRyb3V2YWJsZSIKKworIzogc2VhcmNoLmM6NDE4MgorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTW90aWYgaW50cm91dmFibGUiCisKKyM6IHN5bnRheC5jOjMwMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IEFyZ3VtZW50IGlsbOlnYWw6ICVzIgorCisjOiBzeW50YXguYzozMTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiBQYXMgZGUgdGVsIHN1cmdyb3VwZSBzeW50YWN0aXF1ZTogJXMiCisKKyM6IHN5bnRheC5jOjMzNTkKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIlBhcyBkJ+ls6W1lbnRzIHN5bnRhY3RpcXVlcyBk6WZpbmlzIHBvdXIgY2UgdGFtcG9uIgorCisjOiBzeW50YXguYzozMzY3Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzeW5jaHJvIHN1ciBsZXMgY29tbWVudGFpcmUgc3R5bGUgQyIKKworIzogc3ludGF4LmM6MzM3NQorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgInBhcyBkZSBzeW5jaHJvIgorCisjOiBzeW50YXguYzozMzc4Cittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJsYSBzeW5jaHJvIGNvbW1lbmNlICIKKworIzogc3ludGF4LmM6MzM4MCBzeW50YXguYzozNDU1Cittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiIGxpZ25lcyBhdmFudCBsYSBsaWduZSBkdSBoYXV0IgorCisjIHRvZG8KKyM6IHN5bnRheC5jOjMzODUKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDJbOltZW50cyBkZSBzeW5jaHJvIHN5bnRhY3RpcXVlIC0tLSIKKworIyB0b2RvCisjOiBzeW50YXguYzozMzkwCittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyJzeW5jaHJvbmlzYXRpb24gc3VyIOls6W1lbnRzIgorCisjOiBzeW50YXguYzozMzk2Cittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIMls6W1lbnRzIGRlIHN5bnRheGUgLS0tIgorCisjOiBzeW50YXguYzozNDE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiBQYXMgZGUgdGVsIHN1cmdyb3VwZSBkZSBzeW50YXhlOiAlcyIKKworIzogc3ludGF4LmM6MzQ0NQorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICJtaW5pbWFsICIKKworIzogc3ludGF4LmM6MzQ1MgorbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICJtYXhpbWFsICIKKworIyB0b2RvCisjOiBzeW50YXguYzozNDY0Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgY29ycmVzcG9uZGFuY2UiCisKKyM6IHN5bnRheC5jOjM0NjYKK21zZ2lkICIgbGluZSBicmVha3MiCittc2dzdHIgIiBmaW5zIGRlIGxpZ25lIgorCisjIHRvZG8KKyM6IHN5bnRheC5jOjQxMDAKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTQ6IGdyb3VwW3RdaGVyZSBwYXMgYWNjZXB06SBpY2kiCisKKyMgdG9kbworIzogc3ludGF4LmM6NDEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IFBhcyB0cm91dukgZCdvYmpldCByZWdpb24gcG91ciAlcyIKKworIzogc3ludGF4LmM6NDE1MgorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBMJ2FyZ3VtZW50IGNvbnRhaW5zIG4nZXN0IHBhcyBhY2NlcHTpIGljaSIKKworIzogc3ludGF4LmM6NDE2MworbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiBMJ2FyZ3VtZW50IGNvbnRhaW5lZGluIG4nZXN0IHBhcyBhY2NlcHTpIGljaSIKKworIzogc3ludGF4LmM6NDI0MQorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiBOb20gZGUgZmljaGllciByZXF1aXMiCisKKyM6IHN5bnRheC5jOjQ1NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiAnPScgbWFucXVhbnQ6ICVzIgorCisjOiBzeW50YXguYzo0NzM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBQYXMgYXNzZXogZCdhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCisKKyMgVE9ETworIzogc3ludGF4LmM6NTA2OAorbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBBdWN1biBzdXJncm91cGUgc3DpY2lmaekiCisKKyM6IHN5bnRheC5jOjUxMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogROlsaW1pdGV1ciBkZSBtb3RpZiBpbnRyb3V2YWJsZTogJXMiCisKKyMgdG9kbworIzogc3ludGF4LmM6NTE4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiBE6XRyaXR1cyBhcHLocyBsZSBtb3RpZjogJXMiCisKKyMgdG9kbworIzogc3ludGF4LmM6NTI3MAorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bmNocm8gc3ludGF4OiBtb3RpZiBkZSBjb250aW51YXRpb24gZGUgbGlnbmUgcHLpc2VudCBkZXV4IGZvaXMiCisKKyM6IHN5bnRheC5jOjUzMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBBcmd1bWVudHMgaWxs6WdhdXg6ICVzIgorCisjOiBzeW50YXguYzo1Mzc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IFNpZ25lIOlnYWwgbWFucXVhbnQ6ICVzIgorCisjOiBzeW50YXguYzo1MzgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogQXJndW1lbnQgdmlkZTogJXMiCisKKyM6IHN5bnRheC5jOjU0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMgbidlc3QgcGFzIHBlcm1pcyBpY2kiCisKKyM6IHN5bnRheC5jOjU0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyBkb2l0IOp0cmUgbGUgcHJlbWllciDpbOltZW50IGQndW5lIGxpc3RlIGNvbnRhaW5zIgorCisjOiBzeW50YXguYzo1NDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IE5vbSBkZSBncm91cGUgaW5jb25udTogJXMiCisKKyM6IHN5bnRheC5jOjU3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiBTb3VzLWNvbW1hbmRlIGRlIDpzeW50YXggaW52YWxpZGU6ICVzIgorCisjOiBzeW50YXguYzo2MDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiBncm91cGUgZGUgc3VybGlnbmFnZSBpbnRyb3V2YWJsZTogJXMiCisKKyM6IHN5bnRheC5jOjYxMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IFBhcyBhc3NleiBkJ2FyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IFRyb3AgZCdhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyMgVE9ETworIzogc3ludGF4LmM6NjE1MAorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDogbGUgZ3JvdXBlIGEgZGVzIHLpZ2xhZ2VzLCBsaWVuIGRlIHN1cmxpZ25hZ2UgaWdub3LpIgorCisjOiBzeW50YXguYzo2Mjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IHNpZ25lIOlnYWwgaW5hdHRlbmR1OiAlcyIKKworIzogc3ludGF4LmM6NjMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiBzaWduZSDpZ2FsIG1hbnF1YW50OiAlcyIKKworIzogc3ludGF4LmM6NjMzNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogYXJndW1lbnQgbWFucXVhbnQ6ICVzIgorCisjOiBzeW50YXguYzo2Mzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTg6IElsbGVnYWwgdmFsdWU6ICVzIgorbXNnc3RyICJFNDE4OiBWYWxldXIgaWxs6WdhbGU6ICVzIgorCisjOiBzeW50YXguYzo2NDkzCittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogQ291bGV1ciBkZSBwcmVtaWVyIHBsYW4gaW5jb25udWUiCisKKyM6IHN5bnRheC5jOjY1MDQKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiBDb3VsZXVyIGQnYXJyaehyZS1wbGFuIGluY29ubnVlIgorCisjOiBzeW50YXguYzo2NTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogTm9tIG91IG51belybyBkZSBjb3VsZXVyIG5vbiByZWNvbm51OiAlcyIKKworIzogc3ludGF4LmM6Njc3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogbGUgY29kZSBkZSB0ZXJtaW5hbCBlc3QgdHJvcCBsb25nOiAlcyIKKworIzogc3ludGF4LmM6NjgxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogQXJndW1lbnQgaWxs6WdhbDogJXMiCisKKyM6IHN5bnRheC5jOjczNDcKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBUcm9wIGQnYXR0cmlidXRzIGRlIHN1cmxpZ25hZ2UgZGlmZulyZW50cyBlbiBjb3VycyBkJ3V0aWxpc2F0aW9uIgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6IEVuIGJhcyBkZSBsYSBwaWxlIGQn6XRpcXVldHRlcyIKKworIzogdGFnLmM6OTEKK21zZ2lkICJFNTU2OiBhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU2OiBBdSBzb21tZXQgZGUgbGEgcGlsZSBkJ+l0aXF1ZXR0ZXMiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiBOZSBwZXV0IGFsbGVyIGF2YW50IGxhIHByZW1p6HJlIOl0aXF1ZXR0ZSBjb3JyZXNwb25kYW50ZSIKKworIzogdGFnLmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDI2OiDJdGlxdWV0dGUgaW50cm91dmFibGU6ICVzIgorCisjOiB0YWcuYzo1NDUKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMgcHJpIHR5cGUg6XRpcXVldHRlIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgImZpY2hpZXJcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiRW50cmV6IGxlIG5vIGNob2lzaSAoPENSPiBwb3VyIGFubnVsZXIpOiAiCisKKyM6IHRhZy5jOjc0NgorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogSWwgbid5IGEgcXUndW5lIOl0aXF1ZXR0ZSBjb3JyZXNwb25kYW50ZSIKKworIzogdGFnLmM6NzQ4Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogTmUgcGV1dCBhbGxlciBhdSBkZWzgIGRlIGxhIGRlcm5p6HJlIOl0aXF1ZXR0ZSBjb3JyZXNwb25kYW50ZSIKKworIzogdGFnLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJMZSBmaWNoaWVyIFwiJXNcIiBuJ2V4aXN0ZSBwYXMiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4MQorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAi6XRpcXVldHRlICVkIGRlICVkJXMiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgb3UgcGx1cyIKKworIzogdGFnLmM6Nzg2Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAgVXRpbGlzYXRpb24gZCd1bmUg6XRpcXVldHRlIGRhbnMgdW5lIGNhc3NlIGRpZmbpcmVudGUgISIKKworIzogdGFnLmM6ODMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBMZSBmaWNoaWVyIFwiJXNcIiBuJ2V4aXN0ZSBwYXMiCisKKyMgdG9kbworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTkKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIFZFUlMg6XRpcXVldHRlIERFIGxpZ25lICAgZGFucyBmaWNoaWVyL3RleHRlIgorCisjOiB0YWcuYzoxMjAwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIkV4YW1lbiBkdSBmaWNoaWVyIGQn6XRpcXVldHRlcyAlcyIKKworIzogdGFnLmM6MTM4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogQ2hlbWluIGRlIGZpY2hpZXJzIGQn6XRpcXVldHRlcyB0cm9ucXXpIHBvdXIgJXNcbiIKKworIzogdGFnLmM6MTkxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogRXJyZXVyIGRlIGZvcm1hdCBkYW5zIGxlIGZpY2hpZXIgZCfpdGlxdWV0dGVzIFwiJXNcIiIKKworIzogdGFnLmM6MTkxOAorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIkF2YW50IGwnb2N0ZXQgJWxkIgorCisjOiB0YWcuYzoxOTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogTGUgZmljaGllciBkJ+l0aXF1ZXR0ZXMgbidlc3QgcGFzIGNsYXNz6TogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTc5Cittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiBQYXIgZGUgZmljaGllciBkJ+l0aXF1ZXR0ZXMiCisKKyMgdG9kbworIzogdGFnLmM6MjY2NgorbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IExlIG1vdGlmIGRlIGwn6XRpcXVldHRlIGVzdCBpbnRyb3V2YWJsZSIKKworIzogdGFnLmM6MjY3NworbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTogyXRpcXVldHRlIGludHJvdXZhYmxlLCBvbiBzZSBjb250ZW50ZSBkZSBkZXZpbmVyICEiCisKKyM6IHRlcm0uYzoxNzQ1Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIGluY29ubnUuIExlcyB0ZXJtaW5hdXggaW50ZXJuZXMgc29udDoiCisKKyMgdG9kbworIzogdGVybS5jOjE3NjkKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgInV0aWxpc2F0aW9uIHBhciBk6WZhdXQgZGUgJyIKKworIzogdGVybS5jOjIxMjcKK21zZ2lkICJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkU1NTc6IExlIGZpY2hpZXIgdGVybWNhcCBuZSBwZXV0IOp0cmUgb3V2ZXJ0IgorCisjOiB0ZXJtLmM6MjEzMQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogTGEgZGVzY3JpcHRpb24gZHUgdGVybWluYWwgbidhIHBhcyDpdOkgdHJvdXbpZSBkYW5zIHRlcm1pbmZvIgorCisjOiB0ZXJtLmM6MjEzMworbXNnaWQgIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTU5OiBMYSBkZXNjcmlwdGlvbiBkdSB0ZXJtaW5hbCBuJ2EgcGFzIOl06SB0cm91dullIGRhbnMgdGVybWNhcCIKKworIyB0b2RvCisjOiB0ZXJtLmM6MjI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogUGFzIGQnZW50cullIFwiJXNcIiBkYW5zIHRlcm1jYXAiCisKKyMgdG9kbworIzogdGVybS5jOjI3NjYKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzogY2FwYWNpdOkgZGUgdGVybWluYWwgXCJjbVwiIHJlcXVpc2UiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5NzAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRvdWNoZXMgZHUgdGVybWluYWwgLS0tIgorCisjIHRvZG8KKyM6IHVpLmM6MjUyCittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAibm91dmVhdSBzaGVsbCBk6W1hcnLpXG4iCisKKyMgdG9kbworIzogdWkuYzoxNzg0Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogRXJyZXVyIGVuIGxpc2FudCBsJ2VudHLpZSwgc29ydGllLi4uXG4iCisKKyMgdG9kbworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozOTQKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIkFubnVsYXRpb24gaW1wb3NzaWJsZTsgb24gY29udGludWUgcXVhbmQgbeptZSIKKworIzogdW5kby5jOjU0OQorbXNnaWQgIkU0Mzg6IHVfdW5kbzogbGluZSBudW1iZXJzIHdyb25nIgorbXNnc3RyICJFNDM4OiB1X3VuZG86IG51belyb3MgZGUgbGlnbmUgZXJyb27pcyIKKworIzogdW5kby5jOjcxOAorbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICIxIGNoYW5nZW1lbnQiCisKKyM6IHVuZG8uYzo3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIiVsZCBjaGFuZ2VtZW50cyIKKworIzogdW5kby5jOjc2NAorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiBsYSBsaXN0ZSBkJ2FubnVsYXRpb24gZXN0IGNvcnJvbXB1ZSIKKworIyB0b2RvCisjOiB1bmRvLmM6Nzk2Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IGxpZ25lIGQnYW5udWxhdGlvbiBtYW5xdWFudGUiCisKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzo3MjQKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIGdyYXBoaXF1ZSBNUy1XaW5kb3dzIDE2LzMyIGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MjYKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIGdyYXBoaXF1ZSBNUy1XaW5kb3dzIDMyIGJpdHMiCisKKyM6IHZlcnNpb24uYzo3MjkKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiBsYW5j6WUgZW4gbW9kZSBXaW4zMnMiCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIHN1cHBvcnRhbnQgbCdPTEUiCisKKyM6IHZlcnNpb24uYzo3MzQKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBjb25zb2xlIE1TLVdpbmRvd3MgMzIgYml0cyIKKworIzogdmVyc2lvbi5jOjczOAorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBNUy1XaW5kb3dzIDE2IGJpdHMiCisKKyM6IHZlcnNpb24uYzo3NDIKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBNUy1ET1MgMzIgYml0cyIKKworIzogdmVyc2lvbi5jOjc0NAorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIE1TLURPUyAxNiBiaXRzIgorCisjOiB2ZXJzaW9uLmM6NzUwCittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIE1heE9TIFggKHVuaXgpIgorCisjOiB2ZXJzaW9uLmM6NzUyCittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNpb24gTWFjT1MgWCIKKworIzogdmVyc2lvbi5jOjc1NQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBNYWNPUyIKKworIzogdmVyc2lvbi5jOjc2MAorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIFJJU0MgT1MiCisKKyMgdG9kbworIzogdmVyc2lvbi5jOjc3MAorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJQYXRjaGVzIGluY2x1czogIgorCisjOiB2ZXJzaW9uLmM6Nzk2IHZlcnNpb24uYzoxMTQ1Cittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJNb2RpZmnpIHBhciAiCisKKyM6IHZlcnNpb24uYzo4MDMKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiQ29tcGls6SAiCisKKyM6IHZlcnNpb24uYzo4MDYKK21zZ2lkICJieSAiCittc2dzdHIgInBhciAiCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIslub3JtZSB2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjgyMQorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJHcm9zc2UgdmVyc2lvbiAiCisKKyM6IHZlcnNpb24uYzo4MjQKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBub3JtYWxlICIKKworIzogdmVyc2lvbi5jOjgyNworbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlBldGl0ZSB2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbiBtaW51c2N1bGUgIgorCisjOiB2ZXJzaW9uLmM6ODM1Cittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJzYW5zIGludGVyZmFjZSBncmFwaGlxdWUuIgorCisjOiB2ZXJzaW9uLmM6ODQwCittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgImF2ZWMgaW50ZXJmYWNlIEdUSzItR05PTUUuIgorCisjOiB2ZXJzaW9uLmM6ODQyCittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAiYXZlYyBpbnRlcmZhY2UgR1RLLUdOT01FLiIKKworIzogdmVyc2lvbi5jOjg0NgorbXNnaWQgIndpdGggR1RLMiBHVUkuIgorbXNnc3RyICJhdmVjIGludGVyZmFjZSBHVEsyLiIKKworIzogdmVyc2lvbi5jOjg0OAorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgImF2ZWMgaW50ZXJmYWNlIEdUSy4iCisKKyM6IHZlcnNpb24uYzo4NTMKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICJhdmVjIGludGVyZmFjZSBYMTEtTW90aWYuIgorCisjOiB2ZXJzaW9uLmM6ODU3Cittc2dpZCAid2l0aCBYMTEtbmVYdGF3IEdVSS4iCittc2dzdHIgImF2ZWMgaW50ZXJmYWNlIFgxMS1uZVh0YXcuIgorCisjOiB2ZXJzaW9uLmM6ODU5Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgImF2ZWMgaW50ZXJmYWNlIFgxMS1BdGhlbmEuIgorCisjOiB2ZXJzaW9uLmM6ODYzCittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgImF2ZWMgaW50ZXJmYWNlIEJlT1MuIgorCisjOiB2ZXJzaW9uLmM6ODY2Cittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAiYXZlYyBpbnRlcmZhY2UgUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjg2OQorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAiYXZlYyB1bmUgaW50ZXJmYWNlIGdyYXBoaXF1ZS4iCisKKyM6IHZlcnNpb24uYzo4NzIKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJhdmVjIGludGVyZmFjZSBDYXJib24uIgorCisjOiB2ZXJzaW9uLmM6ODc1Cittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJhdmVjIGludGVyZmFjZSBDb2NvYS4iCisKKyM6IHZlcnNpb24uYzo4NzgKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICJhdmVjIGludGVyZmFjZSAoY2xhc3NpcXVlKS4iCisKKyM6IHZlcnNpb24uYzo4ODkKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIgIEZvbmN0aW9ubmFsaXTpcyBpbmNsdXNlcyAoKykgb3Ugbm9uICgtKTpcbiIKKworIzogdmVyc2lvbi5jOjkwMQorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgZmljaGllciB2aW1yYyBzeXN06G1lOiBcIiIKKworIzogdmVyc2lvbi5jOjkwNgorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICBmaWNoaWVyIHZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjkxMQorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDJtZSBmaWNoaWVyIHZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjkxNgorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDNtZSBmaWNoaWVyIHZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjkyMQorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgZmljaGllciBleHJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjkyNgorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAybWUgZmljaGllciBleHJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjkzMgorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICBmaWNoaWVyIGd2aW1yYyBzeXN06G1lOiBcIiIKKworIzogdmVyc2lvbi5jOjkzNgorbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIGZpY2hpZXIgZ3ZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MAorbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiMm1lIGZpY2hpZXIgZ3ZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjk0NQorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiM21lIGZpY2hpZXIgZ3ZpbXJjIHV0aWxpc2F0ZXVyOiBcIiIKKworIzogdmVyc2lvbi5jOjk1MgorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgIGZpY2hpZXIgbWVudSBzeXN06G1lOiBcIiIKKworIzogdmVyc2lvbi5jOjk2MAorbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAgICAgJFZJTSBwYXIgZOlmYXV0OiBcIiIKKworIzogdmVyc2lvbi5jOjk2NgorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICAgICAgICAkVklNUlVOVElNRSBwYXIgZOlmYXV0OiBcIiIKKworIzogdmVyc2lvbi5jOjk3MAorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIkNvbXBpbGF0aW9uOiAiCisKKyM6IHZlcnNpb24uYzo5NzYKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICJDb21waWxhdGV1cjogIgorCisjOiB2ZXJzaW9uLmM6OTgxCittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICLJZGl0aW9uIGRlIGxpZW5zOiAiCisKKyM6IHZlcnNpb24uYzo5ODYKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIFZFUlNJT04gREUgRMlCT0dBR0UiCisKKyM6IHZlcnNpb24uYzoxMDI0Cittc2dpZCAiVklNIC0gVmkgSU1wcm92ZWQiCittc2dzdHIgIlZJTSAtIFZpIEFt6Wxpb3LpIgorCisjOiB2ZXJzaW9uLmM6MTAyNgorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJ2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjEwMjcKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgInBhciBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyMgdG9kbworIzogdmVyc2lvbi5jOjEwMzEKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0gZXN0IHVuIGxvZ2ljaWVsIGxpYnJlIgorCisjOiB2ZXJzaW9uLmM6MTAzMworbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICJBaWRleiBkZSBwYXV2cmVzIGVuZmFudHMgZW4gT3VnYW5kYSAhIgorCisjOiB2ZXJzaW9uLmM6MTAzNAorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgInRhcGV6ICA6aGVscCBpY2NmPEVudHLpZT4gIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucyIKKworIzogdmVyc2lvbi5jOjEwMzYKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJ0YXBleiAgOnE8RW50cullPiAgICAgICAgICAgICAgIHBvdXIgc29ydGlyIGR1IHByb2dyYW1tZSAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDM3Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAidGFwZXogIDpoZWxwPEVudHLpZT4gIG91ICA8RjE+ICBwb3VyIGFjY+lkZXIg4CBsJ2FpZGUgZW4gbGlnbmUgICAgIgorCisjOiB2ZXJzaW9uLmM6MTAzOAorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgInRhcGV6ICA6aGVscCB2ZXJzaW9uNjxFbnRy6WU+ICAgcG91ciBsaXJlIGxlcyBub3RlcyBkZSBtaXNlIOAgam91ciIKKworIzogdmVyc2lvbi5jOjEwNDEKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiQ29tcGF0aWJpbGl06SBWaSBhY3RpdullIgorCisjOiB2ZXJzaW9uLmM6MTA0MgorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgInRhcGV6ICA6c2V0IG5vY3A8RW50cullPiAgICAgICAgcG91ciBk6WYuIGRlIFZpbSIKKworIzogdmVyc2lvbi5jOjEwNDMKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ0YXBleiAgOmhlbHAgY3AtZGVmYXVsdDxFbnRy6WU+IHBvdXIgcGx1cyBkJ2luZm8iCisKKyM6IHZlcnNpb24uYzoxMDU4Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAibWVudSAgQWlkZS0+T3JwaGVsaW5zICAgICAgICAgICBwb3VyIHBsdXMgZCdpbmZvIgorCisjOiB2ZXJzaW9uLmM6MTA2MAorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIkxlcyBtb2RlcyBzb250IGTpc2FjdGl26XMsIHRvdXQgdGV4dGUgZXN0IGluc+ly6SIKKworIyBUT0RPCisjOiB2ZXJzaW9uLmM6MTA2MQorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIm1lbnUgIEVkaXRpb24tPlLpZ2xhZ2VzIEdsb2JhdXgtPkluc2VydGlvbiBQZXJtLiAiCisKKyM6IHZlcnNpb24uYzoxMDYyCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3VyIGxlcyBtb2RlcyAgICIKKworIyBUT0RPCisjOiB2ZXJzaW9uLmM6MTA2NgorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIm1lbnUgIMlkaXRpb24tPlLpZ2xhZ2VzIEdsb2JhdXgtPkNvbXBhdGliaWxpdOkgVmkiCisKKyM6IHZlcnNpb24uYzoxMDY3Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3VyIGTpZi4gZGUgVmltICIKKworIzogdmVyc2lvbi5jOjExMTMKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICJBTEVSVEU6IFdpbmRvd3MgOTUvOTgvTUUgZOl0ZWN06SIKKworIzogdmVyc2lvbi5jOjExMTYKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ0YXBleiAgOmhlbHAgd2luZG93czk1PEVudHLpZT4gIHBvdXIgcGx1cyBkJ2luZm9ybWF0aW9uIgorCisjOiB3aW5kb3cuYzoyMDQKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogSWwgbid5IGEgcGFzIGRlIGZlbup0cmUgZGUgcHLpdmlzdWFsaXNhdGlvbiIKKworIzogd2luZG93LmM6NTgyCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogTmUgcGV1dCBz6XBhcmVyIGhhdXRnYXVjaGUgZXQgYmFzZHJvaXRlIGVuIG3qbWUgdGVtcHMiCisKKyMgdG9kbworIzogd2luZG93LmM6MTM0MQorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogUm90YXRpb24gaW1wb3NzaWJsZSBxdWFuZCBkZXMgZmVu6nRyZXMgc29udCBz6XBhcullcyIKKworIzogd2luZG93LmM6MTgzMgorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogRmVybWV0dXJlIGRlIGxhIGRlcm5p6HJlIGZlbup0cmUgaW1wb3NzaWJsZSIKKworIzogd2luZG93LmM6MjU2MworbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJJbCBuJ3kgYSBk6WrgIHBsdXMgcXUndW5lIGZlbup0cmUiCisKKyMgVE9ETworIzogd2luZG93LmM6MjYxMAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiBMJ2F1dHJlIGZlbup0cmUgbidhIHBhcyDpdOkgZW5yZWdpc3Ry6WUiCisKKyM6IHdpbmRvdy5jOjQ0NTYKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiBQYXMgZGUgbm9tIGRlIGZpY2hpZXIgc291cyBsZSBjdXJzZXVyIgorCisjIHRvZG8KKyM6IHdpbmRvdy5jOjQ1NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiBMZSBmaWNoaWVyIFwiJXNcIiBuJ2VzdCBwYXMgZGFucyBsZSBjaGVtaW4iCisKKyM6IGdsb2JhbHMuaDoxMjA4IGlmX3BlcmwueHM6MzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IExlIGNoYXJnZW1lbnQgZGUgbGEgYmlibGlvdGjocXVlICVzIgorCisjOiBpZl9wZXJsLnhzOjU5MQorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkTpc29s6SwgY29tbWFuZGUgZOlzYWN0aXbpZTogbGEgYmlibGlvdGjocXVlIFBlcmwgbidhIHB1IOp0cmUgY2hhcmfpZS4iCisKKyM6IGlmX3BlcmwueHM6NjM3Cittc2dpZCAiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIgorbXNnc3RyICJFMjk5OiDJdmFsdWF0aW9uIFBlcmwgaW50ZXJkaXRlIGRhbnMgYmFjIOAgc2FibGUgc2FucyBtb2R1bGUgU2FmZSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODMKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIslkaXRlIGRhbnMgJnBsdXNpZXVycyBWaW1zIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiyWRpdGUgZGFucyB1biBzZXVsICZWaW0iCisKKyMgdG9kbworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTgKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAiJkNvbXBhcmVyIGRhbnMgVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYxMQorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICLJZGl0ZSBkYW5zICZWaW0iCisKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MzMKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAiyWRpdGVyIGRhbnMgbGUgVmltIGV4aXN0YW50IC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiyWRpdGVyIGxlKHMpIGZpY2hpZXIocykgc+lsZWN0aW9ubukocykgYXZlYyBWaW0iCisKKyMgdG9kbworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIkVycmV1ciBkZSBjculhdGlvbiBkdSBwcm9jZXNzdXM6IFbpcmlmaWV6IHNpIGd2aW0gZXN0IGJpZW4gZGFucyB2b3RyZSBjaGVtaW4hIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NiBHdmltRXh0L2d2aW1leHQuY3BwOjkwMCBHdmltRXh0L2d2aW1leHQuY3BwOjk2NworbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICJFcnJldXIgZGUgZ3ZpbWV4dC5kbGwiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODk5Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICJMZSBjaGVtaW4gZXN0IHRyb3AgbG9uZyAhIgorCisjIG1zZ3N0ciAiLS1QYXMgZGUgbGlnbmVzIGRhbnMgbGUgdGFtcG9uLS0iCisjOiBnbG9iYWxzLmg6OTk4Cittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS1MZSB0YW1wb24gZXN0IHZpZGUtLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTYxCittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiBDb21tYW5kZSBhbm51bOllIgorCisjOiBnbG9iYWxzLmg6MTE2MgorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiBBcmd1bWVudCByZXF1aXMiCisKKyM6IGdsb2JhbHMuaDoxMTYzCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIGRldnJhaXQg6nRyZSBzdWl2aSBkZSAvLCA/IG91ICYiCisKKyMgdG9kbworIzogZ2xvYmFscy5oOjExNjUKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6IEludmFsaWRlIGRhbnMgbGEgZmVu6nRyZSBsaWduZS1kZS1jb21tYW5kZTsgPENSPiBleOljdXRlLCBDVFJMLUMgcSIKKworIyBUT0RPCisjOiBnbG9iYWxzLmg6MTE2NworbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiRTEyOiBDbWRlIGludGVyZGl0ZSDgIHBhcnRpciBkJ3VuIGV4cmMvdmltcmMgZGFucyBy6XAuIGNvdXIuIG91IHRhZyBzZWFyY2giCisKKyM6IGdsb2JhbHMuaDoxMTY5Cittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IDplbmRpZiBtYW5xdWFudCIKKworIzogZ2xvYmFscy5oOjExNzAKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IDplbmR0cnkgbWFucXVhbnQiCisKKyM6IGdsb2JhbHMuaDoxMTcxCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IDplbmR3aGlsZSBtYW5xdWFudCIKKworIzogZ2xvYmFscy5oOjExNzIKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDplbmR3aGlsZSBzYW5zIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNzQKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogTGUgZmljaGllciBleGlzdGUgZOlq4CAoYWpvdXRleiAhIHBvdXIgcGFzc2VyIG91dHJlKSIKKworIzogZ2xvYmFscy5oOjExNzUKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjogTGEgY29tbWFuZGUgYSDpY2hvdekiCisKKyMgdG9kbworIzogZ2xvYmFscy5oOjExNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDogRm9udHNldCBpbmNvbm51OiAlcyIKKworIzogZ2xvYmFscy5oOjExODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTogRm9udGUgaW5jb25udWU6ICVzIgorCisjIFRPRE8KKyM6IGdsb2JhbHMuaDoxMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogTGEgZm9udGUgXCIlc1wiIG4nYSBwYXMgdW5lIGxhcmdldXIgZml4ZSIKKworIzogZ2xvYmFscy5oOjExODYKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3MzogRXJyZXVyIGludGVybmUiCisKKyM6IGdsb2JhbHMuaDoxMTg3Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIkludGVycm9tcHUiCisKKyM6IGdsb2JhbHMuaDoxMTg4Cittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogQWRyZXNzZSBpbnZhbGlkZSIKKworIzogZ2xvYmFscy5oOjExODkKK21zZ2lkICJFNDc0OiBJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICJFNDc0OiBBcmd1bWVudCBpbnZhbGlkZSIKKworIzogZ2xvYmFscy5oOjExOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ3NTogSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0NzU6IEFyZ3VtZW50IGludmFsaWRlOiAlcyIKKworIzogZ2xvYmFscy5oOjExOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IEV4cHJlc3Npb24gaW52YWxpZGU6ICVzIgorCisjIHRvZG8KKyM6IGdsb2JhbHMuaDoxMTk0Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IERvbWFpbmUgaW52YWxpZGUiCisKKyM6IGdsb2JhbHMuaDoxMTk1Cittc2dpZCAiRTQ3NjogSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJFNDc2OiBDb21tYW5kZSBpbnZhbGlkZSIKKworIzogZ2xvYmFscy5oOjExOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIGVzdCB1biBy6XBlcnRvaXJlIgorCisjOiBnbG9iYWxzLmg6MTIwMAorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogQ2FyYWN06HJlcyBpbmF0dGVuZHVzIGF2YW50ICc9JyIKKworIzogZ2xvYmFscy5oOjEyMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IEwnYXBwZWwgZGFucyBsYSBiaWJsaW90aOhxdWUgYSDpY2hvdekgcG91ciBcIiVzKClcIiIKKworIzogZ2xvYmFscy5oOjEyMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogUGFzIHB1IGNoYXJnZXIgbGEgZm9uY3Rpb24gJXMgZGUgbGEgYmlibGlvdGjocXVlIgorCisjOiBnbG9iYWxzLmg6MTIxMQorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiBMYSBtYXJxdWUgYSB1biBudW3pcm8gZGUgbGlnbmUgaW52YWxpZGUiCisKKyMgdG9kbworIzogZ2xvYmFscy5oOjEyMTIKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBNYXJxdWUgbm9uIHBvc2l0aW9ubullIgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBOZSBwZXV0IHJpZW4gY2hhbmdlciwgJ21vZGlmaWFibGUnIGVzdCBk6XNhY3RpdukiCisKKyM6IGdsb2JhbHMuaDoxMjE0Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiBOaXZlYXUgZGUgculjdXJzaW9uIHRyb3Ag6WxldukgZGFucyBsZXMgc2NyaXB0cyIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTIxNQorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogUGFzIGRlIGZpY2hpZXIgYWx0ZXJuYXRpZiIKKworIzogZ2xvYmFscy5oOjEyMTYKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IFBhcyBkZSB0ZWxsZSBhYnLpdmlhdGlvbiIKKworIzogZ2xvYmFscy5oOjEyMTcKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6IExlICEgbidlc3QgcGFzIGF1dG9yaXPpIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogTCdpbnRlcmZhY2UgZ3JhcGhpcXVlIG4nYSBwYXMg6XTpIGNvbXBpbOllIGRhbnMgY2V0dGUgdmVyc2lvbiIKKworIzogZ2xvYmFscy5oOjEyMjIKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjogTGUgc3VwcG9ydCBkZSBsJ2jpYnJldSBuJ2EgcGFzIOl06SBjb21waWzpIGRhbnMgY2V0dGUgdmVyc2lvblxuIgorCisjOiBnbG9iYWxzLmg6MTIyNQorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IExlIHN1cHBvcnQgZHUgZmFyc2kgbidhIHBhcyDpdOkgY29tcGls6SBkYW5zIGNldHRlIHZlcnNpb25cbiIKKworIzogZ2xvYmFscy5oOjEyMjgKK21zZ2lkICJFODAwOiBBcmFiaWMgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFODAwOiBMZSBzdXBwb3J0IGRlIGwnYXJhYmlxdWUgbidhIHBhcyDpdOkgY29tcGls6SBkYW5zIGNldHRlIHZlcnNpb25cbiIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTIzMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IFBhcyBkZSB0ZWwgbm9tIGRlIGdyb3VwZSBkZSBzdXJsaWduYWdlOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMzMKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IFBhcyBlbmNvcmUgZGUgdGV4dGUgaW5z6XLpIgorCisjOiBnbG9iYWxzLmg6MTIzNAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IFBhcyBkZSBsaWduZSBkZSBjb21tYW5kZSBwculj6WRlbnRlIgorCisjIHRvZG8KKyM6IGdsb2JhbHMuaDoxMjM1Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogUGFzIGRlIHRlbCBtYXBwaW5nIgorCisjOiBnbG9iYWxzLmg6MTIzNgorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiBQYXMgZGUgY29ycmVzcG9uZGFuY2UiCisKKyM6IGdsb2JhbHMuaDoxMjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDogUGFzIGRlIGNvcnJlc3BvbmRhbmNlOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMzgKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiBQYXMgZGUgbm9tIGRlIGZpY2hpZXIiCisKKyMgdG9kbworIzogZ2xvYmFscy5oOjEyMzkKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IFBhcyBkJ2V4cHJlc3Npb24gculndWxp6HJlIGRlIHN1YnN0aXR1dGlvbiBwculj6WRlbnRlIgorCisjOiBnbG9iYWxzLmg6MTI0MAorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiBQYXMgZGUgY29tbWFuZGUgcHLpY+lkZW50ZSIKKworIzogZ2xvYmFscy5oOjEyNDEKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiBQYXMgZCdleHByZXNzaW9uIHLpZ3VsaehyZSBwculj6WRlbnRlIgorCisjOiBnbG9iYWxzLmg6MTI0MgorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IExlcyBkb21haW5lcyBuZSBzb250IHBhcyBhdXRvcmlz6XMiCisKKyM6IGdsb2JhbHMuaDoxMjQ0Cittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIkUzNjogUGFzIGFzc2V6IGRlIHBsYWNlIgorCisjOiBnbG9iYWxzLmg6MTI0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IHBhcyBkZSBzZXJ2ZXVyIG5vbW3pIFwiJXNcIiBpbnNjcml0IgorCisjOiBnbG9iYWxzLmg6MTI0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDgyOiBDYW4ndCBjcmVhdGUgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4MjogTmUgcGV1dCBjcullciBsZSBmaWNoaWVyICVzIgorCisjOiBnbG9iYWxzLmg6MTI1MAorbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogTmUgcGV1dCBvYnRlbmlyIGRlIG5vbSBkZSBmaWNoaWVyIHRlbXBvcmFpcmUiCisKKyM6IGdsb2JhbHMuaDoxMjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODQ6IENhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NDogSW1wb3NzaWJsZSBkJ291dnJpciBsZSBmaWNoaWVyIFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjEyNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NTogQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJFNDg1OiBJbXBvc3NpYmxlIGRlIGxpcmUgbGUgZmljaGllciAlcyIKKworIzogZ2xvYmFscy5oOjEyNTMKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzogTW9kaWZpY2F0aW9ucyBub24gZW5yZWdpc3Ry6WVzIChham91dGV6ICEgcG91ciBwYXNzZXIgb3V0cmUpIgorCisjOiBnbG9iYWxzLmg6MTI1NAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiBBcmd1bWVudCBudWwiCisKKyM6IGdsb2JhbHMuaDoxMjU2Cittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogTm9tYnJlIGF0dGVuZHUiCisKKyM6IGdsb2JhbHMuaDoxMjU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTmUgcGV1dCBvdXZyaXIgbGUgZmljaGllciBkJ2VycmV1cnMgJXMiCisKKyMgVE9ETworIzogZ2xvYmFscy5oOjEyNjIKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBvdXZlcnR1cmUgZGUgbCdhZmZpY2hhZ2UgaW1wb3NzaWJsZSIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE3pbW9pcmUg6XB1aXPpZSIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiTW90aWYgaW50cm91dmFibGUiCisKKyM6IGdsb2JhbHMuaDoxMjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4NjogTW90aWYgaW50cm91dmFibGU6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2OQorbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IEwnYXJndW1lbnQgZG9pdCDqdHJlIHBvc2l0aWYiCisKKyM6IGdsb2JhbHMuaDoxMjcxCittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiBJbXBvc3NpYmxlIGRlIHJldG91cm5lciBhdSBy6XBlcnRvaXJlIHBy6WPpZGVudCIKKworIzogZ2xvYmFscy5oOjEyNzUKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiBQYXMgZCdlcnJldXJzIgorCisjOiBnbG9iYWxzLmg6MTI3NworbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogTGUgdGV4dGUgZGUgbGEgcmVjaGVyY2hlIGVzdCBlbmRvbW1hZ+kiCisKKyM6IGdsb2JhbHMuaDoxMjc4Cittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogTGUgcHJvZ3JhbW1lIHJlZ2V4cCBlc3QgY29ycm9tcHUiCisKKyM6IGdsb2JhbHMuaDoxMjc5Cittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiBMJ29wdGlvbiAncmVhZG9ubHknIGVzdCBhY3RpdullIChham91dGV6ICEgcG91ciBwYXNzZXIgb3V0cmUpIgorCisjOiBnbG9iYWxzLmg6MTI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBMYSB2YXJpYWJsZSBcIiVzXCIgZXN0IGVuIGxlY3R1cmUgc2V1bGUiCisKKyM6IGdsb2JhbHMuaDoxMjg0Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBFcnJldXIgbG9ycyBkZSBsYSBsZWN0dXJlIGR1IGZpY2hpZXIgZCdlcnJldXJzIgorCisjOiBnbG9iYWxzLmg6MTI4NworbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBPcOlyYXRpb24gaW50ZXJkaXRlIGRhbnMgbGUgYmFjIOAgc2FibGUiCisKKyM6IGdsb2JhbHMuaDoxMjg5Cittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogSW50ZXJkaXQg4CBjZXQgZW5kcm9pdCIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTI5MgorbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogQ2hvaXggZHUgbW9kZSBkJ+ljcmFuIG5vbiBzdXBwb3J06SIKKworIzogZ2xvYmFscy5oOjEyOTQKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogTCdhbXBsZXVyIGR1IGTpZmlsZW1lbnQgZXN0IGludmFsaWRlIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogTCdvcHRpb24gJ3NoZWxsJyBlc3QgdmlkZSIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTI5NworbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogUGFzIHB1IGxpcmUgbGVzIGRvbm7pZXMgZHUgc3ltYm9sZSEiCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiRTcyOiBDbG9zZSBlcnJvciBvbiBzd2FwIGZpbGUiCittc2dzdHIgIkU3MjogRXJyZXVyIGxvcnMgZGUgbGEgZmVybWV0dXJlIGR1IGZpY2hpZXIgZCfpY2hhbmdlIgorCisjOiBnbG9iYWxzLmg6MTMwMAorbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IExhIHBpbGUgZGVzIOl0aXF1ZXR0ZXMgZXN0IHZpZGUiCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IENvbW1hbmRlIHRyb3AgY29tcGxleGUiCisKKyM6IGdsb2JhbHMuaDoxMzAyCittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IE5vbSB0cm9wIGxvbmciCisKKyM6IGdsb2JhbHMuaDoxMzAzCittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFRyb3AgZGUgWyIKKworIzogZ2xvYmFscy5oOjEzMDQKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogVHJvcCBkZSBub21zIGRlIGZpY2hpZXJzIgorCisjOiBnbG9iYWxzLmg6MTMwNQorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IENhcmFjdOhyZXMgc3VybnVt6XJhaXJlcyIKKworIzogZ2xvYmFscy5oOjEzMDYKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiBNYXJxdWUgaW5jb25udWUiCisKKyM6IGdsb2JhbHMuaDoxMzA3Cittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBJbXBvc3NpYmxlIGRlIGTpdmVsb3BwZXIgbGVzIG3pdGFjYXJhY3TocmVzIgorCisjOiBnbG9iYWxzLmg6MTMwOQorbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIG5lIHBldXQg6nRyZSBwbHVzIHBldGl0IHF1ZSAnd2lubWluaGVpZ2h0JyIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNTkyOiAnd2lud2lkdGgnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbndpZHRoJyIKK21zZ3N0ciAiRTU5MjogJ3dpbndpZHRoJyBuZSBwZXV0IOp0cmUgcGx1cyBwZXRpdCBxdWUgJ3dpbm1pbndpZHRoJyIKKworIzogZ2xvYmFscy5oOjEzMTQKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDogRXJyZXVyIGxvcnMgZGUgbCfpY3JpdHVyZSIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTMxNQorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIkxlIGNvbXB0ZSB2YXV0IHrpcm8iCisKKyM6IGdsb2JhbHMuaDoxMzE3Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiA8U0lEPiB1dGlsaXPpIGVuIGRlaG9ycyBkJ3VuIHNjcmlwdCIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTMyMAorbXNnaWQgIkU0NDk6IEludmFsaWQgZXhwcmVzc2lvbiByZWNlaXZlZCIKK21zZ3N0ciAiRTQ0OTogRXhwcmVzc2lvbiBpbnZhbGlkZSByZed1ZSIKKworIyB0b2RvCisjOiBnbG9iYWxzLmg6MTMyMworbXNnaWQgIkU0NjM6IFJlZ2lvbiBpcyBndWFyZGVkLCBjYW5ub3QgbW9kaWZ5IgorbXNnc3RyICJFNDYzOiBDZXR0ZSB6b25lIGVzdCB2ZXJyb3VpbGzpZSBldCBuZSBwZXV0IOp0cmUgbW9kaWZp6WUiCisKKyN+IG1zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorI34gbXNnc3RyICJlcnJldXIgbG9ycyBkZSBsYSBsZWN0dXJlIGRlIGxhIGNvbm5lY3Rpb24gY3Njb3BlICVkIgorCisjfiBtc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorI34gbXNnc3RyICJFMjYwOiBsYSBjb25uZWN0aW9uIGNzY29wZSBuJ2EgcGFzIOl06SB0cm91dullIgorCisjfiBtc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gY2xvc2VkIgorI34gbXNnc3RyICJMYSBjb25uZWN0aW9uIGNzY29wZSBlc3QgZmVybellIgorCisjfiBtc2dpZCAiY291bGRuJ3QgbWFsbG9jXG4iCisjfiBtc2dzdHIgIm1hbGxvYyBhIOljaG916VxuIgorCisjfiBtc2dpZCAiJTJkICUtNWxkICAlLTM0cyAgPG5vbmU+XG4iCisjfiBtc2dzdHIgIiUyZCAlLTVsZCAlLTM0cyAgPGF1Y3VuPlxuIgorCisjfiBtc2dpZCAiRTQ0ODogVW5rbm93biBmb250OiAlcyIKKyN+IG1zZ3N0ciAiRTQ0ODogRm9udGUgaW5jb25udWU6ICVzIgorCisjfiBtc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCisjfiBtc2dzdHIgIlJlY2hlcmNoZSBsaW7pYWlyZSBkJ+l0aXF1ZXR0ZSIKKworI34gbXNnaWQgIkJpbmFyeSB0YWcgc2VhcmNoIgorI34gbXNnc3RyICJSZWNoZXJjaGUgYmluYWlyZSBkJ+l0aXF1ZXR0ZSIKKworI34gbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlcyIKKyN+IG1zZ3N0ciAiTmUgcGV1dCBvdXZyaXIgbGUgZmljaGllciAlcyIKKworI34gbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorI34gbXNnc3RyICJFMjQ5OiBQYXMgcHUgbGlyZSBlbnRy6WUgcmVnaXN0cmUgZGUgbCdpbnN0YW5jZSBkZSBWaW0iCmRpZmYgLS1naXQgYS9zcmMvcG8vaXQucG8gYi9zcmMvcG8vaXQucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5NjZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9pdC5wbwpAQCAtMCwwICsxLDY2MzggQEAKKyMgSXRhbGlhbiBUcmFuc2xhdGlvbiBmb3IgVmltCisjCisjIEZJUlNUIEFVVEhPUiBBbnRvbmlvIENvbG9tYm8gPGFudG9uaW8uY29sb21ib0BqcmMuaXQ+LCAyMDAwCisjCisjIE9nbmkgY29tbWVudG8g6CBiZW52ZW51dG8uLi4KKyMgRXZlcnkgcmVtYXJrIGlzIHZlcnkgd2VsY29tZS4uLgorIworIyBUcmFuc2xhdGlvbiBkb25lIHVuZGVyIExpbnV4IGFuZCB1c2luZyBhbiBJdGFsaWFuIGtleWJvYXJkLgorIyBFbmdsaXNoIHdvcmRzIGxlZnQgaW4gdGhlIHRleHQgYXJlIHVubW9kaWZpZWQgYXQgcGx1cmFsLgorIyBPcHRpb24gbmFtZXMgYXJlIG1vc3RseSBsZWZ0IHVudG91Y2hlZC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IHZpbSA2LjNcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNC0wNi0wMiAyMDowMiswMjAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogIDIwMDQtMDYtMDIgMjA6MDIrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogICBWbGFkIFNhbmRyaW5pICAgPG1hcmNvQHNhbmRyaW5pLmJpej5cbiIKKyJMYW5ndWFnZS1UZWFtOiAgICAgSXRhbGlhbiIKKyIgICAgICAgICAgICAgICAgICAgQW50b25pbyBDb2xvbWJvIDxhbnRvbmlvLmNvbG9tYm9AanJjLml0PlxuIgorIiAgICAgICAgICAgICAgICAgICBWbGFkIFNhbmRyaW5pICAgPG1hcmNvQHNhbmRyaW5pLmJpej5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU09fODg1OS0xXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOC1iaXRcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiBOb24gcmllc2NvIGFkIGFsbG9jYXJlIGFsY3VuIGJ1ZmZlciwgZXNjby4uLiIKKworIzogYnVmZmVyLmM6MTA1Cittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogTm9uIHJpZXNjbyBhZCBhbGxvY2FyZSB1biBidWZmZXIsIHVzbyBsJ2FsdHJvLi4uIgorCisjOiBidWZmZXIuYzo4MDgKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6IE5lc3N1biBidWZmZXIgc2NhcmljYXRvIgorCisjOiBidWZmZXIuYzo4MTAKK21zZ2lkICJFNTE2OiBObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiRTUxNjogTmVzc3VuIGJ1ZmZlciB0b2x0byBkYWxsYSBsaXN0YSIKKworIzogYnVmZmVyLmM6ODEyCittc2dpZCAiRTUxNzogTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiRTUxNzogTmVzc3VuIGJ1ZmZlciBjYW5jZWxsYXRvIgorCisjOiBidWZmZXIuYzo4MjAKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAiMSBidWZmZXIgc2NhcmljYXRvIgorCisjOiBidWZmZXIuYzo4MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAiJWQgYnVmZmVyIHNjYXJpY2F0aSIKKworIzogYnVmZmVyLmM6ODI3Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSBidWZmZXIgdG9sdG8gZGFsbGEgbGlzdGEiCisKKyM6IGJ1ZmZlci5jOjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIGJ1ZmZlciB0b2x0aSBkYWxsYSBsaXN0YSIKKworIzogYnVmZmVyLmM6ODM0Cittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICIxIGJ1ZmZlciBjYW5jZWxsYXRvIgorCisjOiBidWZmZXIuYzo4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgIiVkIGJ1ZmZlciBjYW5jZWxsYXRpIgorCisjOiBidWZmZXIuYzo4OTcKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiBOZXNzdW4gYnVmZmVyIHJpc3VsdGEgbW9kaWZpY2F0byIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjkzNgorbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiBOb24gYyfoIGFsY3VuIGJ1ZmZlciBlbGVuY2F0byIKKworIzogYnVmZmVyLmM6OTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQnVmZmVyICVsZCBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTg2OiBOb24gZXNpc3RlIGlsIGJ1ZmZlciAlbGQiCisKKyM6IGJ1ZmZlci5jOjk1MQorbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiBOb24gcG9zc28gb2x0cmVwYXNzYXJlIGwndWx0aW1vIGJ1ZmZlciIKKworIzogYnVmZmVyLmM6OTUzCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiBOb24gcG9zc28gYW5kYXJlIHByaW1hIGRlbCBwcmltbyBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFODk6IEJ1ZmZlciAlbGQgbm9uIHNhbHZhdG8gZG9wbyBtb2RpZmljYSAoYWdnaXVuZ2kgISBwZXIgZXNlZ3VpcmUgY29tdW5xdWUpIgorCisjOiBidWZmZXIuYzoxMDA4Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IE5vbiByaWVzY28gYSBzY2FyaWNhcmUgbCd1bHRpbW8gYnVmZmVyIgorCisjOiBidWZmZXIuYzoxNTQ0Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogQXR0ZW56aW9uZTogU3VwZXJhdG8gbGltaXRlIGRlbGxhIGxpc3RhIGRlaSBub21pIGRpIGZpbGUiCisKKyM6IGJ1ZmZlci5jOjE3MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiBCdWZmZXIgJWxkIG5vbiB0cm92YXRvIgorCisjOiBidWZmZXIuYzoxOTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5MzogUGn5IGRpIHVuYSBjb3JyaXNwb25kZW56YSBwZXIgJXMiCisKKyM6IGJ1ZmZlci5jOjE5NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IE5lc3N1biBidWZmZXIgY29ycmlzcG9uZGVudGUgYSAlcyIKKworIzogYnVmZmVyLmM6MjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAibGluZWEgJWxkIgorCisjOiBidWZmZXIuYzoyNDI5Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogQyfoIGdp4CB1biBidWZmZXIgY29uIHF1ZXN0byBub21lIgorCisjOiBidWZmZXIuYzoyNzI0Cittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbTW9kaWZpY2F0b10iCisKKyM6IGJ1ZmZlci5jOjI3MjkKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIltOb24gZWxhYm9yYXRvXSIKKworIzogYnVmZmVyLmM6MjczNAorbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIltGaWxlIG51b3ZvXSIKKworIzogYnVmZmVyLmM6MjczNQorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltFcnJvcmkgaW4gbGV0dHVyYV0iCisKKyM6IGJ1ZmZlci5jOjI3MzcgZmlsZWlvLmM6MjEyNAorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIltpbiBzb2xhIGxldHR1cmFdIgorCisjOiBidWZmZXIuYzoyNzU4CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAiMSBsaW5lYSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc2MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCBsaW5lZSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc2NworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAibGluZWEgJWxkIGRpICVsZCAtLSVkJSUtLSBjb2wgIgorCisjOiBidWZmZXIuYzoyODc1Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbU2VuemEgbm9tZV0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjkxNQorbXNnaWQgImhlbHAiCittc2dzdHIgImFpdXRvIgorCisjOiBidWZmZXIuYzozNDc0IHNjcmVlbi5jOjUwNzUKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIlthaXV0b10iCisKKyM6IGJ1ZmZlci5jOjM1MDYgc2NyZWVuLmM6NTA4MQorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW0FudGVwcmltYV0iCisKKyM6IGJ1ZmZlci5jOjM3ODYKK21zZ2lkICJBbGwiCittc2dzdHIgIlR1dCIKKworIzogYnVmZmVyLmM6Mzc4NgorbXNnaWQgIkJvdCIKK21zZ3N0ciAiRm9uIgorCisjOiBidWZmZXIuYzozNzg4Cittc2dpZCAiVG9wIgorbXNnc3RyICJDaW0iCisKKyM6IGJ1ZmZlci5jOjQ1MzYKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTGlzdGEgQnVmZmVyOlxuIgorCisjOiBidWZmZXIuYzo0NTY5Cittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbTGlzdGEgRXJyb3JpXSIKKworIzogYnVmZmVyLmM6NDU4MiBtZW1saW5lLmM6MTUyMQorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW1NlbnphIG5vbWVdIgorCisjOiBidWZmZXIuYzo0ODk1Cittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU2VnbmkgLS0tIgorCisjOiBidWZmZXIuYzo0OTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIlNlZ25pIHBlciAlczoiCisKKyM6IGJ1ZmZlci5jOjQ5MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIGxpbmVhPSVsZCBpZD0lZCwgbm9tZT0lcyIKKworIzogZGlmZi5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogTm9uIHN1cHBvcnRvIGRpZmZlcmVuemUgZnJhIHBp+SBkaSAlbGQgYnVmZmVyIgorCisjOiBkaWZmLmM6NzEzCittc2dpZCAiRTk3OiBDYW5ub3QgY3JlYXRlIGRpZmZzIgorbXNnc3RyICJFOTc6IE5vbiByaWVzY28gYSBjcmVhcmUgZGlmZmVyZW56ZSAiCisKKyM6IGRpZmYuYzo4MTgKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJGaWxlIGRpIGRpZmZlcmVuemUiCisKKyM6IGRpZmYuYzoxMDY5Cittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiBOb24gcmllc2NvIGEgbGVnZ2VyZSBvdXRwdXQgZGVsIGNvbWFuZG8gJ2RpZmYnIgorCisjOiBkaWZmLmM6MTgxOQorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiBCdWZmZXIgY29ycmVudGUgbm9uIGluIG1vZGFsaXTgICdkaWZmJyIKKworIzogZGlmZi5jOjE4MzEKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiBOb24gYyfoIG5lc3N1biBhbHRybyBidWZmZXIgaW4gbW9kYWxpdOAgJ2RpZmYnIgorCisjOiBkaWZmLmM6MTgzOQorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiRTEwMTogUGn5IGRpIGR1ZSBidWZmZXIgaW4gbW9kYWxpdOAgJ2RpZmYnLCBub24gc28gcXVhbGUgdXNhcmUiCisKKyM6IGRpZmYuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogTm9uIHJpZXNjbyBhIHRyb3ZhcmUgaWwgYnVmZmVyOiBcIiVzXCIiCisKKyM6IGRpZmYuYzoxODY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogSWwgYnVmZmVyIFwiJXNcIiBub24g6CBpbiBtb2RhbGl04CAnZGlmZiciCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IEVzY2FwZSBub3QgYW1tZXNzbyBuZWkgZGlncmFtbWkiCisKKyM6IGRpZ3JhcGguYzoyMzg0Cittc2dpZCAiRTU0NDogS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJFNTQ0OiBGaWxlIGtleW1hcCBub24gdHJvdmF0byIKKworIzogZGlncmFwaC5jOjI0MTEKK21zZ2lkICJFMTA1OiBVc2luZyA6bG9hZGtleW1hcCBub3QgaW4gYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxMDU6IFVzbyBkaSA6bG9hZGtleW1hcCBmdW9yaSBkYSB1biBmaWxlIGRpIGNvbWFuZGkiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgQ29tcGxldGFtZW50byBLZXl3b3JkICheTl5QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCittc2dzdHIgIiBtb2RhbGl04CBeWCAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gS2V5d29yZCBMb2NhbGUgKF5OXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTF5OXlApIgorbXNnc3RyICIgQ29tcGxldGFtZW50byBMaW5lYSBJbnRlcmEgKF5MXk5eUCkiCisKKyM6IGVkaXQuYzo0NgorbXNnaWQgIiBGaWxlIG5hbWUgY29tcGxldGlvbiAoXkZeTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gbm9taSBGaWxlICheRl5OXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dXk5eUCkiCittc2dzdHIgIiBDb21wbGV0YW1lbnRvIFRhZyAoXl1eTl5QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gbW9kZWxsbyBQYXRoICheTl5QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkReTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gRGVmaW5pemlvbmUgKF5EXk5eUCkiCisKKyM6IGVkaXQuYzo1MQorbXNnaWQgIiBEaWN0aW9uYXJ5IGNvbXBsZXRpb24gKF5LXk5eUCkiCittc2dzdHIgIiBDb21wbGV0YW1lbnRvIERpemlvbmFyaW8gKF5LXk5eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlReTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gVGhlc2F1cnVzICheVF5OXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WXk5eUCkiCittc2dzdHIgIiBDb21wbGV0YW1lbnRvIGxpbmVhIGNvbWFuZGkgKF5WXk5eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJHaXVudG8gYWxsYSBmaW5lIGRlbCBwYXJhZ3JhZm8iCisKKyM6IGVkaXQuYzo5NjIKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgImwnb3B6aW9uZSAndGhlc2F1cnVzJyDoIHZ1b3RhIgorCisjOiBlZGl0LmM6MTE2NgorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgImwnb3B6aW9uZSAnZGljdGlvbmFyeScg6CB2dW90YSIKKworIzogZWRpdC5jOjIxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIlNjYW5zaW9uZSBkaXppb25hcmlvOiAlcyIKKworIzogZWRpdC5jOjIzNjgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAoaW5zZXJpc2NpKSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzNzAKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHNvc3RpdHVpc2NpKSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjI2ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICJTY2Fuc2lvbmU6ICVzIgorCisjOiBlZGl0LmM6MjcxOQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJTY2Fuc2lvbmUgdGFnLiIKKworIzogZWRpdC5jOjMzODEKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIgQWdnaXVuZ28iCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQzMAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gUmljZXJjYS4uLiIKKworIzogZWRpdC5jOjM0ODYKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICJSaXRvcm5vIGFsbCdvcmlnaW5hbGUiCisKKyM6IGVkaXQuYzozNDkxCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIlBhcm9sYSBkYSB1bidhbHRyYSBsaW5lYSIKKworIzogZWRpdC5jOjM0OTYKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiTCd1bmljYSBjb3JyaXNwb25kZW56YSIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgImNvcnJpc3BvbmRlbnphICVkIGRpICVkIgorCisjOiBlZGl0LmM6MzU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAiY29ycmlwb25kZW56YSAlZCIKKworIy4gU2tpcCBmdXJ0aGVyIGFyZ3VtZW50cyBidXQgZG8gY29udGludWUgdG8KKyMuICogc2VhcmNoIGZvciBhIHRyYWlsaW5nIGNvbW1hbmQuCisjOiBldmFsLmM6MTAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IFZhcmlhYmlsZSBpbmVzaXN0ZW50ZTogXCIlc1wiIgorCisjOiBldmFsLmM6MTMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IE1hbmNhbm8gZ3JhZmZlOiAlcyIKKworIzogZXZhbC5jOjE0MzUgZXZhbC5jOjE0NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiBWYXJpYWJpbGUgaW5lc2lzdGVudGU6IFwiJXNcIiIKKworIzogZXZhbC5jOjE3MDUKK21zZ2lkICJFMTA5OiBNaXNzaW5nICc6JyBhZnRlciAnPyciCittc2dzdHIgIkUxMDk6IE1hbmNhICc6JyBkb3BvICc/JyIKKworIzogZXZhbC5jOjIzMjcKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogTWFuY2EgJyknIgorCisjOiBldmFsLmM6MjM4OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBNYW5jYSAnXSciCisKKyM6IGV2YWwuYzoyNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiBOb21lIE9wemlvbmUgbWFuY2FudGU6ICVzIgorCisjOiBldmFsLmM6MjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE9wemlvbmUgaW5lc2lzdGVudGU6ICVzIgorCisjOiBldmFsLmM6MjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogTWFuY2EgJ1wiJzogJXMiCisKKyM6IGV2YWwuYzoyNjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBNYW5jYSBhcG9zdHJvZm86ICVzIgorCisjOiBldmFsLmM6MzA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IEFyZ29tZW50byBub24gdmFsaWRvIHBlciBsYSBmdW56aW9uZSAlcyIKKworIzogZXZhbC5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IEZ1bnppb25lIGluZXNpc3RlbnRlOiAlcyIKKworIzogZXZhbC5jOjMwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IFRyb3BwaSBhcmdvbWVudGkgcGVyIGxhIGZ1bnppb25lOiAlcyIKKworIzogZXZhbC5jOjMwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTogQXJnb21lbnRpIGluc3VmZmljaWVudGkgcGVyIGxhIGZ1bnppb25lOiAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiBVc28gZGkgPFNJRD4gZnVvcmkgZGFsIGNvbnRlc3RvIGRpIHVubyBzY3JpcHQ6ICVzIgorCisjLgorIy4gKiBZZXMgdGhpcyBpcyB1Z2x5LCBJIGRvbid0IHBhcnRpY3VsYXJseSBsaWtlIGl0IGVpdGhlci4gIEJ1dCBkb2luZyBpdAorIy4gKiB0aGlzIHdheSBoYXMgdGhlIGNvbXBlbGxpbmcgYWR2YW50YWdlIHRoYXQgdHJhbnNsYXRpb25zIG5lZWQgbm90IHRvCisjLiAqIGJlIHRvdWNoZWQgYXQgYWxsLiAgU2VlIGJlbG93IHdoYXQgJ29rJyBhbmQgJ3luYycgYXJlIHVzZWQgZm9yLgorIy4KKyM6IGV2YWwuYzozNjg3IGd1aS5jOjQzODIgZ3VpX2d0ay5jOjIwNTkKK21zZ2lkICImT2siCittc2dzdHIgIiZPSyIKKworIzogZXZhbC5jOjQyMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0lcyUzbGQgbGluZXM6ICIKK21zZ3N0ciAiKy0lcyUzbGQgbGluZWU6ICIKKworIzogZXZhbC5jOjU0NzcKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPS1xuIgorIiZOb24gZXNlZ3VpcmUiCisKKyM6IGV2YWwuYzo1NTE3Cittc2dpZCAiY2FsbGVkIGlucHV0cmVzdG9yZSgpIG1vcmUgb2Z0ZW4gdGhhbiBpbnB1dHNhdmUoKSIKK21zZ3N0ciAiaW5wdXRyZXN0b3JlKCkgY2hpYW1hdGEgcGn5IHZvbHRlIGRpIGlucHV0c2F2ZSgpIgorCisjOiBldmFsLmM6NTk3NworbXNnaWQgIkU2NTU6IFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIChjeWNsZT8pIgorbXNnc3RyICJFNjU1OiBUcm9wcGkgbGluayBzaW1ib2xpY2kgKGNpcmNvbGFyaXTgPykiCisKKyM6IGV2YWwuYzo2NjI2Cittc2dpZCAiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIgorbXNnc3RyICJFMjQwOiBNYW5jYSBjb25uZXNzaW9uZSBjb24gc2VydmVyIFZpbSIKKworIzogZXZhbC5jOjY3MjQKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3NzogTm9uIHJpZXNjbyBhIGxlZ2dlcmUgdW5hIHJpc3Bvc3RhIGRlbCBzZXJ2ZXIiCisKKyM6IGV2YWwuYzo2NzUyCittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBJbXBvc3NpYmlsZSBpbnZpYXJlIGFsIGNsaWVudCIKKworIzogZXZhbC5jOjY4MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IEltcG9zc2liaWxlIGludmlhcmUgYSAlcyIKKworIzogZXZhbC5jOjY5MDAKK21zZ2lkICIoSW52YWxpZCkiCittc2dzdHIgIihOb24gdmFsaWRvKSIKKworIzogZXZhbC5jOjgwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogVmFyaWFiaWxlIG5vbiBkZWZpbml0YTogJXMiCisKKyM6IGV2YWwuYzo4NTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IE5vbWUgZGkgdmFyaWFiaWxlIG5vbiBhbW1lc3NvOiAlcyIKKworIzogZXZhbC5jOjg4MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxMjI6IExhIGZ1bnppb25lICVzIGVzaXN0ZSBnaeAsIGFnZ2l1bmdpICEgcGVyIHNvc3RpdHVpcmxhIgorCisjOiBldmFsLmM6ODg3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIzOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTIzOiBGdW56aW9uZSBub24gZGVmaW5pdGE6ICVzIgorCisjOiBldmFsLmM6ODg4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IE1hbmNhICcoJzogJXMiCisKKyM6IGV2YWwuYzo4OTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBBcmdvbWVudG8gbm9uIGFtbWVzc286ICVzIgorCisjOiBldmFsLmM6OTAwMAorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiBNYW5jYSA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo5MTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiBOb24gcG9zc28gcmlkZWZpbmlyZSBsYSBmdW56aW9uZSAlczogRScgaW4gdXNvIgorCisjOiBldmFsLmM6OTE3NworbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IE5vbWUgZnVuemlvbmUgbmVjZXNzYXJpbyIKKworIzogZXZhbC5jOjkyMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogSWwgbm9tZSBmdW56aW9uZSBkZXZlIGluaXppYXJlIGNvbiB1bmEgbGV0dGVyYSBtYWl1c2NvbGE6ICVzIgorCisjOiBldmFsLmM6OTQyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBGdW56aW9uZSBub24gZGVmaW5pdGE6ICVzIgorCisjOiBldmFsLmM6OTQyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IE5vbiBwb3NzbyBlbGltaW5hcmUgbGEgZnVuemlvbmUgJXM6IEUnIGluIHVzbyIKKworIzogZXZhbC5jOjk0NzMKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICIiCisiRTEzMjogTmlkaWZpY2F6aW9uZSBkZWxsYSBjaGlhbWF0YSBkaSBmdW56aW9uZSBtYWdnaW9yZSBkaSAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJjaGlhbW8gJXMiCisKKyM6IGV2YWwuYzo5NTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzIG5vbiBjb21wbGV0YXRhIgorCisjOiBldmFsLmM6OTU5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgcml0b3JubyAjJWxkIgorCisjOiBldmFsLmM6OTU5NworIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICIlcyByaXRvcm5vIFwiJXNcIiIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTYxMyBleF9jbWRzMi5jOjIzNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAiY29udGludW8gaW4gJXMiCisKKyM6IGV2YWwuYzo5NjM5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gZnVvcmkgZGEgdW5hIGZ1bnppb25lIgorCisjOiBldmFsLmM6OTk3MAorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIHZhcmlhYmlsaSBnbG9iYWxpOlxuIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICJFbnRybyBtb2RhbGl04CBEZWJ1Zy4gIEJhdHRpIFwiY29udFwiIHBlciBjb250aW51YXJlLiIKKworIzogZXhfY21kczIuYzo5NiBleF9kb2NtZC5jOjk2OAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgImxpbmVhICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAiY29tOiAlcyIKKworIzogZXhfY21kczIuYzoyOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiUGF1c2EgaW4gXCIlcyVzXCIgbGluZWEgJWxkIgorCisjOiBleF9jbWRzMi5jOjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IEJyZWFrcG9pbnQgJXMgbm9uIHRyb3ZhdG8iCisKKyM6IGV4X2NtZHMyLmM6NTY2Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAiTmVzc3VuICdicmVha3BvaW50JyBkZWZpbml0byIKKworIzogZXhfY21kczIuYzo1NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgbGluZWEgJWxkIgorCisjOiBleF9jbWRzMi5jOjc2MSBleF9jbWRzLmM6MjA5NworbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIlNhbHZhIGNvbiBOb21lIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJTYWx2YXJlIG1vZGlmaWNoZSBhIFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo3ODggZXhfZG9jbWQuYzo5Mzk4Cittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIlNlbnphIE5vbWUiCisKKyM6IGV4X2NtZHMyLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiBCdWZmZXIgXCIlc1wiIG5vbiBzYWx2YXRvIGRvcG8gbW9kaWZpY2EiCisKKyM6IGV4X2NtZHMyLmM6OTg0Cittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICIiCisiQXR0ZW56aW9uZTogRW50cmF0byBpbiBhbHRybyBidWZmZXIgaW5hc3BldHRhdGFtZW50ZSAoY29udHJvbGxhcmUgIgorImF1dG9jb21hbmRpKSIKKworIzogZXhfY21kczIuYzoxMzg3Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiBDJ+ggdW4gc29sbyBmaWxlIGRhIGVsYWJvcmFyZSIKKworIzogZXhfY21kczIuYzoxMzg5Cittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBOb24gcG9zc28gYW5kYXJlIGRhdmFudGkgYWwgcHJpbW8gZmlsZSIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IE5vbiBwb3NzbyBvbHRyZXBhc3NhcmUgbCd1bHRpbW8gZmlsZSIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiBjb21waWxhdG9yZSBub24gc3VwcG9ydGF0bzogJXMiCisKKyM6IGV4X2NtZHMyLmM6MTkwMQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIkNlcmNvIFwiJXNcIiBpbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTkyMworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiQ2VyY28gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAibm9uIHRyb3ZhdG8gaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NzkKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiRXNlZ3VpIHNjcmlwdCBWaW0iCisKKyM6IGV4X2NtZHMyLmM6MjE2OQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc291cmNlIGEgZGlyZWN0b3J5OiBcIiVzXCIiCittc2dzdHIgIk5vbiByaWVzY28gYWQgZXNlZ3VpcmUgdW5hIGRpcmVjdG9yeTogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIm5vbiByaWVzY28gYWQgZXNlZ3VpcmUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJsaW5lYSAlbGQ6IG5vbiByaWVzY28gYWQgZXNlZ3VpcmUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJlc2VndW8gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAibGluZWEgJWxkOiBlc2VndW8gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIzNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgImVzZWN1emlvbmUgZGkgJXMgdGVybWluYXRhIgorCisjOiBleF9jbWRzMi5jOjI3MTIKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiBBdHRlbnppb25lOiBTZXBhcmF0b3JlIGRpIGxpbmVhIGVycmF0bywgZm9yc2UgbWFuY2EgXk0iCisKKyM6IGV4X2NtZHMyLmM6Mjc2MQorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2F0byBmdW9yaSBkYSB1biBmaWxlIGRpIGNvbWFuZGkiCisKKyM6IGV4X2NtZHMyLmM6Mjc5NAorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiA6ZmluaXNoIHVzYXRvIGZ1b3JpIGRhIGZpbGUgZGkgY29tYW5kaSIKKworIzogZXhfY21kczIuYzozMjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIlBhZ2luYSAlZCIKKworIzogZXhfY21kczIuYzozMzk5Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICJNYW5jYSB0ZXN0byBkYSBzdGFtcGFyZSIKKworIzogZXhfY21kczIuYzozNDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJTdG8gc3RhbXBhbmRvIHBhZ2luYSAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MzQ4OQorIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIENvcGlhICVkIGRpICVkIgorCisjOiBleF9jbWRzMi5jOjM1NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIlN0YW1wYXRvOiAlcyIKKworIzogZXhfY21kczIuYzozNTU0Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiU3RhbXBhIG5vbiBjb21wbGV0YXRhJyIKKworIzogZXhfY21kczIuYzozOTE5Cittc2dpZCAiRTQ1NTogRXJyb3Igd3JpdGluZyB0byBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFNDU1OiBFcnJvcmUgaW4gc2NyaXR0dXJhIGEgZmlsZSBQb3N0U2NyaXB0IGRpIG91dHB1dCIKKworIzogZXhfY21kczIuYzo0MTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IE5vbiByaWVzY28gYWQgYXByaXJlIGlsIGZpbGUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQyMDQgZXhfY21kczIuYzo0ODI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTm9uIHJpZXNjbyBhIGxlZ2dlcmUgZmlsZSByaXNvcnNlIFBvc3RTY3JpcHQgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxODogZmlsZSBcIiVzXCIgaXMgbm90IGEgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE4OiBmaWxlIFwiJXNcIiBub24g6CB1biBmaWxlIGRpIHJpc29yc2UgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo0MjI3IGV4X2NtZHMyLmM6NDI0NyBleF9jbWRzMi5jOjQyNjIgZXhfY21kczIuYzo0Mjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTk6IGZpbGUgXCIlc1wiIG5vbiDoIHVuIGZpbGUgZGkgcmlzb3JzZSBQb3N0U2NyaXB0IHN1cHBvcnRhdG8iCisKKyM6IGV4X2NtZHMyLmM6NDMxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjIxOiBcIiVzXCIgcmVzb3VyY2UgZmlsZSBoYXMgd3JvbmcgdmVyc2lvbiIKK21zZ3N0ciAiRTYyMTogaWwgZmlsZSBkaSByaXNvcnNlIFwiJXNcIiBoYSB1bmEgdmVyc2lvbmUgc2JhZ2xpYXRhIgorCisjOiBleF9jbWRzMi5jOjQ3ODEKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IE5vbiByaWVzY28gYWQgYXByaXJlIGZpbGUgUG9zdFNjcmlwdCBkaSBvdXRwdXQiCisKKyM6IGV4X2NtZHMyLmM6NDgxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBOb24gcmllc2NvIGFkIGFwcmlyZSBpbCBmaWxlIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0OTMzCittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIKK21zZ3N0ciAiRTQ1NjogTm9uIHRyb3ZvIGZpbGUgcmlzb3JzZSBQb3N0U2NyaXB0IFwicHJvbG9nLnBzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDk2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiCittc2dzdHIgIkU0NTY6IE5vbiB0cm92byBmaWxlIHJpc29yc2UgUG9zdFNjcmlwdCBcIiVzLnBzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDk4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjIwOiBVbmFibGUgdG8gY29udmVydCBmcm9tIG11bHRpLWJ5dGUgdG8gXCIlc1wiIGVuY29kaW5nIgorbXNnc3RyICJFNjIwOiBJbXBvc3NpYmlsZSBjb252ZXJ0aXJlIGRhIG11bHRpLWJ5dGUgYSBjb2RpZmljYSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTEwNworbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAiSW52aW8gYSBzdGFtcGFudGUuLi4iCisKKyM6IGV4X2NtZHMyLmM6NTExMQorbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IE5vbiByaWVzY28gYWQgYXByaXJlIGZpbGUgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo1MTEzCittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJSaWNoaWVzdGEgZGkgc3RhbXBhIGludmlhdGEuIgorCisjOiBleF9jbWRzMi5jOjU2MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIkxpbmd1YSAlc2luIHVzbzogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjU2MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiCittc2dzdHIgIkUxOTc6IE5vbiBwb3NzbyBpbXBvc3RhcmUgbGluZ3VhIGEgXCIlc1wiIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICBFc2EgJTAyeCwgIE90dGFsZSAlMDNvIgorCisjOiBleF9jbWRzLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgRXNhICUwNHgsIE90dGFsZSAlbyIKKworIzogZXhfY21kcy5jOjExOQorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIEVzYSAlMDh4LCBPdHRhbGUgJW8iCisKKyM6IGV4X2NtZHMuYzo0MzAKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogTW92aW1lbnRvIGRpIGxpbmVlIHZlcnNvIHNlIHN0ZXNzZSIKKworIzogZXhfY21kcy5jOjQ5OQorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSBsaW5lYSBtb3NzYSIKKworIzogZXhfY21kcy5jOjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgIiVsZCBsaW5lZSBtb3NzZSIKKworIzogZXhfY21kcy5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCBsaW5lZSBmaWx0cmF0ZSIKKworIzogZXhfY21kcy5jOjk1MgorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0ZXIqIEdsaSBhdXRvY29tYW5kaSBub24gZGV2b25vIG1vZGlmaWNhcmUgaWwgYnVmZmVyIGluIHVzbyIKKworIzogZXhfY21kcy5jOjEwMzcKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIltOb24gc2FsdmF0byBkb3BvIGwndWx0aW1hIG1vZGlmaWNhXVxuIgorCisjOiBleF9jbWRzLmM6MTI4MworIywgYy1mb3JtYXQKK21zZ2lkICIlc3ZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAiJXN2aW1pbmZvOiAlcyBuZWxsYSBsaW5lYTogIgorCisjOiBleF9jbWRzLmM6MTI4OAorbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiBUcm9wcGkgZXJyb3JpLCBpZ25vcm8gaWwgcmVzdG8gZGVsIGZpbGUiCisKKyM6IGV4X2NtZHMuYzoxMzIzCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAiTGV0dHVyYSBmaWxlIHZpbWluZm8gXCIlc1wiJXMlcyVzIgorCisjOiBleF9jbWRzLmM6MTMyNAorbXNnaWQgIiBpbmZvIgorbXNnc3RyICIgaW5mb3JtYXppb25lIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIG1hcmsiCisKKyM6IGV4X2NtZHMuYzoxMzI2Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIEZBTExJVE8iCisKKyM6IGV4X2NtZHMuYzoxNDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBGaWxlIHZpbWluZm8gXCIlc1wiIGluYWNjZXNzaWJpbGUgaW4gc2NyaXR0dXJhIgorCisjOiBleF9jbWRzLmM6MTU0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiBOb24gcmllc2NvIGEgc2NyaXZlcmUgaWwgZmlsZSB2aW1pbmZvICVzISIKKworIzogZXhfY21kcy5jOjE1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICJTY3Jpdm8gZmlsZSB2aW1pbmZvIFwiJXNcIiIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTY0OQorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIFF1ZXN0byBmaWxlIHZpbWluZm8g6CBzdGF0byBnZW5lcmF0byBkYSBWaW0gJXMuXG4iCisKKyM6IGV4X2NtZHMuYzoxNjUxCittc2dpZCAiIgorIiMgWW91IG1heSBlZGl0IGl0IGlmIHlvdSdyZSBjYXJlZnVsIVxuIgorIlxuIgorbXNnc3RyICIiCisiIyBGaWxlIG1vZGlmaWNhYmlsZSwgYXR0ZW50byBhIHF1ZWwgY2hlIGZhaSFcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyBWYWxvcmUgZGkgJ2VuY29kaW5nJyBhbCBtb21lbnRvIGRlbGxhIHNjcml0dHVyYSBkaSBxdWVzdG8gZmlsZVxuIgorCisjOiBleF9jbWRzLmM6MTc1MgorbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiQ2FyYXR0ZXJlIGluaXppYWxlIG5vbiBhbW1lc3NvIgorCisjLiBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMuICogZ29vZCBpZGVhLgorIzogZXhfY21kcy5jOjIxNDAKK21zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKK21zZ3N0ciAiRTEzOTogRmlsZSBnaeAgY2FyaWNhdG8gaW4gdW4gYWx0cm8gYnVmZmVyIgorCisjOiBleF9jbWRzLmM6MjE3NAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIlNjcml2byBpbCBmaWxlIGluY29tcGxldG8/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBVc2EgISBwZXIgc2NyaXZlcmUgaWwgYnVmZmVyIGluY29tcGxldG8iCisKKyM6IGV4X2NtZHMuYzoyMjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAiUmlzY3JpdHR1cmEgZGVsIGZpbGUgZXNpc3RlbnRlIFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiBNYW5jYSBub21lIGZpbGUgcGVyIGlsIGJ1ZmZlciAlbGQiCisKKyM6IGV4X2NtZHMuYzoyNDA2Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogRmlsZSBub24gc2NyaXR0bzogU2NyaXR0dXJhIGluaWJpdGEgZGEgb3B6aW9uZSAnd3JpdGUnIgorCisjOiBleF9jbWRzLmM6MjQyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisib3B6aW9uZSAncmVhZG9ubHknIGF0dGl2YSBwZXIgXCIlLipzXCIuXG4iCisiVnVvaSBzY3JpdmVyZSBjb211bnF1ZT8iCisKKyM6IGV4X2NtZHMuYzoyNTk5Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICJFbGFib3JhIEZpbGUiCisKKyM6IGV4X2NtZHMuYzozMjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDM6IEF1dG9jb21tYW5kcyB1bmV4cGVjdGVkbHkgZGVsZXRlZCBuZXcgYnVmZmVyICVzIgorbXNnc3RyICIiCisiRTE0MzogR2xpIGF1dG9jb21hbmRpIGhhbm5vIGluYXNwZXR0YXRhbWVudGUgY2FuY2VsbGF0byBpbCBudW92byBidWZmZXIgJXMiCisKKyM6IGV4X2NtZHMuYzozMzQxCittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IGFyZ29tZW50byBub24tbnVtZXJpY28gYSA6eiIKKworIzogZXhfY21kcy5jOjM0MjYKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBDb21hbmRpIFNoZWxsIG5vbiBwZXJtZXNzaSBpbiBydmltIgorCisjOiBleF9jbWRzLmM6MzUzMworbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IExlIGVzcHJlc3Npb25pIHJlZ29sYXJpIG5vbiBwb3Nzb25vIGVzc2VyZSBkZWxpbWl0YXRlIGRhIGxldHRlcmUiCisKKyM6IGV4X2NtZHMuYzozODc5CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgInNvc3RpdHVpcmUgY29uICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQyNzIKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKEludGVycm90dG8pICIKKworIzogZXhfY21kcy5jOjQyNzYKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSBzb3N0aXR1emlvbmUiCisKKyM6IGV4X2NtZHMuYzo0Mjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICIlbGQgc29zdGl0dXppb25pIgorCisjOiBleF9jbWRzLmM6NDI4MQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiBpbiAxIGxpbmVhIgorCisjOiBleF9jbWRzLmM6NDI4MworIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgaW4gJWxkIGxpbmVlIgorCisjOiBleF9jbWRzLmM6NDMzNAorbXNnaWQgIkUxNDc6IENhbm5vdCBkbyA6Z2xvYmFsIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE0NzogOmdsb2JhbCBub24gcHXyIGVzc2VyZSB1c2F0byByaWNvcnNpdmFtZW50ZSIKKworIzogZXhfY21kcy5jOjQzNjkKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogTWFuY2EgZXNwcmVzc2lvbmUgcmVnb2xhcmUgbmVsIGNvbWFuZG8gJ2dsb2JhbCciCisKKyM6IGV4X2NtZHMuYzo0NDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIkVzcHJlc3Npb25lIHRyb3ZhdGEgc3Ugb2duaSBsaW5lYTogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDk5Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBVbHRpbWEgU3RyaW5nYSBTb3N0aXR1emlvbmU6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ2MDAKK21zZ2lkICJFNDc4OiBEb24ndCBwYW5pYyEiCittc2dzdHIgIkU0Nzg6IE5vbiBsYXNjaWFydGkgcHJlbmRlcmUgZGFsIHBhbmljbyEiCisKKyM6IGV4X2NtZHMuYzo0NjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjE6IFNvcnJ5LCBubyAnJXMnIGhlbHAgZm9yICVzIgorbXNnc3RyICJFNjYxOiBTcGlhY2VudGUsIG5lc3N1biBhaXV0byAnJXMnIHBlciAlcyIKKworIzogZXhfY21kcy5jOjQ2NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBTcGlhY2VudGUsIG5lc3N1biBhaXV0byBwZXIgJXMiCisKKyM6IGV4X2NtZHMuYzo0Njg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiU3BpYWNlbnRlLCBub24gdHJvdm8gZmlsZSBkaSBhaXV0byBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo1MTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIG5vbiDoIHVuYSBkaXJlY3RvcnkiCisKKyM6IGV4X2NtZHMuYzo1MzMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBOb24gcG9zc28gYXByaXJlICVzIGluIHNjcml0dHVyYSIKKworIzogZXhfY21kcy5jOjUzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IE5vbiByaWVzY28gYWQgYXByaXJlICVzIGluIGxldHR1cmEiCisKKyM6IGV4X2NtZHMuYzo1Mzg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NzA6IE1peCBvZiBoZWxwIGZpbGUgZW5jb2RpbmdzIHdpdGhpbiBhIGxhbmd1YWdlOiAlcyIKK21zZ3N0ciAiRTY3MDogQ29kaWZpY2hlIGRpdmVyc2UgZnJhIGZpbGUgZGkgYWl1dG8gbmVsbGEgc3Rlc3NhIGxpbmd1YTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IFRhZyBkdXBsaWNhdGEgXCIlc1wiIG5lbCBmaWxlICVzIgorCisjOiBleF9jbWRzLmM6NTU3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IENvbWFuZG8gJ3NpZ24nIHNjb25vc2NpdXRvOiAlcyIKKworIzogZXhfY21kcy5jOjU1OTkKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1NjogTWFuY2Egbm9tZSAnc2lnbiciCisKKyM6IGV4X2NtZHMuYzo1NjQ1Cittc2dpZCAiRTYxMjogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTYxMjogVHJvcHBpICdzaWduJyBkZWZpbml0aSIKKworIzogZXhfY21kcy5jOjU3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBUZXN0byAnc2lnbicgbm9uIHZhbGlkbzogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzQ0IGV4X2NtZHMuYzo1OTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6ICdzaWduJyBzY29ub3NjaXV0bzogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzkzCittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogTWFuY2EgbnVtZXJvICdzaWduJyIKKworIzogZXhfY21kcy5jOjU4NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IE5vbWUgYnVmZmVyIG5vbiB2YWxpZG86ICVzIgorCisjOiBleF9jbWRzLmM6NTkxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogSUQgJ3NpZ24nIG5vbiB2YWxpZG86ICVsZCIKKworIzogZXhfY21kcy5jOjU5ODQKK21zZ2lkICIgKE5PVCBGT1VORCkiCittc2dzdHIgIiAoTk9OIFRST1ZBVE8pIgorCisjOiBleF9jbWRzLmM6NTk4NgorbXNnaWQgIiAobm90IHN1cHBvcnRlZCkiCittc2dzdHIgIiAobm9uIHN1cHBvcnRhdGEpIgorCisjOiBleF9jbWRzLmM6NjA4NQorbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW0NhbmNlbGxhdG9dIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJFbnRybyBtb2RhbGl04CBFeC4gIEJhdHRpIFwidmlzdWFsXCIgcGVyIHRvcm5hcmUgYSBtb2RhbGl04CBOb3JtYWxlLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTYxCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IEFsbGEgZmluZS1maWxlIgorCisjOiBleF9kb2NtZC5jOjY3MAorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogQ29tYW5kbyB0cm9wcG8gcmljb3JzaXZvIgorCisjOiBleF9kb2NtZC5jOjEyMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiBFY2NlemlvbmUgbm9uIGludGVyY2V0dGF0YTogJXMiCisKKyM6IGV4X2RvY21kLmM6MTMyMAorbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkZpbmUgZGVsIGZpbGUgZGkgY29tYW5kaSIKKworIzogZXhfZG9jbWQuYzoxMzIxCittc2dpZCAiRW5kIG9mIGZ1bmN0aW9uIgorbXNnc3RyICJGaW5lIGZ1bnppb25lICIKKworIzogZXhfZG9jbWQuYzoxOTEwCittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogVXNvIGFtYmlndW8gZGkgY29tYW5kbyBkZWZpbml0byBkYWxsJ3V0ZW50ZSIKKworIzogZXhfZG9jbWQuYzoxOTI0Cittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFNDkyOiBOb24g6CB1biBjb21hbmRvIGRlbGwnZWRpdG9yIgorCisjOiBleF9kb2NtZC5jOjIwMzEKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IEludGVydmFsbG8gcm92ZXNjaWF0byIKKworIzogZXhfZG9jbWQuYzoyMDQwCittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJJbnRlcnZhbGxvIHJvdmVzY2lhdG8sIE9LIGludmVydGlybG8iCisKKyM6IGV4X2RvY21kLmM6MjE2MworbXNnaWQgIkU0OTQ6IFVzZSB3IG9yIHc+PiIKK21zZ3N0ciAiRTQ5NDogVXNhIHcgb3BwdXJlIHc+PiIKKworIzogZXhfZG9jbWQuYzozNzg5Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiBTcGlhY2VudGUsIGNvbWFuZG8gbm9uIGRpc3BvbmliaWxlIGluIHF1ZXN0YSB2ZXJzaW9uZSIKKworIzogZXhfZG9jbWQuYzozOTkyCittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IEFtbWVzc28gdW4gc29sbyBub21lIGZpbGUiCisKKyM6IGV4X2RvY21kLmM6NDU3MgorbXNnaWQgIjEgbW9yZSBmaWxlIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIjEgdWx0ZXJpb3JlIGZpbGUgZGEgZWxhYm9yYXJlLiAgRXNjbyBsbyBzdGVzc28/IgorCisjOiBleF9kb2NtZC5jOjQ1NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICIlZCB1bHRlcmlvcmkgZmlsZSBkYSBlbGFib3JhcmUuICBFc2NvIGxvIHN0ZXNzbz8iCisKKyM6IGV4X2RvY21kLmM6NDU4MgorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IGFuY29yYSAxIGZpbGUgZGEgZWxhYm9yYXJlIgorCisjOiBleF9kb2NtZC5jOjQ1ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogYW5jb3JhICVsZCBmaWxlIGRhIGVsYWJvcmFyZSIKKworIzogZXhfZG9jbWQuYzo0Njc5Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDogSWwgY29tYW5kbyBlc2lzdGUgZ2ngOiBhZ2dpdW5naSAhIHBlciBzb3N0aXR1aXJsbyIKKworIzogZXhfZG9jbWQuYzo0NzkwCittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgIE5vbWUgICAgICAgIEFyZy4gSW50ZXIgQ29tcGxldG8gIERlZmluaXppb25lIgorCisjOiBleF9kb2NtZC5jOjQ4NzkKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIk5vbiB0cm92byBjb21hbmRpIGRlZmluaXRpIGRhbGwndXRlbnRlIgorCisjOiBleF9kb2NtZC5jOjQ5MTEKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBOZXNzdW4gYXR0cmlidXRvIHNwZWNpZmljYXRvIgorCisjOiBleF9kb2NtZC5jOjQ5NjMKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IE51bWVybyBkaSBhcmdvbWVudGkgbm9uIHZhbGlkbyIKKworIzogZXhfZG9jbWQuYzo0OTc4Cittc2dpZCAiRTE3NzogQ291bnQgY2Fubm90IGJlIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTE3NzogTm9uIHNpIHB18iBzcGVjaWZpY2FyZSBkdWUgdm9sdGUgaWwgY29udGF0b3JlIgorCisjOiBleF9kb2NtZC5jOjQ5ODgKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBWYWxvcmUgcHJlZGVmaW5pdG8gZGVsIGNvbnRhdG9yZSBub24gdmFsaWRvIgorCisjOiBleF9kb2NtZC5jOjUwMTkKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IGFyZ29tZW50byBuZWNlc3NhcmlvIHBlciBjb21wbGV0ZSIKKworIzogZXhfZG9jbWQuYzo1MDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiBWYWxvcmUgJXMgbm9uIHZhbGlkbyBwZXIgJ2NvbXBsZXRlJyIKKworIzogZXhfZG9jbWQuYzo1MDYwCittc2dpZCAiRTQ2ODogQ29tcGxldGlvbiBhcmd1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGN1c3RvbSBjb21wbGV0aW9uIgorbXNnc3RyICIiCisiRTQ2ODogQXJnb21lbnRvIGRpIGNvbXBsZXRhbWVudG8gcGVybWVzc28gc29sbyBwZXIgY29tcGxldGFtZW50byAiCisicGVyc29uYWxpenphdG8iCisKKyM6IGV4X2RvY21kLmM6NTA2NgorbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIiIKKyJFNDY3OiBJbCBjb21wbGV0YW1lbnRvIHBlcnNvbmFsaXp6YXRvIHJpY2hpZWRlIHVuIGFyZ29tZW50byBkaSBmdW56aW9uZSIKKworIzogZXhfZG9jbWQuYzo1MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODE6IEludmFsaWQgYXR0cmlidXRlOiAlcyIKK21zZ3N0ciAiRTE4MTogQXR0cmlidXRvIG5vbiB2YWxpZG86ICVzIgorCisjOiBleF9kb2NtZC5jOjUxMjAKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogTm9tZSBjb21hbmRvIG5vbiB2YWxpZG8iCisKKyM6IGV4X2RvY21kLmM6NTEzNQorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiIgorIkUxODMgSSBjb21hbmRpIGRlZmluaXRpIGRhbGwndXRlbnRlIGRldm9ubyBpbml6aWFyZSBjb24gbGV0dGVyYSBtYWl1c2NvbGEiCisKKyM6IGV4X2RvY21kLmM6NTIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogQ29tYW5kbyBkZWZpbml0byBkYWxsJ3V0ZW50ZSAlcyBpbmVzaXN0ZW50ZSIKKworIzogZXhfZG9jbWQuYzo1NjY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogTm9uIHJpZXNjbyBhIHRyb3ZhcmUgc2NoZW1hIGNvbG9yZSAlcyIKKworIzogZXhfZG9jbWQuYzo1Njc1Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIlNhbHZlLCB1dGVudGUgVmltISIKKworIzogZXhfZG9jbWQuYzo2MzkzCittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIkFwcmkgaWwgRmlsZSBpbiB1bmEgbnVvdmEgZmluZXN0cmEiCisKKyM6IGV4X2RvY21kLmM6NjY4OAorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiTm9uIHBvc3NvIGNyZWFyZSB1biBmaWxlIGRpIHN3YXAiCisKKyM6IGV4X2RvY21kLmM6Njc5MgorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJJbiBhZ2dpdW50YSBhbCBGaWxlIgorCisjOiBleF9kb2NtZC5jOjY4NTYKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IE5vbiBjJ+ggdW5hIGRpcmVjdG9yeSBwcmVjZWRlbnRlIgorCisjOiBleF9kb2NtZC5jOjY5MzgKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiBTY29ub3NjaXV0byIKKworIzogZXhfZG9jbWQuYzo3MDIzCittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IDp3aW5zaXplIHJpY2hpZWRlIGR1ZSBhcmdvbWVudGkgbnVtZXJpY2kiCisKKyM6IGV4X2RvY21kLmM6NzA3OQorIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIlBvc2l6aW9uZSBmaW5lc3RyYTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDg0Cittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiBJbmZvcm1hemlvbmkgcG9zaXppb25lIGZpbmVzdHJhIG5vbiBkaXNwb25pYmlsaSBzdSBxdWVzdGEgcGlhdHRhZm9ybWEiCisKKyM6IGV4X2RvY21kLmM6NzA5NAorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IDp3aW5wb3MgcmljaGllZGUgZHVlIGFyZ29tZW50aSBudW1lcmljaSIKKworIzogZXhfZG9jbWQuYzo3MzcyCittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAiU2FsdmEgUmVkaXJlemlvbmUiCisKKyM6IGV4X2RvY21kLmM6NzU2MgorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiU2FsdmEgVmVkdXRhIgorCisjOiBleF9kb2NtZC5jOjc1NjMKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIlNhbHZhIFNlc3Npb25lIgorCisjOiBleF9kb2NtZC5jOjc1NjUKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJTYWx2YSBTZXR1cCIKKworIzogZXhfZG9jbWQuYzo3NzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIGVzaXN0ZSAoYWdnaXVuZ2kgISBwZXIgZXNlZ3VpcmUgY29tdW5xdWUpIgorCisjOiBleF9kb2NtZC5jOjc3MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiBOb24gcmllc2NvIGFkIGFwcmlyZSBcIiVzXCIgaW4gc2NyaXR0dXJhIgorCisjLiBzZXQgbWFyaworIzogZXhfZG9jbWQuYzo3NzQ2Cittc2dpZCAiRTE5MTogQXJndW1lbnQgbXVzdCBiZSBhIGxldHRlciBvciBmb3J3YXJkL2JhY2t3YXJkIHF1b3RlIgorbXNnc3RyICIiCisiRTE5MTogTCdhcmdvbWVudG8gZGV2ZSBlc3NlcmUgdW5hIGxldHRlcmEsIG9wcHVyZSB1biBhcGljZS9hcGljZSByZXRyb3ZlcnNvIgorCisjOiBleF9kb2NtZC5jOjc3ODgKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IFVzbyByaWNvcnNpdm8gZGkgOm5vcm1hbCB0cm9wcG8gZXN0ZXNvIgorCisjOiBleF9kb2NtZC5jOjgzMDYKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogTmVzc3VuIG5vbWUgZmlsZSBhbHRlcm5hdGl2byBkYSBzb3N0aXR1aXJlIGEgJyMnIgorCisjOiBleF9kb2NtZC5jOjgzMzcKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIkU0OTU6IG5lc3N1biBmaWxlIGRpIGF1dG9jb21hbmRpIGRhIHNvc3RpdHVpcmUgcGVyIFwiPGFmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNDUKK21zZ2lkICJFNDk2OiBubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIiIKKyJFNDk2OiBuZXNzdW4gbnVtZXJvIGRpIGJ1ZmZlciBkaSBhdXRvY29tYW5kaSBkYSBzb3N0aXR1aXJlIHBlciBcIjxhYnVmPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNTYKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiIgorIkU0OTc6IG5lc3N1biBub21lIGRpIGF1dG9jb21hbmRpIHRyb3ZhdG8gZGEgc29zdGl0dWlyZSBwZXIgXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNjYKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiIgorIkU0OTg6IG5lc3N1biBub21lIGRpIGZpbGUgOnNvdXJjZSB0cm92YXRvIGRhIHNvc3RpdHVpcmUgcGVyIFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjg0MDcKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIkU0OTk6IFVuIG5vbWUgZGkgZmlsZSBudWxsbyBwZXIgJyUnIG9yICcjJywgdmEgYmVuZSBzb2xvIGNvbiBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo4NDA5Cittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDogSWwgdmFsb3JlIOggdW5hIHN0cmluZ2EgbnVsbGEiCisKKyM6IGV4X2RvY21kLmM6OTM4MAorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogTm9uIHBvc3NvIGFwcmlyZSBpbCBmaWxlIHZpbWluZm8gaW4gbGV0dHVyYSIKKworIzogZXhfZG9jbWQuYzo5NTUzCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBEaWdyYW1taSBub24gc3VwcG9ydGF0aSBpbiBxdWVzdGEgdmVyc2lvbmUiCisKKyM6IGV4X2V2YWwuYzo0NDAKK21zZ2lkICJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiCittc2dzdHIgIkU2MDg6IEltcG9zc2liaWxlIGxhbmNpYXJlIGVjY2V6aW9uaSBjb24gcHJlZmlzc28gJ1ZpbSciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAiRWNjZXppb25lIGxhbmNpYXRhOiAlcyIKKworIzogZXhfZXZhbC5jOjU3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZmluaXNoZWQ6ICVzIgorbXNnc3RyICJFY2NlemlvbmUgZmluaXRhOiAlcyIKKworIzogZXhfZXZhbC5jOjU3NworIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZGlzY2FyZGVkOiAlcyIKK21zZ3N0ciAiRWNjZXppb25lIHNjYXJ0YXRhOiAlcyIKKworIzogZXhfZXZhbC5jOjYyMCBleF9ldmFsLmM6NjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzLCBsaW5lICVsZCIKK21zZ3N0ciAiJXMsIGxpbmVhICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICJFY2NlemlvbmUgaW50ZXJjZXR0YXRhOiAlcyIKKworIzogZXhfZXZhbC5jOjcxMworIywgYy1mb3JtYXQKK21zZ2lkICIlcyBtYWRlIHBlbmRpbmciCittc2dzdHIgIiVzIHJlc28gJ3BlbmRpbmcnIgorCisjOiBleF9ldmFsLmM6NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJlc3VtZWQiCittc2dzdHIgIiVzIHJpcHJpc3RpbmF0byIKKworIzogZXhfZXZhbC5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzIHNjYXJ0YXRvIgorCisjOiBleF9ldmFsLmM6NzQ2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICJFY2NlemlvbmUiCisKKyM6IGV4X2V2YWwuYzo3NTIKK21zZ2lkICJFcnJvciBhbmQgaW50ZXJydXB0IgorbXNnc3RyICJFcnJvcmUgZWQgaW50ZXJydXppb25lIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzODEKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiRXJyb3JlIgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAiSW50ZXJydXppb25lIgorCisjOiBleF9ldmFsLmM6ODMwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IG5pZGlmaWNhemlvbmUgZGkgOmlmIHRyb3BwbyBlc3Rlc2EiCisKKyM6IGV4X2V2YWwuYzo4NjcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IDplbmRpZiBzZW56YSA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2Ugc2VuemEgOmlmIgorCisjOiBleF9ldmFsLmM6OTE0Cittc2dpZCAiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MjogOmVsc2VpZiBzZW56YSA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MjEKK21zZ2lkICJFNTgzOiBtdWx0aXBsZSA6ZWxzZSIKK21zZ3N0ciAiRTU4MzogOmVsc2UgbXVsdGlwbGkiCisKKyM6IGV4X2V2YWwuYzo5MjQKK21zZ2lkICJFNTg0OiA6ZWxzZWlmIGFmdGVyIDplbHNlIgorbXNnc3RyICJFNTg0OiA6ZWxzZWlmIGRvcG8gOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5OTEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogbmlkaWZpY2F6aW9uZSBkaSA6d2hpbGUgdHJvcHBvIGVzdGVzYSIKKworIzogZXhfZXZhbC5jOjEwNDcKK21zZ2lkICJFNTg2OiA6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODY6IDpjb250aW51ZSBzZW56YSA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDg3Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiA6YnJlYWsgc2VuemEgOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTI4NgorbXNnaWQgIkU2MDE6IDp0cnkgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTYwMTogbmlkaWZpY2F6aW9uZSBkaSA6dHJ5IHRyb3BwbyBlc3Rlc2EiCisKKyM6IGV4X2V2YWwuYzoxMzY2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOmNhdGNoIHNlbnphIDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gKiBKdXN0IHBhcnNlLgorIzogZXhfZXZhbC5jOjEzODgKK21zZ2lkICJFNjA0OiA6Y2F0Y2ggYWZ0ZXIgOmZpbmFsbHkiCittc2dzdHIgIkU2MDQ6IDpjYXRjaCBkb3BvIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgc2VuemEgOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSBtdWx0aXBsZSAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjOiBleF9ldmFsLmM6MTU0NQorbXNnaWQgIkU2MDc6IG11bHRpcGxlIDpmaW5hbGx5IgorbXNnc3RyICJFNjA3OiA6ZmluYWxseSBtdWx0aXBsaSIKKworIzogZXhfZXZhbC5jOjE2NTQKK21zZ2lkICJFNjAyOiA6ZW5kdHJ5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMjogOmVuZHRyeSBzZW56YSA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTk4NgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IDplbmRmdW5jdGlvbiBub24gY29udGVudXRvIGluIHVuYSBmdW56aW9uZSIKKworIzogZXhfZ2V0bG4uYzozMjk5Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAibm9tZV90YWciCisKKyM6IGV4X2dldGxuLmM6MzMwMgorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIHRpcG8gZmlsZVxuIgorCisjOiBleF9nZXRsbi5jOjQ3NjgKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgImwnb3B6aW9uZSAnaGlzdG9yeScg6CBhIHplcm8iCisKKyM6IGV4X2dldGxuLmM6NTAzOQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgJXMgU3RvcmlhIChkYSBwafkgcmVjZW50ZSBhIG1lbm8gcmVjZW50ZSk6XG4iCisKKyM6IGV4X2dldGxuLmM6NTA0MAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAiTGluZWEgZGkgQ29tYW5kbyIKKworIzogZXhfZ2V0bG4uYzo1MDQxCittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAiU3RyaW5nYSBkaSBSaWNlcmNhIgorCisjOiBleF9nZXRsbi5jOjUwNDIKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJFc3ByZXNzaW9uZSIKKworIzogZXhfZ2V0bG4uYzo1MDQzCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiTGluZWEgZGkgSW5wdXQiCisKKyM6IGV4X2dldGxuLmM6NTA4MQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgZG9wbyBsYSBmaW5lIGRlbCBjb21hbmRvIgorCisjOiBleF9nZXRsbi5jOjUyNTgKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBGaW5lc3RyYSBhdHRpdmEgbyBidWZmZXIgY2FuY2VsbGF0byIKKworIzogZmlsZWlvLmM6Mzc4Cittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIk5vbWUgZGkgZmlsZSBub24gYW1tZXNzbyIKKworIzogZmlsZWlvLmM6NDAyIGZpbGVpby5jOjU0MCBmaWxlaW8uYzoyOTI1IGZpbGVpby5jOjI5NjYKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAi6CB1bmEgZGlyZWN0b3J5IgorCisjOiBmaWxlaW8uYzo0MDQKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJub24g6CB1biBmaWxlIgorCisjOiBmaWxlaW8uYzo1NjIgZmlsZWlvLmM6NDE0MworbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltGaWxlIG51b3ZvXSIKKworIzogZmlsZWlvLmM6NTk1Cittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW1RpcG8gZGkgYWNjZXNzbyBub24gY29uc2VudGl0b10iCisKKyM6IGZpbGVpby5jOjcwNgorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6IEdsaSBhdXRvY29tYW5kICpSZWFkUHJlIGhhbm5vIHJlc28gaWwgZmlsZSBpbGxlZ2dpYmlsZSIKKworIzogZmlsZWlvLmM6NzA4Cittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogR2xpIGF1dG9jb21hbmRpICpSZWFkUHJlIG5vbiBkZXZvbm8gbW9kaWZpY2FyZSBpbCBidWZmZXIgaW4gdXNvIgorCisjOiBmaWxlaW8uYzo3MjkKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IExlZ2dvIGRhICdzdGRpbicuLi5cbiIKKworIzogZmlsZWlvLmM6NzM1Cittc2dpZCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uIgorbXNnc3RyICJMZWdnbyBkYSAnc3RkaW4nLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjEwMTIKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogTGEgY29udmVyc2lvbmUgaGEgcmVzbyBpbCBmaWxlIGlsbGVnZ2liaWxlISIKKworIzogZmlsZWlvLmM6MjEwMgorbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltmaWZvL3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjIxMDkKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltmaWZvXSIKKworIzogZmlsZWlvLmM6MjExNgorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJbc29ja2V0XSIKKworIzogZmlsZWlvLmM6MjEyNAorbXNnaWQgIltST10iCittc2dzdHIgIltTb2xhIExldHR1cmFdIgorCisjOiBmaWxlaW8uYzoyMTM0Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbbWFuY2EgQ1JdIgorCisjOiBmaWxlaW8uYzoyMTM5Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW3Ryb3ZhdGEgTkxdIgorCisjOiBmaWxlaW8uYzoyMTQ0Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbbGluZWUgbHVuZ2hlIGRpdmlzZV0iCisKKyM6IGZpbGVpby5jOjIxNTAgZmlsZWlvLmM6NDEyNworbXNnaWQgIltOT1QgY29udmVydGVkXSIKK21zZ3N0ciAiW05PTiBjb252ZXJ0aXRvXSIKKworIzogZmlsZWlvLmM6MjE1NSBmaWxlaW8uYzo0MTMyCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIltjb252ZXJ0aXRvXSIKKworIzogZmlsZWlvLmM6MjE2MiBmaWxlaW8uYzo0MTU3Cittc2dpZCAiW2NyeXB0ZWRdIgorbXNnc3RyICJbY3JpdHRvZ3JhZmF0b10iCisKKyM6IGZpbGVpby5jOjIxNjkKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltFUlJPUkUgREkgQ09OVkVSU0lPTkVdIgorCisjOiBmaWxlaW8uYzoyMTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIltJTExFR0FMIEJZVEUgaW4gbGluZSAlbGRdIgorbXNnc3RyICJbQllURSBOT04gVkFMSURPIGFsbGEgbGluZWEgJWxkXSIKKworIzogZmlsZWlvLmM6MjE4MgorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltFUlJPUkkgSU4gTEVUVFVSQV0iCisKKyM6IGZpbGVpby5jOjIzOTgKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAiTm9uIHJpZXNjbyBhIHRyb3ZhcmUgaWwgZmlsZSB0ZW1wIHBlciBsZWdnZXJsbyIKKworIzogZmlsZWlvLmM6MjQwNQorbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiQ29udmVyc2lvbmUgZmFsbGl0YSBjb24gJ2NoYXJjb252ZXJ0JyIKKworIzogZmlsZWlvLmM6MjQwOAorbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIm5vbiByaWVzY28gYSBsZWdnZXJlIGlsIHJpc3VsdGF0byBkaSAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyODA4Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIkUyMDM6IEJ1ZmZlciBpbiBzY3JpdHR1dGEgY2FuY2VsbGF0byBvIHNjYXJpY2F0byBkYWdsaSBhdXRvY29tYW5kaSIKKworIzogZmlsZWlvLmM6MjgzMQorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiBMJ2F1dG9jb21hbmRvIGhhIG1vZGlmaWNhdG8gbnVtZXJvIGxpbmVlIGluIG1hbmllcmEgaW1wcmV2aXN0YSIKKworIzogZmlsZWlvLmM6Mjg2OQorbXNnaWQgIk5ldEJlYW5zIGRpc3NhbGxvd3Mgd3JpdGVzIG9mIHVubW9kaWZpZWQgYnVmZmVycyIKK21zZ3N0ciAiTmV0QmVhbnMgbm9uIHBlcm1ldHRlIGxhIHNjcml0dHVyYSBkaSB1biBidWZmZXIgbm9uIG1vZGlmaWNhdG8iCisKKyM6IGZpbGVpby5jOjI4NzcKK21zZ2lkICJQYXJ0aWFsIHdyaXRlcyBkaXNhbGxvd2VkIGZvciBOZXRCZWFucyBidWZmZXJzIgorbXNnc3RyICJTY3JpdHR1cmEgcGFyemlhbGUgZGlzYWJpbGl0YXRhIHBlciBpIGJ1ZmZlciBkaSBOZXRCZWFucyIKKworIzogZmlsZWlvLmM6MjkzMSBmaWxlaW8uYzoyOTQ5Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIm5vbiDoIHVuIGZpbGUgbyB1biBkaXNwb3NpdGl2byBzdSBjdWkgc2kgcG9zc2Egc2NyaXZlcmUiCisKKyM6IGZpbGVpby5jOjMwMDEKK21zZ2lkICJpcyByZWFkLW9ubHkgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAi6CBpbiBzb2xhIGxldHR1cmUgKGFnZ2l1bmdpICEgcGVyIGVzZWd1aXJlIGNvbXVucXVlKSIKKworIzogZmlsZWlvLmM6MzM0NworbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNTA2OiBOb24gcG9zc28gc2NyaXZlcmUgc3VsIGZpbGUgZGkgYmFja3VwIChhZ2dpdW5naSAhIHBlciBlc2VndWlyZSAiCisiY29tdW5xdWUpIgorCisjOiBmaWxlaW8uYzozMzU5Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNTA3OiBFcnJvcmUgaW4gY2hpdXN1cmEgc3VsIGZpbGUgZGkgYmFja3VwIChhZ2dpdW5naSAhIHBlciBlc2VndWlyZSAiCisiY29tdW5xdWUpIgorCisjOiBmaWxlaW8uYzozMzYxCittc2dpZCAiRTUwODogQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU1MDg6IE5vbiByaWVzY28gYSBsZWdnZXJlIGlsIGZpbGUgZGkgYmFja3VwIChhZ2dpdW5naSAhIHBlciBlc2VndWlyZSAiCisiY29tdW5xdWUpIgorCisjOiBmaWxlaW8uYzozMzc3Cittc2dpZCAiRTUwOTogQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUwOTogTm9uIHBvc3NvIGNyZWFyZSBpbCBmaWxlIGRpIGJhY2t1cCAoYWdnaXVuZ2kgISBwZXIgZXNlZ3VpcmUgY29tdW5xdWUpIgorCisjOiBmaWxlaW8uYzozNDgwCittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUxMDogTm9uIHBvc3NvIGZhcmUgaWwgZmlsZSBkaSBiYWNrdXAgKGFnZ2l1bmdpICEgcGVyIGVzZWd1aXJlIGNvbXVucXVlKSIKKworIzogZmlsZWlvLmM6MzU0MgorbXNnaWQgIkU0NjA6IFRoZSByZXNvdXJjZSBmb3JrIHdvdWxkIGJlIGxvc3QgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU0NjA6IExhICdmb3JrJyBzdWxsYSByaXNvcnNhIHZlcnJlYmJlIHBlcnNhIChhZ2dpdW5naSAhIHBlciBlc2VndWlyZSAiCisiY29tdW5xdWUpIgorCisjOiBmaWxlaW8uYzozNjUyCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IE5vbiByaWVzY28gYSB0cm92YXJlIHVuIGZpbGUgJ3RlbXAnIHN1IGN1aSBzY3JpdmVyZSIKKworIzogZmlsZWlvLmM6MzY3MAorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0IChhZGQgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICIiCisiRTIxMzogTm9uIHJpZXNjbyBhIGNvbnZlcnRpcmUgKGFnZ2l1bmdpICEgcGVyIHNjcml2ZXJlIHNlbnphIGNvbnZlcnNpb25lKSIKKworIzogZmlsZWlvLmM6MzcwNQorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IE5vbiBwb3NzbyBhcHJpcmUgaWwgZmlsZSBjb2xsZWdhdG8gKCdsaW5rZWQnKSBpbiBzY3JpdHR1cmEiCisKKyM6IGZpbGVpby5jOjM3MDkKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IE5vbiBwb3NzbyBhcHJpcmUgaWwgZmlsZSBpbiBzY3JpdHR1cmEiCisKKyM6IGZpbGVpby5jOjM5NzEKK21zZ2lkICJFNjY3OiBGc3luYyBmYWlsZWQiCittc2dzdHIgIkU2Njc6IEZzeW5jIGZhbGxpdG8iCisKKyM6IGZpbGVpby5jOjM5NzgKK21zZ2lkICJFNTEyOiBDbG9zZSBmYWlsZWQiCittc2dzdHIgIkU1MTI6IENoaXVzdXJhIGZhbGxpdGEiCisKKyM6IGZpbGVpby5jOjQwNDkKK21zZ2lkICJFNTEzOiB3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIkU1MTM6IGVycm9yZSBpbiBzY3JpdHR1cmEsIGNvbnZlcnNpb25lIGZhbGxpdGEiCisKKyM6IGZpbGVpby5jOjQwNTUKK21zZ2lkICJFNTE0OiB3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJFNTE0OiBlcnJvcmUgaW4gc2NyaXR0dXJhICgnRmlsZSBTeXN0ZW0nIHBpZW5vPykiCisKKyM6IGZpbGVpby5jOjQxMjIKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIEVSUk9SRSBESSBDT05WRVJTSU9ORSIKKworIzogZmlsZWlvLmM6NDEzOAorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJbRGlzcG9zaXRpdm9dIgorCisjOiBmaWxlaW8uYzo0MTQzCittc2dpZCAiW05ld10iCittc2dzdHIgIltOdW92b10iCisKKyM6IGZpbGVpby5jOjQxNjUKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW2FdIgorCisjOiBmaWxlaW8uYzo0MTY1Cittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgYWdnaXVudG8gaW4gZm9uZG8iCisKKyM6IGZpbGVpby5jOjQxNjcKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3NdIgorCisjOiBmaWxlaW8uYzo0MTY3Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiBzY3JpdHRpIgorCisjOiBmaWxlaW8uYzo0MjE3Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IFBhdGNobW9kZTogbm9uIHBvc3NvIHNhbHZhcmUgaWwgZmlsZSBvcmlnaW5hbGUiCisKKyM6IGZpbGVpby5jOjQyMzkKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogbm9uIHBvc3NvIGFsdGVyYXJlIGlsIGZpbGUgdnVvdG8gb3JpZ2luYWxlIgorCisjOiBmaWxlaW8uYzo0MjU0Cittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMTkzOiBOb24gcmllc2NvIGEgY2FuY2VsbGFyZSBpbCBmaWxlIGRpIGJhY2t1cCIKKworIzogZmlsZWlvLmM6NDMxOAorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFUVEVOWklPTkU6IElsIGZpbGUgb3JpZ2luYWxlIHB18iBlc3NlcmUgcGVyc28gbyBkYW5uZWdnaWF0b1xuIgorCisjOiBmaWxlaW8uYzo0MzIwCittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAibm9uIHVzY2lyZSBkYWxsJ2VkaXRvciBwcmltYSBkZWxsYSBmaW5lIGRlbGxhIHNjcml0dHVyYSBkZWwgZmlsZSEiCisKKyM6IGZpbGVpby5jOjQ0MDkKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW0RPU10iCisKKyM6IGZpbGVpby5jOjQ0MDkKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltpbiBmb3JtYXRvIERPU10iCisKKyM6IGZpbGVpby5jOjQ0MTYKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW01BQ10iCisKKyM6IGZpbGVpby5jOjQ0MTYKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIltpbiBmb3JtYXRvIE1BQ10iCisKKyM6IGZpbGVpby5jOjQ0MjMKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIltVTklYXSIKKworIzogZmlsZWlvLmM6NDQyMworbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIltpbiBmb3JtYXRvIFVOSVhdIgorCisjOiBmaWxlaW8uYzo0NDUwCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgbGluZWEsICIKKworIzogZmlsZWlvLmM6NDQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIGxpbmVlLCIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIGNhcmF0dGVyZSIKKworIzogZmlsZWlvLmM6NDQ1NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhcmFjdGVycyIKK21zZ3N0ciAiJWxkIGNhcmF0dGVyaSIKKworIzogZmlsZWlvLmM6NDQ2NworbXNnaWQgIltub2VvbF0iCittc2dzdHIgIlttYW5jYSBjYXJhdHRlcmUgZGkgZmluZSBsaW5lYV0iCisKKyM6IGZpbGVpby5jOjQ0NjcKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJbVWx0aW1hIGxpbmVhIGluY29tcGxldGFdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjQ0ODYKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIkFUVEVOWklPTkU6IEZpbGUgbW9kaWZpY2F0byBkb3BvIGVzc2VyZSBzdGF0byBsZXR0byBkYWxsJ0VkaXRvciEhISIKKworIzogZmlsZWlvLmM6NDQ4OAorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiVnVvaSBkYXZ2ZXJvIHJpc2NyaXZlcmxvIgorCisjOiBmaWxlaW8uYzo1NzM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBFcnJvcmUgaW4gc2NyaXR0dXJhIGRpIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogRXJyb3JlIGluIGNoaXVzdXJhIGRpIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTc0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDogRXJyb3JlIGluIGxldHR1cmEgZGkgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1OTgyCittc2dpZCAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTI0NjogTCdhdXRvY29tYW5kbyAnRmlsZUNobmFnZWRTaGVsbCcgaGEgY2FuY2VsbGF0byBpbCBidWZmZXIiCisKKyM6IGZpbGVpby5jOjU5ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogQXR0ZW56aW9uZTogSWwgZmlsZSBcIiVzXCIgbm9uIGVzaXN0ZSBwafkiCisKKyM6IGZpbGVpby5jOjYwMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBBdHRlbnppb25lOiBGaWxlIFwiJXNcIiBtb2RpZmljYXRvIHN1IGRpc2NvIGVkIGFuY2hlIG5lbCBidWZmZXIgZGkgVmltIgorCisjOiBmaWxlaW8uYzo2MDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IEF0dGVuemlvbmU6IEZpbGUgXCIlc1wiIG1vZGlmaWNhdG8gZG9wbyBsJ2FwZXJ0dXJhIgorCisjOiBmaWxlaW8uYzo2MDA4CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogQXR0ZW56aW9uZTogTW9kbyBGaWxlIFwiJXNcIiBtb2RpZmljYXRvIGRvcG8gbCdhcGVydHVyYSIKKworIzogZmlsZWlvLmM6NjAxOAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IEF0dGVuemlvbmU6IElsIGZpbGUgXCIlc1wiIHJpc3VsdGEgY3JlYXRvIGRvcG8gbCdhcGVydHVyYSIKKworIzogZmlsZWlvLmM6NjAzMQorbXNnaWQgIlNlZSBcIjpoZWxwIFcxMVwiIGZvciBtb3JlIGluZm8uIgorbXNnc3RyICJWZWRlcmUgXCI6aGVscCBXMTFcIiBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4iCisKKyM6IGZpbGVpby5jOjYwNDUKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICJBdHRlbnppb25lIgorCisjOiBmaWxlaW8uYzo2MDQ2Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImQ2FyaWNhIEZpbGUiCisKKyM6IGZpbGVpby5jOjYxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MjogQ291bGQgbm90IHByZXBhcmUgZm9yIHJlbG9hZGluZyBcIiVzXCIiCittc2dzdHIgIkU0NjI6IE5vbiByaWVzY28gYSBwcmVwYXJhcmUgcGVyIHJpLWNhcmljYXJlIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NjE3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogTm9uIHJpZXNjbyBhIHJpLWNhcmljYXJlIFwiJXNcIiIKKworIzogZmlsZWlvLmM6Njc1MgorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLUNhbmNlbGxhdG8tLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjY5MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBHcnVwcG8gaW5lc2lzdGVudGU6IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogQ2FyYXR0ZXJlIG5vbiBhbW1lc3NvIGRvcG8gKjogJXMiCisKKyM6IGZpbGVpby5jOjcwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IEV2ZW50byBpbmVzaXN0ZW50ZTogJXMiCisKKyM6IGZpbGVpby5jOjcwNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IEV2ZW50byBvIGdydXBwbyBpbmVzaXN0ZW50ZTogJXMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogZmlsZWlvLmM6NzIxMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gQXV0by1Db21tYW5kcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gQXV0by1Db21hbmRpIC0tLSIKKworIzogZmlsZWlvLmM6NzQ4MQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBOb24gcG9zc28gZXNlZ3VpcmUgYXV0b2NvbWFuZGkgZm9yIFRVVFRJIGdsaSBldmVudGkiCisKKyM6IGZpbGVpby5jOjc1MDQKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIk5lc3N1biBhdXRvY29tYW5kbyBjb3JyaXNwb25kZW50ZSIKKworIzogZmlsZWlvLmM6NzgyNQorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IG5pZGlmaWNhemlvbmUgZGVsbCdhdXRvY29tYW5kbyB0cm9wcG8gZXN0ZXNhIgorCisjOiBmaWxlaW8uYzo4MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgQXV0byBjb21hbmRpIHBlciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjgxMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJFc2VndW8gJXMiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6ODE3NgorIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiYXV0b2NvbWFuZG8gJXMiCisKKyM6IGZpbGVpby5jOjg3NDMKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBNYW5jYSB7LiIKKworIzogZmlsZWlvLmM6ODc0NQorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IE1hbmNhIH0uIgorCisjOiBmb2xkLmM6NjgKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiBOb24gdHJvdm8gYWxjdW5hIHBpZWdhdHVyYSIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBOb24gcG9zc28gY3JlYXRlIHBpZWdhdHVyYSBjb24gaWwgJ2ZvbGRtZXRob2QnIGluIHVzbyIKKworIzogZm9sZC5jOjU5NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiBOb24gcG9zc28gY2FuY2VsbGFyZSBwaWVnYXR1cmEgY29uIGlsICdmb2xkbWV0aG9kJyBpbiB1c28iCisKKyM6IGdldGNoYXIuYzoyNDgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IEFnZ2l1bnRvIGFsIGJ1ZmZlciBkaSBsZXR0dXJhIgorCisjOiBnZXRjaGFyLmM6MjIwOAorbXNnaWQgIkUyMjM6IHJlY3Vyc2l2ZSBtYXBwaW5nIgorbXNnc3RyICJFMjIzOiBtYXBwaW5nIHJpY29yc2l2byIKKworIzogZ2V0Y2hhci5jOjMwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6IHVuYSBhYmJyZXZpYXppb25lIGdsb2JhbGUgZ2ngIGVzaXN0ZSBwZXIgJXMiCisKKyM6IGdldGNoYXIuYzozMDkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogdW4gbWFwcGluZyBnbG9iYWxlIGdp4CBlc2lzdGUgcGVyICVzIgorCisjOiBnZXRjaGFyLmM6MzIyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiB1bmEgYWJicmV2aWF6aW9uZSBnaeAgZXNpc3RlIHBlciAlcyIKKworIzogZ2V0Y2hhci5jOjMyMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IHVuIG1hcHBpbmcgZ2ngIGVzaXN0ZSBwZXIgJXMiCisKKyM6IGdldGNoYXIuYzozMjg5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJOb24gdHJvdm8gbCdhYmJyZXZpYXppb25lIgorCisjOiBnZXRjaGFyLmM6MzI5MQorbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIk5vbiB0cm92byBpbCBtYXBwaW5nIgorCisjOiBnZXRjaGFyLmM6NDE4MworbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDogbW9kbyBub24gY29uc2VudGl0byIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjxub24gcG9zc28gYXByaXJlPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogbm9uIHJpZXNjbyBhIHRyb3ZhcmUgaWwgZm9udCAlcyIKKworIzogZ3VpX2F0X2ZzLmM6Mjc4MQorbXNnaWQgIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTQ6IHZpbV9TZWxGaWxlOiBub24gcG9zc28gdG9ybmFyZSBhbGxhIGRpcmVjdG9yeSBpbiB1c28iCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIk5vbWUgcGVyY29yc286IgorCisjOiBndWlfYXRfZnMuYzoyODA3Cittc2dpZCAiRTYxNTogdmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNTogdmltX1NlbEZpbGU6IG5vbiByaWVzY28gYWQgb3R0ZW5lcmUgbGEgZGlyZWN0b3J5IGluIHVzbyIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiTm9uIGVzZWd1aXJlIgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiRGlhbG9nbyBWaW0iCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAiU2Nyb2xsYmFyIFdpZGdldDogTm9uIHJpZXNjbyBhIG90dGVuZXJlIGdlb21ldHJpYSBkZWwgJ3RodW1iIHBpeG1hcCcuIgorCisjOiBndWlfYmV2YWwuYzoxMDEgZ3VpX3czMi5jOjM5NzgKK21zZ2lkICJFMjMyOiBDYW5ub3QgY3JlYXRlIEJhbGxvb25FdmFsIHdpdGggYm90aCBtZXNzYWdlIGFuZCBjYWxsYmFjayIKK21zZ3N0ciAiRTIzMjogTm9uIHJpZXNjbyBhIGNyZWFyZSAnQmFsbG9vbkV2YWwnIGNvbiBzaWEgbWVzc2FnZ2lvIGNoZSBjYWxsYmFjayIKKworIzogZ3VpLmM6MjIwCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IE5vbiBwb3NzbyBpbml6aWFsaXp6YXJlIGxhIEdVSSIKKworIzogZ3VpLmM6MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBOb24gcG9zc28gbGVnZ2VyZSBkYSBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIkU2NjU6IE5vbiBwb3NzbyBpbml6aWFsaXp6YXJlIGxhIEdVSSwgbmVzc3VuIGZvbnQgdmFsaWRvIHRyb3ZhdG8iCisKKyM6IGd1aS5jOjQ3NworbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogJ2d1aWZvbnR3aWRlJyBub24gdmFsaWRvIgorCisjOiBndWkuYzo1NDcKK21zZ2lkICJFNTk5OiBWYWx1ZSBvZiAnaW1hY3RpdmF0ZWtleScgaXMgaW52YWxpZCIKK21zZ3N0ciAiRTU5OTogSWwgdmFsb3JlIGRpICdpbWFjdGl2YXRla2V5JyBub24g6CB2YWxpZG8iCisKKyM6IGd1aS5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiBOb24gcmllc2NvIGFkIGFsbG9jYXJlIGlsIGNvbG9yZSAlcyIKKworIzogZ3VpX2d0ay5jOjE2MDcKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJEaWFsb2dvIFZpbS4uLiIKKworIzogZ3VpX2d0ay5jOjIwNjAgbWVzc2FnZS5jOjI5OTkKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImWSBT7FxuIgorIiZOb1xuIgorIiZDIElnbm9yYSIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAiX01ldG9kaSBkaSBpbnNlcmltZW50byIKKworIzogZ3VpX2d0ay5jOjI1MzQgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gU29zdGl0dWlzY2kuLi4iCisKKyM6IGd1aV9ndGsuYzoyNTQyIGd1aV9tb3RpZi5jOjI3NzAKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIENlcmNhLi4uIgorCisjOiBndWlfZ3RrLmM6MjU3NCBndWlfbW90aWYuYzoyODg4Cittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAiVHJvdmEgY29zYToiCisKKyM6IGd1aV9ndGsuYzoyNTkyIGd1aV9tb3RpZi5jOjI5MjAKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICJTb3N0aXR1aXNjaSBjb246IgorCisjLiB3aG9sZSB3b3JkIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYyNCBndWlfbW90aWYuYzozMDM2Cittc2dpZCAiTWF0Y2ggd2hvbGUgd29yZCBvbmx5IgorbXNnc3RyICJDZXJjYSBzb2xvIGxhIHBhcm9sYSBpbnRlcmEiCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYzNSBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAiTWFpdXNjb2xlL21pbnVzY29sZSIKKworIzogZ3VpX2d0ay5jOjI2NDUgZ3VpX21vdGlmLmM6Mjk5MAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAiRGlyZXppb25lIgorCisjLiAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIzogZ3VpX2d0ay5jOjI2NTcgZ3VpX21vdGlmLmM6MzAwMgorbXNnaWQgIlVwIgorbXNnc3RyICJTdSIKKworIzogZ3VpX2d0ay5jOjI2NjEgZ3VpX21vdGlmLmM6MzAxMAorbXNnaWQgIkRvd24iCittc2dzdHIgIkdp+SIKKworIzogZ3VpX2d0ay5jOjI2ODMgZ3VpX2d0ay5jOjI2ODUgZ3VpX21vdGlmLmM6Mjc5MgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAiVHJvdmEgaWwgUHJvc3NpbW8iCisKKyM6IGd1aV9ndGsuYzoyNzAyIGd1aV9ndGsuYzoyNzA0IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJTb3N0aXR1aXNjaSIKKworIzogZ3VpX2d0ay5jOjI3MTUgZ3VpX2d0ay5jOjI3MTcgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJTb3N0aXR1aXNjaSBUdXR0byIKKworIzogZ3VpX2d0a194MTEuYzoyMzI3Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiBSaWNldnV0YSByaWNoaWVzdGEgXCJkaWVcIiBkYWwgc2Vzc2lvbiBtYW5hZ2VyXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOQorbXNnaWQgIlZpbTogTWFpbiB3aW5kb3cgdW5leHBlY3RlZGx5IGRlc3Ryb3llZFxuIgorbXNnc3RyICJWaW06IEZpbmVzdHJhIHByaW5jaXBhbGUgZGlzdHJ1dHRhIGluYXNwZXR0YXRhbWVudGVcbiIKKworIzogZ3VpX2d0a194MTEuYzo0MTM4Cittc2dpZCAiRm9udCBTZWxlY3Rpb24iCittc2dzdHIgIlNlbGV6aW9uZSBGb250IgorCisjOiBndWlfZ3RrX3gxMS5jOjYwMzUgdWkuYzoyMTIwCittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiVXNvIENVVF9CVUZGRVIwIGludmVjZSBjaGUgdW5hIHNjZWx0YSBudWxsYSIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0cm8iCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiRGlyZWN0b3J5IgorCisjOiBndWlfbW90aWYuYzoxNjIxCittc2dpZCAiSGVscCIKK21zZ3N0ciAiQWl1dG8iCisKKyM6IGd1aV9tb3RpZi5jOjE2MjIKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAiRmlsZSIKKworIzogZ3VpX21vdGlmLmM6MTYyNAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiU2VsZXppb25lIgorCisjOiBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiRGlzZmEiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiBOb24gcmllc2NvIGEgY2FyaWNhdGUgaWwgZm9udGUgWmFwICclcyciCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiBOb24gcmllc2NvIGEgdXNhcmUgaWwgZm9udCAlcyIKKworIzogZ3VpX3Jpc2Nvcy5jOjMyNzAKK21zZ2lkICIiCisiXG4iCisiU2VuZGluZyBtZXNzYWdlIHRvIHRlcm1pbmF0ZSBjaGlsZCBwcm9jZXNzLlxuIgorbXNnc3RyICIiCisiXG4iCisiU3BlZGlzY28gdW4gbWVzc2FnZ2lvIHBlciB0ZXJtaW5hcmUgaWwgcHJvY2Vzc28gZmlnbGlvLlxuIgorCisjOiBndWlfdzMyLmM6ODM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NzE6IENhbm5vdCBmaW5kIHdpbmRvdyB0aXRsZSBcIiVzXCIiCittc2dzdHIgIkU2NzE6IE5vbiB0cm92byBpbCB0aXRvbG8gZGVsbGEgZmluZXN0cmEgXCIlc1wiIgorCisjOiBndWlfdzMyLmM6ODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBBcmdvbWVudG8gbm9uIHN1cHBvcnRhdG86IFwiLSVzXCI7IFVzYSBsYSB2ZXJzaW9uZSBPTEUuIgorCisjOiBndWlfdzMyLmM6MTEwMAorbXNnaWQgIkU2NzI6IFVuYWJsZSB0byBvcGVuIHdpbmRvdyBpbnNpZGUgTURJIGFwcGxpY2F0aW9uIgorbXNnc3RyICJFNjcyOiBOb24gcG9zc28gYXByaXJlIGxhIGZpbmVzdHJhIGluIHVuJ2FwcGxpY2F6aW9uZSBNREkiCisKKyM6IGd1aV93NDguYzoyMTYzCittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiU3RyaW5nYSBkaSByaWNlcmNhICh1c2EgJ1xcXFwnIHBlciBjZXJjYXJlICB1biAnXFwnKSIKKworIzogZ3VpX3c0OC5jOjIxODgKK21zZ2lkICJGaW5kICYgUmVwbGFjZSAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJTb3N0aXR1aXNjaSAodXNhICdcXFxcJyBwZXIgY2VyY2FyZSAgdW4gJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNTM3Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBOb24gcmllc2NvIGFkIGFsbG9jYXJlIGVsZW1lbnRvIGRpIGNvbG9ybWFwLCBwb3NzaWJpbGkgY29sb3JpICIKKyJlcnJhdGkiCisKKyM6IGd1aV94MTEuYzoyMTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBNYW5jYW5vIGRlc2NyaXppb25pIHBlciBpIHNlZ3VlbnRpIGNhcmF0dGVyaSBuZWwgZm9udDogJXMiCisKKyM6IGd1aV94MTEuYzoyMTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IE5vbWUgZm9udHNldDogJXMiCisKKyM6IGd1aV94MTEuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIklsIGZvbnQgJyVzJyBub24gZGkgbGFyZ2hlenphIGZpc3NhIgorCisjOiBndWlfeDExLmM6MjE4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IE5vbWUgZm9udHNldDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIkZvbnQwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAiRm9udDE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlbGQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAiTGEgbGFyZ2hlenphIGRpIGZvbnQlbGQgbm9uIOggZG9wcGlhIGRpIHF1ZWxsYSBkaSBmb250MFxuIgorCisjOiBndWlfeDExLmM6MjE4NQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIkxhcmdoZXp6YSBkaSBGb250MDogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyJMYXJnaGV6emEgZGkgRm9udDE6ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogRVJST1JFIHByb2Nlc3NvcmUgSGFuZ3VsIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiQWdnaXVuZ2kgdW4gbnVvdm8gZGF0YWJhc2UiCisKKyM6IGlmX2NzY29wZS5jOjc5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiQ2VyY2EgdW4gbW9kZWxsbyIKKworIzogaWZfY3Njb3BlLmM6ODEKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiVmlzdWFsaXp6YSBxdWVzdG8gbWVzc2FnZ2lvIgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJUZXJtaW5hIHVuYSBjb25uZXNzaW9uZSIKKworIzogaWZfY3Njb3BlLmM6ODUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICJSaW5pemlhbGl6emEgdHV0dGUgbGUgY29ubmVzc2lvbmkiCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiVmlzdWFsaXp6YSBjb25uZXNzaW9uaSIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiBVc286IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMjQKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIlF1ZXN0byBjb21hbmRvIGNzY29wZSBub24gZ2VzdGlzY2UgbGEgZGl2aXNpb25lIGRlbGxlIHNjaGVybW8uXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiBVc286IGNzdGFnIDxpZGVudD4iCisKKyM6IGlmX2NzY29wZS5jOjIzMQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzogdGFnIG5vbiB0cm92YXRhIgorCisjOiBpZl9jc2NvcGUuYzo0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBlcnJvcmUgc3RhdCglcyk6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0MTkKK21zZ2lkICJFNTYzOiBzdGF0IGVycm9yIgorbXNnc3RyICJFNTYzOiBlcnJvcmUgc3RhdCIKKworIzogaWZfY3Njb3BlLmM6NTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgbm9uIOggdW5hIGRpcmVjdG9yeSBvIHVuIGRhdGFiYXNlIGNzY29wZSB2YWxpZG8iCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIkFnZ2l1bnRvIGRhdGFiYXNlIGNzY29wZSAlcyIKKworIzogaWZfY3Njb3BlLmM6NTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWxkIgorbXNnc3RyICJFMjYyOiBlcnJvcmUgbGVnZ2VuZG8gY29ubmVzc2lvbmUgY3Njb3BlICVsZCIKKworIzogaWZfY3Njb3BlLmM6Njk0Cittc2dpZCAiRTU2MTogdW5rbm93biBjc2NvcGUgc2VhcmNoIHR5cGUiCittc2dzdHIgIkU1NjE6IHRpcG8gZGkgcmljZXJjYSBjc2NvcGUgc2Nvbm9zY2l1dGEiCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBOb24gcmllc2NvIGEgY3JlYXJlIHBpcGVzIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzUzCittc2dpZCAiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIKK21zZ3N0ciAiRTYyMjogTm9uIHJpZXNjbyBhIGZhcmUgZm9yayBwZXIgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo4NDcgaWZfY3Njb3BlLmM6ODk3Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFsbGl0YSIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiBOb24gcmllc2NvIGEgZ2VuZXJhcmUgcHJvY2Vzc28gY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo5MTEKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZGkgdG9fZnAgZmFsbGl0YSIKKworIzogaWZfY3Njb3BlLmM6OTEzCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGRpIGZyX2ZwIGZhbGxpdGEiCisKKyM6IGlmX2NzY29wZS5jOjk1MQorbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2NzogbmVzc3VuYSBjb25uZXNzaW9uZSBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjEwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1OTogbm8gbWF0Y2hlcyBmb3VuZCBmb3IgY3Njb3BlIHF1ZXJ5ICVzIG9mICVzIgorbXNnc3RyICJFMjU5OiBuZXNzdW5hIGNvcnJpc3BvbmRlbnphIHRyb3ZhdGEgcGVyIGxhIHJpY2hpZXN0YSBjc2NvcGUgJXMgZGkgJXMiCisKKyM6IGlmX2NzY29wZS5jOjEwODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OTogaW52YWxpZCBjc2NvcGVxdWlja2ZpeCBmbGFnICVjIGZvciAlYyIKK21zZ3N0ciAiRTQ2OTogZmxhZyBjc2NvcGVxdWlja2ZpeCAlYyBub24gdmFsaWRvIHBlciAlYyIKKworIzogaWZfY3Njb3BlLmM6MTE1MgorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY29tYW5kaSBjc2NvcGU6XG4iCisKKyM6IGlmX2NzY29wZS5jOjExNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcykiCittc2dzdHIgIiUtNXM6ICUtMzBzIChVc286ICVzKSIKKworIzogaWZfY3Njb3BlLmM6MTI1MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjI1OiBjYW5ub3Qgb3BlbiBjc2NvcGUgZGF0YWJhc2U6ICVzIgorbXNnc3RyICJFNjI1OiBpbXBvc3NpYmlsZSBhcHJpcmUgZGF0YWJhc2UgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI3MQorbXNnaWQgIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIgorbXNnc3RyICJFNjI2OiBpbXBvc3NpYmlsZSBsZWdnZXJlIGluZm9ybWF6aW9uaSBzdWwgZGF0YWJhc2UgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMjk2Cittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IGRhdGFiYXNlIGNzY29wZSBkdXBsaWNhdG8sIG5vbiBhZ2dpdW50byIKKworIzogaWZfY3Njb3BlLmM6MTMwNworbXNnaWQgIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJFNTY5OiByYWdnaXVudG8gbnVtZXJvIG1hc3NpbW8gZGkgY29ubmVzc2lvbmkgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxNDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY29ubmVzc2lvbmUgY3Njb3BlICVzIG5vbiB0cm92YXRhIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZCIKK21zZ3N0ciAiY29ubmVzc2lvbmUgY3Njb3BlICVzIGNoaXVzYSIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGVycm9yZSBpcnJlcGFyYWJpbGUgaW4gY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIlRhZyBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoxODcwCittc2dpZCAiIgorIlxuIgorIiAgICMgICBsaW5lIgorbXNnc3RyICIiCisiXG4iCisiICAgIyAgIGxpbmVhIgorCisjOiBpZl9jc2NvcGUuYzoxODcyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICJub21lZmlsZSAvIGNvbnRlc3QgLyBsaW5lYVxuIgorCisjOiBpZl9jc2NvcGUuYzoxOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDk6IENzY29wZSBlcnJvcjogJXMiCittc2dzdHIgIkU2MDk6IEVycm9yZSBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoyMTc2Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIlR1dHRpIGkgZGF0YWJlc2UgY3Njb3BlIGFubnVsbGF0aSIKKworIzogaWZfY3Njb3BlLmM6MjI0NAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICJuZXNzdW5hIGNvbm5lc3Npb25lIGNzY29wZVxuIgorCisjOiBpZl9jc2NvcGUuYzoyMjQ4Cittc2dpZCAiICMgcGlkICAgIGRhdGFiYXNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorbXNnc3RyICIgIyBwaWQgICAgZGF0YWJhc2Ugbm9tZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCisKKyM6IGlmX3B5dGhvbi5jOjQzNgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogU3BpYWNlbnRlLCBjb21hbmRvIG5vbiBkaXNwb25pYmlsZSwgbm9uIHJpZXNjbyBhIGNhcmljYXJlIGxpYnJlcmlhICIKKyJwcm9ncmFtbWkgUHl0aG9uLiIKKworIzogaWZfcHl0aG9uLmM6NTAwCittc2dpZCAiRTY1OTogQ2Fubm90IGludm9rZSBQeXRob24gcmVjdXJzaXZlbHkiCittc2dzdHIgIkU2NTk6IFB5dGhvbiBub24gcHXyIGVzc2VyZSBjaGlhbWF0byByaWNvcnNpdmFtZW50ZSIKKworIzogaWZfcHl0aG9uLmM6NzAxCittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJub24gcmllc2NvIGEgY2FuY2VsbGFyZSBnbGkgYXR0cmlidXRpIE91dHB1dE9iamVjdCIKKworIzogaWZfcHl0aG9uLmM6NzA4Cittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIGRldmUgZXNzZXJlIHVuIG51bWVybyBpbnRlcm8iCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJhdHJyaWJ1dG8gbm9uIHZhbGlkbyIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSByaWNoaWVkZSB1bmEgbGlzdGEgZGkgc3RyaW5naGUiCisKKyM6IGlmX3B5dGhvbi5jOjg5NQorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IEVycm9yZSBpbml6aWFsaXp6YXppb25lIG9nZ2V0dGkgSS9PIgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgImVzcHJlc3Npb25lIG5vbiB2YWxpZGEiCisKKyM6IGlmX3B5dGhvbi5jOjEwOTQgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiZXNwcmVzc2lvbmkgZGlzYWJpbGl0YXRlIGluIGNvbXBpbGF6aW9uZSIKKworIzogaWZfcHl0aG9uLmM6MTEwNworbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgInRlbnRhdGl2byBkaSByZWZlcmVuemEgYSBidWZmZXIgY2FuY2VsbGF0byIKKworIzogaWZfcHl0aG9uLmM6MTEyMiBpZl9weXRob24uYzoxMTYzIGlmX3B5dGhvbi5jOjEyMjcgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAibnVtZXJvIGxpbmVhIG5vbiBuZWxsJ2ludGVydmFsbG8iCisKKyM6IGlmX3B5dGhvbi5jOjEzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8YnVmZmVyIG9nZ2V0dG8gKGNhbmNlbGxhdG8pIGEgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIm5vbWUgZGkgbWFyayBub24gdmFsaWRvIgorCisjOiBpZl9weXRob24uYzoxNzMzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgImJ1ZmZlciBpbmVzaXN0ZW50ZSIKKworIzogaWZfcHl0aG9uLmM6MTgyMQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInRlbnRhdGl2byBkaSByZWZlcmVuemEgYSB1bmEgZmluZXN0cmEgY2FuY2VsbGF0YSIKKworIzogaWZfcHl0aG9uLmM6MTg2NgorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAiYXR0cmlidXRvICdyZWFkb25seSciCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgInBvc2l6aW9uZSBjdXJzb3JlIGZ1b3JpIGRhbCBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjE5NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPGZpbmVzdHJhIG9nZ2V0dG8gKGNhbmNlbGxhdGEpIGEgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjxmaW5lc3RyYSBvZ2dldHRvIChzY29ub3NjaXV0YSkgYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxmaW5lc3RyYSAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjIwNDYKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAiZmluZXN0cmEgaW5lc2lzdGVudGUiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDcgaWZfcHl0aG9uLmM6MjM0MSBpZl9weXRob24uYzoyMzk2IGlmX3B5dGhvbi5jOjI0NjQKKyM6IGlmX3B5dGhvbi5jOjI1ODYgaWZfcHl0aG9uLmM6MjYzOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICJub24gcmllc2NvIGEgc2FsdmFyZSBpbmZvcm1hemlvbmkgcGVyICd1bmRvJyIKKworIzogaWZfcHl0aG9uLmM6MjMwOSBpZl9weXRob24uYzoyNDAzIGlmX3B5dGhvbi5jOjI0NzUKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIm5vbiBwb3NzbyBjYW5jZWxsYXJlIGxhIGxpbmVhIgorCisjOiBpZl9weXRob24uYzoyMzQ2IGlmX3B5dGhvbi5jOjI0OTEgaWZfdGNsLmM6NjkwIGlmX3RjbC5jOjIwMjEKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICJub24gcG9zc28gc29zdGl0dWlyZSBsYSBsaW5lYSIKKworIzogaWZfcHl0aG9uLmM6MjUwOSBpZl9weXRob24uYzoyNTg4IGlmX3B5dGhvbi5jOjI2NDYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIm5vbiBwb3NzbyBpbnNlcmlyZSBsYSBsaW5lYSIKKworIzogaWZfcHl0aG9uLmM6Mjc1MAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAibGEgc3RyaW5nYSBub24gcHXyIGNvbnRlbmVyZSBjYXJhdHRlcmkgJ0EgQ0FQTyciCisKKyM6IGlmX3J1YnkuYzo0MjIKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6IFNwaWFjZW50ZSwgY29tYW5kbyBub24gZGlzcG9uaWJpbGUsIG5vbiByaWVzY28gYSBjYXJpY2FyZSBsaWJyZXJpYSAiCisicHJvZ3JhbW1pIFJ1YnkuIgorCisjOiBpZl9ydWJ5LmM6NDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IHRpcG8gc2Nvbm9zY2l1dG8gZGkgc2FsdG8gbmVsIHByb2dyYW1tYSAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICJJbXBsZW1lbnRhemlvbmUvZGVmaW5pemlvbmUgU+wvTm8iCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlZpc3VhbGl6emEgY2xhc3NlIGJhc2UgZGkiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJWaXN1YWxpenphIGZ1bnppb25lIG1vZHVsbyBzb3ZyYXNjcml0dG8iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIkNhcmljYSBkYSBmaWxlIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJDYXJpY2EgZGEgcHJvZ2V0dG8iCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiQ2FyaWNhIGRhIHR1dHRpIGkgcHJvZ2V0dGkiCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiQ2FyaWNhIHN1Y2Nlc3Npdm8iCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAiVmlzdWFsaXp6YSBzb3JnZW50ZSBkaSIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJUcm92YSBzaW1ib2xvIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJFc3Bsb3JhIGNsYXNzZSIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICJWaXN1YWxpenphIGNsYXNzZSBpbiBnZXJhcmNoaWEiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJWaXN1YWxpenphIGNsYXNzZSBuZWxsYSBnZXJhcmNoaWEgcmlzdHJldHRhIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgc2kgcmlmZXJpc2NlIGEiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIHJlZmVyZW56aWF0byBkYSIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYgaGEgdW4iCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgdXNhdG8gZGEiCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIlZpc3VhbGl6emEgZG9jdSBkaSIKKworIzogaWZfc25pZmYuYzo4NQorbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorbXNnc3RyICJHZW5lcmEgZG9jdSBwZXIiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJOb24gcmllc2NvIGEgY29ubmV0dGVybWkgYSBTTmlGRisuIENvbnRyb2xsYXJlIGFtYmllbnRlIChzbmlmZmVtYWNzIGRldmUgIgorImVzc2VyZSBwcmVzZW50ZSBpbiAkUEFUSCkuXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiBFcnJvcmUgaW4gbGV0dHVyYS4gRGlzY29ubmVzc2lvbmUuIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICJTTmlGRisg6CBhbCBtb21lbnRvICIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICJub24gIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAiY29ubmVzc28iCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBSaWNoaWVzdGEgU05pRkYrIHNjb25vc2NpdXRhOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRXJyb3JlIGNvbm5ldHRlbmRvc2kgYSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgbm9uIGNvbm5lc3NvIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBOb24g6CB1biBidWZmZXIgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiBFcnJvcmUgaW4gc2NyaXR0dXJhLiBEaXNjb25uZXNzbyIKKworIzogaWZfdGNsLmM6NDE4Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJudW1lcm8gYnVmZmVyIG5vbiB2YWxpZG8iCisKKyM6IGlmX3RjbC5jOjQ2NCBpZl90Y2wuYzo5MzEgaWZfdGNsLmM6MTExMAorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgIm5vbiBhbmNvcmEgaW1wbGVtZW50YXRvIgorCisjOiBpZl90Y2wuYzo1MDEKK21zZ2lkICJ1bmtub3duIG9wdGlvbiIKK21zZ3N0ciAib3B6aW9uZSBpbmVzaXN0ZW50ZSIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzQKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIm5vbiBwb3NzbyBpbXBvc3RhcmUgbGluZWEoZSkiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAibWFyayBub24gaW1wb3N0YXRvIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICJyaWdhICVkIGNvbG9ubmEgJWQiCisKKyM6IGlmX3RjbC5jOjg4MQorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIm5vbiByaWVzY28gYSBpbnNlcmlyZS9hZ2dpdW5nZXJlIGxpbmVhIgorCisjOiBpZl90Y2wuYzoxMjY4Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIm9wemlvbmUgaW5lc2lzdGVudGU6ICIKKworIzogaWZfdGNsLmM6MTMzOAorbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICIndmltT3B0aW9uJyBpbmVzaXN0ZW50ZSIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAiaW50ZXJydXppb25lIGRhbGxhIHRhc3RpZXJhIgorCisjOiBpZl90Y2wuYzoxNDI4Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICJlcnJvcmUgdmltIgorCisjOiBpZl90Y2wuYzoxNDcxCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisibm9uIHJpZXNjbyBhIGNyZWFyZSBjb21hbmRvIGJ1ZmZlci9maW5lc3RyYTogb2dnZXR0byBpbiB2aWEgZGkgY2FuY2VsbGF6aW9uZSIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyJub24gcG9zc28gcmVnaXN0cmFyZSBjb21hbmRvIGNhbGxiYWNrOiBidWZmZXIvZmluZXN0cmEgZ2ngIGluIGNhbmNlbGxhemlvbmUiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYyCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIiIKKyJFMjgwOiBFUlJPUkUgRkFUQUxFIFRDTDogcmVmbGlzdCBjb3Jyb3R0YSE/IFNpIHByZWdhIG5vdGlmaWNhcmUgYSB2aW0tIgorImRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorIm5vbiBwb3NzbyByZWdpc3RyYXJlIGNvbWFuZG8gY2FsbGJhY2s6IHJlZmVyZW56YSBhIGJ1ZmZlci9maW5lc3RyYSAiCisiaW5lc2lzdGVudGUiCisKKyM6IGlmX3RjbC5jOjE3MjQKK21zZ2lkICIiCisiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTU3MTogU3BpYWNlbnRlLCBjb21hbmRvIG5vbiBkaXNwb25pYmlsZSwgbm9uIHJpZXNjbyBhIGNhcmljYXJlIGxpYnJlcmlhICIKKyJwcm9ncmFtbWkgVGNsLiIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODE6IEVSUk9SRSBUQ0w6IGNvZGljZSBkaSByaXRvcm5vIG5vbiBpbnQhPyBTaSBwcmVnYSBub3RpZmljYXJlIGEgdmltLSIKKyJkZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNworbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAibm9uIHJpZXNjbyBhIG90dGVuZXJlIGxhIGxpbmVhIgorCisjOiBpZl94Y21kc3J2LmM6MjI1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiTm9uIHJpZXNjbyBhIHJlZ2lzdHJhcmUgdW4gbm9tZSBkaSBzZXJ2ZXIgY29tYW5kbyIKKworIzogaWZfeGNtZHNydi5jOjQ3MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IEZhbGxpdG8gaW52aW8gY29tYW5kbyBhIHByb2dyYW1tYSBkZXN0aW5hdGFyaW8iCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IElkZW50aWZpY2F0aXZvIGRpIHNlcnZlciBub24gdmFsaWRvOiAlcyIKKworIzogaWZfeGNtZHNydi5jOjExMTAKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IFByb3ByaWV04CByZWdpc3RyeSByZWxhdGl2ZSBhIFZJTSBub24gYWRlZ3VhdGUuICBDYW5jZWxsYXRlISIKKworIzogbWFpbi5jOjYwCittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIk9wemlvbmUgaW5lc2lzdGVudGUiCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJUcm9wcGkgYXJnb21lbnRpIGRpIGVkaXQiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkFyZ29tZW50byBtYW5jYW50ZSBkb3BvIgorCisjOiBtYWluLmM6NjYKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAiU3BhenphdHVyYSBkb3BvIG9wemlvbmUiCisKKyM6IG1haW4uYzo2OAorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiwgXCItYyBjb21tYW5kXCIgb3IgXCItLWNtZCBjb21tYW5kXCIgYXJndW1lbnRzIgorbXNnc3RyICJUcm9wcGkgYXJnb21lbnRpIFwiK2NvbW1hbmRcIiwgXCItYyBjb21tYW5kXCIgbyBcIi0tY21kIGNvbW1hbmRcIiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIkFyZ29tZW50byBub24gdmFsaWRvIHBlciIKKworIzogbWFpbi5jOjQ2OQorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiVmltIG5vbiBjb21waWxhdG8gY29uIG9wemlvbmUgJ2RpZmYnLiIKKworIzogbWFpbi5jOjkzNQorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIlRlbnRvIGRpIHJpYXByaXJlIGxvIHNjcmlwdCBmaWxlOiBcIiIKKworIzogbWFpbi5jOjk0NAorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciByZWFkaW5nOiBcIiIKK21zZ3N0ciAiTm9uIHBvc3NvIGFwcmlyZSBpbiBsZXR0dXJhOiBcIiIKKworIzogbWFpbi5jOjk4OAorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTm9uIHBvc3NvIGFwcmlyZSBjb21lIHNjcmlwdCBvdXRwdXQ6IFwiIgorCisjOiBtYWluLmM6MTEzNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIiVkIGZpbGUgZGEgZWxhYm9yYXJlXG4iCisKKyM6IG1haW4uYzoxMjM2Cittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBBdHRlbnppb25lOiBPdXRwdXQgbm9uIGRpcmV0dG8gYSB1biB0ZXJtaW5hbGVcbiIKKworIzogbWFpbi5jOjEyMzgKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBBdHRlbnppb25lOiBJbnB1dCBub24gcHJvdmVuaWVudGUgZGEgdW4gdGVybWluYWxlXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTMwNgorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgImxpbmVhIGNvbWFuZGkgcHJpbWEgZGkgdmltcmMiCisKKyM6IG1haW4uYzoxMzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiBOb24gcG9zc28gbGVnZ2VyZSBkYSBcIiVzXCIiCisKKyM6IG1haW4uYzoyNDIwCittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIiIKKyJcbiIKKyJNYWdnaW9yaSBpbmZvcm1hemlvbmkgY29uOiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyNDUzCittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIltmaWxlIC4uXSAgICAgICBhcHJpIGZpbGUocykgc3BlY2lmaWNhdGkiCisKKyM6IG1haW4uYzoyNDU0Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgbGVnZ2kgdGVzdG8gZGEgJ3N0ZGluJyIKKworIzogbWFpbi5jOjI0NTUKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCB0YWcgICAgICAgICAgYXByaSBmaWxlIGluIGN1aSDoIGRlZmluaXRhIGxhIHRhZyIKKworIzogbWFpbi5jOjI0NTcKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtlcnJvcmZpbGVdICBhcHJpIGZpbGUgY29sIHByaW1vIGVycm9yZSIKKworIzogbWFpbi5jOjI0NjYKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiICB1c286IgorCisjOiBtYWluLmM6MjQ2OQorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICIgdmltIFthcmdvbWVudGldICIKKworIzogbWFpbi5jOjI0NzMKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgIG86IgorCisjOiBtYWluLmM6MjQ3NgorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJBcmdvbWVudGk6XG4iCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHRTb2xvIG5vbWkgZmlsZSBkYSBxdWkgaW4gcG9pIgorCisjOiBtYWluLmM6MjQ3OQorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx0Tm9uIGVzcGFuZGVyZSB3aWxkY2FyZCIKKworIzogbWFpbi5jOjI0ODIKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRSZWdpc3RyYSBxdWVzdG8gZ3ZpbSBhIE9MRSIKKworIzogbWFpbi5jOjI0ODMKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0RGVyZWdpc3RyYSBndmltIGEgT0xFIgorCisjOiBtYWluLmM6MjQ4NgorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0RXNlZ3VpIHVzYW5kbyBHVUkgKGNvbWUgXCJndmltXCIpIgorCisjOiBtYWluLmM6MjQ4NworbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mIG9wcC4gLS1ub2ZvcmtcdEZvcmVncm91bmQ6IE5vbiB1c2FyZSAnZm9yaycgaW5pemlhbGl6emFuZG8gR1VJIgorCisjOiBtYWluLmM6MjQ4OQorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdE1vZGFsaXTgIFZpIChjb21lIFwidmlcIikiCisKKyM6IG1haW4uYzoyNDkwCittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0TW9kYWxpdOAgRXggKGNvbWUgXCJleFwiKSIKKworIzogbWFpbi5jOjI0OTEKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0TW9kYWxpdOAgU2lsZW56aW9zYSAoYmF0Y2gpIChzb2xvIHBlciBcImV4XCIpIgorCisjOiBtYWluLmM6MjQ5MworbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHRNb2RhbGl04CBEaWZmIChjb21lIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjI0OTUKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdE1vZGFsaXTgIEZhY2lsZSAoY29tZSBcImV2aW1cIiwgc2VuemEgbW9kYWxpdOApIgorCisjOiBtYWluLmM6MjQ5NgorbXNnaWQgIi1SXHRcdFx0UmVhZG9ubHkgbW9kZSAobGlrZSBcInZpZXdcIikiCittc2dzdHIgIi1SXHRcdFx0TW9kYWxpdOAgU29sYSBMZXR0dXJhIChjb21lIFwidmlld1wiKSIKKworIzogbWFpbi5jOjI0OTcKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0TW9kYWxpdOAgUmlzdHJldHRhIChjb21lIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjI0OTgKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdFJpc2NyaXR0dXJlIGRlbCBmaWxlIG5vbiBwZXJtZXNzZSIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHRNb2RpZmljaGUgbmVsIGZpbGUgbm9uIHBlcm1lc3NlIgorCisjOiBtYWluLmM6MjUwMAorbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0TW9kYWxpdOAgQmluYXJpYSIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRNb2RhbGl04CBMaXNwIgorCisjOiBtYWluLmM6MjUwNAorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0Q29tcGF0aWJpbGUgY29uIFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0Tm9uIGludGVyYW1lbnRlIGNvbXBhdGliaWxlIGNvbiBWaTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNTA2Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0TGl2ZWxsbyBWZXJib3NpdOAiCisKKyM6IG1haW4uYzoyNTA3Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHRNb2RhbGl04CBEZWJ1ZyIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdE5pZW50ZSBmaWxlIGRpIHN3YXAsIHVzYSBzb2xvIG1lbW9yaWEiCisKKyM6IG1haW4uYzoyNTA5Cittc2dpZCAiLXJcdFx0XHRMaXN0IHN3YXAgZmlsZXMgYW5kIGV4aXQiCittc2dzdHIgIi1yXHRcdFx0TGlzdGEgc3dhcCBmaWxlIGVkIGVzY2kiCisKKyM6IG1haW4uYzoyNTEwCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIChlIG5vbWUgZmlsZSlcdFJlY3VwZXJhIGRhIHNlc3Npb25lIGZpbml0YSBtYWxlIgorCisjOiBtYWluLmM6MjUxMQorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRDb21lIC1yIgorCisjOiBtYWluLmM6MjUxMworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHROb24gdXNhcmUgbmV3Y2xpIHBlciBhcHJpcmUgZmluZXN0cmEiCisKKyM6IG1haW4uYzoyNTE0Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGlzcG9zaXRpdm8+XHRcdFVzYSA8ZGlzcG9zaXRpdm8+IHBlciBJL08iCisKKyM6IG1haW4uYzoyNTE3Cittc2dpZCAiLUFcdFx0XHRzdGFydCBpbiBBcmFiaWMgbW9kZSIKK21zZ3N0ciAiLUFcdFx0XHRDb21pbmNpYSBpbiBtb2RhbGl04CBBcmFiYSIKKworIzogbWFpbi5jOjI1MjAKK21zZ2lkICItSFx0XHRcdFN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdENvbWluY2lhIGluIG1vZGFsaXTgIEVicmFpY2EiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdENvbWluY2lhIGluIG1vZGFsaXTgIEZhcnNpIChQZXJzaWFubykiCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsZT5cdEltcG9zdGEgdGlwbyB0ZXJtaW5hbGUgYSA8dGVybWluYWxlPiIKKworIzogbWFpbi5jOjI1MjYKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRVc2EgPHZpbXJjPiBpbnZlY2UgZGkgLnZpbXJjIgorCisjOiBtYWluLmM6MjUyOAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRVc2EgPGd2aW1yYz4gaW52ZWNlIGRpIC5ndmltcmMiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdE5vbiBjYXJpY2FyZSBzY3JpcHQgcGx1Z2luIgorCisjOiBtYWluLmM6MjUzMQorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdEFwcmkgTiBmaW5lc3RyZSAocHJlZGVmaW5pdG86IHVuYSBwZXIgb2duaSBmaWxlKSIKKworIzogbWFpbi5jOjI1MzIKK21zZ2lkICItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHRDb21lIC1vIG1hIGRpdmlkaSBsZSBmaW5lc3RyZSBpbiB2ZXJ0aWNhbGUiCisKKyM6IG1haW4uYzoyNTMzCittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0UG9zaXppb25hdGkgYWxsYSBmaW5lIGRlbCBmaWxlIgorCisjOiBtYWluLmM6MjUzNAorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG51bT5cdFx0UG9zaXppb25hdGkgYWxsYSBsaW5lYSA8bG51bT4iCisKKyM6IG1haW4uYzoyNTM2Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiIgorIi0tY21kIDxjb21hbmRvPlx0XHRFc2VndWkgPGNvbWFuZG8+IHByaW1hIGRpIGNhcmljYXJlIGV2ZW50dWFsaSBmaWxlIHZpbXJjIgorCisjOiBtYWluLmM6MjUzOAorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8Y29tYW5kbz5cdFx0RXNlZ3VpIDxjb21hbmRvPiBkb3BvIGNhcmljYW1lbnRvIHByaW1vIGZpbGUiCisKKyM6IG1haW4uYzoyNTM5Cittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICIiCisiLVMgPHNlc3Npb25lPlx0RXNlZ3VpIGNvbWFuZGkgaW4gZmlsZSA8c2Vzc2lvbmU+IGRvcG8gY2FyaWNhbWVudG8gcHJpbW8gZmlsZSIKKworIzogbWFpbi5jOjI1NDAKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2NyaXB0aW4+XHRMZWdnaSBjb21hbmRpIGluIG1vZGFsaXTgIG5vcm1hbGUgZGEgZmlsZSA8c2NyaXB0aW4+IgorCisjOiBtYWluLmM6MjU0MQorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxzY3JpcHRvdXQ+XHRBZ2dpdW5naSB0dXR0aSBpIGNvbWFuZGkgaW1tZXNzaSBhIGZpbGUgPHNjcmlwdG91dD4iCisKKyM6IG1haW4uYzoyNTQyCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx0U2NyaXZpIHR1dHRpIGkgY29tYW5kaSBpbW1lc3NpIGluIGZpbGUgPHNjcmlwdG91dD4iCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHRBcHJpIHVuIGZpbGUgY3JpdHRhdG8iCisKKyM6IG1haW4uYzoyNTQ4Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDxzY2hlcm1vPlx0RXNlZ3VpIHZpbSBhIHF1ZXN0byBwYXJ0aWNvbGFyZSBzZXJ2ZXIgWCIKKworIzogbWFpbi5jOjI1NTAKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdE5vbiBjb25uZXR0ZXJ0aSBhIHNlcnZlciBYIgorCisjOiBtYWluLmM6MjU1MworbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgaWYgcG9zc2libGUiCittc2dzdHIgIi0tcmVtb3RlIDxmaWxlPlx0QXByaSA8ZmlsZT4gaW4gdW4gc2VydmVyIFZpbSBzZSBwb3NzaWJpbGUiCisKKyM6IG1haW4uYzoyNTU0Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFN0ZXNzYSBjb3NhLCBpZ25vcmEgc2Ugbm9uIGVzaXN0ZSB1biBzZXJ2ZXIiCisKKyM6IG1haW4uYzoyNTU1Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlPiAgQ29tZSAtLXJlbW90ZSBtYSBhc3BldHRhIGNoZSBmaWxlIHNpYW5vIGVsYWJvcmF0aSIKKworIzogbWFpbi5jOjI1NTYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU3Rlc3NhIGNvc2EsIGlnbm9yYSBzZSBub24gZXNpc3RlIHVuIHNlcnZlciIKKworIzogbWFpbi5jOjI1NTcKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDx0YXN0aT5cdEludmlhIDx0YXN0aT4gYSB1biBzZXJ2ZXIgVmltIGVkIGVzY2kiCisKKyM6IG1haW4uYzoyNTU4Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLS1leHByIDxleHByPlx0RXNlZ3VpIDxleHByPiBpbiB1biBzZXJ2ZXIgVmltIGUgc3RhbXBhIHJpc3VsdGF0byIKKworIzogbWFpbi5jOjI1NTkKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdExpc3RhIG5vbWkgc2VydmVyIFZpbSBkaXNwb25pYmlsaSBlZCBlc2NpIgorCisjOiBtYWluLmM6MjU2MAorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxub21lPlx0SW52aWEgYS9kaXZlbnRhIHNlcnZlciBWaW0gZGkgbm9tZSA8bm9tZT4iCisKKyM6IG1haW4uYzoyNTYzCittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdFVzYSA8dmltaW5mbz4gaW52ZWNlIGRpIC52aW1pbmZvIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIi1oICBvciAgLS1oZWxwXHRQcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaCBvcHAuIC0taGVscFx0U3RhbXBhIEFpdXRvIChxdWVzdG8gbWVzc2FnZ2lvKSBlZCBlc2NpIgorCisjOiBtYWluLmM6MjU2NgorbXNnaWQgIi0tdmVyc2lvblx0XHRQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0U3RhbXBhIGluZm9ybWF6aW9uaSBzdWxsYSB2ZXJzaW9uZSBlZCBlc2NpIgorCisjOiBtYWluLmM6MjU3MAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIk9wemlvbmkgYWNjZXR0YXRlIGRhIGd2aW0gKHZlcnNpb25lIE1vdGlmKTpcbiIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiT3B6aW9uaSBhY2NldHRhdGUgZGEgZ3ZpbSAodmVyc2lvbmUgbmVYdGF3KTpcbiIKKworIzogbWFpbi5jOjI1NzYKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiT3B6aW9uaSBhY2NldHRhdGUgZGEgZ3ZpbSAodmVyc2lvbmUgQXRoZW5hKTpcbiIKKworIzogbWFpbi5jOjI1ODAKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8c2NoZXJtbz5cdEVzZWd1aSB2aW0gc3UgPHNjaGVybW8+IgorCisjOiBtYWluLmM6MjU4MQorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHRJbml6aWEgdmltIHJpZHVjZW5kb2xvIGFkIGljb25hIgorCisjOiBtYWluLmM6MjU4MworbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxub21lPlx0XHRVc2Egcmlzb3JzYSBjb21lIHNlIHZpbSBmb3NzZSA8bm9tZT4iCisKKyM6IG1haW4uYzoyNTg0Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAoTm9uIGltcGxlbWVudGF0bylcbiIKKworIzogbWFpbi5jOjI1ODYKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcmU+XHRVc2EgPGNvbG9yZT4gY29tZSBzZm9uZG8gKGFuY2hlOiAtYmcpIgorCisjOiBtYWluLmM6MjU4NworbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGNvbG9yZT5cdFVzYSA8Y29sb3JlPiBwZXIgaWwgdGVzdG8gbm9ybWFsZSAoYW5jaGU6IC1mZykiCisKKyM6IG1haW4uYzoyNTg4IG1haW4uYzoyNjA4Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdFx0VXNhIDxmb250PiBmb3IgaWwgdGVzdG8gbm9ybWFsZSAoYW5jaGU6IC1mbikiCisKKyM6IG1haW4uYzoyNTg5Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPGZvbnQ+XHRVc2EgPGZvbnQ+IHBlciB0ZXN0byBpbiBncmFzc2V0dG8iCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2EgPGZvbnQ+IHBlciB0ZXN0byBpbiBjb3JzaXZvIgorCisjOiBtYWluLmM6MjU5MSBtYWluLmM6MjYwOQorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tPlx0VXNhIDxnZW9tPiBwZXIgbGEgZ2VvbWV0cmlhIGluaXppYWxlIChhbmNoZTogLWdlb20pIgorCisjOiBtYWluLmM6MjU5MgorbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDxsYXJnPlx0VXNhIGxhcmdoZXp6YSA8bGFyZz4gcGVyIGJvcmRvIChhbmNoZTogLWJ3KSIKKworIzogbWFpbi5jOjI1OTMKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIiIKKyItc2Nyb2xsYmFyd2lkdGggPGxhcmc+ICBVc2EgbGFyZ2hlenphIDxsYXJnPiBwZXIgc2Nyb2xsYmFyIChhbmNoZTogLXN3KSIKKworIzogbWFpbi5jOjI1OTUKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICItbWVudWhlaWdodCA8YWx0Plx0VXNhIGFsdGV6emEgPGFsdD4gcGVyIGJhcnJhIG1lbnUgKGFuY2hlOiAtbWgpIgorCisjOiBtYWluLmM6MjU5NyBtYWluLmM6MjYxMAorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHRVc2EgY29sb3JpIGludmVydGl0aSAoYW5jaGU6IC1ydikiCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdE5vbiB1c2FyZSBjb2xvcmkgaW52ZXJ0aXRpIChhbmNoZTogK3J2KSIKKworIzogbWFpbi5jOjI1OTkKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyaXNvcnNhPlx0SW1wb3N0YSBsYSByaXNvcnNhIHNwZWNpZmljYXRhIgorCisjOiBtYWluLmM6MjYwMgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJnb21lbnRpIGFjY2V0dGF0aSBkYSBndmltICh2ZXJzaW9uZSBSSVNDIE9TKTpcbiIKKworIzogbWFpbi5jOjI2MDMKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bnVtZXJvPlx0TGFyZ2hlenphIGluaXppYWxlIGZpbmVzdHJhIGluIGNvbG9ubmUiCisKKyM6IG1haW4uYzoyNjA0Cittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1lcm8+XHRBbHRlenphIGluaXppYWxlIGZpbmVzdHJhIGluIHJpZ2hlIgorCisjOiBtYWluLmM6MjYwNworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChHVEsrIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJnb21lbnRpIGFjY2V0dGF0aSBkYSBndmltICh2ZXJzaW9uZSBHVEsrKTpcbiIKKworIzogbWFpbi5jOjI2MTEKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8c2NoZXJtbz5cdEVzZWd1aSB2aW0gc3UgPHNjaGVybW8+IChhbmNoZTogLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjI2MTMKK21zZ2lkICItLXJvbGUgPHJvbGU+XHRTZXQgYSB1bmlxdWUgcm9sZSB0byBpZGVudGlmeSB0aGUgbWFpbiB3aW5kb3ciCittc2dzdHIgIiIKKyItLXJvbGUgPHJ1b2xvPlx0SW1wb3N0YSB1biBydW9sbyB1bml2b2NvIHBlciBpZGVudGlmaWNhcmUgbGEgZmluZXN0cmEgIgorInByaW5jaXBhbGUiCisKKyM6IG1haW4uYzoyNjE1Cittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0QXByaSBWaW0gZGVudHJvIHVuIGFsdHJvICd3aWRnZXQnIEdUSyIKKworIzogbWFpbi5jOjI2MTgKK21zZ2lkICItUCA8cGFyZW50IHRpdGxlPlx0T3BlbiBWaW0gaW5zaWRlIHBhcmVudCBhcHBsaWNhdGlvbiIKK21zZ3N0ciAiLVAgPHRpdG9sbyBwYWRyZT5cdEFwcmkgVmltIGluIHVuJ2FwcGxpY2F6aW9uZSBwYWRyZSIKKworIzogbWFpbi5jOjI4NTYKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICJNYW5jYSBkaXNwbGF5IgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjg3MQorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjogSW52aW8gZmFsbGl0by5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyODc3Cittc2dpZCAiOiBTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICI6IEludmlvIGZhbGxpdG8uIFRlbnRvIGRpIGVzZWd1aXJlIGxvY2FsbWVudGVcbiIKKworIzogbWFpbi5jOjI5MTUgbWFpbi5jOjI5MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCBkaSAlZCBlbGFib3JhdG8iCisKKyM6IG1haW4uYzoyOTU4Cittc2dpZCAiTm8gZGlzcGxheTogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiTmVzc3VuIGRpc3BsYXk6IEludmlvIGRpIGVzcHJlc3Npb25lIGZhbGxpdG8uXG4iCisKKyM6IG1haW4uYzoyOTcwCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IEludmlvIGRpIGVzcHJlc3Npb25lIGZhbGxpdG8uXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIk5lc3N1biBtYXJrIGltcG9zdGF0byIKKworIzogbWFyay5jOjcxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6IE5lc3N1biBtYXJrIGNvcnJpc3BvbmRlbnRlIGEgXCIlc1wiIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MjIKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisibWFyayBsaW5lYSBjb2wuZmlsZS90ZXN0byIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzYwCittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgc2FsdC5saW5lYSBjb2wuZmlsZS90ZXN0byIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6ODA1Cittc2dpZCAiIgorIlxuIgorImNoYW5nZSBsaW5lICBjb2wgdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIm1vZGlmIGxpbmVhICBjb2wgdGVzdG8iCisKKyM6IG1hcmsuYzoxMjgxCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgRmlsZSBtYXJrOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjEzMTYKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSnVtcGxpc3QgKGRhaSBwafkgcmVjZW50aSk6XG4iCisKKyM6IG1hcmsuYzoxNDEyCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBTdG9yaWEgZGVpIG1hcmsgYWxsJ2ludGVybm8gZGVpIGZpbGVzIChkYWkgcGn5IHJlY2VudGkgYWkgbWVubyByZWNlbnRpKTpcbiIKKworIzogbWFyay5jOjE1MDEKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiTWFuY2EgJz4nIgorCisjOiBtYnl0ZS5jOjQ2NworbXNnaWQgIkU1NDM6IE5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJFNTQzOiBDb2RlcGFnZSBub24gdmFsaWRvIgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogTm9uIHBvc3NvIGFzc2VnbmFyZSB2YWxvcmkgSUMiCisKKyM6IG1ieXRlLmM6NDU4MworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogQ3JlYXppb25lIGRpIHVuIGNvbnRlc3RvIGRpIGlucHV0IGZhbGxpdGEiCisKKyM6IG1ieXRlLmM6NDc0MQorbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4NjogQXBlcnR1cmEgJ2lucHV0IG1ldGhvZCcgZmFsbGl0YSIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBBdHRlbnppb25lOiBOb24gcG9zc28gYXNzZWduYXJlIElNIGEgJ2Rlc3Ryb3kgY2FsbGJhY2snIgorCisjOiBtYnl0ZS5jOjQ3NTgKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogJ2lucHV0IG1ldGhvZCcgbm9uIHNvcHBvcnRhIGFsY3VubyBzdGlsZSIKKworIzogbWJ5dGUuYzo0ODE1Cittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6ICdpbnB1dCBtZXRob2QnIG5vbiBzdXBwb3J0YSBpbCBtaW8gdGlwbyBkaSBwcmVlZGl0IgorCisjOiBtYnl0ZS5jOjQ4ODkKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IHN0aWxlICdvdmVyLXRoZS1zcG90JyByaWNoaWVkZSBmb250c2V0IgorCisjOiBtYnl0ZS5jOjQ5MjUKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIiIKKyJFMjkxOiBJbCB0dW8gR1RLKyDoIGFudGVyaW9yZSBhIHZlcnNpb25lIDEuMi4zLiBBcmVhIFN0YXR1cyBkaXNhYmlsaXRhdGEiCisKKyM6IG1ieXRlLmM6NTIzMgorbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IFNlcnZlciBkaSAnSW5wdXQgTWV0aG9kJyBub24gaW4gZXNlY3V6aW9uZSIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBpbCBibG9jY28gbm9uIGVyYSByaXNlcnZhdG8iCisKKyM6IG1lbWZpbGUuYzoxMDEwCittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogRXJyb3JlIGRpIHBvc2l6aW9uYW1lbnRvIGR1cmFudGUgbGV0dHVyYSBzd2FwIGZpbGUiCisKKyM6IG1lbWZpbGUuYzoxMDE1Cittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IEVycm9yZSBsZWdnZW5kbyBzd2FwIGZpbGUiCisKKyM6IG1lbWZpbGUuYzoxMDY3Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IEVycm9yZSBkaSBwb3NpemlvbmFtZW50byBzY3JpdmVuZG8gc3dhcCBmaWxlIgorCisjOiBtZW1maWxlLmM6MTA4NQorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NzogRXJyb3JlIHNjcml2ZW5kbyBzd2FwIGZpbGUiCisKKyM6IG1lbWZpbGUuYzoxMjgyCittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiBMbyBzd2FwIGZpbGUgZXNpc3RlIGdp4CAodW4gbGluayBzaW1ib2xpY28/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IE5vbiByaWVzY28gYSBsZWdnZXJlIGJsb2NjbyBudW1lcm8gMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiBOb24gcmllc2NvIGEgbGVnZ2VyZSBibG9jY28gbnVtZXJvIDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogTm9uIHJpZXNjbyBhIGxlZ2dlcmUgYmxvY2NvIG51bWVybyAyPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0NAorbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTogQWhpbegsIGxvIHN3YXAgZmlsZSDoIHBlcmR1dG8hISEiCisKKyM6IG1lbWxpbmUuYzo0NDkKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogTm9uIHJpZXNjbyBhIHJpbm9taW5hcmUgbG8gc3dhcCBmaWxlIgorCisjOiBtZW1saW5lLmM6NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICIiCisiRTMwMzogTm9uIHJpZXNjbyBhZCBhcHJpbGUgbG8gc3dhcCBmaWxlIHBlciBcIiVzXCIsIHJlY3VwZXJvIGltcG9zc2libGUiCisKKyM6IG1lbWxpbmUuYzo2MTgKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6IE5vbiByaWVzY28gYSBsZWdnZXJlIGJsb2NjbyAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTogTmVzc3VuIHN3YXAgZmlsZSB0cm92YXRvIHBlciAlcyIKKworIzogbWVtbGluZS5jOjc2OAorbXNnaWQgIkVudGVyIG51bWJlciBvZiBzd2FwIGZpbGUgdG8gdXNlICgwIHRvIHF1aXQpOiAiCittc2dzdHIgIkRpbW1pIG51bWVybyBkaSBzd2FwIGZpbGUgZGEgdXNhcmUgKDAgcGVyIGxhc2NpYXIgcGVyZGVyZSk6ICIKKworIzogbWVtbGluZS5jOjgxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogTm9uIHJpZXNjbyBhZCBhcHJpcmUgJXMiCisKKyM6IG1lbWxpbmUuYzo4MzUKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICJOb24gcmllc2NvIGEgbGVnZ2VyZSBpbCBibG9jY28gMCBkYSAiCisKKyM6IG1lbWxpbmUuYzo4MzgKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiRm9yc2Ugbm9uIGNpIHNvbm8gc3RhdGUgbW9kaWZpY2hlIG9wcHVyZSBWaW0gbm9uIGhhIGFnZ2lvcm5hdG8gbG8gc3dhcCBmaWxlLiIKKworIzogbWVtbGluZS5jOjg0OCBtZW1saW5lLmM6ODY1Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5vbiBwdfIgZXNzZXJlIHVzYXRvIGNvbiBxdWVzdGEgdmVyc2lvbmUgZGkgVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODUwCittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiVXNhIFZpbSB2ZXJzaW9uZSAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgbm9uIHNlbWJyYSB1bm8gc3dhcCBmaWxlIFZpbSIKKworIzogbWVtbGluZS5jOjg2OQorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIgorbXNnc3RyICIgbm9uIHB18iBlc3NlcmUgdXNhdG8gc3UgcXVlc3RvIGNvbXB1dGVyLlxuIgorCisjOiBtZW1saW5lLmM6ODcxCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICJJbCBmaWxlIOggc3RhdG8gY3JlYXRvIGlsICIKKworIzogbWVtbGluZS5jOjg3NQorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisibyBpbCBmaWxlIOggc3RhdG8gZGFubmVnZ2lhdG8uIgorCisjOiBtZW1saW5lLmM6OTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlVzbyBzd2FwIGZpbGUgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICJGaWxlIG9yaWdpbmFsZSBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MjMKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiIgorIkUzMDg6IEF0dGVuemlvbmU6IGlsIGZpbGUgb3JpZ2luYWxlIHB18iBlc3NlcmUgc3RhdG8gbW9kaWZpY2F0byBuZWwgZnJhdHRlbXBvIgorCisjOiBtZW1saW5lLmM6OTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogSW1wb3NzaWJpbGUgbGVnZ2VyZSBibG9jY28gMSBkYSAlcyIKKworIzogbWVtbGluZS5jOjk4MAorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/TU9MVEUgTElORUUgTUFOQ0FOVEkiCisKKyM6IG1lbWxpbmUuYzo5OTYKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz9DT05UQVRPUkUgTElORUUgRVJSQVRPIgorCisjOiBtZW1saW5lLmM6MTAwMworbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9CTE9DQ08gVlVPVE8iCisKKyM6IG1lbWxpbmUuYzoxMDI5Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/TElORUUgTUFOQ0FOVEkiCisKKyM6IG1lbWxpbmUuYzoxMDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBJRCBkZWwgQmxvY2NvIDEgZXJyYXRvIChjaGUgJXMgbm9uIHNpYSB1biAuc3dwIGZpbGU/KSIKKworIzogbWVtbGluZS5jOjEwNjYKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CTE9DQ08gTUFOQ0FOVEUiCisKKyM6IG1lbWxpbmUuYzoxMDgyCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IGRhIHF1aSBmaW5vIGEgPz8/RU5EIGxlIGxpbmVlIHBvc3Nvbm8gZXNzZXJlIGZ1b3JpIG9yZGluZSIKKworIzogbWVtbGluZS5jOjEwOTgKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIiIKKyI/Pz8gZGEgcXVpIGZpbm8gYSA/Pz9FTkQgbGluZWUgcG9zc29ubyBlc3NlcmUgc3RhdGUgaW5zZXJpdGUvY2FuY2VsbGF0ZSIKKworIzogbWVtbGluZS5jOjExMTgKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/P0VORCIKKworIzogbWVtbGluZS5jOjExNDQKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogUmVjdXBlcm8gSW50ZXJyb3R0byIKKworIzogbWVtbGluZS5jOjExNDkKK21zZ2lkICIiCisiRTMxMjogRXJyb3JzIGRldGVjdGVkIHdoaWxlIHJlY292ZXJpbmc7IGxvb2sgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPz8/IgorbXNnc3RyICJFMzEyOiBFcnJvcmkgZHVyYW50ZSByZWN1cGVybzsgY29udHJvbGxhIGxpbmVlIGNoZSBpbml6aWFubyBjb24gPz8/IgorCisjOiBtZW1saW5lLmM6MTE1MQorbXNnaWQgIlNlZSBcIjpoZWxwIEUzMTJcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIlZlZGVyZSBcIjpoZWxwIEUzMTJcIiBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICJSZWN1cGVybyBjb21wbGV0YXRvLiBEb3ZyZXN0aSBjb250cm9sbGFyZSBzZSB2YSB0dXR0byBiZW5lLiIKKworIzogbWVtbGluZS5jOjExNTcKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoUG90cmVzdGkgc2FsdmFyZSBxdWVzdG8gZmlsZSBjb24gdW4gYWx0cm8gbm9tZSBlZCBlc2VndWlyZVxuIgorCisjOiBtZW1saW5lLmM6MTE1OAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICInZGlmZicgcmlzcGV0dG8gYWwgZmlsZSBvcmlnaW5hbGUgcGVyIHZlZGVyZSBsZSBkaWZmZXJlbnplKVxuIgorCisjOiBtZW1saW5lLmM6MTE1OQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICIiCisiQ2FuY2VsbGEgaWwgZmlsZSAuc3dwIGluIHNlZ3VpdG8uXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNQorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJTd2FwIGZpbGUgdHJvdmF0aToiCisKKyM6IG1lbWxpbmUuYzoxMzkzCittc2dpZCAiICAgSW4gY3VycmVudCBkaXJlY3Rvcnk6XG4iCittc2dzdHIgIiAgIE5lbGxhIGRpcmVjdG9yeSBpbiB1c286XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk1Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIFVzbyBpbCBub21lIGZvcm5pdG86XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk5Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgTmVsbGEgZGlyZWN0b3J5ICIKKworIzogbWVtbGluZS5jOjE0MTcKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIG5lc3N1bm8gLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODkKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgcHJvcHJpZXRhcmlvOiAiCisKKyM6IG1lbWxpbmUuYzoxNDkxCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICBkYXRhdG86ICIKKworIzogbWVtbGluZS5jOjE0OTUgbWVtbGluZS5jOjM2ODUKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgZGF0YXRvOiAiCisKKyM6IG1lbWxpbmUuYzoxNTExCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW2RhIFZpbSB2ZXJzaW9uZSAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUxNQorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICBbbm9uIGFzc29taWdsaWEgYWQgdW5vIHN3YXAgZmlsZSBWaW1dIgorCisjOiBtZW1saW5lLmM6MTUxOQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICBub21lIGZpbGU6ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIG1vZGlmaWNhdG86ICIKKworIzogbWVtbGluZS5jOjE1MjYKK21zZ2lkICJZRVMiCittc2dzdHIgIllFUyIKKworIzogbWVtbGluZS5jOjE1MjYKK21zZ2lkICJubyIKK21zZ3N0ciAibm8iCisKKyM6IG1lbWxpbmUuYzoxNTMwCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgIG5vbWUgdXRlbnRlOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIG5vbWUgY29tcHV0ZXI6ICIKKworIzogbWVtbGluZS5jOjE1MzkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgbm9tZSBjb21wdXRlcjogIgorCisjOiBtZW1saW5lLmM6MTU0NQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgIHByb2Nlc3MgSUQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgIElEIGRlbCBwcm9jZXNzbzogIgorCisjOiBtZW1saW5lLmM6MTU1MQorbXNnaWQgIiAoc3RpbGwgcnVubmluZykiCittc2dzdHIgIiAoYW5jb3JhIGF0dGl2bykiCisKKyM6IG1lbWxpbmUuYzoxNTYzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbV0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbbm9uIHV0aWxpenphYmlsZSBjb24gcXVlc3RhIHZlcnNpb25lIGRpIFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTY2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW25vdCB1dGlsaXp6YWJpbGUgc3UgcXVlc3RvIGNvbXB1dGVyXSIKKworIzogbWVtbGluZS5jOjE1NzEKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICAgW25vbiBsZWdnaWJpbGVdIgorCisjOiBtZW1saW5lLmM6MTU3NQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICBbbm9uIHJpZXNjbyBhZCBhcHJpcmVdIgorCisjOiBtZW1saW5lLmM6MTc2NQorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBOb24gcG9zc28gcHJlc2VydmFyZSwgbWFuY2Egc3dhcCBmaWxlIgorCisjOiBtZW1saW5lLmM6MTgxOAorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJGaWxlIHByZXNlcnZhdG8iCisKKyM6IG1lbWxpbmUuYzoxODIwCittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBQcmVzZXJ2YXppb25lIGZhbGxpdGEiCisKKyM6IG1lbWxpbmUuYzoxODkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogbnVtZXJvIGxpbmVhIG5vbiB2YWxpZG86ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiBub24gcmllc2NvIGEgdHJvdmFyZSBsYSBsaW5lYSAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzA3Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBJRCBibG9jY28gcHVudGF0b3JpIGVycmF0byAzIgorCisjOiBtZW1saW5lLmM6MjM4NworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGRvdnJlYmJlIGVzc2VyZSAwIgorCisjOiBtZW1saW5lLmM6MjQ0OQorbXNnaWQgIkUzMTg6IFVwZGF0ZWQgdG9vIG1hbnkgYmxvY2tzPyIKK21zZ3N0ciAiRTMxODogQWdnaW9ybmF0aSB0cm9wcGkgYmxvY2NoaT8iCisKKyM6IG1lbWxpbmUuYzoyNjMxCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiBJRCBibG9jY28gcHVudGF0b3JpIGVycmF0byA0IgorCisjOiBtZW1saW5lLmM6MjY1OAorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgImNhbmNlbGxhdG8gYmxvY2NvIDE/IgorCisjOiBtZW1saW5lLmM6Mjg1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTm9uIHJpZXNjbyBhIHRyb3ZhcmUgbGEgbGluZWEgJWxkIgorCisjOiBtZW1saW5lLmM6MzEwMQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IElEIGJsb2NjbyBwdW50YXRvcmkgZXJyYXRvIgorCisjOiBtZW1saW5lLmM6MzExNworbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCBhIHplcm8iCisKKyM6IG1lbWxpbmUuYzozMTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogbnVtZXJvIGxpbmVhIG5vbiBhbW1pc3NpYmlsZTogJWxkIGRvcG8gbGEgZmluZSIKKworIzogbWVtbGluZS5jOjMxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IGNvbnRhdG9yZSBsaW5lZSBlcnJhdG8gbmVsIGJsb2NjbyAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTk5Cittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIkRpbWVuc2lvbmUgJ3N0YWNrJyBhdW1lbnRhdGEiCisKKyM6IG1lbWxpbmUuYzozMjQ1Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiBJRCBibG9jY28gcHVudGF0b3JpIGVycmF0byAyIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTogQVRURU5aSU9ORSIKKworIzogbWVtbGluZS5jOjM2NzYKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJUcm92YXRvIHVubyBzd2FwIGZpbGUgZGkgbm9tZSBcIiIKKworIzogbWVtbGluZS5jOjM2ODAKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIk1lbnRyZSBhcHJpdm8gZmlsZSBcIiIKKworIzogbWVtbGluZS5jOjM2ODkKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgcGn5IFJFQ0VOVEUgZGVsbG8gc3dhcCBmaWxlIVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpIFVuIGFsdHJvIHByb2dyYW1tYSBwdfIgZXNzZXJlIGluIGVkaXQgc3VsbG8gc3Rlc3NvIGZpbGUuXG4iCisiICAgIFNlIOggY29z7CwgYXR0ZW56aW9uZSBhIG5vbiB0cm92YXJ0aSBjb24gZHVlIHZlcnNpb25pXG4iCisiICAgIGRpZmZlcmVudGkgZGVsbG8gc3Rlc3NvIGZpbGUgYSBjdWkgdmVuZ29ubyBhcHBvcnRhdGUgbW9kaWZpY2hlLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBFc2NpLCBvIGNvbnRpbnVhIGNvbiBwcnVkZW56YS5cbiIKKworIzogbWVtbGluZS5jOjM2OTUKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgVW5hIHNlc3Npb25lIGRpIGVkaXQgcGVyIHF1ZXN0byBmaWxlIOggZmluaXRhIG1hbGUuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk2Cittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgU2Ug6CBjb3PsLCB1c2EgXCI6cmVjb3ZlclwiIG9wcHVyZSBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgcGVyIHJlY3VwZXJhcmUgbW9kaWZpY2hlIGZhdHRlICh2ZWRpIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk5Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIFNlIGhhaSBnaeAgZmF0dG8gY2nyLCBjYW5jZWxsYSBpbCBmaWxlIGRpIHN3YXAgXCIiCisKKyM6IG1lbWxpbmUuYzozNzAxCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIHBlciBub24gcmljZXZlcmUgYW5jb3JhIHF1ZXN0byBtZXNzYWdnaW8uXG4iCisKKyM6IG1lbWxpbmUuYzozNzE1IG1lbWxpbmUuYzozNzE5Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICJTd2FwIGZpbGUgXCIiCisKKyM6IG1lbWxpbmUuYzozNzE2IG1lbWxpbmUuYzozNzIyCittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiBnaeAgZXNpc3RlbnRlISIKKworIzogbWVtbGluZS5jOjM3MjUKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIEFUVEVOWklPTkUiCisKKyM6IG1lbWxpbmUuYzozNzI3Cittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiTG8gc3dhcCBmaWxlIGVzaXN0ZSBnaeAhIgorCisjOiBtZW1saW5lLmM6MzczMQorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0IgorbXNnc3RyICIiCisiJk8gQXByaSBzb2xhLWxldHR1cmFcbiIKKyImRSBBcHJpIGNvbXVucXVlXG4iCisiJlJlY3VwZXJhXG4iCisiJlEgRXNjaVxuIgorIiZBbm51bGxhIgorCisjOiBtZW1saW5lLmM6MzczMworbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIiZPIEFwcmkgc29sYS1sZXR0dXJhXG4iCisiJkUgQXByaSBjb211bnF1ZVxuIgorIiZSZWN1cGVyYVxuIgorIiZRIEVzY2lcbiIKKyImQW5udWxsYVxuIgorIiZEIENhbmNlbGxhbG8iCisKKyM6IG1lbWxpbmUuYzozNzkwCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogVHJvdmF0aSB0cm9wcGkgc3dhcCBmaWxlIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiIgorIkUzMjc6IFBhcnRlIGRlbCBwZXJjb3JzbyBkaSBxdWVzdG8gZWxlbWVudG8gZGkgTWVudSBub24g6CB1biBzb3R0by1NZW51IgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogSSBNZW51IGVzaXN0b25vIHNvbG8gaW4gdW4nYWx0cmEgbW9kYWxpdOAiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiBOZXNzdW4gTWVudSBjb24gcXVlbCBub21lIgorCisjOiBtZW51LmM6NTI1Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogSWwgcGVyY29yc28gZGVsIE1lbnUgbm9uIGRldmUgY29uZHVycmUgYSB1biBzb3R0by1NZW51IgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIiIKKyJFMzMxOiBOb24gZGV2aSBhZ2dpdW5nZXJlIGVsZW1lbnRpIGRpIE1lbnUgZGlyZXR0YW1lbnRlIGFsbGEgYmFycmEgTWVudSIKKworIzogbWVudS5jOjU3MAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogSWwgc2VwYXJhdG9yZSBub24gcHXyIGZhciBwYXJ0ZSBkaSB1biBwZXJjb3JzbyBkaSBNZW51IgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDk3Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTWVudSAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJUb2dsaSBxdWVzdG8gTWVudSIKKworIzogbWVudS5jOjIwODQKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBJbCBwZXJjb3JzbyBNZW51IGRldmUgY29uZHVycmUgYWQgdW4gZWxlbWVudG8gTWVudSIKKworIzogbWVudS5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBNZW51IG5vbiB0cm92YXRvOiAlcyIKKworIzogbWVudS5jOjIxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogTWVudSBub24gZGVmaW5pdG8gcGVyIGxhIG1vZGFsaXTgICVzIgorCisjOiBtZW51LmM6MjIxMQorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjogSWwgcGVyY29yc28gTWVudSBkZXZlIGNvbmR1cnJlIGFkIHVuIHNvdHRvLU1lbnUiCisKKyM6IG1lbnUuYzoyMjMyCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBNZW51IG5vbiB0cm92YXRvIC0gY29udHJvbGxhIG5vbWkgTWVudSIKKworIzogbWVzc2FnZS5jOjQxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAiRXJyb3JlL2kgZXNlZ3VlbmRvICVzOiIKKworIzogbWVzc2FnZS5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICJsaW5lYSAlNGxkOiIKKworIzogbWVzc2FnZS5jOjY0NworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJbc3RyaW5nYSB0cm9wcG8gbHVuZ2FdIgorCisjOiBtZXNzYWdlLmM6Nzk3Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIk1hbnV0ZW50b3JlIG1lc3NhZ2dpOiBWbGFkIFNhbmRyaW5pIDxtYXJjb0BzYW5kcmluaS5iaXo+IgorCisjOiBtZXNzYWdlLmM6MTAyNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJJbnRlcnJ1emlvbmU6ICIKKworIzogbWVzc2FnZS5jOjEwMjgKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIklOVklPIHBlciBwcm9zZWd1aXJlIgorCisjOiBtZXNzYWdlLmM6MTAzMAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIkJhdHRpIElOVklPIG8gdW4gY29tYW5kbyBwZXIgcHJvc2VndWlyZSIKKworIzogbWVzc2FnZS5jOjIzNTEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBBbmNvcmEgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IGxpbmVhLCBTUEFaSU8vYjogcGFnaW5hLCBkL3U6IG1lenphIHBhZ2luYSwgcTogZXNjaSkiCisKKyM6IG1lc3NhZ2UuYzoyMzU1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDogbGluZWEsIFNQQVpJTzogcGFnaW5hLCBkOiBtZXp6YSBwYWdpbmEsIHE6IGVzY2kpIgorCisjOiBtZXNzYWdlLmM6Mjk4MiBtZXNzYWdlLmM6Mjk5NworbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJEb21hbmRhIgorCisjOiBtZXNzYWdlLmM6Mjk4NAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlkgU+xcbiIKKyImTm8iCisKKyM6IG1lc3NhZ2UuYzozMDE3Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlkgU+xcbiIKKyImTm9cbiIKKyImQSBTYWx2YSB0dXR0b1xuIgorIiZEIFNjYXJ0YSBUdXR0b1xuIgorIiZDYW5jZWxsYSIKKworIzogbWVzc2FnZS5jOjMwNTgKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICJTYWx2YSBGaWxlIGRpYWxvZ28iCisKKyM6IG1lc3NhZ2UuYzozMDYwCittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiQXByaSBGaWxlIGRpYWxvZ28iCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MzEzMQorbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiBTcGlhY2VudGUsIG5pZW50ZSBlc3Bsb3JhemlvbmUgZmlsZSBpbiBtb2RhbGl04CBjb25zb2xlIgorCisjOiBtaXNjMS5jOjI3NzMKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBBdHRlbnppb25lOiBNb2RpZmljYSBhIHVuIGZpbGUgaW4gc29sYS1sZXR0dXJhIgorCisjOiBtaXNjMS5jOjMwMjEKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAiMSBsaW5lYSBpbiBwafkiCisKKyM6IG1pc2MxLmM6MzAyMworbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICIxIGxpbmVhIGluIG1lbm8iCisKKyM6IG1pc2MxLmM6MzAyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiJWxkIGxpbmVlIGluIHBp+SIKKworIzogbWlzYzEuYzozMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAiJWxkIGxpbmVlIGluIG1lbm8iCisKKyM6IG1pc2MxLmM6MzAzMworbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKEludGVycm90dG8pIgorCisjOiBtaXNjMS5jOjc1ODgKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiBwcmVzZXJ2byBmaWxlLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo3NTk4Cittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiBGaW5pdG8uXG4iCisKKyM6IG1pc2MyLmM6Njk1IG1pc2MyLmM6NzExCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRVJST1JFOiAiCisKKyM6IG1pc2MyLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbGkgYWxsb2MtcmlsYXNjICVsdS0lbHUsIGluIHVzbyAlbHUsIG1heCB1c28gJWx1XG4iCisKKyM6IG1pc2MyLmM6NzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIltjaGlhbWF0ZV0gdG90YWxlIHJlL21hbGxvYygpICVsdSwgdG90YWxlIGZyZWUoKSAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBMYSBsaW5lYSBzdGEgZGl2ZW50YW5kbyB0cm9wcG8gbHVuZ2EiCisKKyM6IG1pc2MyLmM6ODE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiBFcnJvcmUgaW50ZXJubzogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IE5vbiBjJ+ggcGn5IG1lbW9yaWEhIChzdGF2byBhbGxvY2FuZG8gJWx1IGJ5dGVzKSIKKworIzogbWlzYzIuYzoyNTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJDaGlhbW8gbG8gc2hlbGwgcGVyIGVzZWd1aXJlOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6MjgxNgorbXNnaWQgIkU1NDU6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NDU6IE1hbmNhICc6JyIKKworIzogbWlzYzIuYzoyODE4IG1pc2MyLmM6Mjg0NQorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0NjogTW9kYWxpdOAgbm9uIHZhbGlkYSIKKworIzogbWlzYzIuYzoyODg0Cittc2dpZCAiRTU0NzogSWxsZWdhbCBtb3VzZXNoYXBlIgorbXNnc3RyICJFNTQ3OiBGb3JtYSBkZWwgbW91c2Ugbm9uIHZhbGlkYSIKKworIzogbWlzYzIuYzoyOTI0Cittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IGFzcGV0dGF2byB1biBudW1lcm8iCisKKyM6IG1pc2MyLmM6MjkyOQorbXNnaWQgIkU1NDk6IElsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAiRTU0OTogUGVyY2VudHVhbGUgbm9uIHZhbGlkYSIKKworIzogbWlzYzIuYzozMjM5Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiSW1tZXR0aSBjaGlhdmUgZGkgY3JpdHRhemlvbmU6ICIKKworIzogbWlzYzIuYzozMjQwCittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiUmliYXR0aSBwZXIgY29uZmVybWEgbGEgc3Rlc3NhIGNoaWF2ZTogIgorCisjOiBtaXNjMi5jOjMyNTAKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAiTGUgY2hpYXZpIG5vbiBjb3JyaXNwb25kb25vISIKKworIzogbWlzYzIuYzozNzk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICIiCisiRTM0MzogUGVyY29yc28gbm9uIHZhbGlkbzogJyoqW251bWVyb10nIGRldmUgZXNzZXJlIGEgZmluZSBwZXJjb3JzbyBvIGVzc2VyZSAiCisic2VndWl0byBkYSAnJXMnLiIKKworIzogbWlzYzIuYzo1MDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IE5vbiByaWVzY28gYSB0cm92YXJlIGxhIGRpcmVjdG9yeSBcIiVzXCIgbmVsICdjZHBhdGgnIgorCisjOiBtaXNjMi5jOjUwODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiBOb24gcmllc2NvIGEgdHJvdmFyZSBpbCBmaWxlIFwiJXNcIiBuZWwgcGVyY29yc28iCisKKyM6IG1pc2MyLmM6NTA4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiBOZXNzdW4gYWx0cmEgZGlyZWN0b3J5IFwiJXNcIiB0cm92YXRhIG5lbCAnY2RwYXRoJyIKKworIzogbWlzYzIuYzo1MDkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NzogTmVzc3VuIGFsdHJvIGZpbGUgXCIlc1wiIHRyb3ZhdG8gbmVsIHBlcmNvcnNvIgorCisjOiBtaXNjMi5jOjUzMjQKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiBNYW5jYSAnOiciCisKKyM6IG1pc2MyLmM6NTMzNgorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiBDb21wb25lbnRlIG5vbiB2YWxpZG8iCisKKyM6IG1pc2MyLmM6NTM0NAorbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiBhc3BldHRhdm8gdW4gbnVtZXJvIgorCisjLiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjOiBuZXRiZWFucy5jOjM5NgorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zICMyIgorbXNnc3RyICJOb24gcG9zc28gY29ubmV0dGVybWkgYSBOZXRiZWFucyAjMiIKKworIzogbmV0YmVhbnMuYzo0MDQKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIKK21zZ3N0ciAiTm9uIHBvc3NvIGNvbm5ldHRlcm1pIGEgTmV0YmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6NDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2Njg6IFdyb25nIGFjY2VzcyBtb2RlIGZvciBOZXRCZWFucyBjb25uZWN0aW9uIGluZm8gZmlsZTogXCIlc1wiIgorbXNnc3RyICIiCisiRTY2ODogTW9kYWxpdOAgZXJyYXRhIGRpIGFjY2Vzc28gYSBmaWxlIGluZm8gY29ubmVzc2lvbmUgTmV0QmVhbnM6IFwiJXNcIiIKKworIzogbmV0YmVhbnMuYzo3NDkKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICJsZXR0dXJhIGRhIHNvY2tldCBOZXRiZWFucyIKKworIzogbmV0YmVhbnMuYzoxNjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NTg6IE5ldEJlYW5zIGNvbm5lY3Rpb24gbG9zdCBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTY1ODogQ29ubmVzc2lvbmUgTmV0QmVhbnMgcGVyc2EgcGVyIGlsIGJ1ZmZlciAlbGQiCisKKyM6IG5vcm1hbC5jOjI5ODAKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJBdHRlbnppb25lOiBpbCB0ZXJtaW5hbGUgbm9uIOggaW4gZ3JhZG8gZGkgZXZpZGVuemlhcmUiCisKKyM6IG5vcm1hbC5jOjMyNzYKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiBOZXNzdW5hIHN0cmluZ2Egc290dG8gaWwgY3Vyc29yZSIKKworIzogbm9ybWFsLmM6MzI3OAorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiBOZXNzdW4gaWRlbnRpZmljYXRpdm8gc290dG8gaWwgY3Vyc29yZSIKKworIzogbm9ybWFsLmM6NDUxOQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiBOb24gcG9zc28gdG9nbGllcmUgcGllZ2F0dXJlIGNvbiBpbCAnZm9sZG1ldGhvZCcgaW4gdXNvIgorCisjOiBub3JtYWwuYzo2NzQwCittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDogbGlzdGEgbW9kaWZpY2hlIHZ1b3RhIgorCisjOiBub3JtYWwuYzo2NzQyCittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MjogQWxsJ2luaXppbyBkZWxsYSBsaXN0YSBtb2RpZmljaGUiCisKKyM6IG5vcm1hbC5jOjY3NDQKK21zZ2lkICJFNjYzOiBBdCBlbmQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MzogQWxsYSBmaW5lIGRlbGxhIGxpc3RhIG1vZGlmaWNoZSIKKworIzogbm9ybWFsLmM6ODAwNgorbXNnaWQgIlR5cGUgIDpxdWl0PEVudGVyPiAgdG8gZXhpdCBWaW0iCittc2dzdHIgIkJhdHRpIDpxdWl0PEludmlvPiAgcGVyIHVzY2lyZSBkYSBWaW0iCisKKyM6IG9wcy5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgIjEgbGluZWEgJXNhIDEgdm9sdGEiCisKKyM6IG9wcy5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSBsaW5lYSAlc2EgJWQgdm9sdGUiCisKKyM6IG9wcy5jOjMwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCBsaW5lZSAlc2UgMSB2b2x0YSIKKworIzogb3BzLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQgbGluZWUgJXNlICVkIHZvbHRlIgorCisjOiBvcHMuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIiVsZCBsaW5lZSBkYSByaWVudHJhcmUuLi4gIgorCisjOiBvcHMuYzo3MTIKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxIGxpbmVhIHJpZW50cmF0YSAiCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgbGluZWUgcmllbnRyYXRlICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2ODgKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAibm9uIHJpZXNjbyBhIHNhbHZhcmUgaW4gdW4gcmVnaXN0cm87IGNhbmNlbGxvIGNvbXVucXVlIgorCisjOiBvcHMuYzoyMjc0Cittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgbGluZWEgY2FtYmlhdGEiCisKKyM6IG9wcy5jOjIyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiVsZCBsaW5lZSBjYW1iaWF0ZSIKKworIzogb3BzLmM6MjY2MAorIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAibGliZXJvICVsZCBsaW5lZSIKKworIzogb3BzLmM6Mjk0MQorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIjEgbGluZWEgbWVzc2EgaW4gcmVnaXN0cm8iCisKKyM6IG9wcy5jOjI5NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAiJWxkIGxpbmVlIG1lc3NlIGluIHJlZ2lzdHJvIgorCisjOiBvcHMuYzozMjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IE5pZW50ZSBuZWwgcmVnaXN0cm8gJXMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6Mzc3OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBSZWdpc3RyaSAtLS0iCisKKyM6IG9wcy5jOjUwODgKK21zZ2lkICJJbGxlZ2FsIHJlZ2lzdGVyIG5hbWUiCittc2dzdHIgIk5vbWUgcmVnaXN0cm8gbm9uIGFtbWVzc28iCisKKyM6IG9wcy5jOjUxNzYKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlZ2lzdHJpOlxuIgorCisjOiBvcHMuYzo1MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDogVGlwbyBkaSByZWdpc3RybyBzY29ub3NjaXV0bzogJWQiCisKKyM6IG9wcy5jOjU3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiBOb21lIHJlZ2lzdHJvIG5vbiB2YWxpZG86ICclcyciCisKKyM6IG9wcy5jOjYwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIENvbC47ICIKKworIzogb3BzLmM6NjA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIlNlbGV6aW9uYXRlICVzJWxkIGRpICVsZCBsaW5lZTsgJWxkIGRpICVsZCBwYXJvbGU7ICVsZCBkaSAlbGQgY2FyYXR0LiIKKworIzogb3BzLmM6NjA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIkNvbC4gJXMgZGkgJXM7IExpbmVhICVsZCBkaSAlbGQ7IFBhcm9sYSAlbGQgZGkgJWxkOyBDYXJhdHQuICVsZCBkaSAlbGQiCisKKyM6IG9wcy5jOjYxMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHBlciBCT00pIgorCisjOiBvcHRpb24uYzoxNjQzCittc2dpZCAiJTwlZiVoJW0lPVBhZ2UgJU4iCittc2dzdHIgIiU8JWYlaCVtJT1QYWdpbmEgJU4iCisKKyM6IG9wdGlvbi5jOjIwOTIKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIkdyYXppZSBwZXIgYXZlciB2b2xhdG8gY29uIFZpbSIKKworIzogb3B0aW9uLmM6MzQxOSBvcHRpb24uYzozNTM1Cittc2dpZCAiRTUxODogVW5rbm93biBvcHRpb24iCittc2dzdHIgIkU1MTg6IE9wemlvbmUgaW5lc2lzdGVudGUiCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogT3B6aW9uZSBub24gc3VwcG9ydGF0YSIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IE5vbiBjb25zZW50aXRvIGluIHVuYSAnbW9kZWxpbmUnIgorCisjOiBvcHRpb24uYzozNTIyCittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdEltcG9zdGF0YSBsJ3VsdGltYSB2b2x0YSBkYSAiCisKKyM6IG9wdGlvbi5jOjM2NjEKK21zZ2lkICJFNTIxOiBOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiRTUyMTogQ2kgdnVvbGUgdW4gbnVtZXJvIGRvcG8gPSIKKworIzogb3B0aW9uLmM6Mzk4OSBvcHRpb24uYzo0NjE5Cittc2dpZCAiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1MjI6IE5vbiB0cm92YXRvIGluICd0ZXJtY2FwJyIKKworIzogb3B0aW9uLmM6NDA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM5OiBJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICJFNTM5OiBDYXJhdHRlcmUgbm9uIGFtbWVzc28gPCVzPiIKKworIzogb3B0aW9uLmM6NDYxMQorbXNnaWQgIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUyOTogTm9uIHBvc3NvIGFzc2VnbmFyZSBhICd0ZXJtJyBpbCB2YWxvcmUgJ3N0cmluZ2EgbnVsbGEnIgorCisjOiBvcHRpb24uYzo0NjE0Cittc2dpZCAiRTUzMDogQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiRTUzMDogTm9uIHBvc3NvIG1vZGlmaWNhcmUgJ3Rlcm0nIG1lbnRyZSBzb25vIG5lbGxhIEdVSSIKKworIzogb3B0aW9uLmM6NDYxNgorbXNnaWQgIkU1MzE6IFVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFNTMxOiBVc2EgXCI6Z3VpXCIgcGVyIGZhciBwYXJ0aXJlIGxhIEdVSSIKKworIzogb3B0aW9uLmM6NDY0NQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXBleHQnIGUgJ3BhdGNobW9kZScgc29ubyB1Z3VhbGkiCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogTm9uIHB18iBlc3NlcmUgY2FtYmlhdG8gbmVsbGEgR1VJIEdUSysgMiIKKworIzogb3B0aW9uLmM6NTAxNgorbXNnaWQgIkU1MjQ6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1MjQ6IE1hbmNhICc6JyIKKworIzogb3B0aW9uLmM6NTAxOAorbXNnaWQgIkU1MjU6IFplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiRTUyNTogU3RyaW5nYSBudWxsYSIKKworIzogb3B0aW9uLmM6NTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiBNYW5jYSBudW1lcm8gZG9wbyA8JXM+IgorCisjOiBvcHRpb24uYzo1MTAwCittc2dpZCAiRTUyNzogTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiRTUyNzogTWFuY2EgdmlyZ29sYSIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IERldmkgc3BlY2lmaWNhcmUgdW4gdmFsb3JlICciCisKKyM6IG9wdGlvbi5jOjUxNDgKK21zZ2lkICJFNTk1OiBjb250YWlucyB1bnByaW50YWJsZSBvciB3aWRlIGNoYXJhY3RlciIKK21zZ3N0ciAiRTU5NTogY29udGllbmUgY2FyYXR0ZXJlICd3aWRlJyBvIG5vbi1zdGFtcGFiaWxlIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBGb250IG5vbiB2YWxpZGkiCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5Nzogbm9uIHBvc3NvIHNlbGV6aW9uYXJlIGZvbnRzZXQiCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IEZvbnRzZXQgbm9uIHZhbGlkbyIKKworIzogb3B0aW9uLmM6NTIxNAorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IG5vbiBwb3NzbyBzZWxlemlvbmFyZSAnd2lkZSBmb250JyIKKworIzogb3B0aW9uLmM6NTIxNgorbXNnaWQgIkU1MzQ6IEludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJFNTM0OiAnV2lkZSBmb250JyBub24gdmFsaWRvIgorCisjOiBvcHRpb24uYzo1NDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MzU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIkU1MzU6IENhcmF0dGVyZSBub24gYW1tZXNzbyBkb3BvIDwlYz4iCisKKyM6IG9wdGlvbi5jOjU1OTcKK21zZ2lkICJFNTM2OiBjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAiRTUzNjogdmlyZ29sYSBtYW5jYW50ZSIKKworIzogb3B0aW9uLmM6NTYwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNTM3OiAnY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICJFNTM3OiAnY29tbWVudHN0cmluZycgZGV2ZSBlc3NlcmUgbnVsbGEgbyBjb250ZW5lcmUgJXMiCisKKyM6IG9wdGlvbi5jOjU2ODIKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiBNYW5jYSBzdXBwb3J0byBtb3VzZSIKKworIzogb3B0aW9uLmM6NTk1MAorbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IEVzcHJlc3Npb25lIG5vbiB0ZXJtaW5hdGEiCisKKyM6IG9wdGlvbi5jOjU5NTQKK21zZ2lkICJFNTQxOiB0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAiRTU0MTogdHJvcHBpIGVsZW1lbnRpIgorCisjOiBvcHRpb24uYzo1OTU2Cittc2dpZCAiRTU0MjogdW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIkU1NDI6IGdydXBwaSBzYmlsYW5jaWF0aSIKKworIzogb3B0aW9uLmM6NjE5NgorbXNnaWQgIkU1OTA6IEEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU1OTA6IFVuYSBmaW5lc3RyYSBkaSBwcmUtdmlzdWFsaXp6YXppb25lIGVzaXN0ZSBnaeAiCisKKyM6IG9wdGlvbi5jOjY0NTMKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICJXMTc6IEFyYWJvIHJpY2hpZWRlIFVURi04LCBlc2VndWkgJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorCisjOiBvcHRpb24uYzo2Nzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IFNlcnZvbm8gYWxtZW5vICVkIGxpbmVlIgorCisjOiBvcHRpb24uYzo2Nzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDogU2Vydm9ubyBhbG1lbm8gJWQgY29sb25uZSIKKworIzogb3B0aW9uLmM6NzEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE9wemlvbmUgaW5lc2lzdGVudGU6ICVzIgorCisjOiBvcHRpb24uYzo3MjIzCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gQ29kaWNpIHRlcm1pbmFsZSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjUKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBWYWxvcmkgb3B6aW9uaSBnbG9iYWxpIC0tLSIKKworIzogb3B0aW9uLmM6NzIyNworbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVmFsb3JlIG9wemlvbmkgZ2xvYmFsaSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjkKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE9wemlvbmkgLS0tIgorCisjOiBvcHRpb24uYzo3OTM1Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IEVSUk9SRSBnZXRfdmFycCIKKworIzogb3B0aW9uLmM6ODkwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiBNYW5jYSBjYXJhdHRlcmUgY29ycmlzcG9uZGVudGUgcGVyICVzIgorCisjOiBvcHRpb24uYzo4OTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IENhcmF0dGVyaSBpbiBwafkgZG9wbyBpbCAnOyc6ICVzIgorCisjOiBvc19hbWlnYS5jOjI4MAorbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAibm9uIHJpZXNjbyBhZCBhcHJpcmUgIgorCisjOiBvc19hbWlnYS5jOjMxNAorbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogTm9uIHJpZXNjbyBhZCBhcHJpcmUgbGEgZmluZXN0cmEhXG4iCisKKyM6IG9zX2FtaWdhLmM6MzM4Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAiU2VydmUgQW1pZ2Fkb3MgdmVyc2lvbmUgMi4wNCBvIHN1Y2Nlc3NpdmFcbiIKKworIzogb3NfYW1pZ2EuYzozNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJTZXJ2ZSAlcyB2ZXJzaW9uZSAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MTYKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIk5vbiByaWVzY28gYWQgYXByaXJlIE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MjcKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAiTm9uIHJpZXNjbyBhIGNyZWFyZSAiCisKKyM6IG9zX2FtaWdhLmM6OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIGVzY2UgY29uICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTQxCittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAibm9uIHBvc3NvIG1vZGlmaWNhcmUgbW9kYWxpdOAgY29uc29sZSA/IVxuIgorCisjOiBvc19hbWlnYS5jOjEwMTIKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiBub24gdW5hIGNvbnNvbGU/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTYxCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IE5vbiBwb3NzbyBlc2VndWlyZSBsbyBzaGVsbCBjb24gbCdvcHppb25lIC1mIgorCisjOiBvc19hbWlnYS5jOjEyMDIgb3NfYW1pZ2EuYzoxMjkyCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJOb24gcmllc2NvIGEgZXNlZ3VpcmUgIgorCisjOiBvc19hbWlnYS5jOjEyMDUgb3NfYW1pZ2EuYzoxMzAyCittc2dpZCAic2hlbGwgIgorbXNnc3RyICJzaGVsbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIyNSBvc19hbWlnYS5jOjEzMjcKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIG90dGVudXRvXG4iCisKKyM6IG9zX2FtaWdhLmM6MTQ2OAorbXNnaWQgIkFOQ0hPUl9CVUZfU0laRSB0b28gc21hbGwuIgorbXNnc3RyICJBTkNIT1JfQlVGX1NJWkUgdHJvcHBvIHBpY2NvbG8uIgorCisjOiBvc19hbWlnYS5jOjE0NzIKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkVSUk9SRSBJL08iCisKKyM6IG9zX21zd2luLmM6NTQ4Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLih0cm9uY2F0bykiCisKKyM6IG9zX21zd2luLmM6NjUwCittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyBub24gdmFsZSA4MCwgbm9uIHJpZXNjbyBhZCBlc2VndWlyZSBjb21hbmRpIGVzdGVybmkiCisKKyM6IG9zX21zd2luLmM6MTk4MgorbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogU2NlbHRhIHN0YW1wYW50ZSBub24gcml1c2NpdGEiCisKKyM6IG9zX21zd2luLmM6MjAyMgorIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAiYSAlcyBzdSAlcyIKKworIzogb3NfbXN3aW4uYzoyMDM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTM6IFVua25vd24gcHJpbnRlciBmb250OiAlcyIKK21zZ3N0ciAiRTYxMzogRm9udCBwZXIgc3RhbXBhbnRlIHNjb25vc2NpdXRvOiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDg2IG9zX21zd2luLmM6MjA5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM4OiBQcmludCBlcnJvcjogJXMiCittc2dzdHIgIkUyMzg6IEVycm9yZSBkdXJhbnRlIHN0YW1wYTogJXMiCisKKyM6IG9zX21zd2luLmM6MjA5NworbXNnaWQgIlVua25vd24iCittc2dzdHIgIlNjb25vc2NpdXRvIgorCisjOiBvc19tc3dpbi5jOjIxMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiU3RhbXBhdG86ICclcyciCisKKyM6IG9zX21zd2luLmM6MzIxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDogTm9tZSBkaSBjaGFyc2V0IG5vbiBhbW1lc3NvIFwiJXNcIiBuZWwgZm9udGUgZGkgbm9tZSBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MzIyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBDYXJhdHRlcmUgbm9uIGFtbWVzc28gJyVjJyBuZWwgZm9udCBkaSBub21lIFwiJXNcIiIKKworIzogb3NfcmlzY29zLmM6MTI1OQorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IE9wemlvbmUgJ29zZmlsZXR5cGUnIG5vbiB2YWxpZGEgLSB1c28gJ1RleHQnIgorCisjOiBvc191bml4LmM6OTI3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogU2VnbmFsZSBkb3BwaW8sIGVzY29cbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogSW50ZXJjZXR0YXRvIHNlZ25hbGUgZmF0YWxlICVzXG4iCisKKyM6IG9zX3VuaXguYzo5MzYKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogSW50ZXJjZXR0YXRvIHNlZ25hbGUgZmF0YWxlXG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJBdHRpdmF6aW9uZSB2aXN1YWxpenphemlvbmUgWCBoYSByaWNoaWVzdG8gJWxkIG1zZWMiCisKKyM6IG9zX3VuaXguYzoxMjI2Cittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZpbTogUHJlc28gZXJyb3JlIFhcbiIKKworIzogb3NfdW5peC5jOjEzMzgKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJQcm92YSB2aXN1YWxpenphemlvbmUgWCBmYWxsaXRhIgorCisjOiBvc191bml4LmM6MTQ3NworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIkFwZXJ0dXJhIHZpc3VhbGl6emF6aW9uZSBYOiB0ZW1wbyBzY2FkdXRvIgorCisjOiBvc191bml4LmM6MzIzNCBvc191bml4LmM6MzkxNAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyJOb24gcmllc2NvIGEgZXNlZ3VpcmUgc2hlbGwgIgorCisjOiBvc191bml4LmM6MzI4MgorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisiTm9uIHJpZXNjbyBhIGVzZWd1aXJlIHNoZWxsIHNoXG4iCisKKyM6IG9zX3VuaXguYzozMjg2IG9zX3VuaXguYzozOTIwCittc2dpZCAiIgorIlxuIgorInNoZWxsIHJldHVybmVkICIKK21zZ3N0ciAiIgorIlxuIgorInNoZWxsIHRlcm1pbmF0byBjb24gcmV0dXJuLWNvZGUgIgorCisjOiBvc191bml4LmM6MzQyMQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyJOb24gcG9zc28gY3JlYXJlICdwaXBlJ1xuIgorCisjOiBvc191bml4LmM6MzQzNgorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiTm9uIHJpZXNjbyBhZCBlZmZldHR1YXJlICdmb3JrJ1xuIgorCisjOiBvc191bml4LmM6MzkyNworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIkNvbWFuZG8gdGVybWluYXRvXG4iCisKKyM6IG9zX3VuaXguYzo0MTkxIG9zX3VuaXguYzo0MzE2IG9zX3VuaXguYzo1OTgyCittc2dpZCAiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QIGhhIHBlcnNvIGxhIGNvbm5lc3Npb25lIElDRSIKKworIzogb3NfdW5peC5jOjU1NjUKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJBcGVydHVyYSB2aXN1YWxpenphemlvbmUgWCBmYWxsaXRhIgorCisjOiBvc191bml4LmM6NTg4NworbXNnaWQgIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IgorbXNnc3RyICJYU01QIGdlc3Rpb25lIHJpY2hpZXN0YSAnc2F2ZS15b3Vyc2VsZiciCisKKyM6IG9zX3VuaXguYzo2MDA2Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgYXBlcnR1cmEgY29ubmVzc2lvbmUiCisKKyM6IG9zX3VuaXguYzo2MDI1Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIlhTTVAgb3NzZXJ2YXppb25lIGNvbm5lc3Npb25lIElDRSBmYWxsaXRhIgorCisjOiBvc191bml4LmM6NjA0NQorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb24gZmFsbGl0YTogJXMiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIkFsbGEgbGluZWEiCisKKyM6IG9zX3czMmV4ZS5jOjY1Cittc2dpZCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tbWFuZCBsaW5lLiIKK21zZ3N0ciAiTm9uIHJpZXNjbyBhZCBhbGxvY2FyZSBtZW1vcmlhIHBlciBsaW5lYSBkaSBjb21hbmRvLiIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJFcnJvcmUgVklNIgorCisjOiBvc193MzJleGUuYzo4OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5vbiByaWVzY28gYSBjYXJpY2FyZSB2aW0zMi5kbGwhIgorCisjOiBvc193MzJleGUuYzo5OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIk5vbiBzb25vIHJpdXNjaXRvIGEgaW1wb3N0YXJlIHB1bnRhdG9yaSBkaSBmdW56aW9uZSB2ZXJzbyBsYSBETEwhIgorCisjOiBvc193aW4xNi5jOjM0MiBvc193aW4zMi5jOjMyNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgInNoZWxsIHRlcm1pbmF0byBjb24gcmV0dXJuLWNvZGUgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjcwNgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IEludGVyY2V0dGF0byBldmVudG8gJXNcbiIKKworIzogb3Nfd2luMzIuYzoyNzA4Cittc2dpZCAiY2xvc2UiCittc2dzdHIgImNoaXVzdXJhIgorCisjOiBvc193aW4zMi5jOjI3MTAKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgImxvZ29mZiIKKworIzogb3Nfd2luMzIuYzoyNzExCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgInNodXRkb3duIgorCisjOiBvc193aW4zMi5jOjMyMDEKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogQ29tYW5kbyBub24gdHJvdmF0byIKKworIzogb3Nfd2luMzIuYzozMjE0Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSBub24gdHJvdmF0byBuZWwgdHVvICRQQVRILlxuIgorIkkgY29tYW5kaSBlc3Rlcm5pIG5vbiBmYXJhbm8gdW5hIHBhdXNhIGRvcG8gYXZlciBmaW5pdG8gbCdlc2VjdXppb25lLlxuIgorIlZlZGkgIDpoZWxwIHdpbjMyLXZpbXJ1biAgcGVyIHVsdGVyaW9yaSBpbmZvcm1hemlvbmkuIgorCisjOiBvc193aW4zMi5jOjMyMTcKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiQXZ2aXNvIGRhIFZpbSIKKworIzogcXVpY2tmaXguYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiBUcm9wcGkgJSUlYyBuZWxsYSBzdHJpbmdhIGRpICdmb3JtYXQnIgorCisjOiBxdWlja2ZpeC5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MzogJSUlYyBpbXByZXZpc3RvIG5lbGxhIHN0cmluZ2EgZGkgJ2Zvcm1hdCciCisKKyM6IHF1aWNrZml4LmM6MzI1Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IE1hbmNhIF0gbmVsbGEgc3RyaW5nYSBkaSAnZm9ybWF0JyIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjIG5vbiBzdXBwb3J0YXRvIG5lbGxhIHN0cmluZ2EgZGkgJ2Zvcm1hdCciCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogJSUlYyBub24gdmFsaWRvIG5lbCBwcmVmaXNzbyBkZWxsYSBzdHJpbmdhIGRpICdmb3JtYXQnIgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogJSUlYyBub24gdmFsaWRvIG5lbGxhIHN0cmluZ2EgZGkgJ2Zvcm1hdCciCisKKyM6IHF1aWNrZml4LmM6MzkxCittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIG5vbiBjb250aWVuZSBhbGN1biBtb2RlbGxvIgorCisjOiBxdWlja2ZpeC5jOjUwMQorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IE5vbWUgZGlyZWN0b3J5IG1hbmNhbnRlIG8gbnVsbG8iCisKKyM6IHF1aWNrZml4LmM6OTkwCittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1MzogTm9uIGNpIHNvbm8gcGn5IGVsZW1lbnRpIgorCisjOiBxdWlja2ZpeC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIGRpICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMjMxCittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKGxpbmVhIGNhbmNlbGxhdGEpIgorCisjOiBxdWlja2ZpeC5jOjE0NDQKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IEFsIGZvbmRvIGRlbGxhICdzdGFjaycgZGkgcXVpY2tmaXgiCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogSW4gY2ltYSBhbGxhICdzdGFjaycgZGkgcXVpY2tmaXgiCisKKyM6IHF1aWNrZml4LmM6MTQ2NQorIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgImxpc3RhIGVycm9yaSAlZCBkaSAlZDsgJWQgZXJyb3JpIgorCisjOiBxdWlja2ZpeC5jOjE5NDMKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiBOb24gcG9zc28gc2NyaXZlcmUsIGwnb3B6aW9uZSAnYnVmdHlwZScg6CBpbXBvc3RhdGEiCisKKyM6IHJlZ2V4cC5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY5OiBpbnZhbGlkIGl0ZW0gaW4gJXMlJVtdIgorbXNnc3RyICJFMzY5OiBlbGVtZW50byBub24gdmFsaWRvIGluICVzJSVbXSIKKworIzogcmVnZXhwLmM6ODM4Cittc2dpZCAiRTMzOTogUGF0dGVybiB0b28gbG9uZyIKK21zZ3N0ciAiRTMzOTogRXNwcmVzc2lvbmUgdHJvcHBvIGx1bmdhIgorCisjOiByZWdleHAuYzoxMDA5Cittc2dpZCAiRTUwOiBUb28gbWFueSBcXHooIgorbXNnc3RyICJFNTA6IFRyb3BwZSBcXHooIgorCisjOiByZWdleHAuYzoxMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTogVG9vIG1hbnkgJXMoIgorbXNnc3RyICJFNTE6IFRyb3BwZSAlcygiCisKKyM6IHJlZ2V4cC5jOjEwNzcKK21zZ2lkICJFNTI6IFVubWF0Y2hlZCBcXHooIgorbXNnc3RyICJFNTI6IFNlbnphIHJpc2NvbnRybzogXFx6KCIKKworIzogcmVnZXhwLmM6MTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiBTZW56YSByaXNjb250cm86ICVzJSUoIgorCisjOiByZWdleHAuYzoxMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiBTZW56YSByaXNjb250cm86ICVzKCIKKworIzogcmVnZXhwLmM6MTA4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTU6IFVubWF0Y2hlZCAlcykiCittc2dzdHIgIkU1NTogU2VuemEgcmlzY29udHJvOiAlcykiCisKKyM6IHJlZ2V4cC5jOjEyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiBsJ29wZXJhbmRvICVzKiBub24gcHXyIGVzc2VyZSB2dW90byIKKworIzogcmVnZXhwLmM6MTI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc6ICVzKyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTc6IGwnb3BlcmFuZG8gJXMrIG5vbiBwdfIgZXNzZXJlIHZ1b3RvIgorCisjOiByZWdleHAuYzoxMzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IENhcmF0dGVyZSBub24gYW1tZXNzbyBkb3BvICVzQCIKKworIzogcmVnZXhwLmM6MTM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTg6ICVzeyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTg6IGwnb3BlcmFuZG8gJXN7IHBvdHJlYmJlIGVzc2VyZSB2dW90byIKKworIzogcmVnZXhwLmM6MTM1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA6IFRvbyBtYW55IGNvbXBsZXggJXN7Li4ufXMiCittc2dzdHIgIkU2MDogVHJvcHBpICVzey4uLn1zIGNvbXBsZXNzaSIKKworIzogcmVnZXhwLmM6MTM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogJXMqIG5pZGlmaWNhdG8iCisKKyM6IHJlZ2V4cC5jOjEzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiAlcyVjIG5pZGlmaWNhdG8iCisKKyM6IHJlZ2V4cC5jOjE0OTEKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiB1c28gbm9uIHZhbGlkbyBkaSBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIHNlbnphIG51bGxhIHByaW1hIgorCisjOiByZWdleHAuYzoxNTkyCittc2dpZCAiRTY1OiBJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorbXNnc3RyICJFNjU6IFJpZmVyaW1lbnRvIGFsbCdpbmRpZXRybyBub24gYW1tZXNzbyIKKworIzogcmVnZXhwLmM6MTYwNQorbXNnaWQgIkU2NjogXFx6KCBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjY6IFxceiggbm9uIGNvbnNlbnRpdG8gcXVpIgorCisjOiByZWdleHAuYzoxNjI0Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgZXQgYWwuIG5vbiBjb25zZW50aXRpIHF1aSIKKworIzogcmVnZXhwLmM6MTYzNQorbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IENhcmF0dGVyZSBub24gYW1tZXNzbyBkb3BvIFxceiIKKworIzogcmVnZXhwLmM6MTY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiBNYW5jYSBdIGRvcG8gJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogJXMlJVtdIHZ1b3RvIgorCisjOiByZWdleHAuYzoxNzYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MTogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXMlJSIKK21zZ3N0ciAiRTcxOiBDYXJhdHRlcmUgbm9uIGFtbWVzc28gZG9wbyAlcyUlIgorCisjOiByZWdleHAuYzoyNTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiBFcnJvcmUgc2ludGF0dGljbyBpbiAlc3suLi59IgorCisjOiByZWdleHAuYzoyODYzIHJlZ2V4cC5jOjMwMTYKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTogSW50ZXJjZXR0YXRhIGZpbmUgYW5vcm1hbGU7ICdyZWdleHAnIHRyb3BwbyBjb21wbGVzc2E/IgorCisjOiByZWdleHAuYzozMDA0IHJlZ2V4cC5jOjMwMTMKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IGVycm9yZSBkaSBzdXBlcm8tY2FwYWNpdOAtc3RhY2sgY2F1c2F0byBkYSBlc3ByZXNzaW9uZSIKKworIzogcmVnZXhwLmM6MzI1OAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlNvdHRvLWNvcnJpc3BvbmRlbnplIGVzdGVybmU6XG4iCisKKyM6IHNjcmVlbi5jOjIxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkIGxpbmVlIHBpZWdhdGUiCisKKyM6IHNjcmVlbi5jOjc5OTYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLVNPU1RJVFVJU0NJIgorCisjOiBzY3JlZW4uYzo4MDAwCittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiBTT1NUSVRVSVNDSSIKKworIzogc2NyZWVuLmM6ODAwNQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgSU5WRVJUSVRPIgorCisjOiBzY3JlZW4uYzo4MDA3Cittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiIElOU0VSSVNDSSIKKworIzogc2NyZWVuLmM6ODAxMAorbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiIChpbnNlcmlzY2kpIgorCisjOiBzY3JlZW4uYzo4MDEyCittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiIChzb3N0aXR1aXNjaSkiCisKKyM6IHNjcmVlbi5jOjgwMTQKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2LXNvc3RpdHVpc2NpKSIKKworIzogc2NyZWVuLmM6ODAxNworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBFYnJhaWNvIgorCisjOiBzY3JlZW4uYzo4MDI4Cittc2dpZCAiIEFyYWJpYyIKK21zZ3N0ciAiIEFyYWJvIgorCisjOiBzY3JlZW4uYzo4MDMxCittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiIChsaW5ndWEpIgorCisjOiBzY3JlZW4uYzo4MDM1Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAoaW5jb2xsYSkiCisKKyM6IHNjcmVlbi5jOjgwNDgKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIgVklTVUFMRSIKKworIzogc2NyZWVuLmM6ODA0OQorbXNnaWQgIiBWSVNVQUwgTElORSIKK21zZ3N0ciAiIFZJU1VBTEUgTElORUEiCisKKyM6IHNjcmVlbi5jOjgwNTAKK21zZ2lkICIgVklTVUFMIEJMT0NLIgorbXNnc3RyICIgVklTVUFMRSBCTE9DQ08iCisKKyM6IHNjcmVlbi5jOjgwNTEKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIgU0VMRVpJT05BIgorCisjOiBzY3JlZW4uYzo4MDUyCittc2dpZCAiIFNFTEVDVCBMSU5FIgorbXNnc3RyICIgU0VMRVpJT05BIExJTkVBIgorCisjOiBzY3JlZW4uYzo4MDUzCittc2dpZCAiIFNFTEVDVCBCTE9DSyIKK21zZ3N0ciAiIFNFTEVaSU9OQSBCTE9DQ08iCisKKyM6IHNjcmVlbi5jOjgwNjggc2NyZWVuLmM6ODEzMQorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAicmVnaXN0cmF6aW9uZSIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgInJhZ2dpdW50YSBsYSBDSU1BIG5lbGxhIHJpY2VyY2EsIGNvbnRpbnVvIGRhbCBGT05ETyIKKworIzogc2VhcmNoLmM6MzgKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgInJhZ2dpdW50byBpbCBGT05ETyBuZWxsYSByaWNlcmNhLCBjb250aW51byBkYWxsYSBDSU1BIgorCisjOiBzZWFyY2guYzo1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogU3RyaW5nYSBkaSByaWNlcmNhIG5vbiB2YWxpZGE6ICVzIgorCisjOiBzZWFyY2guYzo4NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBsYSByaWNlcmNhIGhhIHJhZ2dpdW50byBsYSBDSU1BIHNlbnphIHN1Y2Nlc3NvIHBlcjogJXMiCisKKyM6IHNlYXJjaC5jOjg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IGxhIHJpY2VyY2EgaGEgcmFnZ2l1bnRvIGlsIEZPTkRPIHNlbnphIHN1Y2Nlc3NvIHBlcjogJXMiCisKKyM6IHNlYXJjaC5jOjEyNDkKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6ICc/JyBvICcvJyBhdHRlc28gZG9wbyAnOyciCisKKyM6IHNlYXJjaC5jOjM3NjgKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiIChjb21wcmVzZSBjb3JyaXNwb25kZW56ZSBlbGVuY2F0ZSBwcmltYSkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6Mzc4OAorbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBGaWxlIGluY2x1c2kgIgorCisjOiBzZWFyY2guYzozNzkwCittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAibm9uIHRyb3ZhdGkgIgorCisjOiBzZWFyY2guYzozNzkxCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAibmVsIHBlcmNvcnNvIC0tLVxuIgorCisjOiBzZWFyY2guYzozODQ4Cittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgIChHaeAgZWxlbmNhdGkpIgorCisjOiBzZWFyY2guYzozODUwCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAgTk9OIFRST1ZBVE8iCisKKyM6IHNlYXJjaC5jOjM5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIlNjYW5kaXNjbyBmaWxlIGluY2x1c286ICVzIgorCisjOiBzZWFyY2guYzo0MTIwCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBDb3JyaXNwb25kZW56YSBuZWxsYSBsaW5lYSBjb3JyZW50ZSIKKworIzogc2VhcmNoLmM6NDI2MworbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICJUdXR0aSBpIGZpbGUgaW5jbHVzaSBzb25vIHN0YXRpIHRyb3ZhdGkiCisKKyM6IHNlYXJjaC5jOjQyNjUKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiTmVzc3VuIGZpbGUgaW5jbHVzbyIKKworIzogc2VhcmNoLmM6NDI4MQorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogTm9uIHNvbm8gcml1c2NpdG8gYSB0cm92YXJlIGxhIGRlZmluaXppb25lIgorCisjOiBzZWFyY2guYzo0MjgzCittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiBOb24gc29uIHJpdXNjaXRvIGEgdHJvdmFyZSBpbCBtb2RlbGxvIgorCisjOiBzeW50YXguYzozMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiBBcmdvbWVudG8gbm9uIGFtbWVzc286ICVzIgorCisjOiBzeW50YXguYzozMjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiAnY2x1c3Rlcicgc2ludGF0dGljbyBpbmVzaXN0ZW50ZTogJXMiCisKKyM6IHN5bnRheC5jOjMzOTQKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIk5lc3N1biBlbGVtZW50byBzaW50YXR0aWNvIGRlZmluaXRvIHBlciBxdWVzdG8gYnVmZmVyIgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzaW5jcm9uaXp6byBpIGNvbW1lbnRpIG5lbGxvIHN0aWxlIEMiCisKKyM6IHN5bnRheC5jOjM0MTAKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICJuZXNzdW5hIHNzaW5jcm9uaXp6YXppb25lIgorCisjOiBzeW50YXguYzozNDEzCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJsYSBzaW5jcm9uaXp6YXppb25lIGluaXppYSAiCisKKyM6IHN5bnRheC5jOjM0MTUgc3ludGF4LmM6MzQ5MAorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIiBsaW5lZSBwcmltYSBkZWxsYSBsaW5lYSBpbml6aWFsZSIKKworIzogc3ludGF4LmM6MzQyMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEVsZW1lbnRpIHNpbmNyb25penphemlvbmUgc2ludGFzc2kgLS0tIgorCisjOiBzeW50YXguYzozNDI1Cittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyJzaW5jcm9uaXp6byBlbGVtZW50aSIKKworIzogc3ludGF4LmM6MzQzMQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBFbGVtZW50aSBzaW50YXR0aWNpIC0tLSIKKworIzogc3ludGF4LmM6MzQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogJ2NsdXN0ZXInIHNpbnRhdHRpY28gaW5lc2lzdGVudGU6ICVzIgorCisjOiBzeW50YXguYzozNDgwCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmltYWxlICIKKworIzogc3ludGF4LmM6MzQ4NworbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICJtYXNzaW1hbGUgIgorCisjOiBzeW50YXguYzozNDk5Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgY29ycmlzcC4gIgorCisjOiBzeW50YXguYzozNTAxCittc2dpZCAiIGxpbmUgYnJlYWtzIgorbXNnc3RyICIgaW50ZXJydXppb25pIGRpIGxpbmVhIgorCisjOiBzeW50YXguYzo0MTM1Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiBncm91cFt0XWhlcmUgbm9uIGFtbWVzc28gcXVpIgorCisjOiBzeW50YXguYzo0MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTQ6IERpZG4ndCBmaW5kIHJlZ2lvbiBpdGVtIGZvciAlcyIKK21zZ3N0ciAiRTM5NDogRWxlbWVudG8gZGkgJ3JlZ2lvbicgbm9uIHRyb3ZhdG8gcGVyICVzIgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IGNvbnRpZW5lIGFyZ29tZW50aSBub24gYWNjZXR0YXRpIHF1aSIKKworIzogc3ludGF4LmM6NDE5OAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiBhcmdvbWVudG8gJ2NvbnRhaW5lZGluJyBub24gYWNjZXR0YXRvIHF1aSIKKworIzogc3ludGF4LmM6NDI3NgorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiBOb21lIGZpbGUgbmVjZXNzYXJpbyIKKworIzogc3ludGF4LmM6NDYxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IE1hbmNhICc9JzogJXMiCisKKyM6IHN5bnRheC5jOjQ3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5OTogTm90IGVub3VnaCBhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCittc2dzdHIgIkUzOTk6IEFyZ29tZW50aSBub24gc3VmZmljaWVudGkgcGVyOiAnc3ludGF4IHJlZ2lvbicgJXMiCisKKyM6IHN5bnRheC5jOjUxMDMKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogTmVzc3VuICdjbHVzdGVyJyBzcGVjaWZpY2F0byIKKworIzogc3ludGF4LmM6NTE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiBEZWxpbWl0YXRvcmUgZGkgZXNwcmVzc2lvbmUgbm9uIHRyb3ZhdG86ICVzIgorCisjOiBzeW50YXguYzo1MjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6IFNwYXp6YXR1cmEgZG9wbyBlc3ByZXNzaW9uZTogJXMiCisKKyM6IHN5bnRheC5jOjUzMDUKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICIiCisiRTQwMzogc3ludGF4IHN5bmM6IGVzcHJlc3Npb25lIGRpIGNvbnRpbnVhemlvbmUgbGluZWEgc3BlY2lmaWNhdGEgZHVlIHZvbHRlIgorCisjOiBzeW50YXguYzo1MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogQXJnb21lbnRpIG5vbiB2YWxpZGk6ICVzIgorCisjOiBzeW50YXguYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IE1hbmNhICc9JzogJXMiCisKKyM6IHN5bnRheC5jOjU0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBBcmdvbWVudG8gbnVsbG86ICVzIgorCisjOiBzeW50YXguYzo1NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIG5vbiBjb25zZW50aXRvIHF1aSIKKworIzogc3ludGF4LmM6NTQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIGRldmUgdmVuaXJlIHBlciBwcmltbyBuZWxsYSBsaXN0YSAnY29udGFpbnMnIgorCisjOiBzeW50YXguYzo1NTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IE5vbWUgZ3J1cHBvIHNjb25vc2NpdXRvOiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IFNvdHRvLWNvbWFuZG8gOnN5bnRheCBub24gdmFsaWRvOiAlcyIKKworIzogc3ludGF4LmM6NjEzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogZ3J1cHBvIGV2aWRlbnppYXppb25lIG5vbiB0cm92YXRvOiAlcyIKKworIzogc3ludGF4LmM6NjE2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogQXJnb21lbnRpIG5vbiBzdWZmaWNpZW50aTogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IFRyb3BwaSBhcmdvbWVudGk6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxODcKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6ICdncm91cCcgaGEgaW1wb3N0YXppb25pLCAnaGlnaGxpZ2h0IGxpbmsnIGlnbm9yYXRvIgorCisjOiBzeW50YXguYzo2MzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IHNlZ25vICc9JyBpbmF0dGVzbzogJXMiCisKKyM6IHN5bnRheC5jOjYzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogbWFuY2Egc2Vnbm8gJz0nOiAlcyIKKworIzogc3ludGF4LmM6NjM4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogbWFuY2EgYXJnb21lbnRvOiAlcyIKKworIzogc3ludGF4LmM6NjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogVmFsb3JlIG5vbiBhbW1lc3NvOiAlcyIKKworIzogc3ludGF4LmM6NjUzNgorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IGNvbG9yZSBkaSB0ZXN0byBzY29ub3NjaXV0byIKKworIzogc3ludGF4LmM6NjU0NworbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IGNvbG9yZSBkaSBzZm9uZG8gc2Nvbm9zY2l1dG8iCisKKyM6IHN5bnRheC5jOjY2MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiBOdW1lcm8gbyBub21lIGRpIGNvbG9yZSBub24gcmljb25vc2NpdXRvOiAlcyIKKworIzogc3ludGF4LmM6NjgxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogY29kaWNlIHRlcm1pbmFsZSB0cm9wcG8gbHVuZ286ICVzIgorCisjOiBzeW50YXguYzo2ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiBBcmdvbWVudG8gbm9uIGFtbWVzc286ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDogVHJvcHBpIGdydXBwaSBldmlkZW56aWF6aW9uZSBkaWZmZXJlbnRpIGluIHVzbyIKKworIzogc3ludGF4LmM6NzkxMQorbXNnaWQgIkU2Njk6IFVucHJpbnRhYmxlIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJFNjY5OiBDYXJhdHRlcmUgbm9uIHN0YW1wYWJpbGUgaW4gdW4gbm9tZSBkaSBncnVwcG8iCisKKyMuIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCBzaW5jZSB0aGVyZSBwcmV2aW91c2x5IHdhcyBubyBjaGVjayBvbmx5CisjLiAqIGdpdmUgYSB3YXJuaW5nLgorIzogc3ludGF4LmM6NzkxOAorbXNnaWQgIlcxODogSW52YWxpZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiVzE4OiBDYXJhdHRlcmUgbm9uIGFtbWVzc28gaW4gdW4gbm9tZSBkaSBncnVwcG8iCisKKyM6IHRhZy5jOjkwCittc2dpZCAiRTU1NTogYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NTogYWwgZm9uZG8gZGVsbGEgJ3N0YWNrJyBkZWxsZSB0YWciCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogaW4gY2ltYSBhbGxhICdzdGFjaycgZGVsbGUgdGFnIgorCisjOiB0YWcuYzo0MTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogTm9uIHBvc3NvIGFuZGFyZSBwcmltYSBkZWxsYSBwcmltYSB0YWcgY29ycmlzcG9uZGVudGUiCisKKyM6IHRhZy5jOjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogdGFnIG5vbiB0cm92YXRhOiAlcyIKKworIzogdGFnLmM6NTgzCittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSB0aXBvIHRhZyIKKworIzogdGFnLmM6NTg2Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICJmaWxlXG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3NDQKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIkJhdHRpIG4uIGRpIHNjZWx0YSAoPElOVklPPiBwZXIgbGFzY2lhciBwZXJkZXJlKTogIgorCisjOiB0YWcuYzo3ODQKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IEMn6CBzb2xvIHVuYSB0YWcgY29ycmlzcG9uZGVudGUiCisKKyM6IHRhZy5jOjc4NgorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IE5vbiBwb3NzbyBhbmRhcmUgb2x0cmUgbCd1bHRpbWEgdGFnIGNvcnJpc3BvbmRlbnRlIgorCisjOiB0YWcuYzo4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIklsIGZpbGUgXCIlc1wiIG5vbiBlc2lzdGUiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjgyMworIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAidGFnICVkIGRpICVkJXMiCisKKyM6IHRhZy5jOjgyNgorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgbyBwafkiCisKKyM6IHRhZy5jOjgyOAorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIFVzbyB0YWcgaWdub3JhbmRvIG1haXVzY29sZS9taW51c2NvbGUhIgorCisjOiB0YWcuYzo4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IElsIGZpbGUgXCIlc1wiIG5vbiBlc2lzdGUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6OTQxCittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyBBICB0YWcgICAgICAgICBEQV9fIGxpbmVhIGluIGZpbGUvdGVzdG8iCisKKyM6IHRhZy5jOjEzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAiUmljZXJjYSBuZWwgdGFnIGZpbGUgJXMiCisKKyM6IHRhZy5jOjE1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMDogVGFnIGZpbGUgcGF0aCB0cnVuY2F0ZWQgZm9yICVzXG4iCittc2dzdHIgIkU0MzA6IFBlcmNvcnNvIHRhZyBmaWxlIHRyb25jYXRvIHBlciAlc1xuIgorCisjOiB0YWcuYzoyMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBFcnJvcmUgZGkgZm9ybWF0byBuZWwgdGFnIGZpbGUgXCIlc1wiIgorCisjOiB0YWcuYzoyMjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkJlZm9yZSBieXRlICVsZCIKK21zZ3N0ciAiUHJpbWEgZGVsIGJ5dGUgJWxkIgorCisjOiB0YWcuYzoyMjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogVGFnIGZpbGUgbm9uIG9yZGluYXRvIGFsZmFiZXRpY2FtZW50ZTogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoyMjgwCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiBOZXNzdW4gdGFnIGZpbGUiCisKKyM6IHRhZy5jOjMwMTYKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBOb24gcmllc2NvIGEgdHJvdmFyZSBtb2RlbGxvIHRhZyIKKworIzogdGFnLmM6MzAyNworbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTogTm9uIHJpZXNjbyBhIHRyb3ZhcmUgdGFnLCBzdG8gc29sbyB0aXJhbmRvIGEgaW5kb3ZpbmFyZSEiCisKKyM6IHRlcm0uYzoxNzU5Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIG5vbiBub3RvLiBUZXJtaW5hbGkgZGlzcG9uaWJpbGkgcHJlZGlzcG9zdGkgc29ubzoiCisKKyM6IHRlcm0uYzoxNzgzCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJwcmVkZWZpbml0byBhICciCisKKyM6IHRlcm0uYzoyMTQxCittc2dpZCAiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJFNTU3OiBOb24gcG9zc28gYXByaXJlIGZpbGUgJ3Rlcm1jYXAnIgorCisjOiB0ZXJtLmM6MjE0NQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogRGVzY3JpemlvbmUgdGVybWluYWxlIG5vbiB0cm92YXRhIGluICd0ZXJtaW5mbyciCisKKyM6IHRlcm0uYzoyMTQ3Cittc2dpZCAiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1NTk6IERlc2NyaXppb25lIHRlcm1pbmFsZSBub24gdHJvdmF0YSBpbiAndGVybWNhcCciCisKKyM6IHRlcm0uYzoyMzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBOZXNzdW5hIGRlc2NyaXppb25lIHBlciBcIiVzXCIgaW4gJ3Rlcm1jYXAnIgorCisjOiB0ZXJtLmM6Mjc4MAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiBjYXBhY2l04CBcImNtXCIgZGVsIHRlcm1pbmFsZSBuZWNlc3NhcmlhIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTkwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBUYXN0aSBUZXJtaW5hbGUgLS0tIgorCisjOiB1aS5jOjI1OAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgImZhdHRvIGVzZWd1aXJlIG51b3ZvIHNoZWxsXG4iCisKKyM6IHVpLmM6MTg0MQorbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IEVycm9yZSBsZWdnZW5kbyBsJ2lucHV0LCBlc2NvLi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6NDA1Cittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICIndW5kbycgbm9uIHBp+SBwb3NzaWJpbGU7IGNvbnRpbnVvIGNvbXVucXVlIgorCisjOiB1bmRvLmM6NTYxCittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogbnVtZXJpIGxpbmVlIGVycmF0aSIKKworIzogdW5kby5jOjc1NworbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICIxIG1vZGlmaWNhIgorCisjOiB1bmRvLmM6NzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGQgbW9kaWZpY2hlIgorCisjOiB1bmRvLmM6ODEyCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IGxpc3RhICd1bmRvJyBub24gdmFsaWRhIgorCisjOiB1bmRvLmM6ODQ0Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IGxpbmVhIGRpICd1bmRvJyBtYW5jYW50ZSIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjc1OQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorInZlcnNpb25lIE1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSIKKworIzogdmVyc2lvbi5jOjc2MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNpb25lIE1TLVdpbmRvd3MgMzIgYml0IEdVSSIKKworIzogdmVyc2lvbi5jOjc2NAorbXNnaWQgIiBpbiBXaW4zMnMgbW9kZSIKK21zZ3N0ciAiIGluIG1vZGFsaXTgIFdpbjMycyIKKworIzogdmVyc2lvbi5jOjc2NgorbXNnaWQgIiB3aXRoIE9MRSBzdXBwb3J0IgorbXNnc3RyICIgY29uIHN1cHBvcnRvIE9MRSIKKworIzogdmVyc2lvbi5jOjc2OQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uZSBNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIgorCisjOiB2ZXJzaW9uLmM6NzczCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uZSBNUy1XaW5kb3dzIDE2IGJpdCIKKworIzogdmVyc2lvbi5jOjc3NworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uIE1TLURPUyAzMiBiaXQiCisKKyM6IHZlcnNpb24uYzo3NzkKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgTVMtRE9TIDE2IGJpdCIKKworIzogdmVyc2lvbi5jOjc4NQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgTWFjT1MgWCAodW5peCkiCisKKyM6IHZlcnNpb24uYzo3ODcKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgWCBNYWNPUyIKKworIzogdmVyc2lvbi5jOjc5MAorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgTWFjT1MiCisKKyM6IHZlcnNpb24uYzo3OTUKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgUklTQyBPUyIKKworIzogdmVyc2lvbi5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJQYXRjaCBpbmNsdXNlOiAiCisKKyM6IHZlcnNpb24uYzo4MzEgdmVyc2lvbi5jOjExOTkKK21zZ2lkICJNb2RpZmllZCBieSAiCittc2dzdHIgIk1vZGlmaWNhdG8gZGEgIgorCisjOiB2ZXJzaW9uLmM6ODM4Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIkNvbXBpbGF0byAiCisKKyM6IHZlcnNpb24uYzo4NDEKK21zZ2lkICJieSAiCittc2dzdHIgImRhICIKKworIzogdmVyc2lvbi5jOjg1MworbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgZ2lnYW50ZSAiCisKKyM6IHZlcnNpb24uYzo4NTYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmVyc2lvbmUgZ3JhbmRlICIKKworIzogdmVyc2lvbi5jOjg1OQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uZSBub3JtYWxlICIKKworIzogdmVyc2lvbi5jOjg2MgorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlZlcnNpb25lIHBpY2NvbGEgIgorCisjOiB2ZXJzaW9uLmM6ODY0Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJWZXJzaW9uZSBtaW51c2NvbGEgIgorCisjOiB2ZXJzaW9uLmM6ODcwCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJzZW56YSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODc1Cittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgImNvbiBHVUkgR1RLMi1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4NzcKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJjb24gR1VJIEdUSy1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4ODEKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAiY29uIEdVSSBHVEsyLiIKKworIzogdmVyc2lvbi5jOjg4MworbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgImNvbiBHVUkgR1RLLiIKKworIzogdmVyc2lvbi5jOjg4OAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgImNvbiBHVUkgWDExLU1vdGlmLiIKKworIzogdmVyc2lvbi5jOjg5MgorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJjb24gR1VJIFgxMS1uZVh0YXcuIgorCisjOiB2ZXJzaW9uLmM6ODk0Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgImNvbiBHVUkgWDExLUF0aGVuYS4iCisKKyM6IHZlcnNpb24uYzo4OTgKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAiY29uIEdVSSBCZU9TLiIKKworIzogdmVyc2lvbi5jOjkwMQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgImNvbiBHVUkgUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjkwNAorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAiY29uIEdVSS4iCisKKyM6IHZlcnNpb24uYzo5MDcKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJjb24gR1VJIENhcmJvbi4iCisKKyM6IHZlcnNpb24uYzo5MTAKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgImNvbiBHVUkgQ29jb2EuIgorCisjOiB2ZXJzaW9uLmM6OTEzCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAiY29uIEdVSSAoY2xhc3NpY2EpLiIKKworIzogdmVyc2lvbi5jOjkyNAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgT3B6aW9uaSBpbmNsdXNlICgrKSBvIGVzY2x1c2UgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6OTM2Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBmaWxlIHZpbXJjIGRpIHNpc3RlbWE6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQxCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgZmlsZSB2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQ2Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgSUkgZmlsZSB2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTUxCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBJSUkgZmlsZSB2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTU2Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIGZpbGUgZXhyYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTYxCittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIElJIGZpbGUgZXhyYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTY3Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIGZpbGUgZ3ZpbXJjIGRpIHNpc3RlbWE6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTcxCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICBmaWxlIGd2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTc1Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICBJSSBmaWxlIGd2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTgwCittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIElJSSBmaWxlIGd2aW1yYyB1dGVudGU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTg3Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgZmlsZSBtZW51IGRpIHNpc3RlbWE6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTk1Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgICAgICAkVklNIGRpIHJpc2VydmE6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTAwMQorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICRWSU1SVU5USU1FIGRpIHJpc2VydmE6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTAwNQorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIkNvbXBpbGF6aW9uZTogIgorCisjOiB2ZXJzaW9uLmM6MTAxMQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIkNvbXBpbGF0b3JlOiAiCisKKyM6IHZlcnNpb24uYzoxMDE2Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICJMaW5rOiAiCisKKyM6IHZlcnNpb24uYzoxMDIxCittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICBWRVJTSU9ORSBERUJVRyIKKworIzogdmVyc2lvbi5jOjEwNjAKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgSU1wcm92ZWQgKFZJIE1pZ2xpb3JhdG8pIgorCisjOiB2ZXJzaW9uLmM6MTA2MgorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJ2ZXJzaW9uZSAiCisKKyM6IHZlcnNpb24uYzoxMDYzCittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJkaSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyM6IHZlcnNpb24uYzoxMDY3Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIOggJ29wZW4gc291cmNlJyBlIHB18iBlc3NlcmUgZGlzdHJpYnVpdG8gbGliZXJhbWVudGUiCisKKyM6IHZlcnNpb24uYzoxMDY5Cittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIkFpdXRhIGkgYmFtYmluaSBwb3ZlcmkgZGVsbCdVZ2FuZGEhIgorCisjOiB2ZXJzaW9uLmM6MTA3MAorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgImJhdHRpIDpoZWxwIGljY2Y8SW52aW8+ICAgICAgIHBlciBpbmZvcm1hemlvbmkgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDcyCittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAiYmF0dGkgOnE8SW52aW8+ICAgICAgICAgICAgICAgcGVyIHVzY2lyZSAgICAgICAgICAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjEwNzMKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJiYXR0aSA6aGVscDxJbnZpbz4gIG8gIDxGMT4gICBwZXIgYWl1dG8gb25saW5lICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTA3NAorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgImJhdHRpIDpoZWxwIHZlcnNpb242PEludmlvPiAgIHBlciBpbmZvcm1hemlvbmkgc3UgdmVyc2lvbmUiCisKKyM6IHZlcnNpb24uYzoxMDc3Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIkVzZWd1byBpbiBtb2RhbGl04CBjb21wYXRpYmlsZSBWaSIKKworIzogdmVyc2lvbi5jOjEwNzgKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICJiYXR0aSA6c2V0IG5vY3A8SW52aW8+ICAgICAgICBwZXIgdmFsb3JpIHByZWRlZmluaXRpIFZpbSIKKworIzogdmVyc2lvbi5jOjEwNzkKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJiYXR0aSA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBwZXIgaW5mbyBhbCByaWd1YXJkbyIKKworIzogdmVyc2lvbi5jOjEwOTQKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICJtZW51ICBBaXV0by0+T3JmYW5pICAgICAgICAgICBwZXIgaW5mb3JtYXppb25pICAgIgorCisjOiB2ZXJzaW9uLmM6MTA5NgorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIkVzZWN1emlvbmUgc2VuemEgbW9kYWxpdOA6IHNvbG8gaW5zZXJpbWVudG8iCisKKyM6IHZlcnNpb24uYzoxMDk3Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAibWVudSBNb2RpZmljYS0+SW1wb3N0Lkdsb2JhbGktPk1vZGFsLkluc2VyLiBT7C9ObyIKKworIzogdmVyc2lvbi5jOjEwOTgKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgIHBlciBtb2RvIEluc2VyLi9Db21hbmRpIgorCisjOiB2ZXJzaW9uLmM6MTEwMgorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIm1lbnUgTW9kaWZpY2EtPkltcG9zdC5HbG9iYWxpLT5Db21wYXRpYmlsZSBWaSBT7C9ObyIKKworIzogdmVyc2lvbi5jOjExMDMKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kbyBWaW0gcHJlZGVmaW5pdG8gIgorCisjOiB2ZXJzaW9uLmM6MTE1MAorbXNnaWQgIlNwb25zb3IgVmltIGRldmVsb3BtZW50ISIKK21zZ3N0ciAiU3BvbnNvcml6emEgbG8gc3ZpbHVwcG8gZGkgVmltISIKKworIzogdmVyc2lvbi5jOjExNTEKK21zZ2lkICJCZWNvbWUgYSByZWdpc3RlcmVkIFZpbSB1c2VyISIKK21zZ3N0ciAiRGl2ZW50YSB1biB1dGVudGUgVmltIHJlZ2lzdHJhdG8hIgorCisjOiB2ZXJzaW9uLmM6MTE1NAorbXNnaWQgInR5cGUgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgImJhdHRpIDpoZWxwIHNwb25zb3I8SW52aW8+ICAgIHBlciBpbmZvcm1hemlvbmkgIgorCisjOiB2ZXJzaW9uLmM6MTE1NQorbXNnaWQgInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgImJhdHRpIDpoZWxwIHJlZ2lzdGVyPEludmlvPiAgIHBlciBpbmZvcm1hemlvbmkgIgorCisjOiB2ZXJzaW9uLmM6MTE1NworbXNnaWQgIm1lbnUgIEhlbHAtPlNwb25zb3IvUmVnaXN0ZXIgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbnUgIEFpdXRvLT5TcG9uc29yL1JlZ2lzdHJhemlvbmUgIHBlciBpbmZvcm1hemlvbmkgIgorCisjOiB2ZXJzaW9uLmM6MTE2NworbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIkFUVEVOWklPTkU6IFRyb3ZhdG8gV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjExNzAKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJiYXR0aSA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBwZXIgaW5mbyBhbCByaWd1YXJkbyIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IE5vbiBjJ+ggdW5hIGZpbmVzdHJhIGRpIHByZS12aXN1YWxpenphemlvbmUiCisKKyM6IHdpbmRvdy5jOjU4MQorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6IE5vbiByaWVzY28gYSBkaXZpZGVyZSBBTFRPLVNYIGUgQkFTU08tRFggY29udGVtcG9yYW5lYW1lbnRlIgorCisjOiB3aW5kb3cuYzoxMzQwCittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiBOb24gcG9zc28gcnVvdGFyZSBxdWFuZG8gdW4nYWx0cmEgZmluZXN0cmEg6CBkaXZpc2EgaW4gZHVlIgorCisjOiB3aW5kb3cuYzoxODM2Cittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiBOb24gcmllc2NvIGEgY2hpdWRlcmUgbCd1bHRpbWEgZmluZXN0cmEiCisKKyM6IHdpbmRvdy5jOjI1NjcKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAiQyfoIGdp4CB1bmEgZmluZXN0cmEgc29sYSIKKworIzogd2luZG93LmM6MjYxNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiBBbHRyZSBmaW5lc3RyZSBjb250ZW5nb25vIG1vZGlmaWNoZSIKKworIzogd2luZG93LmM6NDQ4MAorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IE5lc3N1biBub21lIGZpbGUgc290dG8gaWwgY3Vyc29yZSIKKworIzogd2luZG93LmM6NDU5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IE5vbiByaWVzY28gYSB0cm92YXJlIGlsIGZpbGUgXCIlc1wiIG5lbCBwZXJjb3JzbyIKKworIzogaWZfcGVybC54czozMjYgZ2xvYmFscy5oOjEyNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MDogQ291bGQgbm90IGxvYWQgbGlicmFyeSAlcyIKK21zZ3N0ciAiRTM3MDogTm9uIHBvc3NvIGNhcmljYXJlIGxhIGxpYnJlcmlhICVzIgorCisjOiBpZl9wZXJsLnhzOjU1NAorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJTcGlhY2VudGUsIGNvbWFuZG8gbm9uIGRpc3BvbmliaWxlLCBub24gcmllc2NvIGEgY2FyaWNhcmUgbGlicmVyaWEgcHJvZ3JhbW1pICIKKyJQZXJsLiIKKworIzogaWZfcGVybC54czo2MDcKK21zZ2lkICJFMjk5OiBQZXJsIGV2YWx1YXRpb24gZm9yYmlkZGVuIGluIHNhbmRib3ggd2l0aG91dCB0aGUgU2FmZSBtb2R1bGUiCittc2dzdHIgIiIKKyJFMjk5OiBWYWxvcml6emF6aW9uZSBQZXJsIHZpZXRhdGEgaW4gYW1iaWVudGUgcHJvdGV0dG8gc2VuemEgaWwgbW9kdWxvIFNhZmUiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTgzCittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJBcHJpIGNvbiAmbW9sdGkgVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiQXByaSBjb24gdW4gc29sbyAmVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICImRGlmZmVyZW56YSBjb24gVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYxMQorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJBcHJpIGNvbiAmVmltIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjMzCittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIkFwcmkgY29uIFZpbSBlc2lzdGVudGUgLSAmIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjc0NgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICJBcHJpIGkobCkgZmlsZSBzY2VsdG8oaSkgY29uIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIiIKKyJFcnJvcmUgY3JlYW5kbyBpbCBwcm9jZXNzbzogQ29udHJvbGxhdGUgY2hlIGd2aW0gc2lhIGluY2x1c28gbmVsIHZvc3RybyAiCisiY2FtbWlubyAoUEFUSCkiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg2IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTAwIEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY3Cittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImVycm9yZSBndmltZXh0LmRsbCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTkKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIlBlcmNvcnNvIGZpbGUgdHJvcHBvIGx1bmdvISIKKworIzogZ2xvYmFscy5oOjEwMzEKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLUZpbGUgdnVvdG8tLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTk0Cittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiBDb21hbmRvIGZpbml0byBtYWxlIgorCisjOiBnbG9iYWxzLmg6MTE5NQorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiBBcmdvbWVudG8gbmVjZXNzYXJpbyIKKworIzogZ2xvYmFscy5oOjExOTYKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogXFwgZG92cmViYmUgZXNzZXJlIHNlZ3VpdG8gZGEgLywgPyBvcHB1cmUgJiIKKworIzogZ2xvYmFscy5oOjExOTgKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6IE5vbiB2YWxpZG8gbmVsbGEgZmluZXN0cmEgY29tYW5kaTsgPElOVklPPiBlc2VndWUsIENUUkwtQyBpZ25vcmEiCisKKyM6IGdsb2JhbHMuaDoxMjAwCittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiBDb21hbmRvIG5vbiBhbW1lc3NvIGRhIGV4cmMvdmltcmMgbmVsbGEgZGlyLiBpbiB1c28gbyBuZWxsYSByaWNlcmNhIHRhZyIKKworIzogZ2xvYmFscy5oOjEyMDIKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogTWFuY2EgOmVuZGlmIgorCisjOiBnbG9iYWxzLmg6MTIwMworbXNnaWQgIkU2MDA6IE1pc3NpbmcgOmVuZHRyeSIKK21zZ3N0ciAiRTYwMDogTWFuY2EgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjEyMDQKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogTWFuY2EgOmVuZHdoaWxlIgorCisjOiBnbG9iYWxzLmg6MTIwNQorbXNnaWQgIkU1ODg6IDplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4ODogOmVuZHdoaWxlIHNlbnphIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjEyMDcKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogRmlsZSBlc2lzdGVudGUgKGFnZ2l1bmdpICEgcGVyIHJpc2NyaXZlcmxvKSIKKworIzogZ2xvYmFscy5oOjEyMDgKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjogQ29tYW5kbyBmYWxsaXRvIgorCisjOiBnbG9iYWxzLmg6MTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiBGb250c2V0IHNjb25vc2NpdXRvOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTogRm9udCBzY29ub3NjaXV0bzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogRm9udCBcIiVzXCIgbm9uIGRpIGxhcmdoZXp6YSBmaXNzYSIKKworIzogZ2xvYmFscy5oOjEyMTkKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3MzogRXJyb3JlIGludGVybm8iCisKKyM6IGdsb2JhbHMuaDoxMjIwCittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIkludGVycm90dG8iCisKKyM6IGdsb2JhbHMuaDoxMjIxCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogSW5kaXJpenpvIG5vbiB2YWxpZG8iCisKKyM6IGdsb2JhbHMuaDoxMjIyCittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogQXJnb21lbnRvIG5vbiB2YWxpZG8iCisKKyM6IGdsb2JhbHMuaDoxMjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiBBcmdvbWVudG8gbm9uIHZhbGlkbzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiBFc3ByZXNzaW9uZSBub24gdmFsaWRhOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMjcKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogSW50ZXJ2YWxsbyBub24gdmFsaWRvIgorCisjOiBnbG9iYWxzLmg6MTIyOAorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogQ29tYW5kbyBub24gdmFsaWRvIgorCisjOiBnbG9iYWxzLmg6MTIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIg6CB1bmEgZGlyZWN0b3J5IgorCisjOiBnbG9iYWxzLmg6MTIzMworbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogQ2FyYXR0ZXJpIG5vbiBwcmV2aXN0aSBwcmltYSBkaSAnPSciCisKKyM6IGdsb2JhbHMuaDoxMjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBDaGlhbWF0YSBhIGxpYnJlcmlhIGZhbGxpdGEgcGVyIFwiJXMoKVwiIgorCisjOiBnbG9iYWxzLmg6MTI0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiBOb24gcG9zc28gY2FyaWNhcmUgbGEgZnVuemlvbmUgZGkgbGlicmVyaWEgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjQ0Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6ICdNYXJrJyBjb24gbnVtZXJvIGxpbmVhIG5vbiB2YWxpZG8iCisKKyM6IGdsb2JhbHMuaDoxMjQ1Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogJ01hcmsnIG5vbiBpbXBvc3RhdG8iCisKKyM6IGdsb2JhbHMuaDoxMjQ2Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IE5vbiBwb3NzbyBmYXJlIG1vZGlmaWNoZSwgJ21vZGlmaWFibGUnIOggaW5pYml0byIKKworIzogZ2xvYmFscy5oOjEyNDcKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6IFNjcmlwdCB0cm9wcG8gbmlkaWZpY2F0aSIKKworIzogZ2xvYmFscy5oOjEyNDgKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IE5lc3N1biBmaWxlIGFsdGVybmF0byIKKworIzogZ2xvYmFscy5oOjEyNDkKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IEFiYnJldmlhemlvbmUgaW5lc2lzdGVudGUiCisKKyM6IGdsb2JhbHMuaDoxMjUwCittc2dpZCAiRTQ3NzogTm8gISBhbGxvd2VkIgorbXNnc3RyICJFNDc3OiAhIG5vbiBjb25zZW50aXRvIgorCisjOiBnbG9iYWxzLmg6MTI1MgorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogR1VJIG5vbiB1dGlsaXp6YWJpbGU6IE5vbiBhYmlsaXRhdGEgaW4gY29tcGlsYXppb25lIgorCisjOiBnbG9iYWxzLmg6MTI1NQorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiBFYnJhaWNvIG5vbiB1dGlsaXp6YWJpbGU6IE5vbiBhYmlsaXRhdG8gaW4gY29tcGlsYXppb25lXG4iCisKKyM6IGdsb2JhbHMuaDoxMjU4Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogRmFyc2kgbm9uIHV0aWxpenphYmlsZTogTm9uIGFiaWxpdGF0byBpbiBjb21waWxhemlvbmVcbiIKKworIzogZ2xvYmFscy5oOjEyNjEKK21zZ2lkICJFODAwOiBBcmFiaWMgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFODAwOiBBcmFibyBub24gdXRpbGl6emFiaWxlOiBOb24gYWJpbGl0YXRvIGluIGNvbXBpbGF6aW9uZVxuIgorCisjOiBnbG9iYWxzLmg6MTI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IE5vbWUgZGkgZ3J1cHBvIGRpIGV2aWRlbnppYXppb25lIGluZXNpc3RlbnRlOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IEFuY29yYSBuZXNzdW4gdGVzdG8gaW5zZXJpdG8iCisKKyM6IGdsb2JhbHMuaDoxMjY3Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogTmVzc3VuYSBsaW5lYSBjb21hbmRpIHByZWNlZGVudGUiCisKKyM6IGdsb2JhbHMuaDoxMjY4Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogTWFwcGluZyBpbmVzaXN0ZW50ZSIKKworIzogZ2xvYmFscy5oOjEyNjkKK21zZ2lkICJFNDc5OiBObyBtYXRjaCIKK21zZ3N0ciAiRTQ3OTogTmVzc3VuYSBjb3JyaXNwb25kZW56YSIKKworIzogZ2xvYmFscy5oOjEyNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiBOZXNzdW5hIGNvcnJpc3BvbmRlbnphOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNzEKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiBNYW5jYSBub21lIGZpbGUiCisKKyM6IGdsb2JhbHMuaDoxMjcyCittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiBOZXNzdW5hIGVzcHJlc3Npb25lIHJlZ29sYXJlIHByZWNlZGVudGUgZGkgJ3N1YnN0aXR1dGUnIgorCisjOiBnbG9iYWxzLmg6MTI3MworbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiBOZXNzdW4gY29tYW5kbyBwcmVjZWRlbnRlIgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IE5lc3N1bmEgZXNwcmVzc2lvbmUgcmVnb2xhcmUgcHJlY2VkZW50ZSIKKworIzogZ2xvYmFscy5oOjEyNzUKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiBOZXNzdW4gaW50ZXJ2YWxsbyBjb25zZW50aXRvIgorCisjOiBnbG9iYWxzLmg6MTI3NworbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IE1hbmNhIHNwYXppbyIKKworIzogZ2xvYmFscy5oOjEyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0Nzogbm8gcmVnaXN0ZXJlZCBzZXJ2ZXIgbmFtZWQgXCIlc1wiIgorbXNnc3RyICJFMjQ3OiBub24gZXNpc3RlIHNlcnZlciByZWdpc3RyYXRvIGNvbiBub21lIFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6IE5vbiByaWVzY28gYSBjcmVhcmUgaWwgZmlsZSAlcyIKKworIzogZ2xvYmFscy5oOjEyODMKK21zZ2lkICJFNDgzOiBDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIkU0ODM6IE5vbiByaWVzY28gYWQgb3R0ZW5lcmUgbm9tZSBmaWxlICd0ZW1wJyIKKworIzogZ2xvYmFscy5oOjEyODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NDogQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJFNDg0OiBOb24gcmllc2NvIGFkIGFwcmlyZSBpbCBmaWxlICVzIgorCisjOiBnbG9iYWxzLmg6MTI4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg1OiBDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIkU0ODU6IE5vbiByaWVzY28gYSBsZWdnZXJlIGlsIGZpbGUgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjg2Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMzc6IE5vbiBzYWx2YXRvIGRvcG8gbW9kaWZpY2EgKGFnZ2l1bmdpICEgcGVyIGVzZWd1aXJlIGNvbXVucXVlKSIKKworIzogZ2xvYmFscy5oOjEyODcKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODogQXJnb21lbnRvIG51bGxvIgorCisjOiBnbG9iYWxzLmg6MTI4OQorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IE1pIGFzcGV0dGF2byB1biBudW1lcm8iCisKKyM6IGdsb2JhbHMuaDoxMjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTm9uIHJpZXNjbyBhZCBhcHJpcmUgaWwgZmlsZSBlcnJvcmkgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjk1Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogbm9uIHJpZXNjbyBhZCBhcHJpcmUgbG8gc2NoZXJtbyIKKworIzogZ2xvYmFscy5oOjEyOTcKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE5vbiBjJ+ggcGn5IG1lbW9yaWEhIgorCisjOiBnbG9iYWxzLmg6MTI5OQorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICJFc3ByZXNzaW9uZSBub24gdHJvdmF0YSIKKworIzogZ2xvYmFscy5oOjEzMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NjogUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDg2OiBFc3ByZXNzaW9uZSBub24gdHJvdmF0YTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMzAyCittc2dpZCAiRTQ4NzogQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiRTQ4NzogTCdhcmdvbWVudG8gZGV2ZSBlc3NlcmUgcG9zaXRpdm8iCisKKyM6IGdsb2JhbHMuaDoxMzA0Cittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiBOb24gcG9zc28gdG9ybmFyZSBhbGxhIGRpcmVjdG9yeSBwcmVjZWRlbnRlIgorCisjOiBnbG9iYWxzLmg6MTMwOAorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IE5lc3N1biBFcnJvcmUiCisKKyM6IGdsb2JhbHMuaDoxMzEwCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBTdHJpbmdhIGRpIGNvbmZyb250byBkYW5uZWdnaWF0YSIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiBQcm9ncmFtbWEgJ3JlZ2V4cCcgY29ycm90dG8iCisKKyM6IGdsb2JhbHMuaDoxMzEyCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiBmaWxlIGluIHNvbGEgbGV0dHVyYSAoYWdnaXVuZ2kgISBwZXIgZXNlZ3VpcmUgY29tdW5xdWUpIgorCisjOiBnbG9iYWxzLmg6MTMxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBOb24gcG9zc28gaW1wb3N0YXJlIGxhIHZhcmlhYmlsZSByZWFkLW9ubHkgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTMxNworbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0NzogRXJyb3JlIGxlZ2dlbmRvIGlsIGZpbGUgZXJyb3JpIgorCisjOiBnbG9iYWxzLmg6MTMyMAorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBOb24gYW1tZXNzbyBpbiBhbWJpZW50ZSBwcm90ZXR0byIKKworIzogZ2xvYmFscy5oOjEzMjIKK21zZ2lkICJFNTIzOiBOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNTIzOiBOb24gY29uc2VudGl0byBxdWkiCisKKyM6IGdsb2JhbHMuaDoxMzI1Cittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBJbXBvc3RhemlvbmUgbW9kYWxpdOAgc2NoZXJtbyBub24gc3VwcG9ydGF0YSIKKworIzogZ2xvYmFscy5oOjEzMjcKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogUXVhbnRpdOAgZGkgJ3Njcm9sbCcgbm9uIHZhbGlkYSIKKworIzogZ2xvYmFscy5oOjEzMjgKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IG9wemlvbmUgJ3NoZWxsJyB2dW90YSIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IEVycm9yZSAtLSBub24gc29ubyByaXVzY2l0byBhIGxlZ2dlcmUgaSBkYXRpIGRlbCAnc2lnbichIgorCisjOiBnbG9iYWxzLmg6MTMzMgorbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IEVycm9yZSBkdXJhbnRlIGNoaXVzdXJhIHN3YXAgZmlsZSIKKworIzogZ2xvYmFscy5oOjEzMzMKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiB0YWcgc3RhY2sgdnVvdGEiCisKKyM6IGdsb2JhbHMuaDoxMzM0Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IENvbWFuZG8gdHJvcHBvIGNvbXBsZXNzbyIKKworIzogZ2xvYmFscy5oOjEzMzUKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTogTm9tZSB0cm9wcG8gbHVuZ28iCisKKyM6IGdsb2JhbHMuaDoxMzM2Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFRyb3BwZSBbIgorCisjOiBnbG9iYWxzLmg6MTMzNworbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiBUcm9wcGkgbm9taSBmaWxlIgorCisjOiBnbG9iYWxzLmg6MTMzOAorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IENhcmF0dGVyaSBpbiBwafkgYSBmaW5lIGNvbWFuZG8iCisKKyM6IGdsb2JhbHMuaDoxMzM5Cittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODogJ01hcmsnIHNjb25vc2NpdXRvIgorCisjOiBnbG9iYWxzLmg6MTM0MAorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTogTm9uIHBvc3NvIGVzcGFuZGVyZSAnd2lsZGNhcmQnIgorCisjOiBnbG9iYWxzLmg6MTM0MgorbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIG5vbiBwdfIgZXNzZXJlIGluZmVyaW9yZSBhICd3aW5taW5oZWlnaHQnIgorCisjOiBnbG9iYWxzLmg6MTM0NAorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgnIG5vbiBwdfIgZXNzZXJlIGluZmVyaW9yZSBhICd3aW5taW53aWR0aCciCisKKyM6IGdsb2JhbHMuaDoxMzQ3Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IEVycm9yZSBpbiBzY3JpdHR1cmEiCisKKyM6IGdsb2JhbHMuaDoxMzQ4Cittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAiQ29udGF0b3JlIGEgemVybyIKKworIzogZ2xvYmFscy5oOjEzNTAKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IFVzbyBkaSA8U0lEPiBmdW9yaSBkYWwgY29udGVzdG8gZGkgdW5vIHNjcmlwdCIKKworIzogZ2xvYmFscy5oOjEzNTMKK21zZ2lkICJFNDQ5OiBJbnZhbGlkIGV4cHJlc3Npb24gcmVjZWl2ZWQiCittc2dzdHIgIkU0NDk6IFJpY2V2dXRhIHVuJ2VzcHJlc3Npb25lIG5vbiB2YWxpZGEiCisKKyM6IGdsb2JhbHMuaDoxMzU2Cittc2dpZCAiRTQ2MzogUmVnaW9uIGlzIGd1YXJkZWQsIGNhbm5vdCBtb2RpZnkiCittc2dzdHIgIkU0NjM6IFJlZ2lvbmUgcHJvdGV0dGEsIGltcG9zc2liaWxlIG1vZGlmaWNhcmUiCmRpZmYgLS1naXQgYS9zcmMvcG8vamEucG8gYi9zcmMvcG8vamEucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkOTRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9qYS5wbwpAQCAtMCwwICsxLDY1ODcgQEAKKyMgSmFwYW5lc2UgdHJhbnNsYXRpb24gZm9yIFZpbQkJCXZpbTpzZXQgZm9sZG1ldGhvZD1tYXJrZXI6CisjCisjIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorIyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyMKKyMgTVVSQU9LQSBUYXJvIDxrb3JvbkB0a2EuYXR0Lm5lLmpwPiwgMjAwMS00LgorIyBMYXN0IENoYW5nZTogMjktQXByLTIwMDQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0gNi4yXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDQtMDQtMjkgMTM6MTYrMDkwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDQtMDQtMjkgMTM6MDArMDkwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTVVSQU9LQSBUYXJvIDxrb3JvbkB0a2EuYXR0Lm5lLmpwPlxuIgorIkxhbmd1YWdlLVRlYW06IE1VUkFPS0EgVGFybyA8a29yb25AdGthLmF0dC5uZS5qcD5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1ldWMtanBcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4LWJpdFxuIgorCisjOiBidWZmZXIuYzoxMDIKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IKXQpcOl1aWhpPIxpMSk4rruwK6kx6StpMqkpKTOpMcsIL2qzrukt6TepLkuLi4iCisKKyM6IGJ1ZmZlci5jOjEwNQorbXNnaWQgIkU4MzogQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciwgdXNpbmcgb3RoZXIgb25lLi4uIgorbXNnc3RyICJFODM6IKXQpcOl1aWhpPK67sCupMekraTKpKSkzqTHLCDCvqTOpPK7yM3RpLek3qS5Li4uIgorCisjOiBidWZmZXIuYzo4MDUKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6ILLyyvyktaTspL+l0KXDpdWloaTPpKKk6qTepLuk8yIKKworIzogYnVmZmVyLmM6ODA3Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6ILrvvfyktaTspL+l0KXDpdWloaTPpKKk6qTepLuk8yIKKworIzogYnVmZmVyLmM6ODA5Cittc2dpZCAiRTUxNzogTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiRTUxNzogx8u0/qS1pOykv6XQpcOl1aWhpM+koqTqpN6ku6TzIgorCisjOiBidWZmZXIuYzo4MTcKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAiMSC4xKTOpdClw6XVpaGkrLLyyvyktaTspN6kt6S/IgorCisjOiBidWZmZXIuYzo4MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAiJWQguMSkzqXQpcOl1aWhpKyy8sr8pLWk7KTepLekvyIKKworIzogYnVmZmVyLmM6ODI0Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSC4xKTOpdClw6XVpaGkrLrvvfyktaTspN6kt6S/IgorCisjOiBidWZmZXIuYzo4MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICIlZCC4xKTOpdClw6XVpaGkrLrvvfyktaTspN6kt6S/IgorCisjOiBidWZmZXIuYzo4MzEKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIjEguMSkzqXQpcOl1aWhpKzHy7T+pLWk7KTepLekvyIKKworIzogYnVmZmVyLmM6ODMzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICIlZCC4xKTOpdClw6XVpaGkrMfLtP6ktaTspN6kt6S/IgorCisjOiBidWZmZXIuYzo4OTQKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiDK0bm5pLWk7KS/pdClw6XVpaGkz6SipOqk3qS7pPMiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MzMKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogpeqluaXIyb28qKS1pOyk66XQpcOl1aWhpM+koqTqpN6ku6TzIgorCisjOiBidWZmZXIuYzo5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBCdWZmZXIgJWxkIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFODY6IKXQpcOl1aWhICVsZCCkz6SipOqk3qS7pPMiCisKKyM6IGJ1ZmZlci5jOjk0OAorbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiC6x7jlpM6l0KXDpdWloaTysdukqKTGsNzGsKTPpMekraTepLuk8yIKKworIzogYnVmZmVyLmM6OTUwCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiC6x73ppM6l0KXDpdWloaTopOrBsKTYpM+w3MawpMekraTepLuk8yIKKworIzogYnVmZmVyLmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5OiCl0KXDpdWloSAlbGQgpM7K0bm5pM/K3cK4pLWk7KTGpKSk3qS7pPMgKCEgpMfK0bm5pPLHy7T+KSIKKworIzogYnVmZmVyLmM6MTAwNQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiC6x7jlpM6l0KXDpdWloaTPsvLK/KTHpK2k3qS7pPMiCisKKyM6IGJ1ZmZlci5jOjE1MzgKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiC32bnwOiCl1aWhpaSl68y+pM6l6qW5pcikrMS5pLmkrqTepLkiCisKKyM6IGJ1ZmZlci5jOjE3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiCl0KXDpdWloSAlbGQgpKyk36TEpKuk6qTepLuk8yIKKworIzogYnVmZmVyLmM6MTk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6ICVzIKTLyqO/9KTOs7rF9qSspKKk6qTepLekvyIKKworIzogYnVmZmVyLmM6MTk0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogJXMgpMuzusX2pLmk66XQpcOl1aWhpM+koqTqpN6ku6TzpMekt6S/IgorCisjOiBidWZmZXIuYzoyMzM3CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICK51CAlbGQiCisKKyM6IGJ1ZmZlci5jOjI0MjAKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiCks6TOzL7BsKTOpdClw6XVpaGkz7T7pMukoqTqpN6kuSIKKworIzogYnVmZmVyLmM6MjcxMworbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW8rRubmkoqTqXSIKKworIzogYnVmZmVyLmM6MjcxOAorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW8ykytS9uF0iCisKKyM6IGJ1ZmZlci5jOjI3MjMKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbv7el1aWhpaSl610iCisKKyM6IGJ1ZmZlci5jOjI3MjQKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbxsm5/qWopemhvF0iCisKKyM6IGJ1ZmZlci5jOjI3MjYgZmlsZWlvLmM6MjA0OQorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIlvGybn+wOzN0V0iCisKKyM6IGJ1ZmZlci5jOjI3NDcKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIjEgudQgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3NDkKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCC51CAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc1NgorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICK51CAlbGQgKMG0ws4gJWxkKSAtLSVkJSUtLSBjb2wgIgorCisjOiBidWZmZXIuYzoyODY0Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbzLXC6l0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjkwNAorbXNnaWQgImhlbHAiCittc2dzdHIgIqXYpeul1yIKKworIzogYnVmZmVyLmM6MzQ2MyBzY3JlZW4uYzo1MDM4Cittc2dpZCAiW2hlbHBdIgorbXNnc3RyICJbpdil66XXXSIKKworIzogYnVmZmVyLmM6MzQ5NSBzY3JlZW4uYzo1MDQ0Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbpdel7KXTpeWhvF0iCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJBbGwiCittc2dzdHIgIsG0pMYiCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJCb3QiCittc2dzdHIgIsv2yPgiCisKKyM6IGJ1ZmZlci5jOjM3NzcKK21zZ2lkICJUb3AiCittc2dzdHIgIsDoxqwiCisKKyM6IGJ1ZmZlci5jOjQ1MjMKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgpdClw6XVpaGl6qW5pcg6XG4iCisKKyM6IGJ1ZmZlci5jOjQ1NTYKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIlulqKXpobyl6qW5pchdIgorCisjOiBidWZmZXIuYzo0NTY5IG1lbWxpbmUuYzoxNTIwCittc2dpZCAiW05vIEZpbGVdIgorbXNnc3RyICJbzLXC6l0iCisKKyM6IGJ1ZmZlci5jOjQ4ODIKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCltaWkpfMgLS0tIgorCisjOiBidWZmZXIuYzo0OTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIiVzIKTOpbWlpKXzOiIKKworIzogYnVmZmVyLmM6NDkwNworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgudQ9JWxkICC8scrMu9I9JWQgIMy+wbA9JXMiCisKKyM6IGRpZmYuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6ICVsZCCwyr7lpM6l0KXDpdWloaTPZGlmZqTHpK2k3qS7pPMiCisKKyM6IGRpZmYuYzo3MDkKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogurnKrKTyuu7ArqTHpK2k3qS7pPMgIgorCisjOiBkaWZmLmM6ODE0Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAipdGlw6XBpdWloaWkpesiCisKKyM6IGRpZmYuYzoxMDY1Cittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiBkaWZmpM690M7PpPLGybn+pOGk3qS7pPMiCisKKyM6IGRpZmYuYzoxODE1Cittc2dpZCAiRTk5OiBDdXJyZW50IGJ1ZmZlciBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFOTk6ILi9ut+kzqXQpcOl1aWhpM+6ucqspeKhvKXJpMekz6SipOqk3qS7pPMiCisKKyM6IGRpZmYuYzoxODI3Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogurnKrKXiobylyaTHpKKk68K+pM6l0KXDpdWloaTPpKKk6qTepLuk8yIKKworIzogZGlmZi5jOjE4MzUKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIiIKKyJFMTAxOiC6ucqspeKhvKXJpM6l0KXDpdWloaSsMrjEsMq+5aSipOukzqTHoaKkyaTspPK7yKSmpKvGw8TqpMekraTepLuk8yIKKworIzogZGlmZi5jOjE4NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiCl0KXDpdWloSBcIiVzXCIgpKyk36TEpKuk6qTepLuk8yIKKworIzogZGlmZi5jOjE4NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiCl0KXDpdWloSBcIiVzXCIgpM+6ucqspeKhvKXJpMekz6SipOqk3qS7pPMiCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6ILnnu/qky0VzY2FwZaTPu8jN0aTHpK2k3qS7pPMiCisKKyM6IGRpZ3JhcGguYzoyMzg0Cittc2dpZCAiRTU0NDogS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJFNTQ0OiClraG8pd6lw6XXpdWloaWkpeukrKTfpMSkq6TqpN6ku6TzIgorCisjOiBkaWdyYXBoLmM6MjQxMQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogOnNvdXJjZSCkx7zouf6k4KXVpaGlpKXrsMqzsKTHpM8gOmxvYWRrZXltYXAgpPK7yKSopN6ku6TzIgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIKWtobyl76G8pcnK5LSwICheTl5QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCittc2dzdHIgIiBeWCCl4qG8pckgKF5FXlleTF5dXkZeSV5LXkReVl5OXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk5eUCkiCittc2dzdHIgIiC2yb3qpa2hvKXvobylycrktLAgKF5OXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTF5OXlApIgorbXNnc3RyICIgudQowbTCzinK5LSwICheTF5OXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GXk5eUCkiCittc2dzdHIgIqXVpaGlpKXrzL7K5LSwICheRl5OXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dXk5eUCkiCittc2dzdHIgIiClv6WwyuS0sCAoXl1eTl5QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIKXRpbml0aW/obyl88rktLAgKF5OXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRF5OXlApIgorbXNnc3RyICIgxOq1wcrktLAgKF5EXk5eUCkiCisKKyM6IGVkaXQuYzo1MQorbXNnaWQgIiBEaWN0aW9uYXJ5IGNvbXBsZXRpb24gKF5LXk5eUCkiCittc2dzdHIgIiC8rb3xyuS0sCAoXkteTl5QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVF5OXlApIgorbXNnc3RyICIgpbelvaG8pemlucrktLAgKF5UXk5eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlZeTl5QKSIKK21zZ3N0ciAiIKWzpd6l86XJpemlpKXzyuS0sCAoXlZeTl5QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIsPKze6kzrrHuOWky6XSpcOlyCIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ3RoZXNhdXJ1cycgpaql16W3peel86SstvWkx6S5IgorCisjOiBlZGl0LmM6MTE2NgorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIidkaWN0aW9uYXJ5JyClqqXXpbel56XzpKy29aTHpLkiCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICK8rb3xpPKluaWtpeOl88PmOiAlcyIKKworIzogZWRpdC5jOjIzNjgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAowd7G/ikgpbmlr6Xtobyl6yheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICjD1rS5KSCluaWvpe2hvKXrICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAipbmlraXjpfPD5jogJXMiCisKKyM6IGVkaXQuYzoyNzE5Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIqW/pbCk8qW5pa2l46Xzw+YuIgorCisjOiBlZGl0LmM6MzM4MQorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiDEybLDw+YiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQzMAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0guKG698PmLi4uIgorCisjOiBlZGl0LmM6MzQ4NgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIrvPpOGky8zhpOsiCisKKyM6IGVkaXQuYzozNDkxCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIsK+pM651KTOw7G47CIKKworIzogZWRpdC5jOjM0OTYKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAizaOw7KTOs7rF9iIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIiVkIMjWzNykzrO6xfYgKMG0s7rF9iAlZCC4xMPmKSIKKworIzogZWRpdC5jOjM1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgIiVkIMjWzNykzrO6xfYiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjEwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiDMpMPOpM7K0b/0OiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxMzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogpaulw6WzICcoJyCkrKSipOqk3qS7pPM6ICVzIgorCisjOiBldmFsLmM6MTQzNSBldmFsLmM6MTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IKS9pM7K0b/0pM+koqTqpN6ku6TzOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNzA1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiAnPycgpM645aTLICc6JyCkrKSipOqk3qS7pPMiCisKKyM6IGV2YWwuYzoyMzI3Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6ICcpJyCkrKTfpMSkq6TqpN6ku6TzIgorCisjOiBldmFsLmM6MjM4OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiAnXScgpKyk36TEpKuk6qTepLuk8yIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IKWqpdelt6XnpfPMvqSspKKk6qTepLuk8zogJXMiCisKKyM6IGV2YWwuYzoyNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzogzKTDzqTOpaql16W3peel86THpLk6ICVzIgorCisjOiBldmFsLmM6MjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogsPrN0cnkIChcIikgpKykoqTqpN6ku6TzOiAlcyIKKworIzogZXZhbC5jOjI2OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6ILD6zdHJ5CAoJykgpKykoqTqpN6ku6TzOiAlcyIKKworIzogZXZhbC5jOjMwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiC02L/0ICVzIKTLpM/Mtbj6pMqw+r/0pMekuSIKKworIzogZXZhbC5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IMykw86kzrTYv/Skx6S5OiAlcyIKKworIzogZXZhbC5jOjMwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6ILTYv/SkzrD6v/SkrMK/pLmkrqTepLk6ICVzIgorCisjOiBldmFsLmM6MzA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiC02L/0pM6w+r/0pKzCraTqpN6ku6TzOiAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiCluaWvpeql16XIsMqzsKTHPFNJRD6krLvIpO+k7KTepLekvzogJXMiCisKKyMuCisjLiAqIFllcyB0aGlzIGlzIHVnbHksIEkgZG9uJ3QgcGFydGljdWxhcmx5IGxpa2UgaXQgZWl0aGVyLiAgQnV0IGRvaW5nIGl0CisjLiAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyMuICogYmUgdG91Y2hlZCBhdCBhbGwuICBTZWUgYmVsb3cgd2hhdCAnb2snIGFuZCAneW5jJyBhcmUgdXNlZCBmb3IuCisjLgorIzogZXZhbC5jOjM2ODcgZ3VpLmM6NDM3NiBndWlfZ3RrLmM6MjA1OQorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6NDIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCC51DoiCisKKyM6IGV2YWwuYzo1NDc3Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyK36MTqKCZPKVxuIgorIqWtpeOl86W7pesoJkMpIgorCisjOiBldmFsLmM6NTUxNworbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgImlucHV0cmVzdG9yZSgpIKSsIGlucHV0c2F2ZSgpIKTopOqk4sK/pK+4xqTQpOyk3qS3pL8iCisKKyMgQWRkZWQgYXQgMTAtTWFyLTIwMDQuCisjOiBldmFsLmM6NTk3NworbXNnaWQgIkU2NTU6IFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIChjeWNsZT8pIgorbXNnc3RyICJFNjU1OiClt6Xzpdyl6qXDpa+l6qXzpa+krMK/suGkrqTepLkgKL3btMSkt6TGpKSk67LEx73AraSspKKk6qTepLkpIgorCisjOiBldmFsLmM6NjYwOQorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogVmltIKW1obyl0KTYpM7A3MKzpKykoqTqpN6ku6TzIgorCisjOiBldmFsLmM6NjcwNgorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiCltaG8pdCkzrH+xfqkrKSipOqk3qS7pPMiCisKKyM6IGV2YWwuYzo2NzM0Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiClr6XppaSloqXzpcik2MH3pOuks6TIpKykx6StpN6ku6TzIgorCisjOiBldmFsLmM6Njc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogJXMgpNjB96TrpLOkyKSspMekraTepLuk8yIKKworIzogZXZhbC5jOjY4ODIKK21zZ2lkICIoSW52YWxpZCkiCittc2dzdHIgIijMtbj6KSIKKworIzogZXZhbC5jOjgwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogzKTE6rXBpM7K0b/0pMekuTogJXMiCisKKyM6IGV2YWwuYzo4NDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IMnUwLWkysrRv/TMvqTHpLk6ICVzIgorCisjOiBldmFsLmM6ODc4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTEyMjogtNi/9CAlcyCkz8TqtcG60aTHpLksILrGxOq1waS5pOuky6TPICEgpPLEybLDpLekxqSvpMCktaSkIgorCisjOiBldmFsLmM6ODg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIzOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTIzOiDMpMTqtcGkzrTYv/Skx6S5OiAlcyIKKworIzogZXZhbC5jOjg4NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiAnKCcgpKykoqTqpN6ku6TzOiAlcyIKKworIzogZXZhbC5jOjg5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IMnUwLWkyrD6v/Skx6S5OiAlcyIKKworIzogZXZhbC5jOjg5ODIKK21zZ2lkICJFMTI2OiBNaXNzaW5nIDplbmRmdW5jdGlvbiIKK21zZ3N0ciAiRTEyNjogOmVuZGZ1bmN0aW9uIKSspKKk6qTepLuk8yIKKworIzogZXZhbC5jOjkwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6ILTYv/QgJXMgpPK6xsTqtcGkx6StpN6ku6TzOiC7yM3Rw+akx6S5IgorCisjOiBldmFsLmM6OTE1OQorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6ILTYv/TMvqSszde14aS1pOyk3qS5IgorCisjOiBldmFsLmM6OTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiC02L/0zL6kz8Lnyri7+qTHu8+k3qTppMqksaTspNCkyqTqpN6ku6TzOiAlcyIKKworIzogZXZhbC5jOjk0MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogzKTE6rXBpM602L/0pMekuTogJXMiCisKKyM6IGV2YWwuYzo5NDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogtNi/9CAlcyCk8rrvvfykx6StpN6ku6TzOiC7yM3Rw+akx6S5IgorCisjOiBldmFsLmM6OTQ1NQorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6ILTYv/S4xr3QpM7G/qTsu9K/9KSsICdtYXhmdW5jZGVwdGgnIKTyxLakqKTepLekvyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICIlcyCk8rzCudTD5qTHpLkiCisKKyM6IGV2YWwuYzo5NTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzIKSsw+bDx6S1pOyk3qS3pL8iCisKKyM6IGV2YWwuYzo5NTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICIlcyCkrCAjJWxkIKTyytakt6TepLekvyIKKworIzogZXZhbC5jOjk1NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMgpKwgXCIlc1wiIKTyytakt6TepLekvyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTU5NSBleF9jbWRzMi5jOjIzNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAiJXMgpM68wrnUpPK30cKzw+akx6S5IgorCisjOiBldmFsLmM6OTYyMQorbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiC02L/0s7CkyyA6cmV0dXJuIKSspKKk6qTepLekvyIKKworIzogZXZhbC5jOjk5NTIKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyClsKXtobyl0KXrytG/9DpcbiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAgMTa/yr/0ICUwMngsICA4v8q/9CAlMDNvIgorCisjOiBleF9jbWRzLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgMTa/yr/0ICUwNHgsIDi/yr/0ICVvIgorCisjOiBleF9jbWRzLmM6MTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgMTa/yr/0ICUwOHgsIDi/yr/0ICVvIgorCisjOiBleF9jbWRzLmM6NDMwCittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6ILnUpPKkvaTsvKu/yKTLpM+w3MawpMekraTepLuk8yIKKworIzogZXhfY21kcy5jOjQ5OQorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSC51KSssNzGsKS1pOyk3qS3pL8iCisKKyM6IGV4X2NtZHMuYzo1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICIlbGQgudSkrLDcxrCktaTspN6kt6S/IgorCisjOiBleF9jbWRzLmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAiJWxkILnUpKyl1aWjpeulv73ozf2ktaTspN6kt6S/IgorCisjOiBleF9jbWRzLmM6OTUyCittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogKqXVpaOl66W/KiBhdXRvY29tbWFuZKTPuL2636TOpdClw6XVpaGk8srRubmkt6TGpM+kpKSxpN6ku6TzIgorCisjOiBleF9jbWRzLmM6MTAzNworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW7rHuOWkzsrRubmkrMrdwriktaTspMakpKTepLuk811cbiIKKworIzogZXhfY21kcy5jOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXN2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgIiVzdmltaW5mbzogJXMgudTM3DogIgorCisjOiBleF9jbWRzLmM6MTI4OAorbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiClqKXpobykrMK/suGkrqTrpM6kxywgsMq536TPpbmlraXDpdekt6TepLkiCisKKyM6IGV4X2NtZHMuYzoxMzIzCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAidmltaW5mb6XVpaGlpKXrIFwiJXNcIiVzJXMlcyCk8sbJuf6k38PmICIKKworIzogZXhfY21kcy5jOjEzMjQKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIL7wyvMiCisKKyM6IGV4X2NtZHMuYzoxMzI1Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgpd6hvKWvIgorCisjOiBleF9jbWRzLmM6MTMyNgorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiC8usfUIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogdmltaW5mb6XVpaGlpKXrpKy98bn+pN+kx6StpN6ku6TzOiAlcyIKKworIzogZXhfY21kcy5jOjE1NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzODogQ2FuJ3Qgd3JpdGUgdmltaW5mbyBmaWxlICVzISIKK21zZ3N0ciAiRTEzODogdmltaW5mb6XVpaGlpKXrICVzIKTyyt3CuKTHpK2k3qS7pPMhIgorCisjOiBleF9jbWRzLmM6MTU1MQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgInZpbWluZm+l1aWhpaSl6yBcIiVzXCIgpPK98bn+pN/D5iIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTY0OQorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIKSzpM4gdmltaW5mbyCl1aWhpaSl66TPIFZpbSAlcyCky6TopMOkxsC4wK6ktaTspN6kt6S/LlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgytG5uaS5pOu63aTLpM+9vcqsw+2w1aS3pMakr6TApLWkpCFcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyCks6TOpdWloaWkpeukrL3xpKuk7KS/u/6kziAnZW5jb2RpbmcnIKTOw81cbiIKKworIzogZXhfY21kcy5jOjE3NTIKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIsnUwLWkysDoxqzKuLv6pMekuSIKKworIzogZXhfY21kcy5jOjIwOTcgZXhfY21kcy5jOjIzNjIgZXhfY21kczIuYzo3NjMKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICLKzMy+pMfK3cK4IgorCisjLiBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMuICogZ29vZCBpZGVhLgorIzogZXhfY21kcy5jOjIxNDAKK21zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKK21zZ3N0ciAiRTEzOTogxrGkuMy+wbCkzqXVpaGlpKXrpKzCvqTOpdClw6XVpaGkx8bJuf6k3qTspMakpKTepLkiCisKKyM6IGV4X2NtZHMuYzoyMTc0Cittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAipdWloaWkpeuk8sn0yqzFqqTLyt3CuKS3pN6kuaSrPyIKKworIzogZXhfY21kcy5jOjIxODEKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogpdClw6XVpaGk8sn0yqzFqqTLyt3CuKS5pOuky6TPICEgpPK7yKTDpMakr6TApLWkpCIKKworIzogZXhfY21kcy5jOjIyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICK0+8K4pM6l1aWhpaSl6yBcIiUuKnNcIiCk8r7lvfGkraS3pN6kuaSrPyIKKworIzogZXhfY21kcy5jOjIzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiCl0KXDpdWloSAlbGQgpMukz8y+wbCkrKSipOqk3qS7pPMiCisKKyM6IGV4X2NtZHMuYzoyNDA1Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogpdWloaWkpeukz8rdwriktaTspN6ku6TzpMekt6S/OiAnd3JpdGUnIKWqpdelt6XnpfOky6TopOrMtbj6pMekuSIKKworIzogZXhfY21kcy5jOjI0MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIlwiJS4qc1wiIKTLpM8gJ3JlYWRvbmx5JyClqqXXpbel56XzpKzA38TqpLWk7KTGpKSk3qS5XG4iCisitq/AqcWqpMu+5b3xpK2kt6TepLmkqz8iCisKKyM6IGV4X2NtZHMuYzoyNTk3Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICKl1aWhpaSl66TyytS9uCIKKworIzogZXhfY21kcy5jOjMyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IGF1dG9jb21tYW5kpKzNvbT8pLukur+3pLekpKXQpcOl1aWhICVzIKTyuu+9/KS3pN6kt6S/IgorCisjOiBleF9jbWRzLmM6MzMzOQorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiC/9KTHpM+kyqSksPq/9KSsIDp6IKTLxc+ktaTspN6kt6S/IgorCisjOiBleF9jbWRzLmM6MzQyNAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IHJ2aW2kx6TPpbelp6XrpbOl3qXzpcmk8rvIpKik3qS7pPMiCisKKyM6IGV4X2NtZHMuYzozNTMxCittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0NjogwLW1rMm9uL2kz8q4u/qkx7bowNqk66SzpMikrKTHpK2k3qS7pPMiCisKKyM6IGV4X2NtZHMuYzozODc3CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgIiVzIKTLw9a0uaS3pN6kuaSrPyAoeS9uL2EvcS9sL15FL15ZKSIKKworIzogZXhfY21kcy5jOjQyNzAKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKLPkuf6k3qTspN6kt6S/KSIKKworIzogZXhfY21kcy5jOjQyNzQKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAiMSCy1b3qw9a0uaS3pN6kt6S/IgorCisjOiBleF9jbWRzLmM6NDI3NgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAiJWxkILLVverD1rS5pLek3qS3pL8iCisKKyM6IGV4X2NtZHMuYzo0Mjc5Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiICi31yAxILnUxuIpIgorCisjOiBleF9jbWRzLmM6NDI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgKLfXICVsZCC51MbiKSIKKworIzogZXhfY21kcy5jOjQzMzIKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IDpnbG9iYWwgpPK6xrWixaqky6TPu8ikqKTepLuk8yIKKworIzogZXhfY21kcy5jOjQzNjcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogZ2xvYmFspbOl3qXzpcmky8C1tazJvbi9pKy72MTqpLWk7KTGpKSk3qS7pPMiCisKKyM6IGV4X2NtZHMuYzo0NDE2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIqXRpb+hvKXzpKzBtKTGpM651KTHpN+kxKSrpOqk3qS3pL86ICVzIgorCisjOiBleF9jbWRzLmM6NDQ5NworbXNnaWQgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKK21zZ3N0ciAiIgorIlxuIgorIiMguse45aTLw9a0uaS1pOykv8q4u/rO8zpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDU5OCBleF9kb2NtZC5jOjIwMTEKK21zZ2lkICJFNDc4OiBEb24ndCBwYW5pYyEiCittc2dzdHIgIkU0Nzg6ILmypMakyqSkpMekr6TApLWkpCIKKworIzogZXhfY21kcy5jOjQ2NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2MTogU29ycnksIG5vICclcycgaGVscCBmb3IgJXMiCittc2dzdHIgIkU2NjE6ILvEx7Ckx6S5pKwgJyVzJyCkzqXYpeul16SsICVzIKTLpM+koqTqpN6ku6TzIgorCisjOiBleF9jbWRzLmM6NDY1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQ5OiBTb3JyeSwgbm8gaGVscCBmb3IgJXMiCittc2dzdHIgIkUxNDk6ILvEx7Ckx6S5pKwgJXMgpMukz6XYpeul16SspKKk6qTepLuk8yIKKworIzogZXhfY21kcy5jOjQ2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICK7xMewpMekuaSspdil66XXpdWloaWkpesgXCIlc1wiIKSspN+kxKSrpOqk3qS7pPMiCisKKyM6IGV4X2NtZHMuYzo1MTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6IKXHpaOl7KWvpcil6qTHpM+koqTqpN6ku6TzOiAlcyIKKworIzogZXhfY21kcy5jOjUzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IL3xuf6k383RpMsgJXMgpPKzq6SxpN6ku6TzIgorCisjOiBleF9jbWRzLmM6NTM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1Mzogxsm5/s3RpMsgJXMgpPKzq6SxpN6ku6TzIgorCisjIEFkZGVkIGF0IDI5LUFwci0yMDA0LgorIzogZXhfY21kcy5jOjUzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY3MDogTWl4IG9mIGhlbHAgZmlsZSBlbmNvZGluZ3Mgd2l0aGluIGEgbGFuZ3VhZ2U6ICVzIgorbXNnc3RyICJFNjcwOiAxpMSkzrjAuOykzqXYpeul16XVpaGlpKXrpMvKo7/0pM6lqKXzpbOhvKXJpKy6rrrfpLekxqSkpN6kuTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IKW/pbAgXCIlc1wiIKSspdWloaWkpesgJXMgpMu9xcqjpLekxqSkpN6kuSIKKworIzogZXhfY21kcy5jOjU1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiDMpMPOpM5zaWdupbOl3qXzpcmkx6S5OiAlcyIKKworIzogZXhfY21kcy5jOjU1NzcKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1Njogc2lnbsy+pKykoqTqpN6ku6TzIgorCisjOiBleF9jbWRzLmM6NTYyMworbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IHNpZ26kzsTqtcGkrMK/v/S4q6TEpKuk6qTepLekvyIKKworIzogZXhfY21kcy5jOjU2OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiDMtbj6pMpzaWdupM6lxqWtpbmlyKTHpLk6ICVzIgorCisjOiBleF9jbWRzLmM6NTcyMiBleF9jbWRzLmM6NTkxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiDMpMPOpM5zaWdupMekuTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzcxCittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogc2lnbqTOyNa55qSspKKk6qTepLuk8yIKKworIzogZXhfY21kcy5jOjU4NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IMy1uPqkyqXQpcOl1aWhzL6kx6S5OiAlcyIKKworIzogZXhfY21kcy5jOjU4OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IMy1uPqkynNpZ268scrMu9Kkx6S5OiAlbGQiCisKKyMgQWRkZWQgYXQgMjctSmFuLTIwMDQuCisjOiBleF9jbWRzLmM6NTk2MgorbXNnaWQgIiAoTk9UIEZPVU5EKSIKK21zZ3N0ciAiICAopN+kxKSrpOqk3qS7pPMpIgorCisjOiBleF9jbWRzLmM6NTk2NAorbXNnaWQgIiAobm90IHN1cHBvcnRlZCkiCittc2dzdHIgIiAoyPOltaXdobylyCkiCisKKyM6IGV4X2NtZHMuYzo2MDYzCittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJbuu+9/LrRXSIKKworIzogZXhfY21kczIuYzo5MgorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGNvbnRpbnVlLiIKK21zZ3N0ciAipcel0KXDpbCl4qG8pcmky8b+pOqk3qS5LiDCs6SxpOuky6TPIFwiY29udFwiIKTIxv7Oz6S3pMakr6TApLWkpC4iCisKKyM6IGV4X2NtZHMyLmM6OTYgZXhfZG9jbWQuYzo5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICK51CAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgIqWzpd6l86XJOiAlcyIKKworIzogZXhfY21kczIuYzoyOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAipdal7KG8pa+l3aWkpfOlyCBcIiVzJXNcIiC51CAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTogpdal7KG8pa+l3aWkpfOlyKSspN+kxKSrpOqk3qS7pPM6ICVzIgorCisjOiBleF9jbWRzMi5jOjU2NgorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIqXWpeyhvKWvpd2lpKXzpcikrMTqtcGktaTspMakpKTepLuk8yIKKworIzogZXhfY21kczIuYzo1NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgILnUICVsZCIKKworIzogZXhfY21kczIuYzo3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAiytG5uaTyIFwiJS4qc1wiIKTLyt3CuKS3pN6kuaSrPyIKKworIzogZXhfY21kczIuYzo3ODggZXhfZG9jbWQuYzo5MzU2Cittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIsy1wuoiCisKKyM6IGV4X2NtZHMyLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiCl0KXDpdWloSBcIiVzXCIgpM7K0bm5pM/K3cK4pLWk7KTGpKSk3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6OTg0Cittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICK32bnwOiDNvbT8pLukusK+pdClw6XVpaGk2LDcxrCkt6TepLekvyAoYXV0b2NvbW1hbmRzIKTyxLSk2aTGpK+kwKS1pKQpIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IMrUvbikuaTrpdWloaWkpeukzzGkxKS3pKukoqTqpN6ku6TzIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6ILrHvemkzqXVpaGlpKXrpOik6sGwpMukz7nUpLGk3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6MTM5MQorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiC6x7jlpM6l1aWhpaSl66TysdukqKTGuOWky6TPudSksaTepLuk8yIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiCkvaTOpbOl86XRpaSl6aTLpM/C0LH+pLekxqSkpN6ku6TzOiAlcyIKKworIzogZXhfY21kczIuYzoxODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiIKTyIFwiJXNcIiCkq6TpuKG698PmIgorCisjOiBleF9jbWRzMi5jOjE5MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCk8rihuvfD5iIKKworIzogZXhfY21kczIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIidydW50aW1lcGF0aCcgpM7D5qTLpM+k36TEpKuk6qTepLuk8zogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NzQKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiVmltpbmlr6XqpdelyKTOvOi5/qTfIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICKlx6Wjpeylr6XIpeqkz7zouf6k4aTepLuk8zogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCk8rzouf6k4aTepLuk8yIKKworIzogZXhfY21kczIuYzoyMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAiudQgJWxkOiBcIiVzXCIgpPK86Ln+pOGk3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6MjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCk8rzouf7D5iIKKworIzogZXhfY21kczIuYzoyMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIrnUICVsZDogJXMgpPK86Ln+w+YiCisKKyM6IGV4X2NtZHMyLmM6MjM2MworIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiJXMgpM686Ln+pPK0sM67IgorCisjOiBleF9jbWRzMi5jOjI3MDcKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiC32bnwOiC51LbowNqkrMnUwLWkx6S5LiBeTSCkrKTKpKSkzqTHpLek56SmIgorCisjOiBleF9jbWRzMi5jOjI3NTYKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgpKy86Ln+pbmlr6XqpdelyLDKs7Ckx7vIzdGktaTspN6kt6S/IgorCisjOiBleF9jbWRzMi5jOjI3ODkKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogOmZpbmlzaCCkrLzouf6luaWvpeql16XIsMqzsKTHu8jN0aS1pOyk3qS3pL8iCisKKyM6IGV4X2NtZHMyLmM6MzIzOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICIlZCCl2qG8pbgiCisKKyM6IGV4X2NtZHMyLmM6MzM5NAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAisPW6/qS5pOulxqWtpbmlyKSspKKk6qTepLuk8yIKKworIzogZXhfY21kczIuYzozNDcyCittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIrD1uv7D5jogpdqhvKW4ICVkICglZCUlKSIKKworIzogZXhfY21kczIuYzozNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIgpbOl1KG8ICVkICjBtCAlZCDD5ikiCisKKyM6IGV4X2NtZHMyLmM6MzU0MgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAisPW6/qS3pN6kt6S/OiAlcyIKKworIzogZXhfY21kczIuYzozNTQ5Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAisPW6/qSsw+a736S1pOyk3qS3pL8iCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogUG9zdFNjcmlwdL3Qzs+l1aWhpaSl66TOvfG5/qTfpail6aG8pMekuSIKKworIzogZXhfY21kczIuYzo0MTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IKXVpaGlpKXrIFwiJXNcIiCk8rOrpLGk3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6NDE5OSBleF9jbWRzMi5jOjQ4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiBQb3N0U2NyaXB0pM6l6qW9obyluaXVpaGlpKXrIFwiJXNcIiCk8sbJuf6k4aTepLuk8yIKKworIzogZXhfY21kczIuYzo0MjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTg6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxODogpdWloaWkpesgXCIlc1wiIKTPIFBvc3RTY3JpcHQgpeqlvaG8pbml1aWhpaSl66THpM+koqTqpN6ku6TzIgorCisjOiBleF9jbWRzMi5jOjQyMjIgZXhfY21kczIuYzo0MjQyIGV4X2NtZHMyLmM6NDI1NyBleF9jbWRzMi5jOjQyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOTogZmlsZSBcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxOTogpdWloaWkpesgXCIlc1wiIKTPwtCx/qS3pMakpKTKpKQgUG9zdFNjcmlwdCCl6qW9obyluaXVpaGlpKXrpMekuSIKKworIzogZXhfY21kczIuYzo0MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIgorbXNnc3RyICJFNjIxOiCl6qW9obyluaXVpaGlpKXrIFwiJXNcIiCkz6XQobyluKXnpfOkrLDbpMqk6qTepLkiCisKKyM6IGV4X2NtZHMyLmM6NDc3NgorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDogUG9zdFNjcmlwdL3Qzs/N0aTOpdWloaWkpeuk8rOrpLGk3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6NDgwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiCl1aWhpaSl6yBcIiVzXCIgpPKzq6SxpN6ku6TzIgorCisjOiBleF9jbWRzMi5jOjQ5MjgKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcInByb2xvZy5wc1wiIgorbXNnc3RyICJFNDU2OiBQb3N0U2NyaXB0pM6l6qW9obyluaXVpaGlpKXrIFwicHJvbG9nLnBzXCIgpKyk36TEpKuk6qTepLuk8yIKKworIzogZXhfY21kczIuYzo0OTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXMucHNcIiIKK21zZ3N0ciAiRTQ1NjogUG9zdFNjcmlwdKTOpeqlvaG8pbml1aWhpaSl6yBcIiVzLnBzXCIgpKyk36TEpKuk6qTepLuk8yIKKworIzogZXhfY21kczIuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gbXVsdGktYnl0ZSB0byBcIiVzXCIgZW5jb2RpbmciCittc2dzdHIgIkU2MjA6IKXepeulwaXQpaSlyMq4u/qk8qWopfOls6G8pckgXCIlc1wiIKTYytG0uaTHpK2k3qS7pPMiCisKKyM6IGV4X2NtZHMyLmM6NTEwMgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAipdel6qXzpb+ky8H3v67D5i4uLiIKKworIzogZXhfY21kczIuYzo1MTA2Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogUG9zdFNjcmlwdKXVpaGlpKXrpM6w9br+pMu8usfUpLek3qS3pL8iCisKKyM6IGV4X2NtZHMyLmM6NTEwOAorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAisPW6/qW4peel1qTywfe/rqS3pN6kt6S/LiIKKworIzogZXhfY21kczIuYzo1NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICK4vbrfpM4gJXO4wLjsOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzoguMC47KTyIFwiJXNcIiCky8DfxOqkx6StpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJFeKXiobylyaTLxv6k6qTepLkuIKXOobyl3qXrpMvM4aTrpMukz1widmlzdWFsXCKkyMb+zs+kt6TGpK+kwKS1pKQuIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1NjEKK21zZ2lkICJFNTAxOiBBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAiRTUwMTogpdWloaWkpeukzr2qzruwzMPWIgorCisjOiBleF9kb2NtZC5jOjY2OQorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogpbOl3qXzpcmkrLrGtaLFqrLhpK6k3qS5IgorCisjOiBleF9kb2NtZC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiDO47OwpKzK4cKqpLWk7KTepLuk86THpLekvzogJXMiCisKKyM6IGV4X2RvY21kLmM6MTMxNworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIrzouf6l1aWhpaSl66TOuse45aTHpLkiCisKKyM6IGV4X2RvY21kLmM6MTMxOAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAitNi/9KTOuse45aTHpLkiCisKKyM6IGV4X2RvY21kLmM6MTkwNworbXNnaWQgIkU0NjQ6IEFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgIkU0NjQ6IKXmobyltsTqtcGls6XepfOlyaTOpKKkpKTepKSkyrvIzdGkx6S5IgorCisjOiBleF9kb2NtZC5jOjE5MjEKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IKWopcelo6W/pM6ls6XepfOlyaTHpM+koqTqpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjIwMzAKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6ILXVpLWk3qTOyM+wz6Ssu9jE6qS1pOyk3qS3pL8iCisKKyM6IGV4X2RvY21kLmM6MjAzOQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAitdWktaTepM7Iz7DPpKy72MTqpLWk7KTepLekvywgxv7C2KSopN6kuaSrPyIKKworIzogZXhfZG9jbWQuYzoyMTYyCittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiB3IKTipLekr6TPIHc+PiCk8rvIzdGkt6TGpK+kwKS1pKQiCisKKyM6IGV4X2RvY21kLmM6Mzc4OAorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogpLOkzqXQobyluKXnpfOkx6TPpLOkzqWzpd6l86XJpM/N+M3RpMekraTepLuk8ywgpLSk4aTzpMqktaSkIgorCisjOiBleF9kb2NtZC5jOjM5OTEKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogpdWloaWkpevMvqTPIDEgpMSky6S3pMakr6TApLWkpCIKKworIzogZXhfZG9jbWQuYzo0NTcxCittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiytS9uKS5pNmkraXVpaGlpKXrpKwgMSC4xKSipOqk3qS5pKwsIL2qzrukt6TepLmkqz8iCisKKyM6IGV4X2RvY21kLmM6NDU3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIsrUvbikuaTZpK2l1aWhpaSl66SspKKkyCAlZCC4xKSipOqk3qS5pKwsIL2qzrukt6TepLmkqz8iCisKKyM6IGV4X2RvY21kLmM6NDU4MQorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IMrUvbikuaTZpK2l1aWhpaSl66SsIDEguMSkoqTqpN6kuSIKKworIzogZXhfZG9jbWQuYzo0NTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IMrUvbikuaTZpK2l1aWhpaSl66SspKKkyCAlbGQguMSkoqTqpN6kuSIKKworIzogZXhfZG9jbWQuYzo0Njc4Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDogpbOl3qXzpcmkrLT7pMukoqTqpN6kuTogusbE6rXBpLmk66TLpM8gISCk8sTJssOkt6TGpK+kwKS1pKQiCisKKyM6IGV4X2RvY21kLmM6NDc4OQorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICDMvsGwICAgICAgICCw+r/0IMjPsM8gIMrktLAgICAgICDE6rXBIgorCisjOiBleF9kb2NtZC5jOjQ4NzgKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIqXmobyltsTqtcGls6XepfOlyaSsuKukxKSrpOqk3qS7pPOkx6S3pL8iCisKKyM6IGV4X2RvY21kLmM6NDkxMAorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IMKwwK2kz8TqtcGktaTspMakpKTepLuk8yIKKworIzogZXhfZG9jbWQuYzo0OTYyCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiCw+r/0pM6/9KSszLW4+qTHpLkiCisKKyM6IGV4X2RvY21kLmM6NDk3NworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IKWrpaal86XIpPIyvcW72MTqpLmk66SzpMikz6THpK2k3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6NDk4NworbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6IKWrpaal86XIpM6+ys6sw82krMy1uPqkx6S5IgorCisjOiBleF9kb2NtZC5jOjUwMTgKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IMrktLCkzqS/pOGkzrD6v/SkrMmszdekx6S5IgorCisjOiBleF9kb2NtZC5jOjUwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IMy1uPqkysrktLC72MTqpMekuTogJXMiCisKKyM6IGV4X2RvY21kLmM6NTA1OQorbXNnaWQgIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIKK21zZ3N0ciAiRTQ2ODogyuS0sLD6v/Skz6Wrpbmlv6XgyuS0sKTHpLekq7vIzdGkx6StpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjUwNjUKK21zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgorbXNnc3RyICJFNDY3OiClq6W5pb+l4MrktLCky6TPsPq/9KTIpLekxrTYv/SkrMmszdekx6S5IgorCisjOiBleF9kb2NtZC5jOjUwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiDMtbj6pMrCsMCtpMekuTogJXMiCisKKyM6IGV4X2RvY21kLmM6NTExOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiDMtbj6pMqls6XepfOlycy+pMekuSIKKworIzogZXhfZG9jbWQuYzo1MTM0Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiCl5qG8pbbE6rXBpbOl3qXzpcmkz7HRwufKuLv6pMe7z6TepOmkyqSxpOyk0KTKpOqk3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6NTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogpL2kzqXmobyltsTqtcGls6XepfOlyaTPpKKk6qTepLuk8zogJXMiCisKKyM6IGV4X2RvY21kLmM6NTY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCittc2dzdHIgIkUxODU6IKWrpemhvKW5pa2hvKXgICVzIKSspN+kxKSrpOqk3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6NTY3NAorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICJWaW0gu8ikpKS1pPOhoqTkpKIhIgorCisjOiBleF9kb2NtZC5jOjYzOTEKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiv7ekt6Skpaalo6XzpcmlpqTHpdWloaWkpeuk8srUvbikt6TepLkiCisKKyM6IGV4X2RvY21kLmM6NjY4NgorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAipbml76XDpdel1aWhpaSl66SspKKk6qTepLuk8yIKKworIzogZXhfZG9jbWQuYzo2NzkwCittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIsTJssOl1aWhpaSl6yIKKworIzogZXhfZG9jbWQuYzo2ODU0Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiDBsKTOpcelo6Xspa+lyKXqpM+koqTqpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjY5MzYKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiDMpMPOIgorCisjOiBleF9kb2NtZC5jOjcwMjEKK21zZ2lkICJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NTogIgorCisjOiBleF9kb2NtZC5jOjcwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICKlpqWjpfOlyaWmsMzD1jogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDgyCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiCks6TOpdel6aXDpcil26G8peCky6TPpaalo6XzpcmlprDMw9akzrzoxsC1oce9pM+8wsH1pLWk7KTGpKSk3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6NzA5MgorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IDp3aW5wb3MgpMukzzKkxKTOv/TDzaTOsPq/9KSsyazN16THpLkiCisKKyM6IGV4X2RvY21kLmM6NzM3MAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIqXqpcClpKXspa+lyKTyyt3CuKS3pN6kuSIKKworIzogZXhfZG9jbWQuYzo3NTYwCittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICKl06Xlobyk8srdwrikt6TepLkiCisKKyM6IGV4X2RvY21kLmM6NzU2MQorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAipbulw6W3peel877wyvOk8srdwrikt6TepLkiCisKKyM6IGV4X2RvY21kLmM6NzU2MworbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIsDfxOqk8srdwrikt6TepLkiCisKKyM6IGV4X2RvY21kLmM6NzcxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiCkrMK4ut+kt6TepLkgKL7lvfGkuaTrpMukzyAhIKTyxMmyw6S3pMakr6TApLWkpCkiCisKKyM6IGV4X2RvY21kLmM6NzcyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6IFwiJXNcIiCk8r3xuf6k383RpMikt6TGs6uksaTepLuk8yIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Nzc0NAorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogsPq/9KTPyri7+qSrwbC/yi+45cLgpa+lqaG8pcikx6S3pMqksaTspNCkpKSxpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjc3ODYKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IDpub3JtYWwgpM66xrWizfjN0aSsv7ykr6TKpOqkuaSupN6kt6S/IgorCisjOiBleF9kb2NtZC5jOjgzMDQKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogJyMnpPLD1qSttLmkqKTryful1aWhpaSl66TOzL7BsKSspKKk6qTepLuk8yIKKworIzogZXhfZG9jbWQuYzo4MzM1Cittc2dpZCAiRTQ5NTogbm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJFNDk1OiBcIjxhZmlsZT5cIqTyw9akrbS5pKik62F1dG9jb21tYW5kpM6l1aWhpaSl68y+pKykoqTqpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjgzNDMKK21zZ2lkICJFNDk2OiBubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIkU0OTY6IFwiPGFidWY+XCKk8sPWpK20uaSopOthdXRvY29tbWFuZKXQpcOl1aWhyNa55qSspKKk6qTepLuk8yIKKworIzogZXhfZG9jbWQuYzo4MzU0Cittc2dpZCAiRTQ5Nzogbm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIkU0OTc6IFwiPGFtYXRjaD5cIqTyw9akrbS5pKik62F1dG9jb21tYW5kpM6zusX2zL6krKSipOqk3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6ODM2NAorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICJFNDk4OiBcIjxzZmlsZT5cIqTyw9akrbS5pKik6yA6c291cmNlIMLQvt2l1aWhpaSl68y+pKykoqTqpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjg0MDUKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIiIKKyJFNDk5OiAnJScgpOQgJyMnIKSszLXMvqXVpaGlpKXrpMqkzqTHIFwiOnA6aFwiIKTyyLyk76TKpKS7yKSkyv2kz6THpK2k3qS7pPMiCisKKyM6IGV4X2RvY21kLmM6ODQwNworbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6ILb1yri7+s7zpMikt6TGyb6ywaS1pOyk3qS3pL8iCisKKyM6IGV4X2RvY21kLmM6OTMzOAorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogdmltaW5mb6XVpaGlpKXrpPLGybn+zdGkyKS3pMazq6SxpN6ku6TzIgorCisjOiBleF9kb2NtZC5jOjk1MTEKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IKSzpM6l0KG8pbil56XzpMu557v6pM+koqTqpN6ku6TzIgorCisjOiBleF9ldmFsLmM6NDQwCittc2dpZCAiRTYwODogQ2Fubm90IDp0aHJvdyBleGNlcHRpb25zIHdpdGggJ1ZpbScgcHJlZml4IgorbXNnc3RyICJFNjA4OiAnVmltJyCkx7vPpN6k687js7CkzyA6dGhyb3cgpMekraTepLuk8yIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICLO47OwpKzIr8C4pLek3qS3pL86ICVzIgorCisjOiBleF9ldmFsLmM6NTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBmaW5pc2hlZDogJXMiCittc2dzdHIgIs7js7CkrLz9wqukt6TepLekvzogJXMiCisKKyM6IGV4X2V2YWwuYzo1NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGRpc2NhcmRlZDogJXMiCittc2dzdHIgIs7js7CkrMfLtP6ktaTspN6kt6S/OiAlcyIKKworIzogZXhfZXZhbC5jOjYyMCBleF9ldmFsLmM6NjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzLCBsaW5lICVsZCIKK21zZ3N0ciAiJXMsILnUICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICLO47OwpKzK4cKqpLWk7KTepLekvzogJXMiCisKKyM6IGV4X2V2YWwuYzo3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICIlcyCky6TopOrMpLfoxOq+9cLWpKzAuKS4pN6kt6S/IgorCisjOiBleF9ldmFsLmM6NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJlc3VtZWQiCittc2dzdHIgIiVzIKSsusazq6S3pN6kt6S/IgorCisjOiBleF9ldmFsLmM6NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMgpKzHy7T+pLWk7KTepLekvyIKKworIzogZXhfZXZhbC5jOjc0NgorbXNnaWQgIkV4Y2VwdGlvbiIKK21zZ3N0ciAizuOzsCIKKworIzogZXhfZXZhbC5jOjc1MgorbXNnaWQgIkVycm9yIGFuZCBpbnRlcnJ1cHQiCittc2dzdHIgIqWopemhvKTIs+S5/qTfIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzNzUKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAipail6aG8IgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAis+S5/qTfIgorCisjOiBleF9ldmFsLmM6ODMwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IDppZiCkzsb+pOy70qSsv7yy4aSupN6kuSIKKworIzogZXhfZXZhbC5jOjg2NworbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmlmIKTOpMqkpCA6ZW5kaWYgpKykoqTqpN6kuSIKKworIzogZXhfZXZhbC5jOjkxMQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6aWYgpM6kyqSkIDplbHNlIKSspKKk6qTepLkiCisKKyM6IGV4X2V2YWwuYzo5MTQKK21zZ2lkICJFNTgyOiA6ZWxzZWlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgyOiA6aWYgpM6kyqSkIDplbHNlaWYgpKykoqTqpN6kuSIKKworIzogZXhfZXZhbC5jOjkyMQorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiDKo7/0pM4gOmVsc2UgpKykoqTqpN6kuSIKKworIzogZXhfZXZhbC5jOjkyNAorbXNnaWQgIkU1ODQ6IDplbHNlaWYgYWZ0ZXIgOmVsc2UiCittc2dzdHIgIkU1ODQ6IDplbHNlIKTOuOWkyyA6ZWxzZWlmIKSspKKk6qTepLkiCisKKyM6IGV4X2V2YWwuYzo5OTEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogOndoaWxlIKTOxv6k7LvSpKy/vKSvsuGkrqTepLkiCisKKyM6IGV4X2V2YWwuYzoxMDQ3Cittc2dpZCAiRTU4NjogOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg2OiA6d2hpbGUgpM6kyqSkIDpjb250aW51ZSCkrKSipOqk3qS5IgorCisjOiBleF9ldmFsLmM6MTA4NworbXNnaWQgIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NzogOndoaWxlIKTOpMqkpCA6YnJlYWsgpKykoqTqpN6kuSIKKworIzogZXhfZXZhbC5jOjEyODYKK21zZ2lkICJFNjAxOiA6dHJ5IG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU2MDE6IDp0cnkgpM7G/qTsu9KkrL+8suGkrqTepLkiCisKKyM6IGV4X2V2YWwuYzoxMzY2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOnRyeSCkzqTKpKQgOmNhdGNoIKSspKKk6qTepLkiCisKKyMuIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gKiBKdXN0IHBhcnNlLgorIzogZXhfZXZhbC5jOjEzODgKK21zZ2lkICJFNjA0OiA6Y2F0Y2ggYWZ0ZXIgOmZpbmFsbHkiCittc2dzdHIgIkU2MDQ6IDpmaW5hbGx5IKTOuOWkyyA6Y2F0Y2ggpKykoqTqpN6kuSIKKworIzogZXhfZXZhbC5jOjE1MjEKK21zZ2lkICJFNjA2OiA6ZmluYWxseSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDY6IDp0cnkgpM6kyqSkIDpmaW5hbGx5IKSspKKk6qTepLkiCisKKyMuIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIzogZXhfZXZhbC5jOjE1NDUKK21zZ2lkICJFNjA3OiBtdWx0aXBsZSA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNzogyqO/9KTOIDpmaW5hbHl5IKSspKKk6qTepLkiCisKKyM6IGV4X2V2YWwuYzoxNjU0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDp0cnkgpM6kyqSkIDplbmR0cnkgpMekuSIKKworIzogZXhfZXZhbC5jOjE5ODYKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiC02L/0pM6zsKTLIDplbmRmdW5jdGlvbiCkrKSipOqk3qS3pL8iCisKKyM6IGV4X2dldGxuLmM6MzI5NQorbXNnaWQgInRhZ25hbWUiCittc2dzdHIgIqW/pbDMviIKKworIzogZXhfZ2V0bG4uYzozMjk4Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgpdWloaWkpeu8787gXG4iCisKKyM6IGV4X2dldGxuLmM6NDc1MQorbXNnaWQgIidoaXN0b3J5JyBvcHRpb24gaXMgemVybyIKK21zZ3N0ciAipaql16W3peel8yAnaGlzdG9yeScgpKylvKXtpMekuSIKKworIzogZXhfZ2V0bG4uYzo1MDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcyC54MzcpM7N+s7yICi/t6S3pKSk4qTOpKuk6bjFpKSk4qTOpNgpOlxuIgorCisjOiBleF9nZXRsbi5jOjUwMTgKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgIqWzpd6l86XJpemlpKXzIgorCisjOiBleF9nZXRsbi5jOjUwMTkKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICK4obr3yri7+s7zIgorCisjOiBleF9nZXRsbi5jOjUwMjAKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICK8sCIKKworIzogZXhfZ2V0bG4uYzo1MDIxCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAixv7Oz7nUIgorCisjOiBleF9nZXRsbi5jOjUwNTkKK21zZ2lkICJFMTk4OiBjbWRfcGNoYXIgYmV5b25kIHRoZSBjb21tYW5kIGxlbmd0aCIKK21zZ3N0ciAiRTE5ODogY21kX3BjaGFyIKSspbOl3qXzpcnEuaTyxLakqKTepLekvyIKKworIzogZXhfZ2V0bG4uYzo1MjM2Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogpaKlr6XGpaOl1qTKpaalo6XzpcmlpqSrpdClw6XVpaGkrLrvvfyktaTspN6kt6S/IgorCisjOiBmaWxlaW8uYzozNzEKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiydTAtaTKpdWloaWkpevMviIKKworIzogZmlsZWlvLmM6Mzk1IGZpbGVpby5jOjUyOSBmaWxlaW8uYzoyODUwIGZpbGVpby5jOjI4OTEKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiIKTPpcelo6Xspa+lyKXqpMekuSIKKworIzogZmlsZWlvLmM6Mzk3Cittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAiIKTPpdWloaWkpeukx6TPpKKk6qTepLuk8yIKKworIzogZmlsZWlvLmM6NTUxIGZpbGVpby5jOjQwNTcKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbv7el1aWhpaSl610iCisKKyM6IGZpbGVpby5jOjU4NAorbXNnaWQgIltQZXJtaXNzaW9uIERlbmllZF0iCittc2dzdHIgIlvHp7LEpKykoqTqpN6ku6TzXSIKKworIzogZmlsZWlvLmM6Njg4Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmQgpKyl1aWhpaSl66Tyxsm5/snUssSky6S3pN6kt6S/IgorCisjOiBmaWxlaW8uYzo2OTAKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZCCkz7i9ut+kzqXQpcOl1aWhpPLK0aSopOmk7KTepLuk8yIKKworIzogZmlsZWlvLmM6NzExCittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiDJuL3gxv7Oz6SrpOnGybn+w+YuLi5cbiIKKworIzogZmlsZWlvLmM6NzE3Cittc2dpZCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uIgorbXNnc3RyICLJuL3gxv7Oz6SrpOnGybn+pN/D5i4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo5ODgKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogytG0uaSspdWloaWkpeuk8sbJuf7J1LLEpMukt6TepLekvyIKKworIzogZmlsZWlvLmM6MjAyNworbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltGSUZPL6W9pbGlw6XIXSIKKworIzogZmlsZWlvLmM6MjAzNAorbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW0ZJRk9dIgorCisjOiBmaWxlaW8uYzoyMDQxCittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIlulvaWxpcOlyF0iCisKKyM6IGZpbGVpby5jOjIwNDkKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbxsnA7F0iCisKKyM6IGZpbGVpby5jOjIwNTkKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIltDUsy1XSIKKworIzogZmlsZWlvLmM6MjA2NAorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIltOTM2tXSIKKworIzogZmlsZWlvLmM6MjA2OQorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW8S5udTKrLPkXSIKKworIzogZmlsZWlvLmM6MjA3NSBmaWxlaW8uYzo0MDQxCittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbzKTK0bS5XSIKKworIzogZmlsZWlvLmM6MjA4MCBmaWxlaW8uYzo0MDQ2Cittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvK0bS5utFdIgorCisjOiBmaWxlaW8uYzoyMDg3IGZpbGVpby5jOjQwNzEKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIluwxbnmsr1dIgorCisjOiBmaWxlaW8uYzoyMDk0Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbytG0uaWopemhvF0iCisKKyM6IGZpbGVpby5jOjIxMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIlslbGQgudTM3KTOydTAtaTKpdClpKXIXSIKKworIzogZmlsZWlvLmM6MjEwNworbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIlvGybn+pail6aG8XSIKKworIzogZmlsZWlvLmM6MjMyMworbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICLK0bS5pMvJrM3XpMqw7Lv+pdWloaWkpeukrKTfpMSkq6TqpN6ku6TzIgorCisjOiBmaWxlaW8uYzoyMzMwCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICInY2hhcmNvbnZlcnQnIKTLpOik68rRtLmkrLy6x9Skt6TepLekvyIKKworIzogZmlsZWlvLmM6MjMzMworbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIidjaGFyY29udmVydCcgpM690M7PpPLGybn+pOGk3qS7pPOkx6S3pL8iCisKKyM6IGZpbGVpby5jOjI3MzMKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogyt3CuKS5pOul0KXDpdWloaTyYXV0b2NvbW1hbmSkrLrvvfykq7Lyyvykt6TepLekvyIKKworIzogZmlsZWlvLmM6Mjc1NgorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiBhdXRvY29tbWFuZKSszb20/KS7pMzK/cuhpMe51L/0pPLK0bm5pLek3qS3pL8iCisKKyMgQWRkZWQgYXQgMTktSmFuLTIwMDQuCisjOiBmaWxlaW8uYzoyNzk0Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFuc6TPzKTK0bm5pM6l0KXDpdWloaTyvuW98aS5pOuks6TIpM+19rLEpLekxqSkpN6ku6TzIgorCisjOiBmaWxlaW8uYzoyODAyCittc2dpZCAiUGFydGlhbCB3cml0ZXMgZGlzYWxsb3dlZCBmb3IgTmV0QmVhbnMgYnVmZmVycyIKK21zZ3N0ciAiTmV0QmVhbnOl0KXDpdWloaTOsOzJ9KTyvfGkrb3QpLmks6TIpM+kx6StpN6ku6TzIgorCisjOiBmaWxlaW8uYzoyODU2IGZpbGVpby5jOjI4NzQKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAipM+l1aWhpaSl66THpOK98bn+pN+yxMe9pcel0KWkpbmkx6TipKKk6qTepLuk8yIKKworIzogZmlsZWlvLmM6MjkyNgorbXNnaWQgImlzIHJlYWQtb25seSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICKkz8bJuf7A7M3RpMekuSAotq/Aqb3xuf6ky6TPICEgpPLEybLDKSIKKworIzogZmlsZWlvLmM6MzI3MgorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IKXQpcOlr6WipcOl16XVpaGlpKXrpPLK3cK4pMekraTepLuk8yAoISCk8sTJssOkx7avwKnK3cK4KSIKKworIzogZmlsZWlvLmM6MzI4NAorbXNnaWQgIkU1MDc6IENsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTUwNzogpdClw6WvpaKlw6XXpdWloaWkpeuk8srEpLik67rdpMulqKXpobykrMivwLikt6TepLekvyAoISCk8sTJssOkx7avwKkpIgorCisjOiBmaWxlaW8uYzozMjg2Cittc2dpZCAiRTUwODogQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwODogpdClw6WvpaKlw6XXzdGl1aWhpaSl66Tyxsm5/qThpN6ku6TzICghIKTyxMmyw6THtq/AqcbJuf4pIgorCisjOiBmaWxlaW8uYzozMzAyCittc2dpZCAiRTUwOTogQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA5OiCl0KXDpa+loqXDpdel1aWhpaSl66Tyuu6k7KTepLuk8yAoISCk8sTJssOkx7avwKm67sCuKSIKKworIzogZmlsZWlvLmM6MzQwNQorbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDogpdClw6WvpaKlw6XXpdWloaWkpeuk8rrupOyk3qS7pPMgKCEgpPLEybLDpMe2r8Cpuu7ArikiCisKKyM6IGZpbGVpby5jOjM0NjcKK21zZ2lkICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NjA6IKXqpb2hvKW5pdWlqaG8pa+krLy6pO+k7KTrpKuk4qS3pOyk3qS7pPMgKCEgpPLEybLDpMe2r8CpKSIKKworIzogZmlsZWlvLmM6MzU2NgorbXNnaWQgIkUyMTQ6IENhbid0IGZpbmQgdGVtcCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjE0OiDK3cK4zdGw7Lv+pdWloaWkpeukrKTfpMSkq6TqpN6ku6TzIgorCisjOiBmaWxlaW8uYzozNTg0Cittc2dpZCAiRTIxMzogQ2Fubm90IGNvbnZlcnQgKGFkZCAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiCittc2dzdHIgIkUyMTM6IMrRtLmkx6StpN6ku6TzICghIKTyxMmyw6THytG0uaS7pLqky8rdwrgpIgorCisjOiBmaWxlaW8uYzozNjE5Cittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2Njogpeql86WvpLWk7KS/pdWloaWkpeuky73xuf6k4aTepLuk8yIKKworIzogZmlsZWlvLmM6MzYyMworbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogvfG5/qTfzdGky6XVpaGlpKXrpPKzq6SxpN6ku6TzIgorCisjOiBmaWxlaW8uYzozODg1Cittc2dpZCAiRTY2NzogRnN5bmMgZmFpbGVkIgorbXNnc3RyICJFNjY3OiBmc3luYyCky7y6x9Skt6TepLekvyIKKworIzogZmlsZWlvLmM6Mzg5MgorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTUxMjogysSkuKTrpLOkyKTLvLrH1CIKKworIzogZmlsZWlvLmM6Mzk2MworbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzogvfG5/qTfpail6aG8LCDK0bS5vLrH1CIKKworIzogZmlsZWlvLmM6Mzk2OQorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IL3xuf6k36WopemhvCwgKKXVpaGlpKXrpbeluaXGpeCkrMv+x9U/KSIKKworIzogZmlsZWlvLmM6NDAzNgorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICIgytG0uaWopemhvCIKKworIzogZmlsZWlvLmM6NDA1MgorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJbpcel0KWkpbldIgorCisjOiBmaWxlaW8uYzo0MDU3Cittc2dpZCAiW05ld10iCittc2dzdHIgIlu/t10iCisKKyM6IGZpbGVpby5jOjQwNzkKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW2FdIgorCisjOiBmaWxlaW8uYzo0MDc5Cittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgxMmywyIKKworIzogZmlsZWlvLmM6NDA4MQorbXNnaWQgIiBbd10iCittc2dzdHIgIiBbd10iCisKKyM6IGZpbGVpby5jOjQwODEKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIL3xuf6k3yIKKworIzogZmlsZWlvLmM6NDEzMQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBwYXRjaG1vZGU6ILi2y9yl1aWhpaSl66Tyyt3CuKTHpK2k3qS7pPMiCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogtvWkzri2y9yl1aWhpaSl66TydG91Y2ikx6StpN6ku6TzIgorCisjOiBmaWxlaW8uYzo0MTY4Cittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiCl0KXDpa+loqXDpdel1aWhpaSl66TyvsOku6TepLuk8yIKKworIzogZmlsZWlvLmM6NDIzMgorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIrfZufA6ILi2y9yl1aWhpaSl66SsvLqk76TspL+kq8rRubmktaTspN6kt6S/XG4iCisKKyM6IGZpbGVpby5jOjQyMzQKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICKl1aWhpaSl66TOyt3CuKTLwK64+aS5pOuk3qTHpailx6Wjpb+k8r2qzrukt6TKpKSkx6SvpMCktaSkISIKKworIzogZmlsZWlvLmM6NDMyMworbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDMyMworbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2Rvc6XVpamhvKXepcOlyF0iCisKKyM6IGZpbGVpby5jOjQzMzAKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW21hY10iCisKKyM6IGZpbGVpby5jOjQzMzAKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIlttYWOl1aWpobyl3qXDpchdIgorCisjOiBmaWxlaW8uYzo0MzM3Cittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQzMzcKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peKXVpamhvKXepcOlyF0iCisKKyM6IGZpbGVpby5jOjQzNjQKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSC51CwgIgorCisjOiBmaWxlaW8uYzo0MzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQgudQsICIKKworIzogZmlsZWlvLmM6NDM2OQorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIMq4u/oiCisKKyM6IGZpbGVpby5jOjQzNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCDKuLv6IgorCisjOiBmaWxlaW8uYzo0MzgxCittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW25vZW9sXSIKKworIzogZmlsZWlvLmM6NDM4MQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIlu6x72qudSkrMnUtLDBtF0iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDQwMAorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAit9m58Dogxsm5/qTzpMC45aTLpdWloaWkpeuky8rRubmkrKSipOqk3qS3pL8hISEiCisKKyM6IGZpbGVpby5jOjQ0MDIKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIsvcxfaky77lvfGkraS3pN6kuaSrIgorCisjOiBmaWxlaW8uYzo1NTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBcIiVzXCIgpPK98bn+pN/D5qTOpail6aG8pMekuSIKKworIzogZmlsZWlvLmM6NTU3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogXCIlc1wiIKTyysSkuKTru/6ky6WopemhvKTHpLkiCisKKyM6IGZpbGVpby5jOjU1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IFwiJXNcIiCk8sbJuf7D5qTOpail6aG8pMekuSIKKworIzogZmlsZWlvLmM6NTgxMAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IGF1dG9jb21tYW5kIKTOIEZpbGVDaGFuZ2VkU2hlbGwgpKyl0KXDpdWloaTyuu+9/KS3pN6kt6S/IgorCisjOiBmaWxlaW8uYzo1ODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6ILfZufA6IKXVpaGlpKXrIFwiJXNcIiCkz7T7pMvCuLrfpLek3qS7pPMiCisKKyM6IGZpbGVpby5jOjU4MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICJXMTI6ILfZufA6IKXVpaGlpKXrIFwiJXNcIiCkrMrRubmktaTsVmltpM6l0KXDpdWloaTiytG5uaS1pOyk3qS3pL8iCisKKyM6IGZpbGVpby5jOjU4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMTogt9m58DogpdWloaWkpesgXCIlc1wiIKTPytS9uLOru8+45aTLytG5uaS1pOyk3qS3pL8iCisKKyM6IGZpbGVpby5jOjU4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzE2OiC32bnwOiCl1aWhpaSl6yBcIiVzXCIgpM6l4qG8pcmkrMrUvbizq7vPuOWky8rRubmktaTspN6kt6S/IgorCisjOiBmaWxlaW8uYzo1ODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogt9m58DogpdWloaWkpesgXCIlc1wiIKTPytS9uLOru8+45aTLuu7ArqS1pOyk3qS3pL8iCisKKyM6IGZpbGVpby5jOjU4NTkKK21zZ2lkICJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIKK21zZ3N0ciAivty62aTPIFwiOmhlbHAgVzExXCIgpPK7sr7IpLekxqSvpMCktaSkIgorCisjOiBmaWxlaW8uYzo1ODczCittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAit9m58CIKKworIzogZmlsZWlvLmM6NTg3NAorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisipdWloaWkpevGybn+KCZMKSIKKworIzogZmlsZWlvLmM6NTk4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2MjogXCIlc1wiIKTypeql7aG8pcmkuaTrveDI96SspMekraTepLuk86THpLekvyIKKworIzogZmlsZWlvLmM6NTk5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogXCIlc1wiIKTPpeql7aG8pcmkx6StpN6ku6TzpMekt6S/IgorCisjOiBmaWxlaW8uYzo2NTgwCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0tuu+9/LrRLS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2NzQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogpL2kzqWwpeuhvKXXpM+koqTqpN6ku6TzOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY4NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6ICogpM645aTLydTAtaTKyri7+qSspKKk6qTepLekvzogJXMiCisKKyM6IGZpbGVpby5jOjY4NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IKS9pM6k6KSmpMqlpKXZpfOlyKTPpKKk6qTepLuk8zogJXMiCisKKyM6IGZpbGVpby5jOjY4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IKS9pM6k6KSmpMqlsKXrobyl16TipLekr6TPpaSl2aXzpcikz6SipOqk3qS7pPM6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcwMzgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorCisjOiBmaWxlaW8uYzo3MzA5Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IMG0pMakzqWkpdml86XIpMvC0KS3pMakzmF1dG9jb21tYW5kpM+8wrnUpMekraTepLuk8yIKKworIzogZmlsZWlvLmM6NzMzMgorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAis7rF9qS5pOthdXRvY29tbWFuZKTPwri636S3pN6ku6TzIgorCisjOiBmaWxlaW8uYzo3NjUzCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogYXV0b2NvbW1hbmSkzsb+pOy70qSsv7ykuaSupN6kuSIKKworIzogZmlsZWlvLmM6NzkyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzkzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGVjdXRpbmcgJXMiCittc2dzdHIgIiVzIKTyvMK51KS3pMakpKTepLkiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6ODAwNAorIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiYXV0b2NvbW1hbmQgJXMiCisKKyM6IGZpbGVpby5jOjg1NzEKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiB7IKSspKKk6qTepLuk8y4iCisKKyM6IGZpbGVpby5jOjg1NzMKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiB9IKSspKKk6qTepLuk8y4iCisKKyM6IGZvbGQuYzo2OAorbXNnaWQgIkU0OTA6IE5vIGZvbGQgZm91bmQiCittc2dzdHIgIkU0OTA6IMDevvak36SspKKk6qTepLuk8yIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiC4vbrfpM4gJ2ZvbGRtZXRob2QnIKTHpM/A3r72pN+k8rruwK6kx6StpN6ku6TzIgorCisjOiBmb2xkLmM6NTk1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6ILi9ut+kziAnZm9sZG1ldGhvZCcgpMekz8Devvak36Tyuu+9/KTHpK2k3qS7pPMiCisKKyM6IGdldGNoYXIuYzoyNDgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IMbJuf6l0KXDpdWloaTYxMmywyIKKworIzogZ2V0Y2hhci5jOjIxOTgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogusa1osWqpd6lw6XUpfOlsCIKKworIzogZ2V0Y2hhci5jOjMwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzIKTIpKSkpqWwpe2hvKXQpevDu73Mxv7Oz6TPtPuky8K4ut+kt6TepLkiCisKKyM6IGdldGNoYXIuYzozMDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogJXMgpMikpKSmpbCl7aG8pdCl66XepcOl1KXzpbCkz7T7pMvCuLrfpLek3qS5IgorCisjOiBnZXRjaGFyLmM6MzIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiAlcyCkyKSkpKbDu73Mxv7Oz6TPtPuky8K4ut+kt6TepLkiCisKKyM6IGdldGNoYXIuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiAlcyCkyKSkpKal3qXDpdSl86WwpM+0+6TLwri636S3pN6kuSIKKworIzogZ2V0Y2hhci5jOjMyNzkKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIsO7vczG/s7PpM+k36TEpKuk6qTepLuk86THpLekvyIKKworIzogZ2V0Y2hhci5jOjMyODEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICKl3qXDpdSl86WwpM+k36TEpKuk6qTepLuk86THpLekvyIKKworIzogZ2V0Y2hhci5jOjQxNzMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IMnUwLWkyqXiobylySIKKworIzogZ3VpLmM6MjIwCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IEdVSaTys6u7z6THpK2k3qS7pPMiCisKKyM6IGd1aS5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogXCIlc1wipKuk6cbJuf6k4KSzpMikrKTHpK2k3qS7pPMiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIkU2NjU6IM2tuPqkyqXVpaml86XIpKy4q6TEpKuk6aTKpKSkzqTHLCBHVUmk8rOru8+kx6StpN6ku6TzIgorCisjOiBndWkuYzo0NzcKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ICdndWlmb250d2lkZScgpKzMtbj6pMekuSIKKworIzogZ3VpLmM6NTQ3Cittc2dpZCAiRTU5OTogVmFsdWUgb2YgJ2ltYWN0aXZhdGVrZXknIGlzIGludmFsaWQiCittc2dzdHIgIkU1OTk6ICdpbWFjdGl2YXRla2V5JyCky8DfxOqktaTspL/DzaSszLW4+qTHpLkiCisKKyM6IGd1aS5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiAlcyCkzr+npPKz5KTqxfakxqTppOyk3qS7pPMiCisKKyM6IGd1aV9hdF9mcy5jOjMwMAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8s6uksaTepLuk8z4iCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogpdWlqaXzpcggJXMgpPK86MbApMekraTepLuk8yIKKworIzogZ3VpX2F0X2ZzLmM6Mjc4MQorbXNnaWQgIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTQ6IHZpbV9TZWxGaWxlOiC4vbrfpM6lx6Wjpeylr6XIpeqky8zhpOyk3qS7pPMiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIqXRpbnMvjoiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDcKK21zZ2lkICJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE1OiB2aW1fU2VsRmlsZToguL2636TOpcelo6Xspa+lyKXqpPK86MbApMekraTepLuk8yIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAipa2l46Xzpbul6yIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICKluaWvpe2hvKXrpdChvDogsujB/KTyvOjGwKTHpK2k3qS7pPOkx6S3pL8uIgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltIKXApaSloqXtpbAiCisKKyM6IGd1aV9iZXZhbC5jOjEwMSBndWlfdzMyLmM6MzgzMAorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICJFMjMyOiCl4aXDpbuhvKW4pMils6G8peul0KXDpa+kzqSipOsgQmFsbG9vbkV2YWwgpPK67sCupMekraTepLuk8yIKKworIzogZ3VpX2d0ay5jOjE2MDcKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gpcClpKWipe2lsC4uLiIKKworIzogZ3VpX2d0ay5jOjIwNjAgbWVzc2FnZS5jOjI5OTMKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyKkz6SkKCZZKVxuIgorIqSkpKSkqCgmTilcbiIKKyKlraXjpfOlu6XrKCZDKSIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAipaSl86XXpcOlyKXhpb2lw6XJIgorCisjOiBndWlfZ3RrLmM6MjUzNCBndWlfbW90aWYuYzoyNzY4Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSC4obr3pMjD1rS5Li4uIgorCisjOiBndWlfZ3RrLmM6MjU0MiBndWlfbW90aWYuYzoyNzcwCittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSC4obr3Li4uIgorCisjOiBndWlfZ3RrLmM6MjU3NCBndWlfbW90aWYuYzoyODg4Cittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAiuKG698q4u/rO8zoiCisKKyM6IGd1aV9ndGsuYzoyNTkyIGd1aV9tb3RpZi5jOjI5MjAKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICLD1rS5yri7+s7zOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAiwLWzzqTLs7rF9qS5pOuk4qTOpMCksSIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjM1IGd1aV9tb3RpZi5jOjMwNDgKK21zZ2lkICJNYXRjaCBjYXNlIgorbXNnc3RyICLC58q4u/ovvq7KuLv6pPK26MrMpLmk6yIKKworIzogZ3VpX2d0ay5jOjI2NDUgZ3VpX21vdGlmLmM6Mjk5MAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAiyv24/iIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNjU3IGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAivuUiCisKKyM6IGd1aV9ndGsuYzoyNjYxIGd1aV9tb3RpZi5jOjMwMTAKK21zZ2lkICJEb3duIgorbXNnc3RyICKyvCIKKworIzogZ3VpX2d0ay5jOjI2ODMgZ3VpX2d0ay5jOjI2ODUgZ3VpX21vdGlmLmM6Mjc5MgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAivKGk8rihuvciCisKKyM6IGd1aV9ndGsuYzoyNzAyIGd1aV9ndGsuYzoyNzA0IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICLD1rS5IgorCisjOiBndWlfZ3RrLmM6MjcxNSBndWlfZ3RrLmM6MjcxNyBndWlfbW90aWYuYzoyODIyCittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIsG0pMbD1rS5IgorCisjOiBndWlfZ3RrX3gxMS5jOjIzMjcKK21zZ2lkICJWaW06IFJlY2VpdmVkIFwiZGllXCIgcmVxdWVzdCBmcm9tIHNlc3Npb24gbWFuYWdlclxuIgorbXNnc3RyICJWaW06IKW7pcOlt6XnpfOl3qXNobyluKXjpKuk6SBcImRpZVwiIM3XteGk8rz1pLG86KTqpN6kt6S/XG4iCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOQorbXNnaWQgIlZpbTogTWFpbiB3aW5kb3cgdW5leHBlY3RlZGx5IGRlc3Ryb3llZFxuIgorbXNnc3RyICJWaW06IKXhpaSl86WmpaOl86XJpaakrMnUsNWky8fLsvWktaTspN6kt6S/XG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDEzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICKl1aWppfOlyMGqwvIiCisKKyM6IGd1aV9ndGtfeDExLmM6NjAzNSB1aS5jOjIxMTcKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICK29aTOwarC8s7OsOikzqSrpO+k6qTLQ1VUX0JVRkZFUjCkrLvIzdGktaTspN6kt6S/IgorCisjOiBndWlfbW90aWYuYzoxNjE3IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIqXVpaOl66W/IgorCisjOiBndWlfbW90aWYuYzoxNjE5Cittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIqXHpaOl7KWvpcil6iIKKworIzogZ3VpX21vdGlmLmM6MTYyMQorbXNnaWQgIkhlbHAiCittc2dzdHIgIqXYpeul1yIKKworIzogZ3VpX21vdGlmLmM6MTYyMgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICKl1aWhpaSl6yIKKworIzogZ3VpX21vdGlmLmM6MTYyNAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiwarC8iIKKworIzogZ3VpX21vdGlmLmM6MjgzNQorbXNnaWQgIlVuZG8iCittc2dzdHIgIqWipfOlyaWlIgorCisjOiBndWlfcmlzY29zLmM6OTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTA6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTYxMDogWmFwpdWlqaXzpcggJyVzJyCk8sbJuf6k4aTepLuk8yIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkU2MTE6IKXVpaml86XIICVzIKTyu8jN0aTHpK2k3qS7pPMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjcwCittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIrvSpdel7aW7pbmk2MTku9+l4aXDpbuhvKW4pPLB97+uw+akx6S5LlxuIgorCisjOiBndWlfdzMyLmM6ODMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiCw+r/0pM+ltaXdobylyKS1pOyk3qS7pPM6IFwiLSVzXCI7IE9MRcjHpPK7yM3RpLekxqSvpMCktaSkLiIKKworIzogZ3VpX3c0OC5jOjIwOTAKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICK4obr3yri7+s7zICgnXFwnIKTyuKG696S5pOuky6TPICdcXFxcJykiCisKKyM6IGd1aV93NDguYzoyMTE1Cittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiuKG696Gmw9a0uSAoJ1xcJyCk8rihuvekuaTrpMukzyAnXFxcXCcpIgorCisjOiBndWlfeDExLmM6MTUzNworbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIlZpbSBFNDU4OiC/p7vYxOqkrMC1pLekr6TKpKSkzqTHpail86XIpeqk8rPkpOrF9qTGpOmk7KTepLuk8yIKKworIzogZ3VpX3gxMS5jOjIxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6ILDKsrykzsq4u/qlu6XDpcikzqXVpaml86XIpKykoqTqpN6ku6TzICVzOiIKKworIzogZ3VpX3gxMS5jOjIxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogpdWlqaXzpcilu6XDpcjMvjogJXMiCisKKyM6IGd1aV94MTEuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIqXVpaml86XIICclcycgpM+4x8Tqyf2kx6TPpKKk6qTepLuk8yIKKworIzogZ3VpX3gxMS5jOjIxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiCl1aWppfOlyKW7pcOlyMy+OiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MDogJXNcbiIKK21zZ3N0ciAipdWlqaXzpcgwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAipdWlqaXzpcgxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICJGb250JWQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAipdWlqaXzpcglZCCkzsn9pKyl1aWppfOlyDCkzsfcpMekz6SipOqk3qS7pPNcbiIKKworIzogZ3VpX3gxMS5jOjIxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICKl1aWppfOlyDCkzsn9OiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIqXVpaml86XIMaTOyf06ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1Njogpc+l86WwpeulqqG8pcil3qXIpfOlqKXpobwiCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgorbXNnc3RyICK/t6XHobylv6XZobyluaTyxMmywyIKKworIzogaWZfY3Njb3BlLmM6NzkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICKl0aW/obyl86TOpa+lqKXqobyk8sTJssMiCisKKyM6IGlmX2NzY29wZS5jOjgxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIqSzpM6l4aXDpbuhvKW4pPLJvbyopLmk6yIKKworIzogaWZfY3Njb3BlLmM6ODMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiwNzCs6TyvarOu6S5pOsiCisKKyM6IGlmX2NzY29wZS5jOjg1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAiwbSkxqTOwNzCs6Tyusa96bT8sr2kuaTrIgorCisjOiBpZl9jc2NvcGUuYzo4NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIsDcwrOk8sm9vKikuaTrIgorCisjOiBpZl9jc2NvcGUuYzo5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkU1NjA6ILvIzdHK/cuhOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICKks6TOY3Njb3BlpbOl3qXzpcmkz8qss+SlpqWjpfOlyaWmpMekz6W1pd2hvKXIpLWk7KTepLuk8y5cbiIKKworIzogaWZfY3Njb3BlLmM6MTc1Cittc2dpZCAiRTU2MjogVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIkU1NjI6ILvIzdHLoTogY3N0YWcgPGlkZW50PiIKKworIzogaWZfY3Njb3BlLmM6MjMxCittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiClv6WwpKyk36TEpKuk6qTepLuk8yIKKworIzogaWZfY3Njb3BlLmM6NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAiRTU2Mzogc3RhdCglcykgpail6aG8OiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDE5Cittc2dpZCAiRTU2Mzogc3RhdCBlcnJvciIKK21zZ3N0ciAiRTU2Mzogc3RhdCClqKXpobwiCisKKyM6IGlmX2NzY29wZS5jOjUxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY0OiAlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIkU1NjQ6ICVzIKTPpcelo6Xspa+lyKXqtdqk082tuPqkymNzY29wZaTOpcehvKW/pdmhvKW5pMekz6SipOqk3qS7pPMiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgImNzY29wZaXHobylv6XZobyluSAlcyCk8sTJssMiCisKKyM6IGlmX2NzY29wZS5jOjU4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogY3Njb3BlpM7A3MKzICVsZCCk8sbJuf6k38PmpM6lqKXpobykx6S5IgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogzKTDzqTOY3Njb3BluKG697e/pMekuSIKKworIzogaWZfY3Njb3BlLmM6NzM2Cittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IGNzY29wZaXRpaSl16Tyuu7ArqTHpK2k3qS7pPOkx6S3pL8iCisKKyM6IGlmX2NzY29wZS5jOjc1MworbXNnaWQgIkU2MjI6IENvdWxkIG5vdCBmb3JrIGZvciBjc2NvcGUiCittc2dzdHIgIkU2MjI6IGNzY29wZaTOta/GsL3gyPcoZm9yaymky7y6x9Skt6TepLekvyIKKworIzogaWZfY3Njb3BlLmM6ODQ3IGlmX2NzY29wZS5jOjg5NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbiCkzrzCudSky7y6x9Skt6TepLekvyIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiBjc2NvcGWl16XtpbuluaTyta/GsKTHpK2k3qS7pPOkx6S3pL8iCisKKyM6IGlmX2NzY29wZS5jOjkxMQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHRvX2ZwIKTOIGZkb3BlbiCky7y6x9Skt6TepLekvyIKKworIzogaWZfY3Njb3BlLmM6OTEzCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZnJfZnAgpM4gZmRvcGVuIKTLvLrH1KS3pN6kt6S/IgorCisjOiBpZl9jc2NvcGUuYzo5NTEKK21zZ2lkICJFNTY3OiBubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIkU1Njc6IGNzY29wZcDcwrOky7y6x9Skt6TepLekvyIKKworIzogaWZfY3Njb3BlLmM6MTAyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGNzY29wZaWvpail6qG8ICVzIG9mICVzIKTLs7rF9qSspKKk6qTepLuk86THpLekvyIKKworIzogaWZfY3Njb3BlLmM6MTA4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY5OiBpbnZhbGlkIGNzY29wZXF1aWNrZml4IGZsYWcgJWMgZm9yICVjIgorbXNnc3RyICJFNDY5OiDMtbj6pMogY3Njb3BlcXVpY2tmaXggpdWl6aWwICVjIKTOICVjIKTHpLkiCisKKyM6IGlmX2NzY29wZS5jOjExNTIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZaWzpd6l86XJOlxuIgorCisjOiBpZl9jc2NvcGUuYzoxMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIgorbXNnc3RyICIlLTVzOiAlLTMwcyAou8jN0cuhOiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogY3Njb3BlpcehvKW/pdmhvKW5OiAlcyCk8rOrpK+ks6TIpKykx6StpN6ku6TzIgorCisjOiBpZl9jc2NvcGUuYzoxMjcxCittc2dpZCAiRTYyNjogY2Fubm90IGdldCBjc2NvcGUgZGF0YWJhc2UgaW5mb3JtYXRpb24iCittc2dzdHIgIkU2MjY6IGNzY29wZaXHobylv6XZobyluaTOvvDK86TyvOjGwKTHpK2k3qS7pPMiCisKKyM6IGlmX2NzY29wZS5jOjEyOTYKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODogvcXKo6S5pOtjc2NvcGWlx6G8pb+l2aG8pbmkz8TJssOktaTspN6ku6TzpMekt6S/IgorCisjOiBpZl9jc2NvcGUuYzoxMzA3Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IGNzY29wZcDcwrOkzrrHwue/9KTLw6Okt6TepLekvyIKKworIzogaWZfY3Njb3BlLmM6MTQyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IGNzY29wZcDcwrMgJXMgpKyk36TEpKuk6qTepLuk86THpLekvyIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgImNzY29wZcDcwrMgJXMgpKzKxKS4pOmk7KTepLekvyIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGNzX21hbmFnZV9tYXRjaGVzIKTHw9fMv8WqpMqlqKXpobykx6S5IgorCisjOiBpZl9jc2NvcGUuYzoxODQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzIgorbXNnc3RyICJDc2NvcGUgpb+lsDogJXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NzAKK21zZ2lkICIiCisiXG4iCisiICAgIyAgIGxpbmUiCittc2dzdHIgIiIKKyJcbiIKKyIgICAjICAgudTI1rnmIgorCisjOiBpZl9jc2NvcGUuYzoxODcyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICKl1aWhpaSl68y+IC8gyrjMriAvILnUXG4iCisKKyM6IGlmX2NzY29wZS5jOjE5OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOTogQ3Njb3BlIGVycm9yOiAlcyIKK21zZ3N0ciAiRTYwOTogY3Njb3Blpail6aG8OiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICLBtKTGpM5jc2NvcGWlx6G8pb+l2aG8pbmk8qXqpbulw6XIpLek3qS5IgorCisjOiBpZl9jc2NvcGUuYzoyMjQ0Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgImNzY29wZcDcwrOkrKSipOqk3qS7pPNcbiIKKworIzogaWZfY3Njb3BlLmM6MjI0OAorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgIKXHobylv6XZobylucy+ICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgpdGluVxuIgorCisjOiBpZl9weXRob24uYzo0MzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IKSzpM6ls6XepfOlyaTPzLW4+qTHpLkspLSk4aTzpMqktaSkOiAiCisiUHl0aG9upemlpKXWpeml6qType2hvKXJpMekraTepLuk86THpLekvy4iCisKKyMgQWRkZWQgYXQgMDctRmViLTIwMDQuCisjOiBpZl9weXRob24uYzo1MDAKK21zZ2lkICJFNjU5OiBDYW5ub3QgaW52b2tlIFB5dGhvbiByZWN1cnNpdmVseSIKK21zZ3N0ciAiRTY1OTogUHl0aG9uIKTyusa1osWqpMu8wrnUpLmk66SzpMikz6THpK2k3qS7pPMiCisKKyM6IGlmX3B5dGhvbi5jOjcwMQorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAiT3V0cHV0T2JqZWN0wrDAraTyvsOku6TepLuk8yIKKworIzogaWZfcHl0aG9uLmM6NzA4Cittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIKTPIGludGVnZXIgpMekyqSxpOyk0KTKpOqk3qS7pPMiCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICLMtbj6pMrCsMCtpMekuSIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSCky6TPyri7+s7zpM6l6qW5pcikrMmszdekx6S5IgorCisjOiBpZl9weXRob24uYzo4OTUKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBJL0+lqqXWpbilp6Wvpcikzr3ptPyyvcPmpMulqKXpobykx6S5IgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIsy1uPqkyrywpMekuSIKKworIzogaWZfcHl0aG9uLmM6MTA5NCBpZl90Y2wuYzoxNDA3Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICK8sKTPpbOl86XRpaSl67v+pMvMtbj6pMuktaTspMakpKTepLkiCisKKyM6IGlmX3B5dGhvbi5jOjExMDcKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICK+w6S1pOykv6XQpcOl1aWhpKy7sr7IpLWk7KTepLekvyIKKworIzogaWZfcHl0aG9uLmM6MTEyMiBpZl9weXRob24uYzoxMTYzIGlmX3B5dGhvbi5jOjEyMjcgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiyM+wz7OwpM651MjWueakx6S5IgorCisjOiBpZl9weXRob24uYzoxMzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPKXQpcOl1aWhpaql1qW4paelr6XIICi+w7XuutGk3ykgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIsy1uPqkyqXeobylr8y+pMekuSIKKworIzogaWZfcHl0aG9uLmM6MTczMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICKkvaTOpOikpqTKpdClw6XVpaGkz6SipOqk3qS7pPMiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICK+w6S1pOykv6WmpaOl86XJpaakrLuyvsiktaTspN6kt6S/IgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICLGybn+wOzN0cKwwK0iCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIqWrobylvaXrpKyl0KXDpdWloaTOs7Cky6SipOqk3qS5IgorCisjOiBpZl9weXRob24uYzoxOTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjylpqWjpfOlyaWmpaql1qW4paelr6XIICi+w7XuutEpICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTk2OAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAodW5rbm93bikgYXQgJS44bFg+IgorbXNnc3RyICI8paalo6XzpcmlpqWqpdaluKWnpa+lyCAozKTDzikgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI8paalo6XzpcmlpiAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjIwNDYKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAipL2kzqTopKakyqWmpaOl86XJpaakz6SipOqk3qS7pPMiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDcgaWZfcHl0aG9uLmM6MjM0MSBpZl9weXRob24uYzoyMzk2IGlmX3B5dGhvbi5jOjI0NjQKKyM6IGlmX3B5dGhvbi5jOjI1ODYgaWZfcHl0aG9uLmM6MjYzOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICKloqXzpcmlpb7wyvOkrMrdwrikx6StpN6ku6TzIgorCisjOiBpZl9weXRob24uYzoyMzA5IGlmX3B5dGhvbi5jOjI0MDMgaWZfcHl0aG9uLmM6MjQ3NQorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAiudSk8r7DpLuk3qS7pPMiCisKKyM6IGlmX3B5dGhvbi5jOjIzNDYgaWZfcHl0aG9uLmM6MjQ5MSBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIrnUpPLD1rS5pMekraTepLuk8yIKKworIzogaWZfcHl0aG9uLmM6MjUwOSBpZl9weXRob24uYzoyNTg4IGlmX3B5dGhvbi5jOjI2NDYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIrnUpPLB3sb+pMekraTepLuk8yIKKworIzogaWZfcHl0aG9uLmM6Mjc1MAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAiyri7+s7zpMukz7L+udTKuLv6pPK03qThpOmk7KTepLuk8yIKKworIzogaWZfcnVieS5jOjQyMgorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2NjogpLOkzqWzpd6l86XJpM/Mtbj6pMekuSyktKThpPOkyqS1pKQ6ICIKKyJSdWJ5pemlpKXWpeml6qType2hvKXJpMekraTepLuk86THpLekvy4iCisKKyM6IGlmX3J1YnkuYzo0ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogzKTDzqTObG9uZ2ptcL71wtY6ICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIrzCwfWkyMTqtcGk8sDapOrC2KSopOsiCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIryhpM6lr6XppbmkzrTwxOyk8sm9vKgiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICKlqqG8pdChvKXppaSlyaS1pOykv6XhpfOl0LTYv/Sk8sm9vKgiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIqXVpaGlpKXrpKuk6bLzyfykuaTrIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICKl16Xtpbilp6Wvpcikq6TpsvPJ/KS5pOsiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiwbSkxqTOpdel7aW4paelr6XIpKuk6bLzyfykuaTrIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIrLzyfwiCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAivKGkzqW9obyluaTyyb28qKS5pOsiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAipN+kxKSxpL+lt6Xzpdyl6yIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAipa+l6aW5pPK7sr7IIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIrOswdikx6WvpemluaTyyb28qCIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIrjCxOqktaTspL+zrMHYpMelr6Xppbmk8sm9vKgiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiCkzruyvsjA6CIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgIlhyZWYgpKy7sr7IpLWk7KTrIgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiCkrLyhpM6k4qTOpPKk4qTDpMakpKTepLkiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgpKy7yM3RpLWk7KTrIgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICK8oaTOyri+z6Tyyb28qCIKKworIzogaWZfc25pZmYuYzo4NQorbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorbXNnc3RyICK8oaTOyri+z6TywLjAriIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiIgorIlNOaUZGK6TLwNzCs6THpK2k3qS7pPMuILTEtq2k8qXBpaelw6WvpLekxqSvpMCktaSkKHNuaWZmZW1hY3MgpKwgJFBBVEggIgorIqTLpMqksaTspNCkyqTqpN6ku6TzKS5cbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IMbJuf7D5qTLpail6aG8pKzIr8C4pLek3qS3pL8uIMDaw8ekt6TepLekvyIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiuL2631NOaUZGKyCkzr71wtakz6HWIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIsykIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAiwNzCs6HXpMekuSIKKworIzogaWZfc25pZmYuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3NTogVW5rbm93biBTTmlGRisgcmVxdWVzdDogJXMiCittc2dzdHIgIkUyNzU6IMykw86kziBTTmlGRisgpeqlr6WopbmlyKTHpLk6ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiBTTmlGRisgpNikzsDcwrPD5qTOpail6aG8pMekuSIKKworIzogaWZfc25pZmYuYzoxMDA5Cittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IFNOaUZGKyCky8DcwrOktaTspMakpKTepLuk8yIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogU05pRkYrIKXQpcOl1aWhpKykoqTqpN6ku6TzIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiC98bn+pN/D5qTLpail6aG8pKzIr8C4pLekv6TOpMfA2sPHpLek3qS3pL8iCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAizLW4+qTKpdClw6XVpaHI1rnmpMekuSIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAipN6kwLzCwfWktaTspMakpKTepLuk8yIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIsykw86kzqWqpdelt6XnpfOkx6S5IgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAiudSk8sDfxOqkx6StpN6ku6TzIgorCisjOiBpZl90Y2wuYzo4NDUKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIqXeobylr6TPwN/E6qS1pOykxqSkpN6ku6TzIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICK51CAlZCDO8yAlZCIKKworIzogaWZfdGNsLmM6ODgxCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAiudSkzsHexv4vxMmyw6TypMekraTepLuk8yIKKworIzogaWZfdGNsLmM6MTI2OAorbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICLMpMPOpM6l1aXppbA6IgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIsykw86kziB2aW1PcHRpb24gpMekuSIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAipa2hvKXcobylybPkuf6k3yIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAidmltIKWopemhvCIKKworIzogaWZfdGNsLmM6MTQ3MQorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorIqXQpcOl1aWhL6WmpaOl86XJpaa67sCupbOl3qXzpcmk8rruwK6kx6StpN6ku6TzOiAiCisipaql1qW4paelr6XIpKy+w7XupLWk7KTGpKSk3qS3pL8iCisKKyM6IGlmX3RjbC5jOjE1NDUKK21zZ2lkICIiCisiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgaXMgYWxyZWFkeSBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisipbOhvKXrpdClw6WvpbOl3qXzpcmk8sXQz7+kx6StpN6ku6TzOiCl0KXDpdWloS+lpqWjpfOlyaWmpKy0+6TLvsO17qS1pOyk3qS3pL8iCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYyCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvICIKKyJ2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wgw9fMv8Wqpail6aG8OiByZWZsaXN0ILH4wPchPyB2aW0tZGV2QHZpbS5vcmcgpMvK87nwpLekxqSvpMCktaSkIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorIqWzobyl66XQpcOlr6Wzpd6l86XJpPLF0M+/pMekraTepLuk8zogIgorIqXQpcOl1aWhL6WmpaOl86XJpaakzruyvsikrKTfpMSkq6TqpN6ku6TzIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiIgorIkU1NzE6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkU1NzE6IKSzpM6ls6XepfOlyaTPzLW4+qTHpLkspLSk4aTzpMqktaSkOiAiCisiVGNspemlpKXWpeml6qType2hvKXJpMekraTepLuk86THpLekvy4iCisKKyM6IGlmX3RjbC5jOjE4ODYKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wgpail6aG8OiC9qs67pbOhvKXJpKzAsL/0w82kx6TPpKKk6qTepLuk8yE/IHZpbS1kZXZAdmltLm9yZyAiCisipMvK87nwpLekxqSvpMCktaSkIgorCisjOiBpZl90Y2wuYzoyMDA3Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICK51KTyvOjGwKTHpK2k3qS7pPMiCisKKyM6IGlmX3hjbWRzcnYuYzoyMjUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICLMv87hpbWhvKXQpM7MvsGwpPLF0M+/pMekraTepLuk8yIKKworIzogaWZfeGNtZHNydi5jOjQ3MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IMzcxaqkzqXXpe2lsKXppeCk2KTOpbOl3qXzpcnB97+upMu8usfUpLek3qS3pL8iCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IMy1uPqkyqW1obyl0ElEpKy7yKTvpOyk3qS3pL86ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTExMAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNILzCws6kzsXQz7+l16XtpdGlxqWjpKzJ1MC1pMekuS4gvsO17qS3pN6kt6S/ISIKKworIzogbWFpbi5jOjYwCittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIsykw86kzqWqpdelt6XnpfOkx6S5IgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiytS9uLD6v/SkrMK/pLmkrqTepLkiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIrD6v/SkrKSipOqk3qS7pPMiCisKKyM6IG1haW4uYzo2NgorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICKlqqXXpbel56XzpM645aTLpbSl36SspKKk6qTepLkiCisKKyM6IG1haW4uYzo2OAorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiwgXCItYyBjb21tYW5kXCIgb3IgXCItLWNtZCBjb21tYW5kXCIgYXJndW1lbnRzIgorbXNnc3RyICJcIitjb21tYW5kXCIsIFwiLWMgY29tbWFuZFwiLCBcIi0tY21kIGNvbW1hbmRcIiCkzrD6v/SkrMK/pLmkrqTepLkiCisKKyM6IG1haW4uYzo3MAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorbXNnc3RyICLMtbj6pMqw+r/0pMekuTogIgorCisjOiBtYWluLmM6NDY2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICKks6TOVmltpMukz2RpZma1oce9pKykoqTqpN6ku6TzKKWzpfOl0aWkpeu7/sDfxOopLiIKKworIzogbWFpbi5jOjkzMgorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIqW5pa+l6qXXpcil1aWhpaSl66Tyusak07OrpKSkxqTfpN6kuTogXCIiCisKKyMgbXNnaWQgIlwiXG4iCisjIG1zZ3N0ciAiXCJcbiIKKyM6IG1haW4uYzo5NDEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIsbJuf7N0aTIpLekxrOrpLGk3qS7pPMiCisKKyM6IG1haW4uYzo5ODUKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIqW5pa+l6qXXpci90M7PzdGk8rOrpLGk3qS7pPMiCisKKyM6IG1haW4uYzoxMTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiJWQguMSkzqXVpaGlpKXrpKzK1L24pPK5taSopMakpKTepLlcbiIKKworIzogbWFpbi5jOjEyMzMKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06ILfZufA6IMO8y/ak2KTOvdDOz6THpM+koqTqpN6ku6TzXG4iCisKKyM6IG1haW4uYzoxMjM1Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogt9m58Dogw7zL9qSrpOmkzsb+zs+kx6TPpKKk6qTepLuk81xuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJ2aW1yY8GwpM6ls6XepfOlyaXppaSl8yIKKworIzogbWFpbi5jOjEzMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6IFwiJXNcIqSrpOnGybn+pOCks6TIpKykx6StpN6ku6TzIgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisipOik6r7cutmkyr7wyvOkzzogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbpdWloaWkpesuLl0gICAgpKKk66XVpaGlpKXrpPLK1L24pLmk6yIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICDJuL3gxv7Oz6SrpOmlxqWtpbmlyKTyxsm5/qTgIgorCisjOiBtYWluLmM6MjQ0NgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IKW/pbAgICAgICAgICClv6WwpKzE6rXBpLWk7KS/pMiks6TtpKuk6crUvbikuaTrIgorCisjOiBtYWluLmM6MjQ0OAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2Vycm9yZmlsZV0gILrHvemkzqWopemhvKTHytS9uKS5pOsiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIrvIzdHLoToiCisKKyM6IG1haW4uYzoyNDYwCittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgIiB2aW0gW7D6v/RdIgorCisjOiBtYWluLmM6MjQ2NAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICCk4qS3pK+kzzoiCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIrD6v/Q6XG4iCisKKyM6IG1haW4uYzoyNDY4Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHSks6TOpKKkyKTLpM+l1aWhpaSl68y+pMCksSIKKworIzogbWFpbi5jOjI0NzAKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdKXvpaSl66XJpauhvKXJpPLFuLOrpLekyqSkIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdKSzpM5ndmltpPJPTEWkyKS3pMbF0M+/pLmk6yIKKworIzogbWFpbi5jOjI0NzQKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0Z3ZpbaTOT0xFxdDPv6TysvK9/KS5pOsiCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRHVUmkx7WvxrCkuaTrIChcImd2aW1cIiCkyMaxpLgpIgorCisjOiBtYWluLmM6MjQ3OAorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mIG9yICAtLW5vZm9ya1x0pdWlqaWipbCl6aWmpfOlyTogR1VJpPK7z6ThpOukyKStpMtmb3JrpLekyqSkIgorCisjOiBtYWluLmM6MjQ4MAorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZppeKhvKXJIChcInZpXCIgpMjGsaS4KSIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeKXiobylySAoXCJleFwiIKTIxrGkuCkiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdKW1paSl7KXzpcgopdClw6XBKaXiobylySAoXCJleFwiIMDszdEpIgorCisjOiBtYWluLmM6MjQ4NAorbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHS6ucqspeKhvKXJIChcInZpZGlmZlwiIKTIxrGkuCkiCisKKyM6IG1haW4uYzoyNDg2Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHSlpKG8pbihvKXiobylySAoXCJldmltXCIgpMjGsaS4LCCl4qG8pcnMtSkiCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHTGybn+wOzN0aXiobylySAoXCJ2aWV3XCIgpMjGsaS4KSIKKworIzogbWFpbi5jOjI0ODgKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0wKm4wqXiobylySAoXCJydmltXCIgpMjGsaS4KSIKKworIzogbWFpbi5jOjI0ODkKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdMrRubkgKKXVpaGlpKXryt3CuLv+KSCk8qTHpK2kyqSkpOikpqTLpLmk6yIKKworIzogbWFpbi5jOjI0OTAKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHSlxqWtpbmlyKTOytS9uKTyudSkyqSopMqkpKTopKaky6S5pOsiCisKKyM6IG1haW4uYzoyNDkxCittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHSl0KWkpcql6qXiobylySIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwpeKhvKXJIgorCisjOiBtYWluLmM6MjQ5NQorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0Vmm437S5peKhvKXJOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDk2Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0VmnI87jftLml4qG8pck6ICdub2NvbXBhdGlibGUiCisKKyM6IG1haW4uYzoyNDk3Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0VmVyYm9zZSCl7KXZpesiCisKKyM6IG1haW4uYzoyNDk4Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHSlx6XQpcOlsKXiobylySIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdKW5pe+lw6XXpdWloaWkpeuk8rvIzdGku6S6peGl4qXqpMCksSIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHSluaXvpcOl16XVpaGlpKXrpPLO87XzpLe9qs67IgorCisjOiBtYWluLmM6MjUwMQorbXNnaWQgIi1yICh3aXRoIGZpbGUgbmFtZSlcdFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uIgorbXNnc3RyICItciAopdWloaWkpevMvilcdKWvpemlw6W3peWkt6S/pbulw6W3peel86Tyyfy1oiIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0LXKkyMaxpLgiCisKKyM6IG1haW4uYzoyNTA0Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdKWmpaOl86XJpaak8rOrpK+kzqTLIG5ld2NsaSCk8rvIzdGkt6TKpKQiCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHRJL0+kyyA8ZGV2aWNlPiCk8rvIzdGkuaTrIgorCisjOiBtYWluLmM6MjUwOAorbXNnaWQgIi1BXHRcdFx0c3RhcnQgaW4gQXJhYmljIG1vZGUiCittc2dzdHIgIi1BXHRcdFx0paKl6aXTpaK47KXiobylyaTHta/GsKS5pOsiCisKKyM6IG1haW4uYzoyNTExCittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHSl2KXWpemlpLjspeKhvKXJpMe1r8awpLmk6yIKKworIzogbWFpbi5jOjI1MTQKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0pdql66W3paK47KXiobylyaTHta/GsKS5pOsiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0w7zL9qTyIDx0ZXJtaW5hbD4gpMvA38TqpLmk6yIKKworIzogbWFpbi5jOjI1MTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHQudmltcmOkzsLlpO+k6qTLIDx2aW1yYz4gpPK7yKSmIgorCisjOiBtYWluLmM6MjUxOQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHQuZ3ZpbXJjpM7C5aTvpOqkyyA8Z3ZpbXJjPiCk8rvIpKYiCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdKXXpemlsKWkpfOluaWvpeql16XIpPKl7aG8pcmkt6TKpKQiCisKKyM6IG1haW4uYzoyNTIyCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0TiC4xKWmpaOl86XJpaak8rOrpK8ovsrOrMPNOiCl1aWhpaSl66TLpMSkrTG4xCkiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0LW+kyMaxpLikwKSsv+LEvsqss+QiCisKKyM6IG1haW4uYzoyNTI0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0pdWloaWkpeukzrrHuOWkq6TppM+kuKThpOsiCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHQ8bG51bT4gudSkq6TppM+kuKThpOsiCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPGNvbW1hbmQ+XHR2aW1yY6Type2hvKXJpLmk68GwpMsgPGNvbW1hbmQ+IKTyvMK51KS5pOsiCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxjb21tYW5kPlx0XHS6x73ppM6l1aWhpaSl66Type2hvKXJuOUgPGNvbW1hbmQ+IKTyvMK51KS5pOsiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8c2Vzc2lvbj5cdFx0use96aTOpdWloaWkpeuk8qXtobylybjlpdWloaWkpesgPHNlc3Npb24+IKTyvOi5/qTgIgorCisjOiBtYWluLmM6MjUzMQorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDxzY3JpcHRpbj5cdKXVpaGlpKXrIDxzY3JpcHRpbj4gpKuk6aXOobyl3qXrpbOl3qXzpcmk8sbJuf6k4CIKKworIzogbWFpbi5jOjI1MzIKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8c2NyaXB0b3V0Plx0xv7Oz6S3pL/BtKWzpd6l86XJpPKl1aWhpaSl6yA8c2NyaXB0b3V0PiCky8TJssOkuaTrIgorCisjOiBtYWluLmM6MjUzMworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNjcmlwdG91dD5cdMb+zs+kt6S/wbSls6XepfOlyaTypdWloaWkpesgPHNjcmlwdG91dD4gpMvK3cK4pLmk6yIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdLDFueayvaS1pOykv6XVpaGlpKXrpPLK1L24pLmk6yIKKworIzogbWFpbi5jOjI1MzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHR2aW2k8rvYxOqkt6S/IFggpbWhvKXQpMvA3MKzpLmk6yIKKworIzogbWFpbi5jOjI1NDEKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdFiltaG8pdCky8DcwrOkt6TKpKQiCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVzPlx0ssTHvaTKpOmk0FZpbaW1obyl0KTHIDxmaWxlcz4gpPLK1L24pLmk6yIKKworIzogbWFpbi5jOjI1NDUKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxuZXQgPGZpbGVzPiAgxrG+5SwgpbWhvKXQpKzMtaSvpMak4rfZufDKuKTyvdDOz6S3pMqkpCIKKworIzogbWFpbi5jOjI1NDYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+XHQtLXJlbW90ZbjlIKXVpaGlpKXrpM7K1L24pKy9qqTvpOukzqTywtSkxCIKKworIzogbWFpbi5jOjI1NDcKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICDGsb7lLCCltaG8pdCkrMy1pK+kxqTit9m58Mq4pPK90M7PpLekyqSkIgorCisjOiBtYWluLmM6MjU0OAorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRWaW2ltaG8pdCkyyA8a2V5cz4gpPLB97+upLekxr2qzrukuaTrIgorCisjOiBtYWluLmM6MjU0OQorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHSltaG8pdCkxyA8ZXhwcj4gpPK8wrnUpLekxrfrssyk8sm9vKikuaTrIgorCisjOiBtYWluLmM6MjU1MAorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0VmltpbWhvKXQzL6kzrDszfek8sm9vKikt6TGvarOu6S5pOsiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlbmFtZSA8bmFtZT5cdFx0VmltpbWhvKXQIDxuYW1lPiCky8H3v64vzL7BsMDfxOqkuaTrIgorCisjOiBtYWluLmM6MjU1NAorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHQudmltaW5mb6TOwuWk76TqpMsgPHZpbWluZm8+IKTyu8ikpiIKKworIzogbWFpbi5jOjI1NTYKK21zZ2lkICItaCAgb3IgIC0taGVscFx0UHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWggb3IgIC0taGVscFx0pdil66XXKKSzpM6l4aXDpbuhvKW4KaTyyb28qKS3varOu6S5pOsiCisKKyM6IG1haW4uYzoyNTU3Cittc2dpZCAiLS12ZXJzaW9uXHRcdFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHSl0KG8pbil56XzvvDK86Tyyb28qKS3varOu6S5pOsiCisKKyM6IG1haW4uYzoyNTYxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbaTLpOikw6TGsvK84aS1pOyk67D6v/QoTW90aWal0KG8pbil56XzKTpcbiIKKworIzogbWFpbi5jOjI1NjUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbaTLpOikw6TGsvK84aS1pOyk67D6v/QobmVYdGF3pdChvKW4peel8yk6XG4iCisKKyM6IG1haW4uYzoyNTY3Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW2ky6TopMOkxrLyvOGktaTspOuw+r/0KEF0aGVuYaXQobyluKXnpfMpOlxuIgorCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0PGRpc3BsYXk+IKTHdmltpPK8wrnUpLmk6yIKKworIzogbWFpbi5jOjI1NzIKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0use+rrK9pLekv771wtakx3ZpbaTyta/GsKS5pOsiCisKKyM6IG1haW4uYzoyNTc0Cittc2dpZCAiLW5hbWUgPG5hbWU+XHRcdFVzZSByZXNvdXJjZSBhcyBpZiB2aW0gd2FzIDxuYW1lPiIKK21zZ3N0ciAiLW5hbWUgPG5hbWU+XHRcdHZpbaTOzL6krCA8bmFtZT4gpMekoqTrpMikt6TGpeqlvaG8pbmk8rvIpKYiCisKKyM6IG1haW4uYzoyNTc1Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAovMLB9aS1pOykxqSkpMqkpClcbiIKKworIzogbWFpbi5jOjI1NzcKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdMfYt8q/p6TLIDxjb2xvcj4gpPK7yKSmKMaxtcE6IC1iZykiCisKKyM6IG1haW4uYzoyNTc4Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8Y29sb3I+XHTBsLfKv6ekyyA8Y29sb3I+IKTyu8ikpijGsbXBOiAtZmcpIgorCisjOiBtYWluLmM6MjU3OSBtYWluLmM6MjU5OQorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnQ+XHRcdKXGpa2luaXIyb28qKTLIDxmb250PiCk8rvIpKYoxrG1wTogLWZuKSIKKworIzogbWFpbi5jOjI1ODAKK21zZ2lkICItYm9sZGZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBib2xkIHRleHQiCittc2dzdHIgIi1ib2xkZm9udCA8Zm9udD5cdMLAu/qkyyA8Zm9udD4gpPK7yKSmIgorCisjOiBtYWluLmM6MjU4MQorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxmb3I+XHS80MLOu/qkyyA8Zm9udD4gpPK7yKSmIgorCisjOiBtYWluLmM6MjU4MiBtYWluLmM6MjYwMAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tPlx0vem0/Mfbw9akyyA8Z2VvbT4gpPK7yKSmKMaxtcE6IC1nZW9tKSIKKworIzogbWFpbi5jOjI1ODMKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHS2rbOmpM7J/aTyIDx3aWR0aD4gpMukuaTrKMaxtcE6IC1idykiCisKKyM6IG1haW4uYzoyNTg0Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICIiCisiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIKW5pa+l7aG8peul0KG8pM7J/aTyIDx3aWR0aD4gpMukuaTrKMaxtcE6IC1zdykiCisKKyM6IG1haW4uYzoyNTg2Cittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdKXhpcul5aG8pdChvKTOueKktaTyIDxoZWlnaHQ+IKTLpLmk6yjGsbXBOiAtbWgpIgorCisjOiBtYWluLmM6MjU4OCBtYWluLmM6MjYwMQorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHTIv8W+scfB/KTyu8jN0aS5pOsoxrG1wTogLXJ2KSIKKworIzogbWFpbi5jOjI1ODkKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0yL/FvrHHwfyk8rvIzdGkt6TKpKQoxrG1wTogK3J2KSIKKworIzogbWFpbi5jOjI1OTAKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZXNvdXJjZT5cdMbDxOqkzqXqpb2hvKW5pPK7yM3RpLmk6yIKKworIzogbWFpbi5jOjI1OTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW2ky6TopMOkxrLyvOGktaTspOuw+r/0KFJJU0MgT1Ol0KG8pbil56XzKTpcbiIKKworIzogbWFpbi5jOjI1OTQKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bnVtYmVyPlx0vem0/KTOpaalo6XzpcmlpqTOpbOl6aXgw7GwzKTOyf0iCisKKyM6IG1haW4uYzoyNTk1Cittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1iZXI+XHS96bT8pM6lpqWjpfOlyaWmpM651MOxsMykzrnipLUiCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltpMuk6KTDpMay8rzhpLWk7KTrsPq/9ChHVEsrpdChvKW4peel8yk6XG4iCisKKyM6IG1haW4uYzoyNjAyCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHQ8ZGlzcGxheT4gpMd2aW2k8rzCudSkuaTrKMaxtcE6IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNjA0Cittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICItLXJvbGUgPHJvbGU+XHSl4aWkpfOlpqWjpfOlyaWmpPK8scrMpLmk67DssNWkyszys+Qocm9sZSmk8sDfxOqkuaTrIgorCisjOiBtYWluLmM6MjYwNgorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdLDbpMqk60dUSyB3aWRnZXSkx1ZpbaTys6ukryIKKworIzogbWFpbi5jOjI2MDkKK21zZ2lkICItUCA8cGFyZW50IHRpdGxlPlx0T3BlbiBWaW0gaW5zaWRlIHBhcmVudCBhcHBsaWNhdGlvbiIKK21zZ3N0ciAiLVAgPL/GpM6lv6Wkpcil6z5cdFZpbaTyv8aloqXXpeqlsaG8pbel56XzpM7D5qTHta/GsKS5pOsiCisKKyMgbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKKyMgbXNnc3RyICItLWhlbHBcdFx0R05PTUWkzrD6v/Sk8rirpLuk6yIKKyM6IG1haW4uYzoyODQ3Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAipcelo6W5pdel7KWkpKy4q6TEpKuk6qTepLuk8yIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI4NjIKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6IMH3v66ky7y6x9Skt6TepLekvy5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyODY4Cittc2dpZCAiOiBTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICI6IMH3v66ky7y6x9Skt6TepLekvy4gpe2hvKWrpeukx6TOvMK51KTyu+6k36TGpKSk3qS5XG4iCisKKyM6IG1haW4uYzoyOTA2IG1haW4uYzoyOTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQguMQgKCVkILjEw+YpIKTOpdWloaWkpeuk8srUvbikt6TepLekvyIKKworIzogbWFpbi5jOjI5NDkKK21zZ2lkICJObyBkaXNwbGF5OiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICKlx6Wjpbml16XspaSkrKSipOqk3qS7pPM6ILywpM7B97+upMu8usfUpLek3qS3pL8uXG4iCisKKyM6IG1haW4uYzoyOTYxCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6ILywpM7B97+upMu8usfUpLek3qS3pL8uXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIqXeobylr6SswN/E6qS1pOykxqSkpN6ku6TzIgorCisjOiBtYXJrLmM6NzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4MzogXCIlc1wiIKTLs7rF9qS5pOul3qG8pa+krKSipOqk3qS7pPMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcyMgorbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJtYXJrICAgudQgICDO8yCl1aWhpaSl6y+lxqWtpbmlyCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzYwCittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIganVtcCAgILnUICAgzvMgpdWloaWkpesvpcalraW5pcgiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJjaGFuZ2UgbGluZSAgY29sIHRleHQiCittc2dzdHIgIiIKKyJcbiIKKyLK0bm5ICAgudQgICAgzvMgIKXGpa2luaXIIgorCisjOiBtYXJrLmM6MTI4MQorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIKXVpaGlpKXrpd6hvKWvOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjEzMTYKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgpbil46Xzpdel6qW5pcggKL+3pLekpKTipM6krMDoKTpcbiIKKworIzogbWFyay5jOjE0MTIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIKXVpaGlpKXrxuKl3qG8pa+kzs36zvIgKL+3pLekpKTipM6kq6TpuMWkpKTipM4pOlxuIgorCisjOiBtYXJrLmM6MTUwMQorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICInPicgpKyk36TEpKuk6qTepLuk8yIKKworIzogbWJ5dGUuYzo0NjcKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0MzogzLW4+qTKpbOhvKXJpdqhvKW4pMekuSIKKworIzogbWJ5dGUuYzo0NDMxCittc2dpZCAiRTI4NDogQ2Fubm90IHNldCBJQyB2YWx1ZXMiCittc2dzdHIgIkUyODQ6IElDpM7DzaTywN/E6qTHpK2k3qS7pPMiCisKKyM6IG1ieXRlLmM6NDU4MworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogpaSl86XXpcOlyKWzpfOlxqWtpbmlyKTOuu7ArqTLvLrH1KS3pN6kt6S/IgorCisjOiBtYnl0ZS5jOjQ3NDEKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IKWkpfOl16XDpcil4aW9pcOlyaTOpaqhvKXXpfOky7y6x9Skt6TepLekvyIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiC32bnwOiBJTaTOx8uy9aWzobyl66XQpcOlr6TywN/E6qTHpK2k3qS7pPOkx6S3pL8iCisKKyM6IG1ieXRlLmM6NDc1OAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiClpKXzpdelw6XIpeGlvaXDpcmkz6TJpPOkyqW5pb+lpKXrpOKltaXdobylyKS3pN6ku6TzIgorCisjOiBtYnl0ZS5jOjQ4MTUKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogpaSl86XXpcOlyKXhpb2lw6XJpM8gbXkgcHJlZWRpdCB0eXBlIKTypbWl3aG8pcikt6TepLuk8yIKKworIzogbWJ5dGUuYzo0ODg5Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBvdmVyLXRoZS1zcG90IKW5pb+lpKXrpMukz2ZvbnRzZXSkrMmszdekx6S5IgorCisjOiBtYnl0ZS5jOjQ5MjUKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IEdUSyukrDEuMi4zpOik6qTiuMWkpKTOpMeluaXGobylv6W5pail6qWipKzMtbj6pMekuSIKKworIzogbWJ5dGUuYzo1MjMyCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogpaSl86XXpcOlyKXhpb2lw6XJpbWhvKXQIKSsxrC67qS3pMakpKTepLuk8yIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiCl1qXtpcOlr6Sspe2lw6WvpLWk7KTGpKSk3qS7pPMiCisKKyM6IG1lbWZpbGUuYzoxMDA1Cittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogpbml76XDpdel1aWhpaSl68bJuf67/qTLpbehvKWvpail6aG8pMekuSIKKworIzogbWVtZmlsZS5jOjEwMTAKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogpbml76XDpdel1aWhpaSl66TOxsm5/qTfpail6aG8pMekuSIKKworIzogbWVtZmlsZS5jOjEwNjIKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5Njogpbml76XDpdel1aWhpaSl673xuf6k37v+pMult6G8pa+lqKXpobykx6S5IgorCisjOiBtZW1maWxlLmM6MTA4MAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5Nzogpbml76XDpdel1aWhpaSl66TOvfG5/qTfpail6aG8pMekuSIKKworIzogbWVtZmlsZS5jOjEyNzcKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IKW5pe+lw6XXpdWloaWkpeukrLT7pMvCuLrfpLek3qS5IChzeW1saW5rpMuk6KTruba34j8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogpdal7aXDpa8gMCCk8rzoxsCkx6StpN6ku6TzPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IKXWpe2lw6WvIDEgpPK86MbApMekraTepLuk8z8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiCl1qXtpcOlryAyIKTyvOjGwKTHpK2k3qS7pPM/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiCkqqTDpMgsIKW5pe+lw6XXpdWloaWkpeukrLy6pO+k7KTepLekvyEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiCluaXvpcOl16XVpaGlpKXrpM7MvsGwpPLK0aSopOmk7KTepLuk8yIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogXCIlc1wiIKTOpbml76XDpdel1aWhpaSl66Tys6uksaTKpKSkzqTHpeqlq6XQpeqkz8nUssTHvaTHpLkiCisKKyM6IG1lbWxpbmUuYzo2MTcKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6IKXWpe2lw6WvIDAgpPK86MbApMekraTepLuk86THpLekvz8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6ICVzIKTLpM+luaXvpcOl16XVpaGlpKXrpKyk36TEpKuk6qTepLuk8yIKKworIzogbWVtbGluZS5jOjc2NworbXNnaWQgIkVudGVyIG51bWJlciBvZiBzd2FwIGZpbGUgdG8gdXNlICgwIHRvIHF1aXQpOiAiCittc2dzdHIgIrvIzdGkuaTrpbml76XDpdel1aWhpaSl66TOyNa55qTyxv7Oz6S3pMakr6TApLWkpCgwIKTHvarOuyk6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogJXMgpPKzq6SxpN6ku6TzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAipdal7aXDpa8gMCCk8sbJuf6k4aTepLuk8yAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisitrKk6aSvytG5uaSspLWk7KTGpKSkyqSkpKtWaW2krKW5pe+lw6XXpdWloaWkpeuk8rm5v7ekt6TGpKSk3qS7pPMuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgVmltpM6ks6TOpdChvKW4peel86THpM+7yM3RpMekraTepLuk8y5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIlZpbaTOpdChvKW4peel8zMuMKTyu8jN0aS3pMakr6TApLWkpC5cbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyCkz1ZpbaTOpbml76XDpdel1aWhpaSl66THpM+kyqSkpOikpqTHpLkiCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIKSzpM6ls6XzpdSl5aG8pb+kx6TPu8jN0aTHpK2k3qS7pPMuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIqSzpM6l1aWhpaSl66TPvKGkzr7sveqkx7rupOmk7KTepLekvyAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIqTipLekr6TPpdWloaWkpeukrMK7vf2kt6TGpKSk3qS5LiIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICKluaXvpcOl16XVpaGlpKXrIFwiJXNcIiCk8rvIzdHD5iIKKworIzogbWVtbGluZS5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiuLbL3KXVpaGlpKXrIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkyMgorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiC32bnwOiC4tsvcpdWloaWkpeukrMrRubmktaTspMakpKTepLkiCisKKyM6IG1lbWxpbmUuYzo5NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiAlcyCkq6Tppdal7aXDpa8gMSCk8sbJuf6k4aTepLuk8yIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/wr+kr6TOudSkrLy6pO+k7KTGpKSk3qS5IgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/udS/9KSstNaw46TDpMakpKTepLkiCisKKyM6IG1lbWxpbmUuYzoxMDAyCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P6XWpe2lw6WvpKy29aTHpLkiCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/udSkrLy6pO+k7KTGpKSk3qS5IgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogpdal7aXDpa8gMSCkzklEpKy01rDjpMOkxqSkpN6kuSglcyCkrC5zd3Cl1aWhpaSl66THpMqkpD8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P6XWpe2lw6WvpKykoqTqpN6ku6TzIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/PyCks6SzpKuk6T8/P0VORKTepMekzrnUpKzHy7L1pLWk7KTGpKSk66TopKakx6S5IgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IKSzpLOkq6TpPz9FTkSk3qTHpM651KSswd7G/qSruu+9/KS1pOykv6TopKakx6S5IgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/RU5EIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiCl6qWrpdCl6qSss+S5/qTepOyk3qS3pL8iCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IKXqpaul0KXqpM66x8PmpMulqKXpobykrLihvdCktaTspN6kt6S/OyA/Pz+kx7vPpN6k67nUpPK7sr7IpLekxqSvpMCktaSkIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgIlNlZSBcIjpoZWxwIEUzMTJcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIr7cutmkzyBcIjpoZWxwIEUzMTJcIiCk8ruyvsikt6TGpK+kwKS1pKQiCisKKyM6IG1lbWxpbmUuYzoxMTU1Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICKl6qWrpdCl6qSsvarOu6S3pN6kt6S/LiDBtKTGpKzAtaS3pKSkq6XBpaelw6WvpLekxqSvpMCktaSkLiIKKworIzogbWVtbGluZS5jOjExNTYKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoytG5uaTypcGlp6XDpa+kuaTrpL+k4aTLLCCks6TOpdWloaWkpeuk8srMpM7MvsGwpMfK3cK4pLekv77lpMdcbiIKKworIzogbWVtbGluZS5jOjExNTcKK21zZ2lkICJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIKK21zZ3N0ciAiuLbL3KXVpaGlpKXrpMikziBkaWZmIKTyvMK51KS5pOukyM7JpKSkx6S3pOekpilcbiIKKworIzogbWVtbGluZS5jOjExNTgKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIqS9pOykq6TpLnN3cKXVpaGlpKXrpPK67738pLekxqSvpMCktaSkXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNAorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICKluaXvpcOl16XVpaGlpKXrpKzKo7/0uKukxKSrpOqk3qS3pL86IgorCisjOiBtZW1saW5lLmM6MTM5MgorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICC4vbrfpM6lx6Wjpeylr6XIpeo6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk0Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIKSipOvMvsGwpPK7yM3Rw+Y6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk4Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgpcelo6Xspa+lyKXqICIKKworIzogbWVtbGluZS5jOjE0MTYKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIKTKpLcgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODgKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgICAgverNrbzUOiAiCisKKyM6IG1lbWxpbmUuYzoxNDkwCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgxvzJ1TogIgorCisjOiBtZW1saW5lLmM6MTQ5NCBtZW1saW5lLmM6MzY4NAorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgICAgxvzJ1TogIgorCisjOiBtZW1saW5lLmM6MTUxMAorbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTE0Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbVmltpM6luaXvpcOl16XVpaGlpKXrpMekz6TKpKSk6KSmpMekuV0iCisKKyM6IG1lbWxpbmUuYzoxNTE4Cittc2dpZCAiICAgICAgICAgZmlsZSBuYW1lOiAiCittc2dzdHIgIiAgICAgICAgpdWloaWkpevMvjogIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICDK0bm5vvXC1jogIgorCisjOiBtZW1saW5lLmM6MTUyNQorbXNnaWQgIllFUyIKK21zZ3N0ciAipKKk6iIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJubyIKK21zZ3N0ciAipMqktyIKKworIzogbWVtbGluZS5jOjE1MjkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgpeahvKW2zL46ICIKKworIzogbWVtbGluZS5jOjE1MzYKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgpduluaXIzL46ICIKKworIzogbWVtbGluZS5jOjE1MzgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgpduluaXIzL46ICIKKworIzogbWVtbGluZS5jOjE1NDQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIKXXpe2lu6W5SUQ6ICIKKworIzogbWVtbGluZS5jOjE1NTAKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKKTepMC8wrnUw+YpIgorCisjOiBtZW1saW5lLmM6MTU2MgorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW6SzpM5WaW2l0KG8pbil56XzpMekz7vIzdGkx6StpN6ku6TzXSIKKworIzogbWVtbGluZS5jOjE1NjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbpLOkzqWzpfOl1KXlobylv6THpM+7yM3RpMekraTepLuk810iCisKKyM6IG1lbWxpbmUuYzoxNTcwCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW8bJuf6k4aTepLuk810iCisKKyM6IG1lbWxpbmUuYzoxNTc0Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbs6uksaTepLuk810iCisKKyM6IG1lbWxpbmUuYzoxNzY0Cittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IKW5pe+lw6XXpdWloaWkpeukrMy1pKSkzqTHsN27/aTHpK2k3qS7pPMiCisKKyM6IG1lbWxpbmUuYzoxODE3Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIqXVpaGlpKXrpKyw3bv9pLWk7KTepLkiCisKKyM6IG1lbWxpbmUuYzoxODE5Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiCw3bv9pMu8usfUpLek3qS3pL8iCisKKyM6IG1lbWxpbmUuYzoxODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogzLW4+qTKbG51baTHpLk6ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiC51CAlbGQgpPKk36TEpLGk6aTspN6ku6TzIgorCisjOiBtZW1saW5lLmM6MjMwNgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzogpd2lpKXzpb+l1qXtpcOlr6TOSUSkrLTWsOOkw6TGpKSk3qS5IDMiCisKKyM6IG1lbWxpbmUuYzoyMzg2Cittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICJzdGFja19pZHggpM8gMCCkx6SipOuk2aStpMekuSIKKworIzogbWVtbGluZS5jOjI0NDgKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6ILm5v7ektaTspL+l1qXtpcOlr6Sswr+kuaSupOukq6TiPyIKKworIzogbWVtbGluZS5jOjI2MzAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IKXdpaSl86W/pdal7aXDpa+kzklEpKy01rDjpMOkxqSkpN6kuSA0IgorCisjOiBtZW1saW5lLmM6MjY1NworbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgIqXWpe2lw6WvIDEgpM++w6S1pOykvz8iCisKKyM6IG1lbWxpbmUuYzoyODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiC51CAlbGQgpKyk36TEpKuk6qTepLuk8yIKKworIzogbWVtbGluZS5jOjMxMDAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiCl3aWkpfOlv6XWpe2lw6WvpM5JRKSstNaw46TDpMakpKTepLkiCisKKyM6IG1lbWxpbmUuYzozMTE2Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IKSspbyl7aTHpLkiCisKKyM6IG1lbWxpbmUuYzozMTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogudTI1rnmpKzIz7DPs7Ckx6S5OiAlbGQgxLakqKTGpKSk3qS5IgorCisjOiBtZW1saW5lLmM6MzE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzogpdal7aXDpa8gJWxkIKTOudSlq6WmpfOlyKSstNaw46TDpMakpKTepLkiCisKKyM6IG1lbWxpbmUuYzozMTk4Cittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIqW5pb+lw6WvpbWlpKW6pKzB/aSopN6kuSIKKworIzogbWVtbGluZS5jOjMyNDQKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IKXdpaSl86W/pdal7aXDpa+kzklEpKy01rDjpMOkxqSkpN6kuSAyIgorCisjOiBtZW1saW5lLmM6MzY3NAorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTogw+2w1SIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyK8oaTOzL7BsKTHpbml76XDpdel1aWhpaSl66TyuKukxKSxpN6kt6S/IFwiIgorCisjOiBtZW1saW5lLmM6MzY3OQorbXNnaWQgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKK21zZ3N0ciAivKGkzqXVpaGlpKXrpPKzq6SkpMakpKTrusfD5iBcIiIKKworIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgpbml76XDpdel1aWhpaSl66TopOqk4r+3pLekpKTHpLkhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2OTIKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgysykzqXXpe2lsKXppeCkrMaxpLil1aWhpaSl66TyytS9uKS3pMakpKTrpKuk4qS3pOyk3qS7pPMuXG4iCisiICAgIKSzpM6+7LnnpMukzywgytG5uaTypLekv7rdpMu6x72qxaqkyywgxrGkuKXVpaGlpKXrpM6w26TKpOtcbiIKKyIgICAgMqTEpM6lpKXzpbmlv6XzpbmkrKTHpK2kxqS3pN6kpqSzpMiky8PtsNWkt6TGpK+kwKS1pKQuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIL2qzrukuaTrpKssIMPtsNWkt6TKpKyk6cKzpLGk3qS5LlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSCks6TOpdWloaWkpeukzsrUvbilu6XDpbel56XzpKylr6XppcOlt6XlpLekvy5cbiIKKworIzogbWVtbGluZS5jOjM2OTUKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICCks6TOvuy556TLpM8gXCI6cmVjb3ZlclwiIKSrIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTcKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICCk8rvIzdGkt6TGytG5uaTypeqlq6XQobykt6TepLkoXCI6aGVscCByZWNvdmVyXCIgpPK7sr7IKS5cbiIKKworIzogbWVtbGluZS5jOjM2OTgKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgtPuky6SzpOyk8rnUpMqkw6S/pM6kyqTppNAsIKW5pe+lw6XXpdWloaWkpesgXCIiCisKKyM6IG1lbWxpbmUuYzozNzAwCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIKTyvsOku6TQpLOkzqXhpcOlu6G8pbik8rLzyPKkx6StpN6kuS5cbiIKKworIzogbWVtbGluZS5jOjM3MTQgbWVtbGluZS5jOjM3MTgKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIqW5pe+lw6XXpdWloaWkpesgXCIiCisKKyM6IG1lbWxpbmUuYzozNzE1IG1lbWxpbmUuYzozNzIxCittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiCkrLT7pMukoqTqpN6kuSEiCisKKyM6IG1lbWxpbmUuYzozNzI0Cittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSDD7bDVIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIqW5pe+lw6XXpdWloaWkpeukrLT7pMvCuLrfpLek3qS5ISIKKworIzogbWVtbGluZS5jOjM3MzAKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydCIKK21zZ3N0ciAiIgorIsbJuf7A7M3RpMezq6SvKCZPKVxuIgorIqTIpMukq6SvytS9uKS5pOsoJkUpXG4iCisiyfyz6KS1pLuk6ygmUillY292ZXJcbiIKKyK9qs67pLmk6ygmUSlcbiIKKyLD5rvfpLmk6ygmQSkiCisKKyM6IG1lbWxpbmUuYzozNzMyCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnRcbiIKKyImRGVsZXRlIGl0IgorbXNnc3RyICIiCisixsm5/sDszdGkx7OrpK8oJk8pXG4iCisipMiky6SrpK/K1L24pLmk6ygmRSlcbiIKKyLJ/LPopLWku6TrKCZSKWVjb3ZlclxuIgorIr2qzrukuaTrKCZRKVxuIgorIsPmu9+kuaTrKCZBKVxuIgorIr7Dte6kuaTrKCZEKSIKKworIzogbWVtbGluZS5jOjM3ODkKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiCluaXvpcOl16XVpaGlpKXrpKzCv7/0uKukxKSrpOqk3qS3pL8iCisKKyM6IG1lbnUuYzo2NAorbXNnaWQgIkUzMjc6IFBhcnQgb2YgbWVudS1pdGVtIHBhdGggaXMgbm90IHN1Yi1tZW51IgorbXNnc3RyICJFMzI3OiCl4aXLpeWhvKWipaSlxqXgpM6l0aW5pM7J9MqspKyltaXWpeGly6Xlobykx6TPpKKk6qTepLuk8yIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IKXhpcul5aG8pM/CvqTOpeKhvKXJpMukwKSxpKKk6qTepLkiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiCkvaTOzL7BsKTOpeGly6Xlobykz6SipOqk3qS7pPMiCisKKyM6IG1lbnUuYzo1MjUKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiCl4aXLpeWhvKXRpbmkz6W1pdal4aXLpeWhvKTywLikuKTrpNmkraTHpM+koqTqpN6ku6TzIgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IKXhpcul5aG8pdChvKTLpM/EvsDcpeGly6XlobyloqWkpcal4KTyxMmyw6THpK2k3qS7pPMiCisKKyM6IG1lbnUuYzo1NzAKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6ILbowNqk6qTPpeGly6Xlobyl0aW5pM6w7Mn0pMekz6SipOqk3qS7pPMiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwOTcKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCl4aXLpeWhvCAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICKks6TOpeGly6Xlobyk8sDapOq86KTrIgorCisjOiBtZW51LmM6MjA4NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IKXhpcul5aG8pdGluaTPpeGly6XlobyloqWkpcal4KTywLikuKTKpLGk7KTQpKSksaTepLuk8yIKKworIzogbWVudS5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiCl4aXLpeWhvKSspN+kxKSrpOqk3qS7pPM6ICVzIgorCisjOiBtZW51LmM6MjE3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiAlcyCky6TPpeGly6XlobykrMTqtcGktaTspMakpKTepLuk8yIKKworIzogbWVudS5jOjIyMTEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IKXhpcul5aG8pdGluaTPpbWl1qXhpcul5aG8pPLAuKS4pMqksaTspNCkpKSxpN6ku6TzIgorCisjOiBtZW51LmM6MjIzMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogpeGly6XlobykrKTfpMSkq6TqpN6ku6TzIC0gpeGly6XlobzMvqTys87Hp6S3pMakr6TApLWkpCIKKworIzogbWVzc2FnZS5jOjQxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAiJXMgpM696M39w+aky6WopemhvKSsuKG90KS1pOyk3qS3pL86IgorCisjOiBtZXNzYWdlLmM6NDQwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgIrnUICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NjQ3Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIlvKuLv6zvOkrMS5pLmkrqTepLldIgorCisjOiBtZXNzYWdlLmM6Nzk3Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIsb8y9y47KXhpcOlu6G8pbjL3cz1L7TGvaQ6IMK8sqwgwsDPuiA8a29yb25AdGthLmF0dC5uZS5qcD4iCisKKyM6IG1lc3NhZ2UuYzoxMDI1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIrPkuf6k3zogIgorCisjOiBtZXNzYWdlLmM6MTAyOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiwrOksaTrpMukz0VOVEVSpPKyoaS3pMakr6TApLWkpCIKKworIzogbWVzc2FnZS5jOjEwMzAKK21zZ2lkICJIaXQgRU5URVIgb3IgdHlwZSBjb21tYW5kIHRvIGNvbnRpbnVlIgorbXNnc3RyICLCs6SxpOuky6TPRU5URVKk8rKhpLmkq6Wzpd6l86XJpPLG/s7PpLekxqSvpMCktaSkIgorCisjOiBtZXNzYWdlLmM6MjM1MQorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tILfRwrMgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6ILnUwfek6iwgU1BBQ0UvYjogpdqhvKW4wfek6iwgZC91OiDIvqXaobyluMH3pOosIHE6IL2qzrspIgorCisjOiBtZXNzYWdlLmM6MjM1NQorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6ILnUwfek6iwgU1BBQ0U6IKXaobyluMH3pOosIGQ6IMi+pdqhvKW4wfek6iwgcTogvarOuykiCisKKyM6IG1lc3NhZ2UuYzoyOTc2IG1lc3NhZ2UuYzoyOTkxCittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIrzBzOQiCisKKyM6IG1lc3NhZ2UuYzoyOTc4Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyKkz6SkKCZZKVxuIgorIqSkpKSkqCgmTikiCisKKyM6IG1lc3NhZ2UuYzozMDExCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisipM+kpCgmWSlcbiIKKyKkpKSkpKgoJk4pXG4iCisiwbSkxsrdwrgoJkEpXG4iCisiwbSkxsr8tP4oJkQpXG4iCisipa2l46Xzpbul6ygmQykiCisKKyM6IG1lc3NhZ2UuYzozMDUyCittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAipdWloaWkpevK3cK4pcClpKWipe2lsCIKKworIzogbWVzc2FnZS5jOjMwNTQKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICKl1aWhpaSl68bJuf6lwKWkpaKl7aWwIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjMxMjUKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogpbOl86W9obyl66XiobylyaTHpM+l1aWhpaSl66XWpemlpqW2pPK7yKSopN6ku6TzLCCktKThpPOkyqS1pKQiCisKKyM6IG1pc2MxLmM6Mjc3MworbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6ILfZufA6IMbJuf7A7M3RpdWloaWkpeuk8srRubmkt6TepLkiCisKKyM6IG1pc2MxLmM6MzAyMQorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICIxILnUIMTJssOkt6TepLekvyIKKworIzogbWlzYzEuYzozMDIzCittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIjEgudQguu+9/KS3pN6kt6S/IgorCisjOiBtaXNjMS5jOjMwMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiVsZCC51CDEybLDpLek3qS3pL8iCisKKyM6IG1pc2MxLmM6MzAzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIiVsZCC51CC67738pLek3qS3pL8iCisKKyM6IG1pc2MxLmM6MzAzMworbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKLPkuf6k3qTspN6kt6S/KSIKKworIzogbWlzYzEuYzo3NTgyCittc2dpZCAiVmltOiBwcmVzZXJ2aW5nIGZpbGVzLi4uXG4iCittc2dzdHIgIlZpbTogpdWloaWkpeuk8srdwrjD5i4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NzU5MgorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogvarOu6S3pN6kt6S/LlxuIgorCisjOiBtaXNjMi5jOjY5NSBtaXNjMi5jOjcxMQorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIqWopemhvDogIgorCisjOiBtaXNjMi5jOjcxNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIlul4aXipeoopdClpKXIKV0gwe2z5MX2LbLyyvzOzCAlbHUtJWx1LCC7yM3RzswgJWx1LCCl1KG8pa+7/iAlbHVcbiIKKworIzogbWlzYzIuYzo3MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIltjYWxsc10gdG90YWwgcmUvbWFsbG9jKCkncyAlbHUsIHRvdGFsIGZyZWUoKSdzICVsdVxuIgorIlxuIgorbXNnc3RyICIiCisiW7jGvdBdIMHtIHJlL21hbGxvYygpILLzv/QgJWx1LCDB7SBmcmVlKCkgsvO/9CAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiC51KSsxLmkr6TKpOqkuaSupN6kt6S/IgorCisjOiBtaXNjMi5jOjgxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogxuLJ9KWopemhvDogbGFsbG9jKCVsZCwpIgorCisjOiBtaXNjMi5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogpeGl4qXqpKzCraTqpN6ku6TzISAgKCVsdSCl0KWkpcik8rPkxfbN17XhKSIKKworIzogbWlzYzIuYzoyNTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICK8wrnUpM6kv6ThpMult6Wnpeuk8rjGvdCkt8PmOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6MjgxNQorbXNnaWQgIkU1NDU6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NDU6IKWzpe2l86SspKKk6qTepLuk8yIKKworIzogbWlzYzIuYzoyODE3IG1pc2MyLmM6Mjg0NAorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0NjogydTAtaTKpeKhvKXJpMekuSIKKworIzogbWlzYzIuYzoyODgzCittc2dpZCAiRTU0NzogSWxsZWdhbCBtb3VzZXNoYXBlIgorbXNnc3RyICJFNTQ3OiDJ1MC1pMogJ21vdXNlc2hhcGUnIKTHpLkiCisKKyM6IG1pc2MyLmM6MjkyMworbXNnaWQgIkU1NDg6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTQ4OiC/9MPNpKzJrM3XpMekuSIKKworIzogbWlzYzIuYzoyOTI4Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiDJ1MC1pMql0aG8pbul86XGobyluKTHpLkiCisKKyM6IG1pc2MyLmM6MzIzOAorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIrDFueayvc3RpM6lraG8pPLG/s7PpLekxqSvpMCktaSkOiAiCisKKyM6IG1pc2MyLmM6MzIzOQorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIqTipKaw7MXZxrGkuKWtobyk8sb+zs+kt6TGpK+kwKS1pKQ6ICIKKworIzogbWlzYzIuYzozMjQ5Cittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIqWtobykrLDsw9ekt6TepLuk8yIKKworIzogbWlzYzIuYzozNzk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICIiCisiRTM0MzogzLW4+qTKpdGluaTHpLk6ICcqKlu/9MPNXScgpM9wYXRopM66x7jlpKsgJyVzJyAiCisipKzCs6SkpMakyqSkpMikpKSxpN6ku6TzLiIKKworIzogbWlzYzIuYzo1MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IGNkcGF0aKTLpM8gXCIlc1wiIKTIpKSkpqXVpaGlpKXrpKykoqTqpN6ku6TzIgorCisjOiBtaXNjMi5jOjUwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiBwYXRopMukzyBcIiVzXCIgpMikpKSmpdWloaWkpeukrKSipOqk3qS7pPMiCisKKyM6IG1pc2MyLmM6NTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiBjZHBhdGiky6TPpLOk7LDKvuUgXCIlc1wiIKTIpKSkpqXVpaGlpKXrpKykoqTqpN6ku6TzIgorCisjOiBtaXNjMi5jOjUwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiCl0aW5pMukz6SzpOywyr7lIFwiJXNcIiCkyKSkpKal1aWhpaSl66SspKKk6qTepLuk8yIKKworIzogbWlzYzIuYzo1MzIzCittc2dpZCAiRTU1MDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU1MDogpbOl7aXzpKykoqTqpN6ku6TzIgorCisjOiBtaXNjMi5jOjUzMzUKK21zZ2lkICJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAiRTU1MTogydTAtaTKub3KuM3Xwcekx6S5IgorCisjOiBtaXNjMi5jOjUzNDMKK21zZ2lkICJFNTUyOiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU1Mjogv/TDzaSsyazN16THpLkiCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6Mzk2Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIk5ldGJlYW5zICMyIKTLwNzCs6THpK2k3qS7pPMiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIk5ldGJlYW5zIKTLwNzCs6THpK2k3qS7pPMiCisKKyM6IG5ldGJlYW5zLmM6NDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2Njg6IFdyb25nIGFjY2VzcyBtb2RlIGZvciBOZXRCZWFucyBjb25uZWN0aW9uIGluZm8gZmlsZTogXCIlc1wiIgorbXNnc3RyICIiCisiRTY2ODogTmV0QmVhbnOkzsDcwrO+8MrzpdWloaWkpeukzqWipa+lu6W5peKhvKXJpMvM5MLqpKykoqTqpN6kuTogXCIlc1wiIgorCisjOiBuZXRiZWFucy5jOjc0OQorbXNnaWQgInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiCittc2dzdHIgIk5ldGJlYW5zIKTOpb2lsaXDpcik8sbJuf6k3yIKKworIzogbmV0YmVhbnMuYzoxNjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NTg6IE5ldEJlYW5zIGNvbm5lY3Rpb24gbG9zdCBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTY1ODogpdClw6XVpaEgJWxkIKTOIE5ldEJlYW5zIMDcwrOkrLy6pO+k7KTepLekvyIKKworIzogbm9ybWFsLmM6Mjk4MAorbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgIrfZufA6ILvIzdGkt6TGpKSk68O8y/akz6XPpaSl6aWkpcikx6StpN6ku6TzIgorCisjOiBub3JtYWwuYzozMjc2Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogpauhvKW9peukzrDMw9aky6TPyri7+s7zpKykoqTqpN6ku6TzIgorCisjOiBub3JtYWwuYzozMjc4Cittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IKWrobylvaXrpM6wzMPWpMukz7yxysy70qSspKKk6qTepLuk8yIKKworIzogbm9ybWFsLmM6NDUxOQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiC4vbrfpM4gJ2ZvbGRtZXRob2QnIKTHpM/A3r72pN+k8r7Dte6kx6StpN6ku6TzIgorCisjOiBub3JtYWwuYzo2NzA4Cittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDogytG5uaXqpbmlyKSstvWkx6S5IgorCisjOiBub3JtYWwuYzo2NzEwCittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MjogytG5uaXqpbmlyKTOwOjGrCIKKworIzogbm9ybWFsLmM6NjcxMgorbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYzOiDK0bm5peqluaXIpM7L9sj4IgorCisjOiBub3JtYWwuYzo3OTczCittc2dpZCAiVHlwZSAgOnF1aXQ8RW50ZXI+ICB0byBleGl0IFZpbSIKK21zZ3N0ciAiVmltpPK9qs67pLmk66TLpM8gOnF1aXQ8RW50ZXI+IKTIxv7Oz6S3pMakr6TApLWkpCIKKworIzogb3BzLmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiMSC51KSsICVzIKTHIDEgsvO96M39pLWk7KTepLekvyIKKworIzogb3BzLmM6Mjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIxILnUpKwgJXMgpMcgJWQgsvO96M39pLWk7KTepLekvyIKKworIzogb3BzLmM6MzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkILnUpKwgJXMgpMcgMSCy873ozf2ktaTspN6kt6S/IgorCisjOiBvcHMuYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCC51KSsICVzIKTHICVkILLzvejN/aS1pOyk3qS3pL8iCisKKyM6IG9wcy5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiJWxkILnUpKylpKXzpcel86XIpLWk7KTepLkuLi4gIgorCisjOiBvcHMuYzo3MTIKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxILnUpPKlpKXzpcel86XIpLek3qS3pL8iCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgudSk8qWkpfOlx6Xzpcikt6TepLekvyIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NzUKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAipeSl86WvpMekraTepLuk8zsgpMiky6SrpK++w7XuIgorCisjOiBvcHMuYzoyMTg1Cittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgudSkrMrRubmktaTspN6kt6S/IgorCisjOiBvcHMuYzoyMTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIlbGQgudSkrMrRubmktaTspN6kt6S/IgorCisjOiBvcHMuYzoyNTcxCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICIlbGQgudSk8rOryvzD5iIKKworIzogb3BzLmM6Mjg1MgorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIjEgudSkrKXkpfOlr6S1pOyk3qS3pL8iCisKKyM6IG9wcy5jOjI4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAiJWxkILnUpKyl5KXzpa+ktaTspN6kt6S/IgorCisjOiBvcHMuYzozMTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IKXspbiluaW/ICVzIKTLpM+yv6TipKKk6qTepLuk8yIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNjkwCittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIKXspbiluaW/IC0tLSIKKworIzogb3BzLmM6NDk5NworbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAiydTAtaTKpeyluKW5pb/MviIKKworIzogb3BzLmM6NTA4NQorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgpeyluKW5pb86XG4iCisKKyM6IG9wcy5jOjUxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJFNTc0OiDMpMPOpM6l7KW4pbmlv7e/ICVkIKTHpLkiCisKKyM6IG9wcy5jOjU2MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiDMtbj6pMql7KW4pbmlv8y+OiAnJXMnIgorCisjOiBvcHMuYzo1OTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCDO8zsgIgorCisjOiBvcHMuYzo1OTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiwarC8iAlcyVsZCAvICVsZCC51DsgJWxkIC8gJWxkIMOxuOw7ICVsZCAvICVsZCDKuLv6IgorCisjOiBvcHMuYzo2MDAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAizvMgJXMgLyAlczsgudQgJWxkIG9mICVsZDsgw7G47CAlbGQgLyAlbGQ7IMq4u/ogJWxkIC8gJWxkIgorCisjOiBvcHMuYzo2MDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBmb3IgQk9NKSIKKworIzogb3B0aW9uLmM6MTY0MworbXNnaWQgIiU8JWYlaCVtJT1QYWdlICVOIgorbXNnc3RyICIlPCVmJWglbSU9JU4gpdqhvKW4IgorCisjOiBvcHRpb24uYzoyMDkyCittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICJWaW0gpPK7yKTDpMakr6TspMakoqTqpKykyKSmIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODogzKTDzqTOpaql16W3peel86THpLkiCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogpaql16W3peel86TPpbWl3aG8pciktaTspMakpKTepLuk8yIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IG1vZGVsaW5lIKTHpM+19rLEpLWk7KTepLuk8yIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiA9IKTOuOWky6TPv/S7+qSsyazN16THpLkiCisKKyM6IG9wdGlvbi5jOjM5ODkgb3B0aW9uLmM6NDYxOQorbXNnaWQgIkU1MjI6IE5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTIyOiB0ZXJtY2FwIMbipMuk36TEpKuk6qTepLuk8yIKKworIzogb3B0aW9uLmM6NDA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM5OiBJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICJFNTM5OiDJ1MC1pMrKuLv6pMekuSA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiAndGVybScgpMukz7b1yri7+s7zpPLA38TqpMekraTepLuk8yIKKworIzogb3B0aW9uLmM6NDYxNAorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IEdVSaTHpM8gJ3Rlcm0nIKTyytG5uaTHpK2k3qS7pPMiCisKKyM6IG9wdGlvbi5jOjQ2MTYKK21zZ2lkICJFNTMxOiBVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTUzMTogR1VJpPKluaW/obylyKS5pOuky6TPIFwiOmd1aVwiIKTyu8jN0aS3pMakr6TApLWkpCIKKworIzogb3B0aW9uLmM6NDY0NQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXBleHQnIKTIICdwYXRjaG1vZGUnIKSsxrGkuKTHpLkiCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogR1RLKzIgR1VJpMekz8rRubmkx6StpN6ku6TzIgorCisjOiBvcHRpb24uYzo1MDE2Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDogpbOl7aXzpKykoqTqpN6ku6TzIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiDKuLv6zvOkzsS5pLWkrKW8pe2kx6S5IgorCisjOiBvcHRpb24uYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IDwlcz4gpM645aTLv/S7+qSspKKk6qTepLuk8yIKKworIzogb3B0aW9uLmM6NTEwMAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IKWrpfOl3qSspKKk6qTepLuk8yIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6ICcgpM7DzaTyu9jE6qS3pMqksaTspNCkyqTqpN6ku6TzIgorCisjOiBvcHRpb24uYzo1MTQ4Cittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IMm9vKikx6StpMqkpMq4u/qkq6XvpaSlycq4u/qk8rTepPOkx6SkpN6kuSIKKworIzogb3B0aW9uLmM6NTE5NworbXNnaWQgIkU1OTY6IEludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiRTU5NjogzLW4+qTKpdWlqaXzpcikx6S5IgorCisjOiBvcHRpb24uYzo1MjA1Cittc2dpZCAiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIkU1OTc6IKXVpaml86XIpbulw6XIpPLBqsLypMekraTepLuk8yIKKworIzogb3B0aW9uLmM6NTIwNworbXNnaWQgIkU1OTg6IEludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiRTU5ODogzLW4+qTKpdWlqaXzpcilu6XDpcikx6S5IgorCisjOiBvcHRpb24uYzo1MjE0Cittc2dpZCAiRTUzMzogY2FuJ3Qgc2VsZWN0IHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzMzogpe+lpKXJpdWlqaXzpcik8sGqwvKkx6StpN6ku6TzIgorCisjOiBvcHRpb24uYzo1MjE2Cittc2dpZCAiRTUzNDogSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzQ6IMy1uPqkyqXvpaSlyaXVpaml86XIpMekuSIKKworIzogb3B0aW9uLmM6NTQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICJFNTM1OiA8JWM+IKTOuOWky8nUwLWkysq4u/qkrKSipOqk3qS5IgorCisjOiBvcHRpb24uYzo1NTk3Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IKWrpfOl3qSsyazN16THpLkiCisKKyM6IG9wdGlvbi5jOjU2MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIKTPtvWkx6SipOukqyAlcyCk8rTepODJrM3XpKykoqTqpN6kuSIKKworIzogb3B0aW9uLmM6NTY3OQorbXNnaWQgIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkU1Mzg6IKXepaaluaTPpbWl3aG8pciktaTspN6ku6TzIgorCisjOiBvcHRpb24uYzo1OTQ3Cittc2dpZCAiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiRTU0MDogvLCkrL2qzrukt6TGpKSk3qS7pPMiCisKKyM6IG9wdGlvbi5jOjU5NTEKK21zZ2lkICJFNTQxOiB0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAiRTU0MTogzdfBx6Sswr+kuaSupN6kuSIKKworIzogb3B0aW9uLmM6NTk1MworbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiClsKXrobyl16SsxOC556SkpN6ku6TzIgorCisjOiBvcHRpb24uYzo2MTkzCittc2dpZCAiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTU5MDogpdel7KXTpeWhvKWmpaOl86XJpaakrLT7pMvCuLrfpLek3qS5IgorCisjOiBvcHRpb24uYzo2NDUwCittc2dpZCAiVzE3OiBBcmFiaWMgcmVxdWlyZXMgVVRGLTgsIGRvICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKK21zZ3N0ciAiIgorIlcxNzogpaKl6aXTpaLKuLv6pMukz1VURi04pKzJrM3XpMqkzqTHLCAnOnNldCBlbmNvZGluZz11dGYtOCcgpLekxqSvpMCktaSkIgorCisjOiBvcHRpb24uYzo2Nzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6ILrHxOMgJWQgpM651L/0pKzJrM3XpMekuSIKKworIzogb3B0aW9uLmM6Njc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTk0OiBOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIkU1OTQ6ILrHxOMgJWQgpM6lq6XppeDJ/aSsyazN16THpLkiCisKKyM6IG9wdGlvbi5jOjcwOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiDMpMPOpM6lqqXXpbel56XzpMekuTogJXMiCisKKyM6IG9wdGlvbi5jOjcyMTMKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDDvMv2pbOhvKXJIC0tLSIKKworIzogb3B0aW9uLmM6NzIxNQorbXNnaWQgIiIKKyJcbiIKKyItLS0gR2xvYmFsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIKWwpe2hvKXQpeulqqXXpbel56Xzw80gLS0tIgorCisjOiBvcHRpb24uYzo3MjE3Cittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCl7aG8paul66Wqpdelt6XnpfPDzSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMTkKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIKWqpdelt6XnpfMgLS0tIgorCisjOiBvcHRpb24uYzo3OTI1Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwIKWopemhvCIKKworIzogb3B0aW9uLmM6ODg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiAlcyCky8LQsf6kuaTryri7+qSspKKk6qTepLuk8yIKKworIzogb3B0aW9uLmM6ODkzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiClu6XfpbOl7aXzpM645aTLzb7KrKTKyri7+qSspKKk6qTepLk6ICVzIgorCisjOiBvc19hbWlnYS5jOjI4MAorbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAis6uksaTepLuk8yAiCisKKyM6IG9zX2FtaWdhLmM6MzE0Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiClpqWjpfOlyaWmpPKzq6SxpN6ku6TzIVxuIgorCisjOiBvc19hbWlnYS5jOjMzOAorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIkFtaWdhZG9zpM6l0KG8pbil56XzIDIuMDSkq6S9pOywyrnfpKzJrM3XpMekuVxuIgorCisjOiBvc19hbWlnYS5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIiVzIKTOpdChvKW4peel8yAlbGQgpKzJrM3XpMekuVxuIgorCisjOiBvc19hbWlnYS5jOjQxNgorbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTklMpPKzq6SxpN6ku6TzOlxuIgorCisjOiBvc19hbWlnYS5jOjQyNworbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICK67sCupMekraTepLuk8yAiCisKKyM6IG9zX2FtaWdhLmM6OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltpM8gJWQgpMe9qs67pLek3qS5XG4iCisKKyM6IG9zX2FtaWdhLmM6OTM3Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAipbOl86W9obyl66XiobylyaTyytG5uaTHpK2k3qS7pPM/IVxuIgorCisjOiBvc19hbWlnYS5jOjEwMDMKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiCls6Xzpb2hvKXrpMekz6TKpKQ/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTUyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IC1mIKWqpdelt6XnpfOkx6W3pael66TyvMK51KTHpK2k3qS7pPMiCisKKyM6IG9zX2FtaWdhLmM6MTE5MyBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIrzCudSkx6StpN6ku6TzICIKKworIzogb3NfYW1pZ2EuYzoxMTk2IG9zX2FtaWdhLmM6MTI5MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAipbelp6XrICIKKworIzogb3NfYW1pZ2EuYzoxMjE2IG9zX2FtaWdhLmM6MTMxOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgzOGk6qTepLekv1xuIgorCisjOiBvc19hbWlnYS5jOjE0NTkKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIKSsvq6ktaS5pK6k3qS5LiIKKworIzogb3NfYW1pZ2EuYzoxNDYzCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICLG/r3Qzs+lqKXpobwiCisKKyM6IG9zX21zd2luLmM6NTM5Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLii+ys6sKSIKKworIzogb3NfbXN3aW4uYzo2NDEKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIKSsODCkx6TPpMqkpKS/pOEsILOwyfSls6XepfOlyaTyvMK51KTHpK2k3qS7pPMiCisKKyM6IG9zX21zd2luLmM6MTk3MworbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogpdel6qXzpb+kzsGqwvKky7y6x9Skt6TepLekvyIKKworIzogb3NfbXN3aW4uYzoyMDEzCisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICIlcyCk2CAoJXMgvuWkzikiCisKKyM6IG9zX21zd2luLmM6MjAyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IMykw86kzqXXpeql86W/paql16W3peel86THpLk6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwNzcgb3NfbXN3aW4uYzoyMDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogsPW6/qWopemhvDogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4OAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIsnUzMAiCisKKyM6IG9zX21zd2luLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICKw9br+pLekxqSkpN6kuTogJyVzJyIKKworIzogb3NfbXN3aW4uYzozMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiDKuLv6pbulw6XIzL4gXCIlc1wiIKTPydTAtaTHpLkgKKXVpaml86XIzL4gXCIlc1wiKSIKKworIzogb3NfbXN3aW4uYzozMjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6ICclYycgpM/J1MC1pMrKuLv6pMekuSAopdWlqaXzpcjMviBcIiVzXCIpIgorCisjOiBvc19yaXNjb3MuYzoxMjU5Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogzLW4+qTKICdvc2ZpbGV0eXBlJyClqqXXpbel56XzIC0gXCJUZXh0XCIgpPK7yKSkpN6kuSIKKworIzogb3NfdW5peC5jOjkyNworbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IDK9xaTOpbelsKXKpeukzqS/pOEsIL2qzrukt6TepLlcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogw9fMv8WqpbelsKXKpesgJXMgpPK4ocPOpLek3qS3pL9cbiIKKworIzogb3NfdW5peC5jOjkzNgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiDD18y/xaqlt6Wwpcql66TyuKHDzqS3pN6kt6S/XG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJYpbWhvKXQpNikzsDcwrOkyyAlbGQgpd+l6snDpKukq6TqpN6kt6S/IgorCisjOiBvc191bml4LmM6MTIyNgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IFggpM6lqKXpobyk8rihvdCkt6TepLekv3JcbiIKKworIzogb3NfdW5peC5jOjEzMzQKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJYIGRpc3BsYXkgpM6lwaWnpcOlr6TLvLrH1KS3pN6kt6S/IgorCisjOiBvc191bml4LmM6MTQ3MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIlggZGlzcGxheSCkziBvcGVuIKSspb+lpKXgpaKlpqXIpLek3qS3pL8iCisKKyM6IG9zX3VuaXguYzozMjI3IG9zX3VuaXguYzozOTA3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIqW3pael66TyvMK51KTHpK2k3qS7pPMgIgorCisjOiBvc191bml4LmM6MzI3NQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisic2ggpbelp6XrpPK8wrnUpMekraTepLuk81xuIgorCisjOiBvc191bml4LmM6MzI3OSBvc191bml4LmM6MzkxMworbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyKlt6WnpeukrMPNpPLK1qS3pN6kt6S/ICIKKworIzogb3NfdW5peC5jOjM0MTQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisipdGlpKXXpPK67sCupMekraTepLuk81xuIgorCisjOiBvc191bml4LmM6MzQyOQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiZm9yayCkx6StpN6ku6TzXG4iCisKKyM6IG9zX3VuaXguYzozOTIwCittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisipbOl3qXzpcmk8sPmw8ekt6TepLekv1xuIgorCisjOiBvc191bml4LmM6NDE4NCBvc191bml4LmM6NDMwOSBvc191bml4LmM6NTk3NQorbXNnaWQgIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCCkrElDRcDcwrOk8ry6pKSk3qS3pL8iCisKKyM6IG9zX3VuaXguYzo1NTU4Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiWCBkaXNwbGF5IKTOIG9wZW4gpMu8usfUpLek3qS3pL8iCisKKyM6IG9zX3VuaXguYzo1ODgwCittc2dpZCAiWFNNUCBoYW5kbGluZyBzYXZlLXlvdXJzZWxmIHJlcXVlc3QiCittc2dzdHIgIlhTTVAgpKxzYXZlLXlvdXJzZWxmzde14aTyvejN/aS3pMakpKTepLkiCisKKyM6IG9zX3VuaXguYzo1OTk5Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgpKzA3MKzpPKzq7vPpLekxqSkpN6kuSIKKworIzogb3NfdW5peC5jOjYwMTgKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiWFNNUCBJQ0XA3MKzpKy8usfUpLekv6TopKakx6S5IgorCisjOiBvc191bml4LmM6NjAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb26krLy6x9Skt6TepLekvzogJXMiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIrnUIgorCisjOiBvc193MzJleGUuYzo2NQorbXNnaWQgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iCittc2dzdHIgIqWzpd6l86XJpemlpKXzpMul4aXipeqk8rPkpOrF9qTGpOmk7KTepLuk8yIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJWSU2lqKXpobwiCisKKyM6IG9zX3czMmV4ZS5jOjg5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAidmltMzIuZGxsIKType2hvKXJpMekraTepLuk86THpLekvyIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJETEykq6TptNi/9KXdpaSl86W/pPK86MbApMekraTepLuk86THpLekvyIKKworIzogb3Nfd2luMTYuYzozNDIgb3Nfd2luMzIuYzozMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICKlt6WnpeukrKWzobylySAlZCCkx72qzrukt6TepLekvyIKKworIzogb3Nfd2luMzIuYzoyNjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogpaSl2aXzpcggJXMgpPK4ocPOXG4iCisKKyM6IG9zX3dpbjMyLmM6MjY1NworbXNnaWQgImNsb3NlIgorbXNnc3RyICLKxKS4pOsiCisKKyM6IG9zX3dpbjMyLmM6MjY1OQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAipe2lsKWqpdUiCisKKyM6IG9zX3dpbjMyLmM6MjY2MAorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICKlt6XjpcOlyKXApaal8yIKKworIzogb3Nfd2luMzIuYzozMTUwCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IKWzpd6l86XJpKykoqTqpN6ku6TzIgorCisjOiBvc193aW4zMi5jOjMxNjMKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyJWSU1SVU4uRVhFpKwgJFBBVEggpM7D5qTLpN+kxKSrpOqk3qS7pPMuXG4iCisis7DJ9KWzpd6l86XJpM69qs67uOWky7Dsu/7E5LvfpPKkt6TepLuk8y5cbiIKKyK+3LrZpM8gIDpoZWxwIHdpbjMyLXZpbXJ1biAgpPK7sr7IpLekxqSvpMCktaSkLiIKKworIzogb3Nfd2luMzIuYzozMTY2Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbaTOt9m58CIKKworIzogcXVpY2tmaXguYzoyNTgKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IKXVpamhvKXepcOlyMq4u/rO86TLICUlJWMgpKzCv6S5pK6k3qS5IgorCisjOiBxdWlja2ZpeC5jOjI3MQorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiCl1aWpobyl3qXDpcjKuLv6zvOky829tPyku6TMICUlJWMgpKykoqTqpN6kt6S/IgorCisjOiBxdWlja2ZpeC5jOjMyNQorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiCl1aWpobyl3qXDpcjKuLv6zvOkyyBdIKSspKKk6qTepLuk8yIKKworIzogcXVpY2tmaXguYzozMzkKK21zZ2lkICJFMzc1OiBVbnN1cHBvcnRlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzU6IKXVpamhvKXepcOlyMq4u/rO86THpM8gJSUlYyCkz6W1pd2hvKXIpLWk7KTepLuk8yIKKworIzogcXVpY2tmaXguYzozNTcKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6IKXVpamhvKXepcOlyMq4u/rO86TOwbDD1qTLzLW4+qTKICUlJWMgpKykoqTqpN6kuSIKKworIzogcXVpY2tmaXguYzozNjUKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogpdWlqaG8pd6lw6XIyri7+s7zpMvMtbj6pMogJSUlYyCkrKSipOqk3qS5IgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogJ2Vycm9yZm9ybWF0JyCky6XRpb+hvKXzpKy72MTqpLWk7KTGpKSk3qS7pPMiCisKKyM6IHF1aWNrZml4LmM6NTAxCittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTogpcelo6Xspa+lyKXqzL6krMy1pKSkq7b1pMekuSIKKworIzogcXVpY2tmaXguYzo5OTAKK21zZ2lkICJFNTUzOiBObyBtb3JlIGl0ZW1zIgorbXNnc3RyICJFNTUzOiDN18HHpKyk4qSmpKKk6qTepLuk8yIKKworIzogcXVpY2tmaXguYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCBvZiAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIzMQorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiICi51KSsuu+9/KS1pOyk3qS3pL8pIgorCisjOiBxdWlja2ZpeC5jOjE0NDQKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IHF1aWNrZml4IKW5pb+lw6WvpM7L9sj4pMekuSIKKworIzogcXVpY2tmaXguYzoxNDUzCittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBxdWlja2ZpeCCluaW/pcOlr6TOwOjGrKTHpLkiCisKKyM6IHF1aWNrZml4LmM6MTQ2NQorIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgIqWopemhvLDszfcgJWQgb2YgJWQ7ICVkILjEpail6aG8IgorCisjOiBxdWlja2ZpeC5jOjE5NDMKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiAnYnVmdHlwZScgpaql16W3peel86SswN/E6qS1pOykxqSkpOukzqTHvfG5/qTfpN6ku6TzIgorCisjOiByZWdleHAuYzo4MzgKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiCl0aW/obyl86SsxLmkuaSupN6kuSIKKworIzogcmVnZXhwLmM6MTAwOQorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiBcXHooIKSswr+kuaSupN6kuSIKKworIzogcmVnZXhwLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiAlcyggpKzCv6S5pK6k3qS5IgorCisjOiByZWdleHAuYzoxMDc3Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiBcXHooIKSsxOCk6rnnpMOkxqSkpN6ku6TzIgorCisjOiByZWdleHAuYzoxMDgxCittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1MzogJXMlJSggpKzE4KTqueekw6TGpKSk3qS7pPMiCisKKyM6IHJlZ2V4cC5jOjEwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6ICVzKCCkrMTgpOq556TDpMakpKTepLuk8yIKKworIzogcmVnZXhwLmM6MTA4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTU6IFVubWF0Y2hlZCAlcykiCittc2dzdHIgIkU1NTogJXMpIKSsxOCk6rnnpMOkxqSkpN6ku6TzIgorCisjOiByZWdleHAuYzoxMjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NjogJXMqIKSstvXKuLv6zvOky6TKpOuyxMe9wK2krKSipOqk3qS5IgorCisjOiByZWdleHAuYzoxMjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzogJXMrIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NzogJXMrIKSstvXKuLv6zvOky6TKpOuyxMe9wK2krKSipOqk3qS5IgorCisjOiByZWdleHAuYzoxMzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6ICVzQCCkzrjlpMvJ1MC1pMrKuLv6pKykoqTqpN6kt6S/IgorCisjOiByZWdleHAuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1ODogJXN7IKSstvXKuLv6zvOky6TKpOuyxMe9wK2krKSipOqk3qS5IgorCisjOiByZWdleHAuYzoxMzU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiDKo7uopMogJXN7Li4ufSCkrMK/pLmkrqTepLkiCisKKyM6IHJlZ2V4cC5jOjEzNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6JXMqIKSsxv6k7LvSpMukyqTDpMakpKTepLkiCisKKyM6IHJlZ2V4cC5jOjEzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiVzJWMgpKzG/qTsu9Kky6TKpMOkxqSkpN6kuSIKKworIworIzogcmVnZXhwLmM6MTQ5MQorbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IFxcXyCkzsy1uPqkyrvIzdHK/cuhpMekuSIKKworIzogcmVnZXhwLmM6MTUzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6JXMlYyCkzrjlpMukyqTLpOKkoqTqpN6ku6TzIgorCisjCisjOiByZWdleHAuYzoxNTkyCittc2dpZCAiRTY1OiBJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorbXNnc3RyICJFNjU6IMnUwLWkyrjlyv27sr7IpMekuSIKKworIworIzogcmVnZXhwLmM6MTYwNQorbXNnaWQgIkU2NjogXFx6KCBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjY6IFxceiggpM+ls6WzpMekz7X2ssSktaTspMakpKTepLuk8yIKKworIworIzogcmVnZXhwLmM6MTYyNAorbXNnaWQgIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY3OiBcXHoxIKS9pM7CvqTPpbOls6THpM+19rLEpLWk7KTGpKSk3qS7pPMiCisKKyMKKyM6IHJlZ2V4cC5jOjE2MzUKK21zZ2lkICJFNjg6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxceiIKK21zZ3N0ciAiRTY4OiBcXHogpM645aTLydTAtaTKyri7+qSspKKk6qTepLekvyIKKworIworIzogcmVnZXhwLmM6MTY4NAorbXNnaWQgIkU2OTogTWlzc2luZyBdIGFmdGVyICVzJSVbIgorbXNnc3RyICJFNjk6ICVzJSVbIKTOuOWkyyBdIKSspKKk6qTepLuk8yIKKworIzogcmVnZXhwLmM6MTcwMAorbXNnaWQgIkU3MDogRW1wdHkgJXMlJVtdIgorbXNnc3RyICJFNzA6ICVzJSVbXSCkrLb1pMekuSIKKworIworIzogcmVnZXhwLmM6MTc2MAorbXNnaWQgIkU3MTogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXMlJSIKK21zZ3N0ciAiRTcxOiAlcyUlIKTOuOWky8nUwLWkysq4u/qkrKSipOqk3qS3pL8iCisKKyM6IHJlZ2V4cC5jOjI1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6ICVzey4uLn0gxuKky8q4y6GlqKXpobykrKSipOqk3qS5IgorCisjOiByZWdleHAuYzoyODYzIHJlZ2V4cC5jOjMwMTYKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTogpa+l6aXDpbel5aTLpOik6sPmw8c7IMC1tazJvbi9pKzKo7uosuGkrqTrpKuk4j8iCisKKyM6IHJlZ2V4cC5jOjMwMDQgcmVnZXhwLmM6MzAxMworbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogpdGlv6G8pfOky6TopOuluaW/pcOlr8nUwq2lqKXpobykx6S5IgorCisjOiByZWdleHAuYzozMjU4Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAis7DJ9KTOyfTKrLO6xfY6XG4iCisKKyM6IHNjcmVlbi5jOjIxNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkILnUpKzA3r72pN6k7KTepLekvyIKKworIzogc2NyZWVuLmM6Nzk1OQorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiILK+wdvD1rS5IgorCisjOiBzY3JlZW4uYzo3OTYzCittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiDD1rS5IgorCisjOiBzY3JlZW4uYzo3OTY4Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiDIv8W+IgorCisjOiBzY3JlZW4uYzo3OTcwCittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiIMHexv4iCisKKyM6IHNjcmVlbi5jOjc5NzMKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAowd7G/ikiCisKKyM6IHNjcmVlbi5jOjc5NzUKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKMPWtLkpIgorCisjOiBzY3JlZW4uYzo3OTc3Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAosr7B28PWtLkpIgorCisjOiBzY3JlZW4uYzo3OTgwCittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIKXYpdal6aWkIgorCisjOiBzY3JlZW4uYzo3OTkxCittc2dpZCAiIEFyYWJpYyIKK21zZ3N0ciAiIKWipeml06WiIgorCisjOiBzY3JlZW4uYzo3OTk0Cittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiICi4wLjsKSIKKworIzogc2NyZWVuLmM6Nzk5OAorbXNnaWQgIiAocGFzdGUpIgorbXNnc3RyICIgKMW9pOrJ1aSxKSIKKworIzogc2NyZWVuLmM6ODAxMQorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiCl06W4peWloqXrIgorCisjOiBzY3JlZW4uYzo4MDEyCittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgpdOluKXlpaKl6yC51CIKKworIzogc2NyZWVuLmM6ODAxMworbXNnaWQgIiBWSVNVQUwgQkxPQ0siCittc2dzdHIgIiCl06W4peWloqXrILbrt8EiCisKKyM6IHNjcmVlbi5jOjgwMTQKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIgpbul7KWvpcgiCisKKyM6IHNjcmVlbi5jOjgwMTUKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiC51LvYuP7BqsLyIgorCisjOiBzY3JlZW4uYzo4MDE2Cittc2dpZCAiIFNFTEVDVCBCTE9DSyIKK21zZ3N0ciAiILbrt8HBqsLyIgorCisjIG1zZ2lkICIgQkxPQ0siCisjIG1zZ3N0ciAiIKXWpe2lw6WvIgorIyBtc2dpZCAiIExJTkUiCisjIG1zZ3N0ciAiILnUIgorIzogc2NyZWVuLmM6ODAzMSBzY3JlZW4uYzo4MDk0Cittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICK1rc+/w+YiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICK+5aTepMe4obr3pLekv6TOpMeyvKTLzOGk6qTepLkiCisKKyM6IHNlYXJjaC5jOjM4Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICKyvKTepMe4obr3pLekv6TOpMe+5aTLzOGk6qTepLkiCisKKyM6IHNlYXJjaC5jOjUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiDMtbj6pMq4obr3yri7+s7zpMekuTogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IL7lpN6kx7ihuvekt6S/pLGk7KTJs7rF9rLVveqkz6SipOqk3qS7pPM6ICVzIgorCisjOiBzZWFyY2guYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiCyvKTepMe4obr3pLekv6SxpOykybO6xfay1b3qpM+koqTqpN6ku6TzOiAlcyIKKworIzogc2VhcmNoLmM6MTI0OQorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogJzsnIKTOpKKkyKTLpM8gJz8nIKSrICcvJyCkrLT8wtSktaTspMakpKTrIgorCisjOiBzZWFyY2guYzozNzU4Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAowbCky87ztfOkt6S/s7rF9rLVveqk8rTepOApIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3NzgKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gpaSl86WvpeuhvKXJpLWk7KS/pdWloaWkpesiCisKKyM6IHNlYXJjaC5jOjM3ODAKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICKk36TEpKuk6qTepLuk8yAiCisKKyM6IHNlYXJjaC5jOjM3ODEKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICKl0aW5pMsgLS0tLVxuIgorCisjOiBzZWFyY2guYzozODIwCittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgICi0+6TLzvO18ykiCisKKyM6IHNlYXJjaC5jOjM4MjIKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICCk36TEpKuk6qTepLuk8yIKKworIzogc2VhcmNoLmM6Mzg3NAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAipaSl86WvpeuhvKXJpLWk7KS/pdWloaWkpeuk8qW5pa2l46Xzw+Y6ICVzIgorCisjOiBzZWFyY2guYzo0MDkyCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiC4vbrfudSky7O6xfakrKSipOqk3qS5IgorCisjOiBzZWFyY2guYzo0MjM1Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIsG0pMakzqWkpfOlr6XrobylyaS1pOykv6XVpaGlpKXrpKyk36TEpKuk6qTepLekvyIKKworIzogc2VhcmNoLmM6NDIzNworbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICKlpKXzpa+l66G8pcml1aWhpaSl66TPpKKk6qTepLuk8yIKKworIzogc2VhcmNoLmM6NDI1MworbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogxOq1waTypN+kxKSxpOmk7KTepLuk8yIKKworIzogc2VhcmNoLmM6NDI1NQorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogpdGlv6G8pfOk8qTfpMSksaTppOyk3qS7pPMiCisKKyM6IHN5bnRheC5jOjMwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IMnUwLWkyrD6v/Skx6S5OiAlcyIKKworIzogc3ludGF4LmM6MzIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogpL2kzqTopKakyrm9yrilr6Xppbmlv6TPpKKk6qTepLuk8zogJXMiCisKKyM6IHN5bnRheC5jOjMzOTQKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIqSzpM6l0KXDpdWloaTLxOq1waS1pOykv7m9yrjN18HHpM+koqTqpN6ku6TzIgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJDuMC47Mn3pbOl4aXzpcikq6TpxrG0/MPmIgorCisjOiBzeW50YXguYzozNDEwCittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAiyPPGsbT8IgorCisjOiBzeW50YXguYzozNDEzCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICLGsbT8s6u7zyAiCisKKyM6IHN5bnRheC5jOjM0MTUgc3ludGF4LmM6MzQ5MAorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIiC51MGwKKXIpcOl17nUpOik6qTiKSIKKworIzogc3ludGF4LmM6MzQyMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tILm9yrjGsbT8zdfBxyAtLS0iCisKKyM6IHN5bnRheC5jOjM0MjUKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorIs3Xwce+5aTHxrG0/MPmIgorCisjOiBzeW50YXguYzozNDMxCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tILm9yrjN18HHIC0tLSIKKworIzogc3ludGF4LmM6MzQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogpL2kzqTopKakyrm9yrilr6Xppbmlv6TPpKKk6qTepLuk8zogJXMiCisKKyM6IHN5bnRheC5jOjM0ODAKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAibWluaW1hbCIKKworIzogc3ludGF4LmM6MzQ4NworbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICJtYXhpbWFsIgorCisjOiBzeW50YXguYzozNDk5Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgs7rF9iAiCisKKyM6IHN5bnRheC5jOjM1MDEKK21zZ2lkICIgbGluZSBicmVha3MiCittc2dzdHIgIiC4xKTOsv651CIKKworIzogc3ludGF4LmM6NDEzNQorbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogpLOks6THpM+lsKXrobyl16TPtfayxKS1pOyk3qS7pPMiCisKKyM6IHN5bnRheC5jOjQxNTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIgorbXNnc3RyICJFMzk0OiAlcyCkzsjPsM/N18HHpKyk36TEpKuk6qTepLuk8yIKKworIzogc3ludGF4LmM6NDE4NworbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiCks6TOvuy96qTHpM+w+r/0Y29udGFpbnOkz7X2ssSktaTspMakpKTepLuk8yIKKworIzogc3ludGF4LmM6NDE5OAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiCks6TOvuy96qTHpM+w+r/0Y29udGFpbmVkaW6kz7X2ssSktaTspMakpKTepLuk8yIKKworIzogc3ludGF4LmM6NDI3NgorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiCl1aWhpaSl68y+pKzJrM3XpMekuSIKKworIzogc3ludGF4LmM6NDYxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6ICc9JyCkrKSipOqk3qS7pPM6ICVzIgorCisjOiBzeW50YXguYzo0NzcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiCw+r/0pKzCraTqpN6ku6TzOiC5vcq4yM+wzyAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiClr6Xppbmlv6Ssu9jE6qS1pOykxqSkpN6ku6TzIgorCisjOiBzeW50YXguYzo1MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IKXRpb+hvKXztujA2qTqpKyk36TEpKuk6qTepLuk8zogJXMiCisKKyM6IHN5bnRheC5jOjUyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogpdGlv6G8pfOkzqSipMiky6W0pd+krKSipOqk3qS5OiAlcyIKKworIzogc3ludGF4LmM6NTMwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6ILm9yrjGsbT8OiDPosKzudSl0aW/obyl86SsMsXZu9jE6qS1pOyk3qS3pL8iCisKKyM6IHN5bnRheC5jOjUzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiDJ1MC1pMqw+r/0pMekuTogJXMiCisKKyM6IHN5bnRheC5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogxfmkt6SkIHNpZ24gpKykoqTqpN6ku6TzOiAlcyIKKworIzogc3ludGF4LmM6NTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6ILb1pM6w+r/0OiAlcyIKKworIzogc3ludGF4LmM6NTQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyCkz6WzpbOkx6TPtfayxKS1pOykxqSkpN6ku6TzIgorCisjOiBzeW50YXguYzo1NDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgpM/G4s3GpeqluaXIpM7A6MaspMekyqSxpOyk0KTKpOmkyqSkIgorCisjOiBzeW50YXguYzo1NTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IMykw86kzqWwpeuhvKXXzL46ICVzIgorCisjOiBzeW50YXguYzo1NzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogzLW4+qTKIDpzeW50YXggpM6ltaXWpbOl3qXzpck6ICVzIgorCisjOiBzeW50YXguYzo2MTM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiClz6WkpemlpKXIpbCl66G8pdekrKTfpMSkq6TqpN6ku6TzOiAlcyIKKworIzogc3ludGF4LmM6NjE1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogsPq/9KSsvbzKrKTHpM+kyqSkOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogsPq/9KSswr+kuaSupN6kuTogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE4NQorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDogpbCl66G8pdekrMDfxOqktaTspMakpKTrpM6kx6XPpaSl6aWkpcil6qXzpa+kz8y1u+uktaTspN6kuSIKKworIzogc3ludGF4LmM6NjMxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiDNvbT8pLukzMaxpLggc2lnbiCkx6S5OiAlcyIKKworIzogc3ludGF4LmM6NjM1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiDGsaS4IHNpZ24gpKykoqTqpN6ku6TzOiAlcyIKKworIzogc3ludGF4LmM6NjM3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogsPq/9KSspKKk6qTepLuk8zogJXMiCisKKyM6IHN5bnRheC5jOjY0MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IMnUwLWkysPNpMekuTogJXMiCisKKyM6IHN5bnRheC5jOjY1MzQKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiDMpMPOpM7BsLfKv6ekx6S5IgorCisjOiBzeW50YXguYzo2NTQ1Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogzKTDzqTOx9i3yr+npMekuSIKKworIzogc3ludGF4LmM6NjYwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IKWrpemhvMy+pOTI1rnmpPLHp7yxpMekraTepLuk8zogJXMiCisKKyM6IHN5bnRheC5jOjY4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMjogdGVybWluYWwgY29kZSB0b28gbG9uZzogJXMiCittc2dzdHIgIkU0MjI6IL2qw7yls6G8pcmkrMS5pLmkrqTepLk6ICVzIgorCisjOiBzeW50YXguYzo2ODU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiDJ1MC1pMqw+r/0pMekuTogJXMiCisKKyM6IHN5bnRheC5jOjczODgKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiDCv6SvpM6w26TKpOulz6WkpemlpKXIwrDAraSsu8ik76TspLmkrqTGpKSk3qS5IgorCisjOiBzeW50YXguYzo3OTA5Cittc2dpZCAiRTY2OTogVW5wcmludGFibGUgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIkU2Njk6IKWwpeuhvKXXzL6ky7D1uv7J1LLEx72kysq4u/qkrKSipOqk3qS5IgorCisjLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorIy4gKiBnaXZlIGEgd2FybmluZy4KKyM6IHN5bnRheC5jOjc5MTYKK21zZ2lkICJXMTg6IEludmFsaWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIlcxODogpbCl66G8pdfMvqTLydTAtaTKyri7+qSspKKk6qTepLkiCisKKyM6IHRhZy5jOjkwCittc2dpZCAiRTU1NTogYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NTogpb+lsKW5pb+lw6WvpM7L9sj4pMekuSIKKworIzogdGFnLmM6OTEKK21zZ2lkICJFNTU2OiBhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU2OiClv6Wwpbmlv6XDpa+kzsDoxqykx6S5IgorCisjOiB0YWcuYzo0MTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNToguse96aTOs7rF9qW/pbCk8sS2pKikxszhpOuks6TIpM+kx6StpN6ku6TzIgorCisjOiB0YWcuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IKW/pbCkrKTfpMSkq6TqpN6ku6TzOiAlcyIKKworIzogdGFnLmM6NTgzCittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSBraW5kIHRhZyIKKworIzogdGFnLmM6NTg2Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICKl1aWhpaSl61xuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzQ0Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICLBqsLypLmk68jWueak8sb+zs+kt6TGpK+kwKS1pKQgKDxDUj6kx8Pmu98pOiAiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogs7rF9qW/pbCkrDGkxKTApLGkt6SrpKKk6qTepLuk8yIKKworIzogdGFnLmM6Nzg2Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODoguse45aTLs7rF9qS5pOulv6WwpPLEtqSopMa/yqTgpLOkyKTPpMekraTepLuk8yIKKworIzogdGFnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICKl1aWhpaSl6yBcIiVzXCIgpKykoqTqpN6ku6TzIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgIqW/pbAgJWQgKMG0JWQlcykiCisKKyM6IHRhZy5jOjgyNgorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgpKukvaTssMq+5SIKKworIzogdGFnLmM6ODI4Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAgpb+lsKTysNukyqTrY2FzZaTHu8jN0aS3pN6kuSEiCisKKyM6IHRhZy5jOjg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTogpdWloaWkpesgXCIlc1wiIKSspKKk6qTepLuk8yIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIFRPIKW/pbAgICAgICAgIEZST00gudQgICAgaW4gZmlsZS90ZXh0IgorCisjOiB0YWcuYzoxMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIqW/pbCl1aWhpaSl6yAlcyCk8rihuvfD5iIKKworIzogdGFnLmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogpb+lsKXVpaGlpKXrpM6l0aW5pKwgJXMgpMvA2qTqvM6kxqTppOyk3qS3pL9cbiIKKworIzogdGFnLmM6MjIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogpb+lsKXVpaGlpKXrIFwiJXNcIiCkzqXVpamhvKXepcOlyKTLpail6aG8pKykoqTqpN6kuSIKKworIzogdGFnLmM6MjIwNworIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIsS+wbCkziAlbGQgpdClpKXIIgorCisjOiB0YWcuYzoyMjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogpb+lsKXVpaGlpKXrpKylvaG8pciktaTspMakpKTepLuk8zogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoyMjgwCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiClv6WwpdWloaWkpeukrKSipOqk3qS7pPMiCisKKyM6IHRhZy5jOjMwMTYKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiClv6WwpdGlv6G8pfOk8qTfpMSksaTppOyk3qS7pPMiCisKKyM6IHRhZy5jOjMwMjcKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IKW/pbCk8qTfpMSksaTppOykyqSkpM6kx8OxpMu/5MKspLek3qS5ISIKKworIzogdGVybS5jOjE3NTkKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicgpM/MpMPOpMekuS4guL251KTOwcik37n+pN/DvMv2pM+8oaTOpMikqqTqpMekuToiCisKKyM6IHRlcm0uYzoxNzgzCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICK+ys6sw82k8ryhpM6k6KSmpMvA38TqpLek3qS5ICciCisKKyM6IHRlcm0uYzoyMTQxCittc2dpZCAiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJFNTU3OiB0ZXJtY2FwpdWloaWkpeuk8rOrpLGk3qS7pPMiCisKKyM6IHRlcm0uYzoyMTQ1Cittc2dpZCAiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJFNTU4OiB0ZXJtaW5mb6TLw7zL9qWopfOlyKXqpPKk36TEpLGk6aTspN6ku6TzIgorCisjOiB0ZXJtLmM6MjE0NworbXNnaWQgIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTU5OiB0ZXJtY2FwpMvDvMv2pail86XIpeqk8qTfpMSksaTppOyk3qS7pPMiCisKKyM6IHRlcm0uYzoyMzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiB0ZXJtY2FwpMsgXCIlc1wiIKTOpail86XIpeqkrKSipOqk3qS7pPMiCisKKyM6IHRlcm0uYzoyNzgwCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IMO8y/akyyBcImNtXCIgtaHHvaSsyazN16THpLkiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5OTAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIMO8y/alraG8IC0tLSIKKworIzogdWkuYzoyNTgKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICK/t6S3pKSlt6Wnpeuk8rWvxrCkt6TepLlcbiIKKworIzogdWkuYzoxODQxCittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogxv7Oz6Tyxsm5/qTfw+akzqWopemhvKTLpOik6r2qzrukt6TepLkuLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzo0MDUKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIrLEx72kyqWipfOlyaWlpM+koqTqpN6ku6TzOiCkyKTqpKKkqKS6wrOksaTepLkiCisKKyM6IHVuZG8uYzo1NjEKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiC51MjWueakrLTWsOOkw6TGpKSk3qS5IgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIjEgstW96srRubmkt6TepLekvyIKKworIzogdW5kby5jOjc1OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkILLVverK0bm5pLek3qS3pL8iCisKKyM6IHVuZG8uYzo4MTIKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogpaKl86XJpaWl6qW5pcikrLL1pOykxqSkpN6kuSIKKworIzogdW5kby5jOjg0NAorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiCloqXzpcmlpbnUpKykoqTqpN6ku6TzIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6MTczMQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgpdOlw6XIIEdVSSDIxyIKKworIzogdmVyc2lvbi5jOjE3MzMKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIKXTpcOlyCBHVUkgyMciCisKKyM6IHZlcnNpb24uYzoxNzM2Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgaW4gV2luMzJzIKXiobylySIKKworIzogdmVyc2lvbi5jOjE3MzgKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIHdpdGggT0xFIKW1pd2hvKXIIgorCisjOiB2ZXJzaW9uLmM6MTc0MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIKXTpcOlyCCls6Xzpb2hvKXrIMjHIgorCisjOiB2ZXJzaW9uLmM6MTc0NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAxNiCl06XDpcggyMciCisKKyM6IHZlcnNpb24uYzoxNzQ5Cittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIKXTpcOlyCBNUy1ET1MgyMciCisKKyM6IHZlcnNpb24uYzoxNzUxCittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IKXTpcOlyCBNUy1ET1MgyMciCisKKyM6IHZlcnNpb24uYzoxNzU3Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSDIxyIKKworIzogdmVyc2lvbi5jOjE3NTkKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCDIxyIKKworIzogdmVyc2lvbi5jOjE3NjIKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIMjHIgorCisjOiB2ZXJzaW9uLmM6MTc2NworbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJSSVNDIE9TIMjHIgorCisjOiB2ZXJzaW9uLmM6MTc3NworbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyLFrM3RutGl0aXDpcE6ICIKKworIzogdmVyc2lvbi5jOjE4MDMgdmVyc2lvbi5jOjIxNzEKK21zZ2lkICJNb2RpZmllZCBieSAiCittc2dzdHIgIk1vZGlmaWVkIGJ5ICIKKworIzogdmVyc2lvbi5jOjE4MTAKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiQ29tcGlsZWQgIgorCisjOiB2ZXJzaW9uLmM6MTgxMworbXNnaWQgImJ5ICIKK21zZ3N0ciAiYnkgIgorCisjOiB2ZXJzaW9uLmM6MTgyNQorbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiSHVnZSDIxyAiCisKKyM6IHZlcnNpb24uYzoxODI4Cittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkJpZyDIxyAiCisKKyM6IHZlcnNpb24uYzoxODMxCittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIsTMvu8gyMcgIgorCisjOiB2ZXJzaW9uLmM6MTgzNAorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlNtYWxsIMjHICIKKworIzogdmVyc2lvbi5jOjE4MzYKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlRpbnkgyMcgIgorCisjOiB2ZXJzaW9uLmM6MTg0MgorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAid2l0aG91dCBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg0NworbXNnaWQgIndpdGggR1RLMi1HTk9NRSBHVUkuIgorbXNnc3RyICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NDkKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg1MworbXNnaWQgIndpdGggR1RLMiBHVUkuIgorbXNnc3RyICJ3aXRoIEdUSzIgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NTUKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICJ3aXRoIEdUSyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg2MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgIndpdGggWDExLU1vdGlmIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODY0Cittc2dpZCAid2l0aCBYMTEtbmVYdGF3IEdVSS4iCittc2dzdHIgIndpdGggWDExLW5lWHRhdyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg2NgorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NzAKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAid2l0aCBCZU9TIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODczCittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAid2l0aCBQaG90b24gR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NzYKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgIndpdGggR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NzkKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJ3aXRoIENhcmJvbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg4MgorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAid2l0aCBDb2NvYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg4NQorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgIndpdGggKKWvpemlt6XDpa8pIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODk2Cittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICC1oce9pM6w7M33IM2tuPooKykvzLW4+igtKVxuIgorCisjOiB2ZXJzaW9uLmM6MTkwOAorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgpbeluaXGpeAgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkxMworbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICCl5qG8pbYgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkxOAorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICDC6DKl5qG8pbYgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkyMworbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICDC6DOl5qG8pbYgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkyOAorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgpeahvKW2IGV4cmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkzMworbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgwugypeahvKW2IGV4cmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTkzOQorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICClt6W5pcal4CBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk0MworbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgIKXmobyltiBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk0NworbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIMLoMqXmobyltiBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk1MgorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIMLoM6XmobyltiBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk1OQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIKW3pbmlxqXgpeGly6Xlobw6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk2NworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgIL7Kzqy7/qTOICRWSU06IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk3MworbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAivsrOrLv+pM4gJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk3NworbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIqWzpfOl0aWkpes6ICIKKworIzogdmVyc2lvbi5jOjE5ODMKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICKls6XzpdGlpKXpOiAiCisKKyM6IHZlcnNpb24uYzoxOTg4Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICKl6qXzpa86ICIKKworIzogdmVyc2lvbi5jOjE5OTMKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICKlx6XQpcOlsKXTpeulySIKKworIzogdmVyc2lvbi5jOjIwMzIKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgSU1wcm92ZWQiCisKKyM6IHZlcnNpb24uYzoyMDM0Cittc2dpZCAidmVyc2lvbiAiCittc2dzdHIgInZlcnNpb24gIgorCisjOiB2ZXJzaW9uLmM6MjAzNQorbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAiYnkgQnJhbSBNb29sZW5hYXIgwr4uIgorCisjOiB2ZXJzaW9uLmM6MjAzOQorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSCkz6Wqobyl16Xzpb2hvKW5pMekoqTqvKvNs6TLx9vJ27LEx72kx6S5IgorCisjOiB2ZXJzaW9uLmM6MjA0MQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICKlpqWspfOlwKTOt8Ok3qTspMqkpLvStqGkv6TBpMux5731pPIhIgorCisjOiB2ZXJzaW9uLmM6MjA0MgorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIr7cutmkyr7wyvOkzyAgICAgICAgICAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAiCisKKyM6IHZlcnNpb24uYzoyMDQ0Cittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAivarOu6S5pOuky6TPICAgICAgICAgICA6cTxFbnRlcj4gICAgICAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjIwNDUKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICKlqqXzpemlpKXzpdil66XXpM8gICAgIDpoZWxwPEVudGVyPiCkqyA8RjE+ICAgIgorCisjOiB2ZXJzaW9uLmM6MjA0NgorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgIqXQobyluKXnpfO+8MrzpM8gICAgICAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAiCisKKyM6IHZlcnNpb24uYzoyMDQ5Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIlZpuN+0uaXiobylyaTHxrC67sPmIgorCisjOiB2ZXJzaW9uLmM6MjA1MAorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgIlZpbb/kvqnDzaTLpLmk66TLpM8gICAgOnNldCBub2NwPEVudGVyPiAgICAgICAiCisKKyM6IHZlcnNpb24uYzoyMDUxCittc2dpZCAidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAivty62aTKvvDK86TPICAgICAgICAgICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiIKKworIzogdmVyc2lvbi5jOjIwNjYKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICK+3LrZpM+l4aXLpeWhvKTOIKXYpeul16KquMm7+SCk8ruyvsikt6TGsryktaSkICAgIgorCisjOiB2ZXJzaW9uLmM6MjA2OAorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIqXiobylycy1pMe8wrnUw+YsIKW/paSl16S3pL/KuLv6pKzB3sb+pLWk7KTepLkiCisKKyM6IHZlcnNpb24uYzoyMDY5Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAipeGly6XlobykziDK1L24oqrBtMLOwN/E6qKqwd7G/ii96b+0vNQppeKhvKXJwNrC2CIKKworIzogdmVyc2lvbi5jOjIwNzAKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCkx6Xiobylyc2tpMsgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MjA3NAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIqXhpcul5aG8pM4gytS9uKKqwbTCzsDfxOqiqlZpuN+0uaXiobylycDawtggICAgICAiCisKKyM6IHZlcnNpb24uYzoyMDc1Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgpMdWaW2kyKS3pMbGsLruICAgICIKKworIzogdmVyc2lvbi5jOjIxMjIKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIlZpbaTOs6vIr6Tysf6x56S3pMakr6TApLWkpCEiCisKKyM6IHZlcnNpb24uYzoyMTIzCittc2dpZCAiQmVjb21lIGEgcmVnaXN0ZXJlZCBWaW0gdXNlciEiCittc2dzdHIgIlZpbaTOxdDPv6XmobyltqTLpMqkw6TGpK+kwKS1pKQhIgorCisjOiB2ZXJzaW9uLmM6MjEyNgorbXNnaWQgInR5cGUgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIr7cutmkyr7wyvOkzyAgICAgICAgICAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAiCisKKyM6IHZlcnNpb24uYzoyMTI3Cittc2dpZCAidHlwZSAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAivty62aTKvvDK86TPICAgICAgICAgICA6aGVscCByZWdpc3RlcjxFbnRlcj4gICIKKworIzogdmVyc2lvbi5jOjIxMjkKK21zZ2lkICJtZW51ICBIZWxwLT5TcG9uc29yL1JlZ2lzdGVyICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICK+3LrZpM+l4aXLpeWhvKTOIKXYpeul16Kqpbml3aXzpbWhvC/F0M+/IKTyu7K+yKS3pMayvKS1pKQgICAiCisKKyM6IHZlcnNpb24uYzoyMTM5Cittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAiICAgt9m58DogV2luZG93cyA5NS85OC9NZSCk8rihvdAgICIKKworIzogdmVyc2lvbi5jOjIxNDIKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICIgvty62aTKvvDK86TPICAgICAgICAgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIgorCisjOiB3aW5kb3cuYzoyMDMKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogpdel7KXTpeWhvKWmpaOl86XJpaakrKSipOqk3qS7pPMiCisKKyM6IHdpbmRvdy5jOjU4MQorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6ILq4vuWkyLGmsryk8saxu/6ky8qss+SkuaTrpLOkyKTPpMekraTepLuk8yIKKworIzogd2luZG93LmM6MTM0MAorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0Mzogwr6kzqWmpaOl86XJpaakrMqss+SktaTspMakpKTru/6ky6TPveey86THpK2k3qS7pPMiCisKKyM6IHdpbmRvdy5jOjE4MzYKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6ILrHuOWkzqWmpaOl86XJpaak8srEpLik66SzpMikz6THpK2k3qS7pPMiCisKKyM6IHdpbmRvdy5jOjI1NjcKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAitPuky6WmpaOl86XJpaakzzGkxKS3pKukoqTqpN6ku6TzIgorCisjOiB3aW5kb3cuYzoyNjE0Cittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IMK+pM6lpqWjpfOlyaWmpMukz8rRubmkrKSipOqk3qS5IgorCisjOiB3aW5kb3cuYzo0NDgwCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogpauhvKW9peukzrK8pMul1aWhpaSl68y+pKykoqTqpN6ku6TzIgorCisjOiB3aW5kb3cuYzo0NTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogcGF0aKTLpM8gXCIlc1wiIKTIpKSkpqXVpaGlpKXrpKykoqTqpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTIzMiBpZl9wZXJsLnhzOjMyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiCl6aWkpdal6aXqICVzIKType2hvKXJpMekraTepLuk86THpLekvyIKKworIzogaWZfcGVybC54czo1NTQKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgUGVybCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisipLOkzqWzpd6l86XJpM/Mtbj6pMekuSwgpLSk4aTzpMqktaSkOiBQZXJspemlpKXWpeml6qType2hvKXJpMekraTepLuk86THpLekvy4iCisKKyM6IGlmX3BlcmwueHM6NjA3Cittc2dpZCAiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIgorbXNnc3RyICIiCisiRTI5OTogpbWl86XJpdylw6Wvpbmkx6TPIFNhZmUgIgorIqXipbil5aG8peuk8rvIzdGkt6TKpKRQZXJspbmlr6XqpdelyKTPttikuKTppOykxqSkpN6kuSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODMKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIrPGpdWloaWkpeuk8srMobmkziBWaW0gpMfK1L24KCZNKSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODkKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIsG0pdWloaWkpeuk8jGkxKTOIFZpbSCkx8rUvbgoJlYpIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICJWaW0gpMe6ucqsytS9uCgmRCkiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjExCittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIlZpbSCkx8rUvbgoJlYpIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYzMworbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorbXNnc3RyICK0+8K4pM4gVmltIKTHytS9uCAtICYiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NzQ2Cittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIsGqwvKktaTspL+l1aWhpaSl66TyIFZpbSCkx8rUvbgiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg1IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY2Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICK1r8awpail6aG8OiBndmltIKTLpdGluaSsxMykw6TGpKSk66Srs86kq6ThpMakr6TApLWkpCEiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg2IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTAwIEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY3Cittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImd2aW1leHQuZGxsIKWopemhvCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTkKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIqXRpbmkrMS5pLmkrqTepLkhIgorCisjOiBnbG9iYWxzLmg6MTAyMgorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tpdClw6XVpaGky7nUpKykoqTqpN6ku6TzLS0iCisKKyMuCisjLiAqIFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBzaGFyZWQgYXJlIGluY2x1ZGVkIGhlcmUuCisjLiAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyMuCisjOiBnbG9iYWxzLmg6MTE4NQorbXNnaWQgIkU0NzA6IENvbW1hbmQgYWJvcnRlZCIKK21zZ3N0ciAiRTQ3MDogpbOl3qXzpcmkrMPmw8ektaTspN6kt6S/IgorCisjOiBnbG9iYWxzLmg6MTE4NgorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiCw+r/0pKzJrM3XpMekuSIKKworIzogZ2xvYmFscy5oOjExODcKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogXFwgpM645aTPIC8gpKsgPyCkqyAmIKTHpMqksaTspNCkyqTqpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTE4OQorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIkUxMTogpbOl3qXzpcml6aWkpfOkx6TPzLW4+qTHpLk7IDxDUj6kx7zCudQsIENUUkwtQ6THpOSk4aTrIgorCisjOiBnbG9iYWxzLmg6MTE5MQorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiIgorIkUxMjoguL2636TOpcelo6Xspa+lyKXqpOSlv6WwuKG696THpM9leHJjL3ZpbXJjpM6ls6XepfOlyaTPtfayxKS1pOyk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMTkzCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IDplbmRpZiCkrKSipOqk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMTk0Cittc2dpZCAiRTYwMDogTWlzc2luZyA6ZW5kdHJ5IgorbXNnc3RyICJFNjAwOiA6ZW5kdHJ5IKSspKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogOmVuZHdoaWxlIKSspKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjExOTYKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDp3aGlsZSCkzqTKpKQgOmVuZHdoaWxlIKSspKKk6qTepLkiCisKKyM6IGdsb2JhbHMuaDoxMTk4Cittc2dpZCAiRTEzOiBGaWxlIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTM6IKXVpaGlpKXrpKzCuLrfpLek3qS5ICghIKTyxMmyw6THvuW98SkiCisKKyM6IGdsb2JhbHMuaDoxMTk5Cittc2dpZCAiRTQ3MjogQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIkU0NzI6IKWzpd6l86XJpKy8usfUpLek3qS3pL8iCisKKyM6IGdsb2JhbHMuaDoxMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IMykw86kzqXVpaml86XIpbulw6XIOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTogzKTDzqTOpdWlqaXzpcg6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IKXVpaml86XIIFwiJXNcIiCkz7jHxOrJ/aTHpM+koqTqpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTIxMAorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiDG4sn0pail6aG8pMekuSIKKworIzogZ2xvYmFscy5oOjEyMTEKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAis+S5/qTepOyk3qS3pL8iCisKKyM6IGdsb2JhbHMuaDoxMjEyCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogzLW4+qTKpaKlyaXspbmkx6S5IgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkU0NzQ6IMy1uPqkyrD6v/Skx6S5IgorCisjOiBnbG9iYWxzLmg6MTIxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQ3NTogzLW4+qTKsPq/9KTHpLk6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTogzLW4+qTKvLCkx6S5OiAlcyIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogzLW4+qTKyM+wz6THpLkiCisKKyM6IGdsb2JhbHMuaDoxMjE5Cittc2dpZCAiRTQ3NjogSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJFNDc2OiDMtbj6pMqls6XepfOlyaTHpLkiCisKKyM6IGdsb2JhbHMuaDoxMjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiCkz6XHpaOl7KWvpcil6qTHpLkiCisKKyM6IGdsb2JhbHMuaDoxMjI0Cittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiDNvbT8pLukzMq4u/qkrCAnPScgpM7BsKTLpKKk6qTepLekvyIKKworIzogZ2xvYmFscy5oOjEyMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IFwiJXNcIigpIKTOpemlpKXWpeml6rjGvdCky7y6x9Skt6TepLekvyIKKworIzogZ2xvYmFscy5oOjEyMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogpemlpKXWpeml6qTOtNi/9CAlcyCk8qXtobylyaTHpK2k3qS7pPOkx6S3pL8iCisKKyM6IGdsb2JhbHMuaDoxMjM1Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IKXeobylr6TLzLW4+qTKudTI1rnmpKy72MTqpLWk7KTGpKSk3qS3pL8iCisKKyM6IGdsb2JhbHMuaDoxMjM2Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogpd6hvKWvpM/A38TqpLWk7KTGpKSk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjM3Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6ICdtb2RpZmlhYmxlJyCkrKWqpdWkyqTOpMcsIMrRubmkx6StpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTIzOAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogpbmlr6XqpdelyKTOxv6k7LvSpKy/vKS5pK6k3qS5IgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogyful1aWhpaSl66TPpKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IKS9pM6k6KSmpMrDu73Mxv7Oz6TPpKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNDEKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6ICEgpM+19rLEpLWk7KTGpKSk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjQzCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBHVUmkz7vIzdHJ1LLEx72kx6S5OiCls6XzpdGlpKXru/6ky8y1uPqky6S1pOykxqSkpN6kuSIKKworIzogZ2xvYmFscy5oOjEyNDYKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjogpdil1qXppaS47KTPu8jN0cnUssTHvaTHpLk6IKWzpfOl0aWkpeu7/qTLzLW4+qTLpLWk7KTGpKSk3qS5XG4iCisKKyM6IGdsb2JhbHMuaDoxMjQ5Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogpdql66W3paK47KTPu8jN0cnUssTHvaTHpLk6IKWzpfOl0aWkpeu7/qTLzLW4+qTLpLWk7KTGpKSk3qS5XG4iCisKKyM6IGdsb2JhbHMuaDoxMjUyCittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogpaKl6aXTpaK47KTPu8jN0cnUssTHvaTHpLk6IKWzpfOl0aWkpeu7/qTLzLW4+qTLpLWk7KTGpKSk3qS5XG4iCisKKyM6IGdsb2JhbHMuaDoxMjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkUyODogpL2kzqTopKakysy+pM6lz6WkpemlpKXIpbCl66G8pdekz6SipOqk3qS7pPM6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI1NworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogpN6kwKXGpa2luaXIpKzB3sb+pLWk7KTGpKSk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjU4Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogsMrBsKTLpbOl3qXzpcm51KSspKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNTkKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiCkvaTOpOikpqTKpd6lw6XUpfOlsKTPpKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNjAKK21zZ2lkICJFNDc5OiBObyBtYXRjaCIKK21zZ3N0ciAiRTQ3OTogs7rF9qTPpKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiCzusX2pM+koqTqpN6ku6TzOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNjIKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiCl1aWhpaSl68y+pKykoqTqpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI2MworbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogwLW1rMm9uL3D1rS5pKyk3qTAvMK51KS1pOykxqSkpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI2NAorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiCls6XepfOlyaSspN6kwLzCudSktaTspMakpKTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNjUKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiDAtbWsyb24vaSspN6kwLzCudSktaTspMakpKTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiDIz7DPu9jE6qTPtfayxKS1pOykxqSkpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI2OAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IL28yqykys3GzsykrKSipOqk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogJXMgpMikpKSmzL7BsKTOxdDPv6S1pOykv6W1obyl0KTPpKKk6qTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6IKXVpaGlpKXrICVzIKTyuu7ArqTHpK2k3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjc0Cittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiCw7Lv+pdWloaWkpeukzsy+wbCk8rzoxsCkx6StpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6IKXVpaGlpKXrIFwiJXNcIiCk8rOrpLGk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogpdWloaWkpesgJXMgpPLGybn+pOGk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjc3Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMzc6ILrHuOWkzsrRubmkrMrdwriktaTspMakpKTepLuk8yAoISCk8sTJssOkx8rRubmk8sfLtP4pIgorCisjOiBnbG9iYWxzLmg6MTI3OAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiCw+r/0pKy29aTHpLkiCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogv/TDzaSszde14aS1pOykxqSkpN6kuSIKKworIzogZ2xvYmFscy5oOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiClqKXpobyl1aWhpaSl6yAlcyCk8rOrpLGk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMjg2Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogpcelo6W5pdel7KWkpPKzq6SxpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI4OAorbXNnaWQgIkU0MTogT3V0IG9mIG1lbW9yeSEiCittc2dzdHIgIkU0MTogpeGl4qXqpKy/1KStssykxqTepLekvyEiCisKKyM6IGdsb2JhbHMuaDoxMjkwCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIqXRpb+hvKXzpM+k36TEpKuk6qTepLuk86THpLekvyIKKworIzogZ2xvYmFscy5oOjEyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NjogUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDg2OiCl0aW/obyl86TPpN+kxKSrpOqk3qS7pPOkx6S3pL86ICVzIgorCisjOiBnbG9iYWxzLmg6MTI5MworbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6ILD6v/Skz8C1pM7DzaTHpMqksaTspNCkyqTqpN6ku6TzIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTogwbCkzqXHpaOl7KWvpcil6qTLzOGk7KTepLuk8yIKKworIzogZ2xvYmFscy5oOjEyOTkKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiClqKXpobykz6SipOqk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiCzusX2yri7+s7zpKzHy8K7pLekxqSkpN6kuSIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiDJ1MC1pMrAtbWsyb24vaXXpe2lsKXppeCkx6S5IgorCisjOiBnbG9iYWxzLmg6MTMwMworbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTogJ3JlYWRvbmx5JyClqqXXpbel56XzpKzA38TqpLWk7KTGpKSk3qS5ICghIKTyxMmyw6THvuW98aStKSIKKworIzogZ2xvYmFscy5oOjEzMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0Njogxsm86MDszdHK0b/0IFwiJXNcIiCky8DfxOqkuaTrpLOkyKTPpMekraTepLuk8yIKKworIzogZ2xvYmFscy5oOjEzMDgKK21zZ2lkICJFNDc6IEVycm9yIHdoaWxlIHJlYWRpbmcgZXJyb3JmaWxlIgorbXNnc3RyICJFNDc6IKWopemhvKXVpaGlpKXrpM7Gybn+w+aky6WopemhvKSsyK/AuKS3pN6kt6S/IgorCisjOiBnbG9iYWxzLmg6MTMxMQorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiCltaXzpcml3KXDpa+luaTHpM+19qS1pOyk3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMzEzCittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogpLOks6THpM+19rLEpLWk7KTepLuk8yIKKworIzogZ2xvYmFscy5oOjEzMTYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IKW5pa+l6qG8pfOl4qG8pcmkzsDfxOqky6TPwtCx/qS3pMakpKTepLuk8yIKKworIzogZ2xvYmFscy5oOjEzMTgKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogzLW4+qTKpbmlr6Xtobyl687MpMekuSIKKworIzogZ2xvYmFscy5oOjEzMTkKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6ICdzaGVsbCcgpaql16W3peel86SstvWkx6S5IgorCisjOiBnbG9iYWxzLmg6MTMyMQorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogc2lnbiCkzqXHobylv6Tyxsm5/qThpN6ku6TzpMekt6S/IgorCisjOiBnbG9iYWxzLmg6MTMyMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IKW5pe+lw6XXpdWloaWkpeukzqWvpe2hvKW6u/6lqKXpobykx6S5IgorCisjOiBnbG9iYWxzLmg6MTMyNAorbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IKW/pbCluaW/pcOlr6SstvWkx6S5IgorCisjOiBnbG9iYWxzLmg6MTMyNQorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiCls6XepfOlyaSsyqO7qKS5pK6k3qS5IgorCisjOiBnbG9iYWxzLmg6MTMyNgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiDMvsGwpKzEuaS5pK6k3qS5IgorCisjOiBnbG9iYWxzLmg6MTMyNworbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiBbIKSswr+kuaSupN6kuSIKKworIzogZ2xvYmFscy5oOjEzMjgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogpdWloaWkpevMvqSswr+kuaSupN6kuSIKKworIzogZ2xvYmFscy5oOjEzMjkKK21zZ2lkICJFNDg4OiBUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICJFNDg4OiDNvsqspMrKuLv6pKy45aTtpMukoqTqpN6kuSIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiDMpMPOpM6l3qG8pa8iCisKKyM6IGdsb2JhbHMuaDoxMzMxCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiCl76WkpeulyaWrobylyaTyxbizq6THpK2k3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMzMzCittc2dpZCAiRTU5MTogJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiRTU5MTogJ3dpbmhlaWdodCcgpM8gJ3dpbm1pbmhlaWdodCcgpOik6r6upLWkr6THpK2k3qS7pPMiCisKKyM6IGdsb2JhbHMuaDoxMzM1Cittc2dpZCAiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIkU1OTI6ICd3aW53aWR0aCcgpM8gJ3dpbm1pbndpZHRoJyCk6KTqvq6ktaSvpMekraTepLuk8yIKKworIzogZ2xvYmFscy5oOjEzMzgKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDogvfG5/qTfw+akzqWopemhvCIKKworIzogZ2xvYmFscy5oOjEzMzkKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICKlvKXtpaulpqXzpcgiCisKKyM6IGdsb2JhbHMuaDoxMzQxCittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiCluaWvpeql16XIsMqzsKTHPFNJRD6krLvIpO+k7KTepLekvyIKKworIzogZ2xvYmFscy5oOjEzNDQKK21zZ2lkICJFNDQ5OiBJbnZhbGlkIGV4cHJlc3Npb24gcmVjZWl2ZWQiCittc2dzdHIgIkU0NDk6IMy1uPqkyrywpPK89aSxvOik6qTepLekvyIKKworIzogZ2xvYmFscy5oOjEzNDcKK21zZ2lkICJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIKK21zZ3N0ciAiRTQ2Mzogzs6w6KSsyt247qS1pOykxqSkpOukzqTHLCDK0bm5pMekraTepLuk8yIKZGlmZiAtLWdpdCBhL3NyYy9wby9qYS5zamlzLnBvIGIvc3JjL3BvL2phLnNqaXMucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1YzExMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9qYS5zamlzLnBvCkBAIC0wLDAgKzEsNjU4NyBAQAorIyBKYXBhbmVzZSB0cmFuc2xhdGlvbiBmb3IgVmltCQkJdmltOnNldCBmb2xkbWV0aG9kPW1hcmtlcjoKKyMKKyMgRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisjIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorIworIyBNVVJBT0tBIFRhcm8gPGtvcm9uQHRrYS5hdHQubmUuanA+LCAyMDAxLTQuCisjIExhc3QgQ2hhbmdlOiAyOS1BcHItMjAwNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFZpbSA2LjJcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNC0wNC0yOSAxMzoxNiswOTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wNC0yOSAxMzowMCswOTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNVVJBT0tBIFRhcm8gPGtvcm9uQHRrYS5hdHQubmUuanA+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTVVSQU9LQSBUYXJvIDxrb3JvbkB0a2EuYXR0Lm5lLmpwPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWNwOTMyXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOC1iaXRcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiCDb4Nig3SDQILwMYLCguCN7JCsgsWCq4LIgqKCzILFLCCPSZe5grWC3IK3Li4uIgorCisjOiBidWZmZXIuYzoxMDUKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiCDb4Nig3SDQILwjeyQrILFgquCyIKigsyCxSwgkbyCzILwjmeXcIK1gtyCty4uLiIKKworIzogYnVmZmVyLmM6ODA1Cittc2dpZCAiRTUxNTogTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICJFNTE1OiCJ8JX6grOC6oK9g2+DYoN0g0CCzYKgguiC3IK5gvEiCisKKyM6IGJ1ZmZlci5jOjgwNworbXNnaWQgIkU1MTY6IE5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICJFNTE2OiCN7Y+cgrOC6oK9g2+DYoN0g0CCzYKgguiC3IK5gvEiCisKKyM6IGJ1ZmZlci5jOjgwOQorbXNnaWQgIkU1MTc6IE5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiCittc2dzdHIgIkU1MTc6IJRqivyCs4Lqgr2Db4Nig3SDQILNgqCC6ILcgrmC8SIKKworIzogYnVmZmVyLmM6ODE3Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIjEgjMKCzINvg2KDdINAgqqJ8JX6grOC6oLcgrWCvSIKKworIzogYnVmZmVyLmM6ODE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgIiVkIIzCgsyDb4Nig3SDQIKqifCV+oKzguqC3IK1gr0iCisKKyM6IGJ1ZmZlci5jOjgyNAorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIjEgjMKCzINvg2KDdINAgqqN7Y+cgrOC6oLcgrWCvSIKKworIzogYnVmZmVyLmM6ODI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAiJWQgjMKCzINvg2KDdINAgqqN7Y+cgrOC6oLcgrWCvSIKKworIzogYnVmZmVyLmM6ODMxCittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICIxIIzCgsyDb4Nig3SDQIKqlGqK/IKzguqC3IK1gr0iCisKKyM6IGJ1ZmZlci5jOjgzMworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiJWQgjMKCzINvg2KDdINAgqqUaor8grOC6oLcgrWCvSIKKworIzogYnVmZmVyLmM6ODk0Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDoglc+NWIKzguqCvYNvg2KDdINAgs2CoILogtyCuYLxIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTMzCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IIOKg1iDZ5VcXI6mgrOC6oLpg2+DYoN0g0CCzYKgguiC3IK5gvEiCisKKyM6IGJ1ZmZlci5jOjk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFODY6IEJ1ZmZlciAlbGQgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU4Njogg2+DYoN0g0AgJWxkIILNgqCC6ILcgrmC8SIKKworIzogYnVmZmVyLmM6OTQ4Cittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6II3FjOOCzINvg2KDdINAgvCJeoKmgsSI2pOugs2CxYKrgtyCuYLxIgorCisjOiBidWZmZXIuYzo5NTAKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6II3Fj4mCzINvg2KDdINAguaC6JFPgtaCzYjak66CxYKrgtyCuYLxIgorCisjOiBidWZmZXIuYzo5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6IINvg2KDdINAICVsZCCCzJXPjViCzZXbkbaCs4LqgsSCooLcgrmC8SAoISCCxZXPjViC8JRqivwpIgorCisjOiBidWZmZXIuYzoxMDA1Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6II3FjOOCzINvg2KDdINAgs2J8JX6gsWCq4LcgrmC8SIKKworIzogYnVmZmVyLmM6MTUzOAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IIx4jZA6IIN0g0CDQ4OLlryCzIOKg1iDZ4KqkreCt4KsgtyCtyIKKworIzogYnVmZmVyLmM6MTcwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IINvg2KDdINAICVsZCCCqoLdgsKCqYLogtyCuYLxIgorCisjOiBidWZmZXIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5MzogJXMggsmVoZCUgsyKWZOWgqqCoILogtyCtYK9IgorCisjOiBidWZmZXIuYzoxOTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NDogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvciAlcyIKK21zZ3N0ciAiRTk0OiAlcyCCyYpZk5aCt4Lpg2+DYoN0g0CCzYKgguiC3IK5gvGCxYK1gr0iCisKKyM6IGJ1ZmZlci5jOjIzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgIo1zICVsZCIKKworIzogYnVmZmVyLmM6MjQyMAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IIKxgsyWvJFPgsyDb4Nig3SDQILNivmCyYKgguiC3IK3IgorCisjOiBidWZmZXIuYzoyNzEzCittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBblc+NWIKgguhdIgorCisjOiBidWZmZXIuYzoyNzE4Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJblqKV0o9XXSIKKworIzogYnVmZmVyLmM6MjcyMworbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIluQVoN0g0CDQ4OLXSIKKworIzogYnVmZmVyLmM6MjcyNAorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIluTx42eg0eDiYFbXSIKKworIzogYnVmZmVyLmM6MjcyNiBmaWxlaW8uYzoyMDQ5Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW5PHjZ6Q6pdwXSIKKworIzogYnVmZmVyLmM6Mjc0NworbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAiMSCNcyAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc0OQorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkII1zIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzU2Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIo1zICVsZCAokVORzCAlbGQpIC0tJWQlJS0tIGNvbCAiCisKKyM6IGJ1ZmZlci5jOjI4NjQKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIluWs5HoXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyOTA0Cittc2dpZCAiaGVscCIKK21zZ3N0ciAig3eDi4N2IgorCisjOiBidWZmZXIuYzozNDYzIHNjcmVlbi5jOjUwMzgKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIluDd4OLg3ZdIgorCisjOiBidWZmZXIuYzozNDk1IHNjcmVlbi5jOjUwNDQKK21zZ2lkICJbUHJldmlld10iCittc2dzdHIgIluDdoOMg3KDhYFbXSIKKworIzogYnVmZmVyLmM6Mzc3NQorbXNnaWQgIkFsbCIKK21zZ3N0ciAikVOCxCIKKworIzogYnVmZmVyLmM6Mzc3NQorbXNnaWQgIkJvdCIKK21zZ3N0ciAilpaU9iIKKworIzogYnVmZmVyLmM6Mzc3NworbXNnaWQgIlRvcCIKK21zZ3N0ciAikOaTqiIKKworIzogYnVmZmVyLmM6NDUyMworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyCDb4Nig3SDQIOKg1iDZzpcbiIKKworIzogYnVmZmVyLmM6NDU1NgorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW4NHg4mBW4OKg1iDZ10iCisKKyM6IGJ1ZmZlci5jOjQ1NjkgbWVtbGluZS5jOjE1MjAKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIluWs5HoXSIKKworIzogYnVmZmVyLmM6NDg4MgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIINUg0ODkyAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ5MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiJXMggsyDVINDg5M6IgorCisjOiBidWZmZXIuYzo0OTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICCNcz0lbGQgII6vlcqOcT0lZCAglryRTz0lcyIKKworIzogZGlmZi5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogJWxkIIjIj+OCzINvg2KDdINAgs1kaWZmgsWCq4LcgrmC8SIKKworIzogZGlmZi5jOjcwOQorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiCNt5WqgvCN7JCsgsWCq4LcgrmC8SAiCisKKyM6IGRpZmYuYzo4MTQKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICKDcINig2CDdINAg0ODiyIKKworIzogZGlmZi5jOjEwNjUKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IGRpZmaCzI9vl82C8JPHjZ6C34LcgrmC8SIKKworIzogZGlmZi5jOjE4MTUKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogjLuN3YLMg2+DYoN0g0CCzY23laqDgoFbg2iCxYLNgqCC6ILcgrmC8SIKKworIzogZGlmZi5jOjE4MjcKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiCNt5Wqg4KBW4NogsWCoILpkbyCzINvg2KDdINAgs2CoILogtyCuYLxIgorCisjOiBkaWZmLmM6MTgzNQorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiIgorIkUxMDE6II23laqDgoFbg2iCzINvg2KDdINAgqoyjMKIyI/jgqCC6YLMgsWBQYLHguqC8I5ngqSCqZPBkuiCxYKrgtyCuYLxIgorCisjOiBkaWZmLmM6MTg1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IINvg2KDdINAIFwiJXNcIiCCqoLdgsKCqYLogtyCuYLxIgorCisjOiBkaWZmLmM6MTg2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDM6IINvg2KDdINAIFwiJXNcIiCCzY23laqDgoFbg2iCxYLNgqCC6ILcgrmC8SIKKworIzogZGlncmFwaC5jOjIxOTkKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDogjYeOmoLJRXNjYXBlgs2OZ5dwgsWCq4LcgrmC8SIKKworIzogZGlncmFwaC5jOjIzODQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IINMgVuDfYNig3aDdINAg0ODi4Kqgt2CwoKpguiC3IK5gvEiCisKKyM6IGRpZ3JhcGguYzoyNDExCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiA6c291cmNlIILFjuaNnoLeg3SDQINDg4uIyIpPgsWCzSA6bG9hZGtleW1hcCCC8I5ngqaC3IK5gvEiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgg0yBW4OPgVuDaJXiiq4gKF5OXlApIgorCisjLiBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyM6IGVkaXQuYzo0MQorbXNnaWQgIiBeWCBtb2RlICheRV5ZXkxeXV5GXkleS15EXlZeTl5QKSIKK21zZ3N0ciAiIF5YIIOCgVuDaCAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIIvHj4qDTIFbg4+BW4NoleKKriAoXk5eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5MXk5eUCkiCittc2dzdHIgIiCNcyiRU5HMKZXiiq4gKF5MXk5eUCkiCisKKyM6IGVkaXQuYzo0NgorbXNnaWQgIiBGaWxlIG5hbWUgY29tcGxldGlvbiAoXkZeTl5QKSIKK21zZ3N0ciAig3SDQINDg4uWvJXiiq4gKF5GXk5eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl1eTl5QKSIKK21zZ3N0ciAiIINeg0+V4oquICheXV5OXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgg3CDWINwg16BW4OTleKKriAoXk5eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EXk5eUCkiCittc2dzdHIgIiCS6ItgleKKriAoXkReTl5QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXkteTl5QKSIKK21zZ3N0ciAiII6rj5GV4oquICheS15OXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UXk5eUCkiCittc2dzdHIgIiCDVoNcXIFbg4mDWJXiiq4gKF5UXk5eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlZeTl5QKSIKK21zZ3N0ciAiIINSg32Dk4Nog4mDQ4OTleKKriAoXlZeTl5QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIpJpl46CzI3FjOOCyYNxg2KDZyIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ3RoZXNhdXJ1cycgg0mDdoNWg4eDk4Kqi/OCxYK3IgorCisjOiBlZGl0LmM6MTE2NgorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIidkaWN0aW9uYXJ5JyCDSYN2g1aDh4OTgqqL84LFgrciCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICKOq4+RgvCDWINMg4ODk5KGOiAlcyIKKworIzogZWRpdC5jOjIzNjgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAokX2T/Ckgg1iDToONgVuDiyheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICiSdYq3KSCDWINOg42BW4OLICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAig1iDTIODg5OShjogJXMiCisKKyM6IGVkaXQuYzoyNzE5Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIoNeg0+C8INYg0yDg4OTkoYuIgorCisjOiBlZGl0LmM6MzM4MQorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiCSx4nBkoYiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQzMAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gjJ+N9ZKGLi4uIgorCisjOiBlZGl0LmM6MzQ4NgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIo5ugt+CyZbfgukiCisKKyM6IGVkaXQuYzozNDkxCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIpG8gsyNc4LMklCM6iIKKworIzogZWRpdC5jOjM0OTYKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAil0KI6oLMilmTliIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIiVkIJTUltqCzIpZk5YgKJFTilmTliAlZCCMwpKGKSIKKworIzogZWRpdC5jOjM1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgIiVkIJTUltqCzIpZk5YiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjEwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiCWopJtgsyVz5CUOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxMzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogg0qDYoNSICcoJyCCqoKgguiC3IK5gvE6ICVzIgorCisjOiBldmFsLmM6MTQzNSBldmFsLmM6MTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IIK7gsyVz5CUgs2CoILogtyCuYLxOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNzA1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiAnPycggsyM44LJICc6JyCCqoKgguiC3IK5gvEiCisKKyM6IGV2YWwuYzoyMzI3Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6ICcpJyCCqoLdgsKCqYLogtyCuYLxIgorCisjOiBldmFsLmM6MjM4OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiAnXScggqqC3YLCgqmC6ILcgrmC8SIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IINJg3aDVoOHg5OWvIKqgqCC6ILcgrmC8TogJXMiCisKKyM6IGV2YWwuYzoyNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzoglqKSbYLMg0mDdoNWg4eDk4LFgrc6ICVzIgorCisjOiBldmFsLmM6MjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogiPiXcJWEIChcIikggqqCoILogtyCuYLxOiAlcyIKKworIzogZXZhbC5jOjI2OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IIj4l3CVhCAoJykggqqCoILogtyCuYLxOiAlcyIKKworIzogZXZhbC5jOjMwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiCK1pCUICVzIILJgs2Ws4z4gsiI+JCUgsWCtyIKKworIzogZXZhbC5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IJaikm2CzIrWkJSCxYK3OiAlcyIKKworIzogZXZhbC5jOjMwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IIrWkJSCzIj4kJSCqpG9greCrILcgrc6ICVzIgorCisjOiBldmFsLmM6MzA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiCK1pCUgsyI+JCUgqqRq4LogtyCuYLxOiAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiCDWINOg4qDdoNniMiKT4LFPFNJRD6Cqo5ngu2C6oLcgrWCvTogJXMiCisKKyMuCisjLiAqIFllcyB0aGlzIGlzIHVnbHksIEkgZG9uJ3QgcGFydGljdWxhcmx5IGxpa2UgaXQgZWl0aGVyLiAgQnV0IGRvaW5nIGl0CisjLiAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyMuICogYmUgdG91Y2hlZCBhdCBhbGwuICBTZWUgYmVsb3cgd2hhdCAnb2snIGFuZCAneW5jJyBhcmUgdXNlZCBmb3IuCisjLgorIzogZXZhbC5jOjM2ODcgZ3VpLmM6NDM3NiBndWlfZ3RrLmM6MjA1OQorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6NDIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCCNczoiCisKKyM6IGV2YWwuYzo1NDc3Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyKMiJLoKCZPKVxuIgorIoNMg4ODk4Nag4soJkMpIgorCisjOiBldmFsLmM6NTUxNworbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgImlucHV0cmVzdG9yZSgpIIKqIGlucHV0c2F2ZSgpIILmguiC4JG9gq2MxILOguqC3IK1gr0iCisKKyMgQWRkZWQgYXQgMTAtTWFyLTIwMDQuCisjOiBldmFsLmM6NTk3NworbXNnaWQgIkU2NTU6IFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIChjeWNsZT8pIgorbXNnc3RyICJFNjU1OiCDVoOTg3uDioNig06DioOTg06CqpG9id+CrILcgrcgKI96isKCtYLEgqKC6YnClFxckKuCqoKgguiC3IK3KSIKKworIzogZXZhbC5jOjY2MDkKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IFZpbSCDVIFbg2+C1oLMkNqRsYKqgqCC6ILcgrmC8SIKKworIzogZXZhbC5jOjY3MDYKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3Nzogg1SBW4NvgsyJnpOagqqCoILogtyCuYLxIgorCisjOiBldmFsLmM6NjczNAorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODogg06DiYNDg0GDk4NngtaRl4LpgrGCxoKqgsWCq4LcgrmC8SIKKworIzogZXZhbC5jOjY3ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6ICVzIILWkZeC6YKxgsaCqoLFgquC3IK5gvEiCisKKyM6IGV2YWwuYzo2ODgyCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIolrOM+CkiCisKKyM6IGV2YWwuYzo4MDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IJaikuiLYILMlc+QlILFgrc6ICVzIgorCisjOiBldmFsLmM6ODQ5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYxOiBJbGxlZ2FsIHZhcmlhYmxlIG5hbWU6ICVzIgorbXNnc3RyICJFNDYxOiCVc5CzgsiVz5CUlryCxYK3OiAlcyIKKworIzogZXZhbC5jOjg3ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxMjI6IIrWkJQgJXMggs2S6Itgjc+CxYK3LCCNxJLoi2CCt4LpgsmCzSAhIILwkseJwYK1gsSCrYK+grOCoiIKKworIzogZXZhbC5jOjg4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzoglqKS6ItggsyK1pCUgsWCtzogJXMiCisKKyM6IGV2YWwuYzo4ODcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogJygnIIKqgqCC6ILcgrmC8TogJXMiCisKKyM6IGV2YWwuYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiCVc5CzgsiI+JCUgsWCtzogJXMiCisKKyM6IGV2YWwuYzo4OTgyCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IDplbmRmdW5jdGlvbiCCqoKgguiC3IK5gvEiCisKKyM6IGV2YWwuYzo5MDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiCK1pCUICVzIILwjcSS6ItggsWCq4LcgrmC8TogjmeXcJKGgsWCtyIKKworIzogZXZhbC5jOjkxNTkKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiCK1pCUlryCqpd2i4GCs4LqgtyCtyIKKworIzogZXZhbC5jOjkyMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogitaQlJa8gs2R5ZW2jpqCxY5ugtyC54LIgq+C6oLOgsiC6ILcgrmC8TogJXMiCisKKyM6IGV2YWwuYzo5NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6IJaikuiLYILMitaQlILFgrc6ICVzIgorCisjOiBldmFsLmM6OTQwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IIrWkJQgJXMggvCN7Y+cgsWCq4LcgrmC8TogjmeXcJKGgsWCtyIKKworIzogZXZhbC5jOjk0NTUKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiCK1pCUjMSPb4LMk/yC6o5xkJSCqiAnbWF4ZnVuY2RlcHRoJyCC8JK0gqaC3IK1gr0iCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FsbGluZyAlcyIKK21zZ3N0ciAiJXMggvCOwI1zkoaCxYK3IgorCisjOiBldmFsLmM6OTU3MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBhYm9ydGVkIgorbXNnc3RyICIlcyCCqpKGkmaCs4LqgtyCtYK9IgorCisjOiBldmFsLmM6OTU3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMggqogIyVsZCCC8JXUgrWC3IK1gr0iCisKKyM6IGV2YWwuYzo5NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIIKqIFwiJXNcIiCC8JXUgrWC3IK1gr0iCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1OTUgZXhfY21kczIuYzoyMzY1CisjLCBjLWZvcm1hdAorbXNnaWQgImNvbnRpbnVpbmcgaW4gJXMiCittc2dzdHIgIiVzIILMjsCNc4LwjHCRsZKGgsWCtyIKKworIzogZXZhbC5jOjk2MjEKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogitaQlIpPgskgOnJldHVybiCCqoKgguiC3IK1gr0iCisKKyM6IGV2YWwuYzo5OTUyCittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgg0+DjYFbg2+Di5XPkJQ6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIDE2kGmQlCAlMDJ4LCAgOJBpkJQgJTAzbyIKKworIzogZXhfY21kcy5jOjExOAorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA0eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIDE2kGmQlCAlMDR4LCA4kGmQlCAlbyIKKworIzogZXhfY21kcy5jOjExOQorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIDE2kGmQlCAlMDh4LCA4kGmQlCAlbyIKKworIzogZXhfY21kcy5jOjQzMAorbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiCNc4LwgruC6o6pkGeCyYLNiNqTroLFgquC3IK5gvEiCisKKyM6IGV4X2NtZHMuYzo0OTkKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIjEgjXOCqojak66Cs4LqgtyCtYK9IgorCisjOiBleF9jbWRzLmM6NTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiJWxkII1zgqqI2pOugrOC6oLcgrWCvSIKKworIzogZXhfY21kcy5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCCNc4Kqg3SDQoOLg16PiJedgrOC6oLcgrWCvSIKKworIzogZXhfY21kcy5jOjk1MgorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICqDdINCg4uDXiogYXV0b2NvbW1hbmSCzYy7jd2CzINvg2KDdINAgvCVz41YgrWCxILNgqKCr4LcgrmC8SIKKworIzogZXhfY21kcy5jOjEwMzcKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIluNxYzjgsyVz41YgqqV25G2grOC6oLEgqKC3IK5gvFdXG4iCisKKyM6IGV4X2NtZHMuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzII1zlto6ICIKKworIzogZXhfY21kcy5jOjEyODgKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogg0eDiYFbgqqRvYnfgqyC6YLMgsUsIIjIjX6CzYNYg0yDYoN2grWC3IK3IgorCisjOiBleF9jbWRzLmM6MTMyMworIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgInZpbWluZm+DdINAg0ODiyBcIiVzXCIlcyVzJXMggvCTx42egt2ShiAiCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiCP7pXxIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIIN9gVuDTiIKKworIzogZXhfY21kcy5jOjEzMjYKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgjriUcyIKKworIzogZXhfY21kcy5jOjE0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IHZpbWluZm+DdINAg0ODi4Kqj5GNnoLdgsWCq4LcgrmC8TogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IHZpbWluZm+DdINAg0ODiyAlcyCC8JXbkbaCxYKrgtyCuYLxISIKKworIzogZXhfY21kcy5jOjE1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICJ2aW1pbmZvg3SDQINDg4sgXCIlc1wiIILwj5GNnoLdkoYiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyCCsYLMIHZpbWluZm8gg3SDQINDg4uCzSBWaW0gJXMggsmC5oLBgsSQtpCsgrOC6oLcgrWCvS5cbiIKKworIzogZXhfY21kcy5jOjE2NTEKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIJXPjViCt4LpjduCyYLNj1xclaqSjYjTgrWCxIKtgr6Cs4KiIVxuIgorIlxuIgorCisjOiBleF9jbWRzLmM6MTY1MworbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjIIKxgsyDdINAg0ODi4Kqj5GCqYLqgr2OnoLMICdlbmNvZGluZycggsySbFxuIgorCisjOiBleF9jbWRzLmM6MTc1MgorbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAilXOQs4LIkOaTqpW2jpqCxYK3IgorCisjOiBleF9jbWRzLmM6MjA5NyBleF9jbWRzLmM6MjM2MiBleF9jbWRzMi5jOjc2MworbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIpXKlryCxZXbkbYiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjE0MAorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiCTr4K2lryRT4LMg3SDQINDg4uCqpG8gsyDb4Nig3SDQILFk8eNnoLcguqCxIKigtyCtyIKKworIzogZXhfY21kcy5jOjIxNzQKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICKDdINAg0ODi4LwlZSVqpNJgsmV25G2grWC3IK3gqk/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiCDb4Nig3SDQILwlZSVqpNJgsmV25G2greC6YLJgs0gISCC8I5ngsGCxIKtgr6Cs4KiIgorCisjOiBleF9jbWRzLmM6MjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIor5kbaCzIN0g0CDQ4OLIFwiJS4qc1wiIILwj+OPkYKrgrWC3IK3gqk/IgorCisjOiBleF9jbWRzLmM6MjM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6IINvg2KDdINAICVsZCCCyYLNlryRT4KqgqCC6ILcgrmC8SIKKworIzogZXhfY21kcy5jOjI0MDUKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiCDdINAg0ODi4LNlduRtoKzguqC3IK5gvGCxYK1gr06ICd3cml0ZScgg0mDdoNWg4eDk4LJguaC6JazjPiCxYK3IgorCisjOiBleF9jbWRzLmM6MjQyNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiXCIlLipzXCIggsmCzSAncmVhZG9ubHknIINJg3aDVoOHg5OCqpDdkuiCs4LqgsSCooLcgrdcbiIKKyKLrZCnk0mCyY/jj5GCq4K1gtyCt4KpPyIKKworIzogZXhfY21kcy5jOjI1OTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIoN0g0CDQ4OLgvCV0o9XIgorCisjOiBleF9jbWRzLmM6MzIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogYXV0b2NvbW1hbmSCqpdcXIr6grmCuJBWgrWCooNvg2KDdINAICVzIILwje2PnIK1gtyCtYK9IgorCisjOiBleF9jbWRzLmM6MzMzOQorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiCQlILFgs2CyIKiiPiQlIKqIDp6IILJk26Cs4LqgtyCtYK9IgorCisjOiBleF9jbWRzLmM6MzQyNAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IHJ2aW2CxYLNg1aDRoOLg1KDfYOTg2iC8I5ngqaC3IK5gvEiCisKKyM6IGV4X2NtZHMuYzozNTMxCittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0NjogkLOLS5VcXIy7gs2Vto6agsWL5pDYgumCsYLGgqqCxYKrgtyCuYLxIgorCisjOiBleF9jbWRzLmM6Mzg3NworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICIlcyCCyZJ1ireCtYLcgreCqT8gKHkvbi9hL3EvbC9eRS9eWSkiCisKKyM6IGV4X2NtZHMuYzo0MjcwCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIiiKhI2egtyC6oLcgrWCvSkiCisKKyM6IGV4X2NtZHMuYzo0Mjc0Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIjEgidOPipJ1ireCtYLcgrWCvSIKKworIzogZXhfY21kcy5jOjQyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCCJ04+KknWKt4K1gtyCtYK9IgorCisjOiBleF9jbWRzLmM6NDI3OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiAojHYgMSCNc5PgKSIKKworIzogZXhfY21kcy5jOjQyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiICiMdiAlbGQgjXOT4CkiCisKKyM6IGV4X2NtZHMuYzo0MzMyCittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiA6Z2xvYmFsIILwjcSLQZNJgsmCzY5ngqaC3IK5gvEiCisKKyM6IGV4X2NtZHMuYzo0MzY3Cittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IGdsb2JhbINSg32Dk4NogsmQs4tLlVxcjLuCqo53kuiCs4LqgsSCooLcgrmC8SIKKworIzogZXhfY21kcy5jOjQ0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAig3CDXoFbg5OCqpFTgsSCzI1zgsWC3YLCgqmC6ILcgrWCvTogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDk3Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyCNxYzjgsmSdYq3grOC6oK9lbaOmpfxOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NTk4IGV4X2RvY21kLmM6MjAxMQorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogjVGCxILIgqKCxYKtgr6Cs4KiIgorCisjOiBleF9jbWRzLmM6NDY1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjYxOiBTb3JyeSwgbm8gJyVzJyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTY2MTogjmOUT4LFgreCqiAnJXMnIILMg3eDi4N2gqogJXMggsmCzYKgguiC3IK5gvEiCisKKyM6IGV4X2NtZHMuYzo0NjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogjmOUT4LFgreCqiAlcyCCyYLNg3eDi4N2gqqCoILogtyCuYLxIgorCisjOiBleF9jbWRzLmM6NDY4NworIywgYy1mb3JtYXQKK21zZ2lkICJTb3JyeSwgaGVscCBmaWxlIFwiJXNcIiBub3QgZm91bmQiCittc2dzdHIgIo5jlE+CxYK3gqqDd4OLg3aDdINAg0ODiyBcIiVzXCIggqqC3YLCgqmC6ILcgrmC8SIKKworIzogZXhfY21kcy5jOjUxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogg2aDQoOMg06DZ4OKgsWCzYKgguiC3IK5gvE6ICVzIgorCisjOiBleF9jbWRzLmM6NTMwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1Mjogj5GNnoLdl3CCySAlcyCC8IpKgq+C3IK5gvEiCisKKyM6IGV4X2NtZHMuYzo1MzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiCTx42el3CCySAlcyCC8IpKgq+C3IK5gvEiCisKKyMgQWRkZWQgYXQgMjktQXByLTIwMDQuCisjOiBleF9jbWRzLmM6NTM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjcwOiBNaXggb2YgaGVscCBmaWxlIGVuY29kaW5ncyB3aXRoaW4gYSBsYW5ndWFnZTogJXMiCittc2dzdHIgIkU2NzA6IDGCwoLMjL6M6oLMg3eDi4N2g3SDQINDg4uCyZWhkJSCzINHg5ODUoFbg2iCqo2sjd2CtYLEgqKC3IK3OiAlcyIKKworIzogZXhfY21kcy5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogg16DTyBcIiVzXCIggqqDdINAg0ODiyAlcyCCyY9klaGCtYLEgqKC3IK3IgorCisjOiBleF9jbWRzLmM6NTU1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IJaikm2CzHNpZ26DUoN9g5ODaILFgrc6ICVzIgorCisjOiBleF9jbWRzLmM6NTU3NworbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBzaWdulryCqoKgguiC3IK5gvEiCisKKyM6IGV4X2NtZHMuYzo1NjIzCittc2dpZCAiRTYxMjogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTYxMjogc2lnboLMkuiLYIKqkb2QlIypgsKCqYLogtyCtYK9IgorCisjOiBleF9jbWRzLmM6NTY5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IJazjPiCyHNpZ26CzINlg0yDWINngsWCtzogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzIyIGV4X2NtZHMuYzo1OTEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IJaikm2CzHNpZ26CxYK3OiAlcyIKKworIzogZXhfY21kcy5jOjU3NzEKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBzaWdugsyU1I2GgqqCoILogtyCuYLxIgorCisjOiBleF9jbWRzLmM6NTg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODoglrOM+ILIg2+DYoN0g0CWvILFgrc6ICVzIgorCisjOiBleF9jbWRzLmM6NTg5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzoglrOM+ILIc2lnbo6vlcqOcYLFgrc6ICVsZCIKKworIyBBZGRlZCBhdCAyNy1KYW4tMjAwNC4KKyM6IGV4X2NtZHMuYzo1OTYyCittc2dpZCAiIChOT1QgRk9VTkQpIgorbXNnc3RyICIgICiC3YLCgqmC6ILcgrmC8SkiCisKKyM6IGV4X2NtZHMuYzo1OTY0Cittc2dpZCAiIChub3Qgc3VwcG9ydGVkKSIKK21zZ3N0ciAiICiU8YNUg3yBW4NnKSIKKworIzogZXhfY21kcy5jOjYwNjMKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIluN7Y+cjc9dIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICKDZoNvg2KDT4OCgVuDaILJk/yC6ILcgrcuIJGxgq+C6YLJgs0gXCJjb250XCIggsaT/JfNgrWCxIKtgr6Cs4KiLiIKKworIzogZXhfY21kczIuYzo5NiBleF9kb2NtZC5jOjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgIo1zICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAig1KDfYOTg2g6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICKDdYOMgVuDToN8g0ODk4NnIFwiJXMlc1wiII1zICVsZCIKKworIzogZXhfY21kczIuYzo1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiCDdYOMgVuDToN8g0ODk4NngqqC3YLCgqmC6ILcgrmC8TogJXMiCisKKyM6IGV4X2NtZHMyLmM6NTY2Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAig3WDjIFbg06DfINDg5ODZ4KqkuiLYIKzguqCxIKigtyCuYLxIgorCisjOiBleF9jbWRzMi5jOjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgjXMgJWxkIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICKVz41YgvAgXCIlLipzXCIggsmV25G2grWC3IK3gqk/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkzNTYKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAilrOR6CIKKworIzogZXhfY21kczIuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IINvg2KDdINAIFwiJXNcIiCCzJXPjViCzZXbkbaCs4LqgsSCooLcgrmC8SIKKworIzogZXhfY21kczIuYzo5ODQKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgIox4jZA6IJdcXIr6grmCuJG8g2+DYoN0g0CC1ojak66CtYLcgrWCvSAoYXV0b2NvbW1hbmRzIILwkrKC14LEgq2CvoKzgqIpIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IJXSj1eCt4Lpg3SDQINDg4uCzTGCwoK1gqmCoILogtyCuYLxIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6II3Fj4mCzIN0g0CDQ4OLguaC6JFPgsmCzY1zgq+C3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6MTM5MQorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiCNxYzjgsyDdINAg0ODi4LwiXqCpoLEjOOCyYLNjXOCr4LcgrmC8SIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiCCu4LMg1KDk4Nwg0ODiYLJgs2RzomegrWCxIKigtyCuYLxOiAlcyIKKworIzogZXhfY21kczIuYzoxODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiIILwIFwiJXNcIiCCqYLnjJ+N9ZKGIgorCisjOiBleF9jbWRzMi5jOjE5MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCC8IyfjfWShiIKKworIzogZXhfY21kczIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIidydW50aW1lcGF0aCcggsyShoLJgs2C3YLCgqmC6ILcgrmC8TogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NzQKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiVmltg1iDToOKg3aDZ4LMjuaNnoLdIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICKDZoNCg4yDToNng4qCzY7mjZ6C34LcgrmC8TogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCC8I7mjZ6C34LcgrmC8SIKKworIzogZXhfY21kczIuYzoyMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAijXMgJWxkOiBcIiVzXCIggvCO5o2egt+C3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6MjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIlwiJXNcIiCC8I7mjZ6ShiIKKworIzogZXhfY21kczIuYzoyMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIo1zICVsZDogJXMggvCO5o2ekoYiCisKKyM6IGV4X2NtZHMyLmM6MjM2MworIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiJXMggsyO5o2egvCKrpe5IgorCisjOiBleF9jbWRzMi5jOjI3MDcKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiCMeI2QOiCNc4vmkNiCqpVzkLOCxYK3LiBeTSCCqoLIgqKCzILFgrWC5YKkIgorCisjOiBleF9jbWRzMi5jOjI3NTYKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcggqqO5o2eg1iDToOKg3aDZ4jIik+CxY5nl3CCs4LqgtyCtYK9IgorCisjOiBleF9jbWRzMi5jOjI3ODkKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogOmZpbmlzaCCCqo7mjZ6DWINOg4qDdoNniMiKT4LFjmeXcIKzguqC3IK1gr0iCisKKyM6IGV4X2NtZHMyLmM6MzIzOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICIlZCCDeYFbg1ciCisKKyM6IGV4X2NtZHMyLmM6MzM5NAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAiiPON/IK3gumDZYNMg1iDZ4KqgqCC6ILcgrmC8SIKKworIzogZXhfY21kczIuYzozNDcyCittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIojzjfyShjogg3mBW4NXICVkICglZCUlKSIKKworIzogZXhfY21kczIuYzozNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIgg1KDc4FbICVkICiRUyAlZCCShikiCisKKyM6IGV4X2NtZHMyLmM6MzU0MgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiiPON/IK1gtyCtYK9OiAlcyIKKworIzogZXhfY21kczIuYzozNTQ5Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiiPON/IKqkoaOfoKzguqC3IK1gr0iCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogUG9zdFNjcmlwdI9vl82DdINAg0ODi4LMj5GNnoLdg0eDiYFbgsWCtyIKKworIzogZXhfY21kczIuYzo0MTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IIN0g0CDQ4OLIFwiJXNcIiCC8IpKgq+C3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6NDE5OSBleF9jbWRzMi5jOjQ4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiBQb3N0U2NyaXB0gsyDioNcXIFbg1iDdINAg0ODiyBcIiVzXCIggvCTx42egt+C3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6NDIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IIN0g0CDQ4OLIFwiJXNcIiCCzSBQb3N0U2NyaXB0IIOKg1xcgVuDWIN0g0CDQ4OLgsWCzYKgguiC3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6NDIyMiBleF9jbWRzMi5jOjQyNDIgZXhfY21kczIuYzo0MjU3IGV4X2NtZHMyLmM6NDI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE5OiCDdINAg0ODiyBcIiVzXCIggs2RzomegrWCxIKigsiCoiBQb3N0U2NyaXB0IIOKg1xcgVuDWIN0g0CDQ4OLgsWCtyIKKworIzogZXhfY21kczIuYzo0MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIgorbXNnc3RyICJFNjIxOiCDioNcXIFbg1iDdINAg0ODiyBcIiVzXCIggs2Db4Fbg1eDh4OTgqqI2YLIguiC3IK3IgorCisjOiBleF9jbWRzMi5jOjQ3NzYKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IFBvc3RTY3JpcHSPb5fNl3CCzIN0g0CDQ4OLgvCKSoKvgtyCuYLxIgorCisjOiBleF9jbWRzMi5jOjQ4MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1Njogg3SDQINDg4sgXCIlc1wiIILwikqCr4LcgrmC8SIKKworIzogZXhfY21kczIuYzo0OTI4Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIKK21zZ3N0ciAiRTQ1NjogUG9zdFNjcmlwdILMg4qDXFyBW4NYg3SDQINDg4sgXCJwcm9sb2cucHNcIiCCqoLdgsKCqYLogtyCuYLxIgorCisjOiBleF9jbWRzMi5jOjQ5NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIgorbXNnc3RyICJFNDU2OiBQb3N0U2NyaXB0gsyDioNcXIFbg1iDdINAg0ODiyBcIiVzLnBzXCIggqqC3YLCgqmC6ILcgrmC8SIKKworIzogZXhfY21kczIuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gbXVsdGktYnl0ZSB0byBcIiVzXCIgZW5jb2RpbmciCittc2dzdHIgIkU2MjA6IIN9g4uDYINvg0ODZ5W2jpqC8INHg5ODUoFbg2ggXCIlc1wiIILWlc+Kt4LFgquC3IK5gvEiCisKKyM6IGV4X2NtZHMyLmM6NTEwMgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAig3aDioOTg16CyZGXkE2Shi4uLiIKKworIzogZXhfY21kczIuYzo1MTA2Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogUG9zdFNjcmlwdIN0g0CDQ4OLgsyI8438gsmOuJRzgrWC3IK1gr0iCisKKyM6IGV4X2NtZHMyLmM6NTEwOAorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiiPON/INXg4eDdYLwkZeQTYK1gtyCtYK9LiIKKworIzogZXhfY21kczIuYzo1NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICKMu43dgswgJXOMvozqOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogjL6M6oLwIFwiJXNcIiCCyZDdkuiCxYKrgtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJFeIOCgVuDaILJk/yC6ILcgrcuIINtgVuDfYOLgsmW34LpgsmCzVwidmlzdWFsXCKCxpP8l82CtYLEgq2CvoKzgqIuIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1NjEKK21zZ2lkICJFNTAxOiBBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAiRTUwMTogg3SDQINDg4uCzI9Jl7mIypJ1IgorCisjOiBleF9kb2NtZC5jOjY2OQorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogg1KDfYOTg2iCqo3Ei0GTSYnfgqyC3IK3IgorCisjOiBleF9kb2NtZC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiCX4YpPgqqV35GogrOC6oLcgrmC8YLFgrWCvTogJXMiCisKKyM6IGV4X2RvY21kLmM6MTMxNworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIo7mjZ6DdINAg0ODi4LMjcWM44LFgrciCisKKyM6IGV4X2RvY21kLmM6MTMxOAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiitaQlILMjcWM44LFgrciCisKKyM6IGV4X2RvY21kLmM6MTkwNworbXNnaWQgIkU0NjQ6IEFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgIkU0NjQ6IIOGgVuDVZLoi2CDUoN9g5ODaILMgqCCooLcgqKCyI5nl3CCxYK3IgorCisjOiBleF9kb2NtZC5jOjE5MjEKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IINHg2aDQoNegsyDUoN9g5ODaILFgs2CoILogtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjIwMzAKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IIt0grOC3ILMlM2IzYKqjneS6IKzguqC3IK1gr0iCisKKyM6IGV4X2RvY21kLmM6MjAzOQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAii3SCs4LcgsyUzYjNgqqOd5LogrOC6oLcgrWCvSwgk/yR1oKmgtyCt4KpPyIKKworIzogZXhfZG9jbWQuYzoyMTYyCittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiB3IILggrWCrYLNIHc+PiCC8I5nl3CCtYLEgq2CvoKzgqIiCisKKyM6IGV4X2RvY21kLmM6Mzc4OAorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOToggrGCzINvgVuDV4OHg5OCxYLNgrGCzINSg32Dk4Nogs2XmJdwgsWCq4LcgrmC8SwggrKC34LxgsiCs4KiIgorCisjOiBleF9kb2NtZC5jOjM5OTEKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3Mjogg3SDQINDg4uWvILNIDEggsKCyYK1gsSCrYK+grOCoiIKKworIzogZXhfZG9jbWQuYzo0NTcxCittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAildKPV4K3gteCq4N0g0CDQ4OLgqogMSCMwoKgguiC3IK3gqosII9Jl7mCtYLcgreCqT8iCisKKyM6IGV4X2RvY21kLmM6NDU3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIpXSj1eCt4LXgquDdINAg0ODi4KqgqCCxiAlZCCMwoKgguiC3IK3gqosII9Jl7mCtYLcgreCqT8iCisKKyM6IGV4X2RvY21kLmM6NDU4MQorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IJXSj1eCt4LXgquDdINAg0ODi4KqIDEgjMKCoILogtyCtyIKKworIzogZXhfZG9jbWQuYzo0NTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IJXSj1eCt4LXgquDdINAg0ODi4KqgqCCxiAlbGQgjMKCoILogtyCtyIKKworIzogZXhfZG9jbWQuYzo0Njc4Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDogg1KDfYOTg2iCqor5gsmCoILogtyCtzogjcSS6ItggreC6YLJgs0gISCC8JLHicGCtYLEgq2CvoKzgqIiCisKKyM6IGV4X2RvY21kLmM6NDc4OQorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICCWvJFPICAgICAgICCI+JCUIJTNiM0gIJXiiq4gICAgICCS6ItgIgorCisjOiBleF9kb2NtZC5jOjQ4NzgKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIoOGgVuDVZLoi2CDUoN9g5ODaIKqjKmCwoKpguiC3IK5gvGCxYK1gr0iCisKKyM6IGV4X2RvY21kLmM6NDkxMAorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IJGukKuCzZLoi2CCs4LqgsSCooLcgrmC8SIKKworIzogZXhfZG9jbWQuYzo0OTYyCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiCI+JCUgsyQlIKqlrOM+ILFgrciCisKKyM6IGV4X2RvY21kLmM6NDk3NworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IINKg0WDk4NngvAyj2SOd5LogreC6YKxgsaCzYLFgquC3IK5gvEiCisKKyM6IGV4X2RvY21kLmM6NDk4NworbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6IINKg0WDk4NngsyPyJeqkmyCqpazjPiCxYK3IgorCisjOiBleF9kb2NtZC5jOjUwMTgKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IJXiiq6CzIK9gt+CzIj4kJSCqpVLl3aCxYK3IgorCisjOiBleF9kb2NtZC5jOjUwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IJazjPiCyJXiiq6Od5LogsWCtzogJXMiCisKKyM6IGV4X2RvY21kLmM6NTA1OQorbXNnaWQgIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIKK21zZ3N0ciAiRTQ2ODogleKKroj4kJSCzYNKg1iDXoOAleKKroLFgrWCqY5nl3CCxYKrgtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjUwNjUKK21zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgorbXNnc3RyICJFNDY3OiCDSoNYg16DgJXiiq6CyYLNiPiQlILGgrWCxIrWkJSCqpVLl3aCxYK3IgorCisjOiBleF9kb2NtZC5jOjUwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiCWs4z4gsiRrpCrgsWCtzogJXMiCisKKyM6IGV4X2RvY21kLmM6NTExOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiCWs4z4gsiDUoN9g5ODaJa8gsWCtyIKKworIzogZXhfZG9jbWQuYzo1MTM0Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiCDhoFbg1WS6Itgg1KDfYOTg2iCzYlwkeWVto6agsWOboLcgueCyIKvguqCzoLIguiC3IK5gvEiCisKKyM6IGV4X2RvY21kLmM6NTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDoggruCzIOGgVuDVZLoi2CDUoN9g5ODaILNgqCC6ILcgrmC8TogJXMiCisKKyM6IGV4X2RvY21kLmM6NTY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCittc2dzdHIgIkUxODU6IINKg4mBW4NYg0yBW4OAICVzIIKqgt2CwoKpguiC3IK5gvEiCisKKyM6IGV4X2RvY21kLmM6NTY3NAorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICJWaW0gjmeCooKzgvGBQYLigqAhIgorCisjOiBleF9kb2NtZC5jOjYzOTEKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAikFaCtYKig0WDQoOTg2iDRYLFg3SDQINDg4uC8JXSj1eCtYLcgrciCisKKyM6IGV4X2RvY21kLmM6NjY4NgorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAig1iDj4Nig3aDdINAg0ODi4KqgqCC6ILcgrmC8SIKKworIzogZXhfZG9jbWQuYzo2NzkwCittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIpLHicGDdINAg0ODiyIKKworIzogZXhfZG9jbWQuYzo2ODU0Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiCRT4LMg2aDQoOMg06DZ4OKgs2CoILogtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjY5MzYKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiCWopJtIgorCisjOiBleF9kb2NtZC5jOjcwMjEKK21zZ2lkICJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NTogIgorCisjOiBleF9kb2NtZC5jOjcwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICKDRYNCg5ODaINFiMqSdTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDgyCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIiIKKyJFMTg4OiCCsYLMg3aDiYNig2eDeoFbg4CCyYLNg0WDQoOTg2iDRYjKknWCzI7mk76LQJRcXILNjsCRlYKzguqCxIKigtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjcwOTIKK21zZ2lkICJFNDY2OiA6d2lucG9zIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY2OiA6d2lucG9zIILJgs0ygsKCzJCUkmyCzIj4kJSCqpVLl3aCxYK3IgorCisjOiBleF9kb2NtZC5jOjczNzAKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICKDioNfg0ODjINOg2eC8JXbkbaCtYLcgrciCisKKyM6IGV4X2RvY21kLmM6NzU2MAorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAig3KDhYFbgvCV25G2grWC3IK3IgorCisjOiBleF9kb2NtZC5jOjc1NjEKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIoNag2KDVoOHg5OP7pXxgvCV25G2grWC3IK3IgorCisjOiBleF9kb2NtZC5jOjc1NjMKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICKQ3ZLogvCV25G2grWC3IK3IgorCisjOiBleF9kb2NtZC5jOjc3MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIggqqRto3dgrWC3IK3ICiP44+RgreC6YLJgs0gISCC8JLHicGCtYLEgq2CvoKzgqIpIgorCisjOiBleF9kb2NtZC5jOjc3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiBcIiVzXCIggvCPkY2egt2XcILGgrWCxIpKgq+C3IK5gvEiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjc3NDQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IIj4kJSCzZW2jpqCqZFPkGkvjOOR3oNOg0iBW4NngsWCtYLIgq+C6oLOgqKCr4LcgrmC8SIKKworIzogZXhfZG9jbWQuYzo3Nzg2Cittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiA6bm9ybWFsIILMjcSLQZeYl3CCqpBbgq2CyILogreCrILcgrWCvSIKKworIzogZXhfZG9jbWQuYzo4MzA0Cittc2dpZCAiRTE5NDogTm8gYWx0ZXJuYXRlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciAnIyciCittc2dzdHIgIkUxOTQ6ICcjJ4LwknWCq4q3gqaC6ZWbg3SDQINDg4uCzJa8kU+CqoKgguiC3IK5gvEiCisKKyM6IGV4X2RvY21kLmM6ODMzNQorbXNnaWQgIkU0OTU6IG5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAiRTQ5NTogXCI8YWZpbGU+XCKC8JJ1gquKt4KmgulhdXRvY29tbWFuZILMg3SDQINDg4uWvIKqgqCC6ILcgrmC8SIKKworIzogZXhfZG9jbWQuYzo4MzQzCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiBcIjxhYnVmPlwigvCSdYKrireCpoLpYXV0b2NvbW1hbmSDb4Nig3SDQJTUjYaCqoKgguiC3IK5gvEiCisKKyM6IGV4X2RvY21kLmM6ODM1NAorbXNnaWQgIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICJFNDk3OiBcIjxhbWF0Y2g+XCKC8JJ1gquKt4KmgulhdXRvY29tbWFuZILMilmTlpa8gqqCoILogtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjgzNjQKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiRTQ5ODogXCI8c2ZpbGU+XCKC8JJ1gquKt4KmgukgOnNvdXJjZSCRzo/bg3SDQINDg4uWvIKqgqCC6ILcgrmC8SIKKworIzogZXhfZG9jbWQuYzo4NDA1CisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICIiCisiRTQ5OTogJyUnIILiICcjJyCCqpazlryDdINAg0ODi4LIgsyCxSBcIjpwOmhcIiCC8JS6gu2CyIKijmeCopX7gs2CxYKrgtyCuYLxIgorCisjOiBleF9kb2NtZC5jOjg0MDcKK21zZ2lkICJFNTAwOiBFdmFsdWF0ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTAwOiCL85W2jpqX8YLGgrWCxJVdib+Cs4LqgtyCtYK9IgorCisjOiBleF9kb2NtZC5jOjkzMzgKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IHZpbWluZm+DdINAg0ODi4Lwk8eNnpdwgsaCtYLEikqCr4LcgrmC8SIKKworIzogZXhfZG9jbWQuYzo5NTExCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiCCsYLMg2+BW4NXg4eDk4LJjYeOmoLNgqCC6ILcgrmC8SIKKworIzogZXhfZXZhbC5jOjQ0MAorbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiRTYwODogJ1ZpbScggsWOboLcgumX4YpPgs0gOnRocm93IILFgquC3IK5gvEiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAil+GKT4KqlK2QtoK1gtyCtYK9OiAlcyIKKworIzogZXhfZXZhbC5jOjU3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZmluaXNoZWQ6ICVzIgorbXNnc3RyICKX4YpPgqqO+5GpgrWC3IK1gr06ICVzIgorCisjOiBleF9ldmFsLmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICKX4YpPgqqUaor8grOC6oLcgrWCvTogJXMiCisKKyM6IGV4X2V2YWwuYzo2MjAgZXhfZXZhbC5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCCNcyAlbGQiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gY2F1Z2h0OiAlcyIKK21zZ3N0ciAil+GKT4Kqld+RqIKzguqC3IK1gr06ICVzIgorCisjOiBleF9ldmFsLmM6NzEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG1hZGUgcGVuZGluZyIKK21zZ3N0ciAiJXMggsmC5oLolqKMiJLoj/OR1IKqkLaCtoLcgrWCvSIKKworIzogZXhfZXZhbC5jOjcxNgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICIlcyCCqo3EikqCtYLcgrWCvSIKKworIzogZXhfZXZhbC5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzIIKqlGqK/IKzguqC3IK1gr0iCisKKyM6IGV4X2V2YWwuYzo3NDYKK21zZ2lkICJFeGNlcHRpb24iCittc2dzdHIgIpfhik8iCisKKyM6IGV4X2V2YWwuYzo3NTIKK21zZ2lkICJFcnJvciBhbmQgaW50ZXJydXB0IgorbXNnc3RyICKDR4OJgVuCxoqEjZ6C3SIKKworIzogZXhfZXZhbC5jOjc1NCBndWkuYzo0Mzc1Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIoNHg4mBWyIKKworIy4gaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkKKyM6IGV4X2V2YWwuYzo3NTYKK21zZ2lkICJJbnRlcnJ1cHQiCittc2dzdHIgIoqEjZ6C3SIKKworIzogZXhfZXZhbC5jOjgzMAorbXNnaWQgIkU1Nzk6IDppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTc5OiA6aWYggsyT/ILqjnGCqpBbid+CrILcgrciCisKKyM6IGV4X2V2YWwuYzo4NjcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IDppZiCCzILIgqIgOmVuZGlmIIKqgqCC6ILcgrciCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmlmIILMgsiCoiA6ZWxzZSCCqoKgguiC3IK3IgorCisjOiBleF9ldmFsLmM6OTE0Cittc2dpZCAiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MjogOmlmIILMgsiCoiA6ZWxzZWlmIIKqgqCC6ILcgrciCisKKyM6IGV4X2V2YWwuYzo5MjEKK21zZ2lkICJFNTgzOiBtdWx0aXBsZSA6ZWxzZSIKK21zZ3N0ciAiRTU4MzoglaGQlILMIDplbHNlIIKqgqCC6ILcgrciCisKKyM6IGV4X2V2YWwuYzo5MjQKK21zZ2lkICJFNTg0OiA6ZWxzZWlmIGFmdGVyIDplbHNlIgorbXNnc3RyICJFNTg0OiA6ZWxzZSCCzIzjgskgOmVsc2VpZiCCqoKgguiC3IK3IgorCisjOiBleF9ldmFsLmM6OTkxCittc2dpZCAiRTU4NTogOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1ODU6IDp3aGlsZSCCzJP8guqOcYKqkFuCrYnfgqyC3IK3IgorCisjOiBleF9ldmFsLmM6MTA0NworbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOndoaWxlIILMgsiCoiA6Y29udGludWUggqqCoILogtyCtyIKKworIzogZXhfZXZhbC5jOjEwODcKK21zZ2lkICJFNTg3OiA6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODc6IDp3aGlsZSCCzILIgqIgOmJyZWFrIIKqgqCC6ILcgrciCisKKyM6IGV4X2V2YWwuYzoxMjg2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiA6dHJ5IILMk/yC6o5xgqqQW4nfgqyC3IK3IgorCisjOiBleF9ldmFsLmM6MTM2NgorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDp0cnkggsyCyIKiIDpjYXRjaCCCqoKgguiC3IK3IgorCisjLiBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMuICogSnVzdCBwYXJzZS4KKyM6IGV4X2V2YWwuYzoxMzg4Cittc2dpZCAiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5IgorbXNnc3RyICJFNjA0OiA6ZmluYWxseSCCzIzjgskgOmNhdGNoIIKqgqCC6ILcgrciCisKKyM6IGV4X2V2YWwuYzoxNTIxCittc2dpZCAiRTYwNjogOmZpbmFsbHkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjA2OiA6dHJ5IILMgsiCoiA6ZmluYWxseSCCqoKgguiC3IK3IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNTQ1Cittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IJWhkJSCzCA6ZmluYWx5eSCCqoKgguiC3IK3IgorCisjOiBleF9ldmFsLmM6MTY1NAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6dHJ5IILMgsiCoiA6ZW5kdHJ5IILFgrciCisKKyM6IGV4X2V2YWwuYzoxOTg2Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogitaQlILMik+CySA6ZW5kZnVuY3Rpb24ggqqCoILogtyCtYK9IgorCisjOiBleF9nZXRsbi5jOjMyOTUKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICKDXoNPlrwiCisKKyM6IGV4X2dldGxuLmM6MzI5OAorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIIN0g0CDQ4OLju2X3lxuIgorCisjOiBleF9nZXRsbi5jOjQ3NTEKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIoNJg3aDVoOHg5MgJ2hpc3RvcnknIIKqg1uDjYLFgrciCisKKyM6IGV4X2dldGxuLmM6NTAxNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgJXMgjYCW2oLMl5qX8CAokFaCtYKiguCCzIKpgueMw4KiguCCzILWKTpcbiIKKworIzogZXhfZ2V0bG4uYzo1MDE4Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICKDUoN9g5ODaIOJg0ODkyIKKworIzogZXhfZ2V0bG4uYzo1MDE5Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAijJ+N9ZW2jpqX8SIKKworIzogZXhfZ2V0bG4uYzo1MDIwCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAijq4iCisKKyM6IGV4X2dldGxuLmM6NTAyMQorbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIpP8l82NcyIKKworIzogZXhfZ2V0bG4uYzo1MDU5Cittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciCCqoNSg32Dk4NokreC8JK0gqaC3IK1gr0iCisKKyM6IGV4X2dldGxuLmM6NTIzNgorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IINBg06DZYNCg3WCyINFg0KDk4Nog0WCqYNvg2KDdINAgqqN7Y+cgrOC6oLcgrWCvSIKKworIzogZmlsZWlvLmM6MzcxCittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIpVzkLOCyIN0g0CDQ4OLlrwiCisKKyM6IGZpbGVpby5jOjM5NSBmaWxlaW8uYzo1MjkgZmlsZWlvLmM6Mjg1MCBmaWxlaW8uYzoyODkxCittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIiCCzYNmg0KDjINOg2eDioLFgrciCisKKyM6IGZpbGVpby5jOjM5NworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIiCCzYN0g0CDQ4OLgsWCzYKgguiC3IK5gvEiCisKKyM6IGZpbGVpby5jOjU1MSBmaWxlaW8uYzo0MDU3Cittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW5BWg3SDQINDg4tdIgorCisjOiBmaWxlaW8uYzo1ODQKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJblEaJwoKqgqCC6ILcgrmC8V0iCisKKyM6IGZpbGVpby5jOjY4OAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kIIKqg3SDQINDg4uC8JPHjZ6Vc4nCgsmCtYLcgrWCvSIKKworIzogZmlsZWlvLmM6NjkwCittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmQggs2Mu43dgsyDb4Nig3SDQILwlc+CpoLnguqC3IK5gvEiCisKKyM6IGZpbGVpby5jOjcxMQorbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbToglVePgJP8l82CqYLnk8eNnpKGLi4uXG4iCisKKyM6IGZpbGVpby5jOjcxNworbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAilVePgJP8l82CqYLnk8eNnoLdkoYuLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6OTg4Cittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IJXPireCqoN0g0CDQ4OLgvCTx42elXOJwoLJgrWC3IK1gr0iCisKKyM6IGZpbGVpby5jOjIwMjcKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbRklGTy+DXFyDUINig2ddIgorCisjOiBmaWxlaW8uYzoyMDM0Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbRklGT10iCisKKyM6IGZpbGVpby5jOjIwNDEKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW4NcXINQg2KDZ10iCisKKyM6IGZpbGVpby5jOjIwNDkKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbk8eQ6l0iCisKKyM6IGZpbGVpby5jOjIwNTkKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIltDUpazXSIKKworIzogZmlsZWlvLmM6MjA2NAorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIltOTJdMXSIKKworIzogZmlsZWlvLmM6MjA2OQorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW5K3jXOVqoqEXSIKKworIzogZmlsZWlvLmM6MjA3NSBmaWxlaW8uYzo0MDQxCittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJblqKVz4q3XSIKKworIzogZmlsZWlvLmM6MjA4MCBmaWxlaW8uYzo0MDQ2Cittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIluVz4q3jc9dIgorCisjOiBmaWxlaW8uYzoyMDg3IGZpbGVpby5jOjQwNzEKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIluIw42GibtdIgorCisjOiBmaWxlaW8uYzoyMDk0Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJblc+Kt4NHg4mBW10iCisKKyM6IGZpbGVpby5jOjIxMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIlslbGQgjXOW2oLMlXOQs4LIg2+DQ4NnXSIKKworIzogZmlsZWlvLmM6MjEwNworbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIluTx42eg0eDiYFbXSIKKworIzogZmlsZWlvLmM6MjMyMworbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICKVz4q3gsmVS5d2gsiI6o6eg3SDQINDg4uCqoLdgsKCqYLogtyCuYLxIgorCisjOiBmaWxlaW8uYzoyMzMwCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICInY2hhcmNvbnZlcnQnIILJguaC6ZXPireCqo64lHOCtYLcgrWCvSIKKworIzogZmlsZWlvLmM6MjMzMworbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIidjaGFyY29udmVydCcggsyPb5fNgvCTx42egt+C3IK5gvGCxYK1gr0iCisKKyM6IGZpbGVpby5jOjI3MzMKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzoglduRtoK3gumDb4Nig3SDQILwYXV0b2NvbW1hbmSCqo3tj5yCqYnwlfqCtYLcgrWCvSIKKworIzogZmlsZWlvLmM6Mjc1NgorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiBhdXRvY29tbWFuZIKql1xcivqCuYLKlfuWQILFjXOQlILwlc+NWIK1gtyCtYK9IgorCisjIEFkZGVkIGF0IDE5LUphbi0yMDA0LgorIzogZmlsZWlvLmM6Mjc5NAorbXNnaWQgIk5ldEJlYW5zIGRpc3NhbGxvd3Mgd3JpdGVzIG9mIHVubW9kaWZpZWQgYnVmZmVycyIKK21zZ3N0ciAiTmV0QmVhbnOCzZailc+NWILMg2+DYoN0g0CC8I/jj5GCt4LpgrGCxoLNi5aJwoK1gsSCooLcgrmC8SIKKworIzogZmlsZWlvLmM6MjgwMgorbXNnaWQgIlBhcnRpYWwgd3JpdGVzIGRpc2FsbG93ZWQgZm9yIE5ldEJlYW5zIGJ1ZmZlcnMiCittc2dzdHIgIk5ldEJlYW5zg2+DYoN0g0CCzIjqlZSC8I+RgquPb4K3grGCxoLNgsWCq4LcgrmC8SIKKworIzogZmlsZWlvLmM6Mjg1NiBmaWxlaW8uYzoyODc0Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIoLNg3SDQINDg4uCxYLgj5GNnoLdicKUXFyDZoNvg0ODWILFguCCoILogtyCuYLxIgorCisjOiBmaWxlaW8uYzoyOTI2Cittc2dpZCAiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIoLNk8eNnpDql3CCxYK3ICiLrZCnj5GNnoLJgs0gISCC8JLHicEpIgorCisjOiBmaWxlaW8uYzozMjcyCittc2dpZCAiRTUwNjogQ2FuJ3Qgd3JpdGUgdG8gYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNjogg2+DYoNOg0GDYoN2g3SDQINDg4uC8JXbkbaCxYKrgtyCuYLxICghIILwkseJwYLFi62Qp5XbkbYpIgorCisjOiBmaWxlaW8uYzozMjg0Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNTA3OiCDb4Nig06DQYNig3aDdINAg0ODi4LwlcKCtoLpjduCyYNHg4mBW4KqlK2QtoK1gtyCtYK9ICghIILwkseJwYLFi62QpykiCisKKyM6IGZpbGVpby5jOjMyODYKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiCDb4Nig06DQYNig3aXcIN0g0CDQ4OLgvCTx42egt+C3IK5gvEgKCEggvCSx4nBgsWLrZCnk8eNnikiCisKKyM6IGZpbGVpby5jOjMzMDIKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IINvg2KDToNBg2KDdoN0g0CDQ4OLgvCN7ILqgtyCuYLxICghIILwkseJwYLFi62Qp43skKwpIgorCisjOiBmaWxlaW8uYzozNDA1Cittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTEwOiCDb4Nig06DQYNig3aDdINAg0ODi4LwjeyC6oLcgrmC8SAoISCC8JLHicGCxYutkKeN7JCsKSIKKworIzogZmlsZWlvLmM6MzQ2NworbXNnaWQgIkU0NjA6IFRoZSByZXNvdXJjZSBmb3JrIHdvdWxkIGJlIGxvc3QgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ2MDogg4qDXFyBW4NYg3SDSIFbg06Cqo64gu2C6oLpgqmC4IK1guqC3IK5gvEgKCEggvCSx4nBgsWLrZCnKSIKKworIzogZmlsZWlvLmM6MzU2NgorbXNnaWQgIkUyMTQ6IENhbid0IGZpbmQgdGVtcCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjE0OiCV25G2l3CI6o6eg3SDQINDg4uCqoLdgsKCqYLogtyCuYLxIgorCisjOiBmaWxlaW8uYzozNTg0Cittc2dpZCAiRTIxMzogQ2Fubm90IGNvbnZlcnQgKGFkZCAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiCittc2dzdHIgIkUyMTM6IJXPireCxYKrgtyCuYLxICghIILwkseJwYLFlc+Kt4K5griCyZXbkbYpIgorCisjOiBmaWxlaW8uYzozNjE5Cittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2Njogg4qDk4NOgrOC6oK9g3SDQINDg4uCyY+RjZ6C34LcgrmC8SIKKworIzogZmlsZWlvLmM6MzYyMworbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogj5GNnoLdl3CCyYN0g0CDQ4OLgvCKSoKvgtyCuYLxIgorCisjOiBmaWxlaW8uYzozODg1Cittc2dpZCAiRTY2NzogRnN5bmMgZmFpbGVkIgorbXNnc3RyICJFNjY3OiBmc3luYyCCyY64lHOCtYLcgrWCvSIKKworIzogZmlsZWlvLmM6Mzg5MgorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTUxMjoglcKCtoLpgrGCxoLJjriUcyIKKworIzogZmlsZWlvLmM6Mzk2MworbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzogj5GNnoLdg0eDiYFbLCCVz4q3jriUcyIKKworIzogZmlsZWlvLmM6Mzk2OQorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6II+RjZ6C3YNHg4mBWywgKIN0g0CDQ4OLg1aDWINlg4CCqpaelHQ/KSIKKworIzogZmlsZWlvLmM6NDAzNgorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICIglc+Kt4NHg4mBWyIKKworIzogZmlsZWlvLmM6NDA1MgorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJbg2aDb4NDg1hdIgorCisjOiBmaWxlaW8uYzo0MDU3Cittc2dpZCAiW05ld10iCittc2dzdHIgIluQVl0iCisKKyM6IGZpbGVpby5jOjQwNzkKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW2FdIgorCisjOiBmaWxlaW8uYzo0MDc5Cittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgkseJwSIKKworIzogZmlsZWlvLmM6NDA4MQorbXNnaWQgIiBbd10iCittc2dzdHIgIiBbd10iCisKKyM6IGZpbGVpby5jOjQwODEKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiII+RjZ6C3SIKKworIzogZmlsZWlvLmM6NDEzMQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBwYXRjaG1vZGU6IIy0lnuDdINAg0ODi4LwlduRtoLFgquC3IK5gvEiCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogi/OCzIy0lnuDdINAg0ODi4LwdG91Y2iCxYKrgtyCuYLxIgorCisjOiBmaWxlaW8uYzo0MTY4Cittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiCDb4Nig06DQYNig3aDdINAg0ODi4Lwj8GCuYLcgrmC8SIKKworIzogZmlsZWlvLmM6NDIzMgorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIox4jZA6IIy0lnuDdINAg0ODi4KqjriC7YLqgr2CqZXPjViCs4LqgtyCtYK9XG4iCisKKyM6IGZpbGVpby5jOjQyMzQKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICKDdINAg0ODi4LMlduRtoLJkKyM94K3gumC3ILFg0eDZoNCg16C8I9Jl7mCtYLIgqKCxYKtgr6Cs4KiISIKKworIzogZmlsZWlvLmM6NDMyMworbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDMyMworbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2Rvc4N0g0iBW4N9g2KDZ10iCisKKyM6IGZpbGVpby5jOjQzMzAKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW21hY10iCisKKyM6IGZpbGVpby5jOjQzMzAKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIlttYWODdINIgVuDfYNig2ddIgorCisjOiBmaWxlaW8uYzo0MzM3Cittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQzMzcKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peIN0g0iBW4N9g2KDZ10iCisKKyM6IGZpbGVpby5jOjQzNjQKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSCNcywgIgorCisjOiBmaWxlaW8uYzo0MzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQgjXMsICIKKworIzogZmlsZWlvLmM6NDM2OQorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIJW2jpoiCisKKyM6IGZpbGVpby5jOjQzNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCCVto6aIgorCisjOiBmaWxlaW8uYzo0MzgxCittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW25vZW9sXSIKKworIzogZmlsZWlvLmM6NDM4MQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIluNxY9JjXOCqpVziq6RU10iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDQwMAorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAijHiNkDogk8eNnoLxgr6M44LJg3SDQINDg4uCyZXPjViCqoKgguiC3IK1gr0hISEiCisKKyM6IGZpbGVpby5jOjQ0MDIKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIpZ7k5aCyY/jj5GCq4K1gtyCt4KpIgorCisjOiBmaWxlaW8uYzo1NTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBcIiVzXCIggvCPkY2egt2ShoLMg0eDiYFbgsWCtyIKKworIzogZmlsZWlvLmM6NTU3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogXCIlc1wiIILwlcKCtoLpjp6CyYNHg4mBW4LFgrciCisKKyM6IGZpbGVpby5jOjU1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IFwiJXNcIiCC8JPHjZ6ShoLMg0eDiYFbgsWCtyIKKworIzogZmlsZWlvLmM6NTgxMAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IGF1dG9jb21tYW5kIILMIEZpbGVDaGFuZ2VkU2hlbGwggqqDb4Nig3SDQILwje2PnIK1gtyCtYK9IgorCisjOiBmaWxlaW8uYzo1ODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IIx4jZA6IIN0g0CDQ4OLIFwiJXNcIiCCzYr5gsmRto3dgrWC3IK5gvEiCisKKyM6IGZpbGVpby5jOjU4MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICJXMTI6IIx4jZA6IIN0g0CDQ4OLIFwiJXNcIiCCqpXPjViCs4LqVmltgsyDb4Nig3SDQILglc+NWIKzguqC3IK1gr0iCisKKyM6IGZpbGVpby5jOjU4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMTogjHiNkDogg3SDQINDg4sgXCIlc1wiIILNldKPV4pKjm6M44LJlc+NWIKzguqC3IK1gr0iCisKKyM6IGZpbGVpby5jOjU4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzE2OiCMeI2QOiCDdINAg0ODiyBcIiVzXCIggsyDgoFbg2iCqpXSj1eKSo5ujOOCyZXPjViCs4LqgtyCtYK9IgorCisjOiBmaWxlaW8uYzo1ODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogjHiNkDogg3SDQINDg4sgXCIlc1wiIILNldKPV4pKjm6M44LJjeyQrIKzguqC3IK1gr0iCisKKyM6IGZpbGVpby5jOjU4NTkKK21zZ2lkICJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIKK21zZ3N0ciAij9qN14LNIFwiOmhlbHAgVzExXCIggvCOUY/GgrWCxIKtgr6Cs4KiIgorCisjOiBmaWxlaW8uYzo1ODczCittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAijHiNkCIKKworIzogZmlsZWlvLmM6NTg3NAorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisig3SDQINDg4uTx42eKCZMKSIKKworIzogZmlsZWlvLmM6NTk4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2MjogXCIlc1wiIILwg4qDjYFbg2iCt4Lpj4CU9YKqgsWCq4LcgrmC8YLFgrWCvSIKKworIzogZmlsZWlvLmM6NTk5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogXCIlc1wiIILNg4qDjYFbg2iCxYKrgtyCuYLxgsWCtYK9IgorCisjOiBmaWxlaW8uYzo2NTgwCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0tje2PnI3PLS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2NzQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzoggruCzINPg4uBW4N2gs2CoILogtyCuYLxOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY4NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6ICoggsyM44LJlXOQs4LIlbaOmoKqgqCC6ILcgrWCvTogJXMiCisKKyM6IGZpbGVpby5jOjY4NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IIK7gsyC5oKkgsiDQ4N4g5ODZ4LNgqCC6ILcgrmC8TogJXMiCisKKyM6IGZpbGVpby5jOjY4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IIK7gsyC5oKkgsiDT4OLgVuDdoLggrWCrYLNg0ODeIOTg2eCzYKgguiC3IK5gvE6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcwMzgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorCisjOiBmaWxlaW8uYzo3MzA5Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IJFTgsSCzINDg3iDk4NngsmRzoK1gsSCzGF1dG9jb21tYW5kgs2OwI1zgsWCq4LcgrmC8SIKKworIzogZmlsZWlvLmM6NzMzMgorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAiilmTloK3gulhdXRvY29tbWFuZILNkbaN3YK1gtyCuYLxIgorCisjOiBmaWxlaW8uYzo3NjUzCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogYXV0b2NvbW1hbmSCzJP8guqOcYKqkFuCt4KsgtyCtyIKKworIzogZmlsZWlvLmM6NzkyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzkzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGVjdXRpbmcgJXMiCittc2dzdHIgIiVzIILwjsCNc4K1gsSCooLcgrciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6ODAwNAorIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiYXV0b2NvbW1hbmQgJXMiCisKKyM6IGZpbGVpby5jOjg1NzEKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiB7IIKqgqCC6ILcgrmC8S4iCisKKyM6IGZpbGVpby5jOjg1NzMKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiB9IIKqgqCC6ILcgrmC8S4iCisKKyM6IGZvbGQuYzo2OAorbXNnaWQgIkU0OTA6IE5vIGZvbGQgZm91bmQiCittc2dzdHIgIkU0OTA6IJDcj/SC3YKqgqCC6ILcgrmC8SIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiCMu43dgswgJ2ZvbGRtZXRob2QnIILFgs2Q3I/0gt2C8I3skKyCxYKrgtyCuYLxIgorCisjOiBmb2xkLmM6NTk1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IIy7jd2CzCAnZm9sZG1ldGhvZCcggsWCzZDcj/SC3YLwje2PnILFgquC3IK5gvEiCisKKyM6IGdldGNoYXIuYzoyNDgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IJPHjZ6Db4Nig3SDQILWkseJwSIKKworIzogZ2V0Y2hhci5jOjIxOTgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogjcSLQZNJg32DYoNzg5ODTyIKKworIzogZ2V0Y2hhci5jOjMwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzIILGgqKCpINPg42BW4Nvg4uSWo9rk/yXzYLNivmCyZG2jd2CtYLcgrciCisKKyM6IGdldGNoYXIuYzozMDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogJXMggsaCooKkg0+DjYFbg2+Di4N9g2KDc4OTg0+CzYr5gsmRto3dgrWC3IK3IgorCisjOiBnZXRjaGFyLmM6MzIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiAlcyCCxoKigqSSWo9rk/yXzYLNivmCyZG2jd2CtYLcgrciCisKKyM6IGdldGNoYXIuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiAlcyCCxoKigqSDfYNig3ODk4NPgs2K+YLJkbaN3YK1gtyCtyIKKworIzogZ2V0Y2hhci5jOjMyNzkKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIpJaj2uT/JfNgs2C3YLCgqmC6ILcgrmC8YLFgrWCvSIKKworIzogZ2V0Y2hhci5jOjMyODEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICKDfYNig3ODk4NPgs2C3YLCgqmC6ILcgrmC8YLFgrWCvSIKKworIzogZ2V0Y2hhci5jOjQxNzMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IJVzkLOCyIOCgVuDaCIKKworIzogZ3VpLmM6MjIwCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IEdVSYLwikqOboLFgquC3IK5gvEiCisKKyM6IGd1aS5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogXCIlc1wigqmC55PHjZ6C3oKxgsaCqoLFgquC3IK5gvEiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIkU2NjU6IJdMjPiCyIN0g0iDk4NngqqMqYLCgqmC54LIgqKCzILFLCBHVUmC8IpKjm6CxYKrgtyCuYLxIgorCisjOiBndWkuYzo0NzcKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ICdndWlmb250d2lkZScggqqWs4z4gsWCtyIKKworIzogZ3VpLmM6NTQ3Cittc2dpZCAiRTU5OTogVmFsdWUgb2YgJ2ltYWN0aXZhdGVrZXknIGlzIGludmFsaWQiCittc2dzdHIgIkU1OTk6ICdpbWFjdGl2YXRla2V5JyCCyZDdkuiCs4Lqgr2SbIKqlrOM+ILFgrciCisKKyM6IGd1aS5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiAlcyCCzJBGgvCKhILok5aCxILnguqC3IK5gvEiCisKKyM6IGd1aV9hdF9mcy5jOjMwMAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8ikqCr4LcgrmC8T4iCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogg3SDSIOTg2cgJXMggvCO5pO+gsWCq4LcgrmC8SIKKworIzogZ3VpX2F0X2ZzLmM6Mjc4MQorbXNnaWQgIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTQ6IHZpbV9TZWxGaWxlOiCMu43dgsyDZoNCg4yDToNng4qCyZbfguqC3IK5gvEiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIoNwg1iWvDoiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDcKK21zZ2lkICJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE1OiB2aW1fU2VsRmlsZTogjLuN3YLMg2aDQoOMg06DZ4OKgvCO5pO+gsWCq4LcgrmC8SIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAig0yDg4OTg1qDiyIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICKDWINOg42BW4OLg2+BWzogieaRnILwjuaTvoLFgquC3IK5gvGCxYK1gr0uIgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltIINfg0ODQYONg08iCisKKyM6IGd1aV9iZXZhbC5jOjEwMSBndWlfdzMyLmM6MzgzMAorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICJFMjMyOiCDgYNig1qBW4NXgsaDUoFbg4uDb4Nig06CzIKggukgQmFsbG9vbkV2YWwggvCN7JCsgsWCq4LcgrmC8SIKKworIzogZ3VpX2d0ay5jOjE2MDcKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gg1+DQ4NBg42DTy4uLiIKKworIzogZ3VpX2d0ay5jOjIwNjAgbWVzc2FnZS5jOjI5OTMKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyKCzYKiKCZZKVxuIgorIoKigqKCpigmTilcbiIKKyKDTIODg5ODWoOLKCZDKSIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAig0ODk4N2g2KDZ4OBg1xcg2KDaCIKKworIzogZ3VpX2d0ay5jOjI1MzQgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gjJ+N9YLGknWKty4uLiIKKworIzogZ3VpX2d0ay5jOjI1NDIgZ3VpX21vdGlmLmM6Mjc3MAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gjJ+N9S4uLiIKKworIzogZ3VpX2d0ay5jOjI1NzQgZ3VpX21vdGlmLmM6Mjg4OAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIoyfjfWVto6al/E6IgorCisjOiBndWlfZ3RrLmM6MjU5MiBndWlfbW90aWYuYzoyOTIwCittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAiknWKt5W2jpqX8ToiCisKKyMuIHdob2xlIHdvcmQgb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjI0IGd1aV9tb3RpZi5jOjMwMzYKK21zZ2lkICJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiCittc2dzdHIgIpCzim2CyYpZk5aCt4LpguCCzIK+gq8iCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYzNSBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAikeWVto6aL4+slbaOmoLwi+aVyoK3gukiCisKKyM6IGd1aV9ndGsuYzoyNjQ1IGd1aV9tb3RpZi5jOjI5OTAKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIpX7jPwiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjY1NyBndWlfbW90aWYuYzozMDAyCittc2dpZCAiVXAiCittc2dzdHIgIo/jIgorCisjOiBndWlfZ3RrLmM6MjY2MSBndWlfbW90aWYuYzozMDEwCittc2dpZCAiRG93biIKK21zZ3N0ciAiiboiCisKKyM6IGd1aV9ndGsuYzoyNjgzIGd1aV9ndGsuYzoyNjg1IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIo6fgvCMn431IgorCisjOiBndWlfZ3RrLmM6MjcwMiBndWlfZ3RrLmM6MjcwNCBndWlfbW90aWYuYzoyODA5Cittc2dpZCAiUmVwbGFjZSIKK21zZ3N0ciAiknWKtyIKKworIzogZ3VpX2d0ay5jOjI3MTUgZ3VpX2d0ay5jOjI3MTcgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICKRU4LEknWKtyIKKworIzogZ3VpX2d0a194MTEuYzoyMzI3Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiCDWoNig1aDh4OTg32DbIFbg1eDg4KpgucgXCJkaWVcIiCXdouBgvCO84KvjuaC6ILcgrWCvVxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkKK21zZ2lkICJWaW06IE1haW4gd2luZG93IHVuZXhwZWN0ZWRseSBkZXN0cm95ZWRcbiIKK21zZ3N0ciAiVmltOiCDgYNDg5ODRYNCg5ODaINFgqqVc4jTgsmUaonzgrOC6oLcgrWCvVxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjQxMzgKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAig3SDSIOTg2eRSZHwIgorCisjOiBndWlfZ3RrX3gxMS5jOjYwMzUgdWkuYzoyMTE3Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAii/OCzJFJkfCXzIjmgsyCqYLtguiCyUNVVF9CVUZGRVIwgqqOZ5dwgrOC6oLcgrWCvSIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICKDdINCg4uDXiIKKworIzogZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICKDZoNCg4yDToNng4oiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjEKK21zZ2lkICJIZWxwIgorbXNnc3RyICKDd4OLg3YiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjIKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAig3SDQINDg4siCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIpFJkfAiCisKKyM6IGd1aV9tb3RpZi5jOjI4MzUKK21zZ2lkICJVbmRvIgorbXNnc3RyICKDQYOTg2iDRCIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEwOiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkU2MTA6IFphcIN0g0iDk4NnICclcycggvCTx42egt+C3IK5gvEiCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiCDdINIg5ODZyAlcyCC8I5nl3CCxYKrgtyCuYLxIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyKOcYN2g42DWoNYgtaS4o5+g4GDYoNagVuDV4LwkZeQTZKGgsWCty5cbiIKKworIzogZ3VpX3czMi5jOjgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogiPiQlILNg1SDfIFbg2eCs4LqgtyCuYLxOiBcIi0lc1wiOyBPTEWUxYLwjmeXcIK1gsSCrYK+grOCoi4iCisKKyM6IGd1aV93NDguYzoyMDkwCittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAijJ+N9ZW2jpqX8SAoJ1xcJyCC8IyfjfWCt4LpgsmCzSAnXFxcXCcpIgorCisjOiBndWlfdzQ4LmM6MjExNQorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIoyfjfWBRZJ1ircgKCdcXCcggvCMn431greC6YLJgs0gJ1xcXFwnKSIKKworIzogZ3VpX3gxMS5jOjE1MzcKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICJWaW0gRTQ1ODogkEaOd5LogqqQs4K1gq2CyIKigsyCxYNHg5ODZ4OKgvCKhILok5aCxILnguqC3IK5gvEiCisKKyM6IGd1aV94MTEuYzoyMTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiCIyIm6gsyVto6ag1qDYoNngsyDdINIg5ODZ4KqgqCC6ILcgrmC8SAlczoiCisKKyM6IGd1aV94MTEuYzoyMTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IIN0g0iDk4Nng1qDYoNnlrw6ICVzIgorCisjOiBndWlfeDExLmM6MjE2MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICKDdINIg5ODZyAnJXMnIILNjMWS6JWdgsWCzYKgguiC3IK5gvEiCisKKyM6IGd1aV94MTEuYzoyMTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1Mzogg3SDSIOTg2eDWoNig2eWvDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIoN0g0iDk4NnMDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIoN0g0iDk4NnMTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIoN0g0iDk4NnJWQggsyVnYKqg3SDSIOTg2cwgsyUe4LFgs2CoILogtyCuYLxXG4iCisKKyM6IGd1aV94MTEuYzoyMTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAig3SDSIOTg2cwgsyVnTogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyKDdINIg5ODZzGCzJWdOiAlbGRcbiIKKyJcbiIKKworIzogaGFuZ3VsaW4uYzo2MTAKK21zZ2lkICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCittc2dzdHIgIkUyNTY6IINug5ODT4OLg0mBW4Nng32DZ4OTg0eDiYFbIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAikFaDZoFbg16DeIFbg1iC8JLHicEiCisKKyM6IGlmX2NzY29wZS5jOjc5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAig3CDXoFbg5OCzINOg0eDioFbgvCSx4nBIgorCisjOiBpZl9jc2NvcGUuYzo4MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICKCsYLMg4GDYoNagVuDV4LwlVxcjqaCt4LpIgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICKQ2pGxgvCPSZe5greC6SIKKworIzogaWZfY3Njb3BlLmM6ODUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICKRU4LEgsyQ2pGxgvCNxI+JivqJu4K3gukiCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAikNqRsYLwlVxcjqaCt4LpIgorCisjOiBpZl9jc2NvcGUuYzo5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkU1NjA6II5nl3CV+5ZAOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICKCsYLMY3Njb3Blg1KDfYOTg2iCzZWqioSDRYNCg5ODaINFgsWCzYNUg3yBW4NngrOC6oLcgrmC8S5cbiIKKworIzogaWZfY3Njb3BlLmM6MTc1Cittc2dpZCAiRTU2MjogVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIkU1NjI6II5nl3CWQDogY3N0YWcgPGlkZW50PiIKKworIzogaWZfY3Njb3BlLmM6MjMxCittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiCDXoNPgqqC3YLCgqmC6ILcgrmC8SIKKworIzogaWZfY3Njb3BlLmM6NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAiRTU2Mzogc3RhdCglcykgg0eDiYFbOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDE5Cittc2dpZCAiRTU2Mzogc3RhdCBlcnJvciIKK21zZ3N0ciAiRTU2Mzogc3RhdCCDR4OJgVsiCisKKyM6IGlmX2NzY29wZS5jOjUxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY0OiAlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIkU1NjQ6ICVzIILNg2aDQoOMg06DZ4OKi3mC0ZdMjPiCyGNzY29wZYLMg2aBW4Neg3iBW4NYgsWCzYKgguiC3IK5gvEiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgImNzY29wZYNmgVuDXoN4gVuDWCAlcyCC8JLHicEiCisKKyM6IGlmX2NzY29wZS5jOjU4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogY3Njb3BlgsyQ2pGxICVsZCCC8JPHjZ6C3ZKGgsyDR4OJgVuCxYK3IgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MToglqKSbYLMY3Njb3BljJ+N9YxegsWCtyIKKworIzogaWZfY3Njb3BlLmM6NzM2Cittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IGNzY29wZYNwg0ODdoLwjeyQrILFgquC3IK5gvGCxYK1gr0iCisKKyM6IGlmX2NzY29wZS5jOjc1MworbXNnaWQgIkU2MjI6IENvdWxkIG5vdCBmb3JrIGZvciBjc2NvcGUiCittc2dzdHIgIkU2MjI6IGNzY29wZYLMi06Tro+AlPUoZm9yaymCyY64lHOCtYLcgrWCvSIKKworIzogaWZfY3Njb3BlLmM6ODQ3IGlmX2NzY29wZS5jOjg5NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbiCCzI7AjXOCyY64lHOCtYLcgrWCvSIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiBjc2NvcGWDdoONg1qDWILwi06TroLFgquC3IK5gvGCxYK1gr0iCisKKyM6IGlmX2NzY29wZS5jOjkxMQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHRvX2ZwIILMIGZkb3BlbiCCyY64lHOCtYLcgrWCvSIKKworIzogaWZfY3Njb3BlLmM6OTEzCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZnJfZnAggswgZmRvcGVuIILJjriUc4K1gtyCtYK9IgorCisjOiBpZl9jc2NvcGUuYzo5NTEKK21zZ2lkICJFNTY3OiBubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIkU1Njc6IGNzY29wZZDakbGCyY64lHOCtYLcgrWCvSIKKworIzogaWZfY3Njb3BlLmM6MTAyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGNzY29wZYNOg0eDioFbICVzIG9mICVzIILJilmTloKqgqCC6ILcgrmC8YLFgrWCvSIKKworIzogaWZfY3Njb3BlLmM6MTA4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY5OiBpbnZhbGlkIGNzY29wZXF1aWNrZml4IGZsYWcgJWMgZm9yICVjIgorbXNnc3RyICJFNDY5OiCWs4z4gsggY3Njb3BlcXVpY2tmaXggg3SDiYNPICVjIILMICVjIILFgrciCisKKyM6IGlmX2NzY29wZS5jOjExNTIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZYNSg32Dk4NoOlxuIgorCisjOiBpZl9jc2NvcGUuYzoxMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIgorbXNnc3RyICIlLTVzOiAlLTMwcyAojmeXcJZAOiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogY3Njb3Blg2aBW4Neg3iBW4NYOiAlcyCC8IpKgq2CsYLGgqqCxYKrgtyCuYLxIgorCisjOiBpZl9jc2NvcGUuYzoxMjcxCittc2dpZCAiRTYyNjogY2Fubm90IGdldCBjc2NvcGUgZGF0YWJhc2UgaW5mb3JtYXRpb24iCittc2dzdHIgIkU2MjY6IGNzY29wZYNmgVuDXoN4gVuDWILMj+6V8YLwjuaTvoLFgquC3IK5gvEiCisKKyM6IGlmX2NzY29wZS5jOjEyOTYKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODogj2SVoYK3guljc2NvcGWDZoFbg16DeIFbg1iCzZLHicGCs4LqgtyCuYLxgsWCtYK9IgorCisjOiBpZl9jc2NvcGUuYzoxMzA3Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IGNzY29wZZDakbGCzI3FkeWQlILJkkKCtYLcgrWCvSIKKworIzogaWZfY3Njb3BlLmM6MTQyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IGNzY29wZZDakbEgJXMggqqC3YLCgqmC6ILcgrmC8YLFgrWCvSIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgImNzY29wZZDakbEgJXMggqqVwoK2gueC6oLcgrWCvSIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGNzX21hbmFnZV9tYXRjaGVzIILFknaWvZNJgsiDR4OJgVuCxYK3IgorCisjOiBpZl9jc2NvcGUuYzoxODQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzIgorbXNnc3RyICJDc2NvcGUgg16DTzogJXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NzAKK21zZ2lkICIiCisiXG4iCisiICAgIyAgIGxpbmUiCittc2dzdHIgIiIKKyJcbiIKKyIgICAjICAgjXOU1I2GIgorCisjOiBpZl9jc2NvcGUuYzoxODcyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICKDdINAg0ODi5a8IC8glbaWrCAvII1zXG4iCisKKyM6IGlmX2NzY29wZS5jOjE5OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOTogQ3Njb3BlIGVycm9yOiAlcyIKK21zZ3N0ciAiRTYwOTogY3Njb3Blg0eDiYFbOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICKRU4LEgsxjc2NvcGWDZoFbg16DeIFbg1iC8IOKg1qDYoNngrWC3IK3IgorCisjOiBpZl9jc2NvcGUuYzoyMjQ0Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgImNzY29wZZDakbGCqoKgguiC3IK5gvFcbiIKKworIzogaWZfY3Njb3BlLmM6MjI0OAorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgIINmgVuDXoN4gVuDWJa8ICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgg3CDWFxuIgorCisjOiBpZl9weXRob24uYzo0MzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IIKxgsyDUoN9g5ODaILNlrOM+ILFgrcsgrKC34LxgsiCs4KiOiAiCisiUHl0aG9ug4mDQ4N1g4mDioLwg42BW4NogsWCq4LcgrmC8YLFgrWCvS4iCisKKyMgQWRkZWQgYXQgMDctRmViLTIwMDQuCisjOiBpZl9weXRob24uYzo1MDAKK21zZ2lkICJFNjU5OiBDYW5ub3QgaW52b2tlIFB5dGhvbiByZWN1cnNpdmVseSIKK21zZ3N0ciAiRTY1OTogUHl0aG9uIILwjcSLQZNJgsmOwI1zgreC6YKxgsaCzYLFgquC3IK5gvEiCisKKyM6IGlmX3B5dGhvbi5jOjcwMQorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAiT3V0cHV0T2JqZWN0ka6Qq4Lwj8GCuYLcgrmC8SIKKworIzogaWZfcHl0aG9uLmM6NzA4Cittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIILNIGludGVnZXIggsWCyIKvguqCzoLIguiC3IK5gvEiCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICKWs4z4gsiRrpCrgsWCtyIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSCCyYLNlbaOmpfxgsyDioNYg2eCqpVLl3aCxYK3IgorCisjOiBpZl9weXRob24uYzo4OTUKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBJL0+DSYN1g1eDRoNOg2eCzI+JivqJu5KGgsmDR4OJgVuCxYK3IgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIpazjPiCyI6ugsWCtyIKKworIzogaWZfcHl0aG9uLmM6MTA5NCBpZl90Y2wuYzoxNDA3Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICKOroLNg1KDk4Nwg0ODi46egsmWs4z4gsmCs4LqgsSCooLcgrciCisKKyM6IGlmX3B5dGhvbi5jOjExMDcKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICKPwYKzguqCvYNvg2KDdINAgqqOUY/GgrOC6oLcgrWCvSIKKworIzogaWZfcHl0aG9uLmM6MTEyMiBpZl9weXRob24uYzoxMTYzIGlmX3B5dGhvbi5jOjEyMjcgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAilM2IzYpPgsyNc5TUjYaCxYK3IgorCisjOiBpZl9weXRob24uYzoxMzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPINvg2KDdINAg0mDdYNXg0aDToNnICiPwYuOjc+C3SkgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIpazjPiCyIN9gVuDTpa8gsWCtyIKKworIzogaWZfcHl0aG9uLmM6MTczMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICKCu4LMguaCpILIg2+DYoN0g0CCzYKgguiC3IK5gvEiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICKPwYKzguqCvYNFg0KDk4Nog0WCqo5Rj8aCs4LqgtyCtYK9IgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICKTx42ekOqXcJGukKsiCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIoNKgVuDXFyDi4Kqg2+DYoN0g0CCzIpPgsmCoILogtyCtyIKKworIzogaWZfcHl0aG9uLmM6MTk1NgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8g0WDQoOTg2iDRYNJg3WDV4NGg06DZyAoj8GLjo3PKSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPINFg0KDk4Nog0WDSYN1g1eDRoNOg2cgKJaikm0pICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTk3MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93ICVkPiIKK21zZ3N0ciAiPINFg0KDk4Nog0UgJWQ+IgorCisjOiBpZl9weXRob24uYzoyMDQ2Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgIoK7gsyC5oKkgsiDRYNCg5ODaINFgs2CoILogtyCuYLxIgorCisjOiBpZl9weXRob24uYzoyMzA3IGlmX3B5dGhvbi5jOjIzNDEgaWZfcHl0aG9uLmM6MjM5NiBpZl9weXRob24uYzoyNDY0CisjOiBpZl9weXRob24uYzoyNTg2IGlmX3B5dGhvbi5jOjI2MzggaWZfdGNsLmM6Njg0IGlmX3RjbC5jOjcyOSBpZl90Y2wuYzo4MDMKKyM6IGlmX3RjbC5jOjg3MyBpZl90Y2wuYzoxOTk5Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAig0GDk4Nog0SP7pXxgqqV25G2gsWCq4LcgrmC8SIKKworIzogaWZfcHl0aG9uLmM6MjMwOSBpZl9weXRob24uYzoyNDAzIGlmX3B5dGhvbi5jOjI0NzUKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIo1zgvCPwYK5gtyCuYLxIgorCisjOiBpZl9weXRob24uYzoyMzQ2IGlmX3B5dGhvbi5jOjI0OTEgaWZfdGNsLmM6NjkwIGlmX3RjbC5jOjIwMjEKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICKNc4LwknWKt4LFgquC3IK5gvEiCisKKyM6IGlmX3B5dGhvbi5jOjI1MDkgaWZfcHl0aG9uLmM6MjU4OCBpZl9weXRob24uYzoyNjQ2Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICKNc4LwkX2T/ILFgquC3IK5gvEiCisKKyM6IGlmX3B5dGhvbi5jOjI3NTAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgIpW2jpqX8YLJgs2J/I1zlbaOmoLwityC34LnguqC3IK5gvEiCisKKyM6IGlmX3J1YnkuYzo0MjIKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6IIKxgsyDUoN9g5ODaILNlrOM+ILFgrcsgrKC34LxgsiCs4KiOiAiCisiUnVieYOJg0ODdYOJg4qC8IONgVuDaILFgquC3IK5gvGCxYK1gr0uIgorCisjOiBpZl9ydWJ5LmM6NDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IJaikm2CzGxvbmdqbXCP85HUOiAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICKOwJGVgsaS6ItggvCQ2ILokdaCpoLpIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICKOn4LMg06DiYNYgsyK7pLqgvCVXFyOpiIKKworIzogaWZfc25pZmYuYzo2OQorbXNnaWQgIlNob3cgb3ZlcnJpZGRlbiBtZW1iZXIgZnVuY3Rpb24iCittc2dzdHIgIoNJgVuDb4Fbg4mDQ4NogrOC6oK9g4GDk4NvitaQlILwlVxcjqYiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIoN0g0CDQ4OLgqmC54nxlZyCt4LpIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICKDdoONg1eDRoNOg2eCqYLnifGVnIK3gukiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAikVOCxILMg3aDjYNXg0aDToNngqmC54nxlZyCt4LpIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIonxlZwiCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAijp+CzINcXIFbg1iC8JVcXI6mgreC6SIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICKC3YLCgq+CvYNWg5ODe4OLIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICKDToOJg1iC8I5Rj8YiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiikuRd4LFg06DiYNYgvCVXFyOpiIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIozAkuiCs4Lqgr2KS5F3gsWDToOJg1iC8JVcXI6mIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYggsyOUY/GkOYiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIIKqjlGPxoKzguqC6SIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYggqqOn4LMguCCzILwguCCwYLEgqKC3IK3IgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIIKqjmeXcIKzguqC6SIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAijp+CzJW2j82C8JVcXI6mIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIo6fgsyVto/NgvCQtpCsIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisiU05pRkYrgsmQ2pGxgsWCq4LcgrmC8S4gisKLq4Lwg2CDRoNig06CtYLEgq2CvoKzgqIoc25pZmZlbWFjcyCCqiAkUEFUSCAiCisigsmCyIKvguqCzoLIguiC3IK5gvEpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogk8eNnpKGgsmDR4OJgVuCqpStkLaCtYLcgrWCvS4gkNiSZoK1gtyCtYK9IgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICKMu43dU05pRkYrIILMj/OR1ILNgXUiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAilqIiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICKQ2pGxgXaCxYK3IgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NToglqKSbYLMIFNOaUZGKyCDioNOg0eDWINngsWCtzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IFNOaUZGKyCC1oLMkNqRsZKGgsyDR4OJgVuCxYK3IgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIILJkNqRsYKzguqCxIKigtyCuYLxIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBTTmlGRisgg2+DYoN0g0CCqoKgguiC3IK5gvEiCisKKyM6IGlmX3NuaWZmLmM6MTA4MworbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6II+RjZ6C3ZKGgsmDR4OJgVuCqpStkLaCtYK9gsyCxZDYkmaCtYLcgrWCvSIKKworIzogaWZfdGNsLmM6NDE4Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICKWs4z4gsiDb4Nig3SDQJTUjYaCxYK3IgorCisjOiBpZl90Y2wuYzo0NjQgaWZfdGNsLmM6OTMxIGlmX3RjbC5jOjExMTAKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICKC3IK+jsCRlYKzguqCxIKigtyCuYLxIgorCisjOiBpZl90Y2wuYzo1MDEKK21zZ2lkICJ1bmtub3duIG9wdGlvbiIKK21zZ3N0ciAilqKSbYLMg0mDdoNWg4eDk4LFgrciCisKKyMuID8/PworIzogaWZfdGNsLmM6Nzc0Cittc2dpZCAiY2Fubm90IHNldCBsaW5lKHMpIgorbXNnc3RyICKNc4LwkN2S6ILFgquC3IK5gvEiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAig32BW4NOgs2Q3ZLogrOC6oLEgqKC3IK5gvEiCisKKyM6IGlmX3RjbC5jOjg1MSBpZl90Y2wuYzoxMDY2CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgIo1zICVkIJfxICVkIgorCisjOiBpZl90Y2wuYzo4ODEKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICKNc4LMkX2T/C+Sx4nBgvCCxYKrgtyCuYLxIgorCisjOiBpZl90Y2wuYzoxMjY4Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIpaikm2CzIN0g4mDTzoiCisKKyM6IGlmX3RjbC5jOjEzMzgKK21zZ2lkICJ1bmtub3duIHZpbU9wdGlvbiIKK21zZ3N0ciAilqKSbYLMIHZpbU9wdGlvbiCCxYK3IgorCisjOiBpZl90Y2wuYzoxNDIzCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICKDTIFbg3uBW4NoioSNnoLdIgorCisjOiBpZl90Y2wuYzoxNDI4Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICJ2aW0gg0eDiYFbIgorCisjOiBpZl90Y2wuYzoxNDcxCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisig2+DYoN0g0Avg0WDQoOTg2iDRY3skKyDUoN9g5ODaILwjeyQrILFgquC3IK5gvE6ICIKKyKDSYN1g1eDRoNOg2eCqo/Bi46Cs4LqgsSCooLcgrWCvSIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyKDUoFbg4uDb4Nig06DUoN9g5ODaILwk2+YXoLFgquC3IK5gvE6IINvg2KDdINAL4NFg0KDk4Nog0WCqor5gsmPwYuOgrOC6oLcgrWCvSIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NjIKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gIgorInZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODA6IFRDTCCSdpa9k0mDR4OJgVs6IHJlZmxpc3QgiZiQ9SE/IHZpbS1kZXZAdmltLm9yZyCCyZXxjZCCtYLEgq2CvoKzgqIiCisKKyM6IGlmX3RjbC5jOjE1NjMKK21zZ2lkICJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyByZWZlcmVuY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisig1KBW4OLg2+DYoNOg1KDfYOTg2iC8JNvmF6CxYKrgtyCuYLxOiAiCisig2+DYoN0g0Avg0WDQoOTg2iDRYLMjlGPxoKqgt2CwoKpguiC3IK5gvEiCisKKyM6IGlmX3RjbC5jOjE3MjQKK21zZ2lkICIiCisiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTU3MToggrGCzINSg32Dk4Nogs2Ws4z4gsWCtyyCsoLfgvGCyIKzgqI6ICIKKyJUY2yDiYNDg3WDiYOKgvCDjYFbg2iCxYKrgtyCuYLxgsWCtYK9LiIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODE6IFRDTCCDR4OJgVs6II9Jl7mDUoFbg2iCqpCukJSSbILFgs2CoILogtyCuYLxIT8gdmltLWRldkB2aW0ub3JnICIKKyKCyZXxjZCCtYLEgq2CvoKzgqIiCisKKyM6IGlmX3RjbC5jOjIwMDcKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIo1zgvCO5pO+gsWCq4LcgrmC8SIKKworIzogaWZfeGNtZHNydi5jOjIyNQorbXNnaWQgIlVuYWJsZSB0byByZWdpc3RlciBhIGNvbW1hbmQgc2VydmVyIG5hbWUiCittc2dzdHIgIpa9l9+DVIFbg2+CzJa8kU+C8JNvmF6CxYKrgtyCuYLxIgorCisjOiBpZl94Y21kc3J2LmM6NDczCittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODogltqTSYLMg3aDjYNPg4mDgILWgsyDUoN9g5ODaJGXkE2CyY64lHOCtYLcgrWCvSIKKworIzogaWZfeGNtZHNydi5jOjc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFNTczOiBJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIKK21zZ3N0ciAiRTU3MzoglrOM+ILIg1SBW4NvSUSCqo5ngu2C6oLcgrWCvTogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMTEwCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiBWSU0gjsCRzILMk2+YXoN2g42DcINlg0KCqpVzkLOCxYK3LiCPwYuOgrWC3IK1gr0hIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAilqKSbYLMg0mDdoNWg4eDk4LFgrciCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICKV0o9XiPiQlIKqkb2Ct4KsgtyCtyIKKworIzogbWFpbi5jOjY0Cittc2dpZCAiQXJndW1lbnQgbWlzc2luZyBhZnRlciIKK21zZ3N0ciAiiPiQlIKqgqCC6ILcgrmC8SIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIoNJg3aDVoOHg5OCzIzjgsmDU4N+gqqCoILogtyCtyIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlwiK2NvbW1hbmRcIiwgXCItYyBjb21tYW5kXCIsIFwiLS1jbWQgY29tbWFuZFwiIILMiPiQlIKqkb2Ct4KsgtyCtyIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIpazjPiCyIj4kJSCxYK3OiAiCisKKyM6IG1haW4uYzo0NjYKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIoKxgsxWaW2CyYLNZGlmZotAlFxcgqqCoILogtyCuYLxKINSg5ODcINDg4uOnpDdkugpLiIKKworIzogbWFpbi5jOjkzMgorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIoNYg06DioN2g2eDdINAg0ODi4LwjcSC0YpKgqKCxILdgtyCtzogXCIiCisKKyMgbXNnaWQgIlwiXG4iCisjIG1zZ3N0ciAiXCJcbiIKKyM6IG1haW4uYzo5NDEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIpPHjZ6XcILGgrWCxIpKgq+C3IK5gvEiCisKKyM6IG1haW4uYzo5ODUKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIoNYg06DioN2g2ePb5fNl3CC8IpKgq+C3IK5gvEiCisKKyM6IG1haW4uYzoxMTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiJWQgjMKCzIN0g0CDQ4OLgqqV0o9XgvCNVIKmgsSCooLcgrdcbiIKKworIzogbWFpbi5jOjEyMzMKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IIx4jZA6IJJblpaC1oLMj2+XzYLFgs2CoILogtyCuYLxXG4iCisKKyM6IG1haW4uYzoxMjM1Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogjHiNkDogkluWloKpgueCzJP8l82CxYLNgqCC6ILcgrmC8VxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJ2aW1yY5FPgsyDUoN9g5ODaIOJg0ODkyIKKworIzogbWFpbi5jOjEzMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6IFwiJXNcIoKpgueTx42egt6CsYLGgqqCxYKrgtyCuYLxIgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiguaC6I/ajdeCyI/ulfGCzTogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbg3SDQINDg4suLl0gICAggqCC6YN0g0CDQ4OLgvCV0o9XgreC6SIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICCVV4+Ak/yXzYKpgueDZYNMg1iDZ4Lwk8eNnoLeIgorCisjOiBtYWluLmM6MjQ0NgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IINeg08gICAgICAgICCDXoNPgqqS6ItggrOC6oK9gsaCsYLrgqmC55XSj1eCt4LpIgorCisjOiBtYWluLmM6MjQ0OAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2Vycm9yZmlsZV0gII3Fj4mCzINHg4mBW4LFldKPV4K3gukiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIo5nl3CWQDoiCisKKyM6IG1haW4uYzoyNDYwCittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgIiB2aW0gW4j4kJRdIgorCisjOiBtYWluLmM6MjQ2NAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICCC4IK1gq2CzToiCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIoj4kJQ6XG4iCisKKyM6IG1haW4uYzoyNDY4Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHSCsYLMgqCCxoLJgs2DdINAg0ODi5a8gr6CryIKKworIzogbWFpbi5jOjI0NzAKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdIOPg0ODi4Nog0qBW4NogvCTV4pKgrWCyIKiIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdIKxgsxndmltgvBPTEWCxoK1gsSTb5hegreC6SIKKworIzogbWFpbi5jOjI0NzQKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0Z3ZpbYLMT0xFk2+YXoLwifCPnIK3gukiCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRHVUmCxYtOk66Ct4LpIChcImd2aW1cIiCCxpOvgrYpIgorCisjOiBtYWluLmM6MjQ3OAorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mIG9yICAtLW5vZm9ya1x0g3SDSINBg0+DiYNFg5ODaDogR1VJgvCOboLfgumCxoKrgslmb3JrgrWCyIKiIgorCisjOiBtYWluLmM6MjQ4MAorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpg4KBW4NoIChcInZpXCIggsaTr4K2KSIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeIOCgVuDaCAoXCJleFwiIILGk6+CtikiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdINUg0ODjIOTg2cog2+DYoNgKYOCgVuDaCAoXCJleFwiIJDql3ApIgorCisjOiBtYWluLmM6MjQ4NAorbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHSNt5Wqg4KBW4NoIChcInZpZGlmZlwiIILGk6+CtikiCisKKyM6IG1haW4uYzoyNDg2Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHSDQ4Fbg1eBW4OCgVuDaCAoXCJldmltXCIggsaTr4K2LCCDgoFbg2iWsykiCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHSTx42ekOqXcIOCgVuDaCAoXCJ2aWV3XCIggsaTr4K2KSIKKworIzogbWFpbi5jOjI0ODgKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0kKeMwIOCgVuDaCAoXCJydmltXCIggsaTr4K2KSIKKworIzogbWFpbi5jOjI0ODkKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdJXPjVggKIN0g0CDQ4OLlduRto6eKSCC8ILFgquCyIKiguaCpILJgreC6SIKKworIzogbWFpbi5jOjI0OTAKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHSDZYNMg1iDZ4LMldKPV4LwjXOCyIKmgsiCooLmgqSCyYK3gukiCisKKyM6IG1haW4uYzoyNDkxCittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHSDb4NDg2mDioOCgVuDaCIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwg4KBW4NoIgorCisjOiBtYWluLmM6MjQ5NQorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0VmmM3Yq3g4KBW4NoOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDk2Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0VmmU8YzdireDgoFbg2g6ICdub2NvbXBhdGlibGUiCisKKyM6IG1haW4uYzoyNDk3Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0VmVyYm9zZSCDjIN4g4siCisKKyM6IG1haW4uYzoyNDk4Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHSDZoNvg2KDT4OCgVuDaCIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdINYg4+DYoN2g3SDQINDg4uC8I5nl3CCuYK4g4GDgoOKgr6CryIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHSDWIOPg2KDdoN0g0CDQ4OLgvCX8YuTgrWPSZe5IgorCisjOiBtYWluLmM6MjUwMQorbXNnaWQgIi1yICh3aXRoIGZpbGUgbmFtZSlcdFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uIgorbXNnc3RyICItciAog3SDQINDg4uWvClcdINOg4mDYoNWg4WCtYK9g1qDYoNWg4eDk4LwlZyLQSIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0LXKCxpOvgrYiCisKKyM6IG1haW4uYzoyNTA0Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdINFg0KDk4Nog0WC8IpKgq2CzILJIG5ld2NsaSCC8I5nl3CCtYLIgqIiCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHRJL0+CySA8ZGV2aWNlPiCC8I5nl3CCt4LpIgorCisjOiBtYWluLmM6MjUwOAorbXNnaWQgIi1BXHRcdFx0c3RhcnQgaW4gQXJhYmljIG1vZGUiCittc2dzdHIgIi1BXHRcdFx0g0GDiYNyg0GM6oOCgVuDaILFi06TroK3gukiCisKKyM6IG1haW4uYzoyNTExCittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHSDd4N1g4mDQ4zqg4KBW4NogsWLTpOugreC6SIKKworIzogbWFpbi5jOjI1MTQKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0g3mDi4NWg0GM6oOCgVuDaILFi06TroK3gukiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0kluWloLwIDx0ZXJtaW5hbD4ggsmQ3ZLogreC6SIKKworIzogbWFpbi5jOjI1MTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHQudmltcmOCzJHjgu2C6ILJIDx2aW1yYz4ggvCOZ4KkIgorCisjOiBtYWluLmM6MjUxOQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHQuZ3ZpbXJjgsyR44LtguiCySA8Z3ZpbXJjPiCC8I5ngqQiCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdIN2g4mDT4NDg5ODWINOg4qDdoNngvCDjYFbg2iCtYLIgqIiCisKKyM6IG1haW4uYzoyNTIyCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0TiCMwoNFg0KDk4Nog0WC8IpKgq0oj8iXqpJsOiCDdINAg0ODi4LJgsKCqzGMwikiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0LW+CxpOvgraCvoKqkIKSvJWqioQiCisKKyM6IG1haW4uYzoyNTI0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0g3SDQINDg4uCzI3FjOOCqYLngs2CtoLfgukiCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHQ8bG51bT4gjXOCqYLngs2CtoLfgukiCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPGNvbW1hbmQ+XHR2aW1yY4Lwg42BW4NogreC6ZFPgskgPGNvbW1hbmQ+IILwjsCNc4K3gukiCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxjb21tYW5kPlx0XHSNxY+JgsyDdINAg0ODi4Lwg42BW4NojOMgPGNvbW1hbmQ+IILwjsCNc4K3gukiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8c2Vzc2lvbj5cdFx0jcWPiYLMg3SDQINDg4uC8IONgVuDaIzjg3SDQINDg4sgPHNlc3Npb24+IILwjuaNnoLeIgorCisjOiBtYWluLmM6MjUzMQorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDxzY3JpcHRpbj5cdIN0g0CDQ4OLIDxzY3JpcHRpbj4ggqmC54NtgVuDfYOLg1KDfYOTg2iC8JPHjZ6C3iIKKworIzogbWFpbi5jOjI1MzIKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8c2NyaXB0b3V0Plx0k/yXzYK1gr2RU4NSg32Dk4NogvCDdINAg0ODiyA8c2NyaXB0b3V0PiCCyZLHicGCt4LpIgorCisjOiBtYWluLmM6MjUzMworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNjcmlwdG91dD5cdJP8l82CtYK9kVODUoN9g5ODaILwg3SDQINDg4sgPHNjcmlwdG91dD4ggsmV25G2greC6SIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdIjDjYaJu4KzguqCvYN0g0CDQ4OLgvCV0o9XgreC6SIKKworIzogbWFpbi5jOjI1MzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHR2aW2C8I53kuiCtYK9IFggg1SBW4NvgsmQ2pGxgreC6SIKKworIzogbWFpbi5jOjI1NDEKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdFiDVIFbg2+CyZDakbGCtYLIgqIiCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVzPlx0icKUXFyCyILngs5WaW2DVIFbg2+CxSA8ZmlsZXM+IILwldKPV4K3gukiCisKKyM6IG1haW4uYzoyNTQ1Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtc2lsbmV0IDxmaWxlcz4gIJOvj+MsIINUgVuDb4KqlrOCrYLEguCMeI2QlbaC8I9vl82CtYLIgqIiCisKKyM6IG1haW4uYzoyNTQ2Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIi0tcmVtb3RlLXdhaXQgPGZpbGVzPlx0LS1yZW1vdGWM4yCDdINAg0ODi4LMldKPV4Kqj0mC7YLpgsyC8JHSgsIiCisKKyM6IG1haW4uYzoyNTQ3Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgk6+P4ywgg1SBW4NvgqqWs4KtgsSC4Ix4jZCVtoLwj2+XzYK1gsiCoiIKKworIzogbWFpbi5jOjI1NDgKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0Vmltg1SBW4NvgskgPGtleXM+IILwkZeQTYK1gsSPSZe5greC6SIKKworIzogbWFpbi5jOjI1NDkKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICItLXJlbW90ZS1leHByIDxleHByPlx0g1SBW4NvgsUgPGV4cHI+IILwjsCNc4K1gsSMi4nKgvCVXFyOpoK3gukiCisKKyM6IG1haW4uYzoyNTUwCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRWaW2DVIFbg2+WvILMiOqXl4LwlVxcjqaCtYLEj0mXuYK3gukiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlbmFtZSA8bmFtZT5cdFx0Vmltg1SBW4NvIDxuYW1lPiCCyZGXkE0vlryRT5DdkuiCt4LpIgorCisjOiBtYWluLmM6MjU1NAorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHQudmltaW5mb4LMkeOC7YLogskgPHZpbWluZm8+IILwjmeCpCIKKworIzogbWFpbi5jOjI1NTYKK21zZ2lkICItaCAgb3IgIC0taGVscFx0UHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWggb3IgIC0taGVscFx0g3eDi4N2KIKxgsyDgYNig1qBW4NXKYLwlVxcjqaCtY9Jl7mCt4LpIgorCisjOiBtYWluLmM6MjU1NworbXNnaWQgIi0tdmVyc2lvblx0XHRQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0g2+BW4NXg4eDk4/ulfGC8JVcXI6mgrWPSZe5greC6SIKKworIzogbWFpbi5jOjI1NjEKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltgsmC5oLBgsSJ8I7fgrOC6oLpiPiQlChNb3RpZoNvgVuDV4OHg5MpOlxuIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChuZVh0YXcgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltgsmC5oLBgsSJ8I7fgrOC6oLpiPiQlChuZVh0YXeDb4Fbg1eDh4OTKTpcbiIKKworIzogbWFpbi5jOjI1NjcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbYLJguaCwYLEifCO34KzguqC6Yj4kJQoQXRoZW5hg2+BW4NXg4eDkyk6XG4iCisKKyM6IG1haW4uYzoyNTcxCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHQ8ZGlzcGxheT4ggsV2aW2C8I7AjXOCt4LpIgorCisjOiBtYWluLmM6MjU3MgorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHSNxY+sibuCtYK9j/OR1ILFdmltgvCLTpOugreC6SIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmFtZT5cdFx0dmltgsyWvIKqIDxuYW1lPiCCxYKggumCxoK1gsSDioNcXIFbg1iC8I5ngqQiCisKKyM6IG1haW4uYzoyNTc1Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAojsCRlYKzguqCxIKigsiCoilcbiIKKworIzogbWFpbi5jOjI1NzcKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdJR3jGmQRoLJIDxjb2xvcj4ggvCOZ4KkKJOvi2A6IC1iZykiCisKKyM6IG1haW4uYzoyNTc4Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8Y29sb3I+XHSRT4xpkEaCySA8Y29sb3I+IILwjmeCpCiTr4tgOiAtZmcpIgorCisjOiBtYWluLmM6MjU3OSBtYWluLmM6MjU5OQorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnQ+XHRcdINlg0yDWINnlVxcjqaCySA8Zm9udD4ggvCOZ4KkKJOvi2A6IC1mbikiCisKKyM6IG1haW4uYzoyNTgwCittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPGZvbnQ+XHSRvo6agskgPGZvbnQ+IILwjmeCpCIKKworIzogbWFpbi5jOjI1ODEKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8Zm9yPlx0js6RzI6agskgPGZvbnQ+IILwjmeCpCIKKworIzogbWFpbi5jOjI1ODIgbWFpbi5jOjI2MDAKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIi1nZW9tZXRyeSA8Z2VvbT5cdI+JivqUepJ1gskgPGdlb20+IILwjmeCpCiTr4tgOiAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNTgzCittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPHdpZHRoPlx0i6uKRYLMlZ2C8CA8d2lkdGg+IILJgreC6SiTr4tgOiAtYncpIgorCisjOiBtYWluLmM6MjU4NAorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiIgorIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICCDWINOg42BW4OLg2+BW4LMlZ2C8CA8d2lkdGg+IILJgreC6SiTr4tgOiAtc3cpIgorCisjOiBtYWluLmM6MjU4NgorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHSDgYNqg4WBW4NvgVuCzI2CgrOC8CA8aGVpZ2h0PiCCyYK3gukok6+LYDogLW1oKSIKKworIzogbWFpbi5jOjI1ODggbWFpbi5jOjI2MDEKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0lL2TXYlmkZyC8I5nl3CCt4LpKJOvi2A6IC1ydikiCisKKyM6IG1haW4uYzoyNTg5Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdJS9k12JZpGcgvCOZ5dwgrWCyIKiKJOvi2A6ICtydikiCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHSTwZLogsyDioNcXIFbg1iC8I5nl3CCt4LpIgorCisjOiBtYWluLmM6MjU5MworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbYLJguaCwYLEifCO34KzguqC6Yj4kJQoUklTQyBPU4NvgVuDV4OHg5MpOlxuIgorCisjOiBtYWluLmM6MjU5NAorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxudW1iZXI+XHSPiYr6gsyDRYNCg5ODaINFgsyDUoOJg4CSUIjKgsyVnSIKKworIzogbWFpbi5jOjI1OTUKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPG51bWJlcj5cdI+JivqCzINFg0KDk4Nog0WCzI1zklCIyoLMjYKCsyIKKworIzogbWFpbi5jOjI1OTgKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW2CyYLmgsGCxInwjt+Cs4LqgumI+JCUKEdUSyuDb4Fbg1eDh4OTKTpcbiIKKworIzogbWFpbi5jOjI2MDIKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdDxkaXNwbGF5PiCCxXZpbYLwjsCNc4K3gukok6+LYDogLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjI2MDQKK21zZ2lkICItLXJvbGUgPHJvbGU+XHRTZXQgYSB1bmlxdWUgcm9sZSB0byBpZGVudGlmeSB0aGUgbWFpbiB3aW5kb3ciCittc2dzdHIgIi0tcm9sZSA8cm9sZT5cdIOBg0ODk4NFg0KDk4Nog0WC8I6vlcqCt4LpiOqI04LIlvCKhChyb2xlKYLwkN2S6IK3gukiCisKKyM6IG1haW4uYzoyNjA2Cittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0iNmCyILpR1RLIHdpZGdldILFVmltgvCKSoKtIgorCisjOiBtYWluLmM6MjYwOQorbXNnaWQgIi1QIDxwYXJlbnQgdGl0bGU+XHRPcGVuIFZpbSBpbnNpZGUgcGFyZW50IGFwcGxpY2F0aW9uIgorbXNnc3RyICItUCA8kGWCzINeg0ODZ4OLPlx0VmltgvCQZYNBg3aDioNQgVuDVoOHg5OCzJKGgsWLTpOugreC6SIKKworIyBtc2dpZCAiLS1oZWxwXHRcdFNob3cgR25vbWUgYXJndW1lbnRzIgorIyBtc2dzdHIgIi0taGVscFx0XHRHTk9NRYLMiPiQlILwjKmCuYLpIgorIzogbWFpbi5jOjI4NDcKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICKDZoNCg1iDdoOMg0OCqoypgsKCqYLogtyCuYLxIgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjg2MgorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjogkZeQTYLJjriUc4K1gtyCtYK9LlxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI4NjgKK21zZ2lkICI6IFNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIjogkZeQTYLJjriUc4K1gtyCtYK9LiCDjYFbg0qDi4LFgsyOwI1zgvCOjoLdgsSCooLcgrdcbiIKKworIzogbWFpbi5jOjI5MDYgbWFpbi5jOjI5MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCCMwiAoJWQgjMKShikggsyDdINAg0ODi4LwldKPV4K1gtyCtYK9IgorCisjOiBtYWluLmM6Mjk0OQorbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIoNmg0KDWIN2g4yDQ4KqgqCC6ILcgrmC8Togjq6CzJGXkE2CyY64lHOCtYLcgrWCvS5cbiIKKworIzogbWFpbi5jOjI5NjEKK21zZ2lkICI6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIjogjq6CzJGXkE2CyY64lHOCtYLcgrWCvS5cbiIKKworIzogbWFyay5jOjcwOQorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAig32BW4NOgqqQ3ZLogrOC6oLEgqKC3IK5gvEiCisKKyM6IG1hcmsuYzo3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBcIiVzXCIggsmKWZOWgreC6YN9gVuDToKqgqCC6ILcgrmC8SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzIyCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIm1hcmsgICCNcyAgIJfxIIN0g0CDQ4OLL4Nlg0yDWINnIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3NjAKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBqdW1wICAgjXMgICCX8SCDdINAg0ODiy+DZYNMg1iDZyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6ODA1Cittc2dpZCAiIgorIlxuIgorImNoYW5nZSBsaW5lICBjb2wgdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIpXPjVggICCNcyAgICCX8SAgg2WDTINYg2ciCisKKyM6IG1hcmsuYzoxMjgxCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgg3SDQINDg4uDfYFbg046XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTMxNgorbXNnaWQgIiIKKyJcbiIKKyIjIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyCDV4ODg5ODdoOKg1iDZyAokFaCtYKiguCCzIKqkOYpOlxuIgorCisjOiBtYXJrLmM6MTQxMgorbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgg3SDQINDg4uT4IN9gVuDToLMl5qX8CAokFaCtYKiguCCzIKpgueMw4KiguCCzCk6XG4iCisKKyM6IG1hcmsuYzoxNTAxCittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIic+JyCCqoLdgsKCqYLogtyCuYLxIgorCisjOiBtYnl0ZS5jOjQ2NworbXNnaWQgIkU1NDM6IE5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJFNTQzOiCWs4z4gsiDUoFbg2iDeYFbg1eCxYK3IgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogSUOCzJJsgvCQ3ZLogsWCq4LcgrmC8SIKKworIzogbWJ5dGUuYzo0NTgzCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiCDQ4OTg3aDYoNng1KDk4Nlg0yDWINngsyN7JCsgsmOuJRzgrWC3IK1gr0iCisKKyM6IG1ieXRlLmM6NDc0MQorbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4Njogg0ODk4N2g2KDZ4OBg1xcg2KDaILMg0mBW4N2g5OCyY64lHOCtYLcgrWCvSIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiCMeI2QOiBJTYLMlGqJ84NSgVuDi4Nvg2KDToLwkN2S6ILFgquC3IK5gvGCxYK1gr0iCisKKyM6IG1ieXRlLmM6NDc1OAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiCDQ4OTg3aDYoNng4GDXFyDYoNogs2Cx4LxgsiDWINeg0ODi4Lgg1SDfIFbg2eCtYLcgrmC8SIKKworIzogbWJ5dGUuYzo0ODE1Cittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6IINDg5ODdoNig2eDgYNcXINig2iCzSBteSBwcmVlZGl0IHR5cGUggvCDVIN8gVuDZ4K1gtyCuYLxIgorCisjOiBtYnl0ZS5jOjQ4ODkKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IG92ZXItdGhlLXNwb3Qgg1iDXoNDg4uCyYLNZm9udHNldIKqlUuXdoLFgrciCisKKyM6IG1ieXRlLmM6NDkyNQorbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogR1RLK4KqMS4yLjOC5oLoguCMw4KigsyCxYNYg2WBW4Neg1iDR4OKg0GCqpazjPiCxYK3IgorCisjOiBtYnl0ZS5jOjUyMzIKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiCDQ4OTg3aDYoNng4GDXFyDYoNog1SBW4NvIIKqk66N7IK1gsSCooLcgrmC8SIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiCDdYONg2KDToKqg42DYoNOgrOC6oLEgqKC3IK5gvEiCisKKyM6IG1lbWZpbGUuYzoxMDA1Cittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogg1iDj4Nig3aDdINAg0ODi5PHjZ6OnoLJg1aBW4NOg0eDiYFbgsWCtyIKKworIzogbWVtZmlsZS5jOjEwMTAKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogg1iDj4Nig3aDdINAg0ODi4LMk8eNnoLdg0eDiYFbgsWCtyIKKworIzogbWVtZmlsZS5jOjEwNjIKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5Njogg1iDj4Nig3aDdINAg0ODi4+RjZ6C3Y6egsmDVoFbg06DR4OJgVuCxYK3IgorCisjOiBtZW1maWxlLmM6MTA4MAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5Nzogg1iDj4Nig3aDdINAg0ODi4LMj5GNnoLdg0eDiYFbgsWCtyIKKworIzogbWVtZmlsZS5jOjEyNzcKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IINYg4+DYoN2g3SDQINDg4uCqor5gsmRto3dgrWC3IK3IChzeW1saW5rgsmC5oLpjVWMgj8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogg3WDjYNig04gMCCC8I7mk76CxYKrgtyCuYLxPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IIN1g42DYoNOIDEggvCO5pO+gsWCq4LcgrmC8T8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiCDdYONg2KDTiAyIILwjuaTvoLFgquC3IK5gvE/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiCCqILBgsYsIINYg4+DYoN2g3SDQINDg4uCqo64gu2C6oLcgrWCvSEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiCDWIOPg2KDdoN0g0CDQ4OLgsyWvJFPgvCVz4KmgueC6oLcgrmC8SIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogXCIlc1wiIILMg1iDj4Nig3aDdINAg0ODi4LwikqCr4LIgqKCzILFg4qDSoNvg4qCzZVzicKUXFyCxYK3IgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiCDdYONg2KDTiAwIILwjuaTvoLFgquC3IK5gvGCxYK1gr0/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiAlcyCCyYLNg1iDj4Nig3aDdINAg0ODi4Kqgt2CwoKpguiC3IK5gvEiCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICKOZ5dwgreC6YNYg4+DYoN2g3SDQINDg4uCzJTUjYaC8JP8l82CtYLEgq2CvoKzgqIoMCCCxY9Jl7kpOiAiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6ICVzIILwikqCr4LcgrmC8SIKKworIzogbWVtbGluZS5jOjgzNAorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIoN1g42DYoNOIDAggvCTx42egt+C3IK5gvEgIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIouwgueCrZXPjViCqoKzguqCxIKigsiCooKpVmltgqqDWIOPg2KDdoN0g0CDQ4OLgvCNWJBWgrWCxIKigtyCuYLxLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIFZpbYLMgrGCzINvgVuDV4OHg5OCxYLNjmeXcILFgquC3IK5gvEuXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJWaW2CzINvgVuDV4OHg5MzLjCC8I5nl3CCtYLEgq2CvoKzgqIuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMggs1WaW2CzINYg4+DYoN2g3SDQINDg4uCxYLNgsiCooLmgqSCxYK3IgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiCCsYLMg1KDk4Nzg4WBW4NegsWCzY5nl3CCxYKrgtyCuYLxLlxuIgorCisjOiBtZW1saW5lLmM6ODcwCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICKCsYLMg3SDQINDg4uCzY6fgsyP6o+KgsWN7ILnguqC3IK1gr0gIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyKC4IK1gq2CzYN0g0CDQ4OLgqqRuY+dgrWCxIKigtyCty4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAig1iDj4Nig3aDdINAg0ODiyBcIiVzXCIggvCOZ5dwkoYiCisKKyM6IG1lbWxpbmUuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIoy0lnuDdINAg0ODiyBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MjIKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogjHiNkDogjLSWe4N0g0CDQ4OLgqqVz41YgrOC6oLEgqKC3IK3IgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogJXMggqmC54N1g42DYoNOIDEggvCTx42egt+C3IK5gvEiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P5G9gq2CzI1zgqqOuILtguqCxIKigtyCtyIKKworIzogbWVtbGluZS5jOjk5NQorbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P41zkJSCqorUiOGCwYLEgqKC3IK3IgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz+DdYONg2KDToKqi/OCxYK3IgorCisjOiBtZW1saW5lLmM6MTAyOAorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P41zgqqOuILtguqCxIKigtyCtyIKKworIzogbWVtbGluZS5jOjEwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IIN1g42DYoNOIDEggsxJRIKqitSI4YLBgsSCooLcgrcoJXMggqouc3dwg3SDQINDg4uCxYLIgqI/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz+DdYONg2KDToKqgqCC6ILcgrmC8SIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8ggrGCsYKpguc/Pz9FTkSC3ILFgsyNc4KqlGqJ84KzguqCxIKigumC5oKkgsWCtyIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIj8/PyCCsYKxgqmC5z8/RU5EgtyCxYLMjXOCqpF9k/yCqY3tj5yCs4Lqgr2C5oKkgsWCtyIKKworIzogbWVtbGluZS5jOjExMTcKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/P0VORCIKKworIzogbWVtbGluZS5jOjExNDMKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogg4qDSoNvg4qCqoqEjZ6C3ILqgtyCtYK9IgorCisjOiBtZW1saW5lLmM6MTE0OAorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIiIKKyJFMzEyOiCDioNKg2+DioLMjcWShoLJg0eDiYFbgqqMn49vgrOC6oLcgrWCvTsgPz8/gsWOboLcgumNc4LwjlGPxoK1gsSCrYK+grOCoiIKKworIzogbWVtbGluZS5jOjExNTAKK21zZ2lkICJTZWUgXCI6aGVscCBFMzEyXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICKP2o3Xgs0gXCI6aGVscCBFMzEyXCIggvCOUY/GgrWCxIKtgr6Cs4KiIgorCisjOiBtZW1saW5lLmM6MTE1NQorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAig4qDSoNvg4qCqo9Jl7mCtYLcgrWCvS4gkVOCxIKqkLOCtYKigqmDYINGg2KDToK1gsSCrYK+grOCoi4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKJXPjViC8INgg0aDYoNOgreC6YK9gt+CySwggrGCzIN0g0CDQ4OLgvCVyoLMlryRT4LFlduRtoK1gr2P44LFXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU3Cittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgIoy0lnuDdINAg0ODi4LGgswgZGlmZiCC8I7AjXOCt4LpgsaXx4KigsWCtYLlgqQpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU4Cittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyKCu4LqgqmC5y5zd3CDdINAg0ODi4Lwje2PnIK1gsSCrYK+grOColxuIgorIlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMTQKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAig1iDj4Nig3aDdINAg0ODi4KqlaGQlIypgsKCqYLogtyCtYK9OiIKKworIzogbWVtbGluZS5jOjEzOTIKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgjLuN3YLMg2aDQoOMg06DZ4OKOlxuIgorCisjOiBtZW1saW5lLmM6MTM5NAorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICCCoILplryRT4LwjmeXcJKGOlxuIgorCisjOiBtZW1saW5lLmM6MTM5OAorbXNnaWQgIiAgIEluIGRpcmVjdG9yeSAiCittc2dzdHIgIiAgIINmg0KDjINOg2eDiiAiCisKKyM6IG1lbWxpbmUuYzoxNDE2Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSCCyIK1IC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDg4Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICAgII+Kl0yO0jogIgorCisjOiBtZW1saW5lLmM6MTQ5MAorbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgIJP6lXQ6ICIKKworIzogbWVtbGluZS5jOjE0OTQgbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIJP6lXQ6ICIKKworIzogbWVtbGluZS5jOjE1MTAKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUxNAorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW1ZpbYLMg1iDj4Nig3aDdINAg0ODi4LFgs2CyIKiguaCpILFgrddIgorCisjOiBtZW1saW5lLmM6MTUxOAorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgIIN0g0CDQ4OLlrw6ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAglc+NWI/zkdQ6ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJZRVMiCittc2dzdHIgIoKggugiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAibm8iCittc2dzdHIgIoLIgrUiCisKKyM6IG1lbWxpbmUuYzoxNTI5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIIOGgVuDVZa8OiAiCisKKyM6IG1lbWxpbmUuYzoxNTM2Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIIN6g1iDZ5a8OiAiCisKKyM6IG1lbWxpbmUuYzoxNTM4Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIIN6g1iDZ5a8OiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICCDdoONg1qDWElEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTUwCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICiC3IK+jsCNc5KGKSIKKworIzogbWVtbGluZS5jOjE1NjIKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFuCsYLMVmltg2+BW4NXg4eDk4LFgs2OZ5dwgsWCq4LcgrmC8V0iCisKKyM6IG1lbWxpbmUuYzoxNTY1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW4KxgsyDUoOTg3ODhYFbg16CxYLNjmeXcILFgquC3IK5gvFdIgorCisjOiBtZW1saW5lLmM6MTU3MAorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFuTx42egt+C3IK5gvFdIgorCisjOiBtZW1saW5lLmM6MTU3NAorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW4pKgq+C3IK5gvFdIgorCisjOiBtZW1saW5lLmM6MTc2NAorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiCDWIOPg2KDdoN0g0CDQ4OLgqqWs4KigsyCxYjbjp2CxYKrgtyCuYLxIgorCisjOiBtZW1saW5lLmM6MTgxNworbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICKDdINAg0ODi4KqiNuOnYKzguqC3IK3IgorCisjOiBtZW1saW5lLmM6MTgxOQorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogiNuOnYLJjriUc4K1gtyCtYK9IgorCisjOiBtZW1saW5lLmM6MTg5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IJazjPiCyGxudW2CxYK3OiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDogjXMgJWxkIILwgt2CwoKvgueC6oLcgrmC8SIKKworIzogbWVtbGluZS5jOjIzMDYKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6IIN8g0ODk4Neg3WDjYNig06CzElEgqqK1IjhgsGCxIKigtyCtyAzIgorCisjOiBtZW1saW5lLmM6MjM4NgorbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IILNIDAggsWCoILpgteCq4LFgrciCisKKyM6IG1lbWxpbmUuYzoyNDQ4Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiCNWJBWgrOC6oK9g3WDjYNig06CqpG9greCrILpgqmC4D8iCisKKyM6IG1lbWxpbmUuYzoyNjMwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiCDfINDg5ODXoN1g42DYoNOgsxJRIKqitSI4YLBgsSCooLcgrcgNCIKKworIzogbWVtbGluZS5jOjI2NTcKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICKDdYONg2KDTiAxIILNj8GCs4Lqgr0/IgorCisjOiBtZW1saW5lLmM6Mjg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogjXMgJWxkIIKqgt2CwoKpguiC3IK5gvEiCisKKyM6IG1lbWxpbmUuYzozMTAwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogg3yDQ4OTg16DdYONg2KDToLMSUSCqorUiOGCwYLEgqKC3IK3IgorCisjOiBtZW1saW5lLmM6MzExNgorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCCCqoNbg42CxYK3IgorCisjOiBtZW1saW5lLmM6MzE0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6II1zlNSNhoKqlM2IzYpPgsWCtzogJWxkIJK0gqaCxIKigtyCtyIKKworIzogbWVtbGluZS5jOjMxNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IIN1g42DYoNOICVsZCCCzI1zg0qDRYOTg2eCqorUiOGCwYLEgqKC3IK3IgorCisjOiBtZW1saW5lLmM6MzE5OAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICKDWINeg2KDToNUg0ODWYKqkZ2CpoLcgrciCisKKyM6IG1lbWxpbmUuYzozMjQ0Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiCDfINDg5ODXoN1g42DYoNOgsxJRIKqitSI4YLBgsSCooLcgrcgMiIKKworIzogbWVtbGluZS5jOjM2NzQKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IJKNiNMiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisijp+CzJa8kU+CxYNYg4+DYoN2g3SDQINDg4uC8IypgsKCr4LcgrWCvSBcIiIKKworIzogbWVtbGluZS5jOjM2NzkKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIo6fgsyDdINAg0ODi4LwikqCooLEgqKC6Y3FkoYgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg4Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIINYg4+DYoN2g3SDQINDg4uC5oLoguCQVoK1gqKCxYK3IVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjkyCittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpIJXKgsyDdoONg0+DiYOAgqqTr4K2g3SDQINDg4uC8JXSj1eCtYLEgqKC6YKpguCCtYLqgtyCuYLxLlxuIgorIiAgICCCsYLMj+qNh4LJgs0sIJXPjViC8IK1gr2N24LJjcWPSZNJgsksIJOvgraDdINAg0ODi4LMiNmCyILpXG4iCisiICAgIDKCwoLMg0ODk4NYg16Dk4NYgqqCxYKrgsSCtYLcgqSCsYLGgsmSjYjTgrWCxIKtgr6Cs4KiLlxuIgorCisjOiBtZW1saW5lLmM6MzY5MworbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICCPSZe5greC6YKpLCCSjYjTgrWCyIKqgueRsYKvgtyCty5cbiIKKworIzogbWVtbGluZS5jOjM2OTQKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikggrGCzIN0g0CDQ4OLgsyV0o9Xg1qDYoNWg4eDk4Kqg06DiYNig1aDhYK1gr0uXG4iCisKKyM6IG1lbWxpbmUuYzozNjk1Cittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAggrGCzI/qjYeCyYLNIFwiOnJlY292ZXJcIiCCqSBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNjk3Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAggvCOZ5dwgrWCxJXPjViC8IOKg0qDb4FbgrWC3IK3KFwiOmhlbHAgcmVjb3ZlclwiIILwjlGPxikuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIIr5gsmCsYLqgvCNc4LIgsGCvYLMgsiC54LOLCCDWIOPg2KDdoN0g0CDQ4OLIFwiIgorCisjOiBtZW1saW5lLmM6MzcwMAorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICCC8I/BgrmCzoKxgsyDgYNig1qBW4NXgvCJ8ZTwgsWCq4LcgrcuXG4iCisKKyM6IG1lbWxpbmUuYzozNzE0IG1lbWxpbmUuYzozNzE4Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICKDWIOPg2KDdoN0g0CDQ4OLIFwiIgorCisjOiBtZW1saW5lLmM6MzcxNSBtZW1saW5lLmM6MzcyMQorbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIggqqK+YLJgqCC6ILcgrchIgorCisjOiBtZW1saW5lLmM6MzcyNAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gko2I0yIKKworIzogbWVtbGluZS5jOjM3MjYKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICKDWIOPg2KDdoN0g0CDQ4OLgqqK+YLJkbaN3YK1gtyCtyEiCisKKyM6IG1lbWxpbmUuYzozNzMwCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnQiCittc2dzdHIgIiIKKyKTx42ekOqXcILFikqCrSgmTylcbiIKKyKCxoLJgqmCrZXSj1eCt4LpKCZFKVxuIgorIpWcioiCs4K5gukoJlIpZWNvdmVyXG4iCisij0mXuYK3gukoJlEpXG4iCisikoaOfoK3gukoJkEpIgorCisjOiBtZW1saW5lLmM6MzczMgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIpPHjZ6Q6pdwgsWKSoKtKCZPKVxuIgorIoLGgsmCqYKtldKPV4K3gukoJkUpXG4iCisilZyKiIKzgrmC6SgmUillY292ZXJcbiIKKyKPSZe5greC6SgmUSlcbiIKKyKSho5+greC6SgmQSlcbiIKKyKPwYuOgreC6SgmRCkiCisKKyM6IG1lbWxpbmUuYzozNzg5Cittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogg1iDj4Nig3aDdINAg0ODi4Kqkb2QlIypgsKCqYLogtyCtYK9IgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogg4GDaoOFgVuDQYNDg2WDgILMg3CDWILMlZSVqoKqg1SDdYOBg2qDhYFbgsWCzYKgguiC3IK5gvEiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiCDgYNqg4WBW4LNkbyCzIOCgVuDaILJgr6Cr4KgguiC3IK3IgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOToggruCzJa8kU+CzIOBg2qDhYFbgs2CoILogtyCuYLxIgorCisjOiBtZW51LmM6NTI1Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogg4GDaoOFgVuDcINYgs2DVIN1g4GDaoOFgVuC8JC2graC6YLXgquCxYLNgqCC6ILcgrmC8SIKKworIzogbWVudS5jOjU2NAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiCDgYNqg4WBW4NvgVuCyYLNkryQ2oOBg2qDhYFbg0GDQ4Nlg4CC8JLHicGCxYKrgtyCuYLxIgorCisjOiBtZW51LmM6NTcwCittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiCL5pDYguiCzYOBg2qDhYFbg3CDWILMiOqVlILFgs2CoILogtyCuYLxIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDk3Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gg4GDaoOFgVsgLS0tIgorCisjOiBtZW51LmM6MjAxOQorbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAigrGCzIOBg2qDhYFbgvCQ2ILojuaC6SIKKworIzogbWVudS5jOjIwODQKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiCDgYNqg4WBW4Nwg1iCzYOBg2qDhYFbg0GDQ4Nlg4CC8JC2graCyIKvguqCzoKigq+C3IK5gvEiCisKKyM6IG1lbnUuYzoyMTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogg4GDaoOFgVuCqoLdgsKCqYLogtyCuYLxOiAlcyIKKworIzogbWVudS5jOjIxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogJXMggsmCzYOBg2qDhYFbgqqS6ItggrOC6oLEgqKC3IK5gvEiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiCDgYNqg4WBW4Nwg1iCzYNUg3WDgYNqg4WBW4LwkLaCtoLIgq+C6oLOgqKCr4LcgrmC8SIKKworIzogbWVudS5jOjIyMzIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6IIOBg2qDhYFbgqqC3YLCgqmC6ILcgrmC8SAtIIOBg2qDhYFblryC8IptlEaCtYLEgq2CvoKzgqIiCisKKyM6IG1lc3NhZ2UuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIiVzIILMj4iXnZKGgsmDR4OJgVuCqoyfj2+Cs4LqgtyCtYK9OiIKKworIzogbWVzc2FnZS5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICKNcyAlNGxkOiIKKworIzogbWVzc2FnZS5jOjY0NworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJblbaOmpfxgqqSt4K3gqyC3IK3XSIKKworIzogbWVzc2FnZS5jOjc5NworbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICKT+pZ7jOqDgYNig1qBW4NXlnyW8y+KxI9DOiCRuomqIJG+mFkgPGtvcm9uQHRrYS5hdHQubmUuanA+IgorCisjOiBtZXNzYWdlLmM6MTAyNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICKKhI2egt06ICIKKworIzogbWVzc2FnZS5jOjEwMjgKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIpGxgq+C6YLJgs1FTlRFUoLwiZ+CtYLEgq2CvoKzgqIiCisKKyM6IG1lc3NhZ2UuYzoxMDMwCittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAikbGCr4LpgsmCzUVOVEVSgvCJn4K3gqmDUoN9g5ODaILwk/yXzYK1gsSCrYK+grOCoiIKKworIzogbWVzc2FnZS5jOjIzNTEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSCMcJGxIC0tIgorCisjOiBtZXNzYWdlLmM6MjM1NAorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiCNc5GXgugsIFNQQUNFL2I6IIN5gVuDV5GXgugsIGQvdToglLyDeYFbg1eRl4LoLCBxOiCPSZe5KSIKKworIzogbWVzc2FnZS5jOjIzNTUKK21zZ2lkICIgKFJFVDogbGluZSwgU1BBQ0U6IHBhZ2UsIGQ6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUOiCNc5GXgugsIFNQQUNFOiCDeYFbg1eRl4LoLCBkOiCUvIN5gVuDV5GXgugsIHE6II9Jl7kpIgorCisjOiBtZXNzYWdlLmM6Mjk3NiBtZXNzYWdlLmM6Mjk5MQorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICKOv5biIgorCisjOiBtZXNzYWdlLmM6Mjk3OAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisigs2CoigmWSlcbiIKKyKCooKigqYoJk4pIgorCisjOiBtZXNzYWdlLmM6MzAxMQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIoLNgqIoJlkpXG4iCisigqKCooKmKCZOKVxuIgorIpFTgsSV25G2KCZBKVxuIgorIpFTgsSV+or8KCZEKVxuIgorIoNMg4ODk4Nag4soJkMpIgorCisjOiBtZXNzYWdlLmM6MzA1MgorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIoN0g0CDQ4OLlduRtoNfg0ODQYONg08iCisKKyM6IG1lc3NhZ2UuYzozMDU0Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAig3SDQINDg4uTx42eg1+DQ4NBg42DTyIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzozMTI1Cittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6IINSg5ODXFyBW4OLg4KBW4NogsWCzYN0g0CDQ4OLg3WDiYNFg1WC8I5ngqaC3IK5gvEsIIKygt+C8YLIgrOCoiIKKworIzogbWlzYzEuYzoyNzczCittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogjHiNkDogk8eNnpDql3CDdINAg0ODi4Lwlc+NWIK1gtyCtyIKKworIzogbWlzYzEuYzozMDIxCittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIjEgjXMgkseJwYK1gtyCtYK9IgorCisjOiBtaXNjMS5jOjMwMjMKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAiMSCNcyCN7Y+cgrWC3IK1gr0iCisKKyM6IG1pc2MxLmM6MzAyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiJWxkII1zIJLHicGCtYLcgrWCvSIKKworIzogbWlzYzEuYzozMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAiJWxkII1zII3tj5yCtYLcgrWCvSIKKworIzogbWlzYzEuYzozMDMzCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAoioSNnoLcguqC3IK1gr0pIgorCisjOiBtaXNjMS5jOjc1ODIKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiCDdINAg0ODi4LwlduRtpKGLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo3NTkyCittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiCPSZe5grWC3IK1gr0uXG4iCisKKyM6IG1pc2MyLmM6Njk1IG1pc2MyLmM6NzExCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAig0eDiYFbOiAiCisKKyM6IG1pc2MyLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW4OBg4KDiiiDb4NDg2cpXSCRjYqEk5YtifCV+pfKICVsdS0lbHUsII5nl3CXyiAlbHUsIINzgVuDTo6eICVsdVxuIgorCisjOiBtaXNjMi5jOjcxNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbjMSPb10gkY0gcmUvbWFsbG9jKCkgifGQlCAlbHUsIJGNIGZyZWUoKSCJ8ZCUICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc3MgorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6II1zgqqSt4KtgsiC6IK3gqyC3IK1gr0iCisKKyM6IG1pc2MyLmM6ODE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiCT4JWUg0eDiYFbOiBsYWxsb2MoJWxkLCkiCisKKyM6IG1pc2MyLmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiCDgYOCg4qCqpGrguiC3IK5gvEhICAoJWx1IINvg0ODZ4LwioSTlpd2i4EpIgorCisjOiBtaXNjMi5jOjI1OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiCittc2dzdHIgIo7AjXOCzIK9gt+CyYNWg0aDi4LwjMSPb4K1koY6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyODE1Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTogg1KDjYOTgqqCoILogtyCuYLxIgorCisjOiBtaXNjMi5jOjI4MTcgbWlzYzIuYzoyODQ0Cittc2dpZCAiRTU0NjogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFNTQ2OiCVc5CzgsiDgoFbg2iCxYK3IgorCisjOiBtaXNjMi5jOjI4ODMKK21zZ2lkICJFNTQ3OiBJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkU1NDc6IJVzkLOCyCAnbW91c2VzaGFwZScggsWCtyIKKworIzogbWlzYzIuYzoyOTIzCittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IJCUkmyCqpVLl3aCxYK3IgorCisjOiBtaXNjMi5jOjI5MjgKK21zZ2lkICJFNTQ5OiBJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIkU1NDk6IJVzkLOCyINwgVuDWoOTg2WBW4NXgsWCtyIKKworIzogbWlzYzIuYzozMjM4Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiiMONhom7l3CCzINMgVuC8JP8l82CtYLEgq2CvoKzgqI6ICIKKworIzogbWlzYzIuYzozMjM5Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiguCCpIjqk3iTr4K2g0yBW4Lwk/yXzYK1gsSCrYK+grOCojogIgorCisjOiBtaXNjMi5jOjMyNDkKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAig0yBW4KqiOqSdoK1gtyCuYLxIgorCisjOiBtaXNjMi5jOjM3OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiCWs4z4gsiDcINYgsWCtzogJyoqW5CUkmxdJyCCzXBhdGiCzI3FjOOCqSAnJXMnICIKKyKCqpGxgqKCxILIgqKCxoKigq+C3IK5gvEuIgorCisjOiBtaXNjMi5jOjUwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogY2RwYXRogsmCzSBcIiVzXCIggsaCooKkg3SDQINDg4uCqoKgguiC3IK5gvEiCisKKyM6IG1pc2MyLmM6NTA4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IHBhdGiCyYLNIFwiJXNcIiCCxoKigqSDdINAg0ODi4KqgqCC6ILcgrmC8SIKKworIzogbWlzYzIuYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IGNkcGF0aILJgs2CsYLqiMiP4yBcIiVzXCIggsaCooKkg3SDQINDg4uCqoKgguiC3IK5gvEiCisKKyM6IG1pc2MyLmM6NTA4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IINwg1iCyYLNgrGC6ojIj+MgXCIlc1wiIILGgqKCpIN0g0CDQ4OLgqqCoILogtyCuYLxIgorCisjOiBtaXNjMi5jOjUzMjMKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiCDUoONg5OCqoKgguiC3IK5gvEiCisKKyM6IG1pc2MyLmM6NTMzNQorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiCVc5CzgsiNXFyVtpd2kWaCxYK3IgorCisjOiBtaXNjMi5jOjUzNDMKK21zZ2lkICJFNTUyOiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU1MjogkJSSbIKqlUuXdoLFgrciCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6Mzk2Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIk5ldGJlYW5zICMyIILJkNqRsYLFgquC3IK5gvEiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIk5ldGJlYW5zIILJkNqRsYLFgquC3IK5gvEiCisKKyM6IG5ldGJlYW5zLmM6NDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2Njg6IFdyb25nIGFjY2VzcyBtb2RlIGZvciBOZXRCZWFucyBjb25uZWN0aW9uIGluZm8gZmlsZTogXCIlc1wiIgorbXNnc3RyICIiCisiRTY2ODogTmV0QmVhbnOCzJDakbGP7pXxg3SDQINDg4uCzINBg06DWoNYg4KBW4NogsmW4pHogqqCoILogtyCtzogXCIlc1wiIgorCisjOiBuZXRiZWFucy5jOjc0OQorbXNnaWQgInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiCittc2dzdHIgIk5ldGJlYW5zIILMg1xcg1CDYoNngvCTx42egt0iCisKKyM6IG5ldGJlYW5zLmM6MTYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjU4OiBOZXRCZWFucyBjb25uZWN0aW9uIGxvc3QgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU2NTg6IINvg2KDdINAICVsZCCCzCBOZXRCZWFucyCQ2pGxgqqOuILtguqC3IK1gr0iCisKKyM6IG5vcm1hbC5jOjI5ODAKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICKMeI2QOiCOZ5dwgrWCxIKigumSW5aWgs2DboNDg4mDQ4NngsWCq4LcgrmC8SIKKworIzogbm9ybWFsLmM6MzI3NgorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IINKgVuDXFyDi4LMiMqSdYLJgs2Vto6al/GCqoKgguiC3IK5gvEiCisKKyM6IG5vcm1hbC5jOjMyNzgKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogg0qBW4NcXIOLgsyIypJ1gsmCzY6vlcqOcYKqgqCC6ILcgrmC8SIKKworIzogbm9ybWFsLmM6NDUxOQorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiCMu43dgswgJ2ZvbGRtZXRob2QnIILFgs2Q3I/0gt2C8I/Bi46CxYKrgtyCuYLxIgorCisjOiBub3JtYWwuYzo2NzA4Cittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDoglc+NWIOKg1iDZ4Kqi/OCxYK3IgorCisjOiBub3JtYWwuYzo2NzEwCittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2Mjoglc+NWIOKg1iDZ4LMkOaTqiIKKworIzogbm9ybWFsLmM6NjcxMgorbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYzOiCVz41Yg4qDWINngsyWlpT2IgorCisjOiBub3JtYWwuYzo3OTczCittc2dpZCAiVHlwZSAgOnF1aXQ8RW50ZXI+ICB0byBleGl0IFZpbSIKK21zZ3N0ciAiVmltgvCPSZe5greC6YLJgs0gOnF1aXQ8RW50ZXI+IILGk/yXzYK1gsSCrYK+grOCoiIKKworIzogb3BzLmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiMSCNc4KqICVzIILFIDEgifGPiJedgrOC6oLcgrWCvSIKKworIzogb3BzLmM6Mjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIxII1zgqogJXMggsUgJWQgifGPiJedgrOC6oLcgrWCvSIKKworIzogb3BzLmM6MzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkII1zgqogJXMggsUgMSCJ8Y+Il52Cs4LqgtyCtYK9IgorCisjOiBvcHMuYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCCNc4KqICVzIILFICVkIInxj4iXnYKzguqC3IK1gr0iCisKKyM6IG9wcy5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiJWxkII1zgqqDQ4OTg2aDk4NngrOC6oLcgrcuLi4gIgorCisjOiBvcHMuYzo3MTIKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICIxII1zgvCDQ4OTg2aDk4NngrWC3IK1gr0iCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgjXOC8INDg5ODZoOTg2eCtYLcgrWCvSIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NzUKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAig4SDk4NOgsWCq4LcgrmC8TsggsaCyYKpgq2PwYuOIgorCisjOiBvcHMuYzoyMTg1Cittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgjXOCqpXPjViCs4LqgtyCtYK9IgorCisjOiBvcHMuYzoyMTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIlbGQgjXOCqpXPjViCs4LqgtyCtYK9IgorCisjOiBvcHMuYzoyNTcxCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICIlbGQgjXOC8IpKlfqShiIKKworIzogb3BzLmM6Mjg1MgorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIjEgjXOCqoOEg5ODToKzguqC3IK1gr0iCisKKyM6IG9wcy5jOjI4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAiJWxkII1zgqqDhIOTg06Cs4LqgtyCtYK9IgorCisjOiBvcHMuYzozMTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IIOMg1eDWINeICVzIILJgs2JvYLggqCC6ILcgrmC8SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNjkwCittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIIOMg1eDWINeIC0tLSIKKworIzogb3BzLmM6NDk5NworbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAilXOQs4LIg4yDV4NYg16WvCIKKworIzogb3BzLmM6NTA4NQorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgg4yDV4NYg146XG4iCisKKyM6IG9wcy5jOjUxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3NDogVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICJFNTc0OiCWopJtgsyDjINXg1iDXoxeICVkIILFgrciCisKKyM6IG9wcy5jOjU2MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiCWs4z4gsiDjINXg1iDXpa8OiAnJXMnIgorCisjOiBvcHMuYzo1OTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCCX8TsgIgorCisjOiBvcHMuYzo1OTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAikUmR8CAlcyVsZCAvICVsZCCNczsgJWxkIC8gJWxkIJJQjOo7ICVsZCAvICVsZCCVto6aIgorCisjOiBvcHMuYzo2MDAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAil/EgJXMgLyAlczsgjXMgJWxkIG9mICVsZDsgklCM6iAlbGQgLyAlbGQ7IJW2jpogJWxkIC8gJWxkIgorCisjOiBvcHMuYzo2MDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBmb3IgQk9NKSIKKworIzogb3B0aW9uLmM6MTY0MworbXNnaWQgIiU8JWYlaCVtJT1QYWdlICVOIgorbXNnc3RyICIlPCVmJWglbSU9JU4gg3mBW4NXIgorCisjOiBvcHRpb24uYzoyMDkyCittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICJWaW0ggvCOZ4LBgsSCrYLqgsSCoILogqqCxoKkIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODoglqKSbYLMg0mDdoNWg4eDk4LFgrciCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogg0mDdoNWg4eDk4LNg1SDfIFbg2eCs4LqgsSCooLcgrmC8SIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IG1vZGVsaW5lIILFgs2LlonCgrOC6oLcgrmC8SIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiA9IILMjOOCyYLNkJSOmoKqlUuXdoLFgrciCisKKyM6IG9wdGlvbi5jOjM5ODkgb3B0aW9uLmM6NDYxOQorbXNnaWQgIkU1MjI6IE5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTIyOiB0ZXJtY2FwIJPggsmC3YLCgqmC6ILcgrmC8SIKKworIzogb3B0aW9uLmM6NDA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM5OiBJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICJFNTM5OiCVc5CzgsiVto6agsWCtyA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiAndGVybScggsmCzYvzlbaOmpfxgvCQ3ZLogsWCq4LcgrmC8SIKKworIzogb3B0aW9uLmM6NDYxNAorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IEdVSYLFgs0gJ3Rlcm0nIILwlc+NWILFgquC3IK5gvEiCisKKyM6IG9wdGlvbi5jOjQ2MTYKK21zZ2lkICJFNTMxOiBVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTUzMTogR1VJgvCDWINegVuDZ4K3gumCyYLNIFwiOmd1aVwiIILwjmeXcIK1gsSCrYK+grOCoiIKKworIzogb3B0aW9uLmM6NDY0NQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXBleHQnIILGICdwYXRjaG1vZGUnIIKqk6+CtoLFgrciCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogR1RLKzIgR1VJgsWCzZXPjViCxYKrgtyCuYLxIgorCisjOiBvcHRpb24uYzo1MDE2Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDogg1KDjYOTgqqCoILogtyCuYLxIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiCVto6al/GCzJK3grOCqoNbg42CxYK3IgorCisjOiBvcHRpb24uYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IDwlcz4ggsyM44LJkJSOmoKqgqCC6ILcgrmC8SIKKworIzogb3B0aW9uLmM6NTEwMAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IINKg5ODfYKqgqCC6ILcgrmC8SIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6ICcggsySbILwjneS6IK1gsiCr4Lqgs6CyILogtyCuYLxIgorCisjOiBvcHRpb24uYzo1MTQ4Cittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IJVcXI6mgsWCq4LIgqKVto6agqmDj4NDg2iVto6agvCK3ILxgsWCooLcgrciCisKKyM6IG9wdGlvbi5jOjUxOTcKK21zZ2lkICJFNTk2OiBJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIkU1OTY6IJazjPiCyIN0g0iDk4NngsWCtyIKKworIzogb3B0aW9uLmM6NTIwNQorbXNnaWQgIkU1OTc6IGNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJFNTk3OiCDdINIg5ODZ4Nag2KDZ4LwkUmR8ILFgquC3IK5gvEiCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IJazjPiCyIN0g0iDk4Nng1qDYoNngsWCtyIKKworIzogb3B0aW9uLmM6NTIxNAorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IIOPg0ODaIN0g0iDk4NngvCRSZHwgsWCq4LcgrmC8SIKKworIzogb3B0aW9uLmM6NTIxNgorbXNnaWQgIkU1MzQ6IEludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJFNTM0OiCWs4z4gsiDj4NDg2iDdINIg5ODZ4LFgrciCisKKyM6IG9wdGlvbi5jOjU0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogPCVjPiCCzIzjgsmVc5CzgsiVto6agqqCoILogtyCtyIKKworIzogb3B0aW9uLmM6NTU5NworbXNnaWQgIkU1MzY6IGNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJFNTM2OiCDSoOTg32CqpVLl3aCxYK3IgorCisjOiBvcHRpb24uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyCCzYvzgsWCoILpgqkgJXMggvCK3ILelUuXdoKqgqCC6ILcgrciCisKKyM6IG9wdGlvbi5jOjU2NzkKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiCDfYNFg1iCzYNUg3yBW4NngrOC6oLcgrmC8SIKKworIzogb3B0aW9uLmM6NTk0NworbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6II6ugqqPSZe5grWCxIKigtyCuYLxIgorCisjOiBvcHRpb24uYzo1OTUxCittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6IJd2kWaCqpG9greCrILcgrciCisKKyM6IG9wdGlvbi5jOjU5NTMKK21zZ2lkICJFNTQyOiB1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAiRTU0Mjogg0+Di4Fbg3aCqpLejYeCooLcgrmC8SIKKworIzogb3B0aW9uLmM6NjE5MworbXNnaWQgIkU1OTA6IEEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU1OTA6IIN2g4yDcoOFgVuDRYNCg5ODaINFgqqK+YLJkbaN3YK1gtyCtyIKKworIzogb3B0aW9uLmM6NjQ1MAorbXNnaWQgIlcxNzogQXJhYmljIHJlcXVpcmVzIFVURi04LCBkbyAnOnNldCBlbmNvZGluZz11dGYtOCciCittc2dzdHIgIiIKKyJXMTc6IINBg4mDcoNBlbaOmoLJgs1VVEYtOIKqlUuXdoLIgsyCxSwgJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIIK1gsSCrYK+grOCoiIKKworIzogb3B0aW9uLmM6Njc3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTkzOiBOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICJFNTkzOiCNxZLhICVkIILMjXOQlIKqlUuXdoLFgrciCisKKyM6IG9wdGlvbi5jOjY3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5NDogTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICJFNTk0OiCNxZLhICVkIILMg0qDiYOAlZ2CqpVLl3aCxYK3IgorCisjOiBvcHRpb24uYzo3MDkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NToglqKSbYLMg0mDdoNWg4eDk4LFgrc6ICVzIgorCisjOiBvcHRpb24uYzo3MjEzCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gkluWloNSgVuDaCAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMTUKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCDT4ONgVuDb4OLg0mDdoNWg4eDk5JsIC0tLSIKKworIzogb3B0aW9uLmM6NzIxNworbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gg42BW4NKg4uDSYN2g1aDh4OTkmwgLS0tIgorCisjOiBvcHRpb24uYzo3MjE5Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCDSYN2g1aDh4OTIC0tLSIKKworIzogb3B0aW9uLmM6NzkyNQorbXNnaWQgIkUzNTY6IGdldF92YXJwIEVSUk9SIgorbXNnc3RyICJFMzU2OiBnZXRfdmFycCCDR4OJgVsiCisKKyM6IG9wdGlvbi5jOjg4OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogJXMggsmRzomegreC6ZW2jpqCqoKgguiC3IK5gvEiCisKKyM6IG9wdGlvbi5jOjg5MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogg1qDfoNSg42Dk4LMjOOCyZddlaqCyJW2jpqCqoKgguiC3IK3OiAlcyIKKworIzogb3NfYW1pZ2EuYzoyODAKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIopKgq+C3IK5gvEgIgorCisjOiBvc19hbWlnYS5jOjMxNAorbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogg0WDQoOTg2iDRYLwikqCr4LcgrmC8SFcbiIKKworIzogb3NfYW1pZ2EuYzozMzgKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJBbWlnYWRvc4LMg2+BW4NXg4eDkyAyLjA0gqmCu4LqiMiNfoKqlUuXdoLFgrdcbiIKKworIzogb3NfYW1pZ2EuYzozNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICIlcyCCzINvgVuDV4OHg5MgJWxkIIKqlUuXdoLFgrdcbiIKKworIzogb3NfYW1pZ2EuYzo0MTYKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIk5JTILwikqCr4LcgrmC8TpcbiIKKworIzogb3NfYW1pZ2EuYzo0MjcKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAijeyQrILFgquC3IK5gvEgIgorCisjOiBvc19hbWlnYS5jOjkwNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbYLNICVkIILFj0mXuYK1gtyCt1xuIgorCisjOiBvc19hbWlnYS5jOjkzNworbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgIoNSg5ODXFyBW4OLg4KBW4NogvCVz41YgsWCq4LcgrmC8T8hXG4iCisKKyM6IG9zX2FtaWdhLmM6MTAwMworbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF9zaGVsbHNpemU6IINSg5ODXFyBW4OLgsWCzYLIgqI/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTUyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IC1mIINJg3aDVoOHg5OCxYNWg0aDi4LwjsCNc4LFgquC3IK5gvEiCisKKyM6IG9zX2FtaWdhLmM6MTE5MyBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIo7AjXOCxYKrgtyCuYLxICIKKworIzogb3NfYW1pZ2EuYzoxMTk2IG9zX2FtaWdhLmM6MTI5MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAig1aDRoOLICIKKworIzogb3NfYW1pZ2EuYzoxMjE2IG9zX2FtaWdhLmM6MTMxOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIglt+C6ILcgrWCvVxuIgorCisjOiBvc19hbWlnYS5jOjE0NTkKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIIKqj6yCs4K3gqyC3IK3LiIKKworIzogb3NfYW1pZ2EuYzoxNDYzCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICKT/I9vl82DR4OJgVsiCisKKyM6IG9zX21zd2luLmM6NTM5Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLiiPyJeqKSIKKworIzogb3NfbXN3aW4uYzo2NDEKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIIKqODCCxYLNgsiCooK9gt8sIIpPlZSDUoN9g5ODaILwjsCNc4LFgquC3IK5gvEiCisKKyM6IG9zX21zd2luLmM6MTk3MworbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogg3aDioOTg16CzJFJkfCCyY64lHOCtYLcgrWCvSIKKworIzogb3NfbXN3aW4uYzoyMDEzCisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICIlcyCC1iAoJXMgj+OCzCkiCisKKyM6IG9zX21zd2luLmM6MjAyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IJaikm2CzIN2g4qDk4Neg0mDdoNWg4eDk4LFgrc6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwNzcgb3NfbXN3aW4uYzoyMDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogiPON/INHg4mBWzogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4OAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIpVzlr4iCisKKyM6IG9zX21zd2luLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICKI8438grWCxIKigtyCtzogJyVzJyIKKworIzogb3NfbXN3aW4uYzozMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiCVto6ag1qDYoNnlrwgXCIlc1wiIILNlXOQs4LFgrcgKIN0g0iDk4NnlrwgXCIlc1wiKSIKKworIzogb3NfbXN3aW4uYzozMjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6ICclYycggs2Vc5CzgsiVto6agsWCtyAog3SDSIOTg2eWvCBcIiVzXCIpIgorCisjOiBvc19yaXNjb3MuYzoxMjU5Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjoglrOM+ILIICdvc2ZpbGV0eXBlJyCDSYN2g1aDh4OTIC0gXCJUZXh0XCIggvCOZ4KigtyCtyIKKworIzogb3NfdW5peC5jOjkyNworbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IDKPZILMg1aDT4Npg4uCzIK9gt8sII9Jl7mCtYLcgrdcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogknaWvZNJg1aDT4Npg4sgJXMggvCMn5JtgrWC3IK1gr1cbiIKKworIzogb3NfdW5peC5jOjkzNgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiCSdpa9k0mDVoNPg2mDi4LwjJ+SbYK1gtyCtYK9XG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJYg1SBW4NvgtaCzJDakbGCySAlbGQgg36DipVigqmCqYLogtyCtYK9IgorCisjOiBvc191bml4LmM6MTIyNgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IFgggsyDR4OJgVuC8Iyfj2+CtYLcgrWCvXJcbiIKKworIzogb3NfdW5peC5jOjEzMzQKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJYIGRpc3BsYXkggsyDYINGg2KDToLJjriUc4K1gtyCtYK9IgorCisjOiBvc191bml4LmM6MTQ3MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIlggZGlzcGxheSCCzCBvcGVuIIKqg16DQ4OAg0GDRYNngrWC3IK1gr0iCisKKyM6IG9zX3VuaXguYzozMjI3IG9zX3VuaXguYzozOTA3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIoNWg0aDi4LwjsCNc4LFgquC3IK5gvEgIgorCisjOiBvc191bml4LmM6MzI3NQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisic2ggg1aDRoOLgvCOwI1zgsWCq4LcgrmC8VxuIgorCisjOiBvc191bml4LmM6MzI3OSBvc191bml4LmM6MzkxMworbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyKDVoNGg4uCqpJsgvCV1IK1gtyCtYK9ICIKKworIzogb3NfdW5peC5jOjM0MTQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisig3CDQ4N2gvCN7JCsgsWCq4LcgrmC8VxuIgorCisjOiBvc191bml4LmM6MzQyOQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiZm9yayCCxYKrgtyCuYLxXG4iCisKKyM6IG9zX3VuaXguYzozOTIwCittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisig1KDfYOTg2iC8JKGkmaCtYLcgrWCvVxuIgorCisjOiBvc191bml4LmM6NDE4NCBvc191bml4LmM6NDMwOSBvc191bml4LmM6NTk3NQorbXNnaWQgIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCCCqklDRZDakbGC8I64gqKC3IK1gr0iCisKKyM6IG9zX3VuaXguYzo1NTU4Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiWCBkaXNwbGF5IILMIG9wZW4ggsmOuJRzgrWC3IK1gr0iCisKKyM6IG9zX3VuaXguYzo1ODgwCittc2dpZCAiWFNNUCBoYW5kbGluZyBzYXZlLXlvdXJzZWxmIHJlcXVlc3QiCittc2dzdHIgIlhTTVAggqpzYXZlLXlvdXJzZWxml3aLgYLwj4iXnYK1gsSCooLcgrciCisKKyM6IG9zX3VuaXguYzo1OTk5Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAggqqQ2pGxgvCKSo5ugrWCxIKigtyCtyIKKworIzogb3NfdW5peC5jOjYwMTgKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiWFNNUCBJQ0WQ2pGxgqqOuJRzgrWCvYLmgqSCxYK3IgorCisjOiBvc191bml4LmM6NjAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb26Cqo64lHOCtYLcgrWCvTogJXMiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIo1zIgorCisjOiBvc193MzJleGUuYzo2NQorbXNnaWQgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iCittc2dzdHIgIoNSg32Dk4Nog4mDQ4OTgsmDgYOCg4qC8IqEguiTloLEgueC6oLcgrmC8SIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJWSU2DR4OJgVsiCisKKyM6IG9zX3czMmV4ZS5jOjg5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAidmltMzIuZGxsIILwg42BW4NogsWCq4LcgrmC8YLFgrWCvSIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJETEyCqYLnitaQlIN8g0ODk4NegvCO5pO+gsWCq4LcgrmC8YLFgrWCvSIKKworIzogb3Nfd2luMTYuYzozNDIgb3Nfd2luMzIuYzozMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICKDVoNGg4uCqoNSgVuDaCAlZCCCxY9Jl7mCtYLcgrWCvSIKKworIzogb3Nfd2luMzIuYzoyNjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogg0ODeIOTg2cgJXMggvCMn5JtXG4iCisKKyM6IG9zX3dpbjMyLmM6MjY1NworbXNnaWQgImNsb3NlIgorbXNnc3RyICKVwoK2gukiCisKKyM6IG9zX3dpbjMyLmM6MjY1OQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAig42DT4NJg3QiCisKKyM6IG9zX3dpbjMyLmM6MjY2MAorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICKDVoODg2KDZ4Nfg0WDkyIKKworIzogb3Nfd2luMzIuYzozMTUwCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IINSg32Dk4NogqqCoILogtyCuYLxIgorCisjOiBvc193aW4zMi5jOjMxNjMKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyJWSU1SVU4uRVhFgqogJFBBVEgggsyShoLJgt2CwoKpguiC3IK5gvEuXG4iCisiik+VlINSg32Dk4NogsyPSZe5jOOCyYjqjp6S4o5+gvCCtYLcgrmC8S5cbiIKKyKP2o3Xgs0gIDpoZWxwIHdpbjMyLXZpbXJ1biAggvCOUY/GgrWCxIKtgr6Cs4KiLiIKKworIzogb3Nfd2luMzIuYzozMTY2Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbYLMjHiNkCIKKworIzogcXVpY2tmaXguYzoyNTgKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IIN0g0iBW4N9g2KDZ5W2jpqX8YLJICUlJWMggqqRvYK3gqyC3IK3IgorCisjOiBxdWlja2ZpeC5jOjI3MQorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiCDdINIgVuDfYNig2eVto6al/GCyZdcXIr6grmCyiAlJSVjIIKqgqCC6ILcgrWCvSIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogg3SDSIFbg32DYoNnlbaOmpfxgskgXSCCqoKgguiC3IK5gvEiCisKKyM6IHF1aWNrZml4LmM6MzM5Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiCDdINIgVuDfYNig2eVto6al/GCxYLNICUlJWMggs2DVIN8gVuDZ4KzguqC3IK5gvEiCisKKyM6IHF1aWNrZml4LmM6MzU3Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiCDdINIgVuDfYNig2eVto6al/GCzJFPknWCyZazjPiCyCAlJSVjIIKqgqCC6ILcgrciCisKKyM6IHF1aWNrZml4LmM6MzY1Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IIN0g0iBW4N9g2KDZ5W2jpqX8YLJlrOM+ILIICUlJWMggqqCoILogtyCtyIKKworIzogcXVpY2tmaXguYzozOTEKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcggsmDcINegVuDk4KqjneS6IKzguqCxIKigtyCuYLxIgorCisjOiBxdWlja2ZpeC5jOjUwMQorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IINmg0KDjINOg2eDipa8gqqWs4KigqmL84LFgrciCisKKyM6IHF1aWNrZml4LmM6OTkwCittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1Mzogl3aRZoKqguCCpIKgguiC3IK5gvEiCisKKyM6IHF1aWNrZml4LmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQgb2YgJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjEyMzEKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAojXOCqo3tj5yCs4LqgtyCtYK9KSIKKworIzogcXVpY2tmaXguYzoxNDQ0Cittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBxdWlja2ZpeCCDWINeg2KDToLMlpaU9oLFgrciCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogcXVpY2tmaXggg1iDXoNig06CzJDmk6qCxYK3IgorCisjOiBxdWlja2ZpeC5jOjE0NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICKDR4OJgVuI6peXICVkIG9mICVkOyAlZCCMwoNHg4mBWyIKKworIzogcXVpY2tmaXguYzoxOTQzCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogJ2J1ZnR5cGUnIINJg3aDVoOHg5OCqpDdkuiCs4LqgsSCooLpgsyCxY+RjZ6C3YLcgrmC8SIKKworIzogcmVnZXhwLmM6ODM4Cittc2dpZCAiRTMzOTogUGF0dGVybiB0b28gbG9uZyIKK21zZ3N0ciAiRTMzOTogg3CDXoFbg5OCqpK3greCrILcgrciCisKKyM6IHJlZ2V4cC5jOjEwMDkKK21zZ2lkICJFNTA6IFRvbyBtYW55IFxceigiCittc2dzdHIgIkU1MDogXFx6KCCCqpG9greCrILcgrciCisKKyM6IHJlZ2V4cC5jOjEwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxOiBUb28gbWFueSAlcygiCittc2dzdHIgIkU1MTogJXMoIIKqkb2Ct4KsgtyCtyIKKworIzogcmVnZXhwLmM6MTA3NworbXNnaWQgIkU1MjogVW5tYXRjaGVkIFxceigiCittc2dzdHIgIkU1MjogXFx6KCCCqpLeguiNh4LBgsSCooLcgrmC8SIKKworIzogcmVnZXhwLmM6MTA4MQorbXNnaWQgIkU1MzogVW5tYXRjaGVkICVzJSUoIgorbXNnc3RyICJFNTM6ICVzJSUoIIKqkt6C6I2HgsGCxIKigtyCuYLxIgorCisjOiByZWdleHAuYzoxMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiAlcygggqqS3oLojYeCwYLEgqKC3IK5gvEiCisKKyM6IHJlZ2V4cC5jOjEwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6ICVzKSCCqpLeguiNh4LBgsSCooLcgrmC8SIKKworIzogcmVnZXhwLmM6MTI1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY6ICVzKiBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTY6ICVzKiCCqovzlbaOmpfxgsmCyILpicKUXFyQq4KqgqCC6ILcgrciCisKKyM6IHJlZ2V4cC5jOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU3OiAlcysggqqL85W2jpqX8YLJgsiC6YnClFxckKuCqoKgguiC3IK3IgorCisjOiByZWdleHAuYzoxMzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6ICVzQCCCzIzjgsmVc5CzgsiVto6agqqCoILogtyCtYK9IgorCisjOiByZWdleHAuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1ODogJXN7IIKqi/OVto6al/GCyYLIgumJwpRcXJCrgqqCoILogtyCtyIKKworIzogcmVnZXhwLmM6MTM1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA6IFRvbyBtYW55IGNvbXBsZXggJXN7Li4ufXMiCittc2dzdHIgIkU2MDoglaGOR4LIICVzey4uLn0ggqqRvYK3gqyC3IK3IgorCisjOiByZWdleHAuYzoxMzcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiVzKiCCqpP8guqOcYLJgsiCwYLEgqKC3IK3IgorCisjOiByZWdleHAuYzoxMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjolcyVjIIKqk/yC6o5xgsmCyILBgsSCooLcgrciCisKKyMKKyM6IHJlZ2V4cC5jOjE0OTEKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiBcXF8ggsyWs4z4gsiOZ5dwlfuWQILFgrciCisKKyM6IHJlZ2V4cC5jOjE1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiVzJWMggsyM44LJgsiCyYLggqCC6ILcgrmC8SIKKworIworIzogcmVnZXhwLmM6MTU5MgorbXNnaWQgIkU2NTogSWxsZWdhbCBiYWNrIHJlZmVyZW5jZSIKK21zZ3N0ciAiRTY1OiCVc5CzgsiM45X7jlGPxoLFgrciCisKKyMKKyM6IHJlZ2V4cC5jOjE2MDUKK21zZ2lkICJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY2OiBcXHooIILNg1KDUoLFgs2LlonCgrOC6oLEgqKC3IK5gvEiCisKKyMKKyM6IHJlZ2V4cC5jOjE2MjQKK21zZ2lkICJFNjc6IFxcejEgZXQgYWwuIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NzogXFx6MSCCu4LMkbyCzYNSg1KCxYLNi5aJwoKzguqCxIKigtyCuYLxIgorCisjCisjOiByZWdleHAuYzoxNjM1Cittc2dpZCAiRTY4OiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXHoiCittc2dzdHIgIkU2ODogXFx6IILMjOOCyZVzkLOCyJW2jpqCqoKgguiC3IK1gr0iCisKKyMKKyM6IHJlZ2V4cC5jOjE2ODQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiAlcyUlWyCCzIzjgskgXSCCqoKgguiC3IK5gvEiCisKKyM6IHJlZ2V4cC5jOjE3MDAKK21zZ2lkICJFNzA6IEVtcHR5ICVzJSVbXSIKK21zZ3N0ciAiRTcwOiAlcyUlW10ggqqL84LFgrciCisKKyMKKyM6IHJlZ2V4cC5jOjE3NjAKK21zZ2lkICJFNzE6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyICVzJSUiCittc2dzdHIgIkU3MTogJXMlJSCCzIzjgsmVc5CzgsiVto6agqqCoILogtyCtYK9IgorCisjOiByZWdleHAuYzoyNTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiAlc3suLi59IJPggsmVtpZAg0eDiYFbgqqCoILogtyCtyIKKworIzogcmVnZXhwLmM6Mjg2MyByZWdleHAuYzozMDE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IINOg4mDYoNWg4WCyYLmguiShpJmOyCQs4tLlVxcjLuCqpWhjkeJ34KsgumCqYLgPyIKKworIzogcmVnZXhwLmM6MzAwNCByZWdleHAuYzozMDEzCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiCDcINegVuDk4LJguaC6YNYg16DYoNOlXORq4NHg4mBW4LFgrciCisKKyM6IHJlZ2V4cC5jOjMyNTgKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICKKT5WUgsyVlJWqilmTljpcbiIKKworIzogc2NyZWVuLmM6MjE0MworIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgjXOCqpDcj/SC3ILqgtyCtYK9IgorCisjOiBzY3JlZW4uYzo3OTU5Cittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgibyRepJ1irciCisKKyM6IHNjcmVlbi5jOjc5NjMKK21zZ2lkICIgUkVQTEFDRSIKK21zZ3N0ciAiIJJ1irciCisKKyM6IHNjcmVlbi5jOjc5NjgKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiIJS9k10iCisKKyM6IHNjcmVlbi5jOjc5NzAKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgkX2T/CIKKworIzogc2NyZWVuLmM6Nzk3MworbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiICiRfZP8KSIKKworIzogc2NyZWVuLmM6Nzk3NQorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAoknWKtykiCisKKyM6IHNjcmVlbi5jOjc5NzcKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICiJvJF6knWKtykiCisKKyM6IHNjcmVlbi5jOjc5ODAKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIgg3eDdYOJg0MiCisKKyM6IHNjcmVlbi5jOjc5OTEKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIgg0GDiYNyg0EiCisKKyM6IHNjcmVlbi5jOjc5OTQKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKIy+jOopIgorCisjOiBzY3JlZW4uYzo3OTk4Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAok1xcguiVdIKvKSIKKworIzogc2NyZWVuLmM6ODAxMQorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiCDcoNXg4WDQYOLIgorCisjOiBzY3JlZW4uYzo4MDEyCittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgg3KDV4OFg0GDiyCNcyIKKworIzogc2NyZWVuLmM6ODAxMworbXNnaWQgIiBWSVNVQUwgQkxPQ0siCittc2dzdHIgIiCDcoNXg4WDQYOLIIvpjGAiCisKKyM6IHNjcmVlbi5jOjgwMTQKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIgg1qDjINOg2ciCisKKyM6IHNjcmVlbi5jOjgwMTUKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiCNc453jPyRSZHwIgorCisjOiBzY3JlZW4uYzo4MDE2Cittc2dpZCAiIFNFTEVDVCBCTE9DSyIKK21zZ3N0ciAiIIvpjGCRSZHwIgorCisjIG1zZ2lkICIgQkxPQ0siCisjIG1zZ3N0ciAiIIN1g42DYoNOIgorIyBtc2dpZCAiIExJTkUiCisjIG1zZ3N0ciAiII1zIgorIzogc2NyZWVuLmM6ODAzMSBzY3JlZW4uYzo4MDk0Cittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICKLTJhekoYiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICKP44LcgsWMn431grWCvYLMgsWJuoLJlt+C6ILcgrciCisKKyM6IHNlYXJjaC5jOjM4Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICKJuoLcgsWMn431grWCvYLMgsWP44LJlt+C6ILcgrciCisKKyM6IHNlYXJjaC5jOjUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiCWs4z4gsiMn431lbaOmpfxgsWCtzogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6II/jgtyCxYyfjfWCtYK9gq+C6oLHilmTlonTj4qCzYKgguiC3IK5gvE6ICVzIgorCisjOiBzZWFyY2guYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiCJuoLcgsWMn431grWCvYKvguqCx4pZk5aJ04+Kgs2CoILogtyCuYLxOiAlcyIKKworIzogc2VhcmNoLmM6MTI0OQorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogJzsnIILMgqCCxoLJgs0gJz8nIIKpICcvJyCCqor6kdKCs4LqgsSCooLpIgorCisjOiBzZWFyY2guYzozNzU4Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAokU+CyZfxi5OCtYK9ilmTlonTj4qC8Ircgt4pIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3NzgKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gg0ODk4NOg4uBW4NogrOC6oK9g3SDQINDg4siCisKKyM6IHNlYXJjaC5jOjM3ODAKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICKC3YLCgqmC6ILcgrmC8SAiCisKKyM6IHNlYXJjaC5jOjM3ODEKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICKDcINYgskgLS0tLVxuIgorCisjOiBzZWFyY2guYzozODIwCittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgICiK+YLJl/GLkykiCisKKyM6IHNlYXJjaC5jOjM4MjIKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICCC3YLCgqmC6ILcgrmC8SIKKworIzogc2VhcmNoLmM6Mzg3NAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAig0ODk4NOg4uBW4NogrOC6oK9g3SDQINDg4uC8INYg0yDg4OTkoY6ICVzIgorCisjOiBzZWFyY2guYzo0MDkyCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiCMu43djXOCyYpZk5aCqoKgguiC3IK3IgorCisjOiBzZWFyY2guYzo0MjM1Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIpFTgsSCzINDg5ODToOLgVuDaIKzguqCvYN0g0CDQ4OLgqqC3YLCgqmC6ILcgrWCvSIKKworIzogc2VhcmNoLmM6NDIzNworbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICKDQ4OTg06Di4Fbg2iDdINAg0ODi4LNgqCC6ILcgrmC8SIKKworIzogc2VhcmNoLmM6NDI1MworbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogkuiLYILwgt2CwoKvgueC6oLcgrmC8SIKKworIzogc2VhcmNoLmM6NDI1NQorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogg3CDXoFbg5OC8ILdgsKCr4LnguqC3IK5gvEiCisKKyM6IHN5bnRheC5jOjMwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IJVzkLOCyIj4kJSCxYK3OiAlcyIKKworIzogc3ludGF4LmM6MzIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MToggruCzILmgqSCyI1cXJW2g06DiYNYg16CzYKgguiC3IK5gvE6ICVzIgorCisjOiBzeW50YXguYzozMzk0Cittc2dpZCAiTm8gU3ludGF4IGl0ZW1zIGRlZmluZWQgZm9yIHRoaXMgYnVmZmVyIgorbXNnc3RyICKCsYLMg2+DYoN0g0CCyZLoi2CCs4Lqgr2NXFyVtpd2kWaCzYKgguiC3IK5gvEiCisKKyM6IHN5bnRheC5jOjM0MDIKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgIkOMvozqlZeDUoOBg5ODZ4KpgueTr4r6koYiCisKKyM6IHN5bnRheC5jOjM0MTAKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICKU8ZOvivoiCisKKyM6IHN5bnRheC5jOjM0MTMKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgIpOvivqKSo5uICIKKworIzogc3ludGF4LmM6MzQxNSBzeW50YXguYzozNDkwCittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiII1zkU8og2eDYoN2jXOC5oLoguApIgorCisjOiBzeW50YXguYzozNDIwCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gjVxclbaTr4r6l3aRZiAtLS0iCisKKyM6IHN5bnRheC5jOjM0MjUKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorIpd2kWaP44LFk6+K+pKGIgorCisjOiBzeW50YXguYzozNDMxCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tII1cXJW2l3aRZiAtLS0iCisKKyM6IHN5bnRheC5jOjM0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IIK7gsyC5oKkgsiNXFyVtoNOg4mDWINegs2CoILogtyCuYLxOiAlcyIKKworIzogc3ludGF4LmM6MzQ4MAorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICJtaW5pbWFsIgorCisjOiBzeW50YXguYzozNDg3Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm1heGltYWwiCisKKyM6IHN5bnRheC5jOjM0OTkKK21zZ2lkICI7IG1hdGNoICIKK21zZ3N0ciAiOyCKWZOWICIKKworIzogc3ludGF4LmM6MzUwMQorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIIzCgsyJ/I1zIgorCisjOiBzeW50YXguYzo0MTM1Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiCCsYKxgsWCzYNPg4uBW4N2gs2LlonCgrOC6oLcgrmC8SIKKworIzogc3ludGF4LmM6NDE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6ICVzIILMlM2IzZd2kWaCqoLdgsKCqYLogtyCuYLxIgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IIKxgsyP6o+KgsWCzYj4kJRjb250YWluc4LNi5aJwoKzguqCxIKigtyCuYLxIgorCisjOiBzeW50YXguYzo0MTk4Cittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IIKxgsyP6o+KgsWCzYj4kJRjb250YWluZWRpboLNi5aJwoKzguqCxIKigtyCuYLxIgorCisjOiBzeW50YXguYzo0Mjc2Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6IIN0g0CDQ4OLlryCqpVLl3aCxYK3IgorCisjOiBzeW50YXguYzo0NjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTg6IE1pc3NpbmcgJz0nOiAlcyIKK21zZ3N0ciAiRTM5ODogJz0nIIKqgqCC6ILcgrmC8TogJXMiCisKKyM6IHN5bnRheC5jOjQ3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5OTogTm90IGVub3VnaCBhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCittc2dzdHIgIkUzOTk6IIj4kJSCqpGrguiC3IK5gvE6II1cXJW2lM2IzSAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiCDToOJg1iDXoKqjneS6IKzguqCxIKigtyCuYLxIgorCisjOiBzeW50YXguYzo1MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IINwg16BW4OTi+aQ2ILogqqC3YLCgqmC6ILcgrmC8TogJXMiCisKKyM6IHN5bnRheC5jOjUyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogg3CDXoFbg5OCzIKggsaCyYNTg36CqoKgguiC3IK3OiAlcyIKKworIzogc3ludGF4LmM6NTMwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6II1cXJW2k6+K+jogmEGRsY1zg3CDXoFbg5OCqjKTeI53kuiCs4LqgtyCtYK9IgorCisjOiBzeW50YXguYzo1MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDoglXOQs4LIiPiQlILFgrc6ICVzIgorCisjOiBzeW50YXguYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IJOZgrWCoiBzaWduIIKqgqCC6ILcgrmC8TogJXMiCisKKyM6IHN5bnRheC5jOjU0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiCL84LMiPiQlDogJXMiCisKKyM6IHN5bnRheC5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMggs2DUoNSgsWCzYuWicKCs4LqgsSCooLcgrmC8SIKKworIzogc3ludGF4LmM6NTQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIILNk+CXZYOKg1iDZ4LMkOaTqoLFgsiCr4Lqgs6CyILngsiCoiIKKworIzogc3ludGF4LmM6NTUyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFNDA5OiCWopJtgsyDT4OLgVuDdpa8OiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IJazjPiCyCA6c3ludGF4IILMg1SDdYNSg32Dk4NoOiAlcyIKKworIzogc3ludGF4LmM6NjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogg26DQ4OJg0ODZ4NPg4uBW4N2gqqC3YLCgqmC6ILcgrmC8TogJXMiCisKKyM6IHN5bnRheC5jOjYxNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IIj4kJSCqo9blaqCxYLNgsiCojogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IIj4kJSCqpG9greCrILcgrc6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxODUKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IINPg4uBW4N2gqqQ3ZLogrOC6oLEgqKC6YLMgsWDboNDg4mDQ4Nng4qDk4NOgs2Ws46LgrOC6oLcgrciCisKKyM6IHN5bnRheC5jOjYzMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogl1xcivqCuYLKk6+CtiBzaWduIILFgrc6ICVzIgorCisjOiBzeW50YXguYzo2MzUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6IJOvgrYgc2lnbiCCqoKgguiC3IK5gvE6ICVzIgorCisjOiBzeW50YXguYzo2Mzc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiCI+JCUgqqCoILogtyCuYLxOiAlcyIKKworIzogc3ludGF4LmM6NjQxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODoglXOQs4LIkmyCxYK3OiAlcyIKKworIzogc3ludGF4LmM6NjUzNAorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IJaikm2CzJFPjGmQRoLFgrciCisKKyM6IHN5bnRheC5jOjY1NDUKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiCWopJtgsyUd4xpkEaCxYK3IgorCisjOiBzeW50YXguYzo2NjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogg0qDiYFblryC4pTUjYaC8JRGjq+CxYKrgtyCuYLxOiAlcyIKKworIzogc3ludGF4LmM6NjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogj0mSW4NSgVuDaIKqkreCt4KsgtyCtzogJXMiCisKKyM6IHN5bnRheC5jOjY4NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IJVzkLOCyIj4kJSCxYK3OiAlcyIKKworIzogc3ludGF4LmM6NzM4OAorbXNnaWQgIkU0MjQ6IFRvbyBtYW55IGRpZmZlcmVudCBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBpbiB1c2UiCittc2dzdHIgIkU0MjQ6IJG9gq2CzIjZgsiC6YNug0ODiYNDg2eRrpCrgqqOZ4LtguqCt4KsgsSCooLcgrciCisKKyM6IHN5bnRheC5jOjc5MDkKK21zZ2lkICJFNjY5OiBVbnByaW50YWJsZSBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiRTY2OTogg0+Di4Fbg3aWvILJiPON/JVzicKUXFyCyJW2jpqCqoKgguiC3IK3IgorCisjLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorIy4gKiBnaXZlIGEgd2FybmluZy4KKyM6IHN5bnRheC5jOjc5MTYKK21zZ2lkICJXMTg6IEludmFsaWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIlcxODogg0+Di4Fbg3aWvILJlXOQs4LIlbaOmoKqgqCC6ILcgrciCisKKyM6IHRhZy5jOjkwCittc2dpZCAiRTU1NTogYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NTogg16DT4NYg16DYoNOgsyWlpT2gsWCtyIKKworIzogdGFnLmM6OTEKK21zZ2lkICJFNTU2OiBhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU2OiCDXoNPg1iDXoNig06CzJDmk6qCxYK3IgorCisjOiB0YWcuYzo0MTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogjcWPiYLMilmTloNeg0+C8JK0gqaCxJbfgumCsYLGgs2CxYKrgtyCuYLxIgorCisjOiB0YWcuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IINeg0+CqoLdgsKCqYLogtyCuYLxOiAlcyIKKworIzogdGFnLmM6NTgzCittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSBraW5kIHRhZyIKKworIzogdGFnLmM6NTg2Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICKDdINAg0ODi1xuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzQ0Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICKRSZHwgreC6ZTUjYaC8JP8l82CtYLEgq2CvoKzgqIgKDxDUj6CxZKGjn4pOiAiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogilmTloNeg0+CqjGCwoK+gq+CtYKpgqCC6ILcgrmC8SIKKworIzogdGFnLmM6Nzg2Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogjcWM44LJilmTloK3gumDXoNPgvCStIKmgsSQaYLegrGCxoLNgsWCq4LcgrmC8SIKKworIzogdGFnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICKDdINAg0ODiyBcIiVzXCIggqqCoILogtyCuYLxIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgIoNeg08gJWQgKJFTJWQlcykiCisKKyM6IHRhZy5jOjgyNgorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIggqmCu4LqiMiP4yIKKworIzogdGFnLmM6ODI4Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAgg16DT4LwiNmCyILpY2FzZYLFjmeXcIK1gtyCtyEiCisKKyM6IHRhZy5jOjg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTogg3SDQINDg4sgXCIlc1wiIIKqgqCC6ILcgrmC8SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIFRPIINeg08gICAgICAgIEZST00gjXMgICAgaW4gZmlsZS90ZXh0IgorCisjOiB0YWcuYzoxMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIoNeg0+DdINAg0ODiyAlcyCC8IyfjfWShiIKKworIzogdGFnLmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogg16DT4N0g0CDQ4OLgsyDcINYgqogJXMggsmQ2ILojsyCxILnguqC3IK1gr1cbiIKKworIzogdGFnLmM6MjIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogg16DT4N0g0CDQ4OLIFwiJXNcIiCCzIN0g0iBW4N9g2KDZ4LJg0eDiYFbgqqCoILogtyCtyIKKworIzogdGFnLmM6MjIwNworIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIpK8kU+CzCAlbGQgg2+DQ4NnIgorCisjOiB0YWcuYzoyMjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogg16DT4N0g0CDQ4OLgqqDXFyBW4NngrOC6oLEgqKC3IK5gvE6ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjI4MAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogg16DT4N0g0CDQ4OLgqqCoILogtyCuYLxIgorCisjOiB0YWcuYzozMDE2Cittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogg16DT4Nwg16BW4OTgvCC3YLCgq+C54LqgtyCuYLxIgorCisjOiB0YWcuYzozMDI3Cittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiCDXoNPgvCC3YLCgq+C54LqgsiCooLMgsWSUILJkISRqoK1gtyCtyEiCisKKyM6IHRlcm0uYzoxNzU5Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIILNlqKSbYLFgrcuIIy7jXOCzJFngt2NnoLdkluWloLNjp+CzILGgqiC6ILFgrc6IgorCisjOiB0ZXJtLmM6MTc4MworbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAij8iXqpJsgvCOn4LMguaCpILJkN2S6IK1gtyCtyAnIgorCisjOiB0ZXJtLmM6MjE0MQorbXNnaWQgIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiRTU1NzogdGVybWNhcIN0g0CDQ4OLgvCKSoKvgtyCuYLxIgorCisjOiB0ZXJtLmM6MjE0NQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogdGVybWluZm+CyZJblpaDR4OTg2eDioLwgt2CwoKvgueC6oLcgrmC8SIKKworIzogdGVybS5jOjIxNDcKK21zZ2lkICJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTU1OTogdGVybWNhcILJkluWloNHg5ODZ4OKgvCC3YLCgq+C54LqgtyCuYLxIgorCisjOiB0ZXJtLmM6MjMwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogdGVybWNhcILJIFwiJXNcIiCCzINHg5ODZ4OKgqqCoILogtyCuYLxIgorCisjOiB0ZXJtLmM6Mjc4MAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiCSW5aWgskgXCJjbVwiIItAlFxcgqqVS5d2gsWCtyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDk5MAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gkluWloNMgVsgLS0tIgorCisjOiB1aS5jOjI1OAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgIpBWgrWCooNWg0aDi4Lwi06TroK1gtyCt1xuIgorCisjOiB1aS5jOjE4NDEKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiCT/JfNgvCTx42egt2ShoLMg0eDiYFbgsmC5oLoj0mXuYK1gtyCty4uLlxuIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogdW5kby5jOjQwNQorbXNnaWQgIk5vIHVuZG8gcG9zc2libGU7IGNvbnRpbnVlIGFueXdheSIKK21zZ3N0ciAiicKUXFyCyINBg5ODaINEgs2CoILogtyCuYLxOiCCxoLogqCCpoK4kbGCr4LcgrciCisKKyM6IHVuZG8uYzo1NjEKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiCNc5TUjYaCqorUiOGCwYLEgqKC3IK3IgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIjEgidOPipXPjViCtYLcgrWCvSIKKworIzogdW5kby5jOjc1OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIInTj4qVz41YgrWC3IK1gr0iCisKKyM6IHVuZG8uYzo4MTIKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogg0GDk4Nog0SDioNYg2eCqonzguqCxIKigtyCtyIKKworIzogdW5kby5jOjg0NAorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiCDQYOTg2iDRI1zgqqCoILogtyCuYLxIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6MTczMQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgg3KDYoNnIEdVSSCUxSIKKworIzogdmVyc2lvbi5jOjE3MzMKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIINyg2KDZyBHVUkglMUiCisKKyM6IHZlcnNpb24uYzoxNzM2Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgaW4gV2luMzJzIIOCgVuDaCIKKworIzogdmVyc2lvbi5jOjE3MzgKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIHdpdGggT0xFIINUg3yBW4NnIgorCisjOiB2ZXJzaW9uLmM6MTc0MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIINyg2KDZyCDUoOTg1xcgVuDiyCUxSIKKworIzogdmVyc2lvbi5jOjE3NDUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgg3KDYoNnIJTFIgorCisjOiB2ZXJzaW9uLmM6MTc0OQorbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiCDcoNig2cgTVMtRE9TIJTFIgorCisjOiB2ZXJzaW9uLmM6MTc1MQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiCDcoNig2cgTVMtRE9TIJTFIgorCisjOiB2ZXJzaW9uLmM6MTc1NworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkglMUiCisKKyM6IHZlcnNpb24uYzoxNzU5Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFgglMUiCisKKyM6IHZlcnNpb24uYzoxNzYyCittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyCUxSIKKworIzogdmVyc2lvbi5jOjE3NjcKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUyCUxSIKKworIzogdmVyc2lvbi5jOjE3NzcKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICIiCisiXG4iCisik0uXcI3Pg3CDYoNgOiAiCisKKyM6IHZlcnNpb24uYzoxODAzIHZlcnNpb24uYzoyMTcxCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJNb2RpZmllZCBieSAiCisKKyM6IHZlcnNpb24uYzoxODEwCittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIkNvbXBpbGVkICIKKworIzogdmVyc2lvbi5jOjE4MTMKK21zZ2lkICJieSAiCittc2dzdHIgImJ5ICIKKworIzogdmVyc2lvbi5jOjE4MjUKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkh1Z2UglMUgIgorCisjOiB2ZXJzaW9uLmM6MTgyOAorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJCaWcglMUgIgorCisjOiB2ZXJzaW9uLmM6MTgzMQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyKSyo/tIJTFICIKKworIzogdmVyc2lvbi5jOjE4MzQKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJTbWFsbCCUxSAiCisKKyM6IHZlcnNpb24uYzoxODM2Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJUaW55IJTFICIKKworIzogdmVyc2lvbi5jOjE4NDIKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgIndpdGhvdXQgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NDcKK21zZ2lkICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKK21zZ3N0ciAid2l0aCBHVEsyLUdOT01FIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODQ5Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAid2l0aCBHVEstR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NTMKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAid2l0aCBHVEsyIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODU1Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAid2l0aCBHVEsgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NjAKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg2NAorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJ3aXRoIFgxMS1uZVh0YXcgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4NjYKK21zZ2lkICJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIKK21zZ3N0ciAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODcwCittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgIndpdGggQmVPUyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg3MworbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgIndpdGggUGhvdG9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODc2Cittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICJ3aXRoIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODc5Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAid2l0aCBDYXJib24gR1VJLiIKKworIzogdmVyc2lvbi5jOjE4ODIKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIndpdGggQ29jb2EgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4ODUKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICJ3aXRoICiDToOJg1aDYoNOKSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg5NgorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgi0CUXFyCzIjql5cgl0yM+CgrKS+Ws4z4KC0pXG4iCisKKyM6IHZlcnNpb24uYzoxOTA4Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICCDVoNYg2WDgCB2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTEzCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIIOGgVuDVSB2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTE4Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIJHmMoOGgVuDVSB2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTIzCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIJHmM4OGgVuDVSB2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTI4Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICCDhoFbg1UgZXhyYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTMzCittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICCR5jKDhoFbg1UgZXhyYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTM5Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIINWg1iDZYOAIGd2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTQzCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgg4aBW4NVIGd2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTQ3Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgkeYyg4aBW4NVIGd2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTUyCittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgkeYzg4aBW4NVIGd2aW1yYzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTU5Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgg1aDWINlg4CDgYNqg4WBWzogXCIiCisKKyM6IHZlcnNpb24uYzoxOTY3Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgICAgj8iXqo6egswgJFZJTTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTczCittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICKPyJeqjp6CzCAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTc3Cittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAig1KDk4Nwg0ODizogIgorCisjOiB2ZXJzaW9uLmM6MTk4MworbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIoNSg5ODcINDg4k6ICIKKworIzogdmVyc2lvbi5jOjE5ODgKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIoOKg5ODTjogIgorCisjOiB2ZXJzaW9uLmM6MTk5MworbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIoNmg2+DYoNPg3KDi4NoIgorCisjOiB2ZXJzaW9uLmM6MjAzMgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjIwMzQKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyc2lvbiAiCisKKyM6IHZlcnNpb24uYzoyMDM1Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJieSBCcmFtIE1vb2xlbmFhciCRvC4iCisKKyM6IHZlcnNpb24uYzoyMDM5Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIILNg0mBW4N2g5ODXFyBW4NYgsWCoILojqmXUoLJlHqVeonClFxcgsWCtyIKKworIzogdmVyc2lvbi5jOjIwNDEKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAig0WDS4OTg1+CzIxigtyC6oLIgqKOcYufgr2Cv4LJiYePlYLwISIKKworIzogdmVyc2lvbi5jOjIwNDIKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICKP2o3XgsiP7pXxgs0gICAgICAgICAgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MjA0NAorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgIo9Jl7mCt4LpgsmCzSAgICAgICAgICAgOnE8RW50ZXI+ICAgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoyMDQ1Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAig0mDk4OJg0ODk4N3g4uDdoLNICAgICA6aGVscDxFbnRlcj4ggqkgPEYxPiAgICIKKworIzogdmVyc2lvbi5jOjIwNDYKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICKDb4Fbg1eDh4OTj+6V8YLNICAgICAgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIgorCisjOiB2ZXJzaW9uLmM6MjA0OQorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJWaYzdireDgoFbg2iCxZOujeyShiIKKworIzogdmVyc2lvbi5jOjIwNTAKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICJWaW2QhI+nkmyCyYK3gumCyYLNICAgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MjA1MQorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIo/ajdeCyI/ulfGCzSAgICAgICAgICAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzoyMDY2Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAij9qN14LNg4GDaoOFgVuCzCCDd4OLg3aBqIzHjpkggvCOUY/GgrWCxIm6grOCoiAgICIKKworIzogdmVyc2lvbi5jOjIwNjgKK21zZ2lkICJSdW5uaW5nIG1vZGVsZXNzLCB0eXBlZCB0ZXh0IGlzIGluc2VydGVkIgorbXNnc3RyICKDgoFbg2iWs4LFjsCNc5KGLCCDXoNDg3aCtYK9lbaOmoKqkX2T/IKzguqC3IK3IgorCisjOiB2ZXJzaW9uLmM6MjA2OQorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIoOBg2qDhYFbgswgldKPV4GokVORzJDdkuiBqJF9k/woj4mQU47SKYOCgVuDaJDYkdYiCisKKyM6IHZlcnNpb24uYzoyMDcwCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAggsWDgoFbg2iXTILJICAgICAgICIKKworIzogdmVyc2lvbi5jOjIwNzQKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIgorbXNnc3RyICKDgYNqg4WBW4LMIJXSj1eBqJFTkcyQ3ZLogahWaYzdireDgoFbg2iQ2JHWICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MjA3NQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIILFVmltgsaCtYLEk66N7CAgICAiCisKKyM6IHZlcnNpb24uYzoyMTIyCittc2dpZCAiU3BvbnNvciBWaW0gZGV2ZWxvcG1lbnQhIgorbXNnc3RyICJWaW2CzIpKlK2C8ImeiYeCtYLEgq2CvoKzgqIhIgorCisjOiB2ZXJzaW9uLmM6MjEyMworbXNnaWQgIkJlY29tZSBhIHJlZ2lzdGVyZWQgVmltIHVzZXIhIgorbXNnc3RyICJWaW2CzJNvmF6DhoFbg1WCyYLIgsGCxIKtgr6Cs4KiISIKKworIzogdmVyc2lvbi5jOjIxMjYKK21zZ2lkICJ0eXBlICA6aGVscCBzcG9uc29yPEVudGVyPiAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICKP2o3XgsiP7pXxgs0gICAgICAgICAgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIgorCisjOiB2ZXJzaW9uLmM6MjEyNworbXNnaWQgInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIo/ajdeCyI/ulfGCzSAgICAgICAgICAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAiCisKKyM6IHZlcnNpb24uYzoyMTI5Cittc2dpZCAibWVudSAgSGVscC0+U3BvbnNvci9SZWdpc3RlciAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAij9qN14LNg4GDaoOFgVuCzCCDd4OLg3aBqINYg3yDk4NUgVsvk2+YXiCC8I5Rj8aCtYLEibqCs4KiICAgIgorCisjOiB2ZXJzaW9uLmM6MjEzOQorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIiAgIIx4jZA6IFdpbmRvd3MgOTUvOTgvTWUggvCMn49vICAiCisKKyM6IHZlcnNpb24uYzoyMTQyCittc2dpZCAidHlwZSAgOmhlbHAgd2luZG93czk1PEVudGVyPiAgZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAiII/ajdeCyI/ulfGCzSAgICAgICAgICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IIN2g4yDcoOFgVuDRYNCg5ODaINFgqqCoILogtyCuYLxIgorCisjOiB3aW5kb3cuYzo1ODEKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiCNto/jgsaJRYm6gvCTr46egsmVqoqEgreC6YKxgsaCzYLFgquC3IK5gvEiCisKKyM6IHdpbmRvdy5jOjEzNDAKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IJG8gsyDRYNCg5ODaINFgqqVqoqEgrOC6oLEgqKC6Y6egsmCzY+HifGCxYKrgtyCuYLxIgorCisjOiB3aW5kb3cuYzoxODM2Cittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiCNxYzjgsyDRYNCg5ODaINFgvCVwoK2gumCsYLGgs2CxYKrgtyCuYLxIgorCisjOiB3aW5kb3cuYzoyNTY3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIor5gsmDRYNCg5ODaINFgs0xgsKCtYKpgqCC6ILcgrmC8SIKKworIzogd2luZG93LmM6MjYxNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiCRvILMg0WDQoOTg2iDRYLJgs2Vz41YgqqCoILogtyCtyIKKworIzogd2luZG93LmM6NDQ4MAorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IINKgVuDXFyDi4LMibqCyYN0g0CDQ4OLlryCqoKgguiC3IK5gvEiCisKKyM6IHdpbmRvdy5jOjQ1OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiBwYXRogsmCzSBcIiVzXCIggsaCooKkg3SDQINDg4uCqoKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjMyIGlmX3BlcmwueHM6MzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IIOJg0ODdYOJg4ogJXMggvCDjYFbg2iCxYKrgtyCuYLxgsWCtYK9IgorCisjOiBpZl9wZXJsLnhzOjU1NAorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyKCsYLMg1KDfYOTg2iCzZazjPiCxYK3LCCCsoLfgvGCyIKzgqI6IFBlcmyDiYNDg3WDiYOKgvCDjYFbg2iCxYKrgtyCuYLxgsWCtYK9LiIKKworIzogaWZfcGVybC54czo2MDcKK21zZ2lkICJFMjk5OiBQZXJsIGV2YWx1YXRpb24gZm9yYmlkZGVuIGluIHNhbmRib3ggd2l0aG91dCB0aGUgU2FmZSBtb2R1bGUiCittc2dzdHIgIiIKKyJFMjk5OiCDVIOTg2iDe4Nig06DWILFgs0gU2FmZSAiCisig4KDV4OFgVuDi4LwjmeXcIK1gsiColBlcmyDWINOg4qDdoNngs2L1oK2gueC6oLEgqKC3IK3IgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4MworbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAiimWDdINAg0ODi4LwlcqBWILMIFZpbSCCxZXSj1coJk0pIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAikVODdINAg0ODi4LwMYLCgswgVmltIILFldKPVygmVikiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTk4Cittc2dpZCAiJkRpZmYgd2l0aCBWaW0iCittc2dzdHIgIlZpbSCCxY23laqV0o9XKCZEKSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTEKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiVmltIILFldKPVygmVikiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjMzCittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIor5kbaCzCBWaW0ggsWV0o9XIC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAikUmR8IKzguqCvYN0g0CDQ4OLgvAgVmltIILFldKPVyIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIotOk66DR4OJgVs6IGd2aW0ggsmDcINYgqqSyoLBgsSCooLpgqmKbYKpgt+CxIKtgr6Cs4KiISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZ3ZpbWV4dC5kbGwgg0eDiYFbIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg5OQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAig3CDWIKqkreCt4KsgtyCtyEiCisKKyM6IGdsb2JhbHMuaDoxMDIyCittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS2Db4Nig3SDQILJjXOCqoKgguiC3IK5gvEtLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTg1Cittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiCDUoN9g5ODaIKqkoaSZoKzguqC3IK1gr0iCisKKyM6IGdsb2JhbHMuaDoxMTg2Cittc2dpZCAiRTQ3MTogQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkU0NzE6IIj4kJSCqpVLl3aCxYK3IgorCisjOiBnbG9iYWxzLmg6MTE4NworbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBcXCCCzIzjgs0gLyCCqSA/IIKpICYggsWCyIKvguqCzoLIguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMTg5Cittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiCDUoN9g5ODaIOJg0ODk4LFgs2Ws4z4gsWCtzsgPENSPoLFjsCNcywgQ1RSTC1DgsWC4oLfgukiCisKKyM6IGdsb2JhbHMuaDoxMTkxCittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiCMu43dgsyDZoNCg4yDToNng4qC4oNeg0+Mn431gsWCzWV4cmMvdmltcmOCzINSg32Dk4Nogs2LlonCgrOC6oLcgrmC8SIKKworIzogZ2xvYmFscy5oOjExOTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogOmVuZGlmIIKqgqCC6ILcgrmC8SIKKworIzogZ2xvYmFscy5oOjExOTQKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IDplbmR0cnkggqqCoILogtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTE5NQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiA6ZW5kd2hpbGUggqqCoILogtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTE5NgorbXNnaWQgIkU1ODg6IDplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4ODogOndoaWxlIILMgsiCoiA6ZW5kd2hpbGUggqqCoILogtyCtyIKKworIzogZ2xvYmFscy5oOjExOTgKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogg3SDQINDg4uCqpG2jd2CtYLcgrcgKCEggvCSx4nBgsWP44+RKSIKKworIzogZ2xvYmFscy5oOjExOTkKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3Mjogg1KDfYOTg2iCqo64lHOCtYLcgrWCvSIKKworIzogZ2xvYmFscy5oOjEyMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDoglqKSbYLMg3SDSIOTg2eDWoNig2c6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiCWopJtgsyDdINIg5ODZzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogg3SDSIOTg2cgXCIlc1wiIILNjMWS6JWdgsWCzYKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjEwCittc2dpZCAiRTQ3MzogSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIkU0NzM6IJPglZSDR4OJgVuCxYK3IgorCisjOiBnbG9iYWxzLmg6MTIxMQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICKKhI2egtyC6oLcgrWCvSIKKworIzogZ2xvYmFscy5oOjEyMTIKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiCWs4z4gsiDQYNog4yDWILFgrciCisKKyM6IGdsb2JhbHMuaDoxMjEzCittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDoglrOM+ILIiPiQlILFgrciCisKKyM6IGdsb2JhbHMuaDoxMjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiCWs4z4gsiI+JCUgsWCtzogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiCWs4z4gsiOroLFgrc6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxOAorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiCWs4z4gsiUzYjNgsWCtyIKKworIzogZ2xvYmFscy5oOjEyMTkKK21zZ2lkICJFNDc2OiBJbnZhbGlkIGNvbW1hbmQiCittc2dzdHIgIkU0NzY6IJazjPiCyINSg32Dk4NogsWCtyIKKworIzogZ2xvYmFscy5oOjEyMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIILNg2aDQoOMg06DZ4OKgsWCtyIKKworIzogZ2xvYmFscy5oOjEyMjQKK21zZ2lkICJFMTg6IFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBiZWZvcmUgJz0nIgorbXNnc3RyICJFMTg6IJdcXIr6grmCypW2jpqCqiAnPScggsyRT4LJgqCC6ILcgrWCvSIKKworIzogZ2xvYmFscy5oOjEyMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IFwiJXNcIigpIILMg4mDQ4N1g4mDiozEj2+CyY64lHOCtYLcgrWCvSIKKworIzogZ2xvYmFscy5oOjEyMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogg4mDQ4N1g4mDioLMitaQlCAlcyCC8IONgVuDaILFgquC3IK5gvGCxYK1gr0iCisKKyM6IGdsb2JhbHMuaDoxMjM1Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IIN9gVuDToLJlrOM+ILIjXOU1I2GgqqOd5LogrOC6oLEgqKC3IK1gr0iCisKKyM6IGdsb2JhbHMuaDoxMjM2Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogg32BW4NOgs2Q3ZLogrOC6oLEgqKC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjM3Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6ICdtb2RpZmlhYmxlJyCCqoNJg3SCyILMgsUsIJXPjViCxYKrgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTIzOAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogg1iDToOKg3aDZ4LMk/yC6o5xgqqQW4K3gqyC3IK3IgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzoglZuDdINAg0ODi4LNgqCC6ILcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IIK7gsyC5oKkgsiSWo9rk/yXzYLNgqCC6ILcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyNDEKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6ICEggs2LlonCgrOC6oLEgqKC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjQzCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBHVUmCzY5nl3CVc4nClFxcgsWCtzogg1KDk4Nwg0ODi46egsmWs4z4gsmCs4LqgsSCooLcgrciCisKKyM6IGdsb2JhbHMuaDoxMjQ2Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IIN3g3WDiYNDjOqCzY5nl3CVc4nClFxcgsWCtzogg1KDk4Nwg0ODi46egsmWs4z4gsmCs4LqgsSCooLcgrdcbiIKKworIzogZ2xvYmFscy5oOjEyNDkKK21zZ2lkICJFMjc6IEZhcnNpIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI3OiCDeYOLg1aDQYzqgs2OZ5dwlXOJwpRcXILFgrc6IINSg5ODcINDg4uOnoLJlrOM+ILJgrOC6oLEgqKC3IK3XG4iCisKKyM6IGdsb2JhbHMuaDoxMjUyCittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogg0GDiYNyg0GM6oLNjmeXcJVzicKUXFyCxYK3OiCDUoOTg3CDQ4OLjp6CyZazjPiCyYKzguqCxIKigtyCt1xuIgorCisjOiBnbG9iYWxzLmg6MTI1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IIK7gsyC5oKkgsiWvILMg26DQ4OJg0ODZ4NPg4uBW4N2gs2CoILogtyCuYLxOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNTcKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IILcgr6DZYNMg1iDZ4KqkX2T/IKzguqCxIKigtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI1OAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IIjIkU+CyYNSg32Dk4NojXOCqoKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjU5Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMToggruCzILmgqSCyIN9g2KDc4OTg0+CzYKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjYwCittc2dpZCAiRTQ3OTogTm8gbWF0Y2giCittc2dzdHIgIkU0Nzk6IIpZk5aCzYKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDogilmTloLNgqCC6ILcgrmC8TogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjYyCittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIkUzMjogg3SDQINDg4uWvIKqgqCC6ILcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyNjMKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IJCzi0uVXFyMu5J1ireCqoLcgr6OwI1zgrOC6oLEgqKC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjY0Cittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IINSg32Dk4NogqqC3IK+jsCNc4KzguqCxIKigtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI2NQorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IJCzi0uVXFyMu4KqgtyCvo7AjXOCs4LqgsSCooLcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiCUzYjNjneS6ILNi5aJwoKzguqCxIKigtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI2OAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6II9blaqCyJdll8qCqoKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogJXMggsaCooKklryRT4LMk2+YXoKzguqCvYNUgVuDb4LNgqCC6ILcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6IIN0g0CDQ4OLICVzIILwjeyQrILFgquC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjc0Cittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiCI6o6eg3SDQINDg4uCzJa8kU+C8I7mk76CxYKrgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6IIN0g0CDQ4OLIFwiJXNcIiCC8IpKgq+C3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogg3SDQINDg4sgJXMggvCTx42egt+C3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjc3Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMzc6II3FjOOCzJXPjViCqpXbkbaCs4LqgsSCooLcgrmC8SAoISCC8JLHicGCxZXPjViC8JRqivwpIgorCisjOiBnbG9iYWxzLmg6MTI3OAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiCI+JCUgqqL84LFgrciCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogkJSSbIKql3aLgYKzguqCxIKigtyCtyIKKworIzogZ2xvYmFscy5oOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiCDR4OJgVuDdINAg0ODiyAlcyCC8IpKgq+C3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMjg2Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogg2aDQoNYg3aDjINDgvCKSoKvgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI4OAorbXNnaWQgIkU0MTogT3V0IG9mIG1lbW9yeSEiCittc2dzdHIgIkU0MTogg4GDgoOKgqqQc4KricqCxILcgrWCvSEiCisKKyM6IGdsb2JhbHMuaDoxMjkwCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIoNwg16BW4OTgs2C3YLCgqmC6ILcgrmC8YLFgrWCvSIKKworIzogZ2xvYmFscy5oOjEyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NjogUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDg2OiCDcINegVuDk4LNgt2CwoKpguiC3IK5gvGCxYK1gr06ICVzIgorCisjOiBnbG9iYWxzLmg6MTI5MworbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IIj4kJSCzZCzgsySbILFgsiCr4Lqgs6CyILogtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTogkU+CzINmg0KDjINOg2eDioLJlt+C6oLcgrmC8SIKKworIzogZ2xvYmFscy5oOjEyOTkKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiCDR4OJgVuCzYKgguiC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiCKWZOWlbaOmpfxgqqUapG5grWCxIKigtyCtyIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiCVc5CzgsiQs4tLlVxcjLuDdoONg0+DiYOAgsWCtyIKKworIzogZ2xvYmFscy5oOjEzMDMKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6ICdyZWFkb25seScgg0mDdoNWg4eDk4KqkN2S6IKzguqCxIKigtyCtyAoISCC8JLHicGCxY/jj5GCqykiCisKKyM6IGdsb2JhbHMuaDoxMzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IJPHjuaQ6pdwlc+QlCBcIiVzXCIggsmQ3ZLogreC6YKxgsaCzYLFgquC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMzA4Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiCDR4OJgVuDdINAg0ODi4LMk8eNnpKGgsmDR4OJgVuCqpStkLaCtYLcgrWCvSIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNDg6IE5vdCBhbGxvd2VkIGluIHNhbmRib3giCittc2dzdHIgIkU0ODogg1SDk4Nog3uDYoNOg1iCxYLNi5aCs4LqgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTMxMworbXNnaWQgIkU1MjM6IE5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU1MjM6IIKxgrGCxYLNi5aJwoKzguqC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMzE2Cittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiCDWINOg4qBW4OTg4KBW4NogsyQ3ZLogsmCzZHOiZ6CtYLEgqKC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMzE4Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IJazjPiCyINYg06DjYFbg4uXyoLFgrciCisKKyM6IGdsb2JhbHMuaDoxMzE5Cittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiAnc2hlbGwnIINJg3aDVoOHg5OCqovzgsWCtyIKKworIzogZ2xvYmFscy5oOjEzMjEKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IHNpZ24ggsyDZoFbg16C8JPHjZ6C34LcgrmC8YLFgrWCvSIKKworIzogZ2xvYmFscy5oOjEzMjMKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiCDWIOPg2KDdoN0g0CDQ4OLgsyDToONgVuDWY6eg0eDiYFbgsWCtyIKKworIzogZ2xvYmFscy5oOjEzMjQKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiCDXoNPg1iDXoNig06CqovzgsWCtyIKKworIzogZ2xvYmFscy5oOjEzMjUKK21zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCittc2dzdHIgIkU3NDogg1KDfYOTg2iCqpWhjkeCt4KsgtyCtyIKKworIzogZ2xvYmFscy5oOjEzMjYKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NToglryRT4KqkreCt4KsgtyCtyIKKworIzogZ2xvYmFscy5oOjEzMjcKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3NjogWyCCqpG9greCrILcgrciCisKKyM6IGdsb2JhbHMuaDoxMzI4Cittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6IIN0g0CDQ4OLlryCqpG9greCrILcgrciCisKKyM6IGdsb2JhbHMuaDoxMzI5Cittc2dpZCAiRTQ4ODogVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAiRTQ4ODogl12VqoLIlbaOmoKqjOOC64LJgqCC6ILcgrciCisKKyM6IGdsb2JhbHMuaDoxMzMwCittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODoglqKSbYLMg32BW4NOIgorCisjOiBnbG9iYWxzLmg6MTMzMQorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTogg4+DQ4OLg2iDSoFbg2iC8JNXikqCxYKrgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTMzMworbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIILNICd3aW5taW5oZWlnaHQnIILmguiPrIKzgq2CxYKrgtyCuYLxIgorCisjOiBnbG9iYWxzLmg6MTMzNQorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgnIILNICd3aW5taW53aWR0aCcgguaC6I+sgrOCrYLFgquC3IK5gvEiCisKKyM6IGdsb2JhbHMuaDoxMzM4Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6II+RjZ6C3ZKGgsyDR4OJgVsiCisKKyM6IGdsb2JhbHMuaDoxMzM5Cittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAig1uDjYNKg0WDk4NnIgorCisjOiBnbG9iYWxzLmg6MTM0MQorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogg1iDToOKg3aDZ4jIik+CxTxTSUQ+gqqOZ4LtguqC3IK1gr0iCisKKyM6IGdsb2JhbHMuaDoxMzQ0Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiCWs4z4gsiOroLwjvOCr47mguiC3IK1gr0iCisKKyM6IGdsb2JhbHMuaDoxMzQ3Cittc2dpZCAiRTQ2MzogUmVnaW9uIGlzIGd1YXJkZWQsIGNhbm5vdCBtb2RpZnkiCittc2dzdHIgIkU0NjM6IJfMiOaCqpXbjOyCs4LqgsSCooLpgsyCxSwglc+NWILFgquC3IK5gvEiCmRpZmYgLS1naXQgYS9zcmMvcG8va28ucG8gYi9zcmMvcG8va28ucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0Y2E4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9rby5wbwpAQCAtMCwwICsxLDY1ODAgQEAKKyMgS29yZWFuIHRyYW5zbGF0aW9uIGZvciBWaW0KKyMKKyMgRklSU1QgQVVUSE9SIE5hbSBTdW5nSHl1biA8bmFtc2hAa2xkcC5vcmc+LCAyMDAwLTIwMDQKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IHZpbSA2LjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogTmFtIFN1bmdIeXVuIDxuYW1zaEBrbGRwLm9yZz5cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNC0wNS0xNyAxNzoyNyswOTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wNS0xNyAxODoxNyswOTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBOYW0gU3VuZ0h5dW4gPG5hbXNoQGtsZHAub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IEdUUCBLb3JlYW4gPGdub21lLWtyLXRyYW5zbGF0aW9uQGdub21lLm9yLmtyPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWV1Yy1rclxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiC59sbbuKYgx9K058fSILz2IL74vu68rSCzobPAtM+02S4uLiIKKworIzogYnVmZmVyLmM6MTA1Cittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogufbG27imIMfStOfH0iC89iC++L7uvK0gtNm4pSCwySC757/rx9W0z7TZLi4uIgorCisjOiBidWZmZXIuYzo4MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxNTogTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICJFNTE1OiCzu7fBwfggufbG27ChIL74vcC0z7TZIgorCisjOiBidWZmZXIuYzo4MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6IMH2v/bB+CC59sbbsKEgvvi9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjgwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiC/z8D8yPcgwfa/9sH4ILn2xtuwoSC++L3AtM+02SIKKworIzogYnVmZmVyLmM6ODE3Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIrn2xtsgx9EgsLOwoSCzu7fBwbO9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjgxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICK59sbbICVkILCzsKEgs7u3wcGzvcC0z7TZIgorCisjOiBidWZmZXIuYzo4MjQKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICK59sbbIMfRILCzsKEgwfa/9sGzvcC0z7TZIgorCisjOiBidWZmZXIuYzo4MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICK59sbbICVkILCzsKEgwfa/9sGzvcC0z7TZIgorCisjOiBidWZmZXIuYzo4MzEKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIrn2xtsgx9EgsLOwoSC/z8D8yPcgwfa/9sGzvcC0z7TZIgorCisjOiBidWZmZXIuYzo4MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgIrn2xtsgJWSws7ChIL/PwPzI9yDB9r/2wbO9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjg5NAorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6ILnZsu8gufbG27imIMOjwLsgvPYgvvi9wLTPtNkiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MzMKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogs6q/rbXIILn2xtuwoSC++L3AtM+02SIKKworIzogYnVmZmVyLmM6OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQnVmZmVyICVsZCBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTg2OiC59sbbICVsZMDMKLChKSDBuMDnx8/B9iC+yr3AtM+02SIKKworIzogYnVmZmVyLmM6OTQ4Cittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6ILi2wfa4tyC59sbbwNS0z7TZIgorCisjOiBidWZmZXIuYzo5NTAKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IMO5ILn4wrAgufbG28DUtM+02SIKKworIzogYnVmZmVyLmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU4OTogufbG2yAlbGTAuyi4pikguLbB9ri3wLi3ziCw7cSjILXaIMD6wOXHz8H2IL7KvtK9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPIgorIrHiKSIKKworIzogYnVmZmVyLmM6MTAwNQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiC4tsH2uLcgufbG27imILO7uLEgvPYgvvi9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjE1MzgKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiCw5rDtOiDGxMDPIMDMuKcguPG3z8DMILPRw8a9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjE3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiC59sbbICVsZMC7KLimKSDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBidWZmZXIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5MzogJXPAuyi4pikgx8+zqiDAzLvzIMOjvtK9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjE5NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6ICVzv80guMK0wiC59sbbsKEgvvi9wLTPtNkiCisKKyM6IGJ1ZmZlci5jOjIzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgIiVsZCDB2SIKKworIzogYnVmZmVyLmM6MjQyMgorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IMDMIMDMuKfAuyCwocH4ILn2xtuwoSDAzLnMIMDWvcC0z7TZIgorCisjOiBidWZmZXIuYzoyNzE3Cittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbudmy8V0iCisKKyM6IGJ1ZmZlci5jOjI3MjIKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIluw7cShwfYgvsq+0sC9XSIKKworIzogYnVmZmVyLmM6MjcyNworbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIlu79SDGxMDPXSIKKworIzogYnVmZmVyLmM6MjcyOAorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIlvA0LHiIL+ht69dIgorCisjOiBidWZmZXIuYzoyNzMwIGZpbGVpby5jOjIxMTIKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbwNCx4iDA/L/rXSIKKworIzogYnVmZmVyLmM6Mjc1MQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIjEgwdkgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICIlbGQgwdkgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIiVsZCAvICVsZCDB2SAtLSVkJSUtLSDErSAiCisKKyM6IGJ1ZmZlci5jOjI4NjgKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIlvGxMDPIL74wL1dIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI5MDgKK21zZ2lkICJoZWxwIgorbXNnc3RyICK1tb/yuLsiCisKKyM6IGJ1ZmZlci5jOjM0Njcgc2NyZWVuLmM6NTA3NQorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW7W1v/K4u10iCisKKyM6IGJ1ZmZlci5jOjM0OTkgc2NyZWVuLmM6NTA4MQorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW7nMuK4gurix4l0iCisKKyM6IGJ1ZmZlci5jOjM3NzkKK21zZ2lkICJBbGwiCittc2dzdHIgIrjwtc4iCisKKyM6IGJ1ZmZlci5jOjM3NzkKK21zZ2lkICJCb3QiCittc2dzdHIgIrnZtNoiCisKKyM6IGJ1ZmZlci5jOjM3ODEKK21zZ2lkICJUb3AiCittc2dzdHIgIrLAtOux4iIKKworIzogYnVmZmVyLmM6NDUyOQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgufbG2yC48bfPOlxuIgorCisjOiBidWZmZXIuYzo0NTYyCittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbv6G3ryC48bfPXSIKKworIzogYnVmZmVyLmM6NDU3NSBtZW1saW5lLmM6MTUyMQorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW8bEwM8gvvjAvV0iCisKKyM6IGJ1ZmZlci5jOjQ4ODgKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCx4sijIC0tLSIKKworIzogYnVmZmVyLmM6NDkwNworIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICIlc7+hILTrx9EgseLIozoiCisKKyM6IGJ1ZmZlci5jOjQ5MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIMHZPSVsZCAgaWQ9JWQgIMDMuKc9JXMiCisKKyM6IGRpZmYuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6ICVsZLCzIMDMu/PAxyC59sbbv6EgtOvH2LyttMIgZGlmZrimIMfSILz2IL74vcC0z7TZIgorCisjOiBkaWZmLmM6NzEzCittc2dpZCAiRTk3OiBDYW5ub3QgY3JlYXRlIGRpZmZzIgorbXNnc3RyICJFOTc6IGRpZma4piC4uLXpILz2IL74vcC0z7TZIgorCisjOiBkaWZmLmM6ODE4Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAixtDFsCDGxMDPIgorCisjOiBkaWZmLmM6MTA2OQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogZGlmZiDD4rfCwLsgwNDAuyC89iC++L3AtM+02SIKKworIzogZGlmZi5jOjE4MTkKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogx/bA5yC59sbbtMIgZGlmZiC788XCsKEgvsa01bTPtNkiCisKKyM6IGRpZmYuYzoxODMxCittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogtNm4pSC59sbbwd+/oSBkaWZmILvzxcLAziCw1CC++L3AtM+02SIKKworIzogZGlmZi5jOjE4MzkKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIiIKKyJFMTAxOiC1zrCzIMDMu/PAxyC59sbbsKEgZGlmZiC788XCv6m8rSC+7rayILDNwLsgveG+38fSIMH2IL7LILz2IL74vcC0z7TZIgorCisjOiBkaWZmLmM6MTg2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IFwiJXNcIiC59sbbuKYgw6PAuyC89iC++L3AtM+02SIKKworIzogZGlmZi5jOjE4NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiBcIiVzXCIgufbG27TCIGRpZmYgu/PFwrChIL7GtNW0z7TZIgorCisjOiBkaWdyYXBoLmM6MjE5OQorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiBkaWdyYXBov6G0wiBFc2NhcGXAuyC+tSC89iC++L3AtM+02SIKKworIzogZGlncmFwaC5jOjIzODQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IMWwuMogxsTAz8C7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGRpZ3JhcGguYzoyNDExCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiC60revtenAziDGxMDPv6G8rSA6bG9hZGtleW1hcMC7ILvnv+vHz8H2IL7KvtK9wLTPtNkiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgs7m4uyC/z7y6ICheTl5QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCittc2dzdHIgIiBeWCC48LXlICheRV5ZXkxeXV5GXkleS15EXlZeTl5QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgs7m4uyC3zsTDIL/PvLogKF5OXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTF5OXlApIgorbXNnc3RyICIgwPzDvCDB2SC/z7y6ICheTF5OXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GXk5eUCkiCittc2dzdHIgIiDGxMDPIMDMuKcgv8+8uiAoXkZeTl5QKSIKKworIzogZWRpdC5jOjQ3Cittc2dpZCAiIFRhZyBjb21wbGV0aW9uICheXV5OXlApIgorbXNnc3RyICIgxcKx1yC/z7y6ICheXV5OXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgsOa3ziDG0MXPIL/PvLogKF5OXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRF5OXlApIgorbXNnc3RyICIgwaTAxyC/z7y6ICheRF5OXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheS15OXlApIgorbXNnc3RyICIgwNq34bnmIL/PvLogKF5LXk5eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlReTl5QKSIKK21zZ3N0ciAiILnpsPq758D8IL/PvLogKF5UXk5eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlZeTl5QKSIKK21zZ3N0ciAiILjtt8nH4CC/z7y6ICheVl5OXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAitNy29MDHILi2wfa4tyC4uLOyIgorCisjOiBlZGl0LmM6OTYyCittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICIndGhlc2F1cnVzJyC/ybzHwMwguvG++r3AtM+02SIKKworIzogZWRpdC5jOjExNjYKK21zZ2lkICInZGljdGlvbmFyeScgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICInZGljdGlvbmFyeScgv8m8x8DMILrxvvq9wLTPtNkiCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICK758D8IMOjtMIgwd86ICVzIgorCisjOiBlZGl0LmM6MjM2OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICizor/2s9ax4ikgvbrFqbfRICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICi52bLeKSC9usWpt9EgKF5FL15ZKSIKKworIzogZWRpdC5jOjI2ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICLDo7TCIMHfOiAlcyIKKworIzogZWRpdC5jOjI3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIsXCsdcgw6O0wiDB3y4iCisKKyM6IGVkaXQuYzozMzgxCittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiILT1x8+x4iIKKworIy4gc2hvd21vZGUgbWlnaHQgcmVzZXQgdGhlIGludGVybmFsIGxpbmUgcG9pbnRlcnMsIHNvIGl0IG11c3QKKyMuICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisjLiAqIGxvbmdlciBuZWVkZWQuICAtLSBBY2V2ZWRvLgorIy4KKyM6IGVkaXQuYzozNDMwCittc2dpZCAiLS0gU2VhcmNoaW5nLi4uIgorbXNnc3RyICItLSDDo7TCIMHfLi4uIgorCisjOiBlZGl0LmM6MzQ4NgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIr/4t6G067fOILq5sbgiCisKKyM6IGVkaXQuYzozNDkxCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIrTZuKUgwdm/oSCzubi7IgorCisjOiBlZGl0LmM6MzQ5NgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJUaGUgb25seSBtYXRjaCIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIm1hdGNoICVkIG9mICVkIgorCisjOiBlZGl0LmM6MzU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAibWF0Y2ggJWQiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjEwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiC48LijtMIguq+89jogXCIlc1wiIgorCisjOiBldmFsLmM6MTMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6ILD9yKMgvvjAvTogJXMiCisKKyM6IGV2YWwuYzoxNDM1IGV2YWwuYzoxNDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogwMy3sSC6r7z2IL74wL06IFwiJXNcIiIKKworIzogZXZhbC5jOjE3MDUKK21zZ2lkICJFMTA5OiBNaXNzaW5nICc6JyBhZnRlciAnPyciCittc2dzdHIgIkUxMDk6ICc/JyC12r+hICc6J8DMIL74vcC0z7TZIgorCisjOiBldmFsLmM6MjMyNworbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiAnKSewoSC++L3AtM+02SIKKworIzogZXZhbC5jOjIzODkKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogJ10nwMwgvvi9wLTPtNkiCisKKyM6IGV2YWwuYzoyNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiC/ybzHIMDMuKcgvvjAvTogJXMiCisKKyM6IGV2YWwuYzoyNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzoguPC4o7TCIL/JvMc6ICVzIgorCisjOiBldmFsLmM6MjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogtfu/yMelIL74wL06ICVzIgorCisjOiBldmFsLmM6MjY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogtfu/yMelIL74wL06ICVzIgorCisjOiBldmFsLmM6MzA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IMfUvPYgJXMowLgpt84gwN+4+LXIIMDOwNqwoSCz0bDcwbO9wLTPtNkiCisKKyM6IGV2YWwuYzozMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiC48LijtMIgx9S89jogJXMiCisKKyM6IGV2YWwuYzozMDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiDH1Lz2v6Egs8q5qyC4ucC6IMDOwNogs9Gx6DogJXMiCisKKyM6IGV2YWwuYzozMDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IMfUvPa/oSDA+8C6IMDOwNogs9Gx6DogJXMiCisKKyM6IGV2YWwuYzozMDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogvbrFqbizxq4gxNzF2L26xq4gudu/obytIDxTSUQ+ILvnv+s6ICVzIgorCisjLgorIy4gKiBZZXMgdGhpcyBpcyB1Z2x5LCBJIGRvbid0IHBhcnRpY3VsYXJseSBsaWtlIGl0IGVpdGhlci4gIEJ1dCBkb2luZyBpdAorIy4gKiB0aGlzIHdheSBoYXMgdGhlIGNvbXBlbGxpbmcgYWR2YW50YWdlIHRoYXQgdHJhbnNsYXRpb25zIG5lZWQgbm90IHRvCisjLiAqIGJlIHRvdWNoZWQgYXQgYWxsLiAgU2VlIGJlbG93IHdoYXQgJ29rJyBhbmQgJ3luYycgYXJlIHVzZWQgZm9yLgorIy4KKyM6IGV2YWwuYzozNjg3IGd1aS5jOjQzODIgZ3VpX2d0ay5jOjIwNTkKK21zZ2lkICImT2siCittc2dzdHIgIsiuwM4oJk8pIgorCisjOiBldmFsLmM6NDIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCDB2TogIgorCisjOiBldmFsLmM6NTQ3NworbXNnaWQgIiIKKyImT0tcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiyK7AzigmTylcbiIKKyLD67zSKCZDKSIKKworIzogZXZhbC5jOjU1MTcKK21zZ2lkICJjYWxsZWQgaW5wdXRyZXN0b3JlKCkgbW9yZSBvZnRlbiB0aGFuIGlucHV0c2F2ZSgpIgorbXNnc3RyICJpbnB1dHJlc3RvcmUoKbChIGlucHV0c2F2ZSgpuri02SC4ucDMILrSt8HBs73AtM+02SIKKworIzogZXZhbC5jOjU5NzcKK21zZ2lkICJFNjU1OiBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyAoY3ljbGU/KSIKK21zZ3N0ciAiRTY1NTogs8q5qyC4ucC6IL3Jury4ryC4tcWpICi53bq5vPjIrz8pIgorCisjOiBldmFsLmM6NjYyNgorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogVmltILytufa/oSC/rLDhtce+7iDA1sH2IL7KvcC0z7TZIgorCisjOiBldmFsLmM6NjcyNAorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiC8rbn2wMcgwMC05MC7IMDQwLsgvPYgvvi9wLTPtNkiCisKKyM6IGV2YWwuYzo2NzUyCittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiDFrLbzwMy+8Maut84gurizviC89iC++L3AtM+02SIKKworIzogZXZhbC5jOjY4MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6ICVzKMC4KbfOILq4s74gvPYgvvi9wLTPtNkiCisKKyM6IGV2YWwuYzo2OTAwCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIowN+4+LXHvvq9wLTPtNkpIgorCisjOiBldmFsLmM6ODA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiDBpMDHIL7IILXIILqvvPY6ICVzIgorCisjOiBldmFsLmM6ODUxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYxOiBJbGxlZ2FsIHZhcmlhYmxlIG5hbWU6ICVzIgorbXNnc3RyICJFNDYxOiC68cGku/PA+8DOILqvvPYguO06ICVzIgorCisjOiBldmFsLmM6ODgwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTEyMjogx9S89iAlc8DMKLChKSDAzLnMIMDWvcC0z7TZLCC52bLZt8G46SAhwLsgtPXHz7y8v+QiCisKKyM6IGV2YWwuYzo4ODc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IMGkwMcgvsggtcggx9S89jogJXMiCisKKyM6IGV2YWwuYzo4ODg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogJygnsKEgvvjAvTogJXMiCisKKyM6IGV2YWwuYzo4OTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiDA37j4tcggwM7A2jogJXMiCisKKyM6IGV2YWwuYzo5MDAwCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IDplbmRmdW5jdGlvbsDMIL74vcC0z7TZIgorCisjOiBldmFsLmM6OTEwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzogx9S89iAlc8C7KLimKSC02b3DIMGkwMfH0iC89iC++L3AtM+02Togu+e/68HfwNS0z7TZIgorCisjOiBldmFsLmM6OTE3NworbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IMfUvPYgwMy4p8DMIMfKv+TH1bTPtNkiCisKKyM6IGV2YWwuYzo5MjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjg6IEZ1bmN0aW9uIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgY2FwaXRhbDogJXMiCittc2dzdHIgIkUxMjg6IMfUvPYgwMy4p8C6ILTrua7A2rfOIL3DwNvH2L7fIMfUOiAlcyIKKworIzogZXZhbC5jOjk0MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogwaTAxyC+yCC1yCDH1Lz2OiAlcyIKKworIzogZXZhbC5jOjk0MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiDH1Lz2ICVzwLsouKYpIMH2v+8gvPYgvvi9wLTPtNk6ILvnv+vB38DUtM+02SIKKworIzogZXZhbC5jOjk0NzMKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiDH1Lz2uKYgus64pSCx7cDMsKEgJ21heGZ1bmNkZXB0aCe6uLTZIMWutM+02SIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICIlcyC6zrijtMIgwd8iCisKKyM6IGV2YWwuYzo5NTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzwMwosKEpIMHfwfa1x776vcC0z7TZIgorCisjOiBldmFsLmM6OTU5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXPAzCiwoSkgIyVsZMC7KLimKSC1ubfBwda++r3AtM+02SIKKworIzogZXZhbC5jOjk1OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXPAzCiwoSkgXCIlc1wiwLsouKYpILW5t8HB1r76vcC0z7TZIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NjEzIGV4X2NtZHMyLmM6MjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICIlc7+hvK0gsOi80yIKKworIzogZXZhbC5jOjk2MzkKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybsDMIMfUvPYgvsi/oSDA1sH2IL7KvcC0z7TZIgorCisjOiBldmFsLmM6OTk3MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDA/L+qILqvvPY6XG4iCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIL3KwLDB+CAlMDJ4LCAgxsjB+CAlMDNvIgorCisjOiBleF9jbWRzLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgIL3KwLDB+CAlMDR4LCAgxsjB+CAlbyIKKworIzogZXhfY21kcy5jOjExOQorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsICC9ysCwwfggJTA4eCwgIMbIwfggJW8iCisKKyM6IGV4X2NtZHMuYzo0MzAKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogwdnAuyCx1yDA2r3FwLi3ziDAzLW/x8+3wbDtIMffvcC0z7TZIgorCisjOiBleF9jbWRzLmM6NDk5Cittc2dpZCAiMSBsaW5lIG1vdmVkIgorbXNnc3RyICIxIMHZIL/FsNzBs73AtM+02SIKKworIzogZXhfY21kcy5jOjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgIiVsZCDB2SC/xbDcwbO9wLTPtNkiCisKKyM6IGV4X2NtZHMuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGZpbHRlcmVkIgorbXNnc3RyICIlbGQgwdnAuyCwybe2vcC0z7TZIgorCisjOiBleF9jbWRzLmM6OTUyCittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogKkZpbHRlciogwNq1v7jtt8nAuiDH9sDnILn2xtu4piC52bLZvu68rbTCIL7IILXLtM+02SIKKworIzogZXhfY21kcy5jOjEwMzcKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIlu4tsH2uLfAuLfOILDtxKMgtdogwPrA5SC+yCDH1F1cbiIKKworIzogZXhfY21kcy5jOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXN2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgIiVzdmltaW5mbzogwdm/oSAlczogIgorCisjOiBleF9jbWRzLmM6MTI4OAorbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiCzyrmrILi5wLogv6G3rywgs6q408H2ILDHs8q23CIKKworIzogZXhfY21kcy5jOjEzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJ2aW1pbmZvIMbEwM8gXCIlc1wiJXMlcyVzwLsouKYpIMDQtMIgwd8iCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiDAzsb3IgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiILi2xakiCisKKyM6IGV4X2NtZHMuYzoxMzI2Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIL3HxtAiCisKKyM6IGV4X2NtZHMuYzoxNDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBWaW1pbmZvIMbEwM/AxyC+srHiILHHx9HAzCC++L3AtM+02TogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IFZpbWluZm8gxsTAzyAlc8C7KLimKSC+tSC89iC++L3AtM+02SEiCisKKyM6IGV4X2NtZHMuYzoxNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiVmltaW5mbyDGxMDPIFwiJXNcIsC7KLimKSC+srTCIMHfIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgwMwgdmltaW5mbyDGxMDPwLoguvbAzCC4uLXnILDNwNS0z7TZIFZpbSAlcy5cbiIKKworIzogZXhfY21kcy5jOjE2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiMgWW91IG1heSBlZGl0IGl0IGlmIHlvdSdyZSBjYXJlZnVsIVxuIgorIlxuIgorbXNnc3RyICIiCisiIyDBtr3JuLggx9G02bjpILDtxKUgvPa1tSDA1r3AtM+02SFcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgwMwgxsTAz8DMIMD6wOW1x776wLsgtqfAxyAnZW5jb2RpbmcnwMcgsKpcbiIKKworIzogZXhfY21kcy5jOjE3NTIKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIsDMu/PH0SC9w8DbILHbwNoiCisKKyM6IGV4X2NtZHMuYzoyMDk3IGV4X2NtZHMyLmM6NzYxCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAitNm4pSDAzLinwLi3ziDA+sDlIgorCisjLiBPdmVyd3JpdGluZyBhIGZpbGUgdGhhdCBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIgaXMgbm90IGEKKyMuICogZ29vZCBpZGVhLgorIzogZXhfY21kcy5jOjIxNDAKK21zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKK21zZ3N0ciAiRTEzOTogxsTAz8DMILTZuKUgufbG27+hILfOtfm1x77uIMDWvcC0z7TZIgorCisjOiBleF9jbWRzLmM6MjE3NAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIsbEwM8gwM+6zri4IMD6wOXH0rHuv+Q/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiC59sbbIMDPus64uCC+srfBuOkgIcC7ILvnv+vHz73KvcO/wCIKKworIzogZXhfY21kcy5jOjIyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICLAzLnMIMDWtMIgXCIlLipzXCIgxsTAz8C7ILWkvu6+tbHuv+Q/IgorCisjOiBleF9jbWRzLmM6MjM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6ILn2xtsgJWxkwMcgxsTAzyDAzLinwMwgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMuYzoyNDA2Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogxsTAz8DMIL3hwfbB9iC+ysC9OiAnd3JpdGUnIL/JvMe/oSDAx8fYIL61ILz2sKEgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMuYzoyNDI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyIncmVhZG9ubHknIL/JvMfAzCBcIiUuKnNcIr+hILTrx9ggvLPBpLXHvu4gwNa9wLTPtNkuXG4iCisisde3obW1IL6yseK4piC/+MfPvcq0z7HuPyIKKworIzogZXhfY21kcy5jOjI1OTkKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIsbEwM8gsO3EobHiIgorCisjOiBleF9jbWRzLmM6MzIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogQXV0b2NvbW1hbmSwoSC25iC527+hILv1ILn2xtsgJXPAuyi4pikgwfa//L3AtM+02SIKKworIzogZXhfY21kcy5jOjMzNDEKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogvP3A2rChIL7GtNEgwM7A2rChIDp6v6Egwda+7sGzvcC0z7TZIgorCisjOiBleF9jbWRzLmM6MzQyNgorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IHJ2aW2/obyttMIgvakguO23ycC7ILvnv+vH0iC89iC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjM1MzMKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiDBpLHUx6XH9r3EwLogsdvA2rfOILG4utC1ySC89iC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjM4NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAiJXMowLgpt84gudmy3iAoeS9uL2EvcS9sL15FL15ZKT8iCisKKyM6IGV4X2NtZHMuYzo0MjcyCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIijB37Tctce++r3AtM+02SkgIgorCisjOiBleF9jbWRzLmM6NDI3NgorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICIxILCzILnZsuXAvSIKKworIzogZXhfY21kcy5jOjQyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCCwsyC52bLlwL0iCisKKyM6IGV4X2NtZHMuYzo0MjgxCittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIMfRIMHZv6G8rSIKKworIzogZXhfY21kcy5jOjQyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiICVsZCDB2b+hvK0iCisKKyM6IGV4X2NtZHMuYzo0MzM0Cittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiA6Z2xvYmFswLogwOexzSDIo8PiILXJILz2IL74vcC0z7TZIgorCisjOiBleF9jbWRzLmM6NDM2OQorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiBnbG9iYWy/obytIMGksdTHpcf2vcTAzCC6/MGzvcC0z7TZIgorCisjOiBleF9jbWRzLmM6NDQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICK/qbevIMHZv6G8rSDG0MXPwLsgw6O+0r3AtM+02TogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKK21zZ3N0ciAiIgorIlxuIgorIiMguLbB9ri3wLi3ziC52bLbILmuwNq/rTpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDYwMAorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogtOfIssfPwfYguLa9yr3Dv8AhIgorCisjOiBleF9jbWRzLmM6NDY1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjYxOiBTb3JyeSwgbm8gJyVzJyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTY2MTogucy+yMfVtM+02SwgtbW/8ri7ICclcyfAzCiwoSkgJXO/oSC068fYIL74vcC0z7TZIgorCisjOiBleF9jbWRzLmM6NDY1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQ5OiBTb3JyeSwgbm8gaGVscCBmb3IgJXMiCittc2dzdHIgIkUxNDk6ILnMvsjH1bTPtNksICVzv6EgtOvH0SC1tb/yuLvAzCC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjQ2ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICK5zL7Ix9W0z7TZLCC1tb/yuLsgxsTAzyBcIiVzXCLAuyi4pikgw6PAuyC89iC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjUxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogwNq34bnmwMwgvsa01DogJXMiCisKKyM6IGV4X2NtZHMuYzo1MzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiC+srHiIMCnx9EgJXPAuyi4pikgv60gvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMuYzo1MzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiDA0LHiIMCnx9EgJXPAuyi4pikgv60gvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMuYzo1MzY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NzA6IE1peCBvZiBoZWxwIGZpbGUgZW5jb2RpbmdzIHdpdGhpbiBhIGxhbmd1YWdlOiAlcyIKK21zZ3N0ciAiRTY3MDogx9EgvvC+7rO7v6G8rSC/qbevIMDOxNq1+SC757/rOiAlcyIKKworIzogZXhfY21kcy5jOjU0NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogxcKx1yBcIiVzXCLAzCiwoSkgxsTAzyAlc7+hIMHfurm1x77uIMDWvcC0z7TZIgorCisjOiBleF9jbWRzLmM6NTU1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6ILjwuKO0wiBzaWduILjtt8k6ICVzIgorCisjOiBleF9jbWRzLmM6NTU3OQorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBzaWduIMDMuKfAzCC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjU2MjUKK21zZ2lkICJFNjEyOiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFNjEyOiCzyrmrILi5wLogc2lnbsDMIMGkwMe1x77uIMDWvcC0z7TZIgorCisjOiBleF9jbWRzLmM6NTY5MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IMDfuPi1yCBzaWduIMXYvbrGrjogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzI0IGV4X2NtZHMuYzo1OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6ILjwuKO0wiBzaWduOiAlcyIKKworIzogZXhfY21kcy5jOjU3NzMKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBzaWduILn4yKOwoSC++L3AtM+02SIKKworIzogZXhfY21kcy5jOjU4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IMDfuPi1yCC59sbbIMDMuKc6ICVzIgorCisjOiBleF9jbWRzLmM6NTg5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogwN+4+LXIIHNpZ24gSUQ6ICVsZCIKKworIzogZXhfY21kcy5jOjU5NjQKK21zZ2lkICIgKE5PVCBGT1VORCkiCittc2dzdHIgIiAouPggw6O+0sC9KSIKKworIzogZXhfY21kcy5jOjU5NjYKK21zZ2lkICIgKG5vdCBzdXBwb3J0ZWQpIgorbXNnc3RyICIgKMH2v/i1x8H2IL7KwL0pIgorCisjOiBleF9jbWRzLmM6NjA2NQorbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW8H2v/bBs73AtM+02V0iCisKKyM6IGV4X2NtZHMyLmM6OTIKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBjb250aW51ZS4iCittc2dzdHIgIrXwufax1yC788XCt84gtem+7rCoLiAgsOi808fPt8G46SBcImNvbnRcIrimIMDUt8LHz73KvcO/wC4iCisKKyM6IGV4X2NtZHMyLmM6OTYgZXhfZG9jbWQuYzo5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICIlbGQgwdk6ICVzIgorCisjOiBleF9jbWRzMi5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgIrjtt8k6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICLB38H2waE6IFwiJXMlc1wiICVsZCDB2SIKKworIzogZXhfY21kczIuYzo1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiDB38H2waHAuyDDo8C7ILz2IL74vcC0z7TZOiAlcyIKKworIzogZXhfY21kczIuYzo1NjYKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICLB38H2waHAzCDBpMDHtce+7iDA1sH2IL7KvcC0z7TZIgorCisjOiBleF9jbWRzMi5jOjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgJWxkIMHZIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJcIiUuKnNcIr+hILnZsu8gs7u/68C7IMD6wOXH0rHuv+Q/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkzNzkKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiwaa48SC++MC9IgorCisjOiBleF9jbWRzMi5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2MjogufbG2yBcIiVzXCK/oSCzqsHfv6Egudmy7yCzu7/rwMwgveHB9sH2IL7KvtK9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6OTg0Cittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICKw5rDtOiC25iC527+hILTZuKUgufbG27fOILXpvu6wrL3AtM+02SAoYXV0b2NvbW1hbmS4piDIrsDOx8+9yr3Dv8ApIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6ILDtxKUgxsTAz8DMIMfPs6ogudu/oSC++L3AtM+02SIKKworIzogZXhfY21kczIuYzoxMzg5Cittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiDDuSC5+MKwIMbEwM8gwMzA/MC4t860wiCwpSC89iC++L3AtM+02SIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6ILi2wfa4tyDGxMDPILXat860wiCwpSC89iC++L3AtM+02SIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiDExMbEwM+3r7ChIMH2v/i1x8H2IL7KwL06ICVzIgorCisjOiBleF9jbWRzMi5jOjE4OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICJcIiVzXCLAuyi4pikgXCIlc1wiv6G8rSDDo7TCIMHfIgorCisjOiBleF9jbWRzMi5jOjE5MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIiCittc2dzdHIgIlwiJXNcIsC7KLimKSDDo7TCIMHfIgorCisjOiBleF9jbWRzMi5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAiJ3J1bnRpbWVwYXRoJ7+hvK0gw6PAuyC89iC++MC9OiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTk3NAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICK69iC9usWpuLPGriC3zrXlIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICLA2rfhuebAuiC60revILXpwM8gvPYgvvjAvTogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIlwiJXNcIsC7KLimKSC60revILXpwM8gvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6MjIwNAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIiVsZCDB2TogXCIlc1wiwLsouKYpILrSt68gtenAzyC89iC++L3AtM+02SIKKworIzogZXhfY21kczIuYzoyMjE4CisjLCBjLWZvcm1hdAorbXNnaWQgInNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiwLsouKYpILrSt6+16cDMtMIgwd8iCisKKyM6IGV4X2NtZHMyLmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICIlbGQgwdk6IFwiJXNcIiC60revtenAzLTCIMHfIgorCisjOiBleF9jbWRzMi5jOjIzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgIiVzILrSt6+16cDMseIgs6EiCisKKyM6IGV4X2NtZHMyLmM6MjcwNworbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6ILDmsO06IMDfuPi1yCDB2SCxuLrQwNouIF5NwMwgvvi0wiCwzSCwsL3AtM+02SIKKworIzogZXhfY21kczIuYzoyNzU2Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2NzogOnNjcmlwdGVuY29kaW5nwMwgutK3r7XpwM4gxsTAzyC527+hvK0gu+e/67XHvvq9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6Mjc4OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiA6ZmluaXNosKEgutK3r7XpwM4gxsTAzyC527+hvK0gu+e/67XHvvq9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6MzIzOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICLG5MDMwfYgJWQiCisKKyM6IGV4X2NtZHMyLmM6MzM5NAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAiwM684rXJIMXYvbrGrrChIL74vcC0z7TZIgorCisjOiBleF9jbWRzMi5jOjM0NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIsbkwMzB9iAlZCDAzrziwd8gKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjM0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIiC6ubvnICVkIC8gJWQiCisKKyM6IGV4X2NtZHMyLmM6MzU0MgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiwM684rXKOiAlcyIKKworIzogZXhfY21kczIuYzozNTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIsDOvOKwoSDD67zStce++r3AtM+02S4iCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogxve9usauvbrFqbizxq4gw+K3wsbEwM+/oSC+tSC89iC++L3AtM+02S4iCisKKyM6IGV4X2NtZHMyLmM6NDE4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI0OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNjI0OiBcIiVzXCIgxsTAz8C7IL+tILz2IL74vcC0z7TZIgorCisjOiBleF9jbWRzMi5jOjQxOTkgZXhfY21kczIuYzo0ODI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1Nzogxve9usauvbrFqbizxq4guK680r26IMbEwM8gXCIlc1wiwLsouKYpIMDQwLsgvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6NDIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IMbEwM8gXCIlc1wiwLootMIpIMb3vbrGrr26xam4s8auILiuvNK9uiDGxMDPwMwgvsa01bTPtNkiCisKKyM6IGV4X2NtZHMyLmM6NDIyMiBleF9jbWRzMi5jOjQyNDIgZXhfY21kczIuYzo0MjU3IGV4X2NtZHMyLmM6NDI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE5OiDGxMDPIFwiJXNcIsC6KLTCKSDB9r/4tce0wiDG9726xq69usWpuLPGriC4rrzSvbogxsTAz8DMIL7GtNW0z7TZIgorCisjOiBleF9jbWRzMi5jOjQzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMTogXCIlc1wiIHJlc291cmNlIGZpbGUgaGFzIHdyb25nIHZlcnNpb24iCittc2dzdHIgIkU2MjE6IFwiJXNcIiC4rrzSvbogxsTAz8C6ILn2wPzAzCDA37j4tce++r3AtM+02SIKKworIzogZXhfY21kczIuYzo0Nzc2Cittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiDG9726xq69usWpuLPGriDD4rfCxsTAz8C7IL+tILz2IL74vcC0z7TZIgorCisjOiBleF9jbWRzMi5jOjQ4MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogXCIlc1wiIMbEwM/AuyC/rSC89iC++L3AtM+02SIKKworIzogZXhfY21kczIuYzo0OTI4Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIKK21zZ3N0ciAiRTQ1Njogxve9usauvbrFqbizxq4guK680r26IMbEwM8gXCJwcm9sb2cucHNcIrimIMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6NDk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiCittc2dzdHIgIkU0NTY6IMb3vbrGrr26xam4s8auILiuvNK9uiDGxMDPIFwiJXMucHNcIrimIMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGV4X2NtZHMyLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjIwOiBVbmFibGUgdG8gY29udmVydCBmcm9tIG11bHRpLWJ5dGUgdG8gXCIlc1wiIGVuY29kaW5nIgorbXNnc3RyICJFNjIwOiC02cHfudnAzMauuKYgXCIlc1wiIMDOxNq1+cC4t84guq/Ir8fSILz2IL74vcC0z7TZIgorCisjOiBleF9jbWRzMi5jOjUxMDIKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIsfBuLDFzbfOILq4s7u0wiDB3y4uLiIKKworIzogZXhfY21kczIuYzo1MTA2Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogxve9usauvbrFqbizxq4gxsTAz8C7IMDOvOLH0iC89iC++L3AtM+02SIKKworIzogZXhfY21kczIuYzo1MTA4Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICLAzrziwNu+98DMILOhs7W9wLTPtNkuIgorCisjOiBleF9jbWRzMi5jOjU2MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIsf2wOcgJXO+8L7uOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogvvC+7rimIFwiJXNcIijAuCm3ziC8s8Gkx9IgvPYgvvi9wLTPtNkiCisKKyM6IGV4X2RvY21kLmM6NTI1Cittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIkV4ILvzxcK3ziDA/MivLiAgTm9ybWFsILvzxcK3ziCwobfBuOkgXCJ2aXN1YWxcIsC7IMDUt8LHz73KvcO/wC4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjU2MQorbXNnaWQgIkU1MDE6IEF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJFNTAxOiDGxMDPwMcguLbB9ri3wNS0z7TZIgorCisjOiBleF9kb2NtZC5jOjY2OQorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OToguO23ycDMILPKuasguLnAzCC02b3DILndurm1x776vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiC/ub/csKEgud+7/cfPwfYgvsq+0r3AtM+02TogJXMiCisKKyM6IGV4X2RvY21kLmM6MTMxNworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIrrSt6+16cDOIMbEwM/AxyC4tsH2uLciCisKKyM6IGV4X2RvY21kLmM6MTMxOAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAix9S89sDHILi2wfa4tyIKKworIzogZXhfZG9jbWQuYzoxOTA3Cittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogu+e/68DaIMGkwMcguO23ycC7ILjwyKPHz7DUILvnv+vHz7DtIMDWvcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjE5MjEKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IMbtwf2x4iC47bfJwMwgvsa01bTPtNkiCisKKyM6IGV4X2RvY21kLmM6MjAyOAorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5Mzogud206yC/tb+qwMwgwda+7sGzvcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjIwMzcKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIrndtOsgv7W/qsDMIMHWvu7Bs73AtM+02SwgtdrB/cC7se6/5CIKKworIzogZXhfZG9jbWQuYzoyMTYwCittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiB3s6ogdz4+uKYgu+e/68fPvcq9w7/AIgorCisjOiBleF9kb2NtZC5jOjM3ODYKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6ILnMvsjH1bTPtNksILHXILjtt8nAuiDH9sDnIMbHv6G8rSC757/rx9IgvPYgvvi9wLTPtNkiCisKKyM6IGV4X2RvY21kLmM6Mzk4OQorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiC/wLfOwfYgx8+zqsDHIMbEwM8gwMy4p7i4ILvnv+sgsKG0ycfVtM+02SIKKworIzogZXhfZG9jbWQuYzo0NTY5Cittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAisO3EpSDGxMDPwMwgx9EgsLMgtPUgwNa9wLTPtNkuILHXt6G1tSCzobO+se6/5D8iCisKKyM6IGV4X2RvY21kLmM6NDU3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIrDtxKUgxsTAz8DMICVkILCzILT1IMDWvcC0z7TZLiCx17ehtbUgs6GzvrHuv+Q/IgorCisjOiBleF9kb2NtZC5jOjQ1NzkKK21zZ2lkICJFMTczOiAxIG1vcmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTczOiCw7cSlIMbEwM/AzCDH0SCwsyC09SDA1r3AtM+02SIKKworIzogZXhfZG9jbWQuYzo0NTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6ILDtxKUgxsTAz8DMICVsZCCwsyC09SDA1r3AtM+02SIKKworIzogZXhfZG9jbWQuYzo0Njc2Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDoguO23ycDMIMDMucwgwbjA58fVtM+02Togudmy2bfBuOkgIcC7ILT1x8+8vL/kIgorCisjOiBleF9kb2NtZC5jOjQ3ODcKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgwMy4pyAgICAgICAgwM7A2iC5/MCnICC/z7y6ICAgICAgwaTAxyIKKworIzogZXhfZG9jbWQuYzo0ODc2Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICK757/rwNogwaTAxyC47bfJwLsgw6PAuyC89iC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo0OTA4Cittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NToguO29w7XIILzTvLrAzCC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo0OTYwCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiDA37j4tcggwM7A2iCwubz2IgorCisjOiBleF9kb2NtZC5jOjQ5NzUKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiDEq7/uxq60wiC1ziC5+CDAzLvzILjtvcO1ySC89iC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo0OTg1Cittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogwN+4+LXIILHiursgxKu/7sauILCqIgorCisjOiBleF9kb2NtZC5jOjUwMTYKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6ILOhs7ux4iDAp8fYIMDOwNqwoSDHyr/kx9W0z7TZIgorCisjOiBleF9kb2NtZC5jOjUwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IMDfuPi1yCCzobO7seIgsKo6ICVzIgorCisjOiBleF9kb2NtZC5jOjUwNTcKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIkU0Njg6IL/PvLogwM7A2rTCILvnv+vA2iC/z7y6v6G8rbi4IMfjv+u1y7TPtNkiCisKKyM6IGV4X2RvY21kLmM6NTA2MworbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIkU0Njc6ILvnv+vA2iC/z7y6wLogx9S89iDAzsDasKEgx8q/5MfVtM+02SIKKworIzogZXhfZG9jbWQuYzo1MDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODE6IEludmFsaWQgYXR0cmlidXRlOiAlcyIKK21zZ3N0ciAiRTE4MTogwN+4+LXIILzTvLo6ICVzIgorCisjOiBleF9kb2NtZC5jOjUxMTcKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogwN+4+LXIILjtt8kgwMy4pyIKKworIzogZXhfZG9jbWQuYzo1MTMyCittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiC757/rwNogwaTAxyC47bfJwLogtOu5rsDat84gvcPA28fYvt8gx9W0z7TZIgorCisjOiBleF9kb2NtZC5jOjUyMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6ILHXt7Egu+e/68DaIMGkwMcguO23ySC++MC9OiAlcyIKKworIzogZXhfZG9jbWQuYzo1NjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogu/YgvbrFtCAlc8C7KLimKSDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjU2NzIKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAiuvYgu+e/68DatNQsIMivv7XH1bTPtNkhIgorCisjOiBleF9kb2NtZC5jOjYzOTAKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiu/Ugw6K/obytIMbEwM8gsO3EobHiIgorCisjOiBleF9kb2NtZC5jOjY2ODUKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIr26v9IgxsTAz8DMIL74vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjY3ODkKK21zZ2lkICJBcHBlbmQgRmlsZSIKK21zZ3N0ciAixsTAzyDD37ChIgorCisjOiBleF9kb2NtZC5jOjY4NTMKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IMDMwPwgwNq34bnmwMwgvvi9wLTPtNkiCisKKyM6IGV4X2RvY21kLmM6NjkzNQorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6ILjwuKciCisKKyM6IGV4X2RvY21kLmM6NzAyMAorbXNnaWQgIkU0NjU6IDp3aW5zaXplIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY1OiA6d2luc2l6ZbTCILXOsLPAxyDAzsDasKEgx8q/5MfVtM+02SIKKworIzogZXhfZG9jbWQuYzo3MDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiw6IgwKfEoTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDgxCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIkUxODg6IMDMIMfDt6fG+7+hILTrx9Egw6IgwKfEoSC+8rTCILHitMnAuyCxuMf2tcfB9iC+yr7SvcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjcwOTEKK21zZ2lkICJFNDY2OiA6d2lucG9zIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY2OiA6d2lucG9zv6G0wiC1zrCzwMcgwM7A2rChIMfKv+TH1bTPtNkiCisKKyM6IGV4X2RvY21kLmM6NzM2OQorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIriutfC3urzHIMD6wOUiCisKKyM6IGV4X2RvY21kLmM6NzU1OQorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiurix4iDA+sDlIgorCisjOiBleF9kb2NtZC5jOjc1NjAKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIry8vMcgwPrA5SIKKworIzogZXhfZG9jbWQuYzo3NTYyCittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAivLPBpCDA+sDlIgorCisjOiBleF9kb2NtZC5jOjc3MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCLAzCiwoSkgwbjA58fVtM+02SAotaS+7r6yt8G46SAhILT1x8+x4ikiCisKKyM6IGV4X2RvY21kLmM6NzcxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6IL6yseIgwKfH0SBcIiVzXCLAuyi4pikgv60gvPYgvvi9wLTPtNkiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjc3NDMKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IMDOwNq0wiCx28Das6ogvtUvtdogwM6/6yC6zsijv6m+3yDH1bTPtNkiCisKKyM6IGV4X2RvY21kLmM6Nzc4NQorbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogOm5vcm1hbMDHIMDnsc0gyKPD4sDMILPKuasguLnAzCC7/bDlvcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjgzMDMKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogJyMnv6EgtOvH2CDEocivx9IgsbPDvCDGxMDPIMDMuKfAzCC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo4MzM0Cittc2dpZCAiRTQ5NTogbm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJFNDk1OiBcIjxhZmlsZT5cIr+hILTrx9ggxKHIr8fSIMDatb+47bfJIMbEwM8gwMy4p8DMIL74vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjgzNDIKK21zZ2lkICJFNDk2OiBubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIkU0OTY6IFwiPGFidWY+XCK/oSC068fYIMShyK/H0iDA2rW/uO23ySC59sbbILn4yKOwoSC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo4MzUzCittc2dpZCAiRTQ5Nzogbm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIkU0OTc6IFwiPGFtYXRjaD5cIr+hILTrx9ggxKHIr8fSIMDatb+47bfJILjFxKEgwMy4p8DMIL74vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjgzNjMKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiRTQ5ODogXCI8c2ZpbGU+XCK/oSC068fYIMShyK/H0iA6c291cmNlIMbEwM8gwMy4p8DMIL74vcC0z7TZIgorCisjOiBleF9kb2NtZC5jOjg0MDQKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIkU0OTk6ICclJ7OqICcjJ7+hILTrx9EguvMgxsTAzyDAzLinLCC/wLfOwfYgXCI6cDpoXCK/zbi4ILW/wNvH1bTPtNkiCisKKyM6IGV4X2RvY21kLmM6ODQwNgorbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6ILrzILmuwNq/rb+hvK0gsKrAuyCxuMfPt8Gw7SDH1bTPtNkiCisKKyM6IGV4X2RvY21kLmM6OTM2MQorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogwNDAuyB2aW1pbmZvIMbEwM/AuyC/rSC89iC++L3AtM+02SIKKworIzogZXhfZG9jbWQuYzo5NTM0Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiDAzCDGx7+htMIgZGlncmFwaLChIL74vcC0z7TZIgorCisjOiBleF9ldmFsLmM6NDQwCittc2dpZCAiRTYwODogQ2Fubm90IDp0aHJvdyBleGNlcHRpb25zIHdpdGggJ1ZpbScgcHJlZml4IgorbXNnc3RyICJFNjA4OiAnVmltJyDBorXOu+e3ziC/ub/cuKYgOnRocm93x9IgvPYgvvi9wLTPtNkiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAiv7m/3CB0aHJvd246ICVzIgorCisjOiBleF9ldmFsLmM6NTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBmaW5pc2hlZDogJXMiCittc2dzdHIgIr+5v9wgwb634bXKOiAlcyIKKworIzogZXhfZXZhbC5jOjU3NworIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZGlzY2FyZGVkOiAlcyIKK21zZ3N0ciAiv7m/3CC59rfBwfw6ICVzIgorCisjOiBleF9ldmFsLmM6NjIwIGV4X2V2YWwuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMsIGxpbmUgJWxkIgorbXNnc3RyICIlcywgJWxkIMHZIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGNhdWdodDogJXMiCittc2dzdHIgIr+5v9wgud+7/TogJXMiCisKKyM6IGV4X2V2YWwuYzo3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICIlc8DMKLChKSBwZW5kaW5nILXHvvq9wLTPtNkiCisKKyM6IGV4X2V2YWwuYzo3MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmVzdW1lZCIKK21zZ3N0ciAiJXPAzCiwoSkgwOewsyC1x776vcC0z7TZIgorCisjOiBleF9ldmFsLmM6NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXPAzCiwoSkgufa3wcGzvcC0z7TZIgorCisjOiBleF9ldmFsLmM6NzQ2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICK/ub/cIgorCisjOiBleF9ldmFsLmM6NzUyCittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiv6G3r7/NIMDOxc23tMauIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzODEKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiv6G3ryIKKworIy4gaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkKKyM6IGV4X2V2YWwuYzo3NTYKK21zZ2lkICJJbnRlcnJ1cHQiCittc2dzdHIgIsDOxc23tMauIgorCisjOiBleF9ldmFsLmM6ODMwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IDppZrChILPKuasgse2w1CDB38O4tce++r3AtM+02SIKKworIzogZXhfZXZhbC5jOjg2NworbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmlmvvjAzCA6ZW5kaWawoSDA1r3AtM+02SIKKworIzogZXhfZXZhbC5jOjkxMQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6aWa++MDMIDplbHNlsKEgwNa9wLTPtNkiCisKKyM6IGV4X2V2YWwuYzo5MTQKK21zZ2lkICJFNTgyOiA6ZWxzZWlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgyOiA6aWa++MDMIDplbHNlaWawoSDA1r3AtM+02SIKKworIzogZXhfZXZhbC5jOjkyMQorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiC/qbevsLPAxyA6ZWxzZbChIMDWvcC0z7TZIgorCisjOiBleF9ldmFsLmM6OTI0Cittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogOmVsc2Ugtdq/oSA6ZWxzZWlmsKEgwNa9wLTPtNkiCisKKyM6IGV4X2V2YWwuYzo5OTEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogOndoaWxlwMwgs8q5qyCx7bDUIMHfw7i1x776vcC0z7TZIgorCisjOiBleF9ldmFsLmM6MTA0NworbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOndoaWxlvvjAzCA6Y29udGludWWwoSDA1r3AtM+02SIKKworIzogZXhfZXZhbC5jOjEwODcKK21zZ2lkICJFNTg3OiA6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODc6IDp3aGlsZb74wMwgOmJyZWFrsKEgwNa9wLTPtNkiCisKKyM6IGV4X2V2YWwuYzoxMjg2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiA6dHJ5sKEgs8q5qyCx7bDUIMHfw7i1x776vcC0z7TZIgorCisjOiBleF9ldmFsLmM6MTM2NgorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDp0cnm++MDMIDpjYXRjaLChIMDWvcC0z7TZIgorCisjLiBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMuICogSnVzdCBwYXJzZS4KKyM6IGV4X2V2YWwuYzoxMzg4Cittc2dpZCAiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5IgorbXNnc3RyICJFNjA0OiA6ZmluYWxseSC12r+hIDpjYXRjaLChIMDWvcC0z7TZIgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOnRyeb74wMwgOmZpbmFsbHmwoSDA1r3AtM+02SIKKworIy4gR2l2ZSB1cCBmb3IgYSBtdWx0aXBsZSAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjOiBleF9ldmFsLmM6MTU0NQorbXNnaWQgIkU2MDc6IG11bHRpcGxlIDpmaW5hbGx5IgorbXNnc3RyICJFNjA3OiC/qbevsLPAxyA6ZmluYWxsebChIMDWvcC0z7TZIgorCisjOiBleF9ldmFsLmM6MTY1NAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6dHJ5vvjAzCA6ZW5kdHJ5sKEgwNa9wLTPtNkiCisKKyM6IGV4X2V2YWwuYzoxOTg2Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uwMwgZnVuY3Rpb24gs7u/oSC++L3AtM+02SIKKworIzogZXhfZ2V0bG4uYzozMjk2Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAixcKx18DMuKciCisKKyM6IGV4X2dldGxuLmM6MzI5OQorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIGtpbmQgZmlsZVxuIgorCisjOiBleF9nZXRsbi5jOjQ3NjUKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIidoaXN0b3J5JyC/ybzHwMwgMMDUtM+02SIKKworIzogZXhfZ2V0bG4uYzo1MDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcyDI9726xeS4riAou/WwzbrOxc0gv8C3obXIILDNILz4KTpcbiIKKworIzogZXhfZ2V0bG4uYzo1MDM3Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICK47bfJIMHZIgorCisjOiBleF9nZXRsbi5jOjUwMzgKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICLDo8C7ILmuwNq/rSIKKworIzogZXhfZ2V0bG4uYzo1MDM5Cittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAix6XH9iIKKworIzogZXhfZ2V0bG4uYzo1MDQwCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiwNS3wiDB2SIKKworIzogZXhfZ2V0bG4uYzo1MDc4Cittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhcrChILjtt8kgsebAzLimILn+vu6ztb3AtM+02SIKKworIzogZXhfZ2V0bG4uYzo1MjU1Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogyLC8urXIIMOiwMyzqiC59sbbsKEgwfa/9sGzvcC0z7TZIgorCisjOiBmaWxlaW8uYzozNzcKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiwN+4+LXIIMbEwM8gwMy4pyIKKworIzogZmlsZWlvLmM6NDAxIGZpbGVpby5jOjUzNSBmaWxlaW8uYzoyOTEzIGZpbGVpby5jOjI5NTQKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAitMIgwNq34bnmwNS0z7TZIgorCisjOiBmaWxlaW8uYzo0MDMKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICK0wiDGxMDPwMwgvsa01bTPtNkiCisKKyM6IGZpbGVpby5jOjU1NyBmaWxlaW8uYzo0MTMxCittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW7v1IMbEwM9dIgorCisjOiBmaWxlaW8uYzo1OTAKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJbx+O/6yC+yCC1y7TPtNldIgorCisjOiBmaWxlaW8uYzo2OTQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiAqUmVhZFByZSDA2rW/uO23ycDMIMbEwM/AuyDA0MH2ILj4x8+w1CC4uLXpvvq9wLTPtNkiCisKKyM6IGZpbGVpby5jOjY5NgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6ICpSZWFkUHJlIMDatb+47bfJwLogx/bA5yC59sbbuKYgudmy2bjpIL7IILXLtM+02SIKKworIzogZmlsZWlvLmM6NzE3Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiuvY6IMelwdjA1LfCv6G8rSDA0LTCIMHfLi4uXG4iCisKKyM6IGZpbGVpby5jOjcyMworbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAix6XB2MDUt8K/obytIMDQtMIgwd8uLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6MTAwMAorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiC6r8ivtcggxsTAz8C7IMDQwLsgvPawoSC++L3AtM+02SEiCisKKyM6IGZpbGVpby5jOjIwOTAKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbx8fG9y+80sTPXSIKKworIzogZmlsZWlvLmM6MjA5NworbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW8fHxvddIgorCisjOiBmaWxlaW8uYzoyMTA0Cittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIlu80sTPXSIKKworIzogZmlsZWlvLmM6MjExMgorbXNnaWQgIltST10iCittc2dzdHIgIlvA0LHiIMD8v+tdIgorCisjOiBmaWxlaW8uYzoyMTIyCittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbQ1IgvvjAvV0iCisKKyM6IGZpbGVpby5jOjIxMjcKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbTkwgxvfH1F0iCisKKyM6IGZpbGVpby5jOjIxMzIKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIlux5CDB2SDA37iyXSIKKworIzogZmlsZWlvLmM6MjEzOCBmaWxlaW8uYzo0MTE1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbuq/IryC+yCC1y7TPtNldIgorCisjOiBmaWxlaW8uYzoyMTQzIGZpbGVpby5jOjQxMjAKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW7qvyK8gtce++r3AtM+02V0iCisKKyM6IGZpbGVpby5jOjIxNTAgZmlsZWlvLmM6NDE0NQorbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW77PyKPIrSC1x776vcC0z7TZXSIKKworIzogZmlsZWlvLmM6MjE1NworbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW7qvyK8gv6G3r10iCisKKyM6IGZpbGVpby5jOjIxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIlslbGQgwdm/oSDA37j4tcggudnAzMauXSIKKworIzogZmlsZWlvLmM6MjE3MAorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIlvA0LHiIL+ht69dIgorCisjOiBmaWxlaW8uYzoyMzg2Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIrqvyK/Hz7HiIMCnx9EgwNO9wyDGxMDPwLsgw6PAuyC89iC++L3AtM+02SIKKworIzogZmlsZWlvLmM6MjM5MworbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiJ2NoYXJjb252ZXJ0J7imILvnv+vH0SC6r8ivwMwgvcfG0MffvcC0z7TZIgorCisjOiBmaWxlaW8uYzoyMzk2Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAiJ2NoYXJjb252ZXJ0J8DHIMPit8Kw4bD6uKYgwNDAuyC89iC++L3AtM+02SIKKworIzogZmlsZWlvLmM6Mjc5NgorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiC+tSC59sbbuKYgwNq1v7jtt8nAzCDB9r/ssMWzqiC03b7SvcC0z7TZIgorCisjOiBmaWxlaW8uYzoyODE5Cittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IEF1dG9jb21tYW5ksKEgwN+4+LXIILnmuf3AuLfOIMHZwLsgudmy2b76vcC0z7TZIgorCisjOiBmaWxlaW8uYzoyODU3Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFuc7+hvK20wiC52bLuwfYgvsrAuiC59sbbuKYgvrUgvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjI4NjUKK21zZ2lkICJQYXJ0aWFsIHdyaXRlcyBkaXNhbGxvd2VkIGZvciBOZXRCZWFucyBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyC59sbbv6EgtOvH2LyttMIgus660CDA+sDlwLsgx9IgvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjI5MTkgZmlsZWlvLmM6MjkzNworbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICLGxMDPIMikwLogvrUgvPYgwNa0wiDA5cShsKEgvsa01bTPtNkiCisKKyM6IGZpbGVpby5jOjI5ODkKK21zZ2lkICJpcyByZWFkLW9ubHkgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiwNCx4iDA/L/rwNS0z7TZICi1pL7uvrK3wbjpICEgtPXHz7HiKSIKKworIzogZmlsZWlvLmM6MzMzNQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6ILnpvvfGxMDPwLsgvrUgvPYgvvi9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBmaWxlaW8uYzozMzQ3Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDc6ILnpvvfGxMDPILTdseIgv6G3ryAotaS+7r6yt8G46SAhILT1x8+x4ikiCisKKyM6IGZpbGVpby5jOjMzNDkKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiC56b73x9IgxsTAz8C7IMDQwLsgvPYgvvi9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBmaWxlaW8uYzozMzY1Cittc2dpZCAiRTUwOTogQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA5OiC56b73xsTAz8C7ILi4tekgvPYgvvi9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBmaWxlaW8uYzozNDY4Cittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTEwOiC56b73xsTAz8C7ILi4tekgvPYgvvi9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBmaWxlaW8uYzozNTMwCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3aWxsIGJlIGxvc3QgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBmaWxlaW8uYzozNjQwCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IL61IMDTvcMgxsTAz8C7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjM2NTgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzoguq/Ir8fSILz2IL74vcC0z7TZICi6r8ivIL74wMwgwPrA5cfPt8G46SAhILT1x8+x4ikiCisKKyM6IGZpbGVpby5jOjM2OTMKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiC+tSC/rLDhtcggxsTAz8C7IL+tILz2IL74vcC0z7TZIgorCisjOiBmaWxlaW8uYzozNjk3Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiC+tSDGxMDPwLsgv60gvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjM5NTkKK21zZ2lkICJFNjY3OiBGc3luYyBmYWlsZWQiCittc2dzdHIgIkU2Njc6IEZzeW5jsKEgvcfG0MffvcC0z7TZIgorCisjOiBmaWxlaW8uYzozOTY2Cittc2dpZCAiRTUxMjogQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJFNTEyOiC03bHisKEgvcfG0MffvcC0z7TZIgorCisjOiBmaWxlaW8uYzo0MDM3Cittc2dpZCAiRTUxMzogd3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICJFNTEzOiC+srHiIL+ht68sILqvyK/AzCC9x8bQx9+9wLTPtNkiCisKKyM6IGZpbGVpby5jOjQwNDMKK21zZ2lkICJFNTE0OiB3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJFNTE0OiC+srHiIL+ht68gKMbEwM8gvcO9usXbwMwgssvDobOqv+Q/KSIKKworIzogZmlsZWlvLmM6NDExMAorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICIguq/IryC/obevIgorCisjOiBmaWxlaW8uYzo0MTI2Cittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIlvA5cShXSIKKworIzogZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXddIgorbXNnc3RyICJbu/W3zr/uXSIKKworIzogZmlsZWlvLmM6NDE1MworbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbYV0iCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiC09cffvcC0z7TZIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt3XSIKKworIzogZmlsZWlvLmM6NDE1NQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgwPrA5SDH373AtM+02SIKKworIzogZmlsZWlvLmM6NDIwNQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiDG0MShILvzxcI6IL/4t6EgxsTAz8C7IMD6wOXH0iC89iC++L3AtM+02SIKKworIzogZmlsZWlvLmM6NDIyNworbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogxtDEoSC788XCOiC68yC/+LehIMbEwM/AuyC4uLXpILz2IL74vcC0z7TZIgorCisjOiBmaWxlaW8uYzo0MjQyCittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiC56b73IMbEwM/AuyDB9r/vILz2IL74vcC0z7TZIgorCisjOiBmaWxlaW8uYzo0MzA2Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisisOaw7Togv/i3oSDGxMDPwMwgvvi+7sGzsMWzqiCx+sGzwLsgvPYgwNa9wLTPtNlcbiIKKworIzogZmlsZWlvLmM6NDMwOAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIsbEwM/AzCC8urD4wPvAuLfOIMD6wOW1ySC2p7HuwfYgxu3B/bHiuKYgs6Gzu8H2ILi2vcq9w7/AISIKKworIzogZmlsZWlvLmM6NDM5NworbXNnaWQgIltkb3NdIgorbXNnc3RyICJbtbW9ul0iCisKKyM6IGZpbGVpby5jOjQzOTcKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIlu1tb26IMf8vcRdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hY10iCittc2dzdHIgIlu4xl0iCisKKyM6IGZpbGVpby5jOjQ0MDQKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIlu4xiDH/L3EXSIKKworIzogZmlsZWlvLmM6NDQxMQorbXNnaWQgIlt1bml4XSIKK21zZ3N0ciAiW8CvtNC9ul0iCisKKyM6IGZpbGVpby5jOjQ0MTEKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbwK+00L26IMf8vcRdIgorCisjOiBmaWxlaW8uYzo0NDM4Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgwdksICIKKworIzogZmlsZWlvLmM6NDQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIMHZLCAiCisKKyM6IGZpbGVpby5jOjQ0NDMKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSCx28DaIgorCisjOiBmaWxlaW8uYzo0NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgsdvA2iIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltub2VvbF0iCisKKyM6IGZpbGVpby5jOjQ0NTUKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJbutK/z8D8x9EguLbB9ri3IMHZXSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzo0NDc0Cittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICKw5rDtOiDGxMDPwMwgwNDAuiC12r+hILnZsu6++r3AtM+02SEhISIKKworIzogZmlsZWlvLmM6NDQ3NgorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiwaS4u7fOIL6yseK4piC/+MfPvcq0z7HuIgorCisjOiBmaWxlaW8uYzo1NzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBcIiVzXCK/oSC+srHiIL+ht68iCisKKyM6IGZpbGVpby5jOjU3MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IFwiJXNcIiC03bHiIL+ht68iCisKKyM6IGZpbGVpby5jOjU3MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IFwiJXNcIiDA0LHiIL+ht68iCisKKyM6IGZpbGVpby5jOjU5NzAKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIMDatb+47bfJwMwgufbG27imIMH2v/y9wLTPtNkiCisKKyM6IGZpbGVpby5jOjU5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogsOaw7TogxsTAzyBcIiVzXCLAuyi4pikgtPUgwMy78yC757/rx9IgvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjU5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiCw5rDtOiDGxMDPIFwiJXNcIsDMKLChKSC52bLuvvqw7SC4tsL5sKHB9rfOILr2wMcgufbG27W1ILnZsu6++r3AtM+02SIKKworIzogZmlsZWlvLmM6NTk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiCw5rDtOiDGxMDPIFwiJXNcIsDMKLChKSCw7cShseIgvcPA28fRILXav6Egudmy7r76vcC0z7TZIgorCisjOiBmaWxlaW8uYzo1OTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogsOaw7TogxsTAzyBcIiVzXCLAxyC788XCsKEgsO3EobHiIL3DwNvH0SC12r+hILnZsu6++r3AtM+02SIKKworIzogZmlsZWlvLmM6NjAwNgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6ILDmsO06IMbEwM8gXCIlc1wiwMwosKEpILDtxKGx4iC9w8Dbx9Egtdq/oSC4uLXpvvq9wLTPtNkiCisKKyM6IGZpbGVpby5jOjYwMTkKK21zZ2lkICJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIKK21zZ3N0ciAitPUguLnAuiDBpLq4uKYguri3wbjpIFwiOmhlbHAgVzExXCLAuyDA1LfCx8+8vL/kLiIKKworIzogZmlsZWlvLmM6NjAzMworbXNnaWQgIldhcm5pbmciCittc2dzdHIgIrDmsO0iCisKKyM6IGZpbGVpby5jOjYwMzQKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIsiuwM4oJk8pXG4iCisixsTAzyC60revv8Cx4igmTCkiCisKKyM6IGZpbGVpby5jOjYxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MjogQ291bGQgbm90IHByZXBhcmUgZm9yIHJlbG9hZGluZyBcIiVzXCIiCittc2dzdHIgIkU0NjI6IFwiJXNcIsDHIMDnt8615bimIMHYuvHH0iC89iC++L3AtM+02SIKKworIzogZmlsZWlvLmM6NjE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogXCIlc1wiwLsouKYpILTZvcMgt8615cfSILz2IL74vcC0z7TZIgorCisjOiBmaWxlaW8uYzo2NzQwCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0twfa/9sH8LS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2OTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogwMy3sSCx17fsIL74wL06IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzAyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogKiC12r+hIMDMu/PH0SCx28DaOiAlcyIKKworIzogZmlsZWlvLmM6NzAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogsde3sSDAzLqlxq4gvvjAvTogJXMiCisKKyM6IGZpbGVpby5jOjcwNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiCittc2dzdHIgIkUyMTY6ILHXt7Egsde37MDMs6ogwMy6pcauIL74wL06ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcxOTgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIMDatb8tuO23ySAtLS0iCisKKyM6IGZpbGVpby5jOjc0NjkKK21zZ2lkICJFMjE3OiBDYW4ndCBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgQUxMIGV2ZW50cyIKK21zZ3N0ciAiRTIxNzogQUxMIMDMuqXGrr+hILTrx9ggwNq1v7jtt8nAuyC9x8fgx9IgvPYgvvi9wLTPtNkiCisKKyM6IGZpbGVpby5jOjc0OTIKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIrjCtMIgwNq1v7jtt8nAzCC++L3AtM+02SIKKworIzogZmlsZWlvLmM6NzgxMworbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IMDatb+47bfJwMwgs8q5qyCx7bDUIMHfw7i1x776vcC0z7TZIgorCisjOiBmaWxlaW8uYzo4MDg4CisjLCBjLWZvcm1hdAorI34gbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKKyN+IG1zZ3N0ciAiIgorCisjOiBmaWxlaW8uYzo4MDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiJXMgvcfH4MHfIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjgxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgIsDatb+47bfJICVzIgorCisjOiBmaWxlaW8uYzo4NzMxCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOToge7ChIL74vcC0z7TZLiIKKworIzogZmlsZWlvLmM6ODczMworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IH2woSC++L3AtM+02S4iCisKKyM6IGZvbGQuYzo2OAorbXNnaWQgIkU0OTA6IE5vIGZvbGQgZm91bmQiCittc2dzdHIgIkU0OTA6IGZvbGSwoSC++L3AtM+02SIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiDH9sDnwMcgJ2ZvbGRtZXRob2QnwLi3ziDBorHiuKYguLi16SC89iC++L3AtM+02SIKKworIzogZm9sZC5jOjU5NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiDH9sDnwMcgJ2ZvbGRtZXRob2QnwLi3ziDBorHiuKYgwfa/7yC89iC++L3AtM+02SIKKworIzogZ2V0Y2hhci5jOjI0OAorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjogwNDH9MH4ILn2xtu/oSC09cfPseIiCisKKyM6IGdldGNoYXIuYzoyMjA4Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6IMDnsc0guMrHziIKKworIzogZ2V0Y2hhci5jOjMwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzIMD8v6ogvuC+7rChIMDMucwgwbjA58fVtM+02SIKKworIzogZ2V0Y2hhci5jOjMwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiAlcyDA/L+qILjFx87AzCDAzLnMIMG4wOfH1bTPtNkiCisKKyM6IGdldGNoYXIuYzozMjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjY6IGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjY6ICVzIL7gvu6woSDAzLnMIMG4wOfH1bTPtNkiCisKKyM6IGdldGNoYXIuYzozMjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiAlcyC4xcfOwMwgwMy5zCDBuMDnx9W0z7TZIgorCisjOiBnZXRjaGFyLmM6MzI4OQorbXNnaWQgIk5vIGFiYnJldmlhdGlvbiBmb3VuZCIKK21zZ3N0ciAivuC+7rimIMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGdldGNoYXIuYzozMjkxCittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAiuMrHzsC7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGdldGNoYXIuYzo0MTgzCittc2dpZCAiRTIyODogbWFrZW1hcDogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFMjI4OiBtYWtlbWFwOiDAzLvzx9Egu/PFwiIKKworIzogZ3VpLmM6MjIwCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IEdVSbimIL3DwNvH0iC89iC++L3AtM+02SIKKworIzogZ3VpLmM6MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBcIiVzXCK/obytIMDQwLsgvPYgvvi9wLTPtNkiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIkU2NjU6IL61uLjH0SCx27LDwLsgw6PAuyC89iC++L7uvK0gR1VJuKYgvcfH4MfSILz2IL74vcC0z7TZIgorCisjOiBndWkuYzo0NzcKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ICdndWlmb250d2lkZSewoSDAzLvzx9W0z7TZIgorCisjOiBndWkuYzo1NDcKK21zZ2lkICJFNTk5OiBWYWx1ZSBvZiAnaW1hY3RpdmF0ZWtleScgaXMgaW52YWxpZCIKK21zZ3N0ciAiRTU5OTogJ2ltYWN0aXZhdGVrZXknILCqwMwgwMy788fVtM+02SIKKworIzogZ3VpLmM6NDA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6ILv2ICVzwLsouKYpIMfStOfH0iC89iC++L3AtM+02SIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjy/rSC89iC++MC9PiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogsduywyAlc8C7KLimKSC+8sC7ILz2IL74vcC0z7TZIgorCisjOiBndWlfYXRfZnMuYzoyNzgxCittc2dpZCAiRTYxNDogdmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNDogdmltX1NlbEZpbGU6IMf2wOcgtfC3usXkuK63ziC1ub7GsKUgvPYgvvi9wLTPtNkiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIrDmt84gwMy4pzoiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDcKK21zZ2lkICJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE1OiB2aW1fU2VsRmlsZTogx/bA5yC18Le6xeS4rrimIL7ywLsgvPYgvvi9wLTPtNkiCisKKyM6IGd1aV9hdF9mcy5jOjI4MTUgZ3VpX21vdGlmLmM6MTYyMworbXNnaWQgIk9LIgorbXNnc3RyICLIrsDOIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiw+u80iIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICK9usWpt9G52SDAp8GsOiC95iDHyL26uMrAxyDB9r/AuczGrriuuKYgvvLAuyC89iC++L3AtM+02S4iCisKKyM6IGd1aV9hdGhlbmEuYzoyMDQ3IGd1aV9tb3RpZi5jOjE4NzEKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICK69iC068itu/PA2iIKKworIzogZ3VpX2JldmFsLmM6MTAxIGd1aV93MzIuYzozOTU0Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6ILjevcPB9r/NIMTduekguPC1zrimILvnv+vH2LyttMIgQmFsbG9vbkV2YWzAuyC4uLXpILz2IL74vcC0z7TZIgorCisjOiBndWlfZ3RrLmM6MTYwNworbXNnaWQgIlZpbSBkaWFsb2cuLi4iCittc2dzdHIgIrr2ILTryK2788DaLi4uIgorCisjOiBndWlfZ3RrLmM6MjA2MCBtZXNzYWdlLmM6Mjk5OQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIr+5KCZZKVxuIgorIr7GtM+/wCgmTilcbiIKKyLD67zSKCZDKSIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAiwNS3wiC55rn9KF9NKSIKKworIzogZ3VpX2d0ay5jOjI1MzQgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiuvYgLSDDo77GvK0gudmy2bHiLi4uIgorCisjOiBndWlfZ3RrLmM6MjU0MiBndWlfbW90aWYuYzoyNzcwCittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICK69iAtIMOjseIuLi4iCisKKyM6IGd1aV9ndGsuYzoyNTc0IGd1aV9tb3RpZi5jOjI4ODgKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICK5q77zIMOjwLux7r/kOiIKKworIzogZ3VpX2d0ay5jOjI1OTIgZ3VpX21vdGlmLmM6MjkyMAorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIrnZstwgua7A2r+tOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAitsiwsMC6ILO5uLu4uCIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjM1IGd1aV9tb3RpZi5jOjMwNDgKKyN+IG1zZ2lkICJNYXRjaCBjYXNlIgorI34gbXNnc3RyICIiCisKKyM6IGd1aV9ndGsuYzoyNjQ1IGd1aV9tb3RpZi5jOjI5OTAKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIrnmx+IiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjY1NyBndWlfbW90aWYuYzozMDAyCittc2dpZCAiVXAiCittc2dzdHIgIsCnt84iCisKKyM6IGd1aV9ndGsuYzoyNjYxIGd1aV9tb3RpZi5jOjMwMTAKK21zZ2lkICJEb3duIgorbXNnc3RyICK+xreht84iCisKKyM6IGd1aV9ndGsuYzoyNjgzIGd1aV9ndGsuYzoyNjg1IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIrTZwL0gw6Ox4iIKKworIzogZ3VpX2d0ay5jOjI3MDIgZ3VpX2d0ay5jOjI3MDQgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIrnZstmx4iIKKworIzogZ3VpX2d0ay5jOjI3MTUgZ3VpX2d0ay5jOjI3MTcgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICK48LXOILnZstmx4iIKKworIzogZ3VpX2d0a194MTEuYzoyMzI3Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiuvY6ILy8vMcgsPy4rsDat866zsXNIFwiZGllXCIgv+TDu8C7ILnevtK9wLTPtNlcbiIKKworIzogZ3VpX2d0a194MTEuYzozNTE5Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIrr2OiC43sDOIMOiwMwgwdew1CC1ySCwzcDUtM+02VxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjQxMzgKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAisduywyCw7bijseIiCisKKyM6IGd1aV9ndGtfeDExLmM6NjAzNSB1aS5jOjIxMjAKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICK68yCw7bijseIgtOu9xSBDVVRfQlVGRkVSMMC7ILvnv+vH373AtM+02SIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICKwxbijsLMiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiwNq34bnmIgorCisjOiBndWlfbW90aWYuYzoxNjIxCittc2dpZCAiSGVscCIKK21zZ3N0ciAitbW/8ri7IgorCisjOiBndWlfbW90aWYuYzoxNjIyCittc2dpZCAiRmlsZXMiCittc2dzdHIgIsbEwM8iCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIrDtuKOx4iIKKworIzogZ3VpX21vdGlmLmM6MjgzNQorbXNnaWQgIlVuZG8iCittc2dzdHIgIsPrvNIiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiBaYXAgsduywyAnJXMnwLsouKYpILfOteXH0iC89iC++L3AtM+02SIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkU2MTE6ILHbssMgJXPAuyi4pikgu+e/68fSILz2IL74vcC0z7TZIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyLA2r3EIMfBt868vL26uKYgs6Gzu7HiIMCnx9gguN69w8H2uKYgurizwr3AtM+02S5cbiIKKworIzogZ3VpX3czMi5jOjg0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0Mzogwfa/+LXHwfYgvsq0wiDAzsDaOiBcIi0lc1wiOiBPTEUgxsfAuyC757/rx8+9yr3Dv8AuIgorCisjOiBndWlfdzQ4LmM6MjE2MworbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIrmuwNq/rSDDo7HiICgnXFwnuKYgw6PAuLfBuOkgJ1xcXFwnILvnv+spIgorCisjOiBndWlfdzQ4LmM6MjE4OAorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIrmuwNq/rSDDo77GILnZstmx4iAoJ1xcJ7imIMOjwLi3wbjpICdcXFxcJyC757/rKSIKKworIzogZ3VpX3gxMS5jOjE1MzcKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICIiCisiuvYgRTQ1ODogu/a787jKIL+jxq64rrimIMfStOfH0iC89iC++L3AtM+02SwguO647iC79sDMIMDfuPi1ySC89iDA1r3AtM+02SIKKworIzogZ3VpX3gxMS5jOjIxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6ILTZwL0gsdvA2rzCwMcgsduyw8DMILHbssO8wiAlc7+hIL74vcC0z7TZOiIKKworIzogZ3VpX3gxMS5jOjIxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1Mjogsduyw7zCIMDMuKc6ICVzIgorCisjOiBndWlfeDExLmM6MjE2MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICKx27LDICclcyfAuii0wikgsO3BpLPQwMywoSC+xrTVtM+02SIKKworIzogZ3VpX3gxMS5jOjIxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiCx27LDvMIgwMy4pzogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIrHbssMwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAisduywzE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlbGQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAisduywyVsZCCzyrrxsKEgsduywzDAxyC1zrnosKEgvsa01bTPtNlcbiIKKworIzogZ3VpX3gxMS5jOjIxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICKx27LDMCCzyrrxOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIrHbssMxILPKuvE6ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1Njogx9Gx2yC/wMXkuLbFuCC/obevIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiu/UgtaXAzMXNuqPAzL26ILT1x8+x4iIKKworIzogaWZfY3Njb3BlLmM6NzkKKyN+IG1zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorI34gbXNnc3RyICIiCisKKyM6IGlmX2NzY29wZS5jOjgxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIsDMILjevcPB9iC6uMDMseIiCisKKyM6IGlmX2NzY29wZS5jOjgzCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIr+ssOEgsvex4iIKKworIzogaWZfY3Njb3BlLmM6ODUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICK48LXnIL+ssOEgtNm9wyDDyrHiyK0iCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiv6yw4SC6uL+pwdax4iIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiC757/ruf06IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMjQKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIsDMIGNzY29wZSC47bfJwLogw6Igs6q0qbHiuKYgwfa/+MfPwfYgvsq9wLTPtNkuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiC757/ruf06IGNzdGFnIDxpZGVudD4iCisKKyM6IGlmX2NzY29wZS5jOjIzMQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzogxcKx17imIMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IGlmX2NzY29wZS5jOjQwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYzOiBzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgIkU1NjM6IHN0YXQoJXMpIL+ht686ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0MTkKK21zZ2lkICJFNTYzOiBzdGF0IGVycm9yIgorbXNnc3RyICJFNTYzOiBzdGF0IL+ht68iCisKKyM6IGlmX2NzY29wZS5jOjUxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY0OiAlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIkU1NjQ6ICVzwLootMIpILXwt7rF5LiutbUgyKTAuiBjc2NvcGUgtaXAzMXNuqPAzL26sKEgvsa01bTPtNkiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgImNzY29wZSC1pcDMxc26o8DMvbogJXO/oSC09cffvcC0z7TZLiIKKworIzogaWZfY3Njb3BlLmM6NTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWxkIgorbXNnc3RyICJFMjYyOiBjc2NvcGUgv6yw4SAlbGQgwNCx4iC/obevIgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MToguPC4o7TCIGNzY29wZSDDo7HiIMf8vcQiCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBjc2NvcGUgxsTAzMfBuKYguLi16SC89iC++L3AtM+02SIKKworIzogaWZfY3Njb3BlLmM6NzUzCittc2dpZCAiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIKK21zZ3N0ciAiRTYyMjogY3Njb3BluKYgZm9ya8fSILz2IL74vcC0z7TZIgorCisjOiBpZl9jc2NvcGUuYzo4NDcgaWZfY3Njb3BlLmM6ODk3Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uIL3Hx+DAzCC9x8bQx9+9wLTPtNkiCisKKyM6IGlmX2NzY29wZS5jOjg5OAorbXNnaWQgIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIKK21zZ3N0ciAiRTYyMzogY3Njb3BlIMfBt868vL26uKYgc3Bhd27H0iC89iC++L3AtM+02SIKKworIzogaWZfY3Njb3BlLmM6OTExCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogdG9fZnC/oSC068fRIGZkb3BlbiC9x8bQIgorCisjOiBpZl9jc2NvcGUuYzo5MTMKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmcl9mcL+hILTrx9EgZmRvcGVuIL3HxtAiCisKKyM6IGlmX2NzY29wZS5jOjk1MQorbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2NzogY3Njb3BlIL+ssOHAzCC++L3AtM+02SIKKworIzogaWZfY3Njb3BlLmM6MTAyNQorIywgYy1mb3JtYXQKKyN+IG1zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCisjfiBtc2dzdHIgIiIKKworIzogaWZfY3Njb3BlLmM6MTA4MgorIywgYy1mb3JtYXQKKyN+IG1zZ2lkICJFNDY5OiBpbnZhbGlkIGNzY29wZXF1aWNrZml4IGZsYWcgJWMgZm9yICVjIgorI34gbXNnc3RyICIiCisKKyM6IGlmX2NzY29wZS5jOjExNTIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZSC47bfJOlxuIgorCisjOiBpZl9jc2NvcGUuYzoxMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIgorbXNnc3RyICIlLTVzOiAlLTMwcyAou+e/67n9OiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogY3Njb3BlILWlwMzFzbqjwMy9urimIL+tILz2IL74wL06ICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMjcxCittc2dpZCAiRTYyNjogY2Fubm90IGdldCBjc2NvcGUgZGF0YWJhc2UgaW5mb3JtYXRpb24iCittc2dzdHIgIkU2MjY6IGNzY29wZSC1pcDMxc26o8DMvbogwaS6uLimIL7ywLsgvPYgvvi9wLTPtNkiCisKKyM6IGlmX2NzY29wZS5jOjEyOTYKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODogwd+6ubXIIGNzY29wZSC1pcDMxc26o8DMvbq0wiC09cfYwfbB9iC+yr7SvcC0z7TZIgorCisjOiBpZl9jc2NvcGUuYzoxMzA3Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IGNzY29wZSC/rLDhIMfjv+vEocDHIMPWtOsgsKq/oSC1tbTex9+9wLTPtNkiCisKKyM6IGlmX2NzY29wZS5jOjE0MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIgorbXNnc3RyICJFMjYxOiBjc2NvcGUgv6yw4SAlc8C7KLimKSDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZCIKK21zZ3N0ciAiY3Njb3BlIL+ssOEgJXPAzCiwoSkgtN3H+73AtM+02SIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGNzX21hbmFnZV9tYXRjaGVzv6EgvcmwosfRIL+ht68iCisKKyM6IGlmX2NzY29wZS5jOjE4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIkNzY29wZSDFwrHXOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTg3MAorbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICDB2SIKKworIzogaWZfY3Njb3BlLmM6MTg3MgorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAixsTAzyDAzLinIC8gxNzF2L26xq4gLyDB2VxuIgorCisjOiBpZl9jc2NvcGUuYzoxOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDk6IENzY29wZSBlcnJvcjogJXMiCittc2dzdHIgIkU2MDk6IENzY29wZSC/obevOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICK48LXnIGNzY29wZSC1pcDMxc26o8DMvboguK68wiIKKworIzogaWZfY3Njb3BlLmM6MjI0NAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICJjc2NvcGUgv6yw4cDMIL74vcC0z7TZXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyNDgKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICC1pcDMxc26o8DMvbogwMy4pyAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKKworIzogaWZfcHl0aG9uLmM6NDM2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjYzOiC5zL7Ix9W0z7TZLCDAzCC47bfJwLogu+e/68fSILz2IL74vcC0z7TZLCDGxMDMveMgtvPAzLrqt6+4rrimILfOtfnH0iAiCisivPYgvvi9wLTPtNkuIgorCisjOiBpZl9weXRob24uYzo1MDAKK21zZ2lkICJFNjU5OiBDYW5ub3QgaW52b2tlIFB5dGhvbiByZWN1cnNpdmVseSIKK21zZ3N0ciAiRTY1OTogUHl0aG9uwLsgwOexzcijw+LH0iC89iC++L3AtM+02SIKKworIzogaWZfcHl0aG9uLmM6NzAxCittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJPdXRwdXRPYmplY3QgvNO8usC7IMH2v+8gvPYgvvi9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjcwOAorbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgInNvZnRzcGFjZbTCIMGkvPa/qb7fuLggx9W0z7TZIgorCisjOiBpZl9weXRob24uYzo3MTYKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAiwN+4+LXIILzTvLoiCisKKyM6IGlmX3B5dGhvbi5jOjc1NSBpZl9weXRob24uYzo3NjkKK21zZ2lkICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgbGlzdCBvZiBzdHJpbmdzIgorbXNnc3RyICJ3cml0ZWxpbmVzKCm0wiC5rsDav60guPG3z8DMIMfKv+TH1bTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjg5NQorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiDGxMDMveM6IEkvTyCwtMO8IMPKseLIrcHfIL+ht6+woSC7/bDlvcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIsDfuPi1yCDHpcf2vcQiCisKKyM6IGlmX3B5dGhvbi5jOjEwOTQgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAix6XH9r3EwLsgwfa/+MfPwfYgvsq1tbfPIMTExsTAzyC1x776vcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxMTA3Cittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiwfa/9sH4ILn2xtu4piDC/MG2x8+3wbDtIMfPv7S9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjExMjIgaWZfcHl0aG9uLmM6MTE2MyBpZl9weXRob24uYzoxMjI3IGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIsHZILn4yKOwoSC5/MCnuKYguf6+7rO1vcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxMzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPCU4bFi/oSC59sbbILC0w7wgKMH2v/bBs73AtM+02Sk+IgorCisjOiBpZl9weXRob24uYzoxNDUzIGlmX3RjbC5jOjgzNgorbXNnaWQgImludmFsaWQgbWFyayBuYW1lIgorbXNnc3RyICLA37j4tcgguLbFqSDAzLinIgorCisjOiBpZl9weXRob24uYzoxNzMzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIrHXt7EgufbG27TCIL74vcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxODIxCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAiwfa/9sH4IMOiwLsgwvzBtsfPt8Gw7SDHz7+0vcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICLA0LHiIMD8v+sgvNO8uiIKKworIzogaWZfcHl0aG9uLmM6MTg3OQorbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAixtu8rSDAp8ShsKEgufbG2yC527+hIMDWvcC0z7TZIgorCisjOiBpZl9weXRob24uYzoxOTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjwlLjhsWL+hIMOiILC0w7wgKMH2v/bBs73AtM+02Sk+IgorCisjOiBpZl9weXRob24uYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjwlLjhsWL+hIMOiILC0w7wgKLjwuKcpPiIKKworIzogaWZfcHl0aG9uLmM6MTk3MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93ICVkPiIKK21zZ3N0ciAiPMOiICVkPiIKKworIzogaWZfcHl0aG9uLmM6MjA0NgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICKx17exIMOiwLogvvi9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDcgaWZfcHl0aG9uLmM6MjM0MSBpZl9weXRob24uYzoyMzk2IGlmX3B5dGhvbi5jOjI0NjQKKyM6IGlmX3B5dGhvbi5jOjI1ODYgaWZfcHl0aG9uLmM6MjYzOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICJ1bmRvIMGkuri4piDA+sDlx9IgvPYgvvi9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDkgaWZfcHl0aG9uLmM6MjQwMyBpZl9weXRob24uYzoyNDc1Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICLB2cC7IMH2v+8gvPYgvvi9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjIzNDYgaWZfcHl0aG9uLmM6MjQ5MSBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIsHZwLsgudmy3CC89iC++L3AtM+02SIKKworIzogaWZfcHl0aG9uLmM6MjUwOSBpZl9weXRob24uYzoyNTg4IGlmX3B5dGhvbi5jOjI2NDYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIsHZwLsgs6K/9rPWwLsgvPYgvvi9wLTPtNkiCisKKyM6IGlmX3B5dGhvbi5jOjI3NTAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgIrmuwNq/rcC6IG5ld2xpbmXAuyDG98fUx9IgvPYgvvi9wLTPtNkiCisKKyM6IGlmX3J1YnkuYzo0MjIKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjY6ILnMvsjH1bTPtNksIMDMILjtt8nAuiC757/rx9IgvPYgvvi9wLTPtNksILfnuvEgtvPAzLrqt6+4rrimILfOtfnH0iC89iAiCisivvi9wLTPtNkuIgorCisjOiBpZl9ydWJ5LmM6NDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6ILjwuKO0wiBsb25nam1wILvzxcIgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAixeSx2yCxuMf2L8GkwMciCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIi4uLsDHILHiursgxay3ob26ILq4v6nB1rHiIgorCisjOiBpZl9zbmlmZi5jOjY5CisjfiBtc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl9zbmlmZi5jOjcwCisjfiBtc2dpZCAiUmV0cmlldmUgZnJvbSBmaWxlIgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6NzEKKyN+IG1zZ2lkICJSZXRyaWV2ZSBmcm9tIHByb2plY3QiCisjfiBtc2dzdHIgIiIKKworIzogaWZfc25pZmYuYzo3MworI34gbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6NzQKKyN+IG1zZ2lkICJSZXRyaWV2ZSIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl9zbmlmZi5jOjc1CisjfiBtc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCisjfiBtc2dzdHIgIiIKKworIzogaWZfc25pZmYuYzo3NgorI34gbXNnaWQgIkZpbmQgc3ltYm9sIgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6NzcKKyN+IG1zZ2lkICJCcm93c2UgY2xhc3MiCisjfiBtc2dzdHIgIiIKKworIzogaWZfc25pZmYuYzo3OAorI34gbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6NzkKKyN+IG1zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6ODAKKyN+IG1zZ2lkICJYcmVmIHJlZmVycyB0byIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl9zbmlmZi5jOjgxCisjfiBtc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl9zbmlmZi5jOjgyCisjfiBtc2dpZCAiWHJlZiBoYXMgYSIKKyN+IG1zZ3N0ciAiIgorCisjOiBpZl9zbmlmZi5jOjgzCisjfiBtc2dpZCAiWHJlZiB1c2VkIGJ5IgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6ODQKKyN+IG1zZ2lkICJTaG93IGRvY3Ugb2YiCisjfiBtc2dzdHIgIiIKKworIzogaWZfc25pZmYuYzo4NQorI34gbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorI34gbXNnc3RyICIiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJTTmlGRiu3ziC/rLDhx9IgvPYgvvi9wLTPtNkuIMivsObAuyDIrsDOx8+9yr3Dv8AgKHNuaWZmZW1hY3OwoSAkUEFUSL+hvK0gw6O+xiIKKyLBrr7fIMfVtM+02SkuXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiDA0LTCIMHfIL+ht68uILL3segiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIm5vdCAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJjb25uZWN0ZWQiCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiC48LijtMIgU05pRkYrIL/kw7s6ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiBTTmlGRiu/oSC/rLDhIL+ht68iCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTbmlGRiuwoSC/rLDhtcfB9iC+yr7SvcC0z7TZIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBTbmlGRisgufbG27ChIL7GtNW0z7TZIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiC+srTCILW1wd8gv6G3ry4gsvew5b3AtM+02SIKKworIzogaWZfdGNsLmM6NDE4Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICLA37j4tcggufbG2yC5+MijIgorCisjOiBpZl90Y2wuYzo0NjQgaWZfdGNsLmM6OTMxIGlmX3RjbC5jOjExMTAKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICK+xsH3ILG4x/a1x8H2IL7KvtK9wLTPtNkiCisKKyM6IGlmX3RjbC5jOjUwMQorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICK48LijtMIgv8m8xyIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzQKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIsHZwLsgvLPBpMfSILz2IL74vcC0z7TZIgorCisjOiBpZl90Y2wuYzo4NDUKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIri2xamwoSC8s8GktcfB9iC+yr7SvcC0z7TZIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICLH4CAlZCC/rSAlZCIKKworIzogaWZfdGNsLmM6ODgxCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAiwdnAuyCzor/2s9awxbOqILT1x9IgvPYgvvi9wLTPtNkiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAiuPC4o7TCIMfDt6Gx1zogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIrjwuKO0wiC69iC/ybzHIgorCisjOiBpZl90Y2wuYzoxNDIzCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICLFsLq4teUgwM7Fzbe0xq4iCisKKyM6IGlmX3RjbC5jOjE0MjgKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgIrr2IL+ht68iCisKKyM6IGlmX3RjbC5jOjE0NzEKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIrn2xtsvw6IguO23ycC7ILi4tekgvPYgvvi9wLTPtNk6ILC0w7ywoSDB9r/2wf20z7TZIgorCisjOiBpZl90Y2wuYzoxNTQ1Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAixN256SC47bfJwLsgte63z8fSILz2IL74vcC0z7TZOiC59sbbL8OiwMwgwMy5zCDB9r/2wbO9wLTPtNkiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYyCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wgvcmwosfRIL+ht686IHJlZmxpc3SwoSCx+sGzs6ohPyDAzCC5rsGmuKYgdmltLWRldkB2aW0ub3Jnt84gvsu3wcHWIgorIr3KvcO/wCIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIsTduekguO23ycC7ILXut8/H0iC89iC++L3AtM+02TogufbG2y/DoiDC/MG2uKYgw6PAuyC89iC++L3AtM+02SIKKworIzogaWZfdGNsLmM6MTcyNAorbXNnaWQgIiIKKyJFNTcxOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFNTcxOiC5zL7Ix9W0z7TZLCDAzCC47bfJwLogu+e/68fSILz2IL74vcC0z7TZLCBUY2wgtvPAzLrqt6+4rrimILfOtfnH0iC89iC++CIKKyK9wLTPtNkuIgorCisjOiBpZl90Y2wuYzoxODg2Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MTogVENMIL+ht686ILOhs7ux4iDE2rXlsKEgwaS89rChIL7GtNGwoSE/IMDMILmuwaa4piB2aW0tZGV2QHZpbS5vcme3ziC+yyIKKyK3wcHWvcq9w7/AIgorCisjOiBpZl90Y2wuYzoyMDA3Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICLB2cC7IL7ywLsgvPYgvvi9wLTPtNkiCisKKyM6IGlmX3hjbWRzcnYuYzoyMjUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICK47bfJILytufYgwMy4p8C7ILXut8/H0iC89iC++L3AtM+02SIKKworIzogaWZfeGNtZHNydi5jOjQ3MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6ILTru/PHwbfOsde3pcC4t84guO23ySC6uLO7seKwoSC9x8bQx9+9wLTPtNkiCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IMDfuPi1yCC8rbn2IGlkILvnv+u1yjogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMTEwCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiC69iDAzr26xc+9uiC3ucH2vbrGrriuILzTvLrAzCDA37j4tce+7iDA1r3AtM+02S4gwfa//L3AtM+02SEiCisKKyM6IG1haW4uYzo2MAorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICK48LijtMIgv8m8xyIKKworIzogbWFpbi5jOjYyCittc2dpZCAiVG9vIG1hbnkgZWRpdCBhcmd1bWVudHMiCittc2dzdHIgIrPKuasguLnAuiDG7cH9IMDOwNoiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIrXav6EgwM7A2rChIL74wL0iCisKKyM6IG1haW4uYzo2NgorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICK/ybzHILXav6EgvrK3ubHiILCqIgorCisjOiBtYWluLmM6NjgKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIsIFwiLWMgY29tbWFuZFwiIG9yIFwiLS1jbWQgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAis8q5qyC4ucC6IFwiK2NvbW1hbmRcIiBcIi1jIGNvbW1hbmRcIiDIpMC6IFwiLS1jbWQgY29tbWFuZFwiIMDOwNoiCisKKyM6IG1haW4uYzo3MAorI34gbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorI34gbXNnc3RyICIiCisKKyM6IG1haW4uYzo0NjYKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIsDMILr2wLogZGlmZiCx4rTJIL74wMwgxMTGxMDPILXHvvq9wLTPtNkuIgorCisjOiBtYWluLmM6OTMyCittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAivbrFqbizxq4gxsTAz8C7ILTZvcMgv623wbDtIL3DtbU6IFwiIgorCisjOiBtYWluLmM6OTQxCittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICLA0LHiIMCnx9ggv60gvPYgvvjAvTogXCIiCisKKyM6IG1haW4uYzo5ODUKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIr26xam4s8auIMPit8LAuyC/rSC89iC++MC9OiBcIiIKKworIzogbWFpbi5jOjExMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICIlZCDGxMDPwLsgsO3EobHiXG4iCisKKyM6IG1haW4uYzoxMjMzCittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiuvY6ILDmsO06IMXNucyzzrfOIMPit8LH0iC89iC++L3AtM+02VxuIgorCisjOiBtYWluLmM6MTIzNQorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICK69jogsOaw7Togxc25zLPOt84gus7FzSDA1LfCud7AuyC89iC++L3AtM+02VxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKKyN+IG1zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorI34gbXNnc3RyICIiCisKKyM6IG1haW4uYzoxMzM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiBcIiVzXCK/obytIMDQwLsgvPYgvvi9wLTPtNkiCisKKyM6IG1haW4uYzoyNDExCittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIiIKKyJcbiIKKyK09SC4ucC6IMGkuri4piC/+MfPvcO46TogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbxsTAzyAuLl0gICAgICAgwda+7sH4IMbEwM8gsO3EobHiIgorCisjOiBtYWluLmM6MjQ0NQorbXNnaWQgIi0gICAgICAgICAgICAgICByZWFkIHRleHQgZnJvbSBzdGRpbiIKK21zZ3N0ciAiLSAgICAgICAgICAgICAgIMelwdjA1LfCv6G8rSDF2L26xq4gwNCx4iIKKworIzogbWFpbi5jOjI0NDYKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCB0YWcgICAgICAgICAgxcKx17ChIMGkwMe1yCDAp8Shv6G8rSDGxMDPILDtxKGx4iIKKworIzogbWFpbi5jOjI0NDgKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFu/obevxsTAz10gICDDuSC5+MKwIL+ht6+woSCzrSDGxMDPILDtxKGx4iIKKworIzogbWFpbi5jOjI0NTcKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiu+e/67n9OiIKKworIzogbWFpbi5jOjI0NjAKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbwM7A2l0gIgorCisjOiBtYWluLmM6MjQ2NAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICDIpMC6OiIKKworIzogbWFpbi5jOjI0NjcKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiwM7A2jpcbiIKKworIzogbWFpbi5jOjI0NjgKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdMDMILXav6G0wiDGxMDPIMDMuKe4uCIKKworIzogbWFpbi5jOjI0NzAKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdL/NwM+15cSrteW4piDIrsDlx8/B9iC+ysC9IgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdMDMIGd2aW0gT0xFv6Egte63zyIKKworIzogbWFpbi5jOjI0NzQKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0Z3ZpbcC7IE9MRb+hvK0gte63z8PrvNIiCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRHVUm3ziC9x8fgIChcImd2aW1cIrD6ILCwwL0pIgorCisjOiBtYWluLmM6MjQ3OAorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mIMikwLogLS1ub2ZvcmtcdMb3sde287/uteU6IEdVSbfOIL3DwNvH0iC2pyBmb3Jrx8/B9iC4uyCwzSIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaSC788XCIChcInZpXCK/zSCwsMC9KSIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeCC788XCIChcImV4XCK/zSCwsMC9KSIKKworIzogbWFpbi5jOjI0ODIKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0wba/68fRICi56MShKSC788XCIChcImV4XCK4uCkiCisKKyM6IG1haW4uYzoyNDg0Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdERpZmYgu/PFwiAoXCJ2aW1kaWZmXCK/zSCwsMC9KSIKKworIzogbWFpbi5jOjI0ODYKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdL2sv+4gu/PFwiAoXCJldmltXCKw+iCwsMC9LCBtb2RlbGVzcykiCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHTA0LHiIMD8v+sgu/PFwiAoXCJ2aWV3XCK/zSCwsMC9KSIKKworIzogbWFpbi5jOjI0ODgKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0wabH0bXIILvzxcIgKFwicnZpbVwisPogsLDAvSkiCisKKyM6IG1haW4uYzoyNDg5Cittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHS89sGkKMbEwM8gvrKx4inAzCDH47/rtcfB9iC+ysC9IgorCisjOiBtYWluLmM6MjQ5MAorbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdMXYvbrGriC89sGkwMwgx+O/67XHwfYgvsrAvSIKKworIzogbWFpbi5jOjI0OTEKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdMDMwfggu/PFwiIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHS4rr26x8Egu/PFwiIKKworIzogbWFpbi5jOjI0OTUKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdFZpIMijyK86ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0OTYKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHRWab/NIMijyK+1x8H2IL7KwL06ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ5NworbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdFZlcmJvc2Ugt7m6pyIKKworIzogbWFpbi5jOjI0OTgKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdLXwufax6yC788XCIgorCisjOiBtYWluLmM6MjQ5OQorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdFx0vbq/0iDGxMDPIL74wMwguN648LiuuLggu+e/6yIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHS9ur/SIMbEwM8guPG3z8C7IMelvcPH0SC12iCzobO7seIiCisKKyM6IG1haW4uYzoyNTAxCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICjGxMDPIMDMuKew+iDH1LKyKVx0xsS81bXHvvq0+CC8vLzHILq5sbgiCisKKyM6IG1haW4uYzoyNTAyCittc2dpZCAiLUxcdFx0XHRTYW1lIGFzIC1yIgorbXNnc3RyICItTFx0XHRcdC1ysPogsLDAvSIKKworIzogbWFpbi5jOjI1MDQKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0w6LAuyC/rSC2pyBuZXdjbGkgu+e/68fPwfYgvsrAvSIKKworIzogbWFpbi5jOjI1MDUKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDzA5cShPlx0XHRJL0+/oSA8wOXEoT4gu+e/6yIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICItQVx0XHRcdHN0YXJ0IGluIEFyYWJpYyBtb2RlIgorbXNnc3RyICItQVx0XHRcdEFyYWJpYyC48LXlt84gvcPA2yIKKworIzogbWFpbi5jOjI1MTEKK21zZ2lkICItSFx0XHRcdFN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdEhlYnJldyC48LXlt84gvcPA2yIKKworIzogbWFpbi5jOjI1MTQKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0RmFyc2kguPC15bfOIL3DwNsiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0xc25zLPOIMG+t/m4piA8dGVybWluYWw+t84gvLPBpCIKKworIzogbWFpbi5jOjI1MTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHQudmltcmMgtOu9xSA8dmltcmM+uKYgu+e/6yIKKworIzogbWFpbi5jOjI1MTkKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx0Lmd2aW1yYyC0673FIDxndmltcmM+uKYgu+e/6yIKKworIzogbWFpbi5jOjI1MjEKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0x8O3r7HXwM4gvbrFqbizxq64piC60revtenAzMH2IL7KwL0iCisKKyM6IG1haW4uYzoyNTIyCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0TrCzwMcgw6Igv62x4iAoseK6uzogxsTAz7qwt84gx8+zqikiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0LW+/zSCwsMH2uLggw6LAuyC89sH3wLi3ziCzqrSpseIiCisKKyM6IG1haW4uYzoyNTI0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0xsTAzyC4tsH2uLe/obytIL3DwNsiCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHQ8bG51bT4gwdm/obytIL3DwNsiCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPLjtt8k+XHR2aW1yYyDGxMDPwLsgwNCx4iDA/L+hIDy47bfJPsC7IL3Hx+AiCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDy47bfJPlx0XHTDucKwIMbEwM/AuyDA0MC6ILXaIDy47bfJPsC7IL3Hx+AiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8vLy8xz5cdFx0w7nCsCDGxMDPwLsgwNDAuiC12iA8vLy8xz4gxsTAzyC60revILXpwMyx4iIKKworIzogbWFpbi5jOjI1MzEKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2NyaXB0aW4+XHQ8c2NyaXB0aW4+IMbEwM+/obytIE5vcm1hbCC788XCILjtt8kgwNCx4iIKKworIzogbWFpbi5jOjI1MzIKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8c2NyaXB0b3V0Plx0uPC15yDA1LfCtcgguO23ycC7IDxzY3JpcHRvdXQ+IMbEwM+/oSDD37ChIgorCisjOiBtYWluLmM6MjUzMworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNjcmlwdG91dD5cdLjwtecgwNS3wrXIILjtt8nAuyA8c2NyaXB0b3V0PiDGxMDPv6EgwPrA5SIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdL7PyKPIrbXIIMbEwM8gsO3EobHiIgorCisjOiBtYWluLmM6MjUzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdLr2wLsgxq/BpCBYLbytufa/zSC/rLDhIgorCisjOiBtYWluLmM6MjU0MQorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0WCC8rbn2v6Egv6yw4cfPwfYgvsrAvSIKKworIzogbWFpbi5jOjI1NDQKK21zZ2lkICItLXJlbW90ZSA8ZmlsZXM+XHRFZGl0IDxmaWxlcz4gaW4gYSBWaW0gc2VydmVyIGlmIHBvc3NpYmxlIgorbXNnc3RyICItLXJlbW90ZSA8ZmlsZXM+XHSwobTJx8+46SC69iC8rbn2v6G8rSA8ZmlsZXM+IMbtwf0iCisKKyM6IG1haW4uYzoyNTQ1Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gILCwwL0sILytufawoSC++LTZsO0gutLG8sfPwfYgvsrAvSIKKworIzogbWFpbi5jOjI1NDYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICAtLXJlbW90Zb/NILCwwfa4uCC02SCw7cSlILanse7B9iCx4rTZuLO0z7TZIgorCisjOiBtYWluLmM6MjU0NworbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIi0tcmVtb3RlLXdhaXQtc2lsZW50IDxmaWxlcz4gILCwwL0sILytufawoSC++LTZsO0gutLG8sfPwfYgvsrAvSIKKworIzogbWFpbi5jOjI1NDgKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0uvYgvK259rfOIDxrZXlzPrimILq4s7uw7SCzobO7seIiCisKKyM6IG1haW4uYzoyNTQ5Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdLr2ILytufa/obytIDxleHByPiC9x8fgx8+w7SCw4bD6IMPit8IiCisKKyM6IG1haW4uYzoyNTUwCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHS757/rILChtMnH0SC69iC8rbn2IMDMuKfAuyDHpb3Dx8+w7SCzobO7seIiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlcm5hbWUgPG5hbWU+XHS69iC8rbn2IDxuYW1lPsDMILXHsMWzqiC8rbn2t84gurizu7HiIgorCisjOiBtYWluLmM6MjU1NAorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHQudmltaW5mbyC0673FIDx2aW1pbmZvPrimILvnv+siCisKKyM6IG1haW4uYzoyNTU2Cittc2dpZCAiLWggIG9yICAtLWhlbHBcdFByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oIMikwLogLS1oZWxwXHS1tb/yuLsowMwguN69w8H2KcC7IMPit8LH0SC12iCzobO7seIiCisKKyM6IG1haW4uYzoyNTU3Cittc2dpZCAiLS12ZXJzaW9uXHRcdFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHTGxyDBpLq4uKYgw+K3wsfRILXaILOhs7ux4iIKKworIzogbWFpbi5jOjI1NjEKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltwMwgvsuw7SDA1rTCIMDOwNogKLjwxrzHwSDGxyk6XG4iCisKKyM6IG1haW4uYzoyNTY1Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKG5lWHRhdyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW3AzCC+y7DtIMDWtMIgwM7A2iAobmVYdGF3IMbHKTpcbiIKKworIzogbWFpbi5jOjI1NjcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbcDMIL7LsO0gwNa0wiDAzsDaICi+xsXXs6ogxscpOlxuIgorCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0uvbAuyA8ZGlzcGxheT6/obytIL3Hx+AiCisKKyM6IG1haW4uYzoyNTcyCittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdL7GwMzE3CC788XCt84guvYgvcPA2yIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmFtZT5cdFx0uvbAzCA8bmFtZT7AziCwzcOzt7MguK680r26ILvnv+siCisKKyM6IG1haW4uYzoyNTc1Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAosbjH9rXHwfYgvsrAvSlcbiIKKworIzogbWFpbi5jOjI1NzcKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdLnZxcEgu/bAuLfOIDxjb2xvcj4gu+e/6yAoYWxzbzogLWJnKSIKKworIzogbWFpbi5jOjI1NzgKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdMDPud0gu/a/oSA8Y29sb3I+ILvnv+sgKGFsc286IC1mZykiCisKKyM6IG1haW4uYzoyNTc5IG1haW4uYzoyNTk5Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdFx0wM+53SDF2L26xq6/oSA8Zm9udD4gu+e/6yAoYWxzbzogLWZuKSIKKworIzogbWFpbi5jOjI1ODAKK21zZ2lkICItYm9sZGZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBib2xkIHRleHQiCittc2dzdHIgIi1ib2xkZm9udCA8Zm9udD5cdLG9wLogxdi9usauv6EgPGZvbnQ+ILvnv+siCisKKyM6IG1haW4uYzoyNTgxCittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHSx4r/vwNMgxdi9usauv6EgPGZvbnQ+ILvnv+siCisKKyM6IG1haW4uYzoyNTgyIG1haW4uYzoyNjAwCittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHTDyrHiIMH2v8C5zMauuK6/oSA8Z2VvbT4gu+e/6yAoYWxzbzogLWdlb20pIgorCisjOiBtYWluLmM6MjU4MworbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdLChwOXA2riuILPQwMy/oSA8d2lkdGg+ILvnv+sgKGFsc286IC1idykiCisKKyM6IG1haW4uYzoyNTg0Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgvbrFqbfRudkgs9DAzL+hIDx3aWR0aD4gu+e/6yAoYWxzbzogLXN3KSIKKworIzogbWFpbi5jOjI1ODYKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICItbWVudWhlaWdodCA8aGVpZ2h0Plx0wve4sselILi3tOsgs/TAzL+hIDxoZWlnaHQ+ILvnv+sgKGFsc286IC1taCkiCisKKyM6IG1haW4uYzoyNTg4IG1haW4uYzoyNjAxCittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdLndwPwguvG18L/AILvnv+sgKGFsc286IC1ydikiCisKKyM6IG1haW4uYzoyNTg5Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdLndwPwguvG18L/AILvnv+sgvsggx9QgKGFsc286ICtydikiCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHS47b3DtcgguK680r26ILyzwaQiCisKKyM6IG1haW4uYzoyNTkzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltwMwgvsuw7cDWtMIgwM7A2iAoUklTQyBPUyDGxyk6XG4iCisKKyM6IG1haW4uYzoyNTk0Cittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPLz9wNo+XHTErb+hvK0gw6Igw8qx4iCzyrrxIgorCisjOiBtYWluLmM6MjU5NQorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8vP3A2j5cdMHZv6G8rSDDoiDDyrHiILP0wMwiCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltwMwgvsuw7cDWtMIgwM7A2iAoR1RLKyDGxyk6XG4iCisKKyM6IG1haW4uYzoyNjAyCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHS69sC7IDxkaXNwbGF5Pr+hvK0gvcfH4CAoYWxzbzogLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjI2MDQKK21zZ2lkICItLXJvbGUgPHJvbGU+XHRTZXQgYSB1bmlxdWUgcm9sZSB0byBpZGVudGlmeSB0aGUgbWFpbiB3aW5kb3ciCittc2dzdHIgIi0tcm9sZSA8cm9sZT5cdLjewM4gw6Igsbi60MC7IMCnx9ggwK/Az8fRIL+qx9IgvLPBpCIKKworIzogbWFpbi5jOjI2MDYKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHS69sC7ILTZuKUgR1RLIMCnwawgvsi/obytIL+twL0iCisKKyM6IG1haW4uYzoyNjA5Cittc2dpZCAiLVAgPHBhcmVudCB0aXRsZT5cdE9wZW4gVmltIGluc2lkZSBwYXJlbnQgYXBwbGljYXRpb24iCittc2dzdHIgIi1QIDxwYXJlbnQgdGl0bGU+XHRWaW3AuyC6zrjwIMDAv+sgx8G3zrHXt6Ugs7u/obytIL+tseIiCisKKyM6IG1haW4uYzoyODQ3Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAitfC9usfDt7nAzLChIL74vcC0z7TZIgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjg2MgorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjogurizu7HisKEgvcfG0MfPv7S9wLTPtNkuXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjg2OAorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiC6uLO7seIgvcfG0C4gt87Ew7+hvK0gvcfH4LXLtM+02VxuIgorCisjOiBtYWluLmM6MjkwNiBtYWluLmM6MjkyNworIywgYy1mb3JtYXQKKyN+IG1zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCisjfiBtc2dzdHIgIiIKKworIzogbWFpbi5jOjI5NDkKK21zZ2lkICJObyBkaXNwbGF5OiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICK18L26x8O3ucDMIL74wL06IMelx/a9xCC6uLO7seKwoSC9x8bQx9+9wLTPtNkuXG4iCisKKyM6IG1haW4uYzoyOTYxCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IMelx/a9xCC6uLO7seKwoSC9x8bQx9+9wLTPtNkuXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIryzwaS1yCC4tsWpsKEgvvi9wLTPtNkiCisKKyM6IG1hcmsuYzo3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBcIiVzXCK/oSC4wrTCILi2xamwoSC++L3AtM+02SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzIyCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIri2xakgtvPAziAgY29sIMbEwM8vxdi9usauIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3NjAKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiDBocfBILbzwM4gIGNvbCDGxMDPL8XYvbrGriIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6ODA1CisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gImNoYW5nZSBsaW5lICBjb2wgdGV4dCIKKyN+IG1zZ3N0ciAiIgorCisjOiBtYXJrLmM6MTI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDGxMDPILi2xak6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTMxNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgwaHHwbjxt88gKLv1sM3AzCC41cD6KTpcbiIKKworIzogbWFyay5jOjE0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDGxMDPs7vAxyC4tsWpIMj3vbrF5LiuICi79bDNus7FzSC/wLehtcggvPgpOlxuIgorCisjOiBtYXJrLmM6MTUwMQorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICInPifAzCC++L3AtM+02SIKKworIzogbWJ5dGUuYzo0NjcKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0MzogwaS788D7wM4gxNq15cbkwMzB9rChIL7GtNW0z7TZIgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogSUMgsKrAuyC8s8Gkx9IgvPYgvvi9wLTPtNkiCisKKyM6IG1ieXRlLmM6NDU4MworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogwNS3wiDE3MXYvbrGrrimILi4tekgvPYgvvi9wLTPtNkiCisKKyM6IG1ieXRlLmM6NDc0MQorbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4NjogwNS3wiC55r3EwLsgv6202bChIL3HxtDH373AtM+02SIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiCw5rDtOiBJTb+hIMbEsasgxN256cC7ILyzwaTH0iC89iC++L3AtM+02SIKKworIzogbWJ5dGUuYzo0NzU4Cittc2dpZCAiRTI4ODogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgc3R5bGUiCittc2dzdHIgIkUyODg6IMDUt8Iguea9xMDMIL7utrIgx/y9xLW1IMH2v/jHz8H2IL7KvcC0z7TZIgorCisjOiBtYnl0ZS5jOjQ4MTUKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogwNS3wiC55r3EwMwgs7sgcHJlZWRpdCDH/L3EwLsgwfa/+MfPwfYgvsq9wLTPtNkiCisKKyM6IG1ieXRlLmM6NDg4OQorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogb3Zlci10aGUtc3BvdCDH/L3EwLogZm9udHNldMDMILvnv+u1x77uvt8gx9W0z7TZIgorCisjOiBtYnl0ZS5jOjQ5MjUKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IEdUSyuwoSAxLjIuMyDAzMD8IMbHwNS0z7TZLiC788XCIL+1v6rAuyC757/rx9IgvPYgvvi9wLTPtNkiCisKKyM6IG1ieXRlLmM6NTIzMgorbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IMDUt8IgvK259rChIL3Hx+C1x8H2IL7KsO0gwNa9wLTPtNkiCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5Mzogsbi/qsDMIMDhscXB9sH2IL7KvtK9wLTPtNkiCisKKyM6IG1lbWZpbGUuYzoxMDEwCittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogvbq/0iDGxMDPwLsgwNCx4iDAp8fYIMavwaQgwKfEobfOILClILz2IL74vcC0z7TZIgorCisjOiBtZW1maWxlLmM6MTAxNQorbXNnaWQgIkUyOTU6IFJlYWQgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk1OiC9ur/SIMbEwM/AuyDA0MC7ILz2IL74vcC0z7TZIgorCisjOiBtZW1maWxlLmM6MTA2NworbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiC9ur/SIMbEwM/AuyC+srHiIMCnx9ggxq/BpCDAp8Sht84gsKUgvPYgvvi9wLTPtNkiCisKKyM6IG1lbWZpbGUuYzoxMDg1Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiC9ur/SIMbEwM/AuyC+tSC89iC++L3AtM+02SIKKworIzogbWVtZmlsZS5jOjEyODIKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IL26v9IgxsTAz8DMIMDMucwgwbjA58fVtM+02SAoc3ltbGluayCw+LDdPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiCxuL+qILn4yKMgMMC7IL7ywfYguPjH37Oqv+Q/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogsbi/qiC5+MijIDHAuyC+8sH2ILj4x9+zqr/kPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6ILG4v6ogufjIoyAyuKYgvvLB9iC4+Mffs6q/5D8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDQKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IMC4wLksIL26v9IgxsTAz8C7IMDSvu659rfIvcC0z7TZISEhIgorCisjOiBtZW1saW5lLmM6NDQ5Cittc2dpZCAiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDI6IL26v9IgxsTAzyDAzLinwLsgudmy3CC89iC++L3AtM+02SIKKworIzogbWVtbGluZS5jOjUxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogXCIlc1wiwMcgvbq/0iDGxMDPwLsgv60gvPYgvvi+7rytILq5sbi0wiC60rChtMnH1bTPtNkiCisKKyM6IG1lbWxpbmUuYzo2MTgKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6ILG4v6ogMMC7IL7ywfYguPjH37Oqv+Q/PyIKKworIzogbWVtbGluZS5jOjc1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiAlc8DHIL26v9IgxsTAz8C7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IG1lbWxpbmUuYzo3NjgKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICK757/rx9Igvbq/0iDGxMDPILn4yKO4piDA1LfCx8+9yr3Dv8AgKDDAuiCzobO7seIpOiAiCisKKyM6IG1lbWxpbmUuYzo4MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6ICVzwLsouKYpIL+tILz2IL74vcC0z7TZIgorCisjOiBtZW1saW5lLmM6ODM1Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKKworIzogbWVtbGluZS5jOjgzOAorbXNnaWQgIiIKKyJcbiIKKyJNYXliZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSBvciBWaW0gZGlkIG5vdCB1cGRhdGUgdGhlIHN3YXAgZmlsZS4iCittc2dzdHIgIiIKKyJcbiIKKyK+7rayILz2waS1tSC++L76sMWzqiC69sDMIL26v9IgxsTAz8C7ILC7vcXHz8H2IL7KwLogsM0gsLC9wLTPtNkuIgorCisjOiBtZW1saW5lLmM6ODQ4IG1lbWxpbmUuYzo4NjUKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODUwCittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiuvYgMy4wIMbHwLsgu+e/68fPvcq9w7/ALlxuIgorCisjOiBtZW1saW5lLmM6ODU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzwLootMIpILr2IL26v9IgxsTAz8DMIL7GtNEgsM0gsLC9wLTPtNkiCisKKyM6IG1lbWxpbmUuYzo4NjkKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIMDMIMTEx7vFzb+hvK20wiC757/rtckgvPYgvvi9wLTPtNkuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzEKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKKworIzogbWVtbGluZS5jOjg3NQorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCisKKyM6IG1lbWxpbmUuYzo5MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAivbq/0iDGxMDPIFwiJXNcIsC7KLimKSC757/rx9W0z7TZIgorCisjOiBtZW1saW5lLmM6OTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICK/+LehIMbEwM8gXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTIzCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6ILDmsO06IL/4t6EgxsTAz8DMILnZsu6++r3AtM+02SIKKworIzogbWVtbGluZS5jOjk3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6ICVzwMcgsbi/qiAxwLsgwNDAuyC89iC++L3AtM+02SIKKworIzogbWVtbGluZS5jOjk4MAorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/uLnAuiDB2cC7IMDSvu659riyIgorCisjOiBtZW1saW5lLmM6OTk2Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/wdkgufjIo7ChIMDfuPi1x776vcC0z7TZIgorCisjOiBtZW1saW5lLmM6MTAwMworbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz+68yCxuL+qIgorCisjOiBtZW1saW5lLmM6MTAyOQorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P8HZwLsgwNK+7rn2uLIiCisKKyM6IG1lbWxpbmUuYzoxMDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiCxuL+qIDHAxyBJRLChIMDfuPi1x776vcC0z7TZICglc8DMKLChKSAuc3dwIMbEwM/AzCC+xrTRsKE/KSIKKworIzogbWVtbGluZS5jOjEwNjYKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz+xuL+qIMDSvu659riyIgorCisjOiBtZW1saW5lLmM6MTA4MgorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/PyC/qbHius7FzSA/Pz+zobHuwfbAxyDB2cDMILyvv7S9wLTPtNkiCisKKyM6IG1lbWxpbmUuYzoxMDk4Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz8gv6mx4rrOxc0gPz8/s6Gx7sH2wMcgwdnAzCCzor/2wfawxbOqIMH2v/bBriC59riwILDNILCwvcC0z7TZIgorCisjOiBtZW1saW5lLmM6MTExOAorbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/s6EiCisKKyM6IG1lbWxpbmUuYzoxMTQ0Cittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6ILq5sbggwd+03LXHvvq9wLTPtNkiCisKKyM6IG1lbWxpbmUuYzoxMTQ5Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjogurmxuCC1tcHfIL+ht68gu/2w5b3AtM+02TsgPz8/t84gvcPA28fPtMIgwdnAuyDDo77Guri9yr3Dv8AiCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiU2VlIFwiOmhlbHAgRTMxMlwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAitPUguLnAuiDBpLq4uKYguri3wbjpIFwiOmhlbHAgRTMxMlwiuKYgwNS3wsfPvLy/5C4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICK6ubG4sKEgs6Gztb3AtM+02S4guPC15yCw1CDBpLvzwM4gwfYgyK7AzsfYILq4vMW+37i4IMfVtM+02S4iCisKKyM6IG1lbWxpbmUuYzoxMTU3Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKL7uwry46SC02bilIMDMuKfAuLfOIMD6wOXHz7DtIL3NwLi9xyDB9rW1ILjwuKOw2r3AtM+02VxuIgorCisjOiBtZW1saW5lLmM6MTE1OAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICKx17iusO0gudmy7yCzu7/rwLsgyK7AzsfPt8G46SBkaWZmuKYgwMy/68fPvcq9w7/AKVxuIgorCisjOiBtZW1saW5lLmM6MTE1OQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICIiCisis6rB37+hIC5zd3AgxsTAz8C7IMH2v+y9yr3Dv8AuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNQorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICK9ur/SIMbEwM/AuyDDo77SwL06IgorCisjOiBtZW1saW5lLmM6MTM5MworbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICDH9sDnIMDat+G55r+hOlxuIgorCisjOiBtZW1saW5lLmM6MTM5NQorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICC47b3DtcggwMy4p8C7ILvnv+s6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk5Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgSW4gZGlyZWN0b3J5ICIKKworIzogbWVtbGluZS5jOjE0MTcKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIL74wL0gLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODkKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgILzSwK/A2jogIgorCisjOiBtZW1saW5lLmM6MTQ5MQorbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgILOvwqU6ICIKKworIzogbWVtbGluZS5jOjE0OTUgbWVtbGluZS5jOjM2ODUKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgILOvwqU6ICIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbuvYgMy4wIMbHwMcgsM1dIgorCisjOiBtZW1saW5lLmM6MTUxNQorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW7r2IL26v9IgxsTAz7fOILq4wMzB9iC+yr3AtM+02V0iCisKKyM6IG1lbWxpbmUuYzoxNTE5Cittc2dpZCAiICAgICAgICAgZmlsZSBuYW1lOiAiCittc2dzdHIgIiAgICAgICAgIMbEwM8gwMy4pzogIgorCisjOiBtZW1saW5lLmM6MTUyNQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICC89sGkOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI2Cittc2dpZCAiWUVTIgorbXNnc3RyICK/uSIKKworIzogbWVtbGluZS5jOjE1MjYKK21zZ2lkICJubyIKK21zZ3N0ciAivsa0z7/AIgorCisjOiBtZW1saW5lLmM6MTUzMAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgILvnv+vA2iDAzLinOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgyKO9usauIMDMuKc6ICIKKworIzogbWVtbGluZS5jOjE1MzkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICDIo726xq4gwMy4pzogIgorCisjOiBtZW1saW5lLmM6MTU0NQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgIHByb2Nlc3MgSUQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgx8G3zry8vbogSUQ6ICIKKworIzogbWVtbGluZS5jOjE1NTEKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKL7GwfcgvcfH4MHfKSIKKworIzogbWVtbGluZS5jOjE1NjMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFu69iDAzLn4IMbHv6G8rbTCILvnv+vH0iC89iC++MC9XSIKKworIzogbWVtbGluZS5jOjE1NjYKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbwMwgxMTHu8XNv6G8rbTCILvnv+vH0iC89iC++MC9XSIKKworIzogbWVtbGluZS5jOjE1NzEKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICBbwNDAuyC89iC++MC9XSIKKworIzogbWVtbGluZS5jOjE1NzUKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFu/rSC89iC++MC9XSIKKworIzogbWVtbGluZS5jOjE3NjUKK21zZ2lkICJFMzEzOiBDYW5ub3QgcHJlc2VydmUsIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMxMzogurjBuMfSILz2IL74vcC0z7TZLCC9ur/SIMbEwM/AzCC++L3AtM+02SIKKworIzogbWVtbGluZS5jOjE4MTgKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAixsTAz8DMILq4wbi1x776vcC0z7TZIgorCisjOiBtZW1saW5lLmM6MTgyMAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogxsTAzyC6uMG4wLsgvcfG0MffvcC0z7TZIgorCisjOiBtZW1saW5lLmM6MTg5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IMDfuPi1yCBsbnVtOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDogJWxkIMHZwLsgw6PAuyC89iC++L3AtM+02SIKKworIzogbWVtbGluZS5jOjIzMDcKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6IMDfuPi1yCDG98DOxc0gsbi/qiBpZCAzIgorCisjOiBtZW1saW5lLmM6MjM4NworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4tMIgML+pvt+4uCDH1bTPtNkiCisKKyM6IG1lbWxpbmUuYzoyNDQ5Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiCzyrmrILi5wLogsbi/qsDMILC7vcW1x776s6q/5D8iCisKKyM6IG1lbWxpbmUuYzoyNjMxCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiDA37j4tcggxvfAzsXNILG4v6ogaWQgNCIKKworIzogbWVtbGluZS5jOjI2NTgKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICKxuL+qIDHAzCDB9r/2wbOzqr/kPyIKKworIzogbWVtbGluZS5jOjI4NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6ICVsZCDB2cC7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IG1lbWxpbmUuYzozMTAxCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogwN+4+LXIIMb3wM7FzSCxuL+qIGlkIgorCisjOiBtZW1saW5lLmM6MzExNworbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudLChIDDA1LTPtNkiCisKKyM6IG1lbWxpbmUuYzozMTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogwdkgufjIo7ChILn8wKe4piC5/r7us7W9wLTPtNk6ILi2wfa4t7+hvK0gJWxkILi4xa0iCisKKyM6IG1lbWxpbmUuYzozMTUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiCxuL+qICVsZMDHIMHZILC5vPawoSDGsrfIvcC0z7TZIgorCisjOiBtZW1saW5lLmM6MzE5OQorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICK9usXDIMWpseIgwfWwoSIKKworIzogbWVtbGluZS5jOjMyNDUKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IMDfuPi1yCDG98DOxc0gsbi/qiBpZCAyIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTogwda48SIKKworIzogbWVtbGluZS5jOjM2NzYKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKKworIzogbWVtbGluZS5jOjM2ODAKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKKworIzogbWVtbGluZS5jOjM2ODkKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgtNm4pSDHwbfOsde3pcDMILCwwLogxsTAz8C7ILDtxKGw7SDA1rTCwd/AzyC89iDA1r3AtM+02S5cbiIKKyIgICAguLi+4CCx17e4tNm46SCwsMC6IMbEwM/AuyC1ziCws8DHIMfBt86x17elv6G8rSCw7cShwfZcbiIKKyIgICAgvsq1tbfPIMG2vcnHz73DseIgudm2+LTPtNkuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgILOhs7uwxbOqIMCnx+jAuyCwqLz2x8+9w7fBuOkgsOi808fPvcq9w7/ALlxuIgorCisjOiBtZW1saW5lLmM6MzY5NQorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSDGxMDPwLsgsO3EobTZsKEgwde++r76vcC0z7TZLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiICAgILi4vuAgsde3uLTZuOkgXCI6cmVjb3ZlclwiIMikwLogXCJ2aW0gLXIgIgorCisjOiBtZW1saW5lLmM6MzY5OAorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIMC7ILvnv+vHz7+pILq5sbjHz73KvcO/wCAoXCI6aGVscCByZWNvdmVyeVwiIML8sO0pLlxuIgorCisjOiBtZW1saW5lLmM6MzY5OQorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICDAzLnMILq5sbjHz7zMvvq02bjpIL26v9LGxMDPIFwiIgorCisjOiBtZW1saW5lLmM6MzcwMQorI34gbXNnaWQgIiIKKyN+ICJcIlxuIgorI34gIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCisjfiBtc2dzdHIgIiIKKworIzogbWVtbGluZS5jOjM3MTUgbWVtbGluZS5jOjM3MTkKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIr26v9IgxsTAzyBcIiIKKworIzogbWVtbGluZS5jOjM3MTYgbWVtbGluZS5jOjM3MjIKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlwiwMwgwMy5zCDBuMDnx9W0z7TZISIKKworIzogbWVtbGluZS5jOjM3MjUKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIrr2IC0gwda48SIKKworIzogbWVtbGluZS5jOjM3MjcKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICK9ur/SIMbEwM/AzCDAzLnMIMG4wOfH1bTPtNkhIgorCisjOiBtZW1saW5lLmM6MzczMQorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0IgorbXNnc3RyICIiCisiwNCx4iDA/L/rwLi3ziC/rbHiKCZPKVxuIgorIrHXs8kgsO3EobHiKCZFKVxuIgorIrq5sbgoJlIpXG4iCisis6Gzu7HiKCZRKVxuIgorIrn2uK6x4igmQSkiCisKKyM6IG1lbWxpbmUuYzozNzMzCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnRcbiIKKyImRGVsZXRlIGl0IgorbXNnc3RyICIiCisiwNCx4iDA/L/rwLi3ziC/rbHiKCZPKVxuIgorIrHXs8kgsO3EobHiKCZFKVxuIgorIrq5sbgoJlIpXG4iCisis6Gzu7HiKCZRKVxuIgorIrn2uK6x4igmQSlcbiIKKyLB9r/sseIoJkQpIgorCisjOiBtZW1saW5lLmM6Mzc5MAorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6ILPKuasguLnAuiC9ur/SIMbEwM/AzCC537Dftce++r3AtM+02SIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IML3uLLHpSDH17jxILDmt87AxyC6zrrQwMwgx8/ApyDC97iyx6WwoSC+xrTVtM+02SIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IML3uLLHpbTCIL/At87B9iC02bilILvzxcK/obytuLggwbjA58fVtM+02SIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6ILHXt7EgwMy4p8C7ILChwfggwve4sselsKEgvvi9wLTPtNkiCisKKyM6IG1lbnUuYzo1MjUKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiDHz8CnIML3uLLHpSC+1b+htMIgwve4sselILDmt86woSC62cC7ILz2IL74vcC0z7TZIgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IML3uLLHpSC4t7Trv6EgsPC52bfOIML3uLLHpSDH17jxwLsgtPXH0iC89rTCIL74vcC0z7TZIgorCisjOiBtZW51LmM6NTcwCittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiCxuLrQwNq0wiDC97iyx6UgsOa3zsDHILrOutDAzCC1ySC89iC++L3AtM+02SIKKworIy4gTm93IHdlIGhhdmUgZm91bmQgdGhlIG1hdGNoaW5nIG1lbnUsIGFuZCB3ZSBsaXN0IHRoZSBtYXBwaW5ncworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtZW51LmM6MTA5NworbXNnaWQgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIML3uLLHpSAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICLAzCDC97iyx6W4piC2vL7us78iCisKKyM6IG1lbnUuYzoyMDg0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogwve4sselIMfXuPEgvtW/obTCIML3uLLHpSCw5rfOsKEgwNa+7r7fIMfVtM+02SIKKworIzogbWVudS5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiDC97iyx6W4piDDo8C7ILz2IL74vcC0z7TZOiAlcyIKKworIzogbWVudS5jOjIxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogJXMgu/PFwr+hILTrx9Egwve4sselsKEgwaTAx7XHvu4gwNbB9iC+yr3AtM+02SIKKworIzogbWVudS5jOjIyMTEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IMfPwKcgwve4sselIL7Vv6Egwve4sselILDmt86woSDA1r7uvt8gx9W0z7TZIgorCisjOiBtZW51LmM6MjIzMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogwve4sseluKYgw6PAuyC89iC++MC9IC0gwve4sselIMDMuKfAuyDIrsDOx8+9yr3Dv8AiCisKKyM6IG1lc3NhZ2UuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIiVzILz2x+DB3yC/obevILnfsN86IgorCisjOiBtZXNzYWdlLmM6NDQwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgIiU0bGQgwdk6IgorCisjOiBtZXNzYWdlLmM6NjQ3Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIluzyrmrILHkILmuwNq/rV0iCisKKyM6IG1lc3NhZ2UuYzo3OTcKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiuN69w8H2ILn4v6o6IFN1bmctSHl1biBOYW0gPG5hbXNoQGtsZHAub3JnPiIKKworIzogbWVzc2FnZS5jOjEwMjUKK21zZ2lkICJJbnRlcnJ1cHQ6ICIKK21zZ3N0ciAiwd+03DogIgorCisjOiBtZXNzYWdlLmM6MTAyOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAisOi808fPt8G46SC/o8XNxbC4piC0qbijvcq9w7/AIgorCisjOiBtZXNzYWdlLmM6MTAzMAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIrDovNPHz7fBuOkgv6PFzSDIpMC6ILjtt8nAuyDA1LfCx8+9yr3Dv8AiCisKKyM6IG1lc3NhZ2UuYzoyMzUxCittc2dpZCAiLS0gTW9yZSAtLSIKK21zZ3N0ciAiLS0gtPUgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IMHZLCBTUEFDRS9iOiDCyiwgZC91OiC53cLKLCBxOiCzobO7seIpIgorCisjOiBtZXNzYWdlLmM6MjM1NQorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IMHZLCBTUEFDRTogwsosIGQ6ILndwsosIHE6ILOhs7ux4ikiCisKKyM6IG1lc3NhZ2UuYzoyOTgyIG1lc3NhZ2UuYzoyOTk3Cittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIsH6ua4iCisKKyM6IG1lc3NhZ2UuYzoyOTg0Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyK/uSgmWSlcbiIKKyK+xrTPv8AoJk4pIgorCisjOiBtZXNzYWdlLmM6MzAxNworbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIr+5KCZZKVxuIgorIr7GtM+/wCgmTilcbiIKKyK48LXOIMD6wOUoJkEpXG4iCisiuPC1ziC59riyKCZEKVxuIgorIsPrvNIoJkMpIgorCisjOiBtZXNzYWdlLmM6MzA1OAorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIsbEwM8gwPrA5SC068itu/PA2iIKKworIzogbWVzc2FnZS5jOjMwNjAKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICLGxMDPIL+tseIgtOvIrbvzwNoiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MzEzMQorbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiC5zL7Ix9W0z7TZLCDE3LzWILvzxcK/obTCIMbEwM8guuq287/swPqwoSC++L3AtM+02SIKKworIzogbWlzYzEuYzoyNzczCittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogsOaw7TogwNCx4iDA/L/rIMbEwM/AuyCw7cShsO0gwNa9wLTPtNkiCisKKyM6IG1pc2MxLmM6MzAyMQorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICLH0SDB2SDAzLvzIgorCisjOiBtaXNjMS5jOjMwMjMKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAix9EgwdkgwMzHzyIKKworIzogbWlzYzEuYzozMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICIlbGQguri02SC4ucC6IMHZIgorCisjOiBtaXNjMS5jOjMwMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICIlbGQguri02SDA+8C6IMHZIgorCisjOiBtaXNjMS5jOjMwMzMKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiICjB37Tctce++r3AtM+02SkiCisKKyM6IG1pc2MxLmM6NzU4OAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICK69jogxsTAzyC6uMG4wd8uLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjc1OTgKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICK69jogsviztb3AtM+02S5cbiIKKworIzogbWlzYzIuYzo2OTUgbWlzYzIuYzo3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiv6G3rzogIgorCisjOiBtaXNjMi5jOjcxNQorIywgYy1mb3JtYXQKKyN+IG1zZ2lkICIiCisjfiAiXG4iCisjfiAiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKKyN+IG1zZ3N0ciAiIgorCisjOiBtaXNjMi5jOjcxNworIywgYy1mb3JtYXQKKyN+IG1zZ2lkICIiCisjfiAiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisjfiAiXG4iCisjfiBtc2dzdHIgIiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiDB2cDMILPKuasgsea+7sGzvcC0z7TZIgorCisjOiBtaXNjMi5jOjgxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogs7u6ziC/obevOiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjoguN648LiuILrOwbchICAoJWx1ILnZwMzGrrimIMfStOcpIgorCisjOiBtaXNjMi5jOjI1OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiCittc2dzdHIgIr3Hx+DHz7fBsO0gvakgus64pzogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI4MTYKK21zZ2lkICJFNTQ1OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTQ1OiDE3bfQwMwgvvi9wLTPtNkiCisKKyM6IG1pc2MyLmM6MjgxOCBtaXNjMi5jOjI4NDUKK21zZ2lkICJFNTQ2OiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkU1NDY6IMDMu/PH0SC48LXlIgorCisjOiBtaXNjMi5jOjI4ODQKK21zZ2lkICJFNTQ3OiBJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkU1NDc6IMDMu/PH0SC4tr/svbq48L7nIgorCisjOiBtaXNjMi5jOjI5MjQKK21zZ2lkICJFNTQ4OiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU0ODogvP3A2rChIMfKv+TH1bTPtNkiCisKKyM6IG1pc2MyLmM6MjkyOQorbXNnaWQgIkU1NDk6IElsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAiRTU0OTogwMy788fRILnputDAsiIKKworIzogbWlzYzIuYzozMjM5Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAivs/IoyDFsCDA1LfCOiAiCisKKyM6IG1pc2MyLmM6MzI0MAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIrCwwLogxbC4piC02b3DIMDUt8I6ICIKKworIzogbWlzYzIuYzozMjUwCittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIsWwsKEguMLB9iC+yr3AtM+02SEiCisKKyM6IG1pc2MyLmM6Mzc5OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRTM0MzogSW52YWxpZCBwYXRoOiAnKipbbnVtYmVyXScgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIG9yIGJlICIKKyJmb2xsb3dlZCBieSAnJXMnLiIKK21zZ3N0ciAiIgorIkUzNDM6IMDfuPi1yCCw5rfOOiAnKipbufjIo10ntMIgsOa3zsDHILi2wfa4t7+hIMCnxKHHz7DFs6ogJyVzJyC12r+hIMDWvu6+3yAiCisix9W0z7TZLiIKKworIzogbWlzYzIuYzo1MDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IGNkcGF0aL+hvK0gXCIlc1wiIMDat+G55sC7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IG1pc2MyLmM6NTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IHBhdGi/obytIFwiJXNcIiDGxMDPwLsgw6PAuyC89iC++L3AtM+02SIKKworIzogbWlzYzIuYzo1MDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IGNkcGF0aL+hvK0gtPUgwMy788DHIFwiJXNcIiDA2rfhuebAuiDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBtaXNjMi5jOjUwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiBwYXRov6G8rSC09SDAzLvzwMcgXCIlc1wiIMbEwM/AuyDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBtaXNjMi5jOjUzMjQKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiDE3bfQwMwgvvi9wLTPtNkiCisKKyM6IG1pc2MyLmM6NTMzNgorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiDAzLvzx9EgxMTG97PNxq4iCisKKyM6IG1pc2MyLmM6NTM0NAorbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiC8/cDasKEgx8q/5MfVtM+02SIKKworIy4gR2V0IGhlcmUgd2hlbiB0aGUgc2VydmVyIGNhbid0IGJlIGZvdW5kLgorIzogbmV0YmVhbnMuYzozOTYKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyAjMiIKK21zZ3N0ciAiTmV0YmVhbnMgIzK/oSC/rLDhx9IgvPYgvvi9wLTPtNkiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIk5ldGJlYW5zv6Egv6yw4cfSILz2IL74vcC0z7TZIgorCisjOiBuZXRiZWFucy5jOjQ1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjY4OiBXcm9uZyBhY2Nlc3MgbW9kZSBmb3IgTmV0QmVhbnMgY29ubmVjdGlvbiBpbmZvIGZpbGU6IFwiJXNcIiIKK21zZ3N0ciAiRTY2ODogTmV0QmVhbnMgv6yw4SDBpLq4IMbEwM/AzCDBorHZILjwteWwoSDA37j4tco6IFwiJXNcIiIKKworIzogbmV0YmVhbnMuYzo3NDkKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICJOZXRiZWFucyC80sTPv6G8rSDA0LHiIgorCisjOiBuZXRiZWFucy5jOjE2NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY1ODogTmV0QmVhbnMgY29ubmVjdGlvbiBsb3N0IGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFNjU4OiC59sbbICVsZL+hILTrx9EgTmV0QmVhbnMgv6yw4cC7IMDSvu659rfIvcC0z7TZIgorCisjOiBub3JtYWwuYzoyOTgwCittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAisOaw7Togxc25zLPOwMwguvHB6r7zILvzxcK4piDHpb3Dx9IgvPYgvvi9wLTPtNkiCisKKyM6IG5vcm1hbC5jOjMyNzYKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiDEv7ytILnYv6Egua7A2r+twMwgvvi9wLTPtNkiCisKKyM6IG5vcm1hbC5jOjMyNzgKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogxL+8rSC52L+hIL3EurDA2rChIL74vcC0z7TZIgorCisjOiBub3JtYWwuYzo0NTE5Cittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IMf2wOfAxyAnZm9sZG1ldGhvZCfAuLfOIMGiseK4piDB9r/vILz2IL74vcC0z7TZIgorCisjOiBub3JtYWwuYzo2NzQwCittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDogY2hhbmdlbGlzdLChILrxvvq9wLTPtNkiCisKKyM6IG5vcm1hbC5jOjY3NDIKKyN+IG1zZ2lkICJFNjYyOiBBdCBzdGFydCBvZiBjaGFuZ2VsaXN0IgorI34gbXNnc3RyICIiCisKKyM6IG5vcm1hbC5jOjY3NDQKKyN+IG1zZ2lkICJFNjYzOiBBdCBlbmQgb2YgY2hhbmdlbGlzdCIKKyN+IG1zZ3N0ciAiIgorCisjOiBub3JtYWwuYzo4MDA1Cittc2dpZCAiVHlwZSAgOnF1aXQ8RW50ZXI+ICB0byBleGl0IFZpbSIKK21zZ3N0ciAiVklNwLsguLbEobfBuOkgIDpxdWl0PEVudGVyPiAgwNS3wiIKKworIzogb3BzLmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiMSBsaW5lICVzZWQgMSB0aW1lIgorCisjOiBvcHMuYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIjEgbGluZSAlc2VkICVkIHRpbWVzIgorCisjOiBvcHMuYzozMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCisKKyM6IG9wcy5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCisKKyM6IG9wcy5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCisKKyM6IG9wcy5jOjcxMgorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIjEgbGluZSBpbmRlbnRlZCAiCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgbGluZXMgaW5kZW50ZWQgIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogb3BzLmM6MTY3NQorbXNnaWQgImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IgorbXNnc3RyICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKKworIzogb3BzLmM6MjI2MQorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIxIGxpbmUgY2hhbmdlZCIKKworIzogb3BzLmM6MjI2MworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiJWxkIGxpbmVzIGNoYW5nZWQiCisKKyM6IG9wcy5jOjI2NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgImZyZWVpbmcgJWxkIGxpbmVzIgorCisjOiBvcHMuYzoyOTI4Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAiMSBsaW5lIHlhbmtlZCIKKworIzogb3BzLmM6MjkzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICIlbGQgbGluZXMgeWFua2VkIgorCisjOiBvcHMuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6ICVzILe5wfa9usXNv6Egvsa5qyCwzbW1IL74vcC0z7TZIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM3NjYKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gt7nB9r26xc0gLS0tIgorCisjOiBvcHMuYzo1MDc1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICLAzLvzx9Egt7nB9r26xc0gwMy4pyIKKworIzogb3BzLmM6NTE2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjILe5wfa9usXNOlxuIgorCisjOiBvcHMuYzo1MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDoguPC4o7TCILe5wfa9usXNIMf8vcQgJWQiCisKKyM6IG9wcy5jOjU2OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiDA37j4tcggt7nB9r26xc0gwMy4pzogJyVzJyIKKworIzogb3BzLmM6NjA1OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICIlbGQgv607ICIKKworIzogb3BzLmM6NjA2NQorIywgYy1mb3JtYXQKKyN+IG1zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCisjfiBtc2dzdHIgIiIKKworIzogb3BzLmM6NjA4MQorIywgYy1mb3JtYXQKKyN+IG1zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCisjfiBtc2dzdHIgIiIKKworIzogb3BzLmM6NjA5MgorIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgZm9yIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE2NDMKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPcbkwMzB9iAlTiIKKworIzogb3B0aW9uLmM6MjA5MgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAiuvbAuyCzr7DUIMfYIMHWvMW8rSCw7bi/vcC0z7TZIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODoguPC4o7TCIL/JvMciCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogwfa/+LXHwfYgvsq0wiC/ybzHwNS0z7TZIgorCisjOiBvcHRpb24uYzozNDU3Cittc2dpZCAiRTUyMDogTm90IGFsbG93ZWQgaW4gYSBtb2RlbGluZSIKK21zZ3N0ciAiRTUyMDoguPC15bbzwM6/obytILvnv+u1ySC89iC++L3AtM+02SIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiA9ILXav6EgvP3A2rChIMfKv+TH1bTPtNkiCisKKyM6IG9wdGlvbi5jOjM5ODkgb3B0aW9uLmM6NDYxOQorbXNnaWQgIkU1MjI6IE5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTIyOiB0ZXJtY2Fwv6G8rSDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBvcHRpb24uYzo0MDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IMDMu/PH0SCx28DaIDwlcz4iCisKKyM6IG9wdGlvbi5jOjQ2MTEKK21zZ2lkICJFNTI5OiBDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1Mjk6ICd0ZXJtJ8C7ILrzILmuwNq/rbfOILyzwaTH0iC89iC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NDYxNAorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IEdVSb+hvK20wiB0ZXJtwLsgudmy3CC89iC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NDYxNgorbXNnaWQgIkU1MzE6IFVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFNTMxOiBHVUm4piC9w8Dbx8+3wbjpIFwiOmd1aVwiuKYgu+e/68fPvcq9w7/AIgorCisjOiBvcHRpb24uYzo0NjQ1Cittc2dpZCAiRTU4OTogJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiRTU4OTogJ2JhY2t1cGV4dCe/zSAncGF0Y2htb2RlJ7ChILW/wM/H1bTPtNkiCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogR1RLKyAyIEdVSb+hvK20wiC52bLwILz2IL74vcC0z7TZIgorCisjOiBvcHRpb24uYzo1MDE2Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDogxN230MDMIL74vcC0z7TZIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiC68yC5rsDav63A1LTPtNkiCisKKyM6IG9wdGlvbi5jOjUwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUyNjogTWlzc2luZyBudW1iZXIgYWZ0ZXIgPCVzPiIKK21zZ3N0ciAiRTUyNjogPCVzPiC12r+hILz9wNqwoSC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NTEwMAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IMTeuLawoSC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6ICcgsKrAuyC47b3Dx9ggwda8xb7fIMfVtM+02SIKKworIzogb3B0aW9uLmM6NTE0OAorbXNnaWQgIkU1OTU6IGNvbnRhaW5zIHVucHJpbnRhYmxlIG9yIHdpZGUgY2hhcmFjdGVyIgorbXNnc3RyICJFNTk1OiDD4rfCx9IgvPYgvvi0wiwgyKTAuiC/zcDMteUgua7A2rimIMb3x9THz7DtIMDWvcC0z7TZIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiDA37j4tcggsduywyi16SkiCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5Nzogsduyw7zCwLsgsO24piC89iC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NTIwNworbXNnaWQgIkU1OTg6IEludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiRTU5ODogwN+4+LXIILHbssO8wiIKKworIzogb3B0aW9uLmM6NTIxNAorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IL/NwMy15SCx27LDwLsgsO24piC89iC++L3AtM+02SIKKworIzogb3B0aW9uLmM6NTIxNgorbXNnaWQgIkU1MzQ6IEludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJFNTM0OiDA37j4tcggv83AzLXlILHbssMiCisKKyM6IG9wdGlvbi5jOjU0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogPCVjPiC12r+hIMDMu/PH0SCx28DaIgorCisjOiBvcHRpb24uYzo1NTk3Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IMTeuLawoSDHyr/kx9W0z7TZIgorCisjOiBvcHRpb24uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJ8C6ILrxsMWzqiAlc8C7KLimKSDG98fUx9i+3yDH1bTPtNkiCisKKyM6IG9wdGlvbi5jOjU2ODIKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiC4tr/svbq4piDB9r/4x8/B9iC+yr3AtM+02SIKKworIzogb3B0aW9uLmM6NTk1MAorbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6ILTdyPfB9iC+ysC6IMelx/a9xCC56L+tIgorCisjOiBvcHRpb24uYzo1OTU0Cittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6ILPKuasguLnAuiDH17jxIgorCisjOiBvcHRpb24uYzo1OTU2Cittc2dpZCAiRTU0MjogdW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIkU1NDI6ILHVx/zAzCC+yCDA4sj5ILHXt+wiCisKKyM6IG9wdGlvbi5jOjYxOTYKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiC5zLiuILq4seIgw6LAzCDAzLnMIMG4wOfH1bTPtNkiCisKKyM6IG9wdGlvbi5jOjY0NTMKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICJXMTc6IEFyYWJpY8C6IFVURi04IMDOxNq1+SDHyr/kLCAnOnNldCBlbmNvZGluZz11dGYtOCcgx8+8vL/kIgorCisjOiBvcHRpb24uYzo2Nzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IMD7vu61tSAlZCDB2cDMIMfKv+TH1bTPtNkiCisKKyM6IG9wdGlvbi5jOjY3OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5NDogTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICJFNTk0OiDA+77utbUgJWQgxK3AzCDHyr/kx9W0z7TZIgorCisjOiBvcHRpb24uYzo3MTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NToguPC4o7TCIL/JvMc6ICVzIgorCisjOiBvcHRpb24uYzo3MjIzCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gxc25zLPOIMTateUgLS0tIgorCisjOiBvcHRpb24uYzo3MjI1Cittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gwPy/qiC/ybzHILCqIC0tLSIKKworIzogb3B0aW9uLmM6NzIyNworbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gwfa/qiC/ybzHILCqIC0tLSIKKworIzogb3B0aW9uLmM6NzIyOQorbXNnaWQgIiIKKyJcbiIKKyItLS0gT3B0aW9ucyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gv8m8xyAtLS0iCisKKyM6IG9wdGlvbi5jOjc5MzUKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgv6G3ryIKKworIzogb3B0aW9uLmM6ODkwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiAlc7+hILTrx9EguMK0wiCx28DasKEgvvi9wLTPtNkiCisKKyM6IG9wdGlvbi5jOjg5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogvLy5zMTdt9Agtdq/oSCx28DasKEgtPUgwNbAvTogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjgwCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICJjYW5ub3Qgb3BlbiAiCisKKyM6IG9zX2FtaWdhLmM6MzE0Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiuvY6IMOiwLsgv60gvPYgvvi9wLTPtNkhXG4iCisKKyM6IG9zX2FtaWdhLmM6MzM4Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAivsa5zLChtbW9uiAyLjA0s6ogtPUgs/TAuiDGx8DMIMfKv+TH1bTPtNlcbiIKKworIzogb3NfYW1pZ2EuYzozNDQKKyMsIGMtZm9ybWF0CisjfiBtc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorI34gbXNnc3RyICIiCisKKyM6IG9zX2FtaWdhLmM6NDE2Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJOSUzAuyC/rSC89iC++MC9OlxuIgorCisjOiBvc19hbWlnYS5jOjQyNworbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICJDYW5ub3QgY3JlYXRlICIKKworIzogb3NfYW1pZ2EuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICK69sDMICVkILCqwLi3ziCzobPAtM+02VxuIgorCisjOiBvc19hbWlnYS5jOjk0MQorbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgIsTcvNYgu/PFwrimILnZstwgvPYgvvi9wLTPtNkgPyFcbiIKKworIzogb3NfYW1pZ2EuYzoxMDEyCittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogxNy81sDMIL7GtNGwoT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNjEKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogLWYgv8m8x8DMILvnv+u1yCCw5r/sIL2pwLsgvcfH4MfSILz2IL74vcC0z7TZIgorCisjOiBvc19hbWlnYS5jOjEyMDIgb3NfYW1pZ2EuYzoxMjkyCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJDYW5ub3QgZXhlY3V0ZSAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNSBvc19hbWlnYS5jOjEzMDIKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgInNoZWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjI1IG9zX2FtaWdhLmM6MTMyNworbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgcmV0dXJuZWRcbiIKKworIzogb3NfYW1pZ2EuYzoxNDY4Cittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIkFOQ0hPUl9CVUZfU0laRbChILPKuasgwNu9wLTPtNkuIgorCisjOiBvc19hbWlnYS5jOjE0NzIKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkkvTyC/obevIgorCisjOiBvc19tc3dpbi5jOjU0MworbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4owN+4sikiCisKKyM6IG9zX21zd2luLmM6NjQ1Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJ8DMIDgwwMwgvsa0z77uvK0sIL/cus4guO23ycC7IL3Hx+DH0iC89iC++L3AtM+02SIKKworIzogb3NfbXN3aW4uYzoxOTc3Cittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiDHwbiwxc24piCw7bijwfYguPjH373AtM+02SIKKworIzogb3NfbXN3aW4uYzoyMDE3CisjLCBjLWZvcm1hdAorI34gbXNnaWQgInRvICVzIG9uICVzIgorI34gbXNnc3RyICIiCisKKyM6IG9zX21zd2luLmM6MjAzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6ILjwuKO0wiDHwbiwxc0gsduywzogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4MSBvc19tc3dpbi5jOjIwOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiDAzrziIL+ht686ICVzIgorCisjOiBvc19tc3dpbi5jOjIwOTIKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICK48LinIgorCisjOiBvc19tc3dpbi5jOjIxMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiJyVzJyDAzrziwd8iCisKKyM6IG9zX21zd2luLmM6MzIwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDogwN+4+LXIILHbwNq8wiDAzLinIFwiJXNcIsDMKLChKSCx27LDIMDMuKcgXCIlc1wiv6EgwNa9wLTPtNkiCisKKyM6IG9zX21zd2luLmM6MzIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiDA37j4tcggsdvA2iAnJWMnwMwosKEpILHbssMgwMy4pyBcIiVzXCK/oSDA1r3AtM+02SIKKworIzogb3NfcmlzY29zLmM6MTI1OQorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IMDfuPi1yCAnb3NmaWxldHlwZScgv8m8xyAtIFRleHS4piC757/rx9W0z7TZIgorCisjOiBvc191bml4LmM6OTI3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIrr2OiCwsMC6IL3DsdezziC1ziC5+Cwgs6GzwLTPtNlcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIrr2OiAlcyC9w7HXs87AuyDA4r7SvcC0z7TZXG4iCisKKyM6IG9zX3VuaXguYzo5MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICK69jogwdfAuyC9w7HXs87AuyDA4r7SvcC0z7TZXG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJYILXwvbrHw7e5wMy4piC/qbTCILWlICVsZCBtc2VjwMwgsMm3yL3AtM+02SIKKworIzogb3NfdW5peC5jOjEyMjYKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiuvY6IFggv6G3r7ChILv9sOW9wLTPtNlcbiIKKworIzogb3NfdW5peC5jOjEzMzgKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJYILXwvbrHw7e5wMwgvcPH6MDMIL3HxtDH373AtM+02SIKKworIzogb3NfdW5peC5jOjE0NzcKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICJYILXwvbrHw7e5wMy4piC/rbTZsKEgvcOwo8DMIMPKsPq1x776vcC0z7TZIgorCisjOiBvc191bml4LmM6MzIzNCBvc191bml4LmM6MzkxNAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCisKKyM6IG9zX3VuaXguYzozMjgyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyK9qSBzaLimIL3Hx+DH0iC89iC++L3AtM+02VxuIgorCisjOiBvc191bml4LmM6MzI4NiBvc191bml4LmM6MzkyMAorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCisKKyM6IG9zX3VuaXguYzozNDIxCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIsbEwMzHwbimILi4tekgvPYgvvi9wLTPtNlcbiIKKworIzogb3NfdW5peC5jOjM0MzYKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIsDavcQgx8G3zry8vbq4piC4uLXpILz2IL74vcC0z7TZXG4iCisKKyM6IG9zX3VuaXguYzozOTI3Cittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiuO23ycDMILOhuLbDxMGzvcC0z7TZXG4iCisKKyM6IG9zX3VuaXguYzo0MTkxIG9zX3VuaXguYzo0MzE2IG9zX3VuaXguYzo1OTgyCittc2dpZCAiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QsKEgSUNFIL+ssOHAuyDA0r7uufa3yL3AtM+02SIKKworIzogb3NfdW5peC5jOjU1NjUKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJYILXwvbrHw7e5wMwgv62x4rChIL3HxtDH373AtM+02SIKKworIzogb3NfdW5peC5jOjU4ODcKK21zZ2lkICJYU01QIGhhbmRsaW5nIHNhdmUteW91cnNlbGYgcmVxdWVzdCIKK21zZ3N0ciAiWFNNULChIHNhdmUteW91cnNlbGYgv+TDu8C7IL3Hx+DHz7DtIMDWvcC0z7TZIgorCisjOiBvc191bml4LmM6NjAwNgorbXNnaWQgIlhTTVAgb3BlbmluZyBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QsKEgv6yw4cC7IL+ptMIgwd/A1LTPtNkiCisKKyM6IG9zX3VuaXguYzo2MDI1Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIlhTTVCwoSBJQ0Ugv6yw4SCwqL3DuKYgvcfG0MffvcC0z7TZIgorCisjOiBvc191bml4LmM6NjA0NQorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb24gvcfG0DogJXMiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorI34gbXNnaWQgIkF0IGxpbmUiCisjfiBtc2dzdHIgIiIKKworIzogb3NfdzMyZXhlLmM6NjUKK21zZ2lkICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIGxpbmUuIgorbXNnc3RyICK47bfJx+DAuyDAp8fRILjeuPC4rrimIMfStOfH0iC89iC++L3AtM+02S4iCisKKyM6IG9zX3czMmV4ZS5jOjY2IG9zX3czMmV4ZS5jOjg5IG9zX3czMmV4ZS5jOjEwMAorbXNnaWQgIlZJTSBFcnJvciIKK21zZ3N0ciAiuvYgv6G3ryIKKworIzogb3NfdzMyZXhlLmM6ODkKK21zZ2lkICJDb3VsZCBub3QgbG9hZCB2aW0zMi5kbGwhIgorbXNnc3RyICJ2aW0zMi5kbGzAuyC60revILXpwM8gvPYgvvi9wLTPtNkhIgorCisjOiBvc193MzJleGUuYzo5OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIsfUvPYgxvfAzsXNuKYgRExMt84gudmy3CC89iC++L3AtM+02SEiCisKKyM6IG9zX3dpbjE2LmM6MzQyIG9zX3dpbjMyLmM6MzIyOQorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAivanAzCAlZMC7KLimKSC1ubfBwda++r3AtM+02SIKKworIzogb3Nfd2luMzIuYzoyNjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIrr2OiAlcyDAzLqlxq64piDA4r7SvcC0z7TZXG4iCisKKyM6IG9zX3dpbjMyLmM6MjY4OQorbXNnaWQgImNsb3NlIgorbXNnc3RyICK03bHiIgorCisjOiBvc193aW4zMi5jOjI2OTEKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIrfOsde+xr/0IgorCisjOiBvc193aW4zMi5jOjI2OTIKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAivMu02b/uIgorCisjOiBvc193aW4zMi5jOjMxODIKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MToguO23ycC7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IG9zX3dpbjMyLmM6MzE5NQorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEW4piAkUEFUSL+hvK0gw6PAuyC89iC++L3AtM+02S5cbiIKKyK/3LrOILjtt8nAzCCzobOtILXaILjYw+IgvPYgvvi9wLTPtNkuXG4iCisitNkguLnAuiDBpLq4uKYguri9w7fBuOkgOmhlbHAgd2luMzItdmltcnVuwLsguri9yr3Dv8AuIgorCisjOiBvc193aW4zMi5jOjMxOTgKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiuvYgsOaw7SIKKworIzogcXVpY2tmaXguYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiDH/L3EILmuwNq/rb+hICUlJWPAzCiwoSkgs8q5qyC4ub3AtM+02SIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6IMf8vcQgua7A2r+tv6EgJSUlY8DMKLChKSDA37j4tce++r3AtM+02SIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogx/y9xCC5rsDav62/oSBdsKEgvvi9wLTPtNkiCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogx/y9xCC5rsDav62/oSDB9r/4tcfB9iC+yrTCICUlJWPAzCiwoSkgwNa9wLTPtNkiCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3Njogx/y9xCC5rsDav60gvK21zr+hIMDfuPi1yCAlJSVjwMwosKEpIMDWvcC0z7TZIgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Nzogx/y9xCC5rsDav62/oSDA37j4tcggJSUlY8DMKLChKSDA1r3AtM+02SIKKworIzogcXVpY2tmaXguYzozOTEKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCfAzCC+7rayIMbQxc+1tSDG98fUx8+w7SDA1sH2IL7KvcC0z7TZIgorCisjOiBxdWlja2ZpeC5jOjUwMQorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6ILr8wbOwxbOqILrzIMDat+G55iDAzLinIgorCisjOiBxdWlja2ZpeC5jOjk5MAorbXNnaWQgIkU1NTM6IE5vIG1vcmUgaXRlbXMiCittc2dzdHIgIkU1NTM6ILT1IMDMu/PAxyDH17jxwMwgvvi9wLTPtNkiCisKKyM6IHF1aWNrZml4LmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQgb2YgJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjEyMzEKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAowdnAuyDB9r/8wL0pIgorCisjOiBxdWlja2ZpeC5jOjE0NDQKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IMT8x8i9uiC9usXDwMcgudm02sDUtM+02SIKKworIzogcXVpY2tmaXguYzoxNDUzCittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiDE/MfIvbogvbrFw8DHILLAtOux4sDUtM+02SIKKworIzogcXVpY2tmaXguYzoxNDY1CisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorCisjOiBxdWlja2ZpeC5jOjE5NDMKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiC+tSC89iC++MC9LCAnYnVmdHlwZScgv8m8x8DMILyzwaS1x77uIMDWvcC0z7TZIgorCisjOiByZWdleHAuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2OTogaW52YWxpZCBpdGVtIGluICVzJSVbXSIKK21zZ3N0ciAiRTM2OTogJXMlJVtdv6EgwN+4+LXIIMfXuPEiCisKKyM6IHJlZ2V4cC5jOjgzOAorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IMbQxc/AzCCzyrmrILHptM+02SIKKworIzogcmVnZXhwLmM6MTAwOQorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiBcXHoosKEgs8q5qyC4ub3AtM+02SIKKworIzogcmVnZXhwLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiAlcyiwoSCzyrmrILi5vcC0z7TZIgorCisjOiByZWdleHAuYzoxMDc3Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiC4wsH2IL7KtMIgXFx6KCIKKworIzogcmVnZXhwLmM6MTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiC4wsH2IL7KtMIgJXMlJSgiCisKKyM6IHJlZ2V4cC5jOjEwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6ILjCwfYgvsq0wiAlcygiCisKKyM6IHJlZ2V4cC5jOjEwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6ILjCwfYgvsq0wiAlcykiCisKKyM6IHJlZ2V4cC5jOjEyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiAlcyogv6y76rz2tMIguvQgvPYgwNa9wLTPtNkiCisKKyM6IHJlZ2V4cC5jOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU3OiAlcysgv6y76rz2tMIguvQgvPYgwNa9wLTPtNkiCisKKyM6IHJlZ2V4cC5jOjEzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTogJXNAILXav6EgwN+4+LXIILmuwNoiCisKKyM6IHJlZ2V4cC5jOjEzNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU4OiAlc3sgv6y76rz2tMIguvQgvPYgwNa9wLTPtNkiCisKKyM6IHJlZ2V4cC5jOjEzNTQKKyMsIGMtZm9ybWF0CisjfiBtc2dpZCAiRTYwOiBUb28gbWFueSBjb21wbGV4ICVzey4uLn1zIgorI34gbXNnc3RyICIiCisKKyM6IHJlZ2V4cC5jOjEzNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IE5lc3RlZCAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiBOZXN0ZWQgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ5MQorbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IFxcX7imIMDfILj4ILvnv+siCisKKyM6IHJlZ2V4cC5jOjE1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjILXav6Egvsa5q7DNtbUgvvi9wLTPtNkiCisKKyM6IHJlZ2V4cC5jOjE1OTIKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogwMy788fRIMjEwKcgwvzBtiIKKworIzogcmVnZXhwLmM6MTYwNQorbXNnaWQgIkU2NjogXFx6KCBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjY6IFxceii0wiC/qbHiv6G8rSDH47/rtcfB9iC+yr3AtM+02SIKKworIzogcmVnZXhwLmM6MTYyNAorbXNnaWQgIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY3OiBcXHoxILXuwLogv6mx4r+hvK0gx+O/67XHwfYgvsq9wLTPtNkiCisKKyM6IHJlZ2V4cC5jOjE2MzUKK21zZ2lkICJFNjg6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxceiIKK21zZ3N0ciAiRTY4OiBcXHogtdq/oSDAzLvzx9Egua7A2iIKKworIzogcmVnZXhwLmM6MTY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiAlcyUlWyC12r+hIF2woSC++L3AtM+02SIKKworIzogcmVnZXhwLmM6MTcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNzA6IEVtcHR5ICVzJSVbXSIKK21zZ3N0ciAiRTcwOiC68yAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjE3NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6ICVzJSUgtdq/oSDAzLvzx9Egua7A2iIKKworIzogcmVnZXhwLmM6MjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJFNTU0OiBTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAiRTU1NDogJXN7Li4ufb+hILG4ua4gv6G3ryIKKworIzogcmVnZXhwLmM6Mjg2MyByZWdleHAuYzozMDE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IMHXwL0gsKG3zsOoOyDBpLHUx6XH9r3EwMwgs8q5qyC6ucDix9Gwob/kPyIKKworIzogcmVnZXhwLmM6MzAwNCByZWdleHAuYzozMDEzCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiDG0MXPv6EgwMfH2CC9usXDs9HEpyC/obevsKEgu/2w5b3AtM+02SIKKworIzogcmVnZXhwLmM6MzI1OAorI34gbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCisjfiBtc2dzdHIgIiIKKworIzogc2NyZWVuLmM6MjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgwdkgwaLI+yAiCisKKyM6IHNjcmVlbi5jOjc5OTYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiC8scXDxKHIryIKKworIzogc2NyZWVuLmM6ODAwMAorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgudmy2bHiIgorCisjOiBzY3JlZW4uYzo4MDA1Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiC53bTrIgorCisjOiBzY3JlZW4uYzo4MDA3Cittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiILOiv/az1rHiIgorCisjOiBzY3JlZW4uYzo4MDEwCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKLOiv/az1rHiKSIKKworIzogc2NyZWVuLmM6ODAxMgorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAoudmy2bHiKSIKKworIzogc2NyZWVuLmM6ODAxNAorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKLyxxcPEocivKSIKKworIzogc2NyZWVuLmM6ODAxNworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiDH7Lrqt+ciCisKKyM6IHNjcmVlbi5jOjgwMjgKKyN+IG1zZ2lkICIgQXJhYmljIgorI34gbXNnc3RyICIiCisKKyM6IHNjcmVlbi5jOjgwMzEKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKL7wvu4pIgorCisjOiBzY3JlZW4uYzo4MDM1Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAoutnAzLHiKSIKKworIzogc2NyZWVuLmM6ODA0OAorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiC68cHWvvMiCisKKyM6IHNjcmVlbi5jOjgwNDkKK21zZ2lkICIgVklTVUFMIExJTkUiCittc2dzdHIgIiC68cHWvvMgtvPAziIKKworIzogc2NyZWVuLmM6ODA1MAorbXNnaWQgIiBWSVNVQUwgQkxPQ0siCittc2dzdHIgIiC68cHWvvMguu23zyIKKworIzogc2NyZWVuLmM6ODA1MQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiCw7bijseIiCisKKyM6IHNjcmVlbi5jOjgwNTIKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiC288DOILDtuKOx4iIKKworIzogc2NyZWVuLmM6ODA1MworbXNnaWQgIiBTRUxFQ1QgQkxPQ0siCittc2dzdHIgIiC67bfPILDtuKOx4iIKKworIzogc2NyZWVuLmM6ODA2OCBzY3JlZW4uYzo4MTMxCittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICKx4rfPwd8iCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICLDs8C9se7B9iDDo77SwL0sILOhv6G8rSCw6LzTIgorCisjOiBzZWFyY2guYzozOAorbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAis6Gx7sH2IMOjvtLAvSwgw7PAvbrOxc0gsOi80yIKKworIzogc2VhcmNoLmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IMDfuPi1yCDDo7HiILmuwNq/rTogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IMOzwL2x7sH2ILjCtMIgua7A2r+twMwgvvi9wLTPtNk6ICVzIgorCisjOiBzZWFyY2guYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiCzobHuwfYguMK0wiC5rsDav63AzCC++L3AtM+02TogJXMiCisKKyM6IHNlYXJjaC5jOjEyNDkKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6ICc7JyC12r+htMIgJz8ns6ogJy8nsKEgv82+3yDH1bTPtNkiCisKKyM6IHNlYXJjaC5jOjM3NTkKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICjAzMD8v6EguMK+0rT4ILjxt88gxvfH1CkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6Mzc3OQorbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCisKKyM6IHNlYXJjaC5jOjM3ODEKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICJub3QgZm91bmQgIgorCisjOiBzZWFyY2guYzozNzgyCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiaW4gcGF0aCAtLS1cbiIKKworIzogc2VhcmNoLmM6MzgzOQorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAoQWxyZWFkeSBsaXN0ZWQpIgorCisjOiBzZWFyY2guYzozODQxCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAguPggw6O+0sC9IgorCisjOiBzZWFyY2guYzozODkzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICLG98fUtcggxsTAzyDDo7TCIMHfOiAlcyIKKworIzogc2VhcmNoLmM6NDExMQorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzoguMK0wiCw1CDH9sDnIMHZv6EgwNa9wLTPtNkiCisKKyM6IHNlYXJjaC5jOjQyNTQKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiuPC15yDG98fUtcggxsTAz8C7IMOjvtK9wLTPtNkiCisKKyM6IHNlYXJjaC5jOjQyNTYKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAixvfH1LXIIMbEwM/AzCC++L3AtM+02SIKKworIzogc2VhcmNoLmM6NDI3MgorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogwaTAx7imIMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IHNlYXJjaC5jOjQyNzQKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IMbQxc/AuyDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBzeW50YXguYzozMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiDA37j4tcggwM7A2jogJXMiCisKKyM6IHN5bnRheC5jOjMyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IMDMt7Egsbi5riDFrLevvbrFzbTCIL74vcC0z7TZOiAlcyIKKworIzogc3ludGF4LmM6MzM5NAorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiwMwgufbG27+hILTrx9ggwaTAx7XIILG4ua4gx9e48cDMIL74vcC0z7TZIgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJDLcf8vcQgwda8rrmuv6Egtb+x4rjCw+MiCisKKyM6IHN5bnRheC5jOjM0MTAKKyN+IG1zZ2lkICJubyBzeW5jaW5nIgorI34gbXNnc3RyICIiCisKKyM6IHN5bnRheC5jOjM0MTMKKyN+IG1zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCisjfiBtc2dzdHIgIiIKKworIzogc3ludGF4LmM6MzQxNSBzeW50YXguYzozNDkwCisjfiBtc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKKyN+IG1zZ3N0ciAiIgorCisjOiBzeW50YXguYzozNDIwCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU3ludGF4ILW/seIgx9e48bXpIC0tLSIKKworIzogc3ludGF4LmM6MzQyNQorI34gbXNnaWQgIiIKKyN+ICJcbiIKKyN+ICJzeW5jaW5nIG9uIGl0ZW1zIgorI34gbXNnc3RyICIiCisKKyM6IHN5bnRheC5jOjM0MzEKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU3ludGF4IMfXuPEgLS0tIgorCisjOiBzeW50YXguYzozNDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDAzLexILG4ua4gxay3r726xc20wiC++L3AtM+02TogJXMiCisKKyM6IHN5bnRheC5jOjM0ODAKKyN+IG1zZ2lkICJtaW5pbWFsICIKKyN+IG1zZ3N0ciAiIgorCisjOiBzeW50YXguYzozNDg3CisjfiBtc2dpZCAibWF4aW1hbCAiCisjfiBtc2dzdHIgIiIKKworIzogc3ludGF4LmM6MzQ5OQorI34gbXNnaWQgIjsgbWF0Y2ggIgorI34gbXNnc3RyICIiCisKKyM6IHN5bnRheC5jOjM1MDEKKyN+IG1zZ2lkICIgbGluZSBicmVha3MiCisjfiBtc2dzdHIgIiIKKworIzogc3ludGF4LmM6NDEzNQorbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogZ3JvdXBbdF1oZXJltMIgv6mx4r+hvK0gu+e/67XJILz2IL74vcC0z7TZIgorCisjOiBzeW50YXguYzo0MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTQ6IERpZG4ndCBmaW5kIHJlZ2lvbiBpdGVtIGZvciAlcyIKK21zZ3N0ciAiRTM5NDogJXO/oSC068fRIHJlZ2lvbiDH17jxwLsgw6PB9iC4+MffvcC0z7TZIgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IGNvbnRhaW5zIMDOwNq0wiC/qbHiv6EgvrUgvPYgvvi9wLTPtNkiCisKKyM6IHN5bnRheC5jOjQxOTgKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogY29udGFpbmVkaW4gwM7A2rTCIL+pseK/oSC+tSC89iC++L3AtM+02SIKKworIzogc3ludGF4LmM6NDI3NgorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiDGxMDPwMy4p8DMIMfKv+TH1bTPtNkiCisKKyM6IHN5bnRheC5jOjQ2MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiAnPSfAzCC++L3AtM+02TogJXMiCisKKyM6IHN5bnRheC5jOjQ3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5OTogTm90IGVub3VnaCBhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCittc2dzdHIgIkUzOTk6IMPmutDEoSC+ysC6IMDOwNo6ILG4ua4gv7W/qiAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiDFrLevvbrFzbChILjtvcO1x8H2IL7KvtK9wLTPtNkiCisKKyM6IHN5bnRheC5jOjUxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogxtDFzyCxuLrQwNq4piDDo8C7ILz2IL74vcC0z7TZOiAlcyIKKworIzogc3ludGF4LmM6NTIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiDG0MXPILXav6EgvrK3ubHiOiAlcyIKKworIzogc3ludGF4LmM6NTMwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bnRheCBzeW5jOiDB2SC/rLzTIMbQxc/AzCC1ziC5+CC757/rtce++r3AtM+02SIKKworIzogc3ludGF4LmM6NTM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6ILrxwaS788D7wM4gwM7A2jogJXMiCisKKyM6IHN5bnRheC5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogwMzE9yCx4sijsKEguvzBs8C9OiAlcyIKKworIzogc3ludGF4LmM6NTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6ILrzIMDOwNo6ICVzIgorCisjOiBzeW50YXguYzo1NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzwLootMIpIL+pseK/obytIMfjv+u1x8H2IL7KvcC0z7TZIgorCisjOiBzeW50YXguYzo1NDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXPAuii0wikgY29udGFpbnMguPG3z8DHIMO5ILn4wrC/qb7fIMfVtM+02SIKKworIzogc3ludGF4LmM6NTUyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFNDA5OiC48LijtMIgsde37CDAzLinOiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IMDfuPi1yCA6c3ludGF4IMfPwKcguO23yTogJXMiCisKKyM6IHN5bnRheC5jOjYxMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IMfPwMy288DMxq4gsde37MC7IMOjwLsgvPYgvvi9wLTPtNk6ICVzIgorCisjOiBzeW50YXguYzo2MTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiDD5rrQxKEgvsrAuiDAzsDaOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogs8q5qyC4ucC6IMDOwNo6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxODcKKyN+IG1zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCisjfiBtc2dzdHIgIiIKKworIzogc3ludGF4LmM6NjMxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiC25rnbwMcgwMzE9yCx4sijOiAlcyIKKworIzogc3ludGF4LmM6NjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiDAzMT3ILHiyKOwoSC6/MGzwL06ICVzIgorCisjOiBzeW50YXguYzo2MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiDAzsDasKEguvzBs8C9OiAlcyIKKworIzogc3ludGF4LmM6NjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODoguvHBpLvzwPvAziCwqjogJXMiCisKKyM6IHN5bnRheC5jOjY1MzYKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiC48LijtMIgRkcgu/a78yIKKworIzogc3ludGF4LmM6NjU0NworbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6ILjwuKO0wiBCRyC79rvzIgorCisjOiBzeW50YXguYzo2NjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogu/YgwMy4p8DMs6ogvP3A2rimIMDOvcTH0iC89iC++MC9OiAlcyIKKworIzogc3ludGF4LmM6NjgxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogxc25zLPOIMTateWwoSCzyrmrILHoOiAlcyIKKworIzogc3ludGF4LmM6Njg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogwN+4+LXIIMDOwNo6ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDogs8q5qyC4ucC6ILTZuKUgx8/AzLbzwMzGriC807y6wMwgu+e/67XHsO0gwNa9wLTPtNkiCisKKyM6IHN5bnRheC5jOjc5MTEKK21zZ2lkICJFNjY5OiBVbnByaW50YWJsZSBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiRTY2OTogsde37CDAzLinv6Egw+K3wsfSILz2IL74tMIgua7A2rChIMDWvcC0z7TZIgorCisjLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorIy4gKiBnaXZlIGEgd2FybmluZy4KKyM6IHN5bnRheC5jOjc5MTgKK21zZ2lkICJXMTg6IEludmFsaWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIlcxODogsde37CDAzLinv6EgwMy788fRILmuwNoiCisKKyM6IHRhZy5jOjkwCittc2dpZCAiRTU1NTogYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NTogxcKx1yC9usXDwMcgs6HA1LTPtNkiCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogxcKx1yC9usXDwMcgw7PAvcDUtM+02SIKKworIzogdGFnLmM6NDEyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IMO5ILn4wrAguMK0wiDFwrHXIMDMwPzAuLfOtMIgsKUgvPYgvvi9wLTPtNkiCisKKyM6IHRhZy5jOjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogxcKx17imIMOjwLsgvPYgvvjAvTogJXMiCisKKyM6IHRhZy5jOjU4MworbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmkga2luZCB0YWciCisKKyM6IHRhZy5jOjU4NgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAixsTAz1xuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzQ0Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICKw7bimILz9wNogwNS3wiAoPENSPsC6IMHfwfYpOiIKKworIzogdGFnLmM6Nzg0Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiC4wrTCIMXCsdewoSDHz7OqILnbv6Egvvi9wLTPtNkiCisKKyM6IHRhZy5jOjc4NgorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6ILi2wfa4tyC4wrTCIMXCsdcgtdq3zrTCILClILz2IL74vcC0z7TZIgorCisjOiB0YWcuYzo4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIsbEwM8gXCIlc1wiwMwosKEpIMG4wOfHz8H2IL7KvcC0z7TZIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgInRhZyAlZCBvZiAlZCVzIgorCisjOiB0YWcuYzo4MjYKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIG9yIG1vcmUiCisKKyM6IHRhZy5jOjgyOAorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKKworIzogdGFnLmM6ODcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiDGxMDPIFwiJXNcIsDMKLChKSDBuMDnx8/B9iC+yr3AtM+02SIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorCisjOiB0YWcuYzoxMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIsXCsdcgxsTAzyAlcyDDo7TCIMHfIgorCisjOiB0YWcuYzoxNTUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiAlc7+hILTrx9EgxcKx1yDGxMDPILDmt86woSDA37fIvcC0z7TZXG4iCisKKyM6IHRhZy5jOjIyMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IMXCsdcgxsTAzyBcIiVzXCK/oSDH/L3EIL+ht6+woSDA1r3AtM+02SIKKworIzogdGFnLmM6MjIwNworIywgYy1mb3JtYXQKKyN+IG1zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCisjfiBtc2dzdHIgIiIKKworIzogdGFnLmM6MjI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IMXCsdcgxsTAz8DMIMGkt8S1x77uIMDWwfYgvsrAvTogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoyMjgwCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiDFwrHXIMbEwM/AzCC++L3AtM+02SIKKworIzogdGFnLmM6MzAxNgorbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IMXCsdcgxtDFz8C7IMOjwLsgvPYgvvi9wLTPtNkiCisKKyM6IHRhZy5jOjMwMjcKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IMXCsde4piDDo8C7ILz2IL74wfa4uCDAzLDFILCwvcC0z7TZISIKKworIzogdGVybS5jOjE3NTkKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKKworIzogdGVybS5jOjE3ODMKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgImRlZmF1bHRpbmcgdG8gJyIKKworIzogdGVybS5jOjIxNDEKK21zZ2lkICJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkU1NTc6IHRlcm1jYXAgxsTAz8C7IL+tILz2IL74vcC0z7TZIgorCisjOiB0ZXJtLmM6MjE0NQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogxc25zLPOIMfXuPHAuyB0ZXJtaW5mb7+hvK0gw6PAuyC89iC++L3AtM+02SIKKworIzogdGVybS5jOjIxNDcKK21zZ2lkICJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTU1OTogxc25zLPOIMfXuPHAuyB0ZXJtY2Fwv6G8rSDDo8C7ILz2IL74vcC0z7TZIgorCisjOiB0ZXJtLmM6MjMwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogdGVybWNhcL+hIFwiJXNcIiDH17jxwMwgvvi9wLTPtNkiCisKKyM6IHRlcm0uYzoyNzgwCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IMXNucyzzsDMIFwiY21cIiCx4rTJwLsgwfa/+MfYvt8gx9W0z7TZIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTkwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDFzbnMs84gxbAgLS0tIgorCisjOiB1aS5jOjI1OAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgIrv1IL2pwMwgvcPA27XHvvq9wLTPtNlcbiIKKworIzogdWkuYzoxODQxCittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIrr2OiDA1LfCIMDQtMIgwd8gv6G3rywgs6Gzu7TCwd8uLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzo0MDUKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIsPrvNIgutKwobTJOyC+7sK3tecgsOi808fVtM+02SIKKworIzogdW5kby5jOjU2MQorbXNnaWQgIkU0Mzg6IHVfdW5kbzogbGluZSBudW1iZXJzIHdyb25nIgorbXNnc3RyICJFNDM4OiB1X3VuZG86IMDfuPi1yCDB2SC5+MijIgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIsfPs6ogudmy2b76vcC0z7TZIgorCisjOiB1bmRvLmM6NzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGSws7imILnZstm++r3AtM+02SIKKworIzogdW5kby5jOjgxMgorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiB1bmRvILjxt8/AzCCx+sGzvcC0z7TZIgorCisjOiB1bmRvLmM6ODQ0Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IHVuZG8gwdnAzCC++L3AtM+02SIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjcwNworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIguvHGriBHVUkgxsciCisKKyM6IHZlcnNpb24uYzo3MDkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyILrxxq4gR1VJIMbHIgorCisjOiB2ZXJzaW9uLmM6NzEyCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgV2luMzJzILvzxcIiCisKKyM6IHZlcnNpb24uYzo3MTQKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIE9MRSDB9r/4IgorCisjOiB2ZXJzaW9uLmM6NzE3Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIguvHGriDE3LzWIMbHIgorCisjOiB2ZXJzaW9uLmM6NzIxCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2ILrxxq4gxsciCisKKyM6IHZlcnNpb24uYzo3MjUKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIguvHGriBNUy1ET1MgxsciCisKKyM6IHZlcnNpb24uYzo3MjcKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYguvHGriBNUy1ET1MgxsciCisKKyM6IHZlcnNpb24uYzo3MzMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKMCvtNC9uikgxsciCisKKyM6IHZlcnNpb24uYzo3MzUKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCDGxyIKKworIzogdmVyc2lvbi5jOjczOAorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgxsciCisKKyM6IHZlcnNpb24uYzo3NDMKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUyDGxyIKKworIzogdmVyc2lvbi5jOjc1MworbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyLG98fUtcggxtDEoTogIgorCisjOiB2ZXJzaW9uLmM6Nzc5IHZlcnNpb24uYzoxMTQ3CisjfiBtc2dpZCAiTW9kaWZpZWQgYnkgIgorI34gbXNnc3RyICIiCisKKyM6IHZlcnNpb24uYzo3ODYKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiQ29tcGlsZWQgIgorCisjOiB2ZXJzaW9uLmM6Nzg5Cittc2dpZCAiYnkgIgorbXNnc3RyICJieSAiCisKKyM6IHZlcnNpb24uYzo4MDEKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIrDFtOvH0SDGxyAiCisKKyM6IHZlcnNpb24uYzo4MDQKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisixasgxscgIgorCisjOiB2ZXJzaW9uLmM6ODA3Cittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIrq4xesgxscgIgorCisjOiB2ZXJzaW9uLmM6ODEwCittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiwNvAuiDGxyAiCisKKyM6IHZlcnNpb24uYzo4MTIKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIr7GwdYgwNvAuiDGxyAiCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgIkdVSSC++MC9LiIKKworIzogdmVyc2lvbi5jOjgyMworbXNnaWQgIndpdGggR1RLMi1HTk9NRSBHVUkuIgorbXNnc3RyICJHVEsyLUdOT01FIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MjUKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJHVEstR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIndpdGggR1RLMiBHVUkuIgorbXNnc3RyICJHVEsyIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MzEKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICJHVEsgR1VJLiIKKworIzogdmVyc2lvbi5jOjgzNgorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgIlgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODQwCittc2dpZCAid2l0aCBYMTEtbmVYdGF3IEdVSS4iCittc2dzdHIgIlgxMS1uZVh0YXcgR1VJLiIKKworIzogdmVyc2lvbi5jOjg0MgorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICJYMTEtQXRoZW5hIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NDYKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAiQmVPUyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAixvfF5iBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODUyCittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICJHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAiQ2FyYm9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NTgKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIkNvY29hIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NjEKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICIoxay3ob3EKSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODcyCittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICCx4rTJICgrOiDG98fUtcosIC06IMb3x9QgvsggtcopOlxuIgorCisjOiB2ZXJzaW9uLmM6ODg0Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIL3DvbrF2yB2aW1yYyDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjg4OQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICC757/rwNogdmltcmMgxsTAzzogXCIiCisKKyM6IHZlcnNpb24uYzo4OTQKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiC757/rwNogtc4gufjCsCB2aW1yYyDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjg5OQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiILvnv+vA2iC8vCC5+MKwIHZpbXJjIMbEwM86IFwiIgorCisjOiB2ZXJzaW9uLmM6OTA0Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICC757/rwNogZXhyYyDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjkwOQorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICC757/rwNogtc4gufjCsCBleHJjIMbEwM86IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE1Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgvcO9usXbIGd2aW1yYyDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjkxOQorbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgILvnv+vA2iBndmltcmMgxsTAzzogXCIiCisKKyM6IHZlcnNpb24uYzo5MjMKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIrvnv+vA2iC1ziC5+MKwIGd2aW1yYyDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjkyOAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiu+e/68DaILy8ILn4wrAgZ3ZpbXJjIMbEwM86IFwiIgorCisjOiB2ZXJzaW9uLmM6OTM1Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgvcO9usXbIML3uLLHpSDGxMDPOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzo5NTMKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICLExMbEwM86ICIKKworIzogdmVyc2lvbi5jOjk1OQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIsTExsTAz7evOiAiCisKKyM6IHZlcnNpb24uYzo5NjQKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIri1xak6ICIKKworIzogdmVyc2lvbi5jOjk2OQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgtfC59rHXILr0teUiCisKKyM6IHZlcnNpb24uYzoxMDA4Cittc2dpZCAiVklNIC0gVmkgSU1wcm92ZWQiCittc2dzdHIgIrr2IC0gx+K787XIIFZpIgorCisjOiB2ZXJzaW9uLmM6MTAxMAorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICLGxyAiCisKKyM6IHZlcnNpb24uYzoxMDExCittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyM6IHZlcnNpb24uYzoxMDE1Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiuvbAuiC80r26sKEgv623wSDA1rDtILD4wqW3ziC56Mb3tcu0z7TZIgorCisjOiB2ZXJzaW9uLmM6MTAxNworbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICK/7LCjtNm/oSC757TCILChs63H0SC+xsDMuKYgtbW/zcHWvLy/5CEiCisKKyM6IHZlcnNpb24uYzoxMDE4Cittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAiwMy/oSC068fRIMGkuri4piC6uLfBuOkgICAgOmhlbHAgaWNjZjy/o8XNPiAgICAgICDA1LfCIgorCisjOiB2ZXJzaW9uLmM6MTAyMAorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgIrOhs7u3wbjpICAgICAgICAgICAgICAgICAgIDpxPL+jxc0+ICAgICAgICAgICAgICAgwNS3wiIKKworIzogdmVyc2lvbi5jOjEwMjEKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICK/wrbzwM4gtbW/8ri7wLsguri3wbjpICAgICA6aGVscDy/o8XNPiC2x7TCIDxGMT4gIMDUt8IiCisKKyM6IHZlcnNpb24uYzoxMDIyCittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAixscgwaS6uLimILq4t8G46SAgICAgICAgICAgOmhlbHAgdmVyc2lvbjY8v6PFzT4gICDA1LfCIgorCisjOiB2ZXJzaW9uLmM6MTAyNQorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJWaSDIo8ivILvzxcK3ziC9x8fgwd/A1LTPtNkiCisKKyM6IHZlcnNpb24uYzoxMDI2Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAiuvYgseK6u7CqwLsgu+e/68fPt8G46SAgICAgOnNldCBub2NwPL+jxc0+ICAgICAgICDA1LfCIgorCisjOiB2ZXJzaW9uLmM6MTAyNworbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIsDMv6EgtOvH0SDBpLq4uKYguri3wbjpICAgIDpoZWxwIGNwLWRlZmF1bHQ8v6PFzT4gwNS3wiIKKworIzogdmVyc2lvbi5jOjEwNDIKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICLAzL+hILTrx9EgwaS6uLimILq4t8G46SAgICC43rS6v6G8rSC1tb/yuLstPrDtvsYgILyxxcMiCisKKyM6IHZlcnNpb24uYzoxMDQ0Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiuPC15b74wMwgvPbH4MHfwMy45ywgwNS3wrXIILmuwNq0wiC78MDUtcu0z7TZIgorCisjOiB2ZXJzaW9uLmM6MTA0NQorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIrjetLq/obytIMbtwf0tPsD8v6ogvLPBpC0+u/DA1CC48LXlIMXksdvAuyC8scXDx8+9w7jpICIKKworIzogdmVyc2lvbi5jOjEwNDYKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgtc4guPC15bimILvnv+vH0iC89iDA1r3AtM+02SAiCisKKyM6IHZlcnNpb24uYzoxMDUwCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAiuN60ur+hvK0gxu3B/S0+wPy/qiC8s8GkLT5WaSDIo8ivIMXksdvAuyC8scXDx8+9w7jpICAgIgorCisjOiB2ZXJzaW9uLmM6MTA1MQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgVmltwMwgseK6u7CqwLi3ziC1v8Dbx9W0z7TZICIKKworIzogdmVyc2lvbi5jOjEwOTgKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIrr2ILCzud/AuyDIxL/4x9ggwda8vL/kISIKKworIzogdmVyc2lvbi5jOjEwOTkKK21zZ2lkICJCZWNvbWUgYSByZWdpc3RlcmVkIFZpbSB1c2VyISIKK21zZ3N0ciAiuvYgu+e/68Dat84gte63z8fPvLy/5CEiCisKKyM6IHZlcnNpb24uYzoxMTAyCittc2dpZCAidHlwZSAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAiwMy/oSC068fRIMGkuri4piC6uLfBuOkgICAgOmhlbHAgc3BvbnNvcjy/o8XNPiAgICDA1LfCIgorCisjOiB2ZXJzaW9uLmM6MTEwMworbXNnaWQgInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIsDMv6EgtOvH0SDBpLq4uKYguri3wbjpICAgIDpoZWxwIHJlZ2lzdGVyPL+jxc0+ICAgwNS3wiIKKworIzogdmVyc2lvbi5jOjExMDUKK21zZ2lkICJtZW51ICBIZWxwLT5TcG9uc29yL1JlZ2lzdGVyICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICLAzL+hILTrx9EgwaS6uLimILq4t8G46SAgICC43rS6ILW1v/K4uy0+U3BvbnNvci9SZWdpc3RlciIKKworIzogdmVyc2lvbi5jOjExMTUKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICKw5rDtOiDAqbW1v+zB7iA5NS85OC9NRbimIMOjvtLAvSIKKworIzogdmVyc2lvbi5jOjExMTgKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICLAzL+hILTrx9EgwaS6uLimILq4t8G46SAgICA6aGVscCB3aW5kb3dzOTU8v6PFzT4gIMDUt8IiCisKKyM6IHdpbmRvdy5jOjIwMworbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiC5zLiuILq4seIgw6LAzCC++L3AtM+02SIKKworIzogd2luZG93LmM6NTgxCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogwKcgv97CyrD6IL7Gt6Egv8C4pcLKwLsgtb+9w7+hILOqtK0gvPYgvvi9wLTPtNkiCisKKyM6IHdpbmRvdy5jOjEzNDAKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6ILTZuKUgw6LAzCCzqrSywbPAuyC2p7+htMIgyLjA/MfSILz2IL74vcC0z7TZIgorCisjOiB3aW5kb3cuYzoxODM2Cittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiC4tsH2uLcgw6LAuyC03cC7ILz2IL74vcC0z7TZIgorCisjOiB3aW5kb3cuYzoyNTY3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIsDMucwgx8+zqsDHIMOiuLggwNa9wLTPtNkiCisKKyM6IHdpbmRvdy5jOjI2MTQKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogtNm4pSDDosDMILnZsu6++r3AtM+02SIKKworIzogd2luZG93LmM6NDQ4MAorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IMS/vK0gudi/oSDGxMDPIMDMuKfAzCC++L3AtM+02SIKKworIzogd2luZG93LmM6NDU5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IHBhdGi/obytIFwiJXNcIiDGxMDPwLsgw6PAuyC89iC++L3AtM+02SIKKworIzogaWZfcGVybC54czozMjYgZ2xvYmFscy5oOjEyNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MDogQ291bGQgbm90IGxvYWQgbGlicmFyeSAlcyIKK21zZ3N0ciAiRTM3MDogJXMgtvPAzLrqt6+4rrimILfOteXH0iC89iC++L3AtM+02SIKKworIzogaWZfcGVybC54czo1NTQKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgUGVybCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICK5zL7Ix9W0z7TZLCDAzCC47bfJwLogu+e/68fSILz2IL74vcC0z7TZLCBQZXJsILbzwMy66revuK64piC3zrX5x9IgvPYgvvgiCisivcC0z7TZLiIKKworIzogaWZfcGVybC54czo2MDcKKyN+IG1zZ2lkICJFMjk5OiBQZXJsIGV2YWx1YXRpb24gZm9yYmlkZGVuIGluIHNhbmRib3ggd2l0aG91dCB0aGUgU2FmZSBtb2R1bGUiCisjfiBtc2dzdHIgIiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODMKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIr+pt68guvbAuLfOIMbtwf0oJk0pIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAix8+zqsDHILr2wLi3zri4IMbtwf0oJlYpIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICK69sC4t84gRGlmZigmRCkiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjExCittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIrr2wLi3ziDG7cH9KCZWKSIKKworIy4gTm93IGNvbmNhdGVuYXRlCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYzMworI34gbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorI34gbXNnc3RyICIiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NzQ2Cittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIryxxcO1yCDGxMDPKLXpKcC7ILr2wLi3ziDG7cH9IgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NSBHdmltRXh0L2d2aW1leHQuY3BwOjk2NgorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAix8G3zry8vbogu/28uiC/obevOiBndmltwMwgcGF0aL+hIMDWtMIgwfYgyK7AzsfPvLy/5CEiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODg2IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTAwIEd2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY3Cittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImd2aW1leHQuZGxsIL+ht68iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODk5Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICKw5rfOsKEgs8q5qyCx6bTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMDMxCittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS259sbbv6EgwdkgvvjAvS0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjExOTQKK21zZ2lkICJFNDcwOiBDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIkU0NzA6ILjtt8nAzCDB38H2tce++r3AtM+02SIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFNDcxOiBBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAiRTQ3MTogwM7A2rChIMfKv+TH1bTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMTk2Cittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IC8sID8gyKTAuiAmtMIgXFwgtdq/oSC/zb7fIMfVtM+02SIKKworIzogZ2xvYmFscy5oOjExOTgKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6ILjtt8nB2SDDor+hIMDfuPi1yjsgPENSPiC9x8fgLCBDVFJMLUMgs6Gzu7HiIgorCisjOiBnbG9iYWxzLmg6MTIwMAorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiIgorIkUxMjogx/bA5yDA2rfhueYgtsfAuiDFwrHXIMOjseK/obytIGV4cmMvdmltcmO/obytwMcguO23ycC6IMfjv+sgvsggtcu0z7TZIgorCisjOiBnbG9iYWxzLmg6MTIwMgorbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiA6ZW5kaWawoSC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyMDMKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IDplbmR0cnmwoSC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyMDQKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogOmVuZHdoaWxlwMwgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjA1Cittc2dpZCAiRTU4ODogOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg4OiA6d2hpbGW++MDMIDplbmR3aGlsZcDMIMDWvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTIwNworbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiDGxMDPwMwgwNa9wLTPtNkgKLWkvu6+srfBuOkgISC757/rKSIKKworIzogZ2xvYmFscy5oOjEyMDgKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjoguO23ycDMIL3HxtDH373AtM+02SIKKworIzogZ2xvYmFscy5oOjEyMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDoguPC4o7TCILHbssO8wjogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6ILjwuKO0wiCx27LDOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiCx27LDIFwiJXNcIsC6KLTCKSCw7cGks9DAzLChIL7GtNW0z7TZIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiCzu7rOIL+ht68iCisKKyM6IGdsb2JhbHMuaDoxMjIwCittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIsHftNy1x776vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTIyMQorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IMDfuPi1yCDB1rzSIgorCisjOiBnbG9iYWxzLmg6MTIyMgorbXNnaWQgIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkU0NzQ6IMDfuPi1yCDAzsDaIgorCisjOiBnbG9iYWxzLmg6MTIyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQ3NTogwN+4+LXIIMDOwNo6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTogwN+4+LXIIMelx/a9xDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjI3Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IMDfuPi1yCC5/MCnIgorCisjOiBnbG9iYWxzLmg6MTIyOAorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogwN+4+LXIILjtt8kiCisKKyM6IGdsb2JhbHMuaDoxMjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIsC6KLTCKSDA2rfhuebA1LTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjMzCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiAnPScgwPy/oSC7/bCiwfYguPjH0SCx28DaIgorCisjOiBnbG9iYWxzLmg6MTIzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogtvPAzLrqt6+4riBcIiVzKClcIiC6zrijseIgvcfG0CIKKworIzogZ2xvYmFscy5oOjEyNDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogJXMgtvPAzLrqt6+4riDH1Lz2uKYgt8615cfSILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI0NAorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiC4tsWpsKEgwN+4+LXIIMHZILn4yKO4piCwocH2sO0gwNa9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjQ1Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDoguLbFqbChILyzwaS1x77uIMDWwfYgvsq9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjQ2Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6ILnZstwgvPYgvvjAvSwgJ21vZGlmaWFibGUnwMwgsqjBrsDWvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI0NworbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogvbrFqbizxq6woSCzyrmrILHtsNQgwd/DuLXHvvq9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjQ4Cittc2dpZCAiRTIzOiBObyBhbHRlcm5hdGUgZmlsZSIKK21zZ3N0ciAiRTIzOiC02bilIMbEwM/AzCC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyNDkKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6ILHXt7EgvuC+7rTCIL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI1MAorbXNnaWQgIkU0Nzc6IE5vICEgYWxsb3dlZCIKK21zZ3N0ciAiRTQ3NzogIcC6IMfjv+u1x8H2IL7KvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI1MgorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogR1VJtMIgu+e/68fSILz2IL74vcC0z7TZOiDExMbEwM8gtqcgxvfH1LXHwfYgvsq+0r3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyNTUKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjogSGVicmV3tMIgu+e/68fSILz2IL74vcC0z7TZOiDExMbEwM8gtqcgxvfH1LXHwfYgvsq+0r3AtM+02VxuIgorCisjOiBnbG9iYWxzLmg6MTI1OAorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IEZhcnNptMIgu+e/68fSILz2IL74vcC0z7TZOiDExMbEwM8gtqcgxvfH1LXHwfYgvsq+0r3AtM+02VxuIgorCisjOiBnbG9iYWxzLmg6MTI2MQorbXNnaWQgIkU4MDA6IEFyYWJpYyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkU4MDA6IEFyYWJpY8C6ILvnv+vH0iC89iC++L3AtM+02TogxMTGxMDPILanIMb3x9S1x8H2IL7KvtK9wLTPtNlcbiIKKworIzogZ2xvYmFscy5oOjEyNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiDAzLexIMfPwMy288DMxq4gsde37CDAzLinwLogvvi9wLTPtNk6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2NgorbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogwNS3wrXIIMXYvbrGrrChIL7Gwfcgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjY3Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogwMzA/CC47bfJIMHZwMwgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjY4Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogsde3sSC4ysfOwMwgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjY5Cittc2dpZCAiRTQ3OTogTm8gbWF0Y2giCittc2dzdHIgIkU0Nzk6ILjCwfYgvsq9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDoguMLB9iC+ysC9OiAlcyIKKworIzogZ2xvYmFscy5oOjEyNzEKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiDGxMDPIMDMuKfAzCC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyNzIKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IMDMwPwgudmy2bHiIMGksdQgx6XH9r3EwMwgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjczCittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IMDMwPwguO23ycDMIL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IMDMwPwgwaSx1Melx/a9xMDMIL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI3NQorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6ILn8wKe0wiDH47/rtcfB9iC+yr3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyNzcKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiC68yCw+LCjwMwgw+a60MfPwfYgvsq9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogXCIlc1wiwLootMIpILXut8+1yCC8rbn2uO3AzCC+xrTVtM+02SIKKworIzogZ2xvYmFscy5oOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6ICVzIMbEwM/AuyC4uLXpILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI4MworbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogwNO9wyDGxMDPIMDMuKfAuyC+8sC7ILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6ICVzIMbEwM/AuyC/rSC89iC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NTogQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJFNDg1OiAlcyDGxMDPwLsgwNDAuyC89iC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyODYKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzoguLbB9ri3wLi3ziCw7cSjILXaIMD6wOW1x8H2IL7KvtK9wLTPtNkgKLWkvu6+srfBuOkgISC09cfPseIpIgorCisjOiBnbG9iYWxzLmg6MTI4NworbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiCzziDAzsDaIgorCisjOiBnbG9iYWxzLmg6MTI4OQorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6ILz9wNqwoSDHyr/kx9W0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIgorbXNnc3RyICJFNDA6IL+ht6/GxMDPICVzwLsouKYpIL+tILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6ILXwvbrHw7e5wMy4piC/rSC89iC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEyOTcKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6ILjeuPC4rrChILnZtNqztb3AtM+02SEiCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIsbQxc/AuyDDo8C7ILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg2OiBQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0ODY6IMbQxc/AuyDDo8C7ILz2IL74vcC0z7TZOiAlcyIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFNDg3OiBBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICJFNDg3OiDAzsDatMIgvue89sDMvu6+3yDH1bTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzA0Cittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiDAzMD8ILXwt7rF5Liut84gsKUgvPYgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzA4Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0Mjogv6G3ryC++MC9IgorCisjOiBnbG9iYWxzLmg6MTMxMAorbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogsfrB+CC4wrTCILmuwNq/rSIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiCx+sH4IMGksdTHpcf2vcQgx8G3zrHXt6UiCisKKyM6IGdsb2JhbHMuaDoxMzEyCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiAncmVhZG9ubHknIL/JvMfAzCC8s8Gktce+7iDA1r3AtM+02SAotaS+7r6yt8G46SAhILT1x8+x4ikiCisKKyM6IGdsb2JhbHMuaDoxMzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IMDQseIgwPy/6yC6r7z2IFwiJXNcIsC7KLimKSC8s8Gkx9IgvPYgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzE3Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiC/obevxsTAzyDA0LTCILW1wd+/oSC/obevIgorCisjOiBnbG9iYWxzLmg6MTMyMAorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBzYW5kYm94v6G8rbTCIMfjv+u1x8H2IL7KvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMyMgorbXNnaWQgIkU1MjM6IE5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU1MjM6IL+pseK/obytIMfjv+u1x8H2IL7KvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMyNQorbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogvbrFqbiwILvzxcIgvLPBpMC6IMH2v/i1x8H2IL7KvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMyNworbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiC9usWpt9Egxamx4rChIMDfuPi1x776vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMyOAorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogJ3NoZWxsJyC/ybzHwMwguvG++r3AtM+02SIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IHNpZ24gwNq34bimIMDQwLsgvPYgvvi9wLTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzMyCittc2dpZCAiRTcyOiBDbG9zZSBlcnJvciBvbiBzd2FwIGZpbGUiCittc2dzdHIgIkU3Mjogvbq/0iDGxMDPwLsgtN3AuyC89iC++L3AtM+02SIKKworIzogZ2xvYmFscy5oOjEzMzMKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiDFwrHXIL26xcPAzCC68b76vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMzNAorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiC47bfJwMwgs8q5qyC6ucDix9W0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMzNQorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiDAzLinwMwgs8q5qyCx6bTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzM2Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFuwoSCzyrmrILi5vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMzNworbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiDGxMDPIMDMuKfAzCCzyrmrILi5vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMzOAorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6ILOhv6Egua7A2rChILT1IMDWvcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTMzOQorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6ILjwuKO0wiC4tsWpIgorCisjOiBnbG9iYWxzLmg6MTM0MAorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OToguLi0ySCx28DauKYgyK7A5cfSILz2IL74vcC0z7TZIgorCisjOiBnbG9iYWxzLmg6MTM0MgorbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQntMIgJ3dpbm1pbmhlaWdodCe6uLTZIMS/vt8gx9W0z7TZIgorCisjOiBnbG9iYWxzLmg6MTM0NAorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgntMIgJ3dpbm1pbndpZHRoJ7q4tNkgxL++3yDH1bTPtNkiCisKKyM6IGdsb2JhbHMuaDoxMzQ3Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IL6ytMIgwd+/oSC/obevIgorCisjOiBnbG9iYWxzLmg6MTM0OAorI34gbXNnaWQgIlplcm8gY291bnQiCisjfiBtc2dzdHIgIiIKKworIzogZ2xvYmFscy5oOjEzNTAKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IL26xam4s8auIMTcxdi9usauILnbv6G8rSA8U0lEPiC757/rIgorCisjOiBnbG9iYWxzLmg6MTM1MworbXNnaWQgIkU0NDk6IEludmFsaWQgZXhwcmVzc2lvbiByZWNlaXZlZCIKK21zZ3N0ciAiRTQ0OTogwN+4+LXIIMelx/a9xMDMILnevsbBs73AtM+02SIKKworIzogZ2xvYmFscy5oOjEzNTYKK21zZ2lkICJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIKK21zZ3N0ciAiRTQ2Mzogv7W/qsDMILq4yKO1x7DtIMDWvu68rSC89sGkx9IgvPYgvvi9wLTPtNkiCmRpZmYgLS1naXQgYS9zcmMvcG8vbm8ucG8gYi9zcmMvcG8vbm8ucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3NDQwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9uby5wbwpAQCAtMCwwICsxLDY2MzAgQEAKKyMgTm9yd2VnaWFuIChCb2tt5WwpIHRyYW5zbGF0aW9uIG9mIFZpbS4KKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEZJUlNUIEFVVEhPUiDYeXZpbmQgQS4gSG9sbSA8c3VubnlAc3VuYmFzZS5vcmc+LCAyMDAzLTIwMDQuCisjIG5vLnBvIDMxNyAyMDA0LTA2LTExIDEyOjU0OjU5WiBzdW5ueQorIworIyBDb21tZW50cyBhbmQgZXJyb3IgcmVwb3J0cyBhcHByZWNpYXRlZC4KKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlICJWaW0gaW4gTm9yd2VnaWFuIiBwcm9qZWN0OgorIworIyAgIGh0dHA6Ly93d3cuc3VuYmFzZS5vcmcvc3JjL3ZpbS9ub3J3ZWdpYW4vCisjCisjIE5ldyB2ZXJzaW9ucyBvZiB0aGUgdHJhbnNsYXRpb24gZmlsZXMgY2FuIGJlIGRvd25sb2FkZWQgaW4gLnRhci5negorIyBmb3JtYXQgZnJvbQorIworIyAgIGh0dHA6Ly9zdm4uc3VuYmFzZS5vcmcvcmVwb3Mvbm9yd2VnaWFuX3ZpbS9kb3dubG9hZC8KKyMKKyMgVGhlIGZpbGVzIGFyZSBzdG9yZWQgaW4gdGhlIFN1YnZlcnNpb24gdmVyc2lvbiBjb250cm9sIHN5c3RlbSBhbmQKKyMgdXNlcnMgb2YgdGhpcyBzb2Z0d2FyZSBjYW4gY2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiB3aXRoCisjCisjICAgc3ZuIGNoZWNrb3V0IGh0dHA6Ly9zdm4uc3VuYmFzZS5vcmcvcmVwb3Mvbm9yd2VnaWFuX3ZpbS90cnVuay9tc2dzIG5vcndlZ2lhbl92aW0tbXNncworIworIyBUaGlzIHdpbGwgcGxhY2UgdGhlIG1lc3NhZ2UgZmlsZXMgaW50byB0aGUgIm5vcndlZ2lhbl92aW0tbXNncyIKKyMgZGlyZWN0b3J5LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogVmltIDYueFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA0LTA2LTExIDE0OjM4KzAyMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAzLTA1LTEzIDA4OjE5KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6INh5dmluZCBBLiBIb2xtIDxzdW5ueUBzdW5iYXNlLm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBOb3J3ZWdpYW4gPHZpbS5pbi5ub3J3ZWdpYW5Ac3VuYmFzZS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1Ubzogc3VubnlAc3VuYmFzZS5vcmdcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiBLYW4gaWtrZSByZXNlcnZlcmUgcGxhc3MgdGlsIG5vZW4gYnVmZmVyZSwgYXZzbHV0dGVyoC4uLiIKKworIzogYnVmZmVyLmM6MTA1Cittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogS2FuIGlra2UgcmVzZXJ2ZXJlIHBsYXNzIHRpbCBidWZmZXIsIGJydWtlciBlbiBhbm5lbqAuLi4iCisKKyM6IGJ1ZmZlci5jOjgwOAorbXNnaWQgIkU1MTU6IE5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiRTUxNTogSW5nZW4gYnVmZmVyZSBibGUgbGFzdGV0IHV0IgorCisjOiBidWZmZXIuYzo4MTAKK21zZ2lkICJFNTE2OiBObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiRTUxNjogSW5nZW4gYnVmZmVyZSBibGUgc2xldHRldCIKKworIzogYnVmZmVyLmM6ODEyCittc2dpZCAiRTUxNzogTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiRTUxNzogSW5nZW4gYnVmZmVyZSBibGUgdmlza2V0IHV0IgorCisjOiBidWZmZXIuYzo4MjAKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAiMSBidWZmZXIgYmxlIGxhc3RldCB1dCIKKworIzogYnVmZmVyLmM6ODIyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgIiVkIGJ1ZmZlcmUgYmxlIGxhc3RldCB1dCIKKworIzogYnVmZmVyLmM6ODI3Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSBidWZmZXIgYmxlIHNsZXR0ZXQiCisKKyM6IGJ1ZmZlci5jOjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIGJ1ZmZlcmUgYmxlIHNsZXR0ZXQiCisKKyM6IGJ1ZmZlci5jOjgzNAorbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAiMSBidWZmZXIgYmxlIHZpc2tldCB1dCIKKworIzogYnVmZmVyLmM6ODM2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICIlZCBidWZmZXJlIGJsZSB2aXNrZXQgdXQiCisKKyM6IGJ1ZmZlci5jOjg5NworbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IEZhbnQgaW5nZW4gbW9kaWZpc2VydCBidWZmZXIiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MzYKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogRGV0IGZpbm5lcyBpbmdlbiBsaXN0ZWRlIGJ1ZmZlcmUiCisKKyM6IGJ1ZmZlci5jOjk0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFODY6IEJ1ZmZlciAlbGQgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU4NjogQnVmZmVyZW4gJWxkIGZpbm5lcyBpa2tlIgorCisjOiBidWZmZXIuYzo5NTEKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogS2FuIGlra2UgZ+UgZm9yYmkgc2lzdGUgYnVmZmVyIgorCisjOiBidWZmZXIuYzo5NTMKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IEthbiBpa2tlIGflIGZvcmJpIGb4cnN0ZSBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFODk6IElra2UgbGFncmV0IHNpZGVuIGZvcnJpZ2UgZm9yYW5kcmluZyBhdiBidWZmZXJlbiAlbGQgKGxlZ2cgdGlsICEgZm9yIOUgIgorIm92ZXJzdHlyZSkiCisKKyM6IGJ1ZmZlci5jOjEwMDgKK21zZ2lkICJFOTA6IENhbm5vdCB1bmxvYWQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU5MDogS2FuIGlra2UgbGFzdGUgdXQgc2lzdGUgYnVmZmVyIgorCisjOiBidWZmZXIuYzoxNTQ0Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogQWR2YXJzZWw6IExpc3RlbiBtZWQgZmlsbmF2biBlciBvdmVyZnlsdCIKKworIzogYnVmZmVyLmM6MTcxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IEZhbnQgaWtrZSBidWZmZXJlbiAlbGQiCisKKyM6IGJ1ZmZlci5jOjE5NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBNZXIgZW5uIGV0dCB0cmVmZiBmb3IgJXMiCisKKyM6IGJ1ZmZlci5jOjE5NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IEluZ2VuIHNhbXN2YXJlbmRlIGJ1ZmZlciBmb3IgJXMiCisKKyM6IGJ1ZmZlci5jOjIzNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgImxpbmplICVsZCIKKworIzogYnVmZmVyLmM6MjQyOQorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IEVuIGJ1ZmZlciBtZWQgZGV0dGUgbmF2bmV0IGZpbm5lcyBhbGxlcmVkZSIKKworIzogYnVmZmVyLmM6MjcyNAorbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW01vZGlmaXNlcnRdIgorCisjOiBidWZmZXIuYzoyNzI5Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbVXJlZGlnZXJ0XSIKKworIzogYnVmZmVyLmM6MjczNAorbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIltOeSBmaWxdIgorCisjOiBidWZmZXIuYzoyNzM1Cittc2dpZCAiW1JlYWQgZXJyb3JzXSIKK21zZ3N0ciAiW0xlc2VmZWlsXSIKKworIzogYnVmZmVyLmM6MjczNyBmaWxlaW8uYzoyMTI0Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW3Nrcml2ZWJlc2t5dHRldF0iCisKKyM6IGJ1ZmZlci5jOjI3NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICIxIGxpbmplIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIGxpbmplciAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc2NworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAibGluamUgJWxkIGF2ICVsZCAtLSVkJSUtLSBrb2wgIgorCisjOiBidWZmZXIuYzoyODc1Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbVXRlbiBuYXZuXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyOTE1Cittc2dpZCAiaGVscCIKK21zZ3N0ciAiaGplbHAiCisKKyM6IGJ1ZmZlci5jOjM0NzQgc2NyZWVuLmM6NTA3OQorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW2hqZWxwXSIKKworIzogYnVmZmVyLmM6MzUwNiBzY3JlZW4uYzo1MDg1Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbRm9yaOVuZHN2aXNuaW5nXSIKKworIzogYnVmZmVyLmM6Mzc4NgorbXNnaWQgIkFsbCIKK21zZ3N0ciAiQWx0IgorCisjOiBidWZmZXIuYzozNzg2Cittc2dpZCAiQm90IgorbXNnc3RyICJCdW5uIgorCisjOiBidWZmZXIuYzozNzg4Cittc2dpZCAiVG9wIgorbXNnc3RyICJUb3BwIgorCisjOiBidWZmZXIuYzo0NTM2Cittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEJ1ZmZlcmxpc3RlOlxuIgorCisjOiBidWZmZXIuYzo0NTY5Cittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbRmVpbGxpc3RlXSIKKworIzogYnVmZmVyLmM6NDU4MiBtZW1saW5lLmM6MTUyMQorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW1V0ZW4gbmF2bl0iCisKKyM6IGJ1ZmZlci5jOjQ4OTUKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBTa2lsdCAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ5MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiU2tpbHQgZm9yICVzOiIKKworIzogYnVmZmVyLmM6NDkyMAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgbGluamU9JWxkICBpZD0lZCAgbmF2bj0lcyIKKworIzogZGlmZi5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogS2FuIGlra2Ugc2FtbWVubGlnbmUgZmxlcmUgZW5uICVsZCBidWZmZXJlIgorCisjOiBkaWZmLmM6NzEzCittc2dpZCAiRTk3OiBDYW5ub3QgY3JlYXRlIGRpZmZzIgorbXNnc3RyICJFOTc6IEthbiBpa2tlIGxhZ2UgZGlmZmVyYW5zZWZpbGVyIgorCisjOiBkaWZmLmM6ODE5Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiUGF0Y2ggZmlsIgorCisjOiBkaWZmLmM6MTA3MgorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogS2FuIGlra2UgbGVzZSBkaWZmZXJhbnNlLXV0ZGF0YSIKKworIzogZGlmZi5jOjE4MjIKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogTuV25nJlbmRlIGJ1ZmZlciBlciBpa2tlIGkgZGlmZmVyYW5zZW1vZHVzIgorCisjOiBkaWZmLmM6MTgzNAorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IEluZ2VuIGFubmVuIGJ1ZmZlciBpIGRpZmZlcmFuc2Vtb2R1cyIKKworIzogZGlmZi5jOjE4NDIKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIiIKKyJFMTAxOiBNZXIgZW5uIHRvIGJ1ZmZlcmUgaSBkaWZmZXJhbnNlbW9kdXMsIHZldCBpa2tlIGh2aWxrZW4gc29tIHNrYWwgYnJ1a2VzIgorCisjOiBkaWZmLmM6MTg2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IEthbiBpa2tlIGZpbm5lIGJ1ZmZlciBcIiVzXCIiCisKKyM6IGRpZmYuYzoxODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogQnVmZmVyZW4gXCIlc1wiIGVyIGlra2UgaSBkaWZmZXJhbnNlbW9kdXMiCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IEVzY2FwZSBlciBpa2tlIGxvdmxpZyBpIHNwZXNpYWx0ZWduIgorCisjOiBkaWdyYXBoLmM6MjM4NAorbXNnaWQgIkU1NDQ6IEtleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTU0NDogRmFudCBpa2tlIGtleW1hcC1maWwiCisKKyM6IGRpZ3JhcGguYzoyNDExCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiBCcnVrIGF2IDpsb2Fka2V5bWFwIHV0ZW5mb3IgZW4ga2r4cnQgZmlsIgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIE74a2tlbG9yZGZ1bGxm+HJpbmcgKF5OXlApIgorCisjLiBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyM6IGVkaXQuYzo0MQorbXNnaWQgIiBeWCBtb2RlICheRV5ZXkxeXV5GXkleS15EXlZeTl5QKSIKK21zZ3N0ciAiIF5YLW1vZHVzICheRV5ZXkxeXV5GXkleS15EXlZeTl5QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgTG9rYWwgbvhra2Vsb3JkZnVsbGb4cmluZyAoXk5eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5MXk5eUCkiCittc2dzdHIgIiBGdWxsZvhyaW5nIGF2IGhlbCBsaW5qZSAoXkxeTl5QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRl5OXlApIgorbXNnc3RyICIgRnVsbGb4cmluZyBhdiBmaWxuYXZuICheRl5OXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dXk5eUCkiCittc2dzdHIgIiBGdWxsZvhyaW5nIGF2IHRhZyAoXl1eTl5QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIFN0aW34bnN0ZXItZnVsbGb4cmluZyAoXk5eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EXk5eUCkiCittc2dzdHIgIiBGdWxsZvhyaW5nIGF2IGRlZmluZXJpbmdlciAoXkReTl5QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXkteTl5QKSIKK21zZ3N0ciAiIEZ1bGxm+HJpbmcgZnJhIG9yZGxpc3RlICheS15OXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UXk5eUCkiCittc2dzdHIgIiBUaGVzYXVydXMtZnVsbGb4cmluZyAoXlReTl5QKSIKKworIzogZWRpdC5jOjUzCittc2dpZCAiIENvbW1hbmQtbGluZSBjb21wbGV0aW9uICheVl5OXlApIgorbXNnc3RyICIgS29tbWFuZG9saW5qZS1mdWxsZvhyaW5nICheVl5OXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAiS29tIHRpbCBzbHV0dGVuIGF2IGF2c25pdHRldCIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ3RoZXNhdXJ1cyctdmFsZ2V0IGVyIHRvbXQiCisKKyM6IGVkaXQuYzoxMTY2Cittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ2RpY3Rpb25hcnknLXZhbGdldCBlciB0b210IgorCisjOiBlZGl0LmM6MjE2MgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBkaWN0aW9uYXJ5OiAlcyIKK21zZ3N0ciAiTGV0ZXIgZ2plbm5vbSBvcmRsaXN0ZTogJXMiCisKKyM6IGVkaXQuYzoyMzY4Cittc2dpZCAiIChpbnNlcnQpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHNldHQgaW5uKSBSdWxsaW5nICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChlcnN0YXR0KSBSdWxsaW5nICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiTGV0ZXI6ICVzIgorCisjOiBlZGl0LmM6MjcxOQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJMZXRlciBnamVubm9tIHRhZ2dlci4iCisKKyM6IGVkaXQuYzozMzgxCittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiIExlZ2dlciB0aWwiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzQzMAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gU/hrZXKgLi4uIgorCisjOiBlZGl0LmM6MzQ4NgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIlRpbGJha2UgaSBvcmlnaW5hbGVuIgorCisjOiBlZGl0LmM6MzQ5MQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICJPcmQgZnJhIGFubmVuIGxpbmplIgorCisjOiBlZGl0LmM6MzQ5NgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJEZXQgZW5lc3RlIHRyZWZmZXQiCisKKyM6IGVkaXQuYzozNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICJ0cmVmZiAlZCBhdiAlZCIKKworIzogZWRpdC5jOjM1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgInRyZWZmICVkIgorCisjLiBTa2lwIGZ1cnRoZXIgYXJndW1lbnRzIGJ1dCBkbyBjb250aW51ZSB0bworIy4gKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4KKyM6IGV2YWwuYzoxMDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogVWtqZW50IHZhcmlhYmVsOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxMzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogTWFuZ2xlciBwYXJlbnRlc2VyOiAlcyIKKworIzogZXZhbC5jOjE0MzUgZXZhbC5jOjE0NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiBWYXJpYWJlbGVuIGZpbm5lcyBpa2tlOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNzA1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBNYW5nbGVyICc6JyBldHRlciAnPyciCisKKyM6IGV2YWwuYzoyMzI3Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IE1hbmdsZXIgJyknIgorCisjOiBldmFsLmM6MjM4OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBNYW5nbGVyICddJyIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IE5hdm4gcOUgdmFsZyBtYW5nbGVyOiAlcyIKKworIzogZXZhbC5jOjI0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBVa2plbnQgdmFsZzogJXMiCisKKyM6IGV2YWwuYzoyNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiBNYW5nbGVyIGFuZvhyc2Vsc3RlZ24gKFwiKTogJXMiCisKKyM6IGV2YWwuYzoyNjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBNYW5nbGVyIGFwb3N0cm9mICgnKTogJXMiCisKKyM6IGV2YWwuYzozMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjogVWd5bGRpZ2UgcGFyYW1ldGVyZSB0aWwgZnVua3Nqb24gJXMiCisKKyM6IGV2YWwuYzozMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBVa2plbnQgZnVua3Nqb246ICVzIgorCisjOiBldmFsLmM6MzA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODogRm9yIG1hbmdlIHBhcmFtZXRlcmUgdGlsIGZ1bmtzam9uZW46ICVzIgorCisjOiBldmFsLmM6MzA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiBJa2tlIG5vayBwYXJhbWV0ZXJlIHRpbCBmdW5rc2pvbmVuOiAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiBCcnVrIGF2IFwiPFNJRD5cIiB1dGVuZm9yIHNrcmlwdC1zYW1tZW5oZW5nOiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzY4NyBndWkuYzo0Mzg1IGd1aV9ndGsuYzoyMDU5Cittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGV2YWwuYzo0MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIGxpbmplcjogIgorCisjOiBldmFsLmM6NTQ3NworbXNnaWQgIiIKKyImT0tcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJk9LXG4iCisiJkF2YnJ5dCIKKworIzogZXZhbC5jOjU1MTcKK21zZ2lkICJjYWxsZWQgaW5wdXRyZXN0b3JlKCkgbW9yZSBvZnRlbiB0aGFuIGlucHV0c2F2ZSgpIgorbXNnc3RyICJrYWx0ZSBpbnB1dHJlc3RvcmUoKSBvZnRlcmUgZW5uIGlucHV0c2F2ZSgpIgorCisjOiBldmFsLmM6NTk3NworbXNnaWQgIkU2NTU6IFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIChjeWNsZT8pIgorbXNnc3RyICJFNjU1OiBGb3IgbWFuZ2Ugc3ltYm9sc2tlIGxpbmtlciAocnVuZGRhbnM/KSIKKworIzogZXZhbC5jOjY2MjYKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IEluZ2VuIGZvcmJpbmRlbHNlIG1lZCBWaW0tdGplbmVyZW4iCisKKyM6IGV2YWwuYzo2NzI0Cittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6IEtsYXJlciBpa2tlIGxlc2Ugc3ZhciBmcmEgdGplbmVyZW4iCisKKyM6IGV2YWwuYzo2NzUyCittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBLbGFyZXIgaWtrZSBzZW5kZSB0aWwga2xpZW50ZW4iCisKKyM6IGV2YWwuYzo2ODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiBLbGFyZXIgaWtrZSBzZW5kZSB0aWwgJXMiCisKKyM6IGV2YWwuYzo2OTAwCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIoVWd5bGRpZykiCisKKyM6IGV2YWwuYzo4MDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IFVkZWZpbmVydCB2YXJpYWJlbDogJXMiCisKKyM6IGV2YWwuYzo4NTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IFVneWxkaWcgdmFyaWFiZWxuYXZuOiAlcyIKKworIzogZXZhbC5jOjg4MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxMjI6IEZ1bmtzam9uZW4gJXMgZWtzaXN0ZXJlciBhbGxlcmVkZSwgbGVnZyB0aWwgISBmb3Ig5SBlcnN0YXR0ZSBkZW4iCisKKyM6IGV2YWwuYzo4ODc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IFVkZWZpbmVydCBmdW5rc2pvbjogJXMiCisKKyM6IGV2YWwuYzo4ODg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogTWFuZ2xlciAnKCc6ICVzIgorCisjOiBldmFsLmM6ODkyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI1OiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTEyNTogVWd5bGRpZyBwYXJhbWV0ZXI6ICVzIgorCisjOiBldmFsLmM6OTAwMAorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiBNYW5nbGVyIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjkxMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IEthbiBpa2tlIG9tZGVmaW5lcmUgZnVua3Nqb25lbiAlczogRGVuIGVyIGkgYnJ1ayIKKworIzogZXZhbC5jOjkxNzcKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiBGdW5rc2pvbnNuYXZuIG74ZHZlbmRpZyIKKworIzogZXZhbC5jOjkyMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogRnVua3Nqb25zbmF2biBt5SBoYSBzdG9yIGZvcmJva3N0YXY6ICVzIgorCisjOiBldmFsLmM6OTQyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBVZGVmaW5lcnQgZnVua3Nqb246ICVzIgorCisjOiBldmFsLmM6OTQyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IEthbiBpa2tlIHNsZXR0ZSBmdW5rc2pvbmVuICVzOiBEZW4gZXIgaSBicnVrIgorCisjOiBldmFsLmM6OTQ3MworbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IEZ1bmtzam9uc2thbGxkeWJkZW4gZXIgc3T4cnJlIGVubiAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJrYWxsZXIgJXMiCisKKyM6IGV2YWwuYzo5NTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzIGF2YnJ1dHQiCisKKyM6IGV2YWwuYzo5NTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICIlcyByZXR1cm5lcmVyICMlbGQiCisKKyM6IGV2YWwuYzo5NTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIHJldHVybmVyZXIgXCIlc1wiIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NjEzIGV4X2NtZHMyLmM6MjM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJmb3J0c2V0dGVyIGkgJXMiCisKKyM6IGV2YWwuYzo5NjM5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gZXIgaWtrZSBpbm5lbmZvciBlbiBmdW5rc2pvbiIKKworIzogZXZhbC5jOjk5NzAKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBnbG9iYWxlIHZhcmlhYmxlcjpcbiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPa3RhbCAlMDNvIgorCisjOiBleF9jbWRzLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwNHgsIE9rdGFsICVvIgorCisjOiBleF9jbWRzLmM6MTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwOHgsIE9rdGFsICVvIgorCisjOiBleF9jbWRzLmM6NDMwCittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IEZseXR0aW5nIGF2IGxpbmplciBpbm4gaSBzZWcgc2VsdiIKKworIzogZXhfY21kcy5jOjQ5OQorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSBsaW5qZSBmbHl0dGV0IgorCisjOiBleF9jbWRzLmM6NTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiJWxkIGxpbmplciBmbHl0dGV0IgorCisjOiBleF9jbWRzLmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAiJWxkIGxpbmplciBmaWx0cmVydCIKKworIzogZXhfY21kcy5jOjk1MgorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0ZXIqIEF1dG9rb21tYW5kb2VyIG3lIGlra2UgZm9yYW5kcmUgbuV25nJlbmRlIGJ1ZmZlciIKKworIzogZXhfY21kcy5jOjEwMzcKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIltJa2tlIGxhZ3JldCBzaWRlbiBmb3JyaWdlIGZvcmFuZHJpbmddXG4iCisKKyM6IGV4X2NtZHMuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzIGkgbGluamU6ICIKKworIzogZXhfY21kcy5jOjEyODgKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogRm9yIG1hbmdlIGZlaWwsIGhvcHBlciBvdmVyIHJlc3RlbiBhdiBmaWxlbiIKKworIzogZXhfY21kcy5jOjEzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJMZXNlciB2aW1pbmZvLWZpbCBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiBpbmZvIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIG1lcmtlciIKKworIzogZXhfY21kcy5jOjEzMjYKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgRkVJTEVUIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogVmltaW5mby1maWwgZXIgaWtrZSBza3JpdmJhcjogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IEthbiBpa2tlIGxhZ3JlIHZpbWluZm8tZmlsICVzISIKKworIzogZXhfY21kcy5jOjE1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICJMYWdyZXIgdmltaW5mby1maWwgXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgRGVubmUgdmltaW5mby1maWxlbiBibGUgZ2VuZXJlcnQgYXYgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgRHUga2FuIHJlZGlnZXJlIGRlbiBodmlzIGR1IGVyIGZvcnNpa3RpZyFcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyBWZXJkaWVuIGF2ICdlbmNvZGluZycgbuVyIGRlbm5lIGZpbGVuIGJsZSBza3JldmV0XG4iCisKKyM6IGV4X2NtZHMuYzoxNzUyCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICJVbG92bGlnIHN0YXJ0dGVnbiIKKworIzogZXhfY21kcy5jOjIwOTcgZXhfY21kczIuYzo3NjEKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICJMYWdyZSBzb20iCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjE0MAorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiBGaWxlbiBlciBsYXN0ZXQgaSBlbiBhbm5lbiBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoyMTc0Cittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiU2tyaXZlIGRlbHZpcyBmaWw/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiBCcnVrICEgZm9yIOUgc2tyaXZlIGRlbHZpcyBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoyMjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAiT3ZlcnNrcml2ZSBla3Npc3RlcmVuZGUgZmlsIFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiBNYW5nbGVyIGZpbG5hdm4gZm9yIGJ1ZmZlciAlbGQiCisKKyM6IGV4X2NtZHMuYzoyNDA2Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogRmlsZW4gYmxlIGlra2UgbGFncmV0OiBMYWdyaW5nIGVyIGRlYWt0aXZlcnQgbWVkICd3cml0ZSctdmFsZ2V0IgorCisjOiBleF9jbWRzLmM6MjQyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiJ3JlYWRvbmx5Jy12YWxnZXQgZXIgc2F0dCBmb3IgXCIlLipzXCIuXG4iCisiVmlsIGR1IGxhZ3JlIGxpa2V2ZWw/IgorCisjOiBleF9jbWRzLmM6MjU5OQorbXNnaWQgIkVkaXQgRmlsZSIKK21zZ3N0ciAiUmVkaWdlciBmaWwiCisKKyM6IGV4X2NtZHMuYzozMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDM6IEF1dG9jb21tYW5kcyB1bmV4cGVjdGVkbHkgZGVsZXRlZCBuZXcgYnVmZmVyICVzIgorbXNnc3RyICJFMTQzOiBBdXRva29tbWFuZG9lciBzbGV0dGV0IHV2ZW50ZXQgZGVuIG55ZSBidWZmZXJlbiAlcyIKKworIzogZXhfY21kcy5jOjMzNDAKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogSWtrZS1udW1lcmlzayBwYXJhbWV0ZXIgdGlsIDp6IgorCisjOiBleF9jbWRzLmM6MzQyNQorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IFNrYWxsa29tbWFuZG9lciBlciBpa2tlIHRpbGxhdHQgaSBydmltIgorCisjOiBleF9jbWRzLmM6MzUzMgorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3Vs5nJlIHV0dHJ5a2sga2FuIGlra2UgYmxpIGFkc2tpbHQgYXYgYm9rc3RhdmVyIgorCisjOiBleF9jbWRzLmM6Mzg3OAorIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICJFcnN0YXR0IG1lZCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCisKKyM6IGV4X2NtZHMuYzo0MjcxCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIihBdmJydXR0KSAiCisKKyM6IGV4X2NtZHMuYzo0Mjc1Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIjEgZXJzdGF0bmluZyIKKworIzogZXhfY21kcy5jOjQyNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBlcnN0YXRuaW5nZXIiCisKKyM6IGV4X2NtZHMuYzo0MjgwCittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIGkgMSBsaW5qZSIKKworIzogZXhfY21kcy5jOjQyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiIGkgJWxkIGxpbmplciIKKworIzogZXhfY21kcy5jOjQzMzMKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IEthbiBpa2tlIGdq+HJlIDpnbG9iYWwgcmVrdXJzaXYiCisKKyM6IGV4X2NtZHMuYzo0MzY4Cittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IFJlZ3Vs5nJ0IHV0dHJ5a2sgbWFuZ2xlciBpIGdsb2JhbCBrb21tYW5kbyIKKworIzogZXhfY21kcy5jOjQ0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiU/hrZXN0cmVuZyBmdW5uZXQgaSBhbGxlIGxpbmplbmU6ICVzIgorCisjOiBleF9jbWRzLmM6NDQ5OAorbXNnaWQgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKK21zZ3N0ciAiIgorIlxuIgorIiMgU2lzdGUgZXJzdGF0bmluZ3N0ZWtzdDpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDU5OQorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogSW5nZW4gcGFuaWtrISIKKworIzogZXhfY21kcy5jOjQ2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2MTogU29ycnksIG5vICclcycgaGVscCBmb3IgJXMiCittc2dzdHIgIkU2NjE6IERlc3N2ZXJyZSBpbmdlbiAnJXMnIGhqZWxwIGZvciAlcyIKKworIzogZXhfY21kcy5jOjQ2NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBEZXNzdmVycmUgaW5nZW4gaGplbHAgZm9yICVzIgorCisjOiBleF9jbWRzLmM6NDY4OAorIywgYy1mb3JtYXQKK21zZ2lkICJTb3JyeSwgaGVscCBmaWxlIFwiJXNcIiBub3QgZm91bmQiCittc2dzdHIgIkZhbnQgaWtrZSBoamVscGVmaWxlbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo1MTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6IEVyIGlra2UgZW4ga2F0YWxvZzogJXMiCisKKyM6IGV4X2NtZHMuYzo1MzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBLYW4gaWtrZSDlcG5lICVzIGZvciBza3JpdmluZyIKKworIzogZXhfY21kcy5jOjUzNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IEthbiBpa2tlIOVwbmUgJXMgZm9yIGxlc2luZyIKKworIzogZXhfY21kcy5jOjU0MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY3MDogTWl4IG9mIGhlbHAgZmlsZSBlbmNvZGluZ3Mgd2l0aGluIGEgbGFuZ3VhZ2U6ICVzIgorbXNnc3RyICJFNjcwOiBUZWduc2V0dGJsYW5kaW5nIGkgaGplbHBlZmlsZW4gaW5uZW5mb3Igc2FtbWUgc3By5Ws6ICVzIgorCisjOiBleF9jbWRzLmM6NTQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzLyVzIgorbXNnc3RyICJFMTU0OiBEdXBsaWthdC10YWcgXCIlc1wiIGkgZmlsZW4gJXMvJXMiCisKKyM6IGV4X2NtZHMuYzo1NTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogVWtqZW50IHNraWx0a29tbWFuZG86ICVzIgorCisjOiBleF9jbWRzLmM6NTYxOQorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBNYW5nbGVyIHNraWx0bmF2biIKKworIzogZXhfY21kcy5jOjU2NjUKK21zZ2lkICJFNjEyOiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFNjEyOiBGb3IgbWFuZ2Ugc2tpbHQgZGVmaW5lcnQiCisKKyM6IGV4X2NtZHMuYzo1NzMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzk6IEludmFsaWQgc2lnbiB0ZXh0OiAlcyIKK21zZ3N0ciAiRTIzOTogVWd5bGRpZyBza2lsdHRla3N0OiAlcyIKKworIzogZXhfY21kcy5jOjU3NjQgZXhfY21kcy5jOjU5NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogVWtqZW50IHNraWx0OiAlcyIKKworIzogZXhfY21kcy5jOjU4MTMKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBNYW5nbGVyIHNraWx0bnVtbWVyIgorCisjOiBleF9jbWRzLmM6NTg5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODogVWd5bGRpZyBidWZmZXJuYXZuOiAlcyIKKworIzogZXhfY21kcy5jOjU5MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IFVsb3ZsaWcgc2tpbHQtSUQ6ICVsZCIKKworIzogZXhfY21kcy5jOjYwMDQKK21zZ2lkICIgKE5PVCBGT1VORCkiCittc2dzdHIgIiAoSUtLRSBGVU5ORVQpIgorCisjOiBleF9jbWRzLmM6NjAwNgorbXNnaWQgIiAobm90IHN1cHBvcnRlZCkiCittc2dzdHIgIiAoaWtrZSBzdPh0dGV0KSIKKworIzogZXhfY21kcy5jOjYxMDUKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltTbGV0dGV0XSIKKworIzogZXhfY21kczIuYzo5MgorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGNvbnRpbnVlLiIKK21zZ3N0ciAiR+VyIGlubiBpIGRlYnVnZ2luZ3Ntb2R1cy4gU2tyaXYgXCJjb250XCIgZm9yIOUgZm9ydHNldHRlLiIKKworIzogZXhfY21kczIuYzo5NiBleF9kb2NtZC5jOjk2OAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgImxpbmplICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAia29tbWFuZG86ICVzIgorCisjOiBleF9jbWRzMi5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJTdG9wcHVua3QgaSBcIiVzJXNcIiBsaW5qZSAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTogRmFudCBpa2tlIHN0b3BwdW5rdDogJXMiCisKKyM6IGV4X2NtZHMyLmM6NTY2Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAiSW5nZW4gc3RvcHB1bmt0IGRlZmluZXJ0IgorCisjOiBleF9jbWRzMi5jOjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgbGluamUgJWxkIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJMYWdyZSBmb3JhbmRyaW5nZXIgdGlsIFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo3ODggZXhfZG9jbWQuYzo5NDA3Cittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIlV0ZW4gbmF2biIKKworIzogZXhfY21kczIuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IElra2UgbGFncmV0IHNpZGVuIHNpc3RlIGZvcmFuZHJpbmdlciBpIGJ1ZmZlcmVuIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo5ODQKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgIkFkdmFyc2VsOiBHaWtrIHV2ZW50ZXQgaW5uIGkgZW4gYW5uZW4gYnVmZmVyIChzamVrayBhdXRva29tbWFuZG9lcikiCisKKyM6IGV4X2NtZHMyLmM6MTM4NworbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogRGV0IGVyIGJhcmUgZW4gZmlsIOUgcmVkaWdlcmUiCisKKyM6IGV4X2NtZHMyLmM6MTM4OQorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDogS2FuIGlra2UgZ+UgZm9yYmkgZvhyc3RlIGZpbCIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IEthbiBpa2tlIGflIGZvcmJpIHNpc3RlIGZpbCIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiBLb21waWxhdG9yZW4gZXIgaWtrZSBzdPh0dGV0OiAlcyIKKworIzogZXhfY21kczIuYzoxOTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiU/hrZXIgZXR0ZXIgXCIlc1wiIGkgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIiCittc2dzdHIgIlP4a2VyIGV0dGVyIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgImlra2UgZnVubmV0IGkgJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NzkKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiS2r4ciBWaW0tc2tyaXB0IgorCisjOiBleF9jbWRzMi5jOjIxNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJLYW4gaWtrZSBravhyZSBlbiBrYXRhbG9nOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIwNworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAia3VubmUgaWtrZSBravhyZSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIwOQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgImxpbmplICVsZDogS3VubmUgaWtrZSBravhyZSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIyMworIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImtq+HJlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIyNQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJsaW5qZSAlbGQ6IGtq+HJlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjM2OAorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiZmVyZGlnIG1lZCBravhyaW5nIGF2ICVzIgorCisjOiBleF9jbWRzMi5jOjI3MTIKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiBBZHZhcnNlbDogRmVpbCBsaW5qZXNlcGFyYXRvciwgZGV0IGVyIG11bGlnIF5NIG1hbmdsZXIiCisKKyM6IGV4X2NtZHMyLmM6Mjc2MQorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyBicnVrdCB1dGVuZm9yIGVuIGtq+HJ0IGZpbCIKKworIzogZXhfY21kczIuYzoyNzk0Cittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IDpmaW5pc2ggYnJ1a3QgdXRlbmZvciBlbiBravhydCBmaWwiCisKKyM6IGV4X2NtZHMyLmM6MzI0MworIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICJTaWRlICVkIgorCisjOiBleF9jbWRzMi5jOjMzOTkKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIkluZ2VuIHRla3N0IGZvciB1dHNrcmlmdCIKKworIzogZXhfY21kczIuYzozNDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJTa3JpdmVyIHV0IHNpZGUgJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjM0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIiBLb3BpICVkIGF2ICVkIgorCisjOiBleF9jbWRzMi5jOjM1NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIlNrcmV2ZXQgdXQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjM1NTQKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICJVdHNrcmlmdCBhdmJydXR0IgorCisjOiBleF9jbWRzMi5jOjM5MTkKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEZlaWwgdW5kZXIgc2tyaXZpbmcgdGlsIFBvc3RzY3JpcHQtZmlsIgorCisjOiBleF9jbWRzMi5jOjQxOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNDogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTYyNDogS2FuIGlra2Ug5XBuZSBmaWxlbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDIwNCBleF9jbWRzMi5jOjQ4MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiBLYW4gaWtrZSBsZXNlIFBvc3RzY3JpcHQtcmVzc3Vyc2ZpbCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IEZpbGVuIFwiJXNcIiBlciBpa2tlIGVuIFBvc3RzY3JpcHQtcmVzc3Vyc2ZpbCIKKworIzogZXhfY21kczIuYzo0MjI3IGV4X2NtZHMyLmM6NDI0NyBleF9jbWRzMi5jOjQyNjIgZXhfY21kczIuYzo0Mjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTk6IERldCBlciBpa2tlIHN0+HR0ZSBmb3IgUG9zdHNjcmlwdC1yZXNzdXJzZmlsZW4gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQzMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMTogXCIlc1wiIHJlc291cmNlIGZpbGUgaGFzIHdyb25nIHZlcnNpb24iCittc2dzdHIgIkU2MjE6IFJlc3N1cnNmaWxlbiBcIiVzXCIgZXIgZmVpbCB2ZXJzam9uIgorCisjOiBleF9jbWRzMi5jOjQ3ODEKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IEthbiBpa2tlIOVwbmUgUG9zdHNjcmlwdC1maWwgZm9yIHNrcml2aW5nIgorCisjOiBleF9jbWRzMi5jOjQ4MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogS2FuIGlra2Ug5XBuZSBmaWxlbiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDkzMworbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwicHJvbG9nLnBzXCIiCittc2dzdHIgIkU0NTY6IEZhbnQgaWtrZSBQb3N0c2NyaXB0LXJlc3N1cnNmaWxlbiBcInByb2xvZy5wc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIgorbXNnc3RyICJFNDU2OiBGYW50IGlra2UgUG9zdHNjcmlwdC1yZXNzdXJzZmlsZW4gXCIlcy5wc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMDogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIFwiJXNcIiBlbmNvZGluZyIKK21zZ3N0ciAiRTYyMDogS2xhcnRlIGlra2Uga29udmVydGVyZSBmcmEgbXVsdGlieXRlIHRpbCBcIiVzXCItdGVnbnNldHQiCisKKyM6IGV4X2NtZHMyLmM6NTEwNworbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAiU2VuZGVyIHRpbCBza3JpdmVyoC4uLiIKKworIzogZXhfY21kczIuYzo1MTExCittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogRmVpbCB1bmRlciB1dHNrcmlmdCBhdiBQb3N0c2NyaXB0LWZpbCIKKworIzogZXhfY21kczIuYzo1MTEzCittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJTa3JpdmVyam9iYiBzZW5kdC4iCisKKyM6IGV4X2NtZHMyLmM6NTYyMworIywgYy1mb3JtYXQKK21zZ2lkICJDdXJyZW50ICVzbGFuZ3VhZ2U6IFwiJXNcIiIKK21zZ3N0ciAiTuV25nJlbmRlICVzc3By5Ws6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo1NjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBLYW4gaWtrZSBzZXR0ZSBzcHLlayB0aWwgXCIlc1wiIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJH5XIgaW5uIGkgRXgtbW9kdXMuIFNrcml2IFwidmlzdWFsXCIgZm9yIOUgZ+UgdGlsIG5vcm1hbG1vZHVzLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTYxCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IFZlZCBzbHV0dGVuIGF2IGZpbGVuIgorCisjOiBleF9kb2NtZC5jOjY3MAorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogS29tbWFuZG8gYWx0Zm9yIHJla3Vyc2l2IgorCisjOiBleF9kb2NtZC5jOjEyMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiBVbm50YWsgaWtrZSBmYW5nZXQgb3BwOiAlcyIKKworIzogZXhfZG9jbWQuYzoxMzIwCittc2dpZCAiRW5kIG9mIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiU2x1dHQgcOUga2r4cnQgZmlsIgorCisjOiBleF9kb2NtZC5jOjEzMjEKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIlNsdXR0IHDlIGZ1bmtzam9uIgorCisjOiBleF9kb2NtZC5jOjE5MTAKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiBGbGVydHlkaWcgYnJ1ayBhdiBicnVrZXJkZWZpbmVydCBrb21tYW5kbyIKKworIzogZXhfZG9jbWQuYzoxOTI0Cittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFNDkyOiBFciBpa2tlIGVuIGVkaXRvcmtvbW1hbmRvIgorCisjOiBleF9kb2NtZC5jOjIwMzEKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IE9tcuVkZSBiYWtvdmVyIGVyIGFuZ2l0dCIKKworIzogZXhfZG9jbWQuYzoyMDQwCittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJPbXLlZGUgYmFrb3ZlciBlciBhbmdpdHQsIE9LIOUgc3dhcHBlIgorCisjOiBleF9kb2NtZC5jOjIxNjMKK21zZ2lkICJFNDk0OiBVc2UgdyBvciB3Pj4iCittc2dzdHIgIkU0OTQ6IEJydWsgdyBlbGxlciB3Pj4iCisKKyM6IGV4X2RvY21kLmM6Mzc4OQorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogS29tbWFuZG9lbiBlciBpa2tlIHRpbGdqZW5nZWxpZyBpIGRlbm5lIHZlcnNqb25lbiIKKworIzogZXhfZG9jbWQuYzozOTkyCittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IEJhcmUgZXR0IGZpbG5hdm4gdGlsbGF0dCIKKworIzogZXhfZG9jbWQuYzo0NTcyCittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiMSBhbm5lbiBmaWwg5SByZWRpZ2VyZS4gQXZzbHV0dCBsaWtldmVsPyIKKworIzogZXhfZG9jbWQuYzo0NTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiJWQgYW5kcmUgZmlsZXIg5SByZWRpZ2VyZS4gQXZzbHV0dCBsaWtldmVsPyIKKworIzogZXhfZG9jbWQuYzo0NTgyCittc2dpZCAiRTE3MzogMSBtb3JlIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogMSBhbm5lbiBmaWwg5SByZWRpZ2VyZSIKKworIzogZXhfZG9jbWQuYzo0NTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6ICVsZCBhbmRyZSBmaWxlciDlIHJlZGlnZXJlIgorCisjOiBleF9kb2NtZC5jOjQ2NzkKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTc0OiBLb21tYW5kb2VuIGZpbm5lcyBhbGxlcmVkZTogTGVnZyB0aWwgISBmb3Ig5SBlcnN0YXR0ZSBkZW4iCisKKyM6IGV4X2RvY21kLmM6NDc5MAorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICBOYXZuICAgICAgICBQcm0uIE9tcuVkIEZ1bGxm+HIgICBEZWZpbmVyaW5nIgorCisjOiBleF9kb2NtZC5jOjQ4NzkKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIkluZ2VuIGJydWtlcmRlZmluZXJ0ZSBrb21tYW5kb2VyIGZ1bm5ldCIKKworIzogZXhfZG9jbWQuYzo0OTExCittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTogSW5nZW4gYXR0cmlidXR0IHNwZXNpZmlzZXJ0IgorCisjOiBleF9kb2NtZC5jOjQ5NjMKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IFVneWxkaWcgYW50YWxsIHBhcmFtZXRlcmUiCisKKyM6IGV4X2RvY21kLmM6NDk3OAorbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IEFudGFsbCByZXBldGVyaW5nZXIga2FuIGlra2UgYmxpIHNwZXNpZmlzZXJ0IHRvIGdhbmdlciIKKworIzogZXhfZG9jbWQuYzo0OTg4Cittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogVWd5bGRpZyBzdGFuZGFyZHZlcmRpIGZvciBhbnRhbGwgcmVwZXRlcmluZ2VyIgorCisjOiBleF9kb2NtZC5jOjUwMTkKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IFRyZW5nZXIgcGFyYW1ldGVyIHRpbCBcImNvbXBsZXRlXCIiCisKKyM6IGV4X2RvY21kLmM6NTA1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDogVWd5bGRpZyBcImNvbXBsZXRlXCItdmVyZGk6ICVzIgorCisjOiBleF9kb2NtZC5jOjUwNjAKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIkU0Njg6IEZ1bGxm+HJpbmdzcGFyYW1ldGVyIGVyIGJhcmUgdGlsbGF0dCBmb3IgdGlscGFzc2V0IGZ1bGxm+HJpbmciCisKKyM6IGV4X2RvY21kLmM6NTA2NgorbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIkU0Njc6IFRpbHBhc3NlZGUgZnVsbGb4cmluZ2VyIHRyZW5nZXIgZXQgZnVua3Nqb25zcGFyYW1ldGVyIgorCisjOiBleF9kb2NtZC5jOjUwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiBVZ3lsZGlnIGF0dHJpYnV0dDogJXMiCisKKyM6IGV4X2RvY21kLmM6NTEyMAorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBVZ3lsZGlnIGtvbW1hbmRvbmF2biIKKworIzogZXhfZG9jbWQuYzo1MTM1Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBCcnVrZXJkZWZpbmVydGUga29tbWFuZG9lciBt5SBoYSBzdG9yIGZvcmJva3N0YXYiCisKKyM6IGV4X2RvY21kLmM6NTIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogQnJ1a2VyZGVmaW5lcnQga29tbWFuZG8gZmlubmVzIGlra2U6ICVzIgorCisjOiBleF9kb2NtZC5jOjU2NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBLYW4gaWtrZSBmaW5uZSBmYXJnZW9wcHNldHRldCAlcyIKKworIzogZXhfZG9jbWQuYzo1Njc1Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIlbmciBoaWxzZXQsIFZpbS1icnVrZXIhIgorCisjOiBleF9kb2NtZC5jOjYzOTYKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiUmVkaWdlciBmaWwgaSBueXR0IHZpbmR1IgorCisjOiBleF9kb2NtZC5jOjY2OTcKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIkluZ2VuIHN3YXBmaWwiCisKKyM6IGV4X2RvY21kLmM6NjgwMQorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJMZWdnIHRpbCBmaWwiCisKKyM6IGV4X2RvY21kLmM6Njg2NQorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4NjogSW5nZW4gdGlkbGlnZXJlIGthdGFsb2ciCisKKyM6IGV4X2RvY21kLmM6Njk0NworbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IFVramVudCIKKworIzogZXhfZG9jbWQuYzo3MDMyCittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IDp3aW5zaXplIHRyZW5nZXIgdG8gbnVtZXJpc2tlIHBhcmFtZXRlcmUiCisKKyM6IGV4X2RvY21kLmM6NzA4OAorIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIlZpbmR1c3Bvc2lzam9uOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjcwOTMKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiIgorIkUxODg6IExlc2luZyBhdiB2aW5kdXNwb3Npc2pvbiBlciBpa2tlIGltcGxlbWVudGVydCBw5SBkZW5uZSBwbGF0dGZvcm1lbiIKKworIzogZXhfZG9jbWQuYzo3MTAzCittc2dpZCAiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NjogOndpbnBvcyB0cmVuZ2VyIHRvIG51bWVyaXNrZSBwYXJhbWV0ZXJlIgorCisjOiBleF9kb2NtZC5jOjczODEKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICJMYWdyZSBvbWRpcmlnZXJpbmciCisKKyM6IGV4X2RvY21kLmM6NzU3MQorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiTGFncmUgdXRzZWVuZGUiCisKKyM6IGV4X2RvY21kLmM6NzU3MgorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiTGFncmUg+Gt0IgorCisjOiBleF9kb2NtZC5jOjc1NzQKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJMYWdyZSBvcHBzZXR0IgorCisjOiBleF9kb2NtZC5jOjc3MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgZmlubmVzIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGV4X2RvY21kLmM6NzczMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6IEthbiBpa2tlIOVwbmUgXCIlc1wiIGZvciBza3JpdmluZyIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Nzc1NQorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogUGFyYW1ldGVyIG3lIHbmcmUgZW4gYm9rc3RhdiBlbGxlciB2YW5saWcvYmFrbGVuZ3MgYXBvc3Ryb2YiCisKKyM6IGV4X2RvY21kLmM6Nzc5NworbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogUmVrdXJzaXYgYnJ1ayBhdiA6bm9ybWFsIGVyIGZvciBkeXAiCisKKyM6IGV4X2RvY21kLmM6ODMxNQorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiBJbmdlbiBhbHRlcm5hdGl2ZSBmaWxuYXZuIHRpbGdqZW5nZWxpZyBzb20gZXJzdGF0bmluZyBmb3IgJyMnIgorCisjOiBleF9kb2NtZC5jOjgzNDYKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIiIKKyJFNDk1OiBJbmdlbiBhdXRva29tbWFuZG9maWxuYXZuIHRpbGdqZW5nZWxpZyBzb20gZXJzdGF0bmluZyBmb3IgXCI8YWZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM1NAorbXNnaWQgIkU0OTY6IG5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAiIgorIkU0OTY6IEluZ2VuIGJ1ZmZlcm51bW1lciB0aWxnamVuZ2VsaWcgc29tIGVyc3RhdG5pbmcgZm9yIFwiPGFidWY+XCIgaSAiCisiYXV0b2tvbW1hbmRvIgorCisjOiBleF9kb2NtZC5jOjgzNjUKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiIgorIkU0OTc6IEluZ2VuIGF1dG9rb21tYW5kb25hdm4gdGlsZ2plbmdlbGlnIHNvbSBlcnN0YXRuaW5nIGZvciBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM3NQorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICIiCisiRTQ5ODogSW5nZW4gJzpzb3VyY2UnLWZpbG5hdm4gdGlsZ2plbmdlbGlnIHNvbSBlcnN0YXRuaW5nIGZvciBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo4NDE2CisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiBUb210IGZpbG5hdm4gZm9yICclJyBlbGxlciAnIycsIHZpcmtlciBiYXJlIG1lZCBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo4NDE4Cittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDogUmVzdWx0ZXJlciBpIGVuIHRvbSBzdHJlbmciCisKKyM6IGV4X2RvY21kLmM6OTM4OQorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogS2FuIGlra2Ug5XBuZSB2aW1pbmZvLWZpbCBmb3IgbGVzaW5nIgorCisjOiBleF9kb2NtZC5jOjk1NjIKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IEluZ2VuIHNwZXNpYWx0ZWduIGkgZGVubmUgdmVyc2pvbmVuIgorCisjOiBleF9ldmFsLmM6NDQwCittc2dpZCAiRTYwODogQ2Fubm90IDp0aHJvdyBleGNlcHRpb25zIHdpdGggJ1ZpbScgcHJlZml4IgorbXNnc3RyICJFNjA4OiBLYW4gaWtrZSA6dGhyb3cgdW5udGFrIG1lZCAnVmltJy1mb3JzdGF2ZWxzZSIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTI5CisjLCBjLWZvcm1hdAorI34gbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorI34gbXNnc3RyICIiCisKKyM6IGV4X2V2YWwuYzo1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAiVW5udGFrIGZ1bGxm+HJ0OiAlcyIKKworIzogZXhfZXZhbC5jOjU3NworIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZGlzY2FyZGVkOiAlcyIKK21zZ3N0ciAiVW5udGFrIGZvcmthc3RldDogJXMiCisKKyM6IGV4X2V2YWwuYzo2MjAgZXhfZXZhbC5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCBsaW5qZSAlbGQiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gY2F1Z2h0OiAlcyIKK21zZ3N0ciAiVW5udGFrIGZhbmdldCBvcHA6ICVzIgorCisjOiBleF9ldmFsLmM6NzEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG1hZGUgcGVuZGluZyIKK21zZ3N0ciAiJXMgc2F0dCBw5SB2ZW50aW5nIgorCisjOiBleF9ldmFsLmM6NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJlc3VtZWQiCittc2dzdHIgIiVzIGdqZW5vcHB0YXR0IgorCisjOiBleF9ldmFsLmM6NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMgZm9ya2FzdGV0IgorCisjOiBleF9ldmFsLmM6NzQ2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICJVbm50YWsiCisKKyM6IGV4X2V2YWwuYzo3NTIKK21zZ2lkICJFcnJvciBhbmQgaW50ZXJydXB0IgorbXNnc3RyICJGZWlsIG9nIGF2YnJ1ZGQiCisKKyM6IGV4X2V2YWwuYzo3NTQgZ3VpLmM6NDM4NAorbXNnaWQgIkVycm9yIgorbXNnc3RyICJGZWlsIgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAiQXZicnVkZCIKKworIzogZXhfZXZhbC5jOjgzMAorbXNnaWQgIkU1Nzk6IDppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTc5OiBO+HN0aW5nIGF2IDppZiBmb3IgZHlwIgorCisjOiBleF9ldmFsLmM6ODY3Cittc2dpZCAiRTU4MDogOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgwOiA6ZW5kaWYgdXRlbiA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2UgdXRlbiA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MTQKK21zZ2lkICJFNTgyOiA6ZWxzZWlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgyOiA6ZWxzZWlmIHV0ZW4gOmlmIgorCisjOiBleF9ldmFsLmM6OTIxCittc2dpZCAiRTU4MzogbXVsdGlwbGUgOmVsc2UiCittc2dzdHIgIkU1ODM6IEZsZXJlIGZvcmVrb21zdGVyIGF2IDplbHNlIgorCisjOiBleF9ldmFsLmM6OTI0Cittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogOmVsc2VpZiBldHRlciA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjk5MQorbXNnaWQgIkU1ODU6IDp3aGlsZSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTg1OiBO+HN0aW5nIGF2IDp3aGlsZSBmb3IgZHlwIgorCisjOiBleF9ldmFsLmM6MTA0NworbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOmNvbnRpbnVlIHV0ZW4gOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTA4NworbXNnaWQgIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NzogOmJyZWFrIHV0ZW4gOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTI4NgorbXNnaWQgIkU2MDE6IDp0cnkgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTYwMTogTvhzdGluZyBhdiA6dHJ5IGZvciBkeXAiCisKKyM6IGV4X2V2YWwuYzoxMzY2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOmNhdGNoIHV0ZW4gOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjLiAqIEp1c3QgcGFyc2UuCisjOiBleF9ldmFsLmM6MTM4OAorbXNnaWQgIkU2MDQ6IDpjYXRjaCBhZnRlciA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNDogOmNhdGNoIGV0dGVyIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgdXRlbiA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNTQ1Cittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IEZsZXJlIGZvcmVrb21zdGVyIGF2IDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTY1NAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6ZW5kdHJ5IHV0ZW4gOnRyeSIKKworIzogZXhfZXZhbC5jOjE5ODYKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiA6ZW5kZnVuY3Rpb24gZXIgaWtrZSBpbm5lbmZvciBlbiBmdW5rc2pvbiIKKworIzogZXhfZ2V0bG4uYzozMjk5Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAibmF2biBw5SB0YWciCisKKyM6IGV4X2dldGxuLmM6MzMwMgorI34gbXNnaWQgIiBraW5kIGZpbGVcbiIKKyN+IG1zZ3N0ciAiIgorCisjOiBleF9nZXRsbi5jOjQ3NjgKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIidoaXN0b3J5Jy12YWxnZXQgZXIgbnVsbCIKKworIzogZXhfZ2V0bG4uYzo1MDM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcy1oaXN0b3JpZSAobnllc3RlIHRpbCBlbGRzdGUpOlxuIgorCisjOiBleF9nZXRsbi5jOjUwNDAKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgIktvbW1hbmRvbGluamUiCisKKyM6IGV4X2dldGxuLmM6NTA0MQorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgIlP4a2VzdHJlbmciCisKKyM6IGV4X2dldGxuLmM6NTA0MgorbXNnaWQgIkV4cHJlc3Npb24iCittc2dzdHIgIlV0dHJ5a2siCisKKyM6IGV4X2dldGxuLmM6NTA0MworbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIklubmRhdGFsaW5qZSIKKworIzogZXhfZ2V0bG4uYzo1MDgxCittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciB1dGVuZm9yIGtvbW1hbmRvbGVuZ2RlbiIKKworIzogZXhfZ2V0bG4uYzo1MjU4Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogQWt0aXZ0IHZpbmR1IGVsbGVyIGJ1ZmZlciBzbGV0dGV0IgorCisjOiBmaWxlaW8uYzozNzgKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiVWxvdmxpZyBmaWxuYXZuIgorCisjOiBmaWxlaW8uYzo0MDIgZmlsZWlvLmM6NTQwIGZpbGVpby5jOjI5MjUgZmlsZWlvLmM6Mjk2NgorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJlciBlbiBrYXRhbG9nIgorCisjOiBmaWxlaW8uYzo0MDQKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJlciBpa2tlIGVuIGZpbCIKKworIzogZmlsZWlvLmM6NTYyIGZpbGVpby5jOjQxNDMKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbTnkgZmlsXSIKKworIzogZmlsZWlvLmM6NTk1Cittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW1RpbGdhbmcgbmVrdGV0XSIKKworIzogZmlsZWlvLmM6NzA2Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogXCIqUmVhZFByZVwiLWF1dG9rb21tYW5kb2VyIGdqb3JkZSBmaWxlbiB1bGVzZWxpZyIKKworIzogZmlsZWlvLmM6NzA4Cittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogXCIqUmVhZFByZVwiLWF1dG9rb21tYW5kb2VyIG3lIGlra2UgZm9yYW5kcmUgbuV25nJlbmRlIGJ1ZmZlciIKKworIzogZmlsZWlvLmM6NzI5Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiBMZXNlciBmcmEgc3RkaW6gLi4uXG4iCisKKyM6IGZpbGVpby5jOjczNQorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAiTGVzZXIgZnJhIHN0ZGluoC4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzoxMDEyCittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IEtvbnZlcnRlcmluZ2VuIGdqb3JkZSBmaWxlbiB1bGVzZWxpZyEiCisKKyM6IGZpbGVpby5jOjIxMDIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoyMTA5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjIxMTYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjIxMjQKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbU0JdIgorCisjOiBmaWxlaW8uYzoyMTM0Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbQ1IgbWFuZ2xlcl0iCisKKyM6IGZpbGVpby5jOjIxMzkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbTkwgZnVubmV0XSIKKworIzogZmlsZWlvLmM6MjE0NAorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW2xhbmdlIGxpbmplciBzcGxpdHRlc10iCisKKyM6IGZpbGVpby5jOjIxNTAgZmlsZWlvLmM6NDEyNworbXNnaWQgIltOT1QgY29udmVydGVkXSIKK21zZ3N0ciAiW0lLS0Uga29udmVydGVydF0iCisKKyM6IGZpbGVpby5jOjIxNTUgZmlsZWlvLmM6NDEzMgorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJba29udmVydGVydF0iCisKKyM6IGZpbGVpby5jOjIxNjIgZmlsZWlvLmM6NDE1NworbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW2tyeXB0ZXJ0XSIKKworIzogZmlsZWlvLmM6MjE2OQorbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW0tPTlZFUlRFUklOR1NGRUlMXSIKKworIzogZmlsZWlvLmM6MjE3NQorIywgYy1mb3JtYXQKK21zZ2lkICJbSUxMRUdBTCBCWVRFIGluIGxpbmUgJWxkXSIKK21zZ3N0ciAiW1VMT1ZMSUcgQllURSBpIGxpbmplICVsZF0iCisKKyM6IGZpbGVpby5jOjIxODIKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbTEVTRUZFSUxdIgorCisjOiBmaWxlaW8uYzoyMzk4Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIkthbiBpa2tlIGZpbm5lIG1pZGxlcnRpZGlnIGZpbCBmb3Iga29udmVydGVyaW5nIgorCisjOiBmaWxlaW8uYzoyNDA1Cittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICJLb252ZXJ0ZXJpbmcgbWVkICdjaGFyY29udmVydCcgZmVpbGV0IgorCisjOiBmaWxlaW8uYzoyNDA4Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAiS2FuIGlra2UgbGVzZSB1dGRhdGEgZnJhICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI4MDgKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogQXV0b2tvbW1hbmRvZXIgc2xldHRldCBlbGxlciBsYXN0ZXQgdXQgYnVmZmVyIHNvbSBza3VsbGUgbGFncmVzIgorCisjOiBmaWxlaW8uYzoyODMxCittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IEF1dG9rb21tYW5kbyBmb3JhbmRyZXQgbGluamVhbnRhbGwgcOUgZW4gdXZlbnRldCBt5XRlIgorCisjOiBmaWxlaW8uYzoyODY5Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyBmb3JieXIgbGFncmluZyBhdiBidWZmZXJlIHNvbSBpa2tlIGVyIGZvcmFuZHJldCIKKworIzogZmlsZWlvLmM6Mjg3NworbXNnaWQgIlBhcnRpYWwgd3JpdGVzIGRpc2FsbG93ZWQgZm9yIE5ldEJlYW5zIGJ1ZmZlcnMiCittc2dzdHIgIkRlbHZpcyBsYWdyaW5nIGlra2UgdGlsbGF0dCBmb3IgTmV0QmVhbnMtYnVmZmVyZSIKKworIzogZmlsZWlvLmM6MjkzMSBmaWxlaW8uYzoyOTQ5Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgImVyIGlra2UgZW4gZmlsIGVsbGVyIHNrcml2YmFyIGVuaGV0IgorCisjOiBmaWxlaW8uYzozMDAxCittc2dpZCAiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgImVyIHNrcml2ZWJlc2t5dHRldCAobGVnZyB0aWwgISBmb3Ig5SBvdmVyc3R5cmUpIgorCisjOiBmaWxlaW8uYzozMzQ3Cittc2dpZCAiRTUwNjogQ2FuJ3Qgd3JpdGUgdG8gYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNjogS2FuIGlra2Ugc2tyaXZlIHRpbCBiYWNrdXBmaWwgKGxlZ2cgdGlsICEgZm9yIOUgb3ZlcnN0eXJlKSIKKworIzogZmlsZWlvLmM6MzM1OQorbXNnaWQgIkU1MDc6IENsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA3OiBGZWlsIHVuZGVyIGx1a2tpbmcgYXYgYmFja3VwZmlsIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGZpbGVpby5jOjMzNjEKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiBLYW4gaWtrZSBsZXNlIGZpbCBmb3IgYmFja3VwIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGZpbGVpby5jOjMzNzcKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IEthbiBpa2tlIGxlc2UgYmFja3VwZmlsIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGZpbGVpby5jOjM0ODAKK21zZ2lkICJFNTEwOiBDYW4ndCBtYWtlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MTA6IEthbiBpa2tlIGxhZ2UgYmFja3VwZmlsIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGZpbGVpby5jOjM1NDIKK21zZ2lkICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NjA6IFJlc3N1cnNmb3JncmVuaW5nZW4gdmlsbGUgZ+V0dCB0YXB0IChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGZpbGVpby5jOjM2NTIKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogS2FuIGlra2UgZmlubmUgbWlkbGVydGlkaWcgZmlsIGZvciBza3JpdmluZyIKKworIzogZmlsZWlvLmM6MzY3MAorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0IChhZGQgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiBLYW4gaWtrZSBrb252ZXJ0ZXJlIChsZWdnIHRpbCAhIGZvciDlIGxhZ3JlIHV0ZW4ga29udmVydGVyaW5nKSIKKworIzogZmlsZWlvLmM6MzcwNQorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IEthbiBpa2tlIOVwbmUgbGVua2V0IGZpbCBmb3Igc2tyaXZpbmciCisKKyM6IGZpbGVpby5jOjM3MDkKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IEthbiBpa2tlIOVwbmUgZmlsIGZvciBza3JpdmluZyIKKworIzogZmlsZWlvLmM6Mzk3MQorbXNnaWQgIkU2Njc6IEZzeW5jIGZhaWxlZCIKK21zZ3N0ciAiRTY2NzogRnN5bmMgZmVpbGV0IgorCisjOiBmaWxlaW8uYzozOTc4Cittc2dpZCAiRTUxMjogQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJFNTEyOiBMdWtraW5nIGZlaWxldCIKKworIzogZmlsZWlvLmM6NDA0OQorbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzogRmVpbCB1bmRlciBza3JpdmluZywga29udmVydGVyaW5nIGZlaWxldCIKKworIzogZmlsZWlvLmM6NDA1NQorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IEZlaWwgdW5kZXIgbGFncmluZyAoZnVsbCBkaXNrPykiCisKKyM6IGZpbGVpby5jOjQxMjIKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIEtPTlZFUlRFUklOR1NGRUlMIgorCisjOiBmaWxlaW8uYzo0MTM4Cittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIltFbmhldF0iCisKKyM6IGZpbGVpby5jOjQxNDMKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW055XSIKKworIzogZmlsZWlvLmM6NDE2NQorbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbbF0iCisKKyM6IGZpbGVpby5jOjQxNjUKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiBsYWd0IHRpbCIKKworIzogZmlsZWlvLmM6NDE2NworbXNnaWQgIiBbd10iCittc2dzdHIgIiBbc10iCisKKyM6IGZpbGVpby5jOjQxNjcKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIHNrcmV2ZXQiCisKKyM6IGZpbGVpby5jOjQyMTcKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTogUGF0Y2htb2RlOiBLYW4gaWtrZSBsYWdyZSBvcmlnaW5hbGZpbCIKKworIzogZmlsZWlvLmM6NDIzOQorbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogcGF0Y2htb2RlOiBLYW4gaWtrZSBvcHBkYXRlcmUgdG9tIG9yaWdpbmFsZmlsIgorCisjOiBmaWxlaW8uYzo0MjU0Cittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiBLYW4gaWtrZSBzbGV0dGUgYmFja3VwZmlsIgorCisjOiBmaWxlaW8uYzo0MzE4Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisiQURWQVJTRUw6IE9yaWdpbmFsZmlsZW4ga2FuIGJsaSB0YXB0IGVsbGVyIPhkZWxhZ3RcbiIKKworIzogZmlsZWlvLmM6NDMyMAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgImlra2UgYXZzbHV0dCBlZGl0b3JlbiBm+HIgZmlsZW4gZXIgc2tpa2tlbGlnIGxhZ3JldCEiCisKKyM6IGZpbGVpby5jOjQ0MDkKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjQ0MDkKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MtZm9ybWF0XSIKKworIzogZmlsZWlvLmM6NDQxNgorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6NDQxNgorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYy1mb3JtYXRdIgorCisjOiBmaWxlaW8uYzo0NDIzCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQ0MjMKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peC1mb3JtYXRdIgorCisjOiBmaWxlaW8uYzo0NDUwCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgbGluamUsICIKKworIzogZmlsZWlvLmM6NDQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIGxpbmplciwgIgorCisjOiBmaWxlaW8uYzo0NDU1Cittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgIjEgdGVnbiIKKworIzogZmlsZWlvLmM6NDQ1NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhcmFjdGVycyIKK21zZ3N0ciAiJWxkIHRlZ24iCisKKyM6IGZpbGVpby5jOjQ0NjcKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbaW5nZW5saW5qZXNsdXR0XSIKKworIzogZmlsZWlvLmM6NDQ2NworbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIltVZnVsbHN0ZW5kaWcgc2lzdGVsaW5qZV0iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDQ4NgorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiQURWQVJTRUw6IEZpbGVuIGVyIGJsaXR0IGZvcmFuZHJldCBzaWRlbiBkZW4gYmxlIGxlc3QhISEiCisKKyM6IGZpbGVpby5jOjQ0ODgKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIlZpbCBkdSB2aXJrZWxpZyBza3JpdmUgdGlsIGRlbiIKKworIzogZmlsZWlvLmM6NTczOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogRmVpbCB1bmRlciBza3JpdmluZyB0aWwgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiBGZWlsIHVuZGVyIGx1a2tpbmcgYXYgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBGZWlsIHVuZGVyIGxlc2luZyBhdiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU5ODIKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiBBdXRva29tbWFuZG9lbiBcIkZpbGVDaGFuZ2VkU2hlbGxcIiBzbGV0dGV0IGJ1ZmZlciIKKworIzogZmlsZWlvLmM6NTk4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiBBZHZhcnNlbDogRmlsZW4gXCIlc1wiIGVyIGlra2UgbGVuZ2VyIHRpbGdqZW5nZWxpZyIKKworIzogZmlsZWlvLmM6NjAwMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIiIKKyJXMTI6IEFkdmFyc2VsOiBGaWxlbiBcIiVzXCIgZXIgZm9yYW5kcmV0IG9nIGJ1ZmZlcmVuIHZhciBvZ3PlIGZvcmFuZHJldCBpIFZpbSIKKworIzogZmlsZWlvLmM6NjAwNgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBBZHZhcnNlbDogRmlsZW4gXCIlc1wiIGVyIGZvcmFuZHJldCBzaWRlbiByZWRpZ2VyaW5nZW4gc3RhcnRldCIKKworIzogZmlsZWlvLmM6NjAwOAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzE2OiBBZHZhcnNlbDogUmV0dGlnaGV0ZW5lIHRpbCBmaWxlbiBcIiVzXCIgZXIgZm9yYW5kcmV0IHNpZGVuIHJlZGlnZXJpbmdlbiAiCisic3RhcnRldCIKKworIzogZmlsZWlvLmM6NjAxOAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzEzOiBBZHZhcnNlbDogRmlsZW4gXCIlc1wiIGVyIGJsaXR0IG9wcHJldHRldCBldHRlciBhdCByZWRpZ2VyaW5nZW4gc3RhcnRldCIKKworIzogZmlsZWlvLmM6NjAzMQorbXNnaWQgIlNlZSBcIjpoZWxwIFcxMVwiIGZvciBtb3JlIGluZm8uIgorbXNnc3RyICJTZSBcIjpoZWxwIFcxMVwiIGZvciBtZXIgaW5mb3JtYXNqb24uIgorCisjOiBmaWxlaW8uYzo2MDQ1Cittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAiQWR2YXJzZWwiCisKKyM6IGZpbGVpby5jOjYwNDYKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIiZPS1xuIgorIibFcG5lIGZpbCIKKworIzogZmlsZWlvLmM6NjE1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2MjogS3VubmUgaWtrZSBmb3JiZXJlZGUgZm9yIHJlbGFzdGluZyBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjYxNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IEt1bm5lIGlra2UgbGFzdGUgXCIlc1wiIHDlIG55dHQiCisKKyM6IGZpbGVpby5jOjY3NTIKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS1TbGV0dGV0LS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2OTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogR3J1cHBlbiBmaW5uZXMgaWtrZTogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3MDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBVbG92bGlnIHRlZ24gZXR0ZXIgKjogJXMiCisKKyM6IGZpbGVpby5jOjcwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IEhhbmRsaW5nZW4gZmlubmVzIGlra2U6ICVzIgorCisjOiBmaWxlaW8uYzo3MDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZ3JvdXAgb3IgZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiBHcnVwcGVuIGVsbGVyIGhhbmRsaW5nZW4gZmlubmVzIGlra2U6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcyMTAKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9rb21tYW5kb2VyIC0tLSIKKworIzogZmlsZWlvLmM6NzQ4MQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBLYW4gaWtrZSB1dGb4cmUgYXV0b2tvbW1hbmRvZXIgZm9yIEFMTEUgaGVuZGVsc2VyIgorCisjOiBmaWxlaW8uYzo3NTA0Cittc2dpZCAiTm8gbWF0Y2hpbmcgYXV0b2NvbW1hbmRzIgorbXNnc3RyICJJbmdlbiBzYW1zdmFyZW5kZSBhdXRva29tbWFuZG9lciIKKworIzogZmlsZWlvLmM6NzgyNQorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IE74c3RpbmcgYXYgYXV0b2tvbW1hbmRvZXIgZm9yIGR5cCIKKworIzogZmlsZWlvLmM6ODEwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG9rb21tYW5kb2VyIGZvciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjgxMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJVdGb4cmVyICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjgxNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9rb21tYW5kbyAlcyIKKworIzogZmlsZWlvLmM6ODc0MworbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIkUyMTk6IE1hbmdsZXIgey4iCisKKyM6IGZpbGVpby5jOjg3NDUKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiBNYW5nbGVyIH0uIgorCisjOiBmb2xkLmM6NjgKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiBJbmdlbiBmb2xkIGZ1bm5ldCIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBLYW4gaWtrZSBsYWdlIGZvbGQgbWVkIG7lduZyZW5kZSAnZm9sZG1ldGhvZCciCisKKyM6IGZvbGQuYzo1OTUKK21zZ2lkICJFMzUxOiBDYW5ub3QgZGVsZXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MTogS2FuIGlra2Ugc2xldHRlIGZvbGQgbWVkIG7lduZyZW5kZSAnZm9sZG1ldGhvZCciCisKKyM6IGdldGNoYXIuYzoyNDgKKyN+IG1zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCisjfiBtc2dzdHIgIiIKKworIzogZ2V0Y2hhci5jOjIyMDgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogUmVrdXJzaXYgbWFwcGluZyIKKworIzogZ2V0Y2hhci5jOjMwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6IEdsb2JhbCBmb3Jrb3J0ZWxzZSBmaW5uZXMgYWxsZXJlZGUgZm9yICVzIgorCisjOiBnZXRjaGFyLmM6MzA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6IEdsb2JhbCBtYXBwaW5nIGZpbm5lcyBhbGxlcmVkZSBmb3IgJXMiCisKKyM6IGdldGNoYXIuYzozMjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjY6IGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjY6IEZvcmtvcnRlbHNlIGZpbm5lcyBhbGxlcmVkZSBmb3IgJXMiCisKKyM6IGdldGNoYXIuYzozMjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiBNYXBwaW5nZW4gZmlubmVzIGFsbGVyZWRlIGZvciAlcyIKKworIzogZ2V0Y2hhci5jOjMyODkKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIkluZ2VuIGZvcmtvcnRlbHNlIGZ1bm5ldCIKKworIzogZ2V0Y2hhci5jOjMyOTEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICJJbmdlbiBtYXBwaW5nIGZ1bm5ldCIKKworIzogZ2V0Y2hhci5jOjQxODMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IFVsb3ZsaWcgbW9kdXMiCisKKyM6IGd1aS5jOjIyMAorbXNnaWQgIkUyMjk6IENhbm5vdCBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFMjI5OiBLYW4gaWtrZSBzdGFydGUgZ3JhZmlzayBicnVrZXJncmVuc2Vzbml0dCAoR1VJKSIKKworIzogZ3VpLmM6MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBLYW4gaWtrZSBsZXNlIGZyYSBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIiIKKyJFNjY1OiBLYW4gaWtrZSBzdGFydGUgZ3JhZmlzayBicnVrZXJncmVuc2Vzbml0dCwgZmFudCBpbmdlbiBneWxkaWcgZm9udCIKKworIzogZ3VpLmM6NDc3Cittc2dpZCAiRTIzMTogJ2d1aWZvbnR3aWRlJyBpbnZhbGlkIgorbXNnc3RyICJFMjMxOiAnZ3VpZm9udHdpZGUnIHVneWxkaWciCisKKyM6IGd1aS5jOjU0NworbXNnaWQgIkU1OTk6IFZhbHVlIG9mICdpbWFjdGl2YXRla2V5JyBpcyBpbnZhbGlkIgorbXNnc3RyICJFNTk5OiBWZXJkaWVuIGZvciAnaW1hY3RpdmF0ZWtleScgZXIgdWd5bGRpZyIKKworIzogZ3VpLmM6NDA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IEthbiBpa2tlIHJlc2VydmVyZSBmYXJnZSAlcyIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjxrYW4gaWtrZSDlcG5lPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogS2FuIGlra2UgYnJ1a2Ugc2tyaWZ0dHlwZW4gJXMiCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiB2aW1fU2VsRmlsZTogS2FuIGlra2UgcmV0dXJuZXJlIHRpbCBu5XbmcmVuZGUga2F0YWxvZyIKKworIzogZ3VpX2F0X2ZzLmM6MjgwMQorbXNnaWQgIlBhdGhuYW1lOiIKK21zZ3N0ciAiU3RpOiIKKworIzogZ3VpX2F0X2ZzLmM6MjgwNworbXNnaWQgIkU2MTU6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTU6IHZpbV9TZWxGaWxlOiBLYW4gaWtrZSBmaW5uZSBu5XbmcmVuZGUga2F0YWxvZyIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNzMxIGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQXZicnl0IgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlJ1bGxlZmVsdGVsZW1lbnQ6IEtsYXJ0ZSBpa2tlIGhlbnRlIGRpbWVuc2pvbmVyIHDlIFwidGh1bWIgcGl4bWFwXCIuIgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiRGlhbG9ndmluZHUgZm9yIFZpbSIKKworIzogZ3VpX2JldmFsLmM6MTAxIGd1aV93MzIuYzozOTc4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IEthbiBpa2tlIGxhZ2UgQmFsbG9vbkV2YWwgbWVkIGLlZGUgbWVsZGluZyBvZyB0aWxiYWtla2FsbCIKKworIzogZ3VpX2d0ay5jOjE2MDcKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gZGlhbG9ndmluZHWgLi4uIgorCisjOiBndWlfZ3RrLmM6MjA2MCBtZXNzYWdlLmM6Mjk5OQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZKYVxuIgorIiZOZWlcbiIKKyImQXZicnl0IgorCisjOiBndWlfZ3RrLmM6MjI2OAorI34gbXNnaWQgIklucHV0IF9NZXRob2RzIgorI34gbXNnc3RyICIiCisKKyM6IGd1aV9ndGsuYzoyNTM0IGd1aV9tb3RpZi5jOjI3NjgKK21zZ2lkICJWSU0gLSBTZWFyY2ggYW5kIFJlcGxhY2UuLi4iCittc2dzdHIgIlZJTSAtIFP4ayBvZyBlcnN0YXR0oC4uLiIKKworIzogZ3VpX2d0ay5jOjI1NDIgZ3VpX21vdGlmLmM6Mjc3MAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gU/hroC4uLiIKKworIzogZ3VpX2d0ay5jOjI1NzQgZ3VpX21vdGlmLmM6Mjg4OAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIkZpbm4gaHZhOiIKKworIzogZ3VpX2d0ay5jOjI1OTIgZ3VpX21vdGlmLmM6MjkyMAorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIkVyc3RhdHQgbWVkOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAiRmlubiBrdW4gaGVsZSBvcmQiCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYzNSBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAiRm9yc2tqZWxsIHDlIHN0b3JlL3Nt5SBib2tzdGF2ZXIiCisKKyM6IGd1aV9ndGsuYzoyNjQ1IGd1aV9tb3RpZi5jOjI5OTAKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIlJldG5pbmciCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjY1NyBndWlfbW90aWYuYzozMDAyCittc2dpZCAiVXAiCittc2dzdHIgIk9wcCIKKworIzogZ3VpX2d0ay5jOjI2NjEgZ3VpX21vdGlmLmM6MzAxMAorbXNnaWQgIkRvd24iCittc2dzdHIgIk5lZCIKKworIzogZ3VpX2d0ay5jOjI2ODMgZ3VpX2d0ay5jOjI2ODUgZ3VpX21vdGlmLmM6Mjc5MgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAiRmlubiBuZXN0ZSIKKworIzogZ3VpX2d0ay5jOjI3MDIgZ3VpX2d0ay5jOjI3MDQgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIkVyc3RhdHQiCisKKyM6IGd1aV9ndGsuYzoyNzE1IGd1aV9ndGsuYzoyNzE3IGd1aV9tb3RpZi5jOjI4MjIKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAiRXJzdGF0dCBhbGxlIgorCisjOiBndWlfZ3RrX3gxMS5jOjIzMjcKK21zZ2lkICJWaW06IFJlY2VpdmVkIFwiZGllXCIgcmVxdWVzdCBmcm9tIHNlc3Npb24gbWFuYWdlclxuIgorbXNnc3RyICJWaW06IE1vdHRvayBcImT4XCItZm9yZXNw+HJzZWwgZnJhIPhrdGJlaGFuZGxlcmVuXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOQorbXNnaWQgIlZpbTogTWFpbiB3aW5kb3cgdW5leHBlY3RlZGx5IGRlc3Ryb3llZFxuIgorbXNnc3RyICJWaW06IFV2ZW50ZXQg+GRlbGVnZ2Vsc2UgYXYgaG92ZWR2aW5kdWV0XG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDEzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJWZWxnZSBza3JpZnR0eXBlIgorCisjOiBndWlfZ3RrX3gxMS5jOjYwMzUgdWkuYzoyMTIwCittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiQnJ1a3RlIENVVF9CVUZGRVIwIGlzdGVkZW5mb3IgdG9tdCB2YWxnIgorCisjOiBndWlfbW90aWYuYzoxNjE3IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIkZpbHRlciIKKworIzogZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICJLYXRhbG9nZXIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjEKK21zZ2lkICJIZWxwIgorbXNnc3RyICJIamVscCIKKworIzogZ3VpX21vdGlmLmM6MTYyMgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJGaWxlciIKKworIzogZ3VpX21vdGlmLmM6MTYyNAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiVmFsZyIKKworIzogZ3VpX21vdGlmLmM6MjgzNQorbXNnaWQgIlVuZG8iCittc2dzdHIgIkFuZ3JlIgorCisjOiBndWlfcmlzY29zLmM6OTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTA6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTYxMDogS2FuIGlra2UgbGFzdGUgWmFwLXNrcmlmdHR5cGUgJyVzJyIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkU2MTE6IEthbiBpa2tlIGJydWtlIHNrcmlmdHR5cGUgJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjcwCittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlNlbmRlciBiZXNramVkIG9tIOUgYXZzbHV0dGUgYmFybmVwcm9zZXNzLlxuIgorCisjOiBndWlfdzMyLmM6ODM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NzE6IENhbm5vdCBmaW5kIHdpbmRvdyB0aXRsZSBcIiVzXCIiCittc2dzdHIgIkU2NzE6IEZhbnQgaWtrZSB2aW5kdXRpdHRlbCBcIiVzXCIiCisKKyM6IGd1aV93MzIuYzo4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MzogQXJndW1lbnQgbm90IHN1cHBvcnRlZDogXCItJXNcIjsgVXNlIHRoZSBPTEUgdmVyc2lvbi4iCittc2dzdHIgIkUyNDM6IFBhcmFtZXRlciBpa2tlIHN0+HR0ZXQ6IFwiLSVzXCI7IEJydWsgT0xFLXZlcnNqb25lbi4iCisKKyM6IGd1aV93MzIuYzoxMTAwCittc2dpZCAiRTY3MjogVW5hYmxlIHRvIG9wZW4gd2luZG93IGluc2lkZSBNREkgYXBwbGljYXRpb24iCittc2dzdHIgIkU2NzI6IEtsYXJlciBpa2tlIOVwbmUgdmluZHUgaW5uZSBpIE1ESS1hcHBsaWthc2pvbiIKKworIzogZ3VpX3c0OC5jOjIxNjMKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJGaW5uIHN0cmVuZyAoYnJ1ayAnXFxcXCcgZm9yIOUgZmlubmUgZW4gJ1xcJykiCisKKyM6IGd1aV93NDguYzoyMTg4Cittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiU/hrIG9nIGVyc3RhdHQgKGJydWsgJ1xcXFwnIGZvciDlIGZpbm5lIGVuICdcXCcpIgorCisjOiBndWlfeDExLmM6MTUzNworbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIlZpbSBFNDU4OiBLYW4gaWtrZSByZXNlcnZlcmUgZmFyZ2VrYXJ0LCBub2VuIGZhcmdlciBrYW4gduZyZSBmZWlsIgorCisjOiBndWlfeDExLmM6MjExOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiRTI1MDogU2tyaWZ0dHlwZXIgZm9yIGRlIGb4bGdlbmRlIHRlZ25zZXR0IG1hbmdsZXIgaSBmb250c2V0dCAlczoiCisKKyM6IGd1aV94MTEuYzoyMTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IE5hdm4gcOUgc2tyaWZ0dHlwZXNldHQ6ICVzIgorCisjOiBndWlfeDExLmM6MjE2MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJTa3JpZnR0eXBlbiAnJXMnIGhhciBpa2tlIGtvbnN0YW50IGJyZWRkZSIKKworIzogZ3VpX3gxMS5jOjIxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiBOYXZuIHDlIHNrcmlmdHR5cGVzZXR0OiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MDogJXNcbiIKK21zZ3N0ciAiRm9udDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJGb250MTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVsZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJGb250JWxkLWJyZWRkZSBlciBpa2tlIHRvIGdhbmdlciBicmVkZGVuIGF2IGZvbnQwXG4iCisKKyM6IGd1aV94MTEuYzoyMTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiRm9udDAtYnJlZGRlOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIkZvbnQxLWJyZWRkZTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCisjfiBtc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorI34gbXNnc3RyICIiCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgorbXNnc3RyICJMZWdnIHRpbCBlbiBueSBkYXRhYmFzZSIKKworIzogaWZfY3Njb3BlLmM6NzkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICJGb3Jlc3D4cnNlbCBldHRlciBz+Gtlc3RyZW5nIgorCisjOiBpZl9jc2NvcGUuYzo4MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICJWaXMgZGVubmUgbWVsZGluZ2VuIgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJEcmVwIGVuIGZvcmJpbmRlbHNlIgorCisjOiBpZl9jc2NvcGUuYzo4NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlJlaW5pdGlhbGlzZXIgYWxsZSBmb3JiaW5kZWxzZXIiCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiVmlzIGZvcmJpbmRlbHNlciIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiBCcnVrOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICJEZW5uZSBjc2NvcGUta29tbWFuZG9lbiBzdPh0dGVyIGlra2Ugc3BsaXR0aW5nIGF2IHZpbmR1ZXQuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiBCcnVrOiBjc3RhZyA8aWRlbnRpZmlrYXRvcj4iCisKKyM6IGlmX2NzY29wZS5jOjIzMQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzogVGFnIGlra2UgZnVubmV0IgorCisjOiBpZl9jc2NvcGUuYzo0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBzdGF0KCVzKSBmZWlsOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDE5Cittc2dpZCAiRTU2Mzogc3RhdCBlcnJvciIKK21zZ3N0ciAiRTU2MzogXCJzdGF0XCItZmVpbCIKKworIzogaWZfY3Njb3BlLmM6NTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgZXIgaWtrZSBlbiBrYXRhbG9nIGVsbGVyIGd5bGRpZyBjc2NvcGUtZGF0YWJhc2UiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIkxhIHRpbCBjc2NvcGUtZGF0YWJhc2UgJXMiCisKKyM6IGlmX2NzY29wZS5jOjU4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogRmVpbCB1bmRlciBsZXNpbmcgYXYgY3Njb3BlLWZvcmJpbmRlbHNlICVsZCIKKworIzogaWZfY3Njb3BlLmM6Njk0Cittc2dpZCAiRTU2MTogdW5rbm93biBjc2NvcGUgc2VhcmNoIHR5cGUiCittc2dzdHIgIkU1NjE6IFVramVudCBjc2NvcGUtc/hrZXR5cGUiCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBLdW5uZSBpa2tlIGxhZ2UgY3Njb3BlLXL4ciAoXCJwaXBlXCIpIgorCisjOiBpZl9jc2NvcGUuYzo3NTMKK21zZ2lkICJFNjIyOiBDb3VsZCBub3QgZm9yayBmb3IgY3Njb3BlIgorbXNnc3RyICJFNjIyOiBLbGFydGUgaWtrZSBsYWdlIHR2aWxsaW5ncHJvc2VzcyBmb3IgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo4NDcgaWZfY3Njb3BlLmM6ODk3Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgIlV0ZvhyaW5nIGF2IGNzX2NyZWF0ZV9jb25uZWN0aW9uIGZlaWxldCIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiBLbGFydGUgaWtrZSBzdGFydGUgY3Njb3BlLXByb3Nlc3MiCisKKyM6IGlmX2NzY29wZS5jOjkxMQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmVpbGV0IgorCisjOiBpZl9jc2NvcGUuYzo5MTMKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZlaWxldCIKKworIzogaWZfY3Njb3BlLmM6OTUxCittc2dpZCAiRTU2Nzogbm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICJFNTY3OiBJbmdlbiBjc2NvcGUtZm9yYmluZGVsc2UiCisKKyM6IGlmX2NzY29wZS5jOjEwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1OTogbm8gbWF0Y2hlcyBmb3VuZCBmb3IgY3Njb3BlIHF1ZXJ5ICVzIG9mICVzIgorbXNnc3RyICJFMjU5OiBJbmdlbiB0cmVmZiBmdW5uZXQgZm9yIGNzY29wZS1mb3Jlc3D4cnNlbCAlcyBhdiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTA4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY5OiBpbnZhbGlkIGNzY29wZXF1aWNrZml4IGZsYWcgJWMgZm9yICVjIgorbXNnc3RyICJFNDY5OiBVZ3lsZGlnIFwiY3Njb3BlcXVpY2tmaXhcIi1mbGFnZyAlYyBmb3IgJWMiCisKKyM6IGlmX2NzY29wZS5jOjExNTIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZS1rb21tYW5kb2VyOlxuIgorCisjOiBpZl9jc2NvcGUuYzoxMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIgorbXNnc3RyICIlLTVzOiAlLTMwcyAoQnJ1azogJXMpIgorCisjOiBpZl9jc2NvcGUuYzoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjU6IGNhbm5vdCBvcGVuIGNzY29wZSBkYXRhYmFzZTogJXMiCittc2dzdHIgIkU2MjU6IEthbiBpa2tlIOVwbmUgY3Njb3BlLWRhdGFiYXNlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI3MQorbXNnaWQgIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIgorbXNnc3RyICJFNjI2OiBLYW4gaWtrZSBoZW50ZSBpbmZvcm1hc2pvbiBvbSBjc2NvcGUtZGF0YWJhc2UiCisKKyM6IGlmX2NzY29wZS5jOjEyOTYKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODogRHVwbGlzZXJ0IGNzY29wZS1kYXRhYmFzZSBpa2tlIGxhZ3QgdGlsIgorCisjOiBpZl9jc2NvcGUuYzoxMzA3Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IE1ha3NpbXVtIGFudGFsbCBjc2NvcGUtZm9yYmluZGVsc2VyIG7lZGQiCisKKyM6IGlmX2NzY29wZS5jOjE0MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIgorbXNnc3RyICJFMjYxOiBjc2NvcGUtZm9yYmluZGVsc2UgJXMgaWtrZSBmdW5uZXQiCisKKyM6IGlmX2NzY29wZS5jOjE0NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gJXMgY2xvc2VkIgorbXNnc3RyICJjc2NvcGUtZm9yYmluZGVsc2VuICVzIHN0ZW5ndCIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IEtyaXRpc2sgZmVpbCBpIGNzX21hbmFnZV9tYXRjaGVzIgorCisjOiBpZl9jc2NvcGUuYzoxODQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzIgorbXNnc3RyICJDc2NvcGUtdGFnOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTg3MAorbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICBsaW5qZSIKKworIzogaWZfY3Njb3BlLmM6MTg3MgorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAiZmlsbmF2biAvIGtvbnRla3N0IC8gbGluamVcbiIKKworIzogaWZfY3Njb3BlLmM6MTk5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA5OiBDc2NvcGUgZXJyb3I6ICVzIgorbXNnc3RyICJFNjA5OiBDc2NvcGUtZmVpbDogJXMiCisKKyM6IGlmX2NzY29wZS5jOjIxNzYKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAiQWxsZSBjc2NvcGUtZGF0YWJhc2VyIHJlc2F0dCIKKworIzogaWZfY3Njb3BlLmM6MjI0NAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICJpbmdlbiBjc2NvcGUtZm9yYmluZGVsc2VyXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyNDgKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBkYXRhYmFzZW5hdm4gICAgICAgICAgICAgICAgICAgICAgICBsZWdnIHRpbCBzdGlcbiIKKworIzogaWZfcHl0aG9uLmM6NDM2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjYzOiBEZW5uZSBrb21tYW5kb2VuIGVyIGRlYWt0aXZlcnQsIFB5dGhvbi1iaWJsaW90ZWtldCBrdW5uZSBpa2tlIGxhc3Rlcy4iCisKKyM6IGlmX3B5dGhvbi5jOjUwMAorbXNnaWQgIkU2NTk6IENhbm5vdCBpbnZva2UgUHl0aG9uIHJlY3Vyc2l2ZWx5IgorbXNnc3RyICJFNjU5OiBLYW4gaWtrZSBzdGFydGUgUHl0aG9uIHJla3Vyc2l2dCIKKworIzogaWZfcHl0aG9uLmM6NzAxCittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICJLYW4gaWtrZSBzbGV0dGUgXCJPdXRwdXRPYmplY3RcIi1hdHRyaWJ1dHRlciIKKworIzogaWZfcHl0aG9uLmM6NzA4Cittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAiXCJzb2Z0c3BhY2VcIiBt5SB25nJlIGV0IGhlbHRhbGwiCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJ1Z3lsZGlnIGF0dHJpYnV0dCIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSBrcmV2ZXIgZW4gbGlzdGUgYXYgc3RyZW5nZXIiCisKKyM6IGlmX3B5dGhvbi5jOjg5NQorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IEZlaWwgdW5kZXIgaW5pdGlhbGlzZXJpbmcgYXYgSS9VLW9iamVrdGVyIgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgInVneWxkaWcgdXR0cnlrayIKKworIzogaWZfcHl0aG9uLmM6MTA5NCBpZl90Y2wuYzoxNDA3Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJ1dHRyeWtrIGRlYWt0aXZlcnQgcOUga29tcGlsZXJpbmdzc3RhZGlldCIKKworIzogaWZfcHl0aG9uLmM6MTEwNworbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgImZvcnP4ayBw5SDlIHJlZmVyZXJlIHRpbCBzbGV0dGV0IGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTEyMiBpZl9weXRob24uYzoxMTYzIGlmX3B5dGhvbi5jOjEyMjcgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAibGluamVudW1tZXIgdXRlbmZvciBvbXLlZGUiCisKKyM6IGlmX3B5dGhvbi5jOjEzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8YnVmZmVyb2JqZWt0IChzbGV0dGV0KSB2ZWQgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgInVneWxkaWcgbWVya2VuYXZuIgorCisjOiBpZl9weXRob24uYzoxNzMzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgImJ1ZmZlcmVuIGZpbm5lcyBpa2tlIgorCisjOiBpZl9weXRob24uYzoxODIxCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAiZm9yc/hrIHDlIOUgcmVmZXJlcmUgdGlsIHNsZXR0ZXQgdmluZHUiCisKKyM6IGlmX3B5dGhvbi5jOjE4NjYKK21zZ2lkICJyZWFkb25seSBhdHRyaWJ1dGUiCittc2dzdHIgInNrcml2ZWJlc2t5dHRldCBhdHRyaWJ1dHQiCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIm1hcmv4cnBvc2lzam9uIHV0ZW5mb3IgYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxOTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjx2aW5kdXNvYmpla3QgKHNsZXR0ZXQpIHZlZCAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPHZpbmR1c29iamVrdCAodWtqZW50KSB2ZWQgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI8dmluZHUgJWQ+IgorCisjOiBpZl9weXRob24uYzoyMDQ2Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgInZpbmR1ZXQgZmlubmVzIGlra2UiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDcgaWZfcHl0aG9uLmM6MjM0MSBpZl9weXRob24uYzoyMzk2IGlmX3B5dGhvbi5jOjI0NjQKKyM6IGlmX3B5dGhvbi5jOjI1ODYgaWZfcHl0aG9uLmM6MjYzOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICJrYW4gaWtrZSBsYWdyZSBhbmdyZS1pbmZvcm1hc2pvbiIKKworIzogaWZfcHl0aG9uLmM6MjMwOSBpZl9weXRob24uYzoyNDAzIGlmX3B5dGhvbi5jOjI0NzUKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgImthbiBpa2tlIHNsZXR0ZSBsaW5qZSIKKworIzogaWZfcHl0aG9uLmM6MjM0NiBpZl9weXRob24uYzoyNDkxIGlmX3RjbC5jOjY5MCBpZl90Y2wuYzoyMDIxCittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAia2FuIGlra2UgZXJzdGF0dGUgbGluamUiCisKKyM6IGlmX3B5dGhvbi5jOjI1MDkgaWZfcHl0aG9uLmM6MjU4OCBpZl9weXRob24uYzoyNjQ2Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICJrYW4gaWtrZSBzZXR0ZSBpbm4gbGluamUiCisKKyM6IGlmX3B5dGhvbi5jOjI3NTAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgInN0cmVuZyBrYW4gaWtrZSBpbm5laG9sZGUgbGluamVza2lmdCIKKworIzogaWZfcnVieS5jOjQyMgorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2NjogRGVubmUga29tbWFuZG9lbiBlciBkZWFrdGl2ZXJ0LCBSdWJ5LWJpYmxpb3Rla2V0IGt1bm5lIGlra2UgbGFzdGVzLiIKKworIzogaWZfcnVieS5jOjQ4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBVa2plbnQgbG9uZ2ptcC1zdGF0dXMgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiQnl0dCBtZWxsb20gaW1wbGVtZW50YXNqb24vZGVmaW5pc2pvbiIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAiVmlzIGJhc2lza2xhc3NlIGF2IgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAiVmlzIG92ZXJzdHlydCBtZWRsZW1zZnVua3Nqb24iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIkhlbnQgZnJhIGZpbCIKKworIzogaWZfc25pZmYuYzo3MQorbXNnaWQgIlJldHJpZXZlIGZyb20gcHJvamVjdCIKK21zZ3N0ciAiSGVudCBmcmEgcHJvc2pla3QiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiSGVudCBmcmEgYWxsZSBwcm9zamVrdGVyIgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIkhlbnQiCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAiVmlzIGtpbGRlIHRpbCIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJGaW5uIHN5bWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAiQmxhIGdqZW5ub20ga2xhc3NlIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIlZpcyBrbGFzc2UgaSBoaWVyYXJraSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIlZpcyBrbGFzc2UgaSBiZWdyZW5zZXQgaGllcmFya2kiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiByZWZlcmVyZXIgdGlsIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiByZWZlcmVydCBhdiIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYgaGFyIGVuIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIGJydWt0IGF2IgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICJWaXMgZG9jdSBhdiIKKworIzogaWZfc25pZmYuYzo4NQorbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorbXNnc3RyICJHZW5lcmVyIGRvY3UgZm9yIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisiS2FuIGlra2Uga29ibGUgdGlsIFNOaUZGKy4gU2pla2sgbWlsavhldCAoXCJlbnZpcm9ubWVudFwiKSAoc25pZmZlbWFjcyBt5SAiCisiYmxpIGZ1bm5ldCBpICRQQVRIKS5cbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IEZlaWwgdW5kZXIgbGVzaW5nLiBGcmFrb2JsZXQiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBlciBmb3Ig+HllYmxpa2tldCAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAiaWtrZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJvcHBrb2JsZXQiCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBVa2plbnQgU05pRkYrLWZvcmVzcPhyc2VsOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogRmVpbCB2ZWQgb3Bwa29ibGluZyB0aWwgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIGlra2UgdGlsa29ibGV0IgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBJa2tlIGVuIFNOaUZGKy1idWZmZXIiCisKKyM6IGlmX3NuaWZmLmM6MTA4MworbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6IEZlaWwgdW5kZXIgc2tyaXZpbmcuIEZyYWtvYmxldCIKKworIzogaWZfdGNsLmM6NDE4Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJ1Z3lsZGlnIGJ1ZmZlcm51bW1lciIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAiaWtrZSBpbXBsZW1lbnRlcnQgZW5kYSIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgInVramVudCB2YWxnIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAia2FuIGlra2Ugc2V0dGUgbGluamUocikiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAibWVya2UgaWtrZSBzYXR0IgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICJyYWQgJWQga29sb25uZSAlZCIKKworIzogaWZfdGNsLmM6ODgxCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAia2FuIGlra2Ugc2V0dGUgaW5uL2xlZ2dlIHRpbCBsaW5qZSIKKworIzogaWZfdGNsLmM6MTI2OAorbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICJ1a2plbnQgZmxhZ2c6ICIKKworIzogaWZfdGNsLmM6MTMzOAorbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICJ1a2plbnQgdmltT3B0aW9uIgorCisjOiBpZl90Y2wuYzoxNDIzCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICJ0YXN0YXR1cmF2YnJ1ZGQiCisKKyM6IGlmX3RjbC5jOjE0MjgKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgInZpbS1mZWlsIgorCisjOiBpZl90Y2wuYzoxNDcxCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICJrYW4gaWtrZSBvcHByZXR0ZSBidWZmZXIvdmluZHVrb21tYW5kbzogT2JqZWt0ZXQgc2xldHRlcyIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyJrYW4gaWtrZSByZWdpc3RyZXJlIGNhbGxiYWNrLWtvbW1hbmRvOiBCdWZmZXIvdmluZHUgZXIgYWxsZXJlZGUgc2xldHRldCIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NjIKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0uIgorIm9yZyIKK21zZ3N0ciAiIgorIkUyODA6IFRDTCBLUklUSVNLIEZFSUw6IHJlZmxpc3Qgc2thZGV0IT8gVmVubmxpZ3N0IHJhcHBvcnRlciBkZXR0ZSB0aWwgdmltLSIKKyJkZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJrYW4gaWtrZSByZWdpc3RyZXJlIGNhbGxiYWNrLWtvbW1hbmRvOiBCdWZmZXIvdmluZHVyZWZlcmFuc2UgaWtrZSBmdW5uZXQiCisKKyM6IGlmX3RjbC5jOjE3MjQKK21zZ2lkICIiCisiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTU3MTogRGVubmUga29tbWFuZG9lbiBlciBkZWFrdGl2ZXJ0LCBUY2wtYmlibGlvdGVrZXQga3VubmUgaWtrZSBsYXN0ZXMuIgorCisjOiBpZl90Y2wuYzoxODg2Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MTogVENMLUZFSUw6IEF2c2x1dG5pbmdza29kZSBlciBpa2tlIGludCE/IFZlbm5saWdzdCByYXBwb3J0ZXIgZGV0dGUgdGlsICIKKyJ2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjIwMDcKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgImthbiBpa2tlIGhlbnRlIGxpbmplIgorCisjOiBpZl94Y21kc3J2LmM6MjI1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiS2xhcmVyIGlra2UgcmVnaXN0cmVyZSBrb21tYW5kb3RqZW5lcm5hdm4iCisKKyM6IGlmX3hjbWRzcnYuYzo0NzMKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBLbGFydGUgaWtrZSBzZW5kZSBrb21tYW5kbyB0aWwgZGVzdGluYXNqb25zcHJvZ3JhbW1ldCIKKworIzogaWZfeGNtZHNydi5jOjc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFNTczOiBJbnZhbGlkIHNlcnZlciBpZCB1c2VkOiAlcyIKK21zZ3N0ciAiRTU3MzogVWd5bGRpZyB0amVuZXItaWQgYnJ1a3Q6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTExMAorI34gbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKKyN+IG1zZ3N0ciAiIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiVWtqZW50IHZhbGciCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJGb3IgbWFuZ2UgcmVkaWdlcmluZ3NwYXJhbWV0ZXJlIgorCisjOiBtYWluLmM6NjQKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICJQYXJhbWV0ZXIgbWFuZ2xlciBldHRlciIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIlP4cHBlbCBldHRlciB2YWxnIgorCisjOiBtYWluLmM6NjgKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIsIFwiLWMgY29tbWFuZFwiIG9yIFwiLS1jbWQgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAiIgorIkZvciBtYW5nZSBcIitjb21tYW5kXCItLCBcIi1jIGNvbW1hbmRcIi0gZWxsZXIgXCItLWNtZCBrb21tYW5kb1wiLXBhcmFtZXRlcmUiCisKKyM6IG1haW4uYzo3MAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorbXNnc3RyICJVZ3lsZGlnIHBhcmFtZXRlciBmb3IiCisKKyM6IG1haW4uYzo0NjkKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIkRlbm5lIFZpbS12ZXJzam9uZW4gZXIga29tcGlsZXJ0IHV0ZW4gZGlmZmVyYW5zZWZ1bmtzam9uZW4uIgorCisjOiBtYWluLmM6OTM1Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiRm9yc/hrIHDlIOUg5XBuZSBza3JpcHRmaWxlbiBpZ2plbjogXCIiCisKKyM6IG1haW4uYzo5NDQKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIkthbiBpa2tlIOVwbmUgZm9yIGxlc2luZzogXCIiCisKKyM6IG1haW4uYzo5ODgKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIkthbiBpa2tlIOVwbmUgZm9yIHNrcmlwdC11dGRhdGE6IFwiIgorCisjOiBtYWluLmM6MTEzNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIiVkIGZpbGVyIOUgcmVkaWdlcmVcbiIKKworIzogbWFpbi5jOjEyMzYKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IEFkdmFyc2VsOiBVdGRhdGEgZ+VyIGlra2UgdGlsIGVuIHRlcm1pbmFsXG4iCisKKyM6IG1haW4uYzoxMjM4Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogQWR2YXJzZWw6IElubmRhdGEga29tbWVyIGlra2UgZnJhIGVuIHRlcm1pbmFsXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTMwNgorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyBrb21tYW5kb2xpbmplIgorCisjOiBtYWluLmM6MTM0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogS2FuIGlra2UgbGVzZSBmcmEgXCIlc1wiIgorCisjOiBtYWluLmM6MjQyMAorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiTWVyIGluZm8gbWVkOiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyNDUzCittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIltmaWxlIC4uXSAgICAgICByZWRpZ2VyIHNwZXNpZmlzZXJ0KGUpIGZpbChlcikiCisKKyM6IG1haW4uYzoyNDU0Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgbGVzIHRla3N0IGZyYSBzdGRpbiIKKworIzogbWFpbi5jOjI0NTUKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCB0YWcgICAgICAgICAgcmVkaWdlciBmaWwgaHZvciBlbiB0YWcgZXIgZGVmaW5lcnQiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbZmVpbGZpbF0gICAgcmVkaWdlciBmaWwgbWVkIGb4cnN0ZSBmZWlsIgorCisjOiBtYWluLmM6MjQ2NgorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJicnVrOiIKKworIzogbWFpbi5jOjI0NjkKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbcGFyYW1ldGVyZV0gIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICBlbGxlcjoiCisKKyM6IG1haW4uYzoyNDc2Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIlBhcmFtZXRlcmU6XG4iCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHRCYXJlIGZpbG5hdm4gZXR0ZXIgZGV0dGUiCisKKyM6IG1haW4uYzoyNDc5Cittc2dpZCAiLS1saXRlcmFsXHRcdERvbid0IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIi0tbGl0ZXJhbFx0XHRJa2tlIHV0dmlkIGpva2VydGVnbiIKKworIzogbWFpbi5jOjI0ODIKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRSZWdpc3RyZXIgZ3ZpbSBmb3IgT0xFIgorCisjOiBtYWluLmM6MjQ4MworbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHRGamVybiBPTEUtcmVnaXN0cmVyaW5nIGZvciBndmltIgorCisjOiBtYWluLmM6MjQ4NgorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0S2r4ciBtZWQgR1VJIChzb20gXCJndmltXCIpIgorCisjOiBtYWluLmM6MjQ4NworbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mICBlbGxlciAgLS1ub2ZvcmtcdEZvcmdydW5uOiBJa2tlIGZvcmsgbuVyIEdVSS1ldCBzdGFydGVzIgorCisjOiBtYWluLmM6MjQ4OQorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpLW1vZHVzIChzb20gXCJ2aVwiKSIKKworIzogbWFpbi5jOjI0OTAKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeC1tb2R1cyAoc29tIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDkxCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdFN0aWxsZSAoYmF0Y2gpIG1vZHVzIChiYXJlIGZvciBcImV4XCIpIgorCisjOiBtYWluLmM6MjQ5MworbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmZXJhbnNlLW1vZHVzIChzb20gXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjQ5NQorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0TGV0dCBtb2R1cyAoc29tIFwiZXZpbVwiLCB1dGVuIG1vZHVzKSIKKworIzogbWFpbi5jOjI0OTYKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdFNrcml2ZWJlc2t5dHRldCBtb2R1cyAoc29tIFwidmlld1wiKSIKKworIzogbWFpbi5jOjI0OTcKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0QmVncmVuc2V0IG1vZHVzIChzb20gXCJydmltXCIpIgorCisjOiBtYWluLmM6MjQ5OAorbXNnaWQgIi1tXHRcdFx0TW9kaWZpY2F0aW9ucyAod3JpdGluZyBmaWxlcykgbm90IGFsbG93ZWQiCittc2dzdHIgIi1tXHRcdFx0TW9kaWZpc2VyaW5nIChsYWdyaW5nIGF2IGZpbGVyKSBpa2tlIHRpbGxhdHQiCisKKyM6IG1haW4uYzoyNDk5Cittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0TW9kaWZpc2VyaW5nZXIgaSB0ZWtzdGVuIGlra2UgdGlsbGF0dCIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdEJpbuZybW9kdXMiCisKKyM6IG1haW4uYzoyNTAyCittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx0TGlzcC1tb2R1cyIKKworIzogbWFpbi5jOjI1MDQKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdEtvbXBhdGliZWwgbWVkIFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0SWtrZSBoZWx0IFZpLWtvbXBhdGliZWw6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjUwNgorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdEluZm9ybWFzam9uc25pduUgKFwiVmVyYm9zZVwiKSIKKworIzogbWFpbi5jOjI1MDcKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdERlYnVnZ2luZ3Ntb2R1cyIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdEluZ2VuIHN3YXBmaWwsIGJydWsgYmFyZSBodWtvbW1lbHNlbiIKKworIzogbWFpbi5jOjI1MDkKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRMaXN0IHN3YXBmaWxlciBvZyBhdnNsdXR0IgorCisjOiBtYWluLmM6MjUxMAorbXNnaWQgIi1yICh3aXRoIGZpbGUgbmFtZSlcdFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uIgorbXNnc3RyICItciAobWVkIGZpbG5hdm4pXHRHamVub3BwcmV0dCBrcuZzamV0IPhrdCIKKworIzogbWFpbi5jOjI1MTEKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0U2FtbWUgc29tIC1yIgorCisjOiBtYWluLmM6MjUxMworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHRJa2tlIGJydWsgbmV3Y2xpIGZvciDlIOVwbmUgdmluZHUiCisKKyM6IG1haW4uYzoyNTE0Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZW5oZXQ+XHRcdEJydWsgPGVuaGV0PiBmb3IgSS9VIgorCisjOiBtYWluLmM6MjUxNworbXNnaWQgIi1BXHRcdFx0c3RhcnQgaW4gQXJhYmljIG1vZGUiCittc2dzdHIgIi1BXHRcdFx0U3RhcnQgaSBhcmFiaXNrIG1vZHVzIgorCisjOiBtYWluLmM6MjUyMAorbXNnaWQgIi1IXHRcdFx0U3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0U3RhcnQgaW4gaGVicmFpc2sgbW9kdXMiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdFN0YXJ0IGkgcGVyc2lzayAoRmFyc2kpIG1vZHVzIgorCisjOiBtYWluLmM6MjUyNQorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdFNldHQgdGVybWluYWx0eXBlbiB0aWwgPHRlcm1pbmFsPiIKKworIzogbWFpbi5jOjI1MjYKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRCcnVrIDx2aW1yYz4gaXN0ZWRlbmZvciBldmVudHVlbGwgLnZpbXJjIgorCisjOiBtYWluLmM6MjUyOAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRCcnVrIDxndmltcmM+IGlzdGVkZW5mb3IgZXZlbnR1ZWxsIC5ndmltcmMiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdElra2UgbGFzdCBwbHVnaW4tc2tyaXB0cyIKKworIzogbWFpbi5jOjI1MzEKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHTFcG5lIE4gdmluZHVlciAoc3RhbmRhcmQ6IEV0dCBmb3IgaHZlciBmaWwpIgorCisjOiBtYWluLmM6MjUzMgorbXNnaWQgIi1PW05dXHRcdExpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdFNvbSAtbyBtZW4gc3BsaXR0IGxvZGRyZXR0IgorCisjOiBtYWluLmM6MjUzMworbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdFN0YXJ0IHDlIHNsdXR0ZW4gYXYgZmlsZW4iCisKKyM6IG1haW4uYzoyNTM0Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnI+XHRcdFN0YXJ0IHDlIGxpbmplIDxsbnI+IgorCisjOiBtYWluLmM6MjUzNgorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxrb21tYW5kbz5cdEtq+HIgPGtvbW1hbmRvPiBm+HIgbGFzdGluZyBhdiB2aW1yYy1maWxlciIKKworIzogbWFpbi5jOjI1MzgKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPGtvbW1hbmRvPlx0XHRLavhyIDxrb21tYW5kbz4gZXR0ZXIgbGFzdGluZyBhdiBm+HJzdGUgZmlsIgorCisjOiBtYWluLmM6MjUzOQorbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLVMgPPhrdD5cdFx0S2r4ciBmaWxlbiA8+Gt0PiBldHRlciBsYXN0aW5nIGF2IGb4cnN0ZSBmaWwiCisKKyM6IG1haW4uYzoyNTQwCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPGlubnNrcmlwdD5cdExlcyBub3JtYWxtb2R1cy1rb21tYW5kb2VyIGZyYSBmaWxlbiA8aW5uc2tyaXB0PiIKKworIzogbWFpbi5jOjI1NDEKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8dXRza3JpcHQ+XHRMZWdnIGFsbGUgc2tyZXZuZSBrb21tYW5kb2VyIHRpbCBmaWxlbiA8dXRza3JpcHQ+IgorCisjOiBtYWluLmM6MjU0MgorbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHV0c2tyaXB0Plx0U2tyaXYgYWxsZSBza3Jldm5lIGtvbW1hbmRvZXIgdGlsIGZpbGVuIDx1dHNrcmlwdD4iCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHRSZWRpZ2VyIGtyeXB0ZXJ0ZSBmaWxlciIKKworIzogbWFpbi5jOjI1NDgKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRLb2JsZSB2aW0gdGlsIGRlbm5lIHNwZXNpZWxsZSBYLXRqZW5lcmVuIgorCisjOiBtYWluLmM6MjU1MAorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0VW5uZ+Ugb3Bwa29ibGluZyB0aWwgWC10amVuZXIiCisKKyM6IG1haW4uYzoyNTUzCittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVyPlx0UmVkaWdlciA8ZmlsZXI+IHDlIGVuIFZpbS10amVuZXIgaHZpcyBtdWxpZyIKKworIzogbWFpbi5jOjI1NTQKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxlbnQgPGZpbGVyPiAgU2FtbWUsIGlra2Uga2xhZyBodmlzIHRqZW5lcmVuIG1hbmdsZXIiCisKKyM6IG1haW4uYzoyNTU1Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlcj4gIFNvbSAtLXJlbW90ZSBtZW4gdmVudCBw5SBmaWxlciBzb20gYmxpciByZWRpZ2VydCIKKworIzogbWFpbi5jOjI1NTYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICBTYW1tZSwgaWtrZSBrbGFnIGh2aXMgdGplbmVyZW4gbWFuZ2xlciIKKworIzogbWFpbi5jOjI1NTcKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDxu+GtsZXI+XHRTZW5kIDxu+GtsZXI+IHRpbCBlbiBWaW0tdGplbmVyIG9nIGF2c2x1dHQiCisKKyM6IG1haW4uYzoyNTU4Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLWV4cHIgPHV0dHJ5a2s+XHRFdmFsdWVyIDx1dHRyeWtrPiBw5SBlbiBWaW0tdGplbmVyIG9nIHNrcml2ICIKKyJyZXN1bHRhdGV0IgorCisjOiBtYWluLmM6MjU1OQorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0TGlzdCBuYXZuIHDlIHRpbGdqZW5nZWxpZ2UgVmltLXRqZW5lcmUgb2cgYXZzbHV0dCIKKworIzogbWFpbi5jOjI1NjAKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8bmF2bj5cdFNlbmQgdGlsL2JsaSBWaW0tdGplbmVyZW4gPG5hdm4+IgorCisjOiBtYWluLmM6MjU2MworbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHRCcnVrIDx2aW1pbmZvPiBpc3RlZGVuZm9yIC52aW1pbmZvIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIi1oICBvciAgLS1oZWxwXHRQcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaCAgZWxsZXIgIC0taGVscFx0U2tyaXYgaGplbHBlbiAoZGVubmUgdGVrc3Rlbikgb2cgYXZzbHV0dCIKKworIzogbWFpbi5jOjI1NjYKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdFNrcml2IHZlcnNqb25zaW5mb3JtYXNqb24gb2cgYXZzbHV0dCIKKworIzogbWFpbi5jOjI1NzAKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQYXJhbWV0ZXJlIGdqZW5ramVudCBhdiBndmltIChNb3RpZi12ZXJzam9uKTpcbiIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUGFyYW1ldGVyZSBnamVua2plbnQgYXYgZ3ZpbSAobmVYdGF3LXZlcnNqb24pOlxuIgorCisjOiBtYWluLmM6MjU3NgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJQYXJhbWV0ZXJlIGdqZW5ramVudCBhdiBndmltIChBdGhlbmEtdmVyc2pvbik6XG4iCisKKyM6IG1haW4uYzoyNTgwCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRLavhyIHZpbSBw5SA8ZGlzcGxheT4iCisKKyM6IG1haW4uYzoyNTgxCittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdFN0YXJ0IHZpbSBzb20gaWtvbiIKKworIzogbWFpbi5jOjI1ODMKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmF2bj5cdFx0QnJ1ayByZXNzdXJzIHNvbSBvbSBWaW0gdmFyIDxuYXZuPiIKKworIzogbWFpbi5jOjI1ODQKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgIChJa2tlIGltcGxlbWVudGVydClcbiIKKworIzogbWFpbi5jOjI1ODYKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxmYXJnZT5cdEJydWsgPGZhcmdlPiBw5SBiYWtncnVubmVuIChvZ3PlOiAtYmcpIgorCisjOiBtYWluLmM6MjU4NworbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGZhcmdlPlx0QnJ1ayA8ZmFyZ2U+IHDlIG5vcm1hbCB0ZWtzdCAob2dz5TogLWZnKSIKKworIzogbWFpbi5jOjI1ODggbWFpbi5jOjI2MDgKK21zZ2lkICItZm9udCA8Zm9udD5cdFx0VXNlIDxmb250PiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mbikiCittc2dzdHIgIi1mb250IDxza3JpZnR0eXBlPlx0XHRCcnVrIDxza3JpZnR0eXBlPiBw5SBub3JtYWwgdGVrc3QgKG9nc+U6IC1mbikiCisKKyM6IG1haW4uYzoyNTg5Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPHNrcmlmdHR5cGU+XHRCcnVrIDxza3JpZnR0eXBlPiBw5SBmZXQgc2tyaWZ0IgorCisjOiBtYWluLmM6MjU5MAorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxza3JpZnR0eXBlPlx0QnJ1ayA8c2tyaWZ0dHlwZT4gcOUgc2ty5SB0ZWtzdCIKKworIzogbWFpbi5jOjI1OTEgbWFpbi5jOjI2MDkKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIiIKKyItZ2VvbWV0cnkgPGdlb20+XHRCcnVrIDxnZW9tPiBmb3IgaW5ubGVkZW5kZSB2aW5kdXNwbGFzc2VyaW5nIChvZ3PlOiAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNTkyCittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICIiCisiLWJvcmRlcndpZHRoIDxicmVkZGU+XHRCcnVrIGVuIHJhbW1lYnJlZGRlIHRpbHN2YXJlbmRlIDxicmVkZGU+IChvZ3PlOiAtYncpIgorCisjOiBtYWluLmM6MjU5MworbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiIgorIi1zY3JvbGxiYXJ3aWR0aCA8YnJlZGRlPiAgQnJ1ayBlbiBydWxsZWZlbHRicmVkZGUgdGlsc3ZhcmVuZGUgPGJyZWRkZT4gIgorIihvZ3PlOiAtc3cpIgorCisjOiBtYWluLmM6MjU5NQorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIiIKKyItbWVudWhlaWdodCA8aPh5ZGU+XHRCcnVrIGVuIG1lbnlibG9ra2j4eWRlIHRpbHN2YXJlbmRlIDxo+HlkZT4gKG9nc+U6IC1taCkiCisKKyM6IG1haW4uYzoyNTk3IG1haW4uYzoyNjEwCittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdEJydWsgaW52ZXJzIHZpZGVvIChvZ3PlOiAtcnYpIgorCisjOiBtYWluLmM6MjU5OAorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHRJa2tlIGJydWsgaW52ZXJzIHZpZGVvIChvZ3PlOiArcnYpIgorCisjOiBtYWluLmM6MjU5OQorbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHJlc3N1cnM+XHRTZXR0IGRlbiBzcGVzaWZpc2VydGUgcmVzc3Vyc2VuIgorCisjOiBtYWluLmM6MjYwMgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiUGFyYW1ldGVyZSBnamVua2plbnQgYXYgZ3ZpbSAoUklTQyBPUy12ZXJzam9uKTpcbiIKKworIzogbWFpbi5jOjI2MDMKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8YW50YWxsPlx0SW5ubGVkZW5kZSBicmVkZGUgcOUgdmluZHUgaSBrb2xvbm5lciIKKworIzogbWFpbi5jOjI2MDQKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPGFudGFsbD5cdElubmxlZGVuZGUgaPh5ZGUgcOUgdmluZHUgaSByYWRlciIKKworIzogbWFpbi5jOjI2MDcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBhcmFtZXRlcmUgZ2plbmtqZW50IGF2IGd2aW0gKEdUSystdmVyc2pvbik6XG4iCisKKyM6IG1haW4uYzoyNjExCittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRLavhyIHZpbSBw5SA8ZGlzcGxheT4gKG9nc+U6IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNjEzCittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICItLXJvbGUgPHJvbGU+XHRTZXR0IGVuIHVuaWsgXCJyb2xlXCIgZm9yIOUgaWRlbnRpZmlzZXJlIGhvdmVkdmluZHVldCIKKworIzogbWFpbi5jOjI2MTUKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHTFcG5lIFZpbSBpbm5lbmZvciBldCBhbm5ldCBHVEstc2tqZXJtZWxlbWVudCIKKworIzogbWFpbi5jOjI2MTgKK21zZ2lkICItUCA8cGFyZW50IHRpdGxlPlx0T3BlbiBWaW0gaW5zaWRlIHBhcmVudCBhcHBsaWNhdGlvbiIKK21zZ3N0ciAiLVAgPGZvcmVsZHJldGl0dGVsPlx0U3RhcnQgVmltIGlubmVuZm9yIGV0IGZvcmVsZHJlcHJvZ3JhbSIKKworIzogbWFpbi5jOjI4NTYKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICJJbmdlbiBkaXNwbGF5IgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjg3MQorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjogU2VuZCBmZWlsZXQuXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjg3NworbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiBTZW5kIGZlaWxldC4gUHL4dmVyIOUgdXRm+HJlIGxva2FsdFxuIgorCisjOiBtYWluLmM6MjkxNSBtYWluLmM6MjkzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIiVkIGF2ICVkIHJlZGlnZXJ0IgorCisjOiBtYWluLmM6Mjk1OAorbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIkluZ2VuIGRpc3BsYXk6IFNlbmRpbmcgYXYgdXR0cnlrayBmZWlsZXQuXG4iCisKKyM6IG1haW4uYzoyOTcwCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IFNlbmRpbmcgYXYgdXR0cnlrayBmZWlsZXQuXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIkluZ2VuIG1lcmtlciBzYXR0IgorCisjOiBtYXJrLmM6NzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4MzogSW5nZW4gbWVya2VyIHNhbXN2YXJlciBtZWQgXCIlc1wiIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MjIKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisibWVyayBsaW5qZSBrb2wgZmlsL3Rla3N0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3NjAKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBob3BwIGxpbmplIGtvbCBmaWwvdGVrc3QiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJjaGFuZ2UgbGluZSAgY29sIHRleHQiCittc2dzdHIgIiIKKyJcbiIKKyJmb3JhbmQgbGluamUga29sIHRla3N0IgorCisjOiBtYXJrLmM6MTI4MQorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEZpbG1lcmtlcjpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMzE2Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhvcHBsaXN0ZSAobnllc3RlIGb4cnN0KTpcbiIKKworIzogbWFyay5jOjE0MTIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmllIGZvciBtZXJrZXIgaW5uZSBpIGZpbGVyICh5bmdzdCB0aWwgZWxkc3QpOlxuIgorCisjOiBtYXJrLmM6MTUwMQorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICJNYW5nbGVyICc+JyIKKworIzogbWJ5dGUuYzo0NjcKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0MzogRXIgaWtrZSBlbiBneWxkaWcgY29kZXBhZ2UiCisKKyM6IG1ieXRlLmM6NDQzMQorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBLYW4gaWtrZSBzZXR0ZSBJQy12ZXJkaWVyIChcIklucHV0IENvbnRleHRcIikiCisKKyM6IG1ieXRlLmM6NDU4MworI34gbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKKyN+IG1zZ3N0ciAiIgorCisjOiBtYnl0ZS5jOjQ3NDEKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IEtsYXJ0ZSBpa2tlIOVwbmUgaW5uZGF0YW1ldG9kZSIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICIiCisiRTI4NzogQWR2YXJzZWw6IEtsYXJ0ZSBpa2tlIHNldHRlIFwiZGVzdHJveSBjYWxsYmFja1wiIHRpbCBpbm5kYXRhbWV0b2RlIgorCisjOiBtYnl0ZS5jOjQ3NTgKKyN+IG1zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKKyN+IG1zZ3N0ciAiIgorCisjOiBtYnl0ZS5jOjQ4MTUKKyN+IG1zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKKyN+IG1zZ3N0ciAiIgorCisjOiBtYnl0ZS5jOjQ4ODkKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IFwib3Zlci10aGUtc3BvdFwiLXN0aWwgdHJlbmdlciBldCBza3JpZnR0eXBlc2V0dCIKKworIzogbWJ5dGUuYzo0OTI1Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBEaW4gR1RLKyBlciBlbGRyZSBlbm4gMS4yLjMuIFN0YXR1c29tcuVkZSBkZWFrdGl2ZXJ0IgorCisjOiBtYnl0ZS5jOjUyMzIKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiBJbm5kYXRhbWV0b2RldGplbmVyIGtq+HJlciBpa2tlIgorCisjOiBtZW1maWxlLmM6NDg4Cittc2dpZCAiRTI5MzogYmxvY2sgd2FzIG5vdCBsb2NrZWQiCittc2dzdHIgIkUyOTM6IEJsb2trZW4gdmFyIGlra2UgbOVzdCIKKworIzogbWVtZmlsZS5jOjEwMTAKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiBT+GtlZmVpbCBpIGxlc2luZyBhdiBzd2FwZmlsIgorCisjOiBtZW1maWxlLmM6MTAxNQorbXNnaWQgIkUyOTU6IFJlYWQgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk1OiBMZXNlZmVpbCBpIHN3YXBmaWwiCisKKyM6IG1lbWZpbGUuYzoxMDY3Cittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IFP4a2VmZWlsIGkgc2tyaXZpbmcgdGlsIHN3YXBmaWwiCisKKyM6IG1lbWZpbGUuYzoxMDg1Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiBTa3JpdmVmZWlsIGkgc3dhcGZpbCIKKworIzogbWVtZmlsZS5jOjEyODIKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IFN3YXBmaWxlbiBmaW5uZXMgYWxsZXJlZGUgKHN5bWxlbmtlLWFuZ3JlcD8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogSGVudGV0IGlra2UgYmxva2sgbnVtbWVyIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogSGVudGV0IGlra2UgYmxva2sgbnVtbWVyIDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogSGVudGV0IGlra2UgYmxva2sgbnVtbWVyIDI/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQ0Cittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiBPcHBzLCBtaXN0ZXQgc3dhcGZpbGVuISEhIgorCisjOiBtZW1saW5lLmM6NDQ5Cittc2dpZCAiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDI6IEtsYXJ0ZSBpa2tlIHNraWZ0ZSBuYXZuIHDlIHN3YXBmaWwiCisKKyM6IG1lbWxpbmUuYzo1MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwMzogVW5hYmxlIHRvIG9wZW4gc3dhcCBmaWxlIGZvciBcIiVzXCIsIHJlY292ZXJ5IGltcG9zc2libGUiCittc2dzdHIgIkUzMDM6IEtsYXJ0ZSBpa2tlIOVwbmUgc3dhcGZpbCBmb3IgXCIlc1wiLCBnamVub3BwcmV0dGluZyB1bXVsaWciCisKKyM6IG1lbWxpbmUuYzo2MTgKK21zZ2lkICJFMzA0OiBtbF90aW1lc3RhbXA6IERpZG4ndCBnZXQgYmxvY2sgMD8/IgorbXNnc3RyICJFMzA0OiBtbF90aW1lc3RhbXA6IEhlbnRldCBpa2tlIGJsb2trIDA/PyIKKworIzogbWVtbGluZS5jOjc1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBJbmdlbiBzd2FwZmlsIGZ1bm5ldCBmb3IgJXMiCisKKyM6IG1lbWxpbmUuYzo3NjgKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICJTa3JpdiBudW1tZXJldCBw5SBzd2FwZmlsIHNvbSBza2FsIGJydWtlcyAoMCBmb3Ig5SBhdnNsdXR0ZSk6ICIKKworIzogbWVtbGluZS5jOjgxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogS2FuIGlra2Ug5XBuZSAlcyIKKworIzogbWVtbGluZS5jOjgzNQorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIktsYXJ0ZSBpa2tlIGxlc2UgYmxva2sgMCBmcmEgIgorCisjOiBtZW1saW5lLmM6ODM4Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIkRldCBlciBtdWxpZyBpbmdlbiBmb3JhbmRyaW5nZXIgYmxlIGdqb3J0LCBlbGxlciBWaW0gb3BwZGF0ZXJ0ZSBpa2tlICIKKyJzd2FwZmlsZW4uIgorCisjOiBtZW1saW5lLmM6ODQ4IG1lbWxpbmUuYzo4NjUKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIga2FuIGlra2UgYnJ1a2VzIG1lZCBkZW5uZSBWaW0tdmVyc2pvbmVuLlxuIgorCisjOiBtZW1saW5lLmM6ODUwCittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiQnJ1ayBWaW0gdmVyc2pvbiAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgc2VyIGlra2UgdXQgc29tIGVuIFZpbS1zd2FwZmlsIgorCisjOiBtZW1saW5lLmM6ODY5Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBrYW4gaWtrZSBicnVrZXMgcOUgZGVubmUgbWFza2luZW4uXG4iCisKKyM6IG1lbWxpbmUuYzo4NzEKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIkZpbGVuIGJsZSBsYWdldCBw5SAiCisKKyM6IG1lbWxpbmUuYzo4NzUKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorImVsbGVyIGZpbGVuIGVyIGJsaXR0IPhkZWxhZ3QuIgorCisjOiBtZW1saW5lLmM6OTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIkJydWtlciBzd2FwZmlsZW4gXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICJPcmlnaW5hbGZpbCBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MjMKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogQWR2YXJzZWw6IE9yaWdpbmFsZmlsZW4ga2FuIGhhIGJsaXR0IGZvcmFuZHJldCIKKworIzogbWVtbGluZS5jOjk3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IEtsYXJ0ZSBpa2tlIGxlc2UgYmxva2sgMSBmcmEgJXMiCisKKyM6IG1lbWxpbmUuYzo5ODAKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P01BTkdFIExJTkpFUiBNQU5HTEVSIgorCisjOiBtZW1saW5lLmM6OTk2Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/RkVJTCBMSU5KRUFOVEFMTCIKKworIzogbWVtbGluZS5jOjEwMDMKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/VE9NIEJMT0tLIgorCisjOiBtZW1saW5lLmM6MTAyOQorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P0xJTkpFUiBNQU5HTEVSIgorCisjOiBtZW1saW5lLmM6MTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogSUQgdGlsIGJsb2trIDEgZXIgZmVpbCAoJXMgaWtrZSBlbiBcIi5zd3BcIi1maWw/KSIKKworIzogbWVtbGluZS5jOjEwNjYKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CTE9LSyBNQU5HTEVSIgorCisjOiBtZW1saW5lLmM6MTA4MgorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/PyBIZXJmcmEgdGlsID8/P1NMVVRUIGthbiBsaW5qZXIgduZyZSByb3RldCB0aWwiCisKKyM6IG1lbWxpbmUuYzoxMDk4Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz8gSGVyZnJhIHRpbCA/Pz9TTFVUVCBrYW4gbGluamVyIGhhIGJsaXR0IGxhZ3QgdGlsIGVsbGVyIHNsZXR0ZXQiCisKKyM6IG1lbWxpbmUuYzoxMTE4Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9TTFVUVCIKKworIzogbWVtbGluZS5jOjExNDQKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogR2plbm9wcHJldHRpbmcgYXZicnV0dCIKKworIzogbWVtbGluZS5jOjExNDkKK21zZ2lkICIiCisiRTMxMjogRXJyb3JzIGRldGVjdGVkIHdoaWxlIHJlY292ZXJpbmc7IGxvb2sgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPz8/IgorbXNnc3RyICIiCisiRTMxMjogRmVpbCBvcHBkYWdldCB1bmRlciBnamVub3BwcmV0dGluZzsgc2UgZXR0ZXIgbGluamVyIHNvbSBzdGFydGVyIG1lZCA/Pz8iCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiU2VlIFwiOmhlbHAgRTMxMlwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiU2UgXCI6aGVscCBFMzEyXCIgZm9yIG1lciBpbmZvcm1hc2pvbi4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICJHamVub3BwcmV0dGluZyBrb21wbGV0dC4gRHUgYvhyIHNqZWtrZSBhdCBhbHQgZXIgaSBvcmRlbi4iCisKKyM6IG1lbWxpbmUuYzoxMTU3Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKER1IHZpbCBrYW5za2plIGxhZ3JlIGRlbm5lIGZpbGVuIHVuZGVyIGV0IGFubmV0IG5hdm5cbiIKKworIzogbWVtbGluZS5jOjExNTgKK21zZ2lkICJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIKK21zZ3N0ciAib2cgc2FtbWVubGlnbmUgZGVuIG1vdCBkZW4gb3JpZ2luYWxlIGZpbGVuIGZvciDlIGZpbm5lIGZvcmFuZHJpbmdlcilcbiIKKworIzogbWVtbGluZS5jOjExNTkKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIlNsZXR0IFwiLnN3cFwiLWZpbGVuIGV0dGVycOUuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNQorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJTd2FwZmlsZXIgZnVubmV0OiIKKworIzogbWVtbGluZS5jOjEzOTMKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgSSBu5XbmcmVuZGUga2F0YWxvZzpcbiIKKworIzogbWVtbGluZS5jOjEzOTUKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgQnJ1a2VyIHNwZXNpZmlzZXJ0IG5hdm46XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk5Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgSSBrYXRhbG9nICIKKworIzogbWVtbGluZS5jOjE0MTcKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIGluZ2VuIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDg5Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICBlaWVzIGF2OiAiCisKKyM6IG1lbWxpbmUuYzoxNDkxCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgZGF0ZXJ0OiAiCisKKyM6IG1lbWxpbmUuYzoxNDk1IG1lbWxpbmUuYzozNjg1Cittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICAgICBkYXRlcnQ6ICIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbZnJhIFZpbSB2ZXJzam9uIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTE1Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbc2VyIGlra2UgdXQgc29tIGVuIFZpbS1zd2FwZmlsXSIKKworIzogbWVtbGluZS5jOjE1MTkKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgZmlsbmF2bjogIgorCisjOiBtZW1saW5lLmM6MTUyNQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmlzZXJ0OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI2Cittc2dpZCAiWUVTIgorbXNnc3RyICJKQSIKKworIzogbWVtbGluZS5jOjE1MjYKK21zZ2lkICJubyIKK21zZ3N0ciAibmVpIgorCisjOiBtZW1saW5lLmM6MTUzMAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIGJydWtlcm5hdm46ICIKKworIzogbWVtbGluZS5jOjE1MzcKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgdmVydHNuYXZuOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgdmVydHNuYXZuOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBwcm9zZXNzLUlEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTUxCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChravhyZXIgZm9ydHNhdHQpIgorCisjOiBtZW1saW5lLmM6MTU2MworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW2lra2UgYnJ1a2JhciBtZWQgZGVubmUgVmltLXZlcnNqb25lbl0iCisKKyM6IG1lbWxpbmUuYzoxNTY2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW2lra2UgYnJ1a2JhciBw5SBkZW5uZSBtYXNraW5lbl0iCisKKyM6IG1lbWxpbmUuYzoxNTcxCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW2thbiBpa2tlIGxlc2VzXSIKKworIzogbWVtbGluZS5jOjE1NzUKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFtrYW4gaWtrZSDlcG5lc10iCisKKyM6IG1lbWxpbmUuYzoxNzY1Cittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IEthbiBpa2tlIGJldmFyZSwgc3dhcGZpbCBtYW5nbGVyIgorCisjOiBtZW1saW5lLmM6MTgxOAorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJGaWwgYmV2YXJ0IgorCisjOiBtZW1saW5lLmM6MTgyMAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogQmV2YXJpbmcgZmVpbGV0IgorCisjOiBtZW1saW5lLmM6MTg5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IFVneWxkaWcgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IEthbiBpa2tlIGZpbm5lIGxpbmplICVsZCIKKworIzogbWVtbGluZS5jOjIzMDcKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6IFBla2VyYmxva2staWQgZmVpbCAzIgorCisjOiBtZW1saW5lLmM6MjM4NworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IHNrdWxsZSB25nJlIDAiCisKKyM6IG1lbWxpbmUuYzoyNDQ5Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBPcHBkYXRlcnRlIGZvciBtYW5nZSBibG9ra2VyPyIKKworIzogbWVtbGluZS5jOjI2MzEKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IFBla2VyYmxva2staWQgZmVpbCA0IgorCisjOiBtZW1saW5lLmM6MjY1OAorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgInNsZXR0ZXQgYmxva2sgMT8iCisKKyM6IG1lbWxpbmUuYzoyODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiBLYW4gaWtrZSBmaW5uZSBsaW5qZSAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTAxCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogUGVrZXJibG9ray1pZCBmZWlsIgorCisjOiBtZW1saW5lLmM6MzExNworbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCBlciBudWxsIgorCisjOiBtZW1saW5lLmM6MzE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IExpbmplbnVtbWVyIHV0ZW5mb3Igb21y5WRlOiAlbGQgZm9yYmkgc2x1dHRlbiIKKworIzogbWVtbGluZS5jOjMxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IExpbmplYW50YWxsIGZlaWwgaSBibG9rayAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTk5Cittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIlN0YWNrc3T4cnJlbHNlIPhrZXIiCisKKyM6IG1lbWxpbmUuYzozMjQ1Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiBQZWtlcmJsb2trLWlkIGZlaWwgMiIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IFZJS1RJRyIKKworIzogbWVtbGluZS5jOjM2NzYKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJGYW50IGVuIHN3YXBmaWwgdmVkIG5hdm4gXCIiCisKKyM6IG1lbWxpbmUuYzozNjgwCittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJVbmRlciDlcG5pbmcgYXYgZmlsZW4gXCIiCisKKyM6IG1lbWxpbmUuYzozNjg5Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIE5ZRVJFIGVubiBzd2FwZmlsIVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpIERldCBlciBtdWxpZyBldCBhbm5ldCBwcm9ncmFtIHJlZGlnZXJlciBkZW4gc2FtbWUgZmlsZW4uXG4iCisiICAgIEh2aXMgZGV0IGVyIHRpbGZlbGxlLCB25nIgZm9yc2lrdGlnIHPlIGR1IGlra2UgZW5kZXIgb3BwIG1lZCB0b1xuIgorIiAgICBmb3Jza2plbGxpZ2UgdXRnYXZlciBhdiBkZW4gc2FtbWUgZmlsZW4gbuVyIGR1IGdq+HIgZm9yYW5kcmluZ2VyLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBBdnNsdXR0LCBlbGxlciBmb3J0c2V0dCBtZWQgdmFyc29taGV0LlxuIgorCisjOiBtZW1saW5lLmM6MzY5NQorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSBFbiD4a3QgZm9yIGRlbm5lIGZpbGVuIGty5nNqZXQuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk2Cittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgSHZpcyBkZXQgZXIgdGlsZmVsbGUsIGJydWsgXCI6cmVjb3ZlclwiIGVsbGVyIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTgKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBmb3Ig5SBnamVub3BwcmV0dGUgZm9yYW5kcmluZ2VuZSAoc2UgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKKworIzogbWVtbGluZS5jOjM2OTkKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgSHZpcyBkdSBoYXIgZ2pvcnQgZGV0dGUgYWxsZXJlZGUsIHNsZXR0IHN3YXBmaWxlbiBcIiIKKworIzogbWVtbGluZS5jOjM3MDEKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgZm9yIOUgdW5uZ+UgZGVubmUgbWVsZGluZ2VuLlxuIgorCisjOiBtZW1saW5lLmM6MzcxNSBtZW1saW5lLmM6MzcxOQorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiU3dhcGZpbGVuIFwiIgorCisjOiBtZW1saW5lLmM6MzcxNiBtZW1saW5lLmM6MzcyMgorbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIgZmlubmVzIGFsbGVyZWRlISIKKworIzogbWVtbGluZS5jOjM3MjUKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIFZJS1RJRyIKKworIzogbWVtbGluZS5jOjM3MjcKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJTd2FwZmlsZW4gZWtzaXN0ZXJlciBhbGxlcmVkZSEiCisKKyM6IG1lbWxpbmUuYzozNzMxCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnQiCittc2dzdHIgIiIKKyImxXBuZSBza3JpdmViZXNreXR0ZXRcbiIKKyImUmVkaWdlciBsaWtldmVsXG4iCisiJkdqZW5vcHByZXR0XG4iCisiJkF2c2x1dHRcbiIKKyJBdiZicnl0IgorCisjOiBtZW1saW5lLmM6MzczMworbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIibFcG5lIHNrcml2ZWJlc2t5dHRldFxuIgorIiZSZWRpZ2VyIGxpa2V2ZWxcbiIKKyImR2plbm9wcHJldHRcbiIKKyImQXZzbHV0dFxuIgorIkF2JmJyeXRcbiIKKyImU2xldHRlIGRlbiIKKworIzogbWVtbGluZS5jOjM3OTAKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiBGb3IgbWFuZ2Ugc3dhcGZpbGVyIGZ1bm5ldCIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IERlbCBhdiBtZW55ZWxlbWVudCBlciBpa2tlIHVuZGVybWVueSIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IE1lbnllbiBla3Npc3RlcmVyIGJhcmUgaSBlbiBhbm5lbiBtb2R1cyIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IEluZ2VuIG1lbnkgbWVkIGRldHRlIG5hdm5ldCIKKworIzogbWVudS5jOjUyNQorbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IE1lbnlzdGkga2FuIGlra2UgbGVkZSB0aWwgZW4gdW5kZXJtZW55IgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IEthbiBpa2tlIGxlZ2dlIHRpbCBtZW55ZWxlbWVudGVyIGRpcmVrdGUgcOUgbWVueWxpbmplbiIKKworIzogbWVudS5jOjU3MAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogU2tpbGxldGVnbiBrYW4gaWtrZSB25nJlIGRlbCBhdiBlbiBtZW55c3RpIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDk3Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTWVueWVyIC0tLSIKKworIzogbWVudS5jOjIwMTkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIlJpdiBhdiBkZW5uZSBtZW55ZW4iCisKKyM6IG1lbnUuYzoyMDg0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogTWVueXN0aWVuIG3lIGxlZGUgdGlsIGV0IG1lbnl2YWxnIgorCisjOiBtZW51LmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IEZhbnQgaWtrZSBtZW55ZW46ICVzIgorCisjOiBtZW51LmM6MjE3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiBNZW55ZW4gZXIgaWtrZSBkZWZpbmVydCBmb3IgJXMtbW9kdXMiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBNZW55c3RpZW4gbeUgbGVkZSB0aWwgZW4gdW5kZXJtZW55IgorCisjOiBtZW51LmM6MjIzMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogRmFudCBpa2tlIG1lbnllbiAtIHNqZWtrIG1lbnluYXZuZXQiCisKKyM6IG1lc3NhZ2UuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIkZlaWwgb3BwZGFnZXQgdW5kZXIgcHJvc2Vzc2VyaW5nIGF2ICVzOiIKKworIzogbWVzc2FnZS5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICJsaW5qZSAlNGxkOiIKKworIzogbWVzc2FnZS5jOjY0NworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJbc3RyZW5nZW4gZXIgZm9yIGxhbmddIgorCisjOiBtZXNzYWdlLmM6Nzk3Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIiIKKyJWZWRsaWtlaG9sZGVyIGZvciBub3JzayBvdmVyc2V0dGVsc2U6INh5dmluZCBBLiBIb2xtIDxzdW5ueUBzdW5iYXNlLm9yZz4iCisKKyM6IG1lc3NhZ2UuYzoxMDI1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIkF2YnJ5dDogIgorCisjOiBtZXNzYWdlLmM6MTAyOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiVHJ5a2sgRU5URVIgZm9yIOUgZm9ydHNldHRlIgorCisjOiBtZXNzYWdlLmM6MTAzMAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlRyeWtrIEVOVEVSIGVsbGVyIHNrcml2IGVuIGtvbW1hbmRvIGZvciDlIGZvcnRzZXR0ZSIKKworIzogbWVzc2FnZS5jOjIzNTEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBNZXIgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIgorIiAoRU5URVIvQkFDS1NQQUNFOiBMaW5qZSwgTUVMTE9NUk9NL2I6IFNpZGUsIFBpbCBuZWQvUGlsIG9wcDogSGFsdiBzaWRlLCBxOiAiCisiQXZzbHV0dCkiCisKKyM6IG1lc3NhZ2UuYzoyMzU1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKEVOVEVSOiBMaW5qZSwgTUVMTE9NUk9NOiBTaWRlLCBkOiBIYWx2IHNpZGUsIHE6IEF2c2x1dHQpIgorCisjOiBtZXNzYWdlLmM6Mjk4MiBtZXNzYWdlLmM6Mjk5NworbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJTcPhyc23lbCIKKworIzogbWVzc2FnZS5jOjI5ODQKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZKYVxuIgorIiZOZWkiCisKKyM6IG1lc3NhZ2UuYzozMDE3Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkphXG4iCisiJk5laVxuIgorIiZMYWdyZSBhbGxlXG4iCisiJkZvcmthc3QgYWxsZVxuIgorIiZBdmJyeXQiCisKKyM6IG1lc3NhZ2UuYzozMDU4Cittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiXCJMYWdyZSBmaWxcIi1kaWFsb2d2aW5kdSIKKworIzogbWVzc2FnZS5jOjMwNjAKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICJcIsVwbmUgZmlsXCItZGlhbG9ndmluZHUiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MzEzMQorbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiBEZXNzdmVycmUgaW5nZW4gZmlsYmVoYW5kbGVyIGkga29uc29sbG1vZHVzIgorCisjOiBtaXNjMS5jOjI3NzMKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBBZHZhcnNlbDogRm9yYW5kcmVyIGVuIHNrcml2ZWJlc2t5dHRldCBmaWwiCisKKyM6IG1pc2MxLmM6MzAyMQorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICIxIGxpbmplIGxhZ3QgdGlsIgorCisjOiBtaXNjMS5jOjMwMjMKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAiMSBsaW5qZSBmamVybmV0IgorCisjOiBtaXNjMS5jOjMwMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiVsZCBsaW5qZXIgbGFndCB0aWwiCisKKyM6IG1pc2MxLmM6MzAzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIiVsZCBsaW5qZXIgZmplcm5ldCIKKworIzogbWlzYzEuYzozMDMzCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAoQXZicnV0dCkiCisKKyM6IG1pc2MxLmM6NzU4OAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IEJldmFyZXIgZmlsZXKgLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo3NTk4Cittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiBGZXJkaWcuXG4iCisKKyM6IG1pc2MyLmM6Njk1IG1pc2MyLmM6NzExCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRkVJTDogIgorCisjOiBtaXNjMi5jOjcxNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltieXRlc10gdG90YWx0IGFsbG9jLWZyaWdqb3J0ICVsdS0lbHUsIGkgYnJ1ayAlbHUsIHRvcHAtYnJ1ayAlbHVcbiIKKworIzogbWlzYzIuYzo3MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIltjYWxsc10gdG90YWwgcmUvbWFsbG9jKCkncyAlbHUsIHRvdGFsIGZyZWUoKSdzICVsdVxuIgorIlxuIgorbXNnc3RyICIiCisiW2thbGxdIHRvdGFsZSBcInJlL21hbGxvYygpXCItZXIgJWx1LCB0b3RhbGUgXCJmcmVlKClcIi1lciAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBMaW5qZW4gYmxpciBmb3IgbGFuZyIKKworIzogbWlzYzIuYzo4MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IEludGVybiBmZWlsOiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogSWtrZSBtZXIgbGVkaWcgaHVrb21tZWxzZSEgKFJlc2VydmVyZXIgJWx1IGJ5dGVzKSIKKworIzogbWlzYzIuYzoyNTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJLYWxsZXIgc2thbGwgZm9yIOUgdXRm+HJlIFwiJXNcIiIKKworIzogbWlzYzIuYzoyODE2Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTogTWFuZ2xlciBrb2xvbiIKKworIzogbWlzYzIuYzoyODE4IG1pc2MyLmM6Mjg0NQorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0NjogVWxvdmxpZyBtb2R1cyIKKworIzogbWlzYzIuYzoyODg0Cittc2dpZCAiRTU0NzogSWxsZWdhbCBtb3VzZXNoYXBlIgorbXNnc3RyICJFNTQ3OiBVbG92bGlnIHV0c2VlbmRlIHDlIG11c2VwZWtlcmVuIgorCisjOiBtaXNjMi5jOjI5MjQKK21zZ2lkICJFNTQ4OiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU0ODogU2lmZmVyIGZvcnZlbnRldCIKKworIzogbWlzYzIuYzoyOTI5Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiBVbG92bGlnIHByb3NlbnQiCisKKyM6IG1pc2MyLmM6MzIzOQorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIlNrcml2IGtyeXB0ZXJpbmdzbvhra2VsOiAiCisKKyM6IG1pc2MyLmM6MzI0MAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIkdqZW50YSBrcnlwdGVyaW5nc274a2tlbGVuOiAiCisKKyM6IG1pc2MyLmM6MzI1MAorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICJLcnlwdGVyaW5nc274a2xlbmUgc3RlbW1lciBpa2tlIG92ZXJlbnMhIgorCisjOiBtaXNjMi5jOjM3OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBVZ3lsZGlnIHN0aTogJyoqW251bW1lcl0nIG3lIHbmcmUgcOUgc2x1dHRlbiBhdiBzdGllbiBlbGxlciBibGkgIgorImV0dGVyZnVsZ3QgYXYgJyVzJy4iCisKKyM6IG1pc2MyLmM6NTA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ0OiBLYW4gaWtrZSBmaW5uZSBrYXRhbG9nZW4gXCIlc1wiIGkgXCJjZHBhdGhcIiIKKworIzogbWlzYzIuYzo1MDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogS2FuIGlra2UgZmlubmUgZmlsZW4gXCIlc1wiIGkgc3RpZW4iCisKKyM6IG1pc2MyLmM6NTA4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiBJbmdlbiBmbGVyZSBrYXRhbG9nLVwiJXNcIiBmdW5uZXQgaSBcImNkcGF0aFwiIgorCisjOiBtaXNjMi5jOjUwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiBJbmdlbiBmbGVyZSBmaWwtXCIlc1wiIGZ1bm5ldCBpIHN0aWVuIgorCisjOiBtaXNjMi5jOjUzMjQKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiBNYW5nbGVyIGtvbG9uIgorCisjOiBtaXNjMi5jOjUzMzYKK21zZ2lkICJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAiRTU1MTogVWxvdmxpZyBrb21wb25lbnQiCisKKyM6IG1pc2MyLmM6NTM0NAorbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiBTaWZmZXIgZm9ydmVudGV0IgorCisjLiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjOiBuZXRiZWFucy5jOjM5NgorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zICMyIgorbXNnc3RyICJLYW4gaWtrZSBrb2JsZSB0aWwgTmV0YmVhbnMgIzIiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIkthbiBpa2tlIGtvYmxlIHRpbCBOZXRiZWFucyIKKworIzogbmV0YmVhbnMuYzo0NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2ODogV3JvbmcgYWNjZXNzIG1vZGUgZm9yIE5ldEJlYW5zIGNvbm5lY3Rpb24gaW5mbyBmaWxlOiBcIiVzXCIiCittc2dzdHIgIiIKKyJFNjY4OiBGZWlsIHRpbGdhbmdzbW9kdXMgZm9yIGluZm9maWxlbiB0aWwgTmV0QmVhbnMtZm9yYmluZGVsc2U6IFwiJXNcIiIKKworIzogbmV0YmVhbnMuYzo3NDkKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICJsZXMgZnJhIE5ldGJlYW5zLXNvY2tldCIKKworIzogbmV0YmVhbnMuYzoxNjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NTg6IE5ldEJlYW5zIGNvbm5lY3Rpb24gbG9zdCBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTY1ODogTWlzdGV0IE5ldEJlYW5zLWZvcmJpbmRlbHNlIGZvciBidWZmZXIgJWxkIgorCisjOiBub3JtYWwuYzoyOTgzCittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAiQWR2YXJzZWw6IFRlcm1pbmFsZW4ga2FuIGlra2UgdXRoZXZlIgorCisjOiBub3JtYWwuYzozMjc5Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogSW5nZW4gc3RyZW5nIHVuZGVyIG1hcmv4ciIKKworIzogbm9ybWFsLmM6MzI4MQorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiBJbmdlbiBpZGVudGlmaWthdG9yIHVuZGVyIG1hcmv4ciIKKworIzogbm9ybWFsLmM6NDUyMgorbXNnaWQgIkUzNTI6IENhbm5vdCBlcmFzZSBmb2xkcyB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUyOiBLYW4gaWtrZSBzbGV0dGUgZm9sZGVyIG1lZCBu5XbmcmVuZGUgJ2ZvbGRtZXRob2QnIgorCisjOiBub3JtYWwuYzo2NzQzCittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDogRm9yYW5kcmluZ3NsaXN0ZW4gZXIgdG9tIgorCisjOiBub3JtYWwuYzo2NzQ1Cittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MjogVmVkIHN0YXJ0ZW4gYXYgZm9yYW5kcmluZ3NsaXN0ZSIKKworIzogbm9ybWFsLmM6Njc0NworbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYzOiBWZWQgc2x1dHRlbiBhdiBmb3JhbmRyaW5nc2xpc3RlIgorCisjOiBub3JtYWwuYzo4MDA5Cittc2dpZCAiVHlwZSAgOnF1aXQ8RW50ZXI+ICB0byBleGl0IFZpbSIKK21zZ3N0ciAiU2tyaXYgIDpxdWl0PEVudGVyPiAgZm9yIOUgYXZzbHV0dGUgVmltIgorCisjOiBvcHMuYzoyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICIxIGxpbmplIFwiJXNcIi1ldCAxIGdhbmciCisKKyM6IG9wcy5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSBsaW5qZSBcIiVzXCItZXQgJWQgZ2FuZ2VyIgorCisjOiBvcHMuYzozMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQgbGluamVyIFwiJXNcIi1ldCAxIGdhbmciCisKKyM6IG9wcy5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkIGxpbmplciBcIiVzXCItZXQgJWQgZ2FuZ2VyIgorCisjOiBvcHMuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIiVsZCBsaW5qZXIg5SByeWtrZSBpbm6gLi4uICIKKworIzogb3BzLmM6NzEyCittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAiMSBsaW5qZSByeWtrZXQgaW5uICIKKworIzogb3BzLmM6NzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIiVsZCBsaW5qZXIgcnlra2V0IGlubiAiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNjg4Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgImthbiBpa2tlIGtvcGllcmUgdGlsIHV0a2xpcHBzdGF2bGU7IHNsZXR0IGxpa2V2ZWwiCisKKyM6IG9wcy5jOjIyNzQKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAiMSBsaW5qZSBmb3JhbmRyZXQiCisKKyM6IG9wcy5jOjIyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiVsZCBsaW5qZXIgZm9yYW5kcmV0IgorCisjOiBvcHMuYzoyNjYwCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICJmcmlnavhyICVsZCBsaW5qZXIiCisKKyM6IG9wcy5jOjI5NDEKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICIxIGxpbmplIGtvcGllcnQgdGlsIHV0a2xpcHBzdGF2bGVuIgorCisjOiBvcHMuYzoyOTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB5YW5rZWQiCittc2dzdHIgIiVsZCBsaW5qZXIga29waWVydCB0aWwgdXRrbGlwcHN0YXZsZW4iCisKKyM6IG9wcy5jOjMyMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogSW5nZW50aW5nIGkgcmVnaXN0ZXIgJXMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6Mzc3OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBSZWdpc3RlcmUgLS0tIgorCisjOiBvcHMuYzo1MDg4Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJVbG92bGlnIHJlZ2lzdGVybmF2biIKKworIzogb3BzLmM6NTE3NgorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgUmVnaXN0ZXJlOlxuIgorCisjOiBvcHMuYzo1MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDogVWtqZW50IHJlZ2lzdGVydHlwZSAlZCIKKworIzogb3BzLmM6NTcxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6IFVneWxkaWcgcmVnaXN0ZXJuYXZuOiAnJXMnIgorCisjOiBvcHMuYzo2MDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCBLb2w7ICIKKworIzogb3BzLmM6NjA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIlZhbGd0ZSAlcyVsZCBhdiAlbGQgbGluamVyOyAlbGQgYXYgJWxkIG9yZDsgJWxkIGF2ICVsZCBieXRlcyIKKworIzogb3BzLmM6NjA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIktvbCAlcyBhdiAlczsgTGluamUgJWxkIGF2ICVsZDsgT3JkICVsZCBhdiAlbGQ7IEJ5dGUgJWxkIGF2ICVsZCIKKworIzogb3BzLmM6NjEwNQorIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgZm9yIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE2NDMKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPVNpZGUgJU4iCisKKyM6IG9wdGlvbi5jOjIwOTIKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIlRha2sgZm9yIGF0IGR1IGZs+HkgVmltIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODogVWtqZW50IHZhbGciCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogVmFsZ2V0IGVyIGlra2Ugc3T4dHRldCIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IElra2UgdGlsbGF0dCBpIG1vZHVzbGluamUiCisKKyM6IG9wdGlvbi5jOjM1MjIKK21zZ2lkICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKK21zZ3N0ciAiIgorIlxuIgorIlx0U2lzdCBzYXR0IGZyYSAiCisKKyM6IG9wdGlvbi5jOjM2NjEKK21zZ2lkICJFNTIxOiBOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiRTUyMTogTnVtbWVyIG74ZHZlbmRpZyBldHRlciA9IgorCisjOiBvcHRpb24uYzozOTg5IG9wdGlvbi5jOjQ2MTkKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogSWtrZSBmdW5uZXQgaSB0ZXJtY2FwIgorCisjOiBvcHRpb24uYzo0MDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IFVsb3ZsaWcgdGVnbiA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiBLYW4gaWtrZSBzZXR0ZSAndGVybScgdGlsIHRvbSBzdHJlbmciCisKKyM6IG9wdGlvbi5jOjQ2MTQKK21zZ2lkICJFNTMwOiBDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJFNTMwOiBLYW4gaWtrZSBmb3JhbmRyZSBcInRlcm1cIiBpIGdyYWZpc2sgYnJ1a2VyZ3JlbnNlc25pdHQiCisKKyM6IG9wdGlvbi5jOjQ2MTYKK21zZ2lkICJFNTMxOiBVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTUzMTogQnJ1ayBcIjpndWlcIiBmb3Ig5SBzdGFydGUgbWVkIGdyYWZpc2sgYnJ1a2VyZ3JlbnNlc25pdHQiCisKKyM6IG9wdGlvbi5jOjQ2NDUKK21zZ2lkICJFNTg5OiAnYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICJFNTg5OiAnYmFja3VwZXh0JyBvZyAncGF0Y2htb2RlJyBlciBsaWtlIgorCisjOiBvcHRpb24uYzo0ODYwCittc2dpZCAiRTYxNzogQ2Fubm90IGJlIGNoYW5nZWQgaW4gdGhlIEdUSysgMiBHVUkiCittc2dzdHIgIkU2MTc6IEthbiBpa2tlIGZvcmFuZHJlcyBpIEdUSysgMiBHVUkiCisKKyM6IG9wdGlvbi5jOjUwMTYKK21zZ2lkICJFNTI0OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTI0OiBNYW5nbGVyIGtvbG9uIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiBUb20gc3RyZW5nIgorCisjOiBvcHRpb24uYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IE1hbmdsZXIgbnVtbWVyIGV0dGVyIDwlcz4iCisKKyM6IG9wdGlvbi5jOjUxMDAKK21zZ2lkICJFNTI3OiBNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJFNTI3OiBNYW5nbGVyIGtvbW1hIgorCisjOiBvcHRpb24uYzo1MTA3Cittc2dpZCAiRTUyODogTXVzdCBzcGVjaWZ5IGEgJyB2YWx1ZSIKK21zZ3N0ciAiRTUyODogTeUgc3Blc2lmaXNlcmUgZW4gXCInXCItdmVyZGkiCisKKyM6IG9wdGlvbi5jOjUxNDgKK21zZ2lkICJFNTk1OiBjb250YWlucyB1bnByaW50YWJsZSBvciB3aWRlIGNoYXJhY3RlciIKK21zZ3N0ciAiRTU5NTogSW5uZWhvbGRlciB1c2tyaXZlbGlnZSBlbGxlciBicmVkZSB0ZWduIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBVZ3lsZGlnKGUpIHNrcmlmdHR5cGUocikiCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5NzogS2FuIGlra2UgdmVsZ2Ugc2tyaWZ0dHlwZXNldHQiCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IFVneWxkaWcgc2tyaWZ0dHlwZXNldHQiCisKKyM6IG9wdGlvbi5jOjUyMTQKK21zZ2lkICJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJFNTMzOiBLYW4gaWtrZSB2ZWxnZSBicmVkIHNrcmlmdHR5cGUiCisKKyM6IG9wdGlvbi5jOjUyMTYKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDogVWd5bGRpZyBicmVkIHNrcmlmdHR5cGUiCisKKyM6IG9wdGlvbi5jOjU0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogVWxvdmxpZyB0ZWduIGV0dGVyIDwlYz4iCisKKyM6IG9wdGlvbi5jOjU1OTcKK21zZ2lkICJFNTM2OiBjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAiRTUzNjogS29tbWEgbvhkdmVuZGlnIgorCisjOiBvcHRpb24uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBt5SB25nJlIHRvbSBlbGxlciBpbm5laG9sZGUgJXMiCisKKyM6IG9wdGlvbi5jOjU2ODIKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiBJbmdlbiBzdPh0dGUgZm9yIG11cyIKKworIzogb3B0aW9uLmM6NTk1MAorbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IFV0dHJ5a2tzc2VrdmVucyBzb20gaWtrZSBlciBsdWtrZXQiCisKKyM6IG9wdGlvbi5jOjU5NTQKK21zZ2lkICJFNTQxOiB0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAiRTU0MTogRm9yIG1hbmdlIGVsZW1lbnRlciIKKworIzogb3B0aW9uLmM6NTk1NgorbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiBVYmFsYW5zZXJ0ZSBncnVwcGVyIgorCisjOiBvcHRpb24uYzo2MTk2Cittc2dpZCAiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTU5MDogRGV0IGZpbm5lcyBhbGxlcmVkZSBldCBmb3Jo5W5kc3Zpc25pbmdzdmluZHUiCisKKyM6IG9wdGlvbi5jOjY0NTMKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICJXMTc6IEFyYWJpc2sgdHJlbmdlciBVVEYtOCwgdXRm+HIgJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorCisjOiBvcHRpb24uYzo2Nzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IFRyZW5nZXIgbWluc3QgJWQgbGluamVyIgorCisjOiBvcHRpb24uYzo2Nzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDogVHJlbmdlciBtaW5zdCAlZCBrb2xvbm5lciIKKworIzogb3B0aW9uLmM6NzEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IFVramVudCB2YWxnOiAlcyIKKworIzogb3B0aW9uLmM6NzIyMworbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwgY29kZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRlcm1pbmFsa29kZXIgLS0tIgorCisjOiBvcHRpb24uYzo3MjI1Cittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gR2xvYmFsZSB2YWxndmVyZGllciAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjcKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIExva2FsZSB2YWxndmVyZGllciAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjkKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFZhbGcgLS0tIgorCisjOiBvcHRpb24uYzo3OTM1Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IFwiZ2V0X3ZhcnBcIi1GRUlMIgorCisjOiBvcHRpb24uYzo4OTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IFNhbXN2YXJlbmRlIHRlZ24gbWFuZ2xlciBmb3IgJXMiCisKKyM6IG9wdGlvbi5jOjg5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogRWtzdHJhIHRlZ24gZXR0ZXIgc2VtaWtvbG9uOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyODAKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgImthbiBpa2tlIOVwbmUgIgorCisjOiBvc19hbWlnYS5jOjMxNAorbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogS2FuIGlra2Ug5XBuZSB2aW5kdSFcbiIKKworIzogb3NfYW1pZ2EuYzozMzgKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJUcmVuZ2VyIEFtaWdhZG9zIHZlcnNqb24gMi4wNCBlbGxlciBueWVyZVxuIgorCisjOiBvc19hbWlnYS5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIlRyZW5nZXIgJXMgdmVyc2pvbiAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MTYKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIkthbiBpa2tlIOVwbmUgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQyNworbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICJLYW4gaWtrZSBvcHByZXR0ZSAiCisKKyM6IG9zX2FtaWdhLmM6OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIGF2c2x1dHRlciBtZWQgJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5NDEKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJrYW4gaWtrZSBmb3JhbmRyZSBrb25zb2xsbW9kdXMgPyFcbiIKKworIzogb3NfYW1pZ2EuYzoxMDEyCittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogSWtrZSBldCBrb25zb2xsPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE2MQorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiBLYW4gaWtrZSBravhyZSBza2FsbCBtZWQgXCItZlwiLXZhbGciCisKKyM6IG9zX2FtaWdhLmM6MTIwMiBvc19hbWlnYS5jOjEyOTIKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIkthbiBpa2tlIHV0ZvhyZSAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNSBvc19hbWlnYS5jOjEzMDIKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgInNrYWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjI1IG9zX2FtaWdhLmM6MTMyNworbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgcmV0dXJuZXJ0ZVxuIgorCisjOiBvc19hbWlnYS5jOjE0NjgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIGZvciBsaXRlbi4iCisKKyM6IG9zX2FtaWdhLmM6MTQ3MgorbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAiSS9VLUZFSUwiCisKKyM6IG9zX21zd2luLmM6NTQ4Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIqAuLi4oa3V0dGV0KSIKKworIzogb3NfbXN3aW4uYzo2NTAKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIGVyIGlra2UgODAsIGthbiBpa2tlIHV0ZvhyZSBla3N0ZXJuZSBrb21tYW5kb2VyIgorCisjOiBvc19tc3dpbi5jOjE5ODIKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IFZhbGcgYXYgc2tyaXZlciBmZWlsZXQiCisKKyM6IG9zX21zd2luLmM6MjAyMgorIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAidGlsICVzIHDlICVzIgorCisjOiBvc19tc3dpbi5jOjIwMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMzogVW5rbm93biBwcmludGVyIGZvbnQ6ICVzIgorbXNnc3RyICJFNjEzOiBVa2plbnQgc2tyaWZ0dHlwZSBmb3Igc2tyaXZlcjogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4NiBvc19tc3dpbi5jOjIwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBGZWlsIHVuZGVyIHV0c2tyaWZ0OiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDk3Cittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiVWtqZW50IgorCisjOiBvc19tc3dpbi5jOjIxMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiU2tyaXZlciB1dCAnJXMnIgorCisjOiBvc19tc3dpbi5jOjMyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDQ6IFVsb3ZsaWcgbmF2biBw5SB0ZWduc2V0dCBcIiVzXCIgaSBza3JpZnR0eXBlbmF2biBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MzIyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBVbG92bGlnIHRlZ24gJyVjJyBpIHNrcmlmdHR5cGVuYXZuIFwiJXNcIiIKKworIzogb3NfcmlzY29zLmM6MTI1OQorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IFVneWxkaWcgJ29zZmlsZXR5cGUnLXZhbGcgLSBicnVrZXIgVGV4dCIKKworIzogb3NfdW5peC5jOjkyNworbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IERvYmJlbHQgc2lnbmFsLCBhdnNsdXR0ZXJcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogTW90dG9rIGT4ZGVsaWcgc2lnbmFsICVzXG4iCisKKyM6IG9zX3VuaXguYzo5MzYKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogTW90dG9rIGT4ZGVsaWcgc2lnbmFsXG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICLFcG5pbmcgYXYgWC1kaXNwbGF5IHRvayAlbGQgbWlsbGlzZWt1bmRlciIKKworIzogb3NfdW5peC5jOjEyMjYKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBNb3R0b2sgWC1mZWlsXG4iCisKKyM6IG9zX3VuaXguYzoxMzM4Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiVGVzdCBhdiBYLWRpc3BsYXkgZmVpbGV0IgorCisjOiBvc191bml4LmM6MTQ3NworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIlRpZHNhdmJydWRkIGZvciDlcG5pbmcgYXYgWC1kaXNwbGF5IgorCisjOiBvc191bml4LmM6MzIzNCBvc191bml4LmM6MzkxNAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyJLYW4gaWtrZSBravhyZSBza2FsbCAiCisKKyM6IG9zX3VuaXguYzozMjgyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyJLYW4gaWtrZSBravhyZSBza2FsbGV0IHNoXG4iCisKKyM6IG9zX3VuaXguYzozMjg2IG9zX3VuaXguYzozOTIwCittc2dpZCAiIgorIlxuIgorInNoZWxsIHJldHVybmVkICIKK21zZ3N0ciAiIgorIlxuIgorInNrYWxsZXQgcmV0dXJuZXJ0ZSAiCisKKyM6IG9zX3VuaXguYzozNDIxCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIkthbiBpa2tlIG9wcHJldHRlIHL4ciAoXCJwaXBlXCIpXG4iCisKKyM6IG9zX3VuaXguYzozNDM2Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyJLYW4gaWtrZSBvcHByZXR0ZSB0dmlsbGluZ3Byb3Nlc3MgKFwiZm9ya1wiKVxuIgorCisjOiBvc191bml4LmM6MzkyNworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIktvbW1hbmRvIGF2c2x1dHRldFxuIgorCisjOiBvc191bml4LmM6NDE5MSBvc191bml4LmM6NDMxNiBvc191bml4LmM6NTk4MgorbXNnaWQgIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCBtaXN0ZXQgSUNFLWZvcmJpbmRlbHNlbiIKKworIzogb3NfdW5peC5jOjU1NjUKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICLFcG5pbmcgYXYgWC1kaXNwbGF5IGZlaWxldCIKKworIzogb3NfdW5peC5jOjU4ODcKK21zZ2lkICJYU01QIGhhbmRsaW5nIHNhdmUteW91cnNlbGYgcmVxdWVzdCIKK21zZ3N0ciAiWFNNUCBo5W5kdGVyZXIgXCJyZWRkLWRlZy1zZWx2XCItZm9yZXNw+HJzZWwiCisKKyM6IG9zX3VuaXguYzo2MDA2Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAg5XBuZXIgZm9yYmluZGVsc2UiCisKKyM6IG9zX3VuaXguYzo2MDI1Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIk92ZXJ25WtuaW5nIGF2IFhTTVAgSUNFLWZvcmJpbmRlbHNlIGZlaWxldCIKKworIzogb3NfdW5peC5jOjYwNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZlaWxldDogJXMiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIlDlIGxpbmplIgorCisjOiBvc193MzJleGUuYzo2NQorbXNnaWQgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iCittc2dzdHIgIktsYXJ0ZSBpa2tlIHJlc2VydmVyZSBodWtvbW1lbHNlIGZvciBrb21tYW5kb2xpbmplbi4iCisKKyM6IG9zX3czMmV4ZS5jOjY2IG9zX3czMmV4ZS5jOjg5IG9zX3czMmV4ZS5jOjEwMAorbXNnaWQgIlZJTSBFcnJvciIKK21zZ3N0ciAiVklNLWZlaWwiCisKKyM6IG9zX3czMmV4ZS5jOjg5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAiS2xhcnRlIGlra2UgbGFzdGUgdmltMzIuZGxsISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJLbGFydGUgaWtrZSBvcmRuZSBvcHAgaSBmdW5rc2pvbnNwZWtlcmUgdGlsIERMTC1lbiEiCisKKyM6IG9zX3dpbjE2LmM6MzQyIG9zX3dpbjMyLmM6MzI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAic2thbGxldCByZXR1cm5lcnRlICVkIgorCisjOiBvc193aW4zMi5jOjI3MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiBNb3R0b2sgXCIlc1wiLWhlbmRlbHNlXG4iCisKKyM6IG9zX3dpbjMyLmM6MjcwOAorbXNnaWQgImNsb3NlIgorbXNnc3RyICJsdWtrIgorCisjOiBvc193aW4zMi5jOjI3MTAKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgImxvZ2cgYXYiCisKKyM6IG9zX3dpbjMyLmM6MjcxMQorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICJravhyIG5lZCIKKworIzogb3Nfd2luMzIuYzozMjAxCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IEtvbW1hbmRvIGlra2UgZnVubmV0IgorCisjOiBvc193aW4zMi5jOjMyMTQKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyJWSU1SVU4uRVhFIGlra2UgZnVubmV0IGkgJFBBVEguXG4iCisiRWtzdGVybmUga29tbWFuZG9lciBrb21tZXIgaWtrZSB0aWwg5SB2ZW50ZSBldHRlciBmdWxsZvhyaW5nLlxuIgorIlNlIFwiOmhlbHAgd2luMzItdmltcnVuXCIgZm9yIG1lciBpbmZvcm1hc2pvbi4iCisKKyM6IG9zX3dpbjMyLmM6MzIxNworbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWaW0tYWR2YXJzZWwiCisKKyM6IHF1aWNrZml4LmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogRm9yIG1hbmdlICUlJWMgaSBmb3JtYXRzdHJlbmciCisKKyM6IHF1aWNrZml4LmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiBVdmVudGV0ICUlJWMgaSBmb3JtYXRzdHJlbmciCisKKyM6IHF1aWNrZml4LmM6MzI1Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IE1hbmdsZXIgXSBpIGZvcm1hdHN0cmVuZyIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjIGlra2Ugc3T4dHRldCBpIGZvcm1hdHN0cmVuZyIKKworIzogcXVpY2tmaXguYzozNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiBVZ3lsZGlnICUlJWMgaSBmb3JtYXRzdHJlbmctcHJlZmlrcyIKKworIzogcXVpY2tmaXguYzozNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IFVneWxkaWcgJSUlYyBpIGZvcm1hdHN0cmVuZyIKKworIzogcXVpY2tmaXguYzozOTEKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgaW5uZWhvbGRlciBpa2tlIHP4a2VzdHJlbmciCisKKyM6IHF1aWNrZml4LmM6NTAxCittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTogTWFuZ2xlbmRlIGVsbGVyIHRvbXQga2F0YWxvZ25hdm4iCisKKyM6IHF1aWNrZml4LmM6OTkwCittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1MzogSW5nZW4gZmxlcmUgZWxlbWVudGVyIgorCisjOiBxdWlja2ZpeC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIGF2ICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMjMxCittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKGxpbmplbiBzbGV0dGV0KSIKKworIzogcXVpY2tmaXguYzoxNDQ0Cittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBQ5SBidW5uZW4gYXYgcXVpY2tmaXgtc3RhY2siCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogUOUgdG9wcGVuIGF2IHF1aWNrZml4LXN0YWNrIgorCisjOiBxdWlja2ZpeC5jOjE0NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJmZWlsbGlzdGUgJWQgYXYgJWQ7ICVkIGZlaWwiCisKKyM6IHF1aWNrZml4LmM6MTk0MworbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIkUzODI6IEthbiBpa2tlIGxhZ3JlLCAnYnVmdHlwZSctdmFsZ2V0IGVyIHNhdHQiCisKKyM6IHJlZ2V4cC5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY5OiBpbnZhbGlkIGl0ZW0gaW4gJXMlJVtdIgorbXNnc3RyICJFMzY5OiBVZ3lsZGlnIGVsZW1lbnQgaSAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjgzOAorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFP4a2VzdHJlbmdlbiBlciBmb3IgbGFuZyIKKworIzogcmVnZXhwLmM6MTAwOQorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiBGb3IgbWFuZ2UgXFx6KCIKKworIzogcmVnZXhwLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiBGb3IgbWFuZ2UgJXMoIgorCisjOiByZWdleHAuYzoxMDc3Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiBVc2Ftc3ZhcmVuZGUgXFx6KCIKKworIzogcmVnZXhwLmM6MTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiBVc2Ftc3ZhcmVuZGUgJXMlJSgiCisKKyM6IHJlZ2V4cC5jOjEwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6IFVzYW1zdmFyZW5kZSAlcygiCisKKyM6IHJlZ2V4cC5jOjEwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6IFVzYW1zdmFyZW5kZSAlcykiCisKKyM6IHJlZ2V4cC5jOjEyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiBcIiVzKlwiLW9wZXJhdG9yZW4ga3VubmUgduZyZSB0b20iCisKKyM6IHJlZ2V4cC5jOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU3OiBcIiVzK1wiLW9wZXJhdG9yZW4ga3VubmUgduZyZSB0b20iCisKKyM6IHJlZ2V4cC5jOjEzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTogVWd5bGRpZyB0ZWduIGV0dGVyICVzQCIKKworIzogcmVnZXhwLmM6MTM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTg6ICVzeyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTg6IFwiJXN7XCItb3BlcmF0b3JlbiBrdW5uZSB25nJlIHRvbSIKKworIzogcmVnZXhwLmM6MTM1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA6IFRvbyBtYW55IGNvbXBsZXggJXN7Li4ufXMiCittc2dzdHIgIkU2MDogRm9yIG1hbmdlIGtvbXBsZWtzZSAlc3suLi59cyIKKworIzogcmVnZXhwLmM6MTM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogTvhzdGVkZSAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiBO+HN0ZWRlICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0OTEKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiBVZ3lsZGlnIGJydWsgYXYgXFxfIgorCisjOiByZWdleHAuYzoxNTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyBldHRlcmb4bGdlciBpbmdlbnRpbmciCisKKyM6IHJlZ2V4cC5jOjE1OTIKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogVWxvdmxpZyB0aWxiYWtlcmVmZXJhbnNlIgorCisjOiByZWdleHAuYzoxNjA1Cittc2dpZCAiRTY2OiBcXHooIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NjogXFx6KCBpa2tlIHRpbGxhdHQgaGVyIgorCisjOiByZWdleHAuYzoxNjI0Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgbWVkIHZlbm5lciBlciBpa2tlIHRpbGxhdHQgaGVyIgorCisjOiByZWdleHAuYzoxNjM1Cittc2dpZCAiRTY4OiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXHoiCittc2dzdHIgIkU2ODogVWd5bGRpZyB0ZWduIGV0dGVyIFxceiIKKworIzogcmVnZXhwLmM6MTY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiBNYW5nbGVyIF0gZXR0ZXIgJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogVG9tICVzJSVbXSIKKworIzogcmVnZXhwLmM6MTc2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNzE6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyICVzJSUiCittc2dzdHIgIkU3MTogVWd5bGRpZyB0ZWduIGV0dGVyICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6IFN5bnRha3NmZWlsIGkgJXN7Li4ufSIKKworIzogcmVnZXhwLmM6Mjg2MyByZWdleHAuYzozMDE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IEty5nNqIGZhbmdldCBvcHA7IHJlZ3Vs5nJ0IHV0dHJ5a2sgZm9yIGtvbXBsZWtzdD8iCisKKyM6IHJlZ2V4cC5jOjMwMDQgcmVnZXhwLmM6MzAxMworbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogU/hrZXN0cmVuZyBmb3LlcnNha2V0IHV0LWF2LXN0YWNrLWZlaWwiCisKKyM6IHJlZ2V4cC5jOjMyNTgKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICJFa3N0ZXJuZSBkZWx0cmVmZjpcbiIKKworIzogc2NyZWVuLmM6MjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgbGluamVyIGZvbGRldCAiCisKKyM6IHNjcmVlbi5jOjgwMDAKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLUVSU1RBVFQiCisKKyM6IHNjcmVlbi5jOjgwMDQKK21zZ2lkICIgUkVQTEFDRSIKK21zZ3N0ciAiIEVSU1RBVFQiCisKKyM6IHNjcmVlbi5jOjgwMDkKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiIE9NVkVORFQiCisKKyM6IHNjcmVlbi5jOjgwMTEKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgU0VUVCBJTk4iCisKKyM6IHNjcmVlbi5jOjgwMTQKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAoc2V0dCBpbm4pIgorCisjOiBzY3JlZW4uYzo4MDE2Cittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiIChlcnN0YXR0KSIKKworIzogc2NyZWVuLmM6ODAxOAorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKHYtZXJzdGF0dCkiCisKKyM6IHNjcmVlbi5jOjgwMjEKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIgaGVicmFpc2siCisKKyM6IHNjcmVlbi5jOjgwMzIKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIgYXJhYmlzayIKKworIzogc2NyZWVuLmM6ODAzNQorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAobGFuZykiCisKKyM6IHNjcmVlbi5jOjgwMzkKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiIChsaW0gaW5uKSIKKworIzogc2NyZWVuLmM6ODA1MgorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBWSVNVRUxMIgorCisjOiBzY3JlZW4uYzo4MDUzCittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgVklTVUVMTCBMSU5KRSIKKworIzogc2NyZWVuLmM6ODA1NAorbXNnaWQgIiBWSVNVQUwgQkxPQ0siCittc2dzdHIgIiBWSVNVRUxMIEJMT0tLIgorCisjOiBzY3JlZW4uYzo4MDU1Cittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIFZFTEciCisKKyM6IHNjcmVlbi5jOjgwNTYKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiBWRUxHIExJTkpFIgorCisjOiBzY3JlZW4uYzo4MDU3Cittc2dpZCAiIFNFTEVDVCBCTE9DSyIKK21zZ3N0ciAiIFZFTEcgQkxPS0siCisKKyM6IHNjcmVlbi5jOjgwNzIgc2NyZWVuLmM6ODEzNQorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAic3BpbGxlciBpbm4iCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJT+GtldCB0cmFmZiBUT1BQRU4sIGZvcnRzZXR0ZXIgZnJhIEJVTk5FTiIKKworIzogc2VhcmNoLmM6MzgKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgIlP4a2V0IHRyYWZmIEJVTk5FTiwgZm9ydHNldHRlciBmcmEgVE9QUEVOIgorCisjOiBzZWFyY2guYzo1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogVWd5bGRpZyBz+Gtlc3RyZW5nOiAlcyIKKworIzogc2VhcmNoLmM6ODUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDogU/hrZXQga29tIHRpbCBUT1BQRU4gdXRlbiB0cmVmZiBw5TogJXMiCisKKyM6IHNlYXJjaC5jOjg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IFP4a2V0IGtvbSB0aWwgQlVOTkVOIHV0ZW4gdHJlZmYgcOU6ICVzIgorCisjOiBzZWFyY2guYzoxMjQ5Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiBGb3J2ZW50ZXQgJz8nIGVsbGVyICcvJyBldHRlciAnOyciCisKKyM6IHNlYXJjaC5jOjM3NjgKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiIChpbmtsdWRlcmVyIHRpZGxpZ2VyZSB1dGxpc3RlZGUgdHJlZmYpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3ODgKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gSW5rbHVkZXJ0ZSBmaWxlciAiCisKKyM6IHNlYXJjaC5jOjM3OTAKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICJpa2tlIGZ1bm5ldCAiCisKKyM6IHNlYXJjaC5jOjM3OTEKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICJpIHN0aSAtLS1cbiIKKworIzogc2VhcmNoLmM6Mzg0OAorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAoQWxsZXJlZGUgbGlzdGV0KSIKKworIzogc2VhcmNoLmM6Mzg1MAorbXNnaWQgIiAgTk9UIEZPVU5EIgorbXNnc3RyICIgIElLS0UgRlVOTkVUIgorCisjOiBzZWFyY2guYzozOTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICJMZXRlciBnamVubm9tIGlua2x1ZGVydCBmaWw6ICVzIgorCisjOiBzZWFyY2guYzo0MTIwCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBUcmVmZmV0IGVyIHDlIG7lduZyZW5kZSBsaW5qZSIKKworIzogc2VhcmNoLmM6NDI2MworbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICJBbGxlIGlua2x1ZGVydGUgZmlsZXIgYmxlIGZ1bm5ldCIKKworIzogc2VhcmNoLmM6NDI2NQorbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICJJbmdlbiBpbmtsdWRlcnRlIGZpbGVyIgorCisjOiBzZWFyY2guYzo0MjgxCittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBGYW50IGlra2UgZGVmaW5pc2pvbmVuIgorCisjOiBzZWFyY2guYzo0MjgzCittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiBGYW50IGlra2Ugc/hrZXRla3N0ZW4iCisKKyM6IHN5bnRheC5jOjMwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IFVsb3ZsaWcgcGFyYW1ldGVyOiAlcyIKKworIzogc3ludGF4LmM6MzIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogU3ludGFrc2tseW5nZW4gZmlubmVzIGlra2U6ICVzIgorCisjOiBzeW50YXguYzozMzk0Cittc2dpZCAiTm8gU3ludGF4IGl0ZW1zIGRlZmluZWQgZm9yIHRoaXMgYnVmZmVyIgorbXNnc3RyICJJbmdlbiBzeW50YWtzZWxlbWVudGVyIGVyIGRlZmluZXJ0IGZvciBkZW5uZSBidWZmZXJlbiIKKworIzogc3ludGF4LmM6MzQwMgorbXNnaWQgInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIKK21zZ3N0ciAic3lua3JvbmlzZXJlciBDLWxpZ25lbmRlIGtvbW1lbnRhcmVyIgorCisjOiBzeW50YXguYzozNDEwCittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAiaW5nZW4gc3lua3JvbmlzZXJpbmciCisKKyM6IHN5bnRheC5jOjM0MTMKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgInN5bmtyb25pc2VyaW5nIHN0YXJ0ZXIgIgorCisjOiBzeW50YXguYzozNDE1IHN5bnRheC5jOjM0OTAKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgbGluamVyIGb4ciB0b3BwbGluamUiCisKKyM6IHN5bnRheC5jOjM0MjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBcIlN5bnRheCBzeW5jXCItZWxlbWVudGVyIC0tLSIKKworIzogc3ludGF4LmM6MzQyNQorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisic3lua3JvbmlzZXJlciBw5SBlbGVtZW50ZXIiCisKKyM6IHN5bnRheC5jOjM0MzEKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU3ludGFrc2VsZW1lbnRlciAtLS0iCisKKyM6IHN5bnRheC5jOjM0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IFN5bnRha3NrbHluZ2VuIGZpbm5lcyBpa2tlOiAlcyIKKworIzogc3ludGF4LmM6MzQ4MAorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICJtaW5pbWFsICIKKworIzogc3ludGF4LmM6MzQ4NworbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICJtYWtzaW1hbCAiCisKKyM6IHN5bnRheC5jOjM0OTkKK21zZ2lkICI7IG1hdGNoICIKK21zZ3N0ciAiOyBzYW1zdmFyZXIgbWVkICIKKworIzogc3ludGF4LmM6MzUwMQorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIGxpbmplc2tpZnQiCisKKyM6IHN5bnRheC5jOjQxMzUKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IFwiZ3JvdXBbdF1oZXJlXCIgYWtzZXB0ZXJlcyBpa2tlIGhlciIKKworIzogc3ludGF4LmM6NDE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IEZhbnQgaWtrZSByZWdpb25lbGVtZW50IGZvciAlcyIKKworIzogc3ludGF4LmM6NDE4NworbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBcImNvbnRhaW5zXCItcGFyYW1ldGVyIGFrc2VwdGVyZXMgaWtrZSBoZXIiCisKKyM6IHN5bnRheC5jOjQxOTgKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogXCJjb250YWluZWRpblwiLXBhcmFtZXRlciBha3NlcHRlcmVzIGlra2UgaGVyIgorCisjOiBzeW50YXguYzo0Mjc2Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6IFRyZW5nZXIgZmlsbmF2biIKKworIzogc3ludGF4LmM6NDYxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IE1hbmdsZXIgJz0nOiAlcyIKKworIzogc3ludGF4LmM6NDc3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIKK21zZ3N0ciAiRTM5OTogSWtrZSBub2sgcGFyYW1ldGVyZTogc3ludGF4IHJlZ2lvbiAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBJbmdlbiBrbHluZ2UgZXIgc3Blc2lmaXNlcnQiCisKKyM6IHN5bnRheC5jOjUxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogU2tpbGxldGVnbiBmb3Igc/hrZXRla3N0IGJsZSBpa2tlIGZ1bm5ldDogJXMiCisKKyM6IHN5bnRheC5jOjUyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogU/hwcGVsIGV0dGVyIHP4a2V0ZWtzdDogJXMiCisKKyM6IHN5bnRheC5jOjUzMDUKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICIiCisiRTQwMzogc3ludGF4IHN5bmM6IFP4a2VzdHJlbmcgZm9yIGxpbmplZm9ydHNldHRlbHNlciBlciBzcGVzaWZpc2VydCB0byBnYW5nZXIiCisKKyM6IHN5bnRheC5jOjUzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBVbG92bGlnZSBwYXJhbWV0ZXJlOiAlcyIKKworIzogc3ludGF4LmM6NTQxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA1OiBNaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDA1OiBNYW5nbGVyIFwiZXIgbGlrXCItdGVnbjogJXMiCisKKyM6IHN5bnRheC5jOjU0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBUb210IHBhcmFtZXRlcjogJXMiCisKKyM6IHN5bnRheC5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMgZXIgaWtrZSB0aWxsYXR0IGhlciIKKworIzogc3ludGF4LmM6NTQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG3lIHbmcmUgZvhyc3QgaSBcImNvbnRhaW5zXCItbGlzdGUiCisKKyM6IHN5bnRheC5jOjU1MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogVWtqZW50IGdydXBwZW5hdm46ICVzIgorCisjOiBzeW50YXguYzo1NzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogVWd5bGRpZyBcIjpzeW50YXhcIi1kZWxrb21tYW5kbzogJXMiCisKKyM6IHN5bnRheC5jOjYxMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IEZhbnQgaWtrZSB1dGhldmluZ3NncnVwcGU6ICVzIgorCisjOiBzeW50YXguYzo2MTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiBJa2tlIG5vayBwYXJhbWV0ZXJlOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogRm9yIG1hbmdlIHBhcmFtZXRlcmU6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxODcKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IFN5bnRheGdydXBwZW4gaGFyIG9wcHNldHQsIHV0aGV2aW5nc2xlbmtlIGlnbm9yZXJlcyIKKworIzogc3ludGF4LmM6NjMxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiBVdmVudGV0IFwiZXIgbGlrXCItdGVnbjogJXMiCisKKyM6IHN5bnRheC5jOjYzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogTWFuZ2xlciBcImVyIGxpa1wiLXRlZ246ICVzIgorCisjOiBzeW50YXguYzo2MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiBNYW5nbGVyIHBhcmFtZXRlcjogJXMiCisKKyM6IHN5bnRheC5jOjY0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IFVsb3ZsaWcgdmVyZGk6ICVzIgorCisjOiBzeW50YXguYzo2NTM2Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogVWtqZW50IGZvcmdydW5uc2ZhcmdlIgorCisjOiBzeW50YXguYzo2NTQ3Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogVWtqZW50IGJha2dydW5uc2ZhcmdlIgorCisjOiBzeW50YXguYzo2NjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogS2plbm5lciBpa2tlIHRpbCBmYXJnZW5hdm5ldCBlbGxlciAtbnVtbWVyZXQ6ICVzIgorCisjOiBzeW50YXguYzo2ODE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiBUZXJtaW5hbGtvZGVuIGVyIGZvciBsYW5nOiAlcyIKKworIzogc3ludGF4LmM6Njg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogVWxvdmxpZyBwYXJhbWV0ZXI6ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDogRm9yIG1hbmdlIGZvcnNramVsbGlnZSB1dGhldmluZ3NhdHRyaWJ1dHRlciBpIGJydWsiCisKKyM6IHN5bnRheC5jOjc5MTEKK21zZ2lkICJFNjY5OiBVbnByaW50YWJsZSBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiRTY2OTogSWtrZS1za3JpdmJhcnQgdGVnbiBpIGdydXBwZW5hdm4iCisKKyMuIFRoaXMgaXMgYW4gZXJyb3IsIGJ1dCBzaW5jZSB0aGVyZSBwcmV2aW91c2x5IHdhcyBubyBjaGVjayBvbmx5CisjLiAqIGdpdmUgYSB3YXJuaW5nLgorIzogc3ludGF4LmM6NzkxOAorbXNnaWQgIlcxODogSW52YWxpZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiVzE4OiBVZ3lsZGlnIHRlZ24gaSBncnVwcGVuYXZuIgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6IFDlIGJ1bm5lbiBhdiB0YWctc3RhY2siCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogUOUgdG9wcGVuIGF2IHRhZy1zdGFjayIKKworIzogdGFnLmM6NDEyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IEthbiBpa2tlIGflIGb4ciBm+HJzdGUgc2Ftc3ZhcmVuZGUgdGFnIgorCisjOiB0YWcuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IEZhbnQgaWtrZSB0YWc6ICVzIgorCisjOiB0YWcuYzo1ODMKKyN+IG1zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorI34gbXNnc3RyICIiCisKKyM6IHRhZy5jOjU4NgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAiZmlsXG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3NDQKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIlZlbGcgdGFnIGZyYSBsaXN0ZW4gKDxDUj4gZm9yIOUgYXZicnl0ZSk6ICIKKworIzogdGFnLmM6Nzg0Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiBEZXQgZmlubmVzIGJhcmUgZW4gc2Ftc3ZhcmVuZGUgdGFnIgorCisjOiB0YWcuYzo3ODYKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI4OiBLYW4gaWtrZSBn5SBiYWsgc2lzdGUgc2Ftc3ZhcmVuZGUgdGFnIgorCisjOiB0YWcuYzo4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkZpbGVuIFwiJXNcIiBmaW5uZXMgaWtrZSIKKworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICJ0YWcgJWQgYXYgJWQlcyIKKworIzogdGFnLmM6ODI2Cittc2dpZCAiIG9yIG1vcmUiCittc2dzdHIgIiBlbGxlciBtZXIiCisKKyM6IHRhZy5jOjgyOAorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgQnJ1a2VyIHRhZyBtZWQgZm9yc2tqZWxsaWcgYm9rc3RhdnN0+HJyZWxzZSEiCisKKyM6IHRhZy5jOjg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTogRmlsZW4gXCIlc1wiIGZpbm5lcyBpa2tlIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRhZy5jOjk0MQorbXNnaWQgIiIKKyJcbiIKKyIgICMgVE8gdGFnICAgICAgICAgRlJPTSBsaW5lICBpbiBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgICMgVElMIHRhZyAgICAgICAgRlJBICBsaW5qZSBpIGZpbC90ZWtzdCIKKworIzogdGFnLmM6MTM2MworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJMZXRlciBpIHRhZ2ZpbCAlcyIKKworIzogdGFnLmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogU3RpIHRpbCB0YWdmaWwga3V0dGV0IGZvciAlc1xuIgorCisjOiB0YWcuYzoyMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBGb3JtYXRmZWlsIGkgdGFnZmlsIFwiJXNcIiIKKworIzogdGFnLmM6MjIwNworIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIkb4ciBieXRlICVsZCIKKworIzogdGFnLmM6MjI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IFRhZ2ZpbCBpa2tlIHNvcnRlcnQ6ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjI4MAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogSW5nZW4gdGFnZmlsIgorCisjOiB0YWcuYzozMDE2Cittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogS2FuIGlra2UgZmlubmUgdGFnc/hrZXN0cmVuZyIKKworIzogdGFnLmM6MzAyNworbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTogS3VubmUgaWtrZSBmaW5uZSB0YWcsIGJhcmUgZ2pldHRlciEiCisKKyM6IHRlcm0uYzoxNzU5Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIGlra2Uga2plbnQuIFRpbGdqZW5nZWxpZ2UgaW5uZWJ5Z2RlIHRlcm1pbmFsZXIgZXI6IgorCisjOiB0ZXJtLmM6MTc4MworbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAiZmFsbGVyIHRpbGJha2UgcOUgJyIKKworIzogdGVybS5jOjIxNDEKK21zZ2lkICJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkU1NTc6IEthbiBpa2tlIOVwbmUgdGVybWNhcC1maWwiCisKKyM6IHRlcm0uYzoyMTQ1Cittc2dpZCAiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJFNTU4OiBGYW50IGlra2UgdGVybWluYWxvcHBm+HJpbmcgaSB0ZXJtaW5mbyIKKworIzogdGVybS5jOjIxNDcKK21zZ2lkICJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTU1OTogRmFudCBpa2tlIHRlcm1pbmFsb3BwZvhyaW5nIGkgdGVybWNhcCIKKworIzogdGVybS5jOjIzMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IEluZ2VuIFwiJXNcIi1vcHBm+HJpbmcgaSB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6Mjc4MAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiBUZXJtaW5hbGZ1bmtzam9uZW4gXCJjbVwiIG74ZHZlbmRpZyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDk5MAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVGVybWluYWx0YXN0ZXIgLS0tIgorCisjOiB1aS5jOjI1OAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgIm55dHQgc2thbGwgc3RhcnRldFxuIgorCisjOiB1aS5jOjE4NDEKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiBGZWlsIHVuZGVyIGxlc2luZyBhdiBpbm5kYXRhLCBhdnNsdXR0ZXKgLi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6NDA1Cittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICJJbmdlbiBhbmdyZW11bGlnaGV0ZXI7IGZvcnRzZXR0IGxpa2V2ZWwiCisKKyM6IHVuZG8uYzo1NjEKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiBHYWxlIGxpbmplbnVtbWVyIgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIjEgZm9yYW5kcmluZyIKKworIzogdW5kby5jOjc1OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIGZvcmFuZHJpbmdlciIKKworIzogdW5kby5jOjgxMgorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiBBbmdyZWxpc3RlbiBlciBza2FkZXQiCisKKyM6IHVuZG8uYzo4NDQKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDogQW5ncmVsaXN0ZW4gbWFuZ2xlciIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjcxMQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzItYml0cyBHVUktdmVyc2pvbiIKKworIzogdmVyc2lvbi5jOjcxMworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzItYml0cyBHVUktdmVyc2pvbiIKKworIzogdmVyc2lvbi5jOjcxNgorbXNnaWQgIiBpbiBXaW4zMnMgbW9kZSIKK21zZ3N0ciAiIGkgV2luMzJzLW1vZHVzIgorCisjOiB2ZXJzaW9uLmM6NzE4Cittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIiBtZWQgT0xFLXN0+HR0ZSIKKworIzogdmVyc2lvbi5jOjcyMQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyLWJpdHMga29uc29sbHZlcnNqb24iCisKKyM6IHZlcnNpb24uYzo3MjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYtYml0cyB2ZXJzam9uIgorCisjOiB2ZXJzaW9uLmM6NzI5Cittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyLWJpdHMgTVMtRE9TLXZlcnNqb24iCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYtYml0cyBNUy1ET1MtdmVyc2pvbiIKKworIzogdmVyc2lvbi5jOjczNworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCAodW5peCktdmVyc2pvbiIKKworIzogdmVyc2lvbi5jOjczOQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYLXZlcnNqb24iCisKKyM6IHZlcnNpb24uYzo3NDIKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TLXZlcnNqb24iCisKKyM6IHZlcnNpb24uYzo3NDcKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUy12ZXJzam9uIgorCisjOiB2ZXJzaW9uLmM6NzU3Cittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIklua2x1ZGVydGUgcGF0Y2hlcjogIgorCisjOiB2ZXJzaW9uLmM6NzgzIHZlcnNpb24uYzoxMTUxCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJNb2RpZmlzZXJ0IGF2ICIKKworIzogdmVyc2lvbi5jOjc5MAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyJLb21waWxlcnQgIgorCisjOiB2ZXJzaW9uLmM6NzkzCittc2dpZCAiYnkgIgorbXNnc3RyICJhdiAiCisKKyM6IHZlcnNpb24uYzo4MDUKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkRpZ2VyIChcImh1Z2VcIikgdmVyc2pvbiAiCisKKyM6IHZlcnNpb24uYzo4MDgKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiU3RvciAoXCJiaWdcIikgdmVyc2pvbiAiCisKKyM6IHZlcnNpb24uYzo4MTEKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiTm9ybWFsIHZlcnNqb24gIgorCisjOiB2ZXJzaW9uLmM6ODE0Cittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiTGl0ZW4gKFwic21hbGxcIikgdmVyc2pvbiAiCisKKyM6IHZlcnNpb24uYzo4MTYKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIlNwaW5rZWwgKFwidGlueVwiKSB2ZXJzam9uICIKKworIzogdmVyc2lvbi5jOjgyMgorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAidXRlbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODI3Cittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgIm1lZCBHVEsyLUdOT01FIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MjkKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJtZWQgR1RLLUdOT01FIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4MzMKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAibWVkIEdUSzIgR1VJLiIKKworIzogdmVyc2lvbi5jOjgzNQorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgIm1lZCBHVEsgR1VJLiIKKworIzogdmVyc2lvbi5jOjg0MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgIm1lZCBYMTEtTW90aWYgR1VJLiIKKworIzogdmVyc2lvbi5jOjg0NAorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJtZWQgWDExLW5lWHRhdyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODQ2Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIm1lZCBYMTEtQXRoZW5hIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NTAKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAibWVkIEJlT1MgR1VJLiIKKworIzogdmVyc2lvbi5jOjg1MworbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgIm1lZCBQaG90b24gR1VJLiIKKworIzogdmVyc2lvbi5jOjg1NgorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAibWVkIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NTkKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJtZWQgQ2FyYm9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzo4NjIKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIm1lZCBDb2NvYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6ODY1Cittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAibWVkIChrbGFzc2lzaykgR1VJLiIKKworIzogdmVyc2lvbi5jOjg3NgorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgRnVua3Nqb25lciBpbmtsdWRlcnQgKCspIGVsbGVyIGlra2UgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6ODg4Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIHZpbXJjLWZpbCBw5SBzeXN0ZW1ldDogXCIiCisKKyM6IHZlcnNpb24uYzo4OTMKK21zZ2lkICIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgdmltcmMtZmlsIGZvciBicnVrZXJlOiBcIiIKKworIzogdmVyc2lvbi5jOjg5OAorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICB2aW1yYy1maWwgbnIuIDIgZm9yIGJydWtlcmU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTAzCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIHZpbXJjLWZpbCBuci4gMyBmb3IgYnJ1a2VyZTogXCIiCisKKyM6IHZlcnNpb24uYzo5MDgKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgIGV4cmMtZmlsIGZvciBicnVrZXJlOiBcIiIKKworIzogdmVyc2lvbi5jOjkxMworbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgZXhyYy1maWwgbnIuIDIgZm9yIGJydWtlcmU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE5Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgZ3ZpbXJjLWZpbCBw5SBzeXN0ZW1ldDogXCIiCisKKyM6IHZlcnNpb24uYzo5MjMKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICBndmltcmMtZmlsIGZvciBicnVrZXJlOiBcIiIKKworIzogdmVyc2lvbi5jOjkyNworbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIGd2aW1yYy1maWwgbnIuIDIgZm9yIGJydWtlcmU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTMyCittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgZ3ZpbXJjLWZpbCBuci4gMyBmb3IgYnJ1a2VyZTogXCIiCisKKyM6IHZlcnNpb24uYzo5MzkKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgICBtZW55ZmlsIHDlIHN5c3RlbWV0OiBcIiIKKworIzogdmVyc2lvbi5jOjk0NworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgICRWSU0gZmFsbGVyIHRpbGJha2UgcOU6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTUzCittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIkVklNUlVOVElNRSBmYWxsZXIgdGlsYmFrZSBw5TogXCIiCisKKyM6IHZlcnNpb24uYzo5NTcKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJLb21waWxlcmluZzogIgorCisjOiB2ZXJzaW9uLmM6OTYzCittc2dpZCAiQ29tcGlsZXI6ICIKK21zZ3N0ciAiS29tcGlsYXRvcjogIgorCisjOiB2ZXJzaW9uLmM6OTY4Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICJMaW5raW5nOiAiCisKKyM6IHZlcnNpb24uYzo5NzMKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIERFQlVHR0lOR1NWRVJTSk9OIgorCisjOiB2ZXJzaW9uLmM6MTAxMgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCAtIEZvcmJlZHJldCBWaSIKKworIzogdmVyc2lvbi5jOjEwMTQKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyc2pvbiAiCisKKyM6IHZlcnNpb24uYzoxMDE1Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJhdiBCcmFtIE1vb2xlbmFhciBtZWQgZmxlcmUiCisKKyM6IHZlcnNpb24uYzoxMDE5Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIGVyIOVwZW4ga2lsZGVrb2RlIG9nIGthbiBmcml0dCBkaXN0cmlidWVyZXMiCisKKyM6IHZlcnNpb24uYzoxMDIxCittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIkhqZWxwIGZhdHRpZ2UgYmFybiBpIFVnYW5kYSEiCisKKyM6IHZlcnNpb24uYzoxMDIyCittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAic2tyaXYgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgICAgIGZvciBpbmZvcm1hc2pvbiAgIgorCisjOiB2ZXJzaW9uLmM6MTAyNAorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgInNrcml2ICA6cTxFbnRlcj4gICAgICAgICAgICAgICAgICBmb3Ig5SBhdnNsdXR0ZSAgICIKKworIzogdmVyc2lvbi5jOjEwMjUKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJza3JpdiAgOmhlbHA8RW50ZXI+ICBlbGxlciAgPEYxPiAgZm9yIG9uLWxpbmUgaGplbHAiCisKKyM6IHZlcnNpb24uYzoxMDI2Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAic2tyaXYgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgICAgIGZvciB2ZXJzam9uc2luZm8gIgorCisjOiB2ZXJzaW9uLmM6MTAyOQorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJLavhyZXIgaSBWaS1rb21wYXRpYmVsIG1vZHVzIgorCisjOiB2ZXJzaW9uLmM6MTAzMAorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgInNrcml2ICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICAgICBmb3Igc3RhbmRhcmQgVmltICIKKworIzogdmVyc2lvbi5jOjEwMzEKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJza3JpdiAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gICAgZm9yIGluZm9ybWFzam9uICAiCisKKyM6IHZlcnNpb24uYzoxMDQ2Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAibWVueTogIEhqZWxwLT5Gb3JlbGRyZWz4c2UgICAgICAgIGZvciBpbmZvcm1hc2pvbiAgIgorCisjOiB2ZXJzaW9uLmM6MTA0OAorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIktq+HJlciB1dGVuIG1vZHVzLCB0YXN0ZXRyeWtrIGJsaXIgbGFndCBpbm4gaSB0ZWtzdGVuIgorCisjOiB2ZXJzaW9uLmM6MTA0OQorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIm1lbnk6ICBSZWRpZ2VyLT5HbG9iYWxlIGlubnN0aWxsaW5nZXItPklubnNldHRpbmdzbW9kdXMgYXYvcOUiCisKKyM6IHZlcnNpb24uYzoxMDUwCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0byBtb2R1c2VyICAgIgorCisjOiB2ZXJzaW9uLmM6MTA1NAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIm1lbnk6ICBSZWRpZ2VyLT5HbG9iYWxlIGlubnN0aWxsaW5nZXItPlZpLWtvbXBhdGliaWxpdGV0IGF2L3DlIgorCisjOiB2ZXJzaW9uLmM6MTA1NQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3RhbmRhcmQgVmltICIKKworIzogdmVyc2lvbi5jOjExMDIKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIlN0+HR0IHV0dmlrbGluZ2VuIGF2IFZpbSEiCisKKyM6IHZlcnNpb24uYzoxMTAzCittc2dpZCAiQmVjb21lIGEgcmVnaXN0ZXJlZCBWaW0gdXNlciEiCittc2dzdHIgIkJsaSByZWdpc3RyZXJ0IGJydWtlciBhdiBWaW0hIgorCisjOiB2ZXJzaW9uLmM6MTEwNgorbXNnaWQgInR5cGUgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgInNrcml2ICA6aGVscCBzcG9uc29yPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXNqb24gICIKKworIzogdmVyc2lvbi5jOjExMDcKK21zZ2lkICJ0eXBlICA6aGVscCByZWdpc3RlcjxFbnRlcj4gICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJza3JpdiAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAgICAgZm9yIGluZm9ybWFzam9uICAiCisKKyM6IHZlcnNpb24uYzoxMTA5Cittc2dpZCAibWVudSAgSGVscC0+U3BvbnNvci9SZWdpc3RlciAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAibWVueTogIEhqZWxwLT5TdPh0dGUvUmVnaXN0cmVyaW5nICBmb3IgaW5mb3JtYXNqb24gIgorCisjOiB2ZXJzaW9uLmM6MTExOQorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIkFEVkFSU0VMOiBXaW5kb3dzIDk1Lzk4L01FIG9wcGRhZ2V0IgorCisjOiB2ZXJzaW9uLmM6MTEyMgorbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInNrcml2ICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICAgICBmb3IgaW5mb3JtYXNqb24gICIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IFZpbmR1IGZvciBmb3Jo5W5kc3Zpc25pbmcgZmlubmVzIGlra2UiCisKKyM6IHdpbmRvdy5jOjU4MQorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6IEthbiBpa2tlIHNwbGl0dGUgXCJ0b3BsZWZ0XCIgb2cgXCJib3RyaWdodFwiIHDlIGVuIGdhbmciCisKKyM6IHdpbmRvdy5jOjEzNDAKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IEthbiBpa2tlIHJvdGVyZSBu5XIgZXQgYW5uZXQgdmluZHUgZXIgc3BsaXR0ZXQiCisKKyM6IHdpbmRvdy5jOjE4MzYKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IEthbiBpa2tlIGx1a2tlIGRldCBzaXN0ZSB2aW5kdWV0IgorCisjOiB3aW5kb3cuYzoyNTY3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIkFsbGVyZWRlIGJhcmUgZXR0IHZpbmR1IgorCisjOiB3aW5kb3cuYzoyNjE0Cittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IEFubmV0IHZpbmR1IGlubmVob2xkZXIgZm9yYW5kcmluZ2VyIgorCisjOiB3aW5kb3cuYzo0NDgwCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogSW5nZW4gZmlsbmF2biB1bmRlciBtYXJr+HJlbiIKKworIzogd2luZG93LmM6NDU5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IEthbiBpa2tlIGZpbm5lIGZpbGVuIFwiJXNcIiBpIHN0aWVuIgorCisjOiBnbG9iYWxzLmg6MTI0MSBpZl9wZXJsLnhzOjMyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiBLbGFydGUgaWtrZSBsYXN0ZSBiaWJsaW90ZWsgJXMiCisKKyM6IGlmX3BlcmwueHM6NTU0Cittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFBlcmwgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiRGVubmUga29tbWFuZG9lbiBlciBkZWFrdGl2ZXJ0LCBQZXJsLWJpYmxpb3Rla2V0IGt1bm5lIGlra2UgbGFzdGVzLiIKKworIzogaWZfcGVybC54czo2MDcKK21zZ2lkICJFMjk5OiBQZXJsIGV2YWx1YXRpb24gZm9yYmlkZGVuIGluIHNhbmRib3ggd2l0aG91dCB0aGUgU2FmZSBtb2R1bGUiCittc2dzdHIgIiIKKyJFMjk5OiBFdmFsdWVyaW5nIGF2IFBlcmwgZXIgaWtrZSB0aWxsYXR0IGkgc2FuZGthc3NlbiB1dGVuIFwiU2FmZVwiLW1vZHVsZW4iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTgzCittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJSZWRpZ2VyIG1lZCAmZmxlcmUgVmltLWVyIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiUmVkaWdlciBtZWQgZW5rZWwgJlZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTgKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAiJkRpZmZlcmFuc2UgbWVkIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTEKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiUmVkaWdlciBtZWQgJlZpbSIKKworIy4gTm93IGNvbmNhdGVuYXRlCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYzMworbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorbXNnc3RyICJSZWRpZ2VyIG1lZCBla3Npc3RlcmVuZGUgVmltIC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiUmVkaWdlcmVyIGRlKG4pIHZhbGd0ZSBmaWxlbihlKSBtZWQgVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NSBHdmltRXh0L2d2aW1leHQuY3BwOjk2NgorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAiS2xhcnRlIGlra2UgbGFnZSBwcm9zZXNzOiBTamVrayBhdCBndmltIGVyIGkgc3RpZW4hIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NiBHdmltRXh0L2d2aW1leHQuY3BwOjkwMCBHdmltRXh0L2d2aW1leHQuY3BwOjk2NworbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICJGZWlsIGkgZ3ZpbWV4dC5kbGwiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODk5Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICJMZW5nZGVuIHDlIHN0aWVuIGVyIGZvciBsYW5nISIKKworIzogZ2xvYmFscy5oOjEwMzEKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLUluZ2VuIGxpbmplciBpIGJ1ZmZlcmVuLS0iCisKKyMuCisjLiAqIFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBzaGFyZWQgYXJlIGluY2x1ZGVkIGhlcmUuCisjLiAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyMuCisjOiBnbG9iYWxzLmg6MTE5NAorbXNnaWQgIkU0NzA6IENvbW1hbmQgYWJvcnRlZCIKK21zZ3N0ciAiRTQ3MDogS29tbWFuZG9lbiBhdmJydXR0IgorCisjOiBnbG9iYWxzLmg6MTE5NQorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiBQYXJhbWV0ZXIgbvhkdmVuZGlnIgorCisjOiBnbG9iYWxzLmg6MTE5NgorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBcXCBza3VsbGUgaGEgduZydCBmdWxndCBhdiAvLCA/IGVsbGVyICYiCisKKyM6IGdsb2JhbHMuaDoxMTk4Cittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiBVZ3lsZGlnIGkga29tbWFuZG9saW5qZXZpbmR1OyA8RU5URVI+IHV0ZvhyZXIsIENUUkwtQyBhdnNsdXR0ZXIiCisKKyM6IGdsb2JhbHMuaDoxMjAwCittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiBLb21tYW5kb2VuIGVyIGlra2UgdGlsbGF0dCBmcmEgZXhyYy92aW1yYyBpIG7lduZyZW5kZSBrYXRhbG9nIGVsbGVyICIKKyJ0YWdz+GsiCisKKyM6IGdsb2JhbHMuaDoxMjAyCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IE1hbmdsZXIgOmVuZGlmIgorCisjOiBnbG9iYWxzLmg6MTIwMworbXNnaWQgIkU2MDA6IE1pc3NpbmcgOmVuZHRyeSIKK21zZ3N0ciAiRTYwMDogTWFuZ2xlciA6ZW5kdHJ5IgorCisjOiBnbG9iYWxzLmg6MTIwNAorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiBNYW5nbGVyIDplbmR3aGlsZSIKKworIzogZ2xvYmFscy5oOjEyMDUKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDplbmR3aGlsZSB1dGVuIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjEyMDcKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogRmlsZW4gZmlubmVzIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGdsb2JhbHMuaDoxMjA4Cittc2dpZCAiRTQ3MjogQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIkU0NzI6IEtvbW1hbmRvZW4gZmVpbGV0IgorCisjOiBnbG9iYWxzLmg6MTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiBVa2plbnQgc2tyaWZ0dHlwZXNldHQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiBVa2plbnQgc2tyaWZ0dHlwZTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogU2tyaWZ0dHlwZW4gXCIlc1wiIGhhciBpa2tlIGZhc3QgYnJlZGRlIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiBJbnRlcm4gZmVpbCIKKworIzogZ2xvYmFscy5oOjEyMjAKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiQXZicnV0dCIKKworIzogZ2xvYmFscy5oOjEyMjEKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiBVZ3lsZGlnIGFkcmVzc2UiCisKKyM6IGdsb2JhbHMuaDoxMjIyCittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogVWd5bGRpZyBwYXJhbWV0ZXIiCisKKyM6IGdsb2JhbHMuaDoxMjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiBVZ3lsZGlnIHBhcmFtdGVyOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IFVneWxkaWcgdXR0cnlrazogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjI3Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IFVneWxkaWcgb21y5WRlIgorCisjOiBnbG9iYWxzLmg6MTIyOAorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogVWd5bGRpZyBrb21tYW5kbyIKKworIzogZ2xvYmFscy5oOjEyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIGVyIGVuIGthdGFsb2ciCisKKyM6IGdsb2JhbHMuaDoxMjMzCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiBVdmVudGVkZSB0ZWduIGb4ciAnPSciCisKKyM6IGdsb2JhbHMuaDoxMjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBCaWJsaW90ZWsta2FsbCBmZWlsZXQgZm9yIFwiJXMoKVwiIgorCisjOiBnbG9iYWxzLmg6MTI0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiBLbGFydGUgaWtrZSBsYXN0ZSBiaWJsaW90ZWtzZnVua3Nqb24gJXMiCisKKyM6IGdsb2JhbHMuaDoxMjQ0Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IE1lcmtldCBoYXIgZXQgdWd5bGRpZyBsaW5qZW51bW1lciIKKworIzogZ2xvYmFscy5oOjEyNDUKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBNZXJrZXQgYmxlIGlra2Ugc2F0dCIKKworIzogZ2xvYmFscy5oOjEyNDYKK21zZ2lkICJFMjE6IENhbm5vdCBtYWtlIGNoYW5nZXMsICdtb2RpZmlhYmxlJyBpcyBvZmYiCittc2dzdHIgIkUyMTogS2FuIGlra2UgZ2r4cmUgZm9yYW5kcmluZ2VyLCAnbW9kaWZpYWJsZScgZXIgYXYiCisKKyM6IGdsb2JhbHMuaDoxMjQ3Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiBTa3JpcHRzIG74c3RldCBmb3IgZHlwdCIKKworIzogZ2xvYmFscy5oOjEyNDgKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IEluZ2VuIGFsdGVybmF0aXYgZmlsIgorCisjOiBnbG9iYWxzLmg6MTI0OQorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogRm9ya29ydGVsc2VuIGZpbm5lcyBpa2tlIgorCisjOiBnbG9iYWxzLmg6MTI1MAorbXNnaWQgIkU0Nzc6IE5vICEgYWxsb3dlZCIKK21zZ3N0ciAiRTQ3NzogSW5nZW4gISB0aWxsYXR0IgorCisjOiBnbG9iYWxzLmg6MTI1MgorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogR1VJIGthbiBpa2tlIGJydWtlczogSWtrZSBzbOV0dCBw5SB1bmRlciBrb21waWxlcmluZyIKKworIzogZ2xvYmFscy5oOjEyNTUKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjogSGVicmFpc2sga2FuIGlra2UgYnJ1a2VzOiBJa2tlIHNs5XR0IHDlIHVuZGVyIGtvbXBpbGVyaW5nXG4iCisKKyM6IGdsb2JhbHMuaDoxMjU4Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIiIKKyJFMjc6IFBlcnNpc2sgKEZhcnNpKSBrYW4gaWtrZSBicnVrZXM6IElra2Ugc2zldHQgcOUgdW5kZXIga29tcGlsZXJpbmdcbiIKKworIzogZ2xvYmFscy5oOjEyNjEKK21zZ2lkICJFODAwOiBBcmFiaWMgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFODAwOiBBcmFiaXNrIGthbiBpa2tlIGJydWtlczogSWtrZSBzbOV0dCBw5SB1bmRlciBrb21waWxlcmluZ1xuIgorCisjOiBnbG9iYWxzLmg6MTI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IFV0aGV2aW5nc2dydXBwZSBmaW5uZXMgaWtrZTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjY2Cittc2dpZCAiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIKK21zZ3N0ciAiRTI5OiBJbmdlbiBpbm5sYWd0IHRla3N0IGVuZGEiCisKKyM6IGdsb2JhbHMuaDoxMjY3Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogSW5nZW4gdGlkbGlnZXJlIGtvbW1hbmRvbGluamUiCisKKyM6IGdsb2JhbHMuaDoxMjY4Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogTWFwcGluZ2VuIGZpbm5lcyBpa2tlIgorCisjOiBnbG9iYWxzLmg6MTI2OQorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiBJbmdlbiB0cmVmZiIKKworIzogZ2xvYmFscy5oOjEyNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiBJbmdlbiB0cmVmZjogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjcxCittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIkUzMjogTWFuZ2xlciBmaWxuYXZuIgorCisjOiBnbG9iYWxzLmg6MTI3MgorbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogSW5nZW4gdGlkbGlnZXJlIGVyc3RhdG5pbmdlciBtZWQgcmVndWzmcmUgdXR0cnlrayIKKworIzogZ2xvYmFscy5oOjEyNzMKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIkUzNDogSW5nZW4gdGlkbGlnZXJlIGtvbW1hbmRvIgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IEluZ2VuIHRpZGxpZ2VyZSByZWd1bOZyZSB1dHRyeWtrIgorCisjOiBnbG9iYWxzLmg6MTI3NQorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IE9tcuVkZSBlciBpa2tlIHRpbGxhdHQiCisKKyM6IGdsb2JhbHMuaDoxMjc3Cittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIkUzNjogSWtrZSBub2sgcGxhc3MiCisKKyM6IGdsb2JhbHMuaDoxMjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogSW5nZW4gcmVnaXN0cmVydCB0amVuZXIga2FsdCBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiBLYW4gaWtrZSBvcHByZXR0ZSBmaWxlbiAlcyIKKworIzogZ2xvYmFscy5oOjEyODMKK21zZ2lkICJFNDgzOiBDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIkU0ODM6IEthbiBpa2tlIGhlbnRlIG5hdm4gcOUgbWlkbGVydGlkaWcgZmlsIgorCisjOiBnbG9iYWxzLmg6MTI4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6IEthbiBpa2tlIOVwbmUgZmlsZW4gJXMiCisKKyM6IGdsb2JhbHMuaDoxMjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogS2FuIGlra2UgbGVzZSBmaWxlbiAlcyIKKworIzogZ2xvYmFscy5oOjEyODYKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzogSWtrZSBsYWdyZXQgc2lkZW4gZm9ycmlnZSBmb3JhbmRyaW5nIChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGdsb2JhbHMuaDoxMjg3Cittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IE51bGxwYXJhbWV0ZXIiCisKKyM6IGdsb2JhbHMuaDoxMjg5Cittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogTnVtbWVyIGZvcnZlbnRldCIKKworIzogZ2xvYmFscy5oOjEyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiBLYW4gaWtrZSDlcG5lIGZlaWxmaWxlbiAlcyIKKworIzogZ2xvYmFscy5oOjEyOTUKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBLYW4gaWtrZSDlcG5lIGRpc3BsYXkiCisKKyM6IGdsb2JhbHMuaDoxMjk3Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiBJa2tlIG1lciBsZWRpZyBodWtvbW1lbHNlISIKKworIzogZ2xvYmFscy5oOjEyOTkKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiRmFudCBpa2tlIHP4a2V0ZWtzdGVuIgorCisjOiBnbG9iYWxzLmg6MTMwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg2OiBQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0ODY6IEZhbnQgaWtrZSBz+GtldGVrc3RlbjogJXMiCisKKyM6IGdsb2JhbHMuaDoxMzAyCittc2dpZCAiRTQ4NzogQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiRTQ4NzogUGFyYW1ldGVyZXQgbeUgduZyZSBwb3NpdGl2dCIKKworIzogZ2xvYmFscy5oOjEzMDQKK21zZ2lkICJFNDU5OiBDYW5ub3QgZ28gYmFjayB0byBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkU0NTk6IEthbiBpa2tlIGflIHRpbGJha2UgdGlsIHRpZGxpZ2VyZSBrYXRhbG9nIgorCisjOiBnbG9iYWxzLmg6MTMwOAorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IEluZ2VuIGZlaWwiCisKKyM6IGdsb2JhbHMuaDoxMzEwCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiDYZGVsYWd0IHP4a2VzdHJlbmciCisKKyM6IGdsb2JhbHMuaDoxMzExCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogU2thZGV0IHByb2dyYW0gbWVkIHJlZ3Vs5nJ0IHV0dHJ5a2siCisKKyM6IGdsb2JhbHMuaDoxMzEyCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiAncmVhZG9ubHknLXZhbGdldCBlciBzYXR0IChsZWdnIHRpbCAhIGZvciDlIG92ZXJzdHlyZSkiCisKKyM6IGdsb2JhbHMuaDoxMzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IEthbiBpa2tlIHNldHRlIHNrcml2ZWJlc2t5dHRldCB2YXJpYWJlbCBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMzE3Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBGZWlsIHVuZGVyIGxlc2luZyBhdiBmZWlsZmlsZW4iCisKKyM6IGdsb2JhbHMuaDoxMzIwCittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IElra2UgdGlsbGF0dCBpIHNhbmRrYXNzZW4iCisKKyM6IGdsb2JhbHMuaDoxMzIyCittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogSWtrZSB0aWxsYXR0IGhlciIKKworIzogZ2xvYmFscy5oOjEzMjUKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IEZvcmFuZHJpbmcgYXYgc2tqZXJtbW9kdXMgZXIgaWtrZSBzdPh0dGV0IgorCisjOiBnbG9iYWxzLmg6MTMyNworbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiBVZ3lsZGlnIFwic2Nyb2xsXCItdmVyZGkiCisKKyM6IGdsb2JhbHMuaDoxMzI4Cittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiAnc2hlbGwnLXZhbGdldCBlciB0b210IgorCisjOiBnbG9iYWxzLmg6MTMzMAorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogS3VubmUgaWtrZSBsZXNlIGlubiBza2lsdGRhdGEhIgorCisjOiBnbG9iYWxzLmg6MTMzMgorbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IEZlaWwgdW5kZXIgbHVra2luZyBhdiBzd2FwZmlsIgorCisjOiBnbG9iYWxzLmg6MTMzMworbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IFRhZy1zdGFjayB0b20iCisKKyM6IGdsb2JhbHMuaDoxMzM0Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IEtvbW1hbmRvZW4gZXIgZm9yIGtvbXBsZWtzIgorCisjOiBnbG9iYWxzLmg6MTMzNQorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiBOYXZuZXQgZXIgZm9yIGxhbmd0IgorCisjOiBnbG9iYWxzLmg6MTMzNgorbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiBGb3IgbWFuZ2UgWyIKKworIzogZ2xvYmFscy5oOjEzMzcKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogRm9yIG1hbmdlIGZpbG5hdm4iCisKKyM6IGdsb2JhbHMuaDoxMzM4Cittc2dpZCAiRTQ4ODogVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAiRTQ4ODogRXR0ZXJm+GxnZW5kZSB0ZWduIgorCisjOiBnbG9iYWxzLmg6MTMzOQorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IFVramVudCBtZXJrZSIKKworIzogZ2xvYmFscy5oOjEzNDAKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6IEtsYXJ0ZSBpa2tlIHV0dmlkZSBqb2tlcnRlZ24iCisKKyM6IGdsb2JhbHMuaDoxMzQyCittc2dpZCAiRTU5MTogJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiRTU5MTogJ3dpbmhlaWdodCcga2FuIGlra2UgduZyZSBtaW5kcmUgZW5uICd3aW5taW5oZWlnaHQnIgorCisjOiBnbG9iYWxzLmg6MTM0NAorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgnIGthbiBpa2tlIHbmcmUgbWluZHJlIGVubiAnd2lubWlud2lkdGgnIgorCisjOiBnbG9iYWxzLmg6MTM0NworbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiBGZWlsIHVuZGVyIHNrcml2aW5nIgorCisjOiBnbG9iYWxzLmg6MTM0OAorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIkFudGFsbCByZXBldGVyaW5nZXIgZXIgbnVsbCIKKworIzogZ2xvYmFscy5oOjEzNTAKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IEJydWtlciA8U0lEPiB1dGVub20gc2tyaXB0LWtvbnRla3N0IgorCisjOiBnbG9iYWxzLmg6MTM1MworbXNnaWQgIkU0NDk6IEludmFsaWQgZXhwcmVzc2lvbiByZWNlaXZlZCIKK21zZ3N0ciAiRTQ0OTogVWd5bGRpZyB1dHRyeWtrIG1vdHRhdHQiCisKKyM6IGdsb2JhbHMuaDoxMzU2Cittc2dpZCAiRTQ2MzogUmVnaW9uIGlzIGd1YXJkZWQsIGNhbm5vdCBtb2RpZnkiCittc2dzdHIgIkU0NjM6IFJlZ2lvbmVuIGVyIGJlc2t5dHRldCBvZyBrYW4gaWtrZSBtb2RpZmlzZXJlcyIKZGlmZiAtLWdpdCBhL3NyYy9wby9wbC5jcDEyNTAucG8gYi9zcmMvcG8vcGwuY3AxMjUwLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjlhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vcGwuY3AxMjUwLnBvCkBAIC0wLDAgKzEsNjU3NiBAQAorIyB0cmFuc2xhdGlvbiBvZiBwbC5wbyB0byBQb2xpc2gKKyMgUG9saXNoIFRyYW5zbGF0aW9uIGZvciBWaW0KKyMKKyMgdXBkYXRlZCAyMDAxIGZvciB2aW0tNi4wCisjIEZJUlNUIEFVVEhPUiBNYXJjaW4gRGFsZWNraSA8ZGFsZWNraUBjeWJlci5jcy5uZXQucGw+LCAyMDAwLgorIyBNaWtvbGFqIE1hY2hvd3NraSA8bWlrbWFjaEB3cC5wbD4sIDIwMDQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBwbFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA0LTA1LTIzIDIxOjQxKzAyMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA1LTIzIDIyOjAwKzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1pa29sYWogTWFjaG93c2tpIDxtaWttYWNoQHdwLnBsPlxuIgorIkxhbmd1YWdlLVRlYW06IFBvbGlzaCA8cGxAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWNwMTI1MFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogS0JhYmVsIDEuOVxuIgorCisjOiBidWZmZXIuYzoxMDIKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IE5pZSBtb2fqIHphcmV6ZXJ3b3dh5iBidWZvcmE7IHpha2/xY3plbmllLi4uIgorCisjOiBidWZmZXIuYzoxMDUKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBOaWUgbW9n6iB6YXJlemVyd293YeYgYnVmb3JhOyB1v3l3YW0gaW5uZWdvLi4uIgorCisjOiBidWZmZXIuYzo4MDUKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6IE5pZSB3ebNhZG93YW5vIL9hZG5lZ28gYnVmb3JhIgorCisjOiBidWZmZXIuYzo4MDcKK21zZ2lkICJFNTE2OiBObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiRTUxNjogTmllIHNrYXNvd2FubyC/YWRuZWdvIGJ1Zm9yYSIKKworIzogYnVmZmVyLmM6ODA5Cittc2dpZCAiRTUxNzogTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiRTUxNzogTmllIHd5cnp1Y29ubyC/YWRuZWdvIGJ1Zm9yYSIKKworIzogYnVmZmVyLmM6ODE3Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIjEgYnVmb3Igd3mzYWRvd2FueSIKKworIzogYnVmZmVyLmM6ODE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgInd5s2Fkb3dhbm8gJWQgYnVmb3LzdyIKKworIzogYnVmZmVyLmM6ODI0Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiMSBidWZvciBza2Fzb3dhbnkiCisKKyM6IGJ1ZmZlci5jOjgyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIGJ1Zm9y83cgc2thc293YW5vIgorCisjOiBidWZmZXIuYzo4MzEKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgInd5cnp1Y29ubyAxIGJ1Zm9yICIKKworIzogYnVmZmVyLmM6ODMzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICJ3eXJ6dWNvbm8gJWQgYnVmb3LzdyIKKworIzogYnVmZmVyLmM6ODk0Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogTmllIHpuYWxlemlvbm8gem1pZW5pb255Y2ggYnVmb3LzdyIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjkzMworbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiBOaWUgbWEgd3lsaXN0b3dhbnljaCBidWZvcvN3IgorCisjOiBidWZmZXIuYzo5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBCdWZmZXIgJWxkIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFODY6IEJ1Zm9yIFwiJWxkXCIgbmllIGlzdG5pZWplIgorCisjOiBidWZmZXIuYzo5NDgKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogTmllIG1vZ+ogcHJ6ZWqc5iBwb3phIG9zdGF0bmkgYnVmb3IiCisKKyM6IGJ1ZmZlci5jOjk1MAorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogTmllIG1vZ+ogcHJ6ZWqc5iBwcnplZCBwaWVyd3N6eSBidWZvciIKKworIzogYnVmZmVyLmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5IE5pZSB6YXBpc2FubyB6bWlhbiB3IGJ1Zm9yemUgJWxkICh3eW11nCBwcnpleiAhKSIKKworIzogYnVmZmVyLmM6MTAwNQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiBOaWUgbW9n6iB3ebNhZG93YeYgb3N0YXRuaWVnbyBidWZvcmEiCisKKyM6IGJ1ZmZlci5jOjE1MzgKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiBPU1RSWkWvRU5JRTogUHJ6ZXBls25pZW5pZSBsaXN0eSBuYXp3IHBsaWvzdyIKKworIzogYnVmZmVyLmM6MTcwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IE5pZSB6bmFsZXppb25vIGJ1Zm9yYSAlbGQiCisKKyM6IGJ1ZmZlci5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBXaWVsb2tyb3RuZSBkb3Bhc293YW5pYSBkbGEgJXMiCisKKyM6IGJ1ZmZlci5jOjE5NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IK9hZGVuIGJ1Zm9yIG5pZSBwYXN1amUgZG8gJXMiCisKKyM6IGJ1ZmZlci5jOjIzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgIndpZXJzeiAlbGQiCisKKyM6IGJ1ZmZlci5jOjI0MjAKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiBCdWZvciBvIHRlaiBuYXp3aWUganW/IGlzdG5pZWplIgorCisjOiBidWZmZXIuYzoyNzEzCittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbWm1pZW5pb255XSIKKworIzogYnVmZmVyLmM6MjcxOAorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW05pZSBlZHl0b3dhbnldIgorCisjOiBidWZmZXIuYzoyNzIzCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW05vd3kgUGxpa10iCisKKyM6IGJ1ZmZlci5jOjI3MjQKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbQrO5ZCBvZGN6eXR1XSIKKworIzogYnVmZmVyLmM6MjcyNiBmaWxlaW8uYzoyMTEyCittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW3R5bGtvIG9kY3p5dF0iCisKKyM6IGJ1ZmZlci5jOjI3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICIxIHdpZXJzeiAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc0OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCB3aWVyc3plIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzU2CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICJ3aWVyc3ogJWxkIHogJWxkIC0tJWQlJS0tIGtvbCAiCisKKyM6IGJ1ZmZlci5jOjI4NjQKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIltCcmFrIHBsaWt1XSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyOTA0Cittc2dpZCAiaGVscCIKK21zZ3N0ciAicG9tb2MiCisKKyM6IGJ1ZmZlci5jOjM0NjMgc2NyZWVuLmM6NTA3NQorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW3BvbW9jXSIKKworIzogYnVmZmVyLmM6MzQ5NSBzY3JlZW4uYzo1MDgxCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbUG9kZ2y5ZF0iCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJBbGwiCittc2dzdHIgIldzenlzdGtvIgorCisjOiBidWZmZXIuYzozNzc1Cittc2dpZCAiQm90IgorbXNnc3RyICJE87MiCisKKyM6IGJ1ZmZlci5jOjM3NzcKK21zZ2lkICJUb3AiCittc2dzdHIgIkfzcmEiCisKKyM6IGJ1ZmZlci5jOjQ1MjMKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTGlzdGEgYnVmb3LzdzpcbiIKKworIzogYnVmZmVyLmM6NDU1NgorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW0xpc3RhIEKz6mTzd10iCisKKyM6IGJ1ZmZlci5jOjQ1NjkgbWVtbGluZS5jOjE1MjAKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIltCcmFrIFBsaWt1XSIKKworIzogYnVmZmVyLmM6NDg4MgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFpuYWtpIC0tLSIKKworIzogYnVmZmVyLmM6NDkwMQorIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICJabmFraSBkbGEgJXM6IgorCisjOiBidWZmZXIuYzo0OTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICB3aWVyc3o9JWxkICBpZD0lZCAgbmF6d2E9JXMiCisKKyM6IGRpZmYuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IE5pZSBtb2fqIHpy879uaWNvd2HmIHdp6mNlaiBuab8gJWxkIGJ1Zm9y83ciCisKKyM6IGRpZmYuYzo3MDkKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogTmllIG1vZ+ogc3R3b3J6eeYgcvO/bmljIgorCisjOiBkaWZmLmM6ODE0Cittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiUGxpayCzYXRhIgorCisjOiBkaWZmLmM6MTA2NQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODogTmllIG1vZ+ogd2N6eXRh5iB3eWqcY2lhIHLzv25pY3kiCisKKyM6IGRpZmYuYzoxODE1Cittc2dpZCAiRTk5OiBDdXJyZW50IGJ1ZmZlciBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFOTk6IEJpZb+5Y3kgYnVmb3IgbmllIGplc3QgdyB0cnliaWUgcvO/bmljIgorCisjOiBkaWZmLmM6MTgyNworbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IEJyYWsgaW5uZWdvIGJ1Zm9yYSB3IHRyeWJpZSBy879uaWMiCisKKyM6IGRpZmYuYzoxODM1Cittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiBXaepjZWogbmm/IGplZGVuIGJ1Zm9yIHcgdHJ5YmllIHLzv25pY293YW5pYSwgbmllIHdpZW0ga3TzcmVnbyB1v3nmIgorCisjOiBkaWZmLmM6MTg1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IE5pZSBtb2fqIHpuYWxln+YgYnVmb3JhIFwiJXNcIiIKKworIzogZGlmZi5jOjE4NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiBCdWZvciBcIiVzXCIgbmllIGplc3QgdyB0cnliaWUgcvO/bmljb3dhbmlhIgorCisjOiBkaWdyYXBoLmM6MjE5OQorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiBFc2NhcGUgamVzdCBuaWVkb3p3b2xvbmUgdyBkd3VncmFmaWUiCisKKyM6IGRpZ3JhcGguYzoyMzg0Cittc2dpZCAiRTU0NDogS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJFNTQ0OiBOaWUgem5hbGV6aW9ubyBwbGlrdSByb3prs2FkdSBrbGF3aXN6eSIKKworIzogZGlncmFwaC5jOjI0MTEKK21zZ2lkICJFMTA1OiBVc2luZyA6bG9hZGtleW1hcCBub3QgaW4gYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxMDU6IFphc3Rvc293YW5vIDpsb2Fka2V5bWFwIHcgbmlld2N6eXRhbnltIHBsaWt1IgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHOz83cga2x1Y3pvd3ljaCAoXk5eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FXlleTF5dXkZeSV5LXkReVl5OXlApIgorbXNnc3RyICIgXlggdHJ5YiAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIExva2FsbmUgZG9wZbNuaWFuaWUgc7PzdyBrbHVjem93eWNoICheTl5QKSIKKworIzogZWRpdC5jOjQ1Cittc2dpZCAiIFdob2xlIGxpbmUgY29tcGxldGlvbiAoXkxeTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHBls255Y2ggd2llcnN6eSAoXkxeTl5QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRl5OXlApIgorbXNnc3RyICIgRG9wZbNuaWFuaWUgbmF6dyBwbGlr83cgKF5GXk5eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl1eTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHpuYWN6bmlr83cgKF5dXk5eUCkiCisKKyM6IGVkaXQuYzo0OAorbXNnaWQgIiBQYXRoIHBhdHRlcm4gY29tcGxldGlvbiAoXk5eUCkiCittc2dzdHIgIiBEb3Bls25pYW5pZSB3em9yY/N3IHRyb3DzdyAoXk5eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EXk5eUCkiCittc2dzdHIgIiBEb3Bls25pYW5pZSBkZWZpbmljamkgKF5EXk5eUCkiCisKKyM6IGVkaXQuYzo1MQorbXNnaWQgIiBEaWN0aW9uYXJ5IGNvbXBsZXRpb24gKF5LXk5eUCkiCittc2dzdHIgIiBEb3Bls25pYW5pZSB6ZSBzs293bmlr83cgKF5LXk5eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlReTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHogdGV6YXVydXNhICheVF5OXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WXk5eUCkiCittc2dzdHIgIiBEb3Bls25pYW5pZSB3aWVyc3phIHBvbGVjZfEgKF5WXk5eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJEb2Jps2VtIGRvIGtv8WNhIGFrYXBpdHUiCisKKyM6IGVkaXQuYzo5NjIKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIm9wY2phICd0aGVzYXVydXMnIGplc3QgcHVzdGEiCisKKyM6IGVkaXQuYzoxMTY2Cittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAib3BjamEgJ2RpY3Rpb25hcnknIGplc3QgcHVzdGEiCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJQcnplZ2y5ZGFtIHOzb3duaWs6ICVzIgorCisjOiBlZGl0LmM6MjM2OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICh3cHJvd2FkemFuaWUpIFByemV3aWphbmllICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICh6YW1pYW5hKSBQcnpld2lqYW5pZSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZzogJXMiCittc2dzdHIgIlByemVnbLlkYW06ICVzIgorCisjOiBlZGl0LmM6MjcxOQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJQcnplZ2y5ZGFtIHpuYWN6bmlraS4iCisKKyM6IGVkaXQuYzozMzgxCittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiIERvZGFq6iIKKworIy4gc2hvd21vZGUgbWlnaHQgcmVzZXQgdGhlIGludGVybmFsIGxpbmUgcG9pbnRlcnMsIHNvIGl0IG11c3QKKyMuICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisjLiAqIGxvbmdlciBuZWVkZWQuICAtLSBBY2V2ZWRvLgorIy4KKyM6IGVkaXQuYzozNDMwCittc2dpZCAiLS0gU2VhcmNoaW5nLi4uIgorbXNnc3RyICItLSBTenVrYW0uLi4iCisKKyM6IGVkaXQuYzozNDg2Cittc2dpZCAiQmFjayBhdCBvcmlnaW5hbCIKK21zZ3N0ciAiWiBwb3dyb3RlbSBuYSBwaWVyd290bnltIgorCisjOiBlZGl0LmM6MzQ5MQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICJXeXJheiB6IGlubmVnbyB3aWVyc3phIgorCisjOiBlZGl0LmM6MzQ5NgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJKZWR5bmUgZG9wYXNvd2FuaWUiCisKKyM6IGVkaXQuYzozNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICJwYXN1amUgJWQgeiAlZCIKKworIzogZWRpdC5jOjM1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgInBhc3VqZSAlZCIKKworIy4gU2tpcCBmdXJ0aGVyIGFyZ3VtZW50cyBidXQgZG8gY29udGludWUgdG8KKyMuICogc2VhcmNoIGZvciBhIHRyYWlsaW5nIGNvbW1hbmQuCisjOiBldmFsLmM6MTAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IE5pZXpuYW5hIHptaWVubmE6IFwiJXNcIiIKKworIzogZXZhbC5jOjEzMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiBCcmFrIG5hd2lhc/N3OiAlcyIKKworIzogZXZhbC5jOjE0MzUgZXZhbC5jOjE0NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiBOaWUgaXN0bmllamUgem1pZW5uYTogXCIlc1wiIgorCisjOiBldmFsLmM6MTcwNQorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogQnJhayAnOicgcG8gJz8nIgorCisjOiBldmFsLmM6MjMyNworbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiBCcmFrICcpJyIKKworIzogZXZhbC5jOjIzODkKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogQnJhayAnXSciCisKKyM6IGV2YWwuYzoyNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiBCcmFrIG5hend5IG9wY2ppOiAlcyIKKworIzogZXZhbC5jOjI0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiBOaWV6bmFuYSBvcGNqYTogJXMiCisKKyM6IGV2YWwuYzoyNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiBCcmFrIGN1ZHp5c7Nvd3U6ICVzIgorCisjOiBldmFsLmM6MjY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTogQnJhayBjdWR6eXOzb3d1OiAlcyIKKworIzogZXZhbC5jOjMwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBOaWV3s2GcY2l3ZSBhcmd1bWVudHkgZGxhIGZ1bmtjamkgJXMiCisKKyM6IGV2YWwuYzozMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiBOaWV6bmFuYSBmdW5rY2phOiAlcyIKKworIzogZXZhbC5jOjMwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IFpieXQgd2llbGUgYXJndW1lbnTzdyBkbGEgZnVua2NqaTogJXMiCisKKyM6IGV2YWwuYzozMDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IFphIG1hs28gYXJndW1lbnTzdyBkbGEgZnVua2NqaTogJXMiCisKKyM6IGV2YWwuYzozMDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogWmFzdG9zb3dhbm8gPFNJRD4gcG96YSBza3J5cHRlbTogJXMiCisKKyMuCisjLiAqIFllcyB0aGlzIGlzIHVnbHksIEkgZG9uJ3QgcGFydGljdWxhcmx5IGxpa2UgaXQgZWl0aGVyLiAgQnV0IGRvaW5nIGl0CisjLiAqIHRoaXMgd2F5IGhhcyB0aGUgY29tcGVsbGluZyBhZHZhbnRhZ2UgdGhhdCB0cmFuc2xhdGlvbnMgbmVlZCBub3QgdG8KKyMuICogYmUgdG91Y2hlZCBhdCBhbGwuICBTZWUgYmVsb3cgd2hhdCAnb2snIGFuZCAneW5jJyBhcmUgdXNlZCBmb3IuCisjLgorIzogZXZhbC5jOjM2ODcgZ3VpLmM6NDM3NiBndWlfZ3RrLmM6MjA1OQorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6NDIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCB3aWVyc3p5OiAiCisKKyM6IGV2YWwuYzo1NDc3Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT0tcbiIKKyImWmFrb/FjeiIKKworIzogZXZhbC5jOjU1MTcKK21zZ2lkICJjYWxsZWQgaW5wdXRyZXN0b3JlKCkgbW9yZSBvZnRlbiB0aGFuIGlucHV0c2F2ZSgpIgorbXNnc3RyICJ3eXdvs2FubyBpbnB1dHJlc3RvcmUoKSB3aepjZWogcmF6eSBuab8gaW5wdXRzYXZlKCkiCisKKyM6IGV2YWwuYzo1OTc3Cittc2dpZCAiRTY1NTogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgKGN5Y2xlPykiCittc2dzdHIgIkU2NTU6IFphIGR1v28gZG93abl6YfEgc3ltYm9saWN6bnljaCAocOp0bGE/KSIKKworIzogZXZhbC5jOjY2MDkKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IEJyYWsgcG+zuWN6ZW5pYSB6IHNlcndlcmVtIFZpbSIKKworIzogZXZhbC5jOjY3MDYKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3NzogTmllIG1vZ+ogY3p5dGHmIG9kcG93aWVkemkgc2Vyd2VyYSIKKworIzogZXZhbC5jOjY3MzQKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IE5pZSBtb2fqIHd5c7Nh5iBkbyBrbGllbnRhIgorCisjOiBldmFsLmM6Njc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogTmllIG1vZ+ogd3lzs2HmIGRvICVzIgorCisjOiBldmFsLmM6Njg4MgorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKE5pZXezYZxjaXdlKSIKKworIzogZXZhbC5jOjgwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTogTmllb2tyZZxsb25hIHptaWVubmE6ICVzIgorCisjOiBldmFsLmM6ODQ5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYxOiBJbGxlZ2FsIHZhcmlhYmxlIG5hbWU6ICVzIgorbXNnc3RyICJFNDE4OiBOaWVkb3p3b2xvbmEgbmF6d2Egem1pZW5uZWo6ICVzIgorCisjOiBldmFsLmM6ODc4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTEyMjogRnVua2NqYSAlcyBqdb8gaXN0bmllamU7IGFieSBquSB6YW1pZW5p5iB1v3lqICEiCisKKyM6IGV2YWwuYzo4ODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IE5pZW9rcmWcbG9uYSBmdW5rY2phOiAlcyIKKworIzogZXZhbC5jOjg4NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiBCcmFrICcoJzogJXMiCisKKyM6IGV2YWwuYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBOaWVkb3p3b2xvbnkgYXJndW1lbnQ6ICVzIgorCisjOiBldmFsLmM6ODk4MgorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiBCcmFrIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjkwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IE5pZSBtb2fqIHByemVkZWZpbmlvd2HmIGZ1bmtjamkgJXM6IGplc3QgdyB1v3ljaXUiCisKKyM6IGV2YWwuYzo5MTU5Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTogV3ltYWdhbmEgamVzdCBuYXp3YSBmdW5rY2ppIgorCisjOiBldmFsLmM6OTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiBOYXp3YSBmdW5rY2ppIG11c2kgcm96cG9jenluYeYgc2nqIGR1v7kgbGl0ZXK5OiAlcyIKKworIzogZXZhbC5jOjk0MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogTmllb2tyZZxsb25hIGZ1bmtjamE6ICVzIgorCisjOiBldmFsLmM6OTQwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IE5pZSBtb2fqIHNrYXNvd2HmIGZ1bmtjamkgJXM6IGplc3QgdyB1v3ljaXUiCisKKyM6IGV2YWwuYzo5NDU1Cittc2dpZCAiRTEzMjogRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIKK21zZ3N0ciAiRTEzMjogWmFnbmllv2S/ZW5pZSB3eXdvs2HxIGZ1bmtjamkgcG9uYWQgJ21heGZ1bmNkZXB0aCciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FsbGluZyAlcyIKK21zZ3N0ciAid3l3b7N1auogJXMiCisKKyM6IGV2YWwuYzo5NTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgInBvcnp1Y29ubyAlcyIKKworIzogZXZhbC5jOjk1NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIHp3cmFjYSAjJWxkIgorCisjOiBldmFsLmM6OTU3OQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICIlcyB6d3JhY2EgXCIlc1wiIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NTk1IGV4X2NtZHMyLmM6MjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJrb250eW51YWNqYSB3ICVzIgorCisjOiBldmFsLmM6OTYyMQorbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiA6cmV0dXJuIHBvemEgZnVua2NquSIKKworIzogZXZhbC5jOjk5NTIKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyB6bWllbm5lIGdsb2JhbG5lOlxuIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICJXY2hvZHrqIHcgdHJ5YiBvZHBsdXNrd2lhbmlhLiBXcHJvd2FknyBcImNvbnRcIiBhYnkga29udHludW93YeYuIgorCisjOiBleF9jbWRzMi5jOjk2IGV4X2RvY21kLmM6OTY2CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAid2llcnN6ICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAiY21kOiAlcyIKKworIzogZXhfY21kczIuYzoyOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiUHVua3Qga29udHJvbG55IHcgXCIlcyVzXCIgd2llcnN6ICVsZCIKKworIzogZXhfY21kczIuYzo1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiBOaWUgem5hbGV6aW9ubyBwdW5rdHUga29udHJvbG5lZ286ICVzIgorCisjOiBleF9jbWRzMi5jOjU2NgorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIk5pZSBva3JlnGxvbm8gv2FkbnljaCBwdW5rdPN3IGtvbnRyb2xueWNoIgorCisjOiBleF9jbWRzMi5jOjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgd2llcnN6ICVsZCIKKworIzogZXhfY21kczIuYzo3NjMgZXhfY21kcy5jOjIwOTcgZXhfY21kcy5jOjIzNjIKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICJaYXBpc3ogamFrbyIKKworIzogZXhfY21kczIuYzo3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAiWmFjaG93YWogem1pYW55IHcgXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkzODAKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiQmV6IFR5dHWzdSIKKworIzogZXhfY21kczIuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IE5pZSB6YXBpc2FubyB6bWlhbiB3IGJ1Zm9yemUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjk4NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiT1NUUlpFr0VOSUU6IE5pZW9jemVraXdhbmUgd2VqnGNpZSB3IGlubnkgYnVmb3IgKHNwcmF3ZJ8gYXV0b2tvbWVuZHkpIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IFR5bGtvIGplZGVuIHBsaWsgdyBlZHljamkiCisKKyM6IGV4X2NtZHMyLmM6MTM4OQorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDogTmllIG1vv25hIHByemVqnOYgcHJ6ZWQgcGllcndzenkgcGxpayIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IE5pZSBtb79uYSBwcnplapzmIHphIG9zdGF0bmkgcGxpayIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiBuaWUgd3NwaWVyYW55IGtvbXBpbGF0b3I6ICVzIgorCisjOiBleF9jbWRzMi5jOjE4OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICJTenVrYW5pZSBcIiVzXCIgdyBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTkxOQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiU3p1a2FuaWUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAibmllIHpuYWxlemlvbm8gdyAncnVudGltZXBhdGgnOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTk3NAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICJXY3p5dGFqIHNrcnlwdCBWaW1hIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJOaWUgbW+/bmEgd2N6eXRh5iBrYXRhbG9ndTogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIm5pZSBtb2ezZW0gd2N6eXRh5iBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIwNAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIndpZXJzejogJWxkIG5pZSBtb2ezZW0gd2N6eXRh5iBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIndjenl0eXdhbmllIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIndpZXJzeiAlbGQ6IHdjenl0eXdhbmllIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICJza2/xY3pvbm8gd2N6eXR5d2FuaWUgJXMiCisKKyM6IGV4X2NtZHMyLmM6MjcwNworbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6IE9TVFJaRa9FTklFOiBOaWV3s2GcY2l3eSBzZXBhcmF0b3Igd2llcnN6eSwgcGV3bmllIGJyYWsgXk0iCisKKyM6IGV4X2NtZHMyLmM6Mjc1NgorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IHW/eXRvIDpzY3JpcHRlbmNvZGluZyBwb3phIHdjenl0eXdhbnltIHBsaWtpZW0iCisKKyM6IGV4X2NtZHMyLmM6Mjc4OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiB1v3l0byA6ZmluaXNoIHBvemEgd2N6eXR5d2FueW0gcGxpa2llbSIKKworIzogZXhfY21kczIuYzozMjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIlN0cm9uYSAlZCIKKworIzogZXhfY21kczIuYzozMzk0Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICJCcmFrIHRla3N0dSBkbyBkcnVrb3dhbmlhIgorCisjOiBleF9jbWRzMi5jOjM0NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIkRydWt1auogc3Ryb27qICVkICglZCUlKSIKKworIzogZXhfY21kczIuYzozNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIgS29waWEgJWQgeiAlZCIKKworIzogZXhfY21kczIuYzozNTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICJXeWRydWtvd2FubzogJXMiCisKKyM6IGV4X2NtZHMyLmM6MzU0OQorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIkRydWtvd2FuaWUgb2R3b7NhbmUiCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogTmllIG1vv25hIHphcGlzYeYgZG8gd3lqnGNpb3dlZ28gcGxpa3UgUG9zdFNjcmlwdHUiCisKKyM6IGV4X2NtZHMyLmM6NDE4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI0OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNjI0OiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDE5OSBleF9jbWRzMi5jOjQ4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiBOaWUgbW+/bmEgb2Rjenl0YeYgcGxpa3UgemFzb2LzdyBQb3N0U2NyaXB0dSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IHBsaWsgXCIlc1wiIG5pZSBqZXN0IHBsaWtpZW0gemFzb2LzdyBQb3N0U2NyaXB0dSIKKworIzogZXhfY21kczIuYzo0MjIyIGV4X2NtZHMyLmM6NDI0MiBleF9jbWRzMi5jOjQyNTcgZXhfY21kczIuYzo0Mjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTk6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTk6IHBsaWsgXCIlc1wiIG5pZSBqZXN0IHdzcGllcmFueW0gcGxpa2llbSB6YXNvYvN3IFBvc3RTY3JpcHR1IgorCisjOiBleF9jbWRzMi5jOjQzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMTogXCIlc1wiIHJlc291cmNlIGZpbGUgaGFzIHdyb25nIHZlcnNpb24iCittc2dzdHIgIkU2MjE6IFwiJXNcIiBuaWVwcmF3aWSzb3dhIHdlcnNqYSBwbGlrdSB6YXNvYvN3IgorCisjOiBleF9jbWRzMi5jOjQ3NzYKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IE5pZSBtb79uYSBvdHdvcnp55iBwbGlrdSBQb3N0U2NyaXB0IGRvIHd5apxjaWEiCisKKyM6IGV4X2NtZHMyLmM6NDgwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDkyOAorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwicHJvbG9nLnBzXCIiCittc2dzdHIgIkU0NTY6IE5pZSBtb79uYSB6bmFsZZ/mIHBsaWt1IHphc29i83cgUG9zdFNjcmlwdHUgXCJwcm9sb2cucHNcIiIKKworIzogZXhfY21kczIuYzo0OTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IGZpbmQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXMucHNcIiIKK21zZ3N0ciAiRTQ1NjogTmllIG1vv25hIHpuYWxln+YgcGxpa3UgemFzb2LzdyBQb3N0U2NyaXB0dSBcIiVzLnBzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjIwOiBVbmFibGUgdG8gY29udmVydCBmcm9tIG11bHRpLWJ5dGUgdG8gXCIlc1wiIGVuY29kaW5nIgorbXNnc3RyICJFNjIwOiBOaWUgbW+/bmEgcHJ6ZWtvbndlcnRvd2HmIHogbXVsdGktYnl0ZSBkbyBrb2Rvd2FuaWEgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjUxMDIKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIlByemVzebNhbSBkbyBkcnVrYXJraS4uLiIKKworIzogZXhfY21kczIuYzo1MTA2Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogRHJ1a293YW5pZSBwbGlrdSBQb3N0U2NyaXB0IG5pZSBwb3dpb2SzbyBzaeoiCisKKyM6IGV4X2NtZHMyLmM6NTEwOAorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiWmFkYW5pZSBkcnVrb3dhbmllIHByemVzs2FuZS4iCisKKyM6IGV4X2NtZHMyLmM6NTYxOAorIywgYy1mb3JtYXQKK21zZ2lkICJDdXJyZW50ICVzbGFuZ3VhZ2U6IFwiJXNcIiIKK21zZ3N0ciAiQmllv7ljeSAlc2rqenlrOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogTmllIG1vZ+ogdXN0YXdp5iBq6np5a2EgbmEgXCIlc1wiIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9rdGFsICUwM28iCisKKyM6IGV4X2NtZHMuYzoxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPiAlZCwgSGV4ICUwNHgsIE9jdGFsICVvIgorbXNnc3RyICI+ICVkLCBIZXggJTA0eCwgIE9rdGFsICVvIgorCisjOiBleF9jbWRzLmM6MTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwOHgsIE9rdGFsICVvIgorCisjOiBleF9jbWRzLmM6NDMwCittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IFByemVuaWVzaWVuaWUgd2llcnN6eSBuYSBzaWViaWUgc2FteWNoIgorCisjOiBleF9jbWRzLmM6NDk5Cittc2dpZCAiMSBsaW5lIG1vdmVkIgorbXNnc3RyICIxIHdpZXJzeiBwcnplbmllc2lvbnkiCisKKyM6IGV4X2NtZHMuYzo1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICIlbGQgd2llcnN6ZSBwcnplbmllc2lvbmUiCisKKyM6IGV4X2NtZHMuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGZpbHRlcmVkIgorbXNnc3RyICIlbGQgd2llcnN6eSBwcnplZmlsdHJvd2FueWNoIgorCisjOiBleF9jbWRzLmM6OTUyCittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogQXV0b2tvbWVuZHkgKkZpbHRlciogbmllIG1vZ7kgem1pZW5pYeYgYmllv7ljZWdvIGJ1Zm9yYSIKKworIzogZXhfY21kcy5jOjEwMzcKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIltCcmFrIHphcGlzdSBvZCBjemFzdSBvc3RhdG5pZWogem1pYW55XVxuIgorCisjOiBleF9jbWRzLmM6MTI4MworIywgYy1mb3JtYXQKK21zZ2lkICIlc3ZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAiJXN2aW1pbmZvOiAlcyB3IHdpZXJzenU6ICIKKworIzogZXhfY21kcy5jOjEyODgKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzogWmJ5dCB3aWVsZSBis+pk83c7IHBvbWlqYW0gcmVzenTqIHBsaWt1IgorCisjOiBleF9jbWRzLmM6MTMyMworIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgIldjenl0dWrqIHBsaWsgdmltaW5mbyBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiBpbmZvcm1hY2phIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIHpha7NhZGtpIgorCisjOiBleF9jbWRzLmM6MTMyNgorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBOSUUgUE9XSU9Eo08gU0nKIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogUGxpayB2aW1pbmZvIGplc3QgbmllemFwaXN5d2Fsbnk6ICVzIgorCisjOiBleF9jbWRzLmM6MTU0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiBOaWUgbW9n6iB6YXBpc2HmIHBsaWt1IHZpbWluZm8gJXMhIgorCisjOiBleF9jbWRzLmM6MTU1MQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIlphcGlzdWrqIHBsaWsgdmltaW5mbyBcIiVzXCIiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBUZW4gcGxpayB2aW1pbmZvIHpvc3RhsyB3eWdlbmVyb3dhbnkgcHJ6ZXogVmltYSAlcy5cbiIKKworIzogZXhfY21kcy5jOjE2NTEKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIE1vv2VzeiBnbyBvc3Ryb79uaWUgZWR5dG93YeYhXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjUzCittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgV2FydG+c5iAnZW5jb2RpbmcnIHcgY3phc2llIHphcHN1IHRlZ28gcGxpa3VcbiIKKworIzogZXhfY21kcy5jOjE3NTIKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIk5pZWRvcHVzemN6YWxueSBwb2N6uXRrb3d5IHpuYWsiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjE0MAorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiBQbGlrIGplc3QgemGzYWRvd2FueSB3IGlubnltIGJ1Zm9yemUiCisKKyM6IGV4X2NtZHMuYzoyMTc0Cittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiWmFwaXNh5iBjeuqcY2lvd28gcGxpaz8iCisKKyM6IGV4X2NtZHMuYzoyMTgxCittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IFN0b3N1aiAhIGRvIHphcGlzYW5pYSBjeuqcY2lvd28gYnVmb3JhIgorCisjOiBleF9jbWRzLmM6MjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIk5hZHBpc2HmIGlzdG5pZWq5Y3kgcGxpayBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogQnJhayBuYXp3eSBwbGlrdSBkbGEgYnVmb3JhICVsZCIKKworIzogZXhfY21kcy5jOjI0MDUKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiBQbGlrIG5pZXphcGlzYW55OiBaYXBpcyBqZXN0IHd5s7ljem9ueSBvcGNquSAnd3JpdGUnIgorCisjOiBleF9jbWRzLmM6MjQyNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisib3BjamEgJ3JlYWRvbmx5JyBuYXN0YXdpb25hIGRsYSBcIiUuKnNcIi5cbiIKKyJDenkgY2hjZXN6IGdvIHBvbWltbyB0ZWdvIHphcGlzYeY/IgorCisjOiBleF9jbWRzLmM6MjU5NworbXNnaWQgIkVkaXQgRmlsZSIKK21zZ3N0ciAiRWR5dHVqIFBsaWsiCisKKyM6IGV4X2NtZHMuYzozMjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDM6IEF1dG9jb21tYW5kcyB1bmV4cGVjdGVkbHkgZGVsZXRlZCBuZXcgYnVmZmVyICVzIgorbXNnc3RyICJFMTQzOiBBdXRva29tZW5keSBuaWVvY3pla2l3YW5pZSBza2Fzb3dhs3kgbm93eSBidWZvciAlcyIKKworIzogZXhfY21kcy5jOjMzMzkKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogbmllbnVtZXJ5Y3pueSBhcmd1bWVudCBkbGEgOnoiCisKKyM6IGV4X2NtZHMuYzozNDI0Cittc2dpZCAiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIKK21zZ3N0ciAiRTE0NTogS29tZW5keSBwb3ezb2tpIHO5IG5pZWRvendvbG9uZSB3IHJ2aW0iCisKKyM6IGV4X2NtZHMuYzozNTMxCittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0NjogV3pvcmNlIHJlZ3VsYXJuZSBuaWUgbW9nuSBieeYgcm96Z3JhbmljemFuZSBsaXRlcmFtaSIKKworIzogZXhfY21kcy5jOjM4NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAiemFtaWXxIG5hICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQyNjYKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKFByemVyd2FuZSkgIgorCisjOiBleF9jbWRzLmM6NDI3MAorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICIxIHBvZHN0YXdpZW5pZSAiCisKKyM6IGV4X2NtZHMuYzo0MjcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICIlbGQgcG9kc3Rhd2ll8SIKKworIzogZXhfY21kcy5jOjQyNzUKK21zZ2lkICIgb24gMSBsaW5lIgorbXNnc3RyICIgdyAxIHdpZXJzenUiCisKKyM6IGV4X2NtZHMuYzo0Mjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiB3ICVsZCB3aWVyc3phY2giCisKKyM6IGV4X2NtZHMuYzo0MzI4Cittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiBOaWUgbW9n6iB3eWtvbmHmIDpnbG9iYWwgcmVrdXJzeXduaWUiCisKKyM6IGV4X2NtZHMuYzo0MzYzCittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IEJyYWsgd3pvcmNhIHJlZ3VsYXJuZWdvIHcgOmdsb2JhbCIKKworIyBjLWZvcm1hdAorIzogZXhfY21kcy5jOjQ0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiV3pvcnplYyB6bmFsZXppb25vIHcga2G/ZHltIHdpZXJzenU6ICVzIgorCisjOiBleF9jbWRzLmM6NDQ5MworbXNnaWQgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKK21zZ3N0ciAiIgorIlxuIgorIiMgT3N0YXRuaSBwb2RzdGF3aWFueSBjablnOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NTk0IGV4X2RvY21kLmM6MjAxMQorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogTmllIHBhbmlrdWohIgorCisjOiBleF9jbWRzLmM6NDY0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjYxOiBTb3JyeSwgbm8gJyVzJyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTY2MTogUHJ6eWtybyBtaSwgYnJhayAnJXMnIHBvbW9jeSBkbGEgJXMiCisKKyM6IGV4X2NtZHMuYzo0NjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogUHJ6eWtybyBtaSwgYWxlIGJyYWsgcG9tb2N5IG8gJXMiCisKKyM6IGV4X2NtZHMuYzo0NjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiUHJ6eWtybyBtaSwgbmllIG1hIHBsaWt1IHBvbW9jeSBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo1MTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6IE5pZSBqZXN0IGthdGFsb2dpZW06ICVzIgorCisjOiBleF9jbWRzLmM6NTMwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1MjogTmllIG1vZ+ogb3R3b3J6eeYgJXMgZG8gemFwaXN1IgorCisjOiBleF9jbWRzLmM6NTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogTmllIG1vZ+ogb3R3b3J6eeYgJXMgZG8gb2Rjenl0dSIKKworIzogZXhfY21kcy5jOjUzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY3MDogTWl4IG9mIGhlbHAgZmlsZSBlbmNvZGluZ3Mgd2l0aGluIGEgbGFuZ3VhZ2U6ICVzIgorbXNnc3RyICJFNjcwOiBNaWVzemFua2Ega29kb3dh8SB3IHBsaWt1IHBvbW9jeSB3IHJhbWFjaCBq6np5a2E6ICVzIgorCisjOiBleF9jbWRzLmM6NTQ0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiBEd3Vrcm90bnkgem5hY3puaWsgXCIlc1wiIHcgcGxpa3UgJXMiCisKKyM6IGV4X2NtZHMuYzo1NTUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogTmllem5hbmEga29tZW5kYSB6bmFrdTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NTczCittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IEJyYWsgbmF6d3kgem5ha3UiCisKKyM6IGV4X2NtZHMuYzo1NjE5Cittc2dpZCAiRTYxMjogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTI1NTogWmJ5dCB3aWVsZSBuYXp3IHpuYWvzdyIKKworIzogZXhfY21kcy5jOjU2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBOaWV3s2GcY2l3eSB0ZWtzdCB6bmFrdTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzE4IGV4X2NtZHMuYzo1OTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IE5pZXpuYW55IHpuYWs6ICVzIgorCisjOiBleF9jbWRzLmM6NTc2NworbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IEJyYWsgbnVtZXJ1IHpuYWt1IgorCisjOiBleF9jbWRzLmM6NTg0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODogTmlld7NhnGNpd2EgbmF6d2EgYnVmb3JhOiAlcyIKKworIzogZXhfY21kcy5jOjU4ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IE5pZXezYZxjaXdlIElEIHpuYWt1OiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1OTU4Cittc2dpZCAiIChOT1QgRk9VTkQpIgorbXNnc3RyICIgKE5JRSBaTkFMRVpJT05PKSIKKworIzogZXhfY21kcy5jOjU5NjAKK21zZ2lkICIgKG5vdCBzdXBwb3J0ZWQpIgorbXNnc3RyICIobmllIHdzcG9tYWdhbmUpIgorCisjOiBleF9jbWRzLmM6NjA1OQorbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW1NrYXNvd2Fub10iCisKKyM6IGV4X2RvY21kLmM6NTI1Cittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIldjaG9keuogdyB0cnliIEV4LiBXcHJvd2FknyBcInZpc3VhbFwiIGFieSBwcnplapzmIGRvIHRyeWJ1IE5vcm1hbC4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjU2MQorbXNnaWQgIkU1MDE6IEF0IGVuZC1vZi1maWxlIgorbXNnc3RyICJFNTAxOiBOYSBrb/FjdSBwbGlrdSIKKworIzogZXhfZG9jbWQuYzo2NjkKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IEtvbWVuZGEgemJ5dCByZWt1cnN5d25hIgorCisjOiBleF9kb2NtZC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiBOaWUgem5hbGV6aW9ubyB3eWq5dGt1OiAlcyIKKworIzogZXhfZG9jbWQuYzoxMzE3Cittc2dpZCAiRW5kIG9mIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiS29uaWVjIHdjenl0eXdhbmVnbyBwbGlrdSIKKworIzogZXhfZG9jbWQuYzoxMzE4Cittc2dpZCAiRW5kIG9mIGZ1bmN0aW9uIgorbXNnc3RyICJLb25pZWMgZnVua2NqaSIKKworIzogZXhfZG9jbWQuYzoxOTA3Cittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogTmllamVkbm96bmFjem5lIHphc3Rvc293YW5pZSBrb21lbmR5IHpkZWZpbmlvd2FuZWogcHJ6ZXogdb95dGtvd25pa2EiCisKKyM6IGV4X2RvY21kLmM6MTkyMQorbXNnaWQgIkU0OTI6IE5vdCBhbiBlZGl0b3IgY29tbWFuZCIKK21zZ3N0ciAiRTQ5MjogTmllIGplc3Qga29tZW5kuSBlZHl0b3JhIgorCisjOiBleF9kb2NtZC5jOjIwMzAKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IERhbm8gd3N0ZWN6bnkgemFrcmVzIgorCisjOiBleF9kb2NtZC5jOjIwMzkKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIkRhbm8gd3N0ZWN6bnkgemFrcmVzOyB6YW1pYW5hIGplc3QgbW+/bGl3YSIKKworIzogZXhfZG9jbWQuYzoyMTYyCittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiBTdG9zdWogdyBsdWIgdz4+IgorCisjOiBleF9kb2NtZC5jOjM3ODgKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IFByenlrcm8gbWksIGFsZSB0YSBrb21lbmRhIG5pZSBqZXN0IGRvc3TqcG5hIHcgdGVqIHdlcnNqaSIKKworIzogZXhfZG9jbWQuYzozOTkxCittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IFR5bGtvIHBvamVkeW5jemEgbmF6d2EgcGxpa3UgZG96d29sb25hIgorCisjOiBleF9kb2NtZC5jOjQ1NzEKK21zZ2lkICIxIG1vcmUgZmlsZSB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICIxIHdp6mNlaiBwbGlrIGRvIGVkeWNqaS4gIE1pbW8gdG8gd3lqnOY/IgorCisjOiBleF9kb2NtZC5jOjQ1NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICJqZXN6Y3plICVkIHBsaWvzdyBkbyBlZHljamkuICBNaW1vIHRvIHd5apzmPyIKKworIzogZXhfZG9jbWQuYzo0NTgxCittc2dpZCAiRTE3MzogMSBtb3JlIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogMSB3aepjZWogcGxpayBkbyBlZHljamkiCisKKyM6IGV4X2RvY21kLmM6NDU4MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiBqZXN6Y3plICVsZCBwbGlr83cgZG8gZWR5Y2ppIgorCisjOiBleF9kb2NtZC5jOjQ2NzgKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTc0OiBLb21lbmRhIGp1vyBpc3RuaWVqZTsgYWJ5IGq5IHByemVkZWZpbmlvd2HmIHN0b3N1aiAhIgorCisjOiBleF9kb2NtZC5jOjQ3ODkKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgTmF6d2EgICAgICAgQXJnLiBaYWsuICBHb3Rvd2+c5iAgRGVmaW5pY2phIgorCisjOiBleF9kb2NtZC5jOjQ4NzgKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIk5pZSB6bmFsZXppb25vIGtvbWVuZCB6ZGVmaW5pb3dhbnljaCBwcnpleiB1v3l0a293bmlrYSIKKworIzogZXhfZG9jbWQuYzo0OTEwCittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTogTmllIG9rcmWcbG9ubyBhdHJ5YnV0dSIKKworIzogZXhfZG9jbWQuYzo0OTYyCittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiBOaWV3s2GcY2l3YSBpbG+c5iBhcmd1bWVudPN3IgorCisjOiBleF9kb2NtZC5jOjQ5NzcKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBNbm+/bmlrIG5pZSBtb79lIGJ55iBwb2RhbnkgZHd1a3JvdG5pZSIKKworIzogZXhfZG9jbWQuYzo0OTg3Cittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogTmlld7NhnGNpd2EgZG9teZxsbmEgd2FydG+c5iBtbm+/bmlrYSIKKworIzogZXhfZG9jbWQuYzo1MDE4Cittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiBhcmd1bWVudCB3eW1hZ2FueSBkbyBkb3Bls25pYW5pYSIKKworIzogZXhfZG9jbWQuYzo1MDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiBOaWV3s2GcY2l3YSB3YXJ0b5zmIGRvcGWzbmlhbmlhOiAlcyIKKworIzogZXhfZG9jbWQuYzo1MDU5Cittc2dpZCAiRTQ2ODogQ29tcGxldGlvbiBhcmd1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGN1c3RvbSBjb21wbGV0aW9uIgorbXNnc3RyICJFNDY4OiBBcmd1bWVudCBkZXBls25pYW5pYSBkb3p3b2xvbnkgd3mzuWN6bmllIGRsYSBkb3Bls25pYW5pYSB1v3l0a293bmlrYSIKKworIzogZXhfZG9jbWQuYzo1MDY1Cittc2dpZCAiRTQ2NzogQ3VzdG9tIGNvbXBsZXRpb24gcmVxdWlyZXMgYSBmdW5jdGlvbiBhcmd1bWVudCIKK21zZ3N0ciAiRTQ2NzogRG9wZbNuaWFuaWUgdb95dGtvd25pa2Egd3ltYWdhIGZ1bmtjamkgamFrbyBhcmd1bWVudHUiCisKKyM6IGV4X2RvY21kLmM6NTA3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IE5pZXezYZxjaXd5IGF0cnlidXQ6ICVzIgorCisjOiBleF9kb2NtZC5jOjUxMTkKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogTmlld7NhnGNpd2EgbmF6d2Ega29tZW5keSIKKworIzogZXhfZG9jbWQuYzo1MTM0Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICIiCisiRTE4MzogS29tZW5keSB6ZGVmaW5pb3dhbmUgcHJ6ZXogdb95dGtvd25pa2EgbXVzerkgcm96cG9jenluYeYgc2nqIGR1v7kgIgorImxpdGVyuSIKKworIzogZXhfZG9jbWQuYzo1MjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiBOaWUgbWEgdGFraWVqIGtvbWVuZHkgdb95dGtvd25pa2E6ICVzIgorCisjOiBleF9kb2NtZC5jOjU2NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBOaWUgbW9n6iB6bmFsZZ/mIHplc3Rhd3Uga29sb3LzdyAlcyIKKworIzogZXhfZG9jbWQuYzo1Njc0Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIldpdGFqIHW/eXRrb3duaWt1IFZpbWEhIgorCisjOiBleF9kb2NtZC5jOjYzOTEKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAiRWR5dHVqIHBsaWsgdyBub3d5bSBva25pZSIKKworIzogZXhfZG9jbWQuYzo2Njg2Cittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICJCcmFrIHBsaWt1IHd5bWlhbnkiCisKKyM6IGV4X2RvY21kLmM6Njc5MAorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJEb7O5Y3ogcGxpayIKKworIzogZXhfZG9jbWQuYzo2ODU0Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiBOaWUgbWEgcG9wcnplZG5pZWdvIGthdGFsb2d1IgorCisjOiBleF9kb2NtZC5jOjY5MzYKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiBOaWV6bmFueSIKKworIzogZXhfZG9jbWQuYzo3MDIxCittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IDp3aW5zaXplIHd5bWFnYSBkd/NjaCBhcmd1bWVudPN3IG51bWVyeWN6bnljaCIKKworIzogZXhfZG9jbWQuYzo3MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiUG96eWNqYSBva25hOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjcwODIKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogUG96eXNraXdhbmllIHBvenljamkgb2tuYSBuaWUgamVzdCB6YWltcGxlbWVudG93YW5lIGRsYSB0ZWdvIHN5c3RlbXUiCisKKyM6IGV4X2RvY21kLmM6NzA5MgorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IDp3aW5wb3Mgd3ltYWdhIGR382NoIGFyZ3VtZW5083cgbnVtZXJ5Y3pueWNoIgorCisjOiBleF9kb2NtZC5jOjczNzAKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICJaYXBpc3ogcHJ6ZWtpZXJvd2FuaWUiCisKKyM6IGV4X2RvY21kLmM6NzU2MAorbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAiWmFwaXN6IHdpZG9rIgorCisjOiBleF9kb2NtZC5jOjc1NjEKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIlphcGlzeiBzZXNq6iIKKworIzogZXhfZG9jbWQuYzo3NTYzCittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAiWmFwaXN6IHVzdGF3aWVuaWEiCisKKyM6IGV4X2RvY21kLmM6NzcxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiBpc3RuaWVqZSAod3ltdZwgcG9wcnpleiAhKSIKKworIzogZXhfZG9jbWQuYzo3NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTmllIG1vZ+ogb3R3b3J6eeYgXCIlc1wiIGRvIHphcGlzdSIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Nzc0NAorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogQXJndW1lbnQgbXVzaSBieeYgbGl0ZXK5IGFsYm8gY3Vkenlzs293ZW0gdyBwcnrzZC90ebMiCisKKyM6IGV4X2RvY21kLmM6Nzc4NgorbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogUmVrdXJzeXduZSB6YXN0b3Nvd2FuaWUgOm5vcm1hbCB6YSBns+pib2tpZSIKKworIzogZXhfZG9jbWQuYzo4MzA0Cittc2dpZCAiRTE5NDogTm8gYWx0ZXJuYXRlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciAnIyciCittc2dzdHIgIkUxOTQ6IEJyYWsgbmF6d3kgemFtaWVubmVnbyBwbGlrdSBkbyBwb2RzdGF3aWVuaWEgcG9kICcjJyIKKworIzogZXhfZG9jbWQuYzo4MzM1Cittc2dpZCAiRTQ5NTogbm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJFNDk1OiBicmFrIG5hend5IHBsaWt1IGF1dG9rb21lbmQgZG8gcG9kc3Rhd2llbmlhIHBvZCBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo4MzQzCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiBicmFrIG51bWVydSBidWZvcmEgYXV0b2tvbWVuZCBkbyBwb2RzdGF3aWVuaWEgcG9kICBcIjxhYnVmPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNTQKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiRTQ5NzogYnJhayBuYXp3eSBkb3Bhc293YW5pYSBhdXRva29tZW5kIHBvZCBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM2NAorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICJFNDk4OiBicmFrIG5hend5IHBsaWt1IDpzb3VyY2UgZG8gcG9zdGF3aWVuaWEgcG9kIFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjg0MDUKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIkU0OTk6IFB1c3RhIG5hendhIHBsaWt1IGRsYSAnJScgbHViICcjJywgZHppYbNhIHR5bGtvIHogXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6ODQwNworbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6IFd5bmlraWVtIGplc3QgcHVzdHkgY2m5ZyIKKworIzogZXhfZG9jbWQuYzo5MzYyCittc2dpZCAiRTE5NTogQ2Fubm90IG9wZW4gdmltaW5mbyBmaWxlIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTk1OiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSB2aW1pbmZvIGRvIG9kY3p5dHUiCisKKyM6IGV4X2RvY21kLmM6OTUzNQorbXNnaWQgIkUxOTY6IE5vIGRpZ3JhcGhzIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTE5NjogQnJhayBkd3VncmFm83cgdyB0ZWogd2Vyc2ppIgorCisjOiBleF9ldmFsLmM6NDQwCittc2dpZCAiRTYwODogQ2Fubm90IDp0aHJvdyBleGNlcHRpb25zIHdpdGggJ1ZpbScgcHJlZml4IgorbXNnc3RyICJFNjA4OiBOaWUgbW+/bmEgJzp0aHJvdycgd3lquXRr83cgeiBwcmVmaWtzZW0gJ1ZpbSciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAiV3lquXRlazogJXMiCisKKyM6IGV4X2V2YWwuYzo1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAiV3lquXRlayB6YWtv8WN6b255OiAlcyIKKworIzogZXhfZXZhbC5jOjU3NworIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZGlzY2FyZGVkOiAlcyIKK21zZ3N0ciAiV3lquXRlayBvZHJ6dWNvbnk6ICVzIgorCisjOiBleF9ldmFsLmM6NjIwIGV4X2V2YWwuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMsIGxpbmUgJWxkIgorbXNnc3RyICIlcywgd2llcnN6ICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICJXeWq5dGVrIHByemVjaHd5Y29ueTogJXMiCisKKyM6IGV4X2V2YWwuYzo3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICIlcyB6b3N0YbMgemF3aWVzem9ueSIKKworIzogZXhfZXZhbC5jOjcxNgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICIlcyBwcnp5d3LzY29ueSIKKworIzogZXhfZXZhbC5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzIG9kcnp1Y29ueSIKKworIzogZXhfZXZhbC5jOjc0NgorbXNnaWQgIkV4Y2VwdGlvbiIKK21zZ3N0ciAiV3lquXRlayIKKworIzogZXhfZXZhbC5jOjc1MgorbXNnaWQgIkVycm9yIGFuZCBpbnRlcnJ1cHQiCittc2dzdHIgIkKzuWQgaSBwcnplcndhbmllIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzNzUKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiQrO5ZCIKKworIy4gaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkKKyM6IGV4X2V2YWwuYzo3NTYKK21zZ2lkICJJbnRlcnJ1cHQiCittc2dzdHIgIlByemVyd2FuaWUiCisKKyM6IGV4X2V2YWwuYzo4MzAKK21zZ2lkICJFNTc5OiA6aWYgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU3OTogemJ5dCBns+pib2tpZSB6YWduaWW/ZL9lbmllIDppZiIKKworIzogZXhfZXZhbC5jOjg2NworbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmVuZGlmIGJleiA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2UgYmV6IDppZiIKKworIzogZXhfZXZhbC5jOjkxNAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYgYmV6IDppZiIKKworIzogZXhfZXZhbC5jOjkyMQorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiB3aWVsb2tyb3RuZSA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjkyNAorbXNnaWQgIkU1ODQ6IDplbHNlaWYgYWZ0ZXIgOmVsc2UiCittc2dzdHIgIkU1ODQ6IDplbHNlaWYgcG8gOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5OTEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogemJ5dCBns+pib2tpZSB6YWduaWW/ZL9lbmllIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEwNDcKK21zZ2lkICJFNTg2OiA6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODY6IDpjb250aW51ZSBiZXogOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTA4NworbXNnaWQgIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NzogOmJyZWFrIGJleiA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMjg2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiB6Ynl0IGez6mJva2llIHphZ25pZb9kv2VuaWUgOnRyeSIKKworIzogZXhfZXZhbC5jOjEzNjYKK21zZ2lkICJFNjAzOiA6Y2F0Y2ggd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAzOiA6Y2F0Y2ggYmV6IDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gKiBKdXN0IHBhcnNlLgorIzogZXhfZXZhbC5jOjEzODgKK21zZ2lkICJFNjA0OiA6Y2F0Y2ggYWZ0ZXIgOmZpbmFsbHkiCittc2dzdHIgIkU2MDQ6IDpjYXRjaCB6YSA6ZmluYWxseSIKKworIzogZXhfZXZhbC5jOjE1MjEKK21zZ2lkICJFNjA2OiA6ZmluYWxseSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDY6IDpmaW5hbGx5IGJleiA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNTQ1Cittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IHdpZWxva3JvdG5lIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTY1NAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6ZW5kdHJ5IGJleiA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTk4NgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IDplbmRmdW5jdGlvbiBwb3phIGZ1bmtjarkiCisKKyM6IGV4X2dldGxuLmM6MzI5NgorbXNnaWQgInRhZ25hbWUiCittc2dzdHIgIm5hendhIHpuYWN6bmlrYSIKKworIzogZXhfZ2V0bG4uYzozMjk5Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgcG9rcmV3bnkgcGxpa1xuIgorCisjOiBleF9nZXRsbi5jOjQ3NTIKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIm9wY2phICdoaXN0b3J5JyBqZXN0IHplcm93YSIKKworIzogZXhfZ2V0bG4uYzo1MDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcyBIaXN0b3JpYSAob2QgbmFqbm93c3p5Y2ggcG8gbmFqc3RhcnN6ZSk6XG4iCisKKyM6IGV4X2dldGxuLmM6NTAyNAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAiV2llcnN6IHBvbGVjZfEiCisKKyM6IGV4X2dldGxuLmM6NTAyNQorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgIlN6dWthbnkgY2m5ZyIKKworIzogZXhfZ2V0bG4uYzo1MDI2Cittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAiV3lyYb9lbmllIgorCisjOiBleF9nZXRsbi5jOjUwMjcKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICJXaWVyc3ogd3Byb3dhZHpl8SIKKworIzogZXhfZ2V0bG4uYzo1MDY1Cittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciBwcnpla3JhY3phIGSzdWdvnOYgcG9sZWNlbmlhIgorCisjOiBleF9nZXRsbi5jOjUyNDIKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiBBa3R5d255IHdpZG9rIGx1YiBidWZvciBza2Fzb3dhbnkiCisKKyM6IGZpbGVpby5jOjM3NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICJOaWVkb3B1c3pjemFsbmEgbmF6d2EgcGxpa3UiCisKKyM6IGZpbGVpby5jOjQwMSBmaWxlaW8uYzo1MzUgZmlsZWlvLmM6MjkxMyBmaWxlaW8uYzoyOTU0Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgImplc3Qga2F0YWxvZ2llbSIKKworIzogZmlsZWlvLmM6NDAzCittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAibmllIGplc3QgcGxpa2llbSIKKworIzogZmlsZWlvLmM6NTU3IGZpbGVpby5jOjQxMzEKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbTm93eSBQbGlrXSIKKworIzogZmlsZWlvLmM6NTkwCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW05pZSBkb3p3b2xvbm9dIgorCisjOiBmaWxlaW8uYzo2OTQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiBBdXRva29tZW5keSAqUmVhZFByZSB6cm9iabN5IHBsaWsgbmllb2Rjenl0eXdhbG55bSIKKworIzogZmlsZWlvLmM6Njk2Cittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogQXV0b2tvbWVuZHkgKlJlYWRQcmUgbmllIG1vZ7kgem1pZW5pYeYgYmllv7ljZWdvIGJ1Zm9yYSIKKworIzogZmlsZWlvLmM6NzE3Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiBXY3p5dHl3YW5pZSB6ZSBzdGRpbi4uLlxuIgorCisjOiBmaWxlaW8uYzo3MjMKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIldjenl0eXdhbmllIHplIHN0ZGluLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjEwMDAKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogUGxpayBzdHdvcnpvbnkgcG9wcnpleiBwcnplbWlhbuogamVzdCBuaWVvZGN6eXR5d2FsbnkhIgorCisjOiBmaWxlaW8uYzoyMDkwCittc2dpZCAiW2ZpZm8vc29ja2V0XSIKK21zZ3N0ciAiW2ZpZm8vc29ja2V0XSIKKworIzogZmlsZWlvLmM6MjA5NworbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW2ZpZm9dIgorCisjOiBmaWxlaW8uYzoyMTA0Cittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIltzb2NrZXRdIgorCisjOiBmaWxlaW8uYzoyMTEyCittc2dpZCAiW1JPXSIKK21zZ3N0ciAiW1JPXSIKKworIzogZmlsZWlvLmM6MjEyMgorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW2JyYWsgQ1JdJyIKKworIzogZmlsZWlvLmM6MjEyNworbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIlt6bmFsZXppb25vIE5MXSIKKworIzogZmlsZWlvLmM6MjEzMgorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW2SzdWdpZSB3aWVyc3plIHJvemR6aWVsYW5lXSIKKworIzogZmlsZWlvLmM6MjEzOCBmaWxlaW8uYzo0MTE1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbTklFIHByemVtaWVuaW9uZV0iCisKKyM6IGZpbGVpby5jOjIxNDMgZmlsZWlvLmM6NDEyMAorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJbcHJ6ZW1pZW5pb25lXSIKKworIzogZmlsZWlvLmM6MjE1MCBmaWxlaW8uYzo0MTQ1Cittc2dpZCAiW2NyeXB0ZWRdIgorbXNnc3RyICJbemFrb2Rvd2FuZV0iCisKKyM6IGZpbGVpby5jOjIxNTcKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltCo6VEIFcgUFJaRU1JQU5JRV0iCisKKyM6IGZpbGVpby5jOjIxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIltOSUVET1pXT0xPTlkgQkFKVCB3IHdpZXJzenUgJWxkXSIKKworIzogZmlsZWlvLmM6MjE3MAorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltCo8pEWSBXIE9EQ1pZQ0lFXSIKKworIzogZmlsZWlvLmM6MjM4NgorbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICJOaWUgbW9n6iB6bmFsZZ/mIHBsaWt1IHR5bWN6YXNvd2VnbyB3IGNlbHUgcHJ6ZW1pYW55IgorCisjOiBmaWxlaW8uYzoyMzkzCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICJOaWV1ZGFuYSBwcnplbWlhbmEgeiAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyMzk2Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAibmllIG1vZ+ogb2Rjenl0YeYgd3lqnGNpYSB6ICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI3OTYKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogQXV0b2tvbWVuZHkgc2thc293YbN5IGx1YiB3ebNhZG93YbN5IGJ1Zm9yIHByemV6bmFjem9ueSBkbyB6YXBpc3UiCisKKyM6IGZpbGVpby5jOjI4MTkKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2tvbWVuZGEgem1pZW5ps2EgbGljemLqIHdpZXJzenkgdyBuaWVvY3pla2l3YW55IHNwb3PzYiIKKworIzogZmlsZWlvLmM6Mjg1NworbXNnaWQgIk5ldEJlYW5zIGRpc3NhbGxvd3Mgd3JpdGVzIG9mIHVubW9kaWZpZWQgYnVmZmVycyIKK21zZ3N0ciAiTmV0QmVhbnMgbmllIHBvendhbGEgbmEgemFwaXMgbmllem1vZHlmaWtvd2FueWNoIGJ1Zm9y83ciCisKKyM6IGZpbGVpby5jOjI4NjUKK21zZ2lkICJQYXJ0aWFsIHdyaXRlcyBkaXNhbGxvd2VkIGZvciBOZXRCZWFucyBidWZmZXJzIgorbXNnc3RyICJDeuqcY2lvd3kgemFwaXMgbmllbW+/bGl3eSBkbGEgYnVmb3LzdyBOZXRCZWFucyIKKworIzogZmlsZWlvLmM6MjkxOSBmaWxlaW8uYzoyOTM3Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIm5pZSBqZXN0IHBsaWtpZW0gbHViIHphcGlzeXdhbG55bSBwcnp5cnq5ZGVtIgorCisjOiBmaWxlaW8uYzoyOTg5Cittc2dpZCAiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgImplc3QgdHlsa28gZG8gb2Rjenl0dSAod3ltdZwgcG9wcnpleiAhKSIKKworIzogZmlsZWlvLmM6MzMzNQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IE5pZSBtb2fqIHphcGlzYeYgZG8gcGxpa3UgemFiZXpwaWVjemVuaWEgKHd5bXWcIHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozMzQ3Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDc6IEKzuWQgcG9kY3phcyB6YW15a2FuaWEgcGxpa3UgemFiZXpwaWVjemVuaWEgKHd5bXWcIHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozMzQ5Cittc2dpZCAiRTUwODogQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwODogTmllIG1vZ+ogb2Rjenl0YeYgcGxpa3UgdyBjZWx1IHphYmV6cGllY3plbmlhICh3eW11nCBwcnpleiAhKSIKKworIzogZmlsZWlvLmM6MzM2NQorbXNnaWQgIkU1MDk6IENhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwOTogTmllIG1vZ+ogc3R3b3J6eeYgcGxpa3UgemFiZXpwaWVjemVuaWEgKHd5bXWcIHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozNDY4Cittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTEwOiBOaWUgbW9n6iB6cm9iaeYgcGxpa3UgemFiZXpwaWVjemVuaWEgKHd5bXWcIHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozNTMwCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiBSb3pkemlhsyB6YXNvYvN3IHpvc3RhbmllIHV0cmFjb255ICh3eW11nCBwcnpleiAhKSIKKworIzogZmlsZWlvLmM6MzY0MAorbXNnaWQgIkUyMTQ6IENhbid0IGZpbmQgdGVtcCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjE0OiBOaWUgbW9n6iB6bmFsZZ/mIHBsaWt1IHR5bWN6YXNvd2VnbyBkbyB6YXBpc2FuaWEiCisKKyM6IGZpbGVpby5jOjM2NTgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogTmllIG1vZ+ogcHJ6ZW1pZW5p5iAodb95aiAhIGJ5IHphcGlzYeYgYmV6IHByemVtaWFueSkiCisKKyM6IGZpbGVpby5jOjM2OTMKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiBOaWUgbW9n6iBvdHdvcnp55iBwb2SzuWN6b25lZ28gcGxpa3UgZG8gemFwaXN1IgorCisjOiBmaWxlaW8uYzozNjk3Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSBkbyB6YXBpc3UiCisKKyM6IGZpbGVpby5jOjM5NTkKK21zZ2lkICJFNjY3OiBGc3luYyBmYWlsZWQiCittc2dzdHIgIkU2Njc6IEZzeW5jIG5pZSBwb3dp82SzIHNp6iIKKworIzogZmlsZWlvLmM6Mzk2NgorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTUxMjogWmFta25p6mNpZSBzaeogbmllIHBvd2lvZLNvIgorCisjOiBmaWxlaW8uYzo0MDM3Cittc2dpZCAiRTUxMzogd3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICJFNTEzOiBis7lkIHcgemFwaXNpZSwgcHJ6ZW1pYW5hIHNp6iBuaWUgcG93aW9ks2EiCisKKyM6IGZpbGVpby5jOjQwNDMKK21zZ2lkICJFNTE0OiB3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJFNTE0OiBis7lkIHcgemFwaXNpZSAobW+/ZSBzeXN0ZW0gcGxpa/N3IGplc3QgcHJ6ZXBls25pb255PykiCisKKyM6IGZpbGVpby5jOjQxMTAKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIEKjpUQgVyBQUlpFTUlBTklFIgorCisjOiBmaWxlaW8uYzo0MTI2Cittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIltVcnq5ZHplbmllXSIKKworIzogZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXddIgorbXNnc3RyICJbTm93eV0iCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW2FdIgorCisjOiBmaWxlaW8uYzo0MTUzCittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgZG+zuWN6b25vIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt3XSIKKworIzogZmlsZWlvLmM6NDE1NQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgemFwaXNhbm8iCisKKyM6IGZpbGVpby5jOjQyMDUKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTogUGF0Y2htb2RlOiBuaWUgbW9n6iB6YXBpc2HmIG9yeWdpbmFsbmVnbyBwbGlrdSIKKworIzogZmlsZWlvLmM6NDIyNworbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogcGF0Y2htb2RlOiBuaWUgbW9n6iBzdHdvcnp55iBwdXN0ZWdvIG9yeWdpbmFsbmVnbyBwbGlrdSIKKworIzogZmlsZWlvLmM6NDI0MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogTmllIG1vZ+ogc2thc293YeYgcGxpa3UgemFiZXpwaWVjemVuaWEiCisKKyM6IGZpbGVpby5jOjQzMDYKK21zZ2lkICIiCisiXG4iCisiV0FSTklORzogT3JpZ2luYWwgZmlsZSBtYXkgYmUgbG9zdCBvciBkYW1hZ2VkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJPU1RSWkWvRU5JRTogT3J5Z2luYWxueSBwbGlrIG1vv2Ugem9zdGHmIHV0cmFjb255IGx1YiB1c3prb2R6b255XG4iCisKKyM6IGZpbGVpby5jOjQzMDgKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICJuaWUgd3ljaG9knyBlZHl0b3JhLCBkb3Dza2kgcGxpayBuaWUgem9zdGGzIHBvcHJhd25pZSB6YXBpc2FueSEiCisKKyM6IGZpbGVpby5jOjQzOTcKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjQzOTcKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltmb3JtYXQgZG9zLWFdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0IG1hYy1hXSIKKworIzogZmlsZWlvLmM6NDQxMQorbXNnaWQgIlt1bml4XSIKK21zZ3N0ciAiW3VuaXhdIgorCisjOiBmaWxlaW8uYzo0NDExCittc2dpZCAiW3VuaXggZm9ybWF0XSIKK21zZ3N0ciAiW2Zvcm1hdCB1bml4LWFdIgorCisjOiBmaWxlaW8uYzo0NDM4Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgd2llcnN6LCAiCisKKyM6IGZpbGVpby5jOjQ0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCB3aWVyc3p5LCAiCisKKyM6IGZpbGVpby5jOjQ0NDMKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSB6bmFrIgorCisjOiBmaWxlaW8uYzo0NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgem5ha/N3IgorCisjOiBmaWxlaW8uYzo0NDU1Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW25vZW9sXSIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIltOaWVrb21wbGV0bnkgb3N0YXRuaSB3aWVyc3pdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjQ0NzQKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIk9TVFJaRa9FTklFOiBQbGlrIHptaWVuabMgc2nqIG9kIGN6YXN1IG9zdGF0bmllZ28gb2Rjenl0dSEhISIKKworIzogZmlsZWlvLmM6NDQ3NgorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiQ3p5IG5hcHJhd2TqIGNoY2VzeiBnbyB6YXBpc2HmIgorCisjOiBmaWxlaW8uYzo1NzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBCs7lkIHphcGlzeXdhbmlhIGRvIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTczMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogQrO5ZCB3IHRyYWtjaWUgemFteWthbmlhIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTczNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDogQrO5ZCBvZGN6eXR1IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTk3MAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEF1dG9rb21lbmRhIEZpbGVDaGFuZ2VkU2hlbGwgc2thc293YbNhIGJ1Zm9yIgorCisjOiBmaWxlaW8uYzo1OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IE9TVFJaRa9FTklFOiBQbGlrIFwiJXNcIiBuaWUgamVzdCBks3W/ZWogZG9zdOpwbnkiCisKKyM6IGZpbGVpby5jOjU5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiBPU1RSWkWvRU5JRTogUGxpayBcIiVzXCIgem1pZW5psyBzaeogb2QgY3phc3Ugcm96cG9jeupjaWEgZWR5Y2ppLCBidWZvciAiCisidyBWaW1pZSBy83duaWW/IHpvc3RhsyB6bWllbmlvbnkiCisKKyM6IGZpbGVpby5jOjU5OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMTogT1NUUlpFr0VOSUU6IFBsaWsgXCIlc1wiIHptaWVuabMgc2nqIG9kIGN6YXN1IHJvenBvY3rqY2lhIGVkeWNqaSIKKworIzogZmlsZWlvLmM6NTk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTY6IE9TVFJaRa9FTklFOiBUcnliIHBsaWt1IFwiJXNcIiB6bWllbmmzIHNp6iBvZCBjemFzdSByb3pwb2N66mNpYSBlZHljamkiCisKKyM6IGZpbGVpby5jOjYwMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzEzOiBPU1RSWkWvRU5JRTogUGxpayBcIiVzXCIgem9zdGGzIHN0d29yem9ueSBwbyByb3pwb2N66mNpdSBlZHljamkiCisKKyM6IGZpbGVpby5jOjYwMTkKK21zZ2lkICJTZWUgXCI6aGVscCBXMTFcIiBmb3IgbW9yZSBpbmZvLiIKK21zZ3N0ciAiUGF0cnogXCI6aGVscCBXMTFcIiAgZGxhIGRhbHN6eWNoIGluZm9ybWFjamkuIgorCisjOiBmaWxlaW8uYzo2MDMzCittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAiT1NUUlpFr0VOSUUiCisKKyM6IGZpbGVpby5jOjYwMzQKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIiZPS1xuIgorIiZaYbNhZHVqIFBsaWsiCisKKyM6IGZpbGVpby5jOjYxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MjogQ291bGQgbm90IHByZXBhcmUgZm9yIHJlbG9hZGluZyBcIiVzXCIiCittc2dzdHIgIkU0NjI6IE5pZSBtb79uYSBwcnp5Z290b3dh5iBwcnpls2Fkb3dhbmlhIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NjE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogTmllIG1vv25hIHByemWzYWRvd2HmIFwiJXNcIiIKKworIzogZmlsZWlvLmM6Njc0MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLVNrYXNvd2Fuby0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NjkwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6IE5pZSBtYSB0YWtpZWogZ3J1cHk6IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzAyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogTmllZG9wdXN6Y3phbG55IHpuYWsgcG8gKjogJXMiCisKKyM6IGZpbGVpby5jOjcwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IE5pZSBtYSB0YWtpZWdvIHd5ZGFyemVuaWE6ICVzIgorCisjOiBmaWxlaW8uYzo3MDQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZ3JvdXAgb3IgZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiBOaWUgbWEgdGFraWVqIGdydXB5IGx1YiB3eWRhcnplbmlhOiAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo3MTk4Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBBdXRva29tZW5keSAtLS0iCisKKyM6IGZpbGVpby5jOjc0NjkKK21zZ2lkICJFMjE3OiBDYW4ndCBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgQUxMIGV2ZW50cyIKK21zZ3N0ciAiRTIxNzogTmllIG1vv25hIHd5a29ueXdh5iBhdXRva29tZW5kIGRsYSB3eWRhcnpl8SBBTEwiCisKKyM6IGZpbGVpby5jOjc0OTIKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIkJyYWsgcGFzdWq5Y3ljaCBhdXRva29tZW5kIgorCisjOiBmaWxlaW8uYzo3ODEzCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogemJ5dCBns+pib2tpZSB6YWduaWW/ZL9lbmllIGF1dG9rb21lbmQiCisKKyM6IGZpbGVpby5jOjgwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBBdXRva29tZW5kIGRsYSBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjgwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJXeWtvbnVq6iAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo4MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJhdXRva29tZW5kYSAlcyIKKworIzogZmlsZWlvLmM6ODczMQorbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIkUyMTk6IEJyYWsgey4iCisKKyM6IGZpbGVpby5jOjg3MzMKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiBCcmFrIH0uIgorCisjOiBmb2xkLmM6NjgKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiBOaWUgem5hbGV6aW9ubyB6d2luaepjaWEiCisKKyM6IGZvbGQuYzo1OTMKK21zZ2lkICJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MDogTmllIG1vv25hIHV0d29yennmIHp3aW5p6mNpYSBwcnp5IGJpZb+5Y2VqICdmb2xkbWV0aG9kJyIKKworIzogZm9sZC5jOjU5NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiBOaWUgbW+/bmEgc2thc293YeYgendpbmnqY2lhIHByenkgYmllv7ljZWogJ2ZvbGRtZXRob2QnIgorCisjOiBnZXRjaGFyLmM6MjQ4Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBEb2RhaiBkbyBidWZvcmEgb2Rjenl0dSIKKworIzogZ2V0Y2hhci5jOjIxOTgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJzeXduZSBwcnp5cG9yerlka293YW5pZSIKKworIzogZ2V0Y2hhci5jOjMwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6IGlzdG5pZWplIGp1vyBnbG9iYWxueSBza3LzdCBkbGEgJXMiCisKKyM6IGdldGNoYXIuYzozMDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogaXN0bmllamUganW/IGdsb2JhbG5lIHByenlwb3J6uWRrb3dhbmllIGRsYSAlcyIKKworIzogZ2V0Y2hhci5jOjMyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogaXN0bmllamUganW/IHNrcvN0IGRsYSAlcyIKKworIzogZ2V0Y2hhci5jOjMyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IGlzdG5pZWplIGp1vyBwcnp5cG9yerlka293YW5pZSBkbGEgJXMiCisKKyM6IGdldGNoYXIuYzozMjc5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJOaWUgem5hbGV6aW9ubyBza3LzdHUiCisKKyM6IGdldGNoYXIuYzozMjgxCittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAiTmllIHpuYWxlemlvbm8gcHJ6eXBvcnq5ZGtvd2FuaWEiCisKKyM6IGdldGNoYXIuYzo0MTczCittc2dpZCAiRTIyODogbWFrZW1hcDogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFMjI4OiBtYWtlbWFwOiBOaWVkb3B1c3pjemFsbnkgdHJ5YiIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjxuaWUgbW9n6iBvdHdvcnp55j4gIgorCisjOiBndWlfYXRfZnMuYzoxMTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTY6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAiRTYxNjogdmltX1NlbEZpbGU6IG5pZSBtb2fqIG90cnp5bWHmIGN6Y2lvbmtpICVzIgorCisjOiBndWlfYXRfZnMuYzoyNzgxCittc2dpZCAiRTYxNDogdmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNDogdmltX1NlbEZpbGU6IG5pZSBtb2fqIHBvd3LzY2nmIGRvIGJpZb+5Y2VnbyBrYXRhbG9ndSIKKworIzogZ3VpX2F0X2ZzLmM6MjgwMQorbXNnaWQgIlBhdGhuYW1lOiIKK21zZ3N0ciAiVHJvcDoiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDcKK21zZ2lkICJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE1OiB2aW1fU2VsRmlsZTogbmllIG1vZ+ogb3RyenltYeYgYmllv7ljZWdvIGthdGFsb2d1IgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9tb3RpZi5jOjE2MjMKK21zZ2lkICJPSyIKK21zZ3N0ciAiT0siCisKKyM6IGd1aV9hdF9mcy5jOjI4MTUgZ3VpX2d0ay5jOjI3MzEgZ3VpX21vdGlmLmM6MTYxOCBndWlfbW90aWYuYzoyODQ5Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJaYWtv8WN6IgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVklNIC0gRGlhbG9nIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlNjcm9sbGJhciBXaWRnZXQ6IE5pZSBtb2ezZW0gb3RyenltYeYgcm96bWlhcvN3IHJ5c3Vua3UgbmEgcHJ6eWNpc2t1LiIKKworIzogZ3VpX2JldmFsLmM6MTAxIGd1aV93MzIuYzozODMwCittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IE5pZSBtb2fqIHN0d29yennmIEJhbGxvb25FdmFsIHogcG93aWFkb21pZW5pZW0gaSB3eXdvs2FuaWVtIgorCisjOiBndWkuYzoyMjAKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogTmllIG1vZ+ogb2RwYWxp5iBHVUkiCisKKyM6IGd1aS5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogTmllIG1vZ+ogY3p5dGHmIHogXCIlc1wiIgorCisjOiBndWkuYzo0NzIKK21zZ2lkICJFNjY1OiBDYW5ub3Qgc3RhcnQgR1VJLCBubyB2YWxpZCBmb250IGZvdW5kIgorbXNnc3RyICJFNjY1OiBOaWUgbW+/bmEgdXJ1Y2hvbWnmIEdVSSwgYnJhayBwcmF3aWSzb3dlaiBjemNpb25raSIKKworIzogZ3VpLmM6NDc3Cittc2dpZCAiRTIzMTogJ2d1aWZvbnR3aWRlJyBpbnZhbGlkIgorbXNnc3RyICJFMjMxOiBOaWV3s2GcY2l3ZSAnZ3VpZm9udHdpZGUnIgorCisjOiBndWkuYzo1NDcKK21zZ2lkICJFNTk5OiBWYWx1ZSBvZiAnaW1hY3RpdmF0ZWtleScgaXMgaW52YWxpZCIKK21zZ3N0ciAiRTU5OTogTmllcHJhd2lks293YSB3YXJ0b5zmICdpbWFjdGl2YXRla2V5JyIKKworIzogZ3VpLmM6NDA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IE5pZSBtb2fqIHphcmV6ZXJ3b3dh5iBrb2xvcnUgJXMiCisKKyM6IGd1aV9ndGsuYzoxNjA3Cittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiRGlhbG9nIFZpbWEuLi4iCisKKyM6IGd1aV9ndGsuYzoyMDYwIG1lc3NhZ2UuYzoyOTkzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlRha1xuIgorIiZOaWVcbiIKKyImWmFrb/FjeiIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAiSW5wdXQgX01ldGhvZHMiCisKKyM6IGd1aV9ndGsuYzoyNTM0IGd1aV9tb3RpZi5jOjI3NjgKK21zZ2lkICJWSU0gLSBTZWFyY2ggYW5kIFJlcGxhY2UuLi4iCittc2dzdHIgIlZJTSAtIFN6dWthaiBpIFphbWllbmlhai4uLiIKKworIzogZ3VpX2d0ay5jOjI1NDIgZ3VpX21vdGlmLmM6Mjc3MAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gU3p1a2FqLi4uIgorCisjOiBndWlfZ3RrLmM6MjU3NCBndWlfbW90aWYuYzoyODg4Cittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAiWm5hamSfOiIKKworIzogZ3VpX2d0ay5jOjI1OTIgZ3VpX21vdGlmLmM6MjkyMAorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIlphbWll8SBuYToiCisKKyMuIHdob2xlIHdvcmQgb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjI0IGd1aV9tb3RpZi5jOjMwMzYKK21zZ2lkICJNYXRjaCB3aG9sZSB3b3JkIG9ubHkiCittc2dzdHIgIkRvcGFzdWogdHlsa28gY2GzZSB3eXJhenkiCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYzNSBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAiRG9wYXN1aiB3aWVsa2+c5iBsaXRlciIKKworIzogZ3VpX2d0ay5jOjI2NDUgZ3VpX21vdGlmLmM6Mjk5MAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAiS2llcnVuZWsiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjY1NyBndWlfbW90aWYuYzozMDAyCittc2dpZCAiVXAiCittc2dzdHIgIlcgZ/Ny6iIKKworIzogZ3VpX2d0ay5jOjI2NjEgZ3VpX21vdGlmLmM6MzAxMAorbXNnaWQgIkRvd24iCittc2dzdHIgIlcgZPOzIgorCisjOiBndWlfZ3RrLmM6MjY4MyBndWlfZ3RrLmM6MjY4NSBndWlfbW90aWYuYzoyNzkyCittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICJabmFqZJ8gbmFzdOpwbmUiCisKKyM6IGd1aV9ndGsuYzoyNzAyIGd1aV9ndGsuYzoyNzA0IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICJaYW1pZfEiCisKKyM6IGd1aV9ndGsuYzoyNzE1IGd1aV9ndGsuYzoyNzE3IGd1aV9tb3RpZi5jOjI4MjIKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAiWmFtaWXxIHdzenlzdGtpZSIKKworIzogZ3VpX2d0a194MTEuYzoyMzI3Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiBvdHJ6eW1hbm8gv7lkYW5pZSBcImRpZVwiIG9kIG1hbmFkv2VyYSBzZXNqaVxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkKK21zZ2lkICJWaW06IE1haW4gd2luZG93IHVuZXhwZWN0ZWRseSBkZXN0cm95ZWRcbiIKK21zZ3N0ciAiVmltOiBHs/N3bmUgb2tubyBuaWVvY3pla2l3YW5pZSB6bmlzemN6b25lXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDEzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJXeWLzciBjemNpb25raSIKKworIzogZ3VpX2d0a194MTEuYzo2MDM1IHVpLmM6MjExNworbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIlW/eXdhbSBDVVRfQlVGRkVSMCB6YW1pYXN0IHB1c3RlZ28gd3lib3J1IgorCisjOiBndWlfbW90aWYuYzoxNjE3IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIkZpbHRyIgorCisjOiBndWlfbW90aWYuYzoxNjE5Cittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIkthdGFsb2dpIgorCisjOiBndWlfbW90aWYuYzoxNjIxCittc2dpZCAiSGVscCIKK21zZ3N0ciAiUG9tb2MiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjIKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAiUGxpa2kiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIld5YvNyIgorCisjOiBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiQ29mbmlqIgorCisjOiBndWlfcmlzY29zLmM6OTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTA6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTYxMDogTmllIG1vZ+ogemGzYWRvd2HmIGN6Y2lvbmtpIFphcCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjExOiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTYxMTogTmllIG1vZ+ogdb955iBjemNpb25raSAlcyIKKworIzogZ3VpX3Jpc2Nvcy5jOjMyNzAKK21zZ2lkICIiCisiXG4iCisiU2VuZGluZyBtZXNzYWdlIHRvIHRlcm1pbmF0ZSBjaGlsZCBwcm9jZXNzLlxuIgorbXNnc3RyICIiCisiXG4iCisiV3lzebNhbSB6YXdpYWRvbWllbmllIGtv8WN6uWNlIHByb2NlcyBwb2Nob2RueS5cbiIKKworIzogZ3VpX3czMi5jOjgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogQXJndW1lbnQgbmllIGplc3Qgd3Nwb21hZ2FueTogXCItJXNcIjsgVb95d2FqIHdlcnNqaSBPTEUuIgorCisjOiBndWlfdzQ4LmM6MjA5MAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlpuYWpknyBjablnICh1v3lqICdcXFxcJyBkbyBzenVrYW5pYSAnXFwnKSIKKworIzogZ3VpX3c0OC5jOjIxMTUKK21zZ2lkICJGaW5kICYgUmVwbGFjZSAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJTenVrYW5pZSBpIFphbWlhbmEgKHW/eWogJ1xcXFwnIGRvIHN6dWthbmlhICdcXCcpIgorCisjOiBndWlfeDExLmM6MTUzNworbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODogTmllIG1vZ+ogemFyZXplcndvd2HmIG1hcHkga29sb3LzdywgcGV3bmUga29sb3J5IG1vZ7kgYnnmICIKKyJuaWVwcmF3aWSzb3dlIgorCisjOiBndWlfeDExLmM6MjExOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiRTI1MDogQnJhayBjemNpb25layBkbGEgbmFzdOpwdWq5Y3ljaCB6ZXN0YXfzdyB6bmFr83cgdyB6ZXN0YXdpZSBjemNpb25layAlczoiCisKKyM6IGd1aV94MTEuYzoyMTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IE5hendhIHplc3Rhd3UgY3pjaW9uZWs6ICVzIgorCisjOiBndWlfeDExLmM6MjE2MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJDemNpb25rYSAnJXMnIG5pZSBwb3NpYWRhIHpuYWvzdyBqZWRub2xpdGVqIHN6ZXJva2+cY2kiCisKKyM6IGd1aV94MTEuYzoyMTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogTmF6d2EgemVzdGF3dSBjemNpb25lazogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIkZvbnQwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAiRm9udDE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJzemVyb2tvnOYgZm9udCVkIG5pZSBqZXN0IHBvZHfzam65IHN6ZXJva2+cY2m5IGZvbnQwXG4iCisKKyM6IGd1aV94MTEuYzoyMTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiU3plcm9rb5zmIGZvbnQwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlN6ZXJva2+c5iBmb250MTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBCo6VEIHcgYXV0b21hY2llIEhhbmd1bCIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIkRvZGFqIG5vd7kgYmF66iBkYW55Y2giCisKKyM6IGlmX2NzY29wZS5jOjc5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiWmFweXRhbmUgbyB3em9yemVjIgorCisjOiBpZl9jc2NvcGUuYzo4MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICJQb2thvyB0ZW4ga29tdW5pa2F0IgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJaYWJpaiBwb7O5Y3plbmllIgorCisjOiBpZl9jc2NvcGUuYzo4NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlBvbvN3IHdzemVsa2llIHBvs7ljemVuaWEiCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiUG9rYb8gcG+zuWN6ZW5pYSIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiBaYXN0b3Nvd2FuaWU6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMjQKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIlRhIGtvbWVuZGEgY3Njb3BlIG5pZSB3c3BvbWFnYSBwb2R6aWVsZW5pYSBva25hLlxuIgorCisjOiBpZl9jc2NvcGUuYzoxNzUKK21zZ2lkICJFNTYyOiBVc2FnZTogY3N0YWcgPGlkZW50PiIKK21zZ3N0ciAiRTU2MjogWmFzdG9zb3dhbmllOiBjc3RhZyA8aWRlbnQ+IgorCisjOiBpZl9jc2NvcGUuYzoyMzEKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IG5pZSB6bmFsZXppb25vIHpuYWN6bmlrYSIKKworIzogaWZfY3Njb3BlLmM6NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAiRTU2Mzogc3RhdCglcykgYrO5ZDogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQxOQorbXNnaWQgIkU1NjM6IHN0YXQgZXJyb3IiCittc2dzdHIgIkU1NjM6IGKzuWQgc3RhdCIKKworIzogaWZfY3Njb3BlLmM6NTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgbmllIGplc3Qga2F0YWxvZ2llbSBsdWIgcG9wcmF3brkgYmF6uSBkYW55Y2ggY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo1MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICJEb2Rhbm8gYmF66iBkYW55Y2ggY3Njb3BlICVzIgorCisjOiBpZl9jc2NvcGUuYzo1ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MjogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlbGQiCittc2dzdHIgIkUyNjI6IGKzuWQgb2Rjenl0dSBwb7O5Y3plbmlhIHogY3Njb3BlICVsZCIKKworIzogaWZfY3Njb3BlLmM6Njk0Cittc2dpZCAiRTU2MTogdW5rbm93biBjc2NvcGUgc2VhcmNoIHR5cGUiCittc2dzdHIgIkU1NjE6IG5pZXpuYW55IHR5cCBzenVrYW5pYSBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiBOaWUgbW9ns2VtIHN0d29yennmIHBvdG9rdSBkbyBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjc1MworbXNnaWQgIkU2MjI6IENvdWxkIG5vdCBmb3JrIGZvciBjc2NvcGUiCittc2dzdHIgIkU2MjI6IE5pZSBtb2ezZW0gdXR3b3J6eeYgcm96d2lkbGVuaWEgZGxhIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6ODQ3IGlmX2NzY29wZS5jOjg5NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJ3eWtvbmFuaWUgY3NfY3JlYXRlX2Nvbm5lY3Rpb24gbmllIHBvd2lvZLNvIHNp6iIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiBOaWUgbW9ns2VtIHN0d29yennmIHByb2Nlc3UgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo5MTEKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZGxhIHRvX2ZwIG5pZSBwb3dpb2SzbyBzaeoiCisKKyM6IGlmX2NzY29wZS5jOjkxMworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBkbGEgZnJfZnAgbmllIHBvd2lvZLNvIHNp6iIKKworIzogaWZfY3Njb3BlLmM6OTUxCittc2dpZCAiRTU2Nzogbm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICJFNTY3OiBicmFrIHBvs7ljemVuaWEgeiBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjEwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1OTogbm8gbWF0Y2hlcyBmb3VuZCBmb3IgY3Njb3BlIHF1ZXJ5ICVzIG9mICVzIgorbXNnc3RyICJFMjU5OiBicmFrIGRvcGFzb3dh8SBkbGEgemFweXRhbmlhIGNzY29wZSAlcyBvICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Njk6IGludmFsaWQgY3Njb3BlcXVpY2tmaXggZmxhZyAlYyBmb3IgJWMiCittc2dzdHIgIkU0Njk6IG5pZXByYXdpZLNvd2EgZmxhZ2EgY3Njb3BlcXVpY2tmaXggJWMgZGxhICVjIgorCisjOiBpZl9jc2NvcGUuYzoxMTUyCittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJrb21lbmR5IGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6MTE1NQorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKSIKK21zZ3N0ciAiJS01czogJS0zMHMgKFW/eWNpZTogJXMpIgorCisjOiBpZl9jc2NvcGUuYzoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjU6IGNhbm5vdCBvcGVuIGNzY29wZSBkYXRhYmFzZTogJXMiCittc2dzdHIgIkU2MjU6IG5pZSBtb2fqIG90d29yennmIGJhenkgZGFueWNoIGNzY29wZTogJXMiCisKKyM6IGlmX2NzY29wZS5jOjEyNzEKK21zZ2lkICJFNjI2OiBjYW5ub3QgZ2V0IGNzY29wZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiRTYyNjogbmllIG1vZ+ogdXp5c2th5iBpbmZvcm1hY2ppIHogYmF6eSBkYW55Y2ggY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMjk2Cittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IG5pZSBkb2Rhbm8gZHVwbGlrYXR1IGJhenkgZGFueWNoIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MTMwNworbXNnaWQgIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJFNTY5OiB3eWN6ZXJwYW5vIG1ha3N5bWFsbrkgbGljemLqIHBvs7ljemXxIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MTQyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IG5pZSBtYSBwb7O5Y3plbmlhICVzIHogY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZCIKK21zZ3N0ciAicG+zuWN6ZW5pZSAlcyB6IGNzY29wZSB6b3N0YbNvIHphbWtuaep0ZSIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGKzuWQga3J5dHljem55IHcgY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIlpuYWN6bmlrIGNzY29wZTogJXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NzAKK21zZ2lkICIiCisiXG4iCisiICAgIyAgIGxpbmUiCittc2dzdHIgIiIKKyJcbiIKKyIgICAjICAgd2llcnN6IgorCisjOiBpZl9jc2NvcGUuYzoxODcyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICJuYXp3YSBwbGlrdSAgLyBrb250ZWtzdCAvIHdpZXJzelxuIgorCisjOiBpZl9jc2NvcGUuYzoxOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDk6IENzY29wZSBlcnJvcjogJXMiCittc2dzdHIgIkU2MDk6IEKzuWQgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICJXc3p5c3RraWUgYmF6eSBkYW55Y2ggY3Njb3BlIHByemWzYWRvd2FubyIKKworIzogaWZfY3Njb3BlLmM6MjI0NAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICJicmFrIHBvs7ljemXxIHogY3Njb3BlXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyNDgKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgIG5hendhIGJhenkgZGFueWNoICAgICAgICAgICAgICAgcHJ6ZWRzaW9uZWsgdHJvcHVcbiIKKworIzogaWZfcHl0aG9uLmM6NDM2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjYzOiBQcnp5a3JvIG1pLCB0YSBrb21lbmRhIGplc3Qgd3mzuWN6b25hLCBibyBuaWUgbW+/bmEgemGzYWRvd2HmICIKKyJiaWJsaW90ZWtpIFB5dGhvbmEiCisKKyM6IGlmX3B5dGhvbi5jOjUwMAorbXNnaWQgIkU2NTk6IENhbm5vdCBpbnZva2UgUHl0aG9uIHJlY3Vyc2l2ZWx5IgorbXNnc3RyICJFNjU5OiBOaWUgbW+/bmEgd3l3b7Nh5iBQeXRob25hIHJla3Vyc3l3bmllIgorCisjOiBpZl9weXRob24uYzo3MDEKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIm5pZSBtb2fqIHNrYXNvd2HmIGF0cnlidXTzdyBPdXRwdXRPYmplY3QiCisKKyM6IGlmX3B5dGhvbi5jOjcwOAorbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgInNvZnRzcGFjZSBtdXNpIGJ55iBsaWN6YrkgY2Gza293aXS5IgorCisjOiBpZl9weXRob24uYzo3MTYKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAibmllcG9wcmF3bnkgYXRyeWJ1dCIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSB3eW1hZ2EgbGlzdHkgY2m5Z/N3IgorCisjOiBpZl9weXRob24uYzo4OTUKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBCs7lkIHcgaW5pY2phbGl6YWNqaSBvYmlla3TzdyBJL08iCisKKyM6IGlmX3B5dGhvbi5jOjEwODAgaWZfdGNsLmM6MTQwMgorbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAibmllcG9wcmF3bmUgd3lyYb9lbmllIgorCisjOiBpZl9weXRob24uYzoxMDk0IGlmX3RjbC5jOjE0MDcKK21zZ2lkICJleHByZXNzaW9ucyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgInd5cmG/ZW5pYSB3ebO5Y3pvbmUgcG9kY3phcyBrb21waWxhY2ppIgorCisjOiBpZl9weXRob24uYzoxMTA3Cittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAicHLzYmEgb2RuaWVzaWVuaWEgZG8gc2thc293YW5lZ28gYnVmb3JhIgorCisjOiBpZl9weXRob24uYzoxMTIyIGlmX3B5dGhvbi5jOjExNjMgaWZfcHl0aG9uLmM6MTIyNyBpZl90Y2wuYzoxMjE0Cittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICJudW1lciB3aWVyc3phIHBvemEgemFrcmVzZW0iCisKKyM6IGlmX3B5dGhvbi5jOjEzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8b2JpZWt0IGJ1Zm9yYSAoc2thc293YW55KSB3ICU4bFg+IgorCisjOiBpZl9weXRob24uYzoxNDUzIGlmX3RjbC5jOjgzNgorbXNnaWQgImludmFsaWQgbWFyayBuYW1lIgorbXNnc3RyICJuaWVwb3ByYXduYSBuYXp3YSB6YWuzYWRraSIKKworIzogaWZfcHl0aG9uLmM6MTczMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICJuaWUgbWEgdGFraWVnbyBidWZvcmEiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICJwcvNiYSBvZG5pZXNpZW5pYSBkbyBza2Fzb3dhbmVnbyBva25hIgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICJhdHJ5YnV0IHR5bGtvIGRvIG9kY3p5dHUiCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgInBvenljamEga3Vyc29yYSBwb3phIGJ1Zm9yZW0iCisKKyM6IGlmX3B5dGhvbi5jOjE5NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iaWVrdCBva25hIChza2Fzb3dhbnkpIHcgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjxvYmlla3Qgb2tuYSAobmllem5hbnkpIHcgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI8b2tubyAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjIwNDYKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAibmllIG1hIHRha2llZ28gb2tuYSIKKworIzogaWZfcHl0aG9uLmM6MjMwNyBpZl9weXRob24uYzoyMzQxIGlmX3B5dGhvbi5jOjIzOTYgaWZfcHl0aG9uLmM6MjQ2NAorIzogaWZfcHl0aG9uLmM6MjU4NiBpZl9weXRob24uYzoyNjM4IGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OQorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIm5pZSBtb2fqIHphY2hvd2HmIGluZm9ybWFjamkgY29mYW5pYSIKKworIzogaWZfcHl0aG9uLmM6MjMwOSBpZl9weXRob24uYzoyNDAzIGlmX3B5dGhvbi5jOjI0NzUKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIm5pZSBtb2fqIHNrYXNvd2HmIHdpZXJzemEiCisKKyM6IGlmX3B5dGhvbi5jOjIzNDYgaWZfcHl0aG9uLmM6MjQ5MSBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIm5pZSBtb2fqIHphbWllbmnmIHdpZXJzemEiCisKKyM6IGlmX3B5dGhvbi5jOjI1MDkgaWZfcHl0aG9uLmM6MjU4OCBpZl9weXRob24uYzoyNjQ2Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICJuaWUgbW9n6iB3cHJvd2FkemnmIHdpZXJzemEiCisKKyM6IGlmX3B5dGhvbi5jOjI3NTAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgImNpuWcgbmllIG1vv2UgemF3aWVyYeYgem5ha/N3IG5vd2VnbyB3aWVyc3phIgorCisjOiBpZl9ydWJ5LmM6NDIyCittc2dpZCAiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IFByenlrcm8gbWksIHRhIGtvbWVuZGEgamVzdCB3ebO5Y3pvbmEsIGJvIG5pZSBtb79uYSB6YbNhZG93YeYgIgorImJpYmxpb3Rla2kgUnVieS4iCisKKyM6IGlmX3J1YnkuYzo0ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogTmllem5hbnkgc3RhdHVzIGxvbmdqbXAgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiUHJ6ZbO5Y3ogbWnqZHp5IGltcGxlbWVudGFjarkvb2tyZZxsZW5pZW0iCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlBva2G/IGJheuoga2xhc3kiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJQb2thvyBwcnplcGlzYW65IGZ1bmtjauogY3qzb25rb3e5IgorCisjOiBpZl9zbmlmZi5jOjcwCittc2dpZCAiUmV0cmlldmUgZnJvbSBmaWxlIgorbXNnc3RyICJQb2JpZXJhaiB6IHBsaWt1IgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJQb2JpZXJhaiB6IHByb2pla3R1IgorCisjOiBpZl9zbmlmZi5jOjczCittc2dpZCAiUmV0cmlldmUgZnJvbSBhbGwgcHJvamVjdHMiCittc2dzdHIgIlBvYmllcmFqIHogd3N6eXN0a2ljaCBwcm9qZWt083ciCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiUG9iaWVyeiIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICJQb2thvyCfcvNks28gZGxhIgorCisjOiBpZl9zbmlmZi5jOjc2Cittc2dpZCAiRmluZCBzeW1ib2wiCittc2dzdHIgIlpuYWpknyBzeW1ib2wiCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIlByemVqcnp5aiBrbGFz6iIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICJQb2thvyBrbGFz6iB3IGhpZXJhcmNoaWkiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJQb2thvyBrbGFz6iB3IG9ncmFuaWN6b25laiBoaWVyYXJjaGlpIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgb2Rub3NpIHNp6iBkbyIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgIlhyZWYgbWEgb2RuaWVzaWVuaWEgb2QiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIG1hIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHW/eXRlIHByemV6IgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICJQb2thvyBkb2t1bWVudGFjauogZGxhIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIld5Z2VuZXJ1aiBkb2t1bWVudGFjauogZGxhIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisiTmllIG1vZ+ogcG9ks7ljennmIGRvIFNOaUZGKy4gU3ByYXdknyCccm9kb3dpc2tvIChzbmlmZmVtYWNzIG11c2kgYnnmICIKKyJvZG5hbGV6aW9ueSB3ICRQQVRIKS5cbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IEKzuWQgcG9kY3phcyBjenl0YW5pYS4gUm96s7ljemVuaWUiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBqZXN0IG9iZWNuaWUgIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIm5pZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJwb2SzuWN6b255IgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogTmllem5hbmUgemFweXRhbmllIFNOaUZGKzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IEKzuWQgdyB0cmFrY2llIHBvZLO5Y3phbmlhIGRvIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDA5Cittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IFNOaUZGKyBuaWVwb2SzuWN6b255IgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiBOaWUgamVzdCBidWZvcmVtIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogQrO5ZCB3IHRyYWtjaWUgemFwaXN1LiBSb3qzuWN6b255IgorCisjOiBpZl90Y2wuYzo0MTgKK21zZ2lkICJpbnZhbGlkIGJ1ZmZlciBudW1iZXIiCittc2dzdHIgIm5pZXezYZxjaXd5IG51bWVyIGJ1Zm9yYSIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAib2JlY25pZSBuaWUgemFpbXBsZW1lbnRvd2FubyIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm5pZXpuYW5hIG9wY2phIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAibmllIG1vZ+ogdXN0YXdp5iB3aWVyc3phKHkpIgorCisjOiBpZl90Y2wuYzo4NDUKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgInpha7NhZGthIG5pZSB1c3Rhd2lvbmEiCisKKyM6IGlmX3RjbC5jOjg1MSBpZl90Y2wuYzoxMDY2CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgIndpZXJzeiAlZCBrb2x1bW5hICVkIgorCisjOiBpZl90Y2wuYzo4ODEKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICJuaWUgbW9n6iB3cHJvd2FkemnmL2Rvs7ljennmIHdpZXJzemEiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAibmllem5hbmEgZmxhZ2E6ICIKKworIzogaWZfdGNsLmM6MTMzOAorbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICJuaWV6bmFuZSB2aW1PcHRpb24iCisKKyM6IGlmX3RjbC5jOjE0MjMKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgInByemVyd2FuaWUga2xhd2lhdHVyeSIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAiYrO5ZCB2aW1hIgorCisjOiBpZl90Y2wuYzoxNDcxCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICJuaWUgbW9n6iBzdHdvcnp55iBidWZvcmEvb2tuYSBrb21lbmR5OiBvYmlla3QgamVzdCBrYXNvd2FueSIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAiIgorIm5pZSBtb2fqIHphcmVqZXN0cm93YeYgd3N0ZWN6bmVnbyB3eXdvs2FuaWEga29tZW5keTogYnVmb3Ivb2tubyBqdb8gem9zdGGzYSAiCisic2thc293YW5hIgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MgorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogVENMIEZBVEFMTlkgQqOlRDogcmVmbGlzdCB6ZXBzdXRhIT8gUHJvc3rqIHqzb7955iByYXBvcnQgbyB0eW0gbmEgdmltLSIKKyJkZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJuaWUgbW9n6iB6YXJlamVzdHJvd2HmIHdzdGVjem5lZ28gd3l3b7NhbmlhIGtvbWVuZHk6IGJyYWsgb2RuaWVzaWVuaWEgZG8gIgorImJ1Zm9yYS9va25hIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICJQcnp5a3JvIG1pLCB0YSBrb21lbmRhIGplc3Qgd3mzuWN6b25hLCBibyBuaWUgbW+/bmEgemGzYWRvd2HmIGJpYmxpb3Rla2kgVGNsLiIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MTogQqOlRCBUQ0w6IGtvZCB6YWtv8WN6ZW5pb3d5IG5pZSBqZXN0IGNhs2tvd2l0eSE/IFByb3N66iB6s2+/eeYgcmFwb3J0ICIKKyJvIHR5bSBuYSB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjIwMDcKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIm5pZSBtb2fqIGRvc3Rh5iB3aWVyc3phIgorCisjOiBpZl94Y21kc3J2LmM6MjI1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiTmllIG1vZ+ogemFyZWplc3Ryb3dh5iBuYXp3eSBzZXJ3ZXJhIGtvbWVuZCIKKworIzogaWZfeGNtZHNydi5jOjQ3MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IFd5c7NhbmllIGtvbWVuZHkgZG8gcHJvZ3JhbXUgZG9jZWxvd2VnbyBuaWUgcG93aW9ks28gc2nqIgorCisjOiBpZl94Y21kc3J2LmM6NzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzM6IEludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJFNTczOiBVv3l0byBuaWV3s2GcY2l3ZWdvIGlkIHNlcndlcmE6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTExMAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogd2NpZWxlbmlhIGluc3RhbmNqaSByZWplc3RydSBWaW1hIGplc3Qgn2xlIHNmb3Jtb3dhbmUuICBTa2Fzb3dhbm8hIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiTmllem5hbmEgb3BjamEiCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJaYnl0IHdpZWxlIGFyZ3VtZW5083ciCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkJyYWsgYXJndW1lbnR1IHBvIgorCisjOiBtYWluLmM6NjYKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAijG1pZWNpZSBwbyBvcGNqaSIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIlpieXQgd2llbGUgYXJndW1lbnTzdyBcIitrb21lbmRhXCIsIFwiLWMga29tZW5kYVwiIGx1YiBcIi0tY21kIGtvbWVuZGFcIiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIk5pZXezYZxjaXd5IGFyZ3VtZW50IGRsYSIKKworIzogbWFpbi5jOjQ2NgorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiVGEgd2Vyc2phIFZpbWEgbmllIGJ5s2Egc2tvbXBpbG93YW5lZ28geiBvcGNquSBy879uaWMgKGRpZmYpLiIKKworIzogbWFpbi5jOjkzMgorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIlBy82JhIHBvbm93bmVnbyBvdHdvcnplbmlhIHBsaWt1IHNrcnlwdHU6IFwiIgorCisjOiBtYWluLmM6OTQxCittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJOaWUgbW9n6iBvdHdvcnp55iBkbyBvZGN6eXR1OiBcIiIKKworIzogbWFpbi5jOjk4NQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTmllIG1vZ+ogb3R3b3J6eeYgZGxhIHd5apxjaWEgc2tyeXB0dTogXCIiCisKKyM6IG1haW4uYzoxMTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiJWQgcGxpa/N3IGRvIGVkeWNqaVxuIgorCisjOiBtYWluLmM6MTIzMworbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogT1NUUlpFr0VOSUU6IFd5apxjaWUgbmllIGplc3QgdGVybWluYWxlbVxuIgorCisjOiBtYWluLmM6MTIzNQorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IE9TVFJaRa9FTklFOiBXZWqcY2llIG5pZSBwb2Nob2R6aSB6IHRlcm1pbmFsYVxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJsaW5pYSBwb2xlY2XxIHByZS12aW1yYyIKKworIzogbWFpbi5jOjEzMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6IE5pZSBtb2fqIGN6eXRh5iB6IFwiJXNcIiIKKworIzogbWFpbi5jOjI0MTEKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIkRhbHN6ZSBpbmZvcm1hY2plIHBvcHJ6ZXo6IFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjI0NDQKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW3BsaWsgLi5dICAgICAgIGVkeXR1aiB6YWRhbmUgcGxpa2kiCisKKyM6IG1haW4uYzoyNDQ1Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgY3p5dGFqIHRla3N0IHplIHN0ZGluIgorCisjOiBtYWluLmM6MjQ0NgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHpuYWN6bmlrICAgZWR5dHVqIHBsaWssIHcga3TzcnltIGRhbnkgem5hY3puaWsgamVzdCB6ZGVmaW5pb3dhbnkiCisKKyM6IG1haW4uYzoyNDQ4Cittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbZXJyb3JmaWxlXSAgZWR5dHVqIHBsaWssIHphd2llcmFquWN5IHBpZXJ3c3p5IGKzuWQiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorInW/eWNpZToiCisKKyM6IG1haW4uYzoyNDYwCittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgIiB2aW0gW2FyZ3VtZW50eV0iCisKKyM6IG1haW4uYzoyNDY0Cittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIGx1YjoiCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50eTpcbiIKKworIzogbWFpbi5jOjI0NjgKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdFR5bGtvIG5hend5IHBsaWvzdyBwbyB0eW0iCisKKyM6IG1haW4uYzoyNDcwCittc2dpZCAiLS1saXRlcmFsXHRcdERvbid0IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIi0tbGl0ZXJhbFx0XHROaWUgcm96d2lqYWogem5ha/N3IHNwZWNqYWxueWNoIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdFphcmVqZXN0cnVqIHRlZ28gZ3ZpbWEgdyBPTEUiCisKKyM6IG1haW4uYzoyNDc0Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi11bnJlZ2lzdGVyXHRcdFd5cmVqZXN0cnVqIGd2aW1hIHogT0xFIgorCisjOiBtYWluLmM6MjQ3NworbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0U3RhcnR1aiB3IEdVSSAodGFrIGphayBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyNDc4Cittc2dpZCAiLWYgIG9yICAtLW5vZm9ya1x0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWYgIGx1YiAtLW5vZm9ya1x0UGllcndzenkgcGxhbjogTmllIHd5ZHppZWxhaiBwcnp5IG9kcGFsYW5pdSBHVUkiCisKKyM6IG1haW4uYzoyNDgwCittc2dpZCAiLXZcdFx0XHRWaSBtb2RlIChsaWtlIFwidmlcIikiCittc2dzdHIgIi12XHRcdFx0VHJ5YiB2aSAoamFrIFwidmlcIikiCisKKyM6IG1haW4uYzoyNDgxCittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0VHJ5YiBleCAoamFrIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdENpY2h5IHRyeWIgKHSzYSkgKHR5bGtvIGRsYSBcImV4XCIpIgorCisjOiBtYWluLmM6MjQ4NAorbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHRUcnliIHLzv25pYyAoamFrIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjI0ODYKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdFRyeWIgs2F0d3kgKGphayBcImV2aW1cIiwgYmV6IHRyeWLzdykiCisKKyM6IG1haW4uYzoyNDg3Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHRUcnliIHd5s7ljem5pZSBkbyBvZGN6eXR1IChqYWsgXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjQ4OAorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHRUcnliIG9ncmFuaWN6ZW5pYSAoamFrIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjI0ODkKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdE1vZHlmaWthY2plICh6YXBpc3l3YW5pZSBwbGlr83cpIG5pZWRvendvbG9uZSIKKworIzogbWFpbi5jOjI0OTAKK21zZ2lkICItTVx0XHRcdE1vZGlmaWNhdGlvbnMgaW4gdGV4dCBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLU1cdFx0XHRaYWtheiBtb2R5ZmlrYWNqaSB0ZWtzdHUiCisKKyM6IG1haW4uYzoyNDkxCittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHRUcnliIGJpbmFybnkiCisKKyM6IG1haW4uYzoyNDkzCittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx0VHJ5YiBsaXNwIgorCisjOiBtYWluLmM6MjQ5NQorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0QrlknyB6Z29kbnkgeiBWaTogJ2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ5NgorbXNnaWQgIi1OXHRcdFx0Tm90IGZ1bGx5IFZpIGNvbXBhdGlibGU6ICdub2NvbXBhdGlibGUnIgorbXNnc3RyICItTlx0XHRcdEK5ZJ8gbmllenVwZbNuaWUgemdvZG55IHogVmk6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ5NworbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdFN0b3BpZfEgZ2FkYXRsaXdvnGNpIgorCisjOiBtYWluLmM6MjQ5OAorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx0VHJ5YiBvZHBsdXNrd2lhbmlhIgorCisjOiBtYWluLmM6MjQ5OQorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdFx0WmFtaWFzdCBwbGlrdSB3eW1pYW55LCB1v3l3YWogdHlsa28gcGFtaepjaSIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRXeWxpY3ogcGxpa2kgd3ltaWFueSBpIHpha2/xY3oiCisKKyM6IG1haW4uYzoyNTAxCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICh6IG5hene5IHBsaWt1KVx0T2R0d/NyeiB6YbNhbWFuuSBzZXNq6iIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0VG+/c2FtZSB6IC1yIgorCisjOiBtYWluLmM6MjUwNAorbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHROaWUgc3Rvc3VqIG5ld2NsaSBkbyBvdHdpZXJhbmlhIG9raWVuIgorCisjOiBtYWluLmM6MjUwNQorbXNnaWQgIi1kZXYgPGRldmljZT5cdFx0VXNlIDxkZXZpY2U+IGZvciBJL08iCittc2dzdHIgIi1kZXYgPGRldmljZT5cdFx0Vb95d2FqIDxkZXZpY2U+IGRvIEkvTyIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICItQVx0XHRcdHN0YXJ0IGluIEFyYWJpYyBtb2RlIgorbXNnc3RyICItQVx0XHRcdHJvenBvY3puaWogdyB0cnliaWUgYXJhYnNraW0iCisKKyM6IG1haW4uYzoyNTExCittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHRyb3pwb2N6bmlqIHcgdHJ5YmllIGhlYnJhanNraW0iCisKKyM6IG1haW4uYzoyNTE0Cittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdHJvenBvY3puaWogdyB0cnliaWUgZmFyc2kiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0VXN0YXcgdHlwIHRlcm1pbmFsYSBuYSA8dGVybWluYWw+IgorCisjOiBtYWluLmM6MjUxNworbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRcdFW/eWogPHZpbXJjPiB6YW1pYXN0IGpha2llZ29rb2x3aWVrIC52aW1yYyIKKworIzogbWFpbi5jOjI1MTkKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx0Vb95aiA8Z3ZpbXJjPiB6YW1pYXN0IGpha2llZ29rb2x3aWVrIC5ndmltcmMiCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdE5pZSCzYWR1aiBza3J5cHTzdyB3dHljemVrIgorCisjOiBtYWluLmM6MjUyMgorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdE90d/NyeiBOIG9raWVuIChkb215nGxuaWU6IHBvIGplZG55bSBkbGEga2G/ZGVnbyBwbGlrdSkiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0dGFrIHNhbW8gamFrIC1vIHR5bGtvIGR6aWVsIG9rbm8gcGlvbm93byIKKworIzogbWFpbi5jOjI1MjQKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHRaYWN6bmlqIG5hIGtv8WN1IHBsaWt1IgorCisjOiBtYWluLmM6MjUyNQorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG51bT5cdFx0WmFjem5paiB3IHdpZXJzenUgPGxudW0+IgorCisjOiBtYWluLmM6MjUyNworbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIiIKKyItY21kIDxjb21tYW5kPlx0XHRXeWtvbmFqIGtvbWVuZOogPGNvbW1hbmQ+IHByemVkIHphs2Fkb3dhbmllbSAiCisiamFraWVnb2tvbHdpZWsgcGxpa3UgdmltcmMiCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxjb21tYW5kPlx0XHRXeWtvbmFqIGtvbWVuZOogPGNvbW1hbmQ+IHBvIHphs2Fkb3dhbml1IHBpZXJ3c3plZ28gcGxpa3UiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8c2VzamE+XHRcdFdjenl0YWogcGxpayA8c2VzamE+IHBvIHphs2Fkb3dhbml1IHBpZXJ3c3plZ28gcGxpa3UiCisKKyM6IG1haW4uYzoyNTMxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdGluPlx0V2N6eXR1aiBrb21lbmR5IHRyeWJ1IG5vcm1hbG5lZ28geiBwbGlrdSA8c2NyaXB0aW4+IgorCisjOiBtYWluLmM6MjUzMgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxzY3JpcHRvdXQ+XHREb7O5Y3ogd3N6eXN0a2llIHdwcm93YWR6YW5lIGtvbWVuZHkgZG8gcGxpa3UgPHNjcmlwdG91dD4iCisKKyM6IG1haW4uYzoyNTMzCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx0WmFwaXN1aiB3c3p5c3RraWUgd3Byb3dhZHphbmUga29tZW5keSBkbyBwbGlrdSA8c2NyaXB0b3V0PiIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdEVkeXR1aiB6YWtvZG93YW5lIHBsaWtpIgorCisjOiBtYWluLmM6MjUzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdFBvZLO5Y3ogdmltYSB0byBkYW5lZ28gWC1zZXJ3ZXJhIgorCisjOiBtYWluLmM6MjU0MQorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0TmllILO5Y3ogeiBzZXJ3ZXJlbSBYIgorCisjOiBtYWluLmM6MjU0NAorbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgaWYgcG9zc2libGUiCittc2dzdHIgIi0tcmVtb3RlIDxwbGlraT5cdEVkeXR1aiBwbGlraSB3IHNlcndlcnplIFZpbWEgamWcbGkgbW+/bGl3ZSIKKworIzogbWFpbi5jOjI1NDUKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxlbnQgPHBsaWtpPiBUbyBzYW1vLCBuaWUgbmFyemVrYWogamWcbGkgbmllIG1hIHNlcndlcmEiCisKKyM6IG1haW4uYzoyNTQ2Cittc2dpZCAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8cGxpa2k+XHRUYWsgamFrIC0tcmVtb3RlLCBsZWN6IGN6ZWthaiBuYSBwbGlraSBwcnplZCBlZHljarkiCisKKyM6IG1haW4uYzoyNTQ3Cittc2dpZCAiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS13YWl0LXNpbGVudCA8cGxpa2k+ICBUbyBzYW1vLCBuaWUgbmFyemVrYWogamWcbGkgbmllIG1hIHNlcndlcmEiCisKKyM6IG1haW4uYzoyNTQ4Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUtc2VuZCA8a2xhd2lzemU+XHRXeZxsaWogPGtsYXdpc3plPiBkbyBzZXJ3ZXJhIFZpbWEgaSB6YWtv8WN6IgorCisjOiBtYWluLmM6MjU0OQorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPHd5cj5cdFd5a29uYWogPHd5cmG/ZW5pZT4gdyBzZXJ3ZXJ6ZSBpIHd5cGlzeiB3eW5payIKKworIzogbWFpbi5jOjI1NTAKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdFd5bWll8SBuYXp3eSBkb3N06nBueWNoIHNlcndlcvN3IFZpbWEgaSB6YWtv8WN6IgorCisjOiBtYWluLmM6MjU1MQorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxuYXp3YT5cdFx0T2RzebNhaiBkby9zdGHxIHNp6iBzZXJ3ZXJlbSBWaW0gPG5hendhPiIKKworIzogbWFpbi5jOjI1NTQKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0Vb95d2FqIDx2aW1pbmZvPiB6YW1pYXN0IC52aW1pbmZvIgorCisjOiBtYWluLmM6MjU1NgorbXNnaWQgIi1oICBvciAgLS1oZWxwXHRQcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaCAgbHViICAtLWhlbHBcdHd5nHdpZXRsIFBvbW9jIChjenlsaSB06iB3aWFkb21vnOYpIGkgemFrb/FjeiIKKworIzogbWFpbi5jOjI1NTcKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdHd5nHdpZXRsIGluZm9ybWFjauogbyB3ZXJzamkgaSB6YWtv8WN6IgorCisjOiBtYWluLmM6MjU2MQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50eSByb3pwb3puYXdhbmUgcHJ6ZXogZ3ZpbSAod2Vyc2phIE1vdGlmKTpcbiIKKworIzogbWFpbi5jOjI1NjUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnR5IHJvenBvem5hd2FuZSBwcnpleiBndmltICh3ZXJzamEgbmVYdGF3KTpcbiIKKworIzogbWFpbi5jOjI1NjcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnR5IHJvenBvem5hd2FuZSBwcnpleiBndmltICh3ZXJzamEgQXRoZW5hKTpcbiIKKworIzogbWFpbi5jOjI1NzEKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdFphs2FkdWogdmltIG5hIDxkaXNwbGF5PiIKKworIzogbWFpbi5jOjI1NzIKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0WmFjem5paiBWaW0gamFrbyBpa29u6iIKKworIzogbWFpbi5jOjI1NzQKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmF6d2E+XHRcdFW/eXdhaiB6YXNvYvN3IHRhayBqYWsgYnkgVmltIGJ5syA8bmF6d2E+IgorCisjOiBtYWluLmM6MjU3NQorbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKE5pZXphaW1wbGVtZW50b3dhbmUpXG4iCisKKyM6IG1haW4uYzoyNTc3Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8a29sb3I+XHRVv3l3YWogPGtvbG9yPiBkbGEgdLNhIChy83duaWW/OiAtYmcpIgorCisjOiBtYWluLmM6MjU3OAorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGtvbG9yPlx0Vb95d2FqIDxrb2xvcj4gZGxhIG5vcm1hbG5lZ28gdGVrc3R1IChy83duaWW/OiAtZmcpIgorCisjOiBtYWluLmM6MjU3OSBtYWluLmM6MjU5OQorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnQ+XHRcdFW/eXdhaiA8Zm9udD4gZGxhIG5vcm1hbG5lZ28gdGVrc3R1IChy83duaWW/OiAtZm4pIgorCisjOiBtYWluLmM6MjU4MAorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxmb250Plx0Vb95d2FqIDxmb250PiBkbGEgd3l0s3VzemN6b25lZ28gdGVrc3R1IgorCisjOiBtYWluLmM6MjU4MQorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxmb250Plx0Vb95d2FqIDxmb250PiBkbGEgcG9jaHmzZWdvIgorCisjOiBtYWluLmM6MjU4MiBtYWluLmM6MjYwMAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tPlx0Vb95d2FqIDxnZW9tPiBkbGEgcG9jerl0a293eWNoIHJvem1pYXLzdyAocvN3bmllvzogLWdlb20pIgorCisjOiBtYWluLmM6MjU4MworbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDxzemVyPlx0Vb95aiByYW1raSBvIGdydWJvnGNpIDxzemVyPiAocvN3bmllvzogLWJ3KSIKKworIzogbWFpbi5jOjI1ODQKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIi1zY3JvbGxiYXJ3aWR0aCA8c3plcj4gIFW/eXdhaiBwcnpld2lqYWN6YSBvIHN6ZXJva2+cY2kgPHN6ZXI+IChy83duaWW/OiAtc3cpIgorCisjOiBtYWluLmM6MjU4NgorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRTdG9zdWogYmVsa+ogbWVudSBvIHd5c29rb5xjaSA8aGVpZ2h0PiAocvN3bmllvzogLW1oKSIKKworIzogbWFpbi5jOjI1ODggbWFpbi5jOjI2MDEKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0U3Rvc3VqIG5lZ2F0eXcga29sb3LzdyAocvN3bmllvzogLXJ2KSIKKworIzogbWFpbi5jOjI1ODkKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0TmllIHN0b3N1aiBuZWdhdHl3dSBrb2xvcvN3IChy83duaWW/OiArcnYpIgorCisjOiBtYWluLmM6MjU5MAorbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHJlc291cmNlPlx0VXN0YXcgb2tyZZxsb255IHphc/NiIgorCisjOiBtYWluLmM6MjU5MworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnR5IHJvenBvem5hd2FuZSBwcnpleiBndmltICh3ZXJzamEgUklTQyBPUyk6XG4iCisKKyM6IG1haW4uYzoyNTk0Cittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPG51bWJlcj5cdFBvY3q5dGtvd2Egc3plcm9rb5zmIG9rbmEgdyBrb2x1bW5hY2giCisKKyM6IG1haW4uYzoyNTk1Cittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1iZXI+XHRQb2N6uXRrb3dhIHd5c29rb5zmIG9rbmEgdyB3aWVyc3phY2giCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcm96cG96bmF3YW5lIHByemV6IGd2aW0gKHdlcnNqYSBHVEsrKTpcbiIKKworIzogbWFpbi5jOjI2MDIKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdFphc3RhcnR1aiB2aW0gbmEgPGRpc3BsYXk+IChy83duaWW/OiAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjYwNAorbXNnaWQgIi0tcm9sZSA8cm9sZT5cdFNldCBhIHVuaXF1ZSByb2xlIHRvIGlkZW50aWZ5IHRoZSBtYWluIHdpbmRvdyIKK21zZ3N0ciAiLS1yb2xlIDxyb2xlPlx0VXN0YXcgdW5pa2F0b3e5IHJvbOogZG8gaWRlbnR5ZmlrYWNqaSBns/N3bmVnbyBva25hIgorCisjOiBtYWluLmM6MjYwNgorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdE90d/NyeiBWaW0gd2V3brl0cnogaW5uZWdvIHdpZGdldHUgR1RLIgorCisjOiBtYWluLmM6MjYwOQorbXNnaWQgIi1QIDxwYXJlbnQgdGl0bGU+XHRPcGVuIFZpbSBpbnNpZGUgcGFyZW50IGFwcGxpY2F0aW9uIgorbXNnc3RyICItUCA8dHl0dbMgcm9kemljYT5cdE90d/NyeiBWaW1hIHdld265dHJ6IHJvZHppY2llbHNraWVqIGFwbGlrYWNqaSIKKworIzogbWFpbi5jOjI4NDcKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICJCcmFrIGRpc3BsYXkiCisKKyMuIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyM6IG1haW4uYzoyODYyCittc2dpZCAiOiBTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiOiBXeXOzYW5pZSBuaWUgcG93aW9ks28gc2nqLlxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI4NjgKK21zZ2lkICI6IFNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIjogV3lzs2FuaWUgbmllIHBvd2lvZLNvIHNp6i4gUHLzYnVq6iB3eWtvbmHmIG5hIG1pZWpzY3VcbiIKKworIzogbWFpbi5jOjI5MDYgbWFpbi5jOjI5MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICJvdHdvcnpvbm8gJWQgeiAlZCIKKworIzogbWFpbi5jOjI5NDkKK21zZ2lkICJObyBkaXNwbGF5OiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICJCcmFrIHRlcm1pbmFsYTogV3lzs2FuaWUgd3lyYb9lbmlhIG5pZSBwb3dpb2SzbyBzaeouXG4iCisKKyM6IG1haW4uYzoyOTYxCittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6IFd5c7NhbmllIHd5cmG/ZW5pYSBuaWUgcG93aW9ks28gc2nqLlxuIgorCisjOiBtYXJrLmM6NzA5Cittc2dpZCAiTm8gbWFya3Mgc2V0IgorbXNnc3RyICJCcmFrIHpha7NhZGVrIgorCisjOiBtYXJrLmM6NzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4Mzogr2FkbmEgemFrs2Fka2EgbmllIHBhc3VqZSBkbyBcIiVzXCIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcyMgorbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJ6YWuzLiB3aWVyc3oga29sIHBsaWsvdGVrc3QiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjc2MAorbXNnaWQgIiIKKyJcbiIKKyIganVtcCBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiIHNrb2sgd2llcnN6IGtvbCBwbGlrL3Rla3N0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo4MDUKK21zZ2lkICIiCisiXG4iCisiY2hhbmdlIGxpbmUgIGNvbCB0ZXh0IgorbXNnc3RyICIiCisiXG4iCisiem1pZfEgd3Jzei4ga29sIHRla3N0IgorCisjOiBtYXJrLmM6MTI4MQorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFpha7NhZGtpIHcgcGxpa2FjaDpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMzE2Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIExpc3RhIG9kbmllc2ll8SAocG9jerl3c3p5IG9kIG5ham5vd3N6eWNoKTpcbiIKKworIzogbWFyay5jOjE0MTIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmlhIHpha7NhZGVrIHcgcGxpa2FjaCAob2QgbmFqbm93c3p5Y2ggcG8gbmFqc3RhcnN6ZSk6XG4iCisKKyM6IG1hcmsuYzoxNTAxCittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIkJyYWsgJz4nIgorCisjOiBtYnl0ZS5jOjQ2NworbXNnaWQgIkU1NDM6IE5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJFNTQzOiBUbyBuaWUgamVzdCB3Yb9uYSBzdHJvbmEga29kb3dhIgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogTmllIG1vZ+ogbmFzdGF3aeYgd2FydG+cY2kgSUMiCisKKyM6IG1ieXRlLmM6NDU4MworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogTmllIG1vZ7NlbSBzdHdvcnp55iBrb250ZWtzdHUgd3Byb3dhZHpl8SIKKworIzogbWJ5dGUuYzo0NzQxCittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiBOaWUgbW9ns2VtIG90d29yennmIHNwb3NvYnUgd3Byb3dhZHpl8SIKKworIzogbWJ5dGUuYzo0NzUyCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBPU1RSWkWvRU5JRTogTmllIG1vZ7NlbSB6bGlrd2lkb3dh5iB3eXdvs2FuaWEgZGxhIElNIgorCisjOiBtYnl0ZS5jOjQ3NTgKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogbWV0b2RhIHdwcm93YWR6ZfEgbmllIHdzcG9tYWdhIL9hZG5lZ28gc3R5bHUiCisKKyM6IG1ieXRlLmM6NDgxNQorbXNnaWQgIkUyODk6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgbXkgcHJlZWRpdCB0eXBlIgorbXNnc3RyICJFMjg5OiBtZXRvZGEgd3Byb3dhZHpl8SBuaWUgd3Nwb21hZ2EgbW9qZWdvIHR5cHUgcHJlZWRpdCIKKworIzogbWJ5dGUuYzo0ODg5Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBzdHlsIG5hZHB1bmt0b3d5IHd5bWFnYSArZm9udHNldCIKKworIzogbWJ5dGUuYzo0OTI1Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBUd/NqIEdUSysgamVzdCBzdGFyc3p5IG5pvyAxLjIuMy4gUG9sZSBzdGF0dXN1IHd5s7ljem9ubyIKKworIzogbWJ5dGUuYzo1MjMyCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogU2Vyd2VyIG1ldG9kIHdwcm93YWR6ZfEgbmllIGplc3QgdXJ1Y2hvbWlvbnkiCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogYmxvayBuaWUgYnmzIHphYmxva293YW55IgorCisjOiBtZW1maWxlLmM6MTAwNQorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IEKzuWQgdyB0cmFrY2llIGN6eXRhbmlhIHBsaWt1IHd5bWlhbnkiCisKKyM6IG1lbWZpbGUuYzoxMDEwCittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IEKzuWQgb2Rjenl0dSBwbGlrdSB3eW1pYW55IgorCisjOiBtZW1maWxlLmM6MTA2MgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBCs7lkIHN6dWthbmlhIHcgcGxpa3Ugd3ltaWFueSIKKworIzogbWVtZmlsZS5jOjEwODAKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IEKzuWQgemFwaXN1IHcgcGxpa3Ugd3ltaWFueSIKKworIzogbWVtZmlsZS5jOjEyNzcKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IFBsaWsgd3ltaWFueSBqdb8gaXN0bmllamUgKGF0YWsgc3ltbGluaz8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogTmllIG90cnp5bWGzZW0gYmxva3UgbnIgMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiBOaWUgb3RyenltYbNlbSBibG9rdSBuciAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IE5pZSBvdHJ6eW1hs2VtIGJsb2t1IG5yIDI/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiBPamVqLCB6Z3ViabNlbSBwbGlrIHd5bWlhbnkhISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogTmllIG1vZ7NlbSB6bWllbmnmIG5hend5IHBsaWt1IHd5bWlhbnkiCisKKyM6IG1lbWxpbmUuYzo1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwMzogVW5hYmxlIHRvIG9wZW4gc3dhcCBmaWxlIGZvciBcIiVzXCIsIHJlY292ZXJ5IGltcG9zc2libGUiCittc2dzdHIgIkUzMDM6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IHd5bWlhbnkgZGxhIFwiJXNcIjsgb2R0d29yemVuaWUgbmllbW+/bGl3ZSIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogTmllIG90cnp5bWGzZW0gYmxva3UgMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IE5pZSB6bmFsZXppb25vIHBsaWt1IHd5bWlhbnkgZGxhICVzIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiV3Byb3dhZJ8gbnVtZXIgcGxpa3Ugd3ltaWFueSwga3TzcmVnbyB1v3nmICgwIGJ5IHd5apzmKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiBOaWUgbW9n6iBvdHdvcnp55iAlcyIKKworIzogbWVtbGluZS5jOjgzNAorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIk5pZSBtb2fqIG9kY3p5dGHmIGJsb2t1IDAgeiAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiTW+/ZSBuaWUgd3lrb25hbm8gem1pYW4gYWxibyBWaW0gbmllIHpha3R1YWxpem93YbMgcGxpa3Ugd3ltaWFueS4iCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiBuaWUgbW+/ZSBieeYgc3Rvc293YW55IHogdLkgd2Vyc2q5IFZpbWEuXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJVv3lqIFZpbWEgdyB3ZXJzamkgMy4wLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIG5pZSB3eWdsuWRhIG5hIHBsaWsgd3ltaWFueSBWaW1hIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBuaWUgbW+/ZSBieeYgc3Rvc293YW55IG5hIHR5bSBrb21wdXRlcnplLlxuIgorCisjOiBtZW1saW5lLmM6ODcwCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICJUZW4gcGxpayB6b3N0YbMgc3R3b3J6b255IG5hICIKKworIzogbWVtbGluZS5jOjg3NAorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisibHViIHBsaWsgem9zdGGzIHVzemtvZHpvbnkuIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlW/eXdhbSBwbGlrdSB3eW1pYW55IFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiT3J5Z2luYWxueSBwbGlrIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkyMgorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiBPU1RSWkWvRU5JRTogT3J5Z2luYWxueSBwbGlrIG3zZ7MgYnnmIHptaWVuaW9ueSIKKworIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IE5pZSBtb2fqIG9kY3p5dGHmIGJsb2t1IDEgeiAlcyIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/QlJBS1VKRSBXSUVMVSBXSUVSU1pZIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/TElDWk5JSyBXSUVSU1pZIE5JRVpHT0ROWSIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/UFVTVFkgQkxPSyIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CUkFLVUpFIFdJRVJTWlkiCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBOaWV3s2GcY2l3ZSBJRCBibG9rdSAxIChtb79lICVzIG5pZSBqZXN0IHBsaWtpZW0gLnN3cD8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P0JSQUsgQkxPS1UiCisKKyM6IG1lbWxpbmUuYzoxMDgxCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IG9kIHRlZ28gbWllanNjYSBwbyA/Pz9LT05JRUMgd2llcnN6ZSBtb2e5IGJ55iBwb21pZXN6YW5lIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IG9kIHRlZ28gbWllanNjYSBwbyA/Pz9LT05JRUMgd2llcnN6ZSBtb2e5IGJ55iB3s2+/b25lL3NrYXNvd2FuZSIKKworIzogbWVtbGluZS5jOjExMTcKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/P0tPTklFQyIKKworIzogbWVtbGluZS5jOjExNDMKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogUHJ6ZXJ3YW5pZSBvZHR3YXJ6YW5pYSIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIkUzMTI6IFd5a3J5dG8gYrPqZHkgcG9kY3phcyBvZHR3YXJ6YW5pYTsgb2Qga3TzcnljaCB3aWVyc3p5IHphY3q55iA/Pz8iCisKKyM6IG1lbWxpbmUuYzoxMTUwCittc2dpZCAiU2VlIFwiOmhlbHAgRTMxMlwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiUGF0cnogXCI6aGVscCBFMzEyXCIgZGxhIGRhbHN6eWNoIGluZm9ybWFjamkuIgorCisjOiBtZW1saW5lLmM6MTE1NQorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAiT2R0d2FyemFuaWUgemFrb/Fjem9uby4gUG93aW5pZW5lnCBzcHJhd2R6aeYgY3p5IHdzenlzdGtvIGplc3QgdyBwb3J6uWRrdS4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKE1vv2VzeiBjaGNpZeYgemFwaXNh5iB0ZW4gcGxpayBwb2QgaW5uuSBuYXp3uVxuIgorCisjOiBtZW1saW5lLmM6MTE1NworbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICJpIHd5a29uYeYgZGlmZiB6IG9yeWdpbmFsbnltIHBsaWtpZW0gYWJ5IHNwcmF3ZHpp5iB6bWlhbnkpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU4Cittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyJTa2FzdWogcG90ZW0gcGxpayAuc3dwLlxuIgorIlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMTQKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAiWm5hbGV6aW9uZSBwbGlraSB3eW1pYW55OiIKKworIzogbWVtbGluZS5jOjEzOTIKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgVyBiaWW/uWN5bSBrYXRhbG9ndTpcbiIKKworIzogbWVtbGluZS5jOjEzOTQKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgVb95d2FtIHBvZGFuZWogbmF6d3k6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk4Cittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgVyBrYXRhbG9ndSAiCisKKyM6IG1lbWxpbmUuYzoxNDE2Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgIC0tIL9hZGVuIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDg4Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgIHBvc2lhZGFueSBwcnplejogIgorCisjOiBtZW1saW5lLmM6MTQ5MAorbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgIGRhdGE6ICIKKworIzogbWVtbGluZS5jOjE0OTQgbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICBkYXRhOiAiCisKKyM6IG1lbWxpbmUuYzoxNTEwCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW3BvIFZpbWllIHdlcnNqYSAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUxNAorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW25pZSB3eWdsuWRhIG5hIHBsaWsgd3ltaWFueSBWaW1hXSIKKworIzogbWVtbGluZS5jOjE1MTgKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgIG5hendhIHBsaWt1OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgem1pZW5pb25vOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAiWUVTIgorbXNnc3RyICJUQUsiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAibm8iCittc2dzdHIgIm5pZSIKKworIzogbWVtbGluZS5jOjE1MjkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIHW/eXRrb3duaWs6ICIKKworIzogbWVtbGluZS5jOjE1MzYKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgbmF6d2EgaG9zdGE6ICIKKworIzogbWVtbGluZS5jOjE1MzgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICBuYXp3YSBob3N0YTogIgorCisjOiBtZW1saW5lLmM6MTU0NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgIHByb2Nlc3MgSUQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgSUQgcHJvY2VzdTogIgorCisjOiBtZW1saW5lLmM6MTU1MAorbXNnaWQgIiAoc3RpbGwgcnVubmluZykiCittc2dzdHIgIiAoZGFsZWogZHppYbNhKSIKKworIzogbWVtbGluZS5jOjE1NjIKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuaWUgbmFkYWplIHNp6iBkbGEgdGVqIHdlcnNqaSBWaW1hXSIKKworIzogbWVtbGluZS5jOjE1NjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgIFtuaWUgZG8gdb95dGt1IG5hIHR5bSBrb21wdXRlcnplXSIKKworIzogbWVtbGluZS5jOjE1NzAKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgIFtuaWVvZGN6eXR5d2FsbnldIgorCisjOiBtZW1saW5lLmM6MTU3NAorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgICAgW25pZW90d2llcmFsbnldIgorCisjOiBtZW1saW5lLmM6MTc2NAorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBOaWUgbW9n6iB6YWJlenBpZWN6eeYsIGJvIGJyYWsgcGxpa3Ugd3ltaWFueSIKKworIzogbWVtbGluZS5jOjE4MTcKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAiUGxpayB6YWJlenBpZWN6b25vIgorCisjOiBtZW1saW5lLmM6MTgxOQorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogTmlldWRhbmUgemFiZXpwaWVjemVuaWUiCisKKyM6IG1lbWxpbmUuYzoxODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogbmlld7NhnGNpd3kgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IG5pZSB6bmFsZXppb25vIHdpZXJzemEgJWxkIgorCisjOiBtZW1saW5lLmM6MjMwNgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzogbmllcG9wcmF3bmUgaWQgd3NrYZ9uaWthIGJsb2t1IDMiCisKKyM6IG1lbWxpbmUuYzoyMzg2Cittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICJzdGFja19pZHggcG93aW5pZW4gYnnmIDAiCisKKyM6IG1lbWxpbmUuYzoyNDQ4Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBaYWt0dWFsaXpvd2FubyB6Ynl0IHdpZWxlIGJsb2vzdz8iCisKKyM6IG1lbWxpbmUuYzoyNjMwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiBuaWVwb3ByYXduZSBpZCB3c2thn25pa2EgYmxva3UgNCIKKworIzogbWVtbGluZS5jOjI2NTcKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJibG9rIG5yIDEgc2thc293YW55PyIKKworIzogbWVtbGluZS5jOjI4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IE5pZSBtb2fqIHpuYWxln+Ygd2llcnN6YSAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTAwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogbmllcG9wcmF3bmUgaWQgYmxva3Ugb2RuaWVzaWVuaWEiCisKKyM6IG1lbWxpbmUuYzozMTE2Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IHd5bm9zaSB6ZXJvIgorCisjOiBtZW1saW5lLmM6MzE0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IG51bWVyIHdpZXJzemEgcG96YSB6YWtyZXNlbTogJWxkIGplc3QgcG96YSBrb/FjZW0iCisKKyM6IG1lbWxpbmUuYzozMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiBsaWN6YmEgd2llcnN6eSBuaWVwb3ByYXduYSB3IGJsb2t1ICVsZCIKKworIzogbWVtbGluZS5jOjMxOTgKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAiV2llbGtvnOYgc3Rvc3Ugd3pyYXN0YSIKKworIzogbWVtbGluZS5jOjMyNDQKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IG5pZXBvcHJhd25lIGlkIGJsb2t1IG9kbmllc2llbmlhIDIiCisKKyM6IG1lbWxpbmUuYzozNjc0Cittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiBVV0FHQSIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyJabmFsYXqzZW0gcGxpayB3eW1pYW55IG8gbmF6d2llIFwiIgorCisjOiBtZW1saW5lLmM6MzY3OQorbXNnaWQgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKK21zZ3N0ciAiUG9kY3phcyBvdHdpZXJhbmlhIHBsaWt1IFwiIgorCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiAgICAgIE5FV0VSIHRoYW4gc3dhcCBmaWxlIVxuIgorbXNnc3RyICIgICAgICBOT1dTWkUgb2QgcGxpa3Ugd3ltaWFueSFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY5MgorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSBQZXduaWUgaW5ueSBwcm9ncmFtIG9icmFiaWEgdGVuIHNhbSBwbGlrLlxuIgorIiAgICBKZZxsaSB0YWssIGK5ZJ8gb3N0cm+/bnksIGFieSBuaWUgc2tv8WN6eeYgeiBkd29tYVxuIgorIiAgICBy879ueW1pIHdlcnNqYW1pIGplZG5lZ28gdGVnbyBzYW1lZ28gcGxpa3UgcG8gem1pYW5hY2guXG4iCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIFpha2/xY3ogbHViIG9zdHJvv25pZSBrb250eW51dWouXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpIFNlc2phIGVkeWNqaSBkbGEgcGxpa3UgemGzYW1hs2Egc2nqLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NQorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiICAgIEplnGxpIHRhaywgdG8gdb95aiBcIjpyZWNvdmVyXCIgbHViIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTcKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBhYnkgb2R6eXNrYeYgem1pYW55IChwYXRyeiBcIjpoZWxwIHJlY292ZXJ5KVwiKS5cbiIKKworIzogbWVtbGluZS5jOjM2OTgKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgSmWcbGkganW/IHRvIHpyb2Jps2WcLCB1c3XxIHBsaWsgd3ltaWFueSBcIiIKKworIzogbWVtbGluZS5jOjM3MDAKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgYWJ5IHVuaWtuueYgdGVqIHdpYWRvbW+cY2kuXG4iCisKKyM6IG1lbWxpbmUuYzozNzE0IG1lbWxpbmUuYzozNzE4Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICJQbGlrIHd5bWlhbnkgXCIiCisKKyM6IG1lbWxpbmUuYzozNzE1IG1lbWxpbmUuYzozNzIxCittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiBqdb8gaXN0bmllamUhIgorCisjOiBtZW1saW5lLmM6MzcyNAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gVVdBR0EiCisKKyM6IG1lbWxpbmUuYzozNzI2Cittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiUGxpayB3eW1pYW55IGp1vyBpc3RuaWVqZSEiCisKKyM6IG1lbWxpbmUuYzozNzMwCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnQiCittc2dzdHIgIiIKKyImT3R383J6IFJlYWQtT25seVxuIgorIiZFZHl0dWogcG9taW1vXG4iCisiTyZkdHfzcnpcbiIKKyImWmFrb/FjelxuIgorIiZQb3J6deYiCisKKyM6IG1lbWxpbmUuYzozNzMyCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnRcbiIKKyImRGVsZXRlIGl0IgorbXNnc3RyICIiCisiJk90d/NyeiBSZWFkLU9ubHlcbiIKKyImRWR5dHVqIHBvbWltb1xuIgorIk8mZHR383J6XG4iCisiJlpha2/xY3pcbiIKKyImUG9yenXmXG4iCisiJlNrYXN1aiBnbyIKKworIzogbWVtbGluZS5jOjM3ODkKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiBabmFsZXppb25vIHpieXQgd2llbGUgcGxpa/N3IHd5bWlhbnkiCisKKyM6IG1lbnUuYzo2NAorbXNnaWQgIkUzMjc6IFBhcnQgb2YgbWVudS1pdGVtIHBhdGggaXMgbm90IHN1Yi1tZW51IgorbXNnc3RyICJFMzI3OiBDeuqc5iB0cm9wdSBwdW5rdHUgbWVudSBuaWUgb2tyZZxsYSBwb2RtZW51IgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogTWVudSBpc3RuaWVqZSB0eWxrbyB3IGlubnltIHRyeWJpZSIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IE5pZSBtYSBtZW51IG8gdGVqIG5hendpZSIKKworIzogbWVudS5jOjUyNQorbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IFRyb3AgbWVudSBuaWUgbW+/ZSBwcm93YWR6aeYgZG8gcG9kbWVudSIKKworIzogbWVudS5jOjU2NAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBOaWUgd29sbm8gZG9kYXdh5iBwdW5rdPN3IG1lbnUgd3Byb3N0IGRvIHBhc2thIG1lbnUiCisKKyM6IG1lbnUuYzo1NzAKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6IFNlcGFyYXRvciBuaWUgbW+/ZSBieeYgY3rqnGNpuSB0cm9wdSBtZW51IgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDk3Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTWVudSAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICJPZGVyd2lqIHRvIG1lbnUiCisKKyM6IG1lbnUuYzoyMDg0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogVHJvcCBtZW51IG11c2kgcHJvd2FkemnmIGRvIHB1bmt0dSBtZW51IgorCisjOiBtZW51LmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IE5pZSB6bmFsZXppb25vIG1lbnU6ICVzIgorCisjOiBtZW51LmM6MjE3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiBNZW51IG5pZSBqZXN0IHpkZWZpbmlvd2FuZSBkbGEgdHJ5YnUgJXMiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBUcm9wIG1lbnUgbXVzaSBwcm93YWR6aeYgZG8gcG9kbWVudSIKKworIzogbWVudS5jOjIyMzIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6IE5pZSB6bmFsZXppb25vIG1lbnUgLSBzcHJhd2SfIG5hend5IG1lbnUiCisKKyM6IG1lc3NhZ2UuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIld5a3J5dG8gYrO5ZCBwb2RjemFzIHByemV0d2FyemFuaWEgJXM6IgorCisjOiBtZXNzYWdlLmM6NDQwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgIndpZXJzeiAlNGxkOiIKKworIzogbWVzc2FnZS5jOjY0NworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJbY2m5ZyB6Ynl0IGSzdWdpXSIKKworIzogbWVzc2FnZS5jOjc5NworbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICIiCisiT3BpZWt1biBrb211bmlrYXTzdzogTWFyY2luIERhbGVja2kgPGRhbGVja2lAY3MubmV0LnBsPiwgTWlrb7NhaiBNYWNob3dza2kgIgorIjxtaWttYWNoQHdwLnBsPiIKKworIzogbWVzc2FnZS5jOjEwMjUKK21zZ2lkICJJbnRlcnJ1cHQ6ICIKK21zZ3N0ciAiUHJ6ZXJ3YW5pZTogIgorCisjOiBtZXNzYWdlLmM6MTAyOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiTmFjaZxuaWogRU5URVIgYWJ5IGtvbnR5bnVvd2HmIgorCisjOiBtZXNzYWdlLmM6MTAzMAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIk5hY2mcbmlqIEVOVEVSIGx1YiB3cHJvd2FknyBrb21lbmTqIGFieSBrb250eW51b3dh5iIKKworIzogbWVzc2FnZS5jOjIzNTEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBXaepjZWogLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IHdpZXJzeiwgU1BBQ0UvYjogc3Ryb27qLCBkL3U6IHDzsyBzdHJvbnksIHE6IHpha2/xY3opIgorCisjOiBtZXNzYWdlLmM6MjM1NQorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IHdpZXJzeiwgU1BBQ0U6IHN0cm9u6iwgZDogcPOzIHN0cm9ueSwgcTogemFrb/FjemVuaWUpIgorCisjOiBtZXNzYWdlLmM6Mjk3NiBtZXNzYWdlLmM6Mjk5MQorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJQeXRhbmllIgorCisjOiBtZXNzYWdlLmM6Mjk3OAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlRha1xuIgorIiZOaWUiCisKKyM6IG1lc3NhZ2UuYzozMDExCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlRha1xuIgorIiZOaWVcbiIKKyJaYXBpc3ogJndzenlzdGtpZVxuIgorIiZPZHJ6deYgd3N6eXN0a2llXG4iCisiJlpha2/xY3oiCisKKyM6IG1lc3NhZ2UuYzozMDUyCittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGlhbG9nIHphcGlzeXdhbmlhIHBsaWt1IgorCisjOiBtZXNzYWdlLmM6MzA1NAorbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIkRpYWxvZyBvdHdpZXJhbmlhIHBsaWt1IgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjMxMjUKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogUHJ6eWtybyBtaSwgbmllIG1hIHByemVnbLlkYXJraSBwbGlr83cgdyB0cnliaWUga29uc29saSIKKworIzogbWlzYzEuYzoyNzU0Cittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDogT1NUUlpFr0VOSUU6IFptaWFueSB3IHBsaWt1IHR5bGtvIGRvIG9kY3p5dHUiCisKKyM6IG1pc2MxLmM6MzAwMgorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICIxIHdpZXJzeiB3aepjZWoiCisKKyM6IG1pc2MxLmM6MzAwNAorbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICIxIHdpZXJzeiBtbmllaiIKKworIzogbWlzYzEuYzozMDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICJkb2Rhbm8gJWxkIHdpZXJzenkiCisKKyM6IG1pc2MxLmM6MzAxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgInVzdW5p6nRvICVsZCB3aWVyc3p5IgorCisjOiBtaXNjMS5jOjMwMTQKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiIChQcnplcndhbmUpIgorCisjOiBtaXNjMS5jOjc1NjMKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiB6YWNob3d1auogcGxpay4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NzU3MworbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogWmFrb/Fjem9uby5cbiIKKworIzogbWlzYzIuYzo2OTUgbWlzYzIuYzo3MTEKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICJCo6VEOiAiCisKKyM6IG1pc2MyLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW2JhanTzd10gdG90YWxuZSBhbG9rYWNqZS16d29sbmllbmlhICVsdS0lbHUsIHcgdb95dGt1ICVsdSwgbWFrc3ltYWxuZSAiCisidb95Y2llICVsdVxuIgorCisjOiBtaXNjMi5jOjcxNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbd3l3b7NhbmlhXSB3c3p5c3RraWNoIHJlL21hbGxvYygpLfN3ICVsdSwgd3N6eXN0a2ljaCBmcmVlKCkt83cgJWx1XG4iCisiXG4iCisKKyM6IG1pc2MyLmM6NzcyCittc2dpZCAiRTM0MDogTGluZSBpcyBiZWNvbWluZyB0b28gbG9uZyIKK21zZ3N0ciAiRTM0MDogV2llcnN6IHN0YWplIHNp6iB6Ynl0IGSzdWdpIgorCisjOiBtaXNjMi5jOjgxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogV2V3bup0cnpueSBis7lkOiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogQnJhayBwYW1p6mNpISAgKHJlemVyd2FjamEgJWx1IGJhanTzdykiCisKKyM6IG1pc2MyLmM6MjU5MworIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAiV3l3b7N1auogcG93s29r6iBkbyB3eWtvbmFuaWE6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyODE1Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTogQnJhayBkd3Vrcm9wa2EiCisKKyM6IG1pc2MyLmM6MjgxNyBtaXNjMi5jOjI4NDQKK21zZ2lkICJFNTQ2OiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkU1NDY6IE5pZWRvendvbG9ueSB0cnliIgorCisjOiBtaXNjMi5jOjI4ODMKK21zZ2lkICJFNTQ3OiBJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkU1NDc6IE5pZWRvendvbG9ueSBvYnJ5cyBteXN6a2kiCisKKyM6IG1pc2MyLmM6MjkyMworbXNnaWQgIkU1NDg6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTQ4OiBvY3pla2l3YW5vIGN5ZnJ5IgorCisjOiBtaXNjMi5jOjI5MjgKK21zZ2lkICJFNTQ5OiBJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIkU0NTk6IE5pZWRvendvbG9ueSBwcm9jZW50IgorCisjOiBtaXNjMi5jOjMyMzgKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICJXcHJvd2FknyBrbHVjeiBkbyBvZGtvZG93YW5pYTogIgorCisjOiBtaXNjMi5jOjMyMzkKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICJXcHJvd2FknyBwb25vd25pZSB0ZW4gc2FtIGtsdWN6OiAiCisKKyM6IG1pc2MyLmM6MzI0OQorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICJLbHVjemUgbmllIHBhc3VquSBkbyBzaWViaWUhIgorCisjOiBtaXNjMi5jOjM3OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBOaWV3s2GcY2l3eSB0cm9wOiAnKipbbnVtZXJdJyBtdXNpIGJ55iBuYSBrb/FjdSB0cm9wdSBsdWIgcG8gbmltIG11c2kgIgorImJ55iAnJXMnLiIKKworIzogbWlzYzIuYzo1MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IE5pZSBtb2fqIHpuYWxln+Yga2F0YWxvZ3UgXCIlc1wiIHcgY2RwYXRoIgorCisjOiBtaXNjMi5jOjUwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiBOaWUgbW9n6iB6bmFsZZ/mIHBsaWt1IFwiJXNcIiB3IHRyb3BpZSIKKworIzogbWlzYzIuYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IEthdGFsb2d1IFwiJXNcIiBuaWUgbWEgd2nqY2VqIHcgY2RwYXRoIgorCisjOiBtaXNjMi5jOjUwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiBQbGlrdSBcIiVzXCIgbmllIG1hIHdp6mNlaiB3IHRyb3BpZSIKKworIzogbWlzYzIuYzo1MzIzCittc2dpZCAiRTU1MDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU1MDogQnJhayBkd3Vrcm9wa2EiCisKKyM6IG1pc2MyLmM6NTMzNQorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiBOaWVkb3p3b2xvbmEgY3rqnOYiCisKKyM6IG1pc2MyLmM6NTM0MworbXNnaWQgIkU1NTI6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTUyOiBvY3pla2l3YW5vIGN5ZnJ5IgorCisjLiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjOiBuZXRiZWFucy5jOjM5NgorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zICMyIgorbXNnc3RyICJOaWUgbW+/bmEgcG+zuWN6eeYgeiBOZXRiZWFucyAjMiIKKworIzogbmV0YmVhbnMuYzo0MDQKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIKK21zZ3N0ciAiTmllIG1vv25hIHBvs7ljennmIHogTmV0YmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6NDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2Njg6IFdyb25nIGFjY2VzcyBtb2RlIGZvciBOZXRCZWFucyBjb25uZWN0aW9uIGluZm8gZmlsZTogXCIlc1wiIgorbXNnc3RyICJFNjY4OiBCs+pkbnkgdHJ5YiBkb3N06nB1IHBsaWt1IGluZm8gcG+zuWN6ZW5pYSBOZXRCZWFuczogXCIlc1wiIgorCisjOiBuZXRiZWFucy5jOjc0OQorbXNnaWQgInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiCittc2dzdHIgIm9kY3p5dCB6IGduaWF6ZGEgTmV0YmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6MTYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjU4OiBOZXRCZWFucyBjb25uZWN0aW9uIGxvc3QgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU2NTg6IEJ1Zm9yICVsZCB1dHJhY2mzIHBvs7ljemVuaWUgeiBOZXRCZWFucyIKKworIzogbm9ybWFsLmM6Mjk4MAorbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgIk9TVFJaRa9FTklFOiB0ZXJtaW5hbCBuaWUgd3lrb251amUgcG9knHdpZXRsYW5pYSIKKworIzogbm9ybWFsLmM6MzI3NgorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IEJyYWsgY2m5Z3UgcG9kIGt1cnNvcmVtIgorCisjOiBub3JtYWwuYzozMjc4Cittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IEJyYWsgaWRlbnR5ZmlrYXRvcmEgcG9kIGt1cnNvcmVtIgorCisjOiBub3JtYWwuYzo0NTE5Cittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IE5pZSBtb2fqIHNrYXNvd2HmIHp3aW5p6mNpYSB6IGJpZb+5Y7kgJ2ZvbGRtZXRob2QnIgorCisjOiBub3JtYWwuYzo2NzQwCittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MjogTmEgcG9jerl0a3UgbGlzdHkgem1pYW4iCisKKyM6IG5vcm1hbC5jOjY3NDIKK21zZ2lkICJFNjYzOiBBdCBlbmQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2MzogTmEga2/xY3UgbGlzdHkgem1pYW4iCisKKyM6IG5vcm1hbC5jOjgwMDMKK21zZ2lkICJUeXBlICA6cXVpdDxFbnRlcj4gIHRvIGV4aXQgVmltIgorbXNnc3RyICJ3cHJvd2FknyAgOnF1aXQ8RW50ZXI+ICAgIHpha2/xY3plbmllIHByb2dyYW11IgorCisjOiBvcHMuYzoyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICIxIHdpZXJzeiAlc2VkIDEgcmF6IgorCisjOiBvcHMuYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIjEgd2llcnN6ICVzZWQgJWQgcmF6eSIKKworIzogb3BzLmM6MzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkIHdpZXJzenkgJXNlZCAxIHJheiIKKworIzogb3BzLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQgd2llcnN6eSAlc2VkICVkIHJhenkiCisKKyM6IG9wcy5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiJWxkIHdpZXJzenkgZG8gd2Np6mNpYS4uLiAiCisKKyM6IG9wcy5jOjcxMgorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIjEgd2llcnN6IHdjaep0eSAiCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICIlbGQgd2llcnN6eSB3Y2nqdHljaCAiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNjc1Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIm5pZSBtb2fqIHNrb3Bpb3dh5iwgbWltbyB0byBrYXN1auoiCisKKyM6IG9wcy5jOjIyNjEKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAiMSB3aWVyc3ogem1pZW5pb25vIgorCisjOiBvcHMuYzoyMjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIlbGQgd2llcnN6eSB6bWllbmlvbm8iCisKKyM6IG9wcy5jOjI2NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgInp3YWxuaWFtICVsZCB3aWVyc3p5IgorCisjOiBvcHMuYzoyOTI4Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAiMSB3aWVyc3ogcHJ6ZWtvcGlvd2FubyIKKworIzogb3BzLmM6MjkzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICIlbGQgd2llcnN6eSBwcnpla29waW93YW55Y2giCisKKyM6IG9wcy5jOjMyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogUHVzdHkgcmVqZXN0ciAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNzY2Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFJlamVzdHJ5IC0tLSIKKworIzogb3BzLmM6NTA3MworbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAiTmllZG96d29sb25hIG5hendhIHJlamVzdHJ1IgorCisjOiBvcHMuYzo1MTYxCittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBSZWplc3RyeTpcbiIKKworIzogb3BzLmM6NTIxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc0OiBVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIkU1NzQ6IE5pZXpuYW55IHR5cCByZWplc3RydSAlZCIKKworIzogb3BzLmM6NTY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6IE5pZXezYZxjaXdhIG5hendhIHJlamVzdHJ1OiAnJXMnIgorCisjOiBvcHMuYzo2MDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCBLb2x1bW47ICIKKworIzogb3BzLmM6NjA2MworIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIld5YnJhbm8gJXMlbGQgeiAlbGQgV2llcnN6eTsgJWxkIHogJWxkIFOz83c7ICVsZCB6ICVsZCBCYWp083ciCisKKyM6IG9wcy5jOjYwNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICJLb2wgJXMgeiAlczsgV2llcnN6ICVsZCB6ICVsZDsgU7Nvd28gJWxkIHogJWxkOyBCYWp0ICVsZCB6ICVsZCIKKworIzogb3BzLmM6NjA5MAorIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgZGxhIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE2NDMKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPVN0cm9uYSAlTiIKKworIzogb3B0aW9uLmM6MjA5MgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAiRHpp6mtpIHphIGxvdCBWaW1lbSIKKworIzogb3B0aW9uLmM6MzQxOSBvcHRpb24uYzozNTM1Cittc2dpZCAiRTUxODogVW5rbm93biBvcHRpb24iCittc2dzdHIgIkU1MTg6IE5pZXpuYW5hIG9wY2phIgorCisjOiBvcHRpb24uYzozNDMyCittc2dpZCAiRTUxOTogT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkU1MTk6IE9wY2phIG5pZSBqZXN0IHdzcG9tYWdhbmEiCisKKyM6IG9wdGlvbi5jOjM0NTcKK21zZ2lkICJFNTIwOiBOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJFNTIwOiBOaWVkb3p3b2xvbmUgdyBtb2RlbGluZSIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRPc3RhdG5pZSB1c3Rhd2llbmllIHByemV6ICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiBQbyA9IHd5bWFnYW55IGplc3QgbnVtZXIiCisKKyM6IG9wdGlvbi5jOjM5ODkgb3B0aW9uLmM6NDYxOQorbXNnaWQgIkU1MjI6IE5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTIyOiBOaWUgem5hbGV6aW9ubyB3IHRlcm1jYXAiCisKKyM6IG9wdGlvbi5jOjQwNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOTogSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiRTUzOTogTmllZG96d29sb255IHpuYWsgPCVzPiIKKworIzogb3B0aW9uLmM6NDYxMQorbXNnaWQgIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUyOTogTmllIG1vZ+ogdXN0YXdp5iAndGVybScgbmEgcHVzdHkgY2m5ZyIKKworIzogb3B0aW9uLmM6NDYxNAorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IE5pZSBtb2fqIHptaWVuaeYgdGVybSB3IEdVSSIKKworIzogb3B0aW9uLmM6NDYxNgorbXNnaWQgIkU1MzE6IFVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFNTMxOiBVv3lqIFwiOmd1aVwiIGRvIG9kcGFsZW5pYSBHVUkiCisKKyM6IG9wdGlvbi5jOjQ2NDUKK21zZ2lkICJFNTg5OiAnYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICJFNTg5OiAnYmFja3VwZXh0JyBpICdwYXRjaG1vZGUnIHO5IHRvv3NhbWUiCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzogTmllIG1vZ+ogem1pZW5p5iB3IEdUSysyIEdVSSIKKworIzogb3B0aW9uLmM6NTAxNgorbXNnaWQgIkU1MjQ6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1MjQ6IEJyYWsgZHd1a3JvcGthIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiBDablnIG8gemVyb3dlaiBks3Vnb5xjaSIKKworIzogb3B0aW9uLmM6NTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiBCcmFrIG51bWVydSBwbyA8JXM+IgorCisjOiBvcHRpb24uYzo1MTAwCittc2dpZCAiRTUyNzogTWlzc2luZyBjb21tYSIKK21zZ3N0ciAiRTUyNzogQnJhayBwcnplY2lua2EiCisKKyM6IG9wdGlvbi5jOjUxMDcKK21zZ2lkICJFNTI4OiBNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJFNTI4OiBNdXNpIG9rcmWcbGHmIHdhcnRvnOYgJyIKKworIzogb3B0aW9uLmM6NTE0OAorbXNnaWQgIkU1OTU6IGNvbnRhaW5zIHVucHJpbnRhYmxlIG9yIHdpZGUgY2hhcmFjdGVyIgorbXNnc3RyICJFNTk1OiB6YXdpZXJhIG5pZXd5nHdpZXRsYWxueSBsdWIgc3plcm9raSB6bmFrIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBOaWVkb3p3b2xvbmEgY3pjaW9ua2Eva2kiCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5NzogbmllIG1vZ+ogd3licmHmIHplc3Rhd3UgY3pjaW9uZWsiCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IE5pZWRvendvbG9ueSB6ZXN0YXcgY3pjaW9uZWsiCisKKyM6IG9wdGlvbi5jOjUyMTQKK21zZ2lkICJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJFNTMzOiBuaWUgbW9n6iB3eWJyYeYgc3plcm9raWVqIGN6Y2lvbmtpIgorCisjOiBvcHRpb24uYzo1MjE2Cittc2dpZCAiRTUzNDogSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzQ6IE5pZWRvendvbG9uYSBzemVyb2thIGN6Y2lvbmthIgorCisjOiBvcHRpb24uYzo1NDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MzU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIkU1MzU6IE5pZWRvendvbG9ueSB6bmFrIHBvIDwlYz4iCisKKyM6IG9wdGlvbi5jOjU1OTcKK21zZ2lkICJFNTM2OiBjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAiRTUzNjogd3ltYWdhbnkgcHJ6ZWNpbmVrIgorCisjOiBvcHRpb24uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXNpIGJ55iBwdXN0eSBsdWIgemF3aWVyYeYgJXMiCisKKyM6IG9wdGlvbi5jOjU2NzkKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiBCcmFrIHdzcG9tYWdhbmlhIG15c3praSIKKworIzogb3B0aW9uLmM6NTk0NworbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IE5pZWRvbWtuaep0eSBjablnIHd5cmG/ZfEiCisKKyM6IG9wdGlvbi5jOjU5NTEKK21zZ2lkICJFNTQxOiB0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAiRTU0MTogemJ5dCB3aWVsZSBlbGVtZW5083ciCisKKyM6IG9wdGlvbi5jOjU5NTMKK21zZ2lkICJFNTQyOiB1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAiRTU0MjogbmllemJhbGFuc293YW5lIGdydXB5IgorCisjOiBvcHRpb24uYzo2MTkzCittc2dpZCAiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTU5MDogb2tubyBwb2RnbLlkdSBqdb8gaXN0bmllamUiCisKKyM6IG9wdGlvbi5jOjY0NTAKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICJXMTc6IEFyYWJza2kgd3ltYWdhIFVURi04LCB6cvNiICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKKworIzogb3B0aW9uLmM6Njc4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNTkzOiBOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICJFNTkzOiBQb3RyemVidWrqIHByenluYWptbmllaiAlZCB3aWVyc3p5IgorCisjOiBvcHRpb24uYzo2NzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDogUG90cnplYnVq6iBwcnp5bmFqbW5pZWogJWQga29sdW1uIgorCisjOiBvcHRpb24uYzo3MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogTmllem5hbmEgb3BjamE6ICVzIgorCisjOiBvcHRpb24uYzo3MjIwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS29keSB0ZXJtaW5hbGEgLS0tIgorCisjOiBvcHRpb24uYzo3MjIyCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gR2xvYmFsbmUgd2FydG+cY2kgb3BjamkgLS0tIgorCisjOiBvcHRpb24uYzo3MjI0Cittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBMb2thbG5lIHdhcnRvnGNpIG9wY2ppIC0tLSIKKworIzogb3B0aW9uLmM6NzIyNgorbXNnaWQgIiIKKyJcbiIKKyItLS0gT3B0aW9ucyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gT3BjamUgLS0tIgorCisjOiBvcHRpb24uYzo3OTMyCittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IEKjpUQgZ2V0X3ZhcnAiCisKKyM6IG9wdGlvbi5jOjg5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogQnJhayBwYXN1arljZWdvIHpuYWt1IGRsYSAlcyIKKworIzogb3B0aW9uLmM6ODkzNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiBEb2RhdGtvd2Ugem5ha2kgcG8gnHJlZG5pa3U6ICVzIgorCisjOiBvc19hbWlnYS5jOjI4MAorbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAibmllIG1vZ+ogb3R3b3J6eeYgIgorCisjOiBvc19hbWlnYS5jOjMxNAorbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogTmllIG1vZ+ogb3R3b3J6eeYgb2tuYSFcbiIKKworIzogb3NfYW1pZ2EuYzozMzgKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJQb3RyemVidWrqIEFtaWdhZG9zIHcgd2Vyc2ppIDIuMDQgbHViIHDzn25pZWpzerlcbiIKKworIzogb3NfYW1pZ2EuYzozNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJQb3RyemVidWrqICVzIHcgd2Vyc2ppICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQxNgorbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTmllIG1vZ+ogb3R3b3J6eeYgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQyNworbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICJOaWUgbW9n6iBzdHdvcnp55iAiCisKKyM6IG9zX2FtaWdhLmM6OTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIGtv8WN6eSBwcmFj6iB6ICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTM3Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAibmllIG1vZ+ogem1pZW5p5iB0cnlidSBrb25zb2xpID8hXG4iCisKKyM6IG9zX2FtaWdhLmM6MTAwMworbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF9zaGVsbHNpemU6IG5pZSBqZXN0IGtvbnNvbLk/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTUyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IE5pZSBtb2fqIHd5a29uYeYgcG93s29raSB6IG9wY2q5IC1mIgorCisjOiBvc19hbWlnYS5jOjExOTMgb3NfYW1pZ2EuYzoxMjgzCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJOaWUgbW9n6iB3eWtvbmHmICIKKworIzogb3NfYW1pZ2EuYzoxMTk2IG9zX2FtaWdhLmM6MTI5MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAicG93s29rYSAiCisKKyM6IG9zX2FtaWdhLmM6MTIxNiBvc19hbWlnYS5jOjEzMTgKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIHp3cvNjabNcbiIKKworIzogb3NfYW1pZ2EuYzoxNDU5Cittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIkFOQ0hPUl9CVUZfU0laRSB6Ynl0IG5pc2tpZS4iCisKKyM6IG9zX2FtaWdhLmM6MTQ2MworbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAiQqOlRCBJL08iCisKKyM6IG9zX21zd2luLmM6NTM5Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLihvYmNp6nR5KSIKKworIzogb3NfbXN3aW4uYzo2NDEKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIG5pZSB3eW5vc2kgODAsIG5pZSBtb2fqIHd5a29uYeYgemV3bup0cnpueWNoIGtvbWVuZCIKKworIzogb3NfbXN3aW4uYzoxOTczCittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBXeWLzciBkcnVrYXJraSBuaWUgcG93afNksyBzaeoiCisKKyM6IG9zX21zd2luLmM6MjAxMworIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAiZG8gJXMgeiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTM6IFVua25vd24gcHJpbnRlciBmb250OiAlcyIKK21zZ3N0ciAiRTYxMzogTmllem5hbmEgY3pjaW9ua2EgZHJ1a2Fya2k6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwNzcgb3NfbXN3aW4uYzoyMDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogQrO5ZCBkcnVrYXJraTogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4OAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIk5pZXpuYW5lIgorCisjOiBvc19tc3dpbi5jOjIxMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAiV3lkcnVrb3dhbm8gJyVzJyIKKworIzogb3NfbXN3aW4uYzozMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBOaWVkb3p3b2xvbmEgbmF6d2EgemVzdGF3dSB6bmFr83cgXCIlc1wiIHcgbmF6d2llIGN6Y2lvbmtpIFwiJXNcIiIKKworIzogb3NfbXN3aW4uYzozMjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6IE5pZWRvendvbG9ueSB6bmFrICclYycgdyBuYXp3aWUgY3pjaW9ua2kgXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjU5Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogTmlld7NhnGNpd2Egb3BjamEgJ29zZmlsZXR5cGUnIC0gdb95d2FtIFRleHQiCisKKyM6IG9zX3VuaXguYzo5MjcKK21zZ2lkICJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIKK21zZ3N0ciAiVmltOiBQb2R382pueSBzeWduYbMsIHd5Y2hvZHrqXG4iCisKKyM6IG9zX3VuaXguYzo5MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IFphs2FwYbMgnG1pZXJ0ZWxueSBzeWduYbMgJXNcbiIKKworIzogb3NfdW5peC5jOjkzNgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiBaYbNhcGGzIJxtaWVydGVsbnkgc3lnbmGzXG4iCisKKyM6IG9zX3VuaXguYzoxMTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICJPdHdpZXJhbmllIGVrcmFudSBYIHRyd2GzbyAlbGQgbXNlYyIKKworIzogb3NfdW5peC5jOjEyMjYKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBEb3N0YbMgYrO5ZCBYXG4iCisKKyM6IG9zX3VuaXguYzoxMzM0Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiVGVzdCBla3JhbnUgWCBuaWUgcG93afNksyBzaeoiCisKKyM6IG9zX3VuaXguYzoxNDczCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAiUHLzYmEgb3R3YXJjaWEgZWtyYW51IFggdHJ3YbNhIHpieXQgZLN1Z28iCisKKyM6IG9zX3VuaXguYzozMjI3IG9zX3VuaXguYzozOTA3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIk5pZSBtb2fqIHd5a29uYeYgcG93s29raSAiCisKKyM6IG9zX3VuaXguYzozMjc1Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyJOaWUgbW9n6iB3eWtvbmHmIHBvd7Nva2kgc2hcbiIKKworIzogb3NfdW5peC5jOjMyNzkgb3NfdW5peC5jOjM5MTMKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisicG93s29rYSB6d3LzY2mzYSAiCisKKyM6IG9zX3VuaXguYzozNDE0Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5pZSBtb2fqIHN0d29yennmIHBvdG9r83dcbiIKKworIzogb3NfdW5peC5jOjM0MjkKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5pZSBtb2fqIHJvemR6aWVsaeYgc2nqXG4iCisKKyM6IG9zX3VuaXguYzozOTIwCittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiS29tZW5kYSB6YWtv8WN6b25hXG4iCisKKyM6IG9zX3VuaXguYzo0MTg0IG9zX3VuaXguYzo0MzA5IG9zX3VuaXguYzo1OTc1Cittc2dpZCAiWFNNUCBsb3N0IElDRSBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QIHN0cmFjabMgcG+zuWN6ZW5pZSBJQ0UiCisKKyM6IG9zX3VuaXguYzo1NTU4Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiT3R3YXJjaWUgZWtyYW51IFggbmllIHBvd2lvZLNvIHNp6iIKKworIzogb3NfdW5peC5jOjU4ODAKK21zZ2lkICJYU01QIGhhbmRsaW5nIHNhdmUteW91cnNlbGYgcmVxdWVzdCIKK21zZ3N0ciAiWFNNUCBvYnOzdWd1amUgv7lkYW5pZSBzYW1vemFwaXN1IgorCisjOiBvc191bml4LmM6NTk5OQorbXNnaWQgIlhTTVAgb3BlbmluZyBjb25uZWN0aW9uIgorbXNnc3RyICJYU01QIG90d2llcmEgcG+zuWN6ZW5pZSIKKworIzogb3NfdW5peC5jOjYwMTgKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiT2JzZXJ3YWNqYSBwb7O5Y3plbmlhIFhTTVAgSUNFIG5pZSBwb3dpb2SzYSBzaeoiCisKKyM6IG9zX3VuaXguYzo2MDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb24gZmFpbGVkOiAlcyIKK21zZ3N0ciAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBuaWUgcG93aW9ks28gc2nqOiAlcyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiVyB3aWVyc3p1IgorCisjOiBvc193MzJleGUuYzo2NQorbXNnaWQgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iCittc2dzdHIgIk5pZSBtb2fqIHphcmV6ZXJ3b3dh5iBwYW1p6mNpIGRsYSBsaW5paSBwb2xlY2XxLiIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJCs7lkIFZJTSIKKworIzogb3NfdzMyZXhlLmM6ODkKK21zZ2lkICJDb3VsZCBub3QgbG9hZCB2aW0zMi5kbGwhIgorbXNnc3RyICJOaWUgbW9n6iB6YbNhZG93YeYgdmltMzIuZGxsISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICJOaWUgemRvs2GzZW0gcG9wcmF3aeYgd3NrYZ9uaWvzdyBmdW5rY2ppIHcgRExMISIKKworIzogb3Nfd2luMTYuYzozNDIgb3Nfd2luMzIuYzozMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJwb3ezb2thIHp3cvNjabNhICVkIgorCisjOiBvc193aW4zMi5jOjI2NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiBaYbNhcGGzIHd5ZGFyemVuaWUgJXNcbiIKKworIzogb3Nfd2luMzIuYzoyNjU3Cittc2dpZCAiY2xvc2UiCittc2dzdHIgInphbWtuaWoiCisKKyM6IG9zX3dpbjMyLmM6MjY1OQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAid3lsb2d1aiIKKworIzogb3Nfd2luMzIuYzoyNjYwCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgInpha2/xY3oiCisKKyM6IG9zX3dpbjMyLmM6MzE1MAorbXNnaWQgIkUzNzE6IENvbW1hbmQgbm90IGZvdW5kIgorbXNnc3RyICJFMzcxOiBOaWUgem5hbGV6aW9ubyBrb21lbmR5IgorCisjOiBvc193aW4zMi5jOjMxNjMKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyJWSU1SVU4uRVhFIG5pZSB6bmFsZXppb25vIHcgdHdvaW0gJFBBVEguXG4iCisiWmV3bup0cnpuZSBrb21lbmR5IG5pZSBi6mS5IHdzdHJ6eW1hbmUgcG8gd3lrb25hbml1LlxuIgorIlBhdHJ6ICA6aGVscCB3aW0zMi12aW1ydW4gIGFieSBvdHJ6eW1h5iB3aepjZWogaW5mb3JtYWNqaS4iCisKKyM6IG9zX3dpbjMyLmM6MzE2NgorbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWaW0gT3N0cnplv2VuaWUiCisKKyM6IHF1aWNrZml4LmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogWmJ5dCB3aWVsZSAlJSVjIHcgY2m5Z3UgZm9ybWF0dWq5Y3ltIgorCisjOiBxdWlja2ZpeC5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MzogTmllb2N6ZWtpd2FuZSAlJSVjIHcgY2m5Z3UgZm9ybWF0dWq5Y3ltIgorCisjOiBxdWlja2ZpeC5jOjMyNQorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiBCcmFrIF0gdyBjablndSBmb3JtYXR1arljeW0iCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogTmlld3Nwb21hZ2FuZSAlJSVjIHcgY2m5Z3UgZm9ybWF0dWq5Y3ltIgorCisjOiBxdWlja2ZpeC5jOjM1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6IE5pZXBvcHJhd25lICUlJWMgdyBwcmVmaWtzaWUgY2m5Z3UgZm9ybWF0dWq5Y2VnbyIKKworIzogcXVpY2tmaXguYzozNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IE5pZXBvcHJhd25lICUlJWMgdyBjablndSBmb3JtYXR1arljeW0iCisKKyM6IHF1aWNrZml4LmM6MzkxCittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIG5pZSB6YXdpZXJhIHd6b3JjYSIKKworIzogcXVpY2tmaXguYzo1MDEKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBQdXN0YSBuYXp3YSBrYXRhbG9ndSBsdWIgamVqIGJyYWsiCisKKyM6IHF1aWNrZml4LmM6OTkwCittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1MzogTmllIG1hIHdp6mNlaiBlbGVtZW5083ciCisKKyM6IHF1aWNrZml4LmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQgeiAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIzMQorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiICh3aWVyc3ogc2thc293YW55KSIKKworIzogcXVpY2tmaXguYzoxNDQ0Cittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBOYSBkb2xlIHN0b3N1IHF1aWNrZml4IgorCisjOiBxdWlja2ZpeC5jOjE0NTMKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IE5hIGfzcnplIHN0b3N1IHF1aWNrZml4IgorCisjOiBxdWlja2ZpeC5jOjE0NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJsaXN0YSBis+pk83cgJWQgeiAlZDsgJWQgYrPqZPN3IgorCisjOiBxdWlja2ZpeC5jOjE5NDMKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiBOaWUgbW9n6iB6YXBpc2HmLCBvcGNqYSAnYnVmdHlwZScgamVzdCB1c3Rhd2lvbmEiCisKKyM6IHJlZ2V4cC5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY5OiBpbnZhbGlkIGl0ZW0gaW4gJXMlJVtdIgorbXNnc3RyICJFMzY5OiBOaWV3s2GcY2l3eSBlbGVtZW50IHcgJXMlJVtdIgorCisjOiByZWdleHAuYzo4NDAKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiBaYnl0IGSzdWdpIHd6b3J6ZWMiCisKKyM6IHJlZ2V4cC5jOjEwMTEKK21zZ2lkICJFNTA6IFRvbyBtYW55IFxceigiCittc2dzdHIgIkU1MDogWmJ5dCB3aWVsZSBcXHooIgorCisjOiByZWdleHAuYzoxMDIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTogVG9vIG1hbnkgJXMoIgorbXNnc3RyICJFNTE6IFpieXQgd2llbGUgJXMoIgorCisjOiByZWdleHAuYzoxMDc5Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiBOaWVzcGFyb3dhbnkgXFx6KCIKKworIzogcmVnZXhwLmM6MTA4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiBOaWVzcGFyb3dhbnkgJXMlJSgiCisKKyM6IHJlZ2V4cC5jOjEwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6IE5pZXNwYXJvd2FueSAlcygiCisKKyM6IHJlZ2V4cC5jOjEwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6IE5pZXNwYXJvd2FueSAlcykiCisKKyM6IHJlZ2V4cC5jOjEyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiBvcGVyYW5kICVzKiBt82ezIGJ55iBwdXN0eSIKKworIzogcmVnZXhwLmM6MTI2MworIywgYy1mb3JtYXQKK21zZ2lkICJFNTc6ICVzKyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTc6IG9wZXJhbmQgJXMrIG3zZ7MgYnnmIHB1c3R5IgorCisjOiByZWdleHAuYzoxMzE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IG5pZWRvendvbG9ueSB6bmFrIHBvICVzQCIKKworIzogcmVnZXhwLmM6MTM0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTg6ICVzeyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTg6IG9wZXJhbmQgJXN7IG3zZ7MgYnnmIHB1c3R5IgorCisjOiByZWdleHAuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiBaYnl0IHdpZWxlIHqzb79vbnljaCAlc3suLi59IgorCisjOiByZWdleHAuYzoxMzcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiBaYWduaWW/ZL9vbmUgJXMqIgorCisjOiByZWdleHAuYzoxMzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogWmFnbmllv2S/b25lICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0OTMKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiBOaWVkb3p3b2xvbmUgdb95Y2llIFxcXyIKKworIzogcmVnZXhwLmM6MTUzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6ICVzJWMgcG8gbmljenltIgorCisjOiByZWdleHAuYzoxNTk0Cittc2dpZCAiRTY1OiBJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorbXNnc3RyICJFNjU6IE5pZXezYZxjaXdlIG9kd2+zYW5pZSB3c3RlY3puZSIKKworIzogcmVnZXhwLmM6MTYwNworbXNnaWQgIkU2NjogXFx6KCBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjY6IFxceiggamVzdCBuaWVkb3p3b2xvbmUgdyB0eW0gbWllanNjdSIKKworIzogcmVnZXhwLmM6MTYyNgorbXNnaWQgIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY3OiBcXHoxIGkgcG9kb2JuZSBzuSBuaWVkb3p3b2xvbmUgdyB0eW0gbWllanNjdSIKKworIzogcmVnZXhwLmM6MTYzNworbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IG5pZWRvcHVzemN6YWxueSB6bmFrIHBvIFxceiIKKworIzogcmVnZXhwLmM6MTY4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiBCcmFrIF0gcG8gJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE3MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogUHVzdHkgJXMlJVtdIgorCisjOiByZWdleHAuYzoxNzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MTogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXMlJSIKK21zZ3N0ciAiRTcxOiBOaWVkb3p3b2xvbnkgem5hayBwbyAlcyUlIgorCisjOiByZWdleHAuYzoyNTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiBCs7lkIHNrs2FkbmkgdyAlc3suLi59IgorCisjOiByZWdleHAuYzoyODY1IHJlZ2V4cC5jOjMwMTgKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTogUHJ6ZWNod3ljb25vIHphs2FtYW5pZTsgcmVnZXhwIHpieXQgerNvv29ueT8iCisKKyM6IHJlZ2V4cC5jOjMwMDYgcmVnZXhwLmM6MzAxNQorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2Mzogd3pvcnplYyBzcG93b2Rvd2GzIGKzuWQgb3V0LW9mLXN0YWNrIgorCisjOiByZWdleHAuYzozMjYwCittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAiWmV3bup0cnpuZSBwb2Rkb3Bhc293YW5pYTpcbiIKKworIzogc2NyZWVuLmM6MjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgd2llcnN6eSB6d2luaep0byAiCisKKyM6IHNjcmVlbi5jOjc5OTYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLVpBTUlBTkEiCisKKyM6IHNjcmVlbi5jOjgwMDAKK21zZ2lkICIgUkVQTEFDRSIKK21zZ3N0ciAiIFpBTUlBTkEiCisKKyM6IHNjcmVlbi5jOjgwMDUKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiIE5FR0FUWVciCisKKyM6IHNjcmVlbi5jOjgwMDcKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgV1BST1dBRFpBTklFIgorCisjOiBzY3JlZW4uYzo4MDEwCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKHdwcm93YWR6YW5pZSkiCisKKyM6IHNjcmVlbi5jOjgwMTIKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKHphbWlhbmEpIgorCisjOiBzY3JlZW4uYzo4MDE0Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAodi16YW1pYW5hKSIKKworIzogc2NyZWVuLmM6ODAxNworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBIZWJyYWpza2kiCisKKyM6IHNjcmVlbi5jOjgwMjgKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIgQXJhYnNraSIKKworIzogc2NyZWVuLmM6ODAzMQorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAoaup6eWspIgorCisjOiBzY3JlZW4uYzo4MDM1Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAod2tsZWphbmllKSIKKworIzogc2NyZWVuLmM6ODA0OAorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBXSVpVQUxOWSIKKworIzogc2NyZWVuLmM6ODA0OQorbXNnaWQgIiBWSVNVQUwgTElORSIKK21zZ3N0ciAiIFdJWlVBTE5ZIExJTklPV1kiCisKKyM6IHNjcmVlbi5jOjgwNTAKK21zZ2lkICIgVklTVUFMIEJMT0NLIgorbXNnc3RyICIgV0laVUFMTlkgQkxPS09XWSIKKworIzogc2NyZWVuLmM6ODA1MQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBaQVpOQUNaQU5JRSIKKworIzogc2NyZWVuLmM6ODA1MgorbXNnaWQgIiBTRUxFQ1QgTElORSIKK21zZ3N0ciAiIFpBWk5BQ1pBTklFIExJTklPV0UiCisKKyM6IHNjcmVlbi5jOjgwNTMKK21zZ2lkICIgU0VMRUNUIEJMT0NLIgorbXNnc3RyICIgWkFaTkFDWkFOSUUgQkxPS09XRSIKKworIzogc2NyZWVuLmM6ODA2OCBzY3JlZW4uYzo4MTMxCittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICJ6YXBpcyIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgInN6dWthbmllIGRvYmmzbyBH01JZOyBrb250eW51YWNqYSBvZCBLT9FDQSIKKworIzogc2VhcmNoLmM6MzgKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgInN6dWthbmllIGRvYmmzbyBLT9FDQTsga29udHludWFjamEgb2QgR9NSWSIKKworIzogc2VhcmNoLmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IE5pZXezYZxjaXd5IGNpuWcgZG8gc3p1a2FuaWE6ICVzIgorCisjOiBzZWFyY2guYzo4NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiBzenVrYW5pZSBkb2Jps28gR9NSWSBiZXogem5hbGV6aWVuaWE6ICVzIgorCisjOiBzZWFyY2guYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiBzenVrYW5pZSBkb2Jps28gS0/RQ0EgYmV6IHpuYWxlemllbmlhIDogJXMiCisKKyM6IHNlYXJjaC5jOjEyNDkKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IE9jemVrdWrqICc/JyBsdWIgJy8nIHBvICc7JyIKKworIzogc2VhcmNoLmM6Mzc1OAorbXNnaWQgIiAoaW5jbHVkZXMgcHJldmlvdXNseSBsaXN0ZWQgbWF0Y2gpIgorbXNnc3RyICIgKHphd2llcmEgcG9wcnplZG5pbyB3eW1pZW5pb25lIGRvcGFzb3dhbmllKSIKKworIy4gY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjOiBzZWFyY2guYzozNzc4Cittc2dpZCAiLS0tIEluY2x1ZGVkIGZpbGVzICIKK21zZ3N0ciAiLS0tIFphd2FydGUgcGxpa2kgIgorCisjOiBzZWFyY2guYzozNzgwCittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAibmllIHpuYWxlemlvbm8iCisKKyM6IHNlYXJjaC5jOjM3ODEKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICJ3IHRyb3BpZSAtLS1cbiIKKworIzogc2VhcmNoLmM6MzgyMAorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAoSnW/IHd5bWllbmlvbmUpIgorCisjOiBzZWFyY2guYzozODIyCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAgTklFIFpOQUxFWklPTk8iCisKKyM6IHNlYXJjaC5jOjM4NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIlByemVnbLlkIHezuWN6b25lZ28gcGxpa3U6ICVzIgorCisjOiBzZWFyY2guYzo0MDkyCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBXem9yemVjIHBhc3VqZSB3IGJpZb+5Y3ltIHdpZXJzenUiCisKKyM6IHNlYXJjaC5jOjQyMzUKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiV3N6ZWxraWUgd7O5Y3phbmUgcGxpa2kgb2RuYWxlemlvbm8iCisKKyM6IHNlYXJjaC5jOjQyMzcKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiQnJhayB3s7ljemFueWNoIHBsaWvzdyIKKworIzogc2VhcmNoLmM6NDI1MworbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogTmllIHpuYWxherNlbSBkZWZpbmljamkiCisKKyM6IHNlYXJjaC5jOjQyNTUKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IE5pZSB6bmFsYXqzZW0gd3pvcmNhIgorCisjOiBzeW50YXguYzozMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiBOaWVkb3p3b2xvbnkgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzozMjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiBOaWUgbWEgdGFraWVnbyBrbGFzdHJhIHNrs2Fkbmk6ICVzIgorCisjOiBzeW50YXguYzozMzk0Cittc2dpZCAiTm8gU3ludGF4IGl0ZW1zIGRlZmluZWQgZm9yIHRoaXMgYnVmZmVyIgorbXNnc3RyICJCcmFrIGVsZW1lbnTzdyBza7NhZG5pIG9rcmWcbG9ueWNoIGRsYSB0ZWdvIGJ1Zm9yYSIKKworIzogc3ludGF4LmM6MzQwMgorbXNnaWQgInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIKK21zZ3N0ciAic3luY2hyb25pemFjamEga29tZW50YXJ6eSB3IHN0eWx1IEMiCisKKyM6IHN5bnRheC5jOjM0MTAKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICJicmFrIHN5bmNocm9uaXphY2ppIgorCisjOiBzeW50YXguYzozNDEzCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJwb2N6uXRlayBzeW5jaHJvbml6YWNqaSIKKworIzogc3ludGF4LmM6MzQxNSBzeW50YXguYzozNDkwCittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAiIHdpZXJzenkgcHJ6ZWQgZ/NybrkgbGluabkiCisKKyM6IHN5bnRheC5jOjM0MjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBFbGVtZW50eSBzeW5jaHJvbml6YWNqaSBza7NhZG5pIC0tLSIKKworIzogc3ludGF4LmM6MzQyNQorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisic3luY2hyb25penVq6iBuYSBlbGVtZW50YWNoIgorCisjOiBzeW50YXguYzozNDMxCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEVsZW1lbnR5IHNrs2FkbmkgLS0tIgorCisjOiBzeW50YXguYzozNDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiBOaWUgbWEgdGFraWVnbyBrbGFzdHJhIHNrs2Fkbmk6ICVzIgorCisjOiBzeW50YXguYzozNDgwCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmltYWxuaWUgIgorCisjOiBzeW50YXguYzozNDg3Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm1ha3N5bWFsbmllICIKKworIzogc3ludGF4LmM6MzQ5OQorbXNnaWQgIjsgbWF0Y2ggIgorbXNnc3RyICI7IHBhc3VqZSAiCisKKyM6IHN5bnRheC5jOjM1MDEKK21zZ2lkICIgbGluZSBicmVha3MiCittc2dzdHIgInpuYWvzdyBub3dlZ28gd2llcnN6YSIKKworIzogc3ludGF4LmM6NDEzNQorbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogZ3JvdXBbdF1oZXJlIG5pZWRvendvbG9uZSB3IHR5bSBtaWVqc2N1IgorCisjOiBzeW50YXguYzo0MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTQ6IERpZG4ndCBmaW5kIHJlZ2lvbiBpdGVtIGZvciAlcyIKK21zZ3N0ciAiRTM5NDogTmllIHpuYWxherNlbSBlbGVtZW5083cgcmVnaW9udSBkbGEgJXMiCisKKyM6IHN5bnRheC5jOjQxODcKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogYXJndW1lbnQgY29udGFpbnMgbmllZG96d29sb255IHcgdHltIG1pZWpzY3UiCisKKyM6IHN5bnRheC5jOjQxOTgKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogYXJndW1lbnQgY29udGFpbmVkaW4gbmllZG96d29sb255IHcgdHltIG1pZWpzY3UiCisKKyM6IHN5bnRheC5jOjQyNzYKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5NzogV3ltYWdhbmEgbmF6d2EgcGxpa3UiCisKKyM6IHN5bnRheC5jOjQ2MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBCcmFrICc9JzogJXMiCisKKyM6IHN5bnRheC5jOjQ3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5OTogTm90IGVub3VnaCBhcmd1bWVudHM6IHN5bnRheCByZWdpb24gJXMiCittc2dzdHIgIkUzOTk6IFphIG1hs28gYXJndW1lbnTzdzogc3ludGF4IHJlZ2lvbiAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBCcmFrIHNwZWN5ZmlrYWNqaSBrbGFzdHJhIgorCisjOiBzeW50YXguYzo1MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IEJyYWsgb2dyYW5pY3puaWthIHd6b3JjYTogJXMiCisKKyM6IHN5bnRheC5jOjUyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogjG1pZWNpIHBvIHd6b3JjdTogJXMiCisKKyM6IHN5bnRheC5jOjUzMDUKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFNDAzOiBzeW50YXggc3luYzogd2llbG9rcm90bmllIHBvZGFuZSB3em9yY2Uga29udHludWFjamkgd2llcnN6YSIKKworIzogc3ludGF4LmM6NTM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IE5pZWRvendvbG9uZSBhcmd1bWVudHk6ICVzIgorCisjOiBzeW50YXguYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IEJyYWsgem5ha3UgcvN3bm+cY2k6ICVzIgorCisjOiBzeW50YXguYzo1NDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogUHVzdHkgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIGplc3QgbmllZG96d29sb25lIHcgdHltIG1pZWpzY3UiCisKKyM6IHN5bnRheC5jOjU0NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyBtdXNpIGJ55iBwaWVyd3N6ZSB3IGxpnGNpZSBjb250YWlucyIKKworIzogc3ludGF4LmM6NTUyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFNDA5OiBOaWV6bmFuYSBuYXp3YSBncnVweTogJXMiCisKKyM6IHN5bnRheC5jOjU3NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiBOaWV3s2GcY2l3YSBwb2Rrb21lbmRhIDpzeW50YXggOiAlcyIKKworIzogc3ludGF4LmM6NjEzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogbmllIHpuYWxlemlvbm8gZ3J1cHkgcG9knHdpZXRsYW5pYTogJXMiCisKKyM6IHN5bnRheC5jOjYxNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IFpieXQgbWGzbyBhcmd1bWVudPN3OiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogWmJ5dCB3aWVsZSBhcmd1bWVudPN3OiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTg3Cittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiBncnVwYSBtYSB1c3Rhd2llbmlhOyB6aWdub3Jvd2FuZSBwb2SzuWN6ZW5pZSBwb2Scd2lldGxhbmlhIgorCisjOiBzeW50YXguYzo2MzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IG5pZW9jemVraXdhbnkgem5hayBy83dub5xjaTogJXMiCisKKyM6IHN5bnRheC5jOjYzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogYnJhayB6bmFrdSBy83dub5xjaTogJXMiCisKKyM6IHN5bnRheC5jOjYzODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IGJyYWsgYXJndW1lbnR1OiAlcyIKKworIzogc3ludGF4LmM6NjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogTmllZG96d29sb25hIHdhcnRvnOY6ICVzIgorCisjOiBzeW50YXguYzo2NTM2Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogS29sb3IgRkcgbmllem5hbnkiCisKKyM6IHN5bnRheC5jOjY1NDcKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiBLb2xvciBCRyBuaWV6bmFueSIKKworIzogc3ludGF4LmM6NjYwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IE5hendhIGx1YiBsaWN6YmEga29sb3J1IG5pZXJvenBvem5hbmE6ICVzIgorCisjOiBzeW50YXguYzo2ODE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiB6YSBks3VnaSBrb2QgdGVybWluYWxhOiAlcyIKKworIzogc3ludGF4LmM6Njg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogTmllZG96d29sb255IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NzM5MAorbXNnaWQgIkU0MjQ6IFRvbyBtYW55IGRpZmZlcmVudCBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBpbiB1c2UiCittc2dzdHIgIkU0MjQ6IFpieXQgd2llbGUgcvO/bnljaCBhdHJ5YnV083cgcG9ka3JlnGxhbmlhIHcgdb95Y2l1IgorCisjOiBzeW50YXguYzo3OTExCittc2dpZCAiRTY2OTogVW5wcmludGFibGUgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIkU2Njk6IE5pZWRydWtvd2Fsbnkgem5hayB3IG5hendpZSBncnVweSIKKworIy4gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHNpbmNlIHRoZXJlIHByZXZpb3VzbHkgd2FzIG5vIGNoZWNrIG9ubHkKKyMuICogZ2l2ZSBhIHdhcm5pbmcuCisjOiBzeW50YXguYzo3OTE4Cittc2dpZCAiVzE4OiBJbnZhbGlkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJXMTg6IG5pZXByYXdpZLNvd3kgem5hayB3IG5hendpZSBncnVweSIKKworIzogdGFnLmM6OTAKK21zZ2lkICJFNTU1OiBhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU1OiBuYSBkb2xlIHN0b3N1IHpuYWN6bmlr83ciCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogbmEgZ/NyemUgc3Rvc3Ugem5hY3puaWvzdyIKKworIzogdGFnLmM6NDEyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IE5pZSBtb79uYSBwcnplapzmIHByemVkIHBpZXJ3c3p5IHBhc3VquWN5IHpuYWN6bmlrIgorCisjOiB0YWcuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IG5pZSB6bmFsZXppb25vIHpuYWN6bmlrYTogJXMiCisKKyM6IHRhZy5jOjU4MworbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmkgcm9kemFqIHpuYWN6bmlrIgorCisjOiB0YWcuYzo1ODYKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgInBsaWtcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjc0NAorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiV3Byb3dhZJ8gbnIgd3lib3J1ICg8Q1I+IHByemVyeXdhKTogIgorCisjOiB0YWcuYzo3ODQKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IFBhc3VqZSB0eWxrbyBqZWRlbiB6bmFjem5payIKKworIzogdGFnLmM6Nzg2Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogTmllIG1vv25hIHByemVqnOYgemEgb3N0YXRuaSBwYXN1arljeSB6bmFjem5payIKKworIzogdGFnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJQbGlrIFwiJXNcIiBuaWUgaXN0bmllamUiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjgyMworIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAiem5hY3puaWsgJWQgeiAlZCVzIgorCisjOiB0YWcuYzo4MjYKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIGx1YiB3aepjZWoiCisKKyM6IHRhZy5jOjgyOAorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIFW/eXdhbSB6bmFjem5pa2EgbyBvZG1pZW5uZWogd2llbGtvnGNpIGxpdGVyISIKKworIzogdGFnLmM6ODcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBQbGlrIFwiJXNcIiBuaWUgaXN0bmllamUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6OTQxCittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyBETyB6bmFjem5payAgT0Qgd2llcnN6YSAgICAgIHcgcGxpa3UvdGVrnGNpZSIKKworIzogdGFnLmM6MTM2MworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJTenVrYW0gdyBwbGlrdSB6bmFjem5pa/N3ICVzIgorCisjOiB0YWcuYzoxNTUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBUcm9wIHN6dWthbmlhIHBsaWt1IHpuYWN6bmlr83cgb2Jjaep0eSBkbGEgJXNcbiIKKworIzogdGFnLmM6MjIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogQrO5ZCBmb3JtYXR1IHcgcGxpa3Ugem5hY3puaWvzdyBcIiVzXCIiCisKKyM6IHRhZy5jOjIyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICJQcnplZCBiYWp0ZW0gJWxkIgorCisjOiB0YWcuYzoyMjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogUGxpayB6bmFjem5pa/N3IG5pZXVwb3J6uWRrb3dhbnk6ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjI4MAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogQnJhayBwbGlrdSB6bmFjem5pa/N3IgorCisjOiB0YWcuYzozMDE2Cittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDogTmllIG1vZ+ogem5hbGWf5iB3em9yY2Egem5hY3puaWthIgorCisjOiB0YWcuYzozMDI3Cittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiBOaWUgem5hbGF6s2VtIHpuYWN6bmlrYSAtIHR5bGtvIHpnYWR1auohIgorCisjOiB0ZXJtLmM6MTc1OQorbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyBuaWV6bmFueS4gTW+/bGl3ZSB0eXB5IHdidWRvd2FueWNoIHRlcm1pbmFsaToiCisKKyM6IHRlcm0uYzoxNzgzCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJkb215nGxuaWUgamVzdCAnIgorCisjOiB0ZXJtLmM6MjE0MQorbXNnaWQgIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiRTU1NzogTmllIG1vZ+ogb3R3b3J6eeYgcGxpa3UgdGVybWNhcCIKKworIzogdGVybS5jOjIxNDUKK21zZ2lkICJFNTU4OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIkU1NTg6IE5pZSBtYSBvcGlzdSB0YWtpZWdvIHRlcm1pbmFsYSB3IHRlcm1pbmZvIgorCisjOiB0ZXJtLmM6MjE0NworbXNnaWQgIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTU5OiBOaWUgbWEgb3Bpc3UgdGFraWVnbyB0ZXJtaW5hbGEgdyB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6MjMwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogQnJhayBvcGlzdSBcIiVzXCIgdyB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6Mjc4MAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiB3eW1hZ2FuYSB6ZG9sbm+c5iBcImNtXCIgdGVybWluYWxhIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTkwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBLbGF3aXN6ZSB0ZXJtaW5hbGEgLS0tIgorCisjOiB1aS5jOjI1OAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgInVydWNob21pb25vIG5vd7kgcG93s29r6lxuIgorCisjOiB1aS5jOjE4NDEKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiBCs7lkIHBvZGN6YXMgd2N6eXR5d2FuaWEgd2VqnGNpYSwga2/xY3rqLi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6NDA1Cittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICJDb2ZuaepjaWUgbmllbW+/bGl3ZTsgbWltbyB0byBrb250eW51dWrqIgorCisjOiB1bmRvLmM6NTYxCittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogbmlld7NhnGNpd2UgbnVtZXJ5IHdpZXJzenkiCisKKyM6IHVuZG8uYzo3NTcKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAiMSB6bWlhbmEiCisKKyM6IHVuZG8uYzo3NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIiVsZCB6bWlhbiIKKworIzogdW5kby5jOjgxMgorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiB1c3prb2R6b25hIGxpc3RhIGNvZmFuaWEiCisKKyM6IHVuZG8uYzo4NDQKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDogYnJhayB3aWVyc3phIGNvZmFuaWEiCisKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzoxNzY5Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYvMzIgYml0b3dhIHdlcnNqYSBHVUkgZGxhIE1TLVdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzoxNzcxCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgYml0b3dhIHdlcnNqYSBHVUkgZGxhIE1TLVdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzoxNzc0Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgdyB0cnliaWUgV2luMzJzIgorCisjOiB2ZXJzaW9uLmM6MTc3NgorbXNnaWQgIiB3aXRoIE9MRSBzdXBwb3J0IgorbXNnc3RyICIgemUgd3Nwb21hZ2FuaWVtIE9MRSIKKworIzogdmVyc2lvbi5jOjE3NzkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgYml0b3dhIHdlcnNqYSBuYSBrb25zb2zqIGRsYSBNUy1XaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6MTc4MworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3dhIHdlcnNqYSBkbGEgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjE3ODcKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgYml0b3dhIHdlcnNqYSBkbGEgTVMtRE9TIgorCisjOiB2ZXJzaW9uLmM6MTc4OQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiBiaXRvd2Egd2Vyc2phIGRsYSBNUy1ET1MiCisKKyM6IHZlcnNpb24uYzoxNzk1Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJ3ZXJzamEgZGxhIE1hY09TIFggKHVuaXgpIgorCisjOiB2ZXJzaW9uLmM6MTc5NworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJ3ZXJzamEgZGxhIE1hY09TIFgiCisKKyM6IHZlcnNpb24uYzoxODAwCittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJ3ZXJzamEgZGxhIE1hY09TIgorCisjOiB2ZXJzaW9uLmM6MTgwNQorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJ3ZXJzamEgZGxhIFJJU0MgT1MiCisKKyM6IHZlcnNpb24uYzoxODE1Cittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIlphZGFuZSCzYXR5OiAiCisKKyM6IHZlcnNpb24uYzoxODQxIHZlcnNpb24uYzoyMjA5Cittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJabWllbmlvbnkgcHJ6ZXogIgorCisjOiB2ZXJzaW9uLmM6MTg0OAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyJTa29tcGlsb3dhbnkgIgorCisjOiB2ZXJzaW9uLmM6MTg1MQorbXNnaWQgImJ5ICIKK21zZ3N0ciAicHJ6ZXogIgorCisjOiB2ZXJzaW9uLmM6MTg2MworbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiT2xicnp5bWlhIHdlcnNqYSAiCisKKyM6IHZlcnNpb24uYzoxODY2Cittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkR1v2Egd2Vyc2phICIKKworIzogdmVyc2lvbi5jOjE4NjkKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiTm9ybWFsbmEgd2Vyc2phICIKKworIzogdmVyc2lvbi5jOjE4NzIKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJNYbNhIHdlcnNqYSAiCisKKyM6IHZlcnNpb24uYzoxODc0Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJNYWx1dGthIHdlcnNqYSAiCisKKyM6IHZlcnNpb24uYzoxODgwCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJiZXogR1VJLiIKKworIzogdmVyc2lvbi5jOjE4ODUKK21zZ2lkICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKK21zZ3N0ciAieiBHVEsyLUdOT01FIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODg3Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAieiBHVEstR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4OTEKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAieiBHVEsyIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxODkzCittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAieiBHVEsgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4OTgKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICJ6IFgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkwMgorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICJ6IFgxMS1uZVh0YXcgR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MDQKK21zZ2lkICJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIKK21zZ3N0ciAieiBYMTEtQXRoZW5hIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTA4Cittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgInogQmVPUyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkxMQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgInogUGhvdG9uIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTE0Cittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICJ6IEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTE3Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAieiBDYXJib24gR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MjAKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgInogQ29jb2EgR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MjMKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICJ6IChrbGFzeWN6bnltKSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkzNAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgT3BjamUgd7O5Y3pvbmUgKCspIGx1YiBuaWUgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6MTk0NgorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgIHZpbXJjIHN5c3RlbXU6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk1MQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgdmltcmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk1NgorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiIDItZ2kgcGxpayB2aW1yYyB1v3l0a293bmlrYTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTYxCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgMy1jaSBwbGlrIHZpbXJjIHW/eXRrb3duaWthOiBcIiIKKworIzogdmVyc2lvbi5jOjE5NjYKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICBleHJjIHW/eXRrb3duaWthOiBcIiIKKworIzogdmVyc2lvbi5jOjE5NzEKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgMi1naSBwbGlrIGV4cmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk3NworbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICBndmltcmMgc3lzdGVtdTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTgxCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIGd2aW1yYyB1v3l0a293bmlrYTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTg1Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIyLWdpIHBsaWsgZ3ZpbXJjIHW/eXRrb3duaWthOiBcIiIKKworIzogdmVyc2lvbi5jOjE5OTAKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIjMtY2kgcGxpayBndmltcmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk5NworbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiIHN5c3RlbW93eSBwbGlrIG1lbnU6IFwiIgorCisjOiB2ZXJzaW9uLmM6MjAwNQorbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgb2R3ZXQgZGxhICRWSU0tYTogXCIiCisKKyM6IHZlcnNpb24uYzoyMDExCittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICJmLWIgZGxhICRWSU1SVU5USU1FOiBcIiIKKworIzogdmVyc2lvbi5jOjIwMTUKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJLb21waWxhY2phOiAiCisKKyM6IHZlcnNpb24uYzoyMDIxCittc2dpZCAiQ29tcGlsZXI6ICIKK21zZ3N0ciAiS29tcGlsYXRvcjogIgorCisjOiB2ZXJzaW9uLmM6MjAyNgorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiS29uc29saWRhY2phOiAiCisKKyM6IHZlcnNpb24uYzoyMDMxCittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICBLT01QSUxBQ0pBIERFQlVHIgorCisjOiB2ZXJzaW9uLmM6MjA3MAorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSByb3pidWRvd2FueSIKKworIzogdmVyc2lvbi5jOjIwNzIKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAid2Vyc2phICIKKworIzogdmVyc2lvbi5jOjIwNzMKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIkF1dG9yOiBCcmFtIE1vb2xlbmFhciBpIElubmkuIgorCisjOiB2ZXJzaW9uLmM6MjA3NworbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBqZXN0IG9wZW4gc291cmNlIGkgcm96cHJvd2FkemFueSBkYXJtb3dvIgorCisjOiB2ZXJzaW9uLmM6MjA3OQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICJQb23zvyBiaWVkbnltIGR6aWVjaW9tIHcgVWdhbmR6aWUhIgorCisjOiB2ZXJzaW9uLmM6MjA4MAorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIndwcm93YWSfIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgICBkbGEgaW5mb3JtYWNqaSBvIHR5bSAgIgorCisjOiB2ZXJzaW9uLmM6MjA4MgorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgIndwcm93YWSfIDpxPEVudGVyPiAgICAgICAgICAgICAgICB6YWtv8WN6ZW5pZSBwcm9ncmFtdSAgICIKKworIzogdmVyc2lvbi5jOjIwODMKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICJ3cHJvd2FknyA6aGVscDxFbnRlcj4gIGx1YiAgPEYxPiAgcG9tb2MgbmEgYmllv7ljbyAgICAgICAiCisKKyM6IHZlcnNpb24uYzoyMDg0Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAid3Byb3dhZJ8gOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgIGRsYSBpbmZvcm1hY2ppIG8gd2Vyc2ppIgorCisjOiB2ZXJzaW9uLmM6MjA4NworbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJEemlhs2FtIHcgdHJ5YmllIHpnb2Rub5xjaSB6IFZpIgorCisjOiB2ZXJzaW9uLmM6MjA4OAorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgIndwcm93YWSfIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgICB3YXJ0b5xjaSBkb215nGxuZSBWaW0tYSIKKworIzogdmVyc2lvbi5jOjIwODkKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ3cHJvd2FknyA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiAgZGxhIGluZm9ybWFjamkgdG8gdHltICAiCisKKyM6IHZlcnNpb24uYzoyMTA0Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAid3Byb3dhZJ8gOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgIGRsYSBpbmZvcm1hY2ppIHRvIHR5bSAgIgorCisjOiB2ZXJzaW9uLmM6MjEwNgorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIlVydWNob21pb255IGJleiB0cnli83csIHdwaXNhbnkgdGVrc3QgamVzdCB3cHJvd2FkemFueSIKKworIzogdmVyc2lvbi5jOjIxMDcKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBJbnNlcnQgTW9kZSAgIgorbXNnc3RyICJtZW51ICBFZHl0dWotPlVzdGF3aWVuaWEgZ2xvYmFsbmUtPlRyeWIgd3N0YXdpYW5pYSIKKworIzogdmVyc2lvbi5jOjIxMDgKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICBkbGEgZHfzY2ggdHJ5YvN3ICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoyMTEyCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAibWVudSBFZHl0dWotPlVzdGF3aWVuaWEgZ2xvYmFsbmUtPktvbXBhdHliaWxub5zmIHogVmkiCisKKyM6IHZlcnNpb24uYzoyMTEzCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiICAgICBkbGEgZG9teZxsbnljaCB1c3Rhd2ll8SBWaW1hICAgIgorCisjOiB2ZXJzaW9uLmM6MjE2MAorbXNnaWQgIlNwb25zb3IgVmltIGRldmVsb3BtZW50ISIKK21zZ3N0ciAiU3BvbnNvcnVqIHJvenfzaiBWaW1hISIKKworIzogdmVyc2lvbi5jOjIxNjEKK21zZ2lkICJCZWNvbWUgYSByZWdpc3RlcmVkIFZpbSB1c2VyISIKK21zZ3N0ciAiWm9zdGHxIHphcmVqZXN0cm93YW55bSB1v3l0a293bmlraWVtIFZpbWEhIgorCisjOiB2ZXJzaW9uLmM6MjE2NAorbXNnaWQgInR5cGUgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIndwcm93YWSfIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgICAgICBkbGEgaW5mb3JtYWNqaSIKKworIzogdmVyc2lvbi5jOjIxNjUKK21zZ2lkICJ0eXBlICA6aGVscCByZWdpc3RlcjxFbnRlcj4gICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJ3cHJvd2FknyA6aGVscCByZWdpc3RlcjxFbnRlcj4gICAgICAgIGRsYSBpbmZvcm1hY2ppIgorCisjOiB2ZXJzaW9uLmM6MjE2NworbXNnaWQgIm1lbnUgIEhlbHAtPlNwb25zb3IvUmVnaXN0ZXIgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbnUgUG9tb2MtPlNwb25zb3J1ai9aYXJlamVzdHJ1aiBzaeogZGxhIGluZm9ybWFjamkiCisKKyM6IHZlcnNpb24uYzoyMTc3Cittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAiT1NUUlpFr0VOSUU6IHd5a3J5dG8gV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjIxODAKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJ3cHJvd2FknyA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICAgZGxhIGluZm9ybWFjamkgdG8gdHltICAiCisKKyM6IHdpbmRvdy5jOjIwMworbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiBOaWUgbWEgb2tuYSBwb2RnbLlkdSIKKworIzogd2luZG93LmM6NTgxCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogTmllIG1vZ+ogcm96ZHppZWxp5iBsZXdvLWfzcm5lZ28gaSBwcmF3by1kb2xuZWdvIGplZG5vY3plnG5pZSIKKworIzogd2luZG93LmM6MTM0MAorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogTmllIG1vZ+ogcHJ6ZWty6mNp5iwgZ2R5IGlubmUgb2tubyBqZXN0IHJvemR6aWVsb25lIgorCisjOiB3aW5kb3cuYzoxODM2Cittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiBOaWUgbW9n6iB6YW1rbrnmIG9zdGF0bmllZ28gb2tuYSIKKworIzogd2luZG93LmM6MjU2NworbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJKdb8gamVzdCB0eWxrbyBqZWRlbiB3aWRvayIKKworIzogd2luZG93LmM6MjYxNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiBJbm5lIG9rbm8gemF3aWVyYSB6bWlhbnkiCisKKyM6IHdpbmRvdy5jOjQ0ODAKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiBCcmFrIG5hend5IHBsaWt1IHBvZCBrdXJzb3JlbSIKKworIzogd2luZG93LmM6NDU5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IE5pZSBtb2fqIHpuYWxln+YgcGxpa3UgXCIlc1wiIHcgdHJvcGllIgorCisjOiBpZl9wZXJsLnhzOjMyNiBnbG9iYWxzLmg6MTIzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiBOaWUgbW9ns2VtIHphs2Fkb3dh5iBiaWJsaW90ZWtpICVzIgorCisjOiBpZl9wZXJsLnhzOjU1NAorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIlByenlrcm8gbWksIHRhIGtvbWVuZGEgamVzdCB3ebO5Y3pvbmE6IG5pZSBtb2ezZW0gemGzYWRvd2HmIGJpYmxpb3Rla2kgUGVybGEuIgorCisjOiBpZl9wZXJsLnhzOjYwNworbXNnaWQgIkUyOTk6IFBlcmwgZXZhbHVhdGlvbiBmb3JiaWRkZW4gaW4gc2FuZGJveCB3aXRob3V0IHRoZSBTYWZlIG1vZHVsZSIKK21zZ3N0ciAiRTI5OTogd3lsaWN6ZW5pZSBQZXJsYSB6YWJyb25pb25lIHcgcGlhc2tvd25pY3kgYmV6IG1vZHWzdSBTYWZlIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4MworbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAiRWR5dHVqIHcgJndpZWx1IFZpbWFjaCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODkKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIkVkeXR1aiB3IHBvamVkeW5jenltICZWaW1pZSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTgKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAiJkRpZmYgeiBWaW1lbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTEKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiRWR5dHVqIHcgJlZpbWllIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjMzCittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIkVkeXR1aiB6IGlzdG5pZWq5Y3ltIFZpbWVtIC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiRWR5dHVqIHd5YnJhbmUgcGxpa2kgdyBWaW1pZSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIkKzuWQgdHdvcnplbmlhIHByb2Nlc3U6IFNwcmF3ZJ8gY3p5IGd2aW0gamVzdCB3IHR3b2plaiCcY2llv2NlISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiYrO5ZCBndmltZXh0LmRsbCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTkKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIlphIGSzdWdhIJxjaWW/a2EhIgorCisjOiBnbG9iYWxzLmg6MTAyMgorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tQnJhayB3aWVyc3p5IHcgYnVmb3J6ZS0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjExODUKK21zZ2lkICJFNDcwOiBDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIkU0NzA6IFByemVyd2FuaWUga29tZW5keSIKKworIzogZ2xvYmFscy5oOjExODYKK21zZ2lkICJFNDcxOiBBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAiRTQ3MTogd3ltYWdhbnkgYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMTg3Cittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IHBvIFxcIHBvd2lubm8gYnnmIC8sID8gbHViICYiCisKKyM6IGdsb2JhbHMuaDoxMTg5Cittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiBOaWVkb3p3b2xvbmUgdyBva25pZSB3aWVyc3phIHBvbGVjZfE7IDxDUj4gd3lrb251amUsIENUUkwtQyBvcHVzemN6YSIKKworIzogZ2xvYmFscy5oOjExOTEKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIiIKKyJFMTI6IEtvbWVuZGEgbmllZG96d29sb25hIHogZXhyYy92aW1yYyB3IGJpZb+5Y3ltIHN6dWthbml1IGthdGFsb2d1IGx1YiAiCisiem5hY3puaWthIgorCisjOiBnbG9iYWxzLmg6MTE5MworbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiBCcmFrIDplbmRpZiIKKworIzogZ2xvYmFscy5oOjExOTQKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IEJyYWsgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogQnJhayA6ZW5kd2hpbGUiCisKKyM6IGdsb2JhbHMuaDoxMTk2Cittc2dpZCAiRTU4ODogOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg4OiA6ZW5kd2hpbGUgYmV6IDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjExOTgKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogUGxpayBpc3RuaWVqZSAod3ltdZwgcG9wcnpleiAhKSIKKworIzogZ2xvYmFscy5oOjExOTkKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjogS29tZW5kYSBuaWUgcG93aW9ks2Egc2nqIgorCisjOiBnbG9iYWxzLmg6MTIwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiBOaWV6bmFueSB6ZXN0YXcgY3pjaW9uZWs6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiBOaWV6bmFuYSBjemNpb25rYTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogQ3pjaW9ua2EgXCIlc1wiIG5pZSBtYSBzdGGzZWogc3plcm9rb5xjaSB6bmFr83ciCisKKyM6IGdsb2JhbHMuaDoxMjEwCittc2dpZCAiRTQ3MzogSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIkU0NzM6IEKzuWQgd2V3bup0cnpueSIKKworIzogZ2xvYmFscy5oOjEyMTEKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiUHJ6ZXJ3YW5lIgorCisjOiBnbG9iYWxzLmg6MTIxMgorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IE5pZXezYZxjaXd5IGFkcmVzIgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkU0NzQ6IE5pZXezYZxjaXd5IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTIxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQ3NTogTmlld7NhnGNpd3kgYXJndW1lbnQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTogTmlld7NhnGNpd2Ugd3lyYb9lbmllOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogTmlld7NhnGNpd3kgemFrcmVzIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogTmlld7NhnGNpd2Ega29tZW5kYSIKKworIzogZ2xvYmFscy5oOjEyMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIGplc3Qga2F0YWxvZ2llbSIKKworIzogZ2xvYmFscy5oOjEyMjQKK21zZ2lkICJFMTg6IFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBiZWZvcmUgJz0nIgorbXNnc3RyICJFMTg6IE5pZW9jemVraXdhbmUgem5ha2kgcHJ6ZWQgJz0nIgorCisjOiBnbG9iYWxzLmg6MTIyNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogV3l3b7NhbmllIHogYmlibGlvdGVraSBuaWUgcG93aW9ks28gc2nqIGRsYSBcIiVzKClcIiIKKworIzogZ2xvYmFscy5oOjEyMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogTmllIG1vv25hIHphs2Fkb3dh5iBmdW5rY2ppIGJpYmxpb3Rla2kgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjM1Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IFpha7NhZGthIG1hIG5pZXezYZxjaXd5IG51bWVyIHdpZXJzemEiCisKKyM6IGdsb2JhbHMuaDoxMjM2Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogWmFrs2Fka2EgbmllbmFzdGF3aW9uYSIKKworIzogZ2xvYmFscy5oOjEyMzcKK21zZ2lkICJFMjE6IENhbm5vdCBtYWtlIGNoYW5nZXMsICdtb2RpZmlhYmxlJyBpcyBvZmYiCittc2dzdHIgIkUyMTogTmllIG1vZ+ogd3lrb25h5iB6bWlhbiwgJ21vZGlmaWFibGUnIGplc3Qgd3mzuWN6b25lIgorCisjOiBnbG9iYWxzLmg6MTIzOAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogWmJ5dCBns+pib2tpZSB6YWduaWW/ZL9lbmllIHNrcnlwdPN3IgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogQnJhayBwbGlrdSB6YW1pYW55IgorCisjOiBnbG9iYWxzLmg6MTI0MAorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogTmllIG1hIHRha2llZ28gc2ty83R1IgorCisjOiBnbG9iYWxzLmg6MTI0MQorbXNnaWQgIkU0Nzc6IE5vICEgYWxsb3dlZCIKK21zZ3N0ciAiRTQ3NzogTmllZG96d29sb25lICEiCisKKyM6IGdsb2JhbHMuaDoxMjQzCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBHVUkgbmllIG1vv2UgYnnmIHW/eXRlOiBOaWUgd7O5Y3pvbm8gcG9kY3phcyBrb21waWxhY2ppIgorCisjOiBnbG9iYWxzLmg6MTI0NgorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiBIZWJyYWpza2kgbmllIG1vv2UgYnnmIHW/eXR5OiBOaWUgd7O5Y3pvbm8gcG9kY3phcyBrb21waWxhY2ppXG4iCisKKyM6IGdsb2JhbHMuaDoxMjQ5Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogRmFyc2kgbmllIG1vv2UgYnnmIHW/eXR5OiBOaWUgd7O5Y3pvbm8gcG9kY3phcyBrb21waWxhY2ppXG4iCisKKyM6IGdsb2JhbHMuaDoxMjUyCittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogQXJhYnNraSBuaWUgbW+/ZSBieeYgdb95dHk6IE5pZSB3s7ljem9ubyBwb2RjemFzIGtvbXBpbGFjamlcbiIKKworIzogZ2xvYmFscy5oOjEyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiBCcmFrIHRha2llaiBuYXp3eSBncnVweSBwb2Scd2lldGxhbmlhOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNTcKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IE5pZSB3cHJvd2Fkem9ubyBqZXN6Y3plIL9hZG5lZ28gdGVrc3R1IgorCisjOiBnbG9iYWxzLmg6MTI1OAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IE5pZSBtYSBwb3ByemVkbmllZ28gd2llcnN6YSBwb2xlY2XxIgorCisjOiBnbG9iYWxzLmg6MTI1OQorbXNnaWQgIkUzMTogTm8gc3VjaCBtYXBwaW5nIgorbXNnc3RyICJFMzE6IE5pZSBtYSB0YWtpZWdvIHByenlwb3J6uWRrb3dhbmlhIgorCisjOiBnbG9iYWxzLmg6MTI2MAorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiBCcmFrIGRvcGFzb3dh8SIKKworIzogZ2xvYmFscy5oOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiBCcmFrIGRvcGFzb3dh8TogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjYyCittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIkUzMjogQnJhayBuYXp3eSBwbGlrdSIKKworIzogZ2xvYmFscy5oOjEyNjMKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IEJyYWsgcG9wcnplZG5pZWdvIHBvZHN0YXdpZW5pb3dlZ28gd3lyYb9lbmlhIHJlZ3VsYXJuZWdvIgorCisjOiBnbG9iYWxzLmg6MTI2NAorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiBCcmFrIHBvcHJ6ZWRuaWVqIGtvbWVuZHkiCisKKyM6IGdsb2JhbHMuaDoxMjY1Cittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTogQnJhayBwb3ByemVkbmllZ28gd3lyYb9lbmlhIHJlZ3VsYXJuZWdvIgorCisjOiBnbG9iYWxzLmg6MTI2NgorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IFpha3JlcyBuaWVkb3p3b2xvbnkiCisKKyM6IGdsb2JhbHMuaDoxMjY4Cittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIkUzNjogQnJhayBtaWVqc2NhIgorCisjOiBnbG9iYWxzLmg6MTI3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IGJyYWsgemFyZWplc3Ryb3dhbmVnbyBzZXJ3ZXJhIG8gbmF6d2llIFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjEyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6IE5pZSBtb2fqIHN0d29yennmIHBsaWt1ICVzIgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogTmllIG1vZ+ogcG9icmHmIG5hend5IHBsaWt1IHR5bWN6YXNvd2VnbyIKKworIzogZ2xvYmFscy5oOjEyNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NDogQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJFNDg0OiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSAlcyIKKworIzogZ2xvYmFscy5oOjEyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NTogQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJFNDg1OiBOaWUgbW9n6iBvZGN6eXRh5iBwbGlrdSAlcyIKKworIzogZ2xvYmFscy5oOjEyNzcKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzogTmllIHphcGlzYW5vIG9kIG9zdGF0bmllaiB6bWlhbnkgKHd5bXWcIHByemV6ICEpIgorCisjOiBnbG9iYWxzLmg6MTI3OAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiBaZXJvd3kgYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogT2N6ZWt1auogbGljemJ5IgorCisjOiBnbG9iYWxzLmg6MTI4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIgorbXNnc3RyICJFNDA6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IGKz6mTzdyAlcyIKKworIzogZ2xvYmFscy5oOjEyODYKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiBuaWUgbW9n6iBvdHdvcnp55iBla3JhbnUiCisKKyM6IGdsb2JhbHMuaDoxMjg4Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiBQYW1p6uYgd3ljemVycGFuYSEiCisKKyM6IGdsb2JhbHMuaDoxMjkwCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgIk5pZSB6bmFsZXppb25vIHd6b3JjYSIKKworIzogZ2xvYmFscy5oOjEyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NjogUGF0dGVybiBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDg2OiBOaWUgem5hbGV6aW9ubyB3em9yY2E6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI5MworbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IEFyZ3VtZW50IG11c2kgYnnmIGRvZGF0bmkiCisKKyM6IGdsb2JhbHMuaDoxMjk1Cittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiBOaWUgbW+/bmEgcHJ6ZWqc5iBkbyBwb3ByemVkbmllZ28ga2F0YWxvZ3UiCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0MjogQnJhayBCs+pk83ciCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBQb3BzdXR5IGNpuWcgd3pvcmNhIgorCisjOiBnbG9iYWxzLmg6MTMwMgorbXNnaWQgIkU0NDogQ29ycnVwdGVkIHJlZ2V4cCBwcm9ncmFtIgorbXNnc3RyICJFNDQ6IFplcHN1dHkgcHJvZ3JhbSB3eXJhv2XxIHJlZ3VsYXJueWNoIgorCisjOiBnbG9iYWxzLmg6MTMwMworbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTogb3BjamEgJ3JlYWRvbmx5JyBqZXN0IHVzdGF3aW9uYSAod3ltdZwgcG9wcnpleiAhKSIKKworIzogZ2xvYmFscy5oOjEzMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0NjogTmllIG1vZ+ogdXN0YXdp5iB6bWllbm5laiB0eWxrbyBkbyBvZGN6eXR1IFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjEzMDgKK21zZ2lkICJFNDc6IEVycm9yIHdoaWxlIHJlYWRpbmcgZXJyb3JmaWxlIgorbXNnc3RyICJFNDc6IEKzuWQgdyB0cmFrY2llIGN6eXRhbmlhIHBsaWt1IGKz6mTzdyIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNDg6IE5vdCBhbGxvd2VkIGluIHNhbmRib3giCittc2dzdHIgIkU0ODogTmllZG96d29sb25lIHcgcGlhc2tvd25pY3kiCisKKyM6IGdsb2JhbHMuaDoxMzEzCittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogTmllZG96d29sb25lIHcgdHltIG1pZWpzY3UiCisKKyM6IGdsb2JhbHMuaDoxMzE2Cittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBVc3Rhd2lhbmllIHRyeWJ1IGVrcmFudSBuaWV3c3BvbWFnYW5lIgorCisjOiBnbG9iYWxzLmg6MTMxOAorbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiBOaWV3s2GcY2l3YSB3aWVsa2+c5iBwcnpld2luaepjaWEiCisKKyM6IGdsb2JhbHMuaDoxMzE5Cittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiBvcGNqYSAnc2hlbGwnIGplc3QgcHVzdGEiCisKKyM6IGdsb2JhbHMuaDoxMzIxCittc2dpZCAiRTI1NTogQ291bGRuJ3QgcmVhZCBpbiBzaWduIGRhdGEhIgorbXNnc3RyICJFMjU1OiBOaWUgbW9ns2VtIHdjenl0YeYgZGFueWNoIHpuYWt1ISIKKworIzogZ2xvYmFscy5oOjEzMjMKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiBCs7lkIHBvZGN6YXMgemFteWthbmlhIHBsaWt1IHd5bWlhbnkiCisKKyM6IGdsb2JhbHMuaDoxMzI0Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3Mzogc3RvcyB6bmFjem5pa/N3IGplc3QgcHVzdHkiCisKKyM6IGdsb2JhbHMuaDoxMzI1Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IEtvbWVuZGEgamVzdCB6Ynl0IHNrb21wbGlrb3dhbmEiCisKKyM6IGdsb2JhbHMuaDoxMzI2Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IFpieXQgZLN1Z2EgbmF6d2EiCisKKyM6IGdsb2JhbHMuaDoxMzI3Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IFpieXQgd2llbGUgWyIKKworIzogZ2xvYmFscy5oOjEzMjgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogWmJ5dCB3aWVsZSBuYXp3IHBsaWvzdyIKKworIzogZ2xvYmFscy5oOjEzMjkKK21zZ2lkICJFNDg4OiBUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICJFNDg4OiBOYWRzdOpwbmUgem5hY3praSIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiBOaWV6bmFuYSB6YWuzYWRrYSIKKworIzogZ2xvYmFscy5oOjEzMzEKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6IE5pZSBtb2e5IHJvendpbrnmIHpuYWvzdyB3aWVsb3puYWN6bnljaCIKKworIzogZ2xvYmFscy5oOjEzMzMKK21zZ2lkICJFNTkxOiAnd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICJFNTkxOiAnd2luaGVpZ2h0JyBuaWUgbW+/ZSBieeYgbW5pZWpzemUgbmm/ICd3aW5taW5oZWlnaHQnIgorCisjOiBnbG9iYWxzLmg6MTMzNQorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgnIG5pZSBtb79lIGJ55iBtbmllanN6ZSBuab8gJ3dpbm1pbndpZHRoJyIKKworIzogZ2xvYmFscy5oOjEzMzgKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDogQrO5ZCB3IHRyYWtjaWUgemFwaXN1IgorCisjOiBnbG9iYWxzLmg6MTMzOQorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIlplcm93eSBsaWN6bmlrIgorCisjOiBnbG9iYWxzLmg6MTM0MQorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogVb95Y2llIDxTSUQ+IHBvemEga29udGVrc3RlbSBza3J5cHR1IgorCisjOiBnbG9iYWxzLmg6MTM0NAorbXNnaWQgIkU0NDk6IEludmFsaWQgZXhwcmVzc2lvbiByZWNlaXZlZCIKK21zZ3N0ciAiRTQ0OTogT2RlYnJhs2VtIG5pZXezYZxjaXdlIHd5cmG/ZW5pZSIKKworIzogZ2xvYmFscy5oOjEzNDcKK21zZ2lkICJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIKK21zZ3N0ciAiRTQ2MzogUmVnaW9uIGplc3QgY2hyb25pb255LCBuaWUgbW9n6iB6bWllbmnmIgorCmRpZmYgLS1naXQgYS9zcmMvcG8vcGwucG8gYi9zcmMvcG8vcGwucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9wbC5wbwpAQCAtMCwwICsxLDY1NzYgQEAKKyMgdHJhbnNsYXRpb24gb2YgcGwucG8gdG8gUG9saXNoCisjIFBvbGlzaCBUcmFuc2xhdGlvbiBmb3IgVmltCisjCisjIHVwZGF0ZWQgMjAwMSBmb3IgdmltLTYuMAorIyBGSVJTVCBBVVRIT1IgTWFyY2luIERhbGVja2kgPGRhbGVja2lAY3liZXIuY3MubmV0LnBsPiwgMjAwMC4KKyMgTWlrb2xhaiBNYWNob3dza2kgPG1pa21hY2hAd3AucGw+LCAyMDA0LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogcGxcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNC0wNS0yMyAyMTo0MSswMjAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wNS0yMyAyMjowMCswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNaWtvbGFqIE1hY2hvd3NraSA8bWlrbWFjaEB3cC5wbD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBQb2xpc2ggPHBsQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0yXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS45XG4iCisKKyM6IGJ1ZmZlci5jOjEwMgorbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogTmllIG1vZ+ogemFyZXplcndvd2HmIGJ1Zm9yYTsgemFrb/FjemVuaWUuLi4iCisKKyM6IGJ1ZmZlci5jOjEwNQorbXNnaWQgIkU4MzogQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciwgdXNpbmcgb3RoZXIgb25lLi4uIgorbXNnc3RyICJFODM6IE5pZSBtb2fqIHphcmV6ZXJ3b3dh5iBidWZvcmE7IHW/eXdhbSBpbm5lZ28uLi4iCisKKyM6IGJ1ZmZlci5jOjgwNQorbXNnaWQgIkU1MTU6IE5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiRTUxNTogTmllIHd5s2Fkb3dhbm8gv2FkbmVnbyBidWZvcmEiCisKKyM6IGJ1ZmZlci5jOjgwNworbXNnaWQgIkU1MTY6IE5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICJFNTE2OiBOaWUgc2thc293YW5vIL9hZG5lZ28gYnVmb3JhIgorCisjOiBidWZmZXIuYzo4MDkKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiBOaWUgd3lyenVjb25vIL9hZG5lZ28gYnVmb3JhIgorCisjOiBidWZmZXIuYzo4MTcKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAiMSBidWZvciB3ebNhZG93YW55IgorCisjOiBidWZmZXIuYzo4MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAid3mzYWRvd2FubyAlZCBidWZvcvN3IgorCisjOiBidWZmZXIuYzo4MjQKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICIxIGJ1Zm9yIHNrYXNvd2FueSIKKworIzogYnVmZmVyLmM6ODI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAiJWQgYnVmb3LzdyBza2Fzb3dhbm8iCisKKyM6IGJ1ZmZlci5jOjgzMQorbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAid3lyenVjb25vIDEgYnVmb3IgIgorCisjOiBidWZmZXIuYzo4MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgInd5cnp1Y29ubyAlZCBidWZvcvN3IgorCisjOiBidWZmZXIuYzo4OTQKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiBOaWUgem5hbGV6aW9ubyB6bWllbmlvbnljaCBidWZvcvN3IgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTMzCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IE5pZSBtYSB3eWxpc3Rvd2FueWNoIGJ1Zm9y83ciCisKKyM6IGJ1ZmZlci5jOjk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFODY6IEJ1ZmZlciAlbGQgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU4NjogQnVmb3IgXCIlbGRcIiBuaWUgaXN0bmllamUiCisKKyM6IGJ1ZmZlci5jOjk0OAorbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiBOaWUgbW9n6iBwcnplarbmIHBvemEgb3N0YXRuaSBidWZvciIKKworIzogYnVmZmVyLmM6OTUwCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiBOaWUgbW9n6iBwcnplarbmIHByemVkIHBpZXJ3c3p5IGJ1Zm9yIgorCisjOiBidWZmZXIuYzo5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODkgTmllIHphcGlzYW5vIHptaWFuIHcgYnVmb3J6ZSAlbGQgKHd5bXW2IHByemV6ICEpIgorCisjOiBidWZmZXIuYzoxMDA1Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IE5pZSBtb2fqIHd5s2Fkb3dh5iBvc3RhdG5pZWdvIGJ1Zm9yYSIKKworIzogYnVmZmVyLmM6MTUzOAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IE9TVFJaRa9FTklFOiBQcnplcGWzbmllbmllIGxpc3R5IG5hencgcGxpa/N3IgorCisjOiBidWZmZXIuYzoxNzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5MjogTmllIHpuYWxlemlvbm8gYnVmb3JhICVsZCIKKworIzogYnVmZmVyLmM6MTk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IFdpZWxva3JvdG5lIGRvcGFzb3dhbmlhIGRsYSAlcyIKKworIzogYnVmZmVyLmM6MTk0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogr2FkZW4gYnVmb3IgbmllIHBhc3VqZSBkbyAlcyIKKworIzogYnVmZmVyLmM6MjMzNworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAid2llcnN6ICVsZCIKKworIzogYnVmZmVyLmM6MjQyMAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IEJ1Zm9yIG8gdGVqIG5hendpZSBqdb8gaXN0bmllamUiCisKKyM6IGJ1ZmZlci5jOjI3MTMKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFtabWllbmlvbnldIgorCisjOiBidWZmZXIuYzoyNzE4Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbTmllIGVkeXRvd2FueV0iCisKKyM6IGJ1ZmZlci5jOjI3MjMKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbTm93eSBQbGlrXSIKKworIzogYnVmZmVyLmM6MjcyNAorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltCs7FkIG9kY3p5dHVdIgorCisjOiBidWZmZXIuYzoyNzI2IGZpbGVpby5jOjIxMTIKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbdHlsa28gb2Rjenl0XSIKKworIzogYnVmZmVyLmM6Mjc0NworIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIjEgd2llcnN6IC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIHdpZXJzemUgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIndpZXJzeiAlbGQgeiAlbGQgLS0lZCUlLS0ga29sICIKKworIzogYnVmZmVyLmM6Mjg2NAorbXNnaWQgIltObyBmaWxlXSIKK21zZ3N0ciAiW0JyYWsgcGxpa3VdIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI5MDQKK21zZ2lkICJoZWxwIgorbXNnc3RyICJwb21vYyIKKworIzogYnVmZmVyLmM6MzQ2MyBzY3JlZW4uYzo1MDc1Cittc2dpZCAiW2hlbHBdIgorbXNnc3RyICJbcG9tb2NdIgorCisjOiBidWZmZXIuYzozNDk1IHNjcmVlbi5jOjUwODEKK21zZ2lkICJbUHJldmlld10iCittc2dzdHIgIltQb2RnbLFkXSIKKworIzogYnVmZmVyLmM6Mzc3NQorbXNnaWQgIkFsbCIKK21zZ3N0ciAiV3N6eXN0a28iCisKKyM6IGJ1ZmZlci5jOjM3NzUKK21zZ2lkICJCb3QiCittc2dzdHIgIkTzsyIKKworIzogYnVmZmVyLmM6Mzc3NworbXNnaWQgIlRvcCIKK21zZ3N0ciAiR/NyYSIKKworIzogYnVmZmVyLmM6NDUyMworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBMaXN0YSBidWZvcvN3OlxuIgorCisjOiBidWZmZXIuYzo0NTU2Cittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJbTGlzdGEgQrPqZPN3XSIKKworIzogYnVmZmVyLmM6NDU2OSBtZW1saW5lLmM6MTUyMAorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW0JyYWsgUGxpa3VdIgorCisjOiBidWZmZXIuYzo0ODgyCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gWm5ha2kgLS0tIgorCisjOiBidWZmZXIuYzo0OTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIlpuYWtpIGRsYSAlczoiCisKKyM6IGJ1ZmZlci5jOjQ5MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIHdpZXJzej0lbGQgIGlkPSVkICBuYXp3YT0lcyIKKworIzogZGlmZi5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogTmllIG1vZ+ogenLzv25pY293YeYgd2nqY2VqIG5pvyAlbGQgYnVmb3LzdyIKKworIzogZGlmZi5jOjcwOQorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBOaWUgbW9n6iBzdHdvcnp55iBy879uaWMiCisKKyM6IGRpZmYuYzo4MTQKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJQbGlrILNhdGEiCisKKyM6IGRpZmYuYzoxMDY1Cittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiBOaWUgbW9n6iB3Y3p5dGHmIHd5arZjaWEgcvO/bmljeSIKKworIzogZGlmZi5jOjE4MTUKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogQmllv7FjeSBidWZvciBuaWUgamVzdCB3IHRyeWJpZSBy879uaWMiCisKKyM6IGRpZmYuYzoxODI3Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogQnJhayBpbm5lZ28gYnVmb3JhIHcgdHJ5YmllIHLzv25pYyIKKworIzogZGlmZi5jOjE4MzUKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IFdp6mNlaiBuab8gamVkZW4gYnVmb3IgdyB0cnliaWUgcvO/bmljb3dhbmlhLCBuaWUgd2llbSBrdPNyZWdvIHW/eeYiCisKKyM6IGRpZmYuYzoxODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogTmllIG1vZ+ogem5hbGW85iBidWZvcmEgXCIlc1wiIgorCisjOiBkaWZmLmM6MTg2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTAzOiBCdWZmZXIgXCIlc1wiIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDM6IEJ1Zm9yIFwiJXNcIiBuaWUgamVzdCB3IHRyeWJpZSBy879uaWNvd2FuaWEiCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IEVzY2FwZSBqZXN0IG5pZWRvendvbG9uZSB3IGR3dWdyYWZpZSIKKworIzogZGlncmFwaC5jOjIzODQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IE5pZSB6bmFsZXppb25vIHBsaWt1IHJvemuzYWR1IGtsYXdpc3p5IgorCisjOiBkaWdyYXBoLmM6MjQxMQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogWmFzdG9zb3dhbm8gOmxvYWRrZXltYXAgdyBuaWV3Y3p5dGFueW0gcGxpa3UiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgRG9wZbNuaWFuaWUgc7PzdyBrbHVjem93eWNoICheTl5QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCittc2dzdHIgIiBeWCB0cnliICheRV5ZXkxeXV5GXkleS15EXlZeTl5QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgTG9rYWxuZSBkb3Bls25pYW5pZSBzs/N3IGtsdWN6b3d5Y2ggKF5OXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTF5OXlApIgorbXNnc3RyICIgRG9wZbNuaWFuaWUgcGWzbnljaCB3aWVyc3p5ICheTF5OXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GXk5eUCkiCittc2dzdHIgIiBEb3Bls25pYW5pZSBuYXp3IHBsaWvzdyAoXkZeTl5QKSIKKworIzogZWRpdC5jOjQ3Cittc2dpZCAiIFRhZyBjb21wbGV0aW9uICheXV5OXlApIgorbXNnc3RyICIgRG9wZbNuaWFuaWUgem5hY3puaWvzdyAoXl1eTl5QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHd6b3Jj83cgdHJvcPN3ICheTl5QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkReTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIGRlZmluaWNqaSAoXkReTl5QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXkteTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHplIHOzb3duaWvzdyAoXkteTl5QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVF5OXlApIgorbXNnc3RyICIgRG9wZbNuaWFuaWUgeiB0ZXphdXJ1c2EgKF5UXk5eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlZeTl5QKSIKK21zZ3N0ciAiIERvcGWzbmlhbmllIHdpZXJzemEgcG9sZWNl8SAoXlZeTl5QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIkRvYmmzZW0gZG8ga2/xY2EgYWthcGl0dSIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAib3BjamEgJ3RoZXNhdXJ1cycgamVzdCBwdXN0YSIKKworIzogZWRpdC5jOjExNjYKK21zZ2lkICInZGljdGlvbmFyeScgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJvcGNqYSAnZGljdGlvbmFyeScgamVzdCBwdXN0YSIKKworIzogZWRpdC5jOjIxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIlByemVnbLFkYW0gc7Nvd25pazogJXMiCisKKyM6IGVkaXQuYzoyMzY4Cittc2dpZCAiIChpbnNlcnQpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHdwcm93YWR6YW5pZSkgUHJ6ZXdpamFuaWUgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzNzAKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKHphbWlhbmEpIFByemV3aWphbmllICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiUHJ6ZWdssWRhbTogJXMiCisKKyM6IGVkaXQuYzoyNzE5Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIlByemVnbLFkYW0gem5hY3puaWtpLiIKKworIzogZWRpdC5jOjMzODEKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIgRG9kYWrqIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjM0MzAKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIFN6dWthbS4uLiIKKworIzogZWRpdC5jOjM0ODYKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICJaIHBvd3JvdGVtIG5hIHBpZXJ3b3RueW0iCisKKyM6IGVkaXQuYzozNDkxCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIld5cmF6IHogaW5uZWdvIHdpZXJzemEiCisKKyM6IGVkaXQuYzozNDk2Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgIkplZHluZSBkb3Bhc293YW5pZSIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgInBhc3VqZSAlZCB6ICVkIgorCisjOiBlZGl0LmM6MzU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAicGFzdWplICVkIgorCisjLiBTa2lwIGZ1cnRoZXIgYXJndW1lbnRzIGJ1dCBkbyBjb250aW51ZSB0bworIy4gKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4KKyM6IGV2YWwuYzoxMDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogTmllem5hbmEgem1pZW5uYTogXCIlc1wiIgorCisjOiBldmFsLmM6MTMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IEJyYWsgbmF3aWFz83c6ICVzIgorCisjOiBldmFsLmM6MTQzNSBldmFsLmM6MTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IE5pZSBpc3RuaWVqZSB6bWllbm5hOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNzA1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBCcmFrICc6JyBwbyAnPyciCisKKyM6IGV2YWwuYzoyMzI3Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IEJyYWsgJyknIgorCisjOiBldmFsLmM6MjM4OQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBCcmFrICddJyIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IEJyYWsgbmF6d3kgb3Bjamk6ICVzIgorCisjOiBldmFsLmM6MjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE5pZXpuYW5hIG9wY2phOiAlcyIKKworIzogZXZhbC5jOjI1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IEJyYWsgY3Vkenlzs293dTogJXMiCisKKyM6IGV2YWwuYzoyNjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBCcmFrIGN1ZHp5c7Nvd3U6ICVzIgorCisjOiBldmFsLmM6MzA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IE5pZXezYbZjaXdlIGFyZ3VtZW50eSBkbGEgZnVua2NqaSAlcyIKKworIzogZXZhbC5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IE5pZXpuYW5hIGZ1bmtjamE6ICVzIgorCisjOiBldmFsLmM6MzA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODogWmJ5dCB3aWVsZSBhcmd1bWVudPN3IGRsYSBmdW5rY2ppOiAlcyIKKworIzogZXZhbC5jOjMwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTogWmEgbWGzbyBhcmd1bWVudPN3IGRsYSBmdW5rY2ppOiAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiBaYXN0b3Nvd2FubyA8U0lEPiBwb3phIHNrcnlwdGVtOiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzY4NyBndWkuYzo0Mzc2IGd1aV9ndGsuYzoyMDU5Cittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGV2YWwuYzo0MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIHdpZXJzenk6ICIKKworIzogZXZhbC5jOjU0NzcKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPS1xuIgorIiZaYWtv8WN6IgorCisjOiBldmFsLmM6NTUxNworbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgInd5d2+zYW5vIGlucHV0cmVzdG9yZSgpIHdp6mNlaiByYXp5IG5pvyBpbnB1dHNhdmUoKSIKKworIzogZXZhbC5jOjU5NzcKK21zZ2lkICJFNjU1OiBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyAoY3ljbGU/KSIKK21zZ3N0ciAiRTY1NTogWmEgZHW/byBkb3dpsXph8SBzeW1ib2xpY3pueWNoIChw6nRsYT8pIgorCisjOiBldmFsLmM6NjYwOQorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogQnJhayBwb7OxY3plbmlhIHogc2Vyd2VyZW0gVmltIgorCisjOiBldmFsLmM6NjcwNgorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiBOaWUgbW9n6iBjenl0YeYgb2Rwb3dpZWR6aSBzZXJ3ZXJhIgorCisjOiBldmFsLmM6NjczNAorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODogTmllIG1vZ+ogd3lzs2HmIGRvIGtsaWVudGEiCisKKyM6IGV2YWwuYzo2NzgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiBOaWUgbW9n6iB3eXOzYeYgZG8gJXMiCisKKyM6IGV2YWwuYzo2ODgyCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIoTmlld7NhtmNpd2UpIgorCisjOiBldmFsLmM6ODA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiBOaWVva3JltmxvbmEgem1pZW5uYTogJXMiCisKKyM6IGV2YWwuYzo4NDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0MTg6IE5pZWRvendvbG9uYSBuYXp3YSB6bWllbm5lajogJXMiCisKKyM6IGV2YWwuYzo4Nzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTIyOiBGdW5rY2phICVzIGp1vyBpc3RuaWVqZTsgYWJ5IGqxIHphbWllbmnmIHW/eWogISIKKworIzogZXZhbC5jOjg4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogTmllb2tyZbZsb25hIGZ1bmtjamE6ICVzIgorCisjOiBldmFsLmM6ODg3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IEJyYWsgJygnOiAlcyIKKworIzogZXZhbC5jOjg5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IE5pZWRvendvbG9ueSBhcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo4OTgyCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IEJyYWsgOmVuZGZ1bmN0aW9uIgorCisjOiBldmFsLmM6OTA4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzogTmllIG1vZ+ogcHJ6ZWRlZmluaW93YeYgZnVua2NqaSAlczogamVzdCB3IHW/eWNpdSIKKworIzogZXZhbC5jOjkxNTkKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiBXeW1hZ2FuYSBqZXN0IG5hendhIGZ1bmtjamkiCisKKyM6IGV2YWwuYzo5MjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjg6IEZ1bmN0aW9uIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgY2FwaXRhbDogJXMiCittc2dzdHIgIkUxMjg6IE5hendhIGZ1bmtjamkgbXVzaSByb3pwb2N6eW5h5iBzaeogZHW/sSBsaXRlcrE6ICVzIgorCisjOiBldmFsLmM6OTQwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBOaWVva3JltmxvbmEgZnVua2NqYTogJXMiCisKKyM6IGV2YWwuYzo5NDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogTmllIG1vZ+ogc2thc293YeYgZnVua2NqaSAlczogamVzdCB3IHW/eWNpdSIKKworIzogZXZhbC5jOjk0NTUKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiBaYWduaWW/ZL9lbmllIHd5d2+zYfEgZnVua2NqaSBwb25hZCAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICJ3eXdvs3Vq6iAlcyIKKworIzogZXZhbC5jOjk1NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgYWJvcnRlZCIKK21zZ3N0ciAicG9yenVjb25vICVzIgorCisjOiBldmFsLmM6OTU3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgendyYWNhICMlbGQiCisKKyM6IGV2YWwuYzo5NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIHp3cmFjYSBcIiVzXCIiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1OTUgZXhfY21kczIuYzoyMzY1CisjLCBjLWZvcm1hdAorbXNnaWQgImNvbnRpbnVpbmcgaW4gJXMiCittc2dzdHIgImtvbnR5bnVhY2phIHcgJXMiCisKKyM6IGV2YWwuYzo5NjIxCittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gcG96YSBmdW5rY2qxIgorCisjOiBldmFsLmM6OTk1MgorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIHptaWVubmUgZ2xvYmFsbmU6XG4iCisKKyM6IGV4X2NtZHMyLmM6OTIKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBjb250aW51ZS4iCittc2dzdHIgIldjaG9keuogdyB0cnliIG9kcGx1c2t3aWFuaWEuIFdwcm93YWS8IFwiY29udFwiIGFieSBrb250eW51b3dh5i4iCisKKyM6IGV4X2NtZHMyLmM6OTYgZXhfZG9jbWQuYzo5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICJ3aWVyc3ogJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo5OAorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJjbWQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJQdW5rdCBrb250cm9sbnkgdyBcIiVzJXNcIiB3aWVyc3ogJWxkIgorCisjOiBleF9jbWRzMi5jOjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IE5pZSB6bmFsZXppb25vIHB1bmt0dSBrb250cm9sbmVnbzogJXMiCisKKyM6IGV4X2NtZHMyLmM6NTY2Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAiTmllIG9rcmW2bG9ubyC/YWRueWNoIHB1bmt083cga29udHJvbG55Y2giCisKKyM6IGV4X2NtZHMyLmM6NTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiUzZCAgJXMgJXMgIGxpbmUgJWxkIgorbXNnc3RyICIlM2QgICVzICVzICB3aWVyc3ogJWxkIgorCisjOiBleF9jbWRzMi5jOjc2MyBleF9jbWRzLmM6MjA5NyBleF9jbWRzLmM6MjM2MgorbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIlphcGlzeiBqYWtvIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICJaYWNob3dhaiB6bWlhbnkgdyBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6Nzg4IGV4X2RvY21kLmM6OTM4MAorbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICJCZXogVHl0dbN1IgorCisjOiBleF9jbWRzMi5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2MjogTmllIHphcGlzYW5vIHptaWFuIHcgYnVmb3J6ZSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6OTg0Cittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICJPU1RSWkWvRU5JRTogTmllb2N6ZWtpd2FuZSB3ZWq2Y2llIHcgaW5ueSBidWZvciAoc3ByYXdkvCBhdXRva29tZW5keSkiCisKKyM6IGV4X2NtZHMyLmM6MTM4NworbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogVHlsa28gamVkZW4gcGxpayB3IGVkeWNqaSIKKworIzogZXhfY21kczIuYzoxMzg5Cittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBOaWUgbW+/bmEgcHJ6ZWq25iBwcnplZCBwaWVyd3N6eSBwbGlrIgorCisjOiBleF9jbWRzMi5jOjEzOTEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogTmllIG1vv25hIHByemVqtuYgemEgb3N0YXRuaSBwbGlrIgorCisjOiBleF9jbWRzMi5jOjE4MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2NjogY29tcGlsZXIgbm90IHN1cHBvcnRlZDogJXMiCittc2dzdHIgIkU2NjY6IG5pZSB3c3BpZXJhbnkga29tcGlsYXRvcjogJXMiCisKKyM6IGV4X2NtZHMyLmM6MTg5NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIlN6dWthbmllIFwiJXNcIiB3IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICJTenVrYW5pZSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgZm91bmQgaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorbXNnc3RyICJuaWUgem5hbGV6aW9ubyB3ICdydW50aW1lcGF0aCc6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTc0Cittc2dpZCAiU291cmNlIFZpbSBzY3JpcHQiCittc2dzdHIgIldjenl0YWogc2tyeXB0IFZpbWEiCisKKyM6IGV4X2NtZHMyLmM6MjE2NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc291cmNlIGEgZGlyZWN0b3J5OiBcIiVzXCIiCittc2dzdHIgIk5pZSBtb79uYSB3Y3p5dGHmIGthdGFsb2d1OiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIwMgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAibmllIG1vZ7NlbSB3Y3p5dGHmIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAid2llcnN6OiAlbGQgbmllIG1vZ7NlbSB3Y3p5dGHmIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjE4CisjLCBjLWZvcm1hdAorbXNnaWQgInNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAid2N6eXR5d2FuaWUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAid2llcnN6ICVsZDogd2N6eXR5d2FuaWUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgInNrb/Fjem9ubyB3Y3p5dHl3YW5pZSAlcyIKKworIzogZXhfY21kczIuYzoyNzA3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTogT1NUUlpFr0VOSUU6IE5pZXezYbZjaXd5IHNlcGFyYXRvciB3aWVyc3p5LCBwZXduaWUgYnJhayBeTSIKKworIzogZXhfY21kczIuYzoyNzU2Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2Nzogdb95dG8gOnNjcmlwdGVuY29kaW5nIHBvemEgd2N6eXR5d2FueW0gcGxpa2llbSIKKworIzogZXhfY21kczIuYzoyNzg5Cittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IHW/eXRvIDpmaW5pc2ggcG96YSB3Y3p5dHl3YW55bSBwbGlraWVtIgorCisjOiBleF9jbWRzMi5jOjMyMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGFnZSAlZCIKK21zZ3N0ciAiU3Ryb25hICVkIgorCisjOiBleF9jbWRzMi5jOjMzOTQKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIkJyYWsgdGVrc3R1IGRvIGRydWtvd2FuaWEiCisKKyM6IGV4X2NtZHMyLmM6MzQ3MgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAiRHJ1a3Vq6iBzdHJvbuogJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjM0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIiBLb3BpYSAlZCB6ICVkIgorCisjOiBleF9jbWRzMi5jOjM1NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIld5ZHJ1a293YW5vOiAlcyIKKworIzogZXhfY21kczIuYzozNTQ5Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiRHJ1a293YW5pZSBvZHdvs2FuZSIKKworIzogZXhfY21kczIuYzozOTE0Cittc2dpZCAiRTQ1NTogRXJyb3Igd3JpdGluZyB0byBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFNDU1OiBOaWUgbW+/bmEgemFwaXNh5iBkbyB3eWq2Y2lvd2VnbyBwbGlrdSBQb3N0U2NyaXB0dSIKKworIzogZXhfY21kczIuYzo0MTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MTk5IGV4X2NtZHMyLmM6NDgyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IE5pZSBtb79uYSBvZGN6eXRh5iBwbGlrdSB6YXNvYvN3IFBvc3RTY3JpcHR1IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTg6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxODogcGxpayBcIiVzXCIgbmllIGplc3QgcGxpa2llbSB6YXNvYvN3IFBvc3RTY3JpcHR1IgorCisjOiBleF9jbWRzMi5jOjQyMjIgZXhfY21kczIuYzo0MjQyIGV4X2NtZHMyLmM6NDI1NyBleF9jbWRzMi5jOjQyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOTogZmlsZSBcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxOTogcGxpayBcIiVzXCIgbmllIGplc3Qgd3NwaWVyYW55bSBwbGlraWVtIHphc29i83cgUG9zdFNjcmlwdHUiCisKKyM6IGV4X2NtZHMyLmM6NDMwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjIxOiBcIiVzXCIgcmVzb3VyY2UgZmlsZSBoYXMgd3JvbmcgdmVyc2lvbiIKK21zZ3N0ciAiRTYyMTogXCIlc1wiIG5pZXByYXdpZLNvd2Egd2Vyc2phIHBsaWt1IHphc29i83ciCisKKyM6IGV4X2NtZHMyLmM6NDc3NgorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDogTmllIG1vv25hIG90d29yennmIHBsaWt1IFBvc3RTY3JpcHQgZG8gd3lqtmNpYSIKKworIzogZXhfY21kczIuYzo0ODA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0OTI4Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIKK21zZ3N0ciAiRTQ1NjogTmllIG1vv25hIHpuYWxlvOYgcGxpa3UgemFzb2LzdyBQb3N0U2NyaXB0dSBcInByb2xvZy5wc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIgorbXNnc3RyICJFNDU2OiBOaWUgbW+/bmEgem5hbGW85iBwbGlrdSB6YXNvYvN3IFBvc3RTY3JpcHR1IFwiJXMucHNcIiIKKworIzogZXhfY21kczIuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gbXVsdGktYnl0ZSB0byBcIiVzXCIgZW5jb2RpbmciCittc2dzdHIgIkU2MjA6IE5pZSBtb79uYSBwcnpla29ud2VydG93YeYgeiBtdWx0aS1ieXRlIGRvIGtvZG93YW5pYSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTEwMgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAiUHJ6ZXN5s2FtIGRvIGRydWthcmtpLi4uIgorCisjOiBleF9jbWRzMi5jOjUxMDYKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiBEcnVrb3dhbmllIHBsaWt1IFBvc3RTY3JpcHQgbmllIHBvd2lvZLNvIHNp6iIKKworIzogZXhfY21kczIuYzo1MTA4Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJaYWRhbmllIGRydWtvd2FuaWUgcHJ6ZXOzYW5lLiIKKworIzogZXhfY21kczIuYzo1NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICJCaWW/sWN5ICVzaup6eWs6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo1NjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBOaWUgbW9n6iB1c3Rhd2nmIGrqenlrYSBuYSBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2t0YWwgJTAzbyIKKworIzogZXhfY21kcy5jOjExOAorIywgYy1mb3JtYXQKK21zZ2lkICI+ICVkLCBIZXggJTA0eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIEhleCAlMDR4LCAgT2t0YWwgJW8iCisKKyM6IGV4X2NtZHMuYzoxMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiPiAlZCwgSGV4ICUwOHgsIE9jdGFsICVvIgorbXNnc3RyICI+ICVkLCBIZXggJTA4eCwgT2t0YWwgJW8iCisKKyM6IGV4X2NtZHMuYzo0MzAKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogUHJ6ZW5pZXNpZW5pZSB3aWVyc3p5IG5hIHNpZWJpZSBzYW15Y2giCisKKyM6IGV4X2NtZHMuYzo0OTkKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIjEgd2llcnN6IHByemVuaWVzaW9ueSIKKworIzogZXhfY21kcy5jOjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgIiVsZCB3aWVyc3plIHByemVuaWVzaW9uZSIKKworIzogZXhfY21kcy5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCB3aWVyc3p5IHByemVmaWx0cm93YW55Y2giCisKKyM6IGV4X2NtZHMuYzo5NTIKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiBBdXRva29tZW5keSAqRmlsdGVyKiBuaWUgbW9nsSB6bWllbmlh5iBiaWW/sWNlZ28gYnVmb3JhIgorCisjOiBleF9jbWRzLmM6MTAzNworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW0JyYWsgemFwaXN1IG9kIGN6YXN1IG9zdGF0bmllaiB6bWlhbnldXG4iCisKKyM6IGV4X2NtZHMuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzIHcgd2llcnN6dTogIgorCisjOiBleF9jbWRzLmM6MTI4OAorbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiBaYnl0IHdpZWxlIGKz6mTzdzsgcG9taWphbSByZXN6dOogcGxpa3UiCisKKyM6IGV4X2NtZHMuYzoxMzIzCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAiV2N6eXR1auogcGxpayB2aW1pbmZvIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEzMjQKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIGluZm9ybWFjamEiCisKKyM6IGV4X2NtZHMuYzoxMzI1Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgemFrs2Fka2kiCisKKyM6IGV4X2NtZHMuYzoxMzI2Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIE5JRSBQT1dJT0SjTyBTScoiCisKKyM6IGV4X2NtZHMuYzoxNDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBQbGlrIHZpbWluZm8gamVzdCBuaWV6YXBpc3l3YWxueTogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IE5pZSBtb2fqIHphcGlzYeYgcGxpa3UgdmltaW5mbyAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiWmFwaXN1auogcGxpayB2aW1pbmZvIFwiJXNcIiIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTY0OQorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIFRlbiBwbGlrIHZpbWluZm8gem9zdGGzIHd5Z2VuZXJvd2FueSBwcnpleiBWaW1hICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgTW+/ZXN6IGdvIG9zdHJvv25pZSBlZHl0b3dh5iFcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyBXYXJ0b7bmICdlbmNvZGluZycgdyBjemFzaWUgemFwc3UgdGVnbyBwbGlrdVxuIgorCisjOiBleF9jbWRzLmM6MTc1MgorbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAiTmllZG9wdXN6Y3phbG55IHBvY3qxdGtvd3kgem5hayIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTQwCittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IFBsaWsgamVzdCB6YbNhZG93YW55IHcgaW5ueW0gYnVmb3J6ZSIKKworIzogZXhfY21kcy5jOjIxNzQKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICJaYXBpc2HmIGN66rZjaW93byBwbGlrPyIKKworIzogZXhfY21kcy5jOjIxODEKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogU3Rvc3VqICEgZG8gemFwaXNhbmlhIGN66rZjaW93byBidWZvcmEiCisKKyM6IGV4X2NtZHMuYzoyMjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAiTmFkcGlzYeYgaXN0bmllarFjeSBwbGlrIFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiBCcmFrIG5hend5IHBsaWt1IGRsYSBidWZvcmEgJWxkIgorCisjOiBleF9jbWRzLmM6MjQwNQorbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IFBsaWsgbmllemFwaXNhbnk6IFphcGlzIGplc3Qgd3mzsWN6b255IG9wY2qxICd3cml0ZSciCisKKyM6IGV4X2NtZHMuYzoyNDI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyJvcGNqYSAncmVhZG9ubHknIG5hc3Rhd2lvbmEgZGxhIFwiJS4qc1wiLlxuIgorIkN6eSBjaGNlc3ogZ28gcG9taW1vIHRlZ28gemFwaXNh5j8iCisKKyM6IGV4X2NtZHMuYzoyNTk3Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICJFZHl0dWogUGxpayIKKworIzogZXhfY21kcy5jOjMyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9rb21lbmR5IG5pZW9jemVraXdhbmllIHNrYXNvd2GzeSBub3d5IGJ1Zm9yICVzIgorCisjOiBleF9jbWRzLmM6MzMzOQorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiBuaWVudW1lcnljem55IGFyZ3VtZW50IGRsYSA6eiIKKworIzogZXhfY21kcy5jOjM0MjQKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBLb21lbmR5IHBvd7Nva2kgc7EgbmllZG96d29sb25lIHcgcnZpbSIKKworIzogZXhfY21kcy5jOjM1MzEKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiBXem9yY2UgcmVndWxhcm5lIG5pZSBtb2exIGJ55iByb3pncmFuaWN6YW5lIGxpdGVyYW1pIgorCisjOiBleF9jbWRzLmM6Mzg3NworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICJ6YW1pZfEgbmEgJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDI2NgorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIoUHJ6ZXJ3YW5lKSAiCisKKyM6IGV4X2NtZHMuYzo0MjcwCittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIjEgcG9kc3Rhd2llbmllICIKKworIzogZXhfY21kcy5jOjQyNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBwb2RzdGF3aWXxIgorCisjOiBleF9jbWRzLmM6NDI3NQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiB3IDEgd2llcnN6dSIKKworIzogZXhfY21kcy5jOjQyNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiIHcgJWxkIHdpZXJzemFjaCIKKworIzogZXhfY21kcy5jOjQzMjgKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IE5pZSBtb2fqIHd5a29uYeYgOmdsb2JhbCByZWt1cnN5d25pZSIKKworIzogZXhfY21kcy5jOjQzNjMKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogQnJhayB3em9yY2EgcmVndWxhcm5lZ28gdyA6Z2xvYmFsIgorCisjIGMtZm9ybWF0CisjOiBleF9jbWRzLmM6NDQxMgorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICJXem9yemVjIHpuYWxlemlvbm8gdyBrYb9keW0gd2llcnN6dTogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDkzCittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBPc3RhdG5pIHBvZHN0YXdpYW55IGNpsWc6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ1OTQgZXhfZG9jbWQuYzoyMDExCittc2dpZCAiRTQ3ODogRG9uJ3QgcGFuaWMhIgorbXNnc3RyICJFNDc4OiBOaWUgcGFuaWt1aiEiCisKKyM6IGV4X2NtZHMuYzo0NjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjE6IFNvcnJ5LCBubyAnJXMnIGhlbHAgZm9yICVzIgorbXNnc3RyICJFNjYxOiBQcnp5a3JvIG1pLCBicmFrICclcycgcG9tb2N5IGRsYSAlcyIKKworIzogZXhfY21kcy5jOjQ2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiBQcnp5a3JvIG1pLCBhbGUgYnJhayBwb21vY3kgbyAlcyIKKworIzogZXhfY21kcy5jOjQ2ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICJQcnp5a3JvIG1pLCBuaWUgbWEgcGxpa3UgcG9tb2N5IFwiJXNcIiIKKworIzogZXhfY21kcy5jOjUxNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogTmllIGplc3Qga2F0YWxvZ2llbTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBOaWUgbW9n6iBvdHdvcnp55iAlcyBkbyB6YXBpc3UiCisKKyM6IGV4X2NtZHMuYzo1MzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiBOaWUgbW9n6iBvdHdvcnp55iAlcyBkbyBvZGN6eXR1IgorCisjOiBleF9jbWRzLmM6NTM2MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjcwOiBNaXggb2YgaGVscCBmaWxlIGVuY29kaW5ncyB3aXRoaW4gYSBsYW5ndWFnZTogJXMiCittc2dzdHIgIkU2NzA6IE1pZXN6YW5rYSBrb2Rvd2HxIHcgcGxpa3UgcG9tb2N5IHcgcmFtYWNoIGrqenlrYTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IER3dWtyb3RueSB6bmFjem5payBcIiVzXCIgdyBwbGlrdSAlcyIKKworIzogZXhfY21kcy5jOjU1NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiBOaWV6bmFuYSBrb21lbmRhIHpuYWt1OiAlcyIKKworIzogZXhfY21kcy5jOjU1NzMKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1NjogQnJhayBuYXp3eSB6bmFrdSIKKworIzogZXhfY21kcy5jOjU2MTkKK21zZ2lkICJFNjEyOiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFMjU1OiBaYnl0IHdpZWxlIG5hencgem5ha/N3IgorCisjOiBleF9jbWRzLmM6NTY4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IE5pZXezYbZjaXd5IHRla3N0IHpuYWt1OiAlcyIKKworIzogZXhfY21kcy5jOjU3MTggZXhfY21kcy5jOjU5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogTmllem5hbnkgem5hazogJXMiCisKKyM6IGV4X2NtZHMuYzo1NzY3Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTogQnJhayBudW1lcnUgem5ha3UiCisKKyM6IGV4X2NtZHMuYzo1ODQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiBOaWV3s2G2Y2l3YSBuYXp3YSBidWZvcmE6ICVzIgorCisjOiBleF9jbWRzLmM6NTg4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogTmlld7NhtmNpd2UgSUQgem5ha3U6ICVsZCIKKworIzogZXhfY21kcy5jOjU5NTgKK21zZ2lkICIgKE5PVCBGT1VORCkiCittc2dzdHIgIiAoTklFIFpOQUxFWklPTk8pIgorCisjOiBleF9jbWRzLmM6NTk2MAorbXNnaWQgIiAobm90IHN1cHBvcnRlZCkiCittc2dzdHIgIihuaWUgd3Nwb21hZ2FuZSkiCisKKyM6IGV4X2NtZHMuYzo2MDU5Cittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJbU2thc293YW5vXSIKKworIzogZXhfZG9jbWQuYzo1MjUKK21zZ2lkICJFbnRlcmluZyBFeCBtb2RlLiAgVHlwZSBcInZpc3VhbFwiIHRvIGdvIHRvIE5vcm1hbCBtb2RlLiIKK21zZ3N0ciAiV2Nob2R66iB3IHRyeWIgRXguIFdwcm93YWS8IFwidmlzdWFsXCIgYWJ5IHByemVqtuYgZG8gdHJ5YnUgTm9ybWFsLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTYxCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IE5hIGtv8WN1IHBsaWt1IgorCisjOiBleF9kb2NtZC5jOjY2OQorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTogS29tZW5kYSB6Ynl0IHJla3Vyc3l3bmEiCisKKyM6IGV4X2RvY21kLmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA1OiBFeGNlcHRpb24gbm90IGNhdWdodDogJXMiCittc2dzdHIgIkU2MDU6IE5pZSB6bmFsZXppb25vIHd5arF0a3U6ICVzIgorCisjOiBleF9kb2NtZC5jOjEzMTcKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICJLb25pZWMgd2N6eXR5d2FuZWdvIHBsaWt1IgorCisjOiBleF9kb2NtZC5jOjEzMTgKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIktvbmllYyBmdW5rY2ppIgorCisjOiBleF9kb2NtZC5jOjE5MDcKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiBOaWVqZWRub3puYWN6bmUgemFzdG9zb3dhbmllIGtvbWVuZHkgemRlZmluaW93YW5laiBwcnpleiB1v3l0a293bmlrYSIKKworIzogZXhfZG9jbWQuYzoxOTIxCittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFNDkyOiBOaWUgamVzdCBrb21lbmSxIGVkeXRvcmEiCisKKyM6IGV4X2RvY21kLmM6MjAzMAorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5MzogRGFubyB3c3RlY3pueSB6YWtyZXMiCisKKyM6IGV4X2RvY21kLmM6MjAzOQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAiRGFubyB3c3RlY3pueSB6YWtyZXM7IHphbWlhbmEgamVzdCBtb79saXdhIgorCisjOiBleF9kb2NtZC5jOjIxNjIKK21zZ2lkICJFNDk0OiBVc2UgdyBvciB3Pj4iCittc2dzdHIgIkU0OTQ6IFN0b3N1aiB3IGx1YiB3Pj4iCisKKyM6IGV4X2RvY21kLmM6Mzc4OAorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogUHJ6eWtybyBtaSwgYWxlIHRhIGtvbWVuZGEgbmllIGplc3QgZG9zdOpwbmEgdyB0ZWogd2Vyc2ppIgorCisjOiBleF9kb2NtZC5jOjM5OTEKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogVHlsa28gcG9qZWR5bmN6YSBuYXp3YSBwbGlrdSBkb3p3b2xvbmEiCisKKyM6IGV4X2RvY21kLmM6NDU3MQorbXNnaWQgIjEgbW9yZSBmaWxlIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIjEgd2nqY2VqIHBsaWsgZG8gZWR5Y2ppLiAgTWltbyB0byB3eWq25j8iCisKKyM6IGV4X2RvY21kLmM6NDU3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgImplc3pjemUgJWQgcGxpa/N3IGRvIGVkeWNqaS4gIE1pbW8gdG8gd3lqtuY/IgorCisjOiBleF9kb2NtZC5jOjQ1ODEKK21zZ2lkICJFMTczOiAxIG1vcmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTczOiAxIHdp6mNlaiBwbGlrIGRvIGVkeWNqaSIKKworIzogZXhfZG9jbWQuYzo0NTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IGplc3pjemUgJWxkIHBsaWvzdyBkbyBlZHljamkiCisKKyM6IGV4X2RvY21kLmM6NDY3OAorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxNzQ6IEtvbWVuZGEganW/IGlzdG5pZWplOyBhYnkgarEgcHJ6ZWRlZmluaW93YeYgc3Rvc3VqICEiCisKKyM6IGV4X2RvY21kLmM6NDc4OQorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICBOYXp3YSAgICAgICBBcmcuIFphay4gIEdvdG93b7bmICBEZWZpbmljamEiCisKKyM6IGV4X2RvY21kLmM6NDg3OAorbXNnaWQgIk5vIHVzZXItZGVmaW5lZCBjb21tYW5kcyBmb3VuZCIKK21zZ3N0ciAiTmllIHpuYWxlemlvbm8ga29tZW5kIHpkZWZpbmlvd2FueWNoIHByemV6IHW/eXRrb3duaWthIgorCisjOiBleF9kb2NtZC5jOjQ5MTAKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBOaWUgb2tyZbZsb25vIGF0cnlidXR1IgorCisjOiBleF9kb2NtZC5jOjQ5NjIKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IE5pZXezYbZjaXdhIGlsb7bmIGFyZ3VtZW5083ciCisKKyM6IGV4X2RvY21kLmM6NDk3NworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IE1ub79uaWsgbmllIG1vv2UgYnnmIHBvZGFueSBkd3Vrcm90bmllIgorCisjOiBleF9kb2NtZC5jOjQ5ODcKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBOaWV3s2G2Y2l3YSBkb215tmxuYSB3YXJ0b7bmIG1ub79uaWthIgorCisjOiBleF9kb2NtZC5jOjUwMTgKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IGFyZ3VtZW50IHd5bWFnYW55IGRvIGRvcGWzbmlhbmlhIgorCisjOiBleF9kb2NtZC5jOjUwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IE5pZXezYbZjaXdhIHdhcnRvtuYgZG9wZbNuaWFuaWE6ICVzIgorCisjOiBleF9kb2NtZC5jOjUwNTkKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIkU0Njg6IEFyZ3VtZW50IGRlcGWzbmlhbmlhIGRvendvbG9ueSB3ebOxY3puaWUgZGxhIGRvcGWzbmlhbmlhIHW/eXRrb3duaWthIgorCisjOiBleF9kb2NtZC5jOjUwNjUKK21zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgorbXNnc3RyICJFNDY3OiBEb3Bls25pYW5pZSB1v3l0a293bmlrYSB3eW1hZ2EgZnVua2NqaSBqYWtvIGFyZ3VtZW50dSIKKworIzogZXhfZG9jbWQuYzo1MDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODE6IEludmFsaWQgYXR0cmlidXRlOiAlcyIKK21zZ3N0ciAiRTE4MTogTmlld7NhtmNpd3kgYXRyeWJ1dDogJXMiCisKKyM6IGV4X2RvY21kLmM6NTExOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiBOaWV3s2G2Y2l3YSBuYXp3YSBrb21lbmR5IgorCisjOiBleF9kb2NtZC5jOjUxMzQKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIiIKKyJFMTgzOiBLb21lbmR5IHpkZWZpbmlvd2FuZSBwcnpleiB1v3l0a293bmlrYSBtdXN6sSByb3pwb2N6eW5h5iBzaeogZHW/sSAiCisibGl0ZXKxIgorCisjOiBleF9kb2NtZC5jOjUyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IE5pZSBtYSB0YWtpZWoga29tZW5keSB1v3l0a293bmlrYTogJXMiCisKKyM6IGV4X2RvY21kLmM6NTY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCittc2dzdHIgIkUxODU6IE5pZSBtb2fqIHpuYWxlvOYgemVzdGF3dSBrb2xvcvN3ICVzIgorCisjOiBleF9kb2NtZC5jOjU2NzQKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAiV2l0YWogdb95dGtvd25pa3UgVmltYSEiCisKKyM6IGV4X2RvY21kLmM6NjM5MQorbXNnaWQgIkVkaXQgRmlsZSBpbiBuZXcgd2luZG93IgorbXNnc3RyICJFZHl0dWogcGxpayB3IG5vd3ltIG9rbmllIgorCisjOiBleF9kb2NtZC5jOjY2ODYKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIkJyYWsgcGxpa3Ugd3ltaWFueSIKKworIzogZXhfZG9jbWQuYzo2NzkwCittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIkRvs7FjeiBwbGlrIgorCisjOiBleF9kb2NtZC5jOjY4NTQKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IE5pZSBtYSBwb3ByemVkbmllZ28ga2F0YWxvZ3UiCisKKyM6IGV4X2RvY21kLmM6NjkzNgorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IE5pZXpuYW55IgorCisjOiBleF9kb2NtZC5jOjcwMjEKK21zZ2lkICJFNDY1OiA6d2luc2l6ZSByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NTogOndpbnNpemUgd3ltYWdhIGR382NoIGFyZ3VtZW5083cgbnVtZXJ5Y3pueWNoIgorCisjOiBleF9kb2NtZC5jOjcwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICJQb3p5Y2phIG9rbmE6IFggJWQsIFkgJWQiCisKKyM6IGV4X2RvY21kLmM6NzA4MgorbXNnaWQgIkUxODg6IE9idGFpbmluZyB3aW5kb3cgcG9zaXRpb24gbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtIgorbXNnc3RyICJFMTg4OiBQb3p5c2tpd2FuaWUgcG96eWNqaSBva25hIG5pZSBqZXN0IHphaW1wbGVtZW50b3dhbmUgZGxhIHRlZ28gc3lzdGVtdSIKKworIzogZXhfZG9jbWQuYzo3MDkyCittc2dpZCAiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NjogOndpbnBvcyB3eW1hZ2EgZHfzY2ggYXJndW1lbnTzdyBudW1lcnljem55Y2giCisKKyM6IGV4X2RvY21kLmM6NzM3MAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIlphcGlzeiBwcnpla2llcm93YW5pZSIKKworIzogZXhfZG9jbWQuYzo3NTYwCittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICJaYXBpc3ogd2lkb2siCisKKyM6IGV4X2RvY21kLmM6NzU2MQorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiWmFwaXN6IHNlc2rqIgorCisjOiBleF9kb2NtZC5jOjc1NjMKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICJaYXBpc3ogdXN0YXdpZW5pYSIKKworIzogZXhfZG9jbWQuYzo3NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIGlzdG5pZWplICh3eW11tiBwb3ByemV6ICEpIgorCisjOiBleF9kb2NtZC5jOjc3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiBOaWUgbW9n6iBvdHdvcnp55iBcIiVzXCIgZG8gemFwaXN1IgorCisjLiBzZXQgbWFyaworIzogZXhfZG9jbWQuYzo3NzQ0Cittc2dpZCAiRTE5MTogQXJndW1lbnQgbXVzdCBiZSBhIGxldHRlciBvciBmb3J3YXJkL2JhY2t3YXJkIHF1b3RlIgorbXNnc3RyICJFMTkxOiBBcmd1bWVudCBtdXNpIGJ55iBsaXRlcrEgYWxibyBjdWR6eXOzb3dlbSB3IHByevNkL3R5syIKKworIzogZXhfZG9jbWQuYzo3Nzg2Cittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBSZWt1cnN5d25lIHphc3Rvc293YW5pZSA6bm9ybWFsIHphIGez6mJva2llIgorCisjOiBleF9kb2NtZC5jOjgzMDQKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogQnJhayBuYXp3eSB6YW1pZW5uZWdvIHBsaWt1IGRvIHBvZHN0YXdpZW5pYSBwb2QgJyMnIgorCisjOiBleF9kb2NtZC5jOjgzMzUKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIkU0OTU6IGJyYWsgbmF6d3kgcGxpa3UgYXV0b2tvbWVuZCBkbyBwb2RzdGF3aWVuaWEgcG9kIFwiPGFmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNDMKK21zZ2lkICJFNDk2OiBubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIkU0OTY6IGJyYWsgbnVtZXJ1IGJ1Zm9yYSBhdXRva29tZW5kIGRvIHBvZHN0YXdpZW5pYSBwb2QgIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM1NAorbXNnaWQgIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICJFNDk3OiBicmFrIG5hend5IGRvcGFzb3dhbmlhIGF1dG9rb21lbmQgcG9kIFwiPGFtYXRjaD5cIiIKKworIzogZXhfZG9jbWQuYzo4MzY0Cittc2dpZCAiRTQ5ODogbm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiCittc2dzdHIgIkU0OTg6IGJyYWsgbmF6d3kgcGxpa3UgOnNvdXJjZSBkbyBwb3N0YXdpZW5pYSBwb2QgXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6ODQwNQorIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFNDk5OiBFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiRTQ5OTogUHVzdGEgbmF6d2EgcGxpa3UgZGxhICclJyBsdWIgJyMnLCBkemlhs2EgdHlsa28geiBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo4NDA3Cittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDogV3luaWtpZW0gamVzdCBwdXN0eSBjabFnIgorCisjOiBleF9kb2NtZC5jOjkzNjIKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IHZpbWluZm8gZG8gb2Rjenl0dSIKKworIzogZXhfZG9jbWQuYzo5NTM1Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBCcmFrIGR3dWdyYWbzdyB3IHRlaiB3ZXJzamkiCisKKyM6IGV4X2V2YWwuYzo0NDAKK21zZ2lkICJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiCittc2dzdHIgIkU2MDg6IE5pZSBtb79uYSAnOnRocm93JyB3eWqxdGvzdyB6IHByZWZpa3NlbSAnVmltJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICJXeWqxdGVrOiAlcyIKKworIzogZXhfZXZhbC5jOjU3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gZmluaXNoZWQ6ICVzIgorbXNnc3RyICJXeWqxdGVrIHpha2/xY3pvbnk6ICVzIgorCisjOiBleF9ldmFsLmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICJXeWqxdGVrIG9kcnp1Y29ueTogJXMiCisKKyM6IGV4X2V2YWwuYzo2MjAgZXhfZXZhbC5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCB3aWVyc3ogJWxkIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGNhdWdodDogJXMiCittc2dzdHIgIld5arF0ZWsgcHJ6ZWNod3ljb255OiAlcyIKKworIzogZXhfZXZhbC5jOjcxMworIywgYy1mb3JtYXQKK21zZ2lkICIlcyBtYWRlIHBlbmRpbmciCittc2dzdHIgIiVzIHpvc3RhsyB6YXdpZXN6b255IgorCisjOiBleF9ldmFsLmM6NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJlc3VtZWQiCittc2dzdHIgIiVzIHByenl3cvNjb255IgorCisjOiBleF9ldmFsLmM6NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMgb2RyenVjb255IgorCisjOiBleF9ldmFsLmM6NzQ2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICJXeWqxdGVrIgorCisjOiBleF9ldmFsLmM6NzUyCittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiQrOxZCBpIHByemVyd2FuaWUiCisKKyM6IGV4X2V2YWwuYzo3NTQgZ3VpLmM6NDM3NQorbXNnaWQgIkVycm9yIgorbXNnc3RyICJCs7FkIgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAiUHJ6ZXJ3YW5pZSIKKworIzogZXhfZXZhbC5jOjgzMAorbXNnaWQgIkU1Nzk6IDppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTc5OiB6Ynl0IGez6mJva2llIHphZ25pZb9kv2VuaWUgOmlmIgorCisjOiBleF9ldmFsLmM6ODY3Cittc2dpZCAiRTU4MDogOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgwOiA6ZW5kaWYgYmV6IDppZiIKKworIzogZXhfZXZhbC5jOjkxMQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6ZWxzZSBiZXogOmlmIgorCisjOiBleF9ldmFsLmM6OTE0Cittc2dpZCAiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MjogOmVsc2VpZiBiZXogOmlmIgorCisjOiBleF9ldmFsLmM6OTIxCittc2dpZCAiRTU4MzogbXVsdGlwbGUgOmVsc2UiCittc2dzdHIgIkU1ODM6IHdpZWxva3JvdG5lIDplbHNlIgorCisjOiBleF9ldmFsLmM6OTI0Cittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogOmVsc2VpZiBwbyA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjk5MQorbXNnaWQgIkU1ODU6IDp3aGlsZSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTg1OiB6Ynl0IGez6mJva2llIHphZ25pZb9kv2VuaWUgOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTA0NworbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOmNvbnRpbnVlIGJleiA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDg3Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiA6YnJlYWsgYmV6IDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEyODYKK21zZ2lkICJFNjAxOiA6dHJ5IG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU2MDE6IHpieXQgZ7PqYm9raWUgemFnbmllv2S/ZW5pZSA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTM2NgorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDpjYXRjaCBiZXogOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjLiAqIEp1c3QgcGFyc2UuCisjOiBleF9ldmFsLmM6MTM4OAorbXNnaWQgIkU2MDQ6IDpjYXRjaCBhZnRlciA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNDogOmNhdGNoIHphIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgYmV6IDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIzogZXhfZXZhbC5jOjE1NDUKK21zZ2lkICJFNjA3OiBtdWx0aXBsZSA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNzogd2llbG9rcm90bmUgOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNjU0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDplbmR0cnkgYmV6IDp0cnkiCisKKyM6IGV4X2V2YWwuYzoxOTg2Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uIHBvemEgZnVua2NqsSIKKworIzogZXhfZ2V0bG4uYzozMjk2Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAibmF6d2Egem5hY3puaWthIgorCisjOiBleF9nZXRsbi5jOjMyOTkKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIiBwb2tyZXdueSBwbGlrXG4iCisKKyM6IGV4X2dldGxuLmM6NDc1MgorbXNnaWQgIidoaXN0b3J5JyBvcHRpb24gaXMgemVybyIKK21zZ3N0ciAib3BjamEgJ2hpc3RvcnknIGplc3QgemVyb3dhIgorCisjOiBleF9nZXRsbi5jOjUwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIEhpc3RvcmlhIChvZCBuYWpub3dzenljaCBwbyBuYWpzdGFyc3plKTpcbiIKKworIzogZXhfZ2V0bG4uYzo1MDI0Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJXaWVyc3ogcG9sZWNl8SIKKworIzogZXhfZ2V0bG4uYzo1MDI1Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAiU3p1a2FueSBjabFnIgorCisjOiBleF9nZXRsbi5jOjUwMjYKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJXeXJhv2VuaWUiCisKKyM6IGV4X2dldGxuLmM6NTAyNworbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIldpZXJzeiB3cHJvd2FkemXxIgorCisjOiBleF9nZXRsbi5jOjUwNjUKK21zZ2lkICJFMTk4OiBjbWRfcGNoYXIgYmV5b25kIHRoZSBjb21tYW5kIGxlbmd0aCIKK21zZ3N0ciAiRTE5ODogY21kX3BjaGFyIHByemVrcmFjemEgZLN1Z2+25iBwb2xlY2VuaWEiCisKKyM6IGV4X2dldGxuLmM6NTI0MgorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IEFrdHl3bnkgd2lkb2sgbHViIGJ1Zm9yIHNrYXNvd2FueSIKKworIzogZmlsZWlvLmM6Mzc3Cittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIk5pZWRvcHVzemN6YWxuYSBuYXp3YSBwbGlrdSIKKworIzogZmlsZWlvLmM6NDAxIGZpbGVpby5jOjUzNSBmaWxlaW8uYzoyOTEzIGZpbGVpby5jOjI5NTQKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiamVzdCBrYXRhbG9naWVtIgorCisjOiBmaWxlaW8uYzo0MDMKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICJuaWUgamVzdCBwbGlraWVtIgorCisjOiBmaWxlaW8uYzo1NTcgZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltOb3d5IFBsaWtdIgorCisjOiBmaWxlaW8uYzo1OTAKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJbTmllIGRvendvbG9ub10iCisKKyM6IGZpbGVpby5jOjY5NAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6IEF1dG9rb21lbmR5ICpSZWFkUHJlIHpyb2Jps3kgcGxpayBuaWVvZGN6eXR5d2FsbnltIgorCisjOiBmaWxlaW8uYzo2OTYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiBBdXRva29tZW5keSAqUmVhZFByZSBuaWUgbW9nsSB6bWllbmlh5iBiaWW/sWNlZ28gYnVmb3JhIgorCisjOiBmaWxlaW8uYzo3MTcKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IFdjenl0eXdhbmllIHplIHN0ZGluLi4uXG4iCisKKyM6IGZpbGVpby5jOjcyMworbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAiV2N6eXR5d2FuaWUgemUgc3RkaW4uLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6MTAwMAorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiBQbGlrIHN0d29yem9ueSBwb3ByemV6IHByemVtaWFu6iBqZXN0IG5pZW9kY3p5dHl3YWxueSEiCisKKyM6IGZpbGVpby5jOjIwOTAKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoyMDk3Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjIxMDQKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjIxMTIKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoyMTIyCittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbYnJhayBDUl0nIgorCisjOiBmaWxlaW8uYzoyMTI3Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW3puYWxlemlvbm8gTkxdIgorCisjOiBmaWxlaW8uYzoyMTMyCittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbZLN1Z2llIHdpZXJzemUgcm96ZHppZWxhbmVdIgorCisjOiBmaWxlaW8uYzoyMTM4IGZpbGVpby5jOjQxMTUKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltOSUUgcHJ6ZW1pZW5pb25lXSIKKworIzogZmlsZWlvLmM6MjE0MyBmaWxlaW8uYzo0MTIwCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIltwcnplbWllbmlvbmVdIgorCisjOiBmaWxlaW8uYzoyMTUwIGZpbGVpby5jOjQxNDUKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlt6YWtvZG93YW5lXSIKKworIzogZmlsZWlvLmM6MjE1NworbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW0KjoUQgVyBQUlpFTUlBTklFXSIKKworIzogZmlsZWlvLmM6MjE2MworIywgYy1mb3JtYXQKK21zZ2lkICJbSUxMRUdBTCBCWVRFIGluIGxpbmUgJWxkXSIKK21zZ3N0ciAiW05JRURPWldPTE9OWSBCQUpUIHcgd2llcnN6dSAlbGRdIgorCisjOiBmaWxlaW8uYzoyMTcwCittc2dpZCAiW1JFQUQgRVJST1JTXSIKK21zZ3N0ciAiW0KjykRZIFcgT0RDWllDSUVdIgorCisjOiBmaWxlaW8uYzoyMzg2Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIk5pZSBtb2fqIHpuYWxlvOYgcGxpa3UgdHltY3phc293ZWdvIHcgY2VsdSBwcnplbWlhbnkiCisKKyM6IGZpbGVpby5jOjIzOTMKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIk5pZXVkYW5hIHByemVtaWFuYSB6ICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjIzOTYKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICJuaWUgbW9n6iBvZGN6eXRh5iB3eWq2Y2lhIHogJ2NoYXJjb252ZXJ0JyIKKworIzogZmlsZWlvLmM6Mjc5NgorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiBBdXRva29tZW5keSBza2Fzb3dhs3kgbHViIHd5s2Fkb3dhs3kgYnVmb3IgcHJ6ZXpuYWN6b255IGRvIHphcGlzdSIKKworIzogZmlsZWlvLmM6MjgxOQorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiBBdXRva29tZW5kYSB6bWllbmmzYSBsaWN6Yuogd2llcnN6eSB3IG5pZW9jemVraXdhbnkgc3Bvc/NiIgorCisjOiBmaWxlaW8uYzoyODU3Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyBuaWUgcG96d2FsYSBuYSB6YXBpcyBuaWV6bW9keWZpa293YW55Y2ggYnVmb3LzdyIKKworIzogZmlsZWlvLmM6Mjg2NQorbXNnaWQgIlBhcnRpYWwgd3JpdGVzIGRpc2FsbG93ZWQgZm9yIE5ldEJlYW5zIGJ1ZmZlcnMiCittc2dzdHIgIkN66rZjaW93eSB6YXBpcyBuaWVtb79saXd5IGRsYSBidWZvcvN3IE5ldEJlYW5zIgorCisjOiBmaWxlaW8uYzoyOTE5IGZpbGVpby5jOjI5MzcKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAibmllIGplc3QgcGxpa2llbSBsdWIgemFwaXN5d2FsbnltIHByenlyerFkZW0iCisKKyM6IGZpbGVpby5jOjI5ODkKK21zZ2lkICJpcyByZWFkLW9ubHkgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiamVzdCB0eWxrbyBkbyBvZGN6eXR1ICh3eW11tiBwb3ByemV6ICEpIgorCisjOiBmaWxlaW8uYzozMzM1Cittc2dpZCAiRTUwNjogQ2FuJ3Qgd3JpdGUgdG8gYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNjogTmllIG1vZ+ogemFwaXNh5iBkbyBwbGlrdSB6YWJlenBpZWN6ZW5pYSAod3ltdbYgcHJ6ZXogISkiCisKKyM6IGZpbGVpby5jOjMzNDcKK21zZ2lkICJFNTA3OiBDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNzogQrOxZCBwb2RjemFzIHphbXlrYW5pYSBwbGlrdSB6YWJlenBpZWN6ZW5pYSAod3ltdbYgcHJ6ZXogISkiCisKKyM6IGZpbGVpby5jOjMzNDkKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiBOaWUgbW9n6iBvZGN6eXRh5iBwbGlrdSB3IGNlbHUgemFiZXpwaWVjemVuaWEgKHd5bXW2IHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozMzY1Cittc2dpZCAiRTUwOTogQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA5OiBOaWUgbW9n6iBzdHdvcnp55iBwbGlrdSB6YWJlenBpZWN6ZW5pYSAod3ltdbYgcHJ6ZXogISkiCisKKyM6IGZpbGVpby5jOjM0NjgKK21zZ2lkICJFNTEwOiBDYW4ndCBtYWtlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MTA6IE5pZSBtb2fqIHpyb2Jp5iBwbGlrdSB6YWJlenBpZWN6ZW5pYSAod3ltdbYgcHJ6ZXogISkiCisKKyM6IGZpbGVpby5jOjM1MzAKK21zZ2lkICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NjA6IFJvemR6aWGzIHphc29i83cgem9zdGFuaWUgdXRyYWNvbnkgKHd5bXW2IHByemV6ICEpIgorCisjOiBmaWxlaW8uYzozNjQwCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IE5pZSBtb2fqIHpuYWxlvOYgcGxpa3UgdHltY3phc293ZWdvIGRvIHphcGlzYW5pYSIKKworIzogZmlsZWlvLmM6MzY1OAorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0IChhZGQgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiBOaWUgbW9n6iBwcnplbWllbmnmICh1v3lqICEgYnkgemFwaXNh5iBiZXogcHJ6ZW1pYW55KSIKKworIzogZmlsZWlvLmM6MzY5MworbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IE5pZSBtb2fqIG90d29yennmIHBvZLOxY3pvbmVnbyBwbGlrdSBkbyB6YXBpc3UiCisKKyM6IGZpbGVpby5jOjM2OTcKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IE5pZSBtb2fqIG90d29yennmIHBsaWt1IGRvIHphcGlzdSIKKworIzogZmlsZWlvLmM6Mzk1OQorbXNnaWQgIkU2Njc6IEZzeW5jIGZhaWxlZCIKK21zZ3N0ciAiRTY2NzogRnN5bmMgbmllIHBvd2nzZLMgc2nqIgorCisjOiBmaWxlaW8uYzozOTY2Cittc2dpZCAiRTUxMjogQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJFNTEyOiBaYW1rbmnqY2llIHNp6iBuaWUgcG93aW9ks28iCisKKyM6IGZpbGVpby5jOjQwMzcKK21zZ2lkICJFNTEzOiB3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIkU1MTM6IGKzsWQgdyB6YXBpc2llLCBwcnplbWlhbmEgc2nqIG5pZSBwb3dpb2SzYSIKKworIzogZmlsZWlvLmM6NDA0MworbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IGKzsWQgdyB6YXBpc2llIChtb79lIHN5c3RlbSBwbGlr83cgamVzdCBwcnplcGWzbmlvbnk/KSIKKworIzogZmlsZWlvLmM6NDExMAorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICIgQqOhRCBXIFBSWkVNSUFOSUUiCisKKyM6IGZpbGVpby5jOjQxMjYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW1VyerFkemVuaWVdIgorCisjOiBmaWxlaW8uYzo0MTMxCittc2dpZCAiW05ld10iCittc2dzdHIgIltOb3d5XSIKKworIzogZmlsZWlvLmM6NDE1MworbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbYV0iCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiBkb7OxY3pvbm8iCisKKyM6IGZpbGVpby5jOjQxNTUKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3ddIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiB6YXBpc2FubyIKKworIzogZmlsZWlvLmM6NDIwNQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBQYXRjaG1vZGU6IG5pZSBtb2fqIHphcGlzYeYgb3J5Z2luYWxuZWdvIHBsaWt1IgorCisjOiBmaWxlaW8uYzo0MjI3Cittc2dpZCAiRTIwNjogcGF0Y2htb2RlOiBjYW4ndCB0b3VjaCBlbXB0eSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA2OiBwYXRjaG1vZGU6IG5pZSBtb2fqIHN0d29yennmIHB1c3RlZ28gb3J5Z2luYWxuZWdvIHBsaWt1IgorCisjOiBmaWxlaW8uYzo0MjQyCittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiBOaWUgbW9n6iBza2Fzb3dh5iBwbGlrdSB6YWJlenBpZWN6ZW5pYSIKKworIzogZmlsZWlvLmM6NDMwNgorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIk9TVFJaRa9FTklFOiBPcnlnaW5hbG55IHBsaWsgbW+/ZSB6b3N0YeYgdXRyYWNvbnkgbHViIHVzemtvZHpvbnlcbiIKKworIzogZmlsZWlvLmM6NDMwOAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIm5pZSB3eWNob2S8IGVkeXRvcmEsIGRvcPNraSBwbGlrIG5pZSB6b3N0YbMgcG9wcmF3bmllIHphcGlzYW55ISIKKworIzogZmlsZWlvLmM6NDM5NworbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDM5NworbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2Zvcm1hdCBkb3MtYV0iCisKKyM6IGZpbGVpby5jOjQ0MDQKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW21hY10iCisKKyM6IGZpbGVpby5jOjQ0MDQKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIltmb3JtYXQgbWFjLWFdIgorCisjOiBmaWxlaW8uYzo0NDExCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQ0MTEKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbZm9ybWF0IHVuaXgtYV0iCisKKyM6IGZpbGVpby5jOjQ0MzgKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSB3aWVyc3osICIKKworIzogZmlsZWlvLmM6NDQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIHdpZXJzenksICIKKworIzogZmlsZWlvLmM6NDQ0MworbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxIHpuYWsiCisKKyM6IGZpbGVpby5jOjQ0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZCB6bmFr83ciCisKKyM6IGZpbGVpby5jOjQ0NTUKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzo0NDU1Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW05pZWtvbXBsZXRueSBvc3RhdG5pIHdpZXJzel0iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDQ3NAorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiT1NUUlpFr0VOSUU6IFBsaWsgem1pZW5psyBzaeogb2QgY3phc3Ugb3N0YXRuaWVnbyBvZGN6eXR1ISEhIgorCisjOiBmaWxlaW8uYzo0NDc2Cittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJDenkgbmFwcmF3ZOogY2hjZXN6IGdvIHphcGlzYeYiCisKKyM6IGZpbGVpby5jOjU3MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwODogRXJyb3Igd3JpdGluZyB0byBcIiVzXCIiCittc2dzdHIgIkUyMDg6IEKzsWQgemFwaXN5d2FuaWEgZG8gXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiBCs7FkIHcgdHJha2NpZSB6YW15a2FuaWEgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBCs7FkIG9kY3p5dHUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1OTcwCittc2dpZCAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTI0NjogQXV0b2tvbWVuZGEgRmlsZUNoYW5nZWRTaGVsbCBza2Fzb3dhs2EgYnVmb3IiCisKKyM6IGZpbGVpby5jOjU5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogT1NUUlpFr0VOSUU6IFBsaWsgXCIlc1wiIG5pZSBqZXN0IGSzdb9laiBkb3N06nBueSIKKworIzogZmlsZWlvLmM6NTk5MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIiIKKyJXMTI6IE9TVFJaRa9FTklFOiBQbGlrIFwiJXNcIiB6bWllbmmzIHNp6iBvZCBjemFzdSByb3pwb2N66mNpYSBlZHljamksIGJ1Zm9yICIKKyJ3IFZpbWllIHLzd25pZb8gem9zdGGzIHptaWVuaW9ueSIKKworIzogZmlsZWlvLmM6NTk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBPU1RSWkWvRU5JRTogUGxpayBcIiVzXCIgem1pZW5psyBzaeogb2QgY3phc3Ugcm96cG9jeupjaWEgZWR5Y2ppIgorCisjOiBmaWxlaW8uYzo1OTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogT1NUUlpFr0VOSUU6IFRyeWIgcGxpa3UgXCIlc1wiIHptaWVuabMgc2nqIG9kIGN6YXN1IHJvenBvY3rqY2lhIGVkeWNqaSIKKworIzogZmlsZWlvLmM6NjAwNgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IE9TVFJaRa9FTklFOiBQbGlrIFwiJXNcIiB6b3N0YbMgc3R3b3J6b255IHBvIHJvenBvY3rqY2l1IGVkeWNqaSIKKworIzogZmlsZWlvLmM6NjAxOQorbXNnaWQgIlNlZSBcIjpoZWxwIFcxMVwiIGZvciBtb3JlIGluZm8uIgorbXNnc3RyICJQYXRyeiBcIjpoZWxwIFcxMVwiICBkbGEgZGFsc3p5Y2ggaW5mb3JtYWNqaS4iCisKKyM6IGZpbGVpby5jOjYwMzMKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICJPU1RSWkWvRU5JRSIKKworIzogZmlsZWlvLmM6NjAzNAorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisiJlphs2FkdWogUGxpayIKKworIzogZmlsZWlvLmM6NjE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2MjogTmllIG1vv25hIHByenlnb3Rvd2HmIHByemWzYWRvd2FuaWEgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjE6IENvdWxkIG5vdCByZWxvYWQgXCIlc1wiIgorbXNnc3RyICJFMzIxOiBOaWUgbW+/bmEgcHJ6ZbNhZG93YeYgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2NzQwCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0tU2thc293YW5vLS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2OTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogTmllIG1hIHRha2llaiBncnVweTogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3MDI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBOaWVkb3B1c3pjemFsbnkgem5hayBwbyAqOiAlcyIKKworIzogZmlsZWlvLmM6NzAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogTmllIG1hIHRha2llZ28gd3lkYXJ6ZW5pYTogJXMiCisKKyM6IGZpbGVpby5jOjcwNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBncm91cCBvciBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IE5pZSBtYSB0YWtpZWogZ3J1cHkgbHViIHd5ZGFyemVuaWE6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcxOTgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9rb21lbmR5IC0tLSIKKworIzogZmlsZWlvLmM6NzQ2OQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiBOaWUgbW+/bmEgd3lrb255d2HmIGF1dG9rb21lbmQgZGxhIHd5ZGFyemXxIEFMTCIKKworIzogZmlsZWlvLmM6NzQ5MgorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAiQnJhayBwYXN1arFjeWNoIGF1dG9rb21lbmQiCisKKyM6IGZpbGVpby5jOjc4MTMKK21zZ2lkICJFMjE4OiBhdXRvY29tbWFuZCBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFMjE4OiB6Ynl0IGez6mJva2llIHphZ25pZb9kv2VuaWUgYXV0b2tvbWVuZCIKKworIzogZmlsZWlvLmM6ODA4OAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG9rb21lbmQgZGxhIFwiJXNcIiIKKworIzogZmlsZWlvLmM6ODA5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGVjdXRpbmcgJXMiCittc2dzdHIgIld5a29udWrqICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjgxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9rb21lbmRhICVzIgorCisjOiBmaWxlaW8uYzo4NzMxCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogQnJhayB7LiIKKworIzogZmlsZWlvLmM6ODczMworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IEJyYWsgfS4iCisKKyM6IGZvbGQuYzo2OAorbXNnaWQgIkU0OTA6IE5vIGZvbGQgZm91bmQiCittc2dzdHIgIkU0OTA6IE5pZSB6bmFsZXppb25vIHp3aW5p6mNpYSIKKworIzogZm9sZC5jOjU5MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBOaWUgbW+/bmEgdXR3b3J6eeYgendpbmnqY2lhIHByenkgYmllv7FjZWogJ2ZvbGRtZXRob2QnIgorCisjOiBmb2xkLmM6NTk1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IE5pZSBtb79uYSBza2Fzb3dh5iB6d2luaepjaWEgcHJ6eSBiaWW/sWNlaiAnZm9sZG1ldGhvZCciCisKKyM6IGdldGNoYXIuYzoyNDgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IERvZGFqIGRvIGJ1Zm9yYSBvZGN6eXR1IgorCisjOiBnZXRjaGFyLmM6MjE5OAorbXNnaWQgIkUyMjM6IHJlY3Vyc2l2ZSBtYXBwaW5nIgorbXNnc3RyICJFMjIzOiByZWt1cnN5d25lIHByenlwb3J6sWRrb3dhbmllIgorCisjOiBnZXRjaGFyLmM6MzA3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogaXN0bmllamUganW/IGdsb2JhbG55IHNrcvN0IGRsYSAlcyIKKworIzogZ2V0Y2hhci5jOjMwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBpc3RuaWVqZSBqdb8gZ2xvYmFsbmUgcHJ6eXBvcnqxZGtvd2FuaWUgZGxhICVzIgorCisjOiBnZXRjaGFyLmM6MzIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiBpc3RuaWVqZSBqdb8gc2ty83QgZGxhICVzIgorCisjOiBnZXRjaGFyLmM6MzIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI3OiBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNzogaXN0bmllamUganW/IHByenlwb3J6sWRrb3dhbmllIGRsYSAlcyIKKworIzogZ2V0Y2hhci5jOjMyNzkKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIk5pZSB6bmFsZXppb25vIHNrcvN0dSIKKworIzogZ2V0Y2hhci5jOjMyODEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICJOaWUgem5hbGV6aW9ubyBwcnp5cG9yerFka293YW5pYSIKKworIzogZ2V0Y2hhci5jOjQxNzMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IE5pZWRvcHVzemN6YWxueSB0cnliIgorCisjOiBndWlfYXRfZnMuYzozMDAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPG5pZSBtb2fqIG90d29yennmPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZTogbmllIG1vZ+ogb3RyenltYeYgY3pjaW9ua2kgJXMiCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiB2aW1fU2VsRmlsZTogbmllIG1vZ+ogcG93cvNjaeYgZG8gYmllv7FjZWdvIGthdGFsb2d1IgorCisjOiBndWlfYXRfZnMuYzoyODAxCittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJUcm9wOiIKKworIzogZ3VpX2F0X2ZzLmM6MjgwNworbXNnaWQgIkU2MTU6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTU6IHZpbV9TZWxGaWxlOiBuaWUgbW9n6iBvdHJ6eW1h5iBiaWW/sWNlZ28ga2F0YWxvZ3UiCisKKyM6IGd1aV9hdF9mcy5jOjI4MTUgZ3VpX21vdGlmLmM6MTYyMworbXNnaWQgIk9LIgorbXNnc3RyICJPSyIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfZ3RrLmM6MjczMSBndWlfbW90aWYuYzoxNjE4IGd1aV9tb3RpZi5jOjI4NDkKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIlpha2/xY3oiCisKKyM6IGd1aV9hdGhlbmEuYzoyMDQ3IGd1aV9tb3RpZi5jOjE4NzEKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWSU0gLSBEaWFsb2ciCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAiU2Nyb2xsYmFyIFdpZGdldDogTmllIG1vZ7NlbSBvdHJ6eW1h5iByb3ptaWFy83cgcnlzdW5rdSBuYSBwcnp5Y2lza3UuIgorCisjOiBndWlfYmV2YWwuYzoxMDEgZ3VpX3czMi5jOjM4MzAKK21zZ2lkICJFMjMyOiBDYW5ub3QgY3JlYXRlIEJhbGxvb25FdmFsIHdpdGggYm90aCBtZXNzYWdlIGFuZCBjYWxsYmFjayIKK21zZ3N0ciAiRTIzMjogTmllIG1vZ+ogc3R3b3J6eeYgQmFsbG9vbkV2YWwgeiBwb3dpYWRvbWllbmllbSBpIHd5d2+zYW5pZW0iCisKKyM6IGd1aS5jOjIyMAorbXNnaWQgIkUyMjk6IENhbm5vdCBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFMjI5OiBOaWUgbW9n6iBvZHBhbGnmIEdVSSIKKworIzogZ3VpLmM6MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBOaWUgbW9n6iBjenl0YeYgeiBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIkU2NjU6IE5pZSBtb79uYSB1cnVjaG9taeYgR1VJLCBicmFrIHByYXdpZLNvd2VqIGN6Y2lvbmtpIgorCisjOiBndWkuYzo0NzcKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IE5pZXezYbZjaXdlICdndWlmb250d2lkZSciCisKKyM6IGd1aS5jOjU0NworbXNnaWQgIkU1OTk6IFZhbHVlIG9mICdpbWFjdGl2YXRla2V5JyBpcyBpbnZhbGlkIgorbXNnc3RyICJFNTk5OiBOaWVwcmF3aWSzb3dhIHdhcnRvtuYgJ2ltYWN0aXZhdGVrZXknIgorCisjOiBndWkuYzo0MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogTmllIG1vZ+ogemFyZXplcndvd2HmIGtvbG9ydSAlcyIKKworIzogZ3VpX2d0ay5jOjE2MDcKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJEaWFsb2cgVmltYS4uLiIKKworIzogZ3VpX2d0ay5jOjIwNjAgbWVzc2FnZS5jOjI5OTMKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImVGFrXG4iCisiJk5pZVxuIgorIiZaYWtv8WN6IgorCisjOiBndWlfZ3RrLmM6MjI2OAorbXNnaWQgIklucHV0IF9NZXRob2RzIgorbXNnc3RyICJJbnB1dCBfTWV0aG9kcyIKKworIzogZ3VpX2d0ay5jOjI1MzQgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gU3p1a2FqIGkgWmFtaWVuaWFqLi4uIgorCisjOiBndWlfZ3RrLmM6MjU0MiBndWlfbW90aWYuYzoyNzcwCittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBTenVrYWouLi4iCisKKyM6IGd1aV9ndGsuYzoyNTc0IGd1aV9tb3RpZi5jOjI4ODgKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICJabmFqZLw6IgorCisjOiBndWlfZ3RrLmM6MjU5MiBndWlfbW90aWYuYzoyOTIwCittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAiWmFtaWXxIG5hOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAiRG9wYXN1aiB0eWxrbyBjYbNlIHd5cmF6eSIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjM1IGd1aV9tb3RpZi5jOjMwNDgKK21zZ2lkICJNYXRjaCBjYXNlIgorbXNnc3RyICJEb3Bhc3VqIHdpZWxrb7bmIGxpdGVyIgorCisjOiBndWlfZ3RrLmM6MjY0NSBndWlfbW90aWYuYzoyOTkwCittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICJLaWVydW5layIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNjU3IGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAiVyBn83LqIgorCisjOiBndWlfZ3RrLmM6MjY2MSBndWlfbW90aWYuYzozMDEwCittc2dpZCAiRG93biIKK21zZ3N0ciAiVyBk87MiCisKKyM6IGd1aV9ndGsuYzoyNjgzIGd1aV9ndGsuYzoyNjg1IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIlpuYWpkvCBuYXN06nBuZSIKKworIzogZ3VpX2d0ay5jOjI3MDIgZ3VpX2d0ay5jOjI3MDQgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIlphbWll8SIKKworIzogZ3VpX2d0ay5jOjI3MTUgZ3VpX2d0ay5jOjI3MTcgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJaYW1pZfEgd3N6eXN0a2llIgorCisjOiBndWlfZ3RrX3gxMS5jOjIzMjcKK21zZ2lkICJWaW06IFJlY2VpdmVkIFwiZGllXCIgcmVxdWVzdCBmcm9tIHNlc3Npb24gbWFuYWdlclxuIgorbXNnc3RyICJWaW06IG90cnp5bWFubyC/sWRhbmllIFwiZGllXCIgb2QgbWFuYWS/ZXJhIHNlc2ppXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOQorbXNnaWQgIlZpbTogTWFpbiB3aW5kb3cgdW5leHBlY3RlZGx5IGRlc3Ryb3llZFxuIgorbXNnc3RyICJWaW06IEez83duZSBva25vIG5pZW9jemVraXdhbmllIHpuaXN6Y3pvbmVcbiIKKworIzogZ3VpX2d0a194MTEuYzo0MTM4Cittc2dpZCAiRm9udCBTZWxlY3Rpb24iCittc2dzdHIgIld5YvNyIGN6Y2lvbmtpIgorCisjOiBndWlfZ3RrX3gxMS5jOjYwMzUgdWkuYzoyMTE3Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiVb95d2FtIENVVF9CVUZGRVIwIHphbWlhc3QgcHVzdGVnbyB3eWJvcnUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcgZ3VpX21vdGlmLmM6MTYyMAorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiRmlsdHIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiS2F0YWxvZ2kiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjEKK21zZ2lkICJIZWxwIgorbXNnc3RyICJQb21vYyIKKworIzogZ3VpX21vdGlmLmM6MTYyMgorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJQbGlraSIKKworIzogZ3VpX21vdGlmLmM6MTYyNAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiV3li83IiCisKKyM6IGd1aV9tb3RpZi5jOjI4MzUKK21zZ2lkICJVbmRvIgorbXNnc3RyICJDb2ZuaWoiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiBOaWUgbW9n6iB6YbNhZG93YeYgY3pjaW9ua2kgWmFwICclcyciCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiBOaWUgbW9n6iB1v3nmIGN6Y2lvbmtpICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJXeXN5s2FtIHphd2lhZG9taWVuaWUga2/xY3qxY2UgcHJvY2VzIHBvY2hvZG55LlxuIgorCisjOiBndWlfdzMyLmM6ODMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBBcmd1bWVudCBuaWUgamVzdCB3c3BvbWFnYW55OiBcIi0lc1wiOyBVv3l3YWogd2Vyc2ppIE9MRS4iCisKKyM6IGd1aV93NDguYzoyMDkwCittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiWm5hamS8IGNpsWcgKHW/eWogJ1xcXFwnIGRvIHN6dWthbmlhICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjExNQorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlN6dWthbmllIGkgWmFtaWFuYSAodb95aiAnXFxcXCcgZG8gc3p1a2FuaWEgJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNTM3Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiIgorIlZpbSBFNDU4OiBOaWUgbW9n6iB6YXJlemVyd293YeYgbWFweSBrb2xvcvN3LCBwZXduZSBrb2xvcnkgbW9nsSBieeYgIgorIm5pZXByYXdpZLNvd2UiCisKKyM6IGd1aV94MTEuYzoyMTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBCcmFrIGN6Y2lvbmVrIGRsYSBuYXN06nB1arFjeWNoIHplc3Rhd/N3IHpuYWvzdyB3IHplc3Rhd2llIGN6Y2lvbmVrICVzOiIKKworIzogZ3VpX3gxMS5jOjIxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1MjogTmF6d2EgemVzdGF3dSBjemNpb25lazogJXMiCisKKyM6IGd1aV94MTEuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkN6Y2lvbmthICclcycgbmllIHBvc2lhZGEgem5ha/N3IGplZG5vbGl0ZWogc3plcm9rb7ZjaSIKKworIzogZ3VpX3gxMS5jOjIxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MzogRm9udHNldCBuYW1lOiAlc1xuIgorbXNnc3RyICJFMjUzOiBOYXp3YSB6ZXN0YXd1IGN6Y2lvbmVrOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MDogJXNcbiIKK21zZ3N0ciAiRm9udDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJGb250MTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgInN6ZXJva2+25iBmb250JWQgbmllIGplc3QgcG9kd/NqbrEgc3plcm9rb7ZjabEgZm9udDBcbiIKKworIzogZ3VpX3gxMS5jOjIxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICJTemVyb2tvtuYgZm9udDA6ICVsZFxuIgorCisjOiBndWlfeDExLmM6MjE4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisiU3plcm9rb7bmIGZvbnQxOiAlbGRcbiIKKyJcbiIKKworIzogaGFuZ3VsaW4uYzo2MTAKK21zZ2lkICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCittc2dzdHIgIkUyNTY6IEKjoUQgdyBhdXRvbWFjaWUgSGFuZ3VsIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiRG9kYWogbm93sSBiYXrqIGRhbnljaCIKKworIzogaWZfY3Njb3BlLmM6NzkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICJaYXB5dGFuZSBvIHd6b3J6ZWMiCisKKyM6IGlmX2NzY29wZS5jOjgxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIlBva2G/IHRlbiBrb211bmlrYXQiCisKKyM6IGlmX2NzY29wZS5jOjgzCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIlphYmlqIHBvs7FjemVuaWUiCisKKyM6IGlmX2NzY29wZS5jOjg1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAiUG9u83cgd3N6ZWxraWUgcG+zsWN6ZW5pYSIKKworIzogaWZfY3Njb3BlLmM6ODcKK21zZ2lkICJTaG93IGNvbm5lY3Rpb25zIgorbXNnc3RyICJQb2thvyBwb7OxY3plbmlhIgorCisjOiBpZl9jc2NvcGUuYzo5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkU1NjA6IFphc3Rvc293YW5pZTogY3NbY29wZV0gJXMiCisKKyM6IGlmX2NzY29wZS5jOjEyNAorbXNnaWQgIlRoaXMgY3Njb3BlIGNvbW1hbmQgZG9lcyBub3Qgc3VwcG9ydCBzcGxpdHRpbmcgdGhlIHdpbmRvdy5cbiIKK21zZ3N0ciAiVGEga29tZW5kYSBjc2NvcGUgbmllIHdzcG9tYWdhIHBvZHppZWxlbmlhIG9rbmEuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiBaYXN0b3Nvd2FuaWU6IGNzdGFnIDxpZGVudD4iCisKKyM6IGlmX2NzY29wZS5jOjIzMQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzogbmllIHpuYWxlemlvbm8gem5hY3puaWthIgorCisjOiBpZl9jc2NvcGUuYzo0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBzdGF0KCVzKSBis7FkOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDE5Cittc2dpZCAiRTU2Mzogc3RhdCBlcnJvciIKK21zZ3N0ciAiRTU2MzogYrOxZCBzdGF0IgorCisjOiBpZl9jc2NvcGUuYzo1MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2NDogJXMgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgdmFsaWQgY3Njb3BlIGRhdGFiYXNlIgorbXNnc3RyICJFNTY0OiAlcyBuaWUgamVzdCBrYXRhbG9naWVtIGx1YiBwb3ByYXdusSBiYXqxIGRhbnljaCBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIkRvZGFubyBiYXrqIGRhbnljaCBjc2NvcGUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjU4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2MjogYrOxZCBvZGN6eXR1IHBvs7FjemVuaWEgeiBjc2NvcGUgJWxkIgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogbmllem5hbnkgdHlwIHN6dWthbmlhIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzM2Cittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IE5pZSBtb2ezZW0gc3R3b3J6eeYgcG90b2t1IGRvIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzUzCittc2dpZCAiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIKK21zZ3N0ciAiRTYyMjogTmllIG1vZ7NlbSB1dHdvcnp55iByb3p3aWRsZW5pYSBkbGEgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo4NDcgaWZfY3Njb3BlLmM6ODk3Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgInd5a29uYW5pZSBjc19jcmVhdGVfY29ubmVjdGlvbiBuaWUgcG93aW9ks28gc2nqIgorCisjOiBpZl9jc2NvcGUuYzo4OTgKK21zZ2lkICJFNjIzOiBDb3VsZCBub3Qgc3Bhd24gY3Njb3BlIHByb2Nlc3MiCittc2dzdHIgIkU2MjM6IE5pZSBtb2ezZW0gc3R3b3J6eeYgcHJvY2VzdSBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjkxMQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBkbGEgdG9fZnAgbmllIHBvd2lvZLNvIHNp6iIKKworIzogaWZfY3Njb3BlLmM6OTEzCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGRsYSBmcl9mcCBuaWUgcG93aW9ks28gc2nqIgorCisjOiBpZl9jc2NvcGUuYzo5NTEKK21zZ2lkICJFNTY3OiBubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIkU1Njc6IGJyYWsgcG+zsWN6ZW5pYSB6IGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MTAyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGJyYWsgZG9wYXNvd2HxIGRsYSB6YXB5dGFuaWEgY3Njb3BlICVzIG8gJXMiCisKKyM6IGlmX2NzY29wZS5jOjEwODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OTogaW52YWxpZCBjc2NvcGVxdWlja2ZpeCBmbGFnICVjIGZvciAlYyIKK21zZ3N0ciAiRTQ2OTogbmllcHJhd2lks293YSBmbGFnYSBjc2NvcGVxdWlja2ZpeCAlYyBkbGEgJWMiCisKKyM6IGlmX2NzY29wZS5jOjExNTIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImtvbWVuZHkgY3Njb3BlOlxuIgorCisjOiBpZl9jc2NvcGUuYzoxMTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpIgorbXNnc3RyICIlLTVzOiAlLTMwcyAoVb95Y2llOiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogbmllIG1vZ+ogb3R3b3J6eeYgYmF6eSBkYW55Y2ggY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI3MQorbXNnaWQgIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIgorbXNnc3RyICJFNjI2OiBuaWUgbW9n6iB1enlza2HmIGluZm9ybWFjamkgeiBiYXp5IGRhbnljaCBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjEyOTYKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODogbmllIGRvZGFubyBkdXBsaWthdHUgYmF6eSBkYW55Y2ggY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxMzA3Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IHd5Y3plcnBhbm8gbWFrc3ltYWxusSBsaWN6YuogcG+zsWN6ZfEgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxNDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogbmllIG1hIHBvs7FjemVuaWEgJXMgeiBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjE0NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gJXMgY2xvc2VkIgorbXNnc3RyICJwb7OxY3plbmllICVzIHogY3Njb3BlIHpvc3Rhs28gemFta25p6nRlIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjE1OTgKK21zZ2lkICJFNTcwOiBmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiRTU3MDogYrOxZCBrcnl0eWN6bnkgdyBjc19tYW5hZ2VfbWF0Y2hlcyIKKworIzogaWZfY3Njb3BlLmM6MTg0OAorIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlcyIKK21zZ3N0ciAiWm5hY3puaWsgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTg3MAorbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICB3aWVyc3oiCisKKyM6IGlmX2NzY29wZS5jOjE4NzIKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgIm5hendhIHBsaWt1ICAvIGtvbnRla3N0IC8gd2llcnN6XG4iCisKKyM6IGlmX2NzY29wZS5jOjE5OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOTogQ3Njb3BlIGVycm9yOiAlcyIKK21zZ3N0ciAiRTYwOTogQrOxZCBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoyMTc2Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIldzenlzdGtpZSBiYXp5IGRhbnljaCBjc2NvcGUgcHJ6ZbNhZG93YW5vIgorCisjOiBpZl9jc2NvcGUuYzoyMjQ0Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgImJyYWsgcG+zsWN6ZfEgeiBjc2NvcGVcbiIKKworIzogaWZfY3Njb3BlLmM6MjI0OAorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgbmF6d2EgYmF6eSBkYW55Y2ggICAgICAgICAgICAgICBwcnplZHNpb25layB0cm9wdVxuIgorCisjOiBpZl9weXRob24uYzo0MzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IFByenlrcm8gbWksIHRhIGtvbWVuZGEgamVzdCB3ebOxY3pvbmEsIGJvIG5pZSBtb79uYSB6YbNhZG93YeYgIgorImJpYmxpb3Rla2kgUHl0aG9uYSIKKworIzogaWZfcHl0aG9uLmM6NTAwCittc2dpZCAiRTY1OTogQ2Fubm90IGludm9rZSBQeXRob24gcmVjdXJzaXZlbHkiCittc2dzdHIgIkU2NTk6IE5pZSBtb79uYSB3eXdvs2HmIFB5dGhvbmEgcmVrdXJzeXduaWUiCisKKyM6IGlmX3B5dGhvbi5jOjcwMQorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAibmllIG1vZ+ogc2thc293YeYgYXRyeWJ1dPN3IE91dHB1dE9iamVjdCIKKworIzogaWZfcHl0aG9uLmM6NzA4Cittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIG11c2kgYnnmIGxpY3pisSBjYbNrb3dpdLEiCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJuaWVwb3ByYXdueSBhdHJ5YnV0IgorCisjOiBpZl9weXRob24uYzo3NTUgaWZfcHl0aG9uLmM6NzY5Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpIHd5bWFnYSBsaXN0eSBjabFn83ciCisKKyM6IGlmX3B5dGhvbi5jOjg5NQorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IEKzsWQgdyBpbmljamFsaXphY2ppIG9iaWVrdPN3IEkvTyIKKworIzogaWZfcHl0aG9uLmM6MTA4MCBpZl90Y2wuYzoxNDAyCittc2dpZCAiaW52YWxpZCBleHByZXNzaW9uIgorbXNnc3RyICJuaWVwb3ByYXduZSB3eXJhv2VuaWUiCisKKyM6IGlmX3B5dGhvbi5jOjEwOTQgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAid3lyYb9lbmlhIHd5s7Fjem9uZSBwb2RjemFzIGtvbXBpbGFjamkiCisKKyM6IGlmX3B5dGhvbi5jOjExMDcKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJwcvNiYSBvZG5pZXNpZW5pYSBkbyBza2Fzb3dhbmVnbyBidWZvcmEiCisKKyM6IGlmX3B5dGhvbi5jOjExMjIgaWZfcHl0aG9uLmM6MTE2MyBpZl9weXRob24uYzoxMjI3IGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIm51bWVyIHdpZXJzemEgcG96YSB6YWtyZXNlbSIKKworIzogaWZfcHl0aG9uLmM6MTM2MgorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxvYmlla3QgYnVmb3JhIChza2Fzb3dhbnkpIHcgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIm5pZXBvcHJhd25hIG5hendhIHpha7NhZGtpIgorCisjOiBpZl9weXRob24uYzoxNzMzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIm5pZSBtYSB0YWtpZWdvIGJ1Zm9yYSIKKworIzogaWZfcHl0aG9uLmM6MTgyMQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInBy82JhIG9kbmllc2llbmlhIGRvIHNrYXNvd2FuZWdvIG9rbmEiCisKKyM6IGlmX3B5dGhvbi5jOjE4NjYKK21zZ2lkICJyZWFkb25seSBhdHRyaWJ1dGUiCittc2dzdHIgImF0cnlidXQgdHlsa28gZG8gb2Rjenl0dSIKKworIzogaWZfcHl0aG9uLmM6MTg3OQorbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAicG96eWNqYSBrdXJzb3JhIHBvemEgYnVmb3JlbSIKKworIzogaWZfcHl0aG9uLmM6MTk1NgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JpZWt0IG9rbmEgKHNrYXNvd2FueSkgdyAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iaWVrdCBva25hIChuaWV6bmFueSkgdyAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxva25vICVkPiIKKworIzogaWZfcHl0aG9uLmM6MjA0NgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICJuaWUgbWEgdGFraWVnbyBva25hIgorCisjOiBpZl9weXRob24uYzoyMzA3IGlmX3B5dGhvbi5jOjIzNDEgaWZfcHl0aG9uLmM6MjM5NiBpZl9weXRob24uYzoyNDY0CisjOiBpZl9weXRob24uYzoyNTg2IGlmX3B5dGhvbi5jOjI2MzggaWZfdGNsLmM6Njg0IGlmX3RjbC5jOjcyOSBpZl90Y2wuYzo4MDMKKyM6IGlmX3RjbC5jOjg3MyBpZl90Y2wuYzoxOTk5Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAibmllIG1vZ+ogemFjaG93YeYgaW5mb3JtYWNqaSBjb2ZhbmlhIgorCisjOiBpZl9weXRob24uYzoyMzA5IGlmX3B5dGhvbi5jOjI0MDMgaWZfcHl0aG9uLmM6MjQ3NQorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAibmllIG1vZ+ogc2thc293YeYgd2llcnN6YSIKKworIzogaWZfcHl0aG9uLmM6MjM0NiBpZl9weXRob24uYzoyNDkxIGlmX3RjbC5jOjY5MCBpZl90Y2wuYzoyMDIxCittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAibmllIG1vZ+ogemFtaWVuaeYgd2llcnN6YSIKKworIzogaWZfcHl0aG9uLmM6MjUwOSBpZl9weXRob24uYzoyNTg4IGlmX3B5dGhvbi5jOjI2NDYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIm5pZSBtb2fqIHdwcm93YWR6aeYgd2llcnN6YSIKKworIzogaWZfcHl0aG9uLmM6Mjc1MAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAiY2mxZyBuaWUgbW+/ZSB6YXdpZXJh5iB6bmFr83cgbm93ZWdvIHdpZXJzemEiCisKKyM6IGlmX3J1YnkuYzo0MjIKK21zZ2lkICJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogUHJ6eWtybyBtaSwgdGEga29tZW5kYSBqZXN0IHd5s7Fjem9uYSwgYm8gbmllIG1vv25hIHphs2Fkb3dh5iAiCisiYmlibGlvdGVraSBSdWJ5LiIKKworIzogaWZfcnVieS5jOjQ4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBOaWV6bmFueSBzdGF0dXMgbG9uZ2ptcCAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICJQcnpls7FjeiBtaepkenkgaW1wbGVtZW50YWNqsS9va3JltmxlbmllbSIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAiUG9rYb8gYmF66iBrbGFzeSIKKworIzogaWZfc25pZmYuYzo2OQorbXNnaWQgIlNob3cgb3ZlcnJpZGRlbiBtZW1iZXIgZnVuY3Rpb24iCittc2dzdHIgIlBva2G/IHByemVwaXNhbrEgZnVua2Nq6iBjerNvbmtvd7EiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIlBvYmllcmFqIHogcGxpa3UiCisKKyM6IGlmX3NuaWZmLmM6NzEKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIHByb2plY3QiCittc2dzdHIgIlBvYmllcmFqIHogcHJvamVrdHUiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiUG9iaWVyYWogeiB3c3p5c3RraWNoIHByb2pla3TzdyIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICJQb2JpZXJ6IgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIlBva2G/ILxy82SzbyBkbGEiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAiWm5hamS8IHN5bWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAiUHJ6ZWpyenlqIGtsYXPqIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIlBva2G/IGtsYXPqIHcgaGllcmFyY2hpaSIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIlBva2G/IGtsYXPqIHcgb2dyYW5pY3pvbmVqIGhpZXJhcmNoaWkiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiBvZG5vc2kgc2nqIGRvIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiBtYSBvZG5pZXNpZW5pYSBvZCIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYgbWEiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgdb95dGUgcHJ6ZXoiCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIlBva2G/IGRva3VtZW50YWNq6iBkbGEiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiV3lnZW5lcnVqIGRva3VtZW50YWNq6iBkbGEiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJOaWUgbW9n6iBwb2SzsWN6eeYgZG8gU05pRkYrLiBTcHJhd2S8ILZyb2Rvd2lza28gKHNuaWZmZW1hY3MgbXVzaSBieeYgIgorIm9kbmFsZXppb255IHcgJFBBVEgpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogQrOxZCBwb2RjemFzIGN6eXRhbmlhLiBSb3qzsWN6ZW5pZSIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrIGplc3Qgb2JlY25pZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAibmllICIKKworIzogaWZfc25pZmYuYzo1NTYKK21zZ2lkICJjb25uZWN0ZWQiCittc2dzdHIgInBvZLOxY3pvbnkiCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBOaWV6bmFuZSB6YXB5dGFuaWUgU05pRkYrOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogQrOxZCB3IHRyYWtjaWUgcG9ks7FjemFuaWEgZG8gU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIG5pZXBvZLOxY3pvbnkiCisKKyM6IGlmX3NuaWZmLmM6MTAxOAorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IE5pZSBqZXN0IGJ1Zm9yZW0gU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiBCs7FkIHcgdHJha2NpZSB6YXBpc3UuIFJverOxY3pvbnkiCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAibmlld7NhtmNpd3kgbnVtZXIgYnVmb3JhIgorCisjOiBpZl90Y2wuYzo0NjQgaWZfdGNsLmM6OTMxIGlmX3RjbC5jOjExMTAKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICJvYmVjbmllIG5pZSB6YWltcGxlbWVudG93YW5vIgorCisjOiBpZl90Y2wuYzo1MDEKK21zZ2lkICJ1bmtub3duIG9wdGlvbiIKK21zZ3N0ciAibmllem5hbmEgb3BjamEiCisKKyMuID8/PworIzogaWZfdGNsLmM6Nzc0Cittc2dpZCAiY2Fubm90IHNldCBsaW5lKHMpIgorbXNnc3RyICJuaWUgbW9n6iB1c3Rhd2nmIHdpZXJzemEoeSkiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAiemFrs2Fka2EgbmllIHVzdGF3aW9uYSIKKworIzogaWZfdGNsLmM6ODUxIGlmX3RjbC5jOjEwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAid2llcnN6ICVkIGtvbHVtbmEgJWQiCisKKyM6IGlmX3RjbC5jOjg4MQorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIm5pZSBtb2fqIHdwcm93YWR6aeYvZG+zsWN6eeYgd2llcnN6YSIKKworIzogaWZfdGNsLmM6MTI2OAorbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICJuaWV6bmFuYSBmbGFnYTogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIm5pZXpuYW5lIHZpbU9wdGlvbiIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAicHJ6ZXJ3YW5pZSBrbGF3aWF0dXJ5IgorCisjOiBpZl90Y2wuYzoxNDI4Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICJis7FkIHZpbWEiCisKKyM6IGlmX3RjbC5jOjE0NzEKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIm5pZSBtb2fqIHN0d29yennmIGJ1Zm9yYS9va25hIGtvbWVuZHk6IG9iaWVrdCBqZXN0IGthc293YW55IgorCisjOiBpZl90Y2wuYzoxNTQ1Cittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgaXMgYWxyZWFkeSBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisibmllIG1vZ+ogemFyZWplc3Ryb3dh5iB3c3RlY3puZWdvIHd5d2+zYW5pYSBrb21lbmR5OiBidWZvci9va25vIGp1vyB6b3N0YbNhICIKKyJza2Fzb3dhbmEiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYyCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wgRkFUQUxOWSBCo6FEOiByZWZsaXN0IHplcHN1dGEhPyBQcm9zeuogerNvv3nmIHJhcG9ydCBvIHR5bSBuYSB2aW0tIgorImRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorIm5pZSBtb2fqIHphcmVqZXN0cm93YeYgd3N0ZWN6bmVnbyB3eXdvs2FuaWEga29tZW5keTogYnJhayBvZG5pZXNpZW5pYSBkbyAiCisiYnVmb3JhL29rbmEiCisKKyM6IGlmX3RjbC5jOjE3MjQKK21zZ2lkICJFNTcxOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIlByenlrcm8gbWksIHRhIGtvbWVuZGEgamVzdCB3ebOxY3pvbmEsIGJvIG5pZSBtb79uYSB6YbNhZG93YeYgYmlibGlvdGVraSBUY2wuIgorCisjOiBpZl90Y2wuYzoxODg2Cittc2dpZCAiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBCo6FEIFRDTDoga29kIHpha2/xY3plbmlvd3kgbmllIGplc3QgY2Gza293aXR5IT8gUHJvc3rqIHqzb7955iByYXBvcnQgIgorIm8gdHltIG5hIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNworbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAibmllIG1vZ+ogZG9zdGHmIHdpZXJzemEiCisKKyM6IGlmX3hjbWRzcnYuYzoyMjUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJOaWUgbW9n6iB6YXJlamVzdHJvd2HmIG5hend5IHNlcndlcmEga29tZW5kIgorCisjOiBpZl94Y21kc3J2LmM6NDczCittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODogV3lzs2FuaWUga29tZW5keSBkbyBwcm9ncmFtdSBkb2NlbG93ZWdvIG5pZSBwb3dpb2SzbyBzaeoiCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IFW/eXRvIG5pZXezYbZjaXdlZ28gaWQgc2Vyd2VyYTogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMTEwCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiB3Y2llbGVuaWEgaW5zdGFuY2ppIHJlamVzdHJ1IFZpbWEgamVzdCC8bGUgc2Zvcm1vd2FuZS4gIFNrYXNvd2FubyEiCisKKyM6IG1haW4uYzo2MAorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICJOaWV6bmFuYSBvcGNqYSIKKworIzogbWFpbi5jOjYyCittc2dpZCAiVG9vIG1hbnkgZWRpdCBhcmd1bWVudHMiCittc2dzdHIgIlpieXQgd2llbGUgYXJndW1lbnTzdyIKKworIzogbWFpbi5jOjY0Cittc2dpZCAiQXJndW1lbnQgbWlzc2luZyBhZnRlciIKK21zZ3N0ciAiQnJhayBhcmd1bWVudHUgcG8iCisKKyM6IG1haW4uYzo2NgorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICKmbWllY2llIHBvIG9wY2ppIgorCisjOiBtYWluLmM6NjgKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIsIFwiLWMgY29tbWFuZFwiIG9yIFwiLS1jbWQgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAiWmJ5dCB3aWVsZSBhcmd1bWVudPN3IFwiK2tvbWVuZGFcIiwgXCItYyBrb21lbmRhXCIgbHViIFwiLS1jbWQga29tZW5kYVwiIgorCisjOiBtYWluLmM6NzAKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAiTmlld7NhtmNpd3kgYXJndW1lbnQgZGxhIgorCisjOiBtYWluLmM6NDY2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICJUYSB3ZXJzamEgVmltYSBuaWUgYnmzYSBza29tcGlsb3dhbmVnbyB6IG9wY2qxIHLzv25pYyAoZGlmZikuIgorCisjOiBtYWluLmM6OTMyCittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiUHLzYmEgcG9ub3duZWdvIG90d29yemVuaWEgcGxpa3Ugc2tyeXB0dTogXCIiCisKKyM6IG1haW4uYzo5NDEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIk5pZSBtb2fqIG90d29yennmIGRvIG9kY3p5dHU6IFwiIgorCisjOiBtYWluLmM6OTg1Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHNjcmlwdCBvdXRwdXQ6IFwiIgorbXNnc3RyICJOaWUgbW9n6iBvdHdvcnp55iBkbGEgd3lqtmNpYSBza3J5cHR1OiBcIiIKKworIzogbWFpbi5jOjExMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICIlZCBwbGlr83cgZG8gZWR5Y2ppXG4iCisKKyM6IG1haW4uYzoxMjMzCittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiBPU1RSWkWvRU5JRTogV3lqtmNpZSBuaWUgamVzdCB0ZXJtaW5hbGVtXG4iCisKKyM6IG1haW4uYzoxMjM1Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogT1NUUlpFr0VOSUU6IFdlarZjaWUgbmllIHBvY2hvZHppIHogdGVybWluYWxhXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTI5NworbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgImxpbmlhIHBvbGVjZfEgcHJlLXZpbXJjIgorCisjOiBtYWluLmM6MTMzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogTmllIG1vZ+ogY3p5dGHmIHogXCIlc1wiIgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisiRGFsc3plIGluZm9ybWFjamUgcG9wcnplejogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbcGxpayAuLl0gICAgICAgZWR5dHVqIHphZGFuZSBwbGlraSIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICBjenl0YWogdGVrc3QgemUgc3RkaW4iCisKKyM6IG1haW4uYzoyNDQ2Cittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQgem5hY3puaWsgICBlZHl0dWogcGxpaywgdyBrdPNyeW0gZGFueSB6bmFjem5payBqZXN0IHpkZWZpbmlvd2FueSIKKworIzogbWFpbi5jOjI0NDgKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtlcnJvcmZpbGVdICBlZHl0dWogcGxpaywgemF3aWVyYWqxY3kgcGllcndzenkgYrOxZCIKKworIzogbWFpbi5jOjI0NTcKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisidb95Y2llOiIKKworIzogbWFpbi5jOjI0NjAKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbYXJndW1lbnR5XSIKKworIzogbWFpbi5jOjI0NjQKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgbHViOiIKKworIzogbWFpbi5jOjI0NjcKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiQXJndW1lbnR5OlxuIgorCisjOiBtYWluLmM6MjQ2OAorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0VHlsa28gbmF6d3kgcGxpa/N3IHBvIHR5bSIKKworIzogbWFpbi5jOjI0NzAKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdE5pZSByb3p3aWphaiB6bmFr83cgc3BlY2phbG55Y2giCisKKyM6IG1haW4uYzoyNDczCittc2dpZCAiLXJlZ2lzdGVyXHRcdFJlZ2lzdGVyIHRoaXMgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx0WmFyZWplc3RydWogdGVnbyBndmltYSB3IE9MRSIKKworIzogbWFpbi5jOjI0NzQKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0V3lyZWplc3RydWogZ3ZpbWEgeiBPTEUiCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRTdGFydHVqIHcgR1VJICh0YWsgamFrIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjI0NzgKK21zZ2lkICItZiAgb3IgIC0tbm9mb3JrXHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZiAgbHViIC0tbm9mb3JrXHRQaWVyd3N6eSBwbGFuOiBOaWUgd3lkemllbGFqIHByenkgb2RwYWxhbml1IEdVSSIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRUcnliIHZpIChqYWsgXCJ2aVwiKSIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRUcnliIGV4IChqYWsgXCJleFwiKSIKKworIzogbWFpbi5jOjI0ODIKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0Q2ljaHkgdHJ5YiAodLNhKSAodHlsa28gZGxhIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDg0Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdFRyeWIgcvO/bmljIChqYWsgXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjQ4NgorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0VHJ5YiCzYXR3eSAoamFrIFwiZXZpbVwiLCBiZXogdHJ5YvN3KSIKKworIzogbWFpbi5jOjI0ODcKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdFRyeWIgd3mzsWN6bmllIGRvIG9kY3p5dHUgKGphayBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyNDg4Cittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdFRyeWIgb2dyYW5pY3plbmlhIChqYWsgXCJydmltXCIpIgorCisjOiBtYWluLmM6MjQ4OQorbXNnaWQgIi1tXHRcdFx0TW9kaWZpY2F0aW9ucyAod3JpdGluZyBmaWxlcykgbm90IGFsbG93ZWQiCittc2dzdHIgIi1tXHRcdFx0TW9keWZpa2FjamUgKHphcGlzeXdhbmllIHBsaWvzdykgbmllZG96d29sb25lIgorCisjOiBtYWluLmM6MjQ5MAorbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdFpha2F6IG1vZHlmaWthY2ppIHRla3N0dSIKKworIzogbWFpbi5jOjI0OTEKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdFRyeWIgYmluYXJueSIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRUcnliIGxpc3AiCisKKyM6IG1haW4uYzoyNDk1Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHRCsWS8IHpnb2RueSB6IFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDk2Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0QrFkvCBuaWV6dXBls25pZSB6Z29kbnkgeiBWaTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDk3Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0U3RvcGll8SBnYWRhdGxpd2+2Y2kiCisKKyM6IG1haW4uYzoyNDk4Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHRUcnliIG9kcGx1c2t3aWFuaWEiCisKKyM6IG1haW4uYzoyNDk5Cittc2dpZCAiLW5cdFx0XHRObyBzd2FwIGZpbGUsIHVzZSBtZW1vcnkgb25seSIKK21zZ3N0ciAiLW5cdFx0XHRaYW1pYXN0IHBsaWt1IHd5bWlhbnksIHW/eXdhaiB0eWxrbyBwYW1p6mNpIgorCisjOiBtYWluLmM6MjUwMAorbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdFd5bGljeiBwbGlraSB3eW1pYW55IGkgemFrb/FjeiIKKworIzogbWFpbi5jOjI1MDEKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKHogbmF6d7EgcGxpa3UpXHRPZHR383J6IHphs2FtYW6xIHNlc2rqIgorCisjOiBtYWluLmM6MjUwMgorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRUb79zYW1lIHogLXIiCisKKyM6IG1haW4uYzoyNTA0Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdE5pZSBzdG9zdWogbmV3Y2xpIGRvIG90d2llcmFuaWEgb2tpZW4iCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHRVv3l3YWogPGRldmljZT4gZG8gSS9PIgorCisjOiBtYWluLmM6MjUwOAorbXNnaWQgIi1BXHRcdFx0c3RhcnQgaW4gQXJhYmljIG1vZGUiCittc2dzdHIgIi1BXHRcdFx0cm96cG9jem5paiB3IHRyeWJpZSBhcmFic2tpbSIKKworIzogbWFpbi5jOjI1MTEKK21zZ2lkICItSFx0XHRcdFN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdHJvenBvY3puaWogdyB0cnliaWUgaGVicmFqc2tpbSIKKworIzogbWFpbi5jOjI1MTQKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0cm96cG9jem5paiB3IHRyeWJpZSBmYXJzaSIKKworIzogbWFpbi5jOjI1MTYKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA8dGVybWluYWw+XHRVc3RhdyB0eXAgdGVybWluYWxhIG5hIDx0ZXJtaW5hbD4iCisKKyM6IG1haW4uYzoyNTE3Cittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx0Vb95aiA8dmltcmM+IHphbWlhc3QgamFraWVnb2tvbHdpZWsgLnZpbXJjIgorCisjOiBtYWluLmM6MjUxOQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRVv3lqIDxndmltcmM+IHphbWlhc3QgamFraWVnb2tvbHdpZWsgLmd2aW1yYyIKKworIzogbWFpbi5jOjI1MjEKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0TmllILNhZHVqIHNrcnlwdPN3IHd0eWN6ZWsiCisKKyM6IG1haW4uYzoyNTIyCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0T3R383J6IE4gb2tpZW4gKGRvbXm2bG5pZTogcG8gamVkbnltIGRsYSBrYb9kZWdvIHBsaWt1KSIKKworIzogbWFpbi5jOjI1MjMKK21zZ2lkICItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHR0YWsgc2FtbyBqYWsgLW8gdHlsa28gZHppZWwgb2tubyBwaW9ub3dvIgorCisjOiBtYWluLmM6MjUyNAorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdFphY3puaWogbmEga2/xY3UgcGxpa3UiCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHRaYWN6bmlqIHcgd2llcnN6dSA8bG51bT4iCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiIgorIi1jbWQgPGNvbW1hbmQ+XHRcdFd5a29uYWoga29tZW5k6iA8Y29tbWFuZD4gcHJ6ZWQgemGzYWRvd2FuaWVtICIKKyJqYWtpZWdva29sd2llayBwbGlrdSB2aW1yYyIKKworIzogbWFpbi5jOjI1MjkKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPGNvbW1hbmQ+XHRcdFd5a29uYWoga29tZW5k6iA8Y29tbWFuZD4gcG8gemGzYWRvd2FuaXUgcGllcndzemVnbyBwbGlrdSIKKworIzogbWFpbi5jOjI1MzAKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNqYT5cdFx0V2N6eXRhaiBwbGlrIDxzZXNqYT4gcG8gemGzYWRvd2FuaXUgcGllcndzemVnbyBwbGlrdSIKKworIzogbWFpbi5jOjI1MzEKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2NyaXB0aW4+XHRXY3p5dHVqIGtvbWVuZHkgdHJ5YnUgbm9ybWFsbmVnbyB6IHBsaWt1IDxzY3JpcHRpbj4iCisKKyM6IG1haW4uYzoyNTMyCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNjcmlwdG91dD5cdERvs7FjeiB3c3p5c3RraWUgd3Byb3dhZHphbmUga29tZW5keSBkbyBwbGlrdSA8c2NyaXB0b3V0PiIKKworIzogbWFpbi5jOjI1MzMKK21zZ2lkICItVyA8c2NyaXB0b3V0Plx0V3JpdGUgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi1XIDxzY3JpcHRvdXQ+XHRaYXBpc3VqIHdzenlzdGtpZSB3cHJvd2FkemFuZSBrb21lbmR5IGRvIHBsaWt1IDxzY3JpcHRvdXQ+IgorCisjOiBtYWluLmM6MjUzNQorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0RWR5dHVqIHpha29kb3dhbmUgcGxpa2kiCisKKyM6IG1haW4uYzoyNTM5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UG9ks7FjeiB2aW1hIHRvIGRhbmVnbyBYLXNlcndlcmEiCisKKyM6IG1haW4uYzoyNTQxCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHROaWUgs7FjeiB6IHNlcndlcmVtIFgiCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPHBsaWtpPlx0RWR5dHVqIHBsaWtpIHcgc2Vyd2VyemUgVmltYSBqZbZsaSBtb79saXdlIgorCisjOiBtYWluLmM6MjU0NQorbXNnaWQgIi0tcmVtb3RlLXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIi0tcmVtb3RlLXNpbGVudCA8cGxpa2k+IFRvIHNhbW8sIG5pZSBuYXJ6ZWthaiBqZbZsaSBuaWUgbWEgc2Vyd2VyYSIKKworIzogbWFpbi5jOjI1NDYKK21zZ2lkICItLXJlbW90ZS13YWl0IDxmaWxlcz4gIEFzIC0tcmVtb3RlIGJ1dCB3YWl0IGZvciBmaWxlcyB0byBoYXZlIGJlZW4gZWRpdGVkIgorbXNnc3RyICItLXJlbW90ZS13YWl0IDxwbGlraT5cdFRhayBqYWsgLS1yZW1vdGUsIGxlY3ogY3pla2FqIG5hIHBsaWtpIHByemVkIGVkeWNqsSIKKworIzogbWFpbi5jOjI1NDcKK21zZ2lkICItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIi0tcmVtb3RlLXdhaXQtc2lsZW50IDxwbGlraT4gIFRvIHNhbW8sIG5pZSBuYXJ6ZWthaiBqZbZsaSBuaWUgbWEgc2Vyd2VyYSIKKworIzogbWFpbi5jOjI1NDgKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDxrbGF3aXN6ZT5cdFd5tmxpaiA8a2xhd2lzemU+IGRvIHNlcndlcmEgVmltYSBpIHpha2/xY3oiCisKKyM6IG1haW4uYzoyNTQ5Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8d3lyPlx0V3lrb25haiA8d3lyYb9lbmllPiB3IHNlcndlcnplIGkgd3lwaXN6IHd5bmlrIgorCisjOiBtYWluLmM6MjU1MAorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0V3ltaWXxIG5hend5IGRvc3TqcG55Y2ggc2Vyd2Vy83cgVmltYSBpIHpha2/xY3oiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlcm5hbWUgPG5hendhPlx0XHRPZHN5s2FqIGRvL3N0YfEgc2nqIHNlcndlcmVtIFZpbSA8bmF6d2E+IgorCisjOiBtYWluLmM6MjU1NAorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHRVv3l3YWogPHZpbWluZm8+IHphbWlhc3QgLnZpbWluZm8iCisKKyM6IG1haW4uYzoyNTU2Cittc2dpZCAiLWggIG9yICAtLWhlbHBcdFByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oICBsdWIgIC0taGVscFx0d3m2d2lldGwgUG9tb2MgKGN6eWxpIHTqIHdpYWRvbW+25ikgaSB6YWtv8WN6IgorCisjOiBtYWluLmM6MjU1NworbXNnaWQgIi0tdmVyc2lvblx0XHRQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0d3m2d2lldGwgaW5mb3JtYWNq6iBvIHdlcnNqaSBpIHpha2/xY3oiCisKKyM6IG1haW4uYzoyNTYxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiQXJndW1lbnR5IHJvenBvem5hd2FuZSBwcnpleiBndmltICh3ZXJzamEgTW90aWYpOlxuIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChuZVh0YXcgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcm96cG96bmF3YW5lIHByemV6IGd2aW0gKHdlcnNqYSBuZVh0YXcpOlxuIgorCisjOiBtYWluLmM6MjU2NworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcm96cG96bmF3YW5lIHByemV6IGd2aW0gKHdlcnNqYSBBdGhlbmEpOlxuIgorCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0WmGzYWR1aiB2aW0gbmEgPGRpc3BsYXk+IgorCisjOiBtYWluLmM6MjU3MgorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHRaYWN6bmlqIFZpbSBqYWtvIGlrb27qIgorCisjOiBtYWluLmM6MjU3NAorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYXp3YT5cdFx0Vb95d2FqIHphc29i83cgdGFrIGphayBieSBWaW0gYnmzIDxuYXp3YT4iCisKKyM6IG1haW4uYzoyNTc1Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAoTmllemFpbXBsZW1lbnRvd2FuZSlcbiIKKworIzogbWFpbi5jOjI1NzcKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxrb2xvcj5cdFW/eXdhaiA8a29sb3I+IGRsYSB0s2EgKHLzd25pZb86IC1iZykiCisKKyM6IG1haW4uYzoyNTc4Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8a29sb3I+XHRVv3l3YWogPGtvbG9yPiBkbGEgbm9ybWFsbmVnbyB0ZWtzdHUgKHLzd25pZb86IC1mZykiCisKKyM6IG1haW4uYzoyNTc5IG1haW4uYzoyNTk5Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdFx0Vb95d2FqIDxmb250PiBkbGEgbm9ybWFsbmVnbyB0ZWtzdHUgKHLzd25pZb86IC1mbikiCisKKyM6IG1haW4uYzoyNTgwCittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPGZvbnQ+XHRVv3l3YWogPGZvbnQ+IGRsYSB3eXSzdXN6Y3pvbmVnbyB0ZWtzdHUiCisKKyM6IG1haW4uYzoyNTgxCittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVv3l3YWogPGZvbnQ+IGRsYSBwb2NoebNlZ28iCisKKyM6IG1haW4uYzoyNTgyIG1haW4uYzoyNjAwCittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHRVv3l3YWogPGdlb20+IGRsYSBwb2N6sXRrb3d5Y2ggcm96bWlhcvN3IChy83duaWW/OiAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNTgzCittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPHN6ZXI+XHRVv3lqIHJhbWtpIG8gZ3J1Ym+2Y2kgPHN6ZXI+IChy83duaWW/OiAtYncpIgorCisjOiBtYWluLmM6MjU4NAorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiLXNjcm9sbGJhcndpZHRoIDxzemVyPiAgVb95d2FqIHByemV3aWphY3phIG8gc3plcm9rb7ZjaSA8c3plcj4gKHLzd25pZb86IC1zdykiCisKKyM6IG1haW4uYzoyNTg2Cittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFN0b3N1aiBiZWxr6iBtZW51IG8gd3lzb2tvtmNpIDxoZWlnaHQ+IChy83duaWW/OiAtbWgpIgorCisjOiBtYWluLmM6MjU4OCBtYWluLmM6MjYwMQorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHRTdG9zdWogbmVnYXR5dyBrb2xvcvN3IChy83duaWW/OiAtcnYpIgorCisjOiBtYWluLmM6MjU4OQorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHROaWUgc3Rvc3VqIG5lZ2F0eXd1IGtvbG9y83cgKHLzd25pZb86ICtydikiCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHRVc3RhdyBva3JltmxvbnkgemFz82IiCisKKyM6IG1haW4uYzoyNTkzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcm96cG96bmF3YW5lIHByemV6IGd2aW0gKHdlcnNqYSBSSVNDIE9TKTpcbiIKKworIzogbWFpbi5jOjI1OTQKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bnVtYmVyPlx0UG9jerF0a293YSBzemVyb2tvtuYgb2tuYSB3IGtvbHVtbmFjaCIKKworIzogbWFpbi5jOjI1OTUKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPG51bWJlcj5cdFBvY3qxdGtvd2Egd3lzb2tvtuYgb2tuYSB3IHdpZXJzemFjaCIKKworIzogbWFpbi5jOjI1OTgKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50eSByb3pwb3puYXdhbmUgcHJ6ZXogZ3ZpbSAod2Vyc2phIEdUSyspOlxuIgorCisjOiBtYWluLmM6MjYwMgorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0WmFzdGFydHVqIHZpbSBuYSA8ZGlzcGxheT4gKHLzd25pZb86IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNjA0Cittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICItLXJvbGUgPHJvbGU+XHRVc3RhdyB1bmlrYXRvd7Egcm9s6iBkbyBpZGVudHlmaWthY2ppIGez83duZWdvIG9rbmEiCisKKyM6IG1haW4uYzoyNjA2Cittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0T3R383J6IFZpbSB3ZXdusXRyeiBpbm5lZ28gd2lkZ2V0dSBHVEsiCisKKyM6IG1haW4uYzoyNjA5Cittc2dpZCAiLVAgPHBhcmVudCB0aXRsZT5cdE9wZW4gVmltIGluc2lkZSBwYXJlbnQgYXBwbGljYXRpb24iCittc2dzdHIgIi1QIDx0eXR1syByb2R6aWNhPlx0T3R383J6IFZpbWEgd2V3brF0cnogcm9kemljaWVsc2tpZWogYXBsaWthY2ppIgorCisjOiBtYWluLmM6Mjg0NworbXNnaWQgIk5vIGRpc3BsYXkiCittc2dzdHIgIkJyYWsgZGlzcGxheSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI4NjIKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6IFd5c7NhbmllIG5pZSBwb3dpb2SzbyBzaeouXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjg2OAorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiBXeXOzYW5pZSBuaWUgcG93aW9ks28gc2nqLiBQcvNidWrqIHd5a29uYeYgbmEgbWllanNjdVxuIgorCisjOiBtYWluLmM6MjkwNiBtYWluLmM6MjkyNworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIm90d29yem9ubyAlZCB6ICVkIgorCisjOiBtYWluLmM6Mjk0OQorbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIkJyYWsgdGVybWluYWxhOiBXeXOzYW5pZSB3eXJhv2VuaWEgbmllIHBvd2lvZLNvIHNp6i5cbiIKKworIzogbWFpbi5jOjI5NjEKK21zZ2lkICI6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIjogV3lzs2FuaWUgd3lyYb9lbmlhIG5pZSBwb3dpb2SzbyBzaeouXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIkJyYWsgemFrs2FkZWsiCisKKyM6IG1hcmsuYzo3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiCvYWRuYSB6YWuzYWRrYSBuaWUgcGFzdWplIGRvIFwiJXNcIiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzIyCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorInpha7MuIHdpZXJzeiBrb2wgcGxpay90ZWtzdCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzYwCittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgc2tvayB3aWVyc3oga29sIHBsaWsvdGVrc3QiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJjaGFuZ2UgbGluZSAgY29sIHRleHQiCittc2dzdHIgIiIKKyJcbiIKKyJ6bWll8SB3cnN6LiBrb2wgdGVrc3QiCisKKyM6IG1hcmsuYzoxMjgxCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgWmFrs2Fka2kgdyBwbGlrYWNoOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjEzMTYKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgTGlzdGEgb2RuaWVzaWXxIChwb2N6sXdzenkgb2QgbmFqbm93c3p5Y2gpOlxuIgorCisjOiBtYXJrLmM6MTQxMgorbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSGlzdG9yaWEgemFrs2FkZWsgdyBwbGlrYWNoIChvZCBuYWpub3dzenljaCBwbyBuYWpzdGFyc3plKTpcbiIKKworIzogbWFyay5jOjE1MDEKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiQnJhayAnPiciCisKKyM6IG1ieXRlLmM6NDY3Cittc2dpZCAiRTU0MzogTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIkU1NDM6IFRvIG5pZSBqZXN0IHdhv25hIHN0cm9uYSBrb2Rvd2EiCisKKyM6IG1ieXRlLmM6NDQzMQorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBOaWUgbW9n6iBuYXN0YXdp5iB3YXJ0b7ZjaSBJQyIKKworIzogbWJ5dGUuYzo0NTgzCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiBOaWUgbW9ns2VtIHN0d29yennmIGtvbnRla3N0dSB3cHJvd2FkemXxIgorCisjOiBtYnl0ZS5jOjQ3NDEKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IE5pZSBtb2ezZW0gb3R3b3J6eeYgc3Bvc29idSB3cHJvd2FkemXxIgorCisjOiBtYnl0ZS5jOjQ3NTIKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IE9TVFJaRa9FTklFOiBOaWUgbW9ns2VtIHpsaWt3aWRvd2HmIHd5d2+zYW5pYSBkbGEgSU0iCisKKyM6IG1ieXRlLmM6NDc1OAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBtZXRvZGEgd3Byb3dhZHpl8SBuaWUgd3Nwb21hZ2Egv2FkbmVnbyBzdHlsdSIKKworIzogbWJ5dGUuYzo0ODE1Cittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6IG1ldG9kYSB3cHJvd2FkemXxIG5pZSB3c3BvbWFnYSBtb2plZ28gdHlwdSBwcmVlZGl0IgorCisjOiBtYnl0ZS5jOjQ4ODkKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IHN0eWwgbmFkcHVua3Rvd3kgd3ltYWdhICtmb250c2V0IgorCisjOiBtYnl0ZS5jOjQ5MjUKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IFR382ogR1RLKyBqZXN0IHN0YXJzenkgbmm/IDEuMi4zLiBQb2xlIHN0YXR1c3Ugd3mzsWN6b25vIgorCisjOiBtYnl0ZS5jOjUyMzIKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiBTZXJ3ZXIgbWV0b2Qgd3Byb3dhZHpl8SBuaWUgamVzdCB1cnVjaG9taW9ueSIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBibG9rIG5pZSBiebMgemFibG9rb3dhbnkiCisKKyM6IG1lbWZpbGUuYzoxMDA1Cittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogQrOxZCB3IHRyYWtjaWUgY3p5dGFuaWEgcGxpa3Ugd3ltaWFueSIKKworIzogbWVtZmlsZS5jOjEwMTAKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogQrOxZCBvZGN6eXR1IHBsaWt1IHd5bWlhbnkiCisKKyM6IG1lbWZpbGUuYzoxMDYyCittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IEKzsWQgc3p1a2FuaWEgdyBwbGlrdSB3eW1pYW55IgorCisjOiBtZW1maWxlLmM6MTA4MAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NzogQrOxZCB6YXBpc3UgdyBwbGlrdSB3eW1pYW55IgorCisjOiBtZW1maWxlLmM6MTI3NworbXNnaWQgIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIKK21zZ3N0ciAiRTMwMDogUGxpayB3eW1pYW55IGp1vyBpc3RuaWVqZSAoYXRhayBzeW1saW5rPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBOaWUgb3RyenltYbNlbSBibG9rdSBuciAwPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IE5pZSBvdHJ6eW1hs2VtIGJsb2t1IG5yIDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogTmllIG90cnp5bWGzZW0gYmxva3UgbnIgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IE9qZWosIHpndWJps2VtIHBsaWsgd3ltaWFueSEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBOaWUgbW9ns2VtIHptaWVuaeYgbmF6d3kgcGxpa3Ugd3ltaWFueSIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogTmllIG1vZ+ogb3R3b3J6eeYgcGxpa3Ugd3ltaWFueSBkbGEgXCIlc1wiOyBvZHR3b3J6ZW5pZSBuaWVtb79saXdlIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiBOaWUgb3RyenltYbNlbSBibG9rdSAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTogTmllIHpuYWxlemlvbm8gcGxpa3Ugd3ltaWFueSBkbGEgJXMiCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICJXcHJvd2FkvCBudW1lciBwbGlrdSB3eW1pYW55LCBrdPNyZWdvIHW/eeYgKDAgYnkgd3lqtuYpOiAiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6IE5pZSBtb2fqIG90d29yennmICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiTmllIG1vZ+ogb2Rjenl0YeYgYmxva3UgMCB6ICIKKworIzogbWVtbGluZS5jOjgzNworbXNnaWQgIiIKKyJcbiIKKyJNYXliZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSBvciBWaW0gZGlkIG5vdCB1cGRhdGUgdGhlIHN3YXAgZmlsZS4iCittc2dzdHIgIiIKKyJcbiIKKyJNb79lIG5pZSB3eWtvbmFubyB6bWlhbiBhbGJvIFZpbSBuaWUgemFrdHVhbGl6b3dhsyBwbGlrdSB3eW1pYW55LiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5pZSBtb79lIGJ55iBzdG9zb3dhbnkgeiB0sSB3ZXJzarEgVmltYS5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIlW/eWogVmltYSB3IHdlcnNqaSAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgbmllIHd5Z2yxZGEgbmEgcGxpayB3eW1pYW55IFZpbWEiCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIG5pZSBtb79lIGJ55iBzdG9zb3dhbnkgbmEgdHltIGtvbXB1dGVyemUuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIlRlbiBwbGlrIHpvc3RhsyBzdHdvcnpvbnkgbmEgIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyJsdWIgcGxpayB6b3N0YbMgdXN6a29kem9ueS4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiVb95d2FtIHBsaWt1IHd5bWlhbnkgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICJPcnlnaW5hbG55IHBsaWsgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTIyCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IE9TVFJaRa9FTklFOiBPcnlnaW5hbG55IHBsaWsgbfNnsyBieeYgem1pZW5pb255IgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogTmllIG1vZ+ogb2Rjenl0YeYgYmxva3UgMSB6ICVzIgorCisjOiBtZW1saW5lLmM6OTc5Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9CUkFLVUpFIFdJRUxVIFdJRVJTWlkiCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz9MSUNaTklLIFdJRVJTWlkgTklFWkdPRE5ZIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9QVVNUWSBCTE9LIgorCisjOiBtZW1saW5lLmM6MTAyOAorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P0JSQUtVSkUgV0lFUlNaWSIKKworIzogbWVtbGluZS5jOjEwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IE5pZXezYbZjaXdlIElEIGJsb2t1IDEgKG1vv2UgJXMgbmllIGplc3QgcGxpa2llbSAuc3dwPykiCisKKyM6IG1lbWxpbmUuYzoxMDY1Cittc2dpZCAiPz8/QkxPQ0sgTUlTU0lORyIKK21zZ3N0ciAiPz8/QlJBSyBCTE9LVSIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gb2QgdGVnbyBtaWVqc2NhIHBvID8/P0tPTklFQyB3aWVyc3plIG1vZ7EgYnnmIHBvbWllc3phbmUiCisKKyM6IG1lbWxpbmUuYzoxMDk3Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz8gb2QgdGVnbyBtaWVqc2NhIHBvID8/P0tPTklFQyB3aWVyc3plIG1vZ7EgYnnmIHezb79vbmUvc2thc293YW5lIgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/S09OSUVDIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiBQcnplcndhbmllIG9kdHdhcnphbmlhIgorCisjOiBtZW1saW5lLmM6MTE0OAorbXNnaWQgIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjogV3lrcnl0byBis+pkeSBwb2RjemFzIG9kdHdhcnphbmlhOyBvZCBrdPNyeWNoIHdpZXJzenkgemFjerHmID8/PyIKKworIzogbWVtbGluZS5jOjExNTAKK21zZ2lkICJTZWUgXCI6aGVscCBFMzEyXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICJQYXRyeiBcIjpoZWxwIEUzMTJcIiBkbGEgZGFsc3p5Y2ggaW5mb3JtYWNqaS4iCisKKyM6IG1lbWxpbmUuYzoxMTU1Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICJPZHR3YXJ6YW5pZSB6YWtv8WN6b25vLiBQb3dpbmllbmW2IHNwcmF3ZHpp5iBjenkgd3N6eXN0a28gamVzdCB3IHBvcnqxZGt1LiIKKworIzogbWVtbGluZS5jOjExNTYKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoTW+/ZXN6IGNoY2ll5iB6YXBpc2HmIHRlbiBwbGlrIHBvZCBpbm6xIG5henexXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU3Cittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgImkgd3lrb25h5iBkaWZmIHogb3J5Z2luYWxueW0gcGxpa2llbSBhYnkgc3ByYXdkemnmIHptaWFueSlcbiIKKworIzogbWVtbGluZS5jOjExNTgKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIlNrYXN1aiBwb3RlbSBwbGlrIC5zd3AuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNAorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJabmFsZXppb25lIHBsaWtpIHd5bWlhbnk6IgorCisjOiBtZW1saW5lLmM6MTM5MgorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICBXIGJpZb+xY3ltIGthdGFsb2d1OlxuIgorCisjOiBtZW1saW5lLmM6MTM5NAorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBVv3l3YW0gcG9kYW5laiBuYXp3eTpcbiIKKworIzogbWVtbGluZS5jOjEzOTgKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICBXIGthdGFsb2d1ICIKKworIzogbWVtbGluZS5jOjE0MTYKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgLS0gv2FkZW4gLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODgKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgcG9zaWFkYW55IHByemV6OiAiCisKKyM6IG1lbWxpbmUuYzoxNDkwCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgZGF0YTogIgorCisjOiBtZW1saW5lLmM6MTQ5NCBtZW1saW5lLmM6MzY4NAorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgICAgIGRhdGE6ICIKKworIzogbWVtbGluZS5jOjE1MTAKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbcG8gVmltaWUgd2Vyc2phIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTE0Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbbmllIHd5Z2yxZGEgbmEgcGxpayB3eW1pYW55IFZpbWFdIgorCisjOiBtZW1saW5lLmM6MTUxOAorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgbmF6d2EgcGxpa3U6ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICB6bWllbmlvbm86ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJZRVMiCittc2dzdHIgIlRBSyIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJubyIKK21zZ3N0ciAibmllIgorCisjOiBtZW1saW5lLmM6MTUyOQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgdb95dGtvd25pazogIgorCisjOiBtZW1saW5lLmM6MTUzNgorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgICBuYXp3YSBob3N0YTogIgorCisjOiBtZW1saW5lLmM6MTUzOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgIG5hendhIGhvc3RhOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBJRCBwcm9jZXN1OiAiCisKKyM6IG1lbWxpbmUuYzoxNTUwCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChkYWxlaiBkemlhs2EpIgorCisjOiBtZW1saW5lLmM6MTU2MgorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW25pZSBuYWRhamUgc2nqIGRsYSB0ZWogd2Vyc2ppIFZpbWFdIgorCisjOiBtZW1saW5lLmM6MTU2NQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgW25pZSBkbyB1v3l0a3UgbmEgdHltIGtvbXB1dGVyemVdIgorCisjOiBtZW1saW5lLmM6MTU3MAorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgW25pZW9kY3p5dHl3YWxueV0iCisKKyM6IG1lbWxpbmUuYzoxNTc0Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICAgICBbbmllb3R3aWVyYWxueV0iCisKKyM6IG1lbWxpbmUuYzoxNzY0Cittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IE5pZSBtb2fqIHphYmV6cGllY3p55iwgYm8gYnJhayBwbGlrdSB3eW1pYW55IgorCisjOiBtZW1saW5lLmM6MTgxNworbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICJQbGlrIHphYmV6cGllY3pvbm8iCisKKyM6IG1lbWxpbmUuYzoxODE5Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBOaWV1ZGFuZSB6YWJlenBpZWN6ZW5pZSIKKworIzogbWVtbGluZS5jOjE4OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiBuaWV3s2G2Y2l3eSBsbnVtOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDogbmllIHpuYWxlemlvbm8gd2llcnN6YSAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzA2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBuaWVwb3ByYXduZSBpZCB3c2thvG5pa2EgYmxva3UgMyIKKworIzogbWVtbGluZS5jOjIzODYKK21zZ2lkICJzdGFja19pZHggc2hvdWxkIGJlIDAiCittc2dzdHIgInN0YWNrX2lkeCBwb3dpbmllbiBieeYgMCIKKworIzogbWVtbGluZS5jOjI0NDgKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IFpha3R1YWxpem93YW5vIHpieXQgd2llbGUgYmxva/N3PyIKKworIzogbWVtbGluZS5jOjI2MzAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IG5pZXBvcHJhd25lIGlkIHdza2G8bmlrYSBibG9rdSA0IgorCisjOiBtZW1saW5lLmM6MjY1NworbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgImJsb2sgbnIgMSBza2Fzb3dhbnk/IgorCisjOiBtZW1saW5lLmM6Mjg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTmllIG1vZ+ogem5hbGW85iB3aWVyc3phICVsZCIKKworIzogbWVtbGluZS5jOjMxMDAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiBuaWVwb3ByYXduZSBpZCBibG9rdSBvZG5pZXNpZW5pYSIKKworIzogbWVtbGluZS5jOjMxMTYKK21zZ2lkICJwZV9saW5lX2NvdW50IGlzIHplcm8iCittc2dzdHIgInBlX2xpbmVfY291bnQgd3lub3NpIHplcm8iCisKKyM6IG1lbWxpbmUuYzozMTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogbnVtZXIgd2llcnN6YSBwb3phIHpha3Jlc2VtOiAlbGQgamVzdCBwb3phIGtv8WNlbSIKKworIzogbWVtbGluZS5jOjMxNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IGxpY3piYSB3aWVyc3p5IG5pZXBvcHJhd25hIHcgYmxva3UgJWxkIgorCisjOiBtZW1saW5lLmM6MzE5OAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICJXaWVsa2+25iBzdG9zdSB3enJhc3RhIgorCisjOiBtZW1saW5lLmM6MzI0NAorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogbmllcG9wcmF3bmUgaWQgYmxva3Ugb2RuaWVzaWVuaWEgMiIKKworIzogbWVtbGluZS5jOjM2NzQKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IFVXQUdBIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIlpuYWxherNlbSBwbGlrIHd5bWlhbnkgbyBuYXp3aWUgXCIiCisKKyM6IG1lbWxpbmUuYzozNjc5Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJQb2RjemFzIG90d2llcmFuaWEgcGxpa3UgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg4Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIE5PV1NaRSBvZCBwbGlrdSB3eW1pYW55IVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjkyCittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpIFBld25pZSBpbm55IHByb2dyYW0gb2JyYWJpYSB0ZW4gc2FtIHBsaWsuXG4iCisiICAgIEpltmxpIHRhaywgYrFkvCBvc3Ryb79ueSwgYWJ5IG5pZSBza2/xY3p55iB6IGR3b21hXG4iCisiICAgIHLzv255bWkgd2Vyc2phbWkgamVkbmVnbyB0ZWdvIHNhbWVnbyBwbGlrdSBwbyB6bWlhbmFjaC5cbiIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIgICAgUXVpdCwgb3IgY29udGludWUgd2l0aCBjYXV0aW9uLlxuIgorbXNnc3RyICIgICAgWmFrb/FjeiBsdWIgb3N0cm+/bmllIGtvbnR5bnV1ai5cbiIKKworIzogbWVtbGluZS5jOjM2OTQKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgU2VzamEgZWR5Y2ppIGRsYSBwbGlrdSB6YbNhbWGzYSBzaeouXG4iCisKKyM6IG1lbWxpbmUuYzozNjk1Cittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgSmW2bGkgdGFrLCB0byB1v3lqIFwiOnJlY292ZXJcIiBsdWIgXCJ2aW0gLXIgIgorCisjOiBtZW1saW5lLmM6MzY5NworbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIGFieSBvZHp5c2th5iB6bWlhbnkgKHBhdHJ6IFwiOmhlbHAgcmVjb3ZlcnkpXCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5OAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICBKZbZsaSBqdb8gdG8genJvYmmzZbYsIHVzdfEgcGxpayB3eW1pYW55IFwiIgorCisjOiBtZW1saW5lLmM6MzcwMAorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBhYnkgdW5pa26x5iB0ZWogd2lhZG9tb7ZjaS5cbiIKKworIzogbWVtbGluZS5jOjM3MTQgbWVtbGluZS5jOjM3MTgKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIlBsaWsgd3ltaWFueSBcIiIKKworIzogbWVtbGluZS5jOjM3MTUgbWVtbGluZS5jOjM3MjEKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlwiIGp1vyBpc3RuaWVqZSEiCisKKyM6IG1lbWxpbmUuYzozNzI0Cittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSBVV0FHQSIKKworIzogbWVtbGluZS5jOjM3MjYKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJQbGlrIHd5bWlhbnkganW/IGlzdG5pZWplISIKKworIzogbWVtbGluZS5jOjM3MzAKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydCIKK21zZ3N0ciAiIgorIiZPdHfzcnogUmVhZC1Pbmx5XG4iCisiJkVkeXR1aiBwb21pbW9cbiIKKyJPJmR0d/NyelxuIgorIiZaYWtv8WN6XG4iCisiJlBvcnp15iIKKworIzogbWVtbGluZS5jOjM3MzIKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImT3R383J6IFJlYWQtT25seVxuIgorIiZFZHl0dWogcG9taW1vXG4iCisiTyZkdHfzcnpcbiIKKyImWmFrb/FjelxuIgorIiZQb3J6deZcbiIKKyImU2thc3VqIGdvIgorCisjOiBtZW1saW5lLmM6Mzc4OQorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6IFpuYWxlemlvbm8gemJ5dCB3aWVsZSBwbGlr83cgd3ltaWFueSIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IEN66rbmIHRyb3B1IHB1bmt0dSBtZW51IG5pZSBva3JltmxhIHBvZG1lbnUiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBNZW51IGlzdG5pZWplIHR5bGtvIHcgaW5ueW0gdHJ5YmllIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogTmllIG1hIG1lbnUgbyB0ZWogbmF6d2llIgorCisjOiBtZW51LmM6NTI1Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogVHJvcCBtZW51IG5pZSBtb79lIHByb3dhZHpp5iBkbyBwb2RtZW51IgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IE5pZSB3b2xubyBkb2Rhd2HmIHB1bmt083cgbWVudSB3cHJvc3QgZG8gcGFza2EgbWVudSIKKworIzogbWVudS5jOjU3MAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogU2VwYXJhdG9yIG5pZSBtb79lIGJ55iBjeuq2Y2mxIHRyb3B1IG1lbnUiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwOTcKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBNZW51IC0tLSIKKworIzogbWVudS5jOjIwMTkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIk9kZXJ3aWogdG8gbWVudSIKKworIzogbWVudS5jOjIwODQKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBUcm9wIG1lbnUgbXVzaSBwcm93YWR6aeYgZG8gcHVua3R1IG1lbnUiCisKKyM6IG1lbnUuYzoyMTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogTmllIHpuYWxlemlvbm8gbWVudTogJXMiCisKKyM6IG1lbnUuYzoyMTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IE1lbnUgbmllIGplc3QgemRlZmluaW93YW5lIGRsYSB0cnlidSAlcyIKKworIzogbWVudS5jOjIyMTEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IFRyb3AgbWVudSBtdXNpIHByb3dhZHpp5iBkbyBwb2RtZW51IgorCisjOiBtZW51LmM6MjIzMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogTmllIHpuYWxlemlvbm8gbWVudSAtIHNwcmF3ZLwgbmF6d3kgbWVudSIKKworIzogbWVzc2FnZS5jOjQxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAiV3lrcnl0byBis7FkIHBvZGN6YXMgcHJ6ZXR3YXJ6YW5pYSAlczoiCisKKyM6IG1lc3NhZ2UuYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAid2llcnN6ICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NjQ3Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIltjabFnIHpieXQgZLN1Z2ldIgorCisjOiBtZXNzYWdlLmM6Nzk3Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIiIKKyJPcGlla3VuIGtvbXVuaWthdPN3OiBNYXJjaW4gRGFsZWNraSA8ZGFsZWNraUBjcy5uZXQucGw+LCBNaWtvs2FqIE1hY2hvd3NraSAiCisiPG1pa21hY2hAd3AucGw+IgorCisjOiBtZXNzYWdlLmM6MTAyNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICJQcnplcndhbmllOiAiCisKKyM6IG1lc3NhZ2UuYzoxMDI4Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICJOYWNptm5paiBFTlRFUiBhYnkga29udHludW93YeYiCisKKyM6IG1lc3NhZ2UuYzoxMDMwCittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAiTmFjabZuaWogRU5URVIgbHViIHdwcm93YWS8IGtvbWVuZOogYWJ5IGtvbnR5bnVvd2HmIgorCisjOiBtZXNzYWdlLmM6MjM1MQorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIFdp6mNlaiAtLSIKKworIzogbWVzc2FnZS5jOjIzNTQKK21zZ2lkICIgKFJFVC9CUzogbGluZSwgU1BBQ0UvYjogcGFnZSwgZC91OiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVC9CUzogd2llcnN6LCBTUEFDRS9iOiBzdHJvbuosIGQvdTogcPOzIHN0cm9ueSwgcTogemFrb/FjeikiCisKKyM6IG1lc3NhZ2UuYzoyMzU1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDogd2llcnN6LCBTUEFDRTogc3Ryb27qLCBkOiBw87Mgc3Ryb255LCBxOiB6YWtv8WN6ZW5pZSkiCisKKyM6IG1lc3NhZ2UuYzoyOTc2IG1lc3NhZ2UuYzoyOTkxCittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIlB5dGFuaWUiCisKKyM6IG1lc3NhZ2UuYzoyOTc4Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyImVGFrXG4iCisiJk5pZSIKKworIzogbWVzc2FnZS5jOjMwMTEKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIlNhdmUgJkFsbFxuIgorIiZEaXNjYXJkIEFsbFxuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImVGFrXG4iCisiJk5pZVxuIgorIlphcGlzeiAmd3N6eXN0a2llXG4iCisiJk9kcnp15iB3c3p5c3RraWVcbiIKKyImWmFrb/FjeiIKKworIzogbWVzc2FnZS5jOjMwNTIKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICJEaWFsb2cgemFwaXN5d2FuaWEgcGxpa3UiCisKKyM6IG1lc3NhZ2UuYzozMDU0Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGlhbG9nIG90d2llcmFuaWEgcGxpa3UiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MzEyNQorbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiBQcnp5a3JvIG1pLCBuaWUgbWEgcHJ6ZWdssWRhcmtpIHBsaWvzdyB3IHRyeWJpZSBrb25zb2xpIgorCisjOiBtaXNjMS5jOjI3NTQKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBPU1RSWkWvRU5JRTogWm1pYW55IHcgcGxpa3UgdHlsa28gZG8gb2Rjenl0dSIKKworIzogbWlzYzEuYzozMDAyCittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIjEgd2llcnN6IHdp6mNlaiIKKworIzogbWlzYzEuYzozMDA0Cittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIjEgd2llcnN6IG1uaWVqIgorCisjOiBtaXNjMS5jOjMwMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgImRvZGFubyAlbGQgd2llcnN6eSIKKworIzogbWlzYzEuYzozMDExCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAidXN1bmnqdG8gJWxkIHdpZXJzenkiCisKKyM6IG1pc2MxLmM6MzAxNAorbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKFByemVyd2FuZSkiCisKKyM6IG1pc2MxLmM6NzU2MworbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IHphY2hvd3Vq6iBwbGlrLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo3NTczCittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiBaYWtv8WN6b25vLlxuIgorCisjOiBtaXNjMi5jOjY5NSBtaXNjMi5jOjcxMQorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIkKjoUQ6ICIKKworIzogbWlzYzIuYzo3MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbYmFqdPN3XSB0b3RhbG5lIGFsb2thY2plLXp3b2xuaWVuaWEgJWx1LSVsdSwgdyB1v3l0a3UgJWx1LCBtYWtzeW1hbG5lICIKKyJ1v3ljaWUgJWx1XG4iCisKKyM6IG1pc2MyLmM6NzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlt3eXdvs2FuaWFdIHdzenlzdGtpY2ggcmUvbWFsbG9jKCkt83cgJWx1LCB3c3p5c3RraWNoIGZyZWUoKS3zdyAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBXaWVyc3ogc3RhamUgc2nqIHpieXQgZLN1Z2kiCisKKyM6IG1pc2MyLmM6ODE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiBXZXdu6nRyem55IGKzsWQ6IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiBCcmFrIHBhbWnqY2khICAocmV6ZXJ3YWNqYSAlbHUgYmFqdPN3KSIKKworIzogbWlzYzIuYzoyNTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJXeXdvs3Vq6iBwb3ezb2vqIGRvIHd5a29uYW5pYTogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI4MTUKK21zZ2lkICJFNTQ1OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTQ1OiBCcmFrIGR3dWtyb3BrYSIKKworIzogbWlzYzIuYzoyODE3IG1pc2MyLmM6Mjg0NAorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0NjogTmllZG96d29sb255IHRyeWIiCisKKyM6IG1pc2MyLmM6Mjg4MworbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogTmllZG96d29sb255IG9icnlzIG15c3praSIKKworIzogbWlzYzIuYzoyOTIzCittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IG9jemVraXdhbm8gY3lmcnkiCisKKyM6IG1pc2MyLmM6MjkyOAorbXNnaWQgIkU1NDk6IElsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAiRTQ1OTogTmllZG96d29sb255IHByb2NlbnQiCisKKyM6IG1pc2MyLmM6MzIzOAorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIldwcm93YWS8IGtsdWN6IGRvIG9ka29kb3dhbmlhOiAiCisKKyM6IG1pc2MyLmM6MzIzOQorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIldwcm93YWS8IHBvbm93bmllIHRlbiBzYW0ga2x1Y3o6ICIKKworIzogbWlzYzIuYzozMjQ5Cittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIktsdWN6ZSBuaWUgcGFzdWqxIGRvIHNpZWJpZSEiCisKKyM6IG1pc2MyLmM6Mzc5OAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRTM0MzogSW52YWxpZCBwYXRoOiAnKipbbnVtYmVyXScgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIG9yIGJlICIKKyJmb2xsb3dlZCBieSAnJXMnLiIKK21zZ3N0ciAiIgorIkUzNDM6IE5pZXezYbZjaXd5IHRyb3A6ICcqKltudW1lcl0nIG11c2kgYnnmIG5hIGtv8WN1IHRyb3B1IGx1YiBwbyBuaW0gbXVzaSAiCisiYnnmICclcycuIgorCisjOiBtaXNjMi5jOjUwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogTmllIG1vZ+ogem5hbGW85iBrYXRhbG9ndSBcIiVzXCIgdyBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IE5pZSBtb2fqIHpuYWxlvOYgcGxpa3UgXCIlc1wiIHcgdHJvcGllIgorCisjOiBtaXNjMi5jOjUwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogS2F0YWxvZ3UgXCIlc1wiIG5pZSBtYSB3aepjZWogdyBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IFBsaWt1IFwiJXNcIiBuaWUgbWEgd2nqY2VqIHcgdHJvcGllIgorCisjOiBtaXNjMi5jOjUzMjMKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiBCcmFrIGR3dWtyb3BrYSIKKworIzogbWlzYzIuYzo1MzM1Cittc2dpZCAiRTU1MTogSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIkU1NTE6IE5pZWRvendvbG9uYSBjeuq25iIKKworIzogbWlzYzIuYzo1MzQzCittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IG9jemVraXdhbm8gY3lmcnkiCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6Mzk2Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIk5pZSBtb79uYSBwb7OxY3p55iB6IE5ldGJlYW5zICMyIgorCisjOiBuZXRiZWFucy5jOjQwNAorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zIgorbXNnc3RyICJOaWUgbW+/bmEgcG+zsWN6eeYgeiBOZXRiZWFucyIKKworIzogbmV0YmVhbnMuYzo0NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2ODogV3JvbmcgYWNjZXNzIG1vZGUgZm9yIE5ldEJlYW5zIGNvbm5lY3Rpb24gaW5mbyBmaWxlOiBcIiVzXCIiCittc2dzdHIgIkU2Njg6IEKz6mRueSB0cnliIGRvc3TqcHUgcGxpa3UgaW5mbyBwb7OxY3plbmlhIE5ldEJlYW5zOiBcIiVzXCIiCisKKyM6IG5ldGJlYW5zLmM6NzQ5Cittc2dpZCAicmVhZCBmcm9tIE5ldGJlYW5zIHNvY2tldCIKK21zZ3N0ciAib2Rjenl0IHogZ25pYXpkYSBOZXRiZWFucyIKKworIzogbmV0YmVhbnMuYzoxNjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NTg6IE5ldEJlYW5zIGNvbm5lY3Rpb24gbG9zdCBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTY1ODogQnVmb3IgJWxkIHV0cmFjabMgcG+zsWN6ZW5pZSB6IE5ldEJlYW5zIgorCisjOiBub3JtYWwuYzoyOTgwCittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAiT1NUUlpFr0VOSUU6IHRlcm1pbmFsIG5pZSB3eWtvbnVqZSBwb2S2d2lldGxhbmlhIgorCisjOiBub3JtYWwuYzozMjc2Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogQnJhayBjabFndSBwb2Qga3Vyc29yZW0iCisKKyM6IG5vcm1hbC5jOjMyNzgKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogQnJhayBpZGVudHlmaWthdG9yYSBwb2Qga3Vyc29yZW0iCisKKyM6IG5vcm1hbC5jOjQ1MTkKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogTmllIG1vZ+ogc2thc293YeYgendpbmnqY2lhIHogYmllv7FjsSAnZm9sZG1ldGhvZCciCisKKyM6IG5vcm1hbC5jOjY3NDAKK21zZ2lkICJFNjYyOiBBdCBzdGFydCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYyOiBOYSBwb2N6sXRrdSBsaXN0eSB6bWlhbiIKKworIzogbm9ybWFsLmM6Njc0MgorbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYzOiBOYSBrb/FjdSBsaXN0eSB6bWlhbiIKKworIzogbm9ybWFsLmM6ODAwMworbXNnaWQgIlR5cGUgIDpxdWl0PEVudGVyPiAgdG8gZXhpdCBWaW0iCittc2dzdHIgIndwcm93YWS8ICA6cXVpdDxFbnRlcj4gICAgemFrb/FjemVuaWUgcHJvZ3JhbXUiCisKKyM6IG9wcy5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgIjEgd2llcnN6ICVzZWQgMSByYXoiCisKKyM6IG9wcy5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSB3aWVyc3ogJXNlZCAlZCByYXp5IgorCisjOiBvcHMuYzozMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQgd2llcnN6eSAlc2VkIDEgcmF6IgorCisjOiBvcHMuYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCB3aWVyc3p5ICVzZWQgJWQgcmF6eSIKKworIzogb3BzLmM6NjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICIlbGQgd2llcnN6eSBkbyB3Y2nqY2lhLi4uICIKKworIzogb3BzLmM6NzEyCittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAiMSB3aWVyc3ogd2Np6nR5ICIKKworIzogb3BzLmM6NzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIiVsZCB3aWVyc3p5IHdjaep0eWNoICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NzUKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAibmllIG1vZ+ogc2tvcGlvd2HmLCBtaW1vIHRvIGthc3Vq6iIKKworIzogb3BzLmM6MjI2MQorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIxIHdpZXJzeiB6bWllbmlvbm8iCisKKyM6IG9wcy5jOjIyNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiVsZCB3aWVyc3p5IHptaWVuaW9ubyIKKworIzogb3BzLmM6MjY0NworIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAiendhbG5pYW0gJWxkIHdpZXJzenkiCisKKyM6IG9wcy5jOjI5MjgKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICIxIHdpZXJzeiBwcnpla29waW93YW5vIgorCisjOiBvcHMuYzoyOTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB5YW5rZWQiCittc2dzdHIgIiVsZCB3aWVyc3p5IHByemVrb3Bpb3dhbnljaCIKKworIzogb3BzLmM6MzIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzUzOiBOb3RoaW5nIGluIHJlZ2lzdGVyICVzIgorbXNnc3RyICJFMzUzOiBQdXN0eSByZWplc3RyICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM3NjYKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUmVqZXN0cnkgLS0tIgorCisjOiBvcHMuYzo1MDczCittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJOaWVkb3p3b2xvbmEgbmF6d2EgcmVqZXN0cnUiCisKKyM6IG9wcy5jOjUxNjEKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlamVzdHJ5OlxuIgorCisjOiBvcHMuYzo1MjExCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDogTmllem5hbnkgdHlwIHJlamVzdHJ1ICVkIgorCisjOiBvcHMuYzo1Njk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogTmlld7NhtmNpd2EgbmF6d2EgcmVqZXN0cnU6ICclcyciCisKKyM6IG9wcy5jOjYwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIEtvbHVtbjsgIgorCisjOiBvcHMuYzo2MDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAiV3licmFubyAlcyVsZCB6ICVsZCBXaWVyc3p5OyAlbGQgeiAlbGQgU7PzdzsgJWxkIHogJWxkIEJhanTzdyIKKworIzogb3BzLmM6NjA3OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIktvbCAlcyB6ICVzOyBXaWVyc3ogJWxkIHogJWxkOyBTs293byAlbGQgeiAlbGQ7IEJhanQgJWxkIHogJWxkIgorCisjOiBvcHMuYzo2MDkwCisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBkbGEgQk9NKSIKKworIzogb3B0aW9uLmM6MTY0MworbXNnaWQgIiU8JWYlaCVtJT1QYWdlICVOIgorbXNnc3RyICIlPCVmJWglbSU9U3Ryb25hICVOIgorCisjOiBvcHRpb24uYzoyMDkyCittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICJEemnqa2kgemEgbG90IFZpbWVtIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODogTmllem5hbmEgb3BjamEiCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogT3BjamEgbmllIGplc3Qgd3Nwb21hZ2FuYSIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IE5pZWRvendvbG9uZSB3IG1vZGVsaW5lIgorCisjOiBvcHRpb24uYzozNTIyCittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdE9zdGF0bmllIHVzdGF3aWVuaWUgcHJ6ZXogIgorCisjOiBvcHRpb24uYzozNjYxCittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6IFBvID0gd3ltYWdhbnkgamVzdCBudW1lciIKKworIzogb3B0aW9uLmM6Mzk4OSBvcHRpb24uYzo0NjE5Cittc2dpZCAiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1MjI6IE5pZSB6bmFsZXppb25vIHcgdGVybWNhcCIKKworIzogb3B0aW9uLmM6NDA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM5OiBJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICJFNTM5OiBOaWVkb3p3b2xvbnkgem5hayA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiBOaWUgbW9n6iB1c3Rhd2nmICd0ZXJtJyBuYSBwdXN0eSBjabFnIgorCisjOiBvcHRpb24uYzo0NjE0Cittc2dpZCAiRTUzMDogQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiRTUzMDogTmllIG1vZ+ogem1pZW5p5iB0ZXJtIHcgR1VJIgorCisjOiBvcHRpb24uYzo0NjE2Cittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IFW/eWogXCI6Z3VpXCIgZG8gb2RwYWxlbmlhIEdVSSIKKworIzogb3B0aW9uLmM6NDY0NQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXBleHQnIGkgJ3BhdGNobW9kZScgc7EgdG+/c2FtZSIKKworIzogb3B0aW9uLmM6NDg2MAorbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiBOaWUgbW9n6iB6bWllbmnmIHcgR1RLKzIgR1VJIgorCisjOiBvcHRpb24uYzo1MDE2Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDogQnJhayBkd3Vrcm9wa2EiCisKKyM6IG9wdGlvbi5jOjUwMTgKK21zZ2lkICJFNTI1OiBaZXJvIGxlbmd0aCBzdHJpbmciCittc2dzdHIgIkU1MjU6IENpsWcgbyB6ZXJvd2VqIGSzdWdvtmNpIgorCisjOiBvcHRpb24uYzo1MDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IEJyYWsgbnVtZXJ1IHBvIDwlcz4iCisKKyM6IG9wdGlvbi5jOjUxMDAKK21zZ2lkICJFNTI3OiBNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJFNTI3OiBCcmFrIHByemVjaW5rYSIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IE11c2kgb2tyZbZsYeYgd2FydG+25iAnIgorCisjOiBvcHRpb24uYzo1MTQ4Cittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IHphd2llcmEgbmlld3m2d2lldGxhbG55IGx1YiBzemVyb2tpIHpuYWsiCisKKyM6IG9wdGlvbi5jOjUxOTcKK21zZ2lkICJFNTk2OiBJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIkU1OTY6IE5pZWRvendvbG9uYSBjemNpb25rYS9raSIKKworIzogb3B0aW9uLmM6NTIwNQorbXNnaWQgIkU1OTc6IGNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJFNTk3OiBuaWUgbW9n6iB3eWJyYeYgemVzdGF3dSBjemNpb25layIKKworIzogb3B0aW9uLmM6NTIwNworbXNnaWQgIkU1OTg6IEludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiRTU5ODogTmllZG96d29sb255IHplc3RhdyBjemNpb25layIKKworIzogb3B0aW9uLmM6NTIxNAorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IG5pZSBtb2fqIHd5YnJh5iBzemVyb2tpZWogY3pjaW9ua2kiCisKKyM6IG9wdGlvbi5jOjUyMTYKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDogTmllZG96d29sb25hIHN6ZXJva2EgY3pjaW9ua2EiCisKKyM6IG9wdGlvbi5jOjU0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogTmllZG96d29sb255IHpuYWsgcG8gPCVjPiIKKworIzogb3B0aW9uLmM6NTU5NworbXNnaWQgIkU1MzY6IGNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJFNTM2OiB3eW1hZ2FueSBwcnplY2luZWsiCisKKyM6IG9wdGlvbi5jOjU2MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIG11c2kgYnnmIHB1c3R5IGx1YiB6YXdpZXJh5iAlcyIKKworIzogb3B0aW9uLmM6NTY3OQorbXNnaWQgIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkU1Mzg6IEJyYWsgd3Nwb21hZ2FuaWEgbXlzemtpIgorCisjOiBvcHRpb24uYzo1OTQ3Cittc2dpZCAiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiRTU0MDogTmllZG9ta25p6nR5IGNpsWcgd3lyYb9l8SIKKworIzogb3B0aW9uLmM6NTk1MQorbXNnaWQgIkU1NDE6IHRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJFNTQxOiB6Ynl0IHdpZWxlIGVsZW1lbnTzdyIKKworIzogb3B0aW9uLmM6NTk1MworbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiBuaWV6YmFsYW5zb3dhbmUgZ3J1cHkiCisKKyM6IG9wdGlvbi5jOjYxOTMKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiBva25vIHBvZGdssWR1IGp1vyBpc3RuaWVqZSIKKworIzogb3B0aW9uLmM6NjQ1MAorbXNnaWQgIlcxNzogQXJhYmljIHJlcXVpcmVzIFVURi04LCBkbyAnOnNldCBlbmNvZGluZz11dGYtOCciCittc2dzdHIgIlcxNzogQXJhYnNraSB3eW1hZ2EgVVRGLTgsIHpy82IgJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorCisjOiBvcHRpb24uYzo2NzgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IFBvdHJ6ZWJ1auogcHJ6eW5ham1uaWVqICVkIHdpZXJzenkiCisKKyM6IG9wdGlvbi5jOjY3OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5NDogTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICJFNTk0OiBQb3RyemVidWrqIHByenluYWptbmllaiAlZCBrb2x1bW4iCisKKyM6IG9wdGlvbi5jOjcxMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiBOaWV6bmFuYSBvcGNqYTogJXMiCisKKyM6IG9wdGlvbi5jOjcyMjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBLb2R5IHRlcm1pbmFsYSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjIKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBHbG9iYWxuZSB3YXJ0b7ZjaSBvcGNqaSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIExva2FsbmUgd2FydG+2Y2kgb3BjamkgLS0tIgorCisjOiBvcHRpb24uYzo3MjI2Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBPcGNqZSAtLS0iCisKKyM6IG9wdGlvbi5jOjc5MzIKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogQqOhRCBnZXRfdmFycCIKKworIzogb3B0aW9uLmM6ODkwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiBCcmFrIHBhc3VqsWNlZ28gem5ha3UgZGxhICVzIgorCisjOiBvcHRpb24uYzo4OTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IERvZGF0a293ZSB6bmFraSBwbyC2cmVkbmlrdTogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjgwCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICJuaWUgbW9n6iBvdHdvcnp55iAiCisKKyM6IG9zX2FtaWdhLmM6MzE0Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiBOaWUgbW9n6iBvdHdvcnp55iBva25hIVxuIgorCisjOiBvc19hbWlnYS5jOjMzOAorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIlBvdHJ6ZWJ1auogQW1pZ2Fkb3MgdyB3ZXJzamkgMi4wNCBsdWIgcPO8bmllanN6sVxuIgorCisjOiBvc19hbWlnYS5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIlBvdHJ6ZWJ1auogJXMgdyB3ZXJzamkgJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDE2Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICJOaWUgbW9n6iBvdHdvcnp55iBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDI3Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIk5pZSBtb2fqIHN0d29yennmICIKKworIzogb3NfYW1pZ2EuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICJWaW0ga2/xY3p5IHByYWPqIHogJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MzcKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJuaWUgbW9n6iB6bWllbmnmIHRyeWJ1IGtvbnNvbGkgPyFcbiIKKworIzogb3NfYW1pZ2EuYzoxMDAzCittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogbmllIGplc3Qga29uc29ssT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNTIKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogTmllIG1vZ+ogd3lrb25h5iBwb3ezb2tpIHogb3BjarEgLWYiCisKKyM6IG9zX2FtaWdhLmM6MTE5MyBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIk5pZSBtb2fqIHd5a29uYeYgIgorCisjOiBvc19hbWlnYS5jOjExOTYgb3NfYW1pZ2EuYzoxMjkzCittc2dpZCAic2hlbGwgIgorbXNnc3RyICJwb3ezb2thICIKKworIzogb3NfYW1pZ2EuYzoxMjE2IG9zX2FtaWdhLmM6MTMxOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgendy82Nps1xuIgorCisjOiBvc19hbWlnYS5jOjE0NTkKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIHpieXQgbmlza2llLiIKKworIzogb3NfYW1pZ2EuYzoxNDYzCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJCo6FEIEkvTyIKKworIzogb3NfbXN3aW4uYzo1MzkKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiLi4uKG9iY2nqdHkpIgorCisjOiBvc19tc3dpbi5jOjY0MQorbXNnaWQgIidjb2x1bW5zJyBpcyBub3QgODAsIGNhbm5vdCBleGVjdXRlIGV4dGVybmFsIGNvbW1hbmRzIgorbXNnc3RyICInY29sdW1ucycgbmllIHd5bm9zaSA4MCwgbmllIG1vZ+ogd3lrb25h5iB6ZXdu6nRyem55Y2gga29tZW5kIgorCisjOiBvc19tc3dpbi5jOjE5NzMKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IFd5YvNyIGRydWthcmtpIG5pZSBwb3dp82SzIHNp6iIKKworIzogb3NfbXN3aW4uYzoyMDEzCisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICJkbyAlcyB6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMzogVW5rbm93biBwcmludGVyIGZvbnQ6ICVzIgorbXNnc3RyICJFNjEzOiBOaWV6bmFuYSBjemNpb25rYSBkcnVrYXJraTogJXMiCisKKyM6IG9zX21zd2luLmM6MjA3NyBvc19tc3dpbi5jOjIwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBCs7FkIGRydWthcmtpOiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDg4Cittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiTmllem5hbmUiCisKKyM6IG9zX21zd2luLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJXeWRydWtvd2FubyAnJXMnIgorCisjOiBvc19tc3dpbi5jOjMyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDQ6IE5pZWRvendvbG9uYSBuYXp3YSB6ZXN0YXd1IHpuYWvzdyBcIiVzXCIgdyBuYXp3aWUgY3pjaW9ua2kgXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjMyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogTmllZG96d29sb255IHpuYWsgJyVjJyB3IG5hendpZSBjemNpb25raSBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyNTkKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiBOaWV3s2G2Y2l3YSBvcGNqYSAnb3NmaWxldHlwZScgLSB1v3l3YW0gVGV4dCIKKworIzogb3NfdW5peC5jOjkyNworbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IFBvZHfzam55IHN5Z25hsywgd3ljaG9keupcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogWmGzYXBhsyC2bWllcnRlbG55IHN5Z25hsyAlc1xuIgorCisjOiBvc191bml4LmM6OTM2Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IFphs2FwYbMgtm1pZXJ0ZWxueSBzeWduYbNcbiIKKworIzogb3NfdW5peC5jOjExOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRvb2sgJWxkIG1zZWMiCittc2dzdHIgIk90d2llcmFuaWUgZWtyYW51IFggdHJ3YbNvICVsZCBtc2VjIgorCisjOiBvc191bml4LmM6MTIyNgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IERvc3RhsyBis7FkIFhcbiIKKworIzogb3NfdW5peC5jOjEzMzQKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJUZXN0IGVrcmFudSBYIG5pZSBwb3dp82SzIHNp6iIKKworIzogb3NfdW5peC5jOjE0NzMKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICJQcvNiYSBvdHdhcmNpYSBla3JhbnUgWCB0cndhs2EgemJ5dCBks3VnbyIKKworIzogb3NfdW5peC5jOjMyMjcgb3NfdW5peC5jOjM5MDcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiTmllIG1vZ+ogd3lrb25h5iBwb3ezb2tpICIKKworIzogb3NfdW5peC5jOjMyNzUKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5pZSBtb2fqIHd5a29uYeYgcG93s29raSBzaFxuIgorCisjOiBvc191bml4LmM6MzI3OSBvc191bml4LmM6MzkxMworbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJwb3ezb2thIHp3cvNjabNhICIKKworIzogb3NfdW5peC5jOjM0MTQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiTmllIG1vZ+ogc3R3b3J6eeYgcG90b2vzd1xuIgorCisjOiBvc191bml4LmM6MzQyOQorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiTmllIG1vZ+ogcm96ZHppZWxp5iBzaepcbiIKKworIzogb3NfdW5peC5jOjM5MjAKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyJLb21lbmRhIHpha2/xY3pvbmFcbiIKKworIzogb3NfdW5peC5jOjQxODQgb3NfdW5peC5jOjQzMDkgb3NfdW5peC5jOjU5NzUKK21zZ2lkICJYU01QIGxvc3QgSUNFIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgc3RyYWNpsyBwb7OxY3plbmllIElDRSIKKworIzogb3NfdW5peC5jOjU1NTgKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJPdHdhcmNpZSBla3JhbnUgWCBuaWUgcG93aW9ks28gc2nqIgorCisjOiBvc191bml4LmM6NTg4MAorbXNnaWQgIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IgorbXNnc3RyICJYU01QIG9ic7N1Z3VqZSC/sWRhbmllIHNhbW96YXBpc3UiCisKKyM6IG9zX3VuaXguYzo1OTk5Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgb3R3aWVyYSBwb7OxY3plbmllIgorCisjOiBvc191bml4LmM6NjAxOAorbXNnaWQgIlhTTVAgSUNFIGNvbm5lY3Rpb24gd2F0Y2ggZmFpbGVkIgorbXNnc3RyICJPYnNlcndhY2phIHBvs7FjemVuaWEgWFNNUCBJQ0UgbmllIHBvd2lvZLNhIHNp6iIKKworIzogb3NfdW5peC5jOjYwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiWFNNUCBTbWNPcGVuQ29ubmVjdGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICJYU01QIFNtY09wZW5Db25uZWN0aW9uIG5pZSBwb3dpb2SzbyBzaeo6ICVzIgorCisjOiBvc192bXNfbW1zLmM6NTkKK21zZ2lkICJBdCBsaW5lIgorbXNnc3RyICJXIHdpZXJzenUiCisKKyM6IG9zX3czMmV4ZS5jOjY1Cittc2dpZCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tbWFuZCBsaW5lLiIKK21zZ3N0ciAiTmllIG1vZ+ogemFyZXplcndvd2HmIHBhbWnqY2kgZGxhIGxpbmlpIHBvbGVjZfEuIgorCisjOiBvc193MzJleGUuYzo2NiBvc193MzJleGUuYzo4OSBvc193MzJleGUuYzoxMDAKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIkKzsWQgVklNIgorCisjOiBvc193MzJleGUuYzo4OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5pZSBtb2fqIHphs2Fkb3dh5iB2aW0zMi5kbGwhIgorCisjOiBvc193MzJleGUuYzo5OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIk5pZSB6ZG+zYbNlbSBwb3ByYXdp5iB3c2thvG5pa/N3IGZ1bmtjamkgdyBETEwhIgorCisjOiBvc193aW4xNi5jOjM0MiBvc193aW4zMi5jOjMxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgInBvd7Nva2Egendy82Nps2EgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjY1NQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IFphs2FwYbMgd3lkYXJ6ZW5pZSAlc1xuIgorCisjOiBvc193aW4zMi5jOjI2NTcKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAiemFta25paiIKKworIzogb3Nfd2luMzIuYzoyNjU5Cittc2dpZCAibG9nb2ZmIgorbXNnc3RyICJ3eWxvZ3VqIgorCisjOiBvc193aW4zMi5jOjI2NjAKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAiemFrb/FjeiIKKworIzogb3Nfd2luMzIuYzozMTUwCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IE5pZSB6bmFsZXppb25vIGtvbWVuZHkiCisKKyM6IG9zX3dpbjMyLmM6MzE2MworbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEUgbmllIHpuYWxlemlvbm8gdyB0d29pbSAkUEFUSC5cbiIKKyJaZXdu6nRyem5lIGtvbWVuZHkgbmllIGLqZLEgd3N0cnp5bWFuZSBwbyB3eWtvbmFuaXUuXG4iCisiUGF0cnogIDpoZWxwIHdpbTMyLXZpbXJ1biAgYWJ5IG90cnp5bWHmIHdp6mNlaiBpbmZvcm1hY2ppLiIKKworIzogb3Nfd2luMzIuYzozMTY2Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSBPc3RyemW/ZW5pZSIKKworIzogcXVpY2tmaXguYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiBaYnl0IHdpZWxlICUlJWMgdyBjabFndSBmb3JtYXR1arFjeW0iCisKKyM6IHF1aWNrZml4LmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiBOaWVvY3pla2l3YW5lICUlJWMgdyBjabFndSBmb3JtYXR1arFjeW0iCisKKyM6IHF1aWNrZml4LmM6MzI1Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IEJyYWsgXSB3IGNpsWd1IGZvcm1hdHVqsWN5bSIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiBOaWV3c3BvbWFnYW5lICUlJWMgdyBjabFndSBmb3JtYXR1arFjeW0iCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogTmllcG9wcmF3bmUgJSUlYyB3IHByZWZpa3NpZSBjabFndSBmb3JtYXR1arFjZWdvIgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogTmllcG9wcmF3bmUgJSUlYyB3IGNpsWd1IGZvcm1hdHVqsWN5bSIKKworIzogcXVpY2tmaXguYzozOTEKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgbmllIHphd2llcmEgd3pvcmNhIgorCisjOiBxdWlja2ZpeC5jOjUwMQorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IFB1c3RhIG5hendhIGthdGFsb2d1IGx1YiBqZWogYnJhayIKKworIzogcXVpY2tmaXguYzo5OTAKK21zZ2lkICJFNTUzOiBObyBtb3JlIGl0ZW1zIgorbXNnc3RyICJFNTUzOiBOaWUgbWEgd2nqY2VqIGVsZW1lbnTzdyIKKworIzogcXVpY2tmaXguYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCB6ICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMjMxCittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKHdpZXJzeiBza2Fzb3dhbnkpIgorCisjOiBxdWlja2ZpeC5jOjE0NDQKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IE5hIGRvbGUgc3Rvc3UgcXVpY2tmaXgiCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogTmEgZ/NyemUgc3Rvc3UgcXVpY2tmaXgiCisKKyM6IHF1aWNrZml4LmM6MTQ2NQorIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgImxpc3RhIGKz6mTzdyAlZCB6ICVkOyAlZCBis+pk83ciCisKKyM6IHF1aWNrZml4LmM6MTk0MworbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIkUzODI6IE5pZSBtb2fqIHphcGlzYeYsIG9wY2phICdidWZ0eXBlJyBqZXN0IHVzdGF3aW9uYSIKKworIzogcmVnZXhwLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjk6IGludmFsaWQgaXRlbSBpbiAlcyUlW10iCittc2dzdHIgIkUzNjk6IE5pZXezYbZjaXd5IGVsZW1lbnQgdyAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjg0MAorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFpieXQgZLN1Z2kgd3pvcnplYyIKKworIzogcmVnZXhwLmM6MTAxMQorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiBaYnl0IHdpZWxlIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxOiBUb28gbWFueSAlcygiCittc2dzdHIgIkU1MTogWmJ5dCB3aWVsZSAlcygiCisKKyM6IHJlZ2V4cC5jOjEwNzkKK21zZ2lkICJFNTI6IFVubWF0Y2hlZCBcXHooIgorbXNnc3RyICJFNTI6IE5pZXNwYXJvd2FueSBcXHooIgorCisjOiByZWdleHAuYzoxMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MzogVW5tYXRjaGVkICVzJSUoIgorbXNnc3RyICJFNTM6IE5pZXNwYXJvd2FueSAlcyUlKCIKKworIzogcmVnZXhwLmM6MTA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTQ6IFVubWF0Y2hlZCAlcygiCittc2dzdHIgIkU1NDogTmllc3Bhcm93YW55ICVzKCIKKworIzogcmVnZXhwLmM6MTA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTU6IFVubWF0Y2hlZCAlcykiCittc2dzdHIgIkU1NTogTmllc3Bhcm93YW55ICVzKSIKKworIzogcmVnZXhwLmM6MTI2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY6ICVzKiBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTY6IG9wZXJhbmQgJXMqIG3zZ7MgYnnmIHB1c3R5IgorCisjOiByZWdleHAuYzoxMjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzogJXMrIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1Nzogb3BlcmFuZCAlcysgbfNnsyBieeYgcHVzdHkiCisKKyM6IHJlZ2V4cC5jOjEzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTogbmllZG96d29sb255IHpuYWsgcG8gJXNAIgorCisjOiByZWdleHAuYzoxMzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1ODogb3BlcmFuZCAlc3sgbfNnsyBieeYgcHVzdHkiCisKKyM6IHJlZ2V4cC5jOjEzNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOiBUb28gbWFueSBjb21wbGV4ICVzey4uLn1zIgorbXNnc3RyICJFNjA6IFpieXQgd2llbGUgerNvv29ueWNoICVzey4uLn0iCisKKyM6IHJlZ2V4cC5jOjEzNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IFphZ25pZb9kv29uZSAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiBaYWduaWW/ZL9vbmUgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ5MworbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IE5pZWRvendvbG9uZSB1v3ljaWUgXFxfIgorCisjOiByZWdleHAuYzoxNTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyBwbyBuaWN6eW0iCisKKyM6IHJlZ2V4cC5jOjE1OTQKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogTmlld7NhtmNpd2Ugb2R3b7NhbmllIHdzdGVjem5lIgorCisjOiByZWdleHAuYzoxNjA3Cittc2dpZCAiRTY2OiBcXHooIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NjogXFx6KCBqZXN0IG5pZWRvendvbG9uZSB3IHR5bSBtaWVqc2N1IgorCisjOiByZWdleHAuYzoxNjI2Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgaSBwb2RvYm5lIHOxIG5pZWRvendvbG9uZSB3IHR5bSBtaWVqc2N1IgorCisjOiByZWdleHAuYzoxNjM3Cittc2dpZCAiRTY4OiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXHoiCittc2dzdHIgIkU2ODogbmllZG9wdXN6Y3phbG55IHpuYWsgcG8gXFx6IgorCisjOiByZWdleHAuYzoxNjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2OTogTWlzc2luZyBdIGFmdGVyICVzJSVbIgorbXNnc3RyICJFNjk6IEJyYWsgXSBwbyAlcyUlWyIKKworIzogcmVnZXhwLmM6MTcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNzA6IEVtcHR5ICVzJSVbXSIKK21zZ3N0ciAiRTcwOiBQdXN0eSAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjE3NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6IE5pZWRvendvbG9ueSB6bmFrIHBvICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6IEKzsWQgc2uzYWRuaSB3ICVzey4uLn0iCisKKyM6IHJlZ2V4cC5jOjI4NjUgcmVnZXhwLmM6MzAxOAorbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiBQcnplY2h3eWNvbm8gemGzYW1hbmllOyByZWdleHAgemJ5dCB6s2+/b255PyIKKworIzogcmVnZXhwLmM6MzAwNiByZWdleHAuYzozMDE1Cittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiB3em9yemVjIHNwb3dvZG93YbMgYrOxZCBvdXQtb2Ytc3RhY2siCisKKyM6IHJlZ2V4cC5jOjMyNjAKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICJaZXdu6nRyem5lIHBvZGRvcGFzb3dhbmlhOlxuIgorCisjOiBzY3JlZW4uYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0tJTNsZCB3aWVyc3p5IHp3aW5p6nRvICIKKworIzogc2NyZWVuLmM6Nzk5NgorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiIFYtWkFNSUFOQSIKKworIzogc2NyZWVuLmM6ODAwMAorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgWkFNSUFOQSIKKworIzogc2NyZWVuLmM6ODAwNQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIgTkVHQVRZVyIKKworIzogc2NyZWVuLmM6ODAwNworbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiBXUFJPV0FEWkFOSUUiCisKKyM6IHNjcmVlbi5jOjgwMTAKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAod3Byb3dhZHphbmllKSIKKworIzogc2NyZWVuLmM6ODAxMgorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAoemFtaWFuYSkiCisKKyM6IHNjcmVlbi5jOjgwMTQKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2LXphbWlhbmEpIgorCisjOiBzY3JlZW4uYzo4MDE3Cittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIEhlYnJhanNraSIKKworIzogc2NyZWVuLmM6ODAyOAorbXNnaWQgIiBBcmFiaWMiCittc2dzdHIgIiBBcmFic2tpIgorCisjOiBzY3JlZW4uYzo4MDMxCittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiIChq6np5aykiCisKKyM6IHNjcmVlbi5jOjgwMzUKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiICh3a2xlamFuaWUpIgorCisjOiBzY3JlZW4uYzo4MDQ4Cittc2dpZCAiIFZJU1VBTCIKK21zZ3N0ciAiIFdJWlVBTE5ZIgorCisjOiBzY3JlZW4uYzo4MDQ5Cittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgV0laVUFMTlkgTElOSU9XWSIKKworIzogc2NyZWVuLmM6ODA1MAorbXNnaWQgIiBWSVNVQUwgQkxPQ0siCittc2dzdHIgIiBXSVpVQUxOWSBCTE9LT1dZIgorCisjOiBzY3JlZW4uYzo4MDUxCittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIFpBWk5BQ1pBTklFIgorCisjOiBzY3JlZW4uYzo4MDUyCittc2dpZCAiIFNFTEVDVCBMSU5FIgorbXNnc3RyICIgWkFaTkFDWkFOSUUgTElOSU9XRSIKKworIzogc2NyZWVuLmM6ODA1MworbXNnaWQgIiBTRUxFQ1QgQkxPQ0siCittc2dzdHIgIiBaQVpOQUNaQU5JRSBCTE9LT1dFIgorCisjOiBzY3JlZW4uYzo4MDY4IHNjcmVlbi5jOjgxMzEKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgInphcGlzIgorCisjOiBzZWFyY2guYzozNworbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAic3p1a2FuaWUgZG9iabNvIEfTUlk7IGtvbnR5bnVhY2phIG9kIEtP0UNBIgorCisjOiBzZWFyY2guYzozOAorbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAic3p1a2FuaWUgZG9iabNvIEtP0UNBOyBrb250eW51YWNqYSBvZCBH01JZIgorCisjOiBzZWFyY2guYzo1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogTmlld7NhtmNpd3kgY2mxZyBkbyBzenVrYW5pYTogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IHN6dWthbmllIGRvYmmzbyBH01JZIGJleiB6bmFsZXppZW5pYTogJXMiCisKKyM6IHNlYXJjaC5jOjg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IHN6dWthbmllIGRvYmmzbyBLT9FDQSBiZXogem5hbGV6aWVuaWEgOiAlcyIKKworIzogc2VhcmNoLmM6MTI0OQorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogT2N6ZWt1auogJz8nIGx1YiAnLycgcG8gJzsnIgorCisjOiBzZWFyY2guYzozNzU4Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAoemF3aWVyYSBwb3ByemVkbmlvIHd5bWllbmlvbmUgZG9wYXNvd2FuaWUpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3NzgKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gWmF3YXJ0ZSBwbGlraSAiCisKKyM6IHNlYXJjaC5jOjM3ODAKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICJuaWUgem5hbGV6aW9ubyIKKworIzogc2VhcmNoLmM6Mzc4MQorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgIncgdHJvcGllIC0tLVxuIgorCisjOiBzZWFyY2guYzozODIwCittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgIChKdb8gd3ltaWVuaW9uZSkiCisKKyM6IHNlYXJjaC5jOjM4MjIKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICBOSUUgWk5BTEVaSU9OTyIKKworIzogc2VhcmNoLmM6Mzg3NAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAiUHJ6ZWdssWQgd7OxY3pvbmVnbyBwbGlrdTogJXMiCisKKyM6IHNlYXJjaC5jOjQwOTIKK21zZ2lkICJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiCittc2dzdHIgIkUzODc6IFd6b3J6ZWMgcGFzdWplIHcgYmllv7FjeW0gd2llcnN6dSIKKworIzogc2VhcmNoLmM6NDIzNQorbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICJXc3plbGtpZSB3s7FjemFuZSBwbGlraSBvZG5hbGV6aW9ubyIKKworIzogc2VhcmNoLmM6NDIzNworbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICJCcmFrIHezsWN6YW55Y2ggcGxpa/N3IgorCisjOiBzZWFyY2guYzo0MjUzCittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBOaWUgem5hbGF6s2VtIGRlZmluaWNqaSIKKworIzogc2VhcmNoLmM6NDI1NQorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTmllIHpuYWxherNlbSB3em9yY2EiCisKKyM6IHN5bnRheC5jOjMwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6IE5pZWRvendvbG9ueSBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjMyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IE5pZSBtYSB0YWtpZWdvIGtsYXN0cmEgc2uzYWRuaTogJXMiCisKKyM6IHN5bnRheC5jOjMzOTQKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIkJyYWsgZWxlbWVudPN3IHNrs2Fkbmkgb2tyZbZsb255Y2ggZGxhIHRlZ28gYnVmb3JhIgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzeW5jaHJvbml6YWNqYSBrb21lbnRhcnp5IHcgc3R5bHUgQyIKKworIzogc3ludGF4LmM6MzQxMAorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgImJyYWsgc3luY2hyb25pemFjamkiCisKKyM6IHN5bnRheC5jOjM0MTMKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgInBvY3qxdGVrIHN5bmNocm9uaXphY2ppIgorCisjOiBzeW50YXguYzozNDE1IHN5bnRheC5jOjM0OTAKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgd2llcnN6eSBwcnplZCBn83JusSBsaW5psSIKKworIzogc3ludGF4LmM6MzQyMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEVsZW1lbnR5IHN5bmNocm9uaXphY2ppIHNrs2FkbmkgLS0tIgorCisjOiBzeW50YXguYzozNDI1Cittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyJzeW5jaHJvbml6dWrqIG5hIGVsZW1lbnRhY2giCisKKyM6IHN5bnRheC5jOjM0MzEKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gRWxlbWVudHkgc2uzYWRuaSAtLS0iCisKKyM6IHN5bnRheC5jOjM0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IE5pZSBtYSB0YWtpZWdvIGtsYXN0cmEgc2uzYWRuaTogJXMiCisKKyM6IHN5bnRheC5jOjM0ODAKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAibWluaW1hbG5pZSAiCisKKyM6IHN5bnRheC5jOjM0ODcKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibWFrc3ltYWxuaWUgIgorCisjOiBzeW50YXguYzozNDk5Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgcGFzdWplICIKKworIzogc3ludGF4LmM6MzUwMQorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiem5ha/N3IG5vd2VnbyB3aWVyc3phIgorCisjOiBzeW50YXguYzo0MTM1Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiBncm91cFt0XWhlcmUgbmllZG96d29sb25lIHcgdHltIG1pZWpzY3UiCisKKyM6IHN5bnRheC5jOjQxNTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIgorbXNnc3RyICJFMzk0OiBOaWUgem5hbGF6s2VtIGVsZW1lbnTzdyByZWdpb251IGRsYSAlcyIKKworIzogc3ludGF4LmM6NDE4NworbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBhcmd1bWVudCBjb250YWlucyBuaWVkb3p3b2xvbnkgdyB0eW0gbWllanNjdSIKKworIzogc3ludGF4LmM6NDE5OAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiBhcmd1bWVudCBjb250YWluZWRpbiBuaWVkb3p3b2xvbnkgdyB0eW0gbWllanNjdSIKKworIzogc3ludGF4LmM6NDI3NgorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiBXeW1hZ2FuYSBuYXp3YSBwbGlrdSIKKworIzogc3ludGF4LmM6NDYxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IEJyYWsgJz0nOiAlcyIKKworIzogc3ludGF4LmM6NDc3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIKK21zZ3N0ciAiRTM5OTogWmEgbWGzbyBhcmd1bWVudPN3OiBzeW50YXggcmVnaW9uICVzIgorCisjOiBzeW50YXguYzo1MTAzCittc2dpZCAiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiCittc2dzdHIgIkU0MDA6IEJyYWsgc3BlY3lmaWthY2ppIGtsYXN0cmEiCisKKyM6IHN5bnRheC5jOjUxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogQnJhayBvZ3Jhbmljem5pa2Egd3pvcmNhOiAlcyIKKworIzogc3ludGF4LmM6NTIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiCmbWllY2kgcG8gd3pvcmN1OiAlcyIKKworIzogc3ludGF4LmM6NTMwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bnRheCBzeW5jOiB3aWVsb2tyb3RuaWUgcG9kYW5lIHd6b3JjZSBrb250eW51YWNqaSB3aWVyc3phIgorCisjOiBzeW50YXguYzo1MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogTmllZG96d29sb25lIGFyZ3VtZW50eTogJXMiCisKKyM6IHN5bnRheC5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogQnJhayB6bmFrdSBy83dub7ZjaTogJXMiCisKKyM6IHN5bnRheC5jOjU0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBQdXN0eSBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMgamVzdCBuaWVkb3p3b2xvbmUgdyB0eW0gbWllanNjdSIKKworIzogc3ludGF4LmM6NTQ1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG11c2kgYnnmIHBpZXJ3c3plIHcgbGm2Y2llIGNvbnRhaW5zIgorCisjOiBzeW50YXguYzo1NTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IE5pZXpuYW5hIG5hendhIGdydXB5OiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IE5pZXezYbZjaXdhIHBvZGtvbWVuZGEgOnN5bnRheCA6ICVzIgorCisjOiBzeW50YXguYzo2MTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiBuaWUgem5hbGV6aW9ubyBncnVweSBwb2S2d2lldGxhbmlhOiAlcyIKKworIzogc3ludGF4LmM6NjE2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogWmJ5dCBtYbNvIGFyZ3VtZW5083c6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiBaYnl0IHdpZWxlIGFyZ3VtZW5083c6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxODcKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IGdydXBhIG1hIHVzdGF3aWVuaWE7IHppZ25vcm93YW5lIHBvZLOxY3plbmllIHBvZLZ3aWV0bGFuaWEiCisKKyM6IHN5bnRheC5jOjYzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogbmllb2N6ZWtpd2FueSB6bmFrIHLzd25vtmNpOiAlcyIKKworIzogc3ludGF4LmM6NjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiBicmFrIHpuYWt1IHLzd25vtmNpOiAlcyIKKworIzogc3ludGF4LmM6NjM4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogYnJhayBhcmd1bWVudHU6ICVzIgorCisjOiBzeW50YXguYzo2NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTg6IElsbGVnYWwgdmFsdWU6ICVzIgorbXNnc3RyICJFNDE4OiBOaWVkb3p3b2xvbmEgd2FydG+25jogJXMiCisKKyM6IHN5bnRheC5jOjY1MzYKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiBLb2xvciBGRyBuaWV6bmFueSIKKworIzogc3ludGF4LmM6NjU0NworbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IEtvbG9yIEJHIG5pZXpuYW55IgorCisjOiBzeW50YXguYzo2NjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogTmF6d2EgbHViIGxpY3piYSBrb2xvcnUgbmllcm96cG96bmFuYTogJXMiCisKKyM6IHN5bnRheC5jOjY4MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMjogdGVybWluYWwgY29kZSB0b28gbG9uZzogJXMiCittc2dzdHIgIkU0MjI6IHphIGSzdWdpIGtvZCB0ZXJtaW5hbGE6ICVzIgorCisjOiBzeW50YXguYzo2ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiBOaWVkb3p3b2xvbnkgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDogWmJ5dCB3aWVsZSBy879ueWNoIGF0cnlidXTzdyBwb2RrcmW2bGFuaWEgdyB1v3ljaXUiCisKKyM6IHN5bnRheC5jOjc5MTEKK21zZ2lkICJFNjY5OiBVbnByaW50YWJsZSBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKK21zZ3N0ciAiRTY2OTogTmllZHJ1a293YWxueSB6bmFrIHcgbmF6d2llIGdydXB5IgorCisjLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorIy4gKiBnaXZlIGEgd2FybmluZy4KKyM6IHN5bnRheC5jOjc5MTgKK21zZ2lkICJXMTg6IEludmFsaWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIlcxODogbmllcHJhd2lks293eSB6bmFrIHcgbmF6d2llIGdydXB5IgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6IG5hIGRvbGUgc3Rvc3Ugem5hY3puaWvzdyIKKworIzogdGFnLmM6OTEKK21zZ2lkICJFNTU2OiBhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU2OiBuYSBn83J6ZSBzdG9zdSB6bmFjem5pa/N3IgorCisjOiB0YWcuYzo0MTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogTmllIG1vv25hIHByemVqtuYgcHJ6ZWQgcGllcndzenkgcGFzdWqxY3kgem5hY3puaWsiCisKKyM6IHRhZy5jOjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogbmllIHpuYWxlemlvbm8gem5hY3puaWthOiAlcyIKKworIzogdGFnLmM6NTgzCittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSByb2R6YWogem5hY3puaWsiCisKKyM6IHRhZy5jOjU4NgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAicGxpa1xuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzQ0Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICJXcHJvd2FkvCBuciB3eWJvcnUgKDxDUj4gcHJ6ZXJ5d2EpOiAiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogUGFzdWplIHR5bGtvIGplZGVuIHpuYWN6bmlrIgorCisjOiB0YWcuYzo3ODYKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI4OiBOaWUgbW+/bmEgcHJ6ZWq25iB6YSBvc3RhdG5pIHBhc3VqsWN5IHpuYWN6bmlrIgorCisjOiB0YWcuYzo4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIlBsaWsgXCIlc1wiIG5pZSBpc3RuaWVqZSIKKworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICJ6bmFjem5payAlZCB6ICVkJXMiCisKKyM6IHRhZy5jOjgyNgorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgbHViIHdp6mNlaiIKKworIzogdGFnLmM6ODI4Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAgVb95d2FtIHpuYWN6bmlrYSBvIG9kbWllbm5laiB3aWVsa2+2Y2kgbGl0ZXIhIgorCisjOiB0YWcuYzo4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IFBsaWsgXCIlc1wiIG5pZSBpc3RuaWVqZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIERPIHpuYWN6bmlrICBPRCB3aWVyc3phICAgICAgdyBwbGlrdS90ZWu2Y2llIgorCisjOiB0YWcuYzoxMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIlN6dWthbSB3IHBsaWt1IHpuYWN6bmlr83cgJXMiCisKKyM6IHRhZy5jOjE1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMDogVGFnIGZpbGUgcGF0aCB0cnVuY2F0ZWQgZm9yICVzXG4iCittc2dzdHIgIkU0MzA6IFRyb3Agc3p1a2FuaWEgcGxpa3Ugem5hY3puaWvzdyBvYmNp6nR5IGRsYSAlc1xuIgorCisjOiB0YWcuYzoyMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBCs7FkIGZvcm1hdHUgdyBwbGlrdSB6bmFjem5pa/N3IFwiJXNcIiIKKworIzogdGFnLmM6MjIwNworIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIlByemVkIGJhanRlbSAlbGQiCisKKyM6IHRhZy5jOjIyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiBQbGlrIHpuYWN6bmlr83cgbmlldXBvcnqxZGtvd2FueTogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoyMjgwCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiBCcmFrIHBsaWt1IHpuYWN6bmlr83ciCisKKyM6IHRhZy5jOjMwMTYKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBOaWUgbW9n6iB6bmFsZbzmIHd6b3JjYSB6bmFjem5pa2EiCisKKyM6IHRhZy5jOjMwMjcKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IE5pZSB6bmFsYXqzZW0gem5hY3puaWthIC0gdHlsa28gemdhZHVq6iEiCisKKyM6IHRlcm0uYzoxNzU5Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIG5pZXpuYW55LiBNb79saXdlIHR5cHkgd2J1ZG93YW55Y2ggdGVybWluYWxpOiIKKworIzogdGVybS5jOjE3ODMKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgImRvbXm2bG5pZSBqZXN0ICciCisKKyM6IHRlcm0uYzoyMTQxCittc2dpZCAiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJFNTU3OiBOaWUgbW9n6iBvdHdvcnp55iBwbGlrdSB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6MjE0NQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogTmllIG1hIG9waXN1IHRha2llZ28gdGVybWluYWxhIHcgdGVybWluZm8iCisKKyM6IHRlcm0uYzoyMTQ3Cittc2dpZCAiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1NTk6IE5pZSBtYSBvcGlzdSB0YWtpZWdvIHRlcm1pbmFsYSB3IHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyMzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBCcmFrIG9waXN1IFwiJXNcIiB3IHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyNzgwCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IHd5bWFnYW5hIHpkb2xub7bmIFwiY21cIiB0ZXJtaW5hbGEiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5OTAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEtsYXdpc3plIHRlcm1pbmFsYSAtLS0iCisKKyM6IHVpLmM6MjU4Cittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAidXJ1Y2hvbWlvbm8gbm93sSBwb3ezb2vqXG4iCisKKyM6IHVpLmM6MTg0MQorbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IEKzsWQgcG9kY3phcyB3Y3p5dHl3YW5pYSB3ZWq2Y2lhLCBrb/FjeuouLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzo0MDUKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIkNvZm5p6mNpZSBuaWVtb79saXdlOyBtaW1vIHRvIGtvbnR5bnV1auoiCisKKyM6IHVuZG8uYzo1NjEKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiBuaWV3s2G2Y2l3ZSBudW1lcnkgd2llcnN6eSIKKworIzogdW5kby5jOjc1NworbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICIxIHptaWFuYSIKKworIzogdW5kby5jOjc1OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIHptaWFuIgorCisjOiB1bmRvLmM6ODEyCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IHVzemtvZHpvbmEgbGlzdGEgY29mYW5pYSIKKworIzogdW5kby5jOjg0NAorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiBicmFrIHdpZXJzemEgY29mYW5pYSIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjE3NjkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNi8zMiBiaXRvd2Egd2Vyc2phIEdVSSBkbGEgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjE3NzEKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvd2Egd2Vyc2phIEdVSSBkbGEgTVMtV2luZG93cyIKKworIzogdmVyc2lvbi5jOjE3NzQKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiB3IHRyeWJpZSBXaW4zMnMiCisKKyM6IHZlcnNpb24uYzoxNzc2Cittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIiB6ZSB3c3BvbWFnYW5pZW0gT0xFIgorCisjOiB2ZXJzaW9uLmM6MTc3OQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvd2Egd2Vyc2phIG5hIGtvbnNvbOogZGxhIE1TLVdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzoxNzgzCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiBiaXRvd2Egd2Vyc2phIGRsYSBNUy1XaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6MTc4NworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvd2Egd2Vyc2phIGRsYSBNUy1ET1MiCisKKyM6IHZlcnNpb24uYzoxNzg5Cittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IGJpdG93YSB3ZXJzamEgZGxhIE1TLURPUyIKKworIzogdmVyc2lvbi5jOjE3OTUKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIndlcnNqYSBkbGEgTWFjT1MgWCAodW5peCkiCisKKyM6IHZlcnNpb24uYzoxNzk3Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIndlcnNqYSBkbGEgTWFjT1MgWCIKKworIzogdmVyc2lvbi5jOjE4MDAKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIndlcnNqYSBkbGEgTWFjT1MiCisKKyM6IHZlcnNpb24uYzoxODA1Cittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIndlcnNqYSBkbGEgUklTQyBPUyIKKworIzogdmVyc2lvbi5jOjE4MTUKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICIiCisiXG4iCisiWmFkYW5lILNhdHk6ICIKKworIzogdmVyc2lvbi5jOjE4NDEgdmVyc2lvbi5jOjIyMDkKK21zZ2lkICJNb2RpZmllZCBieSAiCittc2dzdHIgIlptaWVuaW9ueSBwcnpleiAiCisKKyM6IHZlcnNpb24uYzoxODQ4Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIlNrb21waWxvd2FueSAiCisKKyM6IHZlcnNpb24uYzoxODUxCittc2dpZCAiYnkgIgorbXNnc3RyICJwcnpleiAiCisKKyM6IHZlcnNpb24uYzoxODYzCittc2dpZCAiIgorIlxuIgorIkh1Z2UgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJPbGJyenltaWEgd2Vyc2phICIKKworIzogdmVyc2lvbi5jOjE4NjYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiRHW/YSB3ZXJzamEgIgorCisjOiB2ZXJzaW9uLmM6MTg2OQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJOb3JtYWxuYSB3ZXJzamEgIgorCisjOiB2ZXJzaW9uLmM6MTg3MgorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1hs2Egd2Vyc2phICIKKworIzogdmVyc2lvbi5jOjE4NzQKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1hbHV0a2Egd2Vyc2phICIKKworIzogdmVyc2lvbi5jOjE4ODAKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgImJleiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg4NQorbXNnaWQgIndpdGggR1RLMi1HTk9NRSBHVUkuIgorbXNnc3RyICJ6IEdUSzItR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4ODcKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJ6IEdUSy1HTk9NRSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg5MQorbXNnaWQgIndpdGggR1RLMiBHVUkuIgorbXNnc3RyICJ6IEdUSzIgR1VJLiIKKworIzogdmVyc2lvbi5jOjE4OTMKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICJ6IEdUSyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTg5OAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgInogWDExLU1vdGlmIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTAyCittc2dpZCAid2l0aCBYMTEtbmVYdGF3IEdVSS4iCittc2dzdHIgInogWDExLW5lWHRhdyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkwNAorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICJ6IFgxMS1BdGhlbmEgR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MDgKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAieiBCZU9TIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTExCittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAieiBQaG90b24gR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MTQKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgInogR1VJLiIKKworIzogdmVyc2lvbi5jOjE5MTcKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJ6IENhcmJvbiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkyMAorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAieiBDb2NvYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTkyMworbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgInogKGtsYXN5Y3pueW0pIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxOTM0Cittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICBPcGNqZSB3s7Fjem9uZSAoKykgbHViIG5pZSAoLSk6XG4iCisKKyM6IHZlcnNpb24uYzoxOTQ2Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgdmltcmMgc3lzdGVtdTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTUxCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICB2aW1yYyB1v3l0a293bmlrYTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTU2Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgMi1naSBwbGlrIHZpbXJjIHW/eXRrb3duaWthOiBcIiIKKworIzogdmVyc2lvbi5jOjE5NjEKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAzLWNpIHBsaWsgdmltcmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk2NgorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIGV4cmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk3MQorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAyLWdpIHBsaWsgZXhyYyB1v3l0a293bmlrYTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTc3Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIGd2aW1yYyBzeXN0ZW11OiBcIiIKKworIzogdmVyc2lvbi5jOjE5ODEKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgZ3ZpbXJjIHW/eXRrb3duaWthOiBcIiIKKworIzogdmVyc2lvbi5jOjE5ODUKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIjItZ2kgcGxpayBndmltcmMgdb95dGtvd25pa2E6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTk5MAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiMy1jaSBwbGlrIGd2aW1yYyB1v3l0a293bmlrYTogXCIiCisKKyM6IHZlcnNpb24uYzoxOTk3Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgc3lzdGVtb3d5IHBsaWsgbWVudTogXCIiCisKKyM6IHZlcnNpb24uYzoyMDA1Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICBvZHdldCBkbGEgJFZJTS1hOiBcIiIKKworIzogdmVyc2lvbi5jOjIwMTEKK21zZ2lkICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCittc2dzdHIgImYtYiBkbGEgJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6MjAxNQorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIktvbXBpbGFjamE6ICIKKworIzogdmVyc2lvbi5jOjIwMjEKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICJLb21waWxhdG9yOiAiCisKKyM6IHZlcnNpb24uYzoyMDI2Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICJLb25zb2xpZGFjamE6ICIKKworIzogdmVyc2lvbi5jOjIwMzEKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIEtPTVBJTEFDSkEgREVCVUciCisKKyM6IHZlcnNpb24uYzoyMDcwCittc2dpZCAiVklNIC0gVmkgSU1wcm92ZWQiCittc2dzdHIgIlZJTSAtIFZpIHJvemJ1ZG93YW55IgorCisjOiB2ZXJzaW9uLmM6MjA3MgorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICJ3ZXJzamEgIgorCisjOiB2ZXJzaW9uLmM6MjA3MworbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAiQXV0b3I6IEJyYW0gTW9vbGVuYWFyIGkgSW5uaS4iCisKKyM6IHZlcnNpb24uYzoyMDc3Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIGplc3Qgb3BlbiBzb3VyY2UgaSByb3pwcm93YWR6YW55IGRhcm1vd28iCisKKyM6IHZlcnNpb24uYzoyMDc5Cittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIlBvbfO/IGJpZWRueW0gZHppZWNpb20gdyBVZ2FuZHppZSEiCisKKyM6IHZlcnNpb24uYzoyMDgwCittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAid3Byb3dhZLwgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgIGRsYSBpbmZvcm1hY2ppIG8gdHltICAiCisKKyM6IHZlcnNpb24uYzoyMDgyCittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAid3Byb3dhZLwgOnE8RW50ZXI+ICAgICAgICAgICAgICAgIHpha2/xY3plbmllIHByb2dyYW11ICAgIgorCisjOiB2ZXJzaW9uLmM6MjA4MworbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgIndwcm93YWS8IDpoZWxwPEVudGVyPiAgbHViICA8RjE+ICBwb21vYyBuYSBiaWW/sWNvICAgICAgICIKKworIzogdmVyc2lvbi5jOjIwODQKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICJ3cHJvd2FkvCA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICAgZGxhIGluZm9ybWFjamkgbyB3ZXJzamkiCisKKyM6IHZlcnNpb24uYzoyMDg3Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIkR6aWGzYW0gdyB0cnliaWUgemdvZG5vtmNpIHogVmkiCisKKyM6IHZlcnNpb24uYzoyMDg4Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAid3Byb3dhZLwgOnNldCBub2NwPEVudGVyPiAgICAgICAgIHdhcnRvtmNpIGRvbXm2bG5lIFZpbS1hIgorCisjOiB2ZXJzaW9uLmM6MjA4OQorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIndwcm93YWS8IDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+ICBkbGEgaW5mb3JtYWNqaSB0byB0eW0gICIKKworIzogdmVyc2lvbi5jOjIxMDQKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICJ3cHJvd2FkvCA6aGVscCBpY2NmPEVudGVyPiAgICAgICAgZGxhIGluZm9ybWFjamkgdG8gdHltICAiCisKKyM6IHZlcnNpb24uYzoyMTA2Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiVXJ1Y2hvbWlvbnkgYmV6IHRyeWLzdywgd3Bpc2FueSB0ZWtzdCBqZXN0IHdwcm93YWR6YW55IgorCisjOiB2ZXJzaW9uLmM6MjEwNworbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIm1lbnUgIEVkeXR1ai0+VXN0YXdpZW5pYSBnbG9iYWxuZS0+VHJ5YiB3c3Rhd2lhbmlhIgorCisjOiB2ZXJzaW9uLmM6MjEwOAorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgIGRsYSBkd/NjaCB0cnli83cgICAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjIxMTIKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIgorbXNnc3RyICJtZW51IEVkeXR1ai0+VXN0YXdpZW5pYSBnbG9iYWxuZS0+S29tcGF0eWJpbG5vtuYgeiBWaSIKKworIzogdmVyc2lvbi5jOjIxMTMKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgIGRsYSBkb215tmxueWNoIHVzdGF3aWXxIFZpbWEgICAiCisKKyM6IHZlcnNpb24uYzoyMTYwCittc2dpZCAiU3BvbnNvciBWaW0gZGV2ZWxvcG1lbnQhIgorbXNnc3RyICJTcG9uc29ydWogcm96d/NqIFZpbWEhIgorCisjOiB2ZXJzaW9uLmM6MjE2MQorbXNnaWQgIkJlY29tZSBhIHJlZ2lzdGVyZWQgVmltIHVzZXIhIgorbXNnc3RyICJab3N0YfEgemFyZWplc3Ryb3dhbnltIHW/eXRrb3duaWtpZW0gVmltYSEiCisKKyM6IHZlcnNpb24uYzoyMTY0Cittc2dpZCAidHlwZSAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAid3Byb3dhZLwgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgICAgIGRsYSBpbmZvcm1hY2ppIgorCisjOiB2ZXJzaW9uLmM6MjE2NQorbXNnaWQgInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIndwcm93YWS8IDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgICAgICAgZGxhIGluZm9ybWFjamkiCisKKyM6IHZlcnNpb24uYzoyMTY3Cittc2dpZCAibWVudSAgSGVscC0+U3BvbnNvci9SZWdpc3RlciAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAibWVudSBQb21vYy0+U3BvbnNvcnVqL1phcmVqZXN0cnVqIHNp6iBkbGEgaW5mb3JtYWNqaSIKKworIzogdmVyc2lvbi5jOjIxNzcKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICJPU1RSWkWvRU5JRTogd3lrcnl0byBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6MjE4MAorbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIndwcm93YWS8IDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gICBkbGEgaW5mb3JtYWNqaSB0byB0eW0gICIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IE5pZSBtYSBva25hIHBvZGdssWR1IgorCisjOiB3aW5kb3cuYzo1ODEKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiBOaWUgbW9n6iByb3pkemllbGnmIGxld28tZ/NybmVnbyBpIHByYXdvLWRvbG5lZ28gamVkbm9jemW2bmllIgorCisjOiB3aW5kb3cuYzoxMzQwCittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiBOaWUgbW9n6iBwcnpla3LqY2nmLCBnZHkgaW5uZSBva25vIGplc3Qgcm96ZHppZWxvbmUiCisKKyM6IHdpbmRvdy5jOjE4MzYKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IE5pZSBtb2fqIHphbWtuseYgb3N0YXRuaWVnbyBva25hIgorCisjOiB3aW5kb3cuYzoyNTY3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIkp1vyBqZXN0IHR5bGtvIGplZGVuIHdpZG9rIgorCisjOiB3aW5kb3cuYzoyNjE0Cittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IElubmUgb2tubyB6YXdpZXJhIHptaWFueSIKKworIzogd2luZG93LmM6NDQ4MAorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IEJyYWsgbmF6d3kgcGxpa3UgcG9kIGt1cnNvcmVtIgorCisjOiB3aW5kb3cuYzo0NTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogTmllIG1vZ+ogem5hbGW85iBwbGlrdSBcIiVzXCIgdyB0cm9waWUiCisKKyM6IGlmX3BlcmwueHM6MzI2IGdsb2JhbHMuaDoxMjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IE5pZSBtb2ezZW0gemGzYWRvd2HmIGJpYmxpb3Rla2kgJXMiCisKKyM6IGlmX3BlcmwueHM6NTU0Cittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFBlcmwgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiUHJ6eWtybyBtaSwgdGEga29tZW5kYSBqZXN0IHd5s7Fjem9uYTogbmllIG1vZ7NlbSB6YbNhZG93YeYgYmlibGlvdGVraSBQZXJsYS4iCisKKyM6IGlmX3BlcmwueHM6NjA3Cittc2dpZCAiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIgorbXNnc3RyICJFMjk5OiB3eWxpY3plbmllIFBlcmxhIHphYnJvbmlvbmUgdyBwaWFza293bmljeSBiZXogbW9kdbN1IFNhZmUiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTgzCittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJFZHl0dWogdyAmd2llbHUgVmltYWNoIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiRWR5dHVqIHcgcG9qZWR5bmN6eW0gJlZpbWllIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICImRGlmZiB6IFZpbWVtIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYxMQorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJFZHl0dWogdyAmVmltaWUiCisKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MzMKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAiRWR5dHVqIHogaXN0bmllarFjeW0gVmltZW0gLSAmIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjc0NgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICJFZHl0dWogd3licmFuZSBwbGlraSB3IFZpbWllIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NSBHdmltRXh0L2d2aW1leHQuY3BwOjk2NgorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAiQrOxZCB0d29yemVuaWEgcHJvY2VzdTogU3ByYXdkvCBjenkgZ3ZpbSBqZXN0IHcgdHdvamVqILZjaWW/Y2UhIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NiBHdmltRXh0L2d2aW1leHQuY3BwOjkwMCBHdmltRXh0L2d2aW1leHQuY3BwOjk2NworbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICJis7FkIGd2aW1leHQuZGxsIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg5OQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAiWmEgZLN1Z2EgtmNpZb9rYSEiCisKKyM6IGdsb2JhbHMuaDoxMDIyCittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS1CcmFrIHdpZXJzenkgdyBidWZvcnplLS0iCisKKyMuCisjLiAqIFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBzaGFyZWQgYXJlIGluY2x1ZGVkIGhlcmUuCisjLiAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyMuCisjOiBnbG9iYWxzLmg6MTE4NQorbXNnaWQgIkU0NzA6IENvbW1hbmQgYWJvcnRlZCIKK21zZ3N0ciAiRTQ3MDogUHJ6ZXJ3YW5pZSBrb21lbmR5IgorCisjOiBnbG9iYWxzLmg6MTE4NgorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiB3eW1hZ2FueSBhcmd1bWVudCIKKworIzogZ2xvYmFscy5oOjExODcKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogcG8gXFwgcG93aW5ubyBieeYgLywgPyBsdWIgJiIKKworIzogZ2xvYmFscy5oOjExODkKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6IE5pZWRvendvbG9uZSB3IG9rbmllIHdpZXJzemEgcG9sZWNl8TsgPENSPiB3eWtvbnVqZSwgQ1RSTC1DIG9wdXN6Y3phIgorCisjOiBnbG9iYWxzLmg6MTE5MQorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiIgorIkUxMjogS29tZW5kYSBuaWVkb3p3b2xvbmEgeiBleHJjL3ZpbXJjIHcgYmllv7FjeW0gc3p1a2FuaXUga2F0YWxvZ3UgbHViICIKKyJ6bmFjem5pa2EiCisKKyM6IGdsb2JhbHMuaDoxMTkzCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IEJyYWsgOmVuZGlmIgorCisjOiBnbG9iYWxzLmg6MTE5NAorbXNnaWQgIkU2MDA6IE1pc3NpbmcgOmVuZHRyeSIKK21zZ3N0ciAiRTYwMDogQnJhayA6ZW5kdHJ5IgorCisjOiBnbG9iYWxzLmg6MTE5NQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiBCcmFrIDplbmR3aGlsZSIKKworIzogZ2xvYmFscy5oOjExOTYKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDplbmR3aGlsZSBiZXogOndoaWxlIgorCisjOiBnbG9iYWxzLmg6MTE5OAorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiBQbGlrIGlzdG5pZWplICh3eW11tiBwb3ByemV6ICEpIgorCisjOiBnbG9iYWxzLmg6MTE5OQorbXNnaWQgIkU0NzI6IENvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJFNDcyOiBLb21lbmRhIG5pZSBwb3dpb2SzYSBzaeoiCisKKyM6IGdsb2JhbHMuaDoxMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IE5pZXpuYW55IHplc3RhdyBjemNpb25lazogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IE5pZXpuYW5hIGN6Y2lvbmthOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBDemNpb25rYSBcIiVzXCIgbmllIG1hIHN0YbNlaiBzemVyb2tvtmNpIHpuYWvzdyIKKworIzogZ2xvYmFscy5oOjEyMTAKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3MzogQrOxZCB3ZXdu6nRyem55IgorCisjOiBnbG9iYWxzLmg6MTIxMQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICJQcnplcndhbmUiCisKKyM6IGdsb2JhbHMuaDoxMjEyCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogTmlld7NhtmNpd3kgYWRyZXMiCisKKyM6IGdsb2JhbHMuaDoxMjEzCittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogTmlld7NhtmNpd3kgYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiBOaWV3s2G2Y2l3eSBhcmd1bWVudDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiBOaWV3s2G2Y2l3ZSB3eXJhv2VuaWU6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxOAorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiBOaWV3s2G2Y2l3eSB6YWtyZXMiCisKKyM6IGdsb2JhbHMuaDoxMjE5Cittc2dpZCAiRTQ3NjogSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJFNDc2OiBOaWV3s2G2Y2l3YSBrb21lbmRhIgorCisjOiBnbG9iYWxzLmg6MTIyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIgamVzdCBrYXRhbG9naWVtIgorCisjOiBnbG9iYWxzLmg6MTIyNAorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogTmllb2N6ZWtpd2FuZSB6bmFraSBwcnplZCAnPSciCisKKyM6IGdsb2JhbHMuaDoxMjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjQ6IExpYnJhcnkgY2FsbCBmYWlsZWQgZm9yIFwiJXMoKVwiIgorbXNnc3RyICJFMzY0OiBXeXdvs2FuaWUgeiBiaWJsaW90ZWtpIG5pZSBwb3dpb2SzbyBzaeogZGxhIFwiJXMoKVwiIgorCisjOiBnbG9iYWxzLmg6MTIzMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiBOaWUgbW+/bmEgemGzYWRvd2HmIGZ1bmtjamkgYmlibGlvdGVraSAlcyIKKworIzogZ2xvYmFscy5oOjEyMzUKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTogWmFrs2Fka2EgbWEgbmlld7NhtmNpd3kgbnVtZXIgd2llcnN6YSIKKworIzogZ2xvYmFscy5oOjEyMzYKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiBaYWuzYWRrYSBuaWVuYXN0YXdpb25hIgorCisjOiBnbG9iYWxzLmg6MTIzNworbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBOaWUgbW9n6iB3eWtvbmHmIHptaWFuLCAnbW9kaWZpYWJsZScgamVzdCB3ebOxY3pvbmUiCisKKyM6IGdsb2JhbHMuaDoxMjM4Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiBaYnl0IGez6mJva2llIHphZ25pZb9kv2VuaWUgc2tyeXB083ciCisKKyM6IGdsb2JhbHMuaDoxMjM5Cittc2dpZCAiRTIzOiBObyBhbHRlcm5hdGUgZmlsZSIKK21zZ3N0ciAiRTIzOiBCcmFrIHBsaWt1IHphbWlhbnkiCisKKyM6IGdsb2JhbHMuaDoxMjQwCittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBOaWUgbWEgdGFraWVnbyBza3LzdHUiCisKKyM6IGdsb2JhbHMuaDoxMjQxCittc2dpZCAiRTQ3NzogTm8gISBhbGxvd2VkIgorbXNnc3RyICJFNDc3OiBOaWVkb3p3b2xvbmUgISIKKworIzogZ2xvYmFscy5oOjEyNDMKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6IEdVSSBuaWUgbW+/ZSBieeYgdb95dGU6IE5pZSB3s7Fjem9ubyBwb2RjemFzIGtvbXBpbGFjamkiCisKKyM6IGdsb2JhbHMuaDoxMjQ2Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IEhlYnJhanNraSBuaWUgbW+/ZSBieeYgdb95dHk6IE5pZSB3s7Fjem9ubyBwb2RjemFzIGtvbXBpbGFjamlcbiIKKworIzogZ2xvYmFscy5oOjEyNDkKK21zZ2lkICJFMjc6IEZhcnNpIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI3OiBGYXJzaSBuaWUgbW+/ZSBieeYgdb95dHk6IE5pZSB3s7Fjem9ubyBwb2RjemFzIGtvbXBpbGFjamlcbiIKKworIzogZ2xvYmFscy5oOjEyNTIKK21zZ2lkICJFODAwOiBBcmFiaWMgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFODAwOiBBcmFic2tpIG5pZSBtb79lIGJ55iB1v3l0eTogTmllIHezsWN6b25vIHBvZGN6YXMga29tcGlsYWNqaVxuIgorCisjOiBnbG9iYWxzLmg6MTI1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IEJyYWsgdGFraWVqIG5hend5IGdydXB5IHBvZLZ3aWV0bGFuaWE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTI1NworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogTmllIHdwcm93YWR6b25vIGplc3pjemUgv2FkbmVnbyB0ZWtzdHUiCisKKyM6IGdsb2JhbHMuaDoxMjU4Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogTmllIG1hIHBvcHJ6ZWRuaWVnbyB3aWVyc3phIHBvbGVjZfEiCisKKyM6IGdsb2JhbHMuaDoxMjU5Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogTmllIG1hIHRha2llZ28gcHJ6eXBvcnqxZGtvd2FuaWEiCisKKyM6IGdsb2JhbHMuaDoxMjYwCittc2dpZCAiRTQ3OTogTm8gbWF0Y2giCittc2dzdHIgIkU0Nzk6IEJyYWsgZG9wYXNvd2HxIgorCisjOiBnbG9iYWxzLmg6MTI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDgwOiBObyBtYXRjaDogJXMiCittc2dzdHIgIkU0ODA6IEJyYWsgZG9wYXNvd2HxOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNjIKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiBCcmFrIG5hend5IHBsaWt1IgorCisjOiBnbG9iYWxzLmg6MTI2MworbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogQnJhayBwb3ByemVkbmllZ28gcG9kc3Rhd2llbmlvd2VnbyB3eXJhv2VuaWEgcmVndWxhcm5lZ28iCisKKyM6IGdsb2JhbHMuaDoxMjY0Cittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IEJyYWsgcG9wcnplZG5pZWoga29tZW5keSIKKworIzogZ2xvYmFscy5oOjEyNjUKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiBCcmFrIHBvcHJ6ZWRuaWVnbyB3eXJhv2VuaWEgcmVndWxhcm5lZ28iCisKKyM6IGdsb2JhbHMuaDoxMjY2Cittc2dpZCAiRTQ4MTogTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAiRTQ4MTogWmFrcmVzIG5pZWRvendvbG9ueSIKKworIzogZ2xvYmFscy5oOjEyNjgKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBCcmFrIG1pZWpzY2EiCisKKyM6IGdsb2JhbHMuaDoxMjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogYnJhayB6YXJlamVzdHJvd2FuZWdvIHNlcndlcmEgbyBuYXp3aWUgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTI3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDgyOiBDYW4ndCBjcmVhdGUgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4MjogTmllIG1vZ+ogc3R3b3J6eeYgcGxpa3UgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjc0Cittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiBOaWUgbW9n6iBwb2JyYeYgbmF6d3kgcGxpa3UgdHltY3phc293ZWdvIgorCisjOiBnbG9iYWxzLmg6MTI3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg0OiBDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIkU0ODQ6IE5pZSBtb2fqIG90d29yennmIHBsaWt1ICVzIgorCisjOiBnbG9iYWxzLmg6MTI3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg1OiBDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIkU0ODU6IE5pZSBtb2fqIG9kY3p5dGHmIHBsaWt1ICVzIgorCisjOiBnbG9iYWxzLmg6MTI3NworbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiBOaWUgemFwaXNhbm8gb2Qgb3N0YXRuaWVqIHptaWFueSAod3ltdbYgcHJ6ZXogISkiCisKKyM6IGdsb2JhbHMuaDoxMjc4Cittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IFplcm93eSBhcmd1bWVudCIKKworIzogZ2xvYmFscy5oOjEyODAKK21zZ2lkICJFMzk6IE51bWJlciBleHBlY3RlZCIKK21zZ3N0ciAiRTM5OiBPY3pla3Vq6iBsaWN6YnkiCisKKyM6IGdsb2JhbHMuaDoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDogTmllIG1vZ+ogb3R3b3J6eeYgcGxpa3UgYrPqZPN3ICVzIgorCisjOiBnbG9iYWxzLmg6MTI4NgorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IG5pZSBtb2fqIG90d29yennmIGVrcmFudSIKKworIzogZ2xvYmFscy5oOjEyODgKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IFBhbWnq5iB3eWN6ZXJwYW5hISIKKworIzogZ2xvYmFscy5oOjEyOTAKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiTmllIHpuYWxlemlvbm8gd3pvcmNhIgorCisjOiBnbG9iYWxzLmg6MTI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg2OiBQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0ODY6IE5pZSB6bmFsZXppb25vIHd6b3JjYTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjkzCittc2dpZCAiRTQ4NzogQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiRTQ4NzogQXJndW1lbnQgbXVzaSBieeYgZG9kYXRuaSIKKworIzogZ2xvYmFscy5oOjEyOTUKK21zZ2lkICJFNDU5OiBDYW5ub3QgZ28gYmFjayB0byBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkU0NTk6IE5pZSBtb79uYSBwcnplarbmIGRvIHBvcHJ6ZWRuaWVnbyBrYXRhbG9ndSIKKworIzogZ2xvYmFscy5oOjEyOTkKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiBCcmFrIEKz6mTzdyIKKworIzogZ2xvYmFscy5oOjEzMDEKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6IFBvcHN1dHkgY2mxZyB3em9yY2EiCisKKyM6IGdsb2JhbHMuaDoxMzAyCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogWmVwc3V0eSBwcm9ncmFtIHd5cmG/ZfEgcmVndWxhcm55Y2giCisKKyM6IGdsb2JhbHMuaDoxMzAzCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiBvcGNqYSAncmVhZG9ubHknIGplc3QgdXN0YXdpb25hICh3eW11tiBwb3ByemV6ICEpIgorCisjOiBnbG9iYWxzLmg6MTMwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBOaWUgbW9n6iB1c3Rhd2nmIHptaWVubmVqIHR5bGtvIGRvIG9kY3p5dHUgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTMwOAorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0NzogQrOxZCB3IHRyYWtjaWUgY3p5dGFuaWEgcGxpa3UgYrPqZPN3IgorCisjOiBnbG9iYWxzLmg6MTMxMQorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBOaWVkb3p3b2xvbmUgdyBwaWFza293bmljeSIKKworIzogZ2xvYmFscy5oOjEzMTMKK21zZ2lkICJFNTIzOiBOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNTIzOiBOaWVkb3p3b2xvbmUgdyB0eW0gbWllanNjdSIKKworIzogZ2xvYmFscy5oOjEzMTYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IFVzdGF3aWFuaWUgdHJ5YnUgZWtyYW51IG5pZXdzcG9tYWdhbmUiCisKKyM6IGdsb2JhbHMuaDoxMzE4Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IE5pZXezYbZjaXdhIHdpZWxrb7bmIHByemV3aW5p6mNpYSIKKworIzogZ2xvYmFscy5oOjEzMTkKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IG9wY2phICdzaGVsbCcgamVzdCBwdXN0YSIKKworIzogZ2xvYmFscy5oOjEzMjEKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IE5pZSBtb2ezZW0gd2N6eXRh5iBkYW55Y2ggem5ha3UhIgorCisjOiBnbG9iYWxzLmg6MTMyMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IEKzsWQgcG9kY3phcyB6YW15a2FuaWEgcGxpa3Ugd3ltaWFueSIKKworIzogZ2xvYmFscy5oOjEzMjQKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiBzdG9zIHpuYWN6bmlr83cgamVzdCBwdXN0eSIKKworIzogZ2xvYmFscy5oOjEzMjUKK21zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCittc2dzdHIgIkU3NDogS29tZW5kYSBqZXN0IHpieXQgc2tvbXBsaWtvd2FuYSIKKworIzogZ2xvYmFscy5oOjEzMjYKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTogWmJ5dCBks3VnYSBuYXp3YSIKKworIzogZ2xvYmFscy5oOjEzMjcKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3NjogWmJ5dCB3aWVsZSBbIgorCisjOiBnbG9iYWxzLmg6MTMyOAorbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiBaYnl0IHdpZWxlIG5hencgcGxpa/N3IgorCisjOiBnbG9iYWxzLmg6MTMyOQorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IE5hZHN06nBuZSB6bmFjemtpIgorCisjOiBnbG9iYWxzLmg6MTMzMAorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IE5pZXpuYW5hIHpha7NhZGthIgorCisjOiBnbG9iYWxzLmg6MTMzMQorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTogTmllIG1vZ7Egcm96d2luseYgem5ha/N3IHdpZWxvem5hY3pueWNoIgorCisjOiBnbG9iYWxzLmg6MTMzMworbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIG5pZSBtb79lIGJ55iBtbmllanN6ZSBuab8gJ3dpbm1pbmhlaWdodCciCisKKyM6IGdsb2JhbHMuaDoxMzM1Cittc2dpZCAiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIkU1OTI6ICd3aW53aWR0aCcgbmllIG1vv2UgYnnmIG1uaWVqc3plIG5pvyAnd2lubWlud2lkdGgnIgorCisjOiBnbG9iYWxzLmg6MTMzOAorbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiBCs7FkIHcgdHJha2NpZSB6YXBpc3UiCisKKyM6IGdsb2JhbHMuaDoxMzM5Cittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAiWmVyb3d5IGxpY3puaWsiCisKKyM6IGdsb2JhbHMuaDoxMzQxCittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBVv3ljaWUgPFNJRD4gcG96YSBrb250ZWtzdGVtIHNrcnlwdHUiCisKKyM6IGdsb2JhbHMuaDoxMzQ0Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiBPZGVicmGzZW0gbmlld7NhtmNpd2Ugd3lyYb9lbmllIgorCisjOiBnbG9iYWxzLmg6MTM0NworbXNnaWQgIkU0NjM6IFJlZ2lvbiBpcyBndWFyZGVkLCBjYW5ub3QgbW9kaWZ5IgorbXNnc3RyICJFNDYzOiBSZWdpb24gamVzdCBjaHJvbmlvbnksIG5pZSBtb2fqIHptaWVuaeYiCisKZGlmZiAtLWdpdCBhL3NyYy9wby9ydS5jcDEyNTEucG8gYi9zcmMvcG8vcnUuY3AxMjUxLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjBhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vcnUuY3AxMjUxLnBvCkBAIC0wLDAgKzEsNjY1OCBAQAorIyBSdXNzaWFuIHRyYW5zbGF0aW9uIGZvciBWaW0KKyMgCisjIM7hIPPx6+7i6P/1IOjx7+7r/Ofu4uDt6P8g9+jy4Ony5SDiIPDl5ODq8u7w5SBWaW0gIjpoZWxwIHVnYW5kYSIKKyMgziDr/uT/9Swg5OXr4P756PUgVmltIPfo8uDp8uUg4iDw5eTg6vLu8OUgIjpoZWxwIODi8u7w+yIKKyMKKyMgdmFzc2lseSAidnIiIHJhZ29zaW4gPHZyckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCAyMDA0CisjCisjIEdlbmVyYXRlZCBmcm9tIHJ1LnBvLCBETyBOT1QgRURJVC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFZpbSA2LjNhXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA0LTA1LTEwIDIxOjM3KzA0MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA1LTEwIDIxOjM3KzA0MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IHZhc3NpbHkgcmFnb3NpbiA8dnJyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZS1UZWFtOiB2YXNzaWx5IHJhZ29zaW4gPHZyckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Y3AxMjUxXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBidWZmZXIuYzoxMDIKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IM3l4u7n7O7m7e4g4vvk5evo8vwg7+Ds//L8IOTg5uUg5Ov/IO7k7e7j7iDh8/Tl8OAsIOL79e7kLi4uIgorCisjOiBidWZmZXIuYzoxMDUKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiDN5eLu5+zu5u3uIOL75OXr6PL8IO/g7P/y/CDk6/8g4fP05fDgLCDo8e/u6/zn8+XsIOTw8+Pu6SDh8/Tl8C4uLiIKKworIzogYnVmZmVyLmM6ODA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTU6IE5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiRTUxNTogzegg7uTo7SDh8/Tl8CDt5SDh++sg4vvj8PPm5e0g6Ocg7+Ds//LoIgorCisjOiBidWZmZXIuYzo4MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6IM3oIO7k6O0g4fP05fAg7eUg4fvrIPPk4Ou47SIKKworIzogYnVmZmVyLmM6ODA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTc6IE5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiCittc2dzdHIgIkU1MTc6IM3oIO7k6O0g4fP05fAg7eUg4fvrIO736Pnl7SIKKworIzogYnVmZmVyLmM6ODE3Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIs7k6O0g4fP05fAg4vvj8PPm5e0g6Ocg7+Ds//LoIgorCisjOiBidWZmZXIuYzo4MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAiwvHl4+4g4vvj8PPm5e3uIOHz9OXw7uIg6Ocg7+Ds//LoOiAlZCIKKworIzogYnVmZmVyLmM6ODI0Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAizuTo7SDh8/Tl8CDz5ODruO0iCisKKyM6IGJ1ZmZlci5jOjgyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIsLx5ePuIPPk4Ovl7e4g4fP05fDu4jogJWQiCisKKyM6IGJ1ZmZlci5jOjgzMQorbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAizuTo7SDh8/Tl8CDu9+j55e0iCisKKyM6IGJ1ZmZlci5jOjgzMworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAiwvHl4+4g7vfo+eXt7iDh8/Tl8O7iOiAlZCIKKworIzogYnVmZmVyLmM6ODk0Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogyOfs5e247e379SDh8/Tl8O7iIO3lIO7h7eDw8+bl7e4iCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MzMKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogwfP05fD7IOIg8e/o8erlIO7y8fPy8fLi8/7yIgorCisjOiBidWZmZXIuYzo5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBCdWZmZXIgJWxkIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFODY6IMHz9OXwICVsZCDt5SDx8/nl8fLi8+XyIgorCisjOiBidWZmZXIuYzo5NDgKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4Nzog3fLuIO/u8evl5O3o6SDh8/Tl8CIKKworIzogYnVmZmVyLmM6OTUwCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiDd8u4g7+Xw4vvpIOHz9OXwIgorCisjOiBidWZmZXIuYzo5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6IMjn7OXt5e3o/yDiIOHz9OXw5SAlbGQg7eUg8e718ODt5e37ICghLCD38u7h+yDu4e7p8ugg7/Du4uXw6vMpIgorCisjOiBidWZmZXIuYzoxMDA1Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IM3l4u7n7O7m7e4g4vvj8PPn6PL8IOjnIO/g7P/y6CDv7vHr5eTt6Okg4fP05fAiCisKKyM6IGJ1ZmZlci5jOjE1MzgKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiDP8OXk8+/w5ebk5e3o5Tog7+Xw5e/u6+3l7ejlIPHv6PHq4CDo7LjtIPTg6evu4iIKKworIzogYnVmZmVyLmM6MTcwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IMHz9OXwICVsZCDt5SDt4Onk5e0iCisKKyM6IGJ1ZmZlci5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiDN5fHq7uv86u4g8e7u8uLl8vHy4ujpIOTr/yAlcyIKKworIzogYnVmZmVyLmM6MTk0MgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogzeXyIPHu7vLi5fLx8uLz/vnl4+4gJXMg4fP05fDgIgorCisjOiBidWZmZXIuYzoyMzM3CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICLx8vDu6uAgJWxkIgorCisjOiBidWZmZXIuYzoyNDIwCittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogwfP05fAg8SDy4Oro7CDo7OXt5ewg8+blIPHz+eXx8uLz5fIiCisKKyM6IGJ1ZmZlci5jOjI3MTMKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFvI5+zl7bjtXSIKKworIzogYnVmZmVyLmM6MjcxOAorbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW83lIPDl5ODq8ujw7uLg6/H/XSIKKworIzogYnVmZmVyLmM6MjcyMworbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIlvN7uL76SD04OnrXSIKKworIzogYnVmZmVyLmM6MjcyNAorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIlvO+Ojh6ugg9/Ll7ej/XSIKKworIzogYnVmZmVyLmM6MjcyNiBmaWxlaW8uYzoyMTEyCittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW/Lu6/zq7iDk6/8g9/Ll7ej/XSIKKworIzogYnVmZmVyLmM6Mjc0NworIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIs7k7eAg8fLw7urgIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIPHy8C4gLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIvHy8C4gJWxkIOjnICVsZCAtLSVkJSUtLSDq7usuICIKKworIzogYnVmZmVyLmM6Mjg2NAorbXNnaWQgIltObyBmaWxlXSIKK21zZ3N0ciAiW83l8iD04Onr4F0iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjkwNAorbXNnaWQgImhlbHAiCittc2dzdHIgIvHv8ODi6uAiCisKKyM6IGJ1ZmZlci5jOjM0NjMgc2NyZWVuLmM6NTA3NQorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW/Hv8ODi6uBdIgorCisjOiBidWZmZXIuYzozNDk1IHNjcmVlbi5jOjUwODEKK21zZ2lkICJbUHJldmlld10iCittc2dzdHIgIlvP8OXk7/Du8ezu8vBdIgorCisjOiBidWZmZXIuYzozNzc1Cittc2dpZCAiQWxsIgorbXNnc3RyICLC5fH8IgorCisjOiBidWZmZXIuYzozNzc1Cittc2dpZCAiQm90IgorbXNnc3RyICLC7ejn8yIKKworIzogYnVmZmVyLmM6Mzc3NworbXNnaWQgIlRvcCIKK21zZ3N0ciAizeDi5fD18yIKKworIzogYnVmZmVyLmM6NDUyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg0e/o8e7qIOHz9OXw7uI6XG4iCisKKyM6IGJ1ZmZlci5jOjQ1NTYKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIlvR7+jx7uog7vjo4e7qXSIKKworIzogYnVmZmVyLmM6NDU2OSBtZW1saW5lLmM6MTUyMAorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW83l8iD04Onr4F0iCisKKyM6IGJ1ZmZlci5jOjQ4ODIKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDH7eD36uggLS0tIgorCisjOiBidWZmZXIuYzo0OTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIsft4Pfq6CDk6/8gJXM6IgorCisjOiBidWZmZXIuYzo0OTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICDx8vDu6uA9JWxkICBpZD0lZCAg6Oz/PSVzIgorCisjOiBkaWZmLmM6MTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NjogQ2FuIG5vdCBkaWZmIG1vcmUgdGhhbiAlbGQgYnVmZmVycyIKK21zZ3N0ciAiRTk2OiDR6+Xk6PL8IOfgIO7y6+j36P/s6CDs7ubt7iDt5SDh7uvl5SD35ewg4iAlbGQg4fP05fDg9SIKKworIzogZGlmZi5jOjcxMworbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiDN5eLu5+zu5u3uIPHu5+Tg8vwg9ODp6/sg7vLr6Pfo6SIKKworIzogZGlmZi5jOjgxOAorbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgItTg6est5+Dv6+Dy6uAiCisKKyM6IGRpZmYuYzoxMDY5Cittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiDN5eLu5+zu5u3uIO/w7vfo8uDy/CDi++Lu5CDq7uzg7eT7IGRpZmYiCisKKyM6IGRpZmYuYzoxODE5Cittc2dpZCAiRTk5OiBDdXJyZW50IGJ1ZmZlciBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFOTk6IMDq8uji7fvpIOHz9OXwIO3lIO3g9e7k6PLx/yDiIPDl5ujs5SDu8uvo9+jpIgorCisjOiBkaWZmLmM6MTgzMQorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IMHu6/z45SDt5fIg4fP05fDu4iDiIPDl5ujs5SDu8uvo9+jpIgorCisjOiBkaWZmLmM6MTgzOQorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiRTEwMTogwiDw5ebo7OUg7vLr6Pfo6SDh7uvl5SDk4vP1IOHz9OXw7uIsIO3lIOzu4/Mg4vvh8ODy/CIKKworIzogZGlmZi5jOjE4NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiDN5SDs7uPzIO3g6fLoIOHz9OXwIFwiJXNcIiIKKworIzogZGlmZi5jOjE4NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiDB8/Tl8CBcIiVzXCIg7eUg7eD17uTo8vH/IOIg8OXm6OzlIO7y6+j36OkiCisKKyM6IGRpZ3JhcGguYzoyMTk5Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IN3q8ODt6PDz/vno6SDx6Ozi7usgRXNjYXBlIO3l6/zn/yDo8e/u6/zn7uLg8vwg4iDk6OPw4PTlIgorCisjOiBkaWdyYXBoLmM6MjM4NAorbXNnaWQgIkU1NDQ6IEtleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTU0NDog1ODp6yDxIPDg8err4OTq7ukg6uvg4ujg8vPw+yDt5SDt4Onk5e0iCisKKyM6IGRpZ3JhcGguYzoyNDExCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiDK7uzg7eTgIDpsb2Fka2V5bWFwIO/w6Ozl7eXt4CDi7eUg9ODp6+Ag8fbl7eDw6P8iCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgwOLy7uTu7+7r7eXt6OUg6uv+9+Xi7uPuIPHr7uLgICheTl5QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCittc2dzdHIgIiDA4vLu5O7v7uvt5e3o5SBeWCAoXkVeWV5MXl1eRl5JXkteRF5WXk5eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIMzl8fLt7uUg4OLy7uTu7+7r7eXt6OUg6uv+9+Xi7uPuIPHr7uLgICheTl5QKSIKKworIzogZWRpdC5jOjQ1Cittc2dpZCAiIFdob2xlIGxpbmUgY29tcGxldGlvbiAoXkxeTl5QKSIKK21zZ3N0ciAiIMDi8u7k7u/u6+3l7ejlIPbl6+7pIPHy8O7q6CAoXkxeTl5QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRl5OXlApIgorbXNnc3RyICIgwOLy7uTu7+7r7eXt6OUg6Ozl7egg9ODp6+AgKF5GXk5eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl1eTl5QKSIKK21zZ3N0ciAiIMDi8u7k7u/u6+3l7ejlIOzl8uroICheXV5OXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OXlApIgorbXNnc3RyICIgwOLy7uTu7+7r7eXt6OUg+ODh6+7t4CDv8/LoICheTl5QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkReTl5QKSIKK21zZ3N0ciAiIMDi8u7k7u/u6+3l7ejlIO7v8OXk5evl7ej/ICheRF5OXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheS15OXlApIgorbXNnc3RyICIgwOLy7uTu7+7r7eXt6OUg7+4g8evu4uDw/iAoXkteTl5QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVF5OXlApIgorbXNnc3RyICIgwOLy7uTu7+7r7eXt6OUg8ejt7u3o7O7iICheVF5OXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WXk5eUCkiCittc2dzdHIgIiDA4vLu5O7v7uvt5e3o5SDq7uzg7eTt7ukg8fLw7uroICheVl5OXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAiyu7t5fYg4OHn4PbgIgorCisjOiBlZGl0LmM6OTYyCittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICLN5SDn4OTg7e4g5+3g9+Xt6OUg7u/26OggJ3RoZXNhdXJ1cyciCisKKyM6IGVkaXQuYzoxMTY2Cittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAizeUg5+Dk4O3uIOft4Pfl7ejlIO7v9ujoICdkaWN0aW9uYXJ5JyIKKworIzogZWRpdC5jOjIxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIs/w7vHs7vLwIPHr7uLg8P86ICVzIgorCisjOiBlZGl0LmM6MjM2OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICji8fLg4urgKSDP8O7q8PPy6uAgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzNzAKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKOfg7OXt4Ckgz/Du6vDz8urgICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiz/Du8ezu8vA6ICVzIgorCisjOiBlZGl0LmM6MjcxOQorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAiwvvv7uvt/+Xy8f8g7+7o8eog8fDl5Ogg7OXy7uouIgorCisjOiBlZGl0LmM6MzM4MQorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiDE7uHg4uvl7ejlIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjM0MzAKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIM/u6PHqLi4uIgorCisjOiBlZGl0LmM6MzQ4NgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIsjx9e7k7e7lIPHr7uLuIgorCisjOiBlZGl0LmM6MzQ5MQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICLR6+7i7iDo5yDk8PPj7ukg8fLw7uroIgorCisjOiBlZGl0LmM6MzQ5NgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICLF5Ojt8fLi5e3t7uUg8e7u8uLl8vHy4ujlIgorCisjOiBlZGl0LmM6MzU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCBvZiAlZCIKK21zZ3N0ciAi8e7u8uLl8vHy4ujlICVkIOjnICVkIgorCisjOiBlZGl0LmM6MzU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAi8e7u8uLl8vHy4ujlICVkIgorCisjLiBTa2lwIGZ1cnRoZXIgYXJndW1lbnRzIGJ1dCBkbyBjb250aW51ZSB0bworIy4gKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4KKyM6IGV2YWwuYzoxMDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjogzeXo5+Ll8fLt4P8g7+Xw5ezl7e3g/zogXCIlc1wiIgorCisjOiBldmFsLmM6MTMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IM/w7u/z+eXt+yDx6u7h6ug6ICVzIgorCisjOiBldmFsLmM6MTQzNSBldmFsLmM6MTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IM3l8iDy4Oru6SDv5fDl7OXt7e7pOiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxNzA1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiDP8O7v8/nl7e4gJzonIO/u8evlICc/JyIKKworIzogZXZhbC5jOjIzMjcKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogz/Du7/P55e3gICcpJyIKKworIzogZXZhbC5jOjIzODkKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogz/Du7/P55e3gICddJyIKKworIzogZXZhbC5jOjI0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IM3lIPPq4Ofg7e4g6Oz/IO7v9ujoOiAlcyIKKworIzogZXZhbC5jOjI0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiDN5ejn4uXx8u3g/yDu7/bo/zogJXMiCisKKyM6IGV2YWwuYzoyNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiDP8O7v8/nl7eAg6uDi+/fq4DogJXMiCisKKyM6IGV2YWwuYzoyNjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiDP8O7v8/nl7eAg6uDi+/fq4DogJXMiCisKKyM6IGV2YWwuYzozMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjogz+Dw4Ozl8vD7IOTr/yD08+3q9ujoICVzIOfg5ODt+yDt5eLl8O3uIgorCisjOiBldmFsLmM6MzA4MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE3OiBVbmtub3duIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExNzogzeXo5+Ll8fLt4P8g9PPt6vbo/zogJXMiCisKKyM6IGV2YWwuYzozMDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiDR6+j46u7sIOzt7uPuIO/g8ODs5fLw7uIg5Ov/IPTz7er26OggJXMiCisKKyM6IGV2YWwuYzozMDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6IM3l5O7x8uDy7vft7iDv4PDg7OXy8O7iIOTr/yD08+3q9ujoICVzIgorCisjOiBldmFsLmM6MzA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IDxTSUQ+IOjx7+7r/Ofz5fLx/yDi7eUg8fbl7eDw6P86ICVzIgorCisjLgorIy4gKiBZZXMgdGhpcyBpcyB1Z2x5LCBJIGRvbid0IHBhcnRpY3VsYXJseSBsaWtlIGl0IGVpdGhlci4gIEJ1dCBkb2luZyBpdAorIy4gKiB0aGlzIHdheSBoYXMgdGhlIGNvbXBlbGxpbmcgYWR2YW50YWdlIHRoYXQgdHJhbnNsYXRpb25zIG5lZWQgbm90IHRvCisjLiAqIGJlIHRvdWNoZWQgYXQgYWxsLiAgU2VlIGJlbG93IHdoYXQgJ29rJyBhbmQgJ3luYycgYXJlIHVzZWQgZm9yLgorIy4KKyM6IGV2YWwuYzozNjg3IGd1aS5jOjQzODIgZ3VpX2d0ay5jOjIwNTkKK21zZ2lkICImT2siCittc2dzdHIgIiZPayIKKworIzogZXZhbC5jOjQyMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0lcyUzbGQgbGluZXM6ICIKK21zZ3N0ciAiKy0lcyUzbGQg8fLw7uo6ICIKKworIzogZXZhbC5jOjU0NzcKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPS1xuIgorIs4m8uzl7eAiCisKKyM6IGV2YWwuYzo1NTE3Cittc2dpZCAiY2FsbGVkIGlucHV0cmVzdG9yZSgpIG1vcmUgb2Z0ZW4gdGhhbiBpbnB1dHNhdmUoKSIKK21zZ3N0ciAi1PPt6vbo/yBpbnB1dHJlc3RvcmUoKSDi++f74uDl8vH/IPfg+eUsIPfl7CD08+3q9uj/IGlucHV0c2F2ZSgpIgorCisjOiBldmFsLmM6NTk3NworbXNnaWQgIkU2NTU6IFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIChjeWNsZT8pIgorbXNnc3RyICJFNjU2OiDR6+j46u7sIOzt7uPuIPHo7OLu6+j35fHq6PUg8fH76+7qICj26OrrPykiCisKKyM6IGV2YWwuYzo2NjA5Cittc2dpZCAiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIgorbXNnc3RyICJFMjQwOiDN5fIg8eL/5+gg8SDx5fDi5fDu7CBWaW0iCisKKyM6IGV2YWwuYzo2NzA2Cittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyMjc6INHl8OLl8CDt5SDu8uLl9+Dl8iIKKworIzogZXZhbC5jOjY3MzQKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IM3lIOzu4/Mg7vLi5fLo8vwg6uvo5e3y8yIKKworIzogZXZhbC5jOjY3ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IM3lIOzu4/Mg7vLv8ODi6PL8IPHu7uH55e3o5SDk6/8gJXMiCisKKyM6IGV2YWwuYzo2ODgyCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIozeXv8ODi6Ov87e4pIgorCisjOiBldmFsLmM6ODA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiDN5e7v8OXk5evl7e3g/yDv5fDl7OXt7eD/OiAlcyIKKworIzogZXZhbC5jOjg0OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MTogSWxsZWdhbCB2YXJpYWJsZSBuYW1lOiAlcyIKK21zZ3N0ciAiRTQ2MTogzeXk7u/z8fLo7O7lIOjs/yDv5fDl7OXt7e7pOiAlcyIKKworIzogZXZhbC5jOjg3ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxMjI6INTz7er26P8gJXMg8+blIPHz+eXx8uLz5fIuIMTu4eDi/PLlICEsIPfy7uH7IOfg7OXt6PL8IOW4LiIKKworIzogZXZhbC5jOjg4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogzeXu7/Dl5OXr5e3t4P8g9PPt6vbo/zogJXMiCisKKyM6IGV2YWwuYzo4ODcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogz/Du7/P55e3gICcoJzogJXMiCisKKyM6IGV2YWwuYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiDN5eTu7/Px8ujs++kg7+Dw4Ozl8vA6ICVzIgorCisjOiBldmFsLmM6ODk4MgorbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiDP8O7v8/nl7eAg6u7s4O3k4CA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo5MDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiDN5eLu5+zu5u3uIO/l8OXu7/Dl5OXr6PL8IPTz7er26P4gJXMsIO7t4CDo8e/u6/zn8+Xy8f8iCisKKyM6IGV2YWwuYzo5MTU5Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTog0vDl4fPl8vH/IOjs/yD08+3q9ujoIgorCisjOiBldmFsLmM6OTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiDI7P8g9PPt6vbo6CDk7uvm7e4g7eD36O3g8vzx/yDxIO/w7u/o8e3u6SDh8+ri+zogJXMiCisKKyM6IGV2YWwuYzo5NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6INTz7er26P8gJXMg7eUg7u/w5eTl6+Xt4CIKKworIzogZXZhbC5jOjk0MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiDN5eLu5+zu5u3uIPPk4Ovo8vwg9PPt6vbo/iAlcywg7u3gIOjx7+7r/Ofz5fLx/yIKKworIzogZXZhbC5jOjk0NTUKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiDD6/Ph6O3gIOL75+7i4CD08+3q9ujoIOHu6/z45Swg9+XsIOft4Pfl7ejlICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NTA4CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgIuL75+7iICVzIgorCisjOiBldmFsLmM6OTU3MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBhYm9ydGVkIgorbXNnc3RyICIlcyDv8OXw4uDt4CIKKworIzogZXZhbC5jOjk1NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIOLu5+Lw4Png5fIgIyVsZCIKKworIzogZXZhbC5jOjk1NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMg4u7n4vDg+eDl8iBcIiVzXCIiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjk1OTUgZXhfY21kczIuYzoyMzY1CisjLCBjLWZvcm1hdAorbXNnaWQgImNvbnRpbnVpbmcgaW4gJXMiCittc2dzdHIgIu/w7uTu6+bl7ejlIOIgJXMiCisKKyM6IGV2YWwuYzo5NjIxCittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IOru7ODt5OAgOnJldHVybiDi7eUg9PPt6vbo6CIKKworIzogZXZhbC5jOjk5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg4+vu4eDr/O375SDv5fDl7OXt7fvlOlxuIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCisKKyM6IGV4X2NtZHMuYzoxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPiAlZCwgSGV4ICUwNHgsIE9jdGFsICVvIgorbXNnc3RyICI+ICVkLCBIZXggJTA0eCwgT2N0YWwgJW8iCisKKyM6IGV4X2NtZHMuYzoxMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiPiAlZCwgSGV4ICUwOHgsIE9jdGFsICVvIgorbXNnc3RyICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCisKKyM6IGV4X2NtZHMuYzo0MzAKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDog0fLw7uroIO/l8OXs5fng/vLx/yDx4OzoIO3gIPHl4f8iCisKKyM6IGV4X2NtZHMuYzo0OTkKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIs/l8OXs5fnl7eAg7uTt4CDx8vDu6uAiCisKKyM6IGV4X2NtZHMuYzo1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICLP5fDl7OX55e3uIPHy8O7qOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGZpbHRlcmVkIgorbXNnc3RyICLP8O7v8/nl7e4g9+Xw5ecg9Ojr/PLwIPHy8O7qOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo5NTIKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiDA4vLu6u7s4O3k+yAqRmlsdGVyKiDt5SDk7uvm7fsg6Ofs5e3/8vwg4Ory6OLt++kg4fP05fAiCisKKyM6IGV4X2NtZHMuYzoxMDM3Cittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbyOfs5e3l7ej/IO3lIPHu9fDg7eXt+11cbiIKKworIzogZXhfY21kcy5jOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXN2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgIiVzdmltaW5mbzogJXMg4iDx8vDu6uU6ICIKKworIzogZXhfY21kcy5jOjEyODgKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiIgorIkUxMzY6IHZpbWluZm86INHr6Pjq7uwg7O3u4+4g7vjo4e7qLCDu8fLg6/zt4P8g9+Dx8vwg9ODp6+Ag4fPk5fIg7/Du7/P55e3gIgorCisjOiBleF9jbWRzLmM6MTMyMworIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgItfy5e3o5SD04Onr4CB2aW1pbmZvIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEzMjQKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIOjt9O4iCisKKyM6IGV4X2NtZHMuYzoxMzI1Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIg7vLs5fLu6iIKKworIzogZXhfY21kcy5jOjEzMjYKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgzcXTxMDXzc4iCisKKyM6IGV4X2NtZHMuYzoxNDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiDP8ODi4CDt4CDn4O/o8fwg9ODp6+AgdmltaW5mbyDu8vHz8vHy4vP+8jogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IM3l4u7n7O7m7e4g5+Dv6PHg8vwg9ODp6yB2aW1pbmZvICVzISIKKworIzogZXhfY21kcy5jOjE1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICLH4O/o8fwg9ODp6+AgdmltaW5mbyBcIiVzXCIiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyDd8u7yIPTg6esgdmltaW5mbyDg4vLu7ODy6Pfl8eroIPHu5+Tg7SBWaW0gJXMuXG4iCisKKyM6IGV4X2NtZHMuYzoxNjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgxePuIOzu5u3uICju8fLu8O7m7e4hKSDw5eTg6vLo8O7i4PL8LlxuIgorIlxuIgorCisjOiBleF9jbWRzLmM6MTY1MworIywgYy1mb3JtYXQKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyDH7eD35e3o5SDu7/bo6CAnZW5jb2RpbmcnIOIg7O7s5e3yIOfg7+jx6CD04Onr4FxuIgorCisjOiBleF9jbWRzLmM6MTc1MgorbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAizeXk7u/z8fLo7PvpIO3g9+Dr/O376SDx6Ozi7usiCisKKyM6IGV4X2NtZHMuYzoyMDk3IGV4X2NtZHMuYzoyMzYyIGV4X2NtZHMyLmM6NzYzCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAi0e718ODt6PL8IOrg6iIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTQwCittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6INTg6esg5+Dj8PPm5e0g4iDk8PPj7uwg4fP05fDlIgorCisjOiBleF9jbWRzLmM6MjE3NAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIsfg7+jx4PL8IPTg6esg9+Dx8uj37e4/IgorCisjOiBleF9jbWRzLmM6MjE4MQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiDE6/8g5+Dv6PHoIPfg8fLoIOHz9OXw4CDo8e/u6/zn8+ny5SAhIgorCisjOiBleF9jbWRzLmM6MjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIs/l8OXv6PHg8vwg8fP55fHy4vP++ejpIPTg6esgXCIlLipzXCI/IgorCisjOiBleF9jbWRzLmM6MjM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6IMHz9OXwICVsZCDt5SDx4v/n4O0g8SDo7OXt5ewg9ODp6+AiCisKKyM6IGV4X2NtZHMuYzoyNDA1Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0Mjog1ODp6yDt5SDx7vXw4O247Tog5+Dv6PH8IO7y6uv+9+Xt4CDu7/bo5ekgJ3dyaXRlJyIKKworIzogZXhfY21kcy5jOjI0MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIsTr/yBcIiUuKnNcIiDi6uv+9+Xt4CDu7/bo/yAncmVhZG9ubHknLlxuIgorIsfg7+jx4PL8PyIKKworIzogZXhfY21kcy5jOjI1OTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgItDl5ODq8ujw7uLg7ejlIPTg6evgIgorCisjOiBleF9jbWRzLmM6MzIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogwOLy7uru7ODt5Psg7eXu5ujk4O3t7iDz4ejr6CDt7uL76SDh8/Tl8CAlcyIKKworIzogZXhfY21kcy5jOjMzMzkKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogz+Dw4Ozl8vAg6u7s4O3k+yA6eiDk7uvm5e0g4fvy/CD36PHr7uwiCisKKyM6IGV4X2NtZHMuYzozNDI0Cittc2dpZCAiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIKK21zZ3N0ciAiRTE0NTogyPHv7uv85+7i4O3o5SDq7uzg7eQg7uHu6+736ugg7eUg5O7v8/Hq4OXy8f8g4iBydmltLiIKKworIzogZXhfY21kcy5jOjM1MzEKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiDQ5ePz6//w7fvlIOL78ODm5e3o/yDt5SDs7uPz8iDw4Ofk5ev/8vzx/yDh8+ri4OzoIgorCisjOiBleF9jbWRzLmM6Mzg3NworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICLn4Ozl7ejy/CDt4CAlcz8gKHkvbi9hL3EvbC9eRS9eWSkiCisKKyM6IGV4X2NtZHMuYzo0MjcwCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIijP8OXw4uDt7ikiCisKKyM6IGV4X2NtZHMuYzo0Mjc0Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIs7k7eAg5+Ds5e3gIgorCisjOiBleF9jbWRzLmM6NDI3NgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAiJWxkIOfg7OXtIgorCisjOiBleF9jbWRzLmM6NDI3OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiDiIO7k7e7pIPHy8O7q5SIKKworIzogZXhfY21kcy5jOjQyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiIOIgJWxkIPHy8C4iCisKKyM6IGV4X2NtZHMuYzo0MzMyCittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiDK7uzg7eTgIDpnbG9iYWwg7eUg7O7m5fIg4fvy/CDw5erz8PHo4u3u6SIKKworIzogZXhfY21kcy5jOjQzNjcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogwiDq7uzg7eTlIDpnbG9iYWwg7/Du7/P55e3uIPDl4/Pr//Dt7uUg4vvw4Obl7ejlIgorCisjOiBleF9jbWRzLmM6NDQxNgorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICLR7u7y4uXy8fLi6OUg+ODh6+7t8yDt4Onk5e3uIO3gIOrg5uTu6SDx8vDu6uU6ICVzIgorCisjOiBleF9jbWRzLmM6NDQ5NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIM/u8evl5O3//yDx8vDu6uAg5Ov/IOfg7OXt+zpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDU5OAorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODog0e/u6u7p8fLi6OUsIPLu6/zq7iDx7+7q7unx8uLo5SEiCisKKyM6IGV4X2NtZHMuYzo0NjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjE6IFNvcnJ5LCBubyAnJXMnIGhlbHAgZm9yICVzIgorbXNnc3RyICJFNjYxOiDqIPHu5uDr5e3o/iwg8e/w4OLq4CAnJXMnIOTr/yAlcyDu8vHz8vHy4vPl8iIKKworIzogZXhfY21kcy5jOjQ2NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiDKIPHu5uDr5e3o/iDx7/Dg4urgIOTr/yAlcyDu8vHz8vHy4vPl8iIKKworIzogZXhfY21kcy5jOjQ2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICLI5+Lo7ejy5Swg9ODp6yDx7/Dg4uroIFwiJXNcIiDt5SDt4Onk5e0iCisKKyM6IGV4X2NtZHMuYzo1MTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIO3lIP/i6//l8vH/IOrg8uDr7uPu7CIKKworIzogZXhfY21kcy5jOjUzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IM3l4u7n7O7m7e4g7vLq8Pvy/CAlcyDk6/8g5+Dv6PHoIgorCisjOiBleF9jbWRzLmM6NTM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogzeXi7ufs7ubt7iDu8urw+/L8ICVzIOTr/yD38uXt6P8iCisKKyM6IGV4X2NtZHMuYzo1MzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NzA6IE1peCBvZiBoZWxwIGZpbGUgZW5jb2RpbmdzIHdpdGhpbiBhIGxhbmd1YWdlOiAlcyIKK21zZ3N0ciAiRTY3MDog1ODp6/sg8e/w4OLq6CDo8e/u6/zn8/7yIPDg5+375SDq7uTo8O7i6ugg5Ov/IO7k7e7j7iD/5/vq4DogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6IM/u4vLu8P/++eD/8f8g7OXy6uAgXCIlc1wiIOIg9ODp6+UgJXMiCisKKyM6IGV4X2NtZHMuYzo1NTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogzeXo5+Ll8fLt4P8g6u7s4O3k4CDn7eD36uAgJXMiCisKKyM6IGV4X2NtZHMuYzo1NTc3Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IM/w7u/z+eXt7iDo7P8g5+3g9+rgIgorCisjOiBleF9jbWRzLmM6NTYyMworbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IM7v8OXk5evl7e4g8evo+Oru7CDs7e7j7iDn7eD36u7iIgorCisjOiBleF9jbWRzLmM6NTY5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IM3l7/Dg4ujr/O376SDy5erx8iDn7eD36uA6ICVzIgorCisjOiBleF9jbWRzLmM6NTcyMiBleF9jbWRzLmM6NTkxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiDN5ejn4uXx8u376SDn7eD37uo6ICVzIgorCisjOiBleF9jbWRzLmM6NTc3MQorbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IM/w7u/z+eXtIO3u7OXwIOft4Pfq4CIKKworIzogZXhfY21kcy5jOjU4NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IM3l7/Dg4ujr/O3u5SDo7P8g4fP05fDgOiAlcyIKKworIzogZXhfY21kcy5jOjU4OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IM3l7/Dg4ujr/O376SBJRCDn7eD36uA6ICVsZCIKKworIzogZXhfY21kcy5jOjU5NjIKK21zZ2lkICIgKE5PVCBGT1VORCkiCittc2dzdHIgIiAozcUgzcDJxMXNzikiCisKKyM6IGV4X2NtZHMuYzo1OTY0Cittc2dpZCAiIChub3Qgc3VwcG9ydGVkKSIKK21zZ3N0ciAiICjt5SDv7uTk5fDm6OLg5fLx/ykiCisKKyM6IGV4X2NtZHMuYzo2MDYzCittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJb0+Tg6+Xt7l0iCisKKyM6IGV4X2NtZHMyLmM6OTIKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBjb250aW51ZS4iCittc2dzdHIgIsLq6/73uO0g8OXm6Owg7vLr4OTq6C4gxOv/IO/w7uTu6+bl7ej/IO3g4eXw6PLlIFwiY29udFwiIgorCisjOiBleF9jbWRzMi5jOjk2IGV4X2RvY21kLmM6OTY2CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAi8fLw7urgICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAi6u7s4O3k4DogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgItLu9+rgIO7x8uDt7uLq6CDiIFwiJXMlc1wiIPHy8C4gJWxkIgorCisjOiBleF9jbWRzMi5jOjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6INLu9+rgIO7x8uDt7uLq6CDt5SDt4Onk5e3gOiAlcyIKKworIzogZXhfY21kczIuYzo1NjYKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICLS7vfq6CDu8fLg7e7i6ugg7eUg7u/w5eTl6+Xt+yIKKworIzogZXhfY21kczIuYzo1NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMg8fLwLiAlbGQiCisKKyM6IGV4X2NtZHMyLmM6Nzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgItHu9fDg7ejy/CDo5+zl7eXt6P8g4iBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6Nzg4IGV4X2RvY21kLmM6OTM3OAorbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICLB5ecg6Ozl7egiCisKKyM6IGV4X2NtZHMyLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiDN5fHu9fDg7bjt7fvlIOjn7OXt5e3o/yDiIOHz9OXw5SBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6OTg0Cittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICIiCisiz/Dl5PPv8OXm5OXt6OU6IM3l7ubo5ODt7fvpIO/l8OX17uQg4iDk8PPj7ukg4fP05fAgKO/w7uLl8Pzy5SDg4vLu6u7s4O3k+ykiCisKKyM6IGV4X2NtZHMyLmM6MTM4NworbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogxOv/IPDl5ODq8ujw7uLg7ej/IOTu8fLz7+XtIPLu6/zq7iDu5OjtIPTg6esiCisKKyM6IGV4X2NtZHMyLmM6MTM4OQorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDog3fLuIO/l8OL76SD04OnrIgorCisjOiBleF9jbWRzMi5jOjEzOTEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTog3fLuIO/u8evl5O3o6SD04OnrIgorCisjOiBleF9jbWRzMi5jOjE4MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2NjogY29tcGlsZXIgbm90IHN1cHBvcnRlZDogJXMiCittc2dzdHIgIkU2NjY6IOru7O/o6//y7vAg7eUg7+7k5OXw5uji4OXy8f86ICVzIgorCisjOiBleF9jbWRzMi5jOjE4OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICLP7ujx6iBcIiVzXCIg4iBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTkxOQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiz+7o8eogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAi7eUg7eDp5OXt7iDiICdydW50aW1lcGF0aCc6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTc0Cittc2dpZCAiU291cmNlIFZpbSBzY3JpcHQiCittc2dzdHIgIsL77+7r7ejy/CDx9uXt4PDo6SBWaW0iCisKKyM6IGV4X2NtZHMyLmM6MjE2NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc291cmNlIGEgZGlyZWN0b3J5OiBcIiVzXCIiCittc2dzdHIgIs3l6/zn/yDx9+jy4PL8IOrg8uDr7uM6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjAyCisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICLt5eLu5+zu5u3uIPH36PLg8vwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICLx8vDu6uAgJWxkOiDt5eLu5+zu5u3uIPH36PLg8vwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIyMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLx9+jy++Lg7ejlIPH25e3g8Oj/IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIvHy8O7q4CAlbGQ6IPH36PL74uDt6OUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgIvH36PL74uDt6OUg8fbl7eDw6P8gJXMg5+Di5fD45e3uIgorCisjOiBleF9jbWRzMi5jOjI3MDcKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiIgorIlcxNTogz/Dl5PPv8OXm5OXt6OU6IO3l7/Dg4ujr/O376SDw4Ofk5evo8uXr/CDx8vDu6uguIMLu5+zu5u3uIO/w7u/z+eXt7iBeTSIKKworIzogZXhfY21kczIuYzoyNzU2Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2Nzogyu7s4O3k4CA6c2NyaXB0ZW5jb2Rpbmcg6PHv7uv85/Pl8vH/IOLt5SD04Onr4CDx9uXt4PDo/yIKKworIzogZXhfY21kczIuYzoyNzg5Cittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IMru7ODt5OAgOmZpbmlzaCDo8e/u6/zn8+Xy8f8g4u3lIPTg6evgIPH25e3g8Oj/IgorCisjOiBleF9jbWRzMi5jOjMyMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGFnZSAlZCIKK21zZ3N0ciAi0fLw4O3o9uAgJWQiCisKKyM6IGV4X2NtZHMyLmM6MzM5NAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAiz+X34PLg8vwg7eX35ePuIgorCisjOiBleF9jbWRzMi5jOjM0NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIs/l9+Dy/CDx8vAuICVkICglZCUlKSIKKworIzogZXhfY21kczIuYzozNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIgyu7v6P8gJWQg6OcgJWQiCisKKyM6IGV4X2NtZHMyLmM6MzU0MgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAizeDv5ffg8uDt7jogJXMiCisKKyM6IGV4X2NtZHMyLmM6MzU0OQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICLP5ffg8vwg7/Dl6vDg+eXt4CIKKworIzogZXhfY21kczIuYzozOTE0Cittc2dpZCAiRTQ1NTogRXJyb3Igd3JpdGluZyB0byBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFNDU1OiDO+Ojh6uAg5+Dv6PHoIOIg9ODp6yBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQxODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNDogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTYyNDogzeXi7ufs7ubt7iDu8urw+/L8IPTg6esgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQxOTkgZXhfY21kczIuYzo0ODI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogzeXi7ufs7ubt7iDv8O736PLg8vwg9ODp6yDw5fHz8PHu4iBQb3N0U2NyaXB0IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTg6IGZpbGUgXCIlc1wiIGlzIG5vdCBhIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxODog9ODp6yBcIiVzXCIg7eUg/+Lr/+Xy8f8g9ODp6+7sIPDl8fPw8e7iIFBvc3RTY3JpcHQiCisKKyM6IGV4X2NtZHMyLmM6NDIyMiBleF9jbWRzMi5jOjQyNDIgZXhfY21kczIuYzo0MjU3IGV4X2NtZHMyLmM6NDI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE5OiD04OnrIFwiJXNcIiDt5SD/4uv/5fLx/yDk7u/z8fLo7PvsIPTg6evu7CDw5fHz8PHu4iBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQzMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMTogXCIlc1wiIHJlc291cmNlIGZpbGUgaGFzIHdyb25nIHZlcnNpb24iCittc2dzdHIgIkU2MjE6IPTg6esg8OXx8/Dx7uIgXCIlc1wiIO3l6Ofi5fHy7e7pIOLl8PHo6CIKKworIzogZXhfY21kczIuYzo0Nzc2Cittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiDN5eLu5+zu5u3uIO7y6vD78vwg9ODp6yBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQ4MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogzeXi7ufs7ubt7iDu8urw+/L8IPTg6esgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5MjgKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcInByb2xvZy5wc1wiIgorbXNnc3RyICJFNDU2OiDU4OnrIPDl8fPw8e7iIFBvc3RTY3JpcHQgXCJwcm9sb2cucHNcIiDt5SDt4Onk5e0iCisKKyM6IGV4X2NtZHMyLmM6NDk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzLnBzXCIiCittc2dzdHIgIkU0NTY6INTg6esg8OXx8/Dx7uIgUG9zdFNjcmlwdCBcIiVzLnBzXCIg7eUg7eDp5OXtIgorCisjOiBleF9jbWRzMi5jOjQ5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMDogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBtdWx0aS1ieXRlIHRvIFwiJXNcIiBlbmNvZGluZyIKK21zZ3N0ciAiIgorIkU2MjA6IM/w5e7h8ODn7uLg7ejlIOjnIOzz6/zy6OHg6fLt+/Ug8ejs4u7r7uIg4iDq7uTo8O7i6vMgXCIlc1wiIO3l4u7n7O7m7e4iCisKKyM6IGV4X2NtZHMyLmM6NTEwMgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAizvLv8ODi6uAg7eAg7+X34PL8Li4uIgorCisjOiBleF9jbWRzMi5jOjUxMDYKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiDN5SDz5ODr7vH8IOL77+7r7ejy/CDv5ffg8vwg9ODp6+AgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo1MTA4Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICLH4OTg7ejlIO3gIO/l9+Dy/CDu8u/w4OLr5e3uLiIKKworIzogZXhfY21kczIuYzo1NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICLA6vLo4u376SAlc//n++o6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo1NjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiDN5eLu5+zu5u3uIPHs5e3o8vwg/+f76iDt4CBcIiVzXCIiCisKKyM6IGV4X2RvY21kLmM6NTI1Cittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIs/l8OX17uQg4iDw5ebo7CBFeC4gxOv/IO/l8OX17uTgIOIgzuH79+376SDw5ebo7CDt4OHl8Ojy5SBcInZpc3VhbFwiIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1NjEKK21zZ2lkICJFNTAxOiBBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAiRTUwMTogwiDq7u325SD04Onr4CIKKworIzogZXhfZG9jbWQuYzo2NjkKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IEPr6Pjq7uwg8OXq8/Dx6OLt4P8g6u7s4O3k4CIKKworIzogZXhfZG9jbWQuYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDU6IEV4Y2VwdGlvbiBub3QgY2F1Z2h0OiAlcyIKK21zZ3N0ciAiRTYwNTogyPHq6/736PLl6/zt4P8g8ejy8+D26P8g7eUg7uHw4OHu8uDt4DogJXMiCisKKyM6IGV4X2RvY21kLmM6MTMxNworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIsru7eX2IPH36PLg7e3u4+4g9ODp6+AiCisKKyM6IGV4X2RvY21kLmM6MTMxOAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiyu7t5fYg9PPt6vbo6CIKKworIzogZXhfZG9jbWQuYzoxOTA3Cittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogzeXu5O3u5+3g9+3u5SDo8e/u6/zn7uLg7ejlIOru7ODt5Psg7+7r/Ofu4uDy5ev/IgorCisjOiBleF9kb2NtZC5jOjE5MjEKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IN3y7iDt5SDq7uzg7eTgIPDl5ODq8u7w4CIKKworIzogZXhfZG9jbWQuYzoyMDI4Cittc2dpZCAiRTQ5MzogQmFja3dhcmRzIHJhbmdlIGdpdmVuIgorbXNnc3RyICJFNDkzOiDH4OTg7SDu4fDg8u376SDk6ODv4Ofu7SIKKworIzogZXhfZG9jbWQuYzoyMDM3Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICLH4OTg7SDu4fDg8u376SDk6ODv4Ofu7Swg7OXt/+XsIOPw4O3o9vsg7OXx8uDs6CIKKworIzogZXhfZG9jbWQuYzoyMTYwCittc2dpZCAiRTQ5NDogVXNlIHcgb3Igdz4+IgorbXNnc3RyICJFNDk0OiDI8e/u6/zn8+ny5SB3IOjr6CB3Pj4iCisKKyM6IGV4X2RvY21kLmM6Mzc4NgorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTogyOfi6O3o8uUsIP3y4CDq7uzg7eTgIO3l5O7x8vPv7eAg4iDk4O3t7ukg4uXw8ejoIgorCisjOiBleF9kb2NtZC5jOjM5ODkKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3Mjog0ODn8OX45e3uIOjx7+7r/Ofu4uDy/CDy7uv86u4g7uTt7iDo7P8g9ODp6+AiCisKKyM6IGV4X2RvY21kLmM6NDU2OQorbXNnaWQgIjEgbW9yZSBmaWxlIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIjEg9ODp6yDu5ujk4OXyIPDl5ODq8ujw7uLg7ej/LiDC++ny6D8iCisKKyM6IGV4X2RvY21kLmM6NDU3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIsXx8vwg7eXu8vDl5ODq8ujw7uLg7e375SD04Onr+yAoJWQpLiDC++ny6D8iCisKKyM6IGV4X2RvY21kLmM6NDU3OQorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IDEg9ODp6yDu5ujk4OXyIPDl5ODq8ujw7uLg7ej/LiIKKworIzogZXhfZG9jbWQuYzo0NTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IMXx8vwg7eXu8vDl5ODq8ujw7uLg7e375SD04Onr+yAoJWQpLiIKKworIzogZXhfZG9jbWQuYzo0Njc2Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTE3NDogyu7s4O3k4CDz5uUg8fP55fHy4vPl8i4gxO7h4OL88uUgISDk6/8g5+Ds5e37LiIKKworIzogZXhfZG9jbWQuYzo0Nzg3Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgIMjs/yAgICAgIM/g8ODsLiDE6ODvLiDE7u/u6+0uICAgIM7v8OXk5evl7ejlIgorCisjOiBleF9kb2NtZC5jOjQ4NzYKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIsru7ODt5PssIO7v8OXk5eu47e375SDv7uv85+7i4PLl6+XsLCDt5SDu4e3g8PPm5e37LiIKKworIzogZXhfZG9jbWQuYzo0OTA4Cittc2dpZCAiRTE3NTogTm8gYXR0cmlidXRlIHNwZWNpZmllZCIKK21zZ3N0ciAiRTE3NTog7+Dw4Ozl8vAg7eUg5+Dk4O0iCisKKyM6IGV4X2RvY21kLmM6NDk2MAorbXNnaWQgIkUxNzY6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTE3NjogzeXv8ODi6Ov87e7lIOru6+j35fHy4u4g7+Dw4Ozl8vDu4iIKKworIzogZXhfZG9jbWQuYzo0OTc1Cittc2dpZCAiRTE3NzogQ291bnQgY2Fubm90IGJlIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTE3Nzog1+jx6+4t7/Do8fLg4urzIO3l6/zn/yDz6uDn++Lg8vwg5OLg5uT7IgorCisjOiBleF9kb2NtZC5jOjQ5ODUKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiDN5e/w4OLo6/zt7uUg5+3g9+Xt6OUg9+jx6+At7/Do8fLg4uroIO/uIPPs7uv34O3o/iIKKworIzogZXhfZG9jbWQuYzo1MDE2Cittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiDk6/8g5+Di5fD45e3o/yDy8OXh8+Xy8f8g8+rg5+Dy/CDv4PDg7OXy8CIKKworIzogZXhfZG9jbWQuYzo1MDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiDN5e/w4OLo6/zt7uUg5+3g9+Xt6OUg5O7v7uvt5e3o/zogJXMiCisKKyM6IGV4X2RvY21kLmM6NTA1NworbXNnaWQgIkU0Njg6IENvbXBsZXRpb24gYXJndW1lbnQgb25seSBhbGxvd2VkIGZvciBjdXN0b20gY29tcGxldGlvbiIKK21zZ3N0ciAiIgorIkU0Njg6IM/g8ODs5fLwIODi8u7k7u/u6+3l7ej/IOzu5u3uIOjx7+7r/Ofu4uDy/CDy7uv86u4g8SDu8e7h++wg5O7v7uvt5e3o5ewiCisKKyM6IGV4X2RvY21kLmM6NTA2MworbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIkU0Njc6IM7x7uHu5SDk7u/u6+3l7ejlIPLw5eHz5fIg8+rg5+Dt6P8g7+Dw4Ozl8vDgIPTz7er26OgiCisKKyM6IGV4X2RvY21kLmM6NTA3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IM3l7/Dg4ujr/O376SDg8vDo4fPyOiAlcyIKKworIzogZXhfZG9jbWQuYzo1MTE3Cittc2dpZCAiRTE4MjogSW52YWxpZCBjb21tYW5kIG5hbWUiCittc2dzdHIgIkUxODI6IM3l7/Dg4ujr/O3u5SDo7P8g6u7s4O3k+yIKKworIzogZXhfZG9jbWQuYzo1MTMyCittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiDK7uzg7eTgIO/u6/zn7uLg8uXr/yDk7uvm7eAg7eD36O3g8vzx/yDxIOfg4+vg4u3u6SDh8+ri+yIKKworIzogZXhfZG9jbWQuYzo1MjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiDN5fIg8uDq7ukg6u7s4O3k+yDv7uv85+7i4PLl6/86ICVzIgorCisjOiBleF9kb2NtZC5jOjU2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiDW4uXy7uLg/yDx9eXs4CAlcyDt5SDt4Onk5e3gIgorCisjOiBleF9kb2NtZC5jOjU2NzIKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAiz/Do4uXyLCDv7uv85+7i4PLl6/wgVmltISIKKworIzogZXhfZG9jbWQuYzo2Mzg5Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgItDl5ODq8ujw7uLg8vwg9ODp6yDiIO3u4u7sIO7q7eUiCisKKyM6IGV4X2RvY21kLmM6NjY4NAorbXNnaWQgIk5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiweXnIPHi7u8t9ODp6+AiCisKKyM6IGV4X2RvY21kLmM6Njc4OAorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICLE7uHg4ujy/CD04OnrIgorCisjOiBleF9kb2NtZC5jOjY4NTIKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IM3l8iDv8OXk++Tz+eXj7iDq4PLg6+7j4CIKKworIzogZXhfZG9jbWQuYzo2OTM0Cittc2dpZCAiRTE4NzogVW5rbm93biIKK21zZ3N0ciAiRTE4NzogzeXo5+Ll8fLt7iIKKworIzogZXhfZG9jbWQuYzo3MDE5Cittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IOru7ODt5OAgOndpbnNpemUg8vDl4fPl8iDz6uDn4O3o/yDk4vP1IPfo8evu4vv1IO/g8ODs5fLw7uIiCisKKyM6IGV4X2RvY21kLmM6NzA3NQorIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIs/u6+7m5e3o5SDu6u3gOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjcwODAKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogwiDk4O3t7ukg8ejx8uXs5SDu7/Dl5OXr5e3o5SDv7uvu5uXt6P8g7urt4CDt5SDw4OHu8uDl8iIKKworIzogZXhfZG9jbWQuYzo3MDkwCittc2dpZCAiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2Njog6u7s4O3k4CA6d2lucG9zIPLw5eHz5fIg8+rg5+Dt6P8g5OLz9SD36PHr7uL79SDv4PDg7OXy8O7iIgorCisjOiBleF9kb2NtZC5jOjczNjgKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICLP5fDl7eDv8ODi6+Xt6OUg5+Dv6PHoIgorCisjOiBleF9kb2NtZC5jOjc1NTgKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgItHu9fDg7eXt6OUg4ujk4CIKKworIzogZXhfZG9jbWQuYzo3NTU5Cittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICLR7vXw4O3l7ejlIPHl4O3x4CIKKworIzogZXhfZG9jbWQuYzo3NTYxCittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAi0e718ODt5e3o5SDt4PHy8O7l6iIKKworIzogZXhfZG9jbWQuYzo3NzEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIPHz+eXx8uLz5fIgKCEsIPfy7uH7IO7h7uny6CDv8O7i5fDq8ykiCisKKyM6IGV4X2RvY21kLmM6NzcxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6IM3l4u7n7O7m7e4g7vLq8Pvy/CDk6/8g5+Dv6PHoIFwiJXNcIiIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Nzc0MgorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogz+Dw4Ozl8vAg5O7r5uXtIOH78vwg7/D/7O7pL+7h8ODy7e7pIOrg4vv36u7pIOjr6CDh8+ri7ukiCisKKyM6IGV4X2RvY21kLmM6Nzc4NAorbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5Mjog0evo+Oru7CDj6/Ph7urg/yDw5erz8PHo/yDv8Ogg6PHv7uv85+7i4O3o6CDq7uzg7eT7IDpub3JtYWwiCisKKyM6IGV4X2RvY21kLmM6ODMwMgorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiDN5fIg8e7x5eTt5ePuIOjs5e3oIPTg6evgIOTr/yDn4Ozl7fsgJyMnIgorCisjOiBleF9kb2NtZC5jOjgzMzMKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIkU0OTU6IM3l8iDg4vLu6u7s4O3k7e7j7iDo7OXt6CD04Onr4CDk6/8g5+Ds5e37IFwiPGFmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNDEKK21zZ2lkICJFNDk2OiBubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIkU0OTY6IM3l8iDg4vLu6u7s4O3k7e7j7iDt7uzl8OAg4fP05fDgIOTr/yDn4Ozl7fsgXCI8YWJ1Zj5cIiIKKworIzogZXhfZG9jbWQuYzo4MzUyCittc2dpZCAiRTQ5Nzogbm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIkU0OTc6IM3l8iDg4vLu6u7s4O3k7e7j7iDo7OXt6CDx7u7y4uXy8fLi6P8g5Ov/IOfg7OXt+yBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM2MgorbXNnaWQgIkU0OTg6IG5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICJFNDk4OiDt5fIg6Ozl7egg9ODp6+AgOnNvdXJjZSDk6/8g5+Ds5e37IFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjg0MDMKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRTQ5OTogRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIkU0OTk6IM/z8fLu5SDo7P8g9ODp6+Ag5Ov/ICclJyDo6+ggJyMnLCDi7ufs7ubt7iDy7uv86u4gYyBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo4NDA1Cittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDog0OXn8+v88uDy7uwg4vvw4Obl7ej/IP/i6//l8vH/IO/z8fLg/yDx8vDu6uAiCisKKyM6IGV4X2RvY21kLmM6OTM2MAorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogzeXi7ufs7ubt7iDu8urw+/L8IPTg6esgdmltaW5mbyDk6/8g9/Ll7ej/IgorCisjOiBleF9kb2NtZC5jOjk1MzMKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IMIg/fLu6SDi5fDx6Ogg5Ojj8OD0+yDt5SDw4OHu8uD+8iIKKworIzogZXhfZXZhbC5jOjQ0MAorbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiIgorIkU2MDg6IM3l4u7n7O7m7e4g4vvv7uvt6PL8IOru7ODt5PMgOnRocm93IOTr/yDo8err/vfl7ejpIPEg7/Do8fLg4uru6SAnVmltJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICLI8err/vfo8uXr/O3g/yDx6PLz4Pbo/zogJXMiCisKKyM6IGV4X2V2YWwuYzo1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAix+Di5fD45e3gIO7h8ODh7vLq4CDo8err/vfo8uXr/O3u6SDx6PLz4Pbo6DogJXMiCisKKyM6IGV4X2V2YWwuYzo1NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGRpc2NhcmRlZDogJXMiCittc2dzdHIgIsjx6uv+9+jy5ev87eD/IPHo8vPg9uj/IO/w7ujj7e7w6PDu4uDt4DogJXMiCisKKyM6IGV4X2V2YWwuYzo2MjAgZXhfZXZhbC5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCDx8vDu6uAgJWxkIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGNhdWdodDogJXMiCittc2dzdHIgIs7h8ODh7vLq4CDo8err/vfo8uXr/O3u6SDx6PLz4Pbo6DogJXMiCisKKyM6IGV4X2V2YWwuYzo3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICIlcyDi++/u6+3/5fIg7ubo5ODt6OUiCisKKyM6IGV4X2V2YWwuYzo3MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmVzdW1lZCIKK21zZ3N0ciAiJXMg4u7n7uHt7uLr5e3uIgorCisjOiBleF9ldmFsLmM6NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMg7/Du7/P55e3uIgorCisjOiBleF9ldmFsLmM6NzQ2Cittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICLI8err/vfo8uXr/O3g/yDx6PLz4Pbo/yIKKworIzogZXhfZXZhbC5jOjc1MgorbXNnaWQgIkVycm9yIGFuZCBpbnRlcnJ1cHQiCittc2dzdHIgIs746OHq4CDoIO/w5fD74uDt6OUiCisKKyM6IGV4X2V2YWwuYzo3NTQgZ3VpLmM6NDM4MQorbXNnaWQgIkVycm9yIgorbXNnc3RyICLO+Ojh6uAiCisKKyMuIGlmIChwZW5kaW5nICYgQ1NUUF9JTlRFUlJVUFQpCisjOiBleF9ldmFsLmM6NzU2Cittc2dpZCAiSW50ZXJydXB0IgorbXNnc3RyICLP8OXw++Lg7ejlIgorCisjOiBleF9ldmFsLmM6ODMwCittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IPHr6Pjq7uwg4+vz4e7q7iDi6+7m5e3t++kgOmlmIgorCisjOiBleF9ldmFsLmM6ODY3Cittc2dpZCAiRTU4MDogOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgwOiA6ZW5kaWYg4eXnIDppZiIKKworIzogZXhfZXZhbC5jOjkxMQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6ZWxzZSDh5ecgOmlmIgorCisjOiBleF9ldmFsLmM6OTE0Cittc2dpZCAiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MjogOmVsc2VpZiDh5ecgOmlmIgorCisjOiBleF9ldmFsLmM6OTIxCittc2dpZCAiRTU4MzogbXVsdGlwbGUgOmVsc2UiCittc2dzdHIgIkU1ODM6IO7h7eDw8+bl7e4g7eXx6u7r/OruIDplbHNlIgorCisjOiBleF9ldmFsLmM6OTI0Cittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogOmVsc2VpZiDv7vHr5SA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjk5MQorbXNnaWQgIkU1ODU6IDp3aGlsZSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTg1OiDx6+j46u7sIOPr8+Hu6u4g4uvu5uXt7fvpIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEwNDcKK21zZ2lkICJFNTg2OiA6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODY6IDpjb250aW51ZSDh5ecgOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTA4NworbXNnaWQgIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NzogOmJyZWFrIOHl5yA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMjg2Cittc2dpZCAiRTYwMTogOnRyeSBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNjAxOiDx6+j46u7sIOPr8+Hu6u4g4uvu5uXt7fvpIDp0cnkiCisKKyM6IGV4X2V2YWwuYzoxMzY2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOmNhdGNoIOHl5yA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMuICogSnVzdCBwYXJzZS4KKyM6IGV4X2V2YWwuYzoxMzg4Cittc2dpZCAiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5IgorbXNnc3RyICJFNjA0OiA6Y2F0Y2gg4eXnIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUyMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkg4eXnIDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgbXVsdGlwbGUgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIzogZXhfZXZhbC5jOjE1NDUKK21zZ2lkICJFNjA3OiBtdWx0aXBsZSA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNzog7uHt4PDz5uXt7iDt5fHq7uv86u4gOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNjU0Cittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDplbmR0cnkg4eXnIDp0cnkiCisKKyM6IGV4X2V2YWwuYzoxOTg2Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5Mzog6u7s4O3k4CA6ZW5kZnVuY3Rpb24g7O7m5fIg6PHv7uv85+7i4PL88f8g8u7r/OruIOLt8/Lw6CD08+3q9ujoIgorCisjOiBleF9nZXRsbi5jOjMyOTYKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICLo7P8g7OXy6ugiCisKKyM6IGV4X2dldGxuLmM6MzI5OQorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiIPLo7yD04Onr4FxuIgorCisjOiBleF9nZXRsbi5jOjQ3NTIKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIuft4Pfl7ejlIO7v9ujoICdoaXN0b3J5JyDw4OLt7iDt8+v+IgorCisjOiBleF9nZXRsbi5jOjUwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzLCDo8fLu8Oj/ICjt4Pfo7eD/IO7yIPHi5ebl4+4g6iDx8uDw7uzzKTpcbiIKKworIzogZXhfZ2V0bG4uYzo1MDI0Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICLK7uzg7eTt4P8g8fLw7urgIgorCisjOiBleF9nZXRsbi5jOjUwMjUKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICLR8vDu6uAg7+7o8ergIgorCisjOiBleF9nZXRsbi5jOjUwMjYKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICLC+/Dg5uXt6OUiCisKKyM6IGV4X2dldGxuLmM6NTAyNworbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgItHy8O7q4CDi4u7k4CIKKworIzogZXhfZ2V0bG4uYzo1MDY1Cittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciDh7uv8+OUg5Ovo7fsg6u7s4O3k+yIKKworIzogZXhfZ2V0bG4uYzo1MjQyCittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTog0+Tg6+Xt7iDg6vLo4u3u5SDu6u3uIOjr6CDh8/Tl8CIKKworIzogZmlsZWlvLmM6Mzc3Cittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIs3l5O7v8/Hy6Ozu5SDo7P8g9ODp6+AiCisKKyM6IGZpbGVpby5jOjQwMSBmaWxlaW8uYzo1MzUgZmlsZWlvLmM6MjkxMyBmaWxlaW8uYzoyOTU0Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIv/i6//l8vH/IOrg8uDr7uPu7CIKKworIzogZmlsZWlvLmM6NDAzCittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAi7eUg/+Lr/+Xy8f8g9ODp6+7sIgorCisjOiBmaWxlaW8uYzo1NTcgZmlsZWlvLmM6NDEzMQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIlvN7uL76SD04OnrXSIKKworIzogZmlsZWlvLmM6NTkwCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW8Tu8fLz7yDn4O/w5fm47V0iCisKKyM6IGZpbGVpby5jOjY5NAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6IMIg8OXn8+v88uDy5SDi++/u6+3l7ej/IODi8u7q7uzg7eQgKlJlYWRQcmUg9ODp6yDx8uDrIO3l9+jy4OXs++wiCisKKyM6IGZpbGVpby5jOjY5NgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6IODi8u7q7uzg7eT7ICpSZWFkUHJlIO3lIOTu6+bt+yDo5+zl7f/y/CDg6vLo4u376SDh8/Tl8CIKKworIzogZmlsZWlvLmM6NzE3Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiDi++/u6+3/5fLx/yD38uXt6OUg6Ocg8fLg7eTg8PLt7uPuIO/u8u7q4CDi4u7k4CBzdGRpbi4uLlxuIgorCisjOiBmaWxlaW8uYzo3MjMKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIsL77+7r7f/l8vH/IPfy5e3o5SDo5yDx8uDt5ODw8u3u4+4g7+7y7urgIOLi7uTgIHN0ZGluLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjEwMDAKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogwiDw5efz6/zy4PLlIO/w5e7h8ODn7uLg7ej/IPTg6esg8fLg6yDt5ffo8uDl7PvsISIKKworIzogZmlsZWlvLmM6MjA5MAorbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltmaWZvL+Pt5efk7l0iCisKKyM6IGZpbGVpby5jOjIwOTcKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltmaWZvXSIKKworIzogZmlsZWlvLmM6MjEwNAorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJb4+3l5+TuXSIKKworIzogZmlsZWlvLmM6MjExMgorbXNnaWQgIltST10iCittc2dzdHIgIltST10iCisKKyM6IGZpbGVpby5jOjIxMjIKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIlvv8O7v8/nl7fsg8ejs4u7r+yBDUl0iCisKKyM6IGZpbGVpby5jOjIxMjcKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbzuHt4PDz5uXt+yDx6Ozi7uv7IE5MXSIKKworIzogZmlsZWlvLmM6MjEzMgorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW+Tr6O3t++Ug8fLw7uroIPDg5+Ho8vtdIgorCisjOiBmaWxlaW8uYzoyMTM4IGZpbGVpby5jOjQxMTUKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIlvBxccg7/Dl7uHw4Ofu4uDt6OldIgorCisjOiBmaWxlaW8uYzoyMTQzIGZpbGVpby5jOjQxMjAKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW+/l8OXq7uTo8O7i4O3uXSIKKworIzogZmlsZWlvLmM6MjE1MCBmaWxlaW8uYzo0MTQ1Cittc2dpZCAiW2NyeXB0ZWRdIgorbXNnc3RyICJb5+D46PTw7uLg7e5dIgorCisjOiBmaWxlaW8uYzoyMTU3Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbztjIwcrAIM/Qxc7B0MDHzsLAzcjfXSIKKworIzogZmlsZWlvLmM6MjE2MworIywgYy1mb3JtYXQKK21zZ2lkICJbSUxMRUdBTCBCWVRFIGluIGxpbmUgJWxkXSIKK21zZ3N0ciAiW83FxM7P09HSyMzbySDBwMnSIOIg8fLw7urlICVsZF0iCisKKyM6IGZpbGVpby5jOjIxNzAKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbztjIwcrIINfSxc3I310iCisKKyM6IGZpbGVpby5jOjIzODYKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAiwvDl7OXt7fvpIPTg6esg5Ov/IO/l8OXq7uTo8O7i4O3o/yDt5SDt4Onk5e0iCisKKyM6IGZpbGVpby5jOjIzOTMKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIs/w5e7h8ODn7uLg7ejlIPEg7+7s7vn8/iAnY2hhcmNvbnZlcnQnIO3lIOL77+7r7eXt7iIKKworIzogZmlsZWlvLmM6MjM5NgorbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIu3l4u7n7O7m7e4g7/Du9+jy4PL8IOL74u7kICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI3OTYKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiIgorIkUyMDM6IMHz9OXwLCDq7vLu8PvpIPLw5eHu4uDr7vH8IOfg7+jx4PL8LCDz5ODruO0g6OvoIOL74/Dz5uXtIODi8u7q7uzg7eTu6SIKKworIzogZmlsZWlvLmM6MjgxOQorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiDK7uvo9+Xx8uLuIPHy8O7qIOjn7OXt5e3uIODi8u7q7uzg7eTu6SDt5e7m6OTg7e377CDu4fDg5+7sIgorCisjOiBmaWxlaW8uYzoyODU3Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyDt5SDv7ufi7uv/5fIg4vvv7uvt//L8IOfg7+jx/CDt5ejn7OXtuO3t+/Ug4fP05fDu4iIKKworIzogZmlsZWlvLmM6Mjg2NQorbXNnaWQgIlBhcnRpYWwgd3JpdGVzIGRpc2FsbG93ZWQgZm9yIE5ldEJlYW5zIGJ1ZmZlcnMiCittc2dzdHIgItfg8fLo9+3g/yDn4O/o8fwg4fP05fDu4iBOZXRCZWFucyDt5SDk7u/z8erg5fLx/yIKKworIzogZmlsZWlvLmM6MjkxOSBmaWxlaW8uYzoyOTM3Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIu3lIP/i6//l8vH/IPTg6evu7CDo6+gg8/Hy8O7p8fLi7uwsIOTu8fLz7+377CDk6/8g5+Dv6PHoIgorCisjOiBmaWxlaW8uYzoyOTg5Cittc2dpZCAiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIu7y6vD78iDy7uv86u4g5Ov/IPfy5e3o/yAoISwg9/Lu4fsg7uHu6fLoIO/w7uLl8OrzKSIKKworIzogZmlsZWlvLmM6MzMzNQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IMfg7+jx/CDiIPDl5+Xw4u376SD04OnrIO3l4u7n7O7m7eAgKCEsIPfy7uH7IO7h7uny6CDv8O7i5fDq8ykiCisKKyM6IGZpbGVpby5jOjMzNDcKK21zZ2lkICJFNTA3OiBDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNzogzvjo4ergIOfg6vD78uj/IPDl5+Xw4u3u4+4g9ODp6+AgKCEsIPfy7uH7IO7h7uny6CDv8O7i5fDq8ykiCisKKyM6IGZpbGVpby5jOjMzNDkKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiDN5eLu5+zu5u3uIO/w7vfo8uDy/CDw5efl8OLt++kg9ODp6yAoISwg9/Lu4fsg7uHu6fLoIO/w7uLl8OrzKSIKKworIzogZmlsZWlvLmM6MzM2NQorbXNnaWQgIkU1MDk6IENhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwOTogzeXi7ufs7ubt7iDx7ufk4PL8IPDl5+Xw4u376SD04OnrICghLCD38u7h+yDu4e7p8ugg7/Du4uXw6vMpIgorCisjOiBmaWxlaW8uYzozNDY4Cittc2dpZCAiRTUxMDogQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTEwOiDN5eLu5+zu5u3uIPHu5+Tg8vwg8OXn5fDi7fvpIPTg6esgKCEsIPfy7uH7IO7h7uny6CDv8O7i5fDq8ykiCisKKyM6IGZpbGVpby5jOjM1MzAKK21zZ2lkICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NjA6IMLo6+rgIPDl8fPw8eAg4fPk5fIg7+7y5fD/7eAgKCEsIPfy7uH7IO7h7uny6CDv8O7i5fDq8ykiCisKKyM6IGZpbGVpby5jOjM2NDAKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogwvDl7OXt7fvpIPTg6esg5Ov/IOfg7+jx6CDt5SDt4Onk5e0iCisKKyM6IGZpbGVpby5jOjM2NTgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogz+Xw5eru5Ojw7uLq4CDt5eLu5+zu5u3gICghIOTr/yDn4O/o8egg4eXnIO/l8OXq7uTo8O7i6ugpIgorCisjOiBmaWxlaW8uYzozNjkzCittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogzeXi7ufs7ubt7iDu8urw+/L8IPHi/+fg7e376SD04OnrIOTr/yDn4O/o8egiCisKKyM6IGZpbGVpby5jOjM2OTcKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IM3l4u7n7O7m7e4g7vLq8Pvy/CD04OnrIOTr/yDn4O/o8egiCisKKyM6IGZpbGVpby5jOjM5NTkKK21zZ2lkICJFNjY3OiBGc3luYyBmYWlsZWQiCittc2dzdHIgIkU2Njc6IM3lIPPk4Ovu8fwg4vvv7uvt6PL8IPTz7er26P4gZnN5bmMoKSIKKworIzogZmlsZWlvLmM6Mzk2NgorbXNnaWQgIkU1MTI6IENsb3NlIGZhaWxlZCIKK21zZ3N0ciAiRTUxMjogzu/l8OD26P8g5+Dq8Pvy6P8g7eUg8+Tg6+Dx/CIKKworIzogZmlsZWlvLmM6NDAzNworbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzogzvjo4ergIOfg7+jx6Cwg7/Dl7uHw4Ofu4uDt6OUg7eUg8+Tg6+7x/CIKKworIzogZmlsZWlvLmM6NDA0MworbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IO746OHq4CDn4O/o8eggKO3l8iDx4u7h7uTt7uPuIOzl8fLgPykiCisKKyM6IGZpbGVpby5jOjQxMTAKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIM7YyMHKwCDP0MXOwdDAx87CwM3I3yIKKworIzogZmlsZWlvLmM6NDEyNgorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJb0/Hy8O7p8fLi7l0iCisKKyM6IGZpbGVpby5jOjQxMzEKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW83u4vvpXSIKKworIzogZmlsZWlvLmM6NDE1MworbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbYV0iCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiDk7uHg4uvl7e4iCisKKyM6IGZpbGVpby5jOjQxNTUKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3ddIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiDn4O/o8eDt7iIKKworIzogZmlsZWlvLmM6NDIwNQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiDQ5ebo7CDn4O/r4PLq6Dog7eXi7ufs7ubt7iDx7vXw4O3l7ejlIOjx9e7k7e7j7iD04Onr4CIKKworIzogZmlsZWlvLmM6NDIyNworbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiIgorIkUyMDY6INDl5ujsIOfg7+vg8uroOiDt5eLu5+zu5u3uIPHs5e3o8vwg7+Dw4Ozl8vD7IO/z8fLu4+4g6PH17uTt7uPuIPTg6evgIgorCisjOiBmaWxlaW8uYzo0MjQyCittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiDN5eLu5+zu5u3uIPPk4Ovo8vwg8OXn5fDi7fvpIPTg6esiCisKKyM6IGZpbGVpby5jOjQzMDYKK21zZ2lkICIiCisiXG4iCisiV0FSTklORzogT3JpZ2luYWwgZmlsZSBtYXkgYmUgbG9zdCBvciBkYW1hZ2VkXG4iCittc2dzdHIgIiIKKyJcbiIKKyLP0MXE08/QxcbExc3IxTogyPH17uTt++kg9ODp6yDs7ubl8iDh+/L8IPPy8OD35e0g6OvoIO/u4vDl5uS47VxuIgorCisjOiBmaWxlaW8uYzo0MzA4Cittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAi7eUg4vv17uTo8uUg6Ocg8OXk4Ory7vDgLCDv7urgIPTg6esg7eUg4fPk5fIg8/Hv5fjt7iDn4O/o8eDtISIKKworIzogZmlsZWlvLmM6NDM5NworbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6NDM5NworbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW/Tu8Ozg8iBkb3NdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzo0NDA0Cittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJb9O7w7ODyIG1hY10iCisKKyM6IGZpbGVpby5jOjQ0MTEKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6NDQxMQorbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIlv07vDs4PIgdW5peF0iCisKKyM6IGZpbGVpby5jOjQ0MzgKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSDx8vDu6uAsICIKKworIzogZmlsZWlvLmM6NDQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAi8fLw7uo6ICVsZCwgIgorCisjOiBmaWxlaW8uYzo0NDQzCittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgIjEg8ejs4u7rIgorCisjOiBmaWxlaW8uYzo0NDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICLx6Ozi7uvu4jogJWxkIgorCisjOiBmaWxlaW8uYzo0NDU1Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW25vZW9sXSIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIlvN5efg4uXw+Ljt7eD/IO/u8evl5O3//yDx8vDu6uBdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjQ0NzQKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIs/QxcTTz9DFxsTFzcjFOiDU4OnrIOjn7OXtuO0g8SDs7uzl7fLgIPfy5e3o/yEhISIKKworIzogZmlsZWlvLmM6NDQ3NgorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAi0eXw/Ljn7e4g9e7y6PLlIOfg7+jx4PL8IOIg/fLu8iD04OnrIgorCisjOiBmaWxlaW8uYzo1NzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiDO+Ojh6uAg5+Dv6PHoIOIgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiDO+Ojh6uAg5+Dq8Pvy6P8gXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiDO+Ojh6uAg9/Ll7ej/IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTk3MAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IMHz9OXwIPPk4Ou47SDv8Ogg4vvv7uvt5e3o6CDg4vLu6u7s4O3k+yBGaWxlQ2hhbmdlZFNoZWxsIgorCisjOiBmaWxlaW8uYzo1OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IM/w5eTz7/Dl5uTl7ejlOiD04OnrIFwiJXNcIiDh7uv8+OUg7eUg5O7x8vPv5e0iCisKKyM6IGZpbGVpby5jOjU5OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiDP8OXk8+/w5ebk5e3o5Tog9ODp6yBcIiVzXCIg6CDh8/Tl8CBWaW0g4fvr6CDo5+zl7eXt+yDt5efg4ujx6OzuIOTw8+MgIgorIu7yIOTw8+PgIgorCisjOiBmaWxlaW8uYzo1OTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzExOiDP8OXk8+/w5ebk5e3o5Tog9ODp6yBcIiVzXCIg4fvrIOjn7OXtuO0g7+7x6+Ug7eD34OvgIPDl5ODq8ujw7uLg7ej/IgorCisjOiBmaWxlaW8uYzo1OTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIiIKKyJXMTY6IM/w5eTz7/Dl5uTl7ejlOiDw5ebo7CDk7vHy8+/gIOog9ODp6/MgXCIlc1wiIOH76yDo5+zl7bjtIO/u8evlIO3g9+Dr4CAiCisi8OXk4Ory6PDu4uDt6P8iCisKKyM6IGZpbGVpby5jOjYwMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiIgorIlcxMzogz/Dl5PPv8OXm5OXt6OU6IPTg6esgXCIlc1wiIOH76yDx7ufk4O0g7+7x6+Ug7eD34OvgIPDl5ODq8ujw7uLg7ej/IgorCisjOiBmaWxlaW8uYzo2MDE5Cittc2dpZCAiU2VlIFwiOmhlbHAgVzExXCIgZm9yIG1vcmUgaW5mby4iCittc2dzdHIgItHsLiDk7u/u6+3o8uXr/O3z/iDo7fTu8Ozg9uj+IOIgXCI6aGVscCBXMTFcIi4iCisKKyM6IGZpbGVpby5jOjYwMzMKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICLP8OXk8+/w5ebk5e3o5SIKKworIzogZmlsZWlvLmM6NjAzNAorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiJk9LXG4iCisiJsfg4/Dz5+jy/CD04OnrIgorCisjOiBmaWxlaW8uYzo2MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjI6IENvdWxkIG5vdCBwcmVwYXJlIGZvciByZWxvYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFNDYyOiDN5eLu5+zu5u3uIO/u5OPu8u7i6PL88f8g6iDv5fDl5+Dj8PPn6uUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjE6IENvdWxkIG5vdCByZWxvYWQgXCIlc1wiIgorbXNnc3RyICJFMzIxOiDN5eLu5+zu5u3uIOL77+7r7ejy/CDv5fDl5+Dj8PPn6vMgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2NzQwCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0t0+Tg6+Xt7i0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NjkwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6IMPw8+/v4CBcIiVzXCIg7eUg8fP55fHy4vPl8iIKKworIzogZmlsZWlvLmM6NzAyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogzeXk7u/z8fLo7PvlIPHo7OLu6/sg7+7x6+UgKjogJXMiCisKKyM6IGZpbGVpby5jOjcwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IM3l8fP55fHy4vP++eXlIPHu4fvy6OU6ICVzIgorCisjOiBmaWxlaW8uYzo3MDQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZ3JvdXAgb3IgZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiDN5fHz+eXx8uLz/vng/yDj8PPv7+Ag6OvoIPHu4fvy6OU6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjcxOTgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIMDi8u7q7uzg7eT7IC0tLSIKKworIzogZmlsZWlvLmM6NzQ2OQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiDN5eLu5+zu5u3uIOL77+7r7ejy/CDg4vLu6u7s4O3k+yDk6/8gwtHF1SDx7uH78ujpIgorCisjOiBmaWxlaW8uYzo3NDkyCittc2dpZCAiTm8gbWF0Y2hpbmcgYXV0b2NvbW1hbmRzIgorbXNnc3RyICLN5fIg7+7k9e7k//no9SDg4vLu6u7s4O3kIgorCisjOiBmaWxlaW8uYzo3ODEzCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODog8evo+Oru7CDj6/Ph7uruIOLr7ubl7e375SDg4vLu6u7s4O3k+yIKKworIzogZmlsZWlvLmM6ODA4OAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIMDi8u7q7uzg7eT7IOTr/yBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjgwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICLC++/u6+3l7ejlICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjgxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgIuDi8u7q7uzg7eTgICVzIgorCisjOiBmaWxlaW8uYzo4NzMxCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogz/Du7/P55e3gIHsuIgorCisjOiBmaWxlaW8uYzo4NzMzCittc2dpZCAiRTIyMDogTWlzc2luZyB9LiIKK21zZ3N0ciAiRTIyMDogz/Du7/P55e3gIH0uIgorCisjOiBmb2xkLmM6NjgKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiDR6uvg5O7qIO3lIO7h7eDw8+bl7e4iCisKKyM6IGZvbGQuYzo1OTMKK21zZ2lkICJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiIgorIkUzNTA6INHq6+Dk6uAg7eUg7O7m5fIg4fvy/CDx7ufk4O3gIPEg8uXq8/no7CDn7eD35e3o5ewg7u/26OggJ2ZvbGRtZXRob2QnIgorCisjOiBmb2xkLmM6NTk1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIiIKKyJFMzUxOiDR6uvg5OrgIO3lIOzu5uXyIOH78vwg8+Tg6+Xt4CDxIPLl6vP56Owg5+3g9+Xt6OXsIO7v9ujoICdmb2xkbWV0aG9kJyIKKworIzogZ2V0Y2hhci5jOjI0OAorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjogxO7h4OLr5e3o5SDiIOHz9OXwIPfy5e3o/yIKKworIzogZ2V0Y2hhci5jOjIxOTgKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzog8OXq8/Dx6OLt4P8g7/Do4v/n6uAiCisKKyM6IGdldGNoYXIuYzozMDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiDz5uUg5fHy/CDj6+7h4Ov87e7lIPHu6vDg+eXt6OUg5Ov/ICVzIgorCisjOiBnZXRjaGFyLmM6MzA4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6IPPm5SDl8fL8IOPr7uHg6/zt4P8g7/Do4v/n6uAg5Ov/ICVzIgorCisjOiBnZXRjaGFyLmM6MzIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiDz5uUg5fHy/CDx7urw4Pnl7ejlIOTr/yAlcyIKKworIzogZ2V0Y2hhci5jOjMyMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IPPm5SDl8fL8IO/w6OL/5+rgIOTr/yAlcyIKKworIzogZ2V0Y2hhci5jOjMyNzkKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgItHu6vDg+eXt6P8g7eUg7eDp5OXt+yIKKworIzogZ2V0Y2hhci5jOjMyODEKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICLP8Oji/+fq6CDt5SDt4Onk5e37IgorCisjOiBnZXRjaGFyLmM6NDE3MworbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDog7eXk7u/z8fLo7PvpIPDl5ujsIgorCisjOiBndWkuYzoyMjAKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogzeXi7ufs7ubt7iDv5fDl6fLoIOIg8OXm6Owg4/Dg9Oj35fHq7uPuIOjt8uXw9OXp8eAiCisKKyM6IGd1aS5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogzeXi7ufs7ubt7iDi++/u6+3o8vwg9/Ll7ejlIFwiJXNcIiIKKworIzogZ3VpLmM6NDcyCittc2dpZCAiRTY2NTogQ2Fubm90IHN0YXJ0IEdVSSwgbm8gdmFsaWQgZm9udCBmb3VuZCIKK21zZ3N0ciAiIgorIkU2NjU6IM3l4u7n7O7m7e4g7+Xw5eny6CDiIPDl5ujsIOPw4PQuIOjt8uXw9OXp8eAsIO3l7/Dg4ujr/O3uIOfg5ODt+yD48Oj08vsiCisKKyM6IGd1aS5jOjQ3NworbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTog7eXv8ODi6Ov87e7lIOft4Pfl7ejlIO7v9ujoICdndWlmb250d2lkZSciCisKKyM6IGd1aS5jOjU0NworbXNnaWQgIkU1OTk6IFZhbHVlIG9mICdpbWFjdGl2YXRla2V5JyBpcyBpbnZhbGlkIgorbXNnc3RyICJFNTk5OiDt5e/w4OLo6/zt7uUg5+3g9+Xt6OUg7u/26OggJ2ltYWN0aXZhdGVrZXknIgorCisjOiBndWkuYzo0MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogzeXi7ufs7ubt7iDt4Oft4Pfo8vwg9uLl8iAlcyIKKworIzogZ3VpX2F0X2ZzLmM6MzAwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjzt5ev85/8g7vLq8Pvy/D4gIgorCisjOiBndWlfYXRfZnMuYzoxMTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTY6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAiRTYxNjogdmltX1NlbEZpbGU6IPjw6PTyICVzIO3lIO3g6eTl7SIKKworIzogZ3VpX2F0X2ZzLmM6Mjc4MQorbXNnaWQgIkU2MTQ6IHZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTQ6IHZpbV9TZWxGaWxlOiDi7ufi8ODyIOIg8uXq8/no6SDq4PLg6+7jIO3l4u7n7O7m5e0iCisKKyM6IGd1aV9hdF9mcy5jOjI4MDEKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIs/z8vwg6iD04Onr8zoiCisKKyM6IGd1aV9hdF9mcy5jOjI4MDcKK21zZ2lkICJFNjE1OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE1OiB2aW1fU2VsRmlsZTog7eUg7O7j8yDt4Ony6CDy5erz+ejpIOrg8uDr7uMiCisKKyM6IGd1aV9hdF9mcy5jOjI4MTUgZ3VpX21vdGlmLmM6MTYyMworbXNnaWQgIk9LIgorbXNnc3RyICLE4CIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfZ3RrLmM6MjczMSBndWlfbW90aWYuYzoxNjE4IGd1aV9tb3RpZi5jOjI4NDkKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIs7y7OXt4CIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICLP7uvu8eAg7/Du6vDz8uroOiDt5SDs7uPzIO7v8OXk5evo8vwg4+Xu7OXy8Oj+IO/u6+fz7ergIgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAixOjg6+7j7uLu5SDu6u3uIFZpbSIKKworIzogZ3VpX2JldmFsLmM6MTAxIGd1aV93MzIuYzozODI5Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIiIKKyJFMjMyOiBcIs/z5/vw/FwiIOTr/yDi+/fo8evl7ejpLCDi6uv+9+D++ejpIOgg8e7u4fnl7ejlLCDoIO7h8ODy7fvpIOL75+7iLCAiCisi7eUg7O7m5fIg4fvy/CDx7ufk4O0iCisKKyM6IGd1aV9ndGsuYzoxNjA3Cittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAixOjg6+7j7uLu5SDu6u3uIFZpbS4uLiIKKworIzogZ3VpX2d0ay5jOjIwNjAgbWVzc2FnZS5jOjI5OTMKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImxOBcbiIKKyImzeXyXG4iCisiziby7OXt4CIKKworIzogZ3VpX2d0ay5jOjIyNjgKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAizOXy7uT7IMLi7uTgIgorCisjOiBndWlfZ3RrLmM6MjUzNCBndWlfbW90aWYuYzoyNzY4Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSDP7ujx6iDoIOfg7OXt4C4uLiIKKworIzogZ3VpX2d0ay5jOjI1NDIgZ3VpX21vdGlmLmM6Mjc3MAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gz+7o8eouLi4iCisKKyM6IGd1aV9ndGsuYzoyNTc0IGd1aV9tb3RpZi5jOjI4ODgKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICLX8u4g6Pnl7DoiCisKKyM6IGd1aV9ndGsuYzoyNTkyIGd1aV9tb3RpZi5jOjI5MjAKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICLN4CD38u4g5+Ds5e3/5ew6IgorCisjLiB3aG9sZSB3b3JkIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYyNCBndWlfbW90aWYuYzozMDM2Cittc2dpZCAiTWF0Y2ggd2hvbGUgd29yZCBvbmx5IgorbXNnc3RyICLS7uv86u4g8u737fvlIPHu7vLi5fLx8uLo/yIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNjM1IGd1aV9tb3RpZi5jOjMwNDgKK21zZ2lkICJNYXRjaCBjYXNlIgorbXNnc3RyICLQ5ePo8fLw7ufg4ujx6Oz75SDx7u7y4uXy8fLi6P8iCisKKyM6IGd1aV9ndGsuYzoyNjQ1IGd1aV9tb3RpZi5jOjI5OTAKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIs3g7/Dg4uvl7ejlIgorCisjLiAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIzogZ3VpX2d0ay5jOjI2NTcgZ3VpX21vdGlmLmM6MzAwMgorbXNnaWQgIlVwIgorbXNnc3RyICLC4uXw9SIKKworIzogZ3VpX2d0ay5jOjI2NjEgZ3VpX21vdGlmLmM6MzAxMAorbXNnaWQgIkRvd24iCittc2dzdHIgIsLt6OciCisKKyM6IGd1aV9ndGsuYzoyNjgzIGd1aV9ndGsuYzoyNjg1IGd1aV9tb3RpZi5jOjI3OTIKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIs3g6fLoIPHr5eTz/vnl5SIKKworIzogZ3VpX2d0ay5jOjI3MDIgZ3VpX2d0ay5jOjI3MDQgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIsfg7OXt4CIKKworIzogZ3VpX2d0ay5jOjI3MTUgZ3VpX2d0ay5jOjI3MTcgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICLH4Ozl7ejy/CDi8eUiCisKKyM6IGd1aV9ndGtfeDExLmM6MjMyNworbXNnaWQgIlZpbTogUmVjZWl2ZWQgXCJkaWVcIiByZXF1ZXN0IGZyb20gc2Vzc2lvbiBtYW5hZ2VyXG4iCittc2dzdHIgIlZpbTogz+7r8/fl7SDn4O/w7vEg7eAg7/Dl6vDg+eXt6OUg8ODh7vL7IO7yIOTo8e/l8vfl8OAg8eXg7fHu4lxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkKK21zZ2lkICJWaW06IE1haW4gd2luZG93IHVuZXhwZWN0ZWRseSBkZXN0cm95ZWRcbiIKK21zZ3N0ciAiVmltOiDO8e3u4u3u5SDu6u3uIOH76+4g7eXu5ujk4O3t7iDn4Orw+/LuXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDEzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICLC++Hu8CD48Oj08uAiCisKKyM6IGd1aV9ndGtfeDExLmM6NjAzNSB1aS5jOjIxMjAKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICLC7OXx8u4g7/Px8u7j7iDi++Tl6+Xt6P8g6PHv7uv85/Pl8vH/IENVVF9CVUZGRVIwIgorCisjOiBndWlfbW90aWYuYzoxNjE3IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgItTo6/zy8CIKKworIzogZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICLK4PLg6+7j6CIKKworIzogZ3VpX21vdGlmLmM6MTYyMQorbXNnaWQgIkhlbHAiCittc2dzdHIgItHv8ODi6uAiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjIKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAi1ODp6/siCisKKyM6IGd1aV9tb3RpZi5jOjE2MjQKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIsL75OXr5e3o5SIKKworIzogZ3VpX21vdGlmLmM6MjgzNQorbXNnaWQgIlVuZG8iCittc2dzdHIgIs7y7OXt4CIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEwOiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkU2MTA6IM3l4u7n7O7m7e4g5+Dj8PPn6PL8IPjw6PTyIFphcCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjExOiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTYxMTogzeXi7ufs7ubt7iDo8e/u6/zn7uLg8vwg+PDo9PIgJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjcwCittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIs7y7/Dg4urgIPHu7uH55e3o/yDk6/8g8+3o9/Lu5uXt6P8g7/Du9uXx8eAt7+7y7uzq4C5cbiIKKworIzogZ3VpX3czMi5jOjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0Mzogz+Dw4Ozl8vAg7eUg7+7k5OXw5uji4OXy8f86IFwiLSVzXCI7IOjx7+7r/Ofz6fLlIOLl8PHo/iBPTEUuIgorCisjOiBndWlfdzQ4LmM6MjA5MAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIs/u6PHqIPHy8O7q6CAo6PHv7uv85/Pp8uUgJ1xcXFwnIOTr/yDv7ujx6uAgJ1xcJykiCisKKyM6IGd1aV93NDguYzoyMTE1Cittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAiz+7o8eog6CDn4Ozl7eAgKOjx7+7r/Ofz6fLlICdcXFxcJyDk6/8g7+7o8ergICdcXCcpIgorCisjOiBndWlfeDExLmM6MTUzNworbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODog7eXi7ufs7ubt7iDi++Tl6+jy/CDn4O/o8fwg4iDy4OHr6PblIPbi5fLgLCDt5eru8u7w++Ug9uLl8uDs7uPz8iAiCisi7vLu4fDg5uDy/PH/IO3l7/Dg4ujr/O3uIgorCisjOiBndWlfeDExLmM6MjExOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiRTI1MDog4iDt4OHu8OUg+PDo9PLu4iAlcyDu8vHz8vHy4vP+8iD48Oj08vsg5Ov/IPHr5eTz/vno9SDq7uTo8O7i7uo6IgorCisjOiBndWlfeDExLmM6MjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiDN4OHu8CD48Oj08u7iOiAlcyIKKworIzogZ3VpX3gxMS5jOjIxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCAnJXMnIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAi2PDo9PIgJyVzJyDt5SD/4uv/5fLx/yDs7u3u+Ojw6O3t++wiCisKKyM6IGd1aV94MTEuYzoyMTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogzeDh7vAg+PDo9PLu4jogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIkZvbnQwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAiRm9udDE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTg0Cittc2dpZCAiRm9udCVsZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICLY6PDo7eAg+PDo9PLgIGZvbnQlbGQg5O7r5u3gIOH78vwg4uTi7uUg4e7r/PjlIPjo8Ojt+yD48Oj08uAgZm9udDBcbiIKKworIzogZ3VpX3gxMS5jOjIxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDAgd2lkdGg6ICVsZFxuIgorbXNnc3RyICLY6PDo7eAg+PDo9PLgIGZvbnQwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorItjo8Ojt4CD48Oj08uAgZm9udDE6ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAi0zI1NsYgztjIwcrAIODi8u7s4PLo6ugg1eDt4/vrIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAixO7h4OLo8vwg7e7i8/4g4eDn8yDk4O3t+/UiCisKKyM6IGlmX2NzY29wZS5jOjc5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAix+Dv8O7xIO/uIPjg4evu7fMiCisKKyM6IGlmX2NzY29wZS5jOjgxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIs/u6uDn4PL8IP3y7iDx7u7h+eXt6OUiCisKKyM6IGlmX2NzY29wZS5jOjgzCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgItPh6PL8IPHu5eTo7eXt6OUiCisKKyM6IGlmX2NzY29wZS5jOjg1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAix+Dt7uLuIOjt6Pbo4Ovo5+jw7uLg8vwg4vHlIPHu5eTo7eXt6P8iCisKKyM6IGlmX2NzY29wZS5jOjg3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAiz+7q4Ofg8vwg8e7l5Ojt5e3o/yIKKworIzogaWZfY3Njb3BlLmM6OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiDI8e/u6/zn7uLg7ejlOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI0Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICLd8uAg6u7s4O3k4CBjc2NvcGUg7eUg7+7k5OXw5uji4OXyIPDg5+Tl6+Xt6OUg7urt4C5cbiIKKworIzogaWZfY3Njb3BlLmM6MTc1Cittc2dpZCAiRTU2MjogVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIkU1NjI6IMjx7+7r/Ofu4uDt6OU6IGNzdGFnIDzo7P8+IgorCisjOiBpZl9jc2NvcGUuYzoyMzEKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IOzl8urgIO3lIO3g6eTl7eAiCisKKyM6IGlmX2NzY29wZS5jOjQwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYzOiBzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgIu746OHq4CBzdGF0KCVzKTogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQxOQorbXNnaWQgIkU1NjM6IHN0YXQgZXJyb3IiCittc2dzdHIgIkU1NjM6IO746OHq4CBzdGF0IgorCisjOiBpZl9jc2NvcGUuYzo1MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2NDogJXMgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgdmFsaWQgY3Njb3BlIGRhdGFiYXNlIgorbXNnc3RyICJFNTY0OiAlcyDt5SD/4uv/5fLx/yDq4PLg6+7j7uwg6OvoIOjs5e3l7CDh4Of7IGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NTM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAixO7h4OLr5e3gIOHg5+Ag5ODt7fv1IGNzY29wZSAlcyIKKworIzogaWZfY3Njb3BlLmM6NTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWxkIgorbXNnc3RyICJFMjYyOiDu+Ojh6uAg7+7r8/fl7ej/IOjt9O7w7OD26Ogg7vIg8e7l5Ojt5e3o/yBjc2NvcGUgJWQiCisKKyM6IGlmX2NzY29wZS5jOjY5NAorbXNnaWQgIkU1NjE6IHVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJFNTYxOiDt5ejn4uXx8u376SDy6O8g7+7o8ergIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzM2Cittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IM3l4u7n7O7m7e4g8e7n5ODy/CDy8PPh8yDk6/8gY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo3NTMKK21zZ2lkICJFNjIyOiBDb3VsZCBub3QgZm9yayBmb3IgY3Njb3BlIgorbXNnc3RyICJFNjIyOiDN5eLu5+zu5u3uIOL77+7r7ejy/CBmb3JrKCkg5Ov/IGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6ODQ3IGlmX2NzY29wZS5jOjg5NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICLt5SDz5ODr7vH8IOL77+7r7ejy/CBjc19jcmVhdGVfY29ubmVjdGlvbiIKKworIzogaWZfY3Njb3BlLmM6ODk4Cittc2dpZCAiRTYyMzogQ291bGQgbm90IHNwYXduIGNzY29wZSBwcm9jZXNzIgorbXNnc3RyICJFNjIzOiDN5SDz5ODr7vH8IOfg7/Px8ujy/CDv8O725fHxIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6OTExCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjog7eUg8+Tg6+7x/CDi++/u6+3o8vwgZmRvcGVuIOTr/yB0b19mcCIKKworIzogaWZfY3Njb3BlLmM6OTEzCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjog7eUg8+Tg6+7x/CDi++/u6+3o8vwgZmRvcGVuIOTr/yBmcl9mcCIKKworIzogaWZfY3Njb3BlLmM6OTUxCittc2dpZCAiRTU2Nzogbm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICJFNTY3OiDx7uXk6O3l7ejpIPEgY3Njb3BlIO3lIPHu5+Tg7e4iCisKKyM6IGlmX2NzY29wZS5jOjEwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1OTogbm8gbWF0Y2hlcyBmb3VuZCBmb3IgY3Njb3BlIHF1ZXJ5ICVzIG9mICVzIgorbXNnc3RyICJFMjU5OiDt5SDt4Onk5e3uIPHu7vLi5fLx8uLo6SDv7iDn4O/w7vHzIGNzY29wZSAlcyDk6/8gJXMiCisKKyM6IGlmX2NzY29wZS5jOjEwODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OTogaW52YWxpZCBjc2NvcGVxdWlja2ZpeCBmbGFnICVjIGZvciAlYyIKK21zZ3N0ciAiRTQ2OTog7eXv8ODi6Ov87fvpIPTr4OMgY3Njb3BlcXVpY2tmaXggJWMg5Ov/ICVjIgorCisjOiBpZl9jc2NvcGUuYzoxMTUyCittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICLq7uzg7eT7IGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6MTE1NQorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKSIKK21zZ3N0ciAiJS01czogJS0zMHMgKMjx7+7r/Ofu4uDt6OU6ICVzKSIKKworIzogaWZfY3Njb3BlLmM6MTI1MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjI1OiBjYW5ub3Qgb3BlbiBjc2NvcGUgZGF0YWJhc2U6ICVzIgorbXNnc3RyICJFNjI1OiDt5eLu5+zu5u3uIO7y6vD78vwg4eDn8yDk4O3t+/UgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTI3MQorbXNnaWQgIkU2MjY6IGNhbm5vdCBnZXQgY3Njb3BlIGRhdGFiYXNlIGluZm9ybWF0aW9uIgorbXNnc3RyICJFNjI2OiDo7fTu8Ozg9uj/IO4g4eDn5SDk4O3t+/UgY3Njb3BlIO3lIOTu8fLz7+3gIgorCisjOiBpZl9jc2NvcGUuYzoxMjk2Cittc2dpZCAiRTU2ODogZHVwbGljYXRlIGNzY29wZSBkYXRhYmFzZSBub3QgYWRkZWQiCittc2dzdHIgIkU1Njg6IOTg7e3g/yDh4OfgIOTg7e379SBjc2NvcGUg8+blIO/u5PHu5eTo7eXt4CIKKworIzogaWZfY3Njb3BlLmM6MTMwNworbXNnaWQgIkU1Njk6IG1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICJFNTY5OiDk7vHy6OPt8/LuIOzg6vHo7ODr/O3u5SDn7eD35e3o5SDu8urw+/L79SDx7uXk6O3l7ejpIPEgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoxNDI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTog8e7l5Ojt5e3o5SDxIGNzY29wZSAlcyDt5SDu4e3g8PPm5e3uIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZCIKK21zZ3N0ciAi8e7l5Ojt5e3o5SDxIGNzY29wZSDn4Orw+/LuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjE1OTgKK21zZ2lkICJFNTcwOiBmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiRTU3MDog6vDo8uj35fHq4P8g7vjo4ergIOIgY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIszl8urgIGNzY29wZTogJXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NzAKK21zZ2lkICIiCisiXG4iCisiICAgIyAgIGxpbmUiCittc2dzdHIgIiIKKyJcbiIKKyIgICAjICAg8fLw7urgIgorCisjOiBpZl9jc2NvcGUuYzoxODcyCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICLo7P8g9ODp6+AgLyDq7u3y5erx8iAvIPHy8O7q4FxuIgorCisjOiBpZl9jc2NvcGUuYzoxOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDk6IENzY29wZSBlcnJvcjogJXMiCittc2dzdHIgIkU2MDk6IM746OHq4CBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoyMTc2Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIs/l8OXn4OPw8+fq4CDi8eX1IOHg5yDk4O3t+/UgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzoyMjQ0Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIvHu5eTo7eXt6P8g8SBjc2NvcGUg7vLx8/Lx8uLz/vJcbiIKKworIzogaWZfY3Njb3BlLmM6MjI0OAorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgIOHg5+Ag5ODt7fv1ICAgICAgICAgICAgICAgICAgICAgICAgIO3g9+Dr/O376SDv8/L8XG4iCisKKyM6IGlmX3B5dGhvbi5jOjQzNgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2MzogyiDx7ubg6+Xt6P4g/fLgIOru7ODt5OAg7eUg8ODh7vLg5fIsIO/u8eru6/zq8yDt5SDn4OPw8+bl7eAg4ejh6+ju8uXq4CAiCisiUHl0aG9uIgorCisjOiBpZl9weXRob24uYzo1MDAKK21zZ2lkICJFNjU5OiBDYW5ub3QgaW52b2tlIFB5dGhvbiByZWN1cnNpdmVseSIKK21zZ3N0ciAiRTY1OTogzeXi7ufs7ubt7iDi++/u6+3o8vwg8OXq8/Dx6OLt++kg4vvn7uIgUHl0aG9uIgorCisjOiBpZl9weXRob24uYzo3MDEKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIu3l4u7n7O7m7e4g8+Tg6+jy/CDg8vDo4fPy+yBPdXRwdXRPYmplY3QiCisKKyM6IGlmX3B5dGhvbi5jOjcwOAorbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgIuft4Pfl7ejlIHNvZnRzcGFjZSDk7uvm7e4g4fvy/CD25ev77CD36PHr7uwiCisKKyM6IGlmX3B5dGhvbi5jOjcxNgorbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICLt5e/w4OLo6/zt++kg4PLw6OHz8iIKKworIzogaWZfcHl0aG9uLmM6NzU1IGlmX3B5dGhvbi5jOjc2OQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSDy8OXh8+XyIPPq4Ofg7ej/IPHv6PHq4CDx8vDu6iIKKworIzogaWZfcHl0aG9uLmM6ODk1Cittc2dpZCAiRTI2NDogUHl0aG9uOiBFcnJvciBpbml0aWFsaXNpbmcgSS9PIG9iamVjdHMiCittc2dzdHIgIkUyNjQ6IFB5dGhvbjogzvjo4ergIOjt6Pbo4Ovo5+D26Ogg7uH65ery7uIgSS9PIgorCisjOiBpZl9weXRob24uYzoxMDgwIGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIu3l7/Dg4ujr/O3u5SDi+/Dg5uXt6OUiCisKKyM6IGlmX3B5dGhvbi5jOjEwOTQgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAi4vvw4Obl7ej/IO7y6uv+9+Xt+yDv8Ogg6u7s7+jr//bo6CIKKworIzogaWZfcHl0aG9uLmM6MTEwNworbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIu/u7/vy6uAg8e7x6+Dy/PH/IO3gIPPt6Pfy7ubl7e376SDh8/Tl8CIKKworIzogaWZfcHl0aG9uLmM6MTEyMiBpZl9weXRob24uYzoxMTYzIGlmX3B5dGhvbi5jOjEyMjcgaWZfdGNsLmM6MTIxNAorbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAi5+Dv8OXk5ev87fvpIO3u7OXwIPHy8O7q6CIKKworIzogaWZfcHl0aG9uLmM6MTM2MgorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjzu4frl6vIg4fP05fDgICjz5ODr5e0pIOIgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE0NTMgaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIu3l7/Dg4ujr/O3u5SDo7P8g7vLs5fLq6CIKKworIzogaWZfcHl0aG9uLmM6MTczMworbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICLt5fIg8uDq7uPuIOHz9OXw4CIKKworIzogaWZfcHl0aG9uLmM6MTgyMQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgIu/u7/vy6uAg8e7x6+Dy/PH/IO3gIOfg6vD78u7lIO7q7e4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NjYKK21zZ2lkICJyZWFkb25seSBhdHRyaWJ1dGUiCittc2dzdHIgIuDy8Ojh8/Ig5O7x8vPv5e0g8u7r/OruIOTr/yD38uXt6P8iCisKKyM6IGlmX3B5dGhvbi5jOjE4NzkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIu/u5+j26P8g6vPw8e7w4CDt4PXu5Ojy8f8g4u3lIOHz9OXw4CIKKworIzogaWZfcHl0aG9uLmM6MTk1NgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI87uH65eryIO7q7eAgKPPk4Ovl7Skg4iAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPO7h+uXq8iDu6u3gICjt5ejn4uXx8uXtKSDiICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTk3MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93ICVkPiIKK21zZ3N0ciAiPO7q7e4gJWQ+IgorCisjOiBpZl9weXRob24uYzoyMDQ2Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgIu3l8iDy4Oru4+4g7urt4CIKKworIzogaWZfcHl0aG9uLmM6MjMwNyBpZl9weXRob24uYzoyMzQxIGlmX3B5dGhvbi5jOjIzOTYgaWZfcHl0aG9uLmM6MjQ2NAorIzogaWZfcHl0aG9uLmM6MjU4NiBpZl9weXRob24uYzoyNjM4IGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OQorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIu3l4u7n7O7m7e4g8e718ODt6PL8IOjt9O7w7OD26P4g7uEg7vLs5e3lIO7v5fDg9ujoIgorCisjOiBpZl9weXRob24uYzoyMzA5IGlmX3B5dGhvbi5jOjI0MDMgaWZfcHl0aG9uLmM6MjQ3NQorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAi7eXi7ufs7ubt7iDz5ODr6PL8IPHy8O7q8yIKKworIzogaWZfcHl0aG9uLmM6MjM0NiBpZl9weXRob24uYzoyNDkxIGlmX3RjbC5jOjY5MCBpZl90Y2wuYzoyMDIxCittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAi7eXi7ufs7ubt7iDn4Ozl7ejy/CDx8vDu6vMiCisKKyM6IGlmX3B5dGhvbi5jOjI1MDkgaWZfcHl0aG9uLmM6MjU4OCBpZl9weXRob24uYzoyNjQ2Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICLt5eLu5+zu5u3uIOLx8uDi6PL8IPHy8O7q8yIKKworIzogaWZfcHl0aG9uLmM6Mjc1MAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAi8fLw7urgIO3lIOzu5uXyIPHu5OXw5uDy/CDx6Ozi7usg7e7i7ukg8fLw7uroIgorCisjOiBpZl9ydWJ5LmM6NDIyCittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjY2OiDKIPHu5uDr5e3o/iD98uAg6u7s4O3k4CDt5SDw4OHu8uDl8iwg7+7x6u7r/OrzIO3lIOfg4/Dz5uXt4CDh6OHr6O7y5ergICIKKyJSdWJ5LiIKKworIzogaWZfcnVieS5jOjQ4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiDt5ejn4uXx8u3u5SDx7vHy7v/t6OUgbG9uZ2ptcCAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICLP5fDl6uv+9+Xt6OUg7OXm5PMg8OXg6+jn4Pbo5ekv7u/w5eTl6+Xt6OXsIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICLP7urg5+Dy/CDh4Ofu4vvpIOrr4PHxICIKKworIzogaWZfc25pZmYuYzo2OQorbXNnaWQgIlNob3cgb3ZlcnJpZGRlbiBtZW1iZXIgZnVuY3Rpb24iCittc2dzdHIgIs/u6uDn4PL8IO/l8OXj8PPm5e3t++Ug9PPt6vbo6CIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAiz+7r8/fl7ejlIOjnIPTg6evgIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICLP7uvz9+Xt6OUg6Ocg7/Du5ery4CIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICLP7uvz9+Xt6OUg6Ocg4vHl9SDv8O7l6vLu4iIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICLP7uvz9+Xt6OUiCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAiz+7q4Ofg8vwg6PH17uTt++kg6u7kIgorCisjOiBpZl9zbmlmZi5jOjc2Cittc2dpZCAiRmluZCBzeW1ib2wiCittc2dzdHIgIs3g6fLoIPHo7OLu6yIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAiz/Du8ezu8vAg6uvg8fHgIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIs/u6uDn4PL8IOrr4PHxIOIg6OXw4PD16OgiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICLP7urg5+Dy/CDq6+Dx8SDiIO7j8ODt6Pfl7e3u6SDo5fDg8PXo6CIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmIPHx++vg5fLx/yDt4CIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgItHx++vq4CDt4CB4cmVmIOjnIgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiDo7OXl8iIKKworIzogaWZfc25pZmYuYzo4MworbXNnaWQgIlhyZWYgdXNlZCBieSIKK21zZ3N0ciAiWHJlZiDo8e/u6/zn8+Xy8f8iCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIs/u6uDn4PL8IGRvY3UiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAi0e7n5ODy/CBkb2N1IgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICIiCisizeXi7ufs7ubt7iDv7uTx7uXk6O3o8vzx/yDqIFNOaUZGKy4gz/Du4uXw/PLlIO3g8fLw7unq6CDu6vDz5uXt6P8uIgorIihzbmlmZmVtYWNzIOTu6+bt+yDh+/L8IPPq4Ofg7fsg4iDv5fDl7OXt7e7pICRQQVRIKS5cbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IM746OHq4CDi7iDi8OXs/yD38uXt6P8uIM7y8e7l5Ojt5e3o5SIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiwiDt4PHy7v/56Okg7O7s5e3yIFNOaUZGKyAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAi7eUgIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAi7+7k8e7l5OjtuO0iCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiDN5ejn4uXx8u376SDn4O/w7vEgU05pRkYrOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3Njogzvjo4ergIPHu5eTo7eXt6P8g8e4gU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMDkKK21zZ2lkICJFMjc4OiBTTmlGRisgbm90IGNvbm5lY3RlZCIKK21zZ3N0ciAiRTI3ODogU05pRkYrIO3lIO/u5PHu5eTo7bjtIgorCisjOiBpZl9zbmlmZi5jOjEwMTgKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiDd8u4g7eUg4fP05fAgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiDO+Ojh6uAg4u4g4vDl7P8g5+Dv6PHoLiDO8vHu5eTo7eXt6OUiCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAi7eXv8ODi6Ov87fvpIO3u7OXwIOHz9OXw4CIKKworIzogaWZfdGNsLmM6NDY0IGlmX3RjbC5jOjkzMSBpZl90Y2wuYzoxMTEwCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAi7+7q4CDt5SDw5eDr6Ofu4uDt7iIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIu3l6Ofi5fHy7eD/IO7v9uj/IgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAi7eXi7ufs7ubt7iDt4Oft4Pfo8vwg8fLw7urzIOjr6CDx8vDu6ugiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAi7vLs5fLq4CDt5SDz8fLg7e7i6+Xt4CIKKworIzogaWZfdGNsLmM6ODUxIGlmX3RjbC5jOjEwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAi8P/kICVkIOru6+7t6uAgJWQiCisKKyM6IGlmX3RjbC5jOjg4MQorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIu3l4u7n7O7m7e4g4vHy4OLo8vwg6OvoIOTu4eDi6PL8IPHy8O7q8yIKKworIzogaWZfdGNsLmM6MTI2OAorbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICLt5ejn4uXx8u376SD06+DjOiAiCisKKyM6IGlmX3RjbC5jOjEzMzgKK21zZ2lkICJ1bmtub3duIHZpbU9wdGlvbiIKK21zZ3N0ciAi7eXo5+Ll8fLt4P8gdmltT3B0aW9uIgorCisjOiBpZl90Y2wuYzoxNDIzCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICLq6+Di6ODy8/Dt7uUg7/Dl8Pvi4O3o5SIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAi7vjo4ergIHZpbSIKKworIzogaWZfdGNsLmM6MTQ3MQorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAi7eXi7ufs7ubt7iDx7ufk4PL8IOru7ODt5PMg4fP05fDgIOjr6CDu6u3gOiDu4frl6vIg4iDv8O725fHx5SDz5ODr5e3o/yIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyLt5eLu5+zu5u3uIOfg8OXj6PHy8Ojw7uLg8vwg6u7s4O3k8yDxIO7h8ODy7fvsIOL75+7i7uw6IOHz9OXwIOjr6CDu6u3uIOIgIgorIu/w7vbl8fHlIPPk4Ovl7ej/IgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MgorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogytDI0sjXxdHKwN8gztjIwcrAIFRDTDog7+7i8OXm5LjtIPHv6PHu6iDx8fvr7uo/ISDR7u7h+ejy5SDu4SD98u7sIO/uICIKKyLg5PDl8fMgdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorIu3l4u7n7O7m7e4g5+Dw5ePo8fLw6PDu4uDy/CDq7uzg7eTzIPEg7uHw4PLt++wg4vvn7uLu7Dog8fH76+rgIO3gIOHz9OXwIOjr6CAiCisi7urt7iDt5SDu4e3g8PPm5e3gIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiIgorIkU1NzE6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkU1NzE6IMog8e7m4Ovl7ej+IP3y4CDq7uzg7eTgIO3lIPDg4e7y4OXyLCDv7vHq7uv86vMg7eUg5+Dj8PPm5e3gIOHo4evo7vLl6uAgIgorIlRjbCIKKworIzogaWZfdGNsLmM6MTg4NgorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiIgorIkUyODE6IM7YyMHKwCBUQ0w6IMru5CDi+/Xu5OAg7eUg/+Lr/+Xy8f8g9uXr++wg9+jx6+7sPyEg0e7u4fno8uUg7uEg/fLu7CDiICIKKyJ2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjIwMDcKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIu3l4u7n7O7m7e4g7+7r8/fo8vwg8fLw7urzIgorCisjOiBpZl94Y21kc3J2LmM6MjI1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAizeXi7ufs7ubt7iDn4PDl4+jx8vDo8O7i4PL8IOjs/yDx5fDi5fDgIOru7ODt5CIKKworIzogaWZfeGNtZHNydi5jOjQ3MworbXNnaWQgIkUyNDg6IEZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHByb2dyYW0iCittc2dzdHIgIkUyNDg6IM7y7/Dg4urgIOru7ODt5Psg4iDk8PPj8/4g7/Du4/Dg7OzzIO3lIPPk4Ovg8fwiCisKKyM6IGlmX3hjbWRzcnYuYzo3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IMjx7+7r/Ofz5fLx/yDt5e/w4OLo6/zt++kgaWQg8eXw4uXw4DogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMTEwCittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICIiCisiRTI1MTogzeXv8ODi6Ov87e4g8fTu8Ozo8O7i4O3uIOft4Pfl7ejlIOTg7e3u4+4g7/Du9uXx8eAgVklNIOIg8OXl8fLw5S4gIgorItPk4Ovl7e4hIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAizeXo5+Ll8fLt++kg4PDj8+zl7fIiCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICLR6+j46u7sIOzt7uPuIODw4/Ps5e3y7uIg8OXk4Ory6PDu4uDt6P8iCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIs/w7u/z+eXtIODw4/Ps5e3yIO/u8evlIgorCisjOiBtYWluLmM6NjYKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAizPPx7vAg7+7x6+Ug4PDj8+zl7fLgIgorCisjOiBtYWluLmM6NjgKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIsIFwiLWMgY29tbWFuZFwiIG9yIFwiLS1jbWQgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAiIgorItHr6Pjq7uwg7O3u4+4g4PDj8+zl7fLu4iBcIivq7uzg7eTgXCIsIFwiLWMg6u7s4O3k4FwiIOjr6CBcIi0tY21kIOru7ODt5OBcIiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIs3l5O7v8/Hy6Oz75SDg8OPz7OXt8vsg5Ov/IgorCisjOiBtYWluLmM6NDY2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICIiCisixODt7fvpIFZpbSDh++sg8eru7O/o6+jw7uLg7SDxIOL76uv+9+Xt7e7pIO7x7uHl7e3u8fL8/iDv8O7x7O7y8OAg7vLr6Pfo6SIKKworIzogbWFpbi5jOjkzMgorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIs/u7/vy6uAg7+7i8u7w7e7j7iDu8urw+/Lo/yD04Onr4CDx9uXt4PDo/zogXCIiCisKKyM6IG1haW4uYzo5NDEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIs3l4u7n7O7m7e4g7vLq8Pvy/CDk6/8g9/Ll7ej/OiBcIiIKKworIzogbWFpbi5jOjk4NQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAizeXi7ufs7ubt7iDu8urw+/L8IOTr/yDi++Lu5OAg8fbl7eDw6P86IFwiIgorCisjOiBtYWluLmM6MTEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgItTg6evu4iDk6/8g8OXk4Ory6PDu4uDt6P86ICVkXG4iCisKKyM6IG1haW4uYzoxMjMzCittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDP8OXk8+/w5ebk5e3o5Togwvvi7uQg7vHz+eXx8uLr/+Xy8f8g7eUg7eAg8uXw7Ojt4OtcbiIKKworIzogbWFpbi5jOjEyMzUKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDP8OXk8+/w5ebk5e3o5TogwuLu5CDv8O7o8fXu5OjyIO3lIPEg8uXw7Ojt4OvgXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTI5NworbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgIuru7ODt5O3g/yDx8vDu6uAg7+Xw5eQg4vvv7uvt5e3o5ewgdmltcmMiCisKKyM6IG1haW4uYzoxMzM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiDN5eLu5+zu5u3uIOL77+7r7ejy/CD38uXt6OUg6OcgXCIlc1wiIgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisixO7v7uvt6PLl6/zt4P8g6O307vDs4Pbo/zogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjQ0NAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJb9ODp6yAuLl0g8OXk4Ory6PDu4uDt6OUg8+rg5+Dt7fv1IPTg6evu4iIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICAg9/Ll7ejlIPLl6vHy4CDo5yDv7vLu6uAg4uLu5OAgc3RkaW4iCisKKyM6IG1haW4uYzoyNDQ2Cittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQg7OXy6uAgICAgICAgICDw5eTg6vLo8O7i4O3o5SD04Onr4CDxIPPq4Ofg7e3u6SDs5fLq7ukiCisKKyM6IG1haW4uYzoyNDQ4Cittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBb9ODp6yDu+Ojh7updIPDl5ODq8ujw7uLg7ejlIPTg6evgIPEg7+Xw4u7pIO746OHq7ukiCisKKyM6IG1haW4uYzoyNDU3Cittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIsjx7+7r/Ofu4uDt6OU6IgorCisjOiBtYWluLmM6MjQ2MAorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICIgdmltIFvg8OPz7OXt8vtdICIKKworIzogbWFpbi5jOjI0NjQKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAg6OvoOiIKKworIzogbWFpbi5jOjI0NjcKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiwPDj8+zl7fL7OlxuIgorCisjOiBtYWluLmM6MjQ2OAorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0xODr5eUg8+rg5/vi4P7y8f8g8u7r/OruIOjs5e3gIPTg6evu4iIKKworIzogbWFpbi5jOjI0NzAKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdM3lIOL77+7r7f/y/CDv7uTx8uDt7uLq8yDv7iDs4PHq5SIKKworIzogbWFpbi5jOjI0NzMKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHTH4PDl4+jx8vDo8O7i4PL8IP3y7vIgZ3ZpbSDk6/8gT0xFIgorCisjOiBtYWluLmM6MjQ3NAorbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHTO8urr/vfo8vwg8OXj6PHy8OD26P4g5ODt7e7j7iBndmltIOTr/yBPTEUiCisKKyM6IG1haW4uYzoyNDc3Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHTH4O/z8fLo8vwg8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CAo6uDqIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjI0NzgKK21zZ2lkICItZiAgb3IgIC0tbm9mb3JrXHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZiAg6OvoIC0tbm9mb3JrXHTCIODq8uji7e7pIOfg5OD35TogzeUg4vvv7uvt//L8IGZvcmsg7/DoIOfg7/Px6uUgR1VJIgorCisjOiBtYWluLmM6MjQ4MAorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdNDl5ujsIFZpICjq4OogXCJ2aVwiKSIKKworIzogbWFpbi5jOjI0ODEKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHTQ5ebo7CBFeCAo6uDqIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDgyCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdNLo9ejpICjv4Orl8u376Skg8OXm6OwgKPLu6/zq7iDk6/8gXCJleFwiKSIKKworIzogbWFpbi5jOjI0ODQKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx00OXm6Owg7vLr6Pfo6SAo6uDqIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjI0ODYKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdM/w7vHy7ukg8OXm6OwgKOrg6iBcImV2aW1cIiwg4eXn8OXm6Ozt++kpIgorCisjOiBtYWluLmM6MjQ4NworbXNnaWQgIi1SXHRcdFx0UmVhZG9ubHkgbW9kZSAobGlrZSBcInZpZXdcIikiCittc2dzdHIgIi1SXHRcdFx00u7r/OruIOTr/yD38uXt6P8gKOrg6iBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyNDg4Cittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdM7j8ODt6Pfl7e376SDw5ebo7CAo6uDqIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjI0ODkKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdMHl5yDi7ufs7ubt7vHy6CDx7vXw4O3l7ej/IOjn7OXt5e3o6SAo5+Dv6PHoIPTg6evu4ikiCisKKyM6IG1haW4uYzoyNDkwCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0weXnIOLu5+zu5u3u8fLoIOLt5fHl7ej/IOjn7OXt5e3o6SDiIPLl6vHyIgorCisjOiBtYWluLmM6MjQ5MQorbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0wejt4PDt++kg8OXm6OwiCisKKyM6IG1haW4uYzoyNDkzCittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx00OXm6OwgTGlzcCIKKworIzogbWFpbi5jOjI0OTUKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdNDl5ujsIPHu4uzl8fLo7O7x8ugg8SBWaTogJ2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ5NgorbXNnaWQgIi1OXHRcdFx0Tm90IGZ1bGx5IFZpIGNvbXBhdGlibGU6ICdub2NvbXBhdGlibGUnIgorbXNnc3RyICItTlx0XHRcdNDl5ujsIO3l7+7r7e7pIPHu4uzl8fLo7O7x8ugg8SBWaTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyNDk3Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx00/Du4uXt/CDv7uTw7uHt7vHy6CDx7u7h+eXt6OkiCisKKyM6IG1haW4uYzoyNDk4Cittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHTQ5ebo7CDu8uvg5OroIgorCisjOiBtYWluLmM6MjQ5OQorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdFx0weXnIPHi7u8t9ODp6+AsIOjx7+7r/Ofz5fLx/yDy7uv86u4g7+Ds//L8IgorCisjOiBtYWluLmM6MjUwMAorbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdML74uXx8ugg8e/o8e7qIPHi7u8t9ODp6+7iIOgg5+Di5fD46PL8IPDg4e7y8yIKKworIzogbWFpbi5jOjI1MDEKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKPEg6Ozl7eXsIPTg6evgKVx0wu7x8fLg7e7i6PL8IODi4PDo6e3uIOfg4uXw+Ljt7fvpIPHl4O3xIgorCisjOiBtYWluLmM6MjUwMgorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHTS7iDm5Swg9/LuIOggLXIiCisKKyM6IG1haW4uYzoyNTA0Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdM3lIOjx7+7r/Ofu4uDy/CBuZXdjbGkg5Ov/IO7y6vD78uj/IO7q7eAiCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA88/Hy8O7p8fLi7j5cdFx0yPHv7uv85+7i4PL8IOTr/yBJL08g8+rg5+Dt7e7lIDzz8fLw7unx8uLuPiIKKworIzogbWFpbi5jOjI1MDgKK21zZ2lkICItQVx0XHRcdHN0YXJ0IGluIEFyYWJpYyBtb2RlIgorbXNnc3RyICItQVx0XHRcdMfg7/Px6iDiIMDw4OHx6u7sIPDl5ujs5SIKKworIzogbWFpbi5jOjI1MTEKK21zZ2lkICItSFx0XHRcdFN0YXJ0IGluIEhlYnJldyBtb2RlIgorbXNnc3RyICItSFx0XHRcdMfg7/Px6iDiIPDl5ujs5SBcIsji8OjyXCIiCisKKyM6IG1haW4uYzoyNTE0Cittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdMfg7/Px6iDiIPDl5ujs5SBcItTg8PHoXCIiCisKKyM6IG1haW4uYzoyNTE2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPPLl8Ozo7eDrPlx0zeDn7eD36PL8IPPq4Ofg7e376SDy6O8gPPLl8Ozo7eDr4D4iCisKKyM6IG1haW4uYzoyNTE3Cittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx0yPHv7uv85+7i4PL8IDx2aW1yYz4g4uzl8fLuIOv+4fv1IPTg6evu4iAudmltcmMiCisKKyM6IG1haW4uYzoyNTE5Cittc2dpZCAiLVUgPGd2aW1yYz5cdFx0VXNlIDxndmltcmM+IGluc3RlYWQgb2YgYW55IC5ndmltcmMiCittc2dzdHIgIi1VIDxndmltcmM+XHRcdMjx7+7r/Ofu4uDy/CA8Z3ZpbXJjPiDi7OXx8u4g6/7h+/Ug9ODp6+7iIC5ndmltcmMiCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdM3lIOfg4/Dz5uDy/CDx9uXt4PDo6CDs7uTz6+XpIgorCisjOiBtYWluLmM6MjUyMgorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdM7y6vD78vwgTiDu6u7tICjv7iDz7O7r9+Dt6P46IO/uIO7k7e7s8yDt4CDq4Obk++kg9ODp6ykiCisKKyM6IG1haW4uYzoyNTIzCittc2dpZCAiLU9bTl1cdFx0TGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx00u4g5uUsIPfy7iDoIC1vLCDt7iDxIOLl8PLo6uDr/O377CDw4Ofk5evl7ejl7CDu6u7tIgorCisjOiBtYWluLmM6MjUyNAorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdM3g9+Dy/CDw5eTg6vLo8O7i4O3o5SDiIOru7fblIPTg6evgIgorCisjOiBtYWluLmM6MjUyNQorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG51bT5cdFx0zeD34PL8IPDl5ODq8ujw7uLg7ejlIOIg8fLw7urlIPEg7e7s5fDu7CA8bG51bT4iCisKKyM6IG1haW4uYzoyNTI3Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPOru7ODt5OA+XHTC++/u6+3o8vwgPOru7ODt5PM+IO/l8OXkIOfg4/Dz5+ru6SD04Onr4CB2aW1yYyIKKworIzogbWFpbi5jOjI1MjkKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPOru7ODt5OA+XHRcdML77+7r7ejy/CA86u7s4O3k8z4g7+7x6+Ug5+Dj8PPn6ugg7+Xw4u7j7iD04Onr4CIKKworIzogbWFpbi5jOjI1MzAKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDzx5eDt8T5cdFx0z/Du9+jy4PL8IPH25e3g8OjpIDzx5eDt8eA+IO/u8evlIOfg4/Dz5+roIO/l8OLu4+4g9ODp6+AiCisKKyM6IG1haW4uYzoyNTMxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPPH25e3g8OjpPlx0z/Du9+jy4PL8IOru7ODt5PsgzuH79+3u4+4g8OXm6OzgIOjnIPTg6evgIDzx9uXt4PDo/z4iCisKKyM6IG1haW4uYzoyNTMyCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPPH25e3g8OjpPlx0xO7h4OLr//L8IOLx5SDi4uXkuO3t++Ug6u7s4O3k+yDiIPTg6esgPPH25e3g8Oj/PiIKKworIzogbWFpbi5jOjI1MzMKK21zZ2lkICItVyA8c2NyaXB0b3V0Plx0V3JpdGUgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi1XIDzx9uXt4PDo6T5cdMfg7+jx4PL8IOLx5SDi4uXkuO3t++Ug6u7s4O3k+yDiIPTg6esgPPH25e3g8Oj/PiIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdNDl5ODq8ujw7uLg7ejlIOfg+Oj08O7i4O3t+/Ug9ODp6+7iIgorCisjOiBtYWluLmM6MjUzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8/erw4O0+XHTP7uTx7uXk6O3o8vwgdmltIOog8+rg5+Dt7e7s8yDx5fDi5fDzIFgiCisKKyM6IG1haW4uYzoyNTQxCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHTN5SDi++/u6+3/8vwg8e7l5Ojt5e3o5SDxIPHl8OLl8O7sIFgiCisKKyM6IG1haW4uYzoyNTQ0Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPPTg6ev7Plx0z+4g4u7n7O7m7e7x8ugg8OXk4Ory6PDu4uDy/CA89ODp6/s+IO3gIPHl8OLl8OUgVmltIgorCisjOiBtYWluLmM6MjU0NQorbXNnaWQgIi0tcmVtb3RlLXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIi0tcmVtb3RlLXNpbGVudCA89ODp6/s+ICDS7iDm5Swg7e4g4eXnIObg6+7hIO3gIO7y8fPy8fLi6OUg8eXw4uXw4CIKKworIzogbWFpbi5jOjI1NDYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXdhaXQgPPTg6ev7PiAg0u4g5uUsIPfy7iDoIC0tcmVtb3RlLCDt7iDxIO7m6OTg7ejl7CDn4OLl8Pjl7ej/IgorCisjOiBtYWluLmM6MjU0NworbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0LXNpbGVudCA89ODp6/s+ICDS7iDm5Swg7e4g4eXnIObg6+7hIO3gIO7y8fPy8fLi6OUg8eXw4uXw4CIKKworIzogbWFpbi5jOjI1NDgKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDzq7e7v6ug+XHTO8u/w4OLo8vwgPOrt7u/q6D4g7eAg8eXw4uXwIFZpbSDoIOL76fLoIgorCisjOiBtYWluLmM6MjU0OQorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPOL78ODmPlx0wvv36PHr6PL8IDzi+/Dg5j4g7eAg8eXw4uXw5SBWaW0g6CDt4O/l9+Dy4PL8IgorCisjOiBtYWluLmM6MjU1MAorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0z+7q4Ofg8vwg8e/o8e7qIOjsuO0g8eXw4uXw7uIgVmltIOgg5+Di5fD46PL8IPDg4e7y8yIKKworIzogbWFpbi5jOjI1NTEKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIiIKKyItLXNlcnZlcm5hbWUgPOjs/z5cdM7y7/Dg4ujy/CDt4C/x8uDy/CDx5fDi5fDu7CBWaW0g8SDz6uDn4O3t++wgPOjs5e3l7D4iCisKKyM6IG1haW4uYzoyNTU0Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdMjx7+7r/Ofu4uDy/CDi7OXx8u4gLnZpbWluZm8g9ODp6yA8dmltaW5mbz4iCisKKyM6IG1haW4uYzoyNTU2Cittc2dpZCAiLWggIG9yICAtLWhlbHBcdFByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oIOjr6CAtLWhlbHBcdML74uXx8ugg8e/w4OLq8yAo/fLuIPHu7uH55e3o5Skg6CDn4OLl8Pjo8vwg8ODh7vLzIgorCisjOiBtYWluLmM6MjU1NworbXNnaWQgIi0tdmVyc2lvblx0XHRQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0wvvi5fHy6CDo7fTu8Ozg9uj+IO4g4uXw8ejoIFZpbSDoIOfg4uXw+Ojy/CDw4OHu8vMiCisKKyM6IG1haW4uYzoyNTYxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiwPDj8+zl7fL7IOTr/yBndmltICji5fDx6P8gTW90aWYpOlxuIgorCisjOiBtYWluLmM6MjU2NQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChuZVh0YXcgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyLA8OPz7OXt8vsg5Ov/IGd2aW0gKOLl8PHo/yBuZVh0YXcpOlxuIgorCisjOiBtYWluLmM6MjU2NworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyLA8OPz7OXt8vsg5Ov/IGd2aW0gKOLl8PHo/yBBdGhlbmEpOlxuIgorCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4iCittc2dzdHIgIi1kaXNwbGF5IDzk6PHv6+XpPlx0x+Dv8/Hy6PL8IHZpbSDt4CDz6uDn4O3t7uwgPOTo8e/r5eU+IgorCisjOiBtYWluLmM6MjU3MgorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHTH4O/z8fLo8vwgdmltIOIg8eK48O3z8u7sIOLo5OUiCisKKyM6IG1haW4uYzoyNTc0Cittc2dpZCAiLW5hbWUgPG5hbWU+XHRcdFVzZSByZXNvdXJjZSBhcyBpZiB2aW0gd2FzIDxuYW1lPiIKK21zZ3N0ciAiLW5hbWUgPOjs/z5cdFx0yPHv7uv85+7i4PL8IPDl8fPw8Swg6uDqIOXx6+gg4fsgdmltIOH76yA86Ozl7eXsPiIKKworIzogbWFpbi5jOjI1NzUKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgICjN5SDw5eDr6Ofu4uDt7ilcbiIKKworIzogbWFpbi5jOjI1NzcKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIiIKKyItYmFja2dyb3VuZCA89uLl8j5cdMjx7+7r/Ofu4uDy/CDz6uDn4O3t++kgPPbi5fI+IOTr/yD07u3gICjy4Orm5TogLWJnKSIKKworIzogbWFpbi5jOjI1NzgKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIiIKKyItZm9yZWdyb3VuZCA89uLl8j5cdMjx7+7r/Ofu4uDy/CA89uLl8j4g5Ov/IO7h+/ft7uPuIPLl6vHy4CAo8uDq5uU6IC1mZykiCisKKyM6IG1haW4uYzoyNTc5IG1haW4uYzoyNTk5Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8+PDo9PI+XHRcdMjx7+7r/Ofu4uDy/CA8+PDo9PI+IOTr/yDu4fv37e7j7iDy5erx8uAgKPLg6ublOiAtZm4pIgorCisjOiBtYWluLmM6MjU4MAorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDz48Oj08j5cdMjx7+7r/Ofu4uDy/CA8+PDo9PI+IOTr/yDm6PDt7uPuIPLl6vHy4CIKKworIzogbWFpbi5jOjI1ODEKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8+PDo9PI+XHTI8e/u6/zn7uLg8vwgPPjw6PTyPiDk6/8g7eDq6+7t7e7j7iDy5erx8uAiCisKKyM6IG1haW4uYzoyNTgyIG1haW4uYzoyNjAwCittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICIiCisiLWdlb21ldHJ5IDzj5e7s5fLw6P8+XHTI8e/u6/zn7uLg8vwg7eD34Ov87fP+IDzj5e7s5fLw6P4+ICjy4Orm5TogLWdlb20pIgorCisjOiBtYWluLmM6MjU4MworbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDz46PDo7eA+XHTI8e/u6/zn7uLg8vwgPPjo8Ojt8z4g4e7w5P7w4CAo8uDq5uU6IC1idykiCisKKyM6IG1haW4uYzoyNTg0Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICIiCisiLXNjcm9sbGJhcndpZHRoIDz46PDo7eA+IMjx7+7r/Ofu4uDy/CD46PDo7fMg7+7r7vH7IO/w7urw8/Lq6CAo8uDq5uU6IC1zdykiCisKKyM6IG1haW4uYzoyNTg2Cittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPOL78e7y4D5cdMjx7+7r/Ofu4uDy/CA84vvx7vLzPiDs5e3+ICjy4Orm5TogLW1oKSIKKworIzogbWFpbi5jOjI1ODggbWFpbi5jOjI2MDEKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0yPHv7uv85+7i4PL8IOjt4uXw8e376SDi6OTl7vDl5ujsICjy4Orm5TogLXJ2KSIKKworIzogbWFpbi5jOjI1ODkKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0zeUg6PHv7uv85+7i4PL8IOjt4uXw8e376SDi6OTl7vDl5ujsICjy4Orm5TogK3J2KSIKKworIzogbWFpbi5jOjI1OTAKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDzw5fHz8PE+XHTT8fLg7e7i6PL8IPPq4Ofg7e376SA88OXx8/DxPiIKKworIzogbWFpbi5jOjI1OTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIsDw4/Ps5e3y+yDk6/8gZ3ZpbSAo4uXw8ej/IFJJU0MgT1MpOlxuIgorCisjOiBtYWluLmM6MjU5NAorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDz36PHr7j5cdM/l8OLu7eD34Ov87eD/IPjo8Ojt4CDu6u3gIOIg6u7r7u3q4PUiCisKKyM6IG1haW4uYzoyNTk1Cittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDz36PHr7j5cdM/l8OLu7eD34Ov87eD/IOL78e7y4CDu6u3gIOIg8fLw7urg9SIKKworIzogbWFpbi5jOjI1OTgKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIsDw4/Ps5e3y+yDk6/8gZ3ZpbSAo4uXw8ej/IEdUSyspOlxuIgorCisjOiBtYWluLmM6MjYwMgorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIiIKKyItZGlzcGxheSA85Ojx7+vl6T5cdMfg7/Px8ujy/CB2aW0g7eAg8+rg5+Dt7e7sIDzk6PHv6+XlPiAo8uDq5uU6IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNjA0Cittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICIiCisiLS1yb2xlIDzw7uv8Plx00/Hy4O3u4ujy/CDz7ejq4Ov87fP+IDzw7uv8PiDk6/8g6OTl7fLo9Ojq4Pbo6CDj6+Di7e7j7iDu6u3gIgorCisjOiBtYWluLmM6MjYwNgorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdM7y6vD78vwgVmltIOLt8/Lw6CDk8PPj7uPuIOru7O/u7eXt8uAgR1RLIgorCisjOiBtYWluLmM6MjYwOQorbXNnaWQgIi1QIDxwYXJlbnQgdGl0bGU+XHRPcGVuIFZpbSBpbnNpZGUgcGFyZW50IGFwcGxpY2F0aW9uIgorbXNnc3RyICItUCA85+Dj7uvu4u7qIPDu5Ojy5ev/Plx0zvLq8Pvy/CBWaW0g4iDw7uTo8uXr/PHq7uwg7/Do6+7m5e3o6CIKKworIzogbWFpbi5jOjI4NDcKK21zZ2lkICJObyBkaXNwbGF5IgorbXNnc3RyICLN5fIg5Ojx7+vl/yIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI4NjIKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6IM7y7/Dg4urgIO3lIPPk4Ovg8fwuXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjg2OAorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiDO8u/w4OLq4CDt5SDz5ODr4PH8LiDP7u/78urgIOzl8fLt7uPuIOL77+7r7eXt6P9cbiIKKworIzogbWFpbi5jOjI5MDYgbWFpbi5jOjI5MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICLu8vDl5ODq8ujw7uLg7e4gJWQg6OcgJWQiCisKKyM6IG1haW4uYzoyOTQ5Cittc2dpZCAiTm8gZGlzcGxheTogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAizeXyIOTo8e/r5f86IO7y7/Dg4urgIOL78ODm5e3o/yDt5SDz5ODr4PH8LlxuIgorCisjOiBtYWluLmM6Mjk2MQorbXNnaWQgIjogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiOiDO8u/w4OLq4CDi+/Dg5uXt6P8g7eUg8+Tg6+Dx/C5cbiIKKworIzogbWFyay5jOjcwOQorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAizeXyIPPx8uDt7uLr5e3t+/Ug7vLs5fLu6iIKKworIzogbWFyay5jOjcxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6IM3l8iDu8uzl8u7qLCDx7uLv4OTg/vno9SDxIFwiJXNcIiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzIyCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIu7y7OXyIPHy8CAg6u7rIPTg6esv8uXq8fIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjc2MAorbXNnaWQgIiIKKyJcbiIKKyIganVtcCBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisi7/D75u7qIPHy8CAg6u7rIPTg6esv8uXq8fIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjgwNQorbXNnaWQgIiIKKyJcbiIKKyJjaGFuZ2UgbGluZSAgY29sIHRleHQiCittc2dzdHIgIiIKKyJcbiIKKyLo5+zl7S4gIPHy8CAg6u7rIPLl6vHyIgorCisjOiBtYXJrLmM6MTI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDD6+7h4Ov87fvlIO7y7OXy6ug6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTMxNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg0e/o8e7qIO/w++bq7uIgKPHt4Pfg6+Ag4e7r5eUg8eLl5ujlKTpcbiIKKworIzogbWFyay5jOjE0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDI8fLu8Oj/IOzl8fLt+/Ug7vLs5fLu6iAo7vIg4e7r5eUg8eLl5uj1IOog8fLg8PvsKTpcbiIKKworIzogbWFyay5jOjE1MDEKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiz/Du7/P55e3gICc+JyIKKworIzogbWJ5dGUuYzo0NjcKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0MzogzeXk7u/z8fLo7O7lIOjs/yDq7uTo8O7i6ugiCisKKyM6IG1ieXRlLmM6NDQzMQorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiDN5eLu5+zu5u3uIO3g5+3g9+jy/CDn7eD35e3o/yDq7u3y5erx8uAg4uLu5OAiCisKKyM6IG1ieXRlLmM6NDU4MworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogzeXi7ufs7ubt7iDx7ufk4PL8IOru7fLl6vHyIOLi7uTgIgorCisjOiBtYnl0ZS5jOjQ3NDEKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IM3l8+Tg9+3g/yDv7u/78urgIO7y6vD78vwg7OXy7uQg4uLu5OAiCisKKyM6IG1ieXRlLmM6NDc1MgorbXNnaWQgIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIKK21zZ3N0ciAiIgorIkUyODc6IM/w5eTz7/Dl5uTl7ejlOiDt5eLu5+zu5u3uIO3g5+3g9+jy/CDu4fAuIOL75+7iIPPt6Pfy7ubl7ej/IOzl8u7k4CAiCisi4uLu5OAiCisKKyM6IG1ieXRlLmM6NDc1OAorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiDs5fLu5CDi4u7k4CDt5SDv7uTk5fDm6OLg5fIg8fLo6+giCisKKyM6IG1ieXRlLmM6NDgxNQorbXNnaWQgIkUyODk6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgbXkgcHJlZWRpdCB0eXBlIgorbXNnc3RyICIiCisiRTI4OTog7OXy7uQg4uLu5OAg7eUg7+7k5OXw5uji4OXyIOzu6SDy6O8g7/Dl5OLg8Ojy5ev87e7j7iDw5eTg6vLo8O7i4O3o/yIKKworIzogbWJ5dGUuYzo0ODg5Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiDx8ujr/CBcIu3g5CDs5fHy7uxcIiDy8OXh8+XyIPPq4Ofg7ej/IPjw6PTy7uLu4+4g7eDh7vDgIgorCisjOiBtYnl0ZS5jOjQ5MjUKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIiIKKyJFMjkxOiBHVEsrIOHu6+XlIPDg7e3l6SDi5fDx6OgsIPfl7CAxLjIuMy4gzuHr4PHy/CDx7vHy7v/t6P8g7eUg8ODh7vLg5fIuIgorCisjOiBtYnl0ZS5jOjUyMzIKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiDR5fDi5fAg7OXy7uTgIOLi7uTgIO3lIOfg7/P55e0iCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5Mzog4evu6iDt5SDn4OHr7uro8O7i4O0iCisKKyM6IG1lbWZpbGUuYzoxMDA1Cittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogzvjo4ergIO/u6PHq4CDv8Ogg9/Ll7ejoIPHi7u8t9ODp6+AiCisKKyM6IG1lbWZpbGUuYzoxMDEwCittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IM746OHq4CD38uXt6P8g8eLu7y304Onr4CIKKworIzogbWVtZmlsZS5jOjEwNjIKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5Njogzvjo4ergIO/u6PHq4CDv8Ogg5+Dv6PHoIPHi7u8t9ODp6+AiCisKKyM6IG1lbWZpbGUuYzoxMDgwCittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiDO+Ojh6uAg7/DoIOfg7+jx6CDx4u7vLfTg6evgIgorCisjOiBtZW1maWxlLmM6MTI3NworbXNnaWQgIkUzMDA6IFN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAoc3ltbGluayBhdHRhY2s/KSIKK21zZ3N0ciAiIgorIkUzMDA6INHi7u8t9ODp6yDz5uUg8fP55fHy4vPl8iAo4PLg6uAg8SDo8e/u6/zn7uLg7ejl7CDx6Ozi7uv87e7pIPHx++vq6D8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODogzeUg7+7r8/fl7SDh6+7qIO3u7OXwIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogzeUg7+7r8/fl7SDh6+7qIO3u7OXwIDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogzeUg7+7r8/fl7SDh6+7qIO3u7OXwIDI/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiDO6Swg7+7y5fD/6/H/IPHi7u8t9ODp6yEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiDN5eLu5+zu5u3uIO/l8OXo7OXt7uLg8vwg8eLu7y304OnrIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICIiCisiRTMwMzogzeUg8+Tg6+7x/CDu8urw+/L8IPHi7u8t9ODp6yDk6/8gXCIlc1wiLCDi7vHx8uDt7uLr5e3o5SDt5eLu5+zu5u3uIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiDN5SDv7uvz9+XtIOHr7uogMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6INHi7u8t9ODp6yDk6/8gJXMg7eUg7eDp5OXtIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiIgorIsLi5eTo8uUg7e7s5fAg8eLu7y304Onr4Cwg6u7y7vD76SDx6+Xk8+XyIOjx7+7r/Ofu4uDy/CAoMCDk6/8g4vv17uTgKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiDN5SDs7uPzIO7y6vD78vwgJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICLN5eLu5+zu5u3uIO/w7vfo8uDy/CDh6+7qIDAg6OcgIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIs3l8iDo5+zl7eXt6OksIOjr6CBWaW0g7eUg8ezu4yDu4e3u4ujy/CDx4u7vLfTg6esiCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiDt5ev85/8g6PHv7uv85+7i4PL8IOIg5ODt7e7pIOLl8PHo6CBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICLI8e/u6/zn8+ny5SBWaW0g4uXw8ejoIDMuMC5cbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyDt5SD/4uv/5fLx/yDx4u7vLfTg6evu7CBWaW0iCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIO3l6/zn/yDo8e/u6/zn7uLg8vwg7eAg/fLu7CDq7uzv/P7y5fDlLlxuIgorCisjOiBtZW1saW5lLmM6ODcwCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICLU4OnrIOH76yDx7ufk4O0gIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyLr6OHuIPTg6esg4fvrIO/u4vDl5uS47S4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiyPHv7uv85/Pl8vH/IPHi7u8t9ODp6yBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIsjx9e7k7fvpIPTg6esgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTIyCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IM/w5eTz7/Dl5uTl7ejlOiDo8fXu5O376SD04OnrIOzu4yDh+/L8IOjn7OXtuO0iCisKKyM6IG1lbWxpbmUuYzo5NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiDN5eLu5+zu5u3uIO/w7vfo8uDy/CDh6+7qIDEg6OcgJXMiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P87S0dPS0dLC08XSIMzNzsPOINHS0M7KIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/zcXP0MDCyMvczc7FIMfNwNfFzcjFINHXxdLXyMrAINHS0M7KIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz/P09HSzskgwcvOyiIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/O0tHT0tHSwtPe0iDR0tDOysgiCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiDt5e/w4OLo6/zt++kg4evu6iAxIElEICglcyDt5SD/4uv/5fLx/yD04Onr7uwgLnN3cD8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P8/Qzs/T2cXNIMHLzsoiCisKKyM6IG1lbWxpbmUuYzoxMDgxCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/8fLw7uroIOzu4/PyIOH78vwg6PHv7vD35e37IO7y8f7k4CDk7iA/Pz/Kzs3WwCIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIj8/P/Hy8O7q6CDs7uPr6CDh+/L8IOLx8uDi6+Xt+yDo6+gg8+Tg6+Xt+yDu8vH+5OAg5O4gPz8/ys7N1sAiCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz/Kzs3F1iIKKworIzogbWVtbGluZS5jOjExNDMKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogwu7x8fLg7e7i6+Xt6OUg7/Dl8OLg7e4iCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IMLuIOLw5ez/IOLu8fHy4O3u4uvl7ej/IO7h7eDw8+bl7fsg7vjo4eroOyDx7C4g8fLw7uroLCDt4Pfo7eD++ejl8f8gIgorIvEgPz8/IgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgIlNlZSBcIjpoZWxwIEUzMTJcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgItHsLiDk7u/u6+3o8uXr/O3z/iDo7fTu8Ozg9uj+IOIg8e/w4OLu9+3o6uUgKFwiOmhlbHAgRTMxMlwiKSIKKworIzogbWVtbGluZS5jOjExNTUKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIsLu8fHy4O3u4uvl7ejlIOfg4uXw+OXt7i4gz/Du4uXw/PLlLCDi8bgg6+gg4iDv7vD/5OrlLiIKKworIzogbWVtbGluZS5jOjExNTYKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIozO7m5fLlIOfg7+jx4PL8IPTg6esg7+7kIOTw8+Po7CDo7OXt5ewg6CDx8ODi7ejy/CDl4+4g8SDo8fXu5O377FxuIgorCisjOiBtZW1saW5lLmM6MTE1NworbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICL04Onr7uwg7/DoIO/u7O756CDv8O7j8ODs7PsgZGlmZikuXG4iCisKKyM6IG1lbWxpbmUuYzoxMTU4Cittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyLH4PLl7CDz5ODr6PLlIPTg6esgLnN3cC5cbiIKKyJcbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMjE0Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIs7h7eDw8+bl7fsg8eLu7y304Onr+zoiCisKKyM6IG1lbWxpbmUuYzoxMzkyCittc2dpZCAiICAgSW4gY3VycmVudCBkaXJlY3Rvcnk6XG4iCittc2dzdHIgIiAgIMIg8uXq8/nl7CDq4PLg6+7j5TpcbiIKKworIzogbWVtbGluZS5jOjEzOTQKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAg0SDz6uDn4O3t++wg6Ozl7eXsOlxuIgorCisjOiBtZW1saW5lLmM6MTM5OAorbXNnaWQgIiAgIEluIGRpcmVjdG9yeSAiCittc2dzdHIgIiAgIMIg6uDy4Ovu4+UgICAiCisKKyM6IG1lbWxpbmUuYzoxNDE2Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSDt5fIgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODgKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgIOLr4OTl6+X2OiAiCisKKyM6IG1lbWxpbmUuYzoxNDkwCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgIOTg8uA6ICIKKworIzogbWVtbGluZS5jOjE0OTQgbWVtbGluZS5jOjM2ODQKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICDk4PLgOiAiCisKKyM6IG1lbWxpbmUuYzoxNTEwCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgW+7yIFZpbSDi5fDx6OggMy4wXSIKKworIzogbWVtbGluZS5jOjE1MTQKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgIFvt5SD/4uv/5fLx/yDx4u7vLfTg6evu7CBWaW1dIgorCisjOiBtZW1saW5lLmM6MTUxOAorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICDo7P8g9ODp6+A6ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgIOjn7OXtuO06ICIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJZRVMiCittc2dzdHIgIsTAIgorCisjOiBtZW1saW5lLmM6MTUyNQorbXNnaWQgIm5vIgorbXNnc3RyICLt5fIiCisKKyM6IG1lbWxpbmUuYzoxNTI5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAg7+7r/Ofu4uDy5ev8OiAiCisKKyM6IG1lbWxpbmUuYzoxNTM2Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAg6u7s7/z+8uXwOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM4Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAg6u7s7/z+8uXwOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICDv8O725fHxOiAiCisKKyM6IG1lbWxpbmUuYzoxNTUwCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICjl+bgg4vvv7uvt/+Xy8f8pIgorCisjOiBtZW1saW5lLmM6MTU2MgorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW+3lIO/w6OPu5OXtIOTr/yDo8e/u6/zn7uLg7ej/IPEg5ODt7e7pIOLl8PHo5ekgVmltXSIKKworIzogbWVtbGluZS5jOjE1NjUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBb7eUg7/Do4+7k5e0g5Ov/IOjx7+7r/Ofu4uDt6P8g7eAg/fLu7CDq7uzv/P7y5fDlXSIKKworIzogbWVtbGluZS5jOjE1NzAKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICBb7eUg9+jy4OXy8f9dIgorCisjOiBtZW1saW5lLmM6MTU3NAorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW+3lIO7y6vD74uDl8vH/XSIKKworIzogbWVtbGluZS5jOjE3NjQKK21zZ2lkICJFMzEzOiBDYW5ub3QgcHJlc2VydmUsIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMxMzogzeXi7ufs7ubt7iDu4e3u4ujy/CDx4u7vLfTg6essIO/u8eru6/zq8yDu7SDt5SDu4e3g8PPm5e0iCisKKyM6IG1lbWxpbmUuYzoxODE3Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgItHi7u8t9ODp6yDu4e3u4uu47SIKKworIzogbWVtbGluZS5jOjE4MTkKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6IM3l8+Tg9+3g/yDv7u/78urgIO7h7e7i6+Xt6P8g8eLu7y304Onr4CIKKworIzogbWVtbGluZS5jOjE4OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiDt5e/w4OLo6/zt7uUg5+3g9+Xt6OUgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IO3l4u7n7O7m7e4g7eDp8ugg8fLw7urzICVsZCIKKworIzogbWVtbGluZS5jOjIzMDYKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIu3l7/Dg4ujr/O3u5SDn7eD35e3o5SDz6uDn4PLl6/8g4evu6uAgMyIKKworIzogbWVtbGluZS5jOjIzODYKK21zZ2lkICJzdGFja19pZHggc2hvdWxkIGJlIDAiCittc2dzdHIgIuft4Pfl7ejlIHN0YWNrX2lkeCDk7uvm7e4g4fvy/CDw4OLt7iAwIgorCisjOiBtZW1saW5lLmM6MjQ0OAorbXNnaWQgIkUzMTg6IFVwZGF0ZWQgdG9vIG1hbnkgYmxvY2tzPyIKK21zZ3N0ciAiRTMxODogzuHt7uLr5e3uIPHr6Pjq7uwg7O3u4+4g4evu6u7iPyIKKworIzogbWVtbGluZS5jOjI2MzAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IO3l7/Dg4ujr/O3u5SDn7eD35e3o5SDz6uDn4PLl6/8g4evu6uAgNCIKKworIzogbWVtbGluZS5jOjI2NTcKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICLz5ODruO0g4evu6iAxPyIKKworIzogbWVtbGluZS5jOjI4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6INHy8O7q4CAlbGQg7eUg7uHt4PDz5uXt4CIKKworIzogbWVtbGluZS5jOjMxMDAKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiDt5e/w4OLo6/zt7uUg5+3g9+Xt6OUg8+rg5+Dy5ev/IOHr7urgIgorCisjOiBtZW1saW5lLmM6MzExNgorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAi5+3g9+Xt6OUgcGVfbGluZV9jb3VudCDw4OLt7iDt8+v+IgorCisjOiBtZW1saW5lLmM6MzE0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IO3u7OXwIPHy8O7q6CDn4CDv8OXk5evg7Ogg5Ojg7+Dn7u3gOiAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiDt5e/w4OLo6/zt7uUg5+3g9+Xt6OUg8fe48vfo6uAg8fLw7uog4iDh6+7q5SAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTk4Cittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgItDg5+zl8CDx8uXq4CDz4uXr6Pfl7SIKKworIzogbWVtbGluZS5jOjMyNDQKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IO3l7/Dg4ujr/O3u5SDn7eD35e3o5SDz6uDn4PLl6/8g4evu6uAgMiIKKworIzogbWVtbGluZS5jOjM2NzQKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IMLNyMzAzcjFIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIs7h7eDw8+bl7SDx4u7vLfTg6esg8SDo7OXt5ewgXCIiCisKKyM6IG1lbWxpbmUuYzozNjc5Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICLP8Ogg7vLq8Pvy6Ogg9ODp6+A6IFwiIgorCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiAgICAgIE5FV0VSIHRoYW4gc3dhcCBmaWxlIVxuIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgIMHu6+XlINHCxcbIySwg9+XsIPHi7u8t9ODp6yFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY5MgorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSDC7ufs7ubt7iwg8OXk4Ory6PDu4uDt6OUg9ODp6+Ag4vvv7uvt/+Xy8f8g4iDk8PPj7ukg7/Du4/Dg7OzlLlxuIgorIiAgICDF8evoIP3y7iDy4OosIPLuIOHz5Pzy5SDi7ejs4PLl6/zt+yDv8Ogg4u3l8eXt6Ogg6Ofs5e3l7ejpLFxuIgorIiAgICD38u7h+yDzIOLg8SDt5SDv7v/i6Ovu8fwg5OLgIPDg5+379SDi4PDo4O3y4CDu5O3u4+4g6CDy7uPuIOblIPTg6evgLlxuIgorCisjOiBtZW1saW5lLmM6MzY5MworbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICDH4OLl8Pjo8uUg8ODh7vLzIOjr6CDv8O7k7uvm4Ony5SDxIO7x8u7w7ubt7vHy/P4uXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpIM/w5eT75PP56Okg8eXg7fEg8OXk4Ory6PDu4uDt6P8g/fLu4+4g9ODp6+Ag5+Di5fD4uO0g4OLg8Ojp7e4uXG4iCisKKyM6IG1lbWxpbmUuYzozNjk1Cittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgwiD98u7sIPHr8/fg5Swg6PHv7uv85/Pp8uUg6u7s4O3k8yBcIjpyZWNvdmVyXCIg6OvoIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTcKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDk6/8g4u7x8fLg7e7i6+Xt6P8g6Ofs5e3l7ejpICjx7C4gXCI6aGVscCDi7vHx8uDt7uLr5e3o5VwiKS5cbiIKKworIzogbWVtbGluZS5jOjM2OTgKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgxfHr6CDi+yDz5uUg4vvv7uvt/+voIP3y8yDu7+Xw4Pbo/iwg8+Tg6+jy5SDx4u7vLfTg6esgXCIiCisKKyM6IG1lbWxpbmUuYzozNzAwCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIPfy7uH7IOjn4eXm4PL8IO/u/+Lr5e3o/yD98u7j7iDx7u7h+eXt6P8g4iDh8+Tz+eXsLlxuIgorCisjOiBtZW1saW5lLmM6MzcxNCBtZW1saW5lLmM6MzcxOAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAi0eLu7y304OnrIFwiIgorCisjOiBtZW1saW5lLmM6MzcxNSBtZW1saW5lLmM6MzcyMQorbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIg8+blIPHz+eXx8uLz5fIhIgorCisjOiBtZW1saW5lLmM6MzcyNAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gws3IzMDNyMUiCisKKyM6IG1lbWxpbmUuYzozNzI2Cittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAi0eLu7y304OnrIPPm5SDx8/nl8fLi8+XyISIKKworIzogbWVtbGluZS5jOjM3MzAKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydCIKK21zZ3N0ciAiIgorIiZPIM7y6vD78vwg5Ov/IPfy5e3o/1xuIgorIiZFINDl5ODq8ujw7uLg8vxcbiIKKyImUiDC7vHx8uDt7uLo8vxcbiIKKyImUSDC+/Xu5FxuIgorIiZBIM/w5fDi4PL8IgorCisjOiBtZW1saW5lLmM6MzczMgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkFib3J0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIiZPIM7y6vD78vwg5Ov/IPfy5e3o/1xuIgorIiZFINDl5ODq8ujw7uLg8vxcbiIKKyImUiDC7vHx8uDt7uLo8vxcbiIKKyImUSDC+/Xu5FxuIgorIiZBIM/w5fDi4PL8XG4iCisiJkQg0+Tg6+jy/CIKKworIzogbWVtbGluZS5jOjM3ODkKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiDO4e3g8PPm5e3uIPHr6Pjq7uwg7O3u4+4g8eLu7y304Onr7uIiCisKKyM6IG1lbnUuYzo2NAorbXNnaWQgIkUzMjc6IFBhcnQgb2YgbWVudS1pdGVtIHBhdGggaXMgbm90IHN1Yi1tZW51IgorbXNnc3RyICJFMzI3OiDK7uzv7u3l7fIg7/Py6CDqIP3r5ezl7fLzIOzl7f4g7eUg/+Lr/+Xy8f8g7+7k7OXt/iIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IMzl7f4g4iD98u7sIPDl5ujs5SDt5SDx8/nl8fLi8+XyIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogzeXyIOzl7f4g8SDy4Oro7CDo7OXt5ewiCisKKyM6IG1lbnUuYzo1MjUKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiDP8/L8IOog7OXt/iDt5SDk7uvm5e0g4uXx8ugg6iDv7uTs5e3+IgorCisjOiBtZW51LmM6NTY0Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IN3r5ezl7fL7IOzl7f4g7eXr/Of/IOTu4eDi6//y/CDt5e/u8fDl5PHy4uXt7e4g4iDv7uvu8erzIOzl7f4iCisKKyM6IG1lbnUuYzo1NzAKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6INDg5+Tl6+jy5evoIO3lIOzu4/PyIOH78vwg6u7s7+7t5e3y7uwg7/Py6CDqIOzl7f4iCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwOTcKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDM5e3+IC0tLSIKKworIzogbWVudS5jOjIwMTkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIs7y7vDi4PL8IP3y7iDs5e3+IgorCisjOiBtZW51LmM6MjA4NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IM/z8vwg6iDs5e3+IOTu6+bl7SDi5fHy6CDqIP3r5ezl7fLzIOzl7f4iCisKKyM6IG1lbnUuYzoyMTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogzOXt/iDt5SDt4Onk5e3uOiAlcyIKKworIzogbWVudS5jOjIxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogzOXt/iDt5SDu7/Dl5OXr5e3uIOTr/yDw5ebo7OAgJXMiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiDP8/L8IOog7OXt/iDk7uvm5e0g4uXx8ugg6iDv7uTs5e3+IgorCisjOiBtZW51LmM6MjIzMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogzOXt/iDt5SDt4Onk5e3uIC0tIO/w7uLl8Pzy5SDo7OXt4CDs5e3+IgorCisjOiBtZXNzYWdlLmM6NDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICLO4e3g8PPm5e3gIO746OHq4CDv8Ogg7uHw4OHu8urlICVzOiIKKworIzogbWVzc2FnZS5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICLx8vDu6uAgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo2NDcKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW/Hr6Pjq7uwg5Ovo7e3g/yDx8vDu6uBdIgorCisjOiBtZXNzYWdlLmM6Nzk3Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIiIKKyLP5fDl4u7kIPHu7uH55e3o6SDt4CDw8/Hx6ujpIP/n++o6IMLg8ejr6Okg0ODj7ufo7SA8dnJyQHVzZXJzLnNvdXJjZWZvcmdlLiIKKyJuZXQ+IgorCisjOiBtZXNzYWdlLmM6MTAyNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICLP8OXw++Lg7ejlOiAiCisKKyM6IG1lc3NhZ2UuYzoxMDI4Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICLE6/8g7/Du5O7r5uXt6P8g7eDm7Ojy5SBFTlRFUiIKKworIzogbWVzc2FnZS5jOjEwMzAKK21zZ2lkICJIaXQgRU5URVIgb3IgdHlwZSBjb21tYW5kIHRvIGNvbnRpbnVlIgorbXNnc3RyICLE6/8g7/Du5O7r5uXt6P8g7eDm7Ojy5SBFTlRFUiDo6+gg4uLl5Ojy5SDq7uzg7eTzIgorCisjOiBtZXNzYWdlLmM6MjM1MQorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIM/w7uTu6+bl7ejlIPHr5eTz5fIgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMzU0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IPHy8O7q4CwgU1BBQ0UvYjog8fLw4O3o9uAsIGQvdTog7+7r8fLw4O3o9vssIHE6IOL79e7kKSIKKworIzogbWVzc2FnZS5jOjIzNTUKK21zZ2lkICIgKFJFVDogbGluZSwgU1BBQ0U6IHBhZ2UsIGQ6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUOiDx8vDu6uAsIFNQQUNFOiDx8vDg7ej24CwgZDog7+7r8fLw4O3o9vssIHE6IOL79e7kKSIKKworIzogbWVzc2FnZS5jOjI5NzYgbWVzc2FnZS5jOjI5OTEKK21zZ2lkICJRdWVzdGlvbiIKK21zZ3N0ciAiwu7v8O7xIgorCisjOiBtZXNzYWdlLmM6Mjk3OAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJsTgXG4iCisiJs3l8iIKKworIzogbWVzc2FnZS5jOjMwMTEKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIlNhdmUgJkFsbFxuIgorIiZEaXNjYXJkIEFsbFxuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImxOBcbiIKKyImzeXyXG4iCisi0e718ODt6PL8ICbi8eVcbiIKKyImz+7y5fD/8vwg4vHlXG4iCisiziby7OXt4CIKKworIzogbWVzc2FnZS5jOjMwNTIKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICLR7vXw4O3l7ejlIPTg6evgIgorCisjOiBtZXNzYWdlLmM6MzA1NAorbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIs7y6vD78ujlIPTg6evgIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjMxMjUKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiIgorIkUzMzg6IMjn4ujt6PLlLCDt7iDiIOru7fHu6/zt7uwg8OXm6OzlIO3l8iDv8O7i7uTt6OrgIO/uIPTg6evu4u7pIPHo8fLl7OUiCisKKyM6IG1pc2MxLmM6Mjc3MworbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6IM/w5eTz7/Dl5uTl7ejlOiDI5+zl7eXt6OUg9ODp6+Ag8SDv8ODi4OzoIPLu6/zq7iDk6/8g9/Ll7ej/IgorCisjOiBtaXNjMS5jOjMwMjEKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAixO7h4OLr5e3gIO7k7eAg8fLw7urgIgorCisjOiBtaXNjMS5jOjMwMjMKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAi0+Tg6+Xt4CDu5O3gIPHy8O7q4CIKKworIzogbWlzYzEuYzozMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICLE7uHg4uvl7e4g8fLw7uo6ICVsZCIKKworIzogbWlzYzEuYzozMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAi0+Tg6+Xt7iDx8vDu6jogJWxkIgorCisjOiBtaXNjMS5jOjMwMzMKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiICjP8OXw4uDt7ikiCisKKyM6IG1pc2MxLmM6NzU4OAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IPHu9fDg7f/+8vH/IPTg6ev7Li4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo3NTk4Cittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiDD7vLu4u4uXG4iCisKKyM6IG1pc2MyLmM6Njk1IG1pc2MyLmM6NzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIs7YyMHKwDogIgorCisjOiBtaXNjMi5jOjcxNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIlvh4OnyXSDi8eXj7iDi++Tl6y4t7vHi7uEuICVsdS0lbHUsIOjx7+7r/OcuICVsdSwg7ODq8S4g6PHv7uv85y4gJWx1XG4iCisKKyM6IG1pc2MyLmM6NzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlvi++fu4vtdIHJlL21hbGxvYygpIOLx5ePuICVsdSwgZnJlZSgpIOLx5ePuICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc3MgorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6INHy8O7q4CDx8uDt7uLo8vH/IPHr6Pjq7uwg5Ovo7e3u6SIKKworIzogbWlzYzIuYzo4MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IMLt8/Lw5e3t//8g7vjo4ergOiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogzeUg9eLg8uDl8iDv4Oz/8ughICji++Tl6//l8vH/ICVsdSDh4OnyKSIKKworIzogbWlzYzIuYzoyNTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICLC++fu4iDu4e7r7vfq6CDk6/8g6PHv7uvt5e3o/zogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI4MTYKK21zZ2lkICJFNTQ1OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTQ1OiDP8O7v8/nl7e4g5OLu5fLu9+jlIgorCisjOiBtaXNjMi5jOjI4MTggbWlzYzIuYzoyODQ1Cittc2dpZCAiRTU0NjogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFNTQ2OiDN5eTu7/Px8ujs++kg8OXm6OwiCisKKyM6IG1pc2MyLmM6Mjg4NAorbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogzeXk7u/z8fLo7OD/IPTu8OzgIOrz8PHu8OAiCisKKyM6IG1pc2MyLmM6MjkyNAorbXNnaWQgIkU1NDg6IGRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICJFNTQ4OiDy8OXh8+Xy8f8g4uLl8fLoIPbo9PDzIgorCisjOiBtaXNjMi5jOjI5MjkKK21zZ2lkICJFNTQ5OiBJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIkU1NDk6IM3l5O7v8/Hy6Ozu5SDn7eD35e3o5SDv8O725e3y7uIiCisKKyM6IG1pc2MyLmM6MzIzOQorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIsLi5eTo8uUg7+Dw7uv8IOTr/yD46PTw7uLg7ej/OiAiCisKKyM6IG1pc2MyLmM6MzI0MAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIiAgICAgICAgz+7i8u7w6PLlIOLi7uQg7+Dw7uv/OiIKKworIzogbWlzYzIuYzozMjUwCittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIsLi5eS47e375SDv4PDu6+gg7eUg8e7i7+Dk4P7yISIKKworIzogbWlzYzIuYzozNzk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICIiCisiRTM0MzogzeXv8ODi6Ov87e4g5+Dk4O0g7/Py/DogJyoqW/fo8evuXScg5O7r5u3uIOH78vwg6+jh7iDiIOru7fblIO/z8ugsICIKKyLr6OHuIOfgIO3o7CDk7uvm7e4g8evl5O7i4PL8ICclcyciCisKKyM6IG1pc2MyLmM6NTA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ0OiDK4PLg6+7jIFwiJXNcIiDt5SDt4Onk5e0g4iDv8/LoIOTr/yDx7OXt+yDq4PLg6+7j4CIKKworIzogbWlzYzIuYzo1MDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTog1ODp6yBcIiVzXCIg4iDo5+Ll8fLt+/Ug6uDy4Ovu4+D1IO3lIO3g6eTl7SIKKworIzogbWlzYzIuYzo1MDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IMIg7/Py6CDx7OXt+yDq4PLg6+7j4CDh7uv8+OUg7eXyIOrg8uDr7uPu4iBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NTA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IMIg6Ofi5fHy7fv1IOrg8uDr7uPg9SDh7uv8+OUg7eXyIPTg6evu4iBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NTMyNAorbXNnaWQgIkU1NTA6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NTA6IM/w7u/z+eXt7iDk4u7l8u736OUiCisKKyM6IG1pc2MyLmM6NTMzNgorbXNnaWQgIkU1NTE6IElsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJFNTUxOiDN5eTu7/Px8ujs++kg6u7s7+7t5e3yIgorCisjOiBtaXNjMi5jOjUzNDQKK21zZ2lkICJFNTUyOiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU1Mjog0vDl4fPl8vH/IPPq4Ofg8vwg9uj08PMiCisKKyMuIEdldCBoZXJlIHdoZW4gdGhlIHNlcnZlciBjYW4ndCBiZSBmb3VuZC4KKyM6IG5ldGJlYW5zLmM6Mzk2Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMgIzIiCittc2dzdHIgIs3l4u7n7O7m7e4g8e7l5Ojt6PL88f8g8SBOZXRiZWFucyAjMiIKKworIzogbmV0YmVhbnMuYzo0MDQKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIKK21zZ3N0ciAizeXi7ufs7ubt7iDx7uXk6O3o8vzx/yDxIE5ldEJlYW5zIgorCisjOiBuZXRiZWFucy5jOjQ1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjY4OiBXcm9uZyBhY2Nlc3MgbW9kZSBmb3IgTmV0QmVhbnMgY29ubmVjdGlvbiBpbmZvIGZpbGU6IFwiJXNcIiIKK21zZ3N0ciAiIgorIkU2Njg6IM3l7/Dg4ujr/O376SDw5ebo7CDk7vHy8+/gIOog6O307vDs4Pbo6CDuIPHu5eTo7eXt6Ogg8SBOZXRCZWFuczogXCIlc1wiIgorCisjOiBuZXRiZWFucy5jOjc0OQorbXNnaWQgInJlYWQgZnJvbSBOZXRiZWFucyBzb2NrZXQiCittc2dzdHIgIvfy5e3o5SDo5yDj7eXn5OAgTmV0QmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6MTY0MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjU4OiBOZXRCZWFucyBjb25uZWN0aW9uIGxvc3QgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU2NTg6IM/u8uXw/+3uIPHu5eTo7eXt6OUg8SBOZXRCZWFucyDk6/8g4fP05fDgICVsZCIKKworIzogbm9ybWFsLmM6Mjk4MAorbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgIs/w5eTz7/Dl5uTl7ejlOiDy5fDs6O3g6yDt5SDs7ubl8iDi++/u6+3/8vwg7+7k8eLl8urzIgorCisjOiBub3JtYWwuYzozMjc2Cittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogzeXyIPHy8O7q6CDiIO/u5+j26Ogg6vPw8e7w4CIKKworIzogbm9ybWFsLmM6MzI3OAorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiDN5fIg6Ozl7egg4iDv7ufo9ujoIOrz8PHu8OAiCisKKyM6IG5vcm1hbC5jOjQ1MTkKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiIgorIkUzNTI6IM3l4u7n7O7m7e4g8fLl8OXy/CDx6uvg5OroIPEg8uXq8/no7CDn7eD35e3o5ewg7u/26OggJ2ZvbGRtZXRob2QnIgorCisjOiBub3JtYWwuYzo2NzQwCittc2dpZCAiRTY2NDogY2hhbmdlbGlzdCBpcyBlbXB0eSIKK21zZ3N0ciAiRTY2NDog8e/o8e7qIOjn7OXt5e3o6SDv8/Hy7ukiCisKKyM6IG5vcm1hbC5jOjY3NDIKK21zZ2lkICJFNjYyOiBBdCBzdGFydCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYyOiDCIO3g9+Dr5SDx7+jx6uAg6Ofs5e3l7ejpIgorCisjOiBub3JtYWwuYzo2NzQ0Cittc2dpZCAiRTY2MzogQXQgZW5kIG9mIGNoYW5nZWxpc3QiCittc2dzdHIgIkU2NjI6IMIg6u7t9uUg8e/o8ergIOjn7OXt5e3o6SIKKworIzogbm9ybWFsLmM6ODAwNQorbXNnaWQgIlR5cGUgIDpxdWl0PEVudGVyPiAgdG8gZXhpdCBWaW0iCittc2dzdHIgIsLi5eTo8uUgOnF1aXQ8RW50ZXI+ICDk6/8g4vv17uTgIOjnIFZpbSIKKworIzogb3BzLmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiyOfs5e3l7fsg7vLx8vPv+yDiIDEg8fLw7urlICglcyAxIPDg5ykiCisKKyM6IG9wcy5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiyOfs5e3l7fsg7vLx8vPv+yDiIDEg8fLw7urlICglcyAlZCDw4OcpIgorCisjOiBvcHMuYzozMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICLI5+zl7eXt+yDu8vHy8+/7LCAlbGQg8fLw7uogKCVzIDEg8ODnKSIKKworIzogb3BzLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICLI5+zl7eXt+yDu8vHy8+/7LCAlbGQg8fLw7uogKCVzICVkIPDg5ykiCisKKyM6IG9wcy5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiyOfs5e3//vLx/yDu8vHy8+/7IPHy8O7q4PUgKCVsZCkuLi4iCisKKyM6IG9wcy5jOjcxMgorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIsjn7OXtuO0g7vLx8vPvIOIg7uTt7ukg8fLw7urlICIKKworIzogb3BzLmM6NzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIsjn7OXt5e37IO7y8fLz7/sg4iDx8vDu6uD1ICglbGQpICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NzUKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAi8eru7+jw7uLg8vwg7eUg8+Tg6+7x/Cwg8+Tg6+Xt6OUg4vvv7uvt5e3uIgorCisjOiBvcHMuYzoyMjYxCittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIujn7OXt5e3gIDEg8fLw7urgIgorCisjOiBvcHMuYzoyMjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICLo5+zl7eXt7iDx8vDu6jogJWxkIgorCisjOiBvcHMuYzoyNjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICLu9+j55e3uIPHy8O7qOiAlbGQiCisKKyM6IG9wcy5jOjI5MjgKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICLx6u7v6PDu4uDt4CDu5O3gIPHy8O7q4CIKKworIzogb3BzLmM6MjkzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICLx6u7v6PDu4uDt7iDx8vDu6jogJWxkIgorCisjOiBvcHMuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IMIg8OXj6PHy8OUgJXMg7ej35ePuIO3l8iIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNzY2Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tINDl4+jx8vD7IC0tLSIKKworIzogb3BzLmM6NTA3NQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAizeXk7u/z8fLo7O7lIOjs/yDw5ePo8fLw4CIKKworIzogb3BzLmM6NTE2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjINDl4+jx8vD7OlxuIgorCisjOiBvcHMuYzo1MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDogzeXo5+Ll8fLt++kg8ujvIPDl4+jx8vDgICVkIgorCisjOiBvcHMuYzo1Njk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogzeXk7u/z8fLo7O7lIOjs/yDw5ePo8fLw4DogJyVzJyIKKworIzogb3BzLmM6NjA1OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICLK7uvu7e7qOiAlbGQ7ICIKKworIzogb3BzLmM6NjA2NQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIsL75OXr5e3uICVzJWxkIOjnICVsZCDx8vDu6jsgJWxkIOjnICVsZCDx6+7iOyAlbGQg6OcgJWxkIOHg6fIiCisKKyM6IG9wcy5jOjYwODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICLK7usuICVzIOjnICVzOyAg8fLwLiAlbGQg6OcgJWxkOyDx6+7i7iAlbGQg6OcgJWxkOyDh4OnyICVsZCDo5yAlbGQiCisKKyM6IG9wcy5jOjYwOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIPEg8/e48u7sIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE2NDMKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPdHy8C4gJU4iCisKKyM6IG9wdGlvbi5jOjIwOTIKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIsHr4OPu5ODw6Owg5+Ag6PHv7uv85+7i4O3o5SBWaW0iCisKKyM6IG9wdGlvbi5jOjM0MTkgb3B0aW9uLmM6MzUzNQorbXNnaWQgIkU1MTg6IFVua25vd24gb3B0aW9uIgorbXNnc3RyICJFNTE4OiDN5ejn4uXx8u3g/yDu7/bo/yIKKworIzogb3B0aW9uLmM6MzQzMgorbXNnaWQgIkU1MTk6IE9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFNTE5OiDO7/bo/yDt5SDv7uTk5fDm6OLg5fLx/yIKKworIzogb3B0aW9uLmM6MzQ1NworbXNnaWQgIkU1MjA6IE5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIkU1MjA6IM3lIOTu7/Px6uDl8vH/IOIg8OXm6Ozt7ukg8fLw7urlIgorCisjOiBvcHRpb24uYzozNTIyCittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdMIg7+7x6+Xk7ejpIPDg5yDu7/bo/yDo5+zl7eXt4CDiICIKKworIzogb3B0aW9uLmM6MzY2MQorbXNnaWQgIkU1MjE6IE51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICJFNTIxOiDP7vHr5SA9IPLw5eHz5fLx/yDz6uDn4PL8IPfo8evuIgorCisjOiBvcHRpb24uYzozOTg5IG9wdGlvbi5jOjQ2MTkKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogzeUg7uHt4PDz5uXt7iDiIHRlcm1jYXAiCisKKyM6IG9wdGlvbi5jOjQwNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOTogSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiRTUzOTogzeXk7u/z8fLo7PvpIPHo7OLu6yA8JXM+IgorCisjOiBvcHRpb24uYzo0NjExCittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiDH7eD35e3o5SDu7/bo6CAndGVybScg7eUg7O7m5fIg4fvy/CDv8/Hy7ukg8fLw7uru6SIKKworIzogb3B0aW9uLmM6NDYxNAorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IMIg4/Dg9Oj35fHq7uwg6O3y5fD05enx5SDo5+zl7f/y/CDy5fDs6O3g6yDt5eLu5+zu5u3uIgorCisjOiBvcHRpb24uYzo0NjE2Cittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IMTr/yDn4O/z8ergIOPw4PTo9+Xx6u7j7iDo7fLl8PTl6fHgIOjx7+7r/Ofz6fLlIFwiOmd1aVwiIgorCisjOiBvcHRpb24uYzo0NjQ1Cittc2dpZCAiRTU4OTogJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiRTU4OTog5+3g9+Xt6P8g7u/26OkgJ2JhY2t1cGV4dCcg6CAncGF0Y2htb2RlJyDw4OLt+yIKKworIzogb3B0aW9uLmM6NDg2MAorbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiDN5SDs7ubl8iDh+/L8IOjn7OXt5e3uIOIg4/Dg9Oj35fHq7uwg6O3y5fD05enx5SBHVEsrIDIiCisKKyM6IG9wdGlvbi5jOjUwMTYKK21zZ2lkICJFNTI0OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTI0OiDP8O7v8/nl7e4g5OLu5fLu9+jlIgorCisjOiBvcHRpb24uYzo1MDE4Cittc2dpZCAiRTUyNTogWmVybyBsZW5ndGggc3RyaW5nIgorbXNnc3RyICJFNTI1OiDR8vDu6uAg8SDt8+vl4u7pIOTr6O3u6SIKKworIzogb3B0aW9uLmM6NTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiDP8O7v8/nl7e4g9+jx6+4g7+7x6+UgPCVzPiIKKworIzogb3B0aW9uLmM6NTEwMAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IM/w7u/z+eXt4CDn4O//8uD/IgorCisjOiBvcHRpb24uYzo1MTA3Cittc2dpZCAiRTUyODogTXVzdCBzcGVjaWZ5IGEgJyB2YWx1ZSIKK21zZ3N0ciAiRTUyODogzeXu4fXu5Ojs7iDz6uDn4PL8IOft4Pfl7ejlIOTr/yAnIgorCisjOiBvcHRpb24uYzo1MTQ4Cittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IPHu5OXw5ujyIO3l7+X34PLt++kg8ejs4u7rIOjr6CDx6Ozi7usg5OLu6e3u6SD46PDo7fsiCisKKyM6IG9wdGlvbi5jOjUxOTcKK21zZ2lkICJFNTk2OiBJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIkU1OTY6IM3l7/Dg4ujr/O375SD48Oj08vsiCisKKyM6IG9wdGlvbi5jOjUyMDUKK21zZ2lkICJFNTk3OiBjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAiRTU5Nzog7eXi7ufs7ubt7iDi++Hw4PL8IPjw6PTy7uLu6SDt4OHu8CIKKworIzogb3B0aW9uLmM6NTIwNworbXNnaWQgIkU1OTg6IEludmFsaWQgZm9udHNldCIKK21zZ3N0ciAiRTU5ODogzeXv8ODi6Ov87fvpIPjw6PTy7uLu6SDt4OHu8CIKKworIzogb3B0aW9uLmM6NTIxNAorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IO3l4u7n7O7m7e4g4vvh8ODy/CD48Oj08iDxIPHo7OLu6+Ds6CDk4u7p7e7pIPjo8Ojt+yIKKworIzogb3B0aW9uLmM6NTIxNgorbXNnaWQgIkU1MzQ6IEludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJFNTM0OiDN5e/w4OLo6/zt++kg+PDo9PIg8SDx6Ozi7uvg7Ogg5OLu6e3u6SD46PDo7fsiCisKKyM6IG9wdGlvbi5jOjU0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogzeXv8ODi6Ov87fvpIPHo7OLu6yDv7vHr5SA8JWM+IgorCisjOiBvcHRpb24uYzo1NTk3Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IPLw5eHz5fLx/yDn4O//8uD/IgorCisjOiBvcHRpb24uYzo1NjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIiIKKyJFNTM3OiDH7eD35e3o5SDu7/bo/yAnY29tbWVudHN0cmluZycg5O7r5u3uIOH78vwg7/Px8u7pIPHy8O7q7ukg6OvoICIKKyLx7uTl8Obg8vwgJXMiCisKKyM6IG9wdGlvbi5jOjU2NzkKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiDM+/j8IO3lIO/u5OTl8Obo4uDl8vH/IgorCisjOiBvcHRpb24uYzo1OTQ3Cittc2dpZCAiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiRTU0MDogzeXn4Orw+/Lg/yDv7vHr5eTu4uDy5ev87e7x8vwg4vvw4Obl7ej/IgorCisjOiBvcHRpb24uYzo1OTUxCittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6IPHr6Pjq7uwg7O3u4+4g/evl7OXt8u7iIgorCisjOiBvcHRpb24uYzo1OTUzCittc2dpZCAiRTU0MjogdW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIkU1NDI6IO3l8eHg6+Dt8ejw7uLg7e375SDj8PPv7/siCisKKyM6IG9wdGlvbi5jOjYxOTMKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiDO6u3uIO/w5eTv8O7x7O7y8OAg8+blIOXx8vwiCisKKyM6IG9wdGlvbi5jOjY0NTAKK21zZ2lkICJXMTc6IEFyYWJpYyByZXF1aXJlcyBVVEYtOCwgZG8gJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorbXNnc3RyICIiCisiVzE3OiDA8ODh8ero6SDy8OXh8+XyIOjx7+7r/Ofu4uDt6P8gVVRGLTgsIOLi5eTo8uUgJzpzZXQgZW5jb2Rpbmc9dXRmLTgnIgorCisjOiBvcHRpb24uYzo2NzgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IM3z5u3uIPXu8v8g4fsgJWQg8fLw7uoiCisKKyM6IG9wdGlvbi5jOjY3OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5NDogTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICJFNTk0OiDN8+bt7iD17vL/IOH7ICVkIOru6+7t7uoiCisKKyM6IG9wdGlvbi5jOjcxMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiDN5ejn4uXx8u3g/yDu7/bo/zogJXMiCisKKyM6IG9wdGlvbi5jOjcyMjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDS5fDs6O3g6/zt++Ug6u7k+yAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjIKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDD6+7h4Ov87fvlIOft4Pfl7ej/IO7v9ujpIC0tLSIKKworIzogb3B0aW9uLmM6NzIyNAorbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gzOXx8u375SDn7eD35e3o/yDu7/bo6SAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjYKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIM7v9ujoIC0tLSIKKworIzogb3B0aW9uLmM6NzkzMgorbXNnaWQgIkUzNTY6IGdldF92YXJwIEVSUk9SIgorbXNnc3RyICJFMzU2OiDO2MjBysAgZ2V0X3ZhcnAiCisKKyM6IG9wdGlvbi5jOjg5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogzeXyIPHu7vLi5fLx8uLz/vnl4+4g8ejs4u7r4CDk6/8gJXMiCisKKyM6IG9wdGlvbi5jOjg5MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogy+j47ejlIPHo7OLu6/sg7+7x6+Ug8u736ugg8SDn4O//8u7pOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyODAKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIu3l4u7n7O7m7e4g7vLq8Pvy/CAiCisKKyM6IG9zX2FtaWdhLmM6MzE0Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiDN5eLu5+zu5u3uIO7y6vD78vwg7urt7iFcbiIKKworIzogb3NfYW1pZ2EuYzozMzgKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICLN5e7h9e7k6OzgIEFtaWdhZG9zIOLl8PHo6CAyLjA0IOjr6CDh7uvl5SDv7ufk7eXpXG4iCisKKyM6IG9zX2FtaWdhLmM6MzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgJXMgdmVyc2lvbiAlbGRcbiIKK21zZ3N0ciAizeXu4fXu5Ojs4CAlcyDi5fDx6OggJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDE2Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICLN5eLu5+zu5u3uIO7y6vD78vwgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQyNworbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICLN5eLu5+zu5u3uIPHu5+Tg8vwgIgorCisjOiBvc19hbWlnYS5jOjkwNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIs/w5erw4Pnl7ejlIPDg4e7y+yBWaW0g8SDq7uTu7CAlZFxuIgorCisjOiBvc19hbWlnYS5jOjkzNworbXNnaWQgImNhbm5vdCBjaGFuZ2UgY29uc29sZSBtb2RlID8hXG4iCittc2dzdHIgIu3l4u7n7O7m7e4g8ezl7ejy/CDw5ebo7CDq7u3x7uvoPyFcbiIKKworIzogb3NfYW1pZ2EuYzoxMDAzCittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTog7eUg4iDq7u3x7uvoPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE1MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiDN5eLu5+zu5u3uIOL77+7r7ejy/CDu4e7r7vfq8yDxIODw4/Ps5e3y7uwgLWYiCisKKyM6IG9zX2FtaWdhLmM6MTE5MyBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIs3l4u7n7O7m7e4g4vvv7uvt6PL8ICIKKworIzogb3NfYW1pZ2EuYzoxMTk2IG9zX2FtaWdhLmM6MTI5MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAi7uHu6+736uAgIgorCisjOiBvc19hbWlnYS5jOjEyMTYgb3NfYW1pZ2EuYzoxMzE4Cittc2dpZCAiIHJldHVybmVkXG4iCittc2dzdHIgIiDn4OLl8Pjo6+Ag8ODh7vLzXG4iCisKKyM6IG9zX2FtaWdhLmM6MTQ1OQorbXNnaWQgIkFOQ0hPUl9CVUZfU0laRSB0b28gc21hbGwuIgorbXNnc3RyICLx6+j46u7sIOzg6+D/IOLl6+j36O3gIEFOQ0hPUl9CVUZfU0laRS4iCisKKyM6IG9zX2FtaWdhLmM6MTQ2MworbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAiztjIwcrAIMLCzsTAL8Lbws7EwCIKKworIzogb3NfbXN3aW4uYzo1MzkKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiLi4uKO7h8OXn4O3uKSIKKworIzogb3NfbXN3aW4uYzo2NDEKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAix+3g9+Xt6OUg7u/26OggJ2NvbHVtbnMnIO3lIPDg4u3uIDgwLCDi7eX47ejlIO/w7uPw4Ozs+yDt5SDi++/u6+3//vLx/yIKKworIzogb3NfbXN3aW4uYzoxOTczCittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMzI3OiDN5fPk4Pft7uUg5+Di5fD45e3o5SDi++Hu8OAg7/Do7fLl8OAiCisKKyM6IG9zX21zd2luLmM6MjAxMworIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAi4iAlcyDt4CAlcyIKKworIzogb3NfbXN3aW4uYzoyMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTM6IFVua25vd24gcHJpbnRlciBmb250OiAlcyIKK21zZ3N0ciAiRTYxMzogzeXo5+Ll8fLt++kg+PDo9PIg7/Do7fLl8OA6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwNzcgb3NfbXN3aW4uYzoyMDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogzvjo4ergIO/l9+Dy6DogJXMiCisKKyM6IG9zX21zd2luLmM6MjA4OAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIs3l6Ofi5fHy7e4iCisKKyM6IG9zX21zd2luLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICLP5ffg8vwgJyVzJyIKKworIzogb3NfbXN3aW4uYzozMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiDN5eTu7/Px8ujs7uUg6Oz/IOru5Ojw7uLq6CBcIiVzXCIg4iDo7OXt6CD48Oj08uAgXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjMyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogzeXk7u/z8fLo7PvpIPHo7OLu6yAnJWMnIOIg6Ozl7egg+PDo9PLgIFwiJXNcIiIKKworIzogb3NfcmlzY29zLmM6MTI1OQorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IM3l5O7v8/Hy6Ozu5SDn7eD35e3o5SDu7/bo6CAnb3NmaWxldHlwZScgLS0g6PHv7uv85/Pl8vH/IFRleHQiCisKKyM6IG9zX3VuaXguYzo5MjcKK21zZ2lkICJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIKK21zZ3N0ciAiVmltOiDE4u7p7e7pIPHo4+3g6ywg5+Di5fD45e3o5SDw4OHu8vtcbiIKKworIzogb3NfdW5peC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogz+7r8/fl7SDz4ejp8fLi5e3t++kg8ejj7eDrICVzXG4iCisKKyM6IG9zX3VuaXguYzo5MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IM/u6/P35e0g8+Ho6fHy4uXt7fvpIPHo4+3g61xuIgorCisjOiBvc191bml4LmM6MTE5OQorIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAizvLq8Pvy6OUg5Ojx7+vl/yBYIOfg7f/r7iAlbGQgbXNlYyIKKworIzogb3NfdW5peC5jOjEyMjYKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiDO+Ojh6uAgWFxuIgorCisjOiBvc191bml4LmM6MTMzNAorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIs/w7uLl8OrgIOTo8e/r5f8gWCDn4OLl8Pjl7eAg7eXz5OD37e4iCisKKyM6IG9zX3VuaXguYzoxNDczCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAizvLq8Pvy6OUg5Ojx7+vl/yBYIO3lIOL77+7r7eXt7iDiIO7y4uXkuO3t7uUg4vDl7P8iCisKKyM6IG9zX3VuaXguYzozMjI3IG9zX3VuaXguYzozOTA3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIs3l4u7n7O7m7e4g5+Dv8/Hy6PL8IO7h7uvu9+rzICIKKworIzogb3NfdW5peC5jOjMyNzUKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIs3l4u7n7O7m7e4g5+Dv8/Hy6PL8IO7h7uvu9+rzIHNoXG4iCisKKyM6IG9zX3VuaXguYzozMjc5IG9zX3VuaXguYzozOTEzCittc2dpZCAiIgorIlxuIgorInNoZWxsIHJldHVybmVkICIKK21zZ3N0ciAiIgorIlxuIgorIs7h7uvu9+rgIOfg4uXw+Ojr4CDw4OHu8vMgIgorCisjOiBvc191bml4LmM6MzQxNAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyLN5eLu5+zu5u3uIPHu5+Tg8vwg8vDz4ftcbiIKKworIzogb3NfdW5peC5jOjM0MjkKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIs3l4u7n7O7m7e4g4vvv7uvt6PL8IGZvcmsoKVxuIgorCisjOiBvc191bml4LmM6MzkyMAorbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIsL77+7r7eXt6OUg6u7s4O3k+yDv8OXw4uDt7lxuIgorCisjOiBvc191bml4LmM6NDE4NCBvc191bml4LmM6NDMwOSBvc191bml4LmM6NTk3NQorbXNnaWQgIlhTTVAgbG9zdCBJQ0UgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCDz8uXw/+3uIPHu5eTo7eXt6OUgSUNFIgorCisjOiBvc191bml4LmM6NTU1OAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIs3l8+Tg9+3u5SDu8urw+/Lo5SDk6PHv6+X/IFgiCisKKyM6IG9zX3VuaXguYzo1ODgwCittc2dpZCAiWFNNUCBoYW5kbGluZyBzYXZlLXlvdXJzZWxmIHJlcXVlc3QiCittc2dzdHIgIlhTTVAg7uHw4OHg8vvi4OXyIOfg7/Du8SDx4Ozu8e718ODt5e3o/yIKKworIzogb3NfdW5peC5jOjU5OTkKK21zZ2lkICJYU01QIG9wZW5pbmcgY29ubmVjdGlvbiIKK21zZ3N0ciAiWFNNUCDu8urw++Lg5fIg8e7l5Ojt5e3o5SIKKworIzogb3NfdW5peC5jOjYwMTgKK21zZ2lkICJYU01QIElDRSBjb25uZWN0aW9uIHdhdGNoIGZhaWxlZCIKK21zZ3N0ciAiWFNNUCDv7vLl8P/t7iDx6+Xm5e3o5SDn4CDx7uXk6O3l7ejl7CBJQ0UiCisKKyM6IG9zX3VuaXguYzo2MDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb24gZmFpbGVkOiAlcyIKK21zZ3N0ciAiWFNNUCDt5fPk4Pft7iDi++/u6+3l7e4gU21jT3BlbkNvbm5lY3Rpb246ICVzIgorCisjOiBvc192bXNfbW1zLmM6NTkKK21zZ2lkICJBdCBsaW5lIgorbXNnc3RyICLCIPHy8O7q5SIKKworIzogb3NfdzMyZXhlLmM6NjUKK21zZ2lkICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIGxpbmUuIgorbXNnc3RyICLN5eLu5+zu5u3uIOL75OXr6PL8IO/g7P/y/CDk6/8g6u7s4O3k7e7pIPHy8O7q6C4iCisKKyM6IG9zX3czMmV4ZS5jOjY2IG9zX3czMmV4ZS5jOjg5IG9zX3czMmV4ZS5jOjEwMAorbXNnaWQgIlZJTSBFcnJvciIKK21zZ3N0ciAizvjo4ergIFZJTSIKKworIzogb3NfdzMyZXhlLmM6ODkKK21zZ2lkICJDb3VsZCBub3QgbG9hZCB2aW0zMi5kbGwhIgorbXNnc3RyICLN5eLu5+zu5u3uIOfg4/Dz5+jy/CB2aW0zMi5kbGwhIgorCisjOiBvc193MzJleGUuYzo5OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIs3l4u7n7O7m7e4g6PHv8ODi6PL8IPPq4Ofg8uXr6CD08+3q9ujpIOTr/yBETEwhIgorCisjOiBvc193aW4xNi5jOjM0MiBvc193aW4zMi5jOjMyMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgIufg4uXw+OXt6OUg8ODh7vL7IO7h7uvu9+roIPEg6u7k7uwgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjY3NAorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IM/l8OX14uD35e3uIPHu4fvy6OUgJXNcbiIKKworIzogb3Nfd2luMzIuYzoyNjc2Cittc2dpZCAiY2xvc2UiCittc2dzdHIgIufg6vD78ujlIgorCisjOiBvc193aW4zMi5jOjI2NzgKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIu7y6uv+9+Xt6OUiCisKKyM6IG9zX3dpbjMyLmM6MjY3OQorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICLn4OLl8Pjl7ejlIgorCisjOiBvc193aW4zMi5jOjMxNjkKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogyu7s4O3k4CDt5SDt4Onk5e3gIgorCisjOiBvc193aW4zMi5jOjMxODIKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyJWSU1SVU4uRVhFIO3lIO3g6eTl7SDiIO/z8ugsIOfg5ODt7e7sIOIgJFBBVEguXG4iCisiwu3l+O3o5SDq7uzg7eT7IO3lIOHz5PPyIO7x8uDt4OLr6OLg8vzx/yDv7vHr5SDi++/u6+3l7ej/LlxuIgorIsTu7+7r7ejy5ev87eD/IOjt9O7w7OD26P8g4iA6aGVscCB3aW4zMi12aW1ydW4iCisKKyM6IG9zX3dpbjMyLmM6MzE4NQorbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICLP8OXk8+/w5ebk5e3o5SBWaW0iCisKKyM6IHF1aWNrZml4LmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogwiDx8vDu6uUg9O7w7ODy4CDx6+j46u7sIOzt7uPuICUlJWMiCisKKyM6IHF1aWNrZml4LmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiDN5e7m6OTg7e376SD96+Xs5e3yICUlJWMg4iDx8vDu6uUg9O7w7ODy4CIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogwiDx8vDu6uUg9O7w7ODy4CDv8O7v8/nl7eAgXSIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjIO3lIO/u5OTl8Obo4uDl8vH/IOIg8fLw7urlIPTu8Ozg8uAiCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogzeXk7u/z8fLo7PvpICUlJWMg4iDv8Ojx8uDi6uUg4iDx8vDu6uUg9O7w7ODy4CIKKworIzogcXVpY2tmaXguYzozNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IM3l5O7v8/Hy6Oz76SAlJSVjIOIg8fLw7urlIPTu8Ozg8uAiCisKKyM6IHF1aWNrZml4LmM6MzkxCittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiDCIOft4Pfl7ejoIO7v9ujoICdlcnJvcmZvcm1hdCcg7vLx8/Lx8uLz5fIg+ODh6+7tIgorCisjOiBxdWlja2ZpeC5jOjUwMQorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6IOjs/yDq4PLg6+7j4CDt5SDn4OTg7e4g6OvoIPDg4u3uIO/z8fLu6SDx8vDu6uUiCisKKyM6IHF1aWNrZml4LmM6OTkwCittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1Mzogwe7r/PjlIO3l8iD96+Xs5e3y7uIiCisKKyM6IHF1aWNrZml4LmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQg6OcgJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjEyMzEKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAo8fLw7urgIPPk4Ovl7eApIgorCisjOiBxdWlja2ZpeC5jOjE0NDQKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IMLt6OfzIPHy5ergIOH78fLw+/Ug6PHv8ODi6+Xt6OkiCisKKyM6IHF1aWNrZml4LmM6MTQ1MworbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogzeDi5fD18yDx8uXq4CDh+/Hy8Pv1IOjx7/Dg4uvl7ejpIgorCisjOiBxdWlja2ZpeC5jOjE0NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICLx7+jx7uog7vjo4e7qICVkIOjnICVkOyAlZCDu+Ojh7uoiCisKKyM6IHF1aWNrZml4LmM6MTk0MworbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIiIKKyJFMzgyOiDH4O/o8fwg7eXi7ufs7ubt4Cwg5+3g9+Xt6OUg7u/26OggJ2J1ZnR5cGUnIO3lIP/i6//l8vH/IO/z8fLu6SDx8vDu6u7pIgorCisjOiByZWdleHAuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2OTogaW52YWxpZCBpdGVtIGluICVzJSVbXSIKK21zZ3N0ciAiRTM2OTog7eXk7u/z8fLo7PvpIP3r5ezl7fIg4iAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjgzOAorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6INHr6Pjq7uwg5Ovo7e376SD44OHr7u0iCisKKyM6IHJlZ2V4cC5jOjEwMDkKK21zZ2lkICJFNTA6IFRvbyBtYW55IFxceigiCittc2dzdHIgIkU1MDog0evo+Oru7CDs7e7j7iBcXHooIgorCisjOiByZWdleHAuYzoxMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTogVG9vIG1hbnkgJXMoIgorbXNnc3RyICJFNTE6INHr6Pjq7uwg7O3u4+4gJXMoIgorCisjOiByZWdleHAuYzoxMDc3Cittc2dpZCAiRTUyOiBVbm1hdGNoZWQgXFx6KCIKK21zZ3N0ciAiRTUyOiDN5fIg7+Dw+yDk6/8gXFx6KCIKKworIzogcmVnZXhwLmM6MTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM6IFVubWF0Y2hlZCAlcyUlKCIKK21zZ3N0ciAiRTUzOiDN5fIg7+Dw+yDk6/8gJXMlJSgiCisKKyM6IHJlZ2V4cC5jOjEwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6IM3l8iDv4PD7IOTr/yAlcygiCisKKyM6IHJlZ2V4cC5jOjEwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1OiBVbm1hdGNoZWQgJXMpIgorbXNnc3RyICJFNTU6IM3l8iDv4PD7IOTr/yAlcykiCisKKyM6IHJlZ2V4cC5jOjEyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2OiAlcyogb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiDi7ufs7ubt7iDv8/Hy7ukg7u/l8ODt5CAlcyoiCisKKyM6IHJlZ2V4cC5jOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU3OiDi7ufs7ubt7iDv8/Hy7ukg7u/l8ODt5CAlcysiCisKKyM6IHJlZ2V4cC5jOjEzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTog7eXk7u/z8fLo7PvpIPHo7OLu6yDv7vHr5SAlc0AiCisKKyM6IHJlZ2V4cC5jOjEzNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU4OiDi7ufs7ubt7iDv8/Hy7ukg7u/l8ODt5CAlc3siCisKKyM6IHJlZ2V4cC5jOjEzNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOiBUb28gbWFueSBjb21wbGV4ICVzey4uLn1zIgorbXNnc3RyICJFNjA6INHr6Pjq7uwg7O3u4+4g8evu5u379SDq7u3x8vDz6vbo6SAlc3suLi59IgorCisjOiByZWdleHAuYzoxMzcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiDC6+7m5e3t++UgJXMqIgorCisjOiByZWdleHAuYzoxMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2Mjogwuvu5uXt7fvlICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0OTEKK21zZ2lkICJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIKK21zZ3N0ciAiRTYzOiDt5eTu7/Px8ujs7uUg6PHv7uv85+7i4O3o5SBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIO3oIOfgIPfl7CDt5SDx6+Xk8+XyIgorCisjOiByZWdleHAuYzoxNTkyCittc2dpZCAiRTY1OiBJbGxlZ2FsIGJhY2sgcmVmZXJlbmNlIgorbXNnc3RyICJFNjU6IM3l5O7v8/Hy6Ozg/yDu4fDg8u3g/yDx8fvr6uAiCisKKyM6IHJlZ2V4cC5jOjE2MDUKK21zZ2lkICJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY2OiBcXHooIO3lIOzu5uXyIOH78vwg6PHv7uv85+7i4O3uIOfk5fH8IgorCisjOiByZWdleHAuYzoxNjI0Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEg6CDyLu8uIO3lIOzu4/PyIOH78vwg6PHv7uv85+7i4O37IOfk5fH8IgorCisjOiByZWdleHAuYzoxNjM1Cittc2dpZCAiRTY4OiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciBcXHoiCittc2dzdHIgIkU2ODogzeXk7u/z8fLo7PvpIPHo7OLu6yDv7vHr5SBcXHoiCisKKyM6IHJlZ2V4cC5jOjE2ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY5OiBNaXNzaW5nIF0gYWZ0ZXIgJXMlJVsiCittc2dzdHIgIkU2OTogz/Du7/P55e3gIF0g7+7x6+UgJXMlJVsiCisKKyM6IHJlZ2V4cC5jOjE3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcwOiBFbXB0eSAlcyUlW10iCittc2dzdHIgIkU3MDogz/Px8u7lICVzJSVbXSIKKworIzogcmVnZXhwLmM6MTc2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNzE6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyICVzJSUiCittc2dzdHIgIkU3MTogzeXk7u/z8fLo7PvpIPHo7OLu6yDv7vHr5SAlcyUlIgorCisjOiByZWdleHAuYzoyNTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiDR6O3y4Orx6Pfl8erg/yDu+Ojh6uAg4iAlc3suLi59IgorCisjOiByZWdleHAuYzoyODYzIHJlZ2V4cC5jOjMwMTYKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiIgorIkUzNjE6IM/w5eTu8uLw4Pnl7e4g4OLg8Ojp7e7lIOfg4uXw+OXt6OU6IPHr6Pjq7uwg8evu5u3u5SDw5ePz6//w7e7lICIKKyLi+/Dg5uXt6OU/IgorCisjOiByZWdleHAuYzozMDA0IHJlZ2V4cC5jOjMwMTMKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IO/w6Ozl7eXt6OUg+ODh6+7t4CDv8Oji5evuIOog7vjo4erlIOL79e7k4CDn4CDv8OXk5ev7IPHy5ergIgorCisjOiByZWdleHAuYzozMjU4Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAiwu3l+O3o5SDv7uTx7u7y4uXy8fLi6P86XG4iCisKKyM6IHNjcmVlbi5jOjIxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS0lM2xkIPHy8O7qIOIg8err4OTq5SIKKworIzogc2NyZWVuLmM6Nzk5NgorbXNnaWQgIiBWUkVQTEFDRSIKK21zZ3N0ciAiIMLI0NLTwMvczcDfIMfAzMXNwCIKKworIzogc2NyZWVuLmM6ODAwMAorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgx8DMxc3AIgorCisjOiBzY3JlZW4uYzo4MDA1Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiDOwdDA0s3A3yIKKworIzogc2NyZWVuLmM6ODAwNworbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiDC0dLAwsrAIgorCisjOiBzY3JlZW4uYzo4MDEwCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKOLx8uDi6uApIgorCisjOiBzY3JlZW4uYzo4MDEyCittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiICjn4Ozl7eApIgorCisjOiBzY3JlZW4uYzo4MDE0Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAo4ujw8vPg6/zt4P8g5+Ds5e3gKSIKKworIzogc2NyZWVuLmM6ODAxNworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiDI4vDo8iIKKworIzogc2NyZWVuLmM6ODAyOAorbXNnaWQgIiBBcmFiaWMiCittc2dzdHIgIiDA8ODh8ero6SIKKworIzogc2NyZWVuLmM6ODAzMQorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAo/+f76ikiCisKKyM6IHNjcmVlbi5jOjgwMzUKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiICji6uvl6ergKSIKKworIzogc2NyZWVuLmM6ODA0OAorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiDCyMfTwMvczdvJINDFxsjMIgorCisjOiBzY3JlZW4uYzo4MDQ5Cittc2dpZCAiIFZJU1VBTCBMSU5FIgorbXNnc3RyICIgwsjH08DL3M3A3yDR0tDOysAiCisKKyM6IHNjcmVlbi5jOjgwNTAKK21zZ2lkICIgVklTVUFMIEJMT0NLIgorbXNnc3RyICIgwsjH08DL3M3bySDBy87KIgorCisjOiBzY3JlZW4uYzo4MDUxCittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIMLbxMXLxc3IxSIKKworIzogc2NyZWVuLmM6ODA1MgorbXNnaWQgIiBTRUxFQ1QgTElORSIKK21zZ3N0ciAiIMLbxMXLxc3IxSDR0tDOysgiCisKKyM6IHNjcmVlbi5jOjgwNTMKK21zZ2lkICIgU0VMRUNUIEJMT0NLIgorbXNnc3RyICIgwtvExcvFzcjFIMHLzsrAIgorCisjOiBzY3JlZW4uYzo4MDY4IHNjcmVlbi5jOjgxMzEKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgIufg7+jx/CIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgIu/u6PHqIOHz5OXyIO/w7uTu6+bl7SDxIMrOzdbAIOTu6vPs5e3y4CIKKworIzogc2VhcmNoLmM6MzgKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgIu/u6PHqIOHz5OXyIO/w7uTu6+bl7SDxIM3A18DLwCDk7urz7OXt8uAiCisKKyM6IHNlYXJjaC5jOjUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiDN5e/w4OLo6/zt4P8g8fLw7urgIO/u6PHq4DogJXMiCisKKyM6IHNlYXJjaC5jOjg1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IO/u6PHqIOfg6u7t9+XtIOIgzcDXwMvFIOTu6vPs5e3y4DsgJXMg7eUg7eDp5OXt7iIKKworIzogc2VhcmNoLmM6ODU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTog7+7o8eog5+Dq7u335e0g4iDKzs3WxSDk7urz7OXt8uA7ICVzIO3lIO3g6eTl7e4iCisKKyM6IHNlYXJjaC5jOjEyNDkKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IM/u8evlICc7JyDu5ujk4OXy8f8g4uLu5CAnPycg6OvoICcvJyIKKworIzogc2VhcmNoLmM6Mzc1OQorbXNnaWQgIiAoaW5jbHVkZXMgcHJldmlvdXNseSBsaXN0ZWQgbWF0Y2gpIgorbXNnc3RyICIgKOLq6/734OXyIPDg7e3l5SDv7urg5+Dt7fvlIPHu7vLi5fLx8uLo/ykiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6Mzc3OQorbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSDC6uv+97jt7fvlIPTg6ev7ICIKKworIzogc2VhcmNoLmM6Mzc4MQorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIu3lIO3g6eTl7e4gIgorCisjOiBzZWFyY2guYzozNzgyCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAi7+4g7/Py6CAtLS1cbiIKKworIzogc2VhcmNoLmM6MzgzOQorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICjT5uUg7+7q4Ofg7e4pIgorCisjOiBzZWFyY2guYzozODQxCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiDNxSDNwMnExc3OIgorCisjOiBzZWFyY2guYzozODkzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICLP8O7x7O7y8CDi6uv+97jt7fv1IPTg6evu4jogJXMiCisKKyM6IHNlYXJjaC5jOjQxMTEKK21zZ2lkICJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiCittc2dzdHIgIkUzODc6INHu7vLi5fLx8uLo5SDiIPLl6vP55ekg8fLw7urlIgorCisjOiBzZWFyY2guYzo0MjU0Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIs3g6eTl7fsg4vHlIOLq6/73uO3t++Ug9ODp6/siCisKKyM6IHNlYXJjaC5jOjQyNTYKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiwurr/ve47e379SD04Onr7uIg7eXyIgorCisjOiBzZWFyY2guYzo0MjcyCittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiDO7/Dl5OXr5e3o5SDt5SDt4Onk5e3uIgorCisjOiBzZWFyY2guYzo0Mjc0Cittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiDY4OHr7u0g7eUg7eDp5OXtIgorCisjOiBzeW50YXguYzozMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiDN5eTu7/Px8ujs++kg4PDj8+zl7fI6ICVzIgorCisjOiBzeW50YXguYzozMjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiDR6O3y4Orx6Pfl8ero6SDq6+Dx8uXwICVzIO3lIO3g6eTl7SIKKworIzogc3ludGF4LmM6MzM5NAorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAi0ejt8uDq8ej35fHq6OUg/evl7OXt8vsg5Ov/IOTg7e3u4+4g4fP05fDgIO3lIO7v8OXk5evl7fsiCisKKyM6IHN5bnRheC5jOjM0MDIKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgItHo7fXw7u3o5+D26P8g7+4g6u7s7OXt8uDw6P/sIOIg8fLo6+Ug/+f76uAgQyIKKworIzogc3ludGF4LmM6MzQxMAorbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgIuHl5yDx6O318O7t6Ofg9ujoIgorCisjOiBzeW50YXguYzozNDEzCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICLx6O318O7t6Ofg9uj/IO3g9+Dy4CAiCisKKyM6IHN5bnRheC5jOjM0MTUgc3ludGF4LmM6MzQ5MAorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIiDx8vDu6iDv5fDl5CDi5fD17eXpIPHy8O7q7ukiCisKKyM6IHN5bnRheC5jOjM0MjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDd6+Xs5e3y+yDx6O318O7t6Ofg9ujoIPHo7fLg6vHo8eAgLS0tIgorCisjOiBzeW50YXguYzozNDI1Cittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyLx6O318O7t6Ofg9uj/IO/uIP3r5ezl7fLg7CIKKworIzogc3ludGF4LmM6MzQzMQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDR6O3y4Orx6Pfl8ero5SD96+Xs5e3y+yAtLS0iCisKKyM6IHN5bnRheC5jOjM0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6INHo7fLg6vHo9+Xx6ujpIOrr4PHy5fAgJXMg7eUg7eDp5OXtIgorCisjOiBzeW50YXguYzozNDgwCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIuzo7ejs8+wgIgorCisjOiBzeW50YXguYzozNDg3Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIuzg6vHo7PPsICIKKworIzogc3ludGF4LmM6MzQ5OQorbXNnaWQgIjsgbWF0Y2ggIgorbXNnc3RyICI7IPHu7vLi5fLx8uLo5SAiCisKKyM6IHN5bnRheC5jOjM1MDEKK21zZ2lkICIgbGluZSBicmVha3MiCittc2dzdHIgIiDv5fDl7e7x7uIg8fLw7uoiCisKKyM6IHN5bnRheC5jOjQxMzUKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IOfk5fH8IO3l6/zn/yDo8e/u6/zn7uLg8vwgZ3JvdXBbdF1oZXJlIgorCisjOiBzeW50YXguYzo0MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTQ6IERpZG4ndCBmaW5kIHJlZ2lvbiBpdGVtIGZvciAlcyIKK21zZ3N0ciAiRTM5NDog3evl7OXt8iDu4evg8fLoIOTr/yAlcyDt5SDt4Onk5e0iCisKKyM6IHN5bnRheC5jOjQxODcKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTog5+Tl8fwg7eXr/Of/IOjx7+7r/Ofu4uDy/CDg8OPz7OXt8iBjb250YWlucyIKKworIzogc3ludGF4LmM6NDE5OAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiDn5OXx/CDt5ev85/8g6PHv7uv85+7i4PL8IODw4/Ps5e3yIGNvbnRhaW5lZGluIgorCisjOiBzeW50YXguYzo0Mjc2Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6INLw5eHz5fLx/yDz6uDn4PL8IOjs/yD04Onr4CIKKworIzogc3ludGF4LmM6NDYxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IM/w7u/z+eXt7iAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NzcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiDN5SD14uDy4OXyIODw4/Ps5e3y7uI6IPHo7fLg6vHo9+Xx6ujpIPDl4+ju7SAlcyIKKworIzogc3ludGF4LmM6NTEwMworbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiDK6+Dx8uXwIO3lIPPq4Ofg7SIKKworIzogc3ludGF4LmM6NTE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiDN5SDt4Onk5e0g8ODn5OXr6PLl6/wg+ODh6+7t7uI6ICVzIgorCisjOiBzeW50YXguYzo1MjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6IMzz8e7wIO/u8evlIPjg4evu7eA6ICVzIgorCisjOiBzeW50YXguYzo1MzA1Cittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiIgorIkU0MDM6IPHo7fXw7u3o5+D26P8g8ejt8uDq8ejx4Dog+ODh6+7tIO/w7uTu6+bl7ejpIPHy8O7q6CDz6uDn4O0g5OLg5uT7IgorCisjOiBzeW50YXguYzo1MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogzeXk7u/z8fLo7PvlIODw4/Ps5e3y+zogJXMiCisKKyM6IHN5bnRheC5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogz/Du7/P55e0g5+3g6iDw4OLl7fHy4uA6ICVzIgorCisjOiBzeW50YXguYzo1NDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogz/Px8u7pIODw4/Ps5e3yOiAlcyIKKworIzogc3ludGF4LmM6NTQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyDt5SDk7u/z8erg5fLx/yDiIP3y7uwg7OXx8uUiCisKKyM6IHN5bnRheC5jOjU0NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyDk7uvm7e4g4fvy/CDv5fDi++wg4iDx7+jx6uUgY29udGFpbnMiCisKKyM6IHN5bnRheC5jOjU1MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogzeXo5+Ll8fLt4P8g4/Dz7+/gOiAlcyIKKworIzogc3ludGF4LmM6NTc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IM3l7/Dg4ujr/O3g/yDv7uTq7uzg7eTgIDpzeW50YXg6ICVzIgorCisjOiBzeW50YXguYzo2MTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiDj8PPv7+Ag7+7k8eLl8uroIPHo7fLg6vHo8eAgJXMg7eUg7eDp5OXt4CIKKworIzogc3ludGF4LmM6NjE2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogzeUg9eLg8uDl8iDg8OPz7OXt8u7iOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzog0evo+Oru7CDs7e7j7iDg8OPz7OXt8u7iOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTg3Cittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiDzIOPw8+/v+yDl8fL8IPHu4fHy4uXt7fvlIO3g8fLw7unq6Cwg8fH76+rgIOjj7e7w6PDz5fLx/yIKKworIzogc3ludGF4LmM6NjMxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiDt5e7m6OTg7e376SDn7eDqIPDg4uXt8fLi4DogJXMiCisKKyM6IHN5bnRheC5jOjYzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjog7/Du7/P55e0g5+3g6iDw4OLl7fHy4uA6ICVzIgorCisjOiBzeW50YXguYzo2MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiDv8O7v8/nl7SDg8OPz7OXt8jogJXMiCisKKyM6IHN5bnRheC5jOjY0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IM3l5O7v8/Hy6Ozu5SDn7eD35e3o5TogJXMiCisKKyM6IHN5bnRheC5jOjY1MzYKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiDN5ejn4uXx8u376SD24uXyIPLl6vHy4CIKKworIzogc3ludGF4LmM6NjU0NworbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IM3l6Ofi5fHy7fvpIPbi5fIg9O7t4CIKKworIzogc3ludGF4LmM6NjYwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IMjs/yDo6+gg7e7s5fAg9uLl8uAg7eUg6Ofi5fHy7e46ICVzIgorCisjOiBzeW50YXguYzo2ODE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiDx6+j46u7sIOTr6O3t++kg6u7kIPLl8Ozo7eDr4DogJXMiCisKKyM6IHN5bnRheC5jOjY4NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IM3l5O7v8/Hy6Oz76SDg8OPz7OXt8jogJXMiCisKKyM6IHN5bnRheC5jOjczOTAKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiDI8e/u6/zn8+Xy8f8g8evo+Oru7CDs7e7j7iDw4Oft+/Ug4PLw6OHz8u7iIO/u5PHi5fLq6CDx6O3y4Orx6PHgIgorCisjOiBzeW50YXguYzo3OTExCittc2dpZCAiRTY2OTogVW5wcmludGFibGUgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIkU2Njk6IM3l7+X34PLt++kg8ejs4u7rIOIg6Ozl7egg4/Dz7+/7IgorCisjLiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorIy4gKiBnaXZlIGEgd2FybmluZy4KKyM6IHN5bnRheC5jOjc5MTgKK21zZ2lkICJXMTg6IEludmFsaWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCittc2dzdHIgIlcxODogzeXk7u/z8fLo7PvpIPHo7OLu6yDiIOjs5e3oIOPw8+/v+yIKKworIzogdGFnLmM6OTAKK21zZ2lkICJFNTU1OiBhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU1OiDi7ejn8yDx8uXq4CDs5fLu6iIKKworIzogdGFnLmM6OTEKK21zZ2lkICJFNTU2OiBhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICJFNTU2OiDt4OLl8PXzIPHy5ergIOzl8u7qIgorCisjOiB0YWcuYzo0MTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogzeXi7ufs7ubt7iDv5fDl6fLoIOIg7+7n6Pbo/iDk7iDv5fDi7ukg8e7i7+Dk4P755ekg7OXy6ugiCisKKyM6IHRhZy5jOjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogzOXy6uAg7eUg7eDp5OXt4DogJXMiCisKKyM6IHRhZy5jOjU4MworbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyDv8Ogg8ujvICDs5fLq4CIKKworIzogdGFnLmM6NTg2Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICL04OnrXG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3NDQKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIsL74eXw6PLlIO3z5u376SDt7uzl8CAoPENSPiDk6/8g7vLq4OfgKToiCisKKyM6IHRhZy5jOjc4NAorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzogxfHy/CDy7uv86u4g7uTt4CDx7uLv4OTg/vng/yDs5fLq4CIKKworIzogdGFnLmM6Nzg2Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogzeXi7ufs7ubt7iDv5fDl6fLoIOIg7+7n6Pbo/iDn4CDv7vHr5eTt5ekg8e7i7+Dk4P755ekg7OXy6u7pIgorCisjOiB0YWcuYzo4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgItTg6esgXCIlc1wiIO3lIPHz+eXx8uLz5fIiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjgyMworIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAi7OXy6uAgJWQg6OcgJWQlcyIKKworIzogdGFnLmM6ODI2Cittc2dpZCAiIG9yIG1vcmUiCittc2dzdHIgIiDoIOHu6+XlIgorCisjOiB0YWcuYzo4MjgKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiIMjx7+7r/Ofz5fLx/yDs5fLq4CDxIPHo7OLu6+Ds6CDiIOTw8+Pu7CDw5ePo8fLw5SEiCisKKyM6IHRhZy5jOjg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTog1ODp6yBcIiVzXCIg7eUg8fP55fHy4vPl8iIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo5NDEKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIMogIOzl8urlICAgICAgIM7SICAg8fLwLiAg4iD04Onr5S/y5erx8uUiCisKKyM6IHRhZy5jOjEzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAiz+7o8eog4iD04Onr5SDs5fLu6iAlcyIKKworIzogdGFnLmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogz/Py/CDqIPTg6evzIOzl8u7qICVzIO7h8OXn4O1cbiIKKworIzogdGFnLmM6MjIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogzvjo4ergIPTu8Ozg8uAg4iD04Onr5SDs5fLu6iBcIiVzXCIiCisKKyM6IHRhZy5jOjIyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICLP5fDl5CDh4Ony7uwgJWxkIgorCisjOiB0YWcuYzoyMjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjog1ODp6yDs5fLu6iDt5SDu8vHu8PLo8O7i4O06ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjI4MAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzog1ODp6yDs5fLu6iDt5SDu4e3g8PPm5e0iCisKKyM6IHRhZy5jOjMwMTYKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiDN5SDt4Onk5e0g+ODh6+7tIOzl8uroIgorCisjOiB0YWcuYzozMDI3Cittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiDM5fLq4CDt5SDt4Onk5e3gLCDv+/Lg5ezx/yDz4+Dk4PL8ISIKKworIzogdGVybS5jOjE3NTkKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicg7eUg6Ofi5fHy5e0uIMTu8fLz7+37IOLx8vDu5e3t++Ug8uXw7Ojt4Ov7OiIKKworIzogdGVybS5jOjE3ODMKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgIu/uIPPs7uv34O3o/iAnIgorCisjOiB0ZXJtLmM6MjE0MQorbXNnaWQgIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiRTU1NzogzeXi7ufs7ubt7iDu8urw+/L8IPTg6esgdGVybWNhcCIKKworIzogdGVybS5jOjIxNDUKK21zZ2lkICJFNTU4OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIkU1NTg6IMIgdGVybWluZm8g7eXyIOfg7+jx6CDu4SD98u7sIPLl8Ozo7eDr5SIKKworIzogdGVybS5jOjIxNDcKK21zZ2lkICJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTU1OTogwiB0ZXJtY2FwIO3l8iDn4O/o8egg7uEg/fLu7CDy5fDs6O3g6+UiCisKKyM6IHRlcm0uYzoyMzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiDCIHRlcm1jYXAg7eXyIOfg7+jx6CBcIiVzXCIiCisKKyM6IHRlcm0uYzoyNzgwCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IPLw5eHz5fLx/yDx7+7x7uHt7vHy/CDy5fDs6O3g6+AgXCJjbVwiIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTkwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDK7e7v6ugg8uXw7Ojt4OvgIC0tLSIKKworIzogdWkuYzoyNTgKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICLn4O/z8eog7e7i7ukg7uHu6+736uhcbiIKKworIzogdWkuYzoxODQxCittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogzvjo4ergIPfy5e3o/yDi4u7k4Cwg4vv17uQuLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzo0MDUKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIs7y7OXt4CDt5eLu5+zu5u3gOyDv8O7k7uvm4PL8IOL77+7r7eXt6OUiCisKKyM6IHVuZG8uYzo1NjEKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiDt5e/w4OLo6/zt++Ug7e7s5fDgIPHy8O7qIgorCisjOiB1bmRvLmM6NzU3Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIsXk6O3x8uLl7e3u5SDo5+zl7eXt6OUiCisKKyM6IHVuZG8uYzo3NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIsjn7OXt5e3o6TogJWxkIgorCisjOiB1bmRvLmM6ODEyCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IM/u4vDl5uS47SDx7+jx7uog7vLs5e37IgorCisjOiB1bmRvLmM6ODQ0Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IO/u8uXw/+3gIPHy8O7q4CDu8uzl7fsiCisKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzo3MjEKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyLC5fDx6P8g8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CDk6/8gTVMtV2luZG93cyAxNi8zMiDh6PIiCisKKyM6IHZlcnNpb24uYzo3MjMKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyLC5fDx6P8g8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CDk6/8gTVMtV2luZG93cyAzMiDh6PIiCisKKyM6IHZlcnNpb24uYzo3MjYKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiDiIPDl5ujs5SBXaW4zMnMiCisKKyM6IHZlcnNpb24uYzo3MjgKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIPEg7+7k5OXw5uru6SBPTEUiCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiyu7t8e7r/O3g/yDi5fDx6P8g5Ov/IE1TLVdpbmRvd3MgMzIg4ejyIgorCisjOiB2ZXJzaW9uLmM6NzM1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyLC5fDx6P8g5Ov/IE1TLVdpbmRvd3MgMTYg4ejyIgorCisjOiB2ZXJzaW9uLmM6NzM5Cittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIsLl8PHo/yDk6/8gTVMtRE9TIDMyIOHo8iIKKworIzogdmVyc2lvbi5jOjc0MQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyLC5fDx6P8g5Ov/IE1TLURPUyAxNiDh6PIiCisKKyM6IHZlcnNpb24uYzo3NDcKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIsLl8PHo/yDk6/8gTWFjT1MgWCAodW5peCkiCisKKyM6IHZlcnNpb24uYzo3NDkKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiwuXw8ej/IOTr/yBNYWNPUyBYIgorCisjOiB2ZXJzaW9uLmM6NzUyCittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyLC5fDx6P8g5Ov/IE1hY09TIgorCisjOiB2ZXJzaW9uLmM6NzU3Cittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIsLl8PHo/yDk6/8gUklTQyBPUyIKKworIzogdmVyc2lvbi5jOjc2NworbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyLH4O/r4PLq6DogIgorCisjOiB2ZXJzaW9uLmM6NzkzIHZlcnNpb24uYzoxMTYxCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICLRIOjn7OXt5e3o/+zoLCDi7eXxuO3t++zoICIKKworIzogdmVyc2lvbi5jOjgwMAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyLR6u7s7+jr6PDu4uDtICIKKworIzogdmVyc2lvbi5jOjgwMworbXNnaWQgImJ5ICIKK21zZ3N0ciAiICIKKworIzogdmVyc2lvbi5jOjgxNQorbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisizuPw7uzt4P8g4uXw8ej/ICIKKworIzogdmVyc2lvbi5jOjgxOAorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLB7uv8+OD/IOLl8PHo/yAiCisKKyM6IHZlcnNpb24uYzo4MjEKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisizuH79+3g/yDi5fDx6P8gIgorCisjOiB2ZXJzaW9uLmM6ODI0Cittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisizODr4P8g4uXw8ej/ICIKKworIzogdmVyc2lvbi5jOjgyNgorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiwuXw8ej/IFwiyvDu9eBcIiAiCisKKyM6IHZlcnNpb24uYzo4MzIKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgIuHl5yDj8OD06Pfl8eru4+4g6O3y5fD05enx4C4iCisKKyM6IHZlcnNpb24uYzo4MzcKK21zZ2lkICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBHVEsyLUdOT01FLiIKKworIzogdmVyc2lvbi5jOjgzOQorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgIvEg4/Dg9Oj35fHq6Owg6O3y5fD05enx7uwgR1RLLUdOT01FLiIKKworIzogdmVyc2lvbi5jOjg0MworbXNnaWQgIndpdGggR1RLMiBHVUkuIgorbXNnc3RyICLxIOPw4PTo9+Xx6ujsIOjt8uXw9OXp8e7sIEdUSzIuIgorCisjOiB2ZXJzaW9uLmM6ODQ1Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBHVEsuIgorCisjOiB2ZXJzaW9uLmM6ODUwCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBYMTEtTW90aWYuIgorCisjOiB2ZXJzaW9uLmM6ODU0Cittc2dpZCAid2l0aCBYMTEtbmVYdGF3IEdVSS4iCittc2dzdHIgIvEg4/Dg9Oj35fHq6Owg6O3y5fD05enx7uwgWDExLW5lWHRhdy4iCisKKyM6IHZlcnNpb24uYzo4NTYKK21zZ2lkICJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBYMTEtQXRoZW5hLiIKKworIzogdmVyc2lvbi5jOjg2MAorbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICLxIOPw4PTo9+Xx6ujsIOjt8uXw9OXp8e7sIEJlT1MuIgorCisjOiB2ZXJzaW9uLmM6ODYzCittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBQaG90b24uIgorCisjOiB2ZXJzaW9uLmM6ODY2Cittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICLxIOPw4PTo9+Xx6ujsIOjt8uXw9OXp8e7sLiIKKworIzogdmVyc2lvbi5jOjg2OQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgIvEg4/Dg9Oj35fHq6Owg6O3y5fD05enx7uwgQ2FyYm9uLiIKKworIzogdmVyc2lvbi5jOjg3MgorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAi8SDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7CBDb2NvYS4iCisKKyM6IHZlcnNpb24uYzo4NzUKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICLxIOrr4PHx6Pfl8ero7CDj8OD06Pfl8ero7CDo7fLl8PTl6fHu7C4iCisKKyM6IHZlcnNpb24uYzo4ODYKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIgIMLq6/73uO3t++UgKCspIOgg7vLq6/73uO3t++UgKC0pIO7x7uHl7e3u8fLoOlxuIgorCisjOiB2ZXJzaW9uLmM6ODk4Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICAgICDu4fnl8ejx8uXs7fvpIPTg6esgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTAzCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICDv7uv85+7i4PLl6/zx6ujpIPTg6esgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTA4Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIOLy7vDu6SDv7uv85+7i4PLl6/zx6ujpIPTg6esgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTEzCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIPLw5fLo6SDv7uv85+7i4PLl6/zx6ujpIPTg6esgdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE4Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICAg7+7r/Ofu4uDy5ev88ero6SD04OnrIGV4cmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTIzCittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDi8u7w7ukg7+7r/Ofu4uDy5ev88ero6SD04OnrIGV4cmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTI5Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICAgIO7h+eXx6PHy5ezt++kg9ODp6yBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTMzCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIO/u6/zn7uLg8uXr/PHq6Okg9ODp6yBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTM3Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIg4vLu8O7pIO/u6/zn7uLg8uXr/PHq6Okg9ODp6yBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQyCittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIg8vDl8ujpIO/u6/zn7uLg8uXr/PHq6Okg9ODp6yBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAiICAgIHN5c3RlbSBtZW51IGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICAgICAg7uH55fHo8fLl7O376SD04OnrIOzl7f46IFwiIgorCisjOiB2ZXJzaW9uLmM6OTU3Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgICAgICAg5+3g9+Xt6OUgJFZJTSDv7iDz7O7r9+Dt6P46IFwiIgorCisjOiB2ZXJzaW9uLmM6OTYzCittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgICDn7eD35e3o5SAkVklNUlVOVElNRSDv7iDz7O7r9+Dt6P46IFwiIgorCisjOiB2ZXJzaW9uLmM6OTY3Cittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAiz+Dw4Ozl8vD7IOru7O/o6//26Og6ICIKKworIzogdmVyc2lvbi5jOjk3MworbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIsru7O/o6//y7vA6ICIKKworIzogdmVyc2lvbi5jOjk3OAorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAi0eHu8OrgOiAiCisKKyM6IHZlcnNpb24uYzo5ODMKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIM7Sy8DEztfNwN8g0cHO0MrAIgorCisjOiB2ZXJzaW9uLmM6MTAyMgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gOjo6IFZpIElNcHJvdmVkICjT6/P3+OXt7fvpIFZpKSA6Ojog0PPx8erg/yDi5fDx6P8iCisKKyM6IHZlcnNpb24uYzoxMDI0Cittc2dpZCAidmVyc2lvbiAiCittc2dzdHIgIuLl8PHo/yAiCisKKyM6IHZlcnNpb24uYzoxMDI1Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICLB8ODsIMzu7uvl7eDg8CDoIOTw8+Po5SIKKworIzogdmVyc2lvbi5jOjEwMjkKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0g/fLuIPHi7uHu5O3uIPDg8e/w7vHy8ODt/+Xs4P8g7/Du4/Dg7OzgIPEg7vLq8Pvy++wg6u7k7uwiCisKKyM6IHZlcnNpb24uYzoxMDMxCittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIsHl5O377CDk5fL/7CDiINPj4O3k5SDt8+bt4CDi4PjgIO/u7O75/CEiCisKKyM6IHZlcnNpb24uYzoxMDMyCittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAi7eDh5fDo8uUgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAg5Ov/IOTu7+7r7ejy5ev87e7pIOjt9O7w7OD26OgiCisKKyM6IHZlcnNpb24uYzoxMDM0Cittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAi7eDh5fDo8uUgOnE8RW50ZXI+ICAgICAgICAgICAgICAg9/Lu4fsg4vvp8ugg6Ocg7/Du4/Dg7Oz7ICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDM1Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAi7eDh5fDo8uUgOmhlbHA8RW50ZXI+IOjr6CA8RjE+ICAg5Ov/IO/u6/P35e3o/yDx7/Dg4uroICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDM2Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAi7eDh5fDo8uUgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAg9/Lu4fsg8+ft4PL8IO7hIP3y7ukg4uXw8ejoICAiCisKKyM6IHZlcnNpb24uYzoxMDM5Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgItDg4e7y4CDiIFZpLfHu4uzl8fLo7O7sIPDl5ujs5SIKKworIzogdmVyc2lvbi5jOjEwNDAKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICLt4OHl8Ojy5SA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICDk6/8g7+Xw5fXu5OAg4iDw5ebo7CBWaW0gICAgICIKKworIzogdmVyc2lvbi5jOjEwNDEKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICLt4OHl8Ojy5SA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiDk6/8g5O7v7uvt6PLl6/zt7ukg6O307vDs4Pbo6CIKKworIzogdmVyc2lvbi5jOjEwNTYKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICLs5e3+INHv8ODi6uAtPtHo8O7y+yAgICAgICAgICAgICDk6/8g7+7r8/fl7ej/IOjt9O7w7OD26OggICAgICIKKworIzogdmVyc2lvbi5jOjEwNTgKK21zZ2lkICJSdW5uaW5nIG1vZGVsZXNzLCB0eXBlZCB0ZXh0IGlzIGluc2VydGVkIgorbXNnc3RyICLB5efw5ebo7O3g/yDw4OHu8vssIOLx8uDi6uAg4uLl5Ljt7e7j7iDy5erx8uAiCisKKyM6IHZlcnNpb24uYzoxMDU5Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAi7OXt/iDP8ODi6uAtPs7h+ejlIM3g8fLw7unq6C0+0OXm6OwgwvHy4OLq6CAgICAgICAgICAgICAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjEwNjAKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDk6/8g5OLz9SDw5ebo7O7iICAgICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTA2NAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIuzl7f4gz/Dg4urgLT7O4fno5SDN4PHy8O7p6ugtPtHu4uzl8fLo7O7x8vwg8SBWaSAgICAgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDY1Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Ov/IO/l8OX17uTgIOIg8OXm6OwgVmltICAgICAgICIKKworIzogdmVyc2lvbi5jOjExMTIKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIs/u7O7j6PLlIOIg8ODn8ODh7vLq5SBWaW0hIgorCisjOiB2ZXJzaW9uLmM6MTExMworbXNnaWQgIkJlY29tZSBhIHJlZ2lzdGVyZWQgVmltIHVzZXIhIgorbXNnc3RyICLR8uDt/PLlIOfg8OXj6PHy8Ojw7uLg7e377CDv7uv85+7i4PLl6+XsIFZpbSEiCisKKyM6IHZlcnNpb24uYzoxMTE2Cittc2dpZCAidHlwZSAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAi7eDh5fDo8uUgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAg5Ov/IO/u6/P35e3o/yDo7fTu8Ozg9ujoICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTE3Cittc2dpZCAidHlwZSAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAi7eDh5fDo8uUgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAg5Ov/IO/u6/P35e3o/yDo7fTu8Ozg9ujoICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTE5Cittc2dpZCAibWVudSAgSGVscC0+U3BvbnNvci9SZWdpc3RlciAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAi7OXt/iDR7/Dg4urgLT7P7uzu+fwv0OXj6PHy8OD26P8g5Ov/IO/u6/P35e3o/yDo7fTu8Ozg9ujoICAgICAgICIKKworIzogdmVyc2lvbi5jOjExMjkKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICLP0MXE08/QxcbExc3IxTog7uHt4PDz5uXt4CBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6MTEzMgorbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIu3g4eXw6PLlIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIOTr/yDv7uvz9+Xt6P8g6O307vDs4Pbo6CAgICAgIgorCisjOiB3aW5kb3cuYzoyMDMKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogzurt7iDv8OXk7/Du8ezu8vDgIO7y8fPy8fLi8+XyIgorCisjOiB3aW5kb3cuYzo1ODEKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiDO6u3uIO3lIOzu5uXyIOH78vwg7uTt7uLw5ezl7e3uIPHr5eLgIOLi5fD18yDoIPHv8ODi4CDi7ejn8yIKKworIzogd2luZG93LmM6MTM0MAorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0MzogzeXi7ufs7ubt7iDv7uzl7f/y/CDs5fHy4OzoLCDv7urgIOTw8+Pu5SDu6u3uIPDg5+Tl6+Xt7iIKKworIzogd2luZG93LmM6MTgzNgorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogzeXr/Of/IOfg6vD78vwg7+7x6+Xk7eXlIO7q7e4iCisKKyM6IHdpbmRvdy5jOjI1NjcKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAizeAg/erw4O3lIOLx5ePuIO7k7e4g7urt7iIKKworIzogd2luZG93LmM6MjYxNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiDCIOTw8+Pu7CDu6u3lIOXx8vwg7eXx7vXw4O247e375SDo5+zl7eXt6P8iCisKKyM6IHdpbmRvdy5jOjQ0ODAKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiDN5fIg6Ozl7egg9ODp6+Ag4iDv7ufo9ujoIOrz8PHu8OAiCisKKyM6IHdpbmRvdy5jOjQ1OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiDU4OnrIFwiJXNcIiDt5SDt4Onk5e0g7+4g6Ofi5fHy7fvsIO/z8v/sIgorCisjOiBpZl9wZXJsLnhzOjMyNiBnbG9iYWxzLmg6MTIzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiDN5eLu5+zu5u3uIOfg4/Dz5+jy/CDh6OHr6O7y5erzICVzIgorCisjOiBpZl9wZXJsLnhzOjU1NAorbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBQZXJsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyLI5+Lo7ejy5Swg5ODt7eD/IOru7ODt5OAg7vLq6/735e3gOiDt5eLu5+zu5u3uIOfg4/Dz5+jy/CDh6OHr6O7y5erzIFBlcmwiCisKKyM6IGlmX3BlcmwueHM6NjA3Cittc2dpZCAiRTI5OTogUGVybCBldmFsdWF0aW9uIGZvcmJpZGRlbiBpbiBzYW5kYm94IHdpdGhvdXQgdGhlIFNhZmUgbW9kdWxlIgorbXNnc3RyICIiCisiRTI5OTogzeUg5O7v8/Hq4OXy8f8g4vv36PHr5e3o5SBQZXJsIOIg7+Xx7vft6PblIOHl5yDs7uTz6/8g4eXn7u/g8e3u8fLoIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4MworbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAi0OXk4Ory6PDu4uDy/CDiICbw4Oft+/UgVmltLeD1IgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAi0OXk4Ory6PDu4uDy/CDiICbu5O3u7CBWaW0iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTk4Cittc2dpZCAiJkRpZmYgd2l0aCBWaW0iCittc2dzdHIgIibR8ODi7ejy/CDxIO/u7O75/P4gVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYxMQorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICLQ5Sbk4Ory6PDu4uDy/CDxIO/u7O75/P4gVmltIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjMzCittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgItDl5ODq8ujw7uLg8vwg4iDn4O/z+eXt7e7sIFZpbSAtICYiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NzQ2Cittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgItDl5ODq8ujw7uLg8vwg4vvk5evl7e375SD04Onr+yDxIO/u7O75/P4gVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NSBHdmltRXh0L2d2aW1leHQuY3BwOjk2NgorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAizvjo4ergIPHu5+Tg7ej/IO/w7vbl8fHgOiDv8O7i5fD88uUg5O7x8vPv7e7x8vwgZ3ZpbSDiIO/z8ughIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg4NiBHdmltRXh0L2d2aW1leHQuY3BwOjkwMCBHdmltRXh0L2d2aW1leHQuY3BwOjk2NworbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICLu+Ojh6uAgZ3ZpbWV4dC5kbGwiCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6ODk5Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICLR6+j46u7sIOTr6O3t++kg7/Py/CEiCisKKyM6IGdsb2JhbHMuaDoxMDIyCittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS0gzeXyIPHy8O7qIOIg4fP05fDlIC0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjExODUKK21zZ2lkICJFNDcwOiBDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIkU0NzA6IML77+7r7eXt6OUg6u7s4O3k+yDv8OXw4uDt7iIKKworIzogZ2xvYmFscy5oOjExODYKK21zZ2lkICJFNDcxOiBBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAiRTQ3MTog0vDl4fPl8vH/IPPq4Ofg8vwg7+Dw4Ozl8vAiCisKKyM6IGdsb2JhbHMuaDoxMTg3Cittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IM/u8evlIFxcIOTu6+bl7SDo5PLoIPHo7OLu6yAvLCA/IOjr6CAmIgorCisjOiBnbG9iYWxzLmg6MTE4OQorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIiIKKyJFMTE6IM3l5O7v8/Hy6OzuIOIg7urt5SDq7uzg7eTt7ukg8fLw7uroOyA8Q1I+IOL77+7r7eXt6OUsIENUUkwtQyDi+/Xu5CIKKworIzogZ2xvYmFscy5oOjExOTEKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIiIKKyJFMTI6IMru7ODt5OAg7eUg5O7v8/Hq4OXy8f8g4iBleHJjL3ZpbXJjIOIg8uXq8/nl7CDq4PLg6+7j5SDo6+gg7+7o8erlIOzl8u7qIgorCisjOiBnbG9iYWxzLmg6MTE5MworbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiDO8vHz8vHy4vPl8iDq7uzg7eTgIDplbmRpZiIKKworIzogZ2xvYmFscy5oOjExOTQKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IM7y8fPy8fLi8+XyIOru7ODt5OAgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogzvLx8/Lx8uLz5fIg6u7s4O3k4CA6ZW5kd2hpbGUiCisKKyM6IGdsb2JhbHMuaDoxMTk2Cittc2dpZCAiRTU4ODogOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg4OiDK7uzg7eTgIDplbmR3aGlsZSDh5ecg7+Dw7e7pIOru7ODt5PsgOndoaWxlIgorCisjOiBnbG9iYWxzLmg6MTE5OAorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiDU4OnrIPHz+eXx8uLz5fIgKOTr/yDv5fDl5+Dv6PHoIOTu4eDi/PLlICEpIgorCisjOiBnbG9iYWxzLmg6MTE5OQorbXNnaWQgIkU0NzI6IENvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJFNDcyOiDN5SDz5ODr7vH8IOL77+7r7ejy/CDq7uzg7eTzIgorCisjOiBnbG9iYWxzLmg6MTIwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiDN5ejn4uXx8u376SD48Oj08u7i7ukg7eDh7vA6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFMjM1OiDN5ejn4uXx8u376SD48Oj08jogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjog2PDo9PIgXCIlc1wiIO3lIP/i6//l8vH/IOzu7e746PDo7e377CD48Oj08u7sIgorCisjOiBnbG9iYWxzLmg6MTIxMAorbXNnaWQgIkU0NzM6IEludGVybmFsIGVycm9yIgorbXNnc3RyICJFNDczOiDC7fPy8OXt7f//IO746OHq4CIKKworIzogZ2xvYmFscy5oOjEyMTEKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiz/Dl8OLg7e4iCisKKyM6IGdsb2JhbHMuaDoxMjEyCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogzeXk7u/z8fLo7PvpIODk8OXxIgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkU0NzQ6IM3l5O7v8/Hy6Oz76SDg8OPz7OXt8iIKKworIzogZ2xvYmFscy5oOjEyMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ3NTogSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0NzU6IM3l5O7v8/Hy6Oz76SDg8OPz7OXt8jogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiDN5eTu7/Px8ujs7uUg4vvw4Obl7ejlOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogzeXk7u/z8fLo7PvpIOTo4O/g5+7tIgorCisjOiBnbG9iYWxzLmg6MTIxOQorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogzeXk7u/z8fLo7OD/IOru7ODt5OAiCisKKyM6IGdsb2JhbHMuaDoxMjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiD/4uv/5fLx/yDq4PLg6+7j7uwiCisKKyM6IGdsb2JhbHMuaDoxMjI0Cittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiDP5fDl5CAnPScg7uHt4PDz5uXt+yDt5e7m6OTg7e375SDx6Ozi7uv7IgorCisjOiBnbG9iYWxzLmg6MTIyNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogzeXz5OD37fvpIOL75+7iIPTz7er26OggXCIlcygpXCIg6Ocg4ejh6+ju8uXq6CIKKworIzogZ2xvYmFscy5oOjEyMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODogzeUg8+Tg6+7x/CDn4OPw8+fo8vwg9PPt6vbo/iAlcyDo5yDh6OHr6O7y5eroIgorCisjOiBnbG9iYWxzLmg6MTIzNQorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiDO8uzl8urgIPPq4Of74uDl8iDt4CDt5e/w4OLo6/zt++kg7e7s5fAg8fLw7uroIgorCisjOiBnbG9iYWxzLmg6MTIzNgorbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICLO8uzl8urgIO3lIO7v8OXk5evl7eAiCisKKyM6IGdsb2JhbHMuaDoxMjM3Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IMjn7OXt5e3o/yDt5eLu5+zu5u37LCDy4Oog6uDqIO7y6uv+9+Xt4CDu7/bo/yAnbW9kaWZpYWJsZSciCisKKyM6IGdsb2JhbHMuaDoxMjM4Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiDR6+j46u7sIOPr8+Hu6u4g4uvu5uXt7fvlIPH25e3g8OjoIgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzog0e7x5eTt6Okg9ODp6yDt5SDx8/nl8fLi8+XyIgorCisjOiBnbG9iYWxzLmg6MTI0MAorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogzeXyIPLg6u7j7iDx7urw4Pnl7ej/IgorCisjOiBnbG9iYWxzLmg6MTI0MQorbXNnaWQgIkU0Nzc6IE5vICEgYWxsb3dlZCIKK21zZ3N0ciAiRTQ3NzogISDt5SDk7u/z8erg5fLx/yIKKworIzogZ2xvYmFscy5oOjEyNDMKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICIiCisiRTI1OiDC7ufs7ubt7vHy/CDo8e/u6/zn7uLg7ej/IOPw4PTo9+Xx6u7j7iDo7fLl8PTl6fHgIOL76uv+9+Xt4CDv8OggIgorIuru7O/o6//26OgiCisKKyM6IGdsb2JhbHMuaDoxMjQ2Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IMji8OjyIOL76uv+9+XtIO/w6CDq7uzv6Ov/9ujoXG4iCisKKyM6IGdsb2JhbHMuaDoxMjQ5Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzog1ODw8egg4vvq6/735e3uIO/w6CDq7uzv6Ov/9ujoXG4iCisKKyM6IGdsb2JhbHMuaDoxMjUyCittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogwPDg4fHq6Okg4vvq6/735e0g7/DoIOru7O/o6//26OhcbiIKKworIzogZ2xvYmFscy5oOjEyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiDD8PPv7+Ag7+7k8eLl8uroIPHo7fLg6vHo8eAgJXMg7eUg8fP55fHy4vPl8iIKKworIzogZ2xvYmFscy5oOjEyNTcKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IM/u6uAg7eXyIOLx8uDi6+Xt7e7j7iDy5erx8uAiCisKKyM6IGdsb2JhbHMuaDoxMjU4Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogz/Dl5Pvk8/nl6SDq7uzg7eTt7ukg8fLw7uroIO3l8iIKKworIzogZ2xvYmFscy5oOjEyNTkKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiDS4Oru6SDv8Oji/+fq6CDt5SDx8/nl8fLi8+XyIgorCisjOiBnbG9iYWxzLmg6MTI2MAorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiDN5fIg8e7u8uLl8vHy4uj/IgorCisjOiBnbG9iYWxzLmg6MTI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDgwOiBObyBtYXRjaDogJXMiCittc2dzdHIgIkU0ODA6IM3l8iDx7u7y4uXy8fLi6P86ICVzIgorCisjOiBnbG9iYWxzLmg6MTI2MgorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IM3l8iDo7OXt6CD04Onr4CIKKworIzogZ2xvYmFscy5oOjEyNjMKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IM3l8iDv8OXk++Tz+eXj7iDw5ePz6//w7e7j7iDi+/Dg5uXt6P8g5Ov/IOfg7OXt+yIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIkUzNDogzeXyIO/w5eT75PP55ekg6u7s4O3k+yIKKworIzogZ2xvYmFscy5oOjEyNjUKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiDN5fIg7/Dl5Pvk8/nl4+4g8OXj8+v/8O3u4+4g4vvw4Obl7ej/IgorCisjOiBnbG9iYWxzLmg6MTI2NgorbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IMjx7+7r/Ofu4uDt6OUg5Ojg7+Dn7u3gIO3lIOTu7/Px6uDl8vH/IgorCisjOiBnbG9iYWxzLmg6MTI2OAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IM3l5O7x8uDy7vft7iDs5fHy4CIKKworIzogZ2xvYmFscy5oOjEyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0Nzogbm8gcmVnaXN0ZXJlZCBzZXJ2ZXIgbmFtZWQgXCIlc1wiIgorbXNnc3RyICJFMjQ3OiDx5fDi5fAgXCIlc1wiIO3lIOfg8OXj6PHy8Ojw7uLg7SIKKworIzogZ2xvYmFscy5oOjEyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MjogQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIkU0ODI6IM3l4u7n7O7m7e4g8e7n5ODy/CD04OnrICVzIgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogzeXi7ufs7ubt7iDv7uvz9+jy/CDo7P8g4vDl7OXt7e7j7iD04Onr4CIKKworIzogZ2xvYmFscy5oOjEyNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NDogQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJFNDg0OiDN5eLu5+zu5u3uIO7y6vD78vwg9ODp6yAlcyIKKworIzogZ2xvYmFscy5oOjEyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NTogQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJFNDg1OiDN5eLu5+zu5u3uIO/w7vfo8uDy/CD04OnrICVzIgorCisjOiBnbG9iYWxzLmg6MTI3NworbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiDI5+zl7eXt6P8g7eUg8e718ODt5e37ICjk7uHg4vzy5SAhLCD38u7h+yDu4e7p8ugg7/Du4uXw6vMpIgorCisjOiBnbG9iYWxzLmg6MTI3OAorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiDN8+vl4u7pIODw4/Ps5e3yIgorCisjOiBnbG9iYWxzLmg6MTI4MAorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6INLw5eHz5fLx/yD36PHr7iIKKworIzogZ2xvYmFscy5oOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiDN5SDz5ODr7vH8IO7y6vD78vwg9ODp6yDu+Ojh7uogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjg2Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzog7eXi7ufs7ubt7iDu8urw+/L8IOTo8e/r5ekiCisKKyM6IGdsb2JhbHMuaDoxMjg4Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiDN5SD14uDy4OXyIO/g7P/y6CEiCisKKyM6IGdsb2JhbHMuaDoxMjkwCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgItjg4evu7SDt5SDt4Onk5e0iCisKKyM6IGdsb2JhbHMuaDoxMjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4Njog2ODh6+7tIO3lIO3g6eTl7TogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjkzCittc2dpZCAiRTQ4NzogQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiRTQ4Nzogz+Dw4Ozl8vAg5O7r5uXtIOH78vwg7+7r7ubo8uXr/O377CD36PHr7uwiCisKKyM6IGdsb2JhbHMuaDoxMjk1Cittc2dpZCAiRTQ1OTogQ2Fubm90IGdvIGJhY2sgdG8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFNDU5OiDC7ufi8ODyIOIg7/Dl5Pvk8/no6SDq4PLg6+7jIO3l4u7n7O7m5e0iCisKKyM6IGdsb2JhbHMuaDoxMjk5Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0Mjogzvjo4e7qIO3l8iIKKworIzogZ2xvYmFscy5oOjEzMDEKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6IM/u4vDl5uTl7eAg8fLw7urgIPHu7vLi5fLx8uLo/yIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFNDQ6IENvcnJ1cHRlZCByZWdleHAgcHJvZ3JhbSIKK21zZ3N0ciAiRTQ0OiDP8O7j8ODs7OAg7uHw4OHu8uroIPDl4/Pr//Dt+/Ug4vvw4Obl7ejpIO/u4vDl5uTl7eAiCisKKyM6IGdsb2JhbHMuaDoxMzAzCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU0NTogwurr/vfl7eAg7u/26P8gJ3JlYWRvbmx5JyAo5O7h4OL88uUgISwg9/Lu4fsg7eUg7uHw4Png8vwg4u3o7ODt6P8pIgorCisjOiBnbG9iYWxzLmg6MTMwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiDN5eLu5+zu5u3uIOjn7OXt6PL8IOTu8fLz7+3z/iDy7uv86u4g5Ov/IPfy5e3o/yDv5fDl7OXt7fP+IFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjEzMDgKK21zZ2lkICJFNDc6IEVycm9yIHdoaWxlIHJlYWRpbmcgZXJyb3JmaWxlIgorbXNnc3RyICJFNDc6IM746OHq4CDv8Ogg9/Ll7ejoIPTg6evgIO746OHu6iIKKworIzogZ2xvYmFscy5oOjEzMTEKK21zZ2lkICJFNDg6IE5vdCBhbGxvd2VkIGluIHNhbmRib3giCittc2dzdHIgIkU0ODogzeUg5O7v8/Hq4OXy8f8g4iDv5fHu9+3o9uUiCisKKyM6IGdsb2JhbHMuaDoxMzEzCittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogx+Tl8fwg7eUg8ODn8OX45e3uIgorCisjOiBnbG9iYWxzLmg6MTMxNgorbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTogxODt7fvpIPDl5ujsIP3q8ODt4CDt5SDv7uTk5fDm6OLg5fLx/yIKKworIzogZ2xvYmFscy5oOjEzMTgKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogzeXk7u/z8fLo7PvpIPDg5+zl8CDv8O7q8PPy6ugiCisKKyM6IGdsb2JhbHMuaDoxMzE5Cittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiDH7eD35e3o5ewg7u/26OggJ3NoZWxsJyD/4uv/5fLx/yDv8/Hy4P8g8fLw7urgIgorCisjOiBnbG9iYWxzLmg6MTMyMQorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogzeXi7ufs7ubt7iDv8O736PLg8vwg5ODt7fvlIO4g5+3g9+rg9SEiCisKKyM6IGdsb2JhbHMuaDoxMzIzCittc2dpZCAiRTcyOiBDbG9zZSBlcnJvciBvbiBzd2FwIGZpbGUiCittc2dzdHIgIkU3Mjogzvjo4ergIOfg6vD78uj/IPHi7u8t9ODp6+AiCisKKyM6IGdsb2JhbHMuaDoxMzI0Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3Mzog0fLl6iDs5fLu6iDv8/Hy7ukiCisKKyM6IGdsb2JhbHMuaDoxMzI1Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6INHr6Pjq7uwg8evu5u3g/yDq7uzg7eTgIgorCisjOiBnbG9iYWxzLmg6MTMyNgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiDR6+j46u7sIOTr6O3t7uUg6Oz/IgorCisjOiBnbG9iYWxzLmg6MTMyNworbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiDR6+j46u7sIOzt7uPuIPHo7OLu6+7iIFsiCisKKyM6IGdsb2JhbHMuaDoxMzI4Cittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6INHr6Pjq7uwg7O3u4+4g6Oy47SD04Onr7uIiCisKKyM6IGdsb2JhbHMuaDoxMzI5Cittc2dpZCAiRTQ4ODogVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAiRTQ4ODogy+j47ejlIPHo7OLu6/sg7eAg9eLu8fLlIgorCisjOiBnbG9iYWxzLmg6MTMzMAorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IM3l6Ofi5fHy7eD/IO7y7OXy6uAiCisKKyM6IGdsb2JhbHMuaDoxMzMxCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiDN5eLu5+zu5u3uIOL77+7r7ejy/CDv7uTx8uDt7uLq8yDv7iDs4PHq5SIKKworIzogZ2xvYmFscy5oOjEzMzMKK21zZ2lkICJFNTkxOiAnd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICIiCisiRTU5MTogx+3g9+Xt6OUg7u/26OggJ3dpbmhlaWdodCcg7eUg7O7m5fIg4fvy/CDs5e38+OUg5+3g9+Xt6P8gJ3dpbm1pbmhlaWdodCciCisKKyM6IGdsb2JhbHMuaDoxMzM1Cittc2dpZCAiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIiIKKyJFNTkyOiDH7eD35e3o5SDu7/bo6CAnd2lud2lkdGgnIO3lIOzu5uXyIOH78vwg7OXt/PjlIOft4Pfl7ej/ICd3aW5taW53aWR0aCciCisKKyM6IGdsb2JhbHMuaDoxMzM4Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IM746OHq4CDv8Ogg5+Dv6PHoIgorCisjOiBnbG9iYWxzLmg6MTMzOQorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIs3z6+Xi7uUg5+3g9+Xt6OUg8fe48vfo6uAiCisKKyM6IGdsb2JhbHMuaDoxMzQxCittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiDI8e/u6/zn7uLg7ejlIDxTSUQ+IOLt5SDq7u3y5erx8uAg8fbl7eDw6P8iCisKKyM6IGdsb2JhbHMuaDoxMzQ0Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiDP7uvz9+Xt7iDt5eTu7/Px8ujs7uUg4vvw4Obl7ejlIgorCisjOiBnbG9iYWxzLmg6MTM0NworbXNnaWQgIkU0NjM6IFJlZ2lvbiBpcyBndWFyZGVkLCBjYW5ub3QgbW9kaWZ5IgorbXNnc3RyICJFNDYzOiDN5eLu5+zu5u3uIOjn7OXt6PL8IO718ODt/+Xs8/4g7uHr4PHy/CIKKworI34gbXNnaWQgIlwiXG4iCisjfiBtc2dzdHIgIlwiXG4iCmRpZmYgLS1naXQgYS9zcmMvcG8vcnUucG8gYi9zcmMvcG8vcnUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YmMwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby9ydS5wbwpAQCAtMCwwICsxLDY2NTggQEAKKyMgUnVzc2lhbiB0cmFuc2xhdGlvbiBmb3IgVmltCisjIAorIyDvwiDV08zP18nRyCDJ09DPzNjaz9fBzsnRIN7J1MHK1MUg1yDSxcTBy9TP0sUgVmltICI6aGVscCB1Z2FuZGEiCisjIO8gzMDE0cgsIMTFzMHA3cnIIFZpbSDeydTBytTFINcg0sXEwcvUz9LFICI6aGVscCDB19TP0tkiCisjCisjIHZhc3NpbHkgInZyIiByYWdvc2luIDx2cnJAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwgMjAwNAorIworIyBPcmlnaW5hbCB0cmFuc2xhdGlvbnMuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0gNi4zYVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNC0wNS0xMCAyMTozNyswNDAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wNS0xMCAyMTozNyswNDAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiB2YXNzaWx5IHJhZ29zaW4gPHZyckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2UtVGVhbTogdmFzc2lseSByYWdvc2luIDx2cnJAdXNlcnMuc291cmNlZm9yZ2UubmV0PlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWtvaTgtclxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYnVmZmVyLmM6MTAyCittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiDuxdfP2s3P1s7PINfZxMXMydTYINDBzdHU2CDEwdbFIMTM0SDPxM7Px88gwtXGxdLBLCDX2cjPxC4uLiIKKworIzogYnVmZmVyLmM6MTA1Cittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4Mzog7sXXz9rNz9bOzyDX2cTFzMnU2CDQwc3R1NggxMzRIMLVxsXSwSwgydPQz8zY2tXFzSDE0tXHz8ogwtXGxdIuLi4iCisKKyM6IGJ1ZmZlci5jOjgwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6IO7JIM/Eyc4gwtXGxdIgzsUgwtnMINfZx9LV1sXOIMnaINDBzdHUySIKKworIzogYnVmZmVyLmM6ODA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MTY6IE5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICJFNTE2OiDuySDPxMnOIMLVxsXSIM7FIMLZzCDVxMHMo84iCisKKyM6IGJ1ZmZlci5jOjgwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiDuySDPxMnOIMLVxsXSIM7FIMLZzCDP3sndxc4iCisKKyM6IGJ1ZmZlci5jOjgxNworbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICLvxMnOIMLVxsXSINfZx9LV1sXOIMnaINDBzdHUySIKKworIzogYnVmZmVyLmM6ODE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgIvfTxcfPINfZx9LV1sXOzyDC1cbF0s/XIMnaINDBzdHUyTogJWQiCisKKyM6IGJ1ZmZlci5jOjgyNAorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIu/Eyc4gwtXGxdIg1cTBzKPOIgorCisjOiBidWZmZXIuYzo4MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICL308XHzyDVxMHMxc7PIMLVxsXSz9c6ICVkIgorCisjOiBidWZmZXIuYzo4MzEKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIu/Eyc4gwtXGxdIgz97J3cXOIgorCisjOiBidWZmZXIuYzo4MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgIvfTxcfPIM/eyd3Fzs8gwtXGxdLP1zogJWQiCisKKyM6IGJ1ZmZlci5jOjg5NAorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IOnazcXOo87O2cggwtXGxdLP1yDOxSDPws7B0tXWxc7PIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTMzCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IOLVxsXS2SDXINPQydPLxSDP1NPV1NPU19XA1CIKKworIzogYnVmZmVyLmM6OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQnVmZmVyICVsZCBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTg2OiDi1cbF0iAlbGQgzsUg09XdxdPU19XF1CIKKworIzogYnVmZmVyLmM6OTQ4Cittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6IPzUzyDQz9PMxcTOycogwtXGxdIiCisKKyM6IGJ1ZmZlci5jOjk1MAorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODog/NTPINDF0tfZyiDC1cbF0iIKKworIzogYnVmZmVyLmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5OiDp2s3FzsXOydEg1yDC1cbF0sUgJWxkIM7FINPPyNLBzsXO2SAoISwg3tTPwtkgz8LPytTJINDSz9fF0svVKSIKKworIzogYnVmZmVyLmM6MTAwNQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiDuxdfP2s3P1s7PINfZx9LV2snU2CDJ2iDQwc3R1Mkg0M/TzMXEzsnKIMLVxsXSIgorCisjOiBidWZmZXIuYzoxNTM4Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDog8NLFxNXQ0sXWxMXOycU6INDF0sXQz8zOxc7JxSDT0MnTy8Egyc2jziDGwcrMz9ciCisKKyM6IGJ1ZmZlci5jOjE3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiDi1cbF0iAlbGQgzsUgzsHKxMXOIgorCisjOiBidWZmZXIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5Mzog7sXTy8/M2MvPINPPz9TXxdTT1NfJyiDEzNEgJXMiCisKKyM6IGJ1ZmZlci5jOjE5NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IO7F1CDTz8/U18XU09TX1cDdxcfPICVzIMLVxsXSwSIKKworIzogYnVmZmVyLmM6MjMzNworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAi09TSz8vBICVsZCIKKworIzogYnVmZmVyLmM6MjQyMAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IOLVxsXSINMg1MHLyc0gyc3FzsXNINXWxSDT1d3F09TX1cXUIgorCisjOiBidWZmZXIuYzoyNzEzCittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBb6drNxc6jzl0iCisKKyM6IGJ1ZmZlci5jOjI3MTgKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIlvuxSDSxcTBy9TJ0s/XwczT0V0iCisKKyM6IGJ1ZmZlci5jOjI3MjMKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJb7s/X2cogxsHKzF0iCisKKyM6IGJ1ZmZlci5jOjI3MjQKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJb79vJwsvJIN7Uxc7J0V0iCisKKyM6IGJ1ZmZlci5jOjI3MjYgZmlsZWlvLmM6MjExMgorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIlvUz8zYy88gxMzRIN7Uxc7J0V0iCisKKyM6IGJ1ZmZlci5jOjI3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICLvxM7BINPU0s/LwSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6Mjc0OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIiVsZCDT1NIuIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzU2CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICLT1NIuICVsZCDJ2iAlbGQgLS0lZCUlLS0gy8/MLiAiCisKKyM6IGJ1ZmZlci5jOjI4NjQKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIlvuxdQgxsHKzMFdIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI5MDQKK21zZ2lkICJoZWxwIgorbXNnc3RyICLT0NLB18vBIgorCisjOiBidWZmZXIuYzozNDYzIHNjcmVlbi5jOjUwNzUKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIlvT0NLB18vBXSIKKworIzogYnVmZmVyLmM6MzQ5NSBzY3JlZW4uYzo1MDgxCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJb8NLFxNDSz9PNz9TSXSIKKworIzogYnVmZmVyLmM6Mzc3NQorbXNnaWQgIkFsbCIKK21zZ3N0ciAi98XT2CIKKworIzogYnVmZmVyLmM6Mzc3NQorbXNnaWQgIkJvdCIKK21zZ3N0ciAi987J2tUiCisKKyM6IGJ1ZmZlci5jOjM3NzcKK21zZ2lkICJUb3AiCittc2dzdHIgIu7B18XSyNUiCisKKyM6IGJ1ZmZlci5jOjQ1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIPPQydPPyyDC1cbF0s/XOlxuIgorCisjOiBidWZmZXIuYzo0NTU2Cittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJb89DJ08/LIM/bycLPy10iCisKKyM6IGJ1ZmZlci5jOjQ1NjkgbWVtbGluZS5jOjE1MjAKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIlvuxdQgxsHKzMFdIgorCisjOiBidWZmZXIuYzo0ODgyCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g+s7B3svJIC0tLSIKKworIzogYnVmZmVyLmM6NDkwMQorIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICL6zsHey8kgxMzRICVzOiIKKworIzogYnVmZmVyLmM6NDkwNworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAg09TSz8vBPSVsZCAgaWQ9JWQgIMnN0T0lcyIKKworIzogZGlmZi5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5Njog88zFxMnU2CDawSDP1MzJ3snRzckgzc/Wzs8gzsUgws/MxcUg3sXNINcgJWxkIMLVxsXSwcgiCisKKyM6IGRpZmYuYzo3MTMKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5Nzog7sXXz9rNz9bOzyDTz9rEwdTYIMbByszZIM/UzMneycoiCisKKyM6IGRpZmYuYzo4MTgKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICLmwcrMLdrB0MzB1MvBIgorCisjOiBkaWZmLmM6MTA2OQorbXNnaWQgIkU5ODogQ2Fubm90IHJlYWQgZGlmZiBvdXRwdXQiCittc2dzdHIgIkU5ODog7sXXz9rNz9bOzyDQ0s/eydTB1Ngg19nXz8Qgy8/Nwc7E2SBkaWZmIgorCisjOiBkaWZmLmM6MTgxOQorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiDhy9TJ187ZyiDC1cbF0iDOxSDOwcjPxMnU09Eg1yDSxdbJzcUgz9TMyd7JyiIKKworIzogZGlmZi5jOjE4MzEKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiDiz8zY28UgzsXUIMLVxsXSz9cg1yDSxdbJzcUgz9TMyd7JyiIKKworIzogZGlmZi5jOjE4MzkKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IPcg0sXWyc3FIM/UzMneycogws/MxcUgxNfVyCDC1cbF0s/XLCDOxSDNz8fVINfZwtLB1NgiCisKKyM6IGRpZmYuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjog7sUgzc/H1SDOwcrUySDC1cbF0iBcIiVzXCIiCisKKyM6IGRpZmYuYzoxODY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzog4tXGxdIgXCIlc1wiIM7FIM7ByM/EydTT0SDXINLF1snNxSDP1MzJ3snKIgorCisjOiBkaWdyYXBoLmM6MjE5OQorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiD8y9LBzsnS1cDdycog08nN18/MIEVzY2FwZSDOxczY2tEgydPQz8zY2s/XwdTYINcgxMnH0sHGxSIKKworIzogZGlncmFwaC5jOjIzODQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IObByswg0yDSwdPLzMHEy8/KIMvMwdfJwdTV0tkgzsUgzsHKxMXOIgorCisjOiBkaWdyYXBoLmM6MjQxMQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTog68/Nwc7EwSA6bG9hZGtleW1hcCDQ0snNxc7FzsEg187FIMbByszBINPDxc7B0snRIgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIOHX1M/Ez9DPzM7FzsnFIMvMwN7F18/HzyDTzM/XwSAoXk5eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FXlleTF5dXkZeSV5LXkReVl5OXlApIgorbXNnc3RyICIg4dfUz8TP0M/MzsXOycUgXlggKF5FXlleTF5dXkZeSV5LXkReVl5OXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk5eUCkiCittc2dzdHIgIiDtxdPUzs/FIMHX1M/Ez9DPzM7FzsnFIMvMwN7F18/HzyDTzM/XwSAoXk5eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5MXk5eUCkiCittc2dzdHIgIiDh19TPxM/Qz8zOxc7JxSDDxczPyiDT1NLPy8kgKF5MXk5eUCkiCisKKyM6IGVkaXQuYzo0NgorbXNnaWQgIiBGaWxlIG5hbWUgY29tcGxldGlvbiAoXkZeTl5QKSIKK21zZ3N0ciAiIOHX1M/Ez9DPzM7FzsnFIMnNxc7JIMbByszBICheRl5OXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dXk5eUCkiCittc2dzdHIgIiDh19TPxM/Qz8zOxc7JxSDNxdTLySAoXl1eTl5QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTl5QKSIKK21zZ3N0ciAiIOHX1M/Ez9DPzM7FzsnFINvBwszPzsEg0NXUySAoXk5eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EXk5eUCkiCittc2dzdHIgIiDh19TPxM/Qz8zOxc7JxSDP0NLFxMXMxc7J0SAoXkReTl5QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXkteTl5QKSIKK21zZ3N0ciAiIOHX1M/Ez9DPzM7FzsnFINDPINPMz9fB0sAgKF5LXk5eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlReTl5QKSIKK21zZ3N0ciAiIOHX1M/Ez9DPzM7FzsnFINPJzs/Oyc3P1yAoXlReTl5QKSIKKworIzogZWRpdC5jOjUzCittc2dpZCAiIENvbW1hbmQtbGluZSBjb21wbGV0aW9uICheVl5OXlApIgorbXNnc3RyICIg4dfUz8TP0M/MzsXOycUgy8/Nwc7Ezs/KINPU0s/LySAoXlZeTl5QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIuvPzsXDIMHC2sHDwSIKKworIzogZWRpdC5jOjk2MgorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAi7sUg2sHEwc7PINrOwd7FzsnFIM/Qw8nJICd0aGVzYXVydXMnIgorCisjOiBlZGl0LmM6MTE2NgorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIu7FINrBxMHOzyDazsHexc7JxSDP0MPJySAnZGljdGlvbmFyeSciCisKKyM6IGVkaXQuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICLw0s/Tzc/U0iDTzM/XwdLROiAlcyIKKworIzogZWRpdC5jOjIzNjgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAo19PUwdfLwSkg8NLPy9LV1MvBICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzcwCittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICjawc3FzsEpIPDSz8vS1dTLwSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZzogJXMiCittc2dzdHIgIvDSz9PNz9TSOiAlcyIKKworIzogZWRpdC5jOjI3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIvfZ0M/MztHF1NPRINDPydPLINPSxcTJIM3F1M/LLiIKKworIzogZWRpdC5jOjMzODEKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIg5M/CwdfMxc7JxSIKKworIy4gc2hvd21vZGUgbWlnaHQgcmVzZXQgdGhlIGludGVybmFsIGxpbmUgcG9pbnRlcnMsIHNvIGl0IG11c3QKKyMuICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisjLiAqIGxvbmdlciBuZWVkZWQuICAtLSBBY2V2ZWRvLgorIy4KKyM6IGVkaXQuYzozNDMwCittc2dpZCAiLS0gU2VhcmNoaW5nLi4uIgorbXNnc3RyICItLSDwz8nTyy4uLiIKKworIzogZWRpdC5jOjM0ODYKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICLp08jPxM7PxSDTzM/XzyIKKworIzogZWRpdC5jOjM0OTEKK21zZ2lkICJXb3JkIGZyb20gb3RoZXIgbGluZSIKK21zZ3N0ciAi88zP188gydogxNLVx8/KINPU0s/LySIKKworIzogZWRpdC5jOjM0OTYKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAi5cTJztPU18XOzs/FINPPz9TXxdTT1NfJxSIKKworIzogZWRpdC5jOjM1NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgItPPz9TXxdTT1NfJxSAlZCDJ2iAlZCIKKworIzogZWRpdC5jOjM1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgItPPz9TXxdTT1NfJxSAlZCIKKworIy4gU2tpcCBmdXJ0aGVyIGFyZ3VtZW50cyBidXQgZG8gY29udGludWUgdG8KKyMuICogc2VhcmNoIGZvciBhIHRyYWlsaW5nIGNvbW1hbmQuCisjOiBldmFsLmM6MTAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IO7FydrXxdPUzsHRINDF0sXNxc7OwdE6IFwiJXNcIiIKKworIzogZXZhbC5jOjEzMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiDw0s/Q1d3Fztkg08vPwsvJOiAlcyIKKworIzogZXZhbC5jOjE0MzUgZXZhbC5jOjE0NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiDuxdQg1MHLz8og0MXSxc3Fzs7PyjogXCIlc1wiIgorCisjOiBldmFsLmM6MTcwNQorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTog8NLP0NXdxc7PICc6JyDQz9PMxSAnPyciCisKKyM6IGV2YWwuYzoyMzI3Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IPDSz9DV3cXOwSAnKSciCisKKyM6IGV2YWwuYzoyMzg5Cittc2dpZCAiRTExMTogTWlzc2luZyAnXSciCittc2dzdHIgIkUxMTE6IPDSz9DV3cXOwSAnXSciCisKKyM6IGV2YWwuYzoyNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiDuxSDVy8Hawc7PIMnN0SDP0MPJyTogJXMiCisKKyM6IGV2YWwuYzoyNDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzog7sXJ2tfF09TOwdEgz9DDydE6ICVzIgorCisjOiBldmFsLmM6MjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDog8NLP0NXdxc7BIMvB19ney8E6ICVzIgorCisjOiBldmFsLmM6MjY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTog8NLP0NXdxc7BIMvB19ney8E6ICVzIgorCisjOiBldmFsLmM6MzA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IPDB0sHNxdTS2SDEzNEgxtXOy8PJySAlcyDawcTBztkgzsXXxdLOzyIKKworIzogZXZhbC5jOjMwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IO7FydrXxdPUzsHRIMbVzsvDydE6ICVzIgorCisjOiBldmFsLmM6MzA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODog88zJ28vPzSDNzs/HzyDQwdLBzcXU0s/XIMTM0SDG1c7Lw8nJICVzIgorCisjOiBldmFsLmM6MzA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiDuxcTP09TB1M/ezs8g0MHSwc3F1NLP1yDEzNEgxtXOy8PJySAlcyIKKworIzogZXZhbC5jOjMwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiA8U0lEPiDJ09DPzNja1cXU09Eg187FINPDxc7B0snROiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzY4NyBndWkuYzo0MzgyIGd1aV9ndGsuYzoyMDU5Cittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGV2YWwuYzo0MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkINPU0s/LOiAiCisKKyM6IGV2YWwuYzo1NDc3Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT0tcbiIKKyLvJtTNxc7BIgorCisjOiBldmFsLmM6NTUxNworbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgIubVzsvDydEgaW5wdXRyZXN0b3JlKCkg19na2dfBxdTT0SDewd3FLCDexc0gxtXOy8PJ0SBpbnB1dHNhdmUoKSIKKworIzogZXZhbC5jOjU5NzcKK21zZ2lkICJFNjU1OiBUb28gbWFueSBzeW1ib2xpYyBsaW5rcyAoY3ljbGU/KSIKK21zZ3N0ciAiRTY1Njog88zJ28vPzSDNzs/HzyDTyc3Xz8zJ3sXTy8nIINPT2czPyyAow8nLzD8pIgorCisjOiBldmFsLmM6NjYwOQorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDog7sXUINPX0drJINMg08XS18XSz80gVmltIgorCisjOiBldmFsLmM6NjcwNgorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjI3OiDzxdLXxdIgzsUgz9TXxd7BxdQiCisKKyM6IGV2YWwuYzo2NzM0Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiDuxSDNz8fVIM/U18XUydTYIMvMycXO1NUiCisKKyM6IGV2YWwuYzo2NzgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiDuxSDNz8fVIM/U0NLB18nU2CDTz8/C3cXOycUgxMzRICVzIgorCisjOiBldmFsLmM6Njg4MgorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKO7F0NLB18nM2M7PKSIKKworIzogZXZhbC5jOjgwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTog7sXP0NLFxMXMxc7OwdEg0MXSxc3Fzs7B0TogJXMiCisKKyM6IGV2YWwuYzo4NDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IO7FxM/Q1dPUyc3PxSDJzdEg0MXSxc3Fzs7PyjogJXMiCisKKyM6IGV2YWwuYzo4Nzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTIyOiDm1c7Lw8nRICVzINXWxSDT1d3F09TX1cXULiDkz8LB19jUxSAhLCDe1M/C2SDawc3FzsnU2CDFoy4iCisKKyM6IGV2YWwuYzo4ODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IO7Fz9DSxcTFzMXOzsHRIMbVzsvDydE6ICVzIgorCisjOiBldmFsLmM6ODg3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IPDSz9DV3cXOwSAnKCc6ICVzIgorCisjOiBldmFsLmM6ODkwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI1OiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTEyNTog7sXEz9DV09TJzdnKINDB0sHNxdTSOiAlcyIKKworIzogZXZhbC5jOjg5ODIKK21zZ2lkICJFMTI2OiBNaXNzaW5nIDplbmRmdW5jdGlvbiIKK21zZ3N0ciAiRTEyNjog8NLP0NXdxc7BIMvPzcHOxMEgOmVuZGZ1bmN0aW9uIgorCisjOiBldmFsLmM6OTA4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI3OiBDYW5ub3QgcmVkZWZpbmUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEyNzog7sXXz9rNz9bOzyDQxdLFz9DSxcTFzMnU2CDG1c7Lw8nAICVzLCDPzsEgydPQz8zY2tXF1NPRIgorCisjOiBldmFsLmM6OTE1OQorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IPTSxcLVxdTT0SDJzdEgxtXOy8PJySIKKworIzogZXZhbC5jOjkyMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODog6c3RIMbVzsvDyckgxM/M1s7PIM7B3snOwdTY09Eg0yDQ0s/QydPOz8ogwtXL19k6ICVzIgorCisjOiBldmFsLmM6OTQwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiDm1c7Lw8nRICVzIM7FIM/Q0sXExczFzsEiCisKKyM6IGV2YWwuYzo5NDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTog7sXXz9rNz9bOzyDVxMHMydTYIMbVzsvDycAgJXMsIM/OwSDJ09DPzNja1cXU09EiCisKKyM6IGV2YWwuYzo5NDU1Cittc2dpZCAiRTEzMjogRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIKK21zZ3N0ciAiRTEzMjog58zVwsnOwSDX2drP18EgxtXOy8PJySDCz8zY28UsIN7FzSDazsHexc7JxSAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6OTUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICLX2drP1yAlcyIKKworIzogZXZhbC5jOjk1NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgYWJvcnRlZCIKK21zZ3N0ciAiJXMg0NLF0tfBzsEiCisKKyM6IGV2YWwuYzo5NTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICIlcyDXz9rX0sHdwcXUICMlbGQiCisKKyM6IGV2YWwuYzo5NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzINfP2tfSwd3BxdQgXCIlc1wiIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NTk1IGV4X2NtZHMyLmM6MjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICLQ0s/Ez8zWxc7JxSDXICVzIgorCisjOiBldmFsLmM6OTYyMQorbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiDLz83BzsTBIDpyZXR1cm4g187FIMbVzsvDyckiCisKKyM6IGV2YWwuYzo5OTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIMfMz8LBzNjO2cUg0MXSxc3Fzs7ZxTpcbiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorCisjOiBleF9jbWRzLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwNHgsIE9jdGFsICVvIgorCisjOiBleF9jbWRzLmM6MTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIj4gJWQsIEhleCAlMDh4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwOHgsIE9jdGFsICVvIgorCisjOiBleF9jbWRzLmM6NDMwCittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IPPU0s/LySDQxdLFzcXdwcDU09Eg08HNySDOwSDTxcLRIgorCisjOiBleF9jbWRzLmM6NDk5Cittc2dpZCAiMSBsaW5lIG1vdmVkIgorbXNnc3RyICLwxdLFzcXdxc7BIM/EzsEg09TSz8vBIgorCisjOiBleF9jbWRzLmM6NTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAi8MXSxc3F3cXOzyDT1NLPyzogJWxkIgorCisjOiBleF9jbWRzLmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAi8NLP0NXdxc7PIN7F0sXaIMbJzNjU0iDT1NLPyzogJWxkIgorCisjOiBleF9jbWRzLmM6OTUyCittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTog4dfUz8vPzcHOxNkgKkZpbHRlciogzsUgxM/M1s7ZIMnazcXO0dTYIMHL1MnXztnKIMLVxsXSIgorCisjOiBleF9jbWRzLmM6MTAzNworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW+nazcXOxc7J0SDOxSDTz8jSwc7FztldXG4iCisKKyM6IGV4X2NtZHMuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzINcg09TSz8vFOiAiCisKKyM6IGV4X2NtZHMuYzoxMjg4Cittc2dpZCAiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiCittc2dzdHIgIiIKKyJFMTM2OiB2aW1pbmZvOiDzzMnby8/NIM3Oz8fPIM/bycLPyywgz9PUwczYzsHRIN7B09TYIMbByszBIMLVxMXUINDSz9DV3cXOwSIKKworIzogZXhfY21kcy5jOjEzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICL+1MXOycUgxsHKzMEgdmltaW5mbyBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiDJzsbPIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIM/UzcXUz8siCisKKyM6IGV4X2NtZHMuYzoxMzI2Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIO7l9eTh/u7vIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzog8NLB18EgzsEg2sHQydPYIMbByszBIHZpbWluZm8gz9TT1dTT1NfVwNQ6ICVzIgorCisjOiBleF9jbWRzLmM6MTU0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiDuxdfP2s3P1s7PINrB0MnTwdTYIMbByswgdmltaW5mbyAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi+sHQydPYIMbByszBIHZpbWluZm8gXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMg/NTP1CDGwcrMIHZpbWluZm8gwdfUz83B1MnexdPLySDTz9rEwc4gVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIOXHzyDNz9bOzyAoz9PUz9LP1s7PISkg0sXEwcvUydLP18HU2C5cbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMg+s7B3sXOycUgz9DDyckgJ2VuY29kaW5nJyDXIM3PzcXO1CDawdDJ08kgxsHKzMFcbiIKKworIzogZXhfY21kcy5jOjE3NTIKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIu7FxM/Q1dPUyc3ZyiDOwd7BzNjO2cog08nN18/MIgorCisjOiBleF9jbWRzLmM6MjA5NyBleF9jbWRzLmM6MjM2MiBleF9jbWRzMi5jOjc2MworbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIvPPyNLBzsnU2CDLwcsiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjE0MAorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiDmwcrMINrBx9LV1sXOINcgxNLVx8/NIMLVxsXSxSIKKworIzogZXhfY21kcy5jOjIxNzQKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICL6wdDJ08HU2CDGwcrMIN7B09TJ3s7PPyIKKworIzogZXhfY21kcy5jOjIxODEKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDog5MzRINrB0MnTySDewdPUySDC1cbF0sEgydPQz8zY2tXK1MUgISIKKworIzogZXhfY21kcy5jOjIyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICLwxdLF0MnTwdTYINPV3cXT1NfVwN3JyiDGwcrMIFwiJS4qc1wiPyIKKworIzogZXhfY21kcy5jOjIzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiDi1cbF0iAlbGQgzsUg09fR2sHOINMgyc3FzsXNIMbByszBIgorCisjOiBleF9jbWRzLmM6MjQwNQorbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IObByswgzsUg08/I0sHOo846INrB0MnT2CDP1MvMwN7FzsEgz9DDycXKICd3cml0ZSciCisKKyM6IGV4X2NtZHMuYzoyNDI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyLkzNEgXCIlLipzXCIg18vMwN7FzsEgz9DDydEgJ3JlYWRvbmx5Jy5cbiIKKyL6wdDJ08HU2D8iCisKKyM6IGV4X2NtZHMuYzoyNTk3Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICLyxcTBy9TJ0s/Xwc7JxSDGwcrMwSIKKworIzogZXhfY21kcy5jOjMyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IOHX1M/Lz83BzsTZIM7Fz9bJxMHOzs8g1cLJzMkgzs/X2cogwtXGxdIgJXMiCisKKyM6IGV4X2NtZHMuYzozMzM5Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IPDB0sHNxdTSIMvPzcHOxNkgOnogxM/M1sXOIMLZ1Ngg3snTzM/NIgorCisjOiBleF9jbWRzLmM6MzQyNAorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IOnT0M/M2NrP18HOycUgy8/Nwc7EIM/Cz8zP3svJIM7FIMTP0NXTy8HF1NPRINcgcnZpbS4iCisKKyM6IGV4X2NtZHMuYzozNTMxCittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0Njog8sXH1czR0s7ZxSDX2dLB1sXOydEgzsUgzc/H1dQg0sHaxMXM0dTY09EgwtXL18HNySIKKworIzogZXhfY21kcy5jOjM4NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAi2sHNxc7J1NggzsEgJXM/ICh5L24vYS9xL2wvXkUvXlkpIgorCisjOiBleF9jbWRzLmM6NDI3MAorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIo8NLF0tfBzs8pIgorCisjOiBleF9jbWRzLmM6NDI3NAorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICLvxM7BINrBzcXOwSIKKworIzogZXhfY21kcy5jOjQyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCDawc3FziIKKworIzogZXhfY21kcy5jOjQyNzkKK21zZ2lkICIgb24gMSBsaW5lIgorbXNnc3RyICIg1yDPxM7PyiDT1NLPy8UiCisKKyM6IGV4X2NtZHMuYzo0MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiDXICVsZCDT1NIuIgorCisjOiBleF9jbWRzLmM6NDMzMgorbXNnaWQgIkUxNDc6IENhbm5vdCBkbyA6Z2xvYmFsIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE0Nzog68/Nwc7EwSA6Z2xvYmFsIM7FIM3P1sXUIMLZ1Ngg0sXL1dLTydfOz8oiCisKKyM6IGV4X2NtZHMuYzo0MzY3Cittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IPcgy8/Nwc7ExSA6Z2xvYmFsINDSz9DV3cXOzyDSxcfVzNHSzs/FINfZ0sHWxc7JxSIKKworIzogZXhfY21kcy5jOjQ0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAi88/P1NfF1NPU18nFINvBwszPztUgzsHKxMXOzyDOwSDLwdbEz8og09TSz8vFOiAlcyIKKworIzogZXhfY21kcy5jOjQ0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyDwz9PMxcTO0dEg09TSz8vBIMTM0SDawc3Fztk6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ1OTgKK21zZ2lkICJFNDc4OiBEb24ndCBwYW5pYyEiCittc2dzdHIgIkU0Nzg6IPPQz8vPytPU18nFLCDUz8zYy88g09DPy8/K09TXycUhIgorCisjOiBleF9jbWRzLmM6NDY1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjYxOiBTb3JyeSwgbm8gJyVzJyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTY2MTogyyDTz9bBzMXOycAsINPQ0sHXy8EgJyVzJyDEzNEgJXMgz9TT1dTT1NfVxdQiCisKKyM6IGV4X2NtZHMuYzo0NjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTog6yDTz9bBzMXOycAg09DSwdfLwSDEzNEgJXMgz9TT1dTT1NfVxdQiCisKKyM6IGV4X2NtZHMuYzo0Njg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAi6drXyc7J1MUsIMbByswg09DSwdfLySBcIiVzXCIgzsUgzsHKxMXOIgorCisjOiBleF9jbWRzLmM6NTE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiAlcyDOxSDR18zRxdTT0SDLwdTBzM/Hz80iCisKKyM6IGV4X2NtZHMuYzo1MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiDuxdfP2s3P1s7PIM/Uy9LZ1NggJXMgxMzRINrB0MnTySIKKworIzogZXhfY21kcy5jOjUzNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6IO7F18/azc/Wzs8gz9TL0tnU2CAlcyDEzNEg3tTFzsnRIgorCisjOiBleF9jbWRzLmM6NTM2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjcwOiBNaXggb2YgaGVscCBmaWxlIGVuY29kaW5ncyB3aXRoaW4gYSBsYW5ndWFnZTogJXMiCittc2dzdHIgIkU2NzA6IObByszZINPQ0sHXy8kgydPQz8zY2tXA1CDSwdrO2cUgy8/EydLP18vJIMTM0SDPxM7Px88g0drZy8E6ICVzIgorCisjOiBleF9jbWRzLmM6NTQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiDwz9fUz9LRwN3B0dPRIM3F1MvBIFwiJXNcIiDXIMbByszFICVzIgorCisjOiBleF9jbWRzLmM6NTU1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IO7FydrXxdPUzsHRIMvPzcHOxMEg2s7B3svBICVzIgorCisjOiBleF9jbWRzLmM6NTU3NworbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiDw0s/Q1d3Fzs8gyc3RINrOwd7LwSIKKworIzogZXhfY21kcy5jOjU2MjMKK21zZ2lkICJFNjEyOiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFNjEyOiDv0NLFxMXMxc7PINPMydvLz80gzc7Px88g2s7B3svP1yIKKworIzogZXhfY21kcy5jOjU2OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiDuxdDSwdfJzNjO2cog1MXL09Qg2s7B3svBOiAlcyIKKworIzogZXhfY21kcy5jOjU3MjIgZXhfY21kcy5jOjU5MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTog7sXJ2tfF09TO2cog2s7B3s/LOiAlcyIKKworIzogZXhfY21kcy5jOjU3NzEKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiDw0s/Q1d3FziDOz83F0iDazsHey8EiCisKKyM6IGV4X2NtZHMuYzo1ODUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiDuxdDSwdfJzNjOz8Ugyc3RIMLVxsXSwTogJXMiCisKKyM6IGV4X2NtZHMuYzo1ODkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiDuxdDSwdfJzNjO2cogSUQg2s7B3svBOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1OTYyCittc2dpZCAiIChOT1QgRk9VTkQpIgorbXNnc3RyICIgKO7lIO7h6uTl7u8pIgorCisjOiBleF9jbWRzLmM6NTk2NAorbXNnaWQgIiAobm90IHN1cHBvcnRlZCkiCittc2dzdHIgIiAozsUg0M/ExMXS1snXwcXU09EpIgorCisjOiBleF9jbWRzLmM6NjA2MworbXNnaWQgIltEZWxldGVkXSIKK21zZ3N0ciAiW/XEwczFzs9dIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICL3y8zA3qPOINLF1snNIM/UzMHEy8kuIOTM0SDQ0s/Ez8zWxc7J0SDOwcLF0snUxSBcImNvbnRcIiIKKworIzogZXhfY21kczIuYzo5NiBleF9kb2NtZC5jOjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgItPU0s/LwSAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgIsvPzcHOxME6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICL0z97LwSDP09TBzs/Xy8kg1yBcIiVzJXNcIiDT1NIuICVsZCIKKworIzogZXhfY21kczIuYzo1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiD0z97LwSDP09TBzs/Xy8kgzsUgzsHKxMXOwTogJXMiCisKKyM6IGV4X2NtZHMyLmM6NTY2Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAi9M/ey8kgz9PUwc7P18vJIM7FIM/Q0sXExczFztkiCisKKyM6IGV4X2NtZHMyLmM6NTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiUzZCAgJXMgJXMgIGxpbmUgJWxkIgorbXNnc3RyICIlM2QgICVzICVzINPU0i4gJWxkIgorCisjOiBleF9jbWRzMi5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICLzz8jSwc7J1NggydrNxc7FzsnRINcgXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkzNzgKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAi4sXaIMnNxc7JIgorCisjOiBleF9jbWRzMi5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2Mjog7sXTz8jSwc6jzs7ZxSDJ2s3FzsXOydEg1yDC1cbF0sUgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjk4NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiIgorIvDSxcTV0NLF1sTFzsnFOiDuxc/WycTBzs7ZyiDQxdLFyM/EINcgxNLVx8/KIMLVxsXSICjQ0s/XxdLY1MUgwdfUz8vPzcHOxNkpIgorCisjOiBleF9jbWRzMi5jOjEzODcKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IOTM0SDSxcTBy9TJ0s/Xwc7J0SDEz9PU1dDFziDUz8zYy88gz8TJziDGwcrMIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IPzUzyDQxdLX2cogxsHKzCIKKworIzogZXhfY21kczIuYzoxMzkxCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6IPzUzyDQz9PMxcTOycogxsHKzCIKKworIzogZXhfY21kczIuYzoxODA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NjY6IGNvbXBpbGVyIG5vdCBzdXBwb3J0ZWQ6ICVzIgorbXNnc3RyICJFNjY2OiDLz83QyczR1M/SIM7FINDPxMTF0tbJ18HF1NPROiAlcyIKKworIzogZXhfY21kczIuYzoxODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAi8M/J08sgXCIlc1wiINcgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIiCittc2dzdHIgIvDPydPLIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIs7FIM7BysTFzs8g1yAncnVudGltZXBhdGgnOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTk3NAorbXNnaWQgIlNvdXJjZSBWaW0gc2NyaXB0IgorbXNnc3RyICL32dDPzM7J1Ngg08PFzsHSycogVmltIgorCisjOiBleF9jbWRzMi5jOjIxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICLuxczY2tEg097J1MHU2CDLwdTBzM/HOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIwMgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAizsXXz9rNz9bOzyDT3snUwdTYIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAi09TSz8vBICVsZDogzsXXz9rNz9bOzyDT3snUwdTYIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMjE4CisjLCBjLWZvcm1hdAorbXNnaWQgInNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAi097J1NnXwc7JxSDTw8XOwdLJ0SBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLT1NLPy8EgJWxkOiDT3snU2dfBzsnFIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICLT3snU2dfBzsnFINPDxc7B0snRICVzINrB18XS28XOzyIKKworIzogZXhfY21kczIuYzoyNzA3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIiIKKyJXMTU6IPDSxcTV0NLF1sTFzsnFOiDOxdDSwdfJzNjO2cog0sHaxMXMydTFzNgg09TSz8vJLiD3z9rNz9bOzyDQ0s/Q1d3Fzs8gXk0iCisKKyM6IGV4X2NtZHMyLmM6Mjc1NgorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IOvPzcHOxMEgOnNjcmlwdGVuY29kaW5nIMnT0M/M2NrVxdTT0SDXzsUgxsHKzMEg08PFzsHSydEiCisKKyM6IGV4X2NtZHMyLmM6Mjc4OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiDrz83BzsTBIDpmaW5pc2ggydPQz8zY2tXF1NPRINfOxSDGwcrMwSDTw8XOwdLJ0SIKKworIzogZXhfY21kczIuYzozMjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIvPU0sHOycPBICVkIgorCisjOiBleF9jbWRzMi5jOjMzOTQKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIvDF3sHUwdTYIM7F3sXHzyIKKworIzogZXhfY21kczIuYzozNDcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICLwxd7B1Ngg09TSLiAlZCAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MzQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiIOvP0MnRICVkIMnaICVkIgorCisjOiBleF9jbWRzMi5jOjM1NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIu7B0MXewdTBzs86ICVzIgorCisjOiBleF9jbWRzMi5jOjM1NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAi8MXewdTYINDSxcvSwd3FzsEiCisKKyM6IGV4X2NtZHMyLmM6MzkxNAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTog79vJwsvBINrB0MnTySDXIMbByswgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo0MTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjQ6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU2MjQ6IO7F18/azc/Wzs8gz9TL0tnU2CDGwcrMIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MTk5IGV4X2NtZHMyLmM6NDgyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IO7F18/azc/Wzs8g0NLP3snUwdTYIMbByswg0sXT1dLTz9cgUG9zdFNjcmlwdCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDIwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNjE4OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUiCittc2dzdHIgIkU2MTg6IMbByswgXCIlc1wiIM7FINHXzNHF1NPRIMbByszPzSDSxdPV0tPP1yBQb3N0U2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjQyMjIgZXhfY21kczIuYzo0MjQyIGV4X2NtZHMyLmM6NDI1NyBleF9jbWRzMi5jOjQyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOTogZmlsZSBcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSIKK21zZ3N0ciAiRTYxOTogxsHKzCBcIiVzXCIgzsUg0dfM0cXU09EgxM/Q1dPUyc3ZzSDGwcrMz80g0sXT1dLTz9cgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo0MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjE6IFwiJXNcIiByZXNvdXJjZSBmaWxlIGhhcyB3cm9uZyB2ZXJzaW9uIgorbXNnc3RyICJFNjIxOiDGwcrMINLF09XS08/XIFwiJXNcIiDOxcna18XT1M7PyiDXxdLTyckiCisKKyM6IGV4X2NtZHMyLmM6NDc3NgorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDog7sXXz9rNz9bOzyDP1MvS2dTYIMbByswgUG9zdFNjcmlwdCIKKworIzogZXhfY21kczIuYzo0ODA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IO7F18/azc/Wzs8gz9TL0tnU2CDGwcrMIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0OTI4Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCJwcm9sb2cucHNcIiIKK21zZ3N0ciAiRTQ1Njog5sHKzCDSxdPV0tPP1yBQb3N0U2NyaXB0IFwicHJvbG9nLnBzXCIgzsUgzsHKxMXOIgorCisjOiBleF9jbWRzMi5jOjQ5NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIgorbXNnc3RyICJFNDU2OiDmwcrMINLF09XS08/XIFBvc3RTY3JpcHQgXCIlcy5wc1wiIM7FIM7BysTFziIKKworIzogZXhfY21kczIuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjA6IFVuYWJsZSB0byBjb252ZXJ0IGZyb20gbXVsdGktYnl0ZSB0byBcIiVzXCIgZW5jb2RpbmciCittc2dzdHIgIiIKKyJFNjIwOiDw0sXPwtLB2s/Xwc7JxSDJ2iDN1czY1MnCwcrUztnIINPJzdfPzM/XINcgy8/EydLP18vVIFwiJXNcIiDOxdfP2s3P1s7PIgorCisjOiBleF9jbWRzMi5jOjUxMDIKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIu/U0NLB18vBIM7BINDF3sHU2C4uLiIKKworIzogZXhfY21kczIuYzo1MTA2Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTog7sUg1cTBzM/T2CDX2dDPzM7J1Ngg0MXewdTYIMbByszBIFBvc3RTY3JpcHQiCisKKyM6IGV4X2NtZHMyLmM6NTEwOAorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAi+sHEwc7JxSDOwSDQxd7B1Nggz9TQ0sHXzMXOzy4iCisKKyM6IGV4X2NtZHMyLmM6NTYxOAorIywgYy1mb3JtYXQKK21zZ2lkICJDdXJyZW50ICVzbGFuZ3VhZ2U6IFwiJXNcIiIKK21zZ3N0ciAi4cvUydfO2cogJXPR2tnLOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NTYyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5Nzog7sXXz9rNz9bOzyDTzcXOydTYINHa2csgzsEgXCIlc1wiIgorCisjOiBleF9kb2NtZC5jOjUyNQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICLwxdLFyM/EINcg0sXWyc0gRXguIOTM0SDQxdLFyM/EwSDXIO/C2d7O2cog0sXWyc0gzsHCxdLJ1MUgXCJ2aXN1YWxcIiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTYxCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IPcgy8/Ow8UgxsHKzMEiCisKKyM6IGV4X2RvY21kLmM6NjY5Cittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBDzMnby8/NINLFy9XS08nXzsHRIMvPzcHOxMEiCisKKyM6IGV4X2RvY21kLmM6MTIyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA1OiBFeGNlcHRpb24gbm90IGNhdWdodDogJXMiCittc2dzdHIgIkU2MDU6IOnTy8zA3snUxczYzsHRINPJ1NXBw8nRIM7FIM/C0sHCz9TBzsE6ICVzIgorCisjOiBleF9kb2NtZC5jOjEzMTcKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICLrz87FwyDT3snUwc7Oz8fPIMbByszBIgorCisjOiBleF9kb2NtZC5jOjEzMTgKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIuvPzsXDIMbVzsvDyckiCisKKyM6IGV4X2RvY21kLmM6MTkwNworbXNnaWQgIkU0NjQ6IEFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgIkU0NjQ6IO7Fz8TOz9rOwd7Oz8UgydPQz8zY2s/Xwc7JxSDLz83BzsTZINDPzNjaz9fB1MXM0SIKKworIzogZXhfZG9jbWQuYzoxOTIxCittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFNDkyOiD81M8gzsUgy8/Nwc7EwSDSxcTBy9TP0sEiCisKKyM6IGV4X2RvY21kLmM6MjAyOAorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5Mzog+sHEwc4gz8LSwdTO2cogxMnB0MHaz84iCisKKyM6IGV4X2RvY21kLmM6MjAzNworbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAi+sHEwc4gz8LSwdTO2cogxMnB0MHaz84sIM3FztHFzSDH0sHOycPZIM3F09TBzckiCisKKyM6IGV4X2RvY21kLmM6MjE2MAorbXNnaWQgIkU0OTQ6IFVzZSB3IG9yIHc+PiIKK21zZ3N0ciAiRTQ5NDog6dPQz8zY2tXK1MUgdyDJzMkgdz4+IgorCisjOiBleF9kb2NtZC5jOjM3ODYKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IOna18nOydTFLCDc1MEgy8/Nwc7EwSDOxcTP09TV0M7BINcgxMHOzs/KINfF0tPJySIKKworIzogZXhfZG9jbWQuYzozOTg5Cittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IPLB2tLF28XOzyDJ09DPzNjaz9fB1Ngg1M/M2MvPIM/Ezs8gyc3RIMbByszBIgorCisjOiBleF9kb2NtZC5jOjQ1NjkKK21zZ2lkICIxIG1vcmUgZmlsZSB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICIxIMbByswgz9bJxMHF1CDSxcTBy9TJ0s/Xwc7J0S4g99nK1Mk/IgorCisjOiBleF9kb2NtZC5jOjQ1NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICLl09TYIM7Fz9TSxcTBy9TJ0s/Xwc7O2cUgxsHKzNkgKCVkKS4g99nK1Mk/IgorCisjOiBleF9kb2NtZC5jOjQ1NzkKK21zZ2lkICJFMTczOiAxIG1vcmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTczOiAxIMbByswgz9bJxMHF1CDSxcTBy9TJ0s/Xwc7J0S4iCisKKyM6IGV4X2RvY21kLmM6NDU4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiDl09TYIM7Fz9TSxcTBy9TJ0s/Xwc7O2cUgxsHKzNkgKCVkKS4iCisKKyM6IGV4X2RvY21kLmM6NDY3NgorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxNzQ6IOvPzcHOxMEg1dbFINPV3cXT1NfVxdQuIOTPwsHX2NTFICEgxMzRINrBzcXO2S4iCisKKyM6IGV4X2RvY21kLmM6NDc4NworbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICDpzdEgICAgICDwwdLBzS4g5MnB0C4g5M/Qz8zOLiAgICDv0NLFxMXMxc7JxSIKKworIzogZXhfZG9jbWQuYzo0ODc2Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICLrz83BzsTZLCDP0NLFxMXMo87O2cUg0M/M2NrP18HUxczFzSwgzsUgz8LOwdLV1sXO2S4iCisKKyM6IGV4X2RvY21kLmM6NDkwOAorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6INDB0sHNxdTSIM7FINrBxMHOIgorCisjOiBleF9kb2NtZC5jOjQ5NjAKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IO7F0NLB18nM2M7PxSDLz8zJ3sXT1NfPINDB0sHNxdTSz9ciCisKKyM6IGV4X2RvY21kLmM6NDk3NQorbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IP7J08zPLdDSydPUwdfL1SDOxczY2tEg1cvB2tnXwdTYIMTXwdbE2SIKKworIzogZXhfZG9jbWQuYzo0OTg1Cittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODog7sXQ0sHXyczYzs/FINrOwd7FzsnFIN7J08zBLdDSydPUwdfLySDQzyDVzc/M3sHOycAiCisKKyM6IGV4X2RvY21kLmM6NTAxNgorbXNnaWQgIkUxNzk6IGFyZ3VtZW50IHJlcXVpcmVkIGZvciBjb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogxMzRINrB18XS28XOydEg1NLFwtXF1NPRINXLwdrB1Ngg0MHSwc3F1NIiCisKKyM6IGV4X2RvY21kLmM6NTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDog7sXQ0sHXyczYzs/FINrOwd7FzsnFIMTP0M/MzsXOydE6ICVzIgorCisjOiBleF9kb2NtZC5jOjUwNTcKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIiIKKyJFNDY4OiDwwdLBzcXU0iDB19TPxM/Qz8zOxc7J0SDNz9bOzyDJ09DPzNjaz9fB1Ngg1M/M2MvPINMgz9PPwtnNIMTP0M/MzsXOycXNIgorCisjOiBleF9kb2NtZC5jOjUwNjMKK21zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgorbXNnc3RyICJFNDY3OiDv08/Cz8UgxM/Qz8zOxc7JxSDU0sXC1cXUINXLwdrBzsnRINDB0sHNxdTSwSDG1c7Lw8nJIgorCisjOiBleF9kb2NtZC5jOjUwNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiDuxdDSwdfJzNjO2cogwdTSycLV1DogJXMiCisKKyM6IGV4X2RvY21kLmM6NTExNworbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiDuxdDSwdfJzNjOz8Ugyc3RIMvPzcHOxNkiCisKKyM6IGV4X2RvY21kLmM6NTEzMgorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiRTE4Mzog68/Nwc7EwSDQz8zY2s/XwdTFzNEgxM/M1s7BIM7B3snOwdTY09Eg0yDawcfMwdfOz8ogwtXL19kiCisKKyM6IGV4X2RvY21kLmM6NTIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDog7sXUINTBy8/KIMvPzcHOxNkg0M/M2NrP18HUxczROiAlcyIKKworIzogZXhfZG9jbWQuYzo1NjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTog49fF1M/XwdEg08jFzcEgJXMgzsUgzsHKxMXOwSIKKworIzogZXhfZG9jbWQuYzo1NjcyCittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIvDSydfF1Cwg0M/M2NrP18HUxczYIFZpbSEiCisKKyM6IGV4X2RvY21kLmM6NjM4OQorbXNnaWQgIkVkaXQgRmlsZSBpbiBuZXcgd2luZG93IgorbXNnc3RyICLyxcTBy9TJ0s/XwdTYIMbByswg1yDOz9fPzSDPy87FIgorCisjOiBleF9kb2NtZC5jOjY2ODQKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIuLF2iDT18/QLcbByszBIgorCisjOiBleF9kb2NtZC5jOjY3ODgKK21zZ2lkICJBcHBlbmQgRmlsZSIKK21zZ3N0ciAi5M/CwdfJ1NggxsHKzCIKKworIzogZXhfZG9jbWQuYzo2ODUyCittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiDuxdQg0NLFxNnE1d3Fx88gy8HUwczPx8EiCisKKyM6IGV4X2RvY21kLmM6NjkzNAorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IO7FydrXxdPUzs8iCisKKyM6IGV4X2RvY21kLmM6NzAxOQorbXNnaWQgIkU0NjU6IDp3aW5zaXplIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY1OiDLz83BzsTBIDp3aW5zaXplINTSxcLVxdQg1cvB2sHOydEgxNfVyCDeydPMz9fZyCDQwdLBzcXU0s/XIgorCisjOiBleF9kb2NtZC5jOjcwNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICLwz8zP1sXOycUgz8vOwTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo3MDgwCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIkUxODg6IPcgxMHOzs/KINPJ09TFzcUgz9DSxcTFzMXOycUg0M/Mz9bFzsnRIM/LzsEgzsUg0sHCz9TBxdQiCisKKyM6IGV4X2RvY21kLmM6NzA5MAorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IMvPzcHOxMEgOndpbnBvcyDU0sXC1cXUINXLwdrBzsnRIMTX1cgg3snTzM/X2cgg0MHSwc3F1NLP1yIKKworIzogZXhfZG9jbWQuYzo3MzY4Cittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAi8MXSxc7B0NLB18zFzsnFINrB0MnTySIKKworIzogZXhfZG9jbWQuYzo3NTU4Cittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICLzz8jSwc7FzsnFINfJxMEiCisKKyM6IGV4X2RvY21kLmM6NzU1OQorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAi88/I0sHOxc7JxSDTxcHO08EiCisKKyM6IGV4X2RvY21kLmM6NzU2MQorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIvPPyNLBzsXOycUgzsHT1NLPxcsiCisKKyM6IGV4X2RvY21kLmM6NzcxMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiDT1d3F09TX1cXUICghLCDe1M/C2SDPws/K1Mkg0NLP18XSy9UpIgorCisjOiBleF9kb2NtZC5jOjc3MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiDuxdfP2s3P1s7PIM/Uy9LZ1NggxMzRINrB0MnTySBcIiVzXCIiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjc3NDIKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IPDB0sHNxdTSIMTPzNbFziDC2dTYINDS0c3Pyi/PwtLB1M7PyiDLwdfZ3svPyiDJzMkgwtXL18/KIgorCisjOiBleF9kb2NtZC5jOjc3ODQKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IPPMydvLz80gx8zVws/LwdEg0sXL1dLTydEg0NLJIMnT0M/M2NrP18HOyckgy8/Nwc7E2SA6bm9ybWFsIgorCisjOiBleF9kb2NtZC5jOjgzMDIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDog7sXUINPP08XEzsXHzyDJzcXOySDGwcrMwSDEzNEg2sHNxc7ZICcjJyIKKworIzogZXhfZG9jbWQuYzo4MzMzCittc2dpZCAiRTQ5NTogbm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICJFNDk1OiDuxdQgwdfUz8vPzcHOxM7Px88gyc3FzskgxsHKzMEgxMzRINrBzcXO2SBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo4MzQxCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiDuxdQgwdfUz8vPzcHOxM7Px88gzs/NxdLBIMLVxsXSwSDEzNEg2sHNxc7ZIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6ODM1MgorbXNnaWQgIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICJFNDk3OiDuxdQgwdfUz8vPzcHOxM7Px88gyc3Fzskg08/P1NfF1NPU18nRIMTM0SDawc3FztkgXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjgzNjIKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiRTQ5ODogzsXUIMnNxc7JIMbByszBIDpzb3VyY2UgxMzRINrBzcXO2SBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo4NDAzCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiDw1dPUz8Ugyc3RIMbByszBIMTM0SAnJScgyczJICcjJywg18/azc/Wzs8g1M/M2MvPIGMgXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6ODQwNQorbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6IPLF2tXM2NTB1M/NINfZ0sHWxc7J0SDR18zRxdTT0SDQ1dPUwdEg09TSz8vBIgorCisjOiBleF9kb2NtZC5jOjkzNjAKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IO7F18/azc/Wzs8gz9TL0tnU2CDGwcrMIHZpbWluZm8gxMzRIN7Uxc7J0SIKKworIzogZXhfZG9jbWQuYzo5NTMzCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiD3INzUz8og18XS08nJIMTJx9LBxtkgzsUg0sHCz9TBwNQiCisKKyM6IGV4X2V2YWwuYzo0NDAKK21zZ2lkICJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiCittc2dzdHIgIiIKKyJFNjA4OiDuxdfP2s3P1s7PINfZ0M/MzsnU2CDLz83BzsTVIDp0aHJvdyDEzNEgydPLzMDexc7JyiDTINDSydPUwdfLz8ogJ1ZpbSciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAi6dPLzMDeydTFzNjOwdEg08nU1cHDydE6ICVzIgorCisjOiBleF9ldmFsLmM6NTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBmaW5pc2hlZDogJXMiCittc2dzdHIgIvrB18XS28XOwSDPwtLBws/Uy8EgydPLzMDeydTFzNjOz8og08nU1cHDyck6ICVzIgorCisjOiBleF9ldmFsLmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICLp08vMwN7J1MXM2M7B0SDTydTVwcPJ0SDQ0s/Jx87P0snSz9fBzsE6ICVzIgorCisjOiBleF9ldmFsLmM6NjIwIGV4X2V2YWwuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMsIGxpbmUgJWxkIgorbXNnc3RyICIlcywg09TSz8vBICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICLvwtLBws/Uy8EgydPLzMDeydTFzNjOz8og08nU1cHDyck6ICVzIgorCisjOiBleF9ldmFsLmM6NzEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG1hZGUgcGVuZGluZyIKK21zZ3N0ciAiJXMg19nQz8zO0cXUIM/WycTBzsnFIgorCisjOiBleF9ldmFsLmM6NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJlc3VtZWQiCittc2dzdHIgIiVzINfP2s/Czs/XzMXOzyIKKworIzogZXhfZXZhbC5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBkaXNjYXJkZWQiCittc2dzdHIgIiVzINDSz9DV3cXOzyIKKworIzogZXhfZXZhbC5jOjc0NgorbXNnaWQgIkV4Y2VwdGlvbiIKK21zZ3N0ciAi6dPLzMDeydTFzNjOwdEg08nU1cHDydEiCisKKyM6IGV4X2V2YWwuYzo3NTIKK21zZ2lkICJFcnJvciBhbmQgaW50ZXJydXB0IgorbXNnc3RyICLv28nCy8EgySDQ0sXS2dfBzsnFIgorCisjOiBleF9ldmFsLmM6NzU0IGd1aS5jOjQzODEKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAi79vJwsvBIgorCisjLiBpZiAocGVuZGluZyAmIENTVFBfSU5URVJSVVBUKQorIzogZXhfZXZhbC5jOjc1NgorbXNnaWQgIkludGVycnVwdCIKK21zZ3N0ciAi8NLF0tnXwc7JxSIKKworIzogZXhfZXZhbC5jOjgzMAorbXNnaWQgIkU1Nzk6IDppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTc5OiDTzMnby8/NIMfM1cLPy88g18zP1sXOztnKIDppZiIKKworIzogZXhfZXZhbC5jOjg2NworbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmVuZGlmIMLF2iA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MTEKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2UgwsXaIDppZiIKKworIzogZXhfZXZhbC5jOjkxNAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYgwsXaIDppZiIKKworIzogZXhfZXZhbC5jOjkyMQorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiDPws7B0tXWxc7PIM7F08vPzNjLzyA6ZWxzZSIKKworIzogZXhfZXZhbC5jOjkyNAorbXNnaWQgIkU1ODQ6IDplbHNlaWYgYWZ0ZXIgOmVsc2UiCittc2dzdHIgIkU1ODQ6IDplbHNlaWYg0M/TzMUgOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5OTEKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTog08zJ28vPzSDHzNXCz8vPINfMz9bFzs7ZyiA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDQ3Cittc2dpZCAiRTU4NjogOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg2OiA6Y29udGludWUgwsXaIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEwODcKK21zZ2lkICJFNTg3OiA6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODc6IDpicmVhayDCxdogOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTI4NgorbXNnaWQgIkU2MDE6IDp0cnkgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTYwMTog08zJ28vPzSDHzNXCz8vPINfMz9bFzs7ZyiA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTM2NgorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDpjYXRjaCDCxdogOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjLiAqIEp1c3QgcGFyc2UuCisjOiBleF9ldmFsLmM6MTM4OAorbXNnaWQgIkU2MDQ6IDpjYXRjaCBhZnRlciA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNDogOmNhdGNoIMLF2iA6ZmluYWxseSIKKworIzogZXhfZXZhbC5jOjE1MjEKK21zZ2lkICJFNjA2OiA6ZmluYWxseSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDY6IDpmaW5hbGx5IMLF2iA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNTQ1Cittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IM/CzsHS1dbFzs8gzsXTy8/M2MvPIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTY1NAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6ZW5kdHJ5IMLF2iA6dHJ5IgorCisjOiBleF9ldmFsLmM6MTk4NgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IMvPzcHOxMEgOmVuZGZ1bmN0aW9uIM3P1sXUIMnT0M/M2NrP18HU2NPRINTPzNjLzyDXztXU0skgxtXOy8PJySIKKworIzogZXhfZ2V0bG4uYzozMjk2Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAiyc3RIM3F1MvJIgorCisjOiBleF9nZXRsbi5jOjMyOTkKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIiDUydAgxsHKzMFcbiIKKworIzogZXhfZ2V0bG4uYzo0NzUyCittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICLazsHexc7JxSDP0MPJySAnaGlzdG9yeScg0sHXzs8gztXMwCIKKworIzogZXhfZ2V0bG4uYzo1MDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcywgydPUz9LJ0SAozsHeyc7B0SDP1CDT18XWxcfPIMsg09TB0s/N1Sk6XG4iCisKKyM6IGV4X2dldGxuLmM6NTAyNAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAi68/Nwc7EzsHRINPU0s/LwSIKKworIzogZXhfZ2V0bG4uYzo1MDI1Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAi89TSz8vBINDPydPLwSIKKworIzogZXhfZ2V0bG4uYzo1MDI2Cittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAi99nSwdbFzsnFIgorCisjOiBleF9nZXRsbi5jOjUwMjcKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICLz1NLPy8Eg19fPxMEiCisKKyM6IGV4X2dldGxuLmM6NTA2NQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgws/M2NvFIMTMyc7ZIMvPzcHOxNkiCisKKyM6IGV4X2dldGxuLmM6NTI0MgorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IPXEwczFzs8gwcvUydfOz8Ugz8vOzyDJzMkgwtXGxdIiCisKKyM6IGZpbGVpby5jOjM3NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICLuxcTP0NXT1MnNz8Ugyc3RIMbByszBIgorCisjOiBmaWxlaW8uYzo0MDEgZmlsZWlvLmM6NTM1IGZpbGVpby5jOjI5MTMgZmlsZWlvLmM6Mjk1NAorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICLR18zRxdTT0SDLwdTBzM/Hz80iCisKKyM6IGZpbGVpby5jOjQwMworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIs7FINHXzNHF1NPRIMbByszPzSIKKworIzogZmlsZWlvLmM6NTU3IGZpbGVpby5jOjQxMzEKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJb7s/X2cogxsHKzF0iCisKKyM6IGZpbGVpby5jOjU5MAorbXNnaWQgIltQZXJtaXNzaW9uIERlbmllZF0iCittc2dzdHIgIlvkz9PU1dAg2sHQ0sXdo85dIgorCisjOiBmaWxlaW8uYzo2OTQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiD3INLF2tXM2NTB1MUg19nQz8zOxc7J0SDB19TPy8/Nwc7EICpSZWFkUHJlIMbByswg09TBzCDOxd7J1MHFzdnNIgorCisjOiBmaWxlaW8uYzo2OTYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiDB19TPy8/Nwc7E2SAqUmVhZFByZSDOxSDEz8zWztkgydrNxc7R1NggwcvUydfO2cogwtXGxdIiCisKKyM6IGZpbGVpby5jOjcxNworbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTog19nQz8zO0cXU09Eg3tTFzsnFIMnaINPUwc7EwdLUzs/HzyDQz9TPy8Eg19fPxMEgc3RkaW4uLi5cbiIKKworIzogZmlsZWlvLmM6NzIzCittc2dpZCAiUmVhZGluZyBmcm9tIHN0ZGluLi4uIgorbXNnc3RyICL32dDPzM7RxdTT0SDe1MXOycUgydog09TBzsTB0tTOz8fPINDP1M/LwSDX18/EwSBzdGRpbi4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzoxMDAwCittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IPcg0sXa1czY1MHUxSDQ0sXPwtLB2s/Xwc7J0SDGwcrMINPUwcwgzsXeydTBxc3ZzSEiCisKKyM6IGZpbGVpby5jOjIwOTAKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby/HzsXaxM9dIgorCisjOiBmaWxlaW8uYzoyMDk3Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjIxMDQKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW8fOxdrEz10iCisKKyM6IGZpbGVpby5jOjIxMTIKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoyMTIyCittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJb0NLP0NXdxc7ZINPJzdfPzNkgQ1JdIgorCisjOiBmaWxlaW8uYzoyMTI3Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW+/CzsHS1dbFztkg08nN18/M2SBOTF0iCisKKyM6IGZpbGVpby5jOjIxMzIKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIlvEzMnOztnFINPU0s/LySDSwdrCydTZXSIKKworIzogZmlsZWlvLmM6MjEzOCBmaWxlaW8uYzo0MTE1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJb4uX6INDSxc/C0sHaz9fBzsnKXSIKKworIzogZmlsZWlvLmM6MjE0MyBmaWxlaW8uYzo0MTIwCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvQxdLFy8/EydLP18HOz10iCisKKyM6IGZpbGVpby5jOjIxNTAgZmlsZWlvLmM6NDE0NQorbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW9rB28nG0s/Xwc7PXSIKKworIzogZmlsZWlvLmM6MjE1NworbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAiW+/76eLr4SDw8uXv4vLh+u/34e7p8V0iCisKKyM6IGZpbGVpby5jOjIxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIlvu5eTv8PXz9Ont+eog4uHq9CDXINPU0s/LxSAlbGRdIgorCisjOiBmaWxlaW8uYzoyMTcwCittc2dpZCAiW1JFQUQgRVJST1JTXSIKK21zZ3N0ciAiW+/76eLr6SD+9OXu6fFdIgorCisjOiBmaWxlaW8uYzoyMzg2Cittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgIvfSxc3Fzs7ZyiDGwcrMIMTM0SDQxdLFy8/EydLP18HOydEgzsUgzsHKxMXOIgorCisjOiBmaWxlaW8uYzoyMzkzCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICLw0sXPwtLB2s/Xwc7JxSDTINDPzc/d2MAgJ2NoYXJjb252ZXJ0JyDOxSDX2dDPzM7Fzs8iCisKKyM6IGZpbGVpby5jOjIzOTYKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICLOxdfP2s3P1s7PINDSz97J1MHU2CDX2dfPxCAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyNzk2Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIiIKKyJFMjAzOiDi1cbF0iwgy8/Uz9LZyiDU0sXCz9fBzM/T2CDawdDJ08HU2Cwg1cTBzKPOIMnMySDX2cfS1dbFziDB19TPy8/Nwc7Ez8oiCisKKyM6IGZpbGVpby5jOjI4MTkKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDog68/Myd7F09TXzyDT1NLPyyDJ2s3FzsXOzyDB19TPy8/Nwc7Ez8ogzsXP1snEwc7O2c0gz8LSwdrPzSIKKworIzogZmlsZWlvLmM6Mjg1NworbXNnaWQgIk5ldEJlYW5zIGRpc3NhbGxvd3Mgd3JpdGVzIG9mIHVubW9kaWZpZWQgYnVmZmVycyIKK21zZ3N0ciAiTmV0QmVhbnMgzsUg0M/a18/M0cXUINfZ0M/MztHU2CDawdDJ09ggzsXJ2s3FzqPOztnIIMLVxsXSz9ciCisKKyM6IGZpbGVpby5jOjI4NjUKK21zZ2lkICJQYXJ0aWFsIHdyaXRlcyBkaXNhbGxvd2VkIGZvciBOZXRCZWFucyBidWZmZXJzIgorbXNnc3RyICL+wdPUyd7OwdEg2sHQydPYIMLVxsXSz9cgTmV0QmVhbnMgzsUgxM/Q1dPLwcXU09EiCisKKyM6IGZpbGVpby5jOjI5MTkgZmlsZWlvLmM6MjkzNworbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICLOxSDR18zRxdTT0SDGwcrMz80gyczJINXT1NLPytPU18/NLCDEz9PU1dDO2c0gxMzRINrB0MnTySIKKworIzogZmlsZWlvLmM6Mjk4OQorbXNnaWQgImlzIHJlYWQtb25seSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLP1MvS2dQg1M/M2MvPIMTM0SDe1MXOydEgKCEsIN7Uz8LZIM/Cz8rUySDQ0s/XxdLL1SkiCisKKyM6IGZpbGVpby5jOjMzMzUKK21zZ2lkICJFNTA2OiBDYW4ndCB3cml0ZSB0byBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA2OiD6wdDJ09gg1yDSxdrF0tfO2cogxsHKzCDOxdfP2s3P1s7BICghLCDe1M/C2SDPws/K1Mkg0NLP18XSy9UpIgorCisjOiBmaWxlaW8uYzozMzQ3Cittc2dpZCAiRTUwNzogQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDc6IO/bycLLwSDawcvS2dTJ0SDSxdrF0tfOz8fPIMbByszBICghLCDe1M/C2SDPws/K1Mkg0NLP18XSy9UpIgorCisjOiBmaWxlaW8uYzozMzQ5Cittc2dpZCAiRTUwODogQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwODog7sXXz9rNz9bOzyDQ0s/eydTB1Ngg0sXaxdLXztnKIMbByswgKCEsIN7Uz8LZIM/Cz8rUySDQ0s/XxdLL1SkiCisKKyM6IGZpbGVpby5jOjMzNjUKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IO7F18/azc/Wzs8g08/axMHU2CDSxdrF0tfO2cogxsHKzCAoISwg3tTPwtkgz8LPytTJINDSz9fF0svVKSIKKworIzogZmlsZWlvLmM6MzQ2OAorbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDog7sXXz9rNz9bOzyDTz9rEwdTYINLF2sXS187ZyiDGwcrMICghLCDe1M/C2SDPws/K1Mkg0NLP18XSy9UpIgorCisjOiBmaWxlaW8uYzozNTMwCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiD3yczLwSDSxdPV0tPBIMLVxMXUINDP1MXS0c7BICghLCDe1M/C2SDPws/K1Mkg0NLP18XSy9UpIgorCisjOiBmaWxlaW8uYzozNjQwCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IPfSxc3Fzs7ZyiDGwcrMIMTM0SDawdDJ08kgzsUgzsHKxMXOIgorCisjOiBmaWxlaW8uYzozNjU4Cittc2dpZCAiRTIxMzogQ2Fubm90IGNvbnZlcnQgKGFkZCAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiCittc2dzdHIgIkUyMTM6IPDF0sXLz8TJ0s/Xy8EgzsXXz9rNz9bOwSAoISDEzNEg2sHQydPJIMLF2iDQxdLFy8/EydLP18vJKSIKKworIzogZmlsZWlvLmM6MzY5MworbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IO7F18/azc/Wzs8gz9TL0tnU2CDT19Hawc7O2cogxsHKzCDEzNEg2sHQydPJIgorCisjOiBmaWxlaW8uYzozNjk3Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiDuxdfP2s3P1s7PIM/Uy9LZ1NggxsHKzCDEzNEg2sHQydPJIgorCisjOiBmaWxlaW8uYzozOTU5Cittc2dpZCAiRTY2NzogRnN5bmMgZmFpbGVkIgorbXNnc3RyICJFNjY3OiDuxSDVxMHMz9PYINfZ0M/MzsnU2CDG1c7Lw8nAIGZzeW5jKCkiCisKKyM6IGZpbGVpby5jOjM5NjYKK21zZ2lkICJFNTEyOiBDbG9zZSBmYWlsZWQiCittc2dzdHIgIkU1MTI6IO/QxdLBw8nRINrBy9LZ1MnRIM7FINXEwczB09giCisKKyM6IGZpbGVpby5jOjQwMzcKK21zZ2lkICJFNTEzOiB3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIkU1MTM6IO/bycLLwSDawdDJ08ksINDSxc/C0sHaz9fBzsnFIM7FINXEwczP09giCisKKyM6IGZpbGVpby5jOjQwNDMKK21zZ2lkICJFNTE0OiB3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJFNTE0OiDP28nCy8Eg2sHQydPJICjOxdQg09fPws/Ezs/HzyDNxdPUwT8pIgorCisjOiBmaWxlaW8uYzo0MTEwCittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiDv++ni6+Eg8PLl7+Ly4frv9+Hu6fEiCisKKyM6IGZpbGVpby5jOjQxMjYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW/XT1NLPytPU189dIgorCisjOiBmaWxlaW8uYzo0MTMxCittc2dpZCAiW05ld10iCittc2dzdHIgIlvuz9fZyl0iCisKKyM6IGZpbGVpby5jOjQxNTMKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW2FdIgorCisjOiBmaWxlaW8uYzo0MTUzCittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgxM/CwdfMxc7PIgorCisjOiBmaWxlaW8uYzo0MTU1Cittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt3XSIKKworIzogZmlsZWlvLmM6NDE1NQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIg2sHQydPBzs8iCisKKyM6IGZpbGVpby5jOjQyMDUKK21zZ2lkICJFMjA1OiBQYXRjaG1vZGU6IGNhbid0IHNhdmUgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNTog8sXWyc0g2sHQzMHUy8k6IM7F18/azc/Wzs8g08/I0sHOxc7JxSDJ08jPxM7Px88gxsHKzMEiCisKKyM6IGZpbGVpby5jOjQyMjcKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIiIKKyJFMjA2OiDyxdbJzSDawdDMwdTLyTogzsXXz9rNz9bOzyDTzcXOydTYINDB0sHNxdTS2SDQ1dPUz8fPIMnTyM/Ezs/HzyDGwcrMwSIKKworIzogZmlsZWlvLmM6NDI0MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzog7sXXz9rNz9bOzyDVxMHMydTYINLF2sXS187ZyiDGwcrMIgorCisjOiBmaWxlaW8uYzo0MzA2Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisi8PLl5PXw8uX25OXu6eU6IOnTyM/EztnKIMbByswgzc/WxdQgwtnU2CDV1NLB3sXOIMnMySDQz9fSxdbEo85cbiIKKworIzogZmlsZWlvLmM6NDMwOAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIs7FINfZyM/EydTFIMnaINLFxMHL1M/SwSwg0M/LwSDGwcrMIM7FIMLVxMXUINXT0MXbzs8g2sHQydPBziEiCisKKyM6IGZpbGVpby5jOjQzOTcKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjQzOTcKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIlvGz9LNwdQgZG9zXSIKKworIzogZmlsZWlvLmM6NDQwNAorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6NDQwNAorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW8bP0s3B1CBtYWNdIgorCisjOiBmaWxlaW8uYzo0NDExCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQ0MTEKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbxs/SzcHUIHVuaXhdIgorCisjOiBmaWxlaW8uYzo0NDM4Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEg09TSz8vBLCAiCisKKyM6IGZpbGVpby5jOjQ0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgItPU0s/LOiAlbGQsICIKKworIzogZmlsZWlvLmM6NDQ0MworbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICIxINPJzdfPzCIKKworIzogZmlsZWlvLmM6NDQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhcmFjdGVycyIKK21zZ3N0ciAi08nN18/Mz9c6ICVsZCIKKworIzogZmlsZWlvLmM6NDQ1NQorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltub2VvbF0iCisKKyM6IGZpbGVpby5jOjQ0NTUKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJb7sXawdfF0tujzs7B0SDQz9PMxcTO0dEg09TSz8vBXSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzo0NDc0Cittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICLw8uXk9fDy5fbk5e7p5Tog5sHKzCDJ2s3FzqPOINMgzc/Nxc7UwSDe1MXOydEhISEiCisKKyM6IGZpbGVpby5jOjQ0NzYKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIvPF0tij2s7PIMjP1MnUxSDawdDJ08HU2CDXINzUz9QgxsHKzCIKKworIzogZmlsZWlvLmM6NTcyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODog79vJwsvBINrB0MnTySDXIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTczMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTog79vJwsvBINrBy9LZ1MnRIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTczNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDog79vJwsvBIN7Uxc7J0SBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU5NzAKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiDi1cbF0iDVxMHMo84g0NLJINfZ0M/MzsXOyckgwdfUz8vPzcHOxNkgRmlsZUNoYW5nZWRTaGVsbCIKKworIzogZmlsZWlvLmM6NTk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiDw0sXE1dDSxdbExc7JxTogxsHKzCBcIiVzXCIgws/M2NvFIM7FIMTP09TV0MXOIgorCisjOiBmaWxlaW8uYzo1OTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiIgorIlcxMjog8NLFxNXQ0sXWxMXOycU6IMbByswgXCIlc1wiIMkgwtXGxdIgVmltIMLZzMkgydrNxc7FztkgzsXawdfJ08nNzyDE0tXHICIKKyLP1CDE0tXHwSIKKworIzogZmlsZWlvLmM6NTk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiIgorIlcxMTog8NLFxNXQ0sXWxMXOycU6IMbByswgXCIlc1wiIMLZzCDJ2s3FzqPOINDP08zFIM7B3sHMwSDSxcTBy9TJ0s/Xwc7J0SIKKworIzogZmlsZWlvLmM6NTk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICIiCisiVzE2OiDw0sXE1dDSxdbExc7JxTog0sXWyc0gxM/T1NXQwSDLIMbByszVIFwiJXNcIiDC2cwgydrNxc6jziDQz9PMxSDOwd7BzMEgIgorItLFxMHL1MnSz9fBzsnRIgorCisjOiBmaWxlaW8uYzo2MDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIiIKKyJXMTM6IPDSxcTV0NLF1sTFzsnFOiDGwcrMIFwiJXNcIiDC2cwg08/axMHOINDP08zFIM7B3sHMwSDSxcTBy9TJ0s/Xwc7J0SIKKworIzogZmlsZWlvLmM6NjAxOQorbXNnaWQgIlNlZSBcIjpoZWxwIFcxMVwiIGZvciBtb3JlIGluZm8uIgorbXNnc3RyICLzzS4gxM/Qz8zOydTFzNjO1cAgyc7Gz9LNwcPJwCDXIFwiOmhlbHAgVzExXCIuIgorCisjOiBmaWxlaW8uYzo2MDMzCittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAi8NLFxNXQ0sXWxMXOycUiCisKKyM6IGZpbGVpby5jOjYwMzQKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIiZPS1xuIgorIib6wcfS1drJ1NggxsHKzCIKKworIzogZmlsZWlvLmM6NjE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDYyOiBDb3VsZCBub3QgcHJlcGFyZSBmb3IgcmVsb2FkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTQ2Mjog7sXXz9rNz9bOzyDQz8THz9TP18nU2NPRIMsg0MXSxdrBx9LV2svFIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NjE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTog7sXXz9rNz9bOzyDX2dDPzM7J1Ngg0MXSxdrBx9LV2svVIFwiJXNcIiIKKworIzogZmlsZWlvLmM6Njc0MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLfXEwczFzs8tLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjY5MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiDn0tXQ0MEgXCIlc1wiIM7FINPV3cXT1NfVxdQiCisKKyM6IGZpbGVpby5jOjcwMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6IO7FxM/Q1dPUyc3ZxSDTyc3Xz8zZINDP08zFICo6ICVzIgorCisjOiBmaWxlaW8uYzo3MDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiDuxdPV3cXT1NfVwN3FxSDTz8LZ1MnFOiAlcyIKKworIzogZmlsZWlvLmM6NzA0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGdyb3VwIG9yIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjog7sXT1d3F09TX1cDdwdEgx9LV0NDBIMnMySDTz8LZ1MnFOiAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo3MTk4Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDh19TPy8/Nwc7E2SAtLS0iCisKKyM6IGZpbGVpby5jOjc0NjkKK21zZ2lkICJFMjE3OiBDYW4ndCBleGVjdXRlIGF1dG9jb21tYW5kcyBmb3IgQUxMIGV2ZW50cyIKK21zZ3N0ciAiRTIxNzog7sXXz9rNz9bOzyDX2dDPzM7J1NggwdfUz8vPzcHOxNkgxMzRIPfz5egg08/C2dTJyiIKKworIzogZmlsZWlvLmM6NzQ5MgorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAi7sXUINDPxMjPxNHdycggwdfUz8vPzcHOxCIKKworIzogZmlsZWlvLmM6NzgxMworbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6INPMydvLz80gx8zVws/LzyDXzM/Wxc7O2cUgwdfUz8vPzcHOxNkiCisKKyM6IGZpbGVpby5jOjgwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyDh19TPy8/Nwc7E2SDEzNEgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo4MDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAi99nQz8zOxc7JxSAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo4MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICLB19TPy8/Nwc7EwSAlcyIKKworIzogZmlsZWlvLmM6ODczMQorbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIkUyMTk6IPDSz9DV3cXOwSB7LiIKKworIzogZmlsZWlvLmM6ODczMworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IPDSz9DV3cXOwSB9LiIKKworIzogZm9sZC5jOjY4Cittc2dpZCAiRTQ5MDogTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAiRTQ5MDog88vMwcTPyyDOxSDPws7B0tXWxc7PIgorCisjOiBmb2xkLmM6NTkzCittc2dpZCAiRTM1MDogQ2Fubm90IGNyZWF0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIiIKKyJFMzUwOiDzy8zBxMvBIM7FIM3P1sXUIMLZ1Ngg08/axMHOwSDTINTFy9Xdyc0g2s7B3sXOycXNIM/Qw8nJICdmb2xkbWV0aG9kJyIKKworIzogZm9sZC5jOjU5NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICIiCisiRTM1MTog88vMwcTLwSDOxSDNz9bF1CDC2dTYINXEwczFzsEg0yDUxcvV3cnNINrOwd7FzsnFzSDP0MPJySAnZm9sZG1ldGhvZCciCisKKyM6IGdldGNoYXIuYzoyNDgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IOTPwsHXzMXOycUg1yDC1cbF0iDe1MXOydEiCisKKyM6IGdldGNoYXIuYzoyMTk4Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6INLFy9XS08nXzsHRINDSydfR2svBIgorCisjOiBnZXRjaGFyLmM6MzA3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDog1dbFIMXT1Nggx8zPwsHM2M7PxSDTz8vSwd3FzsnFIMTM0SAlcyIKKworIzogZ2V0Y2hhci5jOjMwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiDV1sUgxdPU2CDHzM/CwczYzsHRINDSydfR2svBIMTM0SAlcyIKKworIzogZ2V0Y2hhci5jOjMyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjog1dbFIMXT1Ngg08/L0sHdxc7JxSDEzNEgJXMiCisKKyM6IGdldGNoYXIuYzozMjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiDV1sUgxdPU2CDQ0snX0drLwSDEzNEgJXMiCisKKyM6IGdldGNoYXIuYzozMjc5Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICLzz8vSwd3FzsnRIM7FIM7BysTFztkiCisKKyM6IGdldGNoYXIuYzozMjgxCittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAi8NLJ19Hay8kgzsUgzsHKxMXO2SIKKworIzogZ2V0Y2hhci5jOjQxNzMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IM7FxM/Q1dPUyc3ZyiDSxdbJzSIKKworIzogZ3VpLmM6MjIwCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IO7F18/azc/Wzs8g0MXSxcrUySDXINLF1snNIMfSwcbJ3sXTy8/HzyDJztTF0sbFytPBIgorCisjOiBndWkuYzozNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6IO7F18/azc/Wzs8g19nQz8zOydTYIN7Uxc7JxSBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkU2NjU6IENhbm5vdCBzdGFydCBHVUksIG5vIHZhbGlkIGZvbnQgZm91bmQiCittc2dzdHIgIiIKKyJFNjY1OiDuxdfP2s3P1s7PINDF0sXK1Mkg1yDSxdbJzSDH0sHGLiDJztTF0sbFytPBLCDOxdDSwdfJzNjOzyDawcTBztkg29LJxtTZIgorCisjOiBndWkuYzo0NzcKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IM7F0NLB18nM2M7PxSDazsHexc7JxSDP0MPJySAnZ3VpZm9udHdpZGUnIgorCisjOiBndWkuYzo1NDcKK21zZ2lkICJFNTk5OiBWYWx1ZSBvZiAnaW1hY3RpdmF0ZWtleScgaXMgaW52YWxpZCIKK21zZ3N0ciAiRTU5OTogzsXQ0sHXyczYzs/FINrOwd7FzsnFIM/Qw8nJICdpbWFjdGl2YXRla2V5JyIKKworIzogZ3VpLmM6NDA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IO7F18/azc/Wzs8gzsHazsHeydTYIMPXxdQgJXMiCisKKyM6IGd1aV9hdF9mcy5jOjMwMAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8zsXM2NrRIM/Uy9LZ1Ng+ICIKKworIzogZ3VpX2F0X2ZzLmM6MTEzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE2OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGZvbnQgJXMiCittc2dzdHIgIkU2MTY6IHZpbV9TZWxGaWxlOiDb0snG1CAlcyDOxSDOwcrExc4iCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiB2aW1fU2VsRmlsZTog18/a19LB1CDXINTFy9Xdycogy8HUwczPxyDOxdfP2s3P1sXOIgorCisjOiBndWlfYXRfZnMuYzoyODAxCittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICLw1dTYIMsgxsHKzNU6IgorCisjOiBndWlfYXRfZnMuYzoyODA3Cittc2dpZCAiRTYxNTogdmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNTogdmltX1NlbEZpbGU6IM7FIM3Px9UgzsHK1Mkg1MXL1d3JyiDLwdTBzM/HIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9tb3RpZi5jOjE2MjMKK21zZ2lkICJPSyIKK21zZ3N0ciAi5MEiCisKKyM6IGd1aV9hdF9mcy5jOjI4MTUgZ3VpX2d0ay5jOjI3MzEgZ3VpX21vdGlmLmM6MTYxOCBndWlfbW90aWYuYzoyODQ5Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICLv1M3FzsEiCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAi8M/Mz9PBINDSz8vS1dTLyTogzsUgzc/H1SDP0NLFxMXMydTYIMfFz83F1NLJwCDQz8za1c7LwSIKKworIzogZ3VpX2F0aGVuYS5jOjIwNDcgZ3VpX21vdGlmLmM6MTg3MQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIuTJwczPx8/Xz8Ugz8vOzyBWaW0iCisKKyM6IGd1aV9iZXZhbC5jOjEwMSBndWlfdzMyLmM6MzgyOQorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICIiCisiRTIzMjogXCLw1drZ0thcIiDEzNEg19neydPMxc7Jyiwg18vMwN7BwN3JyiDJINPPz8Ldxc7JxSwgySDPwtLB1M7ZyiDX2drP1ywgIgorIs7FIM3P1sXUIMLZ1Ngg08/axMHOIgorCisjOiBndWlfZ3RrLmM6MTYwNworbXNnaWQgIlZpbSBkaWFsb2cuLi4iCittc2dzdHIgIuTJwczPx8/Xz8Ugz8vOzyBWaW0uLi4iCisKKyM6IGd1aV9ndGsuYzoyMDYwIG1lc3NhZ2UuYzoyOTkzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJuTBXG4iCisiJu7F1FxuIgorIu8m1M3FzsEiCisKKyM6IGd1aV9ndGsuYzoyMjY4Cittc2dpZCAiSW5wdXQgX01ldGhvZHMiCittc2dzdHIgIu3F1M/E2SD318/EwSIKKworIzogZ3VpX2d0ay5jOjI1MzQgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0g8M/J08sgySDawc3FzsEuLi4iCisKKyM6IGd1aV9ndGsuYzoyNTQyIGd1aV9tb3RpZi5jOjI3NzAKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIPDPydPLLi4uIgorCisjOiBndWlfZ3RrLmM6MjU3NCBndWlfbW90aWYuYzoyODg4Cittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAi/tTPIMndxc06IgorCisjOiBndWlfZ3RrLmM6MjU5MiBndWlfbW90aWYuYzoyOTIwCittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAi7sEg3tTPINrBzcXO0cXNOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAi9M/M2MvPINTP3s7ZxSDTz8/U18XU09TXydEiCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjYzNSBndWlfbW90aWYuYzozMDQ4Cittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAi8sXHydPU0s/awdfJ08nN2cUg08/P1NfF1NPU18nRIgorCisjOiBndWlfZ3RrLmM6MjY0NSBndWlfbW90aWYuYzoyOTkwCittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICLuwdDSwdfMxc7JxSIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNjU3IGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAi99fF0sgiCisKKyM6IGd1aV9ndGsuYzoyNjYxIGd1aV9tb3RpZi5jOjMwMTAKK21zZ2lkICJEb3duIgorbXNnc3RyICL3zsnaIgorCisjOiBndWlfZ3RrLmM6MjY4MyBndWlfZ3RrLmM6MjY4NSBndWlfbW90aWYuYzoyNzkyCittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICLuwcrUySDTzMXE1cDdxcUiCisKKyM6IGd1aV9ndGsuYzoyNzAyIGd1aV9ndGsuYzoyNzA0IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICL6wc3FzsEiCisKKyM6IGd1aV9ndGsuYzoyNzE1IGd1aV9ndGsuYzoyNzE3IGd1aV9tb3RpZi5jOjI4MjIKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAi+sHNxc7J1Ngg19PFIgorCisjOiBndWlfZ3RrX3gxMS5jOjIzMjcKK21zZ2lkICJWaW06IFJlY2VpdmVkIFwiZGllXCIgcmVxdWVzdCBmcm9tIHNlc3Npb24gbWFuYWdlclxuIgorbXNnc3RyICJWaW06IPDPzNXexc4g2sHQ0s/TIM7BINDSxcvSwd3FzsnFINLBws/U2SDP1CDEydPQxdTexdLBINPFwc7Tz9dcbiIKKworIzogZ3VpX2d0a194MTEuYzozNTE5Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIlZpbTog79POz9fOz8Ugz8vOzyDC2czPIM7Fz9bJxMHOzs8g2sHL0tnUz1xuIgorCisjOiBndWlfZ3RrX3gxMS5jOjQxMzgKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAi99nCz9Ig29LJxtTBIgorCisjOiBndWlfZ3RrX3gxMS5jOjYwMzUgdWkuYzoyMTIwCittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAi983F09TPINDV09TPx88g19nExczFzsnRIMnT0M/M2NrVxdTT0SBDVVRfQlVGRkVSMCIKKworIzogZ3VpX21vdGlmLmM6MTYxNyBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiRmlsdGVyIgorbXNnc3RyICLmyczY1NIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTkKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAi68HUwczPx8kiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjEKK21zZ2lkICJIZWxwIgorbXNnc3RyICLz0NLB18vBIgorCisjOiBndWlfbW90aWYuYzoxNjIyCittc2dpZCAiRmlsZXMiCittc2dzdHIgIubByszZIgorCisjOiBndWlfbW90aWYuYzoxNjI0Cittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICL32cTFzMXOycUiCisKKyM6IGd1aV9tb3RpZi5jOjI4MzUKK21zZ2lkICJVbmRvIgorbXNnc3RyICLv1M3FzsEiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiDuxdfP2s3P1s7PINrBx9LV2snU2CDb0snG1CBaYXAgJyVzJyIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkU2MTE6IO7F18/azc/Wzs8gydPQz8zY2s/XwdTYINvSycbUICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyLv1NDSwdfLwSDTz8/C3cXOydEgxMzRINXOyd7Uz9bFzsnRINDSz8PF09PBLdDP1M/Ny8EuXG4iCisKKyM6IGd1aV93MzIuYzo4MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MzogQXJndW1lbnQgbm90IHN1cHBvcnRlZDogXCItJXNcIjsgVXNlIHRoZSBPTEUgdmVyc2lvbi4iCittc2dzdHIgIkUyNDM6IPDB0sHNxdTSIM7FINDPxMTF0tbJ18HF1NPROiBcIi0lc1wiOyDJ09DPzNja1crUxSDXxdLTycAgT0xFLiIKKworIzogZ3VpX3c0OC5jOjIwOTAKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICLwz8nTyyDT1NLPy8kgKMnT0M/M2NrVytTFICdcXFxcJyDEzNEg0M/J08vBICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjExNQorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIvDPydPLIMkg2sHNxc7BICjJ09DPzNja1crUxSAnXFxcXCcgxMzRINDPydPLwSAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE1MzcKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICIiCisiVmltIEU0NTg6IM7F18/azc/Wzs8g19nExczJ1Ngg2sHQydPYINcg1MHCzMnDxSDD18XUwSwgzsXLz9TP0tnFIMPXxdTBzc/H1dQgIgorIs/Uz8LSwdbB1NjT0SDOxdDSwdfJzNjOzyIKKworIzogZ3VpX3gxMS5jOjIxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6INcgzsHCz9LFINvSycbUz9cgJXMgz9TT1dTT1NfVwNQg29LJxtTZIMTM0SDTzMXE1cDdycggy8/EydLP18/LOiIKKworIzogZ3VpX3gxMS5jOjIxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1Mjog7sHCz9Ig29LJxtTP1zogJXMiCisKKyM6IGd1aV94MTEuYzoyMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIvvSycbUICclcycgzsUg0dfM0cXU09Egzc/Oz9vJ0snOztnNIgorCisjOiBndWlfeDExLmM6MjE4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IO7Bws/SINvSycbUz9c6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJGb250MDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIxODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIkZvbnQxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjE4NAorbXNnaWQgIkZvbnQlbGQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAi+8nSyc7BINvSycbUwSBmb250JWxkIMTPzNbOwSDC2dTYINfE18/FIMLPzNjbxSDbydLJztkg29LJxtTBIGZvbnQwXG4iCisKKyM6IGd1aV94MTEuYzoyMTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAi+8nSyc7BINvSycbUwSBmb250MDogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyL7ydLJzsEg29LJxtTBIGZvbnQxOiAlbGRcbiIKKyJcbiIKKworIzogaGFuZ3VsaW4uYzo2MTAKK21zZ2lkICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCittc2dzdHIgIvUyNTb2IO/76eLr4SDB19TPzcHUycvJIOjBzsfZzCIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIuTPwsHXydTYIM7P19XAIMLB2tUgxMHOztnIIgorCisjOiBpZl9jc2NvcGUuYzo3OQorbXNnaWQgIlF1ZXJ5IGZvciBhIHBhdHRlcm4iCittc2dzdHIgIvrB0NLP0yDQzyDbwcLMz87VIgorCisjOiBpZl9jc2NvcGUuYzo4MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICLwz8vB2sHU2CDc1M8g08/Pwt3FzsnFIgorCisjOiBpZl9jc2NvcGUuYzo4MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICL1wsnU2CDTz8XEyc7FzsnFIgorCisjOiBpZl9jc2NvcGUuYzo4NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIvrBzs/XzyDJzsnDycHMydrJ0s/XwdTYINfTxSDTz8XEyc7FzsnRIgorCisjOiBpZl9jc2NvcGUuYzo4NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIvDPy8HawdTYINPPxcTJzsXOydEiCisKKyM6IGlmX2NzY29wZS5jOjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjA6IFVzYWdlOiBjc1tjb3BlXSAlcyIKK21zZ3N0ciAiRTU2MDog6dPQz8zY2s/Xwc7JxTogY3NbY29wZV0gJXMiCisKKyM6IGlmX2NzY29wZS5jOjEyNAorbXNnaWQgIlRoaXMgY3Njb3BlIGNvbW1hbmQgZG9lcyBub3Qgc3VwcG9ydCBzcGxpdHRpbmcgdGhlIHdpbmRvdy5cbiIKK21zZ3N0ciAi/NTBIMvPzcHOxMEgY3Njb3BlIM7FINDPxMTF0tbJ18HF1CDSwdrExczFzsnFIM/LzsEuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3NQorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiDp09DPzNjaz9fBzsnFOiBjc3RhZyA8yc3RPiIKKworIzogaWZfY3Njb3BlLmM6MjMxCittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiDNxdTLwSDOxSDOwcrExc7BIgorCisjOiBpZl9jc2NvcGUuYzo0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICLP28nCy8Egc3RhdCglcyk6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0MTkKK21zZ2lkICJFNTYzOiBzdGF0IGVycm9yIgorbXNnc3RyICJFNTYzOiDP28nCy8Egc3RhdCIKKworIzogaWZfY3Njb3BlLmM6NTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgzsUg0dfM0cXU09Egy8HUwczPx8/NIMnMySDJzcXOxc0gwsHa2SBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjUzNAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIuTPwsHXzMXOwSDCwdrBIMTBzs7ZyCBjc2NvcGUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjU4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVsZCIKK21zZ3N0ciAiRTI2Mjogz9vJwsvBINDPzNXexc7J0SDJzsbP0s3Bw8nJIM/UINPPxcTJzsXOydEgY3Njb3BlICVkIgorCisjOiBpZl9jc2NvcGUuYzo2OTQKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogzsXJ2tfF09TO2cog1MnQINDPydPLwSBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjczNgorbXNnaWQgIkU1NjY6IENvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJFNTY2OiDuxdfP2s3P1s7PINPP2sTB1Ngg1NLVwtUgxMzRIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzUzCittc2dpZCAiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIKK21zZ3N0ciAiRTYyMjog7sXXz9rNz9bOzyDX2dDPzM7J1NggZm9yaygpIMTM0SBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjg0NyBpZl9jc2NvcGUuYzo4OTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAizsUg1cTBzM/T2CDX2dDPzM7J1NggY3NfY3JlYXRlX2Nvbm5lY3Rpb24iCisKKyM6IGlmX2NzY29wZS5jOjg5OAorbXNnaWQgIkU2MjM6IENvdWxkIG5vdCBzcGF3biBjc2NvcGUgcHJvY2VzcyIKK21zZ3N0ciAiRTYyMzog7sUg1cTBzM/T2CDawdDV09TJ1Ngg0NLPw8XT0yBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjkxMQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IM7FINXEwczP09gg19nQz8zOydTYIGZkb3BlbiDEzNEgdG9fZnAiCisKKyM6IGlmX2NzY29wZS5jOjkxMworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IM7FINXEwczP09gg19nQz8zOydTYIGZkb3BlbiDEzNEgZnJfZnAiCisKKyM6IGlmX2NzY29wZS5jOjk1MQorbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2Nzog08/FxMnOxc7JyiDTIGNzY29wZSDOxSDTz9rEwc7PIgorCisjOiBpZl9jc2NvcGUuYzoxMDI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTogzsUgzsHKxMXOzyDTz8/U18XU09TXycog0M8g2sHQ0s/T1SBjc2NvcGUgJXMgxMzRICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Njk6IGludmFsaWQgY3Njb3BlcXVpY2tmaXggZmxhZyAlYyBmb3IgJWMiCittc2dzdHIgIkU0Njk6IM7F0NLB18nM2M7ZyiDGzMHHIGNzY29wZXF1aWNrZml4ICVjIMTM0SAlYyIKKworIzogaWZfY3Njb3BlLmM6MTE1MgorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiy8/Nwc7E2SBjc2NvcGU6XG4iCisKKyM6IGlmX2NzY29wZS5jOjExNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcykiCittc2dzdHIgIiUtNXM6ICUtMzBzICjp09DPzNjaz9fBzsnFOiAlcykiCisKKyM6IGlmX2NzY29wZS5jOjEyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNTogY2Fubm90IG9wZW4gY3Njb3BlIGRhdGFiYXNlOiAlcyIKK21zZ3N0ciAiRTYyNTogzsXXz9rNz9bOzyDP1MvS2dTYIMLB2tUgxMHOztnIIGNzY29wZTogJXMiCisKKyM6IGlmX2NzY29wZS5jOjEyNzEKK21zZ2lkICJFNjI2OiBjYW5ub3QgZ2V0IGNzY29wZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiRTYyNjogyc7Gz9LNwcPJ0SDPIMLB2sUgxMHOztnIIGNzY29wZSDOxSDEz9PU1dDOwSIKKworIzogaWZfY3Njb3BlLmM6MTI5NgorbXNnaWQgIkU1Njg6IGR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJFNTY4OiDEwc7OwdEgwsHawSDEwc7O2cggY3Njb3BlINXWxSDQz8TTz8XEyc7FzsEiCisKKyM6IGlmX2NzY29wZS5jOjEzMDcKK21zZ2lkICJFNTY5OiBtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAiRTU2OTogxM/T1MnHztXUzyDNwcvTyc3BzNjOz8Ug2s7B3sXOycUgz9TL0tnU2cgg08/FxMnOxc7JyiDTIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MTQyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6INPPxcTJzsXOycUg0yBjc2NvcGUgJXMgzsUgz8LOwdLV1sXOzyIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgItPPxcTJzsXOycUg0yBjc2NvcGUg2sHL0tnUzyIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTk4Cittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IMvSydTJ3sXTy8HRIM/bycLLwSDXIGNzX21hbmFnZV9tYXRjaGVzIgorCisjOiBpZl9jc2NvcGUuYzoxODQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzIgorbXNnc3RyICLtxdTLwSBjc2NvcGU6ICVzIgorCisjOiBpZl9jc2NvcGUuYzoxODcwCittc2dpZCAiIgorIlxuIgorIiAgICMgICBsaW5lIgorbXNnc3RyICIiCisiXG4iCisiICAgIyAgINPU0s/LwSIKKworIzogaWZfY3Njb3BlLmM6MTg3MgorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAiyc3RIMbByszBIC8gy8/O1MXL09QgLyDT1NLPy8FcbiIKKworIzogaWZfY3Njb3BlLmM6MTk5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA5OiBDc2NvcGUgZXJyb3I6ICVzIgorbXNnc3RyICJFNjA5OiDv28nCy8EgY3Njb3BlOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MjE3NgorbXNnaWQgIkFsbCBjc2NvcGUgZGF0YWJhc2VzIHJlc2V0IgorbXNnc3RyICLwxdLF2sHH0tXay8Eg19PFyCDCwdogxMHOztnIIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6MjI0NAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICLTz8XEyc7FzsnRINMgY3Njb3BlIM/U09XU09TX1cDUXG4iCisKKyM6IGlmX2NzY29wZS5jOjIyNDgKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICDCwdrBIMTBzs7ZyCAgICAgICAgICAgICAgICAgICAgICAgICDOwd7BzNjO2cog0NXU2FxuIgorCisjOiBpZl9weXRob24uYzo0MzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IOsg08/WwczFzsnAINzUwSDLz83BzsTBIM7FINLBws/UwcXULCDQz9PLz8zYy9UgzsUg2sHH0tXWxc7BIMLJwszJz9TFy8EgIgorIlB5dGhvbiIKKworIzogaWZfcHl0aG9uLmM6NTAwCittc2dpZCAiRTY1OTogQ2Fubm90IGludm9rZSBQeXRob24gcmVjdXJzaXZlbHkiCittc2dzdHIgIkU2NTk6IO7F18/azc/Wzs8g19nQz8zOydTYINLFy9XS08nXztnKINfZ2s/XIFB5dGhvbiIKKworIzogaWZfcHl0aG9uLmM6NzAxCittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICLOxdfP2s3P1s7PINXEwczJ1NggwdTSycLV1NkgT3V0cHV0T2JqZWN0IgorCisjOiBpZl9weXRob24uYzo3MDgKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICLazsHexc7JxSBzb2Z0c3BhY2UgxM/M1s7PIMLZ1Nggw8XM2c0g3snTzM/NIgorCisjOiBpZl9weXRob24uYzo3MTYKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAizsXQ0sHXyczYztnKIMHU0snC1dQiCisKKyM6IGlmX3B5dGhvbi5jOjc1NSBpZl9weXRob24uYzo3NjkKK21zZ2lkICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgbGlzdCBvZiBzdHJpbmdzIgorbXNnc3RyICJ3cml0ZWxpbmVzKCkg1NLFwtXF1CDVy8Hawc7J0SDT0MnTy8Eg09TSz8siCisKKyM6IGlmX3B5dGhvbi5jOjg5NQorbXNnaWQgIkUyNjQ6IFB5dGhvbjogRXJyb3IgaW5pdGlhbGlzaW5nIEkvTyBvYmplY3RzIgorbXNnc3RyICJFMjY0OiBQeXRob246IO/bycLLwSDJzsnDycHMydrBw8nJIM/C38XL1M/XIEkvTyIKKworIzogaWZfcHl0aG9uLmM6MTA4MCBpZl90Y2wuYzoxNDAyCittc2dpZCAiaW52YWxpZCBleHByZXNzaW9uIgorbXNnc3RyICLOxdDSwdfJzNjOz8Ug19nSwdbFzsnFIgorCisjOiBpZl9weXRob24uYzoxMDk0IGlmX3RjbC5jOjE0MDcKK21zZ2lkICJleHByZXNzaW9ucyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgItfZ0sHWxc7J0SDP1MvMwN7Fztkg0NLJIMvPzdDJzNHDyckiCisKKyM6IGlmX3B5dGhvbi5jOjExMDcKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICLQz9DZ1MvBINPP08zB1NjT0SDOwSDVzsne1M/Wxc7O2cogwtXGxdIiCisKKyM6IGlmX3B5dGhvbi5jOjExMjIgaWZfcHl0aG9uLmM6MTE2MyBpZl9weXRob24uYzoxMjI3IGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgItrB0NLFxMXM2M7ZyiDOz83F0iDT1NLPy8kiCisKKyM6IGlmX3B5dGhvbi5jOjEzNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8z8LfxcvUIMLVxsXSwSAo1cTBzMXOKSDXICU4bFg+IgorCisjOiBpZl9weXRob24uYzoxNDUzIGlmX3RjbC5jOjgzNgorbXNnaWQgImludmFsaWQgbWFyayBuYW1lIgorbXNnc3RyICLOxdDSwdfJzNjOz8Ugyc3RIM/UzcXUy8kiCisKKyM6IGlmX3B5dGhvbi5jOjE3MzMKK21zZ2lkICJubyBzdWNoIGJ1ZmZlciIKK21zZ3N0ciAizsXUINTBy8/HzyDC1cbF0sEiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICLQz9DZ1MvBINPP08zB1NjT0SDOwSDawcvS2dTPxSDPy87PIgorCisjOiBpZl9weXRob24uYzoxODY2Cittc2dpZCAicmVhZG9ubHkgYXR0cmlidXRlIgorbXNnc3RyICLB1NLJwtXUIMTP09TV0MXOINTPzNjLzyDEzNEg3tTFzsnRIgorCisjOiBpZl9weXRob24uYzoxODc5Cittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICLQz9rJw8nRIMvV0tPP0sEgzsHIz8TJ1NPRINfOxSDC1cbF0sEiCisKKyM6IGlmX3B5dGhvbi5jOjE5NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPM/C38XL1CDPy87BICjVxMHMxc4pINcgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjzPwt/Fy9Qgz8vOwSAozsXJ2tfF09TFzikg1yAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjzPy87PICVkPiIKKworIzogaWZfcHl0aG9uLmM6MjA0NgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICLOxdQg1MHLz8fPIM/LzsEiCisKKyM6IGlmX3B5dGhvbi5jOjIzMDcgaWZfcHl0aG9uLmM6MjM0MSBpZl9weXRob24uYzoyMzk2IGlmX3B5dGhvbi5jOjI0NjQKKyM6IGlmX3B5dGhvbi5jOjI1ODYgaWZfcHl0aG9uLmM6MjYzOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTkKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICLOxdfP2s3P1s7PINPPyNLBzsnU2CDJzsbP0s3Bw8nAIM/CIM/UzcXOxSDP0MXSwcPJySIKKworIzogaWZfcHl0aG9uLmM6MjMwOSBpZl9weXRob24uYzoyNDAzIGlmX3B5dGhvbi5jOjI0NzUKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIs7F18/azc/Wzs8g1cTBzMnU2CDT1NLPy9UiCisKKyM6IGlmX3B5dGhvbi5jOjIzNDYgaWZfcHl0aG9uLmM6MjQ5MSBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIs7F18/azc/Wzs8g2sHNxc7J1Ngg09TSz8vVIgorCisjOiBpZl9weXRob24uYzoyNTA5IGlmX3B5dGhvbi5jOjI1ODggaWZfcHl0aG9uLmM6MjY0NgorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAizsXXz9rNz9bOzyDX09TB18nU2CDT1NLPy9UiCisKKyM6IGlmX3B5dGhvbi5jOjI3NTAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgItPU0s/LwSDOxSDNz9bF1CDTz8TF0tbB1Ngg08nN18/MIM7P18/KINPU0s/LySIKKworIzogaWZfcnVieS5jOjQyMgorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2Njog6yDTz9bBzMXOycAg3NTBIMvPzcHOxMEgzsUg0sHCz9TBxdQsINDP08vPzNjL1SDOxSDawcfS1dbFzsEgwsnCzMnP1MXLwSAiCisiUnVieS4iCisKKyM6IGlmX3J1YnkuYzo0ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogzsXJ2tfF09TOz8Ug08/T1M/RzsnFIGxvbmdqbXAgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAi8MXSxcvMwN7FzsnFIM3F1sTVINLFwczJ2sHDycXKL8/Q0sXExczFzsnFzSIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAi8M/LwdrB1NggwsHaz9fZyiDLzMHT0yAiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICLwz8vB2sHU2CDQxdLFx9LV1sXOztnFIMbVzsvDyckiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIvDPzNXexc7JxSDJ2iDGwcrMwSIKKworIzogaWZfc25pZmYuYzo3MQorbXNnaWQgIlJldHJpZXZlIGZyb20gcHJvamVjdCIKK21zZ3N0ciAi8M/M1d7FzsnFIMnaINDSz8XL1MEiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAi8M/M1d7FzsnFIMnaINfTxcgg0NLPxcvUz9ciCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAi8M/M1d7FzsnFIgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIvDPy8HawdTYIMnTyM/EztnKIMvPxCIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICLuwcrUySDTyc3Xz8wiCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIvDSz9PNz9TSIMvMwdPTwSIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICLwz8vB2sHU2CDLzMHT0yDXIMnF0sHSyMnJIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAi8M/LwdrB1Nggy8zB09Mg1yDPx9LBzsnexc7Oz8ogycXSwdLIyckiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiDT09nMwcXU09EgzsEiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICLz09nMy8EgzsEgeHJlZiDJ2iIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYgyc3FxdQiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgydPQz8zY2tXF1NPRIgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICLwz8vB2sHU2CBkb2N1IgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIvPP2sTB1NggZG9jdSIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiIgorIu7F18/azc/Wzs8g0M/E08/FxMnOydTY09EgyyBTTmlGRisuIPDSz9fF0tjUxSDOwdPU0s/Ky8kgz8vS1dbFzsnRLiIKKyIoc25pZmZlbWFjcyDEz8zWztkgwtnU2CDVy8Hawc7ZINcg0MXSxc3Fzs7PyiAkUEFUSCkuXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiDv28nCy8Eg188g19LFzdEg3tTFzsnRLiDv1NPPxcTJzsXOycUiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIvcgzsHT1M/R3cnKIM3PzcXO1CBTTmlGRisgIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIs7FICIKKworIzogaWZfc25pZmYuYzo1NTYKK21zZ2lkICJjb25uZWN0ZWQiCittc2dzdHIgItDPxNPPxcTJzqPOIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTog7sXJ2tfF09TO2cog2sHQ0s/TIFNOaUZGKzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IO/bycLLwSDTz8XEyc7FzsnRINPPIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDA5Cittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IFNOaUZGKyDOxSDQz8TTz8XEyc6jziIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTog/NTPIM7FIMLVxsXSIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjog79vJwsvBINfPINfSxc3RINrB0MnTyS4g79TTz8XEyc7FzsnFIgorCisjOiBpZl90Y2wuYzo0MTgKK21zZ2lkICJpbnZhbGlkIGJ1ZmZlciBudW1iZXIiCittc2dzdHIgIs7F0NLB18nM2M7ZyiDOz83F0iDC1cbF0sEiCisKKyM6IGlmX3RjbC5jOjQ2NCBpZl90Y2wuYzo5MzEgaWZfdGNsLmM6MTExMAorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgItDPy8EgzsUg0sXBzMnaz9fBzs8iCisKKyM6IGlmX3RjbC5jOjUwMQorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICLOxcna18XT1M7B0SDP0MPJ0SIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzQKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIs7F18/azc/Wzs8gzsHazsHeydTYINPU0s/L1SDJzMkg09TSz8vJIgorCisjOiBpZl90Y2wuYzo4NDUKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIs/UzcXUy8EgzsUg1dPUwc7P18zFzsEiCisKKyM6IGlmX3RjbC5jOjg1MSBpZl90Y2wuYzoxMDY2CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgItLRxCAlZCDLz8zPzsvBICVkIgorCisjOiBpZl90Y2wuYzo4ODEKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICLOxdfP2s3P1s7PINfT1MHXydTYIMnMySDEz8LB18nU2CDT1NLPy9UiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAizsXJ2tfF09TO2cogxszBxzogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIs7FydrXxdPUzsHRIHZpbU9wdGlvbiIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAiy8zB18nB1NXSzs/FINDSxdLZ18HOycUiCisKKyM6IGlmX3RjbC5jOjE0MjgKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgIs/bycLLwSB2aW0iCisKKyM6IGlmX3RjbC5jOjE0NzEKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIs7F18/azc/Wzs8g08/axMHU2CDLz83BzsTVIMLVxsXSwSDJzMkgz8vOwTogz8LfxcvUINcg0NLPw8XT08Ug1cTBzMXOydEiCisKKyM6IGlmX3RjbC5jOjE1NDUKK21zZ2lkICIiCisiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgaXMgYWxyZWFkeSBiZWluZyBkZWxldGVkIgorbXNnc3RyICIiCisizsXXz9rNz9bOzyDawdLFx8nT1NLJ0s/XwdTYIMvPzcHOxNUg0yDPwtLB1M7ZzSDX2drP18/NOiDC1cbF0iDJzMkgz8vOzyDXICIKKyLQ0s/DxdPTxSDVxMHMxc7J0SIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NjIKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0uIgorIm9yZyIKK21zZ3N0ciAiIgorIkUyODA6IOvy6fTp/uXz6+HxIO/76eLr4SBUQ0w6INDP19LF1sSjziDT0MnTz8sg09PZzM/LPyEg88/Pwt3J1MUgz8Ig3NTPzSDQzyAiCisiwcTSxdPVIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyLOxdfP2s3P1s7PINrB0sXHydPU0snSz9fB1Nggy8/Nwc7E1SDTIM/C0sHUztnNINfZ2s/Xz806INPT2czLwSDOwSDC1cbF0iDJzMkgIgorIs/Lzs8gzsUgz8LOwdLV1sXOwSIKKworIzogaWZfdGNsLmM6MTcyNAorbXNnaWQgIiIKKyJFNTcxOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFNTcxOiDrINPP1sHMxc7JwCDc1MEgy8/Nwc7EwSDOxSDSwcLP1MHF1Cwg0M/Ty8/M2MvVIM7FINrBx9LV1sXOwSDCycLMyc/UxcvBICIKKyJUY2wiCisKKyM6IGlmX3RjbC5jOjE4ODYKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiDv++ni6+EgVENMOiDrz8Qg19nIz8TBIM7FINHXzNHF1NPRIMPFzNnNIN7J08zPzT8hIPPPz8LdydTFIM/CINzUz80g1yAiCisidmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoyMDA3Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICLOxdfP2s3P1s7PINDPzNXeydTYINPU0s/L1SIKKworIzogaWZfeGNtZHNydi5jOjIyNQorbXNnaWQgIlVuYWJsZSB0byByZWdpc3RlciBhIGNvbW1hbmQgc2VydmVyIG5hbWUiCittc2dzdHIgIu7F18/azc/Wzs8g2sHSxcfJ09TSydLP18HU2CDJzdEg08XS18XSwSDLz83BzsQiCisKKyM6IGlmX3hjbWRzcnYuYzo0NzMKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiDv1NDSwdfLwSDLz83BzsTZINcgxNLVx9XAINDSz8fSwc3N1SDOxSDVxMHMwdPYIgorCisjOiBpZl94Y21kc3J2LmM6NzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzM6IEludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJFNTczOiDp09DPzNja1cXU09EgzsXQ0sHXyczYztnKIGlkINPF0tfF0sE6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTExMAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiIgorIkUyNTE6IO7F0NLB18nM2M7PINPGz9LNydLP18HOzyDazsHexc7JxSDEwc7Oz8fPINDSz8PF09PBIFZJTSDXINLFxdPU0sUuICIKKyL1xMHMxc7PISIKKworIzogbWFpbi5jOjYwCittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIu7FydrXxdPUztnKIMHSx9XNxc7UIgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAi88zJ28vPzSDNzs/HzyDB0sfVzcXO1M/XINLFxMHL1MnSz9fBzsnRIgorCisjOiBtYWluLmM6NjQKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICLw0s/Q1d3FziDB0sfVzcXO1CDQz9PMxSIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIu3V08/SINDP08zFIMHSx9XNxc7UwSIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIiIKKyLzzMnby8/NIM3Oz8fPIMHSx9XNxc7Uz9cgXCIry8/Nwc7EwVwiLCBcIi1jIMvPzcHOxMFcIiDJzMkgXCItLWNtZCDLz83BzsTBXCIiCisKKyM6IG1haW4uYzo3MAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZm9yIgorbXNnc3RyICLuxcTP0NXT1MnN2cUgwdLH1c3FztTZIMTM0SIKKworIzogbWFpbi5jOjQ2NgorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiIgorIuTBzs7ZyiBWaW0gwtnMINPLz83QyczJ0s/Xwc4g0yDX2cvMwN7Fzs7PyiDP08/Cxc7Oz9PU2MAg0NLP083P1NLBIM/UzMneycoiCisKKyM6IG1haW4uYzo5MzIKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICLwz9DZ1MvBINDP19TP0s7Px88gz9TL0tnUydEgxsHKzMEg08PFzsHSydE6IFwiIgorCisjOiBtYWluLmM6OTQxCittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICLuxdfP2s3P1s7PIM/Uy9LZ1NggxMzRIN7Uxc7J0TogXCIiCisKKyM6IG1haW4uYzo5ODUKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIu7F18/azc/Wzs8gz9TL0tnU2CDEzNEg19nXz8TBINPDxc7B0snROiBcIiIKKworIzogbWFpbi5jOjExMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICLmwcrMz9cgxMzRINLFxMHL1MnSz9fBzsnROiAlZFxuIgorCisjOiBtYWluLmM6MTIzMworbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTog8NLFxNXQ0sXWxMXOycU6IPfZ18/EIM/T1d3F09TXzNHF1NPRIM7FIM7BINTF0s3JzsHMXG4iCisKKyM6IG1haW4uYzoxMjM1Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTog8NLFxNXQ0sXWxMXOycU6IPfXz8Qg0NLPydPIz8TJ1CDOxSDTINTF0s3JzsHMwVxuIgorCisjLiBqdXN0IGluIGNhc2UuLgorIzogbWFpbi5jOjEyOTcKK21zZ2lkICJwcmUtdmltcmMgY29tbWFuZCBsaW5lIgorbXNnc3RyICLLz83BzsTOwdEg09TSz8vBINDF0sXEINfZ0M/MzsXOycXNIHZpbXJjIgorCisjOiBtYWluLmM6MTMzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4Mjog7sXXz9rNz9bOzyDX2dDPzM7J1Ngg3tTFzsnFIMnaIFwiJXNcIiIKKworIzogbWFpbi5jOjI0MTEKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIuTP0M/MzsnUxczYzsHRIMnOxs/SzcHDydE6IFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjI0NDQKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW8bByswgLi5dINLFxMHL1MnSz9fBzsnFINXLwdrBzs7ZyCDGwcrMz9ciCisKKyM6IG1haW4uYzoyNDQ1Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgIN7Uxc7JxSDUxcvT1MEgydog0M/Uz8vBINfXz8TBIHN0ZGluIgorCisjOiBtYWluLmM6MjQ0NgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IM3F1MvBICAgICAgICAg0sXEwcvUydLP18HOycUgxsHKzMEg0yDVy8Hawc7Oz8ogzcXUy8/KIgorCisjOiBtYWluLmM6MjQ0OAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW8bByswgz9vJws/LXSDSxcTBy9TJ0s/Xwc7JxSDGwcrMwSDTINDF0tfPyiDP28nCy8/KIgorCisjOiBtYWluLmM6MjQ1NworbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyLp09DPzNjaz9fBzsnFOiIKKworIzogbWFpbi5jOjI0NjAKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbwdLH1c3FztTZXSAiCisKKyM6IG1haW4uYzoyNDY0Cittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIMnMyToiCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIuHSx9XNxc7U2TpcbiIKKworIzogbWFpbi5jOjI0NjgKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdOTBzMXFINXLwdrZ18HA1NPRINTPzNjLzyDJzcXOwSDGwcrMz9ciCisKKyM6IG1haW4uYzoyNDcwCittc2dpZCAiLS1saXRlcmFsXHRcdERvbid0IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIi0tbGl0ZXJhbFx0XHTuxSDX2dDPzM7R1Ngg0M/E09TBzs/Xy9Ug0M8gzcHTy8UiCisKKyM6IG1haW4uYzoyNDczCittc2dpZCAiLXJlZ2lzdGVyXHRcdFJlZ2lzdGVyIHRoaXMgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx0+sHSxcfJ09TSydLP18HU2CDc1M/UIGd2aW0gxMzRIE9MRSIKKworIzogbWFpbi5jOjI0NzQKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx079TLzMDeydTYINLFx8nT1NLBw8nAIMTBzs7Px88gZ3ZpbSDEzNEgT0xFIgorCisjOiBtYWluLmM6MjQ3NworbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0+sHQ1dPUydTYINMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gKMvByyBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyNDc4Cittc2dpZCAiLWYgIG9yICAtLW5vZm9ya1x0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWYgIMnMySAtLW5vZm9ya1x09yDBy9TJ187PyiDawcTB3sU6IO7FINfZ0M/MztHU2CBmb3JrINDSySDawdDV08vFIEdVSSIKKworIzogbWFpbi5jOjI0ODAKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHTyxdbJzSBWaSAoy8HLIFwidmlcIikiCisKKyM6IG1haW4uYzoyNDgxCittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx08sXWyc0gRXggKMvByyBcImV4XCIpIgorCisjOiBtYWluLmM6MjQ4MgorbXNnaWQgIi1zXHRcdFx0U2lsZW50IChiYXRjaCkgbW9kZSAob25seSBmb3IgXCJleFwiKSIKK21zZ3N0ciAiLXNcdFx0XHT0ycjJyiAo0MHLxdTO2copINLF1snNICjUz8zYy88gxMzRIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDg0Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdPLF1snNIM/UzMneycogKMvByyBcInZpbWRpZmZcIikiCisKKyM6IG1haW4uYzoyNDg2Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHTw0s/T1M/KINLF1snNICjLwcsgXCJldmltXCIsIMLF2tLF1snNztnKKSIKKworIzogbWFpbi5jOjI0ODcKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdPTPzNjLzyDEzNEg3tTFzsnRICjLwcsgXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjQ4OAorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHTvx9LBzsnexc7O2cog0sXWyc0gKMvByyBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyNDg5Cittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHTixdog18/azc/Wzs/T1Mkg08/I0sHOxc7J0SDJ2s3FzsXOycogKNrB0MnTySDGwcrMz9cpIgorCisjOiBtYWluLmM6MjQ5MAorbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdOLF2iDXz9rNz9bOz9PUySDXzsXTxc7J0SDJ2s3FzsXOycog1yDUxcvT1CIKKworIzogbWFpbi5jOjI0OTEKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdOLJzsHSztnKINLF1snNIgorCisjOiBtYWluLmM6MjQ5MworbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRcdPLF1snNIExpc3AiCisKKyM6IG1haW4uYzoyNDk1Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHTyxdbJzSDTz9fNxdPUyc3P09TJINMgVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0OTYKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHTyxdbJzSDOxdDPzM7PyiDTz9fNxdPUyc3P09TJINMgVmk6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ5NworbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdPXSz9fFztgg0M/E0s/Czs/T1Mkg08/Pwt3FzsnKIgorCisjOiBtYWluLmM6MjQ5OAorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx08sXWyc0gz9TMwcTLySIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdOLF2iDT18/QLcbByszBLCDJ09DPzNja1cXU09Eg1M/M2MvPINDBzdHU2CIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHT32dfF09TJINPQydPPyyDT18/QLcbByszP1yDJINrB18XS28nU2CDSwcLP1NUiCisKKyM6IG1haW4uYzoyNTAxCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICjTIMnNxc7FzSDGwcrMwSlcdPfP09PUwc7P18nU2CDB18HSycrOzyDawdfF0tujzs7ZyiDTxcHO0yIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx09M8g1sUsIN7UzyDJIC1yIgorCisjOiBtYWluLmM6MjUwNAorbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHTuxSDJ09DPzNjaz9fB1NggbmV3Y2xpIMTM0SDP1MvS2dTJ0SDPy87BIgorCisjOiBtYWluLmM6MjUwNQorbXNnaWQgIi1kZXYgPGRldmljZT5cdFx0VXNlIDxkZXZpY2U+IGZvciBJL08iCittc2dzdHIgIi1kZXYgPNXT1NLPytPU188+XHRcdOnT0M/M2NrP18HU2CDEzNEgSS9PINXLwdrBzs7PxSA81dPU0s/K09TXzz4iCisKKyM6IG1haW4uYzoyNTA4Cittc2dpZCAiLUFcdFx0XHRzdGFydCBpbiBBcmFiaWMgbW9kZSIKK21zZ3N0ciAiLUFcdFx0XHT6wdDV08sg1yDh0sHC08vPzSDSxdbJzcUiCisKKyM6IG1haW4uYzoyNTExCittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHT6wdDV08sg1yDSxdbJzcUgXCLp19LJ1FwiIgorCisjOiBtYWluLmM6MjUxNAorbXNnaWQgIi1GXHRcdFx0U3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0XHT6wdDV08sg1yDSxdbJzcUgXCLmwdLTyVwiIgorCisjOiBtYWluLmM6MjUxNgorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDzUxdLNyc7BzD5cdO7B2s7B3snU2CDVy8Hawc7O2cog1MnQIDzUxdLNyc7BzME+IgorCisjOiBtYWluLmM6MjUxNworbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRcdOnT0M/M2NrP18HU2CA8dmltcmM+INfNxdPUzyDMwMLZyCDGwcrMz9cgLnZpbXJjIgorCisjOiBtYWluLmM6MjUxOQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHTp09DPzNjaz9fB1NggPGd2aW1yYz4g183F09TPIMzAwtnIIMbByszP1yAuZ3ZpbXJjIgorCisjOiBtYWluLmM6MjUyMQorbXNnaWQgIi0tbm9wbHVnaW5cdFx0RG9uJ3QgbG9hZCBwbHVnaW4gc2NyaXB0cyIKK21zZ3N0ciAiLS1ub3BsdWdpblx0XHTuxSDawcfS1dbB1Ngg08PFzsHSyckgzc/E1czFyiIKKworIzogbWFpbi5jOjI1MjIKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHTv1MvS2dTYIE4gz8vPziAo0M8g1c3PzN7BzsnAOiDQzyDPxM7PzdUgzsEgy8HWxNnKIMbByswpIgorCisjOiBtYWluLmM6MjUyMworbXNnaWQgIi1PW05dXHRcdExpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdPTPINbFLCDe1M8gySAtbywgzs8g0yDXxdLUycvBzNjO2c0g0sHaxMXMxc7Jxc0gz8vPziIKKworIzogbWFpbi5jOjI1MjQKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHTuwd7B1Ngg0sXEwcvUydLP18HOycUg1yDLz87DxSDGwcrMwSIKKworIzogbWFpbi5jOjI1MjUKK21zZ2lkICIrPGxudW0+XHRcdFN0YXJ0IGF0IGxpbmUgPGxudW0+IgorbXNnc3RyICIrPGxudW0+XHRcdO7B3sHU2CDSxcTBy9TJ0s/Xwc7JxSDXINPU0s/LxSDTIM7PzcXSz80gPGxudW0+IgorCisjOiBtYWluLmM6MjUyNworbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDzLz83BzsTBPlx099nQz8zOydTYIDzLz83BzsTVPiDQxdLFxCDawcfS1drLz8ogxsHKzMEgdmltcmMiCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDzLz83BzsTBPlx0XHT32dDPzM7J1NggPMvPzcHOxNU+INDP08zFINrBx9LV2svJINDF0tfPx88gxsHKzMEiCisKKyM6IG1haW4uYzoyNTMwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA808XBztM+XHRcdPDSz97J1MHU2CDTw8XOwdLJyiA808XBztPBPiDQz9PMxSDawcfS1drLySDQxdLXz8fPIMbByszBIgorCisjOiBtYWluLmM6MjUzMQorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDzTw8XOwdLJyj5cdPDSz97J1MHU2CDLz83BzsTZIO/C2d7Oz8fPINLF1snNwSDJ2iDGwcrMwSA808PFzsHSydE+IgorCisjOiBtYWluLmM6MjUzMgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDzTw8XOwdLJyj5cdOTPwsHXzNHU2CDX08Ug19fFxKPOztnFIMvPzcHOxNkg1yDGwcrMIDzTw8XOwdLJ0T4iCisKKyM6IG1haW4uYzoyNTMzCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA808PFzsHSyco+XHT6wdDJ08HU2CDX08Ug19fFxKPOztnFIMvPzcHOxNkg1yDGwcrMIDzTw8XOwdLJ0T4iCisKKyM6IG1haW4uYzoyNTM1Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHTyxcTBy9TJ0s/Xwc7JxSDawdvJxtLP18HOztnIIMbByszP1yIKKworIzogbWFpbi5jOjI1MzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPNzL0sHOPlx08M/E08/FxMnOydTYIHZpbSDLINXLwdrBzs7PzdUg08XS18XS1SBYIgorCisjOiBtYWluLmM6MjU0MQorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx07sUg19nQz8zO0dTYINPPxcTJzsXOycUg0yDTxdLXxdLPzSBYIgorCisjOiBtYWluLmM6MjU0NAorbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgaWYgcG9zc2libGUiCittc2dzdHIgIi0tcmVtb3RlIDzGwcrM2T5cdPDPINfP2s3P1s7P09TJINLFxMHL1MnSz9fB1NggPMbByszZPiDOwSDTxdLXxdLFIFZpbSIKKworIzogbWFpbi5jOjI1NDUKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxlbnQgPMbByszZPiAg9M8g1sUsIM7PIMLF2iDWwczPwiDOwSDP1NPV1NPU18nFINPF0tfF0sEiCisKKyM6IG1haW4uYzoyNTQ2Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0IDzGwcrM2T4gIPTPINbFLCDe1M8gySAtLXJlbW90ZSwgzs8g0yDP1snEwc7Jxc0g2sHXxdLbxc7J0SIKKworIzogbWFpbi5jOjI1NDcKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPMbByszZPiAg9M8g1sUsIM7PIMLF2iDWwczPwiDOwSDP1NPV1NPU18nFINPF0tfF0sEiCisKKyM6IG1haW4uYzoyNTQ4Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUtc2VuZCA8y87P0MvJPlx079TQ0sHXydTYIDzLzs/Qy8k+IM7BINPF0tfF0iBWaW0gySDX2crUySIKKworIzogbWFpbi5jOjI1NDkKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICItLXJlbW90ZS1leHByIDzX2dLB1j5cdPfZ3snTzMnU2CA819nSwdY+IM7BINPF0tfF0sUgVmltIMkgzsHQxd7B1MHU2CIKKworIzogbWFpbi5jOjI1NTAKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdPDPy8HawdTYINPQydPPyyDJzaPOINPF0tfF0s/XIFZpbSDJINrB18XS28nU2CDSwcLP1NUiCisKKyM6IG1haW4uYzoyNTUxCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICIiCisiLS1zZXJ2ZXJuYW1lIDzJzdE+XHTv1NDSwdfJ1NggzsEv09TB1Ngg08XS18XSz80gVmltINMg1cvB2sHOztnNIDzJzcXOxc0+IgorCisjOiBtYWluLmM6MjU1NAorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHTp09DPzNjaz9fB1Ngg183F09TPIC52aW1pbmZvIMbByswgPHZpbWluZm8+IgorCisjOiBtYWluLmM6MjU1NgorbXNnaWQgIi1oICBvciAgLS1oZWxwXHRQcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaCDJzMkgLS1oZWxwXHT32dfF09TJINPQ0sHXy9UgKNzUzyDTz8/C3cXOycUpIMkg2sHXxdLbydTYINLBws/U1SIKKworIzogbWFpbi5jOjI1NTcKK21zZ2lkICItLXZlcnNpb25cdFx0UHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdPfZ18XT1Mkgyc7Gz9LNwcPJwCDPINfF0tPJySBWaW0gySDawdfF0tvJ1Ngg0sHCz9TVIgorCisjOiBtYWluLmM6MjU2MQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIuHSx9XNxc7U2SDEzNEgZ3ZpbSAo18XS08nRIE1vdGlmKTpcbiIKKworIzogbWFpbi5jOjI1NjUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAobmVYdGF3IHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisi4dLH1c3FztTZIMTM0SBndmltICjXxdLTydEgbmVYdGF3KTpcbiIKKworIzogbWFpbi5jOjI1NjcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisi4dLH1c3FztTZIMTM0SBndmltICjXxdLTydEgQXRoZW5hKTpcbiIKKworIzogbWFpbi5jOjI1NzEKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8xMnT0MzFyj5cdPrB0NXT1MnU2CB2aW0gzsEg1cvB2sHOzs/NIDzEydPQzMXFPiIKKworIzogbWFpbi5jOjI1NzIKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0+sHQ1dPUydTYIHZpbSDXINPXo9LO1dTPzSDXycTFIgorCisjOiBtYWluLmM6MjU3NAorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDzJzdE+XHRcdOnT0M/M2NrP18HU2CDSxdPV0tMsIMvByyDF08zJIMLZIHZpbSDC2cwgPMnNxc7FzT4iCisKKyM6IG1haW4uYzoyNTc1Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAo7sUg0sXBzMnaz9fBzs8pXG4iCisKKyM6IG1haW4uYzoyNTc3Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICIiCisiLWJhY2tncm91bmQgPMPXxdQ+XHTp09DPzNjaz9fB1Ngg1cvB2sHOztnKIDzD18XUPiDEzNEgxs/OwSAo1MHL1sU6IC1iZykiCisKKyM6IG1haW4uYzoyNTc4Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICIiCisiLWZvcmVncm91bmQgPMPXxdQ+XHTp09DPzNjaz9fB1NggPMPXxdQ+IMTM0SDPwtnezs/HzyDUxcvT1MEgKNTBy9bFOiAtZmcpIgorCisjOiBtYWluLmM6MjU3OSBtYWluLmM6MjU5OQorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPNvSycbUPlx0XHTp09DPzNjaz9fB1NggPNvSycbUPiDEzNEgz8LZ3s7Px88g1MXL09TBICjUwcvWxTogLWZuKSIKKworIzogbWFpbi5jOjI1ODAKK21zZ2lkICItYm9sZGZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBib2xkIHRleHQiCittc2dzdHIgIi1ib2xkZm9udCA829LJxtQ+XHTp09DPzNjaz9fB1NggPNvSycbUPiDEzNEg1snSzs/HzyDUxcvT1MEiCisKKyM6IG1haW4uYzoyNTgxCittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPNvSycbUPlx06dPQz8zY2s/XwdTYIDzb0snG1D4gxMzRIM7By8zPzs7Px88g1MXL09TBIgorCisjOiBtYWluLmM6MjU4MiBtYWluLmM6MjYwMAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiIgorIi1nZW9tZXRyeSA8x8XPzcXU0snRPlx06dPQz8zY2s/XwdTYIM7B3sHM2M7VwCA8x8XPzcXU0snAPiAo1MHL1sU6IC1nZW9tKSIKKworIzogbWFpbi5jOjI1ODMKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA828nSyc7BPlx06dPQz8zY2s/XwdTYIDzbydLJztU+IMLP0sTA0sEgKNTBy9bFOiAtYncpIgorCisjOiBtYWluLmM6MjU4NAorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiIgorIi1zY3JvbGxiYXJ3aWR0aCA828nSyc7BPiDp09DPzNjaz9fB1Ngg28nSyc7VINDPzM/T2SDQ0s/L0tXUy8kgKNTBy9bFOiAtc3cpIgorCisjOiBtYWluLmM6MjU4NgorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDzX2dPP1ME+XHTp09DPzNjaz9fB1NggPNfZ08/U1T4gzcXOwCAo1MHL1sU6IC1taCkiCisKKyM6IG1haW4uYzoyNTg4IG1haW4uYzoyNjAxCittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdOnT0M/M2NrP18HU2CDJztfF0tPO2cog18nExc/SxdbJzSAo1MHL1sU6IC1ydikiCisKKyM6IG1haW4uYzoyNTg5Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdO7FIMnT0M/M2NrP18HU2CDJztfF0tPO2cog18nExc/SxdbJzSAo1MHL1sU6ICtydikiCisKKyM6IG1haW4uYzoyNTkwCittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA80sXT1dLTPlx09dPUwc7P18nU2CDVy8Hawc7O2cogPNLF09XS0z4iCisKKyM6IG1haW4uYzoyNTkzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyLh0sfVzcXO1NkgxMzRIGd2aW0gKNfF0tPJ0SBSSVNDIE9TKTpcbiIKKworIzogbWFpbi5jOjI1OTQKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA83snTzM8+XHTwxdLXz87B3sHM2M7B0SDbydLJzsEgz8vOwSDXIMvPzM/Oy8HIIgorCisjOiBtYWluLmM6MjU5NQorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA83snTzM8+XHTwxdLXz87B3sHM2M7B0SDX2dPP1MEgz8vOwSDXINPU0s/LwcgiCisKKyM6IG1haW4uYzoyNTk4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyLh0sfVzcXO1NkgxMzRIGd2aW0gKNfF0tPJ0SBHVEsrKTpcbiIKKworIzogbWFpbi5jOjI2MDIKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICIiCisiLWRpc3BsYXkgPMTJ09DMxco+XHT6wdDV09TJ1NggdmltIM7BINXLwdrBzs7PzSA8xMnT0MzFxT4gKNTBy9bFOiAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjYwNAorbXNnaWQgIi0tcm9sZSA8cm9sZT5cdFNldCBhIHVuaXF1ZSByb2xlIHRvIGlkZW50aWZ5IHRoZSBtYWluIHdpbmRvdyIKK21zZ3N0ciAiIgorIi0tcm9sZSA80s/M2D5cdPXT1MHOz9fJ1Ngg1c7Jy8HM2M7VwCA80s/M2D4gxMzRIMnExc7UycbJy8HDyckgx8zB187Px88gz8vOwSIKKworIzogbWFpbi5jOjI2MDYKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHTv1MvS2dTYIFZpbSDXztXU0skgxNLVx8/HzyDLz83Qz87FztTBIEdUSyIKKworIzogbWFpbi5jOjI2MDkKK21zZ2lkICItUCA8cGFyZW50IHRpdGxlPlx0T3BlbiBWaW0gaW5zaWRlIHBhcmVudCBhcHBsaWNhdGlvbiIKK21zZ3N0ciAiLVAgPNrBx8/Mz9fPyyDSz8TJ1MXM0T5cdO/Uy9LZ1NggVmltINcg0s/EydTFzNjTy8/NINDSyczP1sXOyckiCisKKyM6IG1haW4uYzoyODQ3Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAi7sXUIMTJ09DMxdEiCisKKyMuIEZhaWxlZCB0byBzZW5kLCBhYm9ydC4KKyM6IG1haW4uYzoyODYyCittc2dpZCAiOiBTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiOiDv1NDSwdfLwSDOxSDVxMHMwdPYLlxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI4NjgKK21zZ2lkICI6IFNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIjog79TQ0sHXy8EgzsUg1cTBzMHT2C4g8M/Q2dTLwSDNxdPUzs/HzyDX2dDPzM7FzsnRXG4iCisKKyM6IG1haW4uYzoyOTA2IG1haW4uYzoyOTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiz9TSxcTBy9TJ0s/Xwc7PICVkIMnaICVkIgorCisjOiBtYWluLmM6Mjk0OQorbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIu7F1CDEydPQzMXROiDP1NDSwdfLwSDX2dLB1sXOydEgzsUg1cTBzMHT2C5cbiIKKworIzogbWFpbi5jOjI5NjEKK21zZ2lkICI6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIjog79TQ0sHXy8Eg19nSwdbFzsnRIM7FINXEwczB09guXG4iCisKKyM6IG1hcmsuYzo3MDkKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIu7F1CDV09TBzs/XzMXOztnIIM/UzcXUz8siCisKKyM6IG1hcmsuYzo3MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiDuxdQgz9TNxdTPyywg08/X0MHEwcDdycgg0yBcIiVzXCIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjcyMgorbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyLP1M3F1CDT1NIgIMvPzCDGwcrML9TFy9PUIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3NjAKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorItDS2dbPyyDT1NIgIMvPzCDGwcrML9TFy9PUIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo4MDUKK21zZ2lkICIiCisiXG4iCisiY2hhbmdlIGxpbmUgIGNvbCB0ZXh0IgorbXNnc3RyICIiCisiXG4iCisiydrNxc4uICDT1NIgIMvPzCDUxcvT1CIKKworIzogbWFyay5jOjEyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg58zPwsHM2M7ZxSDP1M3F1MvJOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjEzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIPPQydPPyyDQ0tnWy8/XICjTzsHewczBIMLPzMXFINPXxdbJxSk6XG4iCisKKyM6IG1hcmsuYzoxNDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg6dPUz9LJ0SDNxdPUztnIIM/UzcXUz8sgKM/UIMLPzMXFINPXxdbJyCDLINPUwdLZzSk6XG4iCisKKyM6IG1hcmsuYzoxNTAxCittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIvDSz9DV3cXOwSAnPiciCisKKyM6IG1ieXRlLmM6NDY3Cittc2dpZCAiRTU0MzogTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIkU1NDM6IO7FxM/Q1dPUyc3PxSDJzdEgy8/EydLP18vJIgorCisjOiBtYnl0ZS5jOjQ0MzEKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDog7sXXz9rNz9bOzyDOwdrOwd7J1Ngg2s7B3sXOydEgy8/O1MXL09TBINfXz8TBIgorCisjOiBtYnl0ZS5jOjQ1ODMKK21zZ2lkICJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiCittc2dzdHIgIkUyODU6IO7F18/azc/Wzs8g08/axMHU2CDLz87UxcvT1CDX18/EwSIKKworIzogbWJ5dGUuYzo0NzQxCittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiDuxdXEwd7OwdEg0M/Q2dTLwSDP1MvS2dTYIM3F1M/EINfXz8TBIgorCisjOiBtYnl0ZS5jOjQ3NTIKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIiIKKyJFMjg3OiDw0sXE1dDSxdbExc7JxTogzsXXz9rNz9bOzyDOwdrOwd7J1Nggz8LSLiDX2drP1yDVzsne1M/Wxc7J0SDNxdTPxMEgIgorItfXz8TBIgorCisjOiBtYnl0ZS5jOjQ3NTgKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogzcXUz8Qg19fPxMEgzsUg0M/ExMXS1snXwcXUINPUyczJIgorCisjOiBtYnl0ZS5jOjQ4MTUKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiIgorIkUyODk6IM3F1M/EINfXz8TBIM7FINDPxMTF0tbJ18HF1CDNz8og1MnQINDSxcTXwdLJ1MXM2M7Px88g0sXEwcvUydLP18HOydEiCisKKyM6IG1ieXRlLmM6NDg4OQorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDog09TJzNggXCLOwcQgzcXT1M/NXCIg1NLFwtXF1CDVy8Hawc7J0SDb0snG1M/Xz8fPIM7Bws/SwSIKKworIzogbWJ5dGUuYzo0OTI1Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICIiCisiRTI5MTogR1RLKyDCz8zFxSDSwc7Oxcog18XS08nJLCDexc0gMS4yLjMuIO/CzMHT1Ngg08/T1M/RzsnRIM7FINLBws/UwcXULiIKKworIzogbWJ5dGUuYzo1MjMyCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5Mjog88XS18XSIM3F1M/EwSDX18/EwSDOxSDawdDV3cXOIgorCisjOiBtZW1maWxlLmM6NDg4Cittc2dpZCAiRTI5MzogYmxvY2sgd2FzIG5vdCBsb2NrZWQiCittc2dzdHIgIkUyOTM6IMLMz8sgzsUg2sHCzM/LydLP18HOIgorCisjOiBtZW1maWxlLmM6MTAwNQorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IO/bycLLwSDQz8nTy8Eg0NLJIN7Uxc7JySDT18/QLcbByszBIgorCisjOiBtZW1maWxlLmM6MTAxMAorbXNnaWQgIkUyOTU6IFJlYWQgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk1OiDv28nCy8Eg3tTFzsnRINPXz9AtxsHKzMEiCisKKyM6IG1lbWZpbGUuYzoxMDYyCittc2dpZCAiRTI5NjogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgd3JpdGUiCittc2dzdHIgIkUyOTY6IO/bycLLwSDQz8nTy8Eg0NLJINrB0MnTySDT18/QLcbByszBIgorCisjOiBtZW1maWxlLmM6MTA4MAorbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5Nzog79vJwsvBINDSySDawdDJ08kg09fP0C3GwcrMwSIKKworIzogbWVtZmlsZS5jOjEyNzcKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIiIKKyJFMzAwOiDz18/QLcbByswg1dbFINPV3cXT1NfVxdQgKMHUwcvBINMgydPQz8zY2s/Xwc7Jxc0g08nN18/M2M7PyiDT09nMy8k/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IO7FINDPzNXexc4gwszPyyDOz83F0iAwPyIKKworIzogbWVtbGluZS5jOjMxNQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMT8iCittc2dzdHIgIkUyOTg6IO7FINDPzNXexc4gwszPyyDOz83F0iAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IO7FINDPzNXexc4gwszPyyDOz83F0iAyPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTog78osINDP1MXS0czT0SDT18/QLcbByswhISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjog7sXXz9rNz9bOzyDQxdLFyc3Fzs/XwdTYINPXz9AtxsHKzCIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiIgorIkUzMDM6IO7FINXEwczP09ggz9TL0tnU2CDT18/QLcbByswgxMzRIFwiJXNcIiwg18/T09TBzs/XzMXOycUgzsXXz9rNz9bOzyIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDog7sUg0M/M1d7FziDCzM/LIDA/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiDz18/QLcbByswgxMzRICVzIM7FIM7BysTFziIKKworIzogbWVtbGluZS5jOjc2NworbXNnaWQgIkVudGVyIG51bWJlciBvZiBzd2FwIGZpbGUgdG8gdXNlICgwIHRvIHF1aXQpOiAiCittc2dzdHIgIiIKKyL318XEydTFIM7PzcXSINPXz9AtxsHKzMEsIMvP1M/S2cog08zFxNXF1CDJ09DPzNjaz9fB1NggKDAgxMzRINfZyM/EwSk6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjog7sUgzc/H1SDP1MvS2dTYICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAi7sXXz9rNz9bOzyDQ0s/eydTB1NggwszPyyAwIMnaICIKKworIzogbWVtbGluZS5jOjgzNworbXNnaWQgIiIKKyJcbiIKKyJNYXliZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSBvciBWaW0gZGlkIG5vdCB1cGRhdGUgdGhlIHN3YXAgZmlsZS4iCittc2dzdHIgIiIKKyJcbiIKKyLuxdQgydrNxc7FzsnKLCDJzMkgVmltIM7FINPNz8cgz8LOz9fJ1Ngg09fP0C3GwcrMIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgzsXM2NrRIMnT0M/M2NrP18HU2CDXIMTBzs7PyiDXxdLTyckgVmltLlxuIgorCisjOiBtZW1saW5lLmM6ODQ5Cittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAi6dPQz8zY2tXK1MUgVmltINfF0tPJySAzLjAuXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgzsUg0dfM0cXU09Eg09fP0C3GwcrMz80gVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiDOxczY2tEgydPQz8zY2s/XwdTYIM7BINzUz80gy8/N0NjA1MXSxS5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAi5sHKzCDC2cwg08/axMHOICIKKworIzogbWVtbGluZS5jOjg3NAorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisizMnCzyDGwcrMIMLZzCDQz9fSxdbEo84uIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIunT0M/M2NrVxdTT0SDT18/QLcbByswgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICLp08jPxM7ZyiDGwcrMIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkyMgorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiDw0sXE1dDSxdbExc7JxTogydPIz8TO2cogxsHKzCDNz8cgwtnU2CDJ2s3FzqPOIgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTog7sXXz9rNz9bOzyDQ0s/eydTB1NggwszPyyAxIMnaICVzIgorCisjOiBtZW1saW5lLmM6OTc5Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/v9PP19PP09/Xl9CDt7u/n7yDz9PLv6yIKKworIzogbWVtbGluZS5jOjk5NQorbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P+7l8PLh9+ns+O7v5SD67uH+5e7p5SDz/uX0/unr4SDz9PLv6yIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/8PXz9O/qIOLs7+siCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/7/Tz9fTz9Pf14PQg8/Ty7+vpIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogzsXQ0sHXyczYztnKIMLMz8sgMSBJRCAoJXMgzsUg0dfM0cXU09EgxsHKzM/NIC5zd3A/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz/w8u/w9f3l7iDi7O/rIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/P9PU0s/LySDNz8fV1CDC2dTYIMnT0M/S3sXO2SDP1NPAxMEgxM8gPz8/6+/u4+EiCisKKyM6IG1lbWxpbmUuYzoxMDk3Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz/T1NLPy8kgzc/HzMkgwtnU2CDX09TB18zFztkgyczJINXEwczFztkgz9TTwMTBIMTPID8/P+vv7uPhIgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/6+/u5eMiCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IPfP09PUwc7P18zFzsnFINDSxdLXwc7PIgorCisjOiBtZW1saW5lLmM6MTE0OAorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIiIKKyJFMzEyOiD3zyDX0sXN0SDXz9PT1MHOz9fMxc7J0SDPws7B0tXWxc7ZIM/bycLLyTsg080uINPU0s/LySwgzsHeyc7BwN3JxdPRICIKKyLTID8/PyIKKworIzogbWVtbGluZS5jOjExNTAKK21zZ2lkICJTZWUgXCI6aGVscCBFMzEyXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICLzzS4gxM/Qz8zOydTFzNjO1cAgyc7Gz9LNwcPJwCDXINPQ0sHXz97OycvFIChcIjpoZWxwIEUzMTJcIikiCisKKyM6IG1lbWxpbmUuYzoxMTU1Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICL3z9PT1MHOz9fMxc7JxSDawdfF0tvFzs8uIPDSz9fF0tjUxSwg19OjIMzJINcg0M/S0cTLxS4iCisKKyM6IG1lbWxpbmUuYzoxMTU2Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKO3P1sXUxSDawdDJ08HU2CDGwcrMINDPxCDE0tXHyc0gyc3FzsXNIMkg09LB187J1NggxcfPINMgydPIz8TO2c1cbiIKKworIzogbWVtbGluZS5jOjExNTcKK21zZ2lkICJhbmQgcnVuIGRpZmYgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSB0byBjaGVjayBmb3IgY2hhbmdlcylcbiIKK21zZ3N0ciAixsHKzM/NINDSySDQz83P3ckg0NLPx9LBzc3ZIGRpZmYpLlxuIgorCisjOiBtZW1saW5lLmM6MTE1OAorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICIiCisi+sHUxc0g1cTBzMnUxSDGwcrMIC5zd3AuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIxNAorbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICLvws7B0tXWxc7ZINPXz9AtxsHKzNk6IgorCisjOiBtZW1saW5lLmM6MTM5MgorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICD3INTFy9Xdxc0gy8HUwczPx8U6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzk0Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIPMg1cvB2sHOztnNIMnNxc7FzTpcbiIKKworIzogbWVtbGluZS5jOjEzOTgKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICD3IMvB1MHMz8fFICAgIgorCisjOiBtZW1saW5lLmM6MTQxNgorbXNnaWQgIiAgICAgIC0tIG5vbmUgLS1cbiIKK21zZ3N0ciAiICAgICAgLS0gzsXUIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDg4Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICDXzMHExczFwzogIgorCisjOiBtZW1saW5lLmM6MTQ5MAorbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgICDEwdTBOiAiCisKKyM6IG1lbWxpbmUuYzoxNDk0IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICAgICAgxMHUwTogIgorCisjOiBtZW1saW5lLmM6MTUxMAorbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgIFvP1CBWaW0g18XS08nJIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTE0Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICBbzsUg0dfM0cXU09Eg09fP0C3GwcrMz80gVmltXSIKKworIzogbWVtbGluZS5jOjE1MTgKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgyc3RIMbByszBOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICDJ2s3FzqPOOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAiWUVTIgorbXNnc3RyICLk4SIKKworIzogbWVtbGluZS5jOjE1MjUKK21zZ2lkICJubyIKK21zZ3N0ciAizsXUIgorCisjOiBtZW1saW5lLmM6MTUyOQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgINDPzNjaz9fB1MXM2DogIgorCisjOiBtZW1saW5lLmM6MTUzNgorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgIMvPzdDYwNTF0jogIgorCisjOiBtZW1saW5lLmM6MTUzOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIMvPzdDYwNTF0jogIgorCisjOiBtZW1saW5lLmM6MTU0NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgIHByb2Nlc3MgSUQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAg0NLPw8XT0zogIgorCisjOiBtZW1saW5lLmM6MTU1MAorbXNnaWQgIiAoc3RpbGwgcnVubmluZykiCittc2dzdHIgIiAoxd2jINfZ0M/MztHF1NPRKSIKKworIzogbWVtbGluZS5jOjE1NjIKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFvOxSDQ0snHz8TFziDEzNEgydPQz8zY2s/Xwc7J0SDTIMTBzs7PyiDXxdLTycXKIFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTY1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW87FINDSycfPxMXOIMTM0SDJ09DPzNjaz9fBzsnRIM7BINzUz80gy8/N0NjA1MXSxV0iCisKKyM6IG1lbWxpbmUuYzoxNTcwCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW87FIN7J1MHF1NPRXSIKKworIzogbWVtbGluZS5jOjE1NzQKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFvOxSDP1MvS2dfBxdTT0V0iCisKKyM6IG1lbWxpbmUuYzoxNzY0Cittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IO7F18/azc/Wzs8gz8LOz9fJ1Ngg09fP0C3GwcrMLCDQz9PLz8zYy9Ugz84gzsUgz8LOwdLV1sXOIgorCisjOiBtZW1saW5lLmM6MTgxNworbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICLz18/QLcbByswgz8LOz9fMo84iCisKKyM6IG1lbWxpbmUuYzoxODE5Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiDuxdXEwd7OwdEg0M/Q2dTLwSDPws7P18zFzsnRINPXz9AtxsHKzMEiCisKKyM6IG1lbWxpbmUuYzoxODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogzsXQ0sHXyczYzs/FINrOwd7FzsnFIGxudW06ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiDOxdfP2s3P1s7PIM7BytTJINPU0s/L1SAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzA2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICLOxdDSwdfJzNjOz8Ug2s7B3sXOycUg1cvB2sHUxczRIMLMz8vBIDMiCisKKyM6IG1lbWxpbmUuYzoyMzg2Cittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICLazsHexc7JxSBzdGFja19pZHggxM/M1s7PIMLZ1Ngg0sHXzs8gMCIKKworIzogbWVtbGluZS5jOjI0NDgKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IO/Czs/XzMXOzyDTzMnby8/NIM3Oz8fPIMLMz8vP1z8iCisKKyM6IG1lbWxpbmUuYzoyNjMwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyA0IgorbXNnc3RyICJFMzE3OiDOxdDSwdfJzNjOz8Ug2s7B3sXOycUg1cvB2sHUxczRIMLMz8vBIDQiCisKKyM6IG1lbWxpbmUuYzoyNjU3Cittc2dpZCAiZGVsZXRlZCBibG9jayAxPyIKK21zZ3N0ciAi1cTBzKPOIMLMz8sgMT8iCisKKyM6IG1lbWxpbmUuYzoyODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiDz1NLPy8EgJWxkIM7FIM/CzsHS1dbFzsEiCisKKyM6IG1lbWxpbmUuYzozMTAwCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzogzsXQ0sHXyczYzs/FINrOwd7FzsnFINXLwdrB1MXM0SDCzM/LwSIKKworIzogbWVtbGluZS5jOjMxMTYKK21zZ2lkICJwZV9saW5lX2NvdW50IGlzIHplcm8iCittc2dzdHIgItrOwd7FzsnFIHBlX2xpbmVfY291bnQg0sHXzs8gztXMwCIKKworIzogbWVtbGluZS5jOjMxNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiDOz83F0iDT1NLPy8kg2sEg0NLFxMXMwc3JIMTJwdDB2s/OwTogJWxkIgorCisjOiBtZW1saW5lLmM6MzE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzogzsXQ0sHXyczYzs/FINrOwd7FzsnFINPeo9TeycvBINPU0s/LINcgwszPy8UgJWxkIgorCisjOiBtZW1saW5lLmM6MzE5OAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICLywdrNxdIg09TFy8Eg1dfFzMnexc4iCisKKyM6IG1lbWxpbmUuYzozMjQ0Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiDOxdDSwdfJzNjOz8Ug2s7B3sXOycUg1cvB2sHUxczRIMLMz8vBIDIiCisKKyM6IG1lbWxpbmUuYzozNjc0Cittc2dpZCAiRTMyNTogQVRURU5USU9OIgorbXNnc3RyICJFMzI1OiD37unt4e7p5SIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyLvws7B0tXWxc4g09fP0C3GwcrMINMgyc3FzsXNIFwiIgorCisjOiBtZW1saW5lLmM6MzY3OQorbXNnaWQgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKK21zZ3N0ciAi8NLJIM/Uy9LZ1MnJIMbByszBOiBcIiIKKworIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICDiz8zFxSDz9+X26eosIN7FzSDT18/QLcbByswhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2OTIKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkg98/azc/Wzs8sINLFxMHL1MnSz9fBzsnFIMbByszBINfZ0M/MztHF1NPRINcgxNLVx8/KINDSz8fSwc3NxS5cbiIKKyIgICAg5dPMySDc1M8g1MHLLCDUzyDC1cTY1MUg187JzcHUxczYztkg0NLJINfOxdPFzsnJIMnazcXOxc7JyixcbiIKKyIgICAg3tTPwtkg1SDXwdMgzsUg0M/R18nMz9PYIMTXwSDSwdrO2cgg18HSycHO1MEgz8TOz8fPIMkg1M/HzyDWxSDGwcrMwS5cbiIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIgICAgUXVpdCwgb3IgY29udGludWUgd2l0aCBjYXV0aW9uLlxuIgorbXNnc3RyICIgICAg+sHXxdLbydTFINLBws/U1SDJzMkg0NLPxM/M1sHK1MUg0yDP09TP0s/Wzs/T1NjALlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSDw0sXE2cTV3cnKINPFwc7TINLFxMHL1MnSz9fBzsnRINzUz8fPIMbByszBINrB18XS26POIMHXwdLJys7PLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NQorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiICAgIPcg3NTPzSDTzNXewcUsIMnT0M/M2NrVytTFIMvPzcHOxNUgXCI6cmVjb3ZlclwiIMnMySBcInZpbSAtciAiCisKKyM6IG1lbWxpbmUuYzozNjk3Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgxMzRINfP09PUwc7P18zFzsnRIMnazcXOxc7JyiAo080uIFwiOmhlbHAg18/T09TBzs/XzMXOycVcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIOXTzMkg19kg1dbFINfZ0M/MztHMySDc1NUgz9DF0sHDycAsINXEwczJ1MUg09fP0C3GwcrMIFwiIgorCisjOiBtZW1saW5lLmM6MzcwMAorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDe1M/C2SDJ2sLF1sHU2CDQz9HXzMXOydEg3NTPx88g08/Pwt3FzsnRINcgwtXE1d3FzS5cbiIKKworIzogbWVtbGluZS5jOjM3MTQgbWVtbGluZS5jOjM3MTgKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIvPXz9AtxsHKzCBcIiIKKworIzogbWVtbGluZS5jOjM3MTUgbWVtbGluZS5jOjM3MjEKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlwiINXWxSDT1d3F09TX1cXUISIKKworIzogbWVtbGluZS5jOjM3MjQKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIPfu6e3h7unlIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIvPXz9AtxsHKzCDV1sUg09XdxdPU19XF1CEiCisKKyM6IG1lbWxpbmUuYzozNzMwCittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImQWJvcnQiCittc2dzdHIgIiIKKyImTyDv1MvS2dTYIMTM0SDe1MXOydFcbiIKKyImRSDyxcTBy9TJ0s/XwdTYXG4iCisiJlIg98/T09TBzs/XydTYXG4iCisiJlEg99nIz8RcbiIKKyImQSDw0sXS18HU2CIKKworIzogbWVtbGluZS5jOjM3MzIKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZBYm9ydFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImTyDv1MvS2dTYIMTM0SDe1MXOydFcbiIKKyImRSDyxcTBy9TJ0s/XwdTYXG4iCisiJlIg98/T09TBzs/XydTYXG4iCisiJlEg99nIz8RcbiIKKyImQSDw0sXS18HU2FxuIgorIiZEIPXEwczJ1NgiCisKKyM6IG1lbWxpbmUuYzozNzg5Cittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjog78LOwdLV1sXOzyDTzMnby8/NIM3Oz8fPINPXz9AtxsHKzM/XIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzog68/N0M/Oxc7UINDV1MkgyyDczMXNxc7U1SDNxc7AIM7FINHXzNHF1NPRINDPxM3FzsAiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiDtxc7AINcg3NTPzSDSxdbJzcUgzsUg09XdxdPU19XF1CIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IO7F1CDNxc7AINMg1MHLyc0gyc3FzsXNIgorCisjOiBtZW51LmM6NTI1Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDog8NXU2CDLIM3FzsAgzsUgxM/M1sXOINfF09TJIMsg0M/EzcXOwCIKKworIzogbWVudS5jOjU2NAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiD8zMXNxc7U2SDNxc7AIM7FzNja0SDEz8LB18zR1NggzsXQz9PSxcTT1NfFzs7PINcg0M/Mz9PL1SDNxc7AIgorCisjOiBtZW51LmM6NTcwCittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiDywdrExczJ1MXMySDOxSDNz8fV1CDC2dTYIMvPzdDPzsXO1M/NINDV1MkgyyDNxc7AIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDk3Cittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g7cXOwCAtLS0iCisKKyM6IG1lbnUuYzoyMDE5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICLv1M/S18HU2CDc1M8gzcXOwCIKKworIzogbWVudS5jOjIwODQKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiDw1dTYIMsgzcXOwCDEz8zWxc4g18XT1MkgyyDczMXNxc7U1SDNxc7AIgorCisjOiBtZW51LmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IO3FzsAgzsUgzsHKxMXOzzogJXMiCisKKyM6IG1lbnUuYzoyMTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IO3FzsAgzsUgz9DSxcTFzMXOzyDEzNEg0sXWyc3BICVzIgorCisjOiBtZW51LmM6MjIxMQorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjog8NXU2CDLIM3FzsAgxM/M1sXOINfF09TJIMsg0M/EzcXOwCIKKworIzogbWVudS5jOjIyMzIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6IO3FzsAgzsUgzsHKxMXOzyAtLSDQ0s/XxdLY1MUgyc3FzsEgzcXOwCIKKworIzogbWVzc2FnZS5jOjQxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAi78LOwdLV1sXOwSDP28nCy8Eg0NLJIM/C0sHCz9TLxSAlczoiCisKKyM6IG1lc3NhZ2UuYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAi09TSz8vBICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NjQ3Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIlvTzMnby8/NIMTMyc7OwdEg09TSz8vBXSIKKworIzogbWVzc2FnZS5jOjc5NworbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICIiCisi8MXSxdfPxCDTz8/C3cXOycogzsEg0tXT08vJyiDR2tnLOiD3wdPJzMnKIPLBx8/ayc4gPHZyckB1c2Vycy5zb3VyY2Vmb3JnZS4iCisibmV0PiIKKworIzogbWVzc2FnZS5jOjEwMjUKK21zZ2lkICJJbnRlcnJ1cHQ6ICIKK21zZ3N0ciAi8NLF0tnXwc7JxTogIgorCisjOiBtZXNzYWdlLmM6MTAyOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAi5MzRINDSz8TPzNbFzsnRIM7B1s3J1MUgRU5URVIiCisKKyM6IG1lc3NhZ2UuYzoxMDMwCittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAi5MzRINDSz8TPzNbFzsnRIM7B1s3J1MUgRU5URVIgyczJINfXxcTJ1MUgy8/Nwc7E1SIKKworIzogbWVzc2FnZS5jOjIzNTEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSDw0s/Ez8zWxc7JxSDTzMXE1cXUIC0tIgorCisjOiBtZXNzYWdlLmM6MjM1NAorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiDT1NLPy8EsIFNQQUNFL2I6INPU0sHOycPBLCBkL3U6INDPzNPU0sHOycPZLCBxOiDX2cjPxCkiCisKKyM6IG1lc3NhZ2UuYzoyMzU1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDog09TSz8vBLCBTUEFDRTog09TSwc7Jw8EsIGQ6INDPzNPU0sHOycPZLCBxOiDX2cjPxCkiCisKKyM6IG1lc3NhZ2UuYzoyOTc2IG1lc3NhZ2UuYzoyOTkxCittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIvfP0NLP0yIKKworIzogbWVzc2FnZS5jOjI5NzgKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIibkwVxuIgorIibuxdQiCisKKyM6IG1lc3NhZ2UuYzozMDExCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJuTBXG4iCisiJu7F1FxuIgorIvPPyNLBzsnU2CAm19PFXG4iCisiJvDP1MXS0dTYINfTxVxuIgorIu8m1M3FzsEiCisKKyM6IG1lc3NhZ2UuYzozMDUyCittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAi88/I0sHOxc7JxSDGwcrMwSIKKworIzogbWVzc2FnZS5jOjMwNTQKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICLv1MvS2dTJxSDGwcrMwSIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzozMTI1Cittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIiIKKyJFMzM4OiDp2tfJzsnUxSwgzs8g1yDLz87Tz8zYzs/NINLF1snNxSDOxdQg0NLP18/EzsnLwSDQzyDGwcrMz9fPyiDTydPUxc3FIgorCisjOiBtaXNjMS5jOjI3NzMKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiDw0sXE1dDSxdbExc7JxTog6drNxc7FzsnFIMbByszBINMg0NLB18HNySDUz8zYy88gxMzRIN7Uxc7J0SIKKworIzogbWlzYzEuYzozMDIxCittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIuTPwsHXzMXOwSDPxM7BINPU0s/LwSIKKworIzogbWlzYzEuYzozMDIzCittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIvXEwczFzsEgz8TOwSDT1NLPy8EiCisKKyM6IG1pc2MxLmM6MzAyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAi5M/CwdfMxc7PINPU0s/LOiAlbGQiCisKKyM6IG1pc2MxLmM6MzAzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIvXEwczFzs8g09TSz8s6ICVsZCIKKworIzogbWlzYzEuYzozMDMzCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAo8NLF0tfBzs8pIgorCisjOiBtaXNjMS5jOjc1ODgKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiDTz8jSwc7RwNTT0SDGwcrM2S4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NzU5OAorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTog58/Uz9fPLlxuIgorCisjOiBtaXNjMi5jOjY5NSBtaXNjMi5jOjcxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICLv++ni6+E6ICIKKworIzogbWlzYzIuYzo3MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbwsHK1F0g19PFx88g19nExcwuLc/T18/CLiAlbHUtJWx1LCDJ09DPzNjaLiAlbHUsIM3By9MuIMnT0M/M2NouICVsdVxuIgorCisjOiBtaXNjMi5jOjcxNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJb19naz9fZXSByZS9tYWxsb2MoKSDX08XHzyAlbHUsIGZyZWUoKSDX08XHzyAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NzIKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiDz1NLPy8Eg09TBzs/XydTT0SDTzMnby8/NIMTMyc7Oz8oiCisKKyM6IG1pc2MyLmM6ODE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiD3ztXU0sXOztHRIM/bycLLwTogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo5MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IO7FIMjXwdTBxdQg0MHN0dTJISAo19nExczRxdTT0SAlbHUgwsHK1CkiCisKKyM6IG1pc2MyLmM6MjU5NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAi99naz9cgz8LPzM/ey8kgxMzRIMnT0M/MzsXOydE6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyODE2Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTog8NLP0NXdxc7PIMTXz8XUz97JxSIKKworIzogbWlzYzIuYzoyODE4IG1pc2MyLmM6Mjg0NQorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0Njog7sXEz9DV09TJzdnKINLF1snNIgorCisjOiBtaXNjMi5jOjI4ODQKK21zZ2lkICJFNTQ3OiBJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkU1NDc6IO7FxM/Q1dPUyc3B0SDGz9LNwSDL1dLTz9LBIgorCisjOiBtaXNjMi5jOjI5MjQKK21zZ2lkICJFNTQ4OiBkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAiRTU0ODog1NLFwtXF1NPRINfXxdPUySDDycbS1SIKKworIzogbWlzYzIuYzoyOTI5Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiDuxcTP0NXT1MnNz8Ug2s7B3sXOycUg0NLPw8XO1M/XIgorCisjOiBtaXNjMi5jOjMyMzkKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICL318XEydTFINDB0s/M2CDEzNEg28nG0s/Xwc7J0TogIgorCisjOiBtaXNjMi5jOjMyNDAKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICIgICAgICAgIPDP19TP0snUxSDX18/EINDB0s/M0ToiCisKKyM6IG1pc2MyLmM6MzI1MAorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICL318XEo87O2cUg0MHSz8zJIM7FINPP19DBxMHA1CEiCisKKyM6IG1pc2MyLmM6Mzc5OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRTM0MzogSW52YWxpZCBwYXRoOiAnKipbbnVtYmVyXScgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIG9yIGJlICIKKyJmb2xsb3dlZCBieSAnJXMnLiIKK21zZ3N0ciAiIgorIkUzNDM6IO7F0NLB18nM2M7PINrBxMHOINDV1Ng6ICcqKlveydPMz10nIMTPzNbOzyDC2dTYIMzJws8g1yDLz87DxSDQ1dTJLCAiCisizMnCzyDawSDOyc0gxM/M1s7PINPMxcTP18HU2CAnJXMnIgorCisjOiBtaXNjMi5jOjUwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDog68HUwczPxyBcIiVzXCIgzsUgzsHKxMXOINcg0NXUySDEzNEg083Fztkgy8HUwczPx8EiCisKKyM6IG1pc2MyLmM6NTA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IObByswgXCIlc1wiINcgydrXxdPUztnIIMvB1MHMz8fByCDOxSDOwcrExc4iCisKKyM6IG1pc2MyLmM6NTA4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiD3INDV1Mkg083Fztkgy8HUwczPx8Egws/M2NvFIM7F1CDLwdTBzM/Hz9cgXCIlc1wiIgorCisjOiBtaXNjMi5jOjUwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiD3IMna18XT1M7ZyCDLwdTBzM/Hwcggws/M2NvFIM7F1CDGwcrMz9cgXCIlc1wiIgorCisjOiBtaXNjMi5jOjUzMjQKK21zZ2lkICJFNTUwOiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTUwOiDw0s/Q1d3Fzs8gxNfPxdTP3snFIgorCisjOiBtaXNjMi5jOjUzMzYKK21zZ2lkICJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAiRTU1MTog7sXEz9DV09TJzdnKIMvPzdDPzsXO1CIKKworIzogbWlzYzIuYzo1MzQ0Cittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IPTSxcLVxdTT0SDVy8HawdTYIMPJxtLVIgorCisjLiBHZXQgaGVyZSB3aGVuIHRoZSBzZXJ2ZXIgY2FuJ3QgYmUgZm91bmQuCisjOiBuZXRiZWFucy5jOjM5NgorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zICMyIgorbXNnc3RyICLuxdfP2s3P1s7PINPPxcTJzsnU2NPRINMgTmV0YmVhbnMgIzIiCisKKyM6IG5ldGJlYW5zLmM6NDA0Cittc2dpZCAiQ2Fubm90IGNvbm5lY3QgdG8gTmV0YmVhbnMiCittc2dzdHIgIu7F18/azc/Wzs8g08/FxMnOydTY09Eg0yBOZXRCZWFucyIKKworIzogbmV0YmVhbnMuYzo0NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY2ODogV3JvbmcgYWNjZXNzIG1vZGUgZm9yIE5ldEJlYW5zIGNvbm5lY3Rpb24gaW5mbyBmaWxlOiBcIiVzXCIiCittc2dzdHIgIiIKKyJFNjY4OiDuxdDSwdfJzNjO2cog0sXWyc0gxM/T1NXQwSDLIMnOxs/SzcHDyckgzyDTz8XEyc7FzsnJINMgTmV0QmVhbnM6IFwiJXNcIiIKKworIzogbmV0YmVhbnMuYzo3NDkKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICLe1MXOycUgydogx87F2sTBIE5ldEJlYW5zIgorCisjOiBuZXRiZWFucy5jOjE2NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY1ODogTmV0QmVhbnMgY29ubmVjdGlvbiBsb3N0IGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFNjU4OiDwz9TF0tHOzyDTz8XEyc7FzsnFINMgTmV0QmVhbnMgxMzRIMLVxsXSwSAlbGQiCisKKyM6IG5vcm1hbC5jOjI5ODAKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICLw0sXE1dDSxdbExc7JxTog1MXSzcnOwcwgzsUgzc/WxdQg19nQz8zO0dTYINDPxNPXxdTL1SIKKworIzogbm9ybWFsLmM6MzI3NgorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IO7F1CDT1NLPy8kg1yDQz9rJw8nJIMvV0tPP0sEiCisKKyM6IG5vcm1hbC5jOjMyNzgKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTog7sXUIMnNxc7JINcg0M/aycPJySDL1dLTz9LBIgorCisjOiBub3JtYWwuYzo0NTE5Cittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIiIKKyJFMzUyOiDuxdfP2s3P1s7PINPUxdLF1Ngg08vMwcTLySDTINTFy9Xdyc0g2s7B3sXOycXNIM/Qw8nJICdmb2xkbWV0aG9kJyIKKworIzogbm9ybWFsLmM6Njc0MAorbXNnaWQgIkU2NjQ6IGNoYW5nZWxpc3QgaXMgZW1wdHkiCittc2dzdHIgIkU2NjQ6INPQydPPyyDJ2s3FzsXOycog0NXT1M/KIgorCisjOiBub3JtYWwuYzo2NzQyCittc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKK21zZ3N0ciAiRTY2Mjog9yDOwd7BzMUg09DJ08vBIMnazcXOxc7JyiIKKworIzogbm9ybWFsLmM6Njc0NAorbXNnaWQgIkU2NjM6IEF0IGVuZCBvZiBjaGFuZ2VsaXN0IgorbXNnc3RyICJFNjYyOiD3IMvPzsPFINPQydPLwSDJ2s3FzsXOycoiCisKKyM6IG5vcm1hbC5jOjgwMDUKK21zZ2lkICJUeXBlICA6cXVpdDxFbnRlcj4gIHRvIGV4aXQgVmltIgorbXNnc3RyICL318XEydTFIDpxdWl0PEVudGVyPiAgxMzRINfZyM/EwSDJ2iBWaW0iCisKKyM6IG9wcy5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgIunazcXOxc7ZIM/U09TV0Nkg1yAxINPU0s/LxSAoJXMgMSDSwdopIgorCisjOiBvcHMuYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIunazcXOxc7ZIM/U09TV0Nkg1yAxINPU0s/LxSAoJXMgJWQg0sHaKSIKKworIzogb3BzLmM6MzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAi6drNxc7Fztkgz9TT1NXQ2SwgJWxkINPU0s/LICglcyAxINLB2ikiCisKKyM6IG9wcy5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAi6drNxc7Fztkgz9TT1NXQ2SwgJWxkINPU0s/LICglcyAlZCDSwdopIgorCisjOiBvcHMuYzo2NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIunazcXO0cDU09Egz9TT1NXQ2SDT1NLPy8HIICglbGQpLi4uIgorCisjOiBvcHMuYzo3MTIKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICLp2s3FzqPOIM/U09TV0CDXIM/Ezs/KINPU0s/LxSAiCisKKyM6IG9wcy5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICLp2s3FzsXO2SDP1NPU1dDZINcg09TSz8vByCAoJWxkKSAiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNjc1Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgItPLz9DJ0s/XwdTYIM7FINXEwczP09gsINXEwczFzsnFINfZ0M/MzsXOzyIKKworIzogb3BzLmM6MjI2MQorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICLJ2s3FzsXOwSAxINPU0s/LwSIKKworIzogb3BzLmM6MjI2MworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiydrNxc7Fzs8g09TSz8s6ICVsZCIKKworIzogb3BzLmM6MjY0NworIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAiz97J3cXOzyDT1NLPyzogJWxkIgorCisjOiBvcHMuYzoyOTI4Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAi08vP0MnSz9fBzsEgz8TOwSDT1NLPy8EiCisKKyM6IG9wcy5jOjI5MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAi08vP0MnSz9fBzs8g09TSz8s6ICVsZCIKKworIzogb3BzLmM6MzIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzUzOiBOb3RoaW5nIGluIHJlZ2lzdGVyICVzIgorbXNnc3RyICJFMzUzOiD3INLFx8nT1NLFICVzIM7J3sXHzyDOxdQiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6Mzc2NgorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDyxcfJ09TS2SAtLS0iCisKKyM6IG9wcy5jOjUwNzUKK21zZ2lkICJJbGxlZ2FsIHJlZ2lzdGVyIG5hbWUiCittc2dzdHIgIu7FxM/Q1dPUyc3PxSDJzdEg0sXHydPU0sEiCisKKyM6IG9wcy5jOjUxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDyxcfJ09TS2TpcbiIKKworIzogb3BzLmM6NTIxMworIywgYy1mb3JtYXQKK21zZ2lkICJFNTc0OiBVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIkU1NzQ6IO7FydrXxdPUztnKINTJ0CDSxcfJ09TSwSAlZCIKKworIzogb3BzLmM6NTY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6IO7FxM/Q1dPUyc3PxSDJzdEg0sXHydPU0sE6ICclcyciCisKKyM6IG9wcy5jOjYwNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAi68/Mz87PyzogJWxkOyAiCisKKyM6IG9wcy5jOjYwNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VsZWN0ZWQgJXMlbGQgb2YgJWxkIExpbmVzOyAlbGQgb2YgJWxkIFdvcmRzOyAlbGQgb2YgJWxkIEJ5dGVzIgorbXNnc3RyICL32cTFzMXOzyAlcyVsZCDJ2iAlbGQg09TSz8s7ICVsZCDJ2iAlbGQg08zP1zsgJWxkIMnaICVsZCDCwcrUIgorCisjOiBvcHMuYzo2MDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAi68/MLiAlcyDJ2iAlczsgINPU0i4gJWxkIMnaICVsZDsg08zP188gJWxkIMnaICVsZDsgwsHK1CAlbGQgydogJWxkIgorCisjOiBvcHMuYzo2MDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCDTINXeo9TPzSBCT00pIgorCisjOiBvcHRpb24uYzoxNjQzCittc2dpZCAiJTwlZiVoJW0lPVBhZ2UgJU4iCittc2dzdHIgIiU8JWYlaCVtJT3z1NIuICVOIgorCisjOiBvcHRpb24uYzoyMDkyCittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICLizMHHz8TB0snNINrBIMnT0M/M2NrP18HOycUgVmltIgorCisjOiBvcHRpb24uYzozNDE5IG9wdGlvbi5jOjM1MzUKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODog7sXJ2tfF09TOwdEgz9DDydEiCisKKyM6IG9wdGlvbi5jOjM0MzIKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTog79DDydEgzsUg0M/ExMXS1snXwcXU09EiCisKKyM6IG9wdGlvbi5jOjM0NTcKK21zZ2lkICJFNTIwOiBOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJFNTIwOiDuxSDEz9DV08vBxdTT0SDXINLF1snNzs/KINPU0s/LxSIKKworIzogb3B0aW9uLmM6MzUyMgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHT3INDP08zFxM7JyiDSwdogz9DDydEgydrNxc7FzsEg1yAiCisKKyM6IG9wdGlvbi5jOjM2NjEKK21zZ2lkICJFNTIxOiBOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiRTUyMTog8M/TzMUgPSDU0sXC1cXU09Eg1cvB2sHU2CDeydPMzyIKKworIzogb3B0aW9uLmM6Mzk4OSBvcHRpb24uYzo0NjE5Cittc2dpZCAiRTUyMjogTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1MjI6IO7FIM/CzsHS1dbFzs8g1yB0ZXJtY2FwIgorCisjOiBvcHRpb24uYzo0MDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IO7FxM/Q1dPUyc3ZyiDTyc3Xz8wgPCVzPiIKKworIzogb3B0aW9uLmM6NDYxMQorbXNnaWQgIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUyOTog+s7B3sXOycUgz9DDyckgJ3Rlcm0nIM7FIM3P1sXUIMLZ1Ngg0NXT1M/KINPU0s/Lz8oiCisKKyM6IG9wdGlvbi5jOjQ2MTQKK21zZ2lkICJFNTMwOiBDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJFNTMwOiD3IMfSwcbJ3sXTy8/NIMnO1MXSxsXK08UgydrNxc7R1Ngg1MXSzcnOwcwgzsXXz9rNz9bOzyIKKworIzogb3B0aW9uLmM6NDYxNgorbXNnaWQgIkU1MzE6IFVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFNTMxOiDkzNEg2sHQ1dPLwSDH0sHGyd7F08vPx88gyc7UxdLGxcrTwSDJ09DPzNja1crUxSBcIjpndWlcIiIKKworIzogb3B0aW9uLmM6NDY0NQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6INrOwd7FzsnRIM/Qw8nKICdiYWNrdXBleHQnIMkgJ3BhdGNobW9kZScg0sHXztkiCisKKyM6IG9wdGlvbi5jOjQ4NjAKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzog7sUgzc/WxdQgwtnU2CDJ2s3FzsXOzyDXIMfSwcbJ3sXTy8/NIMnO1MXSxsXK08UgR1RLKyAyIgorCisjOiBvcHRpb24uYzo1MDE2Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDog8NLP0NXdxc7PIMTXz8XUz97JxSIKKworIzogb3B0aW9uLmM6NTAxOAorbXNnaWQgIkU1MjU6IFplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiRTUyNTog89TSz8vBINMgztXMxdfPyiDEzMnOz8oiCisKKyM6IG9wdGlvbi5jOjUwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUyNjogTWlzc2luZyBudW1iZXIgYWZ0ZXIgPCVzPiIKK21zZ3N0ciAiRTUyNjog8NLP0NXdxc7PIN7J08zPINDP08zFIDwlcz4iCisKKyM6IG9wdGlvbi5jOjUxMDAKK21zZ2lkICJFNTI3OiBNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJFNTI3OiDw0s/Q1d3FzsEg2sHQ0dTB0SIKKworIzogb3B0aW9uLmM6NTEwNworbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IO7Fz8LIz8TJzc8g1cvB2sHU2CDazsHexc7JxSDEzNEgJyIKKworIzogb3B0aW9uLmM6NTE0OAorbXNnaWQgIkU1OTU6IGNvbnRhaW5zIHVucHJpbnRhYmxlIG9yIHdpZGUgY2hhcmFjdGVyIgorbXNnc3RyICJFNTk1OiDTz8TF0tbJ1CDOxdDF3sHUztnKINPJzdfPzCDJzMkg08nN18/MIMTXz8rOz8og28nSyc7ZIgorCisjOiBvcHRpb24uYzo1MTk3Cittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiDuxdDSwdfJzNjO2cUg29LJxtTZIgorCisjOiBvcHRpb24uYzo1MjA1Cittc2dpZCAiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIkU1OTc6IM7F18/azc/Wzs8g19nC0sHU2CDb0snG1M/Xz8ogzsHCz9IiCisKKyM6IG9wdGlvbi5jOjUyMDcKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IO7F0NLB18nM2M7ZyiDb0snG1M/Xz8ogzsHCz9IiCisKKyM6IG9wdGlvbi5jOjUyMTQKK21zZ2lkICJFNTMzOiBjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJFNTMzOiDOxdfP2s3P1s7PINfZwtLB1Ngg29LJxtQg0yDTyc3Xz8zBzckgxNfPys7PyiDbydLJztkiCisKKyM6IG9wdGlvbi5jOjUyMTYKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDog7sXQ0sHXyczYztnKINvSycbUINMg08nN18/Mwc3JIMTXz8rOz8og28nSyc7ZIgorCisjOiBvcHRpb24uYzo1NDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MzU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIkU1MzU6IO7F0NLB18nM2M7ZyiDTyc3Xz8wg0M/TzMUgPCVjPiIKKworIzogb3B0aW9uLmM6NTU5NworbXNnaWQgIkU1MzY6IGNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJFNTM2OiDU0sXC1cXU09Eg2sHQ0dTB0SIKKworIzogb3B0aW9uLmM6NTYwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNTM3OiAnY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICIiCisiRTUzNzog+s7B3sXOycUgz9DDydEgJ2NvbW1lbnRzdHJpbmcnIMTPzNbOzyDC2dTYINDV09TPyiDT1NLPy8/KIMnMySAiCisi08/ExdLWwdTYICVzIgorCisjOiBvcHRpb24uYzo1Njc5Cittc2dpZCAiRTUzODogTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiRTUzODog7dnb2CDOxSDQz8TExdLWydfBxdTT0SIKKworIzogb3B0aW9uLmM6NTk0NworbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IO7F2sHL0tnUwdEg0M/TzMXEz9fB1MXM2M7P09TYINfZ0sHWxc7J0SIKKworIzogb3B0aW9uLmM6NTk1MQorbXNnaWQgIkU1NDE6IHRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJFNTQxOiDTzMnby8/NIM3Oz8fPINzMxc3FztTP1yIKKworIzogb3B0aW9uLmM6NTk1MworbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiDOxdPCwczBztPJ0s/Xwc7O2cUgx9LV0NDZIgorCisjOiBvcHRpb24uYzo2MTkzCittc2dpZCAiRTU5MDogQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTU5MDog78vOzyDQ0sXE0NLP083P1NLBINXWxSDF09TYIgorCisjOiBvcHRpb24uYzo2NDUwCittc2dpZCAiVzE3OiBBcmFiaWMgcmVxdWlyZXMgVVRGLTgsIGRvICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKK21zZ3N0ciAiIgorIlcxNzog4dLBwtPLycog1NLFwtXF1CDJ09DPzNjaz9fBzsnRIFVURi04LCDX18XEydTFICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKKworIzogb3B0aW9uLmM6Njc4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNTkzOiBOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICJFNTkzOiDu1dbOzyDIz9TRIMLZICVkINPU0s/LIgorCisjOiBvcHRpb24uYzo2NzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDog7tXWzs8gyM/U0SDC2SAlZCDLz8zPzs/LIgorCisjOiBvcHRpb24uYzo3MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTog7sXJ2tfF09TOwdEgz9DDydE6ICVzIgorCisjOiBvcHRpb24uYzo3MjIwCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g9MXSzcnOwczYztnFIMvPxNkgLS0tIgorCisjOiBvcHRpb24uYzo3MjIyCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g58zPwsHM2M7ZxSDazsHexc7J0SDP0MPJyiAtLS0iCisKKyM6IG9wdGlvbi5jOjcyMjQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIO3F09TO2cUg2s7B3sXOydEgz9DDycogLS0tIgorCisjOiBvcHRpb24uYzo3MjI2Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDv0MPJySAtLS0iCisKKyM6IG9wdGlvbi5jOjc5MzIKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1Njog7/vp4uvhIGdldF92YXJwIgorCisjOiBvcHRpb24uYzo4OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IO7F1CDTz8/U18XU09TX1cDdxcfPINPJzdfPzMEgxMzRICVzIgorCisjOiBvcHRpb24uYzo4OTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IOzJ287JxSDTyc3Xz8zZINDP08zFINTP3svJINMg2sHQ0dTPyjogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjgwCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICLOxdfP2s3P1s7PIM/Uy9LZ1NggIgorCisjOiBvc19hbWlnYS5jOjMxNAorbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTog7sXXz9rNz9bOzyDP1MvS2dTYIM/Lzs8hXG4iCisKKyM6IG9zX2FtaWdhLmM6MzM4Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAi7sXPwsjPxMnNwSBBbWlnYWRvcyDXxdLTyckgMi4wNCDJzMkgws/MxcUg0M/axM7FylxuIgorCisjOiBvc19hbWlnYS5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIu7Fz8LIz8TJzcEgJXMg18XS08nJICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQxNgorbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAi7sXXz9rNz9bOzyDP1MvS2dTYIE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MjcKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAi7sXXz9rNz9bOzyDTz9rEwdTYICIKKworIzogb3NfYW1pZ2EuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICLw0sXL0sHdxc7JxSDSwcLP1NkgVmltINMgy8/Ez80gJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MzcKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICLOxdfP2s3P1s7PINPNxc7J1Ngg0sXWyc0gy8/O08/MyT8hXG4iCisKKyM6IG9zX2FtaWdhLmM6MTAwMworbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF9zaGVsbHNpemU6IM7FINcgy8/O08/MyT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNTIKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDog7sXXz9rNz9bOzyDX2dDPzM7J1Nggz8LPzM/ey9Ug0yDB0sfVzcXO1M/NIC1mIgorCisjOiBvc19hbWlnYS5jOjExOTMgb3NfYW1pZ2EuYzoxMjgzCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICLuxdfP2s3P1s7PINfZ0M/MzsnU2CAiCisKKyM6IG9zX2FtaWdhLmM6MTE5NiBvc19hbWlnYS5jOjEyOTMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgIs/Cz8zP3svBICIKKworIzogb3NfYW1pZ2EuYzoxMjE2IG9zX2FtaWdhLmM6MTMxOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIg2sHXxdLbyczBINLBws/U1VxuIgorCisjOiBvc19hbWlnYS5jOjE0NTkKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAi08zJ28vPzSDNwczB0SDXxczJ3snOwSBBTkNIT1JfQlVGX1NJWkUuIgorCisjOiBvc19hbWlnYS5jOjE0NjMKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIu/76eLr4SD39+/k4S/3+ffv5OEiCisKKyM6IG9zX21zd2luLmM6NTM5Cittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLijPwtLF2sHOzykiCisKKyM6IG9zX21zd2luLmM6NjQxCittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIvrOwd7FzsnFIM/Qw8nJICdjb2x1bW5zJyDOxSDSwdfOzyA4MCwg187F287JxSDQ0s/H0sHNzdkgzsUg19nQz8zO0cDU09EiCisKKyM6IG9zX21zd2luLmM6MTk3MworbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTMyNzog7sXVxMHezs/FINrB18XS28XOycUg19nCz9LBINDSyc7UxdLBIgorCisjOiBvc19tc3dpbi5jOjIwMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgItcgJXMgzsEgJXMiCisKKyM6IG9zX21zd2luLmM6MjAyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IO7FydrXxdPUztnKINvSycbUINDSyc7UxdLBOiAlcyIKKworIzogb3NfbXN3aW4uYzoyMDc3IG9zX21zd2luLmM6MjA4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM4OiBQcmludCBlcnJvcjogJXMiCittc2dzdHIgIkUyMzg6IO/bycLLwSDQxd7B1Mk6ICVzIgorCisjOiBvc19tc3dpbi5jOjIwODgKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICLuxcna18XT1M7PIgorCisjOiBvc19tc3dpbi5jOjIxMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAi8MXewdTYICclcyciCisKKyM6IG9zX21zd2luLmM6MzIwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDog7sXEz9DV09TJzc/FIMnN0SDLz8TJ0s/Xy8kgXCIlc1wiINcgyc3Fzskg29LJxtTBIFwiJXNcIiIKKworIzogb3NfbXN3aW4uYzozMjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6IO7FxM/Q1dPUyc3ZyiDTyc3Xz8wgJyVjJyDXIMnNxc7JINvSycbUwSBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyNTkKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiDuxcTP0NXT1MnNz8Ug2s7B3sXOycUgz9DDyckgJ29zZmlsZXR5cGUnIC0tIMnT0M/M2NrVxdTT0SBUZXh0IgorCisjOiBvc191bml4LmM6OTI3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTog5NfPys7PyiDTycfOwcwsINrB18XS28XOycUg0sHCz9TZXG4iCisKKyM6IG9zX3VuaXguYzo5MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IPDPzNXexc4g1cLJytPU18XOztnKINPJx87BzCAlc1xuIgorCisjOiBvc191bml4LmM6OTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiDwz8zV3sXOINXCycrT1NfFzs7ZyiDTycfOwcxcbiIKKworIzogb3NfdW5peC5jOjExOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRvb2sgJWxkIG1zZWMiCittc2dzdHIgIu/Uy9LZ1MnFIMTJ09DMxdEgWCDawc7RzM8gJWxkIG1zZWMiCisKKyM6IG9zX3VuaXguYzoxMjI2Cittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZpbTog79vJwsvBIFhcbiIKKworIzogb3NfdW5peC5jOjEzMzQKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICLw0s/XxdLLwSDEydPQzMXRIFgg2sHXxdLbxc7BIM7F1cTB3s7PIgorCisjOiBvc191bml4LmM6MTQ3MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIu/Uy9LZ1MnFIMTJ09DMxdEgWCDOxSDX2dDPzM7Fzs8g1yDP1NfFxKPOzs/FINfSxc3RIgorCisjOiBvc191bml4LmM6MzIyNyBvc191bml4LmM6MzkwNworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyLuxdfP2s3P1s7PINrB0NXT1MnU2CDPws/Mz97L1SAiCisKKyM6IG9zX3VuaXguYzozMjc1Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyLuxdfP2s3P1s7PINrB0NXT1MnU2CDPws/Mz97L1SBzaFxuIgorCisjOiBvc191bml4LmM6MzI3OSBvc191bml4LmM6MzkxMworbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyLvws/Mz97LwSDawdfF0tvJzMEg0sHCz9TVICIKKworIzogb3NfdW5peC5jOjM0MTQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisi7sXXz9rNz9bOzyDTz9rEwdTYINTS1cLZXG4iCisKKyM6IG9zX3VuaXguYzozNDI5Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyLuxdfP2s3P1s7PINfZ0M/MzsnU2CBmb3JrKClcbiIKKworIzogb3NfdW5peC5jOjM5MjAKK21zZ2lkICIiCisiXG4iCisiQ29tbWFuZCB0ZXJtaW5hdGVkXG4iCittc2dzdHIgIiIKKyJcbiIKKyL32dDPzM7FzsnFIMvPzcHOxNkg0NLF0tfBzs9cbiIKKworIzogb3NfdW5peC5jOjQxODQgb3NfdW5peC5jOjQzMDkgb3NfdW5peC5jOjU5NzUKK21zZ2lkICJYU01QIGxvc3QgSUNFIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAg1dTF0tHOzyDTz8XEyc7FzsnFIElDRSIKKworIzogb3NfdW5peC5jOjU1NTgKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICLuxdXEwd7Oz8Ugz9TL0tnUycUgxMnT0MzF0SBYIgorCisjOiBvc191bml4LmM6NTg4MAorbXNnaWQgIlhTTVAgaGFuZGxpbmcgc2F2ZS15b3Vyc2VsZiByZXF1ZXN0IgorbXNnc3RyICJYU01QIM/C0sHCwdTZ18HF1CDawdDSz9Mg08HNz9PPyNLBzsXOydEiCisKKyM6IG9zX3VuaXguYzo1OTk5Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgz9TL0tnXwcXUINPPxcTJzsXOycUiCisKKyM6IG9zX3VuaXguYzo2MDE4Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIlhTTVAg0M/UxdLRzs8g08zF1sXOycUg2sEg08/FxMnOxc7Jxc0gSUNFIgorCisjOiBvc191bml4LmM6NjAzOAorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgzsXVxMHezs8g19nQz8zOxc7PIFNtY09wZW5Db25uZWN0aW9uOiAlcyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAi9yDT1NLPy8UiCisKKyM6IG9zX3czMmV4ZS5jOjY1Cittc2dpZCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tbWFuZCBsaW5lLiIKK21zZ3N0ciAi7sXXz9rNz9bOzyDX2cTFzMnU2CDQwc3R1NggxMzRIMvPzcHOxM7PyiDT1NLPy8kuIgorCisjOiBvc193MzJleGUuYzo2NiBvc193MzJleGUuYzo4OSBvc193MzJleGUuYzoxMDAKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIu/bycLLwSBWSU0iCisKKyM6IG9zX3czMmV4ZS5jOjg5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAi7sXXz9rNz9bOzyDawcfS1drJ1NggdmltMzIuZGxsISIKKworIzogb3NfdzMyZXhlLmM6OTkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICLuxdfP2s3P1s7PIMnT0NLB18nU2CDVy8HawdTFzMkgxtXOy8PJyiDEzNEgRExMISIKKworIzogb3Nfd2luMTYuYzozNDIgb3Nfd2luMzIuYzozMjE2CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICLawdfF0tvFzsnFINLBws/U2SDPws/Mz97LySDTIMvPxM/NICVkIgorCisjOiBvc193aW4zMi5jOjI2NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiDwxdLFyNfB3sXOzyDTz8LZ1MnFICVzXG4iCisKKyM6IG9zX3dpbjMyLmM6MjY3NgorbXNnaWQgImNsb3NlIgorbXNnc3RyICLawcvS2dTJxSIKKworIzogb3Nfd2luMzIuYzoyNjc4Cittc2dpZCAibG9nb2ZmIgorbXNnc3RyICLP1MvMwN7FzsnFIgorCisjOiBvc193aW4zMi5jOjI2NzkKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAi2sHXxdLbxc7JxSIKKworIzogb3Nfd2luMzIuYzozMTY5Cittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IOvPzcHOxMEgzsUgzsHKxMXOwSIKKworIzogb3Nfd2luMzIuYzozMTgyCittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSDOxSDOwcrExc4g1yDQ1dTJLCDawcTBzs7PzSDXICRQQVRILlxuIgorIvfOxdvOycUgy8/Nwc7E2SDOxSDC1cTV1CDP09TBzsHXzMnXwdTY09Eg0M/TzMUg19nQz8zOxc7J0S5cbiIKKyLkz9DPzM7J1MXM2M7B0SDJzsbP0s3Bw8nRINcgOmhlbHAgd2luMzItdmltcnVuIgorCisjOiBvc193aW4zMi5jOjMxODUKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAi8NLFxNXQ0sXWxMXOycUgVmltIgorCisjOiBxdWlja2ZpeC5jOjI1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IPcg09TSz8vFIMbP0s3B1MEg08zJ28vPzSDNzs/HzyAlJSVjIgorCisjOiBxdWlja2ZpeC5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Mzog7sXP1snEwc7O2cog3MzFzcXO1CAlJSVjINcg09TSz8vFIMbP0s3B1MEiCisKKyM6IHF1aWNrZml4LmM6MzI1Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IPcg09TSz8vFIMbP0s3B1MEg0NLP0NXdxc7BIF0iCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogJSUlYyDOxSDQz8TExdLWydfBxdTT0SDXINPU0s/LxSDGz9LNwdTBIgorCisjOiBxdWlja2ZpeC5jOjM1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6IO7FxM/Q1dPUyc3ZyiAlJSVjINcg0NLJ09TB18vFINcg09TSz8vFIMbP0s3B1MEiCisKKyM6IHF1aWNrZml4LmM6MzY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzc6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc3OiDuxcTP0NXT1MnN2cogJSUlYyDXINPU0s/LxSDGz9LNwdTBIgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODog9yDazsHexc7JySDP0MPJySAnZXJyb3Jmb3JtYXQnIM/U09XU09TX1cXUINvBwszPziIKKworIzogcXVpY2tmaXguYzo1MDEKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiDJzdEgy8HUwczPx8EgzsUg2sHEwc7PIMnMySDSwdfOzyDQ1dPUz8og09TSz8vFIgorCisjOiBxdWlja2ZpeC5jOjk5MAorbXNnaWQgIkU1NTM6IE5vIG1vcmUgaXRlbXMiCittc2dzdHIgIkU1NTM6IOLPzNjbxSDOxdQg3MzFzcXO1M/XIgorCisjOiBxdWlja2ZpeC5jOjEyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIMnaICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMjMxCittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKNPU0s/LwSDVxMHMxc7BKSIKKworIzogcXVpY2tmaXguYzoxNDQ0Cittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiD3zsna1SDT1MXLwSDC2dPU0tnIIMnT0NLB18zFzsnKIgorCisjOiBxdWlja2ZpeC5jOjE0NTMKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IO7B18XSyNUg09TFy8EgwtnT1NLZyCDJ09DSwdfMxc7JyiIKKworIzogcXVpY2tmaXguYzoxNDY1CisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAi09DJ08/LIM/bycLPyyAlZCDJ2iAlZDsgJWQgz9vJws/LIgorCisjOiBxdWlja2ZpeC5jOjE5NDMKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICIiCisiRTM4Mjog+sHQydPYIM7F18/azc/WzsEsINrOwd7FzsnFIM/Qw8nJICdidWZ0eXBlJyDOxSDR18zRxdTT0SDQ1dPUz8og09TSz8vPyiIKKworIzogcmVnZXhwLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjk6IGludmFsaWQgaXRlbSBpbiAlcyUlW10iCittc2dzdHIgIkUzNjk6IM7FxM/Q1dPUyc3ZyiDczMXNxc7UINcgJXMlJVtdIgorCisjOiByZWdleHAuYzo4MzgKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiDzzMnby8/NIMTMyc7O2cog28HCzM/OIgorCisjOiByZWdleHAuYzoxMDA5Cittc2dpZCAiRTUwOiBUb28gbWFueSBcXHooIgorbXNnc3RyICJFNTA6IPPMydvLz80gzc7Px88gXFx6KCIKKworIzogcmVnZXhwLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTE6IFRvbyBtYW55ICVzKCIKK21zZ3N0ciAiRTUxOiDzzMnby8/NIM3Oz8fPICVzKCIKKworIzogcmVnZXhwLmM6MTA3NworbXNnaWQgIkU1MjogVW5tYXRjaGVkIFxceigiCittc2dzdHIgIkU1Mjog7sXUINDB0tkgxMzRIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1Mzog7sXUINDB0tkgxMzRICVzJSUoIgorCisjOiByZWdleHAuYzoxMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiDuxdQg0MHS2SDEzNEgJXMoIgorCisjOiByZWdleHAuYzoxMDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTogVW5tYXRjaGVkICVzKSIKK21zZ3N0ciAiRTU1OiDuxdQg0MHS2SDEzNEgJXMpIgorCisjOiByZWdleHAuYzoxMjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1Njog18/azc/Wzs8g0NXT1M/KIM/QxdLBzsQgJXMqIgorCisjOiByZWdleHAuYzoxMjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzogJXMrIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1Nzog18/azc/Wzs8g0NXT1M/KIM/QxdLBzsQgJXMrIgorCisjOiByZWdleHAuYzoxMzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IM7FxM/Q1dPUyc3ZyiDTyc3Xz8wg0M/TzMUgJXNAIgorCisjOiByZWdleHAuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1ODog18/azc/Wzs8g0NXT1M/KIM/QxdLBzsQgJXN7IgorCisjOiByZWdleHAuYzoxMzU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiDzzMnby8/NIM3Oz8fPINPMz9bO2cggy8/O09TS1cvDycogJXN7Li4ufSIKKworIzogcmVnZXhwLmM6MTM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTog98zP1sXOztnFICVzKiIKKworIzogcmVnZXhwLmM6MTM3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6IPfMz9bFzs7ZxSAlcyVjIgorCisjOiByZWdleHAuYzoxNDkxCittc2dpZCAiRTYzOiBpbnZhbGlkIHVzZSBvZiBcXF8iCittc2dzdHIgIkU2MzogzsXEz9DV09TJzc/FIMnT0M/M2NrP18HOycUgXFxfIgorCisjOiByZWdleHAuYzoxNTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyDOySDawSDexc0gzsUg08zFxNXF1CIKKworIzogcmVnZXhwLmM6MTU5MgorbXNnaWQgIkU2NTogSWxsZWdhbCBiYWNrIHJlZmVyZW5jZSIKK21zZ3N0ciAiRTY1OiDuxcTP0NXT1MnNwdEgz8LSwdTOwdEg09PZzMvBIgorCisjOiByZWdleHAuYzoxNjA1Cittc2dpZCAiRTY2OiBcXHooIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU2NjogXFx6KCDOxSDNz9bF1CDC2dTYIMnT0M/M2NrP18HOzyDaxMXT2CIKKworIzogcmVnZXhwLmM6MTYyNAorbXNnaWQgIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY3OiBcXHoxIMkg1C7QLiDOxSDNz8fV1CDC2dTYIMnT0M/M2NrP18HO2SDaxMXT2CIKKworIzogcmVnZXhwLmM6MTYzNQorbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IO7FxM/Q1dPUyc3ZyiDTyc3Xz8wg0M/TzMUgXFx6IgorCisjOiByZWdleHAuYzoxNjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2OTogTWlzc2luZyBdIGFmdGVyICVzJSVbIgorbXNnc3RyICJFNjk6IPDSz9DV3cXOwSBdINDP08zFICVzJSVbIgorCisjOiByZWdleHAuYzoxNzAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MDogRW1wdHkgJXMlJVtdIgorbXNnc3RyICJFNzA6IPDV09TPxSAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjE3NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6IO7FxM/Q1dPUyc3ZyiDTyc3Xz8wg0M/TzMUgJXMlJSIKKworIzogcmVnZXhwLmM6MjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJFNTU0OiBTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAiRTU1NDog88nO1MHL08nexdPLwdEgz9vJwsvBINcgJXN7Li4ufSIKKworIzogcmVnZXhwLmM6Mjg2MyByZWdleHAuYzozMDE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIiIKKyJFMzYxOiDw0sXEz9TX0sHdxc7PIMHXwdLJys7PxSDawdfF0tvFzsnFOiDTzMnby8/NINPMz9bOz8Ug0sXH1czR0s7PxSAiCisi19nSwdbFzsnFPyIKKworIzogcmVnZXhwLmM6MzAwNCByZWdleHAuYzozMDEzCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiDQ0snNxc7FzsnFINvBwszPzsEg0NLJ18XMzyDLIM/bycLLxSDX2cjPxMEg2sEg0NLFxMXM2SDT1MXLwSIKKworIzogcmVnZXhwLmM6MzI1OAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIvfOxdvOycUg0M/E08/P1NfF1NPU18nROlxuIgorCisjOiBzY3JlZW4uYzoyMTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0tJTNsZCDT1NLPyyDXINPLzMHEy8UiCisKKyM6IHNjcmVlbi5jOjc5OTYKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiD36fL09eHs+O7h8SD64e3l7uEiCisKKyM6IHNjcmVlbi5jOjgwMDAKK21zZ2lkICIgUkVQTEFDRSIKK21zZ3N0ciAiIPrh7eXu4SIKKworIzogc2NyZWVuLmM6ODAwNQorbXNnaWQgIiBSRVZFUlNFIgorbXNnc3RyICIg7+Ly4fTu4fEiCisKKyM6IHNjcmVlbi5jOjgwMDcKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIg9/P04ffr4SIKKworIzogc2NyZWVuLmM6ODAxMAorbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiICjX09TB18vBKSIKKworIzogc2NyZWVuLmM6ODAxMgorbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAo2sHNxc7BKSIKKworIzogc2NyZWVuLmM6ODAxNAorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKNfJ0tTVwczYzsHRINrBzcXOwSkiCisKKyM6IHNjcmVlbi5jOjgwMTcKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIg6dfSydQiCisKKyM6IHNjcmVlbi5jOjgwMjgKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIg4dLBwtPLycoiCisKKyM6IHNjcmVlbi5jOjgwMzEKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKNHa2cspIgorCisjOiBzY3JlZW4uYzo4MDM1Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAo18vMxcrLwSkiCisKKyM6IHNjcmVlbi5jOjgwNDgKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIg9+n69eHs+O756iDy5fbp7SIKKworIzogc2NyZWVuLmM6ODA0OQorbXNnaWQgIiBWSVNVQUwgTElORSIKK21zZ3N0ciAiIPfp+vXh7Pju4fEg8/Ty7+vhIgorCisjOiBzY3JlZW4uYzo4MDUwCittc2dpZCAiIFZJU1VBTCBCTE9DSyIKK21zZ3N0ciAiIPfp+vXh7Pju+eog4uzv6yIKKworIzogc2NyZWVuLmM6ODA1MQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiD3+eTl7OXu6eUiCisKKyM6IHNjcmVlbi5jOjgwNTIKK21zZ2lkICIgU0VMRUNUIExJTkUiCittc2dzdHIgIiD3+eTl7OXu6eUg8/Ty7+vpIgorCisjOiBzY3JlZW4uYzo4MDUzCittc2dpZCAiIFNFTEVDVCBCTE9DSyIKK21zZ3N0ciAiIPf55OXs5e7p5SDi7O/r4SIKKworIzogc2NyZWVuLmM6ODA2OCBzY3JlZW4uYzo4MTMxCittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICLawdDJ09giCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICLQz8nTyyDC1cTF1CDQ0s/Ez8zWxc4g0yDr7+7j4SDEz8vVzcXO1MEiCisKKyM6IHNlYXJjaC5jOjM4Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICLQz8nTyyDC1cTF1CDQ0s/Ez8zWxc4g0yDu4f7h7OEgxM/L1c3FztTBIgorCisjOiBzZWFyY2guYzo1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4Mzog7sXQ0sHXyczYzsHRINPU0s/LwSDQz8nTy8E6ICVzIgorCisjOiBzZWFyY2guYzo4NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiDQz8nTyyDawcvPzt7FziDXIO7h/uHs5SDEz8vVzcXO1ME7ICVzIM7FIM7BysTFzs8iCisKKyM6IHNlYXJjaC5jOjg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6INDPydPLINrBy8/O3sXOINcg6+/u4+UgxM/L1c3FztTBOyAlcyDOxSDOwcrExc7PIgorCisjOiBzZWFyY2guYzoxMjQ5Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiDwz9PMxSAnOycgz9bJxMHF1NPRINfXz8QgJz8nIMnMySAnLyciCisKKyM6IHNlYXJjaC5jOjM3NTkKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICjXy8zA3sHF1CDSwc7OxcUg0M/LwdrBzs7ZxSDTz8/U18XU09TXydEpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3NzkKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0g98vMwN6jzs7ZxSDGwcrM2SAiCisKKyM6IHNlYXJjaC5jOjM3ODEKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICLOxSDOwcrExc7PICIKKworIzogc2VhcmNoLmM6Mzc4MgorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgItDPINDV1MkgLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM4MzkKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAo9dbFINDPy8Hawc7PKSIKKworIzogc2VhcmNoLmM6Mzg0MQorbXNnaWQgIiAgTk9UIEZPVU5EIgorbXNnc3RyICIg7uUg7uHq5OXu7yIKKworIzogc2VhcmNoLmM6Mzg5MworIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAi8NLP083P1NIg18vMwN6jzs7ZyCDGwcrMz9c6ICVzIgorCisjOiBzZWFyY2guYzo0MTExCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiDzz8/U18XU09TXycUg1yDUxcvV3cXKINPU0s/LxSIKKworIzogc2VhcmNoLmM6NDI1NAorbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICLuwcrExc7ZINfTxSDXy8zA3qPOztnFIMbByszZIgorCisjOiBzZWFyY2guYzo0MjU2Cittc2dpZCAiTm8gaW5jbHVkZWQgZmlsZXMiCittc2dzdHIgIvfLzMDeo87O2cggxsHKzM/XIM7F1CIKKworIzogc2VhcmNoLmM6NDI3MgorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODog79DSxcTFzMXOycUgzsUgzsHKxMXOzyIKKworIzogc2VhcmNoLmM6NDI3NAorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTog+8HCzM/OIM7FIM7BysTFziIKKworIzogc3ludGF4LmM6MzA1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDog7sXEz9DV09TJzdnKIMHSx9XNxc7UOiAlcyIKKworIzogc3ludGF4LmM6MzIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTog88nO1MHL08nexdPLycogy8zB09TF0iAlcyDOxSDOwcrExc4iCisKKyM6IHN5bnRheC5jOjMzOTQKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIvPJztTBy9PJ3sXTy8nFINzMxc3FztTZIMTM0SDEwc7Oz8fPIMLVxsXSwSDOxSDP0NLFxMXMxc7ZIgorCisjOiBzeW50YXguYzozNDAyCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICLzyc7I0s/OydrBw8nRINDPIMvPzc3FztTB0snRzSDXINPUyczFINHa2cvBIEMiCisKKyM6IHN5bnRheC5jOjM0MTAKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICLCxdog08nOyNLPzsnawcPJySIKKworIzogc3ludGF4LmM6MzQxMworbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAi08nOyNLPzsnawcPJ0SDOwd7B1MEgIgorCisjOiBzeW50YXguYzozNDE1IHN5bnRheC5jOjM0OTAKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIg09TSz8sg0MXSxcQg18XSyM7FyiDT1NLPy8/KIgorCisjOiBzeW50YXguYzozNDIwCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g/MzFzcXO1Nkg08nOyNLPzsnawcPJySDTyc7UwcvTydPBIC0tLSIKKworIzogc3ludGF4LmM6MzQyNQorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisi08nOyNLPzsnawcPJ0SDQzyDczMXNxc7Uwc0iCisKKyM6IHN5bnRheC5jOjM0MzEKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g88nO1MHL08nexdPLycUg3MzFzcXO1NkgLS0tIgorCisjOiBzeW50YXguYzozNDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDzyc7UwcvTyd7F08vJyiDLzMHT1MXSICVzIM7FIM7BysTFziIKKworIzogc3ludGF4LmM6MzQ4MAorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICLNyc7JzdXNICIKKworIzogc3ludGF4LmM6MzQ4NworbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICLNwcvTyc3VzSAiCisKKyM6IHN5bnRheC5jOjM0OTkKK21zZ2lkICI7IG1hdGNoICIKK21zZ3N0ciAiOyDTz8/U18XU09TXycUgIgorCisjOiBzeW50YXguYzozNTAxCittc2dpZCAiIGxpbmUgYnJlYWtzIgorbXNnc3RyICIg0MXSxc7P08/XINPU0s/LIgorCisjOiBzeW50YXguYzo0MTM1Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiDaxMXT2CDOxczY2tEgydPQz8zY2s/XwdTYIGdyb3VwW3RdaGVyZSIKKworIzogc3ludGF4LmM6NDE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IPzMxc3FztQgz8LMwdPUySDEzNEgJXMgzsUgzsHKxMXOIgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6INrExdPYIM7FzNja0SDJ09DPzNjaz9fB1NggwdLH1c3FztQgY29udGFpbnMiCisKKyM6IHN5bnRheC5jOjQxOTgKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5Njog2sTF09ggzsXM2NrRIMnT0M/M2NrP18HU2CDB0sfVzcXO1CBjb250YWluZWRpbiIKKworIzogc3ludGF4LmM6NDI3NgorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiD00sXC1cXU09Eg1cvB2sHU2CDJzdEgxsHKzMEiCisKKyM6IHN5bnRheC5jOjQ2MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiDw0s/Q1d3Fzs8gJz0nOiAlcyIKKworIzogc3ludGF4LmM6NDc3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIKK21zZ3N0ciAiRTM5OTog7sUgyNfB1MHF1CDB0sfVzcXO1M/XOiDTyc7UwcvTyd7F08vJyiDSxcfJz84gJXMiCisKKyM6IHN5bnRheC5jOjUxMDMKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDog68zB09TF0iDOxSDVy8Hawc4iCisKKyM6IHN5bnRheC5jOjUxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTog7sUgzsHKxMXOINLB2sTFzMnUxczYINvBwszPzs/XOiAlcyIKKworIzogc3ludGF4LmM6NTIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiDt1dPP0iDQz9PMxSDbwcLMz87BOiAlcyIKKworIzogc3ludGF4LmM6NTMwNQorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIiIKKyJFNDAzOiDTyc7I0s/OydrBw8nRINPJztTBy9PJ08E6INvBwszPziDQ0s/Ez8zWxc7JyiDT1NLPy8kg1cvB2sHOIMTXwdbE2SIKKworIzogc3ludGF4LmM6NTM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IO7FxM/Q1dPUyc3ZxSDB0sfVzcXO1Nk6ICVzIgorCisjOiBzeW50YXguYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IPDSz9DV3cXOINrOwcsg0sHXxc7T1NfBOiAlcyIKKworIzogc3ludGF4LmM6NTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IPDV09TPyiDB0sfVzcXO1DogJXMiCisKKyM6IHN5bnRheC5jOjU0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMgzsUgxM/Q1dPLwcXU09Eg1yDc1M/NIM3F09TFIgorCisjOiBzeW50YXguYzo1NDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgxM/M1s7PIMLZ1Ngg0MXS19nNINcg09DJ08vFIGNvbnRhaW5zIgorCisjOiBzeW50YXguYzo1NTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IO7FydrXxdPUzsHRIMfS1dDQwTogJXMiCisKKyM6IHN5bnRheC5jOjU3NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiDuxdDSwdfJzNjOwdEg0M/Ey8/Nwc7EwSA6c3ludGF4OiAlcyIKKworIzogc3ludGF4LmM6NjEzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogx9LV0NDBINDPxNPXxdTLySDTyc7UwcvTydPBICVzIM7FIM7BysTFzsEiCisKKyM6IHN5bnRheC5jOjYxNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IO7FIMjXwdTBxdQgwdLH1c3FztTP1zogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IPPMydvLz80gzc7Px88gwdLH1c3FztTP1zogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE4NworbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDog1SDH0tXQ0NkgxdPU2CDTz8LT1NfFzs7ZxSDOwdPU0s/Ky8ksINPT2czLwSDJx87P0snS1cXU09EiCisKKyM6IHN5bnRheC5jOjYzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogzsXP1snEwc7O2cog2s7ByyDSwdfFztPU18E6ICVzIgorCisjOiBzeW50YXguYzo2MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6INDSz9DV3cXOINrOwcsg0sHXxc7T1NfBOiAlcyIKKworIzogc3ludGF4LmM6NjM4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzog0NLP0NXdxc4gwdLH1c3FztQ6ICVzIgorCisjOiBzeW50YXguYzo2NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTg6IElsbGVnYWwgdmFsdWU6ICVzIgorbXNnc3RyICJFNDE4OiDuxcTP0NXT1MnNz8Ug2s7B3sXOycU6ICVzIgorCisjOiBzeW50YXguYzo2NTM2Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTog7sXJ2tfF09TO2cogw9fF1CDUxcvT1MEiCisKKyM6IHN5bnRheC5jOjY1NDcKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiDuxcna18XT1M7ZyiDD18XUIMbPzsEiCisKKyM6IHN5bnRheC5jOjY2MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiDpzdEgyczJIM7PzcXSIMPXxdTBIM7FIMna18XT1M7POiAlcyIKKworIzogc3ludGF4LmM6NjgxNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjog08zJ28vPzSDEzMnOztnKIMvPxCDUxdLNyc7BzME6ICVzIgorCisjOiBzeW50YXguYzo2ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiDuxcTP0NXT1MnN2cogwdLH1c3FztQ6ICVzIgorCisjOiBzeW50YXguYzo3MzkwCittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDog6dPQz8zY2tXF1NPRINPMydvLz80gzc7Px88g0sHaztnIIMHU0snC1dTP1yDQz8TT18XUy8kg08nO1MHL08nTwSIKKworIzogc3ludGF4LmM6NzkxMQorbXNnaWQgIkU2Njk6IFVucHJpbnRhYmxlIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJFNjY5OiDuxdDF3sHUztnKINPJzdfPzCDXIMnNxc7JIMfS1dDQ2SIKKworIy4gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHNpbmNlIHRoZXJlIHByZXZpb3VzbHkgd2FzIG5vIGNoZWNrIG9ubHkKKyMuICogZ2l2ZSBhIHdhcm5pbmcuCisjOiBzeW50YXguYzo3OTE4Cittc2dpZCAiVzE4OiBJbnZhbGlkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorbXNnc3RyICJXMTg6IO7FxM/Q1dPUyc3ZyiDTyc3Xz8wg1yDJzcXOySDH0tXQ0NkiCisKKyM6IHRhZy5jOjkwCittc2dpZCAiRTU1NTogYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NTog187J2tUg09TFy8EgzcXUz8siCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogzsHXxdLI1SDT1MXLwSDNxdTPyyIKKworIzogdGFnLmM6NDEyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IO7F18/azc/Wzs8g0MXSxcrUySDXINDP2snDycAgxM8g0MXS18/KINPP19DBxMHA3cXKIM3F1MvJIgorCisjOiB0YWcuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IO3F1MvBIM7FIM7BysTFzsE6ICVzIgorCisjOiB0YWcuYzo1ODMKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMg0NLJINTJ0CAgzcXUy8EiCisKKyM6IHRhZy5jOjU4NgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAixsHKzFxuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzQ0Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICL32cLF0snUxSDO1dbO2cogzs/NxdIgKDxDUj4gxMzRIM/Uy8HawSk6IgorCisjOiB0YWcuYzo3ODQKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IOXT1Ngg1M/M2MvPIM/EzsEg08/X0MHEwcDdwdEgzcXUy8EiCisKKyM6IHRhZy5jOjc4NgorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IO7F18/azc/Wzs8g0MXSxcrUySDXINDP2snDycAg2sEg0M/TzMXEzsXKINPP19DBxMHA3cXKIM3F1MvPyiIKKworIzogdGFnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICLmwcrMIFwiJXNcIiDOxSDT1d3F09TX1cXUIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgIs3F1MvBICVkIMnaICVkJXMiCisKKyM6IHRhZy5jOjgyNgorbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgySDCz8zFxSIKKworIzogdGFnLmM6ODI4Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiDp09DPzNja1cXU09EgzcXUy8Eg0yDTyc3Xz8zBzckg1yDE0tXHz80g0sXHydPU0sUhIgorCisjOiB0YWcuYzo4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IObByswgXCIlc1wiIM7FINPV3cXT1NfVxdQiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6OTQxCittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyDrICDNxdTLxSAgICAgICDv9CAgINPU0i4gINcgxsHKzMUv1MXL09TFIgorCisjOiB0YWcuYzoxMzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIvDPydPLINcgxsHKzMUgzcXUz8sgJXMiCisKKyM6IHRhZy5jOjE1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMDogVGFnIGZpbGUgcGF0aCB0cnVuY2F0ZWQgZm9yICVzXG4iCittc2dzdHIgIkU0MzA6IPDV1NggyyDGwcrM1SDNxdTPyyAlcyDPwtLF2sHOXG4iCisKKyM6IHRhZy5jOjIyMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IO/bycLLwSDGz9LNwdTBINcgxsHKzMUgzcXUz8sgXCIlc1wiIgorCisjOiB0YWcuYzoyMjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkJlZm9yZSBieXRlICVsZCIKK21zZ3N0ciAi8MXSxcQgwsHK1M/NICVsZCIKKworIzogdGFnLmM6MjI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IObByswgzcXUz8sgzsUgz9TTz9LUydLP18HOOiAlcyIKKworIy4gbmV2ZXIgb3BlbmVkIGFueSB0YWdzIGZpbGUKKyM6IHRhZy5jOjIyODAKK21zZ2lkICJFNDMzOiBObyB0YWdzIGZpbGUiCittc2dzdHIgIkU0MzM6IObByswgzcXUz8sgzsUgz8LOwdLV1sXOIgorCisjOiB0YWcuYzozMDE2Cittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDog7sUgzsHKxMXOINvBwszPziDNxdTLySIKKworIzogdGFnLmM6MzAyNworbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTog7cXUy8EgzsUgzsHKxMXOwSwg0NnUwcXN09Eg1cfBxMHU2CEiCisKKyM6IHRlcm0uYzoxNzU5Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIM7FIMna18XT1MXOLiDkz9PU1dDO2SDX09TSz8XOztnFINTF0s3JzsHM2ToiCisKKyM6IHRlcm0uYzoxNzgzCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICLQzyDVzc/M3sHOycAgJyIKKworIzogdGVybS5jOjIxNDEKK21zZ2lkICJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkU1NTc6IO7F18/azc/Wzs8gz9TL0tnU2CDGwcrMIHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyMTQ1Cittc2dpZCAiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJFNTU4OiD3IHRlcm1pbmZvIM7F1CDawdDJ08kgz8Ig3NTPzSDUxdLNyc7BzMUiCisKKyM6IHRlcm0uYzoyMTQ3Cittc2dpZCAiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1NTk6IPcgdGVybWNhcCDOxdQg2sHQydPJIM/CINzUz80g1MXSzcnOwczFIgorCisjOiB0ZXJtLmM6MjMwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjog9yB0ZXJtY2FwIM7F1CDawdDJ08kgXCIlc1wiIgorCisjOiB0ZXJtLmM6Mjc4MAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiDU0sXC1cXU09Eg09DP08/Czs/T1Ngg1MXSzcnOwczBIFwiY21cIiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDk5MAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g687P0MvJINTF0s3JzsHMwSAtLS0iCisKKyM6IHVpLmM6MjU4Cittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAi2sHQ1dPLIM7P18/KIM/Cz8zP3svJXG4iCisKKyM6IHVpLmM6MTg0MQorbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IO/bycLLwSDe1MXOydEg19fPxMEsINfZyM/ELi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6NDA1Cittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICLv1M3FzsEgzsXXz9rNz9bOwTsg0NLPxM/M1sHU2CDX2dDPzM7FzsnFIgorCisjOiB1bmRvLmM6NTYxCittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogzsXQ0sHXyczYztnFIM7PzcXSwSDT1NLPyyIKKworIzogdW5kby5jOjc1NworbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICLlxMnO09TXxc7Oz8UgydrNxc7FzsnFIgorCisjOiB1bmRvLmM6NzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICLp2s3FzsXOyco6ICVsZCIKKworIzogdW5kby5jOjgxMgorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiDwz9fSxdbEo84g09DJ08/LIM/UzcXO2SIKKworIzogdW5kby5jOjg0NAorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiDQz9TF0tHOwSDT1NLPy8Egz9TNxc7ZIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6NzIxCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS08nRINMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gxMzRIE1TLVdpbmRvd3MgMTYvMzIgwsnUIgorCisjOiB2ZXJzaW9uLmM6NzIzCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS08nRINMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gxMzRIE1TLVdpbmRvd3MgMzIgwsnUIgorCisjOiB2ZXJzaW9uLmM6NzI2Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIg1yDSxdbJzcUgV2luMzJzIgorCisjOiB2ZXJzaW9uLmM6NzI4Cittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIiDTINDPxMTF0tbLz8ogT0xFIgorCisjOiB2ZXJzaW9uLmM6NzMxCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIuvPztPPzNjOwdEg18XS08nRIMTM0SBNUy1XaW5kb3dzIDMyIMLJ1CIKKworIzogdmVyc2lvbi5jOjczNQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS08nRIMTM0SBNUy1XaW5kb3dzIDE2IMLJ1CIKKworIzogdmVyc2lvbi5jOjczOQorbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTydEgxMzRIE1TLURPUyAzMiDCydQiCisKKyM6IHZlcnNpb24uYzo3NDEKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS08nRIMTM0SBNUy1ET1MgMTYgwsnUIgorCisjOiB2ZXJzaW9uLmM6NzQ3Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTydEgxMzRIE1hY09TIFggKHVuaXgpIgorCisjOiB2ZXJzaW9uLmM6NzQ5Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tPJ0SDEzNEgTWFjT1MgWCIKKworIzogdmVyc2lvbi5jOjc1MgorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS08nRIMTM0SBNYWNPUyIKKworIzogdmVyc2lvbi5jOjc1NworbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTydEgxMzRIFJJU0MgT1MiCisKKyM6IHZlcnNpb24uYzo3NjcKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICIiCisiXG4iCisi+sHQzMHUy8k6ICIKKworIzogdmVyc2lvbi5jOjc5MyB2ZXJzaW9uLmM6MTE2MQorbXNnaWQgIk1vZGlmaWVkIGJ5ICIKK21zZ3N0ciAi8yDJ2s3FzsXOydHNySwg187F06POztnNySAiCisKKyM6IHZlcnNpb24uYzo4MDAKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisi88vPzdDJzMnSz9fBziAiCisKKyM6IHZlcnNpb24uYzo4MDMKK21zZ2lkICJieSAiCittc2dzdHIgIiAiCisKKyM6IHZlcnNpb24uYzo4MTUKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIu/H0s/NzsHRINfF0tPJ0SAiCisKKyM6IHZlcnNpb24uYzo4MTgKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisi4s/M2NvB0SDXxdLTydEgIgorCisjOiB2ZXJzaW9uLmM6ODIxCittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIu/C2d7OwdEg18XS08nRICIKKworIzogdmVyc2lvbi5jOjgyNAorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIu3BzMHRINfF0tPJ0SAiCisKKyM6IHZlcnNpb24uYzo4MjYKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tPJ0SBcIuvSz8jBXCIgIgorCisjOiB2ZXJzaW9uLmM6ODMyCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICLCxdogx9LBxsnexdPLz8fPIMnO1MXSxsXK08EuIgorCisjOiB2ZXJzaW9uLmM6ODM3Cittc2dpZCAid2l0aCBHVEsyLUdOT01FIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gR1RLMi1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4MzkKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICLTIMfSwcbJ3sXTy8nNIMnO1MXSxsXK08/NIEdUSy1HTk9NRS4iCisKKyM6IHZlcnNpb24uYzo4NDMKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAi0yDH0sHGyd7F08vJzSDJztTF0sbFytPPzSBHVEsyLiIKKworIzogdmVyc2lvbi5jOjg0NQorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gR1RLLiIKKworIzogdmVyc2lvbi5jOjg1MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gWDExLU1vdGlmLiIKKworIzogdmVyc2lvbi5jOjg1NAorbXNnaWQgIndpdGggWDExLW5lWHRhdyBHVUkuIgorbXNnc3RyICLTIMfSwcbJ3sXTy8nNIMnO1MXSxsXK08/NIFgxMS1uZVh0YXcuIgorCisjOiB2ZXJzaW9uLmM6ODU2Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gWDExLUF0aGVuYS4iCisKKyM6IHZlcnNpb24uYzo4NjAKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAi0yDH0sHGyd7F08vJzSDJztTF0sbFytPPzSBCZU9TLiIKKworIzogdmVyc2lvbi5jOjg2MworbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjg2NgorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAi0yDH0sHGyd7F08vJzSDJztTF0sbFytPPzS4iCisKKyM6IHZlcnNpb24uYzo4NjkKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICLTIMfSwcbJ3sXTy8nNIMnO1MXSxsXK08/NIENhcmJvbi4iCisKKyM6IHZlcnNpb24uYzo4NzIKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgItMgx9LBxsnexdPLyc0gyc7UxdLGxcrTz80gQ29jb2EuIgorCisjOiB2ZXJzaW9uLmM6ODc1Cittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAi0yDLzMHT08nexdPLyc0gx9LBxsnexdPLyc0gyc7UxdLGxcrTz80uIgorCisjOiB2ZXJzaW9uLmM6ODg2Cittc2dpZCAiICBGZWF0dXJlcyBpbmNsdWRlZCAoKykgb3Igbm90ICgtKTpcbiIKK21zZ3N0ciAiICD3y8zA3qPOztnFICgrKSDJIM/Uy8zA3qPOztnFICgtKSDP08/Cxc7Oz9PUyTpcbiIKKworIzogdmVyc2lvbi5jOjg5OAorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAgz8LdxdPJ09TFzc7ZyiDGwcrMIHZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkwMworbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAg0M/M2NrP18HUxczY08vJyiDGwcrMIHZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkwOAorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICDX1M/Sz8og0M/M2NrP18HUxczY08vJyiDGwcrMIHZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkxMworbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICDU0sXUycog0M/M2NrP18HUxczY08vJyiDGwcrMIHZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkxOAorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgINDPzNjaz9fB1MXM2NPLycogxsHKzCBleHJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkyMworbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAg19TP0s/KINDPzNjaz9fB1MXM2NPLycogxsHKzCBleHJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkyOQorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICDPwt3F08nT1MXNztnKIMbByswgZ3ZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkzMworbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICDQz8zY2s/XwdTFzNjTy8nKIMbByswgZ3ZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjkzNworbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiINfUz9LPyiDQz8zY2s/XwdTFzNjTy8nKIMbByswgZ3ZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MgorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiINTSxdTJyiDQz8zY2s/XwdTFzNjTy8nKIMbByswgZ3ZpbXJjOiBcIiIKKworIzogdmVyc2lvbi5jOjk0OQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAgIM/C3cXTydPUxc3O2cogxsHKzCDNxc7AOiBcIiIKKworIzogdmVyc2lvbi5jOjk1NworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgICAgINrOwd7FzsnFICRWSU0g0M8g1c3PzN7BzsnAOiBcIiIKKworIzogdmVyc2lvbi5jOjk2MworbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICAg2s7B3sXOycUgJFZJTVJVTlRJTUUg0M8g1c3PzN7BzsnAOiBcIiIKKworIzogdmVyc2lvbi5jOjk2NworbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIvDB0sHNxdTS2SDLz83QyczRw8nJOiAiCisKKyM6IHZlcnNpb24uYzo5NzMKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICLrz83QyczR1M/SOiAiCisKKyM6IHZlcnNpb24uYzo5NzgKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIvPCz9LLwTogIgorCisjOiB2ZXJzaW9uLmM6OTgzCittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICDv9Ozh5O/+7uHxIPPi7/Lr4SIKKworIzogdmVyc2lvbi5jOjEwMjIKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIDo6OiBWaSBJTXByb3ZlZCAo9czV3tvFzs7ZyiBWaSkgOjo6IPLV09PLwdEg18XS08nRIgorCisjOiB2ZXJzaW9uLmM6MTAyNAorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICLXxdLTydEgIgorCisjOiB2ZXJzaW9uLmM6MTAyNQorbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAi4tLBzSDtz8/Mxc7BwdIgySDE0tXHycUiCisKKyM6IHZlcnNpb24uYzoxMDI5Cittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltINzUzyDT18/Cz8TOzyDSwdPQ0s/T1NLBztHFzcHRINDSz8fSwc3NwSDTIM/Uy9LZ1NnNIMvPxM/NIgorCisjOiB2ZXJzaW9uLmM6MTAzMQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICLixcTO2c0gxMXU0c0g1yD1x8HOxMUgztXWzsEg18HbwSDQz83P3dghIgorCisjOiB2ZXJzaW9uLmM6MTAzMgorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIs7BwsXSydTFIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIMTM0SDEz9DPzM7J1MXM2M7PyiDJzsbP0s3Bw8nJIgorCisjOiB2ZXJzaW9uLmM6MTAzNAorbXNnaWQgInR5cGUgIDpxPEVudGVyPiAgICAgICAgICAgICAgIHRvIGV4aXQgICAgICAgICAiCittc2dzdHIgIs7BwsXSydTFIDpxPEVudGVyPiAgICAgICAgICAgICAgIN7Uz8LZINfZytTJIMnaINDSz8fSwc3N2SAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTAzNQorbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgIs7BwsXSydTFIDpoZWxwPEVudGVyPiDJzMkgPEYxPiAgIMTM0SDQz8zV3sXOydEg09DSwdfLySAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTAzNgorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgIs7BwsXSydTFIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIN7Uz8LZINXazsHU2CDPwiDc1M/KINfF0tPJySAgIgorCisjOiB2ZXJzaW9uLmM6MTAzOQorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICLywcLP1MEg1yBWaS3Tz9fNxdPUyc3PzSDSxdbJzcUiCisKKyM6IHZlcnNpb24uYzoxMDQwCittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAizsHCxdLJ1MUgOnNldCBub2NwPEVudGVyPiAgICAgICAgxMzRINDF0sXIz8TBINcg0sXWyc0gVmltICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDQxCittc2dpZCAidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAizsHCxdLJ1MUgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gxMzRIMTP0M/MzsnUxczYzs/KIMnOxs/SzcHDyckiCisKKyM6IHZlcnNpb24uYzoxMDU2Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAizcXOwCDz0NLB18vBLT7zydLP1NkgICAgICAgICAgICAgxMzRINDPzNXexc7J0SDJzsbP0s3Bw8nJICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDU4Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAi4sXa0sXWyc3OwdEg0sHCz9TZLCDX09TB18vBINfXxcSjzs7Px88g1MXL09TBIgorCisjOiB2ZXJzaW9uLmM6MTA1OQorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIs3FzsAg8NLB18vBLT7vwt3JxSDuwdPU0s/Ky8ktPvLF1snNIPfT1MHXy8kgICAgICAgICAgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDYwCittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgxMzRIMTX1cgg0sXWyc3P1yAgICAgICAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjEwNjQKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIgorbXNnc3RyICLNxc7AIPDSwdfLwS0+78LdycUg7sHT1NLPysvJLT7zz9fNxdPUyc3P09TYINMgVmkgICAgICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTA2NQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMTM0SDQxdLFyM/EwSDXINLF1snNIFZpbSAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTEyCittc2dpZCAiU3BvbnNvciBWaW0gZGV2ZWxvcG1lbnQhIgorbXNnc3RyICLwz83Px8nUxSDXINLB2tLBws/Uy8UgVmltISIKKworIzogdmVyc2lvbi5jOjExMTMKK21zZ2lkICJCZWNvbWUgYSByZWdpc3RlcmVkIFZpbSB1c2VyISIKK21zZ3N0ciAi89TBztjUxSDawdLFx8nT1NLJ0s/Xwc7O2c0g0M/M2NrP18HUxczFzSBWaW0hIgorCisjOiB2ZXJzaW9uLmM6MTExNgorbXNnaWQgInR5cGUgIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIs7BwsXSydTFIDpoZWxwIHNwb25zb3I8RW50ZXI+ICAgIMTM0SDQz8zV3sXOydEgyc7Gz9LNwcPJySAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTExNworbXNnaWQgInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIs7BwsXSydTFIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIMTM0SDQz8zV3sXOydEgyc7Gz9LNwcPJySAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTExOQorbXNnaWQgIm1lbnUgIEhlbHAtPlNwb25zb3IvUmVnaXN0ZXIgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIs3FzsAg89DSwdfLwS0+8M/Nz93YL/LFx8nT1NLBw8nRIMTM0SDQz8zV3sXOydEgyc7Gz9LNwcPJySAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTI5Cittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAi8PLl5PXw8uX25OXu6eU6IM/CzsHS1dbFzsEgV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjExMzIKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICLOwcLF0snUxSA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICDEzNEg0M/M1d7FzsnRIMnOxs/SzcHDyckgICAgICIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IO/Lzs8g0NLFxNDSz9PNz9TSwSDP1NPV1NPU19XF1CIKKworIzogd2luZG93LmM6NTgxCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0Mjog78vOzyDOxSDNz9bF1CDC2dTYIM/Ezs/X0sXNxc7OzyDTzMXXwSDX18XSyNUgySDT0NLB18Eg187J2tUiCisKKyM6IHdpbmRvdy5jOjEzNDAKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IO7F18/azc/Wzs8g0M/Nxc7R1NggzcXT1MHNySwg0M/LwSDE0tXHz8Ugz8vOzyDSwdrExczFzs8iCisKKyM6IHdpbmRvdy5jOjE4MzYKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IO7FzNja0SDawcvS2dTYINDP08zFxM7FxSDPy87PIgorCisjOiB3aW5kb3cuYzoyNTY3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIu7BINzL0sHOxSDX08XHzyDPxM7PIM/Lzs8iCisKKyM6IHdpbmRvdy5jOjI2MTQKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTog9yDE0tXHz80gz8vOxSDF09TYIM7F08/I0sHOo87O2cUgydrNxc7FzsnRIgorCisjOiB3aW5kb3cuYzo0NDgwCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0Njog7sXUIMnNxc7JIMbByszBINcg0M/aycPJySDL1dLTz9LBIgorCisjOiB3aW5kb3cuYzo0NTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0Nzog5sHKzCBcIiVzXCIgzsUgzsHKxMXOINDPIMna18XT1M7ZzSDQ1dTRzSIKKworIzogaWZfcGVybC54czozMjYgZ2xvYmFscy5oOjEyMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MDogQ291bGQgbm90IGxvYWQgbGlicmFyeSAlcyIKK21zZ3N0ciAiRTM3MDog7sXXz9rNz9bOzyDawcfS1drJ1NggwsnCzMnP1MXL1SAlcyIKKworIzogaWZfcGVybC54czo1NTQKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgUGVybCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisi6drXyc7J1MUsIMTBzs7B0SDLz83BzsTBIM/Uy8zA3sXOwTogzsXXz9rNz9bOzyDawcfS1drJ1NggwsnCzMnP1MXL1SBQZXJsIgorCisjOiBpZl9wZXJsLnhzOjYwNworbXNnaWQgIkUyOTk6IFBlcmwgZXZhbHVhdGlvbiBmb3JiaWRkZW4gaW4gc2FuZGJveCB3aXRob3V0IHRoZSBTYWZlIG1vZHVsZSIKK21zZ3N0ciAiIgorIkUyOTk6IO7FIMTP0NXTy8HF1NPRINfZ3snTzMXOycUgUGVybCDXINDF08/ezsnDxSDCxdogzc/E1czRIMLF2s/QwdPOz9PUySIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODMKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIvLFxMHL1MnSz9fB1Ngg1yAm0sHaztnIIFZpbS3ByCIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODkKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIvLFxMHL1MnSz9fB1Ngg1yAmz8TOz80gVmltIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU5OAorbXNnaWQgIiZEaWZmIHdpdGggVmltIgorbXNnc3RyICIm89LB187J1Ngg0yDQz83P3djAIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTEKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAi8sUmxMHL1MnSz9fB1Ngg0yDQz83P3djAIFZpbSIKKworIy4gTm93IGNvbmNhdGVuYXRlCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjYzMworbXNnaWQgIkVkaXQgd2l0aCBleGlzdGluZyBWaW0gLSAmIgorbXNnc3RyICLyxcTBy9TJ0s/XwdTYINcg2sHQ1d3Fzs7PzSBWaW0gLSAmIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjc0NgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICLyxcTBy9TJ0s/XwdTYINfZxMXMxc7O2cUgxsHKzNkg0yDQz83P3djAIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIu/bycLLwSDTz9rEwc7J0SDQ0s/DxdPTwTog0NLP18XS2NTFIMTP09TV0M7P09TYIGd2aW0g1yDQ1dTJISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiz9vJwsvBIGd2aW1leHQuZGxsIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg5OQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAi88zJ28vPzSDEzMnOztnKINDV1NghIgorCisjOiBnbG9iYWxzLmg6MTAyMgorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tIO7F1CDT1NLPyyDXIMLVxsXSxSAtLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTg1Cittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiD32dDPzM7FzsnFIMvPzcHOxNkg0NLF0tfBzs8iCisKKyM6IGdsb2JhbHMuaDoxMTg2Cittc2dpZCAiRTQ3MTogQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkU0NzE6IPTSxcLVxdTT0SDVy8HawdTYINDB0sHNxdTSIgorCisjOiBnbG9iYWxzLmg6MTE4NworbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiDwz9PMxSBcXCDEz8zWxc4gycTUySDTyc3Xz8wgLywgPyDJzMkgJiIKKworIzogZ2xvYmFscy5oOjExODkKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICIiCisiRTExOiDuxcTP0NXT1MnNzyDXIM/LzsUgy8/Nwc7Ezs/KINPU0s/LyTsgPENSPiDX2dDPzM7FzsnFLCBDVFJMLUMg19nIz8QiCisKKyM6IGdsb2JhbHMuaDoxMTkxCittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiDrz83BzsTBIM7FIMTP0NXTy8HF1NPRINcgZXhyYy92aW1yYyDXINTFy9Xdxc0gy8HUwczPx8UgyczJINDPydPLxSDNxdTPyyIKKworIzogZ2xvYmFscy5oOjExOTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTog79TT1dTT1NfVxdQgy8/Nwc7EwSA6ZW5kaWYiCisKKyM6IGdsb2JhbHMuaDoxMTk0Cittc2dpZCAiRTYwMDogTWlzc2luZyA6ZW5kdHJ5IgorbXNnc3RyICJFNjAwOiDv1NPV1NPU19XF1CDLz83BzsTBIDplbmR0cnkiCisKKyM6IGdsb2JhbHMuaDoxMTk1Cittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IO/U09XU09TX1cXUIMvPzcHOxMEgOmVuZHdoaWxlIgorCisjOiBnbG9iYWxzLmg6MTE5NgorbXNnaWQgIkU1ODg6IDplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4ODog68/Nwc7EwSA6ZW5kd2hpbGUgwsXaINDB0s7PyiDLz83BzsTZIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjExOTgKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzog5sHKzCDT1d3F09TX1cXUICjEzNEg0MXSxdrB0MnTySDEz8LB19jUxSAhKSIKKworIzogZ2xvYmFscy5oOjExOTkKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3Mjog7sUg1cTBzM/T2CDX2dDPzM7J1Nggy8/Nwc7E1SIKKworIzogZ2xvYmFscy5oOjEyMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDog7sXJ2tfF09TO2cog29LJxtTP18/KIM7Bws/SOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTog7sXJ2tfF09TO2cog29LJxtQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IPvSycbUIFwiJXNcIiDOxSDR18zRxdTT0SDNz87P28nSyc7O2c0g29LJxtTPzSIKKworIzogZ2xvYmFscy5oOjEyMTAKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3Mzog987V1NLFzs7R0SDP28nCy8EiCisKKyM6IGdsb2JhbHMuaDoxMjExCittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIvDSxdLXwc7PIgorCisjOiBnbG9iYWxzLmg6MTIxMgorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IO7FxM/Q1dPUyc3ZyiDBxNLF0yIKKworIzogZ2xvYmFscy5oOjEyMTMKK21zZ2lkICJFNDc0OiBJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICJFNDc0OiDuxcTP0NXT1MnN2cogwdLH1c3FztQiCisKKyM6IGdsb2JhbHMuaDoxMjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiDuxcTP0NXT1MnN2cogwdLH1c3FztQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTog7sXEz9DV09TJzc/FINfZ0sHWxc7JxTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjE4Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IO7FxM/Q1dPUyc3ZyiDEycHQwdrPziIKKworIzogZ2xvYmFscy5oOjEyMTkKK21zZ2lkICJFNDc2OiBJbnZhbGlkIGNvbW1hbmQiCittc2dzdHIgIkU0NzY6IO7FxM/Q1dPUyc3B0SDLz83BzsTBIgorCisjOiBnbG9iYWxzLmg6MTIyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIg0dfM0cXU09Egy8HUwczPx8/NIgorCisjOiBnbG9iYWxzLmg6MTIyNAorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODog8MXSxcQgJz0nIM/CzsHS1dbFztkgzsXP1snEwc7O2cUg08nN18/M2SIKKworIzogZ2xvYmFscy5oOjEyMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IO7F1cTB3s7ZyiDX2drP1yDG1c7Lw8nJIFwiJXMoKVwiIMnaIMLJwszJz9TFy8kiCisKKyM6IGdsb2JhbHMuaDoxMjMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiCittc2dzdHIgIkU0NDg6IO7FINXEwczP09gg2sHH0tXaydTYIMbVzsvDycAgJXMgydogwsnCzMnP1MXLySIKKworIzogZ2xvYmFscy5oOjEyMzUKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTog79TNxdTLwSDVy8Ha2dfBxdQgzsEgzsXQ0sHXyczYztnKIM7PzcXSINPU0s/LySIKKworIzogZ2xvYmFscy5oOjEyMzYKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAi79TNxdTLwSDOxSDP0NLFxMXMxc7BIgorCisjOiBnbG9iYWxzLmg6MTIzNworbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiDp2s3FzsXOydEgzsXXz9rNz9bO2Swg1MHLIMvByyDP1MvMwN7FzsEgz9DDydEgJ21vZGlmaWFibGUnIgorCisjOiBnbG9iYWxzLmg6MTIzOAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjog88zJ28vPzSDHzNXCz8vPINfMz9bFzs7ZxSDTw8XOwdLJySIKKworIzogZ2xvYmFscy5oOjEyMzkKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IPPP08XEzsnKIMbByswgzsUg09XdxdPU19XF1CIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IO7F1CDUwcvPx88g08/L0sHdxc7J0SIKKworIzogZ2xvYmFscy5oOjEyNDEKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6ICEgzsUgxM/Q1dPLwcXU09EiCisKKyM6IGdsb2JhbHMuaDoxMjQzCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiIgorIkUyNTog98/azc/Wzs/T1NggydPQz8zY2s/Xwc7J0SDH0sHGyd7F08vPx88gyc7UxdLGxcrTwSDX2cvMwN7FzsEg0NLJICIKKyLLz83QyczRw8nJIgorCisjOiBnbG9iYWxzLmg6MTI0NgorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiDp19LJ1CDX2cvMwN7FziDQ0skgy8/N0MnM0cPJyVxuIgorCisjOiBnbG9iYWxzLmg6MTI0OQorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IObB0tPJINfZy8zA3sXOzyDQ0skgy8/N0MnM0cPJyVxuIgorCisjOiBnbG9iYWxzLmg6MTI1MgorbXNnaWQgIkU4MDA6IEFyYWJpYyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkU4MDA6IOHSwcLTy8nKINfZy8zA3sXOINDSySDLz83QyczRw8nJXG4iCisKKyM6IGdsb2JhbHMuaDoxMjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkUyODog59LV0NDBINDPxNPXxdTLySDTyc7UwcvTydPBICVzIM7FINPV3cXT1NfVxdQiCisKKyM6IGdsb2JhbHMuaDoxMjU3Cittc2dpZCAiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIKK21zZ3N0ciAiRTI5OiDwz8vBIM7F1CDX09TB18zFzs7Px88g1MXL09TBIgorCisjOiBnbG9iYWxzLmg6MTI1OAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IPDSxcTZxNXdxcogy8/Nwc7Ezs/KINPU0s/LySDOxdQiCisKKyM6IGdsb2JhbHMuaDoxMjU5Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTog9MHLz8og0NLJ19Hay8kgzsUg09XdxdPU19XF1CIKKworIzogZ2xvYmFscy5oOjEyNjAKK21zZ2lkICJFNDc5OiBObyBtYXRjaCIKK21zZ3N0ciAiRTQ3OTog7sXUINPPz9TXxdTT1NfJ0SIKKworIzogZ2xvYmFscy5oOjEyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiDuxdQg08/P1NfF1NPU18nROiAlcyIKKworIzogZ2xvYmFscy5oOjEyNjIKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiDuxdQgyc3FzskgxsHKzMEiCisKKyM6IGdsb2JhbHMuaDoxMjYzCittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiDuxdQg0NLFxNnE1d3Fx88g0sXH1czR0s7Px88g19nSwdbFzsnRIMTM0SDawc3FztkiCisKKyM6IGdsb2JhbHMuaDoxMjY0Cittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IO7F1CDQ0sXE2cTV3cXKIMvPzcHOxNkiCisKKyM6IGdsb2JhbHMuaDoxMjY1Cittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTog7sXUINDSxcTZxNXdxcfPINLFx9XM0dLOz8fPINfZ0sHWxc7J0SIKKworIzogZ2xvYmFscy5oOjEyNjYKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiDp09DPzNjaz9fBzsnFIMTJwdDB2s/OwSDOxSDEz9DV08vBxdTT0SIKKworIzogZ2xvYmFscy5oOjEyNjgKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiDuxcTP09TB1M/ezs8gzcXT1MEiCisKKyM6IGdsb2JhbHMuaDoxMjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0Nzog08XS18XSIFwiJXNcIiDOxSDawdLFx8nT1NLJ0s/Xwc4iCisKKyM6IGdsb2JhbHMuaDoxMjczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiDuxdfP2s3P1s7PINPP2sTB1NggxsHKzCAlcyIKKworIzogZ2xvYmFscy5oOjEyNzQKK21zZ2lkICJFNDgzOiBDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIkU0ODM6IO7F18/azc/Wzs8g0M/M1d7J1Nggyc3RINfSxc3Fzs7Px88gxsHKzMEiCisKKyM6IGdsb2JhbHMuaDoxMjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODQ6IENhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NDog7sXXz9rNz9bOzyDP1MvS2dTYIMbByswgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTog7sXXz9rNz9bOzyDQ0s/eydTB1NggxsHKzCAlcyIKKworIzogZ2xvYmFscy5oOjEyNzcKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzog6drNxc7FzsnRIM7FINPPyNLBzsXO2SAoxM/CwdfY1MUgISwg3tTPwtkgz8LPytTJINDSz9fF0svVKSIKKworIzogZ2xvYmFscy5oOjEyNzgKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODog7tXMxdfPyiDB0sfVzcXO1CIKKworIzogZ2xvYmFscy5oOjEyODAKK21zZ2lkICJFMzk6IE51bWJlciBleHBlY3RlZCIKK21zZ3N0ciAiRTM5OiD00sXC1cXU09Eg3snTzM8iCisKKyM6IGdsb2JhbHMuaDoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDog7sUg1cTBzM/T2CDP1MvS2dTYIMbByswgz9vJws/LICVzIgorCisjOiBnbG9iYWxzLmg6MTI4NgorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IM7F18/azc/Wzs8gz9TL0tnU2CDEydPQzMXKIgorCisjOiBnbG9iYWxzLmg6MTI4OAorbXNnaWQgIkU0MTogT3V0IG9mIG1lbW9yeSEiCittc2dzdHIgIkU0MTog7sUgyNfB1MHF1CDQwc3R1MkhIgorCisjOiBnbG9iYWxzLmg6MTI5MAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICL7wcLMz84gzsUgzsHKxMXOIgorCisjOiBnbG9iYWxzLmg6MTI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDg2OiBQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0ODY6IPvBwszPziDOxSDOwcrExc46ICVzIgorCisjOiBnbG9iYWxzLmg6MTI5MworbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IPDB0sHNxdTSIMTPzNbFziDC2dTYINDPzM/WydTFzNjO2c0g3snTzM/NIgorCisjOiBnbG9iYWxzLmg6MTI5NQorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTog98/a19LB1CDXINDSxcTZxNXdycogy8HUwczPxyDOxdfP2s3P1sXOIgorCisjOiBnbG9iYWxzLmg6MTI5OQorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IO/bycLPyyDOxdQiCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiDwz9fSxdbExc7BINPU0s/LwSDTz8/U18XU09TXydEiCisKKyM6IGdsb2JhbHMuaDoxMzAyCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDog8NLPx9LBzc3BIM/C0sHCz9TLySDSxcfVzNHSztnIINfZ0sHWxc7JyiDQz9fSxdbExc7BIgorCisjOiBnbG9iYWxzLmg6MTMwMworbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNDU6IPfLzMDexc7BIM/Qw8nRICdyZWFkb25seScgKMTPwsHX2NTFICEsIN7Uz8LZIM7FIM/C0sHdwdTYINfOyc3BzsnRKSIKKworIzogZ2xvYmFscy5oOjEzMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0Njog7sXXz9rNz9bOzyDJ2s3FzsnU2CDEz9PU1dDO1cAg1M/M2MvPIMTM0SDe1MXOydEg0MXSxc3Fzs7VwCBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMzA4Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiDv28nCy8Eg0NLJIN7Uxc7JySDGwcrMwSDP28nCz8siCisKKyM6IGdsb2JhbHMuaDoxMzExCittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IO7FIMTP0NXTy8HF1NPRINcg0MXTz97OycPFIgorCisjOiBnbG9iYWxzLmg6MTMxMworbXNnaWQgIkU1MjM6IE5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU1MjM6IPrExdPYIM7FINLB2tLF28XOzyIKKworIzogZ2xvYmFscy5oOjEzMTYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IOTBzs7ZyiDSxdbJzSDcy9LBzsEgzsUg0M/ExMXS1snXwcXU09EiCisKKyM6IGdsb2JhbHMuaDoxMzE4Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IO7FxM/Q1dPUyc3ZyiDSwdrNxdIg0NLPy9LV1MvJIgorCisjOiBnbG9iYWxzLmg6MTMxOQorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTog+s7B3sXOycXNIM/Qw8nJICdzaGVsbCcg0dfM0cXU09Eg0NXT1MHRINPU0s/LwSIKKworIzogZ2xvYmFscy5oOjEzMjEKK21zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCittc2dzdHIgIkUyNTU6IO7F18/azc/Wzs8g0NLP3snUwdTYIMTBzs7ZxSDPINrOwd7LwcghIgorCisjOiBnbG9iYWxzLmg6MTMyMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IO/bycLLwSDawcvS2dTJ0SDT18/QLcbByszBIgorCisjOiBnbG9iYWxzLmg6MTMyNAorbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IPPUxcsgzcXUz8sg0NXT1M/KIgorCisjOiBnbG9iYWxzLmg6MTMyNQorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiDzzMnby8/NINPMz9bOwdEgy8/Nwc7EwSIKKworIzogZ2xvYmFscy5oOjEzMjYKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTog88zJ28vPzSDEzMnOzs/FIMnN0SIKKworIzogZ2xvYmFscy5oOjEzMjcKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3Njog88zJ28vPzSDNzs/HzyDTyc3Xz8zP1yBbIgorCisjOiBnbG9iYWxzLmg6MTMyOAorbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiDzzMnby8/NIM3Oz8fPIMnNo84gxsHKzM/XIgorCisjOiBnbG9iYWxzLmg6MTMyOQorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IOzJ287JxSDTyc3Xz8zZIM7BIMjXz9PUxSIKKworIzogZ2xvYmFscy5oOjEzMzAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiDuxcna18XT1M7B0SDP1M3F1MvBIgorCisjOiBnbG9iYWxzLmg6MTMzMQorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTog7sXXz9rNz9bOzyDX2dDPzM7J1Ngg0M/E09TBzs/Xy9Ug0M8gzcHTy8UiCisKKyM6IGdsb2JhbHMuaDoxMzMzCittc2dpZCAiRTU5MTogJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiIgorIkU1OTE6IPrOwd7FzsnFIM/Qw8nJICd3aW5oZWlnaHQnIM7FIM3P1sXUIMLZ1NggzcXO2NvFINrOwd7FzsnRICd3aW5taW5oZWlnaHQnIgorCisjOiBnbG9iYWxzLmg6MTMzNQorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICIiCisiRTU5Mjog+s7B3sXOycUgz9DDyckgJ3dpbndpZHRoJyDOxSDNz9bF1CDC2dTYIM3FztjbxSDazsHexc7J0SAnd2lubWlud2lkdGgnIgorCisjOiBnbG9iYWxzLmg6MTMzOAorbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiDv28nCy8Eg0NLJINrB0MnTySIKKworIzogZ2xvYmFscy5oOjEzMzkKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICLu1czF18/FINrOwd7FzsnFINPeo9TeycvBIgorCisjOiBnbG9iYWxzLmg6MTM0MQorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTog6dPQz8zY2s/Xwc7JxSA8U0lEPiDXzsUgy8/O1MXL09TBINPDxc7B0snRIgorCisjOiBnbG9iYWxzLmg6MTM0NAorbXNnaWQgIkU0NDk6IEludmFsaWQgZXhwcmVzc2lvbiByZWNlaXZlZCIKK21zZ3N0ciAiRTQ0OTog8M/M1d7Fzs8gzsXEz9DV09TJzc/FINfZ0sHWxc7JxSIKKworIzogZ2xvYmFscy5oOjEzNDcKK21zZ2lkICJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIKK21zZ3N0ciAiRTQ2Mzog7sXXz9rNz9bOzyDJ2s3FzsnU2CDPyNLBztHFzdXAIM/CzMHT1NgiCisKKyN+IG1zZ2lkICJcIlxuIgorI34gbXNnc3RyICJcIlxuIgpkaWZmIC0tZ2l0IGEvc3JjL3BvL3NqaXNjb3JyLmMgYi9zcmMvcG8vc2ppc2NvcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzcwNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL3NqaXNjb3JyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFNpbXBsaXN0aWMgcHJvZ3JhbSB0byBjb3JyZWN0IFNKSVMgaW5zaWRlIHN0cmluZ3MuICBXaGVuIGEgdHJhaWwgYnl0ZSBpcyBhCisgKiBiYWNrc2xhc2ggaXQgbmVlZHMgdG8gYmUgZG91YmxlZC4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisJaW50CittYWluKGFyZ2MsIGFyZ3YpCisJaW50CWFyZ2M7CisJY2hhcgkqKmFyZ3Y7Cit7CisJY2hhciBidWZmZXJbQlVGU0laXTsKKwljaGFyICpwOworCisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgQlVGU0laLCBzdGRpbikgIT0gTlVMTCkKKwl7CisJCWZvciAocCA9IGJ1ZmZlcjsgKnAgIT0gMDsgcCsrKQorCQl7CisJCQlpZiAoc3RybmNtcChwLCAiY2hhcnNldD1ldWMtanAiLCAxNCkgPT0gMCkKKwkJCXsKKwkJCQlmcHV0cygiY2hhcnNldD1jcDkzMiIsIHN0ZG91dCk7CisJCQkJcCArPSAxMzsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cm5jbXAocCwgImphLnBvIC0gSmFwYW5lc2UgbWVzc2FnZSBmaWxlIiwgMjkpID09IDApCisJCQl7CisJCQkJZnB1dHMoImphLnNqaXMucG8gLSBKYXBhbmVzZSBtZXNzYWdlIGZpbGUgZm9yIFZpbSAodmVyc2lvbiA2LngpXG4iLCBzdGRvdXQpOworCQkJCWZwdXRzKCIjIGdlbmVyYXRlZCBmcm9tIGphLnBvLCBETyBOT1QgRURJVCIsIHN0ZG91dCk7CisJCQkJd2hpbGUgKHBbMV0gIT0gJ1xuJykKKwkJCQkJKytwOworCQkJfQorCQkJZWxzZSBpZiAoKih1bnNpZ25lZCBjaGFyICopcCA9PSAweDgxICYmIHBbMV0gPT0gJ18nKQorCQkJeworCQkJCXB1dGNoYXIoJ1xcJyk7CisJCQkJKytwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgqcCAmIDB4ODApCisJCQkJeworCQkJCQlwdXRjaGFyKCpwKyspOworCQkJCQlpZiAoKnAgPT0gJ1xcJykKKwkJCQkJCXB1dGNoYXIoKnApOworCQkJCX0KKwkJCQlwdXRjaGFyKCpwKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9wby9zay5jcDEyNTAucG8gYi9zcmMvcG8vc2suY3AxMjUwLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTFhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vc2suY3AxMjUwLnBvCkBAIC0wLDAgKzEsNTk5OCBAQAorIyBTbG92YWsgdHJhbnNsYXRpb24gb2YgdmltCisjIE1hcnRpbiBMYWNrbyA8bGFja29AaG9zdC5zaz4sIDIwMDEuCisjCisjIEdlbmVyYXRlZCBmcm9tIHNrLnBvLCBETyBOT1QgRURJVC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IHZpbVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAyLTAzLTI2IDIxOjU0KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAyLTAzLTI2IDIxOjU4Q0VTVFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWFydGluIExhY2tvIDxsYWNrb0Bob3N0LnNrPlxuIgorIkxhbmd1YWdlLVRlYW06IFNsb3ZhayA8c2staTE4bkBsaXN0cy5saW51eC5zaz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1jcDEyNTBcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IEtCYWJlbCAwLjkuNVxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogTmVk4SBzYSBhbG9rb3ZhnSBidWZmZXIsIGtvbujtbS4uLiIKKworIzogYnVmZmVyLmM6MTAwCittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogTmVk4SBzYSBhbG9rb3ZhnSBidWZmZXIsIHBvdZ5pamVtIGlu/S4uLiIKKworIzogYnVmZmVyLmM6NzA2Cittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICKOaWFkbnkgYnVmZmVyIG5lYm9sIG7hamRlbv0iCisKKyM6IGJ1ZmZlci5jOjcwOAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICKOaWFkbnkgYnVmZmVyIG5lYm9sIHZ5bWF6YW79IgorCisjOiBidWZmZXIuYzo3MTAKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICKOaWFkbnkgYnVmZmVyIG5lYm9sIHZ5bWF6YW79IgorCisjOiBidWZmZXIuYzo3MTgKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAicG/oZXQgZGVha3Rpdm92YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICJwb+hldCBkZWFrdGl2b3Zhbv1jaCBidWZmZXJvdjogJWQiCisKKyM6IGJ1ZmZlci5jOjcyNQorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjcyNworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6ICVkIgorCisjOiBidWZmZXIuYzo3MzIKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjczNAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAicG/oZXQgdnltYXphbv1jaCBidWZmZXJvdjogJWQiCisKKyM6IGJ1ZmZlci5jOjc5MQorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IE5lYm9sIG7hamRlbv0gnmlhZG55IHptZW5lbv0gYnVmZmVyIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6ODMwCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IE5lbmGaaWVsIHNvbSCeaWFkbnkgYnVmZmVyIgorCisjOiBidWZmZXIuYzo4NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiBOZWThIHNhIHByZXNrb+hpnSBuYSBidWZmZXIgJWxkIgorCisjOiBidWZmZXIuYzo4NDUKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogWmEgcG9zbGVkbv0gYnVmZmVyIHNhIG5lZOEgcHJlc2tv6GmdIgorCisjOiBidWZmZXIuYzo4NDcKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IFByZWQgcHJ2/SBidWZmZXIgc2EgbmVk4SBwcmVza2/oaZ0iCisKKyM6IGJ1ZmZlci5jOjg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU4OTogWm1lbnkgdiBidWZmZXJpICVsZCBuZWJvbHkgdWxvnmVu6SAoISBwcmUgdnlu+nRlbmllKSIKKworIzogYnVmZmVyLmM6ODg3Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IFBvc2xlZG79IGJ1ZmZlciBzYSBuZWThIG9kc3Ry4W5pnSIKKworIzogYnVmZmVyLmM6MTMzNworbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IFZhcm92YW5pZTogcHJldGXoZW5pZSB6b3puYW11IHMgbuF6dmFtaSBz+mJvcm92IgorCisjOiBidWZmZXIuYzoxNTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5MjogYnVmZmVyICVsZCBuZW7hamRlbv0iCisKKyM6IGJ1ZmZlci5jOjE3MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBWem9ydSAlcyB2eWhvdnVqZSB2aWFjIGJ1ZmZlcm92IgorCisjOiBidWZmZXIuYzoxNzMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NDogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvciAlcyIKK21zZ3N0ciAiRTk0OiBWem9ydSAlcyBuZXZ5aG92dWplIJ5pYWRueSBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjIxMzYgZXhfZG9jbWQuYzo2MDg5CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICJyaWFkb2sgJWxkIgorCisjOiBidWZmZXIuYzoyMjE5Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogQnVmZmVyIHRha+lob3RvIG1lbmEgdZ4gZXhpc3R1amUiCisKKyM6IGJ1ZmZlci5jOjI1MTIKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFt6bWVuZW79XSIKKworIzogYnVmZmVyLmM6MjUxNworbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW25ldXByYXZvdmFu/V0iCisKKyM6IGJ1ZmZlci5jOjI1MjIKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbbm92/SBz+mJvcl0iCisKKyM6IGJ1ZmZlci5jOjI1MjMKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbY2h5YnkgcHJpIOjtdGFu7V0iCisKKyM6IGJ1ZmZlci5jOjI1MjUgZmlsZWlvLmM6MTc3NworbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIltpYmEgcHJlIOjtdGFuaWVdIgorCisjOiBidWZmZXIuYzoyNTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAiMSByaWFkb2sgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICJyaWFka292OiAlbGQgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgInJpYWRvayAlbGQgeiAlbGQgLS0lZCUlLS0gc3TlcGVjIgorCisjOiBidWZmZXIuYzoyNjM3Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbnmlhZG55IHP6Ym9yXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyNjc3Cittc2dpZCAiaGVscCIKK21zZ3N0ciAicG9tb2Nu7WsiCisKKyM6IGJ1ZmZlci5jOjMxODYgc2NyZWVuLmM6NDc0MworbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW3BvbW9jbu1rXSIKKworIzogYnVmZmVyLmM6MzIxOCBzY3JlZW4uYzo0NzQ5Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbbuFovmFkXSIKKworIzogYnVmZmVyLmM6MzQyNAorbXNnaWQgIkFsbCIKK21zZ3N0ciAiVppldGtvIgorCisjOiBidWZmZXIuYzozNDI0Cittc2dpZCAiQm90IgorbXNnc3RyICJLb25pZWMiCisKKyM6IGJ1ZmZlci5jOjM0MjYKK21zZ2lkICJUb3AiCittc2dzdHIgIlph6GlhdG9rIgorCisjOiBidWZmZXIuYzo0MTYyCittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIHpvem5hbSBidWZmZXJvdjpcbiIKKworIzogYnVmZmVyLmM6NDE5NQorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW3pvem5hbSBjaP1iXSIKKworIzogYnVmZmVyLmM6NDIwOCBtZW1saW5lLmM6MTUxMworbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW55pYWRueSBz+mJvcl0iCisKKyM6IGJ1ZmZlci5jOjQ0MjgKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBabmFreSAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiWm5ha3kgcHJlICVzOiIKKworIzogYnVmZmVyLmM6NDQ0NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgbGluZT0lbGQgIGlkPSVkICBtZW5vPSVzIgorCisjOiBkaWZmLmM6MTMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NjogQ2FuIG5vdCBkaWZmIG1vcmUgdGhhbiAlbGQgYnVmZmVycyIKK21zZ3N0ciAiRTk2OiBOZW30nmVtIHBvcm92bmGdIHZpYWMgYWtvICVsZCBidWZmZXJvdiIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBOZWRhavogc2Egdnl0dm9yaZ0gcG9yb3ZuYW5pYSIKKworIzogZGlmZi5jOjc0NworbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIk9wcmF2bv0gc/pib3IiCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IE5lZOEgc2Eg6O10YZ0gdv1zdHVwIHBvcm92bmFuaWEiCisKKyM6IGRpZmYuYzoxNzMyCittc2dpZCAiRTk5OiBDdXJyZW50IGJ1ZmZlciBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFOTk6IEFrdHXhbG55IGJ1ZmZlciBuaWUgamUgdiBwb3Jvdm5hY29tIG3zZGUiCisKKyM6IGRpZmYuYzoxNzQ0Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogViBwb3Jvdm7hdmFjb20gbfNkZSBzYSBuZW5hY2jhZHphIGlu/SBidWZmZXIiCisKKyM6IGRpZmYuYzoxNzUyCittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiBWaWFjIGFrbyBkdmEgYnVmZmVyeSB2IHBvcm92buF2YWNvbSBt82RlOyBuZXZpZW0sIGt0b3L9IHBvdZ5pnSIKKworIzogZGlmZi5jOjE3NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiBOZWThIHNhIG7hanOdIGJ1ZmZlciBcIiVzXCIiCisKKyM6IGRpZmYuYzoxNzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogQnVmZmVyIFwiJXNcIiBuaWUgamUgdiBwb3Jvdm7hdmFjb20gbfNkZSIKKworIzogZGlncmFwaC5jOjIxNzIKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDogZGlhZ3JhcGggbmVzbWllIG9ic2Fob3ZhnSBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQ0Cittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJNYXBhIGts4XZlcyBuZW7hamRlbuEiCisKKyM6IGRpZ3JhcGguYzoyMzcxCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiBQb3WeaXRlIDpsb2Fka2V5bWFwIHYgc/pib3JlLCBrdG9y/SBuaWUgamUgemRyb2pvdv0iCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIERvcGzyb3ZhbmllIGu++uhvdv1jaCBzbG92ICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIHJlnmltICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBNaWVzdG5lIGRvcOXyYW5pZSBrvvrob3b9Y2ggc2xvdiAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBjZWz9Y2ggcmlhZGtvdiAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3ZhbmllIG7henZvdiBz+mJvcm92ICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdmFuaWUgdGFnb3YgKF5dL15OL15QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSB2em9ydSBjaWVzdCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBkZWZpbu1jae0gKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdmFuaWUgcG9kvmEgc2xvdm7ta2EgKF5LL15OL15QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBwb2S+YSB0ZXphdXJ1ICheVC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdvJvdmFuaWUgcHLta2F6b3bpaG8gcmlhZGthICheVi9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJLb25pZWMgb2RzdGF2Y2EiCisKKyM6IGVkaXQuYzo5MDcKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgInZvvmJhICd0aGVzYXVydXMnIGplIHBy4XpkbmEiCisKKyM6IGVkaXQuYzoxMDgzCittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAidm++YmEgJ2RpY3Rpb25hcnknIGplIHBy4XpkbmEiCisKKyM6IGVkaXQuYzoyMDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJwcmVovmFk4XZhbSBzbG92bu1rICVzIgorCisjOiBlZGl0LmM6MjE5OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnNlcnQpIFJvbG92YW5pZSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjIwMAorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAocmVwbGFjZSkgUm9sb3ZhbmllICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiUHJlaL5hZOF2YW06ICVzIgorCisjOiBlZGl0LmM6MjU0NworbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJQcmVovmFk4XZhbSB0YWd5LiIKKworIzogZWRpdC5jOjMyMDcKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIgUHJpZOF2YW0iCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzI1NgorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gSL5hZOFtLi4uIgorCisjOiBlZGl0LmM6MzMxMgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIlb9Y2hvZHppYSBwb2RvYmEiCisKKyM6IGVkaXQuYzozMzE3Cittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIlNsb3ZvIHogaW7paG8gcmlhZGt1IgorCisjOiBlZGl0LmM6MzMyMgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJKZWRpbuEgemhvZGEiCisKKyM6IGVkaXQuYzozMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICJ6aG9kYSAlZCB6ICVkIgorCisjOiBlZGl0LmM6MzM4NAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAiemhvZGEgJWQiCisKKyM6IGV2YWwuYzo2OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiBOZXpu4W1hIHByZW1lbm7hOiBcIiVzXCIiCisKKyM6IGV2YWwuYzo5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiBDaP1iavogeuF2b3JreTogJXMiCisKKyM6IGV2YWwuYzoxMDU3IGV2YWwuYzoxMDczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogUHJlbWVubuEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGV2YWwuYzoxMzE1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBQbyAnPycgY2j9YmEgJzonIgorCisjOiBldmFsLmM6MTkyOQorbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiBDaP1iYSAnKSciCisKKyM6IGV2YWwuYzoxOTc5Cittc2dpZCAiRTExMTogTWlzc2luZyAnXSciCittc2dzdHIgIkUxMTE6IENo/WJhICddJyIKKworIzogZXZhbC5jOjIwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IENo/WJhIG1lbm8gdm++Ynk6ICVzIgorCisjOiBldmFsLmM6MjA3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE5lem7hbWEgdm++YmE6ICVzIgorCisjOiBldmFsLmM6MjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogQ2j9Ymr6IHV2b2R6b3ZreTogJXMiCisKKyM6IGV2YWwuYzoyMjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBDaP1iavogdXZvZHpvdmt5OiAlcyIKKworIzogZXZhbC5jOjI1NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBDaHlibukgYXJndW1lbnR5IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE3OiBVbmtub3duIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExNzogTmV6buFtYSBmdW5rY2lhOiAlcyIKKworIzogZXZhbC5jOjI1NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IFBy7WxpmiBtbm9obyBhcmd1bWVudG92IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiBQcu1saZogbeFsbyBhcmd1bWVudG92IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IFBvdZ5pdGllIDxTSUQ+IG1pbW8ga29udGV4dCBza3JpcHR1OiAlcyIKKworIzogZXZhbC5jOjMxNzIgZ3VpLmM6Mzk4NAorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6MzY3OAorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCByaWFka3k6ICIKKworIzogZXZhbC5jOjQ3OTQKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPa1xuIgorIiZacnWaaZ0iCisKKyM6IGV2YWwuYzo1NjI2Cittc2dpZCAiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIgorbXNnc3RyICJFMjQwOiBOZWV4aXN0dWplIHByaXBvamVuaWUgayBWaW0gc2VydmVydSIKKworIzogZXZhbC5jOjU3MTYKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTIyNzogTmVt9J5lbSDo7XRhnSBvZHBvdmXvIHNlcnZyYSIKKworIzogZXZhbC5jOjU3NDEKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IE5lbfSeZW0gcG9zbGGdIGtsaWVudG92aSIKKworIzogZXZhbC5jOjU3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IE5lbfSeZW0gcG9zbGGdIG5hICVzIgorCisjOiBldmFsLmM6NTg4NAorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKENoeWJu/SkiCisKKyM6IGV2YWwuYzo2ODk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IE5lZGVmaW5vdmFu4SBwcmVtZW5u4TogJXMiCisKKyM6IGV2YWwuYzo3NTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTEyOiBGdW5rY2lhICVzIHWeIGV4aXN0dWplLiBQb3WeaXRlICEgcHJlIGplaiBuYWhyYWRlbmllLiIKKworIzogZXZhbC5jOjc2MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogTmVkZWZpbm92YW7hIGZ1bmtjaWE6ICVzIgorCisjOiBldmFsLmM6NzY0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IENo/WJhICcoJzogJXMiCisKKyM6IGV2YWwuYzo3NjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo3NzY2Cittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IENo/WJhIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjc4NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IE5lZOEgc2EgcHJlZGVmaW5vdmGdIGZ1bmtjaWEgJXM6IGplIHBvdZ7tdmFu4SIKKworIzogZXZhbC5jOjc5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogTuF6b3YgZnVua2NpZSBtdXPtIHph6O1uYZ0gdmW+a/1tIHDtc21lbm9tOiAlcyIKKworIzogZXZhbC5jOjc5MDkKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiBKZSB2eZ5hZG92YW7pIG1lbm8gZnVua2NpZSIKKworIzogZXZhbC5jOjgwMDIKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgImZ1bmtjaWEgIgorCisjOiBldmFsLmM6ODExNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBOZWRlZmlub3ZhbuEgZnVua2NpYTogJXMiCisKKyM6IGV2YWwuYzo4MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogTmVk4SBzYSB2eW1hemGdIGZ1bmtjaWEgJXM6IGplIHWeIHBvdZ7tdmFu4SIKKworIzogZXZhbC5jOjgxNjkKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiBaYW5vcmVuaWUgZnVua2Np7SBqZSBobGKaaWUgbmWeICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgInZvbOFtICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjQ1IGV4X2NtZHMyLmM6MTk4OAorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJwb2tyYeh1amVtIHYgJXMiCisKKyM6IGV2YWwuYzo4Mjk5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gbWltbyBmdW5rY2l1IgorCisjOiBldmFsLmM6ODM3NworIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiZG9rb27oZW7pICVzLiBO4XZyYXRvduEgaG9kbm90YSAlbGQiCisKKyM6IGV2YWwuYzo4MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgImRva29u6GVu6SAlcy4gTuF2cmF0b3bhIGhvZG5vdGEgXCIlc1wiIgorCisjOiBldmFsLmM6ODUyMQorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIGdsb2LhbG5lIHByZW1lbm7pOlxuIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICCaZXN0buFzdGtvdm8gJTAyeCwgIG9zbWnoa292byAlMDNvIgorCisjOiBleF9jbWRzLmM6NDI4Cittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IFByZWtyeXRpZSByaWFka292IHNlYm91IHNhbf1taSIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAicG/oZXQgcHJlcnWaZW79Y2ggcmlhZGtvdjogMSIKKworIzogZXhfY21kcy5jOjQ5OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgInBv6GV0IHByZXJ1mmVu/WNoIHJpYWRrb3Y6ICVsZCIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgInBv6GV0IGZpbHRyb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IGV4X2NtZHMuYzo5MTgKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiBBdXRvbWF0aWNr6SBwcu1rYXp5ICpGaWx0ZXIqIG5lc21pZSBtZW5pnSBha3R14WxueSBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoxMDAzCittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbTmV1bG+eZW7pIHptZW55XVxuIgorCisjOiBleF9jbWRzLmM6MTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgInZpbWluZm86ICVzIG5hIHJpYWRrdTogIgorCisjOiBleF9jbWRzLmM6MTI1MworbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiBwcu1saZogbW5vaG8gY2j9YiwgcHJlc2tha3VqZW0gemJ5dG9rIHP6Ym9ydSIKKworIzogZXhfY21kcy5jOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICLI7XRhbSB2aW1pbmZvIHP6Ym9yIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIGluZm9ybeFjaWUiCisKKyM6IGV4X2NtZHMuYzoxMjg0Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgem5h6Gt5IgorCisjOiBleF9jbWRzLmM6MTI4NQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBaTFlIQUxPIgorCisjOiBleF9jbWRzLmM6MTM3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogRG8gdmltaW5mbyBz+mJvcnUgJXMgc2EgbmVk4SB6YXBpc292YZ0iCisKKyM6IGV4X2NtZHMuYzoxNTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IE5lZOEgc2EgdWxvnmmdIHZpbWluZm8gc/pib3IgJXMhIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIlVrbOFk4W0gdmltaW5mbyBz+mJvcnUgXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgVGVudG8gdmltaW5mbyBz+mJvciBib2wgdnl0dm9yZW79IGVkaXRvcm9tIFZpbSAlcy5cbiIKKworIzogZXhfY21kcy5jOjE2MTIKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIFBva2lhviBidWRldGUgb3BhdHJubv0sIG30nmV0ZSBobyB1cHJhdm92YZ0uXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjE0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgSG9kbm90YSAnZW5jb2RpbmcnIHBv6GFzIHrhcGlzdSB0b2hvdG8gc/pib3J1XG4iCisKKyM6IGV4X2NtZHMuYzoxNzEzCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICJOZXBy7XN0dXBu/SB6YehpYXRv6G79IHpuYWsiCisKKyM6IGV4X2NtZHMuYzoyMDUzIGV4X2NtZHMuYzoyMzEwIGV4X2NtZHMyLmM6NjAyCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAiVWxvnmmdIGFrbyIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMDk2Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IFP6Ym9yIGplIG5h6O10YW79IHYgaW5vYiBidWZmZXJlIgorCisjOiBleF9jbWRzLmM6MjEzMAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIlVsb55pnSBuZfpwbG79IHP6Ym9yPyIKKworIzogZXhfY21kcy5jOjIxMzcKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogUG91nml0ZSAhIHByZSB1bG+eZW5pZSBuZfpwbG7paG8gYnVmZmVydSIKKworIzogZXhfY21kcy5jOjIyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICJQcmVw7XNhnSBz+mJvciBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogjmlhZG55IG7hem92IHP6Ym9ydSBwcmUgYnVmZmVyICVsZCIKKworIzogZXhfY21kcy5jOjIzNTMKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiBT+mJvciBuZWJvbCB1bG+eZW79OiB1a2xhZGFuaWUgamUgemFr4Xphbukgdm++Ym91ICd3cml0ZSciCisKKyM6IGV4X2NtZHMuYzoyMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyJQcmUgXCIlLipzXCIgamUgbmFzdGF2ZW7hIHZvvmJhICdyZWFkb25seScgKGliYSBuYSDo7XRhbmllKS5cbiIKKyJQcmFqZXRlIHNpIGp1IHBvdGxh6GmdPyIKKworIzogZXhfY21kcy5jOjI1MzgKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIlVwcmF2b3ZhnSBz+mJvciIKKworIzogZXhfY21kcy5jOjMwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9tYXRpY2vpIHBy7WthenkgbmVv6GFr4XZhbmUgem1hemFsaSBub3b9IGJ1ZmZlciAlcyIKKworIzogZXhfY21kcy5jOjMxOTMKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogbmXo7XNlbG79IGFyZ3VtZW50IHByZSA6eiIKKworIzogZXhfY21kcy5jOjMyNzgKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltIG5lcG92b2x1amUgcG91nml0aWUgcHLta2F6b3Ygc2hlbGx1IgorCisjOiBleF9jbWRzLmM6MzM4NQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3Vs4XJuZSB2/XJhenkgbmVzbfogYnmdIG9kZGVsZW7pIHDtc21lbmFtaSIKKworIzogZXhfY21kcy5jOjM3MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAibmFocmFkaZ0gJXMgKHkvbi9hL3EvSS9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDA5MgorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIocHJlcnWaZW79KSAiCisKKyM6IGV4X2NtZHMuYzo0MDk2Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgInBv6GV0IG5haHJhZGVu7SBuYSByaWFkb2s6IDEiCisKKyM6IGV4X2NtZHMuYzo0MDk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICJwb+hldCBuYWhyYWRlbu0gbmEgcmlhZG9rOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo0MTAxCittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIG5hIDEgcmlhZGt1IgorCisjOiBleF9jbWRzLmM6NDEwMworIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgbmEgJWxkIHJpYWRrb3YiCisKKyM6IGV4X2NtZHMuYzo0MTU0Cittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiBnbG9iYWwgbmVk4SBzYSB2b2xhnSByZWt1cnrtdm5lIgorCisjOiBleF9jbWRzLmM6NDE4OQorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiBQcmkgcHLta2F6ZSBnbG9iYWwgY2j9YmEgcmVndWzhcm55IHb9cmF6IgorCisjOiBleF9jbWRzLmM6NDIzOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICJWem9yIG7hamRlbv0gbmEga2GeZG9tIHJpYWRrdTogJXMiCisKKyM6IGV4X2NtZHMuYzo0MzE5Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBQb3NsZWRu/SBSZZ1hemVjIFBvZG5hZHBpc3U6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ0MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiC8dXR1amVtLCBwcmUgJXMgbmllIGplIJ5pYWRueSBwb21vY27tayIKKworIzogZXhfY21kcy5jOjQ0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICK8dXR1amVtLCBz+mJvciBcIiVzXCIgcyBwb21vY27ta29tIG5lYm9sIG7hamRlbv0iCisKKyM6IGV4X2NtZHMuYzo0OTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIG5pZSBqZSBhZHJlc+Fyb20iCisKKyM6IGV4X2NtZHMuYzo0OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBOZWThIHNhIG90dm9yaZ0gJXMgcHJlIHrhcGlzIgorCisjOiBleF9jbWRzLmM6NDk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogTmVk4SBzYSBvdHZvcmmdICVzIHByZSB64XBpcyIKKworIzogZXhfY21kcy5jOjUwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogRHVwbGljaXRu/SB0YWcgXCIlc1wiIHYgc/pib3JlICVzIgorCisjOiBleF9jbWRzLmM6NTEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IE5lem7hbWEgZnVua2NpYTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MTU5Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IENo/WJhIGlkZW50aWZpa+F0b3IgcHJlIHNpZ24iCisKKyM6IGV4X2NtZHMuYzo1MjA1Cittc2dpZCAiRTI1NTogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTI1NTogUHLtbGmaIG1ub2hvIGRlZmlub3Zhbv1jaCBvem5h6GVu7SIKKworIzogZXhfY21kcy5jOjUyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBDaHlibmUgb3puYehlbv0gdGV4dDogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjcxIGV4X2NtZHMuYzo1NDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IE5lem7hbWUgb3puYehlbmllOiAlcyIKKworIzogZXhfY21kcy5jOjUzMTcKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBDaP1iYSDoaXNsbyBvem5h6GVuaWEiCisKKyM6IGV4X2NtZHMuYzo1Mzk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiBDaHlibukgbWVubyBidWZmZXJ1OiAlcyIKKworIzogZXhfY21kcy5jOjU0MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IENoeWJu6SBJRCBvem5h6GVuaWE6ICVsZCIKKworIzogZXhfY21kcy5jOjU2MDcKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIlt2eW1hemFu/V0iCisKKyM6IGV4X2NtZHMyLmM6NzAKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBsZWF2ZS4iCittc2dzdHIgIlNw+pqdYW0gcmWeaW0gbGFkZW5pYS4gUHJlIHVrb27oZW5pZSBuYXDtmnRlIFwiY29udFwiLiIKKworIzogZXhfY21kczIuYzo3NCBleF9kb2NtZC5jOjc3MQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgInJpYWRvayAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgInBy7WthejogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIkJvZCBwcmVydZplbmlhIHYgXCIlcyVzXCIgbmEgcmlhZGt1ICVsZCIKKworIzogZXhfY21kczIuYzozODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiBCb2QgcHJlcnWaZW5pYSBuZW7hamRlbv06ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIk5lYm9saSBkZWZpbm92bukgnmlhZG5lIGJvZHkgcHJlcnWaZW5pYSIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgIHJpYWRvayAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgIlVsb55pnSB6bWVueSBkbyBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6NjI3IGV4X2RvY21kLmM6ODY2NworbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICJCZXogbWVuYSIKKworIzogZXhfY21kczIuYzo3NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IEJ1ZmZlciBcIiVzXCIgb2JzYWh1amUgbmV1bG+eZW7pIHptZW55IgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiVmFyb3ZhbmllOiBOZehha2Fu/SB2c3R1cCBkbyBpbulobyBidWZmZXJ1IChza29udHJvbHVqdGUgYXV0b21hdGlja+kgcHLta2F6eSkiCisKKyM6IGV4X2NtZHMyLmM6MTIwOAorbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogUHJlIPpwcmF2dSBib2wgemFkYW79IGliYSBqZWRlbiBz+mJvciIKKworIzogZXhfY21kczIuYzoxMjEwCittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBQcmVkIHBydv0gc/pib3Igc2EgbmVk4SBwcmVza2/oaZ0iCisKKyM6IGV4X2NtZHMyLmM6MTIxMgorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiBaYSBwb3NsZWRu/SBz+mJvciBzYSBuZWThIHByZXNrb+hpnSIKKworIzogZXhfY21kczIuYzoxNjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiSL5hZOFtIFwiJXNcIiB2IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICJIvmFk4W0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE2ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAic/pib3IgXCIlc1wiIG5lYm9sIG7hamRlbv0gdiAncnVudGltZXBhdGgnIgorCisjOiBleF9jbWRzMi5jOjE3MTQKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiWmRyb2pvdv0gc2tyaXB0IFZpbSIKKworIzogZXhfY21kczIuYzoxODMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiIG5pZSBqZSBhZHJlc+Fyb20iCisKKyM6IGV4X2NtZHMyLmM6MTg2MgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAibmVk4SBzYSBpbnRlcnByZXRvdmGdIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODY0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAicmlhZG9rICVsZDogbmVt9J5lIGJ5nSB6ZHJvaiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg3OAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImludGVycHJldHVqZW0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAicmlhZG9rICVsZCBqZSB6ZHJvam9tIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTg2CisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICJkb2tvbuhlbuEgaW50ZXJwcmV04WNpYSAlcyIKKworIzogZXhfY21kczIuYzoyMjg3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTogVmFyb3ZhbmllOiBjaHlibv0gb2RkZb5vdmHoIHJpYWRrb3YuIE1vnm7hIGNo/WJhIF5NLiIKKworIzogZXhfY21kczIuYzoyMzM2Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2NzogOmZpbmlzaCBwb3WeaXTpIG1pbW8gaW50ZXJwcmV0b3Zhbv0gc/pib3IiCisKKyM6IGV4X2NtZHMyLmM6MjM2OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiA6ZmluaXNoIHBvdZ5pdOkgbWltbyBpbnRlcnByZXRvdmFu/SBz+mJvciIKKworIzogZXhfY21kczIuYzoyODM4Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICLPYWya7SBuYSB0bGHoIgorCisjOiBleF9jbWRzMi5jOjI5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIlRsYejtbSBzdHJhbnUgJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjI5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIkvzcGlhICVkIHogJWQiCisKKyM6IGV4X2NtZHMyLmM6Mjk3NworIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiVnl0bGHoZW7pOiAlcyIKKworIzogZXhfY21kczIuYzoyOTg0Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiVGxh6CBib2xhIHpydZplbuEiCisKKyM6IGV4X2NtZHMyLmM6MzM2NworbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogTmVk4SBzYSB6YXBpc292YZ0gZG8gdv1zdHVwbulobyBQb3N0U2NyaXB0b3bpaG8gc/pib3J1IgorCisjOiBleF9jbWRzMi5jOjQwNDIKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IE5lZOEgc2Egb3R2b3JpnSB2/XN0dXBu/SBQb3N0U2NyaXB0b3b9IHP6Ym9yIgorCisjOiBleF9jbWRzMi5jOjQwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogTmVk4SBzYSBvdHZvcmmdIHP6Ym9yIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTmVk4SBzYSDo7XRhnSBQb3N0U2NyaXB0b3b9IHP6Ym9yIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0Mjg5Cittc2dpZCAiU2VuZGluZyB0byBwcmludGVyLi4uIgorbXNnc3RyICJQb3NpZWxhbSBuYSB0bGHoaWFyZfIuLi4iCisKKyM6IGV4X2NtZHMyLmM6NDI5MworbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IFBvc3RTY3JpcHRvdv0gc/pib3Igc2EgbmVwb2RhcmlsbyB2eXRsYehpnSIKKworIzogZXhfY21kczIuYzo0Mjk1Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJUbGHob3bhIPpsb2hhIGJvbGEgb2Rvc2xhbuEuIgorCisjOiBleF9jbWRzMi5jOjQ2OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIkFrdHXhbG55ICVzIGphenlrOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogTmVk4SBzYSBuYXN0YXZpnSBqYXp5ayBuYSBcIiVzXCIiCisKKyM6IGV4X2RvY21kLmM6NDkwCittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIlNw+pqdYW0gRXggcmWeaW0uIE5hcGmadGUgXCJ2aXN1YWxcIiBwcmUgbuF2cmF0IGRvIE5vcm3hbG7taG8gcmWeaW11LiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTI2Cittc2dpZCAiQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIktvbmllYyBz+mJvcnUiCisKKyM6IGV4X2RvY21kLmM6NjAxCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBQcu1rYXogamUgcHLtbGmaIHpsb55pdP0iCisKKyM6IGV4X2RvY21kLmM6OTExCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IENo/WJhIDplbmR3aGlsZSIKKworIzogZXhfZG9jbWQuYzo5MTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogQ2j9YmEgOmVuZGlmIgorCisjOiBleF9kb2NtZC5jOjkyMworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIktvbmllYyB6ZHJvam926WhvIHP6Ym9ydSIKKworIzogZXhfZG9jbWQuYzo5MjQKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIktvbmllYyBmdW5rY2llIgorCisjOiBleF9kb2NtZC5jOjEzNDQKK21zZ2lkICJBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJOZWplZG5vem5h6G7pIHBvdZ5pdGllIHBvdZ7tdmF0Zb5vbSBkZWZpbm92YW7paG8gcHLta2F6dSIKKworIzogZXhfZG9jbWQuYzoxMzU4Cittc2dpZCAiTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJOaWUgamUgcHLta2F6b20gZWRpdG9ydSIKKworIzogZXhfZG9jbWQuYzoxNDQxCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICKOaWFkbnUgcGFuaWt1ISIKKworIzogZXhfZG9jbWQuYzoxNDYwCittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuIgorbXNnc3RyICJaYWRhbv0gc3DkdG79IHJvenNhaCIKKworIzogZXhfZG9jbWQuYzoxNDY5Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJaYWRhbv0gc3DkdG79IHJvenNhaC4gT0sgb2Rsb55pnSIKKworIzogZXhfZG9jbWQuYzoxNTgwCittc2dpZCAiVXNlIHcgb3Igdz4+IgorbXNnc3RyICJQb3WeaXRlIHcg6Gkgdz4+IgorCisjOiBleF9kb2NtZC5jOjMwOTcKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6ILx1dHVqZW0sIGFsZSB0ZW50byBwcu1rYXogbmllIGplIGltcGxlbWVudG92YW79IgorCisjOiBleF9kb2NtZC5jOjMyNjcKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogUHLtcHVzdG79IGplIGliYSBqZWRlbiBu4XpvdiBz+mJvcnUiCisKKyM6IGV4X2RvY21kLmM6MzgyMworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIkWadGUgem9zdOF2YWr6ICVkIHP6Ym9yb3YgayD6cHJhdmUuIENoY2V0ZSBuYXByaWVrIHRvbXUgdWtvbuhpnSBlZGl0b3I/IgorCisjOiBleF9kb2NtZC5jOjM4MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogRZp0ZSB6b3N04XZhamFq+iAlbGQgc/pib3J5IGsg+nByYXZlLiIKKworIzogZXhfZG9jbWQuYzozOTI0Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogdXNlICEgdG8gcmVkZWZpbmUiCittc2dzdHIgIkUxNzQ6IFBy7WtheiB1niBleGlzdHVqZTogcG91nml0ZSAhIHByZSBwcmVkZWZpbm92YW5pZSIKKworIzogZXhfZG9jbWQuYzo0MDI5Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgIE1lbm8gICAgICAgQXJncyBSb3pzYWgg2nBsbm9znSAgRGVmaW7tY2lhIgorCisjOiBleF9kb2NtZC5jOjQxMTgKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIk5lYm9saSBu4WpkZW7pIJ5pYWRuZSBwb3WeaXZhdGW+b20gZGVmaW5vdmFu6SBwcu1rYXp5IgorCisjOiBleF9kb2NtZC5jOjQxNDkKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBOZWJvbGkgemFkYW7pIJ5pYWRuZSB2bGFzdG5vc3RpIgorCisjOiBleF9kb2NtZC5jOjQyMDEKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IENoeWJu/SBwb+hldCBhcmd1bWVudG92IgorCisjOiBleF9kb2NtZC5jOjQyMTYKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBQb+hldCBuZW30nmUgYnmdIHphZGFu/SBkdmFrcuF0IgorCisjOiBleF9kb2NtZC5jOjQyMjYKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBDaHlibuEgaW1wbGljaXRu4SBob2Rub3RhIHByZSBwb+hldCIKKworIzogZXhfZG9jbWQuYzo0MjU0Cittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiBwcmUgZG9wbG5lbmllIGplIHBvdHJlYm79IGFyZ3VtZW50IgorCisjOiBleF9kb2NtZC5jOjQyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IENoeWJu4SBob2Rub3RhIGRvcGxuZW5pYTogJXMiCisKKyM6IGV4X2RvY21kLmM6NDI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IENoeWJu4SB2bGFzdG5vc506ICVzIgorCisjOiBleF9kb2NtZC5jOjQzMjIKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogQ2h5Ym7pIG1lbm8gcHLta2F6dSIKKworIzogZXhfZG9jbWQuYzo0MzM3Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBQb3We7XZhdGW+b20gZGVmaW5vdmFu6SBwcu1rYXp5IG11c2lhIHph6O1uYZ0gdmW+a/1tIHDtc21lbm9tIgorCisjOiBleF9kb2NtZC5jOjQ0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IFBvdZ7tdmF0Zb5vbSBkZWZpbm92YW79IHBy7WtheiAlcyBuZWV4aXN0dWplIgorCisjOiBleF9kb2NtZC5jOjQ4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBTY2jpbWEgZmFyaWViICVzIG5lbuFqZGVu4SIKKworIzogZXhfZG9jbWQuYzo0ODY1Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIlBvemRyYXVqZW0sIFZpbSBwb3We7XZhdGW+ISIKKworIzogZXhfZG9jbWQuYzo1NTY5Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIlVwcmF2aZ0gc/pib3IgdiBub3ZvbSBva25lIgorCisjOiBleF9kb2NtZC5jOjU4MzkKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIo5pYWRueSBvZGtsYWRhY+0gc/pib3IiCisKKyM6IGV4X2RvY21kLmM6NTk0MworbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJQcmlwb2ppnSBz+mJvciIKKworIzogZXhfZG9jbWQuYzo2MDAyCittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiCOaWFkbnkgcHJlZGNo4WR6YWr6Y2kgYWRyZXPhciIKKworIzogZXhfZG9jbWQuYzo2MDc5Cittc2dpZCAiRTE4NzogVW5rbm93biIKK21zZ3N0ciAiRTE4NzogTmV6buFteSIKKworIzogZXhfZG9jbWQuYzo2MTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiVW1pZXN0ZW5pZSBva25hOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjYyMDIKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogTmEgdGVqdG8gcGxhdGZvcm1lIHNhIG5lZOEgdW1pZXN0bmVuaWUgb2tuYSB6aXN0aZ0iCisKKyM6IGV4X2RvY21kLmM6NjQ2OAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIlVsb55pnSBwcmVzbWVyb3ZhbmllIgorCisjOiBleF9kb2NtZC5jOjY2MTcKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIlVsb55pnSBwb2i+YWQiCisKKyM6IGV4X2RvY21kLmM6NjYxOAorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiVWxvnmmdIHNlZGVuaWUiCisKKyM6IGV4X2RvY21kLmM6NjYyMAorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIlVsb55pnSBuYXN0YXZlbmllIgorCisjOiBleF9kb2NtZC5jOjY3NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgZXhpc3R1amUgKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZXhfZG9jbWQuYzo2Nzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTmVk4SBzYSBvdHZvcmmdIFwiJXNcIiBwcmUgeuFwaXMiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY3OTgKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IEFyZ3VtZW50ZW0gbfSeZSBieZ0gaWJhIHDtc2llbW8gYWxlYm8gcHJhdv0g6GkgvmF2/SBhcG9zdHJvZiIKKworIzogZXhfZG9jbWQuYzo2ODQxCittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBWbm9yZW5pZSA6bm9ybWFsIGplIHBy7WxpmiBobGJva+kiCisKKyM6IGV4X2RvY21kLmM6NzIwMgorbXNnaWQgIjppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJ2bm9yZW5pZSA6aWYgamUgcHLtbGmaIGhsYm9r6SIKKworIzogZXhfZG9jbWQuYzo3MjM3Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYgYmV6IHpvZHBvdmVkYWr6Y2VobyA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzI1NworbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZWxzZSBiZXogem9kcG92ZWRhavpjZWhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjU5Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2VpZiBiZXogem9kcG92ZWRhavpjZWhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MzExCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgInZub3JlbmllIDp3aGlsZSBqZSBwcu1saZogaGxib2vpIgorCisjOiBleF9kb2NtZC5jOjczNTcKK21zZ2lkICI6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjpjb250aW51ZSBiZXogem9kcG92ZWRhavpjZWhvIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3Mzg0Cittc2dpZCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6YnJlYWsgYmV6IHpvZHBvdmVkYWr6Y2VobyA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzQwNyBleF9kb2NtZC5jOjc0MTIKK21zZ2lkICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjplbmR3aGlsZSBiZXogem9kcG92ZWRhavpjZWhvIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3NDMzCittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uIG1pbW8gZnVua2NpdSIKKworIzogZXhfZG9jbWQuYzo3NjEzCittc2dpZCAiRTE5NDogTm8gYWx0ZXJuYXRlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciAnIyciCittc2dzdHIgIkUxOTQ6II5pYWRueSBhbHRlcm5hdO12bnkgbuF6b3Ygc/pib3J1LCBrdG9y/W0gYnkgYm9sbyBtb55u6SBuYWhyYWRpnSAnIyciCisKKyM6IGV4X2RvY21kLmM6NzY0NAorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAinmlhZG55IG7hem92IHP6Ym9ydSwga3Rvcv1tIGJ5IGJvbG8gbW+ebukgbmFocmFkaZ0gXCI8YWZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY1MgorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAinmlhZG5lIOjtc2xvIGJ1ZmZlcnUsIGt0b3L9bSBieSBib2xvIG1vnm7pIG5haHJhZGmdIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY2MworbXNnaWQgIm5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICIiCisinmlhZG5hIHpob2RhIGF1dG9tYXRpY2v9Y2ggcHLta2F6b3YsIGt0b3JvdSBieSBib2xvIG1vnm7pIG5haHJhZGmdIFwiPGFtYXRjaD4iCisiXCIiCisKKyM6IGV4X2RvY21kLmM6NzY3MworbXNnaWQgIm5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICKeaWFkbnkgOnNvdXJjZSBz+mJvciwga3Rvcv1tIGJ5IGJvbG8gbW+ebukgbmFocmFkaZ0gXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzcxNAorIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiUHLhemRu/SBu4XpvdiBz+mJvcnUgcHJlICclJyDoaSAnIycgZnVuZ3VqZSBpYmEgcyBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3NzE2Cittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiVv1zbGVka29tIHZ5aG9kbm90ZW5pYSBqZSBwcuF6ZG55IHJlnWF6ZWMiCisKKyM6IGV4X2RvY21kLmM6ODY0OQorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogTmVk4SBzYSBvdHZvcmmdIHByZSDo7XRhbu0gdmltaW5mbyBz+mJvciIKKworIzogZXhfZG9jbWQuYzo4ODIyCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBWIHRlanRvIHZlcnppIG5pZSBz+iBkaWFncmFwaHkgcG9kcG9yb3ZhbukiCisKKyM6IGV4X2dldGxuLmM6MjgzMworbXNnaWQgInRhZ25hbWUiCittc2dzdHIgIm1lbm8gdGFndSIKKworIzogZXhfZ2V0bG4uYzoyODM2Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgdHlwIHP6Ym9ydVxuIgorCisjOiBleF9nZXRsbi5jOjQwNDkKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIid2b75iYSAnaGlzdG9yeScgamUgbmFzdGF2ZW7hIG5hIG51bHUiCisKKyM6IGV4X2dldGxuLmM6NDI4OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSGlzdPNyaWEgJXMgKHph6O1uYWr6Y2kgbmFqbm92mm91IHBvbG+ea291KTpcbiIKKworIzogZXhfZ2V0bG4uYzo0MjkwCittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJQcu1rYXpvdukgUmlhZGt5IgorCisjOiBleF9nZXRsbi5jOjQyOTEKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICJWeWi+YWThdmFu/SBSZZ1hemVjIgorCisjOiBleF9nZXRsbi5jOjQyOTIKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJW/XJheiIKKworIzogZXhfZ2V0bG4uYzo0MjkzCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiVnN0dXBu/SBSaWFkb2siCisKKyM6IGV4X2dldGxuLmM6NDMyMworbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgcHJldnmadWplIGTlnmt1IHBy7WthenUiCisKKyM6IGV4X2dldGxuLmM6NDQ5MQorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IEFrdO12bmUgb2tubyBhbGVibyBidWZmZXIgYm9sIHZ5bWF6YW79IgorCisjOiBmaWxlaW8uYzozNTEKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbuF6b3Ygc/pib3J1IgorCisjOiBmaWxlaW8uYzozNzUgZmlsZWlvLmM6NTAwIGZpbGVpby5jOjI1MTYgZmlsZWlvLmM6MjU1NAorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJqZSBhZHJlc+Fyb20iCisKKyM6IGZpbGVpby5jOjM3NworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIm5pZSBqZSBz+mJvcm9tIgorCisjOiBmaWxlaW8uYzo1MjIgZmlsZWlvLmM6MzY0NgorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltub3b9IHP6Ym9yXSIKKworIzogZmlsZWlvLmM6NTQwCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW3By7XN0dXAgb2RtaWV0bnV0/V0iCisKKyM6IGZpbGVpby5jOjYzNAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6ICpSZWFkUHJlIGF1dG9tYXRpY2vpIHBy7WthenkgdXJvYmlsaSBz+mJvciBuZehpdGF0Zb5u/W0iCisKKyM6IGZpbGVpby5jOjYzNgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6ICpSZWFkUHJlIGF1dG9tYXRpY2vpIHBy7WthenkgbmVzbfogbWVuaZ0gYWt0deFsbnkgYnVmZmVyIgorCisjOiBmaWxlaW8uYzo2NTcKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IOjtdGFtIHogmnRhbmRhcmRu6WhvIHZzdHVwdS4uLlxuIgorCisjOiBmaWxlaW8uYzo2NjMKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIsjtdGFtIHogmnRhbmRhcmRu6WhvIHZzdHVwdS4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo4OTIKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogUG8ga29udmVyemlpIGplIHP6Ym9yIG5l6Gl0dGF0Zb5u/SEiCisKKyM6IGZpbGVpby5jOjE3NTUKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZnBvbWVub3ZhbuEgcvpyYS9zb2tldF0iCisKKyM6IGZpbGVpby5jOjE3NjIKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltwb21lbm92YW7hIHL6cmFdIgorCisjOiBmaWxlaW8uYzoxNzY5Cittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIltzb2tldF0iCisKKyM6IGZpbGVpby5jOjE3NzcKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoxNzg3Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbY2j9YmEgQ1JdIgorCisjOiBmaWxlaW8uYzoxNzkyCittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW27hamRlbukgTkxdIgorCisjOiBmaWxlaW8uYzoxNzk3Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbZGxo6SByaWFka3kgemFsb21lbuldIgorCisjOiBmaWxlaW8uYzoxODAzIGZpbGVpby5jOjM2MzAKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltuZXNrb252ZXJ0b3Zhbv1dIgorCisjOiBmaWxlaW8uYzoxODA4IGZpbGVpby5jOjM2MzUKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW3Nrb252ZXJ0b3Zhbv1dIgorCisjOiBmaWxlaW8uYzoxODE1IGZpbGVpby5jOjM2NjAKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlt6YZppZnJvdmFu/V0iCisKKyM6IGZpbGVpby5jOjE4MjIKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltDSFlCQSBQUkVWT0RVXSIKKworIzogZmlsZWlvLmM6MTgyOQorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltDSFlCWSDIzVRBTklBXSIKKworIzogZmlsZWlvLmM6MjAzNgorbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICJOZWThIHNhIG7hanOdIGRv6GFzbv0gc/pib3IgcHJlIGtvbnZlcnppdSIKKworIzogZmlsZWlvLmM6MjA0MworbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiS29udmVyemlhIHMgJ2NoYXJjb252ZXJ0JyBzYSBuZXBvZGFyaWxhIgorCisjOiBmaWxlaW8uYzoyMDQ2Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAibmVk4SBzYSDo7XRhnSB2/XN0dXAgJ2NoYXJjb252ZXJ0JyIKKworIzogZmlsZWlvLmM6MjQzMgorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICIiCisiRTIwMzogQXV0b21hdGlja+kgcHLta2F6eSB6bWF6YWxpIOhpIGRlYWt0aXZvdmFsaSBidWZmZXIsIGt0b3L9IG1hbCBieZ0gIgorInVsb55lbv0iCisKKyM6IGZpbGVpby5jOjI0NTUKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b21hdGlja/0gcHLta2F6IG5lb+hha+F2YW79bSBzcPRzb2JvbSB6bWVuaWwgcG/oZXQgcmlhZGtvdiIKKworIzogZmlsZWlvLmM6MjUyMSBmaWxlaW8uYzoyNTM4Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIm5pZSBqZSBz+mJvcm9tIGFuaSB6YXJpYWRlbu1tIG5hIGt0b3LpIHNhIGThIHphcGlzb3ZhnSIKKworIzogZmlsZWlvLmM6MjU4NAorbXNnaWQgImlzIHJlYWQtb25seSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJqZSBpYmEgcHJlIOjtdGFu7WllKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6Mjg4NgorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIk5lZOEgc2EgemFwaXNvdmGdIGRvIHrhbG+ebulobyBz+mJvcnUgKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6Mjg5OAorbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJDaHliYSBwcmkgdXphdHbhcmFu7SB64Wxvnm7paG8gc/pib3J1IChwb3WeaXRlICEgcHJlIHZ5bvp0ZW5pZSkiCisKKyM6IGZpbGVpby5jOjI5MDAKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWThIHNhIG5h6O10YZ0gc/pib3IgcHJlIHrhbG9odSAocG91nml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBmaWxlaW8uYzoyOTE2Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWThIHNhIHZ5dHZvcmmdIHrhbG+ebv0gc/pib3IgKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6MzAxOAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVk4SBzYSB2eXR2b3JpnSB64Wxvnm79IHP6Ym9yIChwb3WeaXRlICEgcHJlIHZ5bvp0ZW5pZSkiCisKKyMgcmVzb3VyY2UgZm9yayA/IQorIzogZmlsZWlvLmM6MzA4MAorbXNnaWQgIlRoZSByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICInUmVzb3VyY2UgZm9yaycgYnVkZSBzdHJhdGVu/SAocG91nml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBmaWxlaW8uYzozMTY5Cittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IE5lZOEgc2EgbuFqc50gZG/oYXNu/SBz+mJvciBwcmUgdWtsYWRhbmllIgorCisjOiBmaWxlaW8uYzozMTg3Cittc2dpZCAiRTIxMzogQ2Fubm90IGNvbnZlcnQgKHVzZSAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiCittc2dzdHIgIkUyMTM6IE5lZOEgc2EgcHJldmllc50gKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllIHByZXZvZHUpIgorCisjOiBmaWxlaW8uYzozMjIyCittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogU/pib3Igc2EgbmVk4SBvdHZvcmmdIHByZSB1a2xhZGFuaWUiCisKKyM6IGZpbGVpby5jOjMyMjYKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IFP6Ym9yIHNhIG5lZOEgb3R2b3JpnSBwcmUgdWtsYWRhbmllIgorCisjOiBmaWxlaW8uYzozNDc1Cittc2dpZCAiQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJaYXR2b3JlbmllIHpseWhhbG8iCisKKyM6IGZpbGVpby5jOjM1NDYKK21zZ2lkICJ3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgImNoeWJhIHByaSB64XBpc2UsIHByZXZvZCBzYSBuZXBvZGFyaWwiCisKKyM6IGZpbGVpby5jOjM1NTIKK21zZ2lkICJ3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJjaHliYSBwcmkgdWtsYWRhbu0gKGplIHZvvm7pIG1pZXN0byBuYSBkaXNrdT8pIgorCisjOiBmaWxlaW8uYzozNjI1Cittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBDSFlCQSBQUkVWT0RVIgorCisjOiBmaWxlaW8uYzozNjQxCittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIlt6YXJpYWRlbmllXSIKKworIzogZmlsZWlvLmM6MzY0NgorbXNnaWQgIltOZXddIgorbXNnc3RyICJbbm92/V0iCisKKyM6IGZpbGVpby5jOjM2NjgKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW3BdIgorCisjOiBmaWxlaW8uYzozNjY4Cittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgcHJpcG9qZW79IgorCisjOiBmaWxlaW8uYzozNjcwCittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt1XSIKKworIzogZmlsZWlvLmM6MzY3MAorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgdWxvnmVu/SIKKworIzogZmlsZWlvLmM6MzcyMAorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBwYXRjaG1vZGU6IG5lZOEgc2EgdWxvnmmdIHD0dm9kbv0gc/pib3IiCisKKyM6IGZpbGVpby5jOjM3NDIKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogbmVk4SBzYSB6YXBpc292YZ0gZG8gcHLhemRuZWhvIHD0dm9kbulobyBz+mJvcnUiCisKKyM6IGZpbGVpby5jOjM3NTcKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IE5lZOEgc2EgdnltYXphnSB64Wxvnm79IHP6Ym9yIgorCisjOiBmaWxlaW8uYzozODA5Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisiVkFST1ZBTklFOiBPYnNhaCBw9HZvZG7paG8gc/pib3J1IG30nmUgYnmdIHN0cmF0ZW79IGFsZWJvIHBvmmtvZGVu/VxuIgorCisjOiBmaWxlaW8uYzozODExCittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAibmV1a29u6HVqdGUgZWRpdG9yIHNr9HIsIG5lniBidWRlIHP6Ym9yIPpzcGWabmUgdWxvnmVu/SEiCisKKyM6IGZpbGVpby5jOjM4OTEKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjM4OTEKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MgZm9ybeF0XSIKKworIzogZmlsZWlvLmM6Mzg5OAorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6Mzg5OAorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozOTA1Cittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM5MDUKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozOTMyCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgcmlhZG9rLCAiCisKKyM6IGZpbGVpby5jOjM5MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCByaWFka292LCAiCisKKyM6IGZpbGVpby5jOjM5MzcKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSB6bmFrIgorCisjOiBmaWxlaW8uYzozOTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgem5ha292IgorCisjOiBmaWxlaW8uYzozOTQ5Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW55pYWRueSBrb25pZWMgcmlhZGt1XSIKKworIzogZmlsZWlvLmM6Mzk0OQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIltuZfpwbG79IHBvc2xlZG79IHJpYWRva10iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6Mzk2OAorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiVkFST1ZBTklFOiBvZCBqZWhvIG5h6O10YW5pYSBib2wgb2JzYWggc/pib3J1IHptZW5lbv0hISEhIgorCisjOiBmaWxlaW8uYzozOTcwCittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJDaGNldGUgaG8gbmFvemFqIHVsb55pnSIKKworIzogZmlsZWlvLmM6NDkzMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogQ2h5YmEgcHJpIHrhcGlzZSBkbyBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IENoeWIgcHJpIHV6YXR24XJhbu0gXCIlc1wiIgorCisjOiBmaWxlaW8uYzo0OTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBDaHliYSBwcmkg6O10YW7tIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTExNQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b21hdGlja/0gcHLta2F6IHZ5bWF6YWwgYnVmZmVyIgorCisjOiBmaWxlaW8uYzo1MTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IFZhcm92YW5pZTogc/pib3IgXCIlc1wiIHWeIG5pZSBqZSBkb3N0dXBu/SIKKworIzogZmlsZWlvLmM6NTEzNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIiIKKyJXMTI6IFZhcm92YW5pZTogc/pib3IgXCIlc1wiIGJvbCBwbyB6YehhdO0g+nByYXZ5IHptZW5lbv0gYSBWaW0gdGllniB6bWVuaWwgIgorImJ1ZmZlciIKKworIzogZmlsZWlvLmM6NTEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBWYXJvdmFuaWU6IHP6Ym9yIFwiJXNcIiBib2wgcG8gemHoYXTtIPpwcmF2eSB6bWVuZW79IgorCisjOiBmaWxlaW8uYzo1MTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogVmFyb3ZhbmllOiBSZZ5pbSBz+mJvcnUgXCIlc1wiIGJvbCBwbyB6YehhdO0g+nByYXYgem1lbmVu/SIKKworIzogZmlsZWlvLmM6NTE1MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IFZhcm92YW5pZTogcG8gemHoYXTtIPpwcmF2eSB2eXR2b3Jlbv0gc/pib3IgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MTY4Cittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAiVmFyb3ZhbmllIgorCisjOiBmaWxlaW8uYzo1MTY5Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImTmHo7XRhnSBz+mJvciIKKworIzogZmlsZWlvLmM6NTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogbmVk4SBzYSBvYm5vdmmdIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTc3OQorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLVZ5bWF6YW79LS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo1OTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogU2t1cGluYSBcIiVzXCIgbmVleGlzdHVqZSIKKworIzogZmlsZWlvLmM6NjA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogTmVwcu1zdHVwbv0gem5hayBwbyAqOiAlcyIKKworIzogZmlsZWlvLmM6NjA3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogVWRhbG9znSAlcyBuZWV4aXN0dWplIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYyMjQKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9tYXRpY2vpIHBy7WthenkgLS0tIgorCisjOiBmaWxlaW8uYzo2NDk1Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IEF1dG9tYXRpY2vpIHBy7Wthenkgc2EgbmVkYWr6IHNwdXN0aZ0gcHJlIFaKRVRLWSB1ZGFsb3OdaSIKKworIzogZmlsZWlvLmM6NjUxOAorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAijmlhZG5lIHZ5aG92dWr6Y2UgYXV0b21hdGlja+kgcHLta2F6eSIKKworIzogZmlsZWlvLmM6Njc5MAorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IHZub3JlbmlhIGF1dG9tYXRpY2vpaG8gcHLta2F6dSBz+iBwcu1saZogaGxib2vpIgorCisjOiBmaWxlaW8uYzo3MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgYXV0b21hdGlja+kgcHLta2F6eSBwcmUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3MDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiU3D6mp1hbSAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MTUzCisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJBdXRvbWF0aWNr/SBwcu1rYXogJXMiCisKKyM6IGZpbGVpby5jOjc2NzUKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBDaP1iYSB7LiIKKworIzogZmlsZWlvLmM6NzY3NworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IENo/WJhIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICKOaWFkbnkgeuFoeWIgbmVib2wgbuFqZGVu/SIKKworIzogZm9sZC5jOjU1MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBQb21vY291ICdmb2xkbWV0aG9kJyBzYSBuZWThIHZ5dHZvcmmdIHrhaHliIgorCisjOiBmb2xkLmM6NTU1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IFBvbW9jb3UgJ2ZvbGRtZXRob2QnIHNhIG5lZOEgb2RzdHLhbmmdIHrhaHliIgorCisjOiBnZXRjaGFyLmM6MjQ3Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBQcmlkYZ0gZG8gYnVmZmVydSBwcmUg6O10YW5pZSIKKworIzogZ2V0Y2hhci5jOjIxMDYKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJ67XZuZSBtYXBvdmFuaWUiCisKKyM6IGdldGNoYXIuYzoyOTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiBwcmUgJXMgdZ4gZ2xvYuFsbmEgc2tyYXRrYSBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjI5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBwcmUgJXMgdZ4gZ2xvYuFsbmUgbWFwb3ZhbmllIGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6MzA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiBwcmUgJXMgdZ4gc2tyYXRrYSBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjMwODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IHByZSAlcyB1niBtYXBvdmFuaWUgZXhpc3R1amUiCisKKyM6IGdldGNoYXIuYzozMTQ1Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICKOaWFkbmEgc2tyYXRrYSBuZWJvbGEgbuFqZGVu4SIKKworIzogZ2V0Y2hhci5jOjMxNDcKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICKOaWFkbmUgbWFwb3ZhbmllIG5lYm9sbyBu4WpkZW7pIgorCisjOiBnZXRjaGFyLmM6Mzk5MgorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDogbmVwcu1zdHVwbv0gbfNkIgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPG5lZOEgc2Egb3R2b3JpnT4gIgorCisjOiBndWlfYXRfZnMuYzoxMTE1CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAidmltX1NlbEZpbGU6IHDtc21vICVzIG5pZSBqZSBkb3N0dXBu6SIKKworIzogZ3VpX2F0X2ZzLmM6MjUzOAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiBuZWThIHNhIHZy4XRpnSBkbyBha3R14WxuZWhvIGFkcmVz4XJhIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJO4XpvdiBjZXN0eToiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjMKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTogbmVk4SBzYSB6aXN0aZ0gYWt0deFsbnkgYWRyZXPhciIKKworIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfbW90aWYuYzoxNjE5Cittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjLiAnQ2FuY2VsJyBidXR0b24KKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX2d0ay5jOjE3NDAgZ3VpX21vdGlmLmM6MTYxNCBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJacnWaaZ0iCisKKyM6IGd1aV9hdGhlbmEuYzoxOTU2IGd1aV9tb3RpZi5jOjE4NjcKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWaW0gZGlhbPNnIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlBy7XByYXZvayBwb3N1dm5laiBsaZp0eTogbmVk4SBzYSB6aXN0aZ0gZ2VvbWV0cmlhIG9icuF6a3UiCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IEJhbGxvb25FdmFsIG5lZOEgc2Egdnl0dm9yaZ0gc3By4XZvdSBhIHrhcm92ZfIgc3DkdG79bSB2b2xhbu1tIgorCisjOiBndWkuYzoyMDMKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogTmVk4SBzYSBzcHVzdGmdIEdVSSIKKworIzogZ3VpLmM6MzI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBOZWThIHNhIOjtdGGdIHogXCIlc1wiIgorCisjOiBndWkuYzo0NTMKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IHZvvmJhICdndWlmb250d2lkZScgamUgY2h5Ym5lIG5hc3RhdmVu4SIKKworIzogZ3VpLmM6MzY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IE5lZOEgc2EgYWxva292YZ0gZmFyYmEgJXMiCisKKyM6IGd1aS5jOjM5ODMKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiQ2h5YmEiCisKKyM6IGd1aV9ndGsuYzoxMTkwCittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiVmltIGRpYWzzZy4uIgorCisjOiBndWlfZ3RrLmM6MTU3NiBndWlfbW90aWYuYzoyNzU0Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSBO4WpznSBhIG5haHJhZGmdLi4uIgorCisjOiBndWlfZ3RrLmM6MTU4MSBndWlfbW90aWYuYzoyNzU2Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBO4WpznS4uLiIKKworIzogZ3VpX2d0ay5jOjE2MDQgZ3VpX21vdGlmLmM6Mjg3NAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIlZ5aL5hZGGdOiIKKworIzogZ3VpX2d0ay5jOjE2MjIgZ3VpX21vdGlmLmM6MjkwNgorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIk5vdv0gdGV4dDoiCisKKyMuIGV4YWN0IG1hdGNoIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY1NCBndWlfbW90aWYuYzozMDA4Cittc2dpZCAiTWF0Y2ggZXhhY3Qgd29yZCBvbmx5IgorbXNnc3RyICJIvmFkYZ0gbGVuIGNlbOkgc2xvduEiCisKKyM6IGd1aV9ndGsuYzoxNjY2IGd1aV9tb3RpZi5jOjI5NzYKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIlNtZXIiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MTY3OCBndWlfbW90aWYuYzoyOTg4Cittc2dpZCAiVXAiCittc2dzdHIgIkhvcmUiCisKKyM6IGd1aV9ndGsuYzoxNjgyIGd1aV9tb3RpZi5jOjI5OTYKK21zZ2lkICJEb3duIgorbXNnc3RyICJEb2x1IgorCisjLiAnRmluZCBOZXh0JyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNzA0IGd1aV9tb3RpZi5jOjI3NzgKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIk7hanOdIO9hbJppZSIKKworIy4gJ1JlcGxhY2UnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MjEgZ3VpX21vdGlmLmM6Mjc5NQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIk5haHJhZGmdIgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MzAgZ3VpX21vdGlmLmM6MjgwOAorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJOYWhyYWRpnSBWmmV0a28iCisKKyM6IGd1aV9ndGtfeDExLmM6MTA3OSBndWlfeDExLmM6MTE5OQorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IG5lZOEgc2Egb3R2b3JpnSBkaXNwbGVqIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0OTQgZ3VpX3gxMS5jOjE5OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDogTmV6buFtYSBzYWRhIHDtc2llbTogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjUxOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJW/WJlciBQ7XNtYSIKKworIzogZ3VpX2d0a194MTEuYzoyNzY0IGd1aV9tYWMuYzoyOTgyIGd1aV93NDguYzoxMTk3IGd1aV94MTEuYzoxODM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IE5lem7hbWUgcO1zbW86ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI3NzUgZ3VpX3gxMS5jOjE4NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBQ7XNtbyBcIiVzXCIgbmVt4SBwZXZu+iCa7XJrdSIKKworIzogZ3VpX2d0a194MTEuYzozNTgwIHVpLmM6MTk3MQorbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIlBvdZ5pdP0gQ1VUX0JVRkZFUjAgbmFtaWVzdG8gcHLhemRuZWhvIHb9YmVydSIKKworIzogZ3VpX21vdGlmLmM6MTYxMyBndWlfbW90aWYuYzoxNjE2Cittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0ZXIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTUKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiQWRyZXPhcmUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcKK21zZ2lkICJIZWxwIgorbXNnc3RyICJQb21vY27tayIKKworIzogZ3VpX21vdGlmLmM6MTYxOAorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJT+mJvcnkiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIlb9YmVyIgorCisjOiBndWlfbW90aWYuYzoyODIxCittc2dpZCAiVW5kbyIKK21zZ3N0ciAiU3DknSIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkUyMzU6IE5lbfSeZW0gbmHo7XRhnSBjaHlibv0gZm9udCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTogTmVk4SBzYSBwb3We7Z0gcO1zbW8gJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjY5Cittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlBvc2llbGFtIHNwcuF2dSBuYSB1a29u6GVuaWUgc3lub3Zza+lobyBwcm9jZXN1LlxuIgorCisjOiBndWlfdzMyLmM6ODM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICIiCisiRTI0MzogQXJndW1lbnQgbmllIGplIHBvZHBvcm92YW79OiBcbiIKKyItJXNcIjsgUG91nml0ZSBPTEUgdmVyeml1LiIKKworIy4gVE9ETzogTWF5IGJlIGNoYW5nZWQgdGhpcyBtZXNzYWdlCisjOiBndWlfdzMyLmM6MzQ5OSBndWlfdzMyLmM6MzUzMiBndWlfeDExLmM6MzI1MgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogQ2h5YmEgLS0gbmVk4Wr6IHNhIHByZejtdGGdIG96bmHob3ZhY2llIGThdGEhIgorCisjOiBndWlfdzQ4LmM6MjA4MQorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk7hanOdIHJlnWF6ZWMgKHBvdZ5pdGUgJ1xcXFwnIGFrIGNoZXRlIG7hanOdICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjEwNgorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk7hanOdIGEgTmFocmFkaZ0gKHBvdZ5pdGUgJ1xcXFwnIGFrIGNoY2V0ZSBu4WpznSAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE0MTkKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICIiCisiVmltIEU0NTg6IE5lZOEgc2EgYWxva292YZ0gcG9sb55rYSBtYXB5IGZhcmllYi4gTmlla3RvcukgZmFyYnkgbfSedSBieZ0gIgorIm5lc3By4XZuZSIKKworIzogZ3VpX3gxMS5jOjE5ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IENo/WJhIHDtc21vIHByZSBuYXNsZWR1avpjZSB6bmFrb3bpIHNhZHkgJXM6IgorCisjOiBndWlfeDExLmM6MjAzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiBO4XpvdiBzYWR5IHDtc2llbTogJXMiCisKKyM6IGd1aV94MTEuYzoyMDMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIlDtc21vICclcycgbmVt4SBwZXZub3Ugmu1ya3UiCisKKyM6IGd1aV94MTEuYzoyMDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogTuF6b3Ygc2FkeSBw7XNpZW06ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJQ7XNtbzA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJQ7XNtbzE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJQ7XNtbyVkIG5pZSBqZSBkdmFrcuF0IJppcpppZSBha28gcO1zbW8wXG4iCisKKyM6IGd1aV94MTEuYzoyMDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiiu1ya2EgcO1zbWEwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIortcmthIHDtc21hMTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCisKKyM6IGlmX2NzY29wZS5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjc1tjb3BlXSAlcyIKK21zZ3N0ciAiUG91nml0aWU6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzo2NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiUHJpZGGdIG5vdvogZGF0YWLhenUiCisKKyM6IGlmX2NzY29wZS5jOjY5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiSL5hZGFuaWUgdnpvcnUiCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIlpvYnJhemmdIHT6dG8gc3By4XZ1IgorCisjOiBpZl9jc2NvcGUuYzo3MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJVa29u6GmdIHNwb2plbmllIgorCisjOiBpZl9jc2NvcGUuYzo3NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlpub3Z1IGluaWNpYWxpem92YZ0gdppldGt5IHNwb2plbmlhIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIlpvYnJhemmdIHNwb2plbmlhIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIlThdG8gY3Njb3BlIHBy7WtheiBuZXBvZHBvcnVqZSByb3pkZb5vdmFuaWUgb2tuYS5cbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIlBvdZ5pdGllOiBjc3RhZyA8b2RzYWRlbmllPiIKKworIzogaWZfY3Njb3BlLmM6MTk5Cittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiB0YWcgbmVu4WpkZW79IgorCisjOiBpZl9jc2NvcGUuYzo0MDcgaWZfY3Njb3BlLmM6NDUxCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAic3RhdCglcykgY2h5YmE6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0NjAgaWZfY3Njb3BlLmM6NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiUHJpZGFu4SBjc2NvcGUgZGF0YWLhemEgJXMiCisKKyM6IGlmX2NzY29wZS5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIiVzIG5pZSBqZSBhbmkgYWRyZXPhcm9tIGFuaSBzcHLhdm5vdSBjc2NvcGUgZGF0YWLhem91IgorCisjOiBpZl9jc2NvcGUuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiY2h5YmEgcHJpIOjtdGFu7SBjc2NvcGUgc3BvamVuaWEgJWQiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJuZXpu4W15IHR5cCBjc2NvcGUgaL5hZGFuaWEiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJOZWRhavogc2Egdnl0dm9yaZ0gY3Njb3BlIHL6cnkiCisKKyM6IGlmX2NzY29wZS5jOjc0NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJzcHVzdGVuaWUgY3NfY3JlYXRlX2Nvbm5lY3Rpb24gemx5aGFsbyIKKworIzogaWZfY3Njb3BlLmM6NzU1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogdm9sYW5pZSBmZG9wZW4gcHJlIHRvX2ZwIHpseWhhbG8iCisKKyM6IGlmX2NzY29wZS5jOjc1NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHZvbGFuaWUgZmRvcGVuIHByZSBmcl9mcCB6bHloYWxvIgorCisjOiBpZl9jc2NvcGUuYzo3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIp5pYWRuZSBjc2NvcGUgc3BvamVuaWEiCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGNzY29wZSBovmFkYW5pZSAlcyB2byB2em9yZSAlcyBuZW5hmmxvIJ5pYWRudSB6aG9kdSIKKworIzogaWZfY3Njb3BlLmM6ODk5Cittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJwcu1rYXp5IGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpXG4iCittc2dzdHIgIiUtNXM6ICUtMzBzIChQb3WeaXRpZTogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJkdXBsaWNpdG7hIGNzY29wZSBkYXRhYuF6YSBuZWJvbGEgcHJpZGFu4SIKKworIzogaWZfY3Njb3BlLmM6OTgxCittc2dpZCAibWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgImRvc2lhaG51dP0gbWF4aW3hbG55IHBv6GV0IGNzY29wZSBzcG9qZW7tIgorCisjOiBpZl9jc2NvcGUuYzoxMTAyCittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiBjc2NvcGUgc3BvamVuaWUgbmVu4WpkZW7pIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY3Njb3BlIHNwb2plbmllICVzIG5lbuFqZGVu6SIKKworIzogaWZfY3Njb3BlLmM6MTE0MQorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uIGNsb3NlZCIKK21zZ3N0ciAiY3Njb3BlIHNwb2plbmllIHVrb27oZW7pIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgc3BvamVuaWUgJXMgdWtvbuhlbulcbiIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxMjkwCittc2dpZCAiZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIm9zdWRvduEgY2h5YmEgdiBjc19tYW5hZ2VfbWF0Y2hlcyIKKworIzogaWZfY3Njb3BlLmM6MTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJFMjYyOiBjaHliYSBwcmkg6O10YW7tIGNzY29wZSBzcG9qZW5pYSAlZCIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICJ2b2xhbmllIG1hbGxvYyB6bHloYWxvXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIHRhZzogJXNcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorbXNnaWQgIiAgICMgICBsaW5lIgorbXNnc3RyICIgICAjICAgcmlhZG9rIgorCisjOiBpZl9jc2NvcGUuYzoxNDYwCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICJu4XpvdiBz+mJvcnUvIGtvbnRleHQvIHJpYWRva1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNzE4Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIlaaZXRreSBjc2NvcGUgZGF0YWLhemUgcmVzZXRvdmFu6SIKKworIzogaWZfY3Njb3BlLmM6MTc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICKeaWFkbmUgY3Njb3BlIHNwb2plbmlhXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBu4XpvdiBkYXRhYuF6ZSAgICAgICAgICAgICAgICAgICAgICBwcmVkcG9uYSBjZXN0eVxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA8nmlhZG55PlxuIgorCisjOiBpZl9weXRob24uYzoyNTUgaWZfcnVieS5jOjI2MCBpZl90Y2wuYzoxOTUgbWJ5dGUuYzoyNjI5IG9zX3dpbjMyLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IE5lcG9kYXJpbG8gc2EgbmFocmGdIGtuaZ5uaWN1ICVzIgorCisjOiBpZl9weXRob24uYzoyNjcgaWZfcnVieS5jOjI3MiBpZl90Y2wuYzoyMDYgbWJ5dGUuYzoyNjQ1IG9zX3dpbjMyLmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiCittc2dzdHIgIkU0NDg6IE5lcG9kYXJpbG8gc2EgbmFocmGdIGZ1bmtjaXUga25pnm5pY2UgJXMiCisKKyM6IGlmX3B5dGhvbi5jOjM5MgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICJFMjYyOiBQcmVw4eh0ZSwgdGVudG8gcHLta2F6IGplIHZ5cG51dP0sIFB5dGhvbiBrbmmebmljYSBuZW30nmUgYnmdbmHo7XRhbuEuIgorCisjOiBpZl9weXRob24uYzo1OTIKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIm5lZOEgc2EgdnltYXphnSB2bGFzdG5vc50gT3V0cHV0T2JqZWN0IgorCisjOiBpZl9weXRob24uYzo1OTkKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgbXVz7SBieZ0ga2xhZG7pIGNlbOkg6O1zbG8iCisKKyM6IGlmX3B5dGhvbi5jOjYwNworbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJjaHlibuEgdmxhc3Rub3OdIgorCisjOiBpZl9weXRob24uYzo2NDYgaWZfcHl0aG9uLmM6NjYwCittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpIHZ5nmFkdWplIHpvem5hbSByZZ1hemNvdiIKKworIzogaWZfcHl0aG9uLmM6Nzg2Cittc2dpZCAiRTI2NDogUHl0aG9uOiBFcnJvciBpbml0aWFsaXNpbmcgSS9PIG9iamVjdHMiCittc2dzdHIgIkUyNjQ6IFB5dGhvbjogQ2h5YmEgcHJpIGluaWNpYWxpeuFjaWkgSS9PIG9iamVrdG92IgorCisjOiBpZl9weXRob24uYzo5NzEgaWZfdGNsLmM6MTQwMworbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAiY2h5Ym79IHb9cmF6IgorCisjOiBpZl9weXRob24uYzo5ODUgaWZfdGNsLmM6MTQwOAorbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAicG9kcG9yYSB2/XJhem92IGJvbGEgdnlwbnV04SBwcmkgcHJla2xhZGUgcHJvZ3JhbXUiCisKKyM6IGlmX3B5dGhvbi5jOjk5OAorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgInBva3VzIG8gb2RrYXogbmEgdnltYXphbv0gYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxMDEzIGlmX3B5dGhvbi5jOjEwNTQgaWZfcHl0aG9uLmM6MTExOCBpZl90Y2wuYzoxMjE1Cittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICLo7XNsbyByaWFka2EgbWltbyByb3pzYWgiCisKKyM6IGlmX3B5dGhvbi5jOjEyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8b2JqZWt0IGJ1ZmZlcnUgKHZ5bWF6YW79KSBuYSAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM0MiBpZl90Y2wuYzo4MzcKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAiY2h5Ym7pIG1lbm8gem5h6Gt5IgorCisjOiBpZl9weXRob24uYzoxNjE3Cittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIp5pYWRueSB0YWv9IGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTcwNQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInBva3VzIG8gb2RrYXogbmEgdnltYXphbukgb2tubyIKKworIzogaWZfcHl0aG9uLmM6MTc1MAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAidmxhc3Rub3OdIGliYSBwcmUg6O10YW5pZSIKKworIzogaWZfcHl0aG9uLmM6MTc2MworbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAidW1pZXN0bmVuaWUga3Vyem9ydSBtaW1vIGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTg0MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZWt0IG9rbmEgKHZ5bWF6YW79KSBuYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iamVrdCBva25hIChuZXpu4W15KSBuYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxva25vICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzMAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICKeaWFkbmUgdGFr6SBva25vIgorCisjOiBpZl9weXRob24uYzoyMTg3IGlmX3B5dGhvbi5jOjIyMjIgaWZfcHl0aG9uLmM6MjI3MiBpZl9weXRob24uYzoyMzM1CisjOiBpZl9weXRob24uYzoyNDU1IGlmX3B5dGhvbi5jOjI1MDcgaWZfdGNsLmM6Njg1IGlmX3RjbC5jOjczMCBpZl90Y2wuYzo4MDQKKyM6IGlmX3RjbC5jOjg3NCBpZl90Y2wuYzoxOTk5Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAibmVkYWr6IHNhIHVsb55pnSBzcOR0bukgaW5mb3Jt4WNpZSIKKworIzogaWZfcHl0aG9uLmM6MjE4OSBpZl9weXRob24uYzoyMjc5IGlmX3B5dGhvbi5jOjIzNDYKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIm5lZOEgc2EgdnltYXphnSByaWFkb2siCisKKyM6IGlmX3B5dGhvbi5jOjIyMjQgaWZfcHl0aG9uLmM6MjM2MiBpZl90Y2wuYzo2OTEgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIm5lZOEgc2EgbmFocmFkaZ0gcmlhZG9rIgorCisjOiBpZl9weXRob24uYzoyMzc4IGlmX3B5dGhvbi5jOjI0NTcgaWZfcHl0aG9uLmM6MjUxNQorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSB2bG+eaZ0gcmlhZG9rIgorCisjOiBpZl9weXRob24uYzoyNjE5Cittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICJyZZ1hemVjIG5lc21pZSBvYnNhaG92YZ0gem5ha3kgbm926WhvIHJpYWRrdSIKKworIzogaWZfcnVieS5jOjQwMQorbXNnaWQgIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkUyNjY6IFByZXDh6HRlLCB0ZW50byBwcu1rYXogamUgdnlwbnV0/SwgUnVieSBrbmmebmljYSBuZW30nmUgYnmdIG5h6O10YW7hLiIKKworIzogaWZfcnVieS5jOjQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBOZXpu4W15ICdsb25nam1wJyBzdGF2ICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIlByZXBu+p0gaW1wbGVtZW504WNpdS9kZWZpbu1jaXUiCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlVr4XphnSB64WtsYWRu+iB0cmllZHUiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJVa+F6YZ0gcHJlnWGeZW76IOhsZW5za/ogZnVua2NpdSIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAiT2Jub3ZpnSB6byBz+mJvcnUiCisKKyM6IGlmX3NuaWZmLmM6NzEKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIHByb2plY3QiCittc2dzdHIgIk9ibm92aZ0geiBwcm9qZWt0dSIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICJPYm5vdmmdIHpvIHaaZXRr/WNoIHByb2pla3RvdiIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICJPYm5vdmmdIgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIlVr4XphnSB6ZHJvaiIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJO4WpznSB6bmFrIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJQcmV6cmllnSB0cmllZHUiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiVWvhemGdIHRyaWVkdSB2IGhpZXJhcmNoaWkiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJVa+F6YZ0gdHJpZWR1IHYgb2JtZWR6ZW5laiBoaWVyYXJjaGlpIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgb2RrYXp1amUgbmEiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIG9ka+F6YW79IHoiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIG3hIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHBvdZ5pdP0iCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIlVr4XphnSBkb2t1bWVudOFjaXUiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiVnl0dm9yaZ0gZG9rdW1lbnThY2l1IHByZSIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiIgorIlpsaWhhbG8gcHJpcG9qZW5pZSBuYSBTTmlGRissIFByZXZlcnRlIHByb3N0cmVkaWUgKHNuaWZmZW1hY3Mgc2EgbXVz7SAiCisibmFjaOFkemGdIHYgJFBBVEgpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogQ2h5YmEgcG/oYXMg6O10YW5pYS4gT2Rwb2plbukiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBqZSBha3R14WxuZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAibmUiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJwcmlwb2plbv0iCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBOZXpu4W1hIFNOaUZGKyBwb55pYWRhdmthOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogQ2h5YmEgcHJpcG9qZW5pYSBuYSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgbmllIGplIHByaXBvamVu/SIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogTmllIGplIFNOaUZGKyBidWZmZXJvbSIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogQ2h5YmEgeuFwaXN1LiBPZHBvamVu6SIKKworIzogaWZfdGNsLmM6NDE5Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJjaHlibukg6O1zbG8gYnVmZmVydSIKKworIzogaWZfdGNsLmM6NDY1IGlmX3RjbC5jOjkzMiBpZl90Y2wuYzoxMTExCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibmllIGplIGWadGUgcG9kcG9yb3ZhbukiCisKKyM6IGlmX3RjbC5jOjUwMgorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICJuZXpu4W1hIHZvvmJhIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NQorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAibmVkYWr6IHNhIG5hc3RhdmmdIHJpYWRreSIKKworIzogaWZfdGNsLmM6ODQ2Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJ6bmHoa2EgbmllIGplIG5hc3RhdmVu4SIKKworIzogaWZfdGNsLmM6ODUyIGlmX3RjbC5jOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAicmlhZG9rICVkIHN05XBlYyAlZCIKKworIzogaWZfdGNsLmM6ODgyCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSB2bG+eaZ0vcHJpcG9qaZ0gcmlhZG9rIgorCisjOiBpZl90Y2wuYzoxMjY5Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIm5lem7hbXkgcHLtem5hazogIgorCisjOiBpZl90Y2wuYzoxMzM5Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIm5lem7hbWEgdmltTW+ebm9znSIKKworIzogaWZfdGNsLmM6MTQyNAorbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAicHJlcnWaZW5pZSB6IGts4XZlc25pY2UiCisKKyM6IGlmX3RjbC5jOjE0MjkKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgImNoeWJhIHZpbSIKKworIzogaWZfdGNsLmM6MTQ3MgorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAibmVk4SBzYSB2eXR2b3JpnSBwcu1rYXogYnVmZmVydS9va25hOiBvYmpla3QgdnltYXphbv0iCisKKyM6IGlmX3RjbC5jOjE1NDYKK21zZ2lkICJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIm5lZOEgc2EgemFyZWdpc3Ryb3ZhnSBwcu1rYXogc3DkdG7paG8gdm9sYW5pYTogYnVmZmVyL29rbm8gdZ4gYm9sIHZ5bWF6YW79IgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IHBvmmtvZGVu/SE/IE96buFtdGUsIHByb3PtbSwgdPp0byBjaHlidSBuYSAiCisidmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTY0Cittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAibmVk4SBzYSB6YXJlZ2lzdHJvdmGdIHBy7WtheiBzcOR0bulobyB2b2xhbmlhOiBvZGtheiBuYSBidWZmZXIvb2tubyBuZW7hamRlbv0iCisKKyM6IGlmX3RjbC5jOjE3MjUKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIlByZXDh6HRlLCB0ZW50byBwcu1rYXogamUgdnlwbnV0/SwgVGNsIGtuaZ5uaWNhIG5lbfSeZSBieZ0gbmHo7XRhbuEuIgorCisjOiBpZl90Y2wuYzoxODg3Cittc2dpZCAiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wgQ0hZQkE6IG7hdnJhdG92/SBr82QgbmllIGplIGNlbOkg6O1zbG8hPyBPem5hbXRlLCBwcmVz7W0sIHR1dG8gIgorImNoeWJ1IG5hIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNworbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSBwcmXo7XRhnSByaWFkb2siCisKKyM6IGlmX3hjbWRzcnYuYzoyMTMKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJOZW30nmVtIHphcmVnaXN0cm92YZ0gbWVubyBwcu1rYXpvdulobyBzZXJ2cmEiCisKKyM6IGlmX3hjbWRzcnYuYzo0MzQgb3NfbXN3aW4uYzoyMTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogbWVubyByZWdpc3Ryb3ZhbulobyBzZXJ2cmEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGlmX3hjbWRzcnYuYzo0NjMKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBDaHliYSBwb+hhcyBwcmVub3N1IHBy7WthenUgZG8gY2llvm926WhvIHByb2dyYW11IgorCisjOiBpZl94Y21kc3J2LmM6NzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJQb3We7XTpIGNoeWJu6SBpZCBzZXJ2cmE6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA3OQorbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorbXNnc3RyICJFMjQ5OiBuZW30nmVtIOjtdGGdIFZJTSByZWdpc3Ryb3b6IHZsYXN0bm9znSIKKworIzogaWZfeGNtZHNydi5jOjEwOTAKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IFZJTSByZWdpc3Ryb3bhIJ5pYWRvc50gamUgemxlIGZvcm11bG92YW7hLiAgVnltYXphbukhIgorCisjOiBtYWluLmM6NTMgb3B0aW9uLmM6MzE2MiBvcHRpb24uYzozMjY5Cittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIk5lem7hbWEgdm++YmEiCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJQcu1saZogbW5vaG8gdXByYXZvdmFj7WNoIGFyZ3VtZW50b3YiCisKKyM6IG1haW4uYzo1NworbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkNo/WJhIGFyZ3VtZW50IHBvIgorCisjOiBtYWluLmM6NTkKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAiQ2h5YnkgemEgdm++Ym91IgorCisjOiBtYWluLmM6NjEKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIgb3IgXCItYyBjb21tYW5kXCIgYXJndW1lbnRzIgorbXNnc3RyICJQcu1saZogbW5vaG8gXCIrcHLta2F6XCIg6GkgXCItYyBwcu1rYXpcIiBhcmd1bWVudG92IgorCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50IHByZSIKKworIzogbWFpbi5jOjQ1MAorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiVGVudG8gVmltIG5lYm9sIGtvbXBpbG92YW79IHMgcG9yb3Zu4XZhY+1taSBmdW5rY2lhbWkuIgorCisjOiBtYWluLmM6ODc1Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiUG9rdXMgbyBvcOR0b3Zu6SBvdHZvcmVuaWUgc2tyaXB0dTogXCIiCisKKyM6IG1haW4uYzo4NzkgbWFpbi5jOjg4NiBtYWluLmM6OTMwIG1lbWxpbmUuYzozNjczIG1lbWxpbmUuYzozNjc3CisjOiB2ZXJzaW9uLmM6ODkyIHZlcnNpb24uYzo4OTcgdmVyc2lvbi5jOjkwMiB2ZXJzaW9uLmM6OTA3IHZlcnNpb24uYzo5MTIKKyM6IHZlcnNpb24uYzo5MTcgdmVyc2lvbi5jOjkyMyB2ZXJzaW9uLmM6OTI3IHZlcnNpb24uYzo5MzEgdmVyc2lvbi5jOjkzNgorIzogdmVyc2lvbi5jOjk0MyB2ZXJzaW9uLmM6OTUxIHZlcnNpb24uYzo5NTcKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6ODg0Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJOZWThIHNhIG90dm9yaZ0gcHJlIHrhcGlzOiBcIiIKKworIzogbWFpbi5jOjkyOAorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTmVk4SBzYSBvdHZvcmmdIHByZSB2/XN0dXAgc2tyaXB0dTogXCIiCisKKyM6IG1haW4uYzoxMDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAicG/oZXQgc/pib3JvdiBwcmUg+nByYXZ1OiAlZFxuIgorCisjOiBtYWluLmM6MTExOAorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFyb3ZhbmllOiBW/XN0dXAgbmVzbWVydWplIG5hIHRlcm1pbuFsXG4iCisKKyM6IG1haW4uYzoxMTIwCittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFyb3ZhbmllOiBWc3R1cCBuZXBvY2jhZHphIHogdGVybWlu4Wx1XG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE5NQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyBwcu1rYXpvdv0gcmlhZG9rIgorCisjOiBtYWluLmM6MTIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogTmVk4SBzYSDo7XRhnSB6IFwiJXNcIiIKKworIzogbWFpbi5jOjIyMDUKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBvZHJvYm5lapppZSBpbmZvcm3hY2llIHrtc2vhdGUgcG9tb2NvdSBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIltz+mJvciAuLl0gLi4gICAgICAgICAgdXByYXZpnSBz+mJvcih5KSIKKworIzogbWFpbi5jOjIyMzkKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICAgICAgIOjtdGGdIHRleHQgeiCadGFuZGFyZG7paG8gdnN0dXB1IgorCisjOiBtYWluLmM6MjI0MAorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHRhZyAgICAgICAgICB1cHJhdmmdIHP6Ym9yIG5hIG1pZXN0ZSBkZWZpbu1jaWUgdGFndSIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtjaHlib3b9IHP6Ym9yXSAgdXByYXZpnSBz+mJvciBuYSBtaWVzdGUgdv1za3l0dSBwcnZlaiBjaHlieSIKKworIzogbWFpbi5jOjIyNTEKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisicG91nml0aWU6IgorCisjOiBtYWluLmM6MjI1NAorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICJ2aW0gW2FyZ3VtZW50eV0gIgorCisjOiBtYWluLmM6MjI1OAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICBhbGVibyIKKworIzogbWFpbi5jOjIyNjEKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiQXJndW1lbnR5OlxuIgorCisjOiBtYWluLmM6MjI2MgorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0TfSedSBuYXNsZWRvdmGdIGliYSBu4Xp2eSBz+mJvcm92IgorCisjOiBtYWluLmM6MjI2NAorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx0bmVwb2RhcmlsbyBzYSBleHBhbmRvdmGdIJ5vbO1rb3bpIHpuYWt5ICh3aWxkY2FyZHMpIgorCisjOiBtYWluLmM6MjI2NworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdHByaWhs4XNpnSBndmltIG5hIE9MRSIKKworIzogbWFpbi5jOjIyNjgKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdG9kaGzhc2mdIGd2aW0geiBPTEUiCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRzcHVzdGmdIHYgR1VJIG3zZGUgKHJvdm5ha+kgYWtvIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjIyNzIKK21zZ2lkICItZlx0XHRcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mXHRcdFx0UG9wcmVkaWU6IHByaSBzcHVzdGVu7SBHVUkgc2EgbmVvZGRlbO0gb2Qgc2hlbGx1IgorCisjOiBtYWluLmM6MjI3NAorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIG3zZCAocm92bmFr6SBha28gXCJ2aVwiKSIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeCBt82QgKHJvdm5ha+kgYWtvIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjc2Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdFRpY2j9IChk4XZrb3b9KSBt82QgKGliYSBwcmUgXCJleFwiKSIKKworIzogbWFpbi5jOjIyNzgKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx0UG9yb3Zu4XZhY+0gbfNkIChyb3ZuYWvpIGFrbyBcInZpbWRpZmZcIikiCisKKyM6IG1haW4uYzoyMjgwCittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHRKZWRub2R1Y2j9IG3zZCAocm92bmFr6SBha28gXCJldmltXCIsIG1vZGVsZXNzKSIKKworIzogbWFpbi5jOjIyODEKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdE3zZCBpYmFfcHJlX+jtdGFuaWUgKGFrbyBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyMjgyCittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdE9ibWVkemVu/SBt82QgKHJvdm5ha+kgYWtvIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjIyODMKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdFptZW55ICh1a2xhZGFuaWUgc/pib3JvdikgemFr4XphbukiCisKKyM6IG1haW4uYzoyMjg0Cittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0Wm1lbnkgdiB0ZXh0ZSBuaWUgc/ogcG92b2xlbukiCisKKyM6IG1haW4uYzoyMjg1Cittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHRCaW7hcm55IG3zZCIKKworIzogbWFpbi5jOjIyODcKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwIG3zZCIKKworIzogbWFpbi5jOjIyODkKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdEtvbXBhdGFiaWxu/SBzIFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0S29tcGF0aWJpbGl0YSBzIFZpIHZ5cG51dOE6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjI5MQorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdNpyb3Zl8iB2/XBpc3UgaGzhmm9rIgorCisjOiBtYWluLmM6MjI5MgorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx0TGFkaWFjaSBt82QiCisKKyM6IG1haW4uYzoyMjkzCittc2dpZCAiLW5cdFx0XHRObyBzd2FwIGZpbGUsIHVzZSBtZW1vcnkgb25seSIKK21zZ3N0ciAiLW5cdFx0XHROZWJ1ZGUgdnl0duFyYZ0gb2RrbGFkYWPtIHP6Ym9yLCBidWRlIHBvdZ7tdmGdIGliYSBwYW3knSIKKworIzogbWFpbi5jOjIyOTQKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRWeXDtmmUgem96bmFtIG9ka2xhZGFj7WNoIHP6Ym9yb3YgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjk1Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIG7hem92IHP6Ym9ydVx0T2Jub3btIHByZXJ1mmVu6SBzZWRlbmllIgorCisjOiBtYWluLmM6MjI5NgorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRSb3ZuYWvpIGFrbyAtciIKKworIzogbWFpbi5jOjIyOTgKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0TmVidWRlIHBvdZ7tdmGdIG5ld2NsaSBwcmUgb3R2b3JlbmllIG9rbmEiCisKKyM6IG1haW4uYzoyMjk5Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8emFyaWFkZW5pZT5cdFx0UG91nmmdIDx6YXJpYWRlbmllPiBwcmUgSS9PIgorCisjOiBtYWluLmM6MjMwMgorbXNnaWQgIi1IXHRcdFx0c3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0bmEgc3B1c3Rlbu1lIHYgaGVicmVqc2tvbSBt82RlIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIi1GXHRcdFx0c3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0XHRuYSBzcHVzdGVu7WUgdm8gRmFyc2kgbfNkZSIKKworIzogbWFpbi5jOjIzMDcKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA8dGVybWlu4Ww+XHROYXN0YXbtIHR5cCB0ZXJtaW7hbHUgbmEgPHRlcm1pbuFsPiIKKworIzogbWFpbi5jOjIzMDgKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRQb3WeaWplIDx2aW1yYz4gbmFtaWVzdG8gYWvpaG9rb752ZWsgLnZpbXJjIgorCisjOiBtYWluLmM6MjMxMAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRQb3WeaWplIDxndmltcmM+IG5hbWllc3RvIGFr6Whva2++dmVrIC5ndmltcmMiCisKKyM6IG1haW4uYzoyMzEyCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdE5lbmFocuEgJ3BsdWdpbicgc2tyaXB0eSIKKworIzogbWFpbi5jOjIzMTMKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHRPdHZvcu0gTiBva2llbiAoaW1wbGljaXRuZSBqZWRubyBwcmUga2GeZP0gc/pib3IpIgorCisjOiBtYWluLmM6MjMxNAorbXNnaWQgIi1PW05dXHRcdGxpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdGFrbyAtbyBhbGUgcm96ZGVs7SB2ZXJ0aWvhbG5lIgorCisjOiBtYWluLmM6MjMxNQorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdE5hc3Rhdu0ga3Vyem9yIG5hIGtvbmllYyBz+mJvcnUiCisKKyM6IG1haW4uYzoyMzE2Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxyaWFkb2s+XHRcdE5hc3Rhdu0ga3Vyem9yIG5hIDxyaWFkb2s+IgorCisjOiBtYWluLmM6MjMxOAorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxwcu1rYXo+XHRcdFZ5a29u4SA8cHLta2F6PiBwcmVkIG5haHJhbu1tIHZpbXJjIHP6Ym9ydSIKKworIzogbWFpbi5jOjIzMjAKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPHBy7Wthej5cdFx0UG8gbmFocmFu7SBwcnbpaG8gc/pib3J1IHZ5a29u4SA8cHLta2F6PiIKKworIzogbWFpbi5jOjIzMjEKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZWRlbmllPlx0XHRQbyBuYWhy4W7tIHBydulobyBz+mJvcnUgdnlrb27hIHBy7WthenkgdiBz+mJvcmUgPHNlZGVuaWU+IgorCisjOiBtYWluLmM6MjMyMgorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDxza3JpcHQ+XHRcdE5h6O10YSBwcu1rYXp5IG5vcm3hbG5laG8gbfNkdSB6byA8c2tyaXB0dT4iCisKKyM6IG1haW4uYzoyMzIzCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNrcmlwdD5cdFx0UHJpcG9q7SB2mmV0a3kgbmFw7XNhbukgcHLta2F6eSBkbyBz+mJvcnUgPHNrcmlwdD4iCisKKyM6IG1haW4uYzoyMzI0Cittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2tyaXB0Plx0XHRVbG+e7SB2mmV0a3kgbmFw7XNhbukgcHLta2F6eSBkbyBz+mJvcnUgPHNrcmlwdD4iCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHTacHJhdmEgemGaaWZyb3Zhbv1jaCBz+mJvcm92IgorCisjOiBtYWluLmM6MjMzMAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxlaj5cdFNwdXN07SB2aW0gbmEgPGRpc3BsZWo+IgorCisjOiBtYWluLmM6MjMzMgorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0TmVwcmlwb2rtIHNhIGsgWCBzZXJ2ZXJ1IgorCisjOiBtYWluLmM6MjMzNAorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdE90dm9y7SBWaW0gdm76dHJpIGlu6WhvIEdUSyBwcm9ncmFtdS4iCisKKyM6IG1haW4uYzoyMzM4Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUgPHP6Ym9yeT5cdFVwcmF2aZ0gPHP6Ym9yeT4gbmEgVmltIHNlcnZyaSBhIHNrb27oaZ0iCisKKyM6IG1haW4uYzoyMzM5Cittc2dpZCAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8c/pib3J5Plx0QWtvIC0tcmVtb3RlIGFsZSDoYWvhIG5hIHP6Ym9yeSBwcmUgdWtvbuhlbmllIPpwcmF2IgorCisjOiBtYWluLmM6MjM0MAorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPHZvvmJ5Plx0T2RvmmxlIDx2b75ieT4gbmEgVmltIHNlcnZlciBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICItLXJlbW90ZS1leHByIDx2/XJhej5cdFNwdXN0aSA8dv1yYXo+IG5hIHNlcnZyaSBhIHZ5dGxh6O0gdv1zbGVkb2siCisKKyM6IG1haW4uYzoyMzQyCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRWeXDtmmUgem96bmFtIG1pZW4gZG9zdHVwbv1jaCBWaW0gc2VydnJvdiBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNDMKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8buF6b3Y+XHRPZG+abGUgbmEgVmltIHNlcnZlciA8buF6b3Y+IgorCisjOiBtYWluLmM6MjM0NgorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHRQb3WeaWplIDx2aW1pbmZvPiBuYW1pZXN0byBha+lob2tvvnZlayAudmltaW5mbyIKKworIzogbWFpbi5jOjIzNDgKK21zZ2lkICItaFx0XHRcdHByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oXHRcdFx0Vnlw7ZplIHT6dG8gbuFwb3ZlZHUgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMzQ5Cittc2dpZCAiLS12ZXJzaW9uXHRcdHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHR2eXDtmmUgaW5mb3Jt4WNpZSBvIHZlcnppaSBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKE1vdGlmIHZlcnppYSk6XG4iCisKKyM6IG1haW4uYzoyMzU2Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50eSBwcmUgZ3ZpbSAoQXRoZW5hIHZlcnppYSk6XG4iCisKKyM6IG1haW4uYzoyMzU5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsZWo+XHRTcHVzdO0gdmltIG5hIDxkaXNwbGVqPiIKKworIzogbWFpbi5jOjIzNjAKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0U3B1c3TtIHZpbSBtaW5pbWFsaXpvdmFu6SIKKworIzogbWFpbi5jOjIzNjIKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8buF6b3Y+XHRcdFBvdZ5pamUgcmVzb3VyY2UgYWtvIGJ5IHZpbSBtYWwgPG7hem92PiIKKworIzogbWFpbi5jOjIzNjMKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgIChuaWUgamUgaW1wbGVtZW50b3ZhbukpXG4iCisKKyM6IG1haW4uYzoyMzY1Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8ZmFyYmE+XHROYXN0YXbtIHNhIDxmYXJiYT4gcG96YWRpYSAodGllniAtYmcpIgorCisjOiBtYWluLmM6MjM2NgorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGZhcmJhPlx0TmFzdGF27SBzYSA8ZmFyYmE+IHBvcHJlZGlhICh0aWWeIC1mZykiCisKKyM6IG1haW4uYzoyMzY3IG1haW4uYzoyMzg3Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8cO1zbW8+XHRcdE5hc3Rhdu0gPHDtc21vPiBub3Jt4WxuZWhvIHRleHR1ICh0aWWeIC1mbikiCisKKyM6IG1haW4uYzoyMzY4Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHByZSB6dv1yYXpuZW79IHRleHQiCisKKyM6IG1haW4uYzoyMzY5Cittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHByZSBrdXJ67XZ1IgorCisjOiBtYWluLmM6MjM3MCBtYWluLmM6MjM4OAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tZXRyaWU+XHROYXN0YXbtIHNhIDxnZW9tZXRyaWE+ICh0aWWeIC1nZW9tKSIKKworIzogbWFpbi5jOjIzNzEKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8mu1ya2E+XHROYXN0YXbtIDya7XJrdT4gb2tyYWpvdiAodGllniAtYncpIgorCisjOiBtYWluLmM6MjM3MgorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiLXNjcm9sbGJhcndpZHRoIDya7XJrYT4gIE5hc3Rhdu0gPJrtcmt1PiBwb3N1dm5laiBsaZp0eSAodGllniAtc3cpIgorCisjOiBtYWluLmM6MjM3NAorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDx2/ZprYT5cdE5hc3Rhdu0gPHb9mmt1PiBwb251a3kgKHRpZZ4gLW1oKSIKKworIzogbWFpbi5jOjIzNzYgbWFpbi5jOjIzODkKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0UG91nmlqZSByZXZlcnpu6SBmYXJieSAodGllniAtcnYpIgorCisjOiBtYWluLmM6MjM3NworbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHROZXBvdZ5pamUgcmV2ZXJ6bukgZmFyYnkgKHRpZZ4gK3J2KSIKKworIzogbWFpbi5jOjIzNzgKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZXNvdXJjZT5cdE5hc3Rhdu0gemFkYW79IDxyZXNvdXJjZT4iCisKKyM6IG1haW4uYzoyMzgxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKFJJU0MgT1MgdmVyemlhKTpcbiIKKworIzogbWFpbi5jOjIzODIKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8cG/oZXQ+XHQ8cG/oZXQ+IHN05XBjb3YgbmEgb2tubyIKKworIzogbWFpbi5jOjIzODMKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPHBv6GV0Plx0PHBv6GV0PiByaWFka292IG5hIG9rbm8iCisKKyM6IG1haW4uYzoyMzg2Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKEdUSysgdmVyemlhKTpcbiIKKworIzogbWFpbi5jOjIzOTAKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxlaj5cdHNwdXN07SB2aW0gbmEgPGRpc3BsZWo+ICh0aWWeIC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyMzkyCittc2dpZCAiLS1oZWxwXHRcdFNob3cgR25vbWUgYXJndW1lbnRzIgorbXNnc3RyICItLWhlbHBcdFx0Vnlw7ZplIEdub21lIGFyZ3VtZW50eSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI2MzQKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJPZG9zbGFuaWUgemx5aGFsby5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNjM5Cittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIiIKKyJcbiIKKyJPZG9zbGFuaWUgemx5aGFsby4gUG9r+pphbSBzYSBzcHVzdGmdIGxva+FsbmVcbiIKKworIzogbWFpbi5jOjI2NzIgbWFpbi5jOjI2OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCB1cHJhdmVu/WNoIHP6Ym9yb3YgeiAlZCIKKworIzogbWFpbi5jOjI3MTYKK21zZ2lkICJTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICJPZG9zbGFuaWUgdv1yYXp1IHpseWhhbG8uXG4iCisKKyM6IG1hcmsuYzo2NjAKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIk5pZSBz+iBuYXN0YXZlbukgnmlhZG5lIHpuYehreSIKKworIzogbWFyay5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6XCIlc1wiIG5ldnlob3Z1avognmlhZG5lIHpuYehreSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjczCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorInpuYehrYSByaWFkb2sgIHN05XBlYyBz+mJvci90ZXh0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MTEKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBza29rIHJpYWRvayBzdOVwZWMgc/pib3IvdGV4dCIKKworIzogbWFyay5jOjEwNzMKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBT+mJvcm926SB6bmHoa3k6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTEwOAorbXNnaWQgIiIKKyJcbiIKKyIjIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBab3puYW0gc2tva292ICh6YejtbmFq+mNpIG5ham5vdppvdSBwb2xvnmtvdSk6XG4iCisKKyM6IG1hcmsuYzoxMjAzCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBIaXN083JpYSB6bmHoaWVrIHYgc/pib3JvY2ggKHph6O1uYWr6Y2kgbmFqbm92mm91IHBvbG+ea291KTpcbiIKKworIzogbWFyay5jOjEyODYKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiQ2j9YmEgJz4nIgorCisjOiBtYnl0ZS5jOjM5NQorbXNnaWQgIk5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJDaHlibuEga/Nkb3bhIHN0cuFua2EiCisKKyM6IG1ieXRlLmM6MzEwMworbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBOZWRq+iBzYSBuYXN0YXZpnSBJQyBob2Rub3R5IgorCisjOiBtYnl0ZS5jOjMyNTUKK21zZ2lkICJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiCittc2dzdHIgIkUyODU6IE5lcG9kYXJpbG8gc2Egdnl0dm9yaZ0gdnN0dXBu/SBrb250ZXh0IgorCisjOiBtYnl0ZS5jOjM0MDIKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IE5lcG9kYXJpbG8gc2Egb3R2b3JpnSB2c3R1cG76IG1ldPNkdSIKKworIzogbWJ5dGUuYzozNDEzCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBWYXJvdmFuaWU6IGxpa3ZpZGHobukgc3DkdG7pIHZvbGFuaWUgc2EgbmVk4SBuYXN0YXZpnSBuYSBJTSIKKworIzogbWJ5dGUuYzozNDE5Cittc2dpZCAiRTI4ODogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgc3R5bGUiCittc2dzdHIgIkUyODg6IHZzdHVwbuEgbWV082RhIG5lcG9kcG9ydWplIJ5pYWRueSCadP1sIgorCisjOiBtYnl0ZS5jOjM0NzYKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogdnN0dXBu4SBtZXTzZGEgbmVwb2Rwb3J1amUgbfRqICdwcmVlZGl0JyB0eXAiCisKKyM6IG1ieXRlLmM6MzU1MAorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogTmFkYm9kb3b9IJp0/WwgdnmeYWR1amUgZm9udHNldCIKKworIzogbWJ5dGUuYzozNTc4Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBN4XRlIEdUSysgdmVyeml1IHN0YXKaaXUgbmWeIDEuMi4zLiBTdGF2b3bhIHBsb2NoYSB2eXBudXThLiIKKworIzogbWJ5dGUuYzozODQzCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogU2VydmVyIHZzdHVwbv1jaCBtZXTzZCBuZWJlnu0iCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogYmxvayBuZWJvbCB6YW1rbnV0/SIKKworIzogbWVtZmlsZS5jOjk4OQorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IENoeWJhIHBvc3VudSBwcmkg6O10YW7tIG9ka2xhZGFjaWVobyBz+mJvcnUiCisKKyM6IG1lbWZpbGUuYzo5OTQKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogQ2h5YmEgcHJpIOjtdGFu7SBvZGtsYWRhY2llaG8gc/pib3J1IgorCisjOiBtZW1maWxlLmM6MTA0NgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBDaHliYSBwb3N1bnUgcHJpIHVrbGFkYW7tIGRvIG9ka2xhZGFjaWVobyBz+mJvcnUiCisKKyM6IG1lbWZpbGUuYzoxMDY0Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiBDaHliYSBwcmkgdWtsYWRhbu0gZG8gb2RrbGFkYWNpZWhvIHP6Ym9ydSIKKworIzogbWVtZmlsZS5jOjEyNjEKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IE9ka2xhZGFj7SBz+mJvciB1niBleGlzdHVqZSEiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBOZWThIHNhIHrtc2thnSBibG9rIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogTmVk4SBzYSB67XNrYZ0gYmxvayAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IE5lZOEgc2Egeu1za2GdIGJsb2sgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IFVwcywgb2RrbGFkYWPtIHP6Ym9yIGJvbCBzdHJhdGVu/SEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBOZWThIHNhIHByZW1lbm92YZ0gb2RrbGFkYWPtIHP6Ym9yIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiBOZWThIHNhIG90dm9yaZ0gb2RrbGFkYWPtIHP6Ym9yIHByZSBcIiVzXCIsIG9wcmF2YSBuaWUgamUgbmVtb55u4SIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogbmVk4SBzYSB67XNrYZ0gYmxvayAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTogT2RrbGFkYWPtIHP6Ym9yIHByZSAlcyBuZWJvbCBu4WpkZW79IgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiWmFkYWp0ZSDo7XNsbyBvZGtsYWRhY2llaG8gc/pib3J1LCBrdG9y/SBzYSBt4SBwb3WeaXQgKDAgcHJlIHVrb27oZW5pZSk6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogTmVk4SBzYSBvdHZvcmmdICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiTmVk4SBzYSDo7XRhnSBibG9rIDAgeiAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiTW+ebm8gbmVkb5psbyBrIJ5pYWRueW0gem1lbuFtLCBhbGVibyBWaW0gbmVha3R1YWxpem92YWwgb2RrbGFkYWPtIHP6Ym9yLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5lZOEgc2EgcG91nmmdIHMgdG91dG8gdmVyemlvdSBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJQb3WeaXRlIFZpbSB2ZXJ6aXUgMy4wLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIHNhIG5lemThIGJ5nSBvZGtsYWRhY+1tIHP6Ym9yb20gVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBuZWThIHNhIHBvdZ7tnSBuYSB0b210byBwb+jtdGHoaS5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAiU/pib3IgYm9sIHZ5dHZvcmVu/SAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorImFsZWJvIGJvbCBz+mJvciBwb5prb2Rlbv0uIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlBvdZ7tduFtIG9ka2xhZGFj7SBz+mJvciBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIlD0dm9kbv0gc/pib3IgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTM0Cittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IFZhcm92YW5pZTogUPR2b2Ru/SBz+mJvciBtb2hsIGJ5nSB6bWVuZW79IgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogTmVk4SBzYSDo7XRhnSBibG9rIDEgeiAlcyIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0jdQkEgTU5PSE8gUklBREtPViIKKworIzogbWVtbGluZS5jOjk5NQorbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P0NIWUJO3SBQT8hFVCBSSUFES09WIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9QUsFaRE5ZIEJMT0siCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0jdQkFK2kNFIFJJQURLWSIKKworIzogbWVtbGluZS5jOjEwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IElEIGJsb2t1IDEgamUgY2h5Ym7pIChqZSAlcyBvZGtsYWRhY+1tIHP6Ym9yb20/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9DSN1CQSBCTE9LIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbfSedSBieZ0gcmlhZGt5IHBvbWllmmFu6SIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbfSedSBieZ0gdmxvnmVu6S92eW1hemFu6SByaWFka3kiCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9LT05JRUMiCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IE9ibm92YSBwcmVydZplbuEiCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiRTMxMjogRXJyb3JzIGRldGVjdGVkIHdoaWxlIHJlY292ZXJpbmc7IGxvb2sgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPz8/IgorbXNnc3RyICJFMzEyOiBWIHByaWViZWh1IG9ibm92eSBkb5psbyBrIGNoeWLhbTsgc2tvbnRyb2x1anRlIHJpYWRreSB6YejtbmFq+mNlIG5hID8/PyIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIk9ibm92YSBkb2tvbuhlbuEuIFNrb250cm9sdWp0ZSwg6GkgamUgdppldGtvIHYgcG9yaWFka3UuIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihaduGedGUgdWxvnmVuaWUgdG9ob3RvIHP6Ym9ydSBwb2QgaW79bSBtZW5vbVxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICJhIHBvbW9jb3UgcHJvZ3JhbXUgZGlmZiB6aXN0aXRlIHptZW55IG9wcm90aSBw9HZvZG7pbXUgc/pib3J1LilcbiIKKworIzogbWVtbGluZS5jOjExNTEKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiUG90b20gdnltYZ50ZSBvZGtsYWRhY+0gc/pib3IuXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIwNworbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJO4WpkZW7pIG9ka2xhZGFjaWUgc/pib3J5OiIKKworIzogbWVtbGluZS5jOjEzODUKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgViBha3R14Wxub20gYWRyZXPhcmk6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzg3Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIFNvIHphZGFu/W0gbWVub206XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgViBhZHJlc+FyaSAiCisKKyM6IG1lbWxpbmUuYzoxNDA5Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSCeaWFkbmUgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgIHZsYXN0bu1rOiAiCisKKyM6IG1lbWxpbmUuYzoxNDgzCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGThdHVtIHZ5dHZvcmVuaWE6ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM2ODAKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGThdHVtIHZ5dHZvcmVuaWE6ICIKKworIzogbWVtbGluZS5jOjE1MDMKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbb2QgVmltIHZlcnppZSAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUwNworbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW25ldnlwYWThIGFrbyBvZGtsYWRhY+0gc/pib3IgVmltXSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgbuF6b3Ygc/pib3J1OiAiCisKKyM6IG1lbWxpbmUuYzoxNTIzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIGThdHVtIHptZW55OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiWUVTIgorbXNnc3RyICLBTk8iCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAibm8iCittc2dzdHIgIm5pZSIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICB1nu12YXRlvnNr6SBtZW5vOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM1Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgICAgICAgIG7hem92IHBv6O10YehhOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgbuF6b3YgcG/o7XRh6GE6ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIElEIHByb2Nlc3UgOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChzdOFsZSBha3Ttdm55KSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuZXBvdZ5pdGW+bukgcyB0b3V0byB2ZXJ6aW91IFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTY0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW25lcG91nml0ZWxu6SBuYSB0b210byBwb+jtdGHoaV0iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW25lZOEgc2EgcHJl6O10YZ1dIgorCisjOiBtZW1saW5lLmM6MTU3MworbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW25lZOEgc2Egb3R2b3JpnV0iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IE5lZOEgc2EgemFjaG92YZ0gLSBvZGtsYWRhY+0gc/pib3IgbmVleGlzdHVqZS4iCisKKyM6IG1lbWxpbmUuYzoxODE2Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIlP6Ym9yIHphY2hvdmFu/SIKKworIzogbWVtbGluZS5jOjE4MTgKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6IFVjaG92YW5pZSBzYSBuZXBvZGFyaWxvIgorCisjOiBtZW1saW5lLmM6MTg4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IGNoeWJu6SDo7XNsbyByaWFka3U6ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiBuZWThIHNhIG7hanOdIHJpYWRvayAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzAzCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthem92YXRlvmEgbmEgYmxvayAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGJ5IG1hbG8gbWGdIGhvZG5vdHUgMyIKKworIzogbWVtbGluZS5jOjI0NDUKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IEFrdHVhbGl6b3Zhbv1jaCBwcu1saZogdmW+YSBibG9rb3Y/IgorCisjOiBtZW1saW5lLmM6MjYwMgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzogY2h5Ym7pIGlkIHVrYXpvdmF0Zb5hIG5hIGJsb2sgNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJ2eW1hemFu/SBibG9rIDE/IgorCisjOiBtZW1saW5lLmM6MjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTmVk4SBzYSBu4WpznSByaWFkb2sgJWxkIgorCisjOiBtZW1saW5lLmM6MzA3MgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IGNoeWJu6SBpZCB1a2F6b3ZhdGW+YSBuYSBibG9rIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCBt4SBudWxvdvogaG9kbm90dSIKKworIzogbWVtbGluZS5jOjMxMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiDo7XNsbyByaWFka3UgamUgbWltbyByb3pzYWg6ICVsZCAoemEga29uY29tKSIKKworIzogbWVtbGluZS5jOjMxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IGNoeWJu/SBwb+hldCByaWFka292IHYgYmxva3UgJWxkIgorCisjOiBtZW1saW5lLmM6MzE3MAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICJO4XJhc3QgdmW+a29zdGkgeuFzb2Ju7Wt1IgorCisjOiBtZW1saW5lLmM6MzIxNgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogY2h5Ym79IGlkIHVrYXpvdmF0Zb5hIG5hIGJsb2sgMiIKKworIzogbWVtbGluZS5jOjM2NzAKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IFBPWk9SIgorCisjOiBtZW1saW5lLmM6MzY3MQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIk7hamRlbv0gb2RrbGFkYWPtIHP6Ym9yIHMgbWVub20gXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJQcmkgb3R24XJhbu0gc/pib3J1XCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIE5PVorNIGFrbyBvZGtsYWRhY+0gc/pib3IhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgU/pib3IgbfSeZSBieZ0gdXByYXZvdmFu/SBpbv1tIHByb2dyYW1vbS5cbiIKKyIgICAgQWsgamUgdG9tdSB0YWssIHBvdG9tIHNpIGRhanRlIHBvem9yLCBhYnkgc3RlIHBvIHVsb55lbu0gem1pZW5cbiIKKyIgICAgbmVtYWxpIGR2ZSBy9HpuZSB2ZXJ6aWUgdG9obyBpc3TpaG8gc/pib3J1LlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBVa29u6Gl0ZSBwcm9ncmFtLCBhbGVibyBvcGF0cm5uZSBwb2tyYeh1anRlIHYg+nByYXbhY2guXG4iCisKKyM6IG1lbWxpbmUuYzozNjkwCittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpINpwcmF2YSB0b2hvdG8gc/pib3J1IGJvbGEgcHJlcnWaZW7hIG5lb+hha+F2YW79bSB1a29u6GVu7W0gcHJvZ3JhbXUuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkxCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgQWsgamUgdG9tdSB0YWssIHBvdG9tIHBvdZ5pdGUgXCI6cmVjb3ZlclwiIGFsZWJvIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBwcmUgb2Jub3ZlbmllIHptaWVuICh2aXogXCI6aGVscCByZWNvdmVyeSlcIi5cbiIKKworIzogbWVtbGluZS5jOjM2OTQKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgUG9raWG+IHN0ZSB0YWsgdZ4gdXJvYmlsaSwgdGFrIHZ5bWGedGUgb2RrbGFkYWPtIHP6Ym9yIFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBhIHThdG8gc3By4XZhIHNhIHWeIG5lYnVkZSBvYmphdm92YZ0uXG4iCisKKyM6IG1lbWxpbmUuYzozNzEwIG1lbWxpbmUuYzozNzE0Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICJPZGtsYWRhY+0gc/pib3IgXCIiCisKKyM6IG1lbWxpbmUuYzozNzExIG1lbWxpbmUuYzozNzE3Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiB1niBleGlzdHVqZSEiCisKKyM6IG1lbWxpbmUuYzozNzIwCittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSBQT1pPUiIKKworIzogbWVtbGluZS5jOjM3MjIKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJPZGtsYWRhY+0gc/pib3IgdZ4gZXhpc3R1amUhIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisiJk90dm9yaZ0gaWJhIHByZSDo7XRhbmllXG4iCisiJlBva3Jh6G92YZ0gdiD6cHJhduFjaFxuIgorIk8mYm5vdmmdIHP6Ym9yXG4iCisiJktvbmllYyIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImT3R2b3JpnSBpYmEgcHJlIOjtdGFuaWVcbiIKKyImUG9rcmHob3ZhdCB2IPpwcmF24WNoXG4iCisiTyZibm92aZ0gc/pib3JcbiIKKyImS29uaWVjXG4iCisiJlptYXphnSIKKworIzogbWVtbGluZS5jOjM3ODEKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiBQcu1saZogbW5vaG8gb2RrbGFkYWPtY2ggc/pib3JvdiIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IMhhc50gY2VzdHkgayBwcmVkbWV0dSBwb251a3kgbmllIGplIHBvZHBvbnVrb3UiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBQb251a2EgZXhpc3R1amUgaWJhIHYgaW5vbSBt82RlIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogUG9udWthIHRvaG90byBtZW5hIG5lZXhpc3R1amUiCisKKyM6IG1lbnUuYzo1MDkKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiBDZXN0YSBwb251a3kgbmVzbWllIHZpZXOdIGRvIHBvZHBvbnVreSIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBQb2xvnmt5IHBvbnVreSBzYSBuZWRq+iBwcmlk4XZhnSBwcmlhbW8gbmEgbGmadHUiCisKKyM6IG1lbnUuYzo1NTQKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6IE9kZGW+b3Zh6CBuZXNtaWUgYnmdIOhhc51vdSBjZXN0eSBwb251a3kiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNzAKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBQb251a3kgLS0tIgorCisjOiBtZW51LmM6MTk4NworbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAiT2R0cmhu+p0gdHV0byBwb251a3UiCisKKyM6IG1lbnUuYzoyMDUyCittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogQ2VzdGEgcG9udWt5IG11c+0gdmllc50gayBwb2xvnmtlIHBvbnVreSIKKworIzogbWVudS5jOjIwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBWem9yIG5lbuFqZGVu/TogJXMiCisKKyM6IG1lbnUuYzoyMTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IFYgJXMgbfNkZSBuaWUgamUgcG9udWthIGRlZmlub3ZhbuEiCisKKyM6IG1lbnUuYzoyMTc5Cittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBDZXN0YSBwb251a3kgbXVz7SB2aWVznSBkbyBwb2Rwb251a3kiCisKKyM6IG1lbnUuYzoyMjAwCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBQb251a2EgbmVu4WpkZW7hIC0gc2tvbnRyb2x1anRlIG7henZ5IHBvbvprIgorCisjOiBtZXNzYWdlLmM6NDcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICJDaHliYSBwcmkgc3ByYWNvdmFu7SAlczoiCisKKyM6IG1lc3NhZ2UuYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAicmlhZG9rICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTI2Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIltwcu1saZogZGxo/SByZZ1hemVjXSIKKworIzogbWVzc2FnZS5jOjY3MgorbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICJTcHLhdmNhIHNwcuF2OiBNYXJ0aW4gTGFja28gPGxhY2tvQGhvc3Quc2s+IgorCisjOiBtZXNzYWdlLmM6ODg1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIlByZXJ1mmVuaWU6ICIKKworIzogbWVzc2FnZS5jOjg4OAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiUG9rcmHob3ZhbmllIHN0bGHoZW7tbSBFTlRFUiIKKworIzogbWVzc2FnZS5jOjg5MAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlByZSBwb2tyYehvdmFuaWUgc3RsYeh0ZSBFTlRFUiBhbGVibyB6YWRhanRlIHBy7WtheiIKKworIzogbWVzc2FnZS5jOjE5NjEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBQb2tyYehvdmFuaWUgLS0iCisKKyM6IG1lc3NhZ2UuYzoxOTY0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IHJpYWRvaywgTUVEWkVSTs1LL2I6IHN0cuFua2EsIGQvdTogMC41IHN0cuFua3ksIHE6IGtvbmllYykiCisKKyM6IG1lc3NhZ2UuYzoxOTY1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDogcmlhZG9rLCBNRURaRVJOzUs6IHN0cuFua2EsIGQ6IDAuNSBzdHLhbmt5LCBxOiBrb25pZWMpIgorCisjOiBtZXNzYWdlLmM6MjQ0MSBtZXNzYWdlLmM6MjQ1NgorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJPdOF6a2EiCisKKyM6IG1lc3NhZ2UuYzoyNDQzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyLBbiZvXG4iCisiJk5pZSIKKworIzogbWVzc2FnZS5jOjI0NTgKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyLBbiZvXG4iCisiJk5pZVxuIgorIiZacnWaaZ0iCisKKyM6IG1lc3NhZ2UuYzoyNDc2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiwW4mb1xuIgorIiZOaWVcbiIKKyImVWxvnmmdIHaaZXRrb1xuIgorIlphaG9kaZ0gJnaaZXRrb1xuIgorIiZacnWaaZ0iCisKKyM6IG1lc3NhZ2UuYzoyNTE3Cittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGlhbPNnIHByZSB1a2xhZGFuaWUgc/pib3JvdiIKKworIzogbWVzc2FnZS5jOjI1MTkKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICJEaWFs82cgcHJlIG90duFyYW5pZSBz+mJvcm92IgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI1OTAKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogvHV0dWplbSwgYWxlIGtvbnpvbG924SB2ZXJ6aWEgbmVwb2Rwb3J1amUgcHJlaGxpYWRh6CBz+mJvcm92IgorCisjOiBtaXNjMS5jOjI0NTcKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBWYXJvdmFuaWU6IG1lbu1tIHP6Ym9yIGliYSBwcmUg6O10YW5pZSIKKworIzogbWlzYzEuYzoyNjg2Cittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgInBv6GV0IG5vdv1jaCByaWFka292OiAxIgorCisjOiBtaXNjMS5jOjI2ODgKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAicG/oZXQgdnltYXphbv1jaCByaWFka292OiAxIgorCisjOiBtaXNjMS5jOjI2OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgInBv6GV0IG5vdv1jaCByaWFka292OiAlbGQiCisKKyM6IG1pc2MxLmM6MjY5NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggcmlhZGtvdjogJWxkIgorCisjOiBtaXNjMS5jOjI2OTgKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiIChQcmVydZplbukpIgorCisjOiBtaXNjMS5jOjYzMTYKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiB6YWNob3bhdmFtIHP6Ym9yeS4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjMyNgorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogdWtvbuhlbv1cbiIKKworIzogbWlzYzIuYzo2NjEgbWlzYzIuYzo2NzcKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICJDSFlCQTogIgorCisjOiBtaXNjMi5jOjY4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltiYWp0b3ZdIGNlbGtvbSB1dm9sbmVu6S1hbG9rb3ZhbukgJWx1LSVsdSwgdnl1nml06SAlbHUsIG1heGlt4WxuZSB2eXWeaXRpZSAlIgorImx1XG4iCisKKyM6IG1pc2MyLmM6NjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlt2b2xhbmllXSBjZWxrb20gcmUvbWFsbG9jKCk6ICVsdSwgY2Vsa29tIGZyZWUoKSAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3MzgKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBSaWFkb2sgc2Egc3ThdmEgcHLtbGmaIGRsaP1tIgorCisjOiBtaXNjMi5jOjc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogVm76dG9ybuEgY2h5YmE6IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiBOZWRvc3RhdG9rIHBhbeR0ZSEgKGFsb2t1amVtICVsdSBieXRvdikiCisKKyM6IG1pc2MyLmM6MjU0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAiVm9s4W0gc2hlbGwgbmEgc3B1c3RlbmllOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6Mjc0MCBtaXNjMi5jOjUyMjUgb3B0aW9uLmM6NDYzNgorbXNnaWQgIk1pc3NpbmcgY29sb24iCittc2dzdHIgIkNo/WJhIGR2b2pib2RrYSIKKworIzogbWlzYzIuYzoyNzQyIG1pc2MyLmM6Mjc2OQorbXNnaWQgIklsbGVnYWwgbW9kZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbfNkIgorCisjOiBtaXNjMi5jOjI4MDgKK21zZ2lkICJJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkNoeWJu/SB0dmFyIG15mmkiCisKKyM6IG1pc2MyLmM6Mjg0OCBtaXNjMi5jOjUyNDUKK21zZ2lkICJkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAib+hha+F2YW7hIOjtc2xpY2EiCisKKyM6IG1pc2MyLmM6Mjg1MworbXNnaWQgIklsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAiTmVwcu1zdHVwbukgcHJlY2VudG8iCisKKyM6IG1pc2MyLmM6MzE1NworbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIlphZGFqdGUgmmlmcm92YWPtIGu++ug6ICIKKworIzogbWlzYzIuYzozMTU4Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiVmxvnnRlIGu++uggem5vdmE6ICIKKworIzogbWlzYzIuYzozMTY4Cittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIku++uggbmllIGplIHNwcuF2bnkhIgorCisjOiBtaXNjMi5jOjM3MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBDaHlibuEgY2VzdGE6ICcqKlvo7XNsb10gbXVz7SBieZ0gYnXvIG5hIGtvbmNpIGNlc3R5LCBhbGVibyBtdXPtIGJ5nVxuIgorIm5hc2xlZG92YW7pICclcy4gVml6IDpoZWxwIHBhdGguIgorCisjOiBtaXNjMi5jOjQ5NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogQWRyZXPhciBcIiVzXCIgc2EgbmVk4SB2IGNkcGF0aCBu4WpznSIKKworIzogbWlzYzIuYzo0OTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogU/pib3IgXCIlc1wiIHNhIG5lcG9kYXJpbG8gbuFqc50iCisKKyM6IG1pc2MyLmM6NDk4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiCOaWFkbnkg72Fsmu0gYWRyZXPhciBcIiVzXCIgbmVib2wgdiBjZHBhdGggbuFqZGVu/SIKKworIzogbWlzYzIuYzo0OTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NzogjmlhZG55IO9hbJrtIHP6Ym9yIFwiJXNcIiBuZWJvbCB2IGNlc3RlIG7hamRlbv0iCisKKyM6IG1pc2MyLmM6NTIzNworbXNnaWQgIklsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJOZXBy7XN0dXBu/SBrb21wb25lbnQiCisKKyM6IG5vcm1hbC5jOjI4NDMKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJWYXJvdmFuaWU6IHRlcm1pbuFsIG5lcG9kcG9ydWplIHp2/XJhevJvdmFuaWUiCisKKyM6IG5vcm1hbC5jOjMwMzgKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiBQb2Qga3Vyem9yb20gbmllIGplIJ5pYWRueSByZZ1hemVjIgorCisjOiBub3JtYWwuYzozMDQwCittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IFBvZCBrdXJ6b3JvbSBuaWUgamUgnmlhZG55IGlkZW50aWZpa+F0b3IiCisKKyM6IG5vcm1hbC5jOjQyMTEKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogUG9tb2NvdSAnZm9sZG1ldGhvZCcgc2EgbmVk4SB2eW1hemGdIHrhaHliIgorCisjOiBvcHMuYzoyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICJwb+hldCByaWFka292IHBvc3VudXT9Y2ggbmFyYXogcG9tb2NvdSAlcyA6IDEiCisKKyM6IG9wcy5jOjI4NQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAicG/oZXQgcmlhZGtvdiBwb3N1bnV0/WNoICVzIGty4XQgcG9tb2NvdSAlZCBzIDogMSIKKworIzogb3BzLmM6MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkIHJpYWRrb3YgcG9zdW51dP1jaCBuYXJheiBwb21vY291ICVzIgorCisjOiBvcHMuYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCByaWFka292IHBvc3VudXT9Y2ggcG9tb2NvdSAlcyAlZCBrcuF0IgorCisjOiBvcHMuYzo2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgInBv6GV0IHJpYWRrb3YgcHJlIG9kc2FkZW5pZTogJWxkIgorCisjOiBvcHMuYzo3MDEKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICJwb+hldCByaWFka292IHByZSBvZHNhZGVuaWU6IDEgIgorCisjOiBvcHMuYzo3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGluZGVudGVkICIKK21zZ3N0ciAicG/oZXQgb2RzYWRlbv1jaCByaWFka292OiAlbGQiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNTQ2Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIm5lZOEgc2Ega29w7XJvdmGdOyBuYXByaWVrIHRvbXUgdnltYXphbukiCisKKyM6IG9wcy5jOjIwODAKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAicG/oZXQgem1lbmVu/WNoIHJpYWRrb3Y6IDEiCisKKyM6IG9wcy5jOjIwODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgInBv6GV0IHptZW5lbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI0MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgInBv6GV0IHV2b2zyb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI3MjAKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICJwb+hldCBza29w7XJvdmFu/WNoIHJpYWRrb3Y6IDEiCisKKyM6IG9wcy5jOjI3MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAicG/oZXQgc2tvcO1yb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI5OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogUmVnaXN0ZXIgJXMgamUgcHLhemRueSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNTUzCittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFJlZ2lzdHJlIC0tLSIKKworIzogb3BzLmM6NDcxMQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbuF6b3YgcmVnaXN0cnUiCisKKyM6IG9wcy5jOjQ3OTcKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlZ2lzdHJlOlxuIgorCisjOiBvcHMuYzo0ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiJWQgbmllIGplIHpu4W39bSB0eXBvbSByZWdpc3RydSIKKworIzogb3BzLmM6NTIxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6ICclcycgbmllIGplIHBy7XN0dXBu6SBtZW5vIHJlZ2lzdHJ1IgorCisjOiBvcHMuYzo1NTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCBCdW5pZWs7ICIKKworIzogb3BzLmM6NTU2NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIlZ5YnJhbv1jaCAlcyVsZCB6ICVsZCByaWFka292OyAlbGQgem8gJWxkIHNsb3Y7ICVsZCB6ICVsZCBCeXRvdiIKKworIzogb3BzLmM6NTU4MworIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIkJ1bmthICVzIHogJXM7IFJpYWRvayAlbGQgeiAlbGQ7IFNsb3ZvICVsZCB6ICVsZDsgQnl0ZSAlbGQgeiAlbGQiCisKKyM6IG9wcy5jOjU1OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHByZSBCT00pIgorCisjOiBvcHRpb24uYzoxOTg5Cittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICLPYWt1amVtIHphIHBvdZ5pdGllIFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJWb75iYSBuaWUgamUgcG9kcG9yb3ZhbuEiCisKKyM6IG9wdGlvbi5jOjMyMDAKK21zZ2lkICJOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJOaWUgamUgdiBtb2RlbGluZSBwb3ZvbGVu6SIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRPc3RhdG7pIG5hc3RhdmVuaWUgeiAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiUG8gPSBqZSB2eZ5hZG92YW7pIOjtc2xvIgorCisjOiBvcHRpb24uYzozNzE0IG9wdGlvbi5jOjQzMjIKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiTmVu4WpkZW79IHYgdGVybWNhcHUiCisKKyM6IG9wdGlvbi5jOjM3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gem5hayA8JXM+IgorCisjOiBvcHRpb24uYzo0MzA3IG9wdGlvbi5jOjU1NzAKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJUb3RvIG5pZSBqZSBuYSB0b210byBtaWVzdGUgcG92b2xlbukiCisKKyM6IG9wdGlvbi5jOjQzMTQKK21zZ2lkICJDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIlZvvmJhICd0ZXJtJyBuZW30nmUgYnmdIHBy4XpkbmEiCisKKyM6IG9wdGlvbi5jOjQzMTcKK21zZ2lkICJDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJWIEdVSSBzYSBuZWThIG1lbmmdIHRlcm0iCisKKyM6IG9wdGlvbi5jOjQzMTkKK21zZ2lkICJVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiUG91nml0ZSBcImd1aVwiIHByZSBzcHVzdGVuaWUgR1VJIgorCisjOiBvcHRpb24uYzo0MzQwCittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAidm++YnkgJ2JhY2t1cGV4dCcgYSAncGF0Y2htb2RlJyBtYWr6IHJvdm5ha/ogaG9kbm90dSIKKworIzogb3B0aW9uLmM6NDYzOAorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiUmWdYXplYyBzIG51bG92b3UgZOWea291IgorCisjOiBvcHRpb24uYzo0NzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIlBvIDwlcz4gY2j9YmEg6O1zbG8iCisKKyM6IG9wdGlvbi5jOjQ3MjAKK21zZ2lkICJNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJDaP1iYSDoaWFya2EiCisKKyM6IG9wdGlvbi5jOjQ3MjcKK21zZ2lkICJNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJKZSBudXRu6SB6YWRhnSBob2Rub3R1ICciCisKKyM6IG9wdGlvbi5jOjQ3NjcKK21zZ2lkICJjb250YWlucyB1bnByaW50YWJsZSBjaGFyYWN0ZXIiCittc2dzdHIgIm9ic2FodWplIG5ldGxh6Gl0Zb5u6SB6bmFreSIKKworIzogb3B0aW9uLmM6NDgwMAorbXNnaWQgIkludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiQ2h5Ym7pIHDtc21hIgorCisjOiBvcHRpb24uYzo0ODA3Cittc2dpZCAiY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIm5lZOEgc2EgdnlicmGdIHNhZGEgcO1zaWVtIgorCisjOiBvcHRpb24uYzo0ODA5Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJDaHlibuEgc2FkYSBw7XNpZW0iCisKKyM6IG9wdGlvbi5jOjQ4MTYKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJuZWThIHNhIHZ5YnJhnSCaaXJva/0gZm9udCIKKworIzogb3B0aW9uLmM6NDgxOAorbXNnaWQgIkludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJDaHlibukgmmlyb2vpIHDtc21vIgorCisjOiBvcHRpb24uYzo1MDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIk5lcHLtc3R1cG79IHpuYWsgcG8gPCVjPiIKKworIzogb3B0aW9uLmM6NTE3MQorbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJqZSBudXRu4SDoaWFya2EiCisKKyM6IG9wdGlvbi5jOjUxNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiJ2tvbWVudOFyJyBtdXPtIGJ5nSBwcuF6ZG55IGFsZWJvIG11c+0gb2JzYWhvdmGdICVzIgorCisjOiBvcHRpb24uYzo1MjI2Cittc2dpZCAiTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiQmV6IHBvZHBvcnkgbXmaaSIKKworIzogb3B0aW9uLmM6NTQ3MgorbXNnaWQgIlVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIk5ldXphdHZvcmVu6SB6b3NrdXBlbmllIHb9cmF6b3YiCisKKyM6IG9wdGlvbi5jOjU0NzYKK21zZ2lkICJ0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAicHLtbGmaIG1ub2hvIHBvbG+eaWVrIgorCisjOiBvcHRpb24uYzo1NDc4Cittc2dpZCAidW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIm5ldnl24Z5lbukgc2t1cGlueSIKKworIzogb3B0aW9uLmM6NTY5MworbXNnaWQgIkEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIk9rbm8gbuFovmFkdSB1niBleGlzdHVqZSIKKworIzogb3B0aW9uLmM6NTk1NCBvcHRpb24uYzo1OTgzCittc2dpZCAiJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiaG9kbm90YSB2b75ieSAnd2luaGVpZ2h0JyBuZXNtaWUgYnmdIG1lbpppYSBuZZ4gaG9kbm90YSB2b75ieSAnd2lubWluaGVpZ2h0JyIKKworIzogb3B0aW9uLmM6NTk5OSBvcHRpb24uYzo2MDE4Cittc2dpZCAiJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgImhvZG5vdGEgdm++YnkgJ3dpbndpZHRoJyBuZXNtaWUgYnmdIG1lbpppYSBuZZ4gaG9kbm90YSB2b2y+eSAnd2lubWlud2lkdGgnIgorCisjOiBvcHRpb24uYzo2MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIk1pbmlt4WxuZSBwb3RyZWJu/SBwb+hldCByaWFka292OiAlZCIKKworIzogb3B0aW9uLmM6NjE2OAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIk1pbmlt4WxuZSBwb3RyZWJu/SBwb+hldCBzdOVwY292OiAlZCIKKworIzogb3B0aW9uLmM6NjQ2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE5lem7hbWEgdm++YmE6ICVzIgorCisjOiBvcHRpb24uYzo2NTc0Cittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS/NkeSB0ZXJtaW7hbHUgLS0tIgorCisjOiBvcHRpb24uYzo2NTc2Cittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTmFzdGF2ZW5pZSBnbG9i4WxueWNoIHZvbGllYiAtLS0iCisKKyM6IG9wdGlvbi5jOjY1NzgKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE5hc3RhdmVuaWUgZ2xvYuFsbnljaCB2b2xpZWIgLS0tIgorCisjOiBvcHRpb24uYzo2NTgwCittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBNb55ub3N0aSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyNjkKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgQ0hZQkEiCisKKyM6IG9wdGlvbi5jOjgyMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogcHJlICVzIGNo/WJhIHZ5aG92dWr6Y2kgem5hayIKKworIzogb3B0aW9uLmM6ODI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiBuYWRieXRv6G7pIHpuYWt5IHBvIGJvZGtv6GlhcmtlOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIm5lZOEgc2Egb3R2b3JpnSAiCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiBOZWThIHNhIG90dm9yaZ0gb2tubyFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJKZSBwb3RyZWJu4SBBbWlnYWRvcyB2ZXJ6aWEgMi4wNCBhbGVibyBub3aaaWFcbiIKKworIzogb3NfYW1pZ2EuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJQb3RyZWJu/SAlcyAgdmVyemlhICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQwNworbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTmVk4SBzYSBvdHZvcmmdIE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MTgKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAiTmVk4SBzYSB2eXR2b3JpnSAiCisKKyM6IG9zX2FtaWdhLmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIHVrb27oZW79IHMgJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJuZW30nmVtIHptZW5pnSBrb256b2xvdv0gbfNkID8hXG4iCisKKyM6IG9zX2FtaWdhLmM6OTM4IG9zX21hYy5jOjExNzcgb3NfbXN3aW4uYzo2Mjkgb3NfcmlzY29zLmM6NzU3IG9zX3VuaXguYzoyODAzCittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBOYXN0YXZvdmFuaWUgcmWeaW11IG9icmF6b3ZreSBuaWUgamUgcG9kcG9yb3ZhbukiCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogbmllIGplIGtvbnpvbG91Pz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiBOZWThIHNhIHNwdXN0aZ0gc2hlbGwgcyAtZiB2b75ib3UiCisKKyM6IG9zX2FtaWdhLmM6MTE4MyBvc19hbWlnYS5jOjEyNzMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIk5lZOEgc2Egc3B1c3RpnSAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NiBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgInNoZWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjA2IG9zX2FtaWdhLmM6MTMwOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgdnLhdGVu6VxuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIHBy7WxpmiBtYWzhLiIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gQ0hZQkEiCisKKyM6IG9zX21zd2luLmM6NTAzCittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLihza3LhdGVu6SkiCisKKyM6IG9zX21zd2luLmM6NjA0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidzdOVwY2UnIG5pZSBqZSA4MCwgbmVt9J5lbSBzcHVzdGmdIGV4dGVybv0gcHLta2F6IgorCisjOiBvc19tc3dpbi5jOjcxNiBvc191bml4LmM6NTExNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogVnl2b2xhbmllIGtuaZ5uaehuZWogZnVua2NpYSB6bHloYWxvIHByZSBcIiVzKClcIiIKKworIzogb3NfbXN3aW4uYzoxMzY1Cittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBabHloYWwgdv1iZXIgdGxh6Glhcm5lIgorCisjOiBvc19tc3dpbi5jOjE0MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgIiVzIG5hICVzIgorCisjOiBvc19tc3dpbi5jOjE0MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTQ0ODogTmV6buFtZSBw7XNtbzogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ3MCBvc19tc3dpbi5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBDaHliYSB0bGHoZTogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ4MQorbXNnaWQgIlVua25vd24iCittc2dzdHIgIk5lem7hbXkiCisKKyM6IG9zX21zd2luLmM6MTUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJUbGHo7W0gJyVzJyIKKworIzogb3NfbXN3aW4uYzoyNTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBDaHlibv0gbuF6b3Ygem5ha292ZWogc2FkeSBcIiVzXCIgdiBu4Xp2ZSBw7XNtYSBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjYwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBDaHlibv0gem5hayAnJWMnIHYgbuF6dmUgcO1zbWEgXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjU2Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogQ2h5Ym7hICdvc2ZpbGV0eXBlJyB2b75iYSAtIHBvdZ5pdGllIFRleHR1IgorCisjOiBvc191bml4LmM6ODYyCittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZJbTogZHZvaml0/SBzaWdu4WwsIGtvbujtbVxuIgorCisjOiBvc191bml4LmM6ODY4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWwgJXNcbiIKK21zZ3N0ciAiVmltOiBaYWNoeXRlbv0gc21ydGlhY2kgc2lnbuFsICVzXG4iCisKKyM6IG9zX3VuaXguYzo4NzEKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogWmFjaHl0ZW79IHNtcnRpYWNpIHNpZ27hbFxuIgorCisjOiBvc191bml4LmM6MTEyNQorIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAiT3R24XJhbSBYIGRpc3BsZWogLSB6YWJlcmllICVsZCBtc2VjIgorCisjOiBvc191bml4LmM6MTE1MgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IGNoeWJhIFhcbiIKKworIzogb3NfdW5peC5jOjEyMTkKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJUZXN0b3ZhbmllIFggZGlzcGxlamEgemx5aGFsbyIKKworIzogb3NfdW5peC5jOjEzNjMKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICJVcGx5bnVsIOhhcyBvdHZvcmVuaWEgWCBkaXNwbGVqYSIKKworIzogb3NfdW5peC5jOjI5NzYgb3NfdW5peC5jOjM2MzQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiTmVk4SBzYSBzcHVzdGmdIHNoZWxsICIKKworIzogb3NfdW5peC5jOjMwMjEKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5lZOEgc2Egc3B1c3RpnSBzaCBzaGVsbFxuIgorCisjOiBvc191bml4LmM6MzAyNSBvc191bml4LmM6MzY0MAorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyIgbuF2cmF0b3bhIGhvZG5vdGEgc2hlbGx1ICIKKworIzogb3NfdW5peC5jOjMxNTkKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiTmVkavogc2Egdnl0dm9yaZ0gcvpyeVxuIgorCisjOiBvc191bml4LmM6MzE3NAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiVnl2b2xhbmllIGZvcmsgemx5aGFsb1xuIgorCisjOiBvc191bml4LmM6MzY0NworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBy7WtheiB1a29u6GVu/VxuIgorCisjOiBvc191bml4LmM6NTE2NAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIk90dm9yZW5pZSBYIGRpc3BsZWphIHpseWhhbG8iCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIk5hIHJpYWRrdSIKKworIzogb3Nfd2luMTYuYzo1Nzggb3Nfd2luMzIuYzozMDM3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJu4XZyYXRvduEgaG9kbm90YSBzaGVsbHUgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjUwNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IFphY2h5dGVu4SB1ZGFsb3OdICVzXG4iCisKKyM6IG9zX3dpbjMyLmM6MjUwNworbXNnaWQgImNsb3NlIgorbXNnc3RyICJ6YXZyaWWdIgorCisjOiBvc193aW4zMi5jOjI1MDkKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIm9kaGzhc2mdIgorCisjOiBvc193aW4zMi5jOjI1MTAKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAidnlwbvqdIgorCisjOiBvc193aW4zMi5jOjI5OTEKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogUHLta2F6IG5lbuFqZGVu/SIKKworIzogb3Nfd2luMzIuYzozMDA0Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSBuZW7hamRlbv0gdiAkUEFUSC5cbiIKKyJQbyBkb2tvbuhlbu0gZXh0ZXJu/WNoIHBy7Wthem92IG5lYnVkZSB2/XN0dXAgcG96YXN0YXZlbv0uXG4iCisiUG96cml0ZSAgOmhlbHAgd2luMzItdmltcnVuICBwcmUgdmlhYyBpbmZvcm3hY2ntLiIKKworIzogb3Nfd2luMzIuYzozMDA3Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSBWYXJvdmFuaWUiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5lbfSeZW0gbmFocmGdIHZpbTMyLmRsbCEiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIlZJTSBDaHliYSIKKworIzogb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiQ291bGQgbm90IGZpeCB1cCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgRExMISIKK21zZ3N0ciAiTmVt9J5lbSBvcHJhdmmdIG9ka2F6eSBmdW5rY2llIG5hIERMTCEiCisKKyM6IHF1aWNrZml4LmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogUHLtbGmaIG1ub2hvICUlJWMgdm8gZm9ybeF0b3ZhY29tIHJlnWF6Y2kiCisKKyM6IHF1aWNrZml4LmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiBOZW/oYWvhdmFu/SB2/XNreXQgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmWdYXpjaSIKKworIzogcXVpY2tmaXguYzozNDgKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogVm8gZm9ybeF0b3ZhY29tIHJlnWF6Y2kgY2j9YmEgXSIKKworIzogcXVpY2tmaXguYzozNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiBOZXBvZHBvcm92YW7hIGZvcm3hdG924SCacGVjaWZpa+FjaWEgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmWdYXpjaSIKKworIzogcXVpY2tmaXguYzozODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiBOZXBy7XN0dXBu6SAlJSVjIHYgcHJlZml4ZSBmb3Jt4XRvdmFjaWVobyByZZ1hemNhIgorCisjOiBxdWlja2ZpeC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogTmVwcu1zdHVwbukgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmWdYXpjaSIKKworIzogcXVpY2tmaXguYzo0MTQKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgbmVvYnNhaHVqZSCeaWFkbnkgdnpvciIKKworIzogcXVpY2tmaXguYzo1MjAKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBDaP1iYWr6Y2kgYWxlYm8gcHLhemRueSBu4XpvdiBhZHJlc+FyYSIKKworIzogcXVpY2tmaXguYzo5MzEKK21zZ2lkICJObyBtb3JlIGl0ZW1zIgorbXNnc3RyICKOaWFkbmUg72FsmmllIHBvbG+ea3kiCisKKyM6IHF1aWNrZml4LmM6MTE1MgorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQvJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjExNTQKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAocmlhZG9rIHZ5bWF6YW79KSIKKworIzogcXVpY2tmaXguYzoxMzYwCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBLb25pZWMgcXVpY2tmaXggem96bmFtdSIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBaYehpYXRvayBxdWlja2ZpeCB6b3puYW11IgorCisjOiBxdWlja2ZpeC5jOjEzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJ6b3puYW0gY2j9YiAlZCB6ICVkOyBwb+hldCBjaP1iOiAlZCIKKworIzogcXVpY2tmaXguYzoxODQyCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogTmVk4SBzYSB1bG+eaZ0sIGplIG5hc3RhdmVu4SB2b75iYSAnYnVmdHlwZSciCisKKyM6IHJlZ2V4cC5jOjgwMgorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFZ6b3IgamUgcHLtbGmaIGRsaP0iCisKKyM6IHJlZ2V4cC5jOjEzMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IFZobmllemRlbv0gJXMqIgorCisjOiByZWdleHAuYzoxMzIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogVmhuaWV6ZGVu6SAlcyVjIgorCisjOiByZWdleHAuYzoxNDczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyBuaeggbmVuYXNsZWR1amUiCisKKyM6IHJlZ2V4cC5jOjI0OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkNoeWJhIHN5bnRheGUgdiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzM3Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IFphY2h5dGVu6SBwcmV0ZehlbmllIHrhc29ibu1rdTogcHLtbGmaIHpsb55pdP0gcmVndWzhcm55IHb9cmF6PyIKKworIzogcmVnZXhwLmM6Mjg3MgorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogdnpvciBzcPRzb2JpbCBwcmV0ZehlbmllIHrhc29ibu1rdSIKKworIzogcmVnZXhwLmM6MzEwOAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlZu+nRvcm7pIHBvZHJhZGVu6SB6aG9keTpcbiIKKworIzogc2NyZWVuLmM6MjA2MworIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgcmlhZGtvdiB6YWhudXT9Y2ggIgorCisjOiBzY3JlZW4uYzo3NTE3Cittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgTkFIUkFESY0gVkVSVElLwUxORSIKKworIzogc2NyZWVuLmM6NzUyMQorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgTkFIUkFESY0iCisKKyM6IHNjcmVlbi5jOjc1MjYKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiIE9CUsFUSY0iCisKKyM6IHNjcmVlbi5jOjc1MjgKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgVkxPjkmNIgorCisjOiBzY3JlZW4uYzo3NTMxCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKHZsb55pnSkiCisKKyM6IHNjcmVlbi5jOjc1MzMKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKG5haHJhZGmdKSIKKworIzogc2NyZWVuLmM6NzUzNQorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKG5haHJhZGmdIHZlcnRpa+FsbmUpIgorCisjOiBzY3JlZW4uYzo3NTM4Cittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIGhlYnJlanNr/SIKKworIzogc2NyZWVuLmM6NzU0NgorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAoamF6eWspIgorCisjOiBzY3JlZW4uYzo3NTQ5Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAodmxvnmmdKSIKKworIzogc2NyZWVuLmM6NzU1NQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBaSE9EWSIKKworIzogc2NyZWVuLmM6NzU1NworbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBWSVpVwUxORSIKKworIzogc2NyZWVuLmM6NzU1OQorbXNnaWQgIiBCTE9DSyIKK21zZ3N0ciAiIEJMT0siCisKKyM6IHNjcmVlbi5jOjc1NjEKK21zZ2lkICIgTElORSIKK21zZ3N0ciAiIFJJQURPSyIKKworIzogc2NyZWVuLmM6NzU3NCBzY3JlZW4uYzo3NjM0Cittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICJuYWhy4XZhbSIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgImi+YWRhbmllIGRvc2lhaGxvIHph6GlhdG9rLCBwb2tyYehvdmFuaWUgb2Qga29uY2EiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICJovmFkYW5pZSBkb3NpYWhsbyBrb25pZWMsIHBva3Jh6G92YW5pZSBvZCB6YehpYXRrdSIKKworIzogc2VhcmNoLmM6NDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IE5lcHLtc3R1cG79IGi+YWRhbv0gcmWdYXplYzogJXMiCisKKyM6IHNlYXJjaC5jOjc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IGi+YWRhbmllIGRvc2lhaGxvIHph6GlhdG9rIGJleiBu4WpkZW5pYSAlcyIKKworIzogc2VhcmNoLmM6Nzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTogaL5hZGFuaWUgZG9zaWFobG8ga29uaWVjIGJleiBu4WpkZW5pYSAlcyIKKworIzogc2VhcmNoLmM6MTE0NAorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogUG8gJzsnIG/oYWvhdmFtICc/JyBhbGVibyAnLyciCisKKyM6IHNlYXJjaC5jOjM1MjMKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICh2cuF0YW5lIHWeIHZ5cO1zYW79Y2ggemj0ZCkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6MzU0MworbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBWbG+eZW7pIHP6Ym9yeSIKKworIzogc2VhcmNoLmM6MzU0NQorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIm5lbuFqZGVu6SAiCisKKyM6IHNlYXJjaC5jOjM1NDYKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICJ2IGNlc3RlIC0tLVxuIgorCisjOiBzZWFyY2guYzozNTg1Cittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgIChVniB2eXDtc2Fu6SkiCisKKyM6IHNlYXJjaC5jOjM1ODcKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiIE5FTsFKREVOySIKKworIzogc2VhcmNoLmM6MzYzOQorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAiUHJlaL5hZOF2YW0gdmxvnmVu6SBz+mJvcnk6ICVzIgorCisjOiBzZWFyY2guYzozODU3Cittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBaaG9kYSBqZSBuYSBha3R14Wxub20gcmlhZGt1IgorCisjOiBzZWFyY2guYzozOTk3Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIlaaZXRreSB2bG+eZW7pIHP6Ym9yeSBib2xpIG7hamRlbukiCisKKyM6IHNlYXJjaC5jOjM5OTkKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAijmlhZG5lIHZsb55lbukgc/pib3J5IgorCisjOiBzZWFyY2guYzo0MDE1Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBOZWThIHNhIG7hanOdIGRlZmlu7WNpYSIKKworIzogc2VhcmNoLmM6NDAxNworbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTmVk4SBzYSBu4WpznSB2em9yIgorCisjOiBzeW50YXguYzoyOTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjMxNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IFN5bnRha3RpY2vhIHpvc3RhdmEgJXMgbmVleGlzdHVqZSIKKworIzogc3ludGF4LmM6MzM0MworbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiUHJlIHRlbnRvIGJ1ZmZlciBuaWUgc/ogZGVmaW5vdmFu6SCeaWFkbmUgcG9sb55reSBzeW50YXhlIgorCisjOiBzeW50YXguYzozMzUxCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzeW5jaHJvbml6dWplbSBrb21lbnThcmUgdiBDIJp0/WxlIgorCisjOiBzeW50YXguYzozMzU5Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAinmlhZG5lIHN5bmNocm9uaXrhY2llIgorCisjOiBzeW50YXguYzozMzYyCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJzeW5jaHJvbml64WNpYSB6YejtbmEgIgorCisjOiBzeW50YXguYzozMzY0IHN5bnRheC5jOjM0MzkKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgcmlhZGtvdiBwcmVkIHph6GlhdGtvbSIKKworIzogc3ludGF4LmM6MzM2OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFBvbG+ea3kgc3luY2hyb25peuFjaWUgc3ludGF4ZSAtLS0iCisKKyM6IHN5bnRheC5jOjMzNzQKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorInN5bmNocm9uaXp1amVtIHBvbG+ea3kiCisKKyM6IHN5bnRheC5jOjMzODAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUG9sb55reSBzeW50YXhlIC0tLSIKKworIzogc3ludGF4LmM6MzQwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogU3ludGFrdGlja+Egem9zdGF2YSAlcyBuZWV4aXN0dWplIgorCisjOiBzeW50YXguYzozNDI5Cittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmlt4WxuZSAiCisKKyM6IHN5bnRheC5jOjM0MzYKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibWF4aW3hbG5lICIKKworIzogc3ludGF4LmM6MzQ0OAorbXNnaWQgIjsgbWF0Y2ggIgorbXNnc3RyICI7IHpob2RhICIKKworIzogc3ludGF4LmM6MzQ1MAorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIHJpYWRrb3YiCisKKyM6IHN5bnRheC5jOjQwNzgKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IGdyb3VwW3RdaGVyZSBuZXNtaWUgYnmdIG5hIHRvbXRvIG1pZXN0ZSIKKworIzogc3ludGF4LmM6NDEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IFByZSAlcyBjaP1iYSBwb2xvnmthIHJlZ2nzbnUiCisKKyM6IHN5bnRheC5jOjQxMzAKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogb2JzYWh1amUgYXJndW1lbnR5LCBrdG9y6SB0dSBuaWUgc/ogcG92b2xlbukiCisKKyM6IHN5bnRheC5jOjQxNDEKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5Njogb2JzYWh1amUgYXJndW1lbnR5LCBrdG9y6SB0dSBuaWUgc/ogcG92b2xlbukiCisKKyM6IHN5bnRheC5jOjQyMTkKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5NzogVnmeYWRvdmFu/SBu4XpvdiBz+mJvcnUiCisKKyM6IHN5bnRheC5jOjQ1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBDaP1iYSAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBQcu1saZogbeFsbyBhcmd1bWVudG92OiBvYmxhc50gc3ludGF4ZSAlcyIKKworIzogc3ludGF4LmM6NTA0NgorbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBOZWJvbGEgemFkYW7hIJ5pYWRuYSB6b3N0YXZhIgorCisjOiBzeW50YXguYzo1MDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IE9kZGW+b3Zh6CB2em9ydSAlcyBuZW7hamRlbv0iCisKKyM6IHN5bnRheC5jOjUxNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogQ2h5YmEgemEgdnpvcm9tICVzIgorCisjOiBzeW50YXguYzo1MjQ1Cittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTQwMzogc3luY2hyb25peuFjaWEgc3ludGF4ZTogdnpvciBwb2tyYehvdmFuaWEgcmlhZGtvdiB6YWRhbv0gZHZha3LhdCIKKworIzogc3ludGF4LmM6NTMwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IENoeWJu6SBhcmd1bWVudHk6ICVzIgorCisjOiBzeW50YXguYzo1MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IENo/WJhIHpuYW1pZW5rbyByb3Zu4XNhOiAlcyIKKworIzogc3ludGF4LmM6NTM1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IFBy4XpkbnkgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIHR1IG5pZSBqZSBwb3ZvbGVu6SIKKworIzogc3ludGF4LmM6NTM5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG11c+0gYnmdIHBydv0gdiAnY29udGFpbnMnIHpvem5hbWUiCisKKyM6IHN5bnRheC5jOjU0NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogTmV6buFteSBu4XpvdiBza3VwaW55OiAlcyIKKworIzogc3ludGF4LmM6NTY5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IENoeWJu/SBwb2RyYWRlbv0gcHLta2F6IDpzeW50YXggOiAlcyAiCisKKyM6IHN5bnRheC5jOjYwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IHNrdXBpbmEgenbtcmF6bmVuaWEgJXMgbmVib2xhIG7hamRlbuEiCisKKyM6IHN5bnRheC5jOjYwOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IFBy7WxpmiBt4WxvIGFyZ3VtZW50b3Y6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiBQcu1saZogbW5vaG8gYXJndW1lbnRvdjogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjEyMgorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDogc2t1cGluYSBqZSBuYXN0YXZlbuEsIG9ka2F6IG5hIHp2/XJhevJvdmFjaXUgc2t1cGludSBpZ25vcm92YW79IgorCisjOiBzeW50YXguYzo2MjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IG5lb+hha+F2YW7pIHpuYW1pZW5rbyByb3Zu4XNhIDogJXMiCisKKyM6IHN5bnRheC5jOjYyODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogY2j9YmEgem5hbWllbmtvIHJvdm7hc2E6ICVzIgorCisjOiBzeW50YXguYzo2MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiBjaP1iYSBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjYzNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IE5lcHLtcHVzdG7hIGhvZG5vdGE6ICVzIgorCisjOiBzeW50YXguYzo2NDY1Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogZmFyYmEgcG9wcmVkaWEgbmllIGplIHpu4W1hIgorCisjOiBzeW50YXguYzo2NDc2Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogZmFyYmEgcG96YWRpYSBuaWUgamUgem7hbWEiCisKKyM6IHN5bnRheC5jOjY1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiBO4XpvdiBhbGVibyDo7XNsbyBmYXJieSAlcyBuZWJvbG8gcm96cG96bmFu6SIKKworIzogc3ludGF4LmM6Njc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogdGVybWlu4Wxvdv0ga/NkICVzIGplIHBy7WxpmiBkbGj9IgorCisjOiBzeW50YXguYzo2NzkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjczMjEKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBKZSBwb3We7XZhbukgcHLtbGmaIHZlbGvpIG1ub55zdHZvIG9kbGmabv1jaCB6dv1yYXryb3ZhY+1jaCB2bGFzdG5vc3TtIgorCisjOiB0YWcuYzo5MAorbXNnaWQgImF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgImtvbmllYyB6b3puYW11IHRhZ292IgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgInph6GlhdG9rIHpvem5hbXUgdGFnb3YiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiBOZWThIHNhIHNrb+hpnSBwcmVkIHBydv0gdnlob3Z1avpjaSB0YWciCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogdGFnICVzIG5lbuFqZGVu/SIKKworIzogdGFnLmM6NTQ1Cittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSB0YWciCisKKyM6IHRhZy5jOjU0OAorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAic/pib3JcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiWmFkYWp0ZSDo7XNsbyAoPENSPiBwcmUgdWtvbuhlbmllKTogIgorCisjOiB0YWcuYzo3NDYKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IFZ5aG92dWplIGliYSBqZWRlbiB0YWciCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IFphIHBvc2xlZG79IHZ5aG92dWr6Y2kgdGFnIHNhIG5lZOEgcHJlc2tv6GmdIgorCisjOiB0YWcuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIlP6Ym9yIFwiJXNcIiBuZWV4aXN0dWplIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgInRhZyAlZCB6IGNlbGtvdulobyBwb+h0dSAlZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIGFsZWJvIHZpYWMiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIFBvdZ7tdmFtIHRhZyBzIHDtc21vbSBpbmVqIHZlvmtvc3RpISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBT+mJvciBcIiVzXCIgbmVleGlzdHVqZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIENJRbwgdGFnICAgICAgICCKVEFSVCByaWFkb2sgIHYgc/pib3JlL3RleHRlIgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIkxpbmXhcm5lIGi+YWRhbmllIHRhZ3UiCisKKyM6IHRhZy5jOjExNDYKK21zZ2lkICJCaW5hcnkgdGFnIHNlYXJjaCIKK21zZ3N0ciAiQmlu4XJuZSBovmFkYW5pZSB0YWd1IgorCisjOiB0YWcuYzoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIlByZWi+YWThdmFtIHP6Ym9yIHRhZ292ICVzIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBT+mJvciB0YWdvdiAlcyBib2wgb3JlemFu/VxuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBDaHliYSBmb3Jt4XR1IHYgc/pib3JlIHRhZ292IFwiJXNcIiIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIlByZWQgYmFqdG9tICVsZCIKKworIzogdGFnLmM6MTg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IE9ic2FoIHP6Ym9ydSB0YWdvdiAlcyBuaWUgamUgem9yYWRlbv0iCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiCOaWFkbnkgc/pib3IgdGFnb3YiCisKKyM6IHRhZy5jOjI1ODMKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBOZWThIHNhIG7hanOdIHZ6b3IgdGFnb3YiCisKKyM6IHRhZy5jOjI1OTQKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IFRhZyBzYSBuZWThIG7hanOdLCBpYmEgaOFkYW0hIgorCisjOiB0ZXJtLmM6MTczNworbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyBuaWUgamUgem7hbXkuIERvc3R1cG7pIHZzdGF2YW7pIHRlcm1pbuFseToiCisKKyM6IHRlcm0uYzoxNzYxCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJuYXN0YXZ1amVtIG5hICciCisKKyM6IHRlcm0uYzoyMTE0Cittc2dpZCAiQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJOZWThIHNhIG90dm9yaZ0gdGVybWNhcCBz+mJvciIKKworIzogdGVybS5jOjIxMTcKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIlRlcm1pbmZvIG5lb2JzYWh1amUgcG9sb55rdSBwcmUgdGVudG8gdGVybWlu4WwiCisKKyM6IHRlcm0uYzoyMTE5Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIlRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvnmt1IHByZSB0ZW50byB0ZXJtaW7hbCIKKworIzogdGVybS5jOjIyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IFRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvnmt1IHByZSBcIiVzXCIiCisKKyM6IHRlcm0uYzoyNzUyCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IFRlcm1pbuFsIG11c+0gbWGdIFwiY21cIiBzY2hvcG5vc50iCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ4OTEKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEts4XZlc3kgdGVybWlu4Wx1IC0tLSIKKworIzogdWkuYzoyNTEKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJzcHVzdGVu/SBub3b9IHNoZWxsXG4iCisKKyM6IHVpLmM6MTc0NworbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IENoeWJhIHByaSDo7XRhbu0gdnN0dXB1LCBrb27o7W0uLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozODMKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIk9kc3Ry4W5lbmllIHptaWVuIG5pZSBqZSBtb55u6TsgY2hjZXRlIG5hcHJpZWsgdG9tdSBwb2tyYehvdmGdIgorCisjOiB1bmRvLmM6NTM4Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzog6O1zbGEgcmlhZGtvdiBz+iBjaHlibukiCisKKyM6IHVuZG8uYzo3MDcKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAicG/oZXQgem1pZW46IDEiCisKKyM6IHVuZG8uYzo3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgInBv6GV0IHptaWVuOiAlbGQiCisKKyM6IHVuZG8uYzo3NTMKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogeuF6bmFtIG8gem1lbuFjaCBwb5prb2Rlbv0iCisKKyM6IHVuZG8uYzo3ODUKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDogY2j9YmEgcmlhZG9rIHNw5J0iCisKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzo3MjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNi8zMiBiaXRvduEgR1VJIHZlcnppYSBwcmUgTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjcyNworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SBHVUkgdmVyemlhIHByZSBNUyBXaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6NzMwCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgdiBXaW4zMiByZZ5pbWUiCisKKyM6IHZlcnNpb24uYzo3MzIKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIHMgT0xFIHBvZHBvcm91IgorCisjOiB2ZXJzaW9uLmM6NzM1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SB2ZXJ6aWEgcHJlIE1TIFdpbmRvd3Mga29uem9sdSIKKworIzogdmVyc2lvbi5jOjczOQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIHZlcnppYSBwcmUgTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjc0MworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvduEgdmVyemlhIHByZSBNUy1ET1MiCisKKyM6IHZlcnNpb24uYzo3NDUKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIE1TLURPUyB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo3NTEKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnppYSIKKworIzogdmVyc2lvbi5jOjc1MworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnppYSIKKworIzogdmVyc2lvbi5jOjc1NgorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgdmVyemlhIgorCisjOiB2ZXJzaW9uLmM6NzYxCittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlJJU0MgT1MgdmVyemlhIgorCisjOiB2ZXJzaW9uLmM6NzcxCittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIlBvdZ5pdOkgeuFwbGF0eTogIgorCisjOiB2ZXJzaW9uLmM6Nzk3IHZlcnNpb24uYzoxMTMyCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJabWVuaWwgIgorCisjOiB2ZXJzaW9uLmM6ODA0Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIlByZWxvnmVu4SAiCisKKyM6IHZlcnNpb24uYzo4MDcKK21zZ2lkICJieSAiCittc2dzdHIgIiAiCisKKyM6IHZlcnNpb24uYzo4MTkKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1heGlt4WxuYSB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo4MjIKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmW+a+EgdmVyemlhICIKKworIzogdmVyc2lvbi5jOjgyNQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJOb3Jt4WxuYSB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo4MjgKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJNYWzhIHZlcnppYSAiCisKKyM6IHZlcnNpb24uYzo4MzAKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1pbmlt4WxuYSB2ZXJ6aWEgIgorCisjOiB2ZXJzaW9uLmM6ODM2Cittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJiZXogZ3JhZmlja+lobyByb3pocmFuaWEuIgorCisjOiB2ZXJzaW9uLmM6ODQwCittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gR1RLLUdOT01FLiIKKworIzogdmVyc2lvbi5jOjg0MgorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEdUSy4iCisKKyM6IHZlcnNpb24uYzo4NDYKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICJzIHJvemhyYW7tbSBYMTEtTW90aWYuIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIFgxMS1BdGhlbmEuIgorCisjOiB2ZXJzaW9uLmM6ODUyCittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEJlT1MuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjg1OAorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAicyBncmFmaWNr/W0gcm96aHJhbu1tLiIKKworIzogdmVyc2lvbi5jOjg2MQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgInMgQ2FyYm9uIGdyYWZpY2v9bSByb3pocmFu7W0uIgorCisjOiB2ZXJzaW9uLmM6ODY0Cittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJzIENvY29hIGdyYWZpY2v9bSByb3pocmFu7W0uIgorCisjOiB2ZXJzaW9uLmM6ODY3Cittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAicyAoa2xhc2lja/1tKSBncmFmaWNr/W0gcm96aHJhbu1tLiIKKworIzogdmVyc2lvbi5jOjg3OAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgVmxhc3Rub3N0aSB6YWhybnV06SAoKykgYSBuZXphaHJudXTpICgtKTpcbiIKKworIzogdmVyc2lvbi5jOjg5MAorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgc3lzdOltb3b9IHZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjg5NQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICB1nu12YXRlvnNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MDAKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiBkcnVo/SB1nu12YXRlvnNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MDUKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiB0cmV07SB1nu12YXRlvnNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MTAKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgIHWe7XZhdGW+c2v9IGV4cmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE1Cittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgIGRydWj9IHWe7XZhdGW+c2v9IGV4cmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTIxCittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIHN5c3TpbW92/SBndmltcmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTI1Cittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgdZ7tdmF0Zb5za/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjkyOQorbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiZHJ1aP0gdZ7tdmF0Zb5za/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjkzNAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAidHJldO0gdZ7tdmF0Zb5za/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIHN5c3TpbW92/SBz+mJvciBzIHBvbnVrb3U6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgIGltcGxpY2l0buEgaG9kbm90YSAkVklNOlwiIgorCisjOiB2ZXJzaW9uLmM6OTU1Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgZi1iIHByZSAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzo5NTkKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJQcmVrbGFkOiAiCisKKyM6IHZlcnNpb24uYzo5NjUKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICJQcmVrbGFkYeg6ICIKKworIzogdmVyc2lvbi5jOjk3MAorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiTGlua3VqZW06ICIKKworIzogdmVyc2lvbi5jOjk3NQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgUE9EUE9SQSBMQURFTklBIgorCisjOiB2ZXJzaW9uLmM6MTAxMQorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByZXZlZCIKKworIzogdmVyc2lvbi5jOjEwMTMKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyemlhICIKKworIzogdmVyc2lvbi5jOjEwMTQKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIkF1dG9yOiBCcmFtIE1vb2xlbmFhciBhIO9hbJrtIgorCisjOiB2ZXJzaW9uLmM6MTAxOAorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBqZSB2b75uZSCa7XJpdGW+bv0gcHJvZ3JhbSIKKworIzogdmVyc2lvbi5jOjEwMjAKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAiUG9t9J50ZSBjaHVkb2Ju/W0gZGWdb20gdiBVZ2FuZGUhIgorCisjOiB2ZXJzaW9uLmM6MTAyMQorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgInBvZHJvYm5lapppZSBpbmZvcm3hY2llIHrtc2thdGUgcG9tb2NvdSA6aGVscCBpY2NmPEVudGVyPiIKKworIzogdmVyc2lvbi5jOjEwMjMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJ6YWRhanRlIDpxPEVudGVyPiAgICAgICAgICAgICBwcmUgdWtvbuhlbmllIHByb2dyYW11IgorCisjOiB2ZXJzaW9uLmM6MTAyNAorbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgInphZGFqdGUgOmhlbHA8RW50ZXI+ICBhbGVibyA8RjE+IHByZSBwb21vY27ta2EiCisKKyM6IHZlcnNpb24uYzoxMDI1Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiemFkYWp0ZSA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gIHByZSBpbmZvcm3hY2llIG8gdmVyemlpIgorCisjOiB2ZXJzaW9uLmM6MTAyOAorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJCZZ7tbSB2IHJlnmltZSBrb21wYXRpYmlsaXR5IHMgVmkiCisKKyM6IHZlcnNpb24uYzoxMDI5Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAiemFkYWp0ZSA6c2V0IG5vY3A8RW50ZXI+ICAgICBwcmUgaW1wbGljaXRu6SBuYXN0YXZlbmllIFZpbSIKKworIzogdmVyc2lvbi5jOjEwMzAKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJwb2Ryb2JuZWqaaWUgaW5mb3Jt4WNpZSB67XNrYXRlIHBvbW9jb3UgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzoxMDQ1Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAiYmxpnpppZSBpbmZvcm3hY2llIHYgbWVudSAgUG9tb2Nu7WstPlNhbW9zdGF0bukiCisKKyM6IHZlcnNpb24uYzoxMDQ3Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiU3D6mp1hbSBtb2RlbGVzcywgcO1zYW79IHRleHQgamUgdmxvnmVu/SIKKworIzogdmVyc2lvbi5jOjEwNDgKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBJbnNlcnQgTW9kZSAgIgorbXNnc3RyICJtZW51INpwcmF2eS0+R2xvYuFsbmUgbW+ebm9zdGktPlByZXBu+p0gcmWeaW0gdmxvnmVuaWEgIgorCisjOiB2ZXJzaW9uLmM6MTA0OQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUgZHZhIHJlnmlteSAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDUzCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAibWVudSDacHJhdnktPkdsb2LhbG5lIG1vnm5vc3R0LT5QcmVwbvqdIFZpIGtvbXBhdGliaWxu/SByZZ7tbSIKKworIzogdmVyc2lvbi5jOjEwNTQKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgIHByZSBwcmVkdm9sZW7pIHZsYXN0bm9zdGkgVmltICAgIgorCisjOiB2ZXJzaW9uLmM6MTEwMAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIlZBUk9WQU5JRTogZGV0ZWtvdmFu6SBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6MTEwMworbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInphZGFqdGUgOmhlbHAgd2luZG93czk1PEVudGVyPiBwcmUgcG9kcm9ibmVqmmllIGluZm9ybeFjaWUiCisKKyM6IHdpbmRvdy5jOjIwMQorbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiBOZW7hamRlbukgnmlhZG5lIG9rbm8gbuFovmFkdSIKKworIzogd2luZG93LmM6NTgwCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogT2tubyBzYSBuZWThIHJvemRlbGmdIHrhcm92ZfIgdG9wbGVmdCBhIGJvdHJpZ2h0IgorCisjOiB3aW5kb3cuYzoxMzM5Cittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiBOZWThIHNhIHJvdG92YZ0sIGFrIGplIGlu6SBva25vIHJvemRlbGVu6SIKKworIzogd2luZG93LmM6MTg0MQorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogUG9zbGVkbukgb2tubyBzYSBuZWThIHphdHZvcmmdIgorCisjOiB3aW5kb3cuYzoyNTA1Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIlWeIGV4aXN0dWplIGliYSBqZWRubyBva25vIgorCisjOiB3aW5kb3cuYzoyNTUyCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IElu6SBva25vIG9ic2FodWplIHptZW55IgorCisjOiB3aW5kb3cuYzo0Mzc5Cittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogUG9kIGt1cnpvcm9tIHNhIG5lbmFjaOFkemEgbuF6b3Ygc/pib3J1IgorCisjOiB3aW5kb3cuYzo0NDk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogU/pib3IgXCIlc1wiIHNhIG5lZOEgdiBjZHBhdGggbuFqc50iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg2Cittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJVcHJhdmmdIHMgdmlhY27hc29ibv0mbSBWaW1vbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTIKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIlVwcmF2aZ0gcyBqZWRu/W0gJlZpbW9tIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYwNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJVcHJhdmmdIHMgJlZpbW9tIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIlVwcmF2aZ0gcyBleGlzdHVq+mNpbSBWaW1vbSAtICYiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NzUyCittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIlVwcmF2aZ0gdnlicmFu6SBz+mJvcnkgcyBWaW1vbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTEgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjkKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIkNoeWJhIHZ5dHbhcmFjaWVobyBwcm9jZXN1OiBTa29udHJvbHVqdGUsIOhpIGplIGd2aW0gdm8gdmGaZWogY2VzdGUhIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNgorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NzAKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiY2h5YmEgZ3ZpbWV4dC5kbGwiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA1Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICJQcu1saZogZGxo4SBjZXN0YSEiCisKKyM6IGdsb2JhbHMuaDo5MDAKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLUJ1ZmZlciBuZW9ic2FodWplIJ5pYWRueSByaWFkb2stLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDQyCittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJQcu1rYXogcHJlcnWaZW79IgorCisjOiBnbG9iYWxzLmg6MTA0MworbXNnaWQgIkFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJKZSB2eZ5hZG92YW79IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTA0NAorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBwbyBcXCBieSBtYWxvIG5hc2xlZG92YZ0gLy4gPyBhbGVibyAmIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIiIKKyJFMTE6IENoeWJu/SBwcu1rYXogdiBva25lIHBy7Wthem926WhvIHJpYWRrdTsgPEVudGVyPiBzcHVzdO10ZSwgQ1RSTC1DICIKKyJ2eXBuZXRlIgorCisjOiBnbG9iYWxzLmg6MTA0OAorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiIgorIkUxMjogUHLta2F6IG5pZSBqZSB6IGV4cmMvdmltcmMgdiBha3R14Wxub20gYWRyZXPhcmkgYWxlYm8gcHJpIGi+YWRhbu0gdGFndSAiCisicG92b2xlbv0uIgorCisjOiBnbG9iYWxzLmg6MTA0OQorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiBT+mJvciBleGlzdHVqZSAocG91nml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBnbG9iYWxzLmg6MTA1MAorbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJQcu1rYXogemx5aGFsIgorCisjOiBnbG9iYWxzLmg6MTA1MQorbXNnaWQgIkludGVybmFsIGVycm9yIgorbXNnc3RyICJWbvp0b3Ju4SBjaHliYSIKKworIzogZ2xvYmFscy5oOjEwNTIKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiUHJlcnWaZW7pIgorCisjOiBnbG9iYWxzLmg6MTA1MworbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IENoeWJu4SBhZHJlc2EiCisKKyM6IGdsb2JhbHMuaDoxMDU0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50OiAlcyIKKworIzogZ2xvYmFscy5oOjEwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IENoeWJu/SB2/XJhejogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDU5Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IENoeWJu/SByb3pzYWgiCisKKyM6IGdsb2JhbHMuaDoxMDYwCittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJDaHlibv0gcHLta2F6IgorCisjOiBnbG9iYWxzLmg6MTA2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIgamUgYWRyZXPhcm9tIgorCisjOiBnbG9iYWxzLmg6MTA2NQorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogTmVv6GVr4XZhbukgem5ha3kgcHJlZCAnPSciCisKKyM6IGdsb2JhbHMuaDoxMDY3Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IFpuYehrYSBt4SBjaHlibukg6O1zbG8gcmlhZGt1IgorCisjOiBnbG9iYWxzLmg6MTA2OAorbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICJFMjA6IFpuYehrYSBuaWUgamUgbmFzdGF2ZW7hIgorCisjOiBnbG9iYWxzLmg6MTA2OQorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBOZWThIHNhIG1lbmmdLCBqZSBuYXN0YXZlbuEgdm++YmEgJ21vZGlmaWFibGUnIgorCisjOiBnbG9iYWxzLmg6MTA3MAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogU2tyaXB0IHZub3Jlbv0gcHLtbGmaIGhsYm9rbyIKKworIzogZ2xvYmFscy5oOjEwNzEKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6II5pYWRueSBhbHRlcm5hdO12bnkgc/pib3IiCisKKyM6IGdsb2JhbHMuaDoxMDcyCittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBUYWvhIHNrcmF0a2EgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwNzMKK21zZ2lkICJObyAhIGFsbG93ZWQiCittc2dzdHIgIiEgbmllIGplIHBvdm9sZW7pIgorCisjOiBnbG9iYWxzLmg6MTA3NQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogTmVk4SBzYSBwb3We7Z0gR1VJOiBuZWJvbG8gemFwbnV06SBwcmkgcHJla2xhZGUgcHJvZ3JhbXUiCisKKyM6IGdsb2JhbHMuaDoxMDc4Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IE5lZOEgc2EgcG91nu2dIGhlYnJlanNr/SByZZ5pbTogIG5lYm9sIHphcG51dP0gcHJpIHByZWtsYWRlIHByb2dyYW11XG4iCisKKyM6IGdsb2JhbHMuaDoxMDgxCittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogTmVk4SBzYSBwb3We7Z0gZmFyc2kgcmWeaW06ICBuZWJvbCB6YXBudXT9IHByaSBwcmVrbGFkZSBwcm9ncmFtdVxuIgorCisjOiBnbG9iYWxzLmg6MTA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IFNrdXBpbmEgenbtcmF6bmVuaWEgJXMgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwODYKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IFphdGlhviBuaWUgamUgnmlhZG55IHZsb55lbv0gdGV4dCIKKworIzogZ2xvYmFscy5oOjEwODcKK21zZ2lkICJFMzA6IE5vIHByZXZpb3VzIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiRTMwOiCOaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHLta2F6b3b9IHJpYWRvayIKKworIzogZ2xvYmFscy5oOjEwODgKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiCOaWFkbmUgdGFr6SBtYXBvdmFuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgIo5pYWRuYSB6aG9kYSIKKworIzogZ2xvYmFscy5oOjEwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICKOaWFkbmEgemhvZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA5MQorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6II5pYWRueSBu4XpvdiBz+mJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiCOaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHJpc2z6Y2hhavpjaSBzcHLhdm55IHb9cmF6IgorCisjOiBnbG9iYWxzLmg6MTA5MworbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiCOaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHLta2F6IgorCisjOiBnbG9iYWxzLmg6MTA5NAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6II5pYWRueSBwcmVkY2jhZHphavpjaSByZWd1bOFybnkgdv1yYXoiCisKKyM6IGdsb2JhbHMuaDoxMDk1Cittc2dpZCAiTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAiUm96c2FoIG5pZSBqZSBwb3ZvbGVu/SIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBOZWRvc3RhdG9rIG1pZXN0YSIKKworIzogZ2xvYmFscy5oOjEwOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIk5lZOEgc2Egdnl0dm9yaZ0gc/pib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJOZWThIHNhIHrtc2thnSBu4XpvdiBkb+hhc27paG8gc/pib3J1IgorCisjOiBnbG9iYWxzLmg6MTEwMQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIk5lZOEgc2Egb3R2b3JpnSBz+mJvciAlcyIKKworIzogZ2xvYmFscy5oOjExMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJOZWThIHNhIOjtdGGdIHP6Ym9yICVzIgorCisjOiBnbG9iYWxzLmg6MTEwMworbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiBOZXVsb55lbukgem1lbnkgKHBvdZ5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZ2xvYmFscy5oOjExMDQKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODogTnVsb3b9IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTEwNgorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IE/oYWvhdmFu6SDo7XNsbyIKKworIzogZ2xvYmFscy5oOjExMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiBOZWThIHNhIG90dm9yaZ0gY2h5Ym92/SBz+mJvciAlcyIKKworIzogZ2xvYmFscy5oOjExMTIKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE5lZG9zdGF0b2sgcGFt5HRpISIKKworIzogZ2xvYmFscy5oOjExMTUKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiVnpvciBuZW7hamRlbv0iCisKKyM6IGdsb2JhbHMuaDoxMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiVnpvciBuZW7hamRlbv06ICVzIgorCisjOiBnbG9iYWxzLmg6MTExOAorbXNnaWQgIkFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkFyZ3VtZW50IG11c+0gYnmdIGtsYWRu/SIKKworIzogZ2xvYmFscy5oOjExMjAKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiCOaWFkbmUgY2h5YnkiCisKKyM6IGdsb2JhbHMuaDoxMTIyCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBQb5prb2Rlbv0gcmWdYXphYyBwcmUgdnlovmFk4XZhbmllIgorCisjOiBnbG9iYWxzLmg6MTEyMworbXNnaWQgIkU0NDogQ29ycnVwdGVkIHJlZ2V4cCBwcm9ncmFtIgorbXNnc3RyICJFNDQ6IFBvmmtvZGVu/SByZWdleHAgcHJvZ3JhbSIKKworIzogZ2xvYmFscy5oOjExMjQKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IG5hc3RhdmVu4SB2b75iYSAnaWJhX3ByZV/o7XRhbmllJyAocG91nml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBnbG9iYWxzLmg6MTEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBOZWThIHNhIG5hc3RhdmmdIHByZW1lbm7hIGliYV9wcmVf6O10YW5pZSBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMTI5Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBDaHliYSBwcmkg6O10YW7tIGNoeWJvdulobyBz+mJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMTMyCittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IE5pZSBqZSB2IGJlenBl6G5vc3RuZWogc2NocuFua2UgcG92b2xlbukiCisKKyM6IGdsb2JhbHMuaDoxMTM0Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IENoeWJu4SBob2Rub3RhIHByZW1lbm5laiAnc2Nyb2xsJyIKKworIzogZ2xvYmFscy5oOjExMzUKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IHZvvmJhICdzaGVsbCcgamUgcHLhemRuYSIKKworIzogZ2xvYmFscy5oOjExMzYKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiBDaHliYSBwcmkgdXphdHbhcmFu7SBvZGtsYWRhY2llaG8gc/pib3J1IgorCisjOiBnbG9iYWxzLmg6MTEzNworbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IHpvem5hbSB0YWdvdiBqZSBwcuF6ZG55IgorCisjOiBnbG9iYWxzLmg6MTEzOAorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiBQcu1rYXogamUgcHLtbGmaIHpsb55pdP0iCisKKyM6IGdsb2JhbHMuaDoxMTM5Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IE7hem92IGplIHBy7WxpmiBkbGj9IgorCisjOiBnbG9iYWxzLmg6MTE0MAorbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiBQcu1saZogbW5vaG8gWyIKKworIzogZ2xvYmFscy5oOjExNDEKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogUHLtbGmaIG1ub2hvIG7henZvdiBz+mJvcm92IgorCisjOiBnbG9iYWxzLmg6MTE0MgorbXNnaWQgIlRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIk5hZGJ5dG/obukgem5ha3kgbmEga29uY2kiCisKKyM6IGdsb2JhbHMuaDoxMTQzCittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODogTmV6buFtYSB6bmHoa2EiCisKKyM6IGdsb2JhbHMuaDoxMTQ0Cittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBOZWThIHNhIGV4cGFuZG92YZ0gnm9s7Wtvdukgem5ha3kgKHdpbGRjYXJkcykiCisKKyM6IGdsb2JhbHMuaDoxMTQ1Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IENoeWJhIHByaSB1a2xhZGFu7SIKKworIzogZ2xvYmFscy5oOjExNDYKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICJOdWxvdv0gcG/oZXQiCisKKyM6IGdsb2JhbHMuaDoxMTQ4Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBQb3WeaXRpZSA8U0lEPiBtaW1vIGtvbnRleHQgc2tyaXB0dSIKKworIzogZ2xvYmFscy5oOjExNTEKK21zZ2lkICJFNDQ5OiBJbnZhbGlkIGV4cHJlc3Npb24gcmVjZWl2ZWQiCittc2dzdHIgIkU0NDk6IEJvbCBwcmlqYXT9IGNoeWJu/SB2/XJheiIKKwpkaWZmIC0tZ2l0IGEvc3JjL3BvL3NrLnBvIGIvc3JjL3BvL3NrLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vc2sucG8KQEAgLTAsMCArMSw1OTk4IEBACisjIFNsb3ZhayB0cmFuc2xhdGlvbiBvZiB2aW0KKyMgTWFydGluIExhY2tvIDxsYWNrb0Bob3N0LnNrPiwgMjAwMS4KKyMKKyMgT3JpZ2luYWwgdHJhbnNsYXRpb25zLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogdmltXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDItMDMtMjYgMjE6NTQrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDItMDMtMjYgMjE6NThDRVNUXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNYXJ0aW4gTGFja28gPGxhY2tvQGhvc3Quc2s+XG4iCisiTGFuZ3VhZ2UtVGVhbTogU2xvdmFrIDxzay1pMThuQGxpc3RzLmxpbnV4LnNrPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTJcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IEtCYWJlbCAwLjkuNVxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogTmVk4SBzYSBhbG9rb3ZhuyBidWZmZXIsIGtvbujtbS4uLiIKKworIzogYnVmZmVyLmM6MTAwCittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogTmVk4SBzYSBhbG9rb3ZhuyBidWZmZXIsIHBvdb5pamVtIGlu/S4uLiIKKworIzogYnVmZmVyLmM6NzA2Cittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICKuaWFkbnkgYnVmZmVyIG5lYm9sIG7hamRlbv0iCisKKyM6IGJ1ZmZlci5jOjcwOAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICKuaWFkbnkgYnVmZmVyIG5lYm9sIHZ5bWF6YW79IgorCisjOiBidWZmZXIuYzo3MTAKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICKuaWFkbnkgYnVmZmVyIG5lYm9sIHZ5bWF6YW79IgorCisjOiBidWZmZXIuYzo3MTgKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAicG/oZXQgZGVha3Rpdm92YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICJwb+hldCBkZWFrdGl2b3Zhbv1jaCBidWZmZXJvdjogJWQiCisKKyM6IGJ1ZmZlci5jOjcyNQorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjcyNworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6ICVkIgorCisjOiBidWZmZXIuYzo3MzIKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggYnVmZmVyb3Y6IDEiCisKKyM6IGJ1ZmZlci5jOjczNAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAicG/oZXQgdnltYXphbv1jaCBidWZmZXJvdjogJWQiCisKKyM6IGJ1ZmZlci5jOjc5MQorbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IE5lYm9sIG7hamRlbv0gvmlhZG55IHptZW5lbv0gYnVmZmVyIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6ODMwCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IE5lbmG5aWVsIHNvbSC+aWFkbnkgYnVmZmVyIgorCisjOiBidWZmZXIuYzo4NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiBOZWThIHNhIHByZXNrb+hpuyBuYSBidWZmZXIgJWxkIgorCisjOiBidWZmZXIuYzo4NDUKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogWmEgcG9zbGVkbv0gYnVmZmVyIHNhIG5lZOEgcHJlc2tv6Gm7IgorCisjOiBidWZmZXIuYzo4NDcKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6IFByZWQgcHJ2/SBidWZmZXIgc2EgbmVk4SBwcmVza2/oabsiCisKKyM6IGJ1ZmZlci5jOjg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU4OTogWm1lbnkgdiBidWZmZXJpICVsZCBuZWJvbHkgdWxvvmVu6SAoISBwcmUgdnlu+nRlbmllKSIKKworIzogYnVmZmVyLmM6ODg3Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IFBvc2xlZG79IGJ1ZmZlciBzYSBuZWThIG9kc3Ry4W5puyIKKworIzogYnVmZmVyLmM6MTMzNworbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IFZhcm92YW5pZTogcHJldGXoZW5pZSB6b3puYW11IHMgbuF6dmFtaSBz+mJvcm92IgorCisjOiBidWZmZXIuYzoxNTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5MjogYnVmZmVyICVsZCBuZW7hamRlbv0iCisKKyM6IGJ1ZmZlci5jOjE3MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBWem9ydSAlcyB2eWhvdnVqZSB2aWFjIGJ1ZmZlcm92IgorCisjOiBidWZmZXIuYzoxNzMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NDogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvciAlcyIKK21zZ3N0ciAiRTk0OiBWem9ydSAlcyBuZXZ5aG92dWplIL5pYWRueSBidWZmZXIiCisKKyM6IGJ1ZmZlci5jOjIxMzYgZXhfZG9jbWQuYzo2MDg5CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIgorbXNnc3RyICJyaWFkb2sgJWxkIgorCisjOiBidWZmZXIuYzoyMjE5Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogQnVmZmVyIHRha+lob3RvIG1lbmEgdb4gZXhpc3R1amUiCisKKyM6IGJ1ZmZlci5jOjI1MTIKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFt6bWVuZW79XSIKKworIzogYnVmZmVyLmM6MjUxNworbXNnaWQgIltOb3QgZWRpdGVkXSIKK21zZ3N0ciAiW25ldXByYXZvdmFu/V0iCisKKyM6IGJ1ZmZlci5jOjI1MjIKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbbm92/SBz+mJvcl0iCisKKyM6IGJ1ZmZlci5jOjI1MjMKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbY2h5YnkgcHJpIOjtdGFu7V0iCisKKyM6IGJ1ZmZlci5jOjI1MjUgZmlsZWlvLmM6MTc3NworbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIltpYmEgcHJlIOjtdGFuaWVdIgorCisjOiBidWZmZXIuYzoyNTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAiMSByaWFkb2sgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICJyaWFka292OiAlbGQgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgInJpYWRvayAlbGQgeiAlbGQgLS0lZCUlLS0gc3TlcGVjIgorCisjOiBidWZmZXIuYzoyNjM3Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbvmlhZG55IHP6Ym9yXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyNjc3Cittc2dpZCAiaGVscCIKK21zZ3N0ciAicG9tb2Nu7WsiCisKKyM6IGJ1ZmZlci5jOjMxODYgc2NyZWVuLmM6NDc0MworbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW3BvbW9jbu1rXSIKKworIzogYnVmZmVyLmM6MzIxOCBzY3JlZW4uYzo0NzQ5Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbbuFotWFkXSIKKworIzogYnVmZmVyLmM6MzQyNAorbXNnaWQgIkFsbCIKK21zZ3N0ciAiVrlldGtvIgorCisjOiBidWZmZXIuYzozNDI0Cittc2dpZCAiQm90IgorbXNnc3RyICJLb25pZWMiCisKKyM6IGJ1ZmZlci5jOjM0MjYKK21zZ2lkICJUb3AiCittc2dzdHIgIlph6GlhdG9rIgorCisjOiBidWZmZXIuYzo0MTYyCittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIHpvem5hbSBidWZmZXJvdjpcbiIKKworIzogYnVmZmVyLmM6NDE5NQorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW3pvem5hbSBjaP1iXSIKKworIzogYnVmZmVyLmM6NDIwOCBtZW1saW5lLmM6MTUxMworbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW75pYWRueSBz+mJvcl0iCisKKyM6IGJ1ZmZlci5jOjQ0MjgKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBabmFreSAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiWm5ha3kgcHJlICVzOiIKKworIzogYnVmZmVyLmM6NDQ0NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgbGluZT0lbGQgIGlkPSVkICBtZW5vPSVzIgorCisjOiBkaWZmLmM6MTMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NjogQ2FuIG5vdCBkaWZmIG1vcmUgdGhhbiAlbGQgYnVmZmVycyIKK21zZ3N0ciAiRTk2OiBOZW30vmVtIHBvcm92bmG7IHZpYWMgYWtvICVsZCBidWZmZXJvdiIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiBOZWRhavogc2Egdnl0dm9yabsgcG9yb3ZuYW5pYSIKKworIzogZGlmZi5jOjc0NworbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIk9wcmF2bv0gc/pib3IiCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IE5lZOEgc2Eg6O10Ybsgdv1zdHVwIHBvcm92bmFuaWEiCisKKyM6IGRpZmYuYzoxNzMyCittc2dpZCAiRTk5OiBDdXJyZW50IGJ1ZmZlciBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFOTk6IEFrdHXhbG55IGJ1ZmZlciBuaWUgamUgdiBwb3Jvdm5hY29tIG3zZGUiCisKKyM6IGRpZmYuYzoxNzQ0Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogViBwb3Jvdm7hdmFjb20gbfNkZSBzYSBuZW5hY2jhZHphIGlu/SBidWZmZXIiCisKKyM6IGRpZmYuYzoxNzUyCittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiBWaWFjIGFrbyBkdmEgYnVmZmVyeSB2IHBvcm92buF2YWNvbSBt82RlOyBuZXZpZW0sIGt0b3L9IHBvdb5puyIKKworIzogZGlmZi5jOjE3NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiBOZWThIHNhIG7hanO7IGJ1ZmZlciBcIiVzXCIiCisKKyM6IGRpZmYuYzoxNzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogQnVmZmVyIFwiJXNcIiBuaWUgamUgdiBwb3Jvdm7hdmFjb20gbfNkZSIKKworIzogZGlncmFwaC5jOjIxNzIKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDogZGlhZ3JhcGggbmVzbWllIG9ic2Fob3ZhuyBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQ0Cittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJNYXBhIGts4XZlcyBuZW7hamRlbuEiCisKKyM6IGRpZ3JhcGguYzoyMzcxCittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiBQb3W+aXRlIDpsb2Fka2V5bWFwIHYgc/pib3JlLCBrdG9y/SBuaWUgamUgemRyb2pvdv0iCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIERvcGzyb3ZhbmllIGu1+uhvdv1jaCBzbG92ICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIHJlvmltICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBNaWVzdG5lIGRvcOXyYW5pZSBrtfrob3b9Y2ggc2xvdiAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBjZWz9Y2ggcmlhZGtvdiAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIERvcGzyb3ZhbmllIG7henZvdiBz+mJvcm92ICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdmFuaWUgdGFnb3YgKF5dL15OL15QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSB2em9ydSBjaWVzdCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBkZWZpbu1jae0gKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdmFuaWUgcG9ktWEgc2xvdm7ta2EgKF5LL15OL15QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVC9eTi9eUCkiCittc2dzdHIgIiBEb3Bs8m92YW5pZSBwb2S1YSB0ZXphdXJ1ICheVC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgRG9wbPJvdvJvdmFuaWUgcHLta2F6b3bpaG8gcmlhZGthICheVi9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJLb25pZWMgb2RzdGF2Y2EiCisKKyM6IGVkaXQuYzo5MDcKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgInZvtWJhICd0aGVzYXVydXMnIGplIHBy4XpkbmEiCisKKyM6IGVkaXQuYzoxMDgzCittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAidm+1YmEgJ2RpY3Rpb25hcnknIGplIHBy4XpkbmEiCisKKyM6IGVkaXQuYzoyMDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJwcmVotWFk4XZhbSBzbG92bu1rICVzIgorCisjOiBlZGl0LmM6MjE5OAorbXNnaWQgIiAoaW5zZXJ0KSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiIChpbnNlcnQpIFJvbG92YW5pZSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjIwMAorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAocmVwbGFjZSkgUm9sb3ZhbmllICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiUHJlaLVhZOF2YW06ICVzIgorCisjOiBlZGl0LmM6MjU0NworbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICJQcmVotWFk4XZhbSB0YWd5LiIKKworIzogZWRpdC5jOjMyMDcKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIgUHJpZOF2YW0iCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzI1NgorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gSLVhZOFtLi4uIgorCisjOiBlZGl0LmM6MzMxMgorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIlb9Y2hvZHppYSBwb2RvYmEiCisKKyM6IGVkaXQuYzozMzE3Cittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIlNsb3ZvIHogaW7paG8gcmlhZGt1IgorCisjOiBlZGl0LmM6MzMyMgorbXNnaWQgIlRoZSBvbmx5IG1hdGNoIgorbXNnc3RyICJKZWRpbuEgemhvZGEiCisKKyM6IGVkaXQuYzozMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICJ6aG9kYSAlZCB6ICVkIgorCisjOiBlZGl0LmM6MzM4NAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAiemhvZGEgJWQiCisKKyM6IGV2YWwuYzo2OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiBOZXpu4W1hIHByZW1lbm7hOiBcIiVzXCIiCisKKyM6IGV2YWwuYzo5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiBDaP1iavogeuF2b3JreTogJXMiCisKKyM6IGV2YWwuYzoxMDU3IGV2YWwuYzoxMDczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogUHJlbWVubuEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGV2YWwuYzoxMzE1Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiBQbyAnPycgY2j9YmEgJzonIgorCisjOiBldmFsLmM6MTkyOQorbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiBDaP1iYSAnKSciCisKKyM6IGV2YWwuYzoxOTc5Cittc2dpZCAiRTExMTogTWlzc2luZyAnXSciCittc2dzdHIgIkUxMTE6IENo/WJhICddJyIKKworIzogZXZhbC5jOjIwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IENo/WJhIG1lbm8gdm+1Ynk6ICVzIgorCisjOiBldmFsLmM6MjA3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IE5lem7hbWEgdm+1YmE6ICVzIgorCisjOiBldmFsLmM6MjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDogQ2j9Ymr6IHV2b2R6b3ZreTogJXMiCisKKyM6IGV2YWwuYzoyMjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBDaP1iavogdXZvZHpvdmt5OiAlcyIKKworIzogZXZhbC5jOjI1NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiBDaHlibukgYXJndW1lbnR5IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE3OiBVbmtub3duIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExNzogTmV6buFtYSBmdW5rY2lhOiAlcyIKKworIzogZXZhbC5jOjI1NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IFBy7WxpuSBtbm9obyBhcmd1bWVudG92IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiBQcu1sabkgbeFsbyBhcmd1bWVudG92IHByZSBmdW5rY2l1ICVzIgorCisjOiBldmFsLmM6MjU3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IFBvdb5pdGllIDxTSUQ+IG1pbW8ga29udGV4dCBza3JpcHR1OiAlcyIKKworIzogZXZhbC5jOjMxNzIgZ3VpLmM6Mzk4NAorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjOiBldmFsLmM6MzY3OAorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCByaWFka3k6ICIKKworIzogZXZhbC5jOjQ3OTQKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZPa1xuIgorIiZacnW5absiCisKKyM6IGV2YWwuYzo1NjI2Cittc2dpZCAiRTI0MDogTm8gY29ubmVjdGlvbiB0byBWaW0gc2VydmVyIgorbXNnc3RyICJFMjQwOiBOZWV4aXN0dWplIHByaXBvamVuaWUgayBWaW0gc2VydmVydSIKKworIzogZXZhbC5jOjU3MTYKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTIyNzogTmVt9L5lbSDo7XRhuyBvZHBvdmXvIHNlcnZyYSIKKworIzogZXZhbC5jOjU3NDEKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6IE5lbfS+ZW0gcG9zbGG7IGtsaWVudG92aSIKKworIzogZXZhbC5jOjU3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IE5lbfS+ZW0gcG9zbGG7IG5hICVzIgorCisjOiBldmFsLmM6NTg4NAorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKENoeWJu/SkiCisKKyM6IGV2YWwuYzo2ODk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IE5lZGVmaW5vdmFu4SBwcmVtZW5u4TogJXMiCisKKyM6IGV2YWwuYzo3NTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTEyOiBGdW5rY2lhICVzIHW+IGV4aXN0dWplLiBQb3W+aXRlICEgcHJlIGplaiBuYWhyYWRlbmllLiIKKworIzogZXZhbC5jOjc2MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzogTmVkZWZpbm92YW7hIGZ1bmtjaWE6ICVzIgorCisjOiBldmFsLmM6NzY0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTI0OiBNaXNzaW5nICcoJzogJXMiCittc2dzdHIgIkUxMjQ6IENo/WJhICcoJzogJXMiCisKKyM6IGV2YWwuYzo3NjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo3NzY2Cittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IENo/WJhIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjc4NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6IE5lZOEgc2EgcHJlZGVmaW5vdmG7IGZ1bmtjaWEgJXM6IGplIHBvdb7tdmFu4SIKKworIzogZXZhbC5jOjc5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogTuF6b3YgZnVua2NpZSBtdXPtIHph6O1uYbsgdmW1a/1tIHDtc21lbm9tOiAlcyIKKworIzogZXZhbC5jOjc5MDkKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiBKZSB2eb5hZG92YW7pIG1lbm8gZnVua2NpZSIKKworIzogZXZhbC5jOjgwMDIKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgImZ1bmtjaWEgIgorCisjOiBldmFsLmM6ODExNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiBOZWRlZmlub3ZhbuEgZnVua2NpYTogJXMiCisKKyM6IGV2YWwuYzo4MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTogTmVk4SBzYSB2eW1hemG7IGZ1bmtjaWEgJXM6IGplIHW+IHBvdb7tdmFu4SIKKworIzogZXZhbC5jOjgxNjkKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiBaYW5vcmVuaWUgZnVua2Np7SBqZSBobGK5aWUgbmW+ICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjIwCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgInZvbOFtICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MjQ1IGV4X2NtZHMyLmM6MTk4OAorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJwb2tyYeh1amVtIHYgJXMiCisKKyM6IGV2YWwuYzo4Mjk5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gbWltbyBmdW5rY2l1IgorCisjOiBldmFsLmM6ODM3NworIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiZG9rb27oZW7pICVzLiBO4XZyYXRvduEgaG9kbm90YSAlbGQiCisKKyM6IGV2YWwuYzo4MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgImRva29u6GVu6SAlcy4gTuF2cmF0b3bhIGhvZG5vdGEgXCIlc1wiIgorCisjOiBldmFsLmM6ODUyMQorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIGdsb2LhbG5lIHByZW1lbm7pOlxuIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICC5ZXN0buFzdGtvdm8gJTAyeCwgIG9zbWnoa292byAlMDNvIgorCisjOiBleF9jbWRzLmM6NDI4Cittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IFByZWtyeXRpZSByaWFka292IHNlYm91IHNhbf1taSIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAicG/oZXQgcHJlcnW5ZW79Y2ggcmlhZGtvdjogMSIKKworIzogZXhfY21kcy5jOjQ5OQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgInBv6GV0IHByZXJ1uWVu/WNoIHJpYWRrb3Y6ICVsZCIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgInBv6GV0IGZpbHRyb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IGV4X2NtZHMuYzo5MTgKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiBBdXRvbWF0aWNr6SBwcu1rYXp5ICpGaWx0ZXIqIG5lc21pZSBtZW5puyBha3R14WxueSBidWZmZXIiCisKKyM6IGV4X2NtZHMuYzoxMDAzCittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbTmV1bG++ZW7pIHptZW55XVxuIgorCisjOiBleF9jbWRzLmM6MTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgInZpbWluZm86ICVzIG5hIHJpYWRrdTogIgorCisjOiBleF9jbWRzLmM6MTI1MworbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiBwcu1sabkgbW5vaG8gY2j9YiwgcHJlc2tha3VqZW0gemJ5dG9rIHP6Ym9ydSIKKworIzogZXhfY21kcy5jOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICLI7XRhbSB2aW1pbmZvIHP6Ym9yIFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIGluZm9ybeFjaWUiCisKKyM6IGV4X2NtZHMuYzoxMjg0Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgem5h6Gt5IgorCisjOiBleF9jbWRzLmM6MTI4NQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiBaTFlIQUxPIgorCisjOiBleF9jbWRzLmM6MTM3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogRG8gdmltaW5mbyBz+mJvcnUgJXMgc2EgbmVk4SB6YXBpc292YbsiCisKKyM6IGV4X2NtZHMuYzoxNTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IE5lZOEgc2EgdWxvvmm7IHZpbWluZm8gc/pib3IgJXMhIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgIlVrbOFk4W0gdmltaW5mbyBz+mJvcnUgXCIlc1wiIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgVGVudG8gdmltaW5mbyBz+mJvciBib2wgdnl0dm9yZW79IGVkaXRvcm9tIFZpbSAlcy5cbiIKKworIzogZXhfY21kcy5jOjE2MTIKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIFBva2lhtSBidWRldGUgb3BhdHJubv0sIG30vmV0ZSBobyB1cHJhdm92YbsuXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjE0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgSG9kbm90YSAnZW5jb2RpbmcnIHBv6GFzIHrhcGlzdSB0b2hvdG8gc/pib3J1XG4iCisKKyM6IGV4X2NtZHMuYzoxNzEzCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICJOZXBy7XN0dXBu/SB6YehpYXRv6G79IHpuYWsiCisKKyM6IGV4X2NtZHMuYzoyMDUzIGV4X2NtZHMuYzoyMzEwIGV4X2NtZHMyLmM6NjAyCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAiVWxvvmm7IGFrbyIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMDk2Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IFP6Ym9yIGplIG5h6O10YW79IHYgaW5vYiBidWZmZXJlIgorCisjOiBleF9jbWRzLmM6MjEzMAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIlVsb75puyBuZfpwbG79IHP6Ym9yPyIKKworIzogZXhfY21kcy5jOjIxMzcKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogUG91vml0ZSAhIHByZSB1bG++ZW5pZSBuZfpwbG7paG8gYnVmZmVydSIKKworIzogZXhfY21kcy5jOjIyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICJQcmVw7XNhuyBz+mJvciBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogrmlhZG55IG7hem92IHP6Ym9ydSBwcmUgYnVmZmVyICVsZCIKKworIzogZXhfY21kcy5jOjIzNTMKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiBT+mJvciBuZWJvbCB1bG++ZW79OiB1a2xhZGFuaWUgamUgemFr4Xphbukgdm+1Ym91ICd3cml0ZSciCisKKyM6IGV4X2NtZHMuYzoyMzczCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgZm9yIFwiJS4qc1wiLlxuIgorIkRvIHlvdSB3aXNoIHRvIHdyaXRlIGFueXdheT8iCittc2dzdHIgIiIKKyJQcmUgXCIlLipzXCIgamUgbmFzdGF2ZW7hIHZvtWJhICdyZWFkb25seScgKGliYSBuYSDo7XRhbmllKS5cbiIKKyJQcmFqZXRlIHNpIGp1IHBvdGxh6Gm7PyIKKworIzogZXhfY21kcy5jOjI1MzgKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIlVwcmF2b3ZhuyBz+mJvciIKKworIzogZXhfY21kcy5jOjMwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9tYXRpY2vpIHBy7WthenkgbmVv6GFr4XZhbmUgem1hemFsaSBub3b9IGJ1ZmZlciAlcyIKKworIzogZXhfY21kcy5jOjMxOTMKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogbmXo7XNlbG79IGFyZ3VtZW50IHByZSA6eiIKKworIzogZXhfY21kcy5jOjMyNzgKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltIG5lcG92b2x1amUgcG91vml0aWUgcHLta2F6b3Ygc2hlbGx1IgorCisjOiBleF9jbWRzLmM6MzM4NQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3Vs4XJuZSB2/XJhenkgbmVzbfogYnm7IG9kZGVsZW7pIHDtc21lbmFtaSIKKworIzogZXhfY21kcy5jOjM3MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAibmFocmFkabsgJXMgKHkvbi9hL3EvSS9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDA5MgorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIocHJlcnW5ZW79KSAiCisKKyM6IGV4X2NtZHMuYzo0MDk2Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgInBv6GV0IG5haHJhZGVu7SBuYSByaWFkb2s6IDEiCisKKyM6IGV4X2NtZHMuYzo0MDk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICJwb+hldCBuYWhyYWRlbu0gbmEgcmlhZG9rOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo0MTAxCittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIG5hIDEgcmlhZGt1IgorCisjOiBleF9jbWRzLmM6NDEwMworIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgbmEgJWxkIHJpYWRrb3YiCisKKyM6IGV4X2NtZHMuYzo0MTU0Cittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiBnbG9iYWwgbmVk4SBzYSB2b2xhuyByZWt1cnrtdm5lIgorCisjOiBleF9jbWRzLmM6NDE4OQorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiBQcmkgcHLta2F6ZSBnbG9iYWwgY2j9YmEgcmVndWzhcm55IHb9cmF6IgorCisjOiBleF9jbWRzLmM6NDIzOAorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICJWem9yIG7hamRlbv0gbmEga2G+ZG9tIHJpYWRrdTogJXMiCisKKyM6IGV4X2NtZHMuYzo0MzE5Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBQb3NsZWRu/SBSZbthemVjIFBvZG5hZHBpc3U6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ0MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiCldXR1amVtLCBwcmUgJXMgbmllIGplIL5pYWRueSBwb21vY27tayIKKworIzogZXhfY21kcy5jOjQ0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICKldXR1amVtLCBz+mJvciBcIiVzXCIgcyBwb21vY27ta29tIG5lYm9sIG7hamRlbv0iCisKKyM6IGV4X2NtZHMuYzo0OTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIG5pZSBqZSBhZHJlc+Fyb20iCisKKyM6IGV4X2NtZHMuYzo0OTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiBOZWThIHNhIG90dm9yabsgJXMgcHJlIHrhcGlzIgorCisjOiBleF9jbWRzLmM6NDk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogTmVk4SBzYSBvdHZvcmm7ICVzIHByZSB64XBpcyIKKworIzogZXhfY21kcy5jOjUwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogRHVwbGljaXRu/SB0YWcgXCIlc1wiIHYgc/pib3JlICVzIgorCisjOiBleF9jbWRzLmM6NTEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IE5lem7hbWEgZnVua2NpYTogJXMiCisKKyM6IGV4X2NtZHMuYzo1MTU5Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IENo/WJhIGlkZW50aWZpa+F0b3IgcHJlIHNpZ24iCisKKyM6IGV4X2NtZHMuYzo1MjA1Cittc2dpZCAiRTI1NTogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTI1NTogUHLtbGm5IG1ub2hvIGRlZmlub3Zhbv1jaCBvem5h6GVu7SIKKworIzogZXhfY21kcy5jOjUyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiBDaHlibmUgb3puYehlbv0gdGV4dDogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjcxIGV4X2NtZHMuYzo1NDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IE5lem7hbWUgb3puYehlbmllOiAlcyIKKworIzogZXhfY21kcy5jOjUzMTcKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiBDaP1iYSDoaXNsbyBvem5h6GVuaWEiCisKKyM6IGV4X2NtZHMuYzo1Mzk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiBDaHlibukgbWVubyBidWZmZXJ1OiAlcyIKKworIzogZXhfY21kcy5jOjU0MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IENoeWJu6SBJRCBvem5h6GVuaWE6ICVsZCIKKworIzogZXhfY21kcy5jOjU2MDcKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIlt2eW1hemFu/V0iCisKKyM6IGV4X2NtZHMyLmM6NzAKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBsZWF2ZS4iCittc2dzdHIgIlNw+rm7YW0gcmW+aW0gbGFkZW5pYS4gUHJlIHVrb27oZW5pZSBuYXDtuXRlIFwiY29udFwiLiIKKworIzogZXhfY21kczIuYzo3NCBleF9kb2NtZC5jOjc3MQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgInJpYWRvayAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgInBy7WthejogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIkJvZCBwcmVydbllbmlhIHYgXCIlcyVzXCIgbmEgcmlhZGt1ICVsZCIKKworIzogZXhfY21kczIuYzozODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiBCb2QgcHJlcnW5ZW5pYSBuZW7hamRlbv06ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIk5lYm9saSBkZWZpbm92bukgvmlhZG5lIGJvZHkgcHJlcnW5ZW5pYSIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgIHJpYWRvayAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgIlVsb75puyB6bWVueSBkbyBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6NjI3IGV4X2RvY21kLmM6ODY2NworbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICJCZXogbWVuYSIKKworIzogZXhfY21kczIuYzo3NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IEJ1ZmZlciBcIiVzXCIgb2JzYWh1amUgbmV1bG++ZW7pIHptZW55IgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiVmFyb3ZhbmllOiBOZehha2Fu/SB2c3R1cCBkbyBpbulobyBidWZmZXJ1IChza29udHJvbHVqdGUgYXV0b21hdGlja+kgcHLta2F6eSkiCisKKyM6IGV4X2NtZHMyLmM6MTIwOAorbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2MzogUHJlIPpwcmF2dSBib2wgemFkYW79IGliYSBqZWRlbiBz+mJvciIKKworIzogZXhfY21kczIuYzoxMjEwCittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiBQcmVkIHBydv0gc/pib3Igc2EgbmVk4SBwcmVza2/oabsiCisKKyM6IGV4X2NtZHMyLmM6MTIxMgorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiBaYSBwb3NsZWRu/SBz+mJvciBzYSBuZWThIHByZXNrb+hpuyIKKworIzogZXhfY21kczIuYzoxNjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIGluIFwiJXNcIiIKK21zZ3N0ciAiSLVhZOFtIFwiJXNcIiB2IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICJItWFk4W0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE2ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAic/pib3IgXCIlc1wiIG5lYm9sIG7hamRlbv0gdiAncnVudGltZXBhdGgnIgorCisjOiBleF9jbWRzMi5jOjE3MTQKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAiWmRyb2pvdv0gc2tyaXB0IFZpbSIKKworIzogZXhfY21kczIuYzoxODMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiIG5pZSBqZSBhZHJlc+Fyb20iCisKKyM6IGV4X2NtZHMyLmM6MTg2MgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAibmVk4SBzYSBpbnRlcnByZXRvdmG7IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODY0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAicmlhZG9rICVsZDogbmVt9L5lIGJ5uyB6ZHJvaiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg3OAorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgImludGVycHJldHVqZW0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAicmlhZG9rICVsZCBqZSB6ZHJvam9tIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTg2CisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICJkb2tvbuhlbuEgaW50ZXJwcmV04WNpYSAlcyIKKworIzogZXhfY21kczIuYzoyMjg3Cittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTogVmFyb3ZhbmllOiBjaHlibv0gb2RkZbVvdmHoIHJpYWRrb3YuIE1vvm7hIGNo/WJhIF5NLiIKKworIzogZXhfY21kczIuYzoyMzM2Cittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2NzogOmZpbmlzaCBwb3W+aXTpIG1pbW8gaW50ZXJwcmV0b3Zhbv0gc/pib3IiCisKKyM6IGV4X2NtZHMyLmM6MjM2OQorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiA6ZmluaXNoIHBvdb5pdOkgbWltbyBpbnRlcnByZXRvdmFu/SBz+mJvciIKKworIzogZXhfY21kczIuYzoyODM4Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICLPYWy57SBuYSB0bGHoIgorCisjOiBleF9jbWRzMi5jOjI5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIlRsYejtbSBzdHJhbnUgJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjI5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIkvzcGlhICVkIHogJWQiCisKKyM6IGV4X2NtZHMyLmM6Mjk3NworIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAiVnl0bGHoZW7pOiAlcyIKKworIzogZXhfY21kczIuYzoyOTg0Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAiVGxh6CBib2xhIHpydbllbuEiCisKKyM6IGV4X2NtZHMyLmM6MzM2NworbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogTmVk4SBzYSB6YXBpc292YbsgZG8gdv1zdHVwbulobyBQb3N0U2NyaXB0b3bpaG8gc/pib3J1IgorCisjOiBleF9jbWRzMi5jOjQwNDIKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IE5lZOEgc2Egb3R2b3JpuyB2/XN0dXBu/SBQb3N0U2NyaXB0b3b9IHP6Ym9yIgorCisjOiBleF9jbWRzMi5jOjQwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogTmVk4SBzYSBvdHZvcmm7IHP6Ym9yIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogTmVk4SBzYSDo7XRhuyBQb3N0U2NyaXB0b3b9IHP6Ym9yIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0Mjg5Cittc2dpZCAiU2VuZGluZyB0byBwcmludGVyLi4uIgorbXNnc3RyICJQb3NpZWxhbSBuYSB0bGHoaWFyZfIuLi4iCisKKyM6IGV4X2NtZHMyLmM6NDI5MworbXNnaWQgIkUzNjU6IEZhaWxlZCB0byBwcmludCBQb3N0U2NyaXB0IGZpbGUiCittc2dzdHIgIkUzNjU6IFBvc3RTY3JpcHRvdv0gc/pib3Igc2EgbmVwb2RhcmlsbyB2eXRsYehpuyIKKworIzogZXhfY21kczIuYzo0Mjk1Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICJUbGHob3bhIPpsb2hhIGJvbGEgb2Rvc2xhbuEuIgorCisjOiBleF9jbWRzMi5jOjQ2OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIkFrdHXhbG55ICVzIGphenlrOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogTmVk4SBzYSBuYXN0YXZpuyBqYXp5ayBuYSBcIiVzXCIiCisKKyM6IGV4X2RvY21kLmM6NDkwCittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIlNw+rm7YW0gRXggcmW+aW0uIE5hcGm5dGUgXCJ2aXN1YWxcIiBwcmUgbuF2cmF0IGRvIE5vcm3hbG7taG8gcmW+aW11LiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTI2Cittc2dpZCAiQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIktvbmllYyBz+mJvcnUiCisKKyM6IGV4X2RvY21kLmM6NjAxCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBQcu1rYXogamUgcHLtbGm5IHpsb75pdP0iCisKKyM6IGV4X2RvY21kLmM6OTExCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IENo/WJhIDplbmR3aGlsZSIKKworIzogZXhfZG9jbWQuYzo5MTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogQ2j9YmEgOmVuZGlmIgorCisjOiBleF9kb2NtZC5jOjkyMworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIktvbmllYyB6ZHJvam926WhvIHP6Ym9ydSIKKworIzogZXhfZG9jbWQuYzo5MjQKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIktvbmllYyBmdW5rY2llIgorCisjOiBleF9kb2NtZC5jOjEzNDQKK21zZ2lkICJBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJOZWplZG5vem5h6G7pIHBvdb5pdGllIHBvdb7tdmF0ZbVvbSBkZWZpbm92YW7paG8gcHLta2F6dSIKKworIzogZXhfZG9jbWQuYzoxMzU4Cittc2dpZCAiTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJOaWUgamUgcHLta2F6b20gZWRpdG9ydSIKKworIzogZXhfZG9jbWQuYzoxNDQxCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICKuaWFkbnUgcGFuaWt1ISIKKworIzogZXhfZG9jbWQuYzoxNDYwCittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuIgorbXNnc3RyICJaYWRhbv0gc3DkdG79IHJvenNhaCIKKworIzogZXhfZG9jbWQuYzoxNDY5Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJaYWRhbv0gc3DkdG79IHJvenNhaC4gT0sgb2Rsb75puyIKKworIzogZXhfZG9jbWQuYzoxNTgwCittc2dpZCAiVXNlIHcgb3Igdz4+IgorbXNnc3RyICJQb3W+aXRlIHcg6Gkgdz4+IgorCisjOiBleF9kb2NtZC5jOjMwOTcKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IKV1dHVqZW0sIGFsZSB0ZW50byBwcu1rYXogbmllIGplIGltcGxlbWVudG92YW79IgorCisjOiBleF9kb2NtZC5jOjMyNjcKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogUHLtcHVzdG79IGplIGliYSBqZWRlbiBu4XpvdiBz+mJvcnUiCisKKyM6IGV4X2RvY21kLmM6MzgyMworIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIkW5dGUgem9zdOF2YWr6ICVkIHP6Ym9yb3YgayD6cHJhdmUuIENoY2V0ZSBuYXByaWVrIHRvbXUgdWtvbuhpuyBlZGl0b3I/IgorCisjOiBleF9kb2NtZC5jOjM4MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogRbl0ZSB6b3N04XZhamFq+iAlbGQgc/pib3J5IGsg+nByYXZlLiIKKworIzogZXhfZG9jbWQuYzozOTI0Cittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogdXNlICEgdG8gcmVkZWZpbmUiCittc2dzdHIgIkUxNzQ6IFBy7WtheiB1viBleGlzdHVqZTogcG91vml0ZSAhIHByZSBwcmVkZWZpbm92YW5pZSIKKworIzogZXhfZG9jbWQuYzo0MDI5Cittc2dpZCAiIgorIlxuIgorIiAgICBOYW1lICAgICAgICBBcmdzIFJhbmdlIENvbXBsZXRlICBEZWZpbml0aW9uIgorbXNnc3RyICIiCisiXG4iCisiICAgIE1lbm8gICAgICAgQXJncyBSb3pzYWgg2nBsbm9zuyAgRGVmaW7tY2lhIgorCisjOiBleF9kb2NtZC5jOjQxMTgKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgIk5lYm9saSBu4WpkZW7pIL5pYWRuZSBwb3W+aXZhdGW1b20gZGVmaW5vdmFu6SBwcu1rYXp5IgorCisjOiBleF9kb2NtZC5jOjQxNDkKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBOZWJvbGkgemFkYW7pIL5pYWRuZSB2bGFzdG5vc3RpIgorCisjOiBleF9kb2NtZC5jOjQyMDEKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6IENoeWJu/SBwb+hldCBhcmd1bWVudG92IgorCisjOiBleF9kb2NtZC5jOjQyMTYKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiBQb+hldCBuZW30vmUgYnm7IHphZGFu/SBkdmFrcuF0IgorCisjOiBleF9kb2NtZC5jOjQyMjYKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiBDaHlibuEgaW1wbGljaXRu4SBob2Rub3RhIHByZSBwb+hldCIKKworIzogZXhfZG9jbWQuYzo0MjU0Cittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiBwcmUgZG9wbG5lbmllIGplIHBvdHJlYm79IGFyZ3VtZW50IgorCisjOiBleF9kb2NtZC5jOjQyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IENoeWJu4SBob2Rub3RhIGRvcGxuZW5pYTogJXMiCisKKyM6IGV4X2RvY21kLmM6NDI4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IENoeWJu4SB2bGFzdG5vc7s6ICVzIgorCisjOiBleF9kb2NtZC5jOjQzMjIKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4MjogQ2h5Ym7pIG1lbm8gcHLta2F6dSIKKworIzogZXhfZG9jbWQuYzo0MzM3Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBQb3W+7XZhdGW1b20gZGVmaW5vdmFu6SBwcu1rYXp5IG11c2lhIHph6O1uYbsgdmW1a/1tIHDtc21lbm9tIgorCisjOiBleF9kb2NtZC5jOjQ0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IFBvdb7tdmF0ZbVvbSBkZWZpbm92YW79IHBy7WtheiAlcyBuZWV4aXN0dWplIgorCisjOiBleF9kb2NtZC5jOjQ4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBTY2jpbWEgZmFyaWViICVzIG5lbuFqZGVu4SIKKworIzogZXhfZG9jbWQuYzo0ODY1Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIlBvemRyYXVqZW0sIFZpbSBwb3W+7XZhdGW1ISIKKworIzogZXhfZG9jbWQuYzo1NTY5Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIlVwcmF2absgc/pib3IgdiBub3ZvbSBva25lIgorCisjOiBleF9kb2NtZC5jOjU4MzkKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIq5pYWRueSBvZGtsYWRhY+0gc/pib3IiCisKKyM6IGV4X2RvY21kLmM6NTk0MworbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICJQcmlwb2ppuyBz+mJvciIKKworIzogZXhfZG9jbWQuYzo2MDAyCittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiCuaWFkbnkgcHJlZGNo4WR6YWr6Y2kgYWRyZXPhciIKKworIzogZXhfZG9jbWQuYzo2MDc5Cittc2dpZCAiRTE4NzogVW5rbm93biIKK21zZ3N0ciAiRTE4NzogTmV6buFteSIKKworIzogZXhfZG9jbWQuYzo2MTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAiVW1pZXN0ZW5pZSBva25hOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjYyMDIKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODogTmEgdGVqdG8gcGxhdGZvcm1lIHNhIG5lZOEgdW1pZXN0bmVuaWUgb2tuYSB6aXN0absiCisKKyM6IGV4X2RvY21kLmM6NjQ2OAorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIlVsb75puyBwcmVzbWVyb3ZhbmllIgorCisjOiBleF9kb2NtZC5jOjY2MTcKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIlVsb75puyBwb2i1YWQiCisKKyM6IGV4X2RvY21kLmM6NjYxOAorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiVWxvvmm7IHNlZGVuaWUiCisKKyM6IGV4X2RvY21kLmM6NjYyMAorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIlVsb75puyBuYXN0YXZlbmllIgorCisjOiBleF9kb2NtZC5jOjY3NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIgZXhpc3R1amUgKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZXhfZG9jbWQuYzo2Nzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogTmVk4SBzYSBvdHZvcmm7IFwiJXNcIiBwcmUgeuFwaXMiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY3OTgKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IEFyZ3VtZW50ZW0gbfS+ZSBiebsgaWJhIHDtc2llbW8gYWxlYm8gcHJhdv0g6GkgtWF2/SBhcG9zdHJvZiIKKworIzogZXhfZG9jbWQuYzo2ODQxCittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiBWbm9yZW5pZSA6bm9ybWFsIGplIHBy7WxpuSBobGJva+kiCisKKyM6IGV4X2RvY21kLmM6NzIwMgorbXNnaWQgIjppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJ2bm9yZW5pZSA6aWYgamUgcHLtbGm5IGhsYm9r6SIKKworIzogZXhfZG9jbWQuYzo3MjM3Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYgYmV6IHpvZHBvdmVkYWr6Y2VobyA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzI1NworbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZWxzZSBiZXogem9kcG92ZWRhavpjZWhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjU5Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2VpZiBiZXogem9kcG92ZWRhavpjZWhvIDppZiIKKworIzogZXhfZG9jbWQuYzo3MzExCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgInZub3JlbmllIDp3aGlsZSBqZSBwcu1sabkgaGxib2vpIgorCisjOiBleF9kb2NtZC5jOjczNTcKK21zZ2lkICI6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjpjb250aW51ZSBiZXogem9kcG92ZWRhavpjZWhvIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3Mzg0Cittc2dpZCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6YnJlYWsgYmV6IHpvZHBvdmVkYWr6Y2VobyA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzQwNyBleF9kb2NtZC5jOjc0MTIKK21zZ2lkICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjplbmR3aGlsZSBiZXogem9kcG92ZWRhavpjZWhvIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3NDMzCittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uIG1pbW8gZnVua2NpdSIKKworIzogZXhfZG9jbWQuYzo3NjEzCittc2dpZCAiRTE5NDogTm8gYWx0ZXJuYXRlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciAnIyciCittc2dzdHIgIkUxOTQ6IK5pYWRueSBhbHRlcm5hdO12bnkgbuF6b3Ygc/pib3J1LCBrdG9y/W0gYnkgYm9sbyBtb75u6SBuYWhyYWRpuyAnIyciCisKKyM6IGV4X2RvY21kLmM6NzY0NAorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAivmlhZG55IG7hem92IHP6Ym9ydSwga3Rvcv1tIGJ5IGJvbG8gbW++bukgbmFocmFkabsgXCI8YWZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY1MgorbXNnaWQgIm5vIGF1dG9jb21tYW5kIGJ1ZmZlciBudW1iZXIgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWJ1Zj5cIiIKK21zZ3N0ciAivmlhZG5lIOjtc2xvIGJ1ZmZlcnUsIGt0b3L9bSBieSBib2xvIG1vvm7pIG5haHJhZGm7IFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY2MworbXNnaWQgIm5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICIiCisivmlhZG5hIHpob2RhIGF1dG9tYXRpY2v9Y2ggcHLta2F6b3YsIGt0b3JvdSBieSBib2xvIG1vvm7pIG5haHJhZGm7IFwiPGFtYXRjaD4iCisiXCIiCisKKyM6IGV4X2RvY21kLmM6NzY3MworbXNnaWQgIm5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICK+aWFkbnkgOnNvdXJjZSBz+mJvciwga3Rvcv1tIGJ5IGJvbG8gbW++bukgbmFocmFkabsgXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6NzcxNAorIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiUHLhemRu/SBu4XpvdiBz+mJvcnUgcHJlICclJyDoaSAnIycgZnVuZ3VqZSBpYmEgcyBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3NzE2Cittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiVv1zbGVka29tIHZ5aG9kbm90ZW5pYSBqZSBwcuF6ZG55IHJlu2F6ZWMiCisKKyM6IGV4X2RvY21kLmM6ODY0OQorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogTmVk4SBzYSBvdHZvcmm7IHByZSDo7XRhbu0gdmltaW5mbyBz+mJvciIKKworIzogZXhfZG9jbWQuYzo4ODIyCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiBWIHRlanRvIHZlcnppIG5pZSBz+iBkaWFncmFwaHkgcG9kcG9yb3ZhbukiCisKKyM6IGV4X2dldGxuLmM6MjgzMworbXNnaWQgInRhZ25hbWUiCittc2dzdHIgIm1lbm8gdGFndSIKKworIzogZXhfZ2V0bG4uYzoyODM2Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgdHlwIHP6Ym9ydVxuIgorCisjOiBleF9nZXRsbi5jOjQwNDkKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIid2b7ViYSAnaGlzdG9yeScgamUgbmFzdGF2ZW7hIG5hIG51bHUiCisKKyM6IGV4X2dldGxuLmM6NDI4OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiIyAlcyBIaXN0b3J5IChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSGlzdPNyaWEgJXMgKHph6O1uYWr6Y2kgbmFqbm92uW91IHBvbG++a291KTpcbiIKKworIzogZXhfZ2V0bG4uYzo0MjkwCittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICJQcu1rYXpvdukgUmlhZGt5IgorCisjOiBleF9nZXRsbi5jOjQyOTEKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICJWeWi1YWThdmFu/SBSZbthemVjIgorCisjOiBleF9nZXRsbi5jOjQyOTIKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICJW/XJheiIKKworIzogZXhfZ2V0bG4uYzo0MjkzCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiVnN0dXBu/SBSaWFkb2siCisKKyM6IGV4X2dldGxuLmM6NDMyMworbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgcHJldnm5dWplIGTlvmt1IHBy7WthenUiCisKKyM6IGV4X2dldGxuLmM6NDQ5MQorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6IEFrdO12bmUgb2tubyBhbGVibyBidWZmZXIgYm9sIHZ5bWF6YW79IgorCisjOiBmaWxlaW8uYzozNTEKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbuF6b3Ygc/pib3J1IgorCisjOiBmaWxlaW8uYzozNzUgZmlsZWlvLmM6NTAwIGZpbGVpby5jOjI1MTYgZmlsZWlvLmM6MjU1NAorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJqZSBhZHJlc+Fyb20iCisKKyM6IGZpbGVpby5jOjM3NworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIm5pZSBqZSBz+mJvcm9tIgorCisjOiBmaWxlaW8uYzo1MjIgZmlsZWlvLmM6MzY0NgorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIltub3b9IHP6Ym9yXSIKKworIzogZmlsZWlvLmM6NTQwCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW3By7XN0dXAgb2RtaWV0bnV0/V0iCisKKyM6IGZpbGVpby5jOjYzNAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6ICpSZWFkUHJlIGF1dG9tYXRpY2vpIHBy7WthenkgdXJvYmlsaSBz+mJvciBuZehpdGF0ZbVu/W0iCisKKyM6IGZpbGVpby5jOjYzNgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6ICpSZWFkUHJlIGF1dG9tYXRpY2vpIHBy7WthenkgbmVzbfogbWVuabsgYWt0deFsbnkgYnVmZmVyIgorCisjOiBmaWxlaW8uYzo2NTcKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06IOjtdGFtIHoguXRhbmRhcmRu6WhvIHZzdHVwdS4uLlxuIgorCisjOiBmaWxlaW8uYzo2NjMKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIsjtdGFtIHoguXRhbmRhcmRu6WhvIHZzdHVwdS4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo4OTIKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogUG8ga29udmVyemlpIGplIHP6Ym9yIG5l6Gl0dGF0ZbVu/SEiCisKKyM6IGZpbGVpby5jOjE3NTUKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZnBvbWVub3ZhbuEgcvpyYS9zb2tldF0iCisKKyM6IGZpbGVpby5jOjE3NjIKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltwb21lbm92YW7hIHL6cmFdIgorCisjOiBmaWxlaW8uYzoxNzY5Cittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIltzb2tldF0iCisKKyM6IGZpbGVpby5jOjE3NzcKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbUk9dIgorCisjOiBmaWxlaW8uYzoxNzg3Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbY2j9YmEgQ1JdIgorCisjOiBmaWxlaW8uYzoxNzkyCittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW27hamRlbukgTkxdIgorCisjOiBmaWxlaW8uYzoxNzk3Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbZGxo6SByaWFka3kgemFsb21lbuldIgorCisjOiBmaWxlaW8uYzoxODAzIGZpbGVpby5jOjM2MzAKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIltuZXNrb252ZXJ0b3Zhbv1dIgorCisjOiBmaWxlaW8uYzoxODA4IGZpbGVpby5jOjM2MzUKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW3Nrb252ZXJ0b3Zhbv1dIgorCisjOiBmaWxlaW8uYzoxODE1IGZpbGVpby5jOjM2NjAKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlt6YblpZnJvdmFu/V0iCisKKyM6IGZpbGVpby5jOjE4MjIKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIltDSFlCQSBQUkVWT0RVXSIKKworIzogZmlsZWlvLmM6MTgyOQorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIltDSFlCWSDIzVRBTklBXSIKKworIzogZmlsZWlvLmM6MjAzNgorbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICJOZWThIHNhIG7hanO7IGRv6GFzbv0gc/pib3IgcHJlIGtvbnZlcnppdSIKKworIzogZmlsZWlvLmM6MjA0MworbXNnaWQgIkNvbnZlcnNpb24gd2l0aCAnY2hhcmNvbnZlcnQnIGZhaWxlZCIKK21zZ3N0ciAiS29udmVyemlhIHMgJ2NoYXJjb252ZXJ0JyBzYSBuZXBvZGFyaWxhIgorCisjOiBmaWxlaW8uYzoyMDQ2Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAibmVk4SBzYSDo7XRhuyB2/XN0dXAgJ2NoYXJjb252ZXJ0JyIKKworIzogZmlsZWlvLmM6MjQzMgorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICIiCisiRTIwMzogQXV0b21hdGlja+kgcHLta2F6eSB6bWF6YWxpIOhpIGRlYWt0aXZvdmFsaSBidWZmZXIsIGt0b3L9IG1hbCBiebsgIgorInVsb75lbv0iCisKKyM6IGZpbGVpby5jOjI0NTUKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b21hdGlja/0gcHLta2F6IG5lb+hha+F2YW79bSBzcPRzb2JvbSB6bWVuaWwgcG/oZXQgcmlhZGtvdiIKKworIzogZmlsZWlvLmM6MjUyMSBmaWxlaW8uYzoyNTM4Cittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIm5pZSBqZSBz+mJvcm9tIGFuaSB6YXJpYWRlbu1tIG5hIGt0b3LpIHNhIGThIHphcGlzb3ZhuyIKKworIzogZmlsZWlvLmM6MjU4NAorbXNnaWQgImlzIHJlYWQtb25seSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJqZSBpYmEgcHJlIOjtdGFu7WllKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6Mjg4NgorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIk5lZOEgc2EgemFwaXNvdmG7IGRvIHrhbG++bulobyBz+mJvcnUgKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6Mjg5OAorbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJDaHliYSBwcmkgdXphdHbhcmFu7SB64Wxvvm7paG8gc/pib3J1IChwb3W+aXRlICEgcHJlIHZ5bvp0ZW5pZSkiCisKKyM6IGZpbGVpby5jOjI5MDAKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWThIHNhIG5h6O10Ybsgc/pib3IgcHJlIHrhbG9odSAocG91vml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBmaWxlaW8uYzoyOTE2Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJOZWThIHNhIHZ5dHZvcmm7IHrhbG++bv0gc/pib3IgKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZmlsZWlvLmM6MzAxOAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiTmVk4SBzYSB2eXR2b3JpuyB64Wxvvm79IHP6Ym9yIChwb3W+aXRlICEgcHJlIHZ5bvp0ZW5pZSkiCisKKyMgcmVzb3VyY2UgZm9yayA/IQorIzogZmlsZWlvLmM6MzA4MAorbXNnaWQgIlRoZSByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICInUmVzb3VyY2UgZm9yaycgYnVkZSBzdHJhdGVu/SAocG91vml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBmaWxlaW8uYzozMTY5Cittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IE5lZOEgc2EgbuFqc7sgZG/oYXNu/SBz+mJvciBwcmUgdWtsYWRhbmllIgorCisjOiBmaWxlaW8uYzozMTg3Cittc2dpZCAiRTIxMzogQ2Fubm90IGNvbnZlcnQgKHVzZSAhIHRvIHdyaXRlIHdpdGhvdXQgY29udmVyc2lvbikiCittc2dzdHIgIkUyMTM6IE5lZOEgc2EgcHJldmllc7sgKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllIHByZXZvZHUpIgorCisjOiBmaWxlaW8uYzozMjIyCittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogU/pib3Igc2EgbmVk4SBvdHZvcmm7IHByZSB1a2xhZGFuaWUiCisKKyM6IGZpbGVpby5jOjMyMjYKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IFP6Ym9yIHNhIG5lZOEgb3R2b3JpuyBwcmUgdWtsYWRhbmllIgorCisjOiBmaWxlaW8uYzozNDc1Cittc2dpZCAiQ2xvc2UgZmFpbGVkIgorbXNnc3RyICJaYXR2b3JlbmllIHpseWhhbG8iCisKKyM6IGZpbGVpby5jOjM1NDYKK21zZ2lkICJ3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgImNoeWJhIHByaSB64XBpc2UsIHByZXZvZCBzYSBuZXBvZGFyaWwiCisKKyM6IGZpbGVpby5jOjM1NTIKK21zZ2lkICJ3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICJjaHliYSBwcmkgdWtsYWRhbu0gKGplIHZvtW7pIG1pZXN0byBuYSBkaXNrdT8pIgorCisjOiBmaWxlaW8uYzozNjI1Cittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBDSFlCQSBQUkVWT0RVIgorCisjOiBmaWxlaW8uYzozNjQxCittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIlt6YXJpYWRlbmllXSIKKworIzogZmlsZWlvLmM6MzY0NgorbXNnaWQgIltOZXddIgorbXNnc3RyICJbbm92/V0iCisKKyM6IGZpbGVpby5jOjM2NjgKK21zZ2lkICIgW2FdIgorbXNnc3RyICIgW3BdIgorCisjOiBmaWxlaW8uYzozNjY4Cittc2dpZCAiIGFwcGVuZGVkIgorbXNnc3RyICIgcHJpcG9qZW79IgorCisjOiBmaWxlaW8uYzozNjcwCittc2dpZCAiIFt3XSIKK21zZ3N0ciAiIFt1XSIKKworIzogZmlsZWlvLmM6MzY3MAorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIgdWxvvmVu/SIKKworIzogZmlsZWlvLmM6MzcyMAorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBwYXRjaG1vZGU6IG5lZOEgc2EgdWxvvmm7IHD0dm9kbv0gc/pib3IiCisKKyM6IGZpbGVpby5jOjM3NDIKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IHBhdGNobW9kZTogbmVk4SBzYSB6YXBpc292YbsgZG8gcHLhemRuZWhvIHD0dm9kbulobyBz+mJvcnUiCisKKyM6IGZpbGVpby5jOjM3NTcKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IE5lZOEgc2EgdnltYXphuyB64Wxvvm79IHP6Ym9yIgorCisjOiBmaWxlaW8uYzozODA5Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisiVkFST1ZBTklFOiBPYnNhaCBw9HZvZG7paG8gc/pib3J1IG30vmUgYnm7IHN0cmF0ZW79IGFsZWJvIHBvuWtvZGVu/VxuIgorCisjOiBmaWxlaW8uYzozODExCittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAibmV1a29u6HVqdGUgZWRpdG9yIHNr9HIsIG5lviBidWRlIHP6Ym9yIPpzcGW5bmUgdWxvvmVu/SEiCisKKyM6IGZpbGVpby5jOjM4OTEKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjM4OTEKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MgZm9ybeF0XSIKKworIzogZmlsZWlvLmM6Mzg5OAorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6Mzg5OAorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozOTA1Cittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM5MDUKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCBmb3Jt4XRdIgorCisjOiBmaWxlaW8uYzozOTMyCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgcmlhZG9rLCAiCisKKyM6IGZpbGVpby5jOjM5MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCByaWFka292LCAiCisKKyM6IGZpbGVpby5jOjM5MzcKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAiMSB6bmFrIgorCisjOiBmaWxlaW8uYzozOTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgem5ha292IgorCisjOiBmaWxlaW8uYzozOTQ5Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW75pYWRueSBrb25pZWMgcmlhZGt1XSIKKworIzogZmlsZWlvLmM6Mzk0OQorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIltuZfpwbG79IHBvc2xlZG79IHJpYWRva10iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6Mzk2OAorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiVkFST1ZBTklFOiBvZCBqZWhvIG5h6O10YW5pYSBib2wgb2JzYWggc/pib3J1IHptZW5lbv0hISEhIgorCisjOiBmaWxlaW8uYzozOTcwCittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICJDaGNldGUgaG8gbmFvemFqIHVsb75puyIKKworIzogZmlsZWlvLmM6NDkzMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogQ2h5YmEgcHJpIHrhcGlzZSBkbyBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IENoeWIgcHJpIHV6YXR24XJhbu0gXCIlc1wiIgorCisjOiBmaWxlaW8uYzo0OTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBDaHliYSBwcmkg6O10YW7tIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTExNQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b21hdGlja/0gcHLta2F6IHZ5bWF6YWwgYnVmZmVyIgorCisjOiBmaWxlaW8uYzo1MTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IFZhcm92YW5pZTogc/pib3IgXCIlc1wiIHW+IG5pZSBqZSBkb3N0dXBu/SIKKworIzogZmlsZWlvLmM6NTEzNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIiIKKyJXMTI6IFZhcm92YW5pZTogc/pib3IgXCIlc1wiIGJvbCBwbyB6YehhdO0g+nByYXZ5IHptZW5lbv0gYSBWaW0gdGllviB6bWVuaWwgIgorImJ1ZmZlciIKKworIzogZmlsZWlvLmM6NTEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiBWYXJvdmFuaWU6IHP6Ym9yIFwiJXNcIiBib2wgcG8gemHoYXTtIPpwcmF2eSB6bWVuZW79IgorCisjOiBmaWxlaW8uYzo1MTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjogVmFyb3ZhbmllOiBSZb5pbSBz+mJvcnUgXCIlc1wiIGJvbCBwbyB6YehhdO0g+nByYXYgem1lbmVu/SIKKworIzogZmlsZWlvLmM6NTE1MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IFZhcm92YW5pZTogcG8gemHoYXTtIPpwcmF2eSB2eXR2b3Jlbv0gc/pib3IgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MTY4Cittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAiVmFyb3ZhbmllIgorCisjOiBmaWxlaW8uYzo1MTY5Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyImT0tcbiIKKyImTmHo7XRhuyBz+mJvciIKKworIzogZmlsZWlvLmM6NTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogbmVk4SBzYSBvYm5vdmm7IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTc3OQorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLVZ5bWF6YW79LS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo1OTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2NzogU2t1cGluYSBcIiVzXCIgbmVleGlzdHVqZSIKKworIzogZmlsZWlvLmM6NjA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogTmVwcu1zdHVwbv0gem5hayBwbyAqOiAlcyIKKworIzogZmlsZWlvLmM6NjA3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogVWRhbG9zuyAlcyBuZWV4aXN0dWplIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYyMjQKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9tYXRpY2vpIHBy7WthenkgLS0tIgorCisjOiBmaWxlaW8uYzo2NDk1Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IEF1dG9tYXRpY2vpIHBy7Wthenkgc2EgbmVkYWr6IHNwdXN0absgcHJlIFapRVRLWSB1ZGFsb3O7aSIKKworIzogZmlsZWlvLmM6NjUxOAorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAirmlhZG5lIHZ5aG92dWr6Y2UgYXV0b21hdGlja+kgcHLta2F6eSIKKworIzogZmlsZWlvLmM6Njc5MAorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IHZub3JlbmlhIGF1dG9tYXRpY2vpaG8gcHLta2F6dSBz+iBwcu1sabkgaGxib2vpIgorCisjOiBmaWxlaW8uYzo3MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgYXV0b21hdGlja+kgcHLta2F6eSBwcmUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo3MDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAiU3D6ubthbSAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MTUzCisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJBdXRvbWF0aWNr/SBwcu1rYXogJXMiCisKKyM6IGZpbGVpby5jOjc2NzUKK21zZ2lkICJFMjE5OiBNaXNzaW5nIHsuIgorbXNnc3RyICJFMjE5OiBDaP1iYSB7LiIKKworIzogZmlsZWlvLmM6NzY3NworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IENo/WJhIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICKuaWFkbnkgeuFoeWIgbmVib2wgbuFqZGVu/SIKKworIzogZm9sZC5jOjU1MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBQb21vY291ICdmb2xkbWV0aG9kJyBzYSBuZWThIHZ5dHZvcmm7IHrhaHliIgorCisjOiBmb2xkLmM6NTU1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IFBvbW9jb3UgJ2ZvbGRtZXRob2QnIHNhIG5lZOEgb2RzdHLhbmm7IHrhaHliIgorCisjOiBnZXRjaGFyLmM6MjQ3Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiBQcmlkYbsgZG8gYnVmZmVydSBwcmUg6O10YW5pZSIKKworIzogZ2V0Y2hhci5jOjIxMDYKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJ67XZuZSBtYXBvdmFuaWUiCisKKyM6IGdldGNoYXIuYzoyOTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiBwcmUgJXMgdb4gZ2xvYuFsbmEgc2tyYXRrYSBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjI5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBwcmUgJXMgdb4gZ2xvYuFsbmUgbWFwb3ZhbmllIGV4aXN0dWplIgorCisjOiBnZXRjaGFyLmM6MzA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiBwcmUgJXMgdb4gc2tyYXRrYSBleGlzdHVqZSIKKworIzogZ2V0Y2hhci5jOjMwODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IHByZSAlcyB1viBtYXBvdmFuaWUgZXhpc3R1amUiCisKKyM6IGdldGNoYXIuYzozMTQ1Cittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICKuaWFkbmEgc2tyYXRrYSBuZWJvbGEgbuFqZGVu4SIKKworIzogZ2V0Y2hhci5jOjMxNDcKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICKuaWFkbmUgbWFwb3ZhbmllIG5lYm9sbyBu4WpkZW7pIgorCisjOiBnZXRjaGFyLmM6Mzk5MgorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDogbmVwcu1zdHVwbv0gbfNkIgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPG5lZOEgc2Egb3R2b3Jpuz4gIgorCisjOiBndWlfYXRfZnMuYzoxMTE1CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgZm9udCAlcyIKK21zZ3N0ciAidmltX1NlbEZpbGU6IHDtc21vICVzIG5pZSBqZSBkb3N0dXBu6SIKKworIzogZ3VpX2F0X2ZzLmM6MjUzOAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiBuZWThIHNhIHZy4XRpuyBkbyBha3R14WxuZWhvIGFkcmVz4XJhIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJO4XpvdiBjZXN0eToiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjMKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTogbmVk4SBzYSB6aXN0absgYWt0deFsbnkgYWRyZXPhciIKKworIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfbW90aWYuYzoxNjE5Cittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjLiAnQ2FuY2VsJyBidXR0b24KKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX2d0ay5jOjE3NDAgZ3VpX21vdGlmLmM6MTYxNCBndWlfbW90aWYuYzoyODM1Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJacnW5absiCisKKyM6IGd1aV9hdGhlbmEuYzoxOTU2IGd1aV9tb3RpZi5jOjE4NjcKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWaW0gZGlhbPNnIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIlBy7XByYXZvayBwb3N1dm5laiBsabl0eTogbmVk4SBzYSB6aXN0absgZ2VvbWV0cmlhIG9icuF6a3UiCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IEJhbGxvb25FdmFsIG5lZOEgc2Egdnl0dm9yabsgc3By4XZvdSBhIHrhcm92ZfIgc3DkdG79bSB2b2xhbu1tIgorCisjOiBndWkuYzoyMDMKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogTmVk4SBzYSBzcHVzdGm7IEdVSSIKKworIzogZ3VpLmM6MzI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBOZWThIHNhIOjtdGG7IHogXCIlc1wiIgorCisjOiBndWkuYzo0NTMKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IHZvtWJhICdndWlmb250d2lkZScgamUgY2h5Ym5lIG5hc3RhdmVu4SIKKworIzogZ3VpLmM6MzY5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU0OiBDYW5ub3QgYWxsb2NhdGUgY29sb3IgJXMiCittc2dzdHIgIkUyNTQ6IE5lZOEgc2EgYWxva292YbsgZmFyYmEgJXMiCisKKyM6IGd1aS5jOjM5ODMKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiQ2h5YmEiCisKKyM6IGd1aV9ndGsuYzoxMTkwCittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiVmltIGRpYWzzZy4uIgorCisjOiBndWlfZ3RrLmM6MTU3NiBndWlfbW90aWYuYzoyNzU0Cittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSBO4WpzuyBhIG5haHJhZGm7Li4uIgorCisjOiBndWlfZ3RrLmM6MTU4MSBndWlfbW90aWYuYzoyNzU2Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSBO4Wpzuy4uLiIKKworIzogZ3VpX2d0ay5jOjE2MDQgZ3VpX21vdGlmLmM6Mjg3NAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIlZ5aLVhZGG7OiIKKworIzogZ3VpX2d0ay5jOjE2MjIgZ3VpX21vdGlmLmM6MjkwNgorbXNnaWQgIlJlcGxhY2Ugd2l0aDoiCittc2dzdHIgIk5vdv0gdGV4dDoiCisKKyMuIGV4YWN0IG1hdGNoIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY1NCBndWlfbW90aWYuYzozMDA4Cittc2dpZCAiTWF0Y2ggZXhhY3Qgd29yZCBvbmx5IgorbXNnc3RyICJItWFkYbsgbGVuIGNlbOkgc2xvduEiCisKKyM6IGd1aV9ndGsuYzoxNjY2IGd1aV9tb3RpZi5jOjI5NzYKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIlNtZXIiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MTY3OCBndWlfbW90aWYuYzoyOTg4Cittc2dpZCAiVXAiCittc2dzdHIgIkhvcmUiCisKKyM6IGd1aV9ndGsuYzoxNjgyIGd1aV9tb3RpZi5jOjI5OTYKK21zZ2lkICJEb3duIgorbXNnc3RyICJEb2x1IgorCisjLiAnRmluZCBOZXh0JyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNzA0IGd1aV9tb3RpZi5jOjI3NzgKK21zZ2lkICJGaW5kIE5leHQiCittc2dzdHIgIk7hanO7IO9hbLlpZSIKKworIy4gJ1JlcGxhY2UnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MjEgZ3VpX21vdGlmLmM6Mjc5NQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIk5haHJhZGm7IgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE3MzAgZ3VpX21vdGlmLmM6MjgwOAorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJOYWhyYWRpuyBWuWV0a28iCisKKyM6IGd1aV9ndGtfeDExLmM6MTA3OSBndWlfeDExLmM6MTE5OQorbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IG5lZOEgc2Egb3R2b3JpuyBkaXNwbGVqIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0OTQgZ3VpX3gxMS5jOjE5OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDogTmV6buFtYSBzYWRhIHDtc2llbTogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjUxOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICJW/WJlciBQ7XNtYSIKKworIzogZ3VpX2d0a194MTEuYzoyNzY0IGd1aV9tYWMuYzoyOTgyIGd1aV93NDguYzoxMTk3IGd1aV94MTEuYzoxODM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIkUyMzU6IE5lem7hbWUgcO1zbW86ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI3NzUgZ3VpX3gxMS5jOjE4NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBQ7XNtbyBcIiVzXCIgbmVt4SBwZXZu+iC57XJrdSIKKworIzogZ3VpX2d0a194MTEuYzozNTgwIHVpLmM6MTk3MQorbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIlBvdb5pdP0gQ1VUX0JVRkZFUjAgbmFtaWVzdG8gcHLhemRuZWhvIHb9YmVydSIKKworIzogZ3VpX21vdGlmLmM6MTYxMyBndWlfbW90aWYuYzoxNjE2Cittc2dpZCAiRmlsdGVyIgorbXNnc3RyICJGaWx0ZXIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTUKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAiQWRyZXPhcmUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcKK21zZ2lkICJIZWxwIgorbXNnc3RyICJQb21vY27tayIKKworIzogZ3VpX21vdGlmLmM6MTYxOAorbXNnaWQgIkZpbGVzIgorbXNnc3RyICJT+mJvcnkiCisKKyM6IGd1aV9tb3RpZi5jOjE2MjAKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgIlb9YmVyIgorCisjOiBndWlfbW90aWYuYzoyODIxCittc2dpZCAiVW5kbyIKK21zZ3N0ciAiU3DkuyIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkUyMzU6IE5lbfS+ZW0gbmHo7XRhuyBjaHlibv0gZm9udCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTogTmVk4SBzYSBwb3W+7bsgcO1zbW8gJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjY5Cittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlBvc2llbGFtIHNwcuF2dSBuYSB1a29u6GVuaWUgc3lub3Zza+lobyBwcm9jZXN1LlxuIgorCisjOiBndWlfdzMyLmM6ODM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICIiCisiRTI0MzogQXJndW1lbnQgbmllIGplIHBvZHBvcm92YW79OiBcbiIKKyItJXNcIjsgUG91vml0ZSBPTEUgdmVyeml1LiIKKworIy4gVE9ETzogTWF5IGJlIGNoYW5nZWQgdGhpcyBtZXNzYWdlCisjOiBndWlfdzMyLmM6MzQ5OSBndWlfdzMyLmM6MzUzMiBndWlfeDExLmM6MzI1MgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogQ2h5YmEgLS0gbmVk4Wr6IHNhIHByZejtdGG7IG96bmHob3ZhY2llIGThdGEhIgorCisjOiBndWlfdzQ4LmM6MjA4MQorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk7hanO7IHJlu2F6ZWMgKHBvdb5pdGUgJ1xcXFwnIGFrIGNoZXRlIG7hanO7ICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjEwNgorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIk7hanO7IGEgTmFocmFkabsgKHBvdb5pdGUgJ1xcXFwnIGFrIGNoY2V0ZSBu4WpzuyAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE0MTkKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICIiCisiVmltIEU0NTg6IE5lZOEgc2EgYWxva292YbsgcG9sb75rYSBtYXB5IGZhcmllYi4gTmlla3RvcukgZmFyYnkgbfS+dSBiebsgIgorIm5lc3By4XZuZSIKKworIzogZ3VpX3gxMS5jOjE5ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IENo/WJhIHDtc21vIHByZSBuYXNsZWR1avpjZSB6bmFrb3bpIHNhZHkgJXM6IgorCisjOiBndWlfeDExLmM6MjAzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiBO4XpvdiBzYWR5IHDtc2llbTogJXMiCisKKyM6IGd1aV94MTEuYzoyMDMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIlDtc21vICclcycgbmVt4SBwZXZub3Ugue1ya3UiCisKKyM6IGd1aV94MTEuYzoyMDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1MzogTuF6b3Ygc2FkeSBw7XNpZW06ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJQ7XNtbzA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJQ7XNtbzE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJQ7XNtbyVkIG5pZSBqZSBkdmFrcuF0ILlpcrlpZSBha28gcO1zbW8wXG4iCisKKyM6IGd1aV94MTEuYzoyMDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAiqe1ya2EgcO1zbWEwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIqntcmthIHDtc21hMTogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCisKKyM6IGlmX2NzY29wZS5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjc1tjb3BlXSAlcyIKK21zZ3N0ciAiUG91vml0aWU6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzo2NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAiUHJpZGG7IG5vdvogZGF0YWLhenUiCisKKyM6IGlmX2NzY29wZS5jOjY5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiSLVhZGFuaWUgdnpvcnUiCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIlpvYnJhemm7IHT6dG8gc3By4XZ1IgorCisjOiBpZl9jc2NvcGUuYzo3MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICJVa29u6Gm7IHNwb2plbmllIgorCisjOiBpZl9jc2NvcGUuYzo3NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIlpub3Z1IGluaWNpYWxpem92YbsgdrlldGt5IHNwb2plbmlhIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIlpvYnJhemm7IHNwb2plbmlhIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIlThdG8gY3Njb3BlIHBy7WtheiBuZXBvZHBvcnVqZSByb3pkZbVvdmFuaWUgb2tuYS5cbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIlBvdb5pdGllOiBjc3RhZyA8b2RzYWRlbmllPiIKKworIzogaWZfY3Njb3BlLmM6MTk5Cittc2dpZCAiRTI1NzogY3N0YWc6IHRhZyBub3QgZm91bmQiCittc2dzdHIgIkUyNTc6IGNzdGFnOiB0YWcgbmVu4WpkZW79IgorCisjOiBpZl9jc2NvcGUuYzo0MDcgaWZfY3Njb3BlLmM6NDUxCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXQoJXMpIGVycm9yOiAlZCIKK21zZ3N0ciAic3RhdCglcykgY2h5YmE6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0NjAgaWZfY3Njb3BlLmM6NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAiUHJpZGFu4SBjc2NvcGUgZGF0YWLhemEgJXMiCisKKyM6IGlmX2NzY29wZS5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSB2YWxpZCBjc2NvcGUgZGF0YWJhc2UiCittc2dzdHIgIiVzIG5pZSBqZSBhbmkgYWRyZXPhcm9tIGFuaSBzcHLhdm5vdSBjc2NvcGUgZGF0YWLhem91IgorCisjOiBpZl9jc2NvcGUuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiY2h5YmEgcHJpIOjtdGFu7SBjc2NvcGUgc3BvamVuaWEgJWQiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJuZXpu4W15IHR5cCBjc2NvcGUgaLVhZGFuaWEiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICJOZWRhavogc2Egdnl0dm9yabsgY3Njb3BlIHL6cnkiCisKKyM6IGlmX2NzY29wZS5jOjc0NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uIGV4ZWMgZmFpbGVkIgorbXNnc3RyICJzcHVzdGVuaWUgY3NfY3JlYXRlX2Nvbm5lY3Rpb24gemx5aGFsbyIKKworIzogaWZfY3Njb3BlLmM6NzU1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgdG9fZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogdm9sYW5pZSBmZG9wZW4gcHJlIHRvX2ZwIHpseWhhbG8iCisKKyM6IGlmX2NzY29wZS5jOjc1NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IHZvbGFuaWUgZmRvcGVuIHByZSBmcl9mcCB6bHloYWxvIgorCisjOiBpZl9jc2NvcGUuYzo3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIr5pYWRuZSBjc2NvcGUgc3BvamVuaWEiCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IGNzY29wZSBotWFkYW5pZSAlcyB2byB2em9yZSAlcyBuZW5huWxvIL5pYWRudSB6aG9kdSIKKworIzogaWZfY3Njb3BlLmM6ODk5Cittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJwcu1rYXp5IGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpXG4iCittc2dzdHIgIiUtNXM6ICUtMzBzIChQb3W+aXRpZTogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJkdXBsaWNpdG7hIGNzY29wZSBkYXRhYuF6YSBuZWJvbGEgcHJpZGFu4SIKKworIzogaWZfY3Njb3BlLmM6OTgxCittc2dpZCAibWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgImRvc2lhaG51dP0gbWF4aW3hbG55IHBv6GV0IGNzY29wZSBzcG9qZW7tIgorCisjOiBpZl9jc2NvcGUuYzoxMTAyCittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiBjc2NvcGUgc3BvamVuaWUgbmVu4WpkZW7pIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY3Njb3BlIHNwb2plbmllICVzIG5lbuFqZGVu6SIKKworIzogaWZfY3Njb3BlLmM6MTE0MQorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uIGNsb3NlZCIKK21zZ3N0ciAiY3Njb3BlIHNwb2plbmllIHVrb27oZW7pIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgc3BvamVuaWUgJXMgdWtvbuhlbulcbiIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxMjkwCittc2dpZCAiZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIm9zdWRvduEgY2h5YmEgdiBjc19tYW5hZ2VfbWF0Y2hlcyIKKworIzogaWZfY3Njb3BlLmM6MTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJFMjYyOiBjaHliYSBwcmkg6O10YW7tIGNzY29wZSBzcG9qZW5pYSAlZCIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICJ2b2xhbmllIG1hbGxvYyB6bHloYWxvXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIHRhZzogJXNcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorbXNnaWQgIiAgICMgICBsaW5lIgorbXNnc3RyICIgICAjICAgcmlhZG9rIgorCisjOiBpZl9jc2NvcGUuYzoxNDYwCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICJu4XpvdiBz+mJvcnUvIGtvbnRleHQvIHJpYWRva1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNzE4Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIla5ZXRreSBjc2NvcGUgZGF0YWLhemUgcmVzZXRvdmFu6SIKKworIzogaWZfY3Njb3BlLmM6MTc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICK+aWFkbmUgY3Njb3BlIHNwb2plbmlhXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICBu4XpvdiBkYXRhYuF6ZSAgICAgICAgICAgICAgICAgICAgICBwcmVkcG9uYSBjZXN0eVxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA8vmlhZG55PlxuIgorCisjOiBpZl9weXRob24uYzoyNTUgaWZfcnVieS5jOjI2MCBpZl90Y2wuYzoxOTUgbWJ5dGUuYzoyNjI5IG9zX3dpbjMyLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IE5lcG9kYXJpbG8gc2EgbmFocmG7IGtuab5uaWN1ICVzIgorCisjOiBpZl9weXRob24uYzoyNjcgaWZfcnVieS5jOjI3MiBpZl90Y2wuYzoyMDYgbWJ5dGUuYzoyNjQ1IG9zX3dpbjMyLmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiCittc2dzdHIgIkU0NDg6IE5lcG9kYXJpbG8gc2EgbmFocmG7IGZ1bmtjaXUga25pvm5pY2UgJXMiCisKKyM6IGlmX3B5dGhvbi5jOjM5MgorbXNnaWQgIiIKKyJFMjYzOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUHl0aG9uIGxpYnJhcnkgY291bGQgbm90IGJlICIKKyJsb2FkZWQuIgorbXNnc3RyICJFMjYyOiBQcmVw4eh0ZSwgdGVudG8gcHLta2F6IGplIHZ5cG51dP0sIFB5dGhvbiBrbmm+bmljYSBuZW30vmUgYnm7bmHo7XRhbuEuIgorCisjOiBpZl9weXRob24uYzo1OTIKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIm5lZOEgc2EgdnltYXphuyB2bGFzdG5vc7sgT3V0cHV0T2JqZWN0IgorCisjOiBpZl9weXRob24uYzo1OTkKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgbXVz7SBiebsga2xhZG7pIGNlbOkg6O1zbG8iCisKKyM6IGlmX3B5dGhvbi5jOjYwNworbXNnaWQgImludmFsaWQgYXR0cmlidXRlIgorbXNnc3RyICJjaHlibuEgdmxhc3Rub3O7IgorCisjOiBpZl9weXRob24uYzo2NDYgaWZfcHl0aG9uLmM6NjYwCittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpIHZ5vmFkdWplIHpvem5hbSByZbthemNvdiIKKworIzogaWZfcHl0aG9uLmM6Nzg2Cittc2dpZCAiRTI2NDogUHl0aG9uOiBFcnJvciBpbml0aWFsaXNpbmcgSS9PIG9iamVjdHMiCittc2dzdHIgIkUyNjQ6IFB5dGhvbjogQ2h5YmEgcHJpIGluaWNpYWxpeuFjaWkgSS9PIG9iamVrdG92IgorCisjOiBpZl9weXRob24uYzo5NzEgaWZfdGNsLmM6MTQwMworbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAiY2h5Ym79IHb9cmF6IgorCisjOiBpZl9weXRob24uYzo5ODUgaWZfdGNsLmM6MTQwOAorbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAicG9kcG9yYSB2/XJhem92IGJvbGEgdnlwbnV04SBwcmkgcHJla2xhZGUgcHJvZ3JhbXUiCisKKyM6IGlmX3B5dGhvbi5jOjk5OAorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgInBva3VzIG8gb2RrYXogbmEgdnltYXphbv0gYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxMDEzIGlmX3B5dGhvbi5jOjEwNTQgaWZfcHl0aG9uLmM6MTExOCBpZl90Y2wuYzoxMjE1Cittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICLo7XNsbyByaWFka2EgbWltbyByb3pzYWgiCisKKyM6IGlmX3B5dGhvbi5jOjEyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8b2JqZWt0IGJ1ZmZlcnUgKHZ5bWF6YW79KSBuYSAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM0MiBpZl90Y2wuYzo4MzcKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAiY2h5Ym7pIG1lbm8gem5h6Gt5IgorCisjOiBpZl9weXRob24uYzoxNjE3Cittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIr5pYWRueSB0YWv9IGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTcwNQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgInBva3VzIG8gb2RrYXogbmEgdnltYXphbukgb2tubyIKKworIzogaWZfcHl0aG9uLmM6MTc1MAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAidmxhc3Rub3O7IGliYSBwcmUg6O10YW5pZSIKKworIzogaWZfcHl0aG9uLmM6MTc2MworbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAidW1pZXN0bmVuaWUga3Vyem9ydSBtaW1vIGJ1ZmZlciIKKworIzogaWZfcHl0aG9uLmM6MTg0MAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8b2JqZWt0IG9rbmEgKHZ5bWF6YW79KSBuYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPG9iamVrdCBva25hIChuZXpu4W15KSBuYSAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxva25vICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzMAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICK+aWFkbmUgdGFr6SBva25vIgorCisjOiBpZl9weXRob24uYzoyMTg3IGlmX3B5dGhvbi5jOjIyMjIgaWZfcHl0aG9uLmM6MjI3MiBpZl9weXRob24uYzoyMzM1CisjOiBpZl9weXRob24uYzoyNDU1IGlmX3B5dGhvbi5jOjI1MDcgaWZfdGNsLmM6Njg1IGlmX3RjbC5jOjczMCBpZl90Y2wuYzo4MDQKKyM6IGlmX3RjbC5jOjg3NCBpZl90Y2wuYzoxOTk5Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAibmVkYWr6IHNhIHVsb75puyBzcOR0bukgaW5mb3Jt4WNpZSIKKworIzogaWZfcHl0aG9uLmM6MjE4OSBpZl9weXRob24uYzoyMjc5IGlmX3B5dGhvbi5jOjIzNDYKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIm5lZOEgc2EgdnltYXphuyByaWFkb2siCisKKyM6IGlmX3B5dGhvbi5jOjIyMjQgaWZfcHl0aG9uLmM6MjM2MiBpZl90Y2wuYzo2OTEgaWZfdGNsLmM6MjAyMQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIm5lZOEgc2EgbmFocmFkabsgcmlhZG9rIgorCisjOiBpZl9weXRob24uYzoyMzc4IGlmX3B5dGhvbi5jOjI0NTcgaWZfcHl0aG9uLmM6MjUxNQorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSB2bG++absgcmlhZG9rIgorCisjOiBpZl9weXRob24uYzoyNjE5Cittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICJyZbthemVjIG5lc21pZSBvYnNhaG92Ybsgem5ha3kgbm926WhvIHJpYWRrdSIKKworIzogaWZfcnVieS5jOjQwMQorbXNnaWQgIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkUyNjY6IFByZXDh6HRlLCB0ZW50byBwcu1rYXogamUgdnlwbnV0/SwgUnVieSBrbmm+bmljYSBuZW30vmUgYnm7IG5h6O10YW7hLiIKKworIzogaWZfcnVieS5jOjQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiBOZXpu4W15ICdsb25nam1wJyBzdGF2ICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIlByZXBu+rsgaW1wbGVtZW504WNpdS9kZWZpbu1jaXUiCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlVr4XphuyB64WtsYWRu+iB0cmllZHUiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJVa+F6YbsgcHJlu2G+ZW76IOhsZW5za/ogZnVua2NpdSIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAiT2Jub3ZpuyB6byBz+mJvcnUiCisKKyM6IGlmX3NuaWZmLmM6NzEKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIHByb2plY3QiCittc2dzdHIgIk9ibm92absgeiBwcm9qZWt0dSIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICJPYm5vdmm7IHpvIHa5ZXRr/WNoIHByb2pla3RvdiIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICJPYm5vdmm7IgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIlVr4XphuyB6ZHJvaiIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICJO4WpzuyB6bmFrIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJQcmV6cmlluyB0cmllZHUiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiVWvhemG7IHRyaWVkdSB2IGhpZXJhcmNoaWkiCisKKyM6IGlmX3NuaWZmLmM6NzkKK21zZ2lkICJTaG93IGNsYXNzIGluIHJlc3RyaWN0ZWQgaGllcmFyY2h5IgorbXNnc3RyICJVa+F6YbsgdHJpZWR1IHYgb2JtZWR6ZW5laiBoaWVyYXJjaGlpIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgb2RrYXp1amUgbmEiCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmIG9ka+F6YW79IHoiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIG3hIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIHBvdb5pdP0iCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIlVr4XphuyBkb2t1bWVudOFjaXUiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiVnl0dm9yabsgZG9rdW1lbnThY2l1IHByZSIKKworIzogaWZfc25pZmYuYzo5NworbXNnaWQgIiIKKyJDYW5ub3QgY29ubmVjdCB0byBTTmlGRisuIENoZWNrIGVudmlyb25tZW50IChzbmlmZmVtYWNzIG11c3QgYmUgZm91bmQgaW4gIgorIiRQQVRIKS5cbiIKK21zZ3N0ciAiIgorIlpsaWhhbG8gcHJpcG9qZW5pZSBuYSBTTmlGRissIFByZXZlcnRlIHByb3N0cmVkaWUgKHNuaWZmZW1hY3Mgc2EgbXVz7SAiCisibmFjaOFkemG7IHYgJFBBVEgpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogQ2h5YmEgcG/oYXMg6O10YW5pYS4gT2Rwb2plbukiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyBqZSBha3R14WxuZSAiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAibmUiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICJwcmlwb2plbv0iCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiBOZXpu4W1hIFNOaUZGKyBwb75pYWRhdmthOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3NjogQ2h5YmEgcHJpcG9qZW5pYSBuYSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgbmllIGplIHByaXBvamVu/SIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogTmllIGplIFNOaUZGKyBidWZmZXJvbSIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogQ2h5YmEgeuFwaXN1LiBPZHBvamVu6SIKKworIzogaWZfdGNsLmM6NDE5Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICJjaHlibukg6O1zbG8gYnVmZmVydSIKKworIzogaWZfdGNsLmM6NDY1IGlmX3RjbC5jOjkzMiBpZl90Y2wuYzoxMTExCittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAibmllIGplIGW5dGUgcG9kcG9yb3ZhbukiCisKKyM6IGlmX3RjbC5jOjUwMgorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICJuZXpu4W1hIHZvtWJhIgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NQorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAibmVkYWr6IHNhIG5hc3Rhdmm7IHJpYWRreSIKKworIzogaWZfdGNsLmM6ODQ2Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICJ6bmHoa2EgbmllIGplIG5hc3RhdmVu4SIKKworIzogaWZfdGNsLmM6ODUyIGlmX3RjbC5jOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAicmlhZG9rICVkIHN05XBlYyAlZCIKKworIzogaWZfdGNsLmM6ODgyCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSB2bG++absvcHJpcG9qabsgcmlhZG9rIgorCisjOiBpZl90Y2wuYzoxMjY5Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIm5lem7hbXkgcHLtem5hazogIgorCisjOiBpZl90Y2wuYzoxMzM5Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIm5lem7hbWEgdmltTW++bm9zuyIKKworIzogaWZfdGNsLmM6MTQyNAorbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAicHJlcnW5ZW5pZSB6IGts4XZlc25pY2UiCisKKyM6IGlmX3RjbC5jOjE0MjkKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgImNoeWJhIHZpbSIKKworIzogaWZfdGNsLmM6MTQ3MgorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAibmVk4SBzYSB2eXR2b3JpuyBwcu1rYXogYnVmZmVydS9va25hOiBvYmpla3QgdnltYXphbv0iCisKKyM6IGlmX3RjbC5jOjE1NDYKK21zZ2lkICJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIm5lZOEgc2EgemFyZWdpc3Ryb3ZhuyBwcu1rYXogc3DkdG7paG8gdm9sYW5pYTogYnVmZmVyL29rbm8gdb4gYm9sIHZ5bWF6YW79IgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IHBvuWtvZGVu/SE/IE96buFtdGUsIHByb3PtbSwgdPp0byBjaHlidSBuYSAiCisidmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTY0Cittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAibmVk4SBzYSB6YXJlZ2lzdHJvdmG7IHBy7WtheiBzcOR0bulobyB2b2xhbmlhOiBvZGtheiBuYSBidWZmZXIvb2tubyBuZW7hamRlbv0iCisKKyM6IGlmX3RjbC5jOjE3MjUKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIlByZXDh6HRlLCB0ZW50byBwcu1rYXogamUgdnlwbnV0/SwgVGNsIGtuab5uaWNhIG5lbfS+ZSBiebsgbmHo7XRhbuEuIgorCisjOiBpZl90Y2wuYzoxODg3Cittc2dpZCAiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wgQ0hZQkE6IG7hdnJhdG92/SBr82QgbmllIGplIGNlbOkg6O1zbG8hPyBPem5hbXRlLCBwcmVz7W0sIHR1dG8gIgorImNoeWJ1IG5hIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNworbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAibmVk4SBzYSBwcmXo7XRhuyByaWFkb2siCisKKyM6IGlmX3hjbWRzcnYuYzoyMTMKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICJOZW30vmVtIHphcmVnaXN0cm92YbsgbWVubyBwcu1rYXpvdulobyBzZXJ2cmEiCisKKyM6IGlmX3hjbWRzcnYuYzo0MzQgb3NfbXN3aW4uYzoyMTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0NzogbWVubyByZWdpc3Ryb3ZhbulobyBzZXJ2cmEgXCIlc1wiIG5lZXhpc3R1amUiCisKKyM6IGlmX3hjbWRzcnYuYzo0NjMKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBDaHliYSBwb+hhcyBwcmVub3N1IHBy7WthenUgZG8gY2lltW926WhvIHByb2dyYW11IgorCisjOiBpZl94Y21kc3J2LmM6NzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICJQb3W+7XTpIGNoeWJu6SBpZCBzZXJ2cmE6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA3OQorbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorbXNnc3RyICJFMjQ5OiBuZW30vmVtIOjtdGG7IFZJTSByZWdpc3Ryb3b6IHZsYXN0bm9zuyIKKworIzogaWZfeGNtZHNydi5jOjEwOTAKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IFZJTSByZWdpc3Ryb3bhIL5pYWRvc7sgamUgemxlIGZvcm11bG92YW7hLiAgVnltYXphbukhIgorCisjOiBtYWluLmM6NTMgb3B0aW9uLmM6MzE2MiBvcHRpb24uYzozMjY5Cittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIk5lem7hbWEgdm+1YmEiCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICJQcu1sabkgbW5vaG8gdXByYXZvdmFj7WNoIGFyZ3VtZW50b3YiCisKKyM6IG1haW4uYzo1NworbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkNo/WJhIGFyZ3VtZW50IHBvIgorCisjOiBtYWluLmM6NTkKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAiQ2h5YnkgemEgdm+1Ym91IgorCisjOiBtYWluLmM6NjEKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIgb3IgXCItYyBjb21tYW5kXCIgYXJndW1lbnRzIgorbXNnc3RyICJQcu1sabkgbW5vaG8gXCIrcHLta2F6XCIg6GkgXCItYyBwcu1rYXpcIiBhcmd1bWVudG92IgorCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50IHByZSIKKworIzogbWFpbi5jOjQ1MAorbXNnaWQgIlRoaXMgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgZGlmZiBmZWF0dXJlLiIKK21zZ3N0ciAiVGVudG8gVmltIG5lYm9sIGtvbXBpbG92YW79IHMgcG9yb3Zu4XZhY+1taSBmdW5rY2lhbWkuIgorCisjOiBtYWluLmM6ODc1Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiUG9rdXMgbyBvcOR0b3Zu6SBvdHZvcmVuaWUgc2tyaXB0dTogXCIiCisKKyM6IG1haW4uYzo4NzkgbWFpbi5jOjg4NiBtYWluLmM6OTMwIG1lbWxpbmUuYzozNjczIG1lbWxpbmUuYzozNjc3CisjOiB2ZXJzaW9uLmM6ODkyIHZlcnNpb24uYzo4OTcgdmVyc2lvbi5jOjkwMiB2ZXJzaW9uLmM6OTA3IHZlcnNpb24uYzo5MTIKKyM6IHZlcnNpb24uYzo5MTcgdmVyc2lvbi5jOjkyMyB2ZXJzaW9uLmM6OTI3IHZlcnNpb24uYzo5MzEgdmVyc2lvbi5jOjkzNgorIzogdmVyc2lvbi5jOjk0MyB2ZXJzaW9uLmM6OTUxIHZlcnNpb24uYzo5NTcKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6ODg0Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJOZWThIHNhIG90dm9yabsgcHJlIHrhcGlzOiBcIiIKKworIzogbWFpbi5jOjkyOAorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAiTmVk4SBzYSBvdHZvcmm7IHByZSB2/XN0dXAgc2tyaXB0dTogXCIiCisKKyM6IG1haW4uYzoxMDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAicG/oZXQgc/pib3JvdiBwcmUg+nByYXZ1OiAlZFxuIgorCisjOiBtYWluLmM6MTExOAorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFyb3ZhbmllOiBW/XN0dXAgbmVzbWVydWplIG5hIHRlcm1pbuFsXG4iCisKKyM6IG1haW4uYzoxMTIwCittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFyb3ZhbmllOiBWc3R1cCBuZXBvY2jhZHphIHogdGVybWlu4Wx1XG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE5NQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyBwcu1rYXpvdv0gcmlhZG9rIgorCisjOiBtYWluLmM6MTIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogTmVk4SBzYSDo7XRhuyB6IFwiJXNcIiIKKworIzogbWFpbi5jOjIyMDUKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBvZHJvYm5larlpZSBpbmZvcm3hY2llIHrtc2vhdGUgcG9tb2NvdSBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIltz+mJvciAuLl0gLi4gICAgICAgICAgdXByYXZpuyBz+mJvcih5KSIKKworIzogbWFpbi5jOjIyMzkKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICAgICAgIOjtdGG7IHRleHQgeiC5dGFuZGFyZG7paG8gdnN0dXB1IgorCisjOiBtYWluLmM6MjI0MAorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHRhZyAgICAgICAgICB1cHJhdmm7IHP6Ym9yIG5hIG1pZXN0ZSBkZWZpbu1jaWUgdGFndSIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtjaHlib3b9IHP6Ym9yXSAgdXByYXZpuyBz+mJvciBuYSBtaWVzdGUgdv1za3l0dSBwcnZlaiBjaHlieSIKKworIzogbWFpbi5jOjIyNTEKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisicG91vml0aWU6IgorCisjOiBtYWluLmM6MjI1NAorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICJ2aW0gW2FyZ3VtZW50eV0gIgorCisjOiBtYWluLmM6MjI1OAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICBhbGVibyIKKworIzogbWFpbi5jOjIyNjEKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiQXJndW1lbnR5OlxuIgorCisjOiBtYWluLmM6MjI2MgorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0TfS+dSBuYXNsZWRvdmG7IGliYSBu4Xp2eSBz+mJvcm92IgorCisjOiBtYWluLmM6MjI2NAorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx0bmVwb2RhcmlsbyBzYSBleHBhbmRvdmG7IL5vbO1rb3bpIHpuYWt5ICh3aWxkY2FyZHMpIgorCisjOiBtYWluLmM6MjI2NworbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdHByaWhs4XNpuyBndmltIG5hIE9MRSIKKworIzogbWFpbi5jOjIyNjgKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdG9kaGzhc2m7IGd2aW0geiBPTEUiCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHRzcHVzdGm7IHYgR1VJIG3zZGUgKHJvdm5ha+kgYWtvIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjIyNzIKK21zZ2lkICItZlx0XHRcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mXHRcdFx0UG9wcmVkaWU6IHByaSBzcHVzdGVu7SBHVUkgc2EgbmVvZGRlbO0gb2Qgc2hlbGx1IgorCisjOiBtYWluLmM6MjI3NAorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIG3zZCAocm92bmFr6SBha28gXCJ2aVwiKSIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeCBt82QgKHJvdm5ha+kgYWtvIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjc2Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdFRpY2j9IChk4XZrb3b9KSBt82QgKGliYSBwcmUgXCJleFwiKSIKKworIzogbWFpbi5jOjIyNzgKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx0UG9yb3Zu4XZhY+0gbfNkIChyb3ZuYWvpIGFrbyBcInZpbWRpZmZcIikiCisKKyM6IG1haW4uYzoyMjgwCittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHRKZWRub2R1Y2j9IG3zZCAocm92bmFr6SBha28gXCJldmltXCIsIG1vZGVsZXNzKSIKKworIzogbWFpbi5jOjIyODEKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdE3zZCBpYmFfcHJlX+jtdGFuaWUgKGFrbyBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyMjgyCittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdE9ibWVkemVu/SBt82QgKHJvdm5ha+kgYWtvIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjIyODMKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdFptZW55ICh1a2xhZGFuaWUgc/pib3JvdikgemFr4XphbukiCisKKyM6IG1haW4uYzoyMjg0Cittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0Wm1lbnkgdiB0ZXh0ZSBuaWUgc/ogcG92b2xlbukiCisKKyM6IG1haW4uYzoyMjg1Cittc2dpZCAiLWJcdFx0XHRCaW5hcnkgbW9kZSIKK21zZ3N0ciAiLWJcdFx0XHRCaW7hcm55IG3zZCIKKworIzogbWFpbi5jOjIyODcKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwIG3zZCIKKworIzogbWFpbi5jOjIyODkKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdEtvbXBhdGFiaWxu/SBzIFZpOiAnY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0S29tcGF0aWJpbGl0YSBzIFZpIHZ5cG51dOE6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjI5MQorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdNpyb3Zl8iB2/XBpc3UgaGzhuW9rIgorCisjOiBtYWluLmM6MjI5MgorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx0TGFkaWFjaSBt82QiCisKKyM6IG1haW4uYzoyMjkzCittc2dpZCAiLW5cdFx0XHRObyBzd2FwIGZpbGUsIHVzZSBtZW1vcnkgb25seSIKK21zZ3N0ciAiLW5cdFx0XHROZWJ1ZGUgdnl0duFyYbsgb2RrbGFkYWPtIHP6Ym9yLCBidWRlIHBvdb7tdmG7IGliYSBwYW3kuyIKKworIzogbWFpbi5jOjIyOTQKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRWeXDtuWUgem96bmFtIG9ka2xhZGFj7WNoIHP6Ym9yb3YgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMjk1Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yIG7hem92IHP6Ym9ydVx0T2Jub3btIHByZXJ1uWVu6SBzZWRlbmllIgorCisjOiBtYWluLmM6MjI5NgorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHRSb3ZuYWvpIGFrbyAtciIKKworIzogbWFpbi5jOjIyOTgKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx0TmVidWRlIHBvdb7tdmG7IG5ld2NsaSBwcmUgb3R2b3JlbmllIG9rbmEiCisKKyM6IG1haW4uYzoyMjk5Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8emFyaWFkZW5pZT5cdFx0UG91vmm7IDx6YXJpYWRlbmllPiBwcmUgSS9PIgorCisjOiBtYWluLmM6MjMwMgorbXNnaWQgIi1IXHRcdFx0c3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0bmEgc3B1c3Rlbu1lIHYgaGVicmVqc2tvbSBt82RlIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIi1GXHRcdFx0c3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0XHRuYSBzcHVzdGVu7WUgdm8gRmFyc2kgbfNkZSIKKworIzogbWFpbi5jOjIzMDcKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA8dGVybWlu4Ww+XHROYXN0YXbtIHR5cCB0ZXJtaW7hbHUgbmEgPHRlcm1pbuFsPiIKKworIzogbWFpbi5jOjIzMDgKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRQb3W+aWplIDx2aW1yYz4gbmFtaWVzdG8gYWvpaG9rb7V2ZWsgLnZpbXJjIgorCisjOiBtYWluLmM6MjMxMAorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRQb3W+aWplIDxndmltcmM+IG5hbWllc3RvIGFr6Whva2+1dmVrIC5ndmltcmMiCisKKyM6IG1haW4uYzoyMzEyCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdE5lbmFocuEgJ3BsdWdpbicgc2tyaXB0eSIKKworIzogbWFpbi5jOjIzMTMKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHRPdHZvcu0gTiBva2llbiAoaW1wbGljaXRuZSBqZWRubyBwcmUga2G+ZP0gc/pib3IpIgorCisjOiBtYWluLmM6MjMxNAorbXNnaWQgIi1PW05dXHRcdGxpa2UgLW8gYnV0IHNwbGl0IHZlcnRpY2FsbHkiCittc2dzdHIgIi1PW05dXHRcdGFrbyAtbyBhbGUgcm96ZGVs7SB2ZXJ0aWvhbG5lIgorCisjOiBtYWluLmM6MjMxNQorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdE5hc3Rhdu0ga3Vyem9yIG5hIGtvbmllYyBz+mJvcnUiCisKKyM6IG1haW4uYzoyMzE2Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxyaWFkb2s+XHRcdE5hc3Rhdu0ga3Vyem9yIG5hIDxyaWFkb2s+IgorCisjOiBtYWluLmM6MjMxOAorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxwcu1rYXo+XHRcdFZ5a29u4SA8cHLta2F6PiBwcmVkIG5haHJhbu1tIHZpbXJjIHP6Ym9ydSIKKworIzogbWFpbi5jOjIzMjAKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPHBy7Wthej5cdFx0UG8gbmFocmFu7SBwcnbpaG8gc/pib3J1IHZ5a29u4SA8cHLta2F6PiIKKworIzogbWFpbi5jOjIzMjEKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZWRlbmllPlx0XHRQbyBuYWhy4W7tIHBydulobyBz+mJvcnUgdnlrb27hIHBy7WthenkgdiBz+mJvcmUgPHNlZGVuaWU+IgorCisjOiBtYWluLmM6MjMyMgorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDxza3JpcHQ+XHRcdE5h6O10YSBwcu1rYXp5IG5vcm3hbG5laG8gbfNkdSB6byA8c2tyaXB0dT4iCisKKyM6IG1haW4uYzoyMzIzCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNrcmlwdD5cdFx0UHJpcG9q7SB2uWV0a3kgbmFw7XNhbukgcHLta2F6eSBkbyBz+mJvcnUgPHNrcmlwdD4iCisKKyM6IG1haW4uYzoyMzI0Cittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2tyaXB0Plx0XHRVbG++7SB2uWV0a3kgbmFw7XNhbukgcHLta2F6eSBkbyBz+mJvcnUgPHNrcmlwdD4iCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHTacHJhdmEgemG5aWZyb3Zhbv1jaCBz+mJvcm92IgorCisjOiBtYWluLmM6MjMzMAorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxlaj5cdFNwdXN07SB2aW0gbmEgPGRpc3BsZWo+IgorCisjOiBtYWluLmM6MjMzMgorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0TmVwcmlwb2rtIHNhIGsgWCBzZXJ2ZXJ1IgorCisjOiBtYWluLmM6MjMzNAorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdE90dm9y7SBWaW0gdm76dHJpIGlu6WhvIEdUSyBwcm9ncmFtdS4iCisKKyM6IG1haW4uYzoyMzM4Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUgPHP6Ym9yeT5cdFVwcmF2absgPHP6Ym9yeT4gbmEgVmltIHNlcnZyaSBhIHNrb27oabsiCisKKyM6IG1haW4uYzoyMzM5Cittc2dpZCAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8c/pib3J5Plx0QWtvIC0tcmVtb3RlIGFsZSDoYWvhIG5hIHP6Ym9yeSBwcmUgdWtvbuhlbmllIPpwcmF2IgorCisjOiBtYWluLmM6MjM0MAorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPHZvtWJ5Plx0T2RvuWxlIDx2b7VieT4gbmEgVmltIHNlcnZlciBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLXJlbW90ZS1leHByIDxleHByPlx0RXZhbHVhdGUgPGV4cHI+IGluIGEgVmltIHNlcnZlciBhbmQgcHJpbnQgcmVzdWx0IgorbXNnc3RyICItLXJlbW90ZS1leHByIDx2/XJhej5cdFNwdXN0aSA8dv1yYXo+IG5hIHNlcnZyaSBhIHZ5dGxh6O0gdv1zbGVkb2siCisKKyM6IG1haW4uYzoyMzQyCittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRWeXDtuWUgem96bmFtIG1pZW4gZG9zdHVwbv1jaCBWaW0gc2VydnJvdiBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNDMKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8buF6b3Y+XHRPZG+5bGUgbmEgVmltIHNlcnZlciA8buF6b3Y+IgorCisjOiBtYWluLmM6MjM0NgorbXNnaWQgIi1pIDx2aW1pbmZvPlx0XHRVc2UgPHZpbWluZm8+IGluc3RlYWQgb2YgLnZpbWluZm8iCittc2dzdHIgIi1pIDx2aW1pbmZvPlx0XHRQb3W+aWplIDx2aW1pbmZvPiBuYW1pZXN0byBha+lob2tvtXZlayAudmltaW5mbyIKKworIzogbWFpbi5jOjIzNDgKK21zZ2lkICItaFx0XHRcdHByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oXHRcdFx0Vnlw7bllIHT6dG8gbuFwb3ZlZHUgYSBza29u6O0iCisKKyM6IG1haW4uYzoyMzQ5Cittc2dpZCAiLS12ZXJzaW9uXHRcdHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHR2eXDtuWUgaW5mb3Jt4WNpZSBvIHZlcnppaSBhIHNrb27o7SIKKworIzogbWFpbi5jOjIzNTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKE1vdGlmIHZlcnppYSk6XG4iCisKKyM6IG1haW4uYzoyMzU2Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50eSBwcmUgZ3ZpbSAoQXRoZW5hIHZlcnppYSk6XG4iCisKKyM6IG1haW4uYzoyMzU5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsZWo+XHRTcHVzdO0gdmltIG5hIDxkaXNwbGVqPiIKKworIzogbWFpbi5jOjIzNjAKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0U3B1c3TtIHZpbSBtaW5pbWFsaXpvdmFu6SIKKworIzogbWFpbi5jOjIzNjIKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8buF6b3Y+XHRcdFBvdb5pamUgcmVzb3VyY2UgYWtvIGJ5IHZpbSBtYWwgPG7hem92PiIKKworIzogbWFpbi5jOjIzNjMKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgIChuaWUgamUgaW1wbGVtZW50b3ZhbukpXG4iCisKKyM6IG1haW4uYzoyMzY1Cittc2dpZCAiLWJhY2tncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIHRoZSBiYWNrZ3JvdW5kIChhbHNvOiAtYmcpIgorbXNnc3RyICItYmFja2dyb3VuZCA8ZmFyYmE+XHROYXN0YXbtIHNhIDxmYXJiYT4gcG96YWRpYSAodGllviAtYmcpIgorCisjOiBtYWluLmM6MjM2NgorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGZhcmJhPlx0TmFzdGF27SBzYSA8ZmFyYmE+IHBvcHJlZGlhICh0aWW+IC1mZykiCisKKyM6IG1haW4uYzoyMzY3IG1haW4uYzoyMzg3Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8cO1zbW8+XHRcdE5hc3Rhdu0gPHDtc21vPiBub3Jt4WxuZWhvIHRleHR1ICh0aWW+IC1mbikiCisKKyM6IG1haW4uYzoyMzY4Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHByZSB6dv1yYXpuZW79IHRleHQiCisKKyM6IG1haW4uYzoyMzY5Cittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPHDtc21vPlx0TmFzdGF27SA8cO1zbW8+IHByZSBrdXJ67XZ1IgorCisjOiBtYWluLmM6MjM3MCBtYWluLmM6MjM4OAorbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tZXRyaWU+XHROYXN0YXbtIHNhIDxnZW9tZXRyaWE+ICh0aWW+IC1nZW9tKSIKKworIzogbWFpbi5jOjIzNzEKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8ue1ya2E+XHROYXN0YXbtIDy57XJrdT4gb2tyYWpvdiAodGllviAtYncpIgorCisjOiBtYWluLmM6MjM3MgorbXNnaWQgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICBVc2UgYSBzY3JvbGxiYXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLXN3KSIKK21zZ3N0ciAiLXNjcm9sbGJhcndpZHRoIDy57XJrYT4gIE5hc3Rhdu0gPLntcmt1PiBwb3N1dm5laiBsabl0eSAodGllviAtc3cpIgorCisjOiBtYWluLmM6MjM3NAorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDx2/blrYT5cdE5hc3Rhdu0gPHb9uWt1PiBwb251a3kgKHRpZb4gLW1oKSIKKworIzogbWFpbi5jOjIzNzYgbWFpbi5jOjIzODkKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0UG91vmlqZSByZXZlcnpu6SBmYXJieSAodGllviAtcnYpIgorCisjOiBtYWluLmM6MjM3NworbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHROZXBvdb5pamUgcmV2ZXJ6bukgZmFyYnkgKHRpZb4gK3J2KSIKKworIzogbWFpbi5jOjIzNzgKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDxyZXNvdXJjZT5cdE5hc3Rhdu0gemFkYW79IDxyZXNvdXJjZT4iCisKKyM6IG1haW4uYzoyMzgxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKFJJU0MgT1MgdmVyemlhKTpcbiIKKworIzogbWFpbi5jOjIzODIKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8cG/oZXQ+XHQ8cG/oZXQ+IHN05XBjb3YgbmEgb2tubyIKKworIzogbWFpbi5jOjIzODMKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPHBv6GV0Plx0PHBv6GV0PiByaWFka292IG5hIG9rbm8iCisKKyM6IG1haW4uYzoyMzg2Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudHkgcHJlIGd2aW0gKEdUSysgdmVyemlhKTpcbiIKKworIzogbWFpbi5jOjIzOTAKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxlaj5cdHNwdXN07SB2aW0gbmEgPGRpc3BsZWo+ICh0aWW+IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyMzkyCittc2dpZCAiLS1oZWxwXHRcdFNob3cgR25vbWUgYXJndW1lbnRzIgorbXNnc3RyICItLWhlbHBcdFx0Vnlw7bllIEdub21lIGFyZ3VtZW50eSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI2MzQKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJPZG9zbGFuaWUgemx5aGFsby5cbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNjM5Cittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIiIKKyJcbiIKKyJPZG9zbGFuaWUgemx5aGFsby4gUG9r+rlhbSBzYSBzcHVzdGm7IGxva+FsbmVcbiIKKworIzogbWFpbi5jOjI2NzIgbWFpbi5jOjI2OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCB1cHJhdmVu/WNoIHP6Ym9yb3YgeiAlZCIKKworIzogbWFpbi5jOjI3MTYKK21zZ2lkICJTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICJPZG9zbGFuaWUgdv1yYXp1IHpseWhhbG8uXG4iCisKKyM6IG1hcmsuYzo2NjAKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIk5pZSBz+iBuYXN0YXZlbukgvmlhZG5lIHpuYehreSIKKworIzogbWFyay5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6XCIlc1wiIG5ldnlob3Z1avogvmlhZG5lIHpuYehreSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjczCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorInpuYehrYSByaWFkb2sgIHN05XBlYyBz+mJvci90ZXh0IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MTEKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiBza29rIHJpYWRvayBzdOVwZWMgc/pib3IvdGV4dCIKKworIzogbWFyay5jOjEwNzMKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBT+mJvcm926SB6bmHoa3k6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTEwOAorbXNnaWQgIiIKKyJcbiIKKyIjIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBab3puYW0gc2tva292ICh6YejtbmFq+mNpIG5ham5vdrlvdSBwb2xvvmtvdSk6XG4iCisKKyM6IG1hcmsuYzoxMjAzCittc2dpZCAiIgorIlxuIgorIiMgSGlzdG9yeSBvZiBtYXJrcyB3aXRoaW4gZmlsZXMgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBIaXN083JpYSB6bmHoaWVrIHYgc/pib3JvY2ggKHph6O1uYWr6Y2kgbmFqbm92uW91IHBvbG++a291KTpcbiIKKworIzogbWFyay5jOjEyODYKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiQ2j9YmEgJz4nIgorCisjOiBtYnl0ZS5jOjM5NQorbXNnaWQgIk5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJDaHlibuEga/Nkb3bhIHN0cuFua2EiCisKKyM6IG1ieXRlLmM6MzEwMworbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiBOZWRq+iBzYSBuYXN0YXZpuyBJQyBob2Rub3R5IgorCisjOiBtYnl0ZS5jOjMyNTUKK21zZ2lkICJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiCittc2dzdHIgIkUyODU6IE5lcG9kYXJpbG8gc2Egdnl0dm9yabsgdnN0dXBu/SBrb250ZXh0IgorCisjOiBtYnl0ZS5jOjM0MDIKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6IE5lcG9kYXJpbG8gc2Egb3R2b3JpuyB2c3R1cG76IG1ldPNkdSIKKworIzogbWJ5dGUuYzozNDEzCittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBWYXJvdmFuaWU6IGxpa3ZpZGHobukgc3DkdG7pIHZvbGFuaWUgc2EgbmVk4SBuYXN0YXZpuyBuYSBJTSIKKworIzogbWJ5dGUuYzozNDE5Cittc2dpZCAiRTI4ODogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgc3R5bGUiCittc2dzdHIgIkUyODg6IHZzdHVwbuEgbWV082RhIG5lcG9kcG9ydWplIL5pYWRueSC5dP1sIgorCisjOiBtYnl0ZS5jOjM0NzYKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogdnN0dXBu4SBtZXTzZGEgbmVwb2Rwb3J1amUgbfRqICdwcmVlZGl0JyB0eXAiCisKKyM6IG1ieXRlLmM6MzU1MAorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogTmFkYm9kb3b9ILl0/Wwgdnm+YWR1amUgZm9udHNldCIKKworIzogbWJ5dGUuYzozNTc4Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiBN4XRlIEdUSysgdmVyeml1IHN0YXK5aXUgbmW+IDEuMi4zLiBTdGF2b3bhIHBsb2NoYSB2eXBudXThLiIKKworIzogbWJ5dGUuYzozODQzCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogU2VydmVyIHZzdHVwbv1jaCBtZXTzZCBuZWJlvu0iCisKKyM6IG1lbWZpbGUuYzo0ODgKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5MzogYmxvayBuZWJvbCB6YW1rbnV0/SIKKworIzogbWVtZmlsZS5jOjk4OQorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IENoeWJhIHBvc3VudSBwcmkg6O10YW7tIG9ka2xhZGFjaWVobyBz+mJvcnUiCisKKyM6IG1lbWZpbGUuYzo5OTQKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogQ2h5YmEgcHJpIOjtdGFu7SBvZGtsYWRhY2llaG8gc/pib3J1IgorCisjOiBtZW1maWxlLmM6MTA0NgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBDaHliYSBwb3N1bnUgcHJpIHVrbGFkYW7tIGRvIG9ka2xhZGFjaWVobyBz+mJvcnUiCisKKyM6IG1lbWZpbGUuYzoxMDY0Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiBDaHliYSBwcmkgdWtsYWRhbu0gZG8gb2RrbGFkYWNpZWhvIHP6Ym9ydSIKKworIzogbWVtZmlsZS5jOjEyNjEKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IE9ka2xhZGFj7SBz+mJvciB1viBleGlzdHVqZSEiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBOZWThIHNhIHrtc2thuyBibG9rIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogTmVk4SBzYSB67XNrYbsgYmxvayAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IE5lZOEgc2Egeu1za2G7IGJsb2sgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IFVwcywgb2RrbGFkYWPtIHP6Ym9yIGJvbCBzdHJhdGVu/SEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiBOZWThIHNhIHByZW1lbm92Ybsgb2RrbGFkYWPtIHP6Ym9yIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiBOZWThIHNhIG90dm9yabsgb2RrbGFkYWPtIHP6Ym9yIHByZSBcIiVzXCIsIG9wcmF2YSBuaWUgamUgbmVtb75u4SIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogbmVk4SBzYSB67XNrYbsgYmxvayAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTogT2RrbGFkYWPtIHP6Ym9yIHByZSAlcyBuZWJvbCBu4WpkZW79IgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiWmFkYWp0ZSDo7XNsbyBvZGtsYWRhY2llaG8gc/pib3J1LCBrdG9y/SBzYSBt4SBwb3W+aXQgKDAgcHJlIHVrb27oZW5pZSk6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogTmVk4SBzYSBvdHZvcmm7ICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAiTmVk4SBzYSDo7XRhuyBibG9rIDAgeiAiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiTW++bm8gbmVkb7lsbyBrIL5pYWRueW0gem1lbuFtLCBhbGVibyBWaW0gbmVha3R1YWxpem92YWwgb2RrbGFkYWPtIHP6Ym9yLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIG5lZOEgc2EgcG91vmm7IHMgdG91dG8gdmVyemlvdSBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJQb3W+aXRlIFZpbSB2ZXJ6aXUgMy4wLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIHNhIG5lemThIGJ5uyBvZGtsYWRhY+1tIHP6Ym9yb20gVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiBuZWThIHNhIHBvdb7tuyBuYSB0b210byBwb+jtdGHoaS5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAiU/pib3IgYm9sIHZ5dHZvcmVu/SAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorImFsZWJvIGJvbCBz+mJvciBwb7lrb2Rlbv0uIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIlBvdb7tduFtIG9ka2xhZGFj7SBz+mJvciBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIlD0dm9kbv0gc/pib3IgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTM0Cittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IFZhcm92YW5pZTogUPR2b2Ru/SBz+mJvciBtb2hsIGJ5uyB6bWVuZW79IgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogTmVk4SBzYSDo7XRhuyBibG9rIDEgeiAlcyIKKworIzogbWVtbGluZS5jOjk3OQorbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0jdQkEgTU5PSE8gUklBREtPViIKKworIzogbWVtbGluZS5jOjk5NQorbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P0NIWUJO3SBQT8hFVCBSSUFES09WIgorCisjOiBtZW1saW5lLmM6MTAwMgorbXNnaWQgIj8/P0VNUFRZIEJMT0NLIgorbXNnc3RyICI/Pz9QUsFaRE5ZIEJMT0siCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/Q0jdQkFK2kNFIFJJQURLWSIKKworIzogbWVtbGluZS5jOjEwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IElEIGJsb2t1IDEgamUgY2h5Ym7pIChqZSAlcyBvZGtsYWRhY+1tIHP6Ym9yb20/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz9DSN1CQSBCTE9LIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbfS+dSBiebsgcmlhZGt5IHBvbWlluWFu6SIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIm9kID8/PyBwbyA/Pz9FTkQgbfS+dSBiebsgdmxvvmVu6S92eW1hemFu6SByaWFka3kiCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9LT05JRUMiCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IE9ibm92YSBwcmVydbllbuEiCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiRTMxMjogRXJyb3JzIGRldGVjdGVkIHdoaWxlIHJlY292ZXJpbmc7IGxvb2sgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggPz8/IgorbXNnc3RyICJFMzEyOiBWIHByaWViZWh1IG9ibm92eSBkb7lsbyBrIGNoeWLhbTsgc2tvbnRyb2x1anRlIHJpYWRreSB6YejtbmFq+mNlIG5hID8/PyIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIk9ibm92YSBkb2tvbuhlbuEuIFNrb250cm9sdWp0ZSwg6GkgamUgdrlldGtvIHYgcG9yaWFka3UuIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihaduG+dGUgdWxvvmVuaWUgdG9ob3RvIHP6Ym9ydSBwb2QgaW79bSBtZW5vbVxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICJhIHBvbW9jb3UgcHJvZ3JhbXUgZGlmZiB6aXN0aXRlIHptZW55IG9wcm90aSBw9HZvZG7pbXUgc/pib3J1LilcbiIKKworIzogbWVtbGluZS5jOjExNTEKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiUG90b20gdnltYb50ZSBvZGtsYWRhY+0gc/pib3IuXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIwNworbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICJO4WpkZW7pIG9ka2xhZGFjaWUgc/pib3J5OiIKKworIzogbWVtbGluZS5jOjEzODUKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgViBha3R14Wxub20gYWRyZXPhcmk6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzg3Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIFNvIHphZGFu/W0gbWVub206XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAgViBhZHJlc+FyaSAiCisKKyM6IG1lbWxpbmUuYzoxNDA5Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSC+aWFkbmUgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgIHZsYXN0bu1rOiAiCisKKyM6IG1lbWxpbmUuYzoxNDgzCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGThdHVtIHZ5dHZvcmVuaWE6ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM2ODAKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGThdHVtIHZ5dHZvcmVuaWE6ICIKKworIzogbWVtbGluZS5jOjE1MDMKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbb2QgVmltIHZlcnppZSAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUwNworbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW25ldnlwYWThIGFrbyBvZGtsYWRhY+0gc/pib3IgVmltXSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgbuF6b3Ygc/pib3J1OiAiCisKKyM6IG1lbWxpbmUuYzoxNTIzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIGThdHVtIHptZW55OiAiCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAiWUVTIgorbXNnc3RyICLBTk8iCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAibm8iCittc2dzdHIgIm5pZSIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICB1vu12YXRltXNr6SBtZW5vOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM1Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgICAgICAgIG7hem92IHBv6O10YehhOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgbuF6b3YgcG/o7XRh6GE6ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIElEIHByb2Nlc3UgOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiIChzdOFsZSBha3Ttdm55KSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtuZXBvdb5pdGW1bukgcyB0b3V0byB2ZXJ6aW91IFZpbV0iCisKKyM6IG1lbWxpbmUuYzoxNTY0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW25lcG91vml0ZWxu6SBuYSB0b210byBwb+jtdGHoaV0iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW25lZOEgc2EgcHJl6O10YbtdIgorCisjOiBtZW1saW5lLmM6MTU3MworbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgb3BlbmVkXSIKK21zZ3N0ciAiICAgICAgICAgW25lZOEgc2Egb3R2b3Jpu10iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IE5lZOEgc2EgemFjaG92YbsgLSBvZGtsYWRhY+0gc/pib3IgbmVleGlzdHVqZS4iCisKKyM6IG1lbWxpbmUuYzoxODE2Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIlP6Ym9yIHphY2hvdmFu/SIKKworIzogbWVtbGluZS5jOjE4MTgKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6IFVjaG92YW5pZSBzYSBuZXBvZGFyaWxvIgorCisjOiBtZW1saW5lLmM6MTg4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IGNoeWJu6SDo7XNsbyByaWFka3U6ICVsZCIKKworIzogbWVtbGluZS5jOjE5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiBuZWThIHNhIG7hanO7IHJpYWRvayAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMzAzCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBjaHlibukgaWQgdWthem92YXRltWEgbmEgYmxvayAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IGJ5IG1hbG8gbWG7IGhvZG5vdHUgMyIKKworIzogbWVtbGluZS5jOjI0NDUKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IEFrdHVhbGl6b3Zhbv1jaCBwcu1sabkgdmW1YSBibG9rb3Y/IgorCisjOiBtZW1saW5lLmM6MjYwMgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzogY2h5Ym7pIGlkIHVrYXpvdmF0ZbVhIG5hIGJsb2sgNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJ2eW1hemFu/SBibG9rIDE/IgorCisjOiBtZW1saW5lLmM6MjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogTmVk4SBzYSBu4WpzuyByaWFkb2sgJWxkIgorCisjOiBtZW1saW5lLmM6MzA3MgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IGNoeWJu6SBpZCB1a2F6b3ZhdGW1YSBuYSBibG9rIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCBt4SBudWxvdvogaG9kbm90dSIKKworIzogbWVtbGluZS5jOjMxMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiDo7XNsbyByaWFka3UgamUgbWltbyByb3pzYWg6ICVsZCAoemEga29uY29tKSIKKworIzogbWVtbGluZS5jOjMxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IGNoeWJu/SBwb+hldCByaWFka292IHYgYmxva3UgJWxkIgorCisjOiBtZW1saW5lLmM6MzE3MAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICJO4XJhc3QgdmW1a29zdGkgeuFzb2Ju7Wt1IgorCisjOiBtZW1saW5lLmM6MzIxNgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogY2h5Ym79IGlkIHVrYXpvdmF0ZbVhIG5hIGJsb2sgMiIKKworIzogbWVtbGluZS5jOjM2NzAKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IFBPWk9SIgorCisjOiBtZW1saW5lLmM6MzY3MQorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIk7hamRlbv0gb2RrbGFkYWPtIHP6Ym9yIHMgbWVub20gXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICJQcmkgb3R24XJhbu0gc/pib3J1XCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIE5PVqnNIGFrbyBvZGtsYWRhY+0gc/pib3IhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgU/pib3IgbfS+ZSBiebsgdXByYXZvdmFu/SBpbv1tIHByb2dyYW1vbS5cbiIKKyIgICAgQWsgamUgdG9tdSB0YWssIHBvdG9tIHNpIGRhanRlIHBvem9yLCBhYnkgc3RlIHBvIHVsb75lbu0gem1pZW5cbiIKKyIgICAgbmVtYWxpIGR2ZSBy9HpuZSB2ZXJ6aWUgdG9obyBpc3TpaG8gc/pib3J1LlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICBVa29u6Gl0ZSBwcm9ncmFtLCBhbGVibyBvcGF0cm5uZSBwb2tyYeh1anRlIHYg+nByYXbhY2guXG4iCisKKyM6IG1lbWxpbmUuYzozNjkwCittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpINpwcmF2YSB0b2hvdG8gc/pib3J1IGJvbGEgcHJlcnW5ZW7hIG5lb+hha+F2YW79bSB1a29u6GVu7W0gcHJvZ3JhbXUuXG4iCisKKyM6IG1lbWxpbmUuYzozNjkxCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgQWsgamUgdG9tdSB0YWssIHBvdG9tIHBvdb5pdGUgXCI6cmVjb3ZlclwiIGFsZWJvIFwidmltIC1yICIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBwcmUgb2Jub3ZlbmllIHptaWVuICh2aXogXCI6aGVscCByZWNvdmVyeSlcIi5cbiIKKworIzogbWVtbGluZS5jOjM2OTQKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgUG9raWG1IHN0ZSB0YWsgdb4gdXJvYmlsaSwgdGFrIHZ5bWG+dGUgb2RrbGFkYWPtIHP6Ym9yIFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICBhIHThdG8gc3By4XZhIHNhIHW+IG5lYnVkZSBvYmphdm92YbsuXG4iCisKKyM6IG1lbWxpbmUuYzozNzEwIG1lbWxpbmUuYzozNzE0Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICJPZGtsYWRhY+0gc/pib3IgXCIiCisKKyM6IG1lbWxpbmUuYzozNzExIG1lbWxpbmUuYzozNzE3Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiB1viBleGlzdHVqZSEiCisKKyM6IG1lbWxpbmUuYzozNzIwCittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSBQT1pPUiIKKworIzogbWVtbGluZS5jOjM3MjIKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJPZGtsYWRhY+0gc/pib3Igdb4gZXhpc3R1amUhIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisiJk90dm9yabsgaWJhIHByZSDo7XRhbmllXG4iCisiJlBva3Jh6G92YbsgdiD6cHJhduFjaFxuIgorIk8mYm5vdmm7IHP6Ym9yXG4iCisiJktvbmllYyIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyImT3R2b3JpuyBpYmEgcHJlIOjtdGFuaWVcbiIKKyImUG9rcmHob3ZhdCB2IPpwcmF24WNoXG4iCisiTyZibm92absgc/pib3JcbiIKKyImS29uaWVjXG4iCisiJlptYXphuyIKKworIzogbWVtbGluZS5jOjM3ODEKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiBQcu1sabkgbW5vaG8gb2RrbGFkYWPtY2ggc/pib3JvdiIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IMhhc7sgY2VzdHkgayBwcmVkbWV0dSBwb251a3kgbmllIGplIHBvZHBvbnVrb3UiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBQb251a2EgZXhpc3R1amUgaWJhIHYgaW5vbSBt82RlIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogUG9udWthIHRvaG90byBtZW5hIG5lZXhpc3R1amUiCisKKyM6IG1lbnUuYzo1MDkKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiBDZXN0YSBwb251a3kgbmVzbWllIHZpZXO7IGRvIHBvZHBvbnVreSIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiBQb2xvvmt5IHBvbnVreSBzYSBuZWRq+iBwcmlk4XZhuyBwcmlhbW8gbmEgbGm5dHUiCisKKyM6IG1lbnUuYzo1NTQKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6IE9kZGW1b3Zh6CBuZXNtaWUgYnm7IOhhc7tvdSBjZXN0eSBwb251a3kiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNzAKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBQb251a3kgLS0tIgorCisjOiBtZW51LmM6MTk4NworbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAiT2R0cmhu+rsgdHV0byBwb251a3UiCisKKyM6IG1lbnUuYzoyMDUyCittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogQ2VzdGEgcG9udWt5IG11c+0gdmllc7sgayBwb2xvvmtlIHBvbnVreSIKKworIzogbWVudS5jOjIwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBWem9yIG5lbuFqZGVu/TogJXMiCisKKyM6IG1lbnUuYzoyMTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6IFYgJXMgbfNkZSBuaWUgamUgcG9udWthIGRlZmlub3ZhbuEiCisKKyM6IG1lbnUuYzoyMTc5Cittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBDZXN0YSBwb251a3kgbXVz7SB2aWVzuyBkbyBwb2Rwb251a3kiCisKKyM6IG1lbnUuYzoyMjAwCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBQb251a2EgbmVu4WpkZW7hIC0gc2tvbnRyb2x1anRlIG7henZ5IHBvbvprIgorCisjOiBtZXNzYWdlLmM6NDcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICJDaHliYSBwcmkgc3ByYWNvdmFu7SAlczoiCisKKyM6IG1lc3NhZ2UuYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAicmlhZG9rICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTI2Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIltwcu1sabkgZGxo/SByZbthemVjXSIKKworIzogbWVzc2FnZS5jOjY3MgorbXNnaWQgIk1lc3NhZ2VzIG1haW50YWluZXI6IEJyYW0gTW9vbGVuYWFyIDxCcmFtQHZpbS5vcmc+IgorbXNnc3RyICJTcHLhdmNhIHNwcuF2OiBNYXJ0aW4gTGFja28gPGxhY2tvQGhvc3Quc2s+IgorCisjOiBtZXNzYWdlLmM6ODg1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIlByZXJ1uWVuaWU6ICIKKworIzogbWVzc2FnZS5jOjg4OAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiUG9rcmHob3ZhbmllIHN0bGHoZW7tbSBFTlRFUiIKKworIzogbWVzc2FnZS5jOjg5MAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIlByZSBwb2tyYehvdmFuaWUgc3RsYeh0ZSBFTlRFUiBhbGVibyB6YWRhanRlIHBy7WtheiIKKworIzogbWVzc2FnZS5jOjE5NjEKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBQb2tyYehvdmFuaWUgLS0iCisKKyM6IG1lc3NhZ2UuYzoxOTY0Cittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IHJpYWRvaywgTUVEWkVSTs1LL2I6IHN0cuFua2EsIGQvdTogMC41IHN0cuFua3ksIHE6IGtvbmllYykiCisKKyM6IG1lc3NhZ2UuYzoxOTY1Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDogcmlhZG9rLCBNRURaRVJOzUs6IHN0cuFua2EsIGQ6IDAuNSBzdHLhbmt5LCBxOiBrb25pZWMpIgorCisjOiBtZXNzYWdlLmM6MjQ0MSBtZXNzYWdlLmM6MjQ1NgorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJPdOF6a2EiCisKKyM6IG1lc3NhZ2UuYzoyNDQzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm8iCittc2dzdHIgIiIKKyLBbiZvXG4iCisiJk5pZSIKKworIzogbWVzc2FnZS5jOjI0NTgKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyLBbiZvXG4iCisiJk5pZVxuIgorIiZacnW5absiCisKKyM6IG1lc3NhZ2UuYzoyNDc2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiwW4mb1xuIgorIiZOaWVcbiIKKyImVWxvvmm7IHa5ZXRrb1xuIgorIlphaG9kabsgJna5ZXRrb1xuIgorIiZacnW5absiCisKKyM6IG1lc3NhZ2UuYzoyNTE3Cittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAiRGlhbPNnIHByZSB1a2xhZGFuaWUgc/pib3JvdiIKKworIzogbWVzc2FnZS5jOjI1MTkKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICJEaWFs82cgcHJlIG90duFyYW5pZSBz+mJvcm92IgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI1OTAKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogpXV0dWplbSwgYWxlIGtvbnpvbG924SB2ZXJ6aWEgbmVwb2Rwb3J1amUgcHJlaGxpYWRh6CBz+mJvcm92IgorCisjOiBtaXNjMS5jOjI0NTcKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiBWYXJvdmFuaWU6IG1lbu1tIHP6Ym9yIGliYSBwcmUg6O10YW5pZSIKKworIzogbWlzYzEuYzoyNjg2Cittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgInBv6GV0IG5vdv1jaCByaWFka292OiAxIgorCisjOiBtaXNjMS5jOjI2ODgKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAicG/oZXQgdnltYXphbv1jaCByaWFka292OiAxIgorCisjOiBtaXNjMS5jOjI2OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgInBv6GV0IG5vdv1jaCByaWFka292OiAlbGQiCisKKyM6IG1pc2MxLmM6MjY5NQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgInBv6GV0IHZ5bWF6YW79Y2ggcmlhZGtvdjogJWxkIgorCisjOiBtaXNjMS5jOjI2OTgKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiIChQcmVydbllbukpIgorCisjOiBtaXNjMS5jOjYzMTYKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiB6YWNob3bhdmFtIHP6Ym9yeS4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjMyNgorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogdWtvbuhlbv1cbiIKKworIzogbWlzYzIuYzo2NjEgbWlzYzIuYzo2NzcKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICJDSFlCQTogIgorCisjOiBtaXNjMi5jOjY4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltiYWp0b3ZdIGNlbGtvbSB1dm9sbmVu6S1hbG9rb3ZhbukgJWx1LSVsdSwgdnl1vml06SAlbHUsIG1heGlt4WxuZSB2eXW+aXRpZSAlIgorImx1XG4iCisKKyM6IG1pc2MyLmM6NjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlt2b2xhbmllXSBjZWxrb20gcmUvbWFsbG9jKCk6ICVsdSwgY2Vsa29tIGZyZWUoKSAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3MzgKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBSaWFkb2sgc2Egc3ThdmEgcHLtbGm5IGRsaP1tIgorCisjOiBtaXNjMi5jOjc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogVm76dG9ybuEgY2h5YmE6IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiBOZWRvc3RhdG9rIHBhbeR0ZSEgKGFsb2t1amVtICVsdSBieXRvdikiCisKKyM6IG1pc2MyLmM6MjU0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAiVm9s4W0gc2hlbGwgbmEgc3B1c3RlbmllOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6Mjc0MCBtaXNjMi5jOjUyMjUgb3B0aW9uLmM6NDYzNgorbXNnaWQgIk1pc3NpbmcgY29sb24iCittc2dzdHIgIkNo/WJhIGR2b2pib2RrYSIKKworIzogbWlzYzIuYzoyNzQyIG1pc2MyLmM6Mjc2OQorbXNnaWQgIklsbGVnYWwgbW9kZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbfNkIgorCisjOiBtaXNjMi5jOjI4MDgKK21zZ2lkICJJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkNoeWJu/SB0dmFyIG15uWkiCisKKyM6IG1pc2MyLmM6Mjg0OCBtaXNjMi5jOjUyNDUKK21zZ2lkICJkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAib+hha+F2YW7hIOjtc2xpY2EiCisKKyM6IG1pc2MyLmM6Mjg1MworbXNnaWQgIklsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAiTmVwcu1zdHVwbukgcHJlY2VudG8iCisKKyM6IG1pc2MyLmM6MzE1NworbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIlphZGFqdGUguWlmcm92YWPtIGu1+ug6ICIKKworIzogbWlzYzIuYzozMTU4Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiVmxvvnRlIGu1+uggem5vdmE6ICIKKworIzogbWlzYzIuYzozMTY4Cittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIku1+uggbmllIGplIHNwcuF2bnkhIgorCisjOiBtaXNjMi5jOjM3MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBDaHlibuEgY2VzdGE6ICcqKlvo7XNsb10gbXVz7SBiebsgYnXvIG5hIGtvbmNpIGNlc3R5LCBhbGVibyBtdXPtIGJ5u1xuIgorIm5hc2xlZG92YW7pICclcy4gVml6IDpoZWxwIHBhdGguIgorCisjOiBtaXNjMi5jOjQ5NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogQWRyZXPhciBcIiVzXCIgc2EgbmVk4SB2IGNkcGF0aCBu4WpzuyIKKworIzogbWlzYzIuYzo0OTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTogU/pib3IgXCIlc1wiIHNhIG5lcG9kYXJpbG8gbuFqc7siCisKKyM6IG1pc2MyLmM6NDk4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiCuaWFkbnkg72Fsue0gYWRyZXPhciBcIiVzXCIgbmVib2wgdiBjZHBhdGggbuFqZGVu/SIKKworIzogbWlzYzIuYzo0OTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NzogrmlhZG55IO9hbLntIHP6Ym9yIFwiJXNcIiBuZWJvbCB2IGNlc3RlIG7hamRlbv0iCisKKyM6IG1pc2MyLmM6NTIzNworbXNnaWQgIklsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICJOZXBy7XN0dXBu/SBrb21wb25lbnQiCisKKyM6IG5vcm1hbC5jOjI4NDMKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJWYXJvdmFuaWU6IHRlcm1pbuFsIG5lcG9kcG9ydWplIHp2/XJhevJvdmFuaWUiCisKKyM6IG5vcm1hbC5jOjMwMzgKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiBQb2Qga3Vyem9yb20gbmllIGplIL5pYWRueSByZbthemVjIgorCisjOiBub3JtYWwuYzozMDQwCittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6IFBvZCBrdXJ6b3JvbSBuaWUgamUgvmlhZG55IGlkZW50aWZpa+F0b3IiCisKKyM6IG5vcm1hbC5jOjQyMTEKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogUG9tb2NvdSAnZm9sZG1ldGhvZCcgc2EgbmVk4SB2eW1hemG7IHrhaHliIgorCisjOiBvcHMuYzoyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICJwb+hldCByaWFka292IHBvc3VudXT9Y2ggbmFyYXogcG9tb2NvdSAlcyA6IDEiCisKKyM6IG9wcy5jOjI4NQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAicG/oZXQgcmlhZGtvdiBwb3N1bnV0/WNoICVzIGty4XQgcG9tb2NvdSAlZCBzIDogMSIKKworIzogb3BzLmM6MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkIDEgdGltZSIKK21zZ3N0ciAiJWxkIHJpYWRrb3YgcG9zdW51dP1jaCBuYXJheiBwb21vY291ICVzIgorCisjOiBvcHMuYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCByaWFka292IHBvc3VudXT9Y2ggcG9tb2NvdSAlcyAlZCBrcuF0IgorCisjOiBvcHMuYzo2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgInBv6GV0IHJpYWRrb3YgcHJlIG9kc2FkZW5pZTogJWxkIgorCisjOiBvcHMuYzo3MDEKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICJwb+hldCByaWFka292IHByZSBvZHNhZGVuaWU6IDEgIgorCisjOiBvcHMuYzo3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGluZGVudGVkICIKK21zZ3N0ciAicG/oZXQgb2RzYWRlbv1jaCByaWFka292OiAlbGQiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNTQ2Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIm5lZOEgc2Ega29w7XJvdmG7OyBuYXByaWVrIHRvbXUgdnltYXphbukiCisKKyM6IG9wcy5jOjIwODAKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAicG/oZXQgem1lbmVu/WNoIHJpYWRrb3Y6IDEiCisKKyM6IG9wcy5jOjIwODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgInBv6GV0IHptZW5lbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI0MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgInBv6GV0IHV2b2zyb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI3MjAKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICJwb+hldCBza29w7XJvdmFu/WNoIHJpYWRrb3Y6IDEiCisKKyM6IG9wcy5jOjI3MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAicG/oZXQgc2tvcO1yb3Zhbv1jaCByaWFka292OiAlbGQiCisKKyM6IG9wcy5jOjI5OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogUmVnaXN0ZXIgJXMgamUgcHLhemRueSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNTUzCittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFJlZ2lzdHJlIC0tLSIKKworIzogb3BzLmM6NDcxMQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gbuF6b3YgcmVnaXN0cnUiCisKKyM6IG9wcy5jOjQ3OTcKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIFJlZ2lzdHJlOlxuIgorCisjOiBvcHMuYzo0ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiJWQgbmllIGplIHpu4W39bSB0eXBvbSByZWdpc3RydSIKKworIzogb3BzLmM6NTIxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6ICclcycgbmllIGplIHBy7XN0dXBu6SBtZW5vIHJlZ2lzdHJ1IgorCisjOiBvcHMuYzo1NTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCBCdW5pZWs7ICIKKworIzogb3BzLmM6NTU2NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIlZ5YnJhbv1jaCAlcyVsZCB6ICVsZCByaWFka292OyAlbGQgem8gJWxkIHNsb3Y7ICVsZCB6ICVsZCBCeXRvdiIKKworIzogb3BzLmM6NTU4MworIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIkJ1bmthICVzIHogJXM7IFJpYWRvayAlbGQgeiAlbGQ7IFNsb3ZvICVsZCB6ICVsZDsgQnl0ZSAlbGQgeiAlbGQiCisKKyM6IG9wcy5jOjU1OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIHByZSBCT00pIgorCisjOiBvcHRpb24uYzoxOTg5Cittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICLPYWt1amVtIHphIHBvdb5pdGllIFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJWb7ViYSBuaWUgamUgcG9kcG9yb3ZhbuEiCisKKyM6IG9wdGlvbi5jOjMyMDAKK21zZ2lkICJOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJOaWUgamUgdiBtb2RlbGluZSBwb3ZvbGVu6SIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHRPc3RhdG7pIG5hc3RhdmVuaWUgeiAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiUG8gPSBqZSB2eb5hZG92YW7pIOjtc2xvIgorCisjOiBvcHRpb24uYzozNzE0IG9wdGlvbi5jOjQzMjIKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiTmVu4WpkZW79IHYgdGVybWNhcHUiCisKKyM6IG9wdGlvbi5jOjM3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiTmVwcu1zdHVwbv0gem5hayA8JXM+IgorCisjOiBvcHRpb24uYzo0MzA3IG9wdGlvbi5jOjU1NzAKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJUb3RvIG5pZSBqZSBuYSB0b210byBtaWVzdGUgcG92b2xlbukiCisKKyM6IG9wdGlvbi5jOjQzMTQKK21zZ2lkICJDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIlZvtWJhICd0ZXJtJyBuZW30vmUgYnm7IHBy4XpkbmEiCisKKyM6IG9wdGlvbi5jOjQzMTcKK21zZ2lkICJDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJWIEdVSSBzYSBuZWThIG1lbmm7IHRlcm0iCisKKyM6IG9wdGlvbi5jOjQzMTkKK21zZ2lkICJVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiUG91vml0ZSBcImd1aVwiIHByZSBzcHVzdGVuaWUgR1VJIgorCisjOiBvcHRpb24uYzo0MzQwCittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAidm+1YnkgJ2JhY2t1cGV4dCcgYSAncGF0Y2htb2RlJyBtYWr6IHJvdm5ha/ogaG9kbm90dSIKKworIzogb3B0aW9uLmM6NDYzOAorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiUmW7YXplYyBzIG51bG92b3UgZOW+a291IgorCisjOiBvcHRpb24uYzo0NzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIlBvIDwlcz4gY2j9YmEg6O1zbG8iCisKKyM6IG9wdGlvbi5jOjQ3MjAKK21zZ2lkICJNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJDaP1iYSDoaWFya2EiCisKKyM6IG9wdGlvbi5jOjQ3MjcKK21zZ2lkICJNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICJKZSBudXRu6SB6YWRhuyBob2Rub3R1ICciCisKKyM6IG9wdGlvbi5jOjQ3NjcKK21zZ2lkICJjb250YWlucyB1bnByaW50YWJsZSBjaGFyYWN0ZXIiCittc2dzdHIgIm9ic2FodWplIG5ldGxh6Gl0ZbVu6SB6bmFreSIKKworIzogb3B0aW9uLmM6NDgwMAorbXNnaWQgIkludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiQ2h5Ym7pIHDtc21hIgorCisjOiBvcHRpb24uYzo0ODA3Cittc2dpZCAiY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIm5lZOEgc2EgdnlicmG7IHNhZGEgcO1zaWVtIgorCisjOiBvcHRpb24uYzo0ODA5Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJDaHlibuEgc2FkYSBw7XNpZW0iCisKKyM6IG9wdGlvbi5jOjQ4MTYKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICJuZWThIHNhIHZ5YnJhuyC5aXJva/0gZm9udCIKKworIzogb3B0aW9uLmM6NDgxOAorbXNnaWQgIkludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICJDaHlibukguWlyb2vpIHDtc21vIgorCisjOiBvcHRpb24uYzo1MDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIk5lcHLtc3R1cG79IHpuYWsgcG8gPCVjPiIKKworIzogb3B0aW9uLmM6NTE3MQorbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJqZSBudXRu4SDoaWFya2EiCisKKyM6IG9wdGlvbi5jOjUxNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiJ2tvbWVudOFyJyBtdXPtIGJ5uyBwcuF6ZG55IGFsZWJvIG11c+0gb2JzYWhvdmG7ICVzIgorCisjOiBvcHRpb24uYzo1MjI2Cittc2dpZCAiTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiQmV6IHBvZHBvcnkgbXm5aSIKKworIzogb3B0aW9uLmM6NTQ3MgorbXNnaWQgIlVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIk5ldXphdHZvcmVu6SB6b3NrdXBlbmllIHb9cmF6b3YiCisKKyM6IG9wdGlvbi5jOjU0NzYKK21zZ2lkICJ0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAicHLtbGm5IG1ub2hvIHBvbG++aWVrIgorCisjOiBvcHRpb24uYzo1NDc4Cittc2dpZCAidW5iYWxhbmNlZCBncm91cHMiCittc2dzdHIgIm5ldnl24b5lbukgc2t1cGlueSIKKworIzogb3B0aW9uLmM6NTY5MworbXNnaWQgIkEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIk9rbm8gbuFotWFkdSB1viBleGlzdHVqZSIKKworIzogb3B0aW9uLmM6NTk1NCBvcHRpb24uYzo1OTgzCittc2dpZCAiJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiaG9kbm90YSB2b7VieSAnd2luaGVpZ2h0JyBuZXNtaWUgYnm7IG1lbrlpYSBuZb4gaG9kbm90YSB2b7VieSAnd2lubWluaGVpZ2h0JyIKKworIzogb3B0aW9uLmM6NTk5OSBvcHRpb24uYzo2MDE4Cittc2dpZCAiJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgImhvZG5vdGEgdm+1YnkgJ3dpbndpZHRoJyBuZXNtaWUgYnm7IG1lbrlpYSBuZb4gaG9kbm90YSB2b2y1eSAnd2lubWlud2lkdGgnIgorCisjOiBvcHRpb24uYzo2MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIk1pbmlt4WxuZSBwb3RyZWJu/SBwb+hldCByaWFka292OiAlZCIKKworIzogb3B0aW9uLmM6NjE2OAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIk1pbmlt4WxuZSBwb3RyZWJu/SBwb+hldCBzdOVwY292OiAlZCIKKworIzogb3B0aW9uLmM6NjQ2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IE5lem7hbWEgdm+1YmE6ICVzIgorCisjOiBvcHRpb24uYzo2NTc0Cittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gS/NkeSB0ZXJtaW7hbHUgLS0tIgorCisjOiBvcHRpb24uYzo2NTc2Cittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTmFzdGF2ZW5pZSBnbG9i4WxueWNoIHZvbGllYiAtLS0iCisKKyM6IG9wdGlvbi5jOjY1NzgKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIE5hc3RhdmVuaWUgZ2xvYuFsbnljaCB2b2xpZWIgLS0tIgorCisjOiBvcHRpb24uYzo2NTgwCittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBNb75ub3N0aSAtLS0iCisKKyM6IG9wdGlvbi5jOjcyNjkKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgQ0hZQkEiCisKKyM6IG9wdGlvbi5jOjgyMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogcHJlICVzIGNo/WJhIHZ5aG92dWr6Y2kgem5hayIKKworIzogb3B0aW9uLmM6ODI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiBuYWRieXRv6G7pIHpuYWt5IHBvIGJvZGtv6GlhcmtlOiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIm5lZOEgc2Egb3R2b3JpuyAiCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiBOZWThIHNhIG90dm9yabsgb2tubyFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICJKZSBwb3RyZWJu4SBBbWlnYWRvcyB2ZXJ6aWEgMi4wNCBhbGVibyBub3a5aWFcbiIKKworIzogb3NfYW1pZ2EuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICJQb3RyZWJu/SAlcyAgdmVyemlhICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQwNworbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAiTmVk4SBzYSBvdHZvcmm7IE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MTgKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAiTmVk4SBzYSB2eXR2b3JpuyAiCisKKyM6IG9zX2FtaWdhLmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltIHVrb27oZW79IHMgJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJuZW30vmVtIHptZW5puyBrb256b2xvdv0gbfNkID8hXG4iCisKKyM6IG9zX2FtaWdhLmM6OTM4IG9zX21hYy5jOjExNzcgb3NfbXN3aW4uYzo2Mjkgb3NfcmlzY29zLmM6NzU3IG9zX3VuaXguYzoyODAzCittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBOYXN0YXZvdmFuaWUgcmW+aW11IG9icmF6b3ZreSBuaWUgamUgcG9kcG9yb3ZhbukiCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogbmllIGplIGtvbnpvbG91Pz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiBOZWThIHNhIHNwdXN0absgc2hlbGwgcyAtZiB2b7Vib3UiCisKKyM6IG9zX2FtaWdhLmM6MTE4MyBvc19hbWlnYS5jOjEyNzMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIk5lZOEgc2Egc3B1c3RpuyAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NiBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgInNoZWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjA2IG9zX2FtaWdhLmM6MTMwOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIgdnLhdGVu6VxuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIHBy7WxpuSBtYWzhLiIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gQ0hZQkEiCisKKyM6IG9zX21zd2luLmM6NTAzCittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLihza3LhdGVu6SkiCisKKyM6IG9zX21zd2luLmM6NjA0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidzdOVwY2UnIG5pZSBqZSA4MCwgbmVt9L5lbSBzcHVzdGm7IGV4dGVybv0gcHLta2F6IgorCisjOiBvc19tc3dpbi5jOjcxNiBvc191bml4LmM6NTExNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogVnl2b2xhbmllIGtuab5uaehuZWogZnVua2NpYSB6bHloYWxvIHByZSBcIiVzKClcIiIKKworIzogb3NfbXN3aW4uYzoxMzY1Cittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiBabHloYWwgdv1iZXIgdGxh6Glhcm5lIgorCisjOiBvc19tc3dpbi5jOjE0MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgIiVzIG5hICVzIgorCisjOiBvc19tc3dpbi5jOjE0MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTQ0ODogTmV6buFtZSBw7XNtbzogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ3MCBvc19tc3dpbi5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBDaHliYSB0bGHoZTogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ4MQorbXNnaWQgIlVua25vd24iCittc2dzdHIgIk5lem7hbXkiCisKKyM6IG9zX21zd2luLmM6MTUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJUbGHo7W0gJyVzJyIKKworIzogb3NfbXN3aW4uYzoyNTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiBDaHlibv0gbuF6b3Ygem5ha292ZWogc2FkeSBcIiVzXCIgdiBu4Xp2ZSBw7XNtYSBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjYwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiBDaHlibv0gem5hayAnJWMnIHYgbuF6dmUgcO1zbWEgXCIlc1wiIgorCisjOiBvc19yaXNjb3MuYzoxMjU2Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogQ2h5Ym7hICdvc2ZpbGV0eXBlJyB2b7ViYSAtIHBvdb5pdGllIFRleHR1IgorCisjOiBvc191bml4LmM6ODYyCittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZJbTogZHZvaml0/SBzaWdu4WwsIGtvbujtbVxuIgorCisjOiBvc191bml4LmM6ODY4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWwgJXNcbiIKK21zZ3N0ciAiVmltOiBaYWNoeXRlbv0gc21ydGlhY2kgc2lnbuFsICVzXG4iCisKKyM6IG9zX3VuaXguYzo4NzEKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogWmFjaHl0ZW79IHNtcnRpYWNpIHNpZ27hbFxuIgorCisjOiBvc191bml4LmM6MTEyNQorIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAiT3R24XJhbSBYIGRpc3BsZWogLSB6YWJlcmllICVsZCBtc2VjIgorCisjOiBvc191bml4LmM6MTE1MgorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IGNoeWJhIFhcbiIKKworIzogb3NfdW5peC5jOjEyMTkKK21zZ2lkICJUZXN0aW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICJUZXN0b3ZhbmllIFggZGlzcGxlamEgemx5aGFsbyIKKworIzogb3NfdW5peC5jOjEzNjMKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICJVcGx5bnVsIOhhcyBvdHZvcmVuaWEgWCBkaXNwbGVqYSIKKworIzogb3NfdW5peC5jOjI5NzYgb3NfdW5peC5jOjM2MzQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiTmVk4SBzYSBzcHVzdGm7IHNoZWxsICIKKworIzogb3NfdW5peC5jOjMwMjEKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIk5lZOEgc2Egc3B1c3RpuyBzaCBzaGVsbFxuIgorCisjOiBvc191bml4LmM6MzAyNSBvc191bml4LmM6MzY0MAorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyIgbuF2cmF0b3bhIGhvZG5vdGEgc2hlbGx1ICIKKworIzogb3NfdW5peC5jOjMxNTkKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiTmVkavogc2Egdnl0dm9yabsgcvpyeVxuIgorCisjOiBvc191bml4LmM6MzE3NAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisiVnl2b2xhbmllIGZvcmsgemx5aGFsb1xuIgorCisjOiBvc191bml4LmM6MzY0NworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIlBy7WtheiB1a29u6GVu/VxuIgorCisjOiBvc191bml4LmM6NTE2NAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIk90dm9yZW5pZSBYIGRpc3BsZWphIHpseWhhbG8iCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIk5hIHJpYWRrdSIKKworIzogb3Nfd2luMTYuYzo1Nzggb3Nfd2luMzIuYzozMDM3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJu4XZyYXRvduEgaG9kbm90YSBzaGVsbHUgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjUwNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IFphY2h5dGVu4SB1ZGFsb3O7ICVzXG4iCisKKyM6IG9zX3dpbjMyLmM6MjUwNworbXNnaWQgImNsb3NlIgorbXNnc3RyICJ6YXZyaWW7IgorCisjOiBvc193aW4zMi5jOjI1MDkKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIm9kaGzhc2m7IgorCisjOiBvc193aW4zMi5jOjI1MTAKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAidnlwbvq7IgorCisjOiBvc193aW4zMi5jOjI5OTEKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTogUHLta2F6IG5lbuFqZGVu/SIKKworIzogb3Nfd2luMzIuYzozMDA0Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisiVklNUlVOLkVYRSBuZW7hamRlbv0gdiAkUEFUSC5cbiIKKyJQbyBkb2tvbuhlbu0gZXh0ZXJu/WNoIHBy7Wthem92IG5lYnVkZSB2/XN0dXAgcG96YXN0YXZlbv0uXG4iCisiUG96cml0ZSAgOmhlbHAgd2luMzItdmltcnVuICBwcmUgdmlhYyBpbmZvcm3hY2ntLiIKKworIzogb3Nfd2luMzIuYzozMDA3Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSBWYXJvdmFuaWUiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIk5lbfS+ZW0gbmFocmG7IHZpbTMyLmRsbCEiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIlZJTSBDaHliYSIKKworIzogb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiQ291bGQgbm90IGZpeCB1cCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgRExMISIKK21zZ3N0ciAiTmVt9L5lbSBvcHJhdmm7IG9ka2F6eSBmdW5rY2llIG5hIERMTCEiCisKKyM6IHF1aWNrZml4LmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjogUHLtbGm5IG1ub2hvICUlJWMgdm8gZm9ybeF0b3ZhY29tIHJlu2F6Y2kiCisKKyM6IHF1aWNrZml4LmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiBOZW/oYWvhdmFu/SB2/XNreXQgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmW7YXpjaSIKKworIzogcXVpY2tmaXguYzozNDgKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogVm8gZm9ybeF0b3ZhY29tIHJlu2F6Y2kgY2j9YmEgXSIKKworIzogcXVpY2tmaXguYzozNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiBOZXBvZHBvcm92YW7hIGZvcm3hdG924SC5cGVjaWZpa+FjaWEgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmW7YXpjaSIKKworIzogcXVpY2tmaXguYzozODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiBOZXBy7XN0dXBu6SAlJSVjIHYgcHJlZml4ZSBmb3Jt4XRvdmFjaWVobyByZbthemNhIgorCisjOiBxdWlja2ZpeC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogTmVwcu1zdHVwbukgJSUlYyB2byBmb3Jt4XRvdmFjb20gcmW7YXpjaSIKKworIzogcXVpY2tmaXguYzo0MTQKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgbmVvYnNhaHVqZSC+aWFkbnkgdnpvciIKKworIzogcXVpY2tmaXguYzo1MjAKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBDaP1iYWr6Y2kgYWxlYm8gcHLhemRueSBu4XpvdiBhZHJlc+FyYSIKKworIzogcXVpY2tmaXguYzo5MzEKK21zZ2lkICJObyBtb3JlIGl0ZW1zIgorbXNnc3RyICKuaWFkbmUg72FsuWllIHBvbG++a3kiCisKKyM6IHF1aWNrZml4LmM6MTE1MgorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQvJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjExNTQKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAocmlhZG9rIHZ5bWF6YW79KSIKKworIzogcXVpY2tmaXguYzoxMzYwCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBLb25pZWMgcXVpY2tmaXggem96bmFtdSIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBaYehpYXRvayBxdWlja2ZpeCB6b3puYW11IgorCisjOiBxdWlja2ZpeC5jOjEzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJ6b3puYW0gY2j9YiAlZCB6ICVkOyBwb+hldCBjaP1iOiAlZCIKKworIzogcXVpY2tmaXguYzoxODQyCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogTmVk4SBzYSB1bG++abssIGplIG5hc3RhdmVu4SB2b7ViYSAnYnVmdHlwZSciCisKKyM6IHJlZ2V4cC5jOjgwMgorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IFZ6b3IgamUgcHLtbGm5IGRsaP0iCisKKyM6IHJlZ2V4cC5jOjEzMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IFZobmllemRlbv0gJXMqIgorCisjOiByZWdleHAuYzoxMzIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogVmhuaWV6ZGVu6SAlcyVjIgorCisjOiByZWdleHAuYzoxNDczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyBuaeggbmVuYXNsZWR1amUiCisKKyM6IHJlZ2V4cC5jOjI0OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkNoeWJhIHN5bnRheGUgdiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzM3Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IFphY2h5dGVu6SBwcmV0ZehlbmllIHrhc29ibu1rdTogcHLtbGm5IHpsb75pdP0gcmVndWzhcm55IHb9cmF6PyIKKworIzogcmVnZXhwLmM6Mjg3MgorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogdnpvciBzcPRzb2JpbCBwcmV0ZehlbmllIHrhc29ibu1rdSIKKworIzogcmVnZXhwLmM6MzEwOAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIlZu+nRvcm7pIHBvZHJhZGVu6SB6aG9keTpcbiIKKworIzogc2NyZWVuLmM6MjA2MworIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgcmlhZGtvdiB6YWhudXT9Y2ggIgorCisjOiBzY3JlZW4uYzo3NTE3Cittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgTkFIUkFESasgVkVSVElLwUxORSIKKworIzogc2NyZWVuLmM6NzUyMQorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgTkFIUkFESasiCisKKyM6IHNjcmVlbi5jOjc1MjYKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiIE9CUsFUSasiCisKKyM6IHNjcmVlbi5jOjc1MjgKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgVkxPrkmrIgorCisjOiBzY3JlZW4uYzo3NTMxCittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKHZsb75puykiCisKKyM6IHNjcmVlbi5jOjc1MzMKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKG5haHJhZGm7KSIKKworIzogc2NyZWVuLmM6NzUzNQorbXNnaWQgIiAodnJlcGxhY2UpIgorbXNnc3RyICIgKG5haHJhZGm7IHZlcnRpa+FsbmUpIgorCisjOiBzY3JlZW4uYzo3NTM4Cittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIGhlYnJlanNr/SIKKworIzogc2NyZWVuLmM6NzU0NgorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAoamF6eWspIgorCisjOiBzY3JlZW4uYzo3NTQ5Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAodmxvvmm7KSIKKworIzogc2NyZWVuLmM6NzU1NQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiBaSE9EWSIKKworIzogc2NyZWVuLmM6NzU1NworbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiBWSVpVwUxORSIKKworIzogc2NyZWVuLmM6NzU1OQorbXNnaWQgIiBCTE9DSyIKK21zZ3N0ciAiIEJMT0siCisKKyM6IHNjcmVlbi5jOjc1NjEKK21zZ2lkICIgTElORSIKK21zZ3N0ciAiIFJJQURPSyIKKworIzogc2NyZWVuLmM6NzU3NCBzY3JlZW4uYzo3NjM0Cittc2dpZCAicmVjb3JkaW5nIgorbXNnc3RyICJuYWhy4XZhbSIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgImi1YWRhbmllIGRvc2lhaGxvIHph6GlhdG9rLCBwb2tyYehvdmFuaWUgb2Qga29uY2EiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICJotWFkYW5pZSBkb3NpYWhsbyBrb25pZWMsIHBva3Jh6G92YW5pZSBvZCB6YehpYXRrdSIKKworIzogc2VhcmNoLmM6NDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IE5lcHLtc3R1cG79IGi1YWRhbv0gcmW7YXplYzogJXMiCisKKyM6IHNlYXJjaC5jOjc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IGi1YWRhbmllIGRvc2lhaGxvIHph6GlhdG9rIGJleiBu4WpkZW5pYSAlcyIKKworIzogc2VhcmNoLmM6Nzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTogaLVhZGFuaWUgZG9zaWFobG8ga29uaWVjIGJleiBu4WpkZW5pYSAlcyIKKworIzogc2VhcmNoLmM6MTE0NAorbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogUG8gJzsnIG/oYWvhdmFtICc/JyBhbGVibyAnLyciCisKKyM6IHNlYXJjaC5jOjM1MjMKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICh2cuF0YW5lIHW+IHZ5cO1zYW79Y2ggemj0ZCkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6MzU0MworbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSBWbG++ZW7pIHP6Ym9yeSIKKworIzogc2VhcmNoLmM6MzU0NQorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgIm5lbuFqZGVu6SAiCisKKyM6IHNlYXJjaC5jOjM1NDYKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICJ2IGNlc3RlIC0tLVxuIgorCisjOiBzZWFyY2guYzozNTg1Cittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgIChVviB2eXDtc2Fu6SkiCisKKyM6IHNlYXJjaC5jOjM1ODcKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiIE5FTsFKREVOySIKKworIzogc2VhcmNoLmM6MzYzOQorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAiUHJlaLVhZOF2YW0gdmxvvmVu6SBz+mJvcnk6ICVzIgorCisjOiBzZWFyY2guYzozODU3Cittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBaaG9kYSBqZSBuYSBha3R14Wxub20gcmlhZGt1IgorCisjOiBzZWFyY2guYzozOTk3Cittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIla5ZXRreSB2bG++ZW7pIHP6Ym9yeSBib2xpIG7hamRlbukiCisKKyM6IHNlYXJjaC5jOjM5OTkKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAirmlhZG5lIHZsb75lbukgc/pib3J5IgorCisjOiBzZWFyY2guYzo0MDE1Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBOZWThIHNhIG7hanO7IGRlZmlu7WNpYSIKKworIzogc2VhcmNoLmM6NDAxNworbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogTmVk4SBzYSBu4WpzuyB2em9yIgorCisjOiBzeW50YXguYzoyOTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjMxNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IFN5bnRha3RpY2vhIHpvc3RhdmEgJXMgbmVleGlzdHVqZSIKKworIzogc3ludGF4LmM6MzM0MworbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiUHJlIHRlbnRvIGJ1ZmZlciBuaWUgc/ogZGVmaW5vdmFu6SC+aWFkbmUgcG9sb75reSBzeW50YXhlIgorCisjOiBzeW50YXguYzozMzUxCittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJzeW5jaHJvbml6dWplbSBrb21lbnThcmUgdiBDILl0/WxlIgorCisjOiBzeW50YXguYzozMzU5Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAivmlhZG5lIHN5bmNocm9uaXrhY2llIgorCisjOiBzeW50YXguYzozMzYyCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJzeW5jaHJvbml64WNpYSB6YejtbmEgIgorCisjOiBzeW50YXguYzozMzY0IHN5bnRheC5jOjM0MzkKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgcmlhZGtvdiBwcmVkIHph6GlhdGtvbSIKKworIzogc3ludGF4LmM6MzM2OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFBvbG++a3kgc3luY2hyb25peuFjaWUgc3ludGF4ZSAtLS0iCisKKyM6IHN5bnRheC5jOjMzNzQKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorInN5bmNocm9uaXp1amVtIHBvbG++a3kiCisKKyM6IHN5bnRheC5jOjMzODAKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUG9sb75reSBzeW50YXhlIC0tLSIKKworIzogc3ludGF4LmM6MzQwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkyOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MjogU3ludGFrdGlja+Egem9zdGF2YSAlcyBuZWV4aXN0dWplIgorCisjOiBzeW50YXguYzozNDI5Cittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmlt4WxuZSAiCisKKyM6IHN5bnRheC5jOjM0MzYKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAibWF4aW3hbG5lICIKKworIzogc3ludGF4LmM6MzQ0OAorbXNnaWQgIjsgbWF0Y2ggIgorbXNnc3RyICI7IHpob2RhICIKKworIzogc3ludGF4LmM6MzQ1MAorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAiIHJpYWRrb3YiCisKKyM6IHN5bnRheC5jOjQwNzgKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IGdyb3VwW3RdaGVyZSBuZXNtaWUgYnm7IG5hIHRvbXRvIG1pZXN0ZSIKKworIzogc3ludGF4LmM6NDEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IFByZSAlcyBjaP1iYSBwb2xvvmthIHJlZ2nzbnUiCisKKyM6IHN5bnRheC5jOjQxMzAKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogb2JzYWh1amUgYXJndW1lbnR5LCBrdG9y6SB0dSBuaWUgc/ogcG92b2xlbukiCisKKyM6IHN5bnRheC5jOjQxNDEKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5Njogb2JzYWh1amUgYXJndW1lbnR5LCBrdG9y6SB0dSBuaWUgc/ogcG92b2xlbukiCisKKyM6IHN5bnRheC5jOjQyMTkKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5NzogVnm+YWRvdmFu/SBu4XpvdiBz+mJvcnUiCisKKyM6IHN5bnRheC5jOjQ1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiBDaP1iYSAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBQcu1sabkgbeFsbyBhcmd1bWVudG92OiBvYmxhc7sgc3ludGF4ZSAlcyIKKworIzogc3ludGF4LmM6NTA0NgorbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiBOZWJvbGEgemFkYW7hIL5pYWRuYSB6b3N0YXZhIgorCisjOiBzeW50YXguYzo1MDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IE9kZGW1b3Zh6CB2em9ydSAlcyBuZW7hamRlbv0iCisKKyM6IHN5bnRheC5jOjUxNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogQ2h5YmEgemEgdnpvcm9tICVzIgorCisjOiBzeW50YXguYzo1MjQ1Cittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTQwMzogc3luY2hyb25peuFjaWEgc3ludGF4ZTogdnpvciBwb2tyYehvdmFuaWEgcmlhZGtvdiB6YWRhbv0gZHZha3LhdCIKKworIzogc3ludGF4LmM6NTMwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IENoeWJu6SBhcmd1bWVudHk6ICVzIgorCisjOiBzeW50YXguYzo1MzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IENo/WJhIHpuYW1pZW5rbyByb3Zu4XNhOiAlcyIKKworIzogc3ludGF4LmM6NTM1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IFBy4XpkbnkgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIHR1IG5pZSBqZSBwb3ZvbGVu6SIKKworIzogc3ludGF4LmM6NTM5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG11c+0gYnm7IHBydv0gdiAnY29udGFpbnMnIHpvem5hbWUiCisKKyM6IHN5bnRheC5jOjU0NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogTmV6buFteSBu4XpvdiBza3VwaW55OiAlcyIKKworIzogc3ludGF4LmM6NTY5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IENoeWJu/SBwb2RyYWRlbv0gcHLta2F6IDpzeW50YXggOiAlcyAiCisKKyM6IHN5bnRheC5jOjYwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IHNrdXBpbmEgenbtcmF6bmVuaWEgJXMgbmVib2xhIG7hamRlbuEiCisKKyM6IHN5bnRheC5jOjYwOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IFBy7WxpuSBt4WxvIGFyZ3VtZW50b3Y6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiBQcu1sabkgbW5vaG8gYXJndW1lbnRvdjogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjEyMgorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDogc2t1cGluYSBqZSBuYXN0YXZlbuEsIG9ka2F6IG5hIHp2/XJhevJvdmFjaXUgc2t1cGludSBpZ25vcm92YW79IgorCisjOiBzeW50YXguYzo2MjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IG5lb+hha+F2YW7pIHpuYW1pZW5rbyByb3Zu4XNhIDogJXMiCisKKyM6IHN5bnRheC5jOjYyODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogY2j9YmEgem5hbWllbmtvIHJvdm7hc2E6ICVzIgorCisjOiBzeW50YXguYzo2MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiBjaP1iYSBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjYzNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IE5lcHLtcHVzdG7hIGhvZG5vdGE6ICVzIgorCisjOiBzeW50YXguYzo2NDY1Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogZmFyYmEgcG9wcmVkaWEgbmllIGplIHpu4W1hIgorCisjOiBzeW50YXguYzo2NDc2Cittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDogZmFyYmEgcG96YWRpYSBuaWUgamUgem7hbWEiCisKKyM6IHN5bnRheC5jOjY1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiBO4XpvdiBhbGVibyDo7XNsbyBmYXJieSAlcyBuZWJvbG8gcm96cG96bmFu6SIKKworIzogc3ludGF4LmM6Njc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjogdGVybWlu4Wxvdv0ga/NkICVzIGplIHBy7WxpuSBkbGj9IgorCisjOiBzeW50YXguYzo2NzkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiBOZXBy7XN0dXBu/SBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjczMjEKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBKZSBwb3W+7XZhbukgcHLtbGm5IHZlbGvpIG1ub75zdHZvIG9kbGm5bv1jaCB6dv1yYXryb3ZhY+1jaCB2bGFzdG5vc3TtIgorCisjOiB0YWcuYzo5MAorbXNnaWQgImF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgImtvbmllYyB6b3puYW11IHRhZ292IgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgInph6GlhdG9rIHpvem5hbXUgdGFnb3YiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiBOZWThIHNhIHNrb+hpuyBwcmVkIHBydv0gdnlob3Z1avpjaSB0YWciCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjogdGFnICVzIG5lbuFqZGVu/SIKKworIzogdGFnLmM6NTQ1Cittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSB0YWciCisKKyM6IHRhZy5jOjU0OAorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAic/pib3JcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiWmFkYWp0ZSDo7XNsbyAoPENSPiBwcmUgdWtvbuhlbmllKTogIgorCisjOiB0YWcuYzo3NDYKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IFZ5aG92dWplIGliYSBqZWRlbiB0YWciCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IFphIHBvc2xlZG79IHZ5aG92dWr6Y2kgdGFnIHNhIG5lZOEgcHJlc2tv6Gm7IgorCisjOiB0YWcuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIlP6Ym9yIFwiJXNcIiBuZWV4aXN0dWplIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgInRhZyAlZCB6IGNlbGtvdulobyBwb+h0dSAlZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIGFsZWJvIHZpYWMiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIFBvdb7tdmFtIHRhZyBzIHDtc21vbSBpbmVqIHZltWtvc3RpISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiBT+mJvciBcIiVzXCIgbmVleGlzdHVqZSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIENJRaUgdGFnICAgICAgICCpVEFSVCByaWFkb2sgIHYgc/pib3JlL3RleHRlIgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIkxpbmXhcm5lIGi1YWRhbmllIHRhZ3UiCisKKyM6IHRhZy5jOjExNDYKK21zZ2lkICJCaW5hcnkgdGFnIHNlYXJjaCIKK21zZ3N0ciAiQmlu4XJuZSBotWFkYW5pZSB0YWd1IgorCisjOiB0YWcuYzoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIlByZWi1YWThdmFtIHP6Ym9yIHRhZ292ICVzIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBT+mJvciB0YWdvdiAlcyBib2wgb3JlemFu/VxuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBDaHliYSBmb3Jt4XR1IHYgc/pib3JlIHRhZ292IFwiJXNcIiIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIlByZWQgYmFqdG9tICVsZCIKKworIzogdGFnLmM6MTg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IE9ic2FoIHP6Ym9ydSB0YWdvdiAlcyBuaWUgamUgem9yYWRlbv0iCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiCuaWFkbnkgc/pib3IgdGFnb3YiCisKKyM6IHRhZy5jOjI1ODMKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBOZWThIHNhIG7hanO7IHZ6b3IgdGFnb3YiCisKKyM6IHRhZy5jOjI1OTQKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IFRhZyBzYSBuZWThIG7hanO7LCBpYmEgaOFkYW0hIgorCisjOiB0ZXJtLmM6MTczNworbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyBuaWUgamUgem7hbXkuIERvc3R1cG7pIHZzdGF2YW7pIHRlcm1pbuFseToiCisKKyM6IHRlcm0uYzoxNzYxCittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICJuYXN0YXZ1amVtIG5hICciCisKKyM6IHRlcm0uYzoyMTE0Cittc2dpZCAiQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJOZWThIHNhIG90dm9yabsgdGVybWNhcCBz+mJvciIKKworIzogdGVybS5jOjIxMTcKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgIlRlcm1pbmZvIG5lb2JzYWh1amUgcG9sb75rdSBwcmUgdGVudG8gdGVybWlu4WwiCisKKyM6IHRlcm0uYzoyMTE5Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIlRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvvmt1IHByZSB0ZW50byB0ZXJtaW7hbCIKKworIzogdGVybS5jOjIyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IFRlcm1jYXAgbmVvYnNhaHVqZSBwb2xvvmt1IHByZSBcIiVzXCIiCisKKyM6IHRlcm0uYzoyNzUyCittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IFRlcm1pbuFsIG11c+0gbWG7IFwiY21cIiBzY2hvcG5vc7siCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ4OTEKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEts4XZlc3kgdGVybWlu4Wx1IC0tLSIKKworIzogdWkuYzoyNTEKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICJzcHVzdGVu/SBub3b9IHNoZWxsXG4iCisKKyM6IHVpLmM6MTc0NworbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IENoeWJhIHByaSDo7XRhbu0gdnN0dXB1LCBrb27o7W0uLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozODMKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIk9kc3Ry4W5lbmllIHptaWVuIG5pZSBqZSBtb75u6TsgY2hjZXRlIG5hcHJpZWsgdG9tdSBwb2tyYehvdmG7IgorCisjOiB1bmRvLmM6NTM4Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzog6O1zbGEgcmlhZGtvdiBz+iBjaHlibukiCisKKyM6IHVuZG8uYzo3MDcKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAicG/oZXQgem1pZW46IDEiCisKKyM6IHVuZG8uYzo3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgInBv6GV0IHptaWVuOiAlbGQiCisKKyM6IHVuZG8uYzo3NTMKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogeuF6bmFtIG8gem1lbuFjaCBwb7lrb2Rlbv0iCisKKyM6IHVuZG8uYzo3ODUKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDogY2j9YmEgcmlhZG9rIHNw5LsiCisKKyMuIE9ubHkgTVMgVkMgNC4xIGFuZCBlYXJsaWVyIGNhbiBkbyBXaW4zMnMKKyM6IHZlcnNpb24uYzo3MjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNi8zMiBiaXRvduEgR1VJIHZlcnppYSBwcmUgTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjcyNworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SBHVUkgdmVyemlhIHByZSBNUyBXaW5kb3dzIgorCisjOiB2ZXJzaW9uLmM6NzMwCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIgdiBXaW4zMiByZb5pbWUiCisKKyM6IHZlcnNpb24uYzo3MzIKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAiIHMgT0xFIHBvZHBvcm91IgorCisjOiB2ZXJzaW9uLmM6NzM1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIGJpdG924SB2ZXJ6aWEgcHJlIE1TIFdpbmRvd3Mga29uem9sdSIKKworIzogdmVyc2lvbi5jOjczOQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIHZlcnppYSBwcmUgTVMgV2luZG93cyIKKworIzogdmVyc2lvbi5jOjc0MworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiBiaXRvduEgdmVyemlhIHByZSBNUy1ET1MiCisKKyM6IHZlcnNpb24uYzo3NDUKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgYml0b3bhIE1TLURPUyB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo3NTEKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnppYSIKKworIzogdmVyc2lvbi5jOjc1MworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnppYSIKKworIzogdmVyc2lvbi5jOjc1NgorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgdmVyemlhIgorCisjOiB2ZXJzaW9uLmM6NzYxCittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlJJU0MgT1MgdmVyemlhIgorCisjOiB2ZXJzaW9uLmM6NzcxCittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIlBvdb5pdOkgeuFwbGF0eTogIgorCisjOiB2ZXJzaW9uLmM6Nzk3IHZlcnNpb24uYzoxMTMyCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJabWVuaWwgIgorCisjOiB2ZXJzaW9uLmM6ODA0Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIlByZWxvvmVu4SAiCisKKyM6IHZlcnNpb24uYzo4MDcKK21zZ2lkICJieSAiCittc2dzdHIgIiAiCisKKyM6IHZlcnNpb24uYzo4MTkKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1heGlt4WxuYSB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo4MjIKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiVmW1a+EgdmVyemlhICIKKworIzogdmVyc2lvbi5jOjgyNQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJOb3Jt4WxuYSB2ZXJ6aWEiCisKKyM6IHZlcnNpb24uYzo4MjgKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJNYWzhIHZlcnppYSAiCisKKyM6IHZlcnNpb24uYzo4MzAKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIk1pbmlt4WxuYSB2ZXJ6aWEgIgorCisjOiB2ZXJzaW9uLmM6ODM2Cittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICJiZXogZ3JhZmlja+lobyByb3pocmFuaWEuIgorCisjOiB2ZXJzaW9uLmM6ODQwCittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gR1RLLUdOT01FLiIKKworIzogdmVyc2lvbi5jOjg0MgorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEdUSy4iCisKKyM6IHZlcnNpb24uYzo4NDYKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICJzIHJvemhyYW7tbSBYMTEtTW90aWYuIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIFgxMS1BdGhlbmEuIgorCisjOiB2ZXJzaW9uLmM6ODUyCittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgInMgcm96aHJhbu1tIEJlT1MuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAicyByb3pocmFu7W0gUGhvdG9uLiIKKworIzogdmVyc2lvbi5jOjg1OAorbXNnaWQgIndpdGggR1VJLiIKK21zZ3N0ciAicyBncmFmaWNr/W0gcm96aHJhbu1tLiIKKworIzogdmVyc2lvbi5jOjg2MQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgInMgQ2FyYm9uIGdyYWZpY2v9bSByb3pocmFu7W0uIgorCisjOiB2ZXJzaW9uLmM6ODY0Cittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJzIENvY29hIGdyYWZpY2v9bSByb3pocmFu7W0uIgorCisjOiB2ZXJzaW9uLmM6ODY3Cittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAicyAoa2xhc2lja/1tKSBncmFmaWNr/W0gcm96aHJhbu1tLiIKKworIzogdmVyc2lvbi5jOjg3OAorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiAgVmxhc3Rub3N0aSB6YWhybnV06SAoKykgYSBuZXphaHJudXTpICgtKTpcbiIKKworIzogdmVyc2lvbi5jOjg5MAorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgc3lzdOltb3b9IHZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjg5NQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICB1vu12YXRltXNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MDAKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiBkcnVo/SB1vu12YXRltXNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MDUKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiB0cmV07SB1vu12YXRltXNr/SB2aW1yYyBz+mJvcjogXCIiCisKKyM6IHZlcnNpb24uYzo5MTAKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgIHW+7XZhdGW1c2v9IGV4cmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTE1Cittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgIGRydWj9IHW+7XZhdGW1c2v9IGV4cmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTIxCittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIHN5c3TpbW92/SBndmltcmMgc/pib3I6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTI1Cittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgdb7tdmF0ZbVza/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjkyOQorbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiZHJ1aP0gdb7tdmF0ZbVza/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjkzNAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAidHJldO0gdb7tdmF0ZbVza/0gZ3ZpbXJjIHP6Ym9yOiBcIiIKKworIzogdmVyc2lvbi5jOjk0MQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIHN5c3TpbW92/SBz+mJvciBzIHBvbnVrb3U6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgIGltcGxpY2l0buEgaG9kbm90YSAkVklNOlwiIgorCisjOiB2ZXJzaW9uLmM6OTU1Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgZi1iIHByZSAkVklNUlVOVElNRTogXCIiCisKKyM6IHZlcnNpb24uYzo5NTkKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJQcmVrbGFkOiAiCisKKyM6IHZlcnNpb24uYzo5NjUKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICJQcmVrbGFkYeg6ICIKKworIzogdmVyc2lvbi5jOjk3MAorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiTGlua3VqZW06ICIKKworIzogdmVyc2lvbi5jOjk3NQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgUE9EUE9SQSBMQURFTklBIgorCisjOiB2ZXJzaW9uLmM6MTAxMQorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByZXZlZCIKKworIzogdmVyc2lvbi5jOjEwMTMKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyemlhICIKKworIzogdmVyc2lvbi5jOjEwMTQKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIkF1dG9yOiBCcmFtIE1vb2xlbmFhciBhIO9hbLntIgorCisjOiB2ZXJzaW9uLmM6MTAxOAorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSBqZSB2b7VuZSC57XJpdGW1bv0gcHJvZ3JhbSIKKworIzogdmVyc2lvbi5jOjEwMjAKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAiUG9t9L50ZSBjaHVkb2Ju/W0gZGW7b20gdiBVZ2FuZGUhIgorCisjOiB2ZXJzaW9uLmM6MTAyMQorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgInBvZHJvYm5larlpZSBpbmZvcm3hY2llIHrtc2thdGUgcG9tb2NvdSA6aGVscCBpY2NmPEVudGVyPiIKKworIzogdmVyc2lvbi5jOjEwMjMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICJ6YWRhanRlIDpxPEVudGVyPiAgICAgICAgICAgICBwcmUgdWtvbuhlbmllIHByb2dyYW11IgorCisjOiB2ZXJzaW9uLmM6MTAyNAorbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgInphZGFqdGUgOmhlbHA8RW50ZXI+ICBhbGVibyA8RjE+IHByZSBwb21vY27ta2EiCisKKyM6IHZlcnNpb24uYzoxMDI1Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiemFkYWp0ZSA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gIHByZSBpbmZvcm3hY2llIG8gdmVyemlpIgorCisjOiB2ZXJzaW9uLmM6MTAyOAorbXNnaWQgIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIgorbXNnc3RyICJCZb7tbSB2IHJlvmltZSBrb21wYXRpYmlsaXR5IHMgVmkiCisKKyM6IHZlcnNpb24uYzoxMDI5Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAiemFkYWp0ZSA6c2V0IG5vY3A8RW50ZXI+ICAgICBwcmUgaW1wbGljaXRu6SBuYXN0YXZlbmllIFZpbSIKKworIzogdmVyc2lvbi5jOjEwMzAKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJwb2Ryb2JuZWq5aWUgaW5mb3Jt4WNpZSB67XNrYXRlIHBvbW9jb3UgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzoxMDQ1Cittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAiYmxpvrlpZSBpbmZvcm3hY2llIHYgbWVudSAgUG9tb2Nu7WstPlNhbW9zdGF0bukiCisKKyM6IHZlcnNpb24uYzoxMDQ3Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAiU3D6ubthbSBtb2RlbGVzcywgcO1zYW79IHRleHQgamUgdmxvvmVu/SIKKworIzogdmVyc2lvbi5jOjEwNDgKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBJbnNlcnQgTW9kZSAgIgorbXNnc3RyICJtZW51INpwcmF2eS0+R2xvYuFsbmUgbW++bm9zdGktPlByZXBu+rsgcmW+aW0gdmxvvmVuaWEgIgorCisjOiB2ZXJzaW9uLmM6MTA0OQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUgZHZhIHJlvmlteSAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMDUzCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAibWVudSDacHJhdnktPkdsb2LhbG5lIG1vvm5vc3R0LT5QcmVwbvq7IFZpIGtvbXBhdGliaWxu/SByZb7tbSIKKworIzogdmVyc2lvbi5jOjEwNTQKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgIHByZSBwcmVkdm9sZW7pIHZsYXN0bm9zdGkgVmltICAgIgorCisjOiB2ZXJzaW9uLmM6MTEwMAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIlZBUk9WQU5JRTogZGV0ZWtvdmFu6SBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6MTEwMworbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInphZGFqdGUgOmhlbHAgd2luZG93czk1PEVudGVyPiBwcmUgcG9kcm9ibmVquWllIGluZm9ybeFjaWUiCisKKyM6IHdpbmRvdy5jOjIwMQorbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiBOZW7hamRlbukgvmlhZG5lIG9rbm8gbuFotWFkdSIKKworIzogd2luZG93LmM6NTgwCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogT2tubyBzYSBuZWThIHJvemRlbGm7IHrhcm92ZfIgdG9wbGVmdCBhIGJvdHJpZ2h0IgorCisjOiB3aW5kb3cuYzoxMzM5Cittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiBOZWThIHNhIHJvdG92YbssIGFrIGplIGlu6SBva25vIHJvemRlbGVu6SIKKworIzogd2luZG93LmM6MTg0MQorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogUG9zbGVkbukgb2tubyBzYSBuZWThIHphdHZvcmm7IgorCisjOiB3aW5kb3cuYzoyNTA1Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIlW+IGV4aXN0dWplIGliYSBqZWRubyBva25vIgorCisjOiB3aW5kb3cuYzoyNTUyCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IElu6SBva25vIG9ic2FodWplIHptZW55IgorCisjOiB3aW5kb3cuYzo0Mzc5Cittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogUG9kIGt1cnpvcm9tIHNhIG5lbmFjaOFkemEgbuF6b3Ygc/pib3J1IgorCisjOiB3aW5kb3cuYzo0NDk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0NzogU/pib3IgXCIlc1wiIHNhIG5lZOEgdiBjZHBhdGggbuFqc7siCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg2Cittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICJVcHJhdmm7IHMgdmlhY27hc29ibv0mbSBWaW1vbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTIKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIlVwcmF2absgcyBqZWRu/W0gJlZpbW9tIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYwNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICJVcHJhdmm7IHMgJlZpbW9tIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIlVwcmF2absgcyBleGlzdHVq+mNpbSBWaW1vbSAtICYiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NzUyCittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIlVwcmF2absgdnlicmFu6SBz+mJvcnkgcyBWaW1vbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTEgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjkKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIkNoeWJhIHZ5dHbhcmFjaWVobyBwcm9jZXN1OiBTa29udHJvbHVqdGUsIOhpIGplIGd2aW0gdm8gdmG5ZWogY2VzdGUhIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNgorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NzAKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiY2h5YmEgZ3ZpbWV4dC5kbGwiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA1Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICJQcu1sabkgZGxo4SBjZXN0YSEiCisKKyM6IGdsb2JhbHMuaDo5MDAKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLUJ1ZmZlciBuZW9ic2FodWplIL5pYWRueSByaWFkb2stLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDQyCittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJQcu1rYXogcHJlcnW5ZW79IgorCisjOiBnbG9iYWxzLmg6MTA0MworbXNnaWQgIkFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJKZSB2eb5hZG92YW79IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTA0NAorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBwbyBcXCBieSBtYWxvIG5hc2xlZG92YbsgLy4gPyBhbGVibyAmIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIiIKKyJFMTE6IENoeWJu/SBwcu1rYXogdiBva25lIHBy7Wthem926WhvIHJpYWRrdTsgPEVudGVyPiBzcHVzdO10ZSwgQ1RSTC1DICIKKyJ2eXBuZXRlIgorCisjOiBnbG9iYWxzLmg6MTA0OAorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiIgorIkUxMjogUHLta2F6IG5pZSBqZSB6IGV4cmMvdmltcmMgdiBha3R14Wxub20gYWRyZXPhcmkgYWxlYm8gcHJpIGi1YWRhbu0gdGFndSAiCisicG92b2xlbv0uIgorCisjOiBnbG9iYWxzLmg6MTA0OQorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiBT+mJvciBleGlzdHVqZSAocG91vml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBnbG9iYWxzLmg6MTA1MAorbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJQcu1rYXogemx5aGFsIgorCisjOiBnbG9iYWxzLmg6MTA1MQorbXNnaWQgIkludGVybmFsIGVycm9yIgorbXNnc3RyICJWbvp0b3Ju4SBjaHliYSIKKworIzogZ2xvYmFscy5oOjEwNTIKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiUHJlcnW5ZW7pIgorCisjOiBnbG9iYWxzLmg6MTA1MworbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6IENoeWJu4SBhZHJlc2EiCisKKyM6IGdsb2JhbHMuaDoxMDU0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiQ2h5Ym79IGFyZ3VtZW50OiAlcyIKKworIzogZ2xvYmFscy5oOjEwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IENoeWJu/SB2/XJhejogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDU5Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6IENoeWJu/SByb3pzYWgiCisKKyM6IGdsb2JhbHMuaDoxMDYwCittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJDaHlibv0gcHLta2F6IgorCisjOiBnbG9iYWxzLmg6MTA2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIgamUgYWRyZXPhcm9tIgorCisjOiBnbG9iYWxzLmg6MTA2NQorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogTmVv6GVr4XZhbukgem5ha3kgcHJlZCAnPSciCisKKyM6IGdsb2JhbHMuaDoxMDY3Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IFpuYehrYSBt4SBjaHlibukg6O1zbG8gcmlhZGt1IgorCisjOiBnbG9iYWxzLmg6MTA2OAorbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICJFMjA6IFpuYehrYSBuaWUgamUgbmFzdGF2ZW7hIgorCisjOiBnbG9iYWxzLmg6MTA2OQorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiBOZWThIHNhIG1lbmm7LCBqZSBuYXN0YXZlbuEgdm+1YmEgJ21vZGlmaWFibGUnIgorCisjOiBnbG9iYWxzLmg6MTA3MAorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogU2tyaXB0IHZub3Jlbv0gcHLtbGm5IGhsYm9rbyIKKworIzogZ2xvYmFscy5oOjEwNzEKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IK5pYWRueSBhbHRlcm5hdO12bnkgc/pib3IiCisKKyM6IGdsb2JhbHMuaDoxMDcyCittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBUYWvhIHNrcmF0a2EgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwNzMKK21zZ2lkICJObyAhIGFsbG93ZWQiCittc2dzdHIgIiEgbmllIGplIHBvdm9sZW7pIgorCisjOiBnbG9iYWxzLmg6MTA3NQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogTmVk4SBzYSBwb3W+7bsgR1VJOiBuZWJvbG8gemFwbnV06SBwcmkgcHJla2xhZGUgcHJvZ3JhbXUiCisKKyM6IGdsb2JhbHMuaDoxMDc4Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6IE5lZOEgc2EgcG91vu27IGhlYnJlanNr/SByZb5pbTogIG5lYm9sIHphcG51dP0gcHJpIHByZWtsYWRlIHByb2dyYW11XG4iCisKKyM6IGdsb2JhbHMuaDoxMDgxCittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogTmVk4SBzYSBwb3W+7bsgZmFyc2kgcmW+aW06ICBuZWJvbCB6YXBudXT9IHByaSBwcmVrbGFkZSBwcm9ncmFtdVxuIgorCisjOiBnbG9iYWxzLmg6MTA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IFNrdXBpbmEgenbtcmF6bmVuaWEgJXMgbmVleGlzdHVqZSIKKworIzogZ2xvYmFscy5oOjEwODYKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IFphdGlhtSBuaWUgamUgvmlhZG55IHZsb75lbv0gdGV4dCIKKworIzogZ2xvYmFscy5oOjEwODcKK21zZ2lkICJFMzA6IE5vIHByZXZpb3VzIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiRTMwOiCuaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHLta2F6b3b9IHJpYWRvayIKKworIzogZ2xvYmFscy5oOjEwODgKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiCuaWFkbmUgdGFr6SBtYXBvdmFuaWUiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgIq5pYWRuYSB6aG9kYSIKKworIzogZ2xvYmFscy5oOjEwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICKuaWFkbmEgemhvZGE6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA5MQorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IK5pYWRueSBu4XpvdiBz+mJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiCuaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHJpc2z6Y2hhavpjaSBzcHLhdm55IHb9cmF6IgorCisjOiBnbG9iYWxzLmg6MTA5MworbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiCuaWFkbnkgcHJlZGNo4WR6YWr6Y2kgcHLta2F6IgorCisjOiBnbG9iYWxzLmg6MTA5NAorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IK5pYWRueSBwcmVkY2jhZHphavpjaSByZWd1bOFybnkgdv1yYXoiCisKKyM6IGdsb2JhbHMuaDoxMDk1Cittc2dpZCAiTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAiUm96c2FoIG5pZSBqZSBwb3ZvbGVu/SIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBOZWRvc3RhdG9rIG1pZXN0YSIKKworIzogZ2xvYmFscy5oOjEwOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIk5lZOEgc2Egdnl0dm9yabsgc/pib3IgJXMiCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJOZWThIHNhIHrtc2thuyBu4XpvdiBkb+hhc27paG8gc/pib3J1IgorCisjOiBnbG9iYWxzLmg6MTEwMQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXMiCittc2dzdHIgIk5lZOEgc2Egb3R2b3JpuyBz+mJvciAlcyIKKworIzogZ2xvYmFscy5oOjExMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVhZCBmaWxlICVzIgorbXNnc3RyICJOZWThIHNhIOjtdGG7IHP6Ym9yICVzIgorCisjOiBnbG9iYWxzLmg6MTEwMworbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiBOZXVsb75lbukgem1lbnkgKHBvdb5pdGUgISBwcmUgdnlu+nRlbmllKSIKKworIzogZ2xvYmFscy5oOjExMDQKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODogTnVsb3b9IGFyZ3VtZW50IgorCisjOiBnbG9iYWxzLmg6MTEwNgorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IE/oYWvhdmFu6SDo7XNsbyIKKworIzogZ2xvYmFscy5oOjExMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiBOZWThIHNhIG90dm9yabsgY2h5Ym92/SBz+mJvciAlcyIKKworIzogZ2xvYmFscy5oOjExMTIKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IE5lZG9zdGF0b2sgcGFt5HRpISIKKworIzogZ2xvYmFscy5oOjExMTUKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZCIKK21zZ3N0ciAiVnpvciBuZW7hamRlbv0iCisKKyM6IGdsb2JhbHMuaDoxMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiVnpvciBuZW7hamRlbv06ICVzIgorCisjOiBnbG9iYWxzLmg6MTExOAorbXNnaWQgIkFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkFyZ3VtZW50IG11c+0gYnm7IGtsYWRu/SIKKworIzogZ2xvYmFscy5oOjExMjAKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiCuaWFkbmUgY2h5YnkiCisKKyM6IGdsb2JhbHMuaDoxMTIyCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiBQb7lrb2Rlbv0gcmW7YXphYyBwcmUgdnlotWFk4XZhbmllIgorCisjOiBnbG9iYWxzLmg6MTEyMworbXNnaWQgIkU0NDogQ29ycnVwdGVkIHJlZ2V4cCBwcm9ncmFtIgorbXNnc3RyICJFNDQ6IFBvuWtvZGVu/SByZWdleHAgcHJvZ3JhbSIKKworIzogZ2xvYmFscy5oOjExMjQKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IG5hc3RhdmVu4SB2b7ViYSAnaWJhX3ByZV/o7XRhbmllJyAocG91vml0ZSAhIHByZSB2eW76dGVuaWUpIgorCisjOiBnbG9iYWxzLmg6MTEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiBOZWThIHNhIG5hc3Rhdmm7IHByZW1lbm7hIGliYV9wcmVf6O10YW5pZSBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMTI5Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBDaHliYSBwcmkg6O10YW7tIGNoeWJvdulobyBz+mJvcnUiCisKKyM6IGdsb2JhbHMuaDoxMTMyCittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IE5pZSBqZSB2IGJlenBl6G5vc3RuZWogc2NocuFua2UgcG92b2xlbukiCisKKyM6IGdsb2JhbHMuaDoxMTM0Cittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IENoeWJu4SBob2Rub3RhIHByZW1lbm5laiAnc2Nyb2xsJyIKKworIzogZ2xvYmFscy5oOjExMzUKK21zZ2lkICJFOTE6ICdzaGVsbCcgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICJFOTE6IHZvtWJhICdzaGVsbCcgamUgcHLhemRuYSIKKworIzogZ2xvYmFscy5oOjExMzYKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiBDaHliYSBwcmkgdXphdHbhcmFu7SBvZGtsYWRhY2llaG8gc/pib3J1IgorCisjOiBnbG9iYWxzLmg6MTEzNworbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6IHpvem5hbSB0YWdvdiBqZSBwcuF6ZG55IgorCisjOiBnbG9iYWxzLmg6MTEzOAorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiBQcu1rYXogamUgcHLtbGm5IHpsb75pdP0iCisKKyM6IGdsb2JhbHMuaDoxMTM5Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IE7hem92IGplIHBy7WxpuSBkbGj9IgorCisjOiBnbG9iYWxzLmg6MTE0MAorbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiBQcu1sabkgbW5vaG8gWyIKKworIzogZ2xvYmFscy5oOjExNDEKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogUHLtbGm5IG1ub2hvIG7henZvdiBz+mJvcm92IgorCisjOiBnbG9iYWxzLmg6MTE0MgorbXNnaWQgIlRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIk5hZGJ5dG/obukgem5ha3kgbmEga29uY2kiCisKKyM6IGdsb2JhbHMuaDoxMTQzCittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODogTmV6buFtYSB6bmHoa2EiCisKKyM6IGdsb2JhbHMuaDoxMTQ0Cittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiBOZWThIHNhIGV4cGFuZG92Ybsgvm9s7Wtvdukgem5ha3kgKHdpbGRjYXJkcykiCisKKyM6IGdsb2JhbHMuaDoxMTQ1Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IENoeWJhIHByaSB1a2xhZGFu7SIKKworIzogZ2xvYmFscy5oOjExNDYKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICJOdWxvdv0gcG/oZXQiCisKKyM6IGdsb2JhbHMuaDoxMTQ4Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBQb3W+aXRpZSA8U0lEPiBtaW1vIGtvbnRleHQgc2tyaXB0dSIKKworIzogZ2xvYmFscy5oOjExNTEKK21zZ2lkICJFNDQ5OiBJbnZhbGlkIGV4cHJlc3Npb24gcmVjZWl2ZWQiCittc2dzdHIgIkU0NDk6IEJvbCBwcmlqYXT9IGNoeWJu/SB2/XJheiIKKwpkaWZmIC0tZ2l0IGEvc3JjL3BvL3N2LnBvIGIvc3JjL3BvL3N2LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODRiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vc3YucG8KQEAgLTAsMCArMSw2NTE2IEBACisjIFN3ZWRpc2ggdHJhbnNsYXRpb24gZm9yIFZpbS4KKyMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBKb2hhbiBTdmVkYmVyZyA8am9oYW5Ac3ZlZGJlcmcucHAuc2U+LCAyMDAzLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogVmltIDYuMlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA0LTAxLTMwIDExOjU3KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA0LTI0IDIxOjU0KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEpvaGFuIFN2ZWRiZXJnIDxqb2hhbkBzdmVkYmVyZy5wcC5zZT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTd2VkaXNoIDxzdkBsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYnVmZmVyLmM6OTcKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IEthbiBpbnRlIGFsbG9rZXJhIG7lZ29uIGJ1ZmZlcnQsIGF2c2x1dGFyLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiBLYW4gaW50ZSBhbGxva2VyYSBidWZmZXJ0LCBhbnbkbmRlciBlbiBhbm5hbi4uLiIKKworIzogYnVmZmVyLmM6Nzk3Cittc2dpZCAiRTUxNTogTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICJFNTE1OiBJbmdhIGJ1ZmZlcnRhciBibGV2IHVybGFkZGFkZSIKKworIzogYnVmZmVyLmM6Nzk5Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6IEluZ2EgYnVmZmVydGFyIGJsZXYgYm9ydHRhZ25hIgorCisjOiBidWZmZXIuYzo4MDEKK21zZ2lkICJFNTE3OiBObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICJFNTE3OiBJbmdhIGJ1ZmZlcnRhciBibGV2IHV0cmFkZXJhZGUiCisKKyM6IGJ1ZmZlci5jOjgwOQorbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICIxIGJ1ZmZlcnQgbGFkZGFkZXMgdXIiCisKKyM6IGJ1ZmZlci5jOjgxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICIlZCBidWZmZXJ0YXIgbGFkZGFkZXMgdXIiCisKKyM6IGJ1ZmZlci5jOjgxNgorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIjEgYnVmZmVydCBib3J0dGFnZW4iCisKKyM6IGJ1ZmZlci5jOjgxOAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIiVkIGJ1ZmZlcnRhciBib3J0dGFnbmEiCisKKyM6IGJ1ZmZlci5jOjgyMworbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAiMSBidWZmZXJ0IHV0cmFkZXJhZCIKKworIzogYnVmZmVyLmM6ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICIlZCBidWZmZXJ0YXIgdXRyYWRlcmFkZSIKKworIzogYnVmZmVyLmM6ODg2Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogSW5nZW4gbW9kaWZpZXJhZCBidWZmZXJ0IGhpdHRhZCIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjkyNQorbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiBEZXQgZmlubnMgaW5nYSBsaXN0YWRlIGJ1ZmZlcnRhciIKKworIzogYnVmZmVyLmM6OTM3Cittc2dpZCAiRTg2OiBCdWZmZXIgJWxkIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFODY6IEJ1ZmZlcnQgJWxkIGV4aXN0ZXJhciBpbnRlIgorCisjOiBidWZmZXIuYzo5NDAKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogS2FuIGludGUgZ+UgYm9ydG9tIHNpc3RhIGJ1ZmZlcnQiCisKKyM6IGJ1ZmZlci5jOjk0MgorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogS2FuIGludGUgZ+UgZvZyZSBm9nJzdGEgYnVmZmVydCIKKworIzogYnVmZmVyLmM6OTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU4OTogSW5nZW4gc2tyaXZuaW5nIHNlZGFuIHNlbmFzdGUg5G5kcmluZyBm9nIgYnVmZmVydCAlbGQgKGzkZ2cgdGlsbCAhIGb2ciAiCisiYXR0IHR2aW5nYSkiCisKKyM6IGJ1ZmZlci5jOjk5NworbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiBLYW4gaW50ZSBsYWRkYSB1ciBzZW5hc3RlIGJ1ZmZlcnQiCisKKyM6IGJ1ZmZlci5jOjE1MzAKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiBWYXJuaW5nOiBMaXN0YSD2dmVyIGZpbG5hbW4gZmz2ZGFyIPZ2ZXIiCisKKyM6IGJ1ZmZlci5jOjE3MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiBCdWZmZXIgJWxkIGhpdHRhZGVzIGludGUiCisKKyM6IGJ1ZmZlci5jOjE5MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiBGbGVyIORuIGVuIHRy5GZmIGb2ciAlcyIKKworIzogYnVmZmVyLmM6MTkzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogSW5nZW4gbWF0Y2hhbmRlIGJ1ZmZlcnQgZvZyICVzIgorCisjOiBidWZmZXIuYzoyMzI5IGV4X2RvY21kLmM6NjY5MQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAicmFkICVsZCIKKworIzogYnVmZmVyLmM6MjQxMgorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IEJ1ZmZlciBtZWQgZGV0IGjkciBuYW1uZXQgZXhpc3RlcmFyIHJlZGFuIgorCisjOiBidWZmZXIuYzoyNzA1Cittc2dpZCAiIFtNb2RpZmllZF0iCittc2dzdHIgIiBbTW9kaWZpZXJhZF0iCisKKyM6IGJ1ZmZlci5jOjI3MTAKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIltJbnRlIHJlZGlnZXJhZF0iCisKKyM6IGJ1ZmZlci5jOjI3MTUKK21zZ2lkICJbTmV3IGZpbGVdIgorbXNnc3RyICJbTnkgZmlsXSIKKworIzogYnVmZmVyLmM6MjcxNgorbXNnaWQgIltSZWFkIGVycm9yc10iCittc2dzdHIgIltM5HNmZWxdIgorCisjOiBidWZmZXIuYzoyNzE4IGZpbGVpby5jOjE5MzkKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbc2tyaXZza3lkZGFkXSIKKworIzogYnVmZmVyLmM6MjczOQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIjEgcmFkIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAiJWxkIHJhZGVyIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICJyYWQgJWxkIGF2ICVsZCAtLSVkJSUtLSBrb2wgIgorCisjOiBidWZmZXIuYzoyODQ5Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbSW5nZW4gZmlsXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyODg5Cittc2dpZCAiaGVscCIKK21zZ3N0ciAiaGrkbHAiCisKKyM6IGJ1ZmZlci5jOjM0NDggc2NyZWVuLmM6NDk5NgorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW2hq5GxwXSIKKworIzogYnVmZmVyLmM6MzQ4MCBzY3JlZW4uYzo1MDAyCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJbRvZyaGFuZHN2aXNuaW5nXSIKKworIzogYnVmZmVyLmM6Mzc2MAorbXNnaWQgIkFsbCIKK21zZ3N0ciAiQWxsYSIKKworIzogYnVmZmVyLmM6Mzc2MAorbXNnaWQgIkJvdCIKK21zZ3N0ciAiQm90dCIKKworIzogYnVmZmVyLmM6Mzc2MgorbXNnaWQgIlRvcCIKK21zZ3N0ciAiVG9wcCIKKworIzogYnVmZmVyLmM6NDUwOAorbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBCdWZmZXJ0bGlzdGE6XG4iCisKKyM6IGJ1ZmZlci5jOjQ1NDEKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIltGZWxsaXN0YV0iCisKKyM6IGJ1ZmZlci5jOjQ1NTQgbWVtbGluZS5jOjE1MTMKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIltJbmdlbiBmaWxdIgorCisjOiBidWZmZXIuYzo0ODU3Cittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gVGVja2VuIC0tLSIKKworIzogYnVmZmVyLmM6NDg3NgorIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICJUZWNrZW4gZvZyICVzOiIKKworIzogYnVmZmVyLmM6NDg4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1uJXMiCisKKyM6IGRpZmYuYzoxMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IEthbiBpbnRlIHNraWxqYSBmbGVyIORuICVsZCBidWZmZXJ0YXIiCisKKyM6IGRpZmYuYzo2NTEKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogS2FuIGludGUgc2thcGEgc2tpbGphcmUiCisKKyM6IGRpZmYuYzo3NTAKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJQYXRjaGZpbCIKKworIzogZGlmZi5jOjEwMDEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IEthbiBpbnRlIGzkc2Egc2tpbGpldXRkYXRhIgorCisjOiBkaWZmLmM6MTc0MgorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiBBa3R1ZWxsIGJ1ZmZlcnQg5HIgaW50ZSBpIHNraWxqZWzkZ2UiCisKKyM6IGRpZmYuYzoxNzU0Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDogSW5nZW4gYW5uYW4gYnVmZmVydCBpIHNraWxqZWzkZ2UiCisKKyM6IGRpZmYuYzoxNzYyCittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICIiCisiRTEwMTogRmxlciDkbiB0duUgYnVmZmVydGFyIGkgc2tpbGplbORnZSwgdmV0IGludGUgdmlsa2VuIHNvbSBza2EgYW525G5kYXMiCisKKyM6IGRpZmYuYzoxNzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjogS2FuIGludGUgaGl0dGEgYnVmZmVydCBcIiVzXCIiCisKKyM6IGRpZmYuYzoxNzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogQnVmZmVydCBcIiVzXCIg5HIgaW50ZSBpIHNraWxqZWzkZ2UiCisKKyM6IGRpZ3JhcGguYzoyMTcyCittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IEVzY2FwZSBpbnRlIHRpbGzldGV0IGkgZGlncmFmIgorCisjOiBkaWdyYXBoLmM6MjM0NAorbXNnaWQgIkU1NDQ6IEtleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTU0NDogS2V5bWFwLWZpbCBoaXR0YWRlcyBpbnRlIgorCisjOiBkaWdyYXBoLmM6MjM3MQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogQW525G5kbmluZyBhdiA6bG9hZGtleW1hcCB1dGFuZvZyIGVuIGv2cmQgZmlsIgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBOeWNrZWxvcmRza29tcGxldHRlcmluZyAoXk4vXlApIgorCisjLiBjdHJsX3hfbW9kZSA9PSAwLCBeUC9eTiBjb21wbC4KKyM6IGVkaXQuYzo0MQorbXNnaWQgIiBeWCBtb2RlICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCittc2dzdHIgIiBeWC1s5GdlICheRS9eWS9eTC9eXS9eRi9eSS9eSy9eRC9eVi9eTi9eUCkiCisKKyMuIFNjcm9sbCBoYXMgaXQncyBvd24gbXNncywgaW4gaXQncyBwbGFjZSB0aGVyZSBpcyB0aGUgbXNnIGZvciBsb2NhbAorIy4gKiBjdHJsX3hfbW9kZSA9IDAgKGVnIGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfTE9DQUwpICAtLSBBY2V2ZWRvCisjOiBlZGl0LmM6NDQKK21zZ2lkICIgS2V5d29yZCBMb2NhbCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiBMb2thbCBueWNrZWxvcmRza29tcGxldHRlcmluZyAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiBIZWxyYWRza29tcGxldHRlcmluZyAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIEZpbG5hbW5za29tcGxldHRlcmluZyAoXkYvXk4vXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiIFRhZ2drb21wbGV0dGVyaW5nICheXS9eTi9eUCkiCisKKyM6IGVkaXQuYzo0OAorbXNnaWQgIiBQYXRoIHBhdHRlcm4gY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgU/ZrduRnc232bnN0ZXJrb21wbGV0dGVyaW5nICheTi9eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EL15OL15QKSIKK21zZ3N0ciAiIERlZmluaXRpb25za29tcGxldHRlcmluZyAoXkQvXk4vXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheSy9eTi9eUCkiCittc2dzdHIgIiBPcmRib2tza29tcGxldHRlcmluZyAoXksvXk4vXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIFRlc2F1cmtvbXBsZXR0ZXJpbmcgKF5UL15OL15QKSIKKworIzogZWRpdC5jOjUzCittc2dpZCAiIENvbW1hbmQtbGluZSBjb21wbGV0aW9uICheVi9eTi9eUCkiCittc2dzdHIgIiBLb21tYW5kb3JhZHNrb21wbGV0dGVyaW5nICheVi9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICJTdPZ0dGUgcOUgc2x1dGV0IHDlIHN0eWNrZXQiCisKKyM6IGVkaXQuYzo5NTMKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIid0aGVzYXVydXMnLWZsYWdnYSDkciB0b20iCisKKyM6IGVkaXQuYzoxMTU3Cittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiJ2RpY3Rpb25hcnknLWZsYWdnYSDkciB0b20iCisKKyM6IGVkaXQuYzoyMTU0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICJT9mtlciBpZ2Vub20gb3JkYm9rOiAlcyIKKworIzogZWRpdC5jOjIzNjAKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAoaW5mb2dhKSBSdWxsYSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjM2MgorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAoZXJz5HR0KSBSdWxsYSAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjY3NgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZzogJXMiCittc2dzdHIgIlP2a2VyIGlnZW5vbTogJXMiCisKKyM6IGVkaXQuYzoyNzExCittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIlP2a2VyIGlnZW5vbSB0YWdnYXIuIgorCisjOiBlZGl0LmM6MzM3MworbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiBM5GdnZXIgdGlsbCIKKworIy4gc2hvd21vZGUgbWlnaHQgcmVzZXQgdGhlIGludGVybmFsIGxpbmUgcG9pbnRlcnMsIHNvIGl0IG11c3QKKyMuICogYmUgY2FsbGVkIGJlZm9yZSBsaW5lID0gbWxfZ2V0KCksIG9yIHdoZW4gdGhpcyBhZGRyZXNzIGlzIG5vCisjLiAqIGxvbmdlciBuZWVkZWQuICAtLSBBY2V2ZWRvLgorIy4KKyM6IGVkaXQuYzozNDIyCittc2dpZCAiLS0gU2VhcmNoaW5nLi4uIgorbXNnc3RyICItLSBT9mtlci4uLiIKKworIzogZWRpdC5jOjM0NzgKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICJUaWxsYmFrYSBw5SBvcmdpbmFsZXQiCisKKyM6IGVkaXQuYzozNDgzCittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIk9yZCBmcuVuIGFubmFuIHJhZCIKKworIzogZWRpdC5jOjM0ODgKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAiRGVuIGVuZGEgdHLkZmZlbiIKKworIzogZWRpdC5jOjM1NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgInRy5GZmICVkIGF2ICVkIgorCisjOiBlZGl0LmM6MzU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAidHLkZmYgJWQiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjEwMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiBPa+RuZCB2YXJpYWJlbDogXCIlc1wiIgorCisjOiBldmFsLmM6MTMwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IFNha25hciBoYWtwYXJhbnRlczogJXMiCisKKyM6IGV2YWwuYzoxNDEyIGV2YWwuYzoxNDI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwODogSW5nZW4gc+VkYW4gdmFyaWFiZWw6IFwiJXNcIiIKKworIzogZXZhbC5jOjE2ODIKK21zZ2lkICJFMTA5OiBNaXNzaW5nICc6JyBhZnRlciAnPyciCittc2dzdHIgIkUxMDk6IFNha25hciAnOicgZWZ0ZXIgJz8nIgorCisjOiBldmFsLmM6MjI5OAorbXNnaWQgIkUxMTA6IE1pc3NpbmcgJyknIgorbXNnc3RyICJFMTEwOiBTYWtuYXIgJyknIgorCisjOiBldmFsLmM6MjM1NQorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiBTYWtuYXIgJ10nIgorCisjOiBldmFsLmM6MjQzMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjogRmxhZ2duYW1uIHNha25hczogJXMiCisKKyM6IGV2YWwuYzoyNDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzogT2vkbmQgZmxhZ2dhOiAlcyIKKworIzogZXZhbC5jOjI1MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IFNha25hciBjaXRhdHRlY2tlbjogJXMiCisKKyM6IGV2YWwuYzoyNjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiBTYWtuYXIgY2l0YXR0ZWNrZW46ICVzIgorCisjOiBldmFsLmM6MzAxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE2OiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gJXMiCittc2dzdHIgIkUxMTY6IE9naWx0aWdhIGFyZ3VtZW50IGb2ciBmdW5rdGlvbiAlcyIKKworIzogZXZhbC5jOjMwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IE9r5G5kIGZ1bmt0aW9uOiAlcyIKKworIzogZXZhbC5jOjMwNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExODogVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTg6IEb2ciBt5W5nYSBhcmd1bWVudCB0aWxsIGZ1bmt0aW9uOiAlcyIKKworIzogZXZhbC5jOjMwNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTogSW50ZSB0aWxscuRja2xpZ3QgbWVkIGFyZ3VtZW50IHRpbGwgZnVua3Rpb246ICVzIgorCisjOiBldmFsLmM6MzA1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IEFuduRuZGVyIDxTSUQ+IGludGUgaSBza3JpcHRzYW1tYW5oYW5nOiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzY0MSBndWkuYzo0MjYwIGd1aV9ndGsuYzoyMDAxCittc2dpZCAiJk9rIgorbXNnc3RyICImT2siCisKKyM6IGV2YWwuYzo0MTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkIHJhZGVyOiAiCisKKyM6IGV2YWwuYzo1NDA2Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImT0tcbiIKKyImQXZicnl0IgorCisjOiBldmFsLmM6NTQ0NgorbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgImFucm9wYWRlIGlucHV0cmVzdG9yZSgpIG9mdGFyZSDkbiBpbnB1dHNhdmUoKSIKKworIzogZXZhbC5jOjU5MDQKK21zZ2lkICJFNjU1OiBUb28gbXVjaCBzeW1ib2xpYyBsaW5rcyAoY3ljbGU/KSIKK21zZ3N0ciAiRTY1NTogRvZyIG3lbmdhIHN5bWJvbGlza2EgbORua2FyIChzbGluZ2E/KSIKKworIzogZXZhbC5jOjY1MjMKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IEluZ2VuIGFuc2x1dG5pbmcgdGlsbCBWaW0tc2VydmVyIgorCisjOiBldmFsLmM6NjYyMAorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiBLdW5kZSBpbnRlIGzkc2EgZXR0IHNlcnZlcnN2YXIiCisKKyM6IGV2YWwuYzo2NjQ4Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiBLdW5kZSBpbnRlIHPkbmRhIHRpbGwga2xpZW50IgorCisjOiBldmFsLmM6NjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTogS3VuZGUgaW50ZSBz5G5kYSB0aWxsICVzIgorCisjOiBldmFsLmM6Njc5NgorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKE9naWx0aWcpIgorCisjOiBldmFsLmM6Nzk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiBPZGVmaW5pZXJhZCB2YXJpYWJlbDogJXMiCisKKyM6IGV2YWwuYzo4Mzc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IE90aWxs5XRldCB2YXJpYWJlbG5hbW46ICVzIgorCisjOiBldmFsLmM6ODY2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTEyMjogRnVua3Rpb25lbiAlcyBleGlzdGVyYXIgcmVkYW4sIGzkZ2cgdGlsbCAhIGb2ciBhdHQgZXJz5HR0YSBkZW4iCisKKyM6IGV2YWwuYzo4NzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IE9kZWZpbmllcmFkIGZ1bmt0aW9uOiAlcyIKKworIzogZXZhbC5jOjg3NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiBTYWtuYXIgJygnOiAlcyIKKworIzogZXZhbC5jOjg3NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IE90aWxs5XRldCBhcmd1bWVudDogJXMiCisKKyM6IGV2YWwuYzo4ODU3Cittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IFNha25hciA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo4OTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiBLYW4gaW50ZSBvbWRlZmluaWVyYSBmdW5rdGlvbiAlczogRGVuIGFuduRuZHMiCisKKyM6IGV2YWwuYzo5MDA4Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTogRnVua3Rpb25zbmFtbiBrcuR2cyIKKworIzogZXZhbC5jOjkwNTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODogRnVua3Rpb25zbmFtbiBt5XN0ZSBi9nJqYSBtZWQgZW4gdmVyc2FsOiAlcyIKKworIzogZXZhbC5jOjkyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogT2RlZmluaWVyYWQgZnVua3Rpb246ICVzIgorCisjOiBldmFsLmM6OTI1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6IEthbiBpbnRlIHRhIGJvcnQgZnVua3Rpb24gJXM6IERlbiBhbnbkbmRzIgorCisjOiBldmFsLmM6OTMwNAorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IERqdXBldCBw5SBmdW5rdGlvbnNhbnJvcGV0IORyIGj2Z3JlIORuICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgImFucm9wYXIgJXMiCisKKyM6IGV2YWwuYzo5NDE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzIGF2YnL2dHMiCisKKyM6IGV2YWwuYzo5NDIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyAjJWxkIgorbXNnc3RyICIlcyByZXR1cm5lcmFyICMlbGQiCisKKyM6IGV2YWwuYzo5NDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHJldHVybmluZyBcIiVzXCIiCittc2dzdHIgIiVzIHJldHVybmVyYXIgXCIlc1wiIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo5NDQ0IGV4X2NtZHMyLmM6MjI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICJmb3J0c+R0dGVyIGkgJXMiCisKKyM6IGV2YWwuYzo5NDcwCittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gaW50ZSBpbm9tIGVuIGZ1bmt0aW9uIgorCisjOiBldmFsLmM6OTgwMQorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIGdsb2JhbGEgdmFyaWFibGVyOlxuIgorCisjOiBleF9jbWRzMi5jOjkyCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gY29udGludWUuIgorbXNnc3RyICJH5XIgaW4gaSBmZWxz9mtuaW5nc2zkZ2UuICBTa3JpdiBcImNvbnRcIiBm9nIgYXR0IGZvcnRz5HR0YS4iCisKKyM6IGV4X2NtZHMyLmM6OTYgZXhfZG9jbWQuYzo5MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICJyYWQgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo5OAorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJrb21tYW5kbzogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIkJyeXRwdW5rdCBpIFwiJXMlc1wiIHJhZCAlbGQiCisKKyM6IGV4X2NtZHMyLmM6NTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTogQnJ5dHB1bmt0IGhpdHRhZGVzIGludGU6ICVzIgorCisjOiBleF9jbWRzMi5jOjU2NgorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIkluZ2EgYnJ5dHB1bmt0ZXIgZGVmaW5pZXJhZGUiCisKKyM6IGV4X2NtZHMyLmM6NTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiUzZCAgJXMgJXMgIGxpbmUgJWxkIgorbXNnc3RyICIlM2QgICVzICVzICByYWQgJWxkIgorCisjOiBleF9jbWRzLmM6MjA5NyBleF9jbWRzLmM6MjM2MiBleF9jbWRzMi5jOjc2MworbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIlNwYXJhIHNvbSIKKworIzogZXhfY21kczIuYzo3ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAiU3BhcmEg5G5kcmluZ2FyIHRpbGwgXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjc4OCBleF9kb2NtZC5jOjkwODUKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAiTmFtbmz2cyIKKworIzogZXhfY21kczIuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IEluZ2VuIHNrcml2bmluZyBzZWRhbiBzZW5hc3RlIORuZHJpbmcgZvZyIGJ1ZmZlcnQgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjk4NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiVmFybmluZzogR2ljayBpbiBpIGFuZHJhIGJ1ZmZlcnRhciBvduRudGF0IChrb250cm9sbGVyYSBhdXRva29tbWFuZG9uKSIKKworIzogZXhfY21kczIuYzoxMzg3Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiBEZXQgZmlubnMgYmFyYSBlbiBmaWwgYXR0IHJlZGlnZXJhIgorCisjOiBleF9jbWRzMi5jOjEzODkKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IEthbiBpbnRlIGflIGb2cmUgZvZyc3RhIGZpbGVuIgorCisjOiBleF9jbWRzMi5jOjEzOTEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogS2FuIGludGUgZ+UgYm9ydG9tIHNpc3RhIGZpbGVuIgorCisjOiBleF9jbWRzMi5jOjE4NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICJT9mtlciBlZnRlciBcIiVzXCIgaSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2NAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAiU/ZrZXIgZWZ0ZXIgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAiaGl0dGFkZXMgaW50ZSBpICdydW50aW1lcGF0aCc6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTE5Cittc2dpZCAiU291cmNlIFZpbSBzY3JpcHQiCittc2dzdHIgIkzkcyBWaW0tc2tyaXB0IgorCisjOiBleF9jbWRzMi5jOjIxMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICJLYW4gaW50ZSBs5HNhIGVuIGthdGFsb2c6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJrdW5kZSBpbnRlIGzkc2EgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIxNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICJyYWQgJWxkOiBrdW5kZSBpbnRlIGzkc2EgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJs5HNlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjE2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICJyYWQgJWxkOiBs5HNlciBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAibORzdGUga2xhcnQgJXMiCisKKyM6IGV4X2NtZHMyLmM6MjYzNAorbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6IFZhcm5pbmc6IEZlbCByYWRhdnNraWxqYXJlLCBeTSBrYW4gc2FrbmFzIgorCisjOiBleF9jbWRzMi5jOjI2ODMKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgYW525G5kcyB1dGFuZvZyIGVuIGv2cmQgZmlsIgorCisjOiBleF9jbWRzMi5jOjI3MTYKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODogOmZpbmlzaCBhbnbkbmRzIHV0YW5m9nIgZW4ga/ZyZCBmaWwiCisKKyM6IGV4X2NtZHMyLmM6MzE1OQorIywgYy1mb3JtYXQKK21zZ2lkICJQYWdlICVkIgorbXNnc3RyICJTaWRhICVkIgorCisjOiBleF9jbWRzMi5jOjMzMTUKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIkluZ2VuIHRleHQgYXR0IHNrcml2YSB1dCIKKworIzogZXhfY21kczIuYzozMzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICJTa3JpdmVyIHV0IHNpZGEgJWQgKCVkJSUpIgorCisjOiBleF9jbWRzMi5jOjM0MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIENvcHkgJWQgb2YgJWQiCittc2dzdHIgIiBLb3BpYSAlZCBhdiAlZCIKKworIzogZXhfY21kczIuYzozNDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICJTa3JldiB1dDogJXMiCisKKyM6IGV4X2NtZHMyLmM6MzQ3MAorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIlV0c2tyaWZ0IGF2YnJ1dGVuIgorCisjOiBleF9jbWRzMi5jOjM4MzUKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IEZlbCB2aWQgc2tyaXZuaW5nIGF2IHV0ZGF0YSB0aWxsIFBvc3RTY3JpcHQtZmlsIgorCisjOiBleF9jbWRzMi5jOjQxMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyNDogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTYyNDogS2FuIGludGUg9nBwbmEgZmlsIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MTIwIGV4X2NtZHMyLmM6NDc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IEthbiBpbnRlIGzkc2EgUG9zdFNjcmlwdC1yZXN1cnNmaWwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxODogZmlsZSBcIiVzXCIgaXMgbm90IGEgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE4OiBmaWwgXCIlc1wiIORyIGludGUgZW4gUG9zdFNjcmlwdC1yZXN1cnNmaWwiCisKKyM6IGV4X2NtZHMyLmM6NDE0MyBleF9jbWRzMi5jOjQxNjMgZXhfY21kczIuYzo0MTc4IGV4X2NtZHMyLmM6NDIwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE5OiBmaWxlIFwiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIgorbXNnc3RyICJFNjE5OiBmaWwgXCIlc1wiIORyIGludGUgZW4gUG9zdFNjcmlwdC1yZXN1cnNmaWwgc29tIHN09mRzIgorCisjOiBleF9jbWRzMi5jOjQyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyMTogXCIlc1wiIHJlc291cmNlIGZpbGUgaGFzIHdyb25nIHZlcnNpb24iCittc2dzdHIgIkU2MjE6IFwiJXNcIi1r5GxsZmlsZW4gaGFyIGZlbCB2ZXJzaW9uIgorCisjOiBleF9jbWRzMi5jOjQ2OTcKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IEthbiBpbnRlIPZwcG5hIFBvc3RTY3JpcHQtdXRmaWwiCisKKyM6IGV4X2NtZHMyLmM6NDczMAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiBLYW4gaW50ZSD2cHBuYSBmaWwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ4NDkKK21zZ2lkICJFNDU2OiBDYW4ndCBmaW5kIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcInByb2xvZy5wc1wiIgorbXNnc3RyICJFNDU2OiBLYW4gaW50ZSBoaXR0YSBQb3N0U2NyaXB0LWvkbGxmaWxlbiBcInByb2xvZy5wc1wiIgorCisjOiBleF9jbWRzMi5jOjQ4ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3QgZmluZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlcy5wc1wiIgorbXNnc3RyICJFNDU2OiBLYW4gaW50ZSBoaXR0YSBQb3N0U2NyaXB0LWvkbGxmaWxlbiBcIiVzLnBzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDg5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjIwOiBVbmFibGUgdG8gY29udmVydCBmcm9tIG11bHRpLWJ5dGUgdG8gXCIlc1wiIGVuY29kaW5nIgorbXNnc3RyICJFNjIwOiBLdW5kZSBpbnRlIGtvbnZlcnRlcmEgZnLlbiBtdWx0aS1ieXRlIHRpbGwgXCIlc1wiIGVuY29kaW5nIgorCisjOiBleF9jbWRzMi5jOjUwMjMKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIlNraWNrYXIgdGlsbCBza3JpdmFyZS4uLiIKKworIzogZXhfY21kczIuYzo1MDI3Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogTWlzc2x5Y2thZGVzIG1lZCBhdHQgc2tyaXZhIHV0IFBvc3RTY3JpcHQtZmlsIgorCisjOiBleF9jbWRzMi5jOjUwMjkKK21zZ2lkICJQcmludCBqb2Igc2VudC4iCittc2dzdHIgIlNrcml2YXJqb2JiIHNraWNrYXQuIgorCisjOiBleF9jbWRzMi5jOjU0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIkFrdHVlbGx0ICVzc3By5Ws6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo1NDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiBLYW4gaW50ZSBz5HR0YSBzcHLlayB0aWxsIFwiJXNcIiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPa3RhbHQgJTAzbyIKKworIzogZXhfY21kcy5jOjExOAorbXNnaWQgIj4gJWQsIEhleCAlMDR4LCBPY3RhbCAlbyIKK21zZ3N0ciAiPiAlZCwgSGV4ICUwNHgsICBPa3RhbHQgJW8iCisKKyM6IGV4X2NtZHMuYzoxMTkKK21zZ2lkICI+ICVkLCBIZXggJTA4eCwgT2N0YWwgJW8iCittc2dzdHIgIj4gJWQsIEhleCAlMDh4LCBPa3RhbHQgJW8iCisKKyM6IGV4X2NtZHMuYzo0MzAKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogRmx5dHRhIHJhZGVyIGluIGkgZGVtIHNq5Gx2YSIKKworIzogZXhfY21kcy5jOjQ5OQorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSByYWQgZmx5dHRhZCIKKworIzogZXhfY21kcy5jOjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgbW92ZWQiCittc2dzdHIgIiVsZCByYWRlciBmbHl0dGFkZSIKKworIzogZXhfY21kcy5jOjkyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIiVsZCByYWRlciBmaWx0cmVyYWRlIgorCisjOiBleF9jbWRzLmM6OTUyCittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogKkZpbHRlciotQXV0b2tvbW1hbmRvbiBm5XIgaW50ZSDkbmRyYSBha3R1ZWxsIGJ1ZmZlcnQiCisKKyM6IGV4X2NtZHMuYzoxMDM3Cittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbSW5nZW4gc2tyaXZuaW5nIHNlZGFuIHNlbmFzdGUg5G5kcmluZ11cbiIKKworIzogZXhfY21kcy5jOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXN2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgIiVzdmltaW5mbzogJXMgcOUgcmFkOiAiCisKKyM6IGV4X2NtZHMuYzoxMjg4Cittc2dpZCAiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiCittc2dzdHIgIkUxMzY6IHZpbWluZm86IEb2ciBt5W5nYSBmZWwsIGhvcHBhciD2dmVyIHJlc3RlbiBhdiBmaWxlbiIKKworIzogZXhfY21kcy5jOjEzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICJM5HNlciB2aW1pbmZvLWZpbCBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMzI0Cittc2dpZCAiIGluZm8iCittc2dzdHIgIiBpbmZvIgorCisjOiBleF9jbWRzLmM6MTMyNQorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIG3kcmtlbiIKKworIzogZXhfY21kcy5jOjEzMjYKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgTUlTU0xZQ0tBREVTIgorCisjOiBleF9jbWRzLmM6MTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogVmltaW5mby1maWwg5HIgaW50ZSBza3JpdmJhcjogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6IEthbiBpbnRlIHNrcml2YSB2aW1pbmZvLWZpbCAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiU2tyaXZlciB2aW1pbmZvLWZpbCBcIiVzXCIiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyBEZW4gaORyIHZpbWluZm8tZmlsZW4gZ2VuZXJlcmFkZXMgYXYgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTY1MQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgRHUgZuVyIHJlZGlnZXJhIGRlbiBvbSBkdSDkciBm9nJzaWt0aWchXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjUzCittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgVuRyZGUgYXYgJ2VuY29kaW5nJyBu5HIgZGVuIGjkciBmaWxlbiBibGV2IHNrcml2ZW5cbiIKKworIzogZXhfY21kcy5jOjE3NTIKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIk90aWxs5XRldCBzdGFydHRlY2tlbiIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTQwCittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IEZpbGVuIORyIGlubORzdCBpIGVuIGFubmFuIGJ1ZmZlcnQiCisKKyM6IGV4X2NtZHMuYzoyMTc0Cittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAiU2tyaXYgb2Z1bGxzdORuZGlnIGZpbD8iCisKKyM6IGV4X2NtZHMuYzoyMTgxCittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IEFuduRuZCAhIGb2ciBhdHQgc2tyaXZhIG9mdWxsc3TkbmRpZyBidWZmZXJ0IgorCisjOiBleF9jbWRzLmM6MjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBcIiUuKnNcIj8iCittc2dzdHIgIlNrcml2IPZ2ZXIgYmVmaW50bGlnIGZpbCBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogSW5nZXQgZmlsbmFtbiBm9nIgYnVmZmVydCAlbGQiCisKKyM6IGV4X2NtZHMuYzoyNDA1Cittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogRmlsZW4gc2tyZXZzIGludGU6IFNrcml2bmluZyDkciBpbmFrdGl2ZXJhdCBtZWQgJ3dyaXRlJy1mbGFnZ2FuIgorCisjOiBleF9jbWRzLmM6MjQyNQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiJ3JlYWRvbmx5JyBmbGFnZ2FuIORyIHNhdHQgZvZyIFwiJS4qc1wiLlxuIgorItZuc2thciBkdSBhdHQgc2tyaXZhIORuZOU/IgorCisjOiBleF9jbWRzLmM6MjU5NworbXNnaWQgIkVkaXQgRmlsZSIKK21zZ3N0ciAiUmVkaWdlcmEgZmlsIgorCisjOiBleF9jbWRzLmM6MzE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogQXV0b2tvbW1hbmRvbiB0b2cgb3bkbnRhdCBib3J0IG55IGJ1ZmZlcnQgJXMiCisKKyM6IGV4X2NtZHMuYzozMzAyCittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IGlja2VudW1lcmlza3QgYXJndW1lbnQgdGlsbCA6eiIKKworIzogZXhfY21kcy5jOjMzODcKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBTa2Fsa29tbWFuZG9uIGludGUgdGlsbOV0bmEgaSBydmltIgorCisjOiBleF9jbWRzLmM6MzQ5NAorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3VsauRyYSB1dHRyeWNrIGthbiBpbnRlIHZhcmEg5XRza2lsZGEgYXYgYm9rc3TkdmVyIgorCisjOiBleF9jbWRzLmM6Mzg0MAorIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICJlcnPkdHQgbWVkICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQyMTYKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKEF2YnJ1dGVuKSAiCisKKyM6IGV4X2NtZHMuYzo0MjIwCittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIjEgZXJz5HR0bmluZyIKKworIzogZXhfY21kcy5jOjQyMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIiVsZCBlcnPkdHRuaW5nYXIiCisKKyM6IGV4X2NtZHMuYzo0MjI1Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIHDlIDEgcmFkIgorCisjOiBleF9jbWRzLmM6NDIyNworIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgcOUgJWxkIHJhZGVyIgorCisjOiBleF9jbWRzLmM6NDI3OAorbXNnaWQgIkUxNDc6IENhbm5vdCBkbyA6Z2xvYmFsIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE0NzogS2FuIGludGUgZ/ZyYSA6Z2xvYmFsIHJla3Vyc2l2dCIKKworIzogZXhfY21kcy5jOjQzMTMKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODogUmVndWxq5HJ0IHV0dHJ5Y2sgc2FrbmFzIGZy5W4gZ2xvYmFsIgorCisjOiBleF9jbWRzLmM6NDM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICJN9m5zdGVyIGZ1bm5ldCBpIHZhcmplIHJhZDogJXMiCisKKyM6IGV4X2NtZHMuYzo0NDQzCittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyBTZW5hc3RlIGVyc+R0dG5pbmdzc3Ry5G5nOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogVHl25HJyLCBpbmdlbiBoauRscCBm9nIgJXMiCisKKyM6IGV4X2NtZHMuYzo0NTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiVHl25HJyLCBoauRscGZpbCBcIiVzXCIgaGl0dGFkZXMgaW50ZSIKKworIzogZXhfY21kcy5jOjUwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogSW50ZSBlbiBrYXRhbG9nOiAlcyIKKworIzogZXhfY21kcy5jOjUwOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IEthbiBpbnRlIPZwcG5hICVzIGb2ciBza3Jpdm5pbmciCisKKyM6IGV4X2NtZHMuYzo1MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiBLdW5kZSBpbnRlIPZwcG5hICVzIGb2ciBs5HNuaW5nIgorCisjOiBleF9jbWRzLmM6NTIwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiBEdXBsaWNlcmFkIHRhZ2cgXCIlc1wiIGkgZmlsICVzIgorCisjOiBleF9jbWRzLmM6NTMxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IE9r5G50IHNpZ25hdHVya29tbWFuZG86ICVzIgorCisjOiBleF9jbWRzLmM6NTMzNgorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiBTYWtuYXIgc2lnbmF0dXJuYW1uIgorCisjOiBleF9jbWRzLmM6NTM4MgorbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IEb2ciBt5W5nYSBzaWduYXR1cmVyIGRlZmluaWVyYWRlIgorCisjOiBleF9jbWRzLmM6NTQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6IE9naWx0aWcgc2lnbmF0dXJ0ZXh0OiAlcyIKKworIzogZXhfY21kcy5jOjU0ODAgZXhfY21kcy5jOjU2NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NTogVW5rbm93biBzaWduOiAlcyIKK21zZ3N0ciAiRTE1NTogT2vkbmQgc2lnbmF0dXI6ICVzIgorCisjOiBleF9jbWRzLmM6NTUyNgorbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IFNha25hciBzaWduYXR1cm51bW1lciIKKworIzogZXhfY21kcy5jOjU2MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1ODogSW52YWxpZCBidWZmZXIgbmFtZTogJXMiCittc2dzdHIgIkUxNTg6IE9naWx0aWd0IGJ1ZmZlcnRuYW1uOiAlcyIKKworIzogZXhfY21kcy5jOjU2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IE9naWx0aWd0IHNpZ25hdHVyLUlEOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1NzE1Cittc2dpZCAiIChOT1QgRk9VTkQpIgorbXNnc3RyICIgKElOVEUgSElUVEFERSkiCisKKyM6IGV4X2NtZHMuYzo1NzE3Cittc2dpZCAiIChub3Qgc3VwcG9ydGVkKSIKK21zZ3N0ciAiIChzdPZkcyBpbnRlKSIKKworIzogZXhfY21kcy5jOjU4MTYKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIltCb3J0dGFnZW5dIgorCisjOiBleF9kb2NtZC5jOjQ5MAorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICJH5XIgaW4gaSBFeC1s5GdlLiAgU2tyaXYgXCJ2aXN1YWxcIiBm9nIgYXR0IGflIHRpbGwgTm9ybWFsLWzkZ2UuIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1MjYKK21zZ2lkICJFNTAxOiBBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAiRTUwMTogVmlkIGZpbHNsdXQiCisKKyM6IGV4X2RvY21kLmM6NjMyCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiBLb21tYW5kbyBm9nIgcmVrdXJzaXZ0IgorCisjOiBleF9kb2NtZC5jOjExNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwNTogRXhjZXB0aW9uIG5vdCBjYXVnaHQ6ICVzIgorbXNnc3RyICJFNjA1OiBVbmRhbnRhZyBpbnRlIGblbmdhdDogJXMiCisKKyM6IGV4X2RvY21kLmM6MTI0MQorbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIlNsdXQgcOUgbORzdCBmaWwiCisKKyM6IGV4X2RvY21kLmM6MTI0MgorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiU2x1dCBw5SBmdW5rdGlvbiIKKworIzogZXhfZG9jbWQuYzoxNzA2Cittc2dpZCAiRTQ2NDogQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ2NDogT3R5ZGxpZyBhbnbkbmRuaW5nIGF2IGFuduRuZGFyZGVmaW5pZXJhdCBrb21tYW5kbyIKKworIzogZXhfZG9jbWQuYzoxNzIwCittc2dpZCAiRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICJFNDkyOiBJbnRlIGV0dCByZWRpZ2VyYXJrb21tYW5kbyIKKworIzogZXhfZG9jbWQuYzoxODEwCittc2dpZCAiRTQ3ODogRG9uJ3QgcGFuaWMhIgorbXNnc3RyICJFNDc4OiBG5SBpbnRlIHBhbmlrISIKKworIzogZXhfZG9jbWQuYzoxODI5Cittc2dpZCAiRTQ5MzogQmFja3dhcmRzIHJhbmdlIGdpdmVuIgorbXNnc3RyICJFNDkzOiBCYWvldG9tcuVkZSBnaXZldCIKKworIzogZXhfZG9jbWQuYzoxODM4Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICJCYWvldG9tcuVkZSBnaXZldCwgT0sgYXR0IHbkeGxhIgorCisjOiBleF9kb2NtZC5jOjE5NjEKK21zZ2lkICJFNDk0OiBVc2UgdyBvciB3Pj4iCittc2dzdHIgIkU0OTQ6IEFuduRuZCB3IGVsbGVyIHc+PiIKKworIzogZXhfZG9jbWQuYzozNTcwCittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiBUeXbkcnIsIGtvbW1hbmRvdCDkciBpbnRlIHRpbGxn5G5nbGlndCBpIGRlbiBo5HIgdmVyc2lvbmVuIgorCisjOiBleF9kb2NtZC5jOjM3NTYKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3MjogQmFyYSBldHQgZmlsbmFtbiB0aWxs5XRldCIKKworIzogZXhfZG9jbWQuYzo0MzIwCittc2dpZCAiMSBtb3JlIGZpbGUgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiMSBmaWwgdGlsbCBhdHQgcmVkaWdlcmEuICBBdnNsdXRhIORuZOU/IgorCisjOiBleF9kb2NtZC5jOjQzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICIlZCBmaWxlciB0aWxsIGF0dCByZWRpZ2VyYS4gIEF2c2x1dGEg5G5k5T8iCisKKyM6IGV4X2RvY21kLmM6NDMzMAorbXNnaWQgIkUxNzM6IDEgbW9yZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IDEgZmlsIHRpbGwgYXR0IHJlZGlnZXJhIgorCisjOiBleF9kb2NtZC5jOjQzMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3MzogJWxkIGZpbGVyIHRpbGwgYXR0IHJlZGlnZXJhIgorCisjOiBleF9kb2NtZC5jOjQ0MjcKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTc0OiBLb21tYW5kbyBleGlzdGVyYXIgcmVkYW46IGzkZ2cgdGlsbCAhIGb2ciBhdHQgZXJz5HR0YSBkZXQiCisKKyM6IGV4X2RvY21kLmM6NDUzNworbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICBOYW1uICAgICAgICBBcmcgT21y5WRlIEbkcmRpZ3QgIERlZmluaXRpb24iCisKKyM6IGV4X2RvY21kLmM6NDYyNgorbXNnaWQgIk5vIHVzZXItZGVmaW5lZCBjb21tYW5kcyBmb3VuZCIKK21zZ3N0ciAiSW5nYSBhbnbkbmRhcmRlZmluaWVyYWRlIGtvbW1hbmRvbiBoaXR0YWRlIgorCisjOiBleF9kb2NtZC5jOjQ2NTgKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiBJbmdhIGF0dHJpYnV0IGFuZ2l2bmEiCisKKyM6IGV4X2RvY21kLmM6NDcxMAorbXNnaWQgIkUxNzY6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTE3NjogT2dpbHRpZ3QgYW50YWwgYXJndW1lbnQiCisKKyM6IGV4X2RvY21kLmM6NDcyNQorbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IEFudGFsIGthbiBpbnRlIGFuZ2VzIHR25SBn5W5nZXIiCisKKyM6IGV4X2RvY21kLmM6NDczNQorbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6IE9naWx0aWd0IHN0YW5kYXJkduRyZGUgZvZyIGFudGFsIgorCisjOiBleF9kb2NtZC5jOjQ3NjYKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IGFyZ3VtZW50IGty5HZzIGb2ciBrb21wbGV0dGVyaW5nIgorCisjOiBleF9kb2NtZC5jOjQ3OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6IE9naWx0aWd0IGtvbXBsZXR0ZXJpbmdzduRyZGU6ICVzIgorCisjOiBleF9kb2NtZC5jOjQ4MDMKK21zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgorbXNnc3RyICJFNDY3OiBTcGVjaWFsa29tcGxldHRlcmluZyBrcuR2ZXIgZXR0IGZ1bmt0aW9uc2FyZ3VtZW50IgorCisjOiBleF9kb2NtZC5jOjQ4MDgKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIkU0Njg6IEtvbXBsZXR0ZXJpbmdzYXJndW1lbnQgYmFyYSB0aWxs5XRldCBm9nIgc3BlY2lhbGtvbXBsZXR0ZXJpbmciCisKKyM6IGV4X2RvY21kLmM6NDgxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IE9naWx0aWd0IGF0dHJpYnV0OiAlcyIKKworIzogZXhfZG9jbWQuYzo0ODYxCittc2dpZCAiRTE4MjogSW52YWxpZCBjb21tYW5kIG5hbWUiCittc2dzdHIgIkUxODI6IE9naWx0aWd0IGtvbW1hbmRvbmFtbiIKKworIzogZXhfZG9jbWQuYzo0ODc2Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiBBbnbkbmRhcmRlZmluaWVyYWRlIGtvbW1hbmRvbiBt5XN0ZSBi9nJqYSBtZWQgZW4gc3RvciBib2tzdGF2IgorCisjOiBleF9kb2NtZC5jOjQ5NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IEluZ2V0IHPlZGFudCBhbnbkbmRhcmRlZmluaWVyYXQga29tbWFuZG86ICVzIgorCisjOiBleF9kb2NtZC5jOjU0MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiBLYW4gaW50ZSBoaXR0YSBm5HJnc2NoZW1hICVzIgorCisjOiBleF9kb2NtZC5jOjU0MTMKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAiVuRsa29tbWVuLCBWaW0tYW525G5kYXJlISIKKworIzogZXhfZG9jbWQuYzo2MTM2Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIlJlZGlnZXJhIGZpbCBpIG55dHQgZvZuc3RlciIKKworIzogZXhfZG9jbWQuYzo2NDMxCittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICJJbmdlbiB25HhsaW5nc2ZpbCIKKworIzogZXhfZG9jbWQuYzo2NTM1Cittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIkzkZ2cgdGlsbCBmaWwiCisKKyM6IGV4X2RvY21kLmM6NjU5OQorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4NjogSW5nZW4gdGlkaWdhcmUga2F0YWxvZyIKKworIzogZXhfZG9jbWQuYzo2NjgxCittc2dpZCAiRTE4NzogVW5rbm93biIKK21zZ3N0ciAiRTE4NzogT2vkbnQiCisKKyM6IGV4X2RvY21kLmM6Njc2NgorbXNnaWQgIkU0NjU6IDp3aW5zaXplIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY1OiA6d2luc2l6ZSBrcuR2ZXIgdHblIHNpZmZlcmFyZ3VtZW50IgorCisjOiBleF9kb2NtZC5jOjY4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2luZG93IHBvc2l0aW9uOiBYICVkLCBZICVkIgorbXNnc3RyICJG9m5zdGVycG9zaXRpb246IFggJWQsIFkgJWQiCisKKyM6IGV4X2RvY21kLmM6NjgyMgorbXNnaWQgIkUxODg6IE9idGFpbmluZyB3aW5kb3cgcG9zaXRpb24gbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtIgorbXNnc3RyICIiCisiRTE4ODogRvZyc2thZmZhIGb2bnN0ZXJwb3NpdGlvbiBpbnRlIGltcGxlbWVudGVyYXQgZvZyIGRlbiBo5HIgcGxhdHRmb3JtZW4iCisKKyM6IGV4X2RvY21kLmM6NjgzMgorbXNnaWQgIkU0NjY6IDp3aW5wb3MgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjY6IDp3aW5wb3Mga3LkdmVyIHR25SBzaWZmZXJhcmd1bWVudCIKKworIzogZXhfZG9jbWQuYzo3MTExCittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAiU3BhcmEgb21kaXJpZ2VyaW5nIgorCisjOiBleF9kb2NtZC5jOjcyOTIKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIlNwYXJhIHZ5IgorCisjOiBleF9kb2NtZC5jOjcyOTMKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIlNwYXJhIHNlc3Npb24iCisKKyM6IGV4X2RvY21kLmM6NzI5NQorbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIlNwYXJhIGtvbmZpZ3VyYXRpb24iCisKKyM6IGV4X2RvY21kLmM6NzQ0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiBleGlzdGVyYXIgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgdHZpbmdhKSIKKworIzogZXhfZG9jbWQuYzo3NDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogS2FuIGludGUg9nBwbmEgXCIlc1wiIGb2ciBza3Jpdm5pbmciCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjc0NzUKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIiIKKyJFMTkxOiBBcmd1bWVudCBt5XN0ZSB2YXJhIGVuIGJva3N0YXYgZWxsZXIgZnJhbeV0LS9iYWvldHbkbnQgY2l0YXR0ZWNrZW4iCisKKyM6IGV4X2RvY21kLmM6NzUxNworbXNnaWQgIkUxOTI6IFJlY3Vyc2l2ZSB1c2Ugb2YgOm5vcm1hbCB0b28gZGVlcCIKK21zZ3N0ciAiRTE5MjogUmVrdXJzaXYgYW525G5kbmluZyBhdiA6bm9ybWFsIGb2ciBkanVwIgorCisjOiBleF9kb2NtZC5jOjgwMzMKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogSW5nZXQgYWx0ZXJuYXRpdnQgZmlsbmFtbiBhdHQgYnl0YSB1dCAnIycgbWVkIgorCisjOiBleF9kb2NtZC5jOjgwNjQKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIkU0OTU6IGluZ2V0IGF1dG9rb21tYW5kby1maWxuYW1uIGF0dCBlcnPkdHRhIFwiPGFmaWxlPlwiIG1lZCIKKworIzogZXhfZG9jbWQuYzo4MDcyCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiBpbmdldCBhdXRva29tbWFuZG8tYnVmZmVybnVtbWVyIGF0dCBlcnPkdHRhIFwiPGFidWY+XCIgbWVkIgorCisjOiBleF9kb2NtZC5jOjgwODMKK21zZ2lkICJFNDk3OiBubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiRTQ5NzogaW5nZXQgYXV0b2tvbW1hbmRvLXRy5GZmbmFtbiBhdHQgYnl0YSB1dCBcIjxhbWF0Y2g+XCIgbWVkIgorCisjOiBleF9kb2NtZC5jOjgwOTMKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiRTQ5ODogaW5nZXQgOnNvdXJjZS1maWxuYW1uIGF0dCBieXRhIHV0IFwiPHNmaWxlPlwiIG1lZCIKKworIzogZXhfZG9jbWQuYzo4MTM0CisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiBUb210IGZpbG5hbW4gZvZyICclJyBvciAnIycsIGZ1bmdlcmFyIGJhcmEgbWVkIFwiOnA6aFwiIgorCisjOiBleF9kb2NtZC5jOjgxMzYKK21zZ2lkICJFNTAwOiBFdmFsdWF0ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTAwOiBFdmFsdWVyYXIgdGlsbCBlbiB0b20gc3Ry5G5nIgorCisjOiBleF9kb2NtZC5jOjkwNjcKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IEthbiBpbnRlIPZwcG5hIHZpbWluZm8tZmlsIGb2ciBs5HNuaW5nIgorCisjOiBleF9kb2NtZC5jOjkyNDAKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IEluZ2EgZGlncmFmZXIgaSBkZW4gaORyIHZlcnNpb25lbiIKKworIzogZXhfZXZhbC5jOjQyMworbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiRTYwODogS2FuIGludGUgOnRocm93IHVuZGFudGFnIG1lZCAnVmltJy1wcmVmaXgiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXhfZXZhbC5jOjUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFeGNlcHRpb24gdGhyb3duOiAlcyIKK21zZ3N0ciAiVW5kYW50YWcga2FzdGFkZTogJXMiCisKKyM6IGV4X2V2YWwuYzo1NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAiVW5kYW50YWcgZuRyZGlnYTogJXMiCisKKyM6IGV4X2V2YWwuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGRpc2NhcmRlZDogJXMiCittc2dzdHIgIlVuZGFudGFnIGb2cmthc3RhZGU6ICVzIgorCisjOiBleF9ldmFsLmM6NjAwIGV4X2V2YWwuYzo2NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMsIGxpbmUgJWxkIgorbXNnc3RyICIlcywgcmFkICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICJVbmRhbnRhZyBm5W5nYWRlOiAlcyIKKworIzogZXhfZXZhbC5jOjY5MworIywgYy1mb3JtYXQKK21zZ2lkICIlcyBtYWRlIHBlbmRpbmciCittc2dzdHIgIiVzIGdqb3JkZXMgYXZ2YWt0YW5kZSIKKworIzogZXhfZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXN1bWVkIgorbXNnc3RyICIlcyDldGVydXBwdGFnZW4iCisKKyM6IGV4X2V2YWwuYzo3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgZGlzY2FyZGVkIgorbXNnc3RyICIlcyBm9nJrYXN0YWQiCisKKyM6IGV4X2V2YWwuYzo3MjYKK21zZ2lkICJFeGNlcHRpb24iCittc2dzdHIgIlVuZGFudGFnIgorCisjOiBleF9ldmFsLmM6NzMyCittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiRmVsIG9jaCBhdmJyeXRldCIKKworIzogZXhfZXZhbC5jOjczNCBndWkuYzo0MjU5Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIkZlbCIKKworIy4gaWYgKHBlbmRpbmcgJiBDU1RQX0lOVEVSUlVQVCkKKyM6IGV4X2V2YWwuYzo3MzYKK21zZ2lkICJJbnRlcnJ1cHQiCittc2dzdHIgIkF2YnJ5dCIKKworIzogZXhfZXZhbC5jOjgxMAorbXNnaWQgIkU1Nzk6IDppZiBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFNTc5OiA6aWYgbuRzdGxhZCBm9nIgZGp1cHQiCisKKyM6IGV4X2V2YWwuYzo4NDcKK21zZ2lkICJFNTgwOiA6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODA6IDplbmRpZiB1dGFuIDppZiIKKworIzogZXhfZXZhbC5jOjg5MQorbXNnaWQgIkU1ODE6IDplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICJFNTgxOiA6ZWxzZSB1dGFuIDppZiIKKworIzogZXhfZXZhbC5jOjg5NAorbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYgdXRhbiA6aWYiCisKKyM6IGV4X2V2YWwuYzo5MDEKK21zZ2lkICJFNTgzOiBtdWx0aXBsZSA6ZWxzZSIKK21zZ3N0ciAiRTU4MzogZmxlcmEgOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo5MDQKK21zZ2lkICJFNTg0OiA6ZWxzZWlmIGFmdGVyIDplbHNlIgorbXNnc3RyICJFNTg0OiA6ZWxzZWlmIGVmdGVyIDplbHNlIgorCisjOiBleF9ldmFsLmM6OTcxCittc2dpZCAiRTU4NTogOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1ODU6IDp3aGlsZSBu5HN0bGFkIGb2ciBkanVwdCIKKworIzogZXhfZXZhbC5jOjEwMjcKK21zZ2lkICJFNTg2OiA6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODY6IDpjb250aW51ZSB1dGFuIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEwNjcKK21zZ2lkICJFNTg3OiA6YnJlYWsgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODc6IDpicmVhayB1dGFuIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEyNjYKK21zZ2lkICJFNjAxOiA6dHJ5IG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU2MDE6IDp0cnkgbuRzdGxhZCBm9nIgZGp1cHQiCisKKyM6IGV4X2V2YWwuYzoxMzQ2Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOmNhdGNoIHV0YW4gOnRyeSIKKworIy4gR2l2ZSB1cCBmb3IgYSAiOmNhdGNoIiBhZnRlciAiOmZpbmFsbHkiIGFuZCBpZ25vcmUgaXQuCisjLiAqIEp1c3QgcGFyc2UuCisjOiBleF9ldmFsLmM6MTM2OAorbXNnaWQgIkU2MDQ6IDpjYXRjaCBhZnRlciA6ZmluYWxseSIKK21zZ3N0ciAiRTYwNDogOmNhdGNoIGVmdGVyIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTUwMQorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgdXRhbiA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNTI1Cittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IGZsZXJhIDpmaW5hbGx5IgorCisjOiBleF9ldmFsLmM6MTYzNAorbXNnaWQgIkU2MDI6IDplbmR0cnkgd2l0aG91dCA6dHJ5IgorbXNnc3RyICJFNjAyOiA6ZW5kdHJ5IHV0YW4gOnRyeSIKKworIzogZXhfZXZhbC5jOjE5NjYKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiA6ZW5kZnVuY3Rpb24gaW50ZSBpbm9tIGVuIGZ1bmt0aW9uIgorCisjOiBleF9nZXRsbi5jOjMyMjkKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICJ0YWdnbmFtbiIKKworIzogZXhfZ2V0bG4uYzozMjMyCittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICIgc27kbGwgZmlsXG4iCisKKyM6IGV4X2dldGxuLmM6NDU5MQorbXNnaWQgIidoaXN0b3J5JyBvcHRpb24gaXMgemVybyIKK21zZ3N0ciAiJ2hpc3RvcnknLWZsYWdnYSDkciBub2xsIgorCisjOiBleF9nZXRsbi5jOjQ4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIEhpc3RvcmlhIChueWFzdGUgdGlsbCDkbGRzdGEpOlxuIgorCisjOiBleF9nZXRsbi5jOjQ4NTcKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgIktvbW1hbmRvcmFkIgorCisjOiBleF9nZXRsbi5jOjQ4NTgKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICJT9mtzdHLkbmciCisKKyM6IGV4X2dldGxuLmM6NDg1OQorbXNnaWQgIkV4cHJlc3Npb24iCittc2dzdHIgIlV0dHJ5Y2siCisKKyM6IGV4X2dldGxuLmM6NDg2MAorbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIklubWF0bmluZ3NyYWQiCisKKyM6IGV4X2dldGxuLmM6NDg5OAorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgYm9ydG9tIGtvbW1hbmRvbORuZ2RlbiIKKworIzogZXhfZ2V0bG4uYzo1MDc1Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogQWt0aXZ0IGb2bnN0ZXIgZWxsZXIgYnVmZmVydCBib3J0dGFnZW4iCisKKyM6IGZpbGVpby5jOjM2OQorbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICJPdGlsbOV0ZXQgZmlsbmFtbiIKKworIzogZmlsZWlvLmM6MzkzIGZpbGVpby5jOjUxOCBmaWxlaW8uYzoyNzMwIGZpbGVpby5jOjI3NzEKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAi5HIgZW4ga2F0YWxvZyIKKworIzogZmlsZWlvLmM6Mzk1Cittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAi5HIgaW50ZSBlbiBmaWwiCisKKyM6IGZpbGVpby5jOjU0MCBmaWxlaW8uYzozODkyCittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW055IGZpbF0iCisKKyM6IGZpbGVpby5jOjU3MworbXNnaWQgIltQZXJtaXNzaW9uIERlbmllZF0iCittc2dzdHIgIltUaWxs5XRlbHNlIG5la2FzXSIKKworIzogZmlsZWlvLmM6Njc3Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgYXV0b2tvbW1hbmRvbiBnam9yZGUgZmlsZW4gb2zkc2JhciIKKworIzogZmlsZWlvLmM6Njc5Cittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogKlJlYWRQcmUgYXV0b2tvbW1hbmRvbiBm5XIgaW50ZSDkbmRyYSBudXZhcmFuZGUgYnVmZmVydCIKKworIzogZmlsZWlvLmM6NzAwCittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiBM5HNlciBmcuVuIHN0YW5kYXJkIGluLi4uXG4iCisKKyM6IGZpbGVpby5jOjcwNgorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAiTORzZXIgZnLlbiBzdGFuZGFyZCBpbi4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo5NTEKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjogS29udmVydGVyaW5nIGdqb3JkZSBmaWxlbiBvbORzYmFyISIKKworIzogZmlsZWlvLmM6MTkxNworbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltmaWZvL3V0dGFnXSIKKworIzogZmlsZWlvLmM6MTkyNAorbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW2ZpZm9dIgorCisjOiBmaWxlaW8uYzoxOTMxCittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIlt1dHRhZ10iCisKKyM6IGZpbGVpby5jOjE5MzkKK21zZ2lkICJbUk9dIgorbXNnc3RyICJbRUxdIgorCisjOiBmaWxlaW8uYzoxOTQ5Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbQ1Igc2FrbmFzXSIKKworIzogZmlsZWlvLmM6MTk1NAorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIltOTCBoaXR0YXRdIgorCisjOiBmaWxlaW8uYzoxOTU5Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbbOVuZ2EgcmFkZXIgZGVsYWRlXSIKKworIzogZmlsZWlvLmM6MTk2NSBmaWxlaW8uYzozODc2Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbSU5URSBrb252ZXJ0ZXJhZF0iCisKKyM6IGZpbGVpby5jOjE5NzAgZmlsZWlvLmM6Mzg4MQorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJba29udmVydGVyYWRdIgorCisjOiBmaWxlaW8uYzoxOTc3IGZpbGVpby5jOjM5MDYKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIltrcnlwdGVyYWRdIgorCisjOiBmaWxlaW8uYzoxOTg0Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICJbS09OVkVSVEVSSU5HU0ZFTF0iCisKKyM6IGZpbGVpby5jOjE5OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIltPVElMTMVURU4gQklUIHDlIHJhZCAlbGRdIgorCisjOiBmaWxlaW8uYzoxOTk3Cittc2dpZCAiW1JFQUQgRVJST1JTXSIKK21zZ3N0ciAiW0zEU0ZFTF0iCisKKyM6IGZpbGVpby5jOjIyMTMKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAiS2FuIGludGUgaGl0dGEgdGVtcG9y5HIgZmlsIGb2ciBrb252ZXJ0ZXJpbmciCisKKyM6IGZpbGVpby5jOjIyMjAKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIktvbnZlcnRlcmluZyBtZWQgJ2NoYXJjb252ZXJ0JyBtaXNzbHlja2FkZXMiCisKKyM6IGZpbGVpby5jOjIyMjMKK21zZ2lkICJjYW4ndCByZWFkIG91dHB1dCBvZiAnY2hhcmNvbnZlcnQnIgorbXNnc3RyICJrYW4gaW50ZSBs5HNhIHV0ZGF0YSBhdiAnY2hhcmNvbnZlcnQnIgorCisjOiBmaWxlaW8uYzoyNjE3Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIiIKKyJFMjAzOiBBdXRva29tbWFuZG9uIHRvZyBib3J0IGVsbGVyIGxhZGRhZGUgdXIgYnVmZmVydCBzb20gc2t1bGxlIHNrcml2YXMiCisKKyM6IGZpbGVpby5jOjI2NDAKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2tvbW1hZG8g5G5kcmFkZSBhbnRhbCByYWRlciBw5SBldHQgb3bkbnRhdCBz5HR0IgorCisjOiBmaWxlaW8uYzoyNjc0Cittc2dpZCAiTmV0QmVhbnMgZGlzc2FsbG93cyB3cml0ZXMgb2YgdW5tb2RpZmllZCBidWZmZXJzIgorbXNnc3RyICJOZXRCZWFucyB0aWxs5XRlciBpbnRlIHNrcml2bmluZyBhdiBvbW9kaWZpZXJhZGUgYnVmZmVydGFyIgorCisjOiBmaWxlaW8uYzoyNjgyCittc2dpZCAiUGFydGlhbCB3cml0ZXMgZGlzYWxsb3dlZCBmb3IgTmV0QmVhbnMgYnVmZmVycyIKK21zZ3N0ciAiRGVsdmlzYSBza3Jpdm5pbmdhciB0aWxs5XRzIGludGUgaSBOZXRCZWFucy1idWZmZXJ0YXIiCisKKyM6IGZpbGVpby5jOjI3MzYgZmlsZWlvLmM6Mjc1NAorbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICLkciBpbnRlIGVuIGZpbCBlbGxlciBza3JpdmJhciBlbmhldCIKKworIzogZmlsZWlvLmM6MjgwNgorbXNnaWQgImlzIHJlYWQtb25seSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLkciBza3JpdnNreWRkYWQgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgdHZpbmdhKSIKKworIzogZmlsZWlvLmM6MzEyNAorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IEthbiBpbnRlIHNrcml2YSB0aWxsIHPka2VyaGV0c2tvcGlhIChs5GdnIHRpbGwgISBm9nIgYXR0IHR2aW5nYSkiCisKKyM6IGZpbGVpby5jOjMxMzYKK21zZ2lkICJFNTA3OiBDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNzogU3TkbmduaW5nc2ZlbCBm9nIgc+RrZXJoZXRza29waWEgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgdHZpbmdhKSIKKworIzogZmlsZWlvLmM6MzEzOAorbXNnaWQgIkU1MDg6IENhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIiIKKyJFNTA4OiBLYW4gaW50ZSBs5HNhIGZpbCBm9nIgc+RrZXJoZXRza29waWEgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgdHZpbmdhKSIKKworIzogZmlsZWlvLmM6MzE1NAorbXNnaWQgIkU1MDk6IENhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwOTogS2FuIGludGUgc2thcGEgc+RrZXJoZXRza29waWEgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgdHZpbmdhKSIKKworIzogZmlsZWlvLmM6MzI1NworbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDogS2FuIGludGUgZ/ZyYSBz5GtlcmhldHNrb3BpYSAobORnZyB0aWxsICEgZvZyIGF0dCB0dmluZ2EpIgorCisjOiBmaWxlaW8uYzozMzE5Cittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiBSZXN1cnNncmVuZW4gc2t1bGxlIHRhcHBhcyBib3J0IChs5GdnIHRpbGwgISBm9nIgYXR0IHR2aW5nYSkiCisKKyM6IGZpbGVpby5jOjM0MjAKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogS2FuIGludGUgaGl0dGEgdGVtcG9y5HIgZmlsIGb2ciBza3Jpdm5pbmciCisKKyM6IGZpbGVpby5jOjM0MzgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiIgorIkUyMTM6IEthbiBpbnRlIGtvbnZlcnRlcmEgKGzkZ2cgdGlsbCAhIGb2ciBhdHQgc2tyaXZhIHV0YW4ga29udmVydGVyaW5nKSIKKworIzogZmlsZWlvLmM6MzQ3MworbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6IEthbiBpbnRlIPZwcG5hIGzkbmthZCBmaWwgZvZyIHNrcml2bmluZyIKKworIzogZmlsZWlvLmM6MzQ3NworbXNnaWQgIkUyMTI6IENhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxMjogS2FuIGludGUg9nBwbmEgZmlsIGb2ciBza3Jpdm5pbmciCisKKyM6IGZpbGVpby5jOjM3MjcKK21zZ2lkICJFNTEyOiBDbG9zZSBmYWlsZWQiCittc2dzdHIgIkU1MTI6IFN05G5nbmluZyBtaXNzbHlja2FkZXMiCisKKyM6IGZpbGVpby5jOjM3OTgKK21zZ2lkICJFNTEzOiB3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIkU1MTM6IHNrcml2ZmVsLCBrb252ZXJ0ZXJpbmcgbWlzc2x5Y2thZGVzIgorCisjOiBmaWxlaW8uYzozODA0Cittc2dpZCAiRTUxNDogd3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIKK21zZ3N0ciAiRTUxNDogc2tyaXZmZWwgKGZpbHN5c3RlbSBmdWxsdD8pIgorCisjOiBmaWxlaW8uYzozODcxCittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIiBLT05WRVJURVJJTkdTRkVMIgorCisjOiBmaWxlaW8uYzozODg3Cittc2dpZCAiW0RldmljZV0iCittc2dzdHIgIltFbmhldF0iCisKKyM6IGZpbGVpby5jOjM4OTIKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW055XSIKKworIzogZmlsZWlvLmM6MzkxNAorbXNnaWQgIiBbYV0iCittc2dzdHIgIiBbbF0iCisKKyM6IGZpbGVpby5jOjM5MTQKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiBsYWRlIHRpbGwiCisKKyM6IGZpbGVpby5jOjM5MTYKK21zZ2lkICIgW3ddIgorbXNnc3RyICIgW3NdIgorCisjOiBmaWxlaW8uYzozOTE2Cittc2dpZCAiIHdyaXR0ZW4iCittc2dzdHIgIiBza3JpdmVuIgorCisjOiBmaWxlaW8uYzozOTY2Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IFBhdGNobORnZToga2FuIGludGUgc3BhcmEgb3JnaW5hbGZpbCIKKworIzogZmlsZWlvLmM6Mzk4OAorbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogcGF0Y2hs5GdlOiBrYW4gaW50ZSBza2FwYSB0b20gb3JnaW5hbGZpbCIKKworIzogZmlsZWlvLmM6NDAwMworbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogS2FuIGludGUgdGEgYm9ydCBz5GtlcmhldHNrb3BpYSIKKworIzogZmlsZWlvLmM6NDA2NworbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZBUk5JTkc6IE9yZ2luYWxmaWxlbiBrYW4gdmFyYSBm9nJsb3JhZCBlbGxlciBza2FkYWRcbiIKKworIzogZmlsZWlvLmM6NDA2OQorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgImF2c2x1dGEgaW50ZSByZWRpZ2VyYXJlbiBpbm5hbiBmaWxlbiDkciBmcmFtZ+VuZ3NyaWt0IHNrcml2ZW4iCisKKyM6IGZpbGVpby5jOjQxNTgKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjQxNTgKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MtZm9ybWF0XSIKKworIzogZmlsZWlvLmM6NDE2NQorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6NDE2NQorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYy1mb3JtYXRdIgorCisjOiBmaWxlaW8uYzo0MTcyCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjQxNzIKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peC1mb3JtYXRdIgorCisjOiBmaWxlaW8uYzo0MTk5Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgcmFkLCAiCisKKyM6IGZpbGVpby5jOjQyMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCByYWRlciwgIgorCisjOiBmaWxlaW8uYzo0MjA0Cittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgIjEgdGVja2VuIgorCisjOiBmaWxlaW8uYzo0MjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQgdGVja2VuIgorCisjOiBmaWxlaW8uYzo0MjE2Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW2luZ2V0IHJhZHNsdXRdIgorCisjOiBmaWxlaW8uYzo0MjE2Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW09mdWxsc3TkbmRpZyBzaXN0YXJhZF0iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDIzNQorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAiVkFSTklORzogRmlsZW4gaGFyIORuZHJhdHMgc2VkYW4gZGVuIGzkc3RlcyBpbiEhISIKKworIzogZmlsZWlvLmM6NDIzNworbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAiVmlsbCBkdSB2ZXJrbGlnZW4gc2tyaXZhIHRpbGwgZGVuIgorCisjOiBmaWxlaW8uYzo1MzEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiBGZWwgdmlkIHNrcml2bmluZyB0aWxsIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTogRmVsIHZpZCBzdORuZ25pbmcgYXYgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1MzIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiBGZWwgdmlkIGzkc25pbmcgYXYgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NTQzCittc2dpZCAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbC1hdXRva29tbWFuZG90IHRvZyBib3J0IGJ1ZmZlcnQiCisKKyM6IGZpbGVpby5jOjU1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogVmFybmluZzogRmlsZW4gXCIlc1wiIORyIGludGUgbORuZ3JlIHRpbGxn5G5nbGlnIgorCisjOiBmaWxlaW8uYzo1NTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiIgorIlcxMjogVmFybmluZzogRmlsZW4gXCIlc1wiIGhhciDkbmRyYXRzIG9jaCBidWZmZXJ0ZW4g5G5kcmFkZXMgaSBWaW0gb2Nrc+UiCisKKyM6IGZpbGVpby5jOjU1NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMTogVmFybmluZzogRmlsZW4gXCIlc1wiIGhhciDkbmRyYXRzIHNlZGFuIHJlZGlnZXJpbmdlbiBi9nJqYWRlIgorCisjOiBmaWxlaW8uYzo1NTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIiIKKyJXMTY6IFZhcm5pbmc6IFLkdHRpZ2hldGVybmEgcOUgZmlsZW4gXCIlc1wiIGhhciDkbmRyYXRzIHNlZGFuIHJlZGlnZXJpbmdlbiAiCisiYvZyamFkZSIKKworIzogZmlsZWlvLmM6NTU3OQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IFZhcm5pbmc6IEZpbGVuIFwiJXNcIiBoYXIgc2thcGF0cyBlZnRlciByZWRpZ2VyaW5nZW4gYvZyamFkZSIKKworIzogZmlsZWlvLmM6NTU5NgorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIlZhcm5pbmciCisKKyM6IGZpbGVpby5jOjU1OTcKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIiZPS1xuIgorIiZM5HMgaW4gZmlsZW4iCisKKyM6IGZpbGVpby5jOjU2OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2MjogQ291bGQgbm90IHByZXBhcmUgZm9yIHJlbG9hZGluZyBcIiVzXCIiCittc2dzdHIgIkU0NjI6IEt1bmRlIGludGUgZvZyYmVyZWRhIGb2ciBhdHQgbORzYSBvbSBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU3MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IEt1bmRlIGludGUgbORzYSBvbSBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjYyOTYKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS1Cb3J0dGFnZW4tLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjY0NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiBJbmdlbiBz5WRhbiBncnVwcDogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2NTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiBPdGlsbOV0ZXQgdGVja2VuIGVmdGVyICo6ICVzIgorCisjOiBmaWxlaW8uYzo2NTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiBJbmdlbiBz5WRhbiBo5G5kZWxzZTogJXMiCisKKyM6IGZpbGVpby5jOjY1OTYKK21zZ2lkICJFMjE2OiBObyBzdWNoIGdyb3VwIG9yIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogSW5nZW4gc+VkYW4gZ3J1cHAgZWxsZXIgaORuZGVsc2U6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjY3NDUKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG9rb21tYW5kb24gLS0tIgorCisjOiBmaWxlaW8uYzo3MDE2Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IEthbiBpbnRlIGv2cmEgYXV0b2tvbW1hbmRvbiBm9nIgQUxMQSBo5G5kZWxzZXIiCisKKyM6IGZpbGVpby5jOjcwMzkKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIkluZ2EgbWF0Y2hhbmRlIGF1dG9rb21tYW5kb24iCisKKyM6IGZpbGVpby5jOjczNTkKK21zZ2lkICJFMjE4OiBhdXRvY29tbWFuZCBuZXN0aW5nIHRvbyBkZWVwIgorbXNnc3RyICJFMjE4OiBhdXRva29tbWFuZG8gbuRzdGxhZCBm9nIgZGp1cHQiCisKKyM6IGZpbGVpby5jOjc2MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBBdXRva29tbWFuZG9uIGb2ciBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjc2MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICJL9nIgJXMiCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZmlsZWlvLmM6NzcwMworIywgYy1mb3JtYXQKK21zZ2lkICJhdXRvY29tbWFuZCAlcyIKK21zZ3N0ciAiYXV0b2tvbW1hbmRvICVzIgorCisjOiBmaWxlaW8uYzo4MjcwCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogU2FrbmFyIHsuIgorCisjOiBmaWxlaW8uYzo4MjcyCittc2dpZCAiRTIyMDogTWlzc2luZyB9LiIKK21zZ3N0ciAiRTIyMDogU2FrbmFyIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJFNDkwOiBObyBmb2xkIGZvdW5kIgorbXNnc3RyICJFNDkwOiBJbmdldCB2ZWNrIGZ1bm5ldCIKKworIzogZm9sZC5jOjU2NQorbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiBLYW4gaW50ZSBza2FwYSB2ZWNrIG1lZCBudXZhcmFuZGUgJ2ZvbGRtZXRob2QnIgorCisjOiBmb2xkLmM6NTY3Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IEthbiBpbnRlIHRhIGJvcnQgdmVjayBtZWQgbnV2YXJhbmRlICdmb2xkbWV0aG9kJyIKKworIzogZ2V0Y2hhci5jOjI0NgorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjogTORnZyB0aWxsIGkgbORzYnVmZmVydCIKKworIzogZ2V0Y2hhci5jOjIxNTcKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogcmVrdXJzaXYgbWFwcG5pbmciCisKKyM6IGdldGNoYXIuYzozMDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI0OiBnbG9iYWwgZvZya29ydG5pbmcgZXhpc3RlcmFyIHJlZGFuIGb2ciAlcyIKKworIzogZ2V0Y2hhci5jOjMwMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNTogZ2xvYmFsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI1OiBnbG9iYWwgbWFwcG5pbmcgZXhpc3RlcmFyIHJlZGFuIGb2ciAlcyIKKworIzogZ2V0Y2hhci5jOjMxNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogZvZya29ydG5pbmcgZXhpc3RlcmFyIHJlZGFuIGb2ciAlcyIKKworIzogZ2V0Y2hhci5jOjMxNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6IG1hcHBuaW5nIGV4aXN0ZXJhciByZWRhbiBm9nIgJXMiCisKKyM6IGdldGNoYXIuYzozMjIwCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICJJbmdlbiBm9nJrb3J0bmluZyBoaXR0YWRlcyIKKworIzogZ2V0Y2hhci5jOjMyMjIKK21zZ2lkICJObyBtYXBwaW5nIGZvdW5kIgorbXNnc3RyICJJbmdlbiBtYXBwbmluZyBoaXR0YWRlcyIKKworIzogZ2V0Y2hhci5jOjQxMTIKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IE90aWxs5XRldCBs5GdlIgorCisjOiBndWlfYXRfZnMuYzozMDAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPGthbiBpbnRlIPZwcG5hPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxNjogdmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJFNjE2OiB2aW1fU2VsRmlsZToga2FuIGludGUgaORtdGEgdHlwc25pdHQgJXMiCisKKyM6IGd1aV9hdF9mcy5jOjI3ODEKK21zZ2lkICJFNjE0OiB2aW1fU2VsRmlsZTogY2FuJ3QgcmV0dXJuIHRvIGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJFNjE0OiB2aW1fU2VsRmlsZTogS2FuIGludGUg5XRlcnbkbmRhIHRpbGwgYWt0dWVsbCBrYXRhbG9nIgorCisjOiBndWlfYXRfZnMuYzoyODAxCittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICJT9mt25Gc6IgorCisjOiBndWlfYXRfZnMuYzoyODA3Cittc2dpZCAiRTYxNTogdmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNTogdmltX1NlbEZpbGU6IGthbiBpbnRlIGjkbXRhIGFrdHVlbGwga2F0YWxvZyIKKworIzogZ3VpX2F0X2ZzLmM6MjgxNSBndWlfbW90aWYuYzoxNjIzCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCisjOiBndWlfYXRfZnMuYzoyODE1IGd1aV9ndGsuYzoyNjM4IGd1aV9tb3RpZi5jOjE2MTggZ3VpX21vdGlmLmM6Mjg0OQorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQXZicnl0IgorCisjOiBndWlfYXRoZW5hLmM6MjA0NyBndWlfbW90aWYuYzoxODcxCittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltLWRpYWxvZyIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICJSdWxsbmluZ3NsaXN0OiBLdW5kZSBpbnRlIGjkbXRhIGdlb21ldHJpbiBw5SBtaW5pYXR5cmJpbGQuIgorCisjOiBndWlfYmV2YWwuYzoxMDEgZ3VpX3czMi5jOjM3NzIKK21zZ2lkICJFMjMyOiBDYW5ub3QgY3JlYXRlIEJhbGxvb25FdmFsIHdpdGggYm90aCBtZXNzYWdlIGFuZCBjYWxsYmFjayIKK21zZ3N0ciAiRTIzMjogS2FuIGludGUgc2thcGEgQmFsbG9vbkV2YWwgbWVkIGLlZGUgbWVkZGVsYW5kZSBvY2gg5XRlcmthbGxuaW5nIgorCisjOiBndWkuYzoyMTkKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogS2FuIGludGUgc3RhcnRhIEdVSSIKKworIzogZ3VpLmM6MzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiBLYW4gaW50ZSBs5HNhIGZy5W4gXCIlc1wiIgorCisjOiBndWkuYzo0NzMKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ICdndWlmb250d2lkZScgb2dpbHRpZyIKKworIzogZ3VpLmM6NTQzCittc2dpZCAiRTU5OTogVmFsdWUgb2YgJ2ltYWN0aXZhdGVrZXknIGlzIGludmFsaWQiCittc2dzdHIgIkU1OTk6IFbkcmRldCBhdiAnaW1hY3RpdmF0ZWtleScg5HIgb2dpbHRpZ3QiCisKKyM6IGd1aS5jOjM5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiBLYW4gaW50ZSBhbGxva2VyYSBm5HJnICVzIgorCisjOiBndWlfZ3RrLmM6MTU2NworbXNnaWQgIlZpbSBkaWFsb2cuLi4iCittc2dzdHIgIlZpbS1kaWFsb2cuLi4iCisKKyM6IGd1aV9ndGsuYzoyMDAyIG1lc3NhZ2UuYzoyODg2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkphXG4iCisiJk5lalxuIgorIiZBdmJyeXQiCisKKyM6IGd1aV9ndGsuYzoyMTY1Cittc2dpZCAiSW5wdXQgX01ldGhvZHMiCittc2dzdHIgIklubWF0bmluZ3NfbWV0b2RlciIKKworIzogZ3VpX2d0ay5jOjI0MzEgZ3VpX21vdGlmLmM6Mjc2OAorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gU/ZrIG9jaCBlcnPkdHQuLi4iCisKKyM6IGd1aV9ndGsuYzoyNDM5IGd1aV9tb3RpZi5jOjI3NzAKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIFP2ay4uLiIKKworIzogZ3VpX2d0ay5jOjI0NzEgZ3VpX21vdGlmLmM6Mjg4OAorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIkhpdHRhIHZhZDoiCisKKyM6IGd1aV9ndGsuYzoyNDkxIGd1aV9tb3RpZi5jOjI5MjAKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICJFcnPkdHQgbWVkOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI1MjMgZ3VpX21vdGlmLmM6MzAzNgorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAiTWF0Y2hhIGVuZGFzdCBoZWxhIG9yZCIKKworIy4gbWF0Y2ggY2FzZSBidXR0b24KKyM6IGd1aV9ndGsuYzoyNTM2IGd1aV9tb3RpZi5jOjMwNDgKK21zZ2lkICJNYXRjaCBjYXNlIgorbXNnc3RyICJTa2lsaiBw5SBzdG9yYS9zbeUgYm9rc3TkdmVyIgorCisjOiBndWlfZ3RrLmM6MjU0OCBndWlfbW90aWYuYzoyOTkwCittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICJSaWt0bmluZyIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoyNTYwIGd1aV9tb3RpZi5jOjMwMDIKK21zZ2lkICJVcCIKK21zZ3N0ciAiVXBwIgorCisjOiBndWlfZ3RrLmM6MjU2NCBndWlfbW90aWYuYzozMDEwCittc2dpZCAiRG93biIKK21zZ3N0ciAiTmVkIgorCisjOiBndWlfZ3RrLmM6MjU5MCBndWlfZ3RrLmM6MjU5MiBndWlfbW90aWYuYzoyNzkyCittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICJIaXR0YSBu5HN0YSIKKworIzogZ3VpX2d0ay5jOjI2MDkgZ3VpX2d0ay5jOjI2MTEgZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIkVyc+R0dCIKKworIzogZ3VpX2d0ay5jOjI2MjIgZ3VpX2d0ay5jOjI2MjQgZ3VpX21vdGlmLmM6MjgyMgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICJFcnPkdHQgYWxsYSIKKworIzogZ3VpX2d0a194MTEuYzoyMjQ4Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiBUb2cgZW1vdCBcImRpZVwiLWJlZ+RyYW4gZnLlbiBzZXNzaW9uc2hhbnRlcmFyZW5cbiIKKworIzogZ3VpX2d0a194MTEuYzozNDM3Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIlZpbTogSHV2dWRm9m5zdGVyIG925G50YXQgZvZyc3T2cnRcbiIKKworIzogZ3VpX2d0a194MTEuYzo0MDUxCittc2dpZCAiRm9udCBTZWxlY3Rpb24iCittc2dzdHIgIlR5cHNuaXR0c3ZhbCIKKworIzogZ3VpX2d0a194MTEuYzo1OTA3IHVpLmM6MjAxNgorbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIkFuduRuZCBDVVRfQlVGRkVSMCBpc3TkbGxldCBm9nIgdG9tdCB2YWwiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcgZ3VpX21vdGlmLmM6MTYyMAorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiRmlsdGVyIgorCisjOiBndWlfbW90aWYuYzoxNjE5Cittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIkthdGFsb2dlciIKKworIzogZ3VpX21vdGlmLmM6MTYyMQorbXNnaWQgIkhlbHAiCittc2dzdHIgIkhq5GxwIgorCisjOiBndWlfbW90aWYuYzoxNjIyCittc2dpZCAiRmlsZXMiCittc2dzdHIgIkZpbGVyIgorCisjOiBndWlfbW90aWYuYzoxNjI0Cittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICJWYWwiCisKKyM6IGd1aV9tb3RpZi5jOjI4MzUKK21zZ2lkICJVbmRvIgorbXNnc3RyICLFbmdyYSIKKworIzogZ3VpX3Jpc2Nvcy5jOjk1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEwOiBDYW4ndCBsb2FkIFphcCBmb250ICclcyciCittc2dzdHIgIkU2MTA6IEthbiBpbnRlIGzkc2EgaW4gWmFwLXR5cHNuaXR0ICclcyciCisKKyM6IGd1aV9yaXNjb3MuYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTE6IENhbid0IHVzZSBmb250ICVzIgorbXNnc3RyICJFNjExOiBLYW4gaW50ZSBhbnbkbmRhIHR5cHNuaXR0ICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI3MAorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJTa2lja2FyIG1lZGRlbGFuZGUgZvZyIGF0dCBhdnNsdXRhIGJhcm5wcm9jZXNzLlxuIgorCisjOiBndWlfdzMyLmM6ODAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiBBcmd1bWVudCBzdPZkcyBpbnRlOiBcIi0lc1wiOyBBbnbkbmRzIE9MRS12ZXJzaW9uZW4uIgorCisjOiBndWlfdzQ4LmM6MjA3OQorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlP2ayBzdHLkbmcgKGFuduRuZCAnXFxcXCcgZvZyIGF0dCBoaXR0YSAnXFwnKSIKKworIzogZ3VpX3c0OC5jOjIxMDQKK21zZ2lkICJGaW5kICYgUmVwbGFjZSAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICJT9msgJiBlcnPkdHQgKGFuduRuZCAnXFxcXCcgZvZyIGF0dCBoaXR0YSAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE1MjMKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICIiCisiVmltIEU0NTg6IEthbiBpbnRlIGFsbG9rZXJhIHBvc3QgaSBm5HJna2FydGEsIG7lZ3JhIGbkcmdlciBrYW4gYmxpIGZlbGFrdGlnYSIKKworIzogZ3VpX3gxMS5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIiIKKyJFMjUwOiBUeXBzbml0dCBm9nIgZvZsamFuZGUgdGVja2Vua29kZXIgc2FrbmFzIGkgdHlwc25pdHRzdXBwc+R0dG5pbmdlbiAlczoiCisKKyM6IGd1aV94MTEuYzoyMTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IFR5cHNuaXR0c3VwcHPkdHRuaW5nc25hbW46ICVzIgorCisjOiBndWlfeDExLmM6MjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJGb250ICclcycg5HIgaW50ZSBmYXN0IGJyZWRkIgorCisjOiBndWlfeDExLmM6MjE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IFR5cHNuaXR0c3VwcHPkdHRuaW5nc25hbW46ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJUeXBzbml0dDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJUeXBzbml0dDE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICJUeXBzbml0dCVkIORyIGludGUgZHViYmVsdCBz5SBicmVkIHNvbSBmb250MFxuIgorCisjOiBndWlfeDExLmM6MjE3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIlR5cHNuaXR0MCBicmVkZDogJWxkXG4iCisKKyM6IGd1aV94MTEuYzoyMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb250MSB3aWR0aDogJWxkXG4iCisiXG4iCittc2dzdHIgIiIKKyJUeXBzbml0dDEgYnJlZGQ6ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEZFTCIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIkzkZ2cgdGlsbCBlbiBueSBkYXRhYmFzIgorCisjOiBpZl9jc2NvcGUuYzo3OQorbXNnaWQgIlF1ZXJ5IGZvciBhIHBhdHRlcm4iCittc2dzdHIgIkZy5WdhIGVmdGVyIGV0dCBt9m5zdGVyIgorCisjOiBpZl9jc2NvcGUuYzo4MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICJWaXNhIGRldHRhIG1lZGRlbGFuZGUiCisKKyM6IGlmX2NzY29wZS5jOjgzCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIkT2ZGEgZW4gYW5zbHV0bmluZyIKKworIzogaWZfY3Njb3BlLmM6ODUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICJPbWluaXRpZXJhIGFsbGEgYW5zbHV0bmluZ2FyIgorCisjOiBpZl9jc2NvcGUuYzo4NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIlZpc2EgYW5zbHV0bmluZ2FyIgorCisjOiBpZl9jc2NvcGUuYzo5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYwOiBVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIkU1NjA6IEFuduRuZG5pbmc6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMjQKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIkRldCBo5HIgc2NvcGUta29tbWFuZG90IHN09mRlciBpbnRlIGRlbG5pbmcgYXYgZvZuc3RyZXQuXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MAorbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiBBbnbkbmRuaW5nOiBjc3RhZyA8aWRlbnRpZmllcmFyZT4iCisKKyM6IGlmX2NzY29wZS5jOjIyNgorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzogdGFnZyBoaXR0YWRlcyBpbnRlIgorCisjOiBpZl9jc2NvcGUuYzo0MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBzdGF0KCVzKS1mZWw6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0MTQKK21zZ2lkICJFNTYzOiBzdGF0IGVycm9yIgorbXNnc3RyICJFNTYzOiBzdGF0LWZlbCIKKworIzogaWZfY3Njb3BlLmM6NTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMg5HIgaW50ZSBlbiBrYXRhbG9nIGVsbGVyIGVuIGdvZGvkbmQgY3Njb3BlLWRhdGFiYXMiCisKKyM6IGlmX2NzY29wZS5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIkxhZGUgdGlsbCBjc2NvcGUtZGF0YWJhcyAlcyIKKworIzogaWZfY3Njb3BlLmM6NTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWxkIgorbXNnc3RyICJFMjYyOiBmZWwgdmlkIGzkc25pbmcgYXYgY3Njb3BlLWFuc2x1dG5pbmcgJWxkIgorCisjOiBpZl9jc2NvcGUuYzo2ODkKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogb2vkbmQgY3Njb3BlLXP2a3R5cCIKKworIzogaWZfY3Njb3BlLmM6NzMxCittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IEt1bmRlIGludGUgc2thcGEgY3Njb3BlLXL2ciIKKworIzogaWZfY3Njb3BlLmM6NzQ4Cittc2dpZCAiRTYyMjogQ291bGQgbm90IGZvcmsgZm9yIGNzY29wZSIKK21zZ3N0ciAiRTYyMjogS3VuZGUgaW50ZSBncmVuYSBm9nIgY3Njb3BlIgorCisjOiBpZl9jc2NvcGUuYzo4NDIgaWZfY3Njb3BlLmM6ODkyCittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uLWV4ZWt2ZXJpbmcgbWlzc2x5Y2thZGVzIgorCisjOiBpZl9jc2NvcGUuYzo4OTMKK21zZ2lkICJFNjIzOiBDb3VsZCBub3Qgc3Bhd24gY3Njb3BlIHByb2Nlc3MiCittc2dzdHIgIkU2MjM6IEt1bmRlIGludGUgc3RhcnRhIGNzY29wZS1wcm9jZXNzIgorCisjOiBpZl9jc2NvcGUuYzo5MDYKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZvZyIHRvX2ZwIG1pc3NseWNrYWRlcyIKKworIzogaWZfY3Njb3BlLmM6OTA4Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGb2ciBmcl9mcCBtaXNzbHlja2FkZXMiCisKKyM6IGlmX2NzY29wZS5jOjk0NgorbXNnaWQgIkU1Njc6IG5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiRTU2NzogaW5nYSBjc2NvcGUtYW5zbHV0bmluZ2FyIgorCisjOiBpZl9jc2NvcGUuYzoxMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTogaW5nYSB0cuRmZmFyIGZ1bm5hIGb2ciBjc2NvcGUtZvZyZnLlZ2FuICVzIGF2ICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Njk6IGludmFsaWQgY3Njb3BlcXVpY2tmaXggZmxhZyAlYyBmb3IgJWMiCittc2dzdHIgIkU0Njk6IG9naWx0aWcgY3Njb3BlcXVpY2tmaXggZmxhZ2dhICVjIGb2ciAlYyIKKworIzogaWZfY3Njb3BlLmM6MTE0NgorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY3Njb3BlLWtvbW1hbmRvbjpcbiIKKworIzogaWZfY3Njb3BlLmM6MTE0OQorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKSIKK21zZ3N0ciAiJS01czogJS0zMHMgKEFuduRuZG5pbmc6ICVzKSIKKworIzogaWZfY3Njb3BlLmM6MTI0NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjI1OiBjYW5ub3Qgb3BlbiBjc2NvcGUgZGF0YWJhc2U6ICVzIgorbXNnc3RyICJFNjI1OiBrYW4gaW50ZSD2cHBuYSBjc2NvcGUtZGF0YWJhczogJXMiCisKKyM6IGlmX2NzY29wZS5jOjEyNjUKK21zZ2lkICJFNjI2OiBjYW5ub3QgZ2V0IGNzY29wZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiRTYyNjoga2FuIGludGUgaORtdGEgY3Njb3BlLWRhdGFiYXNpbmZvcm1hdGlvbiIKKworIzogaWZfY3Njb3BlLmM6MTI5MAorbXNnaWQgIkU1Njg6IGR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJFNTY4OiBkdWJibGVyYWQgY3Njb3BlLWRhdGFiYXMgaW50ZSBsYWdkIHRpbGwiCisKKyM6IGlmX2NzY29wZS5jOjEzMDEKK21zZ2lkICJFNTY5OiBtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAiRTU2OTogbWF4aW1hbHQgYW50YWwgYXYgY3Njb3BlLWFuc2x1dG5pbmdhciBu5XR0IgorCisjOiBpZl9jc2NvcGUuYzoxNDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjE6IGNzY29wZSBjb25uZWN0aW9uICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI2MTogY3Njb3BlLWFuc2x1dG5pbmcgJXMgaGl0dGFkZXMgaW50ZSIKKworIzogaWZfY3Njb3BlLmM6MTQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiAlcyBjbG9zZWQiCittc2dzdHIgImNzY29wZS1hbnNsdXRuaW5nICVzIHN05G5nZCIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxNTkxCittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IPZkZXNkaWdlcnQgZmVsIGkgY3NfbWFuYWdlX21hdGNoZXMiCisKKyM6IGlmX2NzY29wZS5jOjE4NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXMiCittc2dzdHIgIkNzY29wZS10YWdnOiAlcyIKKworIzogaWZfY3Njb3BlLmM6MTg2MworbXNnaWQgIiIKKyJcbiIKKyIgICAjICAgbGluZSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICMgICByYWQiCisKKyM6IGlmX2NzY29wZS5jOjE4NjUKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgImZpbG5hbW4gLyBzYW1tYW5oYW5nIC8gcmFkXG4iCisKKyM6IGlmX2NzY29wZS5jOjE5NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOTogQ3Njb3BlIGVycm9yOiAlcyIKK21zZ3N0ciAiRTYwOTogQ3Njb3BlLWZlbDogJXMiCisKKyM6IGlmX2NzY29wZS5jOjIxNDMKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAiQWxsYSBjc2NvcGUtZGF0YWJhc2VyIOV0ZXJzdORsbGRhIgorCisjOiBpZl9jc2NvcGUuYzoyMjExCittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgImluZ2EgY3Njb3BlLWFuc2x1dG5pbmdhclxuIgorCisjOiBpZl9jc2NvcGUuYzoyMjE1Cittc2dpZCAiICMgcGlkICAgIGRhdGFiYXNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorbXNnc3RyICIgIyBwaWQgICAgZGF0YWJhc25hbW4gICAgICAgICAgICAgICAgICAgICAgICBm9nJzdCBpIHP2a3bkZ1xuIgorCisjOiBpZl9weXRob24uYzo0MTMKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IFR5duRyciwgZGV0dGEga29tbWFuZG90IORyIGluYWt0aXZlcmF0LCBQeXRob24tYmlibGlvdGVrZXQga3VuZGUgaW50ZSAiCisibORzYXMgaW4uIgorCisjOiBpZl9weXRob24uYzo2MTUKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgImthbiBpbnRlIHRhIGJvcnQgT3V0cHV0T2JqZWN0LWF0dHJpYnV0IgorCisjOiBpZl9weXRob24uYzo2MjIKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgbeVzdGUgdmFyYSBldHQgaGVsdGFsIgorCisjOiBpZl9weXRob24uYzo2MzAKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAib2dpbHRpZ3QgYXR0cmlidXQiCisKKyM6IGlmX3B5dGhvbi5jOjY2OSBpZl9weXRob24uYzo2ODMKK21zZ2lkICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgbGlzdCBvZiBzdHJpbmdzIgorbXNnc3RyICJ3cml0ZWxpbmVzKCkga3LkdmVyIGxpc3RhIGF2IHN0cuRuZ2FyIgorCisjOiBpZl9weXRob24uYzo4MDkKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiBGZWwgdmlkIGluaXRpZXJpbmcgYXYgSS9PLW9iamVrdCIKKworIzogaWZfcHl0aG9uLmM6OTk0IGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIm9naWx0aWd0IHV0dHJ5Y2siCisKKyM6IGlmX3B5dGhvbi5jOjEwMDggaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAidXR0cnljayBpbmFrdGl2ZXJhdCB2aWQga29tcGlsZXJpbmciCisKKyM6IGlmX3B5dGhvbi5jOjEwMjEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJm9nJz9msgYXR0IHJlZmVyZXJhIHRpbGwgYm9ydHRhZ2VuIGJ1ZmZlcnQiCisKKyM6IGlmX3B5dGhvbi5jOjEwMzYgaWZfcHl0aG9uLmM6MTA3NyBpZl9weXRob24uYzoxMTQxIGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgInJhZG51bW1lciB1dGFuZvZyIG9tcuVkZSIKKworIzogaWZfcHl0aG9uLmM6MTI3NgorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXJ0b2JqZWt0IChib3J0dGFnZXQpIHZpZCAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM2NyBpZl90Y2wuYzo4MzYKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAib2dpbHRpZ3QgbeRya25hbW4iCisKKyM6IGlmX3B5dGhvbi5jOjE2NDcKK21zZ2lkICJubyBzdWNoIGJ1ZmZlciIKK21zZ3N0ciAiaW5nZW4gc+VkYW4gYnVmZmVydCIKKworIzogaWZfcHl0aG9uLmM6MTczNQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgImb2cnP2ayBhdHQgcmVmZXJlcmEgdGlsbCBib3J0dGFnZXQgZvZuc3RlciIKKworIzogaWZfcHl0aG9uLmM6MTc4MAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAic2tyaXZza3lkZGFkIGF0dHJpYnV0IgorCisjOiBpZl9weXRob24uYzoxNzkzCittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICJtYXJr9nJwb3NpdGlvbiB1dGFuZvZyIGJ1ZmZlcnQiCisKKyM6IGlmX3B5dGhvbi5jOjE4NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPGb2bnN0ZXJvYmpla3QgKGJvcnR0YWdldCkgdmlkICUuOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTg4MgorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAodW5rbm93bikgYXQgJS44bFg+IgorbXNnc3RyICI8ZvZuc3Rlcm9iamVrdCAob2vkbnQpIHZpZCAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjxm9m5zdGVyICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTk2MAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICJpbmdldCBz5WRhbnQgZvZuc3RlciIKKworIzogaWZfcHl0aG9uLmM6MjIyMSBpZl9weXRob24uYzoyMjU1IGlmX3B5dGhvbi5jOjIzMTAgaWZfcHl0aG9uLmM6MjM3OAorIzogaWZfcHl0aG9uLmM6MjUwMCBpZl9weXRob24uYzoyNTUyIGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OAorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgImthbiBpbnRlIHNwYXJhIOVuZ3JhLWluZm9ybWF0aW9uIgorCisjOiBpZl9weXRob24uYzoyMjIzIGlmX3B5dGhvbi5jOjIzMTcgaWZfcHl0aG9uLmM6MjM4OQorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAia2FuIGludGUgdGEgYm9ydCByYWQiCisKKyM6IGlmX3B5dGhvbi5jOjIyNjAgaWZfcHl0aG9uLmM6MjQwNSBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMAorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgImthbiBpbnRlIGVyc+R0dGEgcmFkIgorCisjOiBpZl9weXRob24uYzoyNDIzIGlmX3B5dGhvbi5jOjI1MDIgaWZfcHl0aG9uLmM6MjU2MAorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAia2FuIGludGUgaW5mb2dhIHJhZCIKKworIzogaWZfcHl0aG9uLmM6MjY2NAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAic3Ry5G5nIGthbiBpbnRlIGlubmVo5WxsYSBueXJhZGVyIgorCisjOiBpZl9ydWJ5LmM6NDEyCittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFMjY2OiBUeXbkcnIsIGRldHRhIGtvbW1hbmRvdCDkciBpbmFrdGl2ZXJhdCwgUnVieS1iaWJsaW90ZWtldCBrdW5kZSBpbnRlICIKKyJs5HNhcyBpbi4iCisKKyM6IGlmX3J1YnkuYzo0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3Mzogb2vkbnQgbG9uZ2ptcC1zdGF0dXMgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAiVuR4bGEgbWVsbGFuIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIlZpc2EgYmFza2xhc3MgYXYiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICJWaXNhIOVzaWRvc2F0dCBtZWRsZW1zZnVua3Rpb24iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIkjkbXRhIGZy5W4gZmlsIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICJI5G10YSBmcuVuIHByb2pla3QiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiSORtdGEgZnLlbiBhbGxhIHByb2pla3QiCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiSORtdGEiCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAiVmlzYSBr5GxsYSBm9nIiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAiSGl0dGEgc3ltYm9sIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICJCbORkZHJhIGkga2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiVmlzYSBrbGFzcyBpIGhpZXJhcmtpIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAiVmlzYSBrbGFzcyBpIGJlZ3LkbnNhZCBoaWVyYXJraSIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmIHJlZmVyZXJhciB0aWxsIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiByZWZlcmVyYXMgYXYiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIGhhciBlbiIKKworIzogaWZfc25pZmYuYzo4MworbXNnaWQgIlhyZWYgdXNlZCBieSIKK21zZ3N0ciAiWHJlZiBhbnbkbmRzIGF2IgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICJWaXNhIGRvY3UgYXYiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAiR2VuZXJlcmEgZG9jdSBm9nIiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyJLYW4gaW50ZSBhbnNsdXRhIHRpbGwgU05pRkYrLiBLb250cm9sbGVyYSBtaWxq9iAoc25pZmZlbWFjcyBt5XN0ZSBrdW5uYSAiCisiaGl0dGFzIGkgJFBBVEgpLlxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjogRmVsIHZpZCBs5HNuaW5nLiBGcuVua29wcGxhZCIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrIORyIGb2ciBu5HJ2YXJhbmRlICIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICJpbnRlICIKKworIzogaWZfc25pZmYuYzo1NTYKK21zZ2lkICJjb25uZWN0ZWQiCittc2dzdHIgImFuc2x1dGVuIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogT2vkbmQgU05pRkYrLWJlZ+RyYW46ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiBGZWwgdmlkIGFuc2x1dG5pbmcgdGlsbCBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiBTTmlGRisgaW50ZSBhbnNsdXRlbiIKKworIzogaWZfc25pZmYuYzoxMDE4Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogSW50ZSBlbiBTTmlGRistYnVmZmVydCIKKworIzogaWZfc25pZmYuYzoxMDgzCittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjogRmVsIHZpZCBza3Jpdm5pbmcuIEZy5W5rb3BwbGFkIgorCisjOiBpZl90Y2wuYzo0MTgKK21zZ2lkICJpbnZhbGlkIGJ1ZmZlciBudW1iZXIiCittc2dzdHIgIm9naWx0aWd0IGJ1ZmZlcnRudW1tZXIiCisKKyM6IGlmX3RjbC5jOjQ2NCBpZl90Y2wuYzo5MzEgaWZfdGNsLmM6MTExMAorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgImludGUgaW1wbGVtZW50ZXJhdCDkbiIKKworIzogaWZfdGNsLmM6NTAxCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIm9r5G5kIGZsYWdnYSIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzQKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgImthbiBpbnRlIHN05GxsYSBpbiByYWQoZXIpIgorCisjOiBpZl90Y2wuYzo4NDUKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIm3kcmtlIGludGUgc2F0dCIKKworIzogaWZfdGNsLmM6ODUxIGlmX3RjbC5jOjEwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAicmFkICVkIGtvbHVtbiAlZCIKKworIzogaWZfdGNsLmM6ODgxCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAia2FuIGludGUgaW5mb2dhL2zkZ2dhIHRpbGwgcmFkIgorCisjOiBpZl90Y2wuYzoxMjY4Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIm9r5G5kIGZsYWdnYTogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIm9r5G5kIHZpbU9wdGlvbiIKKworIzogaWZfdGNsLmM6MTQyMworbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAidGFuZ2VudGJvcmRzYXZicm90dCIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAidmltLWZlbCIKKworIzogaWZfdGNsLmM6MTQ3MQorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAia2FuIGludGUgc2thcGEgYnVmZmVydC9m9m5zdGVyLWtvbW1hbmRvOiBvYmpla3QgaOVsbGVyIHDlIGF0dCB0YXMgYm9ydCIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIiIKKyJrYW4gaW50ZSByZWdpc3RlcmEg5XRlcmthbGxuaW5nc2tvbW1hbmRvOiBidWZmZXJ0L2b2bnN0ZXIgaOVsbGVyIHJlZGFuIHDlICIKKyJhdHQgdGFzIGJvcnQiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYyCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIiIKKyJFMjgwOiBUQ0wg1kRFU0RJR0VSVCBGRUw6IHJlZmxpc3QgdHJhc2lnIT8gVmFyIHNu5GxsIG9jaCByYXBwb3J0ZXJhIGRldHRhICIKKyJ0aWxsIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2MworbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKyJrYW4gaW50ZSByZWdpc3RyZXJhIOV0ZXJrYWxsbmluZ3Nrb21tYW5kbzogYnVmZmVydC0vZvZuc3RlcnJlZmVyZW5zIGhpdHRhZGVzICIKKyJpbnRlIgorCisjOiBpZl90Y2wuYzoxNzI0Cittc2dpZCAiIgorIkU1NzE6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIkU1NzE6IFR5duRyciwgZGV0dGEga29tbWFuZG8g5HIgaW5ha3RpdmVyYXQ6IFRjbC1iaWJsaW90ZWtldCBrdW5kZSBpbnRlICIKKyJs5HNhcyBpbi4iCisKKyM6IGlmX3RjbC5jOjE4ODYKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgxOiBUQ0wtRkVMOiBBdnNsdXRuaW5nc2tvZGVuIORyIGludGUgaW50IT8gVmFyIHNu5GxsIG9jaCByYXBwb3J0ZXJhIGRldHRhICIKKyJ0aWxsIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MjAwNgorbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAia2FuIGludGUgaORtdGEgcmFkIgorCisjOiBpZl94Y21kc3J2LmM6MjE1Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAiS3VuZGUgaW50ZSByZWdpc3RyZXJhIGV0dCBrb21tYW5kb3NlcnZlcm5hbW4iCisKKyM6IGlmX3hjbWRzcnYuYzo0NjUKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiBNaXNzbHlja2FkZXMgYXR0IHNraWNrYSBrb21tYW5kbyB0aWxsIG3lbHByb2dyYW1tZXQiCisKKyM6IGlmX3hjbWRzcnYuYzo3MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IE9naWx0aWd0IHNlcnZlci1pZCBhbnbkbnQ6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTEwMgorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNIGluc3RhbnNyZWdpc3RlcmVnZW5za2FwIORyIGTlbGlndCBmb3JtYXQuICBCb3J0dGFnZXQhIgorCisjOiBtYWluLmM6NjAKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiT2vkbmQgZmxhZ2dhIgorCisjOiBtYWluLmM6NjIKK21zZ2lkICJUb28gbWFueSBlZGl0IGFyZ3VtZW50cyIKK21zZ3N0ciAiRvZyIG3lbmdhIHJlZGlnZXJpbmdzYXJndW1lbnQiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIkFyZ3VtZW50IHNha25hcyBlZnRlciIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIlNrcuRwIGVmdGVyIGZsYWdnYSIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiLCBcIi1jIGNvbW1hbmRcIiBvciBcIi0tY21kIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIiIKKyJG9nIgbeVuZ2EgXCIra29tbWFuZG9cIi0sIFwiLWMga29tbWFuZG9cIi0gZWxsZXIgXCItLWNtZCBrb21tYW5kb1wiLWFyZ3VtZW50IgorCisjOiBtYWluLmM6NzAKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAiT2dpbHRpZ3QgYXJndW1lbnQgZvZyIgorCisjOiBtYWluLmM6NDY2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICJEZW5uYSBWaW0gYmxldiBpbnRlIGtvbXBpbGVyYWQgbWVkIGRpZmYtZnVua3Rpb25lbi4iCisKKyM6IG1haW4uYzo5MjUKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICJG9nJz9msgYXR0IPZwcG5hIHNrcmlwdGZpbCBpZ2VuOiBcIiIKKworIzogbWFpbi5jOjkyOSBtYWluLmM6OTM2IG1haW4uYzo5ODAgbWVtbGluZS5jOjM2OTQgbWVtbGluZS5jOjM2OTgKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6OTM0Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICJLYW4gaW50ZSD2cHBuYSBm9nIgbORzbmluZzogXCIiCisKKyM6IG1haW4uYzo5NzgKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIkthbiBpbnRlIPZwcG5hIGb2ciBza3JpcHR1dG1hdG5pbmc6IFwiIgorCisjOiBtYWluLmM6MTExMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIiVkIGZpbGVyIGF0dCByZWRpZ2VyYVxuIgorCisjOiBtYWluLmM6MTIwMgorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTogVmFybmluZzogVXRtYXRuaW5nIORyIGludGUgdGlsbCBlbiB0ZXJtaW5hbFxuIgorCisjOiBtYWluLmM6MTIwNAorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IFZhcm5pbmc6IElubWF0bmluZyDkciBpbnRlIGZy5W4gZW4gdGVybWluYWxcbiIKKworIy4ganVzdCBpbiBjYXNlLi4KKyM6IG1haW4uYzoxMjY2Cittc2dpZCAicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAicHJlLXZpbXJjIGtvbW1hbmRvcmFkIgorCisjOiBtYWluLmM6MTMwNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogS2FuIGludGUgbORzYSBmcuVuIFwiJXNcIiIKKworIzogbWFpbi5jOjIzNjUKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIk1lciBpbmZvIG1lZDogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjM5OAorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbZmlsIC4uXSAgICAgICByZWRpZ2VyYSBhbmdpdm5hIGZpbChlcikiCisKKyM6IG1haW4uYzoyMzk5Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICBs5HMgdGV4dCBmcuVuIHN0YW5kYXJkIGluIgorCisjOiBtYWluLmM6MjQwMAorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHRhZ2cgICAgICAgIHJlZGlnZXJhIGZpbCBk5HIgdGFnZyDkciBkZWZpbmllcmFkIgorCisjOiBtYWluLmM6MjQwMgorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2ZlbGZpbF0gICAgcmVkaWdlcmEgZmlsIG1lZCBm9nJzdGEgZmVsIgorCisjOiBtYWluLmM6MjQxMQorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJhbnbkbmRuaW5nOiIKKworIzogbWFpbi5jOjI0MTQKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAiIHZpbSBbYXJndW1lbnRdICIKKworIzogbWFpbi5jOjI0MTgKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgICBlbGxlcjoiCisKKyM6IG1haW4uYzoyNDIxCittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50OlxuIgorCisjOiBtYWluLmM6MjQyMgorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx0QmFyYSBmaWxuYW1uIGVmdGVyIGRldCBo5HIiCisKKyM6IG1haW4uYzoyNDI0Cittc2dpZCAiLS1saXRlcmFsXHRcdERvbid0IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIi0tbGl0ZXJhbFx0XHRFeHBhbmRlcmEgaW50ZSBqb2tlcnRlY2tlbiIKKworIzogbWFpbi5jOjI0MjcKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHRSZWdpc3RyZXJhIGd2aW0gZvZyIE9MRSIKKworIzogbWFpbi5jOjI0MjgKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0QXZyZWdpc3RyZXJhIGd2aW0gZvZyIE9MRSIKKworIzogbWFpbi5jOjI0MzEKK21zZ2lkICItZ1x0XHRcdFJ1biB1c2luZyBHVUkgKGxpa2UgXCJndmltXCIpIgorbXNnc3RyICItZ1x0XHRcdEv2ciBzb20gR1VJIChzb20gXCJndmltXCIpIgorCisjOiBtYWluLmM6MjQzMgorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mICBlbGxlciAtLW5vZm9ya1x0RvZyZ3J1bmQ6IEdyZW5hIGludGUgdmlkIHN0YXJ0IGF2IEdVSSIKKworIzogbWFpbi5jOjI0MzQKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaS1s5GdlIChzb20gXCJ2aVwiKSIKKworIzogbWFpbi5jOjI0MzUKK21zZ2lkICItZVx0XHRcdEV4IG1vZGUgKGxpa2UgXCJleFwiKSIKK21zZ3N0ciAiLWVcdFx0XHRFeC1s5GdlIChzb20gXCJleFwiKSIKKworIzogbWFpbi5jOjI0MzYKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0VHlzdCAoYmF0Y2gpIGzkZ2UgKGJhcmEgZvZyIFwiZXhcIikiCisKKyM6IG1haW4uYzoyNDM4Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdERpZmYtbORnZSAoc29tIFwidmltZGlmZlwiKSIKKworIzogbWFpbi5jOjI0NDAKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdEzkdHQgbORnZSAoc29tIFwiZXZpbVwiLCBs5Gdlc2z2cykiCisKKyM6IG1haW4uYzoyNDQxCittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHRTa3JpdnNreWRkYXQgbORnZSAoc29tIFwidmlld1wiKSIKKworIzogbWFpbi5jOjI0NDIKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0QmVncuRuc2F0IGzkZ2UgKHNvbSBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyNDQzCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHRNb2RpZmllcmluZ2FyIChza3JpdmEgZmlsZXIpIGludGUgdGlsbOV0ZXQiCisKKyM6IG1haW4uYzoyNDQ0Cittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0TW9kaWZpZXJpbmdhciBpIHRleHQgaW50ZSB0aWxs5XRldCIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdEJpbuRybORnZSIKKworIzogbWFpbi5jOjI0NDcKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwLWzkZ2UiCisKKyM6IG1haW4uYzoyNDQ5Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHRLb21wYXRpYmVsdCBtZWQgVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjI0NTAKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHRJbnRlIGZ1bGx0IFZpLWtvbXBhdGliZWw6ICdub2NvbXBhdGlibGUnIgorCisjOiBtYWluLmM6MjQ1MQorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdE3lbmdvcmRpZ3QgbORnZSIKKworIzogbWFpbi5jOjI0NTIKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdEZlbHP2a25pbmdzbORnZSIKKworIzogbWFpbi5jOjI0NTMKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdEluZ2VuIHbkeGxpbmdzZmlsLCBhbnbkbmQgZW5kYXN0IG1pbm5ldCIKKworIzogbWFpbi5jOjI0NTQKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHRMaXN0YSB25HhsaW5nc2ZpbGVyIG9jaCBhdnNsdXRhIgorCisjOiBtYWluLmM6MjQ1NQorbXNnaWQgIi1yICh3aXRoIGZpbGUgbmFtZSlcdFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uIgorbXNnc3RyICItciAobWVkIGZpbG5hbW4pXHTFdGVyc2thcGEga3Jhc2NoYWQgc2Vzc2lvbiIKKworIzogbWFpbi5jOjI0NTYKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0U2FtbWEgc29tIC1yIgorCisjOiBtYWluLmM6MjQ1OAorbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHRBbnbkbmRhIGludGUgbmV3Y2xpIGb2ciBhdHQg9nBwbmEgZvZuc3RlciIKKworIzogbWFpbi5jOjI0NTkKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDxlbmhldD5cdFx0QW525G5kIDxlbmhldD4gZvZyIEkvTyIKKworIzogbWFpbi5jOjI0NjIKK21zZ2lkICItQVx0XHRcdHN0YXJ0IGluIEFyYWJpYyBtb2RlIgorbXNnc3RyICItQVx0XHRcdHN0YXJ0YSBpIGFyYWJpc2t0IGzkZ2UiCisKKyM6IG1haW4uYzoyNDY1Cittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHRTdGFydGEgaSBoZWJyZWlza3QgbORnZSIKKworIzogbWFpbi5jOjI0NjgKK21zZ2lkICItRlx0XHRcdFN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0U3RhcnRhIGkgcGVyc2lza3QgbORnZSAoRmFyc2kpIgorCisjOiBtYWluLmM6MjQ3MAorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdFN05GxsIGluIHRlcm1pbmFsdHlwIHRpbGwgPHRlcm1pbmFsPiIKKworIzogbWFpbi5jOjI0NzEKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHRBbnbkbmQgPHZpbXJjPiBpc3TkbGxldCBm9nIgbuVnb24gLnZpbXJjIgorCisjOiBtYWluLmM6MjQ3MworbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHRBbnbkbmQgPGd2aW1yYz4gaXN05GxsZXQgZvZyIG7lZ29uIC5ndmltcmMiCisKKyM6IG1haW4uYzoyNDc1Cittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdEzkcyBpbnRlIGluIGluc3RpY2tzc2tyaXB0IgorCisjOiBtYWluLmM6MjQ3NgorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdNZwcG5hIE4gZvZuc3RlciAoc3RhbmRhcmQ6IGV0dCBm9nIgdmFyamUgZmlsKSIKKworIzogbWFpbi5jOjI0NzcKK21zZ2lkICItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHRTb20gLW8gbWVuIGRlbGEgdmVydGlrYWx0IgorCisjOiBtYWluLmM6MjQ3OAorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdFN0YXJ0YSB2aWQgc2x1dCBhdiBmaWwiCisKKyM6IG1haW4uYzoyNDc5Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnI+XHRcdFN0YXJ0YSBw5SByYWQgPHJucj4iCisKKyM6IG1haW4uYzoyNDgxCittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiLS1jbWQgPGtvbW1hbmRvPlx0S/ZyIDxrb21tYW5kbz4gZvZyZSBpbmzkc25pbmcgYXYgbuVnb24gdmltcmMgZmlsIgorCisjOiBtYWluLmM6MjQ4MworbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8a29tbWFuZG8+XHRL9nIgPGtvbW1hbmRvPiBlZnRlciBpbmzkc25pbmcgYXYgZGVuIGb2cnN0YSBmaWxlbiIKKworIzogbWFpbi5jOjI0ODQKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNzaW9uPlx0XHRL9nIgZmlsIDxzZXNzaW9uPiBlZnRlciBpbmzkc25pbmcgYXYgZGVuIGb2cnN0YSBmaWxlbiIKKworIzogbWFpbi5jOjI0ODUKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8aW5za3JpcHQ+XHRM5HMgTm9ybWFsbORnZXNrb21tYW5kb24gZnLlbiBmaWwgPGluc2tyaXB0PiIKKworIzogbWFpbi5jOjI0ODYKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8dXRza3JpcHQ+XHRM5GdnIHRpbGwgYWxsYSBza3Jpdm5hIGtvbW1hbmRvbiB0aWxsIGZpbCA8dXRza3JpcHQ+IgorCisjOiBtYWluLmM6MjQ4NworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHV0c2tyaXB0Plx0U2tyaXYgYWxsYSBza3Jpdm5hIGtvbW1hbmRvbiB0aWxsIGZpbCA8dXRza3JpcHQ+IgorCisjOiBtYWluLmM6MjQ4OQorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0UmVkaWdlcmEga3J5cHRlcmFkZSBmaWxlciIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRBbnNsdXQgdmltIHRpbGwganVzdCBkZW5uYSBYLXNlcnZlciIKKworIzogbWFpbi5jOjI0OTUKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdEFuc2x1dCBpbnRlIHRpbGwgWCBzZXJ2ZXIiCisKKyM6IG1haW4uYzoyNDk4Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVyPlx0UmVkaWdlcmEgPGZpbGVyPiBpIGVuIFZpbS1zZXJ2ZXIgb20gbfZqbGlndCIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtc2lsZW50IDxmaWxlcj5cdFNhbW1hLCBrbGFnYSBpbnRlIG9tIGRldCBpbnRlIGZpbm5zIG7lZ29uIHNlcnZlciIKKworIzogbWFpbi5jOjI1MDAKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVyPlx0U29tIC0tcmVtb3RlIG1lbiB25G50YSBw5SBhdHQgZmlsZXIgaGFyIGJsaXZpdCAiCisicmVkaWdlcmFkZSIKKworIzogbWFpbi5jOjI1MDEKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVyPlx0U2FtbWEsIGtsYWdhIGludGUgb20gZGV0IGludGUgZmlubnMgbuVnb24gIgorInNlcnZlciIKKworIzogbWFpbi5jOjI1MDIKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICIiCisiLS1yZW1vdGUtc2VuZCA8bnlja2xhcj5cdFNraWNrYSA8bnlja2xhcj4gdGlsbCBlbiBWaW0tc2VydmVyIG9jaCBhdnNsdXRhIgorCisjOiBtYWluLmM6MjUwMworbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIiIKKyItLXJlbW90ZS1leHByIDx1dHRyeWNrPlx0RXZhbHVlcmEgPHV0dHJ5Y2s+IGkgZW4gVmltLXNlcnZlciBvY2ggc2tyaXYgdXQgIgorInJlc3VsdGF0ZXQiCisKKyM6IG1haW4uYzoyNTA0Cittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIi0tc2VydmVybGlzdFx0XHRMaXN0YSB0aWxsZ+RuZ2xpZ2EgVmltLXNlcnZlcm5hbW4gb2NoIGF2c2x1dGEiCisKKyM6IG1haW4uYzoyNTA1Cittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlcm5hbWUgPG5hbW4+XHRTa2lja2EgdGlsbC9m9nIgYXR0IGJsaSBWaW0tc2VydmVybiA8bmFtbj4iCisKKyM6IG1haW4uYzoyNTA4Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdEFuduRuZCA8dmltaW5mbz4gaXN05GxsZXQgZvZyIC52aW1pbmZvIgorCisjOiBtYWluLmM6MjUxMAorbXNnaWQgIi1oICBvciAgLS1oZWxwXHRQcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaCAgZWxsZXIgIC0taGVscFx0U2tyaXYgdXQgSGrkbHAgKGRldCBo5HIgbWVkZGVsYW5kZXQpIG9jaCBhdnNsdXRhIgorCisjOiBtYWluLmM6MjUxMQorbXNnaWQgIi0tdmVyc2lvblx0XHRQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0U2tyaXYgdXQgdmVyc2lvbnNpbmZvcm1hdGlvbiBvY2ggYXZzbHV0YSIKKworIzogbWFpbi5jOjI1MTUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJBcmd1bWVudCBzb20gc3T2ZHMgYXYgZ3ZpbSAoTW90aWYtdmVyc2lvbik6XG4iCisKKyM6IG1haW4uYzoyNTE5Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKG5lWHRhdyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50IHNvbSBzdPZkcyBhdiBndmltIChuZVh0YXctdmVyc2lvbik6XG4iCisKKyM6IG1haW4uYzoyNTIxCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50IHNvbSBzdPZkcyBhdiBndmltIChBdGhlbmEtdmVyc2lvbik6XG4iCisKKyM6IG1haW4uYzoyNTI1Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHRL9nIgdmltIHDlIDxkaXNwbGF5PiIKKworIzogbWFpbi5jOjI1MjYKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx0U3RhcnRhIHZpbSBzb20gaWtvbiIKKworIzogbWFpbi5jOjI1MjgKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmFtbj5cdFx0QW525G5kIHJlc3VycyBzb20gb20gdmltIHZhciA8bmFtbj4iCisKKyM6IG1haW4uYzoyNTI5Cittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAgKE9pbXBsZW1lbnRlcmF0KVxuIgorCisjOiBtYWluLmM6MjUzMQorbXNnaWQgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciB0aGUgYmFja2dyb3VuZCAoYWxzbzogLWJnKSIKK21zZ3N0ciAiLWJhY2tncm91bmQgPGbkcmc+XHRBbnbkbmQgPGbkcmc+IGb2ciBiYWtncnVuZGVuICjkdmVuOiAtYmcpIgorCisjOiBtYWluLmM6MjUzMgorbXNnaWQgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZnKSIKK21zZ3N0ciAiLWZvcmVncm91bmQgPGbkcmc+XHRBbnbkbmQgPGbkcmc+IGb2ciB2YW5saWcgdGV4dCAo5HZlbjogLWZnKSIKKworIzogbWFpbi5jOjI1MzMgbWFpbi5jOjI1NTMKK21zZ2lkICItZm9udCA8Zm9udD5cdFx0VXNlIDxmb250PiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mbikiCittc2dzdHIgIi1mb250IDx0eXBzbml0dD5cdFx0QW525G5kIDx0eXBzbml0dD4gZvZyIHZhbmxpZyB0ZXh0ICjkdmVuOiAtZm4pIgorCisjOiBtYWluLmM6MjUzNAorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAirWJvbGRmb250IDx0eXBzbml0dD5cdEFuduRuZCA8dHlwc25pdHQ+IGb2ciBmZXQgdGV4dCIKKworIzogbWFpbi5jOjI1MzUKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8dHlwc25pdHQ+XHRBbnbkbmQgPHR5cHNuaXR0PiBm9nIga3Vyc2l2IHRleHQiCisKKyM6IG1haW4uYzoyNTM2IG1haW4uYzoyNTU0Cittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICIiCisiLWdlb21ldHJ5IDxnZW9tPlx0QW525G5kIDxnZW9tPiBm9nIgaW5sZWRhbmRlIGb2bnN0ZXJwbGFjZXJpbmcgKOR2ZW46IC1nZW9tKSIKKworIzogbWFpbi5jOjI1MzcKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8YnJlZGQ+XHRBbnbkbmQgZW4gcmFtYnJlZGQgbWVkIDxicmVkZD4gKOR2ZW46IC1idykiCisKKyM6IG1haW4uYzoyNTM4Cittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICIiCisiLXNjcm9sbGJhcndpZHRoIDxicmVkZD4gIEFuduRuZCBlbiBydWxsbmluZ3NsaXN0YnJlZGQgcOUgPGJyZWRkPiAo5HZlbjogLXN3KSIKKworIzogbWFpbi5jOjI1NDAKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICItbWVudWhlaWdodCA8aPZqZD5cdEFuduRuZCBlbiBtZW55cmFkc2j2amQgbWVkIDxo9mpkPiAo5HZlbjogLW1oKSIKKworIzogbWFpbi5jOjI1NDIgbWFpbi5jOjI1NTUKK21zZ2lkICItcmV2ZXJzZVx0XHRVc2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogLXJ2KSIKK21zZ3N0ciAiLXJldmVyc2VcdFx0QW525G5kIG9tduRuZCB2aWRlbyAo5HZlbjogLXJ2KSIKKworIzogbWFpbi5jOjI1NDMKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0QW525G5kIGludGUgb2125G5kIHZpZGVvICjkdmVuOiArcnYpIgorCisjOiBtYWluLmM6MjU0NAorbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHRpbGxn5W5nPlx0U3TkbGwgaW4gZGVuIGFuZ2l2bmEgdGlsbGflbmdlbiIKKworIzogbWFpbi5jOjI1NDcKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50IGlnZW5r5G5kYSBhdiBndmltIChSSVNDIE9TLXZlcnNpb24pOlxuIgorCisjOiBtYWluLmM6MjU0OAorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxhbnRhbD5cdElubGVkYW5kZSBicmVkZCBw5SBm9m5zdGVyIGkga29sdW1uZXIiCisKKyM6IG1haW4uYzoyNTQ5Cittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxhbnRhbD5cdElubGVkYW5kZSBo9mpkIHDlIGb2bnN0ZXIgaSByYWRlciIKKworIzogbWFpbi5jOjI1NTIKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIkFyZ3VtZW50IGlnZW5r5G5kYSBhdiBndmltIChHVEsrLXZlcnNpb24pOlxuIgorCisjOiBtYWluLmM6MjU1NgorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0S/ZyIHZpbSBw5SA8ZGlzcGxheT4gKOR2ZW46IC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyNTU4Cittc2dpZCAiLS1yb2xlIDxyb2xlPlx0U2V0IGEgdW5pcXVlIHJvbGUgdG8gaWRlbnRpZnkgdGhlIG1haW4gd2luZG93IgorbXNnc3RyICItLXJvbGUgPHJvbGw+XHRTdORsbCBpbiBlbiB1bmlrIHJvbGwgZvZyIGF0dCBpZGVudGlmaWVyYSBodXZ1ZGb2bnN0cmV0IgorCisjOiBtYWluLmM6MjU2MAorbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdNZwcG5hIFZpbSBpbm5hbmb2ciBlbiBhbm5hbiBHVEstd2lkZ2V0IgorCisjOiBtYWluLmM6MjU2MgorbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdFZpc2EgR25vbWUtYXJndW1lbnQiCisKKyM6IG1haW4uYzoyNzk0Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAiSW5nZW4gZGlzcGxheSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI4MDkKK21zZ2lkICI6IFNlbmQgZmFpbGVkLlxuIgorbXNnc3RyICI6INZ2ZXJm9nJpbmcgbWlzc2x5Y2thZGVzLlxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI4MTUKK21zZ2lkICI6IFNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIjog1nZlcmb2cmluZyBtaXNzbHlja2FkZXMuIEb2cnP2a2VyIGF0dCBr9nJhIGxva2FsdFxuIgorCisjOiBtYWluLmM6Mjg1MyBtYWluLmM6Mjg3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIiVkIGF2ICVkIHJlZGlnZXJhZGUiCisKKyM6IG1haW4uYzoyODk2Cittc2dpZCAiTm8gZGlzcGxheTogU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAiSW5nZW4gZGlzcGxheTog1nZlcmb2cmluZ3N1dHRyeWNrIG1pc3NseWNrYWRlcy5cbiIKKworIzogbWFpbi5jOjI5MDgKK21zZ2lkICI6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIjog1nZlcmb2cmluZ3N1dHRyeWNrIG1pc3NseWNrYWRlcy5cbiIKKworIzogbWFyay5jOjY2MgorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiSW5nYSBt5HJrZW4gc2F0dGEiCisKKyM6IG1hcmsuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiBJbmdhIG3kcmtlbiBtYXRjaGFkZSBcIiVzXCIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWFyay5jOjY3NQorbXNnaWQgIiIKKyJcbiIKKyJtYXJrIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyJt5HJrZSByYWQgIGtvbCBmaWwvdGV4dCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzEzCittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgaG9wcCByYWQga29sIGZpbC90ZXh0IgorCisjOiBtYXJrLmM6MTA4MworbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEZpbG3kcmtlbjpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMTE4Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhvcHBsaXN0YSAobnlhc3RlIGb2cnN0KTpcbiIKKworIzogbWFyay5jOjEyMTQKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEhpc3RvcmlhIGb2ciBt5HJrZW4gaW5uZSBpIGZpbGVyIChueWFzdGUgdGlsbCDkbGRzdGEpOlxuIgorCisjOiBtYXJrLmM6MTI5NworbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICJTYWtuYXIgJz4nIgorCisjOiBtYnl0ZS5jOjQxNQorbXNnaWQgIkU1NDM6IE5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICJFNTQzOiBJbnRlIGVuIGdvZGvkbmQgdGVja2VudGFiZWxsIgorCisjOiBtYnl0ZS5jOjQwOTkKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogS2FuIGludGUgc3TkbGxhIGluIElDLXbkcmRlbiIKKworIzogbWJ5dGUuYzo0MjUxCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiBNaXNzbHlja2FkZXMgYXR0IHNrYXBhIGlubWF0bmluZ3NtaWxq9iIKKworIzogbWJ5dGUuYzo0Mzk4Cittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiBNaXNzbHlja2FkZXMgYXR0IPZwcG5hIGlubWF0bmluZ3NtZXRvZCIKKworIzogbWJ5dGUuYzo0NDA5Cittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiBWYXJuaW5nOiBLdW5kZSBpbnRlIHN05GxsYSBpbiBm9nJzdPZybmluZ3PldGVya2FsbG5pbmcgdGlsbCBJTSIKKworIzogbWJ5dGUuYzo0NDE1Cittc2dpZCAiRTI4ODogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgc3R5bGUiCittc2dzdHIgIkUyODg6IGlubWF0bmluZ3NtZXRvZCBzdPZkZXIgaW50ZSBu5WdvbiBzdGlsIgorCisjOiBtYnl0ZS5jOjQ0NzIKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogaW5tYXRuaW5nc21ldG9kIHN09mRlciBpbnRlIG1pbiBm9nJyZWRpZ2VyaW5nc3R5cCIKKworIzogbWJ5dGUuYzo0NTQ2Cittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiD2dmVyLXByaWNrZW4tc3RpbCBrcuR2ZXIgdHlwc25pdHRzdXBwc+R0dG5pbmciCisKKyM6IG1ieXRlLmM6NDU3OAorbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogRGluIEdUSysg5HIg5GxkcmUg5G4gMS4yLjMuIFN0YXR1c29tcuVkZSBpbmFrdGl2ZXJhdCIKKworIzogbWJ5dGUuYzo0ODU3Cittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogSW5tYXRuaW5nc21ldG9kc2VydmVyIGv2cnMgaW50ZSIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiBibG9jayBs5XN0ZXMgaW50ZSIKKworIzogbWVtZmlsZS5jOjk5NQorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IFP2a2ZlbCBpIHbkeGVsZmlsc2zkc25pbmciCisKKyM6IG1lbWZpbGUuYzoxMDAwCittc2dpZCAiRTI5NTogUmVhZCBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTU6IEzkc2ZlbCBpIHbkeGVsZmlsIgorCisjOiBtZW1maWxlLmM6MTA1MgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiBT9mtmZWwgaSB25HhlbGZpbHNrcml2bmluZyIKKworIzogbWVtZmlsZS5jOjEwNzAKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IFNrcml2ZmVsIGkgduR4ZWxmaWwiCisKKyM6IG1lbWZpbGUuYzoxMjY3Cittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiBW5HhlbGZpbCBleGlzdGVyYXIgcmVkYW4gKHN5bWzkbmtzYXR0YWNrPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiBUb2cgaW50ZSBlbW90IGJsb2NrIG5yIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODogVG9nIGludGUgZW1vdCBibG9jayBuciAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6IFRvZyBpbnRlIGVtb3QgYmxvY2sgbnIgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IEhvcHBzYW4sIHRhcHBhdCBib3J0IHbkeGVsZmlsZW4hISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogS3VuZGUgaW50ZSBk9nBhIG9tIHbkeGVsZmlsIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiBLdW5kZSBpbnRlIPZwcG5hIHbkeGVsZmlsIGb2ciBcIiVzXCIsIOV0ZXJza2FwbmluZyBvbfZqbGlnIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiBUb2cgaW50ZSBlbW90IGJsb2NrIDA/PyIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiBJbmdlbiB25HhlbGZpbCBoaXR0YWQgZvZyICVzIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAiQW5nZSBudW1tZXIgcOUgduR4ZWxmaWwgYXR0IGFuduRuZGEgKDAgZvZyIGF0dCBhdnNsdXRhKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiBLYW4gaW50ZSD2cHBuYSAlcyIKKworIzogbWVtbGluZS5jOjgzNAorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIkt1bmRlIGludGUgbORzYSBibG9jayAwIGZy5W4gIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIkthbnNrZSBnam9yZGVzIGludGUgbuVncmEgZvZy5G5kcmluZ2FyIGVsbGVyIHPlIHVwcGRhdGVyYWRlIGludGUgVmltICIKKyJ25HhsaW5nc2ZpbGVuLiIKKworIzogbWVtbGluZS5jOjg0NyBtZW1saW5lLmM6ODY0Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIKK21zZ3N0ciAiIGthbiBpbnRlIGFuduRuZGFzIG1lZCBkZW4gaORyIHZlcnNpb25lbiBhdiBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICJBbnbkbmQgVmltIHZlcnNpb24gMy4wLlxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIHNlciBpbnRlIHV0IHNvbSBlbiBWaW0tduR4bGluZ3NmaWwiCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiIGthbiBpbnRlIGFuduRuZGFzIHDlIGRlbiBo5HIgZGF0b3JuLlxuIgorCisjOiBtZW1saW5lLmM6ODcwCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICJGaWxlbiBza2FwYWRlcyBw5SAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorImVsbGVyIHPlIGhhciBmaWxlbiBibGl2aXQgc2thZGFkLiIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICJBbnbkbmRlciB25HhsaW5nc2ZpbCBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgIk9yZ2luYWxmaWwgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTIyCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IFZhcm5pbmc6IE9yZ2luYWxmaWxlbiBrYW4gaGEgYmxpdml0IHNrYWRhZCIKKworIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IEt1bmRlIGludGUgbORzYSBibG9jayAxIGZy5W4gJXMiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P03FTkdBIFJBREVSIFNBS05BUyIKKworIzogbWVtbGluZS5jOjk5NQorbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P1JBREFOVEFMIEZFTCIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/VE9NVCBCTE9DSyIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz9SQURFUiBTQUtOQVMiCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiBCbG9jayAxIElEIGZlbCAoJXMgaW50ZSBlbiAuc3dwLWZpbD8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P0JMT0NLIFNBS05BUyIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gZnLlbiBo5HIgdGlsbCA/Pz9TTFVUIGthbiByYWRlciB2YXJhIHRpbGxzdPZrYWRlIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IGZy5W4gaORyIHRpbGwgPz8/U0xVVCBrYW4gcmFkZXIgaGEgYmxpdml0IGluZm9nYWRlL2JvcnR0YWduYSIKKworIzogbWVtbGluZS5jOjExMTcKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/U0xVVCIKKworIzogbWVtbGluZS5jOjExNDMKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTogxXRlcnNrYXBuaW5nIGF2YnJ1dGVuIgorCisjOiBtZW1saW5lLmM6MTE0NQorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIiIKKyJFMzEyOiBGZWwgdXBwdORja3QgdmlkIOV0ZXJza2FwbmluZzsgdGl0dGEgZWZ0ZXIgcmFkZXIgc29tIGL2cmphciBtZWQgPz8/IgorCisjOiBtZW1saW5lLmM6MTE0OAorbXNnaWQgIlJlY292ZXJ5IGNvbXBsZXRlZC4gWW91IHNob3VsZCBjaGVjayBpZiBldmVyeXRoaW5nIGlzIE9LLiIKK21zZ3N0ciAixXRlcnNrYXBuaW5nIGtsYXIuIER1IGJvcmRlIGtvbnRyb2xsZXJhIG9tIGFsbHRpbmcg5HIgT0suIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIihEdSBrYW5za2UgdmlsbCBzcGFyYSBkZW4gaORyIGZpbGVuIHVuZGVyIGV0dCBhbm5hdCBuYW1uXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUwCittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgIiIKKyJvY2gga/ZyIGRpZmYgbWVkIG9yZ2luYWxmaWxlbiBm9nIgYXR0IGtvbnRyb2xsZXJhIGVmdGVyIGb2cuRuZHJpbmdhcilcbiIKKworIzogbWVtbGluZS5jOjExNTEKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIlRhIGJvcnQgLnN3cC1maWxlbiBlZnRlcuV0LlxuIgorIlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMDcKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAiVuR4bGluZ3NmaWxlciBoaXR0YWRlOiIKKworIzogbWVtbGluZS5jOjEzODUKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAgSSBha3R1ZWxsIGthdGFsb2c6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzg3Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIEFuduRuZGVyIGFuZ2l2ZXQgbmFtbjpcbiIKKworIzogbWVtbGluZS5jOjEzOTEKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICBJIGthdGFsb2cgIgorCisjOiBtZW1saW5lLmM6MTQwOQorbXNnaWQgIiAgICAgIC0tIG5vbmUgLS1cbiIKK21zZ3N0ciAiICAgICAgLS0gaW5nZXQgLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgIORnZCBhdjogIgorCisjOiBtZW1saW5lLmM6MTQ4MworbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgIGRhdGVyYWQ6ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM3MDEKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgIGRhdGVyYWQ6ICIKKworIzogbWVtbGluZS5jOjE1MDMKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICBbZnLlbiBWaW0gdmVyc2lvbiAzLjBdIgorCisjOiBtZW1saW5lLmM6MTUwNworbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgW3NlciBpbnRlIHV0IHNvbSBlbiBWaW0tduR4bGluZ3NmaWxdIgorCisjOiBtZW1saW5lLmM6MTUxMQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICBmaWxuYW1uOiAiCisKKyM6IG1lbWxpbmUuYzoxNTE3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICBtb2RpZmllZDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVyYWQ6ICIKKworIzogbWVtbGluZS5jOjE1MTgKK21zZ2lkICJZRVMiCittc2dzdHIgIkpBIgorCisjOiBtZW1saW5lLmM6MTUxOAorbXNnaWQgIm5vIgorbXNnc3RyICJuZWoiCisKKyM6IG1lbWxpbmUuYzoxNTIyCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgYW525G5kYXJuYW1uOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI5Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgIHbkcmRuYW1uOiAiCisKKyM6IG1lbWxpbmUuYzoxNTMxCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgduRyZG5hbW46ICIKKworIzogbWVtbGluZS5jOjE1MzcKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgIHByb2Nlc3MtSUQ6ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKGv2cnMgZm9ydGZhcmFuZGUpIgorCisjOiBtZW1saW5lLmM6MTU1NQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW2ludGUgYW525G5kYmFyIG1lZCBkZW4gaORyIHZlcnNpb25lbiBhdiBWaW1dIgorCisjOiBtZW1saW5lLmM6MTU1OAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFtpbnRlIGFuduRuZGJhciBw5SBkZW4gaORyIGRhdG9ybl0iCisKKyM6IG1lbWxpbmUuYzoxNTYzCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW2thbiBpbnRlIGzkc2FzXSIKKworIzogbWVtbGluZS5jOjE1NjcKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFtrYW4gaW50ZSD2cHBuYXNdIgorCisjOiBtZW1saW5lLmM6MTc1NworbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiBLYW4gaW50ZSBiZXZhcmEsIGRldCBmaW5ucyBpbmdlbiB25HhsaW5nc2ZpbCIKKworIzogbWVtbGluZS5jOjE4MTAKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAiRmlsIGJldmFyYWQiCisKKyM6IG1lbWxpbmUuYzoxODEyCittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiBCZXZhcmluZyBtaXNzbHlja2FkZXMiCisKKyM6IG1lbWxpbmUuYzoxODgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogb2dpbHRpZ3QgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IGthbiBpbnRlIGhpdHRhIHJhZCAlbGQiCisKKyM6IG1lbWxpbmUuYzoyMjk5Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiBwZWthcmJsb2NrLWlkIGZlbCAzIgorCisjOiBtZW1saW5lLmM6MjM3OQorbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IHNrYSB2YXJhIDAiCisKKyM6IG1lbWxpbmUuYzoyNDQxCittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiBVcHBkYXRlcmFkZSBm9nIgbeVuZ2EgYmxvY2s/IgorCisjOiBtZW1saW5lLmM6MjYyMworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzogcGVrYXJibG9jay1pZCBmZWwgNCIKKworIzogbWVtbGluZS5jOjI2NTAKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICJ0YWdpdCBib3J0IGJsb2NrIDE/IgorCisjOiBtZW1saW5lLmM6Mjg1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogS2FuIGludGUgaGl0dGEgcmFkICVsZCIKKworIzogbWVtbGluZS5jOjMwOTMKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiBwZWthcmJsb2NrLWlkIGZlbCIKKworIzogbWVtbGluZS5jOjMxMDkKK21zZ2lkICJwZV9saW5lX2NvdW50IGlzIHplcm8iCittc2dzdHIgInBlX2xpbmVfY291bnQg5HIgbm9sbCIKKworIzogbWVtbGluZS5jOjMxMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiByYWRudW1tZXIgdXRhbmb2ciBvbXLlZGU6ICVsZCBiYWtvbSBzbHV0ZXQiCisKKyM6IG1lbWxpbmUuYzozMTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiByYWRhbnRhbCBmZWwgaSBibG9jayAlbGQiCisKKyM6IG1lbWxpbmUuYzozMTkxCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIlN0YWNrc3RvcmxlayD2a2FyIgorCisjOiBtZW1saW5lLmM6MzIzNworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogcGVrYXJibG9jay1pZCBmZWwgMiIKKworIzogbWVtbGluZS5jOjM2OTEKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IExZU1RSSU5HIgorCisjOiBtZW1saW5lLmM6MzY5MgorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIkhpdHRhZGUgZW4gduR4bGluZ3NmaWwgbWVkIG5hbW5ldCBcIiIKKworIzogbWVtbGluZS5jOjM2OTYKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIlZpZCD2cHBuaW5nIGF2IGZpbCBcIiIKKworIzogbWVtbGluZS5jOjM3MDUKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAgTllBUkUg5G4gduR4ZWxmaWwhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM3MDkKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgRXR0IGFubmF0IHByb2dyYW0ga2FuIHJlZGlnZXJhIHNhbW1hIGZpbC5cbiIKKyIgICAgT20gc+Ug5HIgZmFsbGV0LCB2YXIgZvZyc2lrdGlnIHPlIGF0dCBkZXQgaW50ZSBzbHV0YXIgbWVkIHR25VxuIgorIiAgICB2ZXJzaW9uZXIgYXYgc2FtbWEgZmlsIHZpZCBm9nLkbmRyaW5nYXIuXG4iCisKKyM6IG1lbWxpbmUuYzozNzEwCittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIEF2c2x1dGEsIGVsbGVyIGZvcnRz5HR0IHDlIGVnZW4gcmlzay5cbiIKKworIzogbWVtbGluZS5jOjM3MTEKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikgRW4gcmVkaWdlcmluZ3NzZXNzaW9uIGb2ciBkZW4gaORyIGZpbGVuIGtyYXNjaGFkZS5cbiIKKworIzogbWVtbGluZS5jOjM3MTIKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICBPbSBz5SDkciBmYWxsZXQsIGFuduRuZCBcIjpyZWNvdmVyXCIgZWxsZXIgXCJ2aW0gLXIgIgorCisjOiBtZW1saW5lLmM6MzcxNAorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIGb2ciBhdHQg5XRlcnNrYXBhIGb2cuRuZHJpbmdhcm5hIChzZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzcxNQorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICBPbSBkdSByZWRhbiBoYXIgZ2pvcnQgZGV0LCB0YSBib3J0IHbkeGxpbmdzZmlsZW4gXCIiCisKKyM6IG1lbWxpbmUuYzozNzE3Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIGb2ciBhdHQgdW5kdmlrYSBkZXQgaORyIG1lZGRlbGFuZGV0LlxuIgorCisjOiBtZW1saW5lLmM6MzczMSBtZW1saW5lLmM6MzczNQorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiVuR4bGluZ3NmaWwgXCIiCisKKyM6IG1lbWxpbmUuYzozNzMyIG1lbWxpbmUuYzozNzM4Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiBleGlzdGVyYXIgcmVkYW4hIgorCisjOiBtZW1saW5lLmM6Mzc0MQorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0gTFlTVFJJTkciCisKKyM6IG1lbWxpbmUuYzozNzQzCittc2dpZCAiU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiVuR4bGluZ3NmaWwgZXhpc3RlcmFyIHJlZGFuISIKKworIzogbWVtbGluZS5jOjM3NDcKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdCIKK21zZ3N0ciAiIgorIibWcHBuYSBza3JpdnNreWRkYWRcbiIKKyImUmVkaWdlcmEg5G5k5VxuIgorIibFdGVyc2thcGFcbiIKKyImQXZzbHV0YSIKKworIzogbWVtbGluZS5jOjM3NDkKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyIm1nBwbmEgc2tyaXZza3lkZGFkXG4iCisiJlJlZGlnZXJhIORuZOVcbiIKKyImxXRlcnNrYXBhXG4iCisiJkF2c2x1dGFcbiIKKyImVGEgYm9ydCBkZW4iCisKKyM6IG1lbWxpbmUuYzozODAyCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjogRvZyIG3lbmdhIHbkeGxpbmdzZmlsZXIgaGl0dGFkZSIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IERlbCBhdiBtZW55ZvZyZW3lbCBz9mt25Gcg5HIgaW50ZSB1bmRlcm1lbnkiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiBNZW55IGV4aXN0ZXJhciBiYXJhIGkgZXR0IGFubmF0IGzkZ2UiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiBJbmdlbiBtZW55IG1lZCBkZXQgbmFtbmV0IgorCisjOiBtZW51LmM6NTA5Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogTWVueXP2a3bkZyBm5XIgaW50ZSBsZWRhIHRpbGwgZW4gdW5kZXJtZW55IgorCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMTogTXVzdCBub3QgYWRkIG1lbnUgaXRlbXMgZGlyZWN0bHkgdG8gbWVudSBiYXIiCittc2dzdHIgIkUzMzE6IEblciBpbnRlIGzkZ2dhIHRpbGwgbWVueWb2cmVt5WwgZGlyZWt0IHRpbGwgbWVueXJhZCIKKworIzogbWVudS5jOjU1NAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogQXZza2lsamFyZSBrYW0gaW50ZSB2YXJhIGVuIGRlbCBhdiBlbiBtZW55c/ZrduRnIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDgxCittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gTWVueWVyIC0tLSIKKworIzogbWVudS5jOjE5OTgKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIlRhIGxvc3MgZGVuIGjkciBtZW55biIKKworIzogbWVudS5jOjIwNjMKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiBNZW55c/ZrduRnIG3lc3RlIGxlZGEgdGlsbCBldHQgbWVueWb2cmVt5WwiCisKKyM6IG1lbnUuYzoyMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogTWVueSBoaXR0YWRlcyBpbnRlOiAlcyIKKworIzogbWVudS5jOjIxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogTWVueSBpbnRlIGRlZmluaWVyYWQgZvZyICVzIGzkZ2UiCisKKyM6IG1lbnUuYzoyMTkwCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiBNZW55c/ZrduRnIG3lc3RlIGxlZGEgdGlsbCBlbiB1bmRlcm1lbnkiCisKKyM6IG1lbnUuYzoyMjExCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiBNZW55IGhpdHRhZGVzIGludGUgLSBrb250cm9sbGVyYSBtZW55bmFtbiIKKworIzogbWVzc2FnZS5jOjUxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAiRmVsIHVwcHTkY2t0ZXMgdmlkIGJlYXJiZXRuaW5nIGF2ICVzOiIKKworIzogbWVzc2FnZS5jOjUzNQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICJyYWQgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1NzUKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW3N0cuRuZyBm9nIgbOVuZ10iCisKKyM6IG1lc3NhZ2UuYzo3MjEKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiTWVkZGVsYW5kZWFuc3ZhcmlnOiBKb2hhbiBTdmVkYmVyZyA8am9oYW5Ac3ZlZGJlcmcucHAuc2U+IgorCisjOiBtZXNzYWdlLmM6OTQ1Cittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIkF2YnJvdHQ6ICIKKworIzogbWVzc2FnZS5jOjk0OAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAiVHJ5Y2sgUkVUVVIgZvZyIGF0dCBmb3J0c+R0dGEiCisKKyM6IG1lc3NhZ2UuYzo5NTAKK21zZ2lkICJIaXQgRU5URVIgb3IgdHlwZSBjb21tYW5kIHRvIGNvbnRpbnVlIgorbXNnc3RyICJUcnljayBSRVRVUiBlbGxlciBza3JpdiBrb21tYW5kbyBm9nIgYXR0IGZvcnRz5HR0YSIKKworIzogbWVzc2FnZS5jOjIyNTgKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSBNZXIgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMjYxCittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChFTlQvQlM6IHJhZCwgQkxBTktTVEVHL2I6IHNpZGEsIGQvdTogaGFsdiBzaWRhIHE6IGF2c2x1dGEiCisKKyM6IG1lc3NhZ2UuYzoyMjYyCittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKEVOVDogcmFkLCBCTEFOS1NURUc6IHNpZGEgZDogaGFsdiBzaWRhIHE6IGF2c2x1dGEpIgorCisjOiBtZXNzYWdlLmM6Mjg2OSBtZXNzYWdlLmM6Mjg4NAorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICJGcuVnYSIKKworIzogbWVzc2FnZS5jOjI4NzEKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZKYVxuIgorIiZOZWoiCisKKyM6IG1lc3NhZ2UuYzoyOTA0Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJkphXG4iCisiJk5lalxuIgorIiZTcGFyYSAmYWxsYVxuIgorIiZLYXN0YSBib3J0IGFsbGFcbiIKKyImQXZicnl0IgorCisjOiBtZXNzYWdlLmM6Mjk0NQorbXNnaWQgIlNhdmUgRmlsZSBkaWFsb2ciCittc2dzdHIgIkZpbHNwYXJhbmRlZGlhbG9nIgorCisjOiBtZXNzYWdlLmM6Mjk0NworbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIkZpbPZwcG5hbmRlZGlhbG9nIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjMwMTgKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODogVHl25HJyLCBpbmdlbiBmaWxibORkZHJhcmUgaSBrb25zb2xsLWzkZ2UiCisKKyM6IG1pc2MxLmM6MjY3OQorbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6IFZhcm5pbmc6IMRuZHJhciBlbiBza3JpdnNreWRkYWQgZmlsIgorCisjOiBtaXNjMS5jOjI5MTgKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAiMSByYWQgdGlsbCIKKworIzogbWlzYzEuYzoyOTIwCittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIjEgcmFkIG1pbmRyZSIKKworIzogbWlzYzEuYzoyOTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICIlbGQgcmFkIHRpbGwiCisKKyM6IG1pc2MxLmM6MjkyNworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIiVsZCBm5HJyZSByYWRlciIKKworIzogbWlzYzEuYzoyOTMwCittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAoQXZicnV0ZW4pIgorCisjOiBtaXNjMS5jOjY2MDIKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiBiZXZhcmFyIGZpbGVyLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo2NjEyCittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiBG5HJkaWcuXG4iCisKKyM6IG1pc2MyLmM6NjcwIG1pc2MyLmM6Njg2Cittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAiRkVMOiAiCisKKyM6IG1pc2MyLmM6NjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW2JpdGFyXSBzYW1tYW5sYWdkIGFsbG9rLWZyaWdqb3JkICVsdS0lbHUsIGkgYW525G5kbmluZyAlbHUsIHRvcHBhbnbkbmRuaW5nICUiCisibHVcbiIKKworIzogbWlzYzIuYzo2OTIKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbYW5yb3BdIHNhbW1hbmxhZ2RhIG9tL21hbGxvYygpJ3MgJWx1LCBzYW1tYW5sYWdkYSBmcmVlKCkncyAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NDcKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiBSYWQgYvZyamFyIGJsaSBm9nIgbOVuZyIKKworIzogbWlzYzIuYzo3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IEludGVybnQgZmVsOiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjg5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogU2x1dCBw5SBtaW5uZSEgIChhbGxva2VyYXIgJWx1IGJpdGFyKSIKKworIzogbWlzYzIuYzoyNTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICJBbnJvcGFyIHNrYWwgYXR0IGv2cmE6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyNzg3Cittc2dpZCAiRTU0NTogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU0NTogU2FrbmFyIGtvbG9uIgorCisjOiBtaXNjMi5jOjI3ODkgbWlzYzIuYzoyODE2Cittc2dpZCAiRTU0NjogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFNTQ2OiBPdGlsbOV0ZXQgbORnZSIKKworIzogbWlzYzIuYzoyODU1Cittc2dpZCAiRTU0NzogSWxsZWdhbCBtb3VzZXNoYXBlIgorbXNnc3RyICJFNTQ3OiBPdGlsbOV0ZW4gbXVzZm9ybSIKKworIzogbWlzYzIuYzoyODk1Cittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IHNpZmZyYSBm9nJ25G50YWRlcyIKKworIzogbWlzYzIuYzoyOTAwCittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiBPdGlsbOV0ZW4gcHJvY2VudHNhdHMiCisKKyM6IG1pc2MyLmM6MzIxMAorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIkFuZ2Uga3J5cHRlcmluZ3NueWNrZWw6ICIKKworIzogbWlzYzIuYzozMjExCittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAiQW5nZSBzYW1tYSBueWNrZWwgaWdlbjogIgorCisjOiBtaXNjMi5jOjMyMjEKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAiTnlja2xhciBtYXRjaGFyIGludGUhIgorCisjOiBtaXNjMi5jOjM3NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiBPZ2lsdGlnIHP2a3bkZzogJyoqW251bW1lcl0nIG3lc3RlIHZhcmEgaSBzbHV0ZXQgcOUgc/ZrduRnZW4gZWxsZXIgIgorImb2bGphcyBhdiAnJXMnLiIKKworIzogbWlzYzIuYzo1MDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IEthbiBpbnRlIGhpdHRhIGthdGFsb2cgXCIlc1wiIGkgY2RwYXRoIgorCisjOiBtaXNjMi5jOjUwNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiBLYW4gaW50ZSBoaXR0YSBmaWwgXCIlc1wiIGkgc/ZrduRnIgorCisjOiBtaXNjMi5jOjUwNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogSW5nZW4ga2F0YWxvZyBcIiVzXCIgaGl0dGFkZXMgaSBjZHBhdGgiCisKKyM6IG1pc2MyLmM6NTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IEluZ2VuIGZpbCBcIiVzXCIgaGl0dGFkZXMgaSBz9mt25GdlbiIKKworIzogbWlzYzIuYzo1Mjk1Cittc2dpZCAiRTU1MDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU1MDogU2FrbmFyIGtvbG9uIgorCisjOiBtaXNjMi5jOjUzMDcKK21zZ2lkICJFNTUxOiBJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAiRTU1MTogT3RpbGzldGVuIGtvbXBvbmVudCIKKworIzogbWlzYzIuYzo1MzE1Cittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IHNpZmZyYSBm9nJ25G50YWRlcyIKKworIy4gR2V0IGhlcmUgd2hlbiB0aGUgc2VydmVyIGNhbid0IGJlIGZvdW5kLgorIzogbmV0YmVhbnMuYzozNDYKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyAjMiIKK21zZ3N0ciAiS2FuIGludGUgYW5zbHV0YSB0aWxsIE5ldGJlYW5zICMyIgorCisjOiBuZXRiZWFucy5jOjM1NAorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zIgorbXNnc3RyICJLYW4gaW50ZSBhbnNsdXRhIHRpbGwgTmV0YmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6NjMzCittc2dpZCAicmVhZCBmcm9tIE5ldGJlYW5zIHNvY2tldCIKK21zZ3N0ciAibORzIGZy5W4gTmV0YmVhbnMtdXR0YWciCisKKyM6IG5vcm1hbC5jOjI5NDQKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICJWYXJuaW5nOiB0ZXJtaW5hbCBrYW4gaW50ZSBmcmFtaOR2YSIKKworIzogbm9ybWFsLmM6MzE1OQorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IEluZ2VuIHN0cuRuZyB1bmRlciBtYXJr9nIiCisKKyM6IG5vcm1hbC5jOjMxNjEKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTogSW5nZW4gaWRlbnRpZmllcmFyZSB1bmRlciBtYXJr9nIiCisKKyM6IG5vcm1hbC5jOjQzNzkKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogS2FuIGludGUgdGEgYm9ydCB2ZWNrIG1lZCBha3R1ZWxsICdmb2xkbWV0aG9kJyIKKworIzogbm9ybWFsLmM6NzgwMgorbXNnaWQgIlR5cGUgIDpxdWl0PEVudGVyPiAgdG8gZXhpdCBWaW0iCittc2dzdHIgInNrcml2ICA6cTxFbnRlcj4gICAgICAgICAgICAgICAgZvZyIGF0dCBhdnNsdXRhIFZpbSAgICAgICAgICIKKworIzogb3BzLmM6Mjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAiMSByYWQgJXNhZCAxIGflbmciCisKKyM6IG9wcy5jOjI5NworIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiMSByYWQgJXNhZGUgJWQgZ+VuZ2VyIgorCisjOiBvcHMuYzozMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQgcmFkZXIgJXNhZCAxIGflbmciCisKKyM6IG9wcy5jOjMwNQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkIHJhZGVyICVzYWRlICVkIGflbmdlciIKKworIzogb3BzLmM6NjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICIlbGQgcmFkZXIgYXR0IGluZGVudGVyYS4uLiAiCisKKyM6IG9wcy5jOjcxMworbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIjEgcmFkIGluZGVudGVyYWQgIgorCisjOiBvcHMuYzo3MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGluZGVudGVkICIKK21zZ3N0ciAiJWxkIHJhZGVyIGluZGVudGVyYWRlICIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE2NDcKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAia2FuIGludGUga29waWVyYTsgdGEgYm9ydCDkbmTlIgorCisjOiBvcHMuYzoyMTU1Cittc2dpZCAiMSBsaW5lIGNoYW5nZWQiCittc2dzdHIgIjEgcmFkIORuZHJhZCIKKworIzogb3BzLmM6MjE1NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiJWxkIHJhZGVyIORuZHJhZGUiCisKKyM6IG9wcy5jOjI1NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgImZyaWf2ciAlbGQgcmFkZXIiCisKKyM6IG9wcy5jOjI4MjIKK21zZ2lkICIxIGxpbmUgeWFua2VkIgorbXNnc3RyICIxIHJhZCBrb3BpZXJhZCIKKworIzogb3BzLmM6MjgyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICIlbGQgcmFkZXIga29waWVyYWRlIgorCisjOiBvcHMuYzozMTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IEluZ2VudGluZyBpIHJlZ2lzdGVyICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM2NjAKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXIgLS0tIgorCisjOiBvcHMuYzo0ODc1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICJPdGlsbOV0ZXQgcmVnaXN0ZXJuYW1uIgorCisjOiBvcHMuYzo0OTYxCittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBSZWdpc3RlcjpcbiIKKworIzogb3BzLmM6NDk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc0OiBVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIkU1NzQ6IE9r5G5kIHJlZ2lzdGVydHlwICVkIgorCisjOiBvcHMuYzo1NDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogT3RpbGzldGV0IHJlZ2lzdGVybmFtbjogJyVzJyIKKworIzogb3BzLmM6NTg0MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgQ29sczsgIgorbXNnc3RyICIlbGQga29sdW1uZXI7ICIKKworIzogb3BzLmM6NTg0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIk1hcmtlcmFkZSAlcyVsZCBhdiAlbGQgcmFkZXI7ICVsZCBhdiAlbGQgb3JkOyAlbGQgYXYgJWxkIGJpdGFyIgorCisjOiBvcHMuYzo1ODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAiS29sICVzIGF2ICVzOyByYWQgJWxkIGF2ICVsZDsgb3JkICVsZCBhdiAlbGQ7IGJpdCAlbGQgYXYgJWxkIgorCisjOiBvcHMuYzo1ODc0CisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBm9nIgQk9NKSIKKworIzogb3B0aW9uLmM6MTYzMworbXNnaWQgIiU8JWYlaCVtJT1QYWdlICVOIgorbXNnc3RyICIlPCVmJWglbSU9U2lkYSAlTiIKKworIzogb3B0aW9uLmM6MjA4MgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAiVGFjayBm9nIgYXR0IGR1IGZseWdlciBtZWQgVmltIgorCisjOiBvcHRpb24uYzozMzU0IG9wdGlvbi5jOjM0NjEKK21zZ2lkICJFNTE4OiBVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAiRTUxODogT2vkbmQgZmxhZ2dhIgorCisjOiBvcHRpb24uYzozMzY3Cittc2dpZCAiRTUxOTogT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkU1MTk6IEZsYWdnYSBpbnRlIHN09mRkIgorCisjOiBvcHRpb24uYzozMzkyCittc2dpZCAiRTUyMDogTm90IGFsbG93ZWQgaW4gYSBtb2RlbGluZSIKK21zZ3N0ciAiRTUyMDogSW50ZSB0aWxs5XRldCBpIGVuIGzkZ2VzcmFkIgorCisjOiBvcHRpb24uYzozNDQ4Cittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdFNlbmFzdCBzYXR0IGZy5W4gIgorCisjOiBvcHRpb24uYzozNTg3Cittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6IE51bW1lciBrcuR2cyBlZnRlciA9IgorCisjOiBvcHRpb24uYzozOTE0IG9wdGlvbi5jOjQ1MzEKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogSW50ZSBoaXR0YXQgaSB0ZXJtY2FwIgorCisjOiBvcHRpb24uYzozOTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IE90aWxs5XRldCB0ZWNrZW4gPCVzPiIKKworIzogb3B0aW9uLmM6NDUyMworbXNnaWQgIkU1Mjk6IENhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUyOTogS2FuIGludGUgc+R0dGEgJ3Rlcm0nIHRpbGwgdG9tIHN0cuRuZyIKKworIzogb3B0aW9uLmM6NDUyNgorbXNnaWQgIkU1MzA6IENhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIkU1MzA6IEthbiBpbnRlIORuZHJhIHRlcm0gaSBHVUkiCisKKyM6IG9wdGlvbi5jOjQ1MjgKK21zZ2lkICJFNTMxOiBVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTUzMTogQW525G5kIFwiOmd1aVwiIGb2ciBhdHQgc3RhcnRhIEdVSSIKKworIzogb3B0aW9uLmM6NDU0OQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXB0ZXh0JyBvY2ggJ3BhdGNobW9kZScg5HIgbGlrYSIKKworIzogb3B0aW9uLmM6NDczNAorbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiBLYW4gaW50ZSBibGkg5G5kcmF0IGkgR1RLKyAyLUdVSSIKKworIzogb3B0aW9uLmM6NDg5MAorbXNnaWQgIkU1MjQ6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1MjQ6IFNha25hciBrb2xvbiIKKworIzogb3B0aW9uLmM6NDg5MgorbXNnaWQgIkU1MjU6IFplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiRTUyNTogTm9sbORuZ2Rzc3Ry5G5nIgorCisjOiBvcHRpb24uYzo0OTYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1MjY6IE1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIkU1MjY6IFNha25hciBudW1tZXIgZWZ0ZXIgPCVzPiIKKworIzogb3B0aW9uLmM6NDk3NAorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IFNha25hciBrb21tYSIKKworIzogb3B0aW9uLmM6NDk4MQorbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IE3lc3RlIGFuZ2UgZXR0ICctduRyZGUiCisKKyM6IG9wdGlvbi5jOjUwMjIKK21zZ2lkICJFNTk1OiBjb250YWlucyB1bnByaW50YWJsZSBvciB3aWRlIGNoYXJhY3RlciIKK21zZ3N0ciAiRTU5NTogaW5uZWjlbGxlciBvdXRza3JpdmJhcmEgZWxsZXIgYnJlZGEgdGVja2VuIgorCisjOiBvcHRpb24uYzo1MDcxCittc2dpZCAiRTU5NjogSW52YWxpZCBmb250KHMpIgorbXNnc3RyICJFNTk2OiBPZ2lsdGlnKGEpIHR5cHNuaXR0IgorCisjOiBvcHRpb24uYzo1MDc5Cittc2dpZCAiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIkU1OTc6IGthbiBpbnRlIHbkbGphIHR5cHNuaXR0c3VwcHPkdHRuaW5nIgorCisjOiBvcHRpb24uYzo1MDgxCittc2dpZCAiRTU5ODogSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJFNTk4OiBPZ2lsdGlnIHR5cHNuaXR0c3VwcHPkdHRuaW5nIgorCisjOiBvcHRpb24uYzo1MDg4Cittc2dpZCAiRTUzMzogY2FuJ3Qgc2VsZWN0IHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzMzoga2FuIGludGUgduRsamEgYnJldHQgdHlwc25pdHQiCisKKyM6IG9wdGlvbi5jOjUwOTAKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDogT2dpbHRpZ3QgYnJldHQgdHlwc25pdHQiCisKKyM6IG9wdGlvbi5jOjUzNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogT3RpbGzldGV0IHRlY2tlbiBlZnRlciA8JWM+IgorCisjOiBvcHRpb24uYzo1NDY1Cittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6IGtvbW1hIGty5HZzIgorCisjOiBvcHRpb24uYzo1NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBt5XN0ZSB2YXJhIHRvbSBlbGxlciBpbm5laOVsbGEgJXMiCisKKyM6IG9wdGlvbi5jOjU1NDgKK21zZ2lkICJFNTM4OiBObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICJFNTM4OiBJbmdldCBtdXNzdPZkIgorCisjOiBvcHRpb24uYzo1ODE2Cittc2dpZCAiRTU0MDogVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAiRTU0MDogT3N05G5nZCB1dHRyeWNrc3Nla3ZlbnMiCisKKyM6IG9wdGlvbi5jOjU4MjAKK21zZ2lkICJFNTQxOiB0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAiRTU0MTogZvZyIG3lbmdhIGb2cmVt5WwiCisKKyM6IG9wdGlvbi5jOjU4MjIKK21zZ2lkICJFNTQyOiB1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAiRTU0Mjogb2JhbGFuc2VyYWRlIGdydXBwZXIiCisKKyM6IG9wdGlvbi5jOjYwNjIKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiBFdHQgZvZyaGFuZHN2aXNuaW5nc2b2bnN0ZXIgZXhpc3RlcmFyIHJlZGFuIgorCisjOiBvcHRpb24uYzo2MzE5Cittc2dpZCAiVzE3OiBBcmFiaWMgcmVxdWlyZXMgVVRGLTgsIGRvICc6c2V0IGVuY29kaW5nPXV0Zi04JyIKK21zZ3N0ciAiVzE3OiBBcmFiaXNrYSBrcuR2ZXIgVVRGLTgsIGf2ciAnOnNldCBlbmNvZGluZz11dGYtOCciCisKKyM6IG9wdGlvbi5jOjY2MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAiRTU5MzogQmVo9nZlciDldG1pbnN0b25lICVkIHJhZGVyIgorCisjOiBvcHRpb24uYzo2NjQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDogQmVo9nZlciDldG1pbnN0b25lICVkIGtvbHVtbmVyIgorCisjOiBvcHRpb24uYzo2OTUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogT2vkbmQgZmxhZ2dhOiAlcyIKKworIzogb3B0aW9uLmM6NzA2MAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwgY29kZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRlcm1pbmFsa29kZXIgLS0tIgorCisjOiBvcHRpb24uYzo3MDYyCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gR2xvYmFsYSBmbGFnZ3bkcmRlbiAtLS0iCisKKyM6IG9wdGlvbi5jOjcwNjQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIExva2FsYSBmbGFnZ3bkcmRlbiAtLS0iCisKKyM6IG9wdGlvbi5jOjcwNjYKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEZsYWdnb3IgLS0tIgorCisjOiBvcHRpb24uYzo3NzY3Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwLUZFTCIKKworIzogb3B0aW9uLmM6ODczOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGFuZGUgdGVja2VuIHNha25hcyBm9nIgJXMiCisKKyM6IG9wdGlvbi5jOjg3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgdGVja2VuIGVmdGVyIHNlbWlrb2xvbjogJXMiCisKKyM6IG9zX2FtaWdhLmM6Mjc1Cittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICJrYW4gaW50ZSD2cHBuYSAiCisKKyM6IG9zX2FtaWdhLmM6MzA5Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiBLYW4gaW50ZSD2cHBuYSBm9m5zdGVyIVxuIgorCisjOiBvc19hbWlnYS5jOjMzMworbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIkJlaPZ2ZXIgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IGVsbGVyIHNlbmFyZVxuIgorCisjOiBvc19hbWlnYS5jOjMzOQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIkJlaPZ2ZXIgJXMgdmVyc2lvbiAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MTEKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIkthbiBpbnRlIPZwcG5hIE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MjIKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAiS2FuIGludGUgc2thcGEgIgorCisjOiBvc19hbWlnYS5jOjkwMAorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSBhdnNsdXRhciBtZWQgJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MzIKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICJrYW4gaW50ZSDkbmRyYSBrb25zb2xsLWzkZ2UgPyFcbiIKKworIzogb3NfYW1pZ2EuYzo5OTgKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiBpbnRlIGVuIGtvbnNvbGw/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTQ3Cittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IEthbiBpbnRlIGv2cmEgc2thbCBtZWQgLWYtZmxhZ2dhIgorCisjOiBvc19hbWlnYS5jOjExODggb3NfYW1pZ2EuYzoxMjc4Cittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICJLYW4gaW50ZSBr9nJhICIKKworIzogb3NfYW1pZ2EuYzoxMTkxIG9zX2FtaWdhLmM6MTI4OAorbXNnaWQgInNoZWxsICIKK21zZ3N0ciAic2thbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIxMSBvc19hbWlnYS5jOjEzMTMKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIHJldHVybmVyYWRlXG4iCisKKyM6IG9zX2FtaWdhLmM6MTQ1NAorbXNnaWQgIkFOQ0hPUl9CVUZfU0laRSB0b28gc21hbGwuIgorbXNnc3RyICJBTkNIT1JfQlVGX1NJWkUgZvZyIGxpdGVuLiIKKworIzogb3NfYW1pZ2EuYzoxNDU4Cittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08tRkVMIgorCisjOiBvc19tc3dpbi5jOjUyNQorbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4odHJ1bmtlcmFkZSkiCisKKyM6IG9zX21zd2luLmM6NjI3Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyDkciBpbnRlIDgwLCBrYW4gaW50ZSBr9nJhIGV4dGVybmEga29tbWFuZG9uIgorCisjOiBvc19tc3dpbi5jOjE4NjYKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IFNrcml2YXJ2YWwgbWlzc2x5Y2thZGVzIgorCisjOiBvc19tc3dpbi5jOjE5MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgInRpbGwgJXMgcOUgJXMiCisKKyM6IG9zX21zd2luLmM6MTkyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IE9r5G50IHNrcml2YXJ0eXBzbml0dDogJXMiCisKKyM6IG9zX21zd2luLmM6MTk3MSBvc19tc3dpbi5jOjE5ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiBTa3JpdmFyZmVsOiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTgyCittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAiT2vkbmQiCisKKyM6IG9zX21zd2luLmM6MjAwOQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICJTa3JpdmVyIHV0ICclcyciCisKKyM6IG9zX21zd2luLmM6MzA5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDogT3RpbGzldGV0IHRlY2tlbmtvZHNuYW1uIFwiJXNcIiBpIHR5cHNuaXR0c25hbW4gXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjMxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogT3RpbGzldGV0IHRlY2tlbiAnJWMnIGkgdHlwc25pdHRzbmFtbiBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyNTgKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiBPZ2lsdGlnICdvc2ZpbGV0eXBlJy1mbGFnZ2EgLSBhbnbkbmRlciBUZXh0IgorCisjOiBvc191bml4LmM6ODk3Cittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogRHViYmVsc2lnbmFsLCBhdnNsdXRhclxuIgorCisjOiBvc191bml4LmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWwgJXNcbiIKK21zZ3N0ciAiVmltOiBG5W5nYWRlIGT2ZGxpZyBzaWduYWwgJXNcbiIKKworIzogb3NfdW5peC5jOjkwNgorbXNnaWQgIlZpbTogQ2F1Z2h0IGRlYWRseSBzaWduYWxcbiIKK21zZ3N0ciAiVmltOiBG5W5nYWRlIGT2ZGxpZyBzaWduYWxcbiIKKworIzogb3NfdW5peC5jOjExNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRvb2sgJWxkIG1zZWMiCittc2dzdHIgItZwcG5pbmcgYXYgWC1kaXNwbGF5IHRvZyAlbGQgbXMiCisKKyM6IG9zX3VuaXguYzoxMTk2Cittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZpbTogRmljayBYLWVycm9yXG4iCisKKyM6IG9zX3VuaXguYzoxMzA0Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAiVGVzdG5pbmcgYXYgWC1kaXNwbGF5ZW4gbWlzc2x5Y2thZGVzIgorCisjOiBvc191bml4LmM6MTQ0MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgItZwcG5pbmcgYXYgWC1kaXNwbGF5ZW4gdG9nIGb2ciBs5W5nIHRpZCIKKworIzogb3NfdW5peC5jOjMxOTAgb3NfdW5peC5jOjM4NzAKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisiS2FuIGludGUga/ZyYSBza2FsICIKKworIzogb3NfdW5peC5jOjMyMzgKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIkthbiBpbnRlIGv2cmEgc2thbCBzaFxuIgorCisjOiBvc191bml4LmM6MzI0MiBvc191bml4LmM6Mzg3NgorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJza2FsIHJldHVybmVyYWRlICIKKworIzogb3NfdW5peC5jOjMzNzcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisiS2FuIGludGUgc2thcGEgcvZyXG4iCisKKyM6IG9zX3VuaXguYzozMzkyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyJLYW4gaW50ZSBncmVuYVxuIgorCisjOiBvc191bml4LmM6Mzg4MworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIktvbW1hbmRvIGF2c2x1dGFkZXNcbiIKKworIzogb3NfdW5peC5jOjQxNDcgb3NfdW5peC5jOjQyNzIgb3NfdW5peC5jOjU5MzMKK21zZ2lkICJYU01QIGxvc3QgSUNFIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAgdGFwcGFkZSBJQ0UtYW5zbHV0bmluZyIKKworIzogb3NfdW5peC5jOjU1MTYKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICLWcHBuaW5nIGF2IFgtZGlzcGxheWVuIG1pc3NseWNrYWRlcyIKKworIzogb3NfdW5peC5jOjU4MzgKK21zZ2lkICJYU01QIGhhbmRsaW5nIHNhdmUteW91cnNlbGYgcmVxdWVzdCIKK21zZ3N0ciAiWFNNUCBoYW50ZXJhciBzcGFyYS1zauRsdi1m9nJmcuVnYW4iCisKKyM6IG9zX3VuaXguYzo1OTU3Cittc2dpZCAiWFNNUCBvcGVuaW5nIGNvbm5lY3Rpb24iCittc2dzdHIgIlhTTVAg9nBwbmFyIGFuc2x1dG5pbmciCisKKyM6IG9zX3VuaXguYzo1OTc2Cittc2dpZCAiWFNNUCBJQ0UgY29ubmVjdGlvbiB3YXRjaCBmYWlsZWQiCittc2dzdHIgIlhTTVAgSUNFLWFuc2x1dG5pbmcg9nZlcnZha25pbmcgbWlzc2x5Y2thZGVzIgorCisjOiBvc191bml4LmM6NTk5NgorIywgYy1mb3JtYXQKK21zZ2lkICJYU01QIFNtY09wZW5Db25uZWN0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIlhTTVAgU21jT3BlbkNvbm5lY3Rpb24gbWlzc2x5Y2thZGVzOiAlcyIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAiUOUgcmFkIgorCisjOiBvc193MzJleGUuYzo2NQorbXNnaWQgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZS4iCittc2dzdHIgIkt1bmRlIGludGUgYWxsb2tlcmEgbWlubmUgZvZyIGtvbW1hbmRvcmFkLiIKKworIzogb3NfdzMyZXhlLmM6NjYgb3NfdzMyZXhlLmM6ODkgb3NfdzMyZXhlLmM6MTAwCittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJWSU0tZmVsIgorCisjOiBvc193MzJleGUuYzo4OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIkt1bmRlIGludGUgbORzYSBpbiB2aW0zMi5kbGwhIgorCisjOiBvc193MzJleGUuYzo5OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIkt1bmRlIGludGUgb3JkbmEgdXBwIGZ1bmt0aW9uc3Bla2FyZSB0aWxsIERMTDplbiEiCisKKyM6IG9zX3dpbjE2LmM6MzQxIG9zX3dpbjMyLmM6MzA2NAorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAic2thbCByZXR1cm5lcmFkZSAlZCIKKworIzogb3Nfd2luMzIuYzoyNTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTogRuVuZ2FkZSAlcy1o5G5kZWxzZVxuIgorCisjOiBvc193aW4zMi5jOjI1MjQKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAic3TkbmciCisKKyM6IG9zX3dpbjMyLmM6MjUyNgorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAibG9nZ2EgdXQiCisKKyM6IG9zX3dpbjMyLmM6MjUyNworbXNnaWQgInNodXRkb3duIgorbXNnc3RyICJzdORuZyBhdiIKKworIzogb3Nfd2luMzIuYzozMDE3Cittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IEtvbW1hbmRvIGhpdHRhZGVzIGludGUiCisKKyM6IG9zX3dpbjMyLmM6MzAzMAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIlZJTVJVTi5FWEUgaGl0dGFkZXMgaW50ZSBpIGRpbiAkUEFUSC5cbiIKKyJFeHRlcm5hIGtvbW1hbmRvbiB2aWxsIGludGUgc3TlIHN0aWxsYSBlZnRlciBm5HJkaWdzdORsbG5pbmcuXG4iCisiU2UgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZvZyIG1lciBpbmZvcm1hdGlvbi4iCisKKyM6IG9zX3dpbjMyLmM6MzAzMworbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWaW0tdmFybmluZyIKKworIzogcXVpY2tmaXguYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiBG9nIgbeVuZ2EgJSUlYyBpIGZvcm1hdHN0cuRuZyIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6IE925G50YWQgJSUlYyBpIGZvcm1hdHN0cuRuZyIKKworIzogcXVpY2tmaXguYzozMjUKK21zZ2lkICJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NDogU2FrbmFyIF0gaSBmb3JtYXRzdHLkbmciCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogT3N09mRkICUlJWMgaSBmb3JtYXRzdHLkbmciCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjogT2dpbHRpZyAlJSVjIGkgZm9ybWF0c3Ry5G5ncHJlZml4IgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzogT2dpbHRpZyAlJSVjIGkgZm9ybWF0c3Ry5G5nIgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogJ2Vycm9yZm9ybWF0JyBpbm5laOVsbGVyIGluZ2EgbfZuc3RlciIKKworIzogcXVpY2tmaXguYzo1MDEKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiBTYWtuYXIgZWxsZXIgdG9tdCBrYXRhbG9nbmFtbiIKKworIzogcXVpY2tmaXguYzo5ODgKK21zZ2lkICJFNTUzOiBObyBtb3JlIGl0ZW1zIgorbXNnc3RyICJFNTUzOiBJbmdhIGZsZXIgZvZyZW3lbCIKKworIzogcXVpY2tmaXguYzoxMjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCBhdiAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTIyNworbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiIChyYWQgYm9ydHRhZ2VuKSIKKworIzogcXVpY2tmaXguYzoxNDQwCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBQ5SBib3R0ZW4gYXYgcXVpY2tmaXgtc3RhY2siCisKKyM6IHF1aWNrZml4LmM6MTQ0OQorbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogUOUgdG9wcGVuIGF2IHF1aWNrZml4LXN0YWNrIgorCisjOiBxdWlja2ZpeC5jOjE0NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICJmZWxsaXN0YSAlZCBhdiAlZDsgJWQgZmVsIgorCisjOiBxdWlja2ZpeC5jOjE5MzkKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiBLYW4gaW50ZSBza3JpdmEsICdidWZ0eXBlJy1mbGFnZ2Eg5HIgc2F0dCIKKworIzogcmVnZXhwLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjk6IGludmFsaWQgaXRlbSBpbiAlcyUlW10iCittc2dzdHIgIkUzNjk6IG9naWx0aWd0IGb2cmVt5WwgaSAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjgyNworbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IE32bnN0ZXIgZvZyIGzlbmd0IgorCisjOiByZWdleHAuYzo5OTYKK21zZ2lkICJFNTA6IFRvbyBtYW55IFxceigiCittc2dzdHIgIkU1MDogRvZyIG3lbmdhIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxOiBUb28gbWFueSAlcygiCittc2dzdHIgIkU1MTogRvZyIG3lbmdhICVzKCIKKworIzogcmVnZXhwLmM6MTA2NAorbXNnaWQgIkU1MjogVW5tYXRjaGVkIFxceigiCittc2dzdHIgIkU1MjogT21hdGNoYWRlIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1MzogT21hdGNoYWRlICVzJSUoIgorCisjOiByZWdleHAuYzoxMDcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiBPbWF0Y2hhZGUgJXMoIgorCisjOiByZWdleHAuYzoxMDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTogVW5tYXRjaGVkICVzKSIKK21zZ3N0ciAiRTU1OiBPbWF0Y2hhZGUgJXMpIgorCisjOiByZWdleHAuYzoxMjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NjogJXMqLW9wZXJhbmQga2FuIHZhcmEgdG9tIgorCisjOiByZWdleHAuYzoxMjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzogJXMrIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NzogJXMrLW9wZXJhbmQga2FuIHZhcmEgdG9tIgorCisjOiByZWdleHAuYzoxMzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTogaW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXNAIgorbXNnc3RyICJFNTk6IG9naWx0aWd0IHRlY2tlbiBlZnRlciAlc0AiCisKKyM6IHJlZ2V4cC5jOjEzMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU4OiAlc3stb3BlcmFuZCBrYW4gdmFyYSB0b20iCisKKyM6IHJlZ2V4cC5jOjEzMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYwOiBUb28gbWFueSBjb21wbGV4ICVzey4uLn1zIgorbXNnc3RyICJFNjA6IEb2ciBt5W5nYSBrb21wbGV4YSAlc3suLi59cyIKKworIzogcmVnZXhwLmM6MTM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogTuRzdGxhZGUgJXMqIgorCisjOiByZWdleHAuYzoxMzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MjogTmVzdGVkICVzJWMiCittc2dzdHIgIkU2MjogTuRzdGxhZGUgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ3MworbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IG9naWx0aWcgYW525G5kbmluZyBhdiBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIGb2bGplciBpbmdlbnRpbmciCisKKyM6IHJlZ2V4cC5jOjE1NzQKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogT3RpbGzldGVuIGJha+V0cmVmZXJlbnMiCisKKyM6IHJlZ2V4cC5jOjE1ODcKK21zZ2lkICJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY2OiBcXHp7IGludGUgdGlsbOV0ZXQgaORyIgorCisjOiByZWdleHAuYzoxNjA2Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgbS5mbC4gaW50ZSB0aWxs5XRldCBo5HIiCisKKyM6IHJlZ2V4cC5jOjE2MTcKK21zZ2lkICJFNjg6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxceiIKK21zZ3N0ciAiRTY4OiBPZ2lsdGlndCB0ZWNrZW4gZWZ0ZXIgXFx6IgorCisjOiByZWdleHAuYzoxNjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2OTogTWlzc2luZyBdIGFmdGVyICVzJSVbIgorbXNnc3RyICJFNjk6IFNha25hciBdIGVmdGVyICVzJSVbIgorCisjOiByZWdleHAuYzoxNjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MDogRW1wdHkgJXMlJVtdIgorbXNnc3RyICJFNzA6IFRvbSAlcyUlW10iCisKKyM6IHJlZ2V4cC5jOjE3NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIgorbXNnc3RyICJFNzE6IE9naWx0aWd0IHRlY2tlbiBlZnRlciAlcyUlIgorCisjOiByZWdleHAuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTQ6IFN5bnRheCBlcnJvciBpbiAlc3suLi59IgorbXNnc3RyICJFNTU0OiBTeW50YXhmZWwgaSAlc3suLi59IgorCisjOiByZWdleHAuYzoyODAwCittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6IEtyYXNjaCBoZWpkYWQ7IHJlZ3VsauRydCB1dHRyeWNrIGb2ciBrb21wbGV4dD8iCisKKyM6IHJlZ2V4cC5jOjI5NDEKK21zZ2lkICJFMzYzOiBwYXR0ZXJuIGNhdXNlZCBvdXQtb2Ytc3RhY2sgZXJyb3IiCittc2dzdHIgIkUzNjM6IG32bnN0ZXIgb3JzYWthZGUgc2x1dC1w5S1zdGFjay1mZWwiCisKKyM6IHJlZ2V4cC5jOjMxODAKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICJFeHRlcm5hIHVuZGVydHLkZmZhcjpcbiIKKworIzogc2NyZWVuLmM6MjExNQorIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLSUzbGQgcmFkZXIgdmlrdGEgIgorCisjOiBzY3JlZW4uYzo3ODkyCittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgVkVSU8RUVCIKKworIzogc2NyZWVuLmM6Nzg5NgorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIgRVJTxFRUIgorCisjOiBzY3JlZW4uYzo3OTAxCittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiBPTVbETkQiCisKKyM6IHNjcmVlbi5jOjc5MDMKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgSU5GT0dBIgorCisjOiBzY3JlZW4uYzo3OTA2Cittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKGluZm9nYSkiCisKKyM6IHNjcmVlbi5jOjc5MDgKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKGVyc+R0dCkiCisKKyM6IHNjcmVlbi5jOjc5MTAKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2ZXJz5HR0KSIKKworIzogc2NyZWVuLmM6NzkxMworbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBIZWJyZWlza2EiCisKKyM6IHNjcmVlbi5jOjc5MjQKK21zZ2lkICIgQXJhYmljIgorbXNnc3RyICIgQXJhYmlza2EiCisKKyM6IHNjcmVlbi5jOjc5MjcKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKHNwcuVrKSIKKworIzogc2NyZWVuLmM6NzkzMQorbXNnaWQgIiAocGFzdGUpIgorbXNnc3RyICIgKGtsaXN0cmEgaW4pIgorCisjOiBzY3JlZW4uYzo3OTM3Cittc2dpZCAiIFNFTEVDVCIKK21zZ3N0ciAiIE1BUktFUkEiCisKKyM6IHNjcmVlbi5jOjc5MzkKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIgVklTVUVMTCIKKworIzogc2NyZWVuLmM6Nzk0MQorbXNnaWQgIiBCTE9DSyIKK21zZ3N0ciAiIEJMT0NLIgorCisjOiBzY3JlZW4uYzo3OTQzCittc2dpZCAiIExJTkUiCittc2dzdHIgIiBSQUQiCisKKyM6IHNjcmVlbi5jOjc5NTYgc2NyZWVuLmM6ODAxNgorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAic3BlbGFyIGluIgorCisjOiBzZWFyY2guYzozNgorbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAic/ZrbmluZyBu5WRkZSBUT1BQRU4sIGZvcnRz5HR0ZXIgdmlkIEJPVFRFTiIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgInP2a25pbmcgbuVkZGUgQk9UVEVOLCBmb3Jz5HR0ZXIgdmlkIFRPUFBFTiIKKworIzogc2VhcmNoLmM6NTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiCittc2dzdHIgIkUzODM6IE9naWx0aWcgc/Zrc3Ry5G5nOiAlcyIKKworIzogc2VhcmNoLmM6ODUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDogc/ZrbmluZyBu5WRkZSBUT1BQRU4gdXRhbiB0cuRmZiBhdjogJXMiCisKKyM6IHNlYXJjaC5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IHP2a25pbmcgbuVkZGUgQk9UVEVOIHV0YW4gdHLkZmYgYXY6ICVzIgorCisjOiBzZWFyY2guYzoxMjQ3Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiBG9nJ25G50YWRlICc/JyBlbGxlciAnLycgZWZ0ZXIgJzsnIgorCisjOiBzZWFyY2guYzozNzA5Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAoaW5rbHVkZXJhciB0aWRpZ2FyZSBsaXN0YWQgdHLkZmYpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM3MjkKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gSW5rbHVkZXJhZGUgZmlsZXIgIgorCisjOiBzZWFyY2guYzozNzMxCittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAiaGl0dGFkZXMgaW50ZSAiCisKKyM6IHNlYXJjaC5jOjM3MzIKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICJpIHP2a3bkZyAtLS1cbiIKKworIzogc2VhcmNoLmM6Mzc3MQorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiIChSZWRhbiBsaXN0YWRlKSIKKworIzogc2VhcmNoLmM6Mzc3MworbXNnaWQgIiAgTk9UIEZPVU5EIgorbXNnc3RyICIgSU5URSBISVRUQURFIgorCisjOiBzZWFyY2guYzozODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICJT9mtlciBpZ2Vub20gaW5rbHVkZXJhZCBmaWw6ICVzIgorCisjOiBzZWFyY2guYzo0MDQzCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiBNYXRjaG5pbmcg5HIgcOUgYWt0dWVsbCByYWQiCisKKyM6IHNlYXJjaC5jOjQxODYKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiQWxsYSBpbmtsdWRlcmFkZSBmaWxlciBoaXR0YWRlcyIKKworIzogc2VhcmNoLmM6NDE4OAorbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICJJbmdhIGlua2x1ZGVyYWRlIGZpbGVyIgorCisjOiBzZWFyY2guYzo0MjA0Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiBLdW5kZSBpbnRlIGhpdHRhIGRlZmluaXRpb24iCisKKyM6IHNlYXJjaC5jOjQyMDYKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IEt1bmRlIGludGUgaGl0dGEgbfZuc3RlciIKKworIzogc3ludGF4LmM6MzAyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDogT3RpbGzldGV0IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6MzIwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogSW5nZXQgc+VkYW50IHN5bnRheC1rbHVzdGVyOiAlcyIKKworIzogc3ludGF4LmM6MzM2NworbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAiSW5nYSBzeW50YXgtZvZyZW3lbCBkZWZpbmllcmFkZSBm9nIgZGVuIGjkciBidWZmZXJ0ZW4iCisKKyM6IHN5bnRheC5jOjMzNzUKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgInN5bmtuaW5nIGF2IEMtc3RpbC1rb21tZW50YXJlciIKKworIzogc3ludGF4LmM6MzM4MworbXNnaWQgIm5vIHN5bmNpbmciCittc2dzdHIgImluZ2VuIHN5bmtuaW5nIgorCisjOiBzeW50YXguYzozMzg2Cittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICJzeW5rbmluZyBzdGFydGFyIgorCisjOiBzeW50YXguYzozMzg4IHN5bnRheC5jOjM0NjMKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgcmFkZXIgZvZyZSB0b3BwcmFkIgorCisjOiBzeW50YXguYzozMzkzCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gU3ludGF4LXN5bmtm9nJlbeVsIC0tLSIKKworIzogc3ludGF4LmM6MzM5OAorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisic3lua25pbmcgYXYgZvZyZW3lbCIKKworIzogc3ludGF4LmM6MzQwNAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBTeW50YXggZvZyZW3lbCAtLS0iCisKKyM6IHN5bnRheC5jOjM0MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IEluZ2Egc+VkYW5hIHN5bnRheGtsdXN0ZXI6ICVzIgorCisjOiBzeW50YXguYzozNDUzCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIm1pbmltYWwgIgorCisjOiBzeW50YXguYzozNDYwCittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgIm1heGltYWwgIgorCisjOiBzeW50YXguYzozNDcyCittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgdHLkZmYgIgorCisjOiBzeW50YXguYzozNDc0Cittc2dpZCAiIGxpbmUgYnJlYWtzIgorbXNnc3RyICIgcmFkYnJ5dG5pbmdhciIKKworIzogc3ludGF4LmM6NDEwOAorbXNnaWQgIkUzOTM6IGdyb3VwW3RdaGVyZSBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5MzogZ3J1cHBlciBpbnRlIHRpbGzldG5hIGjkciIKKworIzogc3ludGF4LmM6NDEzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IEhpdHRhZGUgaW50ZSByZWdpb25m9nJlbeVsIGb2ciAlcyIKKworIzogc3ludGF4LmM6NDE2MAorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiBpbm5laOVsbGVyIGFyZ3VtZW50IHNvbSBpbnRlIORyIHRpbGzldG5hIGjkciIKKworIzogc3ludGF4LmM6NDE3MQorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiBpbm5laPZsbCBhcmd1bWVudCBzb20gaW50ZSDkciB0aWxs5XRuYSBo5HIiCisKKyM6IHN5bnRheC5jOjQyNDkKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5NzogRmlsbmFtbiBrcuR2cyIKKworIzogc3ludGF4LmM6NDU4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IFNha25hciAnPSc6ICVzIgorCisjOiBzeW50YXguYzo0NzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBJbnRlIHRpbGxy5GNrbGlnYSBhcmd1bWVudDogc3ludGF4cmVnaW9uICVzIgorCisjOiBzeW50YXguYzo1MDc2Cittc2dpZCAiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiCittc2dzdHIgIkU0MDA6IEluZ2V0IGtsdXN0ZXIgYW5naXZldCIKKworIzogc3ludGF4LmM6NTExMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDAxOiBQYXR0ZXJuIGRlbGltaXRlciBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDAxOiBN9m5zdGVyYXZncuRuc2FyZSBoaXR0YWRlcyBpbnRlOiAlcyIKKworIzogc3ludGF4LmM6NTE4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiBTa3LkcCBlZnRlciBt9m5zdGVyOiAlcyIKKworIzogc3ludGF4LmM6NTI3OAorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IHN5bnRheC1zeW5rOiByYWRmb3J0c+R0dG5pbmdzbfZuc3RlciBhbmdpdmV0IHR25SBn5W5nZXIiCisKKyM6IHN5bnRheC5jOjUzMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiBPdGlsbOV0bmEgYXJndW1lbnQ6ICVzIgorCisjOiBzeW50YXguYzo1Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IFNha25hciBsaWthbWVkLXRlY2tlbjogJXMiCisKKyM6IHN5bnRheC5jOjUzOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNjogRW1wdHkgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDA2OiBUb210IGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NTQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyBpbnRlIHRpbGzldGV0IGjkciIKKworIzogc3ludGF4LmM6NTQyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIG3lc3RlIHZhcmEgZvZyc3QgaSBpbm5laOVsbHNsaXN0YSIKKworIzogc3ludGF4LmM6NTQ5NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFNDA5OiBPa+RudCBncnVwcG5hbW46ICVzIgorCisjOiBzeW50YXguYzo1NzI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogT2dpbHRpZ3QgOnN5bnRheC11bmRlcmtvbW1hbmRvOiAlcyIKKworIzogc3ludGF4LmM6NjEwNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTogZnJhbWjkdm5pbmdzZ3J1cHAgaGl0dGFkZXMgaW50ZTogJXMiCisKKyM6IHN5bnRheC5jOjYxMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6IEludGUgdGlsbHLkY2tsaWdhIGFyZ3VtZW50OiBcIjpoaWdobGlnaHQgbORuayAlc1wiIgorCisjOiBzeW50YXguYzo2MTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogRvZyIG3lbmdhIGFyZ3VtZW50OiBcIjpoaWdobGlnaHQgbORuayAlc1wiIgorCisjOiBzeW50YXguYzo2MTU4Cittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiBncnVwcCBoYXIgaW5zdORsbG5pbmdhciwgZnJhbWjkdm5pbmdzbORuayBpZ25vcmVyYWQiCisKKyM6IHN5bnRheC5jOjYyODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogb3bkbnRhdCBsaWthbWVkLXRlY2tlbjogJXMiCisKKyM6IHN5bnRheC5jOjYzMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogc2FrbmFyIGxpa2FtZWQtdGVja2VuOiAlcyIKKworIzogc3ludGF4LmM6NjM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzogc2FrbmFyIGFyZ3VtZW50OiAlcyIKKworIzogc3ludGF4LmM6NjM4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogT3RpbGzldGV0IHbkcmRlOiAlcyIKKworIzogc3ludGF4LmM6NjUwMQorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IEZHLWbkcmcgb2vkbmQiCisKKyM6IHN5bnRheC5jOjY1MTIKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiBCRy1m5HJnIG9r5G5kIgorCisjOiBzeW50YXguYzo2NTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogRuRyZ25hbW4gZWxsZXIgbnVtbWVyIGludGUgaWdlbmvkbnQ6ICVzIgorCisjOiBzeW50YXguYzo2Nzc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiB0ZXJtaW5hbGtvZCBm9nIgbOVuZzogJXMiCisKKyM6IHN5bnRheC5jOjY4MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IE90aWxs5XRldCBhcmd1bWVudDogJXMiCisKKyM6IHN5bnRheC5jOjczNTUKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiBG9nIgbeVuZ2Egb2xpa2EgZnJhbWjkdm5pbmdzYXR0cmlidXQgaSBhbnbkbmRuaW5nIgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6IHDlIGJvdHRlbiBhdiB0YWdnc3RhY2siCisKKyM6IHRhZy5jOjkxCittc2dpZCAiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAiRTU1NjogcOUgdG9wcGVuIGF2IHRhZ2dzdGFjayIKKworIzogdGFnLmM6Mzk2Cittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IEthbiBpbnRlIGflIGb2cmUgZvZyc3RhIG1hdGNoYW5kZSB0YWdnIgorCisjOiB0YWcuYzo1MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyNjogdGFnIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MjY6IHRhZ2cgaGl0dGFkZXMgaW50ZTogJXMiCisKKyM6IHRhZy5jOjU0OQorbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmktdHlwLXRhZ2ciCisKKyM6IHRhZy5jOjU1MgorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAiZmlsXG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3MTAKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIkFuZ2UgbnIgYXYgdmFsICg8Q1I+IGb2ciBhdHQgYXZicnl0YSk6ICIKKworIzogdGFnLmM6NzUwCittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiBEZXQgZmlubnMgYmFyYSBlbiBtYXRjaGFuZGUgdGFnZyIKKworIzogdGFnLmM6NzUyCittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODogS2FuIGludGUgZ+UgYm9ydG9tIHNpc3RhIG1hdGNoYW5kZSB0YWdnIgorCisjOiB0YWcuYzo3NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkZpbCBcIiVzXCIgZXhpc3RlcmFyIGludGUiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4NQorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAidGFnZyAlZCBhdiAlZCVzIgorCisjOiB0YWcuYzo3ODgKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIGVsbGVyIGZsZXIiCisKKyM6IHRhZy5jOjc5MAorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIEFuduRuZGVyIHRhZ2cgbWVkIGFubmFuIHN0b3JsZWshIgorCisjOiB0YWcuYzo4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IEZpbCBcIiVzXCIgZXhpc3RlcmFyIGludGUiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6OTAzCittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyBUSUxMIHRhZ2cgICAgICAgICAgRlLFTiBMSU5KRSAgaSBmaWwvdGV4dCIKKworIzogdGFnLmM6MTIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgdGFncyBmaWxlICVzIgorbXNnc3RyICJT9mtlciB0YWdnLWZpbCAlcyIKKworIzogdGFnLmM6MTM5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogVGFnZ2ZpbHP2a3bkZyB0cnVua2VyYWRlcyBm9nIgJXNcbiIKKworIzogdGFnLmM6MTk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMxOiBGb3JtYXQgZXJyb3IgaW4gdGFncyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQzMTogRm9ybWF0ZXJpbmdzZmVsIGkgdGFnZy1maWwgXCIlc1wiIgorCisjOiB0YWcuYzoxOTczCisjLCBjLWZvcm1hdAorbXNnaWQgIkJlZm9yZSBieXRlICVsZCIKK21zZ3N0ciAiRvZyZSBieXRlICVsZCIKKworIzogdGFnLmM6MTk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IFRhZ2ctZmlsIGludGUgc29ydGVyYWQ6ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MjAzNAorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzogSW5nZW4gdGFnZy1maWwiCisKKyM6IHRhZy5jOjI3NDIKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiBLYW4gaW50ZSBoaXR0YSB0YWdnbfZuc3RlciIKKworIzogdGFnLmM6Mjc1MworbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTogS3VuZGUgaW50ZSBoaXR0YSB0YWdnLCBnaXNzYXIgYmFyYSEiCisKKyM6IHRlcm0uYzoxNzQ1Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIGludGUga+RuZC4gVGlsbGfkbmdsaWdhIGluYnlnZ2RhIHRlcm1pbmFsZXIg5HI6IgorCisjOiB0ZXJtLmM6MTc2OQorbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAiYW525G5kZXIgc3RhbmRhcmQgJyIKKworIzogdGVybS5jOjIxMjcKK21zZ2lkICJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIkU1NTc6IEthbiBpbnRlIPZwcG5hIHRlcm1jYXAtZmlsIgorCisjOiB0ZXJtLmM6MjEzMQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogVGVybWluYWxub3RlcmluZyBoaXR0YWRlcyBpbnRlIGkgdGVybWluZm8iCisKKyM6IHRlcm0uYzoyMTMzCittc2dpZCAiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1NTk6IFRlcm1pbmFsbm90ZXJpbmcgaGl0dGFkZXMgaW50ZSBpIHRlcm1jYXAiCisKKyM6IHRlcm0uYzoyMjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiBJbmdlbiBcIiVzXCItbm90ZXJpbmcgaSB0ZXJtY2FwIgorCisjOiB0ZXJtLmM6Mjc2NgorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiB0ZXJtaW5hbGthcGFjaXRldCBcImNtXCIga3LkdnMiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5NzMKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIFRlcm1pbmFsbnlja2xhciAtLS0iCisKKyM6IHVpLmM6MjUyCittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAibnl0dCBza2FsIHN0YXJ0YXRcbiIKKworIzogdWkuYzoxNzkxCittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogRmVsIHZpZCBs5HNuaW5nIGF2IGlubWF0bmluZywgYXZzbHV0YXIuLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozOTQKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIkluZ2VuIOVuZ3JpbmcgbfZqbGlnOyBmb3J0c+R0dGVyIORuZOUiCisKKyM6IHVuZG8uYzo1NDkKK21zZ2lkICJFNDM4OiB1X3VuZG86IGxpbmUgbnVtYmVycyB3cm9uZyIKK21zZ3N0ciAiRTQzODogdV91bmRvOiByYWRudW1tZXIgZmVsIgorCisjOiB1bmRvLmM6NzE4Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIjEg5G5kcmluZyIKKworIzogdW5kby5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIORuZHJpbmdhciIKKworIzogdW5kby5jOjc2NAorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiDlbmdyYS1saXN0YSB0cmFzaWciCisKKyM6IHVuZG8uYzo3OTYKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDog5W5ncmEtcmFkIHNha25hcyIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjExMzEKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyLWJpdGFycyBHVUktdmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjExMzMKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyLWJpdGFycyBHVUktdmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjExMzYKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIiBpIFdpbjMycy1s5GdlIgorCisjOiB2ZXJzaW9uLmM6MTEzOAorbXNnaWQgIiB3aXRoIE9MRSBzdXBwb3J0IgorbXNnc3RyICIgbWVkIE9MRS1zdPZkIgorCisjOiB2ZXJzaW9uLmM6MTE0MQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBjb25zb2xlIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyLWJpdGFycyBrb25zb2xsdmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjExNDUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYtYml0YXJzIHZlcnNpb24iCisKKyM6IHZlcnNpb24uYzoxMTQ5Cittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyLWJpdGFycyBNUy1ET1MtdmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjExNTEKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYtYml0YXJzIE1TLURPUy12ZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6MTE1NworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWC12ZXJzaW9uICh1bml4KSIKKworIzogdmVyc2lvbi5jOjExNTkKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWC12ZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6MTE2MgorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MtdmVyc2lvbiIKKworIzogdmVyc2lvbi5jOjExNjcKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUy12ZXJzaW9uIgorCisjOiB2ZXJzaW9uLmM6MTE3NworbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyJJbmtsdWRlcmFkZSBwYXRjaGFyOiAiCisKKyM6IHZlcnNpb24uYzoxMjAzIHZlcnNpb24uYzoxNTcxCittc2dpZCAiTW9kaWZpZWQgYnkgIgorbXNnc3RyICJNb2RpZmllcmFkIGF2ICIKKworIzogdmVyc2lvbi5jOjEyMTAKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiS29tcGlsZXJhZCAiCisKKyM6IHZlcnNpb24uYzoxMjEzCittc2dpZCAiYnkgIgorbXNnc3RyICJhdiAiCisKKyM6IHZlcnNpb24uYzoxMjI1Cittc2dpZCAiIgorIlxuIgorIkh1Z2UgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyJFbm9ybSB2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjEyMjgKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiU3RvciB2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjEyMzEKK21zZ2lkICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiTm9ybWFsIHZlcnNpb24gIgorCisjOiB2ZXJzaW9uLmM6MTIzNAorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIkxpdGVuIHZlcnNpb24gIgorCisjOiB2ZXJzaW9uLmM6MTIzNgorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisiSuR0dGVsaXRlbiB2ZXJzaW9uICIKKworIzogdmVyc2lvbi5jOjEyNDIKK21zZ2lkICJ3aXRob3V0IEdVSS4iCittc2dzdHIgInV0YW4gR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNDcKK21zZ2lkICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKK21zZ3N0ciAibWVkIEdUSzItR05PTUUtR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNDkKK21zZ2lkICJ3aXRoIEdUSy1HTk9NRSBHVUkuIgorbXNnc3RyICJtZWQgR1RLLUdOT01FLUdVSS4iCisKKyM6IHZlcnNpb24uYzoxMjUzCittc2dpZCAid2l0aCBHVEsyIEdVSS4iCittc2dzdHIgIm1lZCBHVEsyLUdVSS4iCisKKyM6IHZlcnNpb24uYzoxMjU1Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAibWVkIEdUSy1HVUkuIgorCisjOiB2ZXJzaW9uLmM6MTI2MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgIm1lZCBYMTEtTW90aWYtR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNjQKK21zZ2lkICJ3aXRoIFgxMS1uZVh0YXcgR1VJLiIKK21zZ3N0ciAibWVkIFgxMS1uZVh0YXctR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNjYKK21zZ2lkICJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIKK21zZ3N0ciAibWVkIFgxMS1BdGhlbmEtR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNzAKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAibWVkIEJlT1MtR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNzMKK21zZ2lkICJ3aXRoIFBob3RvbiBHVUkuIgorbXNnc3RyICJtZWQgUGhvdG9uLUdVSS4iCisKKyM6IHZlcnNpb24uYzoxMjc2Cittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICJtZWQgR1VJLiIKKworIzogdmVyc2lvbi5jOjEyNzkKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICJtZWQgQ2FyYm9uLUdVSS4iCisKKyM6IHZlcnNpb24uYzoxMjgyCittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICJtZWQgQ29jb2EtR1VJLiIKKworIzogdmVyc2lvbi5jOjEyODUKK21zZ2lkICJ3aXRoIChjbGFzc2ljKSBHVUkuIgorbXNnc3RyICJtZWQgKGtsYXNzaXNrdCkgR1VJLiIKKworIzogdmVyc2lvbi5jOjEyOTYKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIgIEZ1bmt0aW9uZXIgaW5rbHVkZXJhZGUgKCspIGVsbGVyIGludGUgKC0pOlxuIgorCisjOiB2ZXJzaW9uLmM6MTMwOAorbXNnaWQgIiAgIHN5c3RlbSB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgc3lzdGVtLXZpbXJjLWZpbDogXCIiCisKKyM6IHZlcnNpb24uYzoxMzEzCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIGFuduRuZGFyLXZpbXJjLWZpbDogXCIiCisKKyM6IHZlcnNpb24uYzoxMzE4Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgQW5kcmEgYW525G5kYXItdmltcmMtZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzMjMKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiBUcmVkamUgYW525G5kYXItdmltcmMtZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzMjgKK21zZ2lkICIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgIGFuduRuZGFyLWV4cmMtZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzMzMKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgQW5kcmEgYW525G5kYXItZXhyYy1maWw6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTMzOQorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICBzeXN0ZW0tZ3ZpbXJjLWZpbDogXCIiCisKKyM6IHZlcnNpb24uYzoxMzQzCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgYW525G5kYXItZ3ZpbXJjLWZpbDogXCIiCisKKyM6IHZlcnNpb24uYzoxMzQ3Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICJBbmRyYSBhbnbkbmRhci1ndmltcmMtZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzNTIKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIlRyZWRqZSBhbnbkbmRhci1ndmltcmMtZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzNTkKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgICBzeXN0ZW1tZW55ZmlsOiBcIiIKKworIzogdmVyc2lvbi5jOjEzNjcKK21zZ2lkICIgIGZhbGwtYmFjayBmb3IgJFZJTTogXCIiCittc2dzdHIgIiAgcmVzZXJ2IGb2ciAkVklNOiBcIiIKKworIzogdmVyc2lvbi5jOjEzNzMKK21zZ2lkICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCittc2dzdHIgIiByZXNlcnYgZvZyICRWSU1SVU5USU1FOiBcIiIKKworIzogdmVyc2lvbi5jOjEzNzcKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICJLb21waWxlcmluZzogIgorCisjOiB2ZXJzaW9uLmM6MTM4MworbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIktvbXBpbGF0b3I6ICIKKworIzogdmVyc2lvbi5jOjEzODgKK21zZ2lkICJMaW5raW5nOiAiCittc2dzdHIgIkzkbmtuaW5nOiAiCisKKyM6IHZlcnNpb24uYzoxMzkzCittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICBGRUxT1ktOSU5HU0JZR0dEIgorCisjOiB2ZXJzaW9uLmM6MTQzMgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjE0MzQKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAidmVyc2lvbiAiCisKKyM6IHZlcnNpb24uYzoxNDM1Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICJhdiBCcmFtIE1vb2xlbmFhciBtLmZsLiIKKworIzogdmVyc2lvbi5jOjE0MzkKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0g5HIg9nBwZW4ga+RsbGtvZCBvY2ggZnJpIGF0dCBkaXN0cmlidWVyYSIKKworIzogdmVyc2lvbi5jOjE0NDEKK21zZ2lkICJIZWxwIHBvb3IgY2hpbGRyZW4gaW4gVWdhbmRhISIKK21zZ3N0ciAiSGrkbHAgZmF0dGlnYSBiYXJuIGkgVWdhbmRhISIKKworIzogdmVyc2lvbi5jOjE0NDIKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJza3JpdiAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgIGb2ciBpbmZvcm1hdGlvbiAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxNDQ0Cittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAic2tyaXYgIDpxPEVudGVyPiAgICAgICAgICAgICAgICBm9nIgYXR0IGF2c2x1dGEgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTQ0NQorbXNnaWQgInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiCittc2dzdHIgInNrcml2ICA6aGVscDxFbnRlcj4gZWxsZXIgPEYxPiAgZvZyIG9ubGluZS1oauRscCAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjE0NDYKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICJza3JpdiAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgIGb2ciB2ZXJzaW9uaW5mb3JtYXRpb24gICAiCisKKyM6IHZlcnNpb24uYzoxNDQ5Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIkv2ciBpIFZpLWtvbXBhdGliZWx0IGzkZ2UiCisKKyM6IHZlcnNpb24uYzoxNDUwCittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAic2tyaXYgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGb2ciBWaW0tIHN0YW5kYXJkZXIgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTQ1MQorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgInNrcml2ICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBm9nIgaW5mb3JtYXRpb24gb20gZGV0IGjkciIKKworIzogdmVyc2lvbi5jOjE0NjYKK21zZ2lkICJtZW51ICBIZWxwLT5PcnBoYW5zICAgICAgICAgICBmb3IgaW5mb3JtYXRpb24gICAgIgorbXNnc3RyICJtZW55ICBIauRscC0+RvZy5GxkcmFs9nNhICAgICAgICAgICBm9nIgaW5mb3JtYXRpb24gICAgIgorCisjOiB2ZXJzaW9uLmM6MTQ2OAorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIkv2ciBs5Gdlc2z2c3QsIHNrcml2ZW4gdGV4dCBibGlyIGluZm9nYWQiCisKKyM6IHZlcnNpb24uYzoxNDY5Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAibWVueSBSZWRpZ2VyYS0+R2xvYmFsYSBpbnN05GxsbmluZ2FyLT5W5HhsYSBpbmZvZ25pbmdzbORnZSAgIgorCisjOiB2ZXJzaW9uLmM6MTQ3MAorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGb2ciB0duUgbORnZW4gICAgICAiCisKKyM6IHZlcnNpb24uYzoxNDc0Cittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgVmkgQ29tcGF0aWJsZSIKK21zZ3N0ciAibWVueSAgUmVkaWdlcmEtPkdsb2JhbGEgSW5zdORsbG5pbmdhci0+VuR4bGEgVmkgS29tcHRhaWJlbCIKKworIzogdmVyc2lvbi5jOjE0NzUKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm9nIgdmltLXN0YW5kYXJkYWx0ZXJuYXRpdiAgICIKKworIzogdmVyc2lvbi5jOjE1MjIKK21zZ2lkICJTcG9uc29yIFZpbSBkZXZlbG9wbWVudCEiCittc2dzdHIgIlN09mQgdXR2ZWNrbGluZ2VuIGF2IFZpbSEiCisKKyM6IHZlcnNpb24uYzoxNTIzCittc2dpZCAiQmVjb21lIGEgcmVnaXN0ZXJlZCBWaW0gdXNlciEiCittc2dzdHIgIkJsaSBlbiByZWdpc3RyZXJhZCBWaW0tYW525G5kYXJlISIKKworIzogdmVyc2lvbi5jOjE1MjYKK21zZ2lkICJ0eXBlICA6aGVscCBzcG9uc29yPEVudGVyPiAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICJza3JpdiAgOmhlbHAgc3BvbnNvcjxFbnRlcj4gICAgIGb2ciBpbmZvcm1hdGlvbiAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxNTI3Cittc2dpZCAidHlwZSAgOmhlbHAgcmVnaXN0ZXI8RW50ZXI+ICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAic2tyaXYgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgICBm9nIgaW5mb3JtYXRpb24gICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTUyOQorbXNnaWQgIm1lbnUgIEhlbHAtPlNwb25zb3IvUmVnaXN0ZXIgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIm1lbnkgIEhq5GxwLT5TdPZkL1JlZ2lzdHJlcmEgICAgICAgICAgIGb2ciBpbmZvcm1hdGlvbiAgICAiCisKKyM6IHZlcnNpb24uYzoxNTM5Cittc2dpZCAiV0FSTklORzogV2luZG93cyA5NS85OC9NRSBkZXRlY3RlZCIKK21zZ3N0ciAiVkFSTklORzogV2luZG93cyA5NS85OC9NRSB1cHB05GNrdCIKKworIzogdmVyc2lvbi5jOjE1NDIKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICJza3JpdiAgOmhlbHAgd2luZG93czk1PEVudGVyPiAgZvZyIGluZm8gb20gZGV0IGjkciIKKworIzogd2luZG93LmM6MjAzCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IERldCBmaW5ucyBpbmdldCBm9nJoYW5kc3Zpc25pbmdzZvZuc3RlciIKKworIzogd2luZG93LmM6NTgxCittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogS2FuIGludGUgZGVsYSB0b3BwduRuc3RlciBvY2ggYm90dGVuaPZnZXIgc2FtdGlkaWd0IgorCisjOiB3aW5kb3cuYzoxMzQwCittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiBLYW4gaW50ZSByb3RlcmEgbuRyIGV0dCBhbm5hdCBm9m5zdGVyIORyIGRlbGF0IgorCisjOiB3aW5kb3cuYzoxODM1Cittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiBLYW4gaW50ZSBzdORuZ2Egc2VuYXN0ZSBm9m5zdHJldCIKKworIzogd2luZG93LmM6MjU2NgorbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICJSZWRhbiBiYXJhIGV0dCBm9m5zdGVyIgorCisjOiB3aW5kb3cuYzoyNjEzCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IEFuZHJhIGb2bnN0ZXIgaW5uZWjlbGxlciDkbmRyaW5nYXIiCisKKyM6IHdpbmRvdy5jOjQ0NzQKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiBJbmdldCBmaWxuYW1uIHVuZGVyIG1hcmv2ciIKKworIzogd2luZG93LmM6NDU5MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IEthbiBpbnRlIGhpdHRhIGZpbCBcIiVzXCIgaSBz9mt25GciCisKKyM6IGdsb2JhbHMuaDoxMjA5IGlmX3BlcmwueHM6MzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzA6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgJXMiCittc2dzdHIgIkUzNzA6IEt1bmRlIGludGUgbORzYSBpbiBiaWJsaW90ZWsgJXMiCisKKyM6IGlmX3BlcmwueHM6NTU0Cittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFBlcmwgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiIgorIlR5duRyciwgZGV0IGjkciBrb21tYW5kb3Qg5HIgaW5ha3RpdmVyYXQ6IFBlcmwtYmlibGlvdGVrZXQga3VuZGUgaW50ZSBs5HNhcyAiCisiaW4uIgorCisjOiBpZl9wZXJsLnhzOjYwMAorbXNnaWQgIkUyOTk6IFBlcmwgZXZhbHVhdGlvbiBmb3JiaWRkZW4gaW4gc2FuZGJveCB3aXRob3V0IHRoZSBTYWZlIG1vZHVsZSIKK21zZ3N0ciAiRTI5OTogUGVybC1ldmFsdWVyaW5nIGb2cmJqdWRlbiBpIHNhbmRs5WRhIHV0YW4gU2FmZS1tb2R1bGVuIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4MworbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAiUmVkaWdlcmEgbWVkICZmbGVyYSBWaW1zIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjU4OQorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAiUmVkaWdlcmEgbWVkIGVuICZWaW0iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NTk4Cittc2dpZCAiJkRpZmYgd2l0aCBWaW0iCittc2dzdHIgIiZEaWZmIG1lZCBWaW0iCisKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjExCittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIlJlZGlnZXJhIG1lZCAmVmltIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IEd2aW1FeHQvZ3ZpbWV4dC5jcHA6NjMzCittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIlJlZGlnZXJhIG1lZCBiZWZpbnRsaWcgVmltIC0gJiIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDYKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiUmVkaWdlcmFyIG1hcmtlcmFkZSBmaWwoZXJuYSkgbWVkIFZpbSIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODUgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjYKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIkZlbHNrYXBhbmRlIHByb2Nlc3M6IEtvbnRyb2xsZXJhIG9tIGd2aW0g5HIgaSBkaW4gc/ZrduRnISIKKworIzogR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODYgR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDAgR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjcKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZ3ZpbWV4dC5kbGwtZmVsIgorCisjOiBHdmltRXh0L2d2aW1leHQuY3BwOjg5OQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAiU/ZrduRnc2zkbmdkIGb2ciBs5W5nISIKKworIzogZ2xvYmFscy5oOjk5OQorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0tSW5nYSByYWRlciBpIGJ1ZmZlcnQtLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTYyCittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiBLb21tYW5kbyBhdmJydXRldCIKKworIzogZ2xvYmFscy5oOjExNjMKK21zZ2lkICJFNDcxOiBBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAiRTQ3MTogQXJndW1lbnQga3LkdnMiCisKKyM6IGdsb2JhbHMuaDoxMTY0Cittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIGJvcmRlIGb2bGphcyBhdiAvLCA/IGVsbGVyICYiCisKKyM6IGdsb2JhbHMuaDoxMTY2Cittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiBGZWxha3RpZ2hldCBpIGtvbW1hbmRvcmFkc2b2bnN0ZXI7IDxDUj4ga/ZyLCBDVFJMLUMgYXZzbHV0YXIiCisKKyM6IGdsb2JhbHMuaDoxMTY4Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICIiCisiRTEyOiBLb21tYW5kbyBpbnRlIHRpbGzldGV0IGZy5W4gZXhyYy92aW1yYyBpIGFrdHVlbGwga2F0YWxvZyBlbGxlciAiCisidGFnZ3P2a25pbmciCisKKyM6IGdsb2JhbHMuaDoxMTcwCittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IFNha25hciA6ZW5kaWYiCisKKyM6IGdsb2JhbHMuaDoxMTcxCittc2dpZCAiRTYwMDogTWlzc2luZyA6ZW5kdHJ5IgorbXNnc3RyICJFNjAwOiBTYWtuYXIgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjExNzIKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogU2FrbmFyIDplbmR3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNzMKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDplbmR3aGlsZSB1dGFuIDp3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNzUKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogRmlsIGV4aXN0ZXJhciAobORnZyB0aWxsICEgZvZyIGF0dCB0dmluZ2EpIgorCisjOiBnbG9iYWxzLmg6MTE3NgorbXNnaWQgIkU0NzI6IENvbW1hbmQgZmFpbGVkIgorbXNnc3RyICJFNDcyOiBLb21tYW5kbyBtaXNzbHlja2FkZXMiCisKKyM6IGdsb2JhbHMuaDoxMTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IE9r5G5kIHR5cHNuaXR0c3VwcHPkdHRuaW5nOiAlcyIKKworIzogZ2xvYmFscy5oOjExODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAiRTIzNTogT2vkbnQgdHlwc25pdHQ6ICVzIgorCisjOiBnbG9iYWxzLmg6MTE4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IFR5cHNuaXR0IFwiJXNcIiDkciBpbnRlIGJyZWRkLWZpeGVyYWQiCisKKyM6IGdsb2JhbHMuaDoxMTg3Cittc2dpZCAiRTQ3MzogSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIkU0NzM6IEludGVybnQgZmVsIgorCisjOiBnbG9iYWxzLmg6MTE4OAorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICJBdmJydXRlbiIKKworIzogZ2xvYmFscy5oOjExODkKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiBPZ2lsdGlnIGFkZHJlc3MiCisKKyM6IGdsb2JhbHMuaDoxMTkwCittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogT2dpbHRpZ3QgYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NzU6IEludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDc1OiBPZ2lsdGlndCBhcmd1bWVudDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiBPZ2lsdGlndCB1dHRyeWNrOiAlcyIKKworIzogZ2xvYmFscy5oOjExOTUKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogT2dpbHRpZ3Qgb21y5WRlIgorCisjOiBnbG9iYWxzLmg6MTE5NgorbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogT2dpbHRpZ3Qga29tbWFuZG8iCisKKyM6IGdsb2JhbHMuaDoxMTk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDkciBlbiBrYXRhbG9nIgorCisjOiBnbG9iYWxzLmg6MTIwMQorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogT3bkbnRhZGUgdGVja2VuIGb2cmUgJz0nIgorCisjOiBnbG9iYWxzLmg6MTIwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogQmlibGlvdGVrc2Fucm9wIG1pc3NseWNrYWRlcyBm9nIgXCIlcygpXCIiCisKKyM6IGdsb2JhbHMuaDoxMjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiCittc2dzdHIgIkU0NDg6IEt1bmRlIGludGUgbORzYSBpbiBiaWJsaW90ZWtzZnVua3Rpb24gJXMiCisKKyM6IGdsb2JhbHMuaDoxMjEyCittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IE1hcmtlcmluZyBoYXIgb2dpbHRpZ3QgcmFkbnVtbWVyIgorCisjOiBnbG9iYWxzLmg6MTIxMworbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICJFMjA6IE1hcmtlcmluZyBpbnRlIHNhdHQiCisKKyM6IGdsb2JhbHMuaDoxMjE0Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IEthbiBpbnRlIGf2cmEg5G5kcmluZ2FyLCAnbW9kaWZpYWJsZScg5HIgYXYiCisKKyM6IGdsb2JhbHMuaDoxMjE1Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiBTa3JpcHQgbuRzdGxhZGUgZvZyIGRqdXB0IgorCisjOiBnbG9iYWxzLmg6MTIxNgorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogSW5nZW4gYWx0ZXJuYXRpdiBmaWwiCisKKyM6IGdsb2JhbHMuaDoxMjE3Cittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiBJbmdlbiBz5WRhbiBm9nJrb3J0bmluZyIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6IEluZ2V0ICEgdGlsbOV0ZXQiCisKKyM6IGdsb2JhbHMuaDoxMjIwCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiBHVUkga2FuIGludGUgYW525G5kYXM6IEludGUgYWt0aXZlcmF0IHZpZCBrb21waWxlcmluZyIKKworIzogZ2xvYmFscy5oOjEyMjMKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjogSGVicmVpc2thIGthbiBpbnRlIGFuduRuZGFzOiBJbnRlIGFrdGl2ZXJhdCB2aWQga29tcGlsZXJpbmdcbiIKKworIzogZ2xvYmFscy5oOjEyMjYKK21zZ2lkICJFMjc6IEZhcnNpIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI3OiBQZXJzaXNrYSBrYW4gaW50ZSBhbnbkbmRhczogSW50ZSBha3RpdmVyYXQgdmlkIGtvbXBpbGVyaW5nXG4iCisKKyM6IGdsb2JhbHMuaDoxMjI5Cittc2dpZCAiRTgwMDogQXJhYmljIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTgwMDogQXJhYmlza2Ega2FuIGludGUgYW525G5kYXM6IEludGUgYWt0aXZlcmF0IHZpZCBrb21waWxlcmluZ1xuIgorCisjOiBnbG9iYWxzLmg6MTIzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IEluZ2V0IHPlZGFudCBmcmFtaOR2bmluZ3NncnVwcG5hbW46ICVzIgorCisjOiBnbG9iYWxzLmg6MTIzNAorbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogSW5nZW4gaW5mb2dhZCB0ZXh0IORuIgorCisjOiBnbG9iYWxzLmg6MTIzNQorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IEluZ2VuIHRpZGlnYXJlIGtvbW1hbmRvcmFkIgorCisjOiBnbG9iYWxzLmg6MTIzNgorbXNnaWQgIkUzMTogTm8gc3VjaCBtYXBwaW5nIgorbXNnc3RyICJFMzE6IEluZ2VuIHPlZGFuIG1hcHBuaW5nIgorCisjOiBnbG9iYWxzLmg6MTIzNworbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiBJbmdlbiB0cuRmZiIKKworIzogZ2xvYmFscy5oOjEyMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4MDogTm8gbWF0Y2g6ICVzIgorbXNnc3RyICJFNDgwOiBJbmdlbiB0cuRmZjogJXMiCisKKyM6IGdsb2JhbHMuaDoxMjM5Cittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIkUzMjogSW5nZXQgZmlsbmFtbiIKKworIzogZ2xvYmFscy5oOjEyNDAKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IEluZ2V0IHRpZGlnYXJlIHV0Ynl0bmluZ3NyZWd1bGrkcnV0dHJ5Y2siCisKKyM6IGdsb2JhbHMuaDoxMjQxCittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IEluZ2V0IHRpZGlnYXJlIGtvbW1hbmRvIgorCisjOiBnbG9iYWxzLmg6MTI0MgorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IEluZ2V0IHRpZGlnYXJlIHJlZ3VsauRydCB1dHRyeWNrIgorCisjOiBnbG9iYWxzLmg6MTI0MworbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IEluZ2V0IG9tcuVkZSB0aWxs5XRldCIKKworIzogZ2xvYmFscy5oOjEyNDUKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiBJbnRlIHRpbGxy5GNrbGlndCBtZWQgdXRyeW1tZSIKKworIzogZ2xvYmFscy5oOjEyNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0Nzogbm8gcmVnaXN0ZXJlZCBzZXJ2ZXIgbmFtZWQgXCIlc1wiIgorbXNnc3RyICJFMjQ3OiBpbmdlbiByZWdpc3RyZXJhZCBzZXJ2ZXIgbWVkIG5hbW5ldCBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiBLYW4gaW50ZSBza2FwYSBmaWwgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjUxCittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiBLYW4gaW50ZSBo5G10YSB0ZW1wb3LkcnQgZmlsbmFtbiIKKworIzogZ2xvYmFscy5oOjEyNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NDogQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJFNDg0OiBLYW4gaW50ZSD2cHBuYSBmaWwgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogS2FuIGludGUgbORzYSBmaWwgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjU0Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTM3OiBJbmdlbiBza3Jpdm5pbmcgc2VkYW4gc2VuYXN0ZSDkbmRyaW5nIChs5GdnIHRpbGwgISBm9nIgYXR0IHR2aW5nYSkiCisKKyM6IGdsb2JhbHMuaDoxMjU1Cittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IE51bGwtYXJndW1lbnQiCisKKyM6IGdsb2JhbHMuaDoxMjU3Cittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTogTnVtbWVyIHbkbnRhdCIKKworIzogZ2xvYmFscy5oOjEyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiBLYW4gaW50ZSD2cHBuYSBmZWxmaWwgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjYzCittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzoga2FuIGludGUg9nBwbmEgZGlzcGxheSIKKworIzogZ2xvYmFscy5oOjEyNjUKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IFNsdXQgcOUgbWlubmUhIgorCisjOiBnbG9iYWxzLmg6MTI2NworbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICJN9m5zdGVyIGhpdHRhZGVzIGludGUiCisKKyM6IGdsb2JhbHMuaDoxMjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4NjogTfZuc3RlciBoaXR0YWRlcyBpbnRlOiAlcyIKKworIzogZ2xvYmFscy5oOjEyNzAKK21zZ2lkICJFNDg3OiBBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICJFNDg3OiBBcmd1bWVudCBt5XN0ZSB2YXJhIHBvc2l0aXZ0IgorCisjOiBnbG9iYWxzLmg6MTI3MgorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTogS2FuIGludGUgZ+UgdGlsbGJha2EgdGlsbCB0aWRpZ2FyZSBrYXRhbG9nIgorCisjOiBnbG9iYWxzLmg6MTI3NgorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IEluZ2EgZmVsIgorCisjOiBnbG9iYWxzLmg6MTI3OAorbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogU2thZGFkIHRy5GZmc3Ry5G5nIgorCisjOiBnbG9iYWxzLmg6MTI3OQorbXNnaWQgIkU0NDogQ29ycnVwdGVkIHJlZ2V4cCBwcm9ncmFtIgorbXNnc3RyICJFNDQ6IFRyYXNpZ3QgcHJvZ3JhbSBm9nIgcmVndWxq5HJhIHV0dHJ5Y2siCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiAncmVhZG9ubHknIGZsYWdnYSDkciBzYXR0IChs5GdnIHRpbGwgISBm9nIgYXR0IHR2aW5nYSkiCisKKyM6IGdsb2JhbHMuaDoxMjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IEthbiBpbnRlIHPkdHRhIHNrcml2c2t5ZGRhZCB2YXJpYWJlbCBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMjg1Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiBGZWwgdmlkIGzkc25pbmcgYXYgZmVsZmlsIgorCisjOiBnbG9iYWxzLmg6MTI4OAorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiBJbnRlIHRpbGzldGV0IGkgc2FuZGzlZGEiCisKKyM6IGdsb2JhbHMuaDoxMjkwCittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzogSW50ZSB0aWxs5XRldCBo5HIiCisKKyM6IGdsb2JhbHMuaDoxMjkzCittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiBTa+RybWzkZ2UgaW5zdORsbG5pbmcgaW50ZSBzdPZkZCIKKworIzogZ2xvYmFscy5oOjEyOTUKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogT2dpbHRpZyBydWxsbmluZ3NzdG9ybGVrIgorCisjOiBnbG9iYWxzLmg6MTI5NgorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogJ3NoZWxsJyBmbGFnZ2Eg5HIgdG9tIgorCisjOiBnbG9iYWxzLmg6MTI5OAorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogS3VuZGUgaW50ZSBs5HNhIGluIHRlY2tlbmRhdGEhIgorCisjOiBnbG9iYWxzLmg6MTMwMAorbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IFN05G5nbmluZ3NmZWwgcOUgduR4bGluZ3NmaWwiCisKKyM6IGdsb2JhbHMuaDoxMzAxCittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3MzogdGFnZ3N0YWNrIHRvbSIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCittc2dzdHIgIkU3NDogS29tbWFuZG8gZvZyIGtvbXBsZXh0IgorCisjOiBnbG9iYWxzLmg6MTMwMworbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiBOYW1uIGb2ciBs5W5ndCIKKworIzogZ2xvYmFscy5oOjEzMDQKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3NjogRvZyIG3lbmdhIFsiCisKKyM6IGdsb2JhbHMuaDoxMzA1Cittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6IEb2ciBt5W5nYSBmaWxuYW1uIgorCisjOiBnbG9iYWxzLmg6MTMwNgorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IEVmdGVyc2zkcGFuZGUgdGVja2VuIgorCisjOiBnbG9iYWxzLmg6MTMwNworbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IE9r5G50IG3kcmtlIgorCisjOiBnbG9iYWxzLmg6MTMwOAorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTogS2FuIGludGUgZXhwYW5kZXJhIGpva2VydGVja2VuIgorCisjOiBnbG9iYWxzLmg6MTMxMAorbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIGthbiBpbnRlIHZhcmEgbWluZHJlIORuICd3aW5taW5oZWlnaHQnIgorCisjOiBnbG9iYWxzLmg6MTMxMgorbXNnaWQgIkU1OTI6ICd3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICJFNTkyOiAnd2lud2lkdGgnIGthbiBpbnRlIHZhcmEgbWluZHJlIORuICd3aW5taW53aWR0aCciCisKKyM6IGdsb2JhbHMuaDoxMzE1Cittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IEZlbCB2aWQgc2tyaXZuaW5nIgorCisjOiBnbG9iYWxzLmg6MTMxNgorbXNnaWQgIlplcm8gY291bnQiCittc2dzdHIgIk5vbGwtbORuZ2QiCisKKyM6IGdsb2JhbHMuaDoxMzE4Cittc2dpZCAiRTgxOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dCIKK21zZ3N0ciAiRTgxOiBBbnbkbmRlciBpbnRlIDxTSUQ+IGkgZXR0IHNrcmlwdHNhbW1hbmhhbmciCisKKyM6IGdsb2JhbHMuaDoxMzIxCittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiBPZ2lsdGlndCB1dHRyeWNrIG1vdHRhZ2V0IgorCisjOiBnbG9iYWxzLmg6MTMyNAorbXNnaWQgIkU0NjM6IFJlZ2lvbiBpcyBndWFyZGVkLCBjYW5ub3QgbW9kaWZ5IgorbXNnc3RyICJFNDYzOiBSZWdpb24g5HIgdmFrdGFkLCBrYW4gaW50ZSBtb2RpZmllcmEiCisKKyN+IG1zZ2lkICJFODY6IENhbm5vdCBnbyB0byBidWZmZXIgJWxkIgorI34gbXNnc3RyICJFODU6IEthbiBpbnRlIGflIHRpbGwgYnVmZmVydCAlbGQiCmRpZmYgLS1naXQgYS9zcmMvcG8vdWsucG8gYi9zcmMvcG8vdWsucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjNkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby91ay5wbwpAQCAtMCwwICsxLDYyMjUgQEAKKyMKKyMgVWtyYWluaWFuIFZpbSB0cmFuc2xhdGlvbiBbdWtdCisjCisjIENvcHlyaWdodCAoQykgMjAwMSBCb2hkYW4gVmxhc3l1ayA8Ym9oZGFuQHZzdHUuZWR1LnVhPgorIworIyBUaGFua3MgdG86CisjICAgRG15dHJvIEtvdmFsb3YgPGRteXRyby5rb3ZhbG92QG5zc21iLmNvbT4gZm9yIHVzZWZ1bCBzdWdnZXN0aW9ucworIwlEbXl0cm8gTy4gUmVkY2h1ayA8ZG9yQGtpZXYtb25saW5lLm5ldD4gZm9yIHZpbWluZm8gYnVnCisjCisjIFBsZWFzZSwgc2VlIHJlYWRtZSBhdCBodHBwOi8vd3d3LnZzdHUuZWR1LnVhL35ib2hkYW4vdmltIGJlZm9yZSBhbnkKKyMgY29tcGxhaW5zLCBhbmQgZXZlbiBpZiB5b3Ugd29uJ3QgY29tcGxhaW4sIHJlYWQgaXQgYW55d2F5LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogdmltIDYuMFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAyLTAxLTEwIDA5OjAzKzAyMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAxLTEwLTE2IDEzOjM0KzAzMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEJvaGRhbiBWbGFzeXVrIDxib2hkYW5AdnN0dS5lZHUudWE+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQm9oZGFuIFZsYXN5dWsgPGJvaGRhbkB2c3R1LmVkdS51YT5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1rb2k4LXVcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IGJ1ZmZlci5jOjk3Cittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiDuxc3BpCDNz9bMydfP09SmINLP2s2m09TJ1MkgyM/eIM/Eyc4gwtXGxdIsINrB18XS28XOztEg0s/Cz9TJLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiDuxc3BpCDNz9bMydfP09SmINLP2s2m09TJ1MkgwtXGxdIsIMLVxMUg18nLz9LJ09TBzs8gps7bycouLi4iCisKKyM6IGJ1ZmZlci5jOjY5OAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAi9s/Exc4g2iDC1cbF0qbXIM7FIMLV1yDXydfBztTB1sXOycoiCisKKyM6IGJ1ZmZlci5jOjcwMAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICL2z8TFziDaIMLVxsXSptcgzsUgwtXXINfJxMHMxc7JyiIKKworIzogYnVmZmVyLmM6NzAyCittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAi9s/Exc4g2iDC1cbF0qbXIM7FIMLV1yDXydTF0tTJyiIKKworIzogYnVmZmVyLmM6NzEwCittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIvfJ18HO1MHWxc7PIM/Eyc4gwtXGxdIiCisKKyM6IGJ1ZmZlci5jOjcxMgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICL3ydfBztTB1sXOzyDC1cbF0qbXIC0tICVkIgorCisjOiBidWZmZXIuYzo3MTcKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICL3ycTBzMXOzyDPxMnOIMLVxsXSIgorCisjOiBidWZmZXIuYzo3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICL3ycTBzMXOzyDC1cbF0qbXIC0tICVkIgorCisjOiBidWZmZXIuYzo3MjQKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIvfJ1MXS1M8gz8TJziDC1cbF0iIKKworIzogYnVmZmVyLmM6NzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICL3ydTF0tTPIMLVxsXSptcgLS0gJWQiCisKKyM6IGJ1ZmZlci5jOjc4MworbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IPbPxMXOIMLVxsXSIM7FINrNps7Fzs8iCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo4MjIKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTog9SDT0MnTy9UgzsXNwaQgwtXGxdKm1yIKKworIzogYnVmZmVyLmM6ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQ2Fubm90IGdvIHRvIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU4Njog7sUgzc/W1SDQxdLFytTJINcgwtXGxdIgJWxkIgorCisjOiBidWZmZXIuYzo4MzcKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4Nzog7sUgzc/W1SDQxdLFytTJINUgzsHT1NXQzsnKIMLVxsXSINogz9PUwc7O2M/HzyIKKworIzogYnVmZmVyLmM6ODM5Cittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiDuxSDNz9bVINDF0sXK1Mkg1SDQz9DF0sXEzqbKIMLVxsXSINog0MXS28/HzyIKKworIzogYnVmZmVyLmM6ODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiIgorIkU4OTog4tXGxdIgJWxkIM7FINrB0MnTwc7JyiDQptPM0SDP09TBzs7Yz6cg2s2mzskgKNfJy8/SydPUwcrUxSAhIN3PwiDOxSAiCisi2tfB1sHUySkiCisKKyM6IGJ1ZmZlci5jOjg3OQorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiDuxSDNz9bVINfJ18HO1MHWydTJIM/T1MHOzqbKIMLVxsXSIgorCisjOiBidWZmZXIuYzoxMzE0Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDog78LF0sXWzs86IPPQydPPyyCmzcXOIMbBysym1yDQxdLF0M/XzsXOzyIKKworIzogYnVmZmVyLmM6MTQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTI6IEJ1ZmZlciAlbGQgbm90IGZvdW5kIgorbXNnc3RyICJFOTI6IOLVxsXSICVsZCDOxSDazsHKxMXOzyIKKworIzogYnVmZmVyLmM6MTcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IPrOwcrExc7PIMKmzNjbxSDOptYgz8TJziDXwdKmwc7UIMTM0SAlcyIKKworIzogYnVmZmVyLmM6MTcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDog7sUg2s7BysTFzs8g18HSpsHO1KbXIMTM0SAlcyIKKworIzogYnVmZmVyLmM6MjEwNSBleF9kb2NtZC5jOjYwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgItLRxM/LICVsZCIKKworIzogYnVmZmVyLmM6MjE4OAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IOLVxsXSINog1MHLz8AgzsHa18/AINXWxSCm087VpCIKKworIzogYnVmZmVyLmM6MjQ4MQorbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICJb+s2mzsXOz10iCisKKyM6IGJ1ZmZlci5jOjI0ODYKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIlvuxSDC1czPINLFxMHHz9fBzs9dIgorCisjOiBidWZmZXIuYzoyNDkxCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW+7P18nKIMbBysxdIgorCisjOiBidWZmZXIuYzoyNDkyCittc2dpZCAiW1JlYWQgZXJyb3JzXSIKK21zZ3N0ciAiW/DPzcnMy8Eg2t7J1NXXwc7O0V0iCisKKyM6IGJ1ZmZlci5jOjI0OTQgZmlsZWlvLmM6MTc1NAorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIlvMydvFIN7J1MHUyV0iCisKKyM6IGJ1ZmZlci5jOjI1MTAKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgIs/Eyc4g0tHEz8sgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1MTAKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIijS0cTLptc6ICVsZCkgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1MTgKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAi0tHEz8sgJWxkINogJWxkIC0tJWQlJS0tIMvPzM/Oy8EiCisKKyM6IGJ1ZmZlci5jOjI2MDYKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIlvuz9fJyiDGwcrMXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyNjQ2Cittc2dpZCAiaGVscCIKK21zZ3N0ciAixM/Qz83Px8EiCisKKyM6IGJ1ZmZlci5jOjMxNTEgc2NyZWVuLmM6NDY5MQorbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW8TP0M/Nz8fBXSIKKworIzogYnVmZmVyLmM6MzE4MyBzY3JlZW4uYzo0Njk3Cittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJb0MXSxcfM0cRdIgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQWxsIgorbXNnc3RyICL108UiCisKKyM6IGJ1ZmZlci5jOjMzODkKK21zZ2lkICJCb3QiCittc2dzdHIgIvXOydrVIgorCisjOiBidWZmZXIuYzozMzkxCittc2dpZCAiVG9wIgorbXNnc3RyICL3x8/SpiIKKworIzogYnVmZmVyLmM6NDEyNworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDz0MnTz8sgwtXGxdKm1zpcbiIKKworIzogYnVmZmVyLmM6NDE2MAorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW/PQydPPyyDQz83JzM/LXSIKKworIzogYnVmZmVyLmM6NDE3MyBtZW1saW5lLmM6MTUxMworbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW+7P18nKIMbBysxdIgorCisjOiBidWZmZXIuYzo0MzkzCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g+s7By8kgLS0tIgorCisjOiBidWZmZXIuYzo0NDAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIvrOwcvJIMTM0SAlczoiCisKKyM6IGJ1ZmZlci5jOjQ0MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgINLRxM/LPSVsZCAgaWQ9JWQgps0n0T0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5Njog7sUgzc/W1SDQz9Km187A18HUySDQz87BxCAlbGQgwtXGxdKm1yAiCisKKyM6IGRpZmYuYzo2NDgKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5Nzog7sXNz9bOwSDT1NfP0snUySBkaWZmJ8kiCisKKyM6IGRpZmYuYzo3NDcKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJwYXRjaC3GwcrMIgorCisjOiBkaWZmLmM6OTkxCittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiDuxSDNz9bVINreydTB1Mkg0sXa1czY1MHUIGRpZmYn1SIKKworIzogZGlmZi5jOjE3MDQKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTog48XKIMLVxsXSIM7FINcg0sXWyc2mIGRpZmYiCisKKyM6IGRpZmYuYzoxNzE2Cittc2dpZCAiRTEwMDogTm8gb3RoZXIgYnVmZmVyIGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMDog7sXNwcUgps7bycggwtXGxdKm1yDXINLF1snNpiBkaWZmIgorCisjOiBkaWZmLmM6MTcyNAorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiIgorIkUxMDE6IPDPzsHEIMTXwSDC1cbF0sEg2s7ByM/E0dTY09Eg1yDSxdbJzaYgZGlmZiwgzsUg2tLP2tXNpszPINHLycog2iDOycggIgorItfJy8/SydPUwdTJIgorCisjOiBkaWZmLmM6MTc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTAyOiBDYW4ndCBmaW5kIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxMDI6IOLVxsXSIFwiJXNcIiDOxSDazsHKxMXOzyIKKworIzogZGlmZi5jOjE3NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiDi1cbF0iBcIiVzXCIgzsUg1yDSxdbJzaYgZGlmZiIKKworIzogZGlncmFwaC5jOjIxNjgKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDog9SDEycfSwcbByCDOxSDNz9bFIM2m09TJ1MnT0SBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQwCittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICLmwcrMINLP2svMwcTLySDLzMHXpsHU1dLJIM7FINrOwcrExc7PIgorCisjOiBkaWdyYXBoLmM6MjM2NworbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTog98nLz9LJ09TBzs7RIDpsb2Fka2V5bWFwIM7FINcgxsHKzKYgy8/Nwc7EIgorCisjOiBlZGl0LmM6NDAKK21zZ2lkICIgS2V5d29yZCBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiDkz9DP187Fzs7RIMvMwN7P18nIINPMptcgKF5OL15QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorbXNnc3RyICIg8sXWyc0gXlggKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIOTP18XS28XOztEgzabTw8XXycggy8zA3s/Xycgg08ym1yAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiDkz9fF0tvFzs7RINXT2M/HzyDS0cTLwSAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIOTP18XS28XOztEgps3FzqYgxsHKzMEgKF5GL15OL15QKSIKKworIzogZWRpdC5jOjQ3Cittc2dpZCAiIFRhZyBjb21wbGV0aW9uICheXS9eTi9eUCkiCittc2dzdHIgIiDkz9fF0tvFzs7RINDPzabUz8sgKF5dL15OL15QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiDkz9fF0tvFzs7RINvM0cjVINrBINrSwdrLz80gKF5OL15QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkQvXk4vXlApIgorbXNnc3RyICIg5M/XxdLbxc7O0SDXydrOwd7Fzs7RICheRC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MQorbXNnaWQgIiBEaWN0aW9uYXJ5IGNvbXBsZXRpb24gKF5LL15OL15QKSIKK21zZ3N0ciAiIOTP18XS28XOztEg2iDTzM/XzsnLwSAoXksvXk4vXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIOTP18XS28XOztEg2iCmxMXPx9LBzcHUyd7Oz8fPINPMz9fOycvBICheVC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIg5M/XxdLbxc7O0SDLz83BzsQgKF5WL15OL15QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgIuTP09HHztXUzyDLps7Fw9gg0MHSwcfSwcbBIgorCisjOiBlZGl0LmM6ODk5Cittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICLP0MOm0SAndGhlc2F1cnVzJyDQ1dPUwSIKKworIzogZWRpdC5jOjEwNzUKK21zZ2lkICInZGljdGlvbmFyeScgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICLP0MOm0SAnZGljdGlvbmFyeScg0NXT1MEiCisKKyM6IGVkaXQuYzoxOTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICLa3snU1cXNzyDEydLFy9TP0qbAOiAlcyIKKworIzogZWRpdC5jOjIxODgKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAo19PUwdfLwSkg+tPV1yAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjE5MAorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAo2sHNps7BKSD609XXICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAi8M/b1csg1TogJXMiCisKKyM6IGVkaXQuYzoyNTM2Cittc2dpZCAiU2Nhbm5pbmcgdGFncy4iCittc2dzdHIgIvDP29XLINPF0sXEINDPzabUz8suIgorCisjOiBlZGl0LmM6MzE5NAorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiDkz8TBpM3PIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjMyNDMKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIPDP29XLLi4uIgorCisjOiBlZGl0LmM6MzI5OQorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIu7B2sHEIMTPINDP3sHUy8/Xz8fPINfB0qbBztTVIgorCisjOiBlZGl0LmM6MzMwNAorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICLzzM/XzyDaIKbO28/HzyDS0cTLwSIKKworIzogZWRpdC5jOjMzMDkKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAi5cTJzsnKINfB0qbBztQiCisKKyM6IGVkaXQuYzozMzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIm1hdGNoICVkIG9mICVkIgorbXNnc3RyICIg18HSpsHO1CAlZCDaICVkIgorCisjOiBlZGl0LmM6MzM3MQorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAi18HSpsHO1CAlZCIKKworIzogZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IO7F16bEz83BINrNps7OwTogXCIlc1wiIgorCisjOiBldmFsLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzog7sXNwcUgxNXWz8s6ICVzIgorCisjOiBldmFsLmM6MTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IPrNps7OwSDOxSCm087VpDogXCIlc1wiIgorCisjOiBldmFsLmM6MTI4NAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTog7sXNwcUgJzonINCm08zRICc/JyIKKworIzogZXZhbC5jOjE4OTgKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDog7sXNwaQgJyknIgorCisjOiBldmFsLmM6MTk0OAorbXNnaWQgIkUxMTE6IE1pc3NpbmcgJ10nIgorbXNnc3RyICJFMTExOiDuxc3BpCAnXSciCisKKyM6IGV2YWwuYzoyMDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiDuxc3BpCDOwdrXySDP0MOmpzogJXMiCisKKyM6IGV2YWwuYzoyMDQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzog7sXXpsTPzcEgz9DDptE6ICVzIgorCisjOiBldmFsLmM6MjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDog7sUg18nT1MHewaQgzMHQy8k6ICVzIgorCisjOiBldmFsLmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE1OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNTog99TSwd7FzsnKINPJzdfPzCAnXCInOiAlcyIKKworIzogZXZhbC5jOjI1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiDuxdem0s6mIMHSx9XNxc7UySDEzNEgxtXOy8OmpyAlcyIKKworIzogZXZhbC5jOjI1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IO7F16bEz83BIMbVzsvDptE6ICVzIgorCisjOiBldmFsLmM6MjUzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODog+sHCwcfB1M8gwdLH1c3FztSm1yDEzNEgxtXOy8OmpyAlcyIKKworIzogZXZhbC5jOjI1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExOTogTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExOTog+sHNwczPIMHSx9XNxc7UptcgxMzRIMbVzsvDpqcgJXMiCisKKyM6IGV2YWwuYzoyNTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4g18nLz9LJ09TP19Wk1NjT0SDOxSDVIMbBysymIMvPzcHOxDogJXMiCisKKyM6IGV2YWwuYzozNTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkOiAiCisKKyM6IGV2YWwuYzo0NjkwCittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImTzrnwdLB2sRcbiIKKyImQzr3psTNps7BIgorCisjOiBldmFsLmM6NTUxNAorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDog7sXNwaQg2iekxM7Bzs7RINogVmltLdPF0tfF0s/NIgorCisjOiBldmFsLmM6NTYwNAorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiDuxSDNz9bVINreydTB1Mkg16bE0M/XpsTYINPF0tfF0sEiCisKKyM6IGV2YWwuYzo1NjI5Cittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiDuxSDNz9bVINPQpszL1dfB1MnT0SDLzKakztTPzSIKKworIzogZXZhbC5jOjU2NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6IO7FIM3P1tUg09CmzMvV18HUydPRINogJXMiCisKKyM6IGV2YWwuYzo1NzY4Cittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIo7sXNz9bMydfPKSIKKworIzogZXZhbC5jOjY3NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiAlcyIKK21zZ3N0ciAiRTEyMTog7sXXydrOwd7FzsEg2s2mzs7BOiAlcyIKKworIzogZXZhbC5jOjc0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMjogRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMsIHVzZSAhIHRvIHJlcGxhY2UiCittc2dzdHIgIkUxMjI6IObVzsvDptEgJXMg1dbFIKbTztWkICjXycvP0snT1MHK1MUgISDdz8Ig2sHNps7J1MkpIgorCisjOiBldmFsLmM6NzUxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIzOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTIzOiDuxdfJ2s7B3sXOwSDG1c7Lw6bROiAlcyIKKworIzogZXZhbC5jOjc1MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiDi0sHL1aQgJygnOiAlcyIKKworIzogZXZhbC5jOjc1NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IO7FxM/a18/Mxc7JyiDB0sfVzcXO1DogJXMiCisKKyM6IGV2YWwuYzo3NjQyCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IOLSwcvVpCA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo3NzIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiDuxSDNz9bVINrBzabOydTJIMbVzsvDpsAgJXM6IPfPzsEg18nLz9LJ09TP19Wk1NjT0SIKKworIzogZXZhbC5jOjc3NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODog7sHa18EgxtXOy8OmpyDNwaQg0M/eyc7B1MnRINog18XMycvPpyDMptTF0sk6ICVzIgorCisjOiBldmFsLmM6Nzc4NAorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IO7FINfLwdrBzsEgzsHa18EgxtXOy8OmpyIKKworIzogZXZhbC5jOjc4NzcKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgIsbVzsvDptEgIgorCisjOiBldmFsLmM6Nzk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiDuxdfJ2s7B3sXOwSDG1c7Lw6bROiAlcyIKKworIzogZXZhbC5jOjc5OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiDuxSDNz9bVINfJxMHMydTJIMbVzsvDpsAgJXM6IPfPzsEg18nLz9LJ09TP19Wk1NjT0SIKKworIzogZXZhbC5jOjgwNDQKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiDnzMnCyc7BINfJy8zJy6bXIMbVzsvDpqcg0MXSxdfJ3dWkICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MDk1CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgItfJy8zJy8Gk1NjT0SAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODEyMCBleF9jbWRzMi5jOjE5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAi0NLPxM/X1sXOztEg1yAlcyIKKworIzogZXZhbC5jOjgxNzQKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybiDQz9rBIM3F1sHNySDG1c7Lw6anIgorCisjOiBldmFsLmM6ODI1MgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMg0M/XxdLUwaQgIyVsZCIKKworIzogZXZhbC5jOjgyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMg0M/XxdLUwaQgXCIlc1wiIgorCisjOiBldmFsLmM6ODM5NgorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjINrBx8HM2M6mINrNps7OpjpcbiIKKworIzogZXhfY21kczIuYzo3MAorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGxlYXZlLiIKK21zZ3N0ciAi8M/ewdTPyyDSxdbJzdUgzsHMwcfPxNbV18HOztEuIPfJy8/SydPUz9fVytTFIFwiY29udFwiIMTM0SDXycjPxNUuIgorCisjOiBleF9jbWRzMi5jOjc0IGV4X2RvY21kLmM6NzcwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAi0tHEz8sgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICLLz83BzsTBOiAlcyIKKworIzogZXhfY21kczIuYzoyMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAi+tXQyc7LwSDXIFwiJXMlc1wiINLRxM/LICVsZCIKKworIzogZXhfY21kczIuYzozODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiD0z97L1SDa1dDJzsvJIM7FINrOwcrExc7POiAlcyIKKworIzogZXhfY21kczIuYzo0MTQKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICL2z8TOz6cg1M/ey8kg2tXQyc7LySDOxSDC1czPINfJ2s7B3sXOzyIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAlcyAlcyAgINLRxM/LICVsZCIKKworIzogZXhfY21kcy5jOjIwNTMgZXhfY21kcy5jOjIzMTAgZXhfY21kczIuYzo2MDIKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICL6wdDBzSfR1MHUySDRyyIKKworIzogZXhfY21kczIuYzo2MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAi+sHQwc0n0dTB1Mkg2s2mzskg1yBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6NjI3IGV4X2RvY21kLmM6ODY0NgorbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICLuxc7B2tfBzsnKIgorCisjOiBleF9jbWRzMi5jOjc2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2Mjog9s/Ezs/HzyDawdDJ09Ug0KbTzNEgz9PUwc7O2M+nINrNps7JIMTM0SDC1cbF0sEgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiIgorIu/CxdLF1s7POiDuxdPQz8Sm18HOzyDQz9TSwdDUzMXOzyDXIKbO28nKIMLVxsXSICjQxdLF16bS1MUgwdfUz8vPzcHOxMkpIgorCisjOiBleF9jbWRzMi5jOjEyMDgKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IOzJ28Ugz8TJziDGwcrMINLFxMHH1aTU2NPRIgorCisjOiBleF9jbWRzMi5jOjEyMTAKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6IO7FIM3P1tUg0MXSxcrUySDVINDP0MXSxcTOpsogxsHKzCDaINDF0tvPx88iCisKKyM6IGV4X2NtZHMyLmM6MTIxMgorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiDuxSDNz9bVINDF0sXK1Mkg1SDOwdPU1dDOycogxsHKzCDaIM/T1MHOztjPx88iCisKKyMgbXNnc3RyICJFMTk1OiAiCisjOiBleF9jbWRzMi5jOjE2MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICLwz9vVyyBcIiVzXCIg1yBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY1NgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAi8M/b1csgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE2ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IGZvdW5kIGluICdydW50aW1lcGF0aCc6IFwiJXNcIiIKK21zZ3N0ciAiXCIlc1wiIM7FINrOwcrExc7PINcgJ3J1bnRpbWVwYXRoJyIKKworIzogZXhfY21kczIuYzoxNzE0Cittc2dpZCAiUnVuIE1hY3JvIgorbXNnc3RyICL3ycvPzsHUySDGwcrMIMvPzcHOxCIKKworIzogZXhfY21kczIuYzoxODMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAi7sUgzc/W1SDXycvPzsHUySDEydLFy9TP0qbAOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2MgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAizsXNz9bMydfPINfJy8/OwdTJIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODY0CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAi0tHEz8sgJWxkOiDOxc3P1szJ188g18nLz87B1MkgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLXycvPztXF1NjT0SBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg4MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLS0cTPyyAlbGQ6INfJy8/O1aTU2NPRIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxOTg2CisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICLXycvPzsHOztEgJXMg2sHLps7exc7PIgorCisjOiBleF9jbWRzMi5jOjIyODcKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiDuxdem0s7JyiDSz9rEpszYzsnLINLRxMum1ywgzc/WzMnXzyDC0sHL1aQgXk0iCisKKyM6IGV4X2NtZHMyLmM6MjMzNgorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyDXycvP0snT1MHOzyDQz9rBINfJy8/O1dfBzsnNIMbByszPzSIKKworIzogZXhfY21kczIuYzoyMzY5Cittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IDpmaW5pc2gg18nLz9LJ09TBzs8g0M/awSDXycvPztXXwc7JzSDGwcrMz80iCisKKyM6IGV4X2NtZHMyLmM6MjgzNQorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAi7qbez8fPIMTS1cvV18HUySIKKworIzogZXhfY21kczIuYzoyOTEzCittc2dpZCAiUHJpbnRpbmcgcGFnZSAlZCAoJWQlJSkiCittc2dzdHIgIuTS1cvVpNTY09Eg09TP0qbOy8EgJWQgKCVkKSIKKworIzogZXhfY21kczIuYzoyOTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICIg68/QptEgJWQsINXT2M/HzyAlZCIKKworIzogZXhfY21kczIuYzoyOTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICLuwcTS1cvP18HOzzogJXMiCisKKyM6IGV4X2NtZHMyLmM6Mjk4MQorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIuTS1csg0MXSxdLXwc7PIgorCisjOiBleF9jbWRzMi5jOjMzNTkKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6IO7FIM3P1tUg0MnTwdTJINcg18nIpsTOycogxsHKzCBQb3N0U2NyaXAiCisKKyM6IGV4X2NtZHMyLmM6NDAzNAorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDog7sUgzc/W1SDXpsTL0snUySDRyyDXyKbEzsnKIMbByswgUG9zdFNjcmlwIgorCisjOiBleF9jbWRzMi5jOjQwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1Njog7sUgzc/W1SDXpsTL0snUySDGwcrMIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1Nzog7sUgzc/W1SDa3snUwdTJIMbByswg0sXT1dLTptcgUG9zdFNjcmlwIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MjgxCittc2dpZCAiU2VuZGluZyB0byBwcmludGVyLi4uIgorbXNnc3RyICL3psTTyczBpM3PIM7BIMTS1cum187Jyy4uLiIKKworIzogZXhfY21kczIuYzo0Mjg1Cittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTMyNDog7sUgzc/W1SDOwcTS1cvV18HUySDGwcrMIFBvc3RTY3JpcCIKKworIzogZXhfY21kczIuYzo0Mjg3Cittc2dpZCAiUHJpbnQgam9iIHNlbnQuIgorbXNnc3RyICL6wdfEwc7O0SDE0tXL1SDXpsSm08zBzs8uIgorCisjOiBleF9jbWRzMi5jOjQ2ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIu3P18EgKCVzKTogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ2OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiCittc2dzdHIgIkUxOTc6IO7FIM3P1tUg19PUwc7P18nUySDNz9fVIFwiJXNcIiIKKworIzogZXhfY21kcy5jOjkyCisjLCBjLWZvcm1hdAorbXNnaWQgIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIKK21zZ3N0ciAiPCVzPiVzJXMgICVkLCAg26bTICUwMngsINem0yAlMDNvIgorCisjOiBleF9jbWRzLmM6NDI4Cittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IO7Fzc/WzMnXzyDazabT1MnUySDS0cTLySDTwc2mINUg08XCxSIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAiMSDS0cTPyyDazabdxc7PIgorCisjOiBleF9jbWRzLmM6NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAiJWxkINLRxMum1yDazabdxc7PIgorCisjOiBleF9jbWRzLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAiJWxkINLRxMum1yDXpsTGpszY1NLP18HOzyIKKworIzogZXhfY21kcy5jOjkxOAorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6IOHX1M/Lz83BzsTJICpGaWx0ZXIqIM7FINDP18nOztgg2s2mzsDXwdTJIMLVxsXSIgorCisjOiBleF9jbWRzLmM6MTAwMworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW+7FINrB0MnTwc7PINCm08zRIM/T1MHOztjPpyDazabOyV1cbiIKKworIzogZXhfY21kcy5jOjEyNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICJ2aW1pbmZvOiAlcyDXINLRxMvVIgorCisjOiBleF9jbWRzLmM6MTI1MworbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiDawcLBx8HUzyDQz83JzM/LLCDSxdvUwSDGwcrMwSDP0NXdxc7PIgorCisjOiBleF9jbWRzLmM6MTI4MgorIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgIvreydTVpNTY09EgxsHKzCB2aW1pbmZvOiBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMjgzCittc2dpZCAiIGluZm8iCittc2dzdHIgIiCmzsbP0s3Bw6bRIgorCisjOiBleF9jbWRzLmM6MTI4NAorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiINDP2s7B3svJIgorCisjOiBleF9jbWRzLmM6MTI4NQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiDu5SD35OHs7/PxIgorCisjOiBleF9jbWRzLmM6MTM3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzog9SDGwcrMIHZpbWluZm8gKFwiJXNcIikg2sHQydMgzsUgxM/a18/Mxc7PIgorCisjOiBleF9jbWRzLmM6MTUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiDuxSDNz9bVINrB0MnTwdTJIHZpbWluZm8gxsHKzCAlcyEiCisKKyM6IGV4X2NtZHMuYzoxNTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi+sHQydPVpNTY09EgdmltaW5mbyDGwcrMIFwiJXNcIiIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTYxMAorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIOPFyiDGwcrMIMHX1M/NwdTJ3s7PINPU18/SydcgVmltICVzLlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIyDtz9bF1MUg0sXEwcfV18HUySwgwczFIO/i5fLl9u7vIVxuIgorCisjOiBleF9jbWRzLmM6MTYxNAorbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjIPrOwd7Fzs7RICdlbmNvZGluZycgy8/MySDDxcogxsHKzCDC1czPINrB0MnTwc7PXG4iCisKKyM6IGV4X2NtZHMuYzoxNzEzCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICLuxcTP2tfPzMXOycog08nN18/MIM7BINDP3sHUy9Ug0tHEy8EiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjA5NgorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiDmwcrMINXWxSDawdfBztTB1sXOzyDVIKbO28/N1SDC1cbF0qYiCisKKyM6IGV4X2NtZHMuYzoyMTMwCittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAi+sHQydPB1Mkg3sHT1MnO1SDGwcrMwT8iCisKKyM6IGV4X2NtZHMuYzoyMTM3Cittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IPfJy8/SydPUz9fVytTFICEgxMzRINrB0MnT1SDewdPUyc7JIMLVxsXSwSIKKworIzogZXhfY21kcy5jOjIyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICLwxdLF2sHQydPB1MkgptPO1cDeycogxsHKzCBcIiUqLnNcIj8iCisKKyM6IGV4X2NtZHMuYzoyMzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTog7sXNwaQg18imxM7Px88gxsHKzMEgxMzRIMLVxsXSwSAlbGQiCisKKyM6IGV4X2NtZHMuYzoyMzUzCittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0Mjog5sHKzCDOxSDawdDJ08HOzzog2sHQydMg2sHCz9LPzsXOzyDP0MOmpMAgJ3dyaXRlJyIKKworIzogZXhfY21kcy5jOjIzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIuTM0SBcIiUuKnNcIiDXy8Hawc7PIM/Qw6bAICdyZWFkb25seScuXG4iCisi98kg19PFIN3FIMLB1sGk1MUg0NLPxM/X1snUySDawdDJ0z8iCisKKyM6IGV4X2NtZHMuYzoyNTM4Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICLyxcTBx9XXwdTJIObByswiCisKKyM6IGV4X2NtZHMuYzozMDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDM6IEF1dG9jb21tYW5kcyB1bmV4cGVjdGVkbHkgZGVsZXRlZCBuZXcgYnVmZmVyICVzIgorbXNnc3RyICJFMTQzOiDh19TPy8/Nwc7EwSDOxdPQz8Sm18HOzyDXycTBzMnMwSDOz9fJyiDC1cbF0iAlcyIKKworIzogZXhfY21kcy5jOjMxOTMKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogzsXeydPMz9fJyiDB0sfVzcXO1CDEzNEgOnoiCisKKyM6IGV4X2NtZHMuYzozMjc4Cittc2dpZCAiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIKK21zZ3N0ciAiRTE0NTog9SBydmltIM7FIMTP2tfPzMXOpiDLz83BzsTJIHNoZWxsIgorCisjOiBleF9jbWRzLmM6MzM4NQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6INrSwdrLySDOxSDNz9bV1NggwtXUySDSz9rEpszFzqYgzKbUxdLBzckiCisKKyM6IGV4X2NtZHMuYzozNzIzCisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgIvrBzabOydTJIM7BICVzICh5L24vYS9xL2wvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQwODcKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKPDF0sXS18HOzykgIgorCisjOiBleF9jbWRzLmM6NDA5MQorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICLvxM7BINrBzabOwSIKKworIzogZXhfY21kcy5jOjQwOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIvrBzabOxc7PIC0tICVsZCIKKworIzogZXhfY21kcy5jOjQwOTYKK21zZ2lkICIgb24gMSBsaW5lIgorbXNnc3RyICIg1yDPxM7PzdUg0tHEy9UiCisKKyM6IGV4X2NtZHMuYzo0MDk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiDXICVsZCDS0cTLwcgiCisKKyM6IGV4X2NtZHMuYzo0MTQ5Cittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiA6Z2xvYmFsIM7FIM3P1sUg18nLz9LJ09TP19XXwdTJ09gg0sXL1dLTydfOzyIKKworIzogZXhfY21kcy5jOjQxODQKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODog4tLBy9WkINrSwdrLwSDEzNEgZ2xvYmFsIgorCisjOiBleF9jbWRzLmM6NDIzMworIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIGZvdW5kIGluIGV2ZXJ5IGxpbmU6ICVzIgorbXNnc3RyICL60sHaz8sgzsUg2s7BysTFzs86ICVzIgorCisjOiBleF9jbWRzLmM6NDMxNAorbXNnaWQgIiIKKyJcbiIKKyIjIExhc3QgU3Vic3RpdHV0ZSBTdHJpbmc6XG4iCisiJCIKK21zZ3N0ciAiIgorIlxuIgorIiMg79PUwc7Opsog2tLB2s/LIMTM0SDawc2mzsk6XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQ0MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiD3ycLB3tTFLCDEzNEgJXMgzsXNwaQgxM/Qz83Px8kiCisKKyM6IGV4X2NtZHMuYzo0NDQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAi98nCwd7UxSwgxsHKzCDEz9DPzc/HySBcIiVzXCIgzsUg2s7BysTFzs8iCisKKyM6IGV4X2NtZHMuYzo0ODkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzOiDuxSCkIMTJ0sXL1M/SpqTAIgorCisjOiBleF9jbWRzLmM6NDkyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1Mjog7sUgzc/W1SDXpsTL0snUySAlcyDEzNEg2sHQydPVIgorCisjOiBleF9jbWRzLmM6NDkzNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1Mzog7sUgzc/W1SDXpsTL0snUySAlcyDEzNEg3snUwc7O0SIKKworIzogZXhfY21kcy5jOjUwMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDog8M/E16bKzsEg0M/azsHey8EgXCIlc1wiINcgxsHKzKYgJXMiCisKKyM6IGV4X2NtZHMuYzo1MTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDog7sXXpsTPzcEgy8/Nwc7EwSBzaWduOiAlcyIKKworIzogZXhfY21kcy5jOjUxMzUKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1Njog4tLBy9WkIM7B2tfJIM7B0MnT1SIKKworIzogZXhfY21kcy5jOjUxODEKK21zZ2lkICJFMjU1OiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFMjU1OiD3ydrOwd7Fzs8g2sHCwcfB1M8gzsHQydOm1yIKKworIzogZXhfY21kcy5jOjUyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiDuxdem0s7JyiDOwdDJ0zogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjQ3IGV4X2NtZHMuYzo1NDMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6IO7F16bEz83JyiDOwdDJ0zogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjkzCittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTog4tLBy9WkIMHSx9XNxc7U1SDOwdDJ09UiCisKKyM6IGV4X2NtZHMuYzo1MzczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiDuxdem0s7BIM7B2tfBIMLVxsXSwTogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiDuxdem0s7JyiBJRCDOwdDJ09U6ICVsZCIKKworIzogZXhfY21kcy5jOjU1ODMKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIlv3ycTBzMXOz10iCisKKyM6IGV4X2RvY21kLmM6NDkwCittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIiIKKyLwz97B1M/LINLF1snN1SBFeC4g98nLz9LJ09TP19XK1MUgXCJ2aXN1YWxcIiDEzNEg0M/XxdLOxc7O0SDXIM7P0s3BzNjOycogIgorItLFyMnNIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1MjYKK21zZ2lkICJBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAi4qbM0SDLps7D0SDGwcrMwSIKKworIzogZXhfZG9jbWQuYzo2MDEKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IOvPzcHOxMEg2sHOwcTUzyDSxcvV0tPJ187BIgorCisjOiBleF9kb2NtZC5jOjkxMAorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiDi0sHL1aQgOmVuZHdoaWxlIgorCisjOiBleF9kb2NtZC5jOjkxMgorbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiDi0sHL1aQgOmVuZGlmIgorCisjOiBleF9kb2NtZC5jOjkyMgorbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIuumzsXD2CDXycvPztXXwc7Px88gxsHKzMEiCisKKyM6IGV4X2RvY21kLmM6OTIzCittc2dpZCAiRW5kIG9mIGZ1bmN0aW9uIgorbXNnc3RyICLrps7Fw9ggxtXOy8OmpyIKKworIzogZXhfZG9jbWQuYzoxMzQzCittc2dpZCAiQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAi5NfP2s7B3s7JyiDX1snUz8sgy8/Nwc7EySDLz9LJ09TV18HewSIKKworIzogZXhfZG9jbWQuYzoxMzU3Cittc2dpZCAiTm90IGFuIGVkaXRvciBjb21tYW5kIgorbXNnc3RyICLuxSCkIMvPzcHOxM/AINLFxMHL1M/SwSIKKworIzogZXhfZG9jbWQuYzoxNDQwCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICLuxSDOxdLX1crUxSEiCisKKyM6IGV4X2RvY21kLmM6MTQ1OQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAi7sUgwtXE1SDawcTL1dfB1MkhIgorCisjOiBleF9kb2NtZC5jOjE0NjgKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIu7FIMLVxNUg2sHEy9XXwdTJLCDBzMUgzc/W1SDPwsXSztXUydPRLi4uIgorCisjOiBleF9kb2NtZC5jOjE1NzkKK21zZ2lkICJVc2UgdyBvciB3Pj4iCittc2dzdHIgIvfJy8/SydPUz9fVytTFIDp3IMHCzyA6dz4+IgorCisjOiBleF9kb2NtZC5jOjMwODYKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6IPfJwsHK1MUsIMPRIMvPzcHOxMEgzsUgxKakIgorCisjOiBleF9kb2NtZC5jOjMyNTYKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3Mjog9KbM2MvJIM/EzsUgps0n0SDGwcrMwSDEz9rXz8zFzs8iCisKKyM6IGV4X2RvY21kLmM6MzgxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIv3FIKQgJWQgzsXSxcTBx8/Xwc7JyCDGwcrMptcuIPfJytTJPyIKKworIzogZXhfZG9jbWQuYzozODE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IPrBzMnbyczP09EgJWxkIM7F0sXEwcfP18HOycggxsHKzKbXIgorCisjOiBleF9kb2NtZC5jOjM5MTIKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiB1c2UgISB0byByZWRlZmluZSIKK21zZ3N0ciAiRTE3NDog68/Nwc7EwSDX1sUgptPO1aQsINfJy8/SydPUwcrUxSAhIN3PwiDOxSDa18HWwdTJIgorCisjOiBleF9kb2NtZC5jOjQwMTcKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAg7sHa18EgICAgICAg4dLHLiDtxdbBICDkz9DP187FztEg98nazsHexc7O0SIKKworIzogZXhfZG9jbWQuYzo0MTA2Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICLuxSDazsHKxMXOzyDLz83BzsQgy8/SydPU1dfB3sEiCisKKyM6IGV4X2RvY21kLmM6NDEzNworbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IO7FINfLwdrBzs8gwdTSycLV1CIKKworIzogZXhfZG9jbWQuYzo0MTg5Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiDuxdem0s7BIMumzNjLptPU2CDB0sfVzcXO1KbXIgorCisjOiBleF9kb2NtZC5jOjQyMDQKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiDspt7JzNjOycsgzsUgzc/WxSDC1dTJINfLwdrBzs8gxNem3qYiCisKKyMgbXNnc3RyICJFMTc3OiAiCisjOiBleF9kb2NtZC5jOjQyMTQKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiDuxdem0s7FINDP3sHUy8/XxSDazsHexc7O0SDEzNEgY291bnQiCisKKyMgbXNnc3RyICJFMTc4OiAiCisjOiBleF9kb2NtZC5jOjQyNDIKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IOTM0SDEz9DP187Fzs7RIM7Fz8LIpsTFziDB0sfVzcXO1CIKKworIyBtc2dzdHIgIkUxNzk6ICIKKyM6IGV4X2RvY21kLmM6NDI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDog7sXXptLOwSDXy8HaptfLwSDEzNEgxM/Qz9fOxc7O0TogJXMiCisKKyMgbXNnc3RyICJFMTgwOiAiCisjOiBleF9kb2NtZC5jOjQyNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiDuxdem0s7JyiDB1NLJwtXUOiAlcyIKKworIyBtc2dzdHIgIkUxODE6ICIKKyM6IGV4X2RvY21kLmM6NDMxMAorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiDuxdem0s7BIM7B2tfBIMvPzcHOxMkiCisKKyMgbXNnc3RyICJFMTgyOiAiCisjOiBleF9kb2NtZC5jOjQzMjUKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIkUxODM6IOvPzcHOxMkgy8/SydPU1dfB3sEg0M/Xps7OySDQz97JzsHUydPRINog18XMycvPpyDMptTF0skiCisKKyMgbXNnc3RyICJFMTgzOiAiCisjOiBleF9kb2NtZC5jOjQzOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IOvPzcHOxNUgy8/SydPU1dfB3sEgzsUg2s7BysTFzs86ICVzIgorCisjIG1zZ3N0ciAiRTE4NDogIgorIzogZXhfZG9jbWQuYzo0ODQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTog7sUgzc/WzsEg2s7BytTJINPIxc3VIMvPzNjP0qbXICVzIgorCisjOiBleF9kb2NtZC5jOjQ4NTMKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAi8csg1snXxdTY09EsIMvP0snT1NXXwd4gVmltID8iCisKKyMgbXNnc3RyICJFMTg1OiAiCisjOiBleF9kb2NtZC5jOjU1NTAKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAi8sXEwcfV18HUySDGwcrMINUgzs/Xz83VINemy86mIgorCisjOiBleF9kb2NtZC5jOjU4MTYKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIu7FzcGkIMbByszBIM/CzabO1SIKKworIzogZXhfZG9jbWQuYzo1OTIwCittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIuTP0MnTwdTJIMbByswiCisKKyM6IGV4X2RvY21kLmM6NTk3OQorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4Njog9s/Ezs+nINDP0MXSxcTO2M+nIMTJ0sXL1M/SpqciCisKKyMgbXNnc3RyICJFMTg2OiAiCisjOiBleF9kb2NtZC5jOjYwNTYKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiDuxdemxM/NwSDEydLFy9TP0qbRIgorCisjIG1zZ3N0ciAiRTE4NzogIgorIzogZXhfZG9jbWQuYzo2MTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAi8M/aycOm0SDXpsvOwTogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo2MTc5Cittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIkUxODg6IObVzsvDptEgz8LSwcjV18HOztEg0M/aycOmpyDXpsvOwSDOxSDEpqQgxMzRINfB28+nINDMwdTGz9LNySIKKworIyBtc2dzdHIgIkUxODg6ICIKKyM6IGV4X2RvY21kLmM6NjQ0NQorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIvrB0MHNJ9HUwdTJINDF0sXBxNLF08/Xwc7JyiDXydemxCIKKworIzogZXhfZG9jbWQuYzo2NTk0Cittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICL6wdDBzSfR1MHUySDXycfM0cQiCisKKyM6IGV4X2RvY21kLmM6NjU5NQorbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAi+sHQwc0n0dTB1Mkg08XBztMiCisKKyM6IGV4X2RvY21kLmM6NjU5NworbXNnaWQgIlNhdmUgU2V0dXAiCittc2dzdHIgIvrB0MHNJ9HUwdTJIM7BzMHb1NXXwc7O0SIKKworIzogZXhfZG9jbWQuYzo2NzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTog5sHKzCBcIiVzXCIgptPO1aQsICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyMgbXNnc3RyICJFMTg5OiAiCisjOiBleF9kb2NtZC5jOjY3NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiDuxSDNz9bVINemxMvSydTJIFwiJXNcIiDEzNEg3snUwc7O0SIKKworIyBtc2dzdHIgIkUxOTA6ICIKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY3NzUKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6IOHSx9XNxc7UIM3BpCDC1dTJIMym1MXSz8AsIGAgwcLPICciCisKKyMgbXNnc3RyICJFMTkxOiAiCisjOiBleF9kb2NtZC5jOjY4MTgKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IPLFy9XS08nXzsEgx8zJwsnOwSDXxcvP0snT1MHOztEgOm5vcm1hbCDawc7BxNLPINfFzMnLwSIKKworIzogZXhfZG9jbWQuYzo3MTc5Cittc2dpZCAiOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIvrBzsHE1M8g18XMycvBIMumzNjLptPU2CDXy8zBxMXOycggOmlmIgorCisjOiBleF9kb2NtZC5jOjcyMTQKK21zZ2lkICI6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIuLSwcvVpCDXpsTQz9emxM7Px88gOmlmIMTM0SA6ZW5kaWYiCisKKyM6IGV4X2RvY21kLmM6NzIzNAorbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICLi0sHL1aQg16bE0M/XpsTOz8fPIDppZiDEzNEgOmVsc2UiCisKKyM6IGV4X2RvY21kLmM6NzIzNgorbXNnaWQgIjplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIuLSwcvVpCDXpsTQz9emxM7Px88gOmlmIMTM0SA6ZWxzZWlmIgorCisjOiBleF9kb2NtZC5jOjcyODgKK21zZ2lkICI6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAi+sHOwcTUzyDXxczJy8Egy6bM2Mum09TYINfLzMHExc7JyCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzMzNAorbXNnaWQgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAi4tLBy9WkINemxNDP16bEzs/HzyA6d2hpbGUgxMzRIDpjb250aW51ZSIKKworIzogZXhfZG9jbWQuYzo3MzYxCittc2dpZCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICLi0sHL1aQg16bE0M/XpsTOz8fPIDp3aGlsZSDEzNEgOmJyZWFrIgorCisjOiBleF9kb2NtZC5jOjczODQgZXhfZG9jbWQuYzo3Mzg5Cittc2dpZCAiOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICLi0sHL1aQg16bE0M/XpsTOz8fPIDp3aGlsZSDEzNEgOmVuZHdoaWxlIgorCisjOiBleF9kb2NtZC5jOjc0MTAKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiA6ZW5kZnVuY3Rpb24g0M/awSDNxdbBzckgxtXOy8OmpyIKKworIyBtc2dzdHIgIkUxOTM6ICIKKyM6IGV4X2RvY21kLmM6NzU5MAorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiDuxc3BpCDX1M/Syc7Oz8fPIMbByszBIMTM0SDawc2mzskgJyMnIgorCisjOiBleF9kb2NtZC5jOjc2MjEKK21zZ2lkICJubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIu7FIM3P1s7BINrBzabOydTJIFwiPGFmaWxlPlwiINcgwdfUz8vPzcHOxKYsIKbNJ9EgxsHKzMEg16bE09XUzqakIgorCisjOiBleF9kb2NtZC5jOjc2MjkKK21zZ2lkICJubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIu7FIM3P1s7BINrBzabOydTJIFwiPGFidWY+XCIg1yDB19TPy8/Nwc7EpiwgzsHa18EgwtXGxdLBINemxNPV1M7RIgorCisjOiBleF9kb2NtZC5jOjc2NDAKK21zZ2lkICJubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiIgorIu7FIM3P1s7BINrBzabOydTJIFwiPGFtYXRjaD5cIiDXIMHX1M/Lz83BzsSmLCDEzNEg2sKmx9UgzsUg18nLz9LJ09TP18HMz9PYICIKKyKmzSfRIgorCisjOiBleF9kb2NtZC5jOjc2NTAKK21zZ2lkICJubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAi7sUgzc/WzsEg2sHNps7J1MkgXCI8c2ZpbGU+XCIg1yDB19TPy8/Nwc7Epiwgps0n0SDGwcrMwSDXpsTT1dTOpqQiCisKKyM6IGV4X2RvY21kLmM6NzY5MQorIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAi8M/Sz9bOxSCmzSfRIMbByszBIMTM0SAnJScg1MEgJyMnINDSwcPApCDMydvFINogXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6NzY5MworbXNnaWQgIkV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIvLF2tXM2NTB1CAtLSDQz9LP1s6myiDS0cTPyyIKKworIzogZXhfZG9jbWQuYzo4NjI4Cittc2dpZCAiRTE5NTogQ2Fubm90IG9wZW4gdmltaW5mbyBmaWxlIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTk1OiDuxSDNz9bVINemxMvSydTJIMbByswgdmltaW5mbyIKKworIzogZXhfZG9jbWQuYzo4ODAxCittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiD1IMOmyiDXxdLTpqcgzsXNwaQgxMnH0sHGptciCisKKyMgbXNnc3RyICJFMTk3OiAiCisjOiBleF9nZXRsbi5jOjI3ODUKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICLOwdrXwSDQz82m1MvJIgorCisjOiBleF9nZXRsbi5jOjI3ODgKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIiDUydAgxsHKzMFcbiIKKworIzogZXhfZ2V0bG4uYzozOTk3Cittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICLv0MOm0SAnaGlzdG9yeScg0M/Sz9bO0SIKKworIzogZXhfZ2V0bG4uYzo0MjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDwz9DF0sXEzqYgJXM6XG4iCisKKyM6IGV4X2dldGxuLmM6NDIzOAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAiy8/Nwc7EySIKKworIzogZXhfZ2V0bG4uYzo0MjM5Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAi2tLB2svJIMTM0SDQz9vVy9UiCisKKyM6IGV4X2dldGxuLmM6NDI0MAorbXNnaWQgIkV4cHJlc3Npb24iCittc2dzdHIgItfJ0sHaySIKKworIzogZXhfZ2V0bG4uYzo0MjQxCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAi19fFxMXOpiDS0cTLySIKKworIzogZXhfZ2V0bG4uYzo0MjcxCittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6ICIKKworIzogZXhfZ2V0bG4uYzo0NDM1Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTog4cvUydfOxSDXpsvOzyDBws8gwtXGxdIgwtXMzyDXycTBzMXOzyIKKworIyBtc2dzdHIgIkUxOTk6ICIKKyM6IGZpbGVpby5jOjM0NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICLuxcTP2tfPzMXOxSCmzSfRIMbByszBIgorCisjOiBmaWxlaW8uYzozNzEgZmlsZWlvLmM6NDk1IGZpbGVpby5jOjI0OTMgZmlsZWlvLmM6MjUzMQorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICLDxSDEydLFy9TP0qbRIgorCisjOiBmaWxlaW8uYzozNzMKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICLOxSDGwcrMIgorCisjOiBmaWxlaW8uYzo1MTUgZmlsZWlvLmM6MzYwNAorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIlvuz9fJyiDGwcrMXSIKKworIzogZmlsZWlvLmM6NTMyCittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW/emxM3P18zFzs9dIgorCisjOiBmaWxlaW8uYzo2MjQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiDh19TPy8/Nwc7EySAqUmVhZFByZSDa0s/CyczJIN7J1MHOztEgxsHKzMEgzsXNz9bMydfJzSIKKworIyBtc2dzdHIgIkUyMDA6ICIKKyM6IGZpbGVpby5jOjYyNgorbXNnaWQgIkUyMDE6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUyMDE6IOHX1M/Lz83BzsTJICpSZWFkUHJlIM7FIM3BpNTYINDSwdfBINrNps7A18HUySDC1cbF0iIKKworIyBtc2dzdHIgIkUyMDE6ICIKKyM6IGZpbGVpby5jOjY0NgorbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTog/snUwcXNzyDaIHN0ZGluLi4uXG4iCisKKyM6IGZpbGVpby5jOjY1MgorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAi/snUwcXNzyDaIHN0ZGluLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjg3NgorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiDrz87XxdLU1dfBzs7RINrSz8LJzM8g3snUwc7O0SDGwcrMwSDOxc3P1szJ18nNISIKKworIyBtc2dzdHIgIkUyMDI6ICIKKyM6IGZpbGVpby5jOjE3MzIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby/Tz8vF1F0iCisKKyM6IGZpbGVpby5jOjE3MzkKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltmaWZvXSIKKworIzogZmlsZWlvLmM6MTc0NgorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJb08/LxdRdIgorCisjOiBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW1JPXSIKK21zZ3N0ciAiW1JPXSIKKworIzogZmlsZWlvLmM6MTc2NAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW/fU0sHexc7PIENSXSIKKworIzogZmlsZWlvLmM6MTc2OQorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIlv6zsHKxMXOzyBOTF0iCisKKyM6IGZpbGVpby5jOjE3NzQKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIlvkz9fHpiDS0cTLySDQz8TSpsLOxc7PXSIKKworIzogZmlsZWlvLmM6MTc4MCBmaWxlaW8uYzozNTg4Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJb7uUgy8/O18XS1M/Xwc7PXSIKKworIzogZmlsZWlvLmM6MTc4NSBmaWxlaW8uYzozNTkzCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvLz87XxdLUz9fBzs9dIgorCisjOiBmaWxlaW8uYzoxNzkyIGZpbGVpby5jOjM2MTgKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlvawdvJxtLP18HOz10iCisKKyM6IGZpbGVpby5jOjE3OTkKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIlvw7+3p7OvhIOvv7vfl8vT19+Hu7vFdIgorCisjOiBmaWxlaW8uYzoxODA2Cittc2dpZCAiW1JFQUQgRVJST1JTXSIKK21zZ3N0ciAiW/Dv7ens6+Eg+v7p9PX34e7u8V0iCisKKyM6IGZpbGVpby5jOjIwMTMKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAi7sUgzc/W1SDQpsTb1cvB1Mkg1MnN3sHTz9fJyiDGwcrMIMTM0SDLz87XxdLU1dfBzs7RIgorCisjOiBmaWxlaW8uYzoyMDIwCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICLrz9fOxdLU1dfBzs7RINogJ2NoYXJjb252ZXJ0JyDOxSDXxMHMz9PRIgorCisjOiBmaWxlaW8uYzoyMDIzCittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAizsUgzc/W1SDa3snUwdTJINfJ16bEICdjaGFyY29udmVydCciCisKKyM6IGZpbGVpby5jOjI0MDkKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzog4dfUz8vPzcHOxMEg18nEwczJzMEgwcLPINfJ18HO1MHWyczBIMLVxsXSIN3PIM3BpCDC1dTJINrB0MnTwc7JyiIKKworIzogZmlsZWlvLmM6MjQzMgorbXNnaWQgIkUyMDQ6IEF1dG9jb21tYW5kIGNoYW5nZWQgbnVtYmVyIG9mIGxpbmVzIGluIHVuZXhwZWN0ZWQgd2F5IgorbXNnc3RyICJFMjA0OiDh19TPy8/Nwc7EwSDazabOyczBIMumzNjL2NPU2CDS0cTLptcgzsXT0M/EptfBzsnNIN7Jzs/NIgorCisjOiBmaWxlaW8uYzoyNDk4IGZpbGVpby5jOjI1MTUKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAizsUgpCDGwcrMz80g3skg0NLJ09TSz6TNINogzc/WzMnXptPUwCDawdDJ09UiCisKKyM6IGZpbGVpby5jOjI1NjEKK21zZ2lkICJpcyByZWFkLW9ubHkgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAizc/WzsEgzMnbxSDeydTB1MkgKNfJy8/SydPUwcrUxSAhIN3PwiDOxSDa18HWwdTJKSIKKworIzogZmlsZWlvLmM6Mjg1NworbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIu7FIM3P1tUg2sHQydPB1Mkg0sXaxdLXzsnKIMbByswgKNfJy8/SydPUwcrUxSAhIN3PwiDOxSDa18HWwdTJKSIKKworIzogZmlsZWlvLmM6Mjg2OQorbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLwz83JzMvBINCmxCDewdMg09DSz8LJINrBy9LJ1Mkg0sXaxdLXzsnKIMbByswiCisKKyM6IGZpbGVpby5jOjI4NzEKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisi7sXNwaQg2s3Px8kg09TXz9LJ1MkgxsHKzCDEzNEg0sXaxdLXzs+nIMvP0KanICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGZpbGVpby5jOjI4ODcKK21zZ2lkICJDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIu7FzcGkINrNz8fJINPU18/SydTJINLF2sXS187VIMvP0KbAICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGZpbGVpby5jOjI5ODkKK21zZ2lkICJDYW4ndCBtYWtlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIu7FzcGkINrNz8fJINPU18/SydTJINLF2sXS187VIMvP0KbAICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGZpbGVpby5jOjMwNTEKK21zZ2lkICJUaGUgcmVzb3VyY2UgZm9yayB3aWxsIGJlIGxvc3QgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAi8sXT1dLTztUgx6bMy9UgxsHKzMEgwtXExSDX1NLB3sXOzyAoISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGZpbGVpby5jOjMxNDAKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDog7sUgzc/W1SDQpsTb1cvB1Mkg1MnN3sHTz9fJyiDGwcrMIMTM0SDawdDJ09UiCisKKyM6IGZpbGVpby5jOjMxNTgKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAodXNlICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiIgorIkUyMTM6IO7FIM3P1tUgy8/O18XS1NXXwdTJICjXycvP0snT1MHK1MUgISDdz8Ig2sHQydPB1MkgwsXaIMvPztfF0tTV18HOztEpIgorCisjOiBmaWxlaW8uYzozMTkzCittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2Njog7sUgzc/W1SDXpsTL0snUySDEzNEg2sHQydPVIMbByswgzsEg0cvJyiDXy8Ha1aQg0M/TyczBzs7RIgorCisjOiBmaWxlaW8uYzozMTk3Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiDuxSDNz9bVINemxMvSydTJIMbByswgxMzRINrB0MnT1SIKKworIzogZmlsZWlvLmM6MzQ0NgorbXNnaWQgIkNsb3NlIGZhaWxlZCIKK21zZ3N0ciAi7sUg18TBzM/T0SDawcvSydTJIMbByswiCisKKyM6IGZpbGVpby5jOjM1MDQKK21zZ2lkICJ3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgItDPzcnMy8Eg2sHQydPVLCDLz87XxdLU1dfBzs7RIM7FINfEwczP09EiCisKKyM6IGZpbGVpby5jOjM1MTAKK21zZ2lkICJ3cml0ZSBlcnJvciAoZmlsZSBzeXN0ZW0gZnVsbD8pIgorbXNnc3RyICLQz83JzMvBINrB0MnT1SAo08umzt7JzM/T2CDXpszYzsUgzabTw8U/PykiCisKKyM6IGZpbGVpby5jOjM1ODMKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiIPDv7ens6+Eg6+/u9+Xy9PX34e7u8SIKKworIzogZmlsZWlvLmM6MzU5OQorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJb8NLJ09TSpspdIgorCisjOiBmaWxlaW8uYzozNjA0Cittc2dpZCAiW05ld10iCittc2dzdHIgIlvuz9fJyl0iCisKKyM6IGZpbGVpby5jOjM2MjYKK21zZ2lkICIgW2FdIgorbXNnc3RyICJbxF0iCisKKyM6IGZpbGVpby5jOjM2MjYKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiDEz9DJ08HOycoiCisKKyM6IGZpbGVpby5jOjM2MjgKK21zZ2lkICIgW3ddIgorbXNnc3RyICJb2l0iCisKKyM6IGZpbGVpby5jOjM2MjgKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiINrB0MnTwc7JyiIKKworIzogZmlsZWlvLmM6MzY3OAorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiDyxdbJzSBwYXRjaDogzsUgzc/W1SDawdDJ08HUySDQxdLXyc7OycogxsHKzCIKKworIzogZmlsZWlvLmM6MzcwMAorbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjog8sXWyc0gcGF0Y2g6IM7FIM3P1tUg09TXz9LJ1Mkg0NXT1MnKINDF0tfJzs7JyiDGwcrMIgorCisjOiBmaWxlaW8uYzozNzE1Cittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiDuxSDNz9bVINfJxMHMyczBINLF2sXS187JyiDGwcrMIgorCisjOiBmaWxlaW8uYzozNzY3Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisi9ffh5+E6IPDP3sHUy8/XycogxsHKzCDNz9bFIMLV1Mkg19TSwd7FzsnKIMHCzyDXycTBzMXOycpcbiIKKworIzogZmlsZWlvLmM6Mzc2OQorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIu7FINfJyM/E2NTFINog0sXEwcvUz9LBIMTP0M/LySDGwcrMIM7FIMLVxMUg2sHQydPBzs8iCisKKyM6IGZpbGVpby5jOjM4NDkKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW8TP010iCisKKyM6IGZpbGVpby5jOjM4NDkKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIlvGz9LNwdQgZG9zXSIKKworIzogZmlsZWlvLmM6Mzg1NgorbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6Mzg1NgorbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW8bP0s3B1CBtYWNdIgorCisjOiBmaWxlaW8uYzozODYzCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM4NjMKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCDGz9LNwdRdIgorCisjOiBmaWxlaW8uYzozODkwCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIs/Eyc4g0tHEz8ssICIKKworIzogZmlsZWlvLmM6Mzg5MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkINLRxMum1ywgIgorCisjOiBmaWxlaW8uYzozODk1Cittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgIs/Eyc4g08nN18/MIgorCisjOiBmaWxlaW8uYzozODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGQg08nN18/MptciCisKKyM6IGZpbGVpby5jOjM5MDcKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzozOTA3Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW87F0M/XzsnKIM/T1MHOpsog0tHEz8tdIgorCisjLiBkb24ndCBvdmVyd3JpdGUgbWVzc2FnZXMgaGVyZQorIy4gbXVzdCBnaXZlIHRoaXMgcHJvbXB0CisjLiBkb24ndCB1c2UgZW1zZygpIGhlcmUsIGRvbid0IHdhbnQgdG8gZmx1c2ggdGhlIGJ1ZmZlcnMKKyM6IGZpbGVpby5jOjM5MjYKK21zZ2lkICJXQVJOSU5HOiBUaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHJlYWRpbmcgaXQhISEiCittc2dzdHIgIvX34efhOiDmwcrMIMLVzM8g2s2mzsXOzyDQptPM0SDa3snUwc7O0SEhISIKKworIzogZmlsZWlvLmM6MzkyOAorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAi98kgxKbK087PIMjP3sXUxSDKz8fPINDF0sXawdDJ08HUySA/PyIKKworIzogZmlsZWlvLmM6NDg4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODog8M/NyczLwSDawdDJ09Ug1yBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ4OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IPDPzcnMy8Eg0KbEIN7B0yDawcvSydTU0SBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjQ4OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IPDPzcnMy8Eg0KbEIN7B0yDa3snU1dfBzs7RIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTA1OAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IOHX1M/Lz83BzsTBIEZpbGVDaGFuZ2VkU2hlbGwg18nEwczJzMEgwtXGxdIiCisKKyM6IGZpbGVpby5jOjUwNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTog9dfBx8E6IObByswgXCIlc1wiIM7FxM/T0dbOycoiCisKKyM6IGZpbGVpby5jOjUwNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICIiCisiVzEyOiD118HHwTog5sHKzCBcIiVzXCIgwtXMzyDazabOxc7PLCDBzMUgyiDC1cbF0iDVIFZpbSDUxdYgwtXMzyDazabOxc7PIgorCisjOiBmaWxlaW8uYzo1MDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IPXXwcfBOiDmwcrMIFwiJXNcIiDC1czPINrNps7Fzs8g0KbTzNEg0M/ewdTL1SDSxcTBx9XXwc7O0SIKKworIzogZmlsZWlvLmM6NTA4NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTY6IPXXwcfBOiDyxdbJzSDGwcrMwSBcIiVzXCIgwtXMzyDazabOxc7PINCm08zRINDP3sHUy9Ug0sXEwcfV18HOztEiCisKKyM6IGZpbGVpby5jOjUwOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzEzOiD118HHwTog5sHKzCBcIiVzXCIgwtXMzyDT1NfP0sXOzyDQptPM0SDQz97F1MvVINLFxMHH1dfBzs7RIgorCisjOiBmaWxlaW8uYzo1MTExCittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAi9dfBx8EiCisKKyM6IGZpbGVpby5jOjUxMTIKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIiZPOufB0sHaxFxuIgorIiZMOvrB18HO1MHWydTJIMbByswiCisKKyM6IGZpbGVpby5jOjUxODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IO7FIM3P1tUg0MXSxdfBztTB1snUySBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU3MDMKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS33ycTBzMXOzy0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NTg2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6IOfS1dDBIM7FIKbTztWkOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6IO7FxM/a18/Mxc7JyiDTyc3Xz8wg0KbTzNEgKjogJXMiCisKKyMgbXNnc3RyICJFMjE1OiAiCisjOiBmaWxlaW8uYzo1OTk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiDwz8Sm0SDOxSCm087VpDogJXMiCisKKyMgbXNnc3RyICJFMjE2OiAiCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYxNDgKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOHX1M/Lz83BzsTJIC0tLSIKKworIzogZmlsZWlvLmM6NjQxOQorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiDuxSDNz9bVINfJy8/O1dfB1MkgwdfUz8vPzcHOxMkgxMzRIPXztugg0M/EpsoiCisKKyMgbXNnc3RyICJFMjE3OiAiCisjOiBmaWxlaW8uYzo2NDQyCittc2dpZCAiTm8gbWF0Y2hpbmcgYXV0b2NvbW1hbmRzIgorbXNnc3RyICLuxSCm087VpCDXpsTQz9emxM7JyCDB19TPy8/Nwc7EIgorCisjOiBmaWxlaW8uYzo2NzE0Cittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAi+sHOwcTUzyDXxczJy8Egy6bM2Mum09TYINfLzMHExc7JyCDB19TPy8/Nwc7EIgorCisjIG1zZ3N0ciAiRTIxODogIgorIzogZmlsZWlvLmM6NzAwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIOHX1M/Lz83BzsTJIMTM0SBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjcwMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICL3ycvPztXF1NjT0SAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MDc3CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICLB19TPy8/Nwc7EwSAlcyIKKworIzogZmlsZWlvLmM6NzU5OQorbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIvfU0sHexc7PIHsuIgorCisjIG1zZ3N0ciAiRTIxOTogIgorIzogZmlsZWlvLmM6NzYwMQorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIvfU0sHexc7PIH0uIgorCisjIG1zZ3N0ciAiRTIyMDogIgorIzogZm9sZC5jOjY2Cittc2dpZCAiTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAi+sfP0tTPyyDOxSDazsHKxMXOzyIKKworIyBtc2dzdHIgIkUzNDk6ICIKKyM6IGZvbGQuYzo1NTQKK21zZ2lkICJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MDog7sUgzc/W1SDT1NfP0snUySDax8/S1M/LICja18HWwcDeySDOwSAnZm9sZG1ldGhvZCcpIgorCisjOiBmb2xkLmM6NTU2Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IO7FIM3P1tUg18nEwczJ1Mkg2sfP0tTPyyAo2tfB1sHA3skgzsEgJ2ZvbGRtZXRob2QnKSIKKworIzogZm9sZC5jOjE3MDEKK21zZ2lkICJFMjIxOiAnY29tbWVudHN0cmluZycgaXMgZW1wdHkiCittc2dzdHIgIkUyMjE6IM/Qw6bRICdjb21tZW50c3RyaW5nJyDQz9LP1s7RIgorCisjOiBnZXRjaGFyLmM6MjQ3Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiDi1cbF0iDV1sUgwtXMzyDa3snUwc7PIFvQz83JzMvBINDSz8fSwc3JXSIKKworIzogZ2V0Y2hhci5jOjIxMDYKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTMzMjog+sHNps7BINrBw8nLzMXOwSIKKworIyBtc2dzdHIgIkUyMjM6ICIKKyM6IGdldGNoYXIuYzoyOTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjQ6IGdsb2JhbCBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICL6wcfBzNjOxSDTy8/Sz97Fzs7RIMTM0SAlcyDX1sUgptPO1aQiCisKKyMgbXNnc3RyICJFMjI0OiAiCisjOiBnZXRjaGFyLmM6Mjk2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIvrBx8HM2M7BINrBzabOwSDEzNEgJXMg19bFIKbTztWkIgorCisjIG1zZ3N0ciAiRTIyNTogIgorIzogZ2V0Y2hhci5jOjMwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAi88vP0s/exc7O0SDEzNEgJXMg19PFIKbTztWkIgorCisjIG1zZ3N0ciAiRTIyNjogIgorIzogZ2V0Y2hhci5jOjMwOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIvrBzabOwSDEzNEgJXMg19bFIKbTztWkIgorCisjIG1zZ3N0ciAiRTIyNzogIgorIzogZ2V0Y2hhci5jOjMxNTUKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIvPLz9LP3sXOztEgzsUg2s7BysTFzs8iCisKKyM6IGdldGNoYXIuYzozMTU3Cittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAi+sHNps7JIM7FINrOwcrExc7PIgorCisjOiBnZXRjaGFyLmM6Mzk4MgorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDog987V1NKm287RINDPzcnMy8EiCisKKyM6IGd1aV9hdF9mcy5jOjI5MAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI8zsXNz9bMydfPINemxMvSydTJPiAiCisKKyM6IGd1aV9hdF9mcy5jOjExMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJ2aW1fU2VsRmlsZTogzsUgzc/W1SDP1NLJzcHUySDb0snG1CAlcyIKKworIzogZ3VpX2F0X2ZzLmM6MjUzOAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiDOxSDNz9bVINDP18XSzsnU1dPRINcg0M/Uz97O1SDEydLFy9TP0qbAIgorCisjOiBndWlfYXRfZnMuYzoyNTU3Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICL7zNHIOiIKKworIzogZ3VpX2F0X2ZzLmM6MjU2MworbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiDOxSDNz9bVIMSm09TB1Mkg0M/Uz97O1SDEydLFy9TP0qbAIgorCisjOiBndWlfYXRfZnMuYzoyNTcxIGd1aV9tb3RpZi5jOjE2MDcKK21zZ2lkICJPSyIKK21zZ3N0ciAiT0siCisKKyMuICdDYW5jZWwnIGJ1dHRvbgorIzogZ3VpX2F0X2ZzLmM6MjU3MSBndWlfZ3RrLmM6MTY4OSBndWlfbW90aWYuYzoxNjAyIGd1aV9tb3RpZi5jOjI4MjMKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIkNhbmNlbCIKKworIzogZ3VpX2F0aGVuYS5jOjE5MzggZ3VpX21vdGlmLmM6MTg1NQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIuSmwczPxyBWaW0iCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAiU2Nyb2xsYmFyIFdpZGdldDogzsUgzc/W1SDX2s7B1Mkg0s/azabSINPLz9LP3sXOz6cgy8HS1MnOy8kuIgorCisjOiBndWlfYmV2YWwuYzo2OAorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICIiCisiRTIzMjog7sUgzc/W1SDT1NfP0snUySBCYWxsb29uRXZhbCDaINDP16bEz83Mxc7O0c0gpiDG1c7Lw6akwCDPxM7P3sHTzs8iCisKKyMgbXNnc3RyICJFMjI4OiAiCisjOiBndWkuYzoxODEKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTog7sUgzc/W1SDSz9rQz97B1MkgR1VJIgorCisjIG1zZ3N0ciAiRTIyOTogIgorIzogZ3VpLmM6MzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiDuxSDNz9bVIN7J1MHUySDaIFwiJXNcIiIKKworIyBtc2dzdHIgIkUyMzA6ICIKKyM6IGd1aS5jOjQzMQorbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogJ2d1aWZvbnR3aWRlJyDXydrOwd7Fzs8gzsXXptLOzyIKKworIyBtc2dzdHIgIkUyMzE6ICIKKyM6IGd1aS5jOjM5MjgKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAi8M/NyczLwSIKKworIzogZ3VpLmM6MzkyOQorbXNnaWQgIiZPayIKK21zZ3N0ciAiJk9rIgorCisjIG1zZ3N0ciAiRTIzMjogIgorIzogZ3VpX2d0ay5jOjExNDgKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICLkpsHMz8cgVmltLi4uIgorCisjOiBndWlfZ3RrLmM6MTUyNSBndWlfbW90aWYuYzoyNzQyCittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSD6zsHK1MkgpiDawc2mzsnUyS4uLiIKKworIzogZ3VpX2d0ay5jOjE1MzAgZ3VpX21vdGlmLmM6Mjc0NAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0g8M/b1csiCisKKyM6IGd1aV9ndGsuYzoxNTUzIGd1aV9tb3RpZi5jOjI4NjIKK21zZ2lkICJGaW5kIHdoYXQ6IgorbXNnc3RyICL6zsHK1Mk6IgorCisjOiBndWlfZ3RrLmM6MTU3MSBndWlfbW90aWYuYzoyODk0Cittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAi+sHNps7BOiIKKworIy4gZXhhY3QgbWF0Y2ggb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjAzIGd1aV9tb3RpZi5jOjI5OTYKK21zZ2lkICJNYXRjaCBleGFjdCB3b3JkIG9ubHkiCittc2dzdHIgIvfXwdbB1Mkg2sEg2sKmxyDMydvFINDP187FINPMz9fPIgorCisjOiBndWlfZ3RrLmM6MTYxNSBndWlfbW90aWYuYzoyOTY0Cittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICLuwdDS0c0iCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MTYyNyBndWlfbW90aWYuYzoyOTc2Cittc2dpZCAiVXAiCittc2dzdHIgIuTPx8/SySIKKworIzogZ3VpX2d0ay5jOjE2MzEgZ3VpX21vdGlmLmM6Mjk4NAorbXNnaWQgIkRvd24iCittc2dzdHIgIvXOydoiCisKKyMuICdGaW5kIE5leHQnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NTMgZ3VpX21vdGlmLmM6Mjc2NgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAi+s7BytTJIM7B09TV0M7JyiDXwdKmwc7UIgorCisjLiAnUmVwbGFjZScgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY3MCBndWlfbW90aWYuYzoyNzgzCittc2dpZCAiUmVwbGFjZSIKK21zZ3N0ciAi+sHNps7J1MkiCisKKyMuICdSZXBsYWNlIEFsbCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY3OSBndWlfbW90aWYuYzoyNzk2Cittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIvrBzabOydTJINXTpiIKKworIzogZ3VpX2d0a194MTEuYzoxMDc4IGd1aV94MTEuYzoxMTk5Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzog7sUgzc/W1SDXpsTL0snUySDEydPQzMXKIgorCisjIG1zZ3N0ciAiRTIzMzogIgorIzogZ3VpX2d0a194MTEuYzoyNDM1IGd1aV94MTEuYzoyMDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IO7F16bEz83JyiBmb250c2V0OiAlcyIKKworIyBtc2dzdHIgIkUyMzQ6ICIKKyM6IGd1aV9ndGtfeDExLmM6MjQ2MgorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICL3ycSmzMXOztEiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcwNCBndWlfbWFjLmM6Mjc4MCBndWlfdzQ4LmM6MTE5NyBndWlfeDExLmM6MTgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICLuxdemxM/Nycog29LJxtQ6ICVzIgorCisjIG1zZ3N0ciAiRTIzNTogIgorIzogZ3VpX2d0a194MTEuYzoyNzE1IGd1aV94MTEuYzoxODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjog+9LJxtQgXCIlc1wiIM7FIM3Pzs/bydLJzs7JyiIKKworIyBtc2dzdHIgIkUyMzY6ICIKKyM6IGd1aV9ndGtfeDExLmM6Mjg0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBDb2xvciBuYW1lIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTI0Mjog7sXa0s/a1c2mzMEgzsHa18Egy8/M2M/S1TogJXMiCisKKyMgbXNnc3RyICJFMjQyOiAiCisjOiBndWlfZ3RrX3gxMS5jOjM1MjEgdWkuYzoxOTI5Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAi98nLz9LJ09TBzs8gQ1VUX0JVRkZFUjAg2sHNptPU2CDQz9LP1s7Yz8fPINfJxKbMxc7O0SIKKworIzogZ3VpX21vdGlmLmM6MTYwMSBndWlfbW90aWYuYzoxNjA0Cittc2dpZCAiRmlsdGVyIgorbXNnc3RyICLmpszY1NIiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDMKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAixMnSxcvUz9KmpyIKKworIzogZ3VpX21vdGlmLmM6MTYwNQorbXNnaWQgIkhlbHAiCittc2dzdHIgIuTP0M/Nz8fBIgorCisjOiBndWlfbW90aWYuYzoxNjA2Cittc2dpZCAiRmlsZXMiCittc2dzdHIgIubByszJIgorCisjOiBndWlfbW90aWYuYzoxNjA4Cittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICL3ycKm0iDb0snG1MEiCisKKyM6IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJVbmRvIgorbXNnc3RyICL3psTNps7BIgorCisjOiBndWlfcmlzY29zLmM6OTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiIgorIkUyMzU6IPEgzsUg2s7BwCDdzyDUwcvFIHJpc2Nvcywg1yD1y9LBp86mINTBy8/HzyDOxc3BpC4uICjBINTV1CDdxSDKINHLycrT2CAiCisi29LJxtQgzsUgyM/exSDXwc7UwdbJ1MnT0TogJXMpIgorCisjIG1zZ3N0ciAiRTIzNTogIgorIzogZ3VpX3Jpc2Nvcy5jOjEwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkUyMzU6IO7FIM3P1tUg18nLz9LJ09TB1Mkg29LJxtQgJXMiCisKKyMgbXNnc3RyICJFMjM1OiAiCisjOiBndWlfcmlzY29zLmM6MTE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBNaXNzaW5nIGNvbG9yOiAlcyIKK21zZ3N0ciAiRTI0Mjog99TSwd7Fzs8gy8/MptI6ICVzIgorCisjIG1zZ3N0ciAiRTI0MjogIgorIzogZ3VpX3Jpc2Nvcy5jOjMyNjkKK21zZ2lkICIiCisiXG4iCisiU2VuZGluZyBtZXNzYWdlIHRvIHRlcm1pbmF0ZSBjaGlsZCBwcm9jZXNzLlxuIgorbXNnc3RyICIiCisiXG4iCisi7NHLwaTNzyDEptTFyiDNpsymw6bPzsXSz80uIDotKVxuIgorCisjOiBndWlfdzMyLmM6ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICIiCisiRTI0Mzog4dLH1c3FztQgzsUg0KbE1NLJzdWk2NTY09E6IFwiLSVzXCIsINfJy9XSydPUz9fVytTFINfF0tOmwCDaIE9MRS4iCisKKyMgbXNnc3RyICJFMjQ1OiAiCisjOiBndWlfdzQ4LmM6MjA2OAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlZJTSAtIPDP29XLIgorCisjOiBndWlfdzQ4LmM6MjA5MworbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIlZJTSAtIPrOwcrUySCmINrBzabOydTJLi4uIgorCisjOiBndWlfeDExLmM6MTQxOQorbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIiIKKyJWaW0gRTQ1ODog7sXNwaQg16bM2M7JyCDTxcvDpsog1SDUwcLMycOmIMvPzNjP0qbXLiDkxdHLpiDLz8zYz9LJIM3P1tXU2CAiCisiwtXUySDX1NLB3sXOpiIKKworIzogZ3VpX3gxMS5jOjE5OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IPvSycbUySDEzNEgw9jPx88gzsHCz9LVINPJzdfPzKbXINemxNPV1M6mINUgZm9udHNldCAlczoiCisKKyMgbXNnc3RyICJFMjUwOiAiCisjOiBndWlfeDExLmM6MjAzNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiDuwdrXwSBmb250c2V0OiAlcyIKKworIyBtc2dzdHIgIkUyNTI6ICIKKyM6IGd1aV94MTEuYzoyMDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIvvSycbUICclcycgzsUgpCDNz87P28nSyc7Oyc0iCisKKyM6IGd1aV94MTEuYzoyMDU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1Mjog7sHa18EgZm9udHNldDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIvvSycbUMDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIvvSycbUMTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIvbJ0s6m09TYINvSycbUwSAlZCDNwaQgwtXUySDXIMTXpt6mIMKmzNjbz8Ag2sEg1M/X3cnO1SBmb250MFxuIgorCisjOiBndWlfeDExLmM6MjA1OQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIvbJ0s6m09TYIGZvbnQwOiAlbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIvbJ0s6m09TYIGZvbnQxOiAlbGRcbiIKKyJcbiIKKworIzogZ3VpX3gxMS5jOjIyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiDuxSDNz9bVINLP2s2m09TJ1Mkgy8/MptIgJXMiCisKKyMgbXNnc3RyICJFMjU0OiAiCisjOiBndWlfeDExLmM6MzI1NgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTog7sUgzc/WzsEg2t7J1MHUySDEwc6mIM7B0MnT1SEiCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiDwz83JzMvBIGBIYW5ndWwgYXV0b21hdGEnIFvQz83JzMvBINDSz8fSwc3JXSIKKworIyBtc2dzdHIgIkUyNTU6ICIKKyM6IGlmX2NzY29wZS5jOjY3Cittc2dpZCAiQWRkIGEgbmV3IGRhdGFiYXNlIgorbXNnc3RyICLkz8TB1Mkgzs/X1SDCwdrVIMTBzsnIIgorCisjOiBpZl9jc2NvcGUuYzo2OQorbXNnaWQgIlF1ZXJ5IGZvciBhIHBhdHRlcm4iCittc2dzdHIgIvrB0MnUINrBINrSwdrLz80iCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIvDPy8HawdTJIMPFINDP16bEz83Mxc7O0SIKKworIzogaWZfY3Njb3BlLmM6NzMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAi+s7J3cnUySDaJ6TEzsHOztEiCisKKyM6IGlmX2NzY29wZS5jOjc1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAi8s/a0M/ewdTJINog0M/ewdTL1SDV06Yg2iekxM7Bzs7RIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIvDPy8HawdTJINonpMTOwc7O0SIKKworIzogaWZfY3Njb3BlLmM6MTA4Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICLj0SDLz83BzsTBIGNzY29wZSDOxSDVzaakIMSmzMnUySDXpsvOzy5cbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIvfJy8/SydPUz9fVytTFOiBjc3RhZyA80M/NptTLwT4iCisKKyM6IGlmX2NzY29wZS5jOjE5OQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzog0M/NptTL1SDOxSDazsHKxMXOzyIKKworIyBtc2dzdHIgIkUyNTc6ICIKKyM6IGlmX2NzY29wZS5jOjQwNyBpZl9jc2NvcGUuYzo0NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJzdGF0KCVzKSDQz83JzMvBOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDYwIGlmX2NzY29wZS5jOjQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIuTPxMHOzyDCwdrVIMTBzsnIIGNzY29wZSAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiJXMgzsUgpCDOpiDEydLFy9TP0qakwCDOpiDCwdrPwCDEwc7JyCBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICLwz83JzMvBIN7J1MHOztEg2iekxM7Bzs7RIGNzY29wZSAjJWQiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICLuxdemxM/Npsog1MnQINDP29XL1SBjc2NvcGUiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICLuxSDNz9bVINPU18/SydTJIMvBzsHMIMTPIGNzY29wZSIKKworIzogaWZfY3Njb3BlLmM6NzQ1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiDQz83JzMvBINCmxCDewdMg18nLz87Bzs7RIgorCisjOiBpZl9jc2NvcGUuYzo3NTUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gxMzRIHRvX2ZwIM7FINfEwdfT0SIKKworIzogaWZfY3Njb3BlLmM6NzU3Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiBmb3IgZnJfZnAgZmFpbGVkIgorbXNnc3RyICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIMTM0SBmcl9mcCDOxSDXxMHX09EiCisKKyM6IGlmX2NzY29wZS5jOjc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAi1s/Ezs/HzyDaJ6TEzsHO0SDaIGNzY29wZSIKKworIyBtc2dzdHIgIkUyNTg6ICIKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IOTM0SAlcy3awdDJ1NUgY3Njb3BlINPUz9PP187PICVzIM7FINrOwcrExc7PINOm0s7Jy6bXIgorCisjIG1zZ3N0ciAiRTI1OTogIgorIzogaWZfY3Njb3BlLmM6ODk5Cittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICLLz83BzsTJIGNzY29wZTpcbiIKKworIzogaWZfY3Njb3BlLmM6OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiUtNXM6ICUtMzBzIChVc2FnZTogJXMpXG4iCittc2dzdHIgIiUtNXM6ICUtMzBzICj31snXwcrUxTogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICLQz9fUz9LOwSDCwdrBIMTBzsnIIGNzY29wZSDOxSDEz8TBzsEiCisKKyM6IGlmX2NzY29wZS5jOjk4MQorbXNnaWQgIm1heGltdW0gbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucyByZWFjaGVkIgorbXNnc3RyICLLpszYy6bT1Ngg2iekxM7Bztgg2iBjc2NvcGUgxM/T0cfMwSDNwcvTyc3VzdUiCisKKyM6IGlmX2NzY29wZS5jOjExMDIKK21zZ2lkICJFMjYwOiBjc2NvcGUgY29ubmVjdGlvbiBub3QgZm91bmQiCittc2dzdHIgIkUyNjA6INonpMTOwc7O0SDaIGNzY29wZSDOxSDazsHKxMXOzyIKKworIyBtc2dzdHIgIkUyNjA6ICIKKyM6IGlmX2NzY29wZS5jOjExMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIgorbXNnc3RyICJFMjYxOiDaJ6TEzsHOztEg2iBjc2NvcGUgJXMgzsUg2s7BysTFzs8iCisKKyMgbXNnc3RyICJFMjYxOiAiCisjOiBpZl9jc2NvcGUuYzoxMTQxCittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gY2xvc2VkIgorbXNnc3RyICLaJ6TEzsHOztEg2iBjc2NvcGUg2sHLps7exc7PIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICLaJ6TEzsHOztEg2iBjc2NvcGUgJXMg2sHLps7exc7PXG4iCisKKyMuIHNob3VsZCBub3QgcmVhY2ggaGVyZQorIzogaWZfY3Njb3BlLmM6MTI5MAorbXNnaWQgImZhdGFsIGVycm9yIGluIGNzX21hbmFnZV9tYXRjaGVzIgorbXNnc3RyICJjc19tYW5hZ2VfbWF0Y2hlczog06bSzsnLptcgwqbM2NvFIM7FzcGkIFvQz83JzMvBINDSz8fSwc3JXSIKKworIzogaWZfY3Njb3BlLmM6MTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYyOiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJFMjYyOiDQz83JzMvBIN7J1MHOztEg2iDaJ6TEzsHOztEgY3Njb3BlICVkIgorCisjIG1zZ3N0ciAiRTI2MjogIgorIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICLOxSDNz9bVINfJxKbMydTJINDBzSfR1NhcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlc1xuIgorbXNnc3RyICLwz82m1MvBIGNzY29wZTogJXNcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1OAorbXNnaWQgIiAgICMgICBsaW5lIgorbXNnc3RyICIgICAjICAg0tHEz8siCisKKyM6IGlmX2NzY29wZS5jOjE0NjAKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgIsbByswgLyDLz87UxcvT1CAvINLRxM/LXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MTgKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAi9dOmINonpMTOwc7O0SDaIGNzY29wZSDQxdLF2sHXwc7UwdbFzs8iCisKKyM6IGlmX2NzY29wZS5jOjE3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAi9s/Ezs/HzyDaJ6TEzsHOztEg2iBjc2NvcGVcbiIKKworIzogaWZfY3Njb3BlLmM6MTc4OQorbXNnaWQgIiAjIHBpZCAgICBkYXRhYmFzZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKK21zZ3N0ciAiICMgcGlkICAgIM7B2tfBIMLB2skgxMHOycggICAgICAgICAgICAgICAgICAgINvM0chcbiIKKworIzogaWZfY3Njb3BlLmM6MTgwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlMmQgJS01bGQgICUtMzRzICA8bm9uZT5cbiIKK21zZ3N0ciAiJTJkICUtNWxkICAlLTM0cyA81s/Wzs/Hzz5cbiIKKworIzogaWZfcHl0aG9uLmM6MjQ2IGlmX3J1YnkuYzoyNjAgaWZfdGNsLmM6MTk1IG1ieXRlLmM6MjU2OCBvc193aW4zMi5jOjI2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiDuxSDNz9bVINrB18HO1MHWydTJIMKmwsymz9TFy9UgJXMiCisKKyM6IGlmX3B5dGhvbi5jOjI1OCBpZl9ydWJ5LmM6MjcyIGlmX3RjbC5jOjIwNiBtYnl0ZS5jOjI1ODQgb3Nfd2luMzIuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0ODogQ291bGQgbm90IGxvYWQgbGlicmFyeSBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTQ0ODog7sUgzc/W1SDawdfBztTB1snUySDCpsLMps/Uxd7O1SDG1c7Lw6bAICVzIgorCisjOiBpZl9weXRob24uYzozODMKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiIgorIkUyNjM6IPfJwsHe1MUsIMPRIMvPzcHOxMEg18nNy87V1MEsIMKmwsymz9TFy8EgUHl0aG9uIM7FIM3P1sUgwtXUySAiCisi2sHXwc7UwdbFzsEuIgorCisjOiBpZl9weXRob24uYzo1ODMKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIs7FIM3P1tUg18nEwczJ1MkgwdTSycLV1MkgT3V0cHV0T2JqZWN0IgorCisjOiBpZl9weXRob24uYzo1OTAKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgzcGkIMLV1MkgzsHU1dLBzNjOyc0iCisKKyMgbXNnc3RyICJFMTgwOiAiCisjOiBpZl9weXRob24uYzo1OTgKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAizsXXptLOycogwdTSycLV1CIKKworIzogaWZfcHl0aG9uLmM6NjM3IGlmX3B5dGhvbi5jOjY1MQorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSDQz9TSpsLFziDT0MnTz8sg0tHEy6bXIgorCisjOiBpZl9weXRob24uYzo3NzcKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiDwz83JzMvBIKbOpsOm0cym2sHDpqcgz8InpMvUptcg19fPxNUv18nXz8TVIgorCisjOiBpZl9weXRob24uYzo5NjIgaWZfdGNsLmM6MTQwMworbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAizsXXptLOycog18nSwdoiCisKKyM6IGlmX3B5dGhvbi5jOjk3NiBpZl90Y2wuYzoxNDA4Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICLPwtLPwsvVINfJ0sHaptcg2sHCz9LPzsXOzyDQz8Qg3sHTIMvPzdCmzNHDpqciCisKKyM6IGlmX3B5dGhvbi5jOjk4OQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgItPQ0s/CwSDeydTB1Mkg18nEwczFzsnKIMLVxsXSIgorCisjOiBpZl9weXRob24uYzoxMDA0IGlmX3B5dGhvbi5jOjEwNDUgaWZfcHl0aG9uLmM6MTEwOSBpZl90Y2wuYzoxMjE1Cittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICLOz83F0iDS0cTLwSDawSDNxdbBzckgxsHKzMEiCisKKyM6IGlmX3B5dGhvbi5jOjEyNDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8z8InpMvUIMLVxsXSwSAo18nEwczFzs8pINcgJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjEzMzMgaWZfdGNsLmM6ODM3Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIs7F16bSzsEgzsHa18Eg0M/NptTLySIKKworIzogaWZfcHl0aG9uLmM6MTYwOAorbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICLUwcvPx88gwtXGxdLBIM7FzcGkIgorCisjOiBpZl9weXRob24uYzoxNjk2Cittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAi09TSz8LBINrXxdLO1dTJ09EgxM8g18nEwczFzs/HzyDXpsvOwSIKKworIzogaWZfcHl0aG9uLmM6MTc0MQorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAizMnbxSDEzNEg3snUwc7O0SIKKworIzogaWZfcHl0aG9uLmM6MTc1NAorbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAiy9XS08/SINrBIM3F1sHNySDC1cbF0sEiCisKKyM6IGlmX3B5dGhvbi5jOjE4MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPM/CJ6TL1CDXpsvOwSAo18nEwczFzs8pINcgJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODQzCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjzPwieky9Qg16bLzsEgKM7F16bEz83Jyikg1yAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjzXpsvOzyAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5MjEKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAi1MHLz8fPINemy87BIM7FzcGkIgorCisjOiBpZl9weXRob24uYzoyMTc4IGlmX3B5dGhvbi5jOjIyMTMgaWZfcHl0aG9uLmM6MjI2MyBpZl9weXRob24uYzoyMzI2CisjOiBpZl9weXRob24uYzoyNDQ2IGlmX3B5dGhvbi5jOjI0OTggaWZfdGNsLmM6Njg1IGlmX3RjbC5jOjczMCBpZl90Y2wuYzo4MDQKKyM6IGlmX3RjbC5jOjg3NCBpZl90Y2wuYzoxOTk5Cittc2dpZCAiY2Fubm90IHNhdmUgdW5kbyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAizsUgzc/W1SDawsXSxcfUySCmzsbP0s3Bw6bAIMTM0SDXpsTNps7JIgorCisjOiBpZl9weXRob24uYzoyMTgwIGlmX3B5dGhvbi5jOjIyNzAgaWZfcHl0aG9uLmM6MjMzNworbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAizsXNz9bMydfPINfJxMHMydTJINLRxM/LIgorCisjOiBpZl9weXRob24uYzoyMjE1IGlmX3B5dGhvbi5jOjIzNTMgaWZfdGNsLmM6NjkxIGlmX3RjbC5jOjIwMjEKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICLOxc3P1szJ188g2sHNps7J1Mkg0tHEz8siCisKKyM6IGlmX3B5dGhvbi5jOjIzNjkgaWZfcHl0aG9uLmM6MjQ0OCBpZl9weXRob24uYzoyNTA2Cittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICLOxSDNz9bVINfT1MHXydTJINLRxM/LIgorCisjOiBpZl9weXRob24uYzoyNjEwCittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICLCpszY2yDOptYgz8TJziDS0cTPyyIKKworIzogaWZfcnVieS5jOjQwMQorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTI2Njog98nCwd7UxSwgw9Egy8/Nwc7EwSDXyc3LztXUwSwgwqbCzKbP1MXLwSBSdWJ5IM7FIM3P1sUgwtXUySDawdfBztTB1sXOwS4iCisKKyMgbXNnc3RyICJFMjMzOiAiCisjOiBpZl9ydWJ5LmM6NDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyMzQ6IO7F16bEz83JyiDT1MHU1dMgbG9uZ2ptcDogJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAi8MXSxc3LztXUySBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICL6zsHK1MkgwsHaz9fJyiDLzMHTIgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAi8M/LwdrB1Mkg2sHNps7FzqYob3ZlcnJpZGRlbikgxtXOy8Ompy3ezMXOySIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAi+t7J1MHUySDaIMbByszBIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICL63snUwdTJINog0NLPxcvU1SIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICL63snUwdTJINog1dOmyCDQ0s/Fy9Sm1yIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICL63snUwdTJIgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIuTWxdLFzM8iCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAi+s7BytTJINPJzdfPzCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAi8NLPxMnXydTJ09Egy8zB0yIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICL6zsHK1Mkgy8zB0yDXIKak0sHSyKanIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAi+s7BytTJIMvMwdMg1yDawcLP0s/Oxc6myiCnpNLB0simpyIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmINfLwdrVpCDOwSIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgIs7BIFhyZWYg18vB2sHOzyDaIgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiDNwaQiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYg18nLz9LJ09TBzs8iCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIvDPy8HawdTJIGRvY3UiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAi89TXz9LJ1MkgZG9jdSDEzNEiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIiIKKyLuxSDNz9bVINqkxM7B1MnT0SDaIFNOaUZGKy4g8MXSxdem0tTFIM/Uz97Fzs7RXG4iCisiKHNuaWZmZW1hY3MgzsUgwtXMzyDazsHKxMXOzyDVINvM0cjVINDP29XL1SkuXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiDwz83JzMvBINDBxCDewdMg2t7J1NXXwc7O0S4g96bEpMTOwc7PIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICLawdLB2iBTTmlGRiIKKworIzogaWZfc25pZmYuYzo1NTUKK21zZ2lkICJub3QgIgorbXNnc3RyICLOxSAiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICLQpsSkxM7BzsnKIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTog7sXXpsTPzcUg2sHQydTBzs7RIMTPIFNOaUZGKzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IPDPzcnMy8Eg0KbEIN7B0yDapMTOwc7O0SDaIFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDEwCittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IFNOaUZGKyDOxSDQpsSkxM7Bzs8iCisKKyM6IGlmX3NuaWZmLmM6MTAxOQorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IO7FIKQgwtXGxdLPzSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTA4NAorbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmYuINDPzcnMy8Eg2sHQydPVLiD3psSkxM7Bzs8iCisKKyM6IGlmX3RjbC5jOjQxOQorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAizsXXptLOwSDOwdrXwSDC1cbF0sEiCisKKyM6IGlmX3RjbC5jOjQ2NSBpZl90Y2wuYzo5MzIgaWZfdGNsLmM6MTExMQorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgIs7FIMSmpCAo0M/LySDdzykiCisKKyM6IGlmX3RjbC5jOjUwMgorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICLOxdemxM/NwSDP0MOm0SIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NzUKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIs7FIM3P1tUg2sHEwdTJINLRxMvJIgorCisjIG1zZ3N0ciAiRTE5OiAiCisjOiBpZl90Y2wuYzo4NDYKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgItDPzabUy9UgzsUg18vB2sHOzyIKKworIzogaWZfdGNsLmM6ODUyIGlmX3RjbC5jOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAi0tHEz8sgJWQgy8/Mz87LwSAlZCIKKworIzogaWZfdGNsLmM6ODgyCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAi7sUgzc/W1SDX09TB18nUyS/Ez8TB1Mkg0tHEz8siCisKKyM6IGlmX3RjbC5jOjEyNjkKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAizsXXpsTPzcnKINDSwdDP0sXD2DogIgorCisjOiBpZl90Y2wuYzoxMzM5Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIu7F16bEz83BIM/Qw6bRIgorCisjOiBpZl90Y2wuYzoxNDI0Cittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICLQxdLF0tfBzs8gy8/SydPU1dfB3sXNIgorCisjOiBpZl90Y2wuYzoxNDI5Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICLQz83JzMvBIFZpbSIKKworIzogaWZfdGNsLmM6MTQ3MgorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAizsUgzc/W1SDT1NfP0snUySDLz83BzsTVIMTM0SDXpsvOwS/C1cbF0sE6IM/CJ8XL1CDXycTRzNGk1NjT0SIKKworIzogaWZfdGNsLmM6MTU0NgorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIu7FIM3P1tUg2sHSxaTT1NLV18HUySDQz8SmwDogwtXGxdIv16bLzs8g1dbFINrOyd3VpNTY09EiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvICIKKyJ2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIiIKKyJFMjgwOiDw7+3p7OvhINcgps7UxdLGxcrTpiDaIFRDTDogzc/WzMnXzyDQz9vLz8TWxc7PINPQydPPyyDQz9PJzMHOztguLiAiCisi8M/XpsTPzdTFLCDC1cTYzMHTy8EsIM7BIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU2NAorbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIu7FIM3P1tUg2sHSxaTT1NLV18HUySDQz8SmwDog0M/TyczBzs7RIM7BIMLVxsXSL9emy87PIM7FINrOwcrExc7PIgorCisjOiBpZl90Y2wuYzoxNzI1Cittc2dpZCAiU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICL3ycLB3tTFLCDD0SDLz83BzsTBINfJzcvO1dTBLCDCpsLMps/UxcvBIFRjbCDOxSDNz9bFIMLV1Mkg2sHXwc7UwdbFzsEuIgorCisjOiBpZl90Y2wuYzoxODg3Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICIiCisiRTI4MDog8O/t6ezr4SDXIKbO1MXSxsXK06Yg2iBUQ0w6IM3P1szJ188g0sXa1czY1MHUIM7FIGludC4uIPDP16bEz83UxSwgIgorIsLVxNjMwdPLwSwgzsEgdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoyMDA3Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICLOxSDNz9bVIMSm09TB1Mkg0tHEz8siCisKKyM6IGlmX3hjbWRzcnYuYzoyMDkKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICLuxSDNz9bVINrB0sWk09TS1dfB1Mkgps0n0SDTxdLXxdLBIgorCisjOiBpZl94Y21kc3J2LmM6NDIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTM1NDog7sXNwaQg2sHSxcXT1NLP18HOycgg08XS18XSptcgzsEgps0n0SBcIiVzXCIiCisKKyM6IGlmX3hjbWRzcnYuYzo0NTEKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiDuxSDXxMHMz9PRINemxKbTzMHUySDLz83BzsTVIMTPIMumzsPF18+nINDSz8fSwc3JIgorCisjOiBpZl94Y21kc3J2LmM6NzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICL3ycvP0snT1MHOzyDOxdem0s7VIM7B2tfVINPF0tfF0sEgOiVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA2NgorbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorbXNnc3RyICJFMjQ5OiDOxSDNz9bVINreydTB1Mkg3sHT1MnO1SDSxaTT1NLVINrSwdrLwSBWaW0iCisKKyM6IGlmX3hjbWRzcnYuYzoxMDc3Cittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiDewdPUyc7BINLFpNPU0tUg2tLB2svBIFZpbSDOxdem0s7PINrGz9LNz9fBzsEuICD3ycTBzMXOzyEiCisKKyM6IG1haW4uYzo1MyBvcHRpb24uYzozMTYyIG9wdGlvbi5jOjMyNjkKK21zZ2lkICJVbmtub3duIG9wdGlvbiIKK21zZ3N0ciAi7sXXpsTPzcEgz9DDptEiCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICL6wcLBx8HUzyDB0sfVzcXO1KbXIgorCisjOiBtYWluLmM6NTcKK21zZ2lkICJBcmd1bWVudCBtaXNzaW5nIGFmdGVyIgorbXNnc3RyICL31NLB3sXOzyDB0sfVzcXO1Mkg0KbTzNEiCisKKyM6IG1haW4uYzo1OQorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICLzzabU1NEg0M/TzNEgz9DDpqciCisKKyM6IG1haW4uYzo2MQorbXNnaWQgIlRvbyBtYW55IFwiK2NvbW1hbmRcIiBvciBcIi1jIGNvbW1hbmRcIiBhcmd1bWVudHMiCittc2dzdHIgIvrBwsHHwdTPICcrJyDBws8gJy1jJyDB0sfVzcXO1KbXIgorCisjIG1zZ3N0ciAiRTE0OiAiCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAi7sXXptLOycogwdLH1c3FztQgxMzRIgorCisjOiBtYWluLmM6NDM2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICLj0SDXxdLTptEgVmltIM7FIMLVzMEg2svPzdCmzNjP18HOwSDaINCmxNTSyc3Lz8AgZGlmZi4iCisKKyM6IG1haW4uYzo4NTgKK21zZ2lkICJBdHRlbXB0IHRvIG9wZW4gc2NyaXB0IGZpbGUgYWdhaW46IFwiIgorbXNnc3RyICLz0NLPwsEg16bEy9LJ1Mkg3cUg0sHaIMbByswgy8/Nwc7EIFwiIgorCisjOiBtYWluLmM6ODYyIG1haW4uYzo4NjkgbWFpbi5jOjkxMyBtZW1saW5lLmM6MzY3MyBtZW1saW5lLmM6MzY3NworIzogdmVyc2lvbi5jOjEwNTggdmVyc2lvbi5jOjEwNjMgdmVyc2lvbi5jOjEwNjggdmVyc2lvbi5jOjEwNzMgdmVyc2lvbi5jOjEwNzgKKyM6IHZlcnNpb24uYzoxMDgzIHZlcnNpb24uYzoxMDg5IHZlcnNpb24uYzoxMDkzIHZlcnNpb24uYzoxMDk3IHZlcnNpb24uYzoxMTAyCisjOiB2ZXJzaW9uLmM6MTEwOSB2ZXJzaW9uLmM6MTExNyB2ZXJzaW9uLmM6MTEyMworbXNnaWQgIlwiXG4iCittc2dzdHIgIlwiXG4iCisKKyM6IG1haW4uYzo4NjcKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIu7FIM3P1tUg0NLP3snUwdTJOiBcIiIKKworIzogbWFpbi5jOjkxMQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAi7sUgzc/W1SDXpsTL0snUySDRyyDXpsimxM7JyiDGwcrMOiBcIiIKKworIzogbWFpbi5jOjEwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICIlZCDGwcrMptcg2sHMydvJzM/T2FxuIgorCisjOiBtYWluLmM6MTA5NAorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTog9dfBx8E6IPfJyKbEIMrExSDOxSDOwSDUxdLNps7BzFxuIgorCisjOiBtYWluLmM6MTA5NgorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IPXXwcfBOiD3yKbEziDKxMUgzsUg2iDUxdLNps7BzNVcbiIKKworIy4ganVzdCBpbiBjYXNlLi4KKyM6IG1haW4uYzoxMTcxCittc2dpZCAicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiy8/Nwc7EySDRy6Yg18nLz87V18HMydPRIMTPIHZpbXJjIgorCisjOiBtYWluLmM6MTIwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4Mjog7sUgzc/W1SDQ0s/eydTB1MkgXCIlc1wiIgorCisjIG1zZ3N0ciAiRTI4MjogIgorIzogbWFpbi5jOjIxNzUKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIvfazsHK1MUgwqbM2NvFOiB2aW0gLWhcbiIKKworIzogbWFpbi5jOjIyMDgKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW8bByswgLi5dICAgICAgINLFxMHH1dfB1Mkg18vB2sHOycogxsHKzCIKKworIzogbWFpbi5jOjIyMDkKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICDeydTB1Mkg1MXL09Qg2iBzdGRpbiIKKworIzogbWFpbi5jOjIyMTAKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCDQz82m1MvBICAgICAg0MXSxdTJIMTPINDPzabUy8kiCisKKyM6IG1haW4uYzoyMjEyCittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbxsHKzF0gICAgICAg0MXSxcrUySDEzyDQxdLbz6cg0M/NyczLySIKKworIzogbWFpbi5jOjIyMjEKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisi99bJ18HK1MU6IgorCisjOiBtYWluLmM6MjIyNAorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICIgdmltIFvB0sfVzcXO1MldICIKKworIzogbWFpbi5jOjIyMjgKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgICDBws86IgorCisjOiBtYWluLmM6MjIzMQorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyLh0sfVzcXO1Mk6XG4iCisKKyM6IG1haW4uYzoyMjMyCittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHTsydvFIKbNxc7BIMbBysym1yDQptPM0SDD2M/HzyIKKworIzogbWFpbi5jOjIyMzQKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHT6wdLFpNPU0tXXwdTJIMPFyiBndmltIN7F0sXaIE9MRSIKKworIzogbWFpbi5jOjIyMzUKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx096bEzabOydTJINLFpNPU0sHDpsAgw9jPx88gZ3ZpbSDexdLF2iBPTEUiCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHT3ycvPzsHUySDXycvP0snT1M/X1cDeySBHVUkgKM6mwskgXCJndmltXCIpIgorCisjOiBtYWluLmM6MjIzOQorbXNnaWQgIi1mXHRcdFx0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWZcdFx0XHTuxSDawczJ28HUySDUxdLNps7BzCDQptPM0SDawdDV08vVIEdVSSIKKworIzogbWFpbi5jOjIyNDEKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHTyxdbJzSBWaSAozqbCySBcInZpXCIpIgorCisjOiBtYWluLmM6MjI0MgorbXNnaWQgIi1lXHRcdFx0RXggbW9kZSAobGlrZSBcImV4XCIpIgorbXNnc3RyICItZVx0XHRcdPLF1snNIEV4ICjOpsLJIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjQzCittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdPDSwcPA18HUySDNz9fey8kgKMzJ28UgxMzRIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjQ1Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdPLF1snNIGRpZmYgKM6mwskgXCJ2aW1kaWZmXCIpIgorCisjOiBtYWluLmM6MjI0NworbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx08NLP09TJyiDSxdbJzSAozqbCySBcImV2aW1cIikiCisKKyM6IG1haW4uYzoyMjQ4Cittc2dpZCAiLVJcdFx0XHRSZWFkb25seSBtb2RlIChsaWtlIFwidmlld1wiKSIKK21zZ3N0ciAiLVJcdFx0XHTyxdbJzSDQxdLFx8zRxNUgKM6mwskgXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjI0OQorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHT6wcLP0s/Oxc7JyiDSxdbJzSAozqbCySBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyMjUwCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHT6zabOySAo2sHQydMgxsHKzKbXKSDOxSDEz9rXz8zFzs8iCisKKyM6IG1haW4uYzoyMjUxCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0+s2mzskg1yDUxcvT1KYgxsHKzKbXIM7FIMTP2tfPzMXOzyIKKworIzogbWFpbi5jOjIyNTIKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdOTXpsrLz9fJyiDSxdbJzSIKKworIzogbWFpbi5jOjIyNTQKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHTyxdbNySBsaXNwIgorCisjOiBtYWluLmM6MjI1NgorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx08sXWyc0sINPVzabTzsnKINogVmk6ICdjb21wYXRpYmxlJyIKKworIzogbWFpbi5jOjIyNTcKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHTuxSDaz9fTps0g09XNptPOycog2iBWaSDSxdbJzTogJ25vY29tcGF0aWJsZSciCisKKyM6IG1haW4uYzoyMjU4Cittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx08qbXxc7YIMfBzMHTzMnXz9PUpiIKKworIzogbWFpbi5jOjIyNTkKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdPLF1snNIM7BzMHHz8TW1dfBzs7RIgorCisjOiBtYWluLmM6MjI2MAorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdFx07sUgy8/SydPU1dfB1MnT0SDGwcrMz80gz8LNps7VLCDU0snNwdTJINXTxSDXINDBzSfR1KYiCisKKyM6IG1haW4uYzoyMjYxCittc2dpZCAiLXJcdFx0XHRMaXN0IHN3YXAgZmlsZXMgYW5kIGV4aXQiCittc2dzdHIgIi1yXHRcdFx08M/LwdrB1MkgxsHKzMkgz8LNps7VIKYg18nK1MkiCisKKyM6IG1haW4uYzoyMjYyCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICimzdEgxsHKzMEpXHT3psTOz9fJ1MkgwdfB0qbKzs8g2sHLps7exc7JyiDTxcHO0yIKKworIzogbWFpbi5jOjIyNjMKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx09MUg08HNxSDdzyDKIC1yIgorCisjOiBtYWluLmM6MjI2NQorbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHTxINTByyDSz9rVzabAIMPFIMzJ28UgxMzRIEFtaWdhLiD3ycLB3iwgQnJhbS4iCisKKyM6IG1haW4uYzoyMjY2Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA80NLJ09TSpso+XHRcdFx098nLz9LJ09TP19XXwdTJINDSydPU0qbKIMTM0SDX18/E1S/XydfPxNUiCisKKyM6IG1haW4uYzoyMjY5Cittc2dpZCAiLUhcdFx0XHRzdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHTyz9rQz97B1Mkg0sXWyc2mIEhlYnJldyIKKworIzogbWFpbi5jOjIyNzIKK21zZ2lkICItRlx0XHRcdHN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx08s/a0M/ewdTJINcg0MXS09jLz83VINLF1snNpiIKKworIzogbWFpbi5jOjIyNzQKK21zZ2lkICItVCA8dGVybWluYWw+XHRTZXQgdGVybWluYWwgdHlwZSB0byA8dGVybWluYWw+IgorbXNnc3RyICItVCA81MXSzabOwcw+XHT3ydrOyd7J1Mkg1MnQINTF0s2mzsHM1SIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHT3ycvP0snT1MHUySDQz8TBzsnKIMbByswg0csgLnZpbXJjIgorCisjOiBtYWluLmM6MjI3NworbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItdSA8Z3ZpbXJjPlx0XHT3ycvP0snT1MHUySDQz8TBzsnKIMbByswg0csgLmd2aW1yYyIKKworIzogbWFpbi5jOjIyNzkKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx07sUg18HO1MHWydTJIMbByszJLcTP0M/XzsXOztEiCisKKyM6IG1haW4uYzoyMjgwCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiIgorIi1vW05dXHRcdPLP2svSydTJIE4g16bLz84gKNHL3c8gzsUg18vB2sHOzyAtLSDQz1xuIgorIlx0XHRcdM/Ezs/N1SDEzNEgy8/Wzs/HzyDGwcrMwSkiCisKKyM6IG1haW4uYzoyMjgxCittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0zqbCySAtbywgwczFINDPxKbMydTJINemy87BINfF0tTJy8HM2M7PIgorCisjOiBtYWluLmM6MjI4MgorbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdPLP2tDP3sHUySDXIMumzsOmIMbByszBIgorCisjOiBtYWluLmM6MjI4MworbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis80tHEz8s+XHRcdPLP2tDP3sHUySDOwSDXy8Hawc7PzdUg0tHEy9UiCisKKyM6IG1haW4uYzoyMjg1Cittc2dpZCAiLS1jbWQgPGNvbW1hbmQ+XHRFeGVjdXRlIDxjb21tYW5kPiBiZWZvcmUgbG9hZGluZyBhbnkgdmltcmMgZmlsZSIKK21zZ3N0ciAiIgorIi0tY21kIDzLz83BzsTBPlx098nLz87B1Mkgy8/Nwc7E1SDQxdLFxCDXycvPzsHOztHNIMLVxNgt0cvJyCAuKnJjIMbBysym1yIKKworIzogbWFpbi5jOjIyODcKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPMvPzcHOxME+XHRcdPfJy8/OwdTJIMvPzcHOxNUg0KbTzNEg2sHXwc7UwdbFzs7RINDF0tvPx88gxsHKzMEiCisKKyM6IG1haW4uYzoyMjg4Cittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA808XBztM+XHRcdPfJy8/OwdTJINDPxMHOycogxsHKzCDQptPM0SDQxdLbz8fPINrB18HO1MHWxc7Px88gxsHKzMEiCisKKyM6IG1haW4uYzoyMjg5Cittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPMbBysw+XHRcdPreydTB1Mkgy8/Nwc7EySDaIMbByszBIDxzY3JpcHRpbj4iCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPMbBysw+XHRcdOTP0MnTwdTJINXTpiDOwcLSwc6mIMvPzcHOxMkgxM8g0M/Ewc7Px88gxsHKzMEiCisKKyM6IG1haW4uYzoyMjkxCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8xsHKzD5cdFx0+sHQydPB1Mkg1dOmIM7BwtLBzqYgy8/Nwc7EySDVINDPxMHOycogxsHKzCIKKworIzogbWFpbi5jOjIyOTMKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdPLFxMHH1dfB1Mkg2sHbycbSz9fBzsnKIMbByswiCisKKyM6IG1haW4uYzoyMjk3Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDzEydPQzMXKPlx098nLz87B1MkgdmltINfJy8/SydPUz9fVwN7JINDPxMHOycogxMnT0MzFyiIKKworIzogbWFpbi5jOjIyOTkKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdO7FINonpMTO1dfB1MnT0SDaIFgg08XS18XSz80iCisKKyM6IG1haW4uYzoyMzAxCittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx096bEy9TJ0skgVmltINcgps7bz83VIMXMxc3FztSmIKbO1MXSxsXK09UgR1RLIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlIDzGwcrMyT5cdPLFxMHH1dfB1MkgxsHKzMkgzsEgVmltINPF0tfF0qYgpiDawdfF0tvJ1Mkg0s/Cz9TVIgorCisjOiBtYWluLmM6MjMwNgorbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlcz4gIEFzIC0tcmVtb3RlIGJ1dCB3YWl0IGZvciBmaWxlcyB0byBoYXZlIGJlZW4gZWRpdGVkIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdCA8xsHKzMk+IC4uLiwgwczFINrB3sXLwdTJINDPy8kg1dOmIMbByszJIMLVxMUg16bE0sXEwcfP18HOzyIKKworIzogbWFpbi5jOjIzMDcKK21zZ2lkICItLXJlbW90ZS1zZW5kIDxrZXlzPlx0U2VuZCA8a2V5cz4gdG8gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZS1zZW5kIDzTyc3Xz8zJPiD3psSm08zB1MkgPNPJzdfPzMk+INPF0tfF0tUgpiDawdfF0tvJ1Mkg0s/Cz9TVIgorCisjOiBtYWluLmM6MjMwOAorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIiIKKyItLXJlbW90ZS1leHByIDzXydLB2j4g98nLz87B1Mkg18nSwdogzsEg08XS18XSpiwgpiDOwcTS1cvV18HUySDSxdrVzNjUwdQiCisKKyM6IG1haW4uYzoyMzA5Cittc2dpZCAiLS1zZXJ2ZXJsaXN0XHRcdExpc3QgYXZhaWxhYmxlIFZpbSBzZXJ2ZXIgbmFtZXMgYW5kIGV4aXQiCittc2dzdHIgIiIKKyItLXNlcnZlcmxpc3RcdFx08M/LwdrB1Mkg09DJ08/LIM7B0dfOycgg08XS18XSptcgVmltIKYg2sHXxdLbydTJINLPws/U1SIKKworIzogbWFpbi5jOjIzMTAKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8ps0n0T5cdPPQpszL1dfB1MnT0SDaL9PUwdTJIFZpbSDTxdLXxdLPzSDaINDPxMHOyc0gps0n0c0iCisKKyM6IG1haW4uYzoyMzEzCittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdPfJy8/SydPUwdTJINDPxMHOycogxsHKzCDRyyAudmltaW5mbyIKKworIzogbWFpbi5jOjIzMTUKK21zZ2lkICItaFx0XHRcdHByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oXHRcdFx07sHE0tXL1dfB1Mkgw8Ug0M/XpsTPzczFzs7RLCCmINfJytTJIgorCisjOiBtYWluLmM6MjMxNgorbXNnaWQgIi0tdmVyc2lvblx0XHRwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx0zsHE0tXL1dfB1Mkgps7Gz9LNwcOmwCDQ0s8g18XS06bAINDSz8fSwc3JIgorCisjOiBtYWluLmM6MjMyMAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIuHSx9XNxc7UySDEzNEgZ3ZpbSAo18XS06bRIE1vdGlmKVxuIgorCisjOiBtYWluLmM6MjMyMworbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyLh0sfVzcXO1MkgxMzRIGd2aW0gKNfF0tOm0SBBdGhlbmEpXG4iCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPMTJ09DMxco+XHT3ycvPzsHUySB2aW0g18nLz9LJ09TP19XA3skg0M/Ewc7JyiDEydPQzMXKIgorCisjOiBtYWluLmM6MjMyNworbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHT6wdDJ09TJ1MkgVmltIgorCisjOiBtYWluLmM6MjMyOQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDymzSfRPlx0XHT3ycvP0snT1MHUySDSxdPV0tPJIMTM0SA8ps1g0T4iCisKKyM6IG1haW4uYzoyMzMwCittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAo7sUgxKakKVxuIgorCisjOiBtYWluLmM6MjMzMgorbXNnaWQgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciB0aGUgYmFja2dyb3VuZCAoYWxzbzogLWJnKSIKK21zZ3N0ciAiLWJhY2tncm91bmQgPMvPzKbSPlx098nLz9LJ09TB1MkgPMvPzKbSPiDEzNEgxs/O1SAo1MHLz9Y6IC1iZykiCisKKyM6IG1haW4uYzoyMzMzCittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICIiCisiLWZvcmVncm91bmQgPMvPzKbSPlx098nLz9LJ09TB1MkgPMvPzKbSPiDEzNEg2tfJ3sHKzs/HzyDUxcvT1NUgKNTBy8/WOiAtZmcpIgorCisjOiBtYWluLmM6MjMzNCBtYWluLmM6MjM1NAorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPNvSycbUPlx098nLz9LJ09TB1MkgPNvSycbUPiDEzNEg2tfJ3sHKzs/HzyDUxcvT1NUgKNTBy8/WOiAtZm4pIgorCisjOiBtYWluLmM6MjMzNQorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDzb0snG1D5cdPfJy8/SydPUwdTJIDzb0snG1D4gxMzRINbJ0s7Px88g1MXL09TVIgorCisjOiBtYWluLmM6MjMzNgorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDzb0snG1D5cdPfJy8/SydPUwdTJIDzb0snG1D4gxMzRINDPyMnMz8fPINTFy9PU1SIKKworIzogbWFpbi5jOjIzMzcgbWFpbi5jOjIzNTUKK21zZ2lkICItZ2VvbWV0cnkgPGdlb20+XHRVc2UgPGdlb20+IGZvciBpbml0aWFsIGdlb21ldHJ5IChhbHNvOiAtZ2VvbSkiCittc2dzdHIgIi1nZW9tZXRyeSA8x8XPzT5cdPrBxMHUySDSz9rNptTJINTBINDPzM/Wxc7O0SAo1MHLz9Y6IC1nZW9tKSIKKworIzogbWFpbi5jOjIzMzgKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA81M/X3T5cdPfT1MHOz9fJ1Mkg1M/X3cnO1SDNxdYgPNTP190+ICjUwcvP1jogLWJ3KSIKKworIzogbWFpbi5jOjIzMzkKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIi1zY3JvbGxiYXJ3aWR0aCA81M/X3T4gIPfT1MHOz9fJ1Mkg1M/X3cnO1SDMps6mysvJINrT1dfVICjUwcvP1jogLXN3KSIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItbWVudWhlaWdodCA8aGVpZ2h0Plx0VXNlIGEgbWVudSBiYXIgaGVpZ2h0IG9mIDxoZWlnaHQ+IChhbHNvOiAtbWgpIgorbXNnc3RyICItbWVudWhlaWdodCA818nTz9TBPlx099PUwc7P18nUySDXydPP1NUgzcXOwCA818nTz9TBPiAo1MHLz9Y6IC1taCkiCisKKyM6IG1haW4uYzoyMzQzIG1haW4uYzoyMzU2Cittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdO/CxdLO1dTJIMvPzNjP0skgKNTBy8/WOiAtcnYpIgorCisjOiBtYWluLmM6MjM0NAorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHTuxSDPwsXS1MHUySDLz8zYz9LJICjUwcvP1jogK3J2KSIKKworIzogbWFpbi5jOjIzNDUKK21zZ2lkICIteHJtIDxyZXNvdXJjZT5cdFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIgorbXNnc3RyICIteHJtIDzSxdPV0tM+XHT309TBzs/XydTJINemxNDP16bEzsnKINLF09XS0yIKKworIzogbWFpbi5jOjIzNDgKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIuHS29XNxc7UySDEzyBndmltICjXxdLTptEgUklTQyBPUyk6XG4iCisKKyM6IG1haW4uYzoyMzQ5Cittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPMumzNjLptPU2D5cdPDP3sHUy8/XwSDbydLJzsEg16bLzsEg1yDTyc3Xz8zByCIKKworIzogbWFpbi5jOjIzNTAKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPMumzNjLptPU2D5cdPDP3sHLz9fBINfJ08/UwSDXpsvOwSDXINLRxMvByCIKKworIzogbWFpbi5jOjIzNTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIuHSx9XNxc7UySDEzNEgZ3ZpbSAo18XS06bRIEdUSyspXG4iCisKKyM6IG1haW4uYzoyMzU3Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiIgorIi1kaXNwbGF5IDzEydPQzMXKPlx098nLz87B1MkgdmltIM7BINDPxMHOz83VIMTJ09DMxacgKNTBy8/WOiAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjM1OQorbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdPDPy8HawdTJIMHSx9XNxc7UySBHbm9tZSIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI1ODQKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyLz0NLPwsEg16bEptPMwdTJINfJ0sHaIM7FINfEwczB09EuXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6MjU4OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICIiCisiXG4iCisi7sUg18TBzM/T0SDXpsSm08zB1MkgxMHOpi4g89DSz8LVpM3PINfJy8/OwdTJIM7BIM2m08OmXG4iCisKKyM6IG1haW4uYzoyNjIyIG1haW4uYzoyNjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQg2iAlZCDGwcrMptcg16bE0sXEwcfP18HOzyIKKworIzogbWFpbi5jOjI2NjYKK21zZ2lkICJTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICLz0NLPwsEg16bEptPMwdTJINfJ0sHaIM7FINfEwczB09EuXG4iCisKKyM6IG1hcmsuYzo2NjAKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIvbPxM7JyCDQz82m1M/LIM7FIMLVzM8g18vB2sHOzyIKKworIzogbWFyay5jOjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6IPDPzabUy9UgXCIlc1wiIM7FINrOwcrExc7PIgorCisjIG1zZ3N0ciAiRTI4MzogIgorIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjczCittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorItDPzS4g0tHELiAgy8/MLiDGwcrML9TFy9PUIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MTEKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorCisjIFRPRE8KKyM6IG1hcmsuYzoxMDczCittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg8M/NptTLyTpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMTA4Cittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIPPQydPPyyDQxdLFyM/EptdcbiIKKworIyBUT0RPCisjOiBtYXJrLmM6MTIwMworbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg8M/QxdLFxM6mINDPzabUy8kg1yDGwcrMwcggKNPQz97B1MvVIM7P16YpOlxuIgorCisjOiBtYXJrLmM6MTI4NgorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICL31NLB3sXOzyAnPiciCisKKyM6IG1ieXRlLmM6Mzk1Cittc2dpZCAiTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIuvPxM/XwSDT1M/Sps7LwSDOxSCm087VpCIKKworIzogbWJ5dGUuYzozMDI5Cittc2dpZCAiRTI4NDogQ2Fubm90IHNldCBJQyB2YWx1ZXMiCittc2dzdHIgIkUyODQ6IO7FIM3P1tUg19PUwc7P18nUySDazsHexc7O0SBJQyIKKworIzogbWJ5dGUuYzozMTgxCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiDwz83JzMvBINCmxCDewdMg09TXz9LFzs7RIGBpbnB1dCBjb250ZXh0JyIKKworIzogbWJ5dGUuYzozMzI4Cittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiDwz83JzMvBINCmxCDewdMg09TXz9LFzs7RIGBpbnB1dCBtZXRob2QnIgorCisjIG1zZ3N0ciAiRTI4NjogIgorIzogbWJ5dGUuYzozMzM5Cittc2dpZCAiRTI4NzogV2FybmluZzogQ291bGQgbm90IHNldCBkZXN0cm95IGNhbGxiYWNrIHRvIElNIgorbXNnc3RyICJFMjg3OiD118HHwTogzsUgzc/W1SDX09TBzs/XydTJINDPxKbAIMTM0SDazsndxc7O0SBJTSIKKworIyBtc2dzdHIgIkUyODc6ICIKKyM6IG1ieXRlLmM6MzM0NQorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiBgaW5wdXQgbWV0aG9kJyDOxSDQpsTU0snN1aQg09TJzKYiCisKKyMgbXNnc3RyICJFMjg4OiAiCisjOiBtYnl0ZS5jOjM0MDIKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogYGlucHV0IG1ldGhvZCcgzsUg0KbE1NLJzdWkINLFxMHHz9fBzqYg1MnQySIKKworIyBtc2dzdHIgIkUyODk6ICIKKyM6IG1ieXRlLmM6MzQ3NgorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDog09TJzNgg18nNwcfBpCBmb250c2V0IgorCisjIG1zZ3N0ciAiRTI5MDogIgorIzogbWJ5dGUuYzozNTA0Cittc2dpZCAiRTI5MTogWW91ciBHVEsrIGlzIG9sZGVyIHRoYW4gMS4yLjMuIFN0YXR1cyBhcmVhIGRpc2FibGVkIgorbXNnc3RyICJFMjkxOiD3xdLTptEgwqbCzKbP1MXLySBHVEsrIM3FztvBINrBIDEuMi4zLiBgU3RhdHVzIGFyZWEnINfJzcvO1dTPIgorCisjIG1zZ3N0ciAiRTI5MTogIgorIzogbWJ5dGUuYzozNzQxCittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogSU0g08XS18XSIM7FIMbVzsvDps/O1aQiCisKKyMgbXNnc3RyICJFMjkyOiAiCisjOiBtZW1maWxlLmM6NDczCittc2dpZCAiRTI5MzogYmxvY2sgd2FzIG5vdCBsb2NrZWQiCittc2dzdHIgIkUyOTM6IMLMz8sgzsUgwtXMzyDawcamy9PP18HOzyIKKworIyBtc2dzdHIgIkUyOTM6ICIKKyM6IG1lbWZpbGUuYzo5NzIKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiDwz83JzMvBINrNps7JINDP2qbDyckg1SDGwcrMpiDPws2mztUiCisKKyM6IG1lbWZpbGUuYzo5NzcKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTog8M/NyczLwSDa3snU1dfBzs7RIMbByszBIM/CzabO1SIKKworIzogbWVtZmlsZS5jOjEwMjkKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5Njog8M/NyczLwSDazabOySDQz9qmw8nJINCmxCDewdMg2sHQydPVIMbByszBIM/CzabO1SIKKworIzogbWVtZmlsZS5jOjEwNDcKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IPDPzcnMy8Eg2sHQydPVIMbByszBIM/CzabO1SIKKworIzogbWVtZmlsZS5jOjEyNDQKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IObByswgz8LNps7VINXWxSCm087VpCEgKNrMz9fNydPOycs/PykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiDuxc3BpCDCzM/L1SAwPyBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiDuxc3BpCDCzM/L1SAxPyBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyMgbXNnc3RyICJFMjk4OiAiCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODog7sXNwaQgwszPy9UgMj8gW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiDmwcrMIM/CzabO1SDX1NLB3sXOzyEhISIKKworIyBtc2dzdHIgIkUzMDE6ICIKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjog7sUgzc/W1SDQxdLFys3FztXXwdTJIMbByszBIM/CzabO1SIKKworIyBtc2dzdHIgIkUzMDI6ICIKKyM6IG1lbWxpbmUuYzo1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwMzogVW5hYmxlIHRvIG9wZW4gc3dhcCBmaWxlIGZvciBcIiVzXCIsIHJlY292ZXJ5IGltcG9zc2libGUiCittc2dzdHIgIkUzMDM6IM7FIM3P1tUg0NLP3snUwdTJIMbByswgz8LNps7VIMTM0SBcIiVzXCIsINemxM7P18zFzs7RIM7Fzc/WzMnXxSIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDog7sXNwaQgwszPy9UgMD8/IFvQz83JzMvBINDSz8fSwc3JXSIKKworIzogbWVtbGluZS5jOjc1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzA1OiBObyBzd2FwIGZpbGUgZm91bmQgZm9yICVzIgorbXNnc3RyICJFMzA1OiDuxSDazsHKxMXOzyDGwcrM1SDPws2mztUgxMzRICVzIgorCisjIG1zZ3N0ciAiRTMwNTogIgorIzogbWVtbGluZS5jOjc2NworbXNnaWQgIkVudGVyIG51bWJlciBvZiBzd2FwIGZpbGUgdG8gdXNlICgwIHRvIHF1aXQpOiAiCittc2dzdHIgIvHLycog08HNxSDGwcrMIM/CzabO1SDXycvP0snT1MHUySAoMCDEzNEg18nIz8TVKToiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6IO7FIM3P1tUg16bEy9LJ1MkgJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICLuxSDNz9bVINreydTB1MkgwszPyyAwINogIgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIu7B0MXXzs8g2s2mziDOxSDC1czPLCDBws8gVmltIM7FINDPzs/XydcgxsHKzCDPws2mztUuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgzsXQ0snEwdTOycogxMzRINfJy8/SydPUwc7O0SDaIMOmpMAg18XS06akwCBWaW0uXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICL6zsHKxKbU2CBWaW0gMy4wXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgzsUg08jP1sUgzsEgxsHKzCDPws2mztUgVmltIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiDOxdDSycTB1M7JyiDEzyDXycvP0snT1MHOztEgzsEg18HbpsogwdLIptTFy9TV0qYuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIubByswgwtXMzyDT1NfP0sXOzyDOwSAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIsHCzyDGwcrMIMLVzM8g0M/by8/E1sXOzy4iCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi98nL1dLP09TP18AgxsHKzCDPws2mztUgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICLwz97B1MvP18nKIMbByswgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTM0Cittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IPXXwcfBOiDtz9bMydfPLCDQz97B1MvP18nKIMbByswgwtXMzyDazabOxc7PIgorCisjIG1zZ3N0ciAiRTMwODogIgorIzogbWVtbGluZS5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA5OiBVbmFibGUgdG8gcmVhZCBibG9jayAxIGZyb20gJXMiCittc2dzdHIgIkUzMDk6IO7FIM3PxNUg2t7J1MHUySDCzM/LIDEg2iAlcyIKKworIyBtc2dzdHIgIkUzMDk6ICIKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/PyDiwcfB1M8g0tHEy6bXINfU0sHexc7PIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/IO7F16bSzsEgy6bM2Mum09TYINLRxMum1yIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/IPDP0s/WzqbKIMLMz8siCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/IPLRxMvJINfU0sHexc7PIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDog6cTFztTJxqbLwdTP0iDCzM/L1SAxIM7F16bSzsnKICjNz9bMydfPICVzIM7FIMbByswgz8LNps7VPykiCisKKyMgbXNnc3RyICJFMzEwOiAiCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/PyDizM/LINfU0sHexc7PIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/PyD3psQgw9jPx88g0tHEy8EgpiDEzyBgPz8/IOumzsXD2Ccg0tHEy8kgzc/W1dTYIMLV1Mkg09DM1dTBzqYiCisKKyM6IG1lbWxpbmUuYzoxMDk3Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICIiCisiPz8/IPemxCDD2M/HzyDS0cTLwSCmIMTPIGA/Pz8g66bOxcPYJyDS0cTLySDNz9bV1NggwtXUySDEz8TBzqYv19TSwd7FzqYiCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz8g66bOxcPYIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiD3psTOz9fMxc7O0SDQxdLF0tfBzs8iCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiIgorIkUzMTI6IPCmxCDewdMg16bEzs/XzMXOztEg2s7BysTFziDQz83JzMvJLi4g8MnM2M7VytTFINLRxMvJIN3PINDP3snOwcDJ1NjT0SAiCisi2iBgPz8/JyIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIvemxM7P18zFzs7RINrBy6bO3sXOzywg0MXSxdem0tTFIN7JINfTxSDQ0sHXyczYzs8uIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIijxy93PIMLB1sGk1MUsIM3P1sXUxSDawdDBzSfR1MHUySDDxcogxsHKzCDaIKbO28nNIKbNxc7FzVxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICKmLCDQz9Km19HX28kg2iDP0snHps7JzM/NLCDQxdLF16bS1MUg2s2mzskpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyLwptPM0SDD2M/Hzywg18nEwcym1NggxsHKzCDPws2mztUuXG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIwNworbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICL6zsHKxMXOzyDGwcrMySDPws2mztU6IgorCisjOiBtZW1saW5lLmM6MTM4NQorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICD3INDP1M/ezqbKIMTJ0sXL1M/Spqc6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzg3Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIPfJy8/SydPUz9fVwNbJINfLwdrBztUgzsHa19U6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAg9SDEydLFy9TP0qanICIKKworIzogbWVtbGluZS5jOjE0MDkKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tINbPxM7Px88gLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgICDXzMHTzsnLOiAiCisKKyM6IG1lbWxpbmUuYzoxNDgzCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgIMTB1M/Xwc7POiAiCisKKyM6IG1lbWxpbmUuYzoxNDg3IG1lbWxpbmUuYzozNjgwCittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICDEwdTP18HOzzogIgorCisjOiBtZW1saW5lLmM6MTUwMworbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgIFvXpsQgVmltIDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTA3Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgIFvOxSDTyM/WxSDOwSDGwcrMIM/CzabO1V0iCisKKyM6IG1lbWxpbmUuYzoxNTExCittc2dpZCAiICAgICAgICAgZmlsZSBuYW1lOiAiCittc2dzdHIgIiAgICAgICDOwdrXwSDGwcrMwTogIgorCisjOiBtZW1saW5lLmM6MTUyMworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAg2s2mzsXOzzogIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIllFUyIKK21zZ3N0ciAi9OHrIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIm5vIgorbXNnc3RyICLOpiIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgIKbNJ9Egy8/SydPU1dfB3sE6ICIKKworIzogbWVtbGluZS5jOjE1MzUKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgICDOwdrXwSDTydPUxc3JOiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICDOwdrXwSDTydPUxc3JOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICDOz83F0iDQ0s/DxdPVOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICjV08Ug3cUg18nLz87VpNTY09EpIgorCisjOiBtZW1saW5lLmM6MTU2MQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW+7FIM3P1sUgwtXUySDXycvP0snT1MHOzyDaIMOmpMAg18XS06akwCBWaW1dIgorCisjOiBtZW1saW5lLmM6MTU2NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFvOxdDSycTB1M7JyiDEzyDXycvP0snT1MHOztEgzsEg18HbpsogwdLIptTFy9TV0qZdIgorCisjOiBtZW1saW5lLmM6MTU2OQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFvOxSDNz9bFIMKm1Ngg0NLP3snUwc7Jyl0iCisKKyM6IG1lbWxpbmUuYzoxNTczCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbzsUgzc/WxSDC1dTJINemxMvSydTJyl0iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6IO7FIM3P1tUg2sLF0qbH1MksIM7FzcGkIMbByszBIM/CzabO1SIKKworIyBtc2dzdHIgIkUzMTM6ICIKKyM6IG1lbWxpbmUuYzoxODE2Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIubByswg2sLF0sXWxc7PIgorCisjOiBtZW1saW5lLmM6MTgxOAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDog+sLF0sXWxc7O0SDOxSDXxMHMz9PRIgorCisjIG1zZ3N0ciAiRTMxNDogIgorIzogbWVtbGluZS5jOjE4ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiDOxdem0s7JyiBsbnVtOiAlbGQgW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjIG1zZ3N0ciAiRTMxNTogIgorIzogbWVtbGluZS5jOjE5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiDS0cTPyyAlbGQgzsUg2s7BysTFzs8gW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjIG1zZ3N0ciAiRTMxNjogIgorIzogbWVtbGluZS5jOjIzMDMKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6INfLwdqm187JyyDCzM/L1SDQz83JzMvP18nKICgzKSBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyMgbXNnc3RyICJFMzE3OiAiCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IM3BpCDC1dTJINKm187JzSAwIFvQz83JzMvBINDSz8fSwc3JXSIKKworIzogbWVtbGluZS5jOjI0NDUKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6IPrBwsHHwdTPIMLMz8um1yDQz87P18zFzs8/IFvQz83JzMvBINDSz8fSwc3JXSIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6INfLwdqm187JyyDCzM/L1SDQz83JzMvP18nKICg0KSBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyM6IG1lbWxpbmUuYzoyNjI5Cittc2dpZCAiZGVsZXRlZCBibG9jayAxPyIKK21zZ3N0ciAiwszPyyAxINfJxMHMxc7PPyBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyM6IG1lbWxpbmUuYzoyODI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiDuxSDNz9bVINrOwcrUySDS0cTPyyAlbGQgW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjOiBtZW1saW5lLmM6MzA3MgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6INfLwdqm187JyyDCzM/L1SDQz83JzMvP18nKIFvQz83JzMvBINDSz8fSwc3JXSIKKworIyBtc2dzdHIgIkUzMTc6ICIKKyM6IG1lbWxpbmUuYzozMDg4Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50INKm18XOIDAgW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjOiBtZW1saW5lLmM6MzExNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6IM7PzcXSINLRxMvBINfJytvP1yDawSDNxdamOiAlbGQgW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjIG1zZ3N0ciAiRTMyMjogIgorIzogbWVtbGluZS5jOjMxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMzogbGluZSBjb3VudCB3cm9uZyBpbiBibG9jayAlbGQiCittc2dzdHIgIkUzMjM6IOumzNjLptPU2CDS0cTLptcg1SDCzM/DpiAlbGQg0M/NyczLz9fBIgorCisjIG1zZ3N0ciAiRTMyMzogIgorIzogbWVtbGluZS5jOjMxNzAKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAi8s/azabSINPUxcvVINrCpszY29Wk1NjT0SIKKworIzogbWVtbGluZS5jOjMyMTYKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6INfLwdqm187JyyDCzM/L1SDQz83JzMvP18nKICgyKSBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyMgbXNnc3RyICJFMzE3OiAiCisjOiBtZW1saW5lLmM6MzY3MAorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTog9ffh5+EiCisKKyM6IG1lbWxpbmUuYzozNjcxCittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisi+s7BysTFzs8gxsHKzCDPws2mztUgzsEgps0n0SBcIiIKKworIzogbWVtbGluZS5jOjM2NzUKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIu7BzcHHwcDeydPYINemxMvSydTJIMbByswgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgIPDP3sHUy8/JyiDGwcrMIM7P16bdycog2sEgxsHKzCDPws2mztVcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSDtz9bMydfPLCCmztvJyiBWaW0g1dbFINLFxMHH1aQgw8XKIMbByswuIOLVxNjUxSDPwsXSxdbOpixcbiIKKyIgICAg18kgzc/WxdTFINrBzMnbptTY09Eg2iDE18/NwSDSptrOyc3JINfF0tOm0c3JIMbByszVLlxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICD3ycrEptTYLCDBws8g0NLPxM/X1tXK1MUg2iDPwsXSxdbOptPUwC5cbiIKKworIzogbWVtbGluZS5jOjM2OTAKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikg8M/QxdLFxM6myiDTxcHO0yDSxcTBx9XXwc7O0SDB18HSpsrOzyDawdfF0tvJ19PRLlxuIgorCisjOiBtZW1saW5lLmM6MzY5MQorbXNnaWQgIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgXCI6cmVjb3ZlclwiIG9yIFwidmltIC1yICIKK21zZ3N0ciAiICAgIPfJy8/SydPUwcrUxSBcIjpyZWNvdmVyXCIgwcLPIFwidmltIC1yXCIgIgorCisjOiBtZW1saW5lLmM6MzY5MworbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIsTM0VxuIgorIiAgICDXpsTOz9fMxc7O0SDazabOLiAoxMnXLiBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICDxy93PINfJIMPFINfWxSDSz8LJzMksINfJxMHMptTYIMbByswgz8LNps7VIFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDdz8Ig0M/awsHXydTJ09Egw9jPx88g0M/XpsTPzczFzs7RLlxuIgorIlxuIgorCisjOiBtZW1saW5lLmM6MzcxMCBtZW1saW5lLmM6MzcxNAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAi5sHKzCDPws2mztUgXCIiCisKKyM6IG1lbWxpbmUuYzozNzExIG1lbWxpbmUuYzozNzE3Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiDV1sUgptPO1aQhIgorCisjOiBtZW1saW5lLmM6MzcyMAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVmltIC0tIPXXwcfBIgorCisjOiBtZW1saW5lLmM6MzcyMgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIubByswgz8LNps7VINXWxSCm087VpCEiCisKKyM6IG1lbWxpbmUuYzozNzI2Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXQiCittc2dzdHIgIiIKKyImTzr3psTL0snUySDMydvFIMTM0SDeydTBzs7RXG4iCisiJkU69dPFIM/Ezs8g0sXEwcfV18HUyVxuIgorIiZSOvemxM7P18nUyVxuIgorIiZROvfJytTJIgorCisjOiBtZW1saW5lLmM6MzcyOAorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIiZPOvemxMvSydTJIMzJ28UgxMzRIN7J1MHOztFcbiIKKyImRTr108Ugz8TOzyDSxcTBx9XXwdTJXG4iCisiJlI696bEzs/XydTJXG4iCisiJlE698nK1MlcbiIKKyImRDr3ycTBzMnUySDDxcogxsHKzCIKKworIzogbWVtbGluZS5jOjM3ODEKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiD6wcLBx8HUzyDGwcrMptcgz8LNps7VINrOwcrExc7PIgorCisjIG1zZ3N0ciAiRTMyNjogIgorIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IPvM0cjVIMTPIMXMxc3FztTBIM3FztEgzcGkIM2m09TJ1MkgzMnbxSDQpsTNxc7AIgorCisjIG1zZ3N0ciAiRTMyNzogIgorIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IO3FzsAgzsUgptPO1aQg1SDXy8Hawc7JyCDSxdbJzcHIIgorCisjIG1zZ3N0ciAiRTMyODogIgorIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IO7FzcGkIM3FzsAg2iDUwcvPwCDOwdrXz8AiCisKKyMgbXNnc3RyICJFMzI5OiAiCisjOiBtZW51LmM6NTAzCittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDog+8zRyCDEzyDNxc7RIM7FINDP18nOxc4g18XT1MkgxM8g0KbEzcXOwCIKKworIyBtc2dzdHIgIkUzMzA6ICIKKyM6IG1lbnUuYzo1NDIKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiRTMzMTog96bEzc/XzNHA09ggxM/EwdfB1MkgKsXMxc3FztTJKiDNxc7AINDS0c3PIMTPIG1lbnViYXIiCisKKyMgbXNnc3RyICJFMzMxOiAiCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiDyz9rEpszYzsnLIM7FIM3P1s7BIMTPxMHXwdTJINcg28zRyCDEzyDNxc7AIgorCisjIG1zZ3N0ciAiRTMzMjogIgorIy4gTm93IHdlIGhhdmUgZm91bmQgdGhlIG1hdGNoaW5nIG1lbnUsIGFuZCB3ZSBsaXN0IHRoZSBtYXBwaW5ncworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtZW51LmM6MTA2MworbXNnaWQgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIO3FzsAgLS0tIgorCisjOiBtZW51LmM6MTk4OQorbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAi96bEptLXwdTJIMPFIM3FzsAiCisKKyM6IG1lbnUuYzoyMDU0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzog+8zRyCDQz9fJzsXOINfF09TJIMTPIMXMxc3FztTBIM3FzsAiCisKKyMgbXNnc3RyICJFMzMzOiAiCisjOiBtZW51LmM6MjA3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IO3FzsAgJXMgzsUg2s7BysTFzs8iCisKKyMgbXNnc3RyICJFMzM0OiAiCisjOiBtZW51LmM6MjE0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiD3INLF1snNpiBgJXMnIM3FzsAgzsUgptPO1aQiCisKKyMgbXNnc3RyICJFMzM1OiAiCisjOiBtZW51LmM6MjE4MQorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjog+8zRyCDQz9fJzsXOINfF09TJIMTPINCmxM3FzsAiCisKKyMgbXNnc3RyICJFMzM2OiAiCisjOiBtZW51LmM6MjIwMgorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzog7cXOwCDOxSDazsHKxMXOzyAtLSDQxdLF16bS1MUgzsHa19UiCisKKyMgbXNnc3RyICJFMzM3OiAiCisjOiBtZXNzYWdlLmM6NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICLwz83JzMvBINCmxCDewdMg18nLz87Bzs7RICVzOiIKKworIzogbWVzc2FnZS5jOjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICLS0cTPyyAlNGxkOiIKKworIzogbWVzc2FnZS5jOjUyMworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJb0tHEz8sg2sHOwcTOzyDEz9fHycpdIgorCisjOiBtZXNzYWdlLmM6NjY5Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIvemxNDP16bEwczYzsnKINrBINDP16bEz83Mxc7O0Tog4s/HxMHOIPfMwdPAyyA8Ym9kcUB5YWhvby5jb20+IgorCisjOiBtZXNzYWdlLmM6ODgyCittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIvDF0sXS18HOzzogIgorCisjOiBtZXNzYWdlLmM6ODg1Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICLuwdTJ086m1NggRU5URVIgxMzRINDSz8TP19bFzs7RIgorCisjOiBtZXNzYWdlLmM6ODg3Cittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAi7sHUydPOptTYIEVOVEVSIMHCzyDXy8HWptTYIMvPzcHOxNUgxMzRINDSz8TP19bFzs7RIgorCisjOiBtZXNzYWdlLmM6MTk0MgorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIP3FIC0tIgorCisjOiBtZXNzYWdlLmM6MTk0NQorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiDS0cTPyywg8PLv4rbsL2I6IMzJ09QsIGQvdTog0KbXIMzJ09TBLCBxOiDXycimxCkiCisKKyM6IG1lc3NhZ2UuYzoxOTQ2Cittc2dpZCAiIChSRVQ6IGxpbmUsIFNQQUNFOiBwYWdlLCBkOiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVDog0tHEz8ssIPDy7+K27DogzMnT1CwgZDog0KbXIMzJ09TBLCBxOiDXycimxCkiCisKKyM6IG1lc3NhZ2UuYzoyNDIxIG1lc3NhZ2UuYzoyNDM2Cittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIvrB0MnUwc7O0SIKKworIzogbWVzc2FnZS5jOjI0MjMKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZZOvTBy1xuIgorIiZOOu6mIgorCisjOiBtZXNzYWdlLmM6MjQzOAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZZOvTBy1xuIgorIiZOOu6mXG4iCisiJkM696bEzabOydTJIgorCisjOiBtZXNzYWdlLmM6MjQ1NgorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZZOvTBy1xuIgorIiZOOu6mXG4iCisiJkE69dOmXG4iCisiJkQ69s/Ezs/Hz1xuIgorIiZDOvemxM2mzsnUySIKKworIzogbWVzc2FnZS5jOjI0OTYKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICL6wdDBzSfR1MHUySDGwcrMIgorCisjOiBtZXNzYWdlLmM6MjQ5OAorbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIvemxMvSydTJIMbByswiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MjU0OQorbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiD3ycLB3tTFLCDBzMUg1yDLz87Tz8ymIM7FzcGkIMSmwczPx9Ug18nCz9LVIMbByszBIgorCisjIG1zZ3N0ciAiRTMzODogIgorIzogbWlzYzEuYzoyNDU1Cittc2dpZCAiVzEwOiBXYXJuaW5nOiBDaGFuZ2luZyBhIHJlYWRvbmx5IGZpbGUiCittc2dzdHIgIlcxMDog9dfBx8E6IPrNps7ApNTY09EgxsHKzCDQ0snazsHexc7JyiDMydvFIMTM0SDeydTBzs7RIgorCisjOiBtaXNjMS5jOjI2ODQKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAi2s7J3cXOzyDPxMnOINLRxM/LIgorCisjOiBtaXNjMS5jOjI2ODYKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAixM/Ewc7PIM/Eyc4g0tHEz8siCisKKyM6IG1pc2MxLmM6MjY5MQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAixM/Ewc7PINLRxMum1zogJWxkIgorCisjOiBtaXNjMS5jOjI2OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICLazsndxc7PINLRxMum1zogJWxkIgorCisjOiBtaXNjMS5jOjI2OTYKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiICjwxdLF0tfBzs8pIgorCisjOiBtaXNjMS5jOjYyOTYKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiD6wcLF0qbHwcAgxsHKzMkuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjYzMDYKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IPrB18XS28XOzy5cbiIKKworIzogbWlzYzIuYzo2NDcgbWlzYzIuYzo2NjMKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICLwz83JzMvBOiAiCisKKyM6IG1pc2MyLmM6NjY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW8LBytRdINfT2M/HzyDSz9rNL9rOyd0uICVsdS8lbHUsINfJy8/SLiAlbHUsIM3By9MuICVsdVxuIgorCisjOiBtaXNjMi5jOjY2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJb18nLzMnLyV0g1dPYz8fPIHJlL21hbGxvYygpIC0gJWx1LCDV09jPx88gZnJlZSgpIC0gJWx1XG4iCisiXG4iCisKKyM6IG1pc2MyLmM6NzI0Cittc2dpZCAiRTM0MDogTGluZSBpcyBiZWNvbWluZyB0b28gbG9uZyIKK21zZ3N0ciAiRTM0MDog8tHEy8kg2sHOwcTUzyDEz9fHpiIKKworIyBtc2dzdHIgIkUzNDA6ICIKKyM6IG1pc2MyLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiD3ztXU0qbbztEg0M/NyczLwTogbGFsbG9jKCVsZCwgKSIKKworIyBtc2dzdHIgIkUzNDE6ICIKKyM6IG1pc2MyLmM6ODc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiD6wcLSwcvMzyDQwc0n0dSmICAo18nEpszRzM/T0SAlbHUgwsHK1KbXKSIKKworIyBtc2dzdHIgIkUzNDI6ICIKKyM6IG1pc2MyLmM6MjUxMworIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAi98nLz87VpM3PINrP186m287VIMvPzcHOxNU6IFwiJXNcIiIKKworIzogbWlzYzIuYzoyNzEyIG1pc2MyLmM6NTE4MiBvcHRpb24uYzo0NTg0Cittc2dpZCAiTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAi99TSwd7Fzs8gxNfPy9LB0MvVIgorCisjOiBtaXNjMi5jOjI3MTQgbWlzYzIuYzoyNzQxCittc2dpZCAiSWxsZWdhbCBtb2RlIgorbXNnc3RyICLuxdDSycrO0dTOycog0sXWyc0iCisKKyM6IG1pc2MyLmM6Mjc4MAorbXNnaWQgIklsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAi7sXQ0snKztHUzsnKINfJx8zRxCDNydumIgorCisjOiBtaXNjMi5jOjI4MjAgbWlzYzIuYzo1MjAyCittc2dpZCAiZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgItDP1NKmws7BIMPJxtLBIgorCisjOiBtaXNjMi5jOjI4MjUKK21zZ2lkICJJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIu7F0NLB18nM2M7JyiDXpsTTz9TPyyIKKworIzogbWlzYzIuYzozMTI5Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAi98vB1qbU2CDLzMDeINvJxtLVOiAiCisKKyM6IG1pc2MyLmM6MzEzMAorbXNnaWQgIkVudGVyIHNhbWUga2V5IGFnYWluOiAiCittc2dzdHIgIvfLwdam1Ngg1M/KINTBzcogy8zA3jogIgorCisjOiBtaXNjMi5jOjMxNDAKK21zZ2lkICJLZXlzIGRvbid0IG1hdGNoISIKK21zZ3N0ciAi68zA3qYgzsUg09Cm19DBxMHA1NghIgorCisjOiBtaXNjMi5jOjM2NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIiIKKyJFMzQzOiDuxdDSycrO0dTOxSDXydrOwd7Fzs7RICdwYXRoJy4gYCoqW8PJxtLBXScg0M/Xyc7OzyDazsHIz8TJ1MnT0SDXIMumzsOmICIKKyLbzNHI1SwgwcLPINDF0sXEICclcycuIgorCisjIG1zZ3N0ciAiRTM0MzogIgorIzogbWlzYzIuYzo0OTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IO7FIM3P1tUg2s7BytTJIMTJ0sXL1M/SpsAgXCIlc1wiINUgJ2NkcGF0aCciCisKKyMgbXNnc3RyICJFMzQ0OiAiCisjOiBtaXNjMi5jOjQ5NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiDuxSDNz9bVINrOwcrUySDGwcrMIFwiJXNcIiDVICdwYXRoJyIKKworIyBtc2dzdHIgIkUzNDU6ICIKKyM6IG1pc2MyLmM6NDk0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiD1ICdjZHBhdGgnIM7FINrOwcrExc7PIKbO28nIIMTJ0sXL1M/SpsogXCIlc1wiIgorCisjIG1zZ3N0ciAiRTM0NjogIgorIzogbWlzYzIuYzo0OTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0Nzog9SDbzNHI1SDQz9vVy9UgwqbM2NvFIM7FzcGkIMbBysym1yBcIiVzXCIiCisKKyMgbXNnc3RyICJFMzQ3OiAiCisjOiBtaXNjMi5jOjUxOTQKK21zZ2lkICJJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAi7sXNz9bMydfJyiDLz83Qz87FztQiCisKKyM6IG5vcm1hbC5jOjI4MjUKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICL118HHwTog1MXSzabOwcwgzsUg0KbE1NLJzdWkIMvPzNjP0skiCisKKyM6IG5vcm1hbC5jOjMwMjAKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiD3ySDT1M+n1MUgzsEg0M/Sz9bO2M/N1SDS0cTL1SIKKworIyBtc2dzdHIgIkUzNDg6ICIKKyM6IG5vcm1hbC5jOjMwMjIKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTog98kgzsUg09TPptTFIM7BINPMz9emIgorCisjOiBub3JtYWwuYzo0MTg3Cittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IO7FIM3P1tUg2s7J3cnUySDax8/S1MvJICja18HWwcDeySDOwSAnZm9sZG1ldGhvZCcpIgorCisjOiBvcHMuYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgMSB0aW1lIgorbXNnc3RyICLPxMnOINLRxM/LICVzLc7PIgorCisjOiBvcHMuYzoyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIs/Eyc4g0tHEz8sgJXMtzs8gJWQg0sHaptciCisKKyM6IG9wcy5jOjI3OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCDS0cTLptcgJXMtzs8iCisKKyM6IG9wcy5jOjI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkINLRxMum1yAlcy3OzyAlZCDSwdqm1yIKKworIzogb3BzLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICL6wczJ28nMz9PRINfJ0qbXztHUyTogJWxkINLRxMum1yIKKworIzogb3BzLmM6Njg4Cittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAiz8TJziDS0cTPyyDXydKm187Rzs8iCisKKyM6IG9wcy5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICLXydKm187Rzs8g0tHEy6bXOiAlbGQiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNTMxCittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgItDSz8LMxc3JINog2sLF0sXWxc7O0c0sINfTxSDPxM7PINfJxMHMydTJPyIKKworIzogb3BzLmM6MjAyMQorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICLvxMnOINLRxM/LINrNps7Fzs8iCisKKyM6IG9wcy5jOjIwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIvrNps7Fzs8g0tHEy6bXOiAlbGQiCisKKyM6IG9wcy5jOjIzODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgItrXpszYzsXOzyDS0cTLptc6ICVsZCIKKworIzogb3BzLmM6MjY2MAorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIvLRxM/LINrCxdLF1sXOzyIKKworIzogb3BzLmM6MjY2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICL6wsXSxdbFzs8g0tHEy6bXOiAlbGQiCisKKyM6IG9wcy5jOjI5MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1Mzog9SDSxcem09TSpiAlcyDQz9LP1s7YzyIKKworIyBtc2dzdHIgIkUzNTM6ICIKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6MzQ2NQorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDyxcem09TSySAtLS0iCisKKyM6IG9wcy5jOjQ1OTcKK21zZ2lkICJJbGxlZ2FsIHJlZ2lzdGVyIG5hbWUiCittc2dzdHIgIu7F0NLB18nM2M7BIM7B2tfBINLFx6bT1NLBIgorCisjOiBvcHMuYzo0Njc3Cittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDyxcem09TSyTpcbiIKKworIzogb3BzLmM6NDcwMworIywgYy1mb3JtYXQKK21zZ2lkICJVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIu7F16bEz83JyiDUxdAg0sXHptPU0sE6ICVkIgorCisjOiBvcHMuYzo1MDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDog7sXQ0sHXyczYzsEgzsHa18Eg0sXHptPU0sE6ICclcyciCisKKyM6IG9wcy5jOjU0MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAixM/X1i46ICVsZDsgIgorCisjOiBvcHMuYzo1NDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAi98nC0sHOzyAtICVzJWxkINogJWxkIPLRxMum1zsgJWxkINogJWxkIPPMptc7ICVsZCDaICVsZCDiwcrUptciCisKKyM6IG9wcy5jOjU0NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICLrz8zPzsvBICVzINogJXM7IPLRxM/LICVsZCDaICVsZDsg88zP188gJWxkINogJWxkOyDiwcrUICVsZCDaICVsZCIKKworIzogb3BzLmM6NTQ1OQorIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgxMzRIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE5ODkKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIuTRy9Wkzc8g2sEg16bE16bEwc7O0SBWaW0iCisKKyM6IG9wdGlvbi5jOjMxNzUKK21zZ2lkICJPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAi79DDptEgzsUg0KbE1NLJzdWk1NjT0SIKKworIzogb3B0aW9uLmM6MzIwMAorbXNnaWQgIk5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIu7FIMTP2tfPzMXOzyDVIG1vZGVsaW5lIgorCisjOiBvcHRpb24uYzozMjU2Cittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdPfP09TBzs7FINrNps7FztUg1SAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAi8KbTzNEgPSDQz9TSpsLOzyDXy8HawdTJIN7J08zPIgorCisjOiBvcHRpb24uYzozNzAyIG9wdGlvbi5jOjQzMDkKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAi7sUg2s7ByszFzs8g08XSxcQgzc/WzMnXz9PUxcog1MXSzabOwcym1yIKKworIzogb3B0aW9uLmM6Mzc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICLuxcTP2tfBzMXOycog08nN18/MIDwlcz4iCisKKyM6IG9wdGlvbi5jOjQyOTQgb3B0aW9uLmM6NTQ5OAorbXNnaWQgIk5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIvTV1CDUwcvPx88gzsUgzMDCzNHU2CIKKworIzogb3B0aW9uLmM6NDMwMQorbXNnaWQgIkNhbm5vdCBzZXQgJ3Rlcm0nIHRvIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAi7sUgzc/W1SDT0M/Sz9bOydTJICd0ZXJtJyIKKworIzogb3B0aW9uLmM6NDMwNAorbXNnaWQgIkNhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIu7FIM3P1tUg2s2mzsnUySAndGVybScg1yBHVUkiCisKKyM6IG9wdGlvbi5jOjQzMDYKK21zZ2lkICJVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAi98nLz9LJ09TP19XK1MUgXCI6Z3VpXCIgxMzRINTPx88g3c/CINLP2tDP3sHUySBHVUkiCisKKyM6IG9wdGlvbi5jOjQzMjcKK21zZ2lkICInYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICLv0MOmpyAnYmFja3VwZXh0JyDUwSAncGF0Y2htb2RlJyDPxM7By8/XpiIKKworIzogb3B0aW9uLmM6NDU4NgorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAi8tHEz8sg0M/Sz9bOpsoiCisKKyM6IG9wdGlvbi5jOjQ2NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWlzc2luZyBudW1iZXIgYWZ0ZXIgPCVzPiIKK21zZ3N0ciAi8KbTzNEgPCVzPiDX1NLB3sXOzyDOz83F0iIKKworIzogb3B0aW9uLmM6NDY2OAorbXNnaWQgIk1pc3NpbmcgY29tbWEiCittc2dzdHIgIvfU0sHexc7PIMvPzdUiCisKKyM6IG9wdGlvbi5jOjQ2NzUKK21zZ2lkICJNdXN0IHNwZWNpZnkgYSAnIHZhbHVlIgorbXNnc3RyICL6zsHexc7O0SAnIM7FINfLwdrBzs8iCisKKyM6IG9wdGlvbi5jOjQ3MTUKK21zZ2lkICJjb250YWlucyB1bnByaW50YWJsZSBjaGFyYWN0ZXIiCittc2dzdHIgIs2m09TJ1NggzsXE0tXLz9fOpiDTyc3Xz8zJIgorCisjOiBvcHRpb24uYzo0NzI4Cittc2dpZCAiSW52YWxpZCBmb250KHMpIgorbXNnc3RyICLuxdem0s7PINfLwdrBzs8g29LJxtQoySkiCisKKyM6IG9wdGlvbi5jOjQ3MzQKK21zZ2lkICJjYW4ndCBzZWxlY3QgZm9udHNldCIKK21zZ3N0ciAizsUgzc/W1SDXycLSwdTJIGZvbnRzZXQiCisKKyM6IG9wdGlvbi5jOjQ3MzYKK21zZ2lkICJJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIu7F16bSzsnKIGZvbnRzZXQiCisKKyM6IG9wdGlvbi5jOjQ3NDMKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICLuxSDNz9bVINfJy8/SydPUwdTJINvJ0s/Lycog29LJxtQiCisKKyM6IG9wdGlvbi5jOjQ3NDUKK21zZ2lkICJJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAi7sXXptLOycog28nSz8vJyiDb0snG1CIKKworIzogb3B0aW9uLmM6NTAxNQorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICLuxcTP2tfPzMXOycog08nN18/MINCm08zRIDwlYz4iCisKKyM6IG9wdGlvbi5jOjUwOTgKK21zZ2lkICJjb21tYSByZXF1aXJlZCIKK21zZ3N0ciAi0M/U0qbCzsEgy8/NwSIKKworIzogb3B0aW9uLmM6NTEwNworIywgYy1mb3JtYXQKK21zZ2lkICInY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICInY29tbWVudHN0cmluZycgzcGkIM2m09TJ1MkgJXMiCisKKyM6IG9wdGlvbi5jOjUxNTQKK21zZ2lkICJObyBtb3VzZSBzdXBwb3J0IgorbXNnc3RyICLtydvBIM7FINCmxNTSyc3VwKTU2NPRIgorCisjOiBvcHRpb24uYzo1NDAwCittc2dpZCAiVW5jbG9zZWQgZXhwcmVzc2lvbiBzZXF1ZW5jZSIKK21zZ3N0ciAi8M/TzKbEz9fOptPU2CDXydLB2qbXIM7FINrB18XS28XOzyIKKworIzogb3B0aW9uLmM6NTQwNAorbXNnaWQgInRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICLawcLBx8HUzyDewdPUyc4iCisKKyM6IG9wdGlvbi5jOjU0MDYKK21zZ2lkICJ1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAix9LV0MkgzsUg2sLBzMHO08/Xwc7PIgorCisjOiBvcHRpb24uYzo1NjIxCittc2dpZCAiQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAi8M/QxdLFxM7FINemy87PINXWxSCm087VpCIKKworIzogb3B0aW9uLmM6NTg4MiBvcHRpb24uYzo1OTExCittc2dpZCAiJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiJ3dpbmhlaWdodCcgzsUgzc/WxSDC1dTJIM3FztvFINrBICd3aW5taW5oZWlnaHQnIgorCisjOiBvcHRpb24uYzo1OTI3IG9wdGlvbi5jOjU5NDYKK21zZ2lkICInd2lud2lkdGgnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbndpZHRoJyIKK21zZ3N0ciAiJ3dpbndpZHRoJyDOxSDNz9bFIMLV1MkgzcXO28Ug2sEgJ3dpbm1pbndpZHRoJyIKKworIzogb3B0aW9uLmM6NjA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICLwz9TSpsLOzyDS0cTLptc6IM7FIM3FztvFICVkIgorCisjOiBvcHRpb24uYzo2MDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAi8M/U0qbCzs8gy8/Mz87PyzogzsUgzcXO28UgJWQiCisKKyM6IG9wdGlvbi5jOjYzOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiDuxdemxM/NwSDP0MOm0TogJXMiCisKKyMgbXNnc3RyICJFMzU1OiAiCisjOiBvcHRpb24uYzo2NTAxCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g68/EySDUxdLNps7BzMEgLS0tIgorCisjOiBvcHRpb24uYzo2NTAzCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g+sHHwczYzqYg2s7B3sXOztEg2s2mzs7JyCAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDUKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIO2m08PF16Yg2s7B3sXOztEg2s2mzs7JyCAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDcKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIPrNps7OpiAtLS0iCisKKyM6IG9wdGlvbi5jOjcxOTcKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1Njog8M/NyczLwSBnZXRfdmFycCBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyMgbXNnc3RyICJFMzU2OiAiCisjOiBvcHRpb24uYzo4MTEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6IOTM0SDTyc3Xz8zVICVzIM7FzcGkINDB0skiCisKKyMgbXNnc3RyICJFMzU3OiAiCisjOiBvcHRpb24uYzo4MTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IO7BxMzJ28vP16Yg08nN18/MySDQptPM0SBgOyc6ICVzIgorCisjIG1zZ3N0ciAiRTM1ODogIgorIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIs7FIM3P1tUg16bEy9LJ1MkgIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTog7sUgzc/W1SDXpsTL0snUySDXpsvOzyFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICLwz9TSpsLOzyBBbWlnYWRvcyAyLjA0IMHCzyDQptrOptumINfF0tOmp1xuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIvDP1NKmws7PICVzINfF0tOmpyAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MDcKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIu7FIM3P1tUg16bEy9LJ1MkgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQxOAorbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICLuxSDNz9bVINPU18/SydTJICIKKworIzogb3NfYW1pZ2EuYzo4OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICJWaW0g2sHXxdLb1aQg0s/Cz9TVINogJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICLOxSDNz9bVIMjNps7J1Mkg0sXWyc0gy8/O08/MpiA/IVxuIgorCisjOiBvc19hbWlnYS5jOjkzOCBvc19tYWMuYzoxMTY4IG9zX21zd2luLmM6NjE5IG9zX3Jpc2Nvcy5jOjcyOCBvc191bml4LmM6MjczMworbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTog8sXWyc0gxcvSwc7VIM7FINCmxNTSyc3VpNTY09EiCisKKyMgbXNnc3RyICJFMzU5OiAiCisjOiBvc19hbWlnYS5jOjk5NAorbXNnaWQgIm1jaF9nZXRfc2hlbGxzaXplOiBub3QgYSBjb25zb2xlPz9cbiIKK21zZ3N0ciAibWNoX2dldF9zaGVsbHNpemU6IM7FIMvPztPPzNg/P1xuIgorCisjLiBpZiBWaW0gb3BlbmVkIGEgd2luZG93OiBFeGVjdXRpbmcgYSBzaGVsbCBtYXkgY2F1c2UgY3Jhc2hlcworIzogb3NfYW1pZ2EuYzoxMTQyCittc2dpZCAiRTM2MDogQ2Fubm90IGV4ZWN1dGUgc2hlbGwgd2l0aCAtZiBvcHRpb24iCittc2dzdHIgIkUzNjA6IO7FIM3P1tUg18nLz87B1MkgYHNoZWxsJyDaIM/Qw6akwCAtZiIKKworIyBtc2dzdHIgIkUzNjA6ICIKKyM6IG9zX2FtaWdhLmM6MTE4MyBvc19hbWlnYS5jOjEyNzMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIu7FIM3P1tUg18nLz87B1MkgIgorCisjOiBvc19hbWlnYS5jOjExODYgb3NfYW1pZ2EuYzoxMjgzCittc2dpZCAic2hlbGwgIgorbXNnc3RyICJzaGVsbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNiBvc19hbWlnYS5jOjEzMDgKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiINDP18XSztXUz1xuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFINrBzcHMycoiCisKKyM6IG9zX2FtaWdhLmM6MTQ1MgorbXNnaWQgIkkvTyBFUlJPUiIKK21zZ3N0ciAi8M/NyczLwSDX18/E1S/XydfPxNUiCisKKyM6IG9zX21zd2luLmM6NTAzCittc2dpZCAiLi4uKHRydW5jYXRlZCkiCittc2dzdHIgIi4uLijXpsTSptrBzs8pIgorCisjOiBvc19tc3dpbi5jOjU5NAorbXNnaWQgIidjb2x1bW5zJyBpcyBub3QgODAsIGNhbm5vdCBleGVjdXRlIGV4dGVybmFsIGNvbW1hbmRzIgorbXNnc3RyICInY29tbWFuZHMnIM7FIDgwLCDOxSDNz9bVINfJy8/O1dfB1Mkg2s/XzqbbzqYgy8/Nwc7EySIKKworIzogb3NfbXN3aW4uYzo3MDYgb3NfdW5peC5jOjQ5NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IPfJy8zJyyDaIMKmwsymz9TFy8kgxMzRIFwiJXMoKVwizsUg18TB19PRIgorCisjIG1zZ3N0ciAiRTM2NDogIgorIzogb3NfbXN3aW4uYzoxMzQwCittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiDuxSDXxMHMz9PRINfJwtLB1MkgxNLVy6bXzsnLIgorCisjOiBvc19tc3dpbi5jOjEzODgKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgIs7BICVzINogJXMiCisKKyM6IG9zX21zd2luLmM6MTQwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICJFNDg4OiDuxdemxM/Nycog29LJxtQ6ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NTMgb3NfbXN3aW4uYzoxNDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODog8M/NyczLwSDE0tXL1TogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ2NAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIu7F16bEz83PIgorCisjOiBvc19tc3dpbi5jOjE0OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAi5NLVy9Wkzc8gJyVzJyIKKworIzogb3NfbXN3aW4uYzoyNTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiDwz83JzMvP18EgzsHa18EgzsHCz9LVINPJzdfPzKbXIFwiJXNcIiDVIM7B2temINvSycbUwSBcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjU2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiDwz83JzMvP18nKINPJzdfPzCAlYyDXIM7B2temINvSycbUwSBcIiVzXCIiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyMjcKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiDuxdem0s7BIM/Qw6bRICdvc2ZpbGV0eXBlJyAtLSDXycvP0snT1M/X1cAgYFRleHQnIgorCisjIG1zZ3N0ciAiRTM2NjogIgorIzogb3NfdW5peC5jOjgwMworbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IO/U0snNwc7PINPJx87BzCDE16bepiwg2sHXxdLb1cBcbiIKKworIzogb3NfdW5peC5jOjgwOQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTog79TSyc3Bzs8g08nHzsHMINrBy6bO3snUySDSz8LP1NUgKCVzKVxuIgorCisjOiBvc191bml4LmM6ODEyCittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IO/U0snNwc7PINPJx87BzCDawcumzt7J1Mkg0s/Cz9TVXG4iCisKKyM6IG9zX3VuaXguYzoxMDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICLuwSDXpsTL0snU1NEgWC3EwdPQzMXAINCm28zPICVsZCDNpsym08XL1c7EIgorCisjOiBvc191bml4LmM6MTA5MworbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IO/U0snNwc7PINDPzcnMy9UgWFxuIgorCisjOiBvc191bml4LmM6MTE2MAorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIu7FINfEwczP09Eg0MXSxdem0snUySDEydPQzMXKIFgiCisKKyM6IG9zX3VuaXguYzoxMzA0Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAi5NXWxSDEz9fHzyDXpsTL0snXpNTY09EgxMnT0MzFyiBYLCDQxdLF0tfBzs8iCisKKyM6IG9zX3VuaXguYzoyOTA2IG9zX3VuaXguYzozNDkwCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIu7FIM3P1tUg18nLz87B1MkgYHNoZWxsJyIKKworIzogb3NfdW5peC5jOjI5NTEKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgc2hcbiIKK21zZ3N0ciAiIgorIlxuIgorIu7FIM3P1tUg18nLz87B1MkgYHNoJ1xuIgorCisjIG1zZ3N0ciAiRTM2MjogIgorIzogb3NfdW5peC5jOjI5NTUgb3NfdW5peC5jOjM0OTYKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisic2hlbGwg0M/XxdLUwaQ6ICIKKworIzogb3NfdW5peC5jOjMwODkKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisi7sUgzc/W1SDT1NfP0snUySDLwc7BzMlcbiIKKworIzogb3NfdW5peC5jOjMxMDQKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIu7FIM3P1tUg0s/axNfPp9TJINfJy8/Owc7O0SBbZm9yaygpXVxuIgorCisjOiBvc191bml4LmM6MzUwMworbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIuvPzcHOxMEg2sHLps7eyczBINfJy8/Owc7O0VxuIgorCisjOiBvc191bml4LmM6NTAxMAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIu7FINfEwczP09Eg16bEy9LJ1MkgxMnT0MzFyiBYIgorCisjOiBvc192bXNfbW1zLmM6NTkKK21zZ2lkICJBdCBsaW5lIgorbXNnc3RyICLy0cTPyzoiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIu7FINfEwczP09Eg2sHXwc7UwdbJ1MkgdmltMzIuZGxsIgorCisjOiBvc193MzJleGUuYzoxNjkgb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICLwz83JzMvBIFZpbSIKKworIzogb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiQ291bGQgbm90IGZpeCB1cCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgRExMISIKK21zZ3N0ciAi7sUgzc/W1SDXydDSwdfJ1Mkg18vB2qbXzsnLySDOwSDG1c7Lw6anIERMTCEiCisKKyM6IG9zX3dpbjE2LmM6NTc4IG9zX3dpbjMyLmM6MzA2NworIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAic2hlbGwg0M/XxdLUwaQgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjUzNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IO/U0snNwc7PICVzLdDPxKbAXG4iCisKKyM6IG9zX3dpbjMyLmM6MjUzNworbXNnaWQgImNsb3NlIgorbXNnc3RyICJjbG9zZSIKKworIzogb3Nfd2luMzIuYzoyNTM5Cittc2dpZCAibG9nb2ZmIgorbXNnc3RyICJsb2dvZmYiCisKKyM6IG9zX3dpbjMyLmM6MjU0MAorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICJzaHV0ZG93biIKKworIzogb3Nfd2luMzIuYzozMDIxCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IOvPzcHOxNUgzsUg2s7BysTFzs8iCisKKyM6IG9zX3dpbjMyLmM6MzAzNAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorIubByswgVklNUlVOLkVYRSDOxSDazsHKxMXOzyDVINfB28/N1SDbzNHI1SDQz9vVy9UuXG4iCisi+s/XzqbbzqYgy8/Nwc7EySDOxSDC1cTV1Ngg0NLJ2tXQyc7FzqYg0KbTzNEg18nLz87Bzs7RLlxuIgorIuTJ16bU2NPRICA6aGVscCB3aW4zMi12aW1ydW4gIMTM0SDQz8TBzNjbz6cgps7Gz9LNwcOmpy4iCisKKyM6IG9zX3dpbjMyLmM6MzAzNworbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICLwz9DF0sXE1sXOztEgVmltIgorCisjIG1zZ3N0ciAiRTM3MTogIgorIzogcXVpY2tmaXguYzoyODEKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IPrBwsHHwdTPICUlJWMg1SDS0cTL1SDGz9LNwdTBIgorCisjIG1zZ3N0ciAiRTM3MjogIgorIzogcXVpY2tmaXguYzoyOTQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Mzog7sXP3qbL1dfBzsnKIGAlJSVjJyDVINLRxMvVIMbP0s3B1MEiCisKKyMgbXNnc3RyICJFMzczOiAiCisjOiBxdWlja2ZpeC5jOjM0OAorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiD31NLB3sXOzyBdINUg0tHEy9Ugxs/SzcHUwSIKKworIyBtc2dzdHIgIkUzNzQ6ICIKKyM6IHF1aWNrZml4LmM6MzYyCittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiAlJSVjINUg0tHEy9Ugxs/SzcHUwSDOxSDQpsTU0snN1aTU2NPRIgorCisjIG1zZ3N0ciAiRTM3NTogIgorIzogcXVpY2tmaXguYzozODAKK21zZ2lkICJFMzc2OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyBwcmVmaXgiCittc2dzdHIgIkUzNzY6IPDPzcnMy8/XycogYCUlJWMnINUg0NLFxqbL06Yg0tHEy9Ugxs/SzcHUwSIKKworIyBtc2dzdHIgIkUzNzY6ICIKKyM6IHF1aWNrZml4LmM6Mzg4Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzY6IPDPzcnMy8/XycogYCUlJWMnINUg0tHEy9Ugxs/SzcHUwSIKKworIyBtc2dzdHIgIkUzNzc6ICIKKyM6IHF1aWNrZml4LmM6NDE0Cittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIM2m09TJ1NggzMnbxSDa18newcrOpiDTyc3Xz8zJIgorCisjIG1zZ3N0ciAiRTM3ODogIgorIzogcXVpY2tmaXguYzo1MjAKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiD31NLB3sXOzyDOwdrX1SDEydLFy9TP0qanIgorCisjOiBxdWlja2ZpeC5jOjkzMQorbXNnaWQgIk5vIG1vcmUgaXRlbXMiCittc2dzdHIgIu/T1MHOzqbKIMXMxc3FztQiCisKKyM6IHF1aWNrZml4LmM6MTE1MgorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQg2iAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTE1NAorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiICjS0cTPyyDXycTBzMXOzykiCisKKyM6IHF1aWNrZml4LmM6MTM2MAorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDog89TFyyBxdWlja2ZpeCDQz9LP1s6myiIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiD3xdLbyc7BINPUxcvVIHF1aWNrZml4IgorCisjOiBxdWlja2ZpeC5jOjEzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICLT0MnTz8sg0M/NyczPyyAlZCDaICVkOyAlZCDQz83JzM/LIgorCisjOiBxdWlja2ZpeC5jOjE4NDIKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiDuxSDNz9bVINrB0MnTwdTJLCDXy8Hawc7BIM/Qw6bRICdidWZ0eXBlJyIKKworIyBtc2dzdHIgIkUzODI6ICIKKyM6IHJlZ2V4cC5jOjgwMgorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IPrSwdrPyyDawc7BxNTPIMTP18fJyiIKKworIyBtc2dzdHIgIkUzMzk6ICIKKyM6IHJlZ2V4cC5jOjEzMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IPfLzMHExc6mICVzKiIKKworIyBtc2dzdHIgIkU2MTogIgorIzogcmVnZXhwLmM6MTMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6IPfLzMHExc6mICVzJWMiCisKKyMgbXNnc3RyICJFNjI6ICIKKyM6IHJlZ2V4cC5jOjE0NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiDwptPM0SAlcyVjIM6m3s/HzyDOxc3BpCIKKworIyBtc2dzdHIgIkU2NDogIgorIzogcmVnZXhwLmM6MjQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAi88nO1MHL08nezsEg0M/NyczLwSDXICVzey4uLn0iCisKKyM6IHJlZ2V4cC5jOjI3MjcKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTog96bEwtXMwdPYIMHXwdKm0Tsg2sHOwcTUzyDTy8zBxM7JyiDa0sHaz8s/IgorCisjOiByZWdleHAuYzoyODYyCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiD60sHaz8sg2t7JzsnXINDPzcnMy9Ug09TFy9UiCisKKyM6IHJlZ2V4cC5jOjMwOTgKK21zZ2lkICJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIgorbXNnc3RyICL6z9fOptvOpiDQpsTawqbHyTpcbiIKKworIzogc2NyZWVuLmM6MjA1OAorIywgYy1mb3JtYXQKK21zZ2lkICIrLS0lM2xkIGxpbmVzIGZvbGRlZCAiCittc2dzdHIgIistLVvax8/S1M/LXSglM2xkINLRxMum1ykiCisKKyM6IHNjcmVlbi5jOjc0NTEKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLdrBzabOwSIKKworIzogc2NyZWVuLmM6NzQ1NQorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIg+sHNps7BIgorCisjOiBzY3JlZW4uYzo3NDYwCittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiDvwsXSztXUzyIKKworIzogc2NyZWVuLmM6NzQ2MgorbXNnaWQgIiBJTlNFUlQiCittc2dzdHIgIiD309TB18vBIgorCisjOiBzY3JlZW4uYzo3NDY1Cittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKNfT1MHXy8EpIgorCisjOiBzY3JlZW4uYzo3NDY3Cittc2dpZCAiIChyZXBsYWNlKSIKK21zZ3N0ciAiICjawc2mzsEpIgorCisjOiBzY3JlZW4uYzo3NDY5Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAoVi3awc2mzsEpIgorCisjOiBzY3JlZW4uYzo3NDcyCittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIEhlYnJldyIKKworIzogc2NyZWVuLmM6NzQ4MAorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAobGFuZykiCisKKyM6IHNjcmVlbi5jOjc0ODMKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiICjCxdogz8LSz8LLySkiCisKKyM6IHNjcmVlbi5jOjc0ODkKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIg98nEpszFzs7RIgorCisjOiBzY3JlZW4uYzo3NDkxCittc2dpZCAiIFZJU1VBTCIKK21zZ3N0ciAiIPfJwqbSIgorCisjOiBzY3JlZW4uYzo3NDkzCittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIgW+LMz8tdIgorCisjOiBzY3JlZW4uYzo3NDk1Cittc2dpZCAiIExJTkUiCittc2dzdHIgIiBb8tHEy8ldIgorCisjOiBzY3JlZW4uYzo3NTA4IHNjcmVlbi5jOjc1NjIKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgIsrExSDawdDJ0yIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgIvDP29XLIMSmytvP1yDEzyDHz9LJLCDQ0s/Ez9fW1aTNzyDVzsna1SIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgIvDP29XLIMSmytvP1yDEzyDOydrVLCDQ0s/Ez9fW1aTNzyDaIMfP0skiCisKKyM6IHNlYXJjaC5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiDuxdem0s7JyiDa0sHaz8sgxMzRINDP29XL1TogJXMiCisKKyM6IHNlYXJjaC5jOjc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6IPDP29XLIMSmytvP1yDEzyDHz9LJIMLF2iDawqbHptcg2iAlcyIKKworIzogc2VhcmNoLmM6NzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTog8M/b1csgxKbK28/XIMTPIM7J2tUgwsXaINrCpsem1yDaICVzIgorCisjOiBzZWFyY2guYzoxMTA3Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiDwptPM0SBgOycgzcGkIMrUySBgPycgwcLPIGAvJyIKKworIyBtc2dzdHIgIkUzODY6ICIKKyM6IHNlYXJjaC5jOjM0NzkKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICjSwdrPzSDaINDP0MXSxcTOps3JINrCpsfBzckpIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM0OTkKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0g98vMwN7FzqYgxsHKzMkgIgorCisjOiBzZWFyY2guYzozNTAxCittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAizsUg2s7BysTFzs8gIgorCisjOiBzZWFyY2guYzozNTAyCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAi1SDbzNHI1SDQz9vVy9UgLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM1NDEKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKPXWxSDVINPQydPL1SkiCisKKyM6IHNlYXJjaC5jOjM1NDMKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICDuxSDazsHKxMXOzyIKKworIzogc2VhcmNoLmM6MzU5NQorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAi8M/b1csg1SDXy8zA3sXOz83VIMbBysymOiAlcyIKKworIzogc2VhcmNoLmM6MzgxMworbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4Nzog+sKmxyDVINDP1M/ezs/N1SDS0cTL1SIKKworIzogc2VhcmNoLmM6Mzk1MworbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICL106Yg18vMwN7FzqYgxsHKzMkgwtXMzyDazsHKxMXOzyIKKworIzogc2VhcmNoLmM6Mzk1NQorbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICL2z8TOz8fPINfLzMDexc7Px88gxsHKzMEiCisKKyM6IHNlYXJjaC5jOjM5NzEKK21zZ2lkICJFMzg4OiBDb3VsZG4ndCBmaW5kIGRlZmluaXRpb24iCittc2dzdHIgIkUzODg6IPfJ2s7B3sXOztEgzsUg2s7BysTFzs8iCisKKyM6IHNlYXJjaC5jOjM5NzMKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IPrSwdrPyyDOxSDazsHKxMXOzyIKKworIzogc3ludGF4LmM6Mjk5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDog7sXXptLOycogwdLH1c3FztQ6ICVzIgorCisjOiBzeW50YXguYzozMTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiDuxSCm087VwN7JyiDLzMHTxdTSINPJztTBy9PJ09U6ICVzIgorCisjIG1zZ3N0ciAiRTM5MTogIgorIzogc3ludGF4LmM6MzM0MAorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAi5MzRIMLVxsXS1SDOxSDXydrOwd7Fzs8gxczFzcXO1KbXINPJztTBy9PJ09UiCisKKyM6IHN5bnRheC5jOjMzNDgKK21zZ2lkICJzeW5jaW5nIG9uIEMtc3R5bGUgY29tbWVudHMiCittc2dzdHIgItPJzsjSz86m2sHDptEgwsHa1aTU2NPRIM7BIPMty8/Nxc7UwdKm0cgiCisKKyM6IHN5bnRheC5jOjMzNTYKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICLTyc7I0s/OptrBw6bRIM7FINfJy8/SydPUz9fVpNTY09EiCisKKyM6IHN5bnRheC5jOjMzNTkKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgItPJzsjSz86m2sHDptEg0M/eyc7BpNTY09Eg2sEgIgorCisjOiBzeW50YXguYzozMzYxIHN5bnRheC5jOjM0MzAKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICIgINLRxMum1yDQxdLFxCDQxdLbyc0g0tHEy8/NIgorCisjOiBzeW50YXguYzozMzY1Cittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g5czFzcXO1Mkg08nOyNLPzqbawcOmpyDTyc7UwcvTydPVIC0tLSIKKworIzogc3ludGF4LmM6MzM2OAorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisi08nOyNLPzqbawcOmpyDCwdrVpNTY09EgzsEgxczFzcXO1MHIIgorCisjOiBzeW50YXguYzozMzczCittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOXMxc3FztTJINPJztTBy9PJ09UgLS0tIgorCisjOiBzeW50YXguYzozMzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDuxSCm087VwN7JyiDLzMHTxdTSINPJztTBy9PJ09U6ICVzIgorCisjOiBzeW50YXguYzozNDIwCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIs2mzqbNwczYzsnKICIKKworIzogc3ludGF4LmM6MzQyNworbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICLNwcvTyc3BzNjOycogIgorCisjOiBzeW50YXguYzo0MDU3Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiBncm91cFt0XWhldGUg1NXUIM7FINDSwcPApCIKKworIzogc3ludGF4LmM6NDA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IO7FINrOwcrExc7PIM/CzMHT1KYgxMzRICVzIgorCisjOiBzeW50YXguYzo0MTA5Cittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IO2m09TJ1NggwdLH1c3FztTJIN3PIM7F0NLJys7R1M6mINTV1CIKKworIzogc3ludGF4LmM6NDEyMAorbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiDh0sfVzcXO1CDOxdDSycrO0dTOycog1NXUIgorCisjIG1zZ3N0ciAiRTM5NjogIgorIzogc3ludGF4LmM6NDE5OAorbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiDwz9TSpsLOwSDOwdrXwSDGwcrMwSIKKworIzogc3ludGF4LmM6NDUzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IGA9JyDX1NLB3sXOzzogJXMiCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjOiBzeW50YXguYzo0Njk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiDuxSDEz9PJ1NggwdLH1c3FztSm1zogc3ludGF4IHJlZ2lvbiAlcyIKKworIzogc3ludGF4LmM6NTAyNQorbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiDrzMHT1MXSIM7FINfLwdrBzs8iCisKKyM6IHN5bnRheC5jOjUwNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTog66bOxcPYINrSwdrLwSDOxSDazsHKxM7POiAlcyIKKworIzogc3ludGF4LmM6NTEzNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiDzzabU1NEg0KbTzNEg2tLB2svBOiAlcyIKKworIyBtc2dzdHIgIkU0MDI6ICIKKyM6IHN5bnRheC5jOjUyMTkKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFNDAzOiBzeW50YXggc3ludGF4OiDa0sHaz8sgxMzRINDSz8TP19bFzs7RINLRxMvBINfLwdrBzs8gxNem3qYiCisKKyM6IHN5bnRheC5jOjUyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiDuxdem0s6mIMHSx9XNxc7UyTogJXMiCisKKyMgbXNnc3RyICJFNDA0OiAiCisjOiBzeW50YXguYzo1MzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IO7FzcGkIGA9JzogJXMiCisKKyMgbXNnc3RyICJFNDA1OiAiCisjOiBzeW50YXguYzo1MzMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjog8M/Sz9bOpsogwdLH1c3FztQ6ICVzIgorCisjIG1zZ3N0ciAiRTQwNjogIgorIzogc3ludGF4LmM6NTM1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyDU1dQgzsUgxM/a18/Mxc7PIgorCisjOiBzeW50YXguYzo1MzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgzcGkIMLV1Mkg0MXS28nNINLRxMvPzSDVIMbBysymIgorCisjOiBzeW50YXguYzo1NDM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IO7F16bSzsEgzsHa18Egx9LV0Mk6ICVzIgorCisjIG1zZ3N0ciAiRTQwOTogIgorIzogc3ludGF4LmM6NTY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IO7F16bSzsEg0KbEy8/Nwc7EwSA6c3ludGF4IDogJXMiCisKKyMgbXNnc3RyICJFNDEwOiAiCisjOiBzeW50YXguYzo2MDQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiDrz8zYz9IgzsUg2s7BysTFzs86ICVzIgorCisjIG1zZ3N0ciAiRTQxMTogIgorIzogc3ludGF4LmM6NjA2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjog7sXEz9PUwdTO2M8gwdLH1c3FztSm1zogXCJoaWdobGlnaHQgbGluayAlc1wiIgorCisjIG1zZ3N0ciAiRTQxMjogIgorIzogc3ludGF4LmM6NjA3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEzOiBUb28gbWFueSBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTM6IPrBwsHHwdTPIMHSx9XNxc7Uptc6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyMgbXNnc3RyICJFNDEzOiAiCisjOiBzeW50YXguYzo2MDk2Cittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiDrz8ym0iDV1sUg19PUwc7P18zFzs8sIFwiOmhpZ2hsaWdodCBsaW5rXCIg0NLPpsfOz9LP18HOzyIKKworIyBtc2dzdHIgIkU0MTQ6ICIKKyM6IHN5bnRheC5jOjYyMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTog+s7ByyDSptfOz9PUpiDOxSDQz9TSpsLFzjogJXMiCisKKyMgbXNnc3RyICJFNDE1OiAiCisjOiBzeW50YXguYzo2MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6IPfU0sHexc7PINrOwcsg0qbXzs/T1KY6ICVzIgorCisjOiBzeW50YXguYzo2MjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiD31NLB3sXOzyDB0sfVzcXO1DogJXMiCisKKyM6IHN5bnRheC5jOjYzMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IO7F16bSzsUg2s7B3sXOztE6ICVzIgorCisjIG1zZ3N0ciAiRTQxODogIgorIzogc3ludGF4LmM6NjQzOQorbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IO7F16bEz83JyiDLz8ym0iDUxcvT1NUiCisKKyMgbXNnc3RyICJFNDE5OiAiCisjOiBzeW50YXguYzo2NDUwCittc2dpZCAiRTQyMDogQkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQyMDog7sXXpsTPzcnKIMvPzKbSIMbPztUiCisKKyMgbXNnc3RyICJFNDIwOiAiCisjOiBzeW50YXguYzo2NTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTog7sXa0s/a1c2mzMEgzsHa18EgwcLPIM7PzcXSIMvPzNjP0tU6ICVzIgorCisjIG1zZ3N0ciAiRTQyMTogIgorIzogc3ludGF4LmM6NjcxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjog+sHOwcTUzyDEz9fHycogy8/EINTF0s2mzsHM1TogJXMiCisKKyMgbXNnc3RyICJFNDIyOiAiCisjOiBzeW50YXguYzo2NzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiDuxdem0s7JyiDB0sfVzcXO1DogJXMiCisKKyMgbXNnc3RyICJFNDIzOiAiCisjOiBzeW50YXguYzo3Mjk1Cittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDog+sHCwcfB1M8g0qbazsnIIMHU0snC1dQgy8/M2M/S1SIKKworIyBtc2dzdHIgIkU0MjQ6ICIKKyM6IHRhZy5jOjkwCittc2dpZCAiYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAi09TFyyDQz82m1M/LINDP0s/WzqbKIgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgItfF0tvJzsEg09TFy9Ug0M/NptTPyyIKKworIzogdGFnLmM6MzkyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6IO7FIM3P1tUg0MXSxcrUySDEzyDQz9DF0sXEzs/YpyDQz82m1MvJINog0MXS28+nIgorCisjIG1zZ3N0ciAiRTQyNTogIgorIzogdGFnLmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDI2OiDQz82m1MvVICVzIM7FINrOwcrExc7PIgorCisjIG1zZ3N0ciAiRTQyNjogIgorIzogdGFnLmM6NTQ1Cittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgIsbBysxcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAi8cvVINPBzcUg0M/NptTL1SDXycvP0snT1MHUySAoPENSPiDEzNEg16bEzabOySk6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiDsydvFIM/EzsEg16bE0M/XpsTOwSDQz82m1MvBIgorCisjIG1zZ3N0ciAiRTQyNzogIgorIzogdGFnLmM6NzQ4Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODog48Ugz9PUwc7O0SDXpsTQz9emxM7PINDPzabUy8EiCisKKyMgbXNnc3RyICJFNDI4OiAiCisjOiB0YWcuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIubByswgXCIlc1wiIM7FIKbTztWkIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgItDPzabUy8EgJWQg2iAlZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiIMHCzyDCpszY28UiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIPfJy8/SydPUz9fVwCDQz82m1MvVIM7FINLP2tKm2s7RwN7JINfFzMnLpiDUwSDNwcymIMym1MXSySIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiDmwcrMIFwiJXNcIiDOxSCm087VpCIKKworIyBtc2dzdHIgIkU0Mjk6ICIKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6ODk3Cittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIuymzqbKzsnKINDP29XLINDPzabUy8kiCisKKyM6IHRhZy5jOjExNDYKK21zZ2lkICJCaW5hcnkgdGFnIHNlYXJjaCIKK21zZ3N0ciAi5NemysvP18nKINDP29XLINDPzabUy8kiCisKKyM6IHRhZy5jOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAi+9XLwcAgwSDGwcrMpiDQz82m1M/LICVzIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiD7zNHIIMTM0SAlcyDXIMbBysymINDPzabUyyDay8/Sz97Fzs9cbiIKKworIyBtc2dzdHIgIkU0MzA6ICIKKyM6IHRhZy5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IPDPzcnMy8Egxs/SzcHU1SDVIMbBysymINDPzabUz8sgXCIlc1wiIgorCisjIG1zZ3N0ciAiRTQzMTogIgorIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIvDF0sXEIMLBytTPzSAlbGQiCisKKyM6IHRhZy5jOjE4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiDmwcrMINDPzabUz8sgJXMgzsUg19DP0tHEy8/Xwc7JyiIKKworIyBtc2dzdHIgIkU0MzI6ICIKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiDuxc3BpCDGwczBINDPzabUz8siCisKKyMgbXNnc3RyICJFNDMzOiAiCisjOiB0YWcuYzoyNTgzCittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDog7sUgzc/W1SDazsHK1Mkg0M/NptTL1SDawSCnpyDa0sHay8/NIgorCisjIG1zZ3N0ciAiRTQzNDogIgorIzogdGFnLmM6MjU5NAorbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTog7sUgzc/W1SDazsHK1Mkg0M/NptTL1Swg2sTPx8HE1cDT2CEiCisKKyMgbXNnc3RyICJFNDM1OiAiCisjOiB0ZXJtLmM6MTczMworbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyDOxSDXpsTPzcnKLiD3wtXEz9fBzqYg1MXSzabOwczJOiIKKworIzogdGVybS5jOjE3NTcKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgIsLVxMXNzyDX18HWwdTJIN3PIMPFICciCisKKyM6IHRlcm0uYzoyMTEwCittc2dpZCAiQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICLuxSDNz9bVINemxMvSydTJIKbByswgzc/WzMnXz9PUxcog1MXSzabOwcym1yBbdGVybWNhcF0iCisKKyM6IHRlcm0uYzoyMTEzCittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICLuxc3BpCCmzsbP0s3Bw6anINDSzyDUxdLNps7BzCBbdGVybWluZm9dIgorCisjOiB0ZXJtLmM6MjExNQorbXNnaWQgIlRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICLuxc3BpCCmzsbP0s3Bw6anINDSzyDNz9bMydfP09SmINTF0s2mzsHMwSBbdGVybWNhcF0iCisKKyM6IHRlcm0uYzoyMjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiDuxc3BpCCmzsbP0s3Bw6anINDSzyDNz9bMydfP09SmINTF0s2mzsHMwSBcIiVzXCIgW3Rlcm1jYXBdIgorCisjOiB0ZXJtLmM6Mjc0OAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiDNz9bMydem09TYINTF0s2mzsHMwSBcImNtXCIgz8LP1yfR2svP18EiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ4ODgKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOvMwdem26Yg1MXSzabOwczBIC0tLSIKKworIzogdWkuYzoyNDAKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICLSz9rQz97B1M8gzs/Xycogc2hlbGxcbiIKKworIzogdWkuYzoxNzA1Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTog8M/NyczLwSDeydTBzs7RINfXz8TVLCDawdfF0tvVwCDSz8LP1NUuLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozODMKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIvemxM2mzsEgzsUgwtXExSDNz9bMydfBLCDQ0s/Ez9fWydTJIgorCisjOiB1bmRvLmM6NTM4Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogzsXXptLOpiDOz83F0skg0tHEy6bXIFvQz83JzMvBINDSz8fSwc3JXSIKKworIyBtc2dzdHIgIkU0Mzg6ICIKKyM6IHVuZG8uYzo3MDcKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAiz8TOwSDazabOwSIKKworIzogdW5kby5jOjcwOQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAi2s2mzjogJWxkIgorCisjOiB1bmRvLmM6NzUzCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6IPPQydPPyyDXpsTNps7JINDP28vPxNbFzs8gW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjIG1zZ3N0ciAiRTQzOTogIgorIzogdW5kby5jOjc4NQorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiDX1NLB3sXOzyDS0cTPyyDXpsTNps7JIFvQz83JzMvBINDSz8fSwc3JXSIKKworIyBtc2dzdHIgIkU0NDA6ICIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6ODk3Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS06bRIMTM0SAxNi8zMiBiaXQgV2luZG93cyDaINCmxNTSyc3Lz8AgR1VJIgorCisjOiB2ZXJzaW9uLmM6ODk5Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS06bRIMTM0SAzMiBiaXQgV2luZG93cyDaINCmxNTSyc3Lz8AgR1VJIgorCisjOiB2ZXJzaW9uLmM6OTAyCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICIg1yDSxdbJzaYgV2luMzJzIgorCisjOiB2ZXJzaW9uLmM6OTA0Cittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIiDaINCmxNTSyc3Lz8AgT0xFIgorCisjOiB2ZXJzaW9uLmM6OTA3Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SDEzNEgMzIgYml0IFdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzo5MTEKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SDEzNEgMTYgYml0IFdpbmRvd3MiCisKKyM6IHZlcnNpb24uYzo5MTUKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS06bRIMTM0SAzMiBiaXQgTVMtRE9TIgorCisjOiB2ZXJzaW9uLmM6OTE3Cittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SDEzNEgMTYgYml0IE1TLURPUyIKKworIzogdmVyc2lvbi5jOjkyMworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi98XS06bRIMTM0SBNYWNPUyBYICh1bml4KSIKKworIzogdmVyc2lvbi5jOjkyNQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTptEgxMzRIE1hY09TIFgiCisKKyM6IHZlcnNpb24uYzo5MjgKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SDEzNEgTWFjT1MiCisKKyM6IHZlcnNpb24uYzo5MzMKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisi18XS06bRIFJJU0MgT1MiCisKKyM6IHZlcnNpb24uYzo5NDMKK21zZ2lkICIiCisiXG4iCisiSW5jbHVkZWQgcGF0Y2hlczogIgorbXNnc3RyICIiCisiXG4iCisi98vMwN7Fzs8gzMHUy8k6ICIKKworIzogdmVyc2lvbi5jOjk3MAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyL6y8/N0KbM2M/Xwc7PICIKKworIzogdmVyc2lvbi5jOjk3MworbXNnaWQgImJ5ICIKK21zZ3N0ciAiLS0gIgorCisjOiB2ZXJzaW9uLmM6OTg1Cittc2dpZCAiIgorIlxuIgorIkh1Z2UgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTptEgYGh1Z2UnICIKKworIzogdmVyc2lvbi5jOjk4OAorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTptEgYGJpZycgIgorCisjOiB2ZXJzaW9uLmM6OTkxCittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SBgbm9ybWFsJyAiCisKKyM6IHZlcnNpb24uYzo5OTQKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyL3xdLTptEgYHNtYWxsJyAiCisKKyM6IHZlcnNpb24uYzo5OTYKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIvfF0tOm0SBgdGlueScgIgorCisjOiB2ZXJzaW9uLmM6MTAwMgorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAiwsXaINCmxNTSyc3LySBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAwNgorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgItog0KbE1NLJzcvPwCBHVEstR05PTUUgR1VJLiIKKworIzogdmVyc2lvbi5jOjEwMDgKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICLaINCmxNTSyc3Lz8AgR1RLIEdVSS4iCisKKyM6IHZlcnNpb24uYzoxMDEyCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAi2iDQpsTU0snNy8/AIFgxMS1Nb3RpZiBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAxNQorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICLaINCmxNTSyc3Lz8AgWDExLUF0aGVuYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAxOAorbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICLaINCmxNTSyc3Lz8AgQmVPUyBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAyMQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgItog0KbE1NLJzcvPwCBQaG90b24gR1VJLiIKKworIzogdmVyc2lvbi5jOjEwMjQKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgItog0KbE1NLJzcvPwCBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAyNworbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgItog0KbE1NLJzcvPwCBDYXJib24gR1VJLiIKKworIzogdmVyc2lvbi5jOjEwMzAKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgItog0KbE1NLJzcvPwCBDb2NvYSBHVUkuIgorCisjOiB2ZXJzaW9uLmM6MTAzMworbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgItogKMvMwdPJ3s7JzSkgR1VJLiIKKworIzogdmVyc2lvbi5jOjEwNDQKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIiCisiIFxuIgorIu2m09TJ1NggKCspIFvBws8gzsUgzabT1MnU2CAoLSldINTBy6Ygy8/N0M/Oxc7UyTpcbiIKKworIzogdmVyc2lvbi5jOjEwNTYKK21zZ2lkICIgICBzeXN0ZW0gdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgICDTydPUxc3OycogdmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTA2MQorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICB2aW1yYyDLz9LJ09TV18HewTogXCIiCisKKyM6IHZlcnNpb24uYzoxMDY2Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgxNLVx8nKIHZpbXJjIMvP0snT1NXXwd7BOiBcIiIKKworIzogdmVyc2lvbi5jOjEwNzEKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiDU0sXUpsogdmltcmMgy8/SydPU1dfB3sE6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTA3NgorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgZXhyYyDLz9LJ09TV18HewTogXCIiCisKKyM6IHZlcnNpb24uYzoxMDgxCittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgIMTS1cfJyiBleHJjIMvP0snT1NXXwd7BOiBcIiIKKworIzogdmVyc2lvbi5jOjEwODcKK21zZ2lkICIgIHN5c3RlbSBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgINPJ09TFzc7JyiBndmltcmM6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTA5MQorbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgIGd2aW1yYyDLz9LJ09TV18HewTogXCIiCisKKyM6IHZlcnNpb24uYzoxMDk1Cittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICLE0tXHycogZ3ZpbXJjIMvP0snT1NXXwd7BOiBcIiIKKworIzogdmVyc2lvbi5jOjExMDAKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgItTSxdSmyiBndmltcmMgy8/SydPU1dfB3sE6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTEwNworbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAg08nT1MXNzsUgzcXOwDogXCIiCisKKyM6IHZlcnNpb24uYzoxMTE1Cittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgICAgICAg2sHNps7BIMTM0SAkVklNOiBcIiIKKworIzogdmVyc2lvbi5jOjExMjEKK21zZ2lkICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCittc2dzdHIgIiAgINrBzabOwSDEzNEgJFZJTVJVTlRJTUU6IFwiIgorCisjOiB2ZXJzaW9uLmM6MTEyNQorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIvrLz83QpszYz9fBzs86ICIKKworIzogdmVyc2lvbi5jOjExMzEKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICLrz83QpszR1M/SOiAiCisKKyM6IHZlcnNpb24uYzoxMTM2Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICL6y8/N0M/Oz9fBzs86ICIKKworIzogdmVyc2lvbi5jOjExNDEKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIPfl8vO28SDk7PEg7uHs4efv5Pbl7u7xIgorCisjOiB2ZXJzaW9uLmM6MTE3NworbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWaW0gLSDwz8vSwd3FzsnKIFZpIgorCisjOiB2ZXJzaW9uLmM6MTE3OQorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICLXxdLTptE6ICIKKworIzogdmVyc2lvbi5jOjExODAKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIiDB19TP0jogQnJhbSBNb29sZW5hYXIg1MEgps4uIgorCisjOiB2ZXJzaW9uLmM6MTE4MQorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSDDxSDXpsTL0snUwSDQ0s/H0sHNwSwg18kgzc/WxdTFINemzNjOzyDSz9rQz9fTwMTW1dfB1Mkgp6ciCisKKyM6IHZlcnNpb24uYzoxMTgzCittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIuTP0M/Nz9am1Ngg08nSz9TBzSDaIPXHwc7EySEiCisKKyM6IHZlcnNpb24uYzoxMTg0Cittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAiOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgINDPxMHM2NvBIKbOxs/SzcHDptEgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTg2Cittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAiOnE8RW50ZXI+ICAgICAgICAgICAgICAgINfJyKbEINogVmltICAgICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTg3Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAiOmhlbHA8RW50ZXI+IMHCzyA8RjE+ICAgINDF0sXHzNHEIMTP0M/Nz8fJICAgICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTg4Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgIKbOxs/SzcHDptEg0NLPIFZpbSA2ICAgICAiCisKKyM6IHZlcnNpb24uYzoxMTkxCittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIvfJINDSwcPApNTFINcg0sXWyc2mINPVzabTzs/N1SDaIFZpIgorCisjOiB2ZXJzaW9uLmM6MTE5MgorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgIjpzZXQgbm9jcDxFbnRlcj4gICAgICAgICDSxdbJzSDOxdPVzabTzsnKINogVmkgICAgIgorCisjOiB2ZXJzaW9uLmM6MTE5MworbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIjpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+ICCmzsbP0s3Bw6bRINDSzyDT1c2m086m09TYIgorCisjOiB2ZXJzaW9uLmM6MTIwNQorbXNnaWQgIm1lbnUgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIs3FzsAgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgINDPxMHM2NvBIKbOxs/SzcHDptEiCisKKyM6IHZlcnNpb24uYzoxMjA3Cittc2dpZCAiUnVubmluZyBtb2RlbGVzcywgdHlwZWQgdGV4dCBpcyBpbnNlcnRlZCIKK21zZ3N0ciAi8NLBw8Ckzc8gwsXaINLF1snNptcsINTFy9PUIN3PIM7BwtLBzs8g19PUwdfM0aTU2NPRIgorCisjOiB2ZXJzaW9uLmM6MTIwOAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCittc2dzdHIgIs3FzsAgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiCisKKyM6IHZlcnNpb24uYzoxMjA5Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgxMzRIMTXz8gg0sXWyc2m1yAgICIKKworIzogdmVyc2lvbi5jOjEyMTMKK21zZ2lkICJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIgorbXNnc3RyICLNxc7AICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIgorCisjOiB2ZXJzaW9uLmM6MTIxNAorIywgZnV6enkKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVmltIGRlZmF1bHRzICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDEzNEgVmltIGRlZmF1bHRzICAgIgorCisjOiB2ZXJzaW9uLmM6MTI2MAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIvX34efhOiD3ySDLz9LJ09TVpNTF09EgV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjEyNjMKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICI6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICAgps7Gz9LNwcOm0SDQ0s8gw8UgICAgICAgICIKKworIzogd2luZG93LmM6MjAxCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IPemy87PINDF0sXHzNHE1SDXpsTT1dTOpCIKKworIyBtc2dzdHIgIkU0NDE6ICIKKyM6IHdpbmRvdy5jOjU4MAorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6IO7FIM3P1tUg0s/azabT1MnUySDXpsvOzyDPxM7P3sHTzs8g1yDPws/IIMvV1MHIIgorCisjIG1zZ3N0ciAiRTQ0MjogIgorIzogd2luZG93LmM6MTMzOQorbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0Mzog7sUgzc/W1SDazabT1MnUySDXpsvOzyAtLSCmztumINemy87BINrB18HWwcDU2CIKKworIyBtc2dzdHIgIkU0NDM6ICIKKyM6IHdpbmRvdy5jOjE4MzcKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IO7FIM3P1tUg2sHL0snUySDP09TBzs6kINemy87PIgorCisjIG1zZ3N0ciAiRTQ0NDogIgorIzogd2luZG93LmM6MjUwMQorbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICLsydvFIM/EzsUg16bLzs8iCisKKyM6IHdpbmRvdy5jOjI1NDgKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogts7bpiDXpsvOwSDNptPU0dTYINrNps7JIgorCisjIG1zZ3N0ciAiRTQ0NTogIgorIzogd2luZG93LmM6NDM3NQorbXNnaWQgIkU0NDY6IE5vIGZpbGUgbmFtZSB1bmRlciBjdXJzb3IiCittc2dzdHIgIkU0NDY6IPfJIM7FINPUz6fUxSDOwSCmzcXOpiDGwcrMwSIKKworIyBtc2dzdHIgIkU0NDY6ICIKKyM6IHdpbmRvdy5jOjQ0OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiDmwcrMIFwiJXNcIiDOxSDazsHKxMXOzyDVICdwYXRoJyIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIvLFxMHH1dfB1MkgKCZtKdKm2s7JzckgVmltIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjU5MgorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAi8sXEwcfV18HUySDPxM7JzSAoJlYpaW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjA0Cittc2dpZCAiRWRpdCB3aXRoICZWaW0iCittc2dzdHIgIvLFxMHH1dfB1Mkg2sEgxM/Uz83Px8/AICZWaW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIvLFxMHH1dfB1MkgKCZlKabTztXA3snNIFZpbSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo3NTIKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAi8sXEwcfV18HUySDXycLSwc6mIMbByszJINrBIMTP0M/Nz8fPwCBWaW0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkxIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY5Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICLwz83JzMvBINPU18/Sxc7O0SDQ0s/DxdPVLCDQxdLF16bS1MUg3skgZ3ZpbSCkIM7BINvM0cjVINDP29XL1SEiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkyIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA2CisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk3MAorbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICLQz83JzMvBIGd2aW1leHQuZGxsIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNQorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAi+8zRyCDawc7BxM7PIMTP18fJyiEiCisKKyMgbXNnc3RyICJFNDQ3OiAiCisjOiBnbG9iYWxzLmg6ODg3Cittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS32z8TOz8fPINLRxMvBLS0iCisKKyMuCisjLiAqIFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBzaGFyZWQgYXJlIGluY2x1ZGVkIGhlcmUuCisjLiAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyMuCisjOiBnbG9iYWxzLmg6MTAyOAorbXNnaWQgIkNvbW1hbmQgYWJvcnRlZCIKK21zZ3N0ciAi68/Nwc7E1SDawdfF0tvFzs8iCisKKyM6IGdsb2JhbHMuaDoxMDI5Cittc2dpZCAiQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIu7Fz8LIpsTOzyDXy8HawdTJIMHSx9XNxc7UIgorCisjOiBnbG9iYWxzLmg6MTAzMAorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiD6wSBcXCDNwaQgytTJIC8sID8gwcLPICYiCisKKyMgbXNnc3RyICJFMTA6ICIKKyM6IGdsb2JhbHMuaDoxMDMyCittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiDuxdDSydDV09TJzc8g1yDXpsvOpiDLz83BzsQsIDxDUj4g18nLz87VpCwgQ1RSTC1DINfJyM/EydTYIgorCisjOiBnbG9iYWxzLmg6MTAzNAorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiRTEyOiDrz83BzsTBIM7FIMTP2tfPzMXOwSDaIM2m0svV18HO2CDCxdrQxcvJIgorCisjOiBnbG9iYWxzLmg6MTAzNQorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiDmwcrMIKbTztWkICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGdsb2JhbHMuaDoxMDM2Cittc2dpZCAiQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIuvPzcHOxMEgzsEg18TBzMHT2CIKKworIzogZ2xvYmFscy5oOjEwMzcKK21zZ2lkICJJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAi987V1NKm287RINDPzcnMy8EiCisKKyM6IGdsb2JhbHMuaDoxMDM4Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIvDF0sXS18HOzyIKKworIzogZ2xvYmFscy5oOjEwMzkKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiDuxdem0s7BIMHE0sXTwSIKKworIyBtc2dzdHIgIkUxNDogIgorIzogZ2xvYmFscy5oOjEwNDAKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICLuxdem0s7JyiDB0sfVzcXO1CIKKworIzogZ2xvYmFscy5oOjEwNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIu7F16bSzsnKIMHSx9XNxc7UICVzIgorCisjOiBnbG9iYWxzLmg6MTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTog7sXXptLOycog18nSwdo6ICVzIgorCisjIG1zZ3N0ciAiRTE1OiAiCisjOiBnbG9iYWxzLmg6MTA0NQorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiDuxdem0s6mIM3F1qYiCisKKyMgbXNnc3RyICJFMTY6ICIKKyM6IGdsb2JhbHMuaDoxMDQ2Cittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICLuxdem0s7BIMvPzcHOxMEiCisKKyM6IGdsb2JhbHMuaDoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDDxSDEydLFy9TP0qbRIgorCisjIG1zZ3N0ciAiRTE3OiAiCisjOiBnbG9iYWxzLmg6MTA1MQorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODog7sVj0M/EptfBzsnKINPJzdfPzCDQxdLFxCAnPSciCisKKyMgbXNnc3RyICJFMTg6ICIKKyM6IGdsb2JhbHMuaDoxMDUzCittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IPDPzabUy9Ug18vB2sHOzyDaIM7Fzc/WzMnXyc0gzs/NxdLPzSDS0cTLwSIKKworIyBtc2dzdHIgIkUxOTogIgorIzogZ2xvYmFscy5oOjEwNTQKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiDwz82m1MvVIM7FINfLwdrBzs8iCisKKyMgbXNnc3RyICJFMjA6ICIKKyM6IGdsb2JhbHMuaDoxMDU1Cittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IPrNps7JIM7FIMTP2tfPzMXOpjogJ21vZGlmaWFibGUnINfJzcvO1dTPIgorCisjIG1zZ3N0ciAiRTIxOiAiCisjOiBnbG9iYWxzLmg6MTA1NgorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjog+sHOwcTUzyDXxczJy8Egy6bM2Mum09TYINfLzMHExc7JyCDLz83BzsTOycggxsHKzKbXIgorCisjIG1zZ3N0ciAiRTIyOiAiCisjOiBnbG9iYWxzLmg6MTA1NworbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzog7sXNwaQg19TP0snOzs/HzyDGwcrMwSIKKworIyBtc2dzdHIgIkUyMzogIgorIzogZ2xvYmFscy5oOjEwNTgKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IPTBy8/HzyDTy8/Sz97Fzs7RIM7FzcGkIgorCisjIG1zZ3N0ciAiRTI0OiAiCisjOiBnbG9iYWxzLmg6MTA1OQorbXNnaWQgIk5vICEgYWxsb3dlZCIKK21zZ3N0ciAi68/SydPU1dfB1MHUydPRICEgzsUgxM/a18/Mxc7PIgorCisjOiBnbG9iYWxzLmg6MTA2MQorbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTogR1VJIM7FIM3P1sUgwtXUySDXycvP0snT1MHOzyAtLSDOxSDX16bNy87Fzs8g0KbEIN7B0yDLz83QpszRw6anIgorCisjOiBnbG9iYWxzLmg6MTA2NAorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiIgorIkUyNTogSGVicmV3IM7FIM3P1sUgwtXUySDXycvP0snT1MHOzyAtLSDOxSDX16bNy87Fzs8g0KbEIN7B0yDLz83QpszRw6anXG4iCisKKyM6IGdsb2JhbHMuaDoxMDY3Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIiIKKyJFMjU6IEZhcnNpIM7FIM3P1sUgwtXUySDXycvP0snT1MHOzyAtLSDOxSDX16bNy87Fzs8g0KbEIN7B0yDLz83QpszRw6anXG4iCisKKyMgbXNnc3RyICJFMjU6ICIKKyM6IGdsb2JhbHMuaDoxMDcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkUyODog68/M2M/SICVzIM7FIKbTztWkIgorCisjIG1zZ3N0ciAiRTI4OiAiCisjOiBnbG9iYWxzLmg6MTA3MgorbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTog9MXL09Qgw8UgzsUg0sXEwcfV18HX09EiCisKKyMgbXNnc3RyICJFMjk6ICIKKyM6IGdsb2JhbHMuaDoxMDczCittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDog68/Nwc7EySDdxSDOxSDXycvP0snT1M/X1dfBzMnT0SIKKworIyBtc2dzdHIgIkUzMDogIgorIzogZ2xvYmFscy5oOjEwNzQKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAi98vB2sHOpiDawc2mzsEgzsUgptPO1aQiCisKKyMgbXNnc3RyICJFMzE6ICIKKyM6IGdsb2JhbHMuaDoxMDc1Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgIvbPxM7Px88g18HSpsHO1NUiCisKKyM6IGdsb2JhbHMuaDoxMDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoOiAlcyIKK21zZ3N0ciAi9s/Ezs/HzyDXwdKmwc7U1TogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc3Cittc2dpZCAiRTMyOiBObyBmaWxlIG5hbWUiCittc2dzdHIgIuLSwcvVpCCmzcXOpiDGwcrMwSIKKworIyBtc2dzdHIgIkUzMjogIgorIzogZ2xvYmFscy5oOjEwNzgKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICL6wc2mzsEg2tLB2sum1yDbxSDOxSDXycvP0snT1M/X1dfBzMHT2CIKKworIyBtc2dzdHIgIkUzMzogIgorIzogZ2xvYmFscy5oOjEwNzkKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIuvPzcHOxMkg3cUgzsUg18nLz9LJ09TP19XXwczJ09EiCisKKyMgbXNnc3RyICJFMzQ6ICIKKyM6IGdsb2JhbHMuaDoxMDgwCittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIvrSwdrLySDdxSDOxSDXycvP0snT1M/X1dfBzMnT0SIKKworIyBtc2dzdHIgIkUzNTogIgorIzogZ2xvYmFscy5oOjEwODEKK21zZ2lkICJObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICLuxSDEz9rXz8zFzs8g18vB2tXXwdTJIM3F1qYiCisKKyM6IGdsb2JhbHMuaDoxMDgzCittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIu7FIMTP08nU2CDNptPD0SIKKworIyBtc2dzdHIgIkUzNjogIgorIzogZ2xvYmFscy5oOjEwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIu7FIM3P1tUg09TXz9LJ1MkgxsHKzCAlcyIKKworIzogZ2xvYmFscy5oOjEwODYKK21zZ2lkICJDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIu7FIM3P1tUg2sbP0s3V18HUySCmzSfRIMTM0SDUyc3ewdPP18/HzyDGwcrMwSIKKworIzogZ2xvYmFscy5oOjEwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICLuxSDNz9bVINemxMvSydTJIMbByswgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAi7sUgzc/W1SDa3snUwdTJIMbByswgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiRTM3OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICIiCisiRTM3OiD2z8TOz8fPINrB0MnT1SDQptPM0SDP09TBzs7Yz6cg2s2mzskgKNfJy8/SydPUwcrUxSAhIN3PwiDOxSDa18HWwdTJKSIKKworIzogZ2xvYmFscy5oOjEwOTAKK21zZ2lkICJFMzg6IE51bGwgYXJndW1lbnQiCittc2dzdHIgIkUzODog96bE09XUzqbKIMHSx9XNxc7UIgorCisjOiBnbG9iYWxzLmg6MTA5MgorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IO/epsvV18HOzyDeydPMzyIKKworIzogZ2xvYmFscy5oOjEwOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiDuxSDNz9bVINemxMvSydTJIMbByswg0M/NyczPyyAlcyIKKworIzogZ2xvYmFscy5oOjEwOTgKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6IPrBwtLBy8zPINDBzSfR1KYhIgorCisjOiBnbG9iYWxzLmg6MTEwMQorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICL60sHaz8sgzsUg2s7BysTFzs8iCisKKyM6IGdsb2JhbHMuaDoxMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAi+tLB2s/LIM7FINrOwcrExc7POiAlcyIKKworIzogZ2xvYmFscy5oOjExMDQKK21zZ2lkICJBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICLh0sfVzcXO1CDNwaQgwtXUySDEz8TB1M6myiIKKworIzogZ2xvYmFscy5oOjExMDYKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiD2z8TOz6cg0M/NyczLySIKKworIzogZ2xvYmFscy5oOjExMDgKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6ICdtYXRjaCBzdHJpbmcnINDP28vP1sXOwSBb0M/NyczLwSDQ0s/H0sHNyV0iCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDog89DP1NfP0sXOwSDQ0s/H0sHNwSByZWdleHAgW9DPzcnMy8Eg0NLPx9LBzcldIgorCisjOiBnbG9iYWxzLmg6MTExMAorbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTog98nT1MHXzMXOwSDP0MOm0SAncmVhZG9ubHknICjXycvP0snT1MHK1MUgISDdz8IgzsUg2tfB1sHUySkiCisKKyM6IGdsb2JhbHMuaDoxMTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IPrNps7OwSBcIiVzXCIgzc/WxSDC1dTJIMzJ28Ug0NLP3snUwc7BIgorCisjOiBnbG9iYWxzLmg6MTExNQorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0Nzog8M/NyczLwSDa3snU1dfBzs7RIMbByszBINDPzcnMz8siCisKKyM6IGdsb2JhbHMuaDoxMTE4Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IO7BIMTP2tfPzMXOzyDVICoqKioqKioiCisKKyM6IGdsb2JhbHMuaDoxMTIwCittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6IO7Fzc/WzMnXycog0s/azabSINrT1dfVIgorCisjOiBnbG9iYWxzLmg6MTEyMQorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogz9DDptEgJ3NoZWxsJyDQz9LP1s7RIgorCisjOiBnbG9iYWxzLmg6MTEyMgorbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IPDPzcnMy8Eg0KbEIN7B0yDawcvSydTU0SDGwcrMwSDPws2mztUiCisKKyM6IGdsb2JhbHMuaDoxMTIzCittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3Mzog89TFyyDUz82m1M/LINPQ1dPUz9vFzs8iCisKKyM6IGdsb2JhbHMuaDoxMTI0Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IPrBzsHE1M8g08vMwcTOwSDLz83BzsTBIgorCisjOiBnbG9iYWxzLmg6MTEyNQorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiD6wcTP18fFIKbNJ9EiCisKKyM6IGdsb2JhbHMuaDoxMTI2Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IPrBwsHHwdTPICdbJyIKKworIzogZ2xvYmFscy5oOjExMjcKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3Nzog+sHCwcfB1M8gps3FziDGwcrMptciCisKKyM6IGdsb2JhbHMuaDoxMTI4Cittc2dpZCAiVHJhaWxpbmcgY2hhcmFjdGVycyIKK21zZ3N0ciAi7sHEzMnby8/XpiDTyc3Xz8zJIgorCisjOiBnbG9iYWxzLmg6MTEyOQorbXNnaWQgIkU3ODogVW5rbm93biBtYXJrIgorbXNnc3RyICJFNzg6IO7F16bEz83BINDPzabUy8EiCisKKyM6IGdsb2JhbHMuaDoxMTMwCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiDuxSDNz9bVINrSz9rVzabUySDa0sHaz8siCisKKyMgbXNnc3RyICJFNzk6ICIKKyM6IGdsb2JhbHMuaDoxMTMxCittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IPDPzcnMy8Eg0KbEIN7B0yDawdDJ09UiCisKKyM6IGdsb2JhbHMuaDoxMTMyCittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAi7tXM2M/XycogzKbeyczYzsnLIgorCisjOiBnbG9iYWxzLmg6MTEzNAorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogPFNJRD4g18nLz9LJ09TP19Wk1NjT0SDOxSDVIMbBysymIMvPzcHOxCIKKworI34gbXNnaWQgIjEgbGluZSB+ZWQiCisjfiBtc2dzdHIgIvLRxM/LIKbO18XS1M/Xwc7PIgorCisjfiBtc2dpZCAiJWxkIGxpbmVzIH5lZCIKKyN+IG1zZ3N0ciAits7XxdLUz9fBzs8g0tHEy6bXOiAlbGQiCisKKyN+IG1zZ2lkICJVbmFibGUgdG8gc2VuZCByZXBseSIKKyN+IG1zZ3N0ciAi7sUgzc/W1SDXpsSm08zB1Mkg16bE0M/XpsTYIgorCisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gIlNlbmQgZmFpbGVkLiBObyBjb21tYW5kIHNlcnZlciBwcmVzZW50ID9cbiIKKyN+IG1zZ3N0ciAiIgorI34gIlxuIgorI34gIu7FINfEwczP09Eg16bEptPMwdTJIMTBzqYuIO3P1szJ188sINPF0tfF0iDLz83BzsQg16bE09XUzqbKID9cbiIKKworI34gbXNnaWQgIkUyNTg6IG5vIG1hdGNoZXMgZm91bmQgaW4gY3Njb3BlIGNvbm5lY3Rpb25zIgorI34gbXNnc3RyICJFMjU4OiDOxSDazsHKxMXOzyDXpsTQz9emxM7Px88g2iekxM7Bzs7RINogY3Njb3BlIgpkaWZmIC0tZ2l0IGEvc3JjL3BvL3poX0NOLlVURi04LnBvIGIvc3JjL3BvL3poX0NOLlVURi04LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmE4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vemhfQ04uVVRGLTgucG8KQEAgLTAsMCArMSw1OTM3IEBACisjIENoaW5lc2UgKHNpbXBsaWZpZWQpIFRyYW5zbGF0aW9uIGZvciBWaW0KKyMKKyMgRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisjIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorIworIyBGSVJTVCBBVVRIT1IgIFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPgorIworIyBPcmlnaW5hbCB0cmFuc2xhdGlvbnMuCisjCisjLCBuby13cmFwCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0oU2ltcGxpZmllZCBDaGluZXNlKVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAxLTA5LTI0IDEwOjEwKzA4MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAxLTA5LTI0IDExOjEzKzA4MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPlxuIgorIkxhbmd1YWdlLVRlYW06IFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOC1iaXRcbiIKKworIzogYnVmZmVyLmM6OTcKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6IOS4jeiDveWIhumFjeS7u+S9lee8k+WGsuWMuu+8jOmAgOWHuueoi+W6jy4uLiIKKworIzogYnVmZmVyLmM6MTAwCittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4Mzog5LiN6IO95YiG6YWN57yT5Yay5Yy677yM5L2/55So5Y+m5LiA5Liq57yT5Yay5Yy6Li4uLiIKKworIzogYnVmZmVyLmM6Njk4Cittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICLmsqHmnInph4rmlL7ku7vkvZXnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjcwMAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICLmsqHmnInliKDpmaTku7vkvZXnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjcwMgorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiCittc2dzdHIgIuayoeacieWIoOmZpOS7u+S9lee8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6NzEwCittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIuW3sumHiuaUvuS4gOS4que8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6NzEyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgIuW3sumHiuaUviAlZCDkuKrnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjcxNworbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIuW3suWIoOmZpOS4gOS4que8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6NzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAi5bey5Yig6ZmkICVkIOS4que8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6NzI0Cittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICLlt7LliKDpmaTkuIDkuKrnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjcyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAi5bey5Yig6ZmkICVkIOS4que8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6NzgzCittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDog5rKh5pyJ5L+u5pS56L+H55qE57yT5Yay5Yy6IgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6ODIyCittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IOayoeacieWPr+WIl+WHuueahOe8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU4NjogQ2Fubm90IGdvIHRvIGJ1ZmZlciAlbGQiCittc2dzdHIgIkU4Njog5LiN6IO95YiH5o2i5Yiw56ysICVsZCDkuKrnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjgzNworbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiDkuI3og73liIfmjaLliLDmm7TlkI7pnaLnmoTnvJPlhrLljLoiCisKKyM6IGJ1ZmZlci5jOjgzOQorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODog5LiN6IO95YiH5o2i5Yiw5pu05YmN6Z2i55qE57yT5Yay5Yy6IgorCisjOiBidWZmZXIuYzo4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6IOW3suabtOaUuei/h+e8k+WGsuWMuiAlbGQg5L2G5bCa5pyq5L+d5a2YICjlj6/nlKggISDlvLrliLbmiafooYwpIgorCisjOiBidWZmZXIuYzo4NzkKK21zZ2lkICJFOTA6IENhbm5vdCB1bmxvYWQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU5MDog5LiN6IO96YeK5pS+5pyA5ZCO5LiA5Liq57yT5Yay5Yy6IgorCisjOiBidWZmZXIuYzoxMzE0Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDog6K2m5ZGKOiDmlofku7blkI3ov4flpJoiCisKKyM6IGJ1ZmZlci5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiDmib7kuI3liLDnrKwgJWxkIOS4que8k+WGsuWMuiIKKworIzogYnVmZmVyLmM6MTcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJFOTM6IE1vcmUgdGhhbiBvbmUgbWF0Y2ggZm9yICVzIgorbXNnc3RyICJFOTM6IOaJvuWIsOS4gOS4quS7peS4iueahCAlcyIKKworIzogYnVmZmVyLmM6MTcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDog5om+5LiN5YiwICVzIgorCisjOiBidWZmZXIuYzoyMTA1IGV4X2RvY21kLmM6NjA2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAi6KGMICVsZCIKKworIzogYnVmZmVyLmM6MjE4OAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6IOW3suaciee8k+WGsuWMuuS9v+eUqOi/meS4quWQjeWtlyIKKworIzogYnVmZmVyLmM6MjQ4MQorbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW+W3suS/ruaUuV0iCisKKyM6IGJ1ZmZlci5jOjI0ODYKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIlvmnKrnvJbovpFdIgorCisjOiBidWZmZXIuYzoyNDkxCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW+aWsOaWh+S7tl0iCisKKyM6IGJ1ZmZlci5jOjI0OTIKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJb6K+76ZSZ6K+vXSIKKworIzogYnVmZmVyLmM6MjQ5NCBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW+WPquivu10iCisKKyM6IGJ1ZmZlci5jOjI1MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICLooYzmlbAgMSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgIuihjOaVsCAlbGQgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgIuihjCAlbGQvJWxkIC0tJWQlJS0tIOWIlyAiCisKKyM6IGJ1ZmZlci5jOjI2MDYKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIlvmnKrlkb3lkI1dIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI2NDYKK21zZ2lkICJoZWxwIgorbXNnc3RyICJb5biu5YqpXSIKKworIzogYnVmZmVyLmM6MzE1MSBzY3JlZW4uYzo0NjU3Cittc2dpZCAiW2hlbHBdIgorbXNnc3RyICJb5biu5YqpXSIKKworIzogYnVmZmVyLmM6MzE4MyBzY3JlZW4uYzo0NjYzCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJb6aKE6KeIXSIKKworIzogYnVmZmVyLmM6MzM4OQorbXNnaWQgIkFsbCIKK21zZ3N0ciAi5YWo6YOoIgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQm90IgorbXNnc3RyICLlupXnq68iCisKKyM6IGJ1ZmZlci5jOjMzOTEKK21zZ2lkICJUb3AiCittc2dzdHIgIumhtuerryIKKworIzogYnVmZmVyLmM6NDEyNworbXNnaWQgIiIKKyJcbiIKKyIjIEJ1ZmZlciBsaXN0OlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDnvJPlhrLljLrliJfooag6XG4iCisKKyM6IGJ1ZmZlci5jOjQxNjAKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIlvplJnor6/liJfooahdIgorCisjOiBidWZmZXIuYzo0MTczIG1lbWxpbmUuYzoxNTEzCittc2dpZCAiW05vIEZpbGVdIgorbXNnc3RyICJb5pyq5ZG95ZCNXSIKKworIzogYnVmZmVyLmM6NDM5MworbXNnaWQgIiIKKyJcbiIKKyItLS0gU2lnbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOespuWPtyAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiJXMg55qE56ym5Y+3OiIKKworIzogYnVmZmVyLmM6NDQwOQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAg6KGMPSVsZCAgaWQ9JWQgIOWQjeensD0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5Njog5LiN6IO95q+U6L6DKGRpZmYpICVsZOS4quS7peS4iueahOe8k+WGsuWMuiIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiDkuI3og73liJvlu7ogZGlmZiAiCisKKyM6IGRpZmYuYzo3NDcKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJQYXRjaCDmlofku7YiCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IOS4jeiDveivu+WPliBkaWZmIOeahOi+k+WHuiIKKworIzogZGlmZi5jOjE3MDQKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTog55uu5YmN55qE57yT5Yay5Yy65LiN5piv5ZyoIGRpZmYg5qih5byPIgorCisjOiBkaWZmLmM6MTcxNgorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IOayoeaciee8k+WGsuWMuuWcqCBkaWZmIOaooeW8jyIKKworIzogZGlmZi5jOjE3MjQKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IOacieS4pOS4quS7peS4iueahOe8k+WGsuWMuuWcqCBkaWZmIOaooeW8j++8jOS4jeiDveWGs+WumuimgeeUqOWTquS4gOS4qiIKKworIzogZGlmZi5jOjE3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiDmib7kuI3liLDnvJPlhrLljLo6IFwiJXNcIiIKKworIzogZGlmZi5jOjE3NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiDnvJPlhrLljLogXCIlc1wiIOS4jeaYr+WcqCBkaWZmIOaooeW8jyIKKworIzogZGlncmFwaC5jOjIxNjgKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDog5aSN5ZCI5a2X56ymKGRpZ3JhcGgp5Lit5LiN6IO95L2/55SoIEVzY2FwZSIKKworIzogZGlncmFwaC5jOjIzNDAKK21zZ2lkICJLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIuaJvuS4jeWIsCBrZXltYXAg5paH5Lu2IgorCisjOiBkaWdyYXBoLmM6MjM2NworbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTog5L2/55SoIDpsb2Fka2V5bWFwICIKKworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIg5YWz6ZSu5a2X6Ieq5Yqo5a6M5oiQICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIOaooeW8jyAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXk4vXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIg5Yy65Z+f5YWz6ZSu5a2X6Ieq5Yqo5a6M5oiQICheTi9eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5ML15OL15QKSIKK21zZ3N0ciAiIOaVtOihjOiHquWKqOWujOaIkCAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIOaWh+S7tuWQjeiHquWKqOWujOaIkCAoXkYvXk4vXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiIOagh+etvuiHquWKqOWujOaIkCAoXl0vXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIOi3r+W+hOiHquWKqOWujOaIkCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiDlrprkuYnoh6rliqjlrozmiJAgKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIg5a2X5YW46Ieq5Yqo5a6M5oiQICheSy9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlQvXk4vXlApIgorbXNnc3RyICIgVGhlc2F1cnVzIOiHquWKqOWujOaIkCAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIOWRveS7pOiHquWKqOWujOaIkCAoXlYvXk4vXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAi5bey5Yiw5q616JC957uT5bC+IgorCisjOiBlZGl0LmM6ODk0Cittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICLpgInpobkgJ3RoZXNhdXJ1cycg5pyq6K6+5a6aIgorCisjOiBlZGl0LmM6MTA3MAorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIumAiemhuSAnZGljdGlvbmFyeScg5Li656m6IgorCisjOiBlZGl0LmM6MTk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBkaWN0aW9uYXJ5OiAlcyIKK21zZ3N0ciAi5omr5o+P5a2X5YW4OiAlcyIKKworIzogZWRpdC5jOjIxODMKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAo5o+S5YWlKSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjIxODUKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKOabv+aNoikgU2Nyb2xsICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAi5omr5o+P5LitOiAlcyIKKworIzogZWRpdC5jOjI1MzEKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAi5omr5o+P5qCH562+LiIKKworIzogZWRpdC5jOjMxODkKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIg5aKe5YqgIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjMyMzgKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIOaQnOWvu+S4rS4uLiIKKworIzogZWRpdC5jOjMyOTQKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICLlm57liLDotbfngrkiCisKKyM6IGVkaXQuYzozMjk5Cittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIuS7juWFtuWug+ihjOW8gOWni+eahOivjSAoPykiCisKKyM6IGVkaXQuYzozMzA0Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgIuWPquacieatpOmhueWMuemFjSIKKworIzogZWRpdC5jOjMzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIuaJvuWIsCAlZCAvICVkIgorCisjOiBlZGl0LmM6MzM2NgorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAi5Yy56YWNICVkIgorCisjOiBldmFsLmM6Njk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDY6IFVua25vd24gdmFyaWFibGU6IFwiJXNcIiIKK21zZ3N0ciAiRTEwNjog5pyq5a6a5LmJ55qE5Y+Y6YePOiBcIiVzXCIiCisKKyM6IGV2YWwuYzo5NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiDnvLrlsJHlr7nlupTnmoTmi6zlj7c6ICVzIgorCisjOiBldmFsLmM6MTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IOaXoOatpOWPmOmHjzogXCIlc1wiIgorCisjOiBldmFsLmM6MTI4NAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogJz8nIOWQjue8uuWwkSAnOiciCisKKyM6IGV2YWwuYzoxODk4Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IOe8uuWwkeWvueW6lOeahCBcIilcIiIKKworIzogZXZhbC5jOjE5NDgKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTog57y65bCR5a+55bqU55qEIFwiXVwiIgorCisjOiBldmFsLmM6MjAyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjog57y65bCR6YCJ6aG55ZCN56ewOiAlcyIKKworIzogZXZhbC5jOjIwNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiDkuI3mraPnoa7nmoTpgInpobk6ICVzIgorCisjOiBldmFsLmM6MjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDog57y65bCR5byV5Y+3OiAlcyIKKworIzogZXZhbC5jOjIyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IOe8uuWwkeW8leWPtzogJXMiCisKKyM6IGV2YWwuYzoyNTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjog5Ye95pWwICVzIOeahOWPguaVsOS4jeato+ehriIKKworIzogZXZhbC5jOjI1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IOacquWumuS5ieeahOWHveaVsDogJXMiCisKKyM6IGV2YWwuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiDlh73mlbAgJXMg55qE5Y+C5pWw6L+H5aSaIgorCisjOiBldmFsLmM6MjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiDlh73mlbAgJXMg55qE5Y+C5pWw5aSq5bCRIgorCisjOiBldmFsLmM6MjU0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IDxTSUQ+IOS4jeiDveWcqCBzY3JpcHQg5LiK5LiL5paH5aSW5L2/55SoOiAlcyIKKworIzogZXZhbC5jOjM1NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0lcyUzbGQgbGluZXM6ICIKK21zZ3N0ciAiKy0lcyUzbGQg6KGMOiAiCisKKyM6IGV2YWwuYzo0Njg5Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyLnoa7lrpooJk8pXG4iCisi5Y+W5raIKCZDKSIKKworIzogZXZhbC5jOjU1MTEKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IOayoeacieS4jiBWaW0gU2VydmVyIOWIm+W7uui/nuaOpSIKKworIzogZXZhbC5jOjU2MDEKK21zZ2lkICJFMjc3OiBVbmFibGUgdG8gcmVhZCBhIHNlcnZlciByZXBseSIKK21zZ3N0ciAiRTI3Nzog5LiN6IO96K+75Y+W5pyN5Yqh5Zmo55qE5ZON5bqUIgorCisjOiBldmFsLmM6NTYyNgorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODog5LiN6IO95Lyg6YCB5Yiw5a6i5oi356uvIgorCisjOiBldmFsLmM6NTY2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTog5LiN6IO95Lyg6YCB5YiwICVzIgorCisjOiBldmFsLmM6NTc2MworbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKOaXoOaViCkiCisKKyM6IGV2YWwuYzo2NzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IOWPmOmHjyAlcyDlsJrmnKrlrprkuYkiCisKKyM6IGV2YWwuYzo3NDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTIyOiDlh73mlbAgJXMg5bey57uP5a2Y5ZyoLCDor7fkvb/nlKggISDlvLrliLbmm7/mjaIiCisKKyM6IGV2YWwuYzo3NTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IOWHveaVsCAlcyDlsJrmnKrlrprkuYkiCisKKyM6IGV2YWwuYzo3NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDog57y65bCRIFwiKFwiOiAlcyIKKworIzogZXZhbC5jOjc1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IOWPguaVsOS4jeato+ehrjogJXMiCisKKyM6IGV2YWwuYzo3NjM3Cittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IOe8uuWwkSA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo3NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiDlh73mlbAgJXMg5q2j5Zyo5L2/55So5Lit77yM5LiN6IO96YeN5paw5a6a5LmJIgorCisjOiBldmFsLmM6Nzc3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiDlh73mlbDlkI3np7DnrKzkuIDkuKrlrZfmr43lv4XpobvlpKflhpk6ICVzIgorCisjOiBldmFsLmM6Nzc3OQorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IOmcgOimgeWHveaVsOWQjeensCIKKworIzogZXZhbC5jOjc4NzIKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgIuWHveaVsCAiCisKKyM6IGV2YWwuYzo3OTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6IOWHveaVsCAlcyDlsJrmnKrlrprkuYkiCisKKyM6IGV2YWwuYzo3OTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMTog5Ye95pWwICVzIOato+WcqOS9v+eUqOS4re+8jOS4jeiDveWIoOmZpCIKKworIzogZXZhbC5jOjgwMzkKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiDlh73mlbDpgJLlvZLosIPnlKjlsYLmlbDotoXov4cgJ21heGZ1bmNkZXB0aCciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjgwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FsbGluZyAlcyIKK21zZ3N0ciAi6LCD55SoICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MTE1IGV4X2NtZHMyLmM6MTk3MworIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICLnu6fnu606ICVzIgorCisjOiBldmFsLmM6ODE2OQorbXNnaWQgIkUxMzM6IDpyZXR1cm4gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTMzOiA6cmV0dXJuIOW/hemhu+WcqOWHveaVsOmHjOS9v+eUqCIKKworIzogZXZhbC5jOjgyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIOi/lOWbnuWAvCAjJWxkICIKKworIzogZXZhbC5jOjgyNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMg6L+U5Zue5YC8IFwiJXNcIiIKKworIzogZXZhbC5jOjgzOTEKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDlhajlsYDlj5jph486XG4iCisKKyM6IGV4X2NtZHMyLmM6NzAKK21zZ2lkICJFbnRlcmluZyBEZWJ1ZyBtb2RlLiAgVHlwZSBcImNvbnRcIiB0byBsZWF2ZS4iCittc2dzdHIgIui/m+WFpeiwg+ivleaooeW8jy4g6L6T5YWlIFwiY29udFwiIOS7peWbnuWIsOato+W4uOaooeW8jy4iCisKKyM6IGV4X2NtZHMyLmM6NzQgZXhfZG9jbWQuYzo3NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6ICVzIgorbXNnc3RyICLooYwgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJjbWQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJcIiVzJXNcIiDkuK3mlq3ngrk6IOesrCAlbGQg6KGMIgorCisjOiBleF9jbWRzMi5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYxOiBCcmVha3BvaW50IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUxNjE6IOaJvuS4jeWIsOS4reaWreeCuTogJXMiCisKKyM6IGV4X2NtZHMyLmM6NDE0Cittc2dpZCAiTm8gYnJlYWtwb2ludHMgZGVmaW5lZCIKK21zZ3N0ciAi5rKh5pyJ5a6a5LmJ5Lit5pat54K5IgorCisjOiBleF9jbWRzMi5jOjQxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAg56ysICVsZCDooYwiCisKKyM6IGV4X2NtZHMuYzoyMDUzIGV4X2NtZHMuYzoyMjg5IGV4X2NtZHMyLmM6NjAyCittc2dpZCAiU2F2ZSBBcyIKK21zZ3N0ciAi5Y+m5a2Y5Li6IgorCisjOiBleF9jbWRzMi5jOjYyNQorIywgYy1mb3JtYXQKK21zZ2lkICJTYXZlIGNoYW5nZXMgdG8gXCIlLipzXCI/IgorbXNnc3RyICLlsIbmlLnlj5jkv53lrZjliLAgXCIlLipzXCI/IgorCisjOiBleF9jbWRzMi5jOjYyNyBleF9kb2NtZC5jOjg2MTIKK21zZ2lkICJVbnRpdGxlZCIKK21zZ3N0ciAi5pyq5ZG95ZCNIgorCisjOiBleF9jbWRzMi5jOjc2MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTYyOiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTE2Mjog5bey5pu05pS56L+H57yT5Yay5Yy6IFwiJXNcIiDkvYblsJrmnKrkv53lrZggKOWPr+eUqCAhIOW8uuWItuaJp+ihjCkiCisKKyM6IGV4X2NtZHMyLmM6ODMyCittc2dpZCAiV2FybmluZzogRW50ZXJlZCBvdGhlciBidWZmZXIgdW5leHBlY3RlZGx5IChjaGVjayBhdXRvY29tbWFuZHMpIgorbXNnc3RyICLms6jmhI86IOW3suWIh+aNouWIsOWFtuWug+e8k+WGsuWMuiAo6K+35qOA5p+lIEF1dG9jb21tYW5kcyDmnInml6DplJnor68pIgorCisjOiBleF9jbWRzMi5jOjEyMDgKK21zZ2lkICJFMTYzOiBUaGVyZSBpcyBvbmx5IG9uZSBmaWxlIHRvIGVkaXQiCittc2dzdHIgIkUxNjM6IOWPquacieS4gOS4quaWh+S7tuWPr+e8lui+kSIKKworIzogZXhfY21kczIuYzoxMjEwCittc2dpZCAiRTE2NDogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBmaWxlIgorbXNnc3RyICJFMTY0OiDlt7Lnu4/lnKjnrKzkuIDkuKrmlofku7bkuoYiCisKKyM6IGV4X2NtZHMyLmM6MTIxMgorbXNnaWQgIkUxNjU6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBmaWxlIgorbXNnc3RyICJFMTY1OiDlt7Lnu4/lnKjmnIDlkI7kuIDkuKrmlofku7bkuoYiCisKKyM6IGV4X2NtZHMyLmM6MTYzMgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIuafpeaJvuS4rTogXCIlc1wiIC0tIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICLmn6Xmib7kuK06IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIuWcqCAncnVudGltZXBhdGgnIOmHjOaJvuS4jeWIsCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTcxMgorbXNnaWQgIlJ1biBNYWNybyIKK21zZ3N0ciAi5omn6KGM5a6PIgorCisjOiBleF9jbWRzMi5jOjE4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICLkuI3og73miafooYznm67lvZXvvJogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIuS4jeiDveaJp+ihjCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg0OQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIuesrCAlbGQg6KGMOiDkuI3og73miafooYwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLmiafooYwgXCIlc1wiIOS4rSIKKworIzogZXhfY21kczIuYzoxODY1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIuesrCAlbGQg6KGMOiDnu5PmnZ/miafooYwgJXMiCisKKyM6IGV4X2NtZHMyLmM6MTk3MQorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAi57uT5p2f5omn6KGMICVzIgorCisjOiBleF9jbWRzMi5jOjIyNzIKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiDms6jmhI86IOmUmeivr+eahOihjOWIhumalOWtl+espu+8jOWPr+iDveaYr+WwkeS6hiBeTSIKKworIzogZXhfY21kczIuYzoyMzIxCittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2Nzog5Zyo5omn6KGMIHNjcmlwdCDmlofku7blpJbkuI3lj6/kvb/nlKggOnNjcmlwdGVuY29kaW5nIgorCisjOiBleF9jbWRzMi5jOjIzNTQKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODog5Zyo5omn6KGMIHNjcmlwdCDmlofku7blpJbkuI3lj6/kvb/nlKggOmZpbmlzaCIKKworIzogZXhfY21kczIuYzoyODIwCittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICLmsqHmnInopoHmiZPljbDnmoTmloflrZciCisKKyM6IGV4X2NtZHMyLmM6Mjg5OAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAi5omT5Y2w5LitOiDnrKwgJWQg6aG1ICglZCUlKSIKKworIzogZXhfY21kczIuYzoyOTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICLlpI3liLYgJWQgLyAlZCIKKworIzogZXhfY21kczIuYzoyOTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICLlt7LmiZPljbA6ICVzIgorCisjOiBleF9jbWRzMi5jOjI5NjYKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICLmiZPljbDkuK3mlq0iCisKKyM6IGV4X2NtZHMyLmM6MzM0NAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTog5YaZ5YWlIFBvc3RTY3JpcHQg5paH5Lu25Ye66ZSZIgorCisjOiBleF9jbWRzMi5jOjQwMTkKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IOS4jeiDveaJk+W8gCBQb3N0U2NyaXB0IOi+k+WHuuaWh+S7tiIKKworIzogZXhfY21kczIuYzo0MDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IOS4jeiDveaJk+W8gOaWh+S7tiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDA2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IOS4jeiDveivuyBQb3N0U2NyaXB0IOi1hOa6kOaWh+S7tiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDI2NgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAi5Y+R6YCB5Yiw5omT5Y2w5py6Li4uIgorCisjOiBleF9jbWRzMi5jOjQyNzAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiDmiZPljbAgUG9zdFNjcmlwdCDmlofku7blpLHotKUiCisKKyM6IGV4X2NtZHMyLmM6NDI3MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiIgorCisjOiBleF9jbWRzMi5jOjQ2NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIuebruWJjeeahCAlc+ivreiogDogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ2NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiCittc2dzdHIgIkUxOTc6IOS4jeiDveiuvuWumuivreiogOS4uiBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIOWNgeWFrei/m+WItiAlMDJ4LCAg5YWr6L+b5Yi2ICUwM28iCisKKyM6IGV4X2NtZHMuYzo0MjgKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDog5LiN6IO95oqK6KGM56e75Yiw5a6D6Ieq5bey5YaFIgorCisjOiBleF9jbWRzLmM6NDk3Cittc2dpZCAiMSBsaW5lIG1vdmVkIgorbXNnc3RyICLlt7Lnp7vliqggMSDooYwiCisKKyM6IGV4X2NtZHMuYzo0OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICLlt7LmkKznp7sgJWxkIOihjCIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIuW3suWkhOeQhiAlbGQg6KGMIgorCisjOiBleF9jbWRzLmM6OTE4Cittc2dpZCAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTEzNTogKkZpbHRlciogQXV0b2NvbW1hbmQg5LiN5Y+v5Lul5pu05pS557yT5Yay5Yy655qE5YaF5a65IgorCisjOiBleF9jbWRzLmM6MTAwMworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW+abtOaWsOWQjuWwmuacquS/neWtmF1cbiIKKworIzogZXhfY21kcy5jOjEyNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICJ2aW1pbmZvOiAlcyDlnKjooYzkuK06ICIKKworIzogZXhfY21kcy5jOjEyNTMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzog6L+H5aSa6ZSZ6K+vLCDlv73nlaXmlofku7blhbbkvZnpg6jliIYiCisKKyM6IGV4X2NtZHMuYzoxMjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAi6K+75Y+WIHZpbWluZm8g5paH5Lu2IFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiIOS/oeaBryIKKworIzogZXhfY21kcy5jOjEyODQKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIiDmoIforrAiCisKKyM6IGV4X2NtZHMuYzoxMjg1Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIOWksei0pSIKKworIzogZXhfY21kcy5jOjEzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IFZpbWluZm8g5paH5Lu25LiN6IO95YaZ5YWlOiAlcyIKKworIzogZXhfY21kcy5jOjE1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzODogQ2FuJ3Qgd3JpdGUgdmltaW5mbyBmaWxlICVzISIKK21zZ3N0ciAiRTEzODog5LiN6IO95YaZ5YWlIHZpbWluZm8g5paH5Lu2ICVzICEiCisKKyM6IGV4X2NtZHMuYzoxNTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi5YaZ5YWlIHZpbWluZm8g5paH5Lu2IFwiJXNcIiDkuK0iCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyB2aW1pbmZvIOaWh+S7tuaYr+eUsSB2aW0gJXMg5omA5Lqn55SfLlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMg5aaC5p6c5oOz6KaB6Ieq6KGM5L+u5pS56K+354m55Yir5bCP5b+D77yBXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjE0Cittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgJ2VuY29kaW5nJyDlnKjmraTmlofku7blu7rnq4vml7bnmoTlgLxcbiIKKworIzogZXhfY21kcy5jOjE3MTMKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIuaXoOaViOeahOWQr+WKqOWtl+espiIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMDk2Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IOaCqOWcqOWPpuS4gOS4que8k+WGsuWMuuS5n+WKoOi9veS6hui/meS4quaWh+S7tiIKKworIzogZXhfY21kcy5jOjIxMzAKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICLopoHlhpnlhaXpg6jliIbmlofku7blkJfvvJ8iCisKKyM6IGV4X2NtZHMuYzoyMTM3Cittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IOivt+S9v+eUqCAhIOadpeWGmeWFpemDqOWIhue8k+WGsuWMuiIKKworIzogZXhfY21kcy5jOjIyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICLopoHopobnm5blt7LlrZjlnKjnmoTmlofku7YgXCIlLipzXCLvvJ8iCisKKyM6IGV4X2NtZHMuYzoyMjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTog57yT5Yay5Yy6ICVsZCDmsqHmnInmlofku7blkI0iCisKKyM6IGV4X2NtZHMuYzoyMzMyCittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0Mjog5paH5Lu25pyq5YaZ5YWl77yM5Zug5Li6ICd3cml0ZScg6YCJ6aG55YWz6ZetIgorCisjOiBleF9jbWRzLmM6MjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiXCIlLipzXCIg5bey6K6+5a6aICdyZWFkb25seScg6YCJ6aG5LlxuIgorIuehruWumuimgeimhuebluWQl++8nyIKKworIzogZXhfY21kcy5jOjI1MTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIue8lui+keaWh+S7tiIKKworIzogZXhfY21kcy5jOjMwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9jb21tYW5kcyDmhI/lpJblnLDliKDpmaTmlrDnvJPlhrLljLogJXMiCisKKyM6IGV4X2NtZHMuYzozMTU2Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IDp6IOS4jeaOpeWPl+mdnuaVsOWtl+eahOWPguaVsCIKKworIzogZXhfY21kcy5jOjMyNDEKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltIOS4reemgeatouS9v+eUqCBzaGVsbCDlkb3ku6QiCisKKyM6IGV4X2NtZHMuYzozMzQ4Cittc2dpZCAiRTE0NjogUmVndWxhciBleHByZXNzaW9ucyBjYW4ndCBiZSBkZWxpbWl0ZWQgYnkgbGV0dGVycyIKK21zZ3N0ciAiRTE0Njog5q2j5YiZ6KGo6L6+5byP5LiN6IO955So5a2X5q+N5YiG6ZqUICg/KSIKKworIzogZXhfY21kcy5jOjM2ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVwbGFjZSB3aXRoICVzICh5L24vYS9xL2wvXkUvXlkpPyIKK21zZ3N0ciAi5pu/5o2i5Li6ICVzICh5L24vYS9xL15FL15ZKT8iCisKKyM6IGV4X2NtZHMuYzo0MDUwCittc2dpZCAiKEludGVycnVwdGVkKSAiCittc2dzdHIgIijlt7LkuK3mlq0pICIKKworIzogZXhfY21kcy5jOjQwNTQKK21zZ2lkICIxIHN1YnN0aXR1dGlvbiIKK21zZ3N0ciAi5pu/5o2i5LiA57uEIgorCisjOiBleF9jbWRzLmM6NDA1NgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAi5pu/5o2iICVsZCDnu4QiCisKKyM6IGV4X2NtZHMuYzo0MDU5Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiIOS4gOihjOS4rSIKKworIzogZXhfY21kcy5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiICVsZCDooYzkuK0iCisKKyM6IGV4X2NtZHMuYzo0MTEyCittc2dpZCAiRTE0NzogQ2Fubm90IGRvIDpnbG9iYWwgcmVjdXJzaXZlIgorbXNnc3RyICJFMTQ3OiA6Z2xvYmFsIOS4jeiDvemAkuW9kuaJp+ihjCIKKworIzogZXhfY21kcy5jOjQxNDcKK21zZ2lkICJFMTQ4OiBSZWd1bGFyIGV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCIKK21zZ3N0ciAiRTE0ODog5rKh5pyJ5L2/55So6L+H5q2j5YiZ6KGo6L6+5byPICg/KSIKKworIzogZXhfY21kcy5jOjQxOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAi5q+P5LiA6KGM6YO95om+5LiN5Yiw5qih5byPOiAlcyIKKworIzogZXhfY21kcy5jOjQyNzcKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIOWJjeS4gOe7hOabv+S7o+Wtl+espuS4sjpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDM3NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQ5OiBTb3JyeSwgbm8gaGVscCBmb3IgJXMiCittc2dzdHIgIkUxNDk6IOaKseatiSwg5rKh5pyJICVzIOeahOivtOaYjiIKKworIzogZXhfY21kcy5jOjQ0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICLmirHmrYksIOaJvuS4jeWIsOW4ruWKqeaWh+S7tiBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo0ODU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIOS4jeaYr+ebruW9lSIKKworIzogZXhfY21kcy5jOjQ4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IOS4jeiDveS7peWGmeWFpeaooeW8j+aJk+W8gCBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo0ODk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiDkuI3og73or7vlj5bmlofku7Y6ICVzIgorCisjOiBleF9jbWRzLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiDmoIfnrb4odGFnKSBcIiVzXCIg5Zyo5paH5Lu2ICVzIOmHjOmHjeWkjeWHuueOsOWkmuasoSIKKworIzogZXhfY21kcy5jOjUwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiDmnKrlrprkuYnnmoQgc2lnbiBjb21tYW5kOiAlcyIKKworIzogZXhfY21kcy5jOjUwOTgKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1Njog57y65bCRIHNpZ24g5ZCN56ewIgorCisjOiBleF9jbWRzLmM6NTE0NAorbXNnaWQgIkUyNTU6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkUzMjY6IOaJvuWIsOWkquWkmiBzaWducyIKKworIzogZXhfY21kcy5jOjUxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiDkuI3mraPnoa7nmoQgc2lnbiDmloflrZc6ICVzIgorCisjOiBleF9jbWRzLmM6NTIxMCBleF9jbWRzLmM6NTM5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiDkuI3mraPnoa7nmoQgc2lnbjogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjU2Cittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTog57y65bCRIHNpZ24gbnVtYmVyIgorCisjOiBleF9jbWRzLmM6NTMzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODog57yT5Yay5Yy65ZCN56ew6ZSZ6K+vOiAlcyIKKworIzogZXhfY21kcy5jOjUzNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IFNpZ24gSUQg6ZSZ6K+vOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1NTQ2Cittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJb5bey5Yig6ZmkXSIKKworIzogZXhfZG9jbWQuYzo0OTEKK21zZ2lkICJFbnRlcmluZyBFeCBtb2RlLiAgVHlwZSBcInZpc3VhbFwiIHRvIGdvIHRvIE5vcm1hbCBtb2RlLiIKK21zZ3N0ciAi6L+b5YWlIEV4IOaooeW8jy4g6L6T5YWlIFwidmlzdWFcIiDku6Xlm57liLDmraPluLjmqKHlvI8uIgorCisjLiBtdXN0IGJlIGF0IEVPRgorIzogZXhfZG9jbWQuYzo1MjcKK21zZ2lkICJBdCBlbmQtb2YtZmlsZSIKK21zZ3N0ciAi5bey5Yiw5paH5Lu257uT5bC+IgorCisjOiBleF9kb2NtZC5jOjYwMgorbXNnaWQgIkUxNjk6IENvbW1hbmQgdG9vIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE2OTog5ZG95Luk6YCS5b2S5bGC5pWw6L+H5aSaIgorCisjOiBleF9kb2NtZC5jOjkxMQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiDnvLrlsJEgOmVuZHdoaWxlIgorCisjOiBleF9kb2NtZC5jOjkxMworbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiDnvLrlsJEgOmVuZGlmIgorCisjOiBleF9kb2NtZC5jOjkyMworbXNnaWQgIkVuZCBvZiBzb3VyY2VkIGZpbGUiCittc2dzdHIgIuWRveS7pOaWh+S7tue7k+adnyIKKworIzogZXhfZG9jbWQuYzo5MjQKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIuWHveaVsOe7k+WwviIKKworIzogZXhfZG9jbWQuYzoxMzQ0Cittc2dpZCAiQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAi55So5oi35a6a5LmJ55qE5ZG95Luk5Lya5re35reGIgorCisjOiBleF9kb2NtZC5jOjEzNTgKK21zZ2lkICJOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIuS4jeaYr+e8lui+keWZqOeahOWRveS7pCIKKworIzogZXhfZG9jbWQuYzoxNDQxCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICLkuI3opoHmg4rmhYwhIgorCisjOiBleF9kb2NtZC5jOjE0NjAKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIuaMh+WumuS6huWQkeWJjeWPguiAg+eahOiMg+WbtCIKKworIzogZXhfZG9jbWQuYzoxNDY5Cittc2dpZCAiQmFja3dhcmRzIHJhbmdlIGdpdmVuLCBPSyB0byBzd2FwIgorbXNnc3RyICLmjIflrprkuoblkJHliY3lj4LogIPnmoTojIPlm7TvvIxPSyB0byBzd2FwIgorCisjOiBleF9kb2NtZC5jOjE1ODAKK21zZ2lkICJVc2UgdyBvciB3Pj4iCittc2dzdHIgIuivt+S9v+eUqCB3IOaIliB3Pj4iCisKKyM6IGV4X2RvY21kLmM6MzA4NgorbXNnaWQgIkUzMTk6IFNvcnJ5LCB0aGUgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTMxOTog5oqx5q2JLCDmnKzlkb3ku6TlnKjmraTniYjmnKzkuK3mnKrlrp7njrAiCisKKyM6IGV4X2RvY21kLmM6MzI1NgorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiDlj6rog73mnInkuIDkuKrmlofku7blkI0iCisKKyM6IGV4X2RvY21kLmM6MzgxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIui/mOaciSAlZCDkuKrmlofku7bmnKrnvJbovpEuIOehruWumuimgemAgOWHuu+8nyIKKworIzogZXhfZG9jbWQuYzozODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6IOi/mOaciSAlbGQg5Liq5paH5Lu25pyq57yW6L6RIgorCisjOiBleF9kb2NtZC5jOjM5MTEKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiB1c2UgISB0byByZWRlZmluZSIKK21zZ3N0ciAiRTE3NDog5ZG95Luk5bey57uP5a2Y5ZyoLCDor7fkvb/nlKggISDlvLrliLbph43mlrDlrprkuYkiCisKKyM6IGV4X2RvY21kLmM6NDAxNgorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICDlkI3np7AgICAgICAgIOWPguaVsCDojIPlm7QgIOWujOaVtCAgICAgIOWumuS5iSAgICAgICIKKworIzogZXhfZG9jbWQuYzo0MTA1Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICLmib7kuI3liLDnlKjmiLfoh6rlrprkuYnnmoTlkb3ku6QiCisKKyM6IGV4X2RvY21kLmM6NDEzNgorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IOayoeacieaMh+WumueahOWxnuaApyIKKworIzogZXhfZG9jbWQuYzo0MTg4Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiDkuI3mraPnoa7nmoTlj4LmlbDkuKrmlbAiCisKKyM6IGV4X2RvY21kLmM6NDIwMworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6IOS4jeiDveaMh+WumuS4pOasoSIKKworIzogZXhfZG9jbWQuYzo0MjEzCittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODog6K6h5pWw55qE57y655yB5YC85LiN5q2j56GuIgorCisjOiBleF9kb2NtZC5jOjQyNDEKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6IOaMh+S7pOmcgOimgeWPguaVsOaJjeiDveWujOaIkCIKKworIzogZXhfZG9jbWQuYzo0MjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiDkuI3lrozmlbTnmoTlgLw6ICclcyciCisKKyM6IGV4X2RvY21kLmM6NDI2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6IOS4jeato+ehrueahOWxnuaApzogJXMiCisKKyM6IGV4X2RvY21kLmM6NDMwOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiDlkb3ku6TlkI3np7DkuI3mraPnoa4iCisKKyM6IGV4X2RvY21kLmM6NDMyNAorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiRTE4Mzog55So5oi36Ieq5a6a5LmJ5ZG95Luk5b+F6aG75Lul5aSn5YaZ5a2X5q+N5byA5aeLIgorCisjOiBleF9kb2NtZC5jOjQzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NDogTm8gc3VjaCB1c2VyLWRlZmluZWQgY29tbWFuZDogJXMiCittc2dzdHIgIkUxODQ6IOayoeacieeUqOaIt+iHquWumuS5ieeahOWRveS7pO+8miAlcyIKKworIzogZXhfZG9jbWQuYzo0ODQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTog5om+5LiN5Yiw6aKc6Imy5qC35byPICVzIgorCisjOiBleF9kb2NtZC5jOjQ4NTIKK21zZ2lkICJHcmVldGluZ3MsIFZpbSB1c2VyISIKK21zZ3N0ciAi5L2g5aW9LCBWaW0g55So5oi377yBIgorCisjOiBleF9kb2NtZC5jOjU1NDkKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAi5Zyo5paw56qX5Y+j57yW6L6R5paH5Lu2IgorCisjOiBleF9kb2NtZC5jOjU4MTUKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIuaXoOS6pOaNouaWh+S7tiIKKworIzogZXhfZG9jbWQuYzo1OTE5Cittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIumZhOWKoOaWh+S7tiIKKworIzogZXhfZG9jbWQuYzo1OTc4Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiDliY3kuIDkuKrnm67lvZXkuI3lrZjlnKgiCisKKyM6IGV4X2RvY21kLmM6NjA1NQorbXNnaWQgIkUxODc6IFVua25vd24iCittc2dzdHIgIkUxODc6IOS4jeiDveivhuWIq+eahOagh+iusCIKKworIzogZXhfZG9jbWQuYzo2MTczCisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAi56qX5Y+j5L2N572uOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjYxNzgKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODog5Zyo5oKo55qE5bmz5Y+w5LiK5LiN6IO96I635b6X56qX5Y+j5L2N572uIgorCisjOiBleF9kb2NtZC5jOjY0NDQKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICLkv53lrZjph43lrprlkJEiCisKKyM6IGV4X2RvY21kLmM6NjU5MworbXNnaWQgIlNhdmUgVmlldyIKK21zZ3N0ciAi5L+d5a2Y6KeG5Zu+IgorCisjOiBleF9kb2NtZC5jOjY1OTQKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIuS/neWtmOS8muivnSIKKworIzogZXhfZG9jbWQuYzo2NTk2Cittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAi5L+d5a2Y6K6+5a6aIgorCisjOiBleF9kb2NtZC5jOjY3NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIg5bey5a2Y5ZyoICjor7fnlKggISDlvLrliLbmiafooYwpIgorCisjOiBleF9kb2NtZC5jOjY3NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiDkuI3og73ku6XlhpnlhaXmqKHlvI/miZPlvIAgXCIlc1wiIgorCisjLiBzZXQgbWFyaworIzogZXhfZG9jbWQuYzo2Nzc0Cittc2dpZCAiRTE5MTogQXJndW1lbnQgbXVzdCBiZSBhIGxldHRlciBvciBmb3J3YXJkL2JhY2t3YXJkIHF1b3RlIgorbXNnc3RyICJFMTkxOiDlj4LmlbDlv4XpobvmmK/oi7HmloflrZfmr43miJblkJHliY0v5ZCO55qE5byV5Y+3IgorCisjOiBleF9kb2NtZC5jOjY4MDMKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IDpub3JtYWwg6YCS5b2S5bGC5pWw6L+H5rexIgorCisjOiBleF9kb2NtZC5jOjcxNzEKK21zZ2lkICI6aWYgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiOmlmIOWxguaVsOi/h+a3sSIKKworIzogZXhfZG9jbWQuYzo3MjA2Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYg57y65bCR5a+55bqU55qEIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjI2Cittc2dpZCAiOmVsc2Ugd2l0aG91dCA6aWYiCittc2dzdHIgIjplbHNlIOe8uuWwkeWvueW6lOeahCA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzIyOAorbXNnaWQgIjplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIjplbHNlaWYg57y65bCR5a+55bqU55qEIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjgwCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIjp3aGlsZSDlsYLmlbDov4fmt7EiCisKKyM6IGV4X2RvY21kLmM6NzMyNgorbXNnaWQgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmNvbnRpbnVlIOe8uuWwkeWvueW6lOeahCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM1MworbXNnaWQgIjpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmJyZWFrIOe8uuWwkeWvueW6lOeahCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM3NiBleF9kb2NtZC5jOjczODEKK21zZ2lkICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjplbmR3aGlsZSDnvLrlsJHlr7nlupTnmoQgOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjc0MDIKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiA6ZW5kZnVuY3Rpb24g5b+F6aG75Zyo5Ye95pWw5YaF6YOo5L2/55SoIgorCisjOiBleF9kb2NtZC5jOjc1ODIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDog5rKh5pyJICcjJyDlj6/mm7/ku6PnmoTmlofku7blkI0iCisKKyM6IGV4X2RvY21kLmM6NzYxMworbXNnaWQgIm5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAi5rKh5pyJIEF1dG9jb21tYW5kIOaWh+S7tuWQjeS7peabv+aNoiBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjIxCittc2dpZCAibm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICLmsqHmnIkgQXV0b2NvbW1hbmQg57yT5Yay5Yy65ZCN56ew5Lul5pu/5o2iIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6NzYzMgorbXNnaWQgIm5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICLmsqHmnIkgQXV0b2NvbW1hbmQgTWF0Y2ggbmFtZSDku6Xmm7/mjaIgXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjc2NDIKK21zZ2lkICJubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAi5rKh5pyJIDpzb3VyY2Ug5paH5Lu25ZCN5Lul5pu/5o2iIFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjc2ODMKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIiclJyDmiJYgJyMnIOaMh+WQkeepuuaWh+S7tuWQje+8jOWPquiDveeUqOaWvCBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3Njg1Cittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAi6L6T5YWl5Li656m65a2X56ym5LiyIgorCisjOiBleF9kb2NtZC5jOjg1OTQKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6IOS4jeiDveivu+WPliB2aW1pbmZvIgorCisjOiBleF9kb2NtZC5jOjg3NjcKK21zZ2lkICJFMTk2OiBObyBkaWdyYXBocyBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUxOTY6IOacrOeJiOacrOaXoOWkjeWQiOWtl+espihkaWdyYXBoKSIKKworIzogZXhfZ2V0bG4uYzoyNzg1Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAi5qCH562+5ZCN56ewIgorCisjOiBleF9nZXRsbi5jOjI3ODgKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIuexu+aWh+S7tlxuIgorCisjOiBleF9nZXRsbi5jOjM5OTcKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIumAiemhuSAnaGlzdG9yeScg5piv6Zu2IgorCisjOiBleF9nZXRsbi5jOjQyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIOWOhuWPsuiusOW9lSAo5LuO5paw5Yiw5penKTpcbiIKKworIzogZXhfZ2V0bG4uYzo0MjM4Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICLlkb3ku6TooYwiCisKKyM6IGV4X2dldGxuLmM6NDIzOQorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgIuafpeaJvuWtl+espuS4siIKKworIzogZXhfZ2V0bG4uYzo0MjQwCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAi6KGo6L6+5byPIgorCisjOiBleF9nZXRsbi5jOjQyNDEKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICLovpPlhaXooYwiCisKKyM6IGV4X2dldGxuLmM6NDI3MQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIg6LaF6L+H5ZG95Luk6ZW/5bqmIgorCisjOiBleF9nZXRsbi5jOjQ0MzUKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiDlt7LliKDpmaTmtLvliqjnqpflj6PmiJbnvJPlrZgiCisKKyM6IGZpbGVpby5jOjM0NworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICLkuI3mraPnoa7nmoTmlofku7blkI0iCisKKyM6IGZpbGVpby5jOjM3MSBmaWxlaW8uYzo0OTUgZmlsZWlvLmM6MjQ5MSBmaWxlaW8uYzoyNTI5Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIuaYr+ebruW9lSIKKworIzogZmlsZWlvLmM6MzczCittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAi5LiN5piv5paH5Lu2IgorCisjOiBmaWxlaW8uYzo1MTUgZmlsZWlvLmM6MzU4MQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIlvmnKrlkb3lkI1dIgorCisjOiBmaWxlaW8uYzo1MzIKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJb5p2D6ZmQ5LiN6LazXSIKKworIzogZmlsZWlvLmM6NjI0Cittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgQXV0b2NvbW1hbmQg5L2/56iL5bqP5LiN6IO96K+75Y+W5q2k5paH5Lu2IgorCisjOiBmaWxlaW8uYzo2MjYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqRmlsdGVyKiBBdXRvY29tbWFuZCDkuI3lj6/ku6Xmm7TmlLnnvJPlhrLljLrnmoTlhoXlrrkiCisKKyM6IGZpbGVpby5jOjY0NgorbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTog5LuO5qCH5YeG6L6T5YWl6K+75Y+WLi4uXG4iCisKKyM6IGZpbGVpby5jOjY1MgorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAi5LuO5qCH5YeG6L6T5YWl6K+7Li4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjg3NgorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiDovazmjaLplJnor68iCisKKyM6IGZpbGVpby5jOjE3MzIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxNzM5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjE3NDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE3NTQKK21zZ2lkICJbUk9dIgorbXNnc3RyICJb5Y+q6K+7XSIKKworIzogZmlsZWlvLmM6MTc2NAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW+e8uuWwkUNSXSciCisKKyM6IGZpbGVpby5jOjE3NjkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJb5om+5YiwTkxdIgorCisjOiBmaWxlaW8uYzoxNzc0Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJb5YiG5Ymy6L+H6ZW/6KGMXSIKKworIzogZmlsZWlvLmM6MTc4MCBmaWxlaW8uYzozNTY1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJb5pyq6L2s5o2iXSIKKworIzogZmlsZWlvLmM6MTc4NSBmaWxlaW8uYzozNTcwCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvlt7LovazmjaJdIgorCisjOiBmaWxlaW8uYzoxNzkyIGZpbGVpby5jOjM1OTUKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlvlt7LliqDlr4ZdIgorCisjOiBmaWxlaW8uYzoxNzk5Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICLovazmjaLplJnor68iCisKKyM6IGZpbGVpby5jOjE4MDYKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJb6K+76ZSZ6K+vXSIKKworIzogZmlsZWlvLmM6MjAxMworbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICLmib7kuI3liLDovazmjaLnlKjnmoTkuLTml7bmlofku7YiCisKKyM6IGZpbGVpby5jOjIwMjAKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIuWtl+espumbhui9rOaNoumUmeivryIKKworIzogZmlsZWlvLmM6MjAyMworbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIuS4jeiDveivu+WPliAnY2hhcmNvbnZlcnQnIOeahOi+k+WHuiIKKworIzogZmlsZWlvLmM6MjQwNworbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiBBdXRvY29tbWFuZCDliKDpmaTmiJbph4rmlL7kuobopoHlhpnlhaXnmoTnvJPlhrLljLoiCisKKyM6IGZpbGVpby5jOjI0MzAKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2NvbW1hbmQg5oSP5aSW5Zyw5pS55Y+Y5LqG6KGM5Y+3IgorCisjOiBmaWxlaW8uYzoyNDk2IGZpbGVpby5jOjI1MTMKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAi5LiN5piv5paH5Lu25oiW5Y+v5YaZ55qE6K6+5aSHIgorCisjOiBmaWxlaW8uYzoyNTU1Cittc2dpZCAiaXMgcmVhZC1vbmx5ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIuaYr+WPquivu+aWh+S7tiAo6K+35L2/55SoICEg5by65Yi25omn6KGMKSIKKworIzogZmlsZWlvLmM6Mjg1MQorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIuS4jeiDveWGmeWkh+S7veaWh+S7tiAo6K+35L2/55SoICEg5by65Yi25omn6KGMKSIKKworIzogZmlsZWlvLmM6Mjg2MworbXNnaWQgIkNsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLlhbPpl63lpIfku73mlofku7blh7rplJkgKOivt+S9v+eUqCAhIOW8uuWItuaJp+ihjCkiCisKKyM6IGZpbGVpby5jOjI4NjUKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLkuI3og73or7vlj5bmlofku7bku6XkvpvlpIfku70gKOivt+S9v+eUqCAhIOW8uuWItuaJp+ihjCkiCisKKyM6IGZpbGVpby5jOjI4ODEKK21zZ2lkICJDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIuS4jeiDveWIm+W7uuWkh+S7veaWh+S7tiAo6K+35L2/55SoICEg5by65Yi25omn6KGMKSIKKworIzogZmlsZWlvLmM6Mjk3MAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAi5LiN6IO95L2c5aSH5Lu95paH5Lu2ICjor7fkvb/nlKggISDlvLrliLbmiafooYwpIgorCisjOiBmaWxlaW8uYzozMDMyCittc2dpZCAiVGhlIHJlc291cmNlIGZvcmsgd2lsbCBiZSBsb3N0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIlJlc291cmNlIGZvcmsg5Lya5raI5aSxICjor7fkvb/nlKggISDlvLrliLbmiafooYwpIgorCisjOiBmaWxlaW8uYzozMTIxCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6IOaJvuS4jeWIsOWGmeWFpeeUqOeahOS6pOaNouaWh+S7tiIKKworIzogZmlsZWlvLmM6MzEzOQorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0ICh1c2UgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiDkuI3og73ovazmjaIgKOivt+S9v+eUqCAhIOW8uuWItuS4jei9rOaNouWGmeWFpSkiCisKKyM6IGZpbGVpby5jOjMxNzYKK21zZ2lkICJFMTY2OiBDYW4ndCBvcGVuIGxpbmtlZCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTY2OiDkuI3og73ku6XlhpnlhaXmqKHlvI/miZPlvIDpk77mjqXmlofku7YiCisKKyM6IGZpbGVpby5jOjMxODAKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6IOS4jeiDveS7peWGmeWFpeaooeW8j+aJk+W8gCIKKworIzogZmlsZWlvLmM6MzQyMworbXNnaWQgIkNsb3NlIGZhaWxlZCIKK21zZ3N0ciAi5YWz6Zet5aSx6LSlIgorCisjOiBmaWxlaW8uYzozNDgxCittc2dpZCAid3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICLkuI3og73lhpnlhaUgLS0g6L2s5o2i5aSx6LSlIgorCisjOiBmaWxlaW8uYzozNDg3Cittc2dpZCAid3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIKK21zZ3N0ciAi5YaZ5YWl6ZSZ6K+vICjmlofku7bns7vnu5/lt7Lmu6HvvJ8pIgorCisjOiBmaWxlaW8uYzozNTYwCittc2dpZCAiIENPTlZFUlNJT04gRVJST1IiCittc2dzdHIgIui9rOaNoumUmeivryIKKworIzogZmlsZWlvLmM6MzU3NgorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJb6K6+5aSHXSIKKworIzogZmlsZWlvLmM6MzU4MQorbXNnaWQgIltOZXddIgorbXNnc3RyICJb5pawXSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBbYV0iCittc2dzdHIgIlthXSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiIOW3sumZhOWKoCIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiBbd10iCittc2dzdHIgIlt3XSIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIg5bey5YaZ5YWlIgorCisjOiBmaWxlaW8uYzozNjU1Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IFBhdGNoIOaooeW8jzog5LiN6IO95YKo5a2Y5Y6f5aeL5paH5Lu2IgorCisjOiBmaWxlaW8uYzozNjc3Cittc2dpZCAiRTIwNjogcGF0Y2htb2RlOiBjYW4ndCB0b3VjaCBlbXB0eSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA2OiBQYXRjaCDmqKHlvI86IOS4jeiDveaUueWPmOepuueahOWOn+Wni+aWh+S7tiIKKworIzogZmlsZWlvLmM6MzY5MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzog5LiN6IO95Yig6Zmk5aSH5Lu95paH5Lu2IgorCisjOiBmaWxlaW8uYzozNzQ0Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisi6K2m5ZGKOiDljp/lp4vmlofku7bkuKLlpLHmiJbmjZ/lnY9cbiIKKworIzogZmlsZWlvLmM6Mzc0NgorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIuWcqOaWh+S7tuato+ehruWGmeWFpeWJjeivt+WLv+mAgOWHuue8lui+keWZqCEiCisKKyM6IGZpbGVpby5jOjM4MjYKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjM4MjYKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3Mg5qC85byPXSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyDmoLzlvI9dIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM4NDAKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCDmoLzlvI9dIgorCisjOiBmaWxlaW8uYzozODY3Cittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEg6KGMLCAiCisKKyM6IGZpbGVpby5jOjM4NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCDooYwsICIKKworIzogZmlsZWlvLmM6Mzg3MgorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICLkuIDkuKrlrZfnrKYiCisKKyM6IGZpbGVpby5jOjM4NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZOS4quWtl+espiIKKworIzogZmlsZWlvLmM6Mzg4NAorbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltub2VvbF0iCisKKyM6IGZpbGVpby5jOjM4ODQKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJb5pyA5ZCO5LiA6KGM5LiN5a6M5pW0XSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzozOTAzCittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICLorablkYo6IOacrOaWh+S7tuiHquS4iuasoeivu+WFpeWQjuW3suWPmOWKqCEhISIKKworIzogZmlsZWlvLmM6MzkwNQorbXNnaWQgIkRvIHlvdSByZWFsbHkgd2FudCB0byB3cml0ZSB0byBpdCIKK21zZ3N0ciAi56Gu5a6a6KaB5YaZ5YWl5ZCXIgorCisjOiBmaWxlaW8uYzo0ODYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDg6IEVycm9yIHdyaXRpbmcgdG8gXCIlc1wiIgorbXNnc3RyICJFMjA4OiDlhpnlhaXmlofku7YgXCIlc1wiIOmUmeivryIKKworIzogZmlsZWlvLmM6NDg2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA5OiBFcnJvciBjbG9zaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIwOTog5YWz6Zet5paH5Lu2IFwiJXNcIiDplJnor68iCisKKyM6IGZpbGVpby5jOjQ4NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMDogRXJyb3IgcmVhZGluZyBcIiVzXCIiCittc2dzdHIgIkUyMTA6IOivu+WPluaWh+S7tiBcIiVzXCIg6ZSZ6K+vIgorCisjOiBmaWxlaW8uYzo1MDM1Cittc2dpZCAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTI0NjogRmlsZUNoYW5nZWRTaGVsbCBhdXRvY29tbWFuZCDliKDpmaTnvJPlhrLljLoiCisKKyM6IGZpbGVpby5jOjUwNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTog6K2m5ZGKOiDmlofku7YgXCIlc1wiIOW3sue7j+S4jeWtmOWcqCIKKworIzogZmlsZWlvLmM6NTA1NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIlcxMjog6K2m5ZGKOiDmlofku7YgXCIlc1wiIOiHquS4iuasoeivu+WFpeWQjuW3suWPmOWKqCwg6ICM5LiU57yW6L6R5Lit55qE57yT5Yay5Yy65Lmf5pu05Yqo5LqGIgorCisjOiBmaWxlaW8uYzo1MDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IOitpuWRijog5paH5Lu2IFwiJXNcIiDoh6rkuIrmrKHor7vlhaXlkI7lt7LmlLnlj5giCisKKyM6IGZpbGVpby5jOjUwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzE2OiDorablkYo6IOaWh+S7tiBcIiVzXCIg6Ieq5LiK5qyh6K+75YWl5ZCO5bey5pS55Y+YIgorCisjOiBmaWxlaW8uYzo1MDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzog6K2m5ZGKOiDmlofku7YgXCIlc1wiIOWcqOW8gOWni+e8lui+keWQjuWPiOiiq+WIm+W7uuS6hiIKKworIzogZmlsZWlvLmM6NTA4OAorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIuitpuWRiiIKKworIzogZmlsZWlvLmM6NTA4OQorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisi56Gu5a6aKCZPKVxuIgorIuWKoOi9veaWh+S7tigmTCkiCisKKyM6IGZpbGVpby5jOjUxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6IOS4jeiDvemHjeaWsOWKoOi9vSBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU2NzAKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS3lt7LliKDpmaQtLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjU4MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiDnu4TkuI3lrZjlnKg6IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTk1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciAqOiAlcyIKK21zZ3N0ciAiRTIxNTogKiDlkI7pnaLmnInkuI3mraPnoa7nmoTlrZfnrKY6ICVzIgorCisjOiBmaWxlaW8uYzo1OTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTY6IE5vIHN1Y2ggZXZlbnQ6ICVzIgorbXNnc3RyICJFMjE2OiDml6DmraTkuovku7Y6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYxMTUKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorCisjOiBmaWxlaW8uYzo2Mzg2Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6IOS4jeiDveWvueaJgOacieS6i+S7tuaJp+ihjCBhdXRvY29tbWFuZCIKKworIzogZmlsZWlvLmM6NjQwOQorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAi5om+5LiN5Yiw5a+55bqU55qEIGF1dG9jb21tYW5kIgorCisjOiBmaWxlaW8uYzo2NjgxCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogYXV0b2NvbW1hbmQg5bGC5pWw6L+H5rexIgorCisjOiBmaWxlaW8uYzo2OTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgQXV0byBjb21tYW5kczogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2OTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAi5omn6KGMICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjcwNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9jb21tYW5kICVzIgorCisjOiBmaWxlaW8uYzo3NTY2Cittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTog57y65bCRIHsuIgorCisjOiBmaWxlaW8uYzo3NTY4Cittc2dpZCAiRTIyMDogTWlzc2luZyB9LiIKK21zZ3N0ciAiRTIyMDog57y65bCRIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICLmib7kuI3liLDku7vkvZUgZm9sZCIKKworIzogZm9sZC5jOjU1NAorbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiDkuI3og73lnKjnm67liY3nmoQgJ2ZvbGRtZXRob2QnIOS4i+WIm+W7uiBmb2xkIgorCisjOiBmb2xkLmM6NTU2Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6IOS4jeiDveWcqOebruWJjeeahCAnZm9sZG1ldGhvZCcg5LiL5Yig6ZmkIGZvbGQiCisKKyM6IGZvbGQuYzoxNzAwCittc2dpZCAiRTIyMTogJ2NvbW1lbnRzdHJpbmcnIGlzIGVtcHR5IgorbXNnc3RyICJFMjIxOiDpgInpobkgJ2NvbW1lbnRzdHJpbmcnIOacquiuvuWumiIKKworIzogZ2V0Y2hhci5jOjI2OAorbXNnaWQgIkUyMjI6IEFkZCB0byByZWFkIGJ1ZmZlciIKK21zZ3N0ciAiRTIyMjog5Yqg5YWl6K+757yT5Yay5LitIgorCisjOiBnZXRjaGFyLmM6MjExNAorbXNnaWQgIkUyMjM6IHJlY3Vyc2l2ZSBtYXBwaW5nIgorbXNnc3RyICJFMjIzOiDpgJLlvZIgbWFwcGluZyIKKworIzogZ2V0Y2hhci5jOjI5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzIOW3sue7j+acieWFqOWxgCBhYmJyZXZpYXRpb24g5LqGIgorCisjOiBnZXRjaGFyLmM6Mjk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6ICVzIOW3sue7j+acieWFqOWxgCBtYXBwaW5nIOS6hiIKKworIzogZ2V0Y2hhci5jOjMwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogJXMg5bey57uP5pyJIGFiYnJldmlhdGlvbiDkuoYiCisKKyM6IGdldGNoYXIuYzozMDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjc6IG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI3OiAlcyDnmoQgbWFwcGluZyDlt7Lnu4/lrZjlnKgiCisKKyM6IGdldGNoYXIuYzozMTYzCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICLmib7kuI3liLDnvKnlhpkiCisKKyM6IGdldGNoYXIuYzozMTY1Cittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAi5rKh5pyJ6L+Z5Liq5a+55bqUIgorCisjOiBnZXRjaGFyLmM6Mzk5MAorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDog5LiN5q2j56Gu55qE5qih5byPIgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPOS4jeiDveaJk+W8gD4iCisKKyM6IGd1aV9hdF9mcy5jOjExMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJ2aW1fU2VsRmlsZTog5LiN6IO95L2/55SoICVzIOWtl+S9kyIKKworIzogZ3VpX2F0X2ZzLmM6MjUzNQorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiDkuI3og73lm57liLDnm67liY3nm67lvZUiCisKKyM6IGd1aV9hdF9mcy5jOjI1NTQKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIui3r+W+hDoiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjAKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IgorbXNnc3RyICJ2aW1fU2VsRmlsZTog5LiN6IO95Y+W5b6X55uu5YmN55uu5b2VIgorCisjOiBndWlfYXRfZnMuYzoyNTY4IGd1aV9tb3RpZi5jOjE2MDcKK21zZ2lkICJPSyIKK21zZ3N0ciAi56Gu5a6aIgorCisjLiAnQ2FuY2VsJyBidXR0b24KKyM6IGd1aV9hdF9mcy5jOjI1NjggZ3VpX2d0ay5jOjE2ODMgZ3VpX21vdGlmLmM6MTYwMiBndWlfbW90aWYuYzoyODIzCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICLlj5bmtogiCisKKyM6IGd1aV9hdGhlbmEuYzoxOTI4IGd1aV9tb3RpZi5jOjE4NTUKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWaW0g5a+56K+d5qGGIgorCisjOiBndWlfYXRfc2IuYzo0ODYKK21zZ2lkICJTY3JvbGxiYXIgV2lkZ2V0OiBDb3VsZCBub3QgZ2V0IGdlb21ldHJ5IG9mIHRodW1iIHBpeG1hcC4iCittc2dzdHIgIua7muWKqOadoTog5LiN6IO96K6+5a6aIHRodW1iIHBpeG1hcCDnmoTkvY3nva4iCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IOS4jeiDveWvueS/oeaBr+S4jiBjYWxsYmFjayDliJvlu7ogQmFsbG9uRXZhbCIKKworIzogZ3VpLmM6MTgxCittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6IOS4jeiDveWQr+WKqOWbvuWei+eVjOmdoiIKKworIzogZ3VpLmM6MzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiDkuI3og73or7vlj5bmlofku7YgXCIlc1wiIgorCisjOiBndWkuYzo0MzEKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6IOS4jeato+ehrueahCAnZ3VpZm9udHdpZGUnIgorCisjOiBndWkuYzozOTE5Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIumUmeivryIKKworIzogZ3VpLmM6MzkyMAorbXNnaWQgIiZPayIKK21zZ3N0ciAi56Gu5a6aKCZPKSIKKworIzogZ3VpX2d0ay5jOjExNDQKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0g5a+56K+d5qGGLi4uIgorCisjOiBndWlfZ3RrLmM6MTUxOSBndWlfbW90aWYuYzoyNzQyCittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSDmn6Xmib7kuI7mm7/mjaIuLi4iCisKKyM6IGd1aV9ndGsuYzoxNTI0IGd1aV9tb3RpZi5jOjI3NDQKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIOafpeaJvi4uLiIKKworIzogZ3VpX2d0ay5jOjE1NDcgZ3VpX21vdGlmLmM6Mjg2MgorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIuafpeaJvjoiCisKKyM6IGd1aV9ndGsuYzoxNTY1IGd1aV9tb3RpZi5jOjI4OTQKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICLmm7/mjaLkuLo6IgorCisjLiBleGFjdCBtYXRjaCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE1OTcgZ3VpX21vdGlmLmM6Mjk5NgorbXNnaWQgIk1hdGNoIGV4YWN0IHdvcmQgb25seSIKK21zZ3N0ciAi5Y+q5Yy56YWN5a6M5YWo55u45ZCM55qE5a2XIgorCisjOiBndWlfZ3RrLmM6MTYwOSBndWlfbW90aWYuYzoyOTY0Cittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICLmlrnlkJEiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MTYyMSBndWlfbW90aWYuYzoyOTc2Cittc2dpZCAiVXAiCittc2dzdHIgIuWQkeS4iiIKKworIzogZ3VpX2d0ay5jOjE2MjUgZ3VpX21vdGlmLmM6Mjk4NAorbXNnaWQgIkRvd24iCittc2dzdHIgIuWQkeS4iyIKKworIy4gJ0ZpbmQgTmV4dCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY0NyBndWlfbW90aWYuYzoyNzY2Cittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICLmib7kuIvkuIDkuKoiCisKKyMuICdSZXBsYWNlJyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjY0IGd1aV9tb3RpZi5jOjI3ODMKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICLmm7/mjaIiCisKKyMuICdSZXBsYWNlIEFsbCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY3MyBndWlfbW90aWYuYzoyNzk2Cittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIuabv+aNouWFqOmDqCIKKworIzogZ3VpX2d0a194MTEuYzoxMDc2IGd1aV94MTEuYzoxMTk0Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogPOS4jeiDveaJk+W8gCBYIFNlcnZlciBESVNQTEFZPiIKKworIzogZ3VpX2d0a194MTEuYzoyNDMzIGd1aV94MTEuYzoxOTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzQ6IFVua25vd24gZm9udHNldDogJXMiCittc2dzdHIgIkUyMzQ6IOS4jeato+ehrueahOWtl+espumbhiAoRm9udHNldCk6ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0NjAKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAi5a2X5L2T6YCJ5oupIgorCisjOiBndWlfZ3RrX3gxMS5jOjI3MDIgZ3VpX21hYy5jOjI3ODAgZ3VpX3c0OC5jOjExOTcgZ3VpX3gxMS5jOjE4MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAi5LiN5q2j56Gu55qE5a2X5L2T5ZCN56ewOiAlcyIKKworIzogZ3VpX2d0a194MTEuYzoyNzEzIGd1aV94MTEuYzoxODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogXCIlc1wiIOS4jeaYr+WbuuWumuWuveW6puWtl+S9kyIKKworIzogZ3VpX2d0a194MTEuYzoyODQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDI6IENvbG9yIG5hbWUgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFMjQyOiAlcyDkuLrkuI3og73or4bliKvnmoTpopzoibLlkI3np7AiCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOSB1aS5jOjE5MjkKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICLkvb/nlKggQ1VUX0JVRkZFUjAg5p2l5pu/5o2i56m66YCJ5oupIgorCisjOiBndWlfbW90aWYuYzoxNjAxIGd1aV9tb3RpZi5jOjE2MDQKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIui/h+a7pOWZqCIKKworIzogZ3VpX21vdGlmLmM6MTYwMworbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICLnm67lvZUiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDUKK21zZ2lkICJIZWxwIgorbXNnc3RyICLluK7liqkiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDYKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAi5paH5Lu2IgorCisjOiBndWlfbW90aWYuYzoxNjA4Cittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICLpgInmi6kiCisKKyM6IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJVbmRvIgorbXNnc3RyICLmkqTmtogiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFMjM1OiDkuI3og73miZPlvIAgWmFwIOWtl+S9kyAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTog5LiN6IO95L2/55So5a2X5L2TICVzIgorCisjOiBndWlfcmlzY29zLmM6MTE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBNaXNzaW5nIGNvbG9yOiAlcyIKK21zZ3N0ciAiRTI0Mjog5om+5LiN5Yiw6aKc6ImyOiAlcyIKKworIzogZ3VpX3Jpc2Nvcy5jOjMyNjkKK21zZ2lkICIiCisiXG4iCisiU2VuZGluZyBtZXNzYWdlIHRvIHRlcm1pbmF0ZSBjaGlsZCBwcm9jZXNzLlxuIgorbXNnc3RyICIiCisiXG4iCisi5q2j5Zyo5Y+R6YCB5Lit5pat5a2Q56iL5bqP55qE5L+h5oGvLlxuIgorCisjOiBndWlfdzMyLmM6ODIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiDkuI3mlK/mjIHlj4LmlbAgXCItJXNcIuOAguivt+eUqCBPTEUg54mI5pys44CCIgorCisjOiBndWlfdzQ4LmM6MjA2OAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIuafpeaJvuWtl+espuS4siAo5L2/55SoICdcXFxcJyDmnaXooajnpLogJ1xcJykiCisKKyM6IGd1aV93NDguYzoyMDkzCittc2dpZCAiRmluZCAmIFJlcGxhY2UgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAi5p+l5om+5Y+K5pu/5o2i5a2X56ym5LiyICjkvb/nlKggJ1xcXFwnIOadpeihqOekuiAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE0MTQKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICJWaW0gRTQ1ODog5LiN6IO96YWN572uIGNvbG9yIG1hcCDlr7nosaHvvIzmnInkupvpopzoibLnnIvotbfmnaXkvJrmgKrmgKrnmoQiCisKKyM6IGd1aV94MTEuYzoxOTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBGb250c2V0ICVzIOayoeacieiuvuWumuato+ehrueahOWtl+S9k+S7peS+m+aYvuekuui/meS6m+Wtl+espumbhjoiCisKKyM6IGd1aV94MTEuYzoyMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6IOWtl+S9k+mbhihGb250c2V0KeWQjeensDogJXMiCisKKyM6IGd1aV94MTEuYzoyMDMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQgJyVzJyBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIiclcycg5LiN5piv5Zu65a6a5a695bqm5a2X5L2TIgorCisjOiBndWlfeDExLmM6MjA1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IOWtl+S9k+mbhihGb250c2V0KeWQjeensDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgIuWtl+S9kzA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICLlrZfkvZMxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA1MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250JWQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAi5a2X5L2TJWTlrr3luqbkuI3mmK/lrZfkvZMw55qE5Lik5YCNXG4iCisKKyM6IGd1aV94MTEuYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAi5a2X5L2TMOeahOWuveW6pu+8miVsZFxuIgorCisjOiBndWlfeDExLmM6MjA1NQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisi5a2X5L2TMeWuveW6pjogJWxkXG4iCisiXG4iCisKKyM6IGd1aV94MTEuYzoyMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDog5LiN6IO96YWN572u6aKc6ImyICVzIgorCisjOiBndWlfeDExLmM6MzI1MAorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTog5LiN6IO96K+75Y+WIHNpZ24gZGF0YSEiCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBIYW5ndWwgYXV0b21hdGEg6ZSZ6K+vIgorCisjOiBpZl9jc2NvcGUuYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIiIKKworIzogaWZfY3Njb3BlLmM6NjcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIuaWsOWinuaVsOaNruW6kyIKKworIzogaWZfY3Njb3BlLmM6NjkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICLmn6Xor6LmqKHlvI8iCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIuaYvuekuuatpOS/oeaBryIKKworIzogaWZfY3Njb3BlLmM6NzMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAi57uT5p2f6L+e5o6lIgorCisjOiBpZl9jc2NvcGUuYzo3NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgIumHjeiuvuaJgOaciei/nuaOpSIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJTaG93IGNvbm5lY3Rpb25zIgorbXNnc3RyICLmmL7npLrov57mjqUiCisKKyM6IGlmX2NzY29wZS5jOjEwOAorbXNnaWQgIlRoaXMgY3Njb3BlIGNvbW1hbmQgZG9lcyBub3Qgc3VwcG9ydCBzcGxpdHRpbmcgdGhlIHdpbmRvdy5cbiIKK21zZ3N0ciAi6L+Z5LiqIGNzY29wZSDlkb3ku6TkuI3mlK/mjIHliIblibLlsY/luZVcbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgIueUqOazlTogY3N0YWcgPOivhuWIq+Wtlz4iCisKKyM6IGlmX2NzY29wZS5jOjE5OQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzog5om+5LiN5YiwIHRhZyIKKworIzogaWZfY3Njb3BlLmM6NDA3IGlmX2NzY29wZS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgInN0YXQoJXMpIOmUmeivrzogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQ2MCBpZl9jc2NvcGUuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICLmlrDlop4gY3Njb3BlIOaVsOaNruW6kyAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiJXMg5LiN5piv55uu5b2V5oiWIGNzY29wZSDmlbDmja7lupMiCisKKyM6IGlmX2NzY29wZS5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICLor7vlj5YgY3Njb3BlIOi/nuaOpSAlZCDml7bplJnor68iCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICLmnKrnn6XnmoQgY3Njb3BlIOafpeaJvuW9ouaAgSIKKworIzogaWZfY3Njb3BlLmM6NjgwCittc2dpZCAiQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIuS4jeiDveWIm+W7uuS4jiBjc2NvcGUg6L+e5o6l55qE566h6YGTIgorCisjOiBpZl9jc2NvcGUuYzo3NDUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24g5omn6KGM5aSx6LSlIgorCisjOiBpZl9jc2NvcGUuYzo3NTUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4g5aSx6LSlICh0b19mcCkiCisKKyM6IGlmX2NzY29wZS5jOjc1NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiDlpLHotKUgKGZyX2ZwKSIKKworIzogaWZfY3Njb3BlLmM6Nzg1Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICLmsqHmnIkgY3Njb3BlIOi/nuaOpSIKKworIzogaWZfY3Njb3BlLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTog5om+5LiN5Yiw56ym5ZCIIGNzY29wZSDnmoTmkJzlr7sgJXMgLyAlcyIKKworIzogaWZfY3Njb3BlLmM6ODk5Cittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJjc2NvcGUg5ZG95LukOlxuIgorCisjOiBpZl9jc2NvcGUuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcylcbiIKK21zZ3N0ciAiJS01czogJS0zMHMgKOeUqOazlTogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICLph43lpI3nmoQgY3Njb3BlIOaVsOaNruW6k+acquiiq+WKoOWFpSIKKworIzogaWZfY3Njb3BlLmM6OTgxCittc2dpZCAibWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIuW3sui+vuWIsCBjc2NvcGUg5pyA5aSn6L+e5o6l5pWw55uuIgorCisjOiBpZl9jc2NvcGUuYzoxMTAyCittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiDmib7kuI3liLAgY3Njb3BlIOi/nuaOpSIKKworIzogaWZfY3Njb3BlLmM6MTEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IOaJvuS4jeWIsCBjc2NvcGUg6L+e5o6lICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMTQxCittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gY2xvc2VkIgorbXNnc3RyICJjc2NvcGUg6L+e5o6l5bey5YWz6ZetIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUg6L+e5o6lICVzIOW3suWFs+mXrVxuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjEyOTAKK21zZ2lkICJmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiY3NfbWFuYWdlX21hdGNoZXMg5Lil6YeN6ZSZ6K+vIgorCisjOiBpZl9jc2NvcGUuYzoxMzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6IOivu+WPliBjc2NvcGUg6L+e5o6lICVkIOmUmeivryIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICLkuI3og73kvb/nlKggbWFsbG9jXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIOagh+etvih0YWcpOiAlc1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4Cittc2dpZCAiICAgIyAgIGxpbmUiCittc2dzdHIgIiAgICMgICDooYwgICIKKworIzogaWZfY3Njb3BlLmM6MTQ2MAorbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAi5paH5Lu25ZCNICAgICAvIOS4iuS4i+aWhyAgICAvIOihjOWPt1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNzE4Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIumHjeiuvuaJgOaciSBjc2NvcGUg5pWw5o2u5bqTIgorCisjOiBpZl9jc2NvcGUuYzoxNzg1Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIuayoeaciSBjc2NvcGUg6L+e5o6lXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICDmlbDmja7lupPlkI3np7AgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA85pegPlxuIgorCisjOiBpZl9weXRob24uYzozNzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2Mzog5oqx5q2J77yM6L+Z5Liq5ZG95Luk5LiN6IO95L2/55So77yMUHl0aG9uIOeoi+W6j+W6k+ayoeacieWKoOi9veOAgiIKKworIzogaWZfcHl0aG9uLmM6NTc2Cittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICLkuI3og73liKDpmaQgT3V0cHV0T2JqZWN0IOWxnuaApyIKKworIzogaWZfcHl0aG9uLmM6NTgzCittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIOW/hemcgOaYr+aVtOaVsCIKKworIzogaWZfcHl0aG9uLmM6NTkxCittc2dpZCAiaW52YWxpZCBhdHRyaWJ1dGUiCittc2dzdHIgIuS4jeato+ehrueahOWxnuaApyIKKworIzogaWZfcHl0aG9uLmM6NjMwIGlmX3B5dGhvbi5jOjY0NAorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSDpnIDopoEgc3RyaW5nIGxpc3Qg5b2T5Y+C5pWwIgorCisjOiBpZl9weXRob24uYzo3NzAKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiDkuI3og73liJ3lp4vljJYgSS9PIOWvueixoSIKKworIzogaWZfcHl0aG9uLmM6OTU1IGlmX3RjbC5jOjEzOTEKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIuS4jeato+ehrueahOihqOi+vuW8jyIKKworIzogaWZfcHl0aG9uLmM6OTY5IGlmX3RjbC5jOjEzOTYKK21zZ2lkICJleHByZXNzaW9ucyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIuWboOS4uue8luivkeaXtuayoeacieWKoOWFpeihqOi+vuW8jyhleHByZXNzaW9uKeeahOeoi+W6j+S7o+egge+8jOaJgOS7peS4jeiDveS9v+eUqOihqOi+vuW8jyIKKworIzogaWZfcHl0aG9uLmM6OTgyCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIGJ1ZmZlciIKK21zZ3N0ciAi6K+V5Zu+5L2/55So5bey6KKr5Yig6Zmk55qE57yT5Yay5Yy6IgorCisjOiBpZl9weXRob24uYzo5OTcgaWZfcHl0aG9uLmM6MTAzOCBpZl9weXRob24uYzoxMTAyIGlmX3RjbC5jOjEyMDMKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIuihjOWPt+i2heWHuuiMg+WbtCIKKworIzogaWZfcHl0aG9uLmM6MTIzNQorIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXIg5a+56LGhICjlt7LliKDpmaQpOiAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTMyNiBpZl90Y2wuYzo4MjUKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAi5qCH6K6w5ZCN56ew5LiN5q2j56GuIgorCisjOiBpZl9weXRob24uYzoxNjAxCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIuaXoOatpOe8k+WGsuWMuiIKKworIzogaWZfcHl0aG9uLmM6MTY4OQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgIuivleWbvuS9v+eUqOW3suiiq+WIoOmZpOeahOeql+WPoyIKKworIzogaWZfcHl0aG9uLmM6MTczNAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAi5Y+q6K+75bGe5oCnIgorCisjOiBpZl9weXRob24uYzoxNzQ3Cittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICLlhYnmoIflrprkvY3lnKjnvJPlhrLljLrkuYvlpJYiCisKKyM6IGlmX3B5dGhvbi5jOjE4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKGRlbGV0ZWQpIGF0ICUuOGxYPiIKK21zZ3N0ciAiPOeql+WPo+WvueixoSjlt7LliKDpmaQpOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPOeql+WPo+WvueixoSjmnKrnn6UpOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjznqpflj6MgJWQ+IgorCisjOiBpZl9weXRob24uYzoxOTE0Cittc2dpZCAibm8gc3VjaCB3aW5kb3ciCittc2dzdHIgIuaXoOatpOeql+WPoyIKKworIzogaWZfcHl0aG9uLmM6MjE0NCBpZl9weXRob24uYzoyMTc1IGlmX3B5dGhvbi5jOjIyMjUgaWZfcHl0aG9uLmM6MjI4NQorIzogaWZfcHl0aG9uLmM6MjQwMiBpZl9weXRob24uYzoyNDU0IGlmX3RjbC5jOjY3MyBpZl90Y2wuYzo3MTggaWZfdGNsLmM6NzkyCisjOiBpZl90Y2wuYzo4NjIgaWZfdGNsLmM6MTk4NworbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIuS4jeiDveS/neWtmOWkjeWOn+S/oeaBryIKKworIzogaWZfcHl0aG9uLmM6MjE0NiBpZl9weXRob24uYzoyMjMyIGlmX3B5dGhvbi5jOjIyOTYKK21zZ2lkICJjYW5ub3QgZGVsZXRlIGxpbmUiCittc2dzdHIgIuS4jeiDveWIoOmZpOatpOihjCIKKworIzogaWZfcHl0aG9uLmM6MjE3NyBpZl9weXRob24uYzoyMzEyIGlmX3RjbC5jOjY3OSBpZl90Y2wuYzoyMDA5Cittc2dpZCAiY2Fubm90IHJlcGxhY2UgbGluZSIKK21zZ3N0ciAi5LiN6IO95pu/5o2i5q2k6KGMIgorCisjOiBpZl9weXRob24uYzoyMzI4IGlmX3B5dGhvbi5jOjI0MDQgaWZfcHl0aG9uLmM6MjQ2MgorbXNnaWQgImNhbm5vdCBpbnNlcnQgbGluZSIKK21zZ3N0ciAi5LiN6IO95o+S5YWl5q2k6KGMIgorCisjOiBpZl9weXRob24uYzoyNTY2Cittc2dpZCAic3RyaW5nIGNhbm5vdCBjb250YWluIG5ld2xpbmVzIgorbXNnc3RyICLlrZfnrKbkuLLkuI3og73ljIXlkKvmlrDooYwiCisKKyM6IGlmX3J1YnkuYzozOTQKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiRTI2Njog5q2k5ZG95Luk5LiN6IO95L2/55So77yM5peg5rOV5Yqg6L29IFJ1Ynkg56iL5bqP5bqTKExpYnJhcnkpIgorCisjOiBpZl9ydWJ5LmM6NDU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IOacquefpeeahCBsb25nam1wIOeKtuaAgSAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICLliIfmjaLlrp7njrAv5a6a5LmJIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICLmmL7npLogYmFzZSBjbGFzcyBvZjoiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICLmmL7npLrooqvopobnm5bnmoTmiJDlkZjlh73mlbAiCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIuaBouWkjTog5LuO5paH5Lu2IgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICLmgaLlpI06IOS7juWvueixoSIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICLmgaLlpI06IOS7juaJgOaciemhueebriIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICLmgaLlpI0iCisKKyM6IGlmX3NuaWZmLmM6NzUKK21zZ2lkICJTaG93IHNvdXJjZSBvZiIKK21zZ3N0ciAi5pi+56S65rqQ5Luj56CBOiAiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAi5p+l5om+IHN5bWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAi5rWP6KeIIGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjc4Cittc2dpZCAiU2hvdyBjbGFzcyBpbiBoaWVyYXJjaHkiCittc2dzdHIgIuaYvuekuuWxguasoeWFs+ezu+eahOexuyIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIuaYvuekuiByZXN0cmljdGVkIOWxguasoeWFs+ezu+eahCBjbGFzcyIKKworIzogaWZfc25pZmYuYzo4MAorbXNnaWQgIlhyZWYgcmVmZXJzIHRvIgorbXNnc3RyICJYcmVmIOWPguiAg+WIsCIKKworIzogaWZfc25pZmYuYzo4MQorbXNnaWQgIlhyZWYgcmVmZXJyZWQgYnkiCittc2dzdHIgIlhyZWYg6KKr6LCB5Y+C6ICDOiIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYg5pyJIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmIOiiq+iwgeS9v+eUqDoiCisKKyM6IGlmX3NuaWZmLmM6ODQKK21zZ2lkICJTaG93IGRvY3Ugb2YiCittc2dzdHIgIuaYvuekuuaWh+S7tjogIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIuS6p+eUn+aWh+S7tjogIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICLkuI3og73ov57mjqXliLAgU05pRkYr44CC6K+35qOA5p+l546v5aKD5Y+Y6YePICgkUEFUSCDph4zlv4XpnIDlj6/ku6Xmib7liLAgc25pZmZlbWFjcylcbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6IOivu+WPlumUmeivry4g5Y+W5raI6L+e5o6lIgorCisjOiBpZl9zbmlmZi5jOjU1MworbXNnaWQgIlNOaUZGKyBpcyBjdXJyZW50bHkgIgorbXNnc3RyICJTTmlGRisg55uu5YmNIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIuacqiIKKworIzogaWZfc25pZmYuYzo1NTYKK21zZ2lkICJjb25uZWN0ZWQiCittc2dzdHIgIui/nuaOpeS4rSIKKworIzogaWZfc25pZmYuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3NTogVW5rbm93biBTTmlGRisgcmVxdWVzdDogJXMiCittc2dzdHIgIkUyNzU6IOS4jeato+ehrueahCBTTmlmZisg6LCD55SoOiAlcyIKKworIzogaWZfc25pZmYuYzo2MDUKK21zZ2lkICJFMjc2OiBFcnJvciBjb25uZWN0aW5nIHRvIFNOaUZGKyIKK21zZ3N0ciAiRTI3Njog6L+e5o6l5YiwIFNOaUZGKyDlpLHotKUiCisKKyM6IGlmX3NuaWZmLmM6MTAxMAorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiDmnKrov57mjqXliLAgU05pRkYrIgorCisjOiBpZl9zbmlmZi5jOjEwMTkKK21zZ2lkICJFMjc5OiBOb3QgYSBTTmlGRisgYnVmZmVyIgorbXNnc3RyICJFMjc5OiDkuI3mmK8gU05pRkYrIOeahOe8k+WGsuWMuiIKKworIzogaWZfc25pZmYuYzoxMDg0Cittc2dpZCAiU25pZmY6IEVycm9yIGR1cmluZyB3cml0ZS4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJTbmlmZjog5YaZ5YWl6ZSZ6K+v44CC57uT5p2f6L+e5o6lIgorCisjOiBpZl90Y2wuYzo0MDcKK21zZ2lkICJpbnZhbGlkIGJ1ZmZlciBudW1iZXIiCittc2dzdHIgIuS4jeato+ehrueahOe8k+WGsuWMuuWPtyIKKworIzogaWZfdGNsLmM6NDUzIGlmX3RjbC5jOjkyMCBpZl90Y2wuYzoxMDk5Cittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAi5bCa5pyq5a6e546wIgorCisjOiBpZl90Y2wuYzo0OTAKK21zZ2lkICJ1bmtub3duIG9wdGlvbiIKK21zZ3N0ciAi5LiN5q2j56Gu55qE6YCJ6aG5IgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc2MworbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAi5LiN6IO96K6+5a6a6KGMIgorCisjOiBpZl90Y2wuYzo4MzQKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIuayoeacieiuvuWumuagh+iusCIKKworIzogaWZfdGNsLmM6ODQwIGlmX3RjbC5jOjEwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAi5YiXICVkIOihjCAlZCIKKworIzogaWZfdGNsLmM6ODcwCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAi5LiN6IO95o+S5YWl5oiW5re75Yqg5q2k6KGMIgorCisjOiBpZl90Y2wuYzoxMjU3Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIumUmeivr+eahOagh+W/lzogIgorCisjOiBpZl90Y2wuYzoxMzI3Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIuS4jeato+ehrueahCBWSU0g6YCJ6aG5IgorCisjOiBpZl90Y2wuYzoxNDEyCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICLplK7nm5jkuK3mlq0iCisKKyM6IGlmX3RjbC5jOjE0MTcKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgInZpbSDplJnor68iCisKKyM6IGlmX3RjbC5jOjE0NjAKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIuS4jeiDveWIm+W7uue8k+WGsuWMui/nqpflj6Plkb3ku6Q6IOWvueixoeWwhuiiq+WIoOmZpCIKKworIzogaWZfdGNsLmM6MTUzNAorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIuS4jeiDveazqOWGjCBjYWxsYmFjayDlkb3ku6Q6IOe8k+WGsuWMui/nqpflj6Plt7Lnu4/ooqvliKDpmaTkuoYiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTUxCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIkUyODA6IFRDTCDkuKXph43plJnor686IHJlZmxpc3Qg5LiN5Y+v6Z2gIT8g6K+35oql5ZGK57uZIHRvIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTU1MgorbXNnaWQgImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIuS4jeiDveazqOWGjCBjYWxsYmFjayDlkb3ku6Q6IOaJvuS4jeWIsOe8k+WGsuWMui/nqpflj6MiCisKKyM6IGlmX3RjbC5jOjE3MTMKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIuatpOWRveS7pOS4jeiDveS9v+eUqCwg5Zug5Li65peg5rOV5Yqg6L29IFRjbCDnqIvluo/lupMoTGlicmFyeSkiCisKKyM6IGlmX3RjbC5jOjE4NzUKK21zZ2lkICIiCisiRTI4MTogVENMIEVSUk9SOiBleGl0IGNvZGUgaXMgbm90IGludCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS5vcmciCittc2dzdHIgIkUyODE6IFRDTCDplJnor686IOmAgOWHuui/lOWbnuWAvOS4jeaYr+aVtOaVsCE/IOivt+aKpeWRiue7mSB0byB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjE5OTUKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIuS4jeiDveWPluW+l+atpOihjCIKKworIzogaWZfeGNtZHNydi5jOjIwNAorbXNnaWQgIlVuYWJsZSB0byByZWdpc3RlciBhIGNvbW1hbmQgc2VydmVyIG5hbWUiCittc2dzdHIgIuS4jeiDveazqOWGjOWRveS7pOacjeWKoeWZqOWQjeensCIKKworIzogaWZfeGNtZHNydi5jOjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IOayoeacieazqOWGjOS4uiBcIiVzXCIg55qE5pyN5Yqh5ZmoIgorCisjOiBpZl94Y21kc3J2LmM6NDQ2Cittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODog5LiN6IO96YCB5Ye65ZG95Luk5Yiw55uu55qE5Zyw56iL5bqPIgorCisjOiBpZl94Y21kc3J2LmM6NzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICLkuI3mraPnoa7nmoTmnI3liqHlmaggaWQgOiAlcyIKKworIzogaWZfeGNtZHNydi5jOjEwNTYKK21zZ2lkICJFMjQ5OiBjb3VsZG4ndCByZWFkIFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSIKK21zZ3N0ciAiRTI0OTog5LiN6IO96K+75Y+WIFZJTSDnmoQg5rOo5YaM6KGo5bGe5oCnIgorCisjOiBpZl94Y21kc3J2LmM6MTA2NworbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNIOeahOazqOWGjOihqOWxnuaAp+acieivr+OAguW3suWIoOmZpOOAgiIKKworIzogbWFpbi5jOjUzIG9wdGlvbi5jOjMxNjIgb3B0aW9uLmM6MzI2OQorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICLkuI3mraPnoa7nmoTpgInpobkiCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICLlpKrlpJrnvJbovpHlj4LmlbAiCisKKyM6IG1haW4uYzo1NworbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIue8uuWwkeW/heimgeeahOWPguaVsDoiCisKKyM6IG1haW4uYzo1OQorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICLkuI3og73ovqjorqTmraTpgInpobnlkI7nmoTlkb3ku6Q6ICIKKworIzogbWFpbi5jOjYxCittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiIG9yIFwiLWMgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAi5aSq5aSaIFwiK2NvbW1hbmRcIiDmiJYgXCItYyBjb21tYW5kXCIg5Y+C5pWwIgorCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAi5LiN5q2j56Gu55qE5Y+C5pWwOiAiCisKKyM6IG1haW4uYzo0MzYKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIuaCqOeahCBWaW0g57yW6K+R5pe25rKh5pyJ5Yqg5YWlIGRpZmYg55qE6IO95YqbIgorCisjOiBtYWluLmM6ODU4Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAi6K+V5Zu+5YaN5qyh5omT5byAIHNjcmlwdCDmlofku7Y6IFwiIgorCisjOiBtYWluLmM6ODYyIG1haW4uYzo4NjkgbWFpbi5jOjkxMyBtZW1saW5lLmM6MzY3MyBtZW1saW5lLmM6MzY3NworIzogdmVyc2lvbi5jOjgxNiB2ZXJzaW9uLmM6ODIxIHZlcnNpb24uYzo4MjYgdmVyc2lvbi5jOjgzMSB2ZXJzaW9uLmM6ODM2CisjOiB2ZXJzaW9uLmM6ODQxIHZlcnNpb24uYzo4NDcgdmVyc2lvbi5jOjg1MSB2ZXJzaW9uLmM6ODU1IHZlcnNpb24uYzo4NjAKKyM6IHZlcnNpb24uYzo4NjcgdmVyc2lvbi5jOjg3NSB2ZXJzaW9uLmM6ODgxCittc2dpZCAiXCJcbiIKK21zZ3N0ciAiXCJcbiIKKworIzogbWFpbi5jOjg2NworbXNnaWQgIkNhbm5vdCBvcGVuIGZvciByZWFkaW5nOiBcIiIKK21zZ3N0ciAi5LiN6IO95Li66K+76ICM5omT5byAOiBcIiIKKworIzogbWFpbi5jOjkxMQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAi5LiN6IO95Li6IHNjcmlwdCDovpPlh7rogIzmiZPlvIA6IFwiIgorCisjOiBtYWluLmM6MTAyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIui/mOaciSAlZCDkuKrmlofku7bnrYnlvoXnvJbovpFcbiIKKworIzogbWFpbi5jOjEwOTQKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IOazqOaEjzog6L6T5Ye65LiN5piv57uI56uvKOWxj+W5lSlcbiIKKworIzogbWFpbi5jOjEwOTYKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDms6jmhI86IOi+k+WFpeS4jeaYr+e7iOerryjplK7nm5gpXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE3MQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyDlkb3ku6TooYwiCisKKyM6IG1haW4uYzoxMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiDkuI3og73or7vlj5bmlofku7YgXCIlc1wiIgorCisjOiBtYWluLmM6MjE1NworbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisi5p+l6K+i5pu05aSa5L+h5oGv6K+35omn6KGMOiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMTkwCittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIlvmlofku7YgLi5dICAgICAgIOe8lui+keaMh+WumueahOaWh+S7tiIKKworIzogbWFpbi5jOjIxOTEKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICDku47moIflh4bovpPlhaUoc3RkaW4p6K+75Y+W5paH5pysIgorCisjOiBtYWluLmM6MjE5MgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHRhZyAgICAgICAgICDnvJbovpHml7bkvb/nlKjmjIflrprnmoQgdGFnIgorCisjOiBtYWluLmM6MjE5NAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2Vycm9yZmlsZV0gIOe8lui+keaXtuWKoOi9veesrOS4gOS4qumUmeivryIKKworIzogbWFpbi5jOjIyMDMKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiIOeUqOazlToiCisKKyM6IG1haW4uYzoyMjA2Cittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgInZpbSBb5Y+C5pWwXSAiCisKKyM6IG1haW4uYzoyMjEwCittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIOaIljoiCisKKyM6IG1haW4uYzoyMjEzCittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIuWPguaVsDpcbiIKKworIzogbWFpbi5jOjIyMTQKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdOWPquacieWcqOi/meS5i+WQjueahOaWh+S7tiIKKworIzogbWFpbi5jOjIyMTYKK21zZ2lkICItcmVnaXN0ZXJcdFx0UmVnaXN0ZXIgdGhpcyBndmltIGZvciBPTEUiCittc2dzdHIgIi1yZWdpc3Rlclx0XHTms6jlhowgZ3ZpbSDliLAgT0xFIgorCisjOiBtYWluLmM6MjIxNworbXNnaWQgIi11bnJlZ2lzdGVyXHRcdFVucmVnaXN0ZXIgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItdW5yZWdpc3Rlclx0XHTlj5bmtoggT0xFIOS4reeahCBndmltIOazqOWGjCIKKworIzogbWFpbi5jOjIyMjAKK21zZ2lkICItZ1x0XHRcdFJ1biB1c2luZyBHVUkgKGxpa2UgXCJndmltXCIpIgorbXNnc3RyICItZ1x0XHRcdOS9v+eUqOWbvuW9oueVjOmdoiAo5ZCMIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjIyMjEKK21zZ2lkICItZlx0XHRcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mXHRcdFx05YmN5pmvOiDlkK/liqjlm77lvaLnlYzpnaLml7bkuI0gZm9yayIKKworIzogbWFpbi5jOjIyMjMKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaSDmqKHlvI8gKOWQjCBcInZpXCIpIgorCisjOiBtYWluLmM6MjIyNAorbXNnaWQgIi1lXHRcdFx0RXggbW9kZSAobGlrZSBcImV4XCIpIgorbXNnc3RyICItZVx0XHRcdEV4IOaooeW8jyAo5ZCMIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjI1Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdOWuiemdmSAoYmF0Y2gpIOaooeW8jyAo5Y+q6IO95LiOIFwiZXhcIiDkuIDotbfkvb/nlKgpIgorCisjOiBtYWluLmM6MjIyNworbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmIOaooeW8jyAo5ZCMIFwidmltZGlmZlwiLCDlj6/ov4XpgJ/mr5TovoPkuKTmlofku7bkuI3lkIzlpIQpIgorCisjOiBtYWluLmM6MjIyOQorbXNnaWQgIi15XHRcdFx0RWFzeSBtb2RlIChsaWtlIFwiZXZpbVwiLCBtb2RlbGVzcykiCittc2dzdHIgIi15XHRcdFx0566A5piT5qih5byPICjlkIwgXCJldmltXCIsIG1vZGVsZXNzKSIKKworIzogbWFpbi5jOjIyMzAKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdOWPquivu+aooeW8jyAo5ZCMIFwidmlld1wiKSIKKworIzogbWFpbi5jOjIyMzEKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx06ZmQ5Yi25qih5byPICjlkIwgXCJydmltXCIpIgorCisjOiBtYWluLmM6MjIzMgorbXNnaWQgIi1tXHRcdFx0TW9kaWZpY2F0aW9ucyAod3JpdGluZyBmaWxlcykgbm90IGFsbG93ZWQiCittc2dzdHIgIi1tXHRcdFx05LiN5Y+v5L+u5pS5ICjlhpnlhaXmlofku7YpIgorCisjOiBtYWluLmM6MjIzMworbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdOaWh+acrOS4jeWPr+S/ruaUuSIKKworIzogbWFpbi5jOjIyMzQKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdOS6jOi/m+WItuaooeW8jyIKKworIzogbWFpbi5jOjIyMzYKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwIOaooeW8jyIKKworIzogbWFpbi5jOjIyMzgKK21zZ2lkICItQ1x0XHRcdENvbXBhdGlibGUgd2l0aCBWaTogJ2NvbXBhdGlibGUnIgorbXNnc3RyICItQ1x0XHRcdCdjb21wYXRpYmxlJyDkvKDnu58gVmkg5YW85a655qih5byPIgorCisjOiBtYWluLmM6MjIzOQorbXNnaWQgIi1OXHRcdFx0Tm90IGZ1bGx5IFZpIGNvbXBhdGlibGU6ICdub2NvbXBhdGlibGUnIgorbXNnc3RyICItTlx0XHRcdCdub2NvbXBhdGlibGUnIOS4jeWujOWFqOS4juS8oOe7nyBWaSDlhbzlrrnvvIzlj6/kvb/nlKggVmltIOWKoOW8uuiDveWKmyIKKworIzogbWFpbi5jOjIyNDAKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0XHRWZXJib3NlIOetiee6pyIKKworIzogbWFpbi5jOjIyNDEKK21zZ2lkICItRFx0XHRcdERlYnVnZ2luZyBtb2RlIgorbXNnc3RyICItRFx0XHRcdOiwg+ivleaooeW8jyIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdOS4jeS9v+eUqOS6pOaNouaWh+S7tiwg5Y+q5L2/55So5YaF5a2YIgorCisjOiBtYWluLmM6MjI0MworbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdOWIl+WHuuS6pOaNouaWh+S7tuWQjumAgOWHuiIKKworIzogbWFpbi5jOjIyNDQKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKOWKoOaWh+S7tuWQjSkgICAgICAgXHTmgaLlpI3kuIrmrKHltKnmuoPnmoTotYTmlpkoUmVjb3ZlciBjcmFzaGVkIHNlc3Npb24pIgorCisjOiBtYWluLmM6MjI0NQorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHTkuI4gLXIg5LiA5qC3IgorCisjOiBtYWluLmM6MjI0NworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHTkuI3kvb/nlKggbmV3Y2xpIOadpeaJk+W8gOeql+WPoyIKKworIzogbWFpbi5jOjIyNDgKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDxkZXZpY2U+XHRcdOS9v+eUqCA8ZGV2aWNlPiDlgZrovpPlhaXovpPlh7rorr7lpIciCisKKyM6IG1haW4uYzoyMjUxCittc2dpZCAiLUhcdFx0XHRzdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHTlkK/liqjkuLog5biM5Lyv6I6x5qih5byPIgorCisjOiBtYWluLmM6MjI1NAorbXNnaWQgIi1GXHRcdFx0c3RhcnQgaW4gRmFyc2kgbW9kZSIKK21zZ3N0ciAiLUZcdFx0XHTlkK/liqjkuLogRmFyc2kg5qih5byPIgorCisjOiBtYWluLmM6MjI1NgorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdOiuvuWumue7iOerr+S4uiA8dGVybWluYWw+IgorCisjOiBtYWluLmM6MjI1NworbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRcdOS9v+eUqCA8dmltcmM+IOabv+aNouS7u+S9lSAudmltcmMiCisKKyM6IG1haW4uYzoyMjU5Cittc2dpZCAiLVUgPGd2aW1yYz5cdFx0VXNlIDxndmltcmM+IGluc3RlYWQgb2YgYW55IC5ndmltcmMiCittc2dzdHIgIi1VIDxndmltcmM+XHRcdOS9v+eUqCA8Z3ZpbXJjPiDmm7/mjaLku7vkvZUgLmd2aW1yYyIKKworIzogbWFpbi5jOjIyNjEKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx05LiN5Yqg6L295Lu75L2VIHBsdWdpbiIKKworIzogbWFpbi5jOjIyNjIKK21zZ2lkICItb1tOXVx0XHRPcGVuIE4gd2luZG93cyAoZGVmYXVsdDogb25lIGZvciBlYWNoIGZpbGUpIgorbXNnc3RyICItb1tOXVx0XHTmiZPlvIAgTiDkuKrnqpflj6MgKOmihOiuvuaYr+avj+S4quaWh+S7tuS4gOS4qikiCisKKyM6IG1haW4uYzoyMjYzCittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx05ZCMIC1vIOS9huS9v+eUqOWeguebtOWIhuWJsiIKKworIzogbWFpbi5jOjIyNjQKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHTlkK/liqjlkI7ot7PliLDmlofku7bnu5PlsL4iCisKKyM6IG1haW4uYzoyMjY1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHTlkK/liqjlkI7ot7PliLDnrKwgPGxudW0+IOihjCIKKworIzogbWFpbi5jOjIyNjcKK21zZ2lkICItLWNtZCA8Y29tbWFuZD5cdEV4ZWN1dGUgPGNvbW1hbmQ+IGJlZm9yZSBsb2FkaW5nIGFueSB2aW1yYyBmaWxlIgorbXNnc3RyICItLWNtZCA8Y29tbWFuZD5cdOWKoOi9veS7u+S9lSB2aW1yYyDliY3miafooYwgPGNvbW1hbmQ+IgorCisjOiBtYWluLmM6MjI2OQorbXNnaWQgIi1jIDxjb21tYW5kPlx0XHRFeGVjdXRlIDxjb21tYW5kPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItYyA8Y29tbWFuZD5cdFx05Yqg6L2956ys5LiA5Liq5paH5Lu25ZCO5omn6KGMIDxjb21tYW5kPiIKKworIzogbWFpbi5jOjIyNzAKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNzaW9uPlx0XHTliqDovb3nrKzkuIDkuKrmlofku7blkI7ovb3lhaUgU2Vzc2lvbiDmlofku7Y8c2Vzc2lvbj4iCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdGluPlx05LuOIDxzY3JpcHRpbj4g6K+75YWl5LiA6Iis5qih5byP5ZG95LukIgorCisjOiBtYWluLmM6MjI3MgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxzY3JpcHRvdXQ+XHTlr7nmlofku7YgPHNjcmlwdG91dD4g6ZmE5YqgKGFwcGVuZCnmiYDmnInovpPlhaXnmoTlkb3ku6QiCisKKyM6IG1haW4uYzoyMjczCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx05a+55paH5Lu2IDxzY3JpcHRvdXQ+IOWGmeWFpeaJgOaciei+k+WFpeeahOWRveS7pCIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdOe8lui+kee8lueggei/h+eahOaWh+S7tiIKKworIzogbWFpbi5jOjIyNzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHTlsIYgdmltIOS4juaMh+WumueahCBYLXNlcnZlciDov57mjqUiCisKKyM6IG1haW4uYzoyMjgxCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHTkuI3opoHov57mjqXliLAgWCBTZXJ2ZXIiCisKKyM6IG1haW4uYzoyMjgzCittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx05Zyo5Y+m5LiA5LiqIEdUSyDnu4Tku7blhoXmiZPlvIAgVmltIgorCisjOiBtYWluLmM6MjI4NworbXNnaWQgIi0tcmVtb3RlIDxmaWxlcz5cdEVkaXQgPGZpbGVzPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlIDxmaWxlcz5cdOe8lui+kSBWaW0g5pyN5Yqh5Zmo5LiK55qE5paH5Lu25bm26YCA5Ye6IgorCisjOiBtYWluLmM6MjI4OAorbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0IDxmaWxlcz4gIEFzIC0tcmVtb3RlIGJ1dCB3YWl0IGZvciBmaWxlcyB0byBoYXZlIGJlZW4gZWRpdGVkIgorbXNnc3RyICItLXJlbW90ZS13YWl0IDxmaWxlcz4g562J5pWI5LqOIC0tcmVtb3RlLCDkvYbkvJrnrYnlgJnmlofku7blrozmiJDnvJbovpEiCisKKyM6IG1haW4uYzoyMjg5Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdOmAgeWHuiA8a2V5cz4g5YiwIFZpbSDmnI3liqHlmajlubbpgIDlh7oiCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdOWcqOacjeWKoeWZqOS4iuaxguihqOi+vuW8j+eahOWAvOW5tuaJk+WNsOe7k+aenCIKKworIzogbWFpbi5jOjIyOTEKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdOWIl+WHuuWPr+eUqOeahCBWaW0g5pyN5Yqh5Zmo5ZCN56ew5bm26YCA5Ye6IgorCisjOiBtYWluLmM6MjI5MgorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx06YCB6IezL+aIkOS4uiBWaW0g5pyN5Yqh5ZmoIDxuYW1lPiIKKworIzogbWFpbi5jOjIyOTUKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx05L2/55SoIDx2aW1pbmZvPiDogIzpnZ4gLnZpbWluZm8iCisKKyM6IG1haW4uYzoyMjk3Cittc2dpZCAiLWhcdFx0XHRwcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaFx0XHRcdOaJk+WNsOivtOaYjijkuZ/lsLHmmK/mnKzkv6Hmga8p5ZCO6YCA5Ye6IgorCisjOiBtYWluLmM6MjI5OAorbXNnaWQgIi0tdmVyc2lvblx0XHRwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IgorbXNnc3RyICItLXZlcnNpb25cdFx05omT5Y2w54mI5pys5L+h5oGv5ZCO6YCA5Ye6IgorCisjOiBtYWluLmM6MjMwMgorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChNb3RpZiB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0g5Y+v6K+G5Yir55qE5Y+C5pWwIChNb3RpZiDniYgpOlxuIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIOWPr+ivhuWIq+eahOWPguaVsCAoQXRoZW5hIOeJiCk6XG4iCisKKyM6IG1haW4uYzoyMzA4Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHTlnKjnqpflj6MgPGRpc3BsYXk+IOaJp+ihjCB2aW0iCisKKyM6IG1haW4uYzoyMzA5Cittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdOWQr+WKqOWQjuacgOWwj+WMlihpY29uaWZpZWQpIgorCisjOiBtYWluLmM6MjMxMQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYW1lPlx0XHTor7vlj5YgUmVzb3VyY2Ug5pe25oqKIHZpbSDnmoTlkI3np7Dop4bkuLogPG5hbWU+IgorCisjOiBtYWluLmM6MjMxMgorbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKOWwmuacquWunueOsClcbiIKKworIzogbWFpbi5jOjIzMTQKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdOiuvuWumiA8Y29sb3I+IOS4uuiDjOaZr+iJsiAo5Lmf5Y+v55SoIC1iZykiCisKKyM6IG1haW4uYzoyMzE1Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8Y29sb3I+XHTorr7lrpogPGNvbG9yPiDkuLrkuIDoiKzmloflrZfpopzoibIgKOS5n+WPr+eUqCAtZmcpIgorCisjOiBtYWluLmM6MjMxNiBtYWluLmM6MjMzNgorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnQ+XHTkvb/nlKggPGZvbnQ+IOS4uuS4gOiIrOWtl+S9kyAo5Lmf5Y+v55SoIC1mbikiCisKKyM6IG1haW4uYzoyMzE3Cittc2dpZCAiLWJvbGRmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgYm9sZCB0ZXh0IgorbXNnc3RyICItYm9sZGZvbnQgPGZvbnQ+XHTkvb/nlKggPGZvbnQ+IOS4uueyl+S9k+Wtl+S9kyIKKworIzogbWFpbi5jOjIzMTgKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8Zm9udD5cdOS9v+eUqCA8Zm9udD4g5Li65pac5L2T5a2X5L2TIgorCisjOiBtYWluLmM6MjMxOSBtYWluLmM6MjMzNworbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tPlx05L2/55SoPGdlb20+5Li65Yid5aeL5L2N572uICjkuZ/lj6/nlKggLWdlb20pIgorCisjOiBtYWluLmM6MjMyMAorbXNnaWQgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHRVc2UgYSBib3JkZXIgd2lkdGggb2YgPHdpZHRoPiAoYWxzbzogLWJ3KSIKK21zZ3N0ciAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdOS9v+eUqOWuveW6puS4uiA8d2lkdGg+IOeahOi+ueahhiAo5Lmf5Y+v55SoIC1idykiCisKKyM6IG1haW4uYzoyMzIxCittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiDorr7lrprmu5rliqjmnaHlrr3luqbkuLogPHdpZHRoPiAo5Lmf5Y+v55SoIC1zdykiCisKKyM6IG1haW4uYzoyMzIzCittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdOiuvuWumuiPnOWNleWIl+eahOmrmOW6puS4uiA8aGVpZ2h0PiAo5Lmf5Y+v55SoIC1taCkiCisKKyM6IG1haW4uYzoyMzI1IG1haW4uYzoyMzM4Cittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdOS9v+eUqOWPjeaYviAo5Lmf5Y+v55SoIC1ydikiCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdOS4jeS9v+eUqOWPjeaYviAo5Lmf5Y+v55SoICtydikiCisKKyM6IG1haW4uYzoyMzI3Cittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHTorr7lrprmjIflrprnmoTotYTmupAiCisKKyM6IG1haW4uYzoyMzMwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIOWPr+ivhuWIq+eahOWPguaVsCAoUklTQyBPUyDniYgpOlxuIgorCisjOiBtYWluLmM6MjMzMQorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxudW1iZXI+XHTnqpflj6PliJ3lp4vlrr3luqYiCisKKyM6IG1haW4uYzoyMzMyCittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1iZXI+XHTnqpflj6PliJ3lp4vpq5jluqYiCisKKyM6IG1haW4uYzoyMzM1Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIOWPr+ivhuWIq+eahOWPguaVsCAoR1RLKyDniYgpOlxuIgorCisjOiBtYWluLmM6MjMzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx05ZyoIDxkaXNwbGF5PiDmiafooYwgdmltICjkuZ/lj6/nlKggLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLWhlbHBcdFx0U2hvdyBHbm9tZSBhcmd1bWVudHMiCittc2dzdHIgIi0taGVscFx0XHTmmL7npLogR25vbWUg55u45YWz5Y+C5pWwIgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6MjU2NgorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIuWPkemAgeihqOi+vuW8j+Wksei0peOAglxuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI1NzEKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiIgorIlxuIgorIumAgeWHuuWksei0peOAguivleWbvuWcqOacrOWcsOaJp+ihjFxuIgorCisjOiBtYWluLmM6MjYwNCBtYWluLmM6MjYyNQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBvZiAlZCBlZGl0ZWQiCittc2dzdHIgIiVkIOS4rSAlZCDlt7LnvJbovpEiCisKKyM6IG1haW4uYzoyNjQ4Cittc2dpZCAiU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAi5Y+R6YCB6KGo6L6+5byP5aSx6LSl44CCXG4iCisKKyM6IG1hcmsuYzo2NTUKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIuayoeacieiuvuWumuagh+iusCAobWFyaykiCisKKyM6IG1hcmsuYzo2NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiDmib7kuI3liLDnrKblkIggXCIlc1wiIOeahOagh+iusChtYXJrKSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjY4Cittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIuagh+iusCDooYzlj7cgIOWIlyAg5paH5Lu2L+aWh+acrCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzA2Cittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIg6Lez5YiwIOihjOWPtyAg5YiXICDmlofku7Yv5paH5pysIgorCisjOiBtYXJrLmM6MTA2OAorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIOaWh+S7tuagh+iusDpcbiIKKworIy4gV3JpdGUgdGhlIGp1bXBsaXN0IHdpdGggLScKKyM6IG1hcmsuYzoxMTAzCittc2dpZCAiIgorIlxuIgorIiMgSnVtcGxpc3QgKG5ld2VzdCBmaXJzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIEp1bXBsaXN0ICjku47mlrDliLDml6cpOlxuIgorCisjOiBtYXJrLmM6MTE5OAorbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg5paH5Lu25YaF5Y6G5Y+y6K6w5b2VICjku47mlrDliLDml6cpOlxuIgorCisjOiBtYXJrLmM6MTI4MQorbXNnaWQgIk1pc3NpbmcgJz4nIgorbXNnc3RyICLnvLrlsJHlr7nlupTnmoQgJz4nIgorCisjOiBtYnl0ZS5jOjM5NQorbXNnaWQgIk5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICLkuI3mraPnoa7nmoTku6PnoIHpobUiCisKKyM6IG1ieXRlLmM6MzAwNQorbXNnaWQgIkUyODQ6IENhbm5vdCBzZXQgSUMgdmFsdWVzIgorbXNnc3RyICJFMjg0OiDkuI3og73orr7lrpogSUMg5pWw5YC8IgorCisjOiBtYnl0ZS5jOjMxNTcKK21zZ2lkICJFMjg1OiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IGNvbnRleHQiCittc2dzdHIgIkUyODU6IOS4jeiDveWIm+W7uui+k+WFpeS4iuS4i+aWhyIKKworIzogbWJ5dGUuYzozMzA0Cittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiDkuI3og73miZPlvIDovpPlhaXms5UiCisKKyM6IG1ieXRlLmM6MzMxNQorbXNnaWQgIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIKK21zZ3N0ciAiRTI4Nzog6K2m5ZGKOiDkuI3og73np7vpmaQgSU0g55qEIGNhbGxiYWNrIgorCisjOiBtYnl0ZS5jOjMzMjEKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODog6L6T5YWl5rOV5LiN5pSv5oyB5Lu75L2VIHN0eWxlIgorCisjOiBtYnl0ZS5jOjMzNzgKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTog6L6T5YWl5rOV5LiN5pSv5oyB5Lu75L2VIHN0eWxlIgorCisjOiBtYnl0ZS5jOjM0NTIKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IG92ZXItdGhlLXNwb3Qg6ZyA6KaB5a2X5L2T6ZuGKEZvbnRzZXQpIgorCisjOiBtYnl0ZS5jOjM0ODAKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IOS9oOeahCBHVEsrIOavlCAxLjIuMyDogIHjgILkuI3og73kvb/nlKjnirbmgIHljLrjgIIiCisKKyM6IG1ieXRlLmM6MzcxNworbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IOi+k+WFpeazleeuoeeQhueoi+W6jyhJbnB1dCBNZXRob2QgU2VydmVyKeacqui/kOihjCIKKworIzogbWVtZmlsZS5jOjQ3MworbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiDlnZfmnKrooqvplIHlrpoiCisKKyM6IG1lbWZpbGUuYzo5NzIKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiDkuqTmjaLmlofku7bor7vlj5bplJnor68iCisKKyM6IG1lbWZpbGUuYzo5NzcKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTog5Lqk5o2i5paH5Lu26K+75Y+W6ZSZ6K+vIgorCisjOiBtZW1maWxlLmM6MTAyOQorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiDkuqTmjaLmlofku7blhpnlhaXplJnor68iCisKKyM6IG1lbWZpbGUuYzoxMDQ3Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiDkuqTmjaLmlofku7blhpnlhaXplJnor68iCisKKyM6IG1lbWZpbGUuYzoxMjQ0Cittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiDkuqTmjaLmlofku7blt7Lnu4/lrZjlnKghICjlsI/lv4PnrKblj7fov57nu5PnmoTlronlhajmvI/mtJ4hPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDlnZcgMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDlnZcgMT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDlnZcgMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IOWZouWZoiwg5Lqk5o2i5paH5Lu25LiN6KeB5LqGISEhIgorCisjOiBtZW1saW5lLmM6NDQ4Cittc2dpZCAiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDI6IOS4jeiDveaUueWPmOS6pOaNouaWh+S7tueahOWQjeensCIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzog5LiN6IO95omT5byA5Lqk5o2i5paH5Lu2IFwiJXNcIiwg5LiN5Y+v6IO95oGi5aSN5LqGIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiDmib7kuI3liLDlnZcgMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IOaJvuS4jeWIsCAlcyDnmoTkuqTmjaLmlofku7YiCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICLor7fpgInmi6nkvaDopoHkvb/nlKjnmoTkuqTmjaLmlofku7YgKOaMiTAg6YCA5Ye6KTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiDkuI3og73miZPlvIAgJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICLkuI3og73or7vlj5blnZcgMDoiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisi5Y+v6IO95L2g5rKh5YGa6L+H5Lu75L2V5L+u5pS55oiW5pivIFZpbSDov5jmnaXkuI3lj4rmm7TmlrDkuqTmjaLmlofku7YuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIg5LiN6IO95Zyo5pys54mI5pys55qEIFZpbSDkuK3kvb/nlKguXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICLkvb/nlKggVmltIDMuMOOAglxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIOeci+i1t+adpeS4jeWDj+aYryBWaW0g5Lqk5o2i5paH5Lu2IgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiDkuI3og73lnKjov5nlj7DnlLXohJHkuIrkvb/nlKguXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIuacrOaWh+S7tuWIm+W7uuS6jiAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIuaIluaYr+i/meaWh+S7tuW3suiiq+egtOWdj+OAgiIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICLkvb/nlKjkuqTmjaLmlofku7YgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICLljp/mlofku7YgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTM0Cittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IOitpuWRijog5Y6f5aeL5paH5Lu25Y+v6IO95bey57uP5L+u5pS56L+H5LqGIgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTog5LiN6IO95LuOICVzIOivu+WPluWdlyAxIgorCisjOiBtZW1saW5lLmM6OTc5Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/nvLrlsJHlpKrlpJrooYwiCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz/ooYzlj7fplJnor68iCisKKyM6IG1lbWxpbmUuYzoxMDAyCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P+epuueahCDlnZciCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/5om+5LiN5Yiw5LiA5Lqb6KGMIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDog5Z2XIDEgSUQg6ZSZ6K+vICglcyDkuI3mmK/kuqTmjaLmlofku7Y/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz/mib7kuI3liLDlnZciCisKKyM6IG1lbWxpbmUuYzoxMDgxCittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IOS7jui/memHjOWIsCA/Pz9FTkQg55qE5YaF5a655Y+v6IO95pyJ6Zeu6aKYIgorCisjOiBtZW1saW5lLmM6MTA5NworbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IOS7jui/memHjOWIsCA/Pz9FTkQg55qE5YaF5a655Y+v6IO96KKr5Yig6ZmkL+aPkuWFpei/hyIKKworIzogbWVtbGluZS5jOjExMTcKK21zZ2lkICI/Pz9FTkQiCittc2dzdHIgIj8/P0VORCIKKworIzogbWVtbGluZS5jOjExNDMKK21zZ2lkICJFMzExOiBSZWNvdmVyeSBJbnRlcnJ1cHRlZCIKK21zZ3N0ciAiRTMxMTog5oGi5aSN5bey5Lit5patIgorCisjOiBtZW1saW5lLmM6MTE0NQorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIkUzMTI6IOaBouWkjeaXtuWPkeeUn+mUmeivrzsg6K+35rOo5oSP5byA5aS05Li6ID8/PyDnmoTooYwiCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICLmgaLlpI3lrozmiJAuIOivt+ehruWumuS4gOWIh+ato+W4uC4iCisKKyM6IG1lbWxpbmUuYzoxMTQ5Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKOS9oOWPr+iDveaDs+imgeaKiui/meS4quaWh+S7tuWPpuWtmOS4uuWIq+eahOaWh+S7tuWQje+8jFxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICLlho3miafooYwgZGlmZiDkuI7ljp/mlofku7bmr5TovoPku6Xmo4Dmn6XmmK/lkKbmnInmlLnlj5gpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyIoRCnnm7TmjqXliKDpmaQgLnN3cCDkuqTmjaLmlofku7ZcbiIKKyJcbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMjA3Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIuaJvuWIsOS7peS4i+eahOS6pOaNouaWh+S7tjoiCisKKyM6IG1lbWxpbmUuYzoxMzg1Cittc2dpZCAiICAgSW4gY3VycmVudCBkaXJlY3Rvcnk6XG4iCittc2dzdHIgIiAgIOWcqOebruWJjeebruW9lTpcbiIKKworIzogbWVtbGluZS5jOjEzODcKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAg5Zyo55uu5b2VICIKKworIzogbWVtbGluZS5jOjE0MDkKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIOaXoCAtLVxuIgorCisjOiBtZW1saW5lLmM6MTQ4MQorbXNnaWQgIiAgICAgICAgICBvd25lZCBieTogIgorbXNnc3RyICIgICAgICAgICAgICDmiYDmnInogIU6ICIKKworIzogbWVtbGluZS5jOjE0ODMKK21zZ2lkICIgICBkYXRlZDogIgorbXNnc3RyICIgICAg5pel5pyfOiAiCisKKyM6IG1lbWxpbmUuYzoxNDg3IG1lbWxpbmUuYzozNjgwCittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICAgICAg5pel5pyfOiAiCisKKyM6IG1lbWxpbmUuYzoxNTAzCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgICAgICBb5LuOIFZpbSDniYjmnKwgMy4wXSIKKworIzogbWVtbGluZS5jOjE1MDcKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgW+S4jeWDjyBWaW0g55qE5Lqk5o2i5paH5Lu2XSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICDmlofku7blkI06ICIKKworIzogbWVtbGluZS5jOjE1MjMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICDkv67mlLnov4c6ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICJZRVMiCittc2dzdHIgIuaYryIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICJubyIKK21zZ3N0ciAi5ZCmIgorCisjOiBtZW1saW5lLmM6MTUyOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgIOeUqOaIt+WQjTogIgorCisjOiBtZW1saW5lLmM6MTUzNQorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgICAgICDkuLvmnLrlkI06ICIKKworIzogbWVtbGluZS5jOjE1MzcKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICDkuLvmnLrlkI06ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgIOi/m+eoiyBJRDogIgorCisjOiBtZW1saW5lLmM6MTU0OQorbXNnaWQgIiAoc3RpbGwgcnVubmluZykiCittc2dzdHIgIiAo5q2j5Zyo5omn6KGMKSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFvkuI3og73lnKjmnKzniYjmnKznmoQgVmltIOS4iuS9v+eUqF0iCisKKyM6IG1lbWxpbmUuYzoxNTY0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW+S4jeiDveWcqOacrOacuuS4iuS9v+eUqF0iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW+S4jeiDveivu+WPll0iCisKKyM6IG1lbWxpbmUuYzoxNTczCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBb5LiN6IO95omT5byAXSIKKworIzogbWVtbGluZS5jOjE3NjMKK21zZ2lkICJFMzEzOiBDYW5ub3QgcHJlc2VydmUsIHRoZXJlIGlzIG5vIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMxMzog5LiN6IO95L+d55WZLCDkuI3kvb/nlKjkuqTmjaLmlofku7YiCisKKyM6IG1lbWxpbmUuYzoxODE2Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIuaWh+S7tuW3suS/neeVmSIKKworIzogbWVtbGluZS5jOjE4MTgKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6IOS/neeVmeWksei0pSIKKworIzogbWVtbGluZS5jOjE4ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiDplJnor6/nmoQgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6IOaJvuS4jeWIsOesrCAlbGQg6KGMIgorCisjOiBtZW1saW5lLmM6MjMwMworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzog5oyH6ZKI5Z2XIGlkIOmUmeivryAzIgorCisjOiBtZW1saW5lLmM6MjM4MworbXNnaWQgInN0YWNrX2lkeCBzaG91bGQgYmUgMCIKK21zZ3N0ciAic3RhY2tfaWR4IOW6lOivpeaYryAwIgorCisjOiBtZW1saW5lLmM6MjQ0NQorbXNnaWQgIkUzMTg6IFVwZGF0ZWQgdG9vIG1hbnkgYmxvY2tzPyIKK21zZ3N0ciAiRTMxODog5pu05paw5aSq5aSa5Z2XPyIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6IOaMh+mSiOWdlyBpZCDplJnor68gNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICLliKDpmaTlnZcgMT8iCisKKyM6IG1lbWxpbmUuYzoyODI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiDmib7kuI3liLDnrKwgJWxkIOihjCIKKworIzogbWVtbGluZS5jOjMwNzIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIgorbXNnc3RyICJFMzE3OiDmjIfpkojlnZcgaWQg6ZSZ6K+vIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCDkuLrpm7YiCisKKyM6IG1lbWxpbmUuYzozMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjog6KGM5Y+36LaF5Ye66IyD5Zu0OiAlbGQg6LaF6L+H57uT5bC+IgorCisjOiBtZW1saW5lLmM6MzEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzog5Z2XICVsZCDooYzmlbDplJnor68iCisKKyM6IG1lbWxpbmUuYzozMTcwCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIuWghuagiOWkp+Wwj+WinuWKoCIKKworIzogbWVtbGluZS5jOjMyMTYKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6IOaMh+mSiOWdlyBpZCDplJkgMiIKKworIzogbWVtbGluZS5jOjM2NzAKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IOazqOaEjyIKKworIzogbWVtbGluZS5jOjM2NzEKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyLlj5HnjrDkuqTmjaLmlofku7YgXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICLlvZPmiZPlvIDmlofku7bml7YgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIOavlOS6pOaNouaWh+S7tuaWsCFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSDlj6/og73mnInlj6bkuIDkuKrnqIvluo/kuZ/lnKjnvJbovpHlkIzkuIDkuKrmlofku7YuXG4iCisiICAgIOWmguaenOaYr+i/meagt++8jOivt+azqOaEj+S4jeimgeS4gOi1t+WGmeWFpe+8jOS4jeeEtuS9oOeahOWKquWKm+mDveS8muS7mOivuOS4nOa1geOAglxuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICDpgIDlh7rvvIzmiJbmmK/nu6fnu63nvJbovpHjgIJcbiIKKworIzogbWVtbGluZS5jOjM2OTAKK21zZ2lkICIiCisiXG4iCisiKDIpIEFuIGVkaXQgc2Vzc2lvbiBmb3IgdGhpcyBmaWxlIGNyYXNoZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMikg5LiK5LiA5qyh57yW6L6R5q2k5paH5Lu25pe25bSp5rqDXG4iCisKKyM6IG1lbWxpbmUuYzozNjkxCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAg5aaC5p6c5piv6L+Z5qC3LCDor7fnlKggXCI6cmVjb3ZlclwiIOaIliBcInZpbSAtciIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDmgaLlpI3kv67mlLnlhoXlrrkgKOi/m+S4gOatpeivtOaYjuivt+eciyBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICDlpoLmnpzor6XmgaLlpI3nmoTpg73lt7Lnu4/mgaLlpI3kuoYsIOivt+ebtOaOpeWIoOmZpOatpOS6pOaNouaWh+S7tiBcIiIKKworIzogbWVtbGluZS5jOjM2OTYKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAg5Lul6YG/5YWN5YaN55yL5Yiw5q2k5L+h5oGvLlxuIgorCisjOiBtZW1saW5lLmM6MzcxMCBtZW1saW5lLmM6MzcxNAorbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAi5Lqk5o2i5paH5Lu2IFwiIgorCisjOiBtZW1saW5lLmM6MzcxMSBtZW1saW5lLmM6MzcxNworbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIg5bey57uP5a2Y5Zyo5LqGISIKKworIzogbWVtbGluZS5jOjM3MjAKK21zZ2lkICJWSU0gLSBBVFRFTlRJT04iCittc2dzdHIgIlZJTSAtIOazqOaEjyIKKworIzogbWVtbGluZS5jOjM3MjIKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICLkuqTmjaLmlofku7blt7Lnu4/lrZjlnKghIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisi5Lul5Y+q6K+75pa55byP5omT5byAKCZPKVxuIgorIuebtOaOpee8lui+kSgmRSlcbiIKKyLmgaLlpI0oJlIpXG4iCisi6YCA5Ye6KCZRKSIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyLku6Xlj6ror7vmlrnlvI/miZPlvIAoJk8pXG4iCisi55u05o6l57yW6L6RKCZFKVxuIgorIuaBouWkjSgmUilcbiIKKyLpgIDlh7ooJlEpXG4iCisi5Yig6Zmk5Lqk5o2i5paH5Lu2KCZEKSIKKworIzogbWVtbGluZS5jOjM3ODEKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiDmib7liLDlpKrlpJrkuqTmjaLmlofku7YiCisKKyM6IG1lbnUuYzo2NAorbXNnaWQgIkUzMjc6IFBhcnQgb2YgbWVudS1pdGVtIHBhdGggaXMgbm90IHN1Yi1tZW51IgorbXNnc3RyICJFMzI3OiDpg6jku73oj5zljZXpobnkuI3mmK/lrZDoj5zljZUiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiDoj5zljZXlj6rog73lnKjlhbblroPmqKHlvI/kuK3kvb/nlKgiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiDmsqHmnInpgqPmoLfnmoToj5zljZUiCisKKyM6IG1lbnUuYzo1MDMKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiDoj5zljZXkuI3og73mjIflkJHlrZDpgInljZUiCisKKyM6IG1lbnUuYzo1NDIKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiRTMzMTog5LiN6IO955u05o6l5oqK6I+c5Y2V6aG55Yqg5Yiw6I+c5Y2V5p2h5LitIgorCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiDliIbpmpTnur/kuI3og73mmK/oj5zljZXnmoTkuIDpg6jliIYiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNjMKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDoj5zljZUgLS0tIgorCisjOiBtZW51LmM6MTk4OQorbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAi5YiH5LiL5q2k6I+c5Y2VIgorCisjOiBtZW51LmM6MjA1NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6IOiPnOWNleW/hemcgOaMh+WQkeS4gOS4quiPnOWNlemhuSIKKworIzogbWVudS5jOjIwNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBb6I+c5Y2VXSDmib7kuI3liLAgJXMiCisKKyM6IG1lbnUuYzoyMTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzU6IE1lbnUgbm90IGRlZmluZWQgZm9yICVzIG1vZGUiCittc2dzdHIgIkUzMzU6ICVzIOaooeW8j+acquWumuS5ieiPnOWNlSIKKworIzogbWVudS5jOjIxODEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6IOiPnOWNleW/hemcgOaMh+WQkeWtkOiPnOWNlSIKKworIzogbWVudS5jOjIyMDIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6IOaJvuS4jeWIsOiPnOWNlSAtIOivt+ajgOafpeiPnOWNleWQjeensCIKKworIzogbWVzc2FnZS5jOjQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAi5aSE55CGICVzIOaXtuWPkeeUn+mUmeivrzoiCisKKyM6IG1lc3NhZ2UuYzo0ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAi6KGMICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTIzCittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIlvlrZfnrKbkuLLlpKrplb9dIgorCisjOiBtZXNzYWdlLmM6NjY5Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIueugOS9k+S4reaWh+S/oeaBr+e7tOaKpOiAhTogV2FuZyBKdW4gPGp1bndAdHVyYm9saW51eC5jb20uY24+IgorCisjOiBtZXNzYWdlLmM6ODgxCittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgIuW3suS4reaWrTogIgorCisjOiBtZXNzYWdlLmM6ODg0Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICLor7fmjIkgRU5URVIg57un57utIgorCisjOiBtZXNzYWdlLmM6ODg2Cittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAi6K+35oyJIEVOVEVSIOaIluWFtuWug+WRveS7pOe7p+e7rSIKKworIzogbWVzc2FnZS5jOjE5NDAKK21zZ2lkICItLSBNb3JlIC0tIgorbXNnc3RyICItLSDmm7TlpJogLS0iCisKKyM6IG1lc3NhZ2UuYzoxOTQzCittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IOWQkeS4iy/lkJHkuIrkuIDooYwsIOepuuagvC9iOiDkuIDpobUsIGQvdTog5Y2K6aG1LCBxOiDpgIDlh7opIgorCisjOiBtZXNzYWdlLmM6MTk0NAorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IOWQkeS4i+S4gOihjCwg56m655m96ZSuOiDkuIDpobUsIGQ6IOWNiumhtSwgcTog6YCA5Ye6KSIKKworIzogbWVzc2FnZS5jOjI0MTkgbWVzc2FnZS5jOjI0MzQKK21zZ2lkICJRdWVzdGlvbiIKK21zZ3N0ciAi6Zeu6aKYIgorCisjOiBtZXNzYWdlLmM6MjQyMQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlnmmK9cbiIKKyImTuWQpiIKKworIzogbWVzc2FnZS5jOjI0MzYKK21zZ2lkICIiCisiJlllc1xuIgorIiZOb1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyImWeaYr1xuIgorIiZO5ZCmXG4iCisiJkPlj5bmtogiCisKKyM6IG1lc3NhZ2UuYzoyNDU0Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlnmmK9cbiIKKyImTuWQplxuIgorIiZB5YWo6YOo5L+d5a2YXG4iCisiJkTlhajpg6jkuI3lrZhcbiIKKyImQ+WPlua2iCIKKworIzogbWVzc2FnZS5jOjI0OTQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICLkv53lrZjmlofku7blr7nor53moYYiCisKKyM6IG1lc3NhZ2UuYzoyNDk2Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAi5omT5byA5paH5Lu25a+56K+d5qGGIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI1NDcKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODog5Li75o6n5Y+wKENvbnNvbGUp5qih5byP5pe25rKh5pyJ5paH5Lu25rWP6KeI5ZmoKGZpbGUgYnJvd3NlcikiCisKKyM6IG1pc2MxLmM6MjQ0OQorbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6IOazqOaEjzog5L2g5q2j5Zyo5L+u5pS55LiA5Liq5Y+q6K+75paH5Lu2IgorCisjOiBtaXNjMS5jOjI2NzgKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAi6L+Y5pyJ5LiA6KGMIgorCisjOiBtaXNjMS5jOjI2ODAKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAi5bCR5LqO5LiA6KGMIgorCisjOiBtaXNjMS5jOjI2ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiDov5jmnIkgJWxkIOihjCIKKworIzogbWlzYzEuYzoyNjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAi5Y+q5YmpICVsZCDooYwiCisKKyM6IG1pc2MxLmM6MjY5MAorbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKOW3suS4reaWrSkiCisKKyM6IG1pc2MxLmM6NjI0NAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IOS/neeVmeaWh+S7tuS4rS4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjI1NAorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTog57uT5p2fLlxuIgorCisjOiBtaXNjMi5jOjY0NCBtaXNjMi5jOjY2MAorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIumUmeivrzogIgorCisjOiBtaXNjMi5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltieXRlc10g5YWo6YOoIGFsbG9jLWZyZWVkICVsdS0lbHUsIOS9v+eUqOS4rSAlbHUsIHBlYWsg5L2/55SoICVsdVxuIgorCisjOiBtaXNjMi5jOjY2NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJb6LCD55SoXSDlhajpg6ggcmUvbWFsbG9jKCk6ICVsdSwg5YWo6YOoIGZyZWUoKSc6ICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjcyMQorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6IOatpOihjOi/h+mVvyIKKworIzogbWlzYzIuYzo3NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IOWGhemDqOmUmeivrzogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IOWGheWtmOS4jei2syEgKOWwneivlemFjee9riAlbHUg5a2X6IqC57uEKSIKKworIzogbWlzYzIuYzoyNTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICLosIPnlKggc2hlbGwg5omn6KGMOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6MjcwMyBtaXNjMi5jOjUxNDIgb3B0aW9uLmM6NDU4NAorbXNnaWQgIk1pc3NpbmcgY29sb24iCittc2dzdHIgIue8uuWwkeWGkuWPtyIKKworIzogbWlzYzIuYzoyNzA1IG1pc2MyLmM6MjczMgorbXNnaWQgIklsbGVnYWwgbW9kZSIKK21zZ3N0ciAi5LiN5q2j56Gu55qE5qih5byPIgorCisjOiBtaXNjMi5jOjI3NzEKK21zZ2lkICJJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIuS4jeato+ehrueahOm8oOagh+W9oueKtiIKKworIzogbWlzYzIuYzoyODExIG1pc2MyLmM6NTE2MgorbXNnaWQgImRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICLlupTor6XkuLrmlbDlrZciCisKKyM6IG1pc2MyLmM6MjgxNgorbXNnaWQgIklsbGVnYWwgcGVyY2VudGFnZSIKK21zZ3N0ciAi5LiN5q2j56Gu55qE55m+5YiG5q+UIgorCisjOiBtaXNjMi5jOjMxMjAKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICLovpPlhaXlr4bnoIE6ICIKKworIzogbWlzYzIuYzozMTIxCittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAi6K+35YaN6L6T5YWl5LiA5qyhOiAiCisKKyM6IG1pc2MyLmM6MzEzMQorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICLkuKTmrKHovpPlhaXlr4bnoIHkuI3lkIwhIgorCisjOiBtaXNjMi5jOjM2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIkUzNDM6IOS4jeato+ehrueahOi3r+W+hDogJyoqW251bWJlcl0nIOW/hemcgOimgeWcqOi3r+W+hOe7k+WwvuaIluimgeaOpeiRlyAnJXMnIgorCisjOiBtaXNjMi5jOjQ4OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogY2RwYXRoIOS4reayoeacieebruW9lSBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NDkwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ1OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkUzNDU6IOWcqOi3r+W+hOS4reaJvuS4jeWIsOaWh+S7tiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NDkwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ2OiBObyBtb3JlIGRpcmVjdG9yeSBcIiVzXCIgZm91bmQgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ2OiDlnKjot6/lvoTkuK3mib7kuI3liLDmm7TlpJrnmoTmlofku7YgXCIlc1wiIgorCisjOiBtaXNjMi5jOjQ5MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NzogTm8gbW9yZSBmaWxlIFwiJXNcIiBmb3VuZCBpbiBwYXRoIgorbXNnc3RyICJFMzQ3OiDlnKjot6/lvoTkuK3mib7kuI3liLDmm7TlpJrnmoTmlofku7YgXCIlc1wiIgorCisjOiBtaXNjMi5jOjUxNTQKK21zZ2lkICJJbGxlZ2FsIGNvbXBvbmVudCIKK21zZ3N0ciAi5LiN5q2j56Gu55qE57uE5Lu2IgorCisjOiBub3JtYWwuYzoyNzk4Cittc2dpZCAiV2FybmluZzogdGVybWluYWwgY2Fubm90IGhpZ2hsaWdodCIKK21zZ3N0ciAi5rOo5oSPOiDkvaDnmoTnu4jnq6/kuI3og73mmL7npLrpq5jkuq7luqYiCisKKyM6IG5vcm1hbC5jOjI5OTMKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiDlhYnmoIflpITmsqHmnInlrZfnrKbkuLIiCisKKyM6IG5vcm1hbC5jOjI5OTUKK21zZ2lkICJFMzQ5OiBObyBpZGVudGlmaWVyIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0OTog5YWJ5qCH5aSE5rKh5pyJ6K+G5Yir5a2XIgorCisjOiBub3JtYWwuYzo0MTYwCittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6IOS4jeiDveWcqOebruWJjeeahCAnZm9sZG1ldGhvZCcg5LiL5Yig6ZmkIGZvbGQiCisKKyM6IG9wcy5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgIuS4gOihjCAlcyDov4cg5LiA5qyhIgorCisjOiBvcHMuYzoyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIuS4gOihjCAlcyDov4cgJWQg5qyhIgorCisjOiBvcHMuYzoyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQg6KGMICVzIOi/hyDkuIDmrKEiCisKKyM6IG9wcy5jOjI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAiJWxkIOihjCAlcyDov4cgJWQg5qyhIgorCisjOiBvcHMuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHRvIGluZGVudC4uLiAiCittc2dzdHIgIuivhuWIqyAlbGQg6KGMLi4uIgorCisjOiBvcHMuYzo2ODgKK21zZ2lkICIxIGxpbmUgaW5kZW50ZWQgIgorbXNnc3RyICLkuIDooYzlt7Lor4bliKsiCisKKyM6IG9wcy5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICLlt7Lor4bliKsgJWxkIOihjCIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IG9wcy5jOjE1MjgKK21zZ2lkICJjYW5ub3QgeWFuazsgZGVsZXRlIGFueXdheSIKK21zZ3N0ciAi5LiN6IO95aSN5Yi2OyDnm7TmjqXliKDpmaQiCisKKyM6IG9wcy5jOjIwMTgKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAiIDEg6KGMIH5lZCIKKworIzogb3BzLmM6MjAyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgY2hhbmdlZCIKK21zZ3N0ciAiICVsZCDooYwgfmVkIgorCisjOiBvcHMuYzoyMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICLph4rmlL4gJWxkIOihjOS4rSIKKworIzogb3BzLmM6MjY1OAorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgIuW3suWkjeWItiAxIOihjCIKKworIzogb3BzLmM6MjY2MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgeWFua2VkIgorbXNnc3RyICLlt7LlpI3liLYgJWxkIOihjCIKKworIzogb3BzLmM6MjkxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzUzOiBOb3RoaW5nIGluIHJlZ2lzdGVyICVzIgorbXNnc3RyICJFMzUzOiDlr4TlrZjlmaggJXMg6YeM5rKh5pyJ5Lic6KW/IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG9wcy5jOjM0NTQKK21zZ2lkICIiCisiXG4iCisiLS0tIFJlZ2lzdGVycyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g5a+E5a2Y5ZmoIC0tLSIKKworIzogb3BzLmM6NDU2NQorbXNnaWQgIklsbGVnYWwgcmVnaXN0ZXIgbmFtZSIKK21zZ3N0ciAi5LiN5q2j56Gu55qE5a+E5a2Y5Zmo5ZCN56ewIgorCisjOiBvcHMuYzo0NjQ1Cittc2dpZCAiIgorIlxuIgorIiMgUmVnaXN0ZXJzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDlr4TlrZjlmag6XG4iCisKKyM6IG9wcy5jOjQ2NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biByZWdpc3RlciB0eXBlICVkIgorbXNnc3RyICLmnKrnn6XnmoTms6jlhoznsbvlnos6ICVkIgorCisjOiBvcHMuYzo1MDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDog5a+E5a2Y5Zmo5ZCN56ew6ZSZ6K+vOiAnJXMnIgorCisjOiBvcHMuYzo1MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCDliJc7ICIKKworIzogb3BzLmM6NTQwMAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWxlY3RlZCAlcyVsZCBvZiAlbGQgTGluZXM7ICVsZCBvZiAlbGQgV29yZHM7ICVsZCBvZiAlbGQgQnl0ZXMiCittc2dzdHIgIumAieaLqeS6hiAlcyVsZC8lbGQg6KGMOyAlbGQvJWxkIOWtlyhXb3JkKTsgJWxkLyVsZCDlrZfnrKYoQnl0ZXMpIgorCisjOiBvcHMuYzo1NDE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAi5YiXICVzLyVzOyDooYwgJWxkLyVsZDsg5a2XKFdvcmQpICVsZC8lbGQ7IOWtl+espihCeXRlKSAlbGQvJWxkIgorCisjOiBvcHMuYzo1NDI3CisjLCBjLWZvcm1hdAorbXNnaWQgIigrJWxkIGZvciBCT00pIgorbXNnc3RyICIoKyVsZCBmb3IgQk9NKSIKKworIzogb3B0aW9uLmM6MTk4OQorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAi5oSf6LCi5oKo6YCJ5oupIFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICLkuI3mlK/mjIHor6XpgInpobkiCisKKyM6IG9wdGlvbi5jOjMyMDAKK21zZ2lkICJOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICLkuI3og73lnKjmqKHlvI/ooYzph4zlh7rnjrAiCisKKyM6IG9wdGlvbi5jOjMyNTYKK21zZ2lkICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKK21zZ3N0ciAiIgorIlxuIgorIlx05b2T5YmN6K6+572uOiAiCisKKyM6IG9wdGlvbi5jOjMzOTUKK21zZ2lkICJOdW1iZXIgcmVxdWlyZWQgYWZ0ZXIgPSIKK21zZ3N0ciAiPSDlkI7pnIDopoHmnInmlbDlrZciCisKKyM6IG9wdGlvbi5jOjM3MDIgb3B0aW9uLmM6NDMwOQorbXNnaWQgIk5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJUZXJtY2FwIOmHjOmdouaJvuS4jeWIsCIKKworIzogb3B0aW9uLmM6Mzc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICLkuI3mraPnoa7nmoTlrZfnrKYgPCVzPiIKKworIzogb3B0aW9uLmM6NDI5NCBvcHRpb24uYzo1NDk3Cittc2dpZCAiTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAi6L+Z6YeM5LiN5Y+v5L2/55SoIgorCisjOiBvcHRpb24uYzo0MzAxCittc2dpZCAiQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICLkuI3og73orr7lrpogJ3Rlcm0nIOS4uuepuuWtl+espuS4siIKKworIzogb3B0aW9uLmM6NDMwNAorbXNnaWQgIkNhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgIuWcqOWbvuWei+eVjOmdouS4reS4jeiDveWIh+aNoue7iOerryIKKworIzogb3B0aW9uLmM6NDMwNgorbXNnaWQgIlVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICLovpPlhaUgXCI6Z3VpXCIg5p2l5ZCv5Yqo5Zu+5b2i55WM6Z2iIgorCisjOiBvcHRpb24uYzo0MzI3Cittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiJ2JhY2t1cGV4dCcg6LefICdwYXRjaG1vZGUnIOaYr+S4gOagt+eahCIKKworIzogb3B0aW9uLmM6NDU4NgorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAi6Zu26ZW/5bqm5a2X56ym5LiyIgorCisjOiBvcHRpb24uYzo0NjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIjwlcz4g5ZCO57y65bCR5pWw5a2XIgorCisjOiBvcHRpb24uYzo0NjY4Cittc2dpZCAiTWlzc2luZyBjb21tYSIKK21zZ3N0ciAi57y65bCR6YCX5Y+3IgorCisjOiBvcHRpb24uYzo0Njc1Cittc2dpZCAiTXVzdCBzcGVjaWZ5IGEgJyB2YWx1ZSIKK21zZ3N0ciAi5b+F6ZyA5oyH5a6a5LiA5LiqICcg5YC8IgorCisjOiBvcHRpb24uYzo0NzE1Cittc2dpZCAiY29udGFpbnMgdW5wcmludGFibGUgY2hhcmFjdGVyIgorbXNnc3RyICLljIXlkKvkuI3og73mmL7npLrnmoTlrZfnrKYiCisKKyM6IG9wdGlvbi5jOjQ3MjgKK21zZ2lkICJJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIuS4jeato+ehrueahOWtl+S9kyIKKworIzogb3B0aW9uLmM6NDczNAorbXNnaWQgImNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICLkuI3og73kvb/nlKjlrZfkvZPpm4YoRm9udHNldCkiCisKKyM6IG9wdGlvbi5jOjQ3MzYKK21zZ2lkICJJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIuS4jeato+ehrueahOWtl+S9k+mbhihGb250c2V0KSIKKworIzogb3B0aW9uLmM6NDc0MworbXNnaWQgImNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIuS4jeiDveS9v+eUqOiuvuWumueahOWuveWtl+S9kyhXaWRlZm9udCkiCisKKyM6IG9wdGlvbi5jOjQ3NDUKK21zZ2lkICJJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAi5LiN5q2j56Gu55qE5a695a2X5L2TKFdpZGVmb250KSIKKworIzogb3B0aW9uLmM6NTAxNAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICI8JWM+IOWQjuacieS4jeato+ehrueahOWtl+espiIKKworIzogb3B0aW9uLmM6NTA5NworbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICLpnIDopoHpgJflj7ciCisKKyM6IG9wdGlvbi5jOjUxMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiJ2NvbW1lbnRzdHJpbmcnIOW/hemcgOaYr+epuueZveaIluWMheWQqyAlcyIKKworIzogb3B0aW9uLmM6NTE1MworbXNnaWQgIk5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIuS4jeaUr+aMgem8oOaghyIKKworIzogb3B0aW9uLmM6NTM5OQorbXNnaWQgIlVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIuayoeaciee7k+adn+eahOihqOi+vuW8jzogIgorCisjOiBvcHRpb24uYzo1NDAzCittc2dpZCAidG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIuWkquWkmuWvueixoSIKKworIzogb3B0aW9uLmM6NTQwNQorbXNnaWQgInVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICLkuI3lr7nnp7DnmoTnu4QiCisKKyM6IG9wdGlvbi5jOjU2MjAKK21zZ2lkICJBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICLpooTop4jnqpflj6Plt7Lnu4/lrZjlnKjkuoYiCisKKyM6IG9wdGlvbi5jOjU4ODEgb3B0aW9uLmM6NTkxMAorbXNnaWQgIid3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIid3aW5oZWlnaHQnIOS4jeiDveavlCAnd2lubWluaGVpZ2h0JyDmm7TlsJEiCisKKyM6IG9wdGlvbi5jOjU5MjYgb3B0aW9uLmM6NTk0NQorbXNnaWQgIid3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICInd2lud2lkdGgnIOS4jeiDveavlCAnd2lubWlud2lkdGgnIOabtOWwkSIKKworIzogb3B0aW9uLmM6NjA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICLoh7PlsJHpnIDopoEgJWQg6KGMIgorCisjOiBvcHRpb24uYzo2MDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAi6Iez5bCR6ZyA6KaBICVkIOWIlyIKKworIzogb3B0aW9uLmM6NjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6IOS4jeato+ehrueahOmAiemhuTogJXMiCisKKyM6IG9wdGlvbi5jOjY1MDAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDnu4jnq6/nvJbnoIEgLS0tIgorCisjOiBvcHRpb24uYzo2NTAyCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g5YWo5bGAIOmAiemhueWAvCAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOacrOWcsCDpgInpobnlgLwgLS0tIgorCisjOiBvcHRpb24uYzo2NTA2Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDpgInpobkgLS0tIgorCisjOiBvcHRpb24uYzo3MTk2Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwIOmUmeivryIKKworIzogb3B0aW9uLmM6ODExMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiDmib7kuI3liLAgJXMg5a+55bqU55qE5a2X56ymIgorCisjOiBvcHRpb24uYzo4MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IOWIhuWPt+WQjuacieWkmuS9meeahOWtl+espjogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjczCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICLkuI3og73miZPlvIAiCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiDkuI3og73miZPlvIDnqpflj6MhXG4iCisKKyM6IG9zX2FtaWdhLmM6MzI5Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAi6ZyA6KaBIEFtaWdhZG9zIOeJiOacrCAyLjA0IOS7peS4ilxuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIumcgOimgSAlcyDniYjmnKwgJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICLkuI3og73miZPlvIAgTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQxOAorbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICLkuI3og73liJvlu7ogIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSDov5Tlm57lgLw6ICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTI4Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAi5LiN6IO95YiH5o2i5Li75o6n5Y+wKGNvbnNvbGUp5qih5byPICE/XG4iCisKKyM6IG9zX2FtaWdhLmM6OTM4IG9zX21hYy5jOjExNjggb3NfbXN3aW4uYzo2MTkgb3NfcmlzY29zLmM6NzI4IG9zX3VuaXguYzoyNzI2Cittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiDkuI3mlK/mjIHorr7lrprlsY/luZXmqKHlvI8iCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTog5LiN5piv5Li75o6n5Y+wKGNvbnNvbGUpPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiDkuI3og73nlKggLWYg6YCJ6aG55omn6KGMIHNoZWxsIgorCisjOiBvc19hbWlnYS5jOjExODMgb3NfYW1pZ2EuYzoxMjczCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICLkuI3og73miafooYwgIgorCisjOiBvc19hbWlnYS5jOjExODYgb3NfYW1pZ2EuYzoxMjgzCittc2dpZCAic2hlbGwgIgorbXNnc3RyICJzaGVsbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNiBvc19hbWlnYS5jOjEzMDgKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIOW3sui/lOWbnlxuIgorCisjOiBvc19hbWlnYS5jOjE0NDgKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIOWkquWwjyIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08g6ZSZ6K+vIgorCisjOiBvc19tc3dpbi5jOjUwMworbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIiCisKKyM6IG9zX21zd2luLmM6NTk0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyDkuI3mmK8gODAsIOS4jeiDveaJp+ihjOWklumDqOWRveS7pCIKKworIzogb3NfbXN3aW4uYzo3MDYgb3NfdW5peC5jOjQ5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6IOiwg+eUqOWHveaVsOW6kyBcIiVzXCIoKSDlpLHotKUiCisKKyM6IG9zX21zd2luLmM6MTM0MAorbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzog5LiN6IO96YCJ5oup5q2k5omT5Y2w5py6IgorCisjOiBvc19tc3dpbi5jOjEzODgKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgIuS7jiAlcyDliLAgJXMiCisKKyM6IG9zX21zd2luLmM6MTQ0OSBvc19tc3dpbi5jOjE0NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiDmiZPljbDplJnor686ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NTkKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICLmnKrnn6UiCisKKyM6IG9zX21zd2luLmM6MTQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICLlt7LmiZPljbA6ICclcyciCisKKyM6IG9zX21zd2luLmM6MjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDog5a2X56ym6ZuGIFwiJXNcIiDkuI3og73lr7nlupTlrZfkvZNcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiDkuI3mraPnoa7nmoTlrZfnrKYgJyVjJyDlh7rnjrDlnKjlrZfkvZPlkI3np7AgXCIlc1wiIOWGhSIKKworIzogb3NfcmlzY29zLmM6MTIyNworbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IOS4jeato+ehrueahCAnZmlsZXR5cGUnIOmAiemhuSAtIOS9v+eUqOe6r+aWh+Wtl+aooeW8jyIKKworIzogb3NfdW5peC5jOjgwMAorbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IOWPjOmHjeS/oeWPtywg6YCA5Ye65LitXG4iCisKKyM6IG9zX3VuaXguYzo4MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IENWaW06IOaLpuaIquWIsOS/oeWPtyhzaWduYWwpICVzXG4iCisKKyM6IG9zX3VuaXguYzo4MDkKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTog5oum5oiq5Yiw6Ie05ZG955qE5L+h5Y+3KGRlYWRseSBzaWduYWxlKVxuIgorCisjOiBvc191bml4LmM6MTA2MworIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAi5omT5byAIFggV2luZG93IOeUqOaXtiAlbGQg56eSIgorCisjOiBvc191bml4LmM6MTA5MAorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IFgg6ZSZ6K+vXG4iCisKKyM6IG9zX3VuaXguYzoxMTU3Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAi5rWL6K+VIFggV2luZG93IOWksei0pSIKKworIzogb3NfdW5peC5jOjEzMDEKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICLmiZPlvIAgWCBXaW5kb3cg6LaF5pe2IgorCisjOiBvc191bml4LmM6Mjg5OSBvc191bml4LmM6MzQ4MworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCAiCittc2dzdHIgIiIKKyJcbiIKKyLkuI3og73miafooYwgc2hlbGwiCisKKyM6IG9zX3VuaXguYzoyOTQ0Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyLkuI3og73miafooYwgc2hlbGwgc2hcbiIKKworIzogb3NfdW5peC5jOjI5NDggb3NfdW5peC5jOjM0ODkKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisiU2hlbGwg5bey6L+U5ZueIgorCisjOiBvc191bml4LmM6MzA4MgorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyLkuI3og73lu7rnq4vnrqHpgZNcbiIKKworIzogb3NfdW5peC5jOjMwOTcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIuS4jeiDvSBmb3JrXG4iCisKKyM6IG9zX3VuaXguYzozNDk2Cittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisi5ZG95Luk5bey57uT5p2fXG4iCisKKyM6IG9zX3VuaXguYzo0OTkzCittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAi5omT5byAIFggV2luZG93IOWksei0pSIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAi5Zyo6KGM5Y+3ICIKKworIzogb3NfdzMyZXhlLmM6MTY5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAi5LiN6IO95Yqg6L29IHZpbTMyLmRsbO+8gSIKKworIzogb3NfdzMyZXhlLmM6MTY5IG9zX3czMmV4ZS5jOjE3OQorbXNnaWQgIlZJTSBFcnJvciIKK21zZ3N0ciAiVklNIOmUmeivryIKKworIzogb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiQ291bGQgbm90IGZpeCB1cCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgRExMISIKK21zZ3N0ciAi5LiN6IO95L+u5q2j5Ye95pWw5oyH6ZKI5YiwIERMTCEiCisKKyM6IG9zX3dpbjE2LmM6NTc4IG9zX3dpbjMyLmM6MzAxOQorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAiU2hlbGwg6L+U5Zue5YC8ICVkIgorCisjOiBvc193aW4zMi5jOjI0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiDmi6bmiKrliLAgJXMg5LqL5Lu2XG4iCisKKyM6IG9zX3dpbjMyLmM6MjQ5MQorbXNnaWQgImNsb3NlIgorbXNnc3RyICLlhbPpl60iCisKKyM6IG9zX3dpbjMyLmM6MjQ5MworbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAi5rOo5raIIgorCisjOiBvc193aW4zMi5jOjI0OTQKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAi5YWz5py6IgorCisjOiBvc193aW4zMi5jOjI5NzUKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTog5om+5LiN5Yiw5ZG95LukIgorCisjOiBvc193aW4zMi5jOjI5ODgKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyLlnKjkvaDnmoQgJFBBVEgg5Lit5om+5LiN5YiwIFZJTVJVTi5FWEUuXG4iCisi5aSW6YOo5ZG95Luk5omn6KGM5a6M5q+V5ZCO5bCG5LiN5Lya5pqC5YGcLlxuIgorIui/m+S4gOatpeivtOaYjuivt+aJp+ihjCA6aGVscCB3aW4zMi12aW1ydW4gIgorCisjOiBvc193aW4zMi5jOjI5OTEKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiVmltIOitpuWRiiIKKworIzogcXVpY2tmaXguYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiDmoLzlvI/ljJblrZfnrKbkuLLph4zmnInlpKrlpJogJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiDmoLzlvI/ljJblrZfnrKbkuLLkuI3lupTor6Xlh7rnjrAgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6MzQ4Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6IOagvOW8j+WMluWtl+espuS4sumHjOWwkeS6hiBdIgorCisjOiBxdWlja2ZpeC5jOjM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc1OiBVbnN1cHBvcnRlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzU6IOagvOW8j+WMluWtl+espuS4sumHjOacieS4jeaUr+aMgeeahCAlJSVjICIKKworIzogcXVpY2tmaXguYzozODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiDmoLzlvI/ljJblrZfnrKbkuLLlvIDlpLTph4zmnInkuI3mraPnoa7nmoQgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6Mzg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzc6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc3OiDmoLzlvI/ljJblrZfnrKbkuLLph4zmnInkuI3mraPnoa7nmoQgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6NDE0Cittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIOacquiuvuWumiIKKworIzogcXVpY2tmaXguYzo1MjAKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiDmib7kuI3liLDnm67lvZXlkI3np7DmiJbmmK/nqbrnmoTnm67lvZXlkI3np7AiCisKKyM6IHF1aWNrZml4LmM6OTMxCittc2dpZCAiTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAi5rKh5pyJ5YW25a6D5a+56LGhIgorCisjOiBxdWlja2ZpeC5jOjExNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIC8gJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjExNTQKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAo6KGM5bey5Yig6ZmkKSIKKworIzogcXVpY2tmaXguYzoxMzYwCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBRdWlja2ZpeCDloIbmoIjnu5PlsL4iCisKKyM6IHF1aWNrZml4LmM6MTM2OQorbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogUXVpY2tmaXgg5aCG5qCI6aG256uvIgorCisjOiBxdWlja2ZpeC5jOjEzODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICLplJnor6/liJfooaggJWQvJWQ7IOWFseaciSAlZCDpobnplJnor68iCisKKyM6IHF1aWNrZml4LmM6MTg0MgorbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIkUzODI6IOS4jeiDveWGmeWFpe+8jCdidWZ0eXBlJyDpgInpobnlt7Lorr7lrpoiCisKKyM6IHJlZ2V4cC5jOjgwMQorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IOWQjeWtl+WkqumVvyIKKworIzogcmVnZXhwLmM6MTMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTog5bei54q2ICVzKiIKKworIzogcmVnZXhwLmM6MTMxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6IOW3oueKtiAlcyVjIgorCisjOiByZWdleHAuYzoxNDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2NDogJXMlYyBmb2xsb3dzIG5vdGhpbmciCittc2dzdHIgIkU2NDogJXMlYyDmsqHmnInmjqXkuJzopb8iCisKKyM6IHJlZ2V4cC5jOjI0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIuivreazlemUmeivrzogJXN7Li4ufSIKKworIzogcmVnZXhwLmM6MjcxNgorbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiDkuI3og73miafooYw7IHJlZ3VsYXIgZXhwcmVzc2lvbiDlpKrlpI3mnYI/IgorCisjOiByZWdleHAuYzoyODUxCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiByZWd1bGFyIGV4cHJlc3Npb24g6YCg5oiQ5aCG5qCI55So5YWJ55qE6ZSZ6K+vIgorCisjOiByZWdleHAuYzozMDg3Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAi5aSW6YOo56ym5ZCIOlxuIgorCisjOiBzY3JlZW4uYzoyMDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0t5beyIGZvbGQgJTNsZCDooYwiCisKKyM6IHNjcmVlbi5jOjc0MTEKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLeabv+aNoiIKKworIzogc2NyZWVuLmM6NzQxNQorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIg5pu/5o2iIgorCisjOiBzY3JlZW4uYzo3NDIwCittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiDlj43ovawiCisKKyM6IHNjcmVlbi5jOjc0MjIKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIg5o+S5YWlIgorCisjOiBzY3JlZW4uYzo3NDI1Cittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKOaPkuWFpSkiCisKKyM6IHNjcmVlbi5jOjc0MjcKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKOabv+aNoikiCisKKyM6IHNjcmVlbi5jOjc0MjkKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2Leabv+aNoikiCisKKyM6IHNjcmVlbi5jOjc0MzIKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIg5biM5Lyv6I6xIgorCisjOiBzY3JlZW4uYzo3NDQwCittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiICjor63oqIApIgorCisjOiBzY3JlZW4uYzo3NDQzCittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAo57KY5biWKSIKKworIzogc2NyZWVuLmM6NzQ0OQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiDpgInlj5YiCisKKyM6IHNjcmVlbi5jOjc0NTEKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIg5Y+v6KeGIgorCisjOiBzY3JlZW4uYzo3NDUzCittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIg5Z2XIgorCisjOiBzY3JlZW4uYzo3NDU1Cittc2dpZCAiIExJTkUiCittc2dzdHIgIiDooYwiCisKKyM6IHNjcmVlbi5jOjc0Njggc2NyZWVuLmM6NzUyMgorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAi6K6w5b2V5LitIgorCisjOiBzZWFyY2guYzozNgorbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAi5bey5p+l5om+5Yiw5paH5Lu25byA5aS077yb5YaN5LuO57uT5bC+57un57ut5p+l5om+IgorCisjOiBzZWFyY2guYzozNworbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAi5bey5p+l5om+5Yiw5paH5Lu257uT5bC+77yb5YaN5LuO5byA5aS057un57ut5p+l5om+IgorCisjOiBzZWFyY2guYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4Mzog6ZSZ6K+v55qE5p+l5om+5a2X56ym5LiyOiAlcyIKKworIzogc2VhcmNoLmM6NzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDog5bey5p+l5om+5Yiw5paH5Lu25byA5aS05LuN5om+5LiN5YiwICVzIgorCisjOiBzZWFyY2guYzo3NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiDlt7Lmn6Xmib7liLDmlofku7bnu5PlsL7ku43mib7kuI3liLAgJXMiCisKKyM6IHNlYXJjaC5jOjExMDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IOWcqCAnOycg5ZCO6Z2i5bqU6K+l5pyJICc/JyDmiJYgJy8nIgorCisjOiBzZWFyY2guYzozNDc2Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAo5YyF5ous5LiK5qyh5YiX5Ye656ym5ZCI6aG5KSIKKworIy4gY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjOiBzZWFyY2guYzozNDk2Cittc2dpZCAiLS0tIEluY2x1ZGVkIGZpbGVzICIKK21zZ3N0ciAiLS0tIOWMheWQq+aWh+S7tiAiCisKKyM6IHNlYXJjaC5jOjM0OTgKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICLmib7kuI3liLAgIgorCisjOiBzZWFyY2guYzozNDk5Cittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAi5Zyo6Lev5b6EIC0tLVxuIgorCisjOiBzZWFyY2guYzozNTM4Cittc2dpZCAiICAoQWxyZWFkeSBsaXN0ZWQpIgorbXNnc3RyICIgICjlt7LliJflh7opIgorCisjOiBzZWFyY2guYzozNTQwCittc2dpZCAiICBOT1QgRk9VTkQiCittc2dzdHIgIiAg5om+5LiN5YiwIgorCisjOiBzZWFyY2guYzozNTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGluY2x1ZGVkIGZpbGU6ICVzIgorbXNnc3RyICLmn6Xmib7ljIXlkKvmlofku7Y6ICVzIgorCisjOiBzZWFyY2guYzozODEwCittc2dpZCAiRTM4NzogTWF0Y2ggaXMgb24gY3VycmVudCBsaW5lIgorbXNnc3RyICJFMzg3OiDlvZPliY3ooYzljLnphY0iCisKKyM6IHNlYXJjaC5jOjM5NTAKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAi5omA5pyJ5YyF5ZCr5paH5Lu26YO95bey5om+5YiwIgorCisjOiBzZWFyY2guYzozOTUyCittc2dpZCAiTm8gaW5jbHVkZWQgZmlsZXMiCittc2dzdHIgIuayoeacieWMheWQq+aWh+S7tiIKKworIzogc2VhcmNoLmM6Mzk2OAorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODog5om+5LiN5Yiw5a6a5LmJIgorCisjOiBzZWFyY2guYzozOTcwCittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiDmib7kuI3liLAgcGF0dGVybiIKKworIzogc3ludGF4LmM6Mjk5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDog5Y+C5pWw5LiN5q2j56GuOiAlcyIKKworIzogc3ludGF4LmM6MzE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTog5peg5q2k6K+t5rOVIGNsdXN0ZXI6IFwiJXNcIiIKKworIzogc3ludGF4LmM6MzMzMQorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAi6L+Z5Liq57yT5Yay5Yy65rKh5pyJ5a6a5LmJ5Lu75L2V6K+t5rOV6aG5IgorCisjOiBzeW50YXguYzozMzM5Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJD6aOO5qC85rOo6YeK5ZCM5q2l5LitIgorCisjOiBzeW50YXguYzozMzQ3Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAi5rKh5pyJ5ZCM5q2lIgorCisjOiBzeW50YXguYzozMzUwCittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICLlkIzmraXlvIDlp4siCisKKyM6IHN5bnRheC5jOjMzNTIgc3ludGF4LmM6MzQyMQorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIuihjOWPt+i2heWHuuiMg+WbtCIKKworIzogc3ludGF4LmM6MzM1NgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOivreazleWQjOatpemhueebriAoU3ludGF4IHN5bmMgaXRlbXMpIC0tLSIKKworIzogc3ludGF4LmM6MzM1OQorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisi5ZCM5q2l5LitOiIKKworIzogc3ludGF4LmM6MzM2NAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDor63ms5Xpobnnm64gLS0tIgorCisjOiBzeW50YXguYzozMzg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDml6DmraTor63ms5UgY2x1c3RlcjogXCIlc1wiIgorCisjOiBzeW50YXguYzozNDExCittc2dpZCAibWluaW1hbCAiCittc2dzdHIgIuacgOWwjyIKKworIzogc3ludGF4LmM6MzQxOAorbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICLmnIDlpKciCisKKyM6IHN5bnRheC5jOjQwNDYKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IOS9v+eUqOS6huS4jeato+ehrueahOWPguaVsCIKKworIzogc3ludGF4LmM6NDA3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IOaJvuS4jeWIsCAlcyDnmoQgcmVnaW9uIGl0ZW0iCisKKyM6IHN5bnRheC5jOjQwOTgKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTog5L2/55So5LqG5LiN5q2j56Gu55qE5Y+C5pWwIgorCisjOiBzeW50YXguYzo0MTA5Cittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IOS9v+eUqOS6huS4jeato+ehrueahOWPguaVsCIKKworIzogc3ludGF4LmM6NDE4NworbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiDpnIDopoHmlofku7blkI3np7AiCisKKyM6IHN5bnRheC5jOjQ1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiDnvLrlsJEgXCI9XCI6ICVzIgorCisjOiBzeW50YXguYzo0Njc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBzeW50YXggcmVnaW9uICVzIOeahOWPguaVsOWkquWwkSIKKworIzogc3ludGF4LmM6NTAxMAorbXNnaWQgIkU0MDA6IE5vIGNsdXN0ZXIgc3BlY2lmaWVkIgorbXNnc3RyICJFNDAwOiDmsqHmnInmjIflrprnmoTlsZ7mgKciCisKKyM6IHN5bnRheC5jOjUwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTog5om+5LiN5Yiw5YiG6ZqU56ym5Y+3OiAlcyIKKworIzogc3ludGF4LmM6NTEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiAnJXMnIOWQjumdoueahOS4nOilv+S4jeiDveivhuWIqyIKKworIzogc3ludGF4LmM6NTIwNAorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6IOivreazleWQjOatpTog6L+e5o6l6KGM56ym5Y+35oyH5a6a5LqG5Lik5qyhIgorCisjOiBzeW50YXguYzo1MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDog5Y+C5pWw5LiN5q2j56GuOiAlcyIKKworIzogc3ludGF4LmM6NTMxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA1OiBNaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDA1OiDnvLrlsJHnrYnlj7c6ICVzIgorCisjOiBzeW50YXguYzo1MzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjog56m65Y+C5pWwOiAlcyIKKworIzogc3ludGF4LmM6NTM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyDkuI3og73lnKjmraTlh7rnjrAiCisKKyM6IHN5bnRheC5jOjUzNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyDlv4XpobvmmK/liJfooajph4znmoTnrKzkuIDkuKoiCisKKyM6IHN5bnRheC5jOjU0MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTog5LiN5q2j56Gu55qE57uE5ZCNOiAlcyIKKworIzogc3ludGF4LmM6NTY0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6IOS4jeato+ehrueahCA6c3ludGF4IOWtkOWRveS7pDogJXMiCisKKyM6IHN5bnRheC5jOjYwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMTogaGlnaGxpZ2h0IGdyb3VwIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MTE6IOaJvuS4jeWIsCBoaWdobGlnaHQgZ3JvdXA6ICVzIgorCisjOiBzeW50YXguYzo2MDQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTI6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEyOiDlj4LmlbDlpKrlsJE6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiDlj4LmlbDov4flpJo6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNzQKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6IOW3suiuvuWumue7hCwg5b+955WlIGhpZ2hsaWdodCBsaW5rIgorCisjOiBzeW50YXguYzo2MjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6IOS4jeivpeacieeahOetieWPtzogJXMiCisKKyM6IHN5bnRheC5jOjYyMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjog57y65bCR562J5Y+3OiAlcyIKKworIzogc3ludGF4LmM6NjI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQxNzog57y65bCR5Y+C5pWwOiAlcyIKKworIzogc3ludGF4LmM6NjI5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODog5LiN5ZCI5rOV55qE5YC8OiAlcyIKKworIzogc3ludGF4LmM6NjQxNworbXNnaWQgIkU0MTk6IEZHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MTk6IOmUmeivr+eahOWJjeaZr+minOiJsiIKKworIzogc3ludGF4LmM6NjQyOAorbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IOmUmeivr+eahOiDjOaZr+minOiJsiIKKworIzogc3ludGF4LmM6NjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6IOmUmeivr+eahOminOiJsuWQjeensOaIluaVsOWAvDogJXMiCisKKyM6IHN5bnRheC5jOjY2ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMjogdGVybWluYWwgY29kZSB0b28gbG9uZzogJXMiCittc2dzdHIgIkU0MjI6IOe7iOerr+e8lueggeWkqumVvzogJXMiCisKKyM6IHN5bnRheC5jOjY3MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MjM6IOWPguaVsOS4jeato+ehrjogJXMiCisKKyM6IHN5bnRheC5jOjcyNjMKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiDkvb/nlKjkuoblpKrlpJrkuI3lkIznmoTpq5jkuq7luqblsZ7mgKciCisKKyM6IHRhZy5jOjkwCittc2dpZCAiYXQgYm90dG9tIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAi5qCH562+KHRhZynloIbmoIjnu5PlsL4iCisKKyM6IHRhZy5jOjkxCittc2dpZCAiYXQgdG9wIG9mIHRhZyBzdGFjayIKK21zZ3N0ciAi5qCH562+KHRhZynloIbmoIjlvIDlpLQiCisKKyM6IHRhZy5jOjM5MgorbXNnaWQgIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI1OiDlt7Lnu4/lnKjmnIDliY3pnaLnmoTmoIfnrb4odGFnKeS6hiIKKworIzogdGFnLmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDI2OiDmib7kuI3liLDmoIfnrb4odGFnKTogJXMiCisKKyM6IHRhZy5jOjU0NQorbXNnaWQgIiAgIyBwcmkga2luZCB0YWciCittc2dzdHIgIiAgIyBwcmkga2luZCB0YWciCisKKyM6IHRhZy5jOjU0OAorbXNnaWQgImZpbGVcbiIKK21zZ3N0ciAi5paH5Lu2XG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3MDYKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIui+k+WFpSBuciDmiJbpgInmi6kgKDxDUj4g6YCA5Ye6KTogIgorCisjOiB0YWcuYzo3NDYKK21zZ2lkICJFNDI3OiBUaGVyZSBpcyBvbmx5IG9uZSBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjc6IOWPquacieatpOmhueespuWQiCIKKworIzogdGFnLmM6NzQ4Cittc2dpZCAiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyODog5bex57uP5Zyo5pyA5ZCO5LiA5Liq56ym5ZCI55qE5qCH562+KHRhZynkuoYiCisKKyM6IHRhZy5jOjc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAi5paH5Lu2IFwiJXNcIiDkuI3lrZjlnKgiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4MAorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAi5om+5YiwIHRhZzogJWQvJWQlcyIKKworIzogdGFnLmM6NzgzCittc2dpZCAiIG9yIG1vcmUiCittc2dzdHIgIiDmiJbmm7TlpJoiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgIOS7peS4jeWQjOWkp+Wwj+WGmeadpeS9v+eUqCB0YWchIgorCisjOiB0YWcuYzo4MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IOaWh+S7tiBcIiVzXCIg5LiN5a2Y5ZyoIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRhZy5jOjg5NworbXNnaWQgIiIKKyJcbiIKKyIgICMgVE8gdGFnICAgICAgICAgRlJPTSBsaW5lICBpbiBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgICMg5YiwIHRhZyAgICAgICAgIOS7jiAgIOihjCAgICDlnKgg5paH5Lu2L+aWh+acrCIKKworIzogdGFnLmM6MTE0NAorbXNnaWQgIkxpbmVhciB0YWcgc2VhcmNoIgorbXNnc3RyICLnur/mgKfmn6Xmib7moIfnrb4gKFRhZ3MpIgorCisjOiB0YWcuYzoxMTQ2Cittc2dpZCAiQmluYXJ5IHRhZyBzZWFyY2giCittc2dzdHIgIuS6jOi/m+WItuafpeaJvihCaW5hcnkgc2VhcmNoKSDmoIfnrb4oVGFncykiCisKKyM6IHRhZy5jOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAi5p+l5om+IHRhZyDmlofku7YgXCIlc1wiIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBUYWcg5paH5Lu26Lev5b6E6KKr5oiq5pat5Li6ICVzXG4iCisKKyM6IHRhZy5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IFRhZyDmlofku7YgXCIlc1wiIOagvOW8j+mUmeivryIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgIuWcqCAlbGQg5a2X6IqC5LmL5YmNIgorCisjOiB0YWcuYzoxODcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIKK21zZ3N0ciAiRTQzMjogVGFnIOaWh+S7tuacquaOkuW6jzogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiDmsqHmnIkgdGFnIOaWh+S7tiIKKworIzogdGFnLmM6MjU4MworbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IOaJvuS4jeWIsCB0YWciCisKKyM6IHRhZy5jOjI1OTQKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IOaJvuS4jeWIsCB0YWcsIOivleedgOeMnCEiCisKKyM6IHRlcm0uYzoxNzIzCittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInIOS4jeiDveWKoOi9veOAguWPr+eUqOeahOWGheW7uue7iOerr+W9ouW8j+aciToiCisKKyM6IHRlcm0uYzoxNzQ3Cittc2dpZCAiZGVmYXVsdGluZyB0byAnIgorbXNnc3RyICLpooTorr46ICciCisKKyM6IHRlcm0uYzoyMTAwCittc2dpZCAiQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICLkuI3og73miZPlvIAgdGVybWNhcCDmlofku7YiCisKKyM6IHRlcm0uYzoyMTAzCittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICLlnKh0ZXJtaW5mb+S4reacquaJvuWIsOe7iOerr+mhuSIKKworIzogdGVybS5jOjIxMDUKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAi5ZyodGVybWNhcOS4reacquaJvuWIsOe7iOerr+mhuSIKKworIzogdGVybS5jOjIyNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IHRlcm1jYXAg5rKh5pyJIFwiJXNcIiDpobkiCisKKyM6IHRlcm0uYzoyNzM4Cittc2dpZCAiRTQzNzogdGVybWluYWwgY2FwYWJpbGl0eSBcImNtXCIgcmVxdWlyZWQiCittc2dzdHIgIkU0Mzc6IOe7iOerr+mcgOimgSBcImNtXCIg55qE6IO95YqbIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0ODcyCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDnu4jnq6/mjInplK4gLS0tIgorCisjOiB1aS5jOjI0MAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgIuWQr+WKqOaWsCBzaGVsbFxuIgorCisjOiB1aS5jOjE3MDUKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiDor7vplJnor6/vvIzpgIDlh7rkuK0uLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozNTEKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIuS4jeiDvei/mOWOn++8m+ivt+e7p+e7rSIKKworIzogdW5kby5jOjUwNgorbXNnaWQgIkU0Mzg6IHVfdW5kbzogbGluZSBudW1iZXJzIHdyb25nIgorbXNnc3RyICJFNDM4OiB1X3VuZG86IOihjOWPt+mUmeivryIKKworIzogdW5kby5jOjY3NQorbXNnaWQgIjEgY2hhbmdlIgorbXNnc3RyICLkuIDpobnmlLnlj5giCisKKyM6IHVuZG8uYzo2NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIiVsZCDpobnmlLnlj5giCisKKyM6IHVuZG8uYzo3MjEKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTog5pKk6ZSA5YiX6KGo5o2f5Z2PIgorCisjOiB1bmRvLmM6NzUxCittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IOaJvuS4jeWIsOimgeaSpOmUgOaTjeS9nOeahOihjCIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjY1NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzLkvY0g5Zu+5Z6L55WM6Z2i54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NjU3Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBCaXQg5Zu+5Z6L55WM6Z2i54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NjYwCittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICJXaW4zMnMg5qih5byPIgorCisjOiB2ZXJzaW9uLmM6NjYyCittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIuaUr+aMgSBPTEUiCisKKyM6IHZlcnNpb24uYzo2NjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMuS9jSDlrZfnrKbnlYzpnaLniYjmnKwiCisKKyM6IHZlcnNpb24uYzo2NjkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzLkvY0g5a2X56ym55WM6Z2i54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NjczCittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIOS9jSBNUy1ET1Mg54mI5pysIgorCisjOiB2ZXJzaW9uLmM6Njc1Cittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IOS9jSBNUy1ET1Mg54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NjgxCittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSDniYjmnKwiCisKKyM6IHZlcnNpb24uYzo2ODMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCDniYjmnKwiCisKKyM6IHZlcnNpb24uYzo2ODYKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIOeJiOacrCIKKworIzogdmVyc2lvbi5jOjY5MQorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJSSVNDIE9TIOeJiOacrCIKKworIzogdmVyc2lvbi5jOjcwMQorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyLliqDlhaXooaXkuIE6ICIKKworIzogdmVyc2lvbi5jOjcyOAorbXNnaWQgIiIKKyJcbiIKKyJDb21waWxlZCAiCittc2dzdHIgIiIKKyJcbiIKKyLnvJbor5EiCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICJieSAiCittc2dzdHIgIuiAhToiCisKKyM6IHZlcnNpb24uYzo3NDMKK21zZ2lkICIiCisiXG4iCisiSHVnZSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIui2heW8uueJiOacrCAiCisKKyM6IHZlcnNpb24uYzo3NDYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisi5aSn5Z6L54mI5pysICIKKworIzogdmVyc2lvbi5jOjc0OQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLkuIDoiKzniYjmnKwgIgorCisjOiB2ZXJzaW9uLmM6NzUyCittc2dpZCAiIgorIlxuIgorIlNtYWxsIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisi566A5piT54mI5pysICIKKworIzogdmVyc2lvbi5jOjc1NAorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisi57K+566A54mI5pysICIKKworIzogdmVyc2lvbi5jOjc2MAorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAi5LiN5L2/55So5Zu+5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6NzY0Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEdUSy1HTk9NRSDlm77lnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo3NjYKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICLkvb/nlKggR1RLIOWbvuWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjc3MAorbXNnaWQgIndpdGggWDExLU1vdGlmIEdVSS4iCittc2dzdHIgIuS9v+eUqCBYMTEtTW90aWYg5Zu+5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6NzczCittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIuS9v+eUqCBYMTEtQXRoZW5hIOWbvuWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjc3NgorbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICLkvb/nlKggQmVPUyDlm77lnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo3NzkKK21zZ2lkICJ3aXRoIFBob3RvbiBHVUkuIgorbXNnc3RyICLkvb/nlKhQaG90b27lm77lnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo3ODIKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgIuS9v+eUqOWbvuWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjc4NQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgIuS9v+eUqCBDYXJib24g5Zu+5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6Nzg4Cittc2dpZCAid2l0aCBDb2NvYSBHVUkuIgorbXNnc3RyICLkvb/nlKggQ29jb2Eg5Zu+5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6NzkxCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAi5L2/55SoICjkvKDnu58pIOWbvuWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjgwMgorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiDnm67liY3lj6/kvb/nlKgoKynkuI7kuI3lj6/kvb/nlKgoLSnnmoTmqKHlnZfliJfooag6XG4iCisKKyM6IHZlcnNpb24uYzo4MTQKK21zZ2lkICIgICBzeXN0ZW0gdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAg57O757ufIHZpbXJjIOmFjee9ruaWh+S7tjogXCIiCisKKyM6IHZlcnNpb24uYzo4MTkKK21zZ2lkICIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAg55So5oi355qEIHZpbXJjIOmFjee9ruaWh+S7tjogXCIiCisKKyM6IHZlcnNpb24uYzo4MjQKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICDnrKzkuoznu4TnlKjmiLcgdmltcmMg5paH5Lu2OiBcIiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIiAzcmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgIOesrOS4iee7hOeUqOaItyB2aW1yYyDmlofku7Y6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODM0Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDnlKjmiLfnmoQgZXhyYyDphY3nva7mlofku7Y6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODM5Cittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDnrKzkuoznu4TnlKjmiLcgZXhyYyDmlofku7Y6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODQ1Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICDns7vnu58gZ3ZpbXJjIOaWh+S7tjogXCIiCisKKyM6IHZlcnNpb24uYzo4NDkKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAg55So5oi355qEIGd2aW1yYyDphY3nva7mlofku7Y6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODUzCittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDnrKzkuoznu4TnlKjmiLcgZ3ZpbXJjIOaWh+S7tjogXCIiCisKKyM6IHZlcnNpb24uYzo4NTgKK21zZ2lkICIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgIOesrOS4iee7hOeUqOaItyBndmltcmMg5paH5Lu2OiBcIiIKKworIzogdmVyc2lvbi5jOjg2NQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICDns7vnu5/oj5zljZXphY3nva7mlofku7Y6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODczCittc2dpZCAiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIgorbXNnc3RyICIgICAgICAgICAgICAgICRWSU0g6aKE6K6+5YC8OiBcIiIKKworIzogdmVyc2lvbi5jOjg3OQorbXNnaWQgIiBmLWIgZm9yICRWSU1SVU5USU1FOiBcIiIKK21zZ3N0ciAiICAgICAgICRWSU1SVU5USU1FIOmihOiuvuWAvDogXCIiCisKKyM6IHZlcnNpb24uYzo4ODMKK21zZ2lkICJDb21waWxhdGlvbjogIgorbXNnc3RyICLnvJbor5HmlrnlvI86ICIKKworIzogdmVyc2lvbi5jOjg4OQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIue8luivkeWZqDogIgorCisjOiB2ZXJzaW9uLmM6ODk0Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICLpk77nu5PmlrnlvI86ICIKKworIzogdmVyc2lvbi5jOjg5OQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAg6LCD6K+V54mI5pysIgorCisjOiB2ZXJzaW9uLmM6OTM0Cittc2dpZCAiVklNIC0gVmkgSU1wcm92ZWQiCittc2dzdHIgIlZJTSAtIFZpIElNcHJvdmVkIgorCisjOiB2ZXJzaW9uLmM6OTM2Cittc2dpZCAidmVyc2lvbiAiCittc2dzdHIgIueJiOacrCAgICIKKworIzogdmVyc2lvbi5jOjkzNworbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAi57u05oqk5Lq6OiBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyM6IHZlcnNpb24uYzo5MzgKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0g5Li65Y+v6Ieq55Sx5Y+R6KGM55qE5byA5pS+5rqQ5Luj56CB6L2v5Lu2IgorCisjOiB2ZXJzaW9uLmM6OTQwCittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIuW4ruWKqeS5jOW5sui+vueahOWPr+aAnOWEv+erpSEiCisKKyM6IHZlcnNpb24uYzo5NDEKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICLov5vkuIDmraXor7TmmI7or7fovpPlhaUgICAgICAgICAgOmhlbHAgaWNjZjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NDMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICLopoHpgIDlh7ror7fovpPlhaUgICAgICAgICAgICAgICAgICA6cTxFbnRlcj4gICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5NDQKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICLlnKjnur/luK7liqnor7fovpPlhaUgICAgICAgICAgICAgICAgOmhlbHA8RW50ZXI+ICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6OTQ1Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAi5paw54mI5pys5L+h5oGv6K+36L6T5YWlICAgICAgICAgICAgICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NDgKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiVmkg5YW85a655qih5byPIgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAi5aaC5p6c6KaB5a6M5YWo5qih5ouf5Lyg57ufIFZpIOivt+i+k+WFpSA6c2V0IG5vY3A8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTUwCittc2dpZCAidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAi5aaC5p6c6ZyA6KaB5a+5IFZpIOWFvOWuueaooeW8j+i/m+S4gOatpeivtOaYjuivt+i+k+WFpSA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiIKKworIzogdmVyc2lvbi5jOjk5MAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgIuazqOaEjzog5qOA5rWL5YiwIFdpbmRvd3MgOTUvOTgvTUUiCisKKyM6IHZlcnNpb24uYzo5OTMKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICLlpoLmnpzpnIDopoHlr7kgV2luZG93cyA5NSDmlK/mjIHnmoTmm7TlpJrkv6Hmga/or7fovpPlhaUgOmhlbHAgd2luZG93czk1PEVudGVyPiIKKworIzogd2luZG93LmM6MjAxCittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IOayoeaciemihOiniOeql+WPoyIKKworIzogd2luZG93LmM6NTY4Cittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0Mjog5LiN6IO95ZCM5pe25YiG5Ymy56qX5Y+j5Li65bem5LiK5ZKM5Y+z5LiL6KeSIgorCisjOiB3aW5kb3cuYzoxMzI3Cittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiDmnInlhbblroPliIblibLnqpflj6Pml7bkuI3og73ml4vovawiCisKKyM6IHdpbmRvdy5jOjE4MTAKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IOS4jeiDveWFs+mXreacgOWQjuS4gOS4queql+WPoyIKKworIzogd2luZG93LmM6MjQ3NAorbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICLlt7Lnu4/lj6rliankuIDkuKrnqpflj6PkuoYiCisKKyM6IHdpbmRvdy5jOjI1MjEKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTog5YW25a6D56qX5Y+j5pyJ5pS55Y+Y55qE5YaF5a65IgorCisjOiB3aW5kb3cuYzo0MzQxCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0Njog5YWJ5qCH5aSE5rKh5pyJ5paH5Lu25ZCNIgorCisjOiB3aW5kb3cuYzo0NDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0Nzog5Zyo6Lev5b6E5Lit5om+5LiN5Yiw5paH5Lu2IFwiJXNcIiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgIueUqCAmbXVsdGlwbGUgVmltcyDnvJbovpEiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTkyCittc2dpZCAiRWRpdCB3aXRoIHNpbmdsZSAmVmltIgorbXNnc3RyICLnlKggc2luZ2xlICZWaW0g57yW6L6RIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYwNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICLnlKggJlZpbSDnvJbovpEiCisKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MjgKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAi55So5b2T5YmN55qEIFZpbSDnvJbovpEgLSAmIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjc1MgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICLnlKggVmltIOe8lui+kemAieaLqeeahOaWh+S7tiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTEgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjkKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIuWIm+W7uui/m+eoi+Wksei0pTog6K+35qOA5p+lZ3ZpbeaYr+WQpuWcqOWPr+aJp+ihjOi3r+W+hOS4rSEiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkyIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA2CisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk3MAorbXNnaWQgImd2aW1leHQuZGxsIGVycm9yIgorbXNnc3RyICJndmltZXh0LmRsbCDlh7rplJkiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA1Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICLot6/lvoTlkI3lpKrplb8iCisKKyM6IGdsb2JhbHMuaDo4NzgKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLee8k+WGsuWMuuaXoOi1hOaWmS0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjEwMTkKK21zZ2lkICJDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIuWRveS7pOiiq+W8uuWItuS4reaWrSIKKworIzogZ2xvYmFscy5oOjEwMjAKK21zZ2lkICJBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAi6ZyA6KaB5oyH5Luk5Y+C5pWwIgorCisjOiBnbG9iYWxzLmg6MTAyMQorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBcXCDlkI7pnaLlupTor6XmnIkgLyA/IOaIliAmIgorCisjOiBnbG9iYWxzLmg6MTAyMworbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIkUxMTog5LiN6IO95Zyo5ZG95Luk6KGM56qX5Y+j5Lit5L2/55So44CCPENSPuaJp+ihjO+8jENUUkwtQyDpgIDlh7oiCisKKyM6IGdsb2JhbHMuaDoxMDI1Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICJFMTI6IGV4cmMvdmltcmMg6YeM55qE5oyH5Luk5LiN6IO95omn6KGMIgorCisjOiBnbG9iYWxzLmg6MTAyNgorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiDmlofku7blt7Lnu4/lrZjlnKggKOWPr+eUqCAhIOW8uuWItuabv+aNoikiCisKKyM6IGdsb2JhbHMuaDoxMDI3Cittc2dpZCAiQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIuWRveS7pOaJp+ihjOWksei0pSIKKworIzogZ2xvYmFscy5oOjEwMjgKK21zZ2lkICJJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAi5YaF6YOo6ZSZ6K+vIgorCisjOiBnbG9iYWxzLmg6MTAyOQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICLlt7LkuK3mlq0iCisKKyM6IGdsb2JhbHMuaDoxMDMwCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDog5LiN5q2j56Gu55qE5Zyw5Z2AIgorCisjOiBnbG9iYWxzLmg6MTAzMQorbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIuS4jeato+ehrueahOWPguaVsCIKKworIzogZ2xvYmFscy5oOjEwMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIuS4jeato+ehrueahOWPguaVsDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiDkuI3mraPnoa7nmoTooajovr7lvI86ICVzIgorCisjOiBnbG9iYWxzLmg6MTAzNgorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiDkuI3mraPnoa7nmoTojIPlm7QiCisKKyM6IGdsb2JhbHMuaDoxMDM3Cittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICLkuI3mraPnoa7nmoTlkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMDM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDmmK/nm67lvZUiCisKKyM6IGdsb2JhbHMuaDoxMDQyCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiAnPScg5YmN6Z2i5Ye6546w5LqG6ZSZ6K+v55qE5a2X56ymIgorCisjOiBnbG9iYWxzLmg6MTA0NAorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiDmoIforrDnmoTooYzlj7fplJnor68iCisKKyM6IGdsb2JhbHMuaDoxMDQ1Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDog5rKh5pyJ6K6+5a6a5qCH6K6wIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiDlm6DkuLogJ21vZGlmaWFibGUnIOmAiemhueaYr+WFs+mXreeahO+8jOaJgOS7peS4jeiDveS/ruaUuSIKKworIzogZ2xvYmFscy5oOjEwNDcKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6IOmAkuW9kuiwg+eUqOWkquWkmuWxgiIKKworIzogZ2xvYmFscy5oOjEwNDgKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IOayoeacieabv+S7o+eahOaWh+S7tiIKKworIzogZ2xvYmFscy5oOjEwNDkKK21zZ2lkICJFMjQ6IE5vIHN1Y2ggYWJicmV2aWF0aW9uIgorbXNnc3RyICJFMjQ6IOayoeaciei/meS4qiBhYmJyZXZpYXRpb24g5a+55bqUIgorCisjOiBnbG9iYWxzLmg6MTA1MAorbXNnaWQgIk5vICEgYWxsb3dlZCIKK21zZ3N0ciAi5LiN5Y+v5L2/55SoICchJyIKKworIzogZ2xvYmFscy5oOjEwNTIKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6IOWboOS4uue8luivkeaXtuayoeacieWKoOWFpeWbvuWei+eVjOmdoueahOeoi+W6j+S7o+egge+8jOaJgOS7peS4jeiDveS9v+eUqOWbvuWei+eVjOmdoiIKKworIzogZ2xvYmFscy5oOjEwNTUKK21zZ2lkICJFMjY6IEhlYnJldyBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNjog5Zug5Li657yW6K+R5pe25rKh5pyJ5Yqg5YWl5biM5Lyv6I6x55qE56iL5bqP5Luj56CB77yM5omA5Lul5LiN6IO95L2/55SoIEhlYnJld1xuIgorCisjOiBnbG9iYWxzLmg6MTA1OAorbXNnaWQgIkUyNzogRmFyc2kgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjc6IOWboOS4uue8luivkeaXtuayoeacieWKoOWFpSBGYXJzaSDnmoTnqIvluo/ku6PnoIHvvIzmiYDku6XkuI3og73kvb/nlKggRmFyc2lcbiIKKworIzogZ2xvYmFscy5oOjEwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiDmsqHmnInlkI3kuLogJyVzJyDnmoQgaGlnaGxpZ2h0IGdyb3VwIgorCisjOiBnbG9iYWxzLmg6MTA2MworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTog5rKh5pyJ5o+S5YWl6L+H5paH5a2XIgorCisjOiBnbG9iYWxzLmg6MTA2NAorbXNnaWQgIkUzMDogTm8gcHJldmlvdXMgY29tbWFuZCBsaW5lIgorbXNnc3RyICJFMzA6IOayoeacieWJjeS4gOmhueWRveS7pCIKKworIzogZ2xvYmFscy5oOjEwNjUKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiDmsqHmnInov5nkuKogbWFwcGluZyDlr7nlupQiCisKKyM6IGdsb2JhbHMuaDoxMDY2Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgIuaJvuS4jeWIsCIKKworIzogZ2xvYmFscy5oOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICLmib7kuI3liLA6ICVzIgorCisjOiBnbG9iYWxzLmg6MTA2OAorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IOayoeacieaWh+S7tuWQjSIKKworIzogZ2xvYmFscy5oOjEwNjkKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IOayoeacieWJjeS4gOS4quafpeaJvi/mm7/mjaLnmoTlkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMDcwCittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IOayoeacieWJjeS4gOS4quWRveS7pCIKKworIzogZ2xvYmFscy5oOjEwNzEKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiDmsqHmnInliY3kuIDkuKrmn6Xmib7lkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMDcyCittc2dpZCAiTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAi5LiN5Y+v5L2/55So6IyD5Zu05ZG95LukIgorCisjOiBnbG9iYWxzLmg6MTA3NAorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IOayoeaciei2s+Wkn+eahOepuumXtCIKKworIzogZ2xvYmFscy5oOjEwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIuS4jeiDveWIm+W7uuaWh+S7tiAlcyIKKworIzogZ2xvYmFscy5oOjEwNzcKK21zZ2lkICJDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIuS4jeiDveW+l+WIsOS4tOaXtuaWh+S7tuWQjSIKKworIzogZ2xvYmFscy5oOjEwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICLkuI3og73miZPlvIDmlofku7YgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAi5LiN6IO96K+75Y+W5paH5Lu2ICVzIgorCisjOiBnbG9iYWxzLmg6MTA4MAorbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiDmlofku7blhoXlrrnlt7LmlLnlj5jkvYblsJrmnKrkv53lrZggKOWPr+eUqCAhIOW8uuWItuaJp+ihjCkiCisKKyM6IGdsb2JhbHMuaDoxMDgxCittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IOepuueahCAoTnVsbCkg5Y+C5pWwIgorCisjOiBnbG9iYWxzLmg6MTA4MworbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IOW6lOivpeimgeacieaVsOWtlyIKKworIzogZ2xvYmFscy5oOjEwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiDkuI3og73miZPlvIDplJnor6/mlofku7YgJXMiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiDlhoXlrZjkuI3otrMhIgorCisjOiBnbG9iYWxzLmg6MTA5MgorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICLmib7kuI3liLDmqKHlvI8iCisKKyM6IGdsb2JhbHMuaDoxMDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAi5om+5LiN5Yiw5qih5byPICVzIgorCisjOiBnbG9iYWxzLmg6MTA5NQorbXNnaWQgIkFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIuWPguaVsOW6lOivpeaYr+ato+aVsCIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiDmsqHmnInplJnor68iCisKKyM6IGdsb2JhbHMuaDoxMDk5Cittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiDljLnphY3lrZfnrKbkuLLmnInpl67popgiCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDog5q2j5YiZ6KGo6L6+5byP5pyJ6Zeu6aKYIgorCisjOiBnbG9iYWxzLmg6MTEwMQorbXNnaWQgIkU0NTogJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NTog6K6+5a6aICdyZWFkb25seScg6YCJ6aG5KOWPquivuykgKOWPr+eUqCAhIOW8uuWItuaJp+ihjCkiCisKKyM6IGdsb2JhbHMuaDoxMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6IOS4jeiDveiuvuWumuWPquivu+WPmOmHjyBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMTA2Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiDor7vlj5bplJnor6/mlofku7blpLHotKUiCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6IOS4jeiDveWcqCBzYW5kYm94IOmHjOWHuueOsCIKKworIzogZ2xvYmFscy5oOjExMTEKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTog6ZSZ6K+v55qE5rua5Yqo5aSn5bCPIgorCisjOiBnbG9iYWxzLmg6MTExMgorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogJ0U3MTog6YCJ6aG5ICdzaGVsbCcg5pyq6K6+5a6aIgorCisjOiBnbG9iYWxzLmg6MTExMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IOS6pOaNouaWh+S7tuWFs+mXremUmeivryIKKworIzogZ2xvYmFscy5oOjExMTQKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiDmoIfnrb7loIbmoIjlt7LnqboiCisKKyM6IGdsb2JhbHMuaDoxMTE1Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IOWRveS7pOWkquWkjeadgiIKKworIzogZ2xvYmFscy5oOjExMTYKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTog5ZCN5a2X5aSq6ZW/IgorCisjOiBnbG9iYWxzLmg6MTExNworbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiDlpKrlpJogWyIKKworIzogZ2xvYmFscy5oOjExMTgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3Nzog5aSq5aSa5paH5Lu25ZCNIgorCisjOiBnbG9iYWxzLmg6MTExOQorbXNnaWQgIlRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIuS9oOi+k+WFpeS6huWkmuS9meeahOWtl+espiIKKworIzogZ2xvYmFscy5oOjExMjAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiDkuI3og73lip7or4bnmoTmoIforrAiCisKKyM6IGdsb2JhbHMuaDoxMTIxCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiDkuI3og73mianlsZXpgJrphY3nrKYiCisKKyM6IGdsb2JhbHMuaDoxMTIyCittc2dpZCAiRTgwOiBFcnJvciB3aGlsZSB3cml0aW5nIgorbXNnc3RyICJFODA6IOWGmeWFpemUmeivryIKKworIzogZ2xvYmFscy5oOjExMjMKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICLmlbDliLDpm7YgKD8pIgorCisjOiBnbG9iYWxzLmg6MTEyNQorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogPFNJRD4g5LiN6IO95ZyoIHNjcmlwdCDmnKzmloflpJbkvb/nlKguIgpkaWZmIC0tZ2l0IGEvc3JjL3BvL3poX0NOLmNwOTM2LnBvIGIvc3JjL3BvL3poX0NOLmNwOTM2LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTZjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG8vemhfQ04uY3A5MzYucG8KQEAgLTAsMCArMSw1OTM3IEBACisjIENoaW5lc2UgKHNpbXBsaWZpZWQpIFRyYW5zbGF0aW9uIGZvciBWaW0KKyMKKyMgRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisjIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorIworIyBGSVJTVCBBVVRIT1IgIFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPgorIworIyBHZW5lcmF0ZWQgZnJvbSB6aF9DTi5wbywgRE8gTk9UIEVESVQuCisjCisjLCBuby13cmFwCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBWaW0oU2ltcGxpZmllZCBDaGluZXNlKVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAxLTA5LTI0IDEwOjEwKzA4MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAxLTA5LTI0IDExOjEzKzA4MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPlxuIgorIkxhbmd1YWdlLVRlYW06IFdhbmcgSnVuIDxqdW53QHR1cmJvbGludXguY29tLmNuPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWdia1xuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDgtYml0XG4iCisKKyM6IGJ1ZmZlci5jOjk3Cittc2dpZCAiRTgyOiBDYW5ub3QgYWxsb2NhdGUgYW55IGJ1ZmZlciwgZXhpdGluZy4uLiIKK21zZ3N0ciAiRTgyOiCyu8Tct9bF5MjOus67urPlx/ijrM3Ls/azzNDyLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiCyu8Tct9bF5Lu6s+XH+KOsyrnTw8Ht0ru49ru6s+XH+C4uLi4iCisKKyM6IGJ1ZmZlci5jOjY5OAorbXNnaWQgIk5vIGJ1ZmZlcnMgd2VyZSB1bmxvYWRlZCIKK21zZ3N0ciAiw7vT0MrNt8XIzrrOu7qz5cf4IgorCisjOiBidWZmZXIuYzo3MDAKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgZGVsZXRlZCIKK21zZ3N0ciAiw7vT0Mm+s/3IzrrOu7qz5cf4IgorCisjOiBidWZmZXIuYzo3MDIKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgd2lwZWQgb3V0IgorbXNnc3RyICLDu9PQyb6z/cjOus67urPlx/giCisKKyM6IGJ1ZmZlci5jOjcxMAorbXNnaWQgIjEgYnVmZmVyIHVubG9hZGVkIgorbXNnc3RyICLS0crNt8XSu7j2u7qz5cf4IgorCisjOiBidWZmZXIuYzo3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAi0tHKzbfFICVkILj2u7qz5cf4IgorCisjOiBidWZmZXIuYzo3MTcKK21zZ2lkICIxIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICLS0cm+s/3Su7j2u7qz5cf4IgorCisjOiBidWZmZXIuYzo3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICLS0cm+s/0gJWQguPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjcyNAorbXNnaWQgIjEgYnVmZmVyIHdpcGVkIG91dCIKK21zZ3N0ciAi0tHJvrP90ru49ru6s+XH+CIKKworIzogYnVmZmVyLmM6NzI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICLS0cm+s/0gJWQguPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjc4MworbXNnaWQgIkU4NDogTm8gbW9kaWZpZWQgYnVmZmVyIGZvdW5kIgorbXNnc3RyICJFODQ6IMO709DQ3rjEuf21xLu6s+XH+CIKKworIy4gYmFjayB3aGVyZSB3ZSBzdGFydGVkLCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyM6IGJ1ZmZlci5jOjgyMgorbXNnaWQgIkU4NTogVGhlcmUgaXMgbm8gbGlzdGVkIGJ1ZmZlciIKK21zZ3N0ciAiRTg1OiDDu9PQv8nB0LP2tcS7urPlx/giCisKKyM6IGJ1ZmZlci5jOjgzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFODY6IENhbm5vdCBnbyB0byBidWZmZXIgJWxkIgorbXNnc3RyICJFODY6ILK7xNzH0Lu7tb212iAlbGQguPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjgzNworbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiCyu8Tcx9C7u7W9uPy688PmtcS7urPlx/giCisKKyM6IGJ1ZmZlci5jOjgzOQorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogsrvE3MfQu7u1vbj8x7DD5rXEu7qz5cf4IgorCisjOiBidWZmZXIuYzo4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg5OiBObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSBmb3IgYnVmZmVyICVsZCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFODk6INLRuPy4xLn9u7qz5cf4ICVsZCC1q8nQzrSxo7TmICi/ydPDICEgx7/Wxta00NApIgorCisjOiBidWZmZXIuYzo4NzkKK21zZ2lkICJFOTA6IENhbm5vdCB1bmxvYWQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU5MDogsrvE3MrNt8XX7rrz0ru49ru6s+XH+CIKKworIzogYnVmZmVyLmM6MTMxNAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IL6vuOY6IM7EvP7D+7n9tuAiCisKKyM6IGJ1ZmZlci5jOjE0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiDV0rK7tb212iAlbGQguPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjE3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiDV0rW90ru49tLUyc+1xCAlcyIKKworIzogYnVmZmVyLmM6MTcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDog1dKyu7W9ICVzIgorCisjOiBidWZmZXIuYzoyMTA1IGV4X2RvY21kLmM6NjA2NQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAi0NAgJWxkIgorCisjOiBidWZmZXIuYzoyMTg4Cittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTog0tHT0Lu6s+XH+Mq508PV4rj2w/vX1iIKKworIzogYnVmZmVyLmM6MjQ4MQorbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW9LR0N64xF0iCisKKyM6IGJ1ZmZlci5jOjI0ODYKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIlvOtLHgvK1dIgorCisjOiBidWZmZXIuYzoyNDkxCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW9DCzsS8/l0iCisKKyM6IGJ1ZmZlci5jOjI0OTIKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbtsG07c7zXSIKKworIzogYnVmZmVyLmM6MjQ5NCBmaWxlaW8uYzoxNzU0Cittc2dpZCAiW3JlYWRvbmx5XSIKK21zZ3N0ciAiW9a7tsFdIgorCisjOiBidWZmZXIuYzoyNTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAi0NDK/SAxIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAtLSVkJSUtLSIKK21zZ3N0ciAi0NDK/SAlbGQgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQgb2YgJWxkIC0tJWQlJS0tIGNvbCAiCittc2dzdHIgItDQICVsZC8lbGQgLS0lZCUlLS0gwdAgIgorCisjOiBidWZmZXIuYzoyNjA2Cittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJbzrTD/MP7XSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyNjQ2Cittc2dpZCAiaGVscCIKK21zZ3N0ciAiW7Dv1vpdIgorCisjOiBidWZmZXIuYzozMTUxIHNjcmVlbi5jOjQ2NTcKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIluw79b6XSIKKworIzogYnVmZmVyLmM6MzE4MyBzY3JlZW4uYzo0NjYzCittc2dpZCAiW1ByZXZpZXddIgorbXNnc3RyICJb1KTAwF0iCisKKyM6IGJ1ZmZlci5jOjMzODkKK21zZ2lkICJBbGwiCittc2dzdHIgIsirsr8iCisKKyM6IGJ1ZmZlci5jOjMzODkKK21zZ2lkICJCb3QiCittc2dzdHIgIrXXtssiCisKKyM6IGJ1ZmZlci5jOjMzOTEKK21zZ2lkICJUb3AiCittc2dzdHIgIraltssiCisKKyM6IGJ1ZmZlci5jOjQxMjcKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgu7qz5cf4wdCx7TpcbiIKKworIzogYnVmZmVyLmM6NDE2MAorbXNnaWQgIltFcnJvciBMaXN0XSIKK21zZ3N0ciAiW7TtzvPB0LHtXSIKKworIzogYnVmZmVyLmM6NDE3MyBtZW1saW5lLmM6MTUxMworbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW860w/zD+10iCisKKyM6IGJ1ZmZlci5jOjQzOTMKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSC3+7rFIC0tLSIKKworIzogYnVmZmVyLmM6NDQwMworIywgYy1mb3JtYXQKK21zZ2lkICJTaWducyBmb3IgJXM6IgorbXNnc3RyICIlcyC1xLf7usU6IgorCisjOiBidWZmZXIuYzo0NDA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBsaW5lPSVsZCAgaWQ9JWQgIG5hbWU9JXMiCittc2dzdHIgIiAgICDQ0D0lbGQgIGlkPSVkICDD+7PGPSVzIgorCisjOiBkaWZmLmM6MTMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5NjogQ2FuIG5vdCBkaWZmIG1vcmUgdGhhbiAlbGQgYnVmZmVycyIKK21zZ3N0ciAiRTk2OiCyu8Tcsci9zyhkaWZmKSAlbGS49tLUyc+1xLu6s+XH+CIKKworIzogZGlmZi5jOjY0OAorbXNnaWQgIkU5NzogQ2Fubm90IGNyZWF0ZSBkaWZmcyIKK21zZ3N0ciAiRTk3OiCyu8TctLS9qCBkaWZmICIKKworIzogZGlmZi5jOjc0NworbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIlBhdGNoIM7EvP4iCisKKyM6IGRpZmYuYzo5OTEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6ILK7xNy2wcihIGRpZmYgtcTK5LP2IgorCisjOiBkaWZmLmM6MTcwNAorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiDEv8ewtcS7urPlx/iyu8rH1NogZGlmZiDEo8q9IgorCisjOiBkaWZmLmM6MTcxNgorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IMO709C7urPlx/jU2iBkaWZmIMSjyr0iCisKKyM6IGRpZmYuYzoxNzI0Cittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiDT0MG9uPbS1MnPtcS7urPlx/jU2iBkaWZmIMSjyr2jrLK7xNy+9rao0qrTw8TE0ru49iIKKworIzogZGlmZi5jOjE3NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiDV0rK7tb27urPlx/g6IFwiJXNcIiIKKworIzogZGlmZi5jOjE3NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiC7urPlx/ggXCIlc1wiILK7ysfU2iBkaWZmIMSjyr0iCisKKyM6IGRpZ3JhcGguYzoyMTY4Cittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6ILi0us/X1rf7KGRpZ3JhcGgp1tCyu8TcyrnTwyBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQwCittc2dpZCAiS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICLV0rK7tb0ga2V5bWFwIM7EvP4iCisKKyM6IGRpZ3JhcGguYzoyMzY3Cittc2dpZCAiRTEwNTogVXNpbmcgOmxvYWRrZXltYXAgbm90IGluIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTA1OiDKudPDIDpsb2Fka2V5bWFwICIKKworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgudi8/NfW19S2r83qs8kgKF5OL15QKSIKKworIy4gY3RybF94X21vZGUgPT0gMCwgXlAvXk4gY29tcGwuCisjOiBlZGl0LmM6NDEKK21zZ2lkICIgXlggbW9kZSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXlYvXk4vXlApIgorbXNnc3RyICIgXlggxKPKvSAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXk4vXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgx/jT8rnYvPzX1tfUtq/N6rPJICheTi9eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5ML15OL15QKSIKK21zZ3N0ciAiINX70NDX1LavzeqzySAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIM7EvP7D+9fUtq/N6rPJICheRi9eTi9eUCkiCisKKyM6IGVkaXQuYzo0NworbXNnaWQgIiBUYWcgY29tcGxldGlvbiAoXl0vXk4vXlApIgorbXNnc3RyICIgserHqdfUtq/N6rPJICheXS9eTi9eUCkiCisKKyM6IGVkaXQuYzo0OAorbXNnaWQgIiBQYXRoIHBhdHRlcm4gY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIgwre+ttfUtq/N6rPJICheTi9eUCkiCisKKyM6IGVkaXQuYzo0OQorbXNnaWQgIiBEZWZpbml0aW9uIGNvbXBsZXRpb24gKF5EL15OL15QKSIKK21zZ3N0ciAiILao0uXX1LavzeqzySAoXkQvXk4vXlApIgorCisjOiBlZGl0LmM6NTEKK21zZ2lkICIgRGljdGlvbmFyeSBjb21wbGV0aW9uICheSy9eTi9eUCkiCittc2dzdHIgIiDX1rXk19S2r83qs8kgKF5LL15OL15QKSIKKworIzogZWRpdC5jOjUyCittc2dpZCAiIFRoZXNhdXJ1cyBjb21wbGV0aW9uICheVC9eTi9eUCkiCittc2dzdHIgIiBUaGVzYXVydXMg19S2r83qs8kgKF5UL15OL15QKSIKKworIzogZWRpdC5jOjUzCittc2dpZCAiIENvbW1hbmQtbGluZSBjb21wbGV0aW9uICheVi9eTi9eUCkiCittc2dzdHIgIiDD/MHu19S2r83qs8kgKF5WL15OL15QKSIKKworIzogZWRpdC5jOjU2Cittc2dpZCAiSGl0IGVuZCBvZiBwYXJhZ3JhcGgiCittc2dzdHIgItLRtb22zsLkveHOsiIKKworIzogZWRpdC5jOjg5NAorbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAi0aHP7iAndGhlc2F1cnVzJyDOtMnotqgiCisKKyM6IGVkaXQuYzoxMDcwCittc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAi0aHP7iAnZGljdGlvbmFyeScgzqq/1SIKKworIzogZWRpdC5jOjE5OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIsmow+jX1rXkOiAlcyIKKworIzogZWRpdC5jOjIxODMKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAosuXI6ykgU2Nyb2xsICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMTg1Cittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICjM5ru7KSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjI0OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICLJqMPo1tA6ICVzIgorCisjOiBlZGl0LmM6MjUzMQorbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICLJqMPoserHqS4iCisKKyM6IGVkaXQuYzozMTg5Cittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiINT2vNMiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzIzOAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gy9HRsNbQLi4uIgorCisjOiBlZGl0LmM6MzI5NAorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIrvYtb3G8LXjIgorCisjOiBlZGl0LmM6MzI5OQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICK008bky/zQ0L+qyry1xLTKICg/KSIKKworIzogZWRpdC5jOjMzMDQKK21zZ2lkICJUaGUgb25seSBtYXRjaCIKK21zZ3N0ciAi1rvT0LTLz+7GpcXkIgorCisjOiBlZGl0LmM6MzM2MworIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCBvZiAlZCIKK21zZ3N0ciAi1dK1vSAlZCAvICVkIgorCisjOiBlZGl0LmM6MzM2NgorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAixqXF5CAlZCIKKworIzogZXZhbC5jOjY5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IM60tqjS5bXEseTBvzogXCIlc1wiIgorCisjOiBldmFsLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDc6IE1pc3NpbmcgYnJhY2VzOiAlcyIKK21zZ3N0ciAiRTEwNzogyLHJ2bbU06a1xMCousU6ICVzIgorCisjOiBldmFsLmM6MTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IM7etMux5MG/OiBcIiVzXCIiCisKKyM6IGV2YWwuYzoxMjg0Cittc2dpZCAiRTEwOTogTWlzc2luZyAnOicgYWZ0ZXIgJz8nIgorbXNnc3RyICJFMTA5OiAnPycguvPIscnZICc6JyIKKworIzogZXZhbC5jOjE4OTgKK21zZ2lkICJFMTEwOiBNaXNzaW5nICcpJyIKK21zZ3N0ciAiRTExMDogyLHJ2bbU06a1xCBcIilcIiIKKworIzogZXZhbC5jOjE5NDgKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTogyLHJ2bbU06a1xCBcIl1cIiIKKworIzogZXZhbC5jOjIwMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMjogT3B0aW9uIG5hbWUgbWlzc2luZzogJXMiCittc2dzdHIgIkUxMTI6IMixydnRoc/uw/uzxjogJXMiCisKKyM6IGV2YWwuYzoyMDQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTM6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTExMzogsrvV/ci3tcTRoc/uOiAlcyIKKworIzogZXZhbC5jOjIxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNDogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTQ6IMixydnS/brFOiAlcyIKKworIzogZXZhbC5jOjIyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IMixydnS/brFOiAlcyIKKworIzogZXZhbC5jOjI1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNjogSW52YWxpZCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICVzIgorbXNnc3RyICJFMTE2OiC6r8r9ICVzILXEss7K/bK71f3ItyIKKworIzogZXZhbC5jOjI1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IM60tqjS5bXEuq/K/TogJXMiCisKKyM6IGV2YWwuYzoyNTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiC6r8r9ICVzILXEss7K/bn9tuAiCisKKyM6IGV2YWwuYzoyNTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTk6ILqvyv0gJXMgtcSyzsr9zKvJ2SIKKworIzogZXZhbC5jOjI1NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMDogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQ6ICVzIgorbXNnc3RyICJFMTIwOiA8U0lEPiCyu8Tc1Nogc2NyaXB0IMnPz8LOxM3iyrnTwzogJXMiCisKKyM6IGV2YWwuYzozNTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIistJXMlM2xkIGxpbmVzOiAiCittc2dzdHIgIistJXMlM2xkINDQOiAiCisKKyM6IGV2YWwuYzo0Njg5Cittc2dpZCAiIgorIiZPS1xuIgorIiZDYW5jZWwiCittc2dzdHIgIiIKKyLIt7aoKCZPKVxuIgorIsihz/soJkMpIgorCisjOiBldmFsLmM6NTUxMQorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogw7vT0NPrIFZpbSBTZXJ2ZXIgtLS9qMGsvdMiCisKKyM6IGV2YWwuYzo1NjAxCittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6ILK7xNy2wciht/7O8cb3tcTP7NOmIgorCisjOiBldmFsLmM6NTYyNgorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODogsrvE3LSry821vb/Nu6e2yyIKKworIzogZXZhbC5jOjU2NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gJXMiCittc2dzdHIgIkUyNDE6ILK7xNy0q8vNtb0gJXMiCisKKyM6IGV2YWwuYzo1NzYzCittc2dpZCAiKEludmFsaWQpIgorbXNnc3RyICIozt7QpykiCisKKyM6IGV2YWwuYzo2NzY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6ILHkwb8gJXMgydDOtLao0uUiCisKKyM6IGV2YWwuYzo3NDY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCB1c2UgISB0byByZXBsYWNlIgorbXNnc3RyICJFMTIyOiC6r8r9ICVzINLRvq205tTaLCDH68q508MgISDHv9bGzOa7uyIKKworIzogZXZhbC5jOjc1MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyMzogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEyMzoguq/K/SAlcyDJ0M60tqjS5SIKKworIzogZXZhbC5jOjc1MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNDogTWlzc2luZyAnKCc6ICVzIgorbXNnc3RyICJFMTI0OiDIscnZIFwiKFwiOiAlcyIKKworIzogZXZhbC5jOjc1NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6ILLOyv2yu9X9yLc6ICVzIgorCisjOiBldmFsLmM6NzYzNworbXNnaWQgIkUxMjY6IE1pc3NpbmcgOmVuZGZ1bmN0aW9uIgorbXNnc3RyICJFMTI2OiDIscnZIDplbmRmdW5jdGlvbiIKKworIzogZXZhbC5jOjc3MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNzogQ2Fubm90IHJlZGVmaW5lIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMjc6ILqvyv0gJXMg1f3U2sq508PW0KOssrvE3NbY0MK2qNLlIgorCisjOiBldmFsLmM6Nzc3MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTI4OiBGdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWw6ICVzIgorbXNnc3RyICJFMTI4OiC6r8r9w/uzxrXa0ru49tfWxLix2NDrtPPQtDogJXMiCisKKyM6IGV2YWwuYzo3Nzc5Cittc2dpZCAiRTEyOTogRnVuY3Rpb24gbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTEyOTog0OjSqrqvyv3D+7PGIgorCisjOiBldmFsLmM6Nzg3MgorbXNnaWQgImZ1bmN0aW9uICIKK21zZ3N0ciAiuq/K/SAiCisKKyM6IGV2YWwuYzo3OTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzA6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMzA6ILqvyv0gJXMgydDOtLao0uUiCisKKyM6IGV2YWwuYzo3OTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzE6IENhbm5vdCBkZWxldGUgZnVuY3Rpb24gJXM6IEl0IGlzIGluIHVzZSIKK21zZ3N0ciAiRTEzMToguq/K/SAlcyDV/dTayrnTw9bQo6yyu8Tcyb6z/SIKKworIzogZXZhbC5jOjgwMzkKK21zZ2lkICJFMTMyOiBGdW5jdGlvbiBjYWxsIGRlcHRoIGlzIGhpZ2hlciB0aGFuICdtYXhmdW5jZGVwdGgnIgorbXNnc3RyICJFMTMyOiC6r8r9td256bX308Oy48r9s6y5/SAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICK199PDICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4MTE1IGV4X2NtZHMyLmM6MTk3MworIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICK8zND4OiAlcyIKKworIzogZXZhbC5jOjgxNjkKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybiCx2NDr1Nq6r8r9wO/KudPDIgorCisjOiBldmFsLmM6ODI0NworIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgt7W72Na1ICMlbGQgIgorCisjOiBldmFsLmM6ODI1MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICIlcyC3tbvY1rUgXCIlc1wiIgorCisjOiBldmFsLmM6ODM5MQorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIMirvtax5MG/OlxuIgorCisjOiBleF9jbWRzMi5jOjcwCittc2dpZCAiRW50ZXJpbmcgRGVidWcgbW9kZS4gIFR5cGUgXCJjb250XCIgdG8gbGVhdmUuIgorbXNnc3RyICK9+MjrtffK1MSjyr0uIMrkyOsgXCJjb250XCIg0tS72LW91f2zo8Sjyr0uIgorCisjOiBleF9jbWRzMi5jOjc0IGV4X2RvY21kLmM6NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiAlcyIKK21zZ3N0ciAi0NAgJWxkOiAlcyIKKworIzogZXhfY21kczIuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJjbWQ6ICVzIgorbXNnc3RyICJjbWQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICJCcmVha3BvaW50IGluIFwiJXMlc1wiIGxpbmUgJWxkIgorbXNnc3RyICJcIiVzJXNcIiDW0LbPteM6ILXaICVsZCDQ0CIKKworIzogZXhfY21kczIuYzozODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MTogQnJlYWtwb2ludCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMTYxOiDV0rK7tb3W0LbPteM6ICVzIgorCisjOiBleF9jbWRzMi5jOjQxNAorbXNnaWQgIk5vIGJyZWFrcG9pbnRzIGRlZmluZWQiCittc2dzdHIgIsO709C2qNLl1tC2z7XjIgorCisjOiBleF9jbWRzMi5jOjQxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlM2QgICVzICVzICBsaW5lICVsZCIKK21zZ3N0ciAiJTNkICAlcyAlcyAgtdogJWxkINDQIgorCisjOiBleF9jbWRzLmM6MjA1MyBleF9jbWRzLmM6MjI4OSBleF9jbWRzMi5jOjYwMgorbXNnaWQgIlNhdmUgQXMiCittc2dzdHIgIsHttObOqiIKKworIzogZXhfY21kczIuYzo2MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAivau4xLHksaO05rW9IFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo2MjcgZXhfZG9jbWQuYzo4NjEyCittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIs60w/zD+yIKKworIzogZXhfY21kczIuYzo3NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6INLRuPy4xLn9u7qz5cf4IFwiJXNcIiC1q8nQzrSxo7TmICi/ydPDICEgx7/Wxta00NApIgorCisjOiBleF9jbWRzMi5jOjgzMgorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAi16LS4jog0tHH0Lu7tb3G5Mv8u7qz5cf4ICjH67zssukgQXV0b2NvbW1hbmRzINPQzt607c7zKSIKKworIzogZXhfY21kczIuYzoxMjA4Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiDWu9PQ0ru49s7EvP6/ybHgvK0iCisKKyM6IGV4X2NtZHMyLmM6MTIxMAorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDog0tG+rdTatdrSu7j2zsS8/sHLIgorCisjOiBleF9jbWRzMi5jOjEyMTIKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTog0tG+rdTa1+6689K7uPbOxLz+wcsiCisKKyM6IGV4X2NtZHMyLmM6MTYzMgorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIrLp1dLW0DogXCIlc1wiIC0tIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICKy6dXS1tA6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgItTaICdydW50aW1lcGF0aCcgwO/V0rK7tb0gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE3MTIKK21zZ2lkICJSdW4gTWFjcm8iCittc2dzdHIgIta00NC66iIKKworIzogZXhfY21kczIuYzoxODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBzb3VyY2UgYSBkaXJlY3Rvcnk6IFwiJXNcIiIKK21zZ3N0ciAisrvE3Na00NDEv8K8o7ogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIrK7xNzWtNDQIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAitdogJWxkINDQOiCyu8Tc1rTQ0CBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg2MworIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIta00NAgXCIlc1wiINbQIgorCisjOiBleF9jbWRzMi5jOjE4NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAitdogJWxkINDQOiC94cr41rTQ0CAlcyIKKworIzogZXhfY21kczIuYzoxOTcxCisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICK94cr41rTQ0CAlcyIKKworIzogZXhfY21kczIuYzoyMjcyCittc2dpZCAiVzE1OiBXYXJuaW5nOiBXcm9uZyBsaW5lIHNlcGFyYXRvciwgXk0gbWF5IGJlIG1pc3NpbmciCittc2dzdHIgIlcxNTog16LS4jogtO3O87XE0NC31rj019a3+6Osv8nE3MrHydnByyBeTSIKKworIzogZXhfY21kczIuYzoyMzIxCittc2dpZCAiRTE2NzogOnNjcmlwdGVuY29kaW5nIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2Nzog1NrWtNDQIHNjcmlwdCDOxLz+zeKyu7/JyrnTwyA6c2NyaXB0ZW5jb2RpbmciCisKKyM6IGV4X2NtZHMyLmM6MjM1NAorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiDU2ta00NAgc2NyaXB0IM7EvP7N4rK7v8nKudPDIDpmaW5pc2giCisKKyM6IGV4X2NtZHMyLmM6MjgyMAorbXNnaWQgIk5vIHRleHQgdG8gYmUgcHJpbnRlZCIKK21zZ3N0ciAiw7vT0NKqtPLTobXEzsTX1iIKKworIzogZXhfY21kczIuYzoyODk4CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nIHBhZ2UgJWQgKCVkJSUpIgorbXNnc3RyICK08tOh1tA6ILXaICVkINKzICglZCUlKSIKKworIzogZXhfY21kczIuYzoyOTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICK4tNbGICVkIC8gJWQiCisKKyM6IGV4X2NtZHMyLmM6Mjk1OQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGVkOiAlcyIKK21zZ3N0ciAi0tG08tOhOiAlcyIKKworIzogZXhfY21kczIuYzoyOTY2Cittc2dpZCAiUHJpbnRpbmcgYWJvcnRlZCIKK21zZ3N0ciAitPLTodbQts8iCisKKyM6IGV4X2NtZHMyLmM6MzM0NAorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTog0LTI6yBQb3N0U2NyaXB0IM7EvP6z9rTtIgorCisjOiBleF9jbWRzMi5jOjQwMTkKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6ILK7xNy08r+qIFBvc3RTY3JpcHQgyuSz9s7EvP4iCisKKyM6IGV4X2NtZHMyLmM6NDA1NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiCyu8TctPK/qs7EvP4gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQwNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiCyu8TctsEgUG9zdFNjcmlwdCDXytS0zsS8/iBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDI2NgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAit6LLzbW9tPLTobv6Li4uIgorCisjOiBleF9jbWRzMi5jOjQyNzAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiC08tOhIFBvc3RTY3JpcHQgzsS8/sqnsNwiCisKKyM6IGV4X2NtZHMyLmM6NDI3MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAiIgorCisjOiBleF9jbWRzMi5jOjQ2NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIsS/x7C1xCAlc9Pv0dQ6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0NjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTc6IENhbm5vdCBzZXQgbGFuZ3VhZ2UgdG8gXCIlc1wiIgorbXNnc3RyICJFMTk3OiCyu8Tcyei2qNPv0dTOqiBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICI8JXM+JXMlcyAgJWQsICBIZXggJTAyeCwgIE9jdGFsICUwM28iCittc2dzdHIgIjwlcz4lcyVzICAlZCwgIMquwfm9+NbGICUwMngsICCwy7341sYgJTAzbyIKKworIzogZXhfY21kcy5jOjQyOAorbXNnaWQgIkUxMzQ6IE1vdmUgbGluZXMgaW50byB0aGVtc2VsdmVzIgorbXNnc3RyICJFMTM0OiCyu8TcsNHQ0NLGtb3L/NfU0tHE2iIKKworIzogZXhfY21kcy5jOjQ5NworbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAi0tHSxravIDEg0NAiCisKKyM6IGV4X2NtZHMuYzo0OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIG1vdmVkIgorbXNnc3RyICLS0bDh0sYgJWxkINDQIgorCisjOiBleF9jbWRzLmM6ODkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBmaWx0ZXJlZCIKK21zZ3N0ciAi0tG0psDtICVsZCDQ0CIKKworIzogZXhfY21kcy5jOjkxOAorbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kILK7v8nS1Lj8uMS7urPlx/i1xMTayN0iCisKKyM6IGV4X2NtZHMuYzoxMDAzCittc2dpZCAiW05vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlXVxuIgorbXNnc3RyICJbuPzQwrrzydDOtLGjtOZdXG4iCisKKyM6IGV4X2NtZHMuYzoxMjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgInZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAidmltaW5mbzogJXMg1NrQ0NbQOiAiCisKKyM6IGV4X2NtZHMuYzoxMjUzCittc2dpZCAiRTEzNjogdmltaW5mbzogVG9vIG1hbnkgZXJyb3JzLCBza2lwcGluZyByZXN0IG9mIGZpbGUiCittc2dzdHIgIkUxMzY6IHZpbWluZm86ILn9tuC07c7zLCC69sLUzsS8/sbk0+Cyv7fWIgorCisjOiBleF9jbWRzLmM6MTI4MgorIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkaW5nIHZpbWluZm8gZmlsZSBcIiVzXCIlcyVzJXMiCittc2dzdHIgIrbByKEgdmltaW5mbyDOxLz+IFwiJXNcIiVzJXMlcyIKKworIzogZXhfY21kcy5jOjEyODMKK21zZ2lkICIgaW5mbyIKK21zZ3N0ciAiINDFz6IiCisKKyM6IGV4X2NtZHMuYzoxMjg0Cittc2dpZCAiIG1hcmtzIgorbXNnc3RyICIgseq8xyIKKworIzogZXhfY21kcy5jOjEyODUKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIgyqew3CIKKworIzogZXhfY21kcy5jOjEzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzNzogVmltaW5mbyBmaWxlIGlzIG5vdCB3cml0YWJsZTogJXMiCittc2dzdHIgIkUxMzc6IFZpbWluZm8gzsS8/rK7xNzQtMjrOiAlcyIKKworIzogZXhfY21kcy5jOjE1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzODogQ2FuJ3Qgd3JpdGUgdmltaW5mbyBmaWxlICVzISIKK21zZ3N0ciAiRTEzODogsrvE3NC0yOsgdmltaW5mbyDOxLz+ICVzICEiCisKKyM6IGV4X2NtZHMuYzoxNTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi0LTI6yB2aW1pbmZvIM7EvP4gXCIlc1wiINbQIgorCisjLiBXcml0ZSB0aGUgaW5mbzoKKyM6IGV4X2NtZHMuYzoxNjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiMgVGhpcyB2aW1pbmZvIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBWaW0gJXMuXG4iCittc2dzdHIgIiMgdmltaW5mbyDOxLz+ysfTySB2aW0gJXMgy/my+sn6LlxuIgorCisjOiBleF9jbWRzLmM6MTYxMgorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMgyOe5+8/r0qrX1NDQ0N64xMfrzNix8NCh0MSjoVxuIgorIlxuIgorCisjOiBleF9jbWRzLmM6MTYxNAorbXNnaWQgIiMgVmFsdWUgb2YgJ2VuY29kaW5nJyB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlblxuIgorbXNnc3RyICIjICdlbmNvZGluZycg1Nq0y87EvP69qMGiyrG1xNa1XG4iCisKKyM6IGV4X2NtZHMuYzoxNzEzCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICLO3tCntcTG9Lav19a3+yIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMDk2Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6IMT61NrB7dK7uPa7urPlx/jSsrzT1NjBy9XiuPbOxLz+IgorCisjOiBleF9jbWRzLmM6MjEzMAorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgItKq0LTI67K/t9bOxLz+wvCjvyIKKworIzogZXhfY21kcy5jOjIxMzcKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogx+vKudPDICEgwLTQtMjrsr+31ru6s+XH+CIKKworIzogZXhfY21kcy5jOjIyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICLSqriyuMfS0bTm1Nq1xM7EvP4gXCIlLipzXCKjvyIKKworIzogZXhfY21kcy5jOjIyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiC7urPlx/ggJWxkIMO709DOxLz+w/siCisKKyM6IGV4X2NtZHMuYzoyMzMyCittc2dpZCAiRTE0MjogRmlsZSBub3Qgd3JpdHRlbjogV3JpdGluZyBpcyBkaXNhYmxlZCBieSAnd3JpdGUnIG9wdGlvbiIKK21zZ3N0ciAiRTE0MjogzsS8/s600LTI66Os0vLOqiAnd3JpdGUnINGhz+652LHVIgorCisjOiBleF9jbWRzLmM6MjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJ3JlYWRvbmx5JyBvcHRpb24gaXMgc2V0IGZvciBcIiUuKnNcIi5cbiIKKyJEbyB5b3Ugd2lzaCB0byB3cml0ZSBhbnl3YXk/IgorbXNnc3RyICIiCisiXCIlLipzXCIg0tHJ6LaoICdyZWFkb25seScg0aHP7i5cbiIKKyLIt7ao0qq4srjHwvCjvyIKKworIzogZXhfY21kcy5jOjI1MTcKK21zZ2lkICJFZGl0IEZpbGUiCittc2dzdHIgIrHgvK3OxLz+IgorCisjOiBleF9jbWRzLmM6MzAyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQzOiBBdXRvY29tbWFuZHMgdW5leHBlY3RlZGx5IGRlbGV0ZWQgbmV3IGJ1ZmZlciAlcyIKK21zZ3N0ciAiRTE0MzogQXV0b2NvbW1hbmRzINLizeK12Mm+s/3Qwru6s+XH+CAlcyIKKworIzogZXhfY21kcy5jOjMxNTYKK21zZ2lkICJFMTQ0OiBub24tbnVtZXJpYyBhcmd1bWVudCB0byA6eiIKK21zZ3N0ciAiRTE0NDogOnogsru908rct8fK/dfWtcSyzsr9IgorCisjOiBleF9jbWRzLmM6MzI0MQorbXNnaWQgIkUxNDU6IFNoZWxsIGNvbW1hbmRzIG5vdCBhbGxvd2VkIGluIHJ2aW0iCittc2dzdHIgIkUxNDU6IHJ2aW0g1tC9+9a5yrnTwyBzaGVsbCDD/MHuIgorCisjOiBleF9jbWRzLmM6MzM0OAorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6INX91PKx7bTvyr2yu8Tc08PX1sS4t9a49CAoPykiCisKKyM6IGV4X2NtZHMuYzozNjg2CisjLCBjLWZvcm1hdAorbXNnaWQgInJlcGxhY2Ugd2l0aCAlcyAoeS9uL2EvcS9sL15FL15ZKT8iCittc2dzdHIgIszmu7vOqiAlcyAoeS9uL2EvcS9eRS9eWSk/IgorCisjOiBleF9jbWRzLmM6NDA1MAorbXNnaWQgIihJbnRlcnJ1cHRlZCkgIgorbXNnc3RyICIo0tHW0LbPKSAiCisKKyM6IGV4X2NtZHMuYzo0MDU0Cittc2dpZCAiMSBzdWJzdGl0dXRpb24iCittc2dzdHIgIszmu7vSu9fpIgorCisjOiBleF9jbWRzLmM6NDA1NgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgc3Vic3RpdHV0aW9ucyIKK21zZ3N0ciAizOa7uyAlbGQg1+kiCisKKyM6IGV4X2NtZHMuYzo0MDU5Cittc2dpZCAiIG9uIDEgbGluZSIKK21zZ3N0ciAiINK70NDW0CIKKworIzogZXhfY21kcy5jOjQwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIG9uICVsZCBsaW5lcyIKK21zZ3N0ciAiICVsZCDQ0NbQIgorCisjOiBleF9jbWRzLmM6NDExMgorbXNnaWQgIkUxNDc6IENhbm5vdCBkbyA6Z2xvYmFsIHJlY3Vyc2l2ZSIKK21zZ3N0ciAiRTE0NzogOmdsb2JhbCCyu8Tctd256da00NAiCisKKyM6IGV4X2NtZHMuYzo0MTQ3Cittc2dpZCAiRTE0ODogUmVndWxhciBleHByZXNzaW9uIG1pc3NpbmcgZnJvbSBnbG9iYWwiCittc2dzdHIgIkUxNDg6IMO709DKudPDuf3V/dTyse2078q9ICg/KSIKKworIzogZXhfY21kcy5jOjQxOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAiw7/Su9DQtrzV0rK7tb3Eo8q9OiAlcyIKKworIzogZXhfY21kcy5jOjQyNzcKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIMew0rvX6czmtPrX1rf7tK46XG4iCisiJCIKKworIzogZXhfY21kcy5jOjQzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0OTogU29ycnksIG5vIGhlbHAgZm9yICVzIgorbXNnc3RyICJFMTQ5OiCxp8e4LCDDu9PQICVzILXEy7XD9yIKKworIzogZXhfY21kcy5jOjQ0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICKxp8e4LCDV0rK7tb2w79b6zsS8/iBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo0ODU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzILK7ysfEv8K8IgorCisjOiBleF9jbWRzLmM6NDg4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUyOiBDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE1MjogsrvE3NLU0LTI68Sjyr208r+qIFwiJXNcIiIKKworIzogZXhfY21kcy5jOjQ4OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MzogVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxNTM6ILK7xNy2wcihzsS8/jogJXMiCisKKyM6IGV4X2NtZHMuYzo0OTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTQ6IER1cGxpY2F0ZSB0YWcgXCIlc1wiIGluIGZpbGUgJXMiCittc2dzdHIgIkUxNTQ6ILHqx6kodGFnKSBcIiVzXCIg1NrOxLz+ICVzIMDv1ti4tLP2z9a24LTOIgorCisjOiBleF9jbWRzLmM6NTA3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTYwOiBVbmtub3duIHNpZ24gY29tbWFuZDogJXMiCittc2dzdHIgIkUxNjA6IM60tqjS5bXEIHNpZ24gY29tbWFuZDogJXMiCisKKyM6IGV4X2NtZHMuYzo1MDk4Cittc2dpZCAiRTE1NjogTWlzc2luZyBzaWduIG5hbWUiCittc2dzdHIgIkUxNTY6IMixydkgc2lnbiDD+7PGIgorCisjOiBleF9jbWRzLmM6NTE0NAorbXNnaWQgIkUyNTU6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkUzMjY6INXStb3Mq7bgIHNpZ25zIgorCisjOiBleF9jbWRzLmM6NTE4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM5OiBJbnZhbGlkIHNpZ24gdGV4dDogJXMiCittc2dzdHIgIkUyMzk6ILK71f3It7XEIHNpZ24gzsTX1jogJXMiCisKKyM6IGV4X2NtZHMuYzo1MjEwIGV4X2NtZHMuYzo1Mzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTU6IFVua25vd24gc2lnbjogJXMiCittc2dzdHIgIkUxNTU6ILK71f3It7XEIHNpZ246ICVzIgorCisjOiBleF9jbWRzLmM6NTI1NgorbXNnaWQgIkUxNTk6IE1pc3Npbmcgc2lnbiBudW1iZXIiCittc2dzdHIgIkUxNTk6IMixydkgc2lnbiBudW1iZXIiCisKKyM6IGV4X2NtZHMuYzo1MzM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTg6IEludmFsaWQgYnVmZmVyIG5hbWU6ICVzIgorbXNnc3RyICJFMTU4OiC7urPlx/jD+7PGtO3O8zogJXMiCisKKyM6IGV4X2NtZHMuYzo1Mzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTc6IEludmFsaWQgc2lnbiBJRDogJWxkIgorbXNnc3RyICJFMTU3OiBTaWduIElEILTtzvM6ICVsZCIKKworIzogZXhfY21kcy5jOjU1NDYKK21zZ2lkICJbRGVsZXRlZF0iCittc2dzdHIgIlvS0cm+s/1dIgorCisjOiBleF9kb2NtZC5jOjQ5MQorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICK9+MjrIEV4IMSjyr0uIMrkyOsgXCJ2aXN1YVwiINLUu9i1vdX9s6PEo8q9LiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTI3Cittc2dpZCAiQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgItLRtb3OxLz+veHOsiIKKworIzogZXhfZG9jbWQuYzo2MDIKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IMP8we613bnpsuPK/bn9tuAiCisKKyM6IGV4X2RvY21kLmM6OTExCittc2dpZCAiRTE3MDogTWlzc2luZyA6ZW5kd2hpbGUiCittc2dzdHIgIkUxNzA6IMixydkgOmVuZHdoaWxlIgorCisjOiBleF9kb2NtZC5jOjkxMworbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiDIscnZIDplbmRpZiIKKworIzogZXhfZG9jbWQuYzo5MjMKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICLD/MHuzsS8/r3hyvgiCisKKyM6IGV4X2RvY21kLmM6OTI0Cittc2dpZCAiRW5kIG9mIGZ1bmN0aW9uIgorbXNnc3RyICK6r8r9veHOsiIKKworIzogZXhfZG9jbWQuYzoxMzQ0Cittc2dpZCAiQW1iaWd1b3VzIHVzZSBvZiB1c2VyLWRlZmluZWQgY29tbWFuZCIKK21zZ3N0ciAi08O7p7ao0uW1xMP8we674bvsz/0iCisKKyM6IGV4X2RvY21kLmM6MTM1OAorbXNnaWQgIk5vdCBhbiBlZGl0b3IgY29tbWFuZCIKK21zZ3N0ciAisrvKx7HgvK3G97XEw/zB7iIKKworIzogZXhfZG9jbWQuYzoxNDQxCittc2dpZCAiRG9uJ3QgcGFuaWMhIgorbXNnc3RyICKyu9Kqvqq7xSEiCisKKyM6IGV4X2RvY21kLmM6MTQ2MAorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAi1ri2qMHLz/LHsLLOv7y1xLe2zqciCisKKyM6IGV4X2RvY21kLmM6MTQ2OQorbXNnaWQgIkJhY2t3YXJkcyByYW5nZSBnaXZlbiwgT0sgdG8gc3dhcCIKK21zZ3N0ciAi1ri2qMHLz/LHsLLOv7y1xLe2zqejrE9LIHRvIHN3YXAiCisKKyM6IGV4X2RvY21kLmM6MTU4MAorbXNnaWQgIlVzZSB3IG9yIHc+PiIKK21zZ3N0ciAix+vKudPDIHcgu/Igdz4+IgorCisjOiBleF9kb2NtZC5jOjMwODYKK21zZ2lkICJFMzE5OiBTb3JyeSwgdGhlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHZlcnNpb24iCittc2dzdHIgIkUzMTk6ILGnx7gsILG+w/zB7tTatMuw5rG+1tDOtMq1z9YiCisKKyM6IGV4X2RvY21kLmM6MzI1NgorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiDWu8Tc09DSu7j2zsS8/sP7IgorCisjOiBleF9kb2NtZC5jOjM4MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgbW9yZSBmaWxlcyB0byBlZGl0LiAgUXVpdCBhbnl3YXk/IgorbXNnc3RyICK7udPQICVkILj2zsS8/s60seC8rS4gyLe2qNKqzcuz9qO/IgorCisjOiBleF9kb2NtZC5jOjM4MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3Mzogu7nT0CAlbGQguPbOxLz+zrSx4LytIgorCisjOiBleF9kb2NtZC5jOjM5MTEKK21zZ2lkICJFMTc0OiBDb21tYW5kIGFscmVhZHkgZXhpc3RzOiB1c2UgISB0byByZWRlZmluZSIKK21zZ3N0ciAiRTE3NDogw/zB7tLRvq205tTaLCDH68q508MgISDHv9bG1tjQwrao0uUiCisKKyM6IGV4X2RvY21kLmM6NDAxNgorbXNnaWQgIiIKKyJcbiIKKyIgICAgTmFtZSAgICAgICAgQXJncyBSYW5nZSBDb21wbGV0ZSAgRGVmaW5pdGlvbiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICDD+7PGICAgICAgICCyzsr9ILe2zqcgIM3q1fsgICAgICC2qNLlICAgICAgIgorCisjOiBleF9kb2NtZC5jOjQxMDUKK21zZ2lkICJObyB1c2VyLWRlZmluZWQgY29tbWFuZHMgZm91bmQiCittc2dzdHIgItXSsru1vdPDu6fX1Lao0uW1xMP8we4iCisKKyM6IGV4X2RvY21kLmM6NDEzNgorbXNnaWQgIkUxNzU6IE5vIGF0dHJpYnV0ZSBzcGVjaWZpZWQiCittc2dzdHIgIkUxNzU6IMO709DWuLaotcTK9NDUIgorCisjOiBleF9kb2NtZC5jOjQxODgKK21zZ2lkICJFMTc2OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiCittc2dzdHIgIkUxNzY6ILK71f3It7XEss7K/bj2yv0iCisKKyM6IGV4X2RvY21kLmM6NDIwMworbXNnaWQgIkUxNzc6IENvdW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkUxNzc6ILK7xNzWuLaowb20ziIKKworIzogZXhfZG9jbWQuYzo0MjEzCittc2dpZCAiRTE3ODogSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBjb3VudCIKK21zZ3N0ciAiRTE3ODogvMbK/bXEyLHKoda1srvV/ci3IgorCisjOiBleF9kb2NtZC5jOjQyNDEKK21zZ2lkICJFMTc5OiBhcmd1bWVudCByZXF1aXJlZCBmb3IgY29tcGxldGUiCittc2dzdHIgIkUxNzk6INa4we7Q6NKqss7K/bLFxNzN6rPJIgorCisjOiBleF9kb2NtZC5jOjQyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCittc2dzdHIgIkUxODA6ILK7zerV+7XE1rU6ICclcyciCisKKyM6IGV4X2RvY21kLmM6NDI2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCittc2dzdHIgIkUxODE6ILK71f3It7XEyvTQ1DogJXMiCisKKyM6IGV4X2RvY21kLmM6NDMwOQorbXNnaWQgIkUxODI6IEludmFsaWQgY29tbWFuZCBuYW1lIgorbXNnc3RyICJFMTgyOiDD/MHuw/uzxrK71f3ItyIKKworIzogZXhfZG9jbWQuYzo0MzI0Cittc2dpZCAiRTE4MzogVXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyIgorbXNnc3RyICJFMTgzOiDTw7un19S2qNLlw/zB7rHY0OvS1LTz0LTX1sS4v6rKvCIKKworIzogZXhfZG9jbWQuYzo0MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiDDu9PQ08O7p9fUtqjS5bXEw/zB7qO6ICVzIgorCisjOiBleF9kb2NtZC5jOjQ4NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4NTogQ2Fubm90IGZpbmQgY29sb3Igc2NoZW1lICVzIgorbXNnc3RyICJFMTg1OiDV0rK7tb3R1cmr0fnKvSAlcyIKKworIzogZXhfZG9jbWQuYzo0ODUyCittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIsTjusMsIFZpbSDTw7uno6EiCisKKyM6IGV4X2RvY21kLmM6NTU0OQorbXNnaWQgIkVkaXQgRmlsZSBpbiBuZXcgd2luZG93IgorbXNnc3RyICLU2tDCtLC/2rHgvK3OxLz+IgorCisjOiBleF9kb2NtZC5jOjU4MTUKK21zZ2lkICJObyBzd2FwIGZpbGUiCittc2dzdHIgIs7evbu7u87EvP4iCisKKyM6IGV4X2RvY21kLmM6NTkxOQorbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICK4vbzTzsS8/iIKKworIzogZXhfZG9jbWQuYzo1OTc4Cittc2dpZCAiRTE4NjogTm8gcHJldmlvdXMgZGlyZWN0b3J5IgorbXNnc3RyICJFMTg2OiDHsNK7uPbEv8K8sru05tTaIgorCisjOiBleF9kb2NtZC5jOjYwNTUKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiCyu8Tcyrax8LXEseq8xyIKKworIzogZXhfZG9jbWQuYzo2MTczCisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAitLC/2s671sM6IFggJWQsIFkgJWQiCisKKyM6IGV4X2RvY21kLmM6NjE3OAorbXNnaWQgIkUxODg6IE9idGFpbmluZyB3aW5kb3cgcG9zaXRpb24gbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtIgorbXNnc3RyICJFMTg4OiDU2sT6tcTGvcyoyc+yu8Tcu/G1w7Swv9rOu9bDIgorCisjOiBleF9kb2NtZC5jOjY0NDQKK21zZ2lkICJTYXZlIFJlZGlyZWN0aW9uIgorbXNnc3RyICKxo7Tm1ti2qM/yIgorCisjOiBleF9kb2NtZC5jOjY1OTMKK21zZ2lkICJTYXZlIFZpZXciCittc2dzdHIgIrGjtObK0828IgorCisjOiBleF9kb2NtZC5jOjY1OTQKK21zZ2lkICJTYXZlIFNlc3Npb24iCittc2dzdHIgIrGjtOa74buwIgorCisjOiBleF9kb2NtZC5jOjY1OTYKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICKxo7Tmyei2qCIKKworIzogZXhfZG9jbWQuYzo2NzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiINLRtObU2iAox+vTwyAhIMe/1sbWtNDQKSIKKworIzogZXhfZG9jbWQuYzo2NzUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogsrvE3NLU0LTI68Sjyr208r+qIFwiJXNcIiIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6Njc3NAorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogss7K/bHY0OvKx9OizsTX1sS4u/LP8sewL7rztcTS/brFIgorCisjOiBleF9kb2NtZC5jOjY4MDMKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IDpub3JtYWwgtd256bLjyv25/cnuIgorCisjOiBleF9kb2NtZC5jOjcxNzEKK21zZ2lkICI6aWYgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiOmlmILLjyv25/cnuIgorCisjOiBleF9kb2NtZC5jOjcyMDYKK21zZ2lkICI6ZW5kaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIjplbmRpZiDIscnZttTTprXEIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjI2Cittc2dpZCAiOmVsc2Ugd2l0aG91dCA6aWYiCittc2dzdHIgIjplbHNlIMixydm21NOmtcQgOmlmIgorCisjOiBleF9kb2NtZC5jOjcyMjgKK21zZ2lkICI6ZWxzZWlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZWxzZWlmIMixydm21NOmtcQgOmlmIgorCisjOiBleF9kb2NtZC5jOjcyODAKK21zZ2lkICI6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiOndoaWxlILLjyv25/cnuIgorCisjOiBleF9kb2NtZC5jOjczMjYKK21zZ2lkICI6Y29udGludWUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjpjb250aW51ZSDIscnZttTTprXEIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3MzUzCittc2dpZCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6YnJlYWsgyLHJ2bbU06a1xCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM3NiBleF9kb2NtZC5jOjczODEKK21zZ2lkICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIjplbmR3aGlsZSDIscnZttTTprXEIDp3aGlsZSIKKworIzogZXhfZG9jbWQuYzo3NDAyCittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uILHY0OvU2rqvyv3E2rK/yrnTwyIKKworIzogZXhfZG9jbWQuYzo3NTgyCittc2dpZCAiRTE5NDogTm8gYWx0ZXJuYXRlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciAnIyciCittc2dzdHIgIkUxOTQ6IMO709AgJyMnIL/JzOa0+rXEzsS8/sP7IgorCisjOiBleF9kb2NtZC5jOjc2MTMKK21zZ2lkICJubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIsO709AgQXV0b2NvbW1hbmQgzsS8/sP70tTM5ru7IFwiPGFmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjc2MjEKK21zZ2lkICJubyBhdXRvY29tbWFuZCBidWZmZXIgbnVtYmVyIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFidWY+XCIiCittc2dzdHIgIsO709AgQXV0b2NvbW1hbmQgu7qz5cf4w/uzxtLUzOa7uyBcIjxhYnVmPlwiIgorCisjOiBleF9kb2NtZC5jOjc2MzIKK21zZ2lkICJubyBhdXRvY29tbWFuZCBtYXRjaCBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFtYXRjaD5cIiIKK21zZ3N0ciAiw7vT0CBBdXRvY29tbWFuZCBNYXRjaCBuYW1lINLUzOa7uyBcIjxhbWF0Y2g+XCIiCisKKyM6IGV4X2RvY21kLmM6NzY0MgorbXNnaWQgIm5vIDpzb3VyY2UgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPHNmaWxlPlwiIgorbXNnc3RyICLDu9PQIDpzb3VyY2UgzsS8/sP70tTM5ru7IFwiPHNmaWxlPlwiIgorCisjOiBleF9kb2NtZC5jOjc2ODMKKyMsIG5vLWMtZm9ybWF0Cittc2dpZCAiRW1wdHkgZmlsZSBuYW1lIGZvciAnJScgb3IgJyMnLCBvbmx5IHdvcmtzIHdpdGggXCI6cDpoXCIiCittc2dzdHIgIiclJyC78iAnIycg1rjP8r/VzsS8/sP7o6zWu8Tc08PstiBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3Njg1Cittc2dpZCAiRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiyuTI686qv9XX1rf7tK4iCisKKyM6IGV4X2RvY21kLmM6ODU5NAorbXNnaWQgIkUxOTU6IENhbm5vdCBvcGVuIHZpbWluZm8gZmlsZSBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE5NTogsrvE3LbByKEgdmltaW5mbyIKKworIzogZXhfZG9jbWQuYzo4NzY3Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiCxvrDmsb7O3ri0us/X1rf7KGRpZ3JhcGgpIgorCisjOiBleF9nZXRsbi5jOjI3ODUKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICKx6sepw/uzxiIKKworIzogZXhfZ2V0bG4uYzoyNzg4Cittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICLA4M7EvP5cbiIKKworIzogZXhfZ2V0bG4uYzozOTk3Cittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICLRoc/uICdoaXN0b3J5JyDKx8HjIgorCisjOiBleF9nZXRsbi5jOjQyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIMD6yre8x8K8ICi009DCtb2+ySk6XG4iCisKKyM6IGV4X2dldGxuLmM6NDIzOAorbXNnaWQgIkNvbW1hbmQgTGluZSIKK21zZ3N0ciAiw/zB7tDQIgorCisjOiBleF9nZXRsbi5jOjQyMzkKK21zZ2lkICJTZWFyY2ggU3RyaW5nIgorbXNnc3RyICKy6dXS19a3+7SuIgorCisjOiBleF9nZXRsbi5jOjQyNDAKK21zZ2lkICJFeHByZXNzaW9uIgorbXNnc3RyICKx7bTvyr0iCisKKyM6IGV4X2dldGxuLmM6NDI0MQorbXNnaWQgIklucHV0IExpbmUiCittc2dzdHIgIsrkyOvQ0CIKKworIzogZXhfZ2V0bG4uYzo0MjcxCittc2dpZCAiRTE5ODogY21kX3BjaGFyIGJleW9uZCB0aGUgY29tbWFuZCBsZW5ndGgiCittc2dzdHIgIkUxOTg6IGNtZF9wY2hhciCzrLn9w/zB7rOktsgiCisKKyM6IGV4X2dldGxuLmM6NDQzNQorbXNnaWQgIkUxOTk6IEFjdGl2ZSB3aW5kb3cgb3IgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIkUxOTk6INLRyb6z/bvutq+0sL/au/K7urTmIgorCisjOiBmaWxlaW8uYzozNDcKK21zZ2lkICJJbGxlZ2FsIGZpbGUgbmFtZSIKK21zZ3N0ciAisrvV/ci3tcTOxLz+w/siCisKKyM6IGZpbGVpby5jOjM3MSBmaWxlaW8uYzo0OTUgZmlsZWlvLmM6MjQ5MSBmaWxlaW8uYzoyNTI5Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIsrHxL/CvCIKKworIzogZmlsZWlvLmM6MzczCittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAisrvKx87EvP4iCisKKyM6IGZpbGVpby5jOjUxNSBmaWxlaW8uYzozNTgxCittc2dpZCAiW05ldyBGaWxlXSIKK21zZ3N0ciAiW860w/zD+10iCisKKyM6IGZpbGVpby5jOjUzMgorbXNnaWQgIltQZXJtaXNzaW9uIERlbmllZF0iCittc2dzdHIgIlvIqM/esrvX410iCisKKyM6IGZpbGVpby5jOjYyNAorbXNnaWQgIkUyMDA6ICpSZWFkUHJlIGF1dG9jb21tYW5kcyBtYWRlIHRoZSBmaWxlIHVucmVhZGFibGUiCittc2dzdHIgIkUyMDA6ICpSZWFkUHJlIEF1dG9jb21tYW5kIMq5s8zQ8rK7xNy2wcihtMvOxLz+IgorCisjOiBmaWxlaW8uYzo2MjYKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqRmlsdGVyKiBBdXRvY29tbWFuZCCyu7/J0tS4/LjEu7qz5cf4tcTE2sjdIgorCisjOiBmaWxlaW8uYzo2NDYKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06ILTTserXvMrkyOu2wcihLi4uXG4iCisKKyM6IGZpbGVpby5jOjY1MgorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAitNOx6te8yuTI67bBLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjg3NgorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiDXqru7tO3O8yIKKworIzogZmlsZWlvLmM6MTczMgorbXNnaWQgIltmaWZvL3NvY2tldF0iCittc2dzdHIgIltmaWZvL3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE3MzkKK21zZ2lkICJbZmlmb10iCittc2dzdHIgIltmaWZvXSIKKworIzogZmlsZWlvLmM6MTc0NgorbXNnaWQgIltzb2NrZXRdIgorbXNnc3RyICJbc29ja2V0XSIKKworIzogZmlsZWlvLmM6MTc1NAorbXNnaWQgIltST10iCittc2dzdHIgIlvWu7bBXSIKKworIzogZmlsZWlvLmM6MTc2NAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW8ixydlDUl0nIgorCisjOiBmaWxlaW8uYzoxNzY5Cittc2dpZCAiW05MIGZvdW5kXSIKK21zZ3N0ciAiW9XStb1OTF0iCisKKyM6IGZpbGVpby5jOjE3NzQKK21zZ2lkICJbbG9uZyBsaW5lcyBzcGxpdF0iCittc2dzdHIgIlu31rjuuf2zpNDQXSIKKworIzogZmlsZWlvLmM6MTc4MCBmaWxlaW8uYzozNTY1Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJbzrTXqru7XSIKKworIzogZmlsZWlvLmM6MTc4NSBmaWxlaW8uYzozNTcwCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvS0dequ7tdIgorCisjOiBmaWxlaW8uYzoxNzkyIGZpbGVpby5jOjM1OTUKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlvS0bzTw9xdIgorCisjOiBmaWxlaW8uYzoxNzk5Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICLXqru7tO3O8yIKKworIzogZmlsZWlvLmM6MTgwNgorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIlu2wbTtzvNdIgorCisjOiBmaWxlaW8uYzoyMDEzCittc2dpZCAiQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIGNvbnZlcnNpb24iCittc2dzdHIgItXSsru1vdequ7vTw7XEwdnKsc7EvP4iCisKKyM6IGZpbGVpby5jOjIwMjAKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgItfWt/u8r9equ7u07c7zIgorCisjOiBmaWxlaW8uYzoyMDIzCittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAisrvE3LbByKEgJ2NoYXJjb252ZXJ0JyC1xMrks/YiCisKKyM6IGZpbGVpby5jOjI0MDcKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogQXV0b2NvbW1hbmQgyb6z/bvyys23xcHL0qrQtMjrtcS7urPlx/giCisKKyM6IGZpbGVpby5jOjI0MzAKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2NvbW1hbmQg0uLN4rXYuMSx5MHL0NC6xSIKKworIzogZmlsZWlvLmM6MjQ5NiBmaWxlaW8uYzoyNTEzCittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIrK7ysfOxLz+u/K/ydC0tcTJ6LG4IgorCisjOiBmaWxlaW8uYzoyNTU1Cittc2dpZCAiaXMgcmVhZC1vbmx5ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIsrH1ru2wc7EvP4gKMfryrnTwyAhIMe/1sbWtNDQKSIKKworIzogZmlsZWlvLmM6Mjg1MQorbXNnaWQgIkNhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIrK7xNzQtLG4t93OxLz+ICjH68q508MgISDHv9bG1rTQ0CkiCisKKyM6IGZpbGVpby5jOjI4NjMKK21zZ2lkICJDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiudix1bG4t93OxLz+s/a07SAox+vKudPDICEgx7/Wxta00NApIgorCisjOiBmaWxlaW8uYzoyODY1Cittc2dpZCAiQ2FuJ3QgcmVhZCBmaWxlIGZvciBiYWNrdXAgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAisrvE3LbByKHOxLz+0tS5qbG4t90gKMfryrnTwyAhIMe/1sbWtNDQKSIKKworIzogZmlsZWlvLmM6Mjg4MQorbXNnaWQgIkNhbm5vdCBjcmVhdGUgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAisrvE3LS0vaixuLfdzsS8/iAox+vKudPDICEgx7/Wxta00NApIgorCisjOiBmaWxlaW8uYzoyOTcwCittc2dpZCAiQ2FuJ3QgbWFrZSBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICKyu8Tc1/exuLfdzsS8/iAox+vKudPDICEgx7/Wxta00NApIgorCisjOiBmaWxlaW8uYzozMDMyCittc2dpZCAiVGhlIHJlc291cmNlIGZvcmsgd2lsbCBiZSBsb3N0ICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIlJlc291cmNlIGZvcmsgu+HP+8qnICjH68q508MgISDHv9bG1rTQ0CkiCisKKyM6IGZpbGVpby5jOjMxMjEKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDog1dKyu7W90LTI69PDtcS9u7u7zsS8/iIKKworIzogZmlsZWlvLmM6MzEzOQorbXNnaWQgIkUyMTM6IENhbm5vdCBjb252ZXJ0ICh1c2UgISB0byB3cml0ZSB3aXRob3V0IGNvbnZlcnNpb24pIgorbXNnc3RyICJFMjEzOiCyu8Tc16q7uyAox+vKudPDICEgx7/WxrK716q7u9C0yOspIgorCisjOiBmaWxlaW8uYzozMTc2Cittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2NjogsrvE3NLU0LTI68Sjyr208r+qwbS9087EvP4iCisKKyM6IGZpbGVpby5jOjMxODAKK21zZ2lkICJFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTI6ILK7xNzS1NC0yOvEo8q9tPK/qiIKKworIzogZmlsZWlvLmM6MzQyMworbXNnaWQgIkNsb3NlIGZhaWxlZCIKK21zZ3N0ciAiudix1cqnsNwiCisKKyM6IGZpbGVpby5jOjM0ODEKK21zZ2lkICJ3cml0ZSBlcnJvciwgY29udmVyc2lvbiBmYWlsZWQiCittc2dzdHIgIrK7xNzQtMjrIC0tINequ7vKp7DcIgorCisjOiBmaWxlaW8uYzozNDg3Cittc2dpZCAid3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIKK21zZ3N0ciAi0LTI67TtzvMgKM7EvP7Ptc2z0tHC+qO/KSIKKworIzogZmlsZWlvLmM6MzU2MAorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICLXqru7tO3O8yIKKworIzogZmlsZWlvLmM6MzU3NgorbXNnaWQgIltEZXZpY2VdIgorbXNnc3RyICJbyeixuF0iCisKKyM6IGZpbGVpby5jOjM1ODEKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW9DCXSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBbYV0iCittc2dzdHIgIlthXSIKKworIzogZmlsZWlvLmM6MzYwMworbXNnaWQgIiBhcHBlbmRlZCIKK21zZ3N0ciAiINLRuL280yIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiBbd10iCittc2dzdHIgIlt3XSIKKworIzogZmlsZWlvLmM6MzYwNQorbXNnaWQgIiB3cml0dGVuIgorbXNnc3RyICIg0tHQtMjrIgorCisjOiBmaWxlaW8uYzozNjU1Cittc2dpZCAiRTIwNTogUGF0Y2htb2RlOiBjYW4ndCBzYXZlIG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDU6IFBhdGNoIMSjyr06ILK7xNy0orTm1K3KvM7EvP4iCisKKyM6IGZpbGVpby5jOjM2NzcKK21zZ2lkICJFMjA2OiBwYXRjaG1vZGU6IGNhbid0IHRvdWNoIGVtcHR5IG9yaWdpbmFsIGZpbGUiCittc2dzdHIgIkUyMDY6IFBhdGNoIMSjyr06ILK7xNy4xLHkv9W1xNStyrzOxLz+IgorCisjOiBmaWxlaW8uYzozNjkyCittc2dpZCAiRTIwNzogQ2FuJ3QgZGVsZXRlIGJhY2t1cCBmaWxlIgorbXNnc3RyICJFMjA3OiCyu8Tcyb6z/bG4t93OxLz+IgorCisjOiBmaWxlaW8uYzozNzQ0Cittc2dpZCAiIgorIlxuIgorIldBUk5JTkc6IE9yaWdpbmFsIGZpbGUgbWF5IGJlIGxvc3Qgb3IgZGFtYWdlZFxuIgorbXNnc3RyICIiCisiXG4iCisivq+45jog1K3KvM7EvP62qsqnu/LL8Lu1XG4iCisKKyM6IGZpbGVpby5jOjM3NDYKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICLU2s7EvP7V/ci30LTI68ewx+vO8M3Ls/ax4LytxvchIgorCisjOiBmaWxlaW8uYzozODI2Cittc2dpZCAiW2Rvc10iCittc2dzdHIgIltkb3NdIgorCisjOiBmaWxlaW8uYzozODI2Cittc2dpZCAiW2RvcyBmb3JtYXRdIgorbXNnc3RyICJbZG9zILjxyr1dIgorCisjOiBmaWxlaW8uYzozODMzCittc2dpZCAiW21hY10iCittc2dzdHIgIlttYWNdIgorCisjOiBmaWxlaW8uYzozODMzCittc2dpZCAiW21hYyBmb3JtYXRdIgorbXNnc3RyICJbbWFjILjxyr1dIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW3VuaXhdIgorbXNnc3RyICJbdW5peF0iCisKKyM6IGZpbGVpby5jOjM4NDAKK21zZ2lkICJbdW5peCBmb3JtYXRdIgorbXNnc3RyICJbdW5peCC48cq9XSIKKworIzogZmlsZWlvLmM6Mzg2NworbXNnaWQgIjEgbGluZSwgIgorbXNnc3RyICIxINDQLCAiCisKKyM6IGZpbGVpby5jOjM4NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzLCAiCittc2dzdHIgIiVsZCDQ0CwgIgorCisjOiBmaWxlaW8uYzozODcyCittc2dpZCAiMSBjaGFyYWN0ZXIiCittc2dzdHIgItK7uPbX1rf7IgorCisjOiBmaWxlaW8uYzozODc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGS49tfWt/siCisKKyM6IGZpbGVpby5jOjM4ODQKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzozODg0Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW9fuuvPSu9DQsrvN6tX7XSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzozOTAzCittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICK+r7jmOiCxvs7EvP7X1MnPtM62wcjruvPS0bHktq8hISEiCisKKyM6IGZpbGVpby5jOjM5MDUKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIsi3tqjSqtC0yOvC8CIKKworIzogZmlsZWlvLmM6NDg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODog0LTI687EvP4gXCIlc1wiILTtzvMiCisKKyM6IGZpbGVpby5jOjQ4NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6ILnYsdXOxLz+IFwiJXNcIiC07c7zIgorCisjOiBmaWxlaW8uYzo0ODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiC2wcihzsS8/iBcIiVzXCIgtO3O8yIKKworIzogZmlsZWlvLmM6NTAzNQorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgyb6z/bu6s+XH+CIKKworIzogZmlsZWlvLmM6NTA0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiC+r7jmOiDOxLz+IFwiJXNcIiDS0b6tsru05tTaIgorCisjOiBmaWxlaW8uYzo1MDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiVzEyOiC+r7jmOiDOxLz+IFwiJXNcIiDX1MnPtM62wcjruvPS0bHktq8sILb4x9Kx4Lyt1tC1xLu6s+XH+NKyuPy2r8HLIgorCisjOiBmaWxlaW8uYzo1MDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IL6vuOY6IM7EvP4gXCIlc1wiINfUyc+0zrbByOu689LRuMSx5CIKKworIzogZmlsZWlvLmM6NTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTY6IL6vuOY6IM7EvP4gXCIlc1wiINfUyc+0zrbByOu689LRuMSx5CIKKworIzogZmlsZWlvLmM6NTA3MQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IL6vuOY6IM7EvP4gXCIlc1wiINTav6rKvLHgvK2689PWsbu0tL2owcsiCisKKyM6IGZpbGVpby5jOjUwODgKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICK+r7jmIgorCisjOiBmaWxlaW8uYzo1MDg5Cittc2dpZCAiIgorIiZPS1xuIgorIiZMb2FkIEZpbGUiCittc2dzdHIgIiIKKyLIt7aoKCZPKVxuIgorIrzT1NjOxLz+KCZMKSIKKworIzogZmlsZWlvLmM6NTE2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogsrvE3NbY0MK809TYIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTY3MAorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLdLRyb6z/S0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NTgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6INfpsru05tTaOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU5NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6ICoguvPD5tPQsrvV/ci3tcTX1rf7OiAlcyIKKworIzogZmlsZWlvLmM6NTk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogzt60y8rCvP46ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjYxMTUKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorCisjOiBmaWxlaW8uYzo2Mzg2Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6ILK7xNy21Mv509DKwrz+1rTQ0CBhdXRvY29tbWFuZCIKKworIzogZmlsZWlvLmM6NjQwOQorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAi1dKyu7W9ttTTprXEIGF1dG9jb21tYW5kIgorCisjOiBmaWxlaW8uYzo2NjgxCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogYXV0b2NvbW1hbmQgsuPK/bn9ye4iCisKKyM6IGZpbGVpby5jOjY5NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBBdXRvIGNvbW1hbmRzOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY5NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICLWtNDQICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjcwNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9jb21tYW5kICVzIgorCisjOiBmaWxlaW8uYzo3NTY2Cittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogyLHJ2SB7LiIKKworIzogZmlsZWlvLmM6NzU2OAorbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IMixydkgfS4iCisKKyM6IGZvbGQuYzo2NgorbXNnaWQgIk5vIGZvbGQgZm91bmQiCittc2dzdHIgItXSsru1vcjOus4gZm9sZCIKKworIzogZm9sZC5jOjU1NAorbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiCyu8Tc1NrEv8ewtcQgJ2ZvbGRtZXRob2QnIM/CtLS9qCBmb2xkIgorCisjOiBmb2xkLmM6NTU2Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6ILK7xNzU2sS/x7C1xCAnZm9sZG1ldGhvZCcgz8LJvrP9IGZvbGQiCisKKyM6IGZvbGQuYzoxNzAwCittc2dpZCAiRTIyMTogJ2NvbW1lbnRzdHJpbmcnIGlzIGVtcHR5IgorbXNnc3RyICJFMjIxOiDRoc/uICdjb21tZW50c3RyaW5nJyDOtMnotqgiCisKKyM6IGdldGNoYXIuYzoyNjgKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6ILzTyOu2wbu6s+XW0CIKKworIzogZ2V0Y2hhci5jOjIxMTQKK21zZ2lkICJFMjIzOiByZWN1cnNpdmUgbWFwcGluZyIKK21zZ3N0ciAiRTIyMzogtd256SBtYXBwaW5nIgorCisjOiBnZXRjaGFyLmM6Mjk2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogJXMg0tG+rdPQyKu+1iBhYmJyZXZpYXRpb24gwcsiCisKKyM6IGdldGNoYXIuYzoyOTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogJXMg0tG+rdPQyKu+1iBtYXBwaW5nIMHLIgorCisjOiBnZXRjaGFyLmM6MzA5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiAlcyDS0b6t09AgYWJicmV2aWF0aW9uIMHLIgorCisjOiBnZXRjaGFyLmM6MzA5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI3OiBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNzogJXMgtcQgbWFwcGluZyDS0b6ttObU2iIKKworIzogZ2V0Y2hhci5jOjMxNjMKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgItXSsru1vcv10LQiCisKKyM6IGdldGNoYXIuYzozMTY1Cittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAiw7vT0NXiuPa21NOmIgorCisjOiBnZXRjaGFyLmM6Mzk5MAorbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDogsrvV/ci3tcTEo8q9IgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPLK7xNy08r+qPiIKKworIzogZ3VpX2F0X2ZzLmM6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGZvbnQgJXMiCittc2dzdHIgInZpbV9TZWxGaWxlOiCyu8TcyrnTwyAlcyDX1szlIgorCisjOiBndWlfYXRfZnMuYzoyNTM1Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAidmltX1NlbEZpbGU6ILK7xNy72LW9xL/HsMS/wrwiCisKKyM6IGd1aV9hdF9mcy5jOjI1NTQKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIsK3vrY6IgorCisjOiBndWlfYXRfZnMuYzoyNTYwCittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAidmltX1NlbEZpbGU6ILK7xNzIobXDxL/HsMS/wrwiCisKKyM6IGd1aV9hdF9mcy5jOjI1NjggZ3VpX21vdGlmLmM6MTYwNworbXNnaWQgIk9LIgorbXNnc3RyICLIt7aoIgorCisjLiAnQ2FuY2VsJyBidXR0b24KKyM6IGd1aV9hdF9mcy5jOjI1NjggZ3VpX2d0ay5jOjE2ODMgZ3VpX21vdGlmLmM6MTYwMiBndWlfbW90aWYuYzoyODIzCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICLIoc/7IgorCisjOiBndWlfYXRoZW5hLmM6MTkyOCBndWlfbW90aWYuYzoxODU1Cittc2dpZCAiVmltIGRpYWxvZyIKK21zZ3N0ciAiVmltILbUu7C/8iIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICK59ravzPU6ILK7xNzJ6LaoIHRodW1iIHBpeG1hcCC1xM671sMiCisKKyM6IGd1aV9iZXZhbC5jOjY4Cittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6ILK7xNy21NDFz6LT6yBjYWxsYmFjayC0tL2oIEJhbGxvbkV2YWwiCisKKyM6IGd1aS5jOjE4MQorbXNnaWQgIkUyMjk6IENhbm5vdCBzdGFydCB0aGUgR1VJIgorbXNnc3RyICJFMjI5OiCyu8TcxvS2r8280M2958PmIgorCisjOiBndWkuYzozMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6ILK7xNy2wcihzsS8/iBcIiVzXCIiCisKKyM6IGd1aS5jOjQzMQorbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTogsrvV/ci3tcQgJ2d1aWZvbnR3aWRlJyIKKworIzogZ3VpLmM6MzkxOQorbXNnaWQgIkVycm9yIgorbXNnc3RyICK07c7zIgorCisjOiBndWkuYzozOTIwCittc2dpZCAiJk9rIgorbXNnc3RyICLIt7aoKCZPKSIKKworIzogZ3VpX2d0ay5jOjExNDQKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0gttS7sL/yLi4uIgorCisjOiBndWlfZ3RrLmM6MTUxOSBndWlfbW90aWYuYzoyNzQyCittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSCy6dXS0+vM5ru7Li4uIgorCisjOiBndWlfZ3RrLmM6MTUyNCBndWlfbW90aWYuYzoyNzQ0Cittc2dpZCAiVklNIC0gU2VhcmNoLi4uIgorbXNnc3RyICJWSU0gLSCy6dXSLi4uIgorCisjOiBndWlfZ3RrLmM6MTU0NyBndWlfbW90aWYuYzoyODYyCittc2dpZCAiRmluZCB3aGF0OiIKK21zZ3N0ciAisunV0joiCisKKyM6IGd1aV9ndGsuYzoxNTY1IGd1aV9tb3RpZi5jOjI4OTQKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICLM5ru7zqo6IgorCisjLiBleGFjdCBtYXRjaCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE1OTcgZ3VpX21vdGlmLmM6Mjk5NgorbXNnaWQgIk1hdGNoIGV4YWN0IHdvcmQgb25seSIKK21zZ3N0ciAi1rvGpcXkzerIq8/gzay1xNfWIgorCisjOiBndWlfZ3RrLmM6MTYwOSBndWlfbW90aWYuYzoyOTY0Cittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICK3vc/yIgorCisjLiAnVXAnIGFuZCAnRG93bicgYnV0dG9ucworIzogZ3VpX2d0ay5jOjE2MjEgZ3VpX21vdGlmLmM6Mjk3NgorbXNnaWQgIlVwIgorbXNnc3RyICLP8snPIgorCisjOiBndWlfZ3RrLmM6MTYyNSBndWlfbW90aWYuYzoyOTg0Cittc2dpZCAiRG93biIKK21zZ3N0ciAiz/LPwiIKKworIy4gJ0ZpbmQgTmV4dCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY0NyBndWlfbW90aWYuYzoyNzY2Cittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICLV0s/C0ru49iIKKworIy4gJ1JlcGxhY2UnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NjQgZ3VpX21vdGlmLmM6Mjc4MworbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIszmu7siCisKKyMuICdSZXBsYWNlIEFsbCcgYnV0dG9uCisjOiBndWlfZ3RrLmM6MTY3MyBndWlfbW90aWYuYzoyNzk2Cittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIszmu7vIq7K/IgorCisjOiBndWlfZ3RrX3gxMS5jOjEwNzYgZ3VpX3gxMS5jOjExOTQKK21zZ2lkICJFMjMzOiBjYW5ub3Qgb3BlbiBkaXNwbGF5IgorbXNnc3RyICJFMjMzOiA8srvE3LTyv6ogWCBTZXJ2ZXIgRElTUExBWT4iCisKKyM6IGd1aV9ndGtfeDExLmM6MjQzMyBndWlfeDExLmM6MTk5NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiCyu9X9yLe1xNfWt/u8ryAoRm9udHNldCk6ICVzIgorCisjOiBndWlfZ3RrX3gxMS5jOjI0NjAKK21zZ2lkICJGb250IFNlbGVjdGlvbiIKK21zZ3N0ciAi19bM5dGh1PEiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcwMiBndWlfbWFjLmM6Mjc4MCBndWlfdzQ4LmM6MTE5NyBndWlfeDExLmM6MTgzMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICKyu9X9yLe1xNfWzOXD+7PGOiAlcyIKKworIzogZ3VpX2d0a194MTEuYzoyNzEzIGd1aV94MTEuYzoxODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogXCIlc1wiILK7yse5zLaov+22yNfWzOUiCisKKyM6IGd1aV9ndGtfeDExLmM6Mjg0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBDb2xvciBuYW1lIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTI0MjogJXMgzqqyu8Tcyrax8LXE0dXJq8P7s8YiCisKKyM6IGd1aV9ndGtfeDExLmM6MzUxOSB1aS5jOjE5MjkKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICLKudPDIENVVF9CVUZGRVIwIMC0zOa7u7/V0aHU8SIKKworIzogZ3VpX21vdGlmLmM6MTYwMSBndWlfbW90aWYuYzoxNjA0Cittc2dpZCAiRmlsdGVyIgorbXNnc3RyICK5/cLLxvciCisKKyM6IGd1aV9tb3RpZi5jOjE2MDMKK21zZ2lkICJEaXJlY3RvcmllcyIKK21zZ3N0ciAixL/CvCIKKworIzogZ3VpX21vdGlmLmM6MTYwNQorbXNnaWQgIkhlbHAiCittc2dzdHIgIrDv1voiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDYKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAizsS8/iIKKworIzogZ3VpX21vdGlmLmM6MTYwOAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAi0aHU8SIKKworIzogZ3VpX21vdGlmLmM6MjgwOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIrO3z/siCisKKyM6IGd1aV9yaXNjb3MuYzo5NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFMjM1OiCyu8TctPK/qiBaYXAg19bM5SAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTIzNTogsrvE3Mq508PX1szlICVzIgorCisjOiBndWlfcmlzY29zLmM6MTE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQyOiBNaXNzaW5nIGNvbG9yOiAlcyIKK21zZ3N0ciAiRTI0Mjog1dKyu7W90dXJqzogJXMiCisKKyM6IGd1aV9yaXNjb3MuYzozMjY5Cittc2dpZCAiIgorIlxuIgorIlNlbmRpbmcgbWVzc2FnZSB0byB0ZXJtaW5hdGUgY2hpbGQgcHJvY2Vzcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorItX91Nq3osvN1tC2z9fTs8zQ8rXE0MXPoi5cbiIKKworIzogZ3VpX3czMi5jOjgyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQzOiBBcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBcIi0lc1wiOyBVc2UgdGhlIE9MRSB2ZXJzaW9uLiIKK21zZ3N0ciAiRTI0MzogsrvWp7PWss7K/SBcIi0lc1wioaPH69PDIE9MRSCw5rG+oaMiCisKKyM6IGd1aV93NDguYzoyMDY4Cittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAisunV0tfWt/u0riAoyrnTwyAnXFxcXCcgwLSx7cq+ICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjA5MworbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIrLp1dK8sMzmu7vX1rf7tK4gKMq508MgJ1xcXFwnIMC0se3KviAnXFwnKSIKKworIzogZ3VpX3gxMS5jOjE0MTQKK21zZ2lkICJWaW0gRTQ1ODogQ2Fubm90IGFsbG9jYXRlIGNvbG9ybWFwIGVudHJ5LCBzb21lIGNvbG9ycyBtYXkgYmUgaW5jb3JyZWN0IgorbXNnc3RyICJWaW0gRTQ1ODogsrvE3MXk1sMgY29sb3IgbWFwILbUz/OjrNPQ0KnR1cmrv7TG8MC0u+G51rnWtcQiCisKKyM6IGd1aV94MTEuYzoxOTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTA6IEZvbnRzIGZvciB0aGUgZm9sbG93aW5nIGNoYXJzZXRzIGFyZSBtaXNzaW5nIGluIGZvbnRzZXQgJXM6IgorbXNnc3RyICJFMjUwOiBGb250c2V0ICVzIMO709DJ6Lao1f3It7XE19bM5dLUuanP1Mq+1eLQqdfWt/u8rzoiCisKKyM6IGd1aV94MTEuYzoyMDMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTI6IEZvbnRzZXQgbmFtZTogJXMiCittc2dzdHIgIkUyNTI6INfWzOW8ryhGb250c2V0KcP7s8Y6ICVzIgorCisjOiBndWlfeDExLmM6MjAzMQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250ICclcycgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICInJXMnILK7yse5zLaov+22yNfWzOUiCisKKyM6IGd1aV94MTEuYzoyMDUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1Mzog19bM5byvKEZvbnRzZXQpw/uzxjogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDA6ICVzXG4iCittc2dzdHIgItfWzOUwOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA1MgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MTogJXNcbiIKK21zZ3N0ciAi19bM5TE6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQlZCB3aWR0aCBpcyBub3QgdHdpY2UgdGhhdCBvZiBmb250MFxuIgorbXNnc3RyICLX1szlJWS/7bbIsrvKx9fWzOUwtcTBvbG2XG4iCisKKyM6IGd1aV94MTEuYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwIHdpZHRoOiAlbGRcbiIKK21zZ3N0ciAi19bM5TC1xL/ttsijuiVsZFxuIgorCisjOiBndWlfeDExLmM6MjA1NQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9udDEgd2lkdGg6ICVsZFxuIgorIlxuIgorbXNnc3RyICIiCisi19bM5TG/7bbIOiAlbGRcbiIKKyJcbiIKKworIzogZ3VpX3gxMS5jOjIyMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiCyu8TcxeTWw9HVyasgJXMiCisKKyM6IGd1aV94MTEuYzozMjUwCittc2dpZCAiRTI1NTogQ291bGRuJ3QgcmVhZCBpbiBzaWduIGRhdGEhIgorbXNnc3RyICJFMjU1OiCyu8TctsHIoSBzaWduIGRhdGEhIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhILTtzvMiCisKKyM6IGlmX2NzY29wZS5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjc1tjb3BlXSAlcyIKK21zZ3N0ciAiIgorCisjOiBpZl9jc2NvcGUuYzo2NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAi0MLU9sr9vt2/4iIKKworIzogaWZfY3Njb3BlLmM6NjkKK21zZ2lkICJRdWVyeSBmb3IgYSBwYXR0ZXJuIgorbXNnc3RyICKy6dGvxKPKvSIKKworIzogaWZfY3Njb3BlLmM6NzEKK21zZ2lkICJTaG93IHRoaXMgbWVzc2FnZSIKK21zZ3N0ciAiz9TKvrTL0MXPoiIKKworIzogaWZfY3Njb3BlLmM6NzMKK21zZ2lkICJLaWxsIGEgY29ubmVjdGlvbiIKK21zZ3N0ciAiveHK+MGsvdMiCisKKyM6IGlmX2NzY29wZS5jOjc1Cittc2dpZCAiUmVpbml0IGFsbCBjb25uZWN0aW9ucyIKK21zZ3N0ciAi1tjJ6Mv509DBrL3TIgorCisjOiBpZl9jc2NvcGUuYzo3NworbXNnaWQgIlNob3cgY29ubmVjdGlvbnMiCittc2dzdHIgIs/Uyr7BrL3TIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgItXiuPYgY3Njb3BlIMP8we6yu9ans9a31rjuxsHEu1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDMKK21zZ2lkICJVc2FnZTogY3N0YWcgPGlkZW50PiIKK21zZ3N0ciAi08O3qDogY3N0YWcgPMq2sfDX1j4iCisKKyM6IGlmX2NzY29wZS5jOjE5OQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzog1dKyu7W9IHRhZyIKKworIzogaWZfY3Njb3BlLmM6NDA3IGlmX2NzY29wZS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgInN0YXQoJXMpILTtzvM6ICVkIgorCisjOiBpZl9jc2NvcGUuYzo0NjAgaWZfY3Njb3BlLmM6NDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZGVkIGNzY29wZSBkYXRhYmFzZSAlcyIKK21zZ3N0ciAi0MLU9iBjc2NvcGUgyv2+3b/iICVzIgorCisjOiBpZl9jc2NvcGUuYzo0NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgdmFsaWQgY3Njb3BlIGRhdGFiYXNlIgorbXNnc3RyICIlcyCyu8rHxL/CvLvyIGNzY29wZSDK/b7dv+IiCisKKyM6IGlmX2NzY29wZS5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICK2wcihIGNzY29wZSDBrL3TICVkIMqxtO3O8yIKKworIzogaWZfY3Njb3BlLmM6NjMzCittc2dpZCAidW5rbm93biBjc2NvcGUgc2VhcmNoIHR5cGUiCittc2dzdHIgIs601qq1xCBjc2NvcGUgsunV0tDOzKwiCisKKyM6IGlmX2NzY29wZS5jOjY4MAorbXNnaWQgIkNvdWxkIG5vdCBjcmVhdGUgY3Njb3BlIHBpcGVzIgorbXNnc3RyICKyu8TctLS9qNPrIGNzY29wZSDBrL3TtcS53LXAIgorCisjOiBpZl9jc2NvcGUuYzo3NDUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24g1rTQ0MqnsNwiCisKKyM6IGlmX2NzY29wZS5jOjc1NQorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIHRvX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiDKp7DcICh0b19mcCkiCisKKyM6IGlmX2NzY29wZS5jOjc1NworbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiDKp7DcIChmcl9mcCkiCisKKyM6IGlmX2NzY29wZS5jOjc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9ucyIKK21zZ3N0ciAiw7vT0CBjc2NvcGUgway90yIKKworIzogaWZfY3Njb3BlLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTog1dKyu7W9t/u6zyBjc2NvcGUgtcTL0dGwICVzIC8gJXMiCisKKyM6IGlmX2NzY29wZS5jOjg5OQorbXNnaWQgImNzY29wZSBjb21tYW5kczpcbiIKK21zZ3N0ciAiY3Njb3BlIMP8we46XG4iCisKKyM6IGlmX2NzY29wZS5jOjkwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlLTVzOiAlLTMwcyAoVXNhZ2U6ICVzKVxuIgorbXNnc3RyICIlLTVzOiAlLTMwcyAo08O3qDogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MAorbXNnaWQgImR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICLW2Li0tcQgY3Njb3BlIMr9vt2/4s60sbu808jrIgorCisjOiBpZl9jc2NvcGUuYzo5ODEKK21zZ2lkICJtYXhpbXVtIG51bWJlciBvZiBjc2NvcGUgY29ubmVjdGlvbnMgcmVhY2hlZCIKK21zZ3N0ciAi0tG077W9IGNzY29wZSDX7rTzway908r9xL8iCisKKyM6IGlmX2NzY29wZS5jOjExMDIKK21zZ2lkICJFMjYwOiBjc2NvcGUgY29ubmVjdGlvbiBub3QgZm91bmQiCittc2dzdHIgIkUyNjA6INXSsru1vSBjc2NvcGUgway90yIKKworIzogaWZfY3Njb3BlLmM6MTEwNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6INXSsru1vSBjc2NvcGUgway90yAlcyIKKworIzogaWZfY3Njb3BlLmM6MTE0MQorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uIGNsb3NlZCIKK21zZ3N0ciAiY3Njb3BlIMGsvdPS0bnYsdUiCisKKyM6IGlmX2NzY29wZS5jOjExNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gJXMgY2xvc2VkXG4iCittc2dzdHIgImNzY29wZSDBrL3TICVzINLRudix1VxuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjEyOTAKK21zZ2lkICJmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiY3NfbWFuYWdlX21hdGNoZXMg0c/W2LTtzvMiCisKKyM6IGlmX2NzY29wZS5jOjEzNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MjogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiRTI2MjogtsHIoSBjc2NvcGUgway90yAlZCC07c7zIgorCisjOiBpZl9jc2NvcGUuYzoxNDQ5Cittc2dpZCAiY291bGRuJ3QgbWFsbG9jXG4iCittc2dzdHIgIrK7xNzKudPDIG1hbGxvY1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNzY29wZSB0YWc6ICVzXG4iCittc2dzdHIgIkNzY29wZSCx6sepKHRhZyk6ICVzXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTgKK21zZ2lkICIgICAjICAgbGluZSIKK21zZ3N0ciAiICAgIyAgINDQICAiCisKKyM6IGlmX2NzY29wZS5jOjE0NjAKK21zZ2lkICJmaWxlbmFtZSAvIGNvbnRleHQgLyBsaW5lXG4iCittc2dzdHIgIs7EvP7D+yAgICAgLyDJz8/CzsQgICAgLyDQ0LrFXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MTgKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAi1tjJ6Mv509AgY3Njb3BlIMr9vt2/4iIKKworIzogaWZfY3Njb3BlLmM6MTc4NQorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICLDu9PQIGNzY29wZSDBrL3TXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3ODkKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICDK/b7dv+LD+7PGICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKKworIzogaWZfY3Njb3BlLmM6MTgwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlMmQgJS01bGQgICUtMzRzICA8bm9uZT5cbiIKK21zZ3N0ciAiJTJkICUtNWxkICAlLTM0cyAgPM7ePlxuIgorCisjOiBpZl9weXRob24uYzozNzYKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2MzogsafHuKOs1eK49sP8we6yu8TcyrnTw6OsUHl0aG9uILPM0PK/4sO709C809TYoaMiCisKKyM6IGlmX3B5dGhvbi5jOjU3NgorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAisrvE3Mm+s/0gT3V0cHV0T2JqZWN0IMr00NQiCisKKyM6IGlmX3B5dGhvbi5jOjU4MworbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgInNvZnRzcGFjZSCx2NDoysfV+8r9IgorCisjOiBpZl9weXRob24uYzo1OTEKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAisrvV/ci3tcTK9NDUIgorCisjOiBpZl9weXRob24uYzo2MzAgaWZfcHl0aG9uLmM6NjQ0Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpINDo0qogc3RyaW5nIGxpc3QgtbGyzsr9IgorCisjOiBpZl9weXRob24uYzo3NzAKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiCyu8Tcs/XKvLuvIEkvTyC21M/zIgorCisjOiBpZl9weXRob24uYzo5NTUgaWZfdGNsLmM6MTM5MQorbXNnaWQgImludmFsaWQgZXhwcmVzc2lvbiIKK21zZ3N0ciAisrvV/ci3tcSx7bTvyr0iCisKKyM6IGlmX3B5dGhvbi5jOjk2OSBpZl90Y2wuYzoxMzk2Cittc2dpZCAiZXhwcmVzc2lvbnMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICLS8s6qseDS68qxw7vT0LzTyOux7bTvyr0oZXhwcmVzc2lvbim1xLPM0PK0+sLro6zL+dLUsrvE3Mq508Ox7bTvyr0iCisKKyM6IGlmX3B5dGhvbi5jOjk4MgorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIsrUzbzKudPD0tGxu8m+s/21xLu6s+XH+CIKKworIzogaWZfcHl0aG9uLmM6OTk3IGlmX3B5dGhvbi5jOjEwMzggaWZfcHl0aG9uLmM6MTEwMiBpZl90Y2wuYzoxMjAzCittc2dpZCAibGluZSBudW1iZXIgb3V0IG9mIHJhbmdlIgorbXNnc3RyICLQ0LrFs6yz9re2zqciCisKKyM6IGlmX3B5dGhvbi5jOjEyMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGJ1ZmZlciBvYmplY3QgKGRlbGV0ZWQpIGF0ICU4bFg+IgorbXNnc3RyICI8YnVmZmVyILbUz/MgKNLRyb6z/Sk6ICU4bFg+IgorCisjOiBpZl9weXRob24uYzoxMzI2IGlmX3RjbC5jOjgyNQorbXNnaWQgImludmFsaWQgbWFyayBuYW1lIgorbXNnc3RyICKx6rzHw/uzxrK71f3ItyIKKworIzogaWZfcHl0aG9uLmM6MTYwMQorbXNnaWQgIm5vIHN1Y2ggYnVmZmVyIgorbXNnc3RyICLO3rTLu7qz5cf4IgorCisjOiBpZl9weXRob24uYzoxNjg5Cittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAiytTNvMq508PS0bG7yb6z/bXEtLC/2iIKKworIzogaWZfcHl0aG9uLmM6MTczNAorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAi1ru2wcr00NQiCisKKyM6IGlmX3B5dGhvbi5jOjE3NDcKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIrniseq2qM671Nq7urPlx/jWrs3iIgorCisjOiBpZl9weXRob24uYzoxODI0CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjy0sL/attTP8yjS0cm+s/0pOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPLSwv9q21M/zKM601qopOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjy0sL/aICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkxNAorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICLO3rTLtLC/2iIKKworIzogaWZfcHl0aG9uLmM6MjE0NCBpZl9weXRob24uYzoyMTc1IGlmX3B5dGhvbi5jOjIyMjUgaWZfcHl0aG9uLmM6MjI4NQorIzogaWZfcHl0aG9uLmM6MjQwMiBpZl9weXRob24uYzoyNDU0IGlmX3RjbC5jOjY3MyBpZl90Y2wuYzo3MTggaWZfdGNsLmM6NzkyCisjOiBpZl90Y2wuYzo4NjIgaWZfdGNsLmM6MTk4NworbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIrK7xNyxo7TmuLTUrdDFz6IiCisKKyM6IGlmX3B5dGhvbi5jOjIxNDYgaWZfcHl0aG9uLmM6MjIzMiBpZl9weXRob24uYzoyMjk2Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICKyu8Tcyb6z/bTL0NAiCisKKyM6IGlmX3B5dGhvbi5jOjIxNzcgaWZfcHl0aG9uLmM6MjMxMiBpZl90Y2wuYzo2NzkgaWZfdGNsLmM6MjAwOQorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIrK7xNzM5ru7tMvQ0CIKKworIzogaWZfcHl0aG9uLmM6MjMyOCBpZl9weXRob24uYzoyNDA0IGlmX3B5dGhvbi5jOjI0NjIKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIrK7xNyy5cjrtMvQ0CIKKworIzogaWZfcHl0aG9uLmM6MjU2NgorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAi19a3+7SusrvE3LD8uqzQwtDQIgorCisjOiBpZl9ydWJ5LmM6Mzk0Cittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkUyNjY6ILTLw/zB7rK7xNzKudPDo6zO3reovNPU2CBSdWJ5ILPM0PK/4ihMaWJyYXJ5KSIKKworIzogaWZfcnVieS5jOjQ1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiDOtNaqtcQgbG9uZ2ptcCDXtMysICVkIgorCisjOiBpZl9zbmlmZi5jOjY3Cittc2dpZCAiVG9nZ2xlIGltcGxlbWVudGF0aW9uL2RlZmluaXRpb24iCittc2dzdHIgIsfQu7vKtc/WL7ao0uUiCisKKyM6IGlmX3NuaWZmLmM6NjgKK21zZ2lkICJTaG93IGJhc2UgY2xhc3Mgb2YiCittc2dzdHIgIs/Uyr4gYmFzZSBjbGFzcyBvZjoiCisKKyM6IGlmX3NuaWZmLmM6NjkKK21zZ2lkICJTaG93IG92ZXJyaWRkZW4gbWVtYmVyIGZ1bmN0aW9uIgorbXNnc3RyICLP1Mq+sbu4srjHtcSzydSxuq/K/SIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAiu9a4tDogtNPOxLz+IgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICK71ri0OiC007bUz/MiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAiu9a4tDogtNPL+dPQz+7EvyIKKworIzogaWZfc25pZmYuYzo3NAorbXNnaWQgIlJldHJpZXZlIgorbXNnc3RyICK71ri0IgorCisjOiBpZl9zbmlmZi5jOjc1Cittc2dpZCAiU2hvdyBzb3VyY2Ugb2YiCittc2dzdHIgIs/Uyr7UtLT6wus6ICIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICKy6dXSIHN5bWJvbCIKKworIzogaWZfc25pZmYuYzo3NworbXNnaWQgIkJyb3dzZSBjbGFzcyIKK21zZ3N0ciAi5K/AwCBjbGFzcyIKKworIzogaWZfc25pZmYuYzo3OAorbXNnaWQgIlNob3cgY2xhc3MgaW4gaGllcmFyY2h5IgorbXNnc3RyICLP1Mq+suO0zrnYz7W1xMDgIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAiz9TKviByZXN0cmljdGVkILLjtM652M+1tcQgY2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6ODAKK21zZ2lkICJYcmVmIHJlZmVycyB0byIKK21zZ3N0ciAiWHJlZiCyzr+8tb0iCisKKyM6IGlmX3NuaWZmLmM6ODEKK21zZ2lkICJYcmVmIHJlZmVycmVkIGJ5IgorbXNnc3RyICJYcmVmILG7y62yzr+8OiIKKworIzogaWZfc25pZmYuYzo4MgorbXNnaWQgIlhyZWYgaGFzIGEiCittc2dzdHIgIlhyZWYg09AiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYgsbvLrcq508M6IgorCisjOiBpZl9zbmlmZi5jOjg0Cittc2dpZCAiU2hvdyBkb2N1IG9mIgorbXNnc3RyICLP1Mq+zsS8/jogIgorCisjOiBpZl9zbmlmZi5jOjg1Cittc2dpZCAiR2VuZXJhdGUgZG9jdSBmb3IiCittc2dzdHIgIrL6yfrOxLz+OiAiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIrK7xNzBrL3Ttb0gU05pRkYroaPH67zssum7t76zseTBvyAoJFBBVEggwO+x2NDov8nS1NXStb0gc25pZmZlbWFjcylcbiIKKworIzogaWZfc25pZmYuYzo0MjUKK21zZ2lkICJFMjc0OiBTbmlmZjogRXJyb3IgZHVyaW5nIHJlYWQuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiRTI3NDogU25pZmY6ILbByKG07c7zLiDIoc/7way90yIKKworIzogaWZfc25pZmYuYzo1NTMKK21zZ2lkICJTTmlGRisgaXMgY3VycmVudGx5ICIKK21zZ3N0ciAiU05pRkYrIMS/x7AiCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAizrQiCisKKyM6IGlmX3NuaWZmLmM6NTU2Cittc2dpZCAiY29ubmVjdGVkIgorbXNnc3RyICLBrL3T1tAiCisKKyM6IGlmX3NuaWZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzU6IFVua25vd24gU05pRkYrIHJlcXVlc3Q6ICVzIgorbXNnc3RyICJFMjc1OiCyu9X9yLe1xCBTTmlmZisgtffTwzogJXMiCisKKyM6IGlmX3NuaWZmLmM6NjA1Cittc2dpZCAiRTI3NjogRXJyb3IgY29ubmVjdGluZyB0byBTTmlGRisiCittc2dzdHIgIkUyNzY6IMGsvdO1vSBTTmlGRisgyqew3CIKKworIzogaWZfc25pZmYuYzoxMDEwCittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IM60way907W9IFNOaUZGKyIKKworIzogaWZfc25pZmYuYzoxMDE5Cittc2dpZCAiRTI3OTogTm90IGEgU05pRkYrIGJ1ZmZlciIKK21zZ3N0ciAiRTI3OTogsrvKxyBTTmlGRisgtcS7urPlx/giCisKKyM6IGlmX3NuaWZmLmM6MTA4NAorbXNnaWQgIlNuaWZmOiBFcnJvciBkdXJpbmcgd3JpdGUuIERpc2Nvbm5lY3RlZCIKK21zZ3N0ciAiU25pZmY6INC0yOu07c7zoaO94cr4way90yIKKworIzogaWZfdGNsLmM6NDA3Cittc2dpZCAiaW52YWxpZCBidWZmZXIgbnVtYmVyIgorbXNnc3RyICKyu9X9yLe1xLu6s+XH+LrFIgorCisjOiBpZl90Y2wuYzo0NTMgaWZfdGNsLmM6OTIwIGlmX3RjbC5jOjEwOTkKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICLJ0M60yrXP1iIKKworIzogaWZfdGNsLmM6NDkwCittc2dpZCAidW5rbm93biBvcHRpb24iCittc2dzdHIgIrK71f3It7XE0aHP7iIKKworIy4gPz8/CisjOiBpZl90Y2wuYzo3NjMKK21zZ2lkICJjYW5ub3Qgc2V0IGxpbmUocykiCittc2dzdHIgIrK7xNzJ6Lao0NAiCisKKyM6IGlmX3RjbC5jOjgzNAorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAiw7vT0Mnotqix6rzHIgorCisjOiBpZl90Y2wuYzo4NDAgaWZfdGNsLmM6MTA1NQorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICLB0CAlZCDQ0CAlZCIKKworIzogaWZfdGNsLmM6ODcwCittc2dpZCAiY2Fubm90IGluc2VydC9hcHBlbmQgbGluZSIKK21zZ3N0ciAisrvE3LLlyOu78sztvNO0y9DQIgorCisjOiBpZl90Y2wuYzoxMjU3Cittc2dpZCAidW5rbm93biBmbGFnOiAiCittc2dzdHIgIrTtzvO1xLHq1r46ICIKKworIzogaWZfdGNsLmM6MTMyNworbXNnaWQgInVua25vd24gdmltT3B0aW9uIgorbXNnc3RyICKyu9X9yLe1xCBWSU0g0aHP7iIKKworIzogaWZfdGNsLmM6MTQxMgorbXNnaWQgImtleWJvYXJkIGludGVycnVwdCIKK21zZ3N0ciAivPzFzNbQts8iCisKKyM6IGlmX3RjbC5jOjE0MTcKK21zZ2lkICJ2aW0gZXJyb3IiCittc2dzdHIgInZpbSC07c7zIgorCisjOiBpZl90Y2wuYzoxNDYwCittc2dpZCAiY2Fubm90IGNyZWF0ZSBidWZmZXIvd2luZG93IGNvbW1hbmQ6IG9iamVjdCBpcyBiZWluZyBkZWxldGVkIgorbXNnc3RyICKyu8TctLS9qLu6s+XH+C+0sL/aw/zB7jogttTP872rsbvJvrP9IgorCisjOiBpZl90Y2wuYzoxNTM0Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAisrvE3NeisuEgY2FsbGJhY2sgw/zB7jogu7qz5cf4L7Swv9rS0b6tsbvJvrP9wcsiCisKKyMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmQ/CisjOiBpZl90Y2wuYzoxNTUxCittc2dpZCAiIgorIkUyODA6IFRDTCBGQVRBTCBFUlJPUjogcmVmbGlzdCBjb3JydXB0IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLiIKKyJvcmciCittc2dzdHIgIkUyODA6IFRDTCDRz9bYtO3O8zogcmVmbGlzdCCyu7/Jv78hPyDH67GouOa4+CB0byB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjE1NTIKK21zZ2lkICJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyByZWZlcmVuY2Ugbm90IGZvdW5kIgorbXNnc3RyICKyu8Tc16Ky4SBjYWxsYmFjayDD/MHuOiDV0rK7tb27urPlx/gvtLC/2iIKKworIzogaWZfdGNsLmM6MTcxMworbXNnaWQgIlNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQ6IHRoZSBUY2wgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAitMvD/MHusrvE3Mq508MsINLyzqrO3reovNPU2CBUY2wgs8zQ8r/iKExpYnJhcnkpIgorCisjOiBpZl90Y2wuYzoxODc1Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICJFMjgxOiBUQ0wgtO3O8zogzcuz9re1u9jWtbK7ysfV+8r9IT8gx+uxqLjmuPggdG8gdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxOTk1Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICKyu8TcyKG1w7TL0NAiCisKKyM6IGlmX3hjbWRzcnYuYzoyMDQKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICKyu8Tc16Ky4cP8we63/s7xxvfD+7PGIgorCisjOiBpZl94Y21kc3J2LmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0Nzogw7vT0NeisuHOqiBcIiVzXCIgtcS3/s7xxvciCisKKyM6IGlmX3hjbWRzcnYuYzo0NDYKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiCyu8Tcy82z9sP8we61vcS/tcS12LPM0PIiCisKKyM6IGlmX3hjbWRzcnYuYzo3MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIrK71f3It7XEt/7O8cb3IGlkIDogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMDU2Cittc2dpZCAiRTI0OTogY291bGRuJ3QgcmVhZCBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkiCittc2dzdHIgIkUyNDk6ILK7xNy2wcihIFZJTSC1xCDXorLhse3K9NDUIgorCisjOiBpZl94Y21kc3J2LmM6MTA2NworbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNILXE16Ky4bHtyvTQ1NPQzvOho9LRyb6z/aGjIgorCisjOiBtYWluLmM6NTMgb3B0aW9uLmM6MzE2MiBvcHRpb24uYzozMjY5Cittc2dpZCAiVW5rbm93biBvcHRpb24iCittc2dzdHIgIrK71f3It7XE0aHP7iIKKworIzogbWFpbi5jOjU1Cittc2dpZCAiVG9vIG1hbnkgZWRpdCBhcmd1bWVudHMiCittc2dzdHIgIsyrtuCx4Lytss7K/SIKKworIzogbWFpbi5jOjU3Cittc2dpZCAiQXJndW1lbnQgbWlzc2luZyBhZnRlciIKK21zZ3N0ciAiyLHJ2bHY0qq1xLLOyv06IgorCisjOiBtYWluLmM6NTkKK21zZ2lkICJHYXJiYWdlIGFmdGVyIG9wdGlvbiIKK21zZ3N0ciAisrvE3LHmyM+0y9Ghz+6687XEw/zB7jogIgorCisjOiBtYWluLmM6NjEKK21zZ2lkICJUb28gbWFueSBcIitjb21tYW5kXCIgb3IgXCItYyBjb21tYW5kXCIgYXJndW1lbnRzIgorbXNnc3RyICLMq7bgIFwiK2NvbW1hbmRcIiC78iBcIi1jIGNvbW1hbmRcIiCyzsr9IgorCisjOiBtYWluLmM6NjMKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAisrvV/ci3tcSyzsr9OiAiCisKKyM6IG1haW4uYzo0MzYKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIsT6tcQgVmltILHg0uvKscO709C808jrIGRpZmYgtcTE3MGmIgorCisjOiBtYWluLmM6ODU4Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAiytTNvNTZtM608r+qIHNjcmlwdCDOxLz+OiBcIiIKKworIzogbWFpbi5jOjg2MiBtYWluLmM6ODY5IG1haW4uYzo5MTMgbWVtbGluZS5jOjM2NzMgbWVtbGluZS5jOjM2NzcKKyM6IHZlcnNpb24uYzo4MTYgdmVyc2lvbi5jOjgyMSB2ZXJzaW9uLmM6ODI2IHZlcnNpb24uYzo4MzEgdmVyc2lvbi5jOjgzNgorIzogdmVyc2lvbi5jOjg0MSB2ZXJzaW9uLmM6ODQ3IHZlcnNpb24uYzo4NTEgdmVyc2lvbi5jOjg1NSB2ZXJzaW9uLmM6ODYwCisjOiB2ZXJzaW9uLmM6ODY3IHZlcnNpb24uYzo4NzUgdmVyc2lvbi5jOjg4MQorbXNnaWQgIlwiXG4iCittc2dzdHIgIlwiXG4iCisKKyM6IG1haW4uYzo4NjcKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3IgcmVhZGluZzogXCIiCittc2dzdHIgIrK7xNzOqrbBtvi08r+qOiBcIiIKKworIzogbWFpbi5jOjkxMQorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAisrvE3M6qIHNjcmlwdCDK5LP2tvi08r+qOiBcIiIKKworIzogbWFpbi5jOjEwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICK7udPQICVkILj2zsS8/rXItP2x4LytXG4iCisKKyM6IG1haW4uYzoxMDk0Cittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDXotLiOiDK5LP2srvKx9bVtssoxsHEuylcbiIKKworIzogbWFpbi5jOjEwOTYKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDXotLiOiDK5MjrsrvKx9bVtssovPzFzClcbiIKKworIy4ganVzdCBpbiBjYXNlLi4KKyM6IG1haW4uYzoxMTcxCittc2dpZCAicHJlLXZpbXJjIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAicHJlLXZpbXJjIMP8we7Q0CIKKworIzogbWFpbi5jOjEyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6ILK7xNy2wcihzsS8/iBcIiVzXCIiCisKKyM6IG1haW4uYzoyMTU3Cittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIiIKKyJcbiIKKyKy6dGvuPy24NDFz6LH69a00NA6IFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjIxOTAKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW87EvP4gLi5dICAgICAgILHgvK3WuLaotcTOxLz+IgorCisjOiBtYWluLmM6MjE5MQorbXNnaWQgIi0gICAgICAgICAgICAgICByZWFkIHRleHQgZnJvbSBzdGRpbiIKK21zZ3N0ciAiLSAgICAgICAgICAgICAgILTTserXvMrkyOsoc3RkaW4ptsHIoc7Esb4iCisKKyM6IG1haW4uYzoyMTkyCittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQgdGFnICAgICAgICAgILHgvK3Kscq508PWuLaotcQgdGFnIgorCisjOiBtYWluLmM6MjE5NAorbXNnaWQgIi1xIFtlcnJvcmZpbGVdICBlZGl0IGZpbGUgd2l0aCBmaXJzdCBlcnJvciIKK21zZ3N0ciAiLXEgW2Vycm9yZmlsZV0gILHgvK3KsbzT1Ni12tK7uPa07c7zIgorCisjOiBtYWluLmM6MjIwMworbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyIg08O3qDoiCisKKyM6IG1haW4uYzoyMjA2Cittc2dpZCAiIHZpbSBbYXJndW1lbnRzXSAiCittc2dzdHIgInZpbSBbss7K/V0gIgorCisjOiBtYWluLmM6MjIxMAorbXNnaWQgIiIKKyJcbiIKKyIgICBvcjoiCittc2dzdHIgIiIKKyJcbiIKKyIgICC78joiCisKKyM6IG1haW4uYzoyMjEzCittc2dpZCAiIgorIlxuIgorIlxuIgorIkFyZ3VtZW50czpcbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIrLOyv06XG4iCisKKyM6IG1haW4uYzoyMjE0Cittc2dpZCAiLS1cdFx0XHRPbmx5IGZpbGUgbmFtZXMgYWZ0ZXIgdGhpcyIKK21zZ3N0ciAiLS1cdFx0XHTWu9PQ1NrV4tauuvO1xM7EvP4iCisKKyM6IG1haW4uYzoyMjE2Cittc2dpZCAiLXJlZ2lzdGVyXHRcdFJlZ2lzdGVyIHRoaXMgZ3ZpbSBmb3IgT0xFIgorbXNnc3RyICItcmVnaXN0ZXJcdFx016Ky4SBndmltILW9IE9MRSIKKworIzogbWFpbi5jOjIyMTcKK21zZ2lkICItdW5yZWdpc3Rlclx0XHRVbnJlZ2lzdGVyIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXVucmVnaXN0ZXJcdFx0yKHP+yBPTEUg1tC1xCBndmltINeisuEiCisKKyM6IG1haW4uYzoyMjIwCittc2dpZCAiLWdcdFx0XHRSdW4gdXNpbmcgR1VJIChsaWtlIFwiZ3ZpbVwiKSIKK21zZ3N0ciAiLWdcdFx0XHTKudPDzbzQzr3nw+YgKM2sIFwiZ3ZpbVwiKSIKKworIzogbWFpbi5jOjIyMjEKK21zZ2lkICItZlx0XHRcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mXHRcdFx0x7C+sDogxvS2r8280M6958PmyrGyuyBmb3JrIgorCisjOiBtYWluLmM6MjIyMworbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIMSjyr0gKM2sIFwidmlcIikiCisKKyM6IG1haW4uYzoyMjI0Cittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0RXggxKPKvSAozawgXCJleFwiKSIKKworIzogbWFpbi5jOjIyMjUKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0sLK+siAoYmF0Y2gpIMSjyr0gKNa7xNzT6yBcImV4XCIg0rvG8Mq508MpIgorCisjOiBtYWluLmM6MjIyNworbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmIMSjyr0gKM2sIFwidmltZGlmZlwiLCC/ydG4y9mxyL3Pwb3OxLz+srvNrLSmKSIKKworIzogbWFpbi5jOjIyMjkKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdLzy0tfEo8q9ICjNrCBcImV2aW1cIiwgbW9kZWxlc3MpIgorCisjOiBtYWluLmM6MjIzMAorbXNnaWQgIi1SXHRcdFx0UmVhZG9ubHkgbW9kZSAobGlrZSBcInZpZXdcIikiCittc2dzdHIgIi1SXHRcdFx01ru2wcSjyr0gKM2sIFwidmlld1wiKSIKKworIzogbWFpbi5jOjIyMzEKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0z97WxsSjyr0gKM2sIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjIyMzIKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdLK7v8nQ3rjEICjQtMjrzsS8/ikiCisKKyM6IG1haW4uYzoyMjMzCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0zsSxvrK7v8nQ3rjEIgorCisjOiBtYWluLmM6MjIzNAorbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0tv69+NbGxKPKvSIKKworIzogbWFpbi5jOjIyMzYKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwIMSjyr0iCisKKyM6IG1haW4uYzoyMjM4Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHQnY29tcGF0aWJsZScgtKvNsyBWaSC85sjdxKPKvSIKKworIzogbWFpbi5jOjIyMzkKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHQnbm9jb21wYXRpYmxlJyCyu83qyKvT67SrzbMgVmkgvObI3aOsv8nKudPDIFZpbSC808e/xNzBpiIKKworIzogbWFpbi5jOjIyNDAKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0XHRWZXJib3NlILXIvLYiCisKKyM6IG1haW4uYzoyMjQxCittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHS198rUxKPKvSIKKworIzogbWFpbi5jOjIyNDIKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdLK7yrnTw727u7vOxLz+LCDWu8q508PE2rTmIgorCisjOiBtYWluLmM6MjI0MworbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdMHQs/a9u7u7zsS8/rrzzcuz9iIKKworIzogbWFpbi5jOjIyNDQKK21zZ2lkICItciAod2l0aCBmaWxlIG5hbWUpXHRSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbiIKK21zZ3N0ciAiLXIgKLzTzsS8/sP7KSAgICAgICBcdLvWuLTJz7TOscDAo7XE18rBzyhSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbikiCisKKyM6IG1haW4uYzoyMjQ1Cittc2dpZCAiLUxcdFx0XHRTYW1lIGFzIC1yIgorbXNnc3RyICItTFx0XHRcdNPrIC1yINK70fkiCisKKyM6IG1haW4uYzoyMjQ3Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdLK7yrnTwyBuZXdjbGkgwLS08r+qtLC/2iIKKworIzogbWFpbi5jOjIyNDgKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDxkZXZpY2U+XHRcdMq508MgPGRldmljZT4g1/bK5MjryuSz9snosbgiCisKKyM6IG1haW4uYzoyMjUxCittc2dpZCAiLUhcdFx0XHRzdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHTG9Lavzqogz6OyrsCzxKPKvSIKKworIzogbWFpbi5jOjIyNTQKK21zZ2lkICItRlx0XHRcdHN0YXJ0IGluIEZhcnNpIG1vZGUiCittc2dzdHIgIi1GXHRcdFx0xvS2r86qIEZhcnNpIMSjyr0iCisKKyM6IG1haW4uYzoyMjU2Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx0yei2qNbVtsvOqiA8dGVybWluYWw+IgorCisjOiBtYWluLmM6MjI1NworbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRcdMq508MgPHZpbXJjPiDM5ru7yM66ziAudmltcmMiCisKKyM6IG1haW4uYzoyMjU5Cittc2dpZCAiLVUgPGd2aW1yYz5cdFx0VXNlIDxndmltcmM+IGluc3RlYWQgb2YgYW55IC5ndmltcmMiCittc2dzdHIgIi1VIDxndmltcmM+XHRcdMq508MgPGd2aW1yYz4gzOa7u8jOus4gLmd2aW1yYyIKKworIzogbWFpbi5jOjIyNjEKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0sru809TYyM66ziBwbHVnaW4iCisKKyM6IG1haW4uYzoyMjYyCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0tPK/qiBOILj2tLC/2iAo1KTJ6MrHw7+49s7EvP7Su7j2KSIKKworIzogbWFpbi5jOjIyNjMKK21zZ2lkICItT1tOXVx0XHRsaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHTNrCAtbyC1q8q508O0udaxt9a47iIKKworIzogbWFpbi5jOjIyNjQKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHTG9LavuvPM+LW9zsS8/r3hzrIiCisKKyM6IG1haW4uYzoyMjY1Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHTG9LavuvPM+LW9tdogPGxudW0+INDQIgorCisjOiBtYWluLmM6MjI2NworbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxjb21tYW5kPlx0vNPU2MjOus4gdmltcmMgx7DWtNDQIDxjb21tYW5kPiIKKworIzogbWFpbi5jOjIyNjkKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPGNvbW1hbmQ+XHRcdLzT1Ni12tK7uPbOxLz+uvPWtNDQIDxjb21tYW5kPiIKKworIzogbWFpbi5jOjIyNzAKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNzaW9uPlx0XHS809TYtdrSu7j2zsS8/rrz1NjI6yBTZXNzaW9uIM7EvP48c2Vzc2lvbj4iCisKKyM6IG1haW4uYzoyMjcxCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdGluPlx0tNMgPHNjcmlwdGluPiC2wcjr0ruw48Sjyr3D/MHuIgorCisjOiBtYWluLmM6MjI3MgorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxzY3JpcHRvdXQ+XHS21M7EvP4gPHNjcmlwdG91dD4guL280yhhcHBlbmQpy/nT0MrkyOu1xMP8we4iCisKKyM6IG1haW4uYzoyMjczCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx0ttTOxLz+IDxzY3JpcHRvdXQ+INC0yOvL+dPQyuTI67XEw/zB7iIKKworIzogbWFpbi5jOjIyNzUKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdLHgvK2x4MLruf21xM7EvP4iCisKKyM6IG1haW4uYzoyMjc5Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRDb25uZWN0IHZpbSB0byB0aGlzIHBhcnRpY3VsYXIgWC1zZXJ2ZXIiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx0vasgdmltINPr1ri2qLXEIFgtc2VydmVyIMGsvdMiCisKKyM6IG1haW4uYzoyMjgxCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHSyu9Kqway907W9IFggU2VydmVyIgorCisjOiBtYWluLmM6MjI4MworbXNnaWQgIi0tc29ja2V0aWQgPHhpZD5cdE9wZW4gVmltIGluc2lkZSBhbm90aGVyIEdUSyB3aWRnZXQiCittc2dzdHIgIi0tc29ja2V0aWQgPHhpZD5cdNTawe3Su7j2IEdUSyDX6bz+xNq08r+qIFZpbSIKKworIzogbWFpbi5jOjIyODcKK21zZ2lkICItLXJlbW90ZSA8ZmlsZXM+XHRFZGl0IDxmaWxlcz4gaW4gYSBWaW0gc2VydmVyIGFuZCBleGl0IgorbXNnc3RyICItLXJlbW90ZSA8ZmlsZXM+XHSx4LytIFZpbSC3/s7xxvfJz7XEzsS8/rKizcuz9iIKKworIzogbWFpbi5jOjIyODgKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ILXI0KfT2iAtLXJlbW90ZSwgtau74bXIuvLOxLz+zeqzybHgvK0iCisKKyM6IG1haW4uYzoyMjg5Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdMvNs/YgPGtleXM+ILW9IFZpbSC3/s7xxveyos3Ls/YiCisKKyM6IG1haW4uYzoyMjkwCittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdNTat/7O8cb3yc/H87HttO/KvbXE1rWyorTy06G94bn7IgorCisjOiBtYWluLmM6MjI5MQorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0wdCz9r/J08O1xCBWaW0gt/7O8cb3w/uzxrKizcuz9iIKKworIzogbWFpbi5jOjIyOTIKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8bmFtZT5cdMvN1sEvs8nOqiBWaW0gt/7O8cb3IDxuYW1lPiIKKworIzogbWFpbi5jOjIyOTUKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0yrnTwyA8dmltaW5mbz4gtvi3xyAudmltaW5mbyIKKworIzogbWFpbi5jOjIyOTcKK21zZ2lkICItaFx0XHRcdHByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oXHRcdFx0tPLTocu1w/co0rK+zcrHsb7Qxc+iKbrzzcuz9iIKKworIzogbWFpbi5jOjIyOTgKK21zZ2lkICItLXZlcnNpb25cdFx0cHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIKK21zZ3N0ciAiLS12ZXJzaW9uXHRcdLTy06Gw5rG+0MXPorrzzcuz9iIKKworIzogbWFpbi5jOjIzMDIKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoTW90aWYgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIL/Jyrax8LXEss7K/SAoTW90aWYgsOYpOlxuIgorCisjOiBtYWluLmM6MjMwNQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChBdGhlbmEgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIL/Jyrax8LXEss7K/SAoQXRoZW5hILDmKTpcbiIKKworIzogbWFpbi5jOjIzMDgKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdNTatLC/2iA8ZGlzcGxheT4g1rTQ0CB2aW0iCisKKyM6IG1haW4uYzoyMzA5Cittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdMb0tq+689fu0KG7ryhpY29uaWZpZWQpIgorCisjOiBtYWluLmM6MjMxMQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYW1lPlx0XHS2wcihIFJlc291cmNlIMqxsNEgdmltILXEw/uzxsrTzqogPG5hbWU+IgorCisjOiBtYWluLmM6MjMxMgorbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKMnQzrTKtc/WKVxuIgorCisjOiBtYWluLmM6MjMxNAorbXNnaWQgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciB0aGUgYmFja2dyb3VuZCAoYWxzbzogLWJnKSIKK21zZ3N0ciAiLWJhY2tncm91bmQgPGNvbG9yPlx0yei2qCA8Y29sb3I+IM6qsbO+sMmrICjSsr/J08MgLWJnKSIKKworIzogbWFpbi5jOjIzMTUKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdMnotqggPGNvbG9yPiDOqtK7sOPOxNfW0dXJqyAo0rK/ydPDIC1mZykiCisKKyM6IG1haW4uYzoyMzE2IG1haW4uYzoyMzM2Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdMq508MgPGZvbnQ+IM6q0ruw49fWzOUgKNKyv8nTwyAtZm4pIgorCisjOiBtYWluLmM6MjMxNworbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxmb250Plx0yrnTwyA8Zm9udD4gzqq01szl19bM5SIKKworIzogbWFpbi5jOjIzMTgKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8Zm9udD5cdMq508MgPGZvbnQ+IM6q0LHM5dfWzOUiCisKKyM6IG1haW4uYzoyMzE5IG1haW4uYzoyMzM3Cittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHTKudPDPGdlb20+zqqz9cq8zrvWwyAo0rK/ydPDIC1nZW9tKSIKKworIzogbWFpbi5jOjIzMjAKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHTKudPDv+22yM6qIDx3aWR0aD4gtcSx37/yICjSsr/J08MgLWJ3KSIKKworIzogbWFpbi5jOjIzMjEKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+IMnotqi59ravzPW/7bbIzqogPHdpZHRoPiAo0rK/ydPDIC1zdykiCisKKyM6IG1haW4uYzoyMzIzCittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdMnotqiyy7WlwdC1xLjftsjOqiA8aGVpZ2h0PiAo0rK/ydPDIC1taCkiCisKKyM6IG1haW4uYzoyMzI1IG1haW4uYzoyMzM4Cittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdMq508O3tM/UICjSsr/J08MgLXJ2KSIKKworIzogbWFpbi5jOjIzMjYKK21zZ2lkICIrcmV2ZXJzZVx0XHREb24ndCB1c2UgcmV2ZXJzZSB2aWRlbyAoYWxzbzogK3J2KSIKK21zZ3N0ciAiK3JldmVyc2VcdFx0srvKudPDt7TP1CAo0rK/ydPDICtydikiCisKKyM6IG1haW4uYzoyMzI3Cittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHTJ6Lao1ri2qLXE18rUtCIKKworIzogbWFpbi5jOjIzMzAKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoUklTQyBPUyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0gv8nKtrHwtcSyzsr9IChSSVNDIE9TILDmKTpcbiIKKworIzogbWFpbi5jOjIzMzEKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bnVtYmVyPlx0tLC/2rP1yry/7bbIIgorCisjOiBtYWluLmM6MjMzMgorbXNnaWQgIi0tcm93cyA8bnVtYmVyPlx0SW5pdGlhbCBoZWlnaHQgb2Ygd2luZG93IGluIHJvd3MiCittc2dzdHIgIi0tcm93cyA8bnVtYmVyPlx0tLC/2rP1yry437bIIgorCisjOiBtYWluLmM6MjMzNQorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChHVEsrIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSC/ycq2sfC1xLLOyv0gKEdUSysgsOYpOlxuIgorCisjOiBtYWluLmM6MjMzOQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx01NogPGRpc3BsYXk+INa00NAgdmltICjSsr/J08MgLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjIzNDEKK21zZ2lkICItLWhlbHBcdFx0U2hvdyBHbm9tZSBhcmd1bWVudHMiCittc2dzdHIgIi0taGVscFx0XHTP1Mq+IEdub21lIM/gudiyzsr9IgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6MjU2NgorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIreiy82x7bTvyr3Kp7DcoaNcbiIKKworIy4gTGV0IHZpbSBzdGFydCBub3JtYWxseS4KKyM6IG1haW4uYzoyNTcxCittc2dpZCAiIgorIlxuIgorIlNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIiIKKyJcbiIKKyLLzbP2yqew3KGjytTNvNTasb612Na00NBcbiIKKworIzogbWFpbi5jOjI2MDQgbWFpbi5jOjI2MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICIlZCDW0CAlZCDS0bHgvK0iCisKKyM6IG1haW4uYzoyNjQ4Cittc2dpZCAiU2VuZCBleHByZXNzaW9uIGZhaWxlZC5cbiIKK21zZ3N0ciAit6LLzbHttO/KvcqnsNyho1xuIgorCisjOiBtYXJrLmM6NjU1Cittc2dpZCAiTm8gbWFya3Mgc2V0IgorbXNnc3RyICLDu9PQyei2qLHqvMcgKG1hcmspIgorCisjOiBtYXJrLmM6NjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODM6IE5vIG1hcmtzIG1hdGNoaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTI4Mzog1dKyu7W9t/u6zyBcIiVzXCIgtcSx6rzHKG1hcmspIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo2NjgKK21zZ2lkICIiCisiXG4iCisibWFyayBsaW5lICBjb2wgZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiseq8xyDQ0LrFICDB0CAgzsS8/i/OxLG+IgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1hcmsuYzo3MDYKK21zZ2lkICIiCisiXG4iCisiIGp1bXAgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiDM+LW9INDQusUgIMHQICDOxLz+L87Esb4iCisKKyM6IG1hcmsuYzoxMDY4Cittc2dpZCAiIgorIlxuIgorIiMgRmlsZSBtYXJrczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgzsS8/rHqvMc6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTEwMworbXNnaWQgIiIKKyJcbiIKKyIjIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBKdW1wbGlzdCAotNPQwrW9vskpOlxuIgorCisjOiBtYXJrLmM6MTE5OAorbXNnaWQgIiIKKyJcbiIKKyIjIEhpc3Rvcnkgb2YgbWFya3Mgd2l0aGluIGZpbGVzIChuZXdlc3QgdG8gb2xkZXN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgzsS8/sTawPrKt7zHwrwgKLTT0MK1vb7JKTpcbiIKKworIzogbWFyay5jOjEyODEKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAiyLHJ2bbU06a1xCAnPiciCisKKyM6IG1ieXRlLmM6Mzk1Cittc2dpZCAiTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIrK71f3It7XEtPrC69KzIgorCisjOiBtYnl0ZS5jOjMwMDUKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogsrvE3MnotqggSUMgyv3WtSIKKworIzogbWJ5dGUuYzozMTU3Cittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiCyu8TctLS9qMrkyOvJz8/CzsQiCisKKyM6IG1ieXRlLmM6MzMwNAorbXNnaWQgIkUyODY6IEZhaWxlZCB0byBvcGVuIGlucHV0IG1ldGhvZCIKK21zZ3N0ciAiRTI4NjogsrvE3LTyv6rK5Mjrt6giCisKKyM6IG1ieXRlLmM6MzMxNQorbXNnaWQgIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIKK21zZ3N0ciAiRTI4Nzogvq+45jogsrvE3NLGs/0gSU0gtcQgY2FsbGJhY2siCisKKyM6IG1ieXRlLmM6MzMyMQorbXNnaWQgIkUyODg6IGlucHV0IG1ldGhvZCBkb2Vzbid0IHN1cHBvcnQgYW55IHN0eWxlIgorbXNnc3RyICJFMjg4OiDK5Mjrt6iyu9ans9bIzrrOIHN0eWxlIgorCisjOiBtYnl0ZS5jOjMzNzgKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTogyuTI67eosrvWp7PWyM66ziBzdHlsZSIKKworIzogbWJ5dGUuYzozNDUyCittc2dpZCAiRTI5MDogb3Zlci10aGUtc3BvdCBzdHlsZSByZXF1aXJlcyBmb250c2V0IgorbXNnc3RyICJFMjkwOiBvdmVyLXRoZS1zcG90INDo0qrX1szlvK8oRm9udHNldCkiCisKKyM6IG1ieXRlLmM6MzQ4MAorbXNnaWQgIkUyOTE6IFlvdXIgR1RLKyBpcyBvbGRlciB0aGFuIDEuMi4zLiBTdGF0dXMgYXJlYSBkaXNhYmxlZCIKK21zZ3N0ciAiRTI5MTogxOO1xCBHVEsrILHIIDEuMi4zIMDPoaOyu8TcyrnTw9e0zKzH+KGjIgorCisjOiBtYnl0ZS5jOjM3MTcKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiDK5Mjrt6i53MDts8zQ8ihJbnB1dCBNZXRob2QgU2VydmVyKc601MvQ0CIKKworIzogbWVtZmlsZS5jOjQ3MworbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiC/6c60sbvL+LaoIgorCisjOiBtZW1maWxlLmM6OTcyCittc2dpZCAiRTI5NDogU2VlayBlcnJvciBpbiBzd2FwIGZpbGUgcmVhZCIKK21zZ3N0ciAiRTI5NDogvbu7u87EvP62wcihtO3O8yIKKworIzogbWVtZmlsZS5jOjk3NworbXNnaWQgIkUyOTU6IFJlYWQgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk1OiC9u7u7zsS8/rbByKG07c7zIgorCisjOiBtZW1maWxlLmM6MTAyOQorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiC9u7u7zsS8/tC0yOu07c7zIgorCisjOiBtZW1maWxlLmM6MTA0NworbXNnaWQgIkUyOTc6IFdyaXRlIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5Nzogvbu7u87EvP7QtMjrtO3O8yIKKworIzogbWVtZmlsZS5jOjEyNDQKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6IL27u7vOxLz+0tG+rbTm1NohICjQodDEt/u6xcGsveG1xLCyyKvCqba0IT8pIgorCisjOiBtZW1saW5lLmM6Mjc1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAwPyIKK21zZ3N0ciAiRTI5ODog1dKyu7W9v+kgMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiDV0rK7tb2/6SAxPyIKKworIzogbWVtbGluZS5jOjMzMworbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMj8iCittc2dzdHIgIkUyOTg6INXSsru1vb/pIDI/IgorCisjLiBjb3VsZCBub3QgKHJlKW9wZW4gdGhlIHN3YXAgZmlsZSwgd2hhdCBjYW4gd2UgZG8/Pz8/CisjOiBtZW1saW5lLmM6NDQzCittc2dpZCAiRTMwMTogT29wcywgbG9zdCB0aGUgc3dhcCBmaWxlISEhIgorbXNnc3RyICJFMzAxOiDg3uDeLCC9u7u7zsS8/rK7vPvByyEhISIKKworIzogbWVtbGluZS5jOjQ0OAorbXNnaWQgIkUzMDI6IENvdWxkIG5vdCByZW5hbWUgc3dhcCBmaWxlIgorbXNnc3RyICJFMzAyOiCyu8TcuMSx5L27u7vOxLz+tcTD+7PGIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiCyu8TctPK/qr27u7vOxLz+IFwiJXNcIiwgsru/ycTcu9a4tMHLIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiDV0rK7tb2/6SAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTog1dKyu7W9ICVzILXEvbu7u87EvP4iCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICLH69Gh1PHE49KqyrnTw7XEvbu7u87EvP4gKLC0MCDNy7P2KTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiCyu8TctPK/qiAlcyIKKworIzogbWVtbGluZS5jOjgzNAorbXNnaWQgIlVuYWJsZSB0byByZWFkIGJsb2NrIDAgZnJvbSAiCittc2dzdHIgIrK7xNy2wcihv+kgMDoiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisiv8nE3MTjw7vX9rn9yM66ztDeuMS78srHIFZpbSC7ucC0sru8sLj80MK9u7u7zsS8/i4iCisKKyM6IG1lbWxpbmUuYzo4NDcgbWVtbGluZS5jOjg2NAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iCittc2dzdHIgIiCyu8Tc1NqxvrDmsb61xCBWaW0g1tDKudPDLlxuIgorCisjOiBtZW1saW5lLmM6ODQ5Cittc2dpZCAiVXNlIFZpbSB2ZXJzaW9uIDMuMC5cbiIKK21zZ3N0ciAiyrnTwyBWaW0gMy4woaNcbiIKKworIzogbWVtbGluZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA3OiAlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlIgorbXNnc3RyICJFMzA3OiAlcyC/tMbwwLSyu8/xyscgVmltIL27u7vOxLz+IgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiCyu8Tc1NrV4syotefE1MnPyrnTwy5cbiIKKworIzogbWVtbGluZS5jOjg3MAorbXNnaWQgIlRoZSBmaWxlIHdhcyBjcmVhdGVkIG9uICIKK21zZ3N0ciAisb7OxLz+tLS9qNPaICIKKworIzogbWVtbGluZS5jOjg3NAorbXNnaWQgIiIKKyIsXG4iCisib3IgdGhlIGZpbGUgaGFzIGJlZW4gZGFtYWdlZC4iCittc2dzdHIgIiIKKyIsXG4iCisiu/LKx9XizsS8/tLRsbvGxru1oaMiCisKKyM6IG1lbWxpbmUuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgc3dhcCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiyrnTw727u7vOxLz+IFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAi1K3OxLz+IFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkzNAorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiC+r7jmOiDUrcq8zsS8/r/JxNzS0b6t0N64xLn9wcsiCisKKyM6IG1lbWxpbmUuYzo5NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiCyu8TctNMgJXMgtsHIob/pIDEiCisKKyM6IG1lbWxpbmUuYzo5NzkKK21zZ2lkICI/Pz9NQU5ZIExJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P8ixydnMq7bg0NAiCisKKyM6IG1lbWxpbmUuYzo5OTUKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz/Q0LrFtO3O8yIKKworIzogbWVtbGluZS5jOjEwMDIKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/v9W1xCC/6SIKKworIzogbWVtbGluZS5jOjEwMjgKK21zZ2lkICI/Pz9MSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/V0rK7tb3Su9Cp0NAiCisKKyM6IG1lbWxpbmUuYzoxMDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTA6IEJsb2NrIDEgSUQgd3JvbmcgKCVzIG5vdCBhIC5zd3AgZmlsZT8pIgorbXNnc3RyICJFMzEwOiC/6SAxIElEILTtzvMgKCVzILK7yse9u7u7zsS8/j8pIgorCisjOiBtZW1saW5lLmM6MTA2NQorbXNnaWQgIj8/P0JMT0NLIE1JU1NJTkciCittc2dzdHIgIj8/P9XSsru1vb/pIgorCisjOiBtZW1saW5lLmM6MTA4MQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBiZSBtZXNzZWQgdXAiCittc2dzdHIgIj8/PyC009XiwO+1vSA/Pz9FTkQgtcTE2sjdv8nE3NPQzsrM4iIKKworIzogbWVtbGluZS5jOjEwOTcKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkL2RlbGV0ZWQiCittc2dzdHIgIj8/PyC009XiwO+1vSA/Pz9FTkQgtcTE2sjdv8nE3LG7yb6z/S+y5cjruf0iCisKKyM6IG1lbWxpbmUuYzoxMTE3Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9FTkQiCisKKyM6IG1lbWxpbmUuYzoxMTQzCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6ILvWuLTS0dbQts8iCisKKyM6IG1lbWxpbmUuYzoxMTQ1Cittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjogu9a4tMqxt6LJ+rTtzvM7IMfr16LS4r+qzbfOqiA/Pz8gtcTQ0CIKKworIzogbWVtbGluZS5jOjExNDgKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIrvWuLTN6rPJLiDH68i3tqjSu8fQ1f2zoy4iCisKKyM6IG1lbWxpbmUuYzoxMTQ5Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKMTjv8nE3M/r0qqw0dXiuPbOxLz+we205s6qsfC1xM7EvP7D+6OsXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUwCittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgItTZ1rTQ0CBkaWZmINPr1K3OxLz+sci9z9LUvOyy6crHt/HT0LjEseQpXG4iCisKKyM6IG1lbWxpbmUuYzoxMTUxCittc2dpZCAiIgorIkRlbGV0ZSB0aGUgLnN3cCBmaWxlIGFmdGVyd2FyZHMuXG4iCisiXG4iCittc2dzdHIgIiIKKyIoRCnWsb3Tyb6z/SAuc3dwIL27u7vOxLz+XG4iCisiXG4iCisKKyMuIHVzZSBtc2coKSB0byBzdGFydCB0aGUgc2Nyb2xsaW5nIHByb3Blcmx5CisjOiBtZW1saW5lLmM6MTIwNworbXNnaWQgIlN3YXAgZmlsZXMgZm91bmQ6IgorbXNnc3RyICLV0rW90tTPwrXEvbu7u87EvP46IgorCisjOiBtZW1saW5lLmM6MTM4NQorbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICDU2sS/x7DEv8K8OlxuIgorCisjOiBtZW1saW5lLmM6MTM4NworbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKKworIzogbWVtbGluZS5jOjEzOTEKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICDU2sS/wrwgIgorCisjOiBtZW1saW5lLmM6MTQwOQorbXNnaWQgIiAgICAgIC0tIG5vbmUgLS1cbiIKK21zZ3N0ciAiICAgICAgLS0gzt4gLS1cbiIKKworIzogbWVtbGluZS5jOjE0ODEKK21zZ2lkICIgICAgICAgICAgb3duZWQgYnk6ICIKK21zZ3N0ciAiICAgICAgICAgICAgy/nT0NXfOiAiCisKKyM6IG1lbWxpbmUuYzoxNDgzCittc2dpZCAiICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgIMjVxto6ICIKKworIzogbWVtbGluZS5jOjE0ODcgbWVtbGluZS5jOjM2ODAKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICDI1cbaOiAiCisKKyM6IG1lbWxpbmUuYzoxNTAzCittc2dpZCAiICAgICAgICAgW2Zyb20gVmltIHZlcnNpb24gMy4wXSIKK21zZ3N0ciAiICAgICAgICAgICAgICBbtNMgVmltILDmsb4gMy4wXSIKKworIzogbWVtbGluZS5jOjE1MDcKK21zZ2lkICIgICAgICAgICBbZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZV0iCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgW7K7z/EgVmltILXEvbu7u87EvP5dIgorCisjOiBtZW1saW5lLmM6MTUxMQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICAgICAgIM7EvP7D+zogIgorCisjOiBtZW1saW5lLmM6MTUyMworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgINDeuMS5/TogIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIllFUyIKK21zZ3N0ciAiysciCisKKyM6IG1lbWxpbmUuYzoxNTI0Cittc2dpZCAibm8iCittc2dzdHIgIrfxIgorCisjOiBtZW1saW5lLmM6MTUyOAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICB1c2VyIG5hbWU6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgINPDu6fD+zogIgorCisjOiBtZW1saW5lLmM6MTUzNQorbXNnaWQgIiAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIgICAgICDW97v6w/s6ICIKKworIzogbWVtbGluZS5jOjE1MzcKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICDW97v6w/s6ICIKKworIzogbWVtbGluZS5jOjE1NDMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgIL34s8wgSUQ6ICIKKworIzogbWVtbGluZS5jOjE1NDkKK21zZ2lkICIgKHN0aWxsIHJ1bm5pbmcpIgorbXNnc3RyICIgKNX91NrWtNDQKSIKKworIzogbWVtbGluZS5jOjE1NjEKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFuyu8Tc1NqxvrDmsb61xCBWaW0gyc/KudPDXSIKKworIzogbWVtbGluZS5jOjE1NjQKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbsrvE3NTasb67+snPyrnTw10iCisKKyM6IG1lbWxpbmUuYzoxNTY5Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSByZWFkXSIKK21zZ3N0ciAiICAgICAgICAgW7K7xNy2wcihXSIKKworIzogbWVtbGluZS5jOjE1NzMKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFuyu8TctPK/ql0iCisKKyM6IG1lbWxpbmUuYzoxNzYzCittc2dpZCAiRTMxMzogQ2Fubm90IHByZXNlcnZlLCB0aGVyZSBpcyBubyBzd2FwIGZpbGUiCittc2dzdHIgIkUzMTM6ILK7xNyxo8H0LCCyu8q508O9u7u7zsS8/iIKKworIzogbWVtbGluZS5jOjE4MTYKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAizsS8/tLRsaPB9CIKKworIzogbWVtbGluZS5jOjE4MTgKK21zZ2lkICJFMzE0OiBQcmVzZXJ2ZSBmYWlsZWQiCittc2dzdHIgIkUzMTQ6ILGjwfTKp7DcIgorCisjOiBtZW1saW5lLmM6MTg4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6ILTtzvO1xCBsbnVtOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxOTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDog1dKyu7W9tdogJWxkINDQIgorCisjOiBtZW1saW5lLmM6MjMwMworbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMyIKK21zZ3N0ciAiRTMxNzog1rjV67/pIGlkILTtzvMgMyIKKworIzogbWVtbGluZS5jOjIzODMKK21zZ2lkICJzdGFja19pZHggc2hvdWxkIGJlIDAiCittc2dzdHIgInN0YWNrX2lkeCDTprjDyscgMCIKKworIzogbWVtbGluZS5jOjI0NDUKK21zZ2lkICJFMzE4OiBVcGRhdGVkIHRvbyBtYW55IGJsb2Nrcz8iCittc2dzdHIgIkUzMTg6ILj80MLMq7bgv+k/IgorCisjOiBtZW1saW5lLmM6MjYwMgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzog1rjV67/pIGlkILTtzvMgNCIKKworIzogbWVtbGluZS5jOjI2MjkKK21zZ2lkICJkZWxldGVkIGJsb2NrIDE/IgorbXNnc3RyICLJvrP9v+kgMT8iCisKKyM6IG1lbWxpbmUuYzoyODI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjA6IENhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzIwOiDV0rK7tb212iAlbGQg0NAiCisKKyM6IG1lbWxpbmUuYzozMDcyCittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyIKK21zZ3N0ciAiRTMxNzog1rjV67/pIGlkILTtzvMiCisKKyM6IG1lbWxpbmUuYzozMDg4Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IM6qweMiCisKKyM6IG1lbWxpbmUuYzozMTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjog0NC6xbOss/a3ts6nOiAlbGQgs6y5/b3hzrIiCisKKyM6IG1lbWxpbmUuYzozMTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiC/6SAlbGQg0NDK/bTtzvMiCisKKyM6IG1lbWxpbmUuYzozMTcwCittc2dpZCAiU3RhY2sgc2l6ZSBpbmNyZWFzZXMiCittc2dzdHIgIrbR1bu089Ch1Pa80yIKKworIzogbWVtbGluZS5jOjMyMTYKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDIiCittc2dzdHIgIkUzMTc6INa41eu/6SBpZCC07SAyIgorCisjOiBtZW1saW5lLmM6MzY3MAorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTog16LS4iIKKworIzogbWVtbGluZS5jOjM2NzEKK21zZ2lkICIiCisiXG4iCisiRm91bmQgYSBzd2FwIGZpbGUgYnkgdGhlIG5hbWUgXCIiCittc2dzdHIgIiIKKyJcbiIKKyK3os/Wvbu7u87EvP4gXCIiCisKKyM6IG1lbWxpbmUuYzozNjc1Cittc2dpZCAiV2hpbGUgb3BlbmluZyBmaWxlIFwiIgorbXNnc3RyICK1sbTyv6rOxLz+yrEgXCIiCisKKyM6IG1lbWxpbmUuYzozNjg0Cittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgILHIvbu7u87EvP7QwiFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY4OAorbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSC/ycTc09DB7dK7uPazzNDy0rLU2rHgvK3NrNK7uPbOxLz+LlxuIgorIiAgICDI57n7ysfV4tH5o6zH69ei0uKyu9Kq0rvG8NC0yOujrLK7yLvE47XExazBpra8u+G4ttbutqvB96GjXG4iCisKKyM6IG1lbWxpbmUuYzozNjg5Cittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIM3Ls/ajrLvyyse8zND4seC8raGjXG4iCisKKyM6IG1lbWxpbmUuYzozNjkwCittc2dpZCAiIgorIlxuIgorIigyKSBBbiBlZGl0IHNlc3Npb24gZm9yIHRoaXMgZmlsZSBjcmFzaGVkLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDIpIMnP0ru0zrHgvK20y87EvP7KsbHAwKNcbiIKKworIzogbWVtbGluZS5jOjM2OTEKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICDI57n7ysfV4tH5LCDH69PDIFwiOnJlY292ZXJcIiC78iBcInZpbSAtciIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICC71ri00N64xMTayN0gKL340ruyvcu1w/fH67+0IFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNjk0Cittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIMjnufu4w7vWuLS1xLa80tG+rbvWuLTByywgx+vWsb3Tyb6z/bTLvbu7u87EvP4gXCIiCisKKyM6IG1lbWxpbmUuYzozNjk2Cittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIGF2b2lkIHRoaXMgbWVzc2FnZS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgINLUsdzD4tTZv7S1vbTL0MXPoi5cbiIKKworIzogbWVtbGluZS5jOjM3MTAgbWVtbGluZS5jOjM3MTQKK21zZ2lkICJTd2FwIGZpbGUgXCIiCittc2dzdHIgIr27u7vOxLz+IFwiIgorCisjOiBtZW1saW5lLmM6MzcxMSBtZW1saW5lLmM6MzcxNworbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIg0tG+rbTm1NrByyEiCisKKyM6IG1lbWxpbmUuYzozNzIwCittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSDXotLiIgorCisjOiBtZW1saW5lLmM6MzcyMgorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIr27u7vOxLz+0tG+rbTm1NohIgorCisjOiBtZW1saW5lLmM6MzcyNgorbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0IgorbXNnc3RyICIiCisi0tTWu7bBt73KvbTyv6ooJk8pXG4iCisi1rG907HgvK0oJkUpXG4iCisiu9a4tCgmUilcbiIKKyLNy7P2KCZRKSIKKworIzogbWVtbGluZS5jOjM3MjgKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdFxuIgorIiZEZWxldGUgaXQiCittc2dzdHIgIiIKKyLS1Na7tsG3vcq9tPK/qigmTylcbiIKKyLWsb3TseC8rSgmRSlcbiIKKyK71ri0KCZSKVxuIgorIs3Ls/YoJlEpXG4iCisiyb6z/b27u7vOxLz+KCZEKSIKKworIzogbWVtbGluZS5jOjM3ODEKK21zZ2lkICJFMzI2OiBUb28gbWFueSBzd2FwIGZpbGVzIGZvdW5kIgorbXNnc3RyICJFMzI2OiDV0rW9zKu24L27u7vOxLz+IgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogsr+33bLLtaXP7rK7ysfX07LLtaUiCisKKyM6IG1lbnUuYzo2NQorbXNnaWQgIkUzMjg6IE1lbnUgb25seSBleGlzdHMgaW4gYW5vdGhlciBtb2RlIgorbXNnc3RyICJFMzI4OiCyy7Wl1rvE3NTaxuTL/MSjyr3W0Mq508MiCisKKyM6IG1lbnUuYzo2NgorbXNnaWQgIkUzMjk6IE5vIG1lbnUgb2YgdGhhdCBuYW1lIgorbXNnc3RyICJFMzI5OiDDu9PQxMfR+bXEssu1pSIKKworIzogbWVudS5jOjUwMworbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6ILLLtaWyu8Tc1rjP8tfT0aG1pSIKKworIzogbWVudS5jOjU0MgorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiCyu8Tc1rG907DRssu1pc/uvNO1vbLLtaXM9dbQIgorCisjOiBtZW51LmM6NTQ4Cittc2dpZCAiRTMzMjogU2VwYXJhdG9yIGNhbm5vdCBiZSBwYXJ0IG9mIGEgbWVudSBwYXRoIgorbXNnc3RyICJFMzMyOiC31rj0z9+yu8Tcyseyy7WltcTSu7K/t9YiCisKKyMuIE5vdyB3ZSBoYXZlIGZvdW5kIHRoZSBtYXRjaGluZyBtZW51LCBhbmQgd2UgbGlzdCB0aGUgbWFwcGluZ3MKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogbWVudS5jOjEwNjMKK21zZ2lkICIiCisiXG4iCisiLS0tIE1lbnVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCyy7WlIC0tLSIKKworIzogbWVudS5jOjE5ODkKK21zZ2lkICJUZWFyIG9mZiB0aGlzIG1lbnUiCittc2dzdHIgIsfQz8K0y7LLtaUiCisKKyM6IG1lbnUuYzoyMDU0Cittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzogssu1pbHY0OjWuM/y0ru49rLLtaXP7iIKKworIzogbWVudS5jOjIwNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNDogTWVudSBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFMzM0OiBbssu1pV0g1dKyu7W9ICVzIgorCisjOiBtZW51LmM6MjE0MworIywgYy1mb3JtYXQKK21zZ2lkICJFMzM1OiBNZW51IG5vdCBkZWZpbmVkIGZvciAlcyBtb2RlIgorbXNnc3RyICJFMzM1OiAlcyDEo8q9zrS2qNLlssu1pSIKKworIzogbWVudS5jOjIxODEKK21zZ2lkICJFMzM2OiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzY6ILLLtaWx2NDo1rjP8tfTssu1pSIKKworIzogbWVudS5jOjIyMDIKK21zZ2lkICJFMzM3OiBNZW51IG5vdCBmb3VuZCAtIGNoZWNrIG1lbnUgbmFtZXMiCittc2dzdHIgIkUzMzc6INXSsru1vbLLtaUgLSDH67zssumyy7Wlw/uzxiIKKworIzogbWVzc2FnZS5jOjQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBkZXRlY3RlZCB3aGlsZSBwcm9jZXNzaW5nICVzOiIKK21zZ3N0ciAitKbA7SAlcyDKsbeiyfq07c7zOiIKKworIzogbWVzc2FnZS5jOjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICLQ0CAlNGxkOiIKKworIzogbWVzc2FnZS5jOjUyMworbXNnaWQgIltzdHJpbmcgdG9vIGxvbmddIgorbXNnc3RyICJb19a3+7SuzKuzpF0iCisKKyM6IG1lc3NhZ2UuYzo2NjkKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAivPLM5dbQzsTQxc+izqy7pNXfOiBXYW5nIEp1biA8anVud0B0dXJib2xpbnV4LmNvbS5jbj4iCisKKyM6IG1lc3NhZ2UuYzo4ODEKK21zZ2lkICJJbnRlcnJ1cHQ6ICIKK21zZ3N0ciAi0tHW0LbPOiAiCisKKyM6IG1lc3NhZ2UuYzo4ODQKK21zZ2lkICJIaXQgRU5URVIgdG8gY29udGludWUiCittc2dzdHIgIsfrsLQgRU5URVIgvMzQ+CIKKworIzogbWVzc2FnZS5jOjg4NgorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIsfrsLQgRU5URVIgu/LG5Mv8w/zB7rzM0PgiCisKKyM6IG1lc3NhZ2UuYzoxOTQwCittc2dpZCAiLS0gTW9yZSAtLSIKK21zZ3N0ciAiLS0guPy24CAtLSIKKworIzogbWVzc2FnZS5jOjE5NDMKK21zZ2lkICIgKFJFVC9CUzogbGluZSwgU1BBQ0UvYjogcGFnZSwgZC91OiBoYWxmIHBhZ2UsIHE6IHF1aXQpIgorbXNnc3RyICIgKFJFVC9CUzogz/LPwi/P8snP0rvQ0Cwgv9W48S9iOiDSu9KzLCBkL3U6ILDr0rMsIHE6IM3Ls/YpIgorCisjOiBtZXNzYWdlLmM6MTk0NAorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IM/yz8LSu9DQLCC/1bDXvPw6INK70rMsIGQ6ILDr0rMsIHE6IM3Ls/YpIgorCisjOiBtZXNzYWdlLmM6MjQxOSBtZXNzYWdlLmM6MjQzNAorbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICLOysziIgorCisjOiBtZXNzYWdlLmM6MjQyMQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlnKx1xuIgorIiZOt/EiCisKKyM6IG1lc3NhZ2UuYzoyNDM2Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlnKx1xuIgorIiZOt/FcbiIKKyImQ8ihz/siCisKKyM6IG1lc3NhZ2UuYzoyNDU0Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlnKx1xuIgorIiZOt/FcbiIKKyImQcirsr+xo7TmXG4iCisiJkTIq7K/sru05lxuIgorIiZDyKHP+yIKKworIzogbWVzc2FnZS5jOjI0OTQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICKxo7TmzsS8/rbUu7C/8iIKKworIzogbWVzc2FnZS5jOjI0OTYKK21zZ2lkICJPcGVuIEZpbGUgZGlhbG9nIgorbXNnc3RyICK08r+qzsS8/rbUu7C/8iIKKworIy4gVE9ETzogbm9uLUdVSSBmaWxlIHNlbGVjdG9yIGhlcmUKKyM6IG1lc3NhZ2UuYzoyNTQ3Cittc2dpZCAiRTMzODogU29ycnksIG5vIGZpbGUgYnJvd3NlciBpbiBjb25zb2xlIG1vZGUiCittc2dzdHIgIkUzMzg6INb3v9jMqChDb25zb2xlKcSjyr3KscO709DOxLz+5K/AwMb3KGZpbGUgYnJvd3NlcikiCisKKyM6IG1pc2MxLmM6MjQ0OQorbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6INei0uI6IMTj1f3U2tDeuMTSu7j21ru2wc7EvP4iCisKKyM6IG1pc2MxLmM6MjY3OAorbXNnaWQgIjEgbW9yZSBsaW5lIgorbXNnc3RyICK7udPQ0rvQ0CIKKworIzogbWlzYzEuYzoyNjgwCittc2dpZCAiMSBsaW5lIGxlc3MiCittc2dzdHIgIsnZ09rSu9DQIgorCisjOiBtaXNjMS5jOjI2ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiC7udPQICVsZCDQ0CIKKworIzogbWlzYzEuYzoyNjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAi1rvKoyAlbGQg0NAiCisKKyM6IG1pc2MxLmM6MjY5MAorbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKNLR1tC2zykiCisKKyM6IG1pc2MxLmM6NjI0NAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06ILGjwfTOxLz+1tAuLi5cbiIKKworIy4gY2xvc2UgYWxsIG1lbWZpbGVzLCB3aXRob3V0IGRlbGV0aW5nCisjOiBtaXNjMS5jOjYyNTQKK21zZ2lkICJWaW06IEZpbmlzaGVkLlxuIgorbXNnc3RyICJWaW06IL3hyvguXG4iCisKKyM6IG1pc2MyLmM6NjQ0IG1pc2MyLmM6NjYwCittc2dpZCAiRVJST1I6ICIKK21zZ3N0ciAitO3O8zogIgorCisjOiBtaXNjMi5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltieXRlc10gyKuyvyBhbGxvYy1mcmVlZCAlbHUtJWx1LCDKudPD1tAgJWx1LCBwZWFrIMq508MgJWx1XG4iCisKKyM6IG1pc2MyLmM6NjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJbY2FsbHNdIHRvdGFsIHJlL21hbGxvYygpJ3MgJWx1LCB0b3RhbCBmcmVlKCkncyAlbHVcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlu199PDXSDIq7K/IHJlL21hbGxvYygpOiAlbHUsIMirsr8gZnJlZSgpJzogJWx1XG4iCisiXG4iCisKKyM6IG1pc2MyLmM6NzIxCittc2dpZCAiRTM0MDogTGluZSBpcyBiZWNvbWluZyB0b28gbG9uZyIKK21zZ3N0ciAiRTM0MDogtMvQ0Ln9s6QiCisKKyM6IG1pc2MyLmM6NzY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDE6IEludGVybmFsIGVycm9yOiBsYWxsb2MoJWxkLCApIgorbXNnc3RyICJFMzQxOiDE2rK/tO3O8zogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IMTatOayu9fjISAos6LK1MXk1sMgJWx1INfWvdrX6SkiCisKKyM6IG1pc2MyLmM6MjUwOAorIywgYy1mb3JtYXQKK21zZ2lkICJDYWxsaW5nIHNoZWxsIHRvIGV4ZWN1dGU6IFwiJXNcIiIKK21zZ3N0ciAitffTwyBzaGVsbCDWtNDQOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6MjcwMyBtaXNjMi5jOjUxNDIgb3B0aW9uLmM6NDU4NAorbXNnaWQgIk1pc3NpbmcgY29sb24iCittc2dzdHIgIsixydnDsLrFIgorCisjOiBtaXNjMi5jOjI3MDUgbWlzYzIuYzoyNzMyCittc2dpZCAiSWxsZWdhbCBtb2RlIgorbXNnc3RyICKyu9X9yLe1xMSjyr0iCisKKyM6IG1pc2MyLmM6Mjc3MQorbXNnaWQgIklsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAisrvV/ci3tcTK87Hq0M7XtCIKKworIzogbWlzYzIuYzoyODExIG1pc2MyLmM6NTE2MgorbXNnaWQgImRpZ2l0IGV4cGVjdGVkIgorbXNnc3RyICLTprjDzqrK/dfWIgorCisjOiBtaXNjMi5jOjI4MTYKK21zZ2lkICJJbGxlZ2FsIHBlcmNlbnRhZ2UiCittc2dzdHIgIrK71f3It7XEsNm31rHIIgorCisjOiBtaXNjMi5jOjMxMjAKK21zZ2lkICJFbnRlciBlbmNyeXB0aW9uIGtleTogIgorbXNnc3RyICLK5Mjrw9zC6zogIgorCisjOiBtaXNjMi5jOjMxMjEKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICLH69TZyuTI69K7tM46ICIKKworIzogbWlzYzIuYzozMTMxCittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIsG9tM7K5Mjrw9zC67K7zawhIgorCisjOiBtaXNjMi5jOjM2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIkUzNDM6ILK71f3It7XEwre+tjogJyoqW251bWJlcl0nILHY0OjSqtTawre+tr3hzrK78tKqvdPW+CAnJXMnIgorCisjOiBtaXNjMi5jOjQ4OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogY2RwYXRoINbQw7vT0MS/wrwgXCIlc1wiIgorCisjOiBtaXNjMi5jOjQ5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiDU2sK3vrbW0NXSsru1vc7EvP4gXCIlc1wiIgorCisjOiBtaXNjMi5jOjQ5MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0Njog1NrCt7621tDV0rK7tb24/LbgtcTOxLz+IFwiJXNcIiIKKworIzogbWlzYzIuYzo0OTExCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0Nzog1NrCt7621tDV0rK7tb24/LbgtcTOxLz+IFwiJXNcIiIKKworIzogbWlzYzIuYzo1MTU0Cittc2dpZCAiSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIrK71f3It7XE1+m8/iIKKworIzogbm9ybWFsLmM6Mjc5OAorbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgItei0uI6IMTjtcTW1bbLsrvE3M/Uyr6438HBtsgiCisKKyM6IG5vcm1hbC5jOjI5OTMKK21zZ2lkICJFMzQ4OiBObyBzdHJpbmcgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ4OiC54rHqtKbDu9PQ19a3+7SuIgorCisjOiBub3JtYWwuYzoyOTk1Cittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6ILniseq0psO709DKtrHw19YiCisKKyM6IG5vcm1hbC5jOjQxNjAKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogsrvE3NTaxL/HsLXEICdmb2xkbWV0aG9kJyDPwsm+s/0gZm9sZCIKKworIzogb3BzLmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAi0rvQ0CAlcyC5/SDSu7TOIgorCisjOiBvcHMuYzoyNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgItK70NAgJXMguf0gJWQgtM4iCisKKyM6IG9wcy5jOjI3OAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCDQ0CAlcyC5/SDSu7TOIgorCisjOiBvcHMuYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCDQ0CAlcyC5/SAlZCC0ziIKKworIzogb3BzLmM6NjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICLKtrHwICVsZCDQ0C4uLiIKKworIzogb3BzLmM6Njg4Cittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAi0rvQ0NLRyrax8CIKKworIzogb3BzLmM6NjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgItLRyrax8CAlbGQg0NAiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNTI4Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIrK7xNy4tNbGOyDWsb3Tyb6z/SIKKworIzogb3BzLmM6MjAxOAorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIgMSDQ0CB+ZWQiCisKKyM6IG9wcy5jOjIwMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiAlbGQg0NAgfmVkIgorCisjOiBvcHMuYzoyMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICLKzbfFICVsZCDQ0NbQIgorCisjOiBvcHMuYzoyNjU4Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAi0tG4tNbGIDEg0NAiCisKKyM6IG9wcy5jOjI2NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAi0tG4tNbGICVsZCDQ0CIKKworIzogb3BzLmM6MjkxNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzUzOiBOb3RoaW5nIGluIHJlZ2lzdGVyICVzIgorbXNnc3RyICJFMzUzOiC8xLTmxvcgJXMgwO/Du9PQtqvO9yIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNDU0Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tILzEtObG9yAtLS0iCisKKyM6IG9wcy5jOjQ1NjUKK21zZ2lkICJJbGxlZ2FsIHJlZ2lzdGVyIG5hbWUiCittc2dzdHIgIrK71f3It7XEvMS05sb3w/uzxiIKKworIzogb3BzLmM6NDY0NQorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgvMS05sb3OlxuIgorCisjOiBvcHMuYzo0NjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAizrTWqrXE16Ky4cDg0M06ICVkIgorCisjOiBvcHMuYzo1MDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogvMS05sb3w/uzxrTtzvM6ICclcyciCisKKyM6IG9wcy5jOjUzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIMHQOyAiCisKKyM6IG9wcy5jOjU0MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VsZWN0ZWQgJXMlbGQgb2YgJWxkIExpbmVzOyAlbGQgb2YgJWxkIFdvcmRzOyAlbGQgb2YgJWxkIEJ5dGVzIgorbXNnc3RyICLRodTxwcsgJXMlbGQvJWxkINDQOyAlbGQvJWxkINfWKFdvcmQpOyAlbGQvJWxkINfWt/soQnl0ZXMpIgorCisjOiBvcHMuYzo1NDE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAiwdAgJXMvJXM7INDQICVsZC8lbGQ7INfWKFdvcmQpICVsZC8lbGQ7INfWt/soQnl0ZSkgJWxkLyVsZCIKKworIzogb3BzLmM6NTQyNworIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgZm9yIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE5ODkKK21zZ2lkICJUaGFua3MgZm9yIGZseWluZyBWaW0iCittc2dzdHIgIrjQ0LvE+tGh1PEgVmltIgorCisjOiBvcHRpb24uYzozMTc1Cittc2dpZCAiT3B0aW9uIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIrK71qez1rjD0aHP7iIKKworIzogb3B0aW9uLmM6MzIwMAorbXNnaWQgIk5vdCBhbGxvd2VkIGluIGEgbW9kZWxpbmUiCittc2dzdHIgIrK7xNzU2sSjyr3Q0MDvs/bP1iIKKworIzogb3B0aW9uLmM6MzI1NgorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHS1scewyejWwzogIgorCisjOiBvcHRpb24uYzozMzk1Cittc2dpZCAiTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIj0guvPQ6NKq09DK/dfWIgorCisjOiBvcHRpb24uYzozNzAyIG9wdGlvbi5jOjQzMDkKK21zZ2lkICJOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiVGVybWNhcCDA78Pm1dKyu7W9IgorCisjOiBvcHRpb24uYzozNzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIrK71f3It7XE19a3+yA8JXM+IgorCisjOiBvcHRpb24uYzo0Mjk0IG9wdGlvbi5jOjU0OTcKK21zZ2lkICJOb3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICLV4sDvsru/ycq508MiCisKKyM6IG9wdGlvbi5jOjQzMDEKK21zZ2lkICJDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIrK7xNzJ6LaoICd0ZXJtJyDOqr/V19a3+7SuIgorCisjOiBvcHRpb24uYzo0MzA0Cittc2dpZCAiQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAi1NrNvNDNvefD5tbQsrvE3MfQu7vW1bbLIgorCisjOiBvcHRpb24uYzo0MzA2Cittc2dpZCAiVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIsrkyOsgXCI6Z3VpXCIgwLTG9LavzbzQzr3nw+YiCisKKyM6IG9wdGlvbi5jOjQzMjcKK21zZ2lkICInYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICInYmFja3VwZXh0JyC4+iAncGF0Y2htb2RlJyDKx9K70fm1xCIKKworIzogb3B0aW9uLmM6NDU4NgorbXNnaWQgIlplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiweOzpLbI19a3+7SuIgorCisjOiBvcHRpb24uYzo0NjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3NpbmcgbnVtYmVyIGFmdGVyIDwlcz4iCittc2dzdHIgIjwlcz4guvPIscnZyv3X1iIKKworIzogb3B0aW9uLmM6NDY2OAorbXNnaWQgIk1pc3NpbmcgY29tbWEiCittc2dzdHIgIsixydm2urrFIgorCisjOiBvcHRpb24uYzo0Njc1Cittc2dpZCAiTXVzdCBzcGVjaWZ5IGEgJyB2YWx1ZSIKK21zZ3N0ciAisdjQ6Na4tqjSu7j2ICcg1rUiCisKKyM6IG9wdGlvbi5jOjQ3MTUKK21zZ2lkICJjb250YWlucyB1bnByaW50YWJsZSBjaGFyYWN0ZXIiCittc2dzdHIgIrD8uqyyu8Tcz9TKvrXE19a3+yIKKworIzogb3B0aW9uLmM6NDcyOAorbXNnaWQgIkludmFsaWQgZm9udChzKSIKK21zZ3N0ciAisrvV/ci3tcTX1szlIgorCisjOiBvcHRpb24uYzo0NzM0Cittc2dpZCAiY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIrK7xNzKudPD19bM5byvKEZvbnRzZXQpIgorCisjOiBvcHRpb24uYzo0NzM2Cittc2dpZCAiSW52YWxpZCBmb250c2V0IgorbXNnc3RyICKyu9X9yLe1xNfWzOW8ryhGb250c2V0KSIKKworIzogb3B0aW9uLmM6NDc0MworbXNnaWQgImNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIrK7xNzKudPDyei2qLXEv+3X1szlKFdpZGVmb250KSIKKworIzogb3B0aW9uLmM6NDc0NQorbXNnaWQgIkludmFsaWQgd2lkZSBmb250IgorbXNnc3RyICKyu9X9yLe1xL/t19bM5ShXaWRlZm9udCkiCisKKyM6IG9wdGlvbi5jOjUwMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiPCVjPiC689PQsrvV/ci3tcTX1rf7IgorCisjOiBvcHRpb24uYzo1MDk3Cittc2dpZCAiY29tbWEgcmVxdWlyZWQiCittc2dzdHIgItDo0qq2urrFIgorCisjOiBvcHRpb24uYzo1MTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIidjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIidjb21tZW50c3RyaW5nJyCx2NDoyse/1bDXu/Kw/LqsICVzIgorCisjOiBvcHRpb24uYzo1MTUzCittc2dpZCAiTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAisrvWp7PWyvOx6iIKKworIzogb3B0aW9uLmM6NTM5OQorbXNnaWQgIlVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIsO709C94cr4tcSx7bTvyr06ICIKKworIzogb3B0aW9uLmM6NTQwMworbXNnaWQgInRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICLMq7bgttTP8yIKKworIzogb3B0aW9uLmM6NTQwNQorbXNnaWQgInVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICKyu7bUs8a1xNfpIgorCisjOiBvcHRpb24uYzo1NjIwCittc2dpZCAiQSBwcmV2aWV3IHdpbmRvdyBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAi1KTAwLSwv9rS0b6ttObU2sHLIgorCisjOiBvcHRpb24uYzo1ODgxIG9wdGlvbi5jOjU5MTAKK21zZ2lkICInd2luaGVpZ2h0JyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW5oZWlnaHQnIgorbXNnc3RyICInd2luaGVpZ2h0JyCyu8TcscggJ3dpbm1pbmhlaWdodCcguPzJ2SIKKworIzogb3B0aW9uLmM6NTkyNiBvcHRpb24uYzo1OTQ1Cittc2dpZCAiJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIid3aW53aWR0aCcgsrvE3LHIICd3aW5taW53aWR0aCcguPzJ2SIKKworIzogb3B0aW9uLmM6NjA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGxpbmVzIgorbXNnc3RyICLWwcnZ0OjSqiAlZCDQ0CIKKworIzogb3B0aW9uLmM6NjA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgItbBydnQ6NKqICVkIMHQIgorCisjOiBvcHRpb24uYzo2MzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTU6IFVua25vd24gb3B0aW9uOiAlcyIKK21zZ3N0ciAiRTM1NTogsrvV/ci3tcTRoc/uOiAlcyIKKworIzogb3B0aW9uLmM6NjUwMAorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwgY29kZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tINbVtsux4MLrIC0tLSIKKworIzogb3B0aW9uLmM6NjUwMgorbXNnaWQgIiIKKyJcbiIKKyItLS0gR2xvYmFsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIMirvtYg0aHP7ta1IC0tLSIKKworIzogb3B0aW9uLmM6NjUwNAorbXNnaWQgIiIKKyJcbiIKKyItLS0gTG9jYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gsb612CDRoc/u1rUgLS0tIgorCisjOiBvcHRpb24uYzo2NTA2Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDRoc/uIC0tLSIKKworIzogb3B0aW9uLmM6NzE5NgorbXNnaWQgIkUzNTY6IGdldF92YXJwIEVSUk9SIgorbXNnc3RyICJFMzU2OiBnZXRfdmFycCC07c7zIgorCisjOiBvcHRpb24uYzo4MTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTc6ICdsYW5nbWFwJzogTWF0Y2hpbmcgY2hhcmFjdGVyIG1pc3NpbmcgZm9yICVzIgorbXNnc3RyICJFMzU3OiAnbGFuZ21hcCc6INXSsru1vSAlcyC21NOmtcTX1rf7IgorCisjOiBvcHRpb24uYzo4MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6ILfWusW689PQtuDT4LXE19a3+zogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjczCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICKyu8TctPK/qiIKKworIzogb3NfYW1pZ2EuYzozMDcKK21zZ2lkICJWSU06IENhbid0IG9wZW4gd2luZG93IVxuIgorbXNnc3RyICJWSU06ILK7xNy08r+qtLC/2iFcbiIKKworIzogb3NfYW1pZ2EuYzozMjkKK21zZ2lkICJOZWVkIEFtaWdhZG9zIHZlcnNpb24gMi4wNCBvciBsYXRlclxuIgorbXNnc3RyICLQ6NKqIEFtaWdhZG9zILDmsb4gMi4wNCDS1MnPXG4iCisKKyM6IG9zX2FtaWdhLmM6MzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5lZWQgJXMgdmVyc2lvbiAlbGRcbiIKK21zZ3N0ciAi0OjSqiAlcyCw5rG+ICVsZFxuIgorCisjOiBvc19hbWlnYS5jOjQwNworbXNnaWQgIkNhbm5vdCBvcGVuIE5JTDpcbiIKK21zZ3N0ciAisrvE3LTyv6ogTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQxOAorbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICKyu8TctLS9qCAiCisKKyM6IG9zX2FtaWdhLmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbSBleGl0aW5nIHdpdGggJWRcbiIKK21zZ3N0ciAiVmltILe1u9jWtTogJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICKyu8Tcx9C7u9b3v9jMqChjb25zb2xlKcSjyr0gIT9cbiIKKworIzogb3NfYW1pZ2EuYzo5Mzggb3NfbWFjLmM6MTE2OCBvc19tc3dpbi5jOjYxOSBvc19yaXNjb3MuYzo3Mjggb3NfdW5peC5jOjI3MjYKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6ILK71qez1snotqjGwcS7xKPKvSIKKworIzogb3NfYW1pZ2EuYzo5OTQKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiCyu8rH1ve/2MyoKGNvbnNvbGUpPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MgorbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiCyu8Tc08MgLWYg0aHP7ta00NAgc2hlbGwiCisKKyM6IG9zX2FtaWdhLmM6MTE4MyBvc19hbWlnYS5jOjEyNzMKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIrK7xNzWtNDQICIKKworIzogb3NfYW1pZ2EuYzoxMTg2IG9zX2FtaWdhLmM6MTI4MworbXNnaWQgInNoZWxsICIKK21zZ3N0ciAic2hlbGwgIgorCisjOiBvc19hbWlnYS5jOjEyMDYgb3NfYW1pZ2EuYzoxMzA4Cittc2dpZCAiIHJldHVybmVkXG4iCittc2dzdHIgIiDS0be1u9hcbiIKKworIzogb3NfYW1pZ2EuYzoxNDQ4Cittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIkFOQ0hPUl9CVUZfU0laRSDMq9ChIgorCisjOiBvc19hbWlnYS5jOjE0NTIKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkkvTyC07c7zIgorCisjOiBvc19tc3dpbi5jOjUwMworbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIiCisKKyM6IG9zX21zd2luLmM6NTk0Cittc2dpZCAiJ2NvbHVtbnMnIGlzIG5vdCA4MCwgY2Fubm90IGV4ZWN1dGUgZXh0ZXJuYWwgY29tbWFuZHMiCittc2dzdHIgIidjb2x1bW5zJyCyu8rHIDgwLCCyu8Tc1rTQ0M3isr/D/MHuIgorCisjOiBvc19tc3dpbi5jOjcwNiBvc191bml4LmM6NDk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogtffTw7qvyv2/4iBcIiVzXCIoKSDKp7DcIgorCisjOiBvc19tc3dpbi5jOjEzNDAKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6ILK7xNzRodTxtMu08tOhu/oiCisKKyM6IG9zX21zd2luLmM6MTM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJ0byAlcyBvbiAlcyIKK21zZ3N0ciAitNMgJXMgtb0gJXMiCisKKyM6IG9zX21zd2luLmM6MTQ0OSBvc19tc3dpbi5jOjE0NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiC08tOhtO3O8zogJXMiCisKKyM6IG9zX21zd2luLmM6MTQ1OQorbXNnaWQgIlVua25vd24iCittc2dzdHIgIs601qoiCisKKyM6IG9zX21zd2luLmM6MTQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICLS0bTy06E6ICclcyciCisKKyM6IG9zX21zd2luLmM6MjU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDog19a3+7yvIFwiJXNcIiCyu8TcttTTptfWzOVcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MjU1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiCyu9X9yLe1xNfWt/sgJyVjJyCz9s/W1NrX1szlw/uzxiBcIiVzXCIgxNoiCisKKyM6IG9zX3Jpc2Nvcy5jOjEyMjcKK21zZ2lkICJFMzY2OiBJbnZhbGlkICdvc2ZpbGV0eXBlJyBvcHRpb24gLSB1c2luZyBUZXh0IgorbXNnc3RyICJFMzY2OiCyu9X9yLe1xCAnZmlsZXR5cGUnINGhz+4gLSDKudPDtL/OxNfWxKPKvSIKKworIzogb3NfdW5peC5jOjgwMAorbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IMur1tjQxbrFLCDNy7P21tBcbiIKKworIzogb3NfdW5peC5jOjgwNgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsICVzXG4iCittc2dzdHIgIlZpbTogQ1ZpbTogwLm92LW90MW6xShzaWduYWwpICVzXG4iCisKKyM6IG9zX3VuaXguYzo4MDkKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTogwLm92LW91sLD/LXE0MW6xShkZWFkbHkgc2lnbmFsZSlcbiIKKworIzogb3NfdW5peC5jOjEwNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRvb2sgJWxkIG1zZWMiCittc2dzdHIgIrTyv6ogWCBXaW5kb3cg08PKsSAlbGQgw+siCisKKyM6IG9zX3VuaXguYzoxMDkwCittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZpbTogWCC07c7zXG4iCisKKyM6IG9zX3VuaXguYzoxMTU3Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAisuLK1CBYIFdpbmRvdyDKp7DcIgorCisjOiBvc191bml4LmM6MTMwMQorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIrTyv6ogWCBXaW5kb3cgs6zKsSIKKworIzogb3NfdW5peC5jOjI4OTkgb3NfdW5peC5jOjM0ODMKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisisrvE3Na00NAgc2hlbGwiCisKKyM6IG9zX3VuaXguYzoyOTQ0Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyKyu8Tc1rTQ0CBzaGVsbCBzaFxuIgorCisjOiBvc191bml4LmM6Mjk0OCBvc191bml4LmM6MzQ4OQorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJTaGVsbCDS0be1u9giCisKKyM6IG9zX3VuaXguYzozMDgyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIrK7xNy9qMGiudy1wFxuIgorCisjOiBvc191bml4LmM6MzA5NworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisisrvE3CBmb3JrXG4iCisKKyM6IG9zX3VuaXguYzozNDk2Cittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiw/zB7tLRveHK+FxuIgorCisjOiBvc191bml4LmM6NDk5MworbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIrTyv6ogWCBXaW5kb3cgyqew3CIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAi1NrQ0LrFICIKKworIzogb3NfdzMyZXhlLmM6MTY5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAisrvE3LzT1NggdmltMzIuZGxso6EiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIlZJTSC07c7zIgorCisjOiBvc193MzJleGUuYzoxNzkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICKyu8Tc0N7V/bqvyv3WuNXrtb0gRExMISIKKworIzogb3Nfd2luMTYuYzo1Nzggb3Nfd2luMzIuYzozMDE5CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJTaGVsbCC3tbvY1rUgJWQiCisKKyM6IG9zX3dpbjMyLmM6MjQ4OQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IMC5vdi1vSAlcyDKwrz+XG4iCisKKyM6IG9zX3dpbjMyLmM6MjQ5MQorbXNnaWQgImNsb3NlIgorbXNnc3RyICK52LHVIgorCisjOiBvc193aW4zMi5jOjI0OTMKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIteiz/siCisKKyM6IG9zX3dpbjMyLmM6MjQ5NAorbXNnaWQgInNodXRkb3duIgorbXNnc3RyICK52Lv6IgorCisjOiBvc193aW4zMi5jOjI5NzUKK21zZ2lkICJFMzcxOiBDb21tYW5kIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTM3MTog1dKyu7W9w/zB7iIKKworIzogb3Nfd2luMzIuYzoyOTg4Cittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisi1NrE47XEICRQQVRIINbQ1dKyu7W9IFZJTVJVTi5FWEUuXG4iCisizeKyv8P8we7WtNDQzeqxz7rzvauyu7vh1N3Noy5cbiIKKyK9+NK7sr3LtcP3x+vWtNDQIDpoZWxwIHdpbjMyLXZpbXJ1biAiCisKKyM6IG9zX3dpbjMyLmM6Mjk5MQorbXNnaWQgIlZpbSBXYXJuaW5nIgorbXNnc3RyICJWaW0gvq+45iIKKworIzogcXVpY2tmaXguYzoyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzcyOiC48cq9u6/X1rf7tK7A79PQzKu24CAlJSVjICIKKworIzogcXVpY2tmaXguYzoyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6ILjxyr27r9fWt/u0rrK706a4w7P2z9YgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6MzQ4Cittc2dpZCAiRTM3NDogTWlzc2luZyBdIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzQ6ILjxyr27r9fWt/u0rsDvydnByyBdIgorCisjOiBxdWlja2ZpeC5jOjM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc1OiBVbnN1cHBvcnRlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzU6ILjxyr27r9fWt/u0rsDv09Cyu9ans9a1xCAlJSVjICIKKworIzogcXVpY2tmaXguYzozODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiC48cq9u6/X1rf7tK6/qs23wO/T0LK71f3It7XEICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NzoguPHKvbuv19a3+7SuwO/T0LK71f3It7XEICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjQxNAorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogJ2Vycm9yZm9ybWF0JyDOtMnotqgiCisKKyM6IHF1aWNrZml4LmM6NTIwCittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTog1dKyu7W9xL/CvMP7s8a78srHv9W1xMS/wrzD+7PGIgorCisjOiBxdWlja2ZpeC5jOjkzMQorbXNnaWQgIk5vIG1vcmUgaXRlbXMiCittc2dzdHIgIsO709DG5Mv8ttTP8yIKKworIzogcXVpY2tmaXguYzoxMTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCAvICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMTU0Cittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKNDQ0tHJvrP9KSIKKworIzogcXVpY2tmaXguYzoxMzYwCittc2dpZCAiRTM4MDogQXQgYm90dG9tIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgwOiBRdWlja2ZpeCC20dW7veHOsiIKKworIzogcXVpY2tmaXguYzoxMzY5Cittc2dpZCAiRTM4MTogQXQgdG9wIG9mIHF1aWNrZml4IHN0YWNrIgorbXNnc3RyICJFMzgxOiBRdWlja2ZpeCC20dW7tqW2yyIKKworIzogcXVpY2tmaXguYzoxMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAitO3O88HQse0gJWQvJWQ7ILmy09AgJWQgz+607c7zIgorCisjOiBxdWlja2ZpeC5jOjE4NDIKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiCyu8Tc0LTI66OsJ2J1ZnR5cGUnINGhz+7S0cnotqgiCisKKyM6IHJlZ2V4cC5jOjgwMQorbXNnaWQgIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciCittc2dzdHIgIkUzMzk6IMP719bMq7OkIgorCisjOiByZWdleHAuYzoxMzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiCzste0ICVzKiIKKworIzogcmVnZXhwLmM6MTMxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6ILOy17QgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjQ6ICVzJWMgZm9sbG93cyBub3RoaW5nIgorbXNnc3RyICJFNjQ6ICVzJWMgw7vT0L3TtqvO9yIKKworIzogcmVnZXhwLmM6MjQ2OQorIywgYy1mb3JtYXQKK21zZ2lkICJTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIKK21zZ3N0ciAi0++3qLTtzvM6ICVzey4uLn0iCisKKyM6IHJlZ2V4cC5jOjI3MTYKK21zZ2lkICJFMzYxOiBDcmFzaCBpbnRlcmNlcHRlZDsgcmVnZXhwIHRvbyBjb21wbGV4PyIKK21zZ3N0ciAiRTM2MTogsrvE3Na00NA7IHJlZ3VsYXIgZXhwcmVzc2lvbiDMq7i01NM/IgorCisjOiByZWdleHAuYzoyODUxCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiByZWd1bGFyIGV4cHJlc3Npb24g1OyzybbR1bvTw7nitcS07c7zIgorCisjOiByZWdleHAuYzozMDg3Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAizeKyv7f7us86XG4iCisKKyM6IHNjcmVlbi5jOjIwNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0tJTNsZCBsaW5lcyBmb2xkZWQgIgorbXNnc3RyICIrLS3S0SBmb2xkICUzbGQg0NAiCisKKyM6IHNjcmVlbi5jOjc0MTEKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLczmu7siCisKKyM6IHNjcmVlbi5jOjc0MTUKK21zZ2lkICIgUkVQTEFDRSIKK21zZ3N0ciAiIMzmu7siCisKKyM6IHNjcmVlbi5jOjc0MjAKK21zZ2lkICIgUkVWRVJTRSIKK21zZ3N0ciAiILe016oiCisKKyM6IHNjcmVlbi5jOjc0MjIKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIgsuXI6yIKKworIzogc2NyZWVuLmM6NzQyNQorbXNnaWQgIiAoaW5zZXJ0KSIKK21zZ3N0ciAiICiy5cjrKSIKKworIzogc2NyZWVuLmM6NzQyNworbXNnaWQgIiAocmVwbGFjZSkiCittc2dzdHIgIiAozOa7uykiCisKKyM6IHNjcmVlbi5jOjc0MjkKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2Lczmu7spIgorCisjOiBzY3JlZW4uYzo3NDMyCittc2dpZCAiIEhlYnJldyIKK21zZ3N0ciAiIM+jsq7AsyIKKworIzogc2NyZWVuLmM6NzQ0MAorbXNnaWQgIiAobGFuZykiCittc2dzdHIgIiAo0+/R1CkiCisKKyM6IHNjcmVlbi5jOjc0NDMKK21zZ2lkICIgKHBhc3RlKSIKK21zZ3N0ciAiICjVs8z7KSIKKworIzogc2NyZWVuLmM6NzQ0OQorbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiDRocihIgorCisjOiBzY3JlZW4uYzo3NDUxCittc2dpZCAiIFZJU1VBTCIKK21zZ3N0ciAiIL/JytMiCisKKyM6IHNjcmVlbi5jOjc0NTMKK21zZ2lkICIgQkxPQ0siCittc2dzdHIgIiC/6SIKKworIzogc2NyZWVuLmM6NzQ1NQorbXNnaWQgIiBMSU5FIgorbXNnc3RyICIg0NAiCisKKyM6IHNjcmVlbi5jOjc0Njggc2NyZWVuLmM6NzUyMgorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAivMfCvNbQIgorCisjOiBzZWFyY2guYzozNgorbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAi0tGy6dXStb3OxLz+v6rNt6O71Nm0073hzrK8zND4sunV0iIKKworIzogc2VhcmNoLmM6MzcKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgItLRsunV0rW9zsS8/r3hzrKju9TZtNO/qs23vMzQ+LLp1dIiCisKKyM6IHNlYXJjaC5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgorbXNnc3RyICJFMzgzOiC07c7ztcSy6dXS19a3+7SuOiAlcyIKKworIzogc2VhcmNoLmM6NzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDog0tGy6dXStb3OxLz+v6rNt8jU1dKyu7W9ICVzIgorCisjOiBzZWFyY2guYzo3NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiDS0bLp1dK1vc7EvP694c6yyNTV0rK7tb0gJXMiCisKKyM6IHNlYXJjaC5jOjExMDcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6INTaICc7JyC688Pm06a4w9PQICc/JyC78iAnLyciCisKKyM6IHNlYXJjaC5jOjM0NzYKK21zZ2lkICIgKGluY2x1ZGVzIHByZXZpb3VzbHkgbGlzdGVkIG1hdGNoKSIKK21zZ3N0ciAiICiw/MCoyc+0zsHQs/a3+7rPz+4pIgorCisjLiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUKKyM6IHNlYXJjaC5jOjM0OTYKK21zZ2lkICItLS0gSW5jbHVkZWQgZmlsZXMgIgorbXNnc3RyICItLS0gsPy6rM7EvP4gIgorCisjOiBzZWFyY2guYzozNDk4Cittc2dpZCAibm90IGZvdW5kICIKK21zZ3N0ciAi1dKyu7W9ICIKKworIzogc2VhcmNoLmM6MzQ5OQorbXNnaWQgImluIHBhdGggLS0tXG4iCittc2dzdHIgItTawre+tiAtLS1cbiIKKworIzogc2VhcmNoLmM6MzUzOAorbXNnaWQgIiAgKEFscmVhZHkgbGlzdGVkKSIKK21zZ3N0ciAiICAo0tHB0LP2KSIKKworIzogc2VhcmNoLmM6MzU0MAorbXNnaWQgIiAgTk9UIEZPVU5EIgorbXNnc3RyICIgINXSsru1vSIKKworIzogc2VhcmNoLmM6MzU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIKK21zZ3N0ciAisunV0rD8uqzOxLz+OiAlcyIKKworIzogc2VhcmNoLmM6MzgxMAorbXNnaWQgIkUzODc6IE1hdGNoIGlzIG9uIGN1cnJlbnQgbGluZSIKK21zZ3N0ciAiRTM4NzogtbHHsNDQxqXF5CIKKworIzogc2VhcmNoLmM6Mzk1MAorbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICLL+dPQsPy6rM7EvP62vNLR1dK1vSIKKworIzogc2VhcmNoLmM6Mzk1MgorbXNnaWQgIk5vIGluY2x1ZGVkIGZpbGVzIgorbXNnc3RyICLDu9PQsPy6rM7EvP4iCisKKyM6IHNlYXJjaC5jOjM5NjgKK21zZ2lkICJFMzg4OiBDb3VsZG4ndCBmaW5kIGRlZmluaXRpb24iCittc2dzdHIgIkUzODg6INXSsru1vbao0uUiCisKKyM6IHNlYXJjaC5jOjM5NzAKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6INXSsru1vSBwYXR0ZXJuIgorCisjOiBzeW50YXguYzoyOTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiCyzsr9srvV/ci3OiAlcyIKKworIzogc3ludGF4LmM6MzE2NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIKK21zZ3N0ciAiRTM5MTogzt60y9Pvt6ggY2x1c3RlcjogXCIlc1wiIgorCisjOiBzeW50YXguYzozMzMxCittc2dpZCAiTm8gU3ludGF4IGl0ZW1zIGRlZmluZWQgZm9yIHRoaXMgYnVmZmVyIgorbXNnc3RyICLV4rj2u7qz5cf4w7vT0Lao0uXIzrrO0++3qM/uIgorCisjOiBzeW50YXguYzozMzM5Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJDt+e48deiys3NrLK91tAiCisKKyM6IHN5bnRheC5jOjMzNDcKK21zZ2lkICJubyBzeW5jaW5nIgorbXNnc3RyICLDu9PQzayyvSIKKworIzogc3ludGF4LmM6MzM1MAorbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAizayyvb+qyrwiCisKKyM6IHN5bnRheC5jOjMzNTIgc3ludGF4LmM6MzQyMQorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgItDQusWzrLP2t7bOpyIKKworIzogc3ludGF4LmM6MzM1NgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tINPvt6jNrLK9z+7EvyAoU3ludGF4IHN5bmMgaXRlbXMpIC0tLSIKKworIzogc3ludGF4LmM6MzM1OQorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisizayyvdbQOiIKKworIzogc3ludGF4LmM6MzM2NAorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDT77eoz+7EvyAtLS0iCisKKyM6IHN5bnRheC5jOjMzODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MjogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTI6IM7etMvT77eoIGNsdXN0ZXI6IFwiJXNcIiIKKworIzogc3ludGF4LmM6MzQxMQorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICLX7tChIgorCisjOiBzeW50YXguYzozNDE4Cittc2dpZCAibWF4aW1hbCAiCittc2dzdHIgItfutPMiCisKKyM6IHN5bnRheC5jOjQwNDYKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IMq508PBy7K71f3It7XEss7K/SIKKworIzogc3ludGF4LmM6NDA3MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6INXSsru1vSAlcyC1xCByZWdpb24gaXRlbSIKKworIzogc3ludGF4LmM6NDA5OAorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiDKudPDwcuyu9X9yLe1xLLOyv0iCisKKyM6IHN5bnRheC5jOjQxMDkKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogyrnTw8HLsrvV/ci3tcSyzsr9IgorCisjOiBzeW50YXguYzo0MTg3Cittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6INDo0qrOxLz+w/uzxiIKKworIzogc3ludGF4LmM6NDUyMworIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IMixydkgXCI9XCI6ICVzIgorCisjOiBzeW50YXguYzo0Njc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBzeW50YXggcmVnaW9uICVzILXEss7K/cyrydkiCisKKyM6IHN5bnRheC5jOjUwMTAKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogw7vT0Na4tqi1xMr00NQiCisKKyM6IHN5bnRheC5jOjUwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTog1dKyu7W9t9a49Lf7usU6ICVzIgorCisjOiBzeW50YXguYzo1MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6ICclcycguvPD5rXEtqvO97K7xNzKtrHwIgorCisjOiBzeW50YXguYzo1MjA0Cittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTQwMzog0++3qM2ssr06IMGsvdPQ0Lf7usXWuLaowcvBvbTOIgorCisjOiBzeW50YXguYzo1MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiRTQwNDogss7K/bK71f3ItzogJXMiCisKKyM6IHN5bnRheC5jOjUzMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTogyLHJ2bXIusU6ICVzIgorCisjOiBzeW50YXguYzo1MzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogv9Wyzsr9OiAlcyIKKworIzogc3ludGF4LmM6NTM0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA3OiAlcyBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNDA3OiAlcyCyu8Tc1Nq0y7P2z9YiCisKKyM6IHN5bnRheC5jOjUzNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IgorbXNnc3RyICJFNDA4OiAlcyCx2NDrysfB0LHtwO+1xLXa0ru49iIKKworIzogc3ludGF4LmM6NTQyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFNDA5OiCyu9X9yLe1xNfpw/s6ICVzIgorCisjOiBzeW50YXguYzo1NjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogsrvV/ci3tcQgOnN5bnRheCDX08P8we46ICVzIgorCisjOiBzeW50YXguYzo2MDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiDV0rK7tb0gaGlnaGxpZ2h0IGdyb3VwOiAlcyIKKworIzogc3ludGF4LmM6NjA0NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogss7K/cyrydk6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiCyzsr9uf224DogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjA3NAorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDog0tHJ6Lao1+ksILr2wtQgaGlnaGxpZ2h0IGxpbmsiCisKKyM6IHN5bnRheC5jOjYyMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNTogdW5leHBlY3RlZCBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNTogsru4w9PQtcS1yLrFOiAlcyIKKworIzogc3ludGF4LmM6NjIzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE2OiDIscnZtci6xTogJXMiCisKKyM6IHN5bnRheC5jOjYyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IMixydmyzsr9OiAlcyIKKworIzogc3ludGF4LmM6NjI5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogsru6z7eotcTWtTogJXMiCisKKyM6IHN5bnRheC5jOjY0MTcKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiC07c7ztcTHsL6w0dXJqyIKKworIzogc3ludGF4LmM6NjQyOAorbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6ILTtzvO1xLGzvrDR1cmrIgorCisjOiBzeW50YXguYzo2NDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogtO3O87XE0dXJq8P7s8a78sr91rU6ICVzIgorCisjOiBzeW50YXguYzo2Njg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiDW1bbLseDC68yrs6Q6ICVzIgorCisjOiBzeW50YXguYzo2NzM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiCyzsr9srvV/ci3OiAlcyIKKworIzogc3ludGF4LmM6NzI2MworbXNnaWQgIkU0MjQ6IFRvbyBtYW55IGRpZmZlcmVudCBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBpbiB1c2UiCittc2dzdHIgIkU0MjQ6IMq508PBy8yrtuCyu82stcS438HBtsjK9NDUIgorCisjOiB0YWcuYzo5MAorbXNnaWQgImF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIrHqx6kodGFnKbbR1bu94c6yIgorCisjOiB0YWcuYzo5MQorbXNnaWQgImF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgIrHqx6kodGFnKbbR1bu/qs23IgorCisjOiB0YWcuYzozOTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTog0tG+rdTa1+7HsMPmtcSx6sepKHRhZynByyIKKworIzogdGFnLmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDI2OiDV0rK7tb2x6sepKHRhZyk6ICVzIgorCisjOiB0YWcuYzo1NDUKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMgcHJpIGtpbmQgdGFnIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgIs7EvP5cbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiyuTI6yBuciC78tGh1PEgKDxDUj4gzcuz9ik6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiDWu9PQtMvP7rf7us8iCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6ILy6vq3U2tfuuvPSu7j2t/u6z7XEserHqSh0YWcpwcsiCisKKyM6IHRhZy5jOjc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAizsS8/iBcIiVzXCIgsru05tTaIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgItXStb0gdGFnOiAlZC8lZCVzIgorCisjOiB0YWcuYzo3ODMKK21zZ2lkICIgb3IgbW9yZSIKK21zZ3N0ciAiILvyuPy24CIKKworIzogdGFnLmM6Nzg1Cittc2dpZCAiICBVc2luZyB0YWcgd2l0aCBkaWZmZXJlbnQgY2FzZSEiCittc2dzdHIgIiAg0tSyu82stPPQodC0wLTKudPDIHRhZyEiCisKKyM6IHRhZy5jOjgyOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI5OiBGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiRTQyOTogzsS8/iBcIiVzXCIgsru05tTaIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRhZy5jOjg5NworbXNnaWQgIiIKKyJcbiIKKyIgICMgVE8gdGFnICAgICAgICAgRlJPTSBsaW5lICBpbiBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgICMgtb0gdGFnICAgICAgICAgtNMgICDQ0CAgICDU2iDOxLz+L87Esb4iCisKKyM6IHRhZy5jOjExNDQKK21zZ2lkICJMaW5lYXIgdGFnIHNlYXJjaCIKK21zZ3N0ciAiz9/Q1LLp1dKx6sepIChUYWdzKSIKKworIzogdGFnLmM6MTE0NgorbXNnaWQgIkJpbmFyeSB0YWcgc2VhcmNoIgorbXNnc3RyICK2/r341say6dXSKEJpbmFyeSBzZWFyY2gpILHqx6koVGFncykiCisKKyM6IHRhZy5jOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAisunV0iB0YWcgzsS8/iBcIiVzXCIiCisKKyM6IHRhZy5jOjEzNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMDogVGFnIGZpbGUgcGF0aCB0cnVuY2F0ZWQgZm9yICVzXG4iCittc2dzdHIgIkU0MzA6IFRhZyDOxLz+wre+trG7vdi2z86qICVzXG4iCisKKyM6IHRhZy5jOjE4NDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IFRhZyDOxLz+IFwiJXNcIiC48cq9tO3O8yIKKworIzogdGFnLmM6MTg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCZWZvcmUgYnl0ZSAlbGQiCittc2dzdHIgItTaICVsZCDX1r3a1q7HsCIKKworIzogdGFnLmM6MTg3MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IFRhZyDOxLz+zrTFxdDyOiAlcyIKKworIy4gbmV2ZXIgb3BlbmVkIGFueSB0YWdzIGZpbGUKKyM6IHRhZy5jOjE5MTEKK21zZ2lkICJFNDMzOiBObyB0YWdzIGZpbGUiCittc2dzdHIgIkU0MzM6IMO709AgdGFnIM7EvP4iCisKKyM6IHRhZy5jOjI1ODMKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiDV0rK7tb0gdGFnIgorCisjOiB0YWcuYzoyNTk0Cittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiDV0rK7tb0gdGFnLCDK1NfFssIhIgorCisjOiB0ZXJtLmM6MTcyMworbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyCyu8TcvNPU2KGjv8nTw7XExNq9qNbVtsvQzsq909A6IgorCisjOiB0ZXJtLmM6MTc0NworbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAi1KTJ6DogJyIKKworIzogdGVybS5jOjIxMDAKK21zZ2lkICJDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiCittc2dzdHIgIrK7xNy08r+qIHRlcm1jYXAgzsS8/iIKKworIzogdGVybS5jOjIxMDMKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iCittc2dzdHIgItTadGVybWluZm/W0M601dK1vdbVtsvP7iIKKworIzogdGVybS5jOjIxMDUKK21zZ2lkICJUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAi1Np0ZXJtY2Fw1tDOtNXStb3W1bbLz+4iCisKKyM6IHRlcm0uYzoyMjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNDM2OiB0ZXJtY2FwIMO709AgXCIlc1wiIM/uIgorCisjOiB0ZXJtLmM6MjczOAorbXNnaWQgIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIgorbXNnc3RyICJFNDM3OiDW1bbL0OjSqiBcImNtXCIgtcTE3MGmIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0ODcyCittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDW1bbLsLS8/CAtLS0iCisKKyM6IHVpLmM6MjQwCittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAixvS2r9DCIHNoZWxsXG4iCisKKyM6IHVpLmM6MTcwNQorbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06ILbBtO3O86Oszcuz9tbQLi4uXG4iCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiB1bmRvLmM6MzUxCittc2dpZCAiTm8gdW5kbyBwb3NzaWJsZTsgY29udGludWUgYW55d2F5IgorbXNnc3RyICKyu8Tcu7nUraO7x+u8zND4IgorCisjOiB1bmRvLmM6NTA2Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzog0NC6xbTtzvMiCisKKyM6IHVuZG8uYzo2NzUKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAi0rvP7rjEseQiCisKKyM6IHVuZG8uYzo2NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIiVsZCDP7rjEseQiCisKKyM6IHVuZG8uYzo3MjEKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogs7fP+sHQse3L8Lu1IgorCisjOiB1bmRvLmM6NzUxCittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6INXSsru1vdKqs7fP+rLZ1/e1xNDQIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6NjU1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMs67IM280M2958PmsOaxviIKKworIzogdmVyc2lvbi5jOjY1NworbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgQml0IM280M2958PmsOaxviIKKworIzogdmVyc2lvbi5jOjY2MAorbXNnaWQgIiBpbiBXaW4zMnMgbW9kZSIKK21zZ3N0ciAiV2luMzJzIMSjyr0iCisKKyM6IHZlcnNpb24uYzo2NjIKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAi1qez1iBPTEUiCisKKyM6IHZlcnNpb24uYzo2NjUKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMs67INfWt/u958PmsOaxviIKKworIzogdmVyc2lvbi5jOjY2OQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMs67INfWt/u958PmsOaxviIKKworIzogdmVyc2lvbi5jOjY3MworbXNnaWQgIiIKKyJcbiIKKyIzMiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIzMiDOuyBNUy1ET1MgsOaxviIKKworIzogdmVyc2lvbi5jOjY3NQorbXNnaWQgIiIKKyJcbiIKKyIxNiBiaXQgTVMtRE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyIxNiDOuyBNUy1ET1MgsOaxviIKKworIzogdmVyc2lvbi5jOjY4MQorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgsOaxviIKKworIzogdmVyc2lvbi5jOjY4MworbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYILDmsb4iCisKKyM6IHZlcnNpb24uYzo2ODYKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TILDmsb4iCisKKyM6IHZlcnNpb24uYzo2OTEKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUyCw5rG+IgorCisjOiB2ZXJzaW9uLmM6NzAxCittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIrzTyOuyubahOiAiCisKKyM6IHZlcnNpb24uYzo3MjgKK21zZ2lkICIiCisiXG4iCisiQ29tcGlsZWQgIgorbXNnc3RyICIiCisiXG4iCisiseDS6yIKKworIzogdmVyc2lvbi5jOjczMQorbXNnaWQgImJ5ICIKK21zZ3N0ciAi1d86IgorCisjOiB2ZXJzaW9uLmM6NzQzCittc2dpZCAiIgorIlxuIgorIkh1Z2UgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyKzrMe/sOaxviAiCisKKyM6IHZlcnNpb24uYzo3NDYKK21zZ2lkICIiCisiXG4iCisiQmlnIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisitPPQzbDmsb4gIgorCisjOiB2ZXJzaW9uLmM6NzQ5Cittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorItK7sOOw5rG+ICIKKworIzogdmVyc2lvbi5jOjc1MgorbXNnaWQgIiIKKyJcbiIKKyJTbWFsbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIrzy0tew5rG+ICIKKworIzogdmVyc2lvbi5jOjc1NAorbXNnaWQgIiIKKyJcbiIKKyJUaW55IHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisivqu88rDmsb4gIgorCisjOiB2ZXJzaW9uLmM6NzYwCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICKyu8q508PNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6NzY0Cittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAiyrnTwyBHVEstR05PTUUgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc2NgorbXNnaWQgIndpdGggR1RLIEdVSS4iCittc2dzdHIgIsq508MgR1RLIM280M2958PmoaMiCisKKyM6IHZlcnNpb24uYzo3NzAKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICLKudPDIFgxMS1Nb3RpZiDNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6NzczCittc2dpZCAid2l0aCBYMTEtQXRoZW5hIEdVSS4iCittc2dzdHIgIsq508MgWDExLUF0aGVuYSDNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6Nzc2Cittc2dpZCAid2l0aCBCZU9TIEdVSS4iCittc2dzdHIgIsq508MgQmVPUyDNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6Nzc5Cittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAiyrnTw1Bob3Rvbs280M2958PmoaMiCisKKyM6IHZlcnNpb24uYzo3ODIKK21zZ2lkICJ3aXRoIEdVSS4iCittc2dzdHIgIsq508PNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6Nzg1Cittc2dpZCAid2l0aCBDYXJib24gR1VJLiIKK21zZ3N0ciAiyrnTwyBDYXJib24gzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc4OAorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAiyrnTwyBDb2NvYSDNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6NzkxCittc2dpZCAid2l0aCAoY2xhc3NpYykgR1VJLiIKK21zZ3N0ciAiyrnTwyAotKvNsykgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjgwMgorbXNnaWQgIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iCittc2dzdHIgIiDEv8ewv8nKudPDKCsp0+uyu7/JyrnTwygtKbXExKO/6cHQse06XG4iCisKKyM6IHZlcnNpb24uYzo4MTQKK21zZ2lkICIgICBzeXN0ZW0gdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgz7XNsyB2aW1yYyDF5NbDzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4MTkKK21zZ2lkICIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAg08O7p7XEIHZpbXJjIMXk1sPOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjgyNAorbXNnaWQgIiAybmQgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgILXatv7X6dPDu6cgdmltcmMgzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4MjkKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICC12sj91+nTw7unIHZpbXJjIM7EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODM0Cittc2dpZCAiICAgICAgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDTw7untcQgZXhyYyDF5NbDzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4MzkKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgILXatv7X6dPDu6cgZXhyYyDOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjg0NQorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgz7XNsyBndmltcmMgzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4NDkKK21zZ2lkICIgICAgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAg08O7p7XEIGd2aW1yYyDF5NbDzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4NTMKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgILXatv7X6dPDu6cgZ3ZpbXJjIM7EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODU4Cittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICC12sj91+nTw7unIGd2aW1yYyDOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjg2NQorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICDPtc2zssu1pcXk1sPOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjg3MworbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAgICAkVklNINSkyejWtTogXCIiCisKKyM6IHZlcnNpb24uYzo4NzkKK21zZ2lkICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCittc2dzdHIgIiAgICAgICAkVklNUlVOVElNRSDUpMno1rU6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODgzCittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAiseDS67e9yr06ICIKKworIzogdmVyc2lvbi5jOjg4OQorbXNnaWQgIkNvbXBpbGVyOiAiCittc2dzdHIgIrHg0uvG9zogIgorCisjOiB2ZXJzaW9uLmM6ODk0Cittc2dpZCAiTGlua2luZzogIgorbXNnc3RyICLBtL3ht73KvTogIgorCisjOiB2ZXJzaW9uLmM6ODk5Cittc2dpZCAiICBERUJVRyBCVUlMRCIKK21zZ3N0ciAiICC198rUsOaxviIKKworIzogdmVyc2lvbi5jOjkzNAorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjkzNgorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICKw5rG+ICAgIgorCisjOiB2ZXJzaW9uLmM6OTM3Cittc2dpZCAiYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorbXNnc3RyICLOrLukyMs6IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKKworIzogdmVyc2lvbi5jOjkzOAorbXNnaWQgIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiCittc2dzdHIgIlZpbSDOqr/J19TTybei0NC1xL+qt8XUtLT6wuvI7bz+IgorCisjOiB2ZXJzaW9uLmM6OTQwCittc2dpZCAiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiCittc2dzdHIgIrDv1vrO2rjJtO+1xL/Jwa+2+c2vISIKKworIzogdmVyc2lvbi5jOjk0MQorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIr340ruyvcu1w/fH68rkyOsgICAgICAgICAgOmhlbHAgaWNjZjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NDMKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICLSqs3Ls/bH68rkyOsgICAgICAgICAgICAgICAgICA6cTxFbnRlcj4gICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5NDQKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICLU2s/fsO/W+sfryuTI6yAgICAgICAgICAgICAgICA6aGVscDxFbnRlcj4gICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5NDUKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICLQwrDmsb7Qxc+ix+vK5MjrICAgICAgICAgICAgICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NDgKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiVmkgvObI3cSjyr0iCisKKyM6IHZlcnNpb24uYzo5NDkKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICLI57n70qrN6sirxKPE4rSrzbMgVmkgx+vK5MjrIDpzZXQgbm9jcDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5NTAKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICLI57n70OjSqrbUIFZpILzmyN3Eo8q9vfjSu7K9y7XD98fryuTI6yA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiIKKworIzogdmVyc2lvbi5jOjk5MAorbXNnaWQgIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiCittc2dzdHIgItei0uI6ILzssuK1vSBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6OTkzCittc2dpZCAidHlwZSAgOmhlbHAgd2luZG93czk1PEVudGVyPiAgZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAiyOe5+9Do0qq21CBXaW5kb3dzIDk1INans9a1xLj8tuDQxc+ix+vK5MjrIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4iCisKKyM6IHdpbmRvdy5jOjIwMQorbXNnaWQgIkU0NDE6IFRoZXJlIGlzIG5vIHByZXZpZXcgd2luZG93IgorbXNnc3RyICJFNDQxOiDDu9PQ1KTAwLSwv9oiCisKKyM6IHdpbmRvdy5jOjU2OAorbXNnaWQgIkU0NDI6IENhbid0IHNwbGl0IHRvcGxlZnQgYW5kIGJvdHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIkU0NDI6ILK7xNzNrMqxt9a47rSwv9rOqtfzyc+6zdPSz8K9xyIKKworIzogd2luZG93LmM6MTMyNworbXNnaWQgIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIKK21zZ3N0ciAiRTQ0Mzog09DG5Mv8t9a47rSwv9rKsbK7xNzQ/deqIgorCisjOiB3aW5kb3cuYzoxODEwCittc2dpZCAiRTQ0NDogQ2Fubm90IGNsb3NlIGxhc3Qgd2luZG93IgorbXNnc3RyICJFNDQ0OiCyu8Tcudix1dfuuvPSu7j2tLC/2iIKKworIzogd2luZG93LmM6MjQ3NAorbXNnaWQgIkFscmVhZHkgb25seSBvbmUgd2luZG93IgorbXNnc3RyICLS0b6t1rvKo9K7uPa0sL/awcsiCisKKyM6IHdpbmRvdy5jOjI1MjEKK21zZ2lkICJFNDQ1OiBPdGhlciB3aW5kb3cgY29udGFpbnMgY2hhbmdlcyIKK21zZ3N0ciAiRTQ0NTogxuTL/LSwv9rT0LjEseS1xMTayN0iCisKKyM6IHdpbmRvdy5jOjQzNDEKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiC54rHqtKbDu9PQzsS8/sP7IgorCisjOiB3aW5kb3cuYzo0NDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDc6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTQ0Nzog1NrCt7621tDV0rK7tb3OxLz+IFwiJXNcIiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1ODYKK21zZ2lkICJFZGl0IHdpdGggJm11bHRpcGxlIFZpbXMiCittc2dzdHIgItPDICZtdWx0aXBsZSBWaW1zILHgvK0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTkyCittc2dpZCAiRWRpdCB3aXRoIHNpbmdsZSAmVmltIgorbXNnc3RyICLTwyBzaW5nbGUgJlZpbSCx4LytIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYwNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICLTwyAmVmltILHgvK0iCisKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MjgKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAi08O1scewtcQgVmltILHgvK0gLSAmIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjc1MgorbXNnaWQgIkVkaXRzIHRoZSBzZWxlY3RlZCBmaWxlKHMpIHdpdGggVmltIgorbXNnc3RyICLTwyBWaW0gseC8rdGh1PG1xM7EvP4iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6ODkxIC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTY5Cittc2dpZCAiRXJyb3IgY3JlYXRpbmcgcHJvY2VzczogQ2hlY2sgaWYgZ3ZpbSBpcyBpbiB5b3VyIHBhdGghIgorbXNnc3RyICK0tL2ovfizzMqnsNw6IMfrvOyy6Wd2aW3Kx7fx1Nq/yda00NDCt7621tAhIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwNgorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NzAKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZ3ZpbWV4dC5kbGwgs/a07SIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDUKK21zZ2lkICJQYXRoIGxlbmd0aCB0b28gbG9uZyEiCittc2dzdHIgIsK3vrbD+8yrs6QiCisKKyM6IGdsb2JhbHMuaDo4NzgKK21zZ2lkICItLU5vIGxpbmVzIGluIGJ1ZmZlci0tIgorbXNnc3RyICItLbu6s+XH+M7e18rBzy0tIgorCisjLgorIy4gKiBUaGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGFyZSBpbmNsdWRlZCBoZXJlLgorIy4gKiBFeGNsdWRlZCBhcmUgZXJyb3JzIHRoYXQgYXJlIG9ubHkgdXNlZCBvbmNlIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisjLgorIzogZ2xvYmFscy5oOjEwMTkKK21zZ2lkICJDb21tYW5kIGFib3J0ZWQiCittc2dzdHIgIsP8we6xu8e/1sbW0LbPIgorCisjOiBnbG9iYWxzLmg6MTAyMAorbXNnaWQgIkFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICLQ6NKq1rjB7rLOyv0iCisKKyM6IGdsb2JhbHMuaDoxMDIxCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcILrzw+bTprjD09AgLyA/ILvyICYiCisKKyM6IGdsb2JhbHMuaDoxMDIzCittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiCyu8Tc1NrD/MHu0NC0sL/a1tDKudPDoaM8Q1I+1rTQ0KOsQ1RSTC1DIM3Ls/YiCisKKyM6IGdsb2JhbHMuaDoxMDI1Cittc2dpZCAiRTEyOiBDb21tYW5kIG5vdCBhbGxvd2VkIGZyb20gZXhyYy92aW1yYyBpbiBjdXJyZW50IGRpciBvciB0YWcgc2VhcmNoIgorbXNnc3RyICJFMTI6IGV4cmMvdmltcmMgwO+1xNa4we6yu8Tc1rTQ0CIKKworIzogZ2xvYmFscy5oOjEwMjYKK21zZ2lkICJFMTM6IEZpbGUgZXhpc3RzIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxMzogzsS8/tLRvq205tTaICi/ydPDICEgx7/Wxszmu7spIgorCisjOiBnbG9iYWxzLmg6MTAyNworbXNnaWQgIkNvbW1hbmQgZmFpbGVkIgorbXNnc3RyICLD/MHu1rTQ0MqnsNwiCisKKyM6IGdsb2JhbHMuaDoxMDI4Cittc2dpZCAiSW50ZXJuYWwgZXJyb3IiCittc2dzdHIgIsTasr+07c7zIgorCisjOiBnbG9iYWxzLmg6MTAyOQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICLS0dbQts8iCisKKyM6IGdsb2JhbHMuaDoxMDMwCittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDogsrvV/ci3tcS12Na3IgorCisjOiBnbG9iYWxzLmg6MTAzMQorbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIrK71f3It7XEss7K/SIKKworIzogZ2xvYmFscy5oOjEwMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIrK71f3It7XEss7K/TogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiCyu9X9yLe1xLHttO/KvTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMDM2Cittc2dpZCAiRTE2OiBJbnZhbGlkIHJhbmdlIgorbXNnc3RyICJFMTY6ILK71f3It7XEt7bOpyIKKworIzogZ2xvYmFscy5oOjEwMzcKK21zZ2lkICJJbnZhbGlkIGNvbW1hbmQiCittc2dzdHIgIrK71f3It7XEw/zB7iIKKworIzogZ2xvYmFscy5oOjEwMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3OiBcIiVzXCIgaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIkUxNzogXCIlc1wiIMrHxL/CvCIKKworIzogZ2xvYmFscy5oOjEwNDIKK21zZ2lkICJFMTg6IFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBiZWZvcmUgJz0nIgorbXNnc3RyICJFMTg6ICc9JyDHsMPms/bP1sHLtO3O87XE19a3+yIKKworIzogZ2xvYmFscy5oOjEwNDQKK21zZ2lkICJFMTk6IE1hcmsgaGFzIGludmFsaWQgbGluZSBudW1iZXIiCittc2dzdHIgIkUxOTogseq8x7XE0NC6xbTtzvMiCisKKyM6IGdsb2JhbHMuaDoxMDQ1Cittc2dpZCAiRTIwOiBNYXJrIG5vdCBzZXQiCittc2dzdHIgIkUyMDogw7vT0Mnotqix6rzHIgorCisjOiBnbG9iYWxzLmg6MTA0NgorbXNnaWQgIkUyMTogQ2Fubm90IG1ha2UgY2hhbmdlcywgJ21vZGlmaWFibGUnIGlzIG9mZiIKK21zZ3N0ciAiRTIxOiDS8s6qICdtb2RpZmlhYmxlJyDRoc/uyse52LHVtcSjrMv50tSyu8Tc0N64xCIKKworIzogZ2xvYmFscy5oOjEwNDcKK21zZ2lkICJFMjI6IFNjcmlwdHMgbmVzdGVkIHRvbyBkZWVwIgorbXNnc3RyICJFMjI6ILXduem199PDzKu24LLjIgorCisjOiBnbG9iYWxzLmg6MTA0OAorbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogw7vT0MzmtPq1xM7EvP4iCisKKyM6IGdsb2JhbHMuaDoxMDQ5Cittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiDDu9PQ1eK49iBhYmJyZXZpYXRpb24gttTTpiIKKworIzogZ2xvYmFscy5oOjEwNTAKK21zZ2lkICJObyAhIGFsbG93ZWQiCittc2dzdHIgIrK7v8nKudPDICchJyIKKworIzogZ2xvYmFscy5oOjEwNTIKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6INLyzqqx4NLryrHDu9PQvNPI68280M2958PmtcSzzNDytPrC66Osy/nS1LK7xNzKudPDzbzQzb3nw+YiCisKKyM6IGdsb2JhbHMuaDoxMDU1Cittc2dpZCAiRTI2OiBIZWJyZXcgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZVxuIgorbXNnc3RyICJFMjY6INLyzqqx4NLryrHDu9PQvNPI68+jsq7As7XEs8zQ8rT6wuujrMv50tSyu8TcyrnTwyBIZWJyZXdcbiIKKworIzogZ2xvYmFscy5oOjEwNTgKK21zZ2lkICJFMjc6IEZhcnNpIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI3OiDS8s6qseDS68qxw7vT0LzTyOsgRmFyc2kgtcSzzNDytPrC66Osy/nS1LK7xNzKudPDIEZhcnNpXG4iCisKKyM6IGdsb2JhbHMuaDoxMDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkUyODogw7vT0MP7zqogJyVzJyC1xCBoaWdobGlnaHQgZ3JvdXAiCisKKyM6IGdsb2JhbHMuaDoxMDYzCittc2dpZCAiRTI5OiBObyBpbnNlcnRlZCB0ZXh0IHlldCIKK21zZ3N0ciAiRTI5OiDDu9PQsuXI67n9zsTX1iIKKworIzogZ2xvYmFscy5oOjEwNjQKK21zZ2lkICJFMzA6IE5vIHByZXZpb3VzIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiRTMwOiDDu9PQx7DSu8/uw/zB7iIKKworIzogZ2xvYmFscy5oOjEwNjUKK21zZ2lkICJFMzE6IE5vIHN1Y2ggbWFwcGluZyIKK21zZ3N0ciAiRTMxOiDDu9PQ1eK49iBtYXBwaW5nILbU06YiCisKKyM6IGdsb2JhbHMuaDoxMDY2Cittc2dpZCAiTm8gbWF0Y2giCittc2dzdHIgItXSsru1vSIKKworIzogZ2xvYmFscy5oOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2g6ICVzIgorbXNnc3RyICLV0rK7tb06ICVzIgorCisjOiBnbG9iYWxzLmg6MTA2OAorbXNnaWQgIkUzMjogTm8gZmlsZSBuYW1lIgorbXNnc3RyICJFMzI6IMO709DOxLz+w/siCisKKyM6IGdsb2JhbHMuaDoxMDY5Cittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiDDu9PQx7DSu7j2sunV0i/M5ru7tcTD/MHuIgorCisjOiBnbG9iYWxzLmg6MTA3MAorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiDDu9PQx7DSu7j2w/zB7iIKKworIzogZ2xvYmFscy5oOjEwNzEKK21zZ2lkICJFMzU6IE5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTM1OiDDu9PQx7DSu7j2sunV0sP8we4iCisKKyM6IGdsb2JhbHMuaDoxMDcyCittc2dpZCAiTm8gcmFuZ2UgYWxsb3dlZCIKK21zZ3N0ciAisru/ycq508O3ts6nw/zB7iIKKworIzogZ2xvYmFscy5oOjEwNzQKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiDDu9PQ1+O5u7XEv9W85CIKKworIzogZ2xvYmFscy5oOjEwNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY3JlYXRlIGZpbGUgJXMiCittc2dzdHIgIrK7xNy0tL2ozsS8/iAlcyIKKworIzogZ2xvYmFscy5oOjEwNzcKK21zZ2lkICJDYW4ndCBnZXQgdGVtcCBmaWxlIG5hbWUiCittc2dzdHIgIrK7xNy1w7W9wdnKsc7EvP7D+yIKKworIzogZ2xvYmFscy5oOjEwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICKyu8TctPK/qs7EvP4gJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAisrvE3LbByKHOxLz+ICVzIgorCisjOiBnbG9iYWxzLmg6MTA4MAorbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiDOxLz+xNrI3dLRuMSx5LWrydDOtLGjtOYgKL/J08MgISDHv9bG1rTQ0CkiCisKKyM6IGdsb2JhbHMuaDoxMDgxCittc2dpZCAiRTM4OiBOdWxsIGFyZ3VtZW50IgorbXNnc3RyICJFMzg6IL/VtcQgKE51bGwpILLOyv0iCisKKyM6IGdsb2JhbHMuaDoxMDgzCittc2dpZCAiRTM5OiBOdW1iZXIgZXhwZWN0ZWQiCittc2dzdHIgIkUzOTog06a4w9Kq09DK/dfWIgorCisjOiBnbG9iYWxzLmg6MTA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA6IENhbid0IG9wZW4gZXJyb3JmaWxlICVzIgorbXNnc3RyICJFNDA6ILK7xNy08r+qtO3O887EvP4gJXMiCisKKyM6IGdsb2JhbHMuaDoxMDg5Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiDE2rTmsrvX4yEiCisKKyM6IGdsb2JhbHMuaDoxMDkyCittc2dpZCAiUGF0dGVybiBub3QgZm91bmQiCittc2dzdHIgItXSsru1vcSjyr0iCisKKyM6IGdsb2JhbHMuaDoxMDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAi1dKyu7W9xKPKvSAlcyIKKworIzogZ2xvYmFscy5oOjEwOTUKK21zZ2lkICJBcmd1bWVudCBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICKyzsr906a4w8rH1f3K/SIKKworIzogZ2xvYmFscy5oOjEwOTcKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiDDu9PQtO3O8yIKKworIzogZ2xvYmFscy5oOjEwOTkKK21zZ2lkICJFNDM6IERhbWFnZWQgbWF0Y2ggc3RyaW5nIgorbXNnc3RyICJFNDM6IMalxeTX1rf7tK7T0M7KzOIiCisKKyM6IGdsb2JhbHMuaDoxMTAwCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDog1f3U8rHttO/KvdPQzsrM4iIKKworIzogZ2xvYmFscy5oOjExMDEKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IMnotqggJ3JlYWRvbmx5JyDRoc/uKNa7tsEpICi/ydPDICEgx7/Wxta00NApIgorCisjOiBnbG9iYWxzLmg6MTEwMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiCyu8Tcyei2qNa7tsGx5MG/IFwiJXNcIiIKKworIzogZ2xvYmFscy5oOjExMDYKK21zZ2lkICJFNDc6IEVycm9yIHdoaWxlIHJlYWRpbmcgZXJyb3JmaWxlIgorbXNnc3RyICJFNDc6ILbByKG07c7zzsS8/sqnsNwiCisKKyM6IGdsb2JhbHMuaDoxMTA5Cittc2dpZCAiRTQ4OiBOb3QgYWxsb3dlZCBpbiBzYW5kYm94IgorbXNnc3RyICJFNDg6ILK7xNzU2iBzYW5kYm94IMDvs/bP1iIKKworIzogZ2xvYmFscy5oOjExMTEKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogtO3O87XEufa2r7Tz0KEiCisKKyM6IGdsb2JhbHMuaDoxMTEyCittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiAnRTcxOiDRoc/uICdzaGVsbCcgzrTJ6LaoIgorCisjOiBnbG9iYWxzLmg6MTExMworbXNnaWQgIkU3MjogQ2xvc2UgZXJyb3Igb24gc3dhcCBmaWxlIgorbXNnc3RyICJFNzI6IL27u7vOxLz+udix1bTtzvMiCisKKyM6IGdsb2JhbHMuaDoxMTE0Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3MzogserHqbbR1bvS0b/VIgorCisjOiBnbG9iYWxzLmg6MTExNQorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiDD/MHuzKu4tNTTIgorCisjOiBnbG9iYWxzLmg6MTExNgorbXNnaWQgIkU3NTogTmFtZSB0b28gbG9uZyIKK21zZ3N0ciAiRTc1OiDD+9fWzKuzpCIKKworIzogZ2xvYmFscy5oOjExMTcKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3NjogzKu24CBbIgorCisjOiBnbG9iYWxzLmg6MTExOAorbXNnaWQgIkU3NzogVG9vIG1hbnkgZmlsZSBuYW1lcyIKK21zZ3N0ciAiRTc3OiDMq7bgzsS8/sP7IgorCisjOiBnbG9iYWxzLmg6MTExOQorbXNnaWQgIlRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIsTjyuTI68HLtuDT4LXE19a3+yIKKworIzogZ2xvYmFscy5oOjExMjAKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiCyu8TcsOzKtrXEseq8xyIKKworIzogZ2xvYmFscy5oOjExMjEKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6ILK7xNzAqdW5zajF5Lf7IgorCisjOiBnbG9iYWxzLmg6MTEyMgorbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiDQtMjrtO3O8yIKKworIzogZ2xvYmFscy5oOjExMjMKK21zZ2lkICJaZXJvIGNvdW50IgorbXNnc3RyICLK/bW9weMgKD8pIgorCisjOiBnbG9iYWxzLmg6MTEyNQorbXNnaWQgIkU4MTogVXNpbmcgPFNJRD4gbm90IGluIGEgc2NyaXB0IGNvbnRleHQiCittc2dzdHIgIkU4MTogPFNJRD4gsrvE3NTaIHNjcmlwdCCxvs7EzeLKudPDLiIKZGlmZiAtLWdpdCBhL3NyYy9wby96aF9DTi5wbyBiL3NyYy9wby96aF9DTi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGZiNWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL3poX0NOLnBvCkBAIC0wLDAgKzEsNTkzNyBAQAorIyBDaGluZXNlIChzaW1wbGlmaWVkKSBUcmFuc2xhdGlvbiBmb3IgVmltCisjCisjIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorIyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyMKKyMgRklSU1QgQVVUSE9SICBXYW5nIEp1biA8anVud0B0dXJib2xpbnV4LmNvbS5jbj4KKyMKKyMgT3JpZ2luYWwgdHJhbnNsYXRpb25zLgorIworIywgbm8td3JhcAorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogVmltKFNpbXBsaWZpZWQgQ2hpbmVzZSlcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwMS0wOS0yNCAxMDoxMCswODAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwMS0wOS0yNCAxMToxMyswODAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBXYW5nIEp1biA8anVud0B0dXJib2xpbnV4LmNvbS5jbj5cbiIKKyJMYW5ndWFnZS1UZWFtOiBXYW5nIEp1biA8anVud0B0dXJib2xpbnV4LmNvbS5jbj5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1nYjIzMTJcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4LWJpdFxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4MjogsrvE3LfWxeTIzrrOu7qz5cf4o6zNy7P2s8zQ8i4uLiIKKworIzogYnVmZmVyLmM6MTAwCittc2dpZCAiRTgzOiBDYW5ub3QgYWxsb2NhdGUgYnVmZmVyLCB1c2luZyBvdGhlciBvbmUuLi4iCittc2dzdHIgIkU4MzogsrvE3LfWxeS7urPlx/ijrMq508PB7dK7uPa7urPlx/guLi4uIgorCisjOiBidWZmZXIuYzo2OTgKK21zZ2lkICJObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIsO709DKzbfFyM66zru6s+XH+CIKKworIzogYnVmZmVyLmM6NzAwCittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIsO709DJvrP9yM66zru6s+XH+CIKKworIzogYnVmZmVyLmM6NzAyCittc2dpZCAiTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiw7vT0Mm+s/3IzrrOu7qz5cf4IgorCisjOiBidWZmZXIuYzo3MTAKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAi0tHKzbfF0ru49ru6s+XH+CIKKworIzogYnVmZmVyLmM6NzEyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgdW5sb2FkZWQiCittc2dzdHIgItLRys23xSAlZCC49ru6s+XH+CIKKworIzogYnVmZmVyLmM6NzE3Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAi0tHJvrP90ru49ru6s+XH+CIKKworIzogYnVmZmVyLmM6NzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgZGVsZXRlZCIKK21zZ3N0ciAi0tHJvrP9ICVkILj2u7qz5cf4IgorCisjOiBidWZmZXIuYzo3MjQKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgItLRyb6z/dK7uPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjcyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHdpcGVkIG91dCIKK21zZ3N0ciAi0tHJvrP9ICVkILj2u7qz5cf4IgorCisjOiBidWZmZXIuYzo3ODMKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiDDu9PQ0N64xLn9tcS7urPlx/giCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo4MjIKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTogw7vT0L/JwdCz9rXEu7qz5cf4IgorCisjOiBidWZmZXIuYzo4MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiCyu8Tcx9C7u7W9tdogJWxkILj2u7qz5cf4IgorCisjOiBidWZmZXIuYzo4MzcKK21zZ2lkICJFODc6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBidWZmZXIiCittc2dzdHIgIkU4NzogsrvE3MfQu7u1vbj8uvPD5rXEu7qz5cf4IgorCisjOiBidWZmZXIuYzo4MzkKK21zZ2lkICJFODg6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgYnVmZmVyIgorbXNnc3RyICJFODg6ILK7xNzH0Lu7tb24/Meww+a1xLu6s+XH+CIKKworIzogYnVmZmVyLmM6ODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5OiDS0bj8uMS5/bu6s+XH+CAlbGQgtavJ0M60saO05iAov8nTwyAhIMe/1sbWtNDQKSIKKworIzogYnVmZmVyLmM6ODc5Cittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6ILK7xNzKzbfF1+6689K7uPa7urPlx/giCisKKyM6IGJ1ZmZlci5jOjEzMTQKK21zZ2lkICJXMTQ6IFdhcm5pbmc6IExpc3Qgb2YgZmlsZSBuYW1lcyBvdmVyZmxvdyIKK21zZ3N0ciAiVzE0OiC+r7jmOiDOxLz+w/u5/bbgIgorCisjOiBidWZmZXIuYzoxNDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5Mjog1dKyu7W9tdogJWxkILj2u7qz5cf4IgorCisjOiBidWZmZXIuYzoxNzAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MzogTW9yZSB0aGFuIG9uZSBtYXRjaCBmb3IgJXMiCittc2dzdHIgIkU5Mzog1dK1vdK7uPbS1MnPtcQgJXMiCisKKyM6IGJ1ZmZlci5jOjE3MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6INXSsru1vSAlcyIKKworIzogYnVmZmVyLmM6MjEwNSBleF9kb2NtZC5jOjYwNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgItDQICVsZCIKKworIzogYnVmZmVyLmM6MjE4OAorbXNnaWQgIkU5NTogQnVmZmVyIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFOTU6INLR09C7urPlx/jKudPD1eK49sP719YiCisKKyM6IGJ1ZmZlci5jOjI0ODEKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFvS0dDeuMRdIgorCisjOiBidWZmZXIuYzoyNDg2Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJbzrSx4LytXSIKKworIzogYnVmZmVyLmM6MjQ5MQorbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIlvQws7EvP5dIgorCisjOiBidWZmZXIuYzoyNDkyCittc2dpZCAiW1JlYWQgZXJyb3JzXSIKK21zZ3N0ciAiW7bBtO3O810iCisKKyM6IGJ1ZmZlci5jOjI0OTQgZmlsZWlvLmM6MTc1NAorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIlvWu7bBXSIKKworIzogYnVmZmVyLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgLS0lZCUlLS0iCittc2dzdHIgItDQyv0gMSAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjUxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgLS0lZCUlLS0iCittc2dzdHIgItDQyv0gJWxkIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNTE4CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICLQ0CAlbGQvJWxkIC0tJWQlJS0tIMHQICIKKworIzogYnVmZmVyLmM6MjYwNgorbXNnaWQgIltObyBmaWxlXSIKK21zZ3N0ciAiW860w/zD+10iCisKKyMuIG11c3QgYmUgYSBoZWxwIGJ1ZmZlcgorIzogYnVmZmVyLmM6MjY0NgorbXNnaWQgImhlbHAiCittc2dzdHIgIluw79b6XSIKKworIzogYnVmZmVyLmM6MzE1MSBzY3JlZW4uYzo0NjU3Cittc2dpZCAiW2hlbHBdIgorbXNnc3RyICJbsO/W+l0iCisKKyM6IGJ1ZmZlci5jOjMxODMgc2NyZWVuLmM6NDY2MworbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW9SkwMBdIgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQWxsIgorbXNnc3RyICLIq7K/IgorCisjOiBidWZmZXIuYzozMzg5Cittc2dpZCAiQm90IgorbXNnc3RyICK117bLIgorCisjOiBidWZmZXIuYzozMzkxCittc2dpZCAiVG9wIgorbXNnc3RyICK2pbbLIgorCisjOiBidWZmZXIuYzo0MTI3Cittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjILu6s+XH+MHQse06XG4iCisKKyM6IGJ1ZmZlci5jOjQxNjAKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIlu07c7zwdCx7V0iCisKKyM6IGJ1ZmZlci5jOjQxNzMgbWVtbGluZS5jOjE1MTMKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIlvOtMP8w/tdIgorCisjOiBidWZmZXIuYzo0MzkzCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gt/u6xSAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiJXMgtcS3+7rFOiIKKworIzogYnVmZmVyLmM6NDQwOQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAg0NA9JWxkICBpZD0lZCAgw/uzxj0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogsrvE3LHIvc8oZGlmZikgJWxkuPbS1MnPtcS7urPlx/giCisKKyM6IGRpZmYuYzo2NDgKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogsrvE3LS0vaggZGlmZiAiCisKKyM6IGRpZmYuYzo3NDcKK21zZ2lkICJQYXRjaCBmaWxlIgorbXNnc3RyICJQYXRjaCDOxLz+IgorCisjOiBkaWZmLmM6OTkxCittc2dpZCAiRTk4OiBDYW5ub3QgcmVhZCBkaWZmIG91dHB1dCIKK21zZ3N0ciAiRTk4OiCyu8TctsHIoSBkaWZmILXEyuSz9iIKKworIzogZGlmZi5jOjE3MDQKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTogxL/HsLXEu7qz5cf4srvKx9TaIGRpZmYgxKPKvSIKKworIzogZGlmZi5jOjE3MTYKK21zZ2lkICJFMTAwOiBObyBvdGhlciBidWZmZXIgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAwOiDDu9PQu7qz5cf41NogZGlmZiDEo8q9IgorCisjOiBkaWZmLmM6MTcyNAorbXNnaWQgIkUxMDE6IE1vcmUgdGhhbiB0d28gYnVmZmVycyBpbiBkaWZmIG1vZGUsIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHVzZSIKK21zZ3N0ciAiRTEwMTog09DBvbj20tTJz7XEu7qz5cf41NogZGlmZiDEo8q9o6yyu8Tcvva2qNKq08PExNK7uPYiCisKKyM6IGRpZmYuYzoxNzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDI6IENhbid0IGZpbmQgYnVmZmVyIFwiJXNcIiIKK21zZ3N0ciAiRTEwMjog1dKyu7W9u7qz5cf4OiBcIiVzXCIiCisKKyM6IGRpZmYuYzoxNzUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMDM6IEJ1ZmZlciBcIiVzXCIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTEwMzogu7qz5cf4IFwiJXNcIiCyu8rH1NogZGlmZiDEo8q9IgorCisjOiBkaWdyYXBoLmM6MjE2OAorbXNnaWQgIkUxMDQ6IEVzY2FwZSBub3QgYWxsb3dlZCBpbiBkaWdyYXBoIgorbXNnc3RyICJFMTA0OiC4tLrP19a3+yhkaWdyYXBoKdbQsrvE3Mq508MgRXNjYXBlIgorCisjOiBkaWdyYXBoLmM6MjM0MAorbXNnaWQgIktleW1hcCBmaWxlIG5vdCBmb3VuZCIKK21zZ3N0ciAi1dKyu7W9IGtleW1hcCDOxLz+IgorCisjOiBkaWdyYXBoLmM6MjM2NworbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogyrnTwyA6bG9hZGtleW1hcCAiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiILnYvPzX1tfUtq/N6rPJICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIMSjyr0gKF5FL15ZL15ML15dL15GL15JL15LL15EL15OL15QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIMf40/K52Lz819bX1LavzeqzySAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiDV+9DQ19S2r83qs8kgKF5ML15OL15QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRi9eTi9eUCkiCittc2dzdHIgIiDOxLz+w/vX1LavzeqzySAoXkYvXk4vXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiILHqx6nX1LavzeqzySAoXl0vXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIMK3vrbX1LavzeqzySAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiC2qNLl19S2r83qs8kgKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIg19a15NfUtq/N6rPJICheSy9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlQvXk4vXlApIgorbXNnc3RyICIgVGhlc2F1cnVzINfUtq/N6rPJICheVC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MworbXNnaWQgIiBDb21tYW5kLWxpbmUgY29tcGxldGlvbiAoXlYvXk4vXlApIgorbXNnc3RyICIgw/zB7tfUtq/N6rPJICheVi9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICLS0bW9ts7C5L3hzrIiCisKKyM6IGVkaXQuYzo4OTQKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgItGhz+4gJ3RoZXNhdXJ1cycgzrTJ6LaoIgorCisjOiBlZGl0LmM6MTA3MAorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgItGhz+4gJ2RpY3Rpb25hcnknIM6qv9UiCisKKyM6IGVkaXQuYzoxOTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGRpY3Rpb25hcnk6ICVzIgorbXNnc3RyICLJqMPo19a15DogJXMiCisKKyM6IGVkaXQuYzoyMTgzCittc2dpZCAiIChpbnNlcnQpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKLLlyOspIFNjcm9sbCAoXkUvXlkpIgorCisjOiBlZGl0LmM6MjE4NQorbXNnaWQgIiAocmVwbGFjZSkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAozOa7uykgU2Nyb2xsICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAiyajD6NbQOiAlcyIKKworIzogZWRpdC5jOjI1MzEKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAiyajD6LHqx6kuIgorCisjOiBlZGl0LmM6MzE4OQorbXNnaWQgIiBBZGRpbmciCittc2dzdHIgIiDU9rzTIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjMyMzgKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIMvR0bDW0C4uLiIKKworIzogZWRpdC5jOjMyOTQKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICK72LW9xvC14yIKKworIzogZWRpdC5jOjMyOTkKK21zZ2lkICJXb3JkIGZyb20gb3RoZXIgbGluZSIKK21zZ3N0ciAitNPG5Mv80NC/qsq8tcS0yiAoPykiCisKKyM6IGVkaXQuYzozMzA0Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgIta709C0y8/uxqXF5CIKKworIzogZWRpdC5jOjMzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgItXStb0gJWQgLyAlZCIKKworIzogZWRpdC5jOjMzNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgIsalxeQgJWQiCisKKyM6IGV2YWwuYzo2OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiDOtLao0uW1xLHkwb86IFwiJXNcIiIKKworIzogZXZhbC5jOjk3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IMixydm21NOmtcTAqLrFOiAlcyIKKworIzogZXZhbC5jOjEwNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiDO3rTLseTBvzogXCIlc1wiIgorCisjOiBldmFsLmM6MTI4NAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogJz8nILrzyLHJ2SAnOiciCisKKyM6IGV2YWwuYzoxODk4Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IMixydm21NOmtcQgXCIpXCIiCisKKyM6IGV2YWwuYzoxOTQ4Cittc2dpZCAiRTExMTogTWlzc2luZyAnXSciCittc2dzdHIgIkUxMTE6IMixydm21NOmtcQgXCJdXCIiCisKKyM6IGV2YWwuYzoyMDIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiDIscnZ0aHP7sP7s8Y6ICVzIgorCisjOiBldmFsLmM6MjA0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6ILK71f3It7XE0aHP7jogJXMiCisKKyM6IGV2YWwuYzoyMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiDIscnZ0v26xTogJXMiCisKKyM6IGV2YWwuYzoyMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiDIscnZ0v26xTogJXMiCisKKyM6IGV2YWwuYzoyNTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjoguq/K/SAlcyC1xLLOyv2yu9X9yLciCisKKyM6IGV2YWwuYzoyNTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiDOtLao0uW1xLqvyv06ICVzIgorCisjOiBldmFsLmM6MjUzOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODoguq/K/SAlcyC1xLLOyv25/bbgIgorCisjOiBldmFsLmM6MjU0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiC6r8r9ICVzILXEss7K/cyrydkiCisKKyM6IGV2YWwuYzoyNTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4gsrvE3NTaIHNjcmlwdCDJz8/CzsTN4sq508M6ICVzIgorCisjOiBldmFsLmM6MzU3NAorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCDQ0DogIgorCisjOiBldmFsLmM6NDY4OQorbXNnaWQgIiIKKyImT0tcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiyLe2qCgmTylcbiIKKyLIoc/7KCZDKSIKKworIzogZXZhbC5jOjU1MTEKK21zZ2lkICJFMjQwOiBObyBjb25uZWN0aW9uIHRvIFZpbSBzZXJ2ZXIiCittc2dzdHIgIkUyNDA6IMO709DT6yBWaW0gU2VydmVyILS0vajBrL3TIgorCisjOiBldmFsLmM6NTYwMQorbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiCyu8TctsHIobf+zvHG97XEz+zTpiIKKworIzogZXZhbC5jOjU2MjYKK21zZ2lkICJFMjU4OiBVbmFibGUgdG8gc2VuZCB0byBjbGllbnQiCittc2dzdHIgIkUyNTg6ILK7xNy0q8vNtb2/zbuntssiCisKKyM6IGV2YWwuYzo1NjY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiCyu8TctKvLzbW9ICVzIgorCisjOiBldmFsLmM6NTc2MworbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKM7e0KcpIgorCisjOiBldmFsLmM6Njc2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6ICVzIgorbXNnc3RyICJFMTIxOiCx5MG/ICVzIMnQzrS2qNLlIgorCisjOiBldmFsLmM6NzQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgdXNlICEgdG8gcmVwbGFjZSIKK21zZ3N0ciAiRTEyMjoguq/K/SAlcyDS0b6ttObU2iwgx+vKudPDICEgx7/Wxszmu7siCisKKyM6IGV2YWwuYzo3NTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6ILqvyv0gJXMgydDOtLao0uUiCisKKyM6IGV2YWwuYzo3NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogyLHJ2SBcIihcIjogJXMiCisKKyM6IGV2YWwuYzo3NTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiCyzsr9srvV/ci3OiAlcyIKKworIzogZXZhbC5jOjc2MzcKK21zZ2lkICJFMTI2OiBNaXNzaW5nIDplbmRmdW5jdGlvbiIKK21zZ3N0ciAiRTEyNjogyLHJ2SA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo3NzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiC6r8r9ICVzINX91NrKudPD1tCjrLK7xNzW2NDCtqjS5SIKKworIzogZXZhbC5jOjc3NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODoguq/K/cP7s8a12tK7uPbX1sS4sdjQ67Tz0LQ6ICVzIgorCisjOiBldmFsLmM6Nzc3OQorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6INDo0qq6r8r9w/uzxiIKKworIzogZXZhbC5jOjc4NzIKK21zZ2lkICJmdW5jdGlvbiAiCittc2dzdHIgIrqvyv0gIgorCisjOiBldmFsLmM6Nzk4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTMwOiBVbmRlZmluZWQgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTMwOiC6r8r9ICVzIMnQzrS2qNLlIgorCisjOiBldmFsLmM6Nzk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTMxOiBDYW5ub3QgZGVsZXRlIGZ1bmN0aW9uICVzOiBJdCBpcyBpbiB1c2UiCittc2dzdHIgIkUxMzE6ILqvyv0gJXMg1f3U2sq508PW0KOssrvE3Mm+s/0iCisKKyM6IGV2YWwuYzo4MDM5Cittc2dpZCAiRTEzMjogRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIKK21zZ3N0ciAiRTEzMjoguq/K/bXduem199PDsuPK/bOsuf0gJ21heGZ1bmNkZXB0aCciCisKKyMuIGFsd2F5cyBzY3JvbGwgdXAsIGRvbid0IG92ZXJ3cml0ZQorIzogZXZhbC5jOjgwOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FsbGluZyAlcyIKK21zZ3N0ciAitffTwyAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODExNSBleF9jbWRzMi5jOjE5NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAivMzQ+DogJXMiCisKKyM6IGV2YWwuYzo4MTY5Cittc2dpZCAiRTEzMzogOnJldHVybiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxMzM6IDpyZXR1cm4gsdjQ69Tauq/K/cDvyrnTwyIKKworIzogZXZhbC5jOjgyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzILe1u9jWtSAjJWxkICIKKworIzogZXZhbC5jOjgyNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMgt7W72Na1IFwiJXNcIiIKKworIzogZXZhbC5jOjgzOTEKK21zZ2lkICIiCisiXG4iCisiIyBnbG9iYWwgdmFyaWFibGVzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDIq77WseTBvzpcbiIKKworIzogZXhfY21kczIuYzo3MAorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGxlYXZlLiIKK21zZ3N0ciAivfjI67X3ytTEo8q9LiDK5MjrIFwiY29udFwiINLUu9i1vdX9s6PEo8q9LiIKKworIzogZXhfY21kczIuYzo3NCBleF9kb2NtZC5jOjc3MQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgItDQICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAiY21kOiAlcyIKKworIzogZXhfY21kczIuYzoyMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiXCIlcyVzXCIg1tC2z7XjOiC12iAlbGQg0NAiCisKKyM6IGV4X2NtZHMyLmM6Mzg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTog1dKyu7W91tC2z7XjOiAlcyIKKworIzogZXhfY21kczIuYzo0MTQKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICLDu9PQtqjS5dbQts+14yIKKworIzogZXhfY21kczIuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgILXaICVsZCDQ0CIKKworIzogZXhfY21kcy5jOjIwNTMgZXhfY21kcy5jOjIyODkgZXhfY21kczIuYzo2MDIKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICLB7bTmzqoiCisKKyM6IGV4X2NtZHMyLmM6NjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhdmUgY2hhbmdlcyB0byBcIiUuKnNcIj8iCittc2dzdHIgIr2ruMSx5LGjtOa1vSBcIiUuKnNcIj8iCisKKyM6IGV4X2NtZHMyLmM6NjI3IGV4X2RvY21kLmM6ODYxMgorbXNnaWQgIlVudGl0bGVkIgorbXNnc3RyICLOtMP8w/siCisKKyM6IGV4X2NtZHMyLmM6NzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjI6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTYyOiDS0bj8uMS5/bu6s+XH+CBcIiVzXCIgtavJ0M60saO05iAov8nTwyAhIMe/1sbWtNDQKSIKKworIzogZXhfY21kczIuYzo4MzIKK21zZ2lkICJXYXJuaW5nOiBFbnRlcmVkIG90aGVyIGJ1ZmZlciB1bmV4cGVjdGVkbHkgKGNoZWNrIGF1dG9jb21tYW5kcykiCittc2dzdHIgItei0uI6INLRx9C7u7W9xuTL/Lu6s+XH+CAox+u87LLpIEF1dG9jb21tYW5kcyDT0M7etO3O8ykiCisKKyM6IGV4X2NtZHMyLmM6MTIwOAorbXNnaWQgIkUxNjM6IFRoZXJlIGlzIG9ubHkgb25lIGZpbGUgdG8gZWRpdCIKK21zZ3N0ciAiRTE2Mzog1rvT0NK7uPbOxLz+v8mx4LytIgorCisjOiBleF9jbWRzMi5jOjEyMTAKK21zZ2lkICJFMTY0OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGZpbGUiCittc2dzdHIgIkUxNjQ6INLRvq3U2rXa0ru49s7EvP7ByyIKKworIzogZXhfY21kczIuYzoxMjEyCittc2dpZCAiRTE2NTogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGZpbGUiCittc2dzdHIgIkUxNjU6INLRvq3U2tfuuvPSu7j2zsS8/sHLIgorCisjOiBleF9jbWRzMi5jOjE2MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICKy6dXS1tA6IFwiJXNcIiAtLSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAisunV0tbQOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTY3OAorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgZm91bmQgaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorbXNnc3RyICLU2iAncnVudGltZXBhdGgnIMDv1dKyu7W9IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxNzEyCittc2dpZCAiUnVuIE1hY3JvIgorbXNnc3RyICLWtNDQuuoiCisKKyM6IGV4X2NtZHMyLmM6MTgxNworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc291cmNlIGEgZGlyZWN0b3J5OiBcIiVzXCIiCittc2dzdHIgIrK7xNzWtNDQxL/CvKO6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICKyu8Tc1rTQ0CBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg0OQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogY291bGQgbm90IHNvdXJjZSBcIiVzXCIiCittc2dzdHIgIrXaICVsZCDQ0DogsrvE3Na00NAgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAic291cmNpbmcgXCIlc1wiIgorbXNnc3RyICLWtNDQIFwiJXNcIiDW0CIKKworIzogZXhfY21kczIuYzoxODY1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIrXaICVsZCDQ0DogveHK+Na00NAgJXMiCisKKyM6IGV4X2NtZHMyLmM6MTk3MQorIywgYy1mb3JtYXQKK21zZ2lkICJmaW5pc2hlZCBzb3VyY2luZyAlcyIKK21zZ3N0ciAiveHK+Na00NAgJXMiCisKKyM6IGV4X2NtZHMyLmM6MjI3MgorbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6INei0uI6ILTtzvO1xNDQt9a49NfWt/ujrL/JxNzKx8nZwcsgXk0iCisKKyM6IGV4X2NtZHMyLmM6MjMyMQorbXNnaWQgIkUxNjc6IDpzY3JpcHRlbmNvZGluZyB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjc6INTa1rTQ0CBzY3JpcHQgzsS8/s3isru/ycq508MgOnNjcmlwdGVuY29kaW5nIgorCisjOiBleF9jbWRzMi5jOjIzNTQKK21zZ2lkICJFMTY4OiA6ZmluaXNoIHVzZWQgb3V0c2lkZSBvZiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTE2ODog1NrWtNDQIHNjcmlwdCDOxLz+zeKyu7/JyrnTwyA6ZmluaXNoIgorCisjOiBleF9jbWRzMi5jOjI4MjAKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIsO709DSqrTy06G1xM7E19YiCisKKyM6IGV4X2NtZHMyLmM6Mjg5OAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAitPLTodbQOiC12iAlZCDSsyAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MjkwNworIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAiuLTWxiAlZCAvICVkIgorCisjOiBleF9jbWRzMi5jOjI5NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgItLRtPLToTogJXMiCisKKyM6IGV4X2NtZHMyLmM6Mjk2NgorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIrTy06HW0LbPIgorCisjOiBleF9jbWRzMi5jOjMzNDQKK21zZ2lkICJFNDU1OiBFcnJvciB3cml0aW5nIHRvIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkU0NTU6INC0yOsgUG9zdFNjcmlwdCDOxLz+s/a07SIKKworIzogZXhfY21kczIuYzo0MDE5Cittc2dpZCAiRTMyNDogQ2FuJ3Qgb3BlbiBQb3N0U2NyaXB0IG91dHB1dCBmaWxlIgorbXNnc3RyICJFMzI0OiCyu8TctPK/qiBQb3N0U2NyaXB0IMrks/bOxLz+IgorCisjOiBleF9jbWRzMi5jOjQwNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NjogQ2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NjogsrvE3LTyv6rOxLz+IFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0MDY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTc6IENhbid0IHJlYWQgUG9zdFNjcmlwdCByZXNvdXJjZSBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ1NzogsrvE3LbBIFBvc3RTY3JpcHQg18rUtM7EvP4gXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQyNjYKK21zZ2lkICJTZW5kaW5nIHRvIHByaW50ZXIuLi4iCittc2dzdHIgIreiy821vbTy06G7+i4uLiIKKworIzogZXhfY21kczIuYzo0MjcwCittc2dpZCAiRTM2NTogRmFpbGVkIHRvIHByaW50IFBvc3RTY3JpcHQgZmlsZSIKK21zZ3N0ciAiRTM2NTogtPLToSBQb3N0U2NyaXB0IM7EvP7Kp7DcIgorCisjOiBleF9jbWRzMi5jOjQyNzIKK21zZ2lkICJQcmludCBqb2Igc2VudC4iCittc2dzdHIgIiIKKworIzogZXhfY21kczIuYzo0NjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICLEv8ewtcQgJXPT79HUOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDY1MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogsrvE3MnotqjT79HUzqogXCIlc1wiIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICDKrsH5vfjWxiAlMDJ4LCAgsMu9+NbGICUwM28iCisKKyM6IGV4X2NtZHMuYzo0MjgKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogsrvE3LDR0NDSxrW9y/zX1NLRxNoiCisKKyM6IGV4X2NtZHMuYzo0OTcKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgItLR0sa2ryAxINDQIgorCisjOiBleF9jbWRzLmM6NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAi0tGw4dLGICVsZCDQ0CIKKworIzogZXhfY21kcy5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgItLRtKbA7SAlbGQg0NAiCisKKyM6IGV4X2NtZHMuYzo5MTgKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZCCyu7/J0tS4/LjEu7qz5cf4tcTE2sjdIgorCisjOiBleF9jbWRzLmM6MTAwMworbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW7j80MK688nQzrSxo7TmXVxuIgorCisjOiBleF9jbWRzLmM6MTI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ2aW1pbmZvOiAlcyBpbiBsaW5lOiAiCittc2dzdHIgInZpbWluZm86ICVzINTa0NDW0DogIgorCisjOiBleF9jbWRzLmM6MTI1MworbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiC5/bbgtO3O8ywguvbC1M7EvP7G5NPgsr+31iIKKworIzogZXhfY21kcy5jOjEyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICK2wcihIHZpbWluZm8gzsS8/iBcIiVzXCIlcyVzJXMiCisKKyM6IGV4X2NtZHMuYzoxMjgzCittc2dpZCAiIGluZm8iCittc2dzdHIgIiDQxc+iIgorCisjOiBleF9jbWRzLmM6MTI4NAorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiILHqvMciCisKKyM6IGV4X2NtZHMuYzoxMjg1Cittc2dpZCAiIEZBSUxFRCIKK21zZ3N0ciAiIMqnsNwiCisKKyM6IGV4X2NtZHMuYzoxMzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzc6IFZpbWluZm8gZmlsZSBpcyBub3Qgd3JpdGFibGU6ICVzIgorbXNnc3RyICJFMTM3OiBWaW1pbmZvIM7EvP6yu8Tc0LTI6zogJXMiCisKKyM6IGV4X2NtZHMuYzoxNTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMzg6IENhbid0IHdyaXRlIHZpbWluZm8gZmlsZSAlcyEiCittc2dzdHIgIkUxMzg6ILK7xNzQtMjrIHZpbWluZm8gzsS8/iAlcyAhIgorCisjOiBleF9jbWRzLmM6MTUwOQorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHZpbWluZm8gZmlsZSBcIiVzXCIiCittc2dzdHIgItC0yOsgdmltaW5mbyDOxLz+IFwiJXNcIiDW0CIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTYxMAorIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIHZpbWluZm8gzsS8/srH08kgdmltICVzIMv5svrJ+i5cbiIKKworIzogZXhfY21kcy5jOjE2MTIKK21zZ2lkICIiCisiIyBZb3UgbWF5IGVkaXQgaXQgaWYgeW91J3JlIGNhcmVmdWwhXG4iCisiXG4iCittc2dzdHIgIiIKKyIjIMjnufvP69Kq19TQ0NDeuMTH68zYsfDQodDEo6FcbiIKKyJcbiIKKworIzogZXhfY21kcy5jOjE2MTQKK21zZ2lkICIjIFZhbHVlIG9mICdlbmNvZGluZycgd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW5cbiIKK21zZ3N0ciAiIyAnZW5jb2RpbmcnINTatMvOxLz+vajBosqxtcTWtVxuIgorCisjOiBleF9jbWRzLmM6MTcxMworbXNnaWQgIklsbGVnYWwgc3RhcnRpbmcgY2hhciIKK21zZ3N0ciAizt7Qp7XExvS2r9fWt/siCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjA5NgorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiDE+tTawe3Su7j2u7qz5cf40rK809TYwcvV4rj2zsS8/iIKKworIzogZXhfY21kcy5jOjIxMzAKK21zZ2lkICJXcml0ZSBwYXJ0aWFsIGZpbGU/IgorbXNnc3RyICLSqtC0yOuyv7fWzsS8/sLwo78iCisKKyM6IGV4X2NtZHMuYzoyMTM3Cittc2dpZCAiRTE0MDogVXNlICEgdG8gd3JpdGUgcGFydGlhbCBidWZmZXIiCittc2dzdHIgIkUxNDA6IMfryrnTwyAhIMC00LTI67K/t9a7urPlx/giCisKKyM6IGV4X2NtZHMuYzoyMjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAi0qq4srjH0tG05tTatcTOxLz+IFwiJS4qc1wio78iCisKKyM6IGV4X2NtZHMuYzoyMjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDE6IE5vIGZpbGUgbmFtZSBmb3IgYnVmZmVyICVsZCIKK21zZ3N0ciAiRTE0MTogu7qz5cf4ICVsZCDDu9PQzsS8/sP7IgorCisjOiBleF9jbWRzLmM6MjMzMgorbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IM7EvP7OtNC0yOujrNLyzqogJ3dyaXRlJyDRoc/uudix1SIKKworIzogZXhfY21kcy5jOjIzNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIlwiJS4qc1wiINLRyei2qCAncmVhZG9ubHknINGhz+4uXG4iCisiyLe2qNKquLK4x8Lwo78iCisKKyM6IGV4X2NtZHMuYzoyNTE3Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICKx4LytzsS8/iIKKworIzogZXhfY21kcy5jOjMwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9jb21tYW5kcyDS4s3itdjJvrP90MK7urPlx/ggJXMiCisKKyM6IGV4X2NtZHMuYzozMTU2Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IDp6ILK7vdPK3LfHyv3X1rXEss7K/SIKKworIzogZXhfY21kcy5jOjMyNDEKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltINbQvfvWucq508Mgc2hlbGwgw/zB7iIKKworIzogZXhfY21kcy5jOjMzNDgKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiDV/dTyse2078q9srvE3NPD19bEuLfWuPQgKD8pIgorCisjOiBleF9jbWRzLmM6MzY4NgorIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICLM5ru7zqogJXMgKHkvbi9hL3EvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQwNTAKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKNLR1tC2zykgIgorCisjOiBleF9jbWRzLmM6NDA1NAorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICLM5ru70rvX6SIKKworIzogZXhfY21kcy5jOjQwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIszmu7sgJWxkINfpIgorCisjOiBleF9jbWRzLmM6NDA1OQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiDSu9DQ1tAiCisKKyM6IGV4X2NtZHMuYzo0MDYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiAlbGQg0NDW0CIKKworIzogZXhfY21kcy5jOjQxMTIKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IDpnbG9iYWwgsrvE3LXduenWtNDQIgorCisjOiBleF9jbWRzLmM6NDE0NworbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiDDu9PQyrnTw7n91f3U8rHttO/KvSAoPykiCisKKyM6IGV4X2NtZHMuYzo0MTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIsO/0rvQ0La81dKyu7W9xKPKvTogJXMiCisKKyM6IGV4X2NtZHMuYzo0Mjc3Cittc2dpZCAiIgorIlxuIgorIiMgTGFzdCBTdWJzdGl0dXRlIFN0cmluZzpcbiIKKyIkIgorbXNnc3RyICIiCisiXG4iCisiIyDHsNK71+nM5rT619a3+7SuOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0Mzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogsafHuCwgw7vT0CAlcyC1xMu1w/ciCisKKyM6IGV4X2NtZHMuYzo0NDEwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAisafHuCwg1dKyu7W9sO/W+s7EvP4gXCIlc1wiIgorCisjOiBleF9jbWRzLmM6NDg1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUwOiBOb3QgYSBkaXJlY3Rvcnk6ICVzIgorbXNnc3RyICJFMTUwOiAlcyCyu8rHxL/CvCIKKworIzogZXhfY21kcy5jOjQ4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6ILK7xNzS1NC0yOvEo8q9tPK/qiBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo0ODk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiCyu8TctsHIoc7EvP46ICVzIgorCisjOiBleF9jbWRzLmM6NDk3NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiCx6sepKHRhZykgXCIlc1wiINTazsS8/iAlcyDA79bYuLSz9s/WtuC0ziIKKworIzogZXhfY21kcy5jOjUwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiDOtLao0uW1xCBzaWduIGNvbW1hbmQ6ICVzIgorCisjOiBleF9jbWRzLmM6NTA5OAorbXNnaWQgIkUxNTY6IE1pc3Npbmcgc2lnbiBuYW1lIgorbXNnc3RyICJFMTU2OiDIscnZIHNpZ24gw/uzxiIKKworIzogZXhfY21kcy5jOjUxNDQKK21zZ2lkICJFMjU1OiBUb28gbWFueSBzaWducyBkZWZpbmVkIgorbXNnc3RyICJFMzI2OiDV0rW9zKu24CBzaWducyIKKworIzogZXhfY21kcy5jOjUxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiCyu9X9yLe1xCBzaWduIM7E19Y6ICVzIgorCisjOiBleF9jbWRzLmM6NTIxMCBleF9jbWRzLmM6NTM5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiCyu9X9yLe1xCBzaWduOiAlcyIKKworIzogZXhfY21kcy5jOjUyNTYKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiDIscnZIHNpZ24gbnVtYmVyIgorCisjOiBleF9jbWRzLmM6NTMzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODogu7qz5cf4w/uzxrTtzvM6ICVzIgorCisjOiBleF9jbWRzLmM6NTM3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogU2lnbiBJRCC07c7zOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1NTQ2Cittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJb0tHJvrP9XSIKKworIzogZXhfZG9jbWQuYzo0OTEKK21zZ2lkICJFbnRlcmluZyBFeCBtb2RlLiAgVHlwZSBcInZpc3VhbFwiIHRvIGdvIHRvIE5vcm1hbCBtb2RlLiIKK21zZ3N0ciAivfjI6yBFeCDEo8q9LiDK5MjrIFwidmlzdWFcIiDS1LvYtb3V/bOjxKPKvS4iCisKKyMuIG11c3QgYmUgYXQgRU9GCisjOiBleF9kb2NtZC5jOjUyNworbXNnaWQgIkF0IGVuZC1vZi1maWxlIgorbXNnc3RyICLS0bW9zsS8/r3hzrIiCisKKyM6IGV4X2RvY21kLmM6NjAyCittc2dpZCAiRTE2OTogQ29tbWFuZCB0b28gcmVjdXJzaXZlIgorbXNnc3RyICJFMTY5OiDD/MHutd256bLjyv25/bbgIgorCisjOiBleF9kb2NtZC5jOjkxMQorbXNnaWQgIkUxNzA6IE1pc3NpbmcgOmVuZHdoaWxlIgorbXNnc3RyICJFMTcwOiDIscnZIDplbmR3aGlsZSIKKworIzogZXhfZG9jbWQuYzo5MTMKK21zZ2lkICJFMTcxOiBNaXNzaW5nIDplbmRpZiIKK21zZ3N0ciAiRTE3MTogyLHJ2SA6ZW5kaWYiCisKKyM6IGV4X2RvY21kLmM6OTIzCittc2dpZCAiRW5kIG9mIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiw/zB7s7EvP694cr4IgorCisjOiBleF9kb2NtZC5jOjkyNAorbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAiuq/K/b3hzrIiCisKKyM6IGV4X2RvY21kLmM6MTM0NAorbXNnaWQgIkFtYmlndW91cyB1c2Ugb2YgdXNlci1kZWZpbmVkIGNvbW1hbmQiCittc2dzdHIgItPDu6e2qNLltcTD/MHuu+G77M/9IgorCisjOiBleF9kb2NtZC5jOjEzNTgKK21zZ2lkICJOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIrK7ysex4Lytxve1xMP8we4iCisKKyM6IGV4X2RvY21kLmM6MTQ0MQorbXNnaWQgIkRvbid0IHBhbmljISIKK21zZ3N0ciAisrvSqr6qu8UhIgorCisjOiBleF9kb2NtZC5jOjE0NjAKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIta4tqjBy8/yx7Cyzr+8tcS3ts6nIgorCisjOiBleF9kb2NtZC5jOjE0NjkKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIta4tqjBy8/yx7Cyzr+8tcS3ts6no6xPSyB0byBzd2FwIgorCisjOiBleF9kb2NtZC5jOjE1ODAKK21zZ2lkICJVc2UgdyBvciB3Pj4iCittc2dzdHIgIsfryrnTwyB3ILvyIHc+PiIKKworIzogZXhfZG9jbWQuYzozMDg2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiCxp8e4LCCxvsP8we7U2rTLsOaxvtbQzrTKtc/WIgorCisjOiBleF9kb2NtZC5jOjMyNTYKK21zZ2lkICJFMTcyOiBPbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZCIKK21zZ3N0ciAiRTE3Mjog1rvE3NPQ0ru49s7EvP7D+yIKKworIzogZXhfZG9jbWQuYzozODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAiu7nT0CAlZCC49s7EvP7OtLHgvK0uIMi3tqjSqs3Ls/ajvyIKKworIzogZXhfZG9jbWQuYzozODE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzM6ICVsZCBtb3JlIGZpbGVzIHRvIGVkaXQiCittc2dzdHIgIkUxNzM6ILu509AgJWxkILj2zsS8/s60seC8rSIKKworIzogZXhfZG9jbWQuYzozOTExCittc2dpZCAiRTE3NDogQ29tbWFuZCBhbHJlYWR5IGV4aXN0czogdXNlICEgdG8gcmVkZWZpbmUiCittc2dzdHIgIkUxNzQ6IMP8we7S0b6ttObU2iwgx+vKudPDICEgx7/WxtbY0MK2qNLlIgorCisjOiBleF9kb2NtZC5jOjQwMTYKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgw/uzxiAgICAgICAgss7K/SC3ts6nICDN6tX7ICAgICAgtqjS5SAgICAgICIKKworIzogZXhfZG9jbWQuYzo0MTA1Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICLV0rK7tb3Tw7un19S2qNLltcTD/MHuIgorCisjOiBleF9kb2NtZC5jOjQxMzYKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiDDu9PQ1ri2qLXEyvTQ1CIKKworIzogZXhfZG9jbWQuYzo0MTg4Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiCyu9X9yLe1xLLOyv249sr9IgorCisjOiBleF9kb2NtZC5jOjQyMDMKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiCyu8Tc1ri2qMG9tM4iCisKKyM6IGV4X2RvY21kLmM6NDIxMworbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6ILzGyv21xMixyqHWtbK71f3ItyIKKworIzogZXhfZG9jbWQuYzo0MjQxCittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiDWuMHu0OjSqrLOyv2yxcTczeqzySIKKworIzogZXhfZG9jbWQuYzo0MjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiCyu83q1fu1xNa1OiAnJXMnIgorCisjOiBleF9kb2NtZC5jOjQyNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiCyu9X9yLe1xMr00NQ6ICVzIgorCisjOiBleF9kb2NtZC5jOjQzMDkKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4Mjogw/zB7sP7s8ayu9X9yLciCisKKyM6IGV4X2RvY21kLmM6NDMyNAorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiRTE4Mzog08O7p9fUtqjS5cP8we6x2NDr0tS089C019bEuL+qyrwiCisKKyM6IGV4X2RvY21kLmM6NDM5MworIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogw7vT0NPDu6fX1Lao0uW1xMP8we6juiAlcyIKKworIzogZXhfZG9jbWQuYzo0ODQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTog1dKyu7W90dXJq9H5yr0gJXMiCisKKyM6IGV4X2RvY21kLmM6NDg1MgorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICLE47rDLCBWaW0g08O7p6OhIgorCisjOiBleF9kb2NtZC5jOjU1NDkKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAi1NrQwrSwv9qx4LytzsS8/iIKKworIzogZXhfZG9jbWQuYzo1ODE1Cittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICLO3r27u7vOxLz+IgorCisjOiBleF9kb2NtZC5jOjU5MTkKK21zZ2lkICJBcHBlbmQgRmlsZSIKK21zZ3N0ciAiuL28087EvP4iCisKKyM6IGV4X2RvY21kLmM6NTk3OAorbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4Njogx7DSu7j2xL/CvLK7tObU2iIKKworIzogZXhfZG9jbWQuYzo2MDU1Cittc2dpZCAiRTE4NzogVW5rbm93biIKK21zZ3N0ciAiRTE4NzogsrvE3Mq2sfC1xLHqvMciCisKKyM6IGV4X2RvY21kLmM6NjE3MworIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIrSwv9rOu9bDOiBYICVkLCBZICVkIgorCisjOiBleF9kb2NtZC5jOjYxNzgKK21zZ2lkICJFMTg4OiBPYnRhaW5pbmcgd2luZG93IHBvc2l0aW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybSIKK21zZ3N0ciAiRTE4ODog1NrE+rXExr3MqMnPsrvE3LvxtcO0sL/azrvWwyIKKworIzogZXhfZG9jbWQuYzo2NDQ0Cittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAisaO05tbYtqjP8iIKKworIzogZXhfZG9jbWQuYzo2NTkzCittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICKxo7TmytPNvCIKKworIzogZXhfZG9jbWQuYzo2NTk0Cittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICKxo7Tmu+G7sCIKKworIzogZXhfZG9jbWQuYzo2NTk2Cittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAisaO05snotqgiCisKKyM6IGV4X2RvY21kLmM6Njc0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg5OiBcIiVzXCIgZXhpc3RzICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUxODk6IFwiJXNcIiDS0bTm1NogKMfr08MgISDHv9bG1rTQ0CkiCisKKyM6IGV4X2RvY21kLmM6Njc1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTkwOiBDYW5ub3Qgb3BlbiBcIiVzXCIgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxOTA6ILK7xNzS1NC0yOvEo8q9tPK/qiBcIiVzXCIiCisKKyMuIHNldCBtYXJrCisjOiBleF9kb2NtZC5jOjY3NzQKK21zZ2lkICJFMTkxOiBBcmd1bWVudCBtdXN0IGJlIGEgbGV0dGVyIG9yIGZvcndhcmQvYmFja3dhcmQgcXVvdGUiCittc2dzdHIgIkUxOTE6ILLOyv2x2NDrysfTos7E19bEuLvyz/LHsC+687XE0v26xSIKKworIzogZXhfZG9jbWQuYzo2ODAzCittc2dpZCAiRTE5MjogUmVjdXJzaXZlIHVzZSBvZiA6bm9ybWFsIHRvbyBkZWVwIgorbXNnc3RyICJFMTkyOiA6bm9ybWFsILXduemy48r9uf3J7iIKKworIzogZXhfZG9jbWQuYzo3MTcxCittc2dpZCAiOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIjppZiCy48r9uf3J7iIKKworIzogZXhfZG9jbWQuYzo3MjA2Cittc2dpZCAiOmVuZGlmIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZW5kaWYgyLHJ2bbU06a1xCA6aWYiCisKKyM6IGV4X2RvY21kLmM6NzIyNgorbXNnaWQgIjplbHNlIHdpdGhvdXQgOmlmIgorbXNnc3RyICI6ZWxzZSDIscnZttTTprXEIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjI4Cittc2dpZCAiOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiOmVsc2VpZiDIscnZttTTprXEIDppZiIKKworIzogZXhfZG9jbWQuYzo3MjgwCittc2dpZCAiOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIjp3aGlsZSCy48r9uf3J7iIKKworIzogZXhfZG9jbWQuYzo3MzI2Cittc2dpZCAiOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6Y29udGludWUgyLHJ2bbU06a1xCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzM1MworbXNnaWQgIjpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiOmJyZWFrIMixydm21NOmtcQgOndoaWxlIgorCisjOiBleF9kb2NtZC5jOjczNzYgZXhfZG9jbWQuYzo3MzgxCittc2dpZCAiOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICI6ZW5kd2hpbGUgyLHJ2bbU06a1xCA6d2hpbGUiCisKKyM6IGV4X2RvY21kLmM6NzQwMgorbXNnaWQgIkUxOTM6IDplbmRmdW5jdGlvbiBub3QgaW5zaWRlIGEgZnVuY3Rpb24iCittc2dzdHIgIkUxOTM6IDplbmRmdW5jdGlvbiCx2NDr1Nq6r8r9xNqyv8q508MiCisKKyM6IGV4X2RvY21kLmM6NzU4MgorbXNnaWQgIkUxOTQ6IE5vIGFsdGVybmF0ZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgJyMnIgorbXNnc3RyICJFMTk0OiDDu9PQICcjJyC/yczmtPq1xM7EvP7D+yIKKworIzogZXhfZG9jbWQuYzo3NjEzCittc2dpZCAibm8gYXV0b2NvbW1hbmQgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yIFwiPGFmaWxlPlwiIgorbXNnc3RyICLDu9PQIEF1dG9jb21tYW5kIM7EvP7D+9LUzOa7uyBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjIxCittc2dpZCAibm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICLDu9PQIEF1dG9jb21tYW5kILu6s+XH+MP7s8bS1Mzmu7sgXCI8YWJ1Zj5cIiIKKworIzogZXhfZG9jbWQuYzo3NjMyCittc2dpZCAibm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIsO709AgQXV0b2NvbW1hbmQgTWF0Y2ggbmFtZSDS1Mzmu7sgXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjc2NDIKK21zZ2lkICJubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiw7vT0CA6c291cmNlIM7EvP7D+9LUzOa7uyBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3NjgzCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICInJScgu/IgJyMnINa4z/K/1c7EvP7D+6Os1rvE3NPD7LYgXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6NzY4NQorbXNnaWQgIkV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIsrkyOvOqr/V19a3+7SuIgorCisjOiBleF9kb2NtZC5jOjg1OTQKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6ILK7xNy2wcihIHZpbWluZm8iCisKKyM6IGV4X2RvY21kLmM6ODc2NworbXNnaWQgIkUxOTY6IE5vIGRpZ3JhcGhzIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTE5Njogsb6w5rG+zt64tLrP19a3+yhkaWdyYXBoKSIKKworIzogZXhfZ2V0bG4uYzoyNzg1Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAiserHqcP7s8YiCisKKyM6IGV4X2dldGxuLmM6Mjc4OAorbXNnaWQgIiBraW5kIGZpbGVcbiIKK21zZ3N0ciAiwODOxLz+XG4iCisKKyM6IGV4X2dldGxuLmM6Mzk5NworbXNnaWQgIidoaXN0b3J5JyBvcHRpb24gaXMgemVybyIKK21zZ3N0ciAi0aHP7iAnaGlzdG9yeScgysfB4yIKKworIzogZXhfZ2V0bG4uYzo0MjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIjICVzIEhpc3RvcnkgKG5ld2VzdCB0byBvbGRlc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyAlcyDA+sq3vMfCvCAotNPQwrW9vskpOlxuIgorCisjOiBleF9nZXRsbi5jOjQyMzgKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgIsP8we7Q0CIKKworIzogZXhfZ2V0bG4uYzo0MjM5Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAisunV0tfWt/u0riIKKworIzogZXhfZ2V0bG4uYzo0MjQwCittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAise2078q9IgorCisjOiBleF9nZXRsbi5jOjQyNDEKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICLK5Mjr0NAiCisKKyM6IGV4X2dldGxuLmM6NDI3MQorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIgs6y5/cP8we6zpLbIIgorCisjOiBleF9nZXRsbi5jOjQ0MzUKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiDS0cm+s/277ravtLC/2rvyu7q05iIKKworIzogZmlsZWlvLmM6MzQ3Cittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIrK71f3It7XEzsS8/sP7IgorCisjOiBmaWxlaW8uYzozNzEgZmlsZWlvLmM6NDk1IGZpbGVpby5jOjI0OTEgZmlsZWlvLmM6MjUyOQorbXNnaWQgImlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICLKx8S/wrwiCisKKyM6IGZpbGVpby5jOjM3MworbXNnaWQgImlzIG5vdCBhIGZpbGUiCittc2dzdHIgIrK7ysfOxLz+IgorCisjOiBmaWxlaW8uYzo1MTUgZmlsZWlvLmM6MzU4MQorbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIlvOtMP8w/tdIgorCisjOiBmaWxlaW8uYzo1MzIKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJbyKjP3rK71+NdIgorCisjOiBmaWxlaW8uYzo2MjQKK21zZ2lkICJFMjAwOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbWFkZSB0aGUgZmlsZSB1bnJlYWRhYmxlIgorbXNnc3RyICJFMjAwOiAqUmVhZFByZSBBdXRvY29tbWFuZCDKubPM0PKyu8TctsHIobTLzsS8/iIKKworIzogZmlsZWlvLmM6NjI2Cittc2dpZCAiRTIwMTogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG11c3Qgbm90IGNoYW5nZSBjdXJyZW50IGJ1ZmZlciIKK21zZ3N0ciAiRTIwMTogKkZpbHRlciogQXV0b2NvbW1hbmQgsru/ydLUuPy4xLu6s+XH+LXExNrI3SIKKworIzogZmlsZWlvLmM6NjQ2Cittc2dpZCAiVmltOiBSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiIKK21zZ3N0ciAiVmltOiC007Hq17zK5MjrtsHIoS4uLlxuIgorCisjOiBmaWxlaW8uYzo2NTIKK21zZ2lkICJSZWFkaW5nIGZyb20gc3RkaW4uLi4iCittc2dzdHIgIrTTserXvMrkyOu2wS4uLiIKKworIy4gUmUtb3BlbmluZyB0aGUgb3JpZ2luYWwgZmlsZSBmYWlsZWQhCisjOiBmaWxlaW8uYzo4NzYKK21zZ2lkICJFMjAyOiBDb252ZXJzaW9uIG1hZGUgZmlsZSB1bnJlYWRhYmxlISIKK21zZ3N0ciAiRTIwMjog16q7u7TtzvMiCisKKyM6IGZpbGVpby5jOjE3MzIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxNzM5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjE3NDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE3NTQKK21zZ2lkICJbUk9dIgorbXNnc3RyICJb1ru2wV0iCisKKyM6IGZpbGVpby5jOjE3NjQKK21zZ2lkICJbQ1IgbWlzc2luZ10iCittc2dzdHIgIlvIscnZQ1JdJyIKKworIzogZmlsZWlvLmM6MTc2OQorbXNnaWQgIltOTCBmb3VuZF0iCittc2dzdHIgIlvV0rW9TkxdIgorCisjOiBmaWxlaW8uYzoxNzc0Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJbt9a47rn9s6TQ0F0iCisKKyM6IGZpbGVpby5jOjE3ODAgZmlsZWlvLmM6MzU2NQorbXNnaWQgIltOT1QgY29udmVydGVkXSIKK21zZ3N0ciAiW86016q7u10iCisKKyM6IGZpbGVpby5jOjE3ODUgZmlsZWlvLmM6MzU3MAorbXNnaWQgIltjb252ZXJ0ZWRdIgorbXNnc3RyICJb0tHXqru7XSIKKworIzogZmlsZWlvLmM6MTc5MiBmaWxlaW8uYzozNTk1Cittc2dpZCAiW2NyeXB0ZWRdIgorbXNnc3RyICJb0tG808PcXSIKKworIzogZmlsZWlvLmM6MTc5OQorbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKK21zZ3N0ciAi16q7u7TtzvMiCisKKyM6IGZpbGVpby5jOjE4MDYKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJbtsG07c7zXSIKKworIzogZmlsZWlvLmM6MjAxMworbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICLV0rK7tb3Xqru708O1xMHZyrHOxLz+IgorCisjOiBmaWxlaW8uYzoyMDIwCittc2dpZCAiQ29udmVyc2lvbiB3aXRoICdjaGFyY29udmVydCcgZmFpbGVkIgorbXNnc3RyICLX1rf7vK/Xqru7tO3O8yIKKworIzogZmlsZWlvLmM6MjAyMworbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIrK7xNy2wcihICdjaGFyY29udmVydCcgtcTK5LP2IgorCisjOiBmaWxlaW8uYzoyNDA3Cittc2dpZCAiRTIwMzogQXV0b2NvbW1hbmRzIGRlbGV0ZWQgb3IgdW5sb2FkZWQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4iCittc2dzdHIgIkUyMDM6IEF1dG9jb21tYW5kIMm+s/278srNt8XBy9Kq0LTI67XEu7qz5cf4IgorCisjOiBmaWxlaW8uYzoyNDMwCittc2dpZCAiRTIwNDogQXV0b2NvbW1hbmQgY2hhbmdlZCBudW1iZXIgb2YgbGluZXMgaW4gdW5leHBlY3RlZCB3YXkiCittc2dzdHIgIkUyMDQ6IEF1dG9jb21tYW5kINLizeK12LjEseTBy9DQusUiCisKKyM6IGZpbGVpby5jOjI0OTYgZmlsZWlvLmM6MjUxMworbXNnaWQgImlzIG5vdCBhIGZpbGUgb3Igd3JpdGFibGUgZGV2aWNlIgorbXNnc3RyICKyu8rHzsS8/rvyv8nQtLXEyeixuCIKKworIzogZmlsZWlvLmM6MjU1NQorbXNnaWQgImlzIHJlYWQtb25seSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICLKx9a7tsHOxLz+ICjH68q508MgISDHv9bG1rTQ0CkiCisKKyM6IGZpbGVpby5jOjI4NTEKK21zZ2lkICJDYW4ndCB3cml0ZSB0byBiYWNrdXAgZmlsZSAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICKyu8Tc0LSxuLfdzsS8/iAox+vKudPDICEgx7/Wxta00NApIgorCisjOiBmaWxlaW8uYzoyODYzCittc2dpZCAiQ2xvc2UgZXJyb3IgZm9yIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIrnYsdWxuLfdzsS8/rP2tO0gKMfryrnTwyAhIMe/1sbWtNDQKSIKKworIzogZmlsZWlvLmM6Mjg2NQorbXNnaWQgIkNhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIrK7xNy2wcihzsS8/tLUuamxuLfdICjH68q508MgISDHv9bG1rTQ0CkiCisKKyM6IGZpbGVpby5jOjI4ODEKK21zZ2lkICJDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIrK7xNy0tL2osbi33c7EvP4gKMfryrnTwyAhIMe/1sbWtNDQKSIKKworIzogZmlsZWlvLmM6Mjk3MAorbXNnaWQgIkNhbid0IG1ha2UgYmFja3VwIGZpbGUgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAisrvE3Nf3sbi33c7EvP4gKMfryrnTwyAhIMe/1sbWtNDQKSIKKworIzogZmlsZWlvLmM6MzAzMgorbXNnaWQgIlRoZSByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCAodXNlICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJSZXNvdXJjZSBmb3JrILvhz/vKpyAox+vKudPDICEgx7/Wxta00NApIgorCisjOiBmaWxlaW8uYzozMTIxCittc2dpZCAiRTIxNDogQ2FuJ3QgZmluZCB0ZW1wIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUyMTQ6INXSsru1vdC0yOvTw7XEvbu7u87EvP4iCisKKyM6IGZpbGVpby5jOjMxMzkKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAodXNlICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogsrvE3Nequ7sgKMfryrnTwyAhIMe/1sayu9equ7vQtMjrKSIKKworIzogZmlsZWlvLmM6MzE3NgorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6ILK7xNzS1NC0yOvEo8q9tPK/qsG0vdPOxLz+IgorCisjOiBmaWxlaW8uYzozMTgwCittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiCyu8Tc0tTQtMjrxKPKvbTyv6oiCisKKyM6IGZpbGVpby5jOjM0MjMKK21zZ2lkICJDbG9zZSBmYWlsZWQiCittc2dzdHIgIrnYsdXKp7DcIgorCisjOiBmaWxlaW8uYzozNDgxCittc2dpZCAid3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICKyu8Tc0LTI6yAtLSDXqru7yqew3CIKKworIzogZmlsZWlvLmM6MzQ4NworbXNnaWQgIndyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgItC0yOu07c7zICjOxLz+z7XNs9LRwvqjvykiCisKKyM6IGZpbGVpby5jOjM1NjAKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAi16q7u7TtzvMiCisKKyM6IGZpbGVpby5jOjM1NzYKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW8nosbhdIgorCisjOiBmaWxlaW8uYzozNTgxCittc2dpZCAiW05ld10iCittc2dzdHIgIlvQwl0iCisKKyM6IGZpbGVpby5jOjM2MDMKK21zZ2lkICIgW2FdIgorbXNnc3RyICJbYV0iCisKKyM6IGZpbGVpby5jOjM2MDMKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiDS0bi9vNMiCisKKyM6IGZpbGVpby5jOjM2MDUKK21zZ2lkICIgW3ddIgorbXNnc3RyICJbd10iCisKKyM6IGZpbGVpby5jOjM2MDUKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiINLR0LTI6yIKKworIzogZmlsZWlvLmM6MzY1NQorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBQYXRjaCDEo8q9OiCyu8TctKK05tStyrzOxLz+IgorCisjOiBmaWxlaW8uYzozNjc3Cittc2dpZCAiRTIwNjogcGF0Y2htb2RlOiBjYW4ndCB0b3VjaCBlbXB0eSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA2OiBQYXRjaCDEo8q9OiCyu8TcuMSx5L/VtcTUrcq8zsS8/iIKKworIzogZmlsZWlvLmM6MzY5MgorbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogsrvE3Mm+s/2xuLfdzsS8/iIKKworIzogZmlsZWlvLmM6Mzc0NAorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIr6vuOY6INStyrzOxLz+tqrKp7vyy/C7tVxuIgorCisjOiBmaWxlaW8uYzozNzQ2Cittc2dpZCAiZG9uJ3QgcXVpdCB0aGUgZWRpdG9yIHVudGlsIHRoZSBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKK21zZ3N0ciAi1NrOxLz+1f3It9C0yOvHsMfrzvDNy7P2seC8rcb3ISIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3NdIgorbXNnc3RyICJbZG9zXSIKKworIzogZmlsZWlvLmM6MzgyNgorbXNnaWQgIltkb3MgZm9ybWF0XSIKK21zZ3N0ciAiW2RvcyC48cq9XSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWNdIgorbXNnc3RyICJbbWFjXSIKKworIzogZmlsZWlvLmM6MzgzMworbXNnaWQgIlttYWMgZm9ybWF0XSIKK21zZ3N0ciAiW21hYyC48cq9XSIKKworIzogZmlsZWlvLmM6Mzg0MAorbXNnaWQgIlt1bml4XSIKK21zZ3N0ciAiW3VuaXhdIgorCisjOiBmaWxlaW8uYzozODQwCittc2dpZCAiW3VuaXggZm9ybWF0XSIKK21zZ3N0ciAiW3VuaXgguPHKvV0iCisKKyM6IGZpbGVpby5jOjM4NjcKK21zZ2lkICIxIGxpbmUsICIKK21zZ3N0ciAiMSDQ0CwgIgorCisjOiBmaWxlaW8uYzozODY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQg0NAsICIKKworIzogZmlsZWlvLmM6Mzg3MgorbXNnaWQgIjEgY2hhcmFjdGVyIgorbXNnc3RyICLSu7j219a3+yIKKworIzogZmlsZWlvLmM6Mzg3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhcmFjdGVycyIKK21zZ3N0ciAiJWxkuPbX1rf7IgorCisjOiBmaWxlaW8uYzozODg0Cittc2dpZCAiW25vZW9sXSIKK21zZ3N0ciAiW25vZW9sXSIKKworIzogZmlsZWlvLmM6Mzg4NAorbXNnaWQgIltJbmNvbXBsZXRlIGxhc3QgbGluZV0iCittc2dzdHIgIlvX7rrz0rvQ0LK7zerV+10iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6MzkwMworbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAivq+45jogsb7OxLz+19TJz7TOtsHI67rz0tGx5LavISEhIgorCisjOiBmaWxlaW8uYzozOTA1Cittc2dpZCAiRG8geW91IHJlYWxseSB3YW50IHRvIHdyaXRlIHRvIGl0IgorbXNnc3RyICLIt7ao0qrQtMjrwvAiCisKKyM6IGZpbGVpby5jOjQ4NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwODogRXJyb3Igd3JpdGluZyB0byBcIiVzXCIiCittc2dzdHIgIkUyMDg6INC0yOvOxLz+IFwiJXNcIiC07c7zIgorCisjOiBmaWxlaW8uYzo0ODY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMDk6IEVycm9yIGNsb3NpbmcgXCIlc1wiIgorbXNnc3RyICJFMjA5OiC52LHVzsS8/iBcIiVzXCIgtO3O8yIKKworIzogZmlsZWlvLmM6NDg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjEwOiBFcnJvciByZWFkaW5nIFwiJXNcIiIKK21zZ3N0ciAiRTIxMDogtsHIoc7EvP4gXCIlc1wiILTtzvMiCisKKyM6IGZpbGVpby5jOjUwMzUKK21zZ2lkICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICJFMjQ2OiBGaWxlQ2hhbmdlZFNoZWxsIGF1dG9jb21tYW5kIMm+s/27urPlx/giCisKKyM6IGZpbGVpby5jOjUwNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxMTogV2FybmluZzogRmlsZSBcIiVzXCIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKK21zZ3N0ciAiRTIxMTogvq+45jogzsS8/iBcIiVzXCIg0tG+rbK7tObU2iIKKworIzogZmlsZWlvLmM6NTA1NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVzEyOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgY2hhbmdlZCBpbiBWaW0gYXMgIgorIndlbGwiCittc2dzdHIgIlcxMjogvq+45jogzsS8/iBcIiVzXCIg19TJz7TOtsHI67rz0tGx5LavLCC2+MfSseC8rdbQtcS7urPlx/jSsrj8tq/ByyIKKworIzogZmlsZWlvLmM6NTA1OQorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiC+r7jmOiDOxLz+IFwiJXNcIiDX1MnPtM62wcjruvPS0bjEseQiCisKKyM6IGZpbGVpby5jOjUwNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzE2OiBXYXJuaW5nOiBNb2RlIG9mIGZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzE2OiC+r7jmOiDOxLz+IFwiJXNcIiDX1MnPtM62wcjruvPS0bjEseQiCisKKyM6IGZpbGVpby5jOjUwNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVzEzOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzEzOiC+r7jmOiDOxLz+IFwiJXNcIiDU2r+qyryx4LytuvPT1rG7tLS9qMHLIgorCisjOiBmaWxlaW8uYzo1MDg4Cittc2dpZCAiV2FybmluZyIKK21zZ3N0ciAivq+45iIKKworIzogZmlsZWlvLmM6NTA4OQorbXNnaWQgIiIKKyImT0tcbiIKKyImTG9hZCBGaWxlIgorbXNnc3RyICIiCisiyLe2qCgmTylcbiIKKyK809TYzsS8/igmTCkiCisKKyM6IGZpbGVpby5jOjUxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMTogQ291bGQgbm90IHJlbG9hZCBcIiVzXCIiCittc2dzdHIgIkUzMjE6ILK7xNzW2NDCvNPU2CBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjU2NzAKK21zZ2lkICItLURlbGV0ZWQtLSIKK21zZ3N0ciAiLS3S0cm+s/0tLSIKKworIy4gdGhlIGdyb3VwIGRvZXNuJ3QgZXhpc3QKKyM6IGZpbGVpby5jOjU4MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NzogTm8gc3VjaCBncm91cDogXCIlc1wiIgorbXNnc3RyICJFMzY3OiDX6bK7tObU2jogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1OTU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTU6IElsbGVnYWwgY2hhcmFjdGVyIGFmdGVyICo6ICVzIgorbXNnc3RyICJFMjE1OiAqILrzw+bT0LK71f3It7XE19a3+zogJXMiCisKKyM6IGZpbGVpby5jOjU5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNjogTm8gc3VjaCBldmVudDogJXMiCittc2dzdHIgIkUyMTY6IM7etMvKwrz+OiAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo2MTE1Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKKworIzogZmlsZWlvLmM6NjM4NgorbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiCyu8TcttTL+dPQysK8/ta00NAgYXV0b2NvbW1hbmQiCisKKyM6IGZpbGVpby5jOjY0MDkKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgItXSsru1vbbU06a1xCBhdXRvY29tbWFuZCIKKworIzogZmlsZWlvLmM6NjY4MQorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IGF1dG9jb21tYW5kILLjyv25/cnuIgorCisjOiBmaWxlaW8uYzo2OTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEF1dG8gY29tbWFuZHMgZm9yIFwiJXNcIiIKK21zZ3N0ciAiJXMgQXV0byBjb21tYW5kczogXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2OTc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZyAlcyIKK21zZ3N0ciAi1rTQ0CAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3MDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJhdXRvY29tbWFuZCAlcyIKKworIzogZmlsZWlvLmM6NzU2NgorbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIkUyMTk6IMixydkgey4iCisKKyM6IGZpbGVpby5jOjc1NjgKK21zZ2lkICJFMjIwOiBNaXNzaW5nIH0uIgorbXNnc3RyICJFMjIwOiDIscnZIH0uIgorCisjOiBmb2xkLmM6NjYKK21zZ2lkICJObyBmb2xkIGZvdW5kIgorbXNnc3RyICLV0rK7tb3IzrrOIGZvbGQiCisKKyM6IGZvbGQuYzo1NTQKK21zZ2lkICJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MDogsrvE3NTaxL/HsLXEICdmb2xkbWV0aG9kJyDPwrS0vaggZm9sZCIKKworIzogZm9sZC5jOjU1NgorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiCyu8Tc1NrEv8ewtcQgJ2ZvbGRtZXRob2QnIM/Cyb6z/SBmb2xkIgorCisjOiBmb2xkLmM6MTcwMAorbXNnaWQgIkUyMjE6ICdjb21tZW50c3RyaW5nJyBpcyBlbXB0eSIKK21zZ3N0ciAiRTIyMTog0aHP7iAnY29tbWVudHN0cmluZycgzrTJ6LaoIgorCisjOiBnZXRjaGFyLmM6MjY4Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiC808jrtsG7urPl1tAiCisKKyM6IGdldGNoYXIuYzoyMTE0Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6ILXduekgbWFwcGluZyIKKworIzogZ2V0Y2hhci5jOjI5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzINLRvq3T0MirvtYgYWJicmV2aWF0aW9uIMHLIgorCisjOiBnZXRjaGFyLmM6Mjk2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6ICVzINLRvq3T0MirvtYgbWFwcGluZyDByyIKKworIzogZ2V0Y2hhci5jOjMwOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogJXMg0tG+rdPQIGFiYnJldmlhdGlvbiDByyIKKworIzogZ2V0Y2hhci5jOjMwOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6ICVzILXEIG1hcHBpbmcg0tG+rbTm1NoiCisKKyM6IGdldGNoYXIuYzozMTYzCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICLV0rK7tb3L9dC0IgorCisjOiBnZXRjaGFyLmM6MzE2NQorbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIsO709DV4rj2ttTTpiIKKworIzogZ2V0Y2hhci5jOjM5OTAKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6ILK71f3It7XExKPKvSIKKworIzogZ3VpX2F0X2ZzLmM6MjkwCittc2dpZCAiPGNhbm5vdCBvcGVuPiAiCittc2dzdHIgIjyyu8TctPK/qj4iCisKKyM6IGd1aV9hdF9mcy5jOjExMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAidmltX1NlbEZpbGU6IGNhbid0IGdldCBmb250ICVzIgorbXNnc3RyICJ2aW1fU2VsRmlsZTogsrvE3Mq508MgJXMg19bM5SIKKworIzogZ3VpX2F0X2ZzLmM6MjUzNQorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCByZXR1cm4gdG8gY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiCyu8Tcu9i1vcS/x7DEv8K8IgorCisjOiBndWlfYXRfZnMuYzoyNTU0Cittc2dpZCAiUGF0aG5hbWU6IgorbXNnc3RyICLCt762OiIKKworIzogZ3VpX2F0X2ZzLmM6MjU2MAorbXNnaWQgInZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgInZpbV9TZWxGaWxlOiCyu8TcyKG1w8S/x7DEv8K8IgorCisjOiBndWlfYXRfZnMuYzoyNTY4IGd1aV9tb3RpZi5jOjE2MDcKK21zZ2lkICJPSyIKK21zZ3N0ciAiyLe2qCIKKworIy4gJ0NhbmNlbCcgYnV0dG9uCisjOiBndWlfYXRfZnMuYzoyNTY4IGd1aV9ndGsuYzoxNjgzIGd1aV9tb3RpZi5jOjE2MDIgZ3VpX21vdGlmLmM6MjgyMworbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiyKHP+yIKKworIzogZ3VpX2F0aGVuYS5jOjE5MjggZ3VpX21vdGlmLmM6MTg1NQorbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIlZpbSC21Luwv/IiCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAiufa2r8z1OiCyu8Tcyei2qCB0aHVtYiBwaXhtYXAgtcTOu9bDIgorCisjOiBndWlfYmV2YWwuYzo2OAorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICJFMjMyOiCyu8TcttTQxc+i0+sgY2FsbGJhY2sgtLS9qCBCYWxsb25FdmFsIgorCisjOiBndWkuYzoxODEKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTogsrvE3Mb0tq/NvNDNvefD5iIKKworIzogZ3VpLmM6MzA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzA6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjMwOiCyu8TctsHIoc7EvP4gXCIlc1wiIgorCisjOiBndWkuYzo0MzEKK21zZ2lkICJFMjMxOiAnZ3VpZm9udHdpZGUnIGludmFsaWQiCittc2dzdHIgIkUyMzE6ILK71f3It7XEICdndWlmb250d2lkZSciCisKKyM6IGd1aS5jOjM5MTkKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAitO3O8yIKKworIzogZ3VpLmM6MzkyMAorbXNnaWQgIiZPayIKK21zZ3N0ciAiyLe2qCgmTykiCisKKyM6IGd1aV9ndGsuYzoxMTQ0Cittc2dpZCAiVmltIGRpYWxvZy4uLiIKK21zZ3N0ciAiVmltILbUu7C/8i4uLiIKKworIzogZ3VpX2d0ay5jOjE1MTkgZ3VpX21vdGlmLmM6Mjc0MgorbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gsunV0tPrzOa7uy4uLiIKKworIzogZ3VpX2d0ay5jOjE1MjQgZ3VpX21vdGlmLmM6Mjc0NAorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gsunV0i4uLiIKKworIzogZ3VpX2d0ay5jOjE1NDcgZ3VpX21vdGlmLmM6Mjg2MgorbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIrLp1dI6IgorCisjOiBndWlfZ3RrLmM6MTU2NSBndWlfbW90aWYuYzoyODk0Cittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAizOa7u86qOiIKKworIy4gZXhhY3QgbWF0Y2ggb25seSBidXR0b24KKyM6IGd1aV9ndGsuYzoxNTk3IGd1aV9tb3RpZi5jOjI5OTYKK21zZ2lkICJNYXRjaCBleGFjdCB3b3JkIG9ubHkiCittc2dzdHIgIta7xqXF5M3qyKvP4M2stcTX1iIKKworIzogZ3VpX2d0ay5jOjE2MDkgZ3VpX21vdGlmLmM6Mjk2NAorbXNnaWQgIkRpcmVjdGlvbiIKK21zZ3N0ciAit73P8iIKKworIy4gJ1VwJyBhbmQgJ0Rvd24nIGJ1dHRvbnMKKyM6IGd1aV9ndGsuYzoxNjIxIGd1aV9tb3RpZi5jOjI5NzYKK21zZ2lkICJVcCIKK21zZ3N0ciAiz/LJzyIKKworIzogZ3VpX2d0ay5jOjE2MjUgZ3VpX21vdGlmLmM6Mjk4NAorbXNnaWQgIkRvd24iCittc2dzdHIgIs/yz8IiCisKKyMuICdGaW5kIE5leHQnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NDcgZ3VpX21vdGlmLmM6Mjc2NgorbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAi1dLPwtK7uPYiCisKKyMuICdSZXBsYWNlJyBidXR0b24KKyM6IGd1aV9ndGsuYzoxNjY0IGd1aV9tb3RpZi5jOjI3ODMKK21zZ2lkICJSZXBsYWNlIgorbXNnc3RyICLM5ru7IgorCisjLiAnUmVwbGFjZSBBbGwnIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjE2NzMgZ3VpX21vdGlmLmM6Mjc5NgorbXNnaWQgIlJlcGxhY2UgQWxsIgorbXNnc3RyICLM5ru7yKuyvyIKKworIzogZ3VpX2d0a194MTEuYzoxMDc2IGd1aV94MTEuYzoxMTk0Cittc2dpZCAiRTIzMzogY2Fubm90IG9wZW4gZGlzcGxheSIKK21zZ3N0ciAiRTIzMzogPLK7xNy08r+qIFggU2VydmVyIERJU1BMQVk+IgorCisjOiBndWlfZ3RrX3gxMS5jOjI0MzMgZ3VpX3gxMS5jOjE5OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDogsrvV/ci3tcTX1rf7vK8gKEZvbnRzZXQpOiAlcyIKKworIzogZ3VpX2d0a194MTEuYzoyNDYwCittc2dpZCAiRm9udCBTZWxlY3Rpb24iCittc2dzdHIgItfWzOXRodTxIgorCisjOiBndWlfZ3RrX3gxMS5jOjI3MDIgZ3VpX21hYy5jOjI3ODAgZ3VpX3c0OC5jOjExOTcgZ3VpX3gxMS5jOjE4MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogVW5rbm93biBmb250OiAlcyIKK21zZ3N0ciAisrvV/ci3tcTX1szlw/uzxjogJXMiCisKKyM6IGd1aV9ndGtfeDExLmM6MjcxMyBndWlfeDExLmM6MTg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM2OiBGb250IFwiJXNcIiBpcyBub3QgZml4ZWQtd2lkdGgiCittc2dzdHIgIkUyMzY6IFwiJXNcIiCyu8rHucy2qL/ttsjX1szlIgorCisjOiBndWlfZ3RrX3gxMS5jOjI4NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MjogQ29sb3IgbmFtZSBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkUyNDI6ICVzIM6qsrvE3Mq2sfC1xNHVyavD+7PGIgorCisjOiBndWlfZ3RrX3gxMS5jOjM1MTkgdWkuYzoxOTI5Cittc2dpZCAiVXNlZCBDVVRfQlVGRkVSMCBpbnN0ZWFkIG9mIGVtcHR5IHNlbGVjdGlvbiIKK21zZ3N0ciAiyrnTwyBDVVRfQlVGRkVSMCDAtMzmu7u/1dGh1PEiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDEgZ3VpX21vdGlmLmM6MTYwNAorbXNnaWQgIkZpbHRlciIKK21zZ3N0ciAiuf3Cy8b3IgorCisjOiBndWlfbW90aWYuYzoxNjAzCittc2dpZCAiRGlyZWN0b3JpZXMiCittc2dzdHIgIsS/wrwiCisKKyM6IGd1aV9tb3RpZi5jOjE2MDUKK21zZ2lkICJIZWxwIgorbXNnc3RyICKw79b6IgorCisjOiBndWlfbW90aWYuYzoxNjA2Cittc2dpZCAiRmlsZXMiCittc2dzdHIgIs7EvP4iCisKKyM6IGd1aV9tb3RpZi5jOjE2MDgKK21zZ2lkICJTZWxlY3Rpb24iCittc2dzdHIgItGh1PEiCisKKyM6IGd1aV9tb3RpZi5jOjI4MDkKK21zZ2lkICJVbmRvIgorbXNnc3RyICKzt8/7IgorCisjOiBndWlfcmlzY29zLmM6OTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IENhbid0IGxvYWQgWmFwIGZvbnQgJyVzJyIKK21zZ3N0ciAiRTIzNTogsrvE3LTyv6ogWmFwINfWzOUgJyVzJyIKKworIzogZ3VpX3Jpc2Nvcy5jOjEwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNTogQ2FuJ3QgdXNlIGZvbnQgJXMiCittc2dzdHIgIkUyMzU6ILK7xNzKudPD19bM5SAlcyIKKworIzogZ3VpX3Jpc2Nvcy5jOjExNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MjogTWlzc2luZyBjb2xvcjogJXMiCittc2dzdHIgIkUyNDI6INXSsru1vdHVyas6ICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyLV/dTat6LLzdbQts/X07PM0PK1xNDFz6IuXG4iCisKKyM6IGd1aV93MzIuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MzogQXJndW1lbnQgbm90IHN1cHBvcnRlZDogXCItJXNcIjsgVXNlIHRoZSBPTEUgdmVyc2lvbi4iCittc2dzdHIgIkUyNDM6ILK71qez1rLOyv0gXCItJXNcIqGjx+vTwyBPTEUgsOaxvqGjIgorCisjOiBndWlfdzQ4LmM6MjA2OAorbXNnaWQgIkZpbmQgc3RyaW5nICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIrLp1dLX1rf7tK4gKMq508MgJ1xcXFwnIMC0se3KviAnXFwnKSIKKworIzogZ3VpX3c0OC5jOjIwOTMKK21zZ2lkICJGaW5kICYgUmVwbGFjZSAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICKy6dXSvLDM5ru719a3+7SuICjKudPDICdcXFxcJyDAtLHtyr4gJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNDE0Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiVmltIEU0NTg6ILK7xNzF5NbDIGNvbG9yIG1hcCC21M/zo6zT0NCp0dXJq7+0xvDAtLvhuda51rXEIgorCisjOiBndWlfeDExLmM6MTk4NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiRTI1MDogRm9udHNldCAlcyDDu9PQyei2qNX9yLe1xNfWzOXS1Lmpz9TKvtXi0KnX1rf7vK86IgorCisjOiBndWlfeDExLmM6MjAzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiDX1szlvK8oRm9udHNldCnD+7PGOiAlcyIKKworIzogZ3VpX3gxMS5jOjIwMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCAnJXMnIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiJyVzJyCyu8rHucy2qL/ttsjX1szlIgorCisjOiBndWlfeDExLmM6MjA1MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6INfWzOW8ryhGb250c2V0KcP7s8Y6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICLX1szlMDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgItfWzOUxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA1MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250JWQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAi19bM5SVkv+22yLK7ysfX1szlMLXEwb2xtlxuIgorCisjOiBndWlfeDExLmM6MjA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgItfWzOUwtcS/7bbIo7olbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorItfWzOUxv+22yDogJWxkXG4iCisiXG4iCisKKyM6IGd1aV94MTEuYzoyMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogsrvE3MXk1sPR1cmrICVzIgorCisjOiBndWlfeDExLmM6MzI1MAorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogsrvE3LbByKEgc2lnbiBkYXRhISIKKworIzogaGFuZ3VsaW4uYzo2MTAKK21zZ2lkICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgRVJST1IiCittc2dzdHIgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSC07c7zIgorCisjOiBpZl9jc2NvcGUuYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3NbY29wZV0gJXMiCittc2dzdHIgIiIKKworIzogaWZfY3Njb3BlLmM6NjcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgItDC1PbK/b7dv+IiCisKKyM6IGlmX2NzY29wZS5jOjY5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAisunRr8Sjyr0iCisKKyM6IGlmX2NzY29wZS5jOjcxCittc2dpZCAiU2hvdyB0aGlzIG1lc3NhZ2UiCittc2dzdHIgIs/Uyr60y9DFz6IiCisKKyM6IGlmX2NzY29wZS5jOjczCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIr3hyvjBrL3TIgorCisjOiBpZl9jc2NvcGUuYzo3NQorbXNnaWQgIlJlaW5pdCBhbGwgY29ubmVjdGlvbnMiCittc2dzdHIgItbYyejL+dPQway90yIKKworIzogaWZfY3Njb3BlLmM6NzcKK21zZ2lkICJTaG93IGNvbm5lY3Rpb25zIgorbXNnc3RyICLP1Mq+way90yIKKworIzogaWZfY3Njb3BlLmM6MTA4Cittc2dpZCAiVGhpcyBjc2NvcGUgY29tbWFuZCBkb2VzIG5vdCBzdXBwb3J0IHNwbGl0dGluZyB0aGUgd2luZG93LlxuIgorbXNnc3RyICLV4rj2IGNzY29wZSDD/MHusrvWp7PWt9a47sbBxLtcbiIKKworIzogaWZfY3Njb3BlLmM6MTQzCittc2dpZCAiVXNhZ2U6IGNzdGFnIDxpZGVudD4iCittc2dzdHIgItPDt6g6IGNzdGFnIDzKtrHw19Y+IgorCisjOiBpZl9jc2NvcGUuYzoxOTkKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6INXSsru1vSB0YWciCisKKyM6IGlmX2NzY29wZS5jOjQwNyBpZl9jc2NvcGUuYzo0NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJzdGF0KCVzKSC07c7zOiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDYwIGlmX2NzY29wZS5jOjQ2NworIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgItDC1PYgY3Njb3BlIMr9vt2/4iAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiJXMgsrvKx8S/wry78iBjc2NvcGUgyv2+3b/iIgorCisjOiBpZl9jc2NvcGUuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAitsHIoSBjc2NvcGUgway90yAlZCDKsbTtzvMiCisKKyM6IGlmX2NzY29wZS5jOjYzMworbXNnaWQgInVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICLOtNaqtcQgY3Njb3BlILLp1dLQzsysIgorCisjOiBpZl9jc2NvcGUuYzo2ODAKK21zZ2lkICJDb3VsZCBub3QgY3JlYXRlIGNzY29wZSBwaXBlcyIKK21zZ3N0ciAisrvE3LS0vajT6yBjc2NvcGUgway907XEudy1wCIKKworIzogaWZfY3Njb3BlLmM6NzQ1Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uINa00NDKp7DcIgorCisjOiBpZl9jc2NvcGUuYzo3NTUKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gyqew3CAodG9fZnApIgorCisjOiBpZl9jc2NvcGUuYzo3NTcKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gyqew3CAoZnJfZnApIgorCisjOiBpZl9jc2NvcGUuYzo3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIsO709AgY3Njb3BlIMGsvdMiCisKKyM6IGlmX2NzY29wZS5jOjg1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6INXSsru1vbf7us8gY3Njb3BlILXEy9HRsCAlcyAvICVzIgorCisjOiBpZl9jc2NvcGUuYzo4OTkKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZSDD/MHuOlxuIgorCisjOiBpZl9jc2NvcGUuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcylcbiIKK21zZ3N0ciAiJS01czogJS0zMHMgKNPDt6g6ICVzKVxuIgorCisjOiBpZl9jc2NvcGUuYzo5NzAKK21zZ2lkICJkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAi1ti4tLXEIGNzY29wZSDK/b7dv+LOtLG7vNPI6yIKKworIzogaWZfY3Njb3BlLmM6OTgxCittc2dpZCAibWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgItLRtO+1vSBjc2NvcGUg1+6088GsvdPK/cS/IgorCisjOiBpZl9jc2NvcGUuYzoxMTAyCittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiDV0rK7tb0gY3Njb3BlIMGsvdMiCisKKyM6IGlmX2NzY29wZS5jOjExMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIgorbXNnc3RyICJFMjYxOiDV0rK7tb0gY3Njb3BlIMGsvdMgJXMiCisKKyM6IGlmX2NzY29wZS5jOjExNDEKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiBjbG9zZWQiCittc2dzdHIgImNzY29wZSDBrL3T0tG52LHVIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgway90yAlcyDS0bnYsdVcbiIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxMjkwCittc2dpZCAiZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgImNzX21hbmFnZV9tYXRjaGVzINHP1ti07c7zIgorCisjOiBpZl9jc2NvcGUuYzoxMzQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6ILbByKEgY3Njb3BlIMGsvdMgJWQgtO3O8yIKKworIzogaWZfY3Njb3BlLmM6MTQ0OQorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICKyu8TcyrnTwyBtYWxsb2NcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlc1xuIgorbXNnc3RyICJDc2NvcGUgserHqSh0YWcpOiAlc1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDU4Cittc2dpZCAiICAgIyAgIGxpbmUiCittc2dzdHIgIiAgICMgICDQ0CAgIgorCisjOiBpZl9jc2NvcGUuYzoxNDYwCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICLOxLz+w/sgICAgIC8gyc/Pws7EICAgIC8g0NC6xVxuIgorCisjOiBpZl9jc2NvcGUuYzoxNzE4Cittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgItbYyejL+dPQIGNzY29wZSDK/b7dv+IiCisKKyM6IGlmX2NzY29wZS5jOjE3ODUKK21zZ2lkICJubyBjc2NvcGUgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAiw7vT0CBjc2NvcGUgway901xuIgorCisjOiBpZl9jc2NvcGUuYzoxNzg5Cittc2dpZCAiICMgcGlkICAgIGRhdGFiYXNlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorbXNnc3RyICIgIyBwaWQgICAgyv2+3b/iw/uzxiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCisKKyM6IGlmX2NzY29wZS5jOjE4MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTJkICUtNWxkICAlLTM0cyAgPG5vbmU+XG4iCittc2dzdHIgIiUyZCAlLTVsZCAgJS0zNHMgIDzO3j5cbiIKKworIzogaWZfcHl0aG9uLmM6Mzc2Cittc2dpZCAiIgorIkUyNjM6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBQeXRob24gbGlicmFyeSBjb3VsZCBub3QgYmUgIgorImxvYWRlZC4iCittc2dzdHIgIkUyNjM6ILGnx7ijrNXiuPbD/MHusrvE3Mq508OjrFB5dGhvbiCzzNDyv+LDu9PQvNPU2KGjIgorCisjOiBpZl9weXRob24uYzo1NzYKK21zZ2lkICJjYW4ndCBkZWxldGUgT3V0cHV0T2JqZWN0IGF0dHJpYnV0ZXMiCittc2dzdHIgIrK7xNzJvrP9IE91dHB1dE9iamVjdCDK9NDUIgorCisjOiBpZl9weXRob24uYzo1ODMKK21zZ2lkICJzb2Z0c3BhY2UgbXVzdCBiZSBhbiBpbnRlZ2VyIgorbXNnc3RyICJzb2Z0c3BhY2UgsdjQ6MrH1fvK/SIKKworIzogaWZfcHl0aG9uLmM6NTkxCittc2dpZCAiaW52YWxpZCBhdHRyaWJ1dGUiCittc2dzdHIgIrK71f3It7XEyvTQ1CIKKworIzogaWZfcHl0aG9uLmM6NjMwIGlmX3B5dGhvbi5jOjY0NAorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSDQ6NKqIHN0cmluZyBsaXN0ILWxss7K/SIKKworIzogaWZfcHl0aG9uLmM6NzcwCittc2dpZCAiRTI2NDogUHl0aG9uOiBFcnJvciBpbml0aWFsaXNpbmcgSS9PIG9iamVjdHMiCittc2dzdHIgIkUyNjQ6IFB5dGhvbjogsrvE3LP1yry7ryBJL08gttTP8yIKKworIzogaWZfcHl0aG9uLmM6OTU1IGlmX3RjbC5jOjEzOTEKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIrK71f3It7XEse2078q9IgorCisjOiBpZl9weXRob24uYzo5NjkgaWZfdGNsLmM6MTM5NgorbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAi0vLOqrHg0uvKscO709C808jrse2078q9KGV4cHJlc3Npb24ptcSzzNDytPrC66Osy/nS1LK7xNzKudPDse2078q9IgorCisjOiBpZl9weXRob24uYzo5ODIKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgYnVmZmVyIgorbXNnc3RyICLK1M28yrnTw9LRsbvJvrP9tcS7urPlx/giCisKKyM6IGlmX3B5dGhvbi5jOjk5NyBpZl9weXRob24uYzoxMDM4IGlmX3B5dGhvbi5jOjExMDIgaWZfdGNsLmM6MTIwMworbXNnaWQgImxpbmUgbnVtYmVyIG91dCBvZiByYW5nZSIKK21zZ3N0ciAi0NC6xbOss/a3ts6nIgorCisjOiBpZl9weXRob24uYzoxMjM1CisjLCBjLWZvcm1hdAorbXNnaWQgIjxidWZmZXIgb2JqZWN0IChkZWxldGVkKSBhdCAlOGxYPiIKK21zZ3N0ciAiPGJ1ZmZlciC21M/zICjS0cm+s/0pOiAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTMyNiBpZl90Y2wuYzo4MjUKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAiseq8x8P7s8ayu9X9yLciCisKKyM6IGlmX3B5dGhvbi5jOjE2MDEKK21zZ2lkICJubyBzdWNoIGJ1ZmZlciIKK21zZ3N0ciAizt60y7u6s+XH+CIKKworIzogaWZfcHl0aG9uLmM6MTY4OQorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCB3aW5kb3ciCittc2dzdHIgIsrUzbzKudPD0tGxu8m+s/21xLSwv9oiCisKKyM6IGlmX3B5dGhvbi5jOjE3MzQKK21zZ2lkICJyZWFkb25seSBhdHRyaWJ1dGUiCittc2dzdHIgIta7tsHK9NDUIgorCisjOiBpZl9weXRob24uYzoxNzQ3Cittc2dpZCAiY3Vyc29yIHBvc2l0aW9uIG91dHNpZGUgYnVmZmVyIgorbXNnc3RyICK54rHqtqjOu9Tau7qz5cf41q7N4iIKKworIzogaWZfcHl0aG9uLmM6MTgyNAorIywgYy1mb3JtYXQKK21zZ2lkICI8d2luZG93IG9iamVjdCAoZGVsZXRlZCkgYXQgJS44bFg+IgorbXNnc3RyICI8tLC/2rbUz/Mo0tHJvrP9KTogJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODM2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjy0sL/attTP8yjOtNaqKTogJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODM4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI8tLC/2iAlZD4iCisKKyM6IGlmX3B5dGhvbi5jOjE5MTQKK21zZ2lkICJubyBzdWNoIHdpbmRvdyIKK21zZ3N0ciAizt60y7Swv9oiCisKKyM6IGlmX3B5dGhvbi5jOjIxNDQgaWZfcHl0aG9uLmM6MjE3NSBpZl9weXRob24uYzoyMjI1IGlmX3B5dGhvbi5jOjIyODUKKyM6IGlmX3B5dGhvbi5jOjI0MDIgaWZfcHl0aG9uLmM6MjQ1NCBpZl90Y2wuYzo2NzMgaWZfdGNsLmM6NzE4IGlmX3RjbC5jOjc5MgorIzogaWZfdGNsLmM6ODYyIGlmX3RjbC5jOjE5ODcKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICKyu8TcsaO05ri01K3Qxc+iIgorCisjOiBpZl9weXRob24uYzoyMTQ2IGlmX3B5dGhvbi5jOjIyMzIgaWZfcHl0aG9uLmM6MjI5NgorbXNnaWQgImNhbm5vdCBkZWxldGUgbGluZSIKK21zZ3N0ciAisrvE3Mm+s/20y9DQIgorCisjOiBpZl9weXRob24uYzoyMTc3IGlmX3B5dGhvbi5jOjIzMTIgaWZfdGNsLmM6Njc5IGlmX3RjbC5jOjIwMDkKK21zZ2lkICJjYW5ub3QgcmVwbGFjZSBsaW5lIgorbXNnc3RyICKyu8TczOa7u7TL0NAiCisKKyM6IGlmX3B5dGhvbi5jOjIzMjggaWZfcHl0aG9uLmM6MjQwNCBpZl9weXRob24uYzoyNDYyCittc2dpZCAiY2Fubm90IGluc2VydCBsaW5lIgorbXNnc3RyICKyu8TcsuXI67TL0NAiCisKKyM6IGlmX3B5dGhvbi5jOjI1NjYKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgItfWt/u0rrK7xNyw/Lqs0MLQ0CIKKworIzogaWZfcnVieS5jOjM5NAorbXNnaWQgIiIKKyJFMjY2OiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkLCB0aGUgUnVieSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICJFMjY2OiC0y8P8we6yu8TcyrnTw6Oszt63qLzT1NggUnVieSCzzNDyv+IoTGlicmFyeSkiCisKKyM6IGlmX3J1YnkuYzo0NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI3MzogdW5rbm93biBsb25nam1wIHN0YXR1cyAlZCIKK21zZ3N0ciAiRTI3MzogzrTWqrXEIGxvbmdqbXAg17TMrCAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICLH0Lu7yrXP1i+2qNLlIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICLP1Mq+IGJhc2UgY2xhc3Mgb2Y6IgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAiz9TKvrG7uLK4x7XEs8nUsbqvyv0iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIrvWuLQ6ILTTzsS8/iIKKworIzogaWZfc25pZmYuYzo3MQorbXNnaWQgIlJldHJpZXZlIGZyb20gcHJvamVjdCIKK21zZ3N0ciAiu9a4tDogtNO21M/zIgorCisjOiBpZl9zbmlmZi5jOjczCittc2dpZCAiUmV0cmlldmUgZnJvbSBhbGwgcHJvamVjdHMiCittc2dzdHIgIrvWuLQ6ILTTy/nT0M/uxL8iCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAiu9a4tCIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICLP1Mq+1LS0+sLrOiAiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAisunV0iBzeW1ib2wiCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIuSvwMAgY2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAiz9TKvrLjtM652M+1tcTA4CIKKworIzogaWZfc25pZmYuYzo3OQorbXNnaWQgIlNob3cgY2xhc3MgaW4gcmVzdHJpY3RlZCBoaWVyYXJjaHkiCittc2dzdHIgIs/Uyr4gcmVzdHJpY3RlZCCy47TOudjPtbXEIGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgss6/vLW9IgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiCxu8utss6/vDoiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmINPQIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmILG7y63KudPDOiIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAiz9TKvs7EvP46ICIKKworIzogaWZfc25pZmYuYzo4NQorbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorbXNnc3RyICKy+sn6zsS8/jogIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICKyu8Tcway907W9IFNOaUZGK6Gjx+u87LLpu7e+s7Hkwb8gKCRQQVRIIMDvsdjQ6L/J0tTV0rW9IHNuaWZmZW1hY3MpXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiC2wcihtO3O8y4gyKHP+8GsvdMiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyDEv8ewIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIs60IgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAiway909bQIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogsrvV/ci3tcQgU05pZmYrILX308M6ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiDBrL3Ttb0gU05pRkYrIMqnsNwiCisKKyM6IGlmX3NuaWZmLmM6MTAxMAorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiDOtMGsvdO1vSBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAxOQorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6ILK7yscgU05pRkYrILXEu7qz5cf4IgorCisjOiBpZl9zbmlmZi5jOjEwODQKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiDQtMjrtO3O86GjveHK+MGsvdMiCisKKyM6IGlmX3RjbC5jOjQwNworbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAisrvV/ci3tcS7urPlx/i6xSIKKworIzogaWZfdGNsLmM6NDUzIGlmX3RjbC5jOjkyMCBpZl90Y2wuYzoxMDk5Cittc2dpZCAibm90IGltcGxlbWVudGVkIHlldCIKK21zZ3N0ciAiydDOtMq1z9YiCisKKyM6IGlmX3RjbC5jOjQ5MAorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICKyu9X9yLe1xNGhz+4iCisKKyMuID8/PworIzogaWZfdGNsLmM6NzYzCittc2dpZCAiY2Fubm90IHNldCBsaW5lKHMpIgorbXNnc3RyICKyu8Tcyei2qNDQIgorCisjOiBpZl90Y2wuYzo4MzQKK21zZ2lkICJtYXJrIG5vdCBzZXQiCittc2dzdHIgIsO709DJ6Laoseq8xyIKKworIzogaWZfdGNsLmM6ODQwIGlmX3RjbC5jOjEwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAicm93ICVkIGNvbHVtbiAlZCIKK21zZ3N0ciAiwdAgJWQg0NAgJWQiCisKKyM6IGlmX3RjbC5jOjg3MAorbXNnaWQgImNhbm5vdCBpbnNlcnQvYXBwZW5kIGxpbmUiCittc2dzdHIgIrK7xNyy5cjru/LM7bzTtMvQ0CIKKworIzogaWZfdGNsLmM6MTI1NworbXNnaWQgInVua25vd24gZmxhZzogIgorbXNnc3RyICK07c7ztcSx6ta+OiAiCisKKyM6IGlmX3RjbC5jOjEzMjcKK21zZ2lkICJ1bmtub3duIHZpbU9wdGlvbiIKK21zZ3N0ciAisrvV/ci3tcQgVklNINGhz+4iCisKKyM6IGlmX3RjbC5jOjE0MTIKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgIrz8xczW0LbPIgorCisjOiBpZl90Y2wuYzoxNDE3Cittc2dpZCAidmltIGVycm9yIgorbXNnc3RyICJ2aW0gtO3O8yIKKworIzogaWZfdGNsLmM6MTQ2MAorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAisrvE3LS0vai7urPlx/gvtLC/2sP8we46ILbUz/O9q7G7yb6z/SIKKworIzogaWZfdGNsLmM6MTUzNAorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIrK7xNzXorLhIGNhbGxiYWNrIMP8we46ILu6s+XH+C+0sL/a0tG+rbG7yb6z/cHLIgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU1MQorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICJFMjgwOiBUQ0wg0c/W2LTtzvM6IHJlZmxpc3Qgsru/yb+/IT8gx+uxqLjmuPggdG8gdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTUyCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAisrvE3NeisuEgY2FsbGJhY2sgw/zB7jog1dKyu7W9u7qz5cf4L7Swv9oiCisKKyM6IGlmX3RjbC5jOjE3MTMKK21zZ2lkICJTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIrTLw/zB7rK7xNzKudPDLCDS8s6qzt63qLzT1NggVGNsILPM0PK/4ihMaWJyYXJ5KSIKKworIzogaWZfdGNsLmM6MTg3NQorbXNnaWQgIiIKKyJFMjgxOiBUQ0wgRVJST1I6IGV4aXQgY29kZSBpcyBub3QgaW50IT8gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHZpbS1kZXZAdmltLm9yZyIKK21zZ3N0ciAiRTI4MTogVENMILTtzvM6IM3Ls/a3tbvY1rWyu8rH1fvK/SE/IMfrsai45rj4IHRvIHZpbS1kZXZAdmltLm9yZyIKKworIzogaWZfdGNsLmM6MTk5NQorbXNnaWQgImNhbm5vdCBnZXQgbGluZSIKK21zZ3N0ciAisrvE3MihtcO0y9DQIgorCisjOiBpZl94Y21kc3J2LmM6MjA0Cittc2dpZCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgY29tbWFuZCBzZXJ2ZXIgbmFtZSIKK21zZ3N0ciAisrvE3NeisuHD/MHut/7O8cb3w/uzxiIKKworIzogaWZfeGNtZHNydi5jOjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IMO709DXorLhzqogXCIlc1wiILXEt/7O8cb3IgorCisjOiBpZl94Y21kc3J2LmM6NDQ2Cittc2dpZCAiRTI0ODogRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byB0aGUgZGVzdGluYXRpb24gcHJvZ3JhbSIKK21zZ3N0ciAiRTI0ODogsrvE3MvNs/bD/MHutb3Ev7XEtdizzNDyIgorCisjOiBpZl94Y21kc3J2LmM6NzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc2VydmVyIGlkIHVzZWQ6ICVzIgorbXNnc3RyICKyu9X9yLe1xLf+zvHG9yBpZCA6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA1NgorbXNnaWQgIkUyNDk6IGNvdWxkbid0IHJlYWQgVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IgorbXNnc3RyICJFMjQ5OiCyu8TctsHIoSBWSU0gtcQg16Ky4bHtyvTQ1CIKKworIzogaWZfeGNtZHNydi5jOjEwNjcKK21zZ2lkICJFMjUxOiBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkgaXMgYmFkbHkgZm9ybWVkLiAgRGVsZXRlZCEiCittc2dzdHIgIkUyNTE6IFZJTSC1xNeisuGx7cr00NTT0M7zoaPS0cm+s/2hoyIKKworIzogbWFpbi5jOjUzIG9wdGlvbi5jOjMxNjIgb3B0aW9uLmM6MzI2OQorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICKyu9X9yLe1xNGhz+4iCisKKyM6IG1haW4uYzo1NQorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICLMq7bgseC8rbLOyv0iCisKKyM6IG1haW4uYzo1NworbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIsixydmx2NKqtcSyzsr9OiIKKworIzogbWFpbi5jOjU5Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIrK7xNyx5sjPtMvRoc/uuvO1xMP8we46ICIKKworIzogbWFpbi5jOjYxCittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiIG9yIFwiLWMgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAizKu24CBcIitjb21tYW5kXCIgu/IgXCItYyBjb21tYW5kXCIgss7K/SIKKworIzogbWFpbi5jOjYzCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIrK71f3It7XEss7K/TogIgorCisjOiBtYWluLmM6NDM2Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICLE+rXEIFZpbSCx4NLryrHDu9PQvNPI6yBkaWZmILXExNzBpiIKKworIzogbWFpbi5jOjg1OAorbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIsrUzbzU2bTOtPK/qiBzY3JpcHQgzsS8/jogXCIiCisKKyM6IG1haW4uYzo4NjIgbWFpbi5jOjg2OSBtYWluLmM6OTEzIG1lbWxpbmUuYzozNjczIG1lbWxpbmUuYzozNjc3CisjOiB2ZXJzaW9uLmM6ODE2IHZlcnNpb24uYzo4MjEgdmVyc2lvbi5jOjgyNiB2ZXJzaW9uLmM6ODMxIHZlcnNpb24uYzo4MzYKKyM6IHZlcnNpb24uYzo4NDEgdmVyc2lvbi5jOjg0NyB2ZXJzaW9uLmM6ODUxIHZlcnNpb24uYzo4NTUgdmVyc2lvbi5jOjg2MAorIzogdmVyc2lvbi5jOjg2NyB2ZXJzaW9uLmM6ODc1IHZlcnNpb24uYzo4ODEKK21zZ2lkICJcIlxuIgorbXNnc3RyICJcIlxuIgorCisjOiBtYWluLmM6ODY3Cittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHJlYWRpbmc6IFwiIgorbXNnc3RyICKyu8Tczqq2wbb4tPK/qjogXCIiCisKKyM6IG1haW4uYzo5MTEKK21zZ2lkICJDYW5ub3Qgb3BlbiBmb3Igc2NyaXB0IG91dHB1dDogXCIiCittc2dzdHIgIrK7xNzOqiBzY3JpcHQgyuSz9rb4tPK/qjogXCIiCisKKyM6IG1haW4uYzoxMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGZpbGVzIHRvIGVkaXRcbiIKK21zZ3N0ciAiu7nT0CAlZCC49s7EvP61yLT9seC8rVxuIgorCisjOiBtYWluLmM6MTA5NAorbXNnaWQgIlZpbTogV2FybmluZzogT3V0cHV0IGlzIG5vdCB0byBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTog16LS4jogyuSz9rK7ysfW1bbLKMbBxLspXG4iCisKKyM6IG1haW4uYzoxMDk2Cittc2dpZCAiVmltOiBXYXJuaW5nOiBJbnB1dCBpcyBub3QgZnJvbSBhIHRlcm1pbmFsXG4iCittc2dzdHIgIlZpbTog16LS4jogyuTI67K7ysfW1bbLKLz8xcwpXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTE3MQorbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInByZS12aW1yYyDD/MHu0NAiCisKKyM6IG1haW4uYzoxMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODI6IENhbm5vdCByZWFkIGZyb20gXCIlc1wiIgorbXNnc3RyICJFMjgyOiCyu8TctsHIoc7EvP4gXCIlc1wiIgorCisjOiBtYWluLmM6MjE1NworbXNnaWQgIiIKKyJcbiIKKyJNb3JlIGluZm8gd2l0aDogXCJ2aW0gLWhcIlxuIgorbXNnc3RyICIiCisiXG4iCisisunRr7j8tuDQxc+ix+vWtNDQOiBcInZpbSAtaFwiXG4iCisKKyM6IG1haW4uYzoyMTkwCittc2dpZCAiW2ZpbGUgLi5dICAgICAgIGVkaXQgc3BlY2lmaWVkIGZpbGUocykiCittc2dzdHIgIlvOxLz+IC4uXSAgICAgICCx4Lyt1ri2qLXEzsS8/iIKKworIzogbWFpbi5jOjIxOTEKK21zZ2lkICItICAgICAgICAgICAgICAgcmVhZCB0ZXh0IGZyb20gc3RkaW4iCittc2dzdHIgIi0gICAgICAgICAgICAgICC007Hq17zK5MjrKHN0ZGluKbbByKHOxLG+IgorCisjOiBtYWluLmM6MjE5MgorbXNnaWQgIi10IHRhZyAgICAgICAgICBlZGl0IGZpbGUgd2hlcmUgdGFnIGlzIGRlZmluZWQiCittc2dzdHIgIi10IHRhZyAgICAgICAgICCx4LytyrHKudPD1ri2qLXEIHRhZyIKKworIzogbWFpbi5jOjIxOTQKK21zZ2lkICItcSBbZXJyb3JmaWxlXSAgZWRpdCBmaWxlIHdpdGggZmlyc3QgZXJyb3IiCittc2dzdHIgIi1xIFtlcnJvcmZpbGVdICCx4LytyrG809TYtdrSu7j2tO3O8yIKKworIzogbWFpbi5jOjIyMDMKK21zZ2lkICIiCisiXG4iCisiXG4iCisidXNhZ2U6IgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiINPDt6g6IgorCisjOiBtYWluLmM6MjIwNgorbXNnaWQgIiB2aW0gW2FyZ3VtZW50c10gIgorbXNnc3RyICJ2aW0gW7LOyv1dICIKKworIzogbWFpbi5jOjIyMTAKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAgu/I6IgorCisjOiBtYWluLmM6MjIxMworbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBcmd1bWVudHM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyKyzsr9OlxuIgorCisjOiBtYWluLmM6MjIxNAorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx01rvT0NTa1eLWrrrztcTOxLz+IgorCisjOiBtYWluLmM6MjIxNgorbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdNeisuEgZ3ZpbSC1vSBPTEUiCisKKyM6IG1haW4uYzoyMjE3Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi11bnJlZ2lzdGVyXHRcdMihz/sgT0xFINbQtcQgZ3ZpbSDXorLhIgorCisjOiBtYWluLmM6MjIyMAorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0yrnTw8280M6958PmICjNrCBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyMjIxCittc2dpZCAiLWZcdFx0XHRGb3JlZ3JvdW5kOiBEb24ndCBmb3JrIHdoZW4gc3RhcnRpbmcgR1VJIgorbXNnc3RyICItZlx0XHRcdMewvrA6IMb0tq/NvNDOvefD5sqxsrsgZm9yayIKKworIzogbWFpbi5jOjIyMjMKK21zZ2lkICItdlx0XHRcdFZpIG1vZGUgKGxpa2UgXCJ2aVwiKSIKK21zZ3N0ciAiLXZcdFx0XHRWaSDEo8q9ICjNrCBcInZpXCIpIgorCisjOiBtYWluLmM6MjIyNAorbXNnaWQgIi1lXHRcdFx0RXggbW9kZSAobGlrZSBcImV4XCIpIgorbXNnc3RyICItZVx0XHRcdEV4IMSjyr0gKM2sIFwiZXhcIikiCisKKyM6IG1haW4uYzoyMjI1Cittc2dpZCAiLXNcdFx0XHRTaWxlbnQgKGJhdGNoKSBtb2RlIChvbmx5IGZvciBcImV4XCIpIgorbXNnc3RyICItc1x0XHRcdLCyvrIgKGJhdGNoKSDEo8q9ICjWu8Tc0+sgXCJleFwiINK7xvDKudPDKSIKKworIzogbWFpbi5jOjIyMjcKK21zZ2lkICItZFx0XHRcdERpZmYgbW9kZSAobGlrZSBcInZpbWRpZmZcIikiCittc2dzdHIgIi1kXHRcdFx0RGlmZiDEo8q9ICjNrCBcInZpbWRpZmZcIiwgv8nRuMvZsci9z8G9zsS8/rK7zay0pikiCisKKyM6IG1haW4uYzoyMjI5Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHS88tLXxKPKvSAozawgXCJldmltXCIsIG1vZGVsZXNzKSIKKworIzogbWFpbi5jOjIyMzAKK21zZ2lkICItUlx0XHRcdFJlYWRvbmx5IG1vZGUgKGxpa2UgXCJ2aWV3XCIpIgorbXNnc3RyICItUlx0XHRcdNa7tsHEo8q9ICjNrCBcInZpZXdcIikiCisKKyM6IG1haW4uYzoyMjMxCittc2dpZCAiLVpcdFx0XHRSZXN0cmljdGVkIG1vZGUgKGxpa2UgXCJydmltXCIpIgorbXNnc3RyICItWlx0XHRcdM/e1sbEo8q9ICjNrCBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyMjMyCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHSyu7/J0N64xCAo0LTI687EvP4pIgorCisjOiBtYWluLmM6MjIzMworbXNnaWQgIi1NXHRcdFx0TW9kaWZpY2F0aW9ucyBpbiB0ZXh0IG5vdCBhbGxvd2VkIgorbXNnc3RyICItTVx0XHRcdM7Esb6yu7/J0N64xCIKKworIzogbWFpbi5jOjIyMzQKK21zZ2lkICItYlx0XHRcdEJpbmFyeSBtb2RlIgorbXNnc3RyICItYlx0XHRcdLb+vfjWxsSjyr0iCisKKyM6IG1haW4uYzoyMjM2Cittc2dpZCAiLWxcdFx0XHRMaXNwIG1vZGUiCittc2dzdHIgIi1sXHRcdFx0TGlzcCDEo8q9IgorCisjOiBtYWluLmM6MjIzOAorbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0J2NvbXBhdGlibGUnILSrzbMgVmkgvObI3cSjyr0iCisKKyM6IG1haW4uYzoyMjM5Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0J25vY29tcGF0aWJsZScgsrvN6sir0+u0q82zIFZpILzmyN2jrL/JyrnTwyBWaW0gvNPHv8TcwaYiCisKKyM6IG1haW4uYzoyMjQwCittc2dpZCAiLVZbTl1cdFx0VmVyYm9zZSBsZXZlbCIKK21zZ3N0ciAiLVZbTl1cdFx0VmVyYm9zZSC1yLy2IgorCisjOiBtYWluLmM6MjI0MQorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx0tffK1MSjyr0iCisKKyM6IG1haW4uYzoyMjQyCittc2dpZCAiLW5cdFx0XHRObyBzd2FwIGZpbGUsIHVzZSBtZW1vcnkgb25seSIKK21zZ3N0ciAiLW5cdFx0XHSyu8q508O9u7u7zsS8/iwg1rvKudPDxNq05iIKKworIzogbWFpbi5jOjIyNDMKK21zZ2lkICItclx0XHRcdExpc3Qgc3dhcCBmaWxlcyBhbmQgZXhpdCIKK21zZ3N0ciAiLXJcdFx0XHTB0LP2vbu7u87EvP66883Ls/YiCisKKyM6IG1haW4uYzoyMjQ0Cittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICi8087EvP7D+ykgICAgICAgXHS71ri0yc+0zrHAwKO1xNfKwc8oUmVjb3ZlciBjcmFzaGVkIHNlc3Npb24pIgorCisjOiBtYWluLmM6MjI0NQorbXNnaWQgIi1MXHRcdFx0U2FtZSBhcyAtciIKK21zZ3N0ciAiLUxcdFx0XHTT6yAtciDSu9H5IgorCisjOiBtYWluLmM6MjI0NworbXNnaWQgIi1mXHRcdFx0RG9uJ3QgdXNlIG5ld2NsaSB0byBvcGVuIHdpbmRvdyIKK21zZ3N0ciAiLWZcdFx0XHSyu8q508MgbmV3Y2xpIMC0tPK/qrSwv9oiCisKKyM6IG1haW4uYzoyMjQ4Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHTKudPDIDxkZXZpY2U+INf2yuTI68rks/bJ6LG4IgorCisjOiBtYWluLmM6MjI1MQorbXNnaWQgIi1IXHRcdFx0c3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx0xvS2r86qIM+jsq7As8Sjyr0iCisKKyM6IG1haW4uYzoyMjU0Cittc2dpZCAiLUZcdFx0XHRzdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdMb0tq/OqiBGYXJzaSDEo8q9IgorCisjOiBtYWluLmM6MjI1NgorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdMnotqjW1bbLzqogPHRlcm1pbmFsPiIKKworIzogbWFpbi5jOjIyNTcKK21zZ2lkICItdSA8dmltcmM+XHRcdFVzZSA8dmltcmM+IGluc3RlYWQgb2YgYW55IC52aW1yYyIKK21zZ3N0ciAiLXUgPHZpbXJjPlx0XHTKudPDIDx2aW1yYz4gzOa7u8jOus4gLnZpbXJjIgorCisjOiBtYWluLmM6MjI1OQorbXNnaWQgIi1VIDxndmltcmM+XHRcdFVzZSA8Z3ZpbXJjPiBpbnN0ZWFkIG9mIGFueSAuZ3ZpbXJjIgorbXNnc3RyICItVSA8Z3ZpbXJjPlx0XHTKudPDIDxndmltcmM+IMzmu7vIzrrOIC5ndmltcmMiCisKKyM6IG1haW4uYzoyMjYxCittc2dpZCAiLS1ub3BsdWdpblx0XHREb24ndCBsb2FkIHBsdWdpbiBzY3JpcHRzIgorbXNnc3RyICItLW5vcGx1Z2luXHRcdLK7vNPU2MjOus4gcGx1Z2luIgorCisjOiBtYWluLmM6MjI2MgorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdLTyv6ogTiC49rSwv9ogKNSkyejKx8O/uPbOxLz+0ru49ikiCisKKyM6IG1haW4uYzoyMjYzCittc2dpZCAiLU9bTl1cdFx0bGlrZSAtbyBidXQgc3BsaXQgdmVydGljYWxseSIKK21zZ3N0ciAiLU9bTl1cdFx0zawgLW8gtavKudPDtLnWsbfWuO4iCisKKyM6IG1haW4uYzoyMjY0Cittc2dpZCAiK1x0XHRcdFN0YXJ0IGF0IGVuZCBvZiBmaWxlIgorbXNnc3RyICIrXHRcdFx0xvS2r7rzzPi1vc7EvP694c6yIgorCisjOiBtYWluLmM6MjI2NQorbXNnaWQgIis8bG51bT5cdFx0U3RhcnQgYXQgbGluZSA8bG51bT4iCittc2dzdHIgIis8bG51bT5cdFx0xvS2r7rzzPi1vbXaIDxsbnVtPiDQ0CIKKworIzogbWFpbi5jOjIyNjcKK21zZ2lkICItLWNtZCA8Y29tbWFuZD5cdEV4ZWN1dGUgPGNvbW1hbmQ+IGJlZm9yZSBsb2FkaW5nIGFueSB2aW1yYyBmaWxlIgorbXNnc3RyICItLWNtZCA8Y29tbWFuZD5cdLzT1NjIzrrOIHZpbXJjIMew1rTQ0CA8Y29tbWFuZD4iCisKKyM6IG1haW4uYzoyMjY5Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxjb21tYW5kPlx0XHS809TYtdrSu7j2zsS8/rrz1rTQ0CA8Y29tbWFuZD4iCisKKyM6IG1haW4uYzoyMjcwCittc2dpZCAiLVMgPHNlc3Npb24+XHRcdFNvdXJjZSBmaWxlIDxzZXNzaW9uPiBhZnRlciBsb2FkaW5nIHRoZSBmaXJzdCBmaWxlIgorbXNnc3RyICItUyA8c2Vzc2lvbj5cdFx0vNPU2LXa0ru49s7EvP6689TYyOsgU2Vzc2lvbiDOxLz+PHNlc3Npb24+IgorCisjOiBtYWluLmM6MjI3MQorbXNnaWQgIi1zIDxzY3JpcHRpbj5cdFJlYWQgTm9ybWFsIG1vZGUgY29tbWFuZHMgZnJvbSBmaWxlIDxzY3JpcHRpbj4iCittc2dzdHIgIi1zIDxzY3JpcHRpbj5cdLTTIDxzY3JpcHRpbj4gtsHI69K7sOPEo8q9w/zB7iIKKworIzogbWFpbi5jOjIyNzIKK21zZ2lkICItdyA8c2NyaXB0b3V0Plx0QXBwZW5kIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItdyA8c2NyaXB0b3V0Plx0ttTOxLz+IDxzY3JpcHRvdXQ+ILi9vNMoYXBwZW5kKcv509DK5MjrtcTD/MHuIgorCisjOiBtYWluLmM6MjI3MworbXNnaWQgIi1XIDxzY3JpcHRvdXQ+XHRXcml0ZSBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLVcgPHNjcmlwdG91dD5cdLbUzsS8/iA8c2NyaXB0b3V0PiDQtMjry/nT0MrkyOu1xMP8we4iCisKKyM6IG1haW4uYzoyMjc1Cittc2dpZCAiLXhcdFx0XHRFZGl0IGVuY3J5cHRlZCBmaWxlcyIKK21zZ3N0ciAiLXhcdFx0XHSx4LytseDC67n9tcTOxLz+IgorCisjOiBtYWluLmM6MjI3OQorbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0Q29ubmVjdCB2aW0gdG8gdGhpcyBwYXJ0aWN1bGFyIFgtc2VydmVyIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdL2rIHZpbSDT69a4tqi1xCBYLXNlcnZlciDBrL3TIgorCisjOiBtYWluLmM6MjI4MQorbXNnaWQgIi1YXHRcdFx0RG8gbm90IGNvbm5lY3QgdG8gWCBzZXJ2ZXIiCittc2dzdHIgIi1YXHRcdFx0srvSqsGsvdO1vSBYIFNlcnZlciIKKworIzogbWFpbi5jOjIyODMKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHTU2sHt0ru49iBHVEsg1+m8/sTatPK/qiBWaW0iCisKKyM6IG1haW4uYzoyMjg3Cittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVzPlx0seC8rSBWaW0gt/7O8cb3yc+1xM7EvP6yos3Ls/YiCisKKyM6IG1haW4uYzoyMjg4Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiC1yNCn09ogLS1yZW1vdGUsILWru+G1yLryzsS8/s3qs8mx4LytIgorCisjOiBtYWluLmM6MjI4OQorbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHTLzbP2IDxrZXlzPiC1vSBWaW0gt/7O8cb3sqLNy7P2IgorCisjOiBtYWluLmM6MjI5MAorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHTU2rf+zvHG98nPx/Ox7bTvyr21xNa1sqK08tOhveG5+yIKKworIzogbWFpbi5jOjIyOTEKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdMHQs/a/ydPDtcQgVmltILf+zvHG98P7s8ayos3Ls/YiCisKKyM6IG1haW4uYzoyMjkyCittc2dpZCAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx0U2VuZCB0by9iZWNvbWUgdGhlIFZpbSBzZXJ2ZXIgPG5hbWU+IgorbXNnc3RyICItLXNlcnZlcm5hbWUgPG5hbWU+XHTLzdbBL7PJzqogVmltILf+zvHG9yA8bmFtZT4iCisKKyM6IG1haW4uYzoyMjk1Cittc2dpZCAiLWkgPHZpbWluZm8+XHRcdFVzZSA8dmltaW5mbz4gaW5zdGVhZCBvZiAudmltaW5mbyIKK21zZ3N0ciAiLWkgPHZpbWluZm8+XHRcdMq508MgPHZpbWluZm8+ILb4t8cgLnZpbWluZm8iCisKKyM6IG1haW4uYzoyMjk3Cittc2dpZCAiLWhcdFx0XHRwcmludCBIZWxwICh0aGlzIG1lc3NhZ2UpIGFuZCBleGl0IgorbXNnc3RyICItaFx0XHRcdLTy06HLtcP3KNKyvs3Kx7G+0MXPoim6883Ls/YiCisKKyM6IG1haW4uYzoyMjk4Cittc2dpZCAiLS12ZXJzaW9uXHRcdHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHS08tOhsOaxvtDFz6K6883Ls/YiCisKKyM6IG1haW4uYzoyMzAyCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSC/ycq2sfC1xLLOyv0gKE1vdGlmILDmKTpcbiIKKworIzogbWFpbi5jOjIzMDUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoQXRoZW5hIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSC/ycq2sfC1xLLOyv0gKEF0aGVuYSCw5ik6XG4iCisKKyM6IG1haW4uYzoyMzA4Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHTU2rSwv9ogPGRpc3BsYXk+INa00NAgdmltIgorCisjOiBtYWluLmM6MjMwOQorbXNnaWQgIi1pY29uaWNcdFx0U3RhcnQgdmltIGljb25pZmllZCIKK21zZ3N0ciAiLWljb25pY1x0XHTG9LavuvPX7tChu68oaWNvbmlmaWVkKSIKKworIzogbWFpbi5jOjIzMTEKK21zZ2lkICItbmFtZSA8bmFtZT5cdFx0VXNlIHJlc291cmNlIGFzIGlmIHZpbSB3YXMgPG5hbWU+IgorbXNnc3RyICItbmFtZSA8bmFtZT5cdFx0tsHIoSBSZXNvdXJjZSDKsbDRIHZpbSC1xMP7s8bK086qIDxuYW1lPiIKKworIzogbWFpbi5jOjIzMTIKK21zZ2lkICJcdFx0XHQgIChVbmltcGxlbWVudGVkKVxuIgorbXNnc3RyICJcdFx0XHQgICjJ0M60yrXP1ilcbiIKKworIzogbWFpbi5jOjIzMTQKK21zZ2lkICItYmFja2dyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3IgdGhlIGJhY2tncm91bmQgKGFsc286IC1iZykiCittc2dzdHIgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdMnotqggPGNvbG9yPiDOqrGzvrDJqyAo0rK/ydPDIC1iZykiCisKKyM6IG1haW4uYzoyMzE1Cittc2dpZCAiLWZvcmVncm91bmQgPGNvbG9yPlx0VXNlIDxjb2xvcj4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZmcpIgorbXNnc3RyICItZm9yZWdyb3VuZCA8Y29sb3I+XHTJ6LaoIDxjb2xvcj4gzqrSu7DjzsTX1tHVyasgKNKyv8nTwyAtZmcpIgorCisjOiBtYWluLmM6MjMxNiBtYWluLmM6MjMzNgorbXNnaWQgIi1mb250IDxmb250Plx0XHRVc2UgPGZvbnQ+IGZvciBub3JtYWwgdGV4dCAoYWxzbzogLWZuKSIKK21zZ3N0ciAiLWZvbnQgPGZvbnQ+XHTKudPDIDxmb250PiDOqtK7sOPX1szlICjSsr/J08MgLWZuKSIKKworIzogbWFpbi5jOjIzMTcKK21zZ2lkICItYm9sZGZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBib2xkIHRleHQiCittc2dzdHIgIi1ib2xkZm9udCA8Zm9udD5cdMq508MgPGZvbnQ+IM6qtNbM5dfWzOUiCisKKyM6IG1haW4uYzoyMzE4Cittc2dpZCAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBpdGFsaWMgdGV4dCIKK21zZ3N0ciAiLWl0YWxpY2ZvbnQgPGZvbnQ+XHTKudPDIDxmb250PiDOqtCxzOXX1szlIgorCisjOiBtYWluLmM6MjMxOSBtYWluLmM6MjMzNworbXNnaWQgIi1nZW9tZXRyeSA8Z2VvbT5cdFVzZSA8Z2VvbT4gZm9yIGluaXRpYWwgZ2VvbWV0cnkgKGFsc286IC1nZW9tKSIKK21zZ3N0ciAiLWdlb21ldHJ5IDxnZW9tPlx0yrnTwzxnZW9tPs6qs/XKvM671sMgKNKyv8nTwyAtZ2VvbSkiCisKKyM6IG1haW4uYzoyMzIwCittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPHdpZHRoPlx0yrnTw7/ttsjOqiA8d2lkdGg+ILXEsd+/8iAo0rK/ydPDIC1idykiCisKKyM6IG1haW4uYzoyMzIxCittc2dpZCAiLXNjcm9sbGJhcndpZHRoIDx3aWR0aD4gIFVzZSBhIHNjcm9sbGJhciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtc3cpIgorbXNnc3RyICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiDJ6Laoufa2r8z1v+22yM6qIDx3aWR0aD4gKNKyv8nTwyAtc3cpIgorCisjOiBtYWluLmM6MjMyMworbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHTJ6Laossu1pcHQtcS437bIzqogPGhlaWdodD4gKNKyv8nTwyAtbWgpIgorCisjOiBtYWluLmM6MjMyNSBtYWluLmM6MjMzOAorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHTKudPDt7TP1CAo0rK/ydPDIC1ydikiCisKKyM6IG1haW4uYzoyMzI2Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdLK7yrnTw7e0z9QgKNKyv8nTwyArcnYpIgorCisjOiBtYWluLmM6MjMyNworbXNnaWQgIi14cm0gPHJlc291cmNlPlx0U2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UiCittc2dzdHIgIi14cm0gPHJlc291cmNlPlx0yei2qNa4tqi1xNfK1LQiCisKKyM6IG1haW4uYzoyMzMwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIL/Jyrax8LXEss7K/SAoUklTQyBPUyCw5ik6XG4iCisKKyM6IG1haW4uYzoyMzMxCittc2dpZCAiLS1jb2x1bW5zIDxudW1iZXI+XHRJbml0aWFsIHdpZHRoIG9mIHdpbmRvdyBpbiBjb2x1bW5zIgorbXNnc3RyICItLWNvbHVtbnMgPG51bWJlcj5cdLSwv9qz9cq8v+22yCIKKworIzogbWFpbi5jOjIzMzIKK21zZ2lkICItLXJvd3MgPG51bWJlcj5cdEluaXRpYWwgaGVpZ2h0IG9mIHdpbmRvdyBpbiByb3dzIgorbXNnc3RyICItLXJvd3MgPG51bWJlcj5cdLSwv9qz9cq8uN+2yCIKKworIzogbWFpbi5jOjIzMzUKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0gv8nKtrHwtcSyzsr9IChHVEsrILDmKTpcbiIKKworIzogbWFpbi5jOjIzMzkKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IChhbHNvOiAtLWRpc3BsYXkpIgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdNTaIDxkaXNwbGF5PiDWtNDQIHZpbSAo0rK/ydPDIC0tZGlzcGxheSkiCisKKyM6IG1haW4uYzoyMzQxCittc2dpZCAiLS1oZWxwXHRcdFNob3cgR25vbWUgYXJndW1lbnRzIgorbXNnc3RyICItLWhlbHBcdFx0z9TKviBHbm9tZSDP4LnYss7K/SIKKworIy4gRmFpbGVkIHRvIHNlbmQsIGFib3J0LgorIzogbWFpbi5jOjI1NjYKK21zZ2lkICIiCisiXG4iCisiU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyK3osvNse2078q9yqew3KGjXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6MjU3MQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kIGZhaWxlZC4gVHJ5aW5nIHRvIGV4ZWN1dGUgbG9jYWxseVxuIgorbXNnc3RyICIiCisiXG4iCisiy82z9sqnsNyho8rUzbzU2rG+tdjWtNDQXG4iCisKKyM6IG1haW4uYzoyNjA0IG1haW4uYzoyNjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAiJWQg1tAgJWQg0tGx4LytIgorCisjOiBtYWluLmM6MjY0OAorbXNnaWQgIlNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIreiy82x7bTvyr3Kp7DcoaNcbiIKKworIzogbWFyay5jOjY1NQorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiw7vT0Mnotqix6rzHIChtYXJrKSIKKworIzogbWFyay5jOjY1NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6INXSsru1vbf7us8gXCIlc1wiILXEseq8xyhtYXJrKSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjY4Cittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIrHqvMcg0NC6xSAgwdAgIM7EvP4vzsSxviIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzA2Cittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIgzPi1vSDQ0LrFICDB0CAgzsS8/i/OxLG+IgorCisjOiBtYXJrLmM6MTA2OAorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIM7EvP6x6rzHOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDMKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSnVtcGxpc3QgKLTT0MK1vb7JKTpcbiIKKworIzogbWFyay5jOjExOTgKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIM7EvP7E2sD6yre8x8K8ICi009DCtb2+ySk6XG4iCisKKyM6IG1hcmsuYzoxMjgxCittc2dpZCAiTWlzc2luZyAnPiciCittc2dzdHIgIsixydm21NOmtcQgJz4nIgorCisjOiBtYnl0ZS5jOjM5NQorbXNnaWQgIk5vdCBhIHZhbGlkIGNvZGVwYWdlIgorbXNnc3RyICKyu9X9yLe1xLT6wuvSsyIKKworIzogbWJ5dGUuYzozMDA1Cittc2dpZCAiRTI4NDogQ2Fubm90IHNldCBJQyB2YWx1ZXMiCittc2dzdHIgIkUyODQ6ILK7xNzJ6LaoIElDIMr91rUiCisKKyM6IG1ieXRlLmM6MzE1NworbXNnaWQgIkUyODU6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgY29udGV4dCIKK21zZ3N0ciAiRTI4NTogsrvE3LS0vajK5Mjryc/Pws7EIgorCisjOiBtYnl0ZS5jOjMzMDQKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6ILK7xNy08r+qyuTI67eoIgorCisjOiBtYnl0ZS5jOjMzMTUKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IL6vuOY6ILK7xNzSxrP9IElNILXEIGNhbGxiYWNrIgorCisjOiBtYnl0ZS5jOjMzMjEKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogyuTI67eosrvWp7PWyM66ziBzdHlsZSIKKworIzogbWJ5dGUuYzozMzc4Cittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6IMrkyOu3qLK71qez1sjOus4gc3R5bGUiCisKKyM6IG1ieXRlLmM6MzQ1MgorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogb3Zlci10aGUtc3BvdCDQ6NKq19bM5byvKEZvbnRzZXQpIgorCisjOiBtYnl0ZS5jOjM0ODAKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IMTjtcQgR1RLKyCxyCAxLjIuMyDAz6GjsrvE3Mq508PXtMysx/ihoyIKKworIzogbWJ5dGUuYzozNzE3Cittc2dpZCAiRTI5MjogSW5wdXQgTWV0aG9kIFNlcnZlciBpcyBub3QgcnVubmluZyIKK21zZ3N0ciAiRTI5MjogyuTI67eoudzA7bPM0PIoSW5wdXQgTWV0aG9kIFNlcnZlcinOtNTL0NAiCisKKyM6IG1lbWZpbGUuYzo0NzMKK21zZ2lkICJFMjkzOiBibG9jayB3YXMgbm90IGxvY2tlZCIKK21zZ3N0ciAiRTI5Mzogv+nOtLG7y/i2qCIKKworIzogbWVtZmlsZS5jOjk3MgorbXNnaWQgIkUyOTQ6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHJlYWQiCittc2dzdHIgIkUyOTQ6IL27u7vOxLz+tsHIobTtzvMiCisKKyM6IG1lbWZpbGUuYzo5NzcKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTogvbu7u87EvP62wcihtO3O8yIKKworIzogbWVtZmlsZS5jOjEwMjkKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5Njogvbu7u87EvP7QtMjrtO3O8yIKKworIzogbWVtZmlsZS5jOjEwNDcKK21zZ2lkICJFMjk3OiBXcml0ZSBlcnJvciBpbiBzd2FwIGZpbGUiCittc2dzdHIgIkUyOTc6IL27u7vOxLz+0LTI67TtzvMiCisKKyM6IG1lbWZpbGUuYzoxMjQ0Cittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiC9u7u7zsS8/tLRvq205tTaISAo0KHQxLf7usXBrL3htcSwssirwqm2tCE/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6INXSsru1vb/pIDA/IgorCisjOiBtZW1saW5lLmM6MzE1Cittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAxPyIKK21zZ3N0ciAiRTI5ODog1dKyu7W9v+kgMT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiDV0rK7tb2/6SAyPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTog4N7g3iwgvbu7u87EvP6yu7z7wcshISEiCisKKyM6IG1lbWxpbmUuYzo0NDgKK21zZ2lkICJFMzAyOiBDb3VsZCBub3QgcmVuYW1lIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwMjogsrvE3LjEseS9u7u7zsS8/rXEw/uzxiIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzogsrvE3LTyv6q9u7u7zsS8/iBcIiVzXCIsILK7v8nE3LvWuLTByyIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDog1dKyu7W9v+kgMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6INXSsru1vSAlcyC1xL27u7vOxLz+IgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAix+vRodTxxOPSqsq508O1xL27u7vOxLz+ICiwtDAgzcuz9ik6ICIKKworIzogbWVtbGluZS5jOjgxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzA2OiBDYW5ub3Qgb3BlbiAlcyIKK21zZ3N0ciAiRTMwNjogsrvE3LTyv6ogJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICKyu8TctsHIob/pIDA6IgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIr/JxNzE48O71/a5/cjOus7Q3rjEu/LKxyBWaW0gu7nAtLK7vLC4/NDCvbu7u87EvP4uIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgsrvE3NTasb6w5rG+tcQgVmltINbQyrnTwy5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIsq508MgVmltIDMuMKGjXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgv7TG8MC0srvP8crHIFZpbSC9u7u7zsS8/iIKKworIzogbWVtbGluZS5jOjg2OAorbXNnaWQgIiBjYW5ub3QgYmUgdXNlZCBvbiB0aGlzIGNvbXB1dGVyLlxuIgorbXNnc3RyICIgsrvE3NTa1eLMqLXnxNTJz8q508MuXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIrG+zsS8/rS0vajT2iAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIrvyysfV4s7EvP7S0bG7xsa7taGjIgorCisjOiBtZW1saW5lLmM6OTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN3YXAgZmlsZSBcIiVzXCIiCittc2dzdHIgIsq508O9u7u7zsS8/iBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3JpZ2luYWwgZmlsZSBcIiVzXCIiCittc2dzdHIgItStzsS8/iBcIiVzXCIiCisKKyM6IG1lbWxpbmUuYzo5MzQKK21zZ2lkICJFMzA4OiBXYXJuaW5nOiBPcmlnaW5hbCBmaWxlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCIKK21zZ3N0ciAiRTMwODogvq+45jog1K3KvM7EvP6/ycTc0tG+rdDeuMS5/cHLIgorCisjOiBtZW1saW5lLmM6OTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTogsrvE3LTTICVzILbByKG/6SAxIgorCisjOiBtZW1saW5lLmM6OTc5Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/IscnZzKu24NDQIgorCisjOiBtZW1saW5lLmM6OTk1Cittc2dpZCAiPz8/TElORSBDT1VOVCBXUk9ORyIKK21zZ3N0ciAiPz8/0NC6xbTtzvMiCisKKyM6IG1lbWxpbmUuYzoxMDAyCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P7/VtcQgv+kiCisKKyM6IG1lbWxpbmUuYzoxMDI4Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/1dKyu7W90rvQqdDQIgorCisjOiBtZW1saW5lLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogv+kgMSBJRCC07c7zICglcyCyu8rHvbu7u87EvP4/KSIKKworIzogbWVtbGluZS5jOjEwNjUKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz/V0rK7tb2/6SIKKworIzogbWVtbGluZS5jOjEwODEKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gtNPV4sDvtb0gPz8/RU5EILXExNrI3b/JxNzT0M7KzOIiCisKKyM6IG1lbWxpbmUuYzoxMDk3Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz8gtNPV4sDvtb0gPz8/RU5EILXExNrI3b/JxNyxu8m+s/0vsuXI67n9IgorCisjOiBtZW1saW5lLmM6MTExNworbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/RU5EIgorCisjOiBtZW1saW5lLmM6MTE0MworbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiC71ri00tHW0LbPIgorCisjOiBtZW1saW5lLmM6MTE0NQorbXNnaWQgIiIKKyJFMzEyOiBFcnJvcnMgZGV0ZWN0ZWQgd2hpbGUgcmVjb3ZlcmluZzsgbG9vayBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCA/Pz8iCittc2dzdHIgIkUzMTI6ILvWuLTKsbeiyfq07c7zOyDH69ei0uK/qs23zqogPz8/ILXE0NAiCisKKyM6IG1lbWxpbmUuYzoxMTQ4Cittc2dpZCAiUmVjb3ZlcnkgY29tcGxldGVkLiBZb3Ugc2hvdWxkIGNoZWNrIGlmIGV2ZXJ5dGhpbmcgaXMgT0suIgorbXNnc3RyICK71ri0zeqzyS4gx+vIt7ao0rvH0NX9s6MuIgorCisjOiBtZW1saW5lLmM6MTE0OQorbXNnaWQgIiIKKyJcbiIKKyIoWW91IG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3V0IHRoaXMgZmlsZSB1bmRlciBhbm90aGVyIG5hbWVcbiIKK21zZ3N0ciAiIgorIlxuIgorIijE47/JxNzP69KqsNHV4rj2zsS8/sHttObOqrHwtcTOxLz+w/ujrFxuIgorCisjOiBtZW1saW5lLmM6MTE1MAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICLU2da00NAgZGlmZiDT69StzsS8/rHIvc/S1LzssunKx7fx09C4xLHkKVxuIgorCisjOiBtZW1saW5lLmM6MTE1MQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICIiCisiKEQp1rG908m+s/0gLnN3cCC9u7u7zsS8/lxuIgorIlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjEyMDcKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAi1dK1vdLUz8K1xL27u7vOxLz+OiIKKworIzogbWVtbGluZS5jOjEzODUKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAg1NrEv8ewxL/CvDpcbiIKKworIzogbWVtbGluZS5jOjEzODcKK21zZ2lkICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKK21zZ3N0ciAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCisKKyM6IG1lbWxpbmUuYzoxMzkxCittc2dpZCAiICAgSW4gZGlyZWN0b3J5ICIKK21zZ3N0ciAiICAg1NrEv8K8ICIKKworIzogbWVtbGluZS5jOjE0MDkKK21zZ2lkICIgICAgICAtLSBub25lIC0tXG4iCittc2dzdHIgIiAgICAgIC0tIM7eIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDgxCittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICAgIMv509DV3zogIgorCisjOiBtZW1saW5lLmM6MTQ4MworbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgICDI1cbaOiAiCisKKyM6IG1lbWxpbmUuYzoxNDg3IG1lbWxpbmUuYzozNjgwCittc2dpZCAiICAgICAgICAgICAgIGRhdGVkOiAiCittc2dzdHIgIiAgICAgICAgICAgICAgyNXG2jogIgorCisjOiBtZW1saW5lLmM6MTUwMworbXNnaWQgIiAgICAgICAgIFtmcm9tIFZpbSB2ZXJzaW9uIDMuMF0iCittc2dzdHIgIiAgICAgICAgICAgICAgW7TTIFZpbSCw5rG+IDMuMF0iCisKKyM6IG1lbWxpbmUuYzoxNTA3Cittc2dpZCAiICAgICAgICAgW2RvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGVdIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgIFuyu8/xIFZpbSC1xL27u7vOxLz+XSIKKworIzogbWVtbGluZS5jOjE1MTEKK21zZ2lkICIgICAgICAgICBmaWxlIG5hbWU6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICDOxLz+w/s6ICIKKworIzogbWVtbGluZS5jOjE1MjMKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICDQ3rjEuf06ICIKKworIzogbWVtbGluZS5jOjE1MjQKK21zZ2lkICJZRVMiCittc2dzdHIgIsrHIgorCisjOiBtZW1saW5lLmM6MTUyNAorbXNnaWQgIm5vIgorbXNnc3RyICK38SIKKworIzogbWVtbGluZS5jOjE1MjgKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICDTw7unw/s6ICIKKworIzogbWVtbGluZS5jOjE1MzUKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgICAg1ve7+sP7OiAiCisKKyM6IG1lbWxpbmUuYzoxNTM3Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICAg1ve7+sP7OiAiCisKKyM6IG1lbWxpbmUuYzoxNTQzCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICC9+LPMIElEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTQ5Cittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICjV/dTa1rTQ0CkiCisKKyM6IG1lbWxpbmUuYzoxNTYxCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbV0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBbsrvE3NTasb6w5rG+tcQgVmltIMnPyrnTw10iCisKKyM6IG1lbWxpbmUuYzoxNTY0Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIFtub3QgdXNhYmxlIG9uIHRoaXMgY29tcHV0ZXJdIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW7K7xNzU2rG+u/rJz8q508NdIgorCisjOiBtZW1saW5lLmM6MTU2OQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFuyu8TctsHIoV0iCisKKyM6IG1lbWxpbmUuYzoxNTczCittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbsrvE3LTyv6pdIgorCisjOiBtZW1saW5lLmM6MTc2MworbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiCyu8TcsaPB9CwgsrvKudPDvbu7u87EvP4iCisKKyM6IG1lbWxpbmUuYzoxODE2Cittc2dpZCAiRmlsZSBwcmVzZXJ2ZWQiCittc2dzdHIgIs7EvP7S0bGjwfQiCisKKyM6IG1lbWxpbmUuYzoxODE4Cittc2dpZCAiRTMxNDogUHJlc2VydmUgZmFpbGVkIgorbXNnc3RyICJFMzE0OiCxo8H0yqew3CIKKworIzogbWVtbGluZS5jOjE4ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNTogbWxfZ2V0OiBpbnZhbGlkIGxudW06ICVsZCIKK21zZ3N0ciAiRTMxNTogbWxfZ2V0OiC07c7ztcQgbG51bTogJWxkIgorCisjOiBtZW1saW5lLmM6MTkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE2OiBtbF9nZXQ6IGNhbm5vdCBmaW5kIGxpbmUgJWxkIgorbXNnc3RyICJFMzE2OiBtbF9nZXQ6INXSsru1vbXaICVsZCDQ0CIKKworIzogbWVtbGluZS5jOjIzMDMKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDMiCittc2dzdHIgIkUzMTc6INa41eu/6SBpZCC07c7zIDMiCisKKyM6IG1lbWxpbmUuYzoyMzgzCittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICJzdGFja19pZHgg06a4w8rHIDAiCisKKyM6IG1lbWxpbmUuYzoyNDQ1Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiC4/NDCzKu24L/pPyIKKworIzogbWVtbGluZS5jOjI2MDIKK21zZ2lkICJFMzE3OiBwb2ludGVyIGJsb2NrIGlkIHdyb25nIDQiCittc2dzdHIgIkUzMTc6INa41eu/6SBpZCC07c7zIDQiCisKKyM6IG1lbWxpbmUuYzoyNjI5Cittc2dpZCAiZGVsZXRlZCBibG9jayAxPyIKK21zZ3N0ciAiyb6z/b/pIDE/IgorCisjOiBtZW1saW5lLmM6MjgyOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDog1dKyu7W9tdogJWxkINDQIgorCisjOiBtZW1saW5lLmM6MzA3MgorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6INa41eu/6SBpZCC07c7zIgorCisjOiBtZW1saW5lLmM6MzA4OAorbXNnaWQgInBlX2xpbmVfY291bnQgaXMgemVybyIKK21zZ3N0ciAicGVfbGluZV9jb3VudCDOqsHjIgorCisjOiBtZW1saW5lLmM6MzExNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzIyOiBsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVsZCBwYXN0IHRoZSBlbmQiCittc2dzdHIgIkUzMjI6INDQusWzrLP2t7bOpzogJWxkILOsuf294c6yIgorCisjOiBtZW1saW5lLmM6MzEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIzOiBsaW5lIGNvdW50IHdyb25nIGluIGJsb2NrICVsZCIKK21zZ3N0ciAiRTMyMzogv+kgJWxkINDQyv207c7zIgorCisjOiBtZW1saW5lLmM6MzE3MAorbXNnaWQgIlN0YWNrIHNpemUgaW5jcmVhc2VzIgorbXNnc3RyICK20dW7tPPQodT2vNMiCisKKyM6IG1lbWxpbmUuYzozMjE2Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgorbXNnc3RyICJFMzE3OiDWuNXrv+kgaWQgtO0gMiIKKworIzogbWVtbGluZS5jOjM2NzAKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6INei0uIiCisKKyM6IG1lbWxpbmUuYzozNjcxCittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisit6LP1r27u7vOxLz+IFwiIgorCisjOiBtZW1saW5lLmM6MzY3NQorbXNnaWQgIldoaWxlIG9wZW5pbmcgZmlsZSBcIiIKK21zZ3N0ciAitbG08r+qzsS8/sqxIFwiIgorCisjOiBtZW1saW5lLmM6MzY4NAorbXNnaWQgIiAgICAgIE5FV0VSIHRoYW4gc3dhcCBmaWxlIVxuIgorbXNnc3RyICIgICAgICCxyL27u7vOxLz+0MIhXG4iCisKKyMuIFNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgYXJlIGxvbmcgdG8gYWxsb3cgdHJhbnNsYXRpb24gdG8KKyMuICogb3RoZXIgbGFuZ3VhZ2VzLgorIzogbWVtbGluZS5jOjM2ODgKK21zZ2lkICIiCisiXG4iCisiKDEpIEFub3RoZXIgcHJvZ3JhbSBtYXkgYmUgZWRpdGluZyB0aGUgc2FtZSBmaWxlLlxuIgorIiAgICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBiZSBjYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCB0d29cbiIKKyIgICAgZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmaWxlIHdoZW4gbWFraW5nIGNoYW5nZXMuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIoMSkgv8nE3NPQwe3Su7j2s8zQ8tKy1Nqx4LytzazSu7j2zsS8/i5cbiIKKyIgICAgyOe5+8rH1eLR+aOsx+vXotLisrvSqtK7xvDQtMjro6yyu8i7xOO1xMWswaa2vLvhuLbW7rarwfeho1xuIgorCisjOiBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICDNy7P2o6y78srHvMzQ+LHgvK2ho1xuIgorCisjOiBtZW1saW5lLmM6MzY5MAorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSDJz9K7tM6x4LyttMvOxLz+yrGxwMCjXG4iCisKKyM6IG1lbWxpbmUuYzozNjkxCittc2dpZCAiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBcIjpyZWNvdmVyXCIgb3IgXCJ2aW0gLXIgIgorbXNnc3RyICIgICAgyOe5+8rH1eLR+Swgx+vTwyBcIjpyZWNvdmVyXCIgu/IgXCJ2aW0gLXIiCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiIgorIlwiXG4iCisiICAgIHRvIHJlY292ZXIgdGhlIGNoYW5nZXMgKHNlZSBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgu9a4tNDeuMTE2sjdICi9+NK7sr3LtcP3x+u/tCBcIjpoZWxwIHJlY292ZXJ5XCIpLlxuIgorCisjOiBtZW1saW5lLmM6MzY5NAorbXNnaWQgIiAgICBJZiB5b3UgZGlkIHRoaXMgYWxyZWFkeSwgZGVsZXRlIHRoZSBzd2FwIGZpbGUgXCIiCittc2dzdHIgIiAgICDI57n7uMO71ri0tcS2vNLRvq271ri0wcssIMfr1rG908m+s/20y727u7vOxLz+IFwiIgorCisjOiBtZW1saW5lLmM6MzY5NgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDS1LHcw+LU2b+0tb20y9DFz6IuXG4iCisKKyM6IG1lbWxpbmUuYzozNzEwIG1lbWxpbmUuYzozNzE0Cittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICK9u7u7zsS8/iBcIiIKKworIzogbWVtbGluZS5jOjM3MTEgbWVtbGluZS5jOjM3MTcKK21zZ2lkICJcIiBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIlwiINLRvq205tTawcshIgorCisjOiBtZW1saW5lLmM6MzcyMAorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0g16LS4iIKKworIzogbWVtbGluZS5jOjM3MjIKK21zZ2lkICJTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICK9u7u7zsS8/tLRvq205tTaISIKKworIzogbWVtbGluZS5jOjM3MjYKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdCIKK21zZ3N0ciAiIgorItLU1ru2wbe9yr208r+qKCZPKVxuIgorItaxvdOx4LytKCZFKVxuIgorIrvWuLQoJlIpXG4iCisizcuz9igmUSkiCisKKyM6IG1lbWxpbmUuYzozNzI4Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImRGVsZXRlIGl0IgorbXNnc3RyICIiCisi0tTWu7bBt73KvbTyv6ooJk8pXG4iCisi1rG907HgvK0oJkUpXG4iCisiu9a4tCgmUilcbiIKKyLNy7P2KCZRKVxuIgorIsm+s/29u7u7zsS8/igmRCkiCisKKyM6IG1lbWxpbmUuYzozNzgxCittc2dpZCAiRTMyNjogVG9vIG1hbnkgc3dhcCBmaWxlcyBmb3VuZCIKK21zZ3N0ciAiRTMyNjog1dK1vcyrtuC9u7u7zsS8/iIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6ILK/t92yy7Wlz+6yu8rH19Oyy7WlIgorCisjOiBtZW51LmM6NjUKK21zZ2lkICJFMzI4OiBNZW51IG9ubHkgZXhpc3RzIGluIGFub3RoZXIgbW9kZSIKK21zZ3N0ciAiRTMyODogssu1pda7xNzU2sbky/zEo8q91tDKudPDIgorCisjOiBtZW51LmM6NjYKK21zZ2lkICJFMzI5OiBObyBtZW51IG9mIHRoYXQgbmFtZSIKK21zZ3N0ciAiRTMyOTogw7vT0MTH0fm1xLLLtaUiCisKKyM6IG1lbnUuYzo1MDMKK21zZ2lkICJFMzMwOiBNZW51IHBhdGggbXVzdCBub3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzMwOiCyy7WlsrvE3Na4z/LX09GhtaUiCisKKyM6IG1lbnUuYzo1NDIKK21zZ2lkICJFMzMxOiBNdXN0IG5vdCBhZGQgbWVudSBpdGVtcyBkaXJlY3RseSB0byBtZW51IGJhciIKK21zZ3N0ciAiRTMzMTogsrvE3NaxvdOw0bLLtaXP7rzTtb2yy7WlzPXW0CIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogt9a49M/fsrvE3MrHssu1pbXE0ruyv7fWIgorCisjLiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgbWVudSwgYW5kIHdlIGxpc3QgdGhlIG1hcHBpbmdzCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IG1lbnUuYzoxMDYzCittc2dpZCAiIgorIlxuIgorIi0tLSBNZW51cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gssu1pSAtLS0iCisKKyM6IG1lbnUuYzoxOTg5Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICLH0M/CtMuyy7WlIgorCisjOiBtZW51LmM6MjA1NAorbXNnaWQgIkUzMzM6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBtZW51IGl0ZW0iCittc2dzdHIgIkUzMzM6ILLLtaWx2NDo1rjP8tK7uPayy7Wlz+4iCisKKyM6IG1lbnUuYzoyMDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogW7LLtaVdINXSsru1vSAlcyIKKworIzogbWVudS5jOjIxNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogJXMgxKPKvc60tqjS5bLLtaUiCisKKyM6IG1lbnUuYzoyMTgxCittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiCyy7WlsdjQ6Na4z/LX07LLtaUiCisKKyM6IG1lbnUuYzoyMjAyCittc2dpZCAiRTMzNzogTWVudSBub3QgZm91bmQgLSBjaGVjayBtZW51IG5hbWVzIgorbXNnc3RyICJFMzM3OiDV0rK7tb2yy7WlIC0gx+u87LLpssu1pcP7s8YiCisKKyM6IG1lc3NhZ2UuYzo0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcHJvY2Vzc2luZyAlczoiCittc2dzdHIgIrSmwO0gJXMgyrG3osn6tO3O8zoiCisKKyM6IG1lc3NhZ2UuYzo0ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlNGxkOiIKK21zZ3N0ciAi0NAgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1MjMKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW9fWt/u0rsyrs6RdIgorCisjOiBtZXNzYWdlLmM6NjY5Cittc2dpZCAiTWVzc2FnZXMgbWFpbnRhaW5lcjogQnJhbSBNb29sZW5hYXIgPEJyYW1AdmltLm9yZz4iCittc2dzdHIgIrzyzOXW0M7E0MXPos6su6TV3zogV2FuZyBKdW4gPGp1bndAdHVyYm9saW51eC5jb20uY24+IgorCisjOiBtZXNzYWdlLmM6ODgxCittc2dpZCAiSW50ZXJydXB0OiAiCittc2dzdHIgItLR1tC2zzogIgorCisjOiBtZXNzYWdlLmM6ODg0Cittc2dpZCAiSGl0IEVOVEVSIHRvIGNvbnRpbnVlIgorbXNnc3RyICLH67C0IEVOVEVSILzM0PgiCisKKyM6IG1lc3NhZ2UuYzo4ODYKK21zZ2lkICJIaXQgRU5URVIgb3IgdHlwZSBjb21tYW5kIHRvIGNvbnRpbnVlIgorbXNnc3RyICLH67C0IEVOVEVSILvyxuTL/MP8we68zND4IgorCisjOiBtZXNzYWdlLmM6MTk0MAorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tILj8tuAgLS0iCisKKyM6IG1lc3NhZ2UuYzoxOTQzCittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IM/yz8Ivz/LJz9K70NAsIL/VuPEvYjog0rvSsywgZC91OiCw69KzLCBxOiDNy7P2KSIKKworIzogbWVzc2FnZS5jOjE5NDQKK21zZ2lkICIgKFJFVDogbGluZSwgU1BBQ0U6IHBhZ2UsIGQ6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUOiDP8s/C0rvQ0Cwgv9Ww17z8OiDSu9KzLCBkOiCw69KzLCBxOiDNy7P2KSIKKworIzogbWVzc2FnZS5jOjI0MTkgbWVzc2FnZS5jOjI0MzQKK21zZ2lkICJRdWVzdGlvbiIKK21zZ3N0ciAizsrM4iIKKworIzogbWVzc2FnZS5jOjI0MjEKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZZysdcbiIKKyImTrfxIgorCisjOiBtZXNzYWdlLmM6MjQzNgorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZZysdcbiIKKyImTrfxXG4iCisiJkPIoc/7IgorCisjOiBtZXNzYWdlLmM6MjQ1NAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiU2F2ZSAmQWxsXG4iCisiJkRpc2NhcmQgQWxsXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZZysdcbiIKKyImTrfxXG4iCisiJkHIq7K/saO05lxuIgorIiZEyKuyv7K7tOZcbiIKKyImQ8ihz/siCisKKyM6IG1lc3NhZ2UuYzoyNDk0Cittc2dpZCAiU2F2ZSBGaWxlIGRpYWxvZyIKK21zZ3N0ciAisaO05s7EvP621Luwv/IiCisKKyM6IG1lc3NhZ2UuYzoyNDk2Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAitPK/qs7EvP621Luwv/IiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MjU0NworbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiDW97/YzKgoQ29uc29sZSnEo8q9yrHDu9PQzsS8/uSvwMDG9yhmaWxlIGJyb3dzZXIpIgorCisjOiBtaXNjMS5jOjI0NDkKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiDXotLiOiDE49X91NrQ3rjE0ru49ta7tsHOxLz+IgorCisjOiBtaXNjMS5jOjI2NzgKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAiu7nT0NK70NAiCisKKyM6IG1pc2MxLmM6MjY4MAorbXNnaWQgIjEgbGluZSBsZXNzIgorbXNnc3RyICLJ2dPa0rvQ0CIKKworIzogbWlzYzEuYzoyNjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBtb3JlIGxpbmVzIgorbXNnc3RyICIgu7nT0CAlbGQg0NAiCisKKyM6IG1pc2MxLmM6MjY4NworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgZmV3ZXIgbGluZXMiCittc2dzdHIgIta7yqMgJWxkINDQIgorCisjOiBtaXNjMS5jOjI2OTAKK21zZ2lkICIgKEludGVycnVwdGVkKSIKK21zZ3N0ciAiICjS0dbQts8pIgorCisjOiBtaXNjMS5jOjYyNDQKK21zZ2lkICJWaW06IHByZXNlcnZpbmcgZmlsZXMuLi5cbiIKK21zZ3N0ciAiVmltOiCxo8H0zsS8/tbQLi4uXG4iCisKKyMuIGNsb3NlIGFsbCBtZW1maWxlcywgd2l0aG91dCBkZWxldGluZworIzogbWlzYzEuYzo2MjU0Cittc2dpZCAiVmltOiBGaW5pc2hlZC5cbiIKK21zZ3N0ciAiVmltOiC94cr4LlxuIgorCisjOiBtaXNjMi5jOjY0NCBtaXNjMi5jOjY2MAorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIrTtzvM6ICIKKworIzogbWlzYzIuYzo2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIltieXRlc10gdG90YWwgYWxsb2MtZnJlZWQgJWx1LSVsdSwgaW4gdXNlICVsdSwgcGVhayB1c2UgJWx1XG4iCittc2dzdHIgIiIKKyJcbiIKKyJbYnl0ZXNdIMirsr8gYWxsb2MtZnJlZWQgJWx1LSVsdSwgyrnTw9bQICVsdSwgcGVhayDKudPDICVsdVxuIgorCisjOiBtaXNjMi5jOjY2NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJbtffTw10gyKuyvyByZS9tYWxsb2MoKTogJWx1LCDIq7K/IGZyZWUoKSc6ICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjcyMQorbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6ILTL0NC5/bOkIgorCisjOiBtaXNjMi5jOjc2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQxOiBJbnRlcm5hbCBlcnJvcjogbGFsbG9jKCVsZCwgKSIKK21zZ3N0ciAiRTM0MTogxNqyv7TtzvM6IGxhbGxvYyglbGQsICkiCisKKyM6IG1pc2MyLmM6ODczCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDI6IE91dCBvZiBtZW1vcnkhICAoYWxsb2NhdGluZyAlbHUgYnl0ZXMpIgorbXNnc3RyICJFMzQyOiDE2rTmsrvX4yEgKLOiytTF5NbDICVsdSDX1r3a1+kpIgorCisjOiBtaXNjMi5jOjI1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiCittc2dzdHIgIrX308Mgc2hlbGwg1rTQ0DogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI3MDMgbWlzYzIuYzo1MTQyIG9wdGlvbi5jOjQ1ODQKK21zZ2lkICJNaXNzaW5nIGNvbG9uIgorbXNnc3RyICLIscnZw7C6xSIKKworIzogbWlzYzIuYzoyNzA1IG1pc2MyLmM6MjczMgorbXNnaWQgIklsbGVnYWwgbW9kZSIKK21zZ3N0ciAisrvV/ci3tcTEo8q9IgorCisjOiBtaXNjMi5jOjI3NzEKK21zZ2lkICJJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIrK71f3It7XEyvOx6tDO17QiCisKKyM6IG1pc2MyLmM6MjgxMSBtaXNjMi5jOjUxNjIKK21zZ2lkICJkaWdpdCBleHBlY3RlZCIKK21zZ3N0ciAi06a4w86qyv3X1iIKKworIzogbWlzYzIuYzoyODE2Cittc2dpZCAiSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICKyu9X9yLe1xLDZt9axyCIKKworIzogbWlzYzIuYzozMTIwCittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiyuTI68Pcwus6ICIKKworIzogbWlzYzIuYzozMTIxCittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAix+vU2crkyOvSu7TOOiAiCisKKyM6IG1pc2MyLmM6MzEzMQorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICLBvbTOyuTI68Pcwuuyu82sISIKKworIzogbWlzYzIuYzozNjQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFMzQzOiBJbnZhbGlkIHBhdGg6ICcqKltudW1iZXJdJyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGggb3IgYmUgIgorImZvbGxvd2VkIGJ5ICclcycuIgorbXNnc3RyICJFMzQzOiCyu9X9yLe1xMK3vrY6ICcqKltudW1iZXJdJyCx2NDo0qrU2sK3vra94c6yu/LSqr3T1vggJyVzJyIKKworIzogbWlzYzIuYzo0ODk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDQ6IENhbid0IGZpbmQgZGlyZWN0b3J5IFwiJXNcIiBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDQ6IGNkcGF0aCDW0MO709DEv8K8IFwiJXNcIiIKKworIzogbWlzYzIuYzo0OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTog1NrCt7621tDV0rK7tb3OxLz+IFwiJXNcIiIKKworIzogbWlzYzIuYzo0OTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6INTawre+ttbQ1dKyu7W9uPy24LXEzsS8/iBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NDkxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6INTawre+ttbQ1dKyu7W9uPy24LXEzsS8/iBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NTE1NAorbXNnaWQgIklsbGVnYWwgY29tcG9uZW50IgorbXNnc3RyICKyu9X9yLe1xNfpvP4iCisKKyM6IG5vcm1hbC5jOjI3OTgKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICLXotLiOiDE47XE1tW2y7K7xNzP1Mq+uN/BwbbIIgorCisjOiBub3JtYWwuYzoyOTkzCittc2dpZCAiRTM0ODogTm8gc3RyaW5nIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTM0ODogueKx6rSmw7vT0NfWt/u0riIKKworIzogbm9ybWFsLmM6Mjk5NQorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiC54rHqtKbDu9PQyrax8NfWIgorCisjOiBub3JtYWwuYzo0MTYwCittc2dpZCAiRTM1MjogQ2Fubm90IGVyYXNlIGZvbGRzIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTI6ILK7xNzU2sS/x7C1xCAnZm9sZG1ldGhvZCcgz8LJvrP9IGZvbGQiCisKKyM6IG9wcy5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAxIHRpbWUiCittc2dzdHIgItK70NAgJXMguf0g0ru0ziIKKworIzogb3BzLmM6MjczCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkICVkIHRpbWVzIgorbXNnc3RyICLSu9DQICVzILn9ICVkILTOIgorCisjOiBvcHMuYzoyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgMSB0aW1lIgorbXNnc3RyICIlbGQg0NAgJXMguf0g0ru0ziIKKworIzogb3BzLmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQg0NAgJXMguf0gJWQgtM4iCisKKyM6IG9wcy5jOjYzOAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAiyrax8CAlbGQg0NAuLi4iCisKKyM6IG9wcy5jOjY4OAorbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgItK70NDS0cq2sfAiCisKKyM6IG9wcy5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgaW5kZW50ZWQgIgorbXNnc3RyICLS0cq2sfAgJWxkINDQIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogb3BzLmM6MTUyOAorbXNnaWQgImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IgorbXNnc3RyICKyu8TcuLTWxjsg1rG908m+s/0iCisKKyM6IG9wcy5jOjIwMTgKK21zZ2lkICIxIGxpbmUgY2hhbmdlZCIKK21zZ3N0ciAiIDEg0NAgfmVkIgorCisjOiBvcHMuYzoyMDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIgJWxkINDQIH5lZCIKKworIzogb3BzLmM6MjM4MQorIywgYy1mb3JtYXQKK21zZ2lkICJmcmVlaW5nICVsZCBsaW5lcyIKK21zZ3N0ciAiys23xSAlbGQg0NDW0CIKKworIzogb3BzLmM6MjY1OAorbXNnaWQgIjEgbGluZSB5YW5rZWQiCittc2dzdHIgItLRuLTWxiAxINDQIgorCisjOiBvcHMuYzoyNjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB5YW5rZWQiCittc2dzdHIgItLRuLTWxiAlbGQg0NAiCisKKyM6IG9wcy5jOjI5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1MzogTm90aGluZyBpbiByZWdpc3RlciAlcyIKK21zZ3N0ciAiRTM1MzogvMS05sb3ICVzIMDvw7vT0LarzvciCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6MzQ1NAorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSC8xLTmxvcgLS0tIgorCisjOiBvcHMuYzo0NTY1Cittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICKyu9X9yLe1xLzEtObG98P7s8YiCisKKyM6IG9wcy5jOjQ2NDUKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjILzEtObG9zpcbiIKKworIzogb3BzLmM6NDY3MQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIs601qq1xNeisuHA4NDNOiAlZCIKKworIzogb3BzLmM6NTA1MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU0OiBJbnZhbGlkIHJlZ2lzdGVyIG5hbWU6ICclcyciCittc2dzdHIgIkUzNTQ6ILzEtObG98P7s8a07c7zOiAnJXMnIgorCisjOiBvcHMuYzo1MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBDb2xzOyAiCittc2dzdHIgIiVsZCDB0DsgIgorCisjOiBvcHMuYzo1NDAwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAi0aHU8cHLICVzJWxkLyVsZCDQ0DsgJWxkLyVsZCDX1ihXb3JkKTsgJWxkLyVsZCDX1rf7KEJ5dGVzKSIKKworIzogb3BzLmM6NTQxNgorIywgYy1mb3JtYXQKK21zZ2lkICJDb2wgJXMgb2YgJXM7IExpbmUgJWxkIG9mICVsZDsgV29yZCAlbGQgb2YgJWxkOyBCeXRlICVsZCBvZiAlbGQiCittc2dzdHIgIsHQICVzLyVzOyDQ0CAlbGQvJWxkOyDX1ihXb3JkKSAlbGQvJWxkOyDX1rf7KEJ5dGUpICVsZC8lbGQiCisKKyM6IG9wcy5jOjU0MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIGZvciBCT00pIgorCisjOiBvcHRpb24uYzoxOTg5Cittc2dpZCAiVGhhbmtzIGZvciBmbHlpbmcgVmltIgorbXNnc3RyICK40NC7xPrRodTxIFZpbSIKKworIzogb3B0aW9uLmM6MzE3NQorbXNnaWQgIk9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICKyu9ans9a4w9Ghz+4iCisKKyM6IG9wdGlvbi5jOjMyMDAKK21zZ2lkICJOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICKyu8Tc1NrEo8q90NDA77P2z9YiCisKKyM6IG9wdGlvbi5jOjMyNTYKK21zZ2lkICIiCisiXG4iCisiXHRMYXN0IHNldCBmcm9tICIKK21zZ3N0ciAiIgorIlxuIgorIlx0tbHHsMno1sM6ICIKKworIzogb3B0aW9uLmM6MzM5NQorbXNnaWQgIk51bWJlciByZXF1aXJlZCBhZnRlciA9IgorbXNnc3RyICI9ILrz0OjSqtPQyv3X1iIKKworIzogb3B0aW9uLmM6MzcwMiBvcHRpb24uYzo0MzA5Cittc2dpZCAiTm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIlRlcm1jYXAgwO/D5tXSsru1vSIKKworIzogb3B0aW9uLmM6Mzc2OAorIywgYy1mb3JtYXQKK21zZ2lkICJJbGxlZ2FsIGNoYXJhY3RlciA8JXM+IgorbXNnc3RyICKyu9X9yLe1xNfWt/sgPCVzPiIKKworIzogb3B0aW9uLmM6NDI5NCBvcHRpb24uYzo1NDk3Cittc2dpZCAiTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAi1eLA77K7v8nKudPDIgorCisjOiBvcHRpb24uYzo0MzAxCittc2dpZCAiQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICKyu8Tcyei2qCAndGVybScgzqq/1dfWt/u0riIKKworIzogb3B0aW9uLmM6NDMwNAorbXNnaWQgIkNhbm5vdCBjaGFuZ2UgdGVybSBpbiBHVUkiCittc2dzdHIgItTazbzQzb3nw+bW0LK7xNzH0Lu71tW2yyIKKworIzogb3B0aW9uLmM6NDMwNgorbXNnaWQgIlVzZSBcIjpndWlcIiB0byBzdGFydCB0aGUgR1VJIgorbXNnc3RyICLK5MjrIFwiOmd1aVwiIMC0xvS2r8280M6958PmIgorCisjOiBvcHRpb24uYzo0MzI3Cittc2dpZCAiJ2JhY2t1cGV4dCcgYW5kICdwYXRjaG1vZGUnIGFyZSBlcXVhbCIKK21zZ3N0ciAiJ2JhY2t1cGV4dCcguPogJ3BhdGNobW9kZScgysfSu9H5tcQiCisKKyM6IG9wdGlvbi5jOjQ1ODYKK21zZ2lkICJaZXJvIGxlbmd0aCBzdHJpbmciCittc2dzdHIgIsHjs6S2yNfWt/u0riIKKworIzogb3B0aW9uLmM6NDY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICI8JXM+ILrzyLHJ2cr919YiCisKKyM6IG9wdGlvbi5jOjQ2NjgKK21zZ2lkICJNaXNzaW5nIGNvbW1hIgorbXNnc3RyICLIscnZtrq6xSIKKworIzogb3B0aW9uLmM6NDY3NQorbXNnaWQgIk11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIrHY0OjWuLao0ru49iAnINa1IgorCisjOiBvcHRpb24uYzo0NzE1Cittc2dpZCAiY29udGFpbnMgdW5wcmludGFibGUgY2hhcmFjdGVyIgorbXNnc3RyICKw/LqssrvE3M/Uyr61xNfWt/siCisKKyM6IG9wdGlvbi5jOjQ3MjgKK21zZ2lkICJJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIrK71f3It7XE19bM5SIKKworIzogb3B0aW9uLmM6NDczNAorbXNnaWQgImNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICKyu8TcyrnTw9fWzOW8ryhGb250c2V0KSIKKworIzogb3B0aW9uLmM6NDczNgorbXNnaWQgIkludmFsaWQgZm9udHNldCIKK21zZ3N0ciAisrvV/ci3tcTX1szlvK8oRm9udHNldCkiCisKKyM6IG9wdGlvbi5jOjQ3NDMKK21zZ2lkICJjYW4ndCBzZWxlY3Qgd2lkZSBmb250IgorbXNnc3RyICKyu8TcyrnTw8notqi1xL/t19bM5ShXaWRlZm9udCkiCisKKyM6IG9wdGlvbi5jOjQ3NDUKK21zZ2lkICJJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAisrvV/ci3tcS/7dfWzOUoV2lkZWZvbnQpIgorCisjOiBvcHRpb24uYzo1MDE0CisjLCBjLWZvcm1hdAorbXNnaWQgIklsbGVnYWwgY2hhcmFjdGVyIGFmdGVyIDwlYz4iCittc2dzdHIgIjwlYz4guvPT0LK71f3It7XE19a3+yIKKworIzogb3B0aW9uLmM6NTA5NworbXNnaWQgImNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICLQ6NKqtrq6xSIKKworIzogb3B0aW9uLmM6NTEwNgorIywgYy1mb3JtYXQKK21zZ2lkICInY29tbWVudHN0cmluZycgbXVzdCBiZSBlbXB0eSBvciBjb250YWluICVzIgorbXNnc3RyICInY29tbWVudHN0cmluZycgsdjQ6MrHv9Ww17vysPy6rCAlcyIKKworIzogb3B0aW9uLmM6NTE1MworbXNnaWQgIk5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIrK71qez1srzseoiCisKKyM6IG9wdGlvbi5jOjUzOTkKK21zZ2lkICJVbmNsb3NlZCBleHByZXNzaW9uIHNlcXVlbmNlIgorbXNnc3RyICLDu9PQveHK+LXEse2078q9OiAiCisKKyM6IG9wdGlvbi5jOjU0MDMKK21zZ2lkICJ0b28gbWFueSBpdGVtcyIKK21zZ3N0ciAizKu24LbUz/MiCisKKyM6IG9wdGlvbi5jOjU0MDUKK21zZ2lkICJ1bmJhbGFuY2VkIGdyb3VwcyIKK21zZ3N0ciAisru21LPGtcTX6SIKKworIzogb3B0aW9uLmM6NTYyMAorbXNnaWQgIkEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgItSkwMC0sL/a0tG+rbTm1NrByyIKKworIzogb3B0aW9uLmM6NTg4MSBvcHRpb24uYzo1OTEwCittc2dpZCAiJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiJ3dpbmhlaWdodCcgsrvE3LHIICd3aW5taW5oZWlnaHQnILj8ydkiCisKKyM6IG9wdGlvbi5jOjU5MjYgb3B0aW9uLmM6NTk0NQorbXNnaWQgIid3aW53aWR0aCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWlud2lkdGgnIgorbXNnc3RyICInd2lud2lkdGgnILK7xNyxyCAnd2lubWlud2lkdGgnILj8ydkiCisKKyM6IG9wdGlvbi5jOjYwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAi1sHJ2dDo0qogJWQg0NAiCisKKyM6IG9wdGlvbi5jOjYwOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCBhdCBsZWFzdCAlZCBjb2x1bW5zIgorbXNnc3RyICLWwcnZ0OjSqiAlZCDB0CIKKworIzogb3B0aW9uLmM6NjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU1OiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUzNTU6ILK71f3It7XE0aHP7jogJXMiCisKKyM6IG9wdGlvbi5jOjY1MDAKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGNvZGVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDW1bbLseDC6yAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDIKK21zZ2lkICIiCisiXG4iCisiLS0tIEdsb2JhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDIq77WINGhz+7WtSAtLS0iCisKKyM6IG9wdGlvbi5jOjY1MDQKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tILG+tdgg0aHP7ta1IC0tLSIKKworIzogb3B0aW9uLmM6NjUwNgorbXNnaWQgIiIKKyJcbiIKKyItLS0gT3B0aW9ucyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g0aHP7iAtLS0iCisKKyM6IG9wdGlvbi5jOjcxOTYKK21zZ2lkICJFMzU2OiBnZXRfdmFycCBFUlJPUiIKK21zZ3N0ciAiRTM1NjogZ2V0X3ZhcnAgtO3O8yIKKworIzogb3B0aW9uLmM6ODExMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiDV0rK7tb0gJXMgttTTprXE19a3+yIKKworIzogb3B0aW9uLmM6ODE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU4OiAnbGFuZ21hcCc6IEV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgc2VtaWNvbG9uOiAlcyIKK21zZ3N0ciAiRTM1ODogJ2xhbmdtYXAnOiC31rrFuvPT0Lbg0+C1xNfWt/s6ICVzIgorCisjOiBvc19hbWlnYS5jOjI3MworbXNnaWQgImNhbm5vdCBvcGVuICIKK21zZ3N0ciAisrvE3LTyv6oiCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiCyu8TctPK/qrSwv9ohXG4iCisKKyM6IG9zX2FtaWdhLmM6MzI5Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAi0OjSqiBBbWlnYWRvcyCw5rG+IDIuMDQg0tTJz1xuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgItDo0qogJXMgsOaxviAlbGRcbiIKKworIzogb3NfYW1pZ2EuYzo0MDcKK21zZ2lkICJDYW5ub3Qgb3BlbiBOSUw6XG4iCittc2dzdHIgIrK7xNy08r+qIE5JTDpcbiIKKworIzogb3NfYW1pZ2EuYzo0MTgKK21zZ2lkICJDYW5ub3QgY3JlYXRlICIKK21zZ3N0ciAisrvE3LS0vaggIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSC3tbvY1rU6ICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTI4Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAisrvE3MfQu7vW97/YzKgoY29uc29sZSnEo8q9ICE/XG4iCisKKyM6IG9zX2FtaWdhLmM6OTM4IG9zX21hYy5jOjExNjggb3NfbXN3aW4uYzo2MTkgb3NfcmlzY29zLmM6NzI4IG9zX3VuaXguYzoyNzI2Cittc2dpZCAiRTM1OTogU2NyZWVuIG1vZGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFMzU5OiCyu9ans9bJ6LaoxsHEu8Sjyr0iCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTogsrvKx9b3v9jMqChjb25zb2xlKT8/XG4iCisKKyMuIGlmIFZpbSBvcGVuZWQgYSB3aW5kb3c6IEV4ZWN1dGluZyBhIHNoZWxsIG1heSBjYXVzZSBjcmFzaGVzCisjOiBvc19hbWlnYS5jOjExNDIKK21zZ2lkICJFMzYwOiBDYW5ub3QgZXhlY3V0ZSBzaGVsbCB3aXRoIC1mIG9wdGlvbiIKK21zZ3N0ciAiRTM2MDogsrvE3NPDIC1mINGhz+7WtNDQIHNoZWxsIgorCisjOiBvc19hbWlnYS5jOjExODMgb3NfYW1pZ2EuYzoxMjczCittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICKyu8Tc1rTQ0CAiCisKKyM6IG9zX2FtaWdhLmM6MTE4NiBvc19hbWlnYS5jOjEyODMKK21zZ2lkICJzaGVsbCAiCittc2dzdHIgInNoZWxsICIKKworIzogb3NfYW1pZ2EuYzoxMjA2IG9zX2FtaWdhLmM6MTMwOAorbXNnaWQgIiByZXR1cm5lZFxuIgorbXNnc3RyICIg0tG3tbvYXG4iCisKKyM6IG9zX2FtaWdhLmM6MTQ0OAorbXNnaWQgIkFOQ0hPUl9CVUZfU0laRSB0b28gc21hbGwuIgorbXNnc3RyICJBTkNIT1JfQlVGX1NJWkUgzKvQoSIKKworIzogb3NfYW1pZ2EuYzoxNDUyCittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08gtO3O8yIKKworIzogb3NfbXN3aW4uYzo1MDMKK21zZ2lkICIuLi4odHJ1bmNhdGVkKSIKK21zZ3N0ciAiIgorCisjOiBvc19tc3dpbi5jOjU5NAorbXNnaWQgIidjb2x1bW5zJyBpcyBub3QgODAsIGNhbm5vdCBleGVjdXRlIGV4dGVybmFsIGNvbW1hbmRzIgorbXNnc3RyICInY29sdW1ucycgsrvKxyA4MCwgsrvE3Na00NDN4rK/w/zB7iIKKworIzogb3NfbXN3aW4uYzo3MDYgb3NfdW5peC5jOjQ5NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2NDogTGlicmFyeSBjYWxsIGZhaWxlZCBmb3IgXCIlcygpXCIiCittc2dzdHIgIkUzNjQ6ILX308O6r8r9v+IgXCIlc1wiKCkgyqew3CIKKworIzogb3NfbXN3aW4uYzoxMzQwCittc2dpZCAiRTIzNzogUHJpbnRlciBzZWxlY3Rpb24gZmFpbGVkIgorbXNnc3RyICJFMjM3OiCyu8Tc0aHU8bTLtPLTobv6IgorCisjOiBvc19tc3dpbi5jOjEzODgKKyMsIGMtZm9ybWF0Cittc2dpZCAidG8gJXMgb24gJXMiCittc2dzdHIgIrTTICVzILW9ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NDkgb3NfbXN3aW4uYzoxNDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzg6IFByaW50IGVycm9yOiAlcyIKK21zZ3N0ciAiRTIzODogtPLTobTtzvM6ICVzIgorCisjOiBvc19tc3dpbi5jOjE0NTkKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICLOtNaqIgorCisjOiBvc19tc3dpbi5jOjE0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRpbmcgJyVzJyIKK21zZ3N0ciAi0tG08tOhOiAnJXMnIgorCisjOiBvc19tc3dpbi5jOjI1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NDogSWxsZWdhbCBjaGFyc2V0IG5hbWUgXCIlc1wiIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDQ6INfWt/u8ryBcIiVzXCIgsrvE3LbU06bX1szlXCIlc1wiIgorCisjOiBvc19tc3dpbi5jOjI1NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0NTogSWxsZWdhbCBjaGFyICclYycgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NTogsrvV/ci3tcTX1rf7ICclYycgs/bP1tTa19bM5cP7s8YgXCIlc1wiIMTaIgorCisjOiBvc19yaXNjb3MuYzoxMjI3Cittc2dpZCAiRTM2NjogSW52YWxpZCAnb3NmaWxldHlwZScgb3B0aW9uIC0gdXNpbmcgVGV4dCIKK21zZ3N0ciAiRTM2NjogsrvV/ci3tcQgJ2ZpbGV0eXBlJyDRoc/uIC0gyrnTw7S/zsTX1sSjyr0iCisKKyM6IG9zX3VuaXguYzo4MDAKK21zZ2lkICJWaW06IERvdWJsZSBzaWduYWwsIGV4aXRpbmdcbiIKK21zZ3N0ciAiVmltOiDLq9bY0MW6xSwgzcuz9tbQXG4iCisKKyM6IG9zX3VuaXguYzo4MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IENWaW06IMC5vdi1vdDFusUoc2lnbmFsKSAlc1xuIgorCisjOiBvc191bml4LmM6ODA5Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IMC5vdi1vdbCw/y1xNDFusUoZGVhZGx5IHNpZ25hbGUpXG4iCisKKyM6IG9zX3VuaXguYzoxMDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICK08r+qIFggV2luZG93INPDyrEgJWxkIMPrIgorCisjOiBvc191bml4LmM6MTA5MAorbXNnaWQgIiIKKyJcbiIKKyJWaW06IEdvdCBYIGVycm9yXG4iCittc2dzdHIgIiIKKyJcbiIKKyJWaW06IFggtO3O81xuIgorCisjOiBvc191bml4LmM6MTE1NworbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIrLiytQgWCBXaW5kb3cgyqew3CIKKworIzogb3NfdW5peC5jOjEzMDEKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdGltZWQgb3V0IgorbXNnc3RyICK08r+qIFggV2luZG93ILOsyrEiCisKKyM6IG9zX3VuaXguYzoyODk5IG9zX3VuaXguYzozNDgzCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsICIKK21zZ3N0ciAiIgorIlxuIgorIrK7xNzWtNDQIHNoZWxsIgorCisjOiBvc191bml4LmM6Mjk0NAorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisisrvE3Na00NAgc2hlbGwgc2hcbiIKKworIzogb3NfdW5peC5jOjI5NDggb3NfdW5peC5jOjM0ODkKK21zZ2lkICIiCisiXG4iCisic2hlbGwgcmV0dXJuZWQgIgorbXNnc3RyICIiCisiXG4iCisiU2hlbGwg0tG3tbvYIgorCisjOiBvc191bml4LmM6MzA4MgorbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgY3JlYXRlIHBpcGVzXG4iCittc2dzdHIgIiIKKyJcbiIKKyKyu8TcvajBornctcBcbiIKKworIzogb3NfdW5peC5jOjMwOTcKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGZvcmtcbiIKK21zZ3N0ciAiIgorIlxuIgorIrK7xNwgZm9ya1xuIgorCisjOiBvc191bml4LmM6MzQ5NgorbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIsP8we7S0b3hyvhcbiIKKworIzogb3NfdW5peC5jOjQ5OTMKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgZmFpbGVkIgorbXNnc3RyICK08r+qIFggV2luZG93IMqnsNwiCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgItTa0NC6xSAiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIrK7xNy809TYIHZpbTMyLmRsbKOhIgorCisjOiBvc193MzJleGUuYzoxNjkgb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiVklNIEVycm9yIgorbXNnc3RyICJWSU0gtO3O8yIKKworIzogb3NfdzMyZXhlLmM6MTc5Cittc2dpZCAiQ291bGQgbm90IGZpeCB1cCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgRExMISIKK21zZ3N0ciAisrvE3NDe1f26r8r91rjV67W9IERMTCEiCisKKyM6IG9zX3dpbjE2LmM6NTc4IG9zX3dpbjMyLmM6MzAxOQorIywgYy1mb3JtYXQKK21zZ2lkICJzaGVsbCByZXR1cm5lZCAlZCIKK21zZ3N0ciAiU2hlbGwgt7W72Na1ICVkIgorCisjOiBvc193aW4zMi5jOjI0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgJXMgZXZlbnRcbiIKK21zZ3N0ciAiVmltOiDAub3Ytb0gJXMgysK8/lxuIgorCisjOiBvc193aW4zMi5jOjI0OTEKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAiudix1SIKKworIzogb3Nfd2luMzIuYzoyNDkzCittc2dpZCAibG9nb2ZmIgorbXNnc3RyICLXos/7IgorCisjOiBvc193aW4zMi5jOjI0OTQKK21zZ2lkICJzaHV0ZG93biIKK21zZ3N0ciAiudi7+iIKKworIzogb3Nfd2luMzIuYzoyOTc1Cittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6INXSsru1vcP8we4iCisKKyM6IG9zX3dpbjMyLmM6Mjk4OAorbXNnaWQgIiIKKyJWSU1SVU4uRVhFIG5vdCBmb3VuZCBpbiB5b3VyICRQQVRILlxuIgorIkV4dGVybmFsIGNvbW1hbmRzIHdpbGwgbm90IHBhdXNlIGFmdGVyIGNvbXBsZXRpb24uXG4iCisiU2VlICA6aGVscCB3aW4zMi12aW1ydW4gIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21zZ3N0ciAiIgorItTaxOO1xCAkUEFUSCDW0NXSsru1vSBWSU1SVU4uRVhFLlxuIgorIs3isr/D/MHu1rTQ0M3qsc+6872rsru74dTdzaMuXG4iCisivfjSu7K9y7XD98fr1rTQ0CA6aGVscCB3aW4zMi12aW1ydW4gIgorCisjOiBvc193aW4zMi5jOjI5OTEKK21zZ2lkICJWaW0gV2FybmluZyIKK21zZ3N0ciAiVmltIL6vuOYiCisKKyM6IHF1aWNrZml4LmM6MjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3MjoguPHKvbuv19a3+7SuwO/T0MyrtuAgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6Mjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzczOiC48cq9u6/X1rf7tK6yu9OmuMOz9s/WICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjM0OAorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiC48cq9u6/X1rf7tK7A78nZwcsgXSIKKworIzogcXVpY2tmaXguYzozNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiC48cq9u6/X1rf7tK7A79PQsrvWp7PWtcQgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6MzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3NjoguPHKvbuv19a3+7Suv6rNt8Dv09Cyu9X9yLe1xCAlJSVjICIKKworIzogcXVpY2tmaXguYzozODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6ILjxyr27r9fWt/u0rsDv09Cyu9X9yLe1xCAlJSVjICIKKworIzogcXVpY2tmaXguYzo0MTQKK21zZ2lkICJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iCittc2dzdHIgIkUzNzg6ICdlcnJvcmZvcm1hdCcgzrTJ6LaoIgorCisjOiBxdWlja2ZpeC5jOjUyMAorbXNnaWQgIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiCittc2dzdHIgIkUzNzk6INXSsru1vcS/wrzD+7PGu/LKx7/VtcTEv8K8w/uzxiIKKworIzogcXVpY2tmaXguYzo5MzEKK21zZ2lkICJObyBtb3JlIGl0ZW1zIgorbXNnc3RyICLDu9PQxuTL/LbUz/MiCisKKyM6IHF1aWNrZml4LmM6MTE1MgorIywgYy1mb3JtYXQKK21zZ2lkICIoJWQgb2YgJWQpJXMlczogIgorbXNnc3RyICIoJWQgLyAlZCklcyVzOiAiCisKKyM6IHF1aWNrZml4LmM6MTE1NAorbXNnaWQgIiAobGluZSBkZWxldGVkKSIKK21zZ3N0ciAiICjQ0NLRyb6z/SkiCisKKyM6IHF1aWNrZml4LmM6MTM2MAorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDogUXVpY2tmaXggttHVu73hzrIiCisKKyM6IHF1aWNrZml4LmM6MTM2OQorbXNnaWQgIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MTogUXVpY2tmaXggttHVu7altssiCisKKyM6IHF1aWNrZml4LmM6MTM4MQorIywgYy1mb3JtYXQKK21zZ2lkICJlcnJvciBsaXN0ICVkIG9mICVkOyAlZCBlcnJvcnMiCittc2dzdHIgIrTtzvPB0LHtICVkLyVkOyC5stPQICVkIM/utO3O8yIKKworIzogcXVpY2tmaXguYzoxODQyCittc2dpZCAiRTM4MjogQ2Fubm90IHdyaXRlLCAnYnVmdHlwZScgb3B0aW9uIGlzIHNldCIKK21zZ3N0ciAiRTM4MjogsrvE3NC0yOujrCdidWZ0eXBlJyDRoc/u0tHJ6LaoIgorCisjOiByZWdleHAuYzo4MDEKK21zZ2lkICJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIgorbXNnc3RyICJFMzM5OiDD+9fWzKuzpCIKKworIzogcmVnZXhwLmM6MTMxNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE6IE5lc3RlZCAlcyoiCittc2dzdHIgIkU2MTogs7LXtCAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiCzste0ICVzJWMiCisKKyM6IHJlZ2V4cC5jOjE0NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIMO709C907arzvciCisKKyM6IHJlZ2V4cC5jOjI0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgItPvt6i07c7zOiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzE2Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6ILK7xNzWtNDQOyByZWd1bGFyIGV4cHJlc3Npb24gzKu4tNTTPyIKKworIzogcmVnZXhwLmM6Mjg1MQorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogcmVndWxhciBleHByZXNzaW9uINTss8m20dW708O54rXEtO3O8yIKKworIzogcmVnZXhwLmM6MzA4NworbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIs3isr+3+7rPOlxuIgorCisjOiBzY3JlZW4uYzoyMDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0t0tEgZm9sZCAlM2xkINDQIgorCisjOiBzY3JlZW4uYzo3NDExCittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgVi3M5ru7IgorCisjOiBzY3JlZW4uYzo3NDE1Cittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiDM5ru7IgorCisjOiBzY3JlZW4uYzo3NDIwCittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiC3tNeqIgorCisjOiBzY3JlZW4uYzo3NDIyCittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiILLlyOsiCisKKyM6IHNjcmVlbi5jOjc0MjUKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAosuXI6ykiCisKKyM6IHNjcmVlbi5jOjc0MjcKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKMzmu7spIgorCisjOiBzY3JlZW4uYzo3NDI5Cittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAodi3M5ru7KSIKKworIzogc2NyZWVuLmM6NzQzMgorbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiDPo7KuwLMiCisKKyM6IHNjcmVlbi5jOjc0NDAKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKNPv0dQpIgorCisjOiBzY3JlZW4uYzo3NDQzCittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAo1bPM+ykiCisKKyM6IHNjcmVlbi5jOjc0NDkKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIg0aHIoSIKKworIzogc2NyZWVuLmM6NzQ1MQorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiC/ycrTIgorCisjOiBzY3JlZW4uYzo3NDUzCittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIgv+kiCisKKyM6IHNjcmVlbi5jOjc0NTUKK21zZ2lkICIgTElORSIKK21zZ3N0ciAiINDQIgorCisjOiBzY3JlZW4uYzo3NDY4IHNjcmVlbi5jOjc1MjIKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgIrzHwrzW0CIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgItLRsunV0rW9zsS8/r+qzbeju9TZtNO94c6yvMzQ+LLp1dIiCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICLS0bLp1dK1vc7EvP694c6yo7vU2bTTv6rNt7zM0Piy6dXSIgorCisjOiBzZWFyY2guYzo0NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4MzogtO3O87XEsunV0tfWt/u0rjogJXMiCisKKyM6IHNlYXJjaC5jOjc0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMzg0OiBzZWFyY2ggaGl0IFRPUCB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODQ6INLRsunV0rW9zsS8/r+qzbfI1NXSsru1vSAlcyIKKworIzogc2VhcmNoLmM6NzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODU6IHNlYXJjaCBoaXQgQk9UVE9NIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NTog0tGy6dXStb3OxLz+veHOssjU1dKyu7W9ICVzIgorCisjOiBzZWFyY2guYzoxMTA3Cittc2dpZCAiRTM4NjogRXhwZWN0ZWQgJz8nIG9yICcvJyAgYWZ0ZXIgJzsnIgorbXNnc3RyICJFMzg2OiDU2iAnOycguvPD5tOmuMPT0CAnPycgu/IgJy8nIgorCisjOiBzZWFyY2guYzozNDc2Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAosPzAqMnPtM7B0LP2t/u6z8/uKSIKKworIy4gY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjOiBzZWFyY2guYzozNDk2Cittc2dpZCAiLS0tIEluY2x1ZGVkIGZpbGVzICIKK21zZ3N0ciAiLS0tILD8uqzOxLz+ICIKKworIzogc2VhcmNoLmM6MzQ5OAorbXNnaWQgIm5vdCBmb3VuZCAiCittc2dzdHIgItXSsru1vSAiCisKKyM6IHNlYXJjaC5jOjM0OTkKK21zZ2lkICJpbiBwYXRoIC0tLVxuIgorbXNnc3RyICLU2sK3vrYgLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM1MzgKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKNLRwdCz9ikiCisKKyM6IHNlYXJjaC5jOjM1NDAKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICDV0rK7tb0iCisKKyM6IHNlYXJjaC5jOjM1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIrLp1dKw/LqszsS8/jogJXMiCisKKyM6IHNlYXJjaC5jOjM4MTAKK21zZ2lkICJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiCittc2dzdHIgIkUzODc6ILWxx7DQ0MalxeQiCisKKyM6IHNlYXJjaC5jOjM5NTAKK21zZ2lkICJBbGwgaW5jbHVkZWQgZmlsZXMgd2VyZSBmb3VuZCIKK21zZ3N0ciAiy/nT0LD8uqzOxLz+trzS0dXStb0iCisKKyM6IHNlYXJjaC5jOjM5NTIKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAiw7vT0LD8uqzOxLz+IgorCisjOiBzZWFyY2guYzozOTY4Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiDV0rK7tb22qNLlIgorCisjOiBzZWFyY2guYzozOTcwCittc2dpZCAiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIgorbXNnc3RyICJFMzg5OiDV0rK7tb0gcGF0dGVybiIKKworIzogc3ludGF4LmM6Mjk5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzkwOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTM5MDogss7K/bK71f3ItzogJXMiCisKKyM6IHN5bnRheC5jOjMxNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MTogTm8gc3VjaCBzeW50YXggY2x1c3RlcjogJXMiCittc2dzdHIgIkUzOTE6IM7etMvT77eoIGNsdXN0ZXI6IFwiJXNcIiIKKworIzogc3ludGF4LmM6MzMzMQorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAi1eK49ru6s+XH+MO709C2qNLlyM66ztPvt6jP7iIKKworIzogc3ludGF4LmM6MzMzOQorbXNnaWQgInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIKK21zZ3N0ciAiQ7fnuPHXosrNzayyvdbQIgorCisjOiBzeW50YXguYzozMzQ3Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAiw7vT0M2ssr0iCisKKyM6IHN5bnRheC5jOjMzNTAKK21zZ2lkICJzeW5jaW5nIHN0YXJ0cyAiCittc2dzdHIgIs2ssr2/qsq8IgorCisjOiBzeW50YXguYzozMzUyIHN5bnRheC5jOjM0MjEKK21zZ2lkICIgbGluZXMgYmVmb3JlIHRvcCBsaW5lIgorbXNnc3RyICLQ0LrFs6yz9re2zqciCisKKyM6IHN5bnRheC5jOjMzNTYKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBzeW5jIGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDT77eozayyvc/uxL8gKFN5bnRheCBzeW5jIGl0ZW1zKSAtLS0iCisKKyM6IHN5bnRheC5jOjMzNTkKK21zZ2lkICIiCisiXG4iCisic3luY2luZyBvbiBpdGVtcyIKK21zZ3N0ciAiIgorIlxuIgorIs2ssr3W0DoiCisKKyM6IHN5bnRheC5jOjMzNjQKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g0++3qM/uxL8gLS0tIgorCisjOiBzeW50YXguYzozMzg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDO3rTL0++3qCBjbHVzdGVyOiBcIiVzXCIiCisKKyM6IHN5bnRheC5jOjM0MTEKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAi1+7QoSIKKworIzogc3ludGF4LmM6MzQxOAorbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICLX7rTzIgorCisjOiBzeW50YXguYzo0MDQ2Cittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiDKudPDwcuyu9X9yLe1xLLOyv0iCisKKyM6IHN5bnRheC5jOjQwNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIgorbXNnc3RyICJFMzk0OiDV0rK7tb0gJXMgtcQgcmVnaW9uIGl0ZW0iCisKKyM6IHN5bnRheC5jOjQwOTgKK21zZ2lkICJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NTogyrnTw8HLsrvV/ci3tcSyzsr9IgorCisjOiBzeW50YXguYzo0MTA5Cittc2dpZCAiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTY6IMq508PBy7K71f3It7XEss7K/SIKKworIzogc3ludGF4LmM6NDE4NworbXNnaWQgIkUzOTc6IEZpbGVuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMzk3OiDQ6NKqzsS8/sP7s8YiCisKKyM6IHN5bnRheC5jOjQ1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5ODogTWlzc2luZyAnPSc6ICVzIgorbXNnc3RyICJFMzk4OiDIscnZIFwiPVwiOiAlcyIKKworIzogc3ludGF4LmM6NDY3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIKK21zZ3N0ciAiRTM5OTogc3ludGF4IHJlZ2lvbiAlcyC1xLLOyv3Mq8nZIgorCisjOiBzeW50YXguYzo1MDEwCittc2dpZCAiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiCittc2dzdHIgIkU0MDA6IMO709DWuLaotcTK9NDUIgorCisjOiBzeW50YXguYzo1MDQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6INXSsru1vbfWuPS3+7rFOiAlcyIKKworIzogc3ludGF4LmM6NTEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDAyOiBHYXJiYWdlIGFmdGVyIHBhdHRlcm46ICVzIgorbXNnc3RyICJFNDAyOiAnJXMnILrzw+a1xLarzveyu8Tcyrax8CIKKworIzogc3ludGF4LmM6NTIwNAorbXNnaWQgIkU0MDM6IHN5bnRheCBzeW5jOiBsaW5lIGNvbnRpbnVhdGlvbnMgcGF0dGVybiBzcGVjaWZpZWQgdHdpY2UiCittc2dzdHIgIkU0MDM6INPvt6jNrLK9OiDBrL3T0NC3+7rF1ri2qMHLwb20ziIKKworIzogc3ludGF4LmM6NTI2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6ILLOyv2yu9X9yLc6ICVzIgorCisjOiBzeW50YXguYzo1MzExCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MDU6IMixydm1yLrFOiAlcyIKKworIzogc3ludGF4LmM6NTMxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IL/Vss7K/TogJXMiCisKKyM6IHN5bnRheC5jOjUzNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMgsrvE3NTatMuz9s/WIgorCisjOiBzeW50YXguYzo1MzUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMgsdjQ68rHwdCx7cDvtcS12tK7uPYiCisKKyM6IHN5bnRheC5jOjU0MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOTogVW5rbm93biBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTQwOTogsrvV/ci3tcTX6cP7OiAlcyIKKworIzogc3ludGF4LmM6NTY0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDEwOiBJbnZhbGlkIDpzeW50YXggc3ViY29tbWFuZDogJXMiCittc2dzdHIgIkU0MTA6ILK71f3It7XEIDpzeW50YXgg19PD/MHuOiAlcyIKKworIzogc3ludGF4LmM6NjAyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQxMTog1dKyu7W9IGhpZ2hsaWdodCBncm91cDogJXMiCisKKyM6IHN5bnRheC5jOjYwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCittc2dzdHIgIkU0MTI6ILLOyv3Mq8nZOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzogss7K/bn9tuA6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYwNzQKK21zZ2lkICJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiCittc2dzdHIgIkU0MTQ6INLRyei2qNfpLCC69sLUIGhpZ2hsaWdodCBsaW5rIgorCisjOiBzeW50YXguYzo2MjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTU6IHVuZXhwZWN0ZWQgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTU6ILK7uMPT0LXEtci6xTogJXMiCisKKyM6IHN5bnRheC5jOjYyMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNjogbWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQxNjogyLHJ2bXIusU6ICVzIgorCisjOiBzeW50YXguYzo2MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTc6IG1pc3NpbmcgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDE3OiDIscnZss7K/TogJXMiCisKKyM6IHN5bnRheC5jOjYyOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6ILK7us+3qLXE1rU6ICVzIgorCisjOiBzeW50YXguYzo2NDE3Cittc2dpZCAiRTQxOTogRkcgY29sb3IgdW5rbm93biIKK21zZ3N0ciAiRTQxOTogtO3O87XEx7C+sNHVyasiCisKKyM6IHN5bnRheC5jOjY0MjgKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiC07c7ztcSxs76w0dXJqyIKKworIzogc3ludGF4LmM6NjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDIxOiBDb2xvciBuYW1lIG9yIG51bWJlciBub3QgcmVjb2duaXplZDogJXMiCittc2dzdHIgIkU0MjE6ILTtzvO1xNHVyavD+7PGu/LK/da1OiAlcyIKKworIzogc3ludGF4LmM6NjY4NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDIyOiB0ZXJtaW5hbCBjb2RlIHRvbyBsb25nOiAlcyIKK21zZ3N0ciAiRTQyMjog1tW2y7HgwuvMq7OkOiAlcyIKKworIzogc3ludGF4LmM6NjczNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDIzOiBJbGxlZ2FsIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQyMzogss7K/bK71f3ItzogJXMiCisKKyM6IHN5bnRheC5jOjcyNjMKK21zZ2lkICJFNDI0OiBUb28gbWFueSBkaWZmZXJlbnQgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaW4gdXNlIgorbXNnc3RyICJFNDI0OiDKudPDwcvMq7bgsrvNrLXEuN/BwbbIyvTQ1CIKKworIzogdGFnLmM6OTAKK21zZ2lkICJhdCBib3R0b20gb2YgdGFnIHN0YWNrIgorbXNnc3RyICKx6sepKHRhZym20dW7veHOsiIKKworIzogdGFnLmM6OTEKK21zZ2lkICJhdCB0b3Agb2YgdGFnIHN0YWNrIgorbXNnc3RyICKx6sepKHRhZym20dW7v6rNtyIKKworIzogdGFnLmM6MzkyCittc2dpZCAiRTQyNTogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0MjU6INLRvq3U2tfux7DD5rXEserHqSh0YWcpwcsiCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjog1dKyu7W9serHqSh0YWcpOiAlcyIKKworIzogdGFnLmM6NTQ1Cittc2dpZCAiICAjIHByaSBraW5kIHRhZyIKK21zZ3N0ciAiICAjIHByaSBraW5kIHRhZyIKKworIzogdGFnLmM6NTQ4Cittc2dpZCAiZmlsZVxuIgorbXNnc3RyICLOxLz+XG4iCisKKyMuCisjLiAqIEFzayB0byBzZWxlY3QgYSB0YWcgZnJvbSB0aGUgbGlzdC4KKyMuICogV2hlbiB1c2luZyAiOnNpbGVudCIgYXNzdW1lIHRoYXQgPENSPiB3YXMgZW50ZXJlZC4KKyMuCisjOiB0YWcuYzo3MDYKK21zZ2lkICJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiCittc2dzdHIgIsrkyOsgbnIgu/LRodTxICg8Q1I+IM3Ls/YpOiAiCisKKyM6IHRhZy5jOjc0NgorbXNnaWQgIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNzog1rvT0LTLz+63+7rPIgorCisjOiB0YWcuYzo3NDgKK21zZ2lkICJFNDI4OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI4OiC8ur6t1NrX7rrz0ru49rf7us+1xLHqx6kodGFnKcHLIgorCisjOiB0YWcuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIs7EvP4gXCIlc1wiILK7tObU2iIKKworIy4gR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncworIzogdGFnLmM6NzgwCisjLCBjLWZvcm1hdAorbXNnaWQgInRhZyAlZCBvZiAlZCVzIgorbXNnc3RyICLV0rW9IHRhZzogJWQvJWQlcyIKKworIzogdGFnLmM6NzgzCittc2dpZCAiIG9yIG1vcmUiCittc2dzdHIgIiC78rj8tuAiCisKKyM6IHRhZy5jOjc4NQorbXNnaWQgIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIgorbXNnc3RyICIgINLUsrvNrLTz0KHQtMC0yrnTwyB0YWchIgorCisjOiB0YWcuYzo4MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyOTogRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIkU0Mjk6IM7EvP4gXCIlc1wiILK7tObU2iIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjILW9IHRhZyAgICAgICAgILTTICAg0NAgICAg1NogzsS8/i/OxLG+IgorCisjOiB0YWcuYzoxMTQ0Cittc2dpZCAiTGluZWFyIHRhZyBzZWFyY2giCittc2dzdHIgIs/f0NSy6dXSserHqSAoVGFncykiCisKKyM6IHRhZy5jOjExNDYKK21zZ2lkICJCaW5hcnkgdGFnIHNlYXJjaCIKK21zZ3N0ciAitv69+NbGsunV0ihCaW5hcnkgc2VhcmNoKSCx6sepKFRhZ3MpIgorCisjOiB0YWcuYzoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIrLp1dIgdGFnIM7EvP4gXCIlc1wiIgorCisjOiB0YWcuYzoxMzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzA6IFRhZyBmaWxlIHBhdGggdHJ1bmNhdGVkIGZvciAlc1xuIgorbXNnc3RyICJFNDMwOiBUYWcgzsS8/sK3vraxu73Yts/OqiAlc1xuIgorCisjOiB0YWcuYzoxODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBUYWcgzsS8/iBcIiVzXCIguPHKvbTtzvMiCisKKyM6IHRhZy5jOjE4NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICLU2iAlbGQg19a92taux7AiCisKKyM6IHRhZy5jOjE4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiBUYWcgzsS8/s60xcXQ8jogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTExCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiDDu9PQIHRhZyDOxLz+IgorCisjOiB0YWcuYzoyNTgzCittc2dpZCAiRTQzNDogQ2FuJ3QgZmluZCB0YWcgcGF0dGVybiIKK21zZ3N0ciAiRTQzNDog1dKyu7W9IHRhZyIKKworIzogdGFnLmM6MjU5NAorbXNnaWQgIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIKK21zZ3N0ciAiRTQzNTog1dKyu7W9IHRhZywgytTXxbLCISIKKworIzogdGVybS5jOjE3MjMKK21zZ2lkICInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiCittc2dzdHIgIicgsrvE3LzT1Niho7/J08O1xMTavajW1bbL0M7KvdPQOiIKKworIzogdGVybS5jOjE3NDcKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgItSkyeg6ICciCisKKyM6IHRlcm0uYzoyMTAwCittc2dpZCAiQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICKyu8TctPK/qiB0ZXJtY2FwIM7EvP4iCisKKyM6IHRlcm0uYzoyMTAzCittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICLU2nRlcm1pbmZv1tDOtNXStb3W1bbLz+4iCisKKyM6IHRlcm0uYzoyMTA1Cittc2dpZCAiVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgItTadGVybWNhcNbQzrTV0rW91tW2y8/uIgorCisjOiB0ZXJtLmM6MjI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogdGVybWNhcCDDu9PQIFwiJXNcIiDP7iIKKworIzogdGVybS5jOjI3MzgKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzog1tW2y9Do0qogXCJjbVwiILXExNzBpiIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0ZXJtLmM6NDg3MgorbXNnaWQgIiIKKyJcbiIKKyItLS0gVGVybWluYWwga2V5cyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g1tW2y7C0vPwgLS0tIgorCisjOiB1aS5jOjI0MAorbXNnaWQgIm5ldyBzaGVsbCBzdGFydGVkXG4iCittc2dzdHIgIsb0tq/QwiBzaGVsbFxuIgorCisjOiB1aS5jOjE3MDUKK21zZ2lkICJWaW06IEVycm9yIHJlYWRpbmcgaW5wdXQsIGV4aXRpbmcuLi5cbiIKK21zZ3N0ciAiVmltOiC2wbTtzvOjrM3Ls/bW0C4uLlxuIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogdW5kby5jOjM1MQorbXNnaWQgIk5vIHVuZG8gcG9zc2libGU7IGNvbnRpbnVlIGFueXdheSIKK21zZ3N0ciAisrvE3Lu51K2ju8frvMzQ+CIKKworIzogdW5kby5jOjUwNgorbXNnaWQgIkU0Mzg6IHVfdW5kbzogbGluZSBudW1iZXJzIHdyb25nIgorbXNnc3RyICJFNDM4OiB1X3VuZG86INDQusW07c7zIgorCisjOiB1bmRvLmM6Njc1Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgItK7z+64xLHkIgorCisjOiB1bmRvLmM6Njc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFuZ2VzIgorbXNnc3RyICIlbGQgz+64xLHkIgorCisjOiB1bmRvLmM6NzIxCittc2dpZCAiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiCittc2dzdHIgIkU0Mzk6ILO3z/rB0LHty/C7tSIKKworIzogdW5kby5jOjc1MQorbXNnaWQgIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIgorbXNnc3RyICJFNDQwOiDV0rK7tb3SqrO3z/qy2df3tcTQ0CIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjY1NQorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzLOuyDNvNDNvefD5rDmsb4iCisKKyM6IHZlcnNpb24uYzo2NTcKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgR1VJIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIEJpdCDNvNDNvefD5rDmsb4iCisKKyM6IHZlcnNpb24uYzo2NjAKK21zZ2lkICIgaW4gV2luMzJzIG1vZGUiCittc2dzdHIgIldpbjMycyDEo8q9IgorCisjOiB2ZXJzaW9uLmM6NjYyCittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgItans9YgT0xFIgorCisjOiB2ZXJzaW9uLmM6NjY1Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzLOuyDX1rf7vefD5rDmsb4iCisKKyM6IHZlcnNpb24uYzo2NjkKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzLOuyDX1rf7vefD5rDmsb4iCisKKyM6IHZlcnNpb24uYzo2NzMKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgzrsgTVMtRE9TILDmsb4iCisKKyM6IHZlcnNpb24uYzo2NzUKK21zZ2lkICIiCisiXG4iCisiMTYgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMTYgzrsgTVMtRE9TILDmsb4iCisKKyM6IHZlcnNpb24uYzo2ODEKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpILDmsb4iCisKKyM6IHZlcnNpb24uYzo2ODMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCCw5rG+IgorCisjOiB2ZXJzaW9uLmM6Njg2Cittc2dpZCAiIgorIlxuIgorIk1hY09TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyCw5rG+IgorCisjOiB2ZXJzaW9uLmM6NjkxCittc2dpZCAiIgorIlxuIgorIlJJU0MgT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIlJJU0MgT1MgsOaxviIKKworIzogdmVyc2lvbi5jOjcwMQorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyK808jrsrm2oTogIgorCisjOiB2ZXJzaW9uLmM6NzI4Cittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIrHg0usiCisKKyM6IHZlcnNpb24uYzo3MzEKK21zZ2lkICJieSAiCittc2dzdHIgItXfOiIKKworIzogdmVyc2lvbi5jOjc0MworbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisis6zHv7Dmsb4gIgorCisjOiB2ZXJzaW9uLmM6NzQ2Cittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIrTz0M2w5rG+ICIKKworIzogdmVyc2lvbi5jOjc0OQorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLSu7DjsOaxviAiCisKKyM6IHZlcnNpb24uYzo3NTIKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyK88tLXsOaxviAiCisKKyM6IHZlcnNpb24uYzo3NTQKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIr6rvPKw5rG+ICIKKworIzogdmVyc2lvbi5jOjc2MAorbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAisrvKudPDzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc2NAorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgIsq508MgR1RLLUdOT01FIM280M2958PmoaMiCisKKyM6IHZlcnNpb24uYzo3NjYKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICLKudPDIEdUSyDNvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6NzcwCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAiyrnTwyBYMTEtTW90aWYgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc3MworbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICLKudPDIFgxMS1BdGhlbmEgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc3NgorbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICLKudPDIEJlT1MgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc3OQorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgIsq508NQaG90b27NvNDNvefD5qGjIgorCisjOiB2ZXJzaW9uLmM6NzgyCittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICLKudPDzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc4NQorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgIsq508MgQ2FyYm9uIM280M2958PmoaMiCisKKyM6IHZlcnNpb24uYzo3ODgKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIsq508MgQ29jb2EgzbzQzb3nw+ahoyIKKworIzogdmVyc2lvbi5jOjc5MQorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgIsq508MgKLSrzbMpIM280M2958PmoaMiCisKKyM6IHZlcnNpb24uYzo4MDIKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIgxL/HsL/JyrnTwygrKdPrsru/ycq508MoLSm1xMSjv+nB0LHtOlxuIgorCisjOiB2ZXJzaW9uLmM6ODE0Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIM+1zbMgdmltcmMgxeTWw87EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODE5Cittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgINPDu6e1xCB2aW1yYyDF5NbDzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4MjQKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICC12rb+1+nTw7unIHZpbXJjIM7EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODI5Cittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgtdrI/dfp08O7pyB2aW1yYyDOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjgzNAorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAg08O7p7XEIGV4cmMgxeTWw87EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODM5Cittc2dpZCAiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIgorbXNnc3RyICIgICC12rb+1+nTw7unIGV4cmMgzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4NDUKK21zZ2lkICIgIHN5c3RlbSBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgIM+1zbMgZ3ZpbXJjIM7EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODQ5Cittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgINPDu6e1xCBndmltcmMgxeTWw87EvP46IFwiIgorCisjOiB2ZXJzaW9uLmM6ODUzCittc2dpZCAiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICC12rb+1+nTw7unIGd2aW1yYyDOxLz+OiBcIiIKKworIzogdmVyc2lvbi5jOjg1OAorbXNnaWQgIjNyZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgtdrI/dfp08O7pyBndmltcmMgzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4NjUKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgICAgz7XNs7LLtaXF5NbDzsS8/jogXCIiCisKKyM6IHZlcnNpb24uYzo4NzMKK21zZ2lkICIgIGZhbGwtYmFjayBmb3IgJFZJTTogXCIiCittc2dzdHIgIiAgICAgICAgICAgICAgJFZJTSDUpMno1rU6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODc5Cittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgICAgICAgJFZJTVJVTlRJTUUg1KTJ6Na1OiBcIiIKKworIzogdmVyc2lvbi5jOjg4MworbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIrHg0uu3vcq9OiAiCisKKyM6IHZlcnNpb24uYzo4ODkKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICKx4NLrxvc6ICIKKworIzogdmVyc2lvbi5jOjg5NAorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiwbS94be9yr06ICIKKworIzogdmVyc2lvbi5jOjg5OQorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgtffK1LDmsb4iCisKKyM6IHZlcnNpb24uYzo5MzQKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgSU1wcm92ZWQiCisKKyM6IHZlcnNpb24uYzo5MzYKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAisOaxviAgICIKKworIzogdmVyc2lvbi5jOjkzNworbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAizqy7pMjLOiBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyM6IHZlcnNpb24uYzo5MzgKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0gzqq/ydfU08m3otDQtcS/qrfF1LS0+sLryO28/iIKKworIzogdmVyc2lvbi5jOjk0MAorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICKw79b6ztq4ybTvtcS/ycGvtvnNryEiCisKKyM6IHZlcnNpb24uYzo5NDEKK21zZ2lkICJ0eXBlICA6aGVscCBpY2NmPEVudGVyPiAgICAgICBmb3IgaW5mb3JtYXRpb24gIgorbXNnc3RyICK9+NK7sr3LtcP3x+vK5MjrICAgICAgICAgIDpoZWxwIGljY2Y8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTQzCittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAi0qrNy7P2x+vK5MjrICAgICAgICAgICAgICAgICAgOnE8RW50ZXI+ICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6OTQ0Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAi1NrP37Dv1vrH68rkyOsgICAgICAgICAgICAgICAgOmhlbHA8RW50ZXI+ICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6OTQ1Cittc2dpZCAidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAi0MKw5rG+0MXPosfryuTI6yAgICAgICAgICAgICAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTQ4Cittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIlZpILzmyN3Eo8q9IgorCisjOiB2ZXJzaW9uLmM6OTQ5Cittc2dpZCAidHlwZSAgOnNldCBub2NwPEVudGVyPiAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyIKK21zZ3N0ciAiyOe5+9KqzerIq8SjxOK0q82zIFZpIMfryuTI6yA6c2V0IG5vY3A8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTUwCittc2dpZCAidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIKK21zZ3N0ciAiyOe5+9Do0qq21CBWaSC85sjdxKPKvb340ruyvcu1w/fH68rkyOsgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5OTAKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICLXotLiOiC87LLitb0gV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjk5MworbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIsjnufvQ6NKqttQgV2luZG93cyA5NSDWp7PWtcS4/Lbg0MXPosfryuTI6yA6aGVscCB3aW5kb3dzOTU8RW50ZXI+IgorCisjOiB3aW5kb3cuYzoyMDEKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTogw7vT0NSkwMC0sL/aIgorCisjOiB3aW5kb3cuYzo1NjgKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiCyu8TczazKsbfWuO60sL/azqrX88nPus3T0s/CvcciCisKKyM6IHdpbmRvdy5jOjEzMjcKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6INPQxuTL/LfWuO60sL/ayrGyu8Tc0P3XqiIKKworIzogd2luZG93LmM6MTgxMAorbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDogsrvE3LnYsdXX7rrz0ru49rSwv9oiCisKKyM6IHdpbmRvdy5jOjI0NzQKK21zZ2lkICJBbHJlYWR5IG9ubHkgb25lIHdpbmRvdyIKK21zZ3N0ciAi0tG+rda7yqPSu7j2tLC/2sHLIgorCisjOiB3aW5kb3cuYzoyNTIxCittc2dpZCAiRTQ0NTogT3RoZXIgd2luZG93IGNvbnRhaW5zIGNoYW5nZXMiCittc2dzdHIgIkU0NDU6IMbky/y0sL/a09C4xLHktcTE2sjdIgorCisjOiB3aW5kb3cuYzo0MzQxCittc2dpZCAiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIKK21zZ3N0ciAiRTQ0NjogueKx6rSmw7vT0M7EvP7D+yIKKworIzogd2luZG93LmM6NDQ2MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6INTawre+ttbQ1dKyu7W9zsS8/iBcIiVzXCIiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg2Cittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICLTwyAmbXVsdGlwbGUgVmltcyCx4LytIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjU5MgorbXNnaWQgIkVkaXQgd2l0aCBzaW5nbGUgJlZpbSIKK21zZ3N0ciAi08Mgc2luZ2xlICZWaW0gseC8rSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MDQKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAi08MgJlZpbSCx4LytIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjI4Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgItPDtbHHsLXEIFZpbSCx4LytIC0gJiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo3NTIKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAi08MgVmltILHgvK3RodTxtcTOxLz+IgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg5MSAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk2OQorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAitLS9qL34s8zKp7DcOiDH67zssulndmltyse38dTav8nWtNDQwre+ttbQISIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4OTIgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDYKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTcwCittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImd2aW1leHQuZGxsILP2tO0iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTA1Cittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICLCt762w/vMq7OkIgorCisjOiBnbG9iYWxzLmg6ODc4Cittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS27urPlx/jO3tfKwc8tLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMDE5Cittc2dpZCAiQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICLD/MHusbvHv9bG1tC2zyIKKworIzogZ2xvYmFscy5oOjEwMjAKK21zZ2lkICJBcmd1bWVudCByZXF1aXJlZCIKK21zZ3N0ciAi0OjSqta4we6yzsr9IgorCisjOiBnbG9iYWxzLmg6MTAyMQorbXNnaWQgIkUxMDogXFwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IC8sID8gb3IgJiIKK21zZ3N0ciAiRTEwOiBcXCC688Pm06a4w9PQIC8gPyC78iAmIgorCisjOiBnbG9iYWxzLmg6MTAyMworbXNnaWQgIkUxMTogSW52YWxpZCBpbiBjb21tYW5kLWxpbmUgd2luZG93OyA8Q1I+IGV4ZWN1dGVzLCBDVFJMLUMgcXVpdHMiCittc2dzdHIgIkUxMTogsrvE3NTaw/zB7tDQtLC/2tbQyrnTw6GjPENSPta00NCjrENUUkwtQyDNy7P2IgorCisjOiBnbG9iYWxzLmg6MTAyNQorbXNnaWQgIkUxMjogQ29tbWFuZCBub3QgYWxsb3dlZCBmcm9tIGV4cmMvdmltcmMgaW4gY3VycmVudCBkaXIgb3IgdGFnIHNlYXJjaCIKK21zZ3N0ciAiRTEyOiBleHJjL3ZpbXJjIMDvtcTWuMHusrvE3Na00NAiCisKKyM6IGdsb2JhbHMuaDoxMDI2Cittc2dpZCAiRTEzOiBGaWxlIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTM6IM7EvP7S0b6ttObU2iAov8nTwyAhIMe/1sbM5ru7KSIKKworIzogZ2xvYmFscy5oOjEwMjcKK21zZ2lkICJDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiw/zB7ta00NDKp7DcIgorCisjOiBnbG9iYWxzLmg6MTAyOAorbXNnaWQgIkludGVybmFsIGVycm9yIgorbXNnc3RyICLE2rK/tO3O8yIKKworIzogZ2xvYmFscy5oOjEwMjkKK21zZ2lkICJJbnRlcnJ1cHRlZCIKK21zZ3N0ciAi0tHW0LbPIgorCisjOiBnbG9iYWxzLmg6MTAzMAorbXNnaWQgIkUxNDogSW52YWxpZCBhZGRyZXNzIgorbXNnc3RyICJFMTQ6ILK71f3It7XEtdjWtyIKKworIzogZ2xvYmFscy5oOjEwMzEKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgorbXNnc3RyICKyu9X9yLe1xLLOyv0iCisKKyM6IGdsb2JhbHMuaDoxMDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQ6ICVzIgorbXNnc3RyICKyu9X9yLe1xLLOyv06ICVzIgorCisjOiBnbG9iYWxzLmg6MTAzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogJXMiCittc2dzdHIgIkUxNTogsrvV/ci3tcSx7bTvyr06ICVzIgorCisjOiBnbG9iYWxzLmg6MTAzNgorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiCyu9X9yLe1xLe2zqciCisKKyM6IGdsb2JhbHMuaDoxMDM3Cittc2dpZCAiSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICKyu9X9yLe1xMP8we4iCisKKyM6IGdsb2JhbHMuaDoxMDM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDKx8S/wrwiCisKKyM6IGdsb2JhbHMuaDoxMDQyCittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiAnPScgx7DD5rP2z9bBy7TtzvO1xNfWt/siCisKKyM6IGdsb2JhbHMuaDoxMDQ0Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6ILHqvMe1xNDQusW07c7zIgorCisjOiBnbG9iYWxzLmg6MTA0NQorbXNnaWQgIkUyMDogTWFyayBub3Qgc2V0IgorbXNnc3RyICJFMjA6IMO709DJ6Laoseq8xyIKKworIzogZ2xvYmFscy5oOjEwNDYKK21zZ2lkICJFMjE6IENhbm5vdCBtYWtlIGNoYW5nZXMsICdtb2RpZmlhYmxlJyBpcyBvZmYiCittc2dzdHIgIkUyMTog0vLOqiAnbW9kaWZpYWJsZScg0aHP7srHudix1bXEo6zL+dLUsrvE3NDeuMQiCisKKyM6IGdsb2JhbHMuaDoxMDQ3Cittc2dpZCAiRTIyOiBTY3JpcHRzIG5lc3RlZCB0b28gZGVlcCIKK21zZ3N0ciAiRTIyOiC13bnptffTw8yrtuCy4yIKKworIzogZ2xvYmFscy5oOjEwNDgKK21zZ2lkICJFMjM6IE5vIGFsdGVybmF0ZSBmaWxlIgorbXNnc3RyICJFMjM6IMO709DM5rT6tcTOxLz+IgorCisjOiBnbG9iYWxzLmg6MTA0OQorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDogw7vT0NXiuPYgYWJicmV2aWF0aW9uILbU06YiCisKKyM6IGdsb2JhbHMuaDoxMDUwCittc2dpZCAiTm8gISBhbGxvd2VkIgorbXNnc3RyICKyu7/JyrnTwyAnISciCisKKyM6IGdsb2JhbHMuaDoxMDUyCittc2dpZCAiRTI1OiBHVUkgY2Fubm90IGJlIHVzZWQ6IE5vdCBlbmFibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAiRTI1OiDS8s6qseDS68qxw7vT0LzTyOvNvNDNvefD5rXEs8zQ8rT6wuujrMv50tSyu8TcyrnTw8280M2958PmIgorCisjOiBnbG9iYWxzLmg6MTA1NQorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiDS8s6qseDS68qxw7vT0LzTyOvPo7KuwLO1xLPM0PK0+sLro6zL+dLUsrvE3Mq508MgSGVicmV3XG4iCisKKyM6IGdsb2JhbHMuaDoxMDU4Cittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzog0vLOqrHg0uvKscO709C808jrIEZhcnNpILXEs8zQ8rT6wuujrMv50tSyu8TcyrnTwyBGYXJzaVxuIgorCisjOiBnbG9iYWxzLmg6MTA2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjg6IE5vIHN1Y2ggaGlnaGxpZ2h0IGdyb3VwIG5hbWU6ICVzIgorbXNnc3RyICJFMjg6IMO709DD+86qICclcycgtcQgaGlnaGxpZ2h0IGdyb3VwIgorCisjOiBnbG9iYWxzLmg6MTA2MworbXNnaWQgIkUyOTogTm8gaW5zZXJ0ZWQgdGV4dCB5ZXQiCittc2dzdHIgIkUyOTogw7vT0LLlyOu5/c7E19YiCisKKyM6IGdsb2JhbHMuaDoxMDY0Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogw7vT0Mew0rvP7sP8we4iCisKKyM6IGdsb2JhbHMuaDoxMDY1Cittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogw7vT0NXiuPYgbWFwcGluZyC21NOmIgorCisjOiBnbG9iYWxzLmg6MTA2NgorbXNnaWQgIk5vIG1hdGNoIgorbXNnc3RyICLV0rK7tb0iCisKKyM6IGdsb2JhbHMuaDoxMDY3CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoOiAlcyIKK21zZ3N0ciAi1dKyu7W9OiAlcyIKKworIzogZ2xvYmFscy5oOjEwNjgKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiDDu9PQzsS8/sP7IgorCisjOiBnbG9iYWxzLmg6MTA2OQorbXNnaWQgIkUzMzogTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzMzogw7vT0Mew0ru49rLp1dIvzOa7u7XEw/zB7iIKKworIzogZ2xvYmFscy5oOjEwNzAKK21zZ2lkICJFMzQ6IE5vIHByZXZpb3VzIGNvbW1hbmQiCittc2dzdHIgIkUzNDogw7vT0Mew0ru49sP8we4iCisKKyM6IGdsb2JhbHMuaDoxMDcxCittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTogw7vT0Mew0ru49rLp1dLD/MHuIgorCisjOiBnbG9iYWxzLmg6MTA3MgorbXNnaWQgIk5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIrK7v8nKudPDt7bOp8P8we4iCisKKyM6IGdsb2JhbHMuaDoxMDc0Cittc2dpZCAiRTM2OiBOb3QgZW5vdWdoIHJvb20iCittc2dzdHIgIkUzNjogw7vT0Nfjubu1xL/VvOQiCisKKyM6IGdsb2JhbHMuaDoxMDc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICKyu8TctLS9qM7EvP4gJXMiCisKKyM6IGdsb2JhbHMuaDoxMDc3Cittc2dpZCAiQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICKyu8TctcO1vcHZyrHOxLz+w/siCisKKyM6IGdsb2JhbHMuaDoxMDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAisrvE3LTyv6rOxLz+ICVzIgorCisjOiBnbG9iYWxzLmg6MTA3OQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIrK7xNy2wcihzsS8/iAlcyIKKworIzogZ2xvYmFscy5oOjEwODAKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlICh1c2UgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzogzsS8/sTayN3S0bjEseS1q8nQzrSxo7TmICi/ydPDICEgx7/Wxta00NApIgorCisjOiBnbG9iYWxzLmg6MTA4MQorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiC/1bXEIChOdWxsKSCyzsr9IgorCisjOiBnbG9iYWxzLmg6MTA4MworbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6INOmuMPSqtPQyv3X1iIKKworIzogZ2xvYmFscy5oOjEwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiCyu8TctPK/qrTtzvPOxLz+ICVzIgorCisjOiBnbG9iYWxzLmg6MTA4OQorbXNnaWQgIkU0MTogT3V0IG9mIG1lbW9yeSEiCittc2dzdHIgIkU0MTogxNq05rK71+MhIgorCisjOiBnbG9iYWxzLmg6MTA5MgorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICLV0rK7tb3Eo8q9IgorCisjOiBnbG9iYWxzLmg6MTA5NAorIywgYy1mb3JtYXQKK21zZ2lkICJQYXR0ZXJuIG5vdCBmb3VuZDogJXMiCittc2dzdHIgItXSsru1vcSjyr0gJXMiCisKKyM6IGdsb2JhbHMuaDoxMDk1Cittc2dpZCAiQXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZSIKK21zZ3N0ciAiss7K/dOmuMPKx9X9yv0iCisKKyM6IGdsb2JhbHMuaDoxMDk3Cittc2dpZCAiRTQyOiBObyBFcnJvcnMiCittc2dzdHIgIkU0Mjogw7vT0LTtzvMiCisKKyM6IGdsb2JhbHMuaDoxMDk5Cittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiDGpcXk19a3+7Su09DOysziIgorCisjOiBnbG9iYWxzLmg6MTEwMAorbXNnaWQgIkU0NDogQ29ycnVwdGVkIHJlZ2V4cCBwcm9ncmFtIgorbXNnc3RyICJFNDQ6INX91PKx7bTvyr3T0M7KzOIiCisKKyM6IGdsb2JhbHMuaDoxMTAxCittc2dpZCAiRTQ1OiAncmVhZG9ubHknIG9wdGlvbiBpcyBzZXQgKHVzZSAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTQ1OiDJ6LaoICdyZWFkb25seScg0aHP7ijWu7bBKSAov8nTwyAhIMe/1sbWtNDQKSIKKworIzogZ2xvYmFscy5oOjExMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ2OiBDYW5ub3Qgc2V0IHJlYWQtb25seSB2YXJpYWJsZSBcIiVzXCIiCittc2dzdHIgIkU0NjogsrvE3MnotqjWu7bBseTBvyBcIiVzXCIiCisKKyM6IGdsb2JhbHMuaDoxMTA2Cittc2dpZCAiRTQ3OiBFcnJvciB3aGlsZSByZWFkaW5nIGVycm9yZmlsZSIKK21zZ3N0ciAiRTQ3OiC2wcihtO3O887EvP7Kp7DcIgorCisjOiBnbG9iYWxzLmg6MTEwOQorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiCyu8Tc1Nogc2FuZGJveCDA77P2z9YiCisKKyM6IGdsb2JhbHMuaDoxMTExCittc2dpZCAiRTQ5OiBJbnZhbGlkIHNjcm9sbCBzaXplIgorbXNnc3RyICJFNDk6ILTtzvO1xLn2tq+089ChIgorCisjOiBnbG9iYWxzLmg6MTExMgorbXNnaWQgIkU5MTogJ3NoZWxsJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIkU5MTogJ0U3MTog0aHP7iAnc2hlbGwnIM60yei2qCIKKworIzogZ2xvYmFscy5oOjExMTMKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiC9u7u7zsS8/rnYsdW07c7zIgorCisjOiBnbG9iYWxzLmg6MTExNAorbXNnaWQgIkU3MzogdGFnIHN0YWNrIGVtcHR5IgorbXNnc3RyICJFNzM6ILHqx6m20dW70tG/1SIKKworIzogZ2xvYmFscy5oOjExMTUKK21zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCittc2dzdHIgIkU3NDogw/zB7syruLTU0yIKKworIzogZ2xvYmFscy5oOjExMTYKK21zZ2lkICJFNzU6IE5hbWUgdG9vIGxvbmciCittc2dzdHIgIkU3NTogw/vX1syrs6QiCisKKyM6IGdsb2JhbHMuaDoxMTE3Cittc2dpZCAiRTc2OiBUb28gbWFueSBbIgorbXNnc3RyICJFNzY6IMyrtuAgWyIKKworIzogZ2xvYmFscy5oOjExMTgKK21zZ2lkICJFNzc6IFRvbyBtYW55IGZpbGUgbmFtZXMiCittc2dzdHIgIkU3NzogzKu24M7EvP7D+yIKKworIzogZ2xvYmFscy5oOjExMTkKK21zZ2lkICJUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICLE48rkyOvBy7bg0+C1xNfWt/siCisKKyM6IGdsb2JhbHMuaDoxMTIwCittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODogsrvE3LDsyra1xLHqvMciCisKKyM6IGdsb2JhbHMuaDoxMTIxCittc2dpZCAiRTc5OiBDYW5ub3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiRTc5OiCyu8TcwKnVuc2oxeS3+yIKKworIzogZ2xvYmFscy5oOjExMjIKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDog0LTI67TtzvMiCisKKyM6IGdsb2JhbHMuaDoxMTIzCittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAiyv21vcHjICg/KSIKKworIzogZ2xvYmFscy5oOjExMjUKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IDxTSUQ+ILK7xNzU2iBzY3JpcHQgsb7OxM3iyrnTwy4iCmRpZmYgLS1naXQgYS9zcmMvcG8vemhfVFcuVVRGLTgucG8gYi9zcmMvcG8vemhfVFcuVVRGLTgucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmOTBlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wby96aF9UVy5VVEYtOC5wbwpAQCAtMCwwICsxLDYzODkgQEAKKyMgVHJhZGl0aW9uYWwgQ2hpbmVzZSBUcmFuc2xhdGlvbiBmb3IgVmltCXZpbTpzZXQgZm9sZG1ldGhvZD1tYXJrZXI6CisjCisjIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorIyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyMKKyMgRklSU1QgQVVUSE9SICBGcmFuY2lzIFMuTGluIDxwaWFpcEBjc2llLm50dS5lZHUudHc+LCAyMDAwCisjIEZJUlNUIFJFTEVBU0UgVGh1IEp1biAxNCAxNDoyNDoxNyBDU1QgMjAwMQorIworIyBMYXN0IHVwZGF0ZTogVGh1IEFwciAyNCAxMzowOTowNyBDU1QgMjAwMyAoNi4yYSkKKyMKKyMgVG8gdXBkYXRlLCBzZWFyY2ggcGF0dGVybjoJCS9mdXp6eVx8Xm1zZ3N0ciAiIlwoXG4iXClcQCEKKyMKKyMgRE8gTk9UIFVTRSBXT1JEUyBXSVRIIEJBQ0tTTEFTSCAoJ1wnKSBBUyBTRUNPTkQgQllURSBPRiBCSUc1IENIQVJTCisjIEVHOiAn5YqfJywgIyDoqLHlip/ok4sKKyMg6aSQ5p6v6Zax54+u56mA6Lea5rea6Lqh6LG55pO655Ke57i36auP5ZCt5q2/5L+eCisjIOWipuWoieW0pOm7oOWtgOW7hOeQteaEp+eonumIvuaaneWFneS5iOWQkuaylOWdvOiLkuWhv+i4igorIyB5b3UgY2FuIHJlcGxhY2UgdGhlc2UgY2hhcmFjdGVycyB3aXRoIGFsdGVybmF0aXZlIHdvcmRzLgorIyBUSElTIFdJTEwgQ0FVU0UgSU5DT01QQVRJQkxFIE9OIGdldHRleHQgMC4xMC4zNisKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFZpbShUcmFkaXRpb25hbCBDaGluZXNlKVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAzLTA0LTI0IDEzOjA2KzA4MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBNb24gRmViIDE5IDIyOjQ5OjIxIENTVCAyMDAxXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGcmFuY2lzIFMuTGluIDxwaWFpcEBjc2llLm50dS5lZHUudHc+XG4iCisiTGFuZ3VhZ2UtVGVhbTogRnJhbmNpcyBTLkxpbiA8cGlhaXBAY3NpZS5udHUuZWR1LnR3PiwgQ2VjaWwgU2hlbmcgIgorIjxiNzUwNjAyMkBjc2llLm50dS5lZHUudHc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4LWJpdFxuIgorCisjOiBidWZmZXIuYzo5NworbXNnaWQgIkU4MjogQ2Fubm90IGFsbG9jYXRlIGFueSBidWZmZXIsIGV4aXRpbmcuLi4iCittc2dzdHIgIkU4Mjog54Sh5rOV6YWN572u5Lu75L2V57ep6KGd5Y2A77yM6Zui6ZaL56iL5byPLi4uIgorCisjOiBidWZmZXIuYzoxMDAKK21zZ2lkICJFODM6IENhbm5vdCBhbGxvY2F0ZSBidWZmZXIsIHVzaW5nIG90aGVyIG9uZS4uLiIKK21zZ3N0ciAiRTgzOiDnhKHms5XphY3nva7nt6nooZ3ljYDvvIzkvb/nlKjlj6bkuIDlgIvnt6nooZ3ljYAuLi4uIgorCisjOiBidWZmZXIuYzo3OTcKK21zZ2lkICJFNTE1OiBObyBidWZmZXJzIHdlcmUgdW5sb2FkZWQiCittc2dzdHIgIkU1MTU6IOaykuaciemHi+aUvuS7u+S9lee3qeihneWNgCIKKworIzogYnVmZmVyLmM6Nzk5Cittc2dpZCAiRTUxNjogTm8gYnVmZmVycyB3ZXJlIGRlbGV0ZWQiCittc2dzdHIgIkU1MTY6IOaykuacieWIqumZpOS7u+S9lee3qeihneWNgCIKKworIzogYnVmZmVyLmM6ODAxCittc2dpZCAiRTUxNzogTm8gYnVmZmVycyB3ZXJlIHdpcGVkIG91dCIKK21zZ3N0ciAiRTUxNzog5rKS5pyJ5riF6Zmk5Lu75L2V57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo4MDkKK21zZ2lkICIxIGJ1ZmZlciB1bmxvYWRlZCIKK21zZ3N0ciAi5bey6YeL5pS+5LiA5YCL57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo4MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB1bmxvYWRlZCIKK21zZ3N0ciAi5bey6YeL5pS+ICVkIOWAi+e3qeihneWNgCIKKworIzogYnVmZmVyLmM6ODE2Cittc2dpZCAiMSBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAi5bey5Yiq6Zmk5LiA5YCL57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo4MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyBkZWxldGVkIgorbXNnc3RyICLlt7LliKrpmaQgJWQg5YCL57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo4MjMKK21zZ2lkICIxIGJ1ZmZlciB3aXBlZCBvdXQiCittc2dzdHIgIuW3suWIqumZpOS4gOWAi+e3qeihneWNgCIKKworIzogYnVmZmVyLmM6ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGJ1ZmZlcnMgd2lwZWQgb3V0IgorbXNnc3RyICLlt7LliKrpmaQgJWQg5YCL57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo4ODYKK21zZ2lkICJFODQ6IE5vIG1vZGlmaWVkIGJ1ZmZlciBmb3VuZCIKK21zZ3N0ciAiRTg0OiDmspLmnInkv67mlLnpgY7nmoTnt6nooZ3ljYAiCisKKyMuIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCwgZGlkbid0IGZpbmQgYW55dGhpbmcuCisjOiBidWZmZXIuYzo5MjUKK21zZ2lkICJFODU6IFRoZXJlIGlzIG5vIGxpc3RlZCBidWZmZXIiCittc2dzdHIgIkU4NTog5rKS5pyJ5YiX5Ye655qE57ep6KGd5Y2AIgorCisjOiBidWZmZXIuYzo5MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTg2OiBDYW5ub3QgZ28gdG8gYnVmZmVyICVsZCIKK21zZ3N0ciAiRTg2OiDnhKHms5XliIfmj5vliLDnrKwgJWxkIOWAi+e3qeihneWNgCIKKworIzogYnVmZmVyLmM6OTQwCittc2dpZCAiRTg3OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFODc6IOeEoeazleWIh+aPm+WIsOabtOW+jOmdoueahOe3qeihneWNgCIKKworIzogYnVmZmVyLmM6OTQyCittc2dpZCAiRTg4OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg4OiDnhKHms5XliIfmj5vliLDmm7TliY3pnaLnmoTnt6nooZ3ljYAiCisKKyM6IGJ1ZmZlci5jOjk2NgorbXNnaWQgIkU4OTogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciAlbGQgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTg5OiDlt7Lmm7TmlLnpgY7nt6nooZ3ljYAgJWxkIOS9huWwmuacquWtmOaqlCAo5Y+v55SoICEg5by35Yi25Z+36KGMKSIKKworIzogYnVmZmVyLmM6OTgyCittc2dpZCAiRTkwOiBDYW5ub3QgdW5sb2FkIGxhc3QgYnVmZmVyIgorbXNnc3RyICJFOTA6IOeEoeazlemHi+aUvuacgOW+jOS4gOWAi+e3qeihneWNgCIKKworIzogYnVmZmVyLmM6MTQ5NAorbXNnaWQgIlcxNDogV2FybmluZzogTGlzdCBvZiBmaWxlIG5hbWVzIG92ZXJmbG93IgorbXNnc3RyICJXMTQ6IOitpuWRijog5qqU5ZCN6YGO5aSaIgorCisjOiBidWZmZXIuYzoxNjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU5MjogQnVmZmVyICVsZCBub3QgZm91bmQiCittc2dzdHIgIkU5Mjog5om+5LiN5Yiw56ysICVsZCDlgIvnt6nooZ3ljYAiCisKKyM6IGJ1ZmZlci5jOjE4OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiDmib7liLDkuIDlgIvku6XkuIrnmoQgJXMiCisKKyM6IGJ1ZmZlci5jOjE4OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk0OiBObyBtYXRjaGluZyBidWZmZXIgZm9yICVzIgorbXNnc3RyICJFOTQ6IOaJvuS4jeWIsCAlcyIKKworIzogYnVmZmVyLmM6MjI5NyBleF9kb2NtZC5jOjY0NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQiCittc2dzdHIgIuihjCAlbGQiCisKKyM6IGJ1ZmZlci5jOjIzODAKK21zZ2lkICJFOTU6IEJ1ZmZlciB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiRTk1OiDlt7LmnInnt6nooZ3ljYDkvb/nlKjpgJnlgIvlkI3lrZciCisKKyM6IGJ1ZmZlci5jOjI2NzMKK21zZ2lkICIgW01vZGlmaWVkXSIKK21zZ3N0ciAiIFvlt7Lkv67mlLldIgorCisjOiBidWZmZXIuYzoyNjc4Cittc2dpZCAiW05vdCBlZGl0ZWRdIgorbXNnc3RyICJb5pyq57eo6LyvXSIKKworIzogYnVmZmVyLmM6MjY4MworbXNnaWQgIltOZXcgZmlsZV0iCittc2dzdHIgIlvmlrDmqpTmoYhdIgorCisjOiBidWZmZXIuYzoyNjg0Cittc2dpZCAiW1JlYWQgZXJyb3JzXSIKK21zZ3N0ciAiW+iugOWPlumMr+iqpF0iCisKKyM6IGJ1ZmZlci5jOjI2ODYgZmlsZWlvLmM6MTkxNAorbXNnaWQgIltyZWFkb25seV0iCittc2dzdHIgIlvllK/oroBdIgorCisjOiBidWZmZXIuYzoyNzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAtLSVkJSUtLSIKK21zZ3N0ciAi6KGM5pW4IDEgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICLooYzmlbggJWxkIC0tJWQlJS0tIgorCisjOiBidWZmZXIuYzoyNzEwCisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkIG9mICVsZCAtLSVkJSUtLSBjb2wgIgorbXNnc3RyICLooYwgJWxkLyVsZCAtLSVkJSUtLSDmrIQgIgorCisjOiBidWZmZXIuYzoyODExCittc2dpZCAiW05vIGZpbGVdIgorbXNnc3RyICJb5pyq5ZG95ZCNXSIKKworIy4gbXVzdCBiZSBhIGhlbHAgYnVmZmVyCisjOiBidWZmZXIuYzoyODUxCittc2dpZCAiaGVscCIKK21zZ3N0ciAiW+i8lOWKqeiqquaYjl0iCisKKyM6IGJ1ZmZlci5jOjM0MDUgc2NyZWVuLmM6NDk0MworbXNnaWQgIltoZWxwXSIKK21zZ3N0ciAiW+i8lOWKqeiqquaYjl0iCisKKyM6IGJ1ZmZlci5jOjM0Mzcgc2NyZWVuLmM6NDk0OQorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW+mgkOimvV0iCisKKyM6IGJ1ZmZlci5jOjM3MDgKK21zZ2lkICJBbGwiCittc2dzdHIgIuWFqOmDqCIKKworIzogYnVmZmVyLmM6MzcwOAorbXNnaWQgIkJvdCIKK21zZ3N0ciAi5bqV56uvIgorCisjOiBidWZmZXIuYzozNzEwCittc2dpZCAiVG9wIgorbXNnc3RyICLpoILnq68iCisKKyM6IGJ1ZmZlci5jOjQ0NTQKK21zZ2lkICIiCisiXG4iCisiIyBCdWZmZXIgbGlzdDpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg57ep6KGd5Y2A5YiX6KGoOlxuIgorCisjOiBidWZmZXIuYzo0NDg3Cittc2dpZCAiW0Vycm9yIExpc3RdIgorbXNnc3RyICJb6Yyv6Kqk5YiX6KGoXSIKKworIzogYnVmZmVyLmM6NDUwMCBtZW1saW5lLmM6MTUwMQorbXNnaWQgIltObyBGaWxlXSIKK21zZ3N0ciAiW+acquWRveWQjV0iCisKKyM6IGJ1ZmZlci5jOjQ4MDMKK21zZ2lkICIiCisiXG4iCisiLS0tIFNpZ25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDnrKbomZ8gLS0tIgorCisjOiBidWZmZXIuYzo0ODEzCisjLCBjLWZvcm1hdAorbXNnaWQgIlNpZ25zIGZvciAlczoiCittc2dzdHIgIiVzIOeahOespuiZnzoiCisKKyM6IGJ1ZmZlci5jOjQ4MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIGxpbmU9JWxkICBpZD0lZCAgbmFtZT0lcyIKK21zZ3N0ciAiICAgIOihjD0lbGQgIGlkPSVkICDlkI3nqLE9JXMiCisKKyM6IGRpZmYuYzoxMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTk2OiBDYW4gbm90IGRpZmYgbW9yZSB0aGFuICVsZCBidWZmZXJzIgorbXNnc3RyICJFOTY6IOeEoeazleavlOi8gyhkaWZmKSAlbGTlgIvku6XkuIrnmoTnt6nooZ3ljYAiCisKKyM6IGRpZmYuYzo2NTEKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5Nzog5LiN6IO95bu656uLICIKKworIzogZGlmZi5jOjc1MAorbXNnaWQgIlBhdGNoIGZpbGUiCittc2dzdHIgIlBhdGNoIOaqlOahiCIKKworIzogZGlmZi5jOjEwMDEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6IOeEoeazleiugOWPliBkaWZmIOeahOi8uOWHuiIKKworIzogZGlmZi5jOjE3NDIKK21zZ2lkICJFOTk6IEN1cnJlbnQgYnVmZmVyIGlzIG5vdCBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkU5OTog55uu5YmN55qE57ep6KGd5Y2A5LiN5piv5ZyoIGRpZmYg5qih5byPIgorCisjOiBkaWZmLmM6MTc1NAorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IOaykuaciee3qeihneWNgOWcqCBkaWZmIOaooeW8jyIKKworIzogZGlmZi5jOjE3NjIKK21zZ2lkICJFMTAxOiBNb3JlIHRoYW4gdHdvIGJ1ZmZlcnMgaW4gZGlmZiBtb2RlLCBkb24ndCBrbm93IHdoaWNoIG9uZSB0byB1c2UiCittc2dzdHIgIkUxMDE6IOacieWFqeWAi+S7peS4iueahOe3qeihneWNgOWcqCBkaWZmIOaooeW8j++8jOeEoeazleaxuuWumuimgeeUqOWTquS4gOWAiyIKKworIzogZGlmZi5jOjE3ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiDmib7kuI3liLDnt6nooZ3ljYA6IFwiJXNcIiIKKworIzogZGlmZi5jOjE3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiDnt6nooZ3ljYAgXCIlc1wiIOS4jeaYr+WcqCBkaWZmIOaooeW8jyIKKworIzogZGlncmFwaC5jOjIxNzIKK21zZ2lkICJFMTA0OiBFc2NhcGUgbm90IGFsbG93ZWQgaW4gZGlncmFwaCIKK21zZ3N0ciAiRTEwNDog6KSH5ZCI5a2X5YWDKGRpZ3JhcGgp5Lit5LiN6IO95L2/55SoIEVzY2FwZSIKKworIzogZGlncmFwaC5jOjIzNDQKK21zZ2lkICJFNTQ0OiBLZXltYXAgZmlsZSBub3QgZm91bmQiCittc2dzdHIgIkU1NDQ6IOaJvuS4jeWIsCBrZXltYXAg5qqUIgorCisjOiBkaWdyYXBoLmM6MjM3MQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTog5L2/55SoIDpsb2Fka2V5bWFwICIKKworIzogZWRpdC5jOjQwCittc2dpZCAiIEtleXdvcmQgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIg6Zec6Y215a2X6Ieq5YuV5a6M5oiQICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YIOaooeW8jyAoXkUvXlkvXkwvXl0vXkYvXkkvXksvXkQvXk4vXlApIgorCisjLiBTY3JvbGwgaGFzIGl0J3Mgb3duIG1zZ3MsIGluIGl0J3MgcGxhY2UgdGhlcmUgaXMgdGhlIG1zZyBmb3IgbG9jYWwKKyMuICogY3RybF94X21vZGUgPSAwIChlZyBjb250aW51ZV9zdGF0dXMgJiBDT05UX0xPQ0FMKSAgLS0gQWNldmVkbworIzogZWRpdC5jOjQ0Cittc2dpZCAiIEtleXdvcmQgTG9jYWwgY29tcGxldGlvbiAoXk4vXlApIgorbXNnc3RyICIg5Y2A5Z+f6Zec6Y215a2X6Ieq5YuV5a6M5oiQICheTi9eUCkiCisKKyM6IGVkaXQuYzo0NQorbXNnaWQgIiBXaG9sZSBsaW5lIGNvbXBsZXRpb24gKF5ML15OL15QKSIKK21zZ3N0ciAiIOaVtOihjOiHquWLleWujOaIkCAoXkwvXk4vXlApIgorCisjOiBlZGl0LmM6NDYKK21zZ2lkICIgRmlsZSBuYW1lIGNvbXBsZXRpb24gKF5GL15OL15QKSIKK21zZ3N0ciAiIOaqlOWQjeiHquWLleWujOaIkCAoXkYvXk4vXlApIgorCisjOiBlZGl0LmM6NDcKK21zZ2lkICIgVGFnIGNvbXBsZXRpb24gKF5dL15OL15QKSIKK21zZ3N0ciAiIOaomeexpOiHquWLleWujOaIkCAoXl0vXk4vXlApIgorCisjOiBlZGl0LmM6NDgKK21zZ2lkICIgUGF0aCBwYXR0ZXJuIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIOi3r+W+keiHquWLleWujOaIkCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDkKK21zZ2lkICIgRGVmaW5pdGlvbiBjb21wbGV0aW9uICheRC9eTi9eUCkiCittc2dzdHIgIiDlrprnvqnoh6rli5XlrozmiJAgKF5EL15OL15QKSIKKworIzogZWRpdC5jOjUxCittc2dpZCAiIERpY3Rpb25hcnkgY29tcGxldGlvbiAoXksvXk4vXlApIgorbXNnc3RyICIg5a2X5YW46Ieq5YuV5a6M5oiQICheSy9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MgorbXNnaWQgIiBUaGVzYXVydXMgY29tcGxldGlvbiAoXlQvXk4vXlApIgorbXNnc3RyICIgVGhlc2F1cnVzIOiHquWLleWujOaIkCAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIOWRveS7pOWIl+iHquWLleWujOaIkCAoXlYvXk4vXlApIgorCisjOiBlZGl0LmM6NTYKK21zZ2lkICJIaXQgZW5kIG9mIHBhcmFncmFwaCIKK21zZ3N0ciAi5bey5Yiw5q616JC957WQ5bC+IgorCisjOiBlZGl0LmM6OTQxCittc2dpZCAiJ3RoZXNhdXJ1cycgb3B0aW9uIGlzIGVtcHR5IgorbXNnc3RyICLpgbjpoIUgJ3RoZXNhdXJ1cycg5pyq6Kit5a6aIgorCisjOiBlZGl0LmM6MTE0NQorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIumBuOmghSAnZGljdGlvbmFyeScg5pyq6Kit5a6aIgorCisjOiBlZGl0LmM6MjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyBkaWN0aW9uYXJ5OiAlcyIKK21zZ3N0ciAi5o6D556E5a2X5YW4OiAlcyIKKworIzogZWRpdC5jOjIzMzYKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAo5o+S5YWlKSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjIzMzgKK21zZ2lkICIgKHJlcGxhY2UpIFNjcm9sbCAoXkUvXlkpIgorbXNnc3RyICIgKOWPluS7oykgU2Nyb2xsICheRS9eWSkiCisKKyM6IGVkaXQuYzoyNjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nOiAlcyIKK21zZ3N0ciAi5o6D556E5LitOiAlcyIKKworIzogZWRpdC5jOjI2ODcKK21zZ2lkICJTY2FubmluZyB0YWdzLiIKK21zZ3N0ciAi5o6D556E5qiZ57GkLiIKKworIzogZWRpdC5jOjMzNDkKK21zZ2lkICIgQWRkaW5nIgorbXNnc3RyICIg5aKe5YqgIgorCisjLiBzaG93bW9kZSBtaWdodCByZXNldCB0aGUgaW50ZXJuYWwgbGluZSBwb2ludGVycywgc28gaXQgbXVzdAorIy4gKiBiZSBjYWxsZWQgYmVmb3JlIGxpbmUgPSBtbF9nZXQoKSwgb3Igd2hlbiB0aGlzIGFkZHJlc3MgaXMgbm8KKyMuICogbG9uZ2VyIG5lZWRlZC4gIC0tIEFjZXZlZG8uCisjLgorIzogZWRpdC5jOjMzOTgKK21zZ2lkICItLSBTZWFyY2hpbmcuLi4iCittc2dzdHIgIi0tIOaQnOWwi+S4rS4uLiIKKworIzogZWRpdC5jOjM0NTQKK21zZ2lkICJCYWNrIGF0IG9yaWdpbmFsIgorbXNnc3RyICLlm57liLDotbfpu54iCisKKyM6IGVkaXQuYzozNDU5Cittc2dpZCAiV29yZCBmcm9tIG90aGVyIGxpbmUiCittc2dzdHIgIuW+nuWIpeihjOmWi+Wni+eahOWtlyAoPykiCisKKyM6IGVkaXQuYzozNDY0Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgIuWPquacieatpOmgheespuWQiCIKKworIzogZWRpdC5jOjM1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIuaJvuWIsCAlZCAvICVkIgorCisjOiBlZGl0LmM6MzUyNgorIywgYy1mb3JtYXQKK21zZ2lkICJtYXRjaCAlZCIKK21zZ3N0ciAi56ym5ZCIICVkIgorCisjLiBTa2lwIGZ1cnRoZXIgYXJndW1lbnRzIGJ1dCBkbyBjb250aW51ZSB0bworIy4gKiBzZWFyY2ggZm9yIGEgdHJhaWxpbmcgY29tbWFuZC4KKyM6IGV2YWwuYzo4ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNjogVW5rbm93biB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA2OiDmnKrlrprnvqnnmoTorormlbg6IFwiJXNcIiIKKworIzogZXZhbC5jOjExODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwNzogTWlzc2luZyBicmFjZXM6ICVzIgorbXNnc3RyICJFMTA3OiDnvLrlsJHlsI3mh4nnmoTmi6zomZ86ICVzIgorCisjOiBldmFsLmM6MTI5MCBldmFsLmM6MTMwNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA4OiBObyBzdWNoIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDg6IOeEoeatpOiuiuaVuDogXCIlc1wiIgorCisjOiBldmFsLmM6MTU2MAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogJz8nIOW+jOe8uuWwkSAnOiciCisKKyM6IGV2YWwuYzoyMTc2Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IOe8uuWwkeWwjeaHieeahCBcIilcIiIKKworIzogZXZhbC5jOjIyMzMKK21zZ2lkICJFMTExOiBNaXNzaW5nICddJyIKK21zZ3N0ciAiRTExMTog57y65bCR5bCN5oeJ55qEIFwiXVwiIgorCisjOiBldmFsLmM6MjMwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTEyOiBPcHRpb24gbmFtZSBtaXNzaW5nOiAlcyIKK21zZ3N0ciAiRTExMjog57y65bCR6YG46aCF5ZCN56ixOiAlcyIKKworIzogZXZhbC5jOjIzMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExMzogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMTEzOiDkuI3mraPnorrnmoTpgbjpoIU6ICVzIgorCisjOiBldmFsLmM6MjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE0OiBNaXNzaW5nIHF1b3RlOiAlcyIKK21zZ3N0ciAiRTExNDog57y65bCR5byV6JmfOiAlcyIKKworIzogZXZhbC5jOjI1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNTogTWlzc2luZyBxdW90ZTogJXMiCittc2dzdHIgIkUxMTU6IOe8uuWwkeW8leiZnzogJXMiCisKKyM6IGV2YWwuYzoyODQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjog5Ye95byPICVzIOeahOW8leaVuOS4jeato+eiuiIKKworIzogZXZhbC5jOjI4NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTExNzogVW5rbm93biBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMTc6IOacquWumue+qeeahOWHveW8jzogJXMiCisKKyM6IGV2YWwuYzoyODQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTg6IFRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE4OiDlh73lvI8gJXMg55qE5byV5pW46YGO5aSaIgorCisjOiBldmFsLmM6Mjg0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiDlh73lvI8gJXMg55qE5byV5pW45aSq5bCRIgorCisjOiBldmFsLmM6Mjg0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMTIwOiBVc2luZyA8U0lEPiBub3QgaW4gYSBzY3JpcHQgY29udGV4dDogJXMiCittc2dzdHIgIkUxMjA6IDxTSUQ+IOS4jeiDveWcqCBzY3JpcHQg5pys5paH5aSW5L2/55SoOiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzQ2NSBndWkuYzo0MjM4IGd1aV9ndGsuYzoxOTkxCittc2dpZCAiJk9rIgorbXNnc3RyICLnorrlrpooJk8pIgorCisjOiBldmFsLmM6NDAwMAorIywgYy1mb3JtYXQKK21zZ2lkICIrLSVzJTNsZCBsaW5lczogIgorbXNnc3RyICIrLSVzJTNsZCDooYw6ICIKKworIzogZXZhbC5jOjUxNDkKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIueiuuWumigmTylcbiIKKyLlj5bmtogoJkMpIgorCisjOiBldmFsLmM6NTE4MgorbXNnaWQgImNhbGxlZCBpbnB1dHJlc3RvcmUoKSBtb3JlIG9mdGVuIHRoYW4gaW5wdXRzYXZlKCkiCittc2dzdHIgIuWRvOWPqyBpbnB1dHJlc3RvcmUoKSDnmoTmrKHmlbjmr5QgaW5wdXRzYXZlKCkg6YKE5aSaIgorCisjOiBldmFsLmM6NjAzNgorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDog5rKS5pyJ6IiHIFZpbSBTZXJ2ZXIg5bu656uL6YCj57eaIgorCisjOiBldmFsLmM6NjEzMworbXNnaWQgIkUyNzc6IFVuYWJsZSB0byByZWFkIGEgc2VydmVyIHJlcGx5IgorbXNnc3RyICJFMjc3OiDnhKHms5XoroDlj5bkvLrmnI3lmajnmoTlm57mh4kiCisKKyM6IGV2YWwuYzo2MTYxCittc2dpZCAiRTI1ODogVW5hYmxlIHRvIHNlbmQgdG8gY2xpZW50IgorbXNnc3RyICJFMjU4OiDnhKHms5XlgrPpgIHliLAgY2xpZW50IgorCisjOiBldmFsLmM6NjIwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQxOiBVbmFibGUgdG8gc2VuZCB0byAlcyIKK21zZ3N0ciAiRTI0MTog54Sh5rOV5YKz6YCB5YiwICVzIgorCisjOiBldmFsLmM6NjMwOQorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKOS4jeato+eiuikiCisKKyM6IGV2YWwuYzo3NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IOiuiuaVuCAlcyDlsJrmnKrlrprnvqkiCisKKyM6IGV2YWwuYzo3ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IOS4jeWQiOazleeahOiuiuaVuOWQjeeosTogJXMiCisKKyM6IGV2YWwuYzo4MTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjI6IEZ1bmN0aW9uICVzIGFscmVhZHkgZXhpc3RzLCBhZGQgISB0byByZXBsYWNlIGl0IgorbXNnc3RyICJFMTIyOiDlh73lvI8gJXMg5bey57aT5a2Y5ZyoLCDoq4vkvb/nlKggISDlvLfliLblj5bku6MiCisKKyM6IGV2YWwuYzo4MTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IOWHveW8jyAlcyDlsJrmnKrlrprnvqkiCisKKyM6IGV2YWwuYzo4MjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDog57y65bCRIFwiKFwiOiAlcyIKKworIzogZXZhbC5jOjgyMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyNTogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUxMjU6IOWPg+aVuOS4jeato+eiujogJXMiCisKKyM6IGV2YWwuYzo4MzEzCittc2dpZCAiRTEyNjogTWlzc2luZyA6ZW5kZnVuY3Rpb24iCittc2dzdHIgIkUxMjY6IOe8uuWwkSA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo4Mzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiDlh73lvI8gJXMg5q2j5Zyo5L2/55So5Lit77yM54Sh5rOV6YeN5paw5a6a576pIgorCisjOiBldmFsLmM6ODQ2NAorbXNnaWQgIkUxMjk6IEZ1bmN0aW9uIG5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUxMjk6IOmcgOimgeWHveW8j+WQjeeosSIKKworIzogZXZhbC5jOjg1MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiAlcyIKK21zZ3N0ciAiRTEyODog5Ye95byP5ZCN56ix56ys5LiA5YCL5a2X5q+N5b+F6aCI5aSn5a+rOiAlcyIKKworIzogZXZhbC5jOjg3MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDog5Ye95byPICVzIOWwmuacquWumue+qSIKKworIzogZXZhbC5jOjg3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiDlh73lvI8gJXMg5q2j5Zyo5L2/55So5Lit77yM54Sh5rOV5Yiq6ZmkIgorCisjOiBldmFsLmM6ODc2MAorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IOWHveW8j+mBnui/tOWRvOWPq+WxpOaVuOi2hemBjiAnbWF4ZnVuY2RlcHRoJyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODgxMworIywgYy1mb3JtYXQKK21zZ2lkICJjYWxsaW5nICVzIgorbXNnc3RyICLlkbzlj6sgJXMiCisKKyM6IGV2YWwuYzo4ODY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzIOiiq+W8t+WItuS4reaWt+Wft+ihjCIKKworIzogZXZhbC5jOjg4NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nICMlbGQiCittc2dzdHIgIiVzIOWCs+WbnuWAvCAjJWxkICIKKworIzogZXZhbC5jOjg4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmV0dXJuaW5nIFwiJXNcIiIKK21zZ3N0ciAiJXMg5YKz5Zue5YC8IFwiJXNcIiIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBldmFsLmM6ODg4OCBleF9jbWRzMi5jOjIyMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udGludWluZyBpbiAlcyIKK21zZ3N0ciAi57m857qMOiAlcyIKKworIzogZXZhbC5jOjg5MzUKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybiDlv4XpoIjlnKjlh73lvI/oo6Hkvb/nlKgiCisKKyM6IGV2YWwuYzo5MjY2Cittc2dpZCAiIgorIlxuIgorIiMgZ2xvYmFsIHZhcmlhYmxlczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMg5YWo5Z+f6K6K5pW4OlxuIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICDljYHlha3pgLLkvY0gJTAyeCwgIOWFq+mAsuS9jSAlMDNvIgorCisjOiBleF9jbWRzLmM6NDMzCittc2dpZCAiRTEzNDogTW92ZSBsaW5lcyBpbnRvIHRoZW1zZWx2ZXMiCittc2dzdHIgIkUxMzQ6IOeEoeazleaKiuihjOenu+WIsOWug+iHquW3suWFpyIKKworIzogZXhfY21kcy5jOjUwMgorbXNnaWQgIjEgbGluZSBtb3ZlZCIKK21zZ3N0ciAi5bey5pCs56e7IDEg6KGMIgorCisjOiBleF9jbWRzLmM6NTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAi5bey5pCs56e7ICVsZCDooYwiCisKKyM6IGV4X2NtZHMuYzo5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGZpbHRlcmVkIgorbXNnc3RyICLlt7LomZXnkIYgJWxkIOihjCIKKworIzogZXhfY21kcy5jOjkzNworbXNnaWQgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kcyBtdXN0IG5vdCBjaGFuZ2UgY3VycmVudCBidWZmZXIiCittc2dzdHIgIkUxMzU6ICpGaWx0ZXIqIEF1dG9jb21tYW5kIOS4jeWPr+S7peabtOaUuee3qeihneWNgOeahOWFp+WuuSIKKworIzogZXhfY21kcy5jOjEwMjIKK21zZ2lkICJbTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2VdXG4iCittc2dzdHIgIlvmm7TmlrDlvozlsJrmnKrlhLLlrZhdXG4iCisKKyM6IGV4X2NtZHMuYzoxMjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzdmltaW5mbzogJXMgaW4gbGluZTogIgorbXNnc3RyICIlc3ZpbWluZm86ICVzIOWcqOihjOS4rTogIgorCisjOiBleF9jbWRzLmM6MTI3MworbXNnaWQgIkUxMzY6IHZpbWluZm86IFRvbyBtYW55IGVycm9ycywgc2tpcHBpbmcgcmVzdCBvZiBmaWxlIgorbXNnc3RyICJFMTM2OiB2aW1pbmZvOiDpgY7lpJrpjK/oqqQsIOW/veeVpeaqlOahiOWFtumkmOmDqOWIhiIKKworIzogZXhfY21kcy5jOjEzMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiJXMlcyVzIgorbXNnc3RyICLoroDlj5YgdmltaW5mbyDmqpTmoYggXCIlc1wiJXMlcyVzIgorCisjOiBleF9jbWRzLmM6MTMwMworbXNnaWQgIiBpbmZvIgorbXNnc3RyICIg6KiK5oGvIgorCisjOiBleF9jbWRzLmM6MTMwNAorbXNnaWQgIiBtYXJrcyIKK21zZ3N0ciAiIOaomeiomCIKKworIzogZXhfY21kcy5jOjEzMDUKK21zZ2lkICIgRkFJTEVEIgorbXNnc3RyICIg5aSx5pWXIgorCisjOiBleF9jbWRzLmM6MTM5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogVmltaW5mbyDmqpTmoYjnhKHms5Xlr6vlhaU6ICVzIgorCisjOiBleF9jbWRzLmM6MTUyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiDnhKHms5Xlr6vlhaUgdmltaW5mbyDmqpTmoYggJXMgISIKKworIzogZXhfY21kcy5jOjE1MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICLlr6vlhaUgdmltaW5mbyDmqpTmoYggXCIlc1wiIOS4rSIKKworIy4gV3JpdGUgdGhlIGluZm86CisjOiBleF9jbWRzLmM6MTYyNworIywgYy1mb3JtYXQKK21zZ2lkICIjIFRoaXMgdmltaW5mbyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgVmltICVzLlxuIgorbXNnc3RyICIjIOacrCB2aW1pbmZvIOaqlOahiOaYr+eUsSBWaW0gJXMg5omA55Si55SfLlxuIgorCisjOiBleF9jbWRzLmM6MTYyOQorbXNnaWQgIiIKKyIjIFlvdSBtYXkgZWRpdCBpdCBpZiB5b3UncmUgY2FyZWZ1bCFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIiMg5aaC5p6c5oOz6KaB6Ieq6KGM5L+u5pS56KuL54m55Yil5bCP5b+D77yBXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjMxCittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgJ2VuY29kaW5nJyDlnKjmraTmqpTlu7rnq4vmmYLnmoTlgLxcbiIKKworIzogZXhfY21kcy5jOjE3MzAKK21zZ2lkICJJbGxlZ2FsIHN0YXJ0aW5nIGNoYXIiCittc2dzdHIgIueEoeaViOeahOi1t+Wni+Wtl+WFgyIKKworIzogZXhfY21kcy5jOjIwNzUgZXhfY21kcy5jOjIzNDAgZXhfY21kczIuYzo3NDQKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICLlj6blrZjmlrDmqpQiCisKKyMuIE92ZXJ3cml0aW5nIGEgZmlsZSB0aGF0IGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciBpcyBub3QgYQorIy4gKiBnb29kIGlkZWEuCisjOiBleF9jbWRzLmM6MjExOAorbXNnaWQgIkUxMzk6IEZpbGUgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIgorbXNnc3RyICJFMTM5OiDmgqjlnKjlj6bkuIDlgIvnt6nooZ3ljYDkuZ/ovInlhaXkuobpgJnlgIvmqpTmoYgiCisKKyM6IGV4X2NtZHMuYzoyMTUyCittc2dpZCAiV3JpdGUgcGFydGlhbCBmaWxlPyIKK21zZ3N0ciAi6KaB5a+r5YWl6YOo5YiG5qqU5qGI5ZeO77yfIgorCisjOiBleF9jbWRzLmM6MjE1OQorbXNnaWQgIkUxNDA6IFVzZSAhIHRvIHdyaXRlIHBhcnRpYWwgYnVmZmVyIgorbXNnc3RyICJFMTQwOiDoq4vkvb/nlKggISDku6Xlr6vlhaXpg6jliIbnt6nooZ3ljYAiCisKKyM6IGV4X2NtZHMuYzoyMjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIFwiJS4qc1wiPyIKK21zZ3N0ciAi6KaB6KaG5a+r5bey5a2Y5Zyo55qE5qqU5qGIIFwiJS4qc1wi77yfIgorCisjOiBleF9jbWRzLmM6MjM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTQxOiBObyBmaWxlIG5hbWUgZm9yIGJ1ZmZlciAlbGQiCittc2dzdHIgIkUxNDE6IOe3qeihneWNgCAlbGQg5rKS5pyJ5qqU5qGI5ZCN56ixIgorCisjOiBleF9jbWRzLmM6MjM4MworbXNnaWQgIkUxNDI6IEZpbGUgbm90IHdyaXR0ZW46IFdyaXRpbmcgaXMgZGlzYWJsZWQgYnkgJ3dyaXRlJyBvcHRpb24iCittc2dzdHIgIkUxNDI6IOaqlOahiOacquWvq+WFpe+8jOWboOeCuiAnd3JpdGUnIOmBuOmgheiiq+mXnOmWiSIKKworIzogZXhfY21kcy5jOjI0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIlwiJS4qc1wiIOW3suioreWumiAncmVhZG9ubHknIOmBuOmghS5cbiIKKyLnorrlrpropoHopoblr6vll47vvJ8iCisKKyM6IGV4X2NtZHMuYzoyNTY4Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICLnt6jovK/mqpTmoYgiCisKKyM6IGV4X2NtZHMuYzozMTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDM6IEF1dG9jb21tYW5kcyB1bmV4cGVjdGVkbHkgZGVsZXRlZCBuZXcgYnVmZmVyICVzIgorbXNnc3RyICJFMTQzOiBBdXRvY29tbWFuZHMg5oSP5aSW5Zyw5Yiq6Zmk5paw57ep6KGd5Y2AICVzIgorCisjOiBleF9jbWRzLmM6MzI2OQorbXNnaWQgIkUxNDQ6IG5vbi1udW1lcmljIGFyZ3VtZW50IHRvIDp6IgorbXNnc3RyICJFMTQ0OiA6eiDkuI3mjqXlj5fpnZ7mlbjlrZfnmoTlj4PmlbgiCisKKyM6IGV4X2NtZHMuYzozMzU0Cittc2dpZCAiRTE0NTogU2hlbGwgY29tbWFuZHMgbm90IGFsbG93ZWQgaW4gcnZpbSIKK21zZ3N0ciAiRTE0NTogcnZpbSDkuK3npoHmraLkvb/nlKggc2hlbGwg5ZG95LukIgorCisjOiBleF9jbWRzLmM6MzQ2MQorbXNnaWQgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZGVsaW1pdGVkIGJ5IGxldHRlcnMiCittc2dzdHIgIkUxNDY6IFJlZ3VsYXIgZXhwcmVzc2lvbiDnhKHms5XnlKjlrZfmr43liIbpmpQgKD8pIgorCisjOiBleF9jbWRzLmM6MzgwNworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICLlj5bku6PngrogJXMgKHkvbi9hL3EvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQxNzIKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKOW3suS4reaWtykgIgorCisjOiBleF9jbWRzLmM6NDE3NgorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICLlj5bku6PkuIDntYQiCisKKyM6IGV4X2NtZHMuYzo0MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBzdWJzdGl0dXRpb25zIgorbXNnc3RyICLlj5bku6MgJWxkIOe1hCIKKworIzogZXhfY21kcy5jOjQxODEKK21zZ2lkICIgb24gMSBsaW5lIgorbXNnc3RyICIg5LiA6KGM5LitIgorCisjOiBleF9jbWRzLmM6NDE4MworIywgYy1mb3JtYXQKK21zZ2lkICIgb24gJWxkIGxpbmVzIgorbXNnc3RyICIgJWxkIOihjOS4rSIKKworIzogZXhfY21kcy5jOjQyMzQKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IDpnbG9iYWwg54Sh5rOV6YGe6L+05Z+36KGMIgorCisjOiBleF9jbWRzLmM6NDI2OQorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiDmspLmnInkvb/nlKjpgY4gUmVndWxhciBleHByZXNzaW9uICg/KSIKKworIzogZXhfY21kcy5jOjQzMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0dGVybiBmb3VuZCBpbiBldmVyeSBsaW5lOiAlcyIKK21zZ3N0ciAi5q+P5LiA6KGM6YO95om+5LiN5YiwOiAlcyIKKworIzogZXhfY21kcy5jOjQzOTkKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIOWJjeS4gOe1hOabv+S7o+Wtl+S4sjpcbiIKKyIkIgorCisjOiBleF9jbWRzLmM6NDUwMworIywgYy1mb3JtYXQKK21zZ2lkICJFMTQ5OiBTb3JyeSwgbm8gaGVscCBmb3IgJXMiCittc2dzdHIgIkUxNDk6IOaKseatiSwg5rKS5pyJICVzIOeahOiqquaYjiIKKworIzogZXhfY21kcy5jOjQ1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU29ycnksIGhlbHAgZmlsZSBcIiVzXCIgbm90IGZvdW5kIgorbXNnc3RyICLmirHmrYksIOaJvuS4jeWIsOiqquaYjuaqlCBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo1MDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTA6IE5vdCBhIGRpcmVjdG9yeTogJXMiCittc2dzdHIgIkUxNTA6ICVzIOS4jeaYr+ebrumMhCIKKworIzogZXhfY21kcy5jOjUwNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MjogQ2Fubm90IG9wZW4gJXMgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNTI6IOeEoeazleS7peWvq+WFpeaooeW8j+mWi+WVnyBcIiVzXCIiCisKKyM6IGV4X2NtZHMuYzo1MDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTM6IFVuYWJsZSB0byBvcGVuICVzIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTUzOiDnhKHms5XoroDlj5bmqpTmoYg6ICVzIgorCisjOiBleF9jbWRzLmM6NTE1NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU0OiBEdXBsaWNhdGUgdGFnIFwiJXNcIiBpbiBmaWxlICVzIgorbXNnc3RyICJFMTU0OiDmqJnnsaQodGFnKSBcIiVzXCIg5Zyo5qqU5qGIICVzIOijoemHjeikh+WHuuePvuWkmuasoSIKKworIzogZXhfY21kcy5jOjUyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MDogVW5rbm93biBzaWduIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTYwOiDmnKrlrprnvqnnmoQgc2lnbiBjb21tYW5kOiAlcyIKKworIzogZXhfY21kcy5jOjUyODEKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1Njog57y65bCRIHNpZ24g5ZCN56ixIgorCisjOiBleF9jbWRzLmM6NTMyNworbXNnaWQgIkU2MTI6IFRvbyBtYW55IHNpZ25zIGRlZmluZWQiCittc2dzdHIgIkU2MTI6IOW3suWumue+qeWkquWkmiBzaWducyIKKworIzogZXhfY21kcy5jOjUzOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiDkuI3mraPnorrnmoQgc2lnbiDmloflrZc6ICVzIgorCisjOiBleF9jbWRzLmM6NTQyNSBleF9jbWRzLmM6NTYxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiDkuI3mraPnorrnmoQgc2lnbjogJXMiCisKKyM6IGV4X2NtZHMuYzo1NDcxCittc2dpZCAiRTE1OTogTWlzc2luZyBzaWduIG51bWJlciIKK21zZ3N0ciAiRTE1OTog57y65bCRIHNpZ24gbnVtYmVyIgorCisjOiBleF9jbWRzLmM6NTU1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODog57ep6KGd5Y2A5ZCN56ix6Yyv6KqkOiAlcyIKKworIzogZXhfY21kcy5jOjU1OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NzogSW52YWxpZCBzaWduIElEOiAlbGQiCittc2dzdHIgIkUxNTc6IFNpZ24gSUQg6Yyv6KqkOiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1NzYxCittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJb5bey5Yiq6ZmkXSIKKworIzogZXhfY21kczIuYzo4MgorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGNvbnRpbnVlLiIKK21zZ3N0ciAi6YCy5YWl6Zmk6Yyv5qih5byPLiDovLjlhaUgXCJjb250XCIg5Lul5Zue5Yiw5q2j5bi45qih5byPLiIKKworIzogZXhfY21kczIuYzo4NiBleF9kb2NtZC5jOjg1MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgIuihjCAlbGQ6ICVzIgorCisjOiBleF9jbWRzMi5jOjg4CisjLCBjLWZvcm1hdAorbXNnaWQgImNtZDogJXMiCittc2dzdHIgImNtZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6MjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkJyZWFrcG9pbnQgaW4gXCIlcyVzXCIgbGluZSAlbGQiCittc2dzdHIgIlwiJXMlc1wiIOS4reaWt+m7njog56ysICVsZCDooYwiCisKKyM6IGV4X2NtZHMyLmM6NTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTog5om+5LiN5Yiw5Lit5pa36bueOiAlcyIKKworIzogZXhfY21kczIuYzo1NDcKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICLmspLmnInlrprnvqnkuK3mlrfpu54iCisKKyM6IGV4X2NtZHMyLmM6NTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiUzZCAgJXMgJXMgIGxpbmUgJWxkIgorbXNnc3RyICIlM2QgICVzICVzICDnrKwgJWxkIOihjCIKKworIzogZXhfY21kczIuYzo3NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAi5bCH6K6K5YuV5a2Y5YSy6IezIFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo3NjkgZXhfZG9jbWQuYzo4ODIwCittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIuacquWRveWQjSIKKworIzogZXhfY21kczIuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IOW3suabtOaUuemBjue3qeihneWNgCBcIiVzXCIg5L2G5bCa5pyq5a2Y5qqUICjlj6/nlKggISDlvLfliLbln7fooYwpIgorCisjOiBleF9jbWRzMi5jOjk3NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAi5rOo5oSPOiDlt7LliIfmj5vliLDlhbblroPnt6nooZ3ljYAgKOiri+aqouafpSBBdXRvY29tbWFuZHMg5pyJ54Sh6Yyv6KqkKSIKKworIzogZXhfY21kczIuYzoxMzc3Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiDlj6rmnInkuIDlgIvmqpTmoYjlj6/nt6jovK8iCisKKyM6IGV4X2NtZHMyLmM6MTM3OQorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDog5bey57aT5Zyo56ys5LiA5YCL5qqU5qGI5LqGIgorCisjOiBleF9jbWRzMi5jOjEzODEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTog5bey57aT5Zyo5pyA5b6M5LiA5YCL5qqU5qGI5LqGIgorCisjOiBleF9jbWRzMi5jOjE4MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIGZvciBcIiVzXCIgaW4gXCIlc1wiIgorbXNnc3RyICLmkJzlsIvkuK06IFwiJXNcIiAtLSBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg1MAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiIKK21zZ3N0ciAi5pCc5bCL5LitOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MTg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgZm91bmQgaW4gJ3J1bnRpbWVwYXRoJzogXCIlc1wiIgorbXNnc3RyICLlnKggJ3J1bnRpbWVwYXRoJyDoo6Hmib7kuI3liLAgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5MDUKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAi5Z+36KGMIFZpbSBzY3JpcHQiCisKKyM6IGV4X2NtZHMyLmM6MjA1NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc291cmNlIGEgZGlyZWN0b3J5OiBcIiVzXCIiCittc2dzdHIgIueEoeazleWft+ihjOebrumMhO+8miBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAi54Sh5rOV5Z+36KGMIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMDg4CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWxkOiBjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAi56ysICVsZCDooYw6IOeEoeazleWft+ihjCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJzb3VyY2luZyBcIiVzXCIiCittc2dzdHIgIuWft+ihjCBcIiVzXCIg5LitIgorCisjOiBleF9jbWRzMi5jOjIxMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IHNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAi56ysICVsZCDooYw6IOe1kOadn+Wft+ihjCAlcyIKKworIzogZXhfY21kczIuYzoyMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgImZpbmlzaGVkIHNvdXJjaW5nICVzIgorbXNnc3RyICLntZDmnZ/ln7fooYwgJXMiCisKKyM6IGV4X2NtZHMyLmM6MjUyOAorbXNnaWQgIlcxNTogV2FybmluZzogV3JvbmcgbGluZSBzZXBhcmF0b3IsIF5NIG1heSBiZSBtaXNzaW5nIgorbXNnc3RyICJXMTU6IOazqOaEjzog6Yyv6Kqk55qE6KGM5YiG6ZqU5a2X5YWD77yM5Y+v6IO95piv5bCR5LqGIF5NIgorCisjOiBleF9jbWRzMi5jOjI1NzcKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiDlnKjln7fooYwgc2NyaXB0IOaqlOahiOWkluS4jeWPr+S9v+eUqCA6c2NyaXB0ZW5jb2RpbmciCisKKyM6IGV4X2NtZHMyLmM6MjYxMAorbXNnaWQgIkUxNjg6IDpmaW5pc2ggdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY4OiDlnKjln7fooYwgc2NyaXB0IOaqlOahiOWkluS4jeWPr+S9v+eUqCA6ZmluaXNoIgorCisjOiBleF9jbWRzMi5jOjMwMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGFnZSAlZCIKK21zZ3N0ciAi56ysICVkIOmggSIKKworIzogZXhfY21kczIuYzozMTE2Cittc2dpZCAiTm8gdGV4dCB0byBiZSBwcmludGVkIgorbXNnc3RyICLmspLmnInopoHliJfljbDnmoTmloflrZciCisKKyM6IGV4X2NtZHMyLmM6MzE5NAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAi5YiX5Y2w5LitOiDnrKwgJWQg6aCBICglZCUlKSIKKworIzogZXhfY21kczIuYzozMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIiBDb3B5ICVkIG9mICVkIgorbXNnc3RyICLopIfoo70gJWQgLyAlZCIKKworIzogZXhfY21kczIuYzozMjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50ZWQ6ICVzIgorbXNnc3RyICLlt7LliJfljbA6ICVzIgorCisjOiBleF9jbWRzMi5jOjMyNjIKK21zZ2lkICJQcmludGluZyBhYm9ydGVkIgorbXNnc3RyICLlt7Llj5bmtojliJfljbAiCisKKyM6IGV4X2NtZHMyLmM6MzY0NQorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTog54Sh5rOV5a+r5YWlIFBvc3RTY3JpcHQg6Ly45Ye65qqUIgorCisjOiBleF9jbWRzMi5jOjQzMjAKK21zZ2lkICJFMzI0OiBDYW4ndCBvcGVuIFBvc3RTY3JpcHQgb3V0cHV0IGZpbGUiCittc2dzdHIgIkUzMjQ6IOeEoeazlemWi+WVnyBQb3N0U2NyaXB0IOi8uOWHuuaqlCIKKworIzogZXhfY21kczIuYzo0MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NTY6IENhbid0IG9wZW4gZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTY6IOeEoeazlemWi+WVn+aqlOahiCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDM3MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDU3OiBDYW4ndCByZWFkIFBvc3RTY3JpcHQgcmVzb3VyY2UgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0NTc6IOeEoeazleiugOWPliBQb3N0U2NyaXB0IHJlc291cmNlIOaqlCBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDU3NgorbXNnaWQgIlNlbmRpbmcgdG8gcHJpbnRlci4uLiIKK21zZ3N0ciAi5YKz6YCB6LOH5paZ5Yiw5Y2w6KGo5qmfLi4uIgorCisjOiBleF9jbWRzMi5jOjQ1ODAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiDnhKHms5XliJfljbAgUG9zdFNjcmlwdCDmqpTmoYgiCisKKyM6IGV4X2NtZHMyLmM6NDU4MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAi5bey6YCB5Ye65YiX5Y2w5bel5L2c44CCIgorCisjOiBleF9jbWRzMi5jOjQ5NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCAlc2xhbmd1YWdlOiBcIiVzXCIiCittc2dzdHIgIuebruWJjeeahCAlc+iqnuiogDogXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQ5ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5NzogQ2Fubm90IHNldCBsYW5ndWFnZSB0byBcIiVzXCIiCittc2dzdHIgIkUxOTc6IOS4jeiDveioreWumuiqnuiogOaIkCBcIiVzXCIiCisKKyM6IGV4X2RvY21kLmM6NDg2Cittc2dpZCAiRW50ZXJpbmcgRXggbW9kZS4gIFR5cGUgXCJ2aXN1YWxcIiB0byBnbyB0byBOb3JtYWwgbW9kZS4iCittc2dzdHIgIumAsuWFpSBFeCDmqKHlvI8uIOi8uOWFpSBcInZpc3VhXCIg5Lul5Zue5Yiw5q2j5bi45qih5byPLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTIyCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IOW3suWIsOaqlOahiOe1kOWwviIKKworIzogZXhfZG9jbWQuYzo2MjQKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IOWRveS7pOmBnui/tOWxpOaVuOmBjuWkmiIKKworIzogZXhfZG9jbWQuYzoxMDkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDU6IEV4Y2VwdGlvbiBub3QgY2F1Z2h0OiAlcyIKK21zZ3N0ciAiRTYwNTog5pyq5pSU5oiq55qE5L6L5aSW77yaICVzIgorCisjOiBleF9kb2NtZC5jOjExNzYKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICLlkb3ku6TmqpTntZDmnZ8iCisKKyM6IGV4X2RvY21kLmM6MTE3NworbXNnaWQgIkVuZCBvZiBmdW5jdGlvbiIKK21zZ3N0ciAi5Ye95byP57WQ5bC+IgorCisjOiBleF9kb2NtZC5jOjE2MjgKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiDkvb/nlKjogIXlrprnvqnnmoTlkb3ku6TmnIPmt7fmt4YiCisKKyM6IGV4X2RvY21kLmM6MTY0MgorbXNnaWQgIkU0OTI6IE5vdCBhbiBlZGl0b3IgY29tbWFuZCIKK21zZ3N0ciAiRTQ5Mjog5LiN5piv57eo6Lyv5Zmo55qE5ZG95LukIgorCisjOiBleF9kb2NtZC5jOjE3MjUKK21zZ2lkICJFNDc4OiBEb24ndCBwYW5pYyEiCittc2dzdHIgIkU0Nzg6IOS4jeimgempmuaFjCEiCisKKyM6IGV4X2RvY21kLmM6MTc0NAorbXNnaWQgIkU0OTM6IEJhY2t3YXJkcyByYW5nZSBnaXZlbiIKK21zZ3N0ciAiRTQ5Mzog5oyH5a6a5LqG5ZCR5YmN5Y+D6ICD55qE56+E5ZyNIgorCisjOiBleF9kb2NtZC5jOjE3NTMKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIuaMh+WumuS6huWQkeWJjeWPg+iAg+eahOevhOWcje+8jE9LIHRvIHN3YXAiCisKKyM6IGV4X2RvY21kLmM6MTg2NAorbXNnaWQgIkU0OTQ6IFVzZSB3IG9yIHc+PiIKK21zZ3N0ciAiRTQ5NDog6KuL5L2/55SoIHcg5oiWIHc+PiIKKworIzogZXhfZG9jbWQuYzozNDQ2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiDmirHmrYksIOacrOWRveS7pOWcqOatpOeJiOacrOS4reaykuacieWvpuS9nCIKKworIzogZXhfZG9jbWQuYzozNjI0Cittc2dpZCAiRTE3MjogT25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWQiCittc2dzdHIgIkUxNzI6IOWPquiDveacieS4gOWAi+aqlCIKKworIzogZXhfZG9jbWQuYzo0MTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG1vcmUgZmlsZXMgdG8gZWRpdC4gIFF1aXQgYW55d2F5PyIKK21zZ3N0ciAi6YKE5pyJICVkIOWAi+aqlOahiOacque3qOi8ry4g56K65a6a6KaB6Zui6ZaL77yfIgorCisjOiBleF9kb2NtZC5jOjQxOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE3MzogJWxkIG1vcmUgZmlsZXMgdG8gZWRpdCIKK21zZ3N0ciAiRTE3Mzog6YKE5pyJICVsZCDlgIvmqpTmoYjmnKrnt6jovK8iCisKKyM6IGV4X2RvY21kLmM6NDI5MgorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxNzQ6IOWRveS7pOW3sue2k+WtmOWcqCwg6KuL5L2/55SoICEg5by35Yi26YeN5paw5a6a576pIgorCisjOiBleF9kb2NtZC5jOjQzOTcKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAg5ZCN56ixICAgICAgICDlj4Pmlbgg56+E5ZyNICDlrozmlbQgICAgICDlrprnvqkgICAgICAiCisKKyM6IGV4X2RvY21kLmM6NDQ4NgorbXNnaWQgIk5vIHVzZXItZGVmaW5lZCBjb21tYW5kcyBmb3VuZCIKK21zZ3N0ciAi5om+5LiN5Yiw5L2/55So6ICF5a6a576p55qE5ZG95LukIgorCisjOiBleF9kb2NtZC5jOjQ1MTcKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiDmspLmnInmjIflrprnmoTlsazmgKciCisKKyM6IGV4X2RvY21kLmM6NDU2OQorbXNnaWQgIkUxNzY6IEludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTE3Njog5LiN5q2j56K655qE5Y+D5pW45pW455uuIgorCisjOiBleF9kb2NtZC5jOjQ1ODQKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiDkuI3og73mjIflrprlhanmrKHmlbjnm64iCisKKyM6IGV4X2RvY21kLmM6NDU5NAorbXNnaWQgIkUxNzg6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgY291bnQiCittc2dzdHIgIkUxNzg6IOaVuOebrueahOmgkOioreWPg+aVuOS4jeato+eiuiIKKworIzogZXhfZG9jbWQuYzo0NjIyCittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiDmjIfku6TpnIDopoHlj4PmlbjmiY3og73lrozmiJAiCisKKyM6IGV4X2RvY21kLmM6NDY0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDog5LiN5a6M5pW055qE5YC8OiAnJXMnIgorCisjOiBleF9kb2NtZC5jOjQ2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiDkuI3mraPnorrnmoTlsazmgKc6ICVzIgorCisjOiBleF9kb2NtZC5jOjQ2OTAKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4Mjog5oyH5Luk5ZCN56ix5LiN5q2j56K6IgorCisjOiBleF9kb2NtZC5jOjQ3MDUKK21zZ2lkICJFMTgzOiBVc2VyIGRlZmluZWQgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIiCittc2dzdHIgIkUxODM6IOS9v+eUqOiAheiHquWumuaMh+S7pOW/hemgiOS7peWkp+Wvq+Wtl+avjemWi+WniyIKKworIzogZXhfZG9jbWQuYzo0Nzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODQ6IE5vIHN1Y2ggdXNlci1kZWZpbmVkIGNvbW1hbmQ6ICVzIgorbXNnc3RyICJFMTg0OiDmspLmnInkvb/nlKjogIXoh6rlrprnmoTlkb3ku6TvvJogJXMiCisKKyM6IGV4X2RvY21kLmM6NTIzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCittc2dzdHIgIkUxODU6IOaJvuS4jeWIsOmhj+iJsuaoo+W8jyAlcyIKKworIzogZXhfZG9jbWQuYzo1MjM4Cittc2dpZCAiR3JlZXRpbmdzLCBWaW0gdXNlciEiCittc2dzdHIgIuWXqCwgVmltIOS9v+eUqOiAhe+8gSIKKworIzogZXhfZG9jbWQuYzo1OTQ2Cittc2dpZCAiRWRpdCBGaWxlIGluIG5ldyB3aW5kb3ciCittc2dzdHIgIuWcqOaWsOimlueql+e3qOi8r+aqlOahiCIKKworIzogZXhfZG9jbWQuYzo2MjE5Cittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICLnhKHmmqvlrZjmqpQiCisKKyM6IGV4X2RvY21kLmM6NjMyMworbXNnaWQgIkFwcGVuZCBGaWxlIgorbXNnc3RyICLpmYTliqDmqpTmoYgiCisKKyM6IGV4X2RvY21kLmM6NjM4NworbXNnaWQgIkUxODY6IE5vIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE4Njog5rKS5pyJ5YmN5LiA5YCL55uu6YyEIgorCisjOiBleF9kb2NtZC5jOjY0NjkKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiDnhKHms5XovqborZjnmoTmqJnoqJgiCisKKyM6IGV4X2RvY21kLmM6NjU1NAorbXNnaWQgIkU0NjU6IDp3aW5zaXplIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY1OiA6d2luc2l6ZSDpnIDopoHlhanlgIvlj4PmlbgiCisKKyM6IGV4X2RvY21kLmM6NjYwNQorIywgYy1mb3JtYXQKK21zZ2lkICJXaW5kb3cgcG9zaXRpb246IFggJWQsIFkgJWQiCittc2dzdHIgIuimlueql+S9jee9rjogWCAlZCwgWSAlZCIKKworIzogZXhfZG9jbWQuYzo2NjEwCittc2dpZCAiRTE4ODogT2J0YWluaW5nIHdpbmRvdyBwb3NpdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0iCittc2dzdHIgIkUxODg6IOWcqOaCqOeahOW5s+WPsOS4iueEoeazleeNsuW+l+imlueql+S9jee9riIKKworIzogZXhfZG9jbWQuYzo2NjIwCittc2dpZCAiRTQ2NjogOndpbnBvcyByZXF1aXJlcyB0d28gbnVtYmVyIGFyZ3VtZW50cyIKK21zZ3N0ciAiRTQ2NjogOndpbnBvcyDpnIDopoHlhanlgIvlj4PmlbgiCisKKyM6IGV4X2RvY21kLmM6Njg5OQorbXNnaWQgIlNhdmUgUmVkaXJlY3Rpb24iCittc2dzdHIgIuWEsuWtmCBSZWRpcmVjdGlvbiIKKworIzogZXhfZG9jbWQuYzo3MDQ2Cittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICLlhLLlrZggVmlldyIKKworIzogZXhfZG9jbWQuYzo3MDQ3Cittc2dpZCAiU2F2ZSBTZXNzaW9uIgorbXNnc3RyICLlhLLlrZggU2Vzc2lvbiIKKworIzogZXhfZG9jbWQuYzo3MDQ5Cittc2dpZCAiU2F2ZSBTZXR1cCIKK21zZ3N0ciAi5YSy5a2Y6Kit5a6aIgorCisjOiBleF9kb2NtZC5jOjcyMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4OTogXCIlc1wiIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTg5OiBcIiVzXCIg5bey5a2Y5ZyoICjoq4vnlKggISDlvLfliLbln7fooYwpIgorCisjOiBleF9kb2NtZC5jOjcyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE5MDogQ2Fubm90IG9wZW4gXCIlc1wiIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTkwOiDnhKHms5Xku6Xlr6vlhaXmqKHlvI/plovllZ8gXCIlc1wiIgorCisjLiBzZXQgbWFyaworIzogZXhfZG9jbWQuYzo3MjI5Cittc2dpZCAiRTE5MTogQXJndW1lbnQgbXVzdCBiZSBhIGxldHRlciBvciBmb3J3YXJkL2JhY2t3YXJkIHF1b3RlIgorbXNnc3RyICJFMTkxOiDlj4Pmlbjlv4XpoIjmmK/oi7HmloflrZfmr43miJblkJHliY0v5b6M55qE5byV6JmfIgorCisjOiBleF9kb2NtZC5jOjcyNzEKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IDpub3JtYWwg6YGe6L+05bGk5pW46YGO5rexIgorCisjOiBleF9kb2NtZC5jOjc3NzIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDog5rKS5pyJICcjJyDlj6/mm7/ku6PnmoTmqpTlkI0iCisKKyM6IGV4X2RvY21kLmM6NzgwMworbXNnaWQgIkU0OTU6IG5vIGF1dG9jb21tYW5kIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhZmlsZT5cIiIKK21zZ3N0ciAiRTQ5NTog5rKS5pyJIEF1dG9jb21tYW5kIOaqlOWQjeS7peWPluS7oyBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3ODExCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiDmspLmnIkgQXV0b2NvbW1hbmQg57ep6KGd5Y2A5ZCN56ix5Lul5Y+W5LujIFwiPGFidWY+XCIiCisKKyM6IGV4X2RvY21kLmM6NzgyMgorbXNnaWQgIkU0OTc6IG5vIGF1dG9jb21tYW5kIG1hdGNoIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YW1hdGNoPlwiIgorbXNnc3RyICJFNDk3OiDmspLmnIkgQXV0b2NvbW1hbmQg56ym5ZCI5ZCN56ix5Lul5Y+W5LujIFwiPGFtYXRjaD5cIiIKKworIzogZXhfZG9jbWQuYzo3ODMyCittc2dpZCAiRTQ5ODogbm8gOnNvdXJjZSBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8c2ZpbGU+XCIiCittc2dzdHIgIkU0OTg6IOaykuaciSA6c291cmNlIOaqlOWQjeS7peWPluS7oyBcIjxzZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3ODczCisjLCBuby1jLWZvcm1hdAorbXNnaWQgIkU0OTk6IEVtcHR5IGZpbGUgbmFtZSBmb3IgJyUnIG9yICcjJywgb25seSB3b3JrcyB3aXRoIFwiOnA6aFwiIgorbXNnc3RyICJFNDk5OiAnJScg5oiWICcjJyDmjIflkJHnqbrmqpTlkI3vvIzlj6rog73nlKjmlrwgXCI6cDpoXCIiCisKKyM6IGV4X2RvY21kLmM6Nzg3NQorbXNnaWQgIkU1MDA6IEV2YWx1YXRlcyB0byBhbiBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1MDA6IOi8uOWFpeeCuuepuuWtl+S4siIKKworIzogZXhfZG9jbWQuYzo4ODAyCittc2dpZCAiRTE5NTogQ2Fubm90IG9wZW4gdmltaW5mbyBmaWxlIGZvciByZWFkaW5nIgorbXNnc3RyICJFMTk1OiDnhKHms5XoroDlj5YgdmltaW5mbyIKKworIzogZXhfZG9jbWQuYzo4OTc1Cittc2dpZCAiRTE5NjogTm8gZGlncmFwaHMgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMTk2OiDmnKzniYjmnKznhKHopIflkIjlrZflhYMoZGlncmFwaCkiCisKKyM6IGV4X2V2YWwuYzo0MDcKK21zZ2lkICJFNjA4OiBDYW5ub3QgOnRocm93IGV4Y2VwdGlvbnMgd2l0aCAnVmltJyBwcmVmaXgiCittc2dzdHIgIkU2MDg6IOS4jeiDvSA6dGhyb3cg55SoICdWaW0nIOmWi+mgreeahOS+i+WkliIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICLkuJ/lh7rkvovlpJbvvJogJXMiCisKKyM6IGV4X2V2YWwuYzo1MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGZpbmlzaGVkOiAlcyIKK21zZ3N0ciAi5L6L5aSW57WQ5p2f77yaICVzIgorCisjOiBleF9ldmFsLmM6NTMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBkaXNjYXJkZWQ6ICVzIgorbXNnc3RyICLlt7LkuJ/mo4TkvovlpJbvvJogJXMiCisKKyM6IGV4X2V2YWwuYzo1ODIgZXhfZXZhbC5jOjYyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlcywgbGluZSAlbGQiCittc2dzdHIgIiVzLCDooYwgJWxkIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV4X2V2YWwuYzo1OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGNhdWdodDogJXMiCittc2dzdHIgIueZvOeUn+S+i+Wklu+8miVzIgorCisjOiBleF9ldmFsLmM6NjY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG1hZGUgcGVuZGluZyIKK21zZ3N0ciAiJXMg6YCg5oiQIHBlbmRpbmciCisKKyM6IGV4X2V2YWwuYzo2NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmVzdW1lZCIKK21zZ3N0ciAiJXMg5bey5Zue5b6pIgorCisjOiBleF9ldmFsLmM6Njc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMg5bey5Lif5qOEIgorCisjOiBleF9ldmFsLmM6NzAwCittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICLkvovlpJYiCisKKyM6IGV4X2V2YWwuYzo3MDYKK21zZ2lkICJFcnJvciBhbmQgaW50ZXJydXB0IgorbXNnc3RyICLpjK/oqqToiIfkuK3mlrciCisKKyM6IGV4X2V2YWwuYzo3MDggZ3VpLmM6NDIzNworbXNnaWQgIkVycm9yIgorbXNnc3RyICLpjK/oqqQiCisKKyMuIGlmIChwZW5kaW5nICYgQ1NUUF9JTlRFUlJVUFQpCisjOiBleF9ldmFsLmM6NzEwCittc2dpZCAiSW50ZXJydXB0IgorbXNnc3RyICLkuK3mlrciCisKKyM6IGV4X2V2YWwuYzo3NzkKK21zZ2lkICJFNTc5OiA6aWYgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU3OTogOmlmIOWxpOaVuOmBjua3sSIKKworIzogZXhfZXZhbC5jOjgxNgorbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmVuZGlmIOe8uuWwkeWwjeaHieeahCA6aWYiCisKKyM6IGV4X2V2YWwuYzo4NjAKK21zZ2lkICJFNTgxOiA6ZWxzZSB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MTogOmVsc2Ug57y65bCR5bCN5oeJ55qEIDppZiIKKworIzogZXhfZXZhbC5jOjg2MworbXNnaWQgIkU1ODI6IDplbHNlaWYgd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODI6IDplbHNlaWYg57y65bCR5bCN5oeJ55qEIDppZiIKKworIzogZXhfZXZhbC5jOjg3MAorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiDlpJrph40gOmVsc2UiCisKKyM6IGV4X2V2YWwuYzo4NzMKK21zZ2lkICJFNTg0OiA6ZWxzZWlmIGFmdGVyIDplbHNlIgorbXNnc3RyICJFNTg0OiA6ZWxzZWlmIOWcqCA6ZWxzZSDkuYvlvowiCisKKyM6IGV4X2V2YWwuYzo5NDAKK21zZ2lkICJFNTg1OiA6d2hpbGUgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTU4NTogOndoaWxlIOWxpOaVuOmBjua3sSIKKworIzogZXhfZXZhbC5jOjk5NgorbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOmNvbnRpbnVlIOe8uuWwkeWwjeaHieeahCA6d2hpbGUiCisKKyM6IGV4X2V2YWwuYzoxMDM2Cittc2dpZCAiRTU4NzogOmJyZWFrIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg3OiA6YnJlYWsg57y65bCR5bCN5oeJ55qEIDp3aGlsZSIKKworIzogZXhfZXZhbC5jOjEyMzUKK21zZ2lkICJFNjAxOiA6dHJ5IG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU2MDE6IDppZiDlsaTmlbjpgY7mt7EiCisKKyM6IGV4X2V2YWwuYzoxMjc4Cittc2dpZCAiRTYwMzogOmNhdGNoIHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMzogOmNhdGNoIOaykuaciSA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhICI6Y2F0Y2giIGFmdGVyICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyMuICogSnVzdCBwYXJzZS4KKyM6IGV4X2V2YWwuYzoxMzAwCittc2dpZCAiRTYwNDogOmNhdGNoIGFmdGVyIDpmaW5hbGx5IgorbXNnc3RyICJFNjA0OiA6Y2F0Y2gg5ZyoIDpmaW5hbGx5IOS5i+W+jCIKKworIzogZXhfZXZhbC5jOjE0MTgKK21zZ2lkICJFNjA2OiA6ZmluYWxseSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDY6IDpmaW5hbGx5IOaykuaciSA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNDQyCittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IOWkmumHjSA6ZmluYWxseSIKKworIzogZXhfZXZhbC5jOjE1NTEKK21zZ2lkICJFNjAyOiA6ZW5kdHJ5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwMjogOmVuZGlmIOe8uuWwkeWwjeaHieeahCA6aWYiCisKKyM6IGV4X2V2YWwuYzoxODU3Cittc2dpZCAiRTE5MzogOmVuZGZ1bmN0aW9uIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTE5MzogOmVuZGZ1bmN0aW9uIOW/hemgiOWcqOWHveW8j+WFp+mDqOS9v+eUqCIKKworIzogZXhfZ2V0bG4uYzoyOTY3Cittc2dpZCAidGFnbmFtZSIKK21zZ3N0ciAi5qiZ57Gk5ZCN56ixIgorCisjOiBleF9nZXRsbi5jOjI5NzAKK21zZ2lkICIga2luZCBmaWxlXG4iCittc2dzdHIgIumhnuaqlOahiFxuIgorCisjOiBleF9nZXRsbi5jOjQxNzYKK21zZ2lkICInaGlzdG9yeScgb3B0aW9uIGlzIHplcm8iCittc2dzdHIgIumBuOmghSAnaGlzdG9yeScg5piv6Zu2IgorCisjOiBleF9nZXRsbi5jOjQ0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIOatt+WPsuiomOmMhCAo5paw5Yiw6IiKKTpcbiIKKworIzogZXhfZ2V0bG4uYzo0NDE3Cittc2dpZCAiQ29tbWFuZCBMaW5lIgorbXNnc3RyICLlkb3ku6TliJciCisKKyM6IGV4X2dldGxuLmM6NDQxOAorbXNnaWQgIlNlYXJjaCBTdHJpbmciCittc2dzdHIgIuaQnOWwi+Wtl+S4siIKKworIzogZXhfZ2V0bG4uYzo0NDE5Cittc2dpZCAiRXhwcmVzc2lvbiIKK21zZ3N0ciAi6YGL566X5byPIgorCisjOiBleF9nZXRsbi5jOjQ0MjAKK21zZ2lkICJJbnB1dCBMaW5lIgorbXNnc3RyICLovLjlhaXooYwiCisKKyM6IGV4X2dldGxuLmM6NDQ1MAorbXNnaWQgIkUxOTg6IGNtZF9wY2hhciBiZXlvbmQgdGhlIGNvbW1hbmQgbGVuZ3RoIgorbXNnc3RyICJFMTk4OiBjbWRfcGNoYXIg6LaF6YGO5ZG95Luk6ZW35bqmIgorCisjOiBleF9nZXRsbi5jOjQ2MjQKK21zZ2lkICJFMTk5OiBBY3RpdmUgd2luZG93IG9yIGJ1ZmZlciBkZWxldGVkIgorbXNnc3RyICJFMTk5OiDlt7LliKrpmaTmjonkvZznlKjkuK3nmoToppbnqpfmiJbmmqvlrZjljYAiCisKKyM6IGZpbGVpby5jOjM3MworbXNnaWQgIklsbGVnYWwgZmlsZSBuYW1lIgorbXNnc3RyICLkuI3mraPnorrnmoTmqpTlkI0iCisKKyM6IGZpbGVpby5jOjM5NyBmaWxlaW8uYzo1MjIgZmlsZWlvLmM6MjY4NiBmaWxlaW8uYzoyNzI3Cittc2dpZCAiaXMgYSBkaXJlY3RvcnkiCittc2dzdHIgIuaYr+ebrumMhCIKKworIzogZmlsZWlvLmM6Mzk5Cittc2dpZCAiaXMgbm90IGEgZmlsZSIKK21zZ3N0ciAi5LiN5piv5qqU5qGIIgorCisjOiBmaWxlaW8uYzo1NDQgZmlsZWlvLmM6MzgzMworbXNnaWQgIltOZXcgRmlsZV0iCittc2dzdHIgIlvmnKrlkb3lkI1dIgorCisjOiBmaWxlaW8uYzo1NjYKK21zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgorbXNnc3RyICJb5qyK6ZmQ5LiN6LazXSIKKworIzogZmlsZWlvLmM6NjcwCittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgQXV0b2NvbW1hbmQg5L2/56iL5byP54Sh5rOV6K6A5Y+W5q2k5qqUIgorCisjOiBmaWxlaW8uYzo2NzIKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqRmlsdGVyKiBBdXRvY29tbWFuZCDkuI3lj6/ku6Xmm7TmlLnnt6nooZ3ljYDnmoTlhaflrrkiCisKKyM6IGZpbGVpby5jOjY5MworbXNnaWQgIlZpbTogUmVhZGluZyBmcm9tIHN0ZGluLi4uXG4iCittc2dzdHIgIlZpbTog5b6e5qiZ5rqW6Ly45YWl6K6A5Y+WLi4uXG4iCisKKyM6IGZpbGVpby5jOjY5OQorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAi5b6e5qiZ5rqW6Ly45YWl6K6A5Y+WLi4uIgorCisjLiBSZS1vcGVuaW5nIHRoZSBvcmlnaW5hbCBmaWxlIGZhaWxlZCEKKyM6IGZpbGVpby5jOjk0NAorbXNnaWQgIkUyMDI6IENvbnZlcnNpb24gbWFkZSBmaWxlIHVucmVhZGFibGUhIgorbXNnc3RyICJFMjAyOiDovYnmj5vpjK/oqqQiCisKKyM6IGZpbGVpby5jOjE4OTIKK21zZ2lkICJbZmlmby9zb2NrZXRdIgorbXNnc3RyICJbZmlmby9zb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxODk5Cittc2dpZCAiW2ZpZm9dIgorbXNnc3RyICJbZmlmb10iCisKKyM6IGZpbGVpby5jOjE5MDYKK21zZ2lkICJbc29ja2V0XSIKK21zZ3N0ciAiW3NvY2tldF0iCisKKyM6IGZpbGVpby5jOjE5MTQKK21zZ2lkICJbUk9dIgorbXNnc3RyICJb5ZSv6K6AXSIKKworIzogZmlsZWlvLmM6MTkyNAorbXNnaWQgIltDUiBtaXNzaW5nXSIKK21zZ3N0ciAiW+e8uuWwkUNSXSciCisKKyM6IGZpbGVpby5jOjE5MjkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJb5om+5YiwTkxdIgorCisjOiBmaWxlaW8uYzoxOTM0Cittc2dpZCAiW2xvbmcgbGluZXMgc3BsaXRdIgorbXNnc3RyICJb5YiG5Ymy6YGO6ZW36KGMXSIKKworIzogZmlsZWlvLmM6MTk0MCBmaWxlaW8uYzozODE3Cittc2dpZCAiW05PVCBjb252ZXJ0ZWRdIgorbXNnc3RyICJb5pyq6L2J5o+bXSIKKworIzogZmlsZWlvLmM6MTk0NSBmaWxlaW8uYzozODIyCittc2dpZCAiW2NvbnZlcnRlZF0iCittc2dzdHIgIlvlt7LovYnmj5tdIgorCisjOiBmaWxlaW8uYzoxOTUyIGZpbGVpby5jOjM4NDcKK21zZ2lkICJbY3J5cHRlZF0iCittc2dzdHIgIlvlt7LliqDlr4ZdIgorCisjOiBmaWxlaW8uYzoxOTU5Cittc2dpZCAiW0NPTlZFUlNJT04gRVJST1JdIgorbXNnc3RyICLovYnmj5vpjK/oqqQiCisKKyM6IGZpbGVpby5jOjE5NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCittc2dzdHIgIlvooYwgJWxkIOacieS4jeato+eiuueahOS9jeWFg10iCisKKyM6IGZpbGVpby5jOjE5NzIKK21zZ2lkICJbUkVBRCBFUlJPUlNdIgorbXNnc3RyICJb6K6A5Y+W6Yyv6KqkXSIKKworIzogZmlsZWlvLmM6MjE4OAorbXNnaWQgIkNhbid0IGZpbmQgdGVtcCBmaWxlIGZvciBjb252ZXJzaW9uIgorbXNnc3RyICLmib7kuI3liLDovYnmj5vnlKjnmoTmmqvlrZjmqpQiCisKKyM6IGZpbGVpby5jOjIxOTUKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIuWtl+WFg+mbhui9ieaPm+mMr+iqpCIKKworIzogZmlsZWlvLmM6MjE5OAorbXNnaWQgImNhbid0IHJlYWQgb3V0cHV0IG9mICdjaGFyY29udmVydCciCittc2dzdHIgIueEoeazleiugOWPliAnY2hhcmNvbnZlcnQnIOeahOi8uOWHuiIKKworIzogZmlsZWlvLmM6MjYwMQorbXNnaWQgIkUyMDM6IEF1dG9jb21tYW5kcyBkZWxldGVkIG9yIHVubG9hZGVkIGJ1ZmZlciB0byBiZSB3cml0dGVuIgorbXNnc3RyICJFMjAzOiBBdXRvY29tbWFuZCDliKrpmaTmiJbph4vmlL7kuobopoHlr6vlhaXnmoTnt6nooZ3ljYAiCisKKyM6IGZpbGVpby5jOjI2MjQKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2NvbW1hbmQg5oSP5aSW5Zyw5pS56K6K5LqG6KGM6JmfIgorCisjOiBmaWxlaW8uYzoyNjkyIGZpbGVpby5jOjI3MTAKK21zZ2lkICJpcyBub3QgYSBmaWxlIG9yIHdyaXRhYmxlIGRldmljZSIKK21zZ3N0ciAi5LiN5piv5qqU5qGI5oiW5Y+v5a+r5YWl55qE6KOd572uIgorCisjOiBmaWxlaW8uYzoyNzYyCittc2dpZCAiaXMgcmVhZC1vbmx5IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIuaYr+WUr+iugOaqlCAo6KuL5L2/55SoICEg5by35Yi25Z+36KGMKSIKKworIzogZmlsZWlvLmM6MzA2NQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6IOeEoeazleWvq+WFpeWCmeS7veaqlCAo6KuL5L2/55SoICEg5by35Yi25Z+36KGMKSIKKworIzogZmlsZWlvLmM6MzA3NworbXNnaWQgIkU1MDc6IENsb3NlIGVycm9yIGZvciBiYWNrdXAgZmlsZSAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA3OiDnhKHms5Xpl5zplonlgpnku73mqpQgKOiri+S9v+eUqCAhIOW8t+WItuWft+ihjCkiCisKKyM6IGZpbGVpby5jOjMwNzkKK21zZ2lkICJFNTA4OiBDYW4ndCByZWFkIGZpbGUgZm9yIGJhY2t1cCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNTA4OiDnhKHms5XoroDlj5bmqpTmoYjku6Xkvpvlgpnku70gKOiri+S9v+eUqCAhIOW8t+WItuWft+ihjCkiCisKKyM6IGZpbGVpby5jOjMwOTUKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6IOeEoeazleW7uueri+WCmeS7veaqlCAo6KuL5L2/55SoICEg5by35Yi25Z+36KGMKSIKKworIzogZmlsZWlvLmM6MzE5OAorbXNnaWQgIkU1MTA6IENhbid0IG1ha2UgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUxMDog54Sh5rOV6KO95L2c5YKZ5Lu95qqUICjoq4vkvb/nlKggISDlvLfliLbln7fooYwpIgorCisjOiBmaWxlaW8uYzozMjYwCittc2dpZCAiRTQ2MDogVGhlIHJlc291cmNlIGZvcmsgd291bGQgYmUgbG9zdCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDYwOiBSZXNvdXJjZSBmb3JrIOacg+a2iOWksSAo6KuL5L2/55SoICEg5by35Yi25Z+36KGMKSIKKworIzogZmlsZWlvLmM6MzM2MQorbXNnaWQgIkUyMTQ6IENhbid0IGZpbmQgdGVtcCBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjE0OiDmib7kuI3liLDlr6vlhaXnlKjnmoTmmqvlrZjmqpQiCisKKyM6IGZpbGVpby5jOjMzNzkKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzog54Sh5rOV6L2J5o+bICjoq4vkvb/nlKggISDlvLfliLbkuI3ovYnmj5vlr6vlhaUpIgorCisjOiBmaWxlaW8uYzozNDE0Cittc2dpZCAiRTE2NjogQ2FuJ3Qgb3BlbiBsaW5rZWQgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE2Njog54Sh5rOV5Lul5a+r5YWl5qih5byP6ZaL5ZWf6YCj57WQ5qqU5qGIIgorCisjOiBmaWxlaW8uYzozNDE4Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiDnhKHms5Xku6Xlr6vlhaXmqKHlvI/plovllZ8iCisKKyM6IGZpbGVpby5jOjM2NjgKK21zZ2lkICJFNTEyOiBDbG9zZSBmYWlsZWQiCittc2dzdHIgIkU1MTI6IOmXnOmWieWkseaVlyIKKworIzogZmlsZWlvLmM6MzczOQorbXNnaWQgIkU1MTM6IHdyaXRlIGVycm9yLCBjb252ZXJzaW9uIGZhaWxlZCIKK21zZ3N0ciAiRTUxMzog54Sh5rOV5a+r5YWlIC0tIOi9ieaPm+WkseaVlyIKKworIzogZmlsZWlvLmM6Mzc0NQorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6IOWvq+WFpemMr+iqpCAo5qqU5qGI57O757Wx5bey5ru/77yfKSIKKworIzogZmlsZWlvLmM6MzgxMgorbXNnaWQgIiBDT05WRVJTSU9OIEVSUk9SIgorbXNnc3RyICLovYnmj5vpjK/oqqQiCisKKyM6IGZpbGVpby5jOjM4MjgKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW+ijnee9rl0iCisKKyM6IGZpbGVpby5jOjM4MzMKK21zZ2lkICJbTmV3XSIKK21zZ3N0ciAiW+aWsF0iCisKKyM6IGZpbGVpby5jOjM4NTUKK21zZ2lkICIgW2FdIgorbXNnc3RyICJbYV0iCisKKyM6IGZpbGVpby5jOjM4NTUKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiDlt7LpmYTliqAiCisKKyM6IGZpbGVpby5jOjM4NTcKK21zZ2lkICIgW3ddIgorbXNnc3RyICJbd10iCisKKyM6IGZpbGVpby5jOjM4NTcKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIOW3suWvq+WFpSIKKworIzogZmlsZWlvLmM6MzkxMAorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBQYXRjaCDmqKHlvI86IOeEoeazleWEsuWtmOWOn+Wni+aqlOahiCIKKworIzogZmlsZWlvLmM6MzkzMgorbXNnaWQgIkUyMDY6IHBhdGNobW9kZTogY2FuJ3QgdG91Y2ggZW1wdHkgb3JpZ2luYWwgZmlsZSIKK21zZ3N0ciAiRTIwNjogUGF0Y2gg5qih5byPOiDnhKHms5Xorormm7TnqbrnmoTljp/lp4vmqpTmoYgiCisKKyM6IGZpbGVpby5jOjM5NDcKK21zZ2lkICJFMjA3OiBDYW4ndCBkZWxldGUgYmFja3VwIGZpbGUiCittc2dzdHIgIkUyMDc6IOeEoeazleWIqumZpOWCmeS7veaqlCIKKworIzogZmlsZWlvLmM6NDAwOAorbXNnaWQgIiIKKyJcbiIKKyJXQVJOSU5HOiBPcmlnaW5hbCBmaWxlIG1heSBiZSBsb3N0IG9yIGRhbWFnZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIuitpuWRijog5Y6f5aeL5qqU5qGI5rWB5aSx5oiW5pCN5aOeXG4iCisKKyM6IGZpbGVpby5jOjQwMTAKK21zZ2lkICJkb24ndCBxdWl0IHRoZSBlZGl0b3IgdW50aWwgdGhlIGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgorbXNnc3RyICLlnKjmqpTmoYjmraPnorrlr6vlhaXliY3oq4vli7/pm6Lplovnt6jovK/lmaghIgorCisjOiBmaWxlaW8uYzo0MDk5Cittc2dpZCAiW2Rvc10iCittc2dzdHIgIltkb3NdIgorCisjOiBmaWxlaW8uYzo0MDk5Cittc2dpZCAiW2RvcyBmb3JtYXRdIgorbXNnc3RyICJbZG9zIOagvOW8j10iCisKKyM6IGZpbGVpby5jOjQxMDYKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW21hY10iCisKKyM6IGZpbGVpby5jOjQxMDYKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIlttYWMg5qC85byPXSIKKworIzogZmlsZWlvLmM6NDExMworbXNnaWQgIlt1bml4XSIKK21zZ3N0ciAiW3VuaXhdIgorCisjOiBmaWxlaW8uYzo0MTEzCittc2dpZCAiW3VuaXggZm9ybWF0XSIKK21zZ3N0ciAiW3VuaXgg5qC85byPXSIKKworIzogZmlsZWlvLmM6NDE0MAorbXNnaWQgIjEgbGluZSwgIgorbXNnc3RyICIxIOihjCwgIgorCisjOiBmaWxlaW8uYzo0MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcywgIgorbXNnc3RyICIlbGQg6KGMLCAiCisKKyM6IGZpbGVpby5jOjQxNDUKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAi5LiA5YCL5a2X5YWDIgorCisjOiBmaWxlaW8uYzo0MTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBjaGFyYWN0ZXJzIgorbXNnc3RyICIlbGTlgIvlrZflhYMiCisKKyM6IGZpbGVpby5jOjQxNTcKK21zZ2lkICJbbm9lb2xdIgorbXNnc3RyICJbbm9lb2xdIgorCisjOiBmaWxlaW8uYzo0MTU3Cittc2dpZCAiW0luY29tcGxldGUgbGFzdCBsaW5lXSIKK21zZ3N0ciAiW+e1kOWwvuihjOS4jeWujOaVtF0iCisKKyMuIGRvbid0IG92ZXJ3cml0ZSBtZXNzYWdlcyBoZXJlCisjLiBtdXN0IGdpdmUgdGhpcyBwcm9tcHQKKyMuIGRvbid0IHVzZSBlbXNnKCkgaGVyZSwgZG9uJ3Qgd2FudCB0byBmbHVzaCB0aGUgYnVmZmVycworIzogZmlsZWlvLmM6NDE3NgorbXNnaWQgIldBUk5JTkc6IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgcmVhZGluZyBpdCEhISIKK21zZ3N0ciAi6K2m5ZGKOiDmnKzmqpTmoYjoh6rkuIrmrKHoroDlhaXlvozlt7Lororli5UhISEiCisKKyM6IGZpbGVpby5jOjQxNzgKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIueiuuWumuimgeWvq+WFpeWXjiIKKworIzogZmlsZWlvLmM6NTIxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODog5a+r5YWl5qqU5qGIIFwiJXNcIiDpjK/oqqQiCisKKyM6IGZpbGVpby5jOjUyMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IOmXnOmWieaqlOahiCBcIiVzXCIg6Yyv6KqkIgorCisjOiBmaWxlaW8uYzo1MjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiDoroDlj5bmqpTmoYggXCIlc1wiIOmMr+iqpCIKKworIzogZmlsZWlvLmM6NTQ0OAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQg5Yiq6Zmk57ep6KGd5Y2AIgorCisjOiBmaWxlaW8uYzo1NDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIG5vIGxvbmdlciBhdmFpbGFibGUiCittc2dzdHIgIkUyMTE6IOitpuWRijog5qqU5qGIIFwiJXNcIiDlt7LntpPkuI3lrZjlnKgiCisKKyM6IGZpbGVpby5jOjU0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlcxMjogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgYW5kIHRoZSBidWZmZXIgd2FzIGNoYW5nZWQgaW4gVmltIGFzICIKKyJ3ZWxsIgorbXNnc3RyICJXMTI6IOitpuWRijog5qqU5qGIIFwiJXNcIiDoh6rkuIrmrKHoroDlhaXlvozlt7Lororli5UsIOiAjOS4lOe3qOi8r+S4reeahOe3qeihneWNgOS5n+abtOWLleS6hiIKKworIzogZmlsZWlvLmM6NTQ3MgorIywgYy1mb3JtYXQKK21zZ2lkICJXMTE6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIHNpbmNlIGVkaXRpbmcgc3RhcnRlZCIKK21zZ3N0ciAiVzExOiDorablkYo6IOaqlOahiCBcIiVzXCIg6Ieq5LiK5qyh6K6A5YWl5b6M5bey6K6K5YuVIgorCisjOiBmaWxlaW8uYzo1NDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxNjogV2FybmluZzogTW9kZSBvZiBmaWxlIFwiJXNcIiBoYXMgY2hhbmdlZCBzaW5jZSBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxNjog6K2m5ZGKOiDmqpTmoYggXCIlc1wiIOeahOasiumZkOiIh+S4iuasoeiugOWFpeaZguS4jeS4gOaooyAo5pyJ6K6K5YuV6YGOKSIKKworIyAnbW9kZScgc2VlbXMgYmV0dGVyIGFzIHRyYW5zbGF0ZWQgdG8gJ3Blcm1pc3Npb24nPworIzogZmlsZWlvLmM6NTQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTM6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTM6IOitpuWRijog5qqU5qGIIFwiJXNcIiDlnKjplovlp4vnt6jovK/lvozlj4jooqvlu7rnq4vkuoYiCisKKyM6IGZpbGVpby5jOjU1MDEKK21zZ2lkICJXYXJuaW5nIgorbXNnc3RyICLorablkYoiCisKKyM6IGZpbGVpby5jOjU1MDIKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIueiuuWumigmTylcbiIKKyLovInlhaXmqpTmoYgoJkwpIgorCisjOiBmaWxlaW8uYzo1NjAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjI6IENvdWxkIG5vdCBwcmVwYXJlIGZvciByZWxvYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFNDYyOiDnhKHms5Xmupblgpnph43mlrDovInlhaUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo1NjE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjE6IENvdWxkIG5vdCByZWxvYWQgXCIlc1wiIgorbXNnc3RyICJFMzIxOiDnhKHms5Xph43mlrDovInlhaUgXCIlc1wiIgorCisjOiBmaWxlaW8uYzo2MjAxCittc2dpZCAiLS1EZWxldGVkLS0iCittc2dzdHIgIi0t5bey5Yiq6ZmkLS0iCisKKyMuIHRoZSBncm91cCBkb2Vzbid0IGV4aXN0CisjOiBmaWxlaW8uYzo2MzYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjc6IE5vIHN1Y2ggZ3JvdXA6IFwiJXNcIiIKK21zZ3N0ciAiRTM2Nzog54Sh5q2k576k57WEOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6ICog5b6M6Z2i5pyJ5LiN5q2j56K655qE5a2X5YWDOiAlcyIKKworIzogZmlsZWlvLmM6NjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjog54Sh5q2k5LqL5Lu2OiAlcyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBmaWxlaW8uYzo2NjQ2Cittc2dpZCAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBBdXRvLUNvbW1hbmRzIC0tLSIKKworIzogZmlsZWlvLmM6NjkxNworbXNnaWQgIkUyMTc6IENhbid0IGV4ZWN1dGUgYXV0b2NvbW1hbmRzIGZvciBBTEwgZXZlbnRzIgorbXNnc3RyICJFMjE3OiDnhKHms5XlsI3miYDmnInkuovku7bln7fooYwgYXV0b2NvbW1hbmQiCisKKyM6IGZpbGVpby5jOjY5NDAKK21zZ2lkICJObyBtYXRjaGluZyBhdXRvY29tbWFuZHMiCittc2dzdHIgIuaJvuS4jeWIsOWwjeaHieeahCBhdXRvY29tbWFuZCIKKworIzogZmlsZWlvLmM6NzI2MAorbXNnaWQgIkUyMTg6IGF1dG9jb21tYW5kIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkUyMTg6IGF1dG9jb21tYW5kIOWxpOaVuOmBjua3sSIKKworIzogZmlsZWlvLmM6NzUyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBBdXRvIGNvbW1hbmRzIGZvciBcIiVzXCIiCittc2dzdHIgIiVzIEF1dG8gY29tbWFuZHM6IFwiJXNcIiIKKworIzogZmlsZWlvLmM6NzUzNgorIywgYy1mb3JtYXQKK21zZ2lkICJFeGVjdXRpbmcgJXMiCittc2dzdHIgIuWft+ihjCAlcyIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBmaWxlaW8uYzo3NjA0CisjLCBjLWZvcm1hdAorbXNnaWQgImF1dG9jb21tYW5kICVzIgorbXNnc3RyICJhdXRvY29tbWFuZCAlcyIKKworIzogZmlsZWlvLmM6ODE3MQorbXNnaWQgIkUyMTk6IE1pc3Npbmcgey4iCittc2dzdHIgIkUyMTk6IOe8uuWwkSB7LiIKKworIzogZmlsZWlvLmM6ODE3MworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IOe8uuWwkSB9LiIKKworIzogZm9sZC5jOjY2Cittc2dpZCAiRTQ5MDogTm8gZm9sZCBmb3VuZCIKK21zZ3N0ciAiRTQ5MDog5om+5LiN5Yiw5Lu75L2VIGZvbGQiCisKKyM6IGZvbGQuYzo1NTMKK21zZ2lkICJFMzUwOiBDYW5ub3QgY3JlYXRlIGZvbGQgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MDog54Sh5rOV5Zyo55uu5YmN55qEICdmb2xkbWV0aG9kJyDkuIvlu7rnq4sgZm9sZCIKKworIzogZm9sZC5jOjU1NQorbXNnaWQgIkUzNTE6IENhbm5vdCBkZWxldGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUxOiDnhKHms5XlnKjnm67liY3nmoQgJ2ZvbGRtZXRob2QnIOS4i+WIqumZpCBmb2xkIgorCisjOiBnZXRjaGFyLmM6MjQ2Cittc2dpZCAiRTIyMjogQWRkIHRvIHJlYWQgYnVmZmVyIgorbXNnc3RyICJFMjIyOiDliqDlhaXoroDlj5bnt6nooZ3ljYDkuK0iCisKKyM6IGdldGNoYXIuYzoyMTQ2Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6IOmBnui/tCBtYXBwaW5nIgorCisjOiBnZXRjaGFyLmM6Mjk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI0OiBnbG9iYWwgYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNDogJXMg5bey57aT5pyJ5YWo5Z+fIGFiYnJldmlhdGlvbiDkuoYiCisKKyM6IGdldGNoYXIuYzoyOTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMjU6IGdsb2JhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNTogJXMg5bey57aT5pyJ5YWo5Z+fIG1hcHBpbmcg5LqGIgorCisjOiBnZXRjaGFyLmM6MzEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjI2OiBhYmJyZXZpYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yICVzIgorbXNnc3RyICJFMjI2OiAlcyDlt7LntpPmnIkgYWJicmV2aWF0aW9uIOS6hiIKKworIzogZ2V0Y2hhci5jOjMxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6ICVzIOeahCBtYXBwaW5nIOW3sue2k+WtmOWcqCIKKworIzogZ2V0Y2hhci5jOjMxOTEKK21zZ2lkICJObyBhYmJyZXZpYXRpb24gZm91bmQiCittc2dzdHIgIuaJvuS4jeWIsCBhYmJyZXZpYXRpb24iCisKKyM6IGdldGNoYXIuYzozMTkzCittc2dpZCAiTm8gbWFwcGluZyBmb3VuZCIKK21zZ3N0ciAi5rKS5pyJ6YCZ5YCLIG1hcHBpbmcg5bCN5oeJIgorCisjOiBnZXRjaGFyLmM6NDA4MworbXNnaWQgIkUyMjg6IG1ha2VtYXA6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTIyODogbWFrZW1hcDog5LiN5q2j56K655qE5qih5byPIgorCisjOiBndWkuYzoyMTgKK21zZ2lkICJFMjI5OiBDYW5ub3Qgc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTIyOTog54Sh5rOV5ZWf5YuV5ZyW5Z6L55WM6Z2iIgorCisjOiBndWkuYzozNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzMDogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyMzA6IOeEoeazleiugOWPluaqlOahiCBcIiVzXCIiCisKKyM6IGd1aS5jOjQ3MgorbXNnaWQgIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIKK21zZ3N0ciAiRTIzMTog5LiN5q2j56K655qEICdndWlmb250d2lkZSciCisKKyM6IGd1aS5jOjM5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1NDogQ2Fubm90IGFsbG9jYXRlIGNvbG9yICVzIgorbXNnc3RyICJFMjU0OiDkuI3og73phY3nva7poY/oibIgJXMiCisKKyM6IGd1aV9hdF9mcy5jOjI5MAorbXNnaWQgIjxjYW5ub3Qgb3Blbj4gIgorbXNnc3RyICI85LiN6IO96ZaL5ZWfPiIKKworIzogZ3VpX2F0X2ZzLmM6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE2OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGZvbnQgJXMiCittc2dzdHIgIkU2MTY6IHZpbV9TZWxGaWxlOiDkuI3og73kvb/nlKggJXMg5a2X5Z6LIgorCisjOiBndWlfYXRfZnMuYzoyNTM4Cittc2dpZCAiRTYxNDogdmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNDogdmltX1NlbEZpbGU6IOeEoeazleWbnuWIsOebruWJjeebrumMhCIKKworIzogZ3VpX2F0X2ZzLmM6MjU1NworbXNnaWQgIlBhdGhuYW1lOiIKK21zZ3N0ciAi6Lev5b6ROiIKKworIzogZ3VpX2F0X2ZzLmM6MjU2MworbXNnaWQgIkU2MTU6IHZpbV9TZWxGaWxlOiBjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiCittc2dzdHIgIkU2MTU6IHZpbV9TZWxGaWxlOiDnhKHms5Xlj5blvpfnm67liY3nm67pjIQiCisKKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIk9LIgorbXNnc3RyICLnorrlrpoiCisKKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX2d0ay5jOjI2MjUgZ3VpX21vdGlmLmM6MTYxNCBndWlfbW90aWYuYzoyODQ0Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICLlj5bmtogiCisKKyM6IGd1aV9hdF9zYi5jOjQ4NgorbXNnaWQgIlNjcm9sbGJhciBXaWRnZXQ6IENvdWxkIG5vdCBnZXQgZ2VvbWV0cnkgb2YgdGh1bWIgcGl4bWFwLiIKK21zZ3N0ciAi5o2y5YuV6Lu4OiDkuI3og73oqK3lrpogdGh1bWIgcGl4bWFwIOeahOS9jee9riIKKworIzogZ3VpX2F0aGVuYS5jOjE5NTYgZ3VpX21vdGlmLmM6MTg2NworbXNnaWQgIlZpbSBkaWFsb2ciCittc2dzdHIgIlZpbSDlsI3oqbHnm5IiCisKKyM6IGd1aV9iZXZhbC5jOjkxCittc2dpZCAiRTIzMjogQ2Fubm90IGNyZWF0ZSBCYWxsb29uRXZhbCB3aXRoIGJvdGggbWVzc2FnZSBhbmQgY2FsbGJhY2siCittc2dzdHIgIkUyMzI6IOS4jeiDveWwjeioiuaBr+iIhyBjYWxsYmFjayDlu7rnq4sgQmFsbG9uRXZhbCIKKworIzogZ3VpX2d0ay5jOjE1NjEKK21zZ2lkICJWaW0gZGlhbG9nLi4uIgorbXNnc3RyICJWaW0g5bCN6Kmx55uSLi4uIgorCisjOiBndWlfZ3RrLmM6MTk5MiBtZXNzYWdlLmM6MjUyNQorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIiZZ5pivXG4iCisiJk7lkKZcbiIKKyImQ+WPlua2iCIKKworIzogZ3VpX2d0ay5jOjIxNTIKK21zZ2lkICJJbnB1dCBfTWV0aG9kcyIKK21zZ3N0ciAi6Ly45YWl5rOVIgorCisjOiBndWlfZ3RrLmM6MjQxOCBndWlfbW90aWYuYzoyNzYzCittc2dpZCAiVklNIC0gU2VhcmNoIGFuZCBSZXBsYWNlLi4uIgorbXNnc3RyICJWSU0gLSDlsIvmib7oiIflj5bku6MuLi4iCisKKyM6IGd1aV9ndGsuYzoyNDI2IGd1aV9tb3RpZi5jOjI3NjUKK21zZ2lkICJWSU0gLSBTZWFyY2guLi4iCittc2dzdHIgIlZJTSAtIOWwi+aJvi4uLiIKKworIzogZ3VpX2d0ay5jOjI0NTggZ3VpX21vdGlmLmM6Mjg4MworbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIuaQnOWwizoiCisKKyM6IGd1aV9ndGsuYzoyNDc4IGd1aV9tb3RpZi5jOjI5MTUKK21zZ2lkICJSZXBsYWNlIHdpdGg6IgorbXNnc3RyICLlj5bku6Pngro6IgorCisjLiB3aG9sZSB3b3JkIG9ubHkgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjUxMCBndWlfbW90aWYuYzozMDMxCittc2dpZCAiTWF0Y2ggd2hvbGUgd29yZCBvbmx5IgorbXNnc3RyICLlj6rmkJzlsIvlrozlhajnm7jlkIznmoTlrZciCisKKyMuIG1hdGNoIGNhc2UgYnV0dG9uCisjOiBndWlfZ3RrLmM6MjUyMyBndWlfbW90aWYuYzozMDQzCittc2dpZCAiTWF0Y2ggY2FzZSIKK21zZ3N0ciAi56ym5ZCI5aSn5bCP5a+rIgorCisjOiBndWlfZ3RrLmM6MjUzNSBndWlfbW90aWYuYzoyOTg1Cittc2dpZCAiRGlyZWN0aW9uIgorbXNnc3RyICLmlrnlkJEiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjU0NyBndWlfbW90aWYuYzoyOTk3Cittc2dpZCAiVXAiCittc2dzdHIgIuWQkeS4iiIKKworIzogZ3VpX2d0ay5jOjI1NTEgZ3VpX21vdGlmLmM6MzAwNQorbXNnaWQgIkRvd24iCittc2dzdHIgIuWQkeS4iyIKKworIzogZ3VpX2d0ay5jOjI1NzcgZ3VpX2d0ay5jOjI1NzkgZ3VpX21vdGlmLmM6Mjc4NworbXNnaWQgIkZpbmQgTmV4dCIKK21zZ3N0ciAi5om+5LiL5LiA5YCLIgorCisjOiBndWlfZ3RrLmM6MjU5NiBndWlfZ3RrLmM6MjU5OCBndWlfbW90aWYuYzoyODA0Cittc2dpZCAiUmVwbGFjZSIKK21zZ3N0ciAi5Y+W5LujIgorCisjOiBndWlfZ3RrLmM6MjYwOSBndWlfZ3RrLmM6MjYxMSBndWlfbW90aWYuYzoyODE3Cittc2dpZCAiUmVwbGFjZSBBbGwiCittc2dzdHIgIuWPluS7o+WFqOmDqCIKKworIzogZ3VpX2d0a194MTEuYzoyMjg1Cittc2dpZCAiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiVmltOiDnlLEgU2Vzc2lvbiDnrqHnkIblk6HmlLbliLAgXCJkaWVcIiDopoHmsYJcbiIKKworIzogZ3VpX2d0a194MTEuYzozNDI0Cittc2dpZCAiVmltOiBNYWluIHdpbmRvdyB1bmV4cGVjdGVkbHkgZGVzdHJveWVkXG4iCittc2dzdHIgIlZpbTog5Li76KaW56qX54ib5o6JXG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDAzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICLlrZflnovpgbjmk4ciCisKKyM6IGd1aV9ndGtfeDExLmM6NTg5MCB1aS5jOjIwMDkKK21zZ2lkICJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIgorbXNnc3RyICLkvb/nlKggQ1VUX0JVRkZFUjAg5L6G5Y+W5Luj56m66YG45pOHIgorCisjOiBndWlfbW90aWYuYzoxNjEzIGd1aV9tb3RpZi5jOjE2MTYKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIumBjua/vuWZqCIKKworIzogZ3VpX21vdGlmLmM6MTYxNQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICLnm67pjIQiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTcKK21zZ2lkICJIZWxwIgorbXNnc3RyICLovJTliqnoqqrmmI4iCisKKyM6IGd1aV9tb3RpZi5jOjE2MTgKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAi5qqU5qGIIgorCisjOiBndWlfbW90aWYuYzoxNjIwCittc2dpZCAiU2VsZWN0aW9uIgorbXNnc3RyICLpgbjmk4ciCisKKyM6IGd1aV9tb3RpZi5jOjI4MzAKK21zZ2lkICJVbmRvIgorbXNnc3RyICLlvqnljp8iCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiDnhKHms5XplovllZ8gWmFwIOWtl+WeiyAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjExOiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTYxMTog54Sh5rOV5L2/55So5a2X5Z6LICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyLpgIHlh7rkuK3mlrflrZDnqIvlvI/nmoToqIrmga/kuK0uXG4iCisKKyM6IGd1aV93MzIuYzo3NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI0MzogQXJndW1lbnQgbm90IHN1cHBvcnRlZDogXCItJXNcIjsgVXNlIHRoZSBPTEUgdmVyc2lvbi4iCittc2dzdHIgIkUyNDM6IOS4jeaUr+aPtOWPg+aVuCBcIi0lc1wi44CC6KuL55SoIE9MRSDniYjmnKzjgIIiCisKKyM6IGd1aV93NDguYzoyMDI5Cittc2dpZCAiRmluZCBzdHJpbmcgKHVzZSAnXFxcXCcgdG8gZmluZCAgYSAnXFwnKSIKK21zZ3N0ciAi5pCc5bCL5a2X5LiyICjkvb/nlKggJ1xcXFwnIOS+huihqOekuiAnXFwnKSIKKworIzogZ3VpX3c0OC5jOjIwNTQKK21zZ2lkICJGaW5kICYgUmVwbGFjZSAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICLmkJzlsIvlj4rlj5bku6PlrZfkuLIgKOS9v+eUqCAnXFxcXCcg5L6G6KGo56S6ICdcXCcpIgorCisjOiBndWlfeDExLmM6MTQ0NQorbXNnaWQgIlZpbSBFNDU4OiBDYW5ub3QgYWxsb2NhdGUgY29sb3JtYXAgZW50cnksIHNvbWUgY29sb3JzIG1heSBiZSBpbmNvcnJlY3QiCittc2dzdHIgIlZpbSBFNDU4OiDnhKHms5XphY3nva4gY29sb3IgbWFwIOmgheebru+8jOacieS6m+mhj+iJsueci+i1t+S+huacg+aAquaAqueahCIKKworIzogZ3VpX3gxMS5jOjIwMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MDogRm9udHMgZm9yIHRoZSBmb2xsb3dpbmcgY2hhcnNldHMgYXJlIG1pc3NpbmcgaW4gZm9udHNldCAlczoiCittc2dzdHIgIkUyNTA6IEZvbnRzZXQgJXMg5rKS5pyJ6Kit5a6a5q2j56K655qE5a2X5Z6L5Lul5L6b6aGv56S66YCZ5Lqb5a2X5YWD6ZuGOiIKKworIzogZ3VpX3gxMS5jOjIwNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI1MjogRm9udHNldCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI1Mjog5a2X5Z6L6ZuGKEZvbnRzZXQp5ZCN56ixOiAlcyIKKworIzogZ3VpX3gxMS5jOjIwNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCAnJXMnIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiJyVzJyDkuI3mmK/lm7rlrprlr6zluqblrZflnosiCisKKyM6IGd1aV94MTEuYzoyMDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTM6IEZvbnRzZXQgbmFtZTogJXNcbiIKK21zZ3N0ciAiRTI1Mzog5a2X5Z6L6ZuGKEZvbnRzZXQp5ZCN56ixOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA4MworIywgYy1mb3JtYXQKK21zZ2lkICJGb250MDogJXNcbiIKK21zZ3N0ciAiRm9udDA6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQxOiAlc1xuIgorbXNnc3RyICJGb250MTogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCVkIHdpZHRoIGlzIG5vdCB0d2ljZSB0aGF0IG9mIGZvbnQwXG4iCittc2dzdHIgIuWtl+WeiyVk5a+s5bqm5LiN5piv5a2X5Z6LMOeahOWFqeWAjVxuIgorCisjOiBndWlfeDExLmM6MjA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIuWtl+WeizDnmoTlr6zluqbvvJolbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIuWtl+WeizHlr6zluqY6ICVsZFxuIgorIlxuIgorCisjOiBoYW5ndWxpbi5jOjYxMAorbXNnaWQgIkUyNTY6IEhhbmd1bCBhdXRvbWF0YSBFUlJPUiIKK21zZ3N0ciAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIOmMr+iqpCIKKworIzogaWZfY3Njb3BlLmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiDnlKjms5U6IGNzW2NvcGVdICVzIgorCisjOiBpZl9jc2NvcGUuYzo2NworbXNnaWQgIkFkZCBhIG5ldyBkYXRhYmFzZSIKK21zZ3N0ciAi5paw5aKe6LOH5paZ5bqrIgorCisjOiBpZl9jc2NvcGUuYzo2OQorbXNnaWQgIlF1ZXJ5IGZvciBhIHBhdHRlcm4iCittc2dzdHIgIui8uOWFpSBwYXR0ZXJuIgorCisjOiBpZl9jc2NvcGUuYzo3MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICLpoa/npLrmraToqIrmga8iCisKKyM6IGlmX2NzY29wZS5jOjczCittc2dpZCAiS2lsbCBhIGNvbm5lY3Rpb24iCittc2dzdHIgIue1kOadn+mAo+e3miIKKworIzogaWZfY3Njb3BlLmM6NzUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICLph43oqK3miYDmnInpgKPnt5oiCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAi6aGv56S66YCj57eaIgorCisjOiBpZl9jc2NvcGUuYzoxMDgKK21zZ2lkICJUaGlzIGNzY29wZSBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgc3BsaXR0aW5nIHRoZSB3aW5kb3cuXG4iCittc2dzdHIgIumAmeWAiyBjc2NvcGUg5ZG95Luk5LiN5pSv5o+05YiG5Ymy6J6i5bmVXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0MworbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiDnlKjms5U6IGNzdGFnIDzorZjliKXlrZdpZGVudD4iCisKKyM6IGlmX2NzY29wZS5jOjE5OQorbXNnaWQgIkUyNTc6IGNzdGFnOiB0YWcgbm90IGZvdW5kIgorbXNnc3RyICJFMjU3OiBjc3RhZzog5om+5LiN5YiwIHRhZyIKKworIzogaWZfY3Njb3BlLmM6NDA3IGlmX2NzY29wZS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTYzOiBzdGF0KCVzKSBlcnJvcjogJWQiCittc2dzdHIgIkU1NjM6IHN0YXQoJXMpIOmMr+iqpDogJWQiCisKKyM6IGlmX2NzY29wZS5jOjQ2MSBpZl9jc2NvcGUuYzo0NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkZWQgY3Njb3BlIGRhdGFiYXNlICVzIgorbXNnc3RyICLmlrDlop4gY3Njb3BlIOizh+aWmeW6qyAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMg5LiN5piv55uu6YyE5oiWIGNzY29wZSDos4fmlpnluqsiCisKKyM6IGlmX2NzY29wZS5jOjU1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTY1OiBlcnJvciByZWFkaW5nIGNzY29wZSBjb25uZWN0aW9uICVkIgorbXNnc3RyICJFNTY1OiDoroDlj5YgY3Njb3BlIOmAo+e3miAlZCDpjK/oqqQiCisKKyM6IGlmX2NzY29wZS5jOjYzNgorbXNnaWQgIkU1NjE6IHVua25vd24gY3Njb3BlIHNlYXJjaCB0eXBlIgorbXNnc3RyICJFNTYxOiDmnKrnn6XnmoQgY3Njb3BlIOaQnOWwi+W9ouaFiyIKKworIzogaWZfY3Njb3BlLmM6NjgzCittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6IOeEoeazleW7uueri+iIhyBjc2NvcGUg55qEIHBpcGUg6YCj57eaIgorCisjOiBpZl9jc2NvcGUuYzo3NDgKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbiBleGVjIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24g5Z+36KGM5aSx5pWXIgorCisjOiBpZl9jc2NvcGUuYzo3NTgKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4g5aSx5pWXICh0b19mcCkiCisKKyM6IGlmX2NzY29wZS5jOjc2MAorbXNnaWQgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gZm9yIGZyX2ZwIGZhaWxlZCIKK21zZ3N0ciAiY3NfY3JlYXRlX2Nvbm5lY3Rpb246IGZkb3BlbiDlpLHmlZcgKGZyX2ZwKSIKKworIzogaWZfY3Njb3BlLmM6Nzg4Cittc2dpZCAiRTU2Nzogbm8gY3Njb3BlIGNvbm5lY3Rpb25zIgorbXNnc3RyICJFNTY3OiDmspLmnIkgY3Njb3BlIOmAo+e3miIKKworIzogaWZfY3Njb3BlLmM6ODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTk6IG5vIG1hdGNoZXMgZm91bmQgZm9yIGNzY29wZSBxdWVyeSAlcyBvZiAlcyIKK21zZ3N0ciAiRTI1OTog5om+5LiN5Yiw56ym5ZCIIGNzY29wZSDnmoTmkJzlsIsgJXMgLyAlcyIKKworIzogaWZfY3Njb3BlLmM6OTAyCittc2dpZCAiY3Njb3BlIGNvbW1hbmRzOlxuIgorbXNnc3RyICJjc2NvcGUg5ZG95LukOlxuIgorCisjOiBpZl9jc2NvcGUuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcylcbiIKK21zZ3N0ciAiJS01czogJS0zMHMgKOeUqOazlTogJXMpXG4iCisKKyM6IGlmX2NzY29wZS5jOjk3MworbXNnaWQgIkU1Njg6IGR1cGxpY2F0ZSBjc2NvcGUgZGF0YWJhc2Ugbm90IGFkZGVkIgorbXNnc3RyICJFNTY4OiDph43opIfnmoQgY3Njb3BlIOizh+aWmeW6q+acquiiq+WKoOWFpSIKKworIzogaWZfY3Njb3BlLmM6OTg0Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IOW3sumBlOWIsCBjc2NvcGUg5pyA5aSn6YCj57ea5pW455uuIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1Cittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiDmib7kuI3liLAgY3Njb3BlIOmAo+e3miIKKworIzogaWZfY3Njb3BlLmM6MTEwOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjYxOiBjc2NvcGUgY29ubmVjdGlvbiAlcyBub3QgZm91bmQiCittc2dzdHIgIkUyNjE6IOaJvuS4jeWIsCBjc2NvcGUg6YCj57eaICVzIgorCisjOiBpZl9jc2NvcGUuYzoxMTQ0Cittc2dpZCAiY3Njb3BlIGNvbm5lY3Rpb24gY2xvc2VkIgorbXNnc3RyICJjc2NvcGUg6YCj57ea5bey6Zec6ZaJIgorCisjOiBpZl9jc2NvcGUuYzoxMTUyCisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUg6YCj57eaICVzIOW3sumXnOmWiVxuIgorCisjLiBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyM6IGlmX2NzY29wZS5jOjEyOTMKK21zZ2lkICJFNTcwOiBmYXRhbCBlcnJvciBpbiBjc19tYW5hZ2VfbWF0Y2hlcyIKK21zZ3N0ciAiRTU3MDogY3NfbWFuYWdlX21hdGNoZXMg5Zq06YeN6Yyv6KqkIgorCisjOiBpZl9jc2NvcGUuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6IOiugOWPliBjc2NvcGUg6YCj57eaICVkIOmMr+iqpCIKKworIzogaWZfY3Njb3BlLmM6MTQ1MgorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICLnhKHms5Xkvb/nlKggbWFsbG9jXG4iCisKKyM6IGlmX2NzY29wZS5jOjE0NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3Njb3BlIHRhZzogJXNcbiIKK21zZ3N0ciAiQ3Njb3BlIOaomeexpCh0YWcpOiAlc1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDYxCittc2dpZCAiICAgIyAgIGxpbmUiCittc2dzdHIgIiAgICMgICDooYwgICIKKworIzogaWZfY3Njb3BlLmM6MTQ2MworbXNnaWQgImZpbGVuYW1lIC8gY29udGV4dCAvIGxpbmVcbiIKK21zZ3N0ciAi5qqU5ZCNICAgICAvIOWFp+aWhyAgICAvIOihjOiZn1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNzIxCittc2dpZCAiQWxsIGNzY29wZSBkYXRhYmFzZXMgcmVzZXQiCittc2dzdHIgIumHjeioreaJgOaciSBjc2NvcGUg6LOH5paZ5bqrIgorCisjOiBpZl9jc2NvcGUuYzoxNzg4Cittc2dpZCAibm8gY3Njb3BlIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIuaykuaciSBjc2NvcGUg6YCj57eaXG4iCisKKyM6IGlmX2NzY29wZS5jOjE3OTIKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICDos4fmlpnluqvlkI3nqLEgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgcGF0aFxuIgorCisjOiBpZl9jc2NvcGUuYzoxODAzCisjLCBjLWZvcm1hdAorbXNnaWQgIiUyZCAlLTVsZCAgJS0zNHMgIDxub25lPlxuIgorbXNnc3RyICIlMmQgJS01bGQgICUtMzRzICA854ShPlxuIgorCisjOiBpZl9weXRob24uYzozOTQKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2Mzog5oqx5q2J77yM6YCZ5YCL5ZG95Luk54Sh5rOV5L2/55So77yMUHl0aG9uIOeoi+W8j+W6q+aykuaciei8ieWFpeOAgiIKKworIzogaWZfcHl0aG9uLmM6NTk2Cittc2dpZCAiY2FuJ3QgZGVsZXRlIE91dHB1dE9iamVjdCBhdHRyaWJ1dGVzIgorbXNnc3RyICLnhKHms5XliKrpmaQgT3V0cHV0T2JqZWN0IOWxrOaApyIKKworIzogaWZfcHl0aG9uLmM6NjAzCittc2dpZCAic29mdHNwYWNlIG11c3QgYmUgYW4gaW50ZWdlciIKK21zZ3N0ciAic29mdHNwYWNlIOW/hemcgOaYr+aVtOaVuCIKKworIzogaWZfcHl0aG9uLmM6NjExCittc2dpZCAiaW52YWxpZCBhdHRyaWJ1dGUiCittc2dzdHIgIuS4jeato+eiuueahOWxrOaApyIKKworIzogaWZfcHl0aG9uLmM6NjUwIGlmX3B5dGhvbi5jOjY2NAorbXNnaWQgIndyaXRlbGluZXMoKSByZXF1aXJlcyBsaXN0IG9mIHN0cmluZ3MiCittc2dzdHIgIndyaXRlbGluZXMoKSDpnIDopoEgc3RyaW5nIGxpc3Qg55W25Y+D5pW4IgorCisjOiBpZl9weXRob24uYzo3OTAKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiDnhKHms5XliJ3lp4sgSS9PIOeJqeS7tiIKKworIzogaWZfcHl0aG9uLmM6OTc1IGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIuS4jeato+eiuueahOmBi+eul+W8jyIKKworIzogaWZfcHl0aG9uLmM6OTg5IGlmX3RjbC5jOjE0MDcKK21zZ2lkICJleHByZXNzaW9ucyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIuWboOeCuue3qOitr+aZguaykuacieWKoOWFpemBi+eul+W8jyhleHByZXNzaW9uKeeahOeoi+W8j+eivO+8jOaJgOS7peeEoeazleS9v+eUqOmBi+eul+W8jyIKKworIzogaWZfcHl0aG9uLmM6MTAwMgorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIuippuWcluS9v+eUqOW3suiiq+WIqumZpOeahCBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjEwMTcgaWZfcHl0aG9uLmM6MTA1OCBpZl9weXRob24uYzoxMTIyIGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIuihjOiZn+i2heWHuuevhOWcjSIKKworIzogaWZfcHl0aG9uLmM6MTI1NworIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXIg54mp5Lu2ICjlt7LliKrpmaQpOiAlOGxYPiIKKworIzogaWZfcHl0aG9uLmM6MTM0OCBpZl90Y2wuYzo4MzYKK21zZ2lkICJpbnZhbGlkIG1hcmsgbmFtZSIKK21zZ3N0ciAi5qiZ6KiY5ZCN56ix5LiN5q2j56K6IgorCisjOiBpZl9weXRob24uYzoxNjIzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIueEoeatpCBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjE3MTEKK21zZ2lkICJhdHRlbXB0IHRvIHJlZmVyIHRvIGRlbGV0ZWQgd2luZG93IgorbXNnc3RyICLoqablnJbkvb/nlKjlt7LooqvliKrpmaTnmoToppbnqpciCisKKyM6IGlmX3B5dGhvbi5jOjE3NTYKK21zZ2lkICJyZWFkb25seSBhdHRyaWJ1dGUiCittc2dzdHIgIuWUr+iugOWxrOaApyIKKworIzogaWZfcHl0aG9uLmM6MTc2OQorbXNnaWQgImN1cnNvciBwb3NpdGlvbiBvdXRzaWRlIGJ1ZmZlciIKK21zZ3N0ciAi5ri45qiZ5a6a5L2N5Zyo57ep6KGd5Y2A5LmL5aSWIgorCisjOiBpZl9weXRob24uYzoxODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjzoppbnqpfnianku7Yo5bey5Yiq6ZmkKTogJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0ICh1bmtub3duKSBhdCAlLjhsWD4iCittc2dzdHIgIjzoppbnqpfnianku7Yo5pyq55+lKTogJS44bFg+IgorCisjOiBpZl9weXRob24uYzoxODYwCisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgJWQ+IgorbXNnc3RyICI86KaW56qXICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzNgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICLnhKHmraToppbnqpciCisKKyM6IGlmX3B5dGhvbi5jOjIxOTMgaWZfcHl0aG9uLmM6MjIyOCBpZl9weXRob24uYzoyMjc4IGlmX3B5dGhvbi5jOjIzNDYKKyM6IGlmX3B5dGhvbi5jOjI0NjYgaWZfcHl0aG9uLmM6MjUxOCBpZl90Y2wuYzo2ODQgaWZfdGNsLmM6NzI5IGlmX3RjbC5jOjgwMworIzogaWZfdGNsLmM6ODczIGlmX3RjbC5jOjE5OTgKK21zZ2lkICJjYW5ub3Qgc2F2ZSB1bmRvIGluZm9ybWF0aW9uIgorbXNnc3RyICLnhKHms5XlhLLlrZjlvqnljp/os4foqIoiCisKKyM6IGlmX3B5dGhvbi5jOjIxOTUgaWZfcHl0aG9uLmM6MjI4NSBpZl9weXRob24uYzoyMzU3Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICLkuI3og73liKrpmaTmraTooYwiCisKKyM6IGlmX3B5dGhvbi5jOjIyMzAgaWZfcHl0aG9uLmM6MjM3MyBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMAorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIuS4jeiDveabv+S7o+atpOihjCIKKworIzogaWZfcHl0aG9uLmM6MjM4OSBpZl9weXRob24uYzoyNDY4IGlmX3B5dGhvbi5jOjI1MjYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIuS4jeiDveabv+S7o+aPkuWFpeatpOihjCIKKworIzogaWZfcHl0aG9uLmM6MjYzMAorbXNnaWQgInN0cmluZyBjYW5ub3QgY29udGFpbiBuZXdsaW5lcyIKK21zZ3N0ciAi5a2X5Liy54Sh5rOV5YyF5ZCr5paw6KGMIgorCisjOiBpZl9ydWJ5LmM6Mzk2Cittc2dpZCAiIgorIkUyNjY6IFNvcnJ5LCB0aGlzIGNvbW1hbmQgaXMgZGlzYWJsZWQsIHRoZSBSdWJ5IGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIkUyNjY6IOatpOWRveS7pOeEoeazleS9v+eUqO+8jOeEoeazlei8ieWFpSBSdWJ5IOeoi+W8j+W6qyhMaWJyYXJ5KSIKKworIzogaWZfcnVieS5jOjQ1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjczOiB1bmtub3duIGxvbmdqbXAgc3RhdHVzICVkIgorbXNnc3RyICJFMjczOiDmnKrnn6XnmoQgbG9uZ2ptcCBzdGF0dXMgJWQiCisKKyM6IGlmX3NuaWZmLmM6NjcKK21zZ2lkICJUb2dnbGUgaW1wbGVtZW50YXRpb24vZGVmaW5pdGlvbiIKK21zZ3N0ciAi5YiH5o+b5a+m5L2cL+Wumue+qSIKKworIzogaWZfc25pZmYuYzo2OAorbXNnaWQgIlNob3cgYmFzZSBjbGFzcyBvZiIKK21zZ3N0ciAi6aGv56S6IGJhc2UgY2xhc3Mgb2Y6IgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAi6aGv56S66KKrIG92ZXJyaWRlIOeahCBtZW1iZXIgZnVuY3Rpb24iCisKKyM6IGlmX3NuaWZmLmM6NzAKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGZpbGUiCittc2dzdHIgIuiugOWPljog5b6e5qqU5qGIIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICLoroDlj5Y6IOW+nueJqeS7tiIKKworIzogaWZfc25pZmYuYzo3MworbXNnaWQgIlJldHJpZXZlIGZyb20gYWxsIHByb2plY3RzIgorbXNnc3RyICLoroDlj5Y6IOW+nuaJgOaciSBwcm9qZWN0IgorCisjOiBpZl9zbmlmZi5jOjc0Cittc2dpZCAiUmV0cmlldmUiCittc2dzdHIgIuiugOWPliIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICLpoa/npLrljp/lp4vnorw6ICIKKworIzogaWZfc25pZmYuYzo3NgorbXNnaWQgIkZpbmQgc3ltYm9sIgorbXNnc3RyICLmkJzlsIsgc3ltYm9sIgorCisjOiBpZl9zbmlmZi5jOjc3Cittc2dpZCAiQnJvd3NlIGNsYXNzIgorbXNnc3RyICLngI/opr0gY2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAi6aGv56S66ZqO5bGk5byP55qEIGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAi6aGv56S6IHJlc3RyaWN0ZWQg6ZqO5bGk5byP55qEIGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYg5Y+D6ICD5YiwIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiDooqvoqrDlj4PogIM6IgorCisjOiBpZl9zbmlmZi5jOjgyCittc2dpZCAiWHJlZiBoYXMgYSIKK21zZ3N0ciAiWHJlZiDmnIkiCisKKyM6IGlmX3NuaWZmLmM6ODMKK21zZ2lkICJYcmVmIHVzZWQgYnkiCittc2dzdHIgIlhyZWYg6KKr6Kqw5L2/55SoOiIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAi6aGv56S65paH5Lu2OiAiCisKKyM6IGlmX3NuaWZmLmM6ODUKK21zZ2lkICJHZW5lcmF0ZSBkb2N1IGZvciIKK21zZ3N0ciAi55Si55Sf5paH5Lu2OiAiCisKKyM6IGlmX3NuaWZmLmM6OTcKK21zZ2lkICIiCisiQ2Fubm90IGNvbm5lY3QgdG8gU05pRkYrLiBDaGVjayBlbnZpcm9ubWVudCAoc25pZmZlbWFjcyBtdXN0IGJlIGZvdW5kIGluICIKKyIkUEFUSCkuXG4iCittc2dzdHIgIueEoeazlemAo+e3muWIsCBTTmlGRivjgILoq4vmqqLmn6XnkrDlooPorormlbggKCRQQVRIIOijoeW/hemcgOWPr+S7peaJvuWIsCBzbmlmZmVtYWNzKVxuIgorCisjOiBpZl9zbmlmZi5jOjQyNQorbXNnaWQgIkUyNzQ6IFNuaWZmOiBFcnJvciBkdXJpbmcgcmVhZC4gRGlzY29ubmVjdGVkIgorbXNnc3RyICJFMjc0OiBTbmlmZjog6K6A5Y+W6Yyv6KqkLiDlj5bmtojpgKPnt5oiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyDnm67liY0iCisKKyM6IGlmX3NuaWZmLmM6NTU1Cittc2dpZCAibm90ICIKK21zZ3N0ciAi5pyqIgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAi6YCj57ea5LitIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTog5LiN5q2j56K655qEIFNOaWZmKyDlkbzlj6s6ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiDpgKPnt5rliLAgU05pRkYrIOWkseaVlyIKKworIzogaWZfc25pZmYuYzoxMDA5Cittc2dpZCAiRTI3ODogU05pRkYrIG5vdCBjb25uZWN0ZWQiCittc2dzdHIgIkUyNzg6IOacqumAo+e3muWIsCBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAxOAorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IOS4jeaYryBTTmlGRisg55qE57ep6KGd5Y2AIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiDlr6vlhaXpjK/oqqTjgILntZDmnZ/pgKPnt5oiCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAi57ep6KGd5Y2A6Jmf56K86Yyv6KqkIgorCisjOiBpZl90Y2wuYzo0NjQgaWZfdGNsLmM6OTMxIGlmX3RjbC5jOjExMTAKK21zZ2lkICJub3QgaW1wbGVtZW50ZWQgeWV0IgorbXNnc3RyICLlsJrmnKrlr6bkvZwiCisKKyM6IGlmX3RjbC5jOjUwMQorbXNnaWQgInVua25vd24gb3B0aW9uIgorbXNnc3RyICLkuI3mraPnorrnmoTpgbjpoIUiCisKKyMuID8/PworIzogaWZfdGNsLmM6Nzc0Cittc2dpZCAiY2Fubm90IHNldCBsaW5lKHMpIgorbXNnc3RyICLkuI3og73oqK3lrprooYwiCisKKyM6IGlmX3RjbC5jOjg0NQorbXNnaWQgIm1hcmsgbm90IHNldCIKK21zZ3N0ciAi5rKS5pyJ6Kit5a6a5qiZ6KiYIgorCisjOiBpZl90Y2wuYzo4NTEgaWZfdGNsLmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJyb3cgJWQgY29sdW1uICVkIgorbXNnc3RyICLliJcgJWQg6KGMICVkIgorCisjOiBpZl90Y2wuYzo4ODEKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICLkuI3og73mj5LlhaXmiJbpmYTliqDmraTooYwiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAi6Yyv6Kqk55qE5peX5qiZOiAiCisKKyM6IGlmX3RjbC5jOjEzMzgKK21zZ2lkICJ1bmtub3duIHZpbU9wdGlvbiIKK21zZ3N0ciAi5LiN5q2j56K655qEIFZJTSDpgbjpoIUiCisKKyM6IGlmX3RjbC5jOjE0MjMKK21zZ2lkICJrZXlib2FyZCBpbnRlcnJ1cHQiCittc2dzdHIgIumNteebpOS4reaWtyIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAidmltIOmMr+iqpCIKKworIzogaWZfdGNsLmM6MTQ3MQorbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVmZmVyL3dpbmRvdyBjb21tYW5kOiBvYmplY3QgaXMgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAi54Sh5rOV5bu656uL57ep6KGd5Y2AL+imlueql+WRveS7pDog54mp5Lu25bCH5pyD6KKr5Yiq6ZmkIgorCisjOiBpZl90Y2wuYzoxNTQ1Cittc2dpZCAiIgorImNhbm5vdCByZWdpc3RlciBjYWxsYmFjayBjb21tYW5kOiBidWZmZXIvd2luZG93IGlzIGFscmVhZHkgYmVpbmcgZGVsZXRlZCIKK21zZ3N0ciAi54Sh5rOV6Ki75YaKIGNhbGxiYWNrIOWRveS7pDog57ep6KGd5Y2AL+imlueql+W3sue2k+iiq+WIqumZpOS6hiIKKworIy4gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRmFtb3VzIGxhc3Qgd29yZD8KKyM6IGlmX3RjbC5jOjE1NjIKK21zZ2lkICIiCisiRTI4MDogVENMIEZBVEFMIEVSUk9SOiByZWZsaXN0IGNvcnJ1cHQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0uIgorIm9yZyIKK21zZ3N0ciAiRTI4MDogVENMIOWatOmHjemMr+iqpDogcmVmbGlzdCDniJvmjonkuoYhPyDoq4vloLHlkYrntaYgdG8gdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAi54Sh5rOV6Ki75YaKIGNhbGxiYWNrIOWRveS7pDog5om+5LiN5Yiw57ep6KGd5Y2AL+imlueqlyIKKworIzogaWZfdGNsLmM6MTcyNAorbXNnaWQgIiIKKyJFNTcxOiBTb3JyeSwgdGhpcyBjb21tYW5kIGlzIGRpc2FibGVkOiB0aGUgVGNsIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZC4iCittc2dzdHIgIiIKKyJFNTcxOiDmraTlkb3ku6TnhKHms5Xkvb/nlKgsIOWboOeCuueEoeazlei8ieWFpSBUY2wg56iL5byP5bqrKExpYnJhcnkpIgorCisjOiBpZl90Y2wuYzoxODg2Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICJFMjgxOiBUQ0wg6Yyv6KqkOiDntZDmnZ/norzkuI3mmK/mlbTmlbghPyDoq4vloLHlkYrntaYgdG8gdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoyMDA2Cittc2dpZCAiY2Fubm90IGdldCBsaW5lIgorbXNnc3RyICLkuI3og73lj5blvpfmraTooYwiCisKKyM6IGlmX3hjbWRzcnYuYzoyMTUKK21zZ2lkICJVbmFibGUgdG8gcmVnaXN0ZXIgYSBjb21tYW5kIHNlcnZlciBuYW1lIgorbXNnc3RyICLnhKHms5XoqLvlhorlkb3ku6TkvLrmnI3lmajlkI3nqLEiCisKKyM6IGlmX3hjbWRzcnYuYzo0NjUKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiDnhKHms5XpgIHlh7rlkb3ku6TliLDnm67nmoTlnLDnqIvlvI8iCisKKyM6IGlmX3hjbWRzcnYuYzo3MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IOS4jeato+eiuueahOS8uuacjeWZqCBpZCA6ICVzIgorCisjOiBpZl94Y21kc3J2LmM6MTA5OAorbXNnaWQgIkUyNTE6IFZJTSBpbnN0YW5jZSByZWdpc3RyeSBwcm9wZXJ0eSBpcyBiYWRseSBmb3JtZWQuICBEZWxldGVkISIKK21zZ3N0ciAiRTI1MTogVklNIOeahCByZWdpc3RyeSDoqK3lrprpoIXmnInoqqTjgILlt7LliKrpmaTjgIIiCisKKyM6IG1haW4uYzo2MAorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICLkuI3mraPnorrnmoTpgbjpoIUiCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICLlpKrlpJrnt6jovK/lj4PmlbgiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIue8uuWwkeW/heimgeeahOWPg+aVuDoiCisKKyM6IG1haW4uYzo2NgorbXNnaWQgIkdhcmJhZ2UgYWZ0ZXIgb3B0aW9uIgorbXNnc3RyICLnhKHms5Xovqjoqo3mraTpgbjpoIXlvoznmoTlkb3ku6Q6ICIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiIG9yIFwiLWMgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAi5aSq5aSaIFwiK2NvbW1hbmRcIiDmiJYgXCItYyBjb21tYW5kXCIg5Y+D5pW4IgorCisjOiBtYWluLmM6NzAKK21zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGZvciIKK21zZ3N0ciAi5LiN5q2j56K655qE5Y+D5pW4OiAiCisKKyM6IG1haW4uYzo0NjkKK21zZ2lkICJUaGlzIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlIGRpZmYgZmVhdHVyZS4iCittc2dzdHIgIuaCqOeahCBWaW0g57eo6K2v5pmC5rKS5pyJ5Yqg5YWlIGRpZmYg55qE6IO95YqbIgorCisjOiBtYWluLmM6OTE3Cittc2dpZCAiQXR0ZW1wdCB0byBvcGVuIHNjcmlwdCBmaWxlIGFnYWluOiBcIiIKK21zZ3N0ciAi6Kmm5ZyW5YaN5qyh6ZaL5ZWfIHNjcmlwdCDmqpQ6IFwiIgorCisjOiBtYWluLmM6OTIxIG1haW4uYzo5MjggbWFpbi5jOjk3MiBtZW1saW5lLmM6MzY4MiBtZW1saW5lLmM6MzY4NgorIzogdmVyc2lvbi5jOjg1NyB2ZXJzaW9uLmM6ODYyIHZlcnNpb24uYzo4NjcgdmVyc2lvbi5jOjg3MiB2ZXJzaW9uLmM6ODc3CisjOiB2ZXJzaW9uLmM6ODgyIHZlcnNpb24uYzo4ODggdmVyc2lvbi5jOjg5MiB2ZXJzaW9uLmM6ODk2IHZlcnNpb24uYzo5MDEKKyM6IHZlcnNpb24uYzo5MDggdmVyc2lvbi5jOjkxNiB2ZXJzaW9uLmM6OTIyCittc2dpZCAiXCJcbiIKK21zZ3N0ciAiXCJcbiIKKworIzogbWFpbi5jOjkyNgorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciByZWFkaW5nOiBcIiIKK21zZ3N0ciAi54Sh5rOV6ZaL5ZWf5Lul6K6A5Y+WOiBcIiIKKworIzogbWFpbi5jOjk3MAorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciBzY3JpcHQgb3V0cHV0OiBcIiIKK21zZ3N0ciAi54Sh5rOV6ZaL5ZWf54K6IHNjcmlwdCDovLjlh7o6IFwiIgorCisjOiBtYWluLmM6MTEwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBmaWxlcyB0byBlZGl0XG4iCittc2dzdHIgIumChOaciSAlZCDlgIvmqpTmoYjnrYnlvoXnt6jovK9cbiIKKworIzogbWFpbi5jOjExNzgKK21zZ2lkICJWaW06IFdhcm5pbmc6IE91dHB1dCBpcyBub3QgdG8gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IOazqOaEjzog6Ly45Ye65LiN5piv57WC56uv5qmfKOieouW5lSlcbiIKKworIzogbWFpbi5jOjExODAKK21zZ2lkICJWaW06IFdhcm5pbmc6IElucHV0IGlzIG5vdCBmcm9tIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiDms6jmhI86IOi8uOWFpeS4jeaYr+e1guerr+apnyjpjbXnm6QpXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTI1NworbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInZpbXJjIOWJjeWRveS7pOWIlyIKKworIzogbWFpbi5jOjEyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MjogQ2Fubm90IHJlYWQgZnJvbSBcIiVzXCIiCittc2dzdHIgIkUyODI6IOeEoeazleiugOWPluaqlOahiCBcIiVzXCIiCisKKyM6IG1haW4uYzoyMzEzCittc2dpZCAiIgorIlxuIgorIk1vcmUgaW5mbyB3aXRoOiBcInZpbSAtaFwiXG4iCittc2dzdHIgIiIKKyJcbiIKKyLmn6XoqaLmm7TlpJros4foqIroq4vln7fooYw6IFwidmltIC1oXCJcbiIKKworIzogbWFpbi5jOjIzNDYKK21zZ2lkICJbZmlsZSAuLl0gICAgICAgZWRpdCBzcGVjaWZpZWQgZmlsZShzKSIKK21zZ3N0ciAiW+aqlOahiCAuLl0gICAgICAg57eo6Lyv5oyH5a6a55qE5qqU5qGIIgorCisjOiBtYWluLmM6MjM0NworbXNnaWQgIi0gICAgICAgICAgICAgICByZWFkIHRleHQgZnJvbSBzdGRpbiIKK21zZ3N0ciAiLSAgICAgICAgICAgICAgIOW+nuaomea6lui8uOWFpShzdGRpbinoroDlj5bmqpTmoYgiCisKKyM6IG1haW4uYzoyMzQ4Cittc2dpZCAiLXQgdGFnICAgICAgICAgIGVkaXQgZmlsZSB3aGVyZSB0YWcgaXMgZGVmaW5lZCIKK21zZ3N0ciAiLXQgdGFnICAgICAgICAgIOe3qOi8r+aZguS9v+eUqOaMh+WumueahCB0YWciCisKKyM6IG1haW4uYzoyMzUwCittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbZXJyb3JmaWxlXSAg57eo6Lyv5pmC6LyJ5YWl56ys5LiA5YCL6Yyv6KqkIgorCisjOiBtYWluLmM6MjM1OQorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJ1c2FnZToiCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyIg55So5rOVOiIKKworIzogbWFpbi5jOjIzNjIKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAidmltIFvlj4PmlbhdICIKKworIzogbWFpbi5jOjIzNjYKK21zZ2lkICIiCisiXG4iCisiICAgb3I6IgorbXNnc3RyICIiCisiXG4iCisiICAg5oiWOiIKKworIzogbWFpbi5jOjIzNjkKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisi5Y+D5pW4OlxuIgorCisjOiBtYWluLmM6MjM3MAorbXNnaWQgIi0tXHRcdFx0T25seSBmaWxlIG5hbWVzIGFmdGVyIHRoaXMiCittc2dzdHIgIi0tXHRcdFx05Y+q5pyJ5Zyo6YCZ5LmL5b6M55qE5qqU5qGIIgorCisjOiBtYWluLmM6MjM3MgorbXNnaWQgIi0tbGl0ZXJhbFx0XHREb24ndCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICItLWxpdGVyYWxcdFx05LiN5bGV6ZaL6JCs55So5a2X5YWDIgorCisjOiBtYWluLmM6MjM3NQorbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdOiou+WGiiBndmltIOWIsCBPTEUiCisKKyM6IG1haW4uYzoyMzc2Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi11bnJlZ2lzdGVyXHRcdOWPlua2iCBPTEUg5Lit55qEIGd2aW0g6Ki75YaKIgorCisjOiBtYWluLmM6MjM3OQorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx05L2/55So5ZyW5b2i55WM6Z2iICjlkIwgXCJndmltXCIpIgorCisjOiBtYWluLmM6MjM4MAorbXNnaWQgIi1mICBvciAgLS1ub2ZvcmtcdEZvcmVncm91bmQ6IERvbid0IGZvcmsgd2hlbiBzdGFydGluZyBHVUkiCittc2dzdHIgIi1mICDmiJYgIC0tbm9mb3JrXHTliY3mma86IOi1t+Wni+WcluW9oueVjOmdouaZguS4jSBmb3JrIgorCisjOiBtYWluLmM6MjM4MgorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpIOaooeW8jyAo5ZCMIFwidmlcIikiCisKKyM6IG1haW4uYzoyMzgzCittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0RXgg5qih5byPICjlkIwgXCJleFwiKSIKKworIzogbWFpbi5jOjIzODQKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx05a6J6Z2cIChiYXRjaCkg5qih5byPICjlj6rog73oiIcgXCJleFwiIOS4gOi1t+S9v+eUqCkiCisKKyM6IG1haW4uYzoyMzg2Cittc2dpZCAiLWRcdFx0XHREaWZmIG1vZGUgKGxpa2UgXCJ2aW1kaWZmXCIpIgorbXNnc3RyICItZFx0XHRcdERpZmYg5qih5byPICjlkIwgXCJ2aW1kaWZmXCIsIOWPr+i/hemAn+avlOi8g+WFqeaqlOahiOS4jeWQjOiZlSkiCisKKyM6IG1haW4uYzoyMzg4Cittc2dpZCAiLXlcdFx0XHRFYXN5IG1vZGUgKGxpa2UgXCJldmltXCIsIG1vZGVsZXNzKSIKK21zZ3N0ciAiLXlcdFx0XHTnsKHmmJPmqKHlvI8gKOWQjCBcImV2aW1cIiwgbW9kZWxlc3MpIgorCisjOiBtYWluLmM6MjM4OQorbXNnaWQgIi1SXHRcdFx0UmVhZG9ubHkgbW9kZSAobGlrZSBcInZpZXdcIikiCittc2dzdHIgIi1SXHRcdFx05ZSv6K6A5qih5byPICjlkIwgXCJ2aWV3XCIpIgorCisjOiBtYWluLmM6MjM5MAorbXNnaWQgIi1aXHRcdFx0UmVzdHJpY3RlZCBtb2RlIChsaWtlIFwicnZpbVwiKSIKK21zZ3N0ciAiLVpcdFx0XHTpmZDliLbmqKHlvI8gKOWQjCBcInJ2aW1cIikiCisKKyM6IG1haW4uYzoyMzkxCittc2dpZCAiLW1cdFx0XHRNb2RpZmljYXRpb25zICh3cml0aW5nIGZpbGVzKSBub3QgYWxsb3dlZCIKK21zZ3N0ciAiLW1cdFx0XHTkuI3lj6/kv67mlLkgKOWvq+WFpeaqlOahiCkiCisKKyM6IG1haW4uYzoyMzkyCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx05LiN5Y+v5L+u5pS55paH5a2XIgorCisjOiBtYWluLmM6MjM5MworbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx05LqM6YCy5L2N5qih5byPIgorCisjOiBtYWluLmM6MjM5NQorbXNnaWQgIi1sXHRcdFx0TGlzcCBtb2RlIgorbXNnc3RyICItbFx0XHRcdExpc3Ag5qih5byPIgorCisjOiBtYWluLmM6MjM5NworbXNnaWQgIi1DXHRcdFx0Q29tcGF0aWJsZSB3aXRoIFZpOiAnY29tcGF0aWJsZSciCittc2dzdHIgIi1DXHRcdFx0J2NvbXBhdGlibGUnIOWCs+e1sSBWaSDnm7jlrrnmqKHlvI8iCisKKyM6IG1haW4uYzoyMzk4Cittc2dpZCAiLU5cdFx0XHROb3QgZnVsbHkgVmkgY29tcGF0aWJsZTogJ25vY29tcGF0aWJsZSciCittc2dzdHIgIi1OXHRcdFx0J25vY29tcGF0aWJsZScg5LiN5a6M5YWo6IiH5YKz57WxIFZpIOebuOWuue+8jOWPr+S9v+eUqCBWaW0g5Yqg5by36IO95YqbIgorCisjOiBtYWluLmM6MjM5OQorbXNnaWQgIi1WW05dXHRcdFZlcmJvc2UgbGV2ZWwiCittc2dzdHIgIi1WW05dXHRcdFZlcmJvc2Ug562J57SaIgorCisjOiBtYWluLmM6MjQwMAorbXNnaWQgIi1EXHRcdFx0RGVidWdnaW5nIG1vZGUiCittc2dzdHIgIi1EXHRcdFx06Zmk6Yyv5qih5byPIgorCisjOiBtYWluLmM6MjQwMQorbXNnaWQgIi1uXHRcdFx0Tm8gc3dhcCBmaWxlLCB1c2UgbWVtb3J5IG9ubHkiCittc2dzdHIgIi1uXHRcdFx05LiN5L2/55So5pqr5a2Y5qqULCDlj6rkvb/nlKjoqJjmhrbpq5QiCisKKyM6IG1haW4uYzoyNDAyCittc2dpZCAiLXJcdFx0XHRMaXN0IHN3YXAgZmlsZXMgYW5kIGV4aXQiCittc2dzdHIgIi1yXHRcdFx05YiX5Ye65pqr5a2Y5qqU5b6M6Zui6ZaLIgorCisjOiBtYWluLmM6MjQwMworbXNnaWQgIi1yICh3aXRoIGZpbGUgbmFtZSlcdFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uIgorbXNnc3RyICItciAo5Yqg5qqU5ZCNKSAgICAgICBcdOS/ruW+qeS4iuasoeaQjeavgOeahOizh+aWmShSZWNvdmVyIGNyYXNoZWQgc2Vzc2lvbikiCisKKyM6IG1haW4uYzoyNDA0Cittc2dpZCAiLUxcdFx0XHRTYW1lIGFzIC1yIgorbXNnc3RyICItTFx0XHRcdOWQjCAtciIKKworIzogbWFpbi5jOjI0MDYKK21zZ2lkICItZlx0XHRcdERvbid0IHVzZSBuZXdjbGkgdG8gb3BlbiB3aW5kb3ciCittc2dzdHIgIi1mXHRcdFx05LiN5L2/55SoIG5ld2NsaSDkvobplovllZ/oppbnqpciCisKKyM6IG1haW4uYzoyNDA3Cittc2dpZCAiLWRldiA8ZGV2aWNlPlx0XHRVc2UgPGRldmljZT4gZm9yIEkvTyIKK21zZ3N0ciAiLWRldiA8ZGV2aWNlPlx0XHTkvb/nlKggPGRldmljZT4g5YGa6Ly45Ye65YWlIgorCisjOiBtYWluLmM6MjQxMAorbXNnaWQgIi1IXHRcdFx0U3RhcnQgaW4gSGVicmV3IG1vZGUiCittc2dzdHIgIi1IXHRcdFx05ZWf5YuV54K6IEhlYnJldyDmqKHlvI8iCisKKyM6IG1haW4uYzoyNDEzCittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdOWVn+WLleeCuiBGYXJzaSDmqKHlvI8iCisKKyM6IG1haW4uYzoyNDE1Cittc2dpZCAiLVQgPHRlcm1pbmFsPlx0U2V0IHRlcm1pbmFsIHR5cGUgdG8gPHRlcm1pbmFsPiIKK21zZ3N0ciAiLVQgPHRlcm1pbmFsPlx06Kit5a6a57WC56uv5qmf54K6IDx0ZXJtaW5hbD4iCisKKyM6IG1haW4uYzoyNDE2Cittc2dpZCAiLXUgPHZpbXJjPlx0XHRVc2UgPHZpbXJjPiBpbnN0ZWFkIG9mIGFueSAudmltcmMiCittc2dzdHIgIi11IDx2aW1yYz5cdFx05L2/55SoIDx2aW1yYz4g5Y+W5Luj5Lu75L2VIC52aW1yYyIKKworIzogbWFpbi5jOjI0MTgKK21zZ2lkICItVSA8Z3ZpbXJjPlx0XHRVc2UgPGd2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLmd2aW1yYyIKK21zZ3N0ciAiLVUgPGd2aW1yYz5cdFx05L2/55SoIDxndmltcmM+IOWPluS7o+S7u+S9lSAuZ3ZpbXJjIgorCisjOiBtYWluLmM6MjQyMAorbXNnaWQgIi0tbm9wbHVnaW5cdFx0RG9uJ3QgbG9hZCBwbHVnaW4gc2NyaXB0cyIKK21zZ3N0ciAiLS1ub3BsdWdpblx0XHTkuI3ovInlhaXku7vkvZUgcGx1Z2luIgorCisjOiBtYWluLmM6MjQyMQorbXNnaWQgIi1vW05dXHRcdE9wZW4gTiB3aW5kb3dzIChkZWZhdWx0OiBvbmUgZm9yIGVhY2ggZmlsZSkiCittc2dzdHIgIi1vW05dXHRcdOmWi+WVnyBOIOWAi+imlueqlyAo6aCQ6Kit5piv5q+P5YCL5qqU5qGI5LiA5YCLKSIKKworIzogbWFpbi5jOjI0MjIKK21zZ2lkICItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHTlkIwgLW8g5L2G5L2/55So5Z6C55u05YiG5YmyIgorCisjOiBtYWluLmM6MjQyMworbXNnaWQgIitcdFx0XHRTdGFydCBhdCBlbmQgb2YgZmlsZSIKK21zZ3N0ciAiK1x0XHRcdOWVn+WLleW+jOi3s+WIsOaqlOahiOe1kOWwviIKKworIzogbWFpbi5jOjI0MjQKK21zZ2lkICIrPGxudW0+XHRcdFN0YXJ0IGF0IGxpbmUgPGxudW0+IgorbXNnc3RyICIrPGxudW0+XHRcdOWVn+WLleW+jOi3s+WIsOesrCA8bG51bT4g6KGMIgorCisjOiBtYWluLmM6MjQyNgorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxjb21tYW5kPlx06LyJ5YWl5Lu75L2VIHZpbXJjIOWJjeWft+ihjCA8Y29tbWFuZD4iCisKKyM6IG1haW4uYzoyNDI4Cittc2dpZCAiLWMgPGNvbW1hbmQ+XHRcdEV4ZWN1dGUgPGNvbW1hbmQ+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1jIDxjb21tYW5kPlx0XHTovInlhaXnrKzkuIDlgIvmqpTmoYjlvozln7fooYwgPGNvbW1hbmQ+IgorCisjOiBtYWluLmM6MjQyOQorbXNnaWQgIi1TIDxzZXNzaW9uPlx0XHRTb3VyY2UgZmlsZSA8c2Vzc2lvbj4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLVMgPHNlc3Npb24+XHRcdOi8ieWFpeesrOS4gOWAi+aqlOahiOW+jOi8ieWFpSBTZXNzaW9uIOaqlCA8c2Vzc2lvbj4iCisKKyM6IG1haW4uYzoyNDMwCittc2dpZCAiLXMgPHNjcmlwdGluPlx0UmVhZCBOb3JtYWwgbW9kZSBjb21tYW5kcyBmcm9tIGZpbGUgPHNjcmlwdGluPiIKK21zZ3N0ciAiLXMgPHNjcmlwdGluPlx05b6eIDxzY3JpcHRpbj4g6K6A5YWl5LiA6Iis5qih5byP5ZG95LukIgorCisjOiBtYWluLmM6MjQzMQorbXNnaWQgIi13IDxzY3JpcHRvdXQ+XHRBcHBlbmQgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi13IDxzY3JpcHRvdXQ+XHTlsI3mqpTmoYggPHNjcmlwdG91dD4g6ZmE5YqgKGFwcGVuZCnmiYDmnInovLjlhaXnmoTlkb3ku6QiCisKKyM6IG1haW4uYzoyNDMyCittc2dpZCAiLVcgPHNjcmlwdG91dD5cdFdyaXRlIGFsbCB0eXBlZCBjb21tYW5kcyB0byBmaWxlIDxzY3JpcHRvdXQ+IgorbXNnc3RyICItVyA8c2NyaXB0b3V0Plx05bCN5qqU5qGIIDxzY3JpcHRvdXQ+IOWvq+WFpeaJgOaciei8uOWFpeeahOWRveS7pCIKKworIzogbWFpbi5jOjI0MzQKK21zZ2lkICIteFx0XHRcdEVkaXQgZW5jcnlwdGVkIGZpbGVzIgorbXNnc3RyICIteFx0XHRcdOe3qOi8r+e3qOeivOmBjueahOaqlOahiCIKKworIzogbWFpbi5jOjI0MzgKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHTlsIcgdmltIOiIh+aMh+WumueahCBYLXNlcnZlciDpgKPnt5oiCisKKyM6IG1haW4uYzoyNDQwCittc2dpZCAiLVhcdFx0XHREbyBub3QgY29ubmVjdCB0byBYIHNlcnZlciIKK21zZ3N0ciAiLVhcdFx0XHTkuI3opoHpgKPnt5rliLAgWCBTZXJ2ZXIiCisKKyM6IG1haW4uYzoyNDQzCittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVzPlx057eo6LyvIFZpbSDkvLrmnI3lmajkuIrnmoQgPGZpbGVzPiDlvozpm6LplosiCisKKyM6IG1haW4uYzoyNDQ0Cittc2dpZCAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIFNhbWUsIGRvbid0IGNvbXBsYWluIGlmIHRoZXJlIGlzIG5vIHNlcnZlciIKK21zZ3N0ciAiLS1yZW1vdGUtc2lsZW50IDxmaWxlcz4gIOebuOWQjO+8jOS9huaykuacieS8uuacjeWZqOaZguS4jeitpuWRiiIKKworIzogbWFpbi5jOjI0NDUKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICBBcyAtLXJlbW90ZSBidXQgd2FpdCBmb3IgZmlsZXMgdG8gaGF2ZSBiZWVuIGVkaXRlZCIKK21zZ3N0ciAiLS1yZW1vdGUtd2FpdCA8ZmlsZXM+ICDlkIwgLS1yZW1vdGUsIOS9huacg+etieWAmeaqlOahiOWujOaIkOe3qOi8ryIKKworIzogbWFpbi5jOjI0NDYKK21zZ2lkICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICIiCisiLS1yZW1vdGUtd2FpdC1zaWxlbnQgPGZpbGVzPiAg55u45ZCM77yM5L2G5rKS5Ly65pyN5Zmo5pmC5LiN6K2m5ZGKIgorCisjOiBtYWluLmM6MjQ0NworbXNnaWQgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHRTZW5kIDxrZXlzPiB0byBhIFZpbSBzZXJ2ZXIgYW5kIGV4aXQiCittc2dzdHIgIi0tcmVtb3RlLXNlbmQgPGtleXM+XHTpgIHlh7ogPGtleXM+IOWIsCBWaW0g5Ly65pyN5Zmo5Lim6Zui6ZaLIgorCisjOiBtYWluLmM6MjQ0OAorbXNnaWQgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHRFdmFsdWF0ZSA8ZXhwcj4gaW4gYSBWaW0gc2VydmVyIGFuZCBwcmludCByZXN1bHQiCittc2dzdHIgIi0tcmVtb3RlLWV4cHIgPGV4cHI+XHTlnKjkvLrmnI3lmajkuIrln7fooYwgPGV4cHI+IOS4puWNsOWHuue1kOaenCIKKworIzogbWFpbi5jOjI0NDkKK21zZ2lkICItLXNlcnZlcmxpc3RcdFx0TGlzdCBhdmFpbGFibGUgVmltIHNlcnZlciBuYW1lcyBhbmQgZXhpdCIKK21zZ3N0ciAiLS1zZXJ2ZXJsaXN0XHRcdOWIl+WHuuWPr+eUqOeahCBWaW0g5Ly65pyN5Zmo5ZCN56ix5Lim6Zui6ZaLIgorCisjOiBtYWluLmM6MjQ1MAorbXNnaWQgIi0tc2VydmVybmFtZSA8bmFtZT5cdFNlbmQgdG8vYmVjb21lIHRoZSBWaW0gc2VydmVyIDxuYW1lPiIKK21zZ3N0ciAiLS1zZXJ2ZXJuYW1lIDxuYW1lPlx06YCB6IezL+aIkOeCuiBWaW0g5Ly65pyN5ZmoIDxuYW1lPiIKKworIzogbWFpbi5jOjI0NTMKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx05L2/55SoIDx2aW1pbmZvPiDogIzpnZ4gLnZpbWluZm8iCisKKyM6IG1haW4uYzoyNDU1Cittc2dpZCAiLWggIG9yICAtLWhlbHBcdFByaW50IEhlbHAgKHRoaXMgbWVzc2FnZSkgYW5kIGV4aXQiCittc2dzdHIgIi1oICDmiJYgIC0taGVscFx05Y2w5Ye66Kqq5piOKOS5n+WwseaYr+acrOioiuaBrynlvozpm6LplosiCisKKyM6IG1haW4uYzoyNDU2Cittc2dpZCAiLS12ZXJzaW9uXHRcdFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHTljbDlh7rniYjmnKzos4foqIrlvozpm6LplosiCisKKyM6IG1haW4uYzoyNDYwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSDoqo3lvpfnmoTlj4PmlbggKE1vdGlmIOeJiCk6XG4iCisKKyM6IG1haW4uYzoyNDYzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0g6KqN5b6X55qE5Y+D5pW4IChBdGhlbmEg54mIKTpcbiIKKworIzogbWFpbi5jOjI0NjYKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdOWcqOimlueqlyA8ZGlzcGxheT4g5Z+36KGMIHZpbSIKKworIzogbWFpbi5jOjI0NjcKK21zZ2lkICItaWNvbmljXHRcdFN0YXJ0IHZpbSBpY29uaWZpZWQiCittc2dzdHIgIi1pY29uaWNcdFx05ZWf5YuV5b6M5ZyW56S65YyWKGljb25pZmllZCkiCisKKyM6IG1haW4uYzoyNDY5Cittc2dpZCAiLW5hbWUgPG5hbWU+XHRcdFVzZSByZXNvdXJjZSBhcyBpZiB2aW0gd2FzIDxuYW1lPiIKK21zZ3N0ciAiLW5hbWUgPG5hbWU+XHRcdOiugOWPliBSZXNvdXJjZSDmmYLmioogdmltIOeahOWQjeeoseimlueCuiA8bmFtZT4iCisKKyM6IG1haW4uYzoyNDcwCittc2dpZCAiXHRcdFx0ICAoVW5pbXBsZW1lbnRlZClcbiIKK21zZ3N0ciAiXHRcdFx0ICAo5bCa5pyq5a+m5L2cKVxuIgorCisjOiBtYWluLmM6MjQ3MgorbXNnaWQgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciB0aGUgYmFja2dyb3VuZCAoYWxzbzogLWJnKSIKK21zZ3N0ciAiLWJhY2tncm91bmQgPGNvbG9yPlx06Kit5a6aIDxjb2xvcj4g54K66IOM5pmv6ImyICjkuZ/lj6/nlKggLWJnKSIKKworIzogbWFpbi5jOjI0NzMKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdOioreWumiA8Y29sb3I+IOeCuuS4gOiIrOaWh+Wtl+mhj+iJsiAo5Lmf5Y+v55SoIC1mZykiCisKKyM6IG1haW4uYzoyNDc0IG1haW4uYzoyNDk0Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdOS9v+eUqCA8Zm9udD4g54K65LiA6Iis5a2X5Z6LICjkuZ/lj6/nlKggLWZuKSIKKworIzogbWFpbi5jOjI0NzUKK21zZ2lkICItYm9sZGZvbnQgPGZvbnQ+XHRVc2UgPGZvbnQ+IGZvciBib2xkIHRleHQiCittc2dzdHIgIi1ib2xkZm9udCA8Zm9udD5cdOS9v+eUqCA8Zm9udD4g54K657KX6auU5a2X5Z6LIgorCisjOiBtYWluLmM6MjQ3NgorbXNnaWQgIi1pdGFsaWNmb250IDxmb250Plx0VXNlIDxmb250PiBmb3IgaXRhbGljIHRleHQiCittc2dzdHIgIi1pdGFsaWNmb250IDxmb250Plx05L2/55SoIDxmb250PiDngrrmlpzpq5TlrZflnosiCisKKyM6IG1haW4uYzoyNDc3IG1haW4uYzoyNDk1Cittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHTkvb/nlKg8Z2VvbT7ngrrotbflp4vkvY3nva4gKOS5n+WPr+eUqCAtZ2VvbSkiCisKKyM6IG1haW4uYzoyNDc4Cittc2dpZCAiLWJvcmRlcndpZHRoIDx3aWR0aD5cdFVzZSBhIGJvcmRlciB3aWR0aCBvZiA8d2lkdGg+IChhbHNvOiAtYncpIgorbXNnc3RyICItYm9yZGVyd2lkdGggPHdpZHRoPlx05L2/55So5a+s5bqm54K6IDx3aWR0aD4g55qE6YKK5qGGICjkuZ/lj6/nlKggLWJ3KSIKKworIzogbWFpbi5jOjI0NzkKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICDoqK3lrprmjbLli5Xou7jlr6zluqbngrogPHdpZHRoPiAo5Lmf5Y+v55SoIC1zdykiCisKKyM6IG1haW4uYzoyNDgxCittc2dpZCAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdFVzZSBhIG1lbnUgYmFyIGhlaWdodCBvZiA8aGVpZ2h0PiAoYWxzbzogLW1oKSIKK21zZ3N0ciAiLW1lbnVoZWlnaHQgPGhlaWdodD5cdOioreWumumBuOWWruWIl+eahOmrmOW6pueCuiA8aGVpZ2h0PiAo5Lmf5Y+v55SoIC1taCkiCisKKyM6IG1haW4uYzoyNDgzIG1haW4uYzoyNDk2Cittc2dpZCAiLXJldmVyc2VcdFx0VXNlIHJldmVyc2UgdmlkZW8gKGFsc286IC1ydikiCittc2dzdHIgIi1yZXZlcnNlXHRcdOS9v+eUqOWPjeebuOmhr+ekuiAo5Lmf5Y+v55SoIC1ydikiCisKKyM6IG1haW4uYzoyNDg0Cittc2dpZCAiK3JldmVyc2VcdFx0RG9uJ3QgdXNlIHJldmVyc2UgdmlkZW8gKGFsc286ICtydikiCittc2dzdHIgIityZXZlcnNlXHRcdOS4jeS9v+eUqOWPjeebuOmhr+ekuiAo5Lmf5Y+v55SoICtydikiCisKKyM6IG1haW4uYzoyNDg1Cittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHToqK3lrprmjIflrprnmoQgcmVzb3VyY2UiCisKKyM6IG1haW4uYzoyNDg4Cittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKFJJU0MgT1MgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIOiqjeW+l+eahOWPg+aVuCAoUklTQyBPUyDniYgpOlxuIgorCisjOiBtYWluLmM6MjQ4OQorbXNnaWQgIi0tY29sdW1ucyA8bnVtYmVyPlx0SW5pdGlhbCB3aWR0aCBvZiB3aW5kb3cgaW4gY29sdW1ucyIKK21zZ3N0ciAiLS1jb2x1bW5zIDxudW1iZXI+XHToppbnqpfliJ3lp4vljJblr6zluqYiCisKKyM6IG1haW4uYzoyNDkwCittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1iZXI+XHToppbnqpfliJ3lp4vljJbpq5jluqYiCisKKyM6IG1haW4uYzoyNDkzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEdUSysgdmVyc2lvbik6XG4iCittc2dzdHIgIiIKKyJcbiIKKyJndmltIOiqjeW+l+eahOWPg+aVuCAoR1RLKyDniYgpOlxuIgorCisjOiBtYWluLmM6MjQ5NworbXNnaWQgIi1kaXNwbGF5IDxkaXNwbGF5Plx0UnVuIHZpbSBvbiA8ZGlzcGxheT4gKGFsc286IC0tZGlzcGxheSkiCittc2dzdHIgIi1kaXNwbGF5IDxkaXNwbGF5Plx05ZyoIDxkaXNwbGF5PiDln7fooYwgdmltICjkuZ/lj6/nlKggLS1kaXNwbGF5KSIKKworIzogbWFpbi5jOjI0OTkKK21zZ2lkICItLXJvbGUgPHJvbGU+XHRTZXQgYSB1bmlxdWUgcm9sZSB0byBpZGVudGlmeSB0aGUgbWFpbiB3aW5kb3ciCittc2dzdHIgIi0tcm9sZSA8cm9sZT5cdOioreWumueNqOeJueeahOinkuiJsihyb2xlKeS7peWNgOWIhuS4u+imlueqlyIKKworIzogbWFpbi5jOjI1MDEKK21zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgorbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHTlnKjlj6bkuIDlgIsgR1RLIHdpZGdldCDlhafplovllZ8gVmltIgorCisjOiBtYWluLmM6MjUwMworbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdOmhr+ekuiBHbm9tZSDnm7jpl5zlj4PmlbgiCisKKyM6IG1haW4uYzoyNzM1Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAi54Sh6aGv56S6IgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjc1MAorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjog5YKz6YCB5aSx5pWX44CCXG4iCisKKyMuIExldCB2aW0gc3RhcnQgbm9ybWFsbHkuCisjOiBtYWluLmM6Mjc1NgorbXNnaWQgIjogU2VuZCBmYWlsZWQuIFRyeWluZyB0byBleGVjdXRlIGxvY2FsbHlcbiIKK21zZ3N0ciAiOiDpgIHlh7rlpLHmlZfjgILoqablnJblnKjmnKzlnLDln7fooYxcbiIKKworIzogbWFpbi5jOjI3OTQgbWFpbi5jOjI4MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgb2YgJWQgZWRpdGVkIgorbXNnc3RyICLlt7Lnt6jovK8gJWQvJWQg5YCL5qqU5qGIIgorCisjOiBtYWluLmM6MjgzNworbXNnaWQgIk5vIGRpc3BsYXk6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIueEoSBEaXNwbGF5OiDnhKHms5XlgrPpgIHpgYvnrpflvI/jgIJcbiIKKworIzogbWFpbi5jOjI4NDkKK21zZ2lkICI6IFNlbmQgZXhwcmVzc2lvbiBmYWlsZWQuXG4iCittc2dzdHIgIjog54Sh5rOV5YKz6YCB6YGL566X5byP44CCXG4iCisKKyM6IG1hcmsuYzo2NTYKK21zZ2lkICJObyBtYXJrcyBzZXQiCittc2dzdHIgIuaykuacieioreWumuaomeiomCAobWFyaykiCisKKyM6IG1hcmsuYzo2NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4MzogTm8gbWFya3MgbWF0Y2hpbmcgXCIlc1wiIgorbXNnc3RyICJFMjgzOiDmib7kuI3liLDnrKblkIggXCIlc1wiIOeahOaomeiomChtYXJrKSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjY5Cittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIuaomeiomCDooYzomZ8gIOashCAg5qqU5qGIL+aWh+WtlyIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzA3Cittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIganVtcCDooYzomZ8gIOashCAg5qqU5qGIL+aWh+WtlyIKKworIzogbWFyay5jOjEwNzIKK21zZ2lkICIiCisiXG4iCisiIyBGaWxlIG1hcmtzOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyDmqpTmoYjmqJnoqJg6XG4iCisKKyMuIFdyaXRlIHRoZSBqdW1wbGlzdCB3aXRoIC0nCisjOiBtYXJrLmM6MTEwNworbXNnaWQgIiIKKyJcbiIKKyIjIEp1bXBsaXN0IChuZXdlc3QgZmlyc3QpOlxuIgorbXNnc3RyICIiCisiXG4iCisiIyBKdW1wbGlzdCAo55Sx5paw5Yiw6IiKKTpcbiIKKworIzogbWFyay5jOjEyMDIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIOaqlOahiOWFpyBNYXJrIOiomOmMhCAo55Sx5paw5Yiw6IiKKTpcbiIKKworIzogbWFyay5jOjEyODUKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAi57y65bCR5bCN5oeJ55qEICc+JyIKKworIzogbWJ5dGUuYzo0MDMKK21zZ2lkICJFNTQzOiBOb3QgYSB2YWxpZCBjb2RlcGFnZSIKK21zZ3N0ciAiRTU0Mzog5LiN5q2j56K655qEIGNvZGVwYWdlIgorCisjOiBtYnl0ZS5jOjM4NzkKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDog5LiN6IO96Kit5a6aIElDIOaVuOWAvCIKKworIzogbWJ5dGUuYzo0MDMxCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiDnhKHms5Xlu7rnq4sgaW5wdXQgY29udGV4dCIKKworIzogbWJ5dGUuYzo0MTc4Cittc2dpZCAiRTI4NjogRmFpbGVkIHRvIG9wZW4gaW5wdXQgbWV0aG9kIgorbXNnc3RyICJFMjg2OiDnhKHms5XplovllZ/ovLjlhaXms5UiCisKKyM6IG1ieXRlLmM6NDE4OQorbXNnaWQgIkUyODc6IFdhcm5pbmc6IENvdWxkIG5vdCBzZXQgZGVzdHJveSBjYWxsYmFjayB0byBJTSIKK21zZ3N0ciAiRTI4Nzog6K2m5ZGKOiDnhKHms5Xnp7vpmaQgSU0g55qEIGNhbGxiYWNrIgorCisjOiBtYnl0ZS5jOjQxOTUKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODog6Ly45YWl5rOV5LiN5pSv5o+05Lu75L2VIHN0eWxlIgorCisjOiBtYnl0ZS5jOjQyNTIKK21zZ2lkICJFMjg5OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IG15IHByZWVkaXQgdHlwZSIKK21zZ3N0ciAiRTI4OTog6Ly45YWl5rOV5LiN5pSv5o+05Lu75L2VIHN0eWxlIgorCisjOiBtYnl0ZS5jOjQzMjYKK21zZ2lkICJFMjkwOiBvdmVyLXRoZS1zcG90IHN0eWxlIHJlcXVpcmVzIGZvbnRzZXQiCittc2dzdHIgIkUyOTA6IG92ZXItdGhlLXNwb3Qg6ZyA6KaB5a2X5Z6L6ZuGKEZvbnRzZXQpIgorCisjOiBtYnl0ZS5jOjQzNTgKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IOS9oOeahCBHVEsrIOavlCAxLjIuMyDpgoToiIrjgILnhKHms5Xkvb/nlKjni4DmhYvljYDjgIIiCisKKyM6IG1ieXRlLmM6NDYzNworbXNnaWQgIkUyOTI6IElucHV0IE1ldGhvZCBTZXJ2ZXIgaXMgbm90IHJ1bm5pbmciCittc2dzdHIgIkUyOTI6IOaykuacieWft+ihjOS4reeahOi8uOWFpeazleeuoeeQhueoi+W8jyhJbnB1dCBNZXRob2QgU2VydmVyKSIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiDljYDloYrmnKrooqvpjpblrpoiCisKKyM6IG1lbWZpbGUuYzo5ODkKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiDmmqvlrZjmqpToroDlj5bpjK/oqqQiCisKKyM6IG1lbWZpbGUuYzo5OTQKK21zZ2lkICJFMjk1OiBSZWFkIGVycm9yIGluIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTI5NTog5pqr5a2Y5qqU6K6A5Y+W6Yyv6KqkIgorCisjOiBtZW1maWxlLmM6MTA0NgorbXNnaWQgIkUyOTY6IFNlZWsgZXJyb3IgaW4gc3dhcCBmaWxlIHdyaXRlIgorbXNnc3RyICJFMjk2OiDmmqvlrZjmqpTlr6vlhaXpjK/oqqQiCisKKyM6IG1lbWZpbGUuYzoxMDY0Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiDmmqvlrZjmqpTlr6vlhaXpjK/oqqQiCisKKyM6IG1lbWZpbGUuYzoxMjYxCittc2dpZCAiRTMwMDogU3dhcCBmaWxlIGFscmVhZHkgZXhpc3RzIChzeW1saW5rIGF0dGFjaz8pIgorbXNnc3RyICJFMzAwOiDmmqvlrZjmqpTlt7LntpPlrZjlnKghICjlsI/lv4PnrKbomZ/pgKPntZDnmoTlronlhajmvI/mtJ4hPykiCisKKyM6IG1lbWxpbmUuYzoyNzUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDA/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDljYDloYogMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDljYDloYogMT8iCisKKyM6IG1lbWxpbmUuYzozMzMKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDI/IgorbXNnc3RyICJFMjk4OiDmib7kuI3liLDljYDloYogMj8iCisKKyMuIGNvdWxkIG5vdCAocmUpb3BlbiB0aGUgc3dhcCBmaWxlLCB3aGF0IGNhbiB3ZSBkbz8/Pz8KKyM6IG1lbWxpbmUuYzo0NDMKK21zZ2lkICJFMzAxOiBPb3BzLCBsb3N0IHRoZSBzd2FwIGZpbGUhISEiCittc2dzdHIgIkUzMDE6IOWZouWZoiwg5pqr5a2Y5qqU5LiN6KaL5LqGISEhIgorCisjOiBtZW1saW5lLmM6NDQ4Cittc2dpZCAiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDI6IOeEoeazleaUueiuiuaaq+WtmOaqlOeahOWQjeeosSIKKworIzogbWVtbGluZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzAzOiBVbmFibGUgdG8gb3BlbiBzd2FwIGZpbGUgZm9yIFwiJXNcIiwgcmVjb3ZlcnkgaW1wb3NzaWJsZSIKK21zZ3N0ciAiRTMwMzog54Sh5rOV6ZaL5ZWf5pqr5a2Y5qqUIFwiJXNcIiwg5LiN5Y+v6IO95L+u5b6p5LqGIgorCisjOiBtZW1saW5lLmM6NjE3Cittc2dpZCAiRTMwNDogbWxfdGltZXN0YW1wOiBEaWRuJ3QgZ2V0IGJsb2NrIDA/PyIKK21zZ3N0ciAiRTMwNDogbWxfdGltZXN0YW1wOiDmib7kuI3liLDljYDloYogMD8/IgorCisjOiBtZW1saW5lLmM6NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDU6IE5vIHN3YXAgZmlsZSBmb3VuZCBmb3IgJXMiCittc2dzdHIgIkUzMDU6IOaJvuS4jeWIsCAlcyDnmoTmmqvlrZjmqpQiCisKKyM6IG1lbWxpbmUuYzo3NjcKK21zZ2lkICJFbnRlciBudW1iZXIgb2Ygc3dhcCBmaWxlIHRvIHVzZSAoMCB0byBxdWl0KTogIgorbXNnc3RyICLoq4vpgbjmk4fkvaDopoHkvb/nlKjnmoTmmqvlrZjmqpQgKOaMiTAg6Zui6ZaLKTogIgorCisjOiBtZW1saW5lLmM6ODEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDY6IENhbm5vdCBvcGVuICVzIgorbXNnc3RyICJFMzA2OiDnhKHms5XplovllZ8gJXMiCisKKyM6IG1lbWxpbmUuYzo4MzQKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBibG9jayAwIGZyb20gIgorbXNnc3RyICLnhKHms5XoroDlj5bljYDloYogMDoiCisKKyM6IG1lbWxpbmUuYzo4MzcKK21zZ2lkICIiCisiXG4iCisiTWF5YmUgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgb3IgVmltIGRpZCBub3QgdXBkYXRlIHRoZSBzd2FwIGZpbGUuIgorbXNnc3RyICIiCisiXG4iCisi5Y+v6IO95piv5L2g5rKS5YGa6YGO5Lu75L2V5L+u5pS55oiW5pivIFZpbSDpgoTkvobkuI3lj4rmm7TmlrDmmqvlrZjmqpQuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIg54Sh5rOV5Zyo5pys54mI5pys55qEIFZpbSDkuK3kvb/nlKguXG4iCisKKyM6IG1lbWxpbmUuYzo4NDkKK21zZ2lkICJVc2UgVmltIHZlcnNpb24gMy4wLlxuIgorbXNnc3RyICLkvb/nlKggVmltIDMuMOOAglxuIgorCisjOiBtZW1saW5lLmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDc6ICVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIFZpbSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDc6ICVzIOeci+i1t+S+huS4jeWDj+aYryBWaW0g5pqr5a2Y5qqUIgorCisjOiBtZW1saW5lLmM6ODY4Cittc2dpZCAiIGNhbm5vdCBiZSB1c2VkIG9uIHRoaXMgY29tcHV0ZXIuXG4iCittc2dzdHIgIiDnhKHms5XlnKjpgJnoh7rpm7vohabkuIrkvb/nlKguXG4iCisKKyM6IG1lbWxpbmUuYzo4NzAKK21zZ2lkICJUaGUgZmlsZSB3YXMgY3JlYXRlZCBvbiAiCittc2dzdHIgIuacrOaqlOahiOW7uueri+aWvCAiCisKKyM6IG1lbWxpbmUuYzo4NzQKK21zZ2lkICIiCisiLFxuIgorIm9yIHRoZSBmaWxlIGhhcyBiZWVuIGRhbWFnZWQuIgorbXNnc3RyICIiCisiLFxuIgorIuaIluaYr+mAmeaqlOahiOW3sue2k+aQjeavgOOAgiIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICLkvb/nlKjmmqvlrZjmqpQgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIk9yaWdpbmFsIGZpbGUgXCIlc1wiIgorbXNnc3RyICLljp/lp4vmqpQgXCIlc1wiIgorCisjOiBtZW1saW5lLmM6OTIyCittc2dpZCAiRTMwODogV2FybmluZzogT3JpZ2luYWwgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQiCittc2dzdHIgIkUzMDg6IOitpuWRijog5Y6f5aeL5qqU5qGI5Y+v6IO95bey57aT5L+u5pS56YGO5LqGIgorCisjOiBtZW1saW5lLmM6OTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDk6IFVuYWJsZSB0byByZWFkIGJsb2NrIDEgZnJvbSAlcyIKK21zZ3N0ciAiRTMwOTog54Sh5rOV5b6eICVzIOiugOWPluWNgOWhiiAxIgorCisjOiBtZW1saW5lLmM6OTY3Cittc2dpZCAiPz8/TUFOWSBMSU5FUyBNSVNTSU5HIgorbXNnc3RyICI/Pz/nvLrlsJHlpKrlpJrooYwiCisKKyM6IG1lbWxpbmUuYzo5ODMKK21zZ2lkICI/Pz9MSU5FIENPVU5UIFdST05HIgorbXNnc3RyICI/Pz/ooYzomZ/pjK/oqqQiCisKKyM6IG1lbWxpbmUuYzo5OTAKK21zZ2lkICI/Pz9FTVBUWSBCTE9DSyIKK21zZ3N0ciAiPz8/56m655qEIEJMT0NLIgorCisjOiBtZW1saW5lLmM6MTAxNgorbXNnaWQgIj8/P0xJTkVTIE1JU1NJTkciCittc2dzdHIgIj8/P+aJvuS4jeWIsOS4gOS6m+ihjCIKKworIzogbWVtbGluZS5jOjEwNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxMDogQmxvY2sgMSBJRCB3cm9uZyAoJXMgbm90IGEgLnN3cCBmaWxlPykiCittc2dzdHIgIkUzMTA6IOWNgOWhiiAxIElEIOmMr+iqpCAoJXMg5LiN5piv5pqr5a2Y5qqUPykiCisKKyM6IG1lbWxpbmUuYzoxMDUzCittc2dpZCAiPz8/QkxPQ0sgTUlTU0lORyIKK21zZ3N0ciAiPz8/5om+5LiN5YiwQkxPQ0siCisKKyM6IG1lbWxpbmUuYzoxMDY5Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGJlIG1lc3NlZCB1cCIKK21zZ3N0ciAiPz8/IOW+numAmeijoeWIsCA/Pz9FTkQg55qE5YWn5a655Y+v6IO95pyJ5ZWP6aGMIgorCisjOiBtZW1saW5lLmM6MTA4NQorbXNnaWQgIj8/PyBmcm9tIGhlcmUgdW50aWwgPz8/RU5EIGxpbmVzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQvZGVsZXRlZCIKK21zZ3N0ciAiPz8/IOW+numAmeijoeWIsCA/Pz9FTkQg55qE5YWn5a655Y+v6IO96KKr5Yiq6ZmkL+aPkuWFpemBjiIKKworIyBkbyBub3QgdHJhbnNsYXRlCisjOiBtZW1saW5lLmM6MTEwNQorbXNnaWQgIj8/P0VORCIKK21zZ3N0ciAiPz8/RU5EIgorCisjOiBtZW1saW5lLmM6MTEzMQorbXNnaWQgIkUzMTE6IFJlY292ZXJ5IEludGVycnVwdGVkIgorbXNnc3RyICJFMzExOiDkv67lvqnlt7LkuK3mlrciCisKKyM6IG1lbWxpbmUuYzoxMTMzCittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjog5L+u5b6p5pmC55m855Sf6Yyv6KqkOyDoq4vms6jmhI/plovpoK3ngrogPz8/IOeahOihjCIKKworIzogbWVtbGluZS5jOjExMzYKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIuW+qeWOn+WujOaIkC4g6KuL56K65a6a5LiA5YiH5q2j5bi4LiIKKworIzogbWVtbGluZS5jOjExMzcKK21zZ2lkICIiCisiXG4iCisiKFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIG91dCB0aGlzIGZpbGUgdW5kZXIgYW5vdGhlciBuYW1lXG4iCittc2dzdHIgIiIKKyJcbiIKKyIo5L2g5Y+v6IO95pyD5oOz6KaB5oqK6YCZ5YCL5qqU5qGI5Y+m5a2Y5Yil55qE5qqU5ZCN77yMXG4iCisKKyM6IG1lbWxpbmUuYzoxMTM4Cittc2dpZCAiYW5kIHJ1biBkaWZmIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMpXG4iCittc2dzdHIgIuWGjeWft+ihjCBkaWZmIOiIh+WOn+aqlOahiOavlOi8g+S7peaqouafpeaYr+WQpuacieaUueiuiilcbiIKKworIzogbWVtbGluZS5jOjExMzkKK21zZ2lkICIiCisiRGVsZXRlIHRoZSAuc3dwIGZpbGUgYWZ0ZXJ3YXJkcy5cbiIKKyJcbiIKK21zZ3N0ciAiIgorIihEKeebtOaOpeWIqumZpCAuc3dwIOaaq+WtmOaqlFxuIgorIlxuIgorCisjLiB1c2UgbXNnKCkgdG8gc3RhcnQgdGhlIHNjcm9sbGluZyBwcm9wZXJseQorIzogbWVtbGluZS5jOjExOTUKK21zZ2lkICJTd2FwIGZpbGVzIGZvdW5kOiIKK21zZ3N0ciAi5om+5Yiw5Lul5LiL55qE5pqr5a2Y5qqUOiIKKworIzogbWVtbGluZS5jOjEzNzMKK21zZ2lkICIgICBJbiBjdXJyZW50IGRpcmVjdG9yeTpcbiIKK21zZ3N0ciAiICAg5Zyo55uu5YmN55qE55uu6YyEOlxuIgorCisjOiBtZW1saW5lLmM6MTM3NQorbXNnaWQgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorbXNnc3RyICIgICBVc2luZyBzcGVjaWZpZWQgbmFtZTpcbiIKKworIzogbWVtbGluZS5jOjEzNzkKK21zZ2lkICIgICBJbiBkaXJlY3RvcnkgIgorbXNnc3RyICIgICDlnKjnm67pjIQgIgorCisjOiBtZW1saW5lLmM6MTM5NworbXNnaWQgIiAgICAgIC0tIG5vbmUgLS1cbiIKK21zZ3N0ciAiICAgICAgLS0g54ShIC0tXG4iCisKKyM6IG1lbWxpbmUuYzoxNDY5Cittc2dpZCAiICAgICAgICAgIG93bmVkIGJ5OiAiCittc2dzdHIgIiAgICAgICAgICAgIOaTgeacieiAhTogIgorCisjOiBtZW1saW5lLmM6MTQ3MQorbXNnaWQgIiAgIGRhdGVkOiAiCittc2dzdHIgIiAgICDml6XmnJ86ICIKKworIzogbWVtbGluZS5jOjE0NzUgbWVtbGluZS5jOjM2ODkKK21zZ2lkICIgICAgICAgICAgICAgZGF0ZWQ6ICIKK21zZ3N0ciAiICAgICAgICAgICAgICDml6XmnJ86ICIKKworIzogbWVtbGluZS5jOjE0OTEKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICAgICAgIFvlvp4gVmltIOeJiOacrCAzLjBdIgorCisjOiBtZW1saW5lLmM6MTQ5NQorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICBb5LiN5YOPIFZpbSDnmoTmmqvlrZjmqpRdIgorCisjOiBtZW1saW5lLmM6MTQ5OQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICAgICAgIOaqlOWQjTogIgorCisjOiBtZW1saW5lLmM6MTUwNQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICAgbW9kaWZpZWQ6ICIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgIOS/ruaUuemBjjogIgorCisjOiBtZW1saW5lLmM6MTUwNgorbXNnaWQgIllFUyIKK21zZ3N0ciAi5pivIgorCisjOiBtZW1saW5lLmM6MTUwNgorbXNnaWQgIm5vIgorbXNnc3RyICLlkKYiCisKKyM6IG1lbWxpbmUuYzoxNTEwCittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIHVzZXIgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICAg5L2/55So6ICFOiAiCisKKyM6IG1lbWxpbmUuYzoxNTE3Cittc2dpZCAiICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiAgICDkuLvmqZ/lkI3nqLE6ICIKKworIzogbWVtbGluZS5jOjE1MTkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgaG9zdCBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAg5Li75qmf5ZCN56ixOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTMxCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICjln7fooYzkuK0pIgorCisjOiBtZW1saW5lLmM6MTU0MworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW+eEoeazleWcqOacrOeJiOacrOeahCBWaW0g5LiK5L2/55SoXSIKKworIzogbWVtbGluZS5jOjE1NDYKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgW25vdCB1c2FibGUgb24gdGhpcyBjb21wdXRlcl0iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICBb54Sh5rOV5Zyo5pys6Zu76IWm5LiK5L2/55SoXSIKKworIzogbWVtbGluZS5jOjE1NTEKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIHJlYWRdIgorbXNnc3RyICIgICAgICAgICBb54Sh5rOV6K6A5Y+WXSIKKworIzogbWVtbGluZS5jOjE1NTUKK21zZ2lkICIgICAgICAgICBbY2Fubm90IGJlIG9wZW5lZF0iCittc2dzdHIgIiAgICAgICAgIFvnhKHms5XplovllZ9dIgorCisjOiBtZW1saW5lLmM6MTc0NQorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiDnhKHms5Xkv53nlZksIOS4jeS9v+eUqOaaq+WtmOaqlCIKKworIzogbWVtbGluZS5jOjE3OTgKK21zZ2lkICJGaWxlIHByZXNlcnZlZCIKK21zZ3N0ciAi5qqU5qGI5bey5L+d55WZIgorCisjOiBtZW1saW5lLmM6MTgwMAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDog5L+d55WZ5aSx5pWXIgorCisjOiBtZW1saW5lLmM6MTg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzE1OiBtbF9nZXQ6IGludmFsaWQgbG51bTogJWxkIgorbXNnc3RyICJFMzE1OiBtbF9nZXQ6IOmMr+iqpOeahCBsbnVtOiAlbGQiCisKKyM6IG1lbWxpbmUuYzoxODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTY6IG1sX2dldDogY2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMTY6IG1sX2dldDog5om+5LiN5Yiw56ysICVsZCDooYwiCisKKyM6IG1lbWxpbmUuYzoyMjg3Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiDmjIfmqJnljYDloYogaWQg6Yyv6KqkIDMiCisKKyM6IG1lbWxpbmUuYzoyMzY3Cittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICJzdGFja19pZHgg5oeJ6Kmy5pivIDAiCisKKyM6IG1lbWxpbmUuYzoyNDI5Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiDmm7TmlrDlpKrlpJrljYDloYo/IgorCisjOiBtZW1saW5lLmM6MjYxMQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzog5oyH5qiZ5Y2A5aGKIGlkIOmMr+iqpCA0IgorCisjOiBtZW1saW5lLmM6MjYzOAorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgIuWIqumZpOWNgOWhiiAxPyIKKworIzogbWVtbGluZS5jOjI4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMDogQ2Fubm90IGZpbmQgbGluZSAlbGQiCittc2dzdHIgIkUzMjA6IOaJvuS4jeWIsOesrCAlbGQg6KGMIgorCisjOiBtZW1saW5lLmM6MzA4MQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IOaMh+aomeWNgOWhiiBpZCDpjK/oqqQiCisKKyM6IG1lbWxpbmUuYzozMDk3Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IOeCuumbtiIKKworIzogbWVtbGluZS5jOjMxMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMyMjogbGluZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlbGQgcGFzdCB0aGUgZW5kIgorbXNnc3RyICJFMzIyOiDooYzomZ/otoXlh7rnr4TlnI06ICVsZCDotoXpgY7ntZDlsL4iCisKKyM6IG1lbWxpbmUuYzozMTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiDljYDloYogJWxkIOihjOaVuOmMr+iqpCIKKworIzogbWVtbGluZS5jOjMxNzkKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAi5aCG55aK5aSn5bCP5aKe5YqgIgorCisjOiBtZW1saW5lLmM6MzIyNQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzog5oyH5qiZ5Y2A5aGKIGlkIOmMryAyIgorCisjOiBtZW1saW5lLmM6MzY3OQorbXNnaWQgIkUzMjU6IEFUVEVOVElPTiIKK21zZ3N0ciAiRTMyNTog5rOo5oSPIgorCisjOiBtZW1saW5lLmM6MzY4MAorbXNnaWQgIiIKKyJcbiIKKyJGb3VuZCBhIHN3YXAgZmlsZSBieSB0aGUgbmFtZSBcIiIKK21zZ3N0ciAiIgorIlxuIgorIuaJvuWIsOaaq+WtmOaqlCBcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIuWcqOmWi+WVn+aqlOahiCBcIiIKKworIzogbWVtbGluZS5jOjM2OTMKK21zZ2lkICIgICAgICBORVdFUiB0aGFuIHN3YXAgZmlsZSFcbiIKK21zZ3N0ciAiICAgICAg5q+U5pqr5a2Y5qqU5pu05pawIVxuIgorCisjLiBTb21lIG9mIHRoZXNlIG1lc3NhZ2VzIGFyZSBsb25nIHRvIGFsbG93IHRyYW5zbGF0aW9uIHRvCisjLiAqIG90aGVyIGxhbmd1YWdlcy4KKyM6IG1lbWxpbmUuYzozNjk3Cittc2dpZCAiIgorIlxuIgorIigxKSBBbm90aGVyIHByb2dyYW0gbWF5IGJlIGVkaXRpbmcgdGhlIHNhbWUgZmlsZS5cbiIKKyIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgYmUgY2FyZWZ1bCBub3QgdG8gZW5kIHVwIHdpdGggdHdvXG4iCisiICAgIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZmlsZSB3aGVuIG1ha2luZyBjaGFuZ2VzLlxuIgorbXNnc3RyICIiCisiXG4iCisiKDEpIOWPr+iDveacieWPpuS4gOWAi+eoi+W8j+S5n+WcqOe3qOi8r+WQjOS4gOWAi+aqlOahiC5cbiIKKyIgICAg5aaC5p6c5piv6YCZ5qij77yM6KuL5bCP5b+D5LiN6KaB5YWp6YKK5LiA6LW35a+r5YWl77yM5LiN54S25L2g55qE5Yqq5Yqb6YO95pyD6LKg6Ku45rWB5rC044CCXG4iCisKKyM6IG1lbWxpbmUuYzozNjk4Cittc2dpZCAiICAgIFF1aXQsIG9yIGNvbnRpbnVlIHdpdGggY2F1dGlvbi5cbiIKK21zZ3N0ciAiICAgIOmboumWi++8jOaIluaYr+e5vOe6jOe3qOi8r+OAglxuIgorCisjOiBtZW1saW5lLmM6MzY5OQorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSDliY3mrKHnt6jovK/mraTmqpTmmYLnlbbmqZ9cbiIKKworIzogbWVtbGluZS5jOjM3MDAKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICDlpoLmnpzmmK/pgJnmqKMsIOiri+eUqCBcIjpyZWNvdmVyXCIg5oiWIFwidmltIC1yIgorCisjOiBtZW1saW5lLmM6MzcwMgorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byByZWNvdmVyIHRoZSBjaGFuZ2VzIChzZWUgXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKK21zZ3N0ciAiIgorIlwiXG4iCisiICAgIOS+huaVkeWbnuS/ruaUueizh+aWmSAo6YCy5LiA5q2l6Kqq5piO6KuL55yLIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCisKKyM6IG1lbWxpbmUuYzozNzAzCittc2dpZCAiICAgIElmIHlvdSBkaWQgdGhpcyBhbHJlYWR5LCBkZWxldGUgdGhlIHN3YXAgZmlsZSBcIiIKK21zZ3N0ciAiICAgIOWmguaenOipsuaVkeeahOmDveW3sue2k+aVkeS6hiwg6KuL55u05o6l5Yiq6Zmk5q2k5pqr5a2Y5qqUIFwiIgorCisjOiBtZW1saW5lLmM6MzcwNQorbXNnaWQgIiIKKyJcIlxuIgorIiAgICB0byBhdm9pZCB0aGlzIG1lc3NhZ2UuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICDku6Xpgb/lhY3lho3nnIvliLDmraToqIrmga8uXG4iCisKKyM6IG1lbWxpbmUuYzozNzE5IG1lbWxpbmUuYzozNzIzCittc2dpZCAiU3dhcCBmaWxlIFwiIgorbXNnc3RyICLmmqvlrZjmqpQgXCIiCisKKyM6IG1lbWxpbmUuYzozNzIwIG1lbWxpbmUuYzozNzI2Cittc2dpZCAiXCIgYWxyZWFkeSBleGlzdHMhIgorbXNnc3RyICJcIiDlt7LntpPlrZjlnKjkuoYhIgorCisjOiBtZW1saW5lLmM6MzcyOQorbXNnaWQgIlZJTSAtIEFUVEVOVElPTiIKK21zZ3N0ciAiVklNIC0g5rOo5oSPIgorCisjOiBtZW1saW5lLmM6MzczMQorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIuaaq+WtmOaqlOW3sue2k+WtmOWcqCEiCisKKyM6IG1lbWxpbmUuYzozNzM1Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXQiCittc2dzdHIgIiIKKyLku6XllK/oroDmlrnlvI/plovllZ8oJk8pXG4iCisi55u05o6l57eo6LyvKCZFKVxuIgorIuS/ruW+qSgmUilcbiIKKyLpm6LplosoJlEpIgorCisjOiBtZW1saW5lLmM6MzczNworbXNnaWQgIiIKKyImT3BlbiBSZWFkLU9ubHlcbiIKKyImRWRpdCBhbnl3YXlcbiIKKyImUmVjb3ZlclxuIgorIiZRdWl0XG4iCisiJkRlbGV0ZSBpdCIKK21zZ3N0ciAiIgorIuS7peWUr+iugOaWueW8j+mWi+WVnygmTylcbiIKKyLnm7TmjqXnt6jovK8oJkUpXG4iCisi5L+u5b6pKCZSKVxuIgorIumboumWiygmUSlcbiIKKyLliKrpmaTmmqvlrZjmqpQoJkQpIgorCisjOiBtZW1saW5lLmM6Mzc5MAorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6IOaJvuWIsOWkquWkmuaaq+WtmOaqlCIKKworIzogbWVudS5jOjY0Cittc2dpZCAiRTMyNzogUGFydCBvZiBtZW51LWl0ZW0gcGF0aCBpcyBub3Qgc3ViLW1lbnUiCittc2dzdHIgIkUzMjc6IOmDqOS7vemBuOmghei3r+W+keS4jeaYr+WtkOmBuOWWriIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IOmBuOWWruWPquiDveWcqOWFtuWug+aooeW8j+S4reS9v+eUqCIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IOaykuaciemCo+aoo+eahOmBuOWWriIKKworIzogbWVudS5jOjUwOQorbXNnaWQgIkUzMzA6IE1lbnUgcGF0aCBtdXN0IG5vdCBsZWFkIHRvIGEgc3ViLW1lbnUiCittc2dzdHIgIkUzMzA6IOmBuOWWrui3r+W+keS4jeiDveaMh+WQkeWtkOmBuOWWriIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiDkuI3og73nm7TmjqXmiorpgbjpoIXliqDliLDpgbjllq7liJfkuK0iCisKKyM6IG1lbnUuYzo1NTQKK21zZ2lkICJFMzMyOiBTZXBhcmF0b3IgY2Fubm90IGJlIHBhcnQgb2YgYSBtZW51IHBhdGgiCittc2dzdHIgIkUzMzI6IOWIhumalOe3muS4jeiDveaYr+mBuOWWrui3r+W+keeahOS4gOmDqOS7vSIKKworIy4gTm93IHdlIGhhdmUgZm91bmQgdGhlIG1hdGNoaW5nIG1lbnUsIGFuZCB3ZSBsaXN0IHRoZSBtYXBwaW5ncworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtZW51LmM6MTA3OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOmBuOWWriAtLS0iCisKKyM6IG1lbnUuYzoxOTk2Cittc2dpZCAiVGVhciBvZmYgdGhpcyBtZW51IgorbXNnc3RyICLliIfkuIvmraTpgbjllq4iCisKKyM6IG1lbnUuYzoyMDYxCittc2dpZCAiRTMzMzogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIG1lbnUgaXRlbSIKK21zZ3N0ciAiRTMzMzog6YG45Zau6Lev5b6R5b+F6ZyA5oyH5ZCR5LiA5YCL6YG46aCFIgorCisjOiBtZW51LmM6MjA4MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzM0OiBNZW51IG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkUzMzQ6IFvpgbjllq5dIOaJvuS4jeWIsCAlcyIKKworIzogbWVudS5jOjIxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogJXMg5qih5byP5pyq5a6a576p6YG45ZauIgorCisjOiBtZW51LmM6MjE4OAorbXNnaWQgIkUzMzY6IE1lbnUgcGF0aCBtdXN0IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzNjog6YG45Zau6Lev5b6R5b+F6ZyA5oyH5ZCR5a2Q6YG45ZauIgorCisjOiBtZW51LmM6MjIwOQorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzog5om+5LiN5Yiw6YG45ZauIC0g6KuL5qqi5p+l6YG45Zau5ZCN56ixIgorCisjOiBtZXNzYWdlLmM6NTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICLomZXnkIYgJXMg5pmC55m855Sf6Yyv6KqkOiIKKworIzogbWVzc2FnZS5jOjUyNQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICU0bGQ6IgorbXNnc3RyICLooYwgJTRsZDoiCisKKyM6IG1lc3NhZ2UuYzo1NjUKK21zZ2lkICJbc3RyaW5nIHRvbyBsb25nXSIKK21zZ3N0ciAiW+atpOihjOmBjumVt10iCisKKyM6IG1lc3NhZ2UuYzo3MTEKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiIgorIuato+mrlOS4reaWh+ioiuaBr+e2reitt+iAhTogRnJhbmNpcyBTLkxpbiA8cGlhaXBAY3NpZS5udHUuZWR1LiIKKyJ0dz4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VjaWwgU2hlbmcgICA8Yjc1MDYwMjJAY3NpZS5udHUuZWR1LnR3PiIKKworIzogbWVzc2FnZS5jOjkzNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICLlt7LkuK3mlrc6ICIKKworIzogbWVzc2FnZS5jOjkzOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAi6KuL5oyJIEVOVEVSIOe5vOe6jCIKKworIzogbWVzc2FnZS5jOjk0MAorbXNnaWQgIkhpdCBFTlRFUiBvciB0eXBlIGNvbW1hbmQgdG8gY29udGludWUiCittc2dzdHIgIuiri+aMiSBFTlRFUiDmiJblhbblroPlkb3ku6Tku6XnubznuowiCisKKyM6IG1lc3NhZ2UuYzoyMDI4Cittc2dpZCAiLS0gTW9yZSAtLSIKK21zZ3N0ciAiLS0g5bCa5pyJIC0tIgorCisjOiBtZXNzYWdlLmM6MjAzMQorbXNnaWQgIiAoUkVUL0JTOiBsaW5lLCBTUEFDRS9iOiBwYWdlLCBkL3U6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUL0JTOiDlkJHkuIsv5ZCR5LiK5LiA6KGMLCDnqbrnmb3pjbUvYjog5LiA6aCBLCBkL3U6IOWNiumggSwgcTog6Zui6ZaLKSIKKworIzogbWVzc2FnZS5jOjIwMzIKK21zZ2lkICIgKFJFVDogbGluZSwgU1BBQ0U6IHBhZ2UsIGQ6IGhhbGYgcGFnZSwgcTogcXVpdCkiCittc2dzdHIgIiAoUkVUOiDlkJHkuIvkuIDooYwsIOepuueZvemNtTog5LiA6aCBLCBkOiDljYrpoIEsIHE6IOmboumWiykiCisKKyM6IG1lc3NhZ2UuYzoyNTA4IG1lc3NhZ2UuYzoyNTIzCittc2dpZCAiUXVlc3Rpb24iCittc2dzdHIgIuWVj+mhjCIKKworIzogbWVzc2FnZS5jOjI1MTAKK21zZ2lkICIiCisiJlllc1xuIgorIiZObyIKK21zZ3N0ciAiIgorIiZZ5pivXG4iCisiJk7lkKYiCisKKyM6IG1lc3NhZ2UuYzoyNTQzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlnmmK9cbiIKKyImTuWQplxuIgorIiZB5YWo6YOo5a2Y5qqUXG4iCisiJkTlhajpg6jkuI3lrZhcbiIKKyImQ+WPlua2iCIKKworIzogbWVzc2FnZS5jOjI1ODQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICLlrZjmqpQiCisKKyM6IG1lc3NhZ2UuYzoyNTg2Cittc2dpZCAiT3BlbiBGaWxlIGRpYWxvZyIKK21zZ3N0ciAi6ZaL5qqUIgorCisjLiBUT0RPOiBub24tR1VJIGZpbGUgc2VsZWN0b3IgaGVyZQorIzogbWVzc2FnZS5jOjI2NTcKK21zZ2lkICJFMzM4OiBTb3JyeSwgbm8gZmlsZSBicm93c2VyIGluIGNvbnNvbGUgbW9kZSIKK21zZ3N0ciAiRTMzODog5Li75o6n5Y+wKENvbnNvbGUp5qih5byP5pmC5rKS5pyJ5qqU5qGI54CP6Ka95ZmoKGZpbGUgYnJvd3NlcikiCisKKyM6IG1pc2MxLmM6MjQ3NworbXNnaWQgIlcxMDogV2FybmluZzogQ2hhbmdpbmcgYSByZWFkb25seSBmaWxlIgorbXNnc3RyICJXMTA6IOazqOaEjzog5L2g5q2j5Zyo5L+u5pS55LiA5YCL5ZSv6K6A5qqUIgorCisjOiBtaXNjMS5jOjI3MTIKK21zZ2lkICIxIG1vcmUgbGluZSIKK21zZ3N0ciAi6YKE5pyJ5LiA6KGMIgorCisjOiBtaXNjMS5jOjI3MTQKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAi5bCR5pa85LiA6KGMIgorCisjOiBtaXNjMS5jOjI3MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIG1vcmUgbGluZXMiCittc2dzdHIgIiDpgoTmnIkgJWxkIOihjCIKKworIzogbWlzYzEuYzoyNzIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBmZXdlciBsaW5lcyIKK21zZ3N0ciAi5Y+q5YmpICVsZCDooYwiCisKKyM6IG1pc2MxLmM6MjcyNAorbXNnaWQgIiAoSW50ZXJydXB0ZWQpIgorbXNnc3RyICIgKOW3suS4reaWtykiCisKKyM6IG1pc2MxLmM6NjM0OAorbXNnaWQgIlZpbTogcHJlc2VydmluZyBmaWxlcy4uLlxuIgorbXNnc3RyICJWaW06IOS/neeVmeaqlOahiOS4rS4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjM1OAorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTog57WQ5p2fLlxuIgorCisjOiBtaXNjMi5jOjY3MCBtaXNjMi5jOjY4NgorbXNnaWQgIkVSUk9SOiAiCittc2dzdHIgIumMr+iqpDogIgorCisjOiBtaXNjMi5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiW2J5dGVzXSB0b3RhbCBhbGxvYy1mcmVlZCAlbHUtJWx1LCBpbiB1c2UgJWx1LCBwZWFrIHVzZSAlbHVcbiIKK21zZ3N0ciAiIgorIlxuIgorIltieXRlc10g5YWo6YOoIGFsbG9jLWZyZWVkICVsdS0lbHUsIOS9v+eUqOS4rSAlbHUsIHBlYWsg5L2/55SoICVsdVxuIgorCisjOiBtaXNjMi5jOjY5MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiW2NhbGxzXSB0b3RhbCByZS9tYWxsb2MoKSdzICVsdSwgdG90YWwgZnJlZSgpJ3MgJWx1XG4iCisiXG4iCittc2dzdHIgIiIKKyJb5ZG85Y+rXSDlhajpg6ggcmUvbWFsbG9jKCk6ICVsdSwg5YWo6YOoIGZyZWUoKSc6ICVsdVxuIgorIlxuIgorCisjOiBtaXNjMi5jOjc0NworbXNnaWQgIkUzNDA6IExpbmUgaXMgYmVjb21pbmcgdG9vIGxvbmciCittc2dzdHIgIkUzNDA6IOatpOihjOmBjumVtyIKKworIzogbWlzYzIuYzo3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IOWFp+mDqOmMr+iqpDogbGFsbG9jKCVsZCwgKSIKKworIzogbWlzYzIuYzo4OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MjogT3V0IG9mIG1lbW9yeSEgIChhbGxvY2F0aW5nICVsdSBieXRlcykiCittc2dzdHIgIkUzNDI6IOiomOaGtumrlOS4jei2syEgKOWYl+ippumFjee9riAlbHUg5L2N5YWD57WEKSIKKworIzogbWlzYzIuYzoyNTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGxpbmcgc2hlbGwgdG8gZXhlY3V0ZTogXCIlc1wiIgorbXNnc3RyICLlkbzlj6sgc2hlbGwg5Z+36KGMOiBcIiVzXCIiCisKKyM6IG1pc2MyLmM6Mjc4NQorbXNnaWQgIkU1NDU6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NDU6IOe8uuWwkSBjb2xvbiIKKworIzogbWlzYzIuYzoyNzg3IG1pc2MyLmM6MjgxNAorbXNnaWQgIkU1NDY6IElsbGVnYWwgbW9kZSIKK21zZ3N0ciAiRTU0Njog5LiN5q2j56K655qE5qih5byPIgorCisjOiBtaXNjMi5jOjI4NTMKK21zZ2lkICJFNTQ3OiBJbGxlZ2FsIG1vdXNlc2hhcGUiCittc2dzdHIgIkU1NDc6IOS4jeato+eiuueahOa7kem8oOW9oueLgCIKKworIzogbWlzYzIuYzoyODkzCittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IOaHieipsuimgeacieaVuOWtlyIKKworIzogbWlzYzIuYzoyODk4Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiDkuI3mraPnorrnmoTnmb7liIbmr5QiCisKKyM6IG1pc2MyLmM6MzIwOAorbXNnaWQgIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiCittc2dzdHIgIui8uOWFpeWvhueivDogIgorCisjOiBtaXNjMi5jOjMyMDkKK21zZ2lkICJFbnRlciBzYW1lIGtleSBhZ2FpbjogIgorbXNnc3RyICLoq4vlho3ovLjlhaXkuIDmrKE6ICIKKworIzogbWlzYzIuYzozMjE5Cittc2dpZCAiS2V5cyBkb24ndCBtYXRjaCEiCittc2dzdHIgIuWFqeasoei8uOWFpeWvhueivOS4jeebuOWQjCEiCisKKyM6IG1pc2MyLmM6Mzc2OAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRTM0MzogSW52YWxpZCBwYXRoOiAnKipbbnVtYmVyXScgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIG9yIGJlICIKKyJmb2xsb3dlZCBieSAnJXMnLiIKK21zZ3N0ciAiRTM0Mzog5LiN5q2j56K655qE6Lev5b6ROiAnKipbbnVtYmVyXScg5b+F6ZyA6KaB5Zyo6Lev5b6R57WQ5bC+5oiW6KaB5o6l6JGXICclcyciCisKKyM6IG1pc2MyLmM6NTA0NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ0OiBDYW4ndCBmaW5kIGRpcmVjdG9yeSBcIiVzXCIgaW4gY2RwYXRoIgorbXNnc3RyICJFMzQ0OiBjZHBhdGgg5Lit5rKS5pyJ55uu6YyEIFwiJXNcIiIKKworIzogbWlzYzIuYzo1MDQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDU6IENhbid0IGZpbmQgZmlsZSBcIiVzXCIgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NTog5Zyo6Lev5b6R5Lit5om+5LiN5Yiw5qqU5qGIIFwiJXNcIiIKKworIzogbWlzYzIuYzo1MDUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDY6IE5vIG1vcmUgZGlyZWN0b3J5IFwiJXNcIiBmb3VuZCBpbiBjZHBhdGgiCittc2dzdHIgIkUzNDY6IOWcqOi3r+W+keS4reaJvuS4jeWIsOabtOWkmueahOaqlOahiCBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NTA1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQ3OiBObyBtb3JlIGZpbGUgXCIlc1wiIGZvdW5kIGluIHBhdGgiCittc2dzdHIgIkUzNDc6IOWcqOi3r+W+keS4reaJvuS4jeWIsOabtOWkmueahOaqlOahiCBcIiVzXCIiCisKKyM6IG1pc2MyLmM6NTI5MAorbXNnaWQgIkU1NTA6IE1pc3NpbmcgY29sb24iCittc2dzdHIgIkU1NTA6IOe8uuWwkSBjb2xvbiIKKworIzogbWlzYzIuYzo1MzAyCittc2dpZCAiRTU1MTogSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIkU1NTE6IOS4jeato+eiuueahOaooeW8jyIKKworIzogbWlzYzIuYzo1MzEwCittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IOaHieipsuimgeacieaVuOWtlyIKKworIy4gR2V0IGhlcmUgd2hlbiB0aGUgc2VydmVyIGNhbid0IGJlIGZvdW5kLgorIzogbmV0YmVhbnMuYzoyODMKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyAjMiIKK21zZ3N0ciAi54Sh5rOV6YCj5o6l5YiwIE5ldGJlYW5zICMyIgorCisjOiBuZXRiZWFucy5jOjI5MQorbXNnaWQgIkNhbm5vdCBjb25uZWN0IHRvIE5ldGJlYW5zIgorbXNnc3RyICLnhKHms5XpgKPmjqXliLAgTmV0YmVhbnMiCisKKyM6IG5ldGJlYW5zLmM6NTY1Cittc2dpZCAicmVhZCBmcm9tIE5ldGJlYW5zIHNvY2tldCIKK21zZ3N0ciAi55SxIE5ldGJlYW5zIHNvY2tldCDoroDlj5YiCisKKyM6IG5vcm1hbC5jOjI5MTMKK21zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgorbXNnc3RyICLms6jmhI86IOS9oOeahOe1guerr+apn+eEoeazlemhr+ekuumrmOS6ruW6piIKKworIzogbm9ybWFsLmM6MzEyOAorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6IOa4uOaomeiZleaykuacieWtl+S4siIKKworIzogbm9ybWFsLmM6MzEzMAorbXNnaWQgIkUzNDk6IE5vIGlkZW50aWZpZXIgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFMzQ5OiDmuLjmqJnomZXmspLmnInorZjliKXlrZciCisKKyM6IG5vcm1hbC5jOjQzNDgKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1Mjog54Sh5rOV5Zyo55uu5YmN55qEICdmb2xkbWV0aG9kJyDkuIvliKrpmaQgZm9sZCIKKworIzogb3BzLmM6Mjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAi5LiA6KGMICVzIOmBjiDkuIDmrKEiCisKKyM6IG9wcy5jOjI5NworIywgYy1mb3JtYXQKK21zZ2lkICIxIGxpbmUgJXNlZCAlZCB0aW1lcyIKK21zZ3N0ciAi5LiA6KGMICVzIOmBjiAlZCDmrKEiCisKKyM6IG9wcy5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCDooYwgJXMg6YGOIOS4gOasoSIKKworIzogb3BzLmM6MzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyAlc2VkICVkIHRpbWVzIgorbXNnc3RyICIlbGQg6KGMICVzIOmBjiAlZCDmrKEiCisKKyM6IG9wcy5jOjY2MworIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgdG8gaW5kZW50Li4uICIKK21zZ3N0ciAi57iu5o6SICVsZCDooYwuLi4iCisKKyM6IG9wcy5jOjcxMworbXNnaWQgIjEgbGluZSBpbmRlbnRlZCAiCittc2dzdHIgIuS4gOihjOW3sue4ruaOkiIKKworIzogb3BzLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIuW3sue4ruaOkiAlbGQg6KGMIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogb3BzLmM6MTY0NQorbXNnaWQgImNhbm5vdCB5YW5rOyBkZWxldGUgYW55d2F5IgorbXNnc3RyICLnhKHms5XliarkuIs7IOebtOaOpeWIqumZpCIKKworIzogb3BzLmM6MjE1MgorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIgMSDooYwgfmVkIgorCisjOiBvcHMuYzoyMTU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBjaGFuZ2VkIgorbXNnc3RyICIgJWxkIOihjCB+ZWQiCisKKyM6IG9wcy5jOjI1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJlZWluZyAlbGQgbGluZXMiCittc2dzdHIgIumHi+aUviAlbGQg6KGM5LitIgorCisjOiBvcHMuYzoyODE5Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAi5bey6KSH6KO9IDEg6KGMIgorCisjOiBvcHMuYzoyODIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB5YW5rZWQiCittc2dzdHIgIuW3suikh+ijvSAlbGQg6KGMIgorCisjOiBvcHMuYzozMTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTM6IE5vdGhpbmcgaW4gcmVnaXN0ZXIgJXMiCittc2dzdHIgIkUzNTM6IOaaq+WtmOWZqCAlcyDoo6HmspLmnInmnbHopb8iCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogb3BzLmM6MzY2NAorbXNnaWQgIiIKKyJcbiIKKyItLS0gUmVnaXN0ZXJzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDmmqvlrZjlmaggLS0tIgorCisjOiBvcHMuYzo0ODczCittc2dpZCAiSWxsZWdhbCByZWdpc3RlciBuYW1lIgorbXNnc3RyICLkuI3mraPnorrnmoTmmqvlrZjlmajlkI3nqLEiCisKKyM6IG9wcy5jOjQ5NTkKK21zZ2lkICIiCisiXG4iCisiIyBSZWdpc3RlcnM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIOaaq+WtmOWZqDpcbiIKKworIzogb3BzLmM6NDk5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc0OiBVbmtub3duIHJlZ2lzdGVyIHR5cGUgJWQiCittc2dzdHIgIkU1NzQ6IOacquefpeeahOiou+WGiuWei+aFizogJWQiCisKKyM6IG9wcy5jOjU0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NDogSW52YWxpZCByZWdpc3RlciBuYW1lOiAnJXMnIgorbXNnc3RyICJFMzU0OiDmmqvlrZjlmajlkI3nqLHpjK/oqqQ6ICclcyciCisKKyM6IG9wcy5jOjU3NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIOashDsgIgorCisjOiBvcHMuYzo1NzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbGVjdGVkICVzJWxkIG9mICVsZCBMaW5lczsgJWxkIG9mICVsZCBXb3JkczsgJWxkIG9mICVsZCBCeXRlcyIKK21zZ3N0ciAi6YG45pOH5LqGICVzJWxkLyVsZCDooYw7ICVsZC8lbGQg5a2XKFdvcmQpOyAlbGQvJWxkIOWtl+WFgyhCeXRlcykiCisKKyM6IG9wcy5jOjU3NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29sICVzIG9mICVzOyBMaW5lICVsZCBvZiAlbGQ7IFdvcmQgJWxkIG9mICVsZDsgQnl0ZSAlbGQgb2YgJWxkIgorbXNnc3RyICLmrIQgJXMvJXM7IOihjCAlbGQvJWxkOyDlrZcoV29yZCkgJWxkLyVsZDsg5a2X5YWDKEJ5dGUpICVsZC8lbGQiCisKKyM6IG9wcy5jOjU3ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCslbGQgZm9yIEJPTSkiCittc2dzdHIgIigrJWxkIGZvciBCT00pIgorCisjOiBvcHRpb24uYzoxNTc5Cittc2dpZCAiJTwlZiVoJW0lPVBhZ2UgJU4iCittc2dzdHIgIiU8JWYlaCVtJT3nrKwgJU4g6aCBIgorCisjID8gd2hhdCdzIHRoaXMgZm9yPworIzogb3B0aW9uLmM6MjAxMgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAi5oSf6Kyd5oKo5oSb55SoIFZpbSIKKworIzogb3B0aW9uLmM6MzI1MCBvcHRpb24uYzozMzU3Cittc2dpZCAiRTUxODogVW5rbm93biBvcHRpb24iCittc2dzdHIgIkU1MTg6IOS4jeato+eiuueahOmBuOmghSIKKworIzogb3B0aW9uLmM6MzI2MworbXNnaWQgIkU1MTk6IE9wdGlvbiBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICJFNTE5OiDkuI3mlK/mj7ToqbLpgbjpoIUiCisKKyM6IG9wdGlvbi5jOjMyODgKK21zZ2lkICJFNTIwOiBOb3QgYWxsb3dlZCBpbiBhIG1vZGVsaW5lIgorbXNnc3RyICJFNTIwOiDkuI3og73lnKggTW9kZWxpbmUg6KOh5Ye654++IgorCisjOiBvcHRpb24uYzozMzQ0Cittc2dpZCAiIgorIlxuIgorIlx0TGFzdCBzZXQgZnJvbSAiCittc2dzdHIgIiIKKyJcbiIKKyJcdOS4iuasoeioreWumjogIgorCisjOiBvcHRpb24uYzozNDgzCittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6ID0g5b6M6ZyA6KaB5pyJ5pW45a2XIgorCisjOiBvcHRpb24uYzozNzk3IG9wdGlvbi5jOjQ0MTMKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogVGVybWNhcCDoo6HpnaLmib7kuI3liLAiCisKKyM6IG9wdGlvbi5jOjM4NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOTogSWxsZWdhbCBjaGFyYWN0ZXIgPCVzPiIKK21zZ3N0ciAiRTUzOTog5LiN5q2j56K655qE5a2X5YWDIDwlcz4iCisKKyM6IG9wdGlvbi5jOjQ0MDUKK21zZ2lkICJFNTI5OiBDYW5ub3Qgc2V0ICd0ZXJtJyB0byBlbXB0eSBzdHJpbmciCittc2dzdHIgIkU1Mjk6IOeEoeazleioreWumiAndGVybScg54K656m65a2X5LiyIgorCisjOiBvcHRpb24uYzo0NDA4Cittc2dpZCAiRTUzMDogQ2Fubm90IGNoYW5nZSB0ZXJtIGluIEdVSSIKK21zZ3N0ciAiRTUzMDog5Zyo5ZyW5Z6L55WM6Z2i5Lit54Sh5rOV5YiH5o+bIHRlcm0iCisKKyM6IG9wdGlvbi5jOjQ0MTAKK21zZ2lkICJFNTMxOiBVc2UgXCI6Z3VpXCIgdG8gc3RhcnQgdGhlIEdVSSIKK21zZ3N0ciAiRTUzMTog6Ly45YWlIFwiOmd1aVwiIOS+huWVn+WLleWcluW9oueVjOmdoiIKKworIzogb3B0aW9uLmM6NDQzMQorbXNnaWQgIkU1ODk6ICdiYWNrdXBleHQnIGFuZCAncGF0Y2htb2RlJyBhcmUgZXF1YWwiCittc2dzdHIgIkU1ODk6ICdiYWNrdXBleHQnIOi3nyAncGF0Y2htb2RlJyDmmK/kuIDmqKPnmoQiCisKKyM6IG9wdGlvbi5jOjQ2MTYKK21zZ2lkICJFNjE3OiBDYW5ub3QgYmUgY2hhbmdlZCBpbiB0aGUgR1RLKyAyIEdVSSIKK21zZ3N0ciAiRTYxNzog5Zyo5ZyW5Z6L55WM6Z2i5Lit54Sh5rOV5YiH5o+bIHRlcm0iCisKKyM6IG9wdGlvbi5jOjQ3NDgKK21zZ2lkICJFNTI0OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTI0OiDnvLrlsJEgY29sb24iCisKKyM6IG9wdGlvbi5jOjQ3NTAKK21zZ2lkICJFNTI1OiBaZXJvIGxlbmd0aCBzdHJpbmciCittc2dzdHIgIkU1MjU6IOmbtumVt+W6puWtl+S4siIKKworIzogb3B0aW9uLmM6NDgxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiA8JXM+IOW+jOe8uuWwkeaVuOWtlyIKKworIzogb3B0aW9uLmM6NDgzMgorbXNnaWQgIkU1Mjc6IE1pc3NpbmcgY29tbWEiCittc2dzdHIgIkU1Mjc6IOe8uuWwkemAl+iZnyIKKworIzogb3B0aW9uLmM6NDgzOQorbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IOW/hemcgOaMh+WumuS4gOWAiyAnIOWAvCIKKworIzogb3B0aW9uLmM6NDg4MAorbXNnaWQgIkU1OTU6IGNvbnRhaW5zIHVucHJpbnRhYmxlIG9yIHdpZGUgY2hhcmFjdGVyIgorbXNnc3RyICJFNTk1OiDlhaflkKvnhKHms5Xpoa/npLrnmoTlrZflhYMiCisKKyM6IG9wdGlvbi5jOjQ5MjkKK21zZ2lkICJFNTk2OiBJbnZhbGlkIGZvbnQocykiCittc2dzdHIgIkU1OTY6IOS4jeato+eiuueahOWtl+WeiyIKKworIzogb3B0aW9uLmM6NDkzNworbXNnaWQgIkU1OTc6IGNhbid0IHNlbGVjdCBmb250c2V0IgorbXNnc3RyICJFNTk3OiDnhKHms5Xkvb/nlKjlrZflnovpm4YoRm9udHNldCkiCisKKyM6IG9wdGlvbi5jOjQ5MzkKK21zZ2lkICJFNTk4OiBJbnZhbGlkIGZvbnRzZXQiCittc2dzdHIgIkU1OTg6IOS4jeato+eiuueahOWtl+Wei+mbhihGb250c2V0KSIKKworIzogb3B0aW9uLmM6NDk0NgorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6IOeEoeazleS9v+eUqOioreWumueahOS4reaWh+Wtl+WeiyhXaWRlZm9udCkiCisKKyM6IG9wdGlvbi5jOjQ5NDgKK21zZ2lkICJFNTM0OiBJbnZhbGlkIHdpZGUgZm9udCIKK21zZ3N0ciAiRTUzNDog5LiN5q2j56K655qE5a2X5Z6LKFdpZGVmb250KSIKKworIzogb3B0aW9uLmM6NTIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTM1OiBJbGxlZ2FsIGNoYXJhY3RlciBhZnRlciA8JWM+IgorbXNnc3RyICJFNTM1OiA8JWM+IOW+jOacieS4jeato+eiuueahOWtl+WFgyIKKworIzogb3B0aW9uLmM6NTMyMgorbXNnaWQgIkU1MzY6IGNvbW1hIHJlcXVpcmVkIgorbXNnc3RyICJFNTM2OiDpnIDopoHpgJfomZ8iCisKKyM6IG9wdGlvbi5jOjUzMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIG11c3QgYmUgZW1wdHkgb3IgY29udGFpbiAlcyIKK21zZ3N0ciAiRTUzNzogJ2NvbW1lbnRzdHJpbmcnIOW/hemcgOaYr+epuueZveaIluWMheWQqyAlcyIKKworIzogb3B0aW9uLmM6NTM3NworbXNnaWQgIkU1Mzg6IE5vIG1vdXNlIHN1cHBvcnQiCittc2dzdHIgIkU1Mzg6IOS4jeaUr+aPtOa7kem8oCIKKworIzogb3B0aW9uLmM6NTY0NQorbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IOaykuaciee1kOadn+eahOmBi+eul+W8jzogIgorCisjOiBvcHRpb24uYzo1NjQ5Cittc2dpZCAiRTU0MTogdG9vIG1hbnkgaXRlbXMiCittc2dzdHIgIkU1NDE6IOWkquWkmumgheebriIKKworIzogb3B0aW9uLmM6NTY1MQorbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiDkuI3lsI3nqLHnmoQgZ3JvdXAiCisKKyM6IG9wdGlvbi5jOjU4NzIKK21zZ2lkICJFNTkwOiBBIHByZXZpZXcgd2luZG93IGFscmVhZHkgZXhpc3RzIgorbXNnc3RyICJFNTkwOiDpoJDoppbnmoToppbnqpflt7LntpPlrZjlnKjkuoYiCisKKyM6IG9wdGlvbi5jOjYzNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5MzogTmVlZCBhdCBsZWFzdCAlZCBsaW5lcyIKK21zZ3N0ciAiRTU5Mzog6Iez5bCR6ZyA6KaBICVkIOihjCIKKworIzogb3B0aW9uLmM6NjM1NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTk0OiBOZWVkIGF0IGxlYXN0ICVkIGNvbHVtbnMiCittc2dzdHIgIkU1OTQ6IOiHs+WwkemcgOimgSAlZCDmrIQiCisKKyM6IG9wdGlvbi5jOjY2NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiDkuI3mraPnorrnmoTpgbjpoIU6ICVzIgorCisjOiBvcHRpb24uYzo2NzY5Cittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0g57WC56uv5qmf56K8IC0tLSIKKworIzogb3B0aW9uLmM6Njc3MQorbXNnaWQgIiIKKyJcbiIKKyItLS0gR2xvYmFsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEdsb2JhbCDpgbjpoIXlgLwgLS0tIgorCisjOiBvcHRpb24uYzo2NzczCittc2dpZCAiIgorIlxuIgorIi0tLSBMb2NhbCBvcHRpb24gdmFsdWVzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSBMb2NhbCDpgbjpoIXlgLwgLS0tIgorCisjOiBvcHRpb24uYzo2Nzc1Cittc2dpZCAiIgorIlxuIgorIi0tLSBPcHRpb25zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDpgbjpoIUgLS0tIgorCisjOiBvcHRpb24uYzo3NDY3Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwIOmMr+iqpCIKKworIzogb3B0aW9uLmM6ODQyNQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzU3OiAnbGFuZ21hcCc6IE1hdGNoaW5nIGNoYXJhY3RlciBtaXNzaW5nIGZvciAlcyIKK21zZ3N0ciAiRTM1NzogJ2xhbmdtYXAnOiDmib7kuI3liLAgJXMg5bCN5oeJ55qE5a2X5YWDIgorCisjOiBvcHRpb24uYzo4NDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTg6ICdsYW5nbWFwJzogRXh0cmEgY2hhcmFjdGVycyBhZnRlciBzZW1pY29sb246ICVzIgorbXNnc3RyICJFMzU4OiAnbGFuZ21hcCc6IOWIhuiZn+W+jOacieWkmumkmOeahOWtl+WFgzogJXMiCisKKyM6IG9zX2FtaWdhLmM6MjczCittc2dpZCAiY2Fubm90IG9wZW4gIgorbXNnc3RyICLkuI3og73plovllZ8iCisKKyM6IG9zX2FtaWdhLmM6MzA3Cittc2dpZCAiVklNOiBDYW4ndCBvcGVuIHdpbmRvdyFcbiIKK21zZ3N0ciAiVklNOiDnhKHms5XplovllZ/oppbnqpchXG4iCisKKyM6IG9zX2FtaWdhLmM6MzI5Cittc2dpZCAiTmVlZCBBbWlnYWRvcyB2ZXJzaW9uIDIuMDQgb3IgbGF0ZXJcbiIKK21zZ3N0ciAi6ZyA6KaBIEFtaWdhZG9zIOeJiOacrCAyLjA0IOS7peS4ilxuIgorCisjOiBvc19hbWlnYS5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWVkICVzIHZlcnNpb24gJWxkXG4iCittc2dzdHIgIumcgOimgSAlcyDniYjmnKwgJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICLnhKHms5XplovllZ8gTklMOlxuIgorCisjOiBvc19hbWlnYS5jOjQxOAorbXNnaWQgIkNhbm5vdCBjcmVhdGUgIgorbXNnc3RyICLkuI3og73lu7rnq4sgIgorCisjOiBvc19hbWlnYS5jOjg5NgorIywgYy1mb3JtYXQKK21zZ2lkICJWaW0gZXhpdGluZyB3aXRoICVkXG4iCittc2dzdHIgIlZpbSDntZDmnZ/lgrPlm57lgLw6ICVkXG4iCisKKyM6IG9zX2FtaWdhLmM6OTI4Cittc2dpZCAiY2Fubm90IGNoYW5nZSBjb25zb2xlIG1vZGUgPyFcbiIKK21zZ3N0ciAi54Sh5rOV5YiH5o+b5Li75o6n5Y+wKGNvbnNvbGUp5qih5byPICE/XG4iCisKKyM6IG9zX2FtaWdhLmM6OTk0Cittc2dpZCAibWNoX2dldF9zaGVsbHNpemU6IG5vdCBhIGNvbnNvbGU/P1xuIgorbXNnc3RyICJtY2hfZ2V0X3NoZWxsc2l6ZTog5LiN5piv5Li75o6n5Y+wKGNvbnNvbGUpPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MworbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiDkuI3og73nlKggLWYg6YG46aCF5Z+36KGMIHNoZWxsIgorCisjOiBvc19hbWlnYS5jOjExODQgb3NfYW1pZ2EuYzoxMjc0Cittc2dpZCAiQ2Fubm90IGV4ZWN1dGUgIgorbXNnc3RyICLkuI3og73ln7fooYwgIgorCisjOiBvc19hbWlnYS5jOjExODcgb3NfYW1pZ2EuYzoxMjg0Cittc2dpZCAic2hlbGwgIgorbXNnc3RyICJzaGVsbCAiCisKKyM6IG9zX2FtaWdhLmM6MTIwNyBvc19hbWlnYS5jOjEzMDkKK21zZ2lkICIgcmV0dXJuZWRcbiIKK21zZ3N0ciAiIOW3sui/lOWbnlxuIgorCisjOiBvc19hbWlnYS5jOjE0NTAKK21zZ2lkICJBTkNIT1JfQlVGX1NJWkUgdG9vIHNtYWxsLiIKK21zZ3N0ciAiQU5DSE9SX0JVRl9TSVpFIOWkquWwjyIKKworIzogb3NfYW1pZ2EuYzoxNDU0Cittc2dpZCAiSS9PIEVSUk9SIgorbXNnc3RyICJJL08g6Yyv6KqkIgorCisjOiBvc19tc3dpbi5jOjUxNQorbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4o5bey5YiH5o6JKSIKKworIzogb3NfbXN3aW4uYzo2MTcKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIOS4jeaYryA4MCwg54Sh5rOV5Z+36KGM5aSW6YOo5ZG95LukIgorCisjOiBvc19tc3dpbi5jOjE4MDIKK21zZ2lkICJFMjM3OiBQcmludGVyIHNlbGVjdGlvbiBmYWlsZWQiCittc2dzdHIgIkUyMzc6IOeEoeazlemBuOaTh+atpOWNsOihqOapnyIKKworIzogb3NfbXN3aW4uYzoxODQyCisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICLliLAgJXMgb24gJXMiCisKKyM6IG9zX21zd2luLmM6MTg1NworIywgYy1mb3JtYXQKK21zZ2lkICJFNjEzOiBVbmtub3duIHByaW50ZXIgZm9udDogJXMiCittc2dzdHIgIkU2MTM6IOS4jeato+eiuueahOWNsOihqOapn+Wtl+WeizogJXMiCisKKyM6IG9zX21zd2luLmM6MTkwNyBvc19tc3dpbi5jOjE5MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzODogUHJpbnQgZXJyb3I6ICVzIgorbXNnc3RyICJFMjM4OiDliJfljbDpjK/oqqQ6ICVzIgorCisjOiBvc19tc3dpbi5jOjE5MTgKK21zZ2lkICJVbmtub3duIgorbXNnc3RyICLmnKrnn6UiCisKKyM6IG9zX21zd2luLmM6MTk0NQorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyAnJXMnIgorbXNnc3RyICLliJfljbDkuK06ICclcyciCisKKyM6IG9zX21zd2luLmM6MzAzMworIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ0OiBJbGxlZ2FsIGNoYXJzZXQgbmFtZSBcIiVzXCIgaW4gZm9udCBuYW1lIFwiJXNcIiIKK21zZ3N0ciAiRTI0NDog5a2X5YWD6ZuGIFwiJXNcIiDnhKHms5XlsI3mh4nlrZflnotcIiVzXCIiCisKKyM6IG9zX21zd2luLmM6MzA0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ1OiBJbGxlZ2FsIGNoYXIgJyVjJyBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ1OiDkuI3mraPnorrnmoTlrZflhYMgJyVjJyDlh7rnj77lnKjlrZflnovlkI3nqLEgXCIlc1wiIOWFpyIKKworIzogb3NfcmlzY29zLmM6MTI1OAorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IOS4jeato+eiuueahCAnZmlsZXR5cGUnIOmBuOmghSAtIOS9v+eUqOe0lOaWh+Wtl+aooeW8jyIKKworIzogb3NfdW5peC5jOjg3MQorbXNnaWQgIlZpbTogRG91YmxlIHNpZ25hbCwgZXhpdGluZ1xuIgorbXNnc3RyICJWaW06IOmbmemHjXNpZ25hbCwg6Zui6ZaL5LitXG4iCisKKyM6IG9zX3VuaXguYzo4NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IENWaW06IOaUlOaIquWIsOS/oeiZnyhzaWduYWwpICVzXG4iCisKKyM6IG9zX3VuaXguYzo4ODAKK21zZ2lkICJWaW06IENhdWdodCBkZWFkbHkgc2lnbmFsXG4iCittc2dzdHIgIlZpbTog5pSU5oiq5Yiw6Ie05ZG955qE5L+h6JmfKGRlYWRseSBzaWduYWxlKVxuIgorCisjOiBvc191bml4LmM6MTE0MworIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKK21zZ3N0ciAi6ZaL5ZWfIFggV2luZG93IOiAl+aZgiAlbGQgbXNlYyIKKworIzogb3NfdW5peC5jOjExNzAKK21zZ2lkICIiCisiXG4iCisiVmltOiBHb3QgWCBlcnJvclxuIgorbXNnc3RyICIiCisiXG4iCisiVmltOiBYIOmMr+iqpFxuIgorCisjOiBvc191bml4LmM6MTI3NgorbXNnaWQgIlRlc3RpbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIua4rOippiBYIFdpbmRvdyDlpLHmlZciCisKKyM6IG9zX3VuaXguYzoxNDE1Cittc2dpZCAiT3BlbmluZyB0aGUgWCBkaXNwbGF5IHRpbWVkIG91dCIKK21zZ3N0ciAi6ZaL5ZWfIFggV2luZG93IOmAvuaZgiIKKworIzogb3NfdW5peC5jOjMxNDUgb3NfdW5peC5jOjM4MjUKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisi5LiN6IO95Z+36KGMIHNoZWxsIgorCisjOiBvc191bml4LmM6MzE5MworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZXhlY3V0ZSBzaGVsbCBzaFxuIgorbXNnc3RyICIiCisiXG4iCisi5LiN6IO95Z+36KGMIHNoZWxsIHNoXG4iCisKKyM6IG9zX3VuaXguYzozMTk3IG9zX3VuaXguYzozODMxCittc2dpZCAiIgorIlxuIgorInNoZWxsIHJldHVybmVkICIKK21zZ3N0ciAiIgorIlxuIgorIlNoZWxsIOW3sui/lOWbniIKKworIzogb3NfdW5peC5jOjMzMzIKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGNyZWF0ZSBwaXBlc1xuIgorbXNnc3RyICIiCisiXG4iCisi5LiN6IO95bu656uLIHBpcGUg566h57eaXG4iCisKKyM6IG9zX3VuaXguYzozMzQ3Cittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBmb3JrXG4iCittc2dzdHIgIiIKKyJcbiIKKyLkuI3og70gZm9ya1xuIgorCisjOiBvc191bml4LmM6MzgzOAorbXNnaWQgIiIKKyJcbiIKKyJDb21tYW5kIHRlcm1pbmF0ZWRcbiIKK21zZ3N0ciAiIgorIlxuIgorIuWRveS7pOW3sue1gue1kFxuIgorCisjOiBvc191bml4LmM6NTM5OAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIumWi+WVnyBYIFdpbmRvdyDlpLHmlZciCisKKyM6IG9zX3Ztc19tbXMuYzo1OQorbXNnaWQgIkF0IGxpbmUiCittc2dzdHIgIuWcqOihjOiZnyAiCisKKyM6IG9zX3czMmV4ZS5jOjE2OQorbXNnaWQgIkNvdWxkIG5vdCBsb2FkIHZpbTMyLmRsbCEiCittc2dzdHIgIueEoeazlei8ieWFpSB2aW0zMi5kbGzvvIEiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIlZJTSDpjK/oqqQiCisKKyM6IG9zX3czMmV4ZS5jOjE3OQorbXNnaWQgIkNvdWxkIG5vdCBmaXggdXAgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIERMTCEiCittc2dzdHIgIuS4jeiDveS/ruato+WHveW8j+aMh+aomeWIsCBETEwhIgorCisjOiBvc193aW4xNi5jOjU4MyBvc193aW4zMi5jOjMwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAic2hlbGwgcmV0dXJuZWQgJWQiCittc2dzdHIgIlNoZWxsIOWCs+WbnuWAvCAlZCIKKworIzogb3Nfd2luMzIuYzoyNTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZpbTogQ2F1Z2h0ICVzIGV2ZW50XG4iCittc2dzdHIgIlZpbTog5pSU5oiq5YiwICVzIFxuIgorCisjOiBvc193aW4zMi5jOjI1MDcKK21zZ2lkICJjbG9zZSIKK21zZ3N0ciAi6Zec6ZaJIgorCisjOiBvc193aW4zMi5jOjI1MDkKK21zZ2lkICJsb2dvZmYiCittc2dzdHIgIueZu+WHuiIKKworIzogb3Nfd2luMzIuYzoyNTEwCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgIumXnOapnyIKKworIzogb3Nfd2luMzIuYzozMDAwCittc2dpZCAiRTM3MTogQ29tbWFuZCBub3QgZm91bmQiCittc2dzdHIgIkUzNzE6IOaJvuS4jeWIsOWRveS7pCIKKworIzogb3Nfd2luMzIuYzozMDEzCittc2dpZCAiIgorIlZJTVJVTi5FWEUgbm90IGZvdW5kIGluIHlvdXIgJFBBVEguXG4iCisiRXh0ZXJuYWwgY29tbWFuZHMgd2lsbCBub3QgcGF1c2UgYWZ0ZXIgY29tcGxldGlvbi5cbiIKKyJTZWUgIDpoZWxwIHdpbjMyLXZpbXJ1biAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisi5Zyo5L2g55qEICRQQVRIIOS4reaJvuS4jeWIsCBWSU1SVU4uRVhFLlxuIgorIuWklumDqOWRveS7pOWft+ihjOWujOeVouW+jOWwh+S4jeacg+aaq+WBnC5cbiIKKyLpgLLkuIDmraXoqqrmmI7oq4vln7fooYwgOmhlbHAgd2luMzItdmltcnVuICIKKworIzogb3Nfd2luMzIuYzozMDE2Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSDorablkYoiCisKKyM6IHF1aWNrZml4LmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzI6IFRvbyBtYW55ICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Mjog5qC85byP5YyW5a2X5Liy6KOh5pyJ5aSq5aSaICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjI3MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzczOiBVbmV4cGVjdGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Mzog5qC85byP5YyW5a2X5Liy5LiN5oeJ6Kmy5Ye654++ICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjMyNQorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiDmoLzlvI/ljJblrZfkuLLoo6HlsJHkuoYgXSIKKworIzogcXVpY2tmaXguYzozMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NTogVW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc1OiDmoLzlvI/ljJblrZfkuLLoo6HmnInkuI3mlK/mj7TnmoQgJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6MzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIKK21zZ3N0ciAiRTM3Njog5qC85byP5YyW5a2X5Liy6ZaL6aCt6KOh5pyJ5LiN5q2j56K655qEICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzc3OiBJbnZhbGlkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3Nzog5qC85byP5YyW5a2X5Liy6KOh5pyJ5LiN5q2j56K655qEICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjM5MQorbXNnaWQgIkUzNzg6ICdlcnJvcmZvcm1hdCcgY29udGFpbnMgbm8gcGF0dGVybiIKK21zZ3N0ciAiRTM3ODogJ2Vycm9yZm9ybWF0JyDmnKroqK3lrpoiCisKKyM6IHF1aWNrZml4LmM6NDk3Cittc2dpZCAiRTM3OTogTWlzc2luZyBvciBlbXB0eSBkaXJlY3RvcnkgbmFtZSIKK21zZ3N0ciAiRTM3OTog5om+5LiN5Yiw55uu6YyE5ZCN56ix5oiW5piv56m655qE55uu6YyE5ZCN56ixIgorCisjOiBxdWlja2ZpeC5jOjk3OQorbXNnaWQgIkU1NTM6IE5vIG1vcmUgaXRlbXMiCittc2dzdHIgIkU1NTM6IOaykuacieWFtuWug+mgheebriIKKworIzogcXVpY2tmaXguYzoxMjAwCisjLCBjLWZvcm1hdAorbXNnaWQgIiglZCBvZiAlZCklcyVzOiAiCittc2dzdHIgIiglZCAvICVkKSVzJXM6ICIKKworIzogcXVpY2tmaXguYzoxMjAyCittc2dpZCAiIChsaW5lIGRlbGV0ZWQpIgorbXNnc3RyICIgKOihjOW3suWIqumZpCkiCisKKyM6IHF1aWNrZml4LmM6MTQxMgorbXNnaWQgIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIKK21zZ3N0ciAiRTM4MDogUXVpY2tmaXgg5aCG55aK57WQ5bC+IgorCisjOiBxdWlja2ZpeC5jOjE0MjEKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IFF1aWNrZml4IOWghueWiumgguerryIKKworIzogcXVpY2tmaXguYzoxNDMzCisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIGxpc3QgJWQgb2YgJWQ7ICVkIGVycm9ycyIKK21zZ3N0ciAi6Yyv6Kqk5YiX6KGoICVkLyVkOyDlhbHmnIkgJWQg6aCF6Yyv6KqkIgorCisjOiBxdWlja2ZpeC5jOjE5MDQKK21zZ2lkICJFMzgyOiBDYW5ub3Qgd3JpdGUsICdidWZ0eXBlJyBvcHRpb24gaXMgc2V0IgorbXNnc3RyICJFMzgyOiDnhKHms5Xlr6vlhaXvvIwnYnVmdHlwZScg6YG46aCF5bey6Kit5a6aIgorCisjOiByZWdleHAuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM2OTogaW52YWxpZCBpdGVtIGluICVzJSVbXSIKK21zZ3N0ciAiRTM2OTog5LiN5q2j56K655qE6aCF55uu77yaICVzJSVbXSIKKworIzogcmVnZXhwLmM6ODI2Cittc2dpZCAiRTMzOTogUGF0dGVybiB0b28gbG9uZyIKK21zZ3N0ciAiRTMzOTog5ZCN5a2X5aSq6ZW3IgorCisjOiByZWdleHAuYzo5OTUKK21zZ2lkICJFNTA6IFRvbyBtYW55IFxceigiCittc2dzdHIgIkU1MDog5aSq5aSaIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxOiBUb28gbWFueSAlcygiCittc2dzdHIgIkU1MTog5aSq5aSaICVzKCIKKworIzogcmVnZXhwLmM6MTA2MworbXNnaWQgIkU1MjogVW5tYXRjaGVkIFxceigiCittc2dzdHIgIkU1Mjog54Sh5bCN5oeJ55qEIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1Mzog54Sh5bCN5oeJ55qEICVzJSUoIgorCisjOiByZWdleHAuYzoxMDY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NDogVW5tYXRjaGVkICVzKCIKK21zZ3N0ciAiRTU0OiDnhKHlsI3mh4nnmoQgJXMoIgorCisjOiByZWdleHAuYzoxMDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NTogVW5tYXRjaGVkICVzKSIKK21zZ3N0ciAiRTU1OiDnhKHlsI3mh4nnmoQgJXMpIgorCisjOiByZWdleHAuYzoxMjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NjogJXMqIOmBi+eul+WFg+WPr+S7peaYr+epuueahCIKKworIzogcmVnZXhwLmM6MTI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTc6ICVzKyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTY6ICVzKyDpgYvnrpflhYPlj6/ku6XmmK/nqbrnmoQiCisKKyM6IHJlZ2V4cC5jOjEyOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiCittc2dzdHIgIkU1OTog5b6M6Z2i5pyJ5LiN5q2j56K655qE5a2X5YWDOiAlc0AiCisKKyM6IHJlZ2V4cC5jOjEzMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU4OiAlc3sg6YGL566X5YWD5Y+v5Lul5piv56m655qEIgorCisjOiByZWdleHAuYzoxMzI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiDlpKrlpJropIfpm5znmoQgJXN7Li4ufXMiCisKKyM6IHJlZ2V4cC5jOjEzNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxOiBOZXN0ZWQgJXMqIgorbXNnc3RyICJFNjE6IOW3oueLgCAlcyoiCisKKyM6IHJlZ2V4cC5jOjEzNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYyOiBOZXN0ZWQgJXMlYyIKK21zZ3N0ciAiRTYyOiDlt6Lni4AgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ2NgorbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IOS4jeato+eiuueahOS9v+eUqCBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIOaykuacieaOpeadseilvyIKKworIzogcmVnZXhwLmM6MTU2NworbXNnaWQgIkU2NTogSWxsZWdhbCBiYWNrIHJlZmVyZW5jZSIKK21zZ3N0ciAiRTY1OiDkuI3mraPnorrnmoTlj43lkJHlj4PogIMiCisKKyM6IHJlZ2V4cC5jOjE1ODAKK21zZ2lkICJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY2OiBcXHooIOS4jeiDveWcqOatpOWHuuePviIKKworIzogcmVnZXhwLmM6MTU5OQorbXNnaWQgIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTY3OiBcXHoxIGV0IGFsLiDkuI3og73lnKjmraTlh7rnj74iCisKKyM6IHJlZ2V4cC5jOjE2MTAKK21zZ2lkICJFNjg6IEludmFsaWQgY2hhcmFjdGVyIGFmdGVyIFxceiIKK21zZ3N0ciAiRTY4OiDlvozpnaLmnInkuI3mraPnorrnmoTlrZflhYM6IFxceiIKKworIzogcmVnZXhwLmM6MTY1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIKK21zZ3N0ciAiRTY5OiAlcyUlWyDlvoznvLrlsJEgXSIKKworIzogcmVnZXhwLmM6MTY3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFNzA6IEVtcHR5ICVzJSVbXSIKK21zZ3N0ciAiRTcwOiDnqbrnmoQgJXMlJVtdIgorCisjOiByZWdleHAuYzoxNzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MTogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXMlJSIKK21zZ3N0ciAiRTcxOiDlvozpnaLmnInkuI3mraPnorrnmoTlrZflhYM6ICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6IOiqnuazlemMr+iqpDogJXN7Li4ufSIKKworIzogcmVnZXhwLmM6Mjc3NworbXNnaWQgIkUzNjE6IENyYXNoIGludGVyY2VwdGVkOyByZWdleHAgdG9vIGNvbXBsZXg/IgorbXNnc3RyICJFMzYxOiDnhKHms5Xln7fooYw7IHJlZ3VsYXIgZXhwcmVzc2lvbiDlpKropIfpm5w/IgorCisjOiByZWdleHAuYzoyOTEyCittc2dpZCAiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIgorbXNnc3RyICJFMzYzOiByZWd1bGFyIGV4cHJlc3Npb24g6YCg5oiQ5aCG55aK55So5YWJ55qE6Yyv6KqkIgorCisjOiByZWdleHAuYzozMTQ4Cittc2dpZCAiRXh0ZXJuYWwgc3VibWF0Y2hlczpcbiIKK21zZ3N0ciAi5aSW6YOo56ym5ZCIOlxuIgorCisjOiBzY3JlZW4uYzoyMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0t5beyIGZvbGQgJTNsZCDooYwiCisKKyM6IHNjcmVlbi5jOjc3ODUKK21zZ2lkICIgVlJFUExBQ0UiCittc2dzdHIgIiBWLeWPluS7oyIKKworIzogc2NyZWVuLmM6Nzc4OQorbXNnaWQgIiBSRVBMQUNFIgorbXNnc3RyICIg5Y+W5LujIgorCisjOiBzY3JlZW4uYzo3Nzk0Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiDlj43ovYkiCisKKyM6IHNjcmVlbi5jOjc3OTYKK21zZ2lkICIgSU5TRVJUIgorbXNnc3RyICIg5o+S5YWlIgorCisjOiBzY3JlZW4uYzo3Nzk5Cittc2dpZCAiIChpbnNlcnQpIgorbXNnc3RyICIgKOaPkuWFpSkiCisKKyM6IHNjcmVlbi5jOjc4MDEKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKOWPluS7oykiCisKKyM6IHNjcmVlbi5jOjc4MDMKK21zZ2lkICIgKHZyZXBsYWNlKSIKK21zZ3N0ciAiICh2LeWPluS7oykiCisKKyM6IHNjcmVlbi5jOjc4MDYKK21zZ2lkICIgSGVicmV3IgorbXNnc3RyICIgSGVicmV3IgorCisjOiBzY3JlZW4uYzo3ODE0Cittc2dpZCAiIChsYW5nKSIKK21zZ3N0ciAiICjoqp7oqIApIgorCisjOiBzY3JlZW4uYzo3ODE3Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAo6LK85LiKKSIKKworIzogc2NyZWVuLmM6NzgyMworbXNnaWQgIiBTRUxFQ1QiCittc2dzdHIgIiDpgbjlj5YiCisKKyM6IHNjcmVlbi5jOjc4MjUKK21zZ2lkICIgVklTVUFMIgorbXNnc3RyICIg6YG45Y+WIgorCisjOiBzY3JlZW4uYzo3ODI3Cittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIg5Y2A5aGKIgorCisjOiBzY3JlZW4uYzo3ODI5Cittc2dpZCAiIExJTkUiCittc2dzdHIgIiDooYzpgbjlj5YiCisKKyM6IHNjcmVlbi5jOjc4NDIgc2NyZWVuLmM6NzkwMgorbXNnaWQgInJlY29yZGluZyIKK21zZ3N0ciAi6KiY6YyE5LitIgorCisjOiBzZWFyY2guYzozNgorbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKK21zZ3N0ciAi5bey5pCc5bCL5Yiw5qqU5qGI6ZaL6aCt77yb5YaN5b6e57WQ5bC+57m857qM5pCc5bCLIgorCisjOiBzZWFyY2guYzozNworbXNnaWQgInNlYXJjaCBoaXQgQk9UVE9NLCBjb250aW51aW5nIGF0IFRPUCIKK21zZ3N0ciAi5bey5pCc5bCL5Yiw5qqU5qGI57WQ5bC+77yb5YaN5b6e6ZaL6aCt57m857qM5pCc5bCLIgorCisjOiBzZWFyY2guYzo0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4Mzog6Yyv6Kqk55qE5pCc5bCL5a2X5LiyOiAlcyIKKworIzogc2VhcmNoLmM6NzgyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzODQ6IHNlYXJjaCBoaXQgVE9QIHdpdGhvdXQgbWF0Y2ggZm9yOiAlcyIKK21zZ3N0ciAiRTM4NDog5bey5pCc5bCL5Yiw5qqU5qGI6ZaL6aCt5LuN5om+5LiN5YiwICVzIgorCisjOiBzZWFyY2guYzo3ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg1OiDlt7LmkJzlsIvliLDmqpTmoYjntZDlsL7ku43mib7kuI3liLAgJXMiCisKKyM6IHNlYXJjaC5jOjExNTcKK21zZ2lkICJFMzg2OiBFeHBlY3RlZCAnPycgb3IgJy8nICBhZnRlciAnOyciCittc2dzdHIgIkUzODY6IOWcqCAnOycg5b6M6Z2i5oeJ6Kmy5pyJICc/JyDmiJYgJy8nIgorCisjOiBzZWFyY2guYzozNTY3Cittc2dpZCAiIChpbmNsdWRlcyBwcmV2aW91c2x5IGxpc3RlZCBtYXRjaCkiCittc2dzdHIgIiAo5YyF5ous5YmN5qyh5YiX5Ye656ym5ZCI6aCFKSIKKworIy4gY3Vyc29yIGF0IHN0YXR1cyBsaW5lCisjOiBzZWFyY2guYzozNTg3Cittc2dpZCAiLS0tIEluY2x1ZGVkIGZpbGVzICIKK21zZ3N0ciAiLS0tIOW8leWFpeaqlOahiCAiCisKKyM6IHNlYXJjaC5jOjM1ODkKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICLmib7kuI3liLAgIgorCisjOiBzZWFyY2guYzozNTkwCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM2MjkKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKOW3suWIl+WHuikiCisKKyM6IHNlYXJjaC5jOjM2MzEKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICDmib7kuI3liLAiCisKKyM6IHNlYXJjaC5jOjM2ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIuaQnOWwi+W8leWFpeaqlOahiDogJXMiCisKKyM6IHNlYXJjaC5jOjM5MDEKK21zZ2lkICJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiCittc2dzdHIgIkUzODc6IOebruWJjeaJgOWcqOihjOS4reacieS4gOWMuemFjSIKKworIzogc2VhcmNoLmM6NDA0MQorbXNnaWQgIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIgorbXNnc3RyICLmiYDmnInlvJXlhaXmqpTmoYjpg73lt7Lmib7liLAiCisKKyM6IHNlYXJjaC5jOjQwNDMKK21zZ2lkICJObyBpbmNsdWRlZCBmaWxlcyIKK21zZ3N0ciAi5rKS5pyJ5byV5YWl5qqU5qGIIgorCisjOiBzZWFyY2guYzo0MDU5Cittc2dpZCAiRTM4ODogQ291bGRuJ3QgZmluZCBkZWZpbml0aW9uIgorbXNnc3RyICJFMzg4OiDmib7kuI3liLDlrprnvqkiCisKKyM6IHNlYXJjaC5jOjQwNjEKK21zZ2lkICJFMzg5OiBDb3VsZG4ndCBmaW5kIHBhdHRlcm4iCittc2dzdHIgIkUzODk6IOaJvuS4jeWIsCBwYXR0ZXJuIgorCisjOiBzeW50YXguYzozMDE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTA6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMzkwOiDlj4PmlbjkuI3mraPnoro6ICVzIgorCisjOiBzeW50YXguYzozMTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiDnhKHmraQgc3ludGF4IGNsdXN0ZXI6IFwiJXNcIiIKKworIzogc3ludGF4LmM6MzM1OQorbXNnaWQgIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIKK21zZ3N0ciAi6YCZ5YCL57ep6KGd5Y2A5rKS5pyJ5a6a576p5Lu75L2V6Kqe5rOVIgorCisjOiBzeW50YXguYzozMzY3Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJD6Kqe6KiA5byP6Ki76Kej5ZCM5q2l5YyW5LitIgorCisjOiBzeW50YXguYzozMzc1Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAi5rKS5pyJ5ZCM5q2l5YyWIgorCisjOiBzeW50YXguYzozMzc4Cittc2dpZCAic3luY2luZyBzdGFydHMgIgorbXNnc3RyICLlkIzmraXljJbplovlp4siCisKKyM6IHN5bnRheC5jOjMzODAgc3ludGF4LmM6MzQ1NQorbXNnaWQgIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiCittc2dzdHIgIuihjOiZn+i2heWHuuevhOWcjSIKKworIzogc3ludGF4LmM6MzM4NQorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOiqnuazleWQjOatpeeJqeS7tiAoU3ludGF4IHN5bmMgaXRlbXMpIC0tLSIKKworIzogc3ludGF4LmM6MzM5MAorbXNnaWQgIiIKKyJcbiIKKyJzeW5jaW5nIG9uIGl0ZW1zIgorbXNnc3RyICIiCisiXG4iCisi5ZCM5q2l5YyW5LitOiIKKworIzogc3ludGF4LmM6MzM5NgorbXNnaWQgIiIKKyJcbiIKKyItLS0gU3ludGF4IGl0ZW1zIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSDoqp7ms5XpoIXnm64gLS0tIgorCisjOiBzeW50YXguYzozNDE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiDnhKHmraQgc3ludGF4IGNsdXN0ZXI6IFwiJXNcIiIKKworIzogc3ludGF4LmM6MzQ0NQorbXNnaWQgIm1pbmltYWwgIgorbXNnc3RyICLmnIDlsI8iCisKKyM6IHN5bnRheC5jOjM0NTIKK21zZ2lkICJtYXhpbWFsICIKK21zZ3N0ciAi5pyA5aSnIgorCisjOiBzeW50YXguYzozNDY0Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsg56ym5ZCIICIKKworIzogc3ludGF4LmM6MzQ2NgorbXNnaWQgIiBsaW5lIGJyZWFrcyIKK21zZ3N0ciAi5pa36KGMIgorCisjOiBzeW50YXguYzo0MTAwCittc2dpZCAiRTM5MzogZ3JvdXBbdF1oZXJlIG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzkzOiDkvb/nlKjkuobkuI3mraPnorrnmoTlj4PmlbgiCisKKyM6IHN5bnRheC5jOjQxMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIgorbXNnc3RyICJFMzk0OiDmib7kuI3liLAgJXMg55qEIHJlZ2lvbiBpdGVtIgorCisjOiBzeW50YXguYzo0MTUyCittc2dpZCAiRTM5NTogY29udGFpbnMgYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTU6IOS9v+eUqOS6huS4jeato+eiuueahOWPg+aVuCIKKworIzogc3ludGF4LmM6NDE2MworbXNnaWQgIkUzOTY6IGNvbnRhaW5lZGluIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk2OiDkvb/nlKjkuobkuI3mraPnorrnmoTlj4PmlbgiCisKKyM6IHN5bnRheC5jOjQyNDEKK21zZ2lkICJFMzk3OiBGaWxlbmFtZSByZXF1aXJlZCIKK21zZ3N0ciAiRTM5Nzog6ZyA6KaB5qqU5qGI5ZCN56ixIgorCisjOiBzeW50YXguYzo0NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTg6IE1pc3NpbmcgJz0nOiAlcyIKK21zZ3N0ciAiRTM5ODog57y65bCRIFwiPVwiOiAlcyIKKworIzogc3ludGF4LmM6NDczNworIywgYy1mb3JtYXQKK21zZ2lkICJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIKK21zZ3N0ciAiRTM5OTogc3ludGF4IHJlZ2lvbiAlcyDnmoTlvJXmlbjlpKrlsJEiCisKKyM6IHN5bnRheC5jOjUwNjgKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDog5rKS5pyJ5oyH5a6a55qE5bGs5oCnIgorCisjOiBzeW50YXguYzo1MTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIkU0MDE6IOaJvuS4jeWIsOWIhumalOespuiZnzogJXMiCisKKyM6IHN5bnRheC5jOjUxODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMjogR2FyYmFnZSBhZnRlciBwYXR0ZXJuOiAlcyIKK21zZ3N0ciAiRTQwMjogJyVzJyDlvozpnaLnmoTmnbHopb/nhKHms5XovqjorZgiCisKKyM6IHN5bnRheC5jOjUyNzAKK21zZ2lkICJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFNDAzOiDoqp7ms5XlkIzmraU6IOmAo+aOpeihjOespuiZn+iiq+aMh+WumuS6huWFqeasoSIKKworIzogc3ludGF4LmM6NTMyNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA0OiBJbGxlZ2FsIGFyZ3VtZW50czogJXMiCittc2dzdHIgIkU0MDQ6IOWPg+aVuOS4jeato+eiujogJXMiCisKKyM6IHN5bnRheC5jOjUzNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNTogTWlzc2luZyBlcXVhbCBzaWduOiAlcyIKK21zZ3N0ciAiRTQwNTog57y65bCR55u4562J56ym6JmfOiAlcyIKKworIzogc3ludGF4LmM6NTM4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MDY6IOepuueZveWPg+aVuDogJXMiCisKKyM6IHN5bnRheC5jOjU0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTQwNzogJXMg5LiN6IO95Zyo5q2k5Ye654++IgorCisjOiBzeW50YXguYzo1NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDg6ICVzIG11c3QgYmUgZmlyc3QgaW4gY29udGFpbnMgbGlzdCIKK21zZ3N0ciAiRTQwODogJXMg5b+F6aCI5piv5YiX6KGo6KOh55qE56ys5LiA5YCLIgorCisjOiBzeW50YXguYzo1NDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IOS4jeato+eiuueahOe+pOe1hOWQjeeosTogJXMiCisKKyM6IHN5bnRheC5jOjU3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIgorbXNnc3RyICJFNDEwOiDkuI3mraPnorrnmoQgOnN5bnRheCDlrZDlkb3ku6Q6ICVzIgorCisjOiBzeW50YXguYzo2MDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiDmib7kuI3liLAgaGlnaGxpZ2h0IGdyb3VwOiAlcyIKKworIzogc3ludGF4LmM6NjEyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjog5Y+D5pW45aSq5bCROiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTM6IFRvbyBtYW55IGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMzog5Y+D5pW46YGO5aSaOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorCisjOiBzeW50YXguYzo2MTUwCittc2dpZCAiRTQxNDogZ3JvdXAgaGFzIHNldHRpbmdzLCBoaWdobGlnaHQgbGluayBpZ25vcmVkIgorbXNnc3RyICJFNDE0OiDlt7LoqK3lrprnvqTntYQsIOW/veeVpSBoaWdobGlnaHQgbGluayIKKworIzogc3ludGF4LmM6NjI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiDkuI3oqbLmnInnmoTnrYnomZ86ICVzIgorCisjOiBzeW50YXguYzo2MzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6IOe8uuWwkeebuOetieespuiZnzogJXMiCisKKyM6IHN5bnRheC5jOjYzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IOe8uuWwkeWPg+aVuDogJXMiCisKKyM6IHN5bnRheC5jOjYzNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxODogSWxsZWdhbCB2YWx1ZTogJXMiCittc2dzdHIgIkU0MTg6IOS4jeWQiOazleeahOWAvDogJXMiCisKKyM6IHN5bnRheC5jOjY0OTMKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiDpjK/oqqTnmoTliY3mma/poY/oibIiCisKKyM6IHN5bnRheC5jOjY1MDQKK21zZ2lkICJFNDIwOiBCRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDIwOiDpjK/oqqTnmoTog4zmma/poY/oibIiCisKKyM6IHN5bnRheC5jOjY1NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQyMTogQ29sb3IgbmFtZSBvciBudW1iZXIgbm90IHJlY29nbml6ZWQ6ICVzIgorbXNnc3RyICJFNDIxOiDpjK/oqqTnmoTpoY/oibLlkI3nqLHmiJbmlbjlgLw6ICVzIgorCisjOiBzeW50YXguYzo2NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiDntYLnq6/mqZ/norzlpKrplbc6ICVzIgorCisjOiBzeW50YXguYzo2ODE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiDlj4PmlbjkuI3mraPnoro6ICVzIgorCisjOiBzeW50YXguYzo3MzQ3Cittc2dpZCAiRTQyNDogVG9vIG1hbnkgZGlmZmVyZW50IGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzIGluIHVzZSIKK21zZ3N0ciAiRTQyNDog5L2/55So5LqG6YGO5aSa55u455Ww55qE6auY5Lqu5bqm5bGs5oCnIgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6IOaomeexpCh0YWcp5aCG55aK57WQ5bC+IgorCisjOiB0YWcuYzo5MQorbXNnaWQgIkU1NTY6IGF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTY6IOaomeexpCh0YWcp5aCG55aK6ZaL6aCtIgorCisjOiB0YWcuYzozOTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTog5bey57aT5Zyo5pyA5YmN6Z2i55qE5qiZ57GkKHRhZynkuoYiCisKKyM6IHRhZy5jOjUxMgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDI2OiB0YWcgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQyNjog5om+5LiN5Yiw5qiZ57GkKHRhZyk6ICVzIgorCisjOiB0YWcuYzo1NDUKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMgcHJpIGtpbmQgdGFnIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgIuaqlOahiFxuIgorCisjLgorIy4gKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisjLiAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisjLgorIzogdGFnLmM6NzA2Cittc2dpZCAiRW50ZXIgbnIgb2YgY2hvaWNlICg8Q1I+IHRvIGFib3J0KTogIgorbXNnc3RyICLovLjlhaUgbnIg5oiW6YG45pOHICg8Q1I+IOmboumWiyk6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiDlj6rmnInmraTpoIXnrKblkIgiCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IOW3see2k+WcqOacgOW+jOS4gOWAi+espuWQiOeahCB0YWcg5LqGIgorCisjOiB0YWcuYzo3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIuaqlOahiCBcIiVzXCIg5LiN5a2Y5ZyoIgorCisjLiBHaXZlIGFuIGluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiBtYXRjaGluZyB0YWdzCisjOiB0YWcuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnICVkIG9mICVkJXMiCittc2dzdHIgIuaJvuWIsCB0YWc6ICVkLyVkJXMiCisKKyM6IHRhZy5jOjc4MworbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIg5oiW5pu05aSaIgorCisjOiB0YWcuYzo3ODUKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICDku6XkuI3lkIzlpKflsI/lr6vkvobkvb/nlKggdGFnISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiDmqpTmoYggXCIlc1wiIOS4jeWtmOWcqCIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiB0YWcuYzo4OTcKK21zZ2lkICIiCisiXG4iCisiICAjIFRPIHRhZyAgICAgICAgIEZST00gbGluZSAgaW4gZmlsZS90ZXh0IgorbXNnc3RyICIiCisiXG4iCisiICAjIOWIsCB0YWcgICAgICAgICDlvp4gICDooYwgICAg5ZyoIOaqlOahiC/mloflrZciCisKKyM6IHRhZy5jOjExNDQKK21zZ2lkICJMaW5lYXIgdGFnIHNlYXJjaCIKK21zZ3N0ciAi57ea5oCn5pCc5bCL5qiZ57GkIChUYWdzKSIKKworIzogdGFnLmM6MTE0NgorbXNnaWQgIkJpbmFyeSB0YWcgc2VhcmNoIgorbXNnc3RyICLkuozliIbmkJzlsIsoQmluYXJ5IHNlYXJjaCkg5qiZ57GkKFRhZ3MpIgorCisjOiB0YWcuYzoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiCittc2dzdHIgIuaQnOWwiyB0YWcg5qqU5qGIIFwiJXNcIiIKKworIzogdGFnLmM6MTM1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIKK21zZ3N0ciAiRTQzMDogVGFnIOaqlOahiOi3r+W+keiiq+aIquaWt+eCuiAlc1xuIgorCisjOiB0YWcuYzoxODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDMxOiBUYWcg5qqUIFwiJXNcIiDmoLzlvI/pjK/oqqQiCisKKyM6IHRhZy5jOjE4NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICLlnKggJWxkIOS9jeWFg+S5i+WJjSIKKworIzogdGFnLmM6MTg4MworIywgYy1mb3JtYXQKK21zZ2lkICJFNDMyOiBUYWdzIGZpbGUgbm90IHNvcnRlZDogJXMiCittc2dzdHIgIkU0MzI6IFRhZyDmqpTmoYjmnKrmjpLluo86ICVzIgorCisjLiBuZXZlciBvcGVuZWQgYW55IHRhZ3MgZmlsZQorIzogdGFnLmM6MTkyMgorbXNnaWQgIkU0MzM6IE5vIHRhZ3MgZmlsZSIKK21zZ3N0ciAiRTQzMzog5rKS5pyJIHRhZyDmqpQiCisKKyM6IHRhZy5jOjI2MDAKK21zZ2lkICJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIgorbXNnc3RyICJFNDM0OiDmib7kuI3liLAgdGFnIgorCisjOiB0YWcuYzoyNjExCittc2dpZCAiRTQzNTogQ291bGRuJ3QgZmluZCB0YWcsIGp1c3QgZ3Vlc3NpbmchIgorbXNnc3RyICJFNDM1OiDmib7kuI3liLAgdGFnLCDnlKjnjJznmoQhIgorCisjOiB0ZXJtLmM6MTc0NQorbXNnaWQgIicgbm90IGtub3duLiBBdmFpbGFibGUgYnVpbHRpbiB0ZXJtaW5hbHMgYXJlOiIKK21zZ3N0ciAiJyDnhKHms5XovInlhaXjgILlj6/nlKjnmoTlhaflu7rntYLnq6/mqZ/lvaLlvI/mnIk6IgorCisjOiB0ZXJtLmM6MTc2OQorbXNnaWQgImRlZmF1bHRpbmcgdG8gJyIKK21zZ3N0ciAi6aCQ6KitOiAnIgorCisjOiB0ZXJtLmM6MjEyNworbXNnaWQgIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIKK21zZ3N0ciAiRTU1Nzog54Sh5rOV6ZaL5ZWfIHRlcm1jYXAg5qqU5qGIIgorCisjOiB0ZXJtLmM6MjEzMQorbXNnaWQgIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIKK21zZ3N0ciAiRTU1ODogdGVybWluZm8g5Lit5rKS5pyJ57WC56uv5qmf6LOH5paZ6aCFIgorCisjOiB0ZXJtLmM6MjEzMworbXNnaWQgIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIgorbXNnc3RyICJFNTU5OiB0ZXJtY2FwIOS4reaykuaciee1guerr+apn+izh+aWmemghSIKKworIzogdGVybS5jOjIyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiCittc2dzdHIgIkU0MzY6IHRlcm1jYXAg5rKS5pyJIFwiJXNcIiBlbnRyeSIKKworIzogdGVybS5jOjI3NjYKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzog57WC56uv5qmf6ZyA6KaBIFwiY21cIiDnmoTog73lipsiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGVybS5jOjQ5MjcKK21zZ2lkICIiCisiXG4iCisiLS0tIFRlcm1pbmFsIGtleXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIOe1guerr+apn+aMiemNtSAtLS0iCisKKyM6IHVpLmM6MjUyCittc2dpZCAibmV3IHNoZWxsIHN0YXJ0ZWRcbiIKK21zZ3N0ciAi6LW35YuV5pawIHNoZWxsXG4iCisKKyM6IHVpLmM6MTc4NAorbXNnaWQgIlZpbTogRXJyb3IgcmVhZGluZyBpbnB1dCwgZXhpdGluZy4uLlxuIgorbXNnc3RyICJWaW06IOiugOWPlui8uOWFpemMr+iqpO+8jOmboumWi+S4rS4uLlxuIgorCisjLiBtdXN0IGRpc3BsYXkgdGhlIHByb21wdAorIzogdW5kby5jOjM5NAorbXNnaWQgIk5vIHVuZG8gcG9zc2libGU7IGNvbnRpbnVlIGFueXdheSIKK21zZ3N0ciAi54Sh5rOV6YKE5Y6f77yb6KuL57m857qM5Yqq5YqbIgorCisjOiB1bmRvLmM6NTQ5Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzog6KGM6Jmf6Yyv6KqkIgorCisjOiB1bmRvLmM6NzE4Cittc2dpZCAiMSBjaGFuZ2UiCittc2dzdHIgIuS4gOmgheaUueiuiiIKKworIzogdW5kby5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgY2hhbmdlcyIKK21zZ3N0ciAiJWxkIOmgheaUueiuiiIKKworIzogdW5kby5jOjc2NAorbXNnaWQgIkU0Mzk6IHVuZG8gbGlzdCBjb3JydXB0IgorbXNnc3RyICJFNDM5OiDlvqnljp/liJfooajmkI3lo54iCisKKyM6IHVuZG8uYzo3OTYKK21zZ2lkICJFNDQwOiB1bmRvIGxpbmUgbWlzc2luZyIKK21zZ3N0ciAiRTQ0MDog5om+5LiN5Yiw6KaBIHVuZG8g55qE6KGMIgorCisjLiBPbmx5IE1TIFZDIDQuMSBhbmQgZWFybGllciBjYW4gZG8gV2luMzJzCisjOiB2ZXJzaW9uLmM6NjgyCittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAxNi8zMiBCaXQg5ZyW5Z6L55WM6Z2i54mI5pysIgorCisjOiB2ZXJzaW9uLmM6Njg0Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgYml0IEdVSSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBCaXQg5ZyW5Z6L55WM6Z2i54mI5pysIgorCisjOiB2ZXJzaW9uLmM6Njg3Cittc2dpZCAiIGluIFdpbjMycyBtb2RlIgorbXNnc3RyICJXaW4zMnMg5qih5byPIgorCisjOiB2ZXJzaW9uLmM6Njg5Cittc2dpZCAiIHdpdGggT0xFIHN1cHBvcnQiCittc2dzdHIgIuaUr+aPtCBPTEUiCisKKyM6IHZlcnNpb24uYzo2OTIKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBCaXQgY29uc29sZSDniYjmnKwiCisKKyM6IHZlcnNpb24uYzo2OTYKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAxNiBiaXQgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgQml0IGNvbnNvbGUg54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NzAwCittc2dpZCAiIgorIlxuIgorIjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjMyIEJpdCBNUy1ET1Mg54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NzAyCittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IEJpdCBNUy1ET1Mg54mI5pysIgorCisjOiB2ZXJzaW9uLmM6NzA4Cittc2dpZCAiIgorIlxuIgorIk1hY09TIFggKHVuaXgpIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSDniYjmnKwiCisKKyM6IHZlcnNpb24uYzo3MTAKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgWCB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCDniYjmnKwiCisKKyM6IHZlcnNpb24uYzo3MTMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIOeJiOacrCIKKworIzogdmVyc2lvbi5jOjcxOAorbXNnaWQgIiIKKyJcbiIKKyJSSVNDIE9TIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJSSVNDIE9TIOeJiOacrCIKKworIzogdmVyc2lvbi5jOjcyOAorbXNnaWQgIiIKKyJcbiIKKyJJbmNsdWRlZCBwYXRjaGVzOiAiCittc2dzdHIgIiIKKyJcbiIKKyLlvJXlhaXkv67mraM6ICIKKworIzogdmVyc2lvbi5jOjc1NCB2ZXJzaW9uLmM6MTA5NworbXNnaWQgIk1vZGlmaWVkIGJ5ICIKK21zZ3N0ciAi5L+u5pS56ICF54K6IgorCisjOiB2ZXJzaW9uLmM6NzYxCittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIue3qOitryIKKworIzogdmVyc2lvbi5jOjc2NAorbXNnaWQgImJ5ICIKK21zZ3N0ciAi6ICFOiIKKworIzogdmVyc2lvbi5jOjc3NgorbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisi6LaF5by354mI5pysICIKKworIzogdmVyc2lvbi5jOjc3OQorbXNnaWQgIiIKKyJcbiIKKyJCaWcgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLlpKflnovniYjmnKwgIgorCisjOiB2ZXJzaW9uLmM6NzgyCittc2dpZCAiIgorIlxuIgorIk5vcm1hbCB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIuS4gOiIrOeJiOacrCAiCisKKyM6IHZlcnNpb24uYzo3ODUKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLnsKHmmJPniYjmnKwgIgorCisjOiB2ZXJzaW9uLmM6Nzg3Cittc2dpZCAiIgorIlxuIgorIlRpbnkgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLnsr7nsKHniYjmnKwgIgorCisjOiB2ZXJzaW9uLmM6NzkzCittc2dpZCAid2l0aG91dCBHVUkuIgorbXNnc3RyICLkuI3kvb/nlKjlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo3OTgKK21zZ2lkICJ3aXRoIEdUSzItR05PTUUgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEdUSzItR05PTUUg5ZyW5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6ODAwCittc2dpZCAid2l0aCBHVEstR05PTUUgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEdUSy1HTk9NRSDlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo4MDQKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEdUSzIg5ZyW5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6ODA2Cittc2dpZCAid2l0aCBHVEsgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEdUSyDlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo4MTEKK21zZ2lkICJ3aXRoIFgxMS1Nb3RpZiBHVUkuIgorbXNnc3RyICLkvb/nlKggWDExLU1vdGlmIOWcluWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjgxNAorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICLkvb/nlKggWDExLUF0aGVuYSDlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo4MTcKK21zZ2lkICJ3aXRoIEJlT1MgR1VJLiIKK21zZ3N0ciAi5L2/55SoIEJlT1Mg5ZyW5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6ODIwCittc2dpZCAid2l0aCBQaG90b24gR1VJLiIKK21zZ3N0ciAi5L2/55SoUGhvdG9u5ZyW5Z6L55WM6Z2i44CCIgorCisjOiB2ZXJzaW9uLmM6ODIzCittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICLkvb/nlKjlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo4MjYKK21zZ2lkICJ3aXRoIENhcmJvbiBHVUkuIgorbXNnc3RyICLkvb/nlKggQ2FyYm9uIOWcluWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjgyOQorbXNnaWQgIndpdGggQ29jb2EgR1VJLiIKK21zZ3N0ciAi5L2/55SoIENvY29hIOWcluWei+eVjOmdouOAgiIKKworIzogdmVyc2lvbi5jOjgzMgorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgIuS9v+eUqCAo5YKz57WxKSDlnJblnovnlYzpnaLjgIIiCisKKyM6IHZlcnNpb24uYzo4NDMKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIg55uu5YmN5Y+v5L2/55SoKCsp6IiH5LiN5Y+v5L2/55SoKC0p55qE5qih57WE5YiX6KGoOlxuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIOezu+e1sSB2aW1yYyDoqK3lrprmqpQ6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODYwCittc2dpZCAiICAgICB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgIOS9v+eUqOiAheWAi+S6uiB2aW1yYyDoqK3lrprmqpQ6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODY1Cittc2dpZCAiIDJuZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAg56ys5LqM57WE5YCL5Lq6IHZpbXJjIOaqlOahiDogXCIiCisKKyM6IHZlcnNpb24uYzo4NzAKK21zZ2lkICIgM3JkIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICDnrKzkuInntYTlgIvkurogdmltcmMg5qqU5qGIOiBcIiIKKworIzogdmVyc2lvbi5jOjg3NQorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAg5L2/55So6ICF5YCL5Lq6IGV4cmMg6Kit5a6a5qqUOiBcIiIKKworIzogdmVyc2lvbi5jOjg4MAorbXNnaWQgIiAgMm5kIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAg56ys5LqM57WE5L2/55So6ICFIGV4cmMg5qqU5qGIOiBcIiIKKworIzogdmVyc2lvbi5jOjg4NgorbXNnaWQgIiAgc3lzdGVtIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAg57O757WxIGd2aW1yYyDmqpTmoYg6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODkwCittc2dpZCAiICAgIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgIOS9v+eUqOiAheWAi+S6uiBndmltcmMg5qqUOiBcIiIKKworIzogdmVyc2lvbi5jOjg5NAorbXNnaWQgIjJuZCB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAg56ys5LqM57WE5YCL5Lq6IGd2aW1yYyDmqpTmoYg6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODk5Cittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICDnrKzkuInntYTlgIvkurogZ3ZpbXJjIOaqlOahiDogXCIiCisKKyM6IHZlcnNpb24uYzo5MDYKK21zZ2lkICIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiCittc2dzdHIgIiAgICAgICAgICAg57O757Wx6YG45Zau6Kit5a6a5qqUOiBcIiIKKworIzogdmVyc2lvbi5jOjkxNAorbXNnaWQgIiAgZmFsbC1iYWNrIGZvciAkVklNOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICAgICAkVklNIOmgkOioreWAvDogXCIiCisKKyM6IHZlcnNpb24uYzo5MjAKK21zZ2lkICIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiCittc2dzdHIgIiAgICAgICAkVklNUlVOVElNRSDpoJDoqK3lgLw6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTI0Cittc2dpZCAiQ29tcGlsYXRpb246ICIKK21zZ3N0ciAi57eo6K2v5pa55byPOiAiCisKKyM6IHZlcnNpb24uYzo5MzAKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICLnt6jora/lmag6ICIKKworIzogdmVyc2lvbi5jOjkzNQorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAi6Y+I57WQ5pa55byPOiAiCisKKyM6IHZlcnNpb24uYzo5NDAKK21zZ2lkICIgIERFQlVHIEJVSUxEIgorbXNnc3RyICIgIOmZpOmMr+eJiOacrCIKKworIzogdmVyc2lvbi5jOjk3NgorbXNnaWQgIlZJTSAtIFZpIElNcHJvdmVkIgorbXNnc3RyICJWSU0gLSBWaSBJTXByb3ZlZCIKKworIzogdmVyc2lvbi5jOjk3OAorbXNnaWQgInZlcnNpb24gIgorbXNnc3RyICLniYjmnKwgICAiCisKKyM6IHZlcnNpb24uYzo5NzkKK21zZ2lkICJieSBCcmFtIE1vb2xlbmFhciBldCBhbC4iCittc2dzdHIgIue2reitt+iAhTogQnJhbSBNb29sZW5hYXIgZXQgYWwuIgorCisjOiB2ZXJzaW9uLmM6OTgzCittc2dpZCAiVmltIGlzIG9wZW4gc291cmNlIGFuZCBmcmVlbHkgZGlzdHJpYnV0YWJsZSIKK21zZ3N0ciAiVmltIOeCuuWPr+iHqueUseaVo+S9iOeahOmWi+aUvuWOn+Wni+eivOi7n+mrlCIKKworIzogdmVyc2lvbi5jOjk4NQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICLoq4vluavliqnng4/lubLpgZTnmoTlj6/mhpDlrannq6UhIgorCisjOiB2ZXJzaW9uLmM6OTg2Cittc2dpZCAidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIKK21zZ3N0ciAi6YCy5LiA5q2l6Kqq5piO6KuL6Ly45YWlICAgICAgICAgIDpoZWxwIGljY2Y8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTg4Cittc2dpZCAidHlwZSAgOnE8RW50ZXI+ICAgICAgICAgICAgICAgdG8gZXhpdCAgICAgICAgICIKK21zZ3N0ciAi6KaB6Zui6ZaL6KuL6Ly45YWlICAgICAgICAgICAgICAgICAgOnE8RW50ZXI+ICAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6OTg5Cittc2dpZCAidHlwZSAgOmhlbHA8RW50ZXI+ICBvciAgPEYxPiAgZm9yIG9uLWxpbmUgaGVscCIKK21zZ3N0ciAi57ea5LiK6Kqq5piO6KuL6Ly45YWlICAgICAgICAgICAgICAgIDpoZWxwPEVudGVyPiAgICAgICAgICIKKworIzogdmVyc2lvbi5jOjk5MAorbXNnaWQgInR5cGUgIDpoZWxwIHZlcnNpb242PEVudGVyPiAgIGZvciB2ZXJzaW9uIGluZm8iCittc2dzdHIgIuaWsOeJiOacrOizh+ioiuiri+i8uOWFpSAgICAgICAgICAgICAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6OTkzCittc2dpZCAiUnVubmluZyBpbiBWaSBjb21wYXRpYmxlIG1vZGUiCittc2dzdHIgIlZpIOebuOWuueaooeW8jyIKKworIzogdmVyc2lvbi5jOjk5NAorbXNnaWQgInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiCittc2dzdHIgIuWmguaenOimgeWujOWFqOaooeaTrOWCs+e1sSBWaSDoq4vovLjlhaUgOnNldCBub2NwPEVudGVyPiIKKworIzogdmVyc2lvbi5jOjk5NQorbXNnaWQgInR5cGUgIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIuWmguaenOmcgOimgeWwjSBWaSDnm7jlrrnmqKHlvI/nmoTpgLLkuIDmraXoqqrmmI7oq4vovLjlhaUgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzoxMDEwCittc2dpZCAibWVudSAgSGVscC0+T3JwaGFucyAgICAgICAgICAgZm9yIGluZm9ybWF0aW9uICAgICIKK21zZ3N0ciAi6YCy5LiA5q2l6Kqq5piO6KuL6YG45Y+W6YG45Zau55qEIOi8lOWKqeiqquaYji0+5ouv5pWR5a2k5YWSIgorCisjOiB2ZXJzaW9uLmM6MTAxMgorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIuWft+ihjCBNb2RlbGVzcyDmqKHlvI/vvIzovLjlhaXnmoTmloflrZfmnIPoh6rli5Xmj5LlhaUiCisKKyM6IHZlcnNpb24uYzoxMDEzCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAi6YG45Y+W6YG45Zau55qE44CM57eo6Lyv44CN44CM5YWo5Z+f6Kit5a6a44CN44CM5YiH5o+b5o+S5YWl5qih5byP44CNIgorCisjOiB2ZXJzaW9uLmM6MTAxNAorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0d28gbW9kZXMgICAgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWFqeeoruaooeW8jyAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTAxOAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIumBuOWPlumBuOWWrueahOOAjOe3qOi8r+OAjeOAjOWFqOWfn+ioreWumuOAjeOAjOWIh+aPm+WCs+e1sVZp55u45a655qih5byP44CNIgorCisjOiB2ZXJzaW9uLmM6MTAxOQorbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiCittc2dzdHIgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOS7peW+lyBWaW0g6aCQ6Kit5YC8ICAgICIKKworIzogdmVyc2lvbi5jOjEwNjUKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICLms6jmhI86IOWBtea4rOWIsCBXaW5kb3dzIDk1Lzk4L01FIgorCisjOiB2ZXJzaW9uLmM6MTA2OAorbXNnaWQgInR5cGUgIDpoZWxwIHdpbmRvd3M5NTxFbnRlcj4gIGZvciBpbmZvIG9uIHRoaXMiCittc2dzdHIgIuWmguaenOmcgOimgeWwjSBXaW5kb3dzIDk1IOaUr+aPtOeahOabtOWkmuizh+ioiuiri+i8uOWFpSA6aGVscCB3aW5kb3dzOTU8RW50ZXI+IgorCisjOiB3aW5kb3cuYzoyMDQKK21zZ2lkICJFNDQxOiBUaGVyZSBpcyBubyBwcmV2aWV3IHdpbmRvdyIKK21zZ3N0ciAiRTQ0MTog5rKS5pyJ6aCQ6Ka96KaW56qXIgorCisjOiB3aW5kb3cuYzo1NzcKK21zZ2lkICJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIgorbXNnc3RyICJFNDQyOiDkuI3og73lkIzmmYLliIblibLoppbnqpfngrrlt6bkuIrlkozlj7PkuIvop5IiCisKKyM6IHdpbmRvdy5jOjEzMzYKK21zZ2lkICJFNDQzOiBDYW5ub3Qgcm90YXRlIHdoZW4gYW5vdGhlciB3aW5kb3cgaXMgc3BsaXQiCittc2dzdHIgIkU0NDM6IOacieWFtuWug+WIhuWJsuimlueql+aZgueEoeazleaXi+i9iSIKKworIzogd2luZG93LmM6MTgyNworbXNnaWQgIkU0NDQ6IENhbm5vdCBjbG9zZSBsYXN0IHdpbmRvdyIKK21zZ3N0ciAiRTQ0NDog5LiN6IO96Zec6ZaJ5pyA5b6M5LiA5YCL6KaW56qXIgorCisjOiB3aW5kb3cuYzoyNTU3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIuW3sue2k+WPquWJqeS4gOWAi+imlueql+S6hiIKKworIzogd2luZG93LmM6MjYwNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiDlhbblroPoppbnqpfmnInmm7Tli5Xos4fmlpkiCisKKyM6IHdpbmRvdy5jOjQ0NDkKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiDmuLjmqJnomZXmspLmnInmqpTlkI0iCisKKyM6IHdpbmRvdy5jOjQ1NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFNDQ3OiDlnKjot6/lvpHkuK3mib7kuI3liLDmqpTmoYggXCIlc1wiIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjU4NgorbXNnaWQgIkVkaXQgd2l0aCAmbXVsdGlwbGUgVmltcyIKK21zZ3N0ciAi5L2/55So5aSa5YCLIFZpbSBzZXNzaW9uIOe3qOi8rygmTSkiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTkyCittc2dpZCAiRWRpdCB3aXRoIHNpbmdsZSAmVmltIgorbXNnc3RyICLlj6rkvb/nlKjlkIzkuIDlgIsgVmltIHNlc3Npb24g57eo6LyvKCZWKSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MDEKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAi5L2/55SoIFZpbSDkvobmr5TovIMoJkRpZmYpIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjYxNAorbXNnaWQgIkVkaXQgd2l0aCAmVmltIgorbXNnc3RyICLkvb/nlKggVmltIOe3qOi8r+atpOaqlCgmVikiCisKKyMuIE5vdyBjb25jYXRlbmF0ZQorIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MzYKK21zZ2lkICJFZGl0IHdpdGggZXhpc3RpbmcgVmltIC0gJiIKK21zZ3N0ciAi5L2/55So5Z+36KGM5Lit55qEIFZpbSBzZXNzaW9uIOe3qOi8ryAtICYiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NzQ5Cittc2dpZCAiRWRpdHMgdGhlIHNlbGVjdGVkIGZpbGUocykgd2l0aCBWaW0iCittc2dzdHIgIuS9v+eUqCBWaW0g57eo6Lyv5bey6YG45Y+W55qE5qqU5qGIIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg4OCAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjk2OQorbXNnaWQgIkVycm9yIGNyZWF0aW5nIHByb2Nlc3M6IENoZWNrIGlmIGd2aW0gaXMgaW4geW91ciBwYXRoISIKK21zZ3N0ciAi54Sh5rOV5Z+36KGM56iL5byPOiDoq4vmqqLmn6UgZ3ZpbSDmnInmspLmnInlnKjkvaDnmoQgUEFUSCDorormlbjoo6EhIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjg4OSAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwMworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NzAKK21zZ2lkICJndmltZXh0LmRsbCBlcnJvciIKK21zZ3N0ciAiZ3ZpbWV4dC5kbGwg6Yyv6KqkIgorCisjOiAuLi9HdmltRXh0L2d2aW1leHQuY3BwOjkwMgorbXNnaWQgIlBhdGggbGVuZ3RoIHRvbyBsb25nISIKK21zZ3N0ciAi6Lev5b6R6ZW35bqm5aSq6ZW3ISIKKworIzogZ2xvYmFscy5oOjk5MAorbXNnaWQgIi0tTm8gbGluZXMgaW4gYnVmZmVyLS0iCittc2dzdHIgIi0t57ep6KGd5Y2A54Sh6LOH5paZLS0iCisKKyMuCisjLiAqIFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBzaGFyZWQgYXJlIGluY2x1ZGVkIGhlcmUuCisjLiAqIEV4Y2x1ZGVkIGFyZSBlcnJvcnMgdGhhdCBhcmUgb25seSB1c2VkIG9uY2UgYW5kIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyMuCisjOiBnbG9iYWxzLmg6MTE0OQorbXNnaWQgIkU0NzA6IENvbW1hbmQgYWJvcnRlZCIKK21zZ3N0ciAiRTQ3MDog5ZG95Luk6KKr5by35Yi25Lit5pa35Z+36KGMIgorCisjOiBnbG9iYWxzLmg6MTE1MAorbXNnaWQgIkU0NzE6IEFyZ3VtZW50IHJlcXVpcmVkIgorbXNnc3RyICJFNDcxOiDpnIDopoHmjIfku6Tlj4PmlbgiCisKKyM6IGdsb2JhbHMuaDoxMTUxCittc2dpZCAiRTEwOiBcXCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLywgPyBvciAmIgorbXNnc3RyICJFMTA6IFxcIOW+jOmdouaHieipsuaciSAvID8g5oiWICYiCisKKyM6IGdsb2JhbHMuaDoxMTUzCittc2dpZCAiRTExOiBJbnZhbGlkIGluIGNvbW1hbmQtbGluZSB3aW5kb3c7IDxDUj4gZXhlY3V0ZXMsIENUUkwtQyBxdWl0cyIKK21zZ3N0ciAiRTExOiDkuI3og73lnKjlkb3ku6TliJfoppbnqpfkuK3kvb/nlKjjgII8Q1I+5Z+36KGM77yMQ1RSTC1DIOmboumWiyIKKworIzogZ2xvYmFscy5oOjExNTUKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIkUxMjogZXhyYy92aW1yYyDoo6HnmoTmjIfku6TnhKHms5Xln7fooYwiCisKKyM6IGdsb2JhbHMuaDoxMTU3Cittc2dpZCAiRTE3MTogTWlzc2luZyA6ZW5kaWYiCittc2dzdHIgIkUxNzE6IOe8uuWwkSA6ZW5kaWYiCisKKyM6IGdsb2JhbHMuaDoxMTU4Cittc2dpZCAiRTYwMDogTWlzc2luZyA6ZW5kdHJ5IgorbXNnc3RyICJFNjAwOiDnvLrlsJEgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjExNTkKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDog57y65bCRIDplbmR3aGlsZSIKKworIzogZ2xvYmFscy5oOjExNjAKK21zZ2lkICJFNTg4OiA6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiCittc2dzdHIgIkU1ODg6IDplbmR3aGlsZSDnvLrlsJHlsI3mh4nnmoQgOndoaWxlIgorCisjOiBnbG9iYWxzLmg6MTE2MgorbXNnaWQgIkUxMzogRmlsZSBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTEzOiDmqpTmoYjlt7LntpPlrZjlnKggKOWPr+eUqCAhIOW8t+WItuWPluS7oykiCisKKyM6IGdsb2JhbHMuaDoxMTYzCittc2dpZCAiRTQ3MjogQ29tbWFuZCBmYWlsZWQiCittc2dzdHIgIkU0NzI6IOWRveS7pOWft+ihjOWkseaVlyIKKworIzogZ2xvYmFscy5oOjExNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNDogVW5rbm93biBmb250c2V0OiAlcyIKK21zZ3N0ciAiRTIzNDog5LiN5q2j56K655qE5a2X5YWD6ZuGIChGb250c2V0KTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzU6IFVua25vd24gZm9udDogJXMiCittc2dzdHIgIuS4jeato+eiuueahOWtl+Wei+WQjeeosTogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMzY6IEZvbnQgXCIlc1wiIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiRTIzNjogXCIlc1wiIOS4jeaYr+WbuuWumuWvrOW6puWtl+WeiyIKKworIzogZ2xvYmFscy5oOjExNzQKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3Mzog5YWn6YOo6Yyv6KqkIgorCisjOiBnbG9iYWxzLmg6MTE3NQorbXNnaWQgIkludGVycnVwdGVkIgorbXNnc3RyICLlt7LkuK3mlrciCisKKyM6IGdsb2JhbHMuaDoxMTc2Cittc2dpZCAiRTE0OiBJbnZhbGlkIGFkZHJlc3MiCittc2dzdHIgIkUxNDog5LiN5q2j56K655qE5L2N5Z2AIgorCisjOiBnbG9iYWxzLmg6MTE3NworbXNnaWQgIkU0NzQ6IEludmFsaWQgYXJndW1lbnQiCittc2dzdHIgIkU0NzQ6IOS4jeato+eiuueahOWPg+aVuCIKKworIzogZ2xvYmFscy5oOjExNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ3NTogSW52YWxpZCBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0NzU6IOS4jeato+eiuueahOWPg+aVuDogJXMiCisKKyM6IGdsb2JhbHMuaDoxMTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTogSW52YWxpZCBleHByZXNzaW9uOiAlcyIKK21zZ3N0ciAiRTE1OiDkuI3mraPnorrnmoTpgYvnrpflvI86ICVzIgorCisjOiBnbG9iYWxzLmg6MTE4MgorbXNnaWQgIkUxNjogSW52YWxpZCByYW5nZSIKK21zZ3N0ciAiRTE2OiDkuI3mraPnorrnmoTnr4TlnI0iCisKKyM6IGdsb2JhbHMuaDoxMTgzCittc2dpZCAiRTQ3NjogSW52YWxpZCBjb21tYW5kIgorbXNnc3RyICJFNDc2OiDkuI3mraPnorrnmoTlkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNzogXCIlc1wiIGlzIGEgZGlyZWN0b3J5IgorbXNnc3RyICJFMTc6IFwiJXNcIiDmmK/nm67pjIQiCisKKyM6IGdsb2JhbHMuaDoxMTg4Cittc2dpZCAiRTE4OiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYmVmb3JlICc9JyIKK21zZ3N0ciAiRTE4OiAnPScg5YmN6Z2i5Ye654++5LqG6Yyv6Kqk55qE5a2X5YWDIgorCisjOiBnbG9iYWxzLmg6MTE5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDog5ZG85Y+r5Ye95byP5bqrIFwiJXNcIigpIOWkseaVlyIKKworIzogZ2xvYmFscy5oOjExOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MDogQ291bGQgbm90IGxvYWQgbGlicmFyeSAlcyIKK21zZ3N0ciAiRTM3MDog54Sh5rOV6YeN5paw6LyJ5YWl56iL5byP5bqrICVzIgorCisjOiBnbG9iYWxzLmg6MTE5NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ4OiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5IGZ1bmN0aW9uICVzIgorbXNnc3RyICJFNDQ4OiDnhKHms5XovInlhaXnqIvlvI/luqvnmoTlh73lvI8gJXMiCisKKyM6IGdsb2JhbHMuaDoxMTk5Cittc2dpZCAiRTE5OiBNYXJrIGhhcyBpbnZhbGlkIGxpbmUgbnVtYmVyIgorbXNnc3RyICJFMTk6IOaomeiomOeahOihjOiZn+mMr+iqpCIKKworIzogZ2xvYmFscy5oOjEyMDAKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiDmspLmnInoqK3lrprmqJnoqJgiCisKKyM6IGdsb2JhbHMuaDoxMjAxCittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IOWboOeCuiAnbW9kaWZpYWJsZScg6YG46aCF5piv6Zec6ZaJ55qE77yM5omA5Lul5LiN6IO95L+u5pS5IgorCisjOiBnbG9iYWxzLmg6MTIwMgorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjog5bei54uA6YGe6L+05ZG85Y+r5aSq5aSa5bGkIgorCisjOiBnbG9iYWxzLmg6MTIwMworbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzog5rKS5pyJ5pu/5Luj55qE5qqU5qGIIgorCisjOiBnbG9iYWxzLmg6MTIwNAorbXNnaWQgIkUyNDogTm8gc3VjaCBhYmJyZXZpYXRpb24iCittc2dzdHIgIkUyNDog5rKS5pyJ6YCZ5YCLIGFiYnJldmlhdGlvbiDlsI3mh4kiCisKKyM6IGdsb2JhbHMuaDoxMjA1Cittc2dpZCAiRTQ3NzogTm8gISBhbGxvd2VkIgorbXNnc3RyICJFNDc3OiDkuI3lj6/kvb/nlKggJyEnIgorCisjOiBnbG9iYWxzLmg6MTIwNworbXNnaWQgIkUyNTogR1VJIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWUiCittc2dzdHIgIkUyNTog5Zug54K657eo6K2v5pmC5rKS5pyJ5Yqg5YWl5ZyW5Z6L55WM6Z2i55qE56iL5byP56K877yM5omA5Lul54Sh5rOV5L2/55So5ZyW5Z6L55WM6Z2iIgorCisjOiBnbG9iYWxzLmg6MTIxMAorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiDlm6Dngrrnt6jora/mmYLmspLmnInliqDlhaUgSGVicmV3IOeahOeoi+W8j+eivO+8jOaJgOS7peeEoeazleS9v+eUqCBIZWJyZXdcbiIKKworIzogZ2xvYmFscy5oOjEyMTMKK21zZ2lkICJFMjc6IEZhcnNpIGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI3OiDlm6Dngrrnt6jora/mmYLmspLmnInliqDlhaUgRmFyc2kg55qE56iL5byP56K877yM5omA5Lul54Sh5rOV5L2/55SoIEZhcnNpXG4iCisKKyM6IGdsb2JhbHMuaDoxMjE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyODogTm8gc3VjaCBoaWdobGlnaHQgZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkUyODog5rKS5pyJ5ZCN54K6ICclcycg55qEIGhpZ2hsaWdodCBncm91cCIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IOmChOaykuacieaPkuWFpeaWh+Wtl+mBjiIKKworIzogZ2xvYmFscy5oOjEyMTkKK21zZ2lkICJFMzA6IE5vIHByZXZpb3VzIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiRTMwOiDmspLmnInliY3kuIDpoIXlkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMjIwCittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTog5rKS5pyJ6YCZ5YCLIG1hcHBpbmcg5bCN5oeJIgorCisjOiBnbG9iYWxzLmg6MTIyMQorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiDmib7kuI3liLAiCisKKyM6IGdsb2JhbHMuaDoxMjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDog5om+5LiN5YiwOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMjMKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiDmspLmnInmqpTlkI0iCisKKyM6IGdsb2JhbHMuaDoxMjI0Cittc2dpZCAiRTMzOiBObyBwcmV2aW91cyBzdWJzdGl0dXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiRTMzOiDmspLmnInliY3kuIDlgIvmkJzlsIsv5Y+W5Luj55qE5ZG95LukIgorCisjOiBnbG9iYWxzLmg6MTIyNQorbXNnaWQgIkUzNDogTm8gcHJldmlvdXMgY29tbWFuZCIKK21zZ3N0ciAiRTM0OiDmspLmnInliY3kuIDlgIvlkb3ku6QiCisKKyM6IGdsb2JhbHMuaDoxMjI2Cittc2dpZCAiRTM1OiBObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iCittc2dzdHIgIkUzNTog5rKS5pyJ5YmN5LiA5YCL5pCc5bCL5oyH5LukIgorCisjOiBnbG9iYWxzLmg6MTIyNworbXNnaWQgIkU0ODE6IE5vIHJhbmdlIGFsbG93ZWQiCittc2dzdHIgIkU0ODE6IOS4jeWPr+S9v+eUqOevhOWcjeaMh+S7pCIKKworIzogZ2xvYmFscy5oOjEyMjkKK21zZ2lkICJFMzY6IE5vdCBlbm91Z2ggcm9vbSIKK21zZ3N0ciAiRTM2OiDmspLmnInotrPlpKDnmoTnqbrplpMiCisKKyM6IGdsb2JhbHMuaDoxMjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDc6IG5vIHJlZ2lzdGVyZWQgc2VydmVyIG5hbWVkIFwiJXNcIiIKK21zZ3N0ciAiRTI0Nzog5rKS5pyJ6Ki75YaK54K6IFwiJXNcIiDnmoTkvLrmnI3lmagiCisKKyM6IGdsb2JhbHMuaDoxMjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODI6IENhbid0IGNyZWF0ZSBmaWxlICVzIgorbXNnc3RyICJFNDgyOiDkuI3og73lu7rnq4vmqpTmoYggJXMiCisKKyM6IGdsb2JhbHMuaDoxMjM1Cittc2dpZCAiRTQ4MzogQ2FuJ3QgZ2V0IHRlbXAgZmlsZSBuYW1lIgorbXNnc3RyICJFNDgzOiDnhKHms5Xlvpfnn6XmmqvlrZjmqpTlkI0iCisKKyM6IGdsb2JhbHMuaDoxMjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODQ6IENhbid0IG9wZW4gZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NDog54Sh5rOV6ZaL5ZWf5qqU5qGIICVzIgorCisjOiBnbG9iYWxzLmg6MTIzNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDg1OiBDYW4ndCByZWFkIGZpbGUgJXMiCittc2dzdHIgIkU0ODU6IOeEoeazleiugOWPluaqlOahiCAlcyIKKworIzogZ2xvYmFscy5oOjEyMzgKK21zZ2lkICJFMzc6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkUzNzog5bey5pu05pS56YGO5qqU5qGI5L2G5bCa5pyq5a2Y5qqUICjlj6/nlKggISDlvLfliLbln7fooYwpIgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiDnqbrnmoQgKE51bGwpIOWPg+aVuCIKKworIzogZ2xvYmFscy5oOjEyNDEKK21zZ2lkICJFMzk6IE51bWJlciBleHBlY3RlZCIKK21zZ3N0ciAiRTM5OiDmh4noqbLopoHmnInmlbjlrZciCisKKyM6IGdsb2JhbHMuaDoxMjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDogQ2FuJ3Qgb3BlbiBlcnJvcmZpbGUgJXMiCittc2dzdHIgIkU0MDog54Sh5rOV6ZaL5ZWf6Yyv6Kqk5qqU5qGIICVzIgorCisjOiBnbG9iYWxzLmg6MTI0NworbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IDzkuI3og73plovllZ8gWCBTZXJ2ZXIgRElTUExBWT4iCisKKyM6IGdsb2JhbHMuaDoxMjQ5Cittc2dpZCAiRTQxOiBPdXQgb2YgbWVtb3J5ISIKK21zZ3N0ciAiRTQxOiDoqJjmhrbpq5TkuI3otrMhIgorCisjOiBnbG9iYWxzLmg6MTI1MQorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICLmib7kuI3liLAiCisKKyM6IGdsb2JhbHMuaDoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4Njog5om+5LiN5YiwICVzIgorCisjOiBnbG9iYWxzLmg6MTI1NAorbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6IOWPg+aVuOaHieipsuaYr+ato+aVuCIKKworIzogZ2xvYmFscy5oOjEyNTYKK21zZ2lkICJFNDU5OiBDYW5ub3QgZ28gYmFjayB0byBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkU0NTk6IOeEoeazleWbnuWIsOWJjeS4gOWAi+ebrumMhCIKKworIzogZ2xvYmFscy5oOjEyNjAKK21zZ2lkICJFNDI6IE5vIEVycm9ycyIKK21zZ3N0ciAiRTQyOiDmspLmnInpjK/oqqQiCisKKyM6IGdsb2JhbHMuaDoxMjYyCittc2dpZCAiRTQzOiBEYW1hZ2VkIG1hdGNoIHN0cmluZyIKK21zZ3N0ciAiRTQzOiDnrKblkIjlrZfkuLLmnInllY/poYwiCisKKyM6IGdsb2JhbHMuaDoxMjYzCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogcmVnZXhwIOacieWVj+mhjCIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IOacieioreWumiAncmVhZG9ubHknIOmBuOmghSjllK/oroApICjlj6/nlKggISDlvLfliLbln7fooYwpIgorCisjOiBnbG9iYWxzLmg6MTI2NgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDY6IENhbm5vdCBzZXQgcmVhZC1vbmx5IHZhcmlhYmxlIFwiJXNcIiIKK21zZ3N0ciAiRTQ2OiDnhKHms5XoqK3lrprllK/oroDorormlbggXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTI2OQorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0Nzog6K6A5Y+W6Yyv6Kqk5qqU5qGI5aSx5pWXIgorCisjOiBnbG9iYWxzLmg6MTI3MgorbXNnaWQgIkU0ODogTm90IGFsbG93ZWQgaW4gc2FuZGJveCIKK21zZ3N0ciAiRTQ4OiDkuI3og73lnKggc2FuZGJveCDoo6Hlh7rnj74iCisKKyM6IGdsb2JhbHMuaDoxMjc0Cittc2dpZCAiRTUyMzogTm90IGFsbG93ZWQgaGVyZSIKK21zZ3N0ciAiRTUyMzog6YCZ6KOh5LiN5Y+v5L2/55SoIgorCisjOiBnbG9iYWxzLmg6MTI3NworbXNnaWQgIkUzNTk6IFNjcmVlbiBtb2RlIHNldHRpbmcgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTM1OTog5LiN5pSv5o+06Kit5a6a6J6i5bmV5qih5byPIgorCisjOiBnbG9iYWxzLmg6MTI3OQorbXNnaWQgIkU0OTogSW52YWxpZCBzY3JvbGwgc2l6ZSIKK21zZ3N0ciAiRTQ5OiDpjK/oqqTnmoTmjbLli5XlpKflsI8iCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiAnRTcxOiDpgbjpoIUgJ3NoZWxsJyDmnKroqK3lrpoiCisKKyM6IGdsb2JhbHMuaDoxMjgyCittc2dpZCAiRTI1NTogQ291bGRuJ3QgcmVhZCBpbiBzaWduIGRhdGEhIgorbXNnc3RyICJFMjU1OiDnhKHms5XoroDlj5Ygc2lnbiBkYXRhISIKKworIzogZ2xvYmFscy5oOjEyODQKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiDmmqvlrZjmqpTpl5zplonpjK/oqqQiCisKKyM6IGdsb2JhbHMuaDoxMjg1Cittc2dpZCAiRTczOiB0YWcgc3RhY2sgZW1wdHkiCittc2dzdHIgIkU3Mzog5qiZ57Gk5aCG55aK5bey56m6IgorCisjOiBnbG9iYWxzLmg6MTI4NgorbXNnaWQgIkU3NDogQ29tbWFuZCB0b28gY29tcGxleCIKK21zZ3N0ciAiRTc0OiDlkb3ku6TlpKropIfpm5wiCisKKyM6IGdsb2JhbHMuaDoxMjg3Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IOWQjeWtl+WkqumVtyIKKworIzogZ2xvYmFscy5oOjEyODgKK21zZ2lkICJFNzY6IFRvbyBtYW55IFsiCittc2dzdHIgIkU3Njog5aSq5aSaIFsiCisKKyM6IGdsb2JhbHMuaDoxMjg5Cittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6IOWkquWkmuaqlOWQjSIKKworIzogZ2xvYmFscy5oOjEyOTAKK21zZ2lkICJFNDg4OiBUcmFpbGluZyBjaGFyYWN0ZXJzIgorbXNnc3RyICJFNDg4OiDkvaDovLjlhaXkuoblpJrppJjnmoTlrZflhYMiCisKKyM6IGdsb2JhbHMuaDoxMjkxCittc2dpZCAiRTc4OiBVbmtub3duIG1hcmsiCittc2dzdHIgIkU3ODog54Sh5rOV6L6m6K2Y55qE5qiZ6KiYIgorCisjOiBnbG9iYWxzLmg6MTI5MgorbXNnaWQgIkU3OTogQ2Fubm90IGV4cGFuZCB3aWxkY2FyZHMiCittc2dzdHIgIkU3OTog54Sh5rOV5bGV6ZaL6JCs55So5a2X5YWDIgorCisjOiBnbG9iYWxzLmg6MTI5NAorbXNnaWQgIkU1OTE6ICd3aW5oZWlnaHQnIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gJ3dpbm1pbmhlaWdodCciCittc2dzdHIgIkU1OTE6ICd3aW5oZWlnaHQnIOS4jeiDveavlCAnd2lubWluaGVpZ2h0JyDmm7TlsJEiCisKKyM6IGdsb2JhbHMuaDoxMjk2Cittc2dpZCAiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIkU1OTI6ICd3aW53aWR0aCcg5LiN6IO95q+UICd3aW5taW53aWR0aCcg5pu05bCRIgorCisjOiBnbG9iYWxzLmg6MTI5OQorbXNnaWQgIkU4MDogRXJyb3Igd2hpbGUgd3JpdGluZyIKK21zZ3N0ciAiRTgwOiDlr6vlhaXpjK/oqqQiCisKKyM6IGdsb2JhbHMuaDoxMzAwCittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAi5pW45Yiw6Zu2ICg/KSIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IDxTSUQ+IOS4jeiDveWcqCBzY3JpcHQg5pys5paH5aSW5L2/55SoLiIKKworIzogZ2xvYmFscy5oOjEzMDUKK21zZ2lkICJFNDQ5OiBJbnZhbGlkIGV4cHJlc3Npb24gcmVjZWl2ZWQiCittc2dzdHIgIkU0NDk6IOaUtuWIsOS4jeato+eiuueahOmBi+eul+W8jyIKKworIzogZ2xvYmFscy5oOjEzMDgKK21zZ2lkICJFNDYzOiBSZWdpb24gaXMgZ3VhcmRlZCwgY2Fubm90IG1vZGlmeSIKK21zZ3N0ciAiRTQ2Mzog5Y2A5Z+f6KKr5L+d6K2377yM54Sh5rOV5L+u5pS5IgorCisjfiBtc2dpZCAiZnVuY3Rpb24gIgorI34gbXNnc3RyICLlh73lvI8gIgorCisjfiBtc2dpZCAiUnVuIE1hY3JvIgorI34gbXNnc3RyICLln7fooYzlt6jpm4YiCisKKyN+IG1zZ2lkICJFMjIxOiAnY29tbWVudHN0cmluZycgaXMgZW1wdHkiCisjfiBtc2dzdHIgIkUyMjE6IOmBuOmghSAnY29tbWVudHN0cmluZycg5pyq6Kit5a6aIgorCisjfiBtc2dpZCAiRTI0MjogQ29sb3IgbmFtZSBub3QgcmVjb2duaXplZDogJXMiCisjfiBtc2dzdHIgIkUyNDI6ICVzIOeCuueEoeazleitmOWIpeeahOmhj+iJsuWQjeeosSIKKworI34gbXNnaWQgIkUyNDI6IE1pc3NpbmcgY29sb3I6ICVzIgorI34gbXNnc3RyICJFMjQyOiDmib7kuI3liLDpoY/oibI6ICVzIgorCisjfiBtc2dpZCAiZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKKyN+IG1zZ3N0ciAi6K6A5Y+WIGNzY29wZSDpgKPnt5ogJWQg5pmC6Yyv6KqkIgorCisjfiBtc2dpZCAiRTI0OTogY291bGRuJ3QgcmVhZCBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkiCisjfiBtc2dzdHIgIkUyNDk6IOeEoeazleiugOWPliBWSU0g55qEIHJlZ2lzdHJ5IOioreWumumghSIKKworI34gbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlcyIKKyN+IG1zZ3N0ciAi54Sh5rOV6ZaL5ZWf5qqU5qGIICVzIgorCisjfiBtc2dpZCAiVW5hYmxlIHRvIHNlbmQgcmVwbHkiCisjfiBtc2dzdHIgIueEoeazleWCs+mAgeWbnuaHieioiuaBryIKKworI34gbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvIFZpbSBzZXJ2ZXIiCisjfiBtc2dzdHIgIkUyNDE6IOeEoeazleWCs+mAgeWIsCBWaW0g5Ly65pyN5ZmoIgorCisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gIlNlbmQgZmFpbGVkLiBObyBjb21tYW5kIHNlcnZlciBwcmVzZW50ID9cbiIKKyN+IG1zZ3N0ciAiIgorI34gIlxuIgorI34gIuWCs+mAgeWkseaVl+OAguaykuacieWRveS7pOS8uuacjeWZqOWtmOWcqCA/XG4iCisKKyN+IG1zZ2lkICJQQyAoMzIgYml0cyBWaW0pIgorI34gbXNnc3RyICJQQyAoMzIg5L2N5YWDIFZpbSkiCisKKyN+IG1zZ2lkICJQQyAoMTYgYml0cyBWaW0pIgorI34gbXNnc3RyICJQQyAoMTYg5L2N5YWDIFZpbSkiCisKKyN+IG1zZ2lkICJFMzYyOiBVbnN1cHBvcnRlZCBzY3JlZW4gbW9kZSIKKyN+IG1zZ3N0ciAiRTM2Mjog6J6i5bmV5qih5byP5LiN5pSv5o+0IgorCisjfiBtc2dpZCAiTm8gc2VydmVycyBmb3VuZCBmb3IgdGhpcyBkaXNwbGF5IgorI34gbXNnc3RyICLmraREaXNwbGF55rKS5pyJ5Ly65pyN5ZmoKFNlcnZlcnMpIgorCisjfiBtc2dpZCAiRTI1ODogbm8gbWF0Y2hlcyBmb3VuZCBpbiBjc2NvcGUgY29ubmVjdGlvbnMiCisjfiBtc2dzdHIgIkUyNTg6IGNzY29wZSDpgKPnt5rmib7kuI3liLDnrKblkIjnmoQiCisKKyN+IG1zZ2lkICIiCisjfiAiXG4iCisjfiAiTWFjT1MgQ2FyYm9uIgorI34gbXNnc3RyICIiCisjfiAiXG4iCisjfiAiTWFjT1MgQ2FyYm9uIgorCisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gIk1hY09TIDgiCisjfiBtc2dzdHIgIiIKKyN+ICJcbiIKKyN+ICJNYWNPUyA4IgorCisjfiBtc2dpZCAiUmV0cmlldmUgbmV4dCBzeW1ib2wiCisjfiBtc2dzdHIgIuiugOWPljog5b6e5LiL5YCLIHN5bWJvbCIKKworI34gbXNnaWQgIi0tIFNOaUZGKyBjb21tYW5kcyAtLSIKKyN+IG1zZ3N0ciAiLS0gU05pRkYrIOWRveS7pCAtLSIKKworI34gbXNnaWQgIkUyNzc6IFVucmVjb2duaXplZCBzbmlmZiByZXF1ZXN0IFslc10iCisjfiBtc2dzdHIgIkUyNzc6IOeEoeazlei+qOitmCBzbmlmZiDlkb3ku6QgWyVzXSIKZGlmZiAtLWdpdCBhL3NyYy9wby96aF9UVy5wbyBiL3NyYy9wby96aF9UVy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE4ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BvL3poX1RXLnBvCkBAIC0wLDAgKzEsNjM4OSBAQAorIyBUcmFkaXRpb25hbCBDaGluZXNlIFRyYW5zbGF0aW9uIGZvciBWaW0JdmltOnNldCBmb2xkbWV0aG9kPW1hcmtlcjoKKyMKKyMgRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisjIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorIworIyBGSVJTVCBBVVRIT1IgIEZyYW5jaXMgUy5MaW4gPHBpYWlwQGNzaWUubnR1LmVkdS50dz4sIDIwMDAKKyMgRklSU1QgUkVMRUFTRSBUaHUgSnVuIDE0IDE0OjI0OjE3IENTVCAyMDAxCisjCisjIExhc3QgdXBkYXRlOiBUaHUgQXByIDI0IDEzOjA5OjA3IENTVCAyMDAzICg2LjJhKQorIworIyBUbyB1cGRhdGUsIHNlYXJjaCBwYXR0ZXJuOgkJL2Z1enp5XHxebXNnc3RyICIiXChcbiJcKVxAIQorIworIyBETyBOT1QgVVNFIFdPUkRTIFdJVEggQkFDS1NMQVNIICgnXCcpIEFTIFNFQ09ORCBCWVRFIE9GIEJJRzUgQ0hBUlMKKyMgRUc6ICelXCcsICMgs1ylXLtcCisjIMBcrFy+XK9cvVy2XLJcxlywXMJcv1zBXMVcp1yqXKtcCisjILxcrlyxXMNcxFy0XLVct1y4XLlculyiXKRcplyoXKlcrVzhXORcCisjIHlvdSBjYW4gcmVwbGFjZSB0aGVzZSBjaGFyYWN0ZXJzIHdpdGggYWx0ZXJuYXRpdmUgd29yZHMuCisjIFRISVMgV0lMTCBDQVVTRSBJTkNPTVBBVElCTEUgT04gZ2V0dGV4dCAwLjEwLjM2KworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogVmltKFRyYWRpdGlvbmFsIENoaW5lc2UpXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDMtMDQtMjQgMTM6MDYrMDgwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IE1vbiBGZWIgMTkgMjI6NDk6MjEgQ1NUIDIwMDFcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZyYW5jaXMgUy5MaW4gPHBpYWlwQGNzaWUubnR1LmVkdS50dz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBGcmFuY2lzIFMuTGluIDxwaWFpcEBjc2llLm50dS5lZHUudHc+LCBDZWNpbCBTaGVuZyAiCisiPGI3NTA2MDIyQGNzaWUubnR1LmVkdS50dz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1iaWc1XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOC1iaXRcbiIKKworIzogYnVmZmVyLmM6OTcKK21zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgorbXNnc3RyICJFODI6ILVMqmuwdLhtpfSm8713vcSwz6FBwve2fbV7pqEuLi4iCisKKyM6IGJ1ZmZlci5jOjEwMAorbXNnaWQgIkU4MzogQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciwgdXNpbmcgb3RoZXIgb25lLi4uIgorbXNnc3RyICJFODM6ILVMqmuwdLhtvXe9xLDPoUGoz6XOpXSkQK3TvXe9xLDPLi4uLiIKKworIzogYnVmZmVyLmM6Nzk3Cittc2dpZCAiRTUxNTogTm8gYnVmZmVycyB3ZXJlIHVubG9hZGVkIgorbXNnc3RyICJFNTE1OiCoU6azxMCp8aX0pvO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjc5OQorbXNnaWQgIkU1MTY6IE5vIGJ1ZmZlcnMgd2VyZSBkZWxldGVkIgorbXNnc3RyICJFNTE2OiCoU6azp1Kwo6X0pvO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjgwMQorbXNnaWQgIkU1MTc6IE5vIGJ1ZmZlcnMgd2VyZSB3aXBlZCBvdXQiCittc2dzdHIgIkU1MTc6IKhTprOyTbCjpfSm8713vcSwzyIKKworIzogYnVmZmVyLmM6ODA5Cittc2dpZCAiMSBidWZmZXIgdW5sb2FkZWQiCittc2dzdHIgIqR3xMCp8aRArdO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjgxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIHVubG9hZGVkIgorbXNnc3RyICKkd8TAqfEgJWQgrdO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjgxNgorbXNnaWQgIjEgYnVmZmVyIGRlbGV0ZWQiCittc2dzdHIgIqR3p1Kwo6RArdO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjgxOAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBidWZmZXJzIGRlbGV0ZWQiCittc2dzdHIgIqR3p1KwoyAlZCCt0713vcSwzyIKKworIzogYnVmZmVyLmM6ODIzCittc2dpZCAiMSBidWZmZXIgd2lwZWQgb3V0IgorbXNnc3RyICKkd6dSsKOkQK3TvXe9xLDPIgorCisjOiBidWZmZXIuYzo4MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgYnVmZmVycyB3aXBlZCBvdXQiCittc2dzdHIgIqR3p1KwoyAlZCCt0713vcSwzyIKKworIzogYnVmZmVyLmM6ODg2Cittc2dpZCAiRTg0OiBObyBtb2RpZmllZCBidWZmZXIgZm91bmQiCittc2dzdHIgIkU4NDogqFOms63Xp++5TKq6vXe9xLDPIgorCisjLiBiYWNrIHdoZXJlIHdlIHN0YXJ0ZWQsIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorIzogYnVmZmVyLmM6OTI1Cittc2dpZCAiRTg1OiBUaGVyZSBpcyBubyBsaXN0ZWQgYnVmZmVyIgorbXNnc3RyICJFODU6IKhTprOmQ6VYqrq9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjkzNworIywgYy1mb3JtYXQKK21zZ2lkICJFODY6IENhbm5vdCBnbyB0byBidWZmZXIgJWxkIgorbXNnc3RyICJFODY6ILVMqmukwbSrqOyyxCAlbGQgrdO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjk0MAorbXNnaWQgIkU4NzogQ2Fubm90IGdvIGJleW9uZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTg3OiC1TKprpMG0q6jsp/Or4a2xqrq9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjk0MgorbXNnaWQgIkU4ODogQ2Fubm90IGdvIGJlZm9yZSBmaXJzdCBidWZmZXIiCittc2dzdHIgIkU4ODogtUyqa6TBtKuo7Kfzq2Wtsaq6vXe9xLDPIgorCisjOiBidWZmZXIuYzo5NjYKK21zZ2lkICJFODk6IE5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlIGZvciBidWZmZXIgJWxkIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU4OTogpHen86fvuUy9d73EsM8gJWxkIKb9qXylvKZzwMkgKKVppc4gISCxaqjusPWm5ikiCisKKyM6IGJ1ZmZlci5jOjk4MgorbXNnaWQgIkU5MDogQ2Fubm90IHVubG9hZCBsYXN0IGJ1ZmZlciIKK21zZ3N0ciAiRTkwOiC1TKprxMCp8bPMq+GkQK3TvXe9xLDPIgorCisjOiBidWZmZXIuYzoxNDk0Cittc2dpZCAiVzE0OiBXYXJuaW5nOiBMaXN0IG9mIGZpbGUgbmFtZXMgb3ZlcmZsb3ciCittc2dzdHIgIlcxNDogxLWnaTogwMmmV7lMpmgiCisKKyM6IGJ1ZmZlci5jOjE2NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkyOiBCdWZmZXIgJWxkIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTkyOiCn5KSjqOyyxCAlbGQgrdO9d73EsM8iCisKKyM6IGJ1ZmZlci5jOjE4OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTkzOiBNb3JlIHRoYW4gb25lIG1hdGNoIGZvciAlcyIKK21zZ3N0ciAiRTkzOiCn5KjspECt06VIpFequiAlcyIKKworIzogYnVmZmVyLmM6MTg5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFOTQ6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3IgJXMiCittc2dzdHIgIkU5NDogp+Sko6jsICVzIgorCisjOiBidWZmZXIuYzoyMjk3IGV4X2RvY21kLmM6NjQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCIKK21zZ3N0ciAipuYgJWxkIgorCisjOiBidWZmZXIuYzoyMzgwCittc2dpZCAiRTk1OiBCdWZmZXIgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU5NTogpHems713vcSwz6jPpc6zb63TplemciIKKworIzogYnVmZmVyLmM6MjY3MworbXNnaWQgIiBbTW9kaWZpZWRdIgorbXNnc3RyICIgW6R3rden710iCisKKyM6IGJ1ZmZlci5jOjI2NzgKK21zZ2lkICJbTm90IGVkaXRlZF0iCittc2dzdHIgIlulvL1zv+hdIgorCisjOiBidWZmZXIuYzoyNjgzCittc2dpZCAiW05ldyBmaWxlXSIKK21zZ3N0ciAiW7dzwMmu110iCisKKyM6IGJ1ZmZlci5jOjI2ODQKK21zZ2lkICJbUmVhZCBlcnJvcnNdIgorbXNnc3RyICJbxaqo+r/5u35dIgorCisjOiBidWZmZXIuYzoyNjg2IGZpbGVpby5jOjE5MTQKK21zZ2lkICJbcmVhZG9ubHldIgorbXNnc3RyICJbsN/Fql0iCisKKyM6IGJ1ZmZlci5jOjI3MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lIC0tJWQlJS0tIgorbXNnc3RyICKm5rzGIDEgLS0lZCUlLS0iCisKKyM6IGJ1ZmZlci5jOjI3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIC0tJWQlJS0tIgorbXNnc3RyICKm5rzGICVsZCAtLSVkJSUtLSIKKworIzogYnVmZmVyLmM6MjcxMAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZCBvZiAlbGQgLS0lZCUlLS0gY29sICIKK21zZ3N0ciAipuYgJWxkLyVsZCAtLSVkJSUtLSDE5iAiCisKKyM6IGJ1ZmZlci5jOjI4MTEKK21zZ2lkICJbTm8gZmlsZV0iCittc2dzdHIgIlulvKlSplddIgorCisjLiBtdXN0IGJlIGEgaGVscCBidWZmZXIKKyM6IGJ1ZmZlci5jOjI4NTEKK21zZ2lkICJoZWxwIgorbXNnc3RyICJbu7KnVbuhqfpdIgorCisjOiBidWZmZXIuYzozNDA1IHNjcmVlbi5jOjQ5NDMKK21zZ2lkICJbaGVscF0iCittc2dzdHIgIlu7sqdVu6Gp+l0iCisKKyM6IGJ1ZmZlci5jOjM0Mzcgc2NyZWVuLmM6NDk0OQorbXNnaWQgIltQcmV2aWV3XSIKK21zZ3N0ciAiW7l3xP1dIgorCisjOiBidWZmZXIuYzozNzA4Cittc2dpZCAiQWxsIgorbXNnc3RyICKl/rOhIgorCisjOiBidWZmZXIuYzozNzA4Cittc2dpZCAiQm90IgorbXNnc3RyICKps7rdIgorCisjOiBidWZmZXIuYzozNzEwCittc2dpZCAiVG9wIgorbXNnc3RyICKzu7rdIgorCisjOiBidWZmZXIuYzo0NDU0Cittc2dpZCAiIgorIlxuIgorIiMgQnVmZmVyIGxpc3Q6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIL13vcSwz6ZDqu06XG4iCisKKyM6IGJ1ZmZlci5jOjQ0ODcKK21zZ2lkICJbRXJyb3IgTGlzdF0iCittc2dzdHIgIlu/+bt+pkOq7V0iCisKKyM6IGJ1ZmZlci5jOjQ1MDAgbWVtbGluZS5jOjE1MDEKK21zZ2lkICJbTm8gRmlsZV0iCittc2dzdHIgIlulvKlSplddIgorCisjOiBidWZmZXIuYzo0ODAzCittc2dpZCAiIgorIlxuIgorIi0tLSBTaWducyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gssW4uSAtLS0iCisKKyM6IGJ1ZmZlci5jOjQ4MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2lnbnMgZm9yICVzOiIKK21zZ3N0ciAiJXMgqrqyxbi5OiIKKworIzogYnVmZmVyLmM6NDgxOQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgbGluZT0lbGQgIGlkPSVkICBuYW1lPSVzIgorbXNnc3RyICIgICAgpuY9JWxkICBpZD0lZCAgple62T0lcyIKKworIzogZGlmZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJFOTY6IENhbiBub3QgZGlmZiBtb3JlIHRoYW4gJWxkIGJ1ZmZlcnMiCittc2dzdHIgIkU5NjogtUyqa6TxuPsoZGlmZikgJWxkrdOlSKRXqrq9d73EsM8iCisKKyM6IGRpZmYuYzo2NTEKK21zZ2lkICJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiCittc2dzdHIgIkU5NzogpKOv4KvYpd8gIgorCisjOiBkaWZmLmM6NzUwCittc2dpZCAiUGF0Y2ggZmlsZSIKK21zZ3N0ciAiUGF0Y2ggwMmu1yIKKworIzogZGlmZi5jOjEwMDEKK21zZ2lkICJFOTg6IENhbm5vdCByZWFkIGRpZmYgb3V0cHV0IgorbXNnc3RyICJFOTg6ILVMqmvFqqj6IGRpZmYgqrq/6aVYIgorCisjOiBkaWZmLmM6MTc0MgorbXNnaWQgIkU5OTogQ3VycmVudCBidWZmZXIgaXMgbm90IGluIGRpZmYgbW9kZSIKK21zZ3N0ciAiRTk5OiCl2Ktlqrq9d73EsM+ko6xPpmIgZGlmZiC80qahIgorCisjOiBkaWZmLmM6MTc1NAorbXNnaWQgIkUxMDA6IE5vIG90aGVyIGJ1ZmZlciBpbiBkaWZmIG1vZGUiCittc2dzdHIgIkUxMDA6IKhTprO9d73EsM+mYiBkaWZmILzSpqEiCisKKyM6IGRpZmYuYzoxNzYyCittc2dpZCAiRTEwMTogTW9yZSB0aGFuIHR3byBidWZmZXJzIGluIGRpZmYgbW9kZSwgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gdXNlIgorbXNnc3RyICJFMTAxOiCms6jirdOlSKRXqrq9d73EsM+mYiBkaWZmILzSpqGhQbVMqmuoTal3rW6lzq3+pECt0yIKKworIzogZGlmZi5jOjE3ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMjogQ2FuJ3QgZmluZCBidWZmZXIgXCIlc1wiIgorbXNnc3RyICJFMTAyOiCn5KSjqOy9d73EsM86IFwiJXNcIiIKKworIzogZGlmZi5jOjE3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwMzogQnVmZmVyIFwiJXNcIiBpcyBub3QgaW4gZGlmZiBtb2RlIgorbXNnc3RyICJFMTAzOiC9d73EsM8gXCIlc1wiIKSjrE+mYiBkaWZmILzSpqEiCisKKyM6IGRpZ3JhcGguYzoyMTcyCittc2dpZCAiRTEwNDogRXNjYXBlIG5vdCBhbGxvd2VkIGluIGRpZ3JhcGgiCittc2dzdHIgIkUxMDQ6IL3GplimcqS4KGRpZ3JhcGgppKSko6/gqM+lziBFc2NhcGUiCisKKyM6IGRpZ3JhcGguYzoyMzQ0Cittc2dpZCAiRTU0NDogS2V5bWFwIGZpbGUgbm90IGZvdW5kIgorbXNnc3RyICJFNTQ0OiCn5KSjqOwga2V5bWFwIMDJIgorCisjOiBkaWdyYXBoLmM6MjM3MQorbXNnaWQgIkUxMDU6IFVzaW5nIDpsb2Fka2V5bWFwIG5vdCBpbiBhIHNvdXJjZWQgZmlsZSIKK21zZ3N0ciAiRTEwNTogqM+lziA6bG9hZGtleW1hcCAiCisKKyM6IGVkaXQuYzo0MAorbXNnaWQgIiBLZXl3b3JkIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiIMP2weSmcqbbsMqnuaaoICheTi9eUCkiCisKKyMuIGN0cmxfeF9tb2RlID09IDAsIF5QL15OIGNvbXBsLgorIzogZWRpdC5jOjQxCittc2dpZCAiIF5YIG1vZGUgKF5FL15ZL15ML15dL15GL15JL15LL15EL15WL15OL15QKSIKK21zZ3N0ciAiIF5YILzSpqEgKF5FL15ZL15ML15dL15GL15JL15LL15EL15OL15QKSIKKworIy4gU2Nyb2xsIGhhcyBpdCdzIG93biBtc2dzLCBpbiBpdCdzIHBsYWNlIHRoZXJlIGlzIHRoZSBtc2cgZm9yIGxvY2FsCisjLiAqIGN0cmxfeF9tb2RlID0gMCAoZWcgY29udGludWVfc3RhdHVzICYgQ09OVF9MT0NBTCkgIC0tIEFjZXZlZG8KKyM6IGVkaXQuYzo0NAorbXNnaWQgIiBLZXl3b3JkIExvY2FsIGNvbXBsZXRpb24gKF5OL15QKSIKK21zZ3N0ciAiILDPsOzD9sHkpnKm27DKp7mmqCAoXk4vXlApIgorCisjOiBlZGl0LmM6NDUKK21zZ2lkICIgV2hvbGUgbGluZSBjb21wbGV0aW9uICheTC9eTi9eUCkiCittc2dzdHIgIiC+46bmptuwyqe5pqggKF5ML15OL15QKSIKKworIzogZWRpdC5jOjQ2Cittc2dpZCAiIEZpbGUgbmFtZSBjb21wbGV0aW9uICheRi9eTi9eUCkiCittc2dzdHIgIiDAyaZXptuwyqe5pqggKF5GL15OL15QKSIKKworIzogZWRpdC5jOjQ3Cittc2dpZCAiIFRhZyBjb21wbGV0aW9uICheXS9eTi9eUCkiCittc2dzdHIgIiC80MXSptuwyqe5pqggKF5dL15OL15QKSIKKworIzogZWRpdC5jOjQ4Cittc2dpZCAiIFBhdGggcGF0dGVybiBjb21wbGV0aW9uICheTi9eUCkiCittc2dzdHIgIiC49K58ptuwyqe5pqggKF5OL15QKSIKKworIzogZWRpdC5jOjQ5Cittc2dpZCAiIERlZmluaXRpb24gY29tcGxldGlvbiAoXkQvXk4vXlApIgorbXNnc3RyICIgqXe4cabbsMqnuaaoICheRC9eTi9eUCkiCisKKyM6IGVkaXQuYzo1MQorbXNnaWQgIiBEaWN0aW9uYXJ5IGNvbXBsZXRpb24gKF5LL15OL15QKSIKK21zZ3N0ciAiIKZyqOWm27DKp7mmqCAoXksvXk4vXlApIgorCisjOiBlZGl0LmM6NTIKK21zZ2lkICIgVGhlc2F1cnVzIGNvbXBsZXRpb24gKF5UL15OL15QKSIKK21zZ3N0ciAiIFRoZXNhdXJ1cyCm27DKp7mmqCAoXlQvXk4vXlApIgorCisjOiBlZGl0LmM6NTMKK21zZ2lkICIgQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gKF5WL15OL15QKSIKK21zZ3N0ciAiIKlSpU+mQ6bbsMqnuaaoICheVi9eTi9eUCkiCisKKyM6IGVkaXQuYzo1NgorbXNnaWQgIkhpdCBlbmQgb2YgcGFyYWdyYXBoIgorbXNnc3RyICKkd6jsrHG4qLWyp8AiCisKKyM6IGVkaXQuYzo5NDEKK21zZ2lkICIndGhlc2F1cnVzJyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIr/vtrUgJ3RoZXNhdXJ1cycgpbyzXal3IgorCisjOiBlZGl0LmM6MTE0NQorbXNnaWQgIidkaWN0aW9uYXJ5JyBvcHRpb24gaXMgZW1wdHkiCittc2dzdHIgIr/vtrUgJ2RpY3Rpb25hcnknIKW8s12pdyIKKworIzogZWRpdC5jOjIxMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCittc2dzdHIgIrG9usumcqjlOiAlcyIKKworIzogZWRpdC5jOjIzMzYKK21zZ2lkICIgKGluc2VydCkgU2Nyb2xsICheRS9eWSkiCittc2dzdHIgIiAotKGkSikgU2Nyb2xsICheRS9eWSkiCisKKyM6IGVkaXQuYzoyMzM4Cittc2dpZCAiIChyZXBsYWNlKSBTY3JvbGwgKF5FL15ZKSIKK21zZ3N0ciAiICio+qVOKSBTY3JvbGwgKF5FL15ZKSIKKworIzogZWRpdC5jOjI2NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmc6ICVzIgorbXNnc3RyICKxvbrLpKQ6ICVzIgorCisjOiBlZGl0LmM6MjY4NworbXNnaWQgIlNjYW5uaW5nIHRhZ3MuIgorbXNnc3RyICKxvbrLvNDF0i4iCisKKyM6IGVkaXQuYzozMzQ5Cittc2dpZCAiIEFkZGluZyIKK21zZ3N0ciAiILxXpVsiCisKKyMuIHNob3dtb2RlIG1pZ2h0IHJlc2V0IHRoZSBpbnRlcm5hbCBsaW5lIHBvaW50ZXJzLCBzbyBpdCBtdXN0CisjLiAqIGJlIGNhbGxlZCBiZWZvcmUgbGluZSA9IG1sX2dldCgpLCBvciB3aGVuIHRoaXMgYWRkcmVzcyBpcyBubworIy4gKiBsb25nZXIgbmVlZGVkLiAgLS0gQWNldmVkby4KKyMuCisjOiBlZGl0LmM6MzM5OAorbXNnaWQgIi0tIFNlYXJjaGluZy4uLiIKK21zZ3N0ciAiLS0gt2q0TaSkLi4uIgorCisjOiBlZGl0LmM6MzQ1NAorbXNnaWQgIkJhY2sgYXQgb3JpZ2luYWwiCittc2dzdHIgIqZeqOywX8JJIgorCisjOiBlZGl0LmM6MzQ1OQorbXNnaWQgIldvcmQgZnJvbSBvdGhlciBsaW5lIgorbXNnc3RyICKxcadPpua2falsqrqmciAoPykiCisKKyM6IGVkaXQuYzozNDY0Cittc2dpZCAiVGhlIG9ubHkgbWF0Y2giCittc2dzdHIgIqV1prOmuba1ssWmWCIKKworIzogZWRpdC5jOjM1MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQgb2YgJWQiCittc2dzdHIgIqfkqOwgJWQgLyAlZCIKKworIzogZWRpdC5jOjM1MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF0Y2ggJWQiCittc2dzdHIgIrLFplggJWQiCisKKyMuIFNraXAgZnVydGhlciBhcmd1bWVudHMgYnV0IGRvIGNvbnRpbnVlIHRvCisjLiAqIHNlYXJjaCBmb3IgYSB0cmFpbGluZyBjb21tYW5kLgorIzogZXZhbC5jOjg4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA2OiBVbmtub3duIHZhcmlhYmxlOiBcIiVzXCIiCittc2dzdHIgIkUxMDY6IKW8qXe4caq6xdy8xjogXCIlc1wiIgorCisjOiBldmFsLmM6MTE4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTA3OiBNaXNzaW5nIGJyYWNlczogJXMiCittc2dzdHIgIkUxMDc6IK/KpNa578CzqrqsQbi5OiAlcyIKKworIzogZXZhbC5jOjEyOTAgZXZhbC5jOjEzMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEwODogTm8gc3VjaCB2YXJpYWJsZTogXCIlc1wiIgorbXNnc3RyICJFMTA4OiC1TKa5xdy8xjogXCIlc1wiIgorCisjOiBldmFsLmM6MTU2MAorbXNnaWQgIkUxMDk6IE1pc3NpbmcgJzonIGFmdGVyICc/JyIKK21zZ3N0ciAiRTEwOTogJz8nIKvhr8qk1iAnOiciCisKKyM6IGV2YWwuYzoyMTc2Cittc2dpZCAiRTExMDogTWlzc2luZyAnKSciCittc2dzdHIgIkUxMTA6IK/KpNa578CzqrogXCIpXCIiCisKKyM6IGV2YWwuYzoyMjMzCittc2dpZCAiRTExMTogTWlzc2luZyAnXSciCittc2dzdHIgIkUxMTE6IK/KpNa578CzqrogXCJdXCIiCisKKyM6IGV2YWwuYzoyMzA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTI6IE9wdGlvbiBuYW1lIG1pc3Npbmc6ICVzIgorbXNnc3RyICJFMTEyOiCvyqTWv++2taZXutk6ICVzIgorCisjOiBldmFsLmM6MjMyNworIywgYy1mb3JtYXQKK21zZ2lkICJFMTEzOiBVbmtub3duIG9wdGlvbjogJXMiCittc2dzdHIgIkUxMTM6IKSjpb+9VKq6v++2tTogJXMiCisKKyM6IGV2YWwuYzoyMzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTQ6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE0OiCvyqTWpN64uTogJXMiCisKKyM6IGV2YWwuYzoyNTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTU6IE1pc3NpbmcgcXVvdGU6ICVzIgorbXNnc3RyICJFMTE1OiCvyqTWpN64uTogJXMiCisKKyM6IGV2YWwuYzoyODQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTY6IEludmFsaWQgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAlcyIKK21zZ3N0ciAiRTExNjogqOemoSAlcyCquqTevMako6W/vVQiCisKKyM6IGV2YWwuYzoyODQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMTc6IFVua25vd24gZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE3OiClvKl3uHGquqjnpqE6ICVzIgorCisjOiBldmFsLmM6Mjg0NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE4OiBUb28gbWFueSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTExODogqOemoSAlcyCquqTevMa5TKZoIgorCisjOiBldmFsLmM6Mjg0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTE5OiBOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb246ICVzIgorbXNnc3RyICJFMTE5OiCo56ahICVzIKq6pN68xqTTpNYiCisKKyM6IGV2YWwuYzoyODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjA6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0OiAlcyIKK21zZ3N0ciAiRTEyMDogPFNJRD4gpKOv4KZiIHNjcmlwdCClu6TlpX6oz6XOOiAlcyIKKworIy4KKyMuICogWWVzIHRoaXMgaXMgdWdseSwgSSBkb24ndCBwYXJ0aWN1bGFybHkgbGlrZSBpdCBlaXRoZXIuICBCdXQgZG9pbmcgaXQKKyMuICogdGhpcyB3YXkgaGFzIHRoZSBjb21wZWxsaW5nIGFkdmFudGFnZSB0aGF0IHRyYW5zbGF0aW9ucyBuZWVkIG5vdCB0bworIy4gKiBiZSB0b3VjaGVkIGF0IGFsbC4gIFNlZSBiZWxvdyB3aGF0ICdvaycgYW5kICd5bmMnIGFyZSB1c2VkIGZvci4KKyMuCisjOiBldmFsLmM6MzQ2NSBndWkuYzo0MjM4IGd1aV9ndGsuYzoxOTkxCittc2dpZCAiJk9rIgorbXNnc3RyICK9VKl3KCZPKSIKKworIzogZXZhbC5jOjQwMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiKy0lcyUzbGQgbGluZXM6ICIKK21zZ3N0ciAiKy0lcyUzbGQgpuY6ICIKKworIzogZXZhbC5jOjUxNDkKK21zZ2lkICIiCisiJk9LXG4iCisiJkNhbmNlbCIKK21zZ3N0ciAiIgorIr1UqXcoJk8pXG4iCisiqPqu+CgmQykiCisKKyM6IGV2YWwuYzo1MTgyCittc2dpZCAiY2FsbGVkIGlucHV0cmVzdG9yZSgpIG1vcmUgb2Z0ZW4gdGhhbiBpbnB1dHNhdmUoKSIKK21zZ3N0ciAiqUmlcyBpbnB1dHJlc3RvcmUoKSCquqa4vMak8SBpbnB1dHNhdmUoKSDB2aZoIgorCisjOiBldmFsLmM6NjAzNgorbXNnaWQgIkUyNDA6IE5vIGNvbm5lY3Rpb24gdG8gVmltIHNlcnZlciIKK21zZ3N0ciAiRTI0MDogqFOms7tQIFZpbSBTZXJ2ZXIgq9il37NzvXUiCisKKyM6IGV2YWwuYzo2MTMzCittc2dpZCAiRTI3NzogVW5hYmxlIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkiCittc2dzdHIgIkUyNzc6ILVMqmvFqqj6pviqQb65qrqmXsCzIgorCisjOiBldmFsLmM6NjE2MQorbXNnaWQgIkUyNTg6IFVuYWJsZSB0byBzZW5kIHRvIGNsaWVudCIKK21zZ3N0ciAiRTI1ODogtUyqa7bHsGWo7CBjbGllbnQiCisKKyM6IGV2YWwuYzo2MjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDE6IFVuYWJsZSB0byBzZW5kIHRvICVzIgorbXNnc3RyICJFMjQxOiC1TKprtsewZajsICVzIgorCisjOiBldmFsLmM6NjMwOQorbXNnaWQgIihJbnZhbGlkKSIKK21zZ3N0ciAiKKSjpb+9VCkiCisKKyM6IGV2YWwuYzo3NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogJXMiCittc2dzdHIgIkUxMjE6IMXcvMYgJXMgqXylvKl3uHEiCisKKyM6IGV2YWwuYzo3ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjE6IElsbGVnYWwgdmFyaWFibGUgbmFtZTogJXMiCittc2dzdHIgIkU0NjE6IKSjpliqa6q6xdy8xqZXutk6ICVzIgorCisjOiBldmFsLmM6ODEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTIyOiBGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cywgYWRkICEgdG8gcmVwbGFjZSBpdCIKK21zZ3N0ciAiRTEyMjogqOemoSAlcyCkd7hnpnOmYiwgvdCoz6XOICEgsWqo7qj6pU4iCisKKyM6IGV2YWwuYzo4MTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjM6IFVuZGVmaW5lZCBmdW5jdGlvbjogJXMiCittc2dzdHIgIkUxMjM6IKjnpqEgJXMgqXylvKl3uHEiCisKKyM6IGV2YWwuYzo4MjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjQ6IE1pc3NpbmcgJygnOiAlcyIKK21zZ3N0ciAiRTEyNDogr8qk1iBcIihcIjogJXMiCisKKyM6IGV2YWwuYzo4MjM0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjU6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFMTI1OiCw0bzGpKOlv71UOiAlcyIKKworIzogZXZhbC5jOjgzMTMKK21zZ2lkICJFMTI2OiBNaXNzaW5nIDplbmRmdW5jdGlvbiIKK21zZ3N0ciAiRTEyNjogr8qk1iA6ZW5kZnVuY3Rpb24iCisKKyM6IGV2YWwuYzo4Mzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjc6IENhbm5vdCByZWRlZmluZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTI3OiCo56ahICVzIKW/pmKoz6XOpKShQbVMqmutq7dzqXe4cSIKKworIzogZXZhbC5jOjg0NjQKK21zZ2lkICJFMTI5OiBGdW5jdGlvbiBuYW1lIHJlcXVpcmVkIgorbXNnc3RyICJFMTI5OiC73a1uqOemoaZXutkiCisKKyM6IGV2YWwuYzo4NTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxMjg6IEZ1bmN0aW9uIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgY2FwaXRhbDogJXMiCittc2dzdHIgIkUxMjg6IKjnpqGmV7rZssSkQK3TpnKlwKWytrekarxnOiAlcyIKKworIzogZXZhbC5jOjg3MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMDogVW5kZWZpbmVkIGZ1bmN0aW9uOiAlcyIKK21zZ3N0ciAiRTEzMDogqOemoSAlcyCpfKW8qXe4cSIKKworIzogZXZhbC5jOjg3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTEzMTogQ2Fubm90IGRlbGV0ZSBmdW5jdGlvbiAlczogSXQgaXMgaW4gdXNlIgorbXNnc3RyICJFMTMxOiCo56ahICVzIKW/pmKoz6XOpKShQbVMqmunUrCjIgorCisjOiBldmFsLmM6ODc2MAorbXNnaWQgIkUxMzI6IEZ1bmN0aW9uIGNhbGwgZGVwdGggaXMgaGlnaGVyIHRoYW4gJ21heGZ1bmNkZXB0aCciCittc2dzdHIgIkUxMzI6IKjnpqG7vLBqqUmlc7xovMa2V7lMICdtYXhmdW5jZGVwdGgnIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4ODEzCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbGxpbmcgJXMiCittc2dzdHIgIqlJpXMgJXMiCisKKyM6IGV2YWwuYzo4ODY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGFib3J0ZWQiCittc2dzdHIgIiVzILNRsWqo7qSkwl+w9abmIgorCisjOiBldmFsLmM6ODg2OQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgIyVsZCIKK21zZ3N0ciAiJXMgtsemXq3IICMlbGQgIgorCisjOiBldmFsLmM6ODg3MgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyByZXR1cm5pbmcgXCIlc1wiIgorbXNnc3RyICIlcyC2x6ZercggXCIlc1wiIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGV2YWwuYzo4ODg4IGV4X2NtZHMyLmM6MjIzMQorIywgYy1mb3JtYXQKK21zZ2lkICJjb250aW51aW5nIGluICVzIgorbXNnc3RyICLEfsTyOiAlcyIKKworIzogZXZhbC5jOjg5MzUKK21zZ2lkICJFMTMzOiA6cmV0dXJuIG5vdCBpbnNpZGUgYSBmdW5jdGlvbiIKK21zZ3N0ciAiRTEzMzogOnJldHVybiClsra3pmKo56ahuMyoz6XOIgorCisjOiBldmFsLmM6OTI2NgorbXNnaWQgIiIKKyJcbiIKKyIjIGdsb2JhbCB2YXJpYWJsZXM6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIKX+sOzF3LzGOlxuIgorCisjOiBleF9jbWRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPCVzPiVzJXMgICVkLCAgSGV4ICUwMngsICBPY3RhbCAlMDNvIgorbXNnc3RyICI8JXM+JXMlcyAgJWQsICCkUaS7tmmm7CAlMDJ4LCAgpEu2aabsICUwM28iCisKKyM6IGV4X2NtZHMuYzo0MzMKK21zZ2lkICJFMTM0OiBNb3ZlIGxpbmVzIGludG8gdGhlbXNlbHZlcyIKK21zZ3N0ciAiRTEzNDogtUyqa6fipuayvqjspaam26R3pLoiCisKKyM6IGV4X2NtZHMuYzo1MDIKK21zZ2lkICIxIGxpbmUgbW92ZWQiCittc2dzdHIgIqR3t2iyviAxIKbmIgorCisjOiBleF9jbWRzLmM6NTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBtb3ZlZCIKK21zZ3N0ciAipHe3aLK+ICVsZCCm5iIKKworIzogZXhfY21kcy5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgZmlsdGVyZWQiCittc2dzdHIgIqR3s0KyeiAlbGQgpuYiCisKKyM6IGV4X2NtZHMuYzo5MzcKK21zZ2lkICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMTM1OiAqRmlsdGVyKiBBdXRvY29tbWFuZCCko6VppUin86fvvXe9xLDPqrqkuq5lIgorCisjOiBleF9jbWRzLmM6MTAyMgorbXNnaWQgIltObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZV1cbiIKK21zZ3N0ciAiW6fzt3Or4al8pbzAeKZzXVxuIgorCisjOiBleF9jbWRzLmM6MTI2OAorIywgYy1mb3JtYXQKK21zZ2lkICIlc3ZpbWluZm86ICVzIGluIGxpbmU6ICIKK21zZ3N0ciAiJXN2aW1pbmZvOiAlcyCmYqbmpKQ6ICIKKworIzogZXhfY21kcy5jOjEyNzMKK21zZ2lkICJFMTM2OiB2aW1pbmZvOiBUb28gbWFueSBlcnJvcnMsIHNraXBwaW5nIHJlc3Qgb2YgZmlsZSIKK21zZ3N0ciAiRTEzNjogdmltaW5mbzoguUymaL/5u34sIKm/sqTAya7XqOS+bLOhpMAiCisKKyM6IGV4X2NtZHMuYzoxMzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgdmltaW5mbyBmaWxlIFwiJXNcIiVzJXMlcyIKK21zZ3N0ciAixaqo+iB2aW1pbmZvIMDJrtcgXCIlc1wiJXMlcyVzIgorCisjOiBleF9jbWRzLmM6MTMwMworbXNnaWQgIiBpbmZvIgorbXNnc3RyICIgsFSupyIKKworIzogZXhfY21kcy5jOjEzMDQKK21zZ2lkICIgbWFya3MiCittc2dzdHIgIiC80LBPIgorCisjOiBleF9jbWRzLmM6MTMwNQorbXNnaWQgIiBGQUlMRUQiCittc2dzdHIgIiClorHRIgorCisjOiBleF9jbWRzLmM6MTM5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM3OiBWaW1pbmZvIGZpbGUgaXMgbm90IHdyaXRhYmxlOiAlcyIKK21zZ3N0ciAiRTEzNzogVmltaW5mbyDAya7XtUyqa7xnpEo6ICVzIgorCisjOiBleF9jbWRzLmM6MTUyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTM4OiBDYW4ndCB3cml0ZSB2aW1pbmZvIGZpbGUgJXMhIgorbXNnc3RyICJFMTM4OiC1TKprvGekSiB2aW1pbmZvIMDJrtcgJXMgISIKKworIzogZXhfY21kcy5jOjE1MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyB2aW1pbmZvIGZpbGUgXCIlc1wiIgorbXNnc3RyICK8Z6RKIHZpbWluZm8gwMmu1yBcIiVzXCIgpKQiCisKKyMuIFdyaXRlIHRoZSBpbmZvOgorIzogZXhfY21kcy5jOjE2MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBUaGlzIHZpbWluZm8gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFZpbSAlcy5cbiIKK21zZ3N0ciAiIyCluyB2aW1pbmZvIMDJrtesT6XRIFZpbSAlcyCp0rKjpc0uXG4iCisKKyM6IGV4X2NtZHMuYzoxNjI5Cittc2dpZCAiIgorIiMgWW91IG1heSBlZGl0IGl0IGlmIHlvdSdyZSBjYXJlZnVsIVxuIgorIlxuIgorbXNnc3RyICIiCisiIyCmcKpHt1Gtbqbbpuat16fvvdCvU6dPpHCk36FJXG4iCisiXG4iCisKKyM6IGV4X2NtZHMuYzoxNjMxCittc2dpZCAiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iCittc2dzdHIgIiMgJ2VuY29kaW5nJyCmYqa5wMmr2KXfrsmquq3IXG4iCisKKyM6IGV4X2NtZHMuYzoxNzMwCittc2dpZCAiSWxsZWdhbCBzdGFydGluZyBjaGFyIgorbXNnc3RyICK1TK7EqrqwX6lspnKkuCIKKworIzogZXhfY21kcy5jOjIwNzUgZXhfY21kcy5jOjIzNDAgZXhfY21kczIuYzo3NDQKK21zZ2lkICJTYXZlIEFzIgorbXNnc3RyICKldKZzt3PAySIKKworIy4gT3ZlcndyaXRpbmcgYSBmaWxlIHRoYXQgaXMgbG9hZGVkIGluIGFub3RoZXIgYnVmZmVyIGlzIG5vdCBhCisjLiAqIGdvb2QgaWRlYS4KKyM6IGV4X2NtZHMuYzoyMTE4Cittc2dpZCAiRTEzOTogRmlsZSBpcyBsb2FkZWQgaW4gYW5vdGhlciBidWZmZXIiCittc2dzdHIgIkUxMzk6ILF6pmKldKRArdO9d73EsM+kXbj8pEqkRrNvrdPAya7XIgorCisjOiBleF9jbWRzLmM6MjE1MgorbXNnaWQgIldyaXRlIHBhcnRpYWwgZmlsZT8iCittc2dzdHIgIq1uvGekSrOhpMDAya7XttyhSCIKKworIzogZXhfY21kcy5jOjIxNTkKK21zZ2lkICJFMTQwOiBVc2UgISB0byB3cml0ZSBwYXJ0aWFsIGJ1ZmZlciIKK21zZ3N0ciAiRTE0MDogvdCoz6XOICEgpUi8Z6RKs6GkwL13vcSwzyIKKworIzogZXhfY21kcy5jOjIyNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgXCIlLipzXCI/IgorbXNnc3RyICKtbsLQvGekd6ZzpmKqusDJrtcgXCIlLipzXCKhSCIKKworIzogZXhfY21kcy5jOjIzNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MTogTm8gZmlsZSBuYW1lIGZvciBidWZmZXIgJWxkIgorbXNnc3RyICJFMTQxOiC9d73EsM8gJWxkIKhTprPAya7Xple62SIKKworIzogZXhfY21kcy5jOjIzODMKK21zZ2lkICJFMTQyOiBGaWxlIG5vdCB3cml0dGVuOiBXcml0aW5nIGlzIGRpc2FibGVkIGJ5ICd3cml0ZScgb3B0aW9uIgorbXNnc3RyICJFMTQyOiDAya7Xpby8Z6RKoUGmXaywICd3cml0ZScgv++2tbNRw/azrCIKKworIzogZXhfY21kcy5jOjI0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIidyZWFkb25seScgb3B0aW9uIGlzIHNldCBmb3IgXCIlLipzXCIuXG4iCisiRG8geW91IHdpc2ggdG8gd3JpdGUgYW55d2F5PyIKK21zZ3N0ciAiIgorIlwiJS4qc1wiIKR3s12pdyAncmVhZG9ubHknIL/vtrUuXG4iCisivVSpd61uwtC8Z7bcoUgiCisKKyM6IGV4X2NtZHMuYzoyNTY4Cittc2dpZCAiRWRpdCBGaWxlIgorbXNnc3RyICK9c7/owMmu1yIKKworIzogZXhfY21kcy5jOjMxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE0MzogQXV0b2NvbW1hbmRzIHVuZXhwZWN0ZWRseSBkZWxldGVkIG5ldyBidWZmZXIgJXMiCittc2dzdHIgIkUxNDM6IEF1dG9jb21tYW5kcyC3TqV+pmGnUrCjt3O9d73EsM8gJXMiCisKKyM6IGV4X2NtZHMuYzozMjY5Cittc2dpZCAiRTE0NDogbm9uLW51bWVyaWMgYXJndW1lbnQgdG8gOnoiCittc2dzdHIgIkUxNDQ6IDp6IKSjsbWo/KtEvMamcqq6sNG8xiIKKworIzogZXhfY21kcy5jOjMzNTQKK21zZ2lkICJFMTQ1OiBTaGVsbCBjb21tYW5kcyBub3QgYWxsb3dlZCBpbiBydmltIgorbXNnc3RyICJFMTQ1OiBydmltIKSkuFSk7qjPpc4gc2hlbGwgqVKlTyIKKworIzogZXhfY21kcy5jOjM0NjEKK21zZ2lkICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb25zIGNhbid0IGJlIGRlbGltaXRlZCBieSBsZXR0ZXJzIgorbXNnc3RyICJFMTQ2OiBSZWd1bGFyIGV4cHJlc3Npb24gtUyqa6XOpnKlwKTAuWogKD8pIgorCisjOiBleF9jbWRzLmM6MzgwNworIywgYy1mb3JtYXQKK21zZ2lkICJyZXBsYWNlIHdpdGggJXMgKHkvbi9hL3EvbC9eRS9eWSk/IgorbXNnc3RyICKo+qVOrLAgJXMgKHkvbi9hL3EvXkUvXlkpPyIKKworIzogZXhfY21kcy5jOjQxNzIKK21zZ2lkICIoSW50ZXJydXB0ZWQpICIKK21zZ3N0ciAiKKR3pKTCXykgIgorCisjOiBleF9jbWRzLmM6NDE3NgorbXNnaWQgIjEgc3Vic3RpdHV0aW9uIgorbXNnc3RyICKo+qVOpECy1SIKKworIzogZXhfY21kcy5jOjQxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIHN1YnN0aXR1dGlvbnMiCittc2dzdHIgIqj6pU4gJWxkILLVIgorCisjOiBleF9jbWRzLmM6NDE4MQorbXNnaWQgIiBvbiAxIGxpbmUiCittc2dzdHIgIiCkQKbmpKQiCisKKyM6IGV4X2NtZHMuYzo0MTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiBvbiAlbGQgbGluZXMiCittc2dzdHIgIiAlbGQgpuakpCIKKworIzogZXhfY21kcy5jOjQyMzQKK21zZ2lkICJFMTQ3OiBDYW5ub3QgZG8gOmdsb2JhbCByZWN1cnNpdmUiCittc2dzdHIgIkUxNDc6IDpnbG9iYWwgtUyqa7u8sGqw9abmIgorCisjOiBleF9jbWRzLmM6NDI2OQorbXNnaWQgIkUxNDg6IFJlZ3VsYXIgZXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsIgorbXNnc3RyICJFMTQ4OiCoU6azqM+lzrlMIFJlZ3VsYXIgZXhwcmVzc2lvbiAoPykiCisKKyM6IGV4X2NtZHMuYzo0MzE4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdHRlcm4gZm91bmQgaW4gZXZlcnkgbGluZTogJXMiCittc2dzdHIgIqhDpECm5rOjp+Sko6jsOiAlcyIKKworIzogZXhfY21kcy5jOjQzOTkKK21zZ2lkICIiCisiXG4iCisiIyBMYXN0IFN1YnN0aXR1dGUgU3RyaW5nOlxuIgorIiQiCittc2dzdHIgIiIKKyJcbiIKKyIjIKtlpECy1bTApU6mcqbqOlxuIgorIiQiCisKKyM6IGV4X2NtZHMuYzo0NTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNDk6IFNvcnJ5LCBubyBoZWxwIGZvciAlcyIKK21zZ3N0ciAiRTE0OTogqeq6cCwgqFOmsyAlcyCquruhqfoiCisKKyM6IGV4X2NtZHMuYzo0NTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNvcnJ5LCBoZWxwIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIKK21zZ3N0ciAiqeq6cCwgp+Sko6jsu6Gp+sDJIFwiJXNcIiIKKworIzogZXhfY21kcy5jOjUwMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1MDogTm90IGEgZGlyZWN0b3J5OiAlcyIKK21zZ3N0ciAiRTE1MDogJXMgpKOsT6XYv/0iCisKKyM6IGV4X2NtZHMuYzo1MDQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNTI6IENhbm5vdCBvcGVuICVzIGZvciB3cml0aW5nIgorbXNnc3RyICJFMTUyOiC1TKprpUi8Z6RKvNKmobZ9sdIgXCIlc1wiIgorCisjOiBleF9jbWRzLmM6NTA3NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTUzOiBVbmFibGUgdG8gb3BlbiAlcyBmb3IgcmVhZGluZyIKK21zZ3N0ciAiRTE1MzogtUyqa8WqqPrAya7XOiAlcyIKKworIzogZXhfY21kcy5jOjUxNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1NDogRHVwbGljYXRlIHRhZyBcIiVzXCIgaW4gZmlsZSAlcyIKK21zZ3N0ciAiRTE1NDogvNDF0ih0YWcpIFwiJXNcIiCmYsDJrtcgJXMguMytq73GpViye6ZoprgiCisKKyM6IGV4X2NtZHMuYzo1MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjA6IFVua25vd24gc2lnbiBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE2MDogpbypd7hxqrogc2lnbiBjb21tYW5kOiAlcyIKKworIzogZXhfY21kcy5jOjUyODEKK21zZ2lkICJFMTU2OiBNaXNzaW5nIHNpZ24gbmFtZSIKK21zZ3N0ciAiRTE1Njogr8qk1iBzaWduIKZXutkiCisKKyM6IGV4X2NtZHMuYzo1MzI3Cittc2dpZCAiRTYxMjogVG9vIG1hbnkgc2lnbnMgZGVmaW5lZCIKK21zZ3N0ciAiRTYxMjogpHepd7hxpNOmaCBzaWducyIKKworIzogZXhfY21kcy5jOjUzOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzOTogSW52YWxpZCBzaWduIHRleHQ6ICVzIgorbXNnc3RyICJFMjM5OiCko6W/vVSquiBzaWduIKTlpnI6ICVzIgorCisjOiBleF9jbWRzLmM6NTQyNSBleF9jbWRzLmM6NTYxMQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU1OiBVbmtub3duIHNpZ246ICVzIgorbXNnc3RyICJFMTU1OiCko6W/vVSquiBzaWduOiAlcyIKKworIzogZXhfY21kcy5jOjU0NzEKK21zZ2lkICJFMTU5OiBNaXNzaW5nIHNpZ24gbnVtYmVyIgorbXNnc3RyICJFMTU5OiCvyqTWIHNpZ24gbnVtYmVyIgorCisjOiBleF9jbWRzLmM6NTU1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU4OiBJbnZhbGlkIGJ1ZmZlciBuYW1lOiAlcyIKK21zZ3N0ciAiRTE1ODogvXe9xLDPple62b/5u346ICVzIgorCisjOiBleF9jbWRzLmM6NTU5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTU3OiBJbnZhbGlkIHNpZ24gSUQ6ICVsZCIKK21zZ3N0ciAiRTE1NzogU2lnbiBJRCC/+bt+OiAlbGQiCisKKyM6IGV4X2NtZHMuYzo1NzYxCittc2dpZCAiW0RlbGV0ZWRdIgorbXNnc3RyICJbpHenUrCjXSIKKworIzogZXhfY21kczIuYzo4MgorbXNnaWQgIkVudGVyaW5nIERlYnVnIG1vZGUuICBUeXBlIFwiY29udFwiIHRvIGNvbnRpbnVlLiIKK21zZ3N0ciAitmmkSrCjv/m80qahLiC/6aRKIFwiY29udFwiIKVIpl6o7KW/sWC80qahLiIKKworIzogZXhfY21kczIuYzo4NiBleF9kb2NtZC5jOjg1MAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogJXMiCittc2dzdHIgIqbmICVsZDogJXMiCisKKyM6IGV4X2NtZHMyLmM6ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY21kOiAlcyIKK21zZ3N0ciAiY21kOiAlcyIKKworIzogZXhfY21kczIuYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJlYWtwb2ludCBpbiBcIiVzJXNcIiBsaW5lICVsZCIKK21zZ3N0ciAiXCIlcyVzXCIgpKTCX8JJOiCyxCAlbGQgpuYiCisKKyM6IGV4X2NtZHMyLmM6NTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxNjE6IEJyZWFrcG9pbnQgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTE2MTogp+Sko6jspKTCX8JJOiAlcyIKKworIzogZXhfY21kczIuYzo1NDcKK21zZ2lkICJObyBicmVha3BvaW50cyBkZWZpbmVkIgorbXNnc3RyICKoU6azqXe4caSkwl/CSSIKKworIzogZXhfY21kczIuYzo1NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTNkICAlcyAlcyAgbGluZSAlbGQiCittc2dzdHIgIiUzZCAgJXMgJXMgILLEICVsZCCm5iIKKworIzogZXhfY21kczIuYzo3NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2F2ZSBjaGFuZ2VzIHRvIFwiJS4qc1wiPyIKK21zZ3N0ciAisU7F3LDKpnPAeKbcIFwiJS4qc1wiPyIKKworIzogZXhfY21kczIuYzo3NjkgZXhfZG9jbWQuYzo4ODIwCittc2dpZCAiVW50aXRsZWQiCittc2dzdHIgIqW8qVKmVyIKKworIzogZXhfY21kczIuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE2MjogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgZm9yIGJ1ZmZlciBcIiVzXCIiCittc2dzdHIgIkUxNjI6IKR3p/On77lMvXe9xLDPIFwiJXNcIiCm/al8pbymc8DJICilaaXOICEgsWqo7rD1puYpIgorCisjOiBleF9jbWRzMi5jOjk3NAorbXNnaWQgIldhcm5pbmc6IEVudGVyZWQgb3RoZXIgYnVmZmVyIHVuZXhwZWN0ZWRseSAoY2hlY2sgYXV0b2NvbW1hbmRzKSIKK21zZ3N0ciAiqmC3TjogpHekwbSrqOyo5KWmvXe9xLDPICi90MDLrGQgQXV0b2NvbW1hbmRzIKaztUy/+bt+KSIKKworIzogZXhfY21kczIuYzoxMzc3Cittc2dpZCAiRTE2MzogVGhlcmUgaXMgb25seSBvbmUgZmlsZSB0byBlZGl0IgorbXNnc3RyICJFMTYzOiCldaazpECt08DJrtelab1zv+giCisKKyM6IGV4X2NtZHMyLmM6MTM3OQorbXNnaWQgIkUxNjQ6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiRTE2NDogpHe4Z6ZissSkQK3TwMmu16RGIgorCisjOiBleF9jbWRzMi5jOjEzODEKK21zZ2lkICJFMTY1OiBDYW5ub3QgZ28gYmV5b25kIGxhc3QgZmlsZSIKK21zZ3N0ciAiRTE2NTogpHe4Z6Zis8yr4aRArdPAya7XpEYiCisKKyM6IGV4X2NtZHMyLmM6MTgyOAorIywgYy1mb3JtYXQKK21zZ2lkICJTZWFyY2hpbmcgZm9yIFwiJXNcIiBpbiBcIiVzXCIiCittc2dzdHIgIrdqtE2kpDogXCIlc1wiIC0tIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODUwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlYXJjaGluZyBmb3IgXCIlc1wiIgorbXNnc3RyICK3arRNpKQ6IFwiJXNcIiIKKworIzogZXhfY21kczIuYzoxODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBmb3VuZCBpbiAncnVudGltZXBhdGgnOiBcIiVzXCIiCittc2dzdHIgIqZiICdydW50aW1lcGF0aCcguMyn5KSjqOwgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjE5MDUKK21zZ2lkICJTb3VyY2UgVmltIHNjcmlwdCIKK21zZ3N0ciAisPWm5iBWaW0gc2NyaXB0IgorCisjOiBleF9jbWRzMi5jOjIwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHNvdXJjZSBhIGRpcmVjdG9yeTogXCIlc1wiIgorbXNnc3RyICK1TKprsPWm5qXYv/2hRyBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6MjA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZCBub3Qgc291cmNlIFwiJXNcIiIKK21zZ3N0ciAitUyqa7D1puYgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjIwODgKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlbGQ6IGNvdWxkIG5vdCBzb3VyY2UgXCIlc1wiIgorbXNnc3RyICKyxCAlbGQgpuY6ILVMqmuw9abmIFwiJXNcIiIKKworIzogZXhfY21kczIuYzoyMTAyCisjLCBjLWZvcm1hdAorbXNnaWQgInNvdXJjaW5nIFwiJXNcIiIKK21zZ3N0ciAisPWm5iBcIiVzXCIgpKQiCisKKyM6IGV4X2NtZHMyLmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVsZDogc291cmNpbmcgXCIlc1wiIgorbXNnc3RyICKyxCAlbGQgpuY6ILWyp/Sw9abmICVzIgorCisjOiBleF9jbWRzMi5jOjIyMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmluaXNoZWQgc291cmNpbmcgJXMiCittc2dzdHIgIrWyp/Sw9abmICVzIgorCisjOiBleF9jbWRzMi5jOjI1MjgKK21zZ2lkICJXMTU6IFdhcm5pbmc6IFdyb25nIGxpbmUgc2VwYXJhdG9yLCBeTSBtYXkgYmUgbWlzc2luZyIKK21zZ3N0ciAiVzE1OiCqYLdOOiC/+bt+qrqm5qTAuWqmcqS4oUGlaa/grE+k1qRGIF5NIgorCisjOiBleF9jbWRzMi5jOjI1NzcKK21zZ2lkICJFMTY3OiA6c2NyaXB0ZW5jb2RpbmcgdXNlZCBvdXRzaWRlIG9mIGEgc291cmNlZCBmaWxlIgorbXNnc3RyICJFMTY3OiCmYrD1puYgc2NyaXB0IMDJrtelfqSjpWmoz6XOIDpzY3JpcHRlbmNvZGluZyIKKworIzogZXhfY21kczIuYzoyNjEwCittc2dpZCAiRTE2ODogOmZpbmlzaCB1c2VkIG91dHNpZGUgb2YgYSBzb3VyY2VkIGZpbGUiCittc2dzdHIgIkUxNjg6IKZisPWm5iBzY3JpcHQgwMmu16V+pKOlaajPpc4gOmZpbmlzaCIKKworIzogZXhfY21kczIuYzozMDA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhZ2UgJWQiCittc2dzdHIgIrLEICVkIK22IgorCisjOiBleF9jbWRzMi5jOjMxMTYKK21zZ2lkICJObyB0ZXh0IHRvIGJlIHByaW50ZWQiCittc2dzdHIgIqhTprOtbqZDpkyquqTlpnIiCisKKyM6IGV4X2NtZHMyLmM6MzE5NAorIywgYy1mb3JtYXQKK21zZ2lkICJQcmludGluZyBwYWdlICVkICglZCUlKSIKK21zZ3N0ciAipkOmTKSkOiCyxCAlZCCttiAoJWQlJSkiCisKKyM6IGV4X2NtZHMyLmM6MzIwMworIywgYy1mb3JtYXQKK21zZ2lkICIgQ29weSAlZCBvZiAlZCIKK21zZ3N0ciAivca7cyAlZCAvICVkIgorCisjOiBleF9jbWRzMi5jOjMyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJpbnRlZDogJXMiCittc2dzdHIgIqR3pkOmTDogJXMiCisKKyM6IGV4X2NtZHMyLmM6MzI2MgorbXNnaWQgIlByaW50aW5nIGFib3J0ZWQiCittc2dzdHIgIqR3qPqu+KZDpkwiCisKKyM6IGV4X2NtZHMyLmM6MzY0NQorbXNnaWQgIkU0NTU6IEVycm9yIHdyaXRpbmcgdG8gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTQ1NTogtUyqa7xnpEogUG9zdFNjcmlwdCC/6aVYwMkiCisKKyM6IGV4X2NtZHMyLmM6NDMyMAorbXNnaWQgIkUzMjQ6IENhbid0IG9wZW4gUG9zdFNjcmlwdCBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiRTMyNDogtUyqa7Z9sdIgUG9zdFNjcmlwdCC/6aVYwMkiCisKKyM6IGV4X2NtZHMyLmM6NDM2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDU2OiBDYW4ndCBvcGVuIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU2OiC1TKprtn2x0sDJrtcgXCIlc1wiIgorCisjOiBleF9jbWRzMi5jOjQzNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ1NzogQ2FuJ3QgcmVhZCBQb3N0U2NyaXB0IHJlc291cmNlIGZpbGUgXCIlc1wiIgorbXNnc3RyICJFNDU3OiC1TKprxaqo+iBQb3N0U2NyaXB0IHJlc291cmNlIMDJIFwiJXNcIiIKKworIzogZXhfY21kczIuYzo0NTc2Cittc2dpZCAiU2VuZGluZyB0byBwcmludGVyLi4uIgorbXNnc3RyICK2x7BluOquxqjspkyq7b73Li4uIgorCisjOiBleF9jbWRzMi5jOjQ1ODAKK21zZ2lkICJFMzY1OiBGYWlsZWQgdG8gcHJpbnQgUG9zdFNjcmlwdCBmaWxlIgorbXNnc3RyICJFMzY1OiC1TKprpkOmTCBQb3N0U2NyaXB0IMDJrtciCisKKyM6IGV4X2NtZHMyLmM6NDU4MgorbXNnaWQgIlByaW50IGpvYiBzZW50LiIKK21zZ3N0ciAipHewZaVYpkOmTKR1p0ChQyIKKworIzogZXhfY21kczIuYzo0OTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgJXNsYW5ndWFnZTogXCIlc1wiIgorbXNnc3RyICKl2KtlqrogJXO7eailOiBcIiVzXCIiCisKKyM6IGV4X2NtZHMyLmM6NDk4OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTk3OiBDYW5ub3Qgc2V0IGxhbmd1YWdlIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTE5NzogpKOv4LNdqXe7eailpqggXCIlc1wiIgorCisjOiBleF9kb2NtZC5jOjQ4NgorbXNnaWQgIkVudGVyaW5nIEV4IG1vZGUuICBUeXBlIFwidmlzdWFsXCIgdG8gZ28gdG8gTm9ybWFsIG1vZGUuIgorbXNnc3RyICK2aaRKIEV4ILzSpqEuIL/ppEogXCJ2aXN1YVwiIKVIpl6o7KW/sWC80qahLiIKKworIy4gbXVzdCBiZSBhdCBFT0YKKyM6IGV4X2RvY21kLmM6NTIyCittc2dpZCAiRTUwMTogQXQgZW5kLW9mLWZpbGUiCittc2dzdHIgIkU1MDE6IKR3qOzAya7XtbKnwCIKKworIzogZXhfZG9jbWQuYzo2MjQKK21zZ2lkICJFMTY5OiBDb21tYW5kIHRvbyByZWN1cnNpdmUiCittc2dzdHIgIkUxNjk6IKlSpU+7vLBqvGi8xrlMpmgiCisKKyM6IGV4X2RvY21kLmM6MTA5MAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjA1OiBFeGNlcHRpb24gbm90IGNhdWdodDogJXMiCittc2dzdHIgIkU2MDU6IKW8xGS6Saq6qNKlfqFHICVzIgorCisjOiBleF9kb2NtZC5jOjExNzYKK21zZ2lkICJFbmQgb2Ygc291cmNlZCBmaWxlIgorbXNnc3RyICKpUqVPwMm1sqf0IgorCisjOiBleF9kb2NtZC5jOjExNzcKK21zZ2lkICJFbmQgb2YgZnVuY3Rpb24iCittc2dzdHIgIqjnpqG1sqfAIgorCisjOiBleF9kb2NtZC5jOjE2MjgKK21zZ2lkICJFNDY0OiBBbWJpZ3VvdXMgdXNlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kIgorbXNnc3RyICJFNDY0OiCoz6XOqsypd7hxqrqpUqVPt3yyVrJjIgorCisjOiBleF9kb2NtZC5jOjE2NDIKK21zZ2lkICJFNDkyOiBOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCittc2dzdHIgIkU0OTI6IKSjrE+9c7/ovrmquqlSpU8iCisKKyM6IGV4X2RvY21kLmM6MTcyNQorbXNnaWQgIkU0Nzg6IERvbid0IHBhbmljISIKK21zZ3N0ciAiRTQ3ODogpKOtbsXlt1chIgorCisjOiBleF9kb2NtZC5jOjE3NDQKK21zZ2lkICJFNDkzOiBCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4iCittc2dzdHIgIkU0OTM6IKv8qXekRqZWq2Ww0abSqrq9ZLPyIgorCisjOiBleF9kb2NtZC5jOjE3NTMKK21zZ2lkICJCYWNrd2FyZHMgcmFuZ2UgZ2l2ZW4sIE9LIHRvIHN3YXAiCittc2dzdHIgIqv8qXekRqZWq2Ww0abSqrq9ZLPyoUFPSyB0byBzd2FwIgorCisjOiBleF9kb2NtZC5jOjE4NjQKK21zZ2lkICJFNDk0OiBVc2UgdyBvciB3Pj4iCittc2dzdHIgIkU0OTQ6IL3QqM+lziB3IKnOIHc+PiIKKworIzogZXhfZG9jbWQuYzozNDQ2Cittc2dpZCAiRTMxOTogU29ycnksIHRoZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyB2ZXJzaW9uIgorbXNnc3RyICJFMzE5OiCp6rpwLCClu6lSpU+mYqa5qqmlu6SkqFOms7nqp0AiCisKKyM6IGV4X2RvY21kLmM6MzYyNAorbXNnaWQgIkUxNzI6IE9ubHkgb25lIGZpbGUgbmFtZSBhbGxvd2VkIgorbXNnc3RyICJFMTcyOiClda/gprOkQK3TwMkiCisKKyM6IGV4X2RvY21kLmM6NDE5MQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBtb3JlIGZpbGVzIHRvIGVkaXQuICBRdWl0IGFueXdheT8iCittc2dzdHIgIsHZprMgJWQgrdPAya7Xpby9c7/oLiC9VKl3rW7C97Z9oUgiCisKKyM6IGV4X2RvY21kLmM6NDE5OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTczOiAlbGQgbW9yZSBmaWxlcyB0byBlZGl0IgorbXNnc3RyICJFMTczOiDB2aazICVsZCCt08DJrtelvL1zv+giCisKKyM6IGV4X2RvY21kLmM6NDI5MgorbXNnaWQgIkUxNzQ6IENvbW1hbmQgYWxyZWFkeSBleGlzdHM6IGFkZCAhIHRvIHJlcGxhY2UgaXQiCittc2dzdHIgIkUxNzQ6IKlSpU+kd7hnpnOmYiwgvdCoz6XOICEgsWqo7q2rt3Opd7hxIgorCisjOiBleF9kb2NtZC5jOjQzOTcKK21zZ2lkICIiCisiXG4iCisiICAgIE5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgple62SAgICAgICAgsNG8xiC9ZLPyICCnub7jICAgICAgqXe4cSAgICAgICIKKworIzogZXhfZG9jbWQuYzo0NDg2Cittc2dpZCAiTm8gdXNlci1kZWZpbmVkIGNvbW1hbmRzIGZvdW5kIgorbXNnc3RyICKn5KSjqOyoz6XOqsypd7hxqrqpUqVPIgorCisjOiBleF9kb2NtZC5jOjQ1MTcKK21zZ2lkICJFMTc1OiBObyBhdHRyaWJ1dGUgc3BlY2lmaWVkIgorbXNnc3RyICJFMTc1OiCoU6azq/ypd6q6xN2pyiIKKworIzogZXhfZG9jbWQuYzo0NTY5Cittc2dpZCAiRTE3NjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorbXNnc3RyICJFMTc2OiCko6W/vVSqurDRvMa8xqXYIgorCisjOiBleF9kb2NtZC5jOjQ1ODQKK21zZ2lkICJFMTc3OiBDb3VudCBjYW5ub3QgYmUgc3BlY2lmaWVkIHR3aWNlIgorbXNnc3RyICJFMTc3OiCko6/gq/ypd6jipri8xqXYIgorCisjOiBleF9kb2NtZC5jOjQ1OTQKK21zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgorbXNnc3RyICJFMTc4OiC8xqXYqrq5d7NdsNG8xqSjpb+9VCIKKworIzogZXhfZG9jbWQuYzo0NjIyCittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgorbXNnc3RyICJFMTc5OiCr/KVPu92tbrDRvMakfq/gp7mmqCIKKworIzogZXhfZG9jbWQuYzo0NjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODA6IEludmFsaWQgY29tcGxldGUgdmFsdWU6ICVzIgorbXNnc3RyICJFMTgwOiCko6e5vuOquq3IOiAnJXMnIgorCisjOiBleF9kb2NtZC5jOjQ2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE4MTogSW52YWxpZCBhdHRyaWJ1dGU6ICVzIgorbXNnc3RyICJFMTgxOiCko6W/vVSqusTdqco6ICVzIgorCisjOiBleF9kb2NtZC5jOjQ2OTAKK21zZ2lkICJFMTgyOiBJbnZhbGlkIGNvbW1hbmQgbmFtZSIKK21zZ3N0ciAiRTE4Mjogq/ylT6ZXutmko6W/vVQiCisKKyM6IGV4X2RvY21kLmM6NDcwNQorbXNnaWQgIkUxODM6IFVzZXIgZGVmaW5lZCBjb21tYW5kcyBtdXN0IHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciIKK21zZ3N0ciAiRTE4MzogqM+lzqrMptupd6v8pU+lsra3pUikarxnpnKlwLZ9qWwiCisKKyM6IGV4X2RvY21kLmM6NDc3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMTg0OiBObyBzdWNoIHVzZXItZGVmaW5lZCBjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTE4NDogqFOms6jPpc6qzKbbqXequqlSpU+hRyAlcyIKKworIzogZXhfZG9jbWQuYzo1MjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODU6IENhbm5vdCBmaW5kIGNvbG9yIHNjaGVtZSAlcyIKK21zZ3N0ciAiRTE4NTogp+Sko6jsw0Om4rzLpqEgJXMiCisKKyM6IGV4X2RvY21kLmM6NTIzOAorbXNnaWQgIkdyZWV0aW5ncywgVmltIHVzZXIhIgorbXNnc3RyICK22SwgVmltIKjPpc6qzKFJIgorCisjOiBleF9kb2NtZC5jOjU5NDYKK21zZ2lkICJFZGl0IEZpbGUgaW4gbmV3IHdpbmRvdyIKK21zZ3N0ciAipmK3c7X4taG9c7/owMmu1yIKKworIzogZXhfZG9jbWQuYzo2MjE5Cittc2dpZCAiTm8gc3dhcCBmaWxlIgorbXNnc3RyICK1TLzIpnPAySIKKworIzogZXhfZG9jbWQuYzo2MzIzCittc2dpZCAiQXBwZW5kIEZpbGUiCittc2dzdHIgIqr+pVvAya7XIgorCisjOiBleF9kb2NtZC5jOjYzODcKK21zZ2lkICJFMTg2OiBObyBwcmV2aW91cyBkaXJlY3RvcnkiCittc2dzdHIgIkUxODY6IKhTprOrZaRArdOl2L/9IgorCisjOiBleF9kb2NtZC5jOjY0NjkKK21zZ2lkICJFMTg3OiBVbmtub3duIgorbXNnc3RyICJFMTg3OiC1TKprv+zD0aq6vNCwTyIKKworIzogZXhfZG9jbWQuYzo2NTU0Cittc2dpZCAiRTQ2NTogOndpbnNpemUgcmVxdWlyZXMgdHdvIG51bWJlciBhcmd1bWVudHMiCittc2dzdHIgIkU0NjU6IDp3aW5zaXplILvdrW6o4q3TsNG8xiIKKworIzogZXhfZG9jbWQuYzo2NjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIldpbmRvdyBwb3NpdGlvbjogWCAlZCwgWSAlZCIKK21zZ3N0ciAitfi1oabsuG06IFggJWQsIFkgJWQiCisKKyM6IGV4X2RvY21kLmM6NjYxMAorbXNnaWQgIkUxODg6IE9idGFpbmluZyB3aW5kb3cgcG9zaXRpb24gbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYXRmb3JtIgorbXNnc3RyICJFMTg4OiCmYrF6qrqlraV4pFe1TKprwPKxb7X4taGm7LhtIgorCisjOiBleF9kb2NtZC5jOjY2MjAKK21zZ2lkICJFNDY2OiA6d2lucG9zIHJlcXVpcmVzIHR3byBudW1iZXIgYXJndW1lbnRzIgorbXNnc3RyICJFNDY2OiA6d2lucG9zILvdrW6o4q3TsNG8xiIKKworIzogZXhfZG9jbWQuYzo2ODk5Cittc2dpZCAiU2F2ZSBSZWRpcmVjdGlvbiIKK21zZ3N0ciAiwHimcyBSZWRpcmVjdGlvbiIKKworIzogZXhfZG9jbWQuYzo3MDQ2Cittc2dpZCAiU2F2ZSBWaWV3IgorbXNnc3RyICLAeKZzIFZpZXciCisKKyM6IGV4X2RvY21kLmM6NzA0NworbXNnaWQgIlNhdmUgU2Vzc2lvbiIKK21zZ3N0ciAiwHimcyBTZXNzaW9uIgorCisjOiBleF9kb2NtZC5jOjcwNDkKK21zZ2lkICJTYXZlIFNldHVwIgorbXNnc3RyICLAeKZzs12pdyIKKworIzogZXhfZG9jbWQuYzo3MjAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUxODk6IFwiJXNcIiBleGlzdHMgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTE4OTogXCIlc1wiIKR3pnOmYiAovdClziAhILFqqO6w9abmKSIKKworIzogZXhfZG9jbWQuYzo3MjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUxOTA6IENhbm5vdCBvcGVuIFwiJXNcIiBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTE5MDogtUyqa6VIvGekSrzSpqG2fbHSIFwiJXNcIiIKKworIy4gc2V0IG1hcmsKKyM6IGV4X2RvY21kLmM6NzIyOQorbXNnaWQgIkUxOTE6IEFyZ3VtZW50IG11c3QgYmUgYSBsZXR0ZXIgb3IgZm9yd2FyZC9iYWNrd2FyZCBxdW90ZSIKK21zZ3N0ciAiRTE5MTogsNG8xqWytresT61epOWmcqXAqc6mVqtlL6vhqrqk3ri5IgorCisjOiBleF9kb2NtZC5jOjcyNzEKK21zZ2lkICJFMTkyOiBSZWN1cnNpdmUgdXNlIG9mIDpub3JtYWwgdG9vIGRlZXAiCittc2dzdHIgIkUxOTI6IDpub3JtYWwgu7ywarxovMa5TLJgIgorCisjOiBleF9kb2NtZC5jOjc3NzIKK21zZ2lkICJFMTk0OiBObyBhbHRlcm5hdGUgZmlsZSBuYW1lIHRvIHN1YnN0aXR1dGUgZm9yICcjJyIKK21zZ3N0ciAiRTE5NDogqFOmsyAnIycgpWm0wKVOqrrAyaZXIgorCisjOiBleF9kb2NtZC5jOjc4MDMKK21zZ2lkICJFNDk1OiBubyBhdXRvY29tbWFuZCBmaWxlIG5hbWUgdG8gc3Vic3RpdHV0ZSBmb3IgXCI8YWZpbGU+XCIiCittc2dzdHIgIkU0OTU6IKhTprMgQXV0b2NvbW1hbmQgwMmmV6VIqPqlTiBcIjxhZmlsZT5cIiIKKworIzogZXhfZG9jbWQuYzo3ODExCittc2dpZCAiRTQ5Njogbm8gYXV0b2NvbW1hbmQgYnVmZmVyIG51bWJlciB0byBzdWJzdGl0dXRlIGZvciBcIjxhYnVmPlwiIgorbXNnc3RyICJFNDk2OiCoU6azIEF1dG9jb21tYW5kIL13vcSwz6ZXutmlSKj6pU4gXCI8YWJ1Zj5cIiIKKworIzogZXhfZG9jbWQuYzo3ODIyCittc2dpZCAiRTQ5Nzogbm8gYXV0b2NvbW1hbmQgbWF0Y2ggbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxhbWF0Y2g+XCIiCittc2dzdHIgIkU0OTc6IKhTprMgQXV0b2NvbW1hbmQgssWmWKZXutmlSKj6pU4gXCI8YW1hdGNoPlwiIgorCisjOiBleF9kb2NtZC5jOjc4MzIKK21zZ2lkICJFNDk4OiBubyA6c291cmNlIGZpbGUgbmFtZSB0byBzdWJzdGl0dXRlIGZvciBcIjxzZmlsZT5cIiIKK21zZ3N0ciAiRTQ5ODogqFOmsyA6c291cmNlIMDJplelSKj6pU4gXCI8c2ZpbGU+XCIiCisKKyM6IGV4X2RvY21kLmM6Nzg3MworIywgbm8tYy1mb3JtYXQKK21zZ2lkICJFNDk5OiBFbXB0eSBmaWxlIG5hbWUgZm9yICclJyBvciAnIycsIG9ubHkgd29ya3Mgd2l0aCBcIjpwOmhcIiIKK21zZ3N0ciAiRTQ5OTogJyUnIKnOICcjJyCr/KZWqsXAyaZXoUGlda/gpc6p8yBcIjpwOmhcIiIKKworIzogZXhfZG9jbWQuYzo3ODc1Cittc2dpZCAiRTUwMDogRXZhbHVhdGVzIHRvIGFuIGVtcHR5IHN0cmluZyIKK21zZ3N0ciAiRTUwMDogv+mkSqywqsWmcqbqIgorCisjOiBleF9kb2NtZC5jOjg4MDIKK21zZ2lkICJFMTk1OiBDYW5ub3Qgb3BlbiB2aW1pbmZvIGZpbGUgZm9yIHJlYWRpbmciCittc2dzdHIgIkUxOTU6ILVMqmvFqqj6IHZpbWluZm8iCisKKyM6IGV4X2RvY21kLmM6ODk3NQorbXNnaWQgIkUxOTY6IE5vIGRpZ3JhcGhzIGluIHRoaXMgdmVyc2lvbiIKK21zZ3N0ciAiRTE5NjogpbuqqaW7tUy9xqZYpnKkuChkaWdyYXBoKSIKKworIzogZXhfZXZhbC5jOjQwNworbXNnaWQgIkU2MDg6IENhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIKK21zZ3N0ciAiRTYwODogpKOv4CA6dGhyb3cgpc4gJ1ZpbScgtn3AWaq6qNKlfiIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiB0aHJvd246ICVzIgorbXNnc3RyICKl4aVYqNKlfqFHICVzIgorCisjOiBleF9ldmFsLmM6NTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBmaW5pc2hlZDogJXMiCittc2dzdHIgIqjSpX61sqf0oUcgJXMiCisKKyM6IGV4X2V2YWwuYzo1MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhjZXB0aW9uIGRpc2NhcmRlZDogJXMiCittc2dzdHIgIqR3peGx86jSpX6hRyAlcyIKKworIzogZXhfZXZhbC5jOjU4MiBleF9ldmFsLmM6NjIwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzLCBsaW5lICVsZCIKK21zZ3N0ciAiJXMsIKbmICVsZCIKKworIy4gYWx3YXlzIHNjcm9sbCB1cCwgZG9uJ3Qgb3ZlcndyaXRlCisjOiBleF9ldmFsLmM6NTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4Y2VwdGlvbiBjYXVnaHQ6ICVzIgorbXNnc3RyICK1b6XNqNKlfqFHJXMiCisKKyM6IGV4X2V2YWwuYzo2NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbWFkZSBwZW5kaW5nIgorbXNnc3RyICIlcyCzeaaoIHBlbmRpbmciCisKKyM6IGV4X2V2YWwuYzo2NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgcmVzdW1lZCIKK21zZ3N0ciAiJXMgpHemXrRfIgorCisjOiBleF9ldmFsLmM6Njc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGRpc2NhcmRlZCIKK21zZ3N0ciAiJXMgpHel4bHzIgorCisjOiBleF9ldmFsLmM6NzAwCittc2dpZCAiRXhjZXB0aW9uIgorbXNnc3RyICKo0qV+IgorCisjOiBleF9ldmFsLmM6NzA2Cittc2dpZCAiRXJyb3IgYW5kIGludGVycnVwdCIKK21zZ3N0ciAiv/m7frtQpKTCXyIKKworIzogZXhfZXZhbC5jOjcwOCBndWkuYzo0MjM3Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIr/5u34iCisKKyMuIGlmIChwZW5kaW5nICYgQ1NUUF9JTlRFUlJVUFQpCisjOiBleF9ldmFsLmM6NzEwCittc2dpZCAiSW50ZXJydXB0IgorbXNnc3RyICKkpMJfIgorCisjOiBleF9ldmFsLmM6Nzc5Cittc2dpZCAiRTU3OTogOmlmIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1Nzk6IDppZiC8aLzGuUyyYCIKKworIzogZXhfZXZhbC5jOjgxNgorbXNnaWQgIkU1ODA6IDplbmRpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MDogOmVuZGlmIK/KpNa578CzqrogOmlmIgorCisjOiBleF9ldmFsLmM6ODYwCittc2dpZCAiRTU4MTogOmVsc2Ugd2l0aG91dCA6aWYiCittc2dzdHIgIkU1ODE6IDplbHNlIK/KpNa578CzqrogOmlmIgorCisjOiBleF9ldmFsLmM6ODYzCittc2dpZCAiRTU4MjogOmVsc2VpZiB3aXRob3V0IDppZiIKK21zZ3N0ciAiRTU4MjogOmVsc2VpZiCvyqTWue/As6q6IDppZiIKKworIzogZXhfZXZhbC5jOjg3MAorbXNnaWQgIkU1ODM6IG11bHRpcGxlIDplbHNlIgorbXNnc3RyICJFNTgzOiCmaK2rIDplbHNlIgorCisjOiBleF9ldmFsLmM6ODczCittc2dpZCAiRTU4NDogOmVsc2VpZiBhZnRlciA6ZWxzZSIKK21zZ3N0ciAiRTU4NDogOmVsc2VpZiCmYiA6ZWxzZSCkp6vhIgorCisjOiBleF9ldmFsLmM6OTQwCittc2dpZCAiRTU4NTogOndoaWxlIG5lc3RpbmcgdG9vIGRlZXAiCittc2dzdHIgIkU1ODU6IDp3aGlsZSC8aLzGuUyyYCIKKworIzogZXhfZXZhbC5jOjk5NgorbXNnaWQgIkU1ODY6IDpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NjogOmNvbnRpbnVlIK/KpNa578CzqrogOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTAzNgorbXNnaWQgIkU1ODc6IDpicmVhayB3aXRob3V0IDp3aGlsZSIKK21zZ3N0ciAiRTU4NzogOmJyZWFrIK/KpNa578CzqrogOndoaWxlIgorCisjOiBleF9ldmFsLmM6MTIzNQorbXNnaWQgIkU2MDE6IDp0cnkgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTYwMTogOmlmILxovMa5TLJgIgorCisjOiBleF9ldmFsLmM6MTI3OAorbXNnaWQgIkU2MDM6IDpjYXRjaCB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDM6IDpjYXRjaCCoU6azIDp0cnkiCisKKyMuIEdpdmUgdXAgZm9yIGEgIjpjYXRjaCIgYWZ0ZXIgIjpmaW5hbGx5IiBhbmQgaWdub3JlIGl0LgorIy4gKiBKdXN0IHBhcnNlLgorIzogZXhfZXZhbC5jOjEzMDAKK21zZ2lkICJFNjA0OiA6Y2F0Y2ggYWZ0ZXIgOmZpbmFsbHkiCittc2dzdHIgIkU2MDQ6IDpjYXRjaCCmYiA6ZmluYWxseSCkp6vhIgorCisjOiBleF9ldmFsLmM6MTQxOAorbXNnaWQgIkU2MDY6IDpmaW5hbGx5IHdpdGhvdXQgOnRyeSIKK21zZ3N0ciAiRTYwNjogOmZpbmFsbHkgqFOmsyA6dHJ5IgorCisjLiBHaXZlIHVwIGZvciBhIG11bHRpcGxlICI6ZmluYWxseSIgYW5kIGlnbm9yZSBpdC4KKyM6IGV4X2V2YWwuYzoxNDQyCittc2dpZCAiRTYwNzogbXVsdGlwbGUgOmZpbmFsbHkiCittc2dzdHIgIkU2MDc6IKZorasgOmZpbmFsbHkiCisKKyM6IGV4X2V2YWwuYzoxNTUxCittc2dpZCAiRTYwMjogOmVuZHRyeSB3aXRob3V0IDp0cnkiCittc2dzdHIgIkU2MDI6IDplbmRpZiCvyqTWue/As6q6IDppZiIKKworIzogZXhfZXZhbC5jOjE4NTcKK21zZ2lkICJFMTkzOiA6ZW5kZnVuY3Rpb24gbm90IGluc2lkZSBhIGZ1bmN0aW9uIgorbXNnc3RyICJFMTkzOiA6ZW5kZnVuY3Rpb24gpbK2t6ZiqOemoaS6s6Goz6XOIgorCisjOiBleF9nZXRsbi5jOjI5NjcKK21zZ2lkICJ0YWduYW1lIgorbXNnc3RyICK80MXSple62SIKKworIzogZXhfZ2V0bG4uYzoyOTcwCittc2dpZCAiIGtpbmQgZmlsZVxuIgorbXNnc3RyICLD/sDJrtdcbiIKKworIzogZXhfZ2V0bG4uYzo0MTc2Cittc2dpZCAiJ2hpc3RvcnknIG9wdGlvbiBpcyB6ZXJvIgorbXNnc3RyICK/77a1ICdoaXN0b3J5JyCsT7lzIgorCisjOiBleF9nZXRsbi5jOjQ0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiMgJXMgSGlzdG9yeSAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjICVzIL76pXawT7/9ICi3c6jswsIpOlxuIgorCisjOiBleF9nZXRsbi5jOjQ0MTcKK21zZ2lkICJDb21tYW5kIExpbmUiCittc2dzdHIgIqlSpU+mQyIKKworIzogZXhfZ2V0bG4uYzo0NDE4Cittc2dpZCAiU2VhcmNoIFN0cmluZyIKK21zZ3N0ciAit2q0TaZypuoiCisKKyM6IGV4X2dldGxuLmM6NDQxOQorbXNnaWQgIkV4cHJlc3Npb24iCittc2dzdHIgIrlCuuKmoSIKKworIzogZXhfZ2V0bG4uYzo0NDIwCittc2dpZCAiSW5wdXQgTGluZSIKK21zZ3N0ciAiv+mkSqbmIgorCisjOiBleF9nZXRsbi5jOjQ0NTAKK21zZ2lkICJFMTk4OiBjbWRfcGNoYXIgYmV5b25kIHRoZSBjb21tYW5kIGxlbmd0aCIKK21zZ3N0ciAiRTE5ODogY21kX3BjaGFyILZXuUypUqVPqvir1yIKKworIzogZXhfZ2V0bG4uYzo0NjI0Cittc2dpZCAiRTE5OTogQWN0aXZlIHdpbmRvdyBvciBidWZmZXIgZGVsZXRlZCIKK21zZ3N0ciAiRTE5OTogpHenUrCjsbynQKXOpKSqurX4taGpzrzIpnOwzyIKKworIzogZmlsZWlvLmM6MzczCittc2dpZCAiSWxsZWdhbCBmaWxlIG5hbWUiCittc2dzdHIgIqSjpb+9VKq6wMmmVyIKKworIzogZmlsZWlvLmM6Mzk3IGZpbGVpby5jOjUyMiBmaWxlaW8uYzoyNjg2IGZpbGVpby5jOjI3MjcKK21zZ2lkICJpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAirE+l2L/9IgorCisjOiBmaWxlaW8uYzozOTkKK21zZ2lkICJpcyBub3QgYSBmaWxlIgorbXNnc3RyICKko6xPwMmu1yIKKworIzogZmlsZWlvLmM6NTQ0IGZpbGVpby5jOjM4MzMKK21zZ2lkICJbTmV3IEZpbGVdIgorbXNnc3RyICJbpbypUqZXXSIKKworIzogZmlsZWlvLmM6NTY2Cittc2dpZCAiW1Blcm1pc3Npb24gRGVuaWVkXSIKK21zZ3N0ciAiW8V2ra2ko6isXSIKKworIzogZmlsZWlvLmM6NjcwCittc2dpZCAiRTIwMDogKlJlYWRQcmUgYXV0b2NvbW1hbmRzIG1hZGUgdGhlIGZpbGUgdW5yZWFkYWJsZSIKK21zZ3N0ciAiRTIwMDogKlJlYWRQcmUgQXV0b2NvbW1hbmQgqM+1e6ahtUyqa8WqqPqmucDJIgorCisjOiBmaWxlaW8uYzo2NzIKK21zZ2lkICJFMjAxOiAqUmVhZFByZSBhdXRvY29tbWFuZHMgbXVzdCBub3QgY2hhbmdlIGN1cnJlbnQgYnVmZmVyIgorbXNnc3RyICJFMjAxOiAqRmlsdGVyKiBBdXRvY29tbWFuZCCko6VppUin86fvvXe9xLDPqrqkuq5lIgorCisjOiBmaWxlaW8uYzo2OTMKK21zZ2lkICJWaW06IFJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIgorbXNnc3RyICJWaW06ILFxvNC3x7/ppErFqqj6Li4uXG4iCisKKyM6IGZpbGVpby5jOjY5OQorbXNnaWQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLiIKK21zZ3N0ciAisXG80LfHv+mkSsWqqPouLi4iCisKKyMuIFJlLW9wZW5pbmcgdGhlIG9yaWdpbmFsIGZpbGUgZmFpbGVkIQorIzogZmlsZWlvLmM6OTQ0Cittc2dpZCAiRTIwMjogQ29udmVyc2lvbiBtYWRlIGZpbGUgdW5yZWFkYWJsZSEiCittc2dzdHIgIkUyMDI6IMLgtKu/+bt+IgorCisjOiBmaWxlaW8uYzoxODkyCittc2dpZCAiW2ZpZm8vc29ja2V0XSIKK21zZ3N0ciAiW2ZpZm8vc29ja2V0XSIKKworIzogZmlsZWlvLmM6MTg5OQorbXNnaWQgIltmaWZvXSIKK21zZ3N0ciAiW2ZpZm9dIgorCisjOiBmaWxlaW8uYzoxOTA2Cittc2dpZCAiW3NvY2tldF0iCittc2dzdHIgIltzb2NrZXRdIgorCisjOiBmaWxlaW8uYzoxOTE0Cittc2dpZCAiW1JPXSIKK21zZ3N0ciAiW7DfxapdIgorCisjOiBmaWxlaW8uYzoxOTI0Cittc2dpZCAiW0NSIG1pc3NpbmddIgorbXNnc3RyICJbr8qk1kNSXSciCisKKyM6IGZpbGVpby5jOjE5MjkKK21zZ2lkICJbTkwgZm91bmRdIgorbXNnc3RyICJbp+So7E5MXSIKKworIzogZmlsZWlvLmM6MTkzNAorbXNnaWQgIltsb25nIGxpbmVzIHNwbGl0XSIKK21zZ3N0ciAiW6TAs865TKr4puZdIgorCisjOiBmaWxlaW8uYzoxOTQwIGZpbGVpby5jOjM4MTcKK21zZ2lkICJbTk9UIGNvbnZlcnRlZF0iCittc2dzdHIgIlulvMLgtKtdIgorCisjOiBmaWxlaW8uYzoxOTQ1IGZpbGVpby5jOjM4MjIKK21zZ2lkICJbY29udmVydGVkXSIKK21zZ3N0ciAiW6R3wuC0q10iCisKKyM6IGZpbGVpby5jOjE5NTIgZmlsZWlvLmM6Mzg0NworbXNnaWQgIltjcnlwdGVkXSIKK21zZ3N0ciAiW6R3pVuxS10iCisKKyM6IGZpbGVpby5jOjE5NTkKK21zZ2lkICJbQ09OVkVSU0lPTiBFUlJPUl0iCittc2dzdHIgIsLgtKu/+bt+IgorCisjOiBmaWxlaW8uYzoxOTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIltJTExFR0FMIEJZVEUgaW4gbGluZSAlbGRdIgorbXNnc3RyICJbpuYgJWxkIKazpKOlv71Uqrqm7KS4XSIKKworIzogZmlsZWlvLmM6MTk3MgorbXNnaWQgIltSRUFEIEVSUk9SU10iCittc2dzdHIgIlvFqqj6v/m7fl0iCisKKyM6IGZpbGVpby5jOjIxODgKK21zZ2lkICJDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3IgY29udmVyc2lvbiIKK21zZ3N0ciAip+Sko6jswuC0q6XOqrq8yKZzwMkiCisKKyM6IGZpbGVpby5jOjIxOTUKK21zZ2lkICJDb252ZXJzaW9uIHdpdGggJ2NoYXJjb252ZXJ0JyBmYWlsZWQiCittc2dzdHIgIqZypLi2sMLgtKu/+bt+IgorCisjOiBmaWxlaW8uYzoyMTk4Cittc2dpZCAiY2FuJ3QgcmVhZCBvdXRwdXQgb2YgJ2NoYXJjb252ZXJ0JyIKK21zZ3N0ciAitUyqa8WqqPogJ2NoYXJjb252ZXJ0JyCqur/ppVgiCisKKyM6IGZpbGVpby5jOjI2MDEKK21zZ2lkICJFMjAzOiBBdXRvY29tbWFuZHMgZGVsZXRlZCBvciB1bmxvYWRlZCBidWZmZXIgdG8gYmUgd3JpdHRlbiIKK21zZ3N0ciAiRTIwMzogQXV0b2NvbW1hbmQgp1Kwo6nOxMCp8aRGrW68Z6RKqrq9d73EsM8iCisKKyM6IGZpbGVpby5jOjI2MjQKK21zZ2lkICJFMjA0OiBBdXRvY29tbWFuZCBjaGFuZ2VkIG51bWJlciBvZiBsaW5lcyBpbiB1bmV4cGVjdGVkIHdheSIKK21zZ3N0ciAiRTIwNDogQXV0b2NvbW1hbmQgt06lfqZhp+/F3KRGpua4uSIKKworIzogZmlsZWlvLmM6MjY5MiBmaWxlaW8uYzoyNzEwCittc2dpZCAiaXMgbm90IGEgZmlsZSBvciB3cml0YWJsZSBkZXZpY2UiCittc2dzdHIgIqSjrE/Aya7Xqc6labxnpEqqurjLuG0iCisKKyM6IGZpbGVpby5jOjI3NjIKK21zZ2lkICJpcyByZWFkLW9ubHkgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAirE+w38WqwMkgKL3QqM+lziAhILFqqO6w9abmKSIKKworIzogZmlsZWlvLmM6MzA2NQorbXNnaWQgIkU1MDY6IENhbid0IHdyaXRlIHRvIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDY6ILVMqmu8Z6RKs8al98DJICi90KjPpc4gISCxaqjusPWm5ikiCisKKyM6IGZpbGVpby5jOjMwNzcKK21zZ2lkICJFNTA3OiBDbG9zZSBlcnJvciBmb3IgYmFja3VwIGZpbGUgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTUwNzogtUyqa8P2s6yzxqX3wMkgKL3QqM+lziAhILFqqO6w9abmKSIKKworIzogZmlsZWlvLmM6MzA3OQorbXNnaWQgIkU1MDg6IENhbid0IHJlYWQgZmlsZSBmb3IgYmFja3VwIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDg6ILVMqmvFqqj6wMmu16VIqNGzxqX3ICi90KjPpc4gISCxaqjusPWm5ikiCisKKyM6IGZpbGVpby5jOjMwOTUKK21zZ2lkICJFNTA5OiBDYW5ub3QgY3JlYXRlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MDk6ILVMqmur2KXfs8al98DJICi90KjPpc4gISCxaqjusPWm5ikiCisKKyM6IGZpbGVpby5jOjMxOTgKK21zZ2lkICJFNTEwOiBDYW4ndCBtYWtlIGJhY2t1cCBmaWxlIChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU1MTA6ILVMqmu7c6dAs8al98DJICi90KjPpc4gISCxaqjusPWm5ikiCisKKyM6IGZpbGVpby5jOjMyNjAKK21zZ2lkICJFNDYwOiBUaGUgcmVzb3VyY2UgZm9yayB3b3VsZCBiZSBsb3N0IChhZGQgISB0byBvdmVycmlkZSkiCittc2dzdHIgIkU0NjA6IFJlc291cmNlIGZvcmsgt3yu+KWiICi90KjPpc4gISCxaqjusPWm5ikiCisKKyM6IGZpbGVpby5jOjMzNjEKK21zZ2lkICJFMjE0OiBDYW4ndCBmaW5kIHRlbXAgZmlsZSBmb3Igd3JpdGluZyIKK21zZ3N0ciAiRTIxNDogp+Sko6jsvGekSqXOqrq8yKZzwMkiCisKKyM6IGZpbGVpby5jOjMzNzkKK21zZ2lkICJFMjEzOiBDYW5ub3QgY29udmVydCAoYWRkICEgdG8gd3JpdGUgd2l0aG91dCBjb252ZXJzaW9uKSIKK21zZ3N0ciAiRTIxMzogtUyqa8LgtKsgKL3QqM+lziAhILFqqO6ko8LgtKu8Z6RKKSIKKworIzogZmlsZWlvLmM6MzQxNAorbXNnaWQgIkUxNjY6IENhbid0IG9wZW4gbGlua2VkIGZpbGUgZm9yIHdyaXRpbmciCittc2dzdHIgIkUxNjY6ILVMqmulSLxnpEq80qahtn2x0rNztbLAya7XIgorCisjOiBmaWxlaW8uYzozNDE4Cittc2dpZCAiRTIxMjogQ2FuJ3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nIgorbXNnc3RyICJFMjEyOiC1TKprpUi8Z6RKvNKmobZ9sdIiCisKKyM6IGZpbGVpby5jOjM2NjgKK21zZ2lkICJFNTEyOiBDbG9zZSBmYWlsZWQiCittc2dzdHIgIkU1MTI6IMP2s6ylorHRIgorCisjOiBmaWxlaW8uYzozNzM5Cittc2dpZCAiRTUxMzogd3JpdGUgZXJyb3IsIGNvbnZlcnNpb24gZmFpbGVkIgorbXNnc3RyICJFNTEzOiC1TKprvGekSiAtLSDC4LSrpaKx0SIKKworIzogZmlsZWlvLmM6Mzc0NQorbXNnaWQgIkU1MTQ6IHdyaXRlIGVycm9yIChmaWxlIHN5c3RlbSBmdWxsPykiCittc2dzdHIgIkU1MTQ6ILxnpEq/+bt+ICjAya7XqHSyzqR3uqGhSCkiCisKKyM6IGZpbGVpby5jOjM4MTIKK21zZ2lkICIgQ09OVkVSU0lPTiBFUlJPUiIKK21zZ3N0ciAiwuC0q7/5u34iCisKKyM6IGZpbGVpby5jOjM4MjgKK21zZ2lkICJbRGV2aWNlXSIKK21zZ3N0ciAiW7jLuG1dIgorCisjOiBmaWxlaW8uYzozODMzCittc2dpZCAiW05ld10iCittc2dzdHIgIlu3c10iCisKKyM6IGZpbGVpby5jOjM4NTUKK21zZ2lkICIgW2FdIgorbXNnc3RyICJbYV0iCisKKyM6IGZpbGVpby5jOjM4NTUKK21zZ2lkICIgYXBwZW5kZWQiCittc2dzdHIgIiCkd6r+pVsiCisKKyM6IGZpbGVpby5jOjM4NTcKK21zZ2lkICIgW3ddIgorbXNnc3RyICJbd10iCisKKyM6IGZpbGVpby5jOjM4NTcKK21zZ2lkICIgd3JpdHRlbiIKK21zZ3N0ciAiIKR3vGekSiIKKworIzogZmlsZWlvLmM6MzkxMAorbXNnaWQgIkUyMDU6IFBhdGNobW9kZTogY2FuJ3Qgc2F2ZSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA1OiBQYXRjaCC80qahOiC1TKprwHimc63sqWzAya7XIgorCisjOiBmaWxlaW8uYzozOTMyCittc2dpZCAiRTIwNjogcGF0Y2htb2RlOiBjYW4ndCB0b3VjaCBlbXB0eSBvcmlnaW5hbCBmaWxlIgorbXNnc3RyICJFMjA2OiBQYXRjaCC80qahOiC1TKprxdyn86rFqrqt7KlswMmu1yIKKworIzogZmlsZWlvLmM6Mzk0NworbXNnaWQgIkUyMDc6IENhbid0IGRlbGV0ZSBiYWNrdXAgZmlsZSIKK21zZ3N0ciAiRTIwNzogtUyqa6dSsKOzxqX3wMkiCisKKyM6IGZpbGVpby5jOjQwMDgKK21zZ2lkICIiCisiXG4iCisiV0FSTklORzogT3JpZ2luYWwgZmlsZSBtYXkgYmUgbG9zdCBvciBkYW1hZ2VkXG4iCittc2dzdHIgIiIKKyJcbiIKKyLEtadpOiCt7KlswMmu16x5paKpzrdsw2FcbiIKKworIzogZmlsZWlvLmM6NDAxMAorbXNnaWQgImRvbid0IHF1aXQgdGhlIGVkaXRvciB1bnRpbCB0aGUgZmlsZSBpcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiEiCittc2dzdHIgIqZiwMmu16W/vVS8Z6RKq2W90KTFwve2fb1zv+i+uSEiCisKKyM6IGZpbGVpby5jOjQwOTkKK21zZ2lkICJbZG9zXSIKK21zZ3N0ciAiW2Rvc10iCisKKyM6IGZpbGVpby5jOjQwOTkKK21zZ2lkICJbZG9zIGZvcm1hdF0iCittc2dzdHIgIltkb3MgruamoV0iCisKKyM6IGZpbGVpby5jOjQxMDYKK21zZ2lkICJbbWFjXSIKK21zZ3N0ciAiW21hY10iCisKKyM6IGZpbGVpby5jOjQxMDYKK21zZ2lkICJbbWFjIGZvcm1hdF0iCittc2dzdHIgIlttYWMgruamoV0iCisKKyM6IGZpbGVpby5jOjQxMTMKK21zZ2lkICJbdW5peF0iCittc2dzdHIgIlt1bml4XSIKKworIzogZmlsZWlvLmM6NDExMworbXNnaWQgIlt1bml4IGZvcm1hdF0iCittc2dzdHIgIlt1bml4IK7mpqFdIgorCisjOiBmaWxlaW8uYzo0MTQwCittc2dpZCAiMSBsaW5lLCAiCittc2dzdHIgIjEgpuYsICIKKworIzogZmlsZWlvLmM6NDE0MgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMsICIKK21zZ3N0ciAiJWxkIKbmLCAiCisKKyM6IGZpbGVpby5jOjQxNDUKK21zZ2lkICIxIGNoYXJhY3RlciIKK21zZ3N0ciAipECt06ZypLgiCisKKyM6IGZpbGVpby5jOjQxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYXJhY3RlcnMiCittc2dzdHIgIiVsZK3TpnKkuCIKKworIzogZmlsZWlvLmM6NDE1NworbXNnaWQgIltub2VvbF0iCittc2dzdHIgIltub2VvbF0iCisKKyM6IGZpbGVpby5jOjQxNTcKK21zZ2lkICJbSW5jb21wbGV0ZSBsYXN0IGxpbmVdIgorbXNnc3RyICJbtbKnwKbmpKOnub7jXSIKKworIy4gZG9uJ3Qgb3ZlcndyaXRlIG1lc3NhZ2VzIGhlcmUKKyMuIG11c3QgZ2l2ZSB0aGlzIHByb21wdAorIy4gZG9uJ3QgdXNlIGVtc2coKSBoZXJlLCBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBidWZmZXJzCisjOiBmaWxlaW8uYzo0MTc2Cittc2dpZCAiV0FSTklORzogVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSByZWFkaW5nIGl0ISEhIgorbXNnc3RyICLEtadpOiClu8DJrtem26RXprjFqqRKq+Gkd8XcsMohISEiCisKKyM6IGZpbGVpby5jOjQxNzgKK21zZ2lkICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgdG8gaXQiCittc2dzdHIgIr1UqXetbrxnpEq23CIKKworIzogZmlsZWlvLmM6NTIxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjA4OiBFcnJvciB3cml0aW5nIHRvIFwiJXNcIiIKK21zZ3N0ciAiRTIwODogvGekSsDJrtcgXCIlc1wiIL/5u34iCisKKyM6IGZpbGVpby5jOjUyMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIwOTogRXJyb3IgY2xvc2luZyBcIiVzXCIiCittc2dzdHIgIkUyMDk6IMP2s6zAya7XIFwiJXNcIiC/+bt+IgorCisjOiBmaWxlaW8uYzo1MjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyMTA6IEVycm9yIHJlYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFMjEwOiDFqqj6wMmu1yBcIiVzXCIgv/m7fiIKKworIzogZmlsZWlvLmM6NTQ0OAorbXNnaWQgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIkUyNDY6IEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgp1Kwo713vcSwzyIKKworIzogZmlsZWlvLmM6NTQ1NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjExOiBXYXJuaW5nOiBGaWxlIFwiJXNcIiBubyBsb25nZXIgYXZhaWxhYmxlIgorbXNnc3RyICJFMjExOiDEtadpOiDAya7XIFwiJXNcIiCkd7hnpKOmc6ZiIgorCisjOiBmaWxlaW8uYzo1NDY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXMTI6IFdhcm5pbmc6IEZpbGUgXCIlc1wiIGhhcyBjaGFuZ2VkIGFuZCB0aGUgYnVmZmVyIHdhcyBjaGFuZ2VkIGluIFZpbSBhcyAiCisid2VsbCIKK21zZ3N0ciAiVzEyOiDEtadpOiDAya7XIFwiJXNcIiCm26RXprjFqqRKq+Gkd8XcsMosIKbTpUK9c7/opKSqur13vcSwz6Rdp/OwyqRGIgorCisjOiBmaWxlaW8uYzo1NDcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMTogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTE6IMS1p2k6IMDJrtcgXCIlc1wiIKbbpFemuMWqpEqr4aR3xdywyiIKKworIzogZmlsZWlvLmM6NTQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICJXMTY6IFdhcm5pbmc6IE1vZGUgb2YgZmlsZSBcIiVzXCIgaGFzIGNoYW5nZWQgc2luY2UgZWRpdGluZyBzdGFydGVkIgorbXNnc3RyICJXMTY6IMS1p2k6IMDJrtcgXCIlc1wiIKq6xXatrbtQpFemuMWqpEquyaSjpEC8yyAoprPF3LDKuUwpIgorCisjICdtb2RlJyBzZWVtcyBiZXR0ZXIgYXMgdHJhbnNsYXRlZCB0byAncGVybWlzc2lvbic/CisjOiBmaWxlaW8uYzo1NDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlcxMzogV2FybmluZzogRmlsZSBcIiVzXCIgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBlZGl0aW5nIHN0YXJ0ZWQiCittc2dzdHIgIlcxMzogxLWnaTogwMmu1yBcIiVzXCIgpmK2falsvXO/6KvhpFOzUavYpd+kRiIKKworIzogZmlsZWlvLmM6NTUwMQorbXNnaWQgIldhcm5pbmciCittc2dzdHIgIsS1p2kiCisKKyM6IGZpbGVpby5jOjU1MDIKK21zZ2lkICIiCisiJk9LXG4iCisiJkxvYWQgRmlsZSIKK21zZ3N0ciAiIgorIr1UqXcoJk8pXG4iCisiuPykSsDJrtcoJkwpIgorCisjOiBmaWxlaW8uYzo1NjAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjI6IENvdWxkIG5vdCBwcmVwYXJlIGZvciByZWxvYWRpbmcgXCIlc1wiIgorbXNnc3RyICJFNDYyOiC1TKprt8ezxq2rt3O4/KRKIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NTYxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIxOiBDb3VsZCBub3QgcmVsb2FkIFwiJXNcIiIKK21zZ3N0ciAiRTMyMTogtUyqa62rt3O4/KRKIFwiJXNcIiIKKworIzogZmlsZWlvLmM6NjIwMQorbXNnaWQgIi0tRGVsZXRlZC0tIgorbXNnc3RyICItLaR3p1Kwoy0tIgorCisjLiB0aGUgZ3JvdXAgZG9lc24ndCBleGlzdAorIzogZmlsZWlvLmM6NjM2MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY3OiBObyBzdWNoIGdyb3VwOiBcIiVzXCIiCittc2dzdHIgIkUzNjc6ILVMprm4c7LVOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjY0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIxNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgKjogJXMiCittc2dzdHIgIkUyMTU6ICogq+GtsaazpKOlv71UqrqmcqS4OiAlcyIKKworIzogZmlsZWlvLmM6NjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjE2OiBObyBzdWNoIGV2ZW50OiAlcyIKK21zZ3N0ciAiRTIxNjogtUymuajGpfM6ICVzIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IGZpbGVpby5jOjY2NDYKK21zZ2lkICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIEF1dG8tQ29tbWFuZHMgLS0tIgorCisjOiBmaWxlaW8uYzo2OTE3Cittc2dpZCAiRTIxNzogQ2FuJ3QgZXhlY3V0ZSBhdXRvY29tbWFuZHMgZm9yIEFMTCBldmVudHMiCittc2dzdHIgIkUyMTc6ILVMqmu576nSprOoxqXzsPWm5iBhdXRvY29tbWFuZCIKKworIzogZmlsZWlvLmM6Njk0MAorbXNnaWQgIk5vIG1hdGNoaW5nIGF1dG9jb21tYW5kcyIKK21zZ3N0ciAip+Sko6jsue/As6q6IGF1dG9jb21tYW5kIgorCisjOiBmaWxlaW8uYzo3MjYwCittc2dpZCAiRTIxODogYXV0b2NvbW1hbmQgbmVzdGluZyB0b28gZGVlcCIKK21zZ3N0ciAiRTIxODogYXV0b2NvbW1hbmQgvGi8xrlMsmAiCisKKyM6IGZpbGVpby5jOjc1MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgQXV0byBjb21tYW5kcyBmb3IgXCIlc1wiIgorbXNnc3RyICIlcyBBdXRvIGNvbW1hbmRzOiBcIiVzXCIiCisKKyM6IGZpbGVpby5jOjc1MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhlY3V0aW5nICVzIgorbXNnc3RyICKw9abmICVzIgorCisjLiBhbHdheXMgc2Nyb2xsIHVwLCBkb24ndCBvdmVyd3JpdGUKKyM6IGZpbGVpby5jOjc2MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXV0b2NvbW1hbmQgJXMiCittc2dzdHIgImF1dG9jb21tYW5kICVzIgorCisjOiBmaWxlaW8uYzo4MTcxCittc2dpZCAiRTIxOTogTWlzc2luZyB7LiIKK21zZ3N0ciAiRTIxOTogr8qk1iB7LiIKKworIzogZmlsZWlvLmM6ODE3MworbXNnaWQgIkUyMjA6IE1pc3NpbmcgfS4iCittc2dzdHIgIkUyMjA6IK/KpNYgfS4iCisKKyM6IGZvbGQuYzo2NgorbXNnaWQgIkU0OTA6IE5vIGZvbGQgZm91bmQiCittc2dzdHIgIkU0OTA6IKfkpKOo7KX0pvMgZm9sZCIKKworIzogZm9sZC5jOjU1MworbXNnaWQgIkUzNTA6IENhbm5vdCBjcmVhdGUgZm9sZCB3aXRoIGN1cnJlbnQgJ2ZvbGRtZXRob2QnIgorbXNnc3RyICJFMzUwOiC1TKprpmKl2KtlqrogJ2ZvbGRtZXRob2QnIKRVq9il3yBmb2xkIgorCisjOiBmb2xkLmM6NTU1Cittc2dpZCAiRTM1MTogQ2Fubm90IGRlbGV0ZSBmb2xkIHdpdGggY3VycmVudCAnZm9sZG1ldGhvZCciCittc2dzdHIgIkUzNTE6ILVMqmumYqXYq2WquiAnZm9sZG1ldGhvZCcgpFWnUrCjIGZvbGQiCisKKyM6IGdldGNoYXIuYzoyNDYKK21zZ2lkICJFMjIyOiBBZGQgdG8gcmVhZCBidWZmZXIiCittc2dzdHIgIkUyMjI6IKVbpErFqqj6vXe9xLDPpKQiCisKKyM6IGdldGNoYXIuYzoyMTQ2Cittc2dpZCAiRTIyMzogcmVjdXJzaXZlIG1hcHBpbmciCittc2dzdHIgIkUyMjM6ILu8sGogbWFwcGluZyIKKworIzogZ2V0Y2hhci5jOjI5OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNDogZ2xvYmFsIGFiYnJldmlhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjQ6ICVzIKR3uGems6X+sOwgYWJicmV2aWF0aW9uIKRGIgorCisjOiBnZXRjaGFyLmM6Mjk5NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjI1OiBnbG9iYWwgbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjU6ICVzIKR3uGems6X+sOwgbWFwcGluZyCkRiIKKworIzogZ2V0Y2hhci5jOjMxMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNjogYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciAlcyIKK21zZ3N0ciAiRTIyNjogJXMgpHe4Z6azIGFiYnJldmlhdGlvbiCkRiIKKworIzogZ2V0Y2hhci5jOjMxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIyNzogbWFwcGluZyBhbHJlYWR5IGV4aXN0cyBmb3IgJXMiCittc2dzdHIgIkUyMjc6ICVzIKq6IG1hcHBpbmcgpHe4Z6ZzpmIiCisKKyM6IGdldGNoYXIuYzozMTkxCittc2dpZCAiTm8gYWJicmV2aWF0aW9uIGZvdW5kIgorbXNnc3RyICKn5KSjqOwgYWJicmV2aWF0aW9uIgorCisjOiBnZXRjaGFyLmM6MzE5MworbXNnaWQgIk5vIG1hcHBpbmcgZm91bmQiCittc2dzdHIgIqhTprOzb63TIG1hcHBpbmcgue/AsyIKKworIzogZ2V0Y2hhci5jOjQwODMKK21zZ2lkICJFMjI4OiBtYWtlbWFwOiBJbGxlZ2FsIG1vZGUiCittc2dzdHIgIkUyMjg6IG1ha2VtYXA6IKSjpb+9VKq6vNKmoSIKKworIzogZ3VpLmM6MjE4Cittc2dpZCAiRTIyOTogQ2Fubm90IHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkUyMjk6ILVMqmux0rDKuc+rrKzJrbEiCisKKyM6IGd1aS5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJFMjMwOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTIzMDogtUyqa8WqqPrAya7XIFwiJXNcIiIKKworIzogZ3VpLmM6NDcyCittc2dpZCAiRTIzMTogJ2d1aWZvbnR3aWRlJyBpbnZhbGlkIgorbXNnc3RyICJFMjMxOiCko6W/vVSquiAnZ3VpZm9udHdpZGUnIgorCisjOiBndWkuYzozOTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNTQ6IENhbm5vdCBhbGxvY2F0ZSBjb2xvciAlcyIKK21zZ3N0ciAiRTI1NDogpKOv4LB0uG3DQ6biICVzIgorCisjOiBndWlfYXRfZnMuYzoyOTAKK21zZ2lkICI8Y2Fubm90IG9wZW4+ICIKK21zZ3N0ciAiPKSjr+C2fbHSPiIKKworIzogZ3VpX2F0X2ZzLmM6MTExNQorIywgYy1mb3JtYXQKK21zZ2lkICJFNjE2OiB2aW1fU2VsRmlsZTogY2FuJ3QgZ2V0IGZvbnQgJXMiCittc2dzdHIgIkU2MTY6IHZpbV9TZWxGaWxlOiCko6/gqM+lziAlcyCmcqusIgorCisjOiBndWlfYXRfZnMuYzoyNTM4Cittc2dpZCAiRTYxNDogdmltX1NlbEZpbGU6IGNhbid0IHJldHVybiB0byBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNDogdmltX1NlbEZpbGU6ILVMqmumXqjspdirZaXYv/0iCisKKyM6IGd1aV9hdF9mcy5jOjI1NTcKK21zZ2lkICJQYXRobmFtZToiCittc2dzdHIgIrj0rnw6IgorCisjOiBndWlfYXRfZnMuYzoyNTYzCittc2dpZCAiRTYxNTogdmltX1NlbEZpbGU6IGNhbid0IGdldCBjdXJyZW50IGRpcmVjdG9yeSIKK21zZ3N0ciAiRTYxNTogdmltX1NlbEZpbGU6ILVMqmuo+rFvpdirZaXYv/0iCisKKyM6IGd1aV9hdF9mcy5jOjI1NzEgZ3VpX21vdGlmLmM6MTYxOQorbXNnaWQgIk9LIgorbXNnc3RyICK9VKl3IgorCisjOiBndWlfYXRfZnMuYzoyNTcxIGd1aV9ndGsuYzoyNjI1IGd1aV9tb3RpZi5jOjE2MTQgZ3VpX21vdGlmLmM6Mjg0NAorbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiqPqu+CIKKworIzogZ3VpX2F0X3NiLmM6NDg2Cittc2dpZCAiU2Nyb2xsYmFyIFdpZGdldDogQ291bGQgbm90IGdldCBnZW9tZXRyeSBvZiB0aHVtYiBwaXhtYXAuIgorbXNnc3RyICKxsrDKtmI6IKSjr+CzXal3IHRodW1iIHBpeG1hcCCquqbsuG0iCisKKyM6IGd1aV9hdGhlbmEuYzoxOTU2IGd1aV9tb3RpZi5jOjE4NjcKK21zZ2lkICJWaW0gZGlhbG9nIgorbXNnc3RyICJWaW0gue+43LKwIgorCisjOiBndWlfYmV2YWwuYzo5MQorbXNnaWQgIkUyMzI6IENhbm5vdCBjcmVhdGUgQmFsbG9vbkV2YWwgd2l0aCBib3RoIG1lc3NhZ2UgYW5kIGNhbGxiYWNrIgorbXNnc3RyICJFMjMyOiCko6/gue+wVK6nu1AgY2FsbGJhY2sgq9il3yBCYWxsb25FdmFsIgorCisjOiBndWlfZ3RrLmM6MTU2MQorbXNnaWQgIlZpbSBkaWFsb2cuLi4iCittc2dzdHIgIlZpbSC577jcsrAuLi4iCisKKyM6IGd1aV9ndGsuYzoxOTkyIG1lc3NhZ2UuYzoyNTI1Cittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlmsT1xuIgorIiZOp19cbiIKKyImQ6j6rvgiCisKKyM6IGd1aV9ndGsuYzoyMTUyCittc2dpZCAiSW5wdXQgX01ldGhvZHMiCittc2dzdHIgIr/ppEqqayIKKworIzogZ3VpX2d0ay5jOjI0MTggZ3VpX21vdGlmLmM6Mjc2MworbXNnaWQgIlZJTSAtIFNlYXJjaCBhbmQgUmVwbGFjZS4uLiIKK21zZ3N0ciAiVklNIC0gtE2n5LtQqPqlTi4uLiIKKworIzogZ3VpX2d0ay5jOjI0MjYgZ3VpX21vdGlmLmM6Mjc2NQorbXNnaWQgIlZJTSAtIFNlYXJjaC4uLiIKK21zZ3N0ciAiVklNIC0gtE2n5C4uLiIKKworIzogZ3VpX2d0ay5jOjI0NTggZ3VpX21vdGlmLmM6Mjg4MworbXNnaWQgIkZpbmQgd2hhdDoiCittc2dzdHIgIrdqtE06IgorCisjOiBndWlfZ3RrLmM6MjQ3OCBndWlfbW90aWYuYzoyOTE1Cittc2dpZCAiUmVwbGFjZSB3aXRoOiIKK21zZ3N0ciAiqPqlTqywOiIKKworIy4gd2hvbGUgd29yZCBvbmx5IGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI1MTAgZ3VpX21vdGlmLmM6MzAzMQorbXNnaWQgIk1hdGNoIHdob2xlIHdvcmQgb25seSIKK21zZ3N0ciAipXW3arRNp7ml/qzbplCquqZyIgorCisjLiBtYXRjaCBjYXNlIGJ1dHRvbgorIzogZ3VpX2d0ay5jOjI1MjMgZ3VpX21vdGlmLmM6MzA0MworbXNnaWQgIk1hdGNoIGNhc2UiCittc2dzdHIgIrLFplikaqRwvGciCisKKyM6IGd1aV9ndGsuYzoyNTM1IGd1aV9tb3RpZi5jOjI5ODUKK21zZ2lkICJEaXJlY3Rpb24iCittc2dzdHIgIqToplYiCisKKyMuICdVcCcgYW5kICdEb3duJyBidXR0b25zCisjOiBndWlfZ3RrLmM6MjU0NyBndWlfbW90aWYuYzoyOTk3Cittc2dpZCAiVXAiCittc2dzdHIgIqZWpFciCisKKyM6IGd1aV9ndGsuYzoyNTUxIGd1aV9tb3RpZi5jOjMwMDUKK21zZ2lkICJEb3duIgorbXNnc3RyICKmVqRVIgorCisjOiBndWlfZ3RrLmM6MjU3NyBndWlfZ3RrLmM6MjU3OSBndWlfbW90aWYuYzoyNzg3Cittc2dpZCAiRmluZCBOZXh0IgorbXNnc3RyICKn5KRVpECt0yIKKworIzogZ3VpX2d0ay5jOjI1OTYgZ3VpX2d0ay5jOjI1OTggZ3VpX21vdGlmLmM6MjgwNAorbXNnaWQgIlJlcGxhY2UiCittc2dzdHIgIqj6pU4iCisKKyM6IGd1aV9ndGsuYzoyNjA5IGd1aV9ndGsuYzoyNjExIGd1aV9tb3RpZi5jOjI4MTcKK21zZ2lkICJSZXBsYWNlIEFsbCIKK21zZ3N0ciAiqPqlTqX+s6EiCisKKyM6IGd1aV9ndGtfeDExLmM6MjI4NQorbXNnaWQgIlZpbTogUmVjZWl2ZWQgXCJkaWVcIiByZXF1ZXN0IGZyb20gc2Vzc2lvbiBtYW5hZ2VyXG4iCittc2dzdHIgIlZpbTogpdEgU2Vzc2lvbiC63rJ6rfumrKjsIFwiZGllXCIgrW6oRFxuIgorCisjOiBndWlfZ3RrX3gxMS5jOjM0MjQKK21zZ2lkICJWaW06IE1haW4gd2luZG93IHVuZXhwZWN0ZWRseSBkZXN0cm95ZWRcbiIKK21zZ3N0ciAiVmltOiClRLX4taHE6rG8XG4iCisKKyM6IGd1aV9ndGtfeDExLmM6NDAzOAorbXNnaWQgIkZvbnQgU2VsZWN0aW9uIgorbXNnc3RyICKmcqusv+++3CIKKworIzogZ3VpX2d0a194MTEuYzo1ODkwIHVpLmM6MjAwOQorbXNnaWQgIlVzZWQgQ1VUX0JVRkZFUjAgaW5zdGVhZCBvZiBlbXB0eSBzZWxlY3Rpb24iCittc2dzdHIgIqjPpc4gQ1VUX0JVRkZFUjAgqNOo+qVOqsW/777cIgorCisjOiBndWlfbW90aWYuYzoxNjEzIGd1aV9tb3RpZi5jOjE2MTYKK21zZ2lkICJGaWx0ZXIiCittc2dzdHIgIrlMwm++uSIKKworIzogZ3VpX21vdGlmLmM6MTYxNQorbXNnaWQgIkRpcmVjdG9yaWVzIgorbXNnc3RyICKl2L/9IgorCisjOiBndWlfbW90aWYuYzoxNjE3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiu7KnVbuhqfoiCisKKyM6IGd1aV9tb3RpZi5jOjE2MTgKK21zZ2lkICJGaWxlcyIKK21zZ3N0ciAiwMmu1yIKKworIzogZ3VpX21vdGlmLmM6MTYyMAorbXNnaWQgIlNlbGVjdGlvbiIKK21zZ3N0ciAiv+++3CIKKworIzogZ3VpX21vdGlmLmM6MjgzMAorbXNnaWQgIlVuZG8iCittc2dzdHIgIrRfrewiCisKKyM6IGd1aV9yaXNjb3MuYzo5NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTYxMDogQ2FuJ3QgbG9hZCBaYXAgZm9udCAnJXMnIgorbXNnc3RyICJFNjEwOiC1TKprtn2x0iBaYXAgpnKrrCAnJXMnIgorCisjOiBndWlfcmlzY29zLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjExOiBDYW4ndCB1c2UgZm9udCAlcyIKK21zZ3N0ciAiRTYxMTogtUyqa6jPpc6mcqusICVzIgorCisjOiBndWlfcmlzY29zLmM6MzI2OQorbXNnaWQgIiIKKyJcbiIKKyJTZW5kaW5nIG1lc3NhZ2UgdG8gdGVybWluYXRlIGNoaWxkIHByb2Nlc3MuXG4iCittc2dzdHIgIiIKKyJcbiIKKyKwZaVYpKTCX6RstXumoaq6sFSup6SkLlxuIgorCisjOiBndWlfdzMyLmM6NzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDM6IEFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQ6IFwiLSVzXCI7IFVzZSB0aGUgT0xFIHZlcnNpb24uIgorbXNnc3RyICJFMjQzOiCko6TktKmw0bzGIFwiLSVzXCKhQ73Qpc4gT0xFIKqppbuhQyIKKworIzogZ3VpX3c0OC5jOjIwMjkKK21zZ2lkICJGaW5kIHN0cmluZyAodXNlICdcXFxcJyB0byBmaW5kICBhICdcXCcpIgorbXNnc3RyICK3arRNpnKm6iAoqM+lziAnXFxcXCcgqNOq7aXcICdcXCcpIgorCisjOiBndWlfdzQ4LmM6MjA1NAorbXNnaWQgIkZpbmQgJiBSZXBsYWNlICh1c2UgJ1xcXFwnIHRvIGZpbmQgIGEgJ1xcJykiCittc2dzdHIgIrdqtE2kzqj6pU6mcqbqICioz6XOICdcXFxcJyCo06rtpdwgJ1xcJykiCisKKyM6IGd1aV94MTEuYzoxNDQ1Cittc2dpZCAiVmltIEU0NTg6IENhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcCBlbnRyeSwgc29tZSBjb2xvcnMgbWF5IGJlIGluY29ycmVjdCIKK21zZ3N0ciAiVmltIEU0NTg6ILVMqmuwdLhtIGNvbG9yIG1hcCC2taXYoUGms6jHw0Om4qzdsF+o07d8qcepx6q6IgorCisjOiBndWlfeDExLmM6MjAxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUwOiBGb250cyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyc2V0cyBhcmUgbWlzc2luZyBpbiBmb250c2V0ICVzOiIKK21zZ3N0ciAiRTI1MDogRm9udHNldCAlcyCoU6azs12pd6W/vVSquqZyq6ylSKjRxeOl3LNvqMemcqS4trA6IgorCisjOiBndWlfeDExLmM6MjA2MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUyOiBGb250c2V0IG5hbWU6ICVzIgorbXNnc3RyICJFMjUyOiCmcqustrAoRm9udHNldCmmV7rZOiAlcyIKKworIzogZ3VpX3gxMS5jOjIwNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udCAnJXMnIGlzIG5vdCBmaXhlZC13aWR0aCIKK21zZ3N0ciAiJyVzJyCko6xPqVSpd7xlq9emcqusIgorCisjOiBndWlfeDExLmM6MjA4MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjUzOiBGb250c2V0IG5hbWU6ICVzXG4iCittc2dzdHIgIkUyNTM6IKZyq6y2sChGb250c2V0KaZXutk6ICVzXG4iCisKKyM6IGd1aV94MTEuYzoyMDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvbnQwOiAlc1xuIgorbXNnc3RyICJGb250MDogJXNcbiIKKworIzogZ3VpX3gxMS5jOjIwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9udDE6ICVzXG4iCittc2dzdHIgIkZvbnQxOiAlc1xuIgorCisjOiBndWlfeDExLmM6MjA4NQorIywgYy1mb3JtYXQKK21zZ2lkICJGb250JWQgd2lkdGggaXMgbm90IHR3aWNlIHRoYXQgb2YgZm9udDBcbiIKK21zZ3N0ciAipnKrrCVkvGWr16SjrE+mcqusMKq6qOKtv1xuIgorCisjOiBndWlfeDExLmM6MjA4NgorIywgYy1mb3JtYXQKK21zZ2lkICJGb250MCB3aWR0aDogJWxkXG4iCittc2dzdHIgIqZyq6wwqrq8ZavXoUclbGRcbiIKKworIzogZ3VpX3gxMS5jOjIwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvbnQxIHdpZHRoOiAlbGRcbiIKKyJcbiIKK21zZ3N0ciAiIgorIqZyq6wxvGWr1zogJWxkXG4iCisiXG4iCisKKyM6IGhhbmd1bGluLmM6NjEwCittc2dpZCAiRTI1NjogSGFuZ3VsIGF1dG9tYXRhIEVSUk9SIgorbXNnc3RyICJFMjU2OiBIYW5ndWwgYXV0b21hdGEgv/m7fiIKKworIzogaWZfY3Njb3BlLmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIgorbXNnc3RyICJFNTYwOiClzqprOiBjc1tjb3BlXSAlcyIKKworIzogaWZfY3Njb3BlLmM6NjcKK21zZ2lkICJBZGQgYSBuZXcgZGF0YWJhc2UiCittc2dzdHIgIrdzvFe46q7GrnciCisKKyM6IGlmX2NzY29wZS5jOjY5Cittc2dpZCAiUXVlcnkgZm9yIGEgcGF0dGVybiIKK21zZ3N0ciAiv+mkSiBwYXR0ZXJuIgorCisjOiBpZl9jc2NvcGUuYzo3MQorbXNnaWQgIlNob3cgdGhpcyBtZXNzYWdlIgorbXNnc3RyICLF46XcprmwVK6nIgorCisjOiBpZl9jc2NvcGUuYzo3MworbXNnaWQgIktpbGwgYSBjb25uZWN0aW9uIgorbXNnc3RyICK1sqf0s3O9dSIKKworIzogaWZfY3Njb3BlLmM6NzUKK21zZ2lkICJSZWluaXQgYWxsIGNvbm5lY3Rpb25zIgorbXNnc3RyICKtq7NdqdKms7NzvXUiCisKKyM6IGlmX2NzY29wZS5jOjc3Cittc2dpZCAiU2hvdyBjb25uZWN0aW9ucyIKK21zZ3N0ciAixeOl3LNzvXUiCisKKyM6IGlmX2NzY29wZS5jOjEwOAorbXNnaWQgIlRoaXMgY3Njb3BlIGNvbW1hbmQgZG9lcyBub3Qgc3VwcG9ydCBzcGxpdHRpbmcgdGhlIHdpbmRvdy5cbiIKK21zZ3N0ciAis2+t0yBjc2NvcGUgqVKlT6SjpOS0qaTAs86/w7n1XG4iCisKKyM6IGlmX2NzY29wZS5jOjE0MworbXNnaWQgIkU1NjI6IFVzYWdlOiBjc3RhZyA8aWRlbnQ+IgorbXNnc3RyICJFNTYyOiClzqprOiBjc3RhZyA8w9GnT6ZyaWRlbnQ+IgorCisjOiBpZl9jc2NvcGUuYzoxOTkKK21zZ2lkICJFMjU3OiBjc3RhZzogdGFnIG5vdCBmb3VuZCIKK21zZ3N0ciAiRTI1NzogY3N0YWc6IKfkpKOo7CB0YWciCisKKyM6IGlmX2NzY29wZS5jOjQwNyBpZl9jc2NvcGUuYzo0NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2Mzogc3RhdCglcykgZXJyb3I6ICVkIgorbXNnc3RyICJFNTYzOiBzdGF0KCVzKSC/+bt+OiAlZCIKKworIzogaWZfY3Njb3BlLmM6NDYxIGlmX2NzY29wZS5jOjQ2OAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRlZCBjc2NvcGUgZGF0YWJhc2UgJXMiCittc2dzdHIgIrdzvFcgY3Njb3BlILjqrsaudyAlcyIKKworIzogaWZfY3Njb3BlLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjQ6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHZhbGlkIGNzY29wZSBkYXRhYmFzZSIKK21zZ3N0ciAiRTU2NDogJXMgpKOsT6XYv/2pziBjc2NvcGUguOquxq53IgorCisjOiBpZl9jc2NvcGUuYzo1NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU2NTogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlZCIKK21zZ3N0ciAiRTU2NTogxaqo+iBjc2NvcGUgs3O9dSAlZCC/+bt+IgorCisjOiBpZl9jc2NvcGUuYzo2MzYKK21zZ2lkICJFNTYxOiB1bmtub3duIGNzY29wZSBzZWFyY2ggdHlwZSIKK21zZ3N0ciAiRTU2MTogpbyqvqq6IGNzY29wZSC3arRNp866QSIKKworIzogaWZfY3Njb3BlLmM6NjgzCittc2dpZCAiRTU2NjogQ291bGQgbm90IGNyZWF0ZSBjc2NvcGUgcGlwZXMiCittc2dzdHIgIkU1NjY6ILVMqmur2KXfu1AgY3Njb3BlIKq6IHBpcGUgs3O9dSIKKworIzogaWZfY3Njb3BlLmM6NzQ4Cittc2dpZCAiY3NfY3JlYXRlX2Nvbm5lY3Rpb24gZXhlYyBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uILD1pualorHRIgorCisjOiBpZl9jc2NvcGUuYzo3NTgKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciB0b19mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gpaKx0SAodG9fZnApIgorCisjOiBpZl9jc2NvcGUuYzo3NjAKK21zZ2lkICJjc19jcmVhdGVfY29ubmVjdGlvbjogZmRvcGVuIGZvciBmcl9mcCBmYWlsZWQiCittc2dzdHIgImNzX2NyZWF0ZV9jb25uZWN0aW9uOiBmZG9wZW4gpaKx0SAoZnJfZnApIgorCisjOiBpZl9jc2NvcGUuYzo3ODgKK21zZ2lkICJFNTY3OiBubyBjc2NvcGUgY29ubmVjdGlvbnMiCittc2dzdHIgIkU1Njc6IKhTprMgY3Njb3BlILNzvXUiCisKKyM6IGlmX2NzY29wZS5jOjg1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjU5OiBubyBtYXRjaGVzIGZvdW5kIGZvciBjc2NvcGUgcXVlcnkgJXMgb2YgJXMiCittc2dzdHIgIkUyNTk6IKfkpKOo7LLFplggY3Njb3BlIKq6t2q0TSAlcyAvICVzIgorCisjOiBpZl9jc2NvcGUuYzo5MDIKK21zZ2lkICJjc2NvcGUgY29tbWFuZHM6XG4iCittc2dzdHIgImNzY29wZSCpUqVPOlxuIgorCisjOiBpZl9jc2NvcGUuYzo5MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS01czogJS0zMHMgKFVzYWdlOiAlcylcbiIKK21zZ3N0ciAiJS01czogJS0zMHMgKKXOqms6ICVzKVxuIgorCisjOiBpZl9jc2NvcGUuYzo5NzMKK21zZ2lkICJFNTY4OiBkdXBsaWNhdGUgY3Njb3BlIGRhdGFiYXNlIG5vdCBhZGRlZCIKK21zZ3N0ciAiRTU2ODograu9xqq6IGNzY29wZSC46q7GrnelvLNRpVukSiIKKworIzogaWZfY3Njb3BlLmM6OTg0Cittc2dpZCAiRTU2OTogbWF4aW11bSBudW1iZXIgb2YgY3Njb3BlIGNvbm5lY3Rpb25zIHJlYWNoZWQiCittc2dzdHIgIkU1Njk6IKR3uUao7CBjc2NvcGUgs8ykarNzvXW8xqXYIgorCisjOiBpZl9jc2NvcGUuYzoxMTA1Cittc2dpZCAiRTI2MDogY3Njb3BlIGNvbm5lY3Rpb24gbm90IGZvdW5kIgorbXNnc3RyICJFMjYwOiCn5KSjqOwgY3Njb3BlILNzvXUiCisKKyM6IGlmX2NzY29wZS5jOjExMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI2MTogY3Njb3BlIGNvbm5lY3Rpb24gJXMgbm90IGZvdW5kIgorbXNnc3RyICJFMjYxOiCn5KSjqOwgY3Njb3BlILNzvXUgJXMiCisKKyM6IGlmX2NzY29wZS5jOjExNDQKK21zZ2lkICJjc2NvcGUgY29ubmVjdGlvbiBjbG9zZWQiCittc2dzdHIgImNzY29wZSCzc711pHfD9rOsIgorCisjOiBpZl9jc2NvcGUuYzoxMTUyCisjLCBjLWZvcm1hdAorbXNnaWQgImNzY29wZSBjb25uZWN0aW9uICVzIGNsb3NlZFxuIgorbXNnc3RyICJjc2NvcGUgs3O9dSAlcyCkd8P2s6xcbiIKKworIy4gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisjOiBpZl9jc2NvcGUuYzoxMjkzCittc2dpZCAiRTU3MDogZmF0YWwgZXJyb3IgaW4gY3NfbWFuYWdlX21hdGNoZXMiCittc2dzdHIgIkU1NzA6IGNzX21hbmFnZV9tYXRjaGVzIMRZrau/+bt+IgorCisjOiBpZl9jc2NvcGUuYzoxMzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNjI6IGVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCittc2dzdHIgIkUyNjI6IMWqqPogY3Njb3BlILNzvXUgJWQgv/m7fiIKKworIzogaWZfY3Njb3BlLmM6MTQ1MgorbXNnaWQgImNvdWxkbid0IG1hbGxvY1xuIgorbXNnc3RyICK1TKprqM+lziBtYWxsb2NcbiIKKworIzogaWZfY3Njb3BlLmM6MTQ1NworIywgYy1mb3JtYXQKK21zZ2lkICJDc2NvcGUgdGFnOiAlc1xuIgorbXNnc3RyICJDc2NvcGUgvNDF0ih0YWcpOiAlc1xuIgorCisjOiBpZl9jc2NvcGUuYzoxNDYxCittc2dpZCAiICAgIyAgIGxpbmUiCittc2dzdHIgIiAgICMgICCm5iAgIgorCisjOiBpZl9jc2NvcGUuYzoxNDYzCittc2dpZCAiZmlsZW5hbWUgLyBjb250ZXh0IC8gbGluZVxuIgorbXNnc3RyICLAyaZXICAgICAvIKS6pOUgICAgLyCm5ri5XG4iCisKKyM6IGlmX2NzY29wZS5jOjE3MjEKK21zZ2lkICJBbGwgY3Njb3BlIGRhdGFiYXNlcyByZXNldCIKK21zZ3N0ciAirauzXanSprMgY3Njb3BlILjqrsaudyIKKworIzogaWZfY3Njb3BlLmM6MTc4OAorbXNnaWQgIm5vIGNzY29wZSBjb25uZWN0aW9uc1xuIgorbXNnc3RyICKoU6azIGNzY29wZSCzc711XG4iCisKKyM6IGlmX2NzY29wZS5jOjE3OTIKK21zZ2lkICIgIyBwaWQgICAgZGF0YWJhc2UgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCBwYXRoXG4iCittc2dzdHIgIiAjIHBpZCAgICC46q7GrnemV7rZICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kIHBhdGhcbiIKKworIzogaWZfY3Njb3BlLmM6MTgwMworIywgYy1mb3JtYXQKK21zZ2lkICIlMmQgJS01bGQgICUtMzRzICA8bm9uZT5cbiIKK21zZ3N0ciAiJTJkICUtNWxkICAlLTM0cyAgPLVMPlxuIgorCisjOiBpZl9weXRob24uYzozOTQKK21zZ2lkICIiCisiRTI2MzogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFB5dGhvbiBsaWJyYXJ5IGNvdWxkIG5vdCBiZSAiCisibG9hZGVkLiIKK21zZ3N0ciAiRTI2Mzogqeq6cKFBs2+t06lSpU+1TKprqM+lzqFBUHl0aG9uILV7pqGud6hTprO4/KRKoUMiCisKKyM6IGlmX3B5dGhvbi5jOjU5NgorbXNnaWQgImNhbid0IGRlbGV0ZSBPdXRwdXRPYmplY3QgYXR0cmlidXRlcyIKK21zZ3N0ciAitUyqa6dSsKMgT3V0cHV0T2JqZWN0IMTdqcoiCisKKyM6IGlmX3B5dGhvbi5jOjYwMworbXNnaWQgInNvZnRzcGFjZSBtdXN0IGJlIGFuIGludGVnZXIiCittc2dzdHIgInNvZnRzcGFjZSClsrvdrE++47zGIgorCisjOiBpZl9weXRob24uYzo2MTEKK21zZ2lkICJpbnZhbGlkIGF0dHJpYnV0ZSIKK21zZ3N0ciAipKOlv71UqrrE3anKIgorCisjOiBpZl9weXRob24uYzo2NTAgaWZfcHl0aG9uLmM6NjY0Cittc2dpZCAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGxpc3Qgb2Ygc3RyaW5ncyIKK21zZ3N0ciAid3JpdGVsaW5lcygpILvdrW4gc3RyaW5nIGxpc3Qgt+2w0bzGIgorCisjOiBpZl9weXRob24uYzo3OTAKK21zZ2lkICJFMjY0OiBQeXRob246IEVycm9yIGluaXRpYWxpc2luZyBJL08gb2JqZWN0cyIKK21zZ3N0ciAiRTI2NDogUHl0aG9uOiC1TKprquypbCBJL08gqqul8yIKKworIzogaWZfcHl0aG9uLmM6OTc1IGlmX3RjbC5jOjE0MDIKK21zZ2lkICJpbnZhbGlkIGV4cHJlc3Npb24iCittc2dzdHIgIqSjpb+9VKq6uUK64qahIgorCisjOiBpZl9weXRob24uYzo5ODkgaWZfdGNsLmM6MTQwNworbXNnaWQgImV4cHJlc3Npb25zIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSIKK21zZ3N0ciAipl2ssL1zxLauyahTprOlW6RKuUK64qahKGV4cHJlc3Npb24pqrq1e6ahvVihQanSpUi1TKprqM+lzrlCuuKmoSIKKworIzogaWZfcHl0aG9uLmM6MTAwMgorbXNnaWQgImF0dGVtcHQgdG8gcmVmZXIgdG8gZGVsZXRlZCBidWZmZXIiCittc2dzdHIgIrjVuc+oz6XOpHezUadSsKOquiBidWZmZXIiCisKKyM6IGlmX3B5dGhvbi5jOjEwMTcgaWZfcHl0aG9uLmM6MTA1OCBpZl9weXRob24uYzoxMTIyIGlmX3RjbC5jOjEyMTQKK21zZ2lkICJsaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIqbmuLm2V6VYvWSz8iIKKworIzogaWZfcHl0aG9uLmM6MTI1NworIywgYy1mb3JtYXQKK21zZ2lkICI8YnVmZmVyIG9iamVjdCAoZGVsZXRlZCkgYXQgJThsWD4iCittc2dzdHIgIjxidWZmZXIgqqul8yAopHenUrCjKTogJThsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjEzNDggaWZfdGNsLmM6ODM2Cittc2dpZCAiaW52YWxpZCBtYXJrIG5hbWUiCittc2dzdHIgIrzQsE+mV7rZpKOlv71UIgorCisjOiBpZl9weXRob24uYzoxNjIzCittc2dpZCAibm8gc3VjaCBidWZmZXIiCittc2dzdHIgIrVMprkgYnVmZmVyIgorCisjOiBpZl9weXRob24uYzoxNzExCittc2dpZCAiYXR0ZW1wdCB0byByZWZlciB0byBkZWxldGVkIHdpbmRvdyIKK21zZ3N0ciAiuNW5z6jPpc6kd7NRp1Kwo6q6tfi1oSIKKworIzogaWZfcHl0aG9uLmM6MTc1NgorbXNnaWQgInJlYWRvbmx5IGF0dHJpYnV0ZSIKK21zZ3N0ciAisN/FqsTdqcoiCisKKyM6IGlmX3B5dGhvbi5jOjE3NjkKK21zZ2lkICJjdXJzb3IgcG9zaXRpb24gb3V0c2lkZSBidWZmZXIiCittc2dzdHIgIrTlvNCpd6bspmK9d73EsM+kp6V+IgorCisjOiBpZl9weXRob24uYzoxODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIjx3aW5kb3cgb2JqZWN0IChkZWxldGVkKSBhdCAlLjhsWD4iCittc2dzdHIgIjy1+LWhqqul8yikd6dSsKMpOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyBvYmplY3QgKHVua25vd24pIGF0ICUuOGxYPiIKK21zZ3N0ciAiPLX4taGqq6XzKKW8qr4pOiAlLjhsWD4iCisKKyM6IGlmX3B5dGhvbi5jOjE4NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHdpbmRvdyAlZD4iCittc2dzdHIgIjy1+LWhICVkPiIKKworIzogaWZfcHl0aG9uLmM6MTkzNgorbXNnaWQgIm5vIHN1Y2ggd2luZG93IgorbXNnc3RyICK1TKa5tfi1oSIKKworIzogaWZfcHl0aG9uLmM6MjE5MyBpZl9weXRob24uYzoyMjI4IGlmX3B5dGhvbi5jOjIyNzggaWZfcHl0aG9uLmM6MjM0NgorIzogaWZfcHl0aG9uLmM6MjQ2NiBpZl9weXRob24uYzoyNTE4IGlmX3RjbC5jOjY4NCBpZl90Y2wuYzo3MjkgaWZfdGNsLmM6ODAzCisjOiBpZl90Y2wuYzo4NzMgaWZfdGNsLmM6MTk5OAorbXNnaWQgImNhbm5vdCBzYXZlIHVuZG8gaW5mb3JtYXRpb24iCittc2dzdHIgIrVMqmvAeKZztF+t7LjqsFQiCisKKyM6IGlmX3B5dGhvbi5jOjIxOTUgaWZfcHl0aG9uLmM6MjI4NSBpZl9weXRob24uYzoyMzU3Cittc2dpZCAiY2Fubm90IGRlbGV0ZSBsaW5lIgorbXNnc3RyICKko6/gp1Kwo6a5puYiCisKKyM6IGlmX3B5dGhvbi5jOjIyMzAgaWZfcHl0aG9uLmM6MjM3MyBpZl90Y2wuYzo2OTAgaWZfdGNsLmM6MjAyMAorbXNnaWQgImNhbm5vdCByZXBsYWNlIGxpbmUiCittc2dzdHIgIqSjr+C0wKVOprmm5iIKKworIzogaWZfcHl0aG9uLmM6MjM4OSBpZl9weXRob24uYzoyNDY4IGlmX3B5dGhvbi5jOjI1MjYKK21zZ2lkICJjYW5ub3QgaW5zZXJ0IGxpbmUiCittc2dzdHIgIqSjr+C0wKVOtKGkSqa5puYiCisKKyM6IGlmX3B5dGhvbi5jOjI2MzAKK21zZ2lkICJzdHJpbmcgY2Fubm90IGNvbnRhaW4gbmV3bGluZXMiCittc2dzdHIgIqZypuq1TKprpV2ndLdzpuYiCisKKyM6IGlmX3J1YnkuYzozOTYKK21zZ2lkICIiCisiRTI2NjogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZCwgdGhlIFJ1YnkgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiIKK21zZ3N0ciAiRTI2NjogprmpUqVPtUyqa6jPpc6hQbVMqmu4/KRKIFJ1YnkgtXumoa53KExpYnJhcnkpIgorCisjOiBpZl9ydWJ5LmM6NDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNzM6IHVua25vd24gbG9uZ2ptcCBzdGF0dXMgJWQiCittc2dzdHIgIkUyNzM6IKW8qr6quiBsb25nam1wIHN0YXR1cyAlZCIKKworIzogaWZfc25pZmYuYzo2NworbXNnaWQgIlRvZ2dsZSBpbXBsZW1lbnRhdGlvbi9kZWZpbml0aW9uIgorbXNnc3RyICKkwbSrueqnQC+pd7hxIgorCisjOiBpZl9zbmlmZi5jOjY4Cittc2dpZCAiU2hvdyBiYXNlIGNsYXNzIG9mIgorbXNnc3RyICLF46XcIGJhc2UgY2xhc3Mgb2Y6IgorCisjOiBpZl9zbmlmZi5jOjY5Cittc2dpZCAiU2hvdyBvdmVycmlkZGVuIG1lbWJlciBmdW5jdGlvbiIKK21zZ3N0ciAixeOl3LNRIG92ZXJyaWRlIKq6IG1lbWJlciBmdW5jdGlvbiIKKworIzogaWZfc25pZmYuYzo3MAorbXNnaWQgIlJldHJpZXZlIGZyb20gZmlsZSIKK21zZ3N0ciAixaqo+jogsXHAya7XIgorCisjOiBpZl9zbmlmZi5jOjcxCittc2dpZCAiUmV0cmlldmUgZnJvbSBwcm9qZWN0IgorbXNnc3RyICLFqqj6OiCxcaqrpfMiCisKKyM6IGlmX3NuaWZmLmM6NzMKK21zZ2lkICJSZXRyaWV2ZSBmcm9tIGFsbCBwcm9qZWN0cyIKK21zZ3N0ciAixaqo+jogsXGp0qazIHByb2plY3QiCisKKyM6IGlmX3NuaWZmLmM6NzQKK21zZ2lkICJSZXRyaWV2ZSIKK21zZ3N0ciAixaqo+iIKKworIzogaWZfc25pZmYuYzo3NQorbXNnaWQgIlNob3cgc291cmNlIG9mIgorbXNnc3RyICLF46XcreypbL1YOiAiCisKKyM6IGlmX3NuaWZmLmM6NzYKK21zZ2lkICJGaW5kIHN5bWJvbCIKK21zZ3N0ciAit2q0TSBzeW1ib2wiCisKKyM6IGlmX3NuaWZmLmM6NzcKK21zZ2lkICJCcm93c2UgY2xhc3MiCittc2dzdHIgIsJzxP0gY2xhc3MiCisKKyM6IGlmX3NuaWZmLmM6NzgKK21zZ2lkICJTaG93IGNsYXNzIGluIGhpZXJhcmNoeSIKK21zZ3N0ciAixeOl3LalvGimoaq6IGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjc5Cittc2dpZCAiU2hvdyBjbGFzcyBpbiByZXN0cmljdGVkIGhpZXJhcmNoeSIKK21zZ3N0ciAixeOl3CByZXN0cmljdGVkILalvGimoaq6IGNsYXNzIgorCisjOiBpZl9zbmlmZi5jOjgwCittc2dpZCAiWHJlZiByZWZlcnMgdG8iCittc2dzdHIgIlhyZWYgsNGm0qjsIgorCisjOiBpZl9zbmlmZi5jOjgxCittc2dpZCAiWHJlZiByZWZlcnJlZCBieSIKK21zZ3N0ciAiWHJlZiCzUb3WsNGm0joiCisKKyM6IGlmX3NuaWZmLmM6ODIKK21zZ2lkICJYcmVmIGhhcyBhIgorbXNnc3RyICJYcmVmIKazIgorCisjOiBpZl9zbmlmZi5jOjgzCittc2dpZCAiWHJlZiB1c2VkIGJ5IgorbXNnc3RyICJYcmVmILNRvdaoz6XOOiIKKworIzogaWZfc25pZmYuYzo4NAorbXNnaWQgIlNob3cgZG9jdSBvZiIKK21zZ3N0ciAixeOl3KTlpfM6ICIKKworIzogaWZfc25pZmYuYzo4NQorbXNnaWQgIkdlbmVyYXRlIGRvY3UgZm9yIgorbXNnc3RyICKyo6XNpOWl8zogIgorCisjOiBpZl9zbmlmZi5jOjk3Cittc2dpZCAiIgorIkNhbm5vdCBjb25uZWN0IHRvIFNOaUZGKy4gQ2hlY2sgZW52aXJvbm1lbnQgKHNuaWZmZW1hY3MgbXVzdCBiZSBmb3VuZCBpbiAiCisiJFBBVEgpLlxuIgorbXNnc3RyICK1TKprs3O9dajsIFNOaUZGK6FDvdDAy6xkwPS50sXcvMYgKCRQQVRIILjMpbK73aVppUin5KjsIHNuaWZmZW1hY3MpXG4iCisKKyM6IGlmX3NuaWZmLmM6NDI1Cittc2dpZCAiRTI3NDogU25pZmY6IEVycm9yIGR1cmluZyByZWFkLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIkUyNzQ6IFNuaWZmOiDFqqj6v/m7fi4gqPqu+LNzvXUiCisKKyM6IGlmX3NuaWZmLmM6NTUzCittc2dpZCAiU05pRkYrIGlzIGN1cnJlbnRseSAiCittc2dzdHIgIlNOaUZGKyCl2KtlIgorCisjOiBpZl9zbmlmZi5jOjU1NQorbXNnaWQgIm5vdCAiCittc2dzdHIgIqW8IgorCisjOiBpZl9zbmlmZi5jOjU1NgorbXNnaWQgImNvbm5lY3RlZCIKK21zZ3N0ciAis3O9daSkIgorCisjOiBpZl9zbmlmZi5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjc1OiBVbmtub3duIFNOaUZGKyByZXF1ZXN0OiAlcyIKK21zZ3N0ciAiRTI3NTogpKOlv71UqrogU05pZmYrIKlJpXM6ICVzIgorCisjOiBpZl9zbmlmZi5jOjYwNQorbXNnaWQgIkUyNzY6IEVycm9yIGNvbm5lY3RpbmcgdG8gU05pRkYrIgorbXNnc3RyICJFMjc2OiCzc711qOwgU05pRkYrIKWisdEiCisKKyM6IGlmX3NuaWZmLmM6MTAwOQorbXNnaWQgIkUyNzg6IFNOaUZGKyBub3QgY29ubmVjdGVkIgorbXNnc3RyICJFMjc4OiClvLNzvXWo7CBTTmlGRisiCisKKyM6IGlmX3NuaWZmLmM6MTAxOAorbXNnaWQgIkUyNzk6IE5vdCBhIFNOaUZGKyBidWZmZXIiCittc2dzdHIgIkUyNzk6IKSjrE8gU05pRkYrIKq6vXe9xLDPIgorCisjOiBpZl9zbmlmZi5jOjEwODMKK21zZ2lkICJTbmlmZjogRXJyb3IgZHVyaW5nIHdyaXRlLiBEaXNjb25uZWN0ZWQiCittc2dzdHIgIlNuaWZmOiC8Z6RKv/m7fqFDtbKn9LNzvXUiCisKKyM6IGlmX3RjbC5jOjQxOAorbXNnaWQgImludmFsaWQgYnVmZmVyIG51bWJlciIKK21zZ3N0ciAivXe9xLDPuLm9WL/5u34iCisKKyM6IGlmX3RjbC5jOjQ2NCBpZl90Y2wuYzo5MzEgaWZfdGNsLmM6MTExMAorbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiCittc2dzdHIgIql8pby56qdAIgorCisjOiBpZl90Y2wuYzo1MDEKK21zZ2lkICJ1bmtub3duIG9wdGlvbiIKK21zZ3N0ciAipKOlv71Uqrq/77a1IgorCisjLiA/Pz8KKyM6IGlmX3RjbC5jOjc3NAorbXNnaWQgImNhbm5vdCBzZXQgbGluZShzKSIKK21zZ3N0ciAipKOv4LNdqXem5iIKKworIzogaWZfdGNsLmM6ODQ1Cittc2dpZCAibWFyayBub3Qgc2V0IgorbXNnc3RyICKoU6azs12pd7zQsE8iCisKKyM6IGlmX3RjbC5jOjg1MSBpZl90Y2wuYzoxMDY2CisjLCBjLWZvcm1hdAorbXNnaWQgInJvdyAlZCBjb2x1bW4gJWQiCittc2dzdHIgIqZDICVkIKbmICVkIgorCisjOiBpZl90Y2wuYzo4ODEKK21zZ2lkICJjYW5ub3QgaW5zZXJ0L2FwcGVuZCBsaW5lIgorbXNnc3RyICKko6/gtKGkSqnOqv6lW6a5puYiCisKKyM6IGlmX3RjbC5jOjEyNjgKK21zZ2lkICJ1bmtub3duIGZsYWc6ICIKK21zZ3N0ciAiv/m7fqq6uli80DogIgorCisjOiBpZl90Y2wuYzoxMzM4Cittc2dpZCAidW5rbm93biB2aW1PcHRpb24iCittc2dzdHIgIqSjpb+9VKq6IFZJTSC/77a1IgorCisjOiBpZl90Y2wuYzoxNDIzCittc2dpZCAia2V5Ym9hcmQgaW50ZXJydXB0IgorbXNnc3RyICLB5L1MpKTCXyIKKworIzogaWZfdGNsLmM6MTQyOAorbXNnaWQgInZpbSBlcnJvciIKK21zZ3N0ciAidmltIL/5u34iCisKKyM6IGlmX3RjbC5jOjE0NzEKK21zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1ZmZlci93aW5kb3cgY29tbWFuZDogb2JqZWN0IGlzIGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIrVMqmur2KXfvXe9xLDPL7X4taGpUqVPOiCqq6XzsU63fLNRp1KwoyIKKworIzogaWZfdGNsLmM6MTU0NQorbXNnaWQgIiIKKyJjYW5ub3QgcmVnaXN0ZXIgY2FsbGJhY2sgY29tbWFuZDogYnVmZmVyL3dpbmRvdyBpcyBhbHJlYWR5IGJlaW5nIGRlbGV0ZWQiCittc2dzdHIgIrVMqmu1+aVVIGNhbGxiYWNrIKlSpU86IL13vcSwzy+1+LWhpHe4Z7NRp1Kwo6RGIgorCisjLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBGYW1vdXMgbGFzdCB3b3JkPworIzogaWZfdGNsLmM6MTU2MgorbXNnaWQgIiIKKyJFMjgwOiBUQ0wgRkFUQUwgRVJST1I6IHJlZmxpc3QgY29ycnVwdCE/IFBsZWFzZSByZXBvcnQgdGhpcyB0byB2aW0tZGV2QHZpbS4iCisib3JnIgorbXNnc3RyICJFMjgwOiBUQ0wgxFmtq7/5u346IHJlZmxpc3QgxOqxvKRGIT8gvdCz+KdptbkgdG8gdmltLWRldkB2aW0ub3JnIgorCisjOiBpZl90Y2wuYzoxNTYzCittc2dpZCAiY2Fubm90IHJlZ2lzdGVyIGNhbGxiYWNrIGNvbW1hbmQ6IGJ1ZmZlci93aW5kb3cgcmVmZXJlbmNlIG5vdCBmb3VuZCIKK21zZ3N0ciAitUyqa7X5pVUgY2FsbGJhY2sgqVKlTzogp+Sko6jsvXe9xLDPL7X4taEiCisKKyM6IGlmX3RjbC5jOjE3MjQKK21zZ2lkICIiCisiRTU3MTogU29ycnksIHRoaXMgY29tbWFuZCBpcyBkaXNhYmxlZDogdGhlIFRjbCBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQuIgorbXNnc3RyICIiCisiRTU3MTogprmpUqVPtUyqa6jPpc4sIKZdrLC1TKpruPykSiBUY2wgtXumoa53KExpYnJhcnkpIgorCisjOiBpZl90Y2wuYzoxODg2Cittc2dpZCAiIgorIkUyODE6IFRDTCBFUlJPUjogZXhpdCBjb2RlIGlzIG5vdCBpbnQhPyBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdmltLWRldkB2aW0ub3JnIgorbXNnc3RyICJFMjgxOiBUQ0wgv/m7fjogtbKn9L1YpKOsT77jvMYhPyC90LP4p2m1uSB0byB2aW0tZGV2QHZpbS5vcmciCisKKyM6IGlmX3RjbC5jOjIwMDYKK21zZ2lkICJjYW5ub3QgZ2V0IGxpbmUiCittc2dzdHIgIqSjr+Co+rFvprmm5iIKKworIzogaWZfeGNtZHNydi5jOjIxNQorbXNnaWQgIlVuYWJsZSB0byByZWdpc3RlciBhIGNvbW1hbmQgc2VydmVyIG5hbWUiCittc2dzdHIgIrVMqmu1+aVVqVKlT6b4qkG+uaZXutkiCisKKyM6IGlmX3hjbWRzcnYuYzo0NjUKK21zZ2lkICJFMjQ4OiBGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBwcm9ncmFtIgorbXNnc3RyICJFMjQ4OiC1TKprsGWlWKlSpU+o7KXYqrqmYbV7pqEiCisKKyM6IGlmX3hjbWRzcnYuYzo3MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3MzogSW52YWxpZCBzZXJ2ZXIgaWQgdXNlZDogJXMiCittc2dzdHIgIkU1NzM6IKSjpb+9VKq6pviqQb65IGlkIDogJXMiCisKKyM6IGlmX3hjbWRzcnYuYzoxMDk4Cittc2dpZCAiRTI1MTogVklNIGluc3RhbmNlIHJlZ2lzdHJ5IHByb3BlcnR5IGlzIGJhZGx5IGZvcm1lZC4gIERlbGV0ZWQhIgorbXNnc3RyICJFMjUxOiBWSU0gqrogcmVnaXN0cnkgs12pd7a1prO7fqFDpHenUrCjoUMiCisKKyM6IG1haW4uYzo2MAorbXNnaWQgIlVua25vd24gb3B0aW9uIgorbXNnc3RyICKko6W/vVSqur/vtrUiCisKKyM6IG1haW4uYzo2MgorbXNnaWQgIlRvbyBtYW55IGVkaXQgYXJndW1lbnRzIgorbXNnc3RyICKk06ZovXO/6LDRvMYiCisKKyM6IG1haW4uYzo2NAorbXNnaWQgIkFyZ3VtZW50IG1pc3NpbmcgYWZ0ZXIiCittc2dzdHIgIq/KpNalsq1uqrqw0bzGOiIKKworIzogbWFpbi5jOjY2Cittc2dpZCAiR2FyYmFnZSBhZnRlciBvcHRpb24iCittc2dzdHIgIrVMqmu/67t7prm/77a1q+GquqlSpU86ICIKKworIzogbWFpbi5jOjY4Cittc2dpZCAiVG9vIG1hbnkgXCIrY29tbWFuZFwiIG9yIFwiLWMgY29tbWFuZFwiIGFyZ3VtZW50cyIKK21zZ3N0ciAipNOmaCBcIitjb21tYW5kXCIgqc4gXCItYyBjb21tYW5kXCIgsNG8xiIKKworIzogbWFpbi5jOjcwCittc2dpZCAiSW52YWxpZCBhcmd1bWVudCBmb3IiCittc2dzdHIgIqSjpb+9VKq6sNG8xjogIgorCisjOiBtYWluLmM6NDY5Cittc2dpZCAiVGhpcyBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSBkaWZmIGZlYXR1cmUuIgorbXNnc3RyICKxeqq6IFZpbSC9c8S2rsmoU6azpVukSiBkaWZmIKq6r+CkTyIKKworIzogbWFpbi5jOjkxNworbXNnaWQgIkF0dGVtcHQgdG8gb3BlbiBzY3JpcHQgZmlsZSBhZ2FpbjogXCIiCittc2dzdHIgIrjVuc+mQaa4tn2x0iBzY3JpcHQgwMk6IFwiIgorCisjOiBtYWluLmM6OTIxIG1haW4uYzo5MjggbWFpbi5jOjk3MiBtZW1saW5lLmM6MzY4MiBtZW1saW5lLmM6MzY4NgorIzogdmVyc2lvbi5jOjg1NyB2ZXJzaW9uLmM6ODYyIHZlcnNpb24uYzo4NjcgdmVyc2lvbi5jOjg3MiB2ZXJzaW9uLmM6ODc3CisjOiB2ZXJzaW9uLmM6ODgyIHZlcnNpb24uYzo4ODggdmVyc2lvbi5jOjg5MiB2ZXJzaW9uLmM6ODk2IHZlcnNpb24uYzo5MDEKKyM6IHZlcnNpb24uYzo5MDggdmVyc2lvbi5jOjkxNiB2ZXJzaW9uLmM6OTIyCittc2dpZCAiXCJcbiIKK21zZ3N0ciAiXCJcbiIKKworIzogbWFpbi5jOjkyNgorbXNnaWQgIkNhbm5vdCBvcGVuIGZvciByZWFkaW5nOiBcIiIKK21zZ3N0ciAitUyqa7Z9sdKlSMWqqPo6IFwiIgorCisjOiBtYWluLmM6OTcwCittc2dpZCAiQ2Fubm90IG9wZW4gZm9yIHNjcmlwdCBvdXRwdXQ6IFwiIgorbXNnc3RyICK1TKprtn2x0qywIHNjcmlwdCC/6aVYOiBcIiIKKworIzogbWFpbi5jOjExMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZmlsZXMgdG8gZWRpdFxuIgorbXNnc3RyICLB2aazICVkIK3TwMmu17Wlq929c7/oXG4iCisKKyM6IG1haW4uYzoxMTc4Cittc2dpZCAiVmltOiBXYXJuaW5nOiBPdXRwdXQgaXMgbm90IHRvIGEgdGVybWluYWxcbiIKK21zZ3N0ciAiVmltOiCqYLdOOiC/6aVYpKOsT7LXut2+9yi/w7n1KVxuIgorCisjOiBtYWluLmM6MTE4MAorbXNnaWQgIlZpbTogV2FybmluZzogSW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbFxuIgorbXNnc3RyICJWaW06IKpgt046IL/ppEqko6xPste63b73KMHkvUwpXG4iCisKKyMuIGp1c3QgaW4gY2FzZS4uCisjOiBtYWluLmM6MTI1NworbXNnaWQgInByZS12aW1yYyBjb21tYW5kIGxpbmUiCittc2dzdHIgInZpbXJjIKtlqVKlT6ZDIgorCisjOiBtYWluLmM6MTI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgyOiBDYW5ub3QgcmVhZCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiRTI4MjogtUyqa8WqqPrAya7XIFwiJXNcIiIKKworIzogbWFpbi5jOjIzMTMKK21zZ2lkICIiCisiXG4iCisiTW9yZSBpbmZvIHdpdGg6IFwidmltIC1oXCJcbiIKK21zZ3N0ciAiIgorIlxuIgorIqxkuN+n86ZouOqwVL3QsPWm5jogXCJ2aW0gLWhcIlxuIgorCisjOiBtYWluLmM6MjM0NgorbXNnaWQgIltmaWxlIC4uXSAgICAgICBlZGl0IHNwZWNpZmllZCBmaWxlKHMpIgorbXNnc3RyICJbwMmu1yAuLl0gICAgICAgvXO/6Kv8qXequsDJrtciCisKKyM6IG1haW4uYzoyMzQ3Cittc2dpZCAiLSAgICAgICAgICAgICAgIHJlYWQgdGV4dCBmcm9tIHN0ZGluIgorbXNnc3RyICItICAgICAgICAgICAgICAgsXG80LfHv+mkSihzdGRpbinFqqj6wMmu1yIKKworIzogbWFpbi5jOjIzNDgKK21zZ2lkICItdCB0YWcgICAgICAgICAgZWRpdCBmaWxlIHdoZXJlIHRhZyBpcyBkZWZpbmVkIgorbXNnc3RyICItdCB0YWcgICAgICAgICAgvXO/6K7JqM+lzqv8qXequiB0YWciCisKKyM6IG1haW4uYzoyMzUwCittc2dpZCAiLXEgW2Vycm9yZmlsZV0gIGVkaXQgZmlsZSB3aXRoIGZpcnN0IGVycm9yIgorbXNnc3RyICItcSBbZXJyb3JmaWxlXSAgvXO/6K7JuPykSrLEpECt07/5u34iCisKKyM6IG1haW4uYzoyMzU5Cittc2dpZCAiIgorIlxuIgorIlxuIgorInVzYWdlOiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIiClzqprOiIKKworIzogbWFpbi5jOjIzNjIKK21zZ2lkICIgdmltIFthcmd1bWVudHNdICIKK21zZ3N0ciAidmltIFuw0bzGXSAiCisKKyM6IG1haW4uYzoyMzY2Cittc2dpZCAiIgorIlxuIgorIiAgIG9yOiIKK21zZ3N0ciAiIgorIlxuIgorIiAgIKnOOiIKKworIzogbWFpbi5jOjIzNjkKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQXJndW1lbnRzOlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisisNG8xjpcbiIKKworIzogbWFpbi5jOjIzNzAKK21zZ2lkICItLVx0XHRcdE9ubHkgZmlsZSBuYW1lcyBhZnRlciB0aGlzIgorbXNnc3RyICItLVx0XHRcdKV1prOmYrNvpKer4aq6wMmu1yIKKworIzogbWFpbi5jOjIzNzIKK21zZ2lkICItLWxpdGVyYWxcdFx0RG9uJ3QgZXhwYW5kIHdpbGRjYXJkcyIKK21zZ3N0ciAiLS1saXRlcmFsXHRcdKSjrmm2fbhVpc6mcqS4IgorCisjOiBtYWluLmM6MjM3NQorbXNnaWQgIi1yZWdpc3Rlclx0XHRSZWdpc3RlciB0aGlzIGd2aW0gZm9yIE9MRSIKK21zZ3N0ciAiLXJlZ2lzdGVyXHRcdLX5pVUgZ3ZpbSCo7CBPTEUiCisKKyM6IG1haW4uYzoyMzc2Cittc2dpZCAiLXVucmVnaXN0ZXJcdFx0VW5yZWdpc3RlciBndmltIGZvciBPTEUiCittc2dzdHIgIi11bnJlZ2lzdGVyXHRcdKj6rvggT0xFIKSkqrogZ3ZpbSC1+aVVIgorCisjOiBtYWluLmM6MjM3OQorbXNnaWQgIi1nXHRcdFx0UnVuIHVzaW5nIEdVSSAobGlrZSBcImd2aW1cIikiCittc2dzdHIgIi1nXHRcdFx0qM+lzrnPp86sya2xICimUCBcImd2aW1cIikiCisKKyM6IG1haW4uYzoyMzgwCittc2dpZCAiLWYgIG9yICAtLW5vZm9ya1x0Rm9yZWdyb3VuZDogRG9uJ3QgZm9yayB3aGVuIHN0YXJ0aW5nIEdVSSIKK21zZ3N0ciAiLWYgIKnOICAtLW5vZm9ya1x0q2W0ujogsF+pbLnPp86sya2xrsmkoyBmb3JrIgorCisjOiBtYWluLmM6MjM4MgorbXNnaWQgIi12XHRcdFx0VmkgbW9kZSAobGlrZSBcInZpXCIpIgorbXNnc3RyICItdlx0XHRcdFZpILzSpqEgKKZQIFwidmlcIikiCisKKyM6IG1haW4uYzoyMzgzCittc2dpZCAiLWVcdFx0XHRFeCBtb2RlIChsaWtlIFwiZXhcIikiCittc2dzdHIgIi1lXHRcdFx0RXggvNKmoSAoplAgXCJleFwiKSIKKworIzogbWFpbi5jOjIzODQKK21zZ2lkICItc1x0XHRcdFNpbGVudCAoYmF0Y2gpIG1vZGUgKG9ubHkgZm9yIFwiZXhcIikiCittc2dzdHIgIi1zXHRcdFx0pnfAUiAoYmF0Y2gpILzSpqEgKKV1r+C7UCBcImV4XCIgpECwX6jPpc4pIgorCisjOiBtYWluLmM6MjM4NgorbXNnaWQgIi1kXHRcdFx0RGlmZiBtb2RlIChsaWtlIFwidmltZGlmZlwiKSIKK21zZ3N0ciAiLWRcdFx0XHREaWZmILzSpqEgKKZQIFwidmltZGlmZlwiLCClaaizs3Sk8bj7qOLAya7XpKOmULNCKSIKKworIzogbWFpbi5jOjIzODgKK21zZ2lkICIteVx0XHRcdEVhc3kgbW9kZSAobGlrZSBcImV2aW1cIiwgbW9kZWxlc3MpIgorbXNnc3RyICIteVx0XHRcdMKyqfa80qahICimUCBcImV2aW1cIiwgbW9kZWxlc3MpIgorCisjOiBtYWluLmM6MjM4OQorbXNnaWQgIi1SXHRcdFx0UmVhZG9ubHkgbW9kZSAobGlrZSBcInZpZXdcIikiCittc2dzdHIgIi1SXHRcdFx0sN/FqrzSpqEgKKZQIFwidmlld1wiKSIKKworIzogbWFpbi5jOjIzOTAKK21zZ2lkICItWlx0XHRcdFJlc3RyaWN0ZWQgbW9kZSAobGlrZSBcInJ2aW1cIikiCittc2dzdHIgIi1aXHRcdFx0ra2o7rzSpqEgKKZQIFwicnZpbVwiKSIKKworIzogbWFpbi5jOjIzOTEKK21zZ2lkICItbVx0XHRcdE1vZGlmaWNhdGlvbnMgKHdyaXRpbmcgZmlsZXMpIG5vdCBhbGxvd2VkIgorbXNnc3RyICItbVx0XHRcdKSjpWmt16fvICi8Z6RKwMmu1ykiCisKKyM6IG1haW4uYzoyMzkyCittc2dpZCAiLU1cdFx0XHRNb2RpZmljYXRpb25zIGluIHRleHQgbm90IGFsbG93ZWQiCittc2dzdHIgIi1NXHRcdFx0pKOlaa3Xp++k5aZyIgorCisjOiBtYWluLmM6MjM5MworbXNnaWQgIi1iXHRcdFx0QmluYXJ5IG1vZGUiCittc2dzdHIgIi1iXHRcdFx0pEe2aabsvNKmoSIKKworIzogbWFpbi5jOjIzOTUKK21zZ2lkICItbFx0XHRcdExpc3AgbW9kZSIKK21zZ3N0ciAiLWxcdFx0XHRMaXNwILzSpqEiCisKKyM6IG1haW4uYzoyMzk3Cittc2dpZCAiLUNcdFx0XHRDb21wYXRpYmxlIHdpdGggVmk6ICdjb21wYXRpYmxlJyIKK21zZ3N0ciAiLUNcdFx0XHQnY29tcGF0aWJsZScgtseyziBWaSCs265lvNKmoSIKKworIzogbWFpbi5jOjIzOTgKK21zZ2lkICItTlx0XHRcdE5vdCBmdWxseSBWaSBjb21wYXRpYmxlOiAnbm9jb21wYXRpYmxlJyIKK21zZ3N0ciAiLU5cdFx0XHQnbm9jb21wYXRpYmxlJyCko6e5pf67ULbHss4gVmkgrNuuZaFBpWmoz6XOIFZpbSClW7Fqr+CkTyIKKworIzogbWFpbi5jOjIzOTkKK21zZ2lkICItVltOXVx0XHRWZXJib3NlIGxldmVsIgorbXNnc3RyICItVltOXVx0XHRWZXJib3NlILWlr8UiCisKKyM6IG1haW4uYzoyNDAwCittc2dpZCAiLURcdFx0XHREZWJ1Z2dpbmcgbW9kZSIKK21zZ3N0ciAiLURcdFx0XHSwo7/5vNKmoSIKKworIzogbWFpbi5jOjI0MDEKK21zZ2lkICItblx0XHRcdE5vIHN3YXAgZmlsZSwgdXNlIG1lbW9yeSBvbmx5IgorbXNnc3RyICItblx0XHRcdKSjqM+lzrzIpnPAySwgpXWoz6XOsE++0MXpIgorCisjOiBtYWluLmM6MjQwMgorbXNnaWQgIi1yXHRcdFx0TGlzdCBzd2FwIGZpbGVzIGFuZCBleGl0IgorbXNnc3RyICItclx0XHRcdKZDpVi8yKZzwMmr4cL3tn0iCisKKyM6IG1haW4uYzoyNDAzCittc2dpZCAiLXIgKHdpdGggZmlsZSBuYW1lKVx0UmVjb3ZlciBjcmFzaGVkIHNlc3Npb24iCittc2dzdHIgIi1yICilW8DJplcpICAgICAgIFx0rde0X6RXpri3bLe0qrq46q7GKFJlY292ZXIgY3Jhc2hlZCBzZXNzaW9uKSIKKworIzogbWFpbi5jOjI0MDQKK21zZ2lkICItTFx0XHRcdFNhbWUgYXMgLXIiCittc2dzdHIgIi1MXHRcdFx0plAgLXIiCisKKyM6IG1haW4uYzoyNDA2Cittc2dpZCAiLWZcdFx0XHREb24ndCB1c2UgbmV3Y2xpIHRvIG9wZW4gd2luZG93IgorbXNnc3RyICItZlx0XHRcdKSjqM+lziBuZXdjbGkgqNO2fbHStfi1oSIKKworIzogbWFpbi5jOjI0MDcKK21zZ2lkICItZGV2IDxkZXZpY2U+XHRcdFVzZSA8ZGV2aWNlPiBmb3IgSS9PIgorbXNnc3RyICItZGV2IDxkZXZpY2U+XHRcdKjPpc4gPGRldmljZT4gsLW/6aVYpEoiCisKKyM6IG1haW4uYzoyNDEwCittc2dpZCAiLUhcdFx0XHRTdGFydCBpbiBIZWJyZXcgbW9kZSIKK21zZ3N0ciAiLUhcdFx0XHSx0rDKrLAgSGVicmV3ILzSpqEiCisKKyM6IG1haW4uYzoyNDEzCittc2dpZCAiLUZcdFx0XHRTdGFydCBpbiBGYXJzaSBtb2RlIgorbXNnc3RyICItRlx0XHRcdLHSsMqssCBGYXJzaSC80qahIgorCisjOiBtYWluLmM6MjQxNQorbXNnaWQgIi1UIDx0ZXJtaW5hbD5cdFNldCB0ZXJtaW5hbCB0eXBlIHRvIDx0ZXJtaW5hbD4iCittc2dzdHIgIi1UIDx0ZXJtaW5hbD5cdLNdqXey17rdvvessCA8dGVybWluYWw+IgorCisjOiBtYWluLmM6MjQxNgorbXNnaWQgIi11IDx2aW1yYz5cdFx0VXNlIDx2aW1yYz4gaW5zdGVhZCBvZiBhbnkgLnZpbXJjIgorbXNnc3RyICItdSA8dmltcmM+XHRcdKjPpc4gPHZpbXJjPiCo+qVOpfSm8yAudmltcmMiCisKKyM6IG1haW4uYzoyNDE4Cittc2dpZCAiLVUgPGd2aW1yYz5cdFx0VXNlIDxndmltcmM+IGluc3RlYWQgb2YgYW55IC5ndmltcmMiCittc2dzdHIgIi1VIDxndmltcmM+XHRcdKjPpc4gPGd2aW1yYz4gqPqlTqX0pvMgLmd2aW1yYyIKKworIzogbWFpbi5jOjI0MjAKK21zZ2lkICItLW5vcGx1Z2luXHRcdERvbid0IGxvYWQgcGx1Z2luIHNjcmlwdHMiCittc2dzdHIgIi0tbm9wbHVnaW5cdFx0pKO4/KRKpfSm8yBwbHVnaW4iCisKKyM6IG1haW4uYzoyNDIxCittc2dpZCAiLW9bTl1cdFx0T3BlbiBOIHdpbmRvd3MgKGRlZmF1bHQ6IG9uZSBmb3IgZWFjaCBmaWxlKSIKK21zZ3N0ciAiLW9bTl1cdFx0tn2x0iBOIK3Ttfi1oSAouXezXaxPqEOt08DJrtekQK3TKSIKKworIzogbWFpbi5jOjI0MjIKK21zZ2lkICItT1tOXVx0XHRMaWtlIC1vIGJ1dCBzcGxpdCB2ZXJ0aWNhbGx5IgorbXNnc3RyICItT1tOXVx0XHSmUCAtbyCm/ajPpc6rq6q9pMCzziIKKworIzogbWFpbi5jOjI0MjMKK21zZ2lkICIrXHRcdFx0U3RhcnQgYXQgZW5kIG9mIGZpbGUiCittc2dzdHIgIitcdFx0XHSx0rDKq+G49ajswMmu17Wyp8AiCisKKyM6IG1haW4uYzoyNDI0Cittc2dpZCAiKzxsbnVtPlx0XHRTdGFydCBhdCBsaW5lIDxsbnVtPiIKK21zZ3N0ciAiKzxsbnVtPlx0XHSx0rDKq+G49ajsssQgPGxudW0+IKbmIgorCisjOiBtYWluLmM6MjQyNgorbXNnaWQgIi0tY21kIDxjb21tYW5kPlx0RXhlY3V0ZSA8Y29tbWFuZD4gYmVmb3JlIGxvYWRpbmcgYW55IHZpbXJjIGZpbGUiCittc2dzdHIgIi0tY21kIDxjb21tYW5kPlx0uPykSqX0pvMgdmltcmMgq2Ww9abmIDxjb21tYW5kPiIKKworIzogbWFpbi5jOjI0MjgKK21zZ2lkICItYyA8Y29tbWFuZD5cdFx0RXhlY3V0ZSA8Y29tbWFuZD4gYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgZmlsZSIKK21zZ3N0ciAiLWMgPGNvbW1hbmQ+XHRcdLj8pEqyxKRArdPAya7Xq+Gw9abmIDxjb21tYW5kPiIKKworIzogbWFpbi5jOjI0MjkKK21zZ2lkICItUyA8c2Vzc2lvbj5cdFx0U291cmNlIGZpbGUgPHNlc3Npb24+IGFmdGVyIGxvYWRpbmcgdGhlIGZpcnN0IGZpbGUiCittc2dzdHIgIi1TIDxzZXNzaW9uPlx0XHS4/KRKssSkQK3TwMmu16vhuPykSiBTZXNzaW9uIMDJIDxzZXNzaW9uPiIKKworIzogbWFpbi5jOjI0MzAKK21zZ2lkICItcyA8c2NyaXB0aW4+XHRSZWFkIE5vcm1hbCBtb2RlIGNvbW1hbmRzIGZyb20gZmlsZSA8c2NyaXB0aW4+IgorbXNnc3RyICItcyA8c2NyaXB0aW4+XHSxcSA8c2NyaXB0aW4+IMWqpEqkQK/rvNKmoalSpU8iCisKKyM6IG1haW4uYzoyNDMxCittc2dpZCAiLXcgPHNjcmlwdG91dD5cdEFwcGVuZCBhbGwgdHlwZWQgY29tbWFuZHMgdG8gZmlsZSA8c2NyaXB0b3V0PiIKK21zZ3N0ciAiLXcgPHNjcmlwdG91dD5cdLnvwMmu1yA8c2NyaXB0b3V0PiCq/qVbKGFwcGVuZCmp0qazv+mkSqq6qVKlTyIKKworIzogbWFpbi5jOjI0MzIKK21zZ2lkICItVyA8c2NyaXB0b3V0Plx0V3JpdGUgYWxsIHR5cGVkIGNvbW1hbmRzIHRvIGZpbGUgPHNjcmlwdG91dD4iCittc2dzdHIgIi1XIDxzY3JpcHRvdXQ+XHS578DJrtcgPHNjcmlwdG91dD4gvGekSqnSprO/6aRKqrqpUqVPIgorCisjOiBtYWluLmM6MjQzNAorbXNnaWQgIi14XHRcdFx0RWRpdCBlbmNyeXB0ZWQgZmlsZXMiCittc2dzdHIgIi14XHRcdFx0vXO/6L1zvVi5TKq6wMmu1yIKKworIzogbWFpbi5jOjI0MzgKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdENvbm5lY3QgdmltIHRvIHRoaXMgcGFydGljdWxhciBYLXNlcnZlciIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHSxTiB2aW0gu1Cr/Kl3qrogWC1zZXJ2ZXIgs3O9dSIKKworIzogbWFpbi5jOjI0NDAKK21zZ2lkICItWFx0XHRcdERvIG5vdCBjb25uZWN0IHRvIFggc2VydmVyIgorbXNnc3RyICItWFx0XHRcdKSjrW6zc711qOwgWCBTZXJ2ZXIiCisKKyM6IG1haW4uYzoyNDQzCittc2dpZCAiLS1yZW1vdGUgPGZpbGVzPlx0RWRpdCA8ZmlsZXM+IGluIGEgVmltIHNlcnZlciBpZiBwb3NzaWJsZSIKK21zZ3N0ciAiLS1yZW1vdGUgPGZpbGVzPlx0vXO/6CBWaW0gpviqQb65pFequiA8ZmlsZXM+IKvhwve2fSIKKworIzogbWFpbi5jOjI0NDQKK21zZ2lkICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgU2FtZSwgZG9uJ3QgY29tcGxhaW4gaWYgdGhlcmUgaXMgbm8gc2VydmVyIgorbXNnc3RyICItLXJlbW90ZS1zaWxlbnQgPGZpbGVzPiAgrNumUKFBpv2oU6azpviqQb65rsmko8S1p2kiCisKKyM6IG1haW4uYzoyNDQ1Cittc2dpZCAiIgorIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgQXMgLS1yZW1vdGUgYnV0IHdhaXQgZm9yIGZpbGVzIHRvIGhhdmUgYmVlbiBlZGl0ZWQiCittc2dzdHIgIi0tcmVtb3RlLXdhaXQgPGZpbGVzPiAgplAgLS1yZW1vdGUsIKb9t3y1pa3UwMmu16e5pqi9c7/oIgorCisjOiBtYWluLmM6MjQ0NgorbXNnaWQgIiIKKyItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICBTYW1lLCBkb24ndCBjb21wbGFpbiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIiCittc2dzdHIgIiIKKyItLXJlbW90ZS13YWl0LXNpbGVudCA8ZmlsZXM+ICCs26ZQoUGm/ahTpviqQb65rsmko8S1p2kiCisKKyM6IG1haW4uYzoyNDQ3Cittc2dpZCAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdFNlbmQgPGtleXM+IHRvIGEgVmltIHNlcnZlciBhbmQgZXhpdCIKK21zZ3N0ciAiLS1yZW1vdGUtc2VuZCA8a2V5cz5cdLBlpVggPGtleXM+IKjsIFZpbSCm+KpBvrmow8L3tn0iCisKKyM6IG1haW4uYzoyNDQ4Cittc2dpZCAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdEV2YWx1YXRlIDxleHByPiBpbiBhIFZpbSBzZXJ2ZXIgYW5kIHByaW50IHJlc3VsdCIKK21zZ3N0ciAiLS1yZW1vdGUtZXhwciA8ZXhwcj5cdKZipviqQb65pFew9abmIDxleHByPiCow6ZMpVi1sqpHIgorCisjOiBtYWluLmM6MjQ0OQorbXNnaWQgIi0tc2VydmVybGlzdFx0XHRMaXN0IGF2YWlsYWJsZSBWaW0gc2VydmVyIG5hbWVzIGFuZCBleGl0IgorbXNnc3RyICItLXNlcnZlcmxpc3RcdFx0pkOlWKVppc6quiBWaW0gpviqQb65ple62ajDwve2fSIKKworIzogbWFpbi5jOjI0NTAKK21zZ2lkICItLXNlcnZlcm5hbWUgPG5hbWU+XHRTZW5kIHRvL2JlY29tZSB0aGUgVmltIHNlcnZlciA8bmFtZT4iCittc2dzdHIgIi0tc2VydmVybmFtZSA8bmFtZT5cdLBlptwvpqissCBWaW0gpviqQb65IDxuYW1lPiIKKworIzogbWFpbi5jOjI0NTMKK21zZ2lkICItaSA8dmltaW5mbz5cdFx0VXNlIDx2aW1pbmZvPiBpbnN0ZWFkIG9mIC52aW1pbmZvIgorbXNnc3RyICItaSA8dmltaW5mbz5cdFx0qM+lziA8dmltaW5mbz4gptOrRCAudmltaW5mbyIKKworIzogbWFpbi5jOjI0NTUKK21zZ2lkICItaCAgb3IgIC0taGVscFx0UHJpbnQgSGVscCAodGhpcyBtZXNzYWdlKSBhbmQgZXhpdCIKK21zZ3N0ciAiLWggIKnOICAtLWhlbHBcdKZMpVi7oan6KKRdtE6sT6W7sFSupymr4cL3tn0iCisKKyM6IG1haW4uYzoyNDU2Cittc2dpZCAiLS12ZXJzaW9uXHRcdFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiCittc2dzdHIgIi0tdmVyc2lvblx0XHSmTKVYqqmlu7jqsFSr4cL3tn0iCisKKyM6IG1haW4uYzoyNDYwCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKE1vdGlmIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSC7e7Fvqrqw0bzGIChNb3RpZiCqqSk6XG4iCisKKyM6IG1haW4uYzoyNDYzCittc2dpZCAiIgorIlxuIgorIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGd2aW0gKEF0aGVuYSB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0gu3uxb6q6sNG8xiAoQXRoZW5hIKqpKTpcbiIKKworIzogbWFpbi5jOjI0NjYKK21zZ2lkICItZGlzcGxheSA8ZGlzcGxheT5cdFJ1biB2aW0gb24gPGRpc3BsYXk+IgorbXNnc3RyICItZGlzcGxheSA8ZGlzcGxheT5cdKZitfi1oSA8ZGlzcGxheT4gsPWm5iB2aW0iCisKKyM6IG1haW4uYzoyNDY3Cittc2dpZCAiLWljb25pY1x0XHRTdGFydCB2aW0gaWNvbmlmaWVkIgorbXNnc3RyICItaWNvbmljXHRcdLHSsMqr4bnPpdykxihpY29uaWZpZWQpIgorCisjOiBtYWluLmM6MjQ2OQorbXNnaWQgIi1uYW1lIDxuYW1lPlx0XHRVc2UgcmVzb3VyY2UgYXMgaWYgdmltIHdhcyA8bmFtZT4iCittc2dzdHIgIi1uYW1lIDxuYW1lPlx0XHTFqqj6IFJlc291cmNlIK7Jp+IgdmltIKq6ple62bX4rLAgPG5hbWU+IgorCisjOiBtYWluLmM6MjQ3MAorbXNnaWQgIlx0XHRcdCAgKFVuaW1wbGVtZW50ZWQpXG4iCittc2dzdHIgIlx0XHRcdCAgKKl8pby56qdAKVxuIgorCisjOiBtYWluLmM6MjQ3MgorbXNnaWQgIi1iYWNrZ3JvdW5kIDxjb2xvcj5cdFVzZSA8Y29sb3I+IGZvciB0aGUgYmFja2dyb3VuZCAoYWxzbzogLWJnKSIKK21zZ3N0ciAiLWJhY2tncm91bmQgPGNvbG9yPlx0s12pdyA8Y29sb3I+IKywrUm0uqbiICikXaVppc4gLWJnKSIKKworIzogbWFpbi5jOjI0NzMKK21zZ2lkICItZm9yZWdyb3VuZCA8Y29sb3I+XHRVc2UgPGNvbG9yPiBmb3Igbm9ybWFsIHRleHQgKGFsc286IC1mZykiCittc2dzdHIgIi1mb3JlZ3JvdW5kIDxjb2xvcj5cdLNdqXcgPGNvbG9yPiCssKRAr+uk5aZyw0Om4iAopF2laaXOIC1mZykiCisKKyM6IG1haW4uYzoyNDc0IG1haW4uYzoyNDk0Cittc2dpZCAiLWZvbnQgPGZvbnQ+XHRcdFVzZSA8Zm9udD4gZm9yIG5vcm1hbCB0ZXh0IChhbHNvOiAtZm4pIgorbXNnc3RyICItZm9udCA8Zm9udD5cdKjPpc4gPGZvbnQ+IKywpECv66Zyq6wgKKRdpWmlziAtZm4pIgorCisjOiBtYWluLmM6MjQ3NQorbXNnaWQgIi1ib2xkZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGJvbGQgdGV4dCIKK21zZ3N0ciAiLWJvbGRmb250IDxmb250Plx0qM+lziA8Zm9udD4grLCyysXppnKrrCIKKworIzogbWFpbi5jOjI0NzYKK21zZ2lkICItaXRhbGljZm9udCA8Zm9udD5cdFVzZSA8Zm9udD4gZm9yIGl0YWxpYyB0ZXh0IgorbXNnc3RyICItaXRhbGljZm9udCA8Zm9udD5cdKjPpc4gPGZvbnQ+IKywsdfF6aZyq6wiCisKKyM6IG1haW4uYzoyNDc3IG1haW4uYzoyNDk1Cittc2dpZCAiLWdlb21ldHJ5IDxnZW9tPlx0VXNlIDxnZW9tPiBmb3IgaW5pdGlhbCBnZW9tZXRyeSAoYWxzbzogLWdlb20pIgorbXNnc3RyICItZ2VvbWV0cnkgPGdlb20+XHSoz6XOPGdlb20+rLCwX6lspuy4bSAopF2laaXOIC1nZW9tKSIKKworIzogbWFpbi5jOjI0NzgKK21zZ2lkICItYm9yZGVyd2lkdGggPHdpZHRoPlx0VXNlIGEgYm9yZGVyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1idykiCittc2dzdHIgIi1ib3JkZXJ3aWR0aCA8d2lkdGg+XHSoz6XOvGWr16ywIDx3aWR0aD4gqrrD5K7YICikXaVppc4gLWJ3KSIKKworIzogbWFpbi5jOjI0NzkKK21zZ2lkICItc2Nyb2xsYmFyd2lkdGggPHdpZHRoPiAgVXNlIGEgc2Nyb2xsYmFyIHdpZHRoIG9mIDx3aWR0aD4gKGFsc286IC1zdykiCittc2dzdHIgIi1zY3JvbGxiYXJ3aWR0aCA8d2lkdGg+ICCzXal3sbKwyrZivGWr16ywIDx3aWR0aD4gKKRdpWmlziAtc3cpIgorCisjOiBtYWluLmM6MjQ4MQorbXNnaWQgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHRVc2UgYSBtZW51IGJhciBoZWlnaHQgb2YgPGhlaWdodD4gKGFsc286IC1taCkiCittc2dzdHIgIi1tZW51aGVpZ2h0IDxoZWlnaHQ+XHSzXal3v++z5qZDqrqwqqvXrLAgPGhlaWdodD4gKKRdpWmlziAtbWgpIgorCisjOiBtYWluLmM6MjQ4MyBtYWluLmM6MjQ5NgorbXNnaWQgIi1yZXZlcnNlXHRcdFVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiAtcnYpIgorbXNnc3RyICItcmV2ZXJzZVx0XHSoz6XOpM+s28XjpdwgKKRdpWmlziAtcnYpIgorCisjOiBtYWluLmM6MjQ4NAorbXNnaWQgIityZXZlcnNlXHRcdERvbid0IHVzZSByZXZlcnNlIHZpZGVvIChhbHNvOiArcnYpIgorbXNnc3RyICIrcmV2ZXJzZVx0XHSko6jPpc6kz6zbxeOl3CAopF2laaXOICtydikiCisKKyM6IG1haW4uYzoyNDg1Cittc2dpZCAiLXhybSA8cmVzb3VyY2U+XHRTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSIKK21zZ3N0ciAiLXhybSA8cmVzb3VyY2U+XHSzXal3q/ypd6q6IHJlc291cmNlIgorCisjOiBtYWluLmM6MjQ4OAorbXNnaWQgIiIKKyJcbiIKKyJBcmd1bWVudHMgcmVjb2duaXNlZCBieSBndmltIChSSVNDIE9TIHZlcnNpb24pOlxuIgorbXNnc3RyICIiCisiXG4iCisiZ3ZpbSC7e7Fvqrqw0bzGIChSSVNDIE9TIKqpKTpcbiIKKworIzogbWFpbi5jOjI0ODkKK21zZ2lkICItLWNvbHVtbnMgPG51bWJlcj5cdEluaXRpYWwgd2lkdGggb2Ygd2luZG93IGluIGNvbHVtbnMiCittc2dzdHIgIi0tY29sdW1ucyA8bnVtYmVyPlx0tfi1oarsqWykxrxlq9ciCisKKyM6IG1haW4uYzoyNDkwCittc2dpZCAiLS1yb3dzIDxudW1iZXI+XHRJbml0aWFsIGhlaWdodCBvZiB3aW5kb3cgaW4gcm93cyIKK21zZ3N0ciAiLS1yb3dzIDxudW1iZXI+XHS1+LWhquypbKTGsKqr1yIKKworIzogbWFpbi5jOjI0OTMKK21zZ2lkICIiCisiXG4iCisiQXJndW1lbnRzIHJlY29nbmlzZWQgYnkgZ3ZpbSAoR1RLKyB2ZXJzaW9uKTpcbiIKK21zZ3N0ciAiIgorIlxuIgorImd2aW0gu3uxb6q6sNG8xiAoR1RLKyCqqSk6XG4iCisKKyM6IG1haW4uYzoyNDk3Cittc2dpZCAiLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiAoYWxzbzogLS1kaXNwbGF5KSIKK21zZ3N0ciAiLWRpc3BsYXkgPGRpc3BsYXk+XHSmYiA8ZGlzcGxheT4gsPWm5iB2aW0gKKRdpWmlziAtLWRpc3BsYXkpIgorCisjOiBtYWluLmM6MjQ5OQorbXNnaWQgIi0tcm9sZSA8cm9sZT5cdFNldCBhIHVuaXF1ZSByb2xlIHRvIGlkZW50aWZ5IHRoZSBtYWluIHdpbmRvdyIKK21zZ3N0ciAiLS1yb2xlIDxyb2xlPlx0s12pd79Xr1OquqikpuIocm9sZSmlSLDPpMClRLX4taEiCisKKyM6IG1haW4uYzoyNTAxCittc2dpZCAiLS1zb2NrZXRpZCA8eGlkPlx0T3BlbiBWaW0gaW5zaWRlIGFub3RoZXIgR1RLIHdpZGdldCIKK21zZ3N0ciAiLS1zb2NrZXRpZCA8eGlkPlx0pmKldKRArdMgR1RLIHdpZGdldCCkurZ9sdIgVmltIgorCisjOiBtYWluLmM6MjUwMworbXNnaWQgIi0taGVscFx0XHRTaG93IEdub21lIGFyZ3VtZW50cyIKK21zZ3N0ciAiLS1oZWxwXHRcdMXjpdwgR25vbWUgrNvD9rDRvMYiCisKKyM6IG1haW4uYzoyNzM1Cittc2dpZCAiTm8gZGlzcGxheSIKK21zZ3N0ciAitUzF46XcIgorCisjLiBGYWlsZWQgdG8gc2VuZCwgYWJvcnQuCisjOiBtYWluLmM6Mjc1MAorbXNnaWQgIjogU2VuZCBmYWlsZWQuXG4iCittc2dzdHIgIjogtsewZaWisdGhQ1xuIgorCisjLiBMZXQgdmltIHN0YXJ0IG5vcm1hbGx5LgorIzogbWFpbi5jOjI3NTYKK21zZ2lkICI6IFNlbmQgZmFpbGVkLiBUcnlpbmcgdG8gZXhlY3V0ZSBsb2NhbGx5XG4iCittc2dzdHIgIjogsGWlWKWisdGhQ7jVuc+mYqW7pmGw9abmXG4iCisKKyM6IG1haW4uYzoyNzk0IG1haW4uYzoyODE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIG9mICVkIGVkaXRlZCIKK21zZ3N0ciAipHe9c7/oICVkLyVkIK3TwMmu1yIKKworIzogbWFpbi5jOjI4MzcKK21zZ2lkICJObyBkaXNwbGF5OiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICK1TCBEaXNwbGF5OiC1TKprtsewZblCuuKmoaFDXG4iCisKKyM6IG1haW4uYzoyODQ5Cittc2dpZCAiOiBTZW5kIGV4cHJlc3Npb24gZmFpbGVkLlxuIgorbXNnc3RyICI6ILVMqmu2x7BluUK64qahoUNcbiIKKworIzogbWFyay5jOjY1NgorbXNnaWQgIk5vIG1hcmtzIHNldCIKK21zZ3N0ciAiqFOms7NdqXe80LBPIChtYXJrKSIKKworIzogbWFyay5jOjY1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMjgzOiBObyBtYXJrcyBtYXRjaGluZyBcIiVzXCIiCittc2dzdHIgIkUyODM6IKfkpKOo7LLFplggXCIlc1wiIKq6vNCwTyhtYXJrKSIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NjY5Cittc2dpZCAiIgorIlxuIgorIm1hcmsgbGluZSAgY29sIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIrzQsE8gpua4uSAgxOYgIMDJrtcvpOWmciIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtYXJrLmM6NzA3Cittc2dpZCAiIgorIlxuIgorIiBqdW1wIGxpbmUgIGNvbCBmaWxlL3RleHQiCittc2dzdHIgIiIKKyJcbiIKKyIganVtcCCm5ri5ICDE5iAgwMmu1y+k5aZyIgorCisjOiBtYXJrLmM6MTA3MgorbXNnaWQgIiIKKyJcbiIKKyIjIEZpbGUgbWFya3M6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIMDJrte80LBPOlxuIgorCisjLiBXcml0ZSB0aGUganVtcGxpc3Qgd2l0aCAtJworIzogbWFyay5jOjExMDcKK21zZ2lkICIiCisiXG4iCisiIyBKdW1wbGlzdCAobmV3ZXN0IGZpcnN0KTpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgSnVtcGxpc3QgKKXRt3Oo7MLCKTpcbiIKKworIzogbWFyay5jOjEyMDIKK21zZ2lkICIiCisiXG4iCisiIyBIaXN0b3J5IG9mIG1hcmtzIHdpdGhpbiBmaWxlcyAobmV3ZXN0IHRvIG9sZGVzdCk6XG4iCittc2dzdHIgIiIKKyJcbiIKKyIjIMDJrtekuiBNYXJrILBPv/0gKKXRt3Oo7MLCKTpcbiIKKworIzogbWFyay5jOjEyODUKK21zZ2lkICJNaXNzaW5nICc+JyIKK21zZ3N0ciAir8qk1rnvwLOquiAnPiciCisKKyM6IG1ieXRlLmM6NDAzCittc2dpZCAiRTU0MzogTm90IGEgdmFsaWQgY29kZXBhZ2UiCittc2dzdHIgIkU1NDM6IKSjpb+9VKq6IGNvZGVwYWdlIgorCisjOiBtYnl0ZS5jOjM4NzkKK21zZ2lkICJFMjg0OiBDYW5ub3Qgc2V0IElDIHZhbHVlcyIKK21zZ3N0ciAiRTI4NDogpKOv4LNdqXcgSUMgvMatyCIKKworIzogbWJ5dGUuYzo0MDMxCittc2dpZCAiRTI4NTogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBjb250ZXh0IgorbXNnc3RyICJFMjg1OiC1TKprq9il3yBpbnB1dCBjb250ZXh0IgorCisjOiBtYnl0ZS5jOjQxNzgKK21zZ2lkICJFMjg2OiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBtZXRob2QiCittc2dzdHIgIkUyODY6ILVMqmu2fbHSv+mkSqprIgorCisjOiBtYnl0ZS5jOjQxODkKK21zZ2lkICJFMjg3OiBXYXJuaW5nOiBDb3VsZCBub3Qgc2V0IGRlc3Ryb3kgY2FsbGJhY2sgdG8gSU0iCittc2dzdHIgIkUyODc6IMS1p2k6ILVMqmuyvrCjIElNIKq6IGNhbGxiYWNrIgorCisjOiBtYnl0ZS5jOjQxOTUKK21zZ2lkICJFMjg4OiBpbnB1dCBtZXRob2QgZG9lc24ndCBzdXBwb3J0IGFueSBzdHlsZSIKK21zZ3N0ciAiRTI4ODogv+mkSqprpKOk5LSppfSm8yBzdHlsZSIKKworIzogbWJ5dGUuYzo0MjUyCittc2dpZCAiRTI4OTogaW5wdXQgbWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCBteSBwcmVlZGl0IHR5cGUiCittc2dzdHIgIkUyODk6IL/ppEqqa6SjpOS0qaX0pvMgc3R5bGUiCisKKyM6IG1ieXRlLmM6NDMyNgorbXNnaWQgIkUyOTA6IG92ZXItdGhlLXNwb3Qgc3R5bGUgcmVxdWlyZXMgZm9udHNldCIKK21zZ3N0ciAiRTI5MDogb3Zlci10aGUtc3BvdCC73a1upnKrrLawKEZvbnRzZXQpIgorCisjOiBtYnl0ZS5jOjQzNTgKK21zZ2lkICJFMjkxOiBZb3VyIEdUSysgaXMgb2xkZXIgdGhhbiAxLjIuMy4gU3RhdHVzIGFyZWEgZGlzYWJsZWQiCittc2dzdHIgIkUyOTE6IKdBqrogR1RLKyCk8SAxLjIuMyDB2cLCoUO1TKprqM+lzqqsukGwz6FDIgorCisjOiBtYnl0ZS5jOjQ2MzcKK21zZ2lkICJFMjkyOiBJbnB1dCBNZXRob2QgU2VydmVyIGlzIG5vdCBydW5uaW5nIgorbXNnc3RyICJFMjkyOiCoU6azsPWm5qSkqrq/6aRKqmu63rJ6tXumoShJbnB1dCBNZXRob2QgU2VydmVyKSIKKworIzogbWVtZmlsZS5jOjQ4OAorbXNnaWQgIkUyOTM6IGJsb2NrIHdhcyBub3QgbG9ja2VkIgorbXNnc3RyICJFMjkzOiCwz7b0pbyzUcLqqXciCisKKyM6IG1lbWZpbGUuYzo5ODkKK21zZ2lkICJFMjk0OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSByZWFkIgorbXNnc3RyICJFMjk0OiC8yKZzwMnFqqj6v/m7fiIKKworIzogbWVtZmlsZS5jOjk5NAorbXNnaWQgIkUyOTU6IFJlYWQgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk1OiC8yKZzwMnFqqj6v/m7fiIKKworIzogbWVtZmlsZS5jOjEwNDYKK21zZ2lkICJFMjk2OiBTZWVrIGVycm9yIGluIHN3YXAgZmlsZSB3cml0ZSIKK21zZ3N0ciAiRTI5NjogvMimc8DJvGekSr/5u34iCisKKyM6IG1lbWZpbGUuYzoxMDY0Cittc2dpZCAiRTI5NzogV3JpdGUgZXJyb3IgaW4gc3dhcCBmaWxlIgorbXNnc3RyICJFMjk3OiC8yKZzwMm8Z6RKv/m7fiIKKworIzogbWVtZmlsZS5jOjEyNjEKK21zZ2lkICJFMzAwOiBTd2FwIGZpbGUgYWxyZWFkeSBleGlzdHMgKHN5bWxpbmsgYXR0YWNrPykiCittc2dzdHIgIkUzMDA6ILzIpnPAyaR3uGemc6ZiISAopHCk37LFuLmzc7Wyqrqmd6X+unysfSE/KSIKKworIzogbWVtbGluZS5jOjI3NQorbXNnaWQgIkUyOTg6IERpZG4ndCBnZXQgYmxvY2sgbnIgMD8iCittc2dzdHIgIkUyOTg6IKfkpKOo7LDPtvQgMD8iCisKKyM6IG1lbWxpbmUuYzozMTUKK21zZ2lkICJFMjk4OiBEaWRuJ3QgZ2V0IGJsb2NrIG5yIDE/IgorbXNnc3RyICJFMjk4OiCn5KSjqOywz7b0IDE/IgorCisjOiBtZW1saW5lLmM6MzMzCittc2dpZCAiRTI5ODogRGlkbid0IGdldCBibG9jayBuciAyPyIKK21zZ3N0ciAiRTI5ODogp+Sko6jssM+29CAyPyIKKworIy4gY291bGQgbm90IChyZSlvcGVuIHRoZSBzd2FwIGZpbGUsIHdoYXQgY2FuIHdlIGRvPz8/PworIzogbWVtbGluZS5jOjQ0MworbXNnaWQgIkUzMDE6IE9vcHMsIGxvc3QgdGhlIHN3YXAgZmlsZSEhISIKK21zZ3N0ciAiRTMwMTogvr6+viwgvMimc8DJpKOoo6RGISEhIgorCisjOiBtZW1saW5lLmM6NDQ4Cittc2dpZCAiRTMwMjogQ291bGQgbm90IHJlbmFtZSBzd2FwIGZpbGUiCittc2dzdHIgIkUzMDI6ILVMqmun78XcvMimc8DJqrqmV7rZIgorCisjOiBtZW1saW5lLmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMDM6IFVuYWJsZSB0byBvcGVuIHN3YXAgZmlsZSBmb3IgXCIlc1wiLCByZWNvdmVyeSBpbXBvc3NpYmxlIgorbXNnc3RyICJFMzAzOiC1TKprtn2x0rzIpnPAySBcIiVzXCIsIKSjpWmv4K3XtF+kRiIKKworIzogbWVtbGluZS5jOjYxNworbXNnaWQgIkUzMDQ6IG1sX3RpbWVzdGFtcDogRGlkbid0IGdldCBibG9jayAwPz8iCittc2dzdHIgIkUzMDQ6IG1sX3RpbWVzdGFtcDogp+Sko6jssM+29CAwPz8iCisKKyM6IG1lbWxpbmUuYzo3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNTogTm8gc3dhcCBmaWxlIGZvdW5kIGZvciAlcyIKK21zZ3N0ciAiRTMwNTogp+Sko6jsICVzIKq6vMimc8DJIgorCisjOiBtZW1saW5lLmM6NzY3Cittc2dpZCAiRW50ZXIgbnVtYmVyIG9mIHN3YXAgZmlsZSB0byB1c2UgKDAgdG8gcXVpdCk6ICIKK21zZ3N0ciAivdC/777cp0GtbqjPpc6qurzIpnPAySAoq/YwIML3tn0pOiAiCisKKyM6IG1lbWxpbmUuYzo4MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNjogQ2Fubm90IG9wZW4gJXMiCittc2dzdHIgIkUzMDY6ILVMqmu2fbHSICVzIgorCisjOiBtZW1saW5lLmM6ODM0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgYmxvY2sgMCBmcm9tICIKK21zZ3N0ciAitUyqa8WqqPqwz7b0IDA6IgorCisjOiBtZW1saW5lLmM6ODM3Cittc2dpZCAiIgorIlxuIgorIk1heWJlIG5vIGNoYW5nZXMgd2VyZSBtYWRlIG9yIFZpbSBkaWQgbm90IHVwZGF0ZSB0aGUgc3dhcCBmaWxlLiIKK21zZ3N0ciAiIgorIlxuIgorIqVpr+CsT6dBqFOwtblMpfSm863Xp++pzqxPIFZpbSDB2ajTpKOkzqfzt3O8yKZzwMkuIgorCisjOiBtZW1saW5lLmM6ODQ3IG1lbWxpbmUuYzo4NjQKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgVmltLlxuIgorbXNnc3RyICIgtUyqa6ZipbuqqaW7qrogVmltIKSkqM+lzi5cbiIKKworIzogbWVtbGluZS5jOjg0OQorbXNnaWQgIlVzZSBWaW0gdmVyc2lvbiAzLjAuXG4iCittc2dzdHIgIqjPpc4gVmltIDMuMKFDXG4iCisKKyM6IG1lbWxpbmUuYzo4NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwNzogJXMgZG9lcyBub3QgbG9vayBsaWtlIGEgVmltIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTMwNzogJXMgrN2wX6jTpKO5s6xPIFZpbSC8yKZzwMkiCisKKyM6IG1lbWxpbmUuYzo4NjgKK21zZ2lkICIgY2Fubm90IGJlIHVzZWQgb24gdGhpcyBjb21wdXRlci5cbiIKK21zZ3N0ciAiILVMqmumYrNvu0+5cbijpFeoz6XOLlxuIgorCisjOiBtZW1saW5lLmM6ODcwCittc2dpZCAiVGhlIGZpbGUgd2FzIGNyZWF0ZWQgb24gIgorbXNnc3RyICKlu8DJrter2KXfqfMgIgorCisjOiBtZW1saW5lLmM6ODc0Cittc2dpZCAiIgorIixcbiIKKyJvciB0aGUgZmlsZSBoYXMgYmVlbiBkYW1hZ2VkLiIKK21zZ3N0ciAiIgorIixcbiIKKyKpzqxPs2/Aya7XpHe4Z7dst7ShQyIKKworIzogbWVtbGluZS5jOjkwMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyBzd2FwIGZpbGUgXCIlc1wiIgorbXNnc3RyICKoz6XOvMimc8DJIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkwOQorIywgYy1mb3JtYXQKK21zZ2lkICJPcmlnaW5hbCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAireypbMDJIFwiJXNcIiIKKworIzogbWVtbGluZS5jOjkyMgorbXNnaWQgIkUzMDg6IFdhcm5pbmc6IE9yaWdpbmFsIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIgorbXNnc3RyICJFMzA4OiDEtadpOiCt7KlswMmu16Vpr+Ckd7hnrden77lMpEYiCisKKyM6IG1lbWxpbmUuYzo5NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMwOTogVW5hYmxlIHRvIHJlYWQgYmxvY2sgMSBmcm9tICVzIgorbXNnc3RyICJFMzA5OiC1TKprsXEgJXMgxaqo+rDPtvQgMSIKKworIzogbWVtbGluZS5jOjk2NworbXNnaWQgIj8/P01BTlkgTElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/r8qk1qTTpmim5iIKKworIzogbWVtbGluZS5jOjk4MworbXNnaWQgIj8/P0xJTkUgQ09VTlQgV1JPTkciCittc2dzdHIgIj8/P6bmuLm/+bt+IgorCisjOiBtZW1saW5lLmM6OTkwCittc2dpZCAiPz8/RU1QVFkgQkxPQ0siCittc2dzdHIgIj8/P6rFqrogQkxPQ0siCisKKyM6IG1lbWxpbmUuYzoxMDE2Cittc2dpZCAiPz8/TElORVMgTUlTU0lORyIKK21zZ3N0ciAiPz8/p+Sko6jspECox6bmIgorCisjOiBtZW1saW5lLmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzEwOiBCbG9jayAxIElEIHdyb25nICglcyBub3QgYSAuc3dwIGZpbGU/KSIKK21zZ3N0ciAiRTMxMDogsM+29CAxIElEIL/5u34gKCVzIKSjrE+8yKZzwMk/KSIKKworIzogbWVtbGluZS5jOjEwNTMKK21zZ2lkICI/Pz9CTE9DSyBNSVNTSU5HIgorbXNnc3RyICI/Pz+n5KSjqOxCTE9DSyIKKworIzogbWVtbGluZS5jOjEwNjkKK21zZ2lkICI/Pz8gZnJvbSBoZXJlIHVudGlsID8/P0VORCBsaW5lcyBtYXkgYmUgbWVzc2VkIHVwIgorbXNnc3RyICI/Pz8gsXGzb7jMqOwgPz8/RU5EIKq6pLquZaVpr+Cms7Ddw0QiCisKKyM6IG1lbWxpbmUuYzoxMDg1Cittc2dpZCAiPz8/IGZyb20gaGVyZSB1bnRpbCA/Pz9FTkQgbGluZXMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIgorbXNnc3RyICI/Pz8gsXGzb7jMqOwgPz8/RU5EIKq6pLquZaVpr+CzUadSsKMvtKGkSrlMIgorCisjIGRvIG5vdCB0cmFuc2xhdGUKKyM6IG1lbWxpbmUuYzoxMTA1Cittc2dpZCAiPz8/RU5EIgorbXNnc3RyICI/Pz9FTkQiCisKKyM6IG1lbWxpbmUuYzoxMTMxCittc2dpZCAiRTMxMTogUmVjb3ZlcnkgSW50ZXJydXB0ZWQiCittc2dzdHIgIkUzMTE6IK3XtF+kd6Skwl8iCisKKyM6IG1lbWxpbmUuYzoxMTMzCittc2dpZCAiIgorIkUzMTI6IEVycm9ycyBkZXRlY3RlZCB3aGlsZSByZWNvdmVyaW5nOyBsb29rIGZvciBsaW5lcyBzdGFydGluZyB3aXRoID8/PyIKK21zZ3N0ciAiRTMxMjogrde0X67JtW+lzb/5u347IL3QqmC3TrZ9wFmssCA/Pz8gqrqm5iIKKworIzogbWVtbGluZS5jOjExMzYKK21zZ2lkICJSZWNvdmVyeSBjb21wbGV0ZWQuIFlvdSBzaG91bGQgY2hlY2sgaWYgZXZlcnl0aGluZyBpcyBPSy4iCittc2dzdHIgIrRfreynuaaoLiC90L1UqXekQKTBpb+xYC4iCisKKyM6IG1lbWxpbmUuYzoxMTM3Cittc2dpZCAiIgorIlxuIgorIihZb3UgbWlnaHQgd2FudCB0byB3cml0ZSBvdXQgdGhpcyBmaWxlIHVuZGVyIGFub3RoZXIgbmFtZVxuIgorbXNnc3RyICIiCisiXG4iCisiKKdBpWmv4Ld8t1Gtbqfis2+t08DJrteldKZzp0+qusDJplehQVxuIgorCisjOiBtZW1saW5lLmM6MTEzOAorbXNnaWQgImFuZCBydW4gZGlmZiB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzKVxuIgorbXNnc3RyICKmQbD1puYgZGlmZiC7UK3swMmu16TxuPulSMDLrGSsT6dfprOn78XcKVxuIgorCisjOiBtZW1saW5lLmM6MTEzOQorbXNnaWQgIiIKKyJEZWxldGUgdGhlIC5zd3AgZmlsZSBhZnRlcndhcmRzLlxuIgorIlxuIgorbXNnc3RyICIiCisiKEQpqr2xtadSsKMgLnN3cCC8yKZzwMlcbiIKKyJcbiIKKworIy4gdXNlIG1zZygpIHRvIHN0YXJ0IHRoZSBzY3JvbGxpbmcgcHJvcGVybHkKKyM6IG1lbWxpbmUuYzoxMTk1Cittc2dpZCAiU3dhcCBmaWxlcyBmb3VuZDoiCittc2dzdHIgIqfkqOylSKRVqrq8yKZzwMk6IgorCisjOiBtZW1saW5lLmM6MTM3MworbXNnaWQgIiAgIEluIGN1cnJlbnQgZGlyZWN0b3J5OlxuIgorbXNnc3RyICIgICCmYqXYq2WquqXYv/06XG4iCisKKyM6IG1lbWxpbmUuYzoxMzc1Cittc2dpZCAiICAgVXNpbmcgc3BlY2lmaWVkIG5hbWU6XG4iCittc2dzdHIgIiAgIFVzaW5nIHNwZWNpZmllZCBuYW1lOlxuIgorCisjOiBtZW1saW5lLmM6MTM3OQorbXNnaWQgIiAgIEluIGRpcmVjdG9yeSAiCittc2dzdHIgIiAgIKZipdi//SAiCisKKyM6IG1lbWxpbmUuYzoxMzk3Cittc2dpZCAiICAgICAgLS0gbm9uZSAtLVxuIgorbXNnc3RyICIgICAgICAtLSC1TCAtLVxuIgorCisjOiBtZW1saW5lLmM6MTQ2OQorbXNnaWQgIiAgICAgICAgICBvd25lZCBieTogIgorbXNnc3RyICIgICAgICAgICAgICC+1qazqsw6ICIKKworIzogbWVtbGluZS5jOjE0NzEKK21zZ2lkICIgICBkYXRlZDogIgorbXNnc3RyICIgICAgpOm0wTogIgorCisjOiBtZW1saW5lLmM6MTQ3NSBtZW1saW5lLmM6MzY4OQorbXNnaWQgIiAgICAgICAgICAgICBkYXRlZDogIgorbXNnc3RyICIgICAgICAgICAgICAgIKTptME6ICIKKworIzogbWVtbGluZS5jOjE0OTEKK21zZ2lkICIgICAgICAgICBbZnJvbSBWaW0gdmVyc2lvbiAzLjBdIgorbXNnc3RyICIgICAgICAgICAgICAgIFuxcSBWaW0gqqmluyAzLjBdIgorCisjOiBtZW1saW5lLmM6MTQ5NQorbXNnaWQgIiAgICAgICAgIFtkb2VzIG5vdCBsb29rIGxpa2UgYSBWaW0gc3dhcCBmaWxlXSIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICBbpKO5syBWaW0gqrq8yKZzwMldIgorCisjOiBtZW1saW5lLmM6MTQ5OQorbXNnaWQgIiAgICAgICAgIGZpbGUgbmFtZTogIgorbXNnc3RyICIgICAgICAgICAgICAgIMDJplc6ICIKKworIzogbWVtbGluZS5jOjE1MDUKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgIG1vZGlmaWVkOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICCt16fvuUw6ICIKKworIzogbWVtbGluZS5jOjE1MDYKK21zZ2lkICJZRVMiCittc2dzdHIgIqxPIgorCisjOiBtZW1saW5lLmM6MTUwNgorbXNnaWQgIm5vIgorbXNnc3RyICKnXyIKKworIzogbWVtbGluZS5jOjE1MTAKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgdXNlciBuYW1lOiAiCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAgICAgICCoz6XOqsw6ICIKKworIzogbWVtbGluZS5jOjE1MTcKK21zZ2lkICIgICBob3N0IG5hbWU6ICIKK21zZ3N0ciAiICAgIKVEvvemV7rZOiAiCisKKyM6IG1lbWxpbmUuYzoxNTE5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIGhvc3QgbmFtZTogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgIKVEvvemV7rZOiAiCisKKyM6IG1lbWxpbmUuYzoxNTI1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgcHJvY2VzcyBJRDogIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICBwcm9jZXNzIElEOiAiCisKKyM6IG1lbWxpbmUuYzoxNTMxCittc2dpZCAiIChzdGlsbCBydW5uaW5nKSIKK21zZ3N0ciAiICiw9abmpKQpIgorCisjOiBtZW1saW5lLmM6MTU0MworbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgW7VMqmumYqW7qqmlu6q6IFZpbSCkV6jPpc5dIgorCisjOiBtZW1saW5lLmM6MTU0NgorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgICBbbm90IHVzYWJsZSBvbiB0aGlzIGNvbXB1dGVyXSIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgIFu1TKprpmKlu7lxuKOkV6jPpc5dIgorCisjOiBtZW1saW5lLmM6MTU1MQorbXNnaWQgIiAgICAgICAgIFtjYW5ub3QgYmUgcmVhZF0iCittc2dzdHIgIiAgICAgICAgIFu1TKprxaqo+l0iCisKKyM6IG1lbWxpbmUuYzoxNTU1Cittc2dpZCAiICAgICAgICAgW2Nhbm5vdCBiZSBvcGVuZWRdIgorbXNnc3RyICIgICAgICAgICBbtUyqa7Z9sdJdIgorCisjOiBtZW1saW5lLmM6MTc0NQorbXNnaWQgIkUzMTM6IENhbm5vdCBwcmVzZXJ2ZSwgdGhlcmUgaXMgbm8gc3dhcCBmaWxlIgorbXNnc3RyICJFMzEzOiC1TKprq0+vZCwgpKOoz6XOvMimc8DJIgorCisjOiBtZW1saW5lLmM6MTc5OAorbXNnaWQgIkZpbGUgcHJlc2VydmVkIgorbXNnc3RyICLAya7XpHerT69kIgorCisjOiBtZW1saW5lLmM6MTgwMAorbXNnaWQgIkUzMTQ6IFByZXNlcnZlIGZhaWxlZCIKK21zZ3N0ciAiRTMxNDogq0+vZKWisdEiCisKKyM6IG1lbWxpbmUuYzoxODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMTU6IG1sX2dldDogaW52YWxpZCBsbnVtOiAlbGQiCittc2dzdHIgIkUzMTU6IG1sX2dldDogv/m7fqq6IGxudW06ICVsZCIKKworIzogbWVtbGluZS5jOjE4OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMxNjogbWxfZ2V0OiBjYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMxNjogbWxfZ2V0OiCn5KSjqOyyxCAlbGQgpuYiCisKKyM6IG1lbWxpbmUuYzoyMjg3Cittc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAzIgorbXNnc3RyICJFMzE3OiCr/LzQsM+29CBpZCC/+bt+IDMiCisKKyM6IG1lbWxpbmUuYzoyMzY3Cittc2dpZCAic3RhY2tfaWR4IHNob3VsZCBiZSAwIgorbXNnc3RyICJzdGFja19pZHggwLO406xPIDAiCisKKyM6IG1lbWxpbmUuYzoyNDI5Cittc2dpZCAiRTMxODogVXBkYXRlZCB0b28gbWFueSBibG9ja3M/IgorbXNnc3RyICJFMzE4OiCn87dzpNOmaLDPtvQ/IgorCisjOiBtZW1saW5lLmM6MjYxMQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgNCIKK21zZ3N0ciAiRTMxNzogq/y80LDPtvQgaWQgv/m7fiA0IgorCisjOiBtZW1saW5lLmM6MjYzOAorbXNnaWQgImRlbGV0ZWQgYmxvY2sgMT8iCittc2dzdHIgIqdSsKOwz7b0IDE/IgorCisjOiBtZW1saW5lLmM6MjgzOAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzIwOiBDYW5ub3QgZmluZCBsaW5lICVsZCIKK21zZ3N0ciAiRTMyMDogp+Sko6jsssQgJWxkIKbmIgorCisjOiBtZW1saW5lLmM6MzA4MQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmciCittc2dzdHIgIkUzMTc6IKv8vNCwz7b0IGlkIL/5u34iCisKKyM6IG1lbWxpbmUuYzozMDk3Cittc2dpZCAicGVfbGluZV9jb3VudCBpcyB6ZXJvIgorbXNnc3RyICJwZV9saW5lX2NvdW50IKywuXMiCisKKyM6IG1lbWxpbmUuYzozMTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjI6IGxpbmUgbnVtYmVyIG91dCBvZiByYW5nZTogJWxkIHBhc3QgdGhlIGVuZCIKK21zZ3N0ciAiRTMyMjogpua4ubZXpVi9ZLPyOiAlbGQgtle5TLWyp8AiCisKKyM6IG1lbWxpbmUuYzozMTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMjM6IGxpbmUgY291bnQgd3JvbmcgaW4gYmxvY2sgJWxkIgorbXNnc3RyICJFMzIzOiCwz7b0ICVsZCCm5rzGv/m7fiIKKworIzogbWVtbGluZS5jOjMxNzkKK21zZ2lkICJTdGFjayBzaXplIGluY3JlYXNlcyIKK21zZ3N0ciAisO/FfKRqpHC8V6VbIgorCisjOiBtZW1saW5lLmM6MzIyNQorbXNnaWQgIkUzMTc6IHBvaW50ZXIgYmxvY2sgaWQgd3JvbmcgMiIKK21zZ3N0ciAiRTMxNzogq/y80LDPtvQgaWQgv/kgMiIKKworIzogbWVtbGluZS5jOjM2NzkKK21zZ2lkICJFMzI1OiBBVFRFTlRJT04iCittc2dzdHIgIkUzMjU6IKpgt04iCisKKyM6IG1lbWxpbmUuYzozNjgwCittc2dpZCAiIgorIlxuIgorIkZvdW5kIGEgc3dhcCBmaWxlIGJ5IHRoZSBuYW1lIFwiIgorbXNnc3RyICIiCisiXG4iCisip+So7LzIpnPAySBcIiIKKworIzogbWVtbGluZS5jOjM2ODQKK21zZ2lkICJXaGlsZSBvcGVuaW5nIGZpbGUgXCIiCittc2dzdHIgIqZitn2x0sDJrtcgXCIiCisKKyM6IG1lbWxpbmUuYzozNjkzCittc2dpZCAiICAgICAgTkVXRVIgdGhhbiBzd2FwIGZpbGUhXG4iCittc2dzdHIgIiAgICAgIKTxvMimc8DJp/O3cyFcbiIKKworIy4gU29tZSBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgbG9uZyB0byBhbGxvdyB0cmFuc2xhdGlvbiB0bworIy4gKiBvdGhlciBsYW5ndWFnZXMuCisjOiBtZW1saW5lLmM6MzY5NworbXNnaWQgIiIKKyJcbiIKKyIoMSkgQW5vdGhlciBwcm9ncmFtIG1heSBiZSBlZGl0aW5nIHRoZSBzYW1lIGZpbGUuXG4iCisiICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGJlIGNhcmVmdWwgbm90IHRvIGVuZCB1cCB3aXRoIHR3b1xuIgorIiAgICBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZpbGUgd2hlbiBtYWtpbmcgY2hhbmdlcy5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigxKSClaa/gprOldKRArdO1e6ahpF2mYr1zv+imUKRArdPAya7XLlxuIgorIiAgICCmcKpHrE+zb7zLoUG90KRwpN+ko61uqOLD5KRAsF+8Z6RKoUGko7VNp0GquqdWpE+zo7d8rXS90ax5pPShQ1xuIgorCisjOiBtZW1saW5lLmM6MzY5OAorbXNnaWQgIiAgICBRdWl0LCBvciBjb250aW51ZSB3aXRoIGNhdXRpb24uXG4iCittc2dzdHIgIiAgICDC97Z9oUGpzqxPxH7E8r1zv+ihQ1xuIgorCisjOiBtZW1saW5lLmM6MzY5OQorbXNnaWQgIiIKKyJcbiIKKyIoMikgQW4gZWRpdCBzZXNzaW9uIGZvciB0aGlzIGZpbGUgY3Jhc2hlZC5cbiIKK21zZ3N0ciAiIgorIlxuIgorIigyKSCrZaa4vXO/6Ka5wMmuybftvvdcbiIKKworIzogbWVtbGluZS5jOjM3MDAKK21zZ2lkICIgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdXNlIFwiOnJlY292ZXJcIiBvciBcInZpbSAtciAiCittc2dzdHIgIiAgICCmcKpHrE+zb7zLLCC90KXOIFwiOnJlY292ZXJcIiCpziBcInZpbSAtciIKKworIzogbWVtbGluZS5jOjM3MDIKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gcmVjb3ZlciB0aGUgY2hhbmdlcyAoc2VlIFwiOmhlbHAgcmVjb3ZlcnlcIikuXG4iCittc2dzdHIgIiIKKyJcIlxuIgorIiAgICCo07HPpl6t16fvuOquxiAotmmkQKhCu6Gp+r3QrN0gXCI6aGVscCByZWNvdmVyeVwiKS5cbiIKKworIzogbWVtbGluZS5jOjM3MDMKK21zZ2lkICIgICAgSWYgeW91IGRpZCB0aGlzIGFscmVhZHksIGRlbGV0ZSB0aGUgc3dhcCBmaWxlIFwiIgorbXNnc3RyICIgICAgpnCqR7jTsc+qurOjpHe4Z7HPpEYsIL3Qqr2xtadSsKOmubzIpnPAySBcIiIKKworIzogbWVtbGluZS5jOjM3MDUKK21zZ2lkICIiCisiXCJcbiIKKyIgICAgdG8gYXZvaWQgdGhpcyBtZXNzYWdlLlxuIgorbXNnc3RyICIiCisiXCJcbiIKKyIgICAgpUjB16dLpkGs3ajsprmwVK6nLlxuIgorCisjOiBtZW1saW5lLmM6MzcxOSBtZW1saW5lLmM6MzcyMworbXNnaWQgIlN3YXAgZmlsZSBcIiIKK21zZ3N0ciAivMimc8DJIFwiIgorCisjOiBtZW1saW5lLmM6MzcyMCBtZW1saW5lLmM6MzcyNgorbXNnaWQgIlwiIGFscmVhZHkgZXhpc3RzISIKK21zZ3N0ciAiXCIgpHe4Z6ZzpmKkRiEiCisKKyM6IG1lbWxpbmUuYzozNzI5Cittc2dpZCAiVklNIC0gQVRURU5USU9OIgorbXNnc3RyICJWSU0gLSCqYLdOIgorCisjOiBtZW1saW5lLmM6MzczMQorbXNnaWQgIlN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyEiCittc2dzdHIgIrzIpnPAyaR3uGemc6ZiISIKKworIzogbWVtbGluZS5jOjM3MzUKK21zZ2lkICIiCisiJk9wZW4gUmVhZC1Pbmx5XG4iCisiJkVkaXQgYW55d2F5XG4iCisiJlJlY292ZXJcbiIKKyImUXVpdCIKK21zZ3N0ciAiIgorIqVIsN/FqqTopqG2fbHSKCZPKVxuIgorIqq9sbW9c7/oKCZFKVxuIgorIq3XtF8oJlIpXG4iCisiwve2fSgmUSkiCisKKyM6IG1lbWxpbmUuYzozNzM3Cittc2dpZCAiIgorIiZPcGVuIFJlYWQtT25seVxuIgorIiZFZGl0IGFueXdheVxuIgorIiZSZWNvdmVyXG4iCisiJlF1aXRcbiIKKyImRGVsZXRlIGl0IgorbXNnc3RyICIiCisipUiw38WqpOimobZ9sdIoJk8pXG4iCisiqr2xtb1zv+goJkUpXG4iCisirde0XygmUilcbiIKKyLC97Z9KCZRKVxuIgorIqdSsKO8yKZzwMkoJkQpIgorCisjOiBtZW1saW5lLmM6Mzc5MAorbXNnaWQgIkUzMjY6IFRvbyBtYW55IHN3YXAgZmlsZXMgZm91bmQiCittc2dzdHIgIkUzMjY6IKfkqOyk06ZovMimc8DJIgorCisjOiBtZW51LmM6NjQKK21zZ2lkICJFMzI3OiBQYXJ0IG9mIG1lbnUtaXRlbSBwYXRoIGlzIG5vdCBzdWItbWVudSIKK21zZ3N0ciAiRTMyNzogs6Gl97/vtrW49K58pKOsT6Rsv++z5iIKKworIzogbWVudS5jOjY1Cittc2dpZCAiRTMyODogTWVudSBvbmx5IGV4aXN0cyBpbiBhbm90aGVyIG1vZGUiCittc2dzdHIgIkUzMjg6IL/vs+alda/gpmKo5KWmvNKmoaSkqM+lziIKKworIzogbWVudS5jOjY2Cittc2dpZCAiRTMyOTogTm8gbWVudSBvZiB0aGF0IG5hbWUiCittc2dzdHIgIkUzMjk6IKhTprOourzLqrq/77PmIgorCisjOiBtZW51LmM6NTA5Cittc2dpZCAiRTMzMDogTWVudSBwYXRoIG11c3Qgbm90IGxlYWQgdG8gYSBzdWItbWVudSIKK21zZ3N0ciAiRTMzMDogv++z5rj0rnyko6/gq/ymVqRsv++z5iIKKworIzogbWVudS5jOjU0OAorbXNnaWQgIkUzMzE6IE11c3Qgbm90IGFkZCBtZW51IGl0ZW1zIGRpcmVjdGx5IHRvIG1lbnUgYmFyIgorbXNnc3RyICJFMzMxOiCko6/gqr2xtafiv++2taVbqOy/77PmpkOkpCIKKworIzogbWVudS5jOjU1NAorbXNnaWQgIkUzMzI6IFNlcGFyYXRvciBjYW5ub3QgYmUgcGFydCBvZiBhIG1lbnUgcGF0aCIKK21zZ3N0ciAiRTMzMjogpMC5ar11pKOv4KxPv++z5rj0rnyquqRAs6Gl9yIKKworIy4gTm93IHdlIGhhdmUgZm91bmQgdGhlIG1hdGNoaW5nIG1lbnUsIGFuZCB3ZSBsaXN0IHRoZSBtYXBwaW5ncworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBtZW51LmM6MTA3OQorbXNnaWQgIiIKKyJcbiIKKyItLS0gTWVudXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIL/vs+YgLS0tIgorCisjOiBtZW51LmM6MTk5NgorbXNnaWQgIlRlYXIgb2ZmIHRoaXMgbWVudSIKK21zZ3N0ciAipMGkVaa5v++z5iIKKworIzogbWVudS5jOjIwNjEKK21zZ2lkICJFMzMzOiBNZW51IHBhdGggbXVzdCBsZWFkIHRvIGEgbWVudSBpdGVtIgorbXNnc3RyICJFMzMzOiC/77PmuPSufKWyu92r/KZWpECt07/vtrUiCisKKyM6IG1lbnUuYzoyMDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzMzQ6IE1lbnUgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTMzNDogW7/vs+ZdIKfkpKOo7CAlcyIKKworIzogbWVudS5jOjIxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTMzNTogTWVudSBub3QgZGVmaW5lZCBmb3IgJXMgbW9kZSIKK21zZ3N0ciAiRTMzNTogJXMgvNKmoaW8qXe4cb/vs+YiCisKKyM6IG1lbnUuYzoyMTg4Cittc2dpZCAiRTMzNjogTWVudSBwYXRoIG11c3QgbGVhZCB0byBhIHN1Yi1tZW51IgorbXNnc3RyICJFMzM2OiC/77PmuPSufKWyu92r/KZWpGy/77PmIgorCisjOiBtZW51LmM6MjIwOQorbXNnaWQgIkUzMzc6IE1lbnUgbm90IGZvdW5kIC0gY2hlY2sgbWVudSBuYW1lcyIKK21zZ3N0ciAiRTMzNzogp+Sko6jsv++z5iAtIL3QwMusZL/vs+amV7rZIgorCisjOiBtZXNzYWdlLmM6NTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGRldGVjdGVkIHdoaWxlIHByb2Nlc3NpbmcgJXM6IgorbXNnc3RyICKzQrJ6ICVzIK7JtW+lzb/5u346IgorCisjOiBtZXNzYWdlLmM6NTI1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJTRsZDoiCittc2dzdHIgIqbmICU0bGQ6IgorCisjOiBtZXNzYWdlLmM6NTY1Cittc2dpZCAiW3N0cmluZyB0b28gbG9uZ10iCittc2dzdHIgIlumuabmuUyq+F0iCisKKyM6IG1lc3NhZ2UuYzo3MTEKK21zZ2lkICJNZXNzYWdlcyBtYWludGFpbmVyOiBCcmFtIE1vb2xlbmFhciA8QnJhbUB2aW0ub3JnPiIKK21zZ3N0ciAiIgorIqW/xemkpKTlsFSup7r7xUCqzDogRnJhbmNpcyBTLkxpbiA8cGlhaXBAY3NpZS5udHUuZWR1LiIKKyJ0dz4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VjaWwgU2hlbmcgICA8Yjc1MDYwMjJAY3NpZS5udHUuZWR1LnR3PiIKKworIzogbWVzc2FnZS5jOjkzNQorbXNnaWQgIkludGVycnVwdDogIgorbXNnc3RyICKkd6Skwl86ICIKKworIzogbWVzc2FnZS5jOjkzOAorbXNnaWQgIkhpdCBFTlRFUiB0byBjb250aW51ZSIKK21zZ3N0ciAivdCr9iBFTlRFUiDEfsTyIgorCisjOiBtZXNzYWdlLmM6OTQwCittc2dpZCAiSGl0IEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKK21zZ3N0ciAivdCr9iBFTlRFUiCpzqjkpaapUqVPpUjEfsTyIgorCisjOiBtZXNzYWdlLmM6MjAyOAorbXNnaWQgIi0tIE1vcmUgLS0iCittc2dzdHIgIi0tIKl8prMgLS0iCisKKyM6IG1lc3NhZ2UuYzoyMDMxCittc2dpZCAiIChSRVQvQlM6IGxpbmUsIFNQQUNFL2I6IHBhZ2UsIGQvdTogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQvQlM6IKZWpFUvplakV6RApuYsIKrFpdXB5C9iOiCkQK22LCBkL3U6IKVirbYsIHE6IML3tn0pIgorCisjOiBtZXNzYWdlLmM6MjAzMgorbXNnaWQgIiAoUkVUOiBsaW5lLCBTUEFDRTogcGFnZSwgZDogaGFsZiBwYWdlLCBxOiBxdWl0KSIKK21zZ3N0ciAiIChSRVQ6IKZWpFWkQKbmLCCqxaXVweQ6IKRArbYsIGQ6IKVirbYsIHE6IML3tn0pIgorCisjOiBtZXNzYWdlLmM6MjUwOCBtZXNzYWdlLmM6MjUyMworbXNnaWQgIlF1ZXN0aW9uIgorbXNnc3RyICKw3cNEIgorCisjOiBtZXNzYWdlLmM6MjUxMAorbXNnaWQgIiIKKyImWWVzXG4iCisiJk5vIgorbXNnc3RyICIiCisiJlmsT1xuIgorIiZOp18iCisKKyM6IG1lc3NhZ2UuYzoyNTQzCittc2dpZCAiIgorIiZZZXNcbiIKKyImTm9cbiIKKyJTYXZlICZBbGxcbiIKKyImRGlzY2FyZCBBbGxcbiIKKyImQ2FuY2VsIgorbXNnc3RyICIiCisiJlmsT1xuIgorIiZOp19cbiIKKyImQaX+s6Gmc8DJXG4iCisiJkSl/rOhpKOmc1xuIgorIiZDqPqu+CIKKworIzogbWVzc2FnZS5jOjI1ODQKK21zZ2lkICJTYXZlIEZpbGUgZGlhbG9nIgorbXNnc3RyICKmc8DJIgorCisjOiBtZXNzYWdlLmM6MjU4NgorbXNnaWQgIk9wZW4gRmlsZSBkaWFsb2ciCittc2dzdHIgIrZ9wMkiCisKKyMuIFRPRE86IG5vbi1HVUkgZmlsZSBzZWxlY3RvciBoZXJlCisjOiBtZXNzYWdlLmM6MjY1NworbXNnaWQgIkUzMzg6IFNvcnJ5LCBubyBmaWxlIGJyb3dzZXIgaW4gY29uc29sZSBtb2RlIgorbXNnc3RyICJFMzM4OiClRLGxpXgoQ29uc29sZSm80qahrsmoU6azwMmu18JzxP2+uShmaWxlIGJyb3dzZXIpIgorCisjOiBtaXNjMS5jOjI0NzcKK21zZ2lkICJXMTA6IFdhcm5pbmc6IENoYW5naW5nIGEgcmVhZG9ubHkgZmlsZSIKK21zZ3N0ciAiVzEwOiCqYLdOOiCnQaW/pmKt16fvpECt07DfxarAySIKKworIzogbWlzYzEuYzoyNzEyCittc2dpZCAiMSBtb3JlIGxpbmUiCittc2dzdHIgIsHZprOkQKbmIgorCisjOiBtaXNjMS5jOjI3MTQKK21zZ2lkICIxIGxpbmUgbGVzcyIKK21zZ3N0ciAipNap86RApuYiCisKKyM6IG1pc2MxLmM6MjcxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbW9yZSBsaW5lcyIKK21zZ3N0ciAiIMHZprMgJWxkIKbmIgorCisjOiBtaXNjMS5jOjI3MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGZld2VyIGxpbmVzIgorbXNnc3RyICKldbPRICVsZCCm5iIKKworIzogbWlzYzEuYzoyNzI0Cittc2dpZCAiIChJbnRlcnJ1cHRlZCkiCittc2dzdHIgIiAopHekpMJfKSIKKworIzogbWlzYzEuYzo2MzQ4Cittc2dpZCAiVmltOiBwcmVzZXJ2aW5nIGZpbGVzLi4uXG4iCittc2dzdHIgIlZpbTogq0+vZMDJrtekpC4uLlxuIgorCisjLiBjbG9zZSBhbGwgbWVtZmlsZXMsIHdpdGhvdXQgZGVsZXRpbmcKKyM6IG1pc2MxLmM6NjM1OAorbXNnaWQgIlZpbTogRmluaXNoZWQuXG4iCittc2dzdHIgIlZpbTogtbKn9C5cbiIKKworIzogbWlzYzIuYzo2NzAgbWlzYzIuYzo2ODYKK21zZ2lkICJFUlJPUjogIgorbXNnc3RyICK/+bt+OiAiCisKKyM6IG1pc2MyLmM6NjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJbYnl0ZXNdIHRvdGFsIGFsbG9jLWZyZWVkICVsdS0lbHUsIGluIHVzZSAlbHUsIHBlYWsgdXNlICVsdVxuIgorbXNnc3RyICIiCisiXG4iCisiW2J5dGVzXSCl/rOhIGFsbG9jLWZyZWVkICVsdS0lbHUsIKjPpc6kpCAlbHUsIHBlYWsgqM+lziAlbHVcbiIKKworIzogbWlzYzIuYzo2OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIltjYWxsc10gdG90YWwgcmUvbWFsbG9jKCkncyAlbHUsIHRvdGFsIGZyZWUoKSdzICVsdVxuIgorIlxuIgorbXNnc3RyICIiCisiW6lJpXNdIKX+s6EgcmUvbWFsbG9jKCk6ICVsdSwgpf6zoSBmcmVlKCknOiAlbHVcbiIKKyJcbiIKKworIzogbWlzYzIuYzo3NDcKK21zZ2lkICJFMzQwOiBMaW5lIGlzIGJlY29taW5nIHRvbyBsb25nIgorbXNnc3RyICJFMzQwOiCmuabmuUyq+CIKKworIzogbWlzYzIuYzo3OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0MTogSW50ZXJuYWwgZXJyb3I6IGxhbGxvYyglbGQsICkiCittc2dzdHIgIkUzNDE6IKS6s6G/+bt+OiBsYWxsb2MoJWxkLCApIgorCisjOiBtaXNjMi5jOjg5OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzQyOiBPdXQgb2YgbWVtb3J5ISAgKGFsbG9jYXRpbmcgJWx1IGJ5dGVzKSIKK21zZ3N0ciAiRTM0MjogsE++0MXppKOorCEgKLnBuNWwdLhtICVsdSCm7KS4stUpIgorCisjOiBtaXNjMi5jOjI1NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FsbGluZyBzaGVsbCB0byBleGVjdXRlOiBcIiVzXCIiCittc2dzdHIgIqlJpXMgc2hlbGwgsPWm5jogXCIlc1wiIgorCisjOiBtaXNjMi5jOjI3ODUKK21zZ2lkICJFNTQ1OiBNaXNzaW5nIGNvbG9uIgorbXNnc3RyICJFNTQ1OiCvyqTWIGNvbG9uIgorCisjOiBtaXNjMi5jOjI3ODcgbWlzYzIuYzoyODE0Cittc2dpZCAiRTU0NjogSWxsZWdhbCBtb2RlIgorbXNnc3RyICJFNTQ2OiCko6W/vVSqurzSpqEiCisKKyM6IG1pc2MyLmM6Mjg1MworbXNnaWQgIkU1NDc6IElsbGVnYWwgbW91c2VzaGFwZSIKK21zZ3N0ciAiRTU0NzogpKOlv71Uqrq3xrmrp86qrCIKKworIzogbWlzYzIuYzoyODkzCittc2dpZCAiRTU0ODogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NDg6IMCzuNOtbqazvMamciIKKworIzogbWlzYzIuYzoyODk4Cittc2dpZCAiRTU0OTogSWxsZWdhbCBwZXJjZW50YWdlIgorbXNnc3RyICJFNTQ5OiCko6W/vVSquqbKpMCk8SIKKworIzogbWlzYzIuYzozMjA4Cittc2dpZCAiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIKK21zZ3N0ciAiv+mkSrFLvVg6ICIKKworIzogbWlzYzIuYzozMjA5Cittc2dpZCAiRW50ZXIgc2FtZSBrZXkgYWdhaW46ICIKK21zZ3N0ciAivdCmQb/ppEqkQKa4OiAiCisKKyM6IG1pc2MyLmM6MzIxOQorbXNnaWQgIktleXMgZG9uJ3QgbWF0Y2ghIgorbXNnc3RyICKo4qa4v+mkSrFLvViko6zbplAhIgorCisjOiBtaXNjMi5jOjM3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkUzNDM6IEludmFsaWQgcGF0aDogJyoqW251bWJlcl0nIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBvciBiZSAiCisiZm9sbG93ZWQgYnkgJyVzJy4iCittc2dzdHIgIkUzNDM6IKSjpb+9VKq6uPSufDogJyoqW251bWJlcl0nIKWyu92tbqZiuPSufLWyp8Cpzq1usbW12yAnJXMnIgorCisjOiBtaXNjMi5jOjUwNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NDogQ2FuJ3QgZmluZCBkaXJlY3RvcnkgXCIlc1wiIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NDogY2RwYXRoIKSkqFOms6XYv/0gXCIlc1wiIgorCisjOiBtaXNjMi5jOjUwNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NTogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIgorbXNnc3RyICJFMzQ1OiCmYrj0rnykpKfkpKOo7MDJrtcgXCIlc1wiIgorCisjOiBtaXNjMi5jOjUwNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM0NjogTm8gbW9yZSBkaXJlY3RvcnkgXCIlc1wiIGZvdW5kIGluIGNkcGF0aCIKK21zZ3N0ciAiRTM0NjogpmK49K58pKSn5KSjqOyn86ZoqrrAya7XIFwiJXNcIiIKKworIzogbWlzYzIuYzo1MDU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNDc6IE5vIG1vcmUgZmlsZSBcIiVzXCIgZm91bmQgaW4gcGF0aCIKK21zZ3N0ciAiRTM0NzogpmK49K58pKSn5KSjqOyn86ZoqrrAya7XIFwiJXNcIiIKKworIzogbWlzYzIuYzo1MjkwCittc2dpZCAiRTU1MDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTU1MDogr8qk1iBjb2xvbiIKKworIzogbWlzYzIuYzo1MzAyCittc2dpZCAiRTU1MTogSWxsZWdhbCBjb21wb25lbnQiCittc2dzdHIgIkU1NTE6IKSjpb+9VKq6vNKmoSIKKworIzogbWlzYzIuYzo1MzEwCittc2dpZCAiRTU1MjogZGlnaXQgZXhwZWN0ZWQiCittc2dzdHIgIkU1NTI6IMCzuNOtbqazvMamciIKKworIy4gR2V0IGhlcmUgd2hlbiB0aGUgc2VydmVyIGNhbid0IGJlIGZvdW5kLgorIzogbmV0YmVhbnMuYzoyODMKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyAjMiIKK21zZ3N0ciAitUyqa7NzsbWo7CBOZXRiZWFucyAjMiIKKworIzogbmV0YmVhbnMuYzoyOTEKK21zZ2lkICJDYW5ub3QgY29ubmVjdCB0byBOZXRiZWFucyIKK21zZ3N0ciAitUyqa7NzsbWo7CBOZXRiZWFucyIKKworIzogbmV0YmVhbnMuYzo1NjUKK21zZ2lkICJyZWFkIGZyb20gTmV0YmVhbnMgc29ja2V0IgorbXNnc3RyICKl0SBOZXRiZWFucyBzb2NrZXQgxaqo+iIKKworIzogbm9ybWFsLmM6MjkxMworbXNnaWQgIldhcm5pbmc6IHRlcm1pbmFsIGNhbm5vdCBoaWdobGlnaHQiCittc2dzdHIgIqpgt046IKdBqrqy17rdvve1TKprxeOl3LCqq0er1yIKKworIzogbm9ybWFsLmM6MzEyOAorbXNnaWQgIkUzNDg6IE5vIHN0cmluZyB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDg6ILTlvNCzQqhTprOmcqbqIgorCisjOiBub3JtYWwuYzozMTMwCittc2dpZCAiRTM0OTogTm8gaWRlbnRpZmllciB1bmRlciBjdXJzb3IiCittc2dzdHIgIkUzNDk6ILTlvNCzQqhTprPD0adPpnIiCisKKyM6IG5vcm1hbC5jOjQzNDgKK21zZ2lkICJFMzUyOiBDYW5ub3QgZXJhc2UgZm9sZHMgd2l0aCBjdXJyZW50ICdmb2xkbWV0aG9kJyIKK21zZ3N0ciAiRTM1MjogtUyqa6ZipdirZaq6ICdmb2xkbWV0aG9kJyCkVadSsKMgZm9sZCIKKworIzogb3BzLmM6Mjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIjEgbGluZSAlc2VkIDEgdGltZSIKK21zZ3N0ciAipECm5iAlcyC5TCCkQKa4IgorCisjOiBvcHMuYzoyOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiMSBsaW5lICVzZWQgJWQgdGltZXMiCittc2dzdHIgIqRApuYgJXMguUwgJWQgprgiCisKKyM6IG9wcy5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlbGQgbGluZXMgJXNlZCAxIHRpbWUiCittc2dzdHIgIiVsZCCm5iAlcyC5TCCkQKa4IgorCisjOiBvcHMuYzozMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzICVzZWQgJWQgdGltZXMiCittc2dzdHIgIiVsZCCm5iAlcyC5TCAlZCCmuCIKKworIzogb3BzLmM6NjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyB0byBpbmRlbnQuLi4gIgorbXNnc3RyICLBWbHGICVsZCCm5i4uLiIKKworIzogb3BzLmM6NzEzCittc2dpZCAiMSBsaW5lIGluZGVudGVkICIKK21zZ3N0ciAipECm5qR3wVmxxiIKKworIzogb3BzLmM6NzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVsZCBsaW5lcyBpbmRlbnRlZCAiCittc2dzdHIgIqR3wVmxxiAlbGQgpuYiCisKKyMuIG11c3QgZGlzcGxheSB0aGUgcHJvbXB0CisjOiBvcHMuYzoxNjQ1Cittc2dpZCAiY2Fubm90IHlhbms7IGRlbGV0ZSBhbnl3YXkiCittc2dzdHIgIrVMqmuwxaRVOyCqvbG1p1KwoyIKKworIzogb3BzLmM6MjE1MgorbXNnaWQgIjEgbGluZSBjaGFuZ2VkIgorbXNnc3RyICIgMSCm5iB+ZWQiCisKKyM6IG9wcy5jOjIxNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIGNoYW5nZWQiCittc2dzdHIgIiAlbGQgpuYgfmVkIgorCisjOiBvcHMuYzoyNTM4CisjLCBjLWZvcm1hdAorbXNnaWQgImZyZWVpbmcgJWxkIGxpbmVzIgorbXNnc3RyICLEwKnxICVsZCCm5qSkIgorCisjOiBvcHMuYzoyODE5Cittc2dpZCAiMSBsaW5lIHlhbmtlZCIKK21zZ3N0ciAipHe9xrtzIDEgpuYiCisKKyM6IG9wcy5jOjI4MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGxpbmVzIHlhbmtlZCIKK21zZ3N0ciAipHe9xrtzICVsZCCm5iIKKworIzogb3BzLmM6MzEwNgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzUzOiBOb3RoaW5nIGluIHJlZ2lzdGVyICVzIgorbXNnc3RyICJFMzUzOiC8yKZzvrkgJXMguMyoU6azqkam6CIKKworIy4gSGlnaGxpZ2h0IHRpdGxlCisjOiBvcHMuYzozNjY0Cittc2dpZCAiIgorIlxuIgorIi0tLSBSZWdpc3RlcnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tILzIpnO+uSAtLS0iCisKKyM6IG9wcy5jOjQ4NzMKK21zZ2lkICJJbGxlZ2FsIHJlZ2lzdGVyIG5hbWUiCittc2dzdHIgIqSjpb+9VKq6vMimc765ple62SIKKworIzogb3BzLmM6NDk1OQorbXNnaWQgIiIKKyJcbiIKKyIjIFJlZ2lzdGVyczpcbiIKK21zZ3N0ciAiIgorIlxuIgorIiMgvMimc765OlxuIgorCisjOiBvcHMuYzo0OTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NzQ6IFVua25vd24gcmVnaXN0ZXIgdHlwZSAlZCIKK21zZ3N0ciAiRTU3NDogpbyqvqq6tfmlVausukE6ICVkIgorCisjOiBvcHMuYzo1NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNTQ6IEludmFsaWQgcmVnaXN0ZXIgbmFtZTogJyVzJyIKK21zZ3N0ciAiRTM1NDogvMimc765ple62b/5u346ICclcyciCisKKyM6IG9wcy5jOjU3NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIENvbHM7ICIKK21zZ3N0ciAiJWxkIMTmOyAiCisKKyM6IG9wcy5jOjU3NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VsZWN0ZWQgJXMlbGQgb2YgJWxkIExpbmVzOyAlbGQgb2YgJWxkIFdvcmRzOyAlbGQgb2YgJWxkIEJ5dGVzIgorbXNnc3RyICK/777cpEYgJXMlbGQvJWxkIKbmOyAlbGQvJWxkIKZyKFdvcmQpOyAlbGQvJWxkIKZypLgoQnl0ZXMpIgorCisjOiBvcHMuYzo1NzczCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbCAlcyBvZiAlczsgTGluZSAlbGQgb2YgJWxkOyBXb3JkICVsZCBvZiAlbGQ7IEJ5dGUgJWxkIG9mICVsZCIKK21zZ3N0ciAixOYgJXMvJXM7IKbmICVsZC8lbGQ7IKZyKFdvcmQpICVsZC8lbGQ7IKZypLgoQnl0ZSkgJWxkLyVsZCIKKworIzogb3BzLmM6NTc4NAorIywgYy1mb3JtYXQKK21zZ2lkICIoKyVsZCBmb3IgQk9NKSIKK21zZ3N0ciAiKCslbGQgZm9yIEJPTSkiCisKKyM6IG9wdGlvbi5jOjE1NzkKK21zZ2lkICIlPCVmJWglbSU9UGFnZSAlTiIKK21zZ3N0ciAiJTwlZiVoJW0lPbLEICVOIK22IgorCisjID8gd2hhdCdzIHRoaXMgZm9yPworIzogb3B0aW9uLmM6MjAxMgorbXNnaWQgIlRoYW5rcyBmb3IgZmx5aW5nIFZpbSIKK21zZ3N0ciAit1DBwrF6t1KlziBWaW0iCisKKyM6IG9wdGlvbi5jOjMyNTAgb3B0aW9uLmM6MzM1NworbXNnaWQgIkU1MTg6IFVua25vd24gb3B0aW9uIgorbXNnc3RyICJFNTE4OiCko6W/vVSqur/vtrUiCisKKyM6IG9wdGlvbi5jOjMyNjMKK21zZ2lkICJFNTE5OiBPcHRpb24gbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiRTUxOTogpKOk5LSpuNO/77a1IgorCisjOiBvcHRpb24uYzozMjg4Cittc2dpZCAiRTUyMDogTm90IGFsbG93ZWQgaW4gYSBtb2RlbGluZSIKK21zZ3N0ciAiRTUyMDogpKOv4KZiIE1vZGVsaW5lILjMpViyeyIKKworIzogb3B0aW9uLmM6MzM0NAorbXNnaWQgIiIKKyJcbiIKKyJcdExhc3Qgc2V0IGZyb20gIgorbXNnc3RyICIiCisiXG4iCisiXHSkV6a4s12pdzogIgorCisjOiBvcHRpb24uYzozNDgzCittc2dpZCAiRTUyMTogTnVtYmVyIHJlcXVpcmVkIGFmdGVyID0iCittc2dzdHIgIkU1MjE6ID0gq+G73a1uprO8xqZyIgorCisjOiBvcHRpb24uYzozNzk3IG9wdGlvbi5jOjQ0MTMKK21zZ2lkICJFNTIyOiBOb3QgZm91bmQgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTUyMjogVGVybWNhcCC4zK2xp+Sko6jsIgorCisjOiBvcHRpb24uYzozODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzk6IElsbGVnYWwgY2hhcmFjdGVyIDwlcz4iCittc2dzdHIgIkU1Mzk6IKSjpb+9VKq6pnKkuCA8JXM+IgorCisjOiBvcHRpb24uYzo0NDA1Cittc2dpZCAiRTUyOTogQ2Fubm90IHNldCAndGVybScgdG8gZW1wdHkgc3RyaW5nIgorbXNnc3RyICJFNTI5OiC1TKprs12pdyAndGVybScgrLCqxaZypuoiCisKKyM6IG9wdGlvbi5jOjQ0MDgKK21zZ2lkICJFNTMwOiBDYW5ub3QgY2hhbmdlIHRlcm0gaW4gR1VJIgorbXNnc3RyICJFNTMwOiCmYrnPq6ysya2xpKS1TKprpMG0qyB0ZXJtIgorCisjOiBvcHRpb24uYzo0NDEwCittc2dpZCAiRTUzMTogVXNlIFwiOmd1aVwiIHRvIHN0YXJ0IHRoZSBHVUkiCittc2dzdHIgIkU1MzE6IL/ppEogXCI6Z3VpXCIgqNOx0rDKuc+nzqzJrbEiCisKKyM6IG9wdGlvbi5jOjQ0MzEKK21zZ2lkICJFNTg5OiAnYmFja3VwZXh0JyBhbmQgJ3BhdGNobW9kZScgYXJlIGVxdWFsIgorbXNnc3RyICJFNTg5OiAnYmFja3VwZXh0JyC48iAncGF0Y2htb2RlJyCsT6RAvMuquiIKKworIzogb3B0aW9uLmM6NDYxNgorbXNnaWQgIkU2MTc6IENhbm5vdCBiZSBjaGFuZ2VkIGluIHRoZSBHVEsrIDIgR1VJIgorbXNnc3RyICJFNjE3OiCmYrnPq6ysya2xpKS1TKprpMG0qyB0ZXJtIgorCisjOiBvcHRpb24uYzo0NzQ4Cittc2dpZCAiRTUyNDogTWlzc2luZyBjb2xvbiIKK21zZ3N0ciAiRTUyNDogr8qk1iBjb2xvbiIKKworIzogb3B0aW9uLmM6NDc1MAorbXNnaWQgIkU1MjU6IFplcm8gbGVuZ3RoIHN0cmluZyIKK21zZ3N0ciAiRTUyNToguXOq+KvXpnKm6iIKKworIzogb3B0aW9uLmM6NDgxOAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTI2OiBNaXNzaW5nIG51bWJlciBhZnRlciA8JXM+IgorbXNnc3RyICJFNTI2OiA8JXM+IKvhr8qk1rzGpnIiCisKKyM6IG9wdGlvbi5jOjQ4MzIKK21zZ2lkICJFNTI3OiBNaXNzaW5nIGNvbW1hIgorbXNnc3RyICJFNTI3OiCvyqTWs3K4uSIKKworIzogb3B0aW9uLmM6NDgzOQorbXNnaWQgIkU1Mjg6IE11c3Qgc3BlY2lmeSBhICcgdmFsdWUiCittc2dzdHIgIkU1Mjg6IKWyu92r/Kl3pECt0yAnIK3IIgorCisjOiBvcHRpb24uYzo0ODgwCittc2dpZCAiRTU5NTogY29udGFpbnMgdW5wcmludGFibGUgb3Igd2lkZSBjaGFyYWN0ZXIiCittc2dzdHIgIkU1OTU6IKS6p3S1TKprxeOl3Kq6pnKkuCIKKworIzogb3B0aW9uLmM6NDkyOQorbXNnaWQgIkU1OTY6IEludmFsaWQgZm9udChzKSIKK21zZ3N0ciAiRTU5NjogpKOlv71UqrqmcqusIgorCisjOiBvcHRpb24uYzo0OTM3Cittc2dpZCAiRTU5NzogY2FuJ3Qgc2VsZWN0IGZvbnRzZXQiCittc2dzdHIgIkU1OTc6ILVMqmuoz6XOpnKrrLawKEZvbnRzZXQpIgorCisjOiBvcHRpb24uYzo0OTM5Cittc2dpZCAiRTU5ODogSW52YWxpZCBmb250c2V0IgorbXNnc3RyICJFNTk4OiCko6W/vVSquqZyq6y2sChGb250c2V0KSIKKworIzogb3B0aW9uLmM6NDk0NgorbXNnaWQgIkU1MzM6IGNhbid0IHNlbGVjdCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzM6ILVMqmuoz6XOs12pd6q6pKSk5aZyq6woV2lkZWZvbnQpIgorCisjOiBvcHRpb24uYzo0OTQ4Cittc2dpZCAiRTUzNDogSW52YWxpZCB3aWRlIGZvbnQiCittc2dzdHIgIkU1MzQ6IKSjpb+9VKq6pnKrrChXaWRlZm9udCkiCisKKyM6IG9wdGlvbi5jOjUyMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzNTogSWxsZWdhbCBjaGFyYWN0ZXIgYWZ0ZXIgPCVjPiIKK21zZ3N0ciAiRTUzNTogPCVjPiCr4aazpKOlv71UqrqmcqS4IgorCisjOiBvcHRpb24uYzo1MzIyCittc2dpZCAiRTUzNjogY29tbWEgcmVxdWlyZWQiCittc2dzdHIgIkU1MzY6ILvdrW6zcri5IgorCisjOiBvcHRpb24uYzo1MzMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyBtdXN0IGJlIGVtcHR5IG9yIGNvbnRhaW4gJXMiCittc2dzdHIgIkU1Mzc6ICdjb21tZW50c3RyaW5nJyClsrvdrE+qxaXVqc6lXad0ICVzIgorCisjOiBvcHRpb24uYzo1Mzc3Cittc2dpZCAiRTUzODogTm8gbW91c2Ugc3VwcG9ydCIKK21zZ3N0ciAiRTUzODogpKOk5LSpt8a5qyIKKworIzogb3B0aW9uLmM6NTY0NQorbXNnaWQgIkU1NDA6IFVuY2xvc2VkIGV4cHJlc3Npb24gc2VxdWVuY2UiCittc2dzdHIgIkU1NDA6IKhTprO1sqf0qrq5QrripqE6ICIKKworIzogb3B0aW9uLmM6NTY0OQorbXNnaWQgIkU1NDE6IHRvbyBtYW55IGl0ZW1zIgorbXNnc3RyICJFNTQxOiCk06ZotrWl2CIKKworIzogb3B0aW9uLmM6NTY1MQorbXNnaWQgIkU1NDI6IHVuYmFsYW5jZWQgZ3JvdXBzIgorbXNnc3RyICJFNTQyOiCko7nvutmquiBncm91cCIKKworIzogb3B0aW9uLmM6NTg3MgorbXNnaWQgIkU1OTA6IEEgcHJldmlldyB3aW5kb3cgYWxyZWFkeSBleGlzdHMiCittc2dzdHIgIkU1OTA6ILl3tfiqurX4taGkd7hnpnOmYqRGIgorCisjOiBvcHRpb24uYzo2MzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTM6IE5lZWQgYXQgbGVhc3QgJWQgbGluZXMiCittc2dzdHIgIkU1OTM6IKbcpNa73a1uICVkIKbmIgorCisjOiBvcHRpb24uYzo2MzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1OTQ6IE5lZWQgYXQgbGVhc3QgJWQgY29sdW1ucyIKK21zZ3N0ciAiRTU5NDogptyk1rvdrW4gJWQgxOYiCisKKyM6IG9wdGlvbi5jOjY2NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NTogVW5rbm93biBvcHRpb246ICVzIgorbXNnc3RyICJFMzU1OiCko6W/vVSqur/vtrU6ICVzIgorCisjOiBvcHRpb24uYzo2NzY5Cittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBjb2RlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gste63b73vVggLS0tIgorCisjOiBvcHRpb24uYzo2NzcxCittc2dpZCAiIgorIlxuIgorIi0tLSBHbG9iYWwgb3B0aW9uIHZhbHVlcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gR2xvYmFsIL/vtrWtyCAtLS0iCisKKyM6IG9wdGlvbi5jOjY3NzMKK21zZ2lkICIiCisiXG4iCisiLS0tIExvY2FsIG9wdGlvbiB2YWx1ZXMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIExvY2FsIL/vtrWtyCAtLS0iCisKKyM6IG9wdGlvbi5jOjY3NzUKK21zZ2lkICIiCisiXG4iCisiLS0tIE9wdGlvbnMgLS0tIgorbXNnc3RyICIiCisiXG4iCisiLS0tIL/vtrUgLS0tIgorCisjOiBvcHRpb24uYzo3NDY3Cittc2dpZCAiRTM1NjogZ2V0X3ZhcnAgRVJST1IiCittc2dzdHIgIkUzNTY6IGdldF92YXJwIL/5u34iCisKKyM6IG9wdGlvbi5jOjg0MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1NzogJ2xhbmdtYXAnOiBNYXRjaGluZyBjaGFyYWN0ZXIgbWlzc2luZyBmb3IgJXMiCittc2dzdHIgIkUzNTc6ICdsYW5nbWFwJzogp+Sko6jsICVzILnvwLOquqZypLgiCisKKyM6IG9wdGlvbi5jOjg0NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM1ODogJ2xhbmdtYXAnOiBFeHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHNlbWljb2xvbjogJXMiCittc2dzdHIgIkUzNTg6ICdsYW5nbWFwJzogpMC4uavhprOmaL5sqrqmcqS4OiAlcyIKKworIzogb3NfYW1pZ2EuYzoyNzMKK21zZ2lkICJjYW5ub3Qgb3BlbiAiCittc2dzdHIgIqSjr+C2fbHSIgorCisjOiBvc19hbWlnYS5jOjMwNworbXNnaWQgIlZJTTogQ2FuJ3Qgb3BlbiB3aW5kb3chXG4iCittc2dzdHIgIlZJTTogtUyqa7Z9sdK1+LWhIVxuIgorCisjOiBvc19hbWlnYS5jOjMyOQorbXNnaWQgIk5lZWQgQW1pZ2Fkb3MgdmVyc2lvbiAyLjA0IG9yIGxhdGVyXG4iCittc2dzdHIgIrvdrW4gQW1pZ2Fkb3MgqqmluyAyLjA0IKVIpFdcbiIKKworIzogb3NfYW1pZ2EuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmVlZCAlcyB2ZXJzaW9uICVsZFxuIgorbXNnc3RyICK73a1uICVzIKqppbsgJWxkXG4iCisKKyM6IG9zX2FtaWdhLmM6NDA3Cittc2dpZCAiQ2Fubm90IG9wZW4gTklMOlxuIgorbXNnc3RyICK1TKprtn2x0iBOSUw6XG4iCisKKyM6IG9zX2FtaWdhLmM6NDE4Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSAiCittc2dzdHIgIqSjr+Cr2KXfICIKKworIzogb3NfYW1pZ2EuYzo4OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltIGV4aXRpbmcgd2l0aCAlZFxuIgorbXNnc3RyICJWaW0gtbKn9LbHpl6tyDogJWRcbiIKKworIzogb3NfYW1pZ2EuYzo5MjgKK21zZ2lkICJjYW5ub3QgY2hhbmdlIGNvbnNvbGUgbW9kZSA/IVxuIgorbXNnc3RyICK1TKprpMG0q6VEsbGleChjb25zb2xlKbzSpqEgIT9cbiIKKworIzogb3NfYW1pZ2EuYzo5OTQKK21zZ2lkICJtY2hfZ2V0X3NoZWxsc2l6ZTogbm90IGEgY29uc29sZT8/XG4iCittc2dzdHIgIm1jaF9nZXRfc2hlbGxzaXplOiCko6xPpUSxsaV4KGNvbnNvbGUpPz9cbiIKKworIy4gaWYgVmltIG9wZW5lZCBhIHdpbmRvdzogRXhlY3V0aW5nIGEgc2hlbGwgbWF5IGNhdXNlIGNyYXNoZXMKKyM6IG9zX2FtaWdhLmM6MTE0MworbXNnaWQgIkUzNjA6IENhbm5vdCBleGVjdXRlIHNoZWxsIHdpdGggLWYgb3B0aW9uIgorbXNnc3RyICJFMzYwOiCko6/gpc4gLWYgv++2tbD1puYgc2hlbGwiCisKKyM6IG9zX2FtaWdhLmM6MTE4NCBvc19hbWlnYS5jOjEyNzQKK21zZ2lkICJDYW5ub3QgZXhlY3V0ZSAiCittc2dzdHIgIqSjr+Cw9abmICIKKworIzogb3NfYW1pZ2EuYzoxMTg3IG9zX2FtaWdhLmM6MTI4NAorbXNnaWQgInNoZWxsICIKK21zZ3N0ciAic2hlbGwgIgorCisjOiBvc19hbWlnYS5jOjEyMDcgb3NfYW1pZ2EuYzoxMzA5Cittc2dpZCAiIHJldHVybmVkXG4iCittc2dzdHIgIiCkd6rwpl5cbiIKKworIzogb3NfYW1pZ2EuYzoxNDUwCittc2dpZCAiQU5DSE9SX0JVRl9TSVpFIHRvbyBzbWFsbC4iCittc2dzdHIgIkFOQ0hPUl9CVUZfU0laRSCk06RwIgorCisjOiBvc19hbWlnYS5jOjE0NTQKK21zZ2lkICJJL08gRVJST1IiCittc2dzdHIgIkkvTyC/+bt+IgorCisjOiBvc19tc3dpbi5jOjUxNQorbXNnaWQgIi4uLih0cnVuY2F0ZWQpIgorbXNnc3RyICIuLi4opHekwbG8KSIKKworIzogb3NfbXN3aW4uYzo2MTcKK21zZ2lkICInY29sdW1ucycgaXMgbm90IDgwLCBjYW5ub3QgZXhlY3V0ZSBleHRlcm5hbCBjb21tYW5kcyIKK21zZ3N0ciAiJ2NvbHVtbnMnIKSjrE8gODAsILVMqmuw9abmpX6zoalSpU8iCisKKyM6IG9zX21zd2luLmM6MTgwMgorbXNnaWQgIkUyMzc6IFByaW50ZXIgc2VsZWN0aW9uIGZhaWxlZCIKK21zZ3N0ciAiRTIzNzogtUyqa7/vvtymuaZMqu2+9yIKKworIzogb3NfbXN3aW4uYzoxODQyCisjLCBjLWZvcm1hdAorbXNnaWQgInRvICVzIG9uICVzIgorbXNnc3RyICKo7CAlcyBvbiAlcyIKKworIzogb3NfbXN3aW4uYzoxODU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTM6IFVua25vd24gcHJpbnRlciBmb250OiAlcyIKK21zZ3N0ciAiRTYxMzogpKOlv71UqrqmTKrtvvemcqusOiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTA3IG9zX21zd2luLmM6MTkxNworIywgYy1mb3JtYXQKK21zZ2lkICJFMjM4OiBQcmludCBlcnJvcjogJXMiCittc2dzdHIgIkUyMzg6IKZDpky/+bt+OiAlcyIKKworIzogb3NfbXN3aW4uYzoxOTE4Cittc2dpZCAiVW5rbm93biIKK21zZ3N0ciAipbyqviIKKworIzogb3NfbXN3aW4uYzoxOTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIlByaW50aW5nICclcyciCittc2dzdHIgIqZDpkykpDogJyVzJyIKKworIzogb3NfbXN3aW4uYzozMDMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDQ6IElsbGVnYWwgY2hhcnNldCBuYW1lIFwiJXNcIiBpbiBmb250IG5hbWUgXCIlc1wiIgorbXNnc3RyICJFMjQ0OiCmcqS4trAgXCIlc1wiILVMqmu578CzpnKrrFwiJXNcIiIKKworIzogb3NfbXN3aW4uYzozMDQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkUyNDU6IElsbGVnYWwgY2hhciAnJWMnIGluIGZvbnQgbmFtZSBcIiVzXCIiCittc2dzdHIgIkUyNDU6IKSjpb+9VKq6pnKkuCAnJWMnIKVYsnumYqZyq6ymV7rZIFwiJXNcIiCkuiIKKworIzogb3NfcmlzY29zLmM6MTI1OAorbXNnaWQgIkUzNjY6IEludmFsaWQgJ29zZmlsZXR5cGUnIG9wdGlvbiAtIHVzaW5nIFRleHQiCittc2dzdHIgIkUzNjY6IKSjpb+9VKq6ICdmaWxldHlwZScgv++2tSAtIKjPpc6vwqTlpnK80qahIgorCisjOiBvc191bml4LmM6ODcxCittc2dpZCAiVmltOiBEb3VibGUgc2lnbmFsLCBleGl0aW5nXG4iCittc2dzdHIgIlZpbTogwvmtq3NpZ25hbCwgwve2faSkXG4iCisKKyM6IG9zX3VuaXguYzo4NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbCAlc1xuIgorbXNnc3RyICJWaW06IENWaW06IMRkukmo7KtIuLkoc2lnbmFsKSAlc1xuIgorCisjOiBvc191bml4LmM6ODgwCittc2dpZCAiVmltOiBDYXVnaHQgZGVhZGx5IHNpZ25hbFxuIgorbXNnc3RyICJWaW06IMRkukmo7K1QqVKquqtIuLkoZGVhZGx5IHNpZ25hbGUpXG4iCisKKyM6IG9zX3VuaXguYzoxMTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0b29rICVsZCBtc2VjIgorbXNnc3RyICK2fbHSIFggV2luZG93IK/TrskgJWxkIG1zZWMiCisKKyM6IG9zX3VuaXguYzoxMTcwCittc2dpZCAiIgorIlxuIgorIlZpbTogR290IFggZXJyb3JcbiIKK21zZ3N0ciAiIgorIlxuIgorIlZpbTogWCC/+bt+XG4iCisKKyM6IG9zX3VuaXguYzoxMjc2Cittc2dpZCAiVGVzdGluZyB0aGUgWCBkaXNwbGF5IGZhaWxlZCIKK21zZ3N0ciAitPq41SBYIFdpbmRvdyClorHRIgorCisjOiBvc191bml4LmM6MTQxNQorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSB0aW1lZCBvdXQiCittc2dzdHIgIrZ9sdIgWCBXaW5kb3cguU+uySIKKworIzogb3NfdW5peC5jOjMxNDUgb3NfdW5peC5jOjM4MjUKK21zZ2lkICIiCisiXG4iCisiQ2Fubm90IGV4ZWN1dGUgc2hlbGwgIgorbXNnc3RyICIiCisiXG4iCisipKOv4LD1puYgc2hlbGwiCisKKyM6IG9zX3VuaXguYzozMTkzCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBleGVjdXRlIHNoZWxsIHNoXG4iCittc2dzdHIgIiIKKyJcbiIKKyKko6/gsPWm5iBzaGVsbCBzaFxuIgorCisjOiBvc191bml4LmM6MzE5NyBvc191bml4LmM6MzgzMQorbXNnaWQgIiIKKyJcbiIKKyJzaGVsbCByZXR1cm5lZCAiCittc2dzdHIgIiIKKyJcbiIKKyJTaGVsbCCkd6rwpl4iCisKKyM6IG9zX3VuaXguYzozMzMyCittc2dpZCAiIgorIlxuIgorIkNhbm5vdCBjcmVhdGUgcGlwZXNcbiIKK21zZ3N0ciAiIgorIlxuIgorIqSjr+Cr2KXfIHBpcGUgut69dVxuIgorCisjOiBvc191bml4LmM6MzM0NworbXNnaWQgIiIKKyJcbiIKKyJDYW5ub3QgZm9ya1xuIgorbXNnc3RyICIiCisiXG4iCisipKOv4CBmb3JrXG4iCisKKyM6IG9zX3VuaXguYzozODM4Cittc2dpZCAiIgorIlxuIgorIkNvbW1hbmQgdGVybWluYXRlZFxuIgorbXNnc3RyICIiCisiXG4iCisiqVKlT6R3ste1slxuIgorCisjOiBvc191bml4LmM6NTM5OAorbXNnaWQgIk9wZW5pbmcgdGhlIFggZGlzcGxheSBmYWlsZWQiCittc2dzdHIgIrZ9sdIgWCBXaW5kb3cgpaKx0SIKKworIzogb3Nfdm1zX21tcy5jOjU5Cittc2dpZCAiQXQgbGluZSIKK21zZ3N0ciAipmKm5ri5ICIKKworIzogb3NfdzMyZXhlLmM6MTY5Cittc2dpZCAiQ291bGQgbm90IGxvYWQgdmltMzIuZGxsISIKK21zZ3N0ciAitUyqa7j8pEogdmltMzIuZGxsoUkiCisKKyM6IG9zX3czMmV4ZS5jOjE2OSBvc193MzJleGUuYzoxNzkKK21zZ2lkICJWSU0gRXJyb3IiCittc2dzdHIgIlZJTSC/+bt+IgorCisjOiBvc193MzJleGUuYzoxNzkKK21zZ2lkICJDb3VsZCBub3QgZml4IHVwIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBETEwhIgorbXNnc3RyICKko6/grdelv6jnpqGr/LzQqOwgRExMISIKKworIzogb3Nfd2luMTYuYzo1ODMgb3Nfd2luMzIuYzozMDQ3CisjLCBjLWZvcm1hdAorbXNnaWQgInNoZWxsIHJldHVybmVkICVkIgorbXNnc3RyICJTaGVsbCC2x6ZercggJWQiCisKKyM6IG9zX3dpbjMyLmM6MjUwNQorIywgYy1mb3JtYXQKK21zZ2lkICJWaW06IENhdWdodCAlcyBldmVudFxuIgorbXNnc3RyICJWaW06IMRkukmo7CAlcyBcbiIKKworIzogb3Nfd2luMzIuYzoyNTA3Cittc2dpZCAiY2xvc2UiCittc2dzdHIgIsP2s6wiCisKKyM6IG9zX3dpbjMyLmM6MjUwOQorbXNnaWQgImxvZ29mZiIKK21zZ3N0ciAitW6lWCIKKworIzogb3Nfd2luMzIuYzoyNTEwCittc2dpZCAic2h1dGRvd24iCittc2dzdHIgIsP2vvciCisKKyM6IG9zX3dpbjMyLmM6MzAwMAorbXNnaWQgIkUzNzE6IENvbW1hbmQgbm90IGZvdW5kIgorbXNnc3RyICJFMzcxOiCn5KSjqOypUqVPIgorCisjOiBvc193aW4zMi5jOjMwMTMKK21zZ2lkICIiCisiVklNUlVOLkVYRSBub3QgZm91bmQgaW4geW91ciAkUEFUSC5cbiIKKyJFeHRlcm5hbCBjb21tYW5kcyB3aWxsIG5vdCBwYXVzZSBhZnRlciBjb21wbGV0aW9uLlxuIgorIlNlZSAgOmhlbHAgd2luMzItdmltcnVuICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittc2dzdHIgIiIKKyKmYqdBqrogJFBBVEggpKSn5KSjqOwgVklNUlVOLkVYRS5cbiIKKyKlfrOhqVKlT7D1puanubKmq+GxTqSjt3y8yLCxLlxuIgorIrZppECoQruhqfq90LD1puYgOmhlbHAgd2luMzItdmltcnVuICIKKworIzogb3Nfd2luMzIuYzozMDE2Cittc2dpZCAiVmltIFdhcm5pbmciCittc2dzdHIgIlZpbSDEtadpIgorCisjOiBxdWlja2ZpeC5jOjI1OAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcyOiBUb28gbWFueSAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzI6IK7mpqGkxqZypuq4zKazpNOmaCAlJSVjICIKKworIzogcXVpY2tmaXguYzoyNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3MzogVW5leHBlY3RlZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzM6IK7mpqGkxqZypuqko8CzuNOlWLJ7ICUlJWMgIgorCisjOiBxdWlja2ZpeC5jOjMyNQorbXNnaWQgIkUzNzQ6IE1pc3NpbmcgXSBpbiBmb3JtYXQgc3RyaW5nIgorbXNnc3RyICJFMzc0OiCu5qahpMamcqbquMyk1qRGIF0iCisKKyM6IHF1aWNrZml4LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIKK21zZ3N0ciAiRTM3NTogruamoaTGpnKm6rjMprOko6TktKmquiAlJSVjICIKKworIzogcXVpY2tmaXguYzozNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NjogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmcgcHJlZml4IgorbXNnc3RyICJFMzc2OiCu5qahpMamcqbqtn3AWbjMprOko6W/vVSquiAlJSVjICIKKworIzogcXVpY2tmaXguYzozNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciCittc2dzdHIgIkUzNzc6IK7mpqGkxqZypuq4zKazpKOlv71UqrogJSUlYyAiCisKKyM6IHF1aWNrZml4LmM6MzkxCittc2dpZCAiRTM3ODogJ2Vycm9yZm9ybWF0JyBjb250YWlucyBubyBwYXR0ZXJuIgorbXNnc3RyICJFMzc4OiAnZXJyb3Jmb3JtYXQnIKW8s12pdyIKKworIzogcXVpY2tmaXguYzo0OTcKK21zZ2lkICJFMzc5OiBNaXNzaW5nIG9yIGVtcHR5IGRpcmVjdG9yeSBuYW1lIgorbXNnc3RyICJFMzc5OiCn5KSjqOyl2L/9ple62anOrE+qxaq6pdi//aZXutkiCisKKyM6IHF1aWNrZml4LmM6OTc5Cittc2dpZCAiRTU1MzogTm8gbW9yZSBpdGVtcyIKK21zZ3N0ciAiRTU1MzogqFOms6jkpaa2taXYIgorCisjOiBxdWlja2ZpeC5jOjEyMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiKCVkIG9mICVkKSVzJXM6ICIKK21zZ3N0ciAiKCVkIC8gJWQpJXMlczogIgorCisjOiBxdWlja2ZpeC5jOjEyMDIKK21zZ2lkICIgKGxpbmUgZGVsZXRlZCkiCittc2dzdHIgIiAopuakd6dSsKMpIgorCisjOiBxdWlja2ZpeC5jOjE0MTIKK21zZ2lkICJFMzgwOiBBdCBib3R0b20gb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODA6IFF1aWNrZml4ILDvxXy1sqfAIgorCisjOiBxdWlja2ZpeC5jOjE0MjEKK21zZ2lkICJFMzgxOiBBdCB0b3Agb2YgcXVpY2tmaXggc3RhY2siCittc2dzdHIgIkUzODE6IFF1aWNrZml4ILDvxXyzu7rdIgorCisjOiBxdWlja2ZpeC5jOjE0MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIgorbXNnc3RyICK/+bt+pkOq7SAlZC8lZDsgpkCmsyAlZCC2tb/5u34iCisKKyM6IHF1aWNrZml4LmM6MTkwNAorbXNnaWQgIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiCittc2dzdHIgIkUzODI6ILVMqmu8Z6RKoUEnYnVmdHlwZScgv++2taR3s12pdyIKKworIzogcmVnZXhwLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzNjk6IGludmFsaWQgaXRlbSBpbiAlcyUlW10iCittc2dzdHIgIkUzNjk6IKSjpb+9VKq6trWl2KFHICVzJSVbXSIKKworIzogcmVnZXhwLmM6ODI2Cittc2dpZCAiRTMzOTogUGF0dGVybiB0b28gbG9uZyIKK21zZ3N0ciAiRTMzOTogplemcqTTqvgiCisKKyM6IHJlZ2V4cC5jOjk5NQorbXNnaWQgIkU1MDogVG9vIG1hbnkgXFx6KCIKK21zZ3N0ciAiRTUwOiCk06ZoIFxceigiCisKKyM6IHJlZ2V4cC5jOjEwMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUxOiBUb28gbWFueSAlcygiCittc2dzdHIgIkU1MTogpNOmaCAlcygiCisKKyM6IHJlZ2V4cC5jOjEwNjMKK21zZ2lkICJFNTI6IFVubWF0Y2hlZCBcXHooIgorbXNnc3RyICJFNTI6ILVMue/As6q6IFxceigiCisKKyM6IHJlZ2V4cC5jOjEwNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTUzOiBVbm1hdGNoZWQgJXMlJSgiCittc2dzdHIgIkU1MzogtUy578CzqrogJXMlJSgiCisKKyM6IHJlZ2V4cC5jOjEwNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU0OiBVbm1hdGNoZWQgJXMoIgorbXNnc3RyICJFNTQ6ILVMue/As6q6ICVzKCIKKworIzogcmVnZXhwLmM6MTA3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTU6IFVubWF0Y2hlZCAlcykiCittc2dzdHIgIkU1NTogtUy578CzqrogJXMpIgorCisjOiByZWdleHAuYzoxMjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiCittc2dzdHIgIkU1NjogJXMqILlCuuKkuKVppUisT6rFqroiCisKKyM6IHJlZ2V4cC5jOjEyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIKK21zZ3N0ciAiRTU2OiAlcysguUK64qS4pWmlSKxPqsWquiIKKworIzogcmVnZXhwLmM6MTI5NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNTk6IGludmFsaWQgY2hhcmFjdGVyIGFmdGVyICVzQCIKK21zZ3N0ciAiRTU5OiCr4a2xprOko6W/vVSquqZypLg6ICVzQCIKKworIzogcmVnZXhwLmM6MTMxOQorIywgYy1mb3JtYXQKK21zZ2lkICJFNTg6ICVzeyBvcGVyYW5kIGNvdWxkIGJlIGVtcHR5IgorbXNnc3RyICJFNTg6ICVzeyC5QrripLilaaVIrE+qxaq6IgorCisjOiByZWdleHAuYzoxMzI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIKK21zZ3N0ciAiRTYwOiCk06ZovcbC+Kq6ICVzey4uLn1zIgorCisjOiByZWdleHAuYzoxMzQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2MTogTmVzdGVkICVzKiIKK21zZ3N0ciAiRTYxOiCxX6qsICVzKiIKKworIzogcmVnZXhwLmM6MTM0OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNjI6IE5lc3RlZCAlcyVjIgorbXNnc3RyICJFNjI6ILFfqqwgJXMlYyIKKworIzogcmVnZXhwLmM6MTQ2NgorbXNnaWQgIkU2MzogaW52YWxpZCB1c2Ugb2YgXFxfIgorbXNnc3RyICJFNjM6IKSjpb+9VKq6qM+lziBcXF8iCisKKyM6IHJlZ2V4cC5jOjE1MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIKK21zZ3N0ciAiRTY0OiAlcyVjIKhTprOxtapGpugiCisKKyM6IHJlZ2V4cC5jOjE1NjcKK21zZ2lkICJFNjU6IElsbGVnYWwgYmFjayByZWZlcmVuY2UiCittc2dzdHIgIkU2NTogpKOlv71Uqrqkz6ZWsNGm0iIKKworIzogcmVnZXhwLmM6MTU4MAorbXNnaWQgIkU2NjogXFx6KCBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjY6IFxceiggpKOv4KZiprmlWLJ7IgorCisjOiByZWdleHAuYzoxNTk5Cittc2dpZCAiRTY3OiBcXHoxIGV0IGFsLiBub3QgYWxsb3dlZCBoZXJlIgorbXNnc3RyICJFNjc6IFxcejEgZXQgYWwuIKSjr+CmYqa5pViyeyIKKworIzogcmVnZXhwLmM6MTYxMAorbXNnaWQgIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IgorbXNnc3RyICJFNjg6IKvhrbGms6Sjpb+9VKq6pnKkuDogXFx6IgorCisjOiByZWdleHAuYzoxNjU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU2OTogTWlzc2luZyBdIGFmdGVyICVzJSVbIgorbXNnc3RyICJFNjk6ICVzJSVbIKvhr8qk1iBdIgorCisjOiByZWdleHAuYzoxNjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MDogRW1wdHkgJXMlJVtdIgorbXNnc3RyICJFNzA6IKrFqrogJXMlJVtdIgorCisjOiByZWdleHAuYzoxNzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU3MTogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgJXMlJSIKK21zZ3N0ciAiRTcxOiCr4a2xprOko6W/vVSquqZypLg6ICVzJSUiCisKKyM6IHJlZ2V4cC5jOjI1MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iCittc2dzdHIgIkU1NTQ6ILt5qmu/+bt+OiAlc3suLi59IgorCisjOiByZWdleHAuYzoyNzc3Cittc2dpZCAiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iCittc2dzdHIgIkUzNjE6ILVMqmuw9abmOyByZWd1bGFyIGV4cHJlc3Npb24gpNO9xsL4PyIKKworIzogcmVnZXhwLmM6MjkxMgorbXNnaWQgIkUzNjM6IHBhdHRlcm4gY2F1c2VkIG91dC1vZi1zdGFjayBlcnJvciIKK21zZ3N0ciAiRTM2MzogcmVndWxhciBleHByZXNzaW9uILN5pqiw78V8pc6l+qq6v/m7fiIKKworIzogcmVnZXhwLmM6MzE0OAorbXNnaWQgIkV4dGVybmFsIHN1Ym1hdGNoZXM6XG4iCittc2dzdHIgIqV+s6GyxaZYOlxuIgorCisjOiBzY3JlZW4uYzoyMTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIistLSUzbGQgbGluZXMgZm9sZGVkICIKK21zZ3N0ciAiKy0tpHcgZm9sZCAlM2xkIKbmIgorCisjOiBzY3JlZW4uYzo3Nzg1Cittc2dpZCAiIFZSRVBMQUNFIgorbXNnc3RyICIgVi2o+qVOIgorCisjOiBzY3JlZW4uYzo3Nzg5Cittc2dpZCAiIFJFUExBQ0UiCittc2dzdHIgIiCo+qVOIgorCisjOiBzY3JlZW4uYzo3Nzk0Cittc2dpZCAiIFJFVkVSU0UiCittc2dzdHIgIiCkz8LgIgorCisjOiBzY3JlZW4uYzo3Nzk2Cittc2dpZCAiIElOU0VSVCIKK21zZ3N0ciAiILShpEoiCisKKyM6IHNjcmVlbi5jOjc3OTkKK21zZ2lkICIgKGluc2VydCkiCittc2dzdHIgIiAotKGkSikiCisKKyM6IHNjcmVlbi5jOjc4MDEKK21zZ2lkICIgKHJlcGxhY2UpIgorbXNnc3RyICIgKKj6pU4pIgorCisjOiBzY3JlZW4uYzo3ODAzCittc2dpZCAiICh2cmVwbGFjZSkiCittc2dzdHIgIiAodi2o+qVOKSIKKworIzogc2NyZWVuLmM6NzgwNgorbXNnaWQgIiBIZWJyZXciCittc2dzdHIgIiBIZWJyZXciCisKKyM6IHNjcmVlbi5jOjc4MTQKK21zZ2lkICIgKGxhbmcpIgorbXNnc3RyICIgKLt5qKUpIgorCisjOiBzY3JlZW4uYzo3ODE3Cittc2dpZCAiIChwYXN0ZSkiCittc2dzdHIgIiAotkukVykiCisKKyM6IHNjcmVlbi5jOjc4MjMKK21zZ2lkICIgU0VMRUNUIgorbXNnc3RyICIgv++o+iIKKworIzogc2NyZWVuLmM6NzgyNQorbXNnaWQgIiBWSVNVQUwiCittc2dzdHIgIiC/76j6IgorCisjOiBzY3JlZW4uYzo3ODI3Cittc2dpZCAiIEJMT0NLIgorbXNnc3RyICIgsM+29CIKKworIzogc2NyZWVuLmM6NzgyOQorbXNnaWQgIiBMSU5FIgorbXNnc3RyICIgpua/76j6IgorCisjOiBzY3JlZW4uYzo3ODQyIHNjcmVlbi5jOjc5MDIKK21zZ2lkICJyZWNvcmRpbmciCittc2dzdHIgIrBPv/2kpCIKKworIzogc2VhcmNoLmM6MzYKK21zZ2lkICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iCittc2dzdHIgIqR3t2q0TajswMmu17Z9wFmhRqZBsXG1sqfAxH7E8rdqtE0iCisKKyM6IHNlYXJjaC5jOjM3Cittc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgorbXNnc3RyICKkd7dqtE2o7MDJrte1sqfAoUamQbFxtn3AWcR+xPK3arRNIgorCisjOiBzZWFyY2guYzo0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4MzogSW52YWxpZCBzZWFyY2ggc3RyaW5nOiAlcyIKK21zZ3N0ciAiRTM4Mzogv/m7fqq6t2q0TaZypuo6ICVzIgorCisjOiBzZWFyY2guYzo3ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIgorbXNnc3RyICJFMzg0OiCkd7dqtE2o7MDJrte2fcBZpLSn5KSjqOwgJXMiCisKKyM6IHNlYXJjaC5jOjc4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzg1OiBzZWFyY2ggaGl0IEJPVFRPTSB3aXRob3V0IG1hdGNoIGZvcjogJXMiCittc2dzdHIgIkUzODU6IKR3t2q0TajswMmu17Wyp8CktKfkpKOo7CAlcyIKKworIzogc2VhcmNoLmM6MTE1NworbXNnaWQgIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIKK21zZ3N0ciAiRTM4NjogpmIgJzsnIKvhrbHAs7jTprMgJz8nIKnOICcvJyIKKworIzogc2VhcmNoLmM6MzU2NworbXNnaWQgIiAoaW5jbHVkZXMgcHJldmlvdXNseSBsaXN0ZWQgbWF0Y2gpIgorbXNnc3RyICIgKKVdrEGrZaa4pkOlWLLFpli2tSkiCisKKyMuIGN1cnNvciBhdCBzdGF0dXMgbGluZQorIzogc2VhcmNoLmM6MzU4NworbXNnaWQgIi0tLSBJbmNsdWRlZCBmaWxlcyAiCittc2dzdHIgIi0tLSCk3qRKwMmu1yAiCisKKyM6IHNlYXJjaC5jOjM1ODkKK21zZ2lkICJub3QgZm91bmQgIgorbXNnc3RyICKn5KSjqOwgIgorCisjOiBzZWFyY2guYzozNTkwCittc2dpZCAiaW4gcGF0aCAtLS1cbiIKK21zZ3N0ciAiLS0tXG4iCisKKyM6IHNlYXJjaC5jOjM2MjkKK21zZ2lkICIgIChBbHJlYWR5IGxpc3RlZCkiCittc2dzdHIgIiAgKKR3pkOlWCkiCisKKyM6IHNlYXJjaC5jOjM2MzEKK21zZ2lkICIgIE5PVCBGT1VORCIKK21zZ3N0ciAiICCn5KSjqOwiCisKKyM6IHNlYXJjaC5jOjM2ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgaW5jbHVkZWQgZmlsZTogJXMiCittc2dzdHIgIrdqtE2k3qRKwMmu1zogJXMiCisKKyM6IHNlYXJjaC5jOjM5MDEKK21zZ2lkICJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiCittc2dzdHIgIkUzODc6IKXYq2Wp0qZipuakpKazpECkx7B0IgorCisjOiBzZWFyY2guYzo0MDQxCittc2dpZCAiQWxsIGluY2x1ZGVkIGZpbGVzIHdlcmUgZm91bmQiCittc2dzdHIgIqnSprOk3qRKwMmu17OjpHen5KjsIgorCisjOiBzZWFyY2guYzo0MDQzCittc2dpZCAiTm8gaW5jbHVkZWQgZmlsZXMiCittc2dzdHIgIqhTprOk3qRKwMmu1yIKKworIzogc2VhcmNoLmM6NDA1OQorbXNnaWQgIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIKK21zZ3N0ciAiRTM4ODogp+Sko6jsqXe4cSIKKworIzogc2VhcmNoLmM6NDA2MQorbXNnaWQgIkUzODk6IENvdWxkbid0IGZpbmQgcGF0dGVybiIKK21zZ3N0ciAiRTM4OTogp+Sko6jsIHBhdHRlcm4iCisKKyM6IHN5bnRheC5jOjMwMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiCittc2dzdHIgIkUzOTA6ILDRvMako6W/vVQ6ICVzIgorCisjOiBzeW50YXguYzozMTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTE6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkxOiC1TKa5IHN5bnRheCBjbHVzdGVyOiBcIiVzXCIiCisKKyM6IHN5bnRheC5jOjMzNTkKK21zZ2lkICJObyBTeW50YXggaXRlbXMgZGVmaW5lZCBmb3IgdGhpcyBidWZmZXIiCittc2dzdHIgIrNvrdO9d73EsM+oU6azqXe4caX0pvO7eaprIgorCisjOiBzeW50YXguYzozMzY3Cittc2dpZCAic3luY2luZyBvbiBDLXN0eWxlIGNvbW1lbnRzIgorbXNnc3RyICJDu3mopaahtfm40aZQqEKkxqSkIgorCisjOiBzeW50YXguYzozMzc1Cittc2dpZCAibm8gc3luY2luZyIKK21zZ3N0ciAiqFOms6ZQqEKkxiIKKworIzogc3ludGF4LmM6MzM3OAorbXNnaWQgInN5bmNpbmcgc3RhcnRzICIKK21zZ3N0ciAiplCoQqTGtn2pbCIKKworIzogc3ludGF4LmM6MzM4MCBzeW50YXguYzozNDU1Cittc2dpZCAiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIKK21zZ3N0ciAipua4ubZXpVi9ZLPyIgorCisjOiBzeW50YXguYzozMzg1Cittc2dpZCAiIgorIlxuIgorIi0tLSBTeW50YXggc3luYyBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gu3mqa6ZQqEKqq6XzIChTeW50YXggc3luYyBpdGVtcykgLS0tIgorCisjOiBzeW50YXguYzozMzkwCittc2dpZCAiIgorIlxuIgorInN5bmNpbmcgb24gaXRlbXMiCittc2dzdHIgIiIKKyJcbiIKKyKmUKhCpMakpDoiCisKKyM6IHN5bnRheC5jOjMzOTYKK21zZ2lkICIiCisiXG4iCisiLS0tIFN5bnRheCBpdGVtcyAtLS0iCittc2dzdHIgIiIKKyJcbiIKKyItLS0gu3mqa7a1pdggLS0tIgorCisjOiBzeW50YXguYzozNDE5CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIgorbXNnc3RyICJFMzkyOiC1TKa5IHN5bnRheCBjbHVzdGVyOiBcIiVzXCIiCisKKyM6IHN5bnRheC5jOjM0NDUKK21zZ2lkICJtaW5pbWFsICIKK21zZ3N0ciAis8ykcCIKKworIzogc3ludGF4LmM6MzQ1MgorbXNnaWQgIm1heGltYWwgIgorbXNnc3RyICKzzKRqIgorCisjOiBzeW50YXguYzozNDY0Cittc2dpZCAiOyBtYXRjaCAiCittc2dzdHIgIjsgssWmWCAiCisKKyM6IHN5bnRheC5jOjM0NjYKK21zZ2lkICIgbGluZSBicmVha3MiCittc2dzdHIgIsJfpuYiCisKKyM6IHN5bnRheC5jOjQxMDAKK21zZ2lkICJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiCittc2dzdHIgIkUzOTM6IKjPpc6kRqSjpb+9VKq6sNG8xiIKKworIzogc3ludGF4LmM6NDEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk0OiBEaWRuJ3QgZmluZCByZWdpb24gaXRlbSBmb3IgJXMiCittc2dzdHIgIkUzOTQ6IKfkpKOo7CAlcyCquiByZWdpb24gaXRlbSIKKworIzogc3ludGF4LmM6NDE1MgorbXNnaWQgIkUzOTU6IGNvbnRhaW5zIGFyZ3VtZW50IG5vdCBhY2NlcHRlZCBoZXJlIgorbXNnc3RyICJFMzk1OiCoz6XOpEako6W/vVSqurDRvMYiCisKKyM6IHN5bnRheC5jOjQxNjMKK21zZ2lkICJFMzk2OiBjb250YWluZWRpbiBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIKK21zZ3N0ciAiRTM5NjogqM+lzqRGpKOlv71Uqrqw0bzGIgorCisjOiBzeW50YXguYzo0MjQxCittc2dpZCAiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiCittc2dzdHIgIkUzOTc6ILvdrW7Aya7Xple62SIKKworIzogc3ludGF4LmM6NDU3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzk4OiBNaXNzaW5nICc9JzogJXMiCittc2dzdHIgIkUzOTg6IK/KpNYgXCI9XCI6ICVzIgorCisjOiBzeW50YXguYzo0NzM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkUzOTk6IE5vdCBlbm91Z2ggYXJndW1lbnRzOiBzeW50YXggcmVnaW9uICVzIgorbXNnc3RyICJFMzk5OiBzeW50YXggcmVnaW9uICVzIKq6pN68xqTTpNYiCisKKyM6IHN5bnRheC5jOjUwNjgKK21zZ2lkICJFNDAwOiBObyBjbHVzdGVyIHNwZWNpZmllZCIKK21zZ3N0ciAiRTQwMDogqFOms6v8qXequsTdqcoiCisKKyM6IHN5bnRheC5jOjUxMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwMTogUGF0dGVybiBkZWxpbWl0ZXIgbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQwMTogp+Sko6jspMC5arLFuLk6ICVzIgorCisjOiBzeW50YXguYzo1MTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiCittc2dzdHIgIkU0MDI6ICclcycgq+Gtsaq6qkam6LVMqmu/68PRIgorCisjOiBzeW50YXguYzo1MjcwCittc2dpZCAiRTQwMzogc3ludGF4IHN5bmM6IGxpbmUgY29udGludWF0aW9ucyBwYXR0ZXJuIHNwZWNpZmllZCB0d2ljZSIKK21zZ3N0ciAiRTQwMzogu3mqa6ZQqEI6ILNzsbWm5rLFuLmzUav8qXekRqjiprgiCisKKyM6IHN5bnRheC5jOjUzMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwNDogSWxsZWdhbCBhcmd1bWVudHM6ICVzIgorbXNnc3RyICJFNDA0OiCw0bzGpKOlv71UOiAlcyIKKworIzogc3ludGF4LmM6NTM3NworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA1OiBNaXNzaW5nIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDA1OiCvyqTWrNu1pbLFuLk6ICVzIgorCisjOiBzeW50YXguYzo1MzgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDY6IEVtcHR5IGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQwNjogqsWl1bDRvMY6ICVzIgorCisjOiBzeW50YXguYzo1NDEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDc6ICVzIG5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU0MDc6ICVzIKSjr+CmYqa5pViyeyIKKworIzogc3ludGF4LmM6NTQxNworIywgYy1mb3JtYXQKK21zZ2lkICJFNDA4OiAlcyBtdXN0IGJlIGZpcnN0IGluIGNvbnRhaW5zIGxpc3QiCittc2dzdHIgIkU0MDg6ICVzIKWytresT6ZDqu24zKq6ssSkQK3TIgorCisjOiBzeW50YXguYzo1NDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MDk6IFVua25vd24gZ3JvdXAgbmFtZTogJXMiCittc2dzdHIgIkU0MDk6IKSjpb+9VKq6uHOy1aZXutk6ICVzIgorCisjOiBzeW50YXguYzo1NzIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTA6IEludmFsaWQgOnN5bnRheCBzdWJjb21tYW5kOiAlcyIKK21zZ3N0ciAiRTQxMDogpKOlv71UqrogOnN5bnRheCCkbKlSpU86ICVzIgorCisjOiBzeW50YXguYzo2MDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTE6IGhpZ2hsaWdodCBncm91cCBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDExOiCn5KSjqOwgaGlnaGxpZ2h0IGdyb3VwOiAlcyIKKworIzogc3ludGF4LmM6NjEyMworIywgYy1mb3JtYXQKK21zZ2lkICJFNDEyOiBOb3QgZW5vdWdoIGFyZ3VtZW50czogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKK21zZ3N0ciAiRTQxMjogsNG8xqTTpNY6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiCisKKyM6IHN5bnRheC5jOjYxMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIgorbXNnc3RyICJFNDEzOiCw0bzGuUymaDogXCI6aGlnaGxpZ2h0IGxpbmsgJXNcIiIKKworIzogc3ludGF4LmM6NjE1MAorbXNnaWQgIkU0MTQ6IGdyb3VwIGhhcyBzZXR0aW5ncywgaGlnaGxpZ2h0IGxpbmsgaWdub3JlZCIKK21zZ3N0ciAiRTQxNDogpHezXal3uHOy1Swgqb+ypCBoaWdobGlnaHQgbGluayIKKworIzogc3ludGF4LmM6NjI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIgorbXNnc3RyICJFNDE1OiCko7jTprOqurWluLk6ICVzIgorCisjOiBzeW50YXguYzo2MzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MTY6IG1pc3NpbmcgZXF1YWwgc2lnbjogJXMiCittc2dzdHIgIkU0MTY6IK/KpNas27WlssW4uTogJXMiCisKKyM6IHN5bnRheC5jOjYzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQxNzogbWlzc2luZyBhcmd1bWVudDogJXMiCittc2dzdHIgIkU0MTc6IK/KpNaw0bzGOiAlcyIKKworIzogc3ludGF4LmM6NjM3NAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTQxODogpKOmWKprqrqtyDogJXMiCisKKyM6IHN5bnRheC5jOjY0OTMKK21zZ2lkICJFNDE5OiBGRyBjb2xvciB1bmtub3duIgorbXNnc3RyICJFNDE5OiC/+bt+qrqrZbS6w0Om4iIKKworIzogc3ludGF4LmM6NjUwNAorbXNnaWQgIkU0MjA6IEJHIGNvbG9yIHVua25vd24iCittc2dzdHIgIkU0MjA6IL/5u36quq1JtLrDQ6biIgorCisjOiBzeW50YXguYzo2NTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIKK21zZ3N0ciAiRTQyMTogv/m7fqq6w0Om4qZXutmpzrzGrcg6ICVzIgorCisjOiBzeW50YXguYzo2NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICJFNDIyOiCy17rdvve9WKTTqvg6ICVzIgorCisjOiBzeW50YXguYzo2ODE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjM6IElsbGVnYWwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICJFNDIzOiCw0bzGpKOlv71UOiAlcyIKKworIzogc3ludGF4LmM6NzM0NworbXNnaWQgIkU0MjQ6IFRvbyBtYW55IGRpZmZlcmVudCBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBpbiB1c2UiCittc2dzdHIgIkU0MjQ6IKjPpc6kRrlMpmis27KnqrqwqqtHq9fE3anKIgorCisjOiB0YWcuYzo5MAorbXNnaWQgIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTU6ILzQxdIodGFnKbDvxXy1sqfAIgorCisjOiB0YWcuYzo5MQorbXNnaWQgIkU1NTY6IGF0IHRvcCBvZiB0YWcgc3RhY2siCittc2dzdHIgIkU1NTY6ILzQxdIodGFnKbDvxXy2fcBZIgorCisjOiB0YWcuYzozOTIKK21zZ2lkICJFNDI1OiBDYW5ub3QgZ28gYmVmb3JlIGZpcnN0IG1hdGNoaW5nIHRhZyIKK21zZ3N0ciAiRTQyNTogpHe4Z6Zis8yrZa2xqrq80MXSKHRhZymkRiIKKworIzogdGFnLmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIgorbXNnc3RyICJFNDI2OiCn5KSjqOy80MXSKHRhZyk6ICVzIgorCisjOiB0YWcuYzo1NDUKK21zZ2lkICIgICMgcHJpIGtpbmQgdGFnIgorbXNnc3RyICIgICMgcHJpIGtpbmQgdGFnIgorCisjOiB0YWcuYzo1NDgKK21zZ2lkICJmaWxlXG4iCittc2dzdHIgIsDJrtdcbiIKKworIy4KKyMuICogQXNrIHRvIHNlbGVjdCBhIHRhZyBmcm9tIHRoZSBsaXN0LgorIy4gKiBXaGVuIHVzaW5nICI6c2lsZW50IiBhc3N1bWUgdGhhdCA8Q1I+IHdhcyBlbnRlcmVkLgorIy4KKyM6IHRhZy5jOjcwNgorbXNnaWQgIkVudGVyIG5yIG9mIGNob2ljZSAoPENSPiB0byBhYm9ydCk6ICIKK21zZ3N0ciAiv+mkSiBuciCpzr/vvtwgKDxDUj4gwve2fSk6ICIKKworIzogdGFnLmM6NzQ2Cittc2dpZCAiRTQyNzogVGhlcmUgaXMgb25seSBvbmUgbWF0Y2hpbmcgdGFnIgorbXNnc3RyICJFNDI3OiCldaazprm2tbLFplgiCisKKyM6IHRhZy5jOjc0OAorbXNnaWQgIkU0Mjg6IENhbm5vdCBnbyBiZXlvbmQgbGFzdCBtYXRjaGluZyB0YWciCittc2dzdHIgIkU0Mjg6IKR2uGemYrPMq+GkQK3TssWmWKq6IHRhZyCkRiIKKworIzogdGFnLmM6NzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICLAya7XIFwiJXNcIiCko6ZzpmIiCisKKyMuIEdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHRhZ3MKKyM6IHRhZy5jOjc4MAorIywgYy1mb3JtYXQKK21zZ2lkICJ0YWcgJWQgb2YgJWQlcyIKK21zZ3N0ciAip+So7CB0YWc6ICVkLyVkJXMiCisKKyM6IHRhZy5jOjc4MworbXNnaWQgIiBvciBtb3JlIgorbXNnc3RyICIgqc6n86ZoIgorCisjOiB0YWcuYzo3ODUKK21zZ2lkICIgIFVzaW5nIHRhZyB3aXRoIGRpZmZlcmVudCBjYXNlISIKK21zZ3N0ciAiICClSKSjplCkaqRwvGeo06jPpc4gdGFnISIKKworIzogdGFnLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICJFNDI5OiDAya7XIFwiJXNcIiCko6ZzpmIiCisKKyMuIEhpZ2hsaWdodCB0aXRsZQorIzogdGFnLmM6ODk3Cittc2dpZCAiIgorIlxuIgorIiAgIyBUTyB0YWcgICAgICAgICBGUk9NIGxpbmUgIGluIGZpbGUvdGV4dCIKK21zZ3N0ciAiIgorIlxuIgorIiAgIyCo7CB0YWcgICAgICAgICCxcSAgIKbmICAgIKZiIMDJrtcvpOWmciIKKworIzogdGFnLmM6MTE0NAorbXNnaWQgIkxpbmVhciB0YWcgc2VhcmNoIgorbXNnc3RyICK9danKt2q0TbzQxdIgKFRhZ3MpIgorCisjOiB0YWcuYzoxMTQ2Cittc2dpZCAiQmluYXJ5IHRhZyBzZWFyY2giCittc2dzdHIgIqRHpMC3arRNKEJpbmFyeSBzZWFyY2gpILzQxdIoVGFncykiCisKKyM6IHRhZy5jOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VhcmNoaW5nIHRhZ3MgZmlsZSAlcyIKK21zZ3N0ciAit2q0TSB0YWcgwMmu1yBcIiVzXCIiCisKKyM6IHRhZy5jOjEzNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMDogVGFnIGZpbGUgcGF0aCB0cnVuY2F0ZWQgZm9yICVzXG4iCittc2dzdHIgIkU0MzA6IFRhZyDAya7XuPSufLNRuknCX6ywICVzXG4iCisKKyM6IHRhZy5jOjE4NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMTogRm9ybWF0IGVycm9yIGluIHRhZ3MgZmlsZSBcIiVzXCIiCittc2dzdHIgIkU0MzE6IFRhZyDAySBcIiVzXCIgruamob/5u34iCisKKyM6IHRhZy5jOjE4NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmVmb3JlIGJ5dGUgJWxkIgorbXNnc3RyICKmYiAlbGQgpuykuKSnq2UiCisKKyM6IHRhZy5jOjE4ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQzMjogVGFncyBmaWxlIG5vdCBzb3J0ZWQ6ICVzIgorbXNnc3RyICJFNDMyOiBUYWcgwMmu16W8scanxzogJXMiCisKKyMuIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlCisjOiB0YWcuYzoxOTIyCittc2dpZCAiRTQzMzogTm8gdGFncyBmaWxlIgorbXNnc3RyICJFNDMzOiCoU6azIHRhZyDAySIKKworIzogdGFnLmM6MjYwMAorbXNnaWQgIkU0MzQ6IENhbid0IGZpbmQgdGFnIHBhdHRlcm4iCittc2dzdHIgIkU0MzQ6IKfkpKOo7CB0YWciCisKKyM6IHRhZy5jOjI2MTEKK21zZ2lkICJFNDM1OiBDb3VsZG4ndCBmaW5kIHRhZywganVzdCBndWVzc2luZyEiCittc2dzdHIgIkU0MzU6IKfkpKOo7CB0YWcsIKXOsnGquiEiCisKKyM6IHRlcm0uYzoxNzQ1Cittc2dpZCAiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IgorbXNnc3RyICInILVMqmu4/KRKoUOlaaXOqrqkuqvYste63b73p86moaazOiIKKworIzogdGVybS5jOjE3NjkKK21zZ2lkICJkZWZhdWx0aW5nIHRvICciCittc2dzdHIgIrl3s106ICciCisKKyM6IHRlcm0uYzoyMTI3Cittc2dpZCAiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIgorbXNnc3RyICJFNTU3OiC1TKprtn2x0iB0ZXJtY2FwIMDJrtciCisKKyM6IHRlcm0uYzoyMTMxCittc2dpZCAiRTU1ODogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1pbmZvIgorbXNnc3RyICJFNTU4OiB0ZXJtaW5mbyCkpKhTprOy17rdvve46q7GtrUiCisKKyM6IHRlcm0uYzoyMTMzCittc2dpZCAiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiCittc2dzdHIgIkU1NTk6IHRlcm1jYXAgpKSoU6azste63b73uOquxra1IgorCisjOiB0ZXJtLmM6MjI5MgorIywgYy1mb3JtYXQKK21zZ2lkICJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIKK21zZ3N0ciAiRTQzNjogdGVybWNhcCCoU6azIFwiJXNcIiBlbnRyeSIKKworIzogdGVybS5jOjI3NjYKK21zZ2lkICJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIKK21zZ3N0ciAiRTQzNzogste63b73u92tbiBcImNtXCIgqrqv4KRPIgorCisjLiBIaWdobGlnaHQgdGl0bGUKKyM6IHRlcm0uYzo0OTI3Cittc2dpZCAiIgorIlxuIgorIi0tLSBUZXJtaW5hbCBrZXlzIC0tLSIKK21zZ3N0ciAiIgorIlxuIgorIi0tLSCy17rdvver9sHkIC0tLSIKKworIzogdWkuYzoyNTIKK21zZ2lkICJuZXcgc2hlbGwgc3RhcnRlZFxuIgorbXNnc3RyICKwX7DKt3Mgc2hlbGxcbiIKKworIzogdWkuYzoxNzg0Cittc2dpZCAiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iCittc2dzdHIgIlZpbTogxaqo+r/ppEq/+bt+oUHC97Z9pKQuLi5cbiIKKworIy4gbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQKKyM6IHVuZG8uYzozOTQKK21zZ2lkICJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiCittc2dzdHIgIrVMqmvB2a3soUa90MR+xPKnVqRPIgorCisjOiB1bmRvLmM6NTQ5Cittc2dpZCAiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciCittc2dzdHIgIkU0Mzg6IHVfdW5kbzogpua4ub/5u34iCisKKyM6IHVuZG8uYzo3MTgKK21zZ2lkICIxIGNoYW5nZSIKK21zZ3N0ciAipEC2tafvxdwiCisKKyM6IHVuZG8uYzo3MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWxkIGNoYW5nZXMiCittc2dzdHIgIiVsZCC2tafvxdwiCisKKyM6IHVuZG8uYzo3NjQKK21zZ2lkICJFNDM5OiB1bmRvIGxpc3QgY29ycnVwdCIKK21zZ3N0ciAiRTQzOTogtF+t7KZDqu23bMNhIgorCisjOiB1bmRvLmM6Nzk2Cittc2dpZCAiRTQ0MDogdW5kbyBsaW5lIG1pc3NpbmciCittc2dzdHIgIkU0NDA6IKfkpKOo7K1uIHVuZG8gqrqm5iIKKworIy4gT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycworIzogdmVyc2lvbi5jOjY4MgorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDE2LzMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYvMzIgQml0ILnPq6ysya2xqqmluyIKKworIzogdmVyc2lvbi5jOjY4NAorbXNnaWQgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1TLVdpbmRvd3MgMzIgQml0ILnPq6ysya2xqqmluyIKKworIzogdmVyc2lvbi5jOjY4NworbXNnaWQgIiBpbiBXaW4zMnMgbW9kZSIKK21zZ3N0ciAiV2luMzJzILzSpqEiCisKKyM6IHZlcnNpb24uYzo2ODkKK21zZ2lkICIgd2l0aCBPTEUgc3VwcG9ydCIKK21zZ3N0ciAipOS0qSBPTEUiCisKKyM6IHZlcnNpb24uYzo2OTIKK21zZ2lkICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBiaXQgY29uc29sZSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTVMtV2luZG93cyAzMiBCaXQgY29uc29sZSCqqaW7IgorCisjOiB2ZXJzaW9uLmM6Njk2Cittc2dpZCAiIgorIlxuIgorIk1TLVdpbmRvd3MgMTYgYml0IHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNUy1XaW5kb3dzIDMyIEJpdCBjb25zb2xlIKqppbsiCisKKyM6IHZlcnNpb24uYzo3MDAKK21zZ2lkICIiCisiXG4iCisiMzIgYml0IE1TLURPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiMzIgQml0IE1TLURPUyCqqaW7IgorCisjOiB2ZXJzaW9uLmM6NzAyCittc2dpZCAiIgorIlxuIgorIjE2IGJpdCBNUy1ET1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIjE2IEJpdCBNUy1ET1MgqqmluyIKKworIzogdmVyc2lvbi5jOjcwOAorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYICh1bml4KSB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiTWFjT1MgWCAodW5peCkgqqmluyIKKworIzogdmVyc2lvbi5jOjcxMAorbXNnaWQgIiIKKyJcbiIKKyJNYWNPUyBYIHZlcnNpb24iCittc2dzdHIgIiIKKyJcbiIKKyJNYWNPUyBYIKqppbsiCisKKyM6IHZlcnNpb24uYzo3MTMKK21zZ2lkICIiCisiXG4iCisiTWFjT1MgdmVyc2lvbiIKK21zZ3N0ciAiIgorIlxuIgorIk1hY09TIKqppbsiCisKKyM6IHZlcnNpb24uYzo3MTgKK21zZ2lkICIiCisiXG4iCisiUklTQyBPUyB2ZXJzaW9uIgorbXNnc3RyICIiCisiXG4iCisiUklTQyBPUyCqqaW7IgorCisjOiB2ZXJzaW9uLmM6NzI4Cittc2dpZCAiIgorIlxuIgorIkluY2x1ZGVkIHBhdGNoZXM6ICIKK21zZ3N0ciAiIgorIlxuIgorIqTepEqt16W/OiAiCisKKyM6IHZlcnNpb24uYzo3NTQgdmVyc2lvbi5jOjEwOTcKK21zZ2lkICJNb2RpZmllZCBieSAiCittc2dzdHIgIq3Xp++qzKywIgorCisjOiB2ZXJzaW9uLmM6NzYxCittc2dpZCAiIgorIlxuIgorIkNvbXBpbGVkICIKK21zZ3N0ciAiIgorIlxuIgorIr1zxLYiCisKKyM6IHZlcnNpb24uYzo3NjQKK21zZ2lkICJieSAiCittc2dzdHIgIqrMOiIKKworIzogdmVyc2lvbi5jOjc3NgorbXNnaWQgIiIKKyJcbiIKKyJIdWdlIHZlcnNpb24gIgorbXNnc3RyICIiCisiXG4iCisitlexaqqppbsgIgorCisjOiB2ZXJzaW9uLmM6Nzc5Cittc2dpZCAiIgorIlxuIgorIkJpZyB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIqRqq6yqqaW7ICIKKworIzogdmVyc2lvbi5jOjc4MgorbXNnaWQgIiIKKyJcbiIKKyJOb3JtYWwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyKkQK/rqqmluyAiCisKKyM6IHZlcnNpb24uYzo3ODUKK21zZ2lkICIiCisiXG4iCisiU21hbGwgdmVyc2lvbiAiCittc2dzdHIgIiIKKyJcbiIKKyLCsqn2qqmluyAiCisKKyM6IHZlcnNpb24uYzo3ODcKK21zZ2lkICIiCisiXG4iCisiVGlueSB2ZXJzaW9uICIKK21zZ3N0ciAiIgorIlxuIgorIrrrwrKqqaW7ICIKKworIzogdmVyc2lvbi5jOjc5MworbXNnaWQgIndpdGhvdXQgR1VJLiIKK21zZ3N0ciAipKOoz6XOuc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjc5OAorbXNnaWQgIndpdGggR1RLMi1HTk9NRSBHVUkuIgorbXNnc3RyICKoz6XOIEdUSzItR05PTUUguc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgwMAorbXNnaWQgIndpdGggR1RLLUdOT01FIEdVSS4iCittc2dzdHIgIqjPpc4gR1RLLUdOT01FILnPq6ysya2xoUMiCisKKyM6IHZlcnNpb24uYzo4MDQKK21zZ2lkICJ3aXRoIEdUSzIgR1VJLiIKK21zZ3N0ciAiqM+lziBHVEsyILnPq6ysya2xoUMiCisKKyM6IHZlcnNpb24uYzo4MDYKK21zZ2lkICJ3aXRoIEdUSyBHVUkuIgorbXNnc3RyICKoz6XOIEdUSyC5z6usrMmtsaFDIgorCisjOiB2ZXJzaW9uLmM6ODExCittc2dpZCAid2l0aCBYMTEtTW90aWYgR1VJLiIKK21zZ3N0ciAiqM+lziBYMTEtTW90aWYguc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgxNAorbXNnaWQgIndpdGggWDExLUF0aGVuYSBHVUkuIgorbXNnc3RyICKoz6XOIFgxMS1BdGhlbmEguc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgxNworbXNnaWQgIndpdGggQmVPUyBHVUkuIgorbXNnc3RyICKoz6XOIEJlT1Mguc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgyMAorbXNnaWQgIndpdGggUGhvdG9uIEdVSS4iCittc2dzdHIgIqjPpc5QaG90b265z6usrMmtsaFDIgorCisjOiB2ZXJzaW9uLmM6ODIzCittc2dpZCAid2l0aCBHVUkuIgorbXNnc3RyICKoz6XOuc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgyNgorbXNnaWQgIndpdGggQ2FyYm9uIEdVSS4iCittc2dzdHIgIqjPpc4gQ2FyYm9uILnPq6ysya2xoUMiCisKKyM6IHZlcnNpb24uYzo4MjkKK21zZ2lkICJ3aXRoIENvY29hIEdVSS4iCittc2dzdHIgIqjPpc4gQ29jb2Eguc+rrKzJrbGhQyIKKworIzogdmVyc2lvbi5jOjgzMgorbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCittc2dzdHIgIqjPpc4gKLbHss4pILnPq6ysya2xoUMiCisKKyM6IHZlcnNpb24uYzo4NDMKK21zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgorbXNnc3RyICIgpdirZaVpqM+lzigrKbtQpKOlaajPpc4oLSmqurzSstWmQ6rtOlxuIgorCisjOiB2ZXJzaW9uLmM6ODU1Cittc2dpZCAiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgIKh0ss4gdmltcmMgs12pd8DJOiBcIiIKKworIzogdmVyc2lvbi5jOjg2MAorbXNnaWQgIiAgICAgdXNlciB2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICCoz6XOqsyt06RIIHZpbXJjILNdqXfAyTogXCIiCisKKyM6IHZlcnNpb24uYzo4NjUKK21zZ2lkICIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgICCyxKRHstWt06RIIHZpbXJjIMDJrtc6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODcwCittc2dpZCAiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgssSkVLLVrdOkSCB2aW1yYyDAya7XOiBcIiIKKworIzogdmVyc2lvbi5jOjg3NQorbXNnaWQgIiAgICAgIHVzZXIgZXhyYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgqM+lzqrMrdOkSCBleHJjILNdqXfAyTogXCIiCisKKyM6IHZlcnNpb24uYzo4ODAKK21zZ2lkICIgIDJuZCB1c2VyIGV4cmMgZmlsZTogXCIiCittc2dzdHIgIiAgILLEpEey1ajPpc6qzCBleHJjIMDJrtc6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODg2Cittc2dpZCAiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICAgICAgICCodLLOIGd2aW1yYyDAya7XOiBcIiIKKworIzogdmVyc2lvbi5jOjg5MAorbXNnaWQgIiAgICB1c2VyIGd2aW1yYyBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICCoz6XOqsyt06RIIGd2aW1yYyDAyTogXCIiCisKKyM6IHZlcnNpb24uYzo4OTQKK21zZ2lkICIybmQgdXNlciBndmltcmMgZmlsZTogXCIiCittc2dzdHIgIiAgILLEpEey1a3TpEggZ3ZpbXJjIMDJrtc6IFwiIgorCisjOiB2ZXJzaW9uLmM6ODk5Cittc2dpZCAiM3JkIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIgorbXNnc3RyICIgICCyxKRUstWt06RIIGd2aW1yYyDAya7XOiBcIiIKKworIzogdmVyc2lvbi5jOjkwNgorbXNnaWQgIiAgICBzeXN0ZW0gbWVudSBmaWxlOiBcIiIKK21zZ3N0ciAiICAgICAgICAgICCodLLOv++z5rNdqXfAyTogXCIiCisKKyM6IHZlcnNpb24uYzo5MTQKK21zZ2lkICIgIGZhbGwtYmFjayBmb3IgJFZJTTogXCIiCittc2dzdHIgIiAgICAgICAgICAgICAgJFZJTSC5d7Ndrcg6IFwiIgorCisjOiB2ZXJzaW9uLmM6OTIwCittc2dpZCAiIGYtYiBmb3IgJFZJTVJVTlRJTUU6IFwiIgorbXNnc3RyICIgICAgICAgJFZJTVJVTlRJTUUguXezXa3IOiBcIiIKKworIzogdmVyc2lvbi5jOjkyNAorbXNnaWQgIkNvbXBpbGF0aW9uOiAiCittc2dzdHIgIr1zxLak6KahOiAiCisKKyM6IHZlcnNpb24uYzo5MzAKK21zZ2lkICJDb21waWxlcjogIgorbXNnc3RyICK9c8S2vrk6ICIKKworIzogdmVyc2lvbi5jOjkzNQorbXNnaWQgIkxpbmtpbmc6ICIKK21zZ3N0ciAiw+y1sqTopqE6ICIKKworIzogdmVyc2lvbi5jOjk0MAorbXNnaWQgIiAgREVCVUcgQlVJTEQiCittc2dzdHIgIiAgsKO/+aqppbsiCisKKyM6IHZlcnNpb24uYzo5NzYKK21zZ2lkICJWSU0gLSBWaSBJTXByb3ZlZCIKK21zZ3N0ciAiVklNIC0gVmkgSU1wcm92ZWQiCisKKyM6IHZlcnNpb24uYzo5NzgKK21zZ2lkICJ2ZXJzaW9uICIKK21zZ3N0ciAiqqmluyAgICIKKworIzogdmVyc2lvbi5jOjk3OQorbXNnaWQgImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIKK21zZ3N0ciAiuvvFQKrMOiBCcmFtIE1vb2xlbmFhciBldCBhbC4iCisKKyM6IHZlcnNpb24uYzo5ODMKK21zZ2lkICJWaW0gaXMgb3BlbiBzb3VyY2UgYW5kIGZyZWVseSBkaXN0cmlidXRhYmxlIgorbXNnc3RyICJWaW0grLClaabbpdG0sqdHqrq2fanxreypbL1Ys27F6SIKKworIzogdmVyc2lvbi5jOjk4NQorbXNnaWQgIkhlbHAgcG9vciBjaGlsZHJlbiBpbiBVZ2FuZGEhIgorbXNnc3RyICK90MCwp1WvUaR6uUaquqVpvKarxLWjISIKKworIzogdmVyc2lvbi5jOjk4NgorbXNnaWQgInR5cGUgIDpoZWxwIGljY2Y8RW50ZXI+ICAgICAgIGZvciBpbmZvcm1hdGlvbiAiCittc2dzdHIgIrZppECoQruhqfq90L/ppEogICAgICAgICAgOmhlbHAgaWNjZjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5ODgKK21zZ2lkICJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIgorbXNnc3RyICKtbsL3tn290L/ppEogICAgICAgICAgICAgICAgICA6cTxFbnRlcj4gICAgICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5ODkKK21zZ2lkICJ0eXBlICA6aGVscDxFbnRlcj4gIG9yICA8RjE+ICBmb3Igb24tbGluZSBoZWxwIgorbXNnc3RyICK9daRXu6Gp+r3Qv+mkSiAgICAgICAgICAgICAgICA6aGVscDxFbnRlcj4gICAgICAgICAiCisKKyM6IHZlcnNpb24uYzo5OTAKK21zZ2lkICJ0eXBlICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4gICBmb3IgdmVyc2lvbiBpbmZvIgorbXNnc3RyICK3c6qppbu46rBUvdC/6aRKICAgICAgICAgICAgICA6aGVscCB2ZXJzaW9uNjxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5OTMKK21zZ2lkICJSdW5uaW5nIGluIFZpIGNvbXBhdGlibGUgbW9kZSIKK21zZ3N0ciAiVmkgrNuuZbzSpqEiCisKKyM6IHZlcnNpb24uYzo5OTQKK21zZ2lkICJ0eXBlICA6c2V0IG5vY3A8RW50ZXI+ICAgICAgICBmb3IgVmltIGRlZmF1bHRzIgorbXNnc3RyICKmcKpHrW6nuaX+vNLAwLbHss4gVmkgvdC/6aRKIDpzZXQgbm9jcDxFbnRlcj4iCisKKyM6IHZlcnNpb24uYzo5OTUKK21zZ2lkICJ0eXBlICA6aGVscCBjcC1kZWZhdWx0PEVudGVyPiBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICKmcKpHu92tbrnvIFZpIKzbrmW80qahqrq2aaRAqEK7oan6vdC/6aRKIDpoZWxwIGNwLWRlZmF1bHQ8RW50ZXI+IgorCisjOiB2ZXJzaW9uLmM6MTAxMAorbXNnaWQgIm1lbnUgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiAgICAiCittc2dzdHIgIrZppECoQruhqfq90L/vqPq/77Pmqrogu7KnVbuhqfotPqxAsc+pdKjgIgorCisjOiB2ZXJzaW9uLmM6MTAxMgorbXNnaWQgIlJ1bm5pbmcgbW9kZWxlc3MsIHR5cGVkIHRleHQgaXMgaW5zZXJ0ZWQiCittc2dzdHIgIrD1puYgTW9kZWxlc3MgvNKmoaFBv+mkSqq6pOWmcrd8ptuwyrShpEoiCisKKyM6IHZlcnNpb24uYzoxMDEzCittc2dpZCAibWVudSAgRWRpdC0+R2xvYmFsIFNldHRpbmdzLT5Ub2dnbGUgSW5zZXJ0IE1vZGUgICIKK21zZ3N0ciAiv++o+r/vs+aquqF1vXO/6KF2oXWl/rDss12pd6F2oXWkwbSrtKGkSrzSpqGhdiIKKworIzogdmVyc2lvbi5jOjEwMTQKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHdvIG1vZGVzICAgICAgIgorbXNnc3RyICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCo4rrYvNKmoSAgICAgICAgICAgIgorCisjOiB2ZXJzaW9uLmM6MTAxOAorbXNnaWQgIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIFZpIENvbXBhdGlibGUiCittc2dzdHIgIr/vqPq/77Pmqrqhdb1zv+ihdqF1pf6w7LNdqXehdqF1pMG0q7bHss5WaazbrmW80qahoXYiCisKKyM6IHZlcnNpb24uYzoxMDE5Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZpbSBkZWZhdWx0cyAgICIKK21zZ3N0ciAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgpUixbyBWaW0guXezXa3IICAgICIKKworIzogdmVyc2lvbi5jOjEwNjUKK21zZ2lkICJXQVJOSU5HOiBXaW5kb3dzIDk1Lzk4L01FIGRldGVjdGVkIgorbXNnc3RyICKqYLdOOiCwu7T6qOwgV2luZG93cyA5NS85OC9NRSIKKworIzogdmVyc2lvbi5jOjEwNjgKK21zZ2lkICJ0eXBlICA6aGVscCB3aW5kb3dzOTU8RW50ZXI+ICBmb3IgaW5mbyBvbiB0aGlzIgorbXNnc3RyICKmcKpHu92tbrnvIFdpbmRvd3MgOTUgpOS0qaq6p/OmaLjqsFS90L/ppEogOmhlbHAgd2luZG93czk1PEVudGVyPiIKKworIzogd2luZG93LmM6MjA0Cittc2dpZCAiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciCittc2dzdHIgIkU0NDE6IKhTprO5d8T9tfi1oSIKKworIzogd2luZG93LmM6NTc3Cittc2dpZCAiRTQ0MjogQ2FuJ3Qgc3BsaXQgdG9wbGVmdCBhbmQgYm90cmlnaHQgYXQgdGhlIHNhbWUgdGltZSIKK21zZ3N0ciAiRTQ0MjogpKOv4KZQrsmkwLPOtfi1oaywpaqkV6lNpWukVaikIgorCisjOiB3aW5kb3cuYzoxMzM2Cittc2dpZCAiRTQ0MzogQ2Fubm90IHJvdGF0ZSB3aGVuIGFub3RoZXIgd2luZG93IGlzIHNwbGl0IgorbXNnc3RyICJFNDQzOiCms6jkpaakwLPOtfi1oa7JtUyqa7HbwuAiCisKKyM6IHdpbmRvdy5jOjE4MjcKK21zZ2lkICJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciCittc2dzdHIgIkU0NDQ6IKSjr+DD9rOss8yr4aRArdO1+LWhIgorCisjOiB3aW5kb3cuYzoyNTU3Cittc2dpZCAiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciCittc2dzdHIgIqR3uGeldbPRpECt07X4taGkRiIKKworIzogd2luZG93LmM6MjYwNAorbXNnaWQgIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIgorbXNnc3RyICJFNDQ1OiCo5KWmtfi1oaazp/OwyrjqrsYiCisKKyM6IHdpbmRvdy5jOjQ0NDkKK21zZ2lkICJFNDQ2OiBObyBmaWxlIG5hbWUgdW5kZXIgY3Vyc29yIgorbXNnc3RyICJFNDQ2OiC05bzQs0KoU6azwMmmVyIKKworIzogd2luZG93LmM6NDU2OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDQ3OiBDYW4ndCBmaW5kIGZpbGUgXCIlc1wiIGluIHBhdGgiCittc2dzdHIgIkU0NDc6IKZiuPSufKSkp+Sko6jswMmu1yBcIiVzXCIiCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NTg2Cittc2dpZCAiRWRpdCB3aXRoICZtdWx0aXBsZSBWaW1zIgorbXNnc3RyICKoz6XOpmit0yBWaW0gc2Vzc2lvbiC9c7/oKCZNKSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo1OTIKK21zZ2lkICJFZGl0IHdpdGggc2luZ2xlICZWaW0iCittc2dzdHIgIqV1qM+lzqZQpECt0yBWaW0gc2Vzc2lvbiC9c7/oKCZWKSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MDEKK21zZ2lkICImRGlmZiB3aXRoIFZpbSIKK21zZ3N0ciAiqM+lziBWaW0gqNOk8bj7KCZEaWZmKSIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo2MTQKK21zZ2lkICJFZGl0IHdpdGggJlZpbSIKK21zZ3N0ciAiqM+lziBWaW0gvXO/6Ka5wMkoJlYpIgorCisjLiBOb3cgY29uY2F0ZW5hdGUKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6NjM2Cittc2dpZCAiRWRpdCB3aXRoIGV4aXN0aW5nIFZpbSAtICYiCittc2dzdHIgIqjPpc6w9abmpKSquiBWaW0gc2Vzc2lvbiC9c7/oIC0gJiIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo3NDkKK21zZ2lkICJFZGl0cyB0aGUgc2VsZWN0ZWQgZmlsZShzKSB3aXRoIFZpbSIKK21zZ3N0ciAiqM+lziBWaW0gvXO/6KR3v++o+qq6wMmu1yIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODggLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5NjkKK21zZ2lkICJFcnJvciBjcmVhdGluZyBwcm9jZXNzOiBDaGVjayBpZiBndmltIGlzIGluIHlvdXIgcGF0aCEiCittc2dzdHIgIrVMqmuw9abmtXumoTogvdDAy6xkIGd2aW0gprOoU6azpmKnQaq6IFBBVEggxdy8xrjMISIKKworIzogLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo4ODkgLi4vR3ZpbUV4dC9ndmltZXh0LmNwcDo5MDMKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTcwCittc2dpZCAiZ3ZpbWV4dC5kbGwgZXJyb3IiCittc2dzdHIgImd2aW1leHQuZGxsIL/5u34iCisKKyM6IC4uL0d2aW1FeHQvZ3ZpbWV4dC5jcHA6OTAyCittc2dpZCAiUGF0aCBsZW5ndGggdG9vIGxvbmchIgorbXNnc3RyICK49K58qvir16TTqvghIgorCisjOiBnbG9iYWxzLmg6OTkwCittc2dpZCAiLS1ObyBsaW5lcyBpbiBidWZmZXItLSIKK21zZ3N0ciAiLS29d73EsM+1TLjqrsYtLSIKKworIy4KKyMuICogVGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHNoYXJlZCBhcmUgaW5jbHVkZWQgaGVyZS4KKyMuICogRXhjbHVkZWQgYXJlIGVycm9ycyB0aGF0IGFyZSBvbmx5IHVzZWQgb25jZSBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorIy4KKyM6IGdsb2JhbHMuaDoxMTQ5Cittc2dpZCAiRTQ3MDogQ29tbWFuZCBhYm9ydGVkIgorbXNnc3RyICJFNDcwOiCpUqVPs1GxaqjupKTCX7D1puYiCisKKyM6IGdsb2JhbHMuaDoxMTUwCittc2dpZCAiRTQ3MTogQXJndW1lbnQgcmVxdWlyZWQiCittc2dzdHIgIkU0NzE6ILvdrW6r/KVPsNG8xiIKKworIzogZ2xvYmFscy5oOjExNTEKK21zZ2lkICJFMTA6IFxcIHNob3VsZCBiZSBmb2xsb3dlZCBieSAvLCA/IG9yICYiCittc2dzdHIgIkUxMDogXFwgq+GtscCzuNOmsyAvID8gqc4gJiIKKworIzogZ2xvYmFscy5oOjExNTMKK21zZ2lkICJFMTE6IEludmFsaWQgaW4gY29tbWFuZC1saW5lIHdpbmRvdzsgPENSPiBleGVjdXRlcywgQ1RSTC1DIHF1aXRzIgorbXNnc3RyICJFMTE6IKSjr+CmYqlSpU+mQ7X4taGkpKjPpc6hQzxDUj6w9abmoUFDVFJMLUMgwve2fSIKKworIzogZ2xvYmFscy5oOjExNTUKK21zZ2lkICJFMTI6IENvbW1hbmQgbm90IGFsbG93ZWQgZnJvbSBleHJjL3ZpbXJjIGluIGN1cnJlbnQgZGlyIG9yIHRhZyBzZWFyY2giCittc2dzdHIgIkUxMjogZXhyYy92aW1yYyC4zKq6q/ylT7VMqmuw9abmIgorCisjOiBnbG9iYWxzLmg6MTE1NworbXNnaWQgIkUxNzE6IE1pc3NpbmcgOmVuZGlmIgorbXNnc3RyICJFMTcxOiCvyqTWIDplbmRpZiIKKworIzogZ2xvYmFscy5oOjExNTgKK21zZ2lkICJFNjAwOiBNaXNzaW5nIDplbmR0cnkiCittc2dzdHIgIkU2MDA6IK/KpNYgOmVuZHRyeSIKKworIzogZ2xvYmFscy5oOjExNTkKK21zZ2lkICJFMTcwOiBNaXNzaW5nIDplbmR3aGlsZSIKK21zZ3N0ciAiRTE3MDogr8qk1iA6ZW5kd2hpbGUiCisKKyM6IGdsb2JhbHMuaDoxMTYwCittc2dpZCAiRTU4ODogOmVuZHdoaWxlIHdpdGhvdXQgOndoaWxlIgorbXNnc3RyICJFNTg4OiA6ZW5kd2hpbGUgr8qk1rnvwLOquiA6d2hpbGUiCisKKyM6IGdsb2JhbHMuaDoxMTYyCittc2dpZCAiRTEzOiBGaWxlIGV4aXN0cyAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFMTM6IMDJrtekd7hnpnOmYiAopWmlziAhILFqqO6o+qVOKSIKKworIzogZ2xvYmFscy5oOjExNjMKK21zZ2lkICJFNDcyOiBDb21tYW5kIGZhaWxlZCIKK21zZ3N0ciAiRTQ3MjogqVKlT7D1pualorHRIgorCisjOiBnbG9iYWxzLmg6MTE2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM0OiBVbmtub3duIGZvbnRzZXQ6ICVzIgorbXNnc3RyICJFMjM0OiCko6W/vVSquqZypLi2sCAoRm9udHNldCk6ICVzIgorCisjOiBnbG9iYWxzLmg6MTE2OQorIywgYy1mb3JtYXQKK21zZ2lkICJFMjM1OiBVbmtub3duIGZvbnQ6ICVzIgorbXNnc3RyICKko6W/vVSquqZyq6ymV7rZOiAlcyIKKworIzogZ2xvYmFscy5oOjExNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTIzNjogRm9udCBcIiVzXCIgaXMgbm90IGZpeGVkLXdpZHRoIgorbXNnc3RyICJFMjM2OiBcIiVzXCIgpKOsT6lUqXe8ZavXpnKrrCIKKworIzogZ2xvYmFscy5oOjExNzQKK21zZ2lkICJFNDczOiBJbnRlcm5hbCBlcnJvciIKK21zZ3N0ciAiRTQ3MzogpLqzob/5u34iCisKKyM6IGdsb2JhbHMuaDoxMTc1Cittc2dpZCAiSW50ZXJydXB0ZWQiCittc2dzdHIgIqR3pKTCXyIKKworIzogZ2xvYmFscy5oOjExNzYKK21zZ2lkICJFMTQ6IEludmFsaWQgYWRkcmVzcyIKK21zZ3N0ciAiRTE0OiCko6W/vVSquqbsp30iCisKKyM6IGdsb2JhbHMuaDoxMTc3Cittc2dpZCAiRTQ3NDogSW52YWxpZCBhcmd1bWVudCIKK21zZ3N0ciAiRTQ3NDogpKOlv71Uqrqw0bzGIgorCisjOiBnbG9iYWxzLmg6MTE3OAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDc1OiBJbnZhbGlkIGFyZ3VtZW50OiAlcyIKK21zZ3N0ciAiRTQ3NTogpKOlv71Uqrqw0bzGOiAlcyIKKworIzogZ2xvYmFscy5oOjExODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICVzIgorbXNnc3RyICJFMTU6IKSjpb+9VKq6uUK64qahOiAlcyIKKworIzogZ2xvYmFscy5oOjExODIKK21zZ2lkICJFMTY6IEludmFsaWQgcmFuZ2UiCittc2dzdHIgIkUxNjogpKOlv71Uqrq9ZLPyIgorCisjOiBnbG9iYWxzLmg6MTE4MworbXNnaWQgIkU0NzY6IEludmFsaWQgY29tbWFuZCIKK21zZ3N0ciAiRTQ3NjogpKOlv71UqrqpUqVPIgorCisjOiBnbG9iYWxzLmg6MTE4NQorIywgYy1mb3JtYXQKK21zZ2lkICJFMTc6IFwiJXNcIiBpcyBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTE3OiBcIiVzXCIgrE+l2L/9IgorCisjOiBnbG9iYWxzLmg6MTE4OAorbXNnaWQgIkUxODogVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGJlZm9yZSAnPSciCittc2dzdHIgIkUxODogJz0nIKtlrbGlWLJ7pEa/+bt+qrqmcqS4IgorCisjOiBnbG9iYWxzLmg6MTE5MQorIywgYy1mb3JtYXQKK21zZ2lkICJFMzY0OiBMaWJyYXJ5IGNhbGwgZmFpbGVkIGZvciBcIiVzKClcIiIKK21zZ3N0ciAiRTM2NDogqUmlc6jnpqGudyBcIiVzXCIoKSClorHRIgorCisjOiBnbG9iYWxzLmg6MTE5NgorIywgYy1mb3JtYXQKK21zZ2lkICJFMzcwOiBDb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzIgorbXNnc3RyICJFMzcwOiC1TKprrau3c7j8pEq1e6ahrncgJXMiCisKKyM6IGdsb2JhbHMuaDoxMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NDg6IENvdWxkIG5vdCBsb2FkIGxpYnJhcnkgZnVuY3Rpb24gJXMiCittc2dzdHIgIkU0NDg6ILVMqmu4/KRKtXumoa53qrqo56ahICVzIgorCisjOiBnbG9iYWxzLmg6MTE5OQorbXNnaWQgIkUxOTogTWFyayBoYXMgaW52YWxpZCBsaW5lIG51bWJlciIKK21zZ3N0ciAiRTE5OiC80LBPqrqm5ri5v/m7fiIKKworIzogZ2xvYmFscy5oOjEyMDAKK21zZ2lkICJFMjA6IE1hcmsgbm90IHNldCIKK21zZ3N0ciAiRTIwOiCoU6azs12pd7zQsE8iCisKKyM6IGdsb2JhbHMuaDoxMjAxCittc2dpZCAiRTIxOiBDYW5ub3QgbWFrZSBjaGFuZ2VzLCAnbW9kaWZpYWJsZScgaXMgb2ZmIgorbXNnc3RyICJFMjE6IKZdrLAgJ21vZGlmaWFibGUnIL/vtrWsT8P2s6yquqFBqdKlSKSjr+Ct16fvIgorCisjOiBnbG9iYWxzLmg6MTIwMgorbXNnaWQgIkUyMjogU2NyaXB0cyBuZXN0ZWQgdG9vIGRlZXAiCittc2dzdHIgIkUyMjogsV+qrLu8sGqpSaVzpNOmaLxoIgorCisjOiBnbG9iYWxzLmg6MTIwMworbXNnaWQgIkUyMzogTm8gYWx0ZXJuYXRlIGZpbGUiCittc2dzdHIgIkUyMzogqFOms7TApU6qusDJrtciCisKKyM6IGdsb2JhbHMuaDoxMjA0Cittc2dpZCAiRTI0OiBObyBzdWNoIGFiYnJldmlhdGlvbiIKK21zZ3N0ciAiRTI0OiCoU6azs2+t0yBhYmJyZXZpYXRpb24gue/AsyIKKworIzogZ2xvYmFscy5oOjEyMDUKK21zZ2lkICJFNDc3OiBObyAhIGFsbG93ZWQiCittc2dzdHIgIkU0Nzc6IKSjpWmoz6XOICchJyIKKworIzogZ2xvYmFscy5oOjEyMDcKK21zZ2lkICJFMjU6IEdVSSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lIgorbXNnc3RyICJFMjU6IKZdrLC9c8S2rsmoU6azpVukSrnPq6ysya2xqrq1e6ahvVihQanSpUi1TKprqM+lzrnPq6ysya2xIgorCisjOiBnbG9iYWxzLmg6MTIxMAorbXNnaWQgIkUyNjogSGVicmV3IGNhbm5vdCBiZSB1c2VkOiBOb3QgZW5hYmxlZCBhdCBjb21waWxlIHRpbWVcbiIKK21zZ3N0ciAiRTI2OiCmXaywvXPEtq7JqFOms6VbpEogSGVicmV3IKq6tXumob1YoUGp0qVItUyqa6jPpc4gSGVicmV3XG4iCisKKyM6IGdsb2JhbHMuaDoxMjEzCittc2dpZCAiRTI3OiBGYXJzaSBjYW5ub3QgYmUgdXNlZDogTm90IGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iCittc2dzdHIgIkUyNzogpl2ssL1zxLauyahTprOlW6RKIEZhcnNpIKq6tXumob1YoUGp0qVItUyqa6jPpc4gRmFyc2lcbiIKKworIzogZ2xvYmFscy5oOjEyMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTI4OiBObyBzdWNoIGhpZ2hsaWdodCBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiRTI4OiCoU6azplessCAnJXMnIKq6IGhpZ2hsaWdodCBncm91cCIKKworIzogZ2xvYmFscy5oOjEyMTgKK21zZ2lkICJFMjk6IE5vIGluc2VydGVkIHRleHQgeWV0IgorbXNnc3RyICJFMjk6IMHZqFOms7ShpEqk5aZyuUwiCisKKyM6IGdsb2JhbHMuaDoxMjE5Cittc2dpZCAiRTMwOiBObyBwcmV2aW91cyBjb21tYW5kIGxpbmUiCittc2dzdHIgIkUzMDogqFOms6tlpEC2talSpU8iCisKKyM6IGdsb2JhbHMuaDoxMjIwCittc2dpZCAiRTMxOiBObyBzdWNoIG1hcHBpbmciCittc2dzdHIgIkUzMTogqFOms7NvrdMgbWFwcGluZyC578CzIgorCisjOiBnbG9iYWxzLmg6MTIyMQorbXNnaWQgIkU0Nzk6IE5vIG1hdGNoIgorbXNnc3RyICJFNDc5OiCn5KSjqOwiCisKKyM6IGdsb2JhbHMuaDoxMjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODA6IE5vIG1hdGNoOiAlcyIKK21zZ3N0ciAiRTQ4MDogp+Sko6jsOiAlcyIKKworIzogZ2xvYmFscy5oOjEyMjMKK21zZ2lkICJFMzI6IE5vIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTMyOiCoU6azwMmmVyIKKworIzogZ2xvYmFscy5oOjEyMjQKK21zZ2lkICJFMzM6IE5vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzM6IKhTprOrZaRArdO3arRNL6j6pU6quqlSpU8iCisKKyM6IGdsb2JhbHMuaDoxMjI1Cittc2dpZCAiRTM0OiBObyBwcmV2aW91cyBjb21tYW5kIgorbXNnc3RyICJFMzQ6IKhTprOrZaRArdOpUqVPIgorCisjOiBnbG9iYWxzLmg6MTIyNgorbXNnaWQgIkUzNTogTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uIgorbXNnc3RyICJFMzU6IKhTprOrZaRArdO3arRNq/ylTyIKKworIzogZ2xvYmFscy5oOjEyMjcKK21zZ2lkICJFNDgxOiBObyByYW5nZSBhbGxvd2VkIgorbXNnc3RyICJFNDgxOiCko6VpqM+lzr1ks/Kr/KVPIgorCisjOiBnbG9iYWxzLmg6MTIyOQorbXNnaWQgIkUzNjogTm90IGVub3VnaCByb29tIgorbXNnc3RyICJFMzY6IKhTprOorLD3qrqqxbahIgorCisjOiBnbG9iYWxzLmg6MTIzMgorIywgYy1mb3JtYXQKK21zZ2lkICJFMjQ3OiBubyByZWdpc3RlcmVkIHNlcnZlciBuYW1lZCBcIiVzXCIiCittc2dzdHIgIkUyNDc6IKhTprO1+aVVrLAgXCIlc1wiIKq6pviqQb65IgorCisjOiBnbG9iYWxzLmg6MTIzNAorIywgYy1mb3JtYXQKK21zZ2lkICJFNDgyOiBDYW4ndCBjcmVhdGUgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4MjogpKOv4KvYpd/Aya7XICVzIgorCisjOiBnbG9iYWxzLmg6MTIzNQorbXNnaWQgIkU0ODM6IENhbid0IGdldCB0ZW1wIGZpbGUgbmFtZSIKK21zZ3N0ciAiRTQ4MzogtUyqa7Fvqr68yKZzwMmmVyIKKworIzogZ2xvYmFscy5oOjEyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQ4NDogQ2FuJ3Qgb3BlbiBmaWxlICVzIgorbXNnc3RyICJFNDg0OiC1TKprtn2x0sDJrtcgJXMiCisKKyM6IGdsb2JhbHMuaDoxMjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODU6IENhbid0IHJlYWQgZmlsZSAlcyIKK21zZ3N0ciAiRTQ4NTogtUyqa8WqqPrAya7XICVzIgorCisjOiBnbG9iYWxzLmg6MTIzOAorbXNnaWQgIkUzNzogTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKGFkZCAhIHRvIG92ZXJyaWRlKSIKK21zZ3N0ciAiRTM3OiCkd6fzp++5TMDJrtem/al8pbymc8DJICilaaXOICEgsWqo7rD1puYpIgorCisjOiBnbG9iYWxzLmg6MTIzOQorbXNnaWQgIkUzODogTnVsbCBhcmd1bWVudCIKK21zZ3N0ciAiRTM4OiCqxaq6IChOdWxsKSCw0bzGIgorCisjOiBnbG9iYWxzLmg6MTI0MQorbXNnaWQgIkUzOTogTnVtYmVyIGV4cGVjdGVkIgorbXNnc3RyICJFMzk6IMCzuNOtbqazvMamciIKKworIzogZ2xvYmFscy5oOjEyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRTQwOiBDYW4ndCBvcGVuIGVycm9yZmlsZSAlcyIKK21zZ3N0ciAiRTQwOiC1TKprtn2x0r/5u37Aya7XICVzIgorCisjOiBnbG9iYWxzLmg6MTI0NworbXNnaWQgIkUyMzM6IGNhbm5vdCBvcGVuIGRpc3BsYXkiCittc2dzdHIgIkUyMzM6IDyko6/gtn2x0iBYIFNlcnZlciBESVNQTEFZPiIKKworIzogZ2xvYmFscy5oOjEyNDkKK21zZ2lkICJFNDE6IE91dCBvZiBtZW1vcnkhIgorbXNnc3RyICJFNDE6ILBPvtDF6aSjqKwhIgorCisjOiBnbG9iYWxzLmg6MTI1MQorbXNnaWQgIlBhdHRlcm4gbm90IGZvdW5kIgorbXNnc3RyICKn5KSjqOwiCisKKyM6IGdsb2JhbHMuaDoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkU0ODY6IFBhdHRlcm4gbm90IGZvdW5kOiAlcyIKK21zZ3N0ciAiRTQ4Njogp+Sko6jsICVzIgorCisjOiBnbG9iYWxzLmg6MTI1NAorbXNnaWQgIkU0ODc6IEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUiCittc2dzdHIgIkU0ODc6ILDRvMbAs7jTrE+lv7zGIgorCisjOiBnbG9iYWxzLmg6MTI1NgorbXNnaWQgIkU0NTk6IENhbm5vdCBnbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeSIKK21zZ3N0ciAiRTQ1OTogtUyqa6ZeqOyrZaRArdOl2L/9IgorCisjOiBnbG9iYWxzLmg6MTI2MAorbXNnaWQgIkU0MjogTm8gRXJyb3JzIgorbXNnc3RyICJFNDI6IKhTprO/+bt+IgorCisjOiBnbG9iYWxzLmg6MTI2MgorbXNnaWQgIkU0MzogRGFtYWdlZCBtYXRjaCBzdHJpbmciCittc2dzdHIgIkU0MzogssWmWKZypuqms7Ddw0QiCisKKyM6IGdsb2JhbHMuaDoxMjYzCittc2dpZCAiRTQ0OiBDb3JydXB0ZWQgcmVnZXhwIHByb2dyYW0iCittc2dzdHIgIkU0NDogcmVnZXhwIKazsN3DRCIKKworIzogZ2xvYmFscy5oOjEyNjQKK21zZ2lkICJFNDU6ICdyZWFkb25seScgb3B0aW9uIGlzIHNldCAoYWRkICEgdG8gb3ZlcnJpZGUpIgorbXNnc3RyICJFNDU6IKazs12pdyAncmVhZG9ubHknIL/vtrUosN/FqikgKKVppc4gISCxaqjusPWm5ikiCisKKyM6IGdsb2JhbHMuaDoxMjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkU0NjogQ2Fubm90IHNldCByZWFkLW9ubHkgdmFyaWFibGUgXCIlc1wiIgorbXNnc3RyICJFNDY6ILVMqmuzXal3sN/FqsXcvMYgXCIlc1wiIgorCisjOiBnbG9iYWxzLmg6MTI2OQorbXNnaWQgIkU0NzogRXJyb3Igd2hpbGUgcmVhZGluZyBlcnJvcmZpbGUiCittc2dzdHIgIkU0Nzogxaqo+r/5u37Aya7XpaKx0SIKKworIzogZ2xvYmFscy5oOjEyNzIKK21zZ2lkICJFNDg6IE5vdCBhbGxvd2VkIGluIHNhbmRib3giCittc2dzdHIgIkU0ODogpKOv4KZiIHNhbmRib3gguMylWLJ7IgorCisjOiBnbG9iYWxzLmg6MTI3NAorbXNnaWQgIkU1MjM6IE5vdCBhbGxvd2VkIGhlcmUiCittc2dzdHIgIkU1MjM6ILNvuMyko6VpqM+lziIKKworIzogZ2xvYmFscy5oOjEyNzcKK21zZ2lkICJFMzU5OiBTY3JlZW4gbW9kZSBzZXR0aW5nIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIkUzNTk6IKSjpOS0qbNdqXe/w7n1vNKmoSIKKworIzogZ2xvYmFscy5oOjEyNzkKK21zZ2lkICJFNDk6IEludmFsaWQgc2Nyb2xsIHNpemUiCittc2dzdHIgIkU0OTogv/m7fqq6sbKwyqRqpHAiCisKKyM6IGdsb2JhbHMuaDoxMjgwCittc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKK21zZ3N0ciAiRTkxOiAnRTcxOiC/77a1ICdzaGVsbCcgpbyzXal3IgorCisjOiBnbG9iYWxzLmg6MTI4MgorbXNnaWQgIkUyNTU6IENvdWxkbid0IHJlYWQgaW4gc2lnbiBkYXRhISIKK21zZ3N0ciAiRTI1NTogtUyqa8WqqPogc2lnbiBkYXRhISIKKworIzogZ2xvYmFscy5oOjEyODQKK21zZ2lkICJFNzI6IENsb3NlIGVycm9yIG9uIHN3YXAgZmlsZSIKK21zZ3N0ciAiRTcyOiC8yKZzwMnD9rOsv/m7fiIKKworIzogZ2xvYmFscy5oOjEyODUKK21zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKK21zZ3N0ciAiRTczOiC80MXSsO/FfKR3qsUiCisKKyM6IGdsb2JhbHMuaDoxMjg2Cittc2dpZCAiRTc0OiBDb21tYW5kIHRvbyBjb21wbGV4IgorbXNnc3RyICJFNzQ6IKlSpU+k073GwvgiCisKKyM6IGdsb2JhbHMuaDoxMjg3Cittc2dpZCAiRTc1OiBOYW1lIHRvbyBsb25nIgorbXNnc3RyICJFNzU6IKZXpnKk06r4IgorCisjOiBnbG9iYWxzLmg6MTI4OAorbXNnaWQgIkU3NjogVG9vIG1hbnkgWyIKK21zZ3N0ciAiRTc2OiCk06ZoIFsiCisKKyM6IGdsb2JhbHMuaDoxMjg5Cittc2dpZCAiRTc3OiBUb28gbWFueSBmaWxlIG5hbWVzIgorbXNnc3RyICJFNzc6IKTTpmjAyaZXIgorCisjOiBnbG9iYWxzLmg6MTI5MAorbXNnaWQgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiCittc2dzdHIgIkU0ODg6IKdBv+mkSqRGpmi+bKq6pnKkuCIKKworIzogZ2xvYmFscy5oOjEyOTEKK21zZ2lkICJFNzg6IFVua25vd24gbWFyayIKK21zZ3N0ciAiRTc4OiC1TKprv+zD0aq6vNCwTyIKKworIzogZ2xvYmFscy5oOjEyOTIKK21zZ2lkICJFNzk6IENhbm5vdCBleHBhbmQgd2lsZGNhcmRzIgorbXNnc3RyICJFNzk6ILVMqmuuabZ9uFWlzqZypLgiCisKKyM6IGdsb2JhbHMuaDoxMjk0Cittc2dpZCAiRTU5MTogJ3dpbmhlaWdodCcgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAnd2lubWluaGVpZ2h0JyIKK21zZ3N0ciAiRTU5MTogJ3dpbmhlaWdodCcgpKOv4KTxICd3aW5taW5oZWlnaHQnIKfzpNYiCisKKyM6IGdsb2JhbHMuaDoxMjk2Cittc2dpZCAiRTU5MjogJ3dpbndpZHRoJyBjYW5ub3QgYmUgc21hbGxlciB0aGFuICd3aW5taW53aWR0aCciCittc2dzdHIgIkU1OTI6ICd3aW53aWR0aCcgpKOv4KTxICd3aW5taW53aWR0aCcgp/Ok1iIKKworIzogZ2xvYmFscy5oOjEyOTkKK21zZ2lkICJFODA6IEVycm9yIHdoaWxlIHdyaXRpbmciCittc2dzdHIgIkU4MDogvGekSr/5u34iCisKKyM6IGdsb2JhbHMuaDoxMzAwCittc2dpZCAiWmVybyBjb3VudCIKK21zZ3N0ciAivMao7LlzICg/KSIKKworIzogZ2xvYmFscy5oOjEzMDIKK21zZ2lkICJFODE6IFVzaW5nIDxTSUQ+IG5vdCBpbiBhIHNjcmlwdCBjb250ZXh0IgorbXNnc3RyICJFODE6IDxTSUQ+IKSjr+CmYiBzY3JpcHQgpbuk5aV+qM+lzi4iCisKKyM6IGdsb2JhbHMuaDoxMzA1Cittc2dpZCAiRTQ0OTogSW52YWxpZCBleHByZXNzaW9uIHJlY2VpdmVkIgorbXNnc3RyICJFNDQ5OiCmrKjspKOlv71Uqrq5QrripqEiCisKKyM6IGdsb2JhbHMuaDoxMzA4Cittc2dpZCAiRTQ2MzogUmVnaW9uIGlzIGd1YXJkZWQsIGNhbm5vdCBtb2RpZnkiCittc2dzdHIgIkU0NjM6ILDPsOyzUatPxUChQbVMqmut16fvIgorCisjfiBtc2dpZCAiZnVuY3Rpb24gIgorI34gbXNnc3RyICKo56ahICIKKworI34gbXNnaWQgIlJ1biBNYWNybyIKKyN+IG1zZ3N0ciAisPWm5qWotrAiCisKKyN+IG1zZ2lkICJFMjIxOiAnY29tbWVudHN0cmluZycgaXMgZW1wdHkiCisjfiBtc2dzdHIgIkUyMjE6IL/vtrUgJ2NvbW1lbnRzdHJpbmcnIKW8s12pdyIKKworI34gbXNnaWQgIkUyNDI6IENvbG9yIG5hbWUgbm90IHJlY29nbml6ZWQ6ICVzIgorI34gbXNnc3RyICJFMjQyOiAlcyCssLVMqmvD0adPqrrDQ6biple62SIKKworI34gbXNnaWQgIkUyNDI6IE1pc3NpbmcgY29sb3I6ICVzIgorI34gbXNnc3RyICJFMjQyOiCn5KSjqOzDQ6biOiAlcyIKKworI34gbXNnaWQgImVycm9yIHJlYWRpbmcgY3Njb3BlIGNvbm5lY3Rpb24gJWQiCisjfiBtc2dzdHIgIsWqqPogY3Njb3BlILNzvXUgJWQgrsm/+bt+IgorCisjfiBtc2dpZCAiRTI0OTogY291bGRuJ3QgcmVhZCBWSU0gaW5zdGFuY2UgcmVnaXN0cnkgcHJvcGVydHkiCisjfiBtc2dzdHIgIkUyNDk6ILVMqmvFqqj6IFZJTSCquiByZWdpc3RyeSCzXal3trUiCisKKyN+IG1zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXMiCisjfiBtc2dzdHIgIrVMqmu2fbHSwMmu1yAlcyIKKworI34gbXNnaWQgIlVuYWJsZSB0byBzZW5kIHJlcGx5IgorI34gbXNnc3RyICK1TKprtsewZaZewLOwVK6nIgorCisjfiBtc2dpZCAiRTI0MTogVW5hYmxlIHRvIHNlbmQgdG8gVmltIHNlcnZlciIKKyN+IG1zZ3N0ciAiRTI0MTogtUyqa7bHsGWo7CBWaW0gpviqQb65IgorCisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gIlNlbmQgZmFpbGVkLiBObyBjb21tYW5kIHNlcnZlciBwcmVzZW50ID9cbiIKKyN+IG1zZ3N0ciAiIgorI34gIlxuIgorI34gIrbHsGWlorHRoUOoU6azqVKlT6b4qkG+uaZzpmIgP1xuIgorCisjfiBtc2dpZCAiUEMgKDMyIGJpdHMgVmltKSIKKyN+IG1zZ3N0ciAiUEMgKDMyIKbspLggVmltKSIKKworI34gbXNnaWQgIlBDICgxNiBiaXRzIFZpbSkiCisjfiBtc2dzdHIgIlBDICgxNiCm7KS4IFZpbSkiCisKKyN+IG1zZ2lkICJFMzYyOiBVbnN1cHBvcnRlZCBzY3JlZW4gbW9kZSIKKyN+IG1zZ3N0ciAiRTM2Mjogv8O59bzSpqGko6TktKkiCisKKyN+IG1zZ2lkICJObyBzZXJ2ZXJzIGZvdW5kIGZvciB0aGlzIGRpc3BsYXkiCisjfiBtc2dzdHIgIqa5RGlzcGxheahTprOm+KpBvrkoU2VydmVycykiCisKKyN+IG1zZ2lkICJFMjU4OiBubyBtYXRjaGVzIGZvdW5kIGluIGNzY29wZSBjb25uZWN0aW9ucyIKKyN+IG1zZ3N0ciAiRTI1ODogY3Njb3BlILNzvXWn5KSjqOyyxaZYqroiCisKKyN+IG1zZ2lkICIiCisjfiAiXG4iCisjfiAiTWFjT1MgQ2FyYm9uIgorI34gbXNnc3RyICIiCisjfiAiXG4iCisjfiAiTWFjT1MgQ2FyYm9uIgorCisjfiBtc2dpZCAiIgorI34gIlxuIgorI34gIk1hY09TIDgiCisjfiBtc2dzdHIgIiIKKyN+ICJcbiIKKyN+ICJNYWNPUyA4IgorCisjfiBtc2dpZCAiUmV0cmlldmUgbmV4dCBzeW1ib2wiCisjfiBtc2dzdHIgIsWqqPo6ILFxpFWt0yBzeW1ib2wiCisKKyN+IG1zZ2lkICItLSBTTmlGRisgY29tbWFuZHMgLS0iCisjfiBtc2dzdHIgIi0tIFNOaUZGKyCpUqVPIC0tIgorCisjfiBtc2dpZCAiRTI3NzogVW5yZWNvZ25pemVkIHNuaWZmIHJlcXVlc3QgWyVzXSIKKyN+IG1zZ3N0ciAiRTI3NzogtUyqa7/rw9Egc25pZmYgqVKlTyBbJXNdIgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvLmggYi9zcmMvcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODljODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBwcm90by5oOiBpbmNsdWRlIHRoZSAoYXV0b21hdGljYWxseSBnZW5lcmF0ZWQpIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCisvKgorICogRG9uJ3QgaW5jbHVkZSB0aGVzZSB3aGlsZSBnZW5lcmF0aW5nIHByb3RvdHlwZXMuICBQcmV2ZW50cyBwcm9ibGVtcyB3aGVuCisgKiBmaWxlcyBhcmUgbWlzc2luZy4KKyAqLworI2lmICFkZWZpbmVkKFBST1RPKSAmJiAhZGVmaW5lZChOT1BST1RPKQorCisvKgorICogTWFjaGluZS1kZXBlbmRlbnQgcm91dGluZXMuCisgKi8KKy8qIGF2b2lkIGVycm9ycyBpbiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjIGlmICFkZWZpbmVkKEZFQVRfWDExKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9HVEspCisjICBkZWZpbmUgRGlzcGxheSBpbnQKKyMgIGRlZmluZSBXaWRnZXQgaW50CisjIGVuZGlmCisjIGlmbmRlZiBGRUFUX0dVSV9HVEsKKyMgIGRlZmluZSBHZGtFdmVudCBpbnQKKyMgIGRlZmluZSBHZGtFdmVudEtleSBpbnQKKyMgZW5kaWYKKyMgaWZuZGVmIEZFQVRfWDExCisjICBkZWZpbmUgWEltYWdlIGludAorIyBlbmRpZgorCisjIGlmZGVmIEFNSUdBCisjICBpbmNsdWRlICJvc19hbWlnYS5wcm8iCisjIGVuZGlmCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykKKyMgIGluY2x1ZGUgIm9zX3VuaXgucHJvIgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjE2KQorIyAgaW5jbHVkZSAib3NfbXNkb3MucHJvIgorIyBlbmRpZgorIyBpZmRlZiBXSU4xNgorICAgdHlwZWRlZiBMUFNUUiBMUFdTVFI7CisgICB0eXBlZGVmIExQQ1NUUiBMUENXU1RSOworICAgdHlwZWRlZiBpbnQgTFBCT09MOworIyAgaW5jbHVkZSAib3Nfd2luMTYucHJvIgorIyAgaW5jbHVkZSAib3NfbXN3aW4ucHJvIgorIyBlbmRpZgorIyBpZmRlZiBXSU4zMjY0CisjICBpbmNsdWRlICJvc193aW4zMi5wcm8iCisjICBpbmNsdWRlICJvc19tc3dpbi5wcm8iCisjICBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pKSBcCisJfHwgKGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBfX0JPUkxBTkRDX18gPCAweDUwMikKK2V4dGVybiBpbnQgX3N0cmljb2xsIF9fQVJHUygoY2hhciAqYSwgY2hhciAqYikpOworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgVk1TCisjICBpbmNsdWRlICJvc192bXMucHJvIgorIyBlbmRpZgorIyBpZmRlZiBfX0JFT1NfXworIyAgaW5jbHVkZSAib3NfYmVvcy5wcm8iCisjIGVuZGlmCisjIGlmZGVmIE1BQ09TCisjICBpbmNsdWRlICJvc19tYWMucHJvIgorIyBlbmRpZgorIyBpZmRlZiBSSVNDT1MKKyMgIGluY2x1ZGUgIm9zX3Jpc2Nvcy5wcm8iCisjIGVuZGlmCisjIGlmZGVmIF9fUU5YX18KKyMgIGluY2x1ZGUgIm9zX3FueC5wcm8iCisjIGVuZGlmCisKKyMgaW5jbHVkZSAiYnVmZmVyLnBybyIKKyMgaW5jbHVkZSAiY2hhcnNldC5wcm8iCisjIGlmZGVmIEZFQVRfQ1NDT1BFCisjICBpbmNsdWRlICJpZl9jc2NvcGUucHJvIgorIyBlbmRpZgorIyBpbmNsdWRlICJkaWZmLnBybyIKKyMgaW5jbHVkZSAiZGlncmFwaC5wcm8iCisjIGluY2x1ZGUgImVkaXQucHJvIgorIyBpbmNsdWRlICJldmFsLnBybyIKKyMgaW5jbHVkZSAiZXhfY21kcy5wcm8iCisjIGluY2x1ZGUgImV4X2NtZHMyLnBybyIKKyMgaW5jbHVkZSAiZXhfZG9jbWQucHJvIgorIyBpbmNsdWRlICJleF9ldmFsLnBybyIKKyMgaW5jbHVkZSAiZXhfZ2V0bG4ucHJvIgorIyBpbmNsdWRlICJmaWxlaW8ucHJvIgorIyBpbmNsdWRlICJmb2xkLnBybyIKKyMgaW5jbHVkZSAiZ2V0Y2hhci5wcm8iCisjIGlmZGVmIEZFQVRfSEFOR1VMSU4KKyMgIGluY2x1ZGUgImhhbmd1bGluLnBybyIKKyMgZW5kaWYKKyMgaW5jbHVkZSAibWFpbi5wcm8iCisjIGluY2x1ZGUgIm1hcmsucHJvIgorIyBpZiAhZGVmaW5lZCBNRVNTQUdFX0ZJTEUgfHwgZGVmaW5lZChIQVZFX1NUREFSR19IKQorICAgIC8qIFRoZXNlIHByb3RvdHlwZXMgY2Fubm90IGJlIHByb2R1Y2VkIGF1dG9tYXRpY2FsbHkgYW5kIGNvbmZsaWN0IHdpdGgKKyAgICAgKiB0aGUgb2xkLXN0eWxlIHByb3RvdHlwZXMgaW4gbWVzc2FnZS5jLiAqLworaW50CisjaWZkZWYgX19CT1JMQU5EQ19fCitfUlRMRU5UUllGCisjZW5kaWYKK3Ntc2cgX19BUkdTKChjaGFyX3UgKiwgLi4uKSk7CitpbnQKKyNpZmRlZiBfX0JPUkxBTkRDX18KK19SVExFTlRSWUYKKyNlbmRpZgorc21zZ19hdHRyIF9fQVJHUygoaW50LCBjaGFyX3UgKiwgLi4uKSk7CisjIGVuZGlmCisjIGluY2x1ZGUgIm1lbWZpbGUucHJvIgorIyBpbmNsdWRlICJtZW1saW5lLnBybyIKKyMgaWZkZWYgRkVBVF9NRU5VCisjICBpbmNsdWRlICJtZW51LnBybyIKKyMgZW5kaWYKKyMgaW5jbHVkZSAibWVzc2FnZS5wcm8iCisjIGluY2x1ZGUgIm1pc2MxLnBybyIKKyMgaW5jbHVkZSAibWlzYzIucHJvIgorI2lmbmRlZiBIQVZFX1NUUlBCUksJICAgIC8qIG5vdCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIG1pc2MyLmMgKi8KK2NoYXJfdSAqdmltX3N0cnBicmsgX19BUkdTKChjaGFyX3UgKnMsIGNoYXJfdSAqY2hhcnNldCkpOworI2VuZGlmCisjaWZuZGVmIEhBVkVfUVNPUlQKKy8qIFVzZSBvdXIgb3duIHFzb3J0KCksIGRvbid0IGRlZmluZSB0aGUgcHJvdG90eXBlIHdoZW4gbm90IHVzZWQuICovCit2b2lkIHFzb3J0IF9fQVJHUygodm9pZCAqYmFzZSwgc2l6ZV90IGVsbV9jb3VudCwgc2l6ZV90IGVsbV9zaXplLCBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpOworI2VuZGlmCisjIGluY2x1ZGUgIm1vdmUucHJvIgorIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoRkVBVF9YSU0pIHx8IGRlZmluZWQoRkVBVF9LRVlNQVApIFwKKwl8fCBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkKKyMgIGluY2x1ZGUgIm1ieXRlLnBybyIKKyMgZW5kaWYKKyMgaW5jbHVkZSAibm9ybWFsLnBybyIKKyMgaW5jbHVkZSAib3BzLnBybyIKKyMgaW5jbHVkZSAib3B0aW9uLnBybyIKKyMgaW5jbHVkZSAicXVpY2tmaXgucHJvIgorIyBpbmNsdWRlICJyZWdleHAucHJvIgorIyBpbmNsdWRlICJzY3JlZW4ucHJvIgorIyBpbmNsdWRlICJzZWFyY2gucHJvIgorIyBpbmNsdWRlICJzeW50YXgucHJvIgorIyBpbmNsdWRlICJ0YWcucHJvIgorIyBpbmNsdWRlICJ0ZXJtLnBybyIKKyMgaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpICYmIChkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKFZNUykpCisjICBpbmNsdWRlICJ0ZXJtbGliLnBybyIKKyMgZW5kaWYKKyMgaW5jbHVkZSAidWkucHJvIgorIyBpbmNsdWRlICJ1bmRvLnBybyIKKyMgaW5jbHVkZSAidmVyc2lvbi5wcm8iCisjIGluY2x1ZGUgIndpbmRvdy5wcm8iCisKKyMgaWZkZWYgRkVBVF9QWVRIT04KKyMgIGluY2x1ZGUgImlmX3B5dGhvbi5wcm8iCisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9UQ0wKKyMgIGluY2x1ZGUgImlmX3RjbC5wcm8iCisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9SVUJZCisjICBpbmNsdWRlICJpZl9ydWJ5LnBybyIKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX0dVSQorIyAgaW5jbHVkZSAiZ3VpLnBybyIKKyMgIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChNQUNPUykKKyMgICBpbmNsdWRlICJwdHkucHJvIgorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKEhBVkVfU0VURU5WKSAmJiAhZGVmaW5lZChIQVZFX1BVVEVOVikgJiYgIWRlZmluZWQoVk1TKQorZXh0ZXJuIGludCBwdXRlbnYgX19BUkdTKChjb25zdCBjaGFyICpzdHJpbmcpKTsJCS8qIGZyb20gcHR5LmMgKi8KKyMgICBpZmRlZiBVU0VfVklNUFRZX0dFVEVOVgorZXh0ZXJuIGNoYXJfdSAqdmltcHR5X2dldGVudiBfX0FSR1MoKGNvbnN0IGNoYXJfdSAqc3RyaW5nKSk7CS8qIGZyb20gcHR5LmMgKi8KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIEZFQVRfR1VJX1cxNgorIyAgIGluY2x1ZGUgImd1aV93MTYucHJvIgorIyAgZW5kaWYKKyAgICAvKiBVZ2x5IHNvbHV0aW9uIGZvciAiQmFsbG9vbkV2YWwiIG5vdCBiZWluZyBkZWZpbmVkIHdoaWxlIGl0J3MgdXNlZCBpbgorICAgICAqIHRoZSBwcm90b3R5cGVzLiAqLworIyAgaWZuZGVmIEZFQVRfQkVWQUwKKyMgICBkZWZpbmUgQmFsbG9vbkV2YWwgaW50CisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9HVUlfVzMyCisjICAgaW5jbHVkZSAiZ3VpX3czMi5wcm8iCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9HVUlfR1RLCisjICAgaW5jbHVkZSAiZ3VpX2d0ay5wcm8iCisjICAgaW5jbHVkZSAiZ3VpX2d0a194MTEucHJvIgorIyAgZW5kaWYKKyMgIGlmZGVmIEZFQVRfR1VJX01PVElGCisjICAgaW5jbHVkZSAiZ3VpX21vdGlmLnBybyIKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX0dVSV9BVEhFTkEKKyMgICBpbmNsdWRlICJndWlfYXRoZW5hLnBybyIKKyMgICBpZmRlZiBGRUFUX0JST1dTRQorZXh0ZXJuIGNoYXIgKnZpbV9TZWxGaWxlIF9fQVJHUygoV2lkZ2V0IHRvcGxldmVsLCBjaGFyICpwcm9tcHQsIGNoYXIgKmluaXRfcGF0aCwgaW50ICgqc2hvd19lbnRyeSkoKSwgaW50IHgsIGludCB5LCBndWljb2xvcl9UIGZnLCBndWljb2xvcl9UIGJnLCBndWljb2xvcl9UIHNjcm9sbF9mZywgZ3VpY29sb3JfVCBzY3JvbGxfYmcpKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIEZFQVRfR1VJX0JFT1MKKyMgICBpbmNsdWRlICJndWlfYmVvcy5wcm8iCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9HVUlfTUFDCisjICAgaW5jbHVkZSAiZ3VpX21hYy5wcm8iCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9HVUlfWDExCisjICAgaW5jbHVkZSAiZ3VpX3gxMS5wcm8iCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChGRUFUX0dVSV9BTUlHQSkKKyMgICAgaW5jbHVkZSAiZ3VpX2FtaWdhLnBybyIKKyMgIGVuZGlmCisjICBpZmRlZiBSSVNDT1MKKyMgICBpbmNsdWRlICJndWlfcmlzY29zLnBybyIKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX0dVSV9QSE9UT04KKyMgICBpbmNsdWRlICJndWlfcGhvdG9uLnBybyIKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX1NVTl9XT1JLU0hPUAorIyAgIGluY2x1ZGUgIndvcmtzaG9wLnBybyIKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyMgICBpbmNsdWRlICJuZXRiZWFucy5wcm8iCisjICBlbmRpZgorIyBlbmRpZgkvKiBGRUFUX0dVSSAqLworCisjIGlmZGVmIEZFQVRfT0xFCisjICBpbmNsdWRlICJpZl9vbGUucHJvIgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKSAmJiBkZWZpbmVkKEZFQVRfWDExKQorIyAgaW5jbHVkZSAiaWZfeGNtZHNydi5wcm8iCisjIGVuZGlmCisKKy8qCisgKiBUaGUgcGVybCBpbmNsdWRlIGZpbGVzIHBvbGx1dGUgdGhlIG5hbWVzcGFjZSwgdGhlcmZvcmUgcHJvdG8uaCBtdXN0IGJlCisgKiBpbmNsdWRlZCBiZWZvcmUgdGhlIHBlcmwgaW5jbHVkZSBmaWxlcy4gIEJ1dCB0aGVuIENWIGlzIG5vdCBkZWZpbmVkLCB3aGljaAorICogaXMgdXNlZCBpbiBpZl9wZXJsLnByby4gIFRvIGdldCBhcm91bmQgdGhpcywgdGhlIHBlcmwgcHJvdG90eXBlIGZpbGVzIGFyZQorICogbm90IGluY2x1ZGVkIGhlcmUgZm9yIHRoZSBwZXJsIGZpbGVzLiAgVXNlIGEgZHVtbXkgZGVmaW5lIGZvciBDViBmb3IgdGhlCisgKiBvdGhlciBmaWxlcy4KKyAqLworI2lmIGRlZmluZWQoRkVBVF9QRVJMKSAmJiAhZGVmaW5lZChJTl9QRVJMX0ZJTEUpCisjIGRlZmluZSBDViB2b2lkCisjIGlmZGVmIF9fQk9STEFORENfXworIyAgcHJhZ21hIG9wdGlvbiAtcGMKKyMgZW5kaWYKKyMgaW5jbHVkZSAiaWZfcGVybC5wcm8iCisjIGlmZGVmIF9fQk9STEFORENfXworIyAgcHJhZ21hIG9wdGlvbiAtcC4KKyMgZW5kaWYKKyMgaW5jbHVkZSAiaWZfcGVybHNmaW8ucHJvIgorI2VuZGlmCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyMgZGVmaW5lIF9QUk9UT19ICisjZW5kaWYKKyNlbmRpZiAvKiAhUFJPVE8gJiYgIU5PUFJPVE8gKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9idWZmZXIucHJvIGIvc3JjL3Byb3RvL2J1ZmZlci5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhZGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9idWZmZXIucHJvCkBAIC0wLDAgKzEsNjYgQEAKKy8qIGJ1ZmZlci5jICovCitpbnQgb3Blbl9idWZmZXIgX19BUkdTKChpbnQgcmVhZF9zdGRpbiwgZXhhcmdfVCAqZWFwKSk7CitpbnQgYnVmX3ZhbGlkIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBjbG9zZV9idWZmZXIgX19BUkdTKCh3aW5fVCAqd2luLCBidWZfVCAqYnVmLCBpbnQgYWN0aW9uKSk7Cit2b2lkIGJ1Zl9jbGVhcl9maWxlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBidWZfZnJlZWFsbCBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBkZWxfYnVmLCBpbnQgd2lwZV9idWYpKTsKK3ZvaWQgZ290b19idWZmZXIgX19BUkdTKChleGFyZ19UICplYXAsIGludCBzdGFydCwgaW50IGRpciwgaW50IGNvdW50KSk7Cit2b2lkIGhhbmRsZV9zd2FwX2V4aXN0cyBfX0FSR1MoKGJ1Zl9UICpvbGRfY3VyYnVmKSk7CitjaGFyX3UgKmRvX2J1ZmRlbCBfX0FSR1MoKGludCBjb21tYW5kLCBjaGFyX3UgKmFyZywgaW50IGFkZHJfY291bnQsIGludCBzdGFydF9ibnIsIGludCBlbmRfYm5yLCBpbnQgZm9yY2VpdCkpOworaW50IGRvX2J1ZmZlciBfX0FSR1MoKGludCBhY3Rpb24sIGludCBzdGFydCwgaW50IGRpciwgaW50IGNvdW50LCBpbnQgZm9yY2VpdCkpOwordm9pZCBzZXRfY3VyYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGFjdGlvbikpOwordm9pZCBlbnRlcl9idWZmZXIgX19BUkdTKChidWZfVCAqYnVmKSk7CitidWZfVCAqYnVmbGlzdF9uZXcgX19BUkdTKChjaGFyX3UgKmZmbmFtZSwgY2hhcl91ICpzZm5hbWUsIGxpbmVucl9UIGxudW0sIGludCBmbGFncykpOwordm9pZCBmcmVlX2J1Zl9vcHRpb25zIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGZyZWVfcF9mZikpOworaW50IGJ1Zmxpc3RfZ2V0ZmlsZSBfX0FSR1MoKGludCBuLCBsaW5lbnJfVCBsbnVtLCBpbnQgb3B0aW9ucywgaW50IGZvcmNlaXQpKTsKK3ZvaWQgYnVmbGlzdF9nZXRmcG9zIF9fQVJHUygodm9pZCkpOworYnVmX1QgKmJ1Zmxpc3RfZmluZG5hbWUgX19BUkdTKChjaGFyX3UgKmZmbmFtZSkpOworaW50IGJ1Zmxpc3RfZmluZHBhdCBfX0FSR1MoKGNoYXJfdSAqcGF0dGVybiwgY2hhcl91ICpwYXR0ZXJuX2VuZCwgaW50IHVubGlzdGVkLCBpbnQgZGlmZm1vZGUpKTsKK2ludCBFeHBhbmRCdWZuYW1lcyBfX0FSR1MoKGNoYXJfdSAqcGF0LCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSwgaW50IG9wdGlvbnMpKTsKK2J1Zl9UICpidWZsaXN0X2ZpbmRuciBfX0FSR1MoKGludCBucikpOworY2hhcl91ICpidWZsaXN0X25yMm5hbWUgX19BUkdTKChpbnQgbiwgaW50IGZ1bGxuYW1lLCBpbnQgaGVscHRhaWwpKTsKK3ZvaWQgZ2V0X3dpbm9wdHMgX19BUkdTKChidWZfVCAqYnVmKSk7Citwb3NfVCAqYnVmbGlzdF9maW5kZnBvcyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2xpbmVucl9UIGJ1Zmxpc3RfZmluZGxudW0gX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIGJ1Zmxpc3RfbGlzdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGJ1Zmxpc3RfbmFtZV9uciBfX0FSR1MoKGludCBmbnVtLCBjaGFyX3UgKipmbmFtZSwgbGluZW5yX1QgKmxudW0pKTsKK2ludCBzZXRmbmFtZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqZmZuYW1lLCBjaGFyX3UgKnNmbmFtZSwgaW50IG1lc3NhZ2UpKTsKK3ZvaWQgYnVmX25hbWVfY2hhbmdlZCBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2J1Zl9UICpzZXRhbHRmbmFtZSBfX0FSR1MoKGNoYXJfdSAqZmZuYW1lLCBjaGFyX3UgKnNmbmFtZSwgbGluZW5yX1QgbG51bSkpOworY2hhcl91ICpnZXRhbHRmbmFtZSBfX0FSR1MoKGludCBlcnJtc2cpKTsKK2ludCBidWZsaXN0X2FkZCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGludCBmbGFncykpOwordm9pZCBidWZsaXN0X3NsYXNoX2FkanVzdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgYnVmbGlzdF9hbHRmcG9zIF9fQVJHUygodm9pZCkpOworaW50IG90aGVyZmlsZSBfX0FSR1MoKGNoYXJfdSAqZmZuYW1lKSk7Cit2b2lkIGJ1Zl9zZXRpbm8gX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIGZpbGVpbmZvIF9fQVJHUygoaW50IGZ1bGxuYW1lLCBpbnQgc2hvcnRoZWxwLCBpbnQgZG9udF90cnVuY2F0ZSkpOwordm9pZCBjb2xfcHJpbnQgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IGNvbCwgaW50IHZjb2wpKTsKK3ZvaWQgbWFrZXRpdGxlIF9fQVJHUygodm9pZCkpOwordm9pZCByZXNldHRpdGxlIF9fQVJHUygodm9pZCkpOworaW50IGJ1aWxkX3N0bF9zdHJfaGwgX19BUkdTKCh3aW5fVCAqd3AsIGNoYXJfdSAqb3V0LCBzaXplX3Qgb3V0bGVuLCBjaGFyX3UgKmZtdCwgaW50IGZpbGxjaGFyLCBpbnQgbWF4d2lkdGgsIHN0cnVjdCBzdGxfaGxyZWMgKmhsKSk7Cit2b2lkIGdldF9yZWxfcG9zIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnN0cikpOworaW50IGFwcGVuZF9hcmdfbnVtYmVyIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKmJ1ZiwgaW50IGFkZF9maWxlLCBpbnQgbWF4bGVuKSk7CitjaGFyX3UgKmZpeF9mbmFtZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgZm5hbWVfZXhwYW5kIF9fQVJHUygoYnVmX1QgKmJ1ZiwgY2hhcl91ICoqZmZuYW1lLCBjaGFyX3UgKipzZm5hbWUpKTsKK2NoYXJfdSAqYWxpc3RfbmFtZSBfX0FSR1MoKGFlbnRyeV9UICphZXApKTsKK3ZvaWQgZG9fYXJnX2FsbCBfX0FSR1MoKGludCBjb3VudCwgaW50IGZvcmNlaXQpKTsKK3ZvaWQgZXhfYnVmZmVyX2FsbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBkb19tb2RlbGluZXMgX19BUkdTKCh2b2lkKSk7CitpbnQgcmVhZF92aW1pbmZvX2J1ZmZlcmxpc3QgX19BUkdTKCh2aXJfVCAqdmlycCwgaW50IHdyaXRpbmcpKTsKK3ZvaWQgd3JpdGVfdmltaW5mb19idWZmZXJsaXN0IF9fQVJHUygoRklMRSAqZnApKTsKK2NoYXIgKmJ1Zl9zcG5hbWUgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIGJ1Zl9hZGRzaWduIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGlkLCBsaW5lbnJfVCBsbnVtLCBpbnQgdHlwZW5yKSk7CitpbnQgYnVmX2NoYW5nZV9zaWduX3R5cGUgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgbWFya0lkLCBpbnQgdHlwZW5yKSk7CitpbnRfdSBidWZfZ2V0c2lnbnR5cGUgX19BUkdTKChidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtLCBpbnQgdHlwZSkpOworbGluZW5yX1QgYnVmX2RlbHNpZ24gX19BUkdTKChidWZfVCAqYnVmLCBpbnQgaWQpKTsKK2ludCBidWZfZmluZHNpZ24gX19BUkdTKChidWZfVCAqYnVmLCBpbnQgaWQpKTsKK2ludCBidWZfZmluZHNpZ25faWQgX19BUkdTKChidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtKSk7CitpbnQgYnVmX2ZpbmRzaWdudHlwZV9pZCBfX0FSR1MoKGJ1Zl9UICpidWYsIGxpbmVucl9UIGxudW0sIGludCB0eXBlbnIpKTsKK2ludCBidWZfc2lnbmNvdW50IF9fQVJHUygoYnVmX1QgKmJ1ZiwgbGluZW5yX1QgbG51bSkpOwordm9pZCBidWZfZGVsZXRlX2FsbF9zaWducyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2lnbl9saXN0X3BsYWNlZCBfX0FSR1MoKGJ1Zl9UICpyYnVmKSk7Cit2b2lkIHNpZ25fbWFya19hZGp1c3QgX19BUkdTKChsaW5lbnJfVCBsaW5lMSwgbGluZW5yX1QgbGluZTIsIGxvbmcgYW1vdW50LCBsb25nIGFtb3VudF9hZnRlcikpOwordm9pZCBzZXRfYnVmbGlzdGVkIF9fQVJHUygoaW50IG9uKSk7CitpbnQgYnVmX2NvbnRlbnRzX2NoYW5nZWQgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIHdpcGVfYnVmZmVyIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGF1Y21kKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9jaGFyc2V0LnBybyBiL3NyYy9wcm90by9jaGFyc2V0LnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGU5NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2NoYXJzZXQucHJvCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGNoYXJzZXQuYyAqLworaW50IGluaXRfY2hhcnRhYiBfX0FSR1MoKHZvaWQpKTsKK2ludCBidWZfaW5pdF9jaGFydGFiIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGdsb2JhbCkpOwordm9pZCB0cmFuc19jaGFyYWN0ZXJzIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBidWZzaXplKSk7CitjaGFyX3UgKnRyYW5zc3RyIF9fQVJHUygoY2hhcl91ICpzKSk7CitjaGFyX3UgKnN0cl9mb2xkY2FzZSBfX0FSR1MoKGNoYXJfdSAqc3RyLCBpbnQgbGVuKSk7CitjaGFyX3UgKnRyYW5zY2hhciBfX0FSR1MoKGludCBjKSk7CitjaGFyX3UgKnRyYW5zY2hhcl9ieXRlIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgdHJhbnNjaGFyX25vbnByaW50IF9fQVJHUygoY2hhcl91ICpidWYsIGludCBjKSk7Cit2b2lkIHRyYW5zY2hhcl9oZXggX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IGMpKTsKK2ludCBieXRlMmNlbGxzIF9fQVJHUygoaW50IGIpKTsKK2ludCBjaGFyMmNlbGxzIF9fQVJHUygoaW50IGMpKTsKK2ludCBwdHIyY2VsbHMgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCB2aW1fc3Ryc2l6ZSBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IHZpbV9zdHJuc2l6ZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOworaW50IGNoYXJ0YWJzaXplIF9fQVJHUygoY2hhcl91ICpwLCBjb2xucl9UIGNvbCkpOworaW50IGxpbmV0YWJzaXplIF9fQVJHUygoY2hhcl91ICpzKSk7CitpbnQgd2luX2xpbmV0YWJzaXplIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnAsIGNvbG5yX1QgbGVuKSk7CitpbnQgdmltX2lzSURjIF9fQVJHUygoaW50IGMpKTsKK2ludCB2aW1faXN3b3JkYyBfX0FSR1MoKGludCBjKSk7CitpbnQgdmltX2lzd29yZHAgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCB2aW1faXN3b3JkY19idWYgX19BUkdTKChjaGFyX3UgKnAsIGJ1Zl9UICpidWYpKTsKK2ludCB2aW1faXNmaWxlYyBfX0FSR1MoKGludCBjKSk7CitpbnQgdmltX2lzcHJpbnRjIF9fQVJHUygoaW50IGMpKTsKK2ludCB2aW1faXNwcmludGNfc3RyaWN0IF9fQVJHUygoaW50IGMpKTsKK2ludCBsYnJfY2hhcnRhYnNpemUgX19BUkdTKCh1bnNpZ25lZCBjaGFyICpzLCBjb2xucl9UIGNvbCkpOworaW50IGxicl9jaGFydGFic2l6ZV9hZHYgX19BUkdTKChjaGFyX3UgKipzLCBjb2xucl9UIGNvbCkpOworaW50IHdpbl9sYnJfY2hhcnRhYnNpemUgX19BUkdTKCh3aW5fVCAqd3AsIGNoYXJfdSAqcywgY29sbnJfVCBjb2wsIGludCAqaGVhZHApKTsKK2ludCBpbl93aW5fYm9yZGVyIF9fQVJHUygod2luX1QgKndwLCBjb2xucl9UIHZjb2wpKTsKK3ZvaWQgZ2V0dmNvbCBfX0FSR1MoKHdpbl9UICp3cCwgcG9zX1QgKnBvcywgY29sbnJfVCAqc3RhcnQsIGNvbG5yX1QgKmN1cnNvciwgY29sbnJfVCAqZW5kKSk7Citjb2xucl9UIGdldHZjb2xfbm9saXN0IF9fQVJHUygocG9zX1QgKnBvc3ApKTsKK3ZvaWQgZ2V0dnZjb2wgX19BUkdTKCh3aW5fVCAqd3AsIHBvc19UICpwb3MsIGNvbG5yX1QgKnN0YXJ0LCBjb2xucl9UICpjdXJzb3IsIGNvbG5yX1QgKmVuZCkpOwordm9pZCBnZXR2Y29scyBfX0FSR1MoKHdpbl9UICp3cCwgcG9zX1QgKnBvczEsIHBvc19UICpwb3MyLCBjb2xucl9UICpsZWZ0LCBjb2xucl9UICpyaWdodCkpOworY2hhcl91ICpza2lwd2hpdGUgX19BUkdTKChjaGFyX3UgKnApKTsKK2NoYXJfdSAqc2tpcGRpZ2l0cyBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IHZpbV9pc2RpZ2l0IF9fQVJHUygoaW50IGMpKTsKK2ludCB2aW1faXN4ZGlnaXQgX19BUkdTKChpbnQgYykpOworY2hhcl91ICpza2lwdG93aGl0ZSBfX0FSR1MoKGNoYXJfdSAqcCkpOworY2hhcl91ICpza2lwdG93aGl0ZV9lc2MgX19BUkdTKChjaGFyX3UgKnApKTsKK2xvbmcgZ2V0ZGlnaXRzIF9fQVJHUygoY2hhcl91ICoqcHApKTsKK2ludCB2aW1faXNibGFua2xpbmUgX19BUkdTKChjaGFyX3UgKmxidWYpKTsKK3ZvaWQgdmltX3N0cjJuciBfX0FSR1MoKGNoYXJfdSAqc3RhcnQsIGludCAqaGV4cCwgaW50ICpsZW4sIGludCBkb29jdCwgaW50IGRvaGV4LCBsb25nICpucHRyLCB1bnNpZ25lZCBsb25nICp1bnB0cikpOworaW50IGhleDJuciBfX0FSR1MoKGludCBjKSk7CitpbnQgaGV4aGV4Mm5yIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgcmVtX2JhY2tzbGFzaCBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7Cit2b2lkIGJhY2tzbGFzaF9oYWx2ZSBfX0FSR1MoKGNoYXJfdSAqcCkpOworY2hhcl91ICpiYWNrc2xhc2hfaGFsdmVfc2F2ZSBfX0FSR1MoKGNoYXJfdSAqcCkpOwordm9pZCBlYmNkaWMyYXNjaWkgX19BUkdTKChjaGFyX3UgKmJ1ZmZlciwgaW50IGxlbikpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZGlmZi5wcm8gYi9zcmMvcHJvdG8vZGlmZi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmZTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9kaWZmLnBybwpAQCAtMCwwICsxLDIzIEBACisvKiBkaWZmLmMgKi8KK3ZvaWQgZGlmZl9uZXdfYnVmZmVyIF9fQVJHUygodm9pZCkpOwordm9pZCBkaWZmX2J1Zl9kZWxldGUgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIGRpZmZfYnVmX2FkZCBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgZGlmZl9pbnZhbGlkYXRlIF9fQVJHUygodm9pZCkpOwordm9pZCBkaWZmX21hcmtfYWRqdXN0IF9fQVJHUygobGluZW5yX1QgbGluZTEsIGxpbmVucl9UIGxpbmUyLCBsb25nIGFtb3VudCwgbG9uZyBhbW91bnRfYWZ0ZXIpKTsKK3ZvaWQgZXhfZGlmZnVwZGF0ZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9kaWZmcGF0Y2ggX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfZGlmZnNwbGl0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2RpZmZ0aGlzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRpZmZfd2luX29wdGlvbnMgX19BUkdTKCh3aW5fVCAqd3AsIGludCBhZGRidWYpKTsKK2ludCBkaWZmX2NoZWNrIF9fQVJHUygod2luX1QgKndwLCBsaW5lbnJfVCBsbnVtKSk7CitpbnQgZGlmZl9jaGVja19maWxsIF9fQVJHUygod2luX1QgKndwLCBsaW5lbnJfVCBsbnVtKSk7Cit2b2lkIGRpZmZfc2V0X3RvcGxpbmUgX19BUkdTKCh3aW5fVCAqZnJvbXdpbiwgd2luX1QgKnRvd2luKSk7CitpbnQgZGlmZm9wdF9jaGFuZ2VkIF9fQVJHUygodm9pZCkpOworaW50IGRpZmZfZmluZF9jaGFuZ2UgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxudW0sIGludCAqc3RhcnRwLCBpbnQgKmVuZHApKTsKK2ludCBkaWZmX2luZm9sZCBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSkpOwordm9pZCBudl9kaWZmZ2V0cHV0IF9fQVJHUygoaW50IHB1dCkpOwordm9pZCBleF9kaWZmZ2V0cHV0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgZGlmZl9tb2RlX2J1ZiBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2ludCBkaWZmX21vdmVfdG8gX19BUkdTKChpbnQgZGlyLCBsb25nIGNvdW50KSk7CitsaW5lbnJfVCBkaWZmX2xudW1fd2luIF9fQVJHUygobGluZW5yX1QgbG51bSwgd2luX1QgKndwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9kaWdyYXBoLnBybyBiL3NyYy9wcm90by9kaWdyYXBoLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTViZTcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2RpZ3JhcGgucHJvCkBAIC0wLDAgKzEsOSBAQAorLyogZGlncmFwaC5jICovCitpbnQgZG9fZGlncmFwaCBfX0FSR1MoKGludCBjKSk7CitpbnQgZ2V0X2RpZ3JhcGggX19BUkdTKChpbnQgY21kbGluZSkpOworaW50IGdldGRpZ3JhcGggX19BUkdTKChpbnQgY2hhcjEsIGludCBjaGFyMiwgaW50IG1ldGEpKTsKK3ZvaWQgcHV0ZGlncmFwaCBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7Cit2b2lkIGxpc3RkaWdyYXBocyBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqa2V5bWFwX2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGV4X2xvYWRrZXltYXAgX19BUkdTKChleGFyZ19UICplYXApKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2VkaXQucHJvIGIvc3JjL3Byb3RvL2VkaXQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTM5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZWRpdC5wcm8KQEAgLTAsMCArMSwzNiBAQAorLyogZWRpdC5jICovCitpbnQgZWRpdCBfX0FSR1MoKGludCBjbWRjaGFyLCBpbnQgc3RhcnRsbiwgbG9uZyBjb3VudCkpOwordm9pZCBlZGl0X3B1dGNoYXIgX19BUkdTKChpbnQgYywgaW50IGhpZ2hsaWdodCkpOwordm9pZCBlZGl0X3VucHV0Y2hhciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZGlzcGxheV9kb2xsYXIgX19BUkdTKChjb2xucl9UIGNvbCkpOwordm9pZCBjaGFuZ2VfaW5kZW50IF9fQVJHUygoaW50IHR5cGUsIGludCBhbW91bnQsIGludCByb3VuZCwgaW50IHJlcGxhY2VkKSk7Cit2b2lkIHRydW5jYXRlX3NwYWNlcyBfX0FSR1MoKGNoYXJfdSAqbGluZSkpOwordm9pZCBiYWNrc3BhY2VfdW50aWxfY29sdW1uIF9fQVJHUygoaW50IGNvbCkpOworaW50IHZpbV9pc19jdHJsX3hfa2V5IF9fQVJHUygoaW50IGMpKTsKK2ludCBpbnNfY29tcGxfYWRkX2luZmVyY2FzZSBfX0FSR1MoKGNoYXJfdSAqc3RyLCBpbnQgbGVuLCBjaGFyX3UgKmZuYW1lLCBpbnQgZGlyLCBpbnQgcmV1c2UpKTsKK2NoYXJfdSAqZmluZF93b3JkX3N0YXJ0IF9fQVJHUygoY2hhcl91ICpwdHIpKTsKK2NoYXJfdSAqZmluZF93b3JkX2VuZCBfX0FSR1MoKGNoYXJfdSAqcHRyKSk7Cit2b2lkIGluc19jb21wbF9jaGVja19rZXlzIF9fQVJHUygodm9pZCkpOworaW50IGdldF9saXRlcmFsIF9fQVJHUygodm9pZCkpOwordm9pZCBpbnNlcnRjaGFyIF9fQVJHUygoaW50IGMsIGludCBmbGFncywgaW50IHNlY29uZF9pbmRlbnQpKTsKK3ZvaWQgYXV0b19mb3JtYXQgX19BUkdTKChpbnQgdHJhaWxibGFuaywgaW50IHByZXZfbGluZSkpOworaW50IGNvbXBfdGV4dHdpZHRoIF9fQVJHUygoaW50IGZmKSk7CitpbnQgc3RvcF9hcnJvdyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X2xhc3RfaW5zZXJ0IF9fQVJHUygoaW50IGMpKTsKK2NoYXJfdSAqYWRkX2NoYXIyYnVmIF9fQVJHUygoaW50IGMsIGNoYXJfdSAqcykpOwordm9pZCBiZWdpbmxpbmUgX19BUkdTKChpbnQgZmxhZ3MpKTsKK2ludCBvbmVyaWdodCBfX0FSR1MoKHZvaWQpKTsKK2ludCBvbmVsZWZ0IF9fQVJHUygodm9pZCkpOworaW50IGN1cnNvcl91cCBfX0FSR1MoKGxvbmcgbiwgaW50IHVwZF90b3BsaW5lKSk7CitpbnQgY3Vyc29yX2Rvd24gX19BUkdTKChsb25nIG4sIGludCB1cGRfdG9wbGluZSkpOworaW50IHN0dWZmX2luc2VydGVkIF9fQVJHUygoaW50IGMsIGxvbmcgY291bnQsIGludCBub19lc2MpKTsKK2NoYXJfdSAqZ2V0X2xhc3RfaW5zZXJ0IF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfbGFzdF9pbnNlcnRfc2F2ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcmVwbGFjZV9wdXNoIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgZml4dGhpc2xpbmUgX19BUkdTKChpbnQgKCpnZXRfdGhlX2luZGVudCkodm9pZCkpKTsKK3ZvaWQgZml4X2luZGVudCBfX0FSR1MoKHZvaWQpKTsKK2ludCBpbl9jaW5rZXlzIF9fQVJHUygoaW50IGtleXR5cGVkLCBpbnQgd2hlbiwgaW50IGxpbmVfaXNfZW1wdHkpKTsKK2ludCBoa21hcCBfX0FSR1MoKGludCBjKSk7Cit2b2lkIGluc19zY3JvbGwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGluc19ob3JzY3JvbGwgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ldmFsLnBybyBiL3NyYy9wcm90by9ldmFsLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRmYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2V2YWwucHJvCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGV2YWwuYyAqLworY2hhcl91ICpmdW5jX25hbWUgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2xpbmVucl9UICpmdW5jX2JyZWFrcG9pbnQgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2ludCAqZnVuY19kYmdfdGljayBfX0FSR1MoKHZvaWQgKmNvb2tpZSkpOworaW50IGZ1bmNfbGV2ZWwgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2ludCBjdXJyZW50X2Z1bmNfcmV0dXJuZWQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF9pbnRlcm5hbF9zdHJpbmdfdmFyIF9fQVJHUygoY2hhcl91ICpuYW1lLCBjaGFyX3UgKnZhbHVlKSk7CitpbnQgZXZhbF9jaGFyY29udmVydCBfX0FSR1MoKGNoYXJfdSAqZW5jX2Zyb20sIGNoYXJfdSAqZW5jX3RvLCBjaGFyX3UgKmZuYW1lX2Zyb20sIGNoYXJfdSAqZm5hbWVfdG8pKTsKK2ludCBldmFsX3ByaW50ZXhwciBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqYXJncykpOwordm9pZCBldmFsX2RpZmYgX19BUkdTKChjaGFyX3UgKm9yaWdmaWxlLCBjaGFyX3UgKm5ld2ZpbGUsIGNoYXJfdSAqb3V0ZmlsZSkpOwordm9pZCBldmFsX3BhdGNoIF9fQVJHUygoY2hhcl91ICpvcmlnZmlsZSwgY2hhcl91ICpkaWZmZmlsZSwgY2hhcl91ICpvdXRmaWxlKSk7CitpbnQgZXZhbF90b19ib29sIF9fQVJHUygoY2hhcl91ICphcmcsIGludCAqZXJyb3IsIGNoYXJfdSAqKm5leHRjbWQsIGludCBza2lwKSk7CitjaGFyX3UgKmV2YWxfdG9fc3RyaW5nX3NraXAgX19BUkdTKChjaGFyX3UgKmFyZywgY2hhcl91ICoqbmV4dGNtZCwgaW50IHNraXApKTsKK2NoYXJfdSAqZXZhbF90b19zdHJpbmcgX19BUkdTKChjaGFyX3UgKmFyZywgY2hhcl91ICoqbmV4dGNtZCkpOworY2hhcl91ICpldmFsX3RvX3N0cmluZ19zYWZlIF9fQVJHUygoY2hhcl91ICphcmcsIGNoYXJfdSAqKm5leHRjbWQpKTsKK2ludCBldmFsX3RvX251bWJlciBfX0FSR1MoKGNoYXJfdSAqZXhwcikpOworY2hhcl91ICpjYWxsX3ZpbV9mdW5jdGlvbiBfX0FSR1MoKGNoYXJfdSAqZnVuYywgaW50IGFyZ2MsIGNoYXJfdSAqKmFyZ3YsIGludCBzYWZlKSk7Cit2b2lkICpzYXZlX2Z1bmNjYWwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHJlc3RvcmVfZnVuY2NhbCBfX0FSR1MoKHZvaWQgKmZjKSk7CitpbnQgZXZhbF9mb2xkZXhwciBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgKmNwKSk7Cit2b2lkIGV4X2xldCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBzZXRfY29udGV4dF9mb3JfZXhwcmVzc2lvbiBfX0FSR1MoKGV4cGFuZF9UICp4cCwgY2hhcl91ICphcmcsIGNtZGlkeF9UIGNtZGlkeCkpOwordm9pZCBleF9jYWxsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3VubGV0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgZG9fdW5sZXQgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgZGVsX21lbnV0cmFuc192YXJzIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfdXNlcl92YXJfbmFtZSBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworY2hhcl91ICpnZXRfZnVuY3Rpb25fbmFtZSBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworY2hhcl91ICpnZXRfZXhwcl9uYW1lIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7Cit2b2lkIHNldF92aW1fdmFyX25yIF9fQVJHUygoaW50IGlkeCwgbG9uZyB2YWwpKTsKK2xvbmcgZ2V0X3ZpbV92YXJfbnIgX19BUkdTKChpbnQgaWR4KSk7Cit2b2lkIHNldF92Y291bnQgX19BUkdTKChsb25nIGNvdW50LCBsb25nIGNvdW50MSkpOwordm9pZCBzZXRfdmltX3Zhcl9zdHJpbmcgX19BUkdTKChpbnQgaWR4LCBjaGFyX3UgKnZhbCwgaW50IGxlbikpOwordm9pZCBzZXRfcmVnX3ZhciBfX0FSR1MoKGludCBjKSk7CitjaGFyX3UgKnZfZXhjZXB0aW9uIF9fQVJHUygoY2hhcl91ICpvbGR2YWwpKTsKK2NoYXJfdSAqdl90aHJvd3BvaW50IF9fQVJHUygoY2hhcl91ICpvbGR2YWwpKTsKK2NoYXJfdSAqc2V0X2NtZGFyZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgY2hhcl91ICpvbGRhcmcpKTsKK2NoYXJfdSAqZ2V0X3Zhcl92YWx1ZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwordm9pZCBuZXdfc2NyaXB0X3ZhcnMgX19BUkdTKChzY2lkX1QgaWQpKTsKK3ZvaWQgdmFyX2luaXQgX19BUkdTKChnYXJyYXlfVCAqZ2FwKSk7Cit2b2lkIHZhcl9jbGVhciBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgZXhfZWNobyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9lY2hvaGwgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfZXhlY3V0ZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9mdW5jdGlvbiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworY2hhcl91ICpnZXRfdXNlcl9mdW5jX25hbWUgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCBpZHgpKTsKK3ZvaWQgZXhfZGVsZnVuY3Rpb24gX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfcmV0dXJuIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgZG9fcmV0dXJuIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgcmVhbmltYXRlLCBpbnQgaXNfY21kLCB2b2lkICp2YWx1ZSkpOwordm9pZCBkaXNjYXJkX3BlbmRpbmdfcmV0dXJuIF9fQVJHUygodm9pZCAqcmV0dmFyKSk7CitjaGFyX3UgKmdldF9yZXR1cm5fY21kIF9fQVJHUygodm9pZCAqcmV0dmFyKSk7CitjaGFyX3UgKmdldF9mdW5jX2xpbmUgX19BUkdTKChpbnQgYywgdm9pZCAqY29va2llLCBpbnQgaW5kZW50KSk7CitpbnQgZnVuY19oYXNfZW5kZWQgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2ludCBmdW5jX2hhc19hYm9ydCBfX0FSR1MoKHZvaWQgKmNvb2tpZSkpOworaW50IHJlYWRfdmltaW5mb192YXJsaXN0IF9fQVJHUygodmlyX1QgKnZpcnAsIGludCB3cml0aW5nKSk7Cit2b2lkIHdyaXRlX3ZpbWluZm9fdmFybGlzdCBfX0FSR1MoKEZJTEUgKmZwKSk7CitpbnQgc3RvcmVfc2Vzc2lvbl9nbG9iYWxzIF9fQVJHUygoRklMRSAqZmQpKTsKK2ludCBtb2RpZnlfZm5hbWUgX19BUkdTKChjaGFyX3UgKnNyYywgaW50ICp1c2VkbGVuLCBjaGFyX3UgKipmbmFtZXAsIGNoYXJfdSAqKmJ1ZnAsIGludCAqZm5hbWVsZW4pKTsKK2NoYXJfdSAqZG9fc3RyaW5nX3N1YiBfX0FSR1MoKGNoYXJfdSAqc3RyLCBjaGFyX3UgKnBhdCwgY2hhcl91ICpzdWIsIGNoYXJfdSAqZmxhZ3MpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V4X2NtZHMucHJvIGIvc3JjL3Byb3RvL2V4X2NtZHMucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjEwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZXhfY21kcy5wcm8KQEAgLTAsMCArMSw1MiBAQAorLyogZXhfY21kcy5jICovCit2b2lkIGRvX2FzY2lpIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2FsaWduIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3JldGFiIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgZG9fbW92ZSBfX0FSR1MoKGxpbmVucl9UIGxpbmUxLCBsaW5lbnJfVCBsaW5lMiwgbGluZW5yX1QgZGVzdCkpOwordm9pZCBleF9jb3B5IF9fQVJHUygobGluZW5yX1QgbGluZTEsIGxpbmVucl9UIGxpbmUyLCBsaW5lbnJfVCBuKSk7Cit2b2lkIGRvX2JhbmcgX19BUkdTKChpbnQgYWRkcl9jb3VudCwgZXhhcmdfVCAqZWFwLCBpbnQgZm9yY2VpdCwgaW50IGRvX2luLCBpbnQgZG9fb3V0KSk7Cit2b2lkIGRvX3NoZWxsIF9fQVJHUygoY2hhcl91ICpjbWQsIGludCBmbGFncykpOworY2hhcl91ICptYWtlX2ZpbHRlcl9jbWQgX19BUkdTKChjaGFyX3UgKmNtZCwgY2hhcl91ICppdG1wLCBjaGFyX3UgKm90bXApKTsKK3ZvaWQgYXBwZW5kX3JlZGlyIF9fQVJHUygoY2hhcl91ICpidWYsIGNoYXJfdSAqb3B0LCBjaGFyX3UgKmZuYW1lKSk7CitpbnQgdmltaW5mb19lcnJvciBfX0FSR1MoKGNoYXIgKmVycm51bSwgY2hhciAqbWVzc2FnZSwgY2hhcl91ICpsaW5lKSk7CitpbnQgcmVhZF92aW1pbmZvIF9fQVJHUygoY2hhcl91ICpmaWxlLCBpbnQgd2FudF9pbmZvLCBpbnQgd2FudF9tYXJrcywgaW50IGZvcmNlaXQpKTsKK3ZvaWQgd3JpdGVfdmltaW5mbyBfX0FSR1MoKGNoYXJfdSAqZmlsZSwgaW50IGZvcmNlaXQpKTsKK2ludCB2aW1pbmZvX3JlYWRsaW5lIF9fQVJHUygodmlyX1QgKnZpcnApKTsKK2NoYXJfdSAqdmltaW5mb19yZWFkc3RyaW5nIF9fQVJHUygodmlyX1QgKnZpcnAsIGludCBvZmYsIGludCBjb252ZXJ0KSk7Cit2b2lkIHZpbWluZm9fd3JpdGVzdHJpbmcgX19BUkdTKChGSUxFICpmZCwgY2hhcl91ICpwKSk7Cit2b2lkIGRvX2ZpeGRlbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBwcmludF9saW5lX25vX3ByZWZpeCBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGludCB1c2VfbnVtYmVyKSk7Cit2b2lkIHByaW50X2xpbmUgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBpbnQgdXNlX251bWJlcikpOwordm9pZCBleF9maWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3VwZGF0ZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF93cml0ZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGRvX3dyaXRlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3duZXh0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRvX3dxYWxsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgbm90X3dyaXRpbmcgX19BUkdTKCh2b2lkKSk7CitpbnQgZ2V0ZmlsZSBfX0FSR1MoKGludCBmbnVtLCBjaGFyX3UgKmZmbmFtZSwgY2hhcl91ICpzZm5hbWUsIGludCBzZXRwbSwgbGluZW5yX1QgbG51bSwgaW50IGZvcmNlaXQpKTsKK2ludCBkb19lY21kIF9fQVJHUygoaW50IGZudW0sIGNoYXJfdSAqZmZuYW1lLCBjaGFyX3UgKnNmbmFtZSwgZXhhcmdfVCAqZWFwLCBsaW5lbnJfVCBuZXdsbnVtLCBpbnQgZmxhZ3MpKTsKK3ZvaWQgZXhfYXBwZW5kIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NoYW5nZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF96IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgY2hlY2tfcmVzdHJpY3RlZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBjaGVja19zZWN1cmUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGRvX3N1YiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9nbG9iYWwgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZ2xvYmFsX2V4ZSBfX0FSR1MoKGNoYXJfdSAqY21kKSk7CitpbnQgcmVhZF92aW1pbmZvX3N1Yl9zdHJpbmcgX19BUkdTKCh2aXJfVCAqdmlycCwgaW50IGZvcmNlKSk7Cit2b2lkIHdyaXRlX3ZpbWluZm9fc3ViX3N0cmluZyBfX0FSR1MoKEZJTEUgKmZwKSk7Cit2b2lkIHByZXBhcmVfdGFncHJldmlldyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZXhfaGVscCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGhlbHBfaGV1cmlzdGljIF9fQVJHUygoY2hhcl91ICptYXRjaGVkX3N0cmluZywgaW50IG9mZnNldCwgaW50IHdyb25nX2Nhc2UpKTsKK2ludCBmaW5kX2hlbHBfdGFncyBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgKm51bV9tYXRjaGVzLCBjaGFyX3UgKioqbWF0Y2hlcywgaW50IGtlZXBfbGFuZykpOwordm9pZCBmaXhfaGVscF9idWZmZXIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGV4X2hlbHB0YWdzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3NpZ24gX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgc2lnbl9ndWlfc3RhcnRlZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBzaWduX2dldF9hdHRyIF9fQVJHUygoaW50IHR5cGVuciwgaW50IGxpbmUpKTsKK2NoYXJfdSAqc2lnbl9nZXRfdGV4dCBfX0FSR1MoKGludCB0eXBlbnIpKTsKK3ZvaWQgKnNpZ25fZ2V0X2ltYWdlIF9fQVJHUygoaW50IHR5cGVucikpOworY2hhcl91ICpzaWduX3R5cGVucjJuYW1lIF9fQVJHUygoaW50IHR5cGVucikpOwordm9pZCBleF9kcm9wIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9leF9jbWRzMi5wcm8gYi9zcmMvcHJvdG8vZXhfY21kczIucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjJkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZXhfY21kczIucHJvCkBAIC0wLDAgKzEsNzYgQEAKKy8qIGV4X2NtZHMyLmMgKi8KK3ZvaWQgZG9fZGVidWcgX19BUkdTKChjaGFyX3UgKmNtZCkpOwordm9pZCBleF9kZWJ1ZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBkYmdfY2hlY2tfYnJlYWtwb2ludCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGRiZ19jaGVja19za2lwcGVkIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2JyZWFrYWRkIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2RlYnVnZ3JlZWR5IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2JyZWFrZGVsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2JyZWFrbGlzdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworbGluZW5yX1QgZGJnX2ZpbmRfYnJlYWtwb2ludCBfX0FSR1MoKGludCBmaWxlLCBjaGFyX3UgKmZuYW1lLCBsaW5lbnJfVCBhZnRlcikpOwordm9pZCBkYmdfYnJlYWtwb2ludCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgbGluZW5yX1QgbG51bSkpOworaW50IGF1dG93cml0ZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBmb3JjZWl0KSk7Cit2b2lkIGF1dG93cml0ZV9hbGwgX19BUkdTKCh2b2lkKSk7CitpbnQgY2hlY2tfY2hhbmdlZCBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBjaGVja2F3LCBpbnQgbXVsdF93aW4sIGludCBmb3JjZWl0LCBpbnQgYWxsYnVmKSk7Cit2b2lkIGJyb3dzZV9zYXZlX2ZuYW1lIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBkaWFsb2dfY2hhbmdlZCBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBjaGVja2FsbCkpOworaW50IGNhbl9hYmFuZG9uIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGZvcmNlaXQpKTsKK2ludCBjaGVja19jaGFuZ2VkX2FueSBfX0FSR1MoKGludCBoaWRkZW4pKTsKK2ludCBjaGVja19mbmFtZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBidWZfd3JpdGVfYWxsIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGZvcmNlaXQpKTsKK2NoYXJfdSAqZG9fb25lX2FyZyBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7Cit2b2lkIHNldF9hcmdsaXN0IF9fQVJHUygoY2hhcl91ICpzdHIpKTsKK3ZvaWQgY2hlY2tfYXJnX2lkeCBfX0FSR1MoKHdpbl9UICp3aW4pKTsKK3ZvaWQgZXhfYXJncyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9wcmV2aW91cyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9yZXdpbmQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfbGFzdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9hcmd1bWVudCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBkb19hcmdmaWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgYXJnbikpOwordm9pZCBleF9uZXh0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2FyZ2VkaXQgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfYXJnYWRkIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2FyZ2RlbGV0ZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9saXN0ZG8gX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfY29tcGlsZXIgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfcnVudGltZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGNtZF9ydW50aW1lIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgYWxsKSk7CitpbnQgZG9faW5fcnVudGltZXBhdGggX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBhbGwsIHZvaWQgKCpjYWxsYmFjaykoY2hhcl91ICpmbmFtZSkpKTsKK3ZvaWQgZXhfb3B0aW9ucyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9zb3VyY2UgX19BUkdTKChleGFyZ19UICplYXApKTsKK2xpbmVucl9UICpzb3VyY2VfYnJlYWtwb2ludCBfX0FSR1MoKHZvaWQgKmNvb2tpZSkpOworaW50ICpzb3VyY2VfZGJnX3RpY2sgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2ludCBzb3VyY2VfbGV2ZWwgX19BUkdTKCh2b2lkICpjb29raWUpKTsKK2ludCBkb19zb3VyY2UgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBpbnQgY2hlY2tfb3RoZXIsIGludCBpc192aW1yYykpOwordm9pZCBleF9zY3JpcHRuYW1lcyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBzY3JpcHRuYW1lc19zbGFzaF9hZGp1c3QgX19BUkdTKCh2b2lkKSk7CitjaGFyX3UgKmdldF9zY3JpcHRuYW1lIF9fQVJHUygoc2NpZF9UIGlkKSk7CitjaGFyICpmZ2V0c19jciBfX0FSR1MoKGNoYXIgKnMsIGludCBuLCBGSUxFICpzdHJlYW0pKTsKK2NoYXJfdSAqZ2V0c291cmNlbGluZSBfX0FSR1MoKGludCBjLCB2b2lkICpjb29raWUsIGludCBpbmRlbnQpKTsKK3ZvaWQgZXhfc2NyaXB0ZW5jb2RpbmcgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfZmluaXNoIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRvX2ZpbmlzaCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHJlYW5pbWF0ZSkpOworaW50IHNvdXJjZV9maW5pc2hlZCBfX0FSR1MoKGNoYXJfdSAqKCpnZXRsaW5lKShpbnQsIHZvaWQgKiwgaW50KSwgdm9pZCAqY29va2llKSk7Cit2b2lkIGV4X2NoZWNrdGltZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGdldF9wcmludGVyX3BhZ2VfbnVtIF9fQVJHUygodm9pZCkpOworaW50IHBydF9oZWFkZXJfaGVpZ2h0IF9fQVJHUygodm9pZCkpOworaW50IHBydF91c2VfbnVtYmVyIF9fQVJHUygodm9pZCkpOworaW50IHBydF9nZXRfdW5pdCBfX0FSR1MoKGludCBpZHgpKTsKK3ZvaWQgZXhfaGFyZGNvcHkgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgbWNoX3ByaW50X2NsZWFudXAgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX3ByaW50X2luaXQgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBjaGFyX3UgKmpvYm5hbWUsIGludCBmb3JjZWl0KSk7CitpbnQgbWNoX3ByaW50X2JlZ2luIF9fQVJHUygocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykpOwordm9pZCBtY2hfcHJpbnRfZW5kIF9fQVJHUygocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykpOworaW50IG1jaF9wcmludF9lbmRfcGFnZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfcHJpbnRfYmVnaW5fcGFnZSBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CitpbnQgbWNoX3ByaW50X2JsYW5rX3BhZ2UgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9wcmludF9zdGFydF9saW5lIF9fQVJHUygoaW50IG1hcmdpbiwgaW50IHBhZ2VfbGluZSkpOworaW50IG1jaF9wcmludF90ZXh0X291dCBfX0FSR1MoKGNoYXJfdSAqcCwgaW50IGxlbikpOwordm9pZCBtY2hfcHJpbnRfc2V0X2ZvbnQgX19BUkdTKChpbnQgaUJvbGQsIGludCBpSXRhbGljLCBpbnQgaVVuZGVybGluZSkpOwordm9pZCBtY2hfcHJpbnRfc2V0X2JnIF9fQVJHUygobG9uZ191IGJnY29sKSk7Cit2b2lkIG1jaF9wcmludF9zZXRfZmcgX19BUkdTKChsb25nX3UgZmdjb2wpKTsKK2NoYXJfdSAqZ2V0X21lc3NfbGFuZyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X2xhbmdfdmFyIF9fQVJHUygodm9pZCkpOwordm9pZCBleF9sYW5ndWFnZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworY2hhcl91ICpnZXRfbGFuZ19hcmcgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCBpZHgpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V4X2RvY21kLnBybyBiL3NyYy9wcm90by9leF9kb2NtZC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmZWM0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9leF9kb2NtZC5wcm8KQEAgLTAsMCArMSw0MSBAQAorLyogZXhfZG9jbWQuYyAqLwordm9pZCBkb19leG1vZGUgX19BUkdTKChpbnQgaW1wcm92ZWQpKTsKK2ludCBkb19jbWRsaW5lX2NtZCBfX0FSR1MoKGNoYXJfdSAqY21kKSk7CitpbnQgZG9fY21kbGluZSBfX0FSR1MoKGNoYXJfdSAqY21kbGluZSwgY2hhcl91ICooKmdldGxpbmUpKGludCwgdm9pZCAqLCBpbnQpLCB2b2lkICpjb29raWUsIGludCBmbGFncykpOworaW50IGdldGxpbmVfZXF1YWwgX19BUkdTKChjaGFyX3UgKigqZ2V0bGluZSkoaW50LCB2b2lkICosIGludCksIHZvaWQgKmNvb2tpZSwgY2hhcl91ICooKmZ1bmMpKGludCwgdm9pZCAqLCBpbnQpKSk7Cit2b2lkICpnZXRsaW5lX2Nvb2tpZSBfX0FSR1MoKGNoYXJfdSAqKCpnZXRsaW5lKShpbnQsIHZvaWQgKiwgaW50KSwgdm9pZCAqY29va2llKSk7CitpbnQgY21kX2V4aXN0cyBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworY2hhcl91ICpzZXRfb25lX2NtZF9jb250ZXh0IF9fQVJHUygoZXhwYW5kX1QgKnhwLCBjaGFyX3UgKmJ1ZmYpKTsKK2NoYXJfdSAqc2tpcF9yYW5nZSBfX0FSR1MoKGNoYXJfdSAqY21kLCBpbnQgKmN0eCkpOwordm9pZCBleF9uaSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGV4cGFuZF9maWxlbmFtZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgY2hhcl91ICoqY21kbGluZXAsIGNoYXJfdSAqKmVycm9ybXNncCkpOwordm9pZCBzZXBhcmF0ZV9uZXh0Y21kIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgZW5kc19leGNtZCBfX0FSR1MoKGludCBjKSk7CitjaGFyX3UgKmZpbmRfbmV4dGNtZCBfX0FSR1MoKGNoYXJfdSAqcCkpOworY2hhcl91ICpjaGVja19uZXh0Y21kIF9fQVJHUygoY2hhcl91ICpwKSk7CitjaGFyX3UgKmdldF9jb21tYW5kX25hbWUgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCBpZHgpKTsKK3ZvaWQgdWNfY2xlYXIgX19BUkdTKChnYXJyYXlfVCAqZ2FwKSk7CitjaGFyX3UgKmdldF91c2VyX2NvbW1hbmRzIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7CitjaGFyX3UgKmdldF91c2VyX2NtZF9mbGFncyBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworY2hhcl91ICpnZXRfdXNlcl9jbWRfbmFyZ3MgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCBpZHgpKTsKK2NoYXJfdSAqZ2V0X3VzZXJfY21kX2NvbXBsZXRlIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7Cit2b2lkIG5vdF9leGl0aW5nIF9fQVJHUygodm9pZCkpOwordm9pZCBoYW5kbGVfZHJvcCBfX0FSR1MoKGludCBmaWxlYywgY2hhcl91ICoqZmlsZXYsIGludCBzcGxpdCkpOwordm9pZCBhbGlzdF9pbml0IF9fQVJHUygoYWxpc3RfVCAqYWwpKTsKK3ZvaWQgYWxpc3RfdW5saW5rIF9fQVJHUygoYWxpc3RfVCAqYWwpKTsKK3ZvaWQgYWxpc3RfbmV3IF9fQVJHUygodm9pZCkpOwordm9pZCBhbGlzdF9leHBhbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGFsaXN0X3NldCBfX0FSR1MoKGFsaXN0X1QgKmFsLCBpbnQgY291bnQsIGNoYXJfdSAqKmZpbGVzLCBpbnQgdXNlX2N1cmJ1ZikpOwordm9pZCBhbGlzdF9hZGQgX19BUkdTKChhbGlzdF9UICphbCwgY2hhcl91ICpmbmFtZSwgaW50IHNldF9mbnVtKSk7Cit2b2lkIGFsaXN0X3NsYXNoX2FkanVzdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZXhfc3BsaXR2aWV3IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRvX2V4ZWRpdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgd2luX1QgKm9sZF9jdXJ3aW4pKTsKK3ZvaWQgZG9fc2xlZXAgX19BUkdTKChsb25nIG1zZWMpKTsKK0ZJTEUgKm9wZW5fZXhmaWxlIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgaW50IGZvcmNlaXQsIGNoYXIgKm1vZGUpKTsKK3ZvaWQgdXBkYXRlX3RvcGxpbmVfY3Vyc29yIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpldmFsX3ZhcnMgX19BUkdTKChjaGFyX3UgKnNyYywgaW50ICp1c2VkbGVuLCBsaW5lbnJfVCAqbG51bXAsIGNoYXJfdSAqKmVycm9ybXNnLCBjaGFyX3UgKnNyY3N0YXJ0KSk7CitjaGFyX3UgKmV4cGFuZF9zZmlsZSBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CitpbnQgcHV0X2VvbCBfX0FSR1MoKEZJTEUgKmZkKSk7CitpbnQgcHV0X2xpbmUgX19BUkdTKChGSUxFICpmZCwgY2hhciAqcykpOwordm9pZCBkaWFsb2dfbXNnIF9fQVJHUygoY2hhcl91ICpidWZmLCBjaGFyICpmb3JtYXQsIGNoYXJfdSAqZm5hbWUpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V4X2V2YWwucHJvIGIvc3JjL3Byb3RvL2V4X2V2YWwucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWNmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZXhfZXZhbC5wcm8KQEAgLTAsMCArMSwyOSBAQAorLyogZXhfZXZhbC5jICovCitpbnQgYWJvcnRpbmcgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVwZGF0ZV9mb3JjZV9hYm9ydCBfX0FSR1MoKHZvaWQpKTsKK2ludCBzaG91bGRfYWJvcnQgX19BUkdTKChpbnQgcmV0Y29kZSkpOworaW50IGFib3J0ZWRfaW5fdHJ5IF9fQVJHUygodm9pZCkpOworaW50IGNhdXNlX2VycnRocm93IF9fQVJHUygoY2hhcl91ICptZXNnLCBpbnQgc2V2ZXJlLCBpbnQgKmlnbm9yZSkpOwordm9pZCBkb19lcnJ0aHJvdyBfX0FSR1MoKHN0cnVjdCBjb25kc3RhY2sgKmNzdGFjaywgY2hhcl91ICpjbWRuYW1lKSk7CitpbnQgZG9faW50dGhyb3cgX19BUkdTKChzdHJ1Y3QgY29uZHN0YWNrICpjc3RhY2spKTsKK3ZvaWQgZGlzY2FyZF9jdXJyZW50X2V4Y2VwdGlvbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcmVwb3J0X21ha2VfcGVuZGluZyBfX0FSR1MoKGludCBwZW5kaW5nLCB2b2lkICp2YWx1ZSkpOwordm9pZCByZXBvcnRfcmVzdW1lX3BlbmRpbmcgX19BUkdTKChpbnQgcGVuZGluZywgdm9pZCAqdmFsdWUpKTsKK3ZvaWQgcmVwb3J0X2Rpc2NhcmRfcGVuZGluZyBfX0FSR1MoKGludCBwZW5kaW5nLCB2b2lkICp2YWx1ZSkpOwordm9pZCBleF9pZiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9lbmRpZiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9lbHNlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3doaWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NvbnRpbnVlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2JyZWFrIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2VuZHdoaWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3Rocm93IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRvX3Rocm93IF9fQVJHUygoc3RydWN0IGNvbmRzdGFjayAqY3N0YWNrKSk7Cit2b2lkIGV4X3RyeSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9jYXRjaCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9maW5hbGx5IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2VuZHRyeSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGNsZWFudXBfY29uZGl0aW9uYWxzIF9fQVJHUygoc3RydWN0IGNvbmRzdGFjayAqY3N0YWNrLCBpbnQgc2VhcmNoZWRfY29uZCwgaW50IGluY2x1c2l2ZSkpOwordm9pZCBleF9lbmRmdW5jdGlvbiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOworaW50IGhhc193aGlsZV9jbWQgX19BUkdTKChjaGFyX3UgKnApKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V4X2dldGxuLnBybyBiL3NyYy9wcm90by9leF9nZXRsbi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3OTFhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9leF9nZXRsbi5wcm8KQEAgLTAsMCArMSw0NyBAQAorLyogZXhfZ2V0bG4uYyAqLworY2hhcl91ICpnZXRjbWRsaW5lIF9fQVJHUygoaW50IGZpcnN0YywgbG9uZyBjb3VudCwgaW50IGluZGVudCkpOworY2hhcl91ICpnZXRjbWRsaW5lX3Byb21wdCBfX0FSR1MoKGludCBmaXJzdGMsIGNoYXJfdSAqcHJvbXB0LCBpbnQgYXR0cikpOworY2hhcl91ICpnZXRleGxpbmUgX19BUkdTKChpbnQgYywgdm9pZCAqZHVtbXksIGludCBpbmRlbnQpKTsKK2NoYXJfdSAqZ2V0ZXhtb2RlbGluZSBfX0FSR1MoKGludCBjLCB2b2lkICpkdW1teSwgaW50IGluZGVudCkpOworaW50IGNtZGxpbmVfb3ZlcnN0cmlrZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBjbWRsaW5lX2F0X2VuZCBfX0FSR1MoKHZvaWQpKTsKK2NvbG5yX1QgY21kbGluZV9nZXR2Y29sX2N1cnNvciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcHV0Y21kbGluZSBfX0FSR1MoKGludCBjLCBpbnQgc2hpZnQpKTsKK3ZvaWQgdW5wdXRjbWRsaW5lIF9fQVJHUygodm9pZCkpOworaW50IHB1dF9vbl9jbWRsaW5lIF9fQVJHUygoY2hhcl91ICpzdHIsIGludCBsZW4sIGludCByZWRyYXcpKTsKK3ZvaWQgcmVkcmF3Y21kbGluZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcmVkcmF3Y21kIF9fQVJHUygodm9pZCkpOwordm9pZCBjb21wdXRlX2NtZHJvdyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ290b2NtZGxpbmUgX19BUkdTKChpbnQgY2xyKSk7CitjaGFyX3UgKkV4cGFuZE9uZSBfX0FSR1MoKGV4cGFuZF9UICp4cCwgY2hhcl91ICpzdHIsIGNoYXJfdSAqb3JpZywgaW50IG9wdGlvbnMsIGludCBtb2RlKSk7Cit2b2lkIEV4cGFuZEluaXQgX19BUkdTKChleHBhbmRfVCAqeHApKTsKK3ZvaWQgRXhwYW5kQ2xlYW51cCBfX0FSR1MoKGV4cGFuZF9UICp4cCkpOwordm9pZCBFeHBhbmRFc2NhcGUgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqc3RyLCBpbnQgbnVtZmlsZXMsIGNoYXJfdSAqKmZpbGVzLCBpbnQgb3B0aW9ucykpOwordm9pZCB0aWxkZV9yZXBsYWNlIF9fQVJHUygoY2hhcl91ICpvcmlnX3BhdCwgaW50IG51bV9maWxlcywgY2hhcl91ICoqZmlsZXMpKTsKK2NoYXJfdSAqc21fZ2V0dGFpbCBfX0FSR1MoKGNoYXJfdSAqcykpOworY2hhcl91ICphZGRzdGFyIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgaW50IGxlbiwgaW50IGNvbnRleHQpKTsKK3ZvaWQgc2V0X2NtZF9jb250ZXh0IF9fQVJHUygoZXhwYW5kX1QgKnhwLCBjaGFyX3UgKnN0ciwgaW50IGxlbiwgaW50IGNvbCkpOworaW50IGV4cGFuZF9jbWRsaW5lIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBjaGFyX3UgKnN0ciwgaW50IGNvbCwgaW50ICptYXRjaGNvdW50LCBjaGFyX3UgKioqbWF0Y2hlcykpOworaW50IEV4cGFuZEdlbmVyaWMgX19BUkdTKChleHBhbmRfVCAqeHAsIHJlZ21hdGNoX1QgKnJlZ21hdGNoLCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSwgY2hhcl91ICooKCpmdW5jKShleHBhbmRfVCAqLCBpbnQpKSkpOworY2hhcl91ICpnbG9icGF0aCBfX0FSR1MoKGNoYXJfdSAqcGF0aCwgY2hhcl91ICpmaWxlKSk7CitpbnQgZ2V0X2hpc3R0eXBlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGFkZF90b19oaXN0b3J5IF9fQVJHUygoaW50IGhpc3R5cGUsIGNoYXJfdSAqbmV3X2VudHJ5LCBpbnQgaW5fbWFwLCBpbnQgc2VwKSk7CitpbnQgZ2V0X2hpc3RvcnlfaWR4IF9fQVJHUygoaW50IGhpc3R5cGUpKTsKK2NoYXJfdSAqZ2V0X2NtZGxpbmVfc3RyIF9fQVJHUygodm9pZCkpOworaW50IGdldF9jbWRsaW5lX3BvcyBfX0FSR1MoKHZvaWQpKTsKK2ludCBzZXRfY21kbGluZV9wb3MgX19BUkdTKChpbnQgcG9zKSk7CitjaGFyX3UgKmdldF9oaXN0b3J5X2VudHJ5IF9fQVJHUygoaW50IGhpc3R5cGUsIGludCBpZHgpKTsKK2ludCBjbHJfaGlzdG9yeSBfX0FSR1MoKGludCBoaXN0eXBlKSk7CitpbnQgZGVsX2hpc3RvcnlfZW50cnkgX19BUkdTKChpbnQgaGlzdHlwZSwgY2hhcl91ICpzdHIpKTsKK2ludCBkZWxfaGlzdG9yeV9pZHggX19BUkdTKChpbnQgaGlzdHlwZSwgaW50IGlkeCkpOwordm9pZCByZW1vdmVfa2V5X2Zyb21faGlzdG9yeSBfX0FSR1MoKHZvaWQpKTsKK2ludCBnZXRfbGlzdF9yYW5nZSBfX0FSR1MoKGNoYXJfdSAqKnN0ciwgaW50ICpudW0xLCBpbnQgKm51bTIpKTsKK3ZvaWQgZXhfaGlzdG9yeSBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBwcmVwYXJlX3ZpbWluZm9faGlzdG9yeSBfX0FSR1MoKGludCBhc2tsZW4pKTsKK2ludCByZWFkX3ZpbWluZm9faGlzdG9yeSBfX0FSR1MoKHZpcl9UICp2aXJwKSk7Cit2b2lkIGZpbmlzaF92aW1pbmZvX2hpc3RvcnkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdyaXRlX3ZpbWluZm9faGlzdG9yeSBfX0FSR1MoKEZJTEUgKmZwKSk7Cit2b2lkIGNtZF9wY2hhciBfX0FSR1MoKGludCBjLCBpbnQgb2Zmc2V0KSk7CitpbnQgY21kX2djaGFyIF9fQVJHUygoaW50IG9mZnNldCkpOworY2hhcl91ICpzY3JpcHRfZ2V0IF9fQVJHUygoZXhhcmdfVCAqZWFwLCBjaGFyX3UgKmNtZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZmlsZWlvLnBybyBiL3NyYy9wcm90by9maWxlaW8ucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjc1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZmlsZWlvLnBybwpAQCAtMCwwICsxLDM5IEBACisvKiBmaWxlaW8uYyAqLwordm9pZCBmaWxlbWVzcyBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqbmFtZSwgY2hhcl91ICpzLCBpbnQgYXR0cikpOworaW50IHJlYWRmaWxlIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpzZm5hbWUsIGxpbmVucl9UIGZyb20sIGxpbmVucl9UIGxpbmVzX3RvX3NraXAsIGxpbmVucl9UIGxpbmVzX3RvX3JlYWQsIGV4YXJnX1QgKmVhcCwgaW50IGZsYWdzKSk7CitpbnQgcHJlcF9leGFyZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgYnVmX1QgKmJ1ZikpOworaW50IGJ1Zl93cml0ZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqc2ZuYW1lLCBsaW5lbnJfVCBzdGFydCwgbGluZW5yX1QgZW5kLCBleGFyZ19UICplYXAsIGludCBhcHBlbmQsIGludCBmb3JjZWl0LCBpbnQgcmVzZXRfY2hhbmdlZCwgaW50IGZpbHRlcmluZykpOworY2hhcl91ICpzaG9ydGVuX2ZuYW1lIF9fQVJHUygoY2hhcl91ICpmdWxsX3BhdGgsIGNoYXJfdSAqZGlyX25hbWUpKTsKK3ZvaWQgc2hvcnRlbl9mbmFtZXMgX19BUkdTKChpbnQgZm9yY2UpKTsKK3ZvaWQgc2hvcnRlbl9maWxlbmFtZXMgX19BUkdTKChjaGFyX3UgKipmbmFtZXMsIGludCBjb3VudCkpOworY2hhcl91ICptb2RuYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpleHQsIGludCBwcmVwZW5kX2RvdCkpOworY2hhcl91ICpidWZfbW9kbmFtZSBfX0FSR1MoKGludCBzaG9ydG5hbWUsIGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqZXh0LCBpbnQgcHJlcGVuZF9kb3QpKTsKK2ludCB2aW1fZmdldHMgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IHNpemUsIEZJTEUgKmZwKSk7CitpbnQgdGFnX2ZnZXRzIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBzaXplLCBGSUxFICpmcCkpOworaW50IHZpbV9yZW5hbWUgX19BUkdTKChjaGFyX3UgKmZyb20sIGNoYXJfdSAqdG8pKTsKK2ludCBjaGVja190aW1lc3RhbXBzIF9fQVJHUygoaW50IGZvY3VzKSk7CitpbnQgYnVmX2NoZWNrX3RpbWVzdGFtcCBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBmb2N1cykpOwordm9pZCBidWZfc3RvcmVfdGltZSBfX0FSR1MoKGJ1Zl9UICpidWYsIHN0cnVjdCBzdGF0ICpzdCwgY2hhcl91ICpmbmFtZSkpOwordm9pZCB3cml0ZV9sbnVtX2FkanVzdCBfX0FSR1MoKGxpbmVucl9UIG9mZnNldCkpOwordm9pZCB2aW1fZGVsdGVtcGRpciBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqdmltX3RlbXBuYW1lIF9fQVJHUygoaW50IGV4dHJhX2NoYXIpKTsKK3ZvaWQgZm9yd2FyZF9zbGFzaCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgZG9fYXVncm91cCBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgZGVsX2dyb3VwKSk7CitpbnQgY2hlY2tfZWkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGRvX2F1dG9jbWQgX19BUkdTKChjaGFyX3UgKmFyZywgaW50IGZvcmNlaXQpKTsKK2ludCBkb19kb2F1dG9jbWQgX19BUkdTKChjaGFyX3UgKmFyZywgaW50IGRvX21zZykpOwordm9pZCBleF9kb2F1dG9hbGwgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgYXVjbWRfcHJlcGJ1ZiBfX0FSR1MoKGFjb19zYXZlX1QgKmFjbywgYnVmX1QgKmJ1ZikpOwordm9pZCBhdWNtZF9yZXN0YnVmIF9fQVJHUygoYWNvX3NhdmVfVCAqYWNvKSk7CitpbnQgYXBwbHlfYXV0b2NtZHMgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmZuYW1lX2lvLCBpbnQgZm9yY2UsIGJ1Zl9UICpidWYpKTsKK2ludCBhcHBseV9hdXRvY21kc19yZXR2YWwgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmZuYW1lX2lvLCBpbnQgZm9yY2UsIGJ1Zl9UICpidWYsIGludCAqcmV0dmFsKSk7CitpbnQgaGFzX2N1cnNvcmhvbGQgX19BUkdTKCh2b2lkKSk7CitpbnQgaGFzX2F1dG9jbWQgX19BUkdTKChFVkVOVF9UIGV2ZW50LCBjaGFyX3UgKnNmbmFtZSkpOworY2hhcl91ICpnZXRfYXVncm91cF9uYW1lIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7CitjaGFyX3UgKnNldF9jb250ZXh0X2luX2F1dG9jbWQgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqYXJnLCBpbnQgZG9hdXRvY21kKSk7CitjaGFyX3UgKmdldF9ldmVudF9uYW1lIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7CitpbnQgYXVfZXhpc3RzIF9fQVJHUygoY2hhcl91ICpuYW1lLCBjaGFyX3UgKm5hbWVfZW5kLCBjaGFyX3UgKnBhdHRlcm4pKTsKK2ludCBtYXRjaF9maWxlX3BhdCBfX0FSR1MoKGNoYXJfdSAqcGF0dGVybiwgY2hhcl91ICpmbmFtZSwgY2hhcl91ICpzZm5hbWUsIGNoYXJfdSAqdGFpbCwgaW50IGFsbG93X2RpcnMpKTsKK2ludCBtYXRjaF9maWxlX2xpc3QgX19BUkdTKChjaGFyX3UgKmxpc3QsIGNoYXJfdSAqc2ZuYW1lLCBjaGFyX3UgKmZmbmFtZSkpOworY2hhcl91ICpmaWxlX3BhdF90b19yZWdfcGF0IF9fQVJHUygoY2hhcl91ICpwYXQsIGNoYXJfdSAqcGF0X2VuZCwgY2hhciAqYWxsb3dfZGlycywgaW50IG5vX2JzbGFzaCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZm9sZC5wcm8gYi9zcmMvcHJvdG8vZm9sZC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhZjMwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9mb2xkLnBybwpAQCAtMCwwICsxLDQwIEBACisvKiBmb2xkLmMgKi8KK3ZvaWQgY29weUZvbGRpbmdTdGF0ZSBfX0FSR1MoKHdpbl9UICp3cF9mcm9tLCB3aW5fVCAqd3BfdG8pKTsKK2ludCBoYXNBbnlGb2xkaW5nIF9fQVJHUygod2luX1QgKndpbikpOworaW50IGhhc0ZvbGRpbmcgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBsaW5lbnJfVCAqZmlyc3RwLCBsaW5lbnJfVCAqbGFzdHApKTsKK2ludCBoYXNGb2xkaW5nV2luIF9fQVJHUygod2luX1QgKndpbiwgbGluZW5yX1QgbG51bSwgbGluZW5yX1QgKmZpcnN0cCwgbGluZW5yX1QgKmxhc3RwLCBpbnQgY2FjaGUsIGZvbGRpbmZvX1QgKmluZm9wKSk7CitpbnQgZm9sZExldmVsIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IGxpbmVGb2xkZWQgX19BUkdTKCh3aW5fVCAqd2luLCBsaW5lbnJfVCBsbnVtKSk7Citsb25nIGZvbGRlZENvdW50IF9fQVJHUygod2luX1QgKndpbiwgbGluZW5yX1QgbG51bSwgZm9sZGluZm9fVCAqaW5mb3ApKTsKK2ludCBmb2xkbWV0aG9kSXNNYW51YWwgX19BUkdTKCh3aW5fVCAqd3ApKTsKK2ludCBmb2xkbWV0aG9kSXNJbmRlbnQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK2ludCBmb2xkbWV0aG9kSXNFeHByIF9fQVJHUygod2luX1QgKndwKSk7CitpbnQgZm9sZG1ldGhvZElzTWFya2VyIF9fQVJHUygod2luX1QgKndwKSk7CitpbnQgZm9sZG1ldGhvZElzU3ludGF4IF9fQVJHUygod2luX1QgKndwKSk7CitpbnQgZm9sZG1ldGhvZElzRGlmZiBfX0FSR1MoKHdpbl9UICp3cCkpOwordm9pZCBjbG9zZUZvbGQgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBsb25nIGNvdW50KSk7Cit2b2lkIGNsb3NlRm9sZFJlY3Vyc2UgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7Cit2b2lkIG9wRm9sZFJhbmdlIF9fQVJHUygobGluZW5yX1QgZmlyc3QsIGxpbmVucl9UIGxhc3QsIGludCBvcGVuaW5nLCBpbnQgcmVjdXJzZSwgaW50IGhhZF92aXN1YWwpKTsKK3ZvaWQgb3BlbkZvbGQgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBsb25nIGNvdW50KSk7Cit2b2lkIG9wZW5Gb2xkUmVjdXJzZSBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK3ZvaWQgZm9sZE9wZW5DdXJzb3IgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG5ld0ZvbGRMZXZlbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZm9sZENoZWNrQ2xvc2UgX19BUkdTKCh2b2lkKSk7CitpbnQgZm9sZE1hbnVhbEFsbG93ZWQgX19BUkdTKChpbnQgY3JlYXRlKSk7Cit2b2lkIGZvbGRDcmVhdGUgX19BUkdTKChsaW5lbnJfVCBzdGFydCwgbGluZW5yX1QgZW5kKSk7Cit2b2lkIGRlbGV0ZUZvbGQgX19BUkdTKChsaW5lbnJfVCBzdGFydCwgbGluZW5yX1QgZW5kLCBpbnQgcmVjdXJzaXZlLCBpbnQgaGFkX3Zpc3VhbCkpOwordm9pZCBjbGVhckZvbGRpbmcgX19BUkdTKCh3aW5fVCAqd2luKSk7Cit2b2lkIGZvbGRVcGRhdGUgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIHRvcCwgbGluZW5yX1QgYm90KSk7Cit2b2lkIGZvbGRVcGRhdGVBbGwgX19BUkdTKCh3aW5fVCAqd2luKSk7CitpbnQgZm9sZE1vdmVUbyBfX0FSR1MoKGludCB1cGRvd24sIGludCBkaXIsIGxvbmcgY291bnQpKTsKK3ZvaWQgZm9sZEluaXRXaW4gX19BUkdTKCh3aW5fVCAqbmV3d2luKSk7CitpbnQgZmluZF93bF9lbnRyeSBfX0FSR1MoKHdpbl9UICp3aW4sIGxpbmVucl9UIGxudW0pKTsKK3ZvaWQgZm9sZEFkanVzdFZpc3VhbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZm9sZEFkanVzdEN1cnNvciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2xvbmVGb2xkR3Jvd0FycmF5IF9fQVJHUygoZ2FycmF5X1QgKmZyb20sIGdhcnJheV9UICp0bykpOwordm9pZCBkZWxldGVGb2xkUmVjdXJzZSBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgZm9sZE1hcmtBZGp1c3QgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxpbmUxLCBsaW5lbnJfVCBsaW5lMiwgbG9uZyBhbW91bnQsIGxvbmcgYW1vdW50X2FmdGVyKSk7CitpbnQgZ2V0RGVlcGVzdE5lc3RpbmcgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGZvbGR0ZXh0X2NsZWFudXAgX19BUkdTKChjaGFyX3UgKnN0cikpOworaW50IHB1dF9mb2xkcyBfX0FSR1MoKEZJTEUgKmZkLCB3aW5fVCAqd3ApKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2dldGNoYXIucHJvIGIvc3JjL3Byb3RvL2dldGNoYXIucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDliNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ2V0Y2hhci5wcm8KQEAgLTAsMCArMSw2MSBAQAorLyogZ2V0Y2hhci5jICovCit2b2lkIGZyZWVfYnVmZiBfX0FSR1MoKHN0cnVjdCBidWZmaGVhZGVyICpidWYpKTsKK2NoYXJfdSAqZ2V0X3JlY29yZGVkIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfaW5zZXJ0ZWQgX19BUkdTKCh2b2lkKSk7CitpbnQgc3R1ZmZfZW1wdHkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHR5cGVhaGVhZF9ub2ZsdXNoIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgZmx1c2hfYnVmZmVycyBfX0FSR1MoKGludCB0eXBlYWhlYWQpKTsKK3ZvaWQgUmVzZXRSZWRvYnVmZiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2F2ZVJlZG9idWZmIF9fQVJHUygodm9pZCkpOwordm9pZCByZXN0b3JlUmVkb2J1ZmYgX19BUkdTKCh2b2lkKSk7Cit2b2lkIEFwcGVuZFRvUmVkb2J1ZmYgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgQXBwZW5kVG9SZWRvYnVmZkxpdCBfX0FSR1MoKGNoYXJfdSAqcykpOwordm9pZCBBcHBlbmRDaGFyVG9SZWRvYnVmZiBfX0FSR1MoKGludCBjKSk7Cit2b2lkIEFwcGVuZE51bWJlclRvUmVkb2J1ZmYgX19BUkdTKChsb25nIG4pKTsKK3ZvaWQgc3R1ZmZSZWFkYnVmZiBfX0FSR1MoKGNoYXJfdSAqcykpOwordm9pZCBzdHVmZlJlYWRidWZmTGVuIF9fQVJHUygoY2hhcl91ICpzLCBsb25nIGxlbikpOwordm9pZCBzdHVmZlJlYWRidWZmU3BlYyBfX0FSR1MoKGNoYXJfdSAqcykpOwordm9pZCBzdHVmZmNoYXJSZWFkYnVmZiBfX0FSR1MoKGludCBjKSk7Cit2b2lkIHN0dWZmbnVtUmVhZGJ1ZmYgX19BUkdTKChsb25nIG4pKTsKK2ludCBzdGFydF9yZWRvIF9fQVJHUygobG9uZyBjb3VudCwgaW50IG9sZF9yZWRvKSk7CitpbnQgc3RhcnRfcmVkb19pbnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHN0b3BfcmVkb19pbnMgX19BUkdTKCh2b2lkKSk7CitpbnQgaW5zX3R5cGVidWYgX19BUkdTKChjaGFyX3UgKnN0ciwgaW50IG5vcmVtYXAsIGludCBvZmZzZXQsIGludCBub3R0eXBlZCwgaW50IHNpbGVudCkpOworaW50IHR5cGVidWZfY2hhbmdlZCBfX0FSR1MoKGludCB0Yl9jaGFuZ2VfY250KSk7CitpbnQgdHlwZWJ1Zl90eXBlZCBfX0FSR1MoKHZvaWQpKTsKK2ludCB0eXBlYnVmX21hcGxlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZGVsX3R5cGVidWYgX19BUkdTKChpbnQgbGVuLCBpbnQgb2Zmc2V0KSk7CitpbnQgYWxsb2NfdHlwZWJ1ZiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZnJlZV90eXBlYnVmIF9fQVJHUygodm9pZCkpOworaW50IHNhdmVfdHlwZWJ1ZiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2F2ZV90eXBlYWhlYWQgX19BUkdTKCh0YXNhdmVfVCAqdHApKTsKK3ZvaWQgcmVzdG9yZV90eXBlYWhlYWQgX19BUkdTKCh0YXNhdmVfVCAqdHApKTsKK3ZvaWQgb3BlbnNjcmlwdCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGRpcmVjdGx5KSk7CitpbnQgdXNpbmdfc2NyaXB0IF9fQVJHUygodm9pZCkpOwordm9pZCB1cGRhdGVzY3JpcHQgX19BUkdTKChpbnQgYykpOworaW50IHZnZXRjIF9fQVJHUygodm9pZCkpOworaW50IHNhZmVfdmdldGMgX19BUkdTKCh2b2lkKSk7CitpbnQgdnBlZWtjIF9fQVJHUygodm9pZCkpOworaW50IHZwZWVrY19ub21hcCBfX0FSR1MoKHZvaWQpKTsKK2ludCB2cGVla2NfYW55IF9fQVJHUygodm9pZCkpOworaW50IGNoYXJfYXZhaWwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHZ1bmdldGMgX19BUkdTKChpbnQgYykpOworaW50IGluY2hhciBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgbWF4bGVuLCBsb25nIHdhaXRfdGltZSwgaW50IHRiX2NoYW5nZV9jbnQpKTsKK2ludCBmaXhfaW5wdXRfYnVmZmVyIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4sIGludCBzY3JpcHQpKTsKK2ludCBpbnB1dF9hdmFpbGFibGUgX19BUkdTKCh2b2lkKSk7CitpbnQgZG9fbWFwIF9fQVJHUygoaW50IG1hcHR5cGUsIGNoYXJfdSAqYXJnLCBpbnQgbW9kZSwgaW50IGFiYnJldikpOworaW50IGdldF9tYXBfbW9kZSBfX0FSR1MoKGNoYXJfdSAqKmNtZHAsIGludCBmb3JjZWl0KSk7Cit2b2lkIG1hcF9jbGVhciBfX0FSR1MoKGNoYXJfdSAqY21kcCwgY2hhcl91ICphcmcsIGludCBmb3JjZWl0LCBpbnQgYWJicikpOwordm9pZCBtYXBfY2xlYXJfaW50IF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IG1vZGUsIGludCBsb2NhbCwgaW50IGFiYnIpKTsKK2ludCBtYXBfdG9fZXhpc3RzIF9fQVJHUygoY2hhcl91ICpzdHIsIGNoYXJfdSAqbW9kZWNoYXJzKSk7CitpbnQgbWFwX3RvX2V4aXN0c19tb2RlIF9fQVJHUygoY2hhcl91ICpyaHMsIGludCBtb2RlKSk7CitjaGFyX3UgKnNldF9jb250ZXh0X2luX21hcF9jbWQgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqY21kLCBjaGFyX3UgKmFyZywgaW50IGZvcmNlaXQsIGludCBpc2FiYnJldiwgaW50IGlzdW5tYXAsIGNtZGlkeF9UIGNtZGlkeCkpOworaW50IEV4cGFuZE1hcHBpbmdzIF9fQVJHUygocmVnbWF0Y2hfVCAqcmVnbWF0Y2gsIGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlKSk7CitpbnQgY2hlY2tfYWJiciBfX0FSR1MoKGludCBjLCBjaGFyX3UgKnB0ciwgaW50IGNvbCwgaW50IG1pbmNvbCkpOworaW50IG1ha2VtYXAgX19BUkdTKChGSUxFICpmZCwgYnVmX1QgKmJ1ZikpOworaW50IHB1dF9lc2NzdHIgX19BUkdTKChGSUxFICpmZCwgY2hhcl91ICpzdHJzdGFydCwgaW50IHdoYXQpKTsKK3ZvaWQgY2hlY2tfbWFwX2tleWNvZGVzIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpjaGVja19tYXAgX19BUkdTKChjaGFyX3UgKmtleXMsIGludCBtb2RlLCBpbnQgZXhhY3QpKTsKK3ZvaWQgaW5pdF9tYXBwaW5ncyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgYWRkX21hcCBfX0FSR1MoKGNoYXJfdSAqbWFwLCBpbnQgbW9kZSkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpLnBybyBiL3NyYy9wcm90by9ndWkucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjU0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ3VpLnBybwpAQCAtMCwwICsxLDYxIEBACisvKiBndWkuYyAqLwordm9pZCBndWlfc3RhcnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9wcmVwYXJlIF9fQVJHUygoaW50ICphcmdjLCBjaGFyICoqYXJndikpOworaW50IGd1aV9pbml0X2NoZWNrIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX2V4aXQgX19BUkdTKChpbnQgcmMpKTsKK3ZvaWQgZ3VpX3NoZWxsX2Nsb3NlZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfaW5pdF9mb250IF9fQVJHUygoY2hhcl91ICpmb250X2xpc3QsIGludCBmb250c2V0KSk7CitpbnQgZ3VpX2dldF93aWRlX2ZvbnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9zZXRfY3Vyc29yIF9fQVJHUygoaW50IHJvdywgaW50IGNvbCkpOwordm9pZCBndWlfdXBkYXRlX2N1cnNvciBfX0FSR1MoKGludCBmb3JjZSwgaW50IGNsZWFyX3NlbGVjdGlvbikpOwordm9pZCBndWlfcG9zaXRpb25fbWVudSBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfZ2V0X2Jhc2Vfd2lkdGggX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX2dldF9iYXNlX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX3Jlc2l6ZV9zaGVsbCBfX0FSR1MoKGludCBwaXhlbF93aWR0aCwgaW50IHBpeGVsX2hlaWdodCkpOwordm9pZCBndWlfbWF5X3Jlc2l6ZV9zaGVsbCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfZ2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX3NldF9zaGVsbHNpemUgX19BUkdTKChpbnQgbXVzdHNldCwgaW50IGZpdF90b19kaXNwbGF5KSk7Cit2b2lkIGd1aV9uZXdfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfcmVzZXRfc2Nyb2xsX3JlZ2lvbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX3N0YXJ0X2hpZ2hsaWdodCBfX0FSR1MoKGludCBtYXNrKSk7Cit2b2lkIGd1aV9zdG9wX2hpZ2hsaWdodCBfX0FSR1MoKGludCBtYXNrKSk7Cit2b2lkIGd1aV9jbGVhcl9ibG9jayBfX0FSR1MoKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKSk7Cit2b2lkIGd1aV91cGRhdGVfY3Vyc29yX2xhdGVyIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfd3JpdGUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK3ZvaWQgZ3VpX2RvbnRfdXBkYXRlX2N1cnNvciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX2Nhbl91cGRhdGVfY3Vyc29yIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9vdXRzdHJfbm93cmFwIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuLCBpbnQgZmxhZ3MsIGd1aWNvbG9yX1QgZmcsIGd1aWNvbG9yX1QgYmcsIGludCBiYWNrKSk7Cit2b2lkIGd1aV91bmRyYXdfY3Vyc29yIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfcmVkcmF3IF9fQVJHUygoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK2ludCBndWlfcmVkcmF3X2Jsb2NrIF9fQVJHUygoaW50IHJvdzEsIGludCBjb2wxLCBpbnQgcm93MiwgaW50IGNvbDIsIGludCBmbGFncykpOworaW50IGd1aV93YWl0X2Zvcl9jaGFycyBfX0FSR1MoKGxvbmcgd3RpbWUpKTsKK3ZvaWQgZ3VpX3NlbmRfbW91c2VfZXZlbnQgX19BUkdTKChpbnQgYnV0dG9uLCBpbnQgeCwgaW50IHksIGludCByZXBlYXRlZF9jbGljaywgaW50X3UgbW9kaWZpZXJzKSk7CitpbnQgZ3VpX3h5MmNvbHJvdyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50ICpjb2xwKSk7Cit2b2lkIGd1aV9tZW51X2NiIF9fQVJHUygodmltbWVudV9UICptZW51KSk7Cit2b2lkIGd1aV9pbml0X3doaWNoX2NvbXBvbmVudHMgX19BUkdTKChjaGFyX3UgKm9sZHZhbCkpOwordm9pZCBndWlfY3JlYXRlX3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IHR5cGUsIHdpbl9UICp3cCkpOworc2Nyb2xsYmFyX1QgKmd1aV9maW5kX3Njcm9sbGJhciBfX0FSR1MoKGxvbmcgaWRlbnQpKTsKK3ZvaWQgZ3VpX2RyYWdfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBsb25nIHZhbHVlLCBpbnQgc3RpbGxfZHJhZ2dpbmcpKTsKK3ZvaWQgZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzIF9fQVJHUygoaW50IGZvcmNlKSk7CitpbnQgZ3VpX2RvX3Njcm9sbCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfZG9faG9yaXpfc2Nyb2xsIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfY2hlY2tfY29sb3JzIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfc2V0X2ZnX2NvbG9yIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9zZXRfYmdfY29sb3IgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2d1aWNvbG9yX1QgZ3VpX2dldF9jb2xvciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IGd1aV9nZXRfbGlnaHRuZXNzIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOwordm9pZCBndWlfbmV3X3Njcm9sbGJhcl9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9mb2N1c19jaGFuZ2UgX19BUkdTKChpbnQgaW5fZm9jdXMpKTsKK3ZvaWQgZ3VpX21vdXNlX21vdmVkIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tb3VzZV9jb3JyZWN0IF9fQVJHUygodm9pZCkpOwordm9pZCBleF9ndWkgX19BUkdTKChleGFyZ19UICplYXApKTsKK2ludCBndWlfZmluZF9iaXRtYXAgX19BUkdTKChjaGFyX3UgKm5hbWUsIGNoYXJfdSAqYnVmZmVyLCBjaGFyICpleHQpKTsKK3ZvaWQgZ3VpX2ZpbmRfaWNvbmZpbGUgX19BUkdTKChjaGFyX3UgKm5hbWUsIGNoYXJfdSAqYnVmZmVyLCBjaGFyICpleHQpKTsKK3ZvaWQgZGlzcGxheV9lcnJvcnMgX19BUkdTKCh2b2lkKSk7CitpbnQgbm9fY29uc29sZV9pbnB1dCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX3VwZGF0ZV9zY3JlZW4gX19BUkdTKCh2b2lkKSk7CitjaGFyX3UgKmdldF9maW5kX2RpYWxvZ190ZXh0IF9fQVJHUygoY2hhcl91ICphcmcsIGludCAqd3dvcmRwLCBpbnQgKm1jYXNlcCkpOworaW50IGd1aV9kb19maW5kcmVwbCBfX0FSR1MoKGludCBmbGFncywgY2hhcl91ICpmaW5kX3RleHQsIGNoYXJfdSAqcmVwbF90ZXh0LCBpbnQgZG93bikpOwordm9pZCBndWlfaGFuZGxlX2Ryb3AgX19BUkdTKChpbnQgeCwgaW50IHksIGludF91IG1vZGlmaWVycywgY2hhcl91ICoqZm5hbWVzLCBpbnQgY291bnQpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2d1aV9hbWlnYS5wcm8gYi9zcmMvcHJvdG8vZ3VpX2FtaWdhLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzcwYmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2d1aV9hbWlnYS5wcm8KQEAgLTAsMCArMSw2NyBAQAorLyogZ3VpX2FtaWdhLmMgKi8KK3ZvaWQgZ3VpX21jaF9hZGRfbWVudV9pdGVtIF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgaWR4KSk7Cit2b2lkIGd1aV9tY2hfYWRkX21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBpZHgpKTsKK3ZvaWQgZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMgX19BUkdTKChpbnQgZW5hYmxlKSk7CitpbnQgZ3VpX21jaF9zZXRfYmxpbmtpbmcgX19BUkdTKChsb25nIHdhaXQsIGxvbmcgb24sIGxvbmcgb2ZmKSk7Cit2b2lkIGd1aV9tY2hfcHJlcGFyZSBfX0FSR1MoKGludCAqYXJnYywgY2hhciAqKmFyZ3YpKTsKK3ZvaWQgYXRleGl0RG9UaGlzIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfaW5pdF9jaGVjayBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfbmV3X2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX29wZW4gX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZXhpdCBfX0FSR1MoKGludCByZXR1cm5Db2RlKSk7CitpbnQgZ3VpX21jaF9nZXRfd2lucG9zIF9fQVJHUygoaW50ICp4LCBpbnQgKnkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2lucG9zIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMgX19BUkdTKChpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBmbGFnKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYiBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9jcmVhdGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgb3JpZW50KSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IpKTsKK2ludCBndWlfbWNoX2luaXRfZm9udCBfX0FSR1MoKGNoYXJfdSAqZm9udF9uYW1lLCBpbnQgZm9udHNldCkpOworaW50IGd1aV9tY2hfYWRqdXN0X2NoYXJzaXplIF9fQVJHUygodm9pZCkpOworR3VpRm9udCBndWlfbWNoX2dldF9mb250IF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgZ2l2ZUVycm9ySWZNaXNzaW5nKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvbnQgX19BUkdTKChHdWlGb250IGZvbnQpKTsKK3ZvaWQgZ3VpX21jaF9mcmVlX2ZvbnQgX19BUkdTKChHdWlGb250IGZvbnQpKTsKK2d1aWNvbG9yX1QgZ3VpX21jaF9nZXRfY29sb3IgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfY29sb3JzIF9fQVJHUygoZ3VpY29sb3JfVCBmZywgZ3VpY29sb3JfVCBiZykpOwordm9pZCBndWlfbWNoX3NldF9mZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfYmdfY29sb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19zdHJpbmcgX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncykpOworaW50IGd1aV9tY2hfaGFza2V5IF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9tY2hfYmVlcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9mbGFzaCBfX0FSR1MoKGludCBtc2VjKSk7Cit2b2lkIGd1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZSBfX0FSR1MoKGludCByLCBpbnQgYywgaW50IG5yLCBpbnQgbmMpKTsKK3ZvaWQgZ3VpX21jaF9pY29uaWZ5IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF9mb3JlZ3JvdW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldHRpdGxlIF9fQVJHUygoY2hhcl91ICp0aXRsZSwgY2hhcl91ICppY29uKSk7Cit2b2lkIGd1aV9tY2hfc3RvcF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zdGFydF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19wYXJ0X2N1cnNvciBfX0FSR1MoKGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3VwZGF0ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX3dhaXRfZm9yX2NoYXJzIF9fQVJHUygoaW50IHd0aW1lKSk7Cit2b2lkIGd1aV9tY2hfZmx1c2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYmxvY2sgX19BUkdTKChpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikpOwordm9pZCBndWlfbWNoX2NsZWFyX2FsbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kZWxldGVfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGd1aV9tY2hfaW5zZXJ0X2xpbmVzIF9fQVJHUygoaW50IHJvdywgaW50IG51bV9saW5lcykpOwordm9pZCBndWlfbWNoX2VuYWJsZV9tZW51IF9fQVJHUygoaW50IGZsYWcpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfbWVudV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX21lbnVfZ3JleSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGdyZXkpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2hpZGRlbiBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikpOwordm9pZCBndWlfbWNoX2RyYXdfbWVudWJhciBfX0FSR1MoKHZvaWQpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV95IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2hvd19wb3B1cG1lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3ZvaWQgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfbWNoX3NldF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOworbG9uZ191IGd1aV9tY2hfZ2V0X3JnYiBfX0FSR1MoKGd1aWNvbG9yX1QgcGl4ZWwpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2d1aV9hdGhlbmEucHJvIGIvc3JjL3Byb3RvL2d1aV9hdGhlbmEucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2MzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ3VpX2F0aGVuYS5wcm8KQEAgLTAsMCArMSwzMSBAQAorLyogZ3VpX2F0aGVuYS5jICovCit2b2lkIGd1aV94MTFfY3JlYXRlX3dpZGdldHMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV94MTFfZGVzdHJveV93aWRnZXRzIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF90b29sYmFyX3BvcyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfeDExX3NldF9iYWNrX2NvbG9yIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2VuYWJsZV9tZW51IF9fQVJHUygoaW50IGZsYWcpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfbWVudV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2FkZF9tZW51IF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgaWR4KSk7Cit2b2lkIGd1aV9tY2hfbmV3X21lbnVfZm9udCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfdG9vbHRpcF9mb250IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX25ld190b29sdGlwX2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9hZGRfbWVudV9pdGVtIF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgaWR4KSk7Cit2b2lkIGd1aV9tY2hfc2hvd190b29sYmFyIF9fQVJHUygoaW50IHNob3dpdCkpOworaW50IGd1aV9tY2hfY29tcHV0ZV90b29sYmFyX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfdG9vbGJhcl9jb2xvcnMgX19BUkdTKChQaXhlbCAqYmdwLCBQaXhlbCAqZmdwLCBQaXhlbCAqYnNwLCBQaXhlbCAqdHNwLCBQaXhlbCAqaHNwKSk7Cit2b2lkIGd1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzIF9fQVJHUygoaW50IGVuYWJsZSkpOwordm9pZCBndWlfbWNoX25ld19tZW51X2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX2RlZl9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYiBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykpOwordm9pZCBndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYikpOwordm9pZCBndWlfbWNoX3NldF9zY3JvbGxiYXJfY29sb3JzIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiKSk7CitXaW5kb3cgZ3VpX3gxMV9nZXRfd2lkIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpndWlfbWNoX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGZsdCwgY2hhcl91ICpleHQsIGNoYXJfdSAqaW5pdGRpciwgY2hhcl91ICpmaWx0ZXIpKTsKK2ludCBndWlfbWNoX2RpYWxvZyBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGNoYXJfdSAqYnV0dG9ucywgaW50IGRmbHRidXR0b24sIGNoYXJfdSAqdGV4dGZpZWxkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfYmVvcy5wcm8gYi9zcmMvcHJvdG8vZ3VpX2Jlb3MucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTI4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ3VpX2Jlb3MucHJvCkBAIC0wLDAgKzEsMTQgQEAKKy8qIGd1aV9iZW9zLmNjIC0gaGFuZCBjcmFmdGVkICovCitpbnQgdmltX2xvY2tfc2NyZWVuIF9fQVJHUygodm9pZCkpOwordm9pZCB2aW1fdW5sb2NrX3NjcmVlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9wcmVwYXJlIF9fQVJHUygoaW50ICphcmdjLCBjaGFyICoqYXJndikpOworaW50IGd1aV9tY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfY29sb3JzIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfb3BlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9leGl0IF9fQVJHUygoaW50IHZpbV9leGl0Y29kZSkpOworR3VpRm9udCBndWlfbWNoX2dldF9mb250IF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgZ2l2ZUVycm9ySWZNaXNzaW5nKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2JnX2NvbG9yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3NldF9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7Cit2b2lkIGd1aV9tY2hfZmx1c2ggX19BUkdTKCh2b2lkKSk7Citsb25nX3UgZ3VpX21jaF9nZXRfcmdiIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOwordm9pZCBndWlfbWNoX3NldF93aW5wb3MgX19BUkdTKChpbnQgeCwgaW50IHkpKTsKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfYmV2YWwucHJvIGIvc3JjL3Byb3RvL2d1aV9iZXZhbC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwYjBlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfYmV2YWwucHJvCkBAIC0wLDAgKzEsMTAgQEAKKy8qIGd1aV9iZXZhbC5jICovCitCYWxsb29uRXZhbCAqZ3VpX21jaF9jcmVhdGVfYmV2YWxfYXJlYSBfX0FSR1MoKHZvaWQgKnRhcmdldCwgY2hhcl91ICptZXNnLCB2b2lkICgqbWVzZ0NCKShCYWxsb29uRXZhbCAqLCBpbnQpLCB2b2lkICpjbGllbnREYXRhKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9iZXZhbF9hcmVhIF9fQVJHUygoQmFsbG9vbkV2YWwgKmJldmFsKSk7Cit2b2lkIGd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEgX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwpKTsKK3ZvaWQgZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEgX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwpKTsKK0JhbGxvb25FdmFsICpndWlfbWNoX2N1cnJlbnRseV9zaG93aW5nX2JldmFsIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfZ2V0X2JldmFsX2luZm8gX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwsIGNoYXJfdSAqKmZpbGVuYW1lLCBpbnQgKmxpbmUsIGNoYXJfdSAqKnRleHQsIGludCAqaWR4KSk7Cit2b2lkIGd1aV9tY2hfcG9zdF9iYWxsb29uIF9fQVJHUygoQmFsbG9vbkV2YWwgKmJldmFsLCBjaGFyX3UgKm1lc2cpKTsKK3ZvaWQgZ3VpX21jaF91bnBvc3RfYmFsbG9vbiBfX0FSR1MoKEJhbGxvb25FdmFsICpiZXZhbCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpX2d0ay5wcm8gYi9zcmMvcHJvdG8vZ3VpX2d0ay5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMjIwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfZ3RrLnBybwpAQCAtMCwwICsxLDI0IEBACisvKiBndWlfZ3RrLmMgKi8KK3ZvaWQgZ3VpX2d0a19yZWdpc3Rlcl9zdG9ja19pY29ucyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9hZGRfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkpOwordm9pZCBndWlfbWNoX2FkZF9tZW51X2l0ZW0gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBpZHgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9ndGtfc2V0X21uZW1vbmljcyBfX0FSR1MoKGludCBlbmFibGUpKTsKK3ZvaWQgZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMgX19BUkdTKChpbnQgZW5hYmxlKSk7Cit2b2lkIGd1aV9tY2hfbWVudV9zZXRfdGlwIF9fQVJHUygodmltbWVudV9UICptZW51KSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9tZW51IF9fQVJHUygodmltbWVudV9UICptZW51KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYiBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9jcmVhdGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgb3JpZW50KSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IpKTsKK2NoYXJfdSAqZ3VpX21jaF9icm93c2UgX19BUkdTKChpbnQgc2F2aW5nLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKmRmbHQsIGNoYXJfdSAqZXh0LCBjaGFyX3UgKmluaXRkaXIsIGNoYXJfdSAqZmlsdGVyKSk7CitpbnQgZ3VpX21jaF9kaWFsb2cgX19BUkdTKChpbnQgdHlwZSwgY2hhcl91ICp0aXRsZSwgY2hhcl91ICptZXNzYWdlLCBjaGFyX3UgKmJ1dHRvbnMsIGludCBkZWZfYnV0LCBjaGFyX3UgKnRleHRmaWVsZCkpOworaW50IGd1aV9tY2hfZGlhbG9nIF9fQVJHUygoaW50IHR5cGUsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqbWVzc2FnZSwgY2hhcl91ICpidXR0b25zLCBpbnQgZGVmX2J1dCwgY2hhcl91ICp0ZXh0ZmllbGQpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWFrZV9wb3B1cCBfX0FSR1MoKGNoYXJfdSAqcGF0aF9uYW1lKSk7Cit2b2lkIGd1aV9tY2hfZmluZF9kaWFsb2cgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZ3VpX21jaF9yZXBsYWNlX2RpYWxvZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBndWlfZ3RrX3N5bmNoX2ZvbnRzIF9fQVJHUygodm9pZCkpOwordm9pZCBleF9oZWxwZmluZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBndWlfZ3RrX3Bvc2l0aW9uX2luX3BhcmVudCBfX0FSR1MoKEd0a1dpZGdldCAqcGFyZW50LCBHdGtXaWRnZXQgKmNoaWxkLCBndWlfd2luX3Bvc19UIHdoZXJlKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfZ3RrX3gxMS5wcm8gYi9zcmMvcHJvdG8vZ3VpX2d0a194MTEucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYmZhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vZ3VpX2d0a194MTEucHJvCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGd1aV9ndGtfeDExLmMgKi8KK3ZvaWQgZ3VpX21jaF9wcmVwYXJlIF9fQVJHUygoaW50ICphcmdjLCBjaGFyICoqYXJndikpOwordm9pZCBndWlfbWNoX3NldF9ibGlua2luZyBfX0FSR1MoKGxvbmcgd2FpdHRpbWUsIGxvbmcgb24sIGxvbmcgb2ZmKSk7Cit2b2lkIGd1aV9tY2hfc3RvcF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zdGFydF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2luaXRfY2hlY2sgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2ZvcmtlZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfY29sb3JzIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfb3BlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9leGl0IF9fQVJHUygoaW50IHJjKSk7CitpbnQgZ3VpX21jaF9nZXRfd2lucG9zIF9fQVJHUygoaW50ICp4LCBpbnQgKnkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2lucG9zIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMgX19BUkdTKChpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKSk7Cit2b2lkIGd1aV9tY2hfc2V0dGl0bGUgX19BUkdTKChjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKmljb24pKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfbWVudSBfX0FSR1MoKGludCBzaG93aXQpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3Rvb2xiYXIgX19BUkdTKChpbnQgc2hvd2l0KSk7CitpbnQgZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUgX19BUkdTKCh2b2lkKSk7CitHdWlGb250c2V0IGd1aV9tY2hfZ2V0X2ZvbnRzZXQgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCByZXBvcnRfZXJyb3IsIGludCBmaXhlZF93aWR0aCkpOworY2hhcl91ICpndWlfbWNoX2ZvbnRfZGlhbG9nIF9fQVJHUygoY2hhcl91ICpvbGR2YWwpKTsKK2ludCBndWlfbWNoX2luaXRfZm9udCBfX0FSR1MoKGNoYXJfdSAqZm9udF9uYW1lLCBpbnQgZm9udHNldCkpOworR3VpRm9udCBndWlfbWNoX2dldF9mb250IF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgcmVwb3J0X2Vycm9yKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvbnQgX19BUkdTKChHdWlGb250IGZvbnQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9udHNldCBfX0FSR1MoKEd1aUZvbnRzZXQgZm9udHNldCkpOwordm9pZCBndWlfbWNoX2ZyZWVfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOwordm9pZCBndWlfbWNoX2ZyZWVfZm9udHNldCBfX0FSR1MoKEd1aUZvbnRzZXQgZm9udHNldCkpOworZ3VpY29sb3JfVCBndWlfbWNoX2dldF9jb2xvciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwordm9pZCBndWlfbWNoX3NldF9mZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfYmdfY29sb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7CitpbnQgZ3VpX2d0azJfZHJhd19zdHJpbmcgX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncykpOwordm9pZCBndWlfbWNoX2RyYXdfc3RyaW5nIF9fQVJHUygoaW50IHJvdywgaW50IGNvbCwgY2hhcl91ICpzLCBpbnQgbGVuLCBpbnQgZmxhZ3MpKTsKK2ludCBndWlfbWNoX2hhc2tleSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IGd1aV9nZXRfeDExX3dpbmRpcyBfX0FSR1MoKFdpbmRvdyAqd2luLCBEaXNwbGF5ICoqZGlzKSk7CitEaXNwbGF5ICpndWlfbWNoX2dldF9kaXNwbGF5IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2JlZXAgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZmxhc2ggX19BUkdTKChpbnQgbXNlYykpOwordm9pZCBndWlfbWNoX2ludmVydF9yZWN0YW5nbGUgX19BUkdTKChpbnQgciwgaW50IGMsIGludCBuciwgaW50IG5jKSk7Cit2b2lkIGd1aV9tY2hfaWNvbmlmeSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19wYXJ0X2N1cnNvciBfX0FSR1MoKGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3VwZGF0ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX3dhaXRfZm9yX2NoYXJzIF9fQVJHUygobG9uZyB3dGltZSkpOwordm9pZCBndWlfbWNoX2ZsdXNoIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2NsZWFyX2Jsb2NrIF9fQVJHUygoaW50IHJvdzEsIGludCBjb2wxLCBpbnQgcm93MiwgaW50IGNvbDIpKTsKK3ZvaWQgZ3VpX21jaF9jbGVhcl9hbGwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZGVsZXRlX2xpbmVzIF9fQVJHUygoaW50IHJvdywgaW50IG51bV9saW5lcykpOwordm9pZCBndWlfbWNoX2luc2VydF9saW5lcyBfX0FSR1MoKGludCByb3csIGludCBudW1fbGluZXMpKTsKK3ZvaWQgY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9sb3NlX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7CitpbnQgY2xpcF9tY2hfb3duX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfbWNoX3NldF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBndWlfbWNoX21lbnVfZ3JleSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGdyZXkpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2hpZGRlbiBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikpOwordm9pZCBndWlfbWNoX2RyYXdfbWVudWJhciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykpOworbG9uZ191IGd1aV9tY2hfZ2V0X3JnYiBfX0FSR1MoKGd1aWNvbG9yX1QgcGl4ZWwpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV94IF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfZ2V0X21vdXNlX3kgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0bW91c2UgX19BUkdTKChpbnQgeCwgaW50IHkpKTsKK3ZvaWQgZ3VpX21jaF9tb3VzZWhpZGUgX19BUkdTKChpbnQgaGlkZSkpOwordm9pZCBtY2hfc2V0X21vdXNlX3NoYXBlIF9fQVJHUygoaW50IHNoYXBlKSk7Cit2b2lkIGd1aV9tY2hfZHJhd3NpZ24gX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBpbnQgdHlwZW5yKSk7Cit2b2lkICpndWlfbWNoX3JlZ2lzdGVyX3NpZ24gX19BUkdTKChjaGFyX3UgKnNpZ25maWxlKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zaWduIF9fQVJHUygodm9pZCAqc2lnbikpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpX21hYy5wcm8gYi9zcmMvcHJvdG8vZ3VpX21hYy5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1OTVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfbWFjLnBybwpAQCAtMCwwICsxLDE0MiBAQAorLyogZ3VpX21hYy5jICovCisKKy8qCisgKiBNYWMgc3BlY2lmaWMgcHJvdG90eXBlcworICovCisKK3Bhc2NhbCBCb29sZWFuIFdhaXROZXh0RXZlbnRXcnAgX19BUkdTKChFdmVudE1hc2sgZXZlbnRNYXNrLCBFdmVudFJlY29yZCAqdGhlRXZlbnQsIFVJbnQzMiBzbGVlcCwgUmduSGFuZGxlIG1vdXNlUmduKSk7CitwYXNjYWwgdm9pZCBndWlfbWFjX3Njcm9sbF9hY3Rpb24gX19BUkdTKChDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wsIHNob3J0IHBhcnRDb2RlKSk7CitwYXNjYWwgdm9pZCBndWlfbWFjX2RyYWdfdGh1bWIgKENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCwgc2hvcnQgcGFydENvZGUpOwordm9pZCBndWlfbWFjX2hhbmRsZV9ldmVudCBfX0FSR1MoKEV2ZW50UmVjb3JkICpldmVudCkpOwordm9pZCBndWlfbWFjX2RvTW91c2VEb3duIF9fQVJHUygoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KSk7Cit2b2lkIGd1aV9tYWNfZG9fa2V5IF9fQVJHUygoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KSk7Cit2b2lkIGd1aV9tYWNfaGFuZGxlX21lbnUgX19BUkdTKChsb25nIG1lbnVDaG9pY2UpKTsKK3ZvaWQgZ3VpX21hY19mb2N1c19jaGFuZ2UgX19BUkdTKChFdmVudFJlY29yZCAqZXZlbnQpKTsKK3ZvaWQgZ3VpX21hY191cGRhdGUgX19BUkdTKChFdmVudFJlY29yZCAqZXZlbnQpKTsKK3Nob3J0IGd1aV9tY2hfZ2V0X21hY19tZW51X2l0ZW1faW5kZXggX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIHZpbW1lbnVfVCAqcGFyZW50KSk7Cit2b2lkIGd1aV9tY2hfc2V0X2JsaW5raW5nIF9fQVJHUygobG9uZyB3YWl0LCBsb25nIG9uLCBsb25nIG9mZikpOwordm9pZCBndWlfbWNoX3N0b3BfYmxpbmsgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc3RhcnRfYmxpbmsgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV95IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfcHJlcGFyZSBfX0FSR1MoKGludCAqYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCBndWlfbWNoX2luaXRfY2hlY2sgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX25ld19jb2xvcnMgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9vcGVuIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2V4aXQgX19BUkdTKChpbnQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2luc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK2ludCBndWlfbWNoX2dldF93aW5wb3MgX19BUkdTKChpbnQgKngsIGludCAqeSkpOwordm9pZCBndWlfbWNoX3NldF93aW5wb3MgX19BUkdTKChpbnQgeCwgaW50IHkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2hlbGxzaXplIF9fQVJHUygoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbWluX3dpZHRoLCBpbnQgbWluX2hlaWdodCwgaW50IGJhc2Vfd2lkdGgsIGludCBiYXNlX2hlaWdodCkpOwordm9pZCBndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucyBfX0FSR1MoKGludCAqc2NyZWVuX3csIGludCAqc2NyZWVuX2gpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfdGV4dF9hcmVhX3BvcyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfZW5hYmxlX3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IGZsYWcpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBsb25nIHZhbCwgbG9uZyBzaXplLCBsb25nIG1heCkpOwordm9pZCBndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYikpOworaW50IGd1aV9tY2hfYWRqdXN0X2NoYXJzaXplIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfaW5pdF9mb250IF9fQVJHUygoY2hhcl91ICpmb250X25hbWUsIGludCBmb250c2V0KSk7CitHdWlGb250IGd1aV9tY2hfZ2V0X2ZvbnQgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBnaXZlRXJyb3JJZk1pc3NpbmcpKTsKK0d1aUZvbnQgZ3VpX21hY19maW5kX2ZvbnQgX19BUkdTKChjaGFyX3UgKmZvbnRfbmFtZSkpOwordm9pZCBndWlfbWNoX3NldF9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7CitpbnQgZ3VpX21jaF9zYW1lX2ZvbnQgX19BUkdTKChHdWlGb250IGYxLCBHdWlGb250IGYyKSk7Cit2b2lkIGd1aV9tY2hfZnJlZV9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7CitndWljb2xvcl9UIGd1aV9tY2hfZ2V0X2NvbG9yIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZnX2NvbG9yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3NldF9iZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X3N0cmluZyBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKSk7CitpbnQgZ3VpX21jaF9oYXNrZXkgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgZ3VpX21jaF9iZWVwIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2ZsYXNoIF9fQVJHUygoaW50IG1zZWMpKTsKK3ZvaWQgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlIF9fQVJHUygoaW50IHIsIGludCBjLCBpbnQgbnIsIGludCBuYykpOwordm9pZCBndWlfbWNoX2ljb25pZnkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0dGl0bGUgX19BUkdTKChjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKmljb24pKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19wYXJ0X2N1cnNvciBfX0FSR1MoKGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3VwZGF0ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX3dhaXRfZm9yX2NoYXJzIF9fQVJHUygoaW50IHd0aW1lKSk7Cit2b2lkIGd1aV9tY2hfZmx1c2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYmxvY2sgX19BUkdTKChpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikpOwordm9pZCBndWlfbWNoX2NsZWFyX2FsbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kZWxldGVfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGd1aV9tY2hfaW5zZXJ0X2xpbmVzIF9fQVJHUygoaW50IHJvdywgaW50IG51bV9saW5lcykpOwordm9pZCBndWlfbWNoX2VuYWJsZV9tZW51IF9fQVJHUygoaW50IGZsYWcpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfbWVudV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOworLyp2b2lkIGd1aV9tY2hfYWRkX21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIHZpbW1lbnVfVCAqcGFyZW50LCBpbnQgaWR4KSk7Ki8KK3ZvaWQgZ3VpX21jaF9hZGRfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IHBvcykpOworLyp2b2lkIGd1aV9tY2hfYWRkX21lbnVfaXRlbSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgdmltbWVudV9UICpwYXJlbnQsIGludCBpZHgpKTsqLwordm9pZCBndWlfbWNoX2FkZF9tZW51X2l0ZW0gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBpZHgpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX21lbnVfZ3JleSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGdyZXkpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2hpZGRlbiBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikpOwordm9pZCBndWlfbWNoX2RyYXdfbWVudWJhciBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9saWdodG5lc3MgX19BUkdTKChndWljb2xvcl9UIHBpeGVsKSk7Citsb25nX3UgZ3VpX21jaF9nZXRfcmdiIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOworaW50IGd1aV9tY2hfZ2V0X21vdXNlX3ggX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRtb3VzZSBfX0FSR1MoKGludCB4LCBpbnQgeSkpOwordm9pZCBndWlfbWNoX3Nob3dfcG9wdXBtZW51IF9fQVJHUygodmltbWVudV9UICptZW51KSk7CitpbnQgZ3VpX21jaF9kaWFsb2cgX19BUkdTKChpbnQgdHlwZSwgY2hhcl91ICp0aXRsZSwgY2hhcl91ICptZXNzYWdlLCBjaGFyX3UgKmJ1dHRvbnMsIGludCBkZmx0YnV0dG9uLCBjaGFyX3UgKnRleHRmaWVsZCkpOworY2hhcl91ICpndWlfbWNoX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGZsdCwgY2hhcl91ICpleHQsIGNoYXJfdSAqaW5pdGRpciwgY2hhcl91ICpmaWx0ZXIpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCBfX0FSR1MoKHZvaWQpKTsKKworY2hhcl91ICpDMlBhc2NhbF9zYXZlIF9fQVJHUygoY2hhcl91ICpDc3RyaW5nKSk7CitjaGFyX3UgKkMyUGFzY2FsX3NhdmVfYW5kX3JlbW92ZV9iYWNrc2xhc2ggX19BUkdTKChjaGFyX3UgKkNzdHJpbmcpKTsKK2ludF91IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzIF9fQVJHUygoRXZlbnRNb2RpZmllcnMgbWFjTW9kaWZpZXJzKSk7CitjaGFyX3UgKipuZXdfZm5hbWVzX2Zyb21fQUVEZXNjIF9fQVJHUygoQUVEZXNjICp0aGVMaXN0LCBsb25nICpudW1GaWxlcywgT1NFcnIgKmVycm9yKSk7CisKKwordm9pZCBndWlfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfbG9zZV9zZWxlY3Rpb24gX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2NsZWFyX3NlbGVjdGlvbiBfX0FSR1MoKHZvaWQpKTsKKwordm9pZCBndWlfd2luX25ld19oZWlnaHQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgZ3VpX3dpbl9jb21wX3BvcyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX3dpbl9mcmVlIF9fQVJHUygod2luX1QgKndwKSk7Cit2b2lkIGd1aV93aW5fYWxsb2MgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgbWNoX3Bvc3RfYnVmZmVyX3dyaXRlIChidWZfVCAqYnVmKTsKKwordm9pZCBtY2hfZXJybXNnIF9fQVJHUygoY2hhciAqc3RyKSk7Cit2b2lkIG1jaF9kaXNwbGF5X2Vycm9yIF9fQVJHUygodm9pZCkpOwordm9pZCBjbGlwX21jaF9sb3NlX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfbWNoX3JlcXVlc3Rfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfc2V0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7CitpbnQgY2xpcF9tY2hfb3duX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7CisKK3Bhc2NhbAlPU0VycglGaW5kUHJvY2Vzc0J5U2lnbmF0dXJlKCBjb25zdCBPU1R5cGUgdGFyZ2V0VHlwZSwKKwkJCQkJY29uc3QgT1NUeXBlIHRhcmdldENyZWF0b3IsIFByb2Nlc3NTZXJpYWxOdW1iZXJQdHIgcHNuUHRyICk7CitPU0VyciAgIEluc3RhbGxBRUhhbmRsZXJzICh2b2lkKTsKK3Bhc2NhbCBPU0VyciBIYW5kbGVPRG9jQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKTsKK3Bhc2NhbCBPU0VyciBIYW5kbGVfYWV2dF9vYXBwX0FFIChjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbik7CitwYXNjYWwgT1NFcnIgSGFuZGxlX2FldnRfcXVpdF9BRSAoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pOworcGFzY2FsIE9TRXJyIEhhbmRsZV9hZXZ0X3Bkb2NfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKTsKK3Bhc2NhbCBPU0VyciBIYW5kbGVfdW5rbm93bl9BRSAoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pOworLyogU2hvdWxkZSB3ZSByZXR1cm4gTWVudUl0ZW1JbmRleD8gSU1PIHllcywgSSBkaWQgdGhhdCBmb3IgNS43IGFrKi8KK3Nob3J0IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleCAodmltbWVudV9UICpwTWVudSk7CisKK3Bhc2NhbCBPU0VyciBIYW5kbGVfS0FITF9TUkNIX0FFIChjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbik7CitwYXNjYWwgT1NFcnIgSGFuZGxlX0tBSExfTU9EX0FFICAoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pOworcGFzY2FsIE9TRXJyIEhhbmRsZV9LQUhMX0dUVFhfQUUgKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKTsKK3ZvaWQgU2VuZF9LQUhMX01PRF9BRSAoYnVmX1QgKmJ1Zik7CisKK3ZvaWQgZ3VpX21hY19kb0luQ29udGVudENsaWNrIF9fQVJHUygoRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBXaW5kb3dQdHIJIHdoaWNoV2luZG93KSk7Cit2b2lkIGd1aV9tYWNfZG9JbkRyYWdDbGljayBfX0FSR1MoKFBvaW50IHdoZXJlLCBXaW5kb3dQdHIgd2hpY2hXaW5kb3cpKTsKK3ZvaWQgZ3VpX21hY19kb0luR3Jvd0NsaWNrIF9fQVJHUygoUG9pbnQgd2hlcmUsIFdpbmRvd1B0ciB3aGljaFdpbmRvdykpOwordm9pZCBndWlfbWFjX2RvVXBkYXRlRXZlbnQgX19BUkdTKChFdmVudFJlY29yZCAqZXZlbnQpKTsKK3ZvaWQgZ3VpX21hY19kb0FjdGl2YXRlRXZlbnQgX19BUkdTKChFdmVudFJlY29yZCAqZXZlbnQpKTsKK3ZvaWQgZ3VpX21hY19kb1N1c3BlbmRFdmVudCBfX0FSR1MoKEV2ZW50UmVjb3JkICpldmVudCkpOwordm9pZCBndWlfbWFjX2RvS2V5RXZlbnQgX19BUkdTKChFdmVudFJlY29yZCAqdGhlRXZlbnQpKTsKK3ZvaWQgZ3VpX21hY19kb01vdXNlRG93bkV2ZW50IF9fQVJHUygoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KSk7Cit2b2lkIGd1aV9tYWNfZG9Nb3VzZU1vdmVkRXZlbnQgX19BUkdTKChFdmVudFJlY29yZCAqZXZlbnQpKTsKK3ZvaWQgZ3VpX21hY19kb01vdXNlVXBFdmVudCBfX0FSR1MoKEV2ZW50UmVjb3JkICp0aGVFdmVudCkpOworCitpbnQgQzJQYXNjYWxTdHJpbmcgKGNoYXJfdSAqQ1N0cmluZywgU3RyMjU1ICpQYXNjYWxTdHJpbmcpOworaW50IEdldEZTU3BlY0Zyb21QYXRoICggY2hhcl91ICpmaWxlLCBGU1NwZWMgKmZpbGVGU1NwZWMpOworY2hhcl91ICpGdWxsUGF0aEZyb21GU1NwZWNfc2F2ZSAoRlNTcGVjIGZpbGUpOworCisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfbW90aWYucHJvIGIvc3JjL3Byb3RvL2d1aV9tb3RpZi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1ZDhhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfbW90aWYucHJvCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGd1aV9tb3RpZi5jICovCit2b2lkIGd1aV94MTFfY3JlYXRlX3dpZGdldHMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV94MTFfZGVzdHJveV93aWRnZXRzIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF90ZXh0X2FyZWFfcG9zIF9fQVJHUygoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX3gxMV9zZXRfYmFja19jb2xvciBfX0FSR1MoKHZvaWQpKTsKK1htRm9udExpc3QgZ3VpX21vdGlmX2NyZWF0ZV9mb250bGlzdCBfX0FSR1MoKFhGb250U3RydWN0ICpmb250KSk7CitYbUZvbnRMaXN0IGd1aV9tb3RpZl9mb250c2V0MmZvbnRsaXN0IF9fQVJHUygoWEZvbnRTZXQgKmZvbnRzZXQpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfbWVudSBfX0FSR1MoKGludCBmbGFnKSk7Cit2b2lkIGd1aV9tb3RpZl9zZXRfbW5lbW9uaWNzIF9fQVJHUygoaW50IGVuYWJsZSkpOwordm9pZCBndWlfbWNoX2FkZF9tZW51IF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgaWR4KSk7Cit2b2lkIGd1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzIF9fQVJHUygoaW50IGVuYWJsZSkpOworaW50IGd1aV9tY2hfdGV4dF9hcmVhX2V4dHJhX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9jb21wdXRlX21lbnVfaGVpZ2h0IF9fQVJHUygoV2lkZ2V0IGlkKSk7Cit2b2lkIGd1aV9tY2hfYWRkX21lbnVfaXRlbSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkpOwordm9pZCBndWlfbW90aWZfdXBkYXRlX21vdXNlbW9kZWwgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfbWVudV9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfbmV3X21lbnVfZm9udCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfdG9vbHRpcF9mb250IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX25ld190b29sdGlwX2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX2RlZl9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYiBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3BvcyBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykpOwordm9pZCBndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYikpOwordm9pZCBndWlfbWNoX3NldF9zY3JvbGxiYXJfY29sb3JzIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiKSk7CitXaW5kb3cgZ3VpX3gxMV9nZXRfd2lkIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpndWlfbWNoX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGZsdCwgY2hhcl91ICpleHQsIGNoYXJfdSAqaW5pdGRpciwgY2hhcl91ICpmaWx0ZXIpKTsKK2ludCBndWlfbWNoX2RpYWxvZyBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGNoYXJfdSAqYnV0dG9uX25hbWVzLCBpbnQgZGZsdGJ1dHRvbiwgY2hhcl91ICp0ZXh0ZmllbGQpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfZm9vdGVyIF9fQVJHUygoaW50IHNob3dpdCkpOwordm9pZCBndWlfbWNoX3NldF9mb290ZXIgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3Rvb2xiYXIgX19BUkdTKChpbnQgc2hvd2l0KSk7CitpbnQgZ3VpX21jaF9jb21wdXRlX3Rvb2xiYXJfaGVpZ2h0IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2dldF90b29sYmFyX2NvbG9ycyBfX0FSR1MoKFBpeGVsICpiZ3AsIFBpeGVsICpmZ3AsIFBpeGVsICpic3AsIFBpeGVsICp0c3AsIFBpeGVsICpoc3ApKTsKK3ZvaWQgZ3VpX21jaF9maW5kX2RpYWxvZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBndWlfbWNoX3JlcGxhY2VfZGlhbG9nIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfcGhvdG9uLnBybyBiL3NyYy9wcm90by9ndWlfcGhvdG9uLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM1NGExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2d1aV9waG90b24ucHJvCkBAIC0wLDAgKzEsNjYgQEAKKy8qIGd1aV9waG90b24uYyAqLwordm9pZCBndWlfcGhfZW5jb2RpbmdfY2hhbmdlZCBfX0FSR1MoKGludCBuZXdfZW5jb2RpbmcpKTsKK3ZvaWQgZ3VpX21jaF9wcmVwYXJlIF9fQVJHUygoaW50ICphcmdjLCBjaGFyICoqYXJndikpOworaW50IGd1aV9tY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2luaXRfY2hlY2sgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9vcGVuIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2V4aXQgX19BUkdTKChpbnQgcmMpKTsKK3ZvaWQgZ3VpX21jaF91cGRhdGUgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyBfX0FSR1MoKGludCB3dGltZSkpOworY2hhcl91ICpndWlfbWNoX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGVmYXVsdF9uYW1lLCBjaGFyX3UgKmV4dCwgY2hhcl91ICppbml0ZGlyLCBjaGFyX3UgKmZpbHRlcikpOworaW50IGd1aV9tY2hfZGlhbG9nIF9fQVJHUygoaW50IHR5cGUsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqbWVzc2FnZSwgY2hhcl91ICpidXR0b25zLCBpbnQgZGVmYXVsdF9idXR0b24sIGNoYXJfdSAqdGV4dGZpZWxkKSk7CitpbnQgZ3VpX21jaF9nZXRfd2lucG9zIF9fQVJHUygoaW50ICp4LCBpbnQgKnkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2lucG9zIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMgX19BUkdTKChpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKSk7Cit2b2lkIGd1aV9tY2hfaWNvbmlmeSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqaWNvbikpOwordm9pZCBndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCB2YWwsIGludCBzaXplLCBpbnQgbWF4KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3MgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfY3JlYXRlX3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IG9yaWVudCkpOwordm9pZCBndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBmbGFnKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IpKTsKK3ZvaWQgbWNoX3NldF9tb3VzZV9zaGFwZSBfX0FSR1MoKGludCBzaGFwZSkpOwordm9pZCBndWlfbWNoX21vdXNlaGlkZSBfX0FSR1MoKGludCBoaWRlKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV95IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IHgsIGludCB5KSk7Citsb25nX3UgZ3VpX21jaF9nZXRfcmdiIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOwordm9pZCBndWlfbWNoX25ld19jb2xvcnMgX19BUkdTKCh2b2lkKSk7CitndWljb2xvcl9UIGd1aV9tY2hfZ2V0X2NvbG9yIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZnX2NvbG9yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3NldF9iZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlIF9fQVJHUygoaW50IHJvdywgaW50IGNvbCwgaW50IG5yLCBpbnQgbmMpKTsKK3ZvaWQgZ3VpX21jaF9jbGVhcl9ibG9jayBfX0FSR1MoKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYWxsIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2RlbGV0ZV9saW5lcyBfX0FSR1MoKGludCByb3csIGludCBudW1fbGluZXMpKTsKK3ZvaWQgZ3VpX21jaF9pbnNlcnRfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19zdHJpbmcgX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncykpOwordm9pZCBndWlfbWNoX2RyYXdfaG9sbG93X2N1cnNvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yIF9fQVJHUygoaW50IHcsIGludCBoLCBndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2JsaW5raW5nIF9fQVJHUygobG9uZyB3YWl0LCBsb25nIG9uLCBsb25nIG9mZikpOwordm9pZCBndWlfbWNoX3N0YXJ0X2JsaW5rIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3N0b3BfYmxpbmsgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfYmVlcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9mbGFzaCBfX0FSR1MoKGludCBtc2VjKSk7Cit2b2lkIGd1aV9tY2hfZmx1c2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOworaW50IGd1aV9tY2hfaGFza2V5IF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9tY2hfZW5hYmxlX21lbnUgX19BUkdTKChpbnQgZmxhZykpOwordm9pZCBndWlfbWNoX3NldF9tZW51X3BvcyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfYWRkX21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBpbmRleCkpOwordm9pZCBndWlfbWNoX2FkZF9tZW51X2l0ZW0gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBpbmRleCkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX21lbnVfZ3JleSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGdyZXkpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2hpZGRlbiBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikpOwordm9pZCBndWlfbWNoX2RyYXdfbWVudWJhciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX3RvZ2dsZV90ZWFyb2ZmcyBfX0FSR1MoKGludCBlbmFibGUpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3Rvb2xiYXIgX19BUkdTKChpbnQgc2hvd2l0KSk7CitpbnQgZ3VpX21jaF9pbml0X2ZvbnQgX19BUkdTKChjaGFyX3UgKnZpbV9mb250X25hbWUsIGludCBmb250c2V0KSk7CitpbnQgZ3VpX21jaF9hZGp1c3RfY2hhcnNpemUgX19BUkdTKCh2b2lkKSk7CitHdWlGb250IGd1aV9tY2hfZ2V0X2ZvbnQgX19BUkdTKChjaGFyX3UgKnZpbV9mb250X25hbWUsIGludCByZXBvcnRfZXJyb3IpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOwordm9pZCBndWlfbWNoX2ZyZWVfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpX3Jpc2Nvcy5wcm8gYi9zcmMvcHJvdG8vZ3VpX3Jpc2Nvcy5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyM2ZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfcmlzY29zLnBybwpAQCAtMCwwICsxLDY3IEBACisvKiBQcm90b3R5cGVzIGZvciBndWlfcmlzY29zLmMKKyAqIEJhc2VkIG9uIGd1aV94MTFfcHJvLmggKDEwIE1hcmNoIDIwMDIgdmVyc2lvbikKKyAqLwordm9pZCBndWlfbWNoX3ByZXBhcmUgX19BUkdTKChpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgZ3VpX21jaF9pbml0X2NoZWNrIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF91bmluaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfbmV3X2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX29wZW4gX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9pbml0X3Rvb2x0aXBfZm9udCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX2luaXRfbWVudV9mb250IF9fQVJHUygodm9pZCkpO3ZvaWQgZ3VpX21jaF9leGl0IF9fQVJHUygoaW50IHJjKSk7CitpbnQgZ3VpX21jaF9nZXRfd2lucG9zIF9fQVJHUygoaW50ICp4LCBpbnQgKnkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2lucG9zIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMgX19BUkdTKChpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKSk7CitpbnQgZ3VpX21jaF9pbml0X2ZvbnQgX19BUkdTKChjaGFyX3UgKmZvbnRfbmFtZSwgaW50IGRvX2ZvbnRzZXQpKTsKK0d1aUZvbnQgZ3VpX21jaF9nZXRfZm9udCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGdpdmVFcnJvcklmTWlzc2luZykpOworaW50IGd1aV9tY2hfYWRqdXN0X2NoYXJzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvbnRzZXQgX19BUkdTKChHdWlGb250c2V0IGZvbnRzZXQpKTsKK3ZvaWQgZ3VpX21jaF9mcmVlX2ZvbnQgX19BUkdTKChHdWlGb250IGZvbnQpKTsKK3ZvaWQgZ3VpX21jaF9mcmVlX2ZvbnRzZXQgX19BUkdTKChHdWlGb250c2V0IGZvbnRzZXQpKTsKK0d1aUZvbnRzZXQgZ3VpX21jaF9nZXRfZm9udHNldCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGdpdmVFcnJvcklmTWlzc2luZywgaW50IGZpeGVkX3dpZHRoKSk7CitndWljb2xvcl9UIGd1aV9tY2hfZ2V0X2NvbG9yIF9fQVJHUygoY2hhcl91ICpyZXFuYW1lKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZnX2NvbG9yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3NldF9iZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X3N0cmluZyBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqcywgaW50IGxlbiwgaW50IGZsYWdzKSk7CitpbnQgZ3VpX21jaF9oYXNrZXkgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgZ3VpX21jaF9iZWVwIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2ZsYXNoIF9fQVJHUygoaW50IG1zZWMpKTsKK3ZvaWQgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlIF9fQVJHUygoaW50IHIsIGludCBjLCBpbnQgbnIsIGludCBuYykpOwordm9pZCBndWlfbWNoX2ljb25pZnkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvcmVncm91bmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IgX19BUkdTKChpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF91cGRhdGUgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyBfX0FSR1MoKGxvbmcgd3RpbWUpKTsKK3ZvaWQgZ3VpX21jaF9mbHVzaCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9jbGVhcl9ibG9jayBfX0FSR1MoKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYWxsIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2RlbGV0ZV9saW5lcyBfX0FSR1MoKGludCByb3csIGludCBudW1fbGluZXMpKTsKK3ZvaWQgZ3VpX21jaF9pbnNlcnRfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGNsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9zZXRfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2dyZXkgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KSk7Cit2b2lkIGd1aV9tY2hfbWVudV9oaWRkZW4gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBoaWRkZW4pKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X21lbnViYXIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2JsaW5raW5nIF9fQVJHUygobG9uZyB3YWl0dGltZSwgbG9uZyBvbiwgbG9uZyBvZmYpKTsKK3ZvaWQgZ3VpX21jaF9zdG9wX2JsaW5rIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3N0YXJ0X2JsaW5rIF9fQVJHUygodm9pZCkpOwordm9pZCBwcm9jZXNzX2V2ZW50IF9fQVJHUygoaW50IGV2ZW50LCBpbnQgKmJsb2NrKSk7Cit2b2lkIGd1aV9tY2hfc2hvd19wb3B1cG1lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK2xvbmdfdSBndWlfbWNoX2dldF9yZ2IgX19BUkdTKChndWljb2xvcl9UIHBpeGVsKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV95IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfZHJhd3NpZ24gX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBpbnQgdHlwZW5yKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zaWduIF9fQVJHUygoWEltYWdlICpzaWduKSk7Cit2b2lkIGd1aV9tY2hfbW91c2VoaWRlIF9fQVJHUygoaW50IGhpZGUpKTsKK3ZvaWQgbWNoX3NldF9tb3VzZV9zaGFwZSBfX0FSR1MoKGludCBzaGFwZSkpOwordm9pZCBndWlfbWNoX21lbnVfc2V0X3RpcCBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOworCit2b2lkIHJvX3JlZHJhd190aXRsZSBfX0FSR1MoKGludCB3aW5kb3cpKTsKK2ludCByb19va190b19xdWl0IF9fQVJHUygodm9pZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZ3VpX3cxNi5wcm8gYi9zcmMvcHJvdG8vZ3VpX3cxNi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYzYwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9ndWlfdzE2LnBybwpAQCAtMCwwICsxLDczIEBACisvKiBndWlfdzE2LmMgKi8KK3ZvaWQgZ3VpX21jaF9zZXRfYmxpbmtpbmcgX19BUkdTKChsb25nIHdhaXQsIGxvbmcgb24sIGxvbmcgb2ZmKSk7Cit2b2lkIGd1aV9tY2hfc3RvcF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zdGFydF9ibGluayBfX0FSR1MoKHZvaWQpKTsKK0xSRVNVTFQgV0lOQVBJIHZpbV9XaW5kb3dQcm9jIF9fQVJHUygoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pKTsKK3ZvaWQgZ3VpX21jaF9uZXdfY29sb3JzIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2RlZl9jb2xvcnMgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9vcGVuIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfZ2V0X3dpbnBvcyBfX0FSR1MoKGludCAqeCwgaW50ICp5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3dpbnBvcyBfX0FSR1MoKGludCB4LCBpbnQgeSkpOwordm9pZCBndWlfbWNoX3NldF90ZXh0X2FyZWFfcG9zIF9fQVJHUygoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgZmxhZykpOwordm9pZCBndWlfbWNoX3NldF9zY3JvbGxiYXJfcG9zIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBvcmllbnQpKTsKK2ludCBndWlfbWNoX2FkanVzdF9jaGFyc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK0d1aUZvbnQgZ3VpX21jaF9nZXRfZm9udCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGdpdmVFcnJvcklmTWlzc2luZykpOwordm9pZCBndWlfbWNoX2ZyZWVfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOworZ3VpY29sb3JfVCBndWlfbWNoX2dldF9jb2xvciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IGd1aV9tY2hfaGFza2V5IF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9tY2hfYmVlcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlIF9fQVJHUygoaW50IHIsIGludCBjLCBpbnQgbnIsIGludCBuYykpOwordm9pZCBndWlfbWNoX2ljb25pZnkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IgX19BUkdTKChpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF91cGRhdGUgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyBfX0FSR1MoKGludCB3dGltZSkpOwordm9pZCBndWlfbWNoX2NsZWFyX2Jsb2NrIF9fQVJHUygoaW50IHJvdzEsIGludCBjb2wxLCBpbnQgcm93MiwgaW50IGNvbDIpKTsKK3ZvaWQgZ3VpX21jaF9jbGVhcl9hbGwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZW5hYmxlX21lbnUgX19BUkdTKChpbnQgZmxhZykpOwordm9pZCBndWlfbWNoX3NldF9tZW51X3BvcyBfX0FSR1MoKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfbWVudV9oaWRkZW4gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBoaWRkZW4pKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X21lbnViYXIgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgZ3VpX21jaF9nZXRfcmdiIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOwordm9pZCBndWlfbWNoX2FjdGl2YXRlX3dpbmRvdyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3Rvb2xiYXIgX19BUkdTKChpbnQgc2hvd2l0KSk7Cit2b2lkIGV4X3NpbWFsdCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBndWlfbWNoX2ZpbmRfZGlhbG9nIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGd1aV9tY2hfcmVwbGFjZV9kaWFsb2cgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZ3VpX21jaF9tb3VzZWhpZGUgX19BUkdTKChpbnQgaGlkZSkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiKSk7CitpbnQgZ3VpX21jaF9nZXRfbW91c2VfeCBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV95IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zIF9fQVJHUygoaW50ICpzY3JlZW5fdywgaW50ICpzY3JlZW5faCkpOwordm9pZCBndWlfbWNoX2ZsYXNoIF9fQVJHUygoaW50IG1zZWMpKTsKK3ZvaWQgZ3VpX21jaF9kZWxldGVfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGd1aV9tY2hfaW5zZXJ0X2xpbmVzIF9fQVJHUygoaW50IHJvdywgaW50IG51bV9saW5lcykpOwordm9pZCBndWlfbWNoX2V4aXQgX19BUkdTKChpbnQgcmMpKTsKK2ludCBndWlfbWNoX2luaXRfZm9udCBfX0FSR1MoKGNoYXJfdSAqZm9udF9uYW1lLCBpbnQgZm9udHNldCkpOworaW50IGd1aV9tY2hfbWF4aW1pemVkIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX25ld2ZvbnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0dGl0bGUgX19BUkdTKChjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKmljb24pKTsKK3ZvaWQgbWNoX3NldF9tb3VzZV9zaGFwZSBfX0FSR1MoKGludCBzaGFwZSkpOworY2hhcl91ICpndWlfbWNoX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGZsdCwgY2hhcl91ICpleHQsIGNoYXJfdSAqaW5pdGRpciwgY2hhcl91ICpmaWx0ZXIpKTsKK2ludCBnZXRfY21kX2FyZ3MgX19BUkdTKChjaGFyICpwcm9nLCBjaGFyICpjbWRsaW5lLCBjaGFyICoqKmFyZ3ZwLCBjaGFyICoqdG9mcmVlKSk7Cit2b2lkIGd1aV9tY2hfcHJlcGFyZSBfX0FSR1MoKGludCAqYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCBndWlfbWNoX2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1pbl93aWR0aCwgaW50IG1pbl9oZWlnaHQsIGludCBiYXNlX3dpZHRoLCBpbnQgYmFzZV9oZWlnaHQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iIF9fQVJHUygoc2Nyb2xsYmFyX1QgKnNiLCBsb25nIHZhbCwgbG9uZyBzaXplLCBsb25nIG1heCkpOwordm9pZCBndWlfbWNoX3NldF9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZnX2NvbG9yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3NldF9iZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X3N0cmluZyBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqdGV4dCwgaW50IGxlbiwgaW50IGZsYWdzKSk7Cit2b2lkIGd1aV9tY2hfZmx1c2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfYWRkX21lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBwb3MpKTsKK3ZvaWQgZ3VpX21jaF9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWFrZV9wb3B1cCBfX0FSR1MoKGNoYXJfdSAqcGF0aF9uYW1lKSk7Cit2b2lkIGd1aV9tY2hfYWRkX21lbnVfaXRlbSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGlkeCkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfbWVudSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfbWNoX21lbnVfZ3JleSBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGdyZXkpKTsKK2ludCBndWlfbWNoX2RpYWxvZyBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGNoYXJfdSAqYnV0dG9ucywgaW50IGRmbHRidXR0b24sIGNoYXJfdSAqdGV4dGZpZWxkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvcmVncm91bmQgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfdzMyLnBybyBiL3NyYy9wcm90by9ndWlfdzMyLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFkNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2d1aV93MzIucHJvCkBAIC0wLDAgKzEsODkgQEAKKy8qIGd1aV93MzIuYyAqLwordm9pZCBndWlfbWNoX3NldF9ibGlua2luZyBfX0FSR1MoKGxvbmcgd2FpdCwgbG9uZyBvbiwgbG9uZyBvZmYpKTsKK3ZvaWQgZ3VpX21jaF9zdG9wX2JsaW5rIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3N0YXJ0X2JsaW5rIF9fQVJHUygodm9pZCkpOworTFJFU1VMVCBXSU5BUEkgdmltX1dpbmRvd1Byb2MgX19BUkdTKChIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkpOwordm9pZCBndWlfbWNoX25ld19jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZGVmX2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX29wZW4gX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9nZXRfd2lucG9zIF9fQVJHUygoaW50ICp4LCBpbnQgKnkpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfd2lucG9zIF9fQVJHUygoaW50IHgsIGludCB5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MgX19BUkdTKChpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkpOwordm9pZCBndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCBmbGFnKSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3MgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSk7Cit2b2lkIGd1aV9tY2hfY3JlYXRlX3Njcm9sbGJhciBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgaW50IG9yaWVudCkpOworaW50IGd1aV9tY2hfYWRqdXN0X2NoYXJzaXplIF9fQVJHUygodm9pZCkpOworR3VpRm9udCBndWlfbWNoX2dldF9mb250IF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgZ2l2ZUVycm9ySWZNaXNzaW5nKSk7Cit2b2lkIGd1aV9tY2hfZnJlZV9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7CitndWljb2xvcl9UIGd1aV9tY2hfZ2V0X2NvbG9yIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgZ3VpX21jaF9oYXNrZXkgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgZ3VpX21jaF9iZWVwIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2ludmVydF9yZWN0YW5nbGUgX19BUkdTKChpbnQgciwgaW50IGMsIGludCBuciwgaW50IG5jKSk7Cit2b2lkIGd1aV9tY2hfaWNvbmlmeSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19wYXJ0X2N1cnNvciBfX0FSR1MoKGludCB3LCBpbnQgaCwgZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX3VwZGF0ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBndWlfbWNoX3dhaXRfZm9yX2NoYXJzIF9fQVJHUygoaW50IHd0aW1lKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYmxvY2sgX19BUkdTKChpbnQgcm93MSwgaW50IGNvbDEsIGludCByb3cyLCBpbnQgY29sMikpOwordm9pZCBndWlfbWNoX2NsZWFyX2FsbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9lbmFibGVfbWVudSBfX0FSR1MoKGludCBmbGFnKSk7Cit2b2lkIGd1aV9tY2hfc2V0X21lbnVfcG9zIF9fQVJHUygoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2hpZGRlbiBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikpOwordm9pZCBndWlfbWNoX2RyYXdfbWVudWJhciBfX0FSR1MoKHZvaWQpKTsKK2xvbmdfdSBndWlfbWNoX2dldF9yZ2IgX19BUkdTKChndWljb2xvcl9UIHBpeGVsKSk7Cit2b2lkIGd1aV9tY2hfYWN0aXZhdGVfd2luZG93IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3Nob3dfdG9vbGJhciBfX0FSR1MoKGludCBzaG93aXQpKTsKK3ZvaWQgZXhfc2ltYWx0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGd1aV9tY2hfZmluZF9kaWFsb2cgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZ3VpX21jaF9yZXBsYWNlX2RpYWxvZyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBndWlfbWNoX21vdXNlaGlkZSBfX0FSR1MoKGludCBoaWRlKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIgX19BUkdTKChzY3JvbGxiYXJfVCAqc2IpKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV94IF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfZ2V0X21vdXNlX3kgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0bW91c2UgX19BUkdTKChpbnQgeCwgaW50IHkpKTsKK3ZvaWQgZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMgX19BUkdTKChpbnQgKnNjcmVlbl93LCBpbnQgKnNjcmVlbl9oKSk7Cit2b2lkIGd1aV9tY2hfZmxhc2ggX19BUkdTKChpbnQgbXNlYykpOwordm9pZCBndWlfbWNoX2RlbGV0ZV9saW5lcyBfX0FSR1MoKGludCByb3csIGludCBudW1fbGluZXMpKTsKK3ZvaWQgZ3VpX21jaF9pbnNlcnRfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGd1aV9tY2hfZXhpdCBfX0FSR1MoKGludCByYykpOworaW50IGd1aV9tY2hfaW5pdF9mb250IF9fQVJHUygoY2hhcl91ICpmb250X25hbWUsIGludCBmb250c2V0KSk7CitpbnQgZ3VpX21jaF9tYXhpbWl6ZWQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfbmV3Zm9udCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqaWNvbikpOwordm9pZCBtY2hfc2V0X21vdXNlX3NoYXBlIF9fQVJHUygoaW50IHNoYXBlKSk7CitjaGFyX3UgKmd1aV9tY2hfYnJvd3NlIF9fQVJHUygoaW50IHNhdmluZywgY2hhcl91ICp0aXRsZSwgY2hhcl91ICpkZmx0LCBjaGFyX3UgKmV4dCwgY2hhcl91ICppbml0ZGlyLCBjaGFyX3UgKmZpbHRlcikpOworaW50IGdldF9jbWRfYXJncyBfX0FSR1MoKGNoYXIgKnByb2csIGNoYXIgKmNtZGxpbmUsIGNoYXIgKioqYXJndnAsIGNoYXIgKip0b2ZyZWUpKTsKK2ludCBndWlfaXNfd2luMzJzIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF9wYXJlbnQgX19BUkdTKChjaGFyICp0aXRsZSkpOwordm9pZCBndWlfbWNoX3ByZXBhcmUgX19BUkdTKChpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgZ3VpX21jaF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF9zaGVsbHNpemUgX19BUkdTKChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtaW5fd2lkdGgsIGludCBtaW5faGVpZ2h0LCBpbnQgYmFzZV93aWR0aCwgaW50IGJhc2VfaGVpZ2h0KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYiBfX0FSR1MoKHNjcm9sbGJhcl9UICpzYiwgbG9uZyB2YWwsIGxvbmcgc2l6ZSwgbG9uZyBtYXgpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOwordm9pZCBndWlfbWNoX3NldF9mZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfYmdfY29sb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGltX3NldF9mb250IF9fQVJHUygoTE9HRk9OVCAqbGYpKTsKK3ZvaWQgaW1fc2V0X3Bvc2l0aW9uIF9fQVJHUygoaW50IHJvdywgaW50IGNvbCkpOwordm9pZCBpbV9zZXRfYWN0aXZlIF9fQVJHUygoaW50IGFjdGl2ZSkpOworaW50IGltX2dldF9zdGF0dXMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19zdHJpbmcgX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnRleHQsIGludCBsZW4sIGludCBmbGFncykpOwordm9pZCBndWlfbWNoX2ZsdXNoIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2FkZF9tZW51IF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgcG9zKSk7Cit2b2lkIGd1aV9tY2hfc2hvd19wb3B1cG1lbnUgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUpKTsKK3ZvaWQgZ3VpX21ha2VfcG9wdXAgX19BUkdTKChjaGFyX3UgKnBhdGhfbmFtZSkpOwordm9pZCBndWlfbWFrZV90ZWFyb2ZmIF9fQVJHUygoY2hhcl91ICpwYXRoX25hbWUpKTsKK3ZvaWQgZ3VpX21jaF9hZGRfbWVudV9pdGVtIF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgaWR4KSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9tZW51IF9fQVJHUygodmltbWVudV9UICptZW51KSk7Cit2b2lkIGd1aV9tY2hfbWVudV9ncmV5IF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgZ3JleSkpOworaW50IGd1aV9tY2hfZGlhbG9nIF9fQVJHUygoaW50IHR5cGUsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqbWVzc2FnZSwgY2hhcl91ICpidXR0b25zLCBpbnQgZGZsdGJ1dHRvbiwgY2hhcl91ICp0ZXh0ZmllbGQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9kcmF3c2lnbiBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGludCB0eXBlbnIpKTsKK3ZvaWQgKmd1aV9tY2hfcmVnaXN0ZXJfc2lnbiBfX0FSR1MoKGNoYXJfdSAqc2lnbmZpbGUpKTsKK3ZvaWQgZ3VpX21jaF9kZXN0cm95X3NpZ24gX19BUkdTKCh2b2lkICpzaWduKSk7Cit2b2lkIGd1aV9tY2hfZGlzYWJsZV9iZXZhbF9hcmVhIF9fQVJHUygoQmFsbG9vbkV2YWwgKmJldmFsKSk7Cit2b2lkIGd1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEgX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwpKTsKK3ZvaWQgZ3VpX21jaF9wb3N0X2JhbGxvb24gX19BUkdTKChCYWxsb29uRXZhbCAqYmV2YWwsIGNoYXJfdSAqbWVzZykpOworQmFsbG9vbkV2YWwgKmd1aV9tY2hfY3JlYXRlX2JldmFsX2FyZWEgX19BUkdTKCh2b2lkICp0YXJnZXQsIGNoYXJfdSAqbWVzZywgdm9pZCAoKm1lc2dDQikoQmFsbG9vbkV2YWwgKiwgaW50KSwgdm9pZCAqY2xpZW50RGF0YSkpOwordm9pZCBndWlfbWNoX2Rlc3Ryb3lfYmV2YWxfYXJlYSBfX0FSR1MoKEJhbGxvb25FdmFsICpiZXZhbCkpOwordm9pZCBuZXRiZWFuc19kcmF3X211bHRpc2lnbl9pbmRpY2F0b3IgX19BUkdTKChpbnQgcm93KSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfeDExLnBybyBiL3NyYy9wcm90by9ndWlfeDExLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI0YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2d1aV94MTEucHJvCkBAIC0wLDAgKzEsNzAgQEAKKy8qIGd1aV94MTEuYyAqLwordm9pZCBndWlfeDExX2tleV9oaXRfY2IgX19BUkdTKChXaWRnZXQgdywgWHRQb2ludGVyIGR1ZCwgWEV2ZW50ICpldmVudCwgQm9vbGVhbiAqZHVtKSk7Cit2b2lkIGd1aV9tY2hfcHJlcGFyZSBfX0FSR1MoKGludCAqYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCBndWlfbWNoX2luaXRfY2hlY2sgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3VuaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9uZXdfY29sb3JzIF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfb3BlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX2luaXRfdG9vbHRpcF9mb250IF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfaW5pdF9tZW51X2ZvbnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZXhpdCBfX0FSR1MoKGludCByYykpOworaW50IGd1aV9tY2hfZ2V0X3dpbnBvcyBfX0FSR1MoKGludCAqeCwgaW50ICp5KSk7Cit2b2lkIGd1aV9tY2hfc2V0X3dpbnBvcyBfX0FSR1MoKGludCB4LCBpbnQgeSkpOwordm9pZCBndWlfbWNoX3NldF9zaGVsbHNpemUgX19BUkdTKChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtaW5fd2lkdGgsIGludCBtaW5faGVpZ2h0LCBpbnQgYmFzZV93aWR0aCwgaW50IGJhc2VfaGVpZ2h0KSk7Cit2b2lkIGd1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zIF9fQVJHUygoaW50ICpzY3JlZW5fdywgaW50ICpzY3JlZW5faCkpOworaW50IGd1aV9tY2hfaW5pdF9mb250IF9fQVJHUygoY2hhcl91ICpmb250X25hbWUsIGludCBkb19mb250c2V0KSk7CitHdWlGb250IGd1aV9tY2hfZ2V0X2ZvbnQgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBnaXZlRXJyb3JJZk1pc3NpbmcpKTsKK2ludCBndWlfbWNoX2FkanVzdF9jaGFyc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfZm9udCBfX0FSR1MoKEd1aUZvbnQgZm9udCkpOwordm9pZCBndWlfbWNoX3NldF9mb250c2V0IF9fQVJHUygoR3VpRm9udHNldCBmb250c2V0KSk7Cit2b2lkIGd1aV9tY2hfZnJlZV9mb250IF9fQVJHUygoR3VpRm9udCBmb250KSk7Cit2b2lkIGd1aV9tY2hfZnJlZV9mb250c2V0IF9fQVJHUygoR3VpRm9udHNldCBmb250c2V0KSk7CitHdWlGb250c2V0IGd1aV9tY2hfZ2V0X2ZvbnRzZXQgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBnaXZlRXJyb3JJZk1pc3NpbmcsIGludCBmaXhlZF93aWR0aCkpOworaW50IGZvbnRzZXRfaGVpZ2h0IF9fQVJHUygoWEZvbnRTZXQgZnMpKTsKK2ludCBmb250c2V0X2hlaWdodDIgX19BUkdTKChYRm9udFNldCBmcykpOworZ3VpY29sb3JfVCBndWlfbWNoX2dldF9jb2xvciBfX0FSR1MoKGNoYXJfdSAqcmVxbmFtZSkpOwordm9pZCBndWlfbWNoX3NldF9mZ19jb2xvciBfX0FSR1MoKGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfYmdfY29sb3IgX19BUkdTKChndWljb2xvcl9UIGNvbG9yKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19zdHJpbmcgX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBjaGFyX3UgKnMsIGludCBsZW4sIGludCBmbGFncykpOworaW50IGd1aV9tY2hfaGFza2V5IF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgZ3VpX2dldF94MTFfd2luZGlzIF9fQVJHUygoV2luZG93ICp3aW4sIERpc3BsYXkgKipkaXMpKTsKK3ZvaWQgZ3VpX21jaF9iZWVwIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2ZsYXNoIF9fQVJHUygoaW50IG1zZWMpKTsKK3ZvaWQgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlIF9fQVJHUygoaW50IHIsIGludCBjLCBpbnQgbnIsIGludCBuYykpOwordm9pZCBndWlfbWNoX2ljb25pZnkgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0X2ZvcmVncm91bmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yIF9fQVJHUygoZ3VpY29sb3JfVCBjb2xvcikpOwordm9pZCBndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IgX19BUkdTKChpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpKTsKK3ZvaWQgZ3VpX21jaF91cGRhdGUgX19BUkdTKCh2b2lkKSk7CitpbnQgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyBfX0FSR1MoKGxvbmcgd3RpbWUpKTsKK3ZvaWQgZ3VpX21jaF9mbHVzaCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF9jbGVhcl9ibG9jayBfX0FSR1MoKGludCByb3cxLCBpbnQgY29sMSwgaW50IHJvdzIsIGludCBjb2wyKSk7Cit2b2lkIGd1aV9tY2hfY2xlYXJfYWxsIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX2RlbGV0ZV9saW5lcyBfX0FSR1MoKGludCByb3csIGludCBudW1fbGluZXMpKTsKK3ZvaWQgZ3VpX21jaF9pbnNlcnRfbGluZXMgX19BUkdTKChpbnQgcm93LCBpbnQgbnVtX2xpbmVzKSk7Cit2b2lkIGNsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9zZXRfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgZ3VpX21jaF9tZW51X2dyZXkgX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KSk7Cit2b2lkIGd1aV9tY2hfbWVudV9oaWRkZW4gX19BUkdTKCh2aW1tZW51X1QgKm1lbnUsIGludCBoaWRkZW4pKTsKK3ZvaWQgZ3VpX21jaF9kcmF3X21lbnViYXIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV94MTFfbWVudV9jYiBfX0FSR1MoKFdpZGdldCB3LCBYdFBvaW50ZXIgY2xpZW50X2RhdGEsIFh0UG9pbnRlciBjYWxsX2RhdGEpKTsKK3ZvaWQgZ3VpX21jaF9zZXRfYmxpbmtpbmcgX19BUkdTKChsb25nIHdhaXR0aW1lLCBsb25nIG9uLCBsb25nIG9mZikpOwordm9pZCBndWlfbWNoX3N0b3BfYmxpbmsgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc3RhcnRfYmxpbmsgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgZ3VpX21jaF9nZXRfcmdiIF9fQVJHUygoZ3VpY29sb3JfVCBwaXhlbCkpOwordm9pZCBndWlfeDExX2NhbGxiYWNrcyBfX0FSR1MoKFdpZGdldCB0ZXh0QXJlYSwgV2lkZ2V0IHZpbUZvcm0pKTsKK2ludCBndWlfbWNoX2dldF9tb3VzZV94IF9fQVJHUygodm9pZCkpOworaW50IGd1aV9tY2hfZ2V0X21vdXNlX3kgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2V0bW91c2UgX19BUkdTKChpbnQgeCwgaW50IHkpKTsKK1hCdXR0b25QcmVzc2VkRXZlbnQgKmd1aV94MTFfZ2V0X2xhc3RfbW91c2VfZXZlbnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfZHJhd3NpZ24gX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBpbnQgdHlwZW5yKSk7Cit2b2lkICpndWlfbWNoX3JlZ2lzdGVyX3NpZ24gX19BUkdTKChjaGFyX3UgKnNpZ25maWxlKSk7Cit2b2lkIGd1aV9tY2hfZGVzdHJveV9zaWduIF9fQVJHUygodm9pZCAqc2lnbikpOwordm9pZCBndWlfbWNoX21vdXNlaGlkZSBfX0FSR1MoKGludCBoaWRlKSk7Cit2b2lkIG1jaF9zZXRfbW91c2Vfc2hhcGUgX19BUkdTKChpbnQgc2hhcGUpKTsKK3ZvaWQgZ2V0X3Rvb2xiYXJfcGl4bWFwIF9fQVJHUygodmltbWVudV9UICptZW51LCBQaXhtYXAgKnNlbiwgUGl4bWFwICppbnNlbikpOwordm9pZCBndWlfbWNoX21lbnVfc2V0X3RpcCBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vaGFuZ3VsaW4ucHJvIGIvc3JjL3Byb3RvL2hhbmd1bGluLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZkZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2hhbmd1bGluLnBybwpAQCAtMCwwICsxLDkgQEAKKy8qIGhhbmd1bGluLmMgKi8KK2ludCBoYW5ndWxfaW5wdXRfc3RhdGVfZ2V0IF9fQVJHUygodm9pZCkpOwordm9pZCBoYW5ndWxfaW5wdXRfc3RhdGVfc2V0IF9fQVJHUygoaW50IHN0YXRlKSk7CitpbnQgaW1fZ2V0X3N0YXR1cyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgaGFuZ3VsX2lucHV0X3N0YXRlX3RvZ2dsZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgaGFuZ3VsX2tleWJvYXJkX3NldCBfX0FSR1MoKHZvaWQpKTsKK2ludCBoYW5ndWxfaW5wdXRfcHJvY2VzcyBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOwordm9pZCBoYW5ndWxfaW5wdXRfY2xlYXIgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl9jc2NvcGUucHJvIGIvc3JjL3Byb3RvL2lmX2NzY29wZS5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxN2QxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9pZl9jc2NvcGUucHJvCkBAIC0wLDAgKzEsOSBAQAorLyogaWZfY3Njb3BlLmMgKi8KK3ZvaWQgZG9fY3Njb3BlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGRvX3Njc2NvcGUgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZG9fY3N0YWcgX19BUkdTKChleGFyZ19UICplYXApKTsKK2ludCBjc19mZ2V0cyBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgc2l6ZSkpOwordm9pZCBjc19mcmVlX3RhZ3MgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGNzX3ByaW50X3RhZ3MgX19BUkdTKCh2b2lkKSk7CitpbnQgY3NfY29ubmVjdGlvbiBfX0FSR1MoKGludCBudW0sIGNoYXJfdSAqZGJwYXRoLCBjaGFyX3UgKnBwYXRoKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl9vbGUucHJvIGIvc3JjL3Byb3RvL2lmX29sZS5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlZGNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9pZl9vbGUucHJvCkBAIC0wLDAgKzEsNSBAQAorLyogaWZfb2xlLmNwcCAqLwordm9pZCBJbml0T0xFIF9fQVJHUygoaW50KiBwYkRvUmVzdGFydCkpOwordm9pZCBVbmluaXRPTEUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIFJlZ2lzdGVyTWUgX19BUkdTKChpbnQgc2lsZW50KSk7Cit2b2lkIFVucmVnaXN0ZXJNZSBfX0FSR1MoKGludCBiTm90aWZ5VXNlcikpOwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2lmX3BlcmwucHJvIGIvc3JjL3Byb3RvL2lmX3BlcmwucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDMwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vaWZfcGVybC5wcm8KQEAgLTAsMCArMSw4IEBACisvKiBhdXRvL2lmX3BlcmwuYyAqLworaW50IHBlcmxfZW5hYmxlZCBfX0FSR1MoKGludCB2ZXJib3NlKSk7Cit2b2lkIHBlcmxfZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBtc2dfc3BsaXQgX19BUkdTKChjaGFyX3UgKnMsIGludCBhdHRyKSk7Cit2b2lkIHBlcmxfd2luX2ZyZWUgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgcGVybF9idWZfZnJlZSBfX0FSR1MoKGJ1Zl9UICpicCkpOwordm9pZCBleF9wZXJsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3BlcmxkbyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2lmX3BlcmxzZmlvLnBybyBiL3NyYy9wcm90by9pZl9wZXJsc2Zpby5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5MDQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9pZl9wZXJsc2Zpby5wcm8KQEAgLTAsMCArMSwzIEBACisvKiBpZl9wZXJsc2Zpby5jICovCitpbnQgKnNmZGNuZXd2aW0gX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl9weXRob24ucHJvIGIvc3JjL3Byb3RvL2lmX3B5dGhvbi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzYjZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9pZl9weXRob24ucHJvCkBAIC0wLDAgKzEsOCBAQAorLyogaWZfcHl0aG9uLmMgKi8KK2ludCBweXRob25fZW5hYmxlZCBfX0FSR1MoKGludCB2ZXJib3NlKSk7Cit2b2lkIHB5dGhvbl9lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGV4X3B5dGhvbiBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9weWZpbGUgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgcHl0aG9uX2J1ZmZlcl9mcmVlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBweXRob25fd2luZG93X2ZyZWUgX19BUkdTKCh3aW5fVCAqd2luKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl9ydWJ5LnBybyBiL3NyYy9wcm90by9pZl9ydWJ5LnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVkYjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2lmX3J1YnkucHJvCkBAIC0wLDAgKzEsOSBAQAorLyogaWZfcnVieS5jICovCitpbnQgcnVieV9lbmFibGVkIF9fQVJHUygoaW50IHZlcmJvc2UpKTsKK3ZvaWQgcnVieV9lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGV4X3J1YnkgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfcnVieWRvIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3J1YnlmaWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIHJ1YnlfYnVmZmVyX2ZyZWUgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIHJ1Ynlfd2luZG93X2ZyZWUgX19BUkdTKCh3aW5fVCAqd2luKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl90Y2wucHJvIGIvc3JjL3Byb3RvL2lmX3RjbC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3OWVkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9pZl90Y2wucHJvCkBAIC0wLDAgKzEsMTAgQEAKKy8qIGlmX3RjbC5jICovCit2b2lkIHZpbV90Y2xfaW5pdCBfX0FSR1MoKGNoYXIgKmFyZykpOworaW50IHRjbF9lbmFibGVkIF9fQVJHUygoaW50IHZlcmJvc2UpKTsKK3ZvaWQgdGNsX2VuZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZXhfdGNsIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X3RjbGZpbGUgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfdGNsZG8gX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgdGNsX2J1ZmZlcl9mcmVlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCB0Y2xfd2luZG93X2ZyZWUgX19BUkdTKCh3aW5fVCAqd2luKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9pZl94Y21kc3J2LnBybyBiL3NyYy9wcm90by9pZl94Y21kc3J2LnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZhMTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL2lmX3hjbWRzcnYucHJvCkBAIC0wLDAgKzEsMTEgQEAKKy8qIGlmX3hjbWRzcnYuYyAqLworaW50IHNlcnZlclJlZ2lzdGVyTmFtZSBfX0FSR1MoKERpc3BsYXkgKmRweSwgY2hhcl91ICpuYW1lKSk7Cit2b2lkIHNlcnZlckNoYW5nZVJlZ2lzdGVyZWRXaW5kb3cgX19BUkdTKChEaXNwbGF5ICpkcHksIFdpbmRvdyBuZXd3aW4pKTsKK2ludCBzZXJ2ZXJTZW5kVG9WaW0gX19BUkdTKChEaXNwbGF5ICpkcHksIGNoYXJfdSAqbmFtZSwgY2hhcl91ICpjbWQsIGNoYXJfdSAqKnJlc3VsdCwgV2luZG93ICpzZXJ2ZXIsIGludCBhc0V4cHIsIGludCBsb2NhbExvb3AsIGludCBzaWxlbnQpKTsKK2NoYXJfdSAqc2VydmVyR2V0VmltTmFtZXMgX19BUkdTKChEaXNwbGF5ICpkcHkpKTsKK1dpbmRvdyBzZXJ2ZXJTdHJUb1dpbiBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CitpbnQgc2VydmVyU2VuZFJlcGx5IF9fQVJHUygoY2hhcl91ICpuYW1lLCBjaGFyX3UgKnN0cikpOworaW50IHNlcnZlclJlYWRSZXBseSBfX0FSR1MoKERpc3BsYXkgKmRweSwgV2luZG93IHdpbiwgY2hhcl91ICoqc3RyLCBpbnQgbG9jYWxMb29wKSk7CitpbnQgc2VydmVyUGVla1JlcGx5IF9fQVJHUygoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luLCBjaGFyX3UgKipzdHIpKTsKK3ZvaWQgc2VydmVyRXZlbnRQcm9jIF9fQVJHUygoRGlzcGxheSAqZHB5LCBYRXZlbnQgKmV2ZW50UHRyKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9tYWluLnBybyBiL3NyYy9wcm90by9tYWluLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk2NWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL21haW4ucHJvCkBAIC0wLDAgKzEsMjUgQEAKKy8qIG1haW4uYyAqLwordm9pZCBtYWluX2xvb3AgX19BUkdTKChpbnQgY21kd2luKSk7Cit2b2lkIGdldG91dF9wcmVzZXJ2ZV9tb2RpZmllZCBfX0FSR1MoKGludCBleGl0dmFsKSk7Cit2b2lkIGdldG91dCBfX0FSR1MoKGludCBleGl0dmFsKSk7CitpbnQgcHJvY2Vzc19lbnYgX19BUkdTKChjaGFyX3UgKmVudiwgaW50IGlzX3ZpbWluaXQpKTsKK3ZvaWQgbWFpbmVycl9hcmdfbWlzc2luZyBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7Cit2b2lkIHRpbWVfcHVzaCBfX0FSR1MoKHZvaWQgKnR2X3JlbCwgdm9pZCAqdHZfc3RhcnQpKTsKK3ZvaWQgdGltZV9wb3AgX19BUkdTKCh2b2lkICp0cCkpOwordm9pZCB0aW1lX21zZyBfX0FSR1MoKGNoYXIgKm1zZywgdm9pZCAqdHZfc3RhcnQpKTsKK3ZvaWQgc2VydmVyX3RvX2lucHV0X2J1ZiBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CitjaGFyX3UgKmV2YWxfY2xpZW50X2V4cHJfdG9fc3RyaW5nIF9fQVJHUygoY2hhcl91ICpleHByKSk7CitpbnQgdG9GX1R5QSBfX0FSR1MoKGludCBjKSk7CitpbnQgZmttYXAgX19BUkdTKChpbnQgYykpOwordm9pZCBjb252X3RvX3B2aW0gX19BUkdTKCh2b2lkKSk7Cit2b2lkIGNvbnZfdG9fcHN0ZCBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqbHJzd2FwIF9fQVJHUygoY2hhcl91ICppYnVmKSk7CitjaGFyX3UgKmxyRnN3YXAgX19BUkdTKChjaGFyX3UgKmNtZGJ1ZiwgaW50IGxlbikpOworY2hhcl91ICpsckZfc3ViIF9fQVJHUygoY2hhcl91ICppYnVmKSk7CitpbnQgY21kbF9ma21hcCBfX0FSR1MoKGludCBjKSk7CitpbnQgRl9pc2FscGhhIF9fQVJHUygoaW50IGMpKTsKK2ludCBGX2lzZGlnaXQgX19BUkdTKChpbnQgYykpOworaW50IEZfaXNjaGFyIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgZmFyc2lfZmtleSBfX0FSR1MoKGNtZGFyZ19UICpjYXApKTsKK2ludCBhcmFiaWNfc2hhcGUgX19BUkdTKChpbnQgYywgaW50ICpjY3AsIGludCAqYzFwLCBpbnQgcHJldl9jLCBpbnQgcHJldl9jMSwgaW50IG5leHRfYykpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vbWFyay5wcm8gYi9zcmMvcHJvdG8vbWFyay5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwYTFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9tYXJrLnBybwpAQCAtMCwwICsxLDI2IEBACisvKiBtYXJrLmMgKi8KK2ludCBzZXRtYXJrIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgc2V0cGNtYXJrIF9fQVJHUygodm9pZCkpOwordm9pZCBjaGVja3BjbWFyayBfX0FSR1MoKHZvaWQpKTsKK3Bvc19UICptb3ZlbWFyayBfX0FSR1MoKGludCBjb3VudCkpOworcG9zX1QgKm1vdmVjaGFuZ2VsaXN0IF9fQVJHUygoaW50IGNvdW50KSk7Citwb3NfVCAqZ2V0bWFyayBfX0FSR1MoKGludCBjLCBpbnQgY2hhbmdlZmlsZSkpOworcG9zX1QgKmdldG5leHRtYXJrIF9fQVJHUygocG9zX1QgKnN0YXJ0cG9zLCBpbnQgZGlyLCBpbnQgYmVnaW5fbGluZSkpOwordm9pZCBmbWFya3NfY2hlY2tfbmFtZXMgX19BUkdTKChidWZfVCAqYnVmKSk7CitpbnQgY2hlY2tfbWFyayBfX0FSR1MoKHBvc19UICpwb3MpKTsKK3ZvaWQgY2xyYWxsbWFya3MgX19BUkdTKChidWZfVCAqYnVmKSk7CitjaGFyX3UgKmZtX2dldG5hbWUgX19BUkdTKChmbWFya19UICpmbWFyaywgaW50IGxlYWRfbGVuKSk7Cit2b2lkIGRvX21hcmtzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2p1bXBzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NoYW5nZXMgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgbWFya19hZGp1c3QgX19BUkdTKChsaW5lbnJfVCBsaW5lMSwgbGluZW5yX1QgbGluZTIsIGxvbmcgYW1vdW50LCBsb25nIGFtb3VudF9hZnRlcikpOwordm9pZCBtYXJrX2NvbF9hZGp1c3QgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjb2xucl9UIG1pbmNvbCwgbG9uZyBsbnVtX2Ftb3VudCwgbG9uZyBjb2xfYW1vdW50KSk7Cit2b2lkIGNvcHlfanVtcGxpc3QgX19BUkdTKCh3aW5fVCAqZnJvbSwgd2luX1QgKnRvKSk7Cit2b2lkIGZyZWVfanVtcGxpc3QgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgc2V0X2xhc3RfY3Vyc29yIF9fQVJHUygod2luX1QgKndpbikpOworaW50IHJlYWRfdmltaW5mb19maWxlbWFyayBfX0FSR1MoKHZpcl9UICp2aXJwLCBpbnQgZm9yY2UpKTsKK3ZvaWQgd3JpdGVfdmltaW5mb19maWxlbWFya3MgX19BUkdTKChGSUxFICpmcCkpOworaW50IHJlbW92YWJsZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IHdyaXRlX3ZpbWluZm9fbWFya3MgX19BUkdTKChGSUxFICpmcF9vdXQpKTsKK3ZvaWQgY29weV92aW1pbmZvX21hcmtzIF9fQVJHUygodmlyX1QgKnZpcnAsIEZJTEUgKmZwX291dCwgaW50IGNvdW50LCBpbnQgZW9mKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9tYnl0ZS5wcm8gYi9zcmMvcHJvdG8vbWJ5dGUucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjdhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vbWJ5dGUucHJvCkBAIC0wLDAgKzEsODYgQEAKKy8qIG1ieXRlLmMgKi8KK2ludCBlbmNfY2Fub25fcHJvcHMgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2NoYXJfdSAqbWJfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBib21iX3NpemUgX19BUkdTKCh2b2lkKSk7CitpbnQgbWJfZ2V0X2NsYXNzIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgZGJjc19jbGFzcyBfX0FSR1MoKHVuc2lnbmVkIGxlYWQsIHVuc2lnbmVkIHRyYWlsKSk7CitpbnQgbGF0aW5fY2hhcjJsZW4gX19BUkdTKChpbnQgYykpOworaW50IGxhdGluX2NoYXIyYnl0ZXMgX19BUkdTKChpbnQgYywgY2hhcl91ICpidWYpKTsKK2ludCBsYXRpbl9wdHIybGVuX2NoZWNrIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgdXRmX2NoYXIyY2VsbHMgX19BUkdTKChpbnQgYykpOworaW50IGxhdGluX3B0cjJjZWxscyBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IHV0Zl9wdHIyY2VsbHMgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCBkYmNzX3B0cjJjZWxscyBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IGxhdGluX2NoYXIyY2VsbHMgX19BUkdTKChpbnQgYykpOworaW50IGxhdGluX29mZjJjZWxscyBfX0FSR1MoKHVuc2lnbmVkIG9mZikpOworaW50IGRiY3Nfb2ZmMmNlbGxzIF9fQVJHUygodW5zaWduZWQgb2ZmKSk7CitpbnQgdXRmX29mZjJjZWxscyBfX0FSR1MoKHVuc2lnbmVkIG9mZikpOworaW50IGxhdGluX3B0cjJjaGFyIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgdXRmX3B0cjJjaGFyIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgbWJfcHRyMmNoYXJfYWR2IF9fQVJHUygoY2hhcl91ICoqcHApKTsKK2ludCBhcmFiaWNfY29tYmluZSBfX0FSR1MoKGludCBvbmUsIGludCB0d28pKTsKK2ludCBhcmFiaWNfbWF5Y29tYmluZSBfX0FSR1MoKGludCB0d28pKTsKK2ludCB1dGZfY29tcG9zaW5nbGlrZSBfX0FSR1MoKGNoYXJfdSAqcDEsIGNoYXJfdSAqcDIpKTsKK2ludCB1dGZjX3B0cjJjaGFyIF9fQVJHUygoY2hhcl91ICpwLCBpbnQgKnAxLCBpbnQgKnAyKSk7CitpbnQgdXRmY19wdHIyY2hhcl9sZW4gX19BUkdTKChjaGFyX3UgKnAsIGludCAqcDEsIGludCAqcDIsIGludCBtYXhsZW4pKTsKK2ludCB1dGZjX2NoYXIyYnl0ZXMgX19BUkdTKChpbnQgb2ZmLCBjaGFyX3UgKmJ1ZikpOworaW50IHV0Zl9wdHIybGVuX2NoZWNrIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgdXRmX2J5dGUybGVuIF9fQVJHUygoaW50IGIpKTsKK2ludCB1dGZfcHRyMmxlbl9jaGVja19sZW4gX19BUkdTKChjaGFyX3UgKnAsIGludCBzaXplKSk7CitpbnQgdXRmY19wdHIybGVuX2NoZWNrIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgdXRmY19wdHIybGVuX2NoZWNrX2xlbiBfX0FSR1MoKGNoYXJfdSAqcCwgaW50IHNpemUpKTsKK2ludCB1dGZfY2hhcjJsZW4gX19BUkdTKChpbnQgYykpOworaW50IHV0Zl9jaGFyMmJ5dGVzIF9fQVJHUygoaW50IGMsIGNoYXJfdSAqYnVmKSk7CitpbnQgdXRmX2lzY29tcG9zaW5nIF9fQVJHUygoaW50IGMpKTsKK2ludCB1dGZfcHJpbnRhYmxlIF9fQVJHUygoaW50IGMpKTsKK2ludCB1dGZfY2xhc3MgX19BUkdTKChpbnQgYykpOworaW50IHV0Zl9mb2xkIF9fQVJHUygoaW50IGEpKTsKK2ludCB1dGZfdG91cHBlciBfX0FSR1MoKGludCBhKSk7CitpbnQgdXRmX2lzbG93ZXIgX19BUkdTKChpbnQgYSkpOworaW50IHV0Zl90b2xvd2VyIF9fQVJHUygoaW50IGEpKTsKK2ludCB1dGZfaXN1cHBlciBfX0FSR1MoKGludCBhKSk7CitpbnQgbWJfc3RybmljbXAgX19BUkdTKChjaGFyX3UgKnMxLCBjaGFyX3UgKnMyLCBpbnQgbikpOwordm9pZCBzaG93X3V0ZjggX19BUkdTKCh2b2lkKSk7CitpbnQgbGF0aW5faGVhZF9vZmYgX19BUkdTKChjaGFyX3UgKmJhc2UsIGNoYXJfdSAqcCkpOworaW50IGRiY3NfaGVhZF9vZmYgX19BUkdTKChjaGFyX3UgKmJhc2UsIGNoYXJfdSAqcCkpOworaW50IGRiY3Nfc2NyZWVuX2hlYWRfb2ZmIF9fQVJHUygoY2hhcl91ICpiYXNlLCBjaGFyX3UgKnApKTsKK2ludCB1dGZfaGVhZF9vZmYgX19BUkdTKChjaGFyX3UgKmJhc2UsIGNoYXJfdSAqcCkpOworaW50IG1iX29mZl9uZXh0IF9fQVJHUygoY2hhcl91ICpiYXNlLCBjaGFyX3UgKnApKTsKK2ludCBtYl90YWlsX29mZiBfX0FSR1MoKGNoYXJfdSAqYmFzZSwgY2hhcl91ICpwKSk7CitpbnQgZGJjc19zY3JlZW5fdGFpbF9vZmYgX19BUkdTKChjaGFyX3UgKmJhc2UsIGNoYXJfdSAqcCkpOwordm9pZCBtYl9hZGp1c3RfY3Vyc29yIF9fQVJHUygodm9pZCkpOwordm9pZCBtYl9hZGp1c3Rwb3MgX19BUkdTKChwb3NfVCAqbHApKTsKK2NoYXJfdSAqbWJfcHJldnB0ciBfX0FSR1MoKGNoYXJfdSAqbGluZSwgY2hhcl91ICpwKSk7CitpbnQgbWJfY2hhcmxlbiBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CitjaGFyX3UgKm1iX3VuZXNjYXBlIF9fQVJHUygoY2hhcl91ICoqcHApKTsKK2ludCBtYl9sZWZ0aGFsdmUgX19BUkdTKChpbnQgcm93LCBpbnQgY29sKSk7CitpbnQgbWJfZml4X2NvbCBfX0FSR1MoKGludCBjb2wsIGludCByb3cpKTsKK2NoYXJfdSAqZW5jX3NraXAgX19BUkdTKChjaGFyX3UgKnApKTsKK2NoYXJfdSAqZW5jX2Nhbm9uaXplIF9fQVJHUygoY2hhcl91ICplbmMpKTsKK2NoYXJfdSAqZW5jX2xvY2FsZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBlbmNuYW1lMmNvZGVwYWdlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkICpteV9pY29udl9vcGVuIF9fQVJHUygoY2hhcl91ICp0bywgY2hhcl91ICpmcm9tKSk7CitpbnQgaWNvbnZfZW5hYmxlZCBfX0FSR1MoKGludCB2ZXJib3NlKSk7Cit2b2lkIGljb252X2VuZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBpbV94aW1faXN2YWxpZF9pbWFjdGl2YXRlIF9fQVJHUygodm9pZCkpOwordm9pZCBpbV9zZXRfYWN0aXZlIF9fQVJHUygoaW50IGFjdGl2ZSkpOwordm9pZCB4aW1fc2V0X2ZvY3VzIF9fQVJHUygoaW50IGZvY3VzKSk7Cit2b2lkIGltX3NldF9wb3NpdGlvbiBfX0FSR1MoKGludCByb3csIGludCBjb2wpKTsKK3ZvaWQgeGltX3NldF9wcmVlZGl0IF9fQVJHUygodm9pZCkpOwordm9pZCB4aW1fc2V0X3N0YXR1c19hcmVhIF9fQVJHUygodm9pZCkpOwordm9pZCB4aW1faW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgeGltX2RlY2lkZV9pbnB1dF9zdHlsZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBpbV9nZXRfZmVlZGJhY2tfYXR0ciBfX0FSR1MoKGludCBjb2wpKTsKK3ZvaWQgeGltX3Jlc2V0IF9fQVJHUygodm9pZCkpOworaW50IHhpbV9xdWV1ZV9rZXlfcHJlc3NfZXZlbnQgX19BUkdTKChHZGtFdmVudEtleSAqZXZlbnQsIGludCBkb3duKSk7Cit2b2lkIHhpbV9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBpbV9zaHV0ZG93biBfX0FSR1MoKHZvaWQpKTsKK2ludCB4aW1fZ2V0X3N0YXR1c19hcmVhX2hlaWdodCBfX0FSR1MoKHZvaWQpKTsKK2ludCBpbV9nZXRfc3RhdHVzIF9fQVJHUygodm9pZCkpOworaW50IGltX2lzX3ByZWVkaXRpbmcgX19BUkdTKCh2b2lkKSk7CitpbnQgY29udmVydF9zZXR1cCBfX0FSR1MoKHZpbWNvbnZfVCAqdmNwLCBjaGFyX3UgKmZyb20sIGNoYXJfdSAqdG8pKTsKK2ludCBjb252ZXJ0X2lucHV0IF9fQVJHUygoY2hhcl91ICpwdHIsIGludCBsZW4sIGludCBtYXhsZW4pKTsKK2ludCBjb252ZXJ0X2lucHV0X3NhZmUgX19BUkdTKChjaGFyX3UgKnB0ciwgaW50IGxlbiwgaW50IG1heGxlbiwgY2hhcl91ICoqcmVzdHAsIGludCAqcmVzdGxlbnApKTsKK2NoYXJfdSAqc3RyaW5nX2NvbnZlcnQgX19BUkdTKCh2aW1jb252X1QgKnZjcCwgY2hhcl91ICpwdHIsIGludCAqbGVucCkpOworY2hhcl91ICpzdHJpbmdfY29udmVydF9leHQgX19BUkdTKCh2aW1jb252X1QgKnZjcCwgY2hhcl91ICpwdHIsIGludCAqbGVucCwgaW50ICp1bmNvbnZsZW5wKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9tZW1maWxlLnBybyBiL3NyYy9wcm90by9tZW1maWxlLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmViNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL21lbWZpbGUucHJvCkBAIC0wLDAgKzEsMTcgQEAKKy8qIG1lbWZpbGUuYyAqLworbWVtZmlsZV9UICptZl9vcGVuIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgaW50IGZsYWdzKSk7CitpbnQgbWZfb3Blbl9maWxlIF9fQVJHUygobWVtZmlsZV9UICptZnAsIGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgbWZfY2xvc2UgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgaW50IGRlbF9maWxlKSk7Cit2b2lkIG1mX2Nsb3NlX2ZpbGUgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgZ2V0bGluZXMpKTsKK3ZvaWQgbWZfbmV3X3BhZ2Vfc2l6ZSBfX0FSR1MoKG1lbWZpbGVfVCAqbWZwLCB1bnNpZ25lZCBuZXdfc2l6ZSkpOworYmhkcl9UICptZl9uZXcgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgaW50IG5lZ2F0aXZlLCBpbnQgcGFnZV9jb3VudCkpOworYmhkcl9UICptZl9nZXQgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgYmxvY2tucl9UIG5yLCBpbnQgcGFnZV9jb3VudCkpOwordm9pZCBtZl9wdXQgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgYmhkcl9UICpocCwgaW50IGRpcnR5LCBpbnQgaW5maWxlKSk7Cit2b2lkIG1mX2ZyZWUgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgYmhkcl9UICpocCkpOworaW50IG1mX3N5bmMgX19BUkdTKChtZW1maWxlX1QgKm1mcCwgaW50IGZsYWdzKSk7CitpbnQgbWZfcmVsZWFzZV9hbGwgX19BUkdTKCh2b2lkKSk7CitibG9ja25yX1QgbWZfdHJhbnNfZGVsIF9fQVJHUygobWVtZmlsZV9UICptZnAsIGJsb2NrbnJfVCBvbGRfbnIpKTsKK3ZvaWQgbWZfc2V0X2ZmbmFtZSBfX0FSR1MoKG1lbWZpbGVfVCAqbWZwKSk7Cit2b2lkIG1mX2Z1bGxuYW1lIF9fQVJHUygobWVtZmlsZV9UICptZnApKTsKK2ludCBtZl9uZWVkX3RyYW5zIF9fQVJHUygobWVtZmlsZV9UICptZnApKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL21lbWxpbmUucHJvIGIvc3JjL3Byb3RvL21lbWxpbmUucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDEwODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vbWVtbGluZS5wcm8KQEAgLTAsMCArMSwzMSBAQAorLyogbWVtbGluZS5jICovCitpbnQgbWxfb3BlbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWxfc2V0bmFtZSBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgbWxfb3Blbl9maWxlcyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWxfb3Blbl9maWxlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBjaGVja19uZWVkX3N3YXAgX19BUkdTKChpbnQgbmV3ZmlsZSkpOwordm9pZCBtbF9jbG9zZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBkZWxfZmlsZSkpOwordm9pZCBtbF9jbG9zZV9hbGwgX19BUkdTKChpbnQgZGVsX2ZpbGUpKTsKK3ZvaWQgbWxfY2xvc2Vfbm90bW9kIF9fQVJHUygodm9pZCkpOwordm9pZCBtbF90aW1lc3RhbXAgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIG1sX3JlY292ZXIgX19BUkdTKCh2b2lkKSk7CitpbnQgcmVjb3Zlcl9uYW1lcyBfX0FSR1MoKGNoYXJfdSAqKmZuYW1lLCBpbnQgbGlzdCwgaW50IG5yKSk7Cit2b2lkIG1sX3N5bmNfYWxsIF9fQVJHUygoaW50IGNoZWNrX2ZpbGUsIGludCBjaGVja19jaGFyKSk7Cit2b2lkIG1sX3ByZXNlcnZlIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IG1lc3NhZ2UpKTsKK2NoYXJfdSAqbWxfZ2V0IF9fQVJHUygobGluZW5yX1QgbG51bSkpOworY2hhcl91ICptbF9nZXRfcG9zIF9fQVJHUygocG9zX1QgKnBvcykpOworY2hhcl91ICptbF9nZXRfY3VybGluZSBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqbWxfZ2V0X2N1cnNvciBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqbWxfZ2V0X2J1ZiBfX0FSR1MoKGJ1Zl9UICpidWYsIGxpbmVucl9UIGxudW0sIGludCB3aWxsX2NoYW5nZSkpOworaW50IG1sX2xpbmVfYWxsb2NlZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtbF9hcHBlbmQgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjaGFyX3UgKmxpbmUsIGNvbG5yX1QgbGVuLCBpbnQgbmV3ZmlsZSkpOworaW50IG1sX3JlcGxhY2UgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjaGFyX3UgKmxpbmUsIGludCBjb3B5KSk7CitpbnQgbWxfZGVsZXRlIF9fQVJHUygobGluZW5yX1QgbG51bSwgaW50IG1lc3NhZ2UpKTsKK3ZvaWQgbWxfc2V0bWFya2VkIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworbGluZW5yX1QgbWxfZmlyc3RtYXJrZWQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1sX2NsZWFybWFya2VkIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfZmlsZV9pbl9kaXIgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmRuYW1lKSk7Cit2b2lkIG1sX3NldGRpcnR5IF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGZsYWcpKTsKK2xvbmcgbWxfZmluZF9saW5lX29yX29mZnNldCBfX0FSR1MoKGJ1Zl9UICpidWYsIGxpbmVucl9UIGxpbmUsIGxvbmcgKm9mZnApKTsKK3ZvaWQgZ290b19ieXRlIF9fQVJHUygobG9uZyBjbnQpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL21lbnUucHJvIGIvc3JjL3Byb3RvL21lbnUucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmE5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vbWVudS5wcm8KQEAgLTAsMCArMSwyMSBAQAorLyogbWVudS5jICovCit2b2lkIGV4X21lbnUgX19BUkdTKChleGFyZ19UICplYXApKTsKK2NoYXJfdSAqc2V0X2NvbnRleHRfaW5fbWVudV9jbWQgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqY21kLCBjaGFyX3UgKmFyZywgaW50IGZvcmNlaXQpKTsKK2NoYXJfdSAqZ2V0X21lbnVfbmFtZSBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworY2hhcl91ICpnZXRfbWVudV9uYW1lcyBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworY2hhcl91ICptZW51X25hbWVfc2tpcCBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IGdldF9tZW51X2luZGV4IF9fQVJHUygodmltbWVudV9UICptZW51LCBpbnQgc3RhdGUpKTsKK2ludCBtZW51X2lzX21lbnViYXIgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtZW51X2lzX3BvcHVwIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWVudV9pc19jaGlsZF9vZl9wb3B1cCBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOworaW50IG1lbnVfaXNfdG9vbGJhciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1lbnVfaXNfc2VwYXJhdG9yIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGd1aV9jcmVhdGVfaW5pdGlhbF9tZW51cyBfX0FSR1MoKHZpbW1lbnVfVCAqbWVudSkpOwordm9pZCBndWlfdXBkYXRlX21lbnVzIF9fQVJHUygoaW50IG1vZGVzKSk7CitpbnQgZ3VpX2lzX21lbnVfc2hvcnRjdXQgX19BUkdTKChpbnQga2V5KSk7Cit2b2lkIGd1aV9zaG93X3BvcHVwbWVudSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZ3VpX21jaF90b2dnbGVfdGVhcm9mZnMgX19BUkdTKChpbnQgZW5hYmxlKSk7Cit2b2lkIGV4X2VtZW51IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2aW1tZW51X1QgKmd1aV9maW5kX21lbnUgX19BUkdTKChjaGFyX3UgKnBhdGhfbmFtZSkpOwordm9pZCBleF9tZW51dHJhbnNsYXRlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9tZXNzYWdlLnBybyBiL3NyYy9wcm90by9tZXNzYWdlLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzc3NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL21lc3NhZ2UucHJvCkBAIC0wLDAgKzEsNTcgQEAKKy8qIG1lc3NhZ2UuYyAqLworaW50IG1zZyBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IG1zZ19hdHRyIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgYXR0cikpOworaW50IG1zZ19hdHRyX2tlZXAgX19BUkdTKChjaGFyX3UgKnMsIGludCBhdHRyLCBpbnQga2VlcCkpOworY2hhcl91ICptc2dfc3RydHJ1bmMgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgdHJ1bmNfc3RyaW5nIF9fQVJHUygoY2hhcl91ICpzLCBjaGFyX3UgKmJ1ZiwgaW50IHJvb20pKTsKK2ludCBlbXNnIF9fQVJHUygoY2hhcl91ICpzKSk7CitpbnQgZW1zZzIgX19BUkdTKChjaGFyX3UgKnMsIGNoYXJfdSAqYTEpKTsKK2ludCBlbXNnMyBfX0FSR1MoKGNoYXJfdSAqcywgY2hhcl91ICphMSwgY2hhcl91ICphMikpOworaW50IGVtc2duIF9fQVJHUygoY2hhcl91ICpzLCBsb25nIG4pKTsKK2NoYXJfdSAqbXNnX3RydW5jX2F0dHIgX19BUkdTKChjaGFyX3UgKnMsIGludCBmb3JjZSwgaW50IGF0dHIpKTsKK2NoYXJfdSAqbXNnX21heV90cnVuYyBfX0FSR1MoKGludCBmb3JjZSwgY2hhcl91ICpzKSk7Cit2b2lkIGV4X21lc3NhZ2VzIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIHdhaXRfcmV0dXJuIF9fQVJHUygoaW50IHJlZHJhdykpOwordm9pZCBzZXRfa2VlcF9tc2cgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgbXNnX3N0YXJ0IF9fQVJHUygodm9pZCkpOwordm9pZCBtc2dfc3RhcnRoZXJlIF9fQVJHUygodm9pZCkpOwordm9pZCBtc2dfcHV0Y2hhciBfX0FSR1MoKGludCBjKSk7Cit2b2lkIG1zZ19wdXRjaGFyX2F0dHIgX19BUkdTKChpbnQgYywgaW50IGF0dHIpKTsKK3ZvaWQgbXNnX291dG51bSBfX0FSR1MoKGxvbmcgbikpOwordm9pZCBtc2dfaG9tZV9yZXBsYWNlIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwordm9pZCBtc2dfaG9tZV9yZXBsYWNlX2hsIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworaW50IG1zZ19vdXR0cmFucyBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CitpbnQgbXNnX291dHRyYW5zX2F0dHIgX19BUkdTKChjaGFyX3UgKnN0ciwgaW50IGF0dHIpKTsKK2ludCBtc2dfb3V0dHJhbnNfbGVuIF9fQVJHUygoY2hhcl91ICpzdHIsIGludCBsZW4pKTsKK2NoYXJfdSAqbXNnX291dHRyYW5zX29uZSBfX0FSR1MoKGNoYXJfdSAqcCwgaW50IGF0dHIpKTsKK2ludCBtc2dfb3V0dHJhbnNfbGVuX2F0dHIgX19BUkdTKChjaGFyX3UgKm1zZ3N0ciwgaW50IGxlbiwgaW50IGF0dHIpKTsKK3ZvaWQgbXNnX21ha2UgX19BUkdTKChjaGFyX3UgKmFyZykpOworaW50IG1zZ19vdXR0cmFuc19zcGVjaWFsIF9fQVJHUygoY2hhcl91ICpzdHJzdGFydCwgaW50IGZyb20pKTsKK2NoYXJfdSAqc3RyMnNwZWNpYWwgX19BUkdTKChjaGFyX3UgKipzcCwgaW50IGZyb20pKTsKK3ZvaWQgc3RyMnNwZWNpYWxidWYgX19BUkdTKChjaGFyX3UgKnNwLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbikpOwordm9pZCBtc2dfcHJ0X2xpbmUgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgbXNnX3B1dHMgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgbXNnX3B1dHNfdGl0bGUgX19BUkdTKChjaGFyX3UgKnMpKTsKK3ZvaWQgbXNnX3B1dHNfbG9uZyBfX0FSR1MoKGNoYXJfdSAqbG9uZ3N0cikpOwordm9pZCBtc2dfcHV0c19sb25nX2F0dHIgX19BUkdTKChjaGFyX3UgKmxvbmdzdHIsIGludCBhdHRyKSk7Cit2b2lkIG1zZ19wdXRzX2xvbmdfbGVuX2F0dHIgX19BUkdTKChjaGFyX3UgKmxvbmdzdHIsIGludCBsZW4sIGludCBhdHRyKSk7Cit2b2lkIG1zZ19wdXRzX2F0dHIgX19BUkdTKChjaGFyX3UgKnMsIGludCBhdHRyKSk7CitpbnQgbXNnX3VzZV9wcmludGYgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9lcnJtc2cgX19BUkdTKChjaGFyICpzdHIpKTsKK3ZvaWQgbWNoX21zZyBfX0FSR1MoKGNoYXIgKnN0cikpOwordm9pZCBtc2dfbW9yZW1zZyBfX0FSR1MoKGludCBmdWxsKSk7Cit2b2lkIHJlcGVhdF9tZXNzYWdlIF9fQVJHUygodm9pZCkpOwordm9pZCBtc2dfY2xyX2VvcyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbXNnX2Nscl9lb3NfZm9yY2UgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1zZ19jbHJfY21kbGluZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtc2dfZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBtc2dfY2hlY2sgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGdpdmVfd2FybmluZyBfX0FSR1MoKGNoYXJfdSAqbWVzc2FnZSwgaW50IGhsKSk7Cit2b2lkIG1zZ19hZHZhbmNlIF9fQVJHUygoaW50IGNvbCkpOworaW50IGRvX2RpYWxvZyBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGNoYXJfdSAqYnV0dG9ucywgaW50IGRmbHRidXR0b24sIGNoYXJfdSAqdGV4dGZpZWxkKSk7Cit2b2lkIGRpc3BsYXlfY29uZmlybV9tc2cgX19BUkdTKCh2b2lkKSk7CitpbnQgdmltX2RpYWxvZ195ZXNubyBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGludCBkZmx0KSk7CitpbnQgdmltX2RpYWxvZ195ZXNub2NhbmNlbCBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGludCBkZmx0KSk7CitpbnQgdmltX2RpYWxvZ195ZXNub2FsbGNhbmNlbCBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKm1lc3NhZ2UsIGludCBkZmx0KSk7CitjaGFyX3UgKmRvX2Jyb3dzZSBfX0FSR1MoKGludCBzYXZpbmcsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqZGZsdCwgY2hhcl91ICpleHQsIGNoYXJfdSAqaW5pdGRpciwgY2hhcl91ICpmaWx0ZXIsIGJ1Zl9UICpidWYpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL21pc2MxLnBybyBiL3NyYy9wcm90by9taXNjMS5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYzMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9taXNjMS5wcm8KQEAgLTAsMCArMSw4NyBAQAorLyogbWlzYzEuYyAqLworaW50IGdldF9pbmRlbnQgX19BUkdTKCh2b2lkKSk7CitpbnQgZ2V0X2luZGVudF9sbnVtIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IGdldF9pbmRlbnRfYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZiwgbGluZW5yX1QgbG51bSkpOworaW50IHNldF9pbmRlbnQgX19BUkdTKChpbnQgc2l6ZSwgaW50IGZsYWdzKSk7CitpbnQgZ2V0X251bWJlcl9pbmRlbnQgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7CitpbnQgb3Blbl9saW5lIF9fQVJHUygoaW50IGRpciwgaW50IGZsYWdzLCBpbnQgb2xkX2luZGVudCkpOworaW50IGdldF9sZWFkZXJfbGVuIF9fQVJHUygoY2hhcl91ICpsaW5lLCBjaGFyX3UgKipmbGFncywgaW50IGJhY2t3YXJkKSk7CitpbnQgcGxpbmVzIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IHBsaW5lc193aW4gX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxudW0sIGludCB3aW5oZWlnaHQpKTsKK2ludCBwbGluZXNfbm9maWxsIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IHBsaW5lc193aW5fbm9maWxsIF9fQVJHUygod2luX1QgKndwLCBsaW5lbnJfVCBsbnVtLCBpbnQgd2luaGVpZ2h0KSk7CitpbnQgcGxpbmVzX3dpbl9ub2ZvbGQgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxudW0pKTsKK2ludCBwbGluZXNfd2luX2NvbCBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSwgbG9uZyBjb2x1bW4pKTsKK2ludCBwbGluZXNfbV93aW4gX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGZpcnN0LCBsaW5lbnJfVCBsYXN0KSk7Cit2b2lkIGluc19ieXRlcyBfX0FSR1MoKGNoYXJfdSAqcCkpOwordm9pZCBpbnNfYnl0ZXNfbGVuIF9fQVJHUygoY2hhcl91ICpwLCBpbnQgbGVuKSk7Cit2b2lkIGluc19jaGFyIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgaW5zX2NoYXJfYnl0ZXMgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IGNoYXJsZW4pKTsKK3ZvaWQgaW5zX3N0ciBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IGRlbF9jaGFyIF9fQVJHUygoaW50IGZpeHBvcykpOworaW50IGRlbF9jaGFycyBfX0FSR1MoKGxvbmcgY291bnQsIGludCBmaXhwb3MpKTsKK2ludCBkZWxfYnl0ZXMgX19BUkdTKChsb25nIGNvdW50LCBpbnQgZml4cG9zKSk7CitpbnQgdHJ1bmNhdGVfbGluZSBfX0FSR1MoKGludCBmaXhwb3MpKTsKK3ZvaWQgZGVsX2xpbmVzIF9fQVJHUygobG9uZyBubGluZXMsIGludCB1bmRvKSk7CitpbnQgZ2NoYXJfcG9zIF9fQVJHUygocG9zX1QgKnBvcykpOworaW50IGdjaGFyX2N1cnNvciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcGNoYXJfY3Vyc29yIF9fQVJHUygoaW50IGMpKTsKK2ludCBpbmluZGVudCBfX0FSR1MoKGludCBleHRyYSkpOworY2hhcl91ICpza2lwX3RvX29wdGlvbl9wYXJ0IF9fQVJHUygoY2hhcl91ICpwKSk7Cit2b2lkIGNoYW5nZWQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGNoYW5nZWRfYnl0ZXMgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjb2xucl9UIGNvbCkpOwordm9pZCBhcHBlbmRlZF9saW5lcyBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGxvbmcgY291bnQpKTsKK3ZvaWQgYXBwZW5kZWRfbGluZXNfbWFyayBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGxvbmcgY291bnQpKTsKK3ZvaWQgZGVsZXRlZF9saW5lcyBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGxvbmcgY291bnQpKTsKK3ZvaWQgZGVsZXRlZF9saW5lc19tYXJrIF9fQVJHUygobGluZW5yX1QgbG51bSwgbG9uZyBjb3VudCkpOwordm9pZCBjaGFuZ2VkX2xpbmVzIF9fQVJHUygobGluZW5yX1QgbG51bSwgY29sbnJfVCBjb2wsIGxpbmVucl9UIGxudW1lLCBsb25nIHh0cmEpKTsKK3ZvaWQgdW5jaGFuZ2VkIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IGZmKSk7Cit2b2lkIGNoZWNrX3N0YXR1cyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgY2hhbmdlX3dhcm5pbmcgX19BUkdTKChpbnQgY29sKSk7CitpbnQgYXNrX3llc25vIF9fQVJHUygoY2hhcl91ICpzdHIsIGludCBkaXJlY3QpKTsKK2ludCBnZXRfa2V5c3Ryb2tlIF9fQVJHUygodm9pZCkpOworaW50IGdldF9udW1iZXIgX19BUkdTKChpbnQgY29sb24pKTsKK3ZvaWQgbXNnbW9yZSBfX0FSR1MoKGxvbmcgbikpOwordm9pZCBiZWVwX2ZsdXNoIF9fQVJHUygodm9pZCkpOwordm9pZCB2aW1fYmVlcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgaW5pdF9ob21lZGlyIF9fQVJHUygodm9pZCkpOwordm9pZCBleHBhbmRfZW52IF9fQVJHUygoY2hhcl91ICpzcmMsIGNoYXJfdSAqZHN0LCBpbnQgZHN0bGVuKSk7Cit2b2lkIGV4cGFuZF9lbnZfZXNjIF9fQVJHUygoY2hhcl91ICpzcmMsIGNoYXJfdSAqZHN0LCBpbnQgZHN0bGVuLCBpbnQgZXNjKSk7CitjaGFyX3UgKnZpbV9nZXRlbnYgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCAqbXVzdGZyZWUpKTsKK2NoYXJfdSAqZXhwYW5kX2Vudl9zYXZlIF9fQVJHUygoY2hhcl91ICpzcmMpKTsKK3ZvaWQgdmltX3NldGVudiBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgY2hhcl91ICp2YWwpKTsKK2NoYXJfdSAqZ2V0X2Vudl9uYW1lIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBpbnQgaWR4KSk7Cit2b2lkIGhvbWVfcmVwbGFjZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqc3JjLCBjaGFyX3UgKmRzdCwgaW50IGRzdGxlbiwgaW50IG9uZSkpOworY2hhcl91ICpob21lX3JlcGxhY2Vfc2F2ZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqc3JjKSk7CitpbnQgZnVsbHBhdGhjbXAgX19BUkdTKChjaGFyX3UgKnMxLCBjaGFyX3UgKnMyLCBpbnQgY2hlY2tuYW1lKSk7CitjaGFyX3UgKmdldHRhaWwgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7CitjaGFyX3UgKmdldG5leHRjb21wIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworY2hhcl91ICpnZXRfcGFzdF9oZWFkIF9fQVJHUygoY2hhcl91ICpwYXRoKSk7CitpbnQgdmltX2lzcGF0aHNlcCBfX0FSR1MoKGludCBjKSk7CitpbnQgdmltX2lzcGF0aGxpc3RzZXAgX19BUkdTKChpbnQgYykpOworaW50IHZpbV9mbmFtZWNtcCBfX0FSR1MoKGNoYXJfdSAqeCwgY2hhcl91ICp5KSk7CitpbnQgdmltX2ZuYW1lbmNtcCBfX0FSR1MoKGNoYXJfdSAqeCwgY2hhcl91ICp5LCBzaXplX3QgbGVuKSk7CitjaGFyX3UgKmNvbmNhdF9mbmFtZXMgX19BUkdTKChjaGFyX3UgKmZuYW1lMSwgY2hhcl91ICpmbmFtZTIsIGludCBzZXApKTsKK3ZvaWQgYWRkX3BhdGhzZXAgX19BUkdTKChjaGFyX3UgKnApKTsKK2NoYXJfdSAqRnVsbE5hbWVfc2F2ZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGludCBmb3JjZSkpOworcG9zX1QgKmZpbmRfc3RhcnRfY29tbWVudCBfX0FSR1MoKGludCBpbmRfbWF4Y29tbWVudCkpOwordm9pZCBkb19jX2V4cHJfaW5kZW50IF9fQVJHUygodm9pZCkpOworaW50IGNpbl9pc2xhYmVsIF9fQVJHUygoaW50IGluZF9tYXhjb21tZW50KSk7CitpbnQgY2luX2lzY2FzZSBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IGNpbl9pc3Njb3BlZGVjbCBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IGdldF9jX2luZGVudCBfX0FSR1MoKHZvaWQpKTsKK2ludCBnZXRfZXhwcl9pbmRlbnQgX19BUkdTKCh2b2lkKSk7CitpbnQgZ2V0X2xpc3BfaW5kZW50IF9fQVJHUygodm9pZCkpOwordm9pZCBwcmVwYXJlX3RvX2V4aXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHByZXNlcnZlX2V4aXQgX19BUkdTKCh2b2lkKSk7CitpbnQgdmltX2ZleGlzdHMgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7Cit2b2lkIGxpbmVfYnJlYWtjaGVjayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZmFzdF9icmVha2NoZWNrIF9fQVJHUygodm9pZCkpOworaW50IGV4cGFuZF93aWxkY2FyZHMgX19BUkdTKChpbnQgbnVtX3BhdCwgY2hhcl91ICoqcGF0LCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSwgaW50IGZsYWdzKSk7CitpbnQgbWF0Y2hfc3VmZml4IF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworaW50IGdlbl9leHBhbmRfd2lsZGNhcmRzIF9fQVJHUygoaW50IG51bV9wYXQsIGNoYXJfdSAqKnBhdCwgaW50ICpudW1fZmlsZSwgY2hhcl91ICoqKmZpbGUsIGludCBmbGFncykpOwordm9pZCBhZGRmaWxlIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpmLCBpbnQgZmxhZ3MpKTsKK2NoYXJfdSAqZ2V0X2NtZF9vdXRwdXQgX19BUkdTKChjaGFyX3UgKmNtZCwgaW50IGZsYWdzKSk7Cit2b2lkIEZyZWVXaWxkIF9fQVJHUygoaW50IGNvdW50LCBjaGFyX3UgKipmaWxlcykpOworaW50IGdvdG9faW0gX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9taXNjMi5wcm8gYi9zcmMvcHJvdG8vbWlzYzIucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTJhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vbWlzYzIucHJvCkBAIC0wLDAgKzEsOTEgQEAKKy8qIG1pc2MyLmMgKi8KK2ludCB2aXJ0dWFsX2FjdGl2ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBnZXR2aXNjb2wgX19BUkdTKCh2b2lkKSk7CitpbnQgZ2V0dmlzY29sMiBfX0FSR1MoKGNvbG5yX1QgY29sLCBjb2xucl9UIGNvbGFkZCkpOworaW50IGNvbGFkdmFuY2VfZm9yY2UgX19BUkdTKChjb2xucl9UIHdjb2wpKTsKK2ludCBjb2xhZHZhbmNlIF9fQVJHUygoY29sbnJfVCB3Y29sKSk7CitpbnQgZ2V0dnBvcyBfX0FSR1MoKHBvc19UICpwb3MsIGNvbG5yX1Qgd2NvbCkpOworaW50IGluY19jdXJzb3IgX19BUkdTKCh2b2lkKSk7CitpbnQgaW5jIF9fQVJHUygocG9zX1QgKmxwKSk7CitpbnQgaW5jbCBfX0FSR1MoKHBvc19UICpscCkpOworaW50IGRlY19jdXJzb3IgX19BUkdTKCh2b2lkKSk7CitpbnQgZGVjIF9fQVJHUygocG9zX1QgKmxwKSk7CitpbnQgZGVjbCBfX0FSR1MoKHBvc19UICpscCkpOwordm9pZCBjaGVja19jdXJzb3JfbG51bSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2hlY2tfY3Vyc29yX2NvbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2hlY2tfY3Vyc29yIF9fQVJHUygodm9pZCkpOwordm9pZCBhZGp1c3RfY3Vyc29yX2NvbCBfX0FSR1MoKHZvaWQpKTsKK2ludCBsZWZ0Y29sX2NoYW5nZWQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHZpbV9tZW1fcHJvZmlsZV9kdW1wIF9fQVJHUygodm9pZCkpOworY2hhcl91ICphbGxvYyBfX0FSR1MoKHVuc2lnbmVkIHNpemUpKTsKK2NoYXJfdSAqYWxsb2NfY2xlYXIgX19BUkdTKCh1bnNpZ25lZCBzaXplKSk7CitjaGFyX3UgKmFsbG9jX2NoZWNrIF9fQVJHUygodW5zaWduZWQgc2l6ZSkpOworY2hhcl91ICpsYWxsb2NfY2xlYXIgX19BUkdTKChsb25nX3Ugc2l6ZSwgaW50IG1lc3NhZ2UpKTsKK2NoYXJfdSAqbGFsbG9jIF9fQVJHUygobG9uZ191IHNpemUsIGludCBtZXNzYWdlKSk7Cit2b2lkICptZW1fcmVhbGxvYyBfX0FSR1MoKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpKTsKK3ZvaWQgZG9fb3V0b2ZtZW1fbXNnIF9fQVJHUygobG9uZ191IHNpemUpKTsKK2NoYXJfdSAqdmltX3N0cnNhdmUgX19BUkdTKChjaGFyX3UgKnN0cmluZykpOworY2hhcl91ICp2aW1fc3RybnNhdmUgX19BUkdTKChjaGFyX3UgKnN0cmluZywgaW50IGxlbikpOworY2hhcl91ICp2aW1fc3Ryc2F2ZV9lc2NhcGVkIF9fQVJHUygoY2hhcl91ICpzdHJpbmcsIGNoYXJfdSAqZXNjX2NoYXJzKSk7CitjaGFyX3UgKnZpbV9zdHJzYXZlX2VzY2FwZWRfZXh0IF9fQVJHUygoY2hhcl91ICpzdHJpbmcsIGNoYXJfdSAqZXNjX2NoYXJzLCBpbnQgYnNsKSk7CitjaGFyX3UgKnZpbV9zdHJzYXZlX3VwIF9fQVJHUygoY2hhcl91ICpzdHJpbmcpKTsKK2NoYXJfdSAqdmltX3N0cm5zYXZlX3VwIF9fQVJHUygoY2hhcl91ICpzdHJpbmcsIGludCBsZW4pKTsKK3ZvaWQgdmltX3N0cnVwIF9fQVJHUygoY2hhcl91ICpwKSk7Cit2b2lkIGNvcHlfc3BhY2VzIF9fQVJHUygoY2hhcl91ICpwdHIsIHNpemVfdCBjb3VudCkpOwordm9pZCBjb3B5X2NoYXJzIF9fQVJHUygoY2hhcl91ICpwdHIsIHNpemVfdCBjb3VudCwgaW50IGMpKTsKK3ZvaWQgZGVsX3RyYWlsaW5nX3NwYWNlcyBfX0FSR1MoKGNoYXJfdSAqcHRyKSk7Cit2b2lkIHZpbV9zdHJuY3B5IF9fQVJHUygoY2hhcl91ICp0bywgY2hhcl91ICpmcm9tLCBpbnQgbGVuKSk7CitpbnQgY29weV9vcHRpb25fcGFydCBfX0FSR1MoKGNoYXJfdSAqKm9wdGlvbiwgY2hhcl91ICpidWYsIGludCBtYXhsZW4sIGNoYXIgKnNlcF9jaGFycykpOwordm9pZCB2aW1fZnJlZSBfX0FSR1MoKHZvaWQgKngpKTsKK2ludCB2aW1fc3RyaWNtcCBfX0FSR1MoKGNoYXIgKnMxLCBjaGFyICpzMikpOworaW50IHZpbV9zdHJuaWNtcCBfX0FSR1MoKGNoYXIgKnMxLCBjaGFyICpzMiwgc2l6ZV90IGxlbikpOworY2hhcl91ICp2aW1fc3RyY2hyIF9fQVJHUygoY2hhcl91ICpzdHJpbmcsIGludCBjKSk7CitjaGFyX3UgKnZpbV9zdHJyY2hyIF9fQVJHUygoY2hhcl91ICpzdHJpbmcsIGludCBjKSk7CitpbnQgdmltX2lzc3BhY2UgX19BUkdTKChpbnQgeCkpOwordm9pZCBnYV9jbGVhciBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgZ2FfY2xlYXJfc3RyaW5ncyBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgZ2FfaW5pdCBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgZ2FfaW5pdDIgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBpbnQgaXRlbXNpemUsIGludCBncm93c2l6ZSkpOworaW50IGdhX2dyb3cgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBpbnQgbikpOwordm9pZCBnYV9jb25jYXQgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnMpKTsKK3ZvaWQgZ2FfYXBwZW5kIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgaW50IGMpKTsKK2ludCBuYW1lX3RvX21vZF9tYXNrIF9fQVJHUygoaW50IGMpKTsKK2ludCBzaW1wbGlmeV9rZXkgX19BUkdTKChpbnQga2V5LCBpbnQgKm1vZGlmaWVycykpOworY2hhcl91ICpnZXRfc3BlY2lhbF9rZXlfbmFtZSBfX0FSR1MoKGludCBjLCBpbnQgbW9kaWZpZXJzKSk7CitpbnQgdHJhbnNfc3BlY2lhbCBfX0FSR1MoKGNoYXJfdSAqKnNyY3AsIGNoYXJfdSAqZHN0LCBpbnQga2V5Y29kZSkpOworaW50IGZpbmRfc3BlY2lhbF9rZXkgX19BUkdTKChjaGFyX3UgKipzcmNwLCBpbnQgKm1vZHAsIGludCBrZXljb2RlKSk7CitpbnQgZXh0cmFjdF9tb2RpZmllcnMgX19BUkdTKChpbnQga2V5LCBpbnQgKm1vZHApKTsKK2ludCBmaW5kX3NwZWNpYWxfa2V5X2luX3RhYmxlIF9fQVJHUygoaW50IGMpKTsKK2ludCBnZXRfc3BlY2lhbF9rZXlfY29kZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworY2hhcl91ICpnZXRfa2V5X25hbWUgX19BUkdTKChpbnQgaSkpOworaW50IGdldF9tb3VzZV9idXR0b24gX19BUkdTKChpbnQgY29kZSwgaW50ICppc19jbGljaywgaW50ICppc19kcmFnKSk7CitpbnQgZ2V0X3BzZXVkb19tb3VzZV9jb2RlIF9fQVJHUygoaW50IGJ1dHRvbiwgaW50IGlzX2NsaWNrLCBpbnQgaXNfZHJhZykpOworaW50IGdldF9maWxlZm9ybWF0IF9fQVJHUygoYnVmX1QgKmJ1ZikpOworaW50IGdldF9maWxlZm9ybWF0X2ZvcmNlIF9fQVJHUygoYnVmX1QgKmJ1ZiwgZXhhcmdfVCAqZWFwKSk7Cit2b2lkIHNldF9maWxlZm9ybWF0IF9fQVJHUygoaW50IHQsIGludCBvcHRfZmxhZ3MpKTsKK2ludCBkZWZhdWx0X2ZpbGVmb3JtYXQgX19BUkdTKCh2b2lkKSk7CitpbnQgY2FsbF9zaGVsbCBfX0FSR1MoKGNoYXJfdSAqY21kLCBpbnQgb3B0KSk7CitpbnQgZ2V0X3JlYWxfc3RhdGUgX19BUkdTKCh2b2lkKSk7CitpbnQgdmltX2NoZGlyZmlsZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK2ludCBpbGxlZ2FsX3NsYXNoIF9fQVJHUygoY2hhciAqbmFtZSkpOworY2hhcl91ICpwYXJzZV9zaGFwZV9vcHQgX19BUkdTKChpbnQgd2hhdCkpOworaW50IGdldF9zaGFwZV9pZHggX19BUkdTKChpbnQgbW91c2UpKTsKK3ZvaWQgdXBkYXRlX21vdXNlc2hhcGUgX19BUkdTKChpbnQgc2hhcGVfaWR4KSk7CitpbnQgZGVjcnlwdF9ieXRlIF9fQVJHUygodm9pZCkpOworaW50IHVwZGF0ZV9rZXlzIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgY3J5cHRfaW5pdF9rZXlzIF9fQVJHUygoY2hhcl91ICpwYXNzd2QpKTsKK2NoYXJfdSAqZ2V0X2NyeXB0X2tleSBfX0FSR1MoKGludCBzdG9yZSwgaW50IHR3aWNlKSk7Cit2b2lkICp2aW1fZmluZGZpbGVfaW5pdCBfX0FSR1MoKGNoYXJfdSAqcGF0aCwgY2hhcl91ICpmaWxlbmFtZSwgY2hhcl91ICpzdG9wZGlycywgaW50IGxldmVsLCBpbnQgZnJlZV92aXNpdGVkLCBpbnQgbmVlZF9kaXIsIHZvaWQgKnNlYXJjaF9jdHgsIGludCB0YWdmaWxlLCBjaGFyX3UgKnJlbF9mbmFtZSkpOworY2hhcl91ICp2aW1fZmluZGZpbGVfc3RvcGRpciBfX0FSR1MoKGNoYXJfdSAqYnVmKSk7Cit2b2lkIHZpbV9maW5kZmlsZV9jbGVhbnVwIF9fQVJHUygodm9pZCAqY3R4KSk7CitjaGFyX3UgKnZpbV9maW5kZmlsZSBfX0FSR1MoKHZvaWQgKnNlYXJjaF9jdHgpKTsKK3ZvaWQgdmltX2ZpbmRmaWxlX2ZyZWVfdmlzaXRlZCBfX0FSR1MoKHZvaWQgKnNlYXJjaF9jdHgpKTsKK2NoYXJfdSAqZmluZF9maWxlX2luX3BhdGggX19BUkdTKChjaGFyX3UgKnB0ciwgaW50IGxlbiwgaW50IG9wdGlvbnMsIGludCBmaXJzdCwgY2hhcl91ICpyZWxfZm5hbWUpKTsKK2NoYXJfdSAqZmluZF9kaXJlY3RvcnlfaW5fcGF0aCBfX0FSR1MoKGNoYXJfdSAqcHRyLCBpbnQgbGVuLCBpbnQgb3B0aW9ucywgY2hhcl91ICpyZWxfZm5hbWUpKTsKK2ludCB2aW1fY2hkaXIgX19BUkdTKChjaGFyX3UgKm5ld19kaXIpKTsKK2ludCBnZXRfdXNlcl9uYW1lIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4pKTsKK3ZvaWQgc29ydF9zdHJpbmdzIF9fQVJHUygoY2hhcl91ICoqZmlsZXMsIGludCBjb3VudCkpOworaW50IHBhdGhjbXAgX19BUkdTKChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpxKSk7CitjaGFyX3UgKnBhcnNlX2xpc3Rfb3B0aW9ucyBfX0FSR1MoKGNoYXJfdSAqb3B0aW9uX3N0ciwgb3B0aW9uX3RhYmxlX1QgKnRhYmxlLCBpbnQgdGFibGVfc2l6ZSkpOwordm9pZCBtc2dfc3RyIF9fQVJHUygoY2hhcl91ICpzLCBjaGFyX3UgKmFyZykpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vbW92ZS5wcm8gYi9zcmMvcHJvdG8vbW92ZS5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MWFhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9tb3ZlLnBybwpAQCAtMCwwICsxLDQwIEBACisvKiBtb3ZlLmMgKi8KK3ZvaWQgdXBkYXRlX3RvcGxpbmVfcmVkcmF3IF9fQVJHUygodm9pZCkpOwordm9pZCB1cGRhdGVfdG9wbGluZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgdXBkYXRlX2N1cnN3YW50IF9fQVJHUygodm9pZCkpOwordm9pZCBjaGVja19jdXJzb3JfbW92ZWQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgY2hhbmdlZF93aW5kb3dfc2V0dGluZyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2hhbmdlZF93aW5kb3dfc2V0dGluZ193aW4gX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgc2V0X3RvcGxpbmUgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxudW0pKTsKK3ZvaWQgY2hhbmdlZF9jbGluZV9iZWZfY3VycyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2hhbmdlZF9jbGluZV9iZWZfY3Vyc193aW4gX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgY2hhbmdlZF9saW5lX2Fidl9jdXJzIF9fQVJHUygodm9pZCkpOwordm9pZCBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnNfd2luIF9fQVJHUygod2luX1QgKndwKSk7Cit2b2lkIHZhbGlkYXRlX2JvdGxpbmUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGludmFsaWRhdGVfYm90bGluZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgaW52YWxpZGF0ZV9ib3RsaW5lX3dpbiBfX0FSR1MoKHdpbl9UICp3cCkpOwordm9pZCBhcHByb3hpbWF0ZV9ib3RsaW5lX3dpbiBfX0FSR1MoKHdpbl9UICp3cCkpOworaW50IGN1cnNvcl92YWxpZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgdmFsaWRhdGVfY3Vyc29yIF9fQVJHUygodm9pZCkpOwordm9pZCB2YWxpZGF0ZV9jbGluZV9yb3cgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHZhbGlkYXRlX3ZpcnRjb2wgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHZhbGlkYXRlX3ZpcnRjb2xfd2luIF9fQVJHUygod2luX1QgKndwKSk7Cit2b2lkIHZhbGlkYXRlX2N1cnNvcl9jb2wgX19BUkdTKCh2b2lkKSk7CitpbnQgd2luX2NvbF9vZmYgX19BUkdTKCh3aW5fVCAqd3ApKTsKK2ludCBjdXJ3aW5fY29sX29mZiBfX0FSR1MoKHZvaWQpKTsKK2ludCB3aW5fY29sX29mZjIgX19BUkdTKCh3aW5fVCAqd3ApKTsKK2ludCBjdXJ3aW5fY29sX29mZjIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGN1cnNfY29sdW1ucyBfX0FSR1MoKGludCBzY3JvbGwpKTsKK3ZvaWQgc2Nyb2xsZG93biBfX0FSR1MoKGxvbmcgbGluZV9jb3VudCwgaW50IGJ5Zm9sZCkpOwordm9pZCBzY3JvbGx1cCBfX0FSR1MoKGxvbmcgbGluZV9jb3VudCwgaW50IGJ5Zm9sZCkpOwordm9pZCBjaGVja190b3BmaWxsIF9fQVJHUygod2luX1QgKndwLCBpbnQgZG93bikpOwordm9pZCBzY3JvbGxkb3duX2NsYW1wIF9fQVJHUygodm9pZCkpOwordm9pZCBzY3JvbGx1cF9jbGFtcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2Nyb2xsX2N1cnNvcl90b3AgX19BUkdTKChpbnQgbWluX3Njcm9sbCwgaW50IGFsd2F5cykpOwordm9pZCBzZXRfZW1wdHlfcm93cyBfX0FSR1MoKHdpbl9UICp3cCwgaW50IHVzZWQpKTsKK3ZvaWQgc2Nyb2xsX2N1cnNvcl9ib3QgX19BUkdTKChpbnQgbWluX3Njcm9sbCwgaW50IHNldF90b3Bib3QpKTsKK3ZvaWQgc2Nyb2xsX2N1cnNvcl9oYWxmd2F5IF9fQVJHUygoaW50IGF0ZW5kKSk7Cit2b2lkIGN1cnNvcl9jb3JyZWN0IF9fQVJHUygodm9pZCkpOworaW50IG9uZXBhZ2UgX19BUkdTKChpbnQgZGlyLCBsb25nIGNvdW50KSk7Cit2b2lkIGhhbGZwYWdlIF9fQVJHUygoaW50IGZsYWcsIGxpbmVucl9UIFByZW51bSkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vbmV0YmVhbnMucHJvIGIvc3JjL3Byb3RvL25ldGJlYW5zLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNhZTczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL25ldGJlYW5zLnBybwpAQCAtMCwwICsxLDI0IEBACisvKiBuZXRiZWFucy5jICovCit2b2lkIG5ldGJlYW5zX1h0X2Nvbm5lY3QgX19BUkdTKCh2b2lkICpjb250ZXh0KSk7Cit2b2lkIG5ldGJlYW5zX2d0a19jb25uZWN0IF9fQVJHUygodm9pZCkpOwordm9pZCBuZXRiZWFuc193MzJfY29ubmVjdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWVzc2FnZUZyb21OZXRiZWFuc1czMiBfX0FSR1MoKHZvaWQpKTsKK2ludCBpc05ldGJlYW5zQnVmZmVyIF9fQVJHUygoYnVmX1QgKmJ1ZnApKTsKK2ludCBpc05ldGJlYW5zTW9kaWZpZWQgX19BUkdTKChidWZfVCAqYnVmcCkpOwordm9pZCBuZXRiZWFuc19lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG5ldGJlYW5zX3N0YXJ0dXBfZG9uZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbmV0YmVhbnNfZnJhbWVfbW92ZWQgX19BUkdTKChpbnQgbmV3X3gsIGludCBuZXdfeSkpOwordm9pZCBuZXRiZWFuc19maWxlX29wZW5lZCBfX0FSR1MoKGNoYXIgKmZpbGVuYW1lKSk7Cit2b2lkIG5ldGJlYW5zX2ZpbGVfY2xvc2VkIF9fQVJHUygoYnVmX1QgKmJ1ZnApKTsKK3ZvaWQgbmV0YmVhbnNfaW5zZXJ0ZWQgX19BUkdTKChidWZfVCAqYnVmcCwgbGluZW5yX1QgbGluZW5yLCBjb2xucl9UIGNvbCwgaW50IG9sZGxlbiwgY2hhcl91ICp0eHQsIGludCBuZXdsZW4pKTsKK3ZvaWQgbmV0YmVhbnNfcmVtb3ZlZCBfX0FSR1MoKGJ1Zl9UICpidWZwLCBsaW5lbnJfVCBsaW5lbnIsIGNvbG5yX1QgY29sLCBsb25nIGxlbikpOwordm9pZCBuZXRiZWFuc191bm1vZGlmaWVkIF9fQVJHUygoYnVmX1QgKmJ1ZnApKTsKK3ZvaWQgbmV0YmVhbnNfYnV0dG9uX3JlbGVhc2UgX19BUkdTKChpbnQgYnV0dG9uKSk7Cit2b2lkIG5ldGJlYW5zX2tleWNvbW1hbmQgX19BUkdTKChpbnQga2V5KSk7Cit2b2lkIG5ldGJlYW5zX3NhdmVfYnVmZmVyIF9fQVJHUygoYnVmX1QgKmJ1ZnApKTsKK3ZvaWQgbmV0YmVhbnNfZGVsZXRlZF9hbGxfbGluZXMgX19BUkdTKChidWZfVCAqYnVmcCkpOworaW50IG5ldGJlYW5zX2lzX2d1YXJkZWQgX19BUkdTKChsaW5lbnJfVCB0b3AsIGxpbmVucl9UIGJvdCkpOwordm9pZCBuZXRiZWFuc19kcmF3X211bHRpc2lnbl9pbmRpY2F0b3IgX19BUkdTKChpbnQgcm93KSk7Cit2b2lkIG5ldGJlYW5zX2RyYXdfbXVsdGlzaWduX2luZGljYXRvciBfX0FSR1MoKGludCByb3cpKTsKK3ZvaWQgbmV0YmVhbnNfZ3V0dGVyX2NsaWNrIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vbm9ybWFsLnBybyBiL3NyYy9wcm90by9ub3JtYWwucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTMzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vbm9ybWFsLnBybwpAQCAtMCwwICsxLDIzIEBACisvKiBub3JtYWwuYyAqLwordm9pZCBpbml0X25vcm1hbF9jbWRzIF9fQVJHUygodm9pZCkpOwordm9pZCBub3JtYWxfY21kIF9fQVJHUygob3BhcmdfVCAqb2FwLCBpbnQgdG9wbGV2ZWwpKTsKK3ZvaWQgZG9fcGVuZGluZ19vcGVyYXRvciBfX0FSR1MoKGNtZGFyZ19UICpjYXAsIGludCBvbGRfY29sLCBpbnQgZ3VpX3lhbmspKTsKK2ludCBkb19tb3VzZSBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50IGMsIGludCBkaXIsIGxvbmcgY291bnQsIGludCBmaXhpbmRlbnQpKTsKK3ZvaWQgY2hlY2tfdmlzdWFsX2hpZ2hsaWdodCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZW5kX3Zpc3VhbF9tb2RlIF9fQVJHUygodm9pZCkpOwordm9pZCByZXNldF9WSXN1YWxfYW5kX3Jlc2VsIF9fQVJHUygodm9pZCkpOwordm9pZCByZXNldF9WSXN1YWwgX19BUkdTKCh2b2lkKSk7CitpbnQgZmluZF9pZGVudF91bmRlcl9jdXJzb3IgX19BUkdTKChjaGFyX3UgKipzdHJpbmcsIGludCBmaW5kX3R5cGUpKTsKK2ludCBmaW5kX2lkZW50X2F0X3BvcyBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSwgY29sbnJfVCBzdGFydGNvbCwgY2hhcl91ICoqc3RyaW5nLCBpbnQgZmluZF90eXBlKSk7Cit2b2lkIGNsZWFyX3Nob3djbWQgX19BUkdTKCh2b2lkKSk7CitpbnQgYWRkX3RvX3Nob3djbWQgX19BUkdTKChpbnQgYykpOwordm9pZCBhZGRfdG9fc2hvd2NtZF9jIF9fQVJHUygoaW50IGMpKTsKK3ZvaWQgcHVzaF9zaG93Y21kIF9fQVJHUygodm9pZCkpOwordm9pZCBwb3Bfc2hvd2NtZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZG9fY2hlY2tfc2Nyb2xsYmluZCBfX0FSR1MoKGludCBjaGVjaykpOwordm9pZCBjaGVja19zY3JvbGxiaW5kIF9fQVJHUygobGluZW5yX1QgdG9wbGluZV9kaWZmLCBsb25nIGxlZnRjb2xfZGlmZikpOwordm9pZCBzY3JvbGxfcmVkcmF3IF9fQVJHUygoaW50IHVwLCBsb25nIGNvdW50KSk7Cit2b2lkIGRvX252X2lkZW50IF9fQVJHUygoaW50IGMxLCBpbnQgYzIpKTsKK3ZvaWQgc3RhcnRfc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBtYXlfc3RhcnRfc2VsZWN0IF9fQVJHUygoaW50IGMpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL29wcy5wcm8gYi9zcmMvcHJvdG8vb3BzLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQyNjczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29wcy5wcm8KQEAgLTAsMCArMSw1MyBAQAorLyogb3BzLmMgKi8KK2ludCBnZXRfb3BfdHlwZSBfX0FSR1MoKGludCBjaGFyMSwgaW50IGNoYXIyKSk7CitpbnQgb3Bfb25fbGluZXMgX19BUkdTKChpbnQgb3ApKTsKK2ludCBnZXRfb3BfY2hhciBfX0FSR1MoKGludCBvcHR5cGUpKTsKK2ludCBnZXRfZXh0cmFfb3BfY2hhciBfX0FSR1MoKGludCBvcHR5cGUpKTsKK3ZvaWQgb3Bfc2hpZnQgX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBjdXJzX3RvcCwgaW50IGFtb3VudCkpOwordm9pZCBzaGlmdF9saW5lIF9fQVJHUygoaW50IGxlZnQsIGludCByb3VuZCwgaW50IGFtb3VudCkpOwordm9pZCBvcF9yZWluZGVudCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50ICgqaG93KSh2b2lkKSkpOworaW50IGdldF9leHByX3JlZ2lzdGVyIF9fQVJHUygodm9pZCkpOwordm9pZCBzZXRfZXhwcl9saW5lIF9fQVJHUygoY2hhcl91ICpuZXdfbGluZSkpOworY2hhcl91ICpnZXRfZXhwcl9saW5lIF9fQVJHUygodm9pZCkpOworaW50IHZhbGlkX3lhbmtfcmVnIF9fQVJHUygoaW50IHJlZ25hbWUsIGludCB3cml0aW5nKSk7Cit2b2lkICpnZXRfcmVnaXN0ZXIgX19BUkdTKChpbnQgbmFtZSwgaW50IGNvcHkpKTsKK3ZvaWQgcHV0X3JlZ2lzdGVyIF9fQVJHUygoaW50IG5hbWUsIHZvaWQgKnJlZykpOworaW50IHlhbmtfcmVnaXN0ZXJfbWxpbmUgX19BUkdTKChpbnQgcmVnbmFtZSkpOworaW50IGRvX3JlY29yZCBfX0FSR1MoKGludCBjKSk7CitpbnQgZG9fZXhlY3JlZyBfX0FSR1MoKGludCByZWduYW1lLCBpbnQgY29sb24sIGludCBhZGRjcikpOworaW50IGluc2VydF9yZWcgX19BUkdTKChpbnQgcmVnbmFtZSwgaW50IGxpdGVyYWxseSkpOworaW50IGNtZGxpbmVfcGFzdGUgX19BUkdTKChpbnQgcmVnbmFtZSwgaW50IGxpdGVyYWxseSkpOwordm9pZCBhZGp1c3RfY2xpcF9yZWcgX19BUkdTKChpbnQgKnJwKSk7CitpbnQgb3BfZGVsZXRlIF9fQVJHUygob3BhcmdfVCAqb2FwKSk7CitpbnQgb3BfcmVwbGFjZSBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50IGMpKTsKK3ZvaWQgb3BfdGlsZGUgX19BUkdTKChvcGFyZ19UICpvYXApKTsKK2ludCBzd2FwY2hhciBfX0FSR1MoKGludCBvcF90eXBlLCBwb3NfVCAqcG9zKSk7Cit2b2lkIG9wX2luc2VydCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgbG9uZyBjb3VudDEpKTsKK2ludCBvcF9jaGFuZ2UgX19BUkdTKChvcGFyZ19UICpvYXApKTsKK3ZvaWQgaW5pdF95YW5rIF9fQVJHUygodm9pZCkpOworaW50IG9wX3lhbmsgX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBkZWxldGluZywgaW50IG1lc3MpKTsKK3ZvaWQgZG9fcHV0IF9fQVJHUygoaW50IHJlZ25hbWUsIGludCBkaXIsIGxvbmcgY291bnQsIGludCBmbGFncykpOworaW50IHByZXByb2NzX2xlZnQgX19BUkdTKCh2b2lkKSk7CitpbnQgZ2V0X3JlZ2lzdGVyX25hbWUgX19BUkdTKChpbnQgbnVtKSk7Cit2b2lkIGV4X2Rpc3BsYXkgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZG9fZG9fam9pbiBfX0FSR1MoKGxvbmcgY291bnQsIGludCBpbnNlcnRfc3BhY2UpKTsKK2ludCBkb19qb2luIF9fQVJHUygoaW50IGluc2VydF9zcGFjZSkpOwordm9pZCBvcF9mb3JtYXQgX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBrZWVwX2N1cnNvcikpOwordm9pZCBmb3JtYXRfbGluZXMgX19BUkdTKChsaW5lbnJfVCBsaW5lX2NvdW50KSk7CitpbnQgcGFyYWdyYXBoX3N0YXJ0IF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IGRvX2FkZHN1YiBfX0FSR1MoKGludCBjb21tYW5kLCBsaW5lbnJfVCBQcmVudW0xKSk7CitpbnQgcmVhZF92aW1pbmZvX3JlZ2lzdGVyIF9fQVJHUygodmlyX1QgKnZpcnAsIGludCBmb3JjZSkpOwordm9pZCB3cml0ZV92aW1pbmZvX3JlZ2lzdGVycyBfX0FSR1MoKEZJTEUgKmZwKSk7Cit2b2lkIHgxMV9leHBvcnRfZmluYWxfc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBjbGlwX2ZyZWVfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9nZXRfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF95YW5rX3NlbGVjdGlvbiBfX0FSR1MoKGludCB0eXBlLCBjaGFyX3UgKnN0ciwgbG9uZyBsZW4sIFZpbUNsaXBib2FyZCAqY2JkKSk7CitpbnQgY2xpcF9jb252ZXJ0X3NlbGVjdGlvbiBfX0FSR1MoKGNoYXJfdSAqKnN0ciwgbG9uZ191ICpsZW4sIFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGRuZF95YW5rX2RyYWdfZGF0YSBfX0FSR1MoKGNoYXJfdSAqc3RyLCBsb25nIGxlbikpOworY2hhcl91IGdldF9yZWdfdHlwZSBfX0FSR1MoKGludCByZWduYW1lLCBsb25nICpyZWdsZW4pKTsKK2NoYXJfdSAqZ2V0X3JlZ19jb250ZW50cyBfX0FSR1MoKGludCByZWduYW1lLCBpbnQgYWxsb3dleHByKSk7Cit2b2lkIHdyaXRlX3JlZ19jb250ZW50cyBfX0FSR1MoKGludCBuYW1lLCBjaGFyX3UgKnN0ciwgaW50IG1heGxlbiwgaW50IG11c3RfYXBwZW5kKSk7Cit2b2lkIHdyaXRlX3JlZ19jb250ZW50c19leCBfX0FSR1MoKGludCBuYW1lLCBjaGFyX3UgKnN0ciwgaW50IG1heGxlbiwgaW50IG11c3RfYXBwZW5kLCBpbnQgeWFua190eXBlLCBsb25nIGJsb2NrX2xlbikpOwordm9pZCBjbGVhcl9vcGFyZyBfX0FSR1MoKG9wYXJnX1QgKm9hcCkpOwordm9pZCBjdXJzb3JfcG9zX2luZm8gX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vcHRpb24ucHJvIGIvc3JjL3Byb3RvL29wdGlvbi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNTY3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9vcHRpb24ucHJvCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG9wdGlvbi5jICovCit2b2lkIHNldF9pbml0XzEgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF9zdHJpbmdfZGVmYXVsdCBfX0FSR1MoKGNoYXIgKm5hbWUsIGNoYXJfdSAqdmFsKSk7Cit2b2lkIHNldF9udW1iZXJfZGVmYXVsdCBfX0FSR1MoKGNoYXIgKm5hbWUsIGxvbmcgdmFsKSk7Cit2b2lkIHNldF9pbml0XzIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF9pbml0XzMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF9oZWxwbGFuZ19kZWZhdWx0IF9fQVJHUygoY2hhcl91ICpsYW5nKSk7Cit2b2lkIGluaXRfZ3VpX29wdGlvbnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF90aXRsZV9kZWZhdWx0cyBfX0FSR1MoKHZvaWQpKTsKK2ludCBkb19zZXQgX19BUkdTKChjaGFyX3UgKmFyZywgaW50IG9wdF9mbGFncykpOwordm9pZCBzZXRfb3B0aW9uc19iaW4gX19BUkdTKChpbnQgb2xkdmFsLCBpbnQgbmV3dmFsLCBpbnQgb3B0X2ZsYWdzKSk7CitpbnQgZ2V0X3ZpbWluZm9fcGFyYW1ldGVyIF9fQVJHUygoaW50IHR5cGUpKTsKK2NoYXJfdSAqZmluZF92aW1pbmZvX3BhcmFtZXRlciBfX0FSR1MoKGludCB0eXBlKSk7Cit2b2lkIGNoZWNrX29wdGlvbnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGNoZWNrX2J1Zl9vcHRpb25zIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBmcmVlX3N0cmluZ19vcHRpb24gX19BUkdTKChjaGFyX3UgKnApKTsKK3ZvaWQgY2xlYXJfc3RyaW5nX29wdGlvbiBfX0FSR1MoKGNoYXJfdSAqKnBwKSk7Cit2b2lkIHNldF90ZXJtX29wdGlvbl9hbGxvY2VkIF9fQVJHUygoY2hhcl91ICoqcCkpOwordm9pZCBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBvcHRfaWR4LCBjaGFyX3UgKnZhbCwgaW50IG9wdF9mbGFncykpOworY2hhcl91ICpjaGVja19zdGxfb3B0aW9uIF9fQVJHUygoY2hhcl91ICpzKSk7CitpbnQgZ2V0X29wdGlvbl92YWx1ZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgbG9uZyAqbnVtdmFsLCBjaGFyX3UgKipzdHJpbmd2YWwsIGludCBvcHRfZmxhZ3MpKTsKK3ZvaWQgc2V0X29wdGlvbl92YWx1ZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgbG9uZyBudW1iZXIsIGNoYXJfdSAqc3RyaW5nLCBpbnQgb3B0X2ZsYWdzKSk7CitjaGFyX3UgKmdldF90ZXJtX2NvZGUgX19BUkdTKChjaGFyX3UgKnRuYW1lKSk7CitjaGFyX3UgKmdldF9oaWdobGlnaHRfZGVmYXVsdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtYWtlc2V0IF9fQVJHUygoRklMRSAqZmQsIGludCBvcHRfZmxhZ3MsIGludCBsb2NhbF9vbmx5KSk7CitpbnQgbWFrZWZvbGRzZXQgX19BUkdTKChGSUxFICpmZCkpOwordm9pZCBjbGVhcl90ZXJtb3B0aW9ucyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X3Rlcm1fZGVmYXVsdHMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGNvbXBfY29sIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfZXF1YWxwcmcgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdpbl9jb3B5X29wdGlvbnMgX19BUkdTKCh3aW5fVCAqd3BfZnJvbSwgd2luX1QgKndwX3RvKSk7Cit2b2lkIGNvcHlfd2lub3B0IF9fQVJHUygod2lub3B0X1QgKmZyb20sIHdpbm9wdF9UICp0bykpOwordm9pZCBjaGVja193aW5fb3B0aW9ucyBfX0FSR1MoKHdpbl9UICp3aW4pKTsKK3ZvaWQgY2hlY2tfd2lub3B0IF9fQVJHUygod2lub3B0X1QgKndvcCkpOwordm9pZCBjbGVhcl93aW5vcHQgX19BUkdTKCh3aW5vcHRfVCAqd29wKSk7Cit2b2lkIGJ1Zl9jb3B5X29wdGlvbnMgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgZmxhZ3MpKTsKK3ZvaWQgcmVzZXRfbW9kaWZpYWJsZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X2ltaW5zZXJ0X2dsb2JhbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X2ltc2VhcmNoX2dsb2JhbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X2NvbnRleHRfaW5fc2V0X2NtZCBfX0FSR1MoKGV4cGFuZF9UICp4cCwgY2hhcl91ICphcmcsIGludCBvcHRfZmxhZ3MpKTsKK2ludCBFeHBhbmRTZXR0aW5ncyBfX0FSR1MoKGV4cGFuZF9UICp4cCwgcmVnbWF0Y2hfVCAqcmVnbWF0Y2gsIGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlKSk7CitpbnQgRXhwYW5kT2xkU2V0dGluZyBfX0FSR1MoKGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlKSk7CitpbnQgaGFzX2Zvcm1hdF9vcHRpb24gX19BUkdTKChpbnQgeCkpOworaW50IHNob3J0bWVzcyBfX0FSR1MoKGludCB4KSk7Cit2b2lkIHZpbXJjX2ZvdW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBjaGFuZ2VfY29tcGF0aWJsZSBfX0FSR1MoKGludCBvbikpOworaW50IG9wdGlvbl93YXNfc2V0IF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgY2FuX2JzIF9fQVJHUygoaW50IHdoYXQpKTsKK3ZvaWQgc2F2ZV9maWxlX2ZmIF9fQVJHUygoYnVmX1QgKmJ1ZikpOworaW50IGZpbGVfZmZfZGlmZmVycyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2ludCBjaGVja19mZl92YWx1ZSBfX0FSR1MoKGNoYXJfdSAqcCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vb3NfYW1pZ2EucHJvIGIvc3JjL3Byb3RvL29zX2FtaWdhLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdlMjExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX2FtaWdhLnBybwpAQCAtMCwwICsxLDQ2IEBACisvKiBvc19hbWlnYS5jICovCit2b2lkIHdpbl9yZXNpemVfb24gX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdpbl9yZXNpemVfb2ZmIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfd3JpdGUgX19BUkdTKChjaGFyX3UgKnAsIGludCBsZW4pKTsKK2ludCBtY2hfaW5jaGFyIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBtYXhsZW4sIGxvbmcgdGltZSwgaW50IHRiX2NoYW5nZV9jbnQpKTsKK2ludCBtY2hfY2hhcl9hdmFpbCBfX0FSR1MoKHZvaWQpKTsKK2xvbmdfdSBtY2hfYXZhaWxfbWVtIF9fQVJHUygoaW50IHNwZWNpYWwpKTsKK3ZvaWQgbWNoX2RlbGF5IF9fQVJHUygobG9uZyBtc2VjLCBpbnQgaWdub3JlaW5wdXQpKTsKK3ZvaWQgbWNoX3N1c3BlbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9pbml0IF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jaGVja193aW4gX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCBtY2hfaW5wdXRfaXNhdHR5IF9fQVJHUygodm9pZCkpOwordm9pZCBmbmFtZV9jYXNlIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgbGVuKSk7Cit2b2lkIG1jaF9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqaWNvbikpOwordm9pZCBtY2hfcmVzdG9yZV90aXRsZSBfX0FSR1MoKGludCB3aGljaCkpOworaW50IG1jaF9jYW5fcmVzdG9yZV90aXRsZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FuX3Jlc3RvcmVfaWNvbiBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfZ2V0X3VzZXJfbmFtZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOwordm9pZCBtY2hfZ2V0X2hvc3RfbmFtZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOworbG9uZyBtY2hfZ2V0X3BpZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfZGlybmFtZSBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgbGVuKSk7CitpbnQgbWNoX0Z1bGxOYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpidWYsIGludCBsZW4sIGludCBmb3JjZSkpOworaW50IG1jaF9pc0Z1bGxOYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworbG9uZyBtY2hfZ2V0cGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9zZXRwZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lLCBsb25nIHBlcm0pKTsKK3ZvaWQgbWNoX2hpZGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfaXNkaXIgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgbWNoX21rZGlyIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2Nhbl9leGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfbm9kZXR5cGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgbWNoX2Vhcmx5X2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9leGl0IF9fQVJHUygoaW50IHIpKTsKK3ZvaWQgbWNoX3NldHRtb2RlIF9fQVJHUygoaW50IHRtb2RlKSk7CitpbnQgbWNoX3NjcmVlbm1vZGUgX19BUkdTKChjaGFyX3UgKmFyZykpOworaW50IG1jaF9nZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX25ld19zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2NhbGxfc2hlbGwgX19BUkdTKChjaGFyX3UgKmNtZCwgaW50IG9wdGlvbnMpKTsKK3ZvaWQgbWNoX2JyZWFrY2hlY2sgX19BUkdTKCh2b2lkKSk7Citsb25nIENoa19BYm9ydCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfZXhwYW5kcGF0aCBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGNoYXJfdSAqcGF0LCBpbnQgZmxhZ3MpKTsKK2ludCBtY2hfaGFzX2V4cF93aWxkY2FyZCBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IG1jaF9oYXNfd2lsZGNhcmQgX19BUkdTKChjaGFyX3UgKnApKTsKK2NoYXJfdSAqbWNoX2dldGVudiBfX0FSR1MoKGNoYXJfdSAqdmFyKSk7CitpbnQgbWNoX3NldGVudiBfX0FSR1MoKGNoYXIgKnZhciwgY2hhciAqdmFsdWUsIGludCB4KSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vc19iZW9zLnBybyBiL3NyYy9wcm90by9vc19iZW9zLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM3MTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX2Jlb3MucHJvCkBAIC0wLDAgKzEsNCBAQAorLyogb3NfYmVvcy5jICovCit2b2lkIGJlb3NfY2xlYW51cF9yZWFkX3RocmVhZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBiZW9zX3NlbGVjdCBfX0FSR1MoKGludCBuYml0cywgc3RydWN0IGZkX3NldCAqcmJpdHMsIHN0cnVjdCBmZF9zZXQgKndiaXRzLCBzdHJ1Y3QgZmRfc2V0ICplYml0cywgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL29zX21hYy5wcm8gYi9zcmMvcHJvdG8vb3NfbWFjLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ0N2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX21hYy5wcm8KQEAgLTAsMCArMSw2NCBAQAorLyogb3NfbWFjLmMgKi8KK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7CisKK3ZvaWQgbWNoX3dpbmRleGl0IF9fQVJHUygoaW50IHIpKTsKK2ludCBtY2hfY2hlY2tfd2luIF9fQVJHUygoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgbWNoX2lucHV0X2lzYXR0eSBfX0FSR1MoKHZvaWQpKTsKKwordm9pZCBmbmFtZV9jYXNlIF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgbGVuKSk7Cit2b2lkIG1jaF9lYXJseV9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfZXhpdCBfX0FSR1MoKGludCByKSk7Cit2b2lkIG1jaF9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqaWNvbikpOwordm9pZCBtY2hfcmVzdG9yZV90aXRsZSBfX0FSR1MoKGludCB3aGljaCkpOworCitpbnQgbWNoX2dldF91c2VyX25hbWUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK3ZvaWQgbWNoX2dldF9ob3N0X25hbWUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK2xvbmcgbWNoX2dldF9waWQgX19BUkdTKCh2b2lkKSk7CisKK2ludCBtY2hfZGlybmFtZSBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgbGVuKSk7CitpbnQgbWNoX0Z1bGxOYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpidWYsIGludCBsZW4sIGludCBmb3JjZSkpOworaW50IG1jaF9pc0Z1bGxOYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwordm9pZCBzbGFzaF9hZGp1c3QgX19BUkdTKChjaGFyX3UgKnApKTsKK2xvbmcgbWNoX2dldHBlcm0gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfc2V0cGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgbG9uZyBwZXJtKSk7Cit2b2lkIG1jaF9oaWRlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2lzZGlyIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2Nhbl9leGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfbm9kZXR5cGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgbWNoX2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zZXR0bW9kZSBfX0FSR1MoKGludCByYXcpKTsKKworaW50IG1jaF9jaGRpciBfX0FSR1MoKGNoYXIgKnBfbmFtZSkpOworI2lmIGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pCitpbnQgc3RhdCBfX0FSR1MoKGNoYXIgKnAsIHN0cnVjdCBzdGF0ICpwX3N0KSk7CisjZW5kaWYKKworaW50IG1jaF9jYWxsX3NoZWxsIF9fQVJHUygoY2hhcl91ICpjbWQsIGludCBvcHRpb25zKSk7CitpbnQgbWNoX2hhc193aWxkY2FyZCBfX0FSR1MoKGNoYXJfdSAqcykpOworaW50IG1jaF9leHBhbmRwYXRoIF9fQVJHUygoc3RydWN0IGdyb3dhcnJheSAqZ2FwLCBjaGFyX3UgKnBhdGgsIGludCBmbGFncykpOworaW50IG1hY19leHBhbmRwYXRoIF9fQVJHUygoc3RydWN0IGdyb3dhcnJheSAqZ2FwLCBjaGFyX3UgKnBhdGgsIGludCBmbGFncywgc2hvcnQgc3RhcnRfYXQsIHNob3J0IGFzX2Z1bGwpKTsKKy8qaW50IHZpbV9jaGRpciBfX0FSR1MoKGNoYXIgKnBhdGgpKTsqLwordm9pZCBtY2hfZGVsYXkgX19BUkdTKChsb25nIG1zZWMsIGludCBpZ25vcmVpbnB1dCkpOwordm9pZCBtY2hfYnJlYWtjaGVjayBfX0FSR1MoKHZvaWQpKTsKK2xvbmdfdSBtY2hfYXZhaWxfbWVtIF9fQVJHUygoaW50IHNwZWNpYWwpKTsKK2ludCBtY2hfc2NyZWVubW9kZSBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CitpbnQgbWNoX2hhc19leHBfd2lsZGNhcmQgX19BUkdTKChjaGFyX3UgKnApKTsKKwordm9pZCBzbGFzaF9uX2NvbG9uX2FkanVzdCBfX0FSR1MoKGNoYXJfdSAqYnVmKSk7CitpbnQgbWNoX2NvcHlfZmlsZShjaGFyX3UgKmZyb20sIGNoYXJfdSAqdG8pOworCitpbnQgbWNoX2hhc19yZXNvdXJjZV9mb3JrIChjaGFyX3UgKmZpbGUpOworaW50IG1jaF9jb3B5X2ZpbGVfYXR0cmlidXRlKGNoYXJfdSAqZnJvbSwgY2hhcl91ICp0byk7CisKK3ZvaWQgbWNoX3NoZWxsaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfZ2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldF9zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9uZXdfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfc3VzcGVuZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FuX3Jlc3RvcmVfdGl0bGUgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2Nhbl9yZXN0b3JlX2ljb24gX19BUkdTKCh2b2lkKSk7CisKK3ZvaWQgc2xhc2hfdG9fY29sb24gX19BUkdTKChjaGFyX3UgKnApKTsKK2NoYXJfdSAqc2xhc2hfdG9fY29sb25fc2F2ZSBfX0FSR1MoKGNoYXJfdSAqcCkpOworCisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vc19tc2Rvcy5wcm8gYi9zcmMvcHJvdG8vb3NfbXNkb3MucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NjdmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vb3NfbXNkb3MucHJvCkBAIC0wLDAgKzEsNDggQEAKKy8qIG9zX21zZG9zLmMgKi8KK3ZvaWQgbWNoX3NldF9ub3JtYWxfY29sb3JzIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfdXBkYXRlX2N1cnNvciBfX0FSR1MoKHZvaWQpKTsKK2xvbmdfdSBtY2hfYXZhaWxfbWVtIF9fQVJHUygoaW50IHNwZWNpYWwpKTsKK3ZvaWQgbWNoX2RlbGF5IF9fQVJHUygobG9uZyBtc2VjLCBpbnQgaWdub3JlaW5wdXQpKTsKK3ZvaWQgbWNoX3dyaXRlIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuKSk7CitpbnQgbWNoX2luY2hhciBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgbWF4bGVuLCBsb25nIHRpbWUsIGludCB0Yl9jaGFuZ2VfY250KSk7CitpbnQgbWNoX2NoYXJfYXZhaWwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zdXNwZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2hlY2tfd2luIF9fQVJHUygoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgbWNoX2lucHV0X2lzYXR0eSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgZm5hbWVfY2FzZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGxlbikpOworbG9uZyBtY2hfZ2V0X3BpZCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbiwgaW50IGZvcmNlKSk7Cit2b2lkIHNsYXNoX2FkanVzdCBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IG1jaF9pc0Z1bGxOYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwordm9pZCBtY2hfZWFybHlfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX2V4aXQgX19BUkdTKChpbnQgcikpOwordm9pZCBtY2hfc2V0dG1vZGUgX19BUkdTKChpbnQgdG1vZGUpKTsKK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7CitpbnQgbWNoX3NjcmVlbm1vZGUgX19BUkdTKChjaGFyX3UgKmFyZykpOworaW50IG1jaF9nZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX25ld19zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9jaGVja19jb2x1bW5zIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jYWxsX3NoZWxsIF9fQVJHUygoY2hhcl91ICpjbWQsIGludCBvcHRpb25zKSk7Cit2b2lkIG1jaF9icmVha2NoZWNrIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9oYXNfZXhwX3dpbGRjYXJkIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgbWNoX2hhc193aWxkY2FyZCBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IG1jaF9jaGRpciBfX0FSR1MoKGNoYXIgKnBhdGgpKTsKK2NoYXIgKmRqZ3BwX3NldGxvY2FsZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfbWNoX3NldF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOworbG9uZyBtY2hfZ2V0cGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9zZXRwZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lLCBsb25nIHBlcm0pKTsKK3ZvaWQgbWNoX2hpZGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfaXNkaXIgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfY2FuX2V4ZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9ub2RldHlwZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9kaXJuYW1lIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4pKTsKK2ludCBtY2hfcmVtb3ZlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitjaGFyX3UgKm1jaF9nZXRlbnYgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfZ2V0X3VzZXJfbmFtZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOwordm9pZCBtY2hfZ2V0X2hvc3RfbmFtZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vb3NfbXN3aW4ucHJvIGIvc3JjL3Byb3RvL29zX21zd2luLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYxMmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX21zd2luLnBybwpAQCAtMCwwICsxLDYwIEBACisvKiBvc19tc3dpbi5jICovCit2b2lkIG1jaF9leGl0IF9fQVJHUygoaW50IHIpKTsKK3ZvaWQgbWNoX2Vhcmx5X2luaXQgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2lucHV0X2lzYXR0eSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldHRpdGxlIF9fQVJHUygoY2hhcl91ICp0aXRsZSwgY2hhcl91ICppY29uKSk7Cit2b2lkIG1jaF9yZXN0b3JlX3RpdGxlIF9fQVJHUygoaW50IHdoaWNoKSk7CitpbnQgbWNoX2Nhbl9yZXN0b3JlX3RpdGxlIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jYW5fcmVzdG9yZV9pY29uIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9GdWxsTmFtZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqYnVmLCBpbnQgbGVuLCBpbnQgZm9yY2UpKTsKK2ludCBtY2hfaXNGdWxsTmFtZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgc2xhc2hfYWRqdXN0IF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgdmltX3N0YXQgX19BUkdTKChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RwKSk7Cit2b2lkIG1jaF9zZXR0bW9kZSBfX0FSR1MoKGludCB0bW9kZSkpOworaW50IG1jaF9nZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX25ld19zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zdXNwZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBkaXNwbGF5X2Vycm9ycyBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfaGFzX2V4cF93aWxkY2FyZCBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IG1jaF9oYXNfd2lsZGNhcmQgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCBtY2hfY2hkaXIgX19BUkdTKChjaGFyICpwYXRoKSk7CitpbnQgY2FuX2VuZF90ZXJtY2FwX21vZGUgX19BUkdTKChpbnQgZ2l2ZV9tc2cpKTsKK2ludCBtY2hfc2NyZWVubW9kZSBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CitpbnQgbWNoX2xpYmNhbGwgX19BUkdTKChjaGFyX3UgKmxpYm5hbWUsIGNoYXJfdSAqZnVuY25hbWUsIGNoYXJfdSAqYXJnc3RyaW5nLCBpbnQgYXJnaW50LCBjaGFyX3UgKipzdHJpbmdfcmVzdWx0LCBpbnQgKm51bWJlcl9yZXN1bHQpKTsKK2ludCB1dGY4X3RvX3VjczIgX19BUkdTKChjaGFyX3UgKmluc3RyLCBpbnQgaW5sZW4sIHNob3J0X3UgKm91dHN0ciwgaW50ICp1bmNvbnZsZW5wKSk7CitpbnQgdWNzMl90b191dGY4IF9fQVJHUygoc2hvcnRfdSAqaW5zdHIsIGludCBpbmxlbiwgY2hhcl91ICpvdXRzdHIpKTsKK3ZvaWQgTXVsdGlCeXRlVG9XaWRlQ2hhcl9hbGxvYyBfX0FSR1MoKFVJTlQgY3AsIERXT1JEIGZsYWdzLCBMUENTVFIgaW4sIGludCBpbmxlbiwgTFBXU1RSICpvdXQsIGludCAqb3V0bGVuKSk7Cit2b2lkIFdpZGVDaGFyVG9NdWx0aUJ5dGVfYWxsb2MgX19BUkdTKChVSU5UIGNwLCBEV09SRCBmbGFncywgTFBDV1NUUiBpbiwgaW50IGlubGVuLCBMUFNUUiAqb3V0LCBpbnQgKm91dGxlbiwgTFBDU1RSIGRlZiwgTFBCT09MIHVzZWRkZWYpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOworc2hvcnRfdSAqZW5jX3RvX3VjczIgX19BUkdTKChjaGFyX3UgKnN0ciwgaW50ICpsZW5wKSk7CitjaGFyX3UgKnVjczJfdG9fZW5jIF9fQVJHUygoc2hvcnRfdSAqc3RyLCBpbnQgKmxlbnApKTsKK3ZvaWQgY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9zZXRfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgRHVtcFB1dFMgX19BUkdTKChjb25zdCBjaGFyICpwc3opKTsKK3ZvaWQgbWNoX3ByaW50X2NsZWFudXAgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX3ByaW50X2luaXQgX19BUkdTKChwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLCBjaGFyX3UgKmpvYm5hbWUsIGludCBmb3JjZWl0KSk7CitpbnQgbWNoX3ByaW50X2JlZ2luIF9fQVJHUygocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykpOwordm9pZCBtY2hfcHJpbnRfZW5kIF9fQVJHUygocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykpOworaW50IG1jaF9wcmludF9lbmRfcGFnZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfcHJpbnRfYmVnaW5fcGFnZSBfX0FSR1MoKGNoYXJfdSAqbXNnKSk7CitpbnQgbWNoX3ByaW50X2JsYW5rX3BhZ2UgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9wcmludF9zdGFydF9saW5lIF9fQVJHUygoaW50IG1hcmdpbiwgaW50IHBhZ2VfbGluZSkpOworaW50IG1jaF9wcmludF90ZXh0X291dCBfX0FSR1MoKGNoYXJfdSAqcCwgaW50IGxlbikpOwordm9pZCBtY2hfcHJpbnRfc2V0X2ZvbnQgX19BUkdTKChpbnQgaUJvbGQsIGludCBpSXRhbGljLCBpbnQgaVVuZGVybGluZSkpOwordm9pZCBtY2hfcHJpbnRfc2V0X2JnIF9fQVJHUygodW5zaWduZWQgbG9uZyBiZ2NvbCkpOwordm9pZCBtY2hfcHJpbnRfc2V0X2ZnIF9fQVJHUygodW5zaWduZWQgbG9uZyBmZ2NvbCkpOworY2hhcl91ICptY2hfcmVzb2x2ZV9zaG9ydGN1dCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgd2luMzJfc2V0X2ZvcmVncm91bmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNlcnZlckluaXRNZXNzYWdpbmcgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNlcnZlclNldE5hbWUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2NoYXJfdSAqc2VydmVyR2V0VmltTmFtZXMgX19BUkdTKCh2b2lkKSk7CitpbnQgc2VydmVyU2VuZFJlcGx5IF9fQVJHUygoY2hhcl91ICpuYW1lLCBjaGFyX3UgKnJlcGx5KSk7CitpbnQgc2VydmVyU2VuZFRvVmltIF9fQVJHUygoY2hhcl91ICpuYW1lLCBjaGFyX3UgKmNtZCwgY2hhcl91ICoqcmVzdWx0LCB2b2lkICpwdGFyZ2V0LCBpbnQgYXNFeHByLCBpbnQgc2lsZW50KSk7Cit2b2lkIHNlcnZlckZvcmVncm91bmQgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2NoYXJfdSAqc2VydmVyR2V0UmVwbHkgX19BUkdTKChIV05EIHNlcnZlciwgaW50ICpleHByX3JlcywgaW50IHJlbW92ZSwgaW50IHdhaXQpKTsKK3ZvaWQgc2VydmVyUHJvY2Vzc1BlbmRpbmdNZXNzYWdlcyBfX0FSR1MoKHZvaWQpKTsKK2NoYXIgKmNoYXJzZXRfaWQybmFtZSBfX0FSR1MoKGludCBpZCkpOworaW50IGdldF9sb2dmb250IF9fQVJHUygoTE9HRk9OVCAqbGYsIGNoYXJfdSAqbmFtZSwgSERDIHByaW50ZXJfZGMpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL29zX3FueC5wcm8gYi9zcmMvcHJvdG8vb3NfcW54LnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE2MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX3FueC5wcm8KQEAgLTAsMCArMSw4IEBACisvKiBvc19xbnguYyAqLwordm9pZCBxbnhfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcW54X2NsaXBfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfbWNoX3NldF9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vb3NfcmlzY29zLnBybyBiL3NyYy9wcm90by9vc19yaXNjb3MucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTRjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vb3NfcmlzY29zLnBybwpAQCAtMCwwICsxLDQ5IEBACisvKiBvc19yaXNjb3MuYyAqLwordm9pZCBtY2hfd3JpdGUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK2ludCBtY2hfaW5jaGFyIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBtYXhsZW4sIGxvbmcgd3RpbWUsIGludCB0Yl9jaGFuZ2VfY250KSk7CitpbnQgbWNoX2NoYXJfYXZhaWwgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgbWNoX2F2YWlsX21lbSBfX0FSR1MoKGludCBzcGVjaWFsKSk7Cit2b2lkIG1jaF9kZWxheSBfX0FSR1MoKGxvbmcgbXNlYywgaW50IGlnbm9yZWlucHV0KSk7Cit2b2lkIG1jaF9zdXNwZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2hlY2tfd2luIF9fQVJHUygoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSk7CitpbnQgbWNoX2lucHV0X2lzYXR0eSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FuX3Jlc3RvcmVfdGl0bGUgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2Nhbl9yZXN0b3JlX2ljb24gX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqaWNvbikpOwordm9pZCBtY2hfcmVzdG9yZV90aXRsZSBfX0FSR1MoKGludCB3aGljaCkpOworaW50IG1jaF9nZXRfdXNlcl9uYW1lIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuKSk7Cit2b2lkIG1jaF9nZXRfaG9zdF9uYW1lIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuKSk7Citsb25nIG1jaF9nZXRfcGlkIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9kaXJuYW1lIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4pKTsKK2ludCBtY2hfRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbiwgaW50IGZvcmNlKSk7CitpbnQgbWNoX2lzRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7Citsb25nIG1jaF9nZXRwZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX3NldHBlcm0gX19BUkdTKChjaGFyX3UgKm5hbWUsIGxvbmcgcGVybSkpOwordm9pZCBtY2hfaGlkZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9pc2RpciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9jYW5fZXhlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX25vZGV0eXBlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIG1jaF9lYXJseV9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfZXhpdCBfX0FSR1MoKGludCByKSk7Cit2b2lkIG1jaF9zZXR0bW9kZSBfX0FSR1MoKGludCB0bW9kZSkpOwordm9pZCBtY2hfc2V0bW91c2UgX19BUkdTKChpbnQgb24pKTsKK2ludCBtY2hfc2NyZWVubW9kZSBfX0FSR1MoKGNoYXJfdSAqYXJnKSk7CitpbnQgbWNoX2dldF9zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfbmV3X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FsbF9zaGVsbCBfX0FSR1MoKGNoYXJfdSAqY21kLCBpbnQgb3B0aW9ucykpOwordm9pZCBtY2hfYnJlYWtjaGVjayBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfZXhwYW5kcGF0aCBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGNoYXJfdSAqcGF0aCwgaW50IGZsYWdzKSk7CitpbnQgZXhwYW5kX3NlY3Rpb24gX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKnJvb3QsIGNoYXJfdSAqcmVzdCwgaW50IGZsYWdzKSk7CitpbnQgbWNoX2V4cGFuZF93aWxkY2FyZHMgX19BUkdTKChpbnQgbnVtX3BhdCwgY2hhcl91ICoqcGF0LCBpbnQgKm51bV9maWxlLCBjaGFyX3UgKioqZmlsZSwgaW50IGZsYWdzKSk7CitpbnQgbWNoX2hhc19leHBfd2lsZGNhcmQgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCBtY2hfaGFzX3dpbGRjYXJkIF9fQVJHUygoY2hhcl91ICpwKSk7CitpbnQgbWNoX3JlbW92ZSBfX0FSR1MoKGNoYXJfdSAqZmlsZSkpOworY2hhcl91ICptY2hfbXVuZ2VfZm5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7CitpbnQgcm9fYnVmbGlzdF9hZGQgX19BUkdTKChjaGFyX3UgKm9sZF9uYW1lKSk7CitpbnQgbWNoX2NoZGlyIF9fQVJHUygoY2hhcl91ICpkaXIpKTsKK3ZvaWQgbWNoX3JlYWRfZmlsZXR5cGUgX19BUkdTKChjaGFyX3UgKmZpbGUpKTsKK3ZvaWQgbWNoX3NldF9maWxldHlwZSBfX0FSR1MoKGNoYXJfdSAqZmlsZSwgY2hhcl91ICp0eXBlKSk7CitpbnQgbWNoX2NoZWNrX2ZpbGV0eXBlIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICp0eXBlKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vc191bml4LnBybyBiL3NyYy9wcm90by9vc191bml4LnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM5MDhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL29zX3VuaXgucHJvCkBAIC0wLDAgKzEsNzAgQEAKKy8qIG9zX3VuaXguYyAqLwordm9pZCBtY2hfd3JpdGUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK2ludCBtY2hfaW5jaGFyIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBtYXhsZW4sIGxvbmcgd3RpbWUsIGludCB0Yl9jaGFuZ2VfY250KSk7CitpbnQgbWNoX2NoYXJfYXZhaWwgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgbWNoX3RvdGFsX21lbSBfX0FSR1MoKGludCBzcGVjaWFsKSk7Cit2b2lkIG1jaF9kZWxheSBfX0FSR1MoKGxvbmcgbXNlYywgaW50IGlnbm9yZWlucHV0KSk7CitpbnQgbWNoX3N0YWNrY2hlY2sgX19BUkdTKChjaGFyICpwKSk7Cit2b2lkIG1jaF9zdGFydGptcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX2VuZGptcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX2RpZGptcCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3N1c3BlbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCByZXNldF9zaWduYWxzIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jaGVja193aW4gX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCBtY2hfaW5wdXRfaXNhdHR5IF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jYW5fcmVzdG9yZV90aXRsZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FuX3Jlc3RvcmVfaWNvbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldHRpdGxlIF9fQVJHUygoY2hhcl91ICp0aXRsZSwgY2hhcl91ICppY29uKSk7Cit2b2lkIG1jaF9yZXN0b3JlX3RpdGxlIF9fQVJHUygoaW50IHdoaWNoKSk7CitpbnQgdmltX2lzX3h0ZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgdXNlX3h0ZXJtX21vdXNlIF9fQVJHUygodm9pZCkpOworaW50IHZpbV9pc19pcmlzIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgdmltX2lzX3Z0MzAwIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgdmltX2lzX2Zhc3R0ZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2dldF91c2VyX25hbWUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK2ludCBtY2hfZ2V0X3VuYW1lIF9fQVJHUygodWlkX3QgdWlkLCBjaGFyX3UgKnMsIGludCBsZW4pKTsKK3ZvaWQgbWNoX2dldF9ob3N0X25hbWUgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK2xvbmcgbWNoX2dldF9waWQgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2Rpcm5hbWUgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IGxlbikpOwordm9pZCBzbGFzaF9hZGp1c3QgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCBtY2hfRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbiwgaW50IGZvcmNlKSk7CitpbnQgbWNoX2lzRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7Citsb25nIG1jaF9nZXRwZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX3NldHBlcm0gX19BUkdTKChjaGFyX3UgKm5hbWUsIGxvbmcgcGVybSkpOwordmltX2FjbF9UIG1jaF9nZXRfYWNsIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwordm9pZCBtY2hfc2V0X2FjbCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIHZpbV9hY2xfVCBhY2xlbnQpKTsKK3ZvaWQgbWNoX2ZyZWVfYWNsIF9fQVJHUygodmltX2FjbF9UIGFjbGVudCkpOwordm9pZCBtY2hfaGlkZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9pc2RpciBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IG1jaF9jYW5fZXhlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX25vZGV0eXBlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIG1jaF9lYXJseV9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfZXhpdCBfX0FSR1MoKGludCByKSk7Cit2b2lkIG1jaF9zZXR0bW9kZSBfX0FSR1MoKGludCB0bW9kZSkpOwordm9pZCBnZXRfc3R0eSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7Cit2b2lkIGNoZWNrX21vdXNlX3Rlcm1jb2RlIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9zY3JlZW5tb2RlIF9fQVJHUygoY2hhcl91ICphcmcpKTsKK2ludCBtY2hfZ2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldF9zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9uZXdfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jYWxsX3NoZWxsIF9fQVJHUygoY2hhcl91ICpjbWQsIGludCBvcHRpb25zKSk7Cit2b2lkIG1jaF9icmVha2NoZWNrIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9leHBhbmRwYXRoIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpwYXRoLCBpbnQgZmxhZ3MpKTsKK2ludCBtY2hfZXhwYW5kX3dpbGRjYXJkcyBfX0FSR1MoKGludCBudW1fcGF0LCBjaGFyX3UgKipwYXQsIGludCAqbnVtX2ZpbGUsIGNoYXJfdSAqKipmaWxlLCBpbnQgZmxhZ3MpKTsKK2ludCBtY2hfaGFzX2V4cF93aWxkY2FyZCBfX0FSR1MoKGNoYXJfdSAqcCkpOworaW50IG1jaF9oYXNfd2lsZGNhcmQgX19BUkdTKChjaGFyX3UgKnApKTsKK2ludCBtY2hfbGliY2FsbCBfX0FSR1MoKGNoYXJfdSAqbGlibmFtZSwgY2hhcl91ICpmdW5jbmFtZSwgY2hhcl91ICphcmdzdHJpbmcsIGludCBhcmdpbnQsIGNoYXJfdSAqKnN0cmluZ19yZXN1bHQsIGludCAqbnVtYmVyX3Jlc3VsdCkpOwordm9pZCBzZXR1cF90ZXJtX2NsaXAgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHN0YXJ0X3h0ZXJtX3RyYWNlIF9fQVJHUygoaW50IGJ1dHRvbikpOwordm9pZCBzdG9wX3h0ZXJtX3RyYWNlIF9fQVJHUygodm9pZCkpOwordm9pZCBjbGVhcl94dGVybV9jbGlwIF9fQVJHUygodm9pZCkpOworaW50IGNsaXBfeHRlcm1fb3duX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfeHRlcm1fbG9zZV9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX3h0ZXJtX3JlcXVlc3Rfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF94dGVybV9zZXRfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK2ludCB4c21wX2hhbmRsZV9yZXF1ZXN0cyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgeHNtcF9pbml0IF9fQVJHUygodm9pZCkpOwordm9pZCB4c21wX2Nsb3NlIF9fQVJHUygodm9pZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vb3Nfdm1zLnBybyBiL3NyYy9wcm90by9vc192bXMucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDYzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vb3Nfdm1zLnBybwpAQCAtMCwwICsxLDE0IEBACisvKiBvc192bXMuYyAqLwordm9pZCBtY2hfc2V0dG1vZGUgX19BUkdTKChpbnQgdG1vZGUpKTsKK2ludCBtY2hfZ2V0X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldF9zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7CitjaGFyX3UgKm1jaF9nZXRlbnYgX19BUkdTKChjaGFyX3UgKmxvZ25hbSkpOworaW50IG1jaF9zZXRlbnYgX19BUkdTKChjaGFyICp2YXIsIGNoYXIgKnZhbHVlLCBpbnQgeCkpOworaW50IHZtc19zeXMgX19BUkdTKChjaGFyICpjbWQsIGNoYXIgKm91dCwgY2hhciAqaW5wKSk7CitpbnQgdm1zX3N5c19zdGF0dXMgX19BUkdTKChpbnQgc3RhdHVzKSk7CitpbnQgdm1zX3JlYWQgX19BUkdTKChjaGFyICppbmJ1Ziwgc2l6ZV90IG5ieXRlcykpOworaW50IG1jaF9leHBhbmRfd2lsZGNhcmRzIF9fQVJHUygoaW50IG51bV9wYXQsIGNoYXJfdSAqKnBhdCwgaW50ICpudW1fZmlsZSwgY2hhcl91ICoqKmZpbGUsIGludCBmbGFncykpOworaW50IG1jaF9leHBhbmRwYXRoIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpwYXRoLCBpbnQgZmxhZ3MpKTsKK3ZvaWQgKnZtc19maXhmaWxlbmFtZSBfX0FSR1MoKHZvaWQgKmluc3RyaW5nKSk7Cit2b2lkIHZtc19yZW1vdmVfdmVyc2lvbiBfX0FSR1MoKHZvaWQgKmZuYW1lKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vc193aW4xNi5wcm8gYi9zcmMvcHJvdG8vb3Nfd2luMTYucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmE3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vb3Nfd2luMTYucHJvCkBAIC0wLDAgKzEsMTIgQEAKKy8qIG9zX3dpbjE2LmMgKi8KK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7Cit2b2lkIG1jaF9pbml0IF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jaGVja193aW4gX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK2xvbmcgbWNoX2dldF9waWQgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX2NhbGxfc2hlbGwgX19BUkdTKChjaGFyX3UgKmNtZCwgaW50IG9wdGlvbnMpKTsKK3ZvaWQgbWNoX2RlbGF5IF9fQVJHUygobG9uZyBtc2VjLCBpbnQgaWdub3JlaW5wdXQpKTsKK3ZvaWQgbWNoX2JyZWFrY2hlY2sgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgbWNoX2F2YWlsX21lbSBfX0FSR1MoKGludCBzcGVjaWFsKSk7CitpbnQgbWNoX3JlbmFtZSBfX0FSR1MoKGNvbnN0IGNoYXIgKnBzek9sZEZpbGUsIGNvbnN0IGNoYXIgKnBzek5ld0ZpbGUpKTsKK2NoYXIgKmRlZmF1bHRfc2hlbGwgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9vc193aW4zMi5wcm8gYi9zcmMvcHJvdG8vb3Nfd2luMzIucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWExNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vb3Nfd2luMzIucHJvCkBAIC0wLDAgKzEsNDggQEAKKy8qIG9zX3dpbjMyLmMgKi8KK2ludCBkeW5fbGliaW50bF9pbml0IF9fQVJHUygoY2hhciAqbGlibmFtZSkpOwordm9pZCBkeW5fbGliaW50bF9lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIFBsYXRmb3JtSWQgX19BUkdTKCh2b2lkKSk7CitpbnQgbWNoX3dpbmRvd3M5NSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldG1vdXNlIF9fQVJHUygoaW50IG9uKSk7Cit2b2lkIG1jaF91cGRhdGVfY3Vyc29yIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9jaGFyX2F2YWlsIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9pbmNoYXIgX19BUkdTKChjaGFyX3UgKmJ1ZiwgaW50IG1heGxlbiwgbG9uZyB0aW1lLCBpbnQgdGJfY2hhbmdlX2NudCkpOwordm9pZCBtY2hfaW5pdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX2V4aXQgX19BUkdTKChpbnQgcikpOworaW50IG1jaF9jaGVja193aW4gX19BUkdTKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK3ZvaWQgZm5hbWVfY2FzZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgaW50IGxlbikpOworaW50IG1jaF9nZXRfdXNlcl9uYW1lIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuKSk7Cit2b2lkIG1jaF9nZXRfaG9zdF9uYW1lIF9fQVJHUygoY2hhcl91ICpzLCBpbnQgbGVuKSk7Citsb25nIG1jaF9nZXRfcGlkIF9fQVJHUygodm9pZCkpOworaW50IG1jaF9kaXJuYW1lIF9fQVJHUygoY2hhcl91ICpidWYsIGludCBsZW4pKTsKK2xvbmcgbWNoX2dldHBlcm0gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfc2V0cGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgbG9uZyBwZXJtKSk7Cit2b2lkIG1jaF9oaWRlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2lzZGlyIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX3dyaXRhYmxlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgbWNoX2Nhbl9leGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBtY2hfbm9kZXR5cGUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZpbV9hY2xfVCBtY2hfZ2V0X2FjbCBfX0FSR1MoKGNoYXJfdSAqZm5hbWUpKTsKK3ZvaWQgbWNoX3NldF9hY2wgX19BUkdTKChjaGFyX3UgKmZuYW1lLCB2aW1fYWNsX1QgYWNsKSk7Cit2b2lkIG1jaF9mcmVlX2FjbCBfX0FSR1MoKHZpbV9hY2xfVCBhY2wpKTsKK3ZvaWQgbWNoX3NldHRtb2RlIF9fQVJHUygoaW50IHRtb2RlKSk7CitpbnQgbWNoX2dldF9zaGVsbHNpemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF9zZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCBtY2hfbmV3X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWNoX3NldF93aW5zaXplX25vdyBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfY2FsbF9zaGVsbCBfX0FSR1MoKGNoYXJfdSAqY21kLCBpbnQgb3B0aW9ucykpOwordm9pZCBtY2hfc2V0X25vcm1hbF9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1jaF93cml0ZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOwordm9pZCBtY2hfZGVsYXkgX19BUkdTKChsb25nIG1zZWMsIGludCBpZ25vcmVpbnB1dCkpOworaW50IG1jaF9yZW1vdmUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3ZvaWQgbWNoX2JyZWFrY2hlY2sgX19BUkdTKCh2b2lkKSk7Citsb25nX3UgbWNoX2F2YWlsX21lbSBfX0FSR1MoKGludCBzcGVjaWFsKSk7CitpbnQgbWNoX3dyZW5hbWUgX19BUkdTKChXQ0hBUiAqd29sZCwgV0NIQVIgKnduZXcpKTsKK2ludCBtY2hfcmVuYW1lIF9fQVJHUygoY29uc3QgY2hhciAqcHN6T2xkRmlsZSwgY29uc3QgY2hhciAqcHN6TmV3RmlsZSkpOworY2hhciAqZGVmYXVsdF9zaGVsbCBfX0FSR1MoKHZvaWQpKTsKK2ludCBtY2hfYWNjZXNzIF9fQVJHUygoY2hhciAqbiwgaW50IHApKTsKK2ludCBtY2hfb3BlbiBfX0FSR1MoKGNoYXIgKm5hbWUsIGludCBmbGFncywgaW50IG1vZGUpKTsKK0ZJTEUgKm1jaF9mb3BlbiBfX0FSR1MoKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpKTsKK2ludCBtY2hfY29weV9maWxlX2F0dHJpYnV0ZSBfX0FSR1MoKGNoYXJfdSAqZnJvbSwgY2hhcl91ICp0bykpOworaW50IG15cmVzZXRzdGtvZmx3IF9fQVJHUygodm9pZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vcHR5LnBybyBiL3NyYy9wcm90by9wdHkucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDI0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vcHR5LnBybwpAQCAtMCwwICsxLDMgQEAKKy8qIHB0eS5jICovCitpbnQgT3BlblBUWSBfX0FSR1MoKGNoYXIgKip0dHluKSk7CitpbnQgU2V0dXBTbGF2ZVBUWSBfX0FSR1MoKGludCBmZCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL3F1aWNrZml4LnBybyBiL3NyYy9wcm90by9xdWlja2ZpeC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9xdWlja2ZpeC5wcm8KQEAgLTAsMCArMSwyMSBAQAorLyogcXVpY2tmaXguYyAqLworaW50IHFmX2luaXQgX19BUkdTKChjaGFyX3UgKmVmaWxlLCBjaGFyX3UgKmVycm9yZm9ybWF0LCBpbnQgbmV3bGlzdCkpOwordm9pZCBxZl9qdW1wIF9fQVJHUygoaW50IGRpciwgaW50IGVycm9ybnIsIGludCBmb3JjZWl0KSk7Cit2b2lkIHFmX2xpc3QgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgcWZfYWdlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIHFmX21hcmtfYWRqdXN0IF9fQVJHUygobGluZW5yX1QgbGluZTEsIGxpbmVucl9UIGxpbmUyLCBsb25nIGFtb3VudCwgbG9uZyBhbW91bnRfYWZ0ZXIpKTsKK3ZvaWQgZXhfY3dpbmRvdyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwordm9pZCBleF9jY2xvc2UgX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgZXhfY29wZW4gX19BUkdTKChleGFyZ19UICplYXApKTsKK2xpbmVucl9UIHFmX2N1cnJlbnRfZW50cnkgX19BUkdTKCh2b2lkKSk7CitpbnQgYnRfcXVpY2tmaXggX19BUkdTKChidWZfVCAqYnVmKSk7CitpbnQgYnRfbm9maWxlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOworaW50IGJ0X2RvbnR3cml0ZSBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2ludCBidF9kb250d3JpdGVfbXNnIF9fQVJHUygoYnVmX1QgKmJ1ZikpOworaW50IGJ1Zl9oaWRlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBleF9tYWtlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NjIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NuZXh0IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2NmaWxlIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7Cit2b2lkIGV4X2hlbHBncmVwIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9yZWdleHAucHJvIGIvc3JjL3Byb3RvL3JlZ2V4cC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMWMyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9yZWdleHAucHJvCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHJlZ2V4cC5jICovCitpbnQgcmVfbXVsdGlsaW5lIF9fQVJHUygocmVncHJvZ19UICpwcm9nKSk7CitpbnQgcmVfbG9va2JlaGluZCBfX0FSR1MoKHJlZ3Byb2dfVCAqcHJvZykpOworY2hhcl91ICpza2lwX3JlZ2V4cCBfX0FSR1MoKGNoYXJfdSAqc3RhcnRwLCBpbnQgZGlyYywgaW50IG1hZ2ljLCBjaGFyX3UgKipuZXdwKSk7CityZWdwcm9nX1QgKnZpbV9yZWdjb21wIF9fQVJHUygoY2hhcl91ICpleHByLCBpbnQgcmVfZmxhZ3MpKTsKK2ludCB2aW1fcmVnY29tcF9oYWRfZW9sIF9fQVJHUygodm9pZCkpOworaW50IHZpbV9yZWdleGVjIF9fQVJHUygocmVnbWF0Y2hfVCAqcm1wLCBjaGFyX3UgKmxpbmUsIGNvbG5yX1QgY29sKSk7CitpbnQgdmltX3JlZ2V4ZWNfbmwgX19BUkdTKChyZWdtYXRjaF9UICpybXAsIGNoYXJfdSAqbGluZSwgY29sbnJfVCBjb2wpKTsKK2xvbmcgdmltX3JlZ2V4ZWNfbXVsdGkgX19BUkdTKChyZWdtbWF0Y2hfVCAqcm1wLCB3aW5fVCAqd2luLCBidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtLCBjb2xucl9UIGNvbCkpOworcmVnX2V4dG1hdGNoX1QgKnJlZl9leHRtYXRjaCBfX0FSR1MoKHJlZ19leHRtYXRjaF9UICplbSkpOwordm9pZCB1bnJlZl9leHRtYXRjaCBfX0FSR1MoKHJlZ19leHRtYXRjaF9UICplbSkpOworY2hhcl91ICpyZWd0aWxkZSBfX0FSR1MoKGNoYXJfdSAqc291cmNlLCBpbnQgbWFnaWMpKTsKK2ludCB2aW1fcmVnc3ViIF9fQVJHUygocmVnbWF0Y2hfVCAqcm1wLCBjaGFyX3UgKnNvdXJjZSwgY2hhcl91ICpkZXN0LCBpbnQgY29weSwgaW50IG1hZ2ljLCBpbnQgYmFja3NsYXNoKSk7CitpbnQgdmltX3JlZ3N1Yl9tdWx0aSBfX0FSR1MoKHJlZ21tYXRjaF9UICpybXAsIGxpbmVucl9UIGxudW0sIGNoYXJfdSAqc291cmNlLCBjaGFyX3UgKmRlc3QsIGludCBjb3B5LCBpbnQgbWFnaWMsIGludCBiYWNrc2xhc2gpKTsKK2NoYXJfdSAqcmVnX3N1Ym1hdGNoIF9fQVJHUygoaW50IG5vKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9zY3JlZW4ucHJvIGIvc3JjL3Byb3RvL3NjcmVlbi5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MWZkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9zY3JlZW4ucHJvCkBAIC0wLDAgKzEsNDYgQEAKKy8qIHNjcmVlbi5jICovCit2b2lkIHJlZHJhd19sYXRlciBfX0FSR1MoKGludCB0eXBlKSk7Cit2b2lkIHJlZHJhd193aW5fbGF0ZXIgX19BUkdTKCh3aW5fVCAqd3AsIGludCB0eXBlKSk7Cit2b2lkIHJlZHJhd19sYXRlcl9jbGVhciBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgcmVkcmF3X2FsbF9sYXRlciBfX0FSR1MoKGludCB0eXBlKSk7Cit2b2lkIHJlZHJhd19jdXJidWZfbGF0ZXIgX19BUkdTKChpbnQgdHlwZSkpOwordm9pZCByZWRyYXdfYnVmX2xhdGVyIF9fQVJHUygoYnVmX1QgKmJ1ZiwgaW50IHR5cGUpKTsKK3ZvaWQgcmVkcmF3V2lubGluZSBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGludCBpbnZhbGlkKSk7Cit2b2lkIHVwZGF0ZV9jdXJidWYgX19BUkdTKChpbnQgdHlwZSkpOwordm9pZCB1cGRhdGVfc2NyZWVuIF9fQVJHUygoaW50IHR5cGUpKTsKK3ZvaWQgdXBkYXRlX2RlYnVnX3NpZ24gX19BUkdTKChidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtKSk7Cit2b2lkIHVwZGF0ZVdpbmRvdyBfX0FSR1MoKHdpbl9UICp3cCkpOwordm9pZCBzdGF0dXNfcmVkcmF3X2FsbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc3RhdHVzX3JlZHJhd19jdXJidWYgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHJlZHJhd19zdGF0dXNsaW5lcyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgd2luX3JlZHJhd19sYXN0X3N0YXR1cyBfX0FSR1MoKGZyYW1lX1QgKmZycCkpOwordm9pZCB3aW5fcmVkcl9zdGF0dXNfbWF0Y2hlcyBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IG51bV9tYXRjaGVzLCBjaGFyX3UgKiptYXRjaGVzLCBpbnQgbWF0Y2gsIGludCBzaG93dGFpbCkpOwordm9pZCB3aW5fcmVkcl9zdGF0dXMgX19BUkdTKCh3aW5fVCAqd3ApKTsKK2ludCBzdGxfY29ubmVjdGVkIF9fQVJHUygod2luX1QgKndwKSk7CitpbnQgZ2V0X2tleW1hcF9zdHIgX19BUkdTKCh3aW5fVCAqd3AsIGNoYXJfdSAqYnVmLCBpbnQgbGVuKSk7Cit2b2lkIHNjcmVlbl9wdXRjaGFyIF9fQVJHUygoaW50IGMsIGludCByb3csIGludCBjb2wsIGludCBhdHRyKSk7Cit2b2lkIHNjcmVlbl9nZXRieXRlcyBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGNoYXJfdSAqYnl0ZXMsIGludCAqYXR0cnApKTsKK3ZvaWQgc2NyZWVuX3B1dHMgX19BUkdTKChjaGFyX3UgKnRleHQsIGludCByb3csIGludCBjb2wsIGludCBhdHRyKSk7Cit2b2lkIHNjcmVlbl9wdXRzX2xlbiBfX0FSR1MoKGNoYXJfdSAqdGV4dCwgaW50IGxlbiwgaW50IHJvdywgaW50IGNvbCwgaW50IGF0dHIpKTsKK3ZvaWQgc2NyZWVuX3N0b3BfaGlnaGxpZ2h0IF9fQVJHUygodm9pZCkpOwordm9pZCByZXNldF9jdGVybV9jb2xvcnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNjcmVlbl9kcmF3X3JlY3RhbmdsZSBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IGludmVydCkpOwordm9pZCBzY3JlZW5fZmlsbCBfX0FSR1MoKGludCBzdGFydF9yb3csIGludCBlbmRfcm93LCBpbnQgc3RhcnRfY29sLCBpbnQgZW5kX2NvbCwgaW50IGMxLCBpbnQgYzIsIGludCBhdHRyKSk7Cit2b2lkIGNoZWNrX2Zvcl9kZWxheSBfX0FSR1MoKGludCBjaGVja19tc2dfc2Nyb2xsKSk7CitpbnQgc2NyZWVuX3ZhbGlkIF9fQVJHUygoaW50IGNsZWFyKSk7Cit2b2lkIHNjcmVlbmFsbG9jIF9fQVJHUygoaW50IGNsZWFyKSk7Cit2b2lkIHNjcmVlbmNsZWFyIF9fQVJHUygodm9pZCkpOworaW50IGNhbl9jbGVhciBfX0FSR1MoKGNoYXJfdSAqcCkpOwordm9pZCBzY3JlZW5fc3RhcnQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNjcmVlbl9kb3duIF9fQVJHUygodm9pZCkpOwordm9pZCB3aW5kZ290byBfX0FSR1MoKGludCByb3csIGludCBjb2wpKTsKK3ZvaWQgc2V0Y3Vyc29yIF9fQVJHUygodm9pZCkpOworaW50IHdpbl9pbnNfbGluZXMgX19BUkdTKCh3aW5fVCAqd3AsIGludCByb3csIGludCBsaW5lX2NvdW50LCBpbnQgaW52YWxpZCwgaW50IG1heWNsZWFyKSk7CitpbnQgd2luX2RlbF9saW5lcyBfX0FSR1MoKHdpbl9UICp3cCwgaW50IHJvdywgaW50IGxpbmVfY291bnQsIGludCBpbnZhbGlkLCBpbnQgbWF5Y2xlYXIpKTsKK2ludCBzY3JlZW5fZGVsX2xpbmVzIF9fQVJHUygoaW50IG9mZiwgaW50IHJvdywgaW50IGxpbmVfY291bnQsIGludCBlbmQsIGludCBmb3JjZSwgd2luX1QgKndwKSk7CitpbnQgc2hvd21vZGUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVuc2hvd21vZGUgX19BUkdTKChpbnQgZm9yY2UpKTsKK2ludCByZWRyYXdpbmcgX19BUkdTKCh2b2lkKSk7CitpbnQgbWVzc2FnaW5nIF9fQVJHUygodm9pZCkpOwordm9pZCBzaG93cnVsZXIgX19BUkdTKChpbnQgYWx3YXlzKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9zZWFyY2gucHJvIGIvc3JjL3Byb3RvL3NlYXJjaC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0YzM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9zZWFyY2gucHJvCkBAIC0wLDAgKzEsMzMgQEAKKy8qIHNlYXJjaC5jICovCitpbnQgc2VhcmNoX3JlZ2NvbXAgX19BUkdTKChjaGFyX3UgKnBhdCwgaW50IHBhdF9zYXZlLCBpbnQgcGF0X3VzZSwgaW50IG9wdGlvbnMsIHJlZ21tYXRjaF9UICpyZWdtYXRjaCkpOworY2hhcl91ICpnZXRfc2VhcmNoX3BhdCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2F2ZV9zZWFyY2hfcGF0dGVybnMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHJlc3RvcmVfc2VhcmNoX3BhdHRlcm5zIF9fQVJHUygodm9pZCkpOworaW50IGlnbm9yZWNhc2UgX19BUkdTKChjaGFyX3UgKnBhdCkpOworY2hhcl91ICpsYXN0X3NlYXJjaF9wYXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHJlc2V0X3NlYXJjaF9kaXIgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldF9sYXN0X3NlYXJjaF9wYXQgX19BUkdTKChjaGFyX3UgKnMsIGludCBpZHgsIGludCBtYWdpYywgaW50IHNldGxhc3QpKTsKK3ZvaWQgbGFzdF9wYXRfcHJvZyBfX0FSR1MoKHJlZ21tYXRjaF9UICpyZWdtYXRjaCkpOworaW50IHNlYXJjaGl0IF9fQVJHUygod2luX1QgKndpbiwgYnVmX1QgKmJ1ZiwgcG9zX1QgKnBvcywgaW50IGRpciwgY2hhcl91ICpwYXQsIGxvbmcgY291bnQsIGludCBvcHRpb25zLCBpbnQgcGF0X3VzZSkpOworaW50IGRvX3NlYXJjaCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50IGRpcmMsIGNoYXJfdSAqcGF0LCBsb25nIGNvdW50LCBpbnQgb3B0aW9ucykpOworaW50IHNlYXJjaF9mb3JfZXhhY3RfbGluZSBfX0FSR1MoKGJ1Zl9UICpidWYsIHBvc19UICpwb3MsIGludCBkaXIsIGNoYXJfdSAqcGF0KSk7CitpbnQgc2VhcmNoYyBfX0FSR1MoKGNtZGFyZ19UICpjYXAsIGludCB0X2NtZCkpOworcG9zX1QgKmZpbmRtYXRjaCBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50IGluaXRjKSk7Citwb3NfVCAqZmluZG1hdGNobGltaXQgX19BUkdTKChvcGFyZ19UICpvYXAsIGludCBpbml0YywgaW50IGZsYWdzLCBpbnQgbWF4dHJhdmVsKSk7Cit2b2lkIHNob3dtYXRjaCBfX0FSR1MoKGludCBjKSk7CitpbnQgZmluZHNlbnQgX19BUkdTKChpbnQgZGlyLCBsb25nIGNvdW50KSk7CitpbnQgZmluZHBhciBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgaW50IGRpciwgbG9uZyBjb3VudCwgaW50IHdoYXQsIGludCBib3RoKSk7CitpbnQgc3RhcnRQUyBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGludCBwYXJhLCBpbnQgYm90aCkpOworaW50IGZ3ZF93b3JkIF9fQVJHUygobG9uZyBjb3VudCwgaW50IGJpZ3dvcmQsIGludCBlb2wpKTsKK2ludCBiY2tfd29yZCBfX0FSR1MoKGxvbmcgY291bnQsIGludCBiaWd3b3JkLCBpbnQgc3RvcCkpOworaW50IGVuZF93b3JkIF9fQVJHUygobG9uZyBjb3VudCwgaW50IGJpZ3dvcmQsIGludCBzdG9wLCBpbnQgZW1wdHkpKTsKK2ludCBiY2tlbmRfd29yZCBfX0FSR1MoKGxvbmcgY291bnQsIGludCBiaWd3b3JkLCBpbnQgZW9sKSk7CitpbnQgY3VycmVudF93b3JkIF9fQVJHUygob3BhcmdfVCAqb2FwLCBsb25nIGNvdW50LCBpbnQgaW5jbHVkZSwgaW50IGJpZ3dvcmQpKTsKK2ludCBjdXJyZW50X3NlbnQgX19BUkdTKChvcGFyZ19UICpvYXAsIGxvbmcgY291bnQsIGludCBpbmNsdWRlKSk7CitpbnQgY3VycmVudF9ibG9jayBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgbG9uZyBjb3VudCwgaW50IGluY2x1ZGUsIGludCB3aGF0LCBpbnQgb3RoZXIpKTsKK2ludCBjdXJyZW50X3BhciBfX0FSR1MoKG9wYXJnX1QgKm9hcCwgbG9uZyBjb3VudCwgaW50IGluY2x1ZGUsIGludCB0eXBlKSk7CitpbnQgbGluZXdoaXRlIF9fQVJHUygobGluZW5yX1QgbG51bSkpOwordm9pZCBmaW5kX3BhdHRlcm5faW5fcGF0aCBfX0FSR1MoKGNoYXJfdSAqcHRyLCBpbnQgZGlyLCBpbnQgbGVuLCBpbnQgd2hvbGUsIGludCBza2lwX2NvbW1lbnRzLCBpbnQgdHlwZSwgbG9uZyBjb3VudCwgaW50IGFjdGlvbiwgbGluZW5yX1Qgc3RhcnRfbG51bSwgbGluZW5yX1QgZW5kX2xudW0pKTsKK2ludCByZWFkX3ZpbWluZm9fc2VhcmNoX3BhdHRlcm4gX19BUkdTKCh2aXJfVCAqdmlycCwgaW50IGZvcmNlKSk7Cit2b2lkIHdyaXRlX3ZpbWluZm9fc2VhcmNoX3BhdHRlcm4gX19BUkdTKChGSUxFICpmcCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vc3ludGF4LnBybyBiL3NyYy9wcm90by9zeW50YXgucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGQzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vc3ludGF4LnBybwpAQCAtMCwwICsxLDQyIEBACisvKiBzeW50YXguYyAqLwordm9pZCBzeW50YXhfc3RhcnQgX19BUkdTKCh3aW5fVCAqd3AsIGxpbmVucl9UIGxudW0pKTsKK3ZvaWQgc3luX3N0YWNrX2ZyZWVfYWxsIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBzeW5fc3RhY2tfYXBwbHlfY2hhbmdlcyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgc3ludGF4X2VuZF9wYXJzaW5nIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IHN5bnRheF9jaGVja19jaGFuZ2VkIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IGdldF9zeW50YXhfYXR0ciBfX0FSR1MoKGNvbG5yX1QgY29sKSk7Cit2b2lkIHN5bnRheF9jbGVhciBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgZXhfc3ludGF4IF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CitpbnQgc3ludGF4X3ByZXNlbnQgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIHNldF9jb250ZXh0X2luX3N5bnRheF9jbWQgX19BUkdTKChleHBhbmRfVCAqeHAsIGNoYXJfdSAqYXJnKSk7CitjaGFyX3UgKmdldF9zeW50YXhfbmFtZSBfX0FSR1MoKGV4cGFuZF9UICp4cCwgaW50IGlkeCkpOworaW50IHN5bl9nZXRfaWQgX19BUkdTKChsb25nIGxudW0sIGxvbmcgY29sLCBpbnQgdHJhbnMpKTsKK2ludCBzeW5fZ2V0X2ZvbGRsZXZlbCBfX0FSR1MoKHdpbl9UICp3cCwgbG9uZyBsbnVtKSk7Cit2b2lkIGluaXRfaGlnaGxpZ2h0IF9fQVJHUygoaW50IGJvdGgsIGludCByZXNldCkpOworaW50IGxvYWRfY29sb3JzIF9fQVJHUygoY2hhcl91ICpwKSk7Cit2b2lkIGRvX2hpZ2hsaWdodCBfX0FSR1MoKGNoYXJfdSAqbGluZSwgaW50IGZvcmNlaXQsIGludCBpbml0KSk7Cit2b2lkIHJlc3RvcmVfY3Rlcm1fY29sb3JzIF9fQVJHUygodm9pZCkpOwordm9pZCBzZXRfbm9ybWFsX2NvbG9ycyBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqaGxfZ2V0X2ZvbnRfbmFtZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgaGxfc2V0X2ZvbnRfbmFtZSBfX0FSR1MoKGNoYXJfdSAqZm9udF9uYW1lKSk7Cit2b2lkIGhsX3NldF9iZ19jb2xvcl9uYW1lIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7Cit2b2lkIGhsX3NldF9mZ19jb2xvcl9uYW1lIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CithdHRyZW50cnlfVCAqc3luX2d1aV9hdHRyMmVudHJ5IF9fQVJHUygoaW50IGF0dHIpKTsKK2F0dHJlbnRyeV9UICpzeW5fdGVybV9hdHRyMmVudHJ5IF9fQVJHUygoaW50IGF0dHIpKTsKK2F0dHJlbnRyeV9UICpzeW5fY3Rlcm1fYXR0cjJlbnRyeSBfX0FSR1MoKGludCBhdHRyKSk7CitjaGFyX3UgKmhpZ2hsaWdodF9oYXNfYXR0ciBfX0FSR1MoKGludCBpZCwgaW50IGZsYWcsIGludCBtb2RlYykpOworY2hhcl91ICpoaWdobGlnaHRfY29sb3IgX19BUkdTKChpbnQgaWQsIGNoYXJfdSAqd2hhdCwgaW50IG1vZGVjKSk7Citsb25nX3UgaGlnaGxpZ2h0X2d1aV9jb2xvcl9yZ2IgX19BUkdTKChpbnQgaWQsIGludCBmZykpOworaW50IHN5bl9uYW1lMmlkIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitpbnQgaGlnaGxpZ2h0X2V4aXN0cyBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworaW50IHN5bl9uYW1lbjJpZCBfX0FSR1MoKGNoYXJfdSAqbGluZXAsIGludCBsZW4pKTsKK2ludCBzeW5fY2hlY2tfZ3JvdXAgX19BUkdTKChjaGFyX3UgKnBwLCBpbnQgbGVuKSk7CitpbnQgc3luX2lkMmF0dHIgX19BUkdTKChpbnQgaGxfaWQpKTsKK2ludCBzeW5faWQyY29sb3JzIF9fQVJHUygoaW50IGhsX2lkLCBndWljb2xvcl9UICpmZ3AsIGd1aWNvbG9yX1QgKmJncCkpOworaW50IHN5bl9nZXRfZmluYWxfaWQgX19BUkdTKChpbnQgaGxfaWQpKTsKK3ZvaWQgaGlnaGxpZ2h0X2d1aV9zdGFydGVkIF9fQVJHUygodm9pZCkpOworaW50IGhpZ2hsaWdodF9jaGFuZ2VkIF9fQVJHUygodm9pZCkpOwordm9pZCBzZXRfY29udGV4dF9pbl9oaWdobGlnaHRfY21kIF9fQVJHUygoZXhwYW5kX1QgKnhwLCBjaGFyX3UgKmFyZykpOworY2hhcl91ICpnZXRfaGlnaGxpZ2h0X25hbWUgX19BUkdTKChleHBhbmRfVCAqeHAsIGludCBpZHgpKTsKK3ZvaWQgZnJlZV9oaWdobGlnaHRfZm9udHMgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by90YWcucHJvIGIvc3JjL3Byb3RvL3RhZy5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjMjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by90YWcucHJvCkBAIC0wLDAgKzEsOCBAQAorLyogdGFnLmMgKi8KK2ludCBkb190YWcgX19BUkdTKChjaGFyX3UgKnRhZywgaW50IHR5cGUsIGludCBjb3VudCwgaW50IGZvcmNlaXQsIGludCB2ZXJib3NlKSk7Cit2b2lkIHRhZ19mcmVlbWF0Y2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIGRvX3RhZ3MgX19BUkdTKChleGFyZ19UICplYXApKTsKK2ludCBmaW5kX3RhZ3MgX19BUkdTKChjaGFyX3UgKnBhdCwgaW50ICpudW1fbWF0Y2hlcywgY2hhcl91ICoqKm1hdGNoZXNwLCBpbnQgZmxhZ3MsIGludCBtaW5jb3VudCwgY2hhcl91ICpidWZfZmZuYW1lKSk7Cit2b2lkIHNpbXBsaWZ5X2ZpbGVuYW1lIF9fQVJHUygoY2hhcl91ICpmaWxlbmFtZSkpOworaW50IGV4cGFuZF90YWdzIF9fQVJHUygoaW50IHRhZ25hbWVzLCBjaGFyX3UgKnBhdCwgaW50ICpudW1fZmlsZSwgY2hhcl91ICoqKmZpbGUpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL3Rlcm0ucHJvIGIvc3JjL3Byb3RvL3Rlcm0ucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTI0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvdG8vdGVybS5wcm8KQEAgLTAsMCArMSw1OCBAQAorLyogdGVybS5jICovCitpbnQgc2V0X3Rlcm1uYW1lIF9fQVJHUygoY2hhcl91ICp0ZXJtKSk7Cit2b2lkIHNldF9tb3VzZV90ZXJtY29kZSBfX0FSR1MoKGludCBuLCBjaGFyX3UgKnMpKTsKK3ZvaWQgZGVsX21vdXNlX3Rlcm1jb2RlIF9fQVJHUygoaW50IG4pKTsKK3ZvaWQgZ2V0bGluZWNvbCBfX0FSR1MoKGxvbmcgKmNwLCBsb25nICpycCkpOworaW50IGFkZF90ZXJtY2FwX2VudHJ5IF9fQVJHUygoY2hhcl91ICpuYW1lLCBpbnQgZm9yY2UpKTsKK2ludCB0ZXJtX2lzXzhiaXQgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCB0ZXJtX2lzX2d1aSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworY2hhcl91ICp0bHRvYSBfX0FSR1MoKHVuc2lnbmVkIGxvbmcgaSkpOwordm9pZCB0ZXJtY2FwaW5pdCBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwordm9pZCBvdXRfZmx1c2ggX19BUkdTKCh2b2lkKSk7Cit2b2lkIG91dF9mbHVzaF9jaGVjayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgb3V0X3RyYXNoIF9fQVJHUygodm9pZCkpOwordm9pZCBvdXRfY2hhciBfX0FSR1MoKHVuc2lnbmVkIGMpKTsKK3ZvaWQgb3V0X3N0cl9uZiBfX0FSR1MoKGNoYXJfdSAqcykpOwordm9pZCBvdXRfc3RyIF9fQVJHUygoY2hhcl91ICpzKSk7Cit2b2lkIHRlcm1fd2luZGdvdG8gX19BUkdTKChpbnQgcm93LCBpbnQgY29sKSk7Cit2b2lkIHRlcm1fY3Vyc29yX3JpZ2h0IF9fQVJHUygoaW50IGkpKTsKK3ZvaWQgdGVybV9hcHBlbmRfbGluZXMgX19BUkdTKChpbnQgbGluZV9jb3VudCkpOwordm9pZCB0ZXJtX2RlbGV0ZV9saW5lcyBfX0FSR1MoKGludCBsaW5lX2NvdW50KSk7Cit2b2lkIHRlcm1fc2V0X3dpbnBvcyBfX0FSR1MoKGludCB4LCBpbnQgeSkpOwordm9pZCB0ZXJtX3NldF93aW5zaXplIF9fQVJHUygoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSk7Cit2b2lkIHRlcm1fZmdfY29sb3IgX19BUkdTKChpbnQgbikpOwordm9pZCB0ZXJtX2JnX2NvbG9yIF9fQVJHUygoaW50IG4pKTsKK3ZvaWQgdGVybV9zZXR0aXRsZSBfX0FSR1MoKGNoYXJfdSAqdGl0bGUpKTsKK3ZvaWQgdHRlc3QgX19BUkdTKChpbnQgcGFpcnMpKTsKK3ZvaWQgYWRkX2xvbmdfdG9fYnVmIF9fQVJHUygobG9uZ191IHZhbCwgY2hhcl91ICpkc3QpKTsKK3ZvaWQgY2hlY2tfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCB3aW5fbmV3X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2hlbGxfcmVzaXplZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2hlbGxfcmVzaXplZF9jaGVjayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc2V0X3NoZWxsc2l6ZSBfX0FSR1MoKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG11c3RzZXQpKTsKK3ZvaWQgc2V0dG1vZGUgX19BUkdTKChpbnQgdG1vZGUpKTsKK3ZvaWQgc3RhcnR0ZXJtY2FwIF9fQVJHUygodm9pZCkpOwordm9pZCBzdG9wdGVybWNhcCBfX0FSR1MoKHZvaWQpKTsKK2ludCBzd2FwcGluZ19zY3JlZW4gX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNldG1vdXNlIF9fQVJHUygodm9pZCkpOworaW50IG1vdXNlX2hhcyBfX0FSR1MoKGludCBjKSk7CitpbnQgbW91c2VfbW9kZWxfcG9wdXAgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHNjcm9sbF9zdGFydCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY3Vyc29yX29uIF9fQVJHUygodm9pZCkpOwordm9pZCBjdXJzb3Jfb2ZmIF9fQVJHUygodm9pZCkpOwordm9pZCBzY3JvbGxfcmVnaW9uX3NldCBfX0FSR1MoKHdpbl9UICp3cCwgaW50IG9mZikpOwordm9pZCBzY3JvbGxfcmVnaW9uX3Jlc2V0IF9fQVJHUygodm9pZCkpOwordm9pZCBjbGVhcl90ZXJtY29kZXMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGFkZF90ZXJtY29kZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgY2hhcl91ICpzdHJpbmcsIGludCB1c2VfOGJpdCkpOworY2hhcl91ICpmaW5kX3Rlcm1jb2RlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitjaGFyX3UgKmdldF90ZXJtY29kZSBfX0FSR1MoKGludCBpKSk7Cit2b2lkIGRlbF90ZXJtY29kZSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwordm9pZCBzZXRfbW91c2VfdG9wbGluZSBfX0FSR1MoKHdpbl9UICp3cCkpOworaW50IGNoZWNrX3Rlcm1jb2RlIF9fQVJHUygoaW50IG1heF9vZmZzZXQsIGNoYXJfdSAqYnVmLCBpbnQgYnVmbGVuKSk7CitjaGFyX3UgKnJlcGxhY2VfdGVybWNvZGVzIF9fQVJHUygoY2hhcl91ICpmcm9tLCBjaGFyX3UgKipidWZwLCBpbnQgZnJvbV9wYXJ0LCBpbnQgZG9fbHQpKTsKK2ludCBmaW5kX3Rlcm1fYnlrZXlzIF9fQVJHUygoY2hhcl91ICpzcmMpKTsKK3ZvaWQgc2hvd190ZXJtY29kZXMgX19BUkdTKCh2b2lkKSk7CitpbnQgc2hvd19vbmVfdGVybWNvZGUgX19BUkdTKChjaGFyX3UgKm5hbWUsIGNoYXJfdSAqY29kZSwgaW50IHByaW50aXQpKTsKK2NoYXJfdSAqdHJhbnNsYXRlX21hcHBpbmcgX19BUkdTKChjaGFyX3UgKnN0ciwgaW50IGV4cG1hcCkpOwordm9pZCB1cGRhdGVfdGNhcCBfX0FSR1MoKGludCBhdHRyKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by90ZXJtbGliLnBybyBiL3NyYy9wcm90by90ZXJtbGliLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzY5ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL3Rlcm1saWIucHJvCkBAIC0wLDAgKzEsOCBAQAorLyogdGVybWxpYi5jICovCitpbnQgdGdldGVudCBfX0FSR1MoKGNoYXIgKnRidWYsIGNoYXIgKnRlcm0pKTsKK2ludCB0Z2V0ZmxhZyBfX0FSR1MoKGNoYXIgKmlkKSk7CitpbnQgdGdldG51bSBfX0FSR1MoKGNoYXIgKmlkKSk7CitjaGFyICp0Z2V0c3RyIF9fQVJHUygoY2hhciAqaWQsIGNoYXIgKipidWYpKTsKK2NoYXIgKnRnb3RvIF9fQVJHUygoY2hhciAqY20sIGludCBjb2wsIGludCBsaW5lKSk7CitpbnQgdHB1dHMgX19BUkdTKChjaGFyICpjcCwgaW50IGFmZmNudCwgdm9pZCAoKm91dGMpKHVuc2lnbmVkIGludCkpKTsKKy8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL3VpLnBybyBiL3NyYy9wcm90by91aS5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyNWI2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by91aS5wcm8KQEAgLTAsMCArMSw2MSBAQAorLyogdWkuYyAqLwordm9pZCB1aV93cml0ZSBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOwordm9pZCB1aV9pbmNoYXJfdW5kbyBfX0FSR1MoKGNoYXJfdSAqcywgaW50IGxlbikpOworaW50IHVpX2luY2hhciBfX0FSR1MoKGNoYXJfdSAqYnVmLCBpbnQgbWF4bGVuLCBsb25nIHd0aW1lLCBpbnQgdGJfY2hhbmdlX2NudCkpOworaW50IHVpX2NoYXJfYXZhaWwgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVpX2RlbGF5IF9fQVJHUygobG9uZyBtc2VjLCBpbnQgaWdub3JlaW5wdXQpKTsKK3ZvaWQgdWlfc3VzcGVuZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgc3VzcGVuZF9zaGVsbCBfX0FSR1MoKHZvaWQpKTsKK2ludCB1aV9nZXRfc2hlbGxzaXplIF9fQVJHUygodm9pZCkpOwordm9pZCB1aV9zZXRfc2hlbGxzaXplIF9fQVJHUygoaW50IG11c3RzZXQpKTsKK3ZvaWQgdWlfbmV3X3NoZWxsc2l6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgdWlfYnJlYWtjaGVjayBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2xpcF9pbml0IF9fQVJHUygoaW50IGNhbl91c2UpKTsKK3ZvaWQgY2xpcF91cGRhdGVfc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBjbGlwX293bl9zZWxlY3Rpb24gX19BUkdTKChWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX2xvc2Vfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9jb3B5X3NlbGVjdGlvbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2xpcF9hdXRvX3NlbGVjdCBfX0FSR1MoKHZvaWQpKTsKK2ludCBjbGlwX2lzYXV0b3NlbCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY2xpcF9tb2RlbGVzcyBfX0FSR1MoKGludCBidXR0b24sIGludCBpc19jbGljaywgaW50IGlzX2RyYWcpKTsKK3ZvaWQgY2xpcF9zdGFydF9zZWxlY3Rpb24gX19BUkdTKChpbnQgY29sLCBpbnQgcm93LCBpbnQgcmVwZWF0ZWRfY2xpY2spKTsKK3ZvaWQgY2xpcF9wcm9jZXNzX3NlbGVjdGlvbiBfX0FSR1MoKGludCBidXR0b24sIGludCBjb2wsIGludCByb3csIGludF91IHJlcGVhdGVkX2NsaWNrKSk7Cit2b2lkIGNsaXBfbWF5X3JlZHJhd19zZWxlY3Rpb24gX19BUkdTKChpbnQgcm93LCBpbnQgY29sLCBpbnQgbGVuKSk7Cit2b2lkIGNsaXBfY2xlYXJfc2VsZWN0aW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBjbGlwX21heV9jbGVhcl9zZWxlY3Rpb24gX19BUkdTKChpbnQgcm93MSwgaW50IHJvdzIpKTsKK3ZvaWQgY2xpcF9zY3JvbGxfc2VsZWN0aW9uIF9fQVJHUygoaW50IHJvd3MpKTsKK3ZvaWQgY2xpcF9jb3B5X21vZGVsZXNzX3NlbGVjdGlvbiBfX0FSR1MoKGludCBib3RoKSk7CitpbnQgY2xpcF9nZW5fb3duX3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfZ2VuX2xvc2Vfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF9nZW5fc2V0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7Cit2b2lkIGNsaXBfZ2VuX3JlcXVlc3Rfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICpjYmQpKTsKK2ludCB2aW1faXNfaW5wdXRfYnVmX2Z1bGwgX19BUkdTKCh2b2lkKSk7CitpbnQgdmltX2lzX2lucHV0X2J1Zl9lbXB0eSBfX0FSR1MoKHZvaWQpKTsKK2ludCB2aW1fZnJlZV9pbl9pbnB1dF9idWYgX19BUkdTKCh2b2lkKSk7CitpbnQgdmltX3VzZWRfaW5faW5wdXRfYnVmIF9fQVJHUygodm9pZCkpOworY2hhcl91ICpnZXRfaW5wdXRfYnVmIF9fQVJHUygodm9pZCkpOwordm9pZCBzZXRfaW5wdXRfYnVmIF9fQVJHUygoY2hhcl91ICpwKSk7Cit2b2lkIGFkZF90b19pbnB1dF9idWYgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK3ZvaWQgYWRkX3RvX2lucHV0X2J1Zl9jc2kgX19BUkdTKChjaGFyX3UgKnN0ciwgaW50IGxlbikpOwordm9pZCBwdXNoX3Jhd19rZXkgX19BUkdTKChjaGFyX3UgKnMsIGludCBsZW4pKTsKK3ZvaWQgdHJhc2hfaW5wdXRfYnVmIF9fQVJHUygodm9pZCkpOworaW50IHJlYWRfZnJvbV9pbnB1dF9idWYgX19BUkdTKChjaGFyX3UgKmJ1ZiwgbG9uZyBtYXhsZW4pKTsKK3ZvaWQgZmlsbF9pbnB1dF9idWYgX19BUkdTKChpbnQgZXhpdF9vbl9lcnJvcikpOwordm9pZCByZWFkX2Vycm9yX2V4aXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVpX2N1cnNvcl9zaGFwZSBfX0FSR1MoKHZvaWQpKTsKK2ludCBjaGVja19jb2wgX19BUkdTKChpbnQgY29sKSk7CitpbnQgY2hlY2tfcm93IF9fQVJHUygoaW50IHJvdykpOwordm9pZCBvcGVuX2FwcF9jb250ZXh0IF9fQVJHUygodm9pZCkpOwordm9pZCB4MTFfc2V0dXBfYXRvbXMgX19BUkdTKChEaXNwbGF5ICpkcHkpKTsKK3ZvaWQgY2xpcF94MTFfcmVxdWVzdF9zZWxlY3Rpb24gX19BUkdTKChXaWRnZXQgbXlTaGVsbCwgRGlzcGxheSAqZHB5LCBWaW1DbGlwYm9hcmQgKmNiZCkpOwordm9pZCBjbGlwX3gxMV9sb3NlX3NlbGVjdGlvbiBfX0FSR1MoKFdpZGdldCBteVNoZWxsLCBWaW1DbGlwYm9hcmQgKmNiZCkpOworaW50IGNsaXBfeDExX293bl9zZWxlY3Rpb24gX19BUkdTKChXaWRnZXQgbXlTaGVsbCwgVmltQ2xpcGJvYXJkICpjYmQpKTsKK3ZvaWQgY2xpcF94MTFfc2V0X3NlbGVjdGlvbiBfX0FSR1MoKFZpbUNsaXBib2FyZCAqY2JkKSk7CitpbnQganVtcF90b19tb3VzZSBfX0FSR1MoKGludCBmbGFncywgaW50ICppbmNsdXNpdmUsIGludCB3aGljaF9idXR0b24pKTsKK2ludCBtb3VzZV9jb21wX3BvcyBfX0FSR1MoKHdpbl9UICp3aW4sIGludCAqcm93cCwgaW50ICpjb2xwLCBsaW5lbnJfVCAqbG51bXApKTsKK3dpbl9UICptb3VzZV9maW5kX3dpbiBfX0FSR1MoKGludCAqcm93cCwgaW50ICpjb2xwKSk7CitpbnQgZ2V0X2Zwb3Nfb2ZfbW91c2UgX19BUkdTKChwb3NfVCAqbXBvcykpOworaW50IHZjb2wyY29sIF9fQVJHUygod2luX1QgKndwLCBsaW5lbnJfVCBsbnVtLCBpbnQgdmNvbCkpOwordm9pZCB1aV9mb2N1c19jaGFuZ2UgX19BUkdTKChpbnQgaW5fZm9jdXMpKTsKK3ZvaWQgaW1fc2F2ZV9zdGF0dXMgX19BUkdTKChsb25nICpwc2F2ZSkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vdW5kby5wcm8gYi9zcmMvcHJvdG8vdW5kby5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMjMyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by91bmRvLnBybwpAQCAtMCwwICsxLDE4IEBACisvKiB1bmRvLmMgKi8KK2ludCB1X3NhdmVfY3Vyc29yIF9fQVJHUygodm9pZCkpOworaW50IHVfc2F2ZSBfX0FSR1MoKGxpbmVucl9UIHRvcCwgbGluZW5yX1QgYm90KSk7CitpbnQgdV9zYXZlc3ViIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IHVfaW5zc3ViIF9fQVJHUygobGluZW5yX1QgbG51bSkpOworaW50IHVfc2F2ZWRlbCBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGxvbmcgbmxpbmVzKSk7Cit2b2lkIHVfdW5kbyBfX0FSR1MoKGludCBjb3VudCkpOwordm9pZCB1X3JlZG8gX19BUkdTKChpbnQgY291bnQpKTsKK3ZvaWQgdV9zeW5jIF9fQVJHUygodm9pZCkpOwordm9pZCB1X3VuY2hhbmdlZCBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgdV9jbGVhcmFsbCBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgdV9zYXZlbGluZSBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK3ZvaWQgdV9jbGVhcmxpbmUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVfdW5kb2xpbmUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHVfYmxvY2tmcmVlIF9fQVJHUygoYnVmX1QgKmJ1ZikpOworaW50IGJ1ZklzQ2hhbmdlZCBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2ludCBjdXJidWZJc0NoYW5nZWQgX19BUkdTKCh2b2lkKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by92ZXJzaW9uLnBybyBiL3NyYy9wcm90by92ZXJzaW9uLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjM3MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL3ZlcnNpb24ucHJvCkBAIC0wLDAgKzEsOSBAQAorLyogdmVyc2lvbi5jICovCit2b2lkIG1ha2VfdmVyc2lvbiBfX0FSR1MoKHZvaWQpKTsKK2ludCBoaWdoZXN0X3BhdGNoIF9fQVJHUygodm9pZCkpOworaW50IGhhc19wYXRjaCBfX0FSR1MoKGludCBuKSk7Cit2b2lkIGV4X3ZlcnNpb24gX19BUkdTKChleGFyZ19UICplYXApKTsKK3ZvaWQgbGlzdF92ZXJzaW9uIF9fQVJHUygodm9pZCkpOwordm9pZCBpbnRyb19tZXNzYWdlIF9fQVJHUygoaW50IGNvbG9uKSk7Cit2b2lkIGV4X2ludHJvIF9fQVJHUygoZXhhcmdfVCAqZWFwKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by93aW5kb3cucHJvIGIvc3JjL3Byb3RvL3dpbmRvdy5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzYmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by93aW5kb3cucHJvCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHdpbmRvdy5jICovCit2b2lkIGRvX3dpbmRvdyBfX0FSR1MoKGludCBuY2hhciwgbG9uZyBQcmVudW0sIGludCB4Y2hhcikpOworaW50IHdpbl9zcGxpdCBfX0FSR1MoKGludCBzaXplLCBpbnQgZmxhZ3MpKTsKK2ludCB3aW5fdmFsaWQgX19BUkdTKCh3aW5fVCAqd2luKSk7CitpbnQgd2luX2NvdW50IF9fQVJHUygodm9pZCkpOworaW50IG1ha2Vfd2luZG93cyBfX0FSR1MoKGludCBjb3VudCwgaW50IHZlcnRpY2FsKSk7Cit2b2lkIHdpbl9tb3ZlX2FmdGVyIF9fQVJHUygod2luX1QgKndpbjEsIHdpbl9UICp3aW4yKSk7Cit2b2lkIHdpbl9lcXVhbCBfX0FSR1MoKHdpbl9UICpuZXh0X2N1cndpbiwgaW50IGN1cnJlbnQsIGludCBkaXIpKTsKK3ZvaWQgY2xvc2Vfd2luZG93cyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgd2luX2Nsb3NlIF9fQVJHUygod2luX1QgKndpbiwgaW50IGZyZWVfYnVmKSk7Cit2b2lkIGNsb3NlX290aGVycyBfX0FSR1MoKGludCBtZXNzYWdlLCBpbnQgZm9yY2VpdCkpOwordm9pZCB3aW5faW5pdCBfX0FSR1MoKHdpbl9UICp3cCkpOwordm9pZCB3aW5fYWxsb2NfZmlyc3QgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdpbl9nb3RvIF9fQVJHUygod2luX1QgKndwKSk7Cit3aW5fVCAqd2luX2ZpbmRfbnIgX19BUkdTKChpbnQgd2lubnIpKTsKK3ZvaWQgd2luX2VudGVyIF9fQVJHUygod2luX1QgKndwLCBpbnQgdW5kb19zeW5jKSk7Cit3aW5fVCAqYnVmX2p1bXBfb3Blbl93aW4gX19BUkdTKChidWZfVCAqYnVmKSk7CitpbnQgd2luX2FsbG9jX2xpbmVzIF9fQVJHUygod2luX1QgKndwKSk7Cit2b2lkIHdpbl9mcmVlX2xzaXplIF9fQVJHUygod2luX1QgKndwKSk7Cit2b2lkIHNoZWxsX25ld19yb3dzIF9fQVJHUygodm9pZCkpOwordm9pZCBzaGVsbF9uZXdfY29sdW1ucyBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgd2luX3NpemVfc2F2ZSBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgd2luX3NpemVfcmVzdG9yZSBfX0FSR1MoKGdhcnJheV9UICpnYXApKTsKK3ZvaWQgd2luX3NldGhlaWdodCBfX0FSR1MoKGludCBoZWlnaHQpKTsKK3ZvaWQgd2luX3NldGhlaWdodF93aW4gX19BUkdTKChpbnQgaGVpZ2h0LCB3aW5fVCAqd2luKSk7Cit2b2lkIHdpbl9zZXR3aWR0aCBfX0FSR1MoKGludCB3aWR0aCkpOwordm9pZCB3aW5fc2V0d2lkdGhfd2luIF9fQVJHUygoaW50IHdpZHRoLCB3aW5fVCAqd3ApKTsKK3ZvaWQgd2luX3NldG1pbmhlaWdodCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgd2luX2RyYWdfc3RhdHVzX2xpbmUgX19BUkdTKCh3aW5fVCAqZHJhZ3dpbiwgaW50IG9mZnNldCkpOwordm9pZCB3aW5fZHJhZ192c2VwX2xpbmUgX19BUkdTKCh3aW5fVCAqZHJhZ3dpbiwgaW50IG9mZnNldCkpOwordm9pZCB3aW5fY29tcF9zY3JvbGwgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3ZvaWQgY29tbWFuZF9oZWlnaHQgX19BUkdTKChsb25nIG9sZF9wX2NoKSk7Cit2b2lkIGxhc3Rfc3RhdHVzIF9fQVJHUygoaW50IG1vcmV3aW4pKTsKK2NoYXJfdSAqZmlsZV9uYW1lX2F0X2N1cnNvciBfX0FSR1MoKGludCBvcHRpb25zLCBsb25nIGNvdW50KSk7CitjaGFyX3UgKmZpbGVfbmFtZV9pbl9saW5lIF9fQVJHUygoY2hhcl91ICpsaW5lLCBpbnQgY29sLCBpbnQgb3B0aW9ucywgbG9uZyBjb3VudCwgY2hhcl91ICpyZWxfZm5hbWUpKTsKK2NoYXJfdSAqZmluZF9maWxlX25hbWVfaW5fcGF0aCBfX0FSR1MoKGNoYXJfdSAqcHRyLCBpbnQgbGVuLCBpbnQgb3B0aW9ucywgbG9uZyBjb3VudCwgY2hhcl91ICpyZWxfZm5hbWUpKTsKK2ludCBwYXRoX3dpdGhfdXJsIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOworaW50IHZpbV9pc0Fic05hbWUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCB2aW1fRnVsbE5hbWUgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbiwgaW50IGZvcmNlKSk7CitpbnQgbWluX3Jvd3MgX19BUkdTKCh2b2lkKSk7CitpbnQgb25seV9vbmVfd2luZG93IF9fQVJHUygodm9pZCkpOwordm9pZCBjaGVja19sbnVtcyBfX0FSR1MoKGludCBkb19jdXJ3aW4pKTsKK2ludCB3aW5faGFzdmVydHNwbGl0IF9fQVJHUygodm9pZCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vd29ya3Nob3AucHJvIGIvc3JjL3Byb3RvL3dvcmtzaG9wLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ExMDUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Byb3RvL3dvcmtzaG9wLnBybwpAQCAtMCwwICsxLDQ4IEBACisvKiB3b3Jrc2hvcC5jICovCit2b2lkIHdvcmtzaG9wX2luaXQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX3Bvc3Rpbml0IF9fQVJHUygodm9pZCkpOwordm9pZCBleF93c3ZlcmIgX19BUkdTKChleGFyZ19UICplYXApKTsKK2NoYXIgKndvcmtzaG9wX2dldF9lZGl0b3JfbmFtZSBfX0FSR1MoKHZvaWQpKTsKK2NoYXIgKndvcmtzaG9wX2dldF9lZGl0b3JfdmVyc2lvbiBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgd29ya3Nob3BfbG9hZF9maWxlIF9fQVJHUygoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lLCBjaGFyICpmcmFtZWlkKSk7Cit2b2lkIHdvcmtzaG9wX3JlbG9hZF9maWxlIF9fQVJHUygoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lKSk7Cit2b2lkIHdvcmtzaG9wX3Nob3dfZmlsZSBfX0FSR1MoKGNoYXIgKmZpbGVuYW1lKSk7Cit2b2lkIHdvcmtzaG9wX2dvdG9fbGluZSBfX0FSR1MoKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKSk7Cit2b2lkIHdvcmtzaG9wX2Zyb250X2ZpbGUgX19BUkdTKChjaGFyICpmaWxlbmFtZSkpOwordm9pZCB3b3Jrc2hvcF9zYXZlX2ZpbGUgX19BUkdTKChjaGFyICpmaWxlbmFtZSkpOwordm9pZCB3b3Jrc2hvcF9zYXZlX2ZpbGVzIF9fQVJHUygodm9pZCkpOwordm9pZCB3b3Jrc2hvcF9xdWl0IF9fQVJHUygodm9pZCkpOwordm9pZCB3b3Jrc2hvcF9taW5pbWl6ZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgd29ya3Nob3BfbWF4aW1pemUgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX2FkZF9tYXJrX3R5cGUgX19BUkdTKChpbnQgaWR4LCBjaGFyICpjb2xvcnNwZWMsIGNoYXIgKnNpZ24pKTsKK3ZvaWQgd29ya3Nob3Bfc2V0X21hcmsgX19BUkdTKChjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubywgaW50IG1hcmtJZCwgaW50IGlkeCkpOwordm9pZCB3b3Jrc2hvcF9jaGFuZ2VfbWFya190eXBlIF9fQVJHUygoY2hhciAqZmlsZW5hbWUsIGludCBtYXJrSWQsIGludCBpZHgpKTsKK3ZvaWQgd29ya3Nob3BfZ290b19tYXJrIF9fQVJHUygoY2hhciAqZmlsZW5hbWUsIGludCBtYXJrSWQsIGNoYXIgKm1lc3NhZ2UpKTsKK3ZvaWQgd29ya3Nob3BfZGVsZXRlX21hcmsgX19BUkdTKChjaGFyICpmaWxlbmFtZSwgaW50IG1hcmtJZCkpOworaW50IHdvcmtzaG9wX2dldF9tYXJrX2xpbmVubyBfX0FSR1MoKGNoYXIgKmZpbGVuYW1lLCBpbnQgbWFya0lkKSk7Cit2b2lkIHdvcmtzaG9wX21vdmVkX21hcmtzIF9fQVJHUygoY2hhciAqZmlsZW5hbWUpKTsKK2ludCB3b3Jrc2hvcF9nZXRfZm9udF9oZWlnaHQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX2Zvb3Rlcl9tZXNzYWdlIF9fQVJHUygoY2hhciAqbWVzc2FnZSwgaW50IHNldmVyaXR5KSk7Cit2b2lkIHdvcmtzaG9wX21lbnVfYmVnaW4gX19BUkdTKChjaGFyICpsYWJlbCkpOwordm9pZCB3b3Jrc2hvcF9zdWJtZW51X2JlZ2luIF9fQVJHUygoY2hhciAqbGFiZWwpKTsKK3ZvaWQgd29ya3Nob3Bfc3VibWVudV9lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX21lbnVfaXRlbSBfX0FSR1MoKGNoYXIgKmxhYmVsLCBjaGFyICp2ZXJiLCBjaGFyICphY2NlbGVyYXRvciwgY2hhciAqYWNjZWxlcmF0b3JUZXh0LCBjaGFyICpuYW1lLCBjaGFyICpmaWxlcG9zLCBjaGFyICpzZW5zaXRpdmUpKTsKK3ZvaWQgd29ya3Nob3BfbWVudV9lbmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX3Rvb2xiYXJfYmVnaW4gX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX3Rvb2xiYXJfZW5kIF9fQVJHUygodm9pZCkpOwordm9pZCB3b3Jrc2hvcF90b29sYmFyX2J1dHRvbiBfX0FSR1MoKGNoYXIgKmxhYmVsLCBjaGFyICp2ZXJiLCBjaGFyICpzZW5zZVZlcmIsIGNoYXIgKmZpbGVwb3MsIGNoYXIgKmhlbHAsIGNoYXIgKnNlbnNlLCBjaGFyICpmaWxlLCBjaGFyICpsZWZ0KSk7Cit2b2lkIHdvcmtzaG9wX2ZyYW1lX3NlbnNpdGl2aXRpZXMgX19BUkdTKChWZXJiU2Vuc2UgKnZzKSk7Cit2b2lkIHdvcmtzaG9wX3NldF9vcHRpb24gX19BUkdTKChjaGFyICpvcHRpb24sIGNoYXIgKnZhbHVlKSk7Cit2b2lkIHdvcmtzaG9wX2JhbGxvb25fbW9kZSBfX0FSR1MoKEJvb2xlYW4gb24pKTsKK3ZvaWQgd29ya3Nob3BfYmFsbG9vbl9kZWxheSBfX0FSR1MoKGludCBkZWxheSkpOwordm9pZCB3b3Jrc2hvcF9zaG93X2JhbGxvb25fdGlwIF9fQVJHUygoY2hhciAqdGlwKSk7Cit2b2lkIHdvcmtzaG9wX2hvdGtleXMgX19BUkdTKChCb29sZWFuIG9uKSk7CitpbnQgd29ya3Nob3BfZ2V0X3Bvc2l0aW9ucyBfX0FSR1MoKHZvaWQgKmNsaWVudERhdGEsIGNoYXIgKipmaWxlbmFtZSwgaW50ICpjdXJMaW5lLCBpbnQgKmN1ckNvbCwgaW50ICpzZWxTdGFydExpbmUsIGludCAqc2VsU3RhcnRDb2wsIGludCAqc2VsRW5kTGluZSwgaW50ICpzZWxFbmRDb2wsIGludCAqc2VsTGVuZ3RoLCBjaGFyICoqc2VsZWN0aW9uKSk7CitjaGFyICp3b3Jrc2hvcF90ZXN0X2dldGN1cnJlbnRmaWxlIF9fQVJHUygodm9pZCkpOworaW50IHdvcmtzaG9wX3Rlc3RfZ2V0Y3Vyc29ycm93IF9fQVJHUygodm9pZCkpOworaW50IHdvcmtzaG9wX3Rlc3RfZ2V0Y3Vyc29yY29sIF9fQVJHUygodm9pZCkpOworY2hhciAqd29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jyb3d0ZXh0IF9fQVJHUygodm9pZCkpOworY2hhciAqd29ya3Nob3BfdGVzdF9nZXRzZWxlY3RlZHRleHQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIHdvcmtzaG9wX3NhdmVfc2Vuc2l0aXZpdHkgX19BUkdTKChjaGFyICpmaWxlbmFtZSkpOwordm9pZCBmaW5kWW91cnNlbGYgX19BUkdTKChjaGFyICphcmd2MCkpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHR5LmMgYi9zcmMvcHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wdHkuYwpAQCAtMCwwICsxLDQyNSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKy8qCisgKiBUaGUgc3R1ZmYgaW4gdGhpcyBmaWxlIG1vc3RseSBjb21lcyBmcm9tIHRoZSAic2NyZWVuIiBwcm9ncmFtLgorICogSW5jbHVkZWQgd2l0aCBwZXJtaXNzaW9uIGZyb20gSnVlcmdlbiBXZWlnZXJ0LgorICogQ29waWVkIGZyb20gInB0eS5jIi4gICJwdXRlbnYuYyIgd2FzIHVzZWQgZm9yIHB1dGVudigpIGluIG1pc2MyLmMuCisgKgorICogSXQgaGFzIGJlZW4gbW9kaWZpZWQgdG8gd29yayBiZXR0ZXIgd2l0aCBWaW0uCisgKiBUaGUgcGFydHMgdGhhdCBhcmUgbm90IHVzZWQgaW4gVmltIGhhdmUgYmVlbiBkZWxldGVkLgorICogU2VlIHRoZSAic2NyZWVuIiBzb3VyY2VzIGZvciB0aGUgY29tcGxldGUgc3R1ZmYuCisgKi8KKworLyogQ29weXJpZ2h0IChjKSAxOTkzCisgKglKdWVyZ2VuIFdlaWdlcnQgKGpud2VpZ2VyQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorICoJTWljaGFlbCBTY2hyb2VkZXIgKG1sc2Nocm9lQGltbWQ0LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorICogQ29weXJpZ2h0IChjKSAxOTg3IE9saXZlciBMYXVtYW5uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoc2VlIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EKKyAqLworCisvKiBSQ1NfSUQoIiRJZCQgRkFVIikgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZkZWYgX19DWUdXSU4zMl9fCisjIGluY2x1ZGUgPHN5cy90ZXJtaW9zLmg+CisjZW5kaWYKKworI2lmIEhBVkVfU1lTX0lPQ1RMX0gKKyMgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2lmIEhBVkVfU1RST1BUU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgc2luaXgKKyNkZWZpbmUgYnVmX1QgX19zeXN0ZW1fYnVmX3RfXworI2VuZGlmCisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2lmZGVmIHNpbml4CisjdW5kZWYgYnVmX1QKKyNlbmRpZgorIyBpZmRlZiBzdW4KKyMgIGluY2x1ZGUgPHN5cy9jb25mLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmIEhBVkVfVEVSTUlPX0gKKyMgaW5jbHVkZSA8dGVybWlvLmg+CisjZWxzZQorIyBpZiBIQVZFX1RFUk1JT1NfSAorIyAgaW5jbHVkZSA8dGVybWlvcy5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19TVFJFQU1fSAorIyBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjZW5kaWYKKworI2lmIEhBVkVfU1lTX1BURU1fSAorIyBpbmNsdWRlIDxzeXMvcHRlbS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKFZNUykgJiYgIWRlZmluZWQoTUFDT1MpCisjIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChMT0NLUFRZKSAmJiAhZGVmaW5lZChUSU9DRVhDTCkKKyMgaW5jbHVkZSA8c3lzL3R0b2xkLmg+CisjZW5kaWYKKworI2lmZGVmIElTQworIyBpbmNsdWRlIDxzeXMvdHR5Lmg+CisjIGluY2x1ZGUgPHN5cy9zaW9jdGwuaD4KKyMgaW5jbHVkZSA8c3lzL3B0eS5oPgorI2VuZGlmCisKKyNpZmRlZiBzZ2kKKyMgaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9JTkNMVURFX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChocHV4KQorIyBkZWZpbmUgaHB1eAorI2VuZGlmCisKKy8qCisgKiBpZiBubyBQVFlSQU5HRVswMV0gaXMgaW4gdGhlIGNvbmZpZyBmaWxlLCB3ZSBwaWNrIGEgZGVmYXVsdAorICovCisjaWZuZGVmIFBUWVJBTkdFMAorIyBkZWZpbmUgUFRZUkFOR0UwICJxcHJzIgorI2VuZGlmCisjaWZuZGVmIFBUWVJBTkdFMQorIyBkZWZpbmUgUFRZUkFOR0UxICIwMTIzNDU2Nzg5YWJjZGVmIgorI2VuZGlmCisKKy8qIFNWUjQgcHNldWRvIHR0eXMgZG9uJ3Qgc2VlbSB0byB3b3JrIHdpdGggU0NPLTUgKi8KKyNpZmRlZiBNX1VOSVgKKyMgdW5kZWYgSEFWRV9TVlI0X1BUWVMKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0bWFzdGVyIF9fQVJHUygoaW50KSk7CisKKy8qCisgKiAgT3BlbiBhbGwgcHR5cyB3aXRoIE9fTk9DVFRZLCBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKKyAqICAoUklTQ29zIG1pcHMgYnJlYWtzIG90aGVyd2lzZSkKKyAqLworI2lmbmRlZiBPX05PQ1RUWQorIyBkZWZpbmUgT19OT0NUVFkgMAorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAoraW5pdG1hc3RlcihmKQorICAgIGludCBmOworeworI2lmbmRlZiBWTVMKKyMgaWZkZWYgUE9TSVgKKyAgICB0Y2ZsdXNoKGYsIFRDSU9GTFVTSCk7CisjIGVsc2UKKyMgIGlmZGVmIFRJT0NGTFVTSAorICAgICh2b2lkKWlvY3RsKGYsIFRJT0NGTFVTSCwgKGNoYXIgKikgMCk7CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBMT0NLUFRZCisgICAgKHZvaWQpaW9jdGwoZiwgVElPQ0VYQ0wsIChjaGFyICopIDApOworIyBlbmRpZgorI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIGNhdXNlcyBhIGhhbmcgb24gc29tZSBzeXN0ZW1zLCBidXQgaXMgcmVxdWlyZWQgZm9yIGEgcHJvcGVybHkgd29ya2luZworICogcHR5IG9uIG90aGVycy4gIE5lZWRzIHRvIGJlIHR1bmVkLi4uCisgKi8KKyAgICBpbnQKK1NldHVwU2xhdmVQVFkoZmQpCisgICAgaW50IGZkOworeworICAgIGlmIChmZCA8IDApCisJcmV0dXJuIDA7CisjaWYgZGVmaW5lZChJX1BVU0gpICYmIGRlZmluZWQoSEFWRV9TVlI0X1BUWVMpICYmICFkZWZpbmVkKHNnaSkgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKF9fb3NmX18pICYmICFkZWZpbmVkKE1fVU5JWCkKKyMgaWYgZGVmaW5lZChIQVZFX1NZU19QVEVNX0gpIHx8IGRlZmluZWQoaHB1eCkKKyAgICBpZiAoaW9jdGwoZmQsIElfUFVTSCwgInB0ZW0iKSAhPSAwKQorCXJldHVybiAtMTsKKyMgZW5kaWYKKyAgICBpZiAoaW9jdGwoZmQsIElfUFVTSCwgImxkdGVybSIpICE9IDApCisJcmV0dXJuIC0xOworIyBpZmRlZiBzdW4KKyAgICBpZiAoaW9jdGwoZmQsIElfUFVTSCwgInR0Y29tcGF0IikgIT0gMCkKKwlyZXR1cm4gLTE7CisjIGVuZGlmCisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChPU1gpICYmICFkZWZpbmVkKFBUWV9ET05FKQorI2RlZmluZSBQVFlfRE9ORQorICAgIGludAorT3BlblBUWSh0dHluKQorICAgIGNoYXIgKip0dHluOworeworICAgIGludAkJZjsKKyAgICBzdGF0aWMgY2hhciBUdHlOYW1lWzMyXTsKKworICAgIGlmICgoZiA9IG9wZW5fY29udHJvbGxpbmdfcHR5KFR0eU5hbWUpKSA8IDApCisJcmV0dXJuIC0xOworICAgIGluaXRtYXN0ZXIoZik7CisgICAgKnR0eW4gPSBUdHlOYW1lOworICAgIHJldHVybiBmOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChzZXF1ZW50KSB8fCBkZWZpbmVkKF9TRVFVRU5UXykpICYmIGRlZmluZWQoSEFWRV9HRVRQU0VVRE9UVFkpIFwKKwkmJiAhZGVmaW5lZChQVFlfRE9ORSkKKyNkZWZpbmUgUFRZX0RPTkUKKyAgICBpbnQKK09wZW5QVFkodHR5bikKKyAgICBjaGFyICoqdHR5bjsKK3sKKyAgICBjaGFyCSptLCAqczsKKyAgICBpbnQJCWY7CisgICAgLyogdXNlZCBmb3Igb3BlbmluZyBhIG5ldyBwdHktcGFpcjogKi8KKyAgICBzdGF0aWMgY2hhciBQdHlOYW1lWzMyXTsKKyAgICBzdGF0aWMgY2hhciBUdHlOYW1lWzMyXTsKKworICAgIGlmICgoZiA9IGdldHBzZXVkb3R0eSgmcywgJm0pKSA8IDApCisJcmV0dXJuIC0xOworI2lmZGVmIF9TRVFVRU5UXworICAgIGZ2aGFuZ3VwKHMpOworI2VuZGlmCisgICAgc3RybmNweShQdHlOYW1lLCBtLCBzaXplb2YoUHR5TmFtZSkpOworICAgIHN0cm5jcHkoVHR5TmFtZSwgcywgc2l6ZW9mKFR0eU5hbWUpKTsKKyAgICBpbml0bWFzdGVyKGYpOworICAgICp0dHluID0gVHR5TmFtZTsKKyAgICByZXR1cm4gZjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoUFRZX0RPTkUpCisjZGVmaW5lIFBUWV9ET05FCisgICAgaW50CitPcGVuUFRZKHR0eW4pCisgICAgY2hhciAqKnR0eW47Cit7CisgICAgaW50IGY7CisgICAgY2hhciAqbmFtZTsKKyAgICBSRVRTSUdUWVBFICgqc2lnY2xkKV9fQVJHUyhTSUdQUk9UT0FSRyk7CisKKyAgICAvKgorICAgICAqIFNJR0NITEQgc2V0IHRvIFNJR19ERkwgZm9yIF9nZXRwdHkoKSBiZWNhdXNlIGl0IG1heSBmb3JrKCkgYW5kCisgICAgICogZXhlYygpIC91c3IvYWRtL21rcHRzCisgICAgICovCisgICAgc2lnY2xkID0gc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworICAgIG5hbWUgPSBfZ2V0cHR5KCZmLCBPX1JEV1IgfCBPX05PTkJMT0NLIHwgT19FWFRSQSwgMDYwMCwgMCk7CisgICAgc2lnbmFsKFNJR0NITEQsIHNpZ2NsZCk7CisKKyAgICBpZiAobmFtZSA9PSAwKQorCXJldHVybiAtMTsKKyAgICBpbml0bWFzdGVyKGYpOworICAgICp0dHluID0gbmFtZTsKKyAgICByZXR1cm4gZjsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNSVBTKSAmJiBkZWZpbmVkKEhBVkVfREVWX1BUQykgJiYgIWRlZmluZWQoUFRZX0RPTkUpCisjZGVmaW5lIFBUWV9ET05FCisgICAgaW50CitPcGVuUFRZKHR0eW4pCisgICAgY2hhciAqKnR0eW47Cit7CisgICAgaW50CQlmOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAvKiB1c2VkIGZvciBvcGVuaW5nIGEgbmV3IHB0eS1wYWlyOiAqLworICAgIHN0YXRpYyBjaGFyIFR0eU5hbWVbMzJdOworCisgICAgaWYgKChmID0gb3BlbigiL2Rldi9wdGMiLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fTk9OQkxPQ0sgfCBPX0VYVFJBLCAwKSkgPCAwKQorCXJldHVybiAtMTsKKyAgICBpZiAobWNoX2ZzdGF0KGYsICZidWYpIDwgMCkKKyAgICB7CisJY2xvc2UoZik7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBzcHJpbnRmKFR0eU5hbWUsICIvZGV2L3R0eXElZCIsIG1pbm9yKGJ1Zi5zdF9yZGV2KSk7CisgICAgaW5pdG1hc3RlcihmKTsKKyAgICAqdHR5biA9IFR0eU5hbWU7CisgICAgcmV0dXJuIGY7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TVlI0X1BUWVMpICYmICFkZWZpbmVkKFBUWV9ET05FKSAmJiAhZGVmaW5lZChocHV4KQorCisvKiBOT1RFOiBFdmVuIHRob3VnaCBIUFVYIGNhbiBoYXZlIC9kZXYvcHRteCwgdGhlIGNvZGUgYmVsb3cgZG9lc24ndCB3b3JrISAqLworI2RlZmluZSBQVFlfRE9ORQorICAgIGludAorT3BlblBUWSh0dHluKQorICAgIGNoYXIgKip0dHluOworeworICAgIGludAkJZjsKKyAgICBjaGFyCSptLCAqcHRzbmFtZSgpOworICAgIGludCB1bmxvY2twdCBfX0FSR1MoKGludCkpLCBncmFudHB0IF9fQVJHUygoaW50KSk7CisgICAgUkVUU0lHVFlQRSAoKnNpZ2NsZClfX0FSR1MoU0lHUFJPVE9BUkcpOworICAgIC8qIHVzZWQgZm9yIG9wZW5pbmcgYSBuZXcgcHR5LXBhaXI6ICovCisgICAgc3RhdGljIGNoYXIgVHR5TmFtZVszMl07CisKKyAgICBpZiAoKGYgPSBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fRVhUUkEsIDApKSA9PSAtMSkKKwlyZXR1cm4gLTE7CisKKyAgICAvKgorICAgICAqIFNJR0NITEQgc2V0IHRvIFNJR19ERkwgZm9yIGdyYW50cHQoKSBiZWNhdXNlIGl0IGZvcmsoKXMgYW5kCisgICAgICogZXhlYygpcyBwdF9jaG1vZAorICAgICAqLworICAgIHNpZ2NsZCA9IHNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKyAgICBpZiAoKG0gPSBwdHNuYW1lKGYpKSA9PSBOVUxMIHx8IGdyYW50cHQoZikgfHwgdW5sb2NrcHQoZikpCisgICAgeworCXNpZ25hbChTSUdDSExELCBzaWdjbGQpOworCWNsb3NlKGYpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgc2lnbmFsKFNJR0NITEQsIHNpZ2NsZCk7CisgICAgc3RybmNweShUdHlOYW1lLCBtLCBzaXplb2YoVHR5TmFtZSkpOworICAgIGluaXRtYXN0ZXIoZik7CisgICAgKnR0eW4gPSBUdHlOYW1lOworICAgIHJldHVybiBmOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9BSVgpICYmIGRlZmluZWQoSEFWRV9ERVZfUFRDKSAmJiAhZGVmaW5lZChQVFlfRE9ORSkKKyNkZWZpbmUgUFRZX0RPTkUKKworI2lmZGVmIF9JQk1SMgoraW50IGFpeGhhY2sgPSAtMTsKKyNlbmRpZgorCisgICAgaW50CitPcGVuUFRZKHR0eW4pCisgICAgY2hhciAqKnR0eW47Cit7CisgICAgaW50CQlmOworICAgIC8qIHVzZWQgZm9yIG9wZW5pbmcgYSBuZXcgcHR5LXBhaXI6ICovCisgICAgc3RhdGljIGNoYXIgVHR5TmFtZVszMl07CisKKyAgICAvKiBhIGR1bWIgbG9va2luZyBsb29wIHJlcGxhY2VkIGJ5IG15Y3JvZnRzIGNvZGU6ICovCisgICAgaWYgKChmID0gb3BlbigiL2Rldi9wdGMiLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fRVhUUkEpKSA8IDApCisJcmV0dXJuIC0xOworICAgIHN0cm5jcHkoVHR5TmFtZSwgdHR5bmFtZShmKSwgc2l6ZW9mKFR0eU5hbWUpKTsKKyAgICBpZiAoZ2V0ZXVpZCgpICYmIG1jaF9hY2Nlc3MoVHR5TmFtZSwgUl9PSyB8IFdfT0spKQorICAgIHsKKwljbG9zZShmKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGluaXRtYXN0ZXIoZik7CisjIGlmZGVmIF9JQk1SMgorICAgIGlmIChhaXhoYWNrID49IDApCisJY2xvc2UoYWl4aGFjayk7CisgICAgaWYgKChhaXhoYWNrID0gb3BlbihUdHlOYW1lLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fRVhUUkEsIDApKSA8IDApCisgICAgeworCWNsb3NlKGYpOworCXJldHVybiAtMTsKKyAgICB9CisjIGVuZGlmCisgICAgKnR0eW4gPSBUdHlOYW1lOworICAgIHJldHVybiBmOworfQorI2VuZGlmCisKKyNpZm5kZWYgUFRZX0RPTkUKKworIyBpZmRlZiBocHV4CitzdGF0aWMgY2hhciBQdHlQcm90b1tdID0gIi9kZXYvcHR5bS9wdHlYWSI7CitzdGF0aWMgY2hhciBUdHlQcm90b1tdID0gIi9kZXYvcHR5L3R0eVhZIjsKKyMgZWxzZQorIyAgaWZkZWYgX19CRU9TX18KK3N0YXRpYyBjaGFyIFB0eVByb3RvW10gPSAiL2Rldi9wdC9YWSI7CitzdGF0aWMgY2hhciBUdHlQcm90b1tdID0gIi9kZXYvdHQvWFkiOworIyAgZWxzZQorc3RhdGljIGNoYXIgUHR5UHJvdG9bXSA9ICIvZGV2L3B0eVhZIjsKK3N0YXRpYyBjaGFyIFR0eVByb3RvW10gPSAiL2Rldi90dHlYWSI7CisjICBlbmRpZgorIyBlbmRpZgorCisgICAgaW50CitPcGVuUFRZKHR0eW4pCisgICAgY2hhciAqKnR0eW47Cit7CisgICAgY2hhcgkqcCwgKnEsICpsLCAqZDsKKyAgICBpbnQJCWY7CisgICAgLyogdXNlZCBmb3Igb3BlbmluZyBhIG5ldyBwdHktcGFpcjogKi8KKyAgICBzdGF0aWMgY2hhciBQdHlOYW1lWzMyXTsKKyAgICBzdGF0aWMgY2hhciBUdHlOYW1lWzMyXTsKKworICAgIHN0cmNweShQdHlOYW1lLCBQdHlQcm90byk7CisgICAgc3RyY3B5KFR0eU5hbWUsIFR0eVByb3RvKTsKKyAgICBmb3IgKHAgPSBQdHlOYW1lOyAqcCAhPSAnWCc7IHArKykKKwk7CisgICAgZm9yIChxID0gVHR5TmFtZTsgKnEgIT0gJ1gnOyBxKyspCisJOworICAgIGZvciAobCA9IFBUWVJBTkdFMDsgKCpwID0gKmwpICE9ICdcMCc7IGwrKykKKyAgICB7CisJZm9yIChkID0gUFRZUkFOR0UxOyAocFsxXSA9ICpkKSAhPSAnXDAnOyBkKyspCisJeworI2lmICFkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQorCSAgICBpZiAoKGYgPSBvcGVuKFB0eU5hbWUsIE9fUkRXUiB8IE9fTk9DVFRZIHwgT19FWFRSQSwgMCkpID09IC0xKQorI2Vsc2UKKwkgICAgaWYgKChmID0gb3BlbihQdHlOYW1lLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fRVhUUkEpKSA9PSAtMSkKKyNlbmRpZgorCQljb250aW51ZTsKKwkgICAgcVswXSA9ICpsOworCSAgICBxWzFdID0gKmQ7CisjaWZuZGVmIE1BQ09TCisJICAgIGlmIChnZXRldWlkKCkgJiYgbWNoX2FjY2VzcyhUdHlOYW1lLCBSX09LIHwgV19PSykpCisJICAgIHsKKwkJY2xvc2UoZik7CisJCWNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChUSU9DR1BHUlApICYmICFkZWZpbmVkKFNVTk9TMykKKwkgICAgLyogSGFjayB0byBlbnN1cmUgdGhhdCB0aGUgc2xhdmUgc2lkZSBvZiB0aGUgcHR5IGlzCisJICAgICAqIHVudXNlZC4gTWF5IG5vdCB3b3JrIGluIGFueXRoaW5nIG90aGVyIHRoYW4gU3VuT1M0LjEKKwkgICAgICovCisJICAgIHsKKwkJaW50IHBncnA7CisKKwkJLyogdGNnZXRwZ3JwIGRvZXMgbm90IHdvcmsgKHVzZXMgVElPQ0dFVFBHUlApISAqLworCQlpZiAoaW9jdGwoZiwgVElPQ0dQR1JQLCAoY2hhciAqKSZwZ3JwKSAhPSAtMSB8fCBlcnJubyAhPSBFSU8pCisJCXsKKwkJICAgIGNsb3NlKGYpOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorI2VuZGlmCisJICAgIGluaXRtYXN0ZXIoZik7CisJICAgICp0dHluID0gVHR5TmFtZTsKKwkgICAgcmV0dXJuIGY7CisJfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9xdWlja2ZpeC5jIGIvc3JjL3F1aWNrZml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYmMxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9xdWlja2ZpeC5jCkBAIC0wLDAgKzEsMjIzMiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogcXVpY2tmaXguYzogZnVuY3Rpb25zIGZvciBxdWlja2ZpeCBtb2RlLCB1c2luZyBhIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcworICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkgfHwgZGVmaW5lZChQUk9UTykKKworc3RydWN0IGRpcl9zdGFja19UCit7CisgICAgc3RydWN0IGRpcl9zdGFja19UCSpuZXh0OworICAgIGNoYXJfdQkJKmRpcm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGRpcl9zdGFja19UICAgKmRpcl9zdGFjayA9IE5VTEw7CisKKy8qCisgKiBmb3IgZWFjaCBlcnJvciB0aGUgbmV4dCBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFuZCBsaW5rZWQgaW4gYSBsaXN0CisgKi8KK3N0cnVjdCBxZl9saW5lCit7CisgICAgc3RydWN0IHFmX2xpbmUgICpxZl9uZXh0OwkvKiBwb2ludGVyIHRvIG5leHQgZXJyb3IgaW4gdGhlIGxpc3QgKi8KKyAgICBzdHJ1Y3QgcWZfbGluZSAgKnFmX3ByZXY7CS8qIHBvaW50ZXIgdG8gcHJldmlvdXMgZXJyb3IgaW4gdGhlIGxpc3QgKi8KKyAgICBsaW5lbnJfVAkgICAgIHFmX2xudW07CS8qIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCAqLworICAgIGludAkJICAgICBxZl9mbnVtOwkvKiBmaWxlIG51bWJlciBmb3IgdGhlIGxpbmUgKi8KKyAgICBpbnQJCSAgICAgcWZfY29sOwkvKiBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkICovCisgICAgaW50CQkgICAgIHFmX25yOwkvKiBlcnJvciBudW1iZXIgKi8KKyAgICBjaGFyX3UJICAgICpxZl90ZXh0OwkvKiBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgKi8KKyAgICBjaGFyX3UJICAgICBxZl92aXJ0X2NvbDsgLyogc2V0IHRvIFRSVUUgaWYgcWZfY29sIGlzIHNjcmVlbiBjb2x1bW4gKi8KKyAgICBjaGFyX3UJICAgICBxZl9jbGVhcmVkOy8qIHNldCB0byBUUlVFIGlmIGxpbmUgaGFzIGJlZW4gZGVsZXRlZCAqLworICAgIGNoYXJfdQkgICAgIHFmX3R5cGU7CS8qIHR5cGUgb2YgdGhlIGVycm9yIChtb3N0bHkgJ0UnKTsgMSBmb3IKKwkJCQkgICA6aGVscGdyZXAgKi8KKyAgICBjaGFyX3UJICAgICBxZl92YWxpZDsJLyogdmFsaWQgZXJyb3IgbWVzc2FnZSBkZXRlY3RlZCAqLworfTsKKworLyoKKyAqIFRoZXJlIGlzIGEgc3RhY2sgb2YgZXJyb3IgbGlzdHMuCisgKi8KKyNkZWZpbmUgTElTVENPVU5UICAgMTAKKworc3RydWN0IHFmX2xpc3QKK3sKKyAgICBzdHJ1Y3QgcWZfbGluZSAqcWZfc3RhcnQ7CS8qIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVycm9yICovCisgICAgc3RydWN0IHFmX2xpbmUgKnFmX3B0cjsJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBlcnJvciAqLworICAgIGludCAgcWZfY291bnQ7CQkvKiBudW1iZXIgb2YgZXJyb3JzICgwIG1lYW5zIG5vIGVycm9yIGxpc3QpICovCisgICAgaW50ICBxZl9pbmRleDsJCS8qIGN1cnJlbnQgaW5kZXggaW4gdGhlIGVycm9yIGxpc3QgKi8KKyAgICBpbnQgIHFmX25vbmV2YWxpZDsJCS8qIFRSVUUgaWYgbm90IGEgc2luZ2xlIHZhbGlkIGVudHJ5IGZvdW5kICovCit9IHFmX2xpc3RzW0xJU1RDT1VOVF07CisKK3N0YXRpYyBpbnQJcWZfY3VybGlzdCA9IDA7CS8qIGN1cnJlbnQgZXJyb3IgbGlzdCAqLworc3RhdGljIGludAlxZl9saXN0Y291bnQgPSAwOyAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGxpc3RzICovCisKKyNkZWZpbmUgRk1UX1BBVFRFUk5TIDkJCS8qIG1heGltdW0gbnVtYmVyIG9mICUgcmVjb2duaXplZCAqLworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgaW5mbyBvZiBvbmUgcGFydCBvZiAnZXJyb3Jmb3JtYXQnCisgKi8KK3N0cnVjdCBlZm9ybWF0Cit7CisgICAgcmVncHJvZ19UCSAgICAqcHJvZzsJLyogcHJlLWZvcm1hdHRlZCBwYXJ0IG9mICdlcnJvcmZvcm1hdCcgKi8KKyAgICBzdHJ1Y3QgZWZvcm1hdCAgKm5leHQ7CS8qIHBvaW50ZXIgdG8gbmV4dCAoTlVMTCBpZiBsYXN0KSAqLworICAgIGNoYXJfdQkgICAgYWRkcltGTVRfUEFUVEVSTlNdOyAvKiBpbmRpY2VzIG9mIHVzZWQgJSBwYXR0ZXJucyAqLworICAgIGNoYXJfdQkgICAgcHJlZml4OwkvKiBwcmVmaXggb2YgdGhpcyBmb3JtYXQgbGluZTogKi8KKwkJCQkvKiAgICdEJyBlbnRlciBkaXJlY3RvcnkgKi8KKwkJCQkvKiAgICdYJyBsZWF2ZSBkaXJlY3RvcnkgKi8KKwkJCQkvKiAgICdBJyBzdGFydCBvZiBtdWx0aS1saW5lIG1lc3NhZ2UgKi8KKwkJCQkvKiAgICdFJyBlcnJvciBtZXNzYWdlICovCisJCQkJLyogICAnVycgd2FybmluZyBtZXNzYWdlICovCisJCQkJLyogICAnSScgaW5mb3JtYXRpb25hbCBtZXNzYWdlICovCisJCQkJLyogICAnQycgY29udGludWF0aW9uIGxpbmUgKi8KKwkJCQkvKiAgICdaJyBlbmQgb2YgbXVsdGktbGluZSBtZXNzYWdlICovCisJCQkJLyogICAnRycgZ2VuZXJhbCwgdW5zcGVjaWZpYyBtZXNzYWdlICovCisJCQkJLyogICAnUCcgcHVzaCBmaWxlIChwYXJ0aWFsKSBtZXNzYWdlICovCisJCQkJLyogICAnUScgcG9wL3F1aXQgZmlsZSAocGFydGlhbCkgbWVzc2FnZSAqLworCQkJCS8qICAgJ08nIG92ZXJyZWFkIChwYXJ0aWFsKSBtZXNzYWdlICovCisgICAgY2hhcl91CSAgICBmbGFnczsJLyogYWRkaXRpb25hbCBmbGFncyBnaXZlbiBpbiBwcmVmaXggKi8KKwkJCQkvKiAgICctJyBkbyBub3QgaW5jbHVkZSB0aGlzIGxpbmUgKi8KK307CisKK3N0YXRpYyB2b2lkCXFmX25ld19saXN0IF9fQVJHUygodm9pZCkpOworc3RhdGljIGludAlxZl9hZGRfZW50cnkgX19BUkdTKChzdHJ1Y3QgcWZfbGluZSAqKnByZXZwLCBjaGFyX3UgKmRpciwgY2hhcl91ICpmbmFtZSwgY2hhcl91ICptZXNnLCBsb25nIGxudW0sIGludCBjb2wsIGludCB2aXJ0X2NvbCwgaW50IG5yLCBpbnQgdHlwZSwgaW50IHZhbGlkKSk7CitzdGF0aWMgdm9pZAlxZl9tc2cgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlxZl9mcmVlIF9fQVJHUygoaW50IGlkeCkpOworc3RhdGljIGNoYXJfdQkqcWZfdHlwZXMgX19BUkdTKChpbnQsIGludCkpOworc3RhdGljIGludAlxZl9nZXRfZm51bSBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOworc3RhdGljIGNoYXJfdQkqcWZfcHVzaF9kaXIgX19BUkdTKChjaGFyX3UgKiwgc3RydWN0IGRpcl9zdGFja19UICoqKSk7CitzdGF0aWMgY2hhcl91CSpxZl9wb3BfZGlyIF9fQVJHUygoc3RydWN0IGRpcl9zdGFja19UICoqKSk7CitzdGF0aWMgY2hhcl91CSpxZl9ndWVzc19maWxlcGF0aCBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgdm9pZAlxZl9mbXRfdGV4dCBfX0FSR1MoKGNoYXJfdSAqdGV4dCwgY2hhcl91ICpidWYsIGludCBidWZzaXplKSk7CitzdGF0aWMgdm9pZAlxZl9jbGVhbl9kaXJfc3RhY2sgX19BUkdTKChzdHJ1Y3QgZGlyX3N0YWNrX1QgKiopKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKK3N0YXRpYyBpbnQJcWZfd2luX3Bvc191cGRhdGUgX19BUkdTKChpbnQgb2xkX3FmX2luZGV4KSk7CitzdGF0aWMgYnVmX1QJKnFmX2ZpbmRfYnVmIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQJcWZfdXBkYXRlX2J1ZmZlciBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCXFmX2ZpbGxfYnVmZmVyIF9fQVJHUygodm9pZCkpOworI2VuZGlmCitzdGF0aWMgY2hhcl91CSpnZXRfbWVmX25hbWUgX19BUkdTKCh2b2lkKSk7CisKKy8qCisgKiBSZWFkIHRoZSBlcnJvcmZpbGUgaW50byBtZW1vcnksIGxpbmUgYnkgbGluZSwgYnVpbGRpbmcgdGhlIGVycm9yIGxpc3QuCisgKiBSZXR1cm4gLTEgZm9yIGVycm9yLCBudW1iZXIgb2YgZXJyb3JzIGZvciBzdWNjZXNzLgorICovCisgICAgaW50CitxZl9pbml0KGVmaWxlLCBlcnJvcmZvcm1hdCwgbmV3bGlzdCkKKyAgICBjaGFyX3UJICAgICplZmlsZTsKKyAgICBjaGFyX3UJICAgICplcnJvcmZvcm1hdDsKKyAgICBpbnQJCSAgICBuZXdsaXN0OwkJLyogVFJVRTogc3RhcnQgYSBuZXcgZXJyb3IgbGlzdCAqLworeworICAgIGNoYXJfdQkgICAgKm5hbWVidWY7CisgICAgY2hhcl91CSAgICAqZXJybXNnOworICAgIGNoYXJfdQkgICAgKmZtdHN0ciA9IE5VTEw7CisgICAgaW50CQkgICAgY29sID0gMDsKKyAgICBjaGFyX3UJICAgIHVzZV92aXJ0X2NvbCA9IEZBTFNFOworICAgIGludAkJICAgIHR5cGUgPSAwOworICAgIGludAkJICAgIHZhbGlkOworICAgIGxvbmcJICAgIGxudW0gPSAwTDsKKyAgICBpbnQJCSAgICBlbnIgPSAwOworICAgIEZJTEUJICAgICpmZDsKKyAgICBzdHJ1Y3QgcWZfbGluZSAgKnFmcHJldiA9IE5VTEw7CS8qIGluaXQgdG8gbWFrZSBTQVNDIHNodXQgdXAgKi8KKyAgICBjaGFyX3UJICAgICplZm1wOworICAgIHN0cnVjdCBlZm9ybWF0ICAqZm10X2ZpcnN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgZWZvcm1hdCAgKmZtdF9sYXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgZWZvcm1hdCAgKmZtdF9wdHI7CisgICAgY2hhcl91CSAgICAqZWZtOworICAgIGNoYXJfdQkgICAgKnB0cjsKKyAgICBjaGFyX3UJICAgICpzcmNwdHI7CisgICAgaW50CQkgICAgbGVuOworICAgIGludAkJICAgIGk7CisgICAgaW50CQkgICAgcm91bmQ7CisgICAgaW50CQkgICAgaWR4ID0gMDsKKyAgICBpbnQJCSAgICBtdWx0aWxpbmUgPSBGQUxTRTsKKyAgICBpbnQJCSAgICBtdWx0aWlnbm9yZSA9IEZBTFNFOworICAgIGludAkJICAgIG11bHRpc2NhbiA9IEZBTFNFOworICAgIGludAkJICAgIHJldHZhbCA9IC0xOwkvKiBkZWZhdWx0OiByZXR1cm4gZXJyb3IgZmxhZyAqLworICAgIGNoYXJfdQkgICAgKmRpcmVjdG9yeSA9IE5VTEw7CisgICAgY2hhcl91CSAgICAqY3VycmZpbGUgPSBOVUxMOworICAgIGNoYXJfdQkgICAgKnRhaWwgPSBOVUxMOworICAgIHN0cnVjdCBkaXJfc3RhY2tfVCAgKmZpbGVfc3RhY2sgPSBOVUxMOworICAgIHJlZ21hdGNoX1QJICAgIHJlZ21hdGNoOworICAgIHN0YXRpYyBzdHJ1Y3QgZm10cGF0dGVybgorICAgIHsKKwljaGFyX3UJY29udmNoYXI7CisJY2hhcgkqcGF0dGVybjsKKyAgICB9CQkgICAgZm10X3BhdFtGTVRfUEFUVEVSTlNdID0KKwkJICAgIHsKKwkJCXsnZicsICJcXGZcXCsifSwKKwkJCXsnbicsICJcXGRcXCsifSwKKwkJCXsnbCcsICJcXGRcXCsifSwKKwkJCXsnYycsICJcXGRcXCsifSwKKwkJCXsndCcsICIuIn0sCisJCQl7J20nLCAiLlxcKyJ9LAorCQkJeydyJywgIi4qIn0sCisJCQl7J3AnLCAiWy0gLl0qIn0sCisJCQl7J3YnLCAiXFxkXFwrIn0KKwkJICAgIH07CisKKyAgICBpZiAoZWZpbGUgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKworICAgIG5hbWVidWYgPSBhbGxvYyhDTURCVUZGU0laRSArIDEpOworICAgIGVycm1zZyA9IGFsbG9jKENNREJVRkZTSVpFICsgMSk7CisgICAgaWYgKG5hbWVidWYgPT0gTlVMTCB8fCBlcnJtc2cgPT0gTlVMTCkKKwlnb3RvIHFmX2luaXRfZW5kOworCisgICAgaWYgKChmZCA9IG1jaF9mb3BlbigoY2hhciAqKWVmaWxlLCAiciIpKSA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKGVfb3BlbmVycmYpLCBlZmlsZSk7CisJZ290byBxZl9pbml0X2VuZDsKKyAgICB9CisKKyAgICBpZiAobmV3bGlzdCB8fCBxZl9jdXJsaXN0ID09IHFmX2xpc3Rjb3VudCkKKwkvKiBtYWtlIHBsYWNlIGZvciBhIG5ldyBsaXN0ICovCisJcWZfbmV3X2xpc3QoKTsKKyAgICBlbHNlIGlmIChxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudCA+IDApCisJLyogQWRkaW5nIHRvIGV4aXN0aW5nIGxpc3QsIGZpbmQgbGFzdCBlbnRyeS4gKi8KKwlmb3IgKHFmcHJldiA9IHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX3N0YXJ0OworCQkJICAgIHFmcHJldi0+cWZfbmV4dCAhPSBxZnByZXY7IHFmcHJldiA9IHFmcHJldi0+cWZfbmV4dCkKKwkgICAgOworCisvKgorICogRWFjaCBwYXJ0IG9mIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBlcnJvcmZvcm1hdCB0bworICogcmVnZXggcHJvZy4gIE9ubHkgYSBmZXcgJSBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkLgorICovCisgICAgLyogVXNlIHRoZSBsb2NhbCB2YWx1ZSBvZiAnZXJyb3Jmb3JtYXQnIGlmIGl0J3Mgc2V0LiAqLworICAgIGlmIChlcnJvcmZvcm1hdCA9PSBwX2VmbSAmJiAqY3VyYnVmLT5iX3BfZWZtICE9IE5VTCkKKwllZm0gPSBjdXJidWYtPmJfcF9lZm07CisgICAgZWxzZQorCWVmbSA9IGVycm9yZm9ybWF0OworICAgIC8qCisgICAgICogR2V0IHNvbWUgc3BhY2UgdG8gbW9kaWZ5IHRoZSBmb3JtYXQgc3RyaW5nIGludG8uCisgICAgICovCisgICAgaSA9IChGTVRfUEFUVEVSTlMgKiAzKSArICgoaW50KVNUUkxFTihlZm0pIDw8IDIpOworICAgIGZvciAocm91bmQgPSBGTVRfUEFUVEVSTlM7IHJvdW5kID4gMDsgKQorCWkgKz0gKGludClTVFJMRU4oZm10X3BhdFstLXJvdW5kXS5wYXR0ZXJuKTsKKyNpZmRlZiBDT0xPTl9JTl9GSUxFTkFNRQorICAgIGkgKz0gMTI7IC8qICIlZiIgY2FuIGJlY29tZSB0d2VsdmUgY2hhcnMgbG9uZ2VyICovCisjZWxzZQorICAgIGkgKz0gMjsgLyogIiVmIiBjYW4gYmVjb21lIHR3byBjaGFycyBsb25nZXIgKi8KKyNlbmRpZgorICAgIGlmICgoZm10c3RyID0gYWxsb2MoaSkpID09IE5VTEwpCisJZ290byBlcnJvcjI7CisKKyAgICB3aGlsZSAoZWZtWzBdKQorICAgIHsKKwkvKgorCSAqIEFsbG9jYXRlIGEgbmV3IGVmb3JtYXQgc3RydWN0dXJlIGFuZCBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorCSAqLworCWZtdF9wdHIgPSAoc3RydWN0IGVmb3JtYXQgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKHN0cnVjdCBlZm9ybWF0KSk7CisJaWYgKGZtdF9wdHIgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcjI7CisJaWYgKGZtdF9maXJzdCA9PSBOVUxMKQkgICAgLyogZmlyc3Qgb25lICovCisJICAgIGZtdF9maXJzdCA9IGZtdF9wdHI7CisJZWxzZQorCSAgICBmbXRfbGFzdC0+bmV4dCA9IGZtdF9wdHI7CisJZm10X2xhc3QgPSBmbXRfcHRyOworCWZtdF9wdHItPnByZWZpeCA9IE5VTDsKKwlmbXRfcHRyLT5mbGFncyA9IE5VTDsKKwlmbXRfcHRyLT5uZXh0ID0gTlVMTDsKKwlmbXRfcHRyLT5wcm9nID0gTlVMTDsKKwlmb3IgKHJvdW5kID0gRk1UX1BBVFRFUk5TOyByb3VuZCA+IDA7ICkKKwkgICAgZm10X3B0ci0+YWRkclstLXJvdW5kXSA9IE5VTDsKKwkvKiByb3VuZCBpcyAwIG5vdyAqLworCisJLyoKKwkgKiBJc29sYXRlIG9uZSBwYXJ0IGluIHRoZSAnZXJyb3Jmb3JtYXQnIG9wdGlvbgorCSAqLworCWZvciAobGVuID0gMDsgZWZtW2xlbl0gIT0gTlVMICYmIGVmbVtsZW5dICE9ICcsJzsgKytsZW4pCisJICAgIGlmIChlZm1bbGVuXSA9PSAnXFwnICYmIGVmbVtsZW4gKyAxXSAhPSBOVUwpCisJCSsrbGVuOworCisJLyoKKwkgKiBCdWlsZCByZWdleHAgcGF0dGVybiBmcm9tIGN1cnJlbnQgJ2Vycm9yZm9ybWF0JyBvcHRpb24KKwkgKi8KKwlwdHIgPSBmbXRzdHI7CisJKnB0cisrID0gJ14nOworCWZvciAoZWZtcCA9IGVmbTsgZWZtcCA8IGVmbSArIGxlbjsgKytlZm1wKQorCXsKKwkgICAgaWYgKCplZm1wID09ICclJykKKwkgICAgeworCQkrK2VmbXA7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgRk1UX1BBVFRFUk5TOyArK2lkeCkKKwkJICAgIGlmIChmbXRfcGF0W2lkeF0uY29udmNoYXIgPT0gKmVmbXApCisJCQlicmVhazsKKwkJaWYgKGlkeCA8IEZNVF9QQVRURVJOUykKKwkJeworCQkgICAgaWYgKGZtdF9wdHItPmFkZHJbaWR4XSkKKwkJICAgIHsKKwkJCXNwcmludGYoKGNoYXIgKillcnJtc2csCisJCQkJXygiRTM3MjogVG9vIG1hbnkgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIiksICplZm1wKTsKKwkJCUVNU0coZXJybXNnKTsKKwkJCWdvdG8gZXJyb3IyOworCQkgICAgfQorCQkgICAgaWYgKChpZHgKKwkJCQkmJiBpZHggPCA2CisJCQkJJiYgdmltX3N0cmNocigoY2hhcl91ICopIkRYT1BRIiwKKwkJCQkJCSAgICAgZm10X3B0ci0+cHJlZml4KSAhPSBOVUxMKQorCQkJICAgIHx8IChpZHggPT0gNgorCQkJCSYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJPUFEiLAorCQkJCQkJICAgIGZtdF9wdHItPnByZWZpeCkgPT0gTlVMTCkpCisJCSAgICB7CisJCQlzcHJpbnRmKChjaGFyICopZXJybXNnLAorCQkJCV8oIkUzNzM6IFVuZXhwZWN0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIiksICplZm1wKTsKKwkJCUVNU0coZXJybXNnKTsKKwkJCWdvdG8gZXJyb3IyOworCQkgICAgfQorCQkgICAgZm10X3B0ci0+YWRkcltpZHhdID0gKGNoYXJfdSkrK3JvdW5kOworCQkgICAgKnB0cisrID0gJ1xcJzsKKwkJICAgICpwdHIrKyA9ICcoJzsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKwkJICAgIGlmICgqZWZtcCA9PSAnZicpCisJCSAgICB7CisJCQkvKiBBbHNvIG1hdGNoICJjOiIgaW4gdGhlIGZpbGUgbmFtZSwgZXZlbiB3aGVuCisJCQkgKiBjaGVja2luZyBmb3IgYSBjb2xvbiBuZXh0OiAiJWY6Ii4KKwkJCSAqICJcJShcYTpcKVw9IiAqLworCQkJU1RSQ1BZKHB0ciwgIlxcJShcXGE6XFwpXFw9Iik7CisJCQlwdHIgKz0gMTA7CisJCSAgICB9CisjZW5kaWYKKwkJICAgIGlmICgqZWZtcCA9PSAnZicgJiYgZWZtcFsxXSAhPSBOVUwKKwkJCQkJICYmIGVmbXBbMV0gIT0gJ1xcJyAmJiBlZm1wWzFdICE9ICclJykKKwkJICAgIHsKKwkJCS8qIEEgZmlsZSBuYW1lIG1heSBjb250YWluIHNwYWNlcywgYnV0IHRoaXMgaXNuJ3QgaW4KKwkJCSAqICJcZiIuICB1c2UgIlteeF1cKyIgaW5zdGVhZCAoeCBpcyBuZXh0IGNoYXJhY3RlcikgKi8KKwkJCSpwdHIrKyA9ICdbJzsKKwkJCSpwdHIrKyA9ICdeJzsKKwkJCSpwdHIrKyA9IGVmbXBbMV07CisJCQkqcHRyKysgPSAnXSc7CisJCQkqcHRyKysgPSAnXFwnOworCQkJKnB0cisrID0gJysnOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJc3JjcHRyID0gKGNoYXJfdSAqKWZtdF9wYXRbaWR4XS5wYXR0ZXJuOworCQkJd2hpbGUgKCgqcHRyID0gKnNyY3B0cisrKSAhPSBOVUwpCisJCQkgICAgKytwdHI7CisJCSAgICB9CisJCSAgICAqcHRyKysgPSAnXFwnOworCQkgICAgKnB0cisrID0gJyknOworCQl9CisJCWVsc2UgaWYgKCplZm1wID09ICcqJykKKwkJeworCQkgICAgaWYgKCorK2VmbXAgPT0gJ1snIHx8ICplZm1wID09ICdcXCcpCisJCSAgICB7CisJCQlpZiAoKCpwdHIrKyA9ICplZm1wKSA9PSAnWycpCS8qICUqW15hLXowLTldIGV0Yy4gKi8KKwkJCXsKKwkJCSAgICBpZiAoZWZtcFsxXSA9PSAnXicpCisJCQkJKnB0cisrID0gKisrZWZtcDsKKwkJCSAgICBpZiAoZWZtcCA8IGVmbSArIGxlbikKKwkJCSAgICB7CisJCQkJKnB0cisrID0gKisrZWZtcDsJICAgIC8qIGNvdWxkIGJlICddJyAqLworCQkJCXdoaWxlIChlZm1wIDwgZWZtICsgbGVuCisJCQkJCSYmICgqcHRyKysgPSAqKytlZm1wKSAhPSAnXScpCisJCQkJICAgIC8qIHNraXAgKi87CisJCQkJaWYgKGVmbXAgPT0gZWZtICsgbGVuKQorCQkJCXsKKwkJCQkgICAgRU1TRyhfKCJFMzc0OiBNaXNzaW5nIF0gaW4gZm9ybWF0IHN0cmluZyIpKTsKKwkJCQkgICAgZ290byBlcnJvcjI7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJCWVsc2UgaWYgKGVmbXAgPCBlZm0gKyBsZW4pCS8qICUqXEQsICUqXHMgZXRjLiAqLworCQkJICAgICpwdHIrKyA9ICorK2VmbXA7CisJCQkqcHRyKysgPSAnXFwnOworCQkJKnB0cisrID0gJysnOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogVE9ETzogc2NhbmYoKS1saWtlOiAlKnVkLCAlKjNjLCAlKmYsIC4uLiA/ICovCisJCQlzcHJpbnRmKChjaGFyICopZXJybXNnLAorCQkJCV8oIkUzNzU6IFVuc3VwcG9ydGVkICUlJWMgaW4gZm9ybWF0IHN0cmluZyIpLCAqZWZtcCk7CisJCQlFTVNHKGVycm1zZyk7CisJCQlnb3RvIGVycm9yMjsKKwkJICAgIH0KKwkJfQorCQllbHNlIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiJVxcLl4kflsiLCAqZWZtcCkgIT0gTlVMTCkKKwkJICAgICpwdHIrKyA9ICplZm1wOwkJLyogcmVnZXhwIG1hZ2ljIGNoYXJhY3RlcnMgKi8KKwkJZWxzZSBpZiAoKmVmbXAgPT0gJyMnKQorCQkgICAgKnB0cisrID0gJyonOworCQllbHNlIGlmIChlZm1wID09IGVmbSArIDEpCQkvKiBhbmFseXNlIHByZWZpeCAqLworCQl7CisJCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopIistIiwgKmVmbXApICE9IE5VTEwpCisJCQlmbXRfcHRyLT5mbGFncyA9ICplZm1wKys7CisJCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopIkRYQUVXSUNaR09QUSIsICplZm1wKSAhPSBOVUxMKQorCQkJZm10X3B0ci0+cHJlZml4ID0gKmVmbXA7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlzcHJpbnRmKChjaGFyICopZXJybXNnLAorCQkJCV8oIkUzNzY6IEludmFsaWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nIHByZWZpeCIpLCAqZWZtcCk7CisJCQlFTVNHKGVycm1zZyk7CisJCQlnb3RvIGVycm9yMjsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHNwcmludGYoKGNoYXIgKillcnJtc2csCisJCQkgICAgXygiRTM3NzogSW52YWxpZCAlJSVjIGluIGZvcm1hdCBzdHJpbmciKSwgKmVmbXApOworCQkgICAgRU1TRyhlcnJtc2cpOworCQkgICAgZ290byBlcnJvcjI7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCQkJLyogY29weSBub3JtYWwgY2hhcmFjdGVyICovCisJICAgIHsKKwkJaWYgKCplZm1wID09ICdcXCcgJiYgZWZtcCArIDEgPCBlZm0gKyBsZW4pCisJCSAgICArK2VmbXA7CisJCWVsc2UgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIuKl4kflsiLCAqZWZtcCkgIT0gTlVMTCkKKwkJICAgICpwdHIrKyA9ICdcXCc7CS8qIGVzY2FwZSByZWdleHAgYXRvbXMgKi8KKwkJaWYgKCplZm1wKQorCQkgICAgKnB0cisrID0gKmVmbXA7CisJICAgIH0KKwl9CisJKnB0cisrID0gJyQnOworCSpwdHIgPSBOVUw7CisJaWYgKChmbXRfcHRyLT5wcm9nID0gdmltX3JlZ2NvbXAoZm10c3RyLCBSRV9NQUdJQyArIFJFX1NUUklORykpID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3IyOworCS8qCisJICogQWR2YW5jZSB0byBuZXh0IHBhcnQKKwkgKi8KKwllZm0gPSBza2lwX3RvX29wdGlvbl9wYXJ0KGVmbSArIGxlbik7CS8qIHNraXAgY29tbWEgYW5kIHNwYWNlcyAqLworICAgIH0KKyAgICBpZiAoZm10X2ZpcnN0ID09IE5VTEwpCS8qIG5vdGhpbmcgZm91bmQgKi8KKyAgICB7CisJRU1TRyhfKCJFMzc4OiAnZXJyb3Jmb3JtYXQnIGNvbnRhaW5zIG5vIHBhdHRlcm4iKSk7CisJZ290byBlcnJvcjI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBnb3RfaW50IGlzIHJlc2V0IGhlcmUsIGJlY2F1c2UgaXQgd2FzIHByb2JhYmx5IHNldCB3aGVuIGtpbGxpbmcgdGhlCisgICAgICogIjptYWtlIiBjb21tYW5kLCBidXQgd2Ugc3RpbGwgd2FudCB0byByZWFkIHRoZSBlcnJvcmZpbGUgdGhlbi4KKyAgICAgKi8KKyAgICBnb3RfaW50ID0gRkFMU0U7CisKKyAgICAvKiBBbHdheXMgaWdub3JlIGNhc2Ugd2hlbiBsb29raW5nIGZvciBhIG1hdGNoaW5nIGVycm9yLiAqLworICAgIHJlZ21hdGNoLnJtX2ljID0gVFJVRTsKKworICAgIC8qCisgICAgICogUmVhZCB0aGUgbGluZXMgaW4gdGhlIGVycm9yIGZpbGUgb25lIGJ5IG9uZS4KKyAgICAgKiBUcnkgdG8gcmVjb2duaXplIG9uZSBvZiB0aGUgZXJyb3IgZm9ybWF0cyBpbiBlYWNoIGxpbmUuCisgICAgICovCisgICAgd2hpbGUgKGZnZXRzKChjaGFyICopSU9idWZmLCBDTURCVUZGU0laRSAtIDIsIGZkKSAhPSBOVUxMICYmICFnb3RfaW50KQorICAgIHsKKwlJT2J1ZmZbQ01EQlVGRlNJWkUgLSAyXSA9IE5VTDsgIC8qIGZvciB2ZXJ5IGxvbmcgbGluZXMgKi8KKwlpZiAoKGVmbXAgPSB2aW1fc3RycmNocihJT2J1ZmYsICdcbicpKSAhPSBOVUxMKQorCSAgICAqZWZtcCA9IE5VTDsKKyNpZmRlZiBVU0VfQ1JOTAorCWlmICgoZWZtcCA9IHZpbV9zdHJyY2hyKElPYnVmZiwgJ1xyJykpICE9IE5VTEwpCisJICAgICplZm1wID0gTlVMOworI2VuZGlmCisKKwkvKgorCSAqIFRyeSB0byBtYXRjaCBlYWNoIHBhcnQgb2YgJ2Vycm9yZm9ybWF0JyB1bnRpbCB3ZSBmaW5kIGEgY29tcGxldGUKKwkgKiBtYXRjaCBvciBubyBtYXRjaC4KKwkgKi8KKwl2YWxpZCA9IFRSVUU7CityZXN0b2ZsaW5lOgorCWZvciAoZm10X3B0ciA9IGZtdF9maXJzdDsgZm10X3B0ciAhPSBOVUxMOyBmbXRfcHRyID0gZm10X3B0ci0+bmV4dCkKKwl7CisJICAgIGlkeCA9IGZtdF9wdHItPnByZWZpeDsKKwkgICAgaWYgKG11bHRpc2NhbiAmJiB2aW1fc3RyY2hyKChjaGFyX3UgKikiT1BRIiwgaWR4KSA9PSBOVUxMKQorCQljb250aW51ZTsKKwkgICAgbmFtZWJ1ZlswXSA9IE5VTDsKKwkgICAgaWYgKCFtdWx0aXNjYW4pCisJCWVycm1zZ1swXSA9IE5VTDsKKwkgICAgbG51bSA9IDA7CisJICAgIGNvbCA9IDA7CisJICAgIHVzZV92aXJ0X2NvbCA9IEZBTFNFOworCSAgICBlbnIgPSAtMTsKKwkgICAgdHlwZSA9IDA7CisJICAgIHRhaWwgPSBOVUxMOworCisJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBmbXRfcHRyLT5wcm9nOworCSAgICBpZiAodmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBJT2J1ZmYsIChjb2xucl9UKTApKQorCSAgICB7CisJCWlmICgoaWR4ID09ICdDJyB8fCBpZHggPT0gJ1onKSAmJiAhbXVsdGlsaW5lKQorCQkgICAgY29udGludWU7CisJCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiRVdJIiwgaWR4KSAhPSBOVUxMKQorCQkgICAgdHlwZSA9IGlkeDsKKwkJZWxzZQorCQkgICAgdHlwZSA9IDA7CisJCS8qCisJCSAqIEV4dHJhY3QgZXJyb3IgbWVzc2FnZSBkYXRhIGZyb20gbWF0Y2hlZCBsaW5lCisJCSAqLworCQlpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbMF0pID4gMCkJCS8qICVmICovCisJCXsKKwkJICAgIGxlbiA9IChpbnQpKHJlZ21hdGNoLmVuZHBbaV0gLSByZWdtYXRjaC5zdGFydHBbaV0pOworCQkgICAgU1RSTkNQWShuYW1lYnVmLCByZWdtYXRjaC5zdGFydHBbaV0sIGxlbik7CisJCSAgICBuYW1lYnVmW2xlbl0gPSBOVUw7CisJCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopIk9QUSIsIGlkeCkgIT0gTlVMTAorCQkJICAgICYmIG1jaF9nZXRwZXJtKG5hbWVidWYpID09IC0xKQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKChpID0gKGludClmbXRfcHRyLT5hZGRyWzFdKSA+IDApCQkvKiAlbiAqLworCQkgICAgZW5yID0gKGludClhdG9sKChjaGFyICopcmVnbWF0Y2guc3RhcnRwW2ldKTsKKwkJaWYgKChpID0gKGludClmbXRfcHRyLT5hZGRyWzJdKSA+IDApCQkvKiAlbCAqLworCQkgICAgbG51bSA9IGF0b2woKGNoYXIgKilyZWdtYXRjaC5zdGFydHBbaV0pOworCQlpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbM10pID4gMCkJCS8qICVjICovCisJCSAgICBjb2wgPSAoaW50KWF0b2woKGNoYXIgKilyZWdtYXRjaC5zdGFydHBbaV0pOworCQlpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbNF0pID4gMCkJCS8qICV0ICovCisJCSAgICB0eXBlID0gKnJlZ21hdGNoLnN0YXJ0cFtpXTsKKwkJaWYgKGZtdF9wdHItPmZsYWdzID09ICAnKycgJiYgIW11bHRpc2NhbikJLyogJSsgKi8KKwkJICAgIFNUUkNQWShlcnJtc2csIElPYnVmZik7CisJCWVsc2UgaWYgKChpID0gKGludClmbXRfcHRyLT5hZGRyWzVdKSA+IDApCS8qICVtICovCisJCXsKKwkJICAgIGxlbiA9IChpbnQpKHJlZ21hdGNoLmVuZHBbaV0gLSByZWdtYXRjaC5zdGFydHBbaV0pOworCQkgICAgU1RSTkNQWShlcnJtc2csIHJlZ21hdGNoLnN0YXJ0cFtpXSwgbGVuKTsKKwkJICAgIGVycm1zZ1tsZW5dID0gTlVMOworCQl9CisJCWlmICgoaSA9IChpbnQpZm10X3B0ci0+YWRkcls2XSkgPiAwKQkJLyogJXIgKi8KKwkJICAgIHRhaWwgPSByZWdtYXRjaC5zdGFydHBbaV07CisJCWlmICgoaSA9IChpbnQpZm10X3B0ci0+YWRkcls3XSkgPiAwKQkJLyogJXAgKi8KKwkJeworCQkgICAgY29sID0gKGludCkocmVnbWF0Y2guZW5kcFtpXSAtIHJlZ21hdGNoLnN0YXJ0cFtpXSArIDEpOworCQkgICAgaWYgKCooKGNoYXJfdSAqKXJlZ21hdGNoLnN0YXJ0cFtpXSkgIT0gVEFCKQorCQkJdXNlX3ZpcnRfY29sID0gVFJVRTsKKwkJfQorCQlpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbOF0pID4gMCkJCS8qICV2ICovCisJCXsKKwkJICAgIGNvbCA9IChpbnQpYXRvbCgoY2hhciAqKXJlZ21hdGNoLnN0YXJ0cFtpXSk7CisJCSAgICB1c2VfdmlydF9jb2wgPSBUUlVFOworCQl9CisJCWJyZWFrOworCSAgICB9CisJfQorCW11bHRpc2NhbiA9IEZBTFNFOworCWlmICghZm10X3B0ciB8fCBpZHggPT0gJ0QnIHx8IGlkeCA9PSAnWCcpCisJeworCSAgICBpZiAoZm10X3B0cikKKwkgICAgeworCQlpZiAoaWR4ID09ICdEJykJCQkJLyogZW50ZXIgZGlyZWN0b3J5ICovCisJCXsKKwkJICAgIGlmICgqbmFtZWJ1ZiA9PSBOVUwpCisJCSAgICB7CisJCQlFTVNHKF8oIkUzNzk6IE1pc3Npbmcgb3IgZW1wdHkgZGlyZWN0b3J5IG5hbWUiKSk7CisJCQlnb3RvIGVycm9yMjsKKwkJICAgIH0KKwkJICAgIGlmICgoZGlyZWN0b3J5ID0gcWZfcHVzaF9kaXIobmFtZWJ1ZiwgJmRpcl9zdGFjaykpID09IE5VTEwpCisJCQlnb3RvIGVycm9yMjsKKwkJfQorCQllbHNlIGlmIChpZHggPT0gJ1gnKQkJCS8qIGxlYXZlIGRpcmVjdG9yeSAqLworCQkgICAgZGlyZWN0b3J5ID0gcWZfcG9wX2RpcigmZGlyX3N0YWNrKTsKKwkgICAgfQorCSAgICBuYW1lYnVmWzBdID0gTlVMOwkJLyogbm8gbWF0Y2ggZm91bmQsIHJlbW92ZSBmaWxlIG5hbWUgKi8KKwkgICAgbG51bSA9IDA7CQkJLyogZG9uJ3QganVtcCB0byB0aGlzIGxpbmUgKi8KKwkgICAgdmFsaWQgPSBGQUxTRTsKKwkgICAgU1RSQ1BZKGVycm1zZywgSU9idWZmKTsJLyogY29weSB3aG9sZSBsaW5lIHRvIGVycm9yIG1lc3NhZ2UgKi8KKwkgICAgaWYgKCFmbXRfcHRyKQorCQltdWx0aWxpbmUgPSBtdWx0aWlnbm9yZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChmbXRfcHRyKQorCXsKKwkgICAgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJBRVdJIiwgaWR4KSAhPSBOVUxMKQorCQltdWx0aWxpbmUgPSBUUlVFOwkvKiBzdGFydCBvZiBhIG11bHRpLWxpbmUgbWVzc2FnZSAqLworCSAgICBlbHNlIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiQ1oiLCBpZHgpICE9IE5VTEwpCisJICAgIHsJCQkJLyogY29udGludWF0aW9uIG9mIG11bHRpLWxpbmUgbXNnICovCisJCWlmIChxZnByZXYgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3IyOworCQlpZiAoKmVycm1zZyAmJiAhbXVsdGlpZ25vcmUpCisJCXsKKwkJICAgIGxlbiA9IChpbnQpU1RSTEVOKHFmcHJldi0+cWZfdGV4dCk7CisJCSAgICBpZiAoKHB0ciA9IGFsbG9jKCh1bnNpZ25lZCkobGVuICsgU1RSTEVOKGVycm1zZykgKyAyKSkpCisJCQkJCQkJCSAgICA9PSBOVUxMKQorCQkJZ290byBlcnJvcjI7CisJCSAgICBTVFJDUFkocHRyLCBxZnByZXYtPnFmX3RleHQpOworCQkgICAgdmltX2ZyZWUocWZwcmV2LT5xZl90ZXh0KTsKKwkJICAgIHFmcHJldi0+cWZfdGV4dCA9IHB0cjsKKwkJICAgICoocHRyICs9IGxlbikgPSAnXG4nOworCQkgICAgU1RSQ1BZKCsrcHRyLCBlcnJtc2cpOworCQl9CisJCWlmIChxZnByZXYtPnFmX25yID09IC0xKQorCQkgICAgcWZwcmV2LT5xZl9uciA9IGVucjsKKwkJaWYgKHZpbV9pc3ByaW50Yyh0eXBlKSAmJiAhcWZwcmV2LT5xZl90eXBlKQorCQkgICAgcWZwcmV2LT5xZl90eXBlID0gdHlwZTsgIC8qIG9ubHkgcHJpbnRhYmxlIGNoYXJzIGFsbG93ZWQgKi8KKwkJaWYgKCFxZnByZXYtPnFmX2xudW0pCisJCSAgICBxZnByZXYtPnFmX2xudW0gPSBsbnVtOworCQlpZiAoIXFmcHJldi0+cWZfY29sKQorCQkgICAgcWZwcmV2LT5xZl9jb2wgPSBjb2w7CisJCXFmcHJldi0+cWZfdmlydF9jb2wgPSB1c2VfdmlydF9jb2w7CisJCWlmICghcWZwcmV2LT5xZl9mbnVtKQorCQkgICAgcWZwcmV2LT5xZl9mbnVtID0gcWZfZ2V0X2ZudW0oZGlyZWN0b3J5LAorCQkJCQkqbmFtZWJ1ZiB8fCBkaXJlY3RvcnkgPyBuYW1lYnVmCisJCQkJCSAgOiBjdXJyZmlsZSAmJiB2YWxpZCA/IGN1cnJmaWxlIDogMCk7CisJCWlmIChpZHggPT0gJ1onKQorCQkgICAgbXVsdGlsaW5lID0gbXVsdGlpZ25vcmUgPSBGQUxTRTsKKwkJbGluZV9icmVha2NoZWNrKCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGVsc2UgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSJPUFEiLCBpZHgpICE9IE5VTEwpCisJICAgIHsKKwkJLyogZ2xvYmFsIGZpbGUgbmFtZXMgKi8KKwkJdmFsaWQgPSBGQUxTRTsKKwkJaWYgKCpuYW1lYnVmID09IE5VTCB8fCBtY2hfZ2V0cGVybShuYW1lYnVmKSA+PSAwKQorCQl7CisJCSAgICBpZiAoKm5hbWVidWYgJiYgaWR4ID09ICdQJykKKwkJCWN1cnJmaWxlID0gcWZfcHVzaF9kaXIobmFtZWJ1ZiwgJmZpbGVfc3RhY2spOworCQkgICAgZWxzZSBpZiAoaWR4ID09ICdRJykKKwkJCWN1cnJmaWxlID0gcWZfcG9wX2RpcigmZmlsZV9zdGFjayk7CisJCSAgICAqbmFtZWJ1ZiA9IE5VTDsKKwkJICAgIGlmICh0YWlsICYmICp0YWlsKQorCQkgICAgeworCQkJU1RSQ1BZKElPYnVmZiwgc2tpcHdoaXRlKHRhaWwpKTsKKwkJCW11bHRpc2NhbiA9IFRSVUU7CisJCQlnb3RvIHJlc3RvZmxpbmU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAoZm10X3B0ci0+ZmxhZ3MgPT0gJy0nKQkvKiBnZW5lcmFsbHkgZXhjbHVkZSB0aGlzIGxpbmUgKi8KKwkgICAgeworCQlpZiAobXVsdGlsaW5lKQorCQkgICAgbXVsdGlpZ25vcmUgPSBUUlVFOwkvKiBhbHNvIGV4Y2x1ZGUgY29udGludWF0aW9uIGxpbmVzICovCisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCisJaWYgKHFmX2FkZF9lbnRyeSgmcWZwcmV2LAorCQkJZGlyZWN0b3J5LAorCQkJKm5hbWVidWYgfHwgZGlyZWN0b3J5CisJCQkgICAgPyBuYW1lYnVmCisJCQkgICAgOiBjdXJyZmlsZSAmJiB2YWxpZCA/IGN1cnJmaWxlIDogTlVMTCwKKwkJCWVycm1zZywKKwkJCWxudW0sCisJCQljb2wsCisJCQl1c2VfdmlydF9jb2wsCisJCQllbnIsCisJCQl0eXBlLAorCQkJdmFsaWQpID09IEZBSUwpCisJICAgIGdvdG8gZXJyb3IyOworCWxpbmVfYnJlYWtjaGVjaygpOworICAgIH0KKyAgICBpZiAoIWZlcnJvcihmZCkpCisgICAgeworCWlmIChxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9pbmRleCA9PSAwKQkvKiBubyB2YWxpZCBlbnRyeSBmb3VuZCAqLworCXsKKwkgICAgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfcHRyID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfc3RhcnQ7CisJICAgIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4ID0gMTsKKwkgICAgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfbm9uZXZhbGlkID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkgICAgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfbm9uZXZhbGlkID0gRkFMU0U7CisJICAgIGlmIChxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9wdHIgPT0gTlVMTCkKKwkJcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfcHRyID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfc3RhcnQ7CisJfQorCXJldHZhbCA9IHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2NvdW50OwkvKiByZXR1cm4gbnVtYmVyIG9mIG1hdGNoZXMgKi8KKwlnb3RvIHFmX2luaXRfb2s7CisgICAgfQorICAgIEVNU0coXyhlX3JlYWRlcnJmKSk7CitlcnJvcjI6CisgICAgcWZfZnJlZShxZl9jdXJsaXN0KTsKKyAgICBxZl9saXN0Y291bnQtLTsKKyAgICBpZiAocWZfY3VybGlzdCA+IDApCisJLS1xZl9jdXJsaXN0OworcWZfaW5pdF9vazoKKyAgICBmY2xvc2UoZmQpOworICAgIGZvciAoZm10X3B0ciA9IGZtdF9maXJzdDsgZm10X3B0ciAhPSBOVUxMOyBmbXRfcHRyID0gZm10X2ZpcnN0KQorICAgIHsKKwlmbXRfZmlyc3QgPSBmbXRfcHRyLT5uZXh0OworCXZpbV9mcmVlKGZtdF9wdHItPnByb2cpOworCXZpbV9mcmVlKGZtdF9wdHIpOworICAgIH0KKyAgICBxZl9jbGVhbl9kaXJfc3RhY2soJmRpcl9zdGFjayk7CisgICAgcWZfY2xlYW5fZGlyX3N0YWNrKCZmaWxlX3N0YWNrKTsKK3FmX2luaXRfZW5kOgorICAgIHZpbV9mcmVlKG5hbWVidWYpOworICAgIHZpbV9mcmVlKGVycm1zZyk7CisgICAgdmltX2ZyZWUoZm10c3RyKTsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHFmX3VwZGF0ZV9idWZmZXIoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFByZXBhcmUgZm9yIGFkZGluZyBhIG5ldyBxdWlja2ZpeCBsaXN0LgorICovCisgICAgc3RhdGljIHZvaWQKK3FmX25ld19saXN0KCkKK3sKKyAgICBpbnQJCWk7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjdXJyZW50IGVudHJ5IGlzIG5vdCB0aGUgbGFzdCBlbnRyeSwgZGVsZXRlIGVudHJpZXMgYmVsb3cKKyAgICAgKiB0aGUgY3VycmVudCBlbnRyeS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYnJvd3NlIGluIGEgdHJlZS1saWtlCisgICAgICogd2F5IHdpdGggIjpncmVwJy4KKyAgICAgKi8KKyAgICB3aGlsZSAocWZfbGlzdGNvdW50ID4gcWZfY3VybGlzdCArIDEpCisJcWZfZnJlZSgtLXFmX2xpc3Rjb3VudCk7CisKKyAgICAvKgorICAgICAqIFdoZW4gdGhlIHN0YWNrIGlzIGZ1bGwsIHJlbW92ZSB0byBvbGRlc3QgZW50cnkKKyAgICAgKiBPdGhlcndpc2UsIGFkZCBhIG5ldyBlbnRyeS4KKyAgICAgKi8KKyAgICBpZiAocWZfbGlzdGNvdW50ID09IExJU1RDT1VOVCkKKyAgICB7CisJcWZfZnJlZSgwKTsKKwlmb3IgKGkgPSAxOyBpIDwgTElTVENPVU5UOyArK2kpCisJICAgIHFmX2xpc3RzW2kgLSAxXSA9IHFmX2xpc3RzW2ldOworCXFmX2N1cmxpc3QgPSBMSVNUQ09VTlQgLSAxOworICAgIH0KKyAgICBlbHNlCisJcWZfY3VybGlzdCA9IHFmX2xpc3Rjb3VudCsrOworICAgIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4ID0gMDsKKyAgICBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudCA9IDA7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBlcnJvcnMuCisgKiBSZXR1cm5zIE9LIG9yIEZBSUwuCisgKi8KKyAgICBzdGF0aWMgaW50CitxZl9hZGRfZW50cnkocHJldnAsIGRpciwgZm5hbWUsIG1lc2csIGxudW0sIGNvbCwgdmlydF9jb2wsIG5yLCB0eXBlLCB2YWxpZCkKKyAgICBzdHJ1Y3QgcWZfbGluZSAqKnByZXZwOwkvKiBwb2ludGVyIHRvIHByZXZpb3VzbHkgYWRkZWQgZW50cnkgb3IgTlVMTCAqLworICAgIGNoYXJfdQkqZGlyOwkJLyogb3B0aW9uYWwgZGlyZWN0b3J5IG5hbWUgKi8KKyAgICBjaGFyX3UJKmZuYW1lOwkJLyogZmlsZSBuYW1lIG9yIE5VTEwgKi8KKyAgICBjaGFyX3UJKm1lc2c7CQkvKiBtZXNzYWdlICovCisgICAgbG9uZwlsbnVtOwkJLyogbGluZSBudW1iZXIgKi8KKyAgICBpbnQJCWNvbDsJCS8qIGNvbHVtbiAqLworICAgIGludAkJdmlydF9jb2w7CS8qIHVzaW5nIHZpcnR1YWwgY29sdW1uICovCisgICAgaW50CQlucjsJCS8qIGVycm9yIG51bWJlciAqLworICAgIGludAkJdHlwZTsJCS8qIHR5cGUgY2hhcmFjdGVyICovCisgICAgaW50CQl2YWxpZDsJCS8qIHZhbGlkIGVudHJ5ICovCit7CisgICAgc3RydWN0IHFmX2xpbmUgKnFmcDsKKworICAgIGlmICgocWZwID0gKHN0cnVjdCBxZl9saW5lICopYWxsb2MoKHVuc2lnbmVkKXNpemVvZihzdHJ1Y3QgcWZfbGluZSkpKQorCQkJCQkJCQkgICAgICA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHFmcC0+cWZfZm51bSA9IHFmX2dldF9mbnVtKGRpciwgZm5hbWUpOworICAgIGlmICgocWZwLT5xZl90ZXh0ID0gdmltX3N0cnNhdmUobWVzZykpID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKHFmcCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorICAgIHFmcC0+cWZfbG51bSA9IGxudW07CisgICAgcWZwLT5xZl9jb2wgPSBjb2w7CisgICAgcWZwLT5xZl92aXJ0X2NvbCA9IHZpcnRfY29sOworICAgIHFmcC0+cWZfbnIgPSBucjsKKyAgICBpZiAodHlwZSAhPSAxICYmICF2aW1faXNwcmludGModHlwZSkpIC8qIG9ubHkgcHJpbnRhYmxlIGNoYXJzIGFsbG93ZWQgKi8KKwl0eXBlID0gMDsKKyAgICBxZnAtPnFmX3R5cGUgPSB0eXBlOworICAgIHFmcC0+cWZfdmFsaWQgPSB2YWxpZDsKKworICAgIGlmIChxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudCA9PSAwKQkvKiBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisgICAgeworCXFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX3N0YXJ0ID0gcWZwOworCXFmcC0+cWZfcHJldiA9IHFmcDsJLyogZmlyc3QgZWxlbWVudCBwb2ludHMgdG8gaXRzZWxmICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcWZwLT5xZl9wcmV2ID0gKnByZXZwOworCSgqcHJldnApLT5xZl9uZXh0ID0gcWZwOworICAgIH0KKyAgICBxZnAtPnFmX25leHQgPSBxZnA7CS8qIGxhc3QgZWxlbWVudCBwb2ludHMgdG8gaXRzZWxmICovCisgICAgcWZwLT5xZl9jbGVhcmVkID0gRkFMU0U7CisgICAgKnByZXZwID0gcWZwOworICAgICsrcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfY291bnQ7CisgICAgaWYgKHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4ID09IDAgJiYgcWZwLT5xZl92YWxpZCkKKwkJCQkJICAgIC8qIGZpcnN0IHZhbGlkIGVudHJ5ICovCisgICAgeworCXFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4ID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfY291bnQ7CisJcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfcHRyID0gcWZwOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGdldCBidWZmZXIgbnVtYmVyIGZvciBmaWxlICJkaXIubmFtZSIKKyAqLworICAgIHN0YXRpYyBpbnQKK3FmX2dldF9mbnVtKGRpcmVjdG9yeSwgZm5hbWUpCisgICAgY2hhcl91ICAgKmRpcmVjdG9yeTsKKyAgICBjaGFyX3UgICAqZm5hbWU7Cit7CisgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTCkJCS8qIG5vIGZpbGUgbmFtZSAqLworCXJldHVybiAwOworICAgIHsKKyNpZmRlZiBSSVNDT1MKKwkvKiBOYW1lIGlzIHJlcG9ydGVkIGFzIGBtYWluLmMnLCBidXQgZmlsZSBpcyBgYy5tYWluJyAqLworCXJldHVybiByb19idWZsaXN0X2FkZChmbmFtZSk7CisjZWxzZQorCWNoYXJfdQkgICAgKnB0cjsKKwlpbnQJICAgIGZudW07CisKKyMgaWZkZWYgVk1TCisJdm1zX3JlbW92ZV92ZXJzaW9uKGZuYW1lKTsKKyMgZW5kaWYKKyMgaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJaWYgKGRpcmVjdG9yeSAhPSBOVUxMKQorCSAgICBzbGFzaF9hZGp1c3QoZGlyZWN0b3J5KTsKKwlzbGFzaF9hZGp1c3QoZm5hbWUpOworIyBlbmRpZgorCWlmIChkaXJlY3RvcnkgIT0gTlVMTCAmJiAhdmltX2lzQWJzTmFtZShmbmFtZSkKKwkJJiYgKHB0ciA9IGNvbmNhdF9mbmFtZXMoZGlyZWN0b3J5LCBmbmFtZSwgVFJVRSkpICE9IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBIZXJlIHdlIGNoZWNrIGlmIHRoZSBmaWxlIHJlYWxseSBleGlzdHMuCisJICAgICAqIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHRydWUsIGJ1dCBpZiBtYWtlIHdvcmtzIHdpdGhvdXQKKwkgICAgICogImxlYXZpbmcgZGlyZWN0b3J5Ii1tZXNzYWdlcyB3ZSBtaWdodCBoYXZlIG1pc3NlZCBhCisJICAgICAqIGRpcmVjdG9yeSBjaGFuZ2UuCisJICAgICAqLworCSAgICBpZiAobWNoX2dldHBlcm0ocHRyKSA8IDApCisJICAgIHsKKwkJdmltX2ZyZWUocHRyKTsKKwkJZGlyZWN0b3J5ID0gcWZfZ3Vlc3NfZmlsZXBhdGgoZm5hbWUpOworCQlpZiAoZGlyZWN0b3J5KQorCQkgICAgcHRyID0gY29uY2F0X2ZuYW1lcyhkaXJlY3RvcnksIGZuYW1lLCBUUlVFKTsKKwkJZWxzZQorCQkgICAgcHRyID0gdmltX3N0cnNhdmUoZm5hbWUpOworCSAgICB9CisJICAgIC8qIFVzZSBjb25jYXRlbmF0ZWQgZGlyZWN0b3J5IG5hbWUgYW5kIGZpbGUgbmFtZSAqLworCSAgICBmbnVtID0gYnVmbGlzdF9hZGQocHRyLCAwKTsKKwkgICAgdmltX2ZyZWUocHRyKTsKKwkgICAgcmV0dXJuIGZudW07CisJfQorCXJldHVybiBidWZsaXN0X2FkZChmbmFtZSwgMCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBwdXNoIGRpcmJ1ZiBvbnRvIHRoZSBkaXJlY3Rvcnkgc3RhY2sgYW5kIHJldHVybiBwb2ludGVyIHRvIGFjdHVhbCBkaXIgb3IKKyAqIE5VTEwgb24gZXJyb3IKKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcWZfcHVzaF9kaXIoZGlyYnVmLCBzdGFja3B0cikKKyAgICBjaGFyX3UJCSpkaXJidWY7CisgICAgc3RydWN0IGRpcl9zdGFja19UCSoqc3RhY2twdHI7Cit7CisgICAgc3RydWN0IGRpcl9zdGFja19UICAqZHNfbmV3OworICAgIHN0cnVjdCBkaXJfc3RhY2tfVCAgKmRzX3B0cjsKKworICAgIC8qIGFsbG9jYXRlIG5ldyBzdGFjayBlbGVtZW50IGFuZCBob29rIGl0IGluICovCisgICAgZHNfbmV3ID0gKHN0cnVjdCBkaXJfc3RhY2tfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2Yoc3RydWN0IGRpcl9zdGFja19UKSk7CisgICAgaWYgKGRzX25ldyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZHNfbmV3LT5uZXh0ID0gKnN0YWNrcHRyOworICAgICpzdGFja3B0ciA9IGRzX25ldzsKKworICAgIC8qIHN0b3JlIGRpcmVjdG9yeSBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAodmltX2lzQWJzTmFtZShkaXJidWYpCisJICAgIHx8ICgqc3RhY2twdHIpLT5uZXh0ID09IE5VTEwKKwkgICAgfHwgKCpzdGFja3B0ciAmJiBkaXJfc3RhY2sgIT0gKnN0YWNrcHRyKSkKKwkoKnN0YWNrcHRyKS0+ZGlybmFtZSA9IHZpbV9zdHJzYXZlKGRpcmJ1Zik7CisgICAgZWxzZQorICAgIHsKKwkvKiBPa2F5IHdlIGRvbid0IGhhdmUgYW4gYWJzb2x1dGUgcGF0aC4KKwkgKiBkaXJidWYgbXVzdCBiZSBhIHN1YmRpciBvZiBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIG9uIHRoZSBzdGFjay4KKwkgKiBMZXQncyBzZWFyY2guLi4KKwkgKi8KKwlkc19uZXcgPSAoKnN0YWNrcHRyKS0+bmV4dDsKKwkoKnN0YWNrcHRyKS0+ZGlybmFtZSA9IE5VTEw7CisJd2hpbGUgKGRzX25ldykKKwl7CisJICAgIHZpbV9mcmVlKCgqc3RhY2twdHIpLT5kaXJuYW1lKTsKKwkgICAgKCpzdGFja3B0ciktPmRpcm5hbWUgPSBjb25jYXRfZm5hbWVzKGRzX25ldy0+ZGlybmFtZSwgZGlyYnVmLAorCQkgICAgVFJVRSk7CisJICAgIGlmIChtY2hfaXNkaXIoKCpzdGFja3B0ciktPmRpcm5hbWUpID09IFRSVUUpCisJCWJyZWFrOworCisJICAgIGRzX25ldyA9IGRzX25ldy0+bmV4dDsKKwl9CisKKwkvKiBjbGVhbiB1cCBhbGwgZGlycyB3ZSBhbHJlYWR5IGxlZnQgKi8KKwl3aGlsZSAoKCpzdGFja3B0ciktPm5leHQgIT0gZHNfbmV3KQorCXsKKwkgICAgZHNfcHRyID0gKCpzdGFja3B0ciktPm5leHQ7CisJICAgICgqc3RhY2twdHIpLT5uZXh0ID0gKCpzdGFja3B0ciktPm5leHQtPm5leHQ7CisJICAgIHZpbV9mcmVlKGRzX3B0ci0+ZGlybmFtZSk7CisJICAgIHZpbV9mcmVlKGRzX3B0cik7CisJfQorCisJLyogTm90aGluZyBmb3VuZCAtPiBpdCBtdXN0IGJlIG9uIHRvcCBsZXZlbCAqLworCWlmIChkc19uZXcgPT0gTlVMTCkKKwl7CisJICAgIHZpbV9mcmVlKCgqc3RhY2twdHIpLT5kaXJuYW1lKTsKKwkgICAgKCpzdGFja3B0ciktPmRpcm5hbWUgPSB2aW1fc3Ryc2F2ZShkaXJidWYpOworCX0KKyAgICB9CisKKyAgICBpZiAoKCpzdGFja3B0ciktPmRpcm5hbWUgIT0gTlVMTCkKKwlyZXR1cm4gKCpzdGFja3B0ciktPmRpcm5hbWU7CisgICAgZWxzZQorICAgIHsKKwlkc19wdHIgPSAqc3RhY2twdHI7CisJKnN0YWNrcHRyID0gKCpzdGFja3B0ciktPm5leHQ7CisJdmltX2ZyZWUoZHNfcHRyKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKworLyoKKyAqIHBvcCBkaXJidWYgZnJvbSB0aGUgZGlyZWN0b3J5IHN0YWNrIGFuZCByZXR1cm4gcHJldmlvdXMgZGlyZWN0b3J5IG9yIE5VTEwgaWYKKyAqIHN0YWNrIGlzIGVtcHR5CisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3FmX3BvcF9kaXIoc3RhY2twdHIpCisgICAgc3RydWN0IGRpcl9zdGFja19UCSoqc3RhY2twdHI7Cit7CisgICAgc3RydWN0IGRpcl9zdGFja19UICAqZHNfcHRyOworCisgICAgLyogVE9ETzogU2hvdWxkIHdlIGNoZWNrIGlmIGRpcmJ1ZiBpcyB0aGUgZGlyZWN0b3J5IG9uIHRvcCBvZiB0aGUgc3RhY2s/CisgICAgICogV2hhdCB0byBkbyBpZiBpdCBpc24ndD8gKi8KKworICAgIC8qIHBvcCB0b3AgZWxlbWVudCBhbmQgZnJlZSBpdCAqLworICAgIGlmICgqc3RhY2twdHIgIT0gTlVMTCkKKyAgICB7CisJZHNfcHRyID0gKnN0YWNrcHRyOworCSpzdGFja3B0ciA9ICgqc3RhY2twdHIpLT5uZXh0OworCXZpbV9mcmVlKGRzX3B0ci0+ZGlybmFtZSk7CisJdmltX2ZyZWUoZHNfcHRyKTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gTkVXIHRvcCBlbGVtZW50IGFzIGN1cnJlbnQgZGlyIG9yIE5VTEwgaWYgc3RhY2sgaXMgZW1wdHkqLworICAgIHJldHVybiAqc3RhY2twdHIgPyAoKnN0YWNrcHRyKS0+ZGlybmFtZSA6IE5VTEw7Cit9CisKKy8qCisgKiBjbGVhbiB1cCBkaXJlY3Rvcnkgc3RhY2sKKyAqLworICAgIHN0YXRpYyB2b2lkCitxZl9jbGVhbl9kaXJfc3RhY2soc3RhY2twdHIpCisgICAgc3RydWN0IGRpcl9zdGFja19UCSoqc3RhY2twdHI7Cit7CisgICAgc3RydWN0IGRpcl9zdGFja19UICAqZHNfcHRyOworCisgICAgd2hpbGUgKChkc19wdHIgPSAqc3RhY2twdHIpICE9IE5VTEwpCisgICAgeworCSpzdGFja3B0ciA9ICgqc3RhY2twdHIpLT5uZXh0OworCXZpbV9mcmVlKGRzX3B0ci0+ZGlybmFtZSk7CisJdmltX2ZyZWUoZHNfcHRyKTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBpbiB3aGljaCBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBzdGFjayB0aGUgZ2l2ZW4gZmlsZSBjYW4gYmUKKyAqIGZvdW5kLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRpcmVjdG9yeSBuYW1lIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKiBDbGVhbnMgdXAgaW50ZXJtZWRpYXRlIGRpcmVjdG9yeSBlbnRyaWVzLgorICoKKyAqIFRPRE86IEhvdyB0byBzb2x2ZSB0aGUgZm9sbG93aW5nIHByb2JsZW0/CisgKiBJZiB3ZSBoYXZlIHRoZSB0aGlzIGRpcmVjdG9yeSB0cmVlOgorICogICAgIC4vCisgKiAgICAgLi9hYQorICogICAgIC4vYWEvYmIKKyAqICAgICAuL2JiCisgKiAgICAgLi9iYi94LmMKKyAqIGFuZCBtYWtlIHNheXM6CisgKiAgICAgbWFraW5nIGFsbCBpbiBhYQorICogICAgIG1ha2luZyBhbGwgaW4gYmIKKyAqICAgICB4LmM6OTogRXJyb3IKKyAqIFRoZW4gcWZfcHVzaF9kaXIgdGhpbmtzIHdlIGFyZSBpbiAuL2FhL2JiLCBidXQgd2UgYXJlIGluIC4vYmIuCisgKiBxZl9ndWVzc19maWxlcGF0aCB3aWxsIHJldHVybiBOVUxMLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitxZl9ndWVzc19maWxlcGF0aChmaWxlbmFtZSkKKyAgICBjaGFyX3UgKmZpbGVuYW1lOworeworICAgIHN0cnVjdCBkaXJfc3RhY2tfVCAgICAgKmRzX3B0cjsKKyAgICBzdHJ1Y3QgZGlyX3N0YWNrX1QgICAgICpkc190bXA7CisgICAgY2hhcl91CQkgICAqZnVsbG5hbWU7CisKKyAgICAvKiBubyBkaXJzIG9uIHRoZSBzdGFjayAtIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBpZiAoZGlyX3N0YWNrID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBkc19wdHIgPSBkaXJfc3RhY2stPm5leHQ7CisgICAgZnVsbG5hbWUgPSBOVUxMOworICAgIHdoaWxlIChkc19wdHIpCisgICAgeworCXZpbV9mcmVlKGZ1bGxuYW1lKTsKKwlmdWxsbmFtZSA9IGNvbmNhdF9mbmFtZXMoZHNfcHRyLT5kaXJuYW1lLCBmaWxlbmFtZSwgVFJVRSk7CisKKwkvKiBJZiBjb25jYXRfZm5hbWVzIGZhaWxlZCwganVzdCBnbyBvbi4gVGhlIHdvcnN0IHRoaW5nIHRoYXQgY2FuIGhhcHBlbgorCSAqIGlzIHRoYXQgd2UgZGVsZXRlIHRoZSBlbnRpcmUgc3RhY2suCisJICovCisJaWYgKChmdWxsbmFtZSAhPSBOVUxMKSAmJiAobWNoX2dldHBlcm0oZnVsbG5hbWUpID49IDApKQorCSAgICBicmVhazsKKworCWRzX3B0ciA9IGRzX3B0ci0+bmV4dDsKKyAgICB9CisKKyAgICB2aW1fZnJlZShmdWxsbmFtZSk7CisKKyAgICAvKiBjbGVhbiB1cCBhbGwgZGlycyB3ZSBhbHJlYWR5IGxlZnQgKi8KKyAgICB3aGlsZSAoZGlyX3N0YWNrLT5uZXh0ICE9IGRzX3B0cikKKyAgICB7CisJZHNfdG1wID0gZGlyX3N0YWNrLT5uZXh0OworCWRpcl9zdGFjay0+bmV4dCA9IGRpcl9zdGFjay0+bmV4dC0+bmV4dDsKKwl2aW1fZnJlZShkc190bXAtPmRpcm5hbWUpOworCXZpbV9mcmVlKGRzX3RtcCk7CisgICAgfQorCisgICAgcmV0dXJuIGRzX3B0cj09TlVMTD8gTlVMTDogZHNfcHRyLT5kaXJuYW1lOworCit9CisKKy8qCisgKiBqdW1wIHRvIGEgcXVpY2tmaXggbGluZQorICogaWYgZGlyID09IEZPUldBUkQgZ28gImVycm9ybnIiIHZhbGlkIGVudHJpZXMgZm9yd2FyZAorICogaWYgZGlyID09IEJBQ0tXQVJEIGdvICJlcnJvcm5yIiB2YWxpZCBlbnRyaWVzIGJhY2t3YXJkCisgKiBpZiBkaXIgPT0gRk9SV0FSRF9GSUxFIGdvICJlcnJvcm5yIiB2YWxpZCBlbnRyaWVzIGZpbGVzIGJhY2t3YXJkCisgKiBpZiBkaXIgPT0gQkFDS1dBUkRfRklMRSBnbyAiZXJyb3JuciIgdmFsaWQgZW50cmllcyBmaWxlcyBiYWNrd2FyZAorICogZWxzZSBpZiAiZXJyb3JuciIgaXMgemVybywgcmVkaXNwbGF5IHRoZSBzYW1lIGxpbmUKKyAqIGVsc2UgZ28gdG8gZW50cnkgImVycm9ybnIiCisgKi8KKyAgICB2b2lkCitxZl9qdW1wKGRpciwgZXJyb3JuciwgZm9yY2VpdCkKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCWVycm9ybnI7CisgICAgaW50CQlmb3JjZWl0OworeworICAgIHN0cnVjdCBxZl9saW5lCSpxZl9wdHI7CisgICAgc3RydWN0IHFmX2xpbmUJKm9sZF9xZl9wdHI7CisgICAgaW50CQkJcWZfaW5kZXg7CisgICAgaW50CQkJb2xkX3FmX2ZudW07CisgICAgaW50CQkJb2xkX3FmX2luZGV4OworICAgIGludAkJCXByZXZfaW5kZXg7CisgICAgc3RhdGljIGNoYXJfdQkqZV9ub19tb3JlX2l0ZW1zID0gKGNoYXJfdSAqKU5fKCJFNTUzOiBObyBtb3JlIGl0ZW1zIik7CisgICAgY2hhcl91CQkqZXJyID0gZV9ub19tb3JlX2l0ZW1zOworICAgIGxpbmVucl9UCQlpOworICAgIGJ1Zl9UCQkqb2xkX2N1cmJ1ZjsKKyAgICBsaW5lbnJfVAkJb2xkX2xudW07CisgICAgY2hhcl91CQkqb2xkX3N3YiA9IHBfc3diOworICAgIGNvbG5yX1QJCXNjcmVlbl9jb2w7CisgICAgY29sbnJfVAkJY2hhcl9jb2w7CisgICAgY2hhcl91CQkqbGluZTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpbnQJCQlvcGVuZWRfd2luZG93ID0gRkFMU0U7CisgICAgd2luX1QJCSp3aW47CisgICAgd2luX1QJCSphbHR3aW47CisjZW5kaWYKKyAgICBpbnQJCQlwcmludF9tZXNzYWdlID0gVFJVRTsKKyAgICBpbnQJCQlsZW47CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaW50CQkJb2xkX0tleVR5cGVkID0gS2V5VHlwZWQ7IC8qIGdldHRpbmcgZmlsZSBtYXkgcmVzZXQgaXQgKi8KKyNlbmRpZgorCisgICAgaWYgKHFmX2N1cmxpc3QgPj0gcWZfbGlzdGNvdW50IHx8IHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2NvdW50ID09IDApCisgICAgeworCUVNU0coXyhlX3F1aWNrZml4KSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHFmX3B0ciA9IHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX3B0cjsKKyAgICBvbGRfcWZfcHRyID0gcWZfcHRyOworICAgIHFmX2luZGV4ID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfaW5kZXg7CisgICAgb2xkX3FmX2luZGV4ID0gcWZfaW5kZXg7CisgICAgaWYgKGRpciA9PSBGT1JXQVJEIHx8IGRpciA9PSBGT1JXQVJEX0ZJTEUpCSAgICAvKiBuZXh0IHZhbGlkIGVudHJ5ICovCisgICAgeworCXdoaWxlIChlcnJvcm5yLS0pCisJeworCSAgICBvbGRfcWZfcHRyID0gcWZfcHRyOworCSAgICBwcmV2X2luZGV4ID0gcWZfaW5kZXg7CisJICAgIG9sZF9xZl9mbnVtID0gcWZfcHRyLT5xZl9mbnVtOworCSAgICBkbworCSAgICB7CisJCWlmIChxZl9pbmRleCA9PSBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudAorCQkJCQkJICAgfHwgcWZfcHRyLT5xZl9uZXh0ID09IE5VTEwpCisJCXsKKwkJICAgIHFmX3B0ciA9IG9sZF9xZl9wdHI7CisJCSAgICBxZl9pbmRleCA9IHByZXZfaW5kZXg7CisJCSAgICBpZiAoZXJyICE9IE5VTEwpCisJCSAgICB7CisJCQlFTVNHKF8oZXJyKSk7CisJCQlnb3RvIHRoZWVuZDsKKwkJICAgIH0KKwkJICAgIGVycm9ybnIgPSAwOworCQkgICAgYnJlYWs7CisJCX0KKwkJKytxZl9pbmRleDsKKwkJcWZfcHRyID0gcWZfcHRyLT5xZl9uZXh0OworCSAgICB9IHdoaWxlICgoIXFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX25vbmV2YWxpZCAmJiAhcWZfcHRyLT5xZl92YWxpZCkKKwkJICB8fCAoZGlyID09IEZPUldBUkRfRklMRSAmJiBxZl9wdHItPnFmX2ZudW0gPT0gb2xkX3FmX2ZudW0pKTsKKwkgICAgZXJyID0gTlVMTDsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKGRpciA9PSBCQUNLV0FSRCB8fCBkaXIgPT0gQkFDS1dBUkRfRklMRSkgIC8qIHByZXYuIHZhbGlkIGVudHJ5ICovCisgICAgeworCXdoaWxlIChlcnJvcm5yLS0pCisJeworCSAgICBvbGRfcWZfcHRyID0gcWZfcHRyOworCSAgICBwcmV2X2luZGV4ID0gcWZfaW5kZXg7CisJICAgIG9sZF9xZl9mbnVtID0gcWZfcHRyLT5xZl9mbnVtOworCSAgICBkbworCSAgICB7CisJCWlmIChxZl9pbmRleCA9PSAxIHx8IHFmX3B0ci0+cWZfcHJldiA9PSBOVUxMKQorCQl7CisJCSAgICBxZl9wdHIgPSBvbGRfcWZfcHRyOworCQkgICAgcWZfaW5kZXggPSBwcmV2X2luZGV4OworCQkgICAgaWYgKGVyciAhPSBOVUxMKQorCQkgICAgeworCQkJRU1TRyhfKGVycikpOworCQkJZ290byB0aGVlbmQ7CisJCSAgICB9CisJCSAgICBlcnJvcm5yID0gMDsKKwkJICAgIGJyZWFrOworCQl9CisJCS0tcWZfaW5kZXg7CisJCXFmX3B0ciA9IHFmX3B0ci0+cWZfcHJldjsKKwkgICAgfSB3aGlsZSAoKCFxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9ub25ldmFsaWQgJiYgIXFmX3B0ci0+cWZfdmFsaWQpCisJCSAgfHwgKGRpciA9PSBCQUNLV0FSRF9GSUxFICYmIHFmX3B0ci0+cWZfZm51bSA9PSBvbGRfcWZfZm51bSkpOworCSAgICBlcnIgPSBOVUxMOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoZXJyb3JuciAhPSAwKQkvKiBnbyB0byBzcGVjaWZpZWQgbnVtYmVyICovCisgICAgeworCXdoaWxlIChlcnJvcm5yIDwgcWZfaW5kZXggJiYgcWZfaW5kZXggPiAxICYmIHFmX3B0ci0+cWZfcHJldiAhPSBOVUxMKQorCXsKKwkgICAgLS1xZl9pbmRleDsKKwkgICAgcWZfcHRyID0gcWZfcHRyLT5xZl9wcmV2OworCX0KKwl3aGlsZSAoZXJyb3JuciA+IHFmX2luZGV4ICYmIHFmX2luZGV4IDwgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfY291bnQKKwkJCQkJCSAgICYmIHFmX3B0ci0+cWZfbmV4dCAhPSBOVUxMKQorCXsKKwkgICAgKytxZl9pbmRleDsKKwkgICAgcWZfcHRyID0gcWZfcHRyLT5xZl9uZXh0OworCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9pbmRleCA9IHFmX2luZGV4OworICAgIGlmIChxZl93aW5fcG9zX3VwZGF0ZShvbGRfcWZfaW5kZXgpKQorCS8qIE5vIG5lZWQgdG8gcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaWYgaXQncyB2aXNpYmxlIGluIHRoZSBlcnJvcgorCSAqIHdpbmRvdyAqLworCXByaW50X21lc3NhZ2UgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogSWYgY3VycmVudGx5IGluIHRoZSBxdWlja2ZpeCB3aW5kb3csIGZpbmQgYW5vdGhlciB3aW5kb3cgdG8gc2hvdyB0aGUKKyAgICAgKiBmaWxlIGluLgorICAgICAqLworICAgIGlmIChidF9xdWlja2ZpeChjdXJidWYpKQorICAgIHsKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vIGZpbGUgc3BlY2lmaWVkLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRvIGdvLgorCSAqIEJ1dCBkbyBhZHZhbmNlLCBvdGhlcndpc2UgIjpjbiIgZ2V0cyBzdHVjay4KKwkgKi8KKwlpZiAocWZfcHRyLT5xZl9mbnVtID09IDApCisJICAgIGdvdG8gdGhlZW5kOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB3aW5kb3csIGNyZWF0ZSBhIG5ldyBvbmUgYWJvdmUgdGhlIHF1aWNrZml4CisJICogd2luZG93LgorCSAqLworCWlmIChmaXJzdHdpbiA9PSBsYXN0d2luKQorCXsKKwkgICAgaWYgKHdpbl9zcGxpdCgwLCBXU1BfQUJPVkUpID09IEZBSUwpCisJCWdvdG8gZmFpbGVkOwkJLyogbm90IGVub3VnaCByb29tIGZvciB3aW5kb3cgKi8KKwkgICAgb3BlbmVkX3dpbmRvdyA9IFRSVUU7CS8qIGNsb3NlIGl0IHdoZW4gZmFpbCAqLworCSAgICBwX3N3YiA9IGVtcHR5X29wdGlvbjsJLyogZG9uJ3Qgc3BsaXQgYWdhaW4gKi8KKyMgaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJICAgIGN1cndpbi0+d19wX3NjYiA9IEZBTFNFOworIyBlbmRpZgorCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBUcnkgdG8gZmluZCBhIHdpbmRvdyB0aGF0IHNob3dzIHRoZSByaWdodCBidWZmZXIuCisJICAgICAqIERlZmF1bHQgdG8gdGhlIHdpbmRvdyBqdXN0IGFib3ZlIHRoZSBxdWlja2ZpeCBidWZmZXIuCisJICAgICAqLworCSAgICB3aW4gPSBjdXJ3aW47CisJICAgIGFsdHdpbiA9IE5VTEw7CisJICAgIGZvciAoOzspCisJICAgIHsKKwkJaWYgKHdpbi0+d19idWZmZXItPmJfZm51bSA9PSBxZl9wdHItPnFmX2ZudW0pCisJCSAgICBicmVhazsKKwkJaWYgKHdpbi0+d19wcmV2ID09IE5VTEwpCisJCSAgICB3aW4gPSBsYXN0d2luOwkvKiB3cmFwIGFyb3VuZCB0aGUgdG9wICovCisJCWVsc2UKKwkJICAgIHdpbiA9IHdpbi0+d19wcmV2OwkvKiBnbyB0byBwcmV2aW91cyB3aW5kb3cgKi8KKworCQlpZiAoYnRfcXVpY2tmaXgod2luLT53X2J1ZmZlcikpCisJCXsKKwkJICAgIC8qIERpZG4ndCBmaW5kIGl0LCBnbyB0byB0aGUgd2luZG93IGJlZm9yZSB0aGUgcXVpY2tmaXgKKwkJICAgICAqIHdpbmRvdy4gKi8KKwkJICAgIGlmIChhbHR3aW4gIT0gTlVMTCkKKwkJCXdpbiA9IGFsdHdpbjsKKwkJICAgIGVsc2UgaWYgKGN1cndpbi0+d19wcmV2ICE9IE5VTEwpCisJCQl3aW4gPSBjdXJ3aW4tPndfcHJldjsKKwkJICAgIGVsc2UKKwkJCXdpbiA9IGN1cndpbi0+d19uZXh0OworCQkgICAgYnJlYWs7CisJCX0KKworCQkvKiBSZW1lbWJlciBhIHVzYWJsZSB3aW5kb3cuICovCisJCWlmIChhbHR3aW4gPT0gTlVMTCAmJiAhd2luLT53X3BfcHZ3CisJCQkJCSAgICYmIHdpbi0+d19idWZmZXItPmJfcF9idFswXSA9PSBOVUwpCisJCSAgICBhbHR3aW4gPSB3aW47CisJICAgIH0KKworCSAgICB3aW5fZ290byh3aW4pOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgYSBmaWxlIG5hbWUsCisgICAgICogcmVhZCB0aGUgd2FudGVkIGZpbGUgaWYgbmVlZGVkLCBhbmQgY2hlY2sgYXV0b3dyaXRlIGV0Yy4KKyAgICAgKi8KKyAgICBvbGRfY3VyYnVmID0gY3VyYnVmOworICAgIG9sZF9sbnVtID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGlmIChxZl9wdHItPnFmX2ZudW0gPT0gMCB8fCBidWZsaXN0X2dldGZpbGUocWZfcHRyLT5xZl9mbnVtLAorCQkgICAgKGxpbmVucl9UKTEsIEdFVEZfU0VUTUFSSyB8IEdFVEZfU1dJVENILCBmb3JjZWl0KSA9PSBPSykKKyAgICB7CisJLyogV2hlbiBub3Qgc3dpdGNoZWQgdG8gYW5vdGhlciBidWZmZXIsIHN0aWxsIG5lZWQgdG8gc2V0IHBjIG1hcmsgKi8KKwlpZiAoY3VyYnVmID09IG9sZF9jdXJidWYpCisJICAgIHNldHBjbWFyaygpOworCisJLyoKKwkgKiBHbyB0byBsaW5lIHdpdGggZXJyb3IsIHVubGVzcyBxZl9sbnVtIGlzIDAuCisJICovCisJaSA9IHFmX3B0ci0+cWZfbG51bTsKKwlpZiAoaSA+IDApCisJeworCSAgICBpZiAoaSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQlpID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGk7CisJfQorCWlmIChxZl9wdHItPnFmX2NvbCA+IDApCisJeworCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHFmX3B0ci0+cWZfY29sIC0gMTsKKwkgICAgaWYgKHFmX3B0ci0+cWZfdmlydF9jb2wgPT0gVFJVRSkKKwkgICAgeworCQkvKgorCQkgKiBDaGVjayBlYWNoIGNoYXJhY3RlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVycm9yCisJCSAqIGxpbmUgdXAgdG8gdGhlIGVycm9yIGNvbHVtbi4gIEZvciBlYWNoIHRhYiBjaGFyYWN0ZXIKKwkJICogZm91bmQsIHJlZHVjZSB0aGUgZXJyb3IgY29sdW1uIHZhbHVlIGJ5IHRoZSBsZW5ndGggb2YKKwkJICogYSB0YWIgY2hhcmFjdGVyLgorCQkgKi8KKwkJbGluZSA9IG1sX2dldF9jdXJsaW5lKCk7CisJCXNjcmVlbl9jb2wgPSAwOworCQlmb3IgKGNoYXJfY29sID0gMDsgY2hhcl9jb2wgPCBjdXJ3aW4tPndfY3Vyc29yLmNvbDsgKytjaGFyX2NvbCkKKwkJeworCQkgICAgaWYgKCpsaW5lID09IE5VTCkKKwkJCWJyZWFrOworCQkgICAgaWYgKCpsaW5lKysgPT0gJ1x0JykKKwkJICAgIHsKKwkJCWN1cndpbi0+d19jdXJzb3IuY29sIC09IDcgLSAoc2NyZWVuX2NvbCAlIDgpOworCQkJc2NyZWVuX2NvbCArPSA4IC0gKHNjcmVlbl9jb2wgJSA4KTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCSsrc2NyZWVuX2NvbDsKKwkJfQorCSAgICB9CisJICAgIGNoZWNrX2N1cnNvcigpOworCX0KKwllbHNlCisJICAgIGJlZ2lubGluZShCTF9XSElURSB8IEJMX0ZJWCk7CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAoKGZkb19mbGFncyAmIEZET19RVUlDS0ZJWCkgJiYgb2xkX0tleVR5cGVkKQorCSAgICBmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisJaWYgKHByaW50X21lc3NhZ2UpCisJeworCSAgICAvKiBVcGRhdGUgdGhlIHNjcmVlbiBiZWZvcmUgc2hvd2luZyB0aGUgbWVzc2FnZSAqLworCSAgICB1cGRhdGVfdG9wbGluZV9yZWRyYXcoKTsKKwkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiKCVkIG9mICVkKSVzJXM6ICIpLCBxZl9pbmRleCwKKwkJICAgIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2NvdW50LAorCQkgICAgcWZfcHRyLT5xZl9jbGVhcmVkID8gXygiIChsaW5lIGRlbGV0ZWQpIikgOiAiIiwKKwkJICAgIChjaGFyICopcWZfdHlwZXMocWZfcHRyLT5xZl90eXBlLCBxZl9wdHItPnFmX25yKSk7CisJICAgIC8qIEFkZCB0aGUgbWVzc2FnZSwgc2tpcHBpbmcgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBuZXdsaW5lcy4gKi8KKwkgICAgbGVuID0gKGludClTVFJMRU4oSU9idWZmKTsKKwkgICAgcWZfZm10X3RleHQoc2tpcHdoaXRlKHFmX3B0ci0+cWZfdGV4dCksIElPYnVmZiArIGxlbiwgSU9TSVpFIC0gbGVuKTsKKworCSAgICAvKiBPdXRwdXQgdGhlIG1lc3NhZ2UuICBPdmVyd3JpdGUgdG8gYXZvaWQgc2Nyb2xsaW5nIHdoZW4gdGhlICdPJworCSAgICAgKiBmbGFnIGlzIHByZXNlbnQgaW4gJ3Nob3J0bWVzcyc7IEJ1dCB3aGVuIG5vdCBqdW1waW5nLCBwcmludCB0aGUKKwkgICAgICogd2hvbGUgbWVzc2FnZS4gKi8KKwkgICAgaSA9IG1zZ19zY3JvbGw7CisJICAgIGlmIChjdXJidWYgPT0gb2xkX2N1cmJ1ZiAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gb2xkX2xudW0pCisJCW1zZ19zY3JvbGwgPSBUUlVFOworCSAgICBlbHNlIGlmICghbXNnX3Njcm9sbGVkICYmIHNob3J0bWVzcyhTSE1fT1ZFUkFMTCkpCisJCW1zZ19zY3JvbGwgPSBGQUxTRTsKKwkgICAgbXNnX2F0dHJfa2VlcChJT2J1ZmYsIDAsIFRSVUUpOworCSAgICBtc2dfc2Nyb2xsID0gaTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJaWYgKG9wZW5lZF93aW5kb3cpCisJICAgIHdpbl9jbG9zZShjdXJ3aW4sIFRSVUUpOyAgICAvKiBDbG9zZSBvcGVuZWQgd2luZG93ICovCisjZW5kaWYKKwlpZiAocWZfcHRyLT5xZl9mbnVtICE9IDApCisJeworCSAgICAvKgorCSAgICAgKiBDb3VsZG4ndCBvcGVuIGZpbGUsIHNvIHB1dCBpbmRleCBiYWNrIHdoZXJlIGl0IHdhcy4gIFRoaXMgY291bGQKKwkgICAgICogaGFwcGVuIGlmIHRoZSBmaWxlIHdhcyByZWFkb25seSBhbmQgd2UgY2hhbmdlZCBzb21ldGhpbmcuCisJICAgICAqLworI2lmZGVmIEZFQVRfV0lORE9XUworZmFpbGVkOgorI2VuZGlmCisJICAgIHFmX3B0ciA9IG9sZF9xZl9wdHI7CisJICAgIHFmX2luZGV4ID0gb2xkX3FmX2luZGV4OworCX0KKyAgICB9Cit0aGVlbmQ6CisgICAgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfcHRyID0gcWZfcHRyOworICAgIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4ID0gcWZfaW5kZXg7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKHBfc3diICE9IG9sZF9zd2IgJiYgb3BlbmVkX3dpbmRvdykKKyAgICB7CisJLyogUmVzdG9yZSBvbGQgJ3N3aXRjaGJ1ZicgdmFsdWUsIGJ1dCBub3Qgd2hlbiBhbiBhdXRvY29tbWFuZCBvcgorCSAqIG1vZGVsaW5lIGhhcyBjaGFuZ2VkIHRoZSB2YWx1ZS4gKi8KKwlpZiAocF9zd2IgPT0gZW1wdHlfb3B0aW9uKQorCSAgICBwX3N3YiA9IG9sZF9zd2I7CisJZWxzZQorCSAgICBmcmVlX3N0cmluZ19vcHRpb24ob2xkX3N3Yik7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiAiOmNsaXN0IjogbGlzdCBhbGwgZXJyb3JzCisgKi8KKyAgICB2b2lkCitxZl9saXN0KGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgYnVmX1QJCSpidWY7CisgICAgY2hhcl91CQkqZm5hbWU7CisgICAgc3RydWN0IHFmX2xpbmUJKnFmcDsKKyAgICBpbnQJCQlpOworICAgIGludAkJCWlkeDEgPSAxOworICAgIGludAkJCWlkeDIgPSAtMTsKKyAgICBpbnQJCQluZWVkX3JldHVybiA9IFRSVUU7CisgICAgaW50CQkJbGFzdF9wcmludGVkID0gMTsKKyAgICBjaGFyX3UJCSphcmcgPSBlYXAtPmFyZzsKKyAgICBpbnQJCQlhbGwgPSBlYXAtPmZvcmNlaXQ7CS8qIGlmIG5vdCA6Y2whLCBvbmx5IHNob3cKKwkJCQkJCSAgIHJlY29nbmlzZWQgZXJyb3JzICovCisKKyAgICBpZiAocWZfY3VybGlzdCA+PSBxZl9saXN0Y291bnQgfHwgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfY291bnQgPT0gMCkKKyAgICB7CisJRU1TRyhfKGVfcXVpY2tmaXgpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmICghZ2V0X2xpc3RfcmFuZ2UoJmFyZywgJmlkeDEsICZpZHgyKSB8fCAqYXJnICE9IE5VTCkKKyAgICB7CisJRU1TRyhfKGVfdHJhaWxpbmcpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGkgPSBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudDsKKyAgICBpZiAoaWR4MSA8IDApCisJaWR4MSA9ICgtaWR4MSA+IGkpID8gMCA6IGlkeDEgKyBpICsgMTsKKyAgICBpZiAoaWR4MiA8IDApCisJaWR4MiA9ICgtaWR4MiA+IGkpID8gMCA6IGlkeDIgKyBpICsgMTsKKworICAgIG1vcmVfYmFja191c2VkID0gVFJVRTsKKyAgICBpZiAocWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfbm9uZXZhbGlkKQorCWFsbCA9IFRSVUU7CisgICAgcWZwID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfc3RhcnQ7CisgICAgZm9yIChpID0gMTsgIWdvdF9pbnQgJiYgaSA8PSBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9jb3VudDsgKQorICAgIHsKKwlpZiAoKHFmcC0+cWZfdmFsaWQgfHwgYWxsKSAmJiBpZHgxIDw9IGkgJiYgaSA8PSBpZHgyKQorCXsKKwkgICAgaWYgKG5lZWRfcmV0dXJuKQorCSAgICB7CisJCW1zZ19wdXRjaGFyKCdcbicpOworCQluZWVkX3JldHVybiA9IEZBTFNFOworCSAgICB9CisJICAgIGlmIChtb3JlX2JhY2sgPT0gMCkKKwkgICAgeworCQlmbmFtZSA9IE5VTEw7CisJCWlmIChxZnAtPnFmX2ZudW0gIT0gMAorCQkJICAgICAgJiYgKGJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKHFmcC0+cWZfZm51bSkpICE9IE5VTEwpCisJCXsKKwkJICAgIGZuYW1lID0gYnVmLT5iX2ZuYW1lOworCQkgICAgaWYgKHFmcC0+cWZfdHlwZSA9PSAxKQkvKiA6aGVscGdyZXAgKi8KKwkJCWZuYW1lID0gZ2V0dGFpbChmbmFtZSk7CisJCX0KKwkJaWYgKGZuYW1lID09IE5VTEwpCisJCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAiJTJkIiwgaSk7CisJCWVsc2UKKwkJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsICIlMmQgJXMiLCBpLCAoY2hhciAqKWZuYW1lKTsKKwkJbXNnX291dHRyYW5zX2F0dHIoSU9idWZmLCBpID09IHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4CisJCQk/IGhsX2F0dHIoSExGX0wpIDogaGxfYXR0cihITEZfRCkpOworCQlpZiAocWZwLT5xZl9sbnVtID09IDApCisJCSAgICBJT2J1ZmZbMF0gPSBOVUw7CisJCWVsc2UgaWYgKHFmcC0+cWZfY29sID09IDApCisJCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAiOiVsZCIsIHFmcC0+cWZfbG51bSk7CisJCWVsc2UKKwkJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsICI6JWxkIGNvbCAlZCIsCisJCQkJCQkgICBxZnAtPnFmX2xudW0sIHFmcC0+cWZfY29sKTsKKwkJc3ByaW50ZigoY2hhciAqKUlPYnVmZiArIFNUUkxFTihJT2J1ZmYpLCAiJXM6ICIsCisJCQkJICAoY2hhciAqKXFmX3R5cGVzKHFmcC0+cWZfdHlwZSwgcWZwLT5xZl9ucikpOworCQltc2dfcHV0c19hdHRyKElPYnVmZiwgaGxfYXR0cihITEZfTikpOworCQkvKiBSZW1vdmUgbmV3bGluZXMgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZXh0LgorCQkgKiBGb3IgYW4gdW5yZWNvZ25pemVkIGxpbmUga2VlcCB0aGUgaW5kZW50LCB0aGUgY29tcGlsZXIgbWF5CisJCSAqIG1hcmsgYSB3b3JkIHdpdGggXl5eXi4gKi8KKwkJcWZfZm10X3RleHQoKGZuYW1lICE9IE5VTEwgfHwgcWZwLT5xZl9sbnVtICE9IDApCisJCQkJICAgICA/IHNraXB3aGl0ZShxZnAtPnFmX3RleHQpIDogcWZwLT5xZl90ZXh0LAorCQkJCQkJCSAgICAgIElPYnVmZiwgSU9TSVpFKTsKKwkJbXNnX3BydF9saW5lKElPYnVmZik7CisJCW91dF9mbHVzaCgpOwkJLyogc2hvdyBvbmUgbGluZSBhdCBhIHRpbWUgKi8KKwkJbmVlZF9yZXR1cm4gPSBUUlVFOworCQlsYXN0X3ByaW50ZWQgPSBpOworCSAgICB9CisJfQorCWlmIChtb3JlX2JhY2spCisJeworCSAgICAvKiBzY3JvbGxpbmcgYmFja3dhcmRzIGZyb20gdGhlIG1vcmUtcHJvbXB0ICovCisJICAgIC8qIFRPRE86IGNvbXB1dGUgdGhlIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBzY3JlZW4gbGluZXMgKi8KKwkgICAgbW9yZV9iYWNrID0gbW9yZV9iYWNrICogMiAtIDE7CisJICAgIHdoaWxlIChpID4gbGFzdF9wcmludGVkIC0gbW9yZV9iYWNrICYmIGkgPiBpZHgxKQorCSAgICB7CisJCWRvCisJCXsKKwkJICAgIHFmcCA9IHFmcC0+cWZfcHJldjsKKwkJICAgIC0taTsKKwkJfQorCQl3aGlsZSAoaSA+IGlkeDEgJiYgIXFmcC0+cWZfdmFsaWQgJiYgIWFsbCk7CisJICAgIH0KKwkgICAgbW9yZV9iYWNrID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgcWZwID0gcWZwLT5xZl9uZXh0OworCSAgICArK2k7CisJfQorCXVpX2JyZWFrY2hlY2soKTsKKyAgICB9CisgICAgbW9yZV9iYWNrX3VzZWQgPSBGQUxTRTsKK30KKworLyoKKyAqIFJlbW92ZSBuZXdsaW5lcyBhbmQgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gYW4gZXJyb3IgbWVzc2FnZS4KKyAqIFB1dCB0aGUgcmVzdWx0IGluICJidWZbYnVmc2l6ZV0iLgorICovCisgICAgc3RhdGljIHZvaWQKK3FmX2ZtdF90ZXh0KHRleHQsIGJ1ZiwgYnVmc2l6ZSkKKyAgICBjaGFyX3UJKnRleHQ7CisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlidWZzaXplOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKnAgPSB0ZXh0OworCisgICAgZm9yIChpID0gMDsgKnAgIT0gTlVMICYmIGkgPCBidWZzaXplIC0gMTsgKytpKQorICAgIHsKKwlpZiAoKnAgPT0gJ1xuJykKKwl7CisJICAgIGJ1ZltpXSA9ICcgJzsKKwkgICAgd2hpbGUgKCorK3AgIT0gTlVMKQorCQlpZiAoIXZpbV9pc3doaXRlKCpwKSAmJiAqcCAhPSAnXG4nKQorCQkgICAgYnJlYWs7CisJfQorCWVsc2UKKwkgICAgYnVmW2ldID0gKnArKzsKKyAgICB9CisgICAgYnVmW2ldID0gTlVMOworfQorCisvKgorICogIjpjb2xkZXIgW2NvdW50XSI6IFVwIGluIHRoZSBxdWlja2ZpeCBzdGFjay4KKyAqICI6Y25ld2VyIFtjb3VudF0iOiBEb3duIGluIHRoZSBxdWlja2ZpeCBzdGFjay4KKyAqLworICAgIHZvaWQKK3FmX2FnZShlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJY291bnQ7CisKKyAgICBpZiAoZWFwLT5hZGRyX2NvdW50ICE9IDApCisJY291bnQgPSBlYXAtPmxpbmUyOworICAgIGVsc2UKKwljb3VudCA9IDE7CisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgeworCWlmIChlYXAtPmNtZGlkeCA9PSBDTURfY29sZGVyKQorCXsKKwkgICAgaWYgKHFmX2N1cmxpc3QgPT0gMCkKKwkgICAgeworCQlFTVNHKF8oIkUzODA6IEF0IGJvdHRvbSBvZiBxdWlja2ZpeCBzdGFjayIpKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIC0tcWZfY3VybGlzdDsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKHFmX2N1cmxpc3QgPj0gcWZfbGlzdGNvdW50IC0gMSkKKwkgICAgeworCQlFTVNHKF8oIkUzODE6IEF0IHRvcCBvZiBxdWlja2ZpeCBzdGFjayIpKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgICsrcWZfY3VybGlzdDsKKwl9CisgICAgfQorICAgIHFmX21zZygpOworfQorCisgICAgc3RhdGljIHZvaWQKK3FmX21zZygpCit7CisgICAgc21zZygoY2hhcl91ICopXygiZXJyb3IgbGlzdCAlZCBvZiAlZDsgJWQgZXJyb3JzIiksCisJICAgIHFmX2N1cmxpc3QgKyAxLCBxZl9saXN0Y291bnQsIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2NvdW50KTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBxZl91cGRhdGVfYnVmZmVyKCk7CisjZW5kaWYKK30KKworLyoKKyAqIGZyZWUgdGhlIGVycm9yIGxpc3QKKyAqLworICAgIHN0YXRpYyB2b2lkCitxZl9mcmVlKGlkeCkKKyAgICBpbnQJCWlkeDsKK3sKKyAgICBzdHJ1Y3QgcWZfbGluZSAqcWZwOworCisgICAgd2hpbGUgKHFmX2xpc3RzW2lkeF0ucWZfY291bnQpCisgICAgeworCXFmcCA9IHFmX2xpc3RzW2lkeF0ucWZfc3RhcnQtPnFmX25leHQ7CisJdmltX2ZyZWUocWZfbGlzdHNbaWR4XS5xZl9zdGFydC0+cWZfdGV4dCk7CisJdmltX2ZyZWUocWZfbGlzdHNbaWR4XS5xZl9zdGFydCk7CisJcWZfbGlzdHNbaWR4XS5xZl9zdGFydCA9IHFmcDsKKwktLXFmX2xpc3RzW2lkeF0ucWZfY291bnQ7CisgICAgfQorfQorCisvKgorICogcWZfbWFya19hZGp1c3Q6IGFkanVzdCBtYXJrcworICovCisgICB2b2lkCitxZl9tYXJrX2FkanVzdChsaW5lMSwgbGluZTIsIGFtb3VudCwgYW1vdW50X2FmdGVyKQorICAgIGxpbmVucl9UCWxpbmUxOworICAgIGxpbmVucl9UCWxpbmUyOworICAgIGxvbmcJYW1vdW50OworICAgIGxvbmcJYW1vdW50X2FmdGVyOworeworICAgIGludAkJCWk7CisgICAgc3RydWN0IHFmX2xpbmUJKnFmcDsKKyAgICBpbnQJCQlpZHg7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHFmX2xpc3Rjb3VudDsgKytpZHgpCisJaWYgKHFmX2xpc3RzW2lkeF0ucWZfY291bnQpCisJICAgIGZvciAoaSA9IDAsIHFmcCA9IHFmX2xpc3RzW2lkeF0ucWZfc3RhcnQ7CisJCSAgICAgICBpIDwgcWZfbGlzdHNbaWR4XS5xZl9jb3VudDsgKytpLCBxZnAgPSBxZnAtPnFmX25leHQpCisJCWlmIChxZnAtPnFmX2ZudW0gPT0gY3VyYnVmLT5iX2ZudW0pCisJCXsKKwkJICAgIGlmIChxZnAtPnFmX2xudW0gPj0gbGluZTEgJiYgcWZwLT5xZl9sbnVtIDw9IGxpbmUyKQorCQkgICAgeworCQkJaWYgKGFtb3VudCA9PSBNQVhMTlVNKQorCQkJICAgIHFmcC0+cWZfY2xlYXJlZCA9IFRSVUU7CisJCQllbHNlCisJCQkgICAgcWZwLT5xZl9sbnVtICs9IGFtb3VudDsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGFtb3VudF9hZnRlciAmJiBxZnAtPnFmX2xudW0gPiBsaW5lMikKKwkJCXFmcC0+cWZfbG51bSArPSBhbW91bnRfYWZ0ZXI7CisJCX0KK30KKworLyoKKyAqIE1ha2UgYSBuaWNlIG1lc3NhZ2Ugb3V0IG9mIHRoZSBlcnJvciBjaGFyYWN0ZXIgYW5kIHRoZSBlcnJvciBudW1iZXI6CisgKiAgY2hhciAgICBudW1iZXIJbWVzc2FnZQorICogIGUgb3IgRSAgICAwCQkiIGVycm9yIgorICogIHcgb3IgVyAgICAwCQkiIHdhcm5pbmciCisgKiAgaSBvciBJICAgIDAJCSIgaW5mbyIKKyAqICAwCSAgICAgIDAJCSIiCisgKiAgb3RoZXIgICAgIDAJCSIgYyIKKyAqICBlIG9yIEUgICAgbgkJIiBlcnJvciBuIgorICogIHcgb3IgVyAgICBuCQkiIHdhcm5pbmcgbiIKKyAqICBpIG9yIEkgICAgbgkJIiBpbmZvIG4iCisgKiAgMAkgICAgICBuCQkiIGVycm9yIG4iCisgKiAgb3RoZXIgICAgIG4JCSIgYyBuIgorICogIDEJICAgICAgeAkJIiIJOmhlbHBncmVwCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3FmX3R5cGVzKGMsIG5yKQorICAgIGludCBjLCBucjsKK3sKKyAgICBzdGF0aWMgY2hhcl91CWJ1ZlsyMF07CisgICAgc3RhdGljIGNoYXJfdQljY1szXTsKKyAgICBjaGFyX3UJCSpwOworCisgICAgaWYgKGMgPT0gJ1cnIHx8IGMgPT0gJ3cnKQorCXAgPSAoY2hhcl91ICopIiB3YXJuaW5nIjsKKyAgICBlbHNlIGlmIChjID09ICdJJyB8fCBjID09ICdpJykKKwlwID0gKGNoYXJfdSAqKSIgaW5mbyI7CisgICAgZWxzZSBpZiAoYyA9PSAnRScgfHwgYyA9PSAnZScgfHwgKGMgPT0gMCAmJiBuciA+IDApKQorCXAgPSAoY2hhcl91ICopIiBlcnJvciI7CisgICAgZWxzZSBpZiAoYyA9PSAwIHx8IGMgPT0gMSkKKwlwID0gKGNoYXJfdSAqKSIiOworICAgIGVsc2UKKyAgICB7CisJY2NbMF0gPSAnICc7CisJY2NbMV0gPSBjOworCWNjWzJdID0gTlVMOworCXAgPSBjYzsKKyAgICB9CisKKyAgICBpZiAobnIgPD0gMCkKKwlyZXR1cm4gcDsKKworICAgIHNwcmludGYoKGNoYXIgKilidWYsICIlcyAlM2QiLCAoY2hhciAqKXAsIG5yKTsKKyAgICByZXR1cm4gYnVmOworfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogIjpjd2luZG93Ijogb3BlbiB0aGUgcXVpY2tmaXggd2luZG93IGlmIHdlIGhhdmUgZXJyb3JzIHRvIGRpc3BsYXksCisgKgkgICAgICAgY2xvc2UgaXQgaWYgbm90LgorICovCisgICAgdm9pZAorZXhfY3dpbmRvdyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIHdpbl9UCSp3aW47CisKKyAgICAvKgorICAgICAqIExvb2sgZm9yIGFuIGV4aXN0aW5nIHF1aWNrZml4IHdpbmRvdy4KKyAgICAgKi8KKyAgICBmb3IgKHdpbiA9IGZpcnN0d2luOyB3aW4gIT0gTlVMTDsgd2luID0gd2luLT53X25leHQpCisJaWYgKGJ0X3F1aWNrZml4KHdpbi0+d19idWZmZXIpKQorCSAgICBicmVhazsKKworICAgIC8qCisgICAgICogSWYgYSBxdWlja2ZpeCB3aW5kb3cgaXMgb3BlbiBidXQgd2UgaGF2ZSBubyBlcnJvcnMgdG8gZGlzcGxheSwKKyAgICAgKiBjbG9zZSB0aGUgd2luZG93LiAgSWYgYSBxdWlja2ZpeCB3aW5kb3cgaXMgbm90IG9wZW4sIHRoZW4gb3BlbgorICAgICAqIGl0IGlmIHdlIGhhdmUgZXJyb3JzOyBvdGhlcndpc2UsIGxlYXZlIGl0IGNsb3NlZC4KKyAgICAgKi8KKyAgICBpZiAocWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfbm9uZXZhbGlkIHx8IHFmX2N1cmxpc3QgPj0gcWZfbGlzdGNvdW50KQorICAgIHsKKwlpZiAod2luICE9IE5VTEwpCisJICAgIGV4X2NjbG9zZShlYXApOworICAgIH0KKyAgICBlbHNlIGlmICh3aW4gPT0gTlVMTCkKKwlleF9jb3BlbihlYXApOworfQorCisvKgorICogIjpjY2xvc2UiOiBjbG9zZSB0aGUgd2luZG93IHNob3dpbmcgdGhlIGxpc3Qgb2YgZXJyb3JzLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCitleF9jY2xvc2UoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICB3aW5fVAkqd2luOworCisgICAgLyoKKyAgICAgKiBGaW5kIGV4aXN0aW5nIHF1aWNrZml4IHdpbmRvdyBhbmQgY2xvc2UgaXQuCisgICAgICovCisgICAgZm9yICh3aW4gPSBmaXJzdHdpbjsgd2luICE9IE5VTEw7IHdpbiA9IHdpbi0+d19uZXh0KQorCWlmIChidF9xdWlja2ZpeCh3aW4tPndfYnVmZmVyKSkKKwkgICAgYnJlYWs7CisKKyAgICBpZiAod2luICE9IE5VTEwpCisJd2luX2Nsb3NlKHdpbiwgRkFMU0UpOworfQorCisvKgorICogIjpjb3BlbiI6IG9wZW4gYSB3aW5kb3cgdGhhdCBzaG93cyB0aGUgbGlzdCBvZiBlcnJvcnMuCisgKi8KKyAgICB2b2lkCitleF9jb3BlbihlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaGVpZ2h0OworICAgIGJ1Zl9UCSpidWY7CisgICAgd2luX1QJKndpbjsKKworICAgIGlmIChlYXAtPmFkZHJfY291bnQgIT0gMCkKKwloZWlnaHQgPSBlYXAtPmxpbmUyOworICAgIGVsc2UKKwloZWlnaHQgPSBRRl9XSU5IRUlHSFQ7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIHJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJCQkvKiBzdG9wIFZpc3VhbCBtb2RlICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworICAgIC8qCisgICAgICogRmluZCBleGlzdGluZyBxdWlja2ZpeCB3aW5kb3csIG9yIG9wZW4gYSBuZXcgb25lLgorICAgICAqLworICAgIGZvciAod2luID0gZmlyc3R3aW47IHdpbiAhPSBOVUxMOyB3aW4gPSB3aW4tPndfbmV4dCkKKwlpZiAoYnRfcXVpY2tmaXgod2luLT53X2J1ZmZlcikpCisJICAgIGJyZWFrOworICAgIGlmICh3aW4gIT0gTlVMTCkKKwl3aW5fZ290byh3aW4pOworICAgIGVsc2UKKyAgICB7CisJLyogVGhlIGN1cnJlbnQgd2luZG93IGJlY29tZXMgdGhlIHByZXZpb3VzIHdpbmRvdyBhZnRlcndhcmRzLiAqLworCXdpbiA9IGN1cndpbjsKKworCS8qIENyZWF0ZSB0aGUgbmV3IHdpbmRvdyBhdCB0aGUgdmVyeSBib3R0b20uICovCisJd2luX2dvdG8obGFzdHdpbik7CisJaWYgKHdpbl9zcGxpdChoZWlnaHQsIFdTUF9CRUxPVykgPT0gRkFJTCkKKwkgICAgcmV0dXJuOwkJLyogbm90IGVub3VnaCByb29tIGZvciB3aW5kb3cgKi8KKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwljdXJ3aW4tPndfcF9zY2IgPSBGQUxTRTsKKyNlbmRpZgorCisJLyoKKwkgKiBGaW5kIGV4aXN0aW5nIHF1aWNrZml4IGJ1ZmZlciwgb3IgY3JlYXRlIGEgbmV3IG9uZS4KKwkgKi8KKwlidWYgPSBxZl9maW5kX2J1ZigpOworCWlmIChidWYgPT0gTlVMTCkKKwl7CisJICAgICh2b2lkKWRvX2VjbWQoMCwgTlVMTCwgTlVMTCwgTlVMTCwgRUNNRF9PTkUsIEVDTURfSElERSk7CisJICAgIC8qIHN3aXRjaCBvZmYgJ3N3YXBmaWxlJyAqLworCSAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikic3dmIiwgMEwsIE5VTEwsIE9QVF9MT0NBTCk7CisJICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJidCIsIDBMLCAoY2hhcl91ICopInF1aWNrZml4IiwKKwkJCQkJCQkJICAgT1BUX0xPQ0FMKTsKKwkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImJoIiwgMEwsIChjaGFyX3UgKikiZGVsZXRlIiwgT1BUX0xPQ0FMKTsKKwkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImRpZmYiLCAwTCwgKGNoYXJfdSAqKSIiLCBPUFRfTE9DQUwpOworCX0KKwllbHNlIGlmIChidWYgIT0gY3VyYnVmKQorCSAgICBzZXRfY3VyYnVmKGJ1ZiwgRE9CVUZfR09UTyk7CisKKwkvKiBPbmx5IHNldCB0aGUgaGVpZ2h0IHdoZW4gdGhlcmUgaXMgbm8gd2luZG93IHRvIHRoZSBzaWRlLiAqLworCWlmIChjdXJ3aW4tPndfd2lkdGggPT0gQ29sdW1ucykKKwkgICAgd2luX3NldGhlaWdodChoZWlnaHQpOworCWN1cndpbi0+d19wX3dmaCA9IFRSVUU7CSAgICAvKiBzZXQgJ3dpbmZpeGhlaWdodCcgKi8KKwlpZiAod2luX3ZhbGlkKHdpbikpCisJICAgIHByZXZ3aW4gPSB3aW47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgcXVpY2tmaXggbGlzdC4KKyAgICAgKi8KKyAgICBxZl9maWxsX2J1ZmZlcigpOworCisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfaW5kZXg7CisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworICAgIGNoZWNrX2N1cnNvcigpOworICAgIHVwZGF0ZV90b3BsaW5lKCk7CQkvKiBzY3JvbGwgdG8gc2hvdyB0aGUgbGluZSAqLworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZW50cnkgKGxpbmUgbnVtYmVyIGluIHRoZSBxdWlja2ZpeAorICogd2luZG93KS4KKyAqLworICAgICBsaW5lbnJfVAorcWZfY3VycmVudF9lbnRyeSgpCit7CisgICAgcmV0dXJuIHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2luZGV4OworfQorCisvKgorICogVXBkYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHF1aWNrZml4IHdpbmRvdyB0byB0aGUgY3VycmVudCBlcnJvci4KKyAqIFJldHVybiBUUlVFIGlmIHRoZXJlIGlzIGEgcXVpY2tmaXggd2luZG93LgorICovCisgICAgc3RhdGljIGludAorcWZfd2luX3Bvc191cGRhdGUob2xkX3FmX2luZGV4KQorICAgIGludAkJb2xkX3FmX2luZGV4OwkvKiBwcmV2aW91cyBxZl9pbmRleCBvciB6ZXJvICovCit7CisgICAgd2luX1QJKndpbjsKKyAgICBpbnQJCXFmX2luZGV4ID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfaW5kZXg7CisKKyAgICAvKgorICAgICAqIFB1dCB0aGUgY3Vyc29yIG9uIHRoZSBjdXJyZW50IGVycm9yIGluIHRoZSBxdWlja2ZpeCB3aW5kb3csIHNvIHRoYXQKKyAgICAgKiBpdCdzIHZpZXdhYmxlLgorICAgICAqLworICAgIGZvciAod2luID0gZmlyc3R3aW47IHdpbiAhPSBOVUxMOyB3aW4gPSB3aW4tPndfbmV4dCkKKwlpZiAoYnRfcXVpY2tmaXgod2luLT53X2J1ZmZlcikpCisJICAgIGJyZWFrOworICAgIGlmICh3aW4gIT0gTlVMTAorCSAgICAmJiBxZl9pbmRleCA8PSB3aW4tPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQKKwkgICAgJiYgb2xkX3FmX2luZGV4ICE9IHFmX2luZGV4KQorICAgIHsKKwl3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKworCWN1cndpbiA9IHdpbjsKKwljdXJidWYgPSB3aW4tPndfYnVmZmVyOworCWlmIChxZl9pbmRleCA+IG9sZF9xZl9pbmRleCkKKwl7CisJICAgIGN1cndpbi0+d19yZWRyYXdfdG9wID0gb2xkX3FmX2luZGV4OworCSAgICBjdXJ3aW4tPndfcmVkcmF3X2JvdCA9IHFmX2luZGV4OworCX0KKwllbHNlCisJeworCSAgICBjdXJ3aW4tPndfcmVkcmF3X3RvcCA9IHFmX2luZGV4OworCSAgICBjdXJ3aW4tPndfcmVkcmF3X2JvdCA9IG9sZF9xZl9pbmRleDsKKwl9CisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gcWZfaW5kZXg7CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCXVwZGF0ZV90b3BsaW5lKCk7CQkvKiBzY3JvbGwgdG8gc2hvdyB0aGUgbGluZSAqLworCXJlZHJhd19sYXRlcihWQUxJRCk7CisJY3Vyd2luLT53X3JlZHJfc3RhdHVzID0gVFJVRTsJLyogdXBkYXRlIHJ1bGVyICovCisJY3Vyd2luID0gb2xkX2N1cndpbjsKKwljdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworICAgIH0KKyAgICByZXR1cm4gd2luICE9IE5VTEw7Cit9CisKKy8qCisgKiBGaW5kIHF1aWNrZml4IGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyBidWZfVCAqCitxZl9maW5kX2J1ZigpCit7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKKwlpZiAoYnRfcXVpY2tmaXgoYnVmKSkKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIEZpbmQgdGhlIHF1aWNrZml4IGJ1ZmZlci4gIElmIGl0IGV4aXN0cywgdXBkYXRlIHRoZSBjb250ZW50cy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitxZl91cGRhdGVfYnVmZmVyKCkKK3sKKyAgICBidWZfVAkqYnVmOworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGFjb19zYXZlX1QJYWNvOworI2Vsc2UKKyAgICBidWZfVAkqc2F2ZV9jdXJidWY7CisjZW5kaWYKKworICAgIC8qIENoZWNrIGlmIGEgYnVmZmVyIGZvciB0aGUgcXVpY2tmaXggbGlzdCBleGlzdHMuICBVcGRhdGUgaXQuICovCisgICAgYnVmID0gcWZfZmluZF9idWYoKTsKKyAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgeworI2lmZGVmIEZFQVRfQVVUT0NNRAorCS8qIHNldCBjdXJ3aW4vY3VyYnVmIHRvIGJ1ZiBhbmQgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKwlhdWNtZF9wcmVwYnVmKCZhY28sIGJ1Zik7CisjZWxzZQorCXNhdmVfY3VyYnVmID0gY3VyYnVmOworCWN1cmJ1ZiA9IGJ1ZjsKKyNlbmRpZgorCisJcWZfZmlsbF9idWZmZXIoKTsKKworI2lmZGVmIEZFQVRfQVVUT0NNRAorCS8qIHJlc3RvcmUgY3Vyd2luL2N1cmJ1ZiBhbmQgYSBmZXcgb3RoZXIgdGhpbmdzICovCisJYXVjbWRfcmVzdGJ1ZigmYWNvKTsKKyNlbHNlCisJY3VyYnVmID0gc2F2ZV9jdXJidWY7CisjZW5kaWYKKworCSh2b2lkKXFmX3dpbl9wb3NfdXBkYXRlKDApOworICAgIH0KK30KKworLyoKKyAqIEZpbGwgY3VycmVudCBidWZmZXIgd2l0aCBxdWlja2ZpeCBlcnJvcnMsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMgY29udGVudHMuCisgKiBjdXJidWYgbXVzdCBiZSB0aGUgcXVpY2tmaXggYnVmZmVyIQorICovCisgICAgc3RhdGljIHZvaWQKK3FmX2ZpbGxfYnVmZmVyKCkKK3sKKyAgICBsaW5lbnJfVAkJbG51bTsKKyAgICBzdHJ1Y3QgcWZfbGluZQkqcWZwOworICAgIGJ1Zl9UCQkqZXJyYnVmOworICAgIGludAkJCWxlbjsKKyAgICBpbnQJCQlvbGRfS2V5VHlwZWQgPSBLZXlUeXBlZDsKKworICAgIC8qIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbGluZXMgKi8KKyAgICB3aGlsZSAoKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKSA9PSAwKQorCSh2b2lkKW1sX2RlbGV0ZSgobGluZW5yX1QpMSwgRkFMU0UpOworCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZGlzcGxheSAqLworICAgIGlmIChxZl9jdXJsaXN0IDwgcWZfbGlzdGNvdW50KQorICAgIHsKKwkvKiBBZGQgb25lIGxpbmUgZm9yIGVhY2ggZXJyb3IgKi8KKwlxZnAgPSBxZl9saXN0c1txZl9jdXJsaXN0XS5xZl9zdGFydDsKKwlmb3IgKGxudW0gPSAwOyBsbnVtIDwgcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfY291bnQ7ICsrbG51bSkKKwl7CisJICAgIGlmIChxZnAtPnFmX2ZudW0gIT0gMAorCQkgICAgJiYgKGVycmJ1ZiA9IGJ1Zmxpc3RfZmluZG5yKHFmcC0+cWZfZm51bSkpICE9IE5VTEwKKwkJICAgICYmIGVycmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMKQorCSAgICB7CisJCWlmIChxZnAtPnFmX3R5cGUgPT0gMSkJLyogOmhlbHBncmVwICovCisJCSAgICBTVFJDUFkoSU9idWZmLCBnZXR0YWlsKGVycmJ1Zi0+Yl9mbmFtZSkpOworCQllbHNlCisJCSAgICBTVFJDUFkoSU9idWZmLCBlcnJidWYtPmJfZm5hbWUpOworCQlsZW4gPSAoaW50KVNUUkxFTihJT2J1ZmYpOworCSAgICB9CisJICAgIGVsc2UKKwkJbGVuID0gMDsKKwkgICAgSU9idWZmW2xlbisrXSA9ICd8JzsKKworCSAgICBpZiAocWZwLT5xZl9sbnVtID4gMCkKKwkgICAgeworCQlzcHJpbnRmKChjaGFyICopSU9idWZmICsgbGVuLCAiJWxkIiwgcWZwLT5xZl9sbnVtKTsKKwkJbGVuICs9IChpbnQpU1RSTEVOKElPYnVmZiArIGxlbik7CisKKwkJaWYgKHFmcC0+cWZfY29sID4gMCkKKwkJeworCQkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiArIGxlbiwgIiBjb2wgJWQiLCBxZnAtPnFmX2NvbCk7CisJCSAgICBsZW4gKz0gKGludClTVFJMRU4oSU9idWZmICsgbGVuKTsKKwkJfQorCisJCXNwcmludGYoKGNoYXIgKilJT2J1ZmYgKyBsZW4sICIlcyIsCisJCQkJICAoY2hhciAqKXFmX3R5cGVzKHFmcC0+cWZfdHlwZSwgcWZwLT5xZl9ucikpOworCQlsZW4gKz0gKGludClTVFJMRU4oSU9idWZmICsgbGVuKTsKKwkgICAgfQorCSAgICBJT2J1ZmZbbGVuKytdID0gJ3wnOworCSAgICBJT2J1ZmZbbGVuKytdID0gJyAnOworCisJICAgIC8qIFJlbW92ZSBuZXdsaW5lcyBhbmQgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIHRleHQuCisJICAgICAqIEZvciBhbiB1bnJlY29nbml6ZWQgbGluZSBrZWVwIHRoZSBpbmRlbnQsIHRoZSBjb21waWxlciBtYXkKKwkgICAgICogbWFyayBhIHdvcmQgd2l0aCBeXl5eLiAqLworCSAgICBxZl9mbXRfdGV4dChsZW4gPiAzID8gc2tpcHdoaXRlKHFmcC0+cWZfdGV4dCkgOiBxZnAtPnFmX3RleHQsCisJCQkJCQkgIElPYnVmZiArIGxlbiwgSU9TSVpFIC0gbGVuKTsKKworCSAgICBpZiAobWxfYXBwZW5kKGxudW0sIElPYnVmZiwgKGNvbG5yX1QpU1RSTEVOKElPYnVmZikgKyAxLCBGQUxTRSkKKwkJCQkJCQkJICAgICAgPT0gRkFJTCkKKwkJYnJlYWs7CisJICAgIHFmcCA9IHFmcC0+cWZfbmV4dDsKKwl9CisJLyogRGVsZXRlIHRoZSBlbXB0eSBsaW5lIHdoaWNoIGlzIG5vdyBhdCB0aGUgZW5kICovCisJKHZvaWQpbWxfZGVsZXRlKGxudW0gKyAxLCBGQUxTRSk7CisgICAgfQorCisgICAgLyogY29ycmVjdCBjdXJzb3IgcG9zaXRpb24gKi8KKyAgICBjaGVja19sbnVtcyhUUlVFKTsKKworICAgIC8qIFNldCB0aGUgJ2ZpbGV0eXBlJyB0byAicWYiIGVhY2ggdGltZSBhZnRlciBmaWxsaW5nIHRoZSBidWZmZXIuICBUaGlzCisgICAgICogcmVzZW1ibGVzIHJlYWRpbmcgYSBmaWxlIGludG8gYSBidWZmZXIsIGl0J3MgbW9yZSBsb2dpY2FsIHdoZW4gdXNpbmcKKyAgICAgKiBhdXRvY29tbWFuZHMuICovCisgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImZ0IiwgMEwsIChjaGFyX3UgKikicWYiLCBPUFRfTE9DQUwpOworICAgIGN1cmJ1Zi0+Yl9wX21hID0gRkFMU0U7CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9CVUZSRUFEUE9TVCwgKGNoYXJfdSAqKSJxdWlja2ZpeCIsIE5VTEwsCisJCQkJCQkJICAgICAgIEZBTFNFLCBjdXJidWYpOworICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRldJTkVOVEVSLCAoY2hhcl91ICopInF1aWNrZml4IiwgTlVMTCwKKwkJCQkJCQkgICAgICAgRkFMU0UsIGN1cmJ1Zik7CisjZW5kaWYKKworICAgIC8qIG1ha2Ugc3VyZSBpdCB3aWxsIGJlIHJlZHJhd24gKi8KKyAgICByZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisKKyAgICAvKiBSZXN0b3JlIEtleVR5cGVkLCBzZXR0aW5nICdmaWxldHlwZScgbWF5IHJlc2V0IGl0LiAqLworICAgIEtleVR5cGVkID0gb2xkX0tleVR5cGVkOworfQorCisjZW5kaWYgLyogRkVBVF9XSU5ET1dTICovCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiYnVmIiBpcyB0aGUgcXVpY2tmaXggYnVmZmVyLgorICovCisgICAgaW50CitidF9xdWlja2ZpeChidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICByZXR1cm4gKGJ1Zi0+Yl9wX2J0WzBdID09ICdxJyk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiYnVmIiBpcyBhICJub2ZpbGUiIGJ1ZmZlci4KKyAqLworICAgIGludAorYnRfbm9maWxlKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHJldHVybiAoYnVmLT5iX3BfYnRbMF0gPT0gJ24nICYmIGJ1Zi0+Yl9wX2J0WzJdID09ICdmJyk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiAiYnVmIiBpcyBhICJub3dyaXRlIiBvciAibm9maWxlIiBidWZmZXIuCisgKi8KKyAgICBpbnQKK2J0X2RvbnR3cml0ZShidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICByZXR1cm4gKGJ1Zi0+Yl9wX2J0WzBdID09ICduJyk7Cit9CisKKyAgICBpbnQKK2J0X2RvbnR3cml0ZV9tc2coYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgaWYgKGJ0X2RvbnR3cml0ZShidWYpKQorICAgIHsKKwlFTVNHKF8oIkUzODI6IENhbm5vdCB3cml0ZSwgJ2J1ZnR5cGUnIG9wdGlvbiBpcyBzZXQiKSk7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBidWZmZXIgc2hvdWxkIGJlIGhpZGRlbiwgYWNjb3JkaW5nIHRvICdoaWRkZW4nLCAiOmhpZGUiCisgKiBhbmQgJ2J1ZmhpZGRlbicuCisgKi8KKyAgICBpbnQKK2J1Zl9oaWRlKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIC8qICdidWZoaWRkZW4nIG92ZXJydWxlcyAnaGlkZGVuJyBhbmQgIjpoaWRlIiwgY2hlY2sgaXQgZmlyc3QgKi8KKyAgICBzd2l0Y2ggKGJ1Zi0+Yl9wX2JoWzBdKQorICAgIHsKKwljYXNlICd1JzoJCSAgICAvKiAidW5sb2FkIiAqLworCWNhc2UgJ3cnOgkJICAgIC8qICJ3aXBlIiAqLworCWNhc2UgJ2QnOiByZXR1cm4gRkFMU0U7CSAgICAvKiAiZGVsZXRlIiAqLworCWNhc2UgJ2gnOiByZXR1cm4gVFJVRTsJICAgIC8qICJoaWRlIiAqLworICAgIH0KKyAgICByZXR1cm4gKHBfaGlkIHx8IGNtZG1vZC5oaWRlKTsKK30KKworLyoKKyAqIFVzZWQgZm9yICI6bWFrZSIsICI6Z3JlcCIgYW5kICI6Z3JlcGFkZCIuCisgKi8KKyAgICB2b2lkCitleF9tYWtlKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgY2hhcl91CSpuYW1lOworICAgIGNoYXJfdQkqY21kOworICAgIHVuc2lnbmVkCWxlbjsKKworICAgIGF1dG93cml0ZV9hbGwoKTsKKyAgICBuYW1lID0gZ2V0X21lZl9uYW1lKCk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgbWNoX3JlbW92ZShuYW1lKTsJICAgIC8qIGluIGNhc2UgaXQncyBub3QgdW5pcXVlICovCisKKyAgICAvKgorICAgICAqIElmICdzaGVsbHBpcGUnIGVtcHR5OiBkb24ndCByZWRpcmVjdCB0byAnZXJyb3JmaWxlJy4KKyAgICAgKi8KKyAgICBsZW4gPSAodW5zaWduZWQpU1RSTEVOKHBfc2hxKSAqIDIgKyAodW5zaWduZWQpU1RSTEVOKGVhcC0+YXJnKSArIDE7CisgICAgaWYgKCpwX3NwICE9IE5VTCkKKwlsZW4gKz0gKHVuc2lnbmVkKVNUUkxFTihwX3NwKSArICh1bnNpZ25lZClTVFJMRU4obmFtZSkgKyAzOworICAgIGNtZCA9IGFsbG9jKGxlbik7CisgICAgaWYgKGNtZCA9PSBOVUxMKQorCXJldHVybjsKKyAgICBzcHJpbnRmKChjaGFyICopY21kLCAiJXMlcyVzIiwgKGNoYXIgKilwX3NocSwgKGNoYXIgKillYXAtPmFyZywKKwkJCQkJCQkgICAgICAgKGNoYXIgKilwX3NocSk7CisgICAgaWYgKCpwX3NwICE9IE5VTCkKKwlhcHBlbmRfcmVkaXIoY21kLCBwX3NwLCBuYW1lKTsKKyAgICAvKgorICAgICAqIE91dHB1dCBhIG5ld2xpbmUgaWYgdGhlcmUncyBzb21ldGhpbmcgZWxzZSB0aGFuIHRoZSA6bWFrZSBjb21tYW5kIHRoYXQKKyAgICAgKiB3YXMgdHlwZWQgKGluIHdoaWNoIGNhc2UgdGhlIGN1cnNvciBpcyBpbiBjb2x1bW4gMCkuCisgICAgICovCisgICAgaWYgKG1zZ19jb2wgPT0gMCkKKwltc2dfZGlkb3V0ID0gRkFMU0U7CisgICAgbXNnX3N0YXJ0KCk7CisgICAgTVNHX1BVVFMoIjohIik7CisgICAgbXNnX291dHRyYW5zKGNtZCk7CQkvKiBzaG93IHdoYXQgd2UgYXJlIGRvaW5nICovCisKKyAgICAvKiBsZXQgdGhlIHNoZWxsIGtub3cgaWYgd2UgYXJlIHJlZGlyZWN0aW5nIG91dHB1dCBvciBub3QgKi8KKyAgICBkb19zaGVsbChjbWQsICpwX3NwICE9IE5VTCA/IFNIRUxMX0RPT1VUIDogMCk7CisKKyNpZmRlZiBBTUlHQQorICAgIG91dF9mbHVzaCgpOworCQkvKiByZWFkIHdpbmRvdyBzdGF0dXMgcmVwb3J0IGFuZCByZWRyYXcgYmVmb3JlIG1lc3NhZ2UgKi8KKyAgICAodm9pZCljaGFyX2F2YWlsKCk7CisjZW5kaWYKKworICAgIGlmIChxZl9pbml0KG5hbWUsIGVhcC0+Y21kaWR4ICE9IENNRF9tYWtlID8gcF9nZWZtIDogcF9lZm0sCisJCQkJCSAgICAgIGVhcC0+Y21kaWR4ICE9IENNRF9ncmVwYWRkKSA+IDAKKwkgICAgJiYgIWVhcC0+Zm9yY2VpdCkKKwlxZl9qdW1wKDAsIDAsIEZBTFNFKTsJCS8qIGRpc3BsYXkgZmlyc3QgZXJyb3IgKi8KKworICAgIG1jaF9yZW1vdmUobmFtZSk7CisgICAgdmltX2ZyZWUobmFtZSk7CisgICAgdmltX2ZyZWUoY21kKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhlIGVycm9yZmlsZSwgaW4gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIEZpbmQgYSBuZXcgdW5pcXVlIG5hbWUgd2hlbiAnbWFrZWVmJyBjb250YWlucyAiIyMiLgorICogUmV0dXJucyBOVUxMIGZvciBlcnJvci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZ2V0X21lZl9uYW1lKCkKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpuYW1lOworICAgIHN0YXRpYyBpbnQJc3RhcnQgPSAtMTsKKyAgICBzdGF0aWMgaW50CW9mZiA9IDA7CisjaWZkZWYgSEFWRV9MU1RBVAorICAgIHN0cnVjdCBzdGF0CXNiOworI2VuZGlmCisKKyAgICBpZiAoKnBfbWVmID09IE5VTCkKKyAgICB7CisJbmFtZSA9IHZpbV90ZW1wbmFtZSgnZScpOworCWlmIChuYW1lID09IE5VTEwpCisJICAgIEVNU0coXyhlX25vdG1wKSk7CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgZm9yIChwID0gcF9tZWY7ICpwOyArK3ApCisJaWYgKHBbMF0gPT0gJyMnICYmIHBbMV0gPT0gJyMnKQorCSAgICBicmVhazsKKworICAgIGlmICgqcCA9PSBOVUwpCisJcmV0dXJuIHZpbV9zdHJzYXZlKHBfbWVmKTsKKworICAgIC8qIEtlZXAgdHJ5aW5nIHVudGlsIHRoZSBuYW1lIGRvZXNuJ3QgZXhpc3QgeWV0LiAqLworICAgIGZvciAoOzspCisgICAgeworCWlmIChzdGFydCA9PSAtMSkKKwkgICAgc3RhcnQgPSBtY2hfZ2V0X3BpZCgpOworCWVsc2UKKwkgICAgb2ZmICs9IDE5OworCisJbmFtZSA9IGFsbG9jKCh1bnNpZ25lZClTVFJMRU4ocF9tZWYpICsgMzApOworCWlmIChuYW1lID09IE5VTEwpCisJICAgIGJyZWFrOworCVNUUkNQWShuYW1lLCBwX21lZik7CisJc3ByaW50ZigoY2hhciAqKW5hbWUgKyAocCAtIHBfbWVmKSwgIiVkJWQiLCBzdGFydCwgb2ZmKTsKKwlTVFJDQVQobmFtZSwgcCArIDIpOworCWlmIChtY2hfZ2V0cGVybShuYW1lKSA8IDAKKyNpZmRlZiBIQVZFX0xTVEFUCisJCSAgICAvKiBEb24ndCBhY2NlcHQgYSBzeW1ib2xpYyBsaW5rLCBpdHMgYSBzZWN1cml0eSByaXNrLiAqLworCQkgICAgJiYgbWNoX2xzdGF0KChjaGFyICopbmFtZSwgJnNiKSA8IDAKKyNlbmRpZgorCQkpCisJICAgIGJyZWFrOworCXZpbV9mcmVlKG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKK30KKworLyoKKyAqICI6Y2MiLCAiOmNyZXdpbmQiLCAiOmNmaXJzdCIgYW5kICI6Y2xhc3QiLgorICovCisgICAgdm9pZAorZXhfY2MoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBxZl9qdW1wKDAsCisJICAgIGVhcC0+YWRkcl9jb3VudCA+IDAKKwkgICAgPyAoaW50KWVhcC0+bGluZTIKKwkgICAgOiBlYXAtPmNtZGlkeCA9PSBDTURfY2MKKwkJPyAwCisJCTogKGVhcC0+Y21kaWR4ID09IENNRF9jcmV3aW5kIHx8IGVhcC0+Y21kaWR4ID09IENNRF9jZmlyc3QpCisJCSAgICA/IDEKKwkJICAgIDogMzI3NjcsCisJICAgIGVhcC0+Zm9yY2VpdCk7Cit9CisKKy8qCisgKiAiOmNuZXh0IiwgIjpjbmZpbGUiLCAiOmNOZXh0IiBhbmQgIjpjcHJldmlvdXMiLgorICovCisgICAgdm9pZAorZXhfY25leHQoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBxZl9qdW1wKGVhcC0+Y21kaWR4ID09IENNRF9jbmV4dAorCSAgICA/IEZPUldBUkQKKwkgICAgOiBlYXAtPmNtZGlkeCA9PSBDTURfY25maWxlCisJCT8gRk9SV0FSRF9GSUxFCisJCTogKGVhcC0+Y21kaWR4ID09IENNRF9jcGZpbGUgfHwgZWFwLT5jbWRpZHggPT0gQ01EX2NOZmlsZSkKKwkJICAgID8gQkFDS1dBUkRfRklMRQorCQkgICAgOiBCQUNLV0FSRCwKKwkgICAgZWFwLT5hZGRyX2NvdW50ID4gMCA/IChpbnQpZWFwLT5saW5lMiA6IDEsIGVhcC0+Zm9yY2VpdCk7Cit9CisKKy8qCisgKiAiOmNmaWxlIiBjb21tYW5kLgorICovCisgICAgdm9pZAorZXhfY2ZpbGUoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICBpZiAoKmVhcC0+YXJnICE9IE5VTCkKKwlzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJlZiIsIC0xLCBlYXAtPmFyZywgT1BUX0ZSRUUpOworICAgIGlmIChxZl9pbml0KHBfZWYsIHBfZWZtLCBUUlVFKSA+IDAgJiYgZWFwLT5jbWRpZHggPT0gQ01EX2NmaWxlKQorCXFmX2p1bXAoMCwgMCwgZWFwLT5mb3JjZWl0KTsJCS8qIGRpc3BsYXkgZmlyc3QgZXJyb3IgKi8KK30KKworLyoKKyAqICI6aGVscGdyZXAge3BhdHRlcm59IgorICovCisgICAgdm9pZAorZXhfaGVscGdyZXAoZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOworICAgIGNoYXJfdQkqc2F2ZV9jcG87CisgICAgY2hhcl91CSpwOworICAgIGludAkJZmNvdW50OworICAgIGNoYXJfdQkqKmZuYW1lczsKKyAgICBGSUxFCSpmZDsKKyAgICBpbnQJCWZpOworICAgIHN0cnVjdCBxZl9saW5lICpwcmV2cCA9IE5VTEw7CisgICAgbG9uZwlsbnVtOworCisgICAgLyogTWFrZSAnY3BvcHRpb25zJyBlbXB0eSwgdGhlICdsJyBmbGFnIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLiAqLworICAgIHNhdmVfY3BvID0gcF9jcG87CisgICAgcF9jcG8gPSAoY2hhcl91ICopIiI7CisKKyAgICByZWdtYXRjaC5yZWdwcm9nID0gdmltX3JlZ2NvbXAoZWFwLT5hcmcsIFJFX01BR0lDICsgUkVfU1RSSU5HKTsKKyAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOworICAgIGlmIChyZWdtYXRjaC5yZWdwcm9nICE9IE5VTEwpCisgICAgeworCS8qIGNyZWF0ZSBhIG5ldyBxdWlja2ZpeCBsaXN0ICovCisJcWZfbmV3X2xpc3QoKTsKKworCS8qIEdvIHRocm91Z2ggYWxsIGRpcmVjdG9yaWVzIGluICdydW50aW1lcGF0aCcgKi8KKwlwID0gcF9ydHA7CisJd2hpbGUgKCpwICE9IE5VTCAmJiAhZ290X2ludCkKKwl7CisJICAgIGNvcHlfb3B0aW9uX3BhcnQoJnAsIE5hbWVCdWZmLCBNQVhQQVRITCwgIiwiKTsKKworCSAgICAvKiBGaW5kIGFsbCAiKi50eHQiIGFuZCAiKi4/P3giIGZpbGVzIGluIHRoZSAiZG9jIiBkaXJlY3RvcnkuICovCisJICAgIGFkZF9wYXRoc2VwKE5hbWVCdWZmKTsKKwkgICAgU1RSQ0FUKE5hbWVCdWZmLCAiZG9jLyouXFwodHh0XFx8Pz94XFwpIik7CisJICAgIGlmIChnZW5fZXhwYW5kX3dpbGRjYXJkcygxLCAmTmFtZUJ1ZmYsICZmY291bnQsCisJCQkJCSAgICAgJmZuYW1lcywgRVdfRklMRXxFV19TSUxFTlQpID09IE9LCisJCSAgICAmJiBmY291bnQgPiAwKQorCSAgICB7CisJCWZvciAoZmkgPSAwOyBmaSA8IGZjb3VudCAmJiAhZ290X2ludDsgKytmaSkKKwkJeworCQkgICAgZmQgPSBmb3BlbigoY2hhciAqKWZuYW1lc1tmaV0sICJyIik7CisJCSAgICBpZiAoZmQgIT0gTlVMTCkKKwkJICAgIHsKKwkJCWxudW0gPSAxOworCQkJd2hpbGUgKCF2aW1fZmdldHMoSU9idWZmLCBJT1NJWkUsIGZkKSAmJiAhZ290X2ludCkKKwkJCXsKKwkJCSAgICBpZiAodmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBJT2J1ZmYsIChjb2xucl9UKTApKQorCQkJICAgIHsKKwkJCQlpbnQJbCA9IFNUUkxFTihJT2J1ZmYpOworCisJCQkJLyogcmVtb3ZlIHRyYWlsaW5nIENSLCBMRiwgc3BhY2VzLCBldGMuICovCisJCQkJd2hpbGUgKGwgPiAwICYmIElPYnVmZltsIC0gMV0gPD0gJyAnKQorCQkJCSAgICAgSU9idWZmWy0tbF0gPSBOVUw7CisKKwkJCQlpZiAocWZfYWRkX2VudHJ5KCZwcmV2cCwKKwkJCQkJICAgIE5VTEwsCS8qIGRpciAqLworCQkJCQkgICAgZm5hbWVzW2ZpXSwKKwkJCQkJICAgIElPYnVmZiwKKwkJCQkJICAgIGxudW0sCisJCQkJCSAgICAwLAkJLyogY29sICovCisJCQkJCSAgICBGQUxTRSwJLyogdmlydF9jb2wgKi8KKwkJCQkJICAgIDAsCQkvKiBuciAqLworCQkJCQkgICAgMSwJCS8qIHR5cGUgKi8KKwkJCQkJICAgIFRSVUUJLyogdmFsaWQgKi8KKwkJCQkJICAgICkgPT0gRkFJTCkKKwkJCQl7CisJCQkJICAgIGdvdF9pbnQgPSBUUlVFOworCQkJCSAgICBicmVhazsKKwkJCQl9CisJCQkgICAgfQorCQkJICAgICsrbG51bTsKKwkJCSAgICBsaW5lX2JyZWFrY2hlY2soKTsKKwkJCX0KKwkJCWZjbG9zZShmZCk7CisJCSAgICB9CisJCX0KKwkJRnJlZVdpbGQoZmNvdW50LCBmbmFtZXMpOworCSAgICB9CisJfQorCXZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworCisJcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfbm9uZXZhbGlkID0gRkFMU0U7CisJcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfcHRyID0gcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfc3RhcnQ7CisJcWZfbGlzdHNbcWZfY3VybGlzdF0ucWZfaW5kZXggPSAxOworICAgIH0KKworICAgIHBfY3BvID0gc2F2ZV9jcG87CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBxZl91cGRhdGVfYnVmZmVyKCk7CisjZW5kaWYKKworICAgIC8qIEp1bXAgdG8gZmlyc3QgbWF0Y2guICovCisgICAgaWYgKHFmX2xpc3RzW3FmX2N1cmxpc3RdLnFmX2NvdW50ID4gMCkKKwlxZl9qdW1wKDAsIDAsIEZBTFNFKTsKK30KKworI2VuZGlmIC8qIEZFQVRfUVVJQ0tGSVggKi8KZGlmZiAtLWdpdCBhL3NyYy9yZWdleHAuYyBiL3NyYy9yZWdleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE1YTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3JlZ2V4cC5jCkBAIC0wLDAgKzEsNjExNSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBIYW5kbGluZyBvZiByZWd1bGFyIGV4cHJlc3Npb25zOiB2aW1fcmVnY29tcCgpLCB2aW1fcmVnZXhlYygpLCB2aW1fcmVnc3ViKCkKKyAqCisgKiBOT1RJQ0U6CisgKgorICogVGhpcyBpcyBOT1QgdGhlIG9yaWdpbmFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb2RlIGFzIHdyaXR0ZW4gYnkgSGVucnkKKyAqIFNwZW5jZXIuICBUaGlzIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCB0aGUgVklNCisgKiBlZGl0b3IsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgc2VwYXJhdGVseSBmcm9tIFZpbS4gIElmIHlvdSB3YW50IGEgZ29vZAorICogcmVndWxhciBleHByZXNzaW9uIGxpYnJhcnksIGdldCB0aGUgb3JpZ2luYWwgY29kZS4gIFRoZSBjb3B5cmlnaHQgbm90aWNlCisgKiB0aGF0IGZvbGxvd3MgaXMgZnJvbSB0aGUgb3JpZ2luYWwuCisgKgorICogRU5EIE5PVElDRQorICoKKyAqCUNvcHlyaWdodCAoYykgMTk4NiBieSBVbml2ZXJzaXR5IG9mIFRvcm9udG8uCisgKglXcml0dGVuIGJ5IEhlbnJ5IFNwZW5jZXIuICBOb3QgZGVyaXZlZCBmcm9tIGxpY2Vuc2VkIHNvZnR3YXJlLgorICoKKyAqCVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICoJcHVycG9zZSBvbiBhbnkgY29tcHV0ZXIgc3lzdGVtLCBhbmQgdG8gcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKKyAqCXN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICoJMS4gVGhlIGF1dGhvciBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNlIG9mCisgKgkJdGhpcyBzb2Z0d2FyZSwgbm8gbWF0dGVyIGhvdyBhd2Z1bCwgZXZlbiBpZiB0aGV5IGFyaXNlCisgKgkJZnJvbSBkZWZlY3RzIGluIGl0LgorICoKKyAqCTIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCwgZWl0aGVyCisgKgkJYnkgZXhwbGljaXQgY2xhaW0gb3IgYnkgb21pc3Npb24uCisgKgorICoJMy4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdAorICoJCWJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqCisgKiBCZXdhcmUgdGhhdCBzb21lIG9mIHRoaXMgY29kZSBpcyBzdWJ0bHkgYXdhcmUgb2YgdGhlIHdheSBvcGVyYXRvcgorICogcHJlY2VkZW5jZSBpcyBzdHJ1Y3R1cmVkIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBTZXJpb3VzIGNoYW5nZXMgaW4KKyAqIHJlZ3VsYXItZXhwcmVzc2lvbiBzeW50YXggbWlnaHQgcmVxdWlyZSBhIHRvdGFsIHJldGhpbmsuCisgKgorICogQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBieSBUb255IEFuZHJld3MsIE9sYWYgJ1JoaWFsdG8nIFNlaWJlcnQsIFJvYmVydCBXZWJiCisgKiBhbmQgQnJhbSBNb29sZW5hYXIuCisgKiBOYW1lZCBjaGFyYWN0ZXIgY2xhc3Mgc3VwcG9ydCBhZGRlZCBieSBXYWx0ZXIgQnJpc2NvZSAoMTk5OCBKdWwgMDEpCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisjdW5kZWYgREVCVUcKKworLyoKKyAqIFRoZSAiaW50ZXJuYWwgdXNlIG9ubHkiIGZpZWxkcyBpbiByZWdleHAuaCBhcmUgcHJlc2VudCB0byBwYXNzIGluZm8gZnJvbQorICogY29tcGlsZSB0byBleGVjdXRlIHRoYXQgcGVybWl0cyB0aGUgZXhlY3V0ZSBwaGFzZSB0byBydW4gbG90cyBmYXN0ZXIgb24KKyAqIHNpbXBsZSBjYXNlcy4gIFRoZXkgYXJlOgorICoKKyAqIHJlZ3N0YXJ0CWNoYXIgdGhhdCBtdXN0IGJlZ2luIGEgbWF0Y2g7IE5VTCBpZiBub25lIG9idmlvdXM7IENhbiBiZSBhCisgKgkJbXVsdGktYnl0ZSBjaGFyYWN0ZXIuCisgKiByZWdhbmNoCWlzIHRoZSBtYXRjaCBhbmNob3JlZCAoYXQgYmVnaW5uaW5nLW9mLWxpbmUgb25seSk/CisgKiByZWdtdXN0CXN0cmluZyAocG9pbnRlciBpbnRvIHByb2dyYW0pIHRoYXQgbWF0Y2ggbXVzdCBpbmNsdWRlLCBvciBOVUxMCisgKiByZWdtbGVuCWxlbmd0aCBvZiByZWdtdXN0IHN0cmluZworICogcmVnZmxhZ3MJUkZfIHZhbHVlcyBvcidlZCB0b2dldGhlcgorICoKKyAqIFJlZ3N0YXJ0IGFuZCByZWdhbmNoIHBlcm1pdCB2ZXJ5IGZhc3QgZGVjaXNpb25zIG9uIHN1aXRhYmxlIHN0YXJ0aW5nIHBvaW50cworICogZm9yIGEgbWF0Y2gsIGN1dHRpbmcgZG93biB0aGUgd29yayBhIGxvdC4gIFJlZ211c3QgcGVybWl0cyBmYXN0IHJlamVjdGlvbgorICogb2YgbGluZXMgdGhhdCBjYW5ub3QgcG9zc2libHkgbWF0Y2guICBUaGUgcmVnbXVzdCB0ZXN0cyBhcmUgY29zdGx5IGVub3VnaAorICogdGhhdCB2aW1fcmVnY29tcCgpIHN1cHBsaWVzIGEgcmVnbXVzdCBvbmx5IGlmIHRoZSByLmUuIGNvbnRhaW5zIHNvbWV0aGluZworICogcG90ZW50aWFsbHkgZXhwZW5zaXZlIChhdCBwcmVzZW50LCB0aGUgb25seSBzdWNoIHRoaW5nIGRldGVjdGVkIGlzICogb3IgKworICogYXQgdGhlIHN0YXJ0IG9mIHRoZSByLmUuLCB3aGljaCBjYW4gaW52b2x2ZSBhIGxvdCBvZiBiYWNrdXApLiAgUmVnbWxlbiBpcworICogc3VwcGxpZWQgYmVjYXVzZSB0aGUgdGVzdCBpbiB2aW1fcmVnZXhlYygpIG5lZWRzIGl0IGFuZCB2aW1fcmVnY29tcCgpIGlzCisgKiBjb21wdXRpbmcgaXQgYW55d2F5LgorICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHJlZ2V4cCAicHJvZ3JhbSIuICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgbGluZWFyIGVuY29kaW5nCisgKiBvZiBhIG5vbmRldGVybWluaXN0aWMgZmluaXRlLXN0YXRlIG1hY2hpbmUgKGFrYSBzeW50YXggY2hhcnRzIG9yCisgKiAicmFpbHJvYWQgbm9ybWFsIGZvcm0iIGluIHBhcnNpbmcgdGVjaG5vbG9neSkuICBFYWNoIG5vZGUgaXMgYW4gb3Bjb2RlCisgKiBwbHVzIGEgIm5leHQiIHBvaW50ZXIsIHBvc3NpYmx5IHBsdXMgYW4gb3BlcmFuZC4gICJOZXh0IiBwb2ludGVycyBvZgorICogYWxsIG5vZGVzIGV4Y2VwdCBCUkFOQ0ggYW5kIEJSQUNFU19DT01QTEVYIGltcGxlbWVudCBjb25jYXRlbmF0aW9uOyBhICJuZXh0IgorICogcG9pbnRlciB3aXRoIGEgQlJBTkNIIG9uIGJvdGggZW5kcyBvZiBpdCBpcyBjb25uZWN0aW5nIHR3byBhbHRlcm5hdGl2ZXMuCisgKiAoSGVyZSB3ZSBoYXZlIG9uZSBvZiB0aGUgc3VidGxlIHN5bnRheCBkZXBlbmRlbmNpZXM6CWFuIGluZGl2aWR1YWwgQlJBTkNICisgKiAoYXMgb3Bwb3NlZCB0byBhIGNvbGxlY3Rpb24gb2YgdGhlbSkgaXMgbmV2ZXIgY29uY2F0ZW5hdGVkIHdpdGggYW55dGhpbmcKKyAqIGJlY2F1c2Ugb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZSkuICBUaGUgIm5leHQiIHBvaW50ZXIgb2YgYSBCUkFDRVNfQ09NUExFWAorICogbm9kZSBwb2ludHMgdG8gdGhlIG5vZGUgYWZ0ZXIgdGhlIHN0dWZmIHRvIGJlIHJlcGVhdGVkLiAgVGhlIG9wZXJhbmQgb2Ygc29tZQorICogdHlwZXMgb2Ygbm9kZSBpcyBhIGxpdGVyYWwgc3RyaW5nOyBmb3Igb3RoZXJzLCBpdCBpcyBhIG5vZGUgbGVhZGluZyBpbnRvIGEKKyAqIHN1Yi1GU00uICBJbiBwYXJ0aWN1bGFyLCB0aGUgb3BlcmFuZCBvZiBhIEJSQU5DSCBub2RlIGlzIHRoZSBmaXJzdCBub2RlIG9mCisgKiB0aGUgYnJhbmNoLgkoTkIgdGhpcyBpcyAqbm90KiBhIHRyZWUgc3RydWN0dXJlOiB0aGUgdGFpbCBvZiB0aGUgYnJhbmNoCisgKiBjb25uZWN0cyB0byB0aGUgdGhpbmcgZm9sbG93aW5nIHRoZSBzZXQgb2YgQlJBTkNIZXMuKQorICoKKyAqIHBhdHRlcm4JaXMgY29kZWQgbGlrZToKKyAqCisgKgkJCSAgKy0tLS0tLS0tLS0tLS0tLS0tKworICoJCQkgIHwJCSAgICBWCisgKiA8YWE+XHw8YmI+CUJSQU5DSCA8YWE+IEJSQU5DSCA8YmI+IC0tPiBFTkQKKyAqCQkgICAgIHwJICAgIF4JIHwJICAgIF4KKyAqCQkgICAgICstLS0tLS0rCSArLS0tLS0tLS0tLSsKKyAqCisgKgorICoJCSAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tKworICoJCSAgICAgICBWCQkgIHwKKyAqIDxhYT4qCUJSQU5DSCBCUkFOQ0ggPGFhPiAtLT4gQkFDSyBCUkFOQ0ggLS0+IE5PVEhJTkcgLS0+IEVORAorICoJCSAgICAgfAkgICAgfAkJICAgIF4JCQkgICBeCisgKgkJICAgICB8CSAgICArLS0tLS0tLS0tLS0tLS0tKwkJCSAgIHwKKyAqCQkgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICoKKyAqCQkJCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCQkJCQlWCQkJICB8CisgKiA8YWE+XHt9CUJSQU5DSCBCUkFDRV9MSU1JVFMgLS0+IEJSQUNFX0NPTVBMRVggPGFhPiAtLT4gQkFDSyAgRU5ECisgKgkJICAgICB8CQkJCSAgICB8CQkgICAgIF4KKyAqCQkgICAgIHwJCQkJICAgICstLS0tLS0tLS0tLS0tLS0tKworICoJCSAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqCisgKiA8YWE+XEAhPGJiPglCUkFOQ0ggTk9NQVRDSCA8YWE+IC0tPiBFTkQgIDxiYj4gLS0+IEVORAorICoJCSAgICAgfAkgICAgIHwJCSAgICAgIF4gICAgICAgXgorICoJCSAgICAgfAkgICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICB8CisgKgkJICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICoJCQkJCQkgICAgICArLS0tLS0tLS0tKworICoJCQkJCQkgICAgICB8CQlWCisgKiBcelthYmNdCUJSQU5DSCBCUkFOQ0ggIGEgIEJSQU5DSCAgYiAgQlJBTkNIICBjCUJSQU5DSAlOT1RISU5HIC0tPiBFTkQKKyAqCQkgICAgIHwJICAgIHwJICAgICAgIHwJICB8CV4JCSAgICBeCisgKgkJICAgICB8CSAgICB8CSAgICAgICB8CSAgKy0tLS0tKwkJICAgIHwKKyAqCQkgICAgIHwJICAgIHwJICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwkJICAgIHwKKyAqCQkgICAgIHwJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCQkgICAgfAorICoJCSAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBUaGV5IGFsbCBzdGFydCB3aXRoIGEgQlJBTkNIIGZvciAiXHwiIGFsdGVybmF0aWVzLCBldmVuIHdoZW4gdGhlcmUgaXMgb25seQorICogb25lIGFsdGVybmF0aXZlLgorICovCisKKy8qCisgKiBUaGUgb3Bjb2RlcyBhcmU6CisgKi8KKworLyogZGVmaW5pdGlvbgludW1iZXIJCSAgIG9wbmQ/ICAgIG1lYW5pbmcgKi8KKyNkZWZpbmUgRU5ECQkwCS8qCUVuZCBvZiBwcm9ncmFtIG9yIE5PTUFUQ0ggb3BlcmFuZC4gKi8KKyNkZWZpbmUgQk9MCQkxCS8qCU1hdGNoICIiIGF0IGJlZ2lubmluZyBvZiBsaW5lLiAqLworI2RlZmluZSBFT0wJCTIJLyoJTWF0Y2ggIiIgYXQgZW5kIG9mIGxpbmUuICovCisjZGVmaW5lIEJSQU5DSAkJMwkvKiBub2RlIE1hdGNoIHRoaXMgYWx0ZXJuYXRpdmUsIG9yIHRoZQorCQkJCSAqCW5leHQuLi4gKi8KKyNkZWZpbmUgQkFDSwkJNAkvKglNYXRjaCAiIiwgIm5leHQiIHB0ciBwb2ludHMgYmFja3dhcmQuICovCisjZGVmaW5lIEVYQUNUTFkJCTUJLyogc3RyCU1hdGNoIHRoaXMgc3RyaW5nLiAqLworI2RlZmluZSBOT1RISU5HCQk2CS8qCU1hdGNoIGVtcHR5IHN0cmluZy4gKi8KKyNkZWZpbmUgU1RBUgkJNwkvKiBub2RlIE1hdGNoIHRoaXMgKHNpbXBsZSkgdGhpbmcgMCBvciBtb3JlCisJCQkJICoJdGltZXMuICovCisjZGVmaW5lIFBMVVMJCTgJLyogbm9kZSBNYXRjaCB0aGlzIChzaW1wbGUpIHRoaW5nIDEgb3IgbW9yZQorCQkJCSAqCXRpbWVzLiAqLworI2RlZmluZSBNQVRDSAkJOQkvKiBub2RlIG1hdGNoIHRoZSBvcGVyYW5kIHplcm8td2lkdGggKi8KKyNkZWZpbmUgTk9NQVRDSAkJMTAJLyogbm9kZSBjaGVjayBmb3Igbm8gbWF0Y2ggd2l0aCBvcGVyYW5kICovCisjZGVmaW5lIEJFSElORAkJMTEJLyogbm9kZSBsb29rIGJlaGluZCBmb3IgYSBtYXRjaCB3aXRoIG9wZXJhbmQgKi8KKyNkZWZpbmUgTk9CRUhJTkQJMTIJLyogbm9kZSBsb29rIGJlaGluZCBmb3Igbm8gbWF0Y2ggd2l0aCBvcGVyYW5kICovCisjZGVmaW5lIFNVQlBBVAkJMTMJLyogbm9kZSBtYXRjaCB0aGUgb3BlcmFuZCBoZXJlICovCisjZGVmaW5lIEJSQUNFX1NJTVBMRQkxNAkvKiBub2RlIE1hdGNoIHRoaXMgKHNpbXBsZSkgdGhpbmcgYmV0d2VlbiBtIGFuZAorCQkJCSAqCW4gdGltZXMgKFx7bSxuXH0pLiAqLworI2RlZmluZSBCT1cJCTE1CS8qCU1hdGNoICIiIGFmdGVyIFteYS16QS1aMC05X10gKi8KKyNkZWZpbmUgRU9XCQkxNgkvKglNYXRjaCAiIiBhdCAgICBbXmEtekEtWjAtOV9dICovCisjZGVmaW5lIEJSQUNFX0xJTUlUUwkxNwkvKiBuciBuciAgZGVmaW5lIHRoZSBtaW4gJiBtYXggZm9yIEJSQUNFX1NJTVBMRQorCQkJCSAqCWFuZCBCUkFDRV9DT01QTEVYLiAqLworI2RlZmluZSBORVdMCQkxOAkvKglNYXRjaCBsaW5lLWJyZWFrICovCisjZGVmaW5lIEJIUE9TCQkxOQkvKglFbmQgcG9zaXRpb24gZm9yIEJFSElORCBvciBOT0JFSElORCAqLworCisKKy8qIGNoYXJhY3RlciBjbGFzc2VzOiAyMC00OCBub3JtYWwsIDUwLTc4IGluY2x1ZGUgYSBsaW5lLWJyZWFrICovCisjZGVmaW5lIEFERF9OTAkJMzAKKyNkZWZpbmUgRklSU1RfTkwJQU5ZICsgQUREX05MCisjZGVmaW5lIEFOWQkJMjAJLyoJTWF0Y2ggYW55IG9uZSBjaGFyYWN0ZXIuICovCisjZGVmaW5lIEFOWU9GCQkyMQkvKiBzdHIJTWF0Y2ggYW55IGNoYXJhY3RlciBpbiB0aGlzIHN0cmluZy4gKi8KKyNkZWZpbmUgQU5ZQlVUCQkyMgkvKiBzdHIJTWF0Y2ggYW55IGNoYXJhY3RlciBub3QgaW4gdGhpcworCQkJCSAqCXN0cmluZy4gKi8KKyNkZWZpbmUgSURFTlQJCTIzCS8qCU1hdGNoIGlkZW50aWZpZXIgY2hhciAqLworI2RlZmluZSBTSURFTlQJCTI0CS8qCU1hdGNoIGlkZW50aWZpZXIgY2hhciBidXQgbm8gZGlnaXQgKi8KKyNkZWZpbmUgS1dPUkQJCTI1CS8qCU1hdGNoIGtleXdvcmQgY2hhciAqLworI2RlZmluZSBTS1dPUkQJCTI2CS8qCU1hdGNoIHdvcmQgY2hhciBidXQgbm8gZGlnaXQgKi8KKyNkZWZpbmUgRk5BTUUJCTI3CS8qCU1hdGNoIGZpbGUgbmFtZSBjaGFyICovCisjZGVmaW5lIFNGTkFNRQkJMjgJLyoJTWF0Y2ggZmlsZSBuYW1lIGNoYXIgYnV0IG5vIGRpZ2l0ICovCisjZGVmaW5lIFBSSU5UCQkyOQkvKglNYXRjaCBwcmludGFibGUgY2hhciAqLworI2RlZmluZSBTUFJJTlQJCTMwCS8qCU1hdGNoIHByaW50YWJsZSBjaGFyIGJ1dCBubyBkaWdpdCAqLworI2RlZmluZSBXSElURQkJMzEJLyoJTWF0Y2ggd2hpdGVzcGFjZSBjaGFyICovCisjZGVmaW5lIE5XSElURQkJMzIJLyoJTWF0Y2ggbm9uLXdoaXRlc3BhY2UgY2hhciAqLworI2RlZmluZSBESUdJVAkJMzMJLyoJTWF0Y2ggZGlnaXQgY2hhciAqLworI2RlZmluZSBORElHSVQJCTM0CS8qCU1hdGNoIG5vbi1kaWdpdCBjaGFyICovCisjZGVmaW5lIEhFWAkJMzUJLyoJTWF0Y2ggaGV4IGNoYXIgKi8KKyNkZWZpbmUgTkhFWAkJMzYJLyoJTWF0Y2ggbm9uLWhleCBjaGFyICovCisjZGVmaW5lIE9DVEFMCQkzNwkvKglNYXRjaCBvY3RhbCBjaGFyICovCisjZGVmaW5lIE5PQ1RBTAkJMzgJLyoJTWF0Y2ggbm9uLW9jdGFsIGNoYXIgKi8KKyNkZWZpbmUgV09SRAkJMzkJLyoJTWF0Y2ggd29yZCBjaGFyICovCisjZGVmaW5lIE5XT1JECQk0MAkvKglNYXRjaCBub24td29yZCBjaGFyICovCisjZGVmaW5lIEhFQUQJCTQxCS8qCU1hdGNoIGhlYWQgY2hhciAqLworI2RlZmluZSBOSEVBRAkJNDIJLyoJTWF0Y2ggbm9uLWhlYWQgY2hhciAqLworI2RlZmluZSBBTFBIQQkJNDMJLyoJTWF0Y2ggYWxwaGEgY2hhciAqLworI2RlZmluZSBOQUxQSEEJCTQ0CS8qCU1hdGNoIG5vbi1hbHBoYSBjaGFyICovCisjZGVmaW5lIExPV0VSCQk0NQkvKglNYXRjaCBsb3dlcmNhc2UgY2hhciAqLworI2RlZmluZSBOTE9XRVIJCTQ2CS8qCU1hdGNoIG5vbi1sb3dlcmNhc2UgY2hhciAqLworI2RlZmluZSBVUFBFUgkJNDcJLyoJTWF0Y2ggdXBwZXJjYXNlIGNoYXIgKi8KKyNkZWZpbmUgTlVQUEVSCQk0OAkvKglNYXRjaCBub24tdXBwZXJjYXNlIGNoYXIgKi8KKyNkZWZpbmUgTEFTVF9OTAkJTlVQUEVSICsgQUREX05MCisjZGVmaW5lIFdJVEhfTkwob3ApCSgob3ApID49IEZJUlNUX05MICYmIChvcCkgPD0gTEFTVF9OTCkKKworI2RlZmluZSBNT1BFTgkJODAgIC8qIC04OQkgTWFyayB0aGlzIHBvaW50IGluIGlucHV0IGFzIHN0YXJ0IG9mCisJCQkJICoJIFwoIHN1YmV4cHIuICBNT1BFTiArIDAgbWFya3Mgc3RhcnQgb2YKKwkJCQkgKgkgbWF0Y2guICovCisjZGVmaW5lIE1DTE9TRQkJOTAgIC8qIC05OQkgQW5hbG9nb3VzIHRvIE1PUEVOLiAgTUNMT1NFICsgMCBtYXJrcworCQkJCSAqCSBlbmQgb2YgbWF0Y2guICovCisjZGVmaW5lIEJBQ0tSRUYJCTEwMCAvKiAtMTA5IG5vZGUgTWF0Y2ggc2FtZSBzdHJpbmcgYWdhaW4gXDEtXDkgKi8KKworI2lmZGVmIEZFQVRfU1lOX0hMCisjIGRlZmluZSBaT1BFTgkJMTEwIC8qIC0xMTkJIE1hcmsgdGhpcyBwb2ludCBpbiBpbnB1dCBhcyBzdGFydCBvZgorCQkJCSAqCSBceiggc3ViZXhwci4gKi8KKyMgZGVmaW5lIFpDTE9TRQkJMTIwIC8qIC0xMjkJIEFuYWxvZ291cyB0byBaT1BFTi4gKi8KKyMgZGVmaW5lIFpSRUYJCTEzMCAvKiAtMTM5IG5vZGUgTWF0Y2ggZXh0ZXJuYWwgc3VibWF0Y2ggXHoxLVx6OSAqLworI2VuZGlmCisKKyNkZWZpbmUgQlJBQ0VfQ09NUExFWAkxNDAgLyogLTE0OSBub2RlIE1hdGNoIG5vZGVzIGJldHdlZW4gbSAmIG4gdGltZXMgKi8KKworI2RlZmluZSBOT1BFTgkJMTUwCS8qCU1hcmsgdGhpcyBwb2ludCBpbiBpbnB1dCBhcyBzdGFydCBvZgorCQkJCQlcJSggc3ViZXhwci4gKi8KKyNkZWZpbmUgTkNMT1NFCQkxNTEJLyoJQW5hbG9nb3VzIHRvIE5PUEVOLiAqLworCisjZGVmaW5lIE1VTFRJQllURUNPREUJMjAwCS8qIG1iYwlNYXRjaCBvbmUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgUkVfQk9GCQkyMDEJLyoJTWF0Y2ggIiIgYXQgYmVnaW5uaW5nIG9mIGZpbGUuICovCisjZGVmaW5lIFJFX0VPRgkJMjAyCS8qCU1hdGNoICIiIGF0IGVuZCBvZiBmaWxlLiAqLworI2RlZmluZSBDVVJTT1IJCTIwMwkvKglNYXRjaCBsb2NhdGlvbiBvZiBjdXJzb3IuICovCisKKyNkZWZpbmUgUkVfTE5VTQkJMjA0CS8qIG5yIGNtcCAgTWF0Y2ggbGluZSBudW1iZXIgKi8KKyNkZWZpbmUgUkVfQ09MCQkyMDUJLyogbnIgY21wICBNYXRjaCBjb2x1bW4gbnVtYmVyICovCisjZGVmaW5lIFJFX1ZDT0wJCTIwNgkvKiBuciBjbXAgIE1hdGNoIHZpcnR1YWwgY29sdW1uIG51bWJlciAqLworCisvKgorICogTWFnaWMgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLCB0aGV5IGRvbid0IG1hdGNoIGxpdGVyYWxseS4KKyAqIE1hZ2ljIGNoYXJhY3RlcnMgYXJlIG5lZ2F0aXZlLiAgVGhpcyBzZXBhcmF0ZXMgdGhlbSBmcm9tIGxpdGVyYWwgY2hhcmFjdGVycworICogKHBvc3NpYmx5IG11bHRpLWJ5dGUpLiAgT25seSBBU0NJSSBjaGFyYWN0ZXJzIGNhbiBiZSBNYWdpYy4KKyAqLworI2RlZmluZSBNYWdpYyh4KQkoKGludCkoeCkgLSAyNTYpCisjZGVmaW5lIHVuX01hZ2ljKHgpCSgoeCkgKyAyNTYpCisjZGVmaW5lIGlzX01hZ2ljKHgpCSgoeCkgPCAwKQorCitzdGF0aWMgaW50IG5vX01hZ2ljIF9fQVJHUygoaW50IHgpKTsKK3N0YXRpYyBpbnQgdG9nZ2xlX01hZ2ljIF9fQVJHUygoaW50IHgpKTsKKworICAgIHN0YXRpYyBpbnQKK25vX01hZ2ljKHgpCisgICAgaW50CQl4OworeworICAgIGlmIChpc19NYWdpYyh4KSkKKwlyZXR1cm4gdW5fTWFnaWMoeCk7CisgICAgcmV0dXJuIHg7Cit9CisKKyAgICBzdGF0aWMgaW50Cit0b2dnbGVfTWFnaWMoeCkKKyAgICBpbnQJCXg7Cit7CisgICAgaWYgKGlzX01hZ2ljKHgpKQorCXJldHVybiB1bl9NYWdpYyh4KTsKKyAgICByZXR1cm4gTWFnaWMoeCk7Cit9CisKKy8qCisgKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVnZXhwIGludGVybmFsICJwcm9ncmFtIiBpcyBhY3R1YWxseSB0aGlzIG1hZ2ljCisgKiBudW1iZXI7IHRoZSBzdGFydCBub2RlIGJlZ2lucyBpbiB0aGUgc2Vjb25kIGJ5dGUuICBJdCdzIHVzZWQgdG8gY2F0Y2ggdGhlCisgKiBtb3N0IHNldmVyZSBtdXRpbGF0aW9uIG9mIHRoZSBwcm9ncmFtIGJ5IHRoZSBjYWxsZXIuCisgKi8KKworI2RlZmluZSBSRUdNQUdJQwkwMjM0CisKKy8qCisgKiBPcGNvZGUgbm90ZXM6CisgKgorICogQlJBTkNICVRoZSBzZXQgb2YgYnJhbmNoZXMgY29uc3RpdHV0aW5nIGEgc2luZ2xlIGNob2ljZSBhcmUgaG9va2VkCisgKgkJdG9nZXRoZXIgd2l0aCB0aGVpciAibmV4dCIgcG9pbnRlcnMsIHNpbmNlIHByZWNlZGVuY2UgcHJldmVudHMKKyAqCQlhbnl0aGluZyBiZWluZyBjb25jYXRlbmF0ZWQgdG8gYW55IGluZGl2aWR1YWwgYnJhbmNoLiAgVGhlCisgKgkJIm5leHQiIHBvaW50ZXIgb2YgdGhlIGxhc3QgQlJBTkNIIGluIGEgY2hvaWNlIHBvaW50cyB0byB0aGUKKyAqCQl0aGluZyBmb2xsb3dpbmcgdGhlIHdob2xlIGNob2ljZS4gIFRoaXMgaXMgYWxzbyB3aGVyZSB0aGUKKyAqCQlmaW5hbCAibmV4dCIgcG9pbnRlciBvZiBlYWNoIGluZGl2aWR1YWwgYnJhbmNoIHBvaW50czsgZWFjaAorICoJCWJyYW5jaCBzdGFydHMgd2l0aCB0aGUgb3BlcmFuZCBub2RlIG9mIGEgQlJBTkNIIG5vZGUuCisgKgorICogQkFDSwkJTm9ybWFsICJuZXh0IiBwb2ludGVycyBhbGwgaW1wbGljaXRseSBwb2ludCBmb3J3YXJkOyBCQUNLCisgKgkJZXhpc3RzIHRvIG1ha2UgbG9vcCBzdHJ1Y3R1cmVzIHBvc3NpYmxlLgorICoKKyAqIFNUQVIsUExVUwknPScsIGFuZCBjb21wbGV4ICcqJyBhbmQgJysnLCBhcmUgaW1wbGVtZW50ZWQgYXMgY2lyY3VsYXIKKyAqCQlCUkFOQ0ggc3RydWN0dXJlcyB1c2luZyBCQUNLLiAgU2ltcGxlIGNhc2VzIChvbmUgY2hhcmFjdGVyCisgKgkJcGVyIG1hdGNoKSBhcmUgaW1wbGVtZW50ZWQgd2l0aCBTVEFSIGFuZCBQTFVTIGZvciBzcGVlZAorICoJCWFuZCB0byBtaW5pbWl6ZSByZWN1cnNpdmUgcGx1bmdlcy4KKyAqCisgKiBCUkFDRV9MSU1JVFMJVGhpcyBpcyBhbHdheXMgZm9sbG93ZWQgYnkgYSBCUkFDRV9TSU1QTEUgb3IgQlJBQ0VfQ09NUExFWAorICoJCW5vZGUsIGFuZCBkZWZpbmVzIHRoZSBtaW4gYW5kIG1heCBsaW1pdHMgdG8gYmUgdXNlZCBmb3IgdGhhdAorICoJCW5vZGUuCisgKgorICogTU9QRU4sTUNMT1NFCS4uLmFyZSBudW1iZXJlZCBhdCBjb21waWxlIHRpbWUuCisgKiBaT1BFTixaQ0xPU0UJLi4uZGl0dG8KKyAqLworCisvKgorICogQSBub2RlIGlzIG9uZSBjaGFyIG9mIG9wY29kZSBmb2xsb3dlZCBieSB0d28gY2hhcnMgb2YgIm5leHQiIHBvaW50ZXIuCisgKiAiTmV4dCIgcG9pbnRlcnMgYXJlIHN0b3JlZCBhcyB0d28gOC1iaXQgYnl0ZXMsIGhpZ2ggb3JkZXIgZmlyc3QuICBUaGUKKyAqIHZhbHVlIGlzIGEgcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIG9wY29kZSBvZiB0aGUgbm9kZSBjb250YWluaW5nIGl0LgorICogQW4gb3BlcmFuZCwgaWYgYW55LCBzaW1wbHkgZm9sbG93cyB0aGUgbm9kZS4gIChOb3RlIHRoYXQgbXVjaCBvZiB0aGUKKyAqIGNvZGUgZ2VuZXJhdGlvbiBrbm93cyBhYm91dCB0aGlzIGltcGxpY2l0IHJlbGF0aW9uc2hpcC4pCisgKgorICogVXNpbmcgdHdvIGJ5dGVzIGZvciB0aGUgIm5leHQiIHBvaW50ZXIgaXMgdmFzdCBvdmVya2lsbCBmb3IgbW9zdCB0aGluZ3MsCisgKiBidXQgYWxsb3dzIHBhdHRlcm5zIHRvIGdldCBiaWcgd2l0aG91dCBkaXNhc3RlcnMuCisgKi8KKyNkZWZpbmUgT1AocCkJCSgoaW50KSoocCkpCisjZGVmaW5lIE5FWFQocCkJCSgoKCooKHApICsgMSkgJiAwMzc3KSA8PCA4KSArICgqKChwKSArIDIpICYgMDM3NykpCisjZGVmaW5lIE9QRVJBTkQocCkJKChwKSArIDMpCisvKiBPYnRhaW4gYW4gb3BlcmFuZCB0aGF0IHdhcyBzdG9yZWQgYXMgZm91ciBieXRlcywgTVNCIGZpcnN0LiAqLworI2RlZmluZSBPUEVSQU5EX01JTihwKQkoKChsb25nKShwKVszXSA8PCAyNCkgKyAoKGxvbmcpKHApWzRdIDw8IDE2KSBcCisJCQkrICgobG9uZykocClbNV0gPDwgOCkgKyAobG9uZykocClbNl0pCisvKiBPYnRhaW4gYSBzZWNvbmQgb3BlcmFuZCBzdG9yZWQgYXMgZm91ciBieXRlcy4gKi8KKyNkZWZpbmUgT1BFUkFORF9NQVgocCkJT1BFUkFORF9NSU4oKHApICsgNCkKKy8qIE9idGFpbiBhIHNlY29uZCBzaW5nbGUtYnl0ZSBvcGVyYW5kIHN0b3JlZCBhZnRlciBhIGZvdXIgYnl0ZXMgb3BlcmFuZC4gKi8KKyNkZWZpbmUgT1BFUkFORF9DTVAocCkJKHApWzddCisKKy8qCisgKiBVdGlsaXR5IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFVDSEFSQVQocCkJKChpbnQpKihjaGFyX3UgKikocCkpCisKKy8qIFVzZWQgZm9yIGFuIGVycm9yIChkb3duIGZyb20pIHZpbV9yZWdjb21wKCk6IGdpdmUgdGhlIGVycm9yIG1lc3NhZ2UsIHNldAorICogcmNfZGlkX2Vtc2cgYW5kIHJldHVybiBOVUxMICovCisjZGVmaW5lIEVNU0dfUkVUX05VTEwobSkgeyBFTVNHKG0pOyByY19kaWRfZW1zZyA9IFRSVUU7IHJldHVybiBOVUxMOyB9CisjZGVmaW5lIEVNU0dfTV9SRVRfTlVMTChtLCBjKSB7IEVNU0cyKG0sIGMgPyAiIiA6ICJcXCIpOyByY19kaWRfZW1zZyA9IFRSVUU7IHJldHVybiBOVUxMOyB9CisjZGVmaW5lIEVNU0dfUkVUX0ZBSUwobSkgeyBFTVNHKG0pOyByY19kaWRfZW1zZyA9IFRSVUU7IHJldHVybiBGQUlMOyB9CisjZGVmaW5lIEVNU0dfT05FX1JFVF9OVUxMIEVNU0dfTV9SRVRfTlVMTChfKCJFMzY5OiBpbnZhbGlkIGl0ZW0gaW4gJXMlJVtdIiksIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpCisKKyNkZWZpbmUgTUFYX0xJTUlUCSgzMjc2N0wgPDwgMTZMKQorCitzdGF0aWMgaW50IHJlX211bHRpX3R5cGUgX19BUkdTKChpbnQpKTsKK3N0YXRpYyBpbnQgY3N0cm5jbXAgX19BUkdTKChjaGFyX3UgKnMxLCBjaGFyX3UgKnMyLCBpbnQgKm4pKTsKK3N0YXRpYyBjaGFyX3UgKmNzdHJjaHIgX19BUkdTKChjaGFyX3UgKiwgaW50KSk7CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQJcmVnZHVtcCBfX0FSR1MoKGNoYXJfdSAqLCByZWdwcm9nX1QgKikpOworc3RhdGljIGNoYXJfdQkqcmVncHJvcCBfX0FSR1MoKGNoYXJfdSAqKSk7CisjZW5kaWYKKworI2RlZmluZSBOT1RfTVVMVEkJMAorI2RlZmluZSBNVUxUSV9PTkUJMQorI2RlZmluZSBNVUxUSV9NVUxUCTIKKy8qCisgKiBSZXR1cm4gTk9UX01VTFRJIGlmIGMgaXMgbm90IGEgIm11bHRpIiBvcGVyYXRvci4KKyAqIFJldHVybiBNVUxUSV9PTkUgaWYgYyBpcyBhIHNpbmdsZSAibXVsdGkiIG9wZXJhdG9yLgorICogUmV0dXJuIE1VTFRJX01VTFQgaWYgYyBpcyBhIG11bHRpICJtdWx0aSIgb3BlcmF0b3IuCisgKi8KKyAgICBzdGF0aWMgaW50CityZV9tdWx0aV90eXBlKGMpCisgICAgaW50IGM7Cit7CisgICAgaWYgKGMgPT0gTWFnaWMoJ0AnKSB8fCBjID09IE1hZ2ljKCc9JykgfHwgYyA9PSBNYWdpYygnPycpKQorCXJldHVybiBNVUxUSV9PTkU7CisgICAgaWYgKGMgPT0gTWFnaWMoJyonKSB8fCBjID09IE1hZ2ljKCcrJykgfHwgYyA9PSBNYWdpYygneycpKQorCXJldHVybiBNVUxUSV9NVUxUOworICAgIHJldHVybiBOT1RfTVVMVEk7Cit9CisKKy8qCisgKiBGbGFncyB0byBiZSBwYXNzZWQgdXAgYW5kIGRvd24uCisgKi8KKyNkZWZpbmUgSEFTV0lEVEgJMHgxCS8qIEtub3duIG5ldmVyIHRvIG1hdGNoIG51bGwgc3RyaW5nLiAqLworI2RlZmluZSBTSU1QTEUJCTB4MgkvKiBTaW1wbGUgZW5vdWdoIHRvIGJlIFNUQVIvUExVUyBvcGVyYW5kLiAqLworI2RlZmluZSBTUFNUQVJUCQkweDQJLyogU3RhcnRzIHdpdGggKiBvciArLiAqLworI2RlZmluZSBIQVNOTAkJMHg4CS8qIENvbnRhaW5zIHNvbWUgXG4uICovCisjZGVmaW5lIEhBU0xPT0tCSAkweDEwCS8qIENvbnRhaW5zICJcQDw9IiBvciAiXEA8ISIuICovCisjZGVmaW5lIFdPUlNUCQkwCS8qIFdvcnN0IGNhc2UuICovCisKKy8qCisgKiBXaGVuIHJlZ2NvZGUgaXMgc2V0IHRvIHRoaXMgdmFsdWUsIGNvZGUgaXMgbm90IGVtaXR0ZWQgYW5kIHNpemUgaXMgY29tcHV0ZWQKKyAqIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgSlVTVF9DQUxDX1NJWkUJKChjaGFyX3UgKikgLTEpCisKK3N0YXRpYyBjaGFyX3UJCSpyZWdfcHJldl9zdWI7CisKKy8qCisgKiBSRUdFWFBfSU5SQU5HRSBjb250YWlucyBhbGwgY2hhcmFjdGVycyB3aGljaCBhcmUgYWx3YXlzIHNwZWNpYWwgaW4gYSBbXQorICogcmFuZ2UgYWZ0ZXIgJ1wnLgorICogUkVHRVhQX0FCQlIgY29udGFpbnMgYWxsIGNoYXJhY3RlcnMgd2hpY2ggYWN0IGFzIGFiYnJldmlhdGlvbnMgYWZ0ZXIgJ1wnLgorICogVGhlc2UgYXJlOgorICogIFxuCS0gTmV3IGxpbmUgKE5MKS4KKyAqICBccgktIENhcnJpYWdlIFJldHVybiAoQ1IpLgorICogIFx0CS0gVGFiIChUQUIpLgorICogIFxlCS0gRXNjYXBlIChFU0MpLgorICogIFxiCS0gQmFja3NwYWNlIChDdHJsX0gpLgorICovCitzdGF0aWMgY2hhcl91IFJFR0VYUF9JTlJBTkdFW10gPSAiXV4tblxcIjsKK3N0YXRpYyBjaGFyX3UgUkVHRVhQX0FCQlJbXSA9ICJucnRlYiI7CisKK3N0YXRpYyBpbnQJYmFja3NsYXNoX3RyYW5zIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQJc2tpcF9jbGFzc19uYW1lIF9fQVJHUygoY2hhcl91ICoqcHApKTsKK3N0YXRpYyBjaGFyX3UJKnNraXBfYW55b2YgX19BUkdTKChjaGFyX3UgKnApKTsKK3N0YXRpYyB2b2lkCWluaXRfY2xhc3NfdGFiIF9fQVJHUygodm9pZCkpOworCisvKgorICogVHJhbnNsYXRlICdceCcgdG8gaXRzIGNvbnRyb2wgY2hhcmFjdGVyLCBleGNlcHQgIlxuIiwgd2hpY2ggaXMgTWFnaWMuCisgKi8KKyAgICBzdGF0aWMgaW50CitiYWNrc2xhc2hfdHJhbnMoYykKKyAgICBpbnQJCWM7Cit7CisgICAgc3dpdGNoIChjKQorICAgIHsKKwljYXNlICdyJzogICByZXR1cm4gQ0FSOworCWNhc2UgJ3QnOiAgIHJldHVybiBUQUI7CisJY2FzZSAnZSc6ICAgcmV0dXJuIEVTQzsKKwljYXNlICdiJzogICByZXR1cm4gQlM7CisgICAgfQorICAgIHJldHVybiBjOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgY2hhcmFjdGVyIGNsYXNzIG5hbWUuICAicHAiIHBvaW50cyB0byB0aGUgJ1snLgorICogUmV0dXJucyBvbmUgb2YgdGhlIENMQVNTXyBpdGVtcy4gQ0xBU1NfTk9ORSBtZWFucyB0aGF0IG5vIGl0ZW0gd2FzCisgKiByZWNvZ25pemVkLiAgT3RoZXJ3aXNlICJwcCIgaXMgYWR2YW5jZWQgdG8gYWZ0ZXIgdGhlIGl0ZW0uCisgKi8KKyAgICBzdGF0aWMgaW50Citza2lwX2NsYXNzX25hbWUocHApCisgICAgY2hhcl91CSoqcHA7Cit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKihjbGFzc19uYW1lc1tdKSA9CisgICAgeworCSJhbG51bTpdIiwKKyNkZWZpbmUgQ0xBU1NfQUxOVU0gMAorCSJhbHBoYTpdIiwKKyNkZWZpbmUgQ0xBU1NfQUxQSEEgMQorCSJibGFuazpdIiwKKyNkZWZpbmUgQ0xBU1NfQkxBTksgMgorCSJjbnRybDpdIiwKKyNkZWZpbmUgQ0xBU1NfQ05UUkwgMworCSJkaWdpdDpdIiwKKyNkZWZpbmUgQ0xBU1NfRElHSVQgNAorCSJncmFwaDpdIiwKKyNkZWZpbmUgQ0xBU1NfR1JBUEggNQorCSJsb3dlcjpdIiwKKyNkZWZpbmUgQ0xBU1NfTE9XRVIgNgorCSJwcmludDpdIiwKKyNkZWZpbmUgQ0xBU1NfUFJJTlQgNworCSJwdW5jdDpdIiwKKyNkZWZpbmUgQ0xBU1NfUFVOQ1QgOAorCSJzcGFjZTpdIiwKKyNkZWZpbmUgQ0xBU1NfU1BBQ0UgOQorCSJ1cHBlcjpdIiwKKyNkZWZpbmUgQ0xBU1NfVVBQRVIgMTAKKwkieGRpZ2l0Ol0iLAorI2RlZmluZSBDTEFTU19YRElHSVQgMTEKKwkidGFiOl0iLAorI2RlZmluZSBDTEFTU19UQUIgMTIKKwkicmV0dXJuOl0iLAorI2RlZmluZSBDTEFTU19SRVRVUk4gMTMKKwkiYmFja3NwYWNlOl0iLAorI2RlZmluZSBDTEFTU19CQUNLU1BBQ0UgMTQKKwkiZXNjYXBlOl0iLAorI2RlZmluZSBDTEFTU19FU0NBUEUgMTUKKyAgICB9OworI2RlZmluZSBDTEFTU19OT05FIDk5CisgICAgaW50IGk7CisKKyAgICBpZiAoKCpwcClbMV0gPT0gJzonKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNsYXNzX25hbWVzKSAvIHNpemVvZigqY2xhc3NfbmFtZXMpOyArK2kpCisJICAgIGlmIChTVFJOQ01QKCpwcCArIDIsIGNsYXNzX25hbWVzW2ldLCBTVFJMRU4oY2xhc3NfbmFtZXNbaV0pKSA9PSAwKQorCSAgICB7CisJCSpwcCArPSBTVFJMRU4oY2xhc3NfbmFtZXNbaV0pICsgMjsKKwkJcmV0dXJuIGk7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENMQVNTX05PTkU7Cit9CisKKy8qCisgKiBTa2lwIG92ZXIgYSAiW10iIHJhbmdlLgorICogInAiIG11c3QgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgJ1snLgorICogVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgb24gdGhlIG1hdGNoaW5nICddJywgb3IgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorc2tpcF9hbnlvZihwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBpbnQJCWNwb19saXQ7CS8qICdjcG9wdGlvbnMnIGNvbnRhaW5zICdsJyBmbGFnICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJbDsKKyNlbmRpZgorCisgICAgY3BvX2xpdCA9ICghcmVnX3N5biAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fTElURVJBTCkgIT0gTlVMTCk7CisKKyAgICBpZiAoKnAgPT0gJ14nKQkvKiBDb21wbGVtZW50IG9mIHJhbmdlLiAqLworCSsrcDsKKyAgICBpZiAoKnAgPT0gJ10nIHx8ICpwID09ICctJykKKwkrK3A7CisgICAgd2hpbGUgKCpwICE9IE5VTCAmJiAqcCAhPSAnXScpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkgPiAxKQorCSAgICBwICs9IGw7CisJZWxzZQorI2VuZGlmCisJICAgIGlmICgqcCA9PSAnLScpCisJICAgIHsKKwkJKytwOworCQlpZiAoKnAgIT0gJ10nICYmICpwICE9IE5VTCkKKwkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQlwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSsrcDsKKwkJfQorCSAgICB9CisJZWxzZSBpZiAoKnAgPT0gJ1xcJworCQkmJiAodmltX3N0cmNocihSRUdFWFBfSU5SQU5HRSwgcFsxXSkgIT0gTlVMTAorCQkgICAgfHwgKCFjcG9fbGl0ICYmIHZpbV9zdHJjaHIoUkVHRVhQX0FCQlIsIHBbMV0pICE9IE5VTEwpKSkKKwkgICAgcCArPSAyOworCWVsc2UgaWYgKCpwID09ICdbJykKKwl7CisJICAgIGlmIChza2lwX2NsYXNzX25hbWUoJnApID09IENMQVNTX05PTkUpCisJCSsrcDsgLyogSXQgd2FzIG5vdCBhIGNsYXNzIG5hbWUgKi8KKwl9CisJZWxzZQorCSAgICArK3A7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBTcGVjaWZpYyB2ZXJzaW9uIG9mIGNoYXJhY3RlciBjbGFzcyBmdW5jdGlvbnMuCisgKiBVc2luZyBhIHRhYmxlIHRvIGtlZXAgdGhpcyBmYXN0LgorICovCitzdGF0aWMgc2hvcnQJY2xhc3NfdGFiWzI1Nl07CisKKyNkZWZpbmUJICAgIFJJX0RJR0lUCTB4MDEKKyNkZWZpbmUJICAgIFJJX0hFWAkweDAyCisjZGVmaW5lCSAgICBSSV9PQ1RBTAkweDA0CisjZGVmaW5lCSAgICBSSV9XT1JECTB4MDgKKyNkZWZpbmUJICAgIFJJX0hFQUQJMHgxMAorI2RlZmluZQkgICAgUklfQUxQSEEJMHgyMAorI2RlZmluZQkgICAgUklfTE9XRVIJMHg0MAorI2RlZmluZQkgICAgUklfVVBQRVIJMHg4MAorI2RlZmluZQkgICAgUklfV0hJVEUJMHgxMDAKKworICAgIHN0YXRpYyB2b2lkCitpbml0X2NsYXNzX3RhYigpCit7CisgICAgaW50CQlpOworICAgIHN0YXRpYyBpbnQJZG9uZSA9IEZBTFNFOworCisgICAgaWYgKGRvbmUpCisJcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQorICAgIHsKKwlpZiAoaSA+PSAnMCcgJiYgaSA8PSAnNycpCisJICAgIGNsYXNzX3RhYltpXSA9IFJJX0RJR0lUICsgUklfSEVYICsgUklfT0NUQUwgKyBSSV9XT1JEOworCWVsc2UgaWYgKGkgPj0gJzgnICYmIGkgPD0gJzknKQorCSAgICBjbGFzc190YWJbaV0gPSBSSV9ESUdJVCArIFJJX0hFWCArIFJJX1dPUkQ7CisJZWxzZSBpZiAoaSA+PSAnYScgJiYgaSA8PSAnZicpCisJICAgIGNsYXNzX3RhYltpXSA9IFJJX0hFWCArIFJJX1dPUkQgKyBSSV9IRUFEICsgUklfQUxQSEEgKyBSSV9MT1dFUjsKKyNpZmRlZiBFQkNESUMKKwllbHNlIGlmICgoaSA+PSAnZycgJiYgaSA8PSAnaScpIHx8IChpID49ICdqJyAmJiBpIDw9ICdyJykKKwkJCQkJCSAgICB8fCAoaSA+PSAncycgJiYgaSA8PSAneicpKQorI2Vsc2UKKwllbHNlIGlmIChpID49ICdnJyAmJiBpIDw9ICd6JykKKyNlbmRpZgorCSAgICBjbGFzc190YWJbaV0gPSBSSV9XT1JEICsgUklfSEVBRCArIFJJX0FMUEhBICsgUklfTE9XRVI7CisJZWxzZSBpZiAoaSA+PSAnQScgJiYgaSA8PSAnRicpCisJICAgIGNsYXNzX3RhYltpXSA9IFJJX0hFWCArIFJJX1dPUkQgKyBSSV9IRUFEICsgUklfQUxQSEEgKyBSSV9VUFBFUjsKKyNpZmRlZiBFQkNESUMKKwllbHNlIGlmICgoaSA+PSAnRycgJiYgaSA8PSAnSScpIHx8ICggaSA+PSAnSicgJiYgaSA8PSAnUicpCisJCQkJCQkgICAgfHwgKGkgPj0gJ1MnICYmIGkgPD0gJ1onKSkKKyNlbHNlCisJZWxzZSBpZiAoaSA+PSAnRycgJiYgaSA8PSAnWicpCisjZW5kaWYKKwkgICAgY2xhc3NfdGFiW2ldID0gUklfV09SRCArIFJJX0hFQUQgKyBSSV9BTFBIQSArIFJJX1VQUEVSOworCWVsc2UgaWYgKGkgPT0gJ18nKQorCSAgICBjbGFzc190YWJbaV0gPSBSSV9XT1JEICsgUklfSEVBRDsKKwllbHNlCisJICAgIGNsYXNzX3RhYltpXSA9IDA7CisgICAgfQorICAgIGNsYXNzX3RhYlsnICddIHw9IFJJX1dISVRFOworICAgIGNsYXNzX3RhYlsnXHQnXSB8PSBSSV9XSElURTsKKyAgICBkb25lID0gVFJVRTsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKyMgZGVmaW5lIHJpX2RpZ2l0KGMpCShjIDwgMHgxMDAgJiYgKGNsYXNzX3RhYltjXSAmIFJJX0RJR0lUKSkKKyMgZGVmaW5lIHJpX2hleChjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9IRVgpKQorIyBkZWZpbmUgcmlfb2N0YWwoYykJKGMgPCAweDEwMCAmJiAoY2xhc3NfdGFiW2NdICYgUklfT0NUQUwpKQorIyBkZWZpbmUgcmlfd29yZChjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9XT1JEKSkKKyMgZGVmaW5lIHJpX2hlYWQoYykJKGMgPCAweDEwMCAmJiAoY2xhc3NfdGFiW2NdICYgUklfSEVBRCkpCisjIGRlZmluZSByaV9hbHBoYShjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9BTFBIQSkpCisjIGRlZmluZSByaV9sb3dlcihjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9MT1dFUikpCisjIGRlZmluZSByaV91cHBlcihjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9VUFBFUikpCisjIGRlZmluZSByaV93aGl0ZShjKQkoYyA8IDB4MTAwICYmIChjbGFzc190YWJbY10gJiBSSV9XSElURSkpCisjZWxzZQorIyBkZWZpbmUgcmlfZGlnaXQoYykJKGNsYXNzX3RhYltjXSAmIFJJX0RJR0lUKQorIyBkZWZpbmUgcmlfaGV4KGMpCShjbGFzc190YWJbY10gJiBSSV9IRVgpCisjIGRlZmluZSByaV9vY3RhbChjKQkoY2xhc3NfdGFiW2NdICYgUklfT0NUQUwpCisjIGRlZmluZSByaV93b3JkKGMpCShjbGFzc190YWJbY10gJiBSSV9XT1JEKQorIyBkZWZpbmUgcmlfaGVhZChjKQkoY2xhc3NfdGFiW2NdICYgUklfSEVBRCkKKyMgZGVmaW5lIHJpX2FscGhhKGMpCShjbGFzc190YWJbY10gJiBSSV9BTFBIQSkKKyMgZGVmaW5lIHJpX2xvd2VyKGMpCShjbGFzc190YWJbY10gJiBSSV9MT1dFUikKKyMgZGVmaW5lIHJpX3VwcGVyKGMpCShjbGFzc190YWJbY10gJiBSSV9VUFBFUikKKyMgZGVmaW5lIHJpX3doaXRlKGMpCShjbGFzc190YWJbY10gJiBSSV9XSElURSkKKyNlbmRpZgorCisvKiBmbGFncyBmb3IgcmVnZmxhZ3MgKi8KKyNkZWZpbmUgUkZfSUNBU0UgICAgMQkvKiBpZ25vcmUgY2FzZSAqLworI2RlZmluZSBSRl9OT0lDQVNFICAyCS8qIGRvbid0IGlnbm9yZSBjYXNlICovCisjZGVmaW5lIFJGX0hBU05MICAgIDQJLyogY2FuIG1hdGNoIGEgTkwgKi8KKyNkZWZpbmUgUkZfSUNPTUJJTkUgOAkvKiBpZ25vcmUgY29tYmluaW5nIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgUkZfTE9PS0JIICAgMTYJLyogdXNlcyAiXEA8PSIgb3IgIlxAPCEiICovCisKKy8qCisgKiBHbG9iYWwgd29yayB2YXJpYWJsZXMgZm9yIHZpbV9yZWdjb21wKCkuCisgKi8KKworc3RhdGljIGNoYXJfdQkqcmVncGFyc2U7CS8qIElucHV0LXNjYW4gcG9pbnRlci4gKi8KK3N0YXRpYyBpbnQJcHJldmNocl9sZW47CS8qIGJ5dGUgbGVuZ3RoIG9mIHByZXZpb3VzIGNoYXIgKi8KK3N0YXRpYyBpbnQJbnVtX2NvbXBsZXhfYnJhY2VzOyAvKiBDb21wbGV4IFx7Li4ufSBjb3VudCAqLworc3RhdGljIGludAlyZWducGFyOwkvKiAoKSBjb3VudC4gKi8KKyNpZmRlZiBGRUFUX1NZTl9ITAorc3RhdGljIGludAlyZWduenBhcjsJLyogXHooKSBjb3VudC4gKi8KK3N0YXRpYyBpbnQJcmVfaGFzX3o7CS8qIFx6IGl0ZW0gZGV0ZWN0ZWQgKi8KKyNlbmRpZgorc3RhdGljIGNoYXJfdQkqcmVnY29kZTsJLyogQ29kZS1lbWl0IHBvaW50ZXIsIG9yIEpVU1RfQ0FMQ19TSVpFICovCitzdGF0aWMgbG9uZwlyZWdzaXplOwkvKiBDb2RlIHNpemUuICovCitzdGF0aWMgY2hhcl91CWhhZF9lbmRicmFjZVtOU1VCRVhQXTsJLyogZmxhZ3MsIFRSVUUgaWYgZW5kIG9mICgpIGZvdW5kICovCitzdGF0aWMgdW5zaWduZWQJcmVnZmxhZ3M7CS8qIFJGXyBmbGFncyBmb3IgcHJvZyAqLworc3RhdGljIGxvbmcJYnJhY2VfbWluWzEwXTsJLyogTWluaW11bXMgZm9yIGNvbXBsZXggYnJhY2UgcmVwZWF0cyAqLworc3RhdGljIGxvbmcJYnJhY2VfbWF4WzEwXTsJLyogTWF4aW11bXMgZm9yIGNvbXBsZXggYnJhY2UgcmVwZWF0cyAqLworc3RhdGljIGludAlicmFjZV9jb3VudFsxMF07IC8qIEN1cnJlbnQgY291bnRzIGZvciBjb21wbGV4IGJyYWNlIHJlcGVhdHMgKi8KKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGludAloYWRfZW9sOwkvKiBUUlVFIHdoZW4gRU9MIGZvdW5kIGJ5IHZpbV9yZWdjb21wKCkgKi8KKyNlbmRpZgorc3RhdGljIGludAlvbmVfZXhhY3RseSA9IEZBTFNFOwkvKiBvbmx5IGRvIG9uZSBjaGFyIGZvciBFWEFDVExZICovCisKK3N0YXRpYyBpbnQJcmVnX21hZ2ljOwkvKiBtYWdpY25lc3Mgb2YgdGhlIHBhdHRlcm46ICovCisjZGVmaW5lIE1BR0lDX05PTkUJMQkvKiAiXFYiIHZlcnkgdW5tYWdpYyAqLworI2RlZmluZSBNQUdJQ19PRkYJMgkvKiAiXE0iIG9yICdtYWdpYycgb2ZmICovCisjZGVmaW5lIE1BR0lDX09OCTMJLyogIlxtIiBvciAnbWFnaWMnICovCisjZGVmaW5lIE1BR0lDX0FMTAk0CS8qICJcdiIgdmVyeSBtYWdpYyAqLworCitzdGF0aWMgaW50CXJlZ19zdHJpbmc7CS8qIG1hdGNoaW5nIHdpdGggYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJ1ZmZlcgorCQkJCSAgIGxpbmUgKi8KKworLyoKKyAqIE1FVEEgY29udGFpbnMgYWxsIGNoYXJhY3RlcnMgdGhhdCBtYXkgYmUgbWFnaWMsIGV4Y2VwdCAnXicgYW5kICckJy4KKyAqLworCisjaWZkZWYgRUJDRElDCitzdGF0aWMgY2hhcl91IE1FVEFbXSA9ICIlJigpKisuMTIzNDU2Nzg5PD0+P0BBQ0RGSElLTE1PUFNVVldYW19hY2RmaGlrbG1ub3BzdXZ3eHp7fH4iOworI2Vsc2UKKy8qIE1FVEFbXSBpcyB1c2VkIG9mdGVuIGVub3VnaCB0byBqdXN0aWZ5IHR1cm5pbmcgaXQgaW50byBhIHRhYmxlLiAqLworc3RhdGljIGNoYXJfdSBNRVRBX2ZsYWdzW10gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorLyoJCSAgICUgICYgICAgICggICkgICogICsJICAgICAgLiAgICAqLworICAgIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsCisvKiAgICAgMSAgMiAgMwk0ICA1ICA2ICA3ICA4ICA5CTwgID0gID4gID8gKi8KKyAgICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLAorLyogIEAgIEEgICAgIEMJRCAgICAgRiAgICAgSCAgSSAgICAgSwlMICBNCSBPICovCisgICAgMSwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwKKy8qICBQCSAgICAgUwkgICBVICBWICBXICBYCSAgWiAgWwkJIF8gKi8KKyAgICAxLCAwLCAwLCAxLCAwLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAxLAorLyogICAgIGEgICAgIGMJZCAgICAgZiAgICAgaCAgaSAgICAgawlsICBtICBuICBvICovCisgICAgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwKKy8qICBwCSAgICAgcwkgICB1ICB2ICB3ICB4CSAgeiAgewl8ICAgICB+ICAgICovCisgICAgMSwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50CWN1cmNocjsKKworLyogYXJndW1lbnRzIGZvciByZWcoKSAqLworI2RlZmluZSBSRUdfTk9QQVJFTgkwCS8qIHRvcGxldmVsIHJlZygpICovCisjZGVmaW5lIFJFR19QQVJFTgkxCS8qIFwoXCkgKi8KKyNkZWZpbmUgUkVHX1pQQVJFTgkyCS8qIFx6KFwpICovCisjZGVmaW5lIFJFR19OUEFSRU4JMwkvKiBcJShcKSAqLworCisvKgorICogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHZpbV9yZWdjb21wKCkncyBmcmllbmRzLgorICovCitzdGF0aWMgdm9pZAlpbml0Y2hyIF9fQVJHUygoY2hhcl91ICopKTsKK3N0YXRpYyBpbnQJZ2V0Y2hyIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQJc2tpcGNocl9rZWVwc3RhcnQgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50CXBlZWtjaHIgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlza2lwY2hyIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQJdW5nZXRjaHIgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlyZWdjb21wX3N0YXJ0IF9fQVJHUygoY2hhcl91ICpleHByLCBpbnQgZmxhZ3MpKTsKK3N0YXRpYyBjaGFyX3UJKnJlZyBfX0FSR1MoKGludCwgaW50ICopKTsKK3N0YXRpYyBjaGFyX3UJKnJlZ2JyYW5jaCBfX0FSR1MoKGludCAqZmxhZ3ApKTsKK3N0YXRpYyBjaGFyX3UJKnJlZ2NvbmNhdCBfX0FSR1MoKGludCAqZmxhZ3ApKTsKK3N0YXRpYyBjaGFyX3UJKnJlZ3BpZWNlIF9fQVJHUygoaW50ICopKTsKK3N0YXRpYyBjaGFyX3UJKnJlZ2F0b20gX19BUkdTKChpbnQgKikpOworc3RhdGljIGNoYXJfdQkqcmVnbm9kZSBfX0FSR1MoKGludCkpOworc3RhdGljIGludAlwcm9nX21hZ2ljX3dyb25nIF9fQVJHUygodm9pZCkpOworc3RhdGljIGNoYXJfdQkqcmVnbmV4dCBfX0FSR1MoKGNoYXJfdSAqKSk7CitzdGF0aWMgdm9pZAlyZWdjIF9fQVJHUygoaW50IGIpKTsKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgdm9pZAlyZWdtYmMgX19BUkdTKChpbnQgYykpOworI2VuZGlmCitzdGF0aWMgdm9pZAlyZWdpbnNlcnQgX19BUkdTKChpbnQsIGNoYXJfdSAqKSk7CitzdGF0aWMgdm9pZAlyZWdpbnNlcnRfbGltaXRzIF9fQVJHUygoaW50LCBsb25nLCBsb25nLCBjaGFyX3UgKikpOworc3RhdGljIGNoYXJfdQkqcmVfcHV0X2xvbmcgX19BUkdTKChjaGFyX3UgKnByLCBsb25nX3UgdmFsKSk7CitzdGF0aWMgaW50CXJlYWRfbGltaXRzIF9fQVJHUygobG9uZyAqLCBsb25nICopKTsKK3N0YXRpYyB2b2lkCXJlZ3RhaWwgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICopKTsKK3N0YXRpYyB2b2lkCXJlZ29wdGFpbCBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOworCisvKgorICogUmV0dXJuIFRSVUUgaWYgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uICJwcm9nIiBjYW4gbWF0Y2ggYSBsaW5lIGJyZWFrLgorICovCisgICAgaW50CityZV9tdWx0aWxpbmUocHJvZykKKyAgICByZWdwcm9nX1QgKnByb2c7Cit7CisgICAgcmV0dXJuIChwcm9nLT5yZWdmbGFncyAmIFJGX0hBU05MKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAicHJvZyIgbG9va3MgYmVmb3JlIHRoZSBzdGFydAorICogcG9zaXRpb24gKHBhdHRlcm4gY29udGFpbnMgIlxAPD0iIG9yICJcQDwhIikuCisgKi8KKyAgICBpbnQKK3JlX2xvb2tiZWhpbmQocHJvZykKKyAgICByZWdwcm9nX1QgKnByb2c7Cit7CisgICAgcmV0dXJuIChwcm9nLT5yZWdmbGFncyAmIFJGX0xPT0tCSCk7Cit9CisKKy8qCisgKiBTa2lwIHBhc3QgcmVndWxhciBleHByZXNzaW9uLgorICogU3RvcCBhdCBlbmQgb2YgJ3AnIG9mIHdoZXJlICdkaXJjJyBpcyBmb3VuZCAoJy8nLCAnPycsIGV0YykuCisgKiBUYWtlIGNhcmUgb2YgY2hhcmFjdGVycyB3aXRoIGEgYmFja3NsYXNoIGluIGZyb250IG9mIGl0LgorICogU2tpcCBzdHJpbmdzIGluc2lkZSBbIGFuZCBdLgorICogV2hlbiAibmV3cCIgaXMgbm90IE5VTEwgYW5kICJkaXJjIiBpcyAnPycsIG1ha2UgYW4gYWxsb2NhdGVkIGNvcHkgb2YgdGhlCisgKiBleHByZXNzaW9uIGFuZCBjaGFuZ2UgIlw/IiB0byAiPyIuICBJZiAiKm5ld3AiIGlzIG5vdCBOVUxMIHRoZSBleHByZXNzaW9uCisgKiBpcyBjaGFuZ2VkIGluLXBsYWNlLgorICovCisgICAgY2hhcl91ICoKK3NraXBfcmVnZXhwKHN0YXJ0cCwgZGlyYywgbWFnaWMsIG5ld3ApCisgICAgY2hhcl91CSpzdGFydHA7CisgICAgaW50CQlkaXJjOworICAgIGludAkJbWFnaWM7CisgICAgY2hhcl91CSoqbmV3cDsKK3sKKyAgICBpbnQJCW15bWFnaWM7CisgICAgY2hhcl91CSpwID0gc3RhcnRwOworCisgICAgaWYgKG1hZ2ljKQorCW15bWFnaWMgPSBNQUdJQ19PTjsKKyAgICBlbHNlCisJbXltYWdpYyA9IE1BR0lDX09GRjsKKworICAgIGZvciAoOyBwWzBdICE9IE5VTDsgKytwKQorICAgIHsKKwlpZiAocFswXSA9PSBkaXJjKQkvKiBmb3VuZCBlbmQgb2YgcmVnZXhwICovCisJICAgIGJyZWFrOworCWlmICgocFswXSA9PSAnWycgJiYgbXltYWdpYyA+PSBNQUdJQ19PTikKKwkJfHwgKHBbMF0gPT0gJ1xcJyAmJiBwWzFdID09ICdbJyAmJiBteW1hZ2ljIDw9IE1BR0lDX09GRikpCisJeworCSAgICBwID0gc2tpcF9hbnlvZihwICsgMSk7CisJICAgIGlmIChwWzBdID09IE5VTCkKKwkJYnJlYWs7CisJfQorCWVsc2UgaWYgKHBbMF0gPT0gJ1xcJyAmJiBwWzFdICE9IE5VTCkKKwl7CisJICAgIGlmIChkaXJjID09ICc/JyAmJiBuZXdwICE9IE5VTEwgJiYgcFsxXSA9PSAnPycpCisJICAgIHsKKwkJLyogY2hhbmdlICJcPyIgdG8gIj8iLCBtYWtlIGEgY29weSBmaXJzdC4gKi8KKwkJaWYgKCpuZXdwID09IE5VTEwpCisJCXsKKwkJICAgICpuZXdwID0gdmltX3N0cnNhdmUoc3RhcnRwKTsKKwkJICAgIGlmICgqbmV3cCAhPSBOVUxMKQorCQkJcCA9ICpuZXdwICsgKHAgLSBzdGFydHApOworCQl9CisJCWlmICgqbmV3cCAhPSBOVUxMKQorCQkgICAgbWNoX21lbW1vdmUocCwgcCArIDEsIFNUUkxFTihwKSk7CisJCWVsc2UKKwkJICAgICsrcDsKKwkgICAgfQorCSAgICBlbHNlCisJCSsrcDsgICAgLyogc2tpcCBuZXh0IGNoYXJhY3RlciAqLworCSAgICBpZiAoKnAgPT0gJ3YnKQorCQlteW1hZ2ljID0gTUFHSUNfQUxMOworCSAgICBlbHNlIGlmICgqcCA9PSAnVicpCisJCW15bWFnaWMgPSBNQUdJQ19OT05FOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJZWxzZSBpZiAoaGFzX21ieXRlKQorCSAgICBwICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkgLSAxOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBwOworfQorCisvKgorICogdmltX3JlZ2NvbXAgLSBjb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGludG8gaW50ZXJuYWwgY29kZQorICoKKyAqIFdlIGNhbid0IGFsbG9jYXRlIHNwYWNlIHVudGlsIHdlIGtub3cgaG93IGJpZyB0aGUgY29tcGlsZWQgZm9ybSB3aWxsIGJlLAorICogYnV0IHdlIGNhbid0IGNvbXBpbGUgaXQgKGFuZCB0aHVzIGtub3cgaG93IGJpZyBpdCBpcykgdW50aWwgd2UndmUgZ290IGEKKyAqIHBsYWNlIHRvIHB1dCB0aGUgY29kZS4gIFNvIHdlIGNoZWF0OiAgd2UgY29tcGlsZSBpdCB0d2ljZSwgb25jZSB3aXRoIGNvZGUKKyAqIGdlbmVyYXRpb24gdHVybmVkIG9mZiBhbmQgc2l6ZSBjb3VudGluZyB0dXJuZWQgb24sIGFuZCBvbmNlICJmb3IgcmVhbCIuCisgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCB3ZSBkb24ndCBhbGxvY2F0ZSBzcGFjZSB1bnRpbCB3ZSBhcmUgc3VyZSB0aGF0IHRoZQorICogdGhpbmcgcmVhbGx5IHdpbGwgY29tcGlsZSBzdWNjZXNzZnVsbHksIGFuZCB3ZSBuZXZlciBoYXZlIHRvIG1vdmUgdGhlCisgKiBjb2RlIGFuZCB0aHVzIGludmFsaWRhdGUgcG9pbnRlcnMgaW50byBpdC4gIChOb3RlIHRoYXQgaXQgaGFzIHRvIGJlIGluCisgKiBvbmUgcGllY2UgYmVjYXVzZSB2aW1fZnJlZSgpIG11c3QgYmUgYWJsZSB0byBmcmVlIGl0IGFsbC4pCisgKgorICogV2hldGhlciB1cHBlci9sb3dlciBjYXNlIGlzIHRvIGJlIGlnbm9yZWQgaXMgZGVjaWRlZCB3aGVuIGV4ZWN1dGluZyB0aGUKKyAqIHByb2dyYW0sIGl0IGRvZXMgbm90IG1hdHRlciBoZXJlLgorICoKKyAqIEJld2FyZSB0aGF0IHRoZSBvcHRpbWl6YXRpb24tcHJlcGFyYXRpb24gY29kZSBpbiBoZXJlIGtub3dzIGFib3V0IHNvbWUKKyAqIG9mIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBpbGVkIHJlZ2V4cC4KKyAqICJyZV9mbGFncyI6IFJFX01BR0lDIGFuZC9vciBSRV9TVFJJTkcuCisgKi8KKyAgICByZWdwcm9nX1QgKgordmltX3JlZ2NvbXAoZXhwciwgcmVfZmxhZ3MpCisgICAgY2hhcl91CSpleHByOworICAgIGludAkJcmVfZmxhZ3M7Cit7CisgICAgcmVncHJvZ19UCSpyOworICAgIGNoYXJfdQkqc2NhbjsKKyAgICBjaGFyX3UJKmxvbmdlc3Q7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmbGFnczsKKworICAgIGlmIChleHByID09IE5VTEwpCisJRU1TR19SRVRfTlVMTChfKGVfbnVsbCkpOworCisgICAgaW5pdF9jbGFzc190YWIoKTsKKworICAgIC8qCisgICAgICogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUsIGxlZ2FsaXR5LgorICAgICAqLworICAgIHJlZ2NvbXBfc3RhcnQoZXhwciwgcmVfZmxhZ3MpOworICAgIHJlZ2NvZGUgPSBKVVNUX0NBTENfU0laRTsKKyAgICByZWdjKFJFR01BR0lDKTsKKyAgICBpZiAocmVnKFJFR19OT1BBUkVOLCAmZmxhZ3MpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBTbWFsbCBlbm91Z2ggZm9yIHBvaW50ZXItc3RvcmFnZSBjb252ZW50aW9uPyAqLworI2lmZGVmIFNNQUxMX01BTExPQwkJLyogMTYgYml0IHN0b3JhZ2UgYWxsb2NhdGlvbiAqLworICAgIGlmIChyZWdzaXplID49IDY1NTM2TCAtIDI1NkwpCisJRU1TR19SRVRfTlVMTChfKCJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIikpOworI2VuZGlmCisKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZS4gKi8KKyAgICByID0gKHJlZ3Byb2dfVCAqKWxhbGxvYyhzaXplb2YocmVncHJvZ19UKSArIHJlZ3NpemUsIFRSVUUpOworICAgIGlmIChyID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICAqIFNlY29uZCBwYXNzOiBlbWl0IGNvZGUuCisgICAgICovCisgICAgcmVnY29tcF9zdGFydChleHByLCByZV9mbGFncyk7CisgICAgcmVnY29kZSA9IHItPnByb2dyYW07CisgICAgcmVnYyhSRUdNQUdJQyk7CisgICAgaWYgKHJlZyhSRUdfTk9QQVJFTiwgJmZsYWdzKSA9PSBOVUxMKQorICAgIHsKKwl2aW1fZnJlZShyKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBEaWcgb3V0IGluZm9ybWF0aW9uIGZvciBvcHRpbWl6YXRpb25zLiAqLworICAgIHItPnJlZ3N0YXJ0ID0gTlVMOwkJLyogV29yc3QtY2FzZSBkZWZhdWx0cy4gKi8KKyAgICByLT5yZWdhbmNoID0gMDsKKyAgICByLT5yZWdtdXN0ID0gTlVMTDsKKyAgICByLT5yZWdtbGVuID0gMDsKKyAgICByLT5yZWdmbGFncyA9IHJlZ2ZsYWdzOworICAgIGlmIChmbGFncyAmIEhBU05MKQorCXItPnJlZ2ZsYWdzIHw9IFJGX0hBU05MOworICAgIGlmIChmbGFncyAmIEhBU0xPT0tCSCkKKwlyLT5yZWdmbGFncyB8PSBSRl9MT09LQkg7CisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoaXMgcGF0dGVybiBoYXMgYW55IFx6IHNwZWNpYWxzIGluIGl0LiAqLworICAgIHItPnJlZ2hhc3ogPSByZV9oYXNfejsKKyNlbmRpZgorICAgIHNjYW4gPSByLT5wcm9ncmFtICsgMTsJLyogRmlyc3QgQlJBTkNILiAqLworICAgIGlmIChPUChyZWduZXh0KHNjYW4pKSA9PSBFTkQpICAgLyogT25seSBvbmUgdG9wLWxldmVsIGNob2ljZS4gKi8KKyAgICB7CisJc2NhbiA9IE9QRVJBTkQoc2Nhbik7CisKKwkvKiBTdGFydGluZy1wb2ludCBpbmZvLiAqLworCWlmIChPUChzY2FuKSA9PSBCT0wgfHwgT1Aoc2NhbikgPT0gUkVfQk9GKQorCXsKKwkgICAgci0+cmVnYW5jaCsrOworCSAgICBzY2FuID0gcmVnbmV4dChzY2FuKTsKKwl9CisKKwlpZiAoT1Aoc2NhbikgPT0gRVhBQ1RMWSkKKwl7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlyLT5yZWdzdGFydCA9ICgqbWJfcHRyMmNoYXIpKE9QRVJBTkQoc2NhbikpOworCSAgICBlbHNlCisjZW5kaWYKKwkJci0+cmVnc3RhcnQgPSAqT1BFUkFORChzY2FuKTsKKwl9CisJZWxzZSBpZiAoKE9QKHNjYW4pID09IEJPVworCQkgICAgfHwgT1Aoc2NhbikgPT0gRU9XCisJCSAgICB8fCBPUChzY2FuKSA9PSBOT1RISU5HCisJCSAgICB8fCBPUChzY2FuKSA9PSBNT1BFTiArIDAgfHwgT1Aoc2NhbikgPT0gTk9QRU4KKwkJICAgIHx8IE9QKHNjYW4pID09IE1DTE9TRSArIDAgfHwgT1Aoc2NhbikgPT0gTkNMT1NFKQorCQkgJiYgT1AocmVnbmV4dChzY2FuKSkgPT0gRVhBQ1RMWSkKKwl7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlyLT5yZWdzdGFydCA9ICgqbWJfcHRyMmNoYXIpKE9QRVJBTkQocmVnbmV4dChzY2FuKSkpOworCSAgICBlbHNlCisjZW5kaWYKKwkJci0+cmVnc3RhcnQgPSAqT1BFUkFORChyZWduZXh0KHNjYW4pKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3Mgc29tZXRoaW5nIGV4cGVuc2l2ZSBpbiB0aGUgci5lLiwgZmluZCB0aGUgbG9uZ2VzdAorCSAqIGxpdGVyYWwgc3RyaW5nIHRoYXQgbXVzdCBhcHBlYXIgYW5kIG1ha2UgaXQgdGhlIHJlZ211c3QuICBSZXNvbHZlCisJICogdGllcyBpbiBmYXZvciBvZiBsYXRlciBzdHJpbmdzLCBzaW5jZSB0aGUgcmVnc3RhcnQgY2hlY2sgd29ya3MKKwkgKiB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHIuZS4gYW5kIGF2b2lkaW5nIGR1cGxpY2F0aW9uCisJICogc3RyZW5ndGhlbnMgY2hlY2tpbmcuICBOb3QgYSBzdHJvbmcgcmVhc29uLCBidXQgc3VmZmljaWVudCBpbiB0aGUKKwkgKiBhYnNlbmNlIG9mIG90aGVycy4KKwkgKi8KKwkvKgorCSAqIFdoZW4gdGhlIHIuZS4gc3RhcnRzIHdpdGggQk9XLCBpdCBpcyBmYXN0ZXIgdG8gbG9vayBmb3IgYSByZWdtdXN0CisJICogZmlyc3QuIFVzZWQgYSBsb3QgZm9yICIjIiBhbmQgIioiIGNvbW1hbmRzLiAoQWRkZWQgYnkgbW9vbCkuCisJICovCisJaWYgKChmbGFncyAmIFNQU1RBUlQgfHwgT1Aoc2NhbikgPT0gQk9XIHx8IE9QKHNjYW4pID09IEVPVykKKwkJCQkJCQkgICYmICEoZmxhZ3MgJiBIQVNOTCkpCisJeworCSAgICBsb25nZXN0ID0gTlVMTDsKKwkgICAgbGVuID0gMDsKKwkgICAgZm9yICg7IHNjYW4gIT0gTlVMTDsgc2NhbiA9IHJlZ25leHQoc2NhbikpCisJCWlmIChPUChzY2FuKSA9PSBFWEFDVExZICYmIFNUUkxFTihPUEVSQU5EKHNjYW4pKSA+PSAoc2l6ZV90KWxlbikKKwkJeworCQkgICAgbG9uZ2VzdCA9IE9QRVJBTkQoc2Nhbik7CisJCSAgICBsZW4gPSAoaW50KVNUUkxFTihPUEVSQU5EKHNjYW4pKTsKKwkJfQorCSAgICByLT5yZWdtdXN0ID0gbG9uZ2VzdDsKKwkgICAgci0+cmVnbWxlbiA9IGxlbjsKKwl9CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgcmVnZHVtcChleHByLCByKTsKKyNlbmRpZgorICAgIHJldHVybiByOworfQorCisvKgorICogU2V0dXAgdG8gcGFyc2UgdGhlIHJlZ2V4cC4gIFVzZWQgb25jZSB0byBnZXQgdGhlIGxlbmd0aCBhbmQgb25jZSB0byBkbyBpdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZWdjb21wX3N0YXJ0KGV4cHIsIHJlX2ZsYWdzKQorICAgIGNoYXJfdQkqZXhwcjsKKyAgICBpbnQJCXJlX2ZsYWdzOwkgICAgLyogc2VlIHZpbV9yZWdjb21wKCkgKi8KK3sKKyAgICBpbml0Y2hyKGV4cHIpOworICAgIGlmIChyZV9mbGFncyAmIFJFX01BR0lDKQorCXJlZ19tYWdpYyA9IE1BR0lDX09OOworICAgIGVsc2UKKwlyZWdfbWFnaWMgPSBNQUdJQ19PRkY7CisgICAgcmVnX3N0cmluZyA9IChyZV9mbGFncyAmIFJFX1NUUklORyk7CisKKyAgICBudW1fY29tcGxleF9icmFjZXMgPSAwOworICAgIHJlZ25wYXIgPSAxOworICAgIHZpbV9tZW1zZXQoaGFkX2VuZGJyYWNlLCAwLCBzaXplb2YoaGFkX2VuZGJyYWNlKSk7CisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICByZWduenBhciA9IDE7CisgICAgcmVfaGFzX3ogPSAwOworI2VuZGlmCisgICAgcmVnc2l6ZSA9IDBMOworICAgIHJlZ2ZsYWdzID0gMDsKKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGhhZF9lb2wgPSBGQUxTRTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDaGVjayBpZiBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwgdG8gdmltX3JlZ2NvbXAgdGhlIEVPTCBpdGVtICIkIiBoYXMgYmVlbgorICogZm91bmQuICBUaGlzIGlzIG1lc3N5LCBidXQgaXQgd29ya3MgZmluZS4KKyAqLworICAgIGludAordmltX3JlZ2NvbXBfaGFkX2VvbCgpCit7CisgICAgcmV0dXJuIGhhZF9lb2w7Cit9CisjZW5kaWYKKworLyoKKyAqIHJlZyAtIHJlZ3VsYXIgZXhwcmVzc2lvbiwgaS5lLiBtYWluIGJvZHkgb3IgcGFyZW50aGVzaXplZCB0aGluZworICoKKyAqIENhbGxlciBtdXN0IGFic29yYiBvcGVuaW5nIHBhcmVudGhlc2lzLgorICoKKyAqIENvbWJpbmluZyBwYXJlbnRoZXNpcyBoYW5kbGluZyB3aXRoIHRoZSBiYXNlIGxldmVsIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbgorICogaXMgYSB0cmlmbGUgZm9yY2VkLCBidXQgdGhlIG5lZWQgdG8gdGllIHRoZSB0YWlscyBvZiB0aGUgYnJhbmNoZXMgdG8gd2hhdAorICogZm9sbG93cyBtYWtlcyBpdCBoYXJkIHRvIGF2b2lkLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZWcocGFyZW4sIGZsYWdwKQorICAgIGludAkJcGFyZW47CS8qIFJFR19OT1BBUkVOLCBSRUdfUEFSRU4sIFJFR19OUEFSRU4gb3IgUkVHX1pQQVJFTiAqLworICAgIGludAkJKmZsYWdwOworeworICAgIGNoYXJfdQkqcmV0OworICAgIGNoYXJfdQkqYnI7CisgICAgY2hhcl91CSplbmRlcjsKKyAgICBpbnQJCXBhcm5vID0gMDsKKyAgICBpbnQJCWZsYWdzOworCisgICAgKmZsYWdwID0gSEFTV0lEVEg7CQkvKiBUZW50YXRpdmVseS4gKi8KKworI2lmZGVmIEZFQVRfU1lOX0hMCisgICAgaWYgKHBhcmVuID09IFJFR19aUEFSRU4pCisgICAgeworCS8qIE1ha2UgYSBaT1BFTiBub2RlLiAqLworCWlmIChyZWduenBhciA+PSBOU1VCRVhQKQorCSAgICBFTVNHX1JFVF9OVUxMKF8oIkU1MDogVG9vIG1hbnkgXFx6KCIpKTsKKwlwYXJubyA9IHJlZ256cGFyOworCXJlZ256cGFyKys7CisJcmV0ID0gcmVnbm9kZShaT1BFTiArIHBhcm5vKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisJaWYgKHBhcmVuID09IFJFR19QQVJFTikKKyAgICB7CisJLyogTWFrZSBhIE1PUEVOIG5vZGUuICovCisJaWYgKHJlZ25wYXIgPj0gTlNVQkVYUCkKKwkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU1MTogVG9vIG1hbnkgJXMoIiksIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpOworCXBhcm5vID0gcmVnbnBhcjsKKwkrK3JlZ25wYXI7CisJcmV0ID0gcmVnbm9kZShNT1BFTiArIHBhcm5vKTsKKyAgICB9CisgICAgZWxzZSBpZiAocGFyZW4gPT0gUkVHX05QQVJFTikKKyAgICB7CisJLyogTWFrZSBhIE5PUEVOIG5vZGUuICovCisJcmV0ID0gcmVnbm9kZShOT1BFTik7CisgICAgfQorICAgIGVsc2UKKwlyZXQgPSBOVUxMOworCisgICAgLyogUGljayB1cCB0aGUgYnJhbmNoZXMsIGxpbmtpbmcgdGhlbSB0b2dldGhlci4gKi8KKyAgICBiciA9IHJlZ2JyYW5jaCgmZmxhZ3MpOworICAgIGlmIChiciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIGlmIChyZXQgIT0gTlVMTCkKKwlyZWd0YWlsKHJldCwgYnIpOwkvKiBbTVpdT1BFTiAtPiBmaXJzdC4gKi8KKyAgICBlbHNlCisJcmV0ID0gYnI7CisgICAgLyogSWYgb25lIG9mIHRoZSBicmFuY2hlcyBjYW4gYmUgemVyby13aWR0aCwgdGhlIHdob2xlIHRoaW5nIGNhbi4KKyAgICAgKiBJZiBvbmUgb2YgdGhlIGJyYW5jaGVzIGhhcyAqIGF0IHN0YXJ0IG9yIG1hdGNoZXMgYSBsaW5lLWJyZWFrLCB0aGUKKyAgICAgKiB3aG9sZSB0aGluZyBjYW4uICovCisgICAgaWYgKCEoZmxhZ3MgJiBIQVNXSURUSCkpCisJKmZsYWdwICY9IH5IQVNXSURUSDsKKyAgICAqZmxhZ3AgfD0gZmxhZ3MgJiAoU1BTVEFSVCB8IEhBU05MIHwgSEFTTE9PS0JIKTsKKyAgICB3aGlsZSAocGVla2NocigpID09IE1hZ2ljKCd8JykpCisgICAgeworCXNraXBjaHIoKTsKKwliciA9IHJlZ2JyYW5jaCgmZmxhZ3MpOworCWlmIChiciA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwlyZWd0YWlsKHJldCwgYnIpOwkvKiBCUkFOQ0ggLT4gQlJBTkNILiAqLworCWlmICghKGZsYWdzICYgSEFTV0lEVEgpKQorCSAgICAqZmxhZ3AgJj0gfkhBU1dJRFRIOworCSpmbGFncCB8PSBmbGFncyAmIChTUFNUQVJUIHwgSEFTTkwgfCBIQVNMT09LQkgpOworICAgIH0KKworICAgIC8qIE1ha2UgYSBjbG9zaW5nIG5vZGUsIGFuZCBob29rIGl0IG9uIHRoZSBlbmQuICovCisgICAgZW5kZXIgPSByZWdub2RlKAorI2lmZGVmIEZFQVRfU1lOX0hMCisJICAgIHBhcmVuID09IFJFR19aUEFSRU4gPyBaQ0xPU0UgKyBwYXJubyA6CisjZW5kaWYKKwkgICAgcGFyZW4gPT0gUkVHX1BBUkVOID8gTUNMT1NFICsgcGFybm8gOgorCSAgICBwYXJlbiA9PSBSRUdfTlBBUkVOID8gTkNMT1NFIDogRU5EKTsKKyAgICByZWd0YWlsKHJldCwgZW5kZXIpOworCisgICAgLyogSG9vayB0aGUgdGFpbHMgb2YgdGhlIGJyYW5jaGVzIHRvIHRoZSBjbG9zaW5nIG5vZGUuICovCisgICAgZm9yIChiciA9IHJldDsgYnIgIT0gTlVMTDsgYnIgPSByZWduZXh0KGJyKSkKKwlyZWdvcHRhaWwoYnIsIGVuZGVyKTsKKworICAgIC8qIENoZWNrIGZvciBwcm9wZXIgdGVybWluYXRpb24uICovCisgICAgaWYgKHBhcmVuICE9IFJFR19OT1BBUkVOICYmIGdldGNocigpICE9IE1hZ2ljKCcpJykpCisgICAgeworI2lmZGVmIEZFQVRfU1lOX0hMCisJaWYgKHBhcmVuID09IFJFR19aUEFSRU4pCisJICAgIEVNU0dfUkVUX05VTEwoXygiRTUyOiBVbm1hdGNoZWQgXFx6KCIpKQorCWVsc2UKKyNlbmRpZgorCSAgICBpZiAocGFyZW4gPT0gUkVHX05QQVJFTikKKwkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU1MzogVW5tYXRjaGVkICVzJSUoIiksIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpCisJZWxzZQorCSAgICBFTVNHX01fUkVUX05VTEwoXygiRTU0OiBVbm1hdGNoZWQgJXMoIiksIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpCisgICAgfQorICAgIGVsc2UgaWYgKHBhcmVuID09IFJFR19OT1BBUkVOICYmIHBlZWtjaHIoKSAhPSBOVUwpCisgICAgeworCWlmIChjdXJjaHIgPT0gTWFnaWMoJyknKSkKKwkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU1NTogVW5tYXRjaGVkICVzKSIpLCByZWdfbWFnaWMgPT0gTUFHSUNfQUxMKQorCWVsc2UKKwkgICAgRU1TR19SRVRfTlVMTChfKGVfdHJhaWxpbmcpKQkvKiAiQ2FuJ3QgaGFwcGVuIi4gKi8KKwkvKiBOT1RSRUFDSEVEICovCisgICAgfQorICAgIC8qCisgICAgICogSGVyZSB3ZSBzZXQgdGhlIGZsYWcgYWxsb3dpbmcgYmFjayByZWZlcmVuY2VzIHRvIHRoaXMgc2V0IG9mCisgICAgICogcGFyZW50aGVzZXMuCisgICAgICovCisgICAgaWYgKHBhcmVuID09IFJFR19QQVJFTikKKwloYWRfZW5kYnJhY2VbcGFybm9dID0gVFJVRTsJLyogaGF2ZSBzZWVuIHRoZSBjbG9zZSBwYXJlbiAqLworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZWdicmFuY2ggLSBvbmUgYWx0ZXJuYXRpdmUgb2YgYW4gfCBvcGVyYXRvcgorICoKKyAqIEltcGxlbWVudHMgdGhlICYgb3BlcmF0b3IuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3JlZ2JyYW5jaChmbGFncCkKKyAgICBpbnQJCSpmbGFncDsKK3sKKyAgICBjaGFyX3UJKnJldDsKKyAgICBjaGFyX3UJKmNoYWluID0gTlVMTDsKKyAgICBjaGFyX3UJKmxhdGVzdDsKKyAgICBpbnQJCWZsYWdzOworCisgICAgKmZsYWdwID0gV09SU1QgfCBIQVNOTDsJCS8qIFRlbnRhdGl2ZWx5LiAqLworCisgICAgcmV0ID0gcmVnbm9kZShCUkFOQ0gpOworICAgIGZvciAoOzspCisgICAgeworCWxhdGVzdCA9IHJlZ2NvbmNhdCgmZmxhZ3MpOworCWlmIChsYXRlc3QgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJLyogSWYgb25lIG9mIHRoZSBicmFuY2hlcyBoYXMgd2lkdGgsIHRoZSB3aG9sZSB0aGluZyBoYXMuICBJZiBvbmUgb2YKKwkgKiB0aGUgYnJhbmNoZXMgYW5jaG9ycyBhdCBzdGFydC1vZi1saW5lLCB0aGUgd2hvbGUgdGhpbmcgZG9lcy4KKwkgKiBJZiBvbmUgb2YgdGhlIGJyYW5jaGVzIHVzZXMgbG9vay1iZWhpbmQsIHRoZSB3aG9sZSB0aGluZyBkb2VzLiAqLworCSpmbGFncCB8PSBmbGFncyAmIChIQVNXSURUSCB8IFNQU1RBUlQgfCBIQVNMT09LQkgpOworCS8qIElmIG9uZSBvZiB0aGUgYnJhbmNoZXMgZG9lc24ndCBtYXRjaCBhIGxpbmUtYnJlYWssIHRoZSB3aG9sZSB0aGluZworCSAqIGRvZXNuJ3QuICovCisJKmZsYWdwICY9IH5IQVNOTCB8IChmbGFncyAmIEhBU05MKTsKKwlpZiAoY2hhaW4gIT0gTlVMTCkKKwkgICAgcmVndGFpbChjaGFpbiwgbGF0ZXN0KTsKKwlpZiAocGVla2NocigpICE9IE1hZ2ljKCcmJykpCisJICAgIGJyZWFrOworCXNraXBjaHIoKTsKKwlyZWd0YWlsKGxhdGVzdCwgcmVnbm9kZShFTkQpKTsgLyogb3BlcmFuZCBlbmRzICovCisJcmVnaW5zZXJ0KE1BVENILCBsYXRlc3QpOworCWNoYWluID0gbGF0ZXN0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZWdicmFuY2ggLSBvbmUgYWx0ZXJuYXRpdmUgb2YgYW4gfCBvciAmIG9wZXJhdG9yCisgKgorICogSW1wbGVtZW50cyB0aGUgY29uY2F0ZW5hdGlvbiBvcGVyYXRvci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcmVnY29uY2F0KGZsYWdwKQorICAgIGludAkJKmZsYWdwOworeworICAgIGNoYXJfdQkqZmlyc3QgPSBOVUxMOworICAgIGNoYXJfdQkqY2hhaW4gPSBOVUxMOworICAgIGNoYXJfdQkqbGF0ZXN0OworICAgIGludAkJZmxhZ3M7CisgICAgaW50CQljb250ID0gVFJVRTsKKworICAgICpmbGFncCA9IFdPUlNUOwkJLyogVGVudGF0aXZlbHkuICovCisKKyAgICB3aGlsZSAoY29udCkKKyAgICB7CisJc3dpdGNoIChwZWVrY2hyKCkpCisJeworCSAgICBjYXNlIE5VTDoKKwkgICAgY2FzZSBNYWdpYygnfCcpOgorCSAgICBjYXNlIE1hZ2ljKCcmJyk6CisJICAgIGNhc2UgTWFnaWMoJyknKToKKwkJCSAgICBjb250ID0gRkFMU0U7CisJCQkgICAgYnJlYWs7CisJICAgIGNhc2UgTWFnaWMoJ1onKToKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkgICAgcmVnZmxhZ3MgfD0gUkZfSUNPTUJJTkU7CisjZW5kaWYKKwkJCSAgICBza2lwY2hyX2tlZXBzdGFydCgpOworCQkJICAgIGJyZWFrOworCSAgICBjYXNlIE1hZ2ljKCdjJyk6CisJCQkgICAgcmVnZmxhZ3MgfD0gUkZfSUNBU0U7CisJCQkgICAgc2tpcGNocl9rZWVwc3RhcnQoKTsKKwkJCSAgICBicmVhazsKKwkgICAgY2FzZSBNYWdpYygnQycpOgorCQkJICAgIHJlZ2ZsYWdzIHw9IFJGX05PSUNBU0U7CisJCQkgICAgc2tpcGNocl9rZWVwc3RhcnQoKTsKKwkJCSAgICBicmVhazsKKwkgICAgY2FzZSBNYWdpYygndicpOgorCQkJICAgIHJlZ19tYWdpYyA9IE1BR0lDX0FMTDsKKwkJCSAgICBza2lwY2hyX2tlZXBzdGFydCgpOworCQkJICAgIGN1cmNociA9IC0xOworCQkJICAgIGJyZWFrOworCSAgICBjYXNlIE1hZ2ljKCdtJyk6CisJCQkgICAgcmVnX21hZ2ljID0gTUFHSUNfT047CisJCQkgICAgc2tpcGNocl9rZWVwc3RhcnQoKTsKKwkJCSAgICBjdXJjaHIgPSAtMTsKKwkJCSAgICBicmVhazsKKwkgICAgY2FzZSBNYWdpYygnTScpOgorCQkJICAgIHJlZ19tYWdpYyA9IE1BR0lDX09GRjsKKwkJCSAgICBza2lwY2hyX2tlZXBzdGFydCgpOworCQkJICAgIGN1cmNociA9IC0xOworCQkJICAgIGJyZWFrOworCSAgICBjYXNlIE1hZ2ljKCdWJyk6CisJCQkgICAgcmVnX21hZ2ljID0gTUFHSUNfTk9ORTsKKwkJCSAgICBza2lwY2hyX2tlZXBzdGFydCgpOworCQkJICAgIGN1cmNociA9IC0xOworCQkJICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCQkJICAgIGxhdGVzdCA9IHJlZ3BpZWNlKCZmbGFncyk7CisJCQkgICAgaWYgKGxhdGVzdCA9PSBOVUxMKQorCQkJCXJldHVybiBOVUxMOworCQkJICAgICpmbGFncCB8PSBmbGFncyAmIChIQVNXSURUSCB8IEhBU05MIHwgSEFTTE9PS0JIKTsKKwkJCSAgICBpZiAoY2hhaW4gPT0gTlVMTCkJLyogRmlyc3QgcGllY2UuICovCisJCQkJKmZsYWdwIHw9IGZsYWdzICYgU1BTVEFSVDsKKwkJCSAgICBlbHNlCisJCQkJcmVndGFpbChjaGFpbiwgbGF0ZXN0KTsKKwkJCSAgICBjaGFpbiA9IGxhdGVzdDsKKwkJCSAgICBpZiAoZmlyc3QgPT0gTlVMTCkKKwkJCQlmaXJzdCA9IGxhdGVzdDsKKwkJCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChmaXJzdCA9PSBOVUxMKQkJLyogTG9vcCByYW4gemVybyB0aW1lcy4gKi8KKwlmaXJzdCA9IHJlZ25vZGUoTk9USElORyk7CisgICAgcmV0dXJuIGZpcnN0OworfQorCisvKgorICogcmVncGllY2UgLSBzb21ldGhpbmcgZm9sbG93ZWQgYnkgcG9zc2libGUgWyorPV0KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGJyYW5jaGluZyBjb2RlIHNlcXVlbmNlcyB1c2VkIGZvciA9IGFuZCB0aGUgZ2VuZXJhbCBjYXNlcworICogb2YgKiBhbmQgKyBhcmUgc29tZXdoYXQgb3B0aW1pemVkOiAgdGhleSB1c2UgdGhlIHNhbWUgTk9USElORyBub2RlIGFzCisgKiBib3RoIHRoZSBlbmRtYXJrZXIgZm9yIHRoZWlyIGJyYW5jaCBsaXN0IGFuZCB0aGUgYm9keSBvZiB0aGUgbGFzdCBicmFuY2guCisgKiBJdCBtaWdodCBzZWVtIHRoYXQgdGhpcyBub2RlIGNvdWxkIGJlIGRpc3BlbnNlZCB3aXRoIGVudGlyZWx5LCBidXQgdGhlCisgKiBlbmRtYXJrZXIgcm9sZSBpcyBub3QgcmVkdW5kYW50LgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZWdwaWVjZShmbGFncCkKKyAgICBpbnQJCSAgICAqZmxhZ3A7Cit7CisgICAgY2hhcl91CSAgICAqcmV0OworICAgIGludAkJICAgIG9wOworICAgIGNoYXJfdQkgICAgKm5leHQ7CisgICAgaW50CQkgICAgZmxhZ3M7CisgICAgbG9uZwkgICAgbWludmFsOworICAgIGxvbmcJICAgIG1heHZhbDsKKworICAgIHJldCA9IHJlZ2F0b20oJmZsYWdzKTsKKyAgICBpZiAocmV0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBvcCA9IHBlZWtjaHIoKTsKKyAgICBpZiAocmVfbXVsdGlfdHlwZShvcCkgPT0gTk9UX01VTFRJKQorICAgIHsKKwkqZmxhZ3AgPSBmbGFnczsKKwlyZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoIShmbGFncyAmIEhBU1dJRFRIKSAmJiByZV9tdWx0aV90eXBlKG9wKSA9PSBNVUxUSV9NVUxUKQorICAgIHsKKwlpZiAob3AgPT0gTWFnaWMoJyonKSkKKwkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiKSwKKwkJCQkJCSAgICAgICByZWdfbWFnaWMgPj0gTUFHSUNfT04pOworCWlmIChvcCA9PSBNYWdpYygnKycpKQorCSAgICBFTVNHX01fUkVUX05VTEwoXygiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIpLAorCQkJCQkJICAgICAgIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpOworCS8qICJce30iIGlzIGNoZWNrZWQgYmVsb3csIGl0J3MgYWxsb3dlZCB3aGVuIHRoZXJlIGlzIGFuIHVwcGVyIGxpbWl0ICovCisgICAgfQorICAgIC8qIGRlZmF1bHQgZmxhZ3MgKi8KKyAgICAqZmxhZ3AgPSAoV09SU1QgfCBTUFNUQVJUIHwgKGZsYWdzICYgKEhBU05MIHwgSEFTTE9PS0JIKSkpOworCisgICAgc2tpcGNocigpOworICAgIHN3aXRjaCAob3ApCisgICAgeworCWNhc2UgTWFnaWMoJyonKToKKwkgICAgaWYgKGZsYWdzICYgU0lNUExFKQorCQlyZWdpbnNlcnQoU1RBUiwgcmV0KTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIEVtaXQgeCogYXMgKHgmfCksIHdoZXJlICYgbWVhbnMgInNlbGYiLiAqLworCQlyZWdpbnNlcnQoQlJBTkNILCByZXQpOyAvKiBFaXRoZXIgeCAqLworCQlyZWdvcHRhaWwocmV0LCByZWdub2RlKEJBQ0spKTsJLyogYW5kIGxvb3AgKi8KKwkJcmVnb3B0YWlsKHJldCwgcmV0KTsJLyogYmFjayAqLworCQlyZWd0YWlsKHJldCwgcmVnbm9kZShCUkFOQ0gpKTsJLyogb3IgKi8KKwkJcmVndGFpbChyZXQsIHJlZ25vZGUoTk9USElORykpOyAvKiBudWxsLiAqLworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBNYWdpYygnKycpOgorCSAgICBpZiAoZmxhZ3MgJiBTSU1QTEUpCisJCXJlZ2luc2VydChQTFVTLCByZXQpOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogRW1pdCB4KyBhcyB4KCZ8KSwgd2hlcmUgJiBtZWFucyAic2VsZiIuICovCisJCW5leHQgPSByZWdub2RlKEJSQU5DSCk7IC8qIEVpdGhlciAqLworCQlyZWd0YWlsKHJldCwgbmV4dCk7CisJCXJlZ3RhaWwocmVnbm9kZShCQUNLKSwgcmV0KTsJLyogbG9vcCBiYWNrICovCisJCXJlZ3RhaWwobmV4dCwgcmVnbm9kZShCUkFOQ0gpKTsgLyogb3IgKi8KKwkJcmVndGFpbChyZXQsIHJlZ25vZGUoTk9USElORykpOyAvKiBudWxsLiAqLworCSAgICB9CisJICAgICpmbGFncCA9IChXT1JTVCB8IEhBU1dJRFRIIHwgKGZsYWdzICYgKEhBU05MIHwgSEFTTE9PS0JIKSkpOworCSAgICBicmVhazsKKworCWNhc2UgTWFnaWMoJ0AnKToKKwkgICAgeworCQlpbnQJbG9wID0gRU5EOworCisJCXN3aXRjaCAobm9fTWFnaWMoZ2V0Y2hyKCkpKQorCQl7CisJCSAgICBjYXNlICc9JzogbG9wID0gTUFUQ0g7IGJyZWFrOwkJICAvKiBcQD0gKi8KKwkJICAgIGNhc2UgJyEnOiBsb3AgPSBOT01BVENIOyBicmVhazsJCSAgLyogXEAhICovCisJCSAgICBjYXNlICc+JzogbG9wID0gU1VCUEFUOyBicmVhazsJCSAgLyogXEA+ICovCisJCSAgICBjYXNlICc8Jzogc3dpdGNoIChub19NYWdpYyhnZXRjaHIoKSkpCisJCQkgICAgICB7CisJCQkJICBjYXNlICc9JzogbG9wID0gQkVISU5EOyBicmVhazsgICAvKiBcQDw9ICovCisJCQkJICBjYXNlICchJzogbG9wID0gTk9CRUhJTkQ7IGJyZWFrOyAvKiBcQDwhICovCisJCQkgICAgICB9CisJCX0KKwkJaWYgKGxvcCA9PSBFTkQpCisJCSAgICBFTVNHX01fUkVUX05VTEwoXygiRTU5OiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlc0AiKSwKKwkJCQkJCSAgICAgIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpOworCQkvKiBMb29rIGJlaGluZCBtdXN0IG1hdGNoIHdpdGggYmVoaW5kX3Bvcy4gKi8KKwkJaWYgKGxvcCA9PSBCRUhJTkQgfHwgbG9wID09IE5PQkVISU5EKQorCQl7CisJCSAgICByZWd0YWlsKHJldCwgcmVnbm9kZShCSFBPUykpOworCQkgICAgKmZsYWdwIHw9IEhBU0xPT0tCSDsKKwkJfQorCQlyZWd0YWlsKHJldCwgcmVnbm9kZShFTkQpKTsgLyogb3BlcmFuZCBlbmRzICovCisJCXJlZ2luc2VydChsb3AsIHJldCk7CisJCWJyZWFrOworCSAgICB9CisKKwljYXNlIE1hZ2ljKCc/Jyk6CisJY2FzZSBNYWdpYygnPScpOgorCSAgICAvKiBFbWl0IHg9IGFzICh4fCkgKi8KKwkgICAgcmVnaW5zZXJ0KEJSQU5DSCwgcmV0KTsJCS8qIEVpdGhlciB4ICovCisJICAgIHJlZ3RhaWwocmV0LCByZWdub2RlKEJSQU5DSCkpOwkvKiBvciAqLworCSAgICBuZXh0ID0gcmVnbm9kZShOT1RISU5HKTsJCS8qIG51bGwuICovCisJICAgIHJlZ3RhaWwocmV0LCBuZXh0KTsKKwkgICAgcmVnb3B0YWlsKHJldCwgbmV4dCk7CisJICAgIGJyZWFrOworCisJY2FzZSBNYWdpYygneycpOgorCSAgICBpZiAoIXJlYWRfbGltaXRzKCZtaW52YWwsICZtYXh2YWwpKQorCQlyZXR1cm4gTlVMTDsKKwkgICAgaWYgKCEoZmxhZ3MgJiBIQVNXSURUSCkgJiYgKG1heHZhbCA+IG1pbnZhbAorCQkJCSA/IG1heHZhbCA+PSBNQVhfTElNSVQgOiBtaW52YWwgPj0gTUFYX0xJTUlUKSkKKwkJRU1TR19NX1JFVF9OVUxMKF8oIkU1ODogJXN7IG9wZXJhbmQgY291bGQgYmUgZW1wdHkiKSwKKwkJCQkJCSAgICAgIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpOworCSAgICBpZiAoZmxhZ3MgJiBTSU1QTEUpCisJICAgIHsKKwkJcmVnaW5zZXJ0KEJSQUNFX1NJTVBMRSwgcmV0KTsKKwkJcmVnaW5zZXJ0X2xpbWl0cyhCUkFDRV9MSU1JVFMsIG1pbnZhbCwgbWF4dmFsLCByZXQpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAobnVtX2NvbXBsZXhfYnJhY2VzID49IDEwKQorCQkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU2MDogVG9vIG1hbnkgY29tcGxleCAlc3suLi59cyIpLAorCQkJCQkJICAgICAgcmVnX21hZ2ljID09IE1BR0lDX0FMTCk7CisJCXJlZ2luc2VydChCUkFDRV9DT01QTEVYICsgbnVtX2NvbXBsZXhfYnJhY2VzLCByZXQpOworCQlyZWdvcHRhaWwocmV0LCByZWdub2RlKEJBQ0spKTsKKwkJcmVnb3B0YWlsKHJldCwgcmV0KTsKKwkJcmVnaW5zZXJ0X2xpbWl0cyhCUkFDRV9MSU1JVFMsIG1pbnZhbCwgbWF4dmFsLCByZXQpOworCQkrK251bV9jb21wbGV4X2JyYWNlczsKKwkgICAgfQorCSAgICBpZiAobWludmFsID4gMCAmJiBtYXh2YWwgPiAwKQorCQkqZmxhZ3AgPSAoSEFTV0lEVEggfCAoZmxhZ3MgJiAoSEFTTkwgfCBIQVNMT09LQkgpKSk7CisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocmVfbXVsdGlfdHlwZShwZWVrY2hyKCkpICE9IE5PVF9NVUxUSSkKKyAgICB7CisJLyogQ2FuJ3QgaGF2ZSBhIG11bHRpIGZvbGxvdyBhIG11bHRpLiAqLworCWlmIChwZWVrY2hyKCkgPT0gTWFnaWMoJyonKSkKKwkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTYxOiBOZXN0ZWQgJXMqIiksCisJCQkJCSAgICByZWdfbWFnaWMgPj0gTUFHSUNfT04gPyAiIiA6ICJcXCIpOworCWVsc2UKKwkgICAgc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTYyOiBOZXN0ZWQgJXMlYyIpLAorCQlyZWdfbWFnaWMgPT0gTUFHSUNfQUxMID8gIiIgOiAiXFwiLCBub19NYWdpYyhwZWVrY2hyKCkpKTsKKwlFTVNHX1JFVF9OVUxMKElPYnVmZik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJlZ2F0b20gLSB0aGUgbG93ZXN0IGxldmVsCisgKgorICogT3B0aW1pemF0aW9uOiAgZ29iYmxlcyBhbiBlbnRpcmUgc2VxdWVuY2Ugb2Ygb3JkaW5hcnkgY2hhcmFjdGVycyBzbyB0aGF0CisgKiBpdCBjYW4gdHVybiB0aGVtIGludG8gYSBzaW5nbGUgbm9kZSwgd2hpY2ggaXMgc21hbGxlciB0byBzdG9yZSBhbmQKKyAqIGZhc3RlciB0byBydW4uICBEb24ndCBkbyB0aGlzIHdoZW4gb25lX2V4YWN0bHkgaXMgc2V0LgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZWdhdG9tKGZsYWdwKQorICAgIGludAkJICAgKmZsYWdwOworeworICAgIGNoYXJfdQkgICAgKnJldDsKKyAgICBpbnQJCSAgICBmbGFnczsKKyAgICBpbnQJCSAgICBjcG9fbGl0OwkgICAgLyogJ2Nwb3B0aW9ucycgY29udGFpbnMgJ2wnIGZsYWcgKi8KKyAgICBpbnQJCSAgICBjOworICAgIHN0YXRpYyBjaGFyX3UgICAqY2xhc3NjaGFycyA9IChjaGFyX3UgKikiLmlJa0tmRnBQc1NkRHhYb093V2hIYUFsTHVVIjsKKyAgICBzdGF0aWMgaW50CSAgICBjbGFzc2NvZGVzW10gPSB7QU5ZLCBJREVOVCwgU0lERU5ULCBLV09SRCwgU0tXT1JELAorCQkJCSAgICBGTkFNRSwgU0ZOQU1FLCBQUklOVCwgU1BSSU5ULAorCQkJCSAgICBXSElURSwgTldISVRFLCBESUdJVCwgTkRJR0lULAorCQkJCSAgICBIRVgsIE5IRVgsIE9DVEFMLCBOT0NUQUwsCisJCQkJICAgIFdPUkQsIE5XT1JELCBIRUFELCBOSEVBRCwKKwkJCQkgICAgQUxQSEEsIE5BTFBIQSwgTE9XRVIsIE5MT1dFUiwKKwkJCQkgICAgVVBQRVIsIE5VUFBFUgorCQkJCSAgICB9OworICAgIGNoYXJfdQkgICAgKnA7CisgICAgaW50CQkgICAgZXh0cmEgPSAwOworCisgICAgKmZsYWdwID0gV09SU1Q7CQkvKiBUZW50YXRpdmVseS4gKi8KKyAgICBjcG9fbGl0ID0gKCFyZWdfc3luICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19MSVRFUkFMKSAhPSBOVUxMKTsKKworICAgIGMgPSBnZXRjaHIoKTsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgICAgY2FzZSBNYWdpYygnXicpOgorCXJldCA9IHJlZ25vZGUoQk9MKTsKKwlicmVhazsKKworICAgICAgY2FzZSBNYWdpYygnJCcpOgorCXJldCA9IHJlZ25vZGUoRU9MKTsKKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKFBST1RPKQorCWhhZF9lb2wgPSBUUlVFOworI2VuZGlmCisJYnJlYWs7CisKKyAgICAgIGNhc2UgTWFnaWMoJzwnKToKKwlyZXQgPSByZWdub2RlKEJPVyk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgTWFnaWMoJz4nKToKKwlyZXQgPSByZWdub2RlKEVPVyk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgTWFnaWMoJ18nKToKKwljID0gbm9fTWFnaWMoZ2V0Y2hyKCkpOworCWlmIChjID09ICdeJykJCS8qICJcX14iIGlzIHN0YXJ0LW9mLWxpbmUgKi8KKwl7CisJICAgIHJldCA9IHJlZ25vZGUoQk9MKTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChjID09ICckJykJCS8qICJcXyQiIGlzIGVuZC1vZi1saW5lICovCisJeworCSAgICByZXQgPSByZWdub2RlKEVPTCk7CisjaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChQUk9UTykKKwkgICAgaGFkX2VvbCA9IFRSVUU7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJfQorCisJZXh0cmEgPSBBRERfTkw7CisJKmZsYWdwIHw9IEhBU05MOworCisJLyogIlxfWyIgaXMgY2hhcmFjdGVyIHJhbmdlIHBsdXMgbmV3bGluZSAqLworCWlmIChjID09ICdbJykKKwkgICAgZ290byBjb2xsZWN0aW9uOworCisJLyogIlxfeCIgaXMgY2hhcmFjdGVyIGNsYXNzIHBsdXMgbmV3bGluZSAqLworCS8qRkFMTFRIUk9VR0gqLworCisJLyoKKwkgKiBDaGFyYWN0ZXIgY2xhc3Nlcy4KKwkgKi8KKyAgICAgIGNhc2UgTWFnaWMoJy4nKToKKyAgICAgIGNhc2UgTWFnaWMoJ2knKToKKyAgICAgIGNhc2UgTWFnaWMoJ0knKToKKyAgICAgIGNhc2UgTWFnaWMoJ2snKToKKyAgICAgIGNhc2UgTWFnaWMoJ0snKToKKyAgICAgIGNhc2UgTWFnaWMoJ2YnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0YnKToKKyAgICAgIGNhc2UgTWFnaWMoJ3AnKToKKyAgICAgIGNhc2UgTWFnaWMoJ1AnKToKKyAgICAgIGNhc2UgTWFnaWMoJ3MnKToKKyAgICAgIGNhc2UgTWFnaWMoJ1MnKToKKyAgICAgIGNhc2UgTWFnaWMoJ2QnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0QnKToKKyAgICAgIGNhc2UgTWFnaWMoJ3gnKToKKyAgICAgIGNhc2UgTWFnaWMoJ1gnKToKKyAgICAgIGNhc2UgTWFnaWMoJ28nKToKKyAgICAgIGNhc2UgTWFnaWMoJ08nKToKKyAgICAgIGNhc2UgTWFnaWMoJ3cnKToKKyAgICAgIGNhc2UgTWFnaWMoJ1cnKToKKyAgICAgIGNhc2UgTWFnaWMoJ2gnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0gnKToKKyAgICAgIGNhc2UgTWFnaWMoJ2EnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0EnKToKKyAgICAgIGNhc2UgTWFnaWMoJ2wnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0wnKToKKyAgICAgIGNhc2UgTWFnaWMoJ3UnKToKKyAgICAgIGNhc2UgTWFnaWMoJ1UnKToKKwlwID0gdmltX3N0cmNocihjbGFzc2NoYXJzLCBub19NYWdpYyhjKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkgICAgRU1TR19SRVRfTlVMTChfKCJFNjM6IGludmFsaWQgdXNlIG9mIFxcXyIpKTsKKwlyZXQgPSByZWdub2RlKGNsYXNzY29kZXNbcCAtIGNsYXNzY2hhcnNdICsgZXh0cmEpOworCSpmbGFncCB8PSBIQVNXSURUSCB8IFNJTVBMRTsKKwlicmVhazsKKworICAgICAgY2FzZSBNYWdpYygnbicpOgorCWlmIChyZWdfc3RyaW5nKQorCXsKKwkgICAgLyogSW4gYSBzdHJpbmcgIlxuIiBtYXRjaGVzIGEgbmV3bGluZSBjaGFyYWN0ZXIuICovCisJICAgIHJldCA9IHJlZ25vZGUoRVhBQ1RMWSk7CisJICAgIHJlZ2MoTkwpOworCSAgICByZWdjKE5VTCk7CisJICAgICpmbGFncCB8PSBIQVNXSURUSCB8IFNJTVBMRTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogSW4gYnVmZmVyIHRleHQgIlxuIiBtYXRjaGVzIHRoZSBlbmQgb2YgYSBsaW5lLiAqLworCSAgICByZXQgPSByZWdub2RlKE5FV0wpOworCSAgICAqZmxhZ3AgfD0gSEFTV0lEVEggfCBIQVNOTDsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgTWFnaWMoJygnKToKKwlpZiAob25lX2V4YWN0bHkpCisJICAgIEVNU0dfT05FX1JFVF9OVUxMOworCXJldCA9IHJlZyhSRUdfUEFSRU4sICZmbGFncyk7CisJaWYgKHJldCA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwkqZmxhZ3AgfD0gZmxhZ3MgJiAoSEFTV0lEVEggfCBTUFNUQVJUIHwgSEFTTkwgfCBIQVNMT09LQkgpOworCWJyZWFrOworCisgICAgICBjYXNlIE5VTDoKKyAgICAgIGNhc2UgTWFnaWMoJ3wnKToKKyAgICAgIGNhc2UgTWFnaWMoJyYnKToKKyAgICAgIGNhc2UgTWFnaWMoJyknKToKKwlFTVNHX1JFVF9OVUxMKF8oZV9pbnRlcm5hbCkpOwkvKiBTdXBwb3NlZCB0byBiZSBjYXVnaHQgZWFybGllci4gKi8KKwkvKiBOT1RSRUFDSEVEICovCisKKyAgICAgIGNhc2UgTWFnaWMoJz0nKToKKyAgICAgIGNhc2UgTWFnaWMoJz8nKToKKyAgICAgIGNhc2UgTWFnaWMoJysnKToKKyAgICAgIGNhc2UgTWFnaWMoJ0AnKToKKyAgICAgIGNhc2UgTWFnaWMoJ3snKToKKyAgICAgIGNhc2UgTWFnaWMoJyonKToKKwljID0gbm9fTWFnaWMoYyk7CisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTY0OiAlcyVjIGZvbGxvd3Mgbm90aGluZyIpLAorCQkoYyA9PSAnKicgPyByZWdfbWFnaWMgPj0gTUFHSUNfT04gOiByZWdfbWFnaWMgPT0gTUFHSUNfQUxMKQorCQk/ICIiIDogIlxcIiwgYyk7CisJRU1TR19SRVRfTlVMTChJT2J1ZmYpOworCS8qIE5PVFJFQUNIRUQgKi8KKworICAgICAgY2FzZSBNYWdpYygnficpOgkJLyogcHJldmlvdXMgc3Vic3RpdHV0ZSBwYXR0ZXJuICovCisJICAgIGlmIChyZWdfcHJldl9zdWIpCisJICAgIHsKKwkJY2hhcl91CSAgICAqbHA7CisKKwkJcmV0ID0gcmVnbm9kZShFWEFDVExZKTsKKwkJbHAgPSByZWdfcHJldl9zdWI7CisJCXdoaWxlICgqbHAgIT0gTlVMKQorCQkgICAgcmVnYygqbHArKyk7CisJCXJlZ2MoTlVMKTsKKwkJaWYgKCpyZWdfcHJldl9zdWIgIT0gTlVMKQorCQl7CisJCSAgICAqZmxhZ3AgfD0gSEFTV0lEVEg7CisJCSAgICBpZiAoKGxwIC0gcmVnX3ByZXZfc3ViKSA9PSAxKQorCQkJKmZsYWdwIHw9IFNJTVBMRTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJRU1TR19SRVRfTlVMTChfKGVfbm9wcmVzdWIpKTsKKwkgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTWFnaWMoJzEnKToKKyAgICAgIGNhc2UgTWFnaWMoJzInKToKKyAgICAgIGNhc2UgTWFnaWMoJzMnKToKKyAgICAgIGNhc2UgTWFnaWMoJzQnKToKKyAgICAgIGNhc2UgTWFnaWMoJzUnKToKKyAgICAgIGNhc2UgTWFnaWMoJzYnKToKKyAgICAgIGNhc2UgTWFnaWMoJzcnKToKKyAgICAgIGNhc2UgTWFnaWMoJzgnKToKKyAgICAgIGNhc2UgTWFnaWMoJzknKToKKwkgICAgeworCQlpbnQJCSAgICByZWZudW07CisKKwkJcmVmbnVtID0gYyAtIE1hZ2ljKCcwJyk7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBiYWNrIHJlZmVyZW5jZSBpcyBsZWdhbC4gV2UgbXVzdCBoYXZlIHNlZW4gdGhlCisJCSAqIGNsb3NlIGJyYWNlLgorCQkgKiBUT0RPOiBTaG91bGQgYWxzbyBjaGVjayB0aGF0IHdlIGRvbid0IHJlZmVyIHRvIHNvbWV0aGluZworCQkgKiB0aGF0IGlzIHJlcGVhdGVkICgrKj0pOiB3aGF0IGluc3RhbmNlIG9mIHRoZSByZXBldGl0aW9uCisJCSAqIHNob3VsZCB3ZSBtYXRjaD8KKwkJICovCisJCWlmICghaGFkX2VuZGJyYWNlW3JlZm51bV0pCisJCXsKKwkJICAgIC8qIFRyaWNrOiBjaGVjayBpZiAiQDw9IiBvciAiQDwhIiBmb2xsb3dzLCBpbiB3aGljaCBjYXNlCisJCSAgICAgKiB0aGUgXDEgY2FuIGFwcGVhciBiZWZvcmUgdGhlIHJlZmVyZW5jZWQgbWF0Y2guICovCisJCSAgICBmb3IgKHAgPSByZWdwYXJzZTsgKnAgIT0gTlVMOyArK3ApCisJCQlpZiAocFswXSA9PSAnQCcgJiYgcFsxXSA9PSAnPCcKKwkJCQkJICAgICAgJiYgKHBbMl0gPT0gJyEnIHx8IHBbMl0gPT0gJz0nKSkKKwkJCSAgICBicmVhazsKKwkJICAgIGlmICgqcCA9PSBOVUwpCisJCQlFTVNHX1JFVF9OVUxMKF8oIkU2NTogSWxsZWdhbCBiYWNrIHJlZmVyZW5jZSIpKTsKKwkJfQorCQlyZXQgPSByZWdub2RlKEJBQ0tSRUYgKyByZWZudW0pOworCSAgICB9CisJICAgIGJyZWFrOworCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICAgIGNhc2UgTWFnaWMoJ3onKToKKwl7CisJICAgIGMgPSBub19NYWdpYyhnZXRjaHIoKSk7CisJICAgIHN3aXRjaCAoYykKKwkgICAgeworCQljYXNlICcoJzogaWYgKHJlZ19kb19leHRtYXRjaCAhPSBSRVhfU0VUKQorCQkJICAgICAgRU1TR19SRVRfTlVMTChfKCJFNjY6IFxceiggbm90IGFsbG93ZWQgaGVyZSIpKTsKKwkJCSAgaWYgKG9uZV9leGFjdGx5KQorCQkJICAgICAgRU1TR19PTkVfUkVUX05VTEw7CisJCQkgIHJldCA9IHJlZyhSRUdfWlBBUkVOLCAmZmxhZ3MpOworCQkJICBpZiAocmV0ID09IE5VTEwpCisJCQkgICAgICByZXR1cm4gTlVMTDsKKwkJCSAgKmZsYWdwIHw9IGZsYWdzICYgKEhBU1dJRFRIfFNQU1RBUlR8SEFTTkx8SEFTTE9PS0JIKTsKKwkJCSAgcmVfaGFzX3ogPSBSRVhfU0VUOworCQkJICBicmVhazsKKworCQljYXNlICcxJzoKKwkJY2FzZSAnMic6CisJCWNhc2UgJzMnOgorCQljYXNlICc0JzoKKwkJY2FzZSAnNSc6CisJCWNhc2UgJzYnOgorCQljYXNlICc3JzoKKwkJY2FzZSAnOCc6CisJCWNhc2UgJzknOiBpZiAocmVnX2RvX2V4dG1hdGNoICE9IFJFWF9VU0UpCisJCQkgICAgICBFTVNHX1JFVF9OVUxMKF8oIkU2NzogXFx6MSBldCBhbC4gbm90IGFsbG93ZWQgaGVyZSIpKTsKKwkJCSAgcmV0ID0gcmVnbm9kZShaUkVGICsgYyAtICcwJyk7CisJCQkgIHJlX2hhc196ID0gUkVYX1VTRTsKKwkJCSAgYnJlYWs7CisKKwkJY2FzZSAncyc6IHJldCA9IHJlZ25vZGUoTU9QRU4gKyAwKTsKKwkJCSAgYnJlYWs7CisKKwkJY2FzZSAnZSc6IHJldCA9IHJlZ25vZGUoTUNMT1NFICsgMCk7CisJCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6ICBFTVNHX1JFVF9OVUxMKF8oIkU2ODogSW52YWxpZCBjaGFyYWN0ZXIgYWZ0ZXIgXFx6IikpOworCSAgICB9CisJfQorCWJyZWFrOworI2VuZGlmCisKKyAgICAgIGNhc2UgTWFnaWMoJyUnKToKKwl7CisJICAgIGMgPSBub19NYWdpYyhnZXRjaHIoKSk7CisJICAgIHN3aXRjaCAoYykKKwkgICAgeworCQkvKiAoKSB3aXRob3V0IGEgYmFjayByZWZlcmVuY2UgKi8KKwkJY2FzZSAnKCc6CisJCSAgICBpZiAob25lX2V4YWN0bHkpCisJCQlFTVNHX09ORV9SRVRfTlVMTDsKKwkJICAgIHJldCA9IHJlZyhSRUdfTlBBUkVOLCAmZmxhZ3MpOworCQkgICAgaWYgKHJldCA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCSAgICAqZmxhZ3AgfD0gZmxhZ3MgJiAoSEFTV0lEVEggfCBTUFNUQVJUIHwgSEFTTkwgfCBIQVNMT09LQkgpOworCQkgICAgYnJlYWs7CisKKwkJLyogQ2F0Y2ggXCVeIGFuZCBcJSQgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IGFwcGVhciBpbiB0aGUKKwkJICogcGF0dGVybiAtLSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGl0IG1ha2VzIHNlbnNlLiAqLworCQljYXNlICdeJzoKKwkJICAgIHJldCA9IHJlZ25vZGUoUkVfQk9GKTsKKwkJICAgIGJyZWFrOworCisJCWNhc2UgJyQnOgorCQkgICAgcmV0ID0gcmVnbm9kZShSRV9FT0YpOworCQkgICAgYnJlYWs7CisKKwkJY2FzZSAnIyc6CisJCSAgICByZXQgPSByZWdub2RlKENVUlNPUik7CisJCSAgICBicmVhazsKKworCQkvKiBcJVthYmNdOiBFbWl0IGFzIGEgbGlzdCBvZiBicmFuY2hlcywgYWxsIGVuZGluZyBhdCB0aGUgbGFzdAorCQkgKiBicmFuY2ggd2hpY2ggbWF0Y2hlcyBub3RoaW5nLiAqLworCQljYXNlICdbJzoKKwkJCSAgaWYgKG9uZV9leGFjdGx5KQkvKiBkb2Vzbid0IG5lc3QgKi8KKwkJCSAgICAgIEVNU0dfT05FX1JFVF9OVUxMOworCQkJICB7CisJCQkgICAgICBjaGFyX3UJKmxhc3RicmFuY2g7CisJCQkgICAgICBjaGFyX3UJKmxhc3Rub2RlID0gTlVMTDsKKwkJCSAgICAgIGNoYXJfdQkqYnI7CisKKwkJCSAgICAgIHJldCA9IE5VTEw7CisJCQkgICAgICB3aGlsZSAoKGMgPSBnZXRjaHIoKSkgIT0gJ10nKQorCQkJICAgICAgeworCQkJCSAgaWYgKGMgPT0gTlVMKQorCQkJCSAgICAgIEVNU0dfTV9SRVRfTlVMTChfKCJFNjk6IE1pc3NpbmcgXSBhZnRlciAlcyUlWyIpLAorCQkJCQkJICAgICAgcmVnX21hZ2ljID09IE1BR0lDX0FMTCk7CisJCQkJICBiciA9IHJlZ25vZGUoQlJBTkNIKTsKKwkJCQkgIGlmIChyZXQgPT0gTlVMTCkKKwkJCQkgICAgICByZXQgPSBicjsKKwkJCQkgIGVsc2UKKwkJCQkgICAgICByZWd0YWlsKGxhc3Rub2RlLCBicik7CisKKwkJCQkgIHVuZ2V0Y2hyKCk7CisJCQkJICBvbmVfZXhhY3RseSA9IFRSVUU7CisJCQkJICBsYXN0bm9kZSA9IHJlZ2F0b20oZmxhZ3ApOworCQkJCSAgb25lX2V4YWN0bHkgPSBGQUxTRTsKKwkJCQkgIGlmIChsYXN0bm9kZSA9PSBOVUxMKQorCQkJCSAgICAgIHJldHVybiBOVUxMOworCQkJICAgICAgfQorCQkJICAgICAgaWYgKHJldCA9PSBOVUxMKQorCQkJCSAgRU1TR19NX1JFVF9OVUxMKF8oIkU3MDogRW1wdHkgJXMlJVtdIiksCisJCQkJCQkgICAgICByZWdfbWFnaWMgPT0gTUFHSUNfQUxMKTsKKwkJCSAgICAgIGxhc3RicmFuY2ggPSByZWdub2RlKEJSQU5DSCk7CisJCQkgICAgICBiciA9IHJlZ25vZGUoTk9USElORyk7CisJCQkgICAgICBpZiAocmV0ICE9IEpVU1RfQ0FMQ19TSVpFKQorCQkJICAgICAgeworCQkJCSAgcmVndGFpbChsYXN0bm9kZSwgYnIpOworCQkJCSAgcmVndGFpbChsYXN0YnJhbmNoLCBicik7CisJCQkJICAvKiBjb25uZWN0IGFsbCBicmFuY2hlcyB0byB0aGUgTk9USElORworCQkJCSAgICogYnJhbmNoIGF0IHRoZSBlbmQgKi8KKwkJCQkgIGZvciAoYnIgPSByZXQ7IGJyICE9IGxhc3Rub2RlOyApCisJCQkJICB7CisJCQkJICAgICAgaWYgKE9QKGJyKSA9PSBCUkFOQ0gpCisJCQkJICAgICAgeworCQkJCQkgIHJlZ3RhaWwoYnIsIGxhc3RicmFuY2gpOworCQkJCQkgIGJyID0gT1BFUkFORChicik7CisJCQkJICAgICAgfQorCQkJCSAgICAgIGVsc2UKKwkJCQkJICBiciA9IHJlZ25leHQoYnIpOworCQkJCSAgfQorCQkJICAgICAgfQorCQkJICAgICAgKmZsYWdwICY9IH5IQVNXSURUSDsKKwkJCSAgICAgIGJyZWFrOworCQkJICB9CisKKwkJZGVmYXVsdDoKKwkJCSAgaWYgKFZJTV9JU0RJR0lUKGMpIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nKQorCQkJICB7CisJCQkgICAgICBsb25nX3UJbiA9IDA7CisJCQkgICAgICBpbnQJY21wOworCisJCQkgICAgICBjbXAgPSBjOworCQkJICAgICAgaWYgKGNtcCA9PSAnPCcgfHwgY21wID09ICc+JykKKwkJCQkgIGMgPSBnZXRjaHIoKTsKKwkJCSAgICAgIHdoaWxlIChWSU1fSVNESUdJVChjKSkKKwkJCSAgICAgIHsKKwkJCQkgIG4gPSBuICogMTAgKyAoYyAtICcwJyk7CisJCQkJICBjID0gZ2V0Y2hyKCk7CisJCQkgICAgICB9CisJCQkgICAgICBpZiAoYyA9PSAnbCcgfHwgYyA9PSAnYycgfHwgYyA9PSAndicpCisJCQkgICAgICB7CisJCQkJICBpZiAoYyA9PSAnbCcpCisJCQkJICAgICAgcmV0ID0gcmVnbm9kZShSRV9MTlVNKTsKKwkJCQkgIGVsc2UgaWYgKGMgPT0gJ2MnKQorCQkJCSAgICAgIHJldCA9IHJlZ25vZGUoUkVfQ09MKTsKKwkJCQkgIGVsc2UKKwkJCQkgICAgICByZXQgPSByZWdub2RlKFJFX1ZDT0wpOworCQkJCSAgaWYgKHJldCA9PSBKVVNUX0NBTENfU0laRSkKKwkJCQkgICAgICByZWdzaXplICs9IDU7CisJCQkJICBlbHNlCisJCQkJICB7CisJCQkJICAgICAgLyogcHV0IHRoZSBudW1iZXIgYW5kIHRoZSBvcHRpb25hbAorCQkJCSAgICAgICAqIGNvbXBhcmF0b3IgYWZ0ZXIgdGhlIG9wY29kZSAqLworCQkJCSAgICAgIHJlZ2NvZGUgPSByZV9wdXRfbG9uZyhyZWdjb2RlLCBuKTsKKwkJCQkgICAgICAqcmVnY29kZSsrID0gY21wOworCQkJCSAgfQorCQkJCSAgYnJlYWs7CisJCQkgICAgICB9CisJCQkgIH0KKworCQkJICBFTVNHX01fUkVUX05VTEwoXygiRTcxOiBJbnZhbGlkIGNoYXJhY3RlciBhZnRlciAlcyUlIiksCisJCQkJCQkgICAgICByZWdfbWFnaWMgPT0gTUFHSUNfQUxMKTsKKwkgICAgfQorCX0KKwlicmVhazsKKworICAgICAgY2FzZSBNYWdpYygnWycpOgorY29sbGVjdGlvbjoKKwl7CisJICAgIGNoYXJfdQkqbHA7CisKKwkgICAgLyoKKwkgICAgICogSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgJ10nLCB3ZSBhc3N1bWUgdGhlICdbJyBpcyBhIG5vcm1hbAorCSAgICAgKiBjaGFyYWN0ZXIuICBUaGlzIG1ha2VzICdpbmNzZWFyY2gnIGFuZCAiOmhlbHAgWyIgd29yay4KKwkgICAgICovCisJICAgIGxwID0gc2tpcF9hbnlvZihyZWdwYXJzZSk7CisJICAgIGlmICgqbHAgPT0gJ10nKQkvKiB0aGVyZSBpcyBhIG1hdGNoaW5nICddJyAqLworCSAgICB7CisJCWludAlzdGFydGMgPSAtMTsJLyogPiAwIHdoZW4gbmV4dCAnLScgaXMgYSByYW5nZSAqLworCQlpbnQJZW5kYzsKKworCQkvKgorCQkgKiBJbiBhIGNoYXJhY3RlciBjbGFzcywgZGlmZmVyZW50IHBhcnNpbmcgcnVsZXMgYXBwbHkuCisJCSAqIE5vdCBldmVuIFwgaXMgc3BlY2lhbCBhbnltb3JlLCBub3RoaW5nIGlzLgorCQkgKi8KKwkJaWYgKCpyZWdwYXJzZSA9PSAnXicpCSAgICAvKiBDb21wbGVtZW50IG9mIHJhbmdlLiAqLworCQl7CisJCSAgICByZXQgPSByZWdub2RlKEFOWUJVVCArIGV4dHJhKTsKKwkJICAgIHJlZ3BhcnNlKys7CisJCX0KKwkJZWxzZQorCQkgICAgcmV0ID0gcmVnbm9kZShBTllPRiArIGV4dHJhKTsKKworCQkvKiBBdCB0aGUgc3RhcnQgJ10nIGFuZCAnLScgbWVhbiB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIuICovCisJCWlmICgqcmVncGFyc2UgPT0gJ10nIHx8ICpyZWdwYXJzZSA9PSAnLScpCisJCSAgICByZWdjKCpyZWdwYXJzZSsrKTsKKworCQl3aGlsZSAoKnJlZ3BhcnNlICE9IE5VTCAmJiAqcmVncGFyc2UgIT0gJ10nKQorCQl7CisJCSAgICBpZiAoKnJlZ3BhcnNlID09ICctJykKKwkJICAgIHsKKwkJCSsrcmVncGFyc2U7CisJCQkvKiBUaGUgJy0nIGlzIG5vdCB1c2VkIGZvciBhIHJhbmdlIGF0IHRoZSBlbmQgYW5kCisJCQkgKiBhZnRlciBvciBiZWZvcmUgYSAnXG4nLiAqLworCQkJaWYgKCpyZWdwYXJzZSA9PSAnXScgfHwgKnJlZ3BhcnNlID09IE5VTAorCQkJCXx8IHN0YXJ0YyA9PSAtMQorCQkJCXx8IChyZWdwYXJzZVswXSA9PSAnXFwnICYmIHJlZ3BhcnNlWzFdID09ICduJykpCisJCQl7CisJCQkgICAgcmVnYygnLScpOworCQkJICAgIHN0YXJ0YyA9ICctJzsJLyogWy0teF0gaXMgYSByYW5nZSAqLworCQkJfQorCQkJZWxzZQorCQkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJCWVuZGMgPSBtYl9wdHIyY2hhcl9hZHYoJnJlZ3BhcnNlKTsKKwkJCSAgICBlbHNlCisjZW5kaWYKKwkJCQllbmRjID0gKnJlZ3BhcnNlKys7CisJCQkgICAgaWYgKHN0YXJ0YyA+IGVuZGMpCisJCQkJRU1TR19SRVRfTlVMTChfKGVfaW52cmFuZ2UpKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkgICAgaWYgKGhhc19tYnl0ZSAmJiAoKCptYl9jaGFyMmxlbikoc3RhcnRjKSA+IDEKKwkJCQkJCSB8fCAoKm1iX2NoYXIybGVuKShlbmRjKSA+IDEpKQorCQkJICAgIHsKKwkJCQkvKiBMaW1pdCB0byBhIHJhbmdlIG9mIDI1NiBjaGFycyAqLworCQkJCWlmIChlbmRjID4gc3RhcnRjICsgMjU2KQorCQkJCSAgICBFTVNHX1JFVF9OVUxMKF8oZV9pbnZyYW5nZSkpOworCQkJCXdoaWxlICgrK3N0YXJ0YyA8PSBlbmRjKQorCQkJCSAgICByZWdtYmMoc3RhcnRjKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorI2VuZGlmCisJCQkgICAgeworI2lmZGVmIEVCQ0RJQworCQkJCWludAlhbHBoYV9vbmx5ID0gRkFMU0U7CisKKwkJCQkvKiBmb3IgYWxwaGFiZXRpY2FsIHJhbmdlIHNraXAgdGhlIGdhcHMKKwkJCQkgKiAnaSctJ2onLCAncictJ3MnLCAnSSctJ0onIGFuZCAnUictJ1MnLiAgKi8KKwkJCQlpZiAoaXNhbHBoYShzdGFydGMpICYmIGlzYWxwaGEoZW5kYykpCisJCQkJICAgIGFscGhhX29ubHkgPSBUUlVFOworI2VuZGlmCisJCQkJd2hpbGUgKCsrc3RhcnRjIDw9IGVuZGMpCisjaWZkZWYgRUJDRElDCisJCQkJICAgIGlmICghYWxwaGFfb25seSB8fCBpc2FscGhhKHN0YXJ0YykpCisjZW5kaWYKKwkJCQkJcmVnYyhzdGFydGMpOworCQkJICAgIH0KKwkJCSAgICBzdGFydGMgPSAtMTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIC8qCisJCSAgICAgKiBPbmx5ICJcXSIsICJcXiIsICJcXSIgYW5kICJcXCIgYXJlIHNwZWNpYWwgaW4gVmkuICBWaW0KKwkJICAgICAqIGFjY2VwdHMgIlx0IiwgIlxlIiwgZXRjLiwgYnV0IG9ubHkgd2hlbiB0aGUgJ2wnIGZsYWcgaW4KKwkJICAgICAqICdjcG9wdGlvbnMnIGlzIG5vdCBpbmNsdWRlZC4KKwkJICAgICAqLworCQkgICAgZWxzZSBpZiAoKnJlZ3BhcnNlID09ICdcXCcKKwkJCSAgICAmJiAodmltX3N0cmNocihSRUdFWFBfSU5SQU5HRSwgcmVncGFyc2VbMV0pICE9IE5VTEwKKwkJCQl8fCAoIWNwb19saXQKKwkJCQkgICAgJiYgdmltX3N0cmNocihSRUdFWFBfQUJCUiwKKwkJCQkJCSAgICAgICByZWdwYXJzZVsxXSkgIT0gTlVMTCkpKQorCQkgICAgeworCQkJcmVncGFyc2UrKzsKKwkJCWlmICgqcmVncGFyc2UgPT0gJ24nKQorCQkJeworCQkJICAgIC8qICdcbicgaW4gcmFuZ2U6IGFsc28gbWF0Y2ggTkwgKi8KKwkJCSAgICBpZiAocmV0ICE9IEpVU1RfQ0FMQ19TSVpFKQorCQkJICAgIHsKKwkJCQlpZiAoKnJldCA9PSBBTllCVVQpCisJCQkJICAgICpyZXQgPSBBTllCVVQgKyBBRERfTkw7CisJCQkJZWxzZSBpZiAoKnJldCA9PSBBTllPRikKKwkJCQkgICAgKnJldCA9IEFOWU9GICsgQUREX05MOworCQkJCS8qIGVsc2U6IG11c3QgaGF2ZSBoYWQgYSBcbiBhbHJlYWR5ICovCisJCQkgICAgfQorCQkJICAgICpmbGFncCB8PSBIQVNOTDsKKwkJCSAgICByZWdwYXJzZSsrOworCQkJICAgIHN0YXJ0YyA9IC0xOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIHN0YXJ0YyA9IGJhY2tzbGFzaF90cmFucygqcmVncGFyc2UrKyk7CisJCQkgICAgcmVnYyhzdGFydGMpOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZSBpZiAoKnJlZ3BhcnNlID09ICdbJykKKwkJICAgIHsKKwkJCWludCBjX2NsYXNzOworCQkJaW50IGN1OworCisJCQljX2NsYXNzID0gc2tpcF9jbGFzc19uYW1lKCZyZWdwYXJzZSk7CisJCQlzdGFydGMgPSAtMTsKKwkJCS8qIENoYXJhY3RlcnMgYXNzdW1lZCB0byBiZSA4IGJpdHMhICovCisJCQlzd2l0Y2ggKGNfY2xhc3MpCisJCQl7CisJCQkgICAgY2FzZSBDTEFTU19OT05FOgorCQkJCS8qIGxpdGVyYWwgJ1snLCBhbGxvdyBbWy14XSBhcyBhIHJhbmdlICovCisJCQkJc3RhcnRjID0gKnJlZ3BhcnNlKys7CisJCQkJcmVnYyhzdGFydGMpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgQ0xBU1NfQUxOVU06CisJCQkJZm9yIChjdSA9IDE7IGN1IDw9IDI1NTsgY3UrKykKKwkJCQkgICAgaWYgKGlzYWxudW0oY3UpKQorCQkJCQlyZWdjKGN1KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX0FMUEhBOgorCQkJCWZvciAoY3UgPSAxOyBjdSA8PSAyNTU7IGN1KyspCisJCQkJICAgIGlmIChpc2FscGhhKGN1KSkKKwkJCQkJcmVnYyhjdSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBDTEFTU19CTEFOSzoKKwkJCQlyZWdjKCcgJyk7CisJCQkJcmVnYygnXHQnKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX0NOVFJMOgorCQkJCWZvciAoY3UgPSAxOyBjdSA8PSAyNTU7IGN1KyspCisJCQkJICAgIGlmIChpc2NudHJsKGN1KSkKKwkJCQkJcmVnYyhjdSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBDTEFTU19ESUdJVDoKKwkJCQlmb3IgKGN1ID0gMTsgY3UgPD0gMjU1OyBjdSsrKQorCQkJCSAgICBpZiAoVklNX0lTRElHSVQoY3UpKQorCQkJCQlyZWdjKGN1KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX0dSQVBIOgorCQkJCWZvciAoY3UgPSAxOyBjdSA8PSAyNTU7IGN1KyspCisJCQkJICAgIGlmIChpc2dyYXBoKGN1KSkKKwkJCQkJcmVnYyhjdSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBDTEFTU19MT1dFUjoKKwkJCQlmb3IgKGN1ID0gMTsgY3UgPD0gMjU1OyBjdSsrKQorCQkJCSAgICBpZiAoaXNsb3dlcihjdSkpCisJCQkJCXJlZ2MoY3UpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgQ0xBU1NfUFJJTlQ6CisJCQkJZm9yIChjdSA9IDE7IGN1IDw9IDI1NTsgY3UrKykKKwkJCQkgICAgaWYgKHZpbV9pc3ByaW50YyhjdSkpCisJCQkJCXJlZ2MoY3UpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgQ0xBU1NfUFVOQ1Q6CisJCQkJZm9yIChjdSA9IDE7IGN1IDw9IDI1NTsgY3UrKykKKwkJCQkgICAgaWYgKGlzcHVuY3QoY3UpKQorCQkJCQlyZWdjKGN1KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX1NQQUNFOgorCQkJCWZvciAoY3UgPSA5OyBjdSA8PSAxMzsgY3UrKykKKwkJCQkgICAgcmVnYyhjdSk7CisJCQkJcmVnYygnICcpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgQ0xBU1NfVVBQRVI6CisJCQkJZm9yIChjdSA9IDE7IGN1IDw9IDI1NTsgY3UrKykKKwkJCQkgICAgaWYgKGlzdXBwZXIoY3UpKQorCQkJCQlyZWdjKGN1KTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX1hESUdJVDoKKwkJCQlmb3IgKGN1ID0gMTsgY3UgPD0gMjU1OyBjdSsrKQorCQkJCSAgICBpZiAodmltX2lzeGRpZ2l0KGN1KSkKKwkJCQkJcmVnYyhjdSk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBDTEFTU19UQUI6CisJCQkJcmVnYygnXHQnKTsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIENMQVNTX1JFVFVSTjoKKwkJCQlyZWdjKCdccicpOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgQ0xBU1NfQkFDS1NQQUNFOgorCQkJCXJlZ2MoJ1xiJyk7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSBDTEFTU19FU0NBUEU6CisJCQkJcmVnYygnXDAzMycpOworCQkJCWJyZWFrOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCWlmIChoYXNfbWJ5dGUpCisJCQl7CisJCQkgICAgaW50CWxlbjsKKworCQkJICAgIC8qIHByb2R1Y2UgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLCBpbmNsdWRpbmcgYW55CisJCQkgICAgICogZm9sbG93aW5nIGNvbXBvc2luZyBjaGFyYWN0ZXJzICovCisJCQkgICAgc3RhcnRjID0gbWJfcHRyMmNoYXIocmVncGFyc2UpOworCQkJICAgIGxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocmVncGFyc2UpOworCQkJICAgIGlmIChlbmNfdXRmOCAmJiB1dGZfY2hhcjJsZW4oc3RhcnRjKSAhPSBsZW4pCisJCQkJc3RhcnRjID0gLTE7CS8qIGNvbXBvc2luZyBjaGFycyAqLworCQkJICAgIHdoaWxlICgtLWxlbiA+PSAwKQorCQkJCXJlZ2MoKnJlZ3BhcnNlKyspOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisJCQl7CisJCQkgICAgc3RhcnRjID0gKnJlZ3BhcnNlKys7CisJCQkgICAgcmVnYyhzdGFydGMpOworCQkJfQorCQkgICAgfQorCQl9CisJCXJlZ2MoTlVMKTsKKwkJcHJldmNocl9sZW4gPSAxOwkvKiBsYXN0IGNoYXIgd2FzIHRoZSAnXScgKi8KKwkJaWYgKCpyZWdwYXJzZSAhPSAnXScpCisJCSAgICBFTVNHX1JFVF9OVUxMKF8oZV90b29tc2JyYSkpOwkvKiBDYW5ub3QgaGFwcGVuPyAqLworCQlza2lwY2hyKCk7CSAgICAvKiBsZXQncyBiZSBmcmllbmRzIHdpdGggdGhlIGxleGVyIGFnYWluICovCisJCSpmbGFncCB8PSBIQVNXSURUSCB8IFNJTVBMRTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJLyogRkFMTFRIUk9VR0ggKi8KKworICAgICAgZGVmYXVsdDoKKwl7CisJICAgIGludAkJbGVuOworCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAvKiBBIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGlzIGhhbmRsZWQgYXMgYSBzZXBhcmF0ZSBhdG9tIGlmIGl0J3MKKwkgICAgICogYmVmb3JlIGEgbXVsdGkuICovCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKCptYl9jaGFyMmxlbikoYykgPiAxCisJCQkJICAgICAmJiByZV9tdWx0aV90eXBlKHBlZWtjaHIoKSkgIT0gTk9UX01VTFRJKQorCSAgICB7CisJCXJldCA9IHJlZ25vZGUoTVVMVElCWVRFQ09ERSk7CisJCXJlZ21iYyhjKTsKKwkJKmZsYWdwIHw9IEhBU1dJRFRIIHwgU0lNUExFOworCQlicmVhazsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgcmV0ID0gcmVnbm9kZShFWEFDVExZKTsKKworCSAgICAvKgorCSAgICAgKiBBcHBlbmQgY2hhcmFjdGVycyBhcyBsb25nIGFzOgorCSAgICAgKiAtIHRoZXJlIGlzIG5vIGZvbGxvd2luZyBtdWx0aSwgd2UgdGhlbiBuZWVkIHRoZSBjaGFyYWN0ZXIgaW4KKwkgICAgICogICBmcm9udCBvZiBpdCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIgb3BlcmFuZAorCSAgICAgKiAtIG5vdCBydW5uaW5nIGludG8gYSBNYWdpYyBjaGFyYWN0ZXIKKwkgICAgICogLSAib25lX2V4YWN0bHkiIGlzIG5vdCBzZXQKKwkgICAgICogQnV0IGFsd2F5cyBlbWl0IGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIuICBNaWdodCBiZSBhIE11bHRpLAorCSAgICAgKiBlLmcuLCBhICJbIiB3aXRob3V0IG1hdGNoaW5nICJdIi4KKwkgICAgICovCisJICAgIGZvciAobGVuID0gMDsgYyAhPSBOVUwgJiYgKGxlbiA9PSAwCisJCQl8fCAocmVfbXVsdGlfdHlwZShwZWVrY2hyKCkpID09IE5PVF9NVUxUSQorCQkJICAgICYmICFvbmVfZXhhY3RseQorCQkJICAgICYmICFpc19NYWdpYyhjKSkpOyArK2xlbikKKwkgICAgeworCQljID0gbm9fTWFnaWMoYyk7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQl7CisJCSAgICByZWdtYmMoYyk7CisJCSAgICBpZiAoZW5jX3V0ZjgpCisJCSAgICB7CisJCQlpbnQJb2ZmOworCQkJaW50CWw7CisKKwkJCS8qIE5lZWQgdG8gZ2V0IGNvbXBvc2luZyBjaGFyYWN0ZXIgdG9vLCBkaXJlY3RseQorCQkJICogYWNjZXNzIHJlZ3BhcnNlIGZvciB0aGF0LCBiZWNhdXNlIHNraXBjaHIoKSBza2lwcworCQkJICogb3ZlciBjb21wb3NpbmcgY2hhcnMuICovCisJCQl1bmdldGNocigpOworCQkJaWYgKCpyZWdwYXJzZSA9PSAnXFwnICYmIHJlZ3BhcnNlWzFdICE9IE5VTCkKKwkJCSAgICBvZmYgPSAxOworCQkJZWxzZQorCQkJICAgIG9mZiA9IDA7CisJCQlmb3IgKDs7KQorCQkJeworCQkJICAgIGwgPSB1dGZfcHRyMmxlbl9jaGVjayhyZWdwYXJzZSArIG9mZik7CisJCQkgICAgaWYgKCFVVEZfQ09NUE9TSU5HTElLRShyZWdwYXJzZSArIG9mZiwKKwkJCQkJCQkgIHJlZ3BhcnNlICsgb2ZmICsgbCkpCisJCQkJYnJlYWs7CisJCQkgICAgb2ZmICs9IGw7CisJCQkgICAgcmVnbWJjKHV0Zl9wdHIyY2hhcihyZWdwYXJzZSArIG9mZikpOworCQkJfQorCQkJc2tpcGNocigpOworCQkgICAgfQorCQl9CisJCWVsc2UKKyNlbmRpZgorCQkgICAgcmVnYyhjKTsKKwkJYyA9IGdldGNocigpOworCSAgICB9CisJICAgIHVuZ2V0Y2hyKCk7CisKKwkgICAgcmVnYyhOVUwpOworCSAgICAqZmxhZ3AgfD0gSEFTV0lEVEg7CisJICAgIGlmIChsZW4gPT0gMSkKKwkJKmZsYWdwIHw9IFNJTVBMRTsKKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGVtaXQgYSBub2RlCisgKiBSZXR1cm4gcG9pbnRlciB0byBnZW5lcmF0ZWQgY29kZS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcmVnbm9kZShvcCkKKyAgICBpbnQJCW9wOworeworICAgIGNoYXJfdSAgKnJldDsKKworICAgIHJldCA9IHJlZ2NvZGU7CisgICAgaWYgKHJldCA9PSBKVVNUX0NBTENfU0laRSkKKwlyZWdzaXplICs9IDM7CisgICAgZWxzZQorICAgIHsKKwkqcmVnY29kZSsrID0gb3A7CisJKnJlZ2NvZGUrKyA9IE5VTDsJCS8qIE51bGwgIm5leHQiIHBvaW50ZXIuICovCisJKnJlZ2NvZGUrKyA9IE5VTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEVtaXQgKGlmIGFwcHJvcHJpYXRlKSBhIGJ5dGUgb2YgY29kZQorICovCisgICAgc3RhdGljIHZvaWQKK3JlZ2MoYikKKyAgICBpbnQJCWI7Cit7CisgICAgaWYgKHJlZ2NvZGUgPT0gSlVTVF9DQUxDX1NJWkUpCisJcmVnc2l6ZSsrOworICAgIGVsc2UKKwkqcmVnY29kZSsrID0gYjsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qCisgKiBFbWl0IChpZiBhcHByb3ByaWF0ZSkgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBvZiBjb2RlCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnbWJjKGMpCisgICAgaW50CQljOworeworICAgIGlmIChyZWdjb2RlID09IEpVU1RfQ0FMQ19TSVpFKQorCXJlZ3NpemUgKz0gKCptYl9jaGFyMmxlbikoYyk7CisgICAgZWxzZQorCXJlZ2NvZGUgKz0gKCptYl9jaGFyMmJ5dGVzKShjLCByZWdjb2RlKTsKK30KKyNlbmRpZgorCisvKgorICogcmVnaW5zZXJ0IC0gaW5zZXJ0IGFuIG9wZXJhdG9yIGluIGZyb250IG9mIGFscmVhZHktZW1pdHRlZCBvcGVyYW5kCisgKgorICogTWVhbnMgcmVsb2NhdGluZyB0aGUgb3BlcmFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZWdpbnNlcnQob3AsIG9wbmQpCisgICAgaW50CQlvcDsKKyAgICBjaGFyX3UgICAgICpvcG5kOworeworICAgIGNoYXJfdQkqc3JjOworICAgIGNoYXJfdQkqZHN0OworICAgIGNoYXJfdQkqcGxhY2U7CisKKyAgICBpZiAocmVnY29kZSA9PSBKVVNUX0NBTENfU0laRSkKKyAgICB7CisJcmVnc2l6ZSArPSAzOworCXJldHVybjsKKyAgICB9CisgICAgc3JjID0gcmVnY29kZTsKKyAgICByZWdjb2RlICs9IDM7CisgICAgZHN0ID0gcmVnY29kZTsKKyAgICB3aGlsZSAoc3JjID4gb3BuZCkKKwkqLS1kc3QgPSAqLS1zcmM7CisKKyAgICBwbGFjZSA9IG9wbmQ7CQkvKiBPcCBub2RlLCB3aGVyZSBvcGVyYW5kIHVzZWQgdG8gYmUuICovCisgICAgKnBsYWNlKysgPSBvcDsKKyAgICAqcGxhY2UrKyA9IE5VTDsKKyAgICAqcGxhY2UgPSBOVUw7Cit9CisKKy8qCisgKiByZWdpbnNlcnRfbGltaXRzIC0gaW5zZXJ0IGFuIG9wZXJhdG9yIGluIGZyb250IG9mIGFscmVhZHktZW1pdHRlZCBvcGVyYW5kLgorICogVGhlIG9wZXJhdG9yIGhhcyB0aGUgZ2l2ZW4gbGltaXQgdmFsdWVzIGFzIG9wZXJhbmRzLiAgQWxzbyBzZXQgbmV4dCBwb2ludGVyLgorICoKKyAqIE1lYW5zIHJlbG9jYXRpbmcgdGhlIG9wZXJhbmQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnaW5zZXJ0X2xpbWl0cyhvcCwgbWludmFsLCBtYXh2YWwsIG9wbmQpCisgICAgaW50CQlvcDsKKyAgICBsb25nCW1pbnZhbDsKKyAgICBsb25nCW1heHZhbDsKKyAgICBjaGFyX3UJKm9wbmQ7Cit7CisgICAgY2hhcl91CSpzcmM7CisgICAgY2hhcl91CSpkc3Q7CisgICAgY2hhcl91CSpwbGFjZTsKKworICAgIGlmIChyZWdjb2RlID09IEpVU1RfQ0FMQ19TSVpFKQorICAgIHsKKwlyZWdzaXplICs9IDExOworCXJldHVybjsKKyAgICB9CisgICAgc3JjID0gcmVnY29kZTsKKyAgICByZWdjb2RlICs9IDExOworICAgIGRzdCA9IHJlZ2NvZGU7CisgICAgd2hpbGUgKHNyYyA+IG9wbmQpCisJKi0tZHN0ID0gKi0tc3JjOworCisgICAgcGxhY2UgPSBvcG5kOwkJLyogT3Agbm9kZSwgd2hlcmUgb3BlcmFuZCB1c2VkIHRvIGJlLiAqLworICAgICpwbGFjZSsrID0gb3A7CisgICAgKnBsYWNlKysgPSBOVUw7CisgICAgKnBsYWNlKysgPSBOVUw7CisgICAgcGxhY2UgPSByZV9wdXRfbG9uZyhwbGFjZSwgKGxvbmdfdSltaW52YWwpOworICAgIHBsYWNlID0gcmVfcHV0X2xvbmcocGxhY2UsIChsb25nX3UpbWF4dmFsKTsKKyAgICByZWd0YWlsKG9wbmQsIHBsYWNlKTsKK30KKworLyoKKyAqIFdyaXRlIGEgbG9uZyBhcyBmb3VyIGJ5dGVzIGF0ICJwIiBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5leHQgY2hhci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorcmVfcHV0X2xvbmcocCwgdmFsKQorICAgIGNoYXJfdQkqcDsKKyAgICBsb25nX3UJdmFsOworeworICAgICpwKysgPSAoY2hhcl91KSAoKHZhbCA+PiAyNCkgJiAwMzc3KTsKKyAgICAqcCsrID0gKGNoYXJfdSkgKCh2YWwgPj4gMTYpICYgMDM3Nyk7CisgICAgKnArKyA9IChjaGFyX3UpICgodmFsID4+IDgpICYgMDM3Nyk7CisgICAgKnArKyA9IChjaGFyX3UpICh2YWwgJiAwMzc3KTsKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyAqIHJlZ3RhaWwgLSBzZXQgdGhlIG5leHQtcG9pbnRlciBhdCB0aGUgZW5kIG9mIGEgbm9kZSBjaGFpbgorICovCisgICAgc3RhdGljIHZvaWQKK3JlZ3RhaWwocCwgdmFsKQorICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnZhbDsKK3sKKyAgICBjaGFyX3UJKnNjYW47CisgICAgY2hhcl91CSp0ZW1wOworICAgIGludAkJb2Zmc2V0OworCisgICAgaWYgKHAgPT0gSlVTVF9DQUxDX1NJWkUpCisJcmV0dXJuOworCisgICAgLyogRmluZCBsYXN0IG5vZGUuICovCisgICAgc2NhbiA9IHA7CisgICAgZm9yICg7OykKKyAgICB7CisJdGVtcCA9IHJlZ25leHQoc2Nhbik7CisJaWYgKHRlbXAgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJc2NhbiA9IHRlbXA7CisgICAgfQorCisgICAgaWYgKE9QKHNjYW4pID09IEJBQ0spCisJb2Zmc2V0ID0gKGludCkoc2NhbiAtIHZhbCk7CisgICAgZWxzZQorCW9mZnNldCA9IChpbnQpKHZhbCAtIHNjYW4pOworICAgICooc2NhbiArIDEpID0gKGNoYXJfdSkgKCgodW5zaWduZWQpb2Zmc2V0ID4+IDgpICYgMDM3Nyk7CisgICAgKihzY2FuICsgMikgPSAoY2hhcl91KSAob2Zmc2V0ICYgMDM3Nyk7Cit9CisKKy8qCisgKiByZWdvcHRhaWwgLSByZWd0YWlsIG9uIGl0ZW0gYWZ0ZXIgYSBCUkFOQ0g7IG5vcCBpZiBub25lCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnb3B0YWlsKHAsIHZhbCkKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSp2YWw7Cit7CisgICAgLyogV2hlbiBvcCBpcyBuZWl0aGVyIEJSQU5DSCBub3IgQlJBQ0VfQ09NUExFWDAtOSwgaXQgaXMgIm9wZXJhbmRsZXNzIiAqLworICAgIGlmIChwID09IE5VTEwgfHwgcCA9PSBKVVNUX0NBTENfU0laRQorCSAgICB8fCAoT1AocCkgIT0gQlJBTkNICisJCSYmIChPUChwKSA8IEJSQUNFX0NPTVBMRVggfHwgT1AocCkgPiBCUkFDRV9DT01QTEVYICsgOSkpKQorCXJldHVybjsKKyAgICByZWd0YWlsKE9QRVJBTkQocCksIHZhbCk7Cit9CisKKy8qCisgKiBnZXRjaHIoKSAtIGdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgcGF0dGVybi4gV2Uga25vdyBhYm91dAorICogbWFnaWMgYW5kIHN1Y2gsIHNvIHRoZXJlZm9yZSB3ZSBuZWVkIGEgbGV4aWNhbCBhbmFseXplci4KKyAqLworCisvKiBzdGF0aWMgaW50CSAgICBjdXJjaHI7ICovCitzdGF0aWMgaW50CXByZXZwcmV2Y2hyOworc3RhdGljIGludAlwcmV2Y2hyOworc3RhdGljIGludAluZXh0Y2hyOyAgICAvKiB1c2VkIGZvciB1bmdldGNocigpICovCisvKgorICogTm90ZTogcHJldmNociBpcyBzb21ldGltZXMgLTEgd2hlbiB3ZSBhcmUgbm90IGF0IHRoZSBzdGFydCwKKyAqIGVnIGluIC9bIF5JXV4gdGhlIHBhdHRlcm4gd2FzIG5ldmVyIGZvdW5kIGV2ZW4gaWYgaXQgZXhpc3RlZCwgYmVjYXVzZSBeIHdhcworICogdGFrZW4gdG8gYmUgbWFnaWMgLS0gd2ViYgorICovCitzdGF0aWMgaW50CWF0X3N0YXJ0OwkvKiBUcnVlIHdoZW4gb24gdGhlIGZpcnN0IGNoYXJhY3RlciAqLworc3RhdGljIGludAlwcmV2X2F0X3N0YXJ0OyAgLyogVHJ1ZSB3aGVuIG9uIHRoZSBzZWNvbmQgY2hhcmFjdGVyICovCisKKyAgICBzdGF0aWMgdm9pZAoraW5pdGNocihzdHIpCisgICAgY2hhcl91ICpzdHI7Cit7CisgICAgcmVncGFyc2UgPSBzdHI7CisgICAgcHJldmNocl9sZW4gPSAwOworICAgIGN1cmNociA9IHByZXZwcmV2Y2hyID0gcHJldmNociA9IG5leHRjaHIgPSAtMTsKKyAgICBhdF9zdGFydCA9IFRSVUU7CisgICAgcHJldl9hdF9zdGFydCA9IEZBTFNFOworfQorCisgICAgc3RhdGljIGludAorcGVla2NocigpCit7CisgICAgaWYgKGN1cmNociA9PSAtMSkKKyAgICB7CisJc3dpdGNoIChjdXJjaHIgPSByZWdwYXJzZVswXSkKKwl7CisJY2FzZSAnLic6CisJY2FzZSAnWyc6CisJY2FzZSAnfic6CisJICAgIC8qIG1hZ2ljIHdoZW4gJ21hZ2ljJyBpcyBvbiAqLworCSAgICBpZiAocmVnX21hZ2ljID49IE1BR0lDX09OKQorCQljdXJjaHIgPSBNYWdpYyhjdXJjaHIpOworCSAgICBicmVhazsKKwljYXNlICcoJzoKKwljYXNlICcpJzoKKwljYXNlICd7JzoKKwljYXNlICclJzoKKwljYXNlICcrJzoKKwljYXNlICc9JzoKKwljYXNlICc/JzoKKwljYXNlICdAJzoKKwljYXNlICchJzoKKwljYXNlICcmJzoKKwljYXNlICd8JzoKKwljYXNlICc8JzoKKwljYXNlICc+JzoKKwljYXNlICcjJzoJLyogZnV0dXJlIGV4dC4gKi8KKwljYXNlICciJzoJLyogZnV0dXJlIGV4dC4gKi8KKwljYXNlICdcJyc6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnLCc6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnLSc6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnOic6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnOyc6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnYCc6CS8qIGZ1dHVyZSBleHQuICovCisJY2FzZSAnLyc6CS8qIENhbid0IGJlIHVzZWQgaW4gLyBjb21tYW5kICovCisJICAgIC8qIG1hZ2ljIG9ubHkgYWZ0ZXIgIlx2IiAqLworCSAgICBpZiAocmVnX21hZ2ljID09IE1BR0lDX0FMTCkKKwkJY3VyY2hyID0gTWFnaWMoY3VyY2hyKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnKic6CisJICAgIC8qICogaXMgbm90IG1hZ2ljIGFzIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3RlciwgZWcgIj8qcHRyIiBhbmQgd2hlbgorCSAgICAgKiBhZnRlciAnXicsIGVnICIvXipwdHIiICovCisJICAgIGlmIChyZWdfbWFnaWMgPj0gTUFHSUNfT04gJiYgIWF0X3N0YXJ0CisJCQkJICYmICEocHJldl9hdF9zdGFydCAmJiBwcmV2Y2hyID09IE1hZ2ljKCdeJykpKQorCQljdXJjaHIgPSBNYWdpYygnKicpOworCSAgICBicmVhazsKKwljYXNlICdeJzoKKwkgICAgLyogJ14nIGlzIG9ubHkgbWFnaWMgYXMgdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyIGFuZCBpZiBpdCdzIGFmdGVyCisJICAgICAqICJcKCIsICJcfCIsICJcJicgb3IgIlxuIiAqLworCSAgICBpZiAocmVnX21hZ2ljID49IE1BR0lDX09GRgorCQkgICAgJiYgKGF0X3N0YXJ0CisJCQl8fCByZWdfbWFnaWMgPT0gTUFHSUNfQUxMCisJCQl8fCBwcmV2Y2hyID09IE1hZ2ljKCcoJykKKwkJCXx8IHByZXZjaHIgPT0gTWFnaWMoJ3wnKQorCQkJfHwgcHJldmNociA9PSBNYWdpYygnJicpCisJCQl8fCBwcmV2Y2hyID09IE1hZ2ljKCduJykKKwkJCXx8IChub19NYWdpYyhwcmV2Y2hyKSA9PSAnKCcKKwkJCSAgICAmJiBwcmV2cHJldmNociA9PSBNYWdpYygnJScpKSkpCisJICAgIHsKKwkJY3VyY2hyID0gTWFnaWMoJ14nKTsKKwkJYXRfc3RhcnQgPSBUUlVFOworCQlwcmV2X2F0X3N0YXJ0ID0gRkFMU0U7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAnJCc6CisJICAgIC8qICckJyBpcyBvbmx5IG1hZ2ljIGFzIHRoZSB2ZXJ5IGxhc3QgY2hhciBhbmQgaWYgaXQncyBpbiBmcm9udCBvZgorCSAgICAgKiBlaXRoZXIgIlx8IiwgIlwpIiwgIlwmIiwgb3IgIlxuIiAqLworCSAgICBpZiAocmVnX21hZ2ljID49IE1BR0lDX09GRikKKwkgICAgeworCQljaGFyX3UgKnAgPSByZWdwYXJzZSArIDE7CisKKwkJLyogaWdub3JlIFxjIFxDIFxtIGFuZCBcTSBhZnRlciAnJCcgKi8KKwkJd2hpbGUgKHBbMF0gPT0gJ1xcJyAmJiAocFsxXSA9PSAnYycgfHwgcFsxXSA9PSAnQycKKwkJCQl8fCBwWzFdID09ICdtJyB8fCBwWzFdID09ICdNJyB8fCBwWzFdID09ICdaJykpCisJCSAgICBwICs9IDI7CisJCWlmIChwWzBdID09IE5VTAorCQkJfHwgKHBbMF0gPT0gJ1xcJworCQkJICAgICYmIChwWzFdID09ICd8JyB8fCBwWzFdID09ICcmJyB8fCBwWzFdID09ICcpJworCQkJCXx8IHBbMV0gPT0gJ24nKSkKKwkJCXx8IHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpCisJCSAgICBjdXJjaHIgPSBNYWdpYygnJCcpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJ1xcJzoKKwkgICAgeworCQlpbnQgYyA9IHJlZ3BhcnNlWzFdOworCisJCWlmIChjID09IE5VTCkKKwkJICAgIGN1cmNociA9ICdcXCc7CS8qIHRyYWlsaW5nICdcJyAqLworCQllbHNlIGlmICgKKyNpZmRlZiBFQkNESUMKKwkJCXZpbV9zdHJjaHIoTUVUQSwgYykKKyNlbHNlCisJCQljIDw9ICd+JyAmJiBNRVRBX2ZsYWdzW2NdCisjZW5kaWYKKwkJCSkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIE1FVEEgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IG1heSBiZSBtYWdpYyBzb21ldGltZXMsCisJCSAgICAgKiBleGNlcHQgXiBhbmQgJCAoIlxeIiBhbmQgIlwkIiBhcmUgb25seSBtYWdpYyBhZnRlcgorCQkgICAgICogIlx2IikuICBXZSBub3cgZmV0Y2ggdGhlIG5leHQgY2hhcmFjdGVyIGFuZCB0b2dnbGUgaXRzCisJCSAgICAgKiBtYWdpY25lc3MuICBUaGVyZWZvcmUsIFwgaXMgc28gbWV0YS1tYWdpYyB0aGF0IGl0IGlzCisJCSAgICAgKiBub3QgaW4gTUVUQS4KKwkJICAgICAqLworCQkgICAgY3VyY2hyID0gLTE7CisJCSAgICBwcmV2X2F0X3N0YXJ0ID0gYXRfc3RhcnQ7CisJCSAgICBhdF9zdGFydCA9IEZBTFNFOwkvKiBiZSBhYmxlIHRvIHNheSAiL1wqcHRyIiAqLworCQkgICAgKytyZWdwYXJzZTsKKwkJICAgIHBlZWtjaHIoKTsKKwkJICAgIC0tcmVncGFyc2U7CisJCSAgICBjdXJjaHIgPSB0b2dnbGVfTWFnaWMoY3VyY2hyKTsKKwkJfQorCQllbHNlIGlmICh2aW1fc3RyY2hyKFJFR0VYUF9BQkJSLCBjKSkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIEhhbmRsZSBhYmJyZXZpYXRpb25zLCBsaWtlICJcdCIgZm9yIFRBQiAtLSB3ZWJiCisJCSAgICAgKi8KKwkJICAgIGN1cmNociA9IGJhY2tzbGFzaF90cmFucyhjKTsKKwkJfQorCQllbHNlIGlmIChyZWdfbWFnaWMgPT0gTUFHSUNfTk9ORSAmJiAoYyA9PSAnJCcgfHwgYyA9PSAnXicpKQorCQkgICAgY3VyY2hyID0gdG9nZ2xlX01hZ2ljKGMpOworCQllbHNlCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBOZXh0IGNoYXJhY3RlciBjYW4gbmV2ZXIgYmUgKG1hZGUpIG1hZ2ljPworCQkgICAgICogVGhlbiBiYWNrc2xhc2hpbmcgaXQgd29uJ3QgZG8gYW55dGhpbmcuCisJCSAgICAgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJY3VyY2hyID0gKCptYl9wdHIyY2hhcikocmVncGFyc2UgKyAxKTsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJY3VyY2hyID0gYzsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorCWRlZmF1bHQ6CisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWN1cmNociA9ICgqbWJfcHRyMmNoYXIpKHJlZ3BhcnNlKTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICByZXR1cm4gY3VyY2hyOworfQorCisvKgorICogRWF0IG9uZSBsZXhlZCBjaGFyYWN0ZXIuICBEbyB0aGlzIGluIGEgd2F5IHRoYXQgd2UgY2FuIHVuZG8gaXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc2tpcGNocigpCit7CisgICAgLyogcGVla2NocigpIGVhdHMgYSBiYWNrc2xhc2gsIGRvIHRoZSBzYW1lIGhlcmUgKi8KKyAgICBpZiAoKnJlZ3BhcnNlID09ICdcXCcpCisJcHJldmNocl9sZW4gPSAxOworICAgIGVsc2UKKwlwcmV2Y2hyX2xlbiA9IDA7CisgICAgaWYgKHJlZ3BhcnNlW3ByZXZjaHJfbGVuXSAhPSBOVUwpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBwcmV2Y2hyX2xlbiArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHJlZ3BhcnNlICsgcHJldmNocl9sZW4pOworCWVsc2UKKyNlbmRpZgorCSAgICArK3ByZXZjaHJfbGVuOworICAgIH0KKyAgICByZWdwYXJzZSArPSBwcmV2Y2hyX2xlbjsKKyAgICBwcmV2X2F0X3N0YXJ0ID0gYXRfc3RhcnQ7CisgICAgYXRfc3RhcnQgPSBGQUxTRTsKKyAgICBwcmV2cHJldmNociA9IHByZXZjaHI7CisgICAgcHJldmNociA9IGN1cmNocjsKKyAgICBjdXJjaHIgPSBuZXh0Y2hyOwkgICAgLyogdXNlIHByZXZpb3VzbHkgdW5nZXQgY2hhciwgb3IgLTEgKi8KKyAgICBuZXh0Y2hyID0gLTE7Cit9CisKKy8qCisgKiBTa2lwIGEgY2hhcmFjdGVyIHdoaWxlIGtlZXBpbmcgdGhlIHZhbHVlIG9mIHByZXZfYXRfc3RhcnQgZm9yIGF0X3N0YXJ0LgorICogcHJldmNociBhbmQgcHJldnByZXZjaHIgYXJlIGFsc28ga2VwdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitza2lwY2hyX2tlZXBzdGFydCgpCit7CisgICAgaW50IGFzID0gcHJldl9hdF9zdGFydDsKKyAgICBpbnQgcHIgPSBwcmV2Y2hyOworICAgIGludCBwcnByID0gcHJldnByZXZjaHI7CisKKyAgICBza2lwY2hyKCk7CisgICAgYXRfc3RhcnQgPSBhczsKKyAgICBwcmV2Y2hyID0gcHI7CisgICAgcHJldnByZXZjaHIgPSBwcnByOworfQorCisgICAgc3RhdGljIGludAorZ2V0Y2hyKCkKK3sKKyAgICBpbnQgY2hyID0gcGVla2NocigpOworCisgICAgc2tpcGNocigpOworICAgIHJldHVybiBjaHI7Cit9CisKKy8qCisgKiBwdXQgY2hhcmFjdGVyIGJhY2suICBXb3JrcyBvbmx5IG9uY2UhCisgKi8KKyAgICBzdGF0aWMgdm9pZAordW5nZXRjaHIoKQoreworICAgIG5leHRjaHIgPSBjdXJjaHI7CisgICAgY3VyY2hyID0gcHJldmNocjsKKyAgICBwcmV2Y2hyID0gcHJldnByZXZjaHI7CisgICAgYXRfc3RhcnQgPSBwcmV2X2F0X3N0YXJ0OworICAgIHByZXZfYXRfc3RhcnQgPSBGQUxTRTsKKworICAgIC8qIEJhY2t1cCByZWdwYXJzZSwgc28gdGhhdCBpdCdzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGJlZm9yZSB0aGUKKyAgICAgKiBnZXRjaHIoKS4gKi8KKyAgICByZWdwYXJzZSAtPSBwcmV2Y2hyX2xlbjsKK30KKworLyoKKyAqIHJlYWRfbGltaXRzIC0gUmVhZCB0d28gaW50ZWdlcnMgdG8gYmUgdGFrZW4gYXMgYSBtaW5pbXVtIGFuZCBtYXhpbXVtLgorICogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAnLScsIHRoZW4gdGhlIHJhbmdlIGlzIHJldmVyc2VkLgorICogU2hvdWxkIGVuZCB3aXRoICdlbmQnLiAgSWYgbWludmFsIGlzIG1pc3NpbmcsIHplcm8gaXMgZGVmYXVsdCwgaWYgbWF4dmFsIGlzCisgKiBtaXNzaW5nLCBhIHZlcnkgYmlnIG51bWJlciBpcyB0aGUgZGVmYXVsdC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3JlYWRfbGltaXRzKG1pbnZhbCwgbWF4dmFsKQorICAgIGxvbmcJKm1pbnZhbDsKKyAgICBsb25nCSptYXh2YWw7Cit7CisgICAgaW50CQlyZXZlcnNlID0gRkFMU0U7CisgICAgY2hhcl91CSpmaXJzdF9jaGFyOworICAgIGxvbmcJdG1wOworCisgICAgaWYgKCpyZWdwYXJzZSA9PSAnLScpCisgICAgeworCS8qIFN0YXJ0cyB3aXRoICctJywgc28gcmV2ZXJzZSB0aGUgcmFuZ2UgbGF0ZXIgKi8KKwlyZWdwYXJzZSsrOworCXJldmVyc2UgPSBUUlVFOworICAgIH0KKyAgICBmaXJzdF9jaGFyID0gcmVncGFyc2U7CisgICAgKm1pbnZhbCA9IGdldGRpZ2l0cygmcmVncGFyc2UpOworICAgIGlmICgqcmVncGFyc2UgPT0gJywnKQkgICAgLyogVGhlcmUgaXMgYSBjb21tYSAqLworICAgIHsKKwlpZiAodmltX2lzZGlnaXQoKisrcmVncGFyc2UpKQorCSAgICAqbWF4dmFsID0gZ2V0ZGlnaXRzKCZyZWdwYXJzZSk7CisJZWxzZQorCSAgICAqbWF4dmFsID0gTUFYX0xJTUlUOworICAgIH0KKyAgICBlbHNlIGlmIChWSU1fSVNESUdJVCgqZmlyc3RfY2hhcikpCisJKm1heHZhbCA9ICptaW52YWw7CSAgICAvKiBJdCB3YXMgXHtufSBvciBcey1ufSAqLworICAgIGVsc2UKKwkqbWF4dmFsID0gTUFYX0xJTUlUOwkgICAgLyogSXQgd2FzIFx7fSBvciBcey19ICovCisgICAgaWYgKCpyZWdwYXJzZSA9PSAnXFwnKQorCXJlZ3BhcnNlKys7CS8qIEFsbG93IGVpdGhlciBcey4uLn0gb3IgXHsuLi5cfSAqLworICAgIGlmICgqcmVncGFyc2UgIT0gJ30nIHx8ICgqbWF4dmFsID09IDAgJiYgKm1pbnZhbCA9PSAwKSkKKyAgICB7CisJc3ByaW50ZigoY2hhciAqKUlPYnVmZiwgXygiRTU1NDogU3ludGF4IGVycm9yIGluICVzey4uLn0iKSwKKwkJCQkJICByZWdfbWFnaWMgPT0gTUFHSUNfQUxMID8gIiIgOiAiXFwiKTsKKwlFTVNHX1JFVF9GQUlMKElPYnVmZik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXZlcnNlIHRoZSByYW5nZSBpZiB0aGVyZSB3YXMgYSAnLScsIG9yIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgcmlnaHQKKyAgICAgKiBvcmRlciBvdGhlcndpc2UuCisgICAgICovCisgICAgaWYgKCghcmV2ZXJzZSAmJiAqbWludmFsID4gKm1heHZhbCkgfHwgKHJldmVyc2UgJiYgKm1pbnZhbCA8ICptYXh2YWwpKQorICAgIHsKKwl0bXAgPSAqbWludmFsOworCSptaW52YWwgPSAqbWF4dmFsOworCSptYXh2YWwgPSB0bXA7CisgICAgfQorICAgIHNraXBjaHIoKTsJCS8qIGxldCdzIGJlIGZyaWVuZHMgd2l0aCB0aGUgbGV4ZXIgYWdhaW4gKi8KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiB2aW1fcmVnZXhlYyBhbmQgZnJpZW5kcworICovCisKKy8qCisgKiBHbG9iYWwgd29yayB2YXJpYWJsZXMgZm9yIHZpbV9yZWdleGVjKCkuCisgKi8KKworLyogVGhlIGN1cnJlbnQgbWF0Y2gtcG9zaXRpb24gaXMgcmVtZW1iZXJlZCB3aXRoIHRoZXNlIHZhcmlhYmxlczogKi8KK3N0YXRpYyBsaW5lbnJfVAlyZWdsbnVtOwkvKiBsaW5lIG51bWJlciwgcmVsYXRpdmUgdG8gZmlyc3QgbGluZSAqLworc3RhdGljIGNoYXJfdQkqcmVnbGluZTsJLyogc3RhcnQgb2YgY3VycmVudCBsaW5lICovCitzdGF0aWMgY2hhcl91CSpyZWdpbnB1dDsJLyogY3VycmVudCBpbnB1dCwgcG9pbnRzIGludG8gInJlZ2xpbmUiICovCisKK3N0YXRpYyBpbnQJbmVlZF9jbGVhcl9zdWJleHByOwkvKiBzdWJleHByZXNzaW9ucyBzdGlsbCBuZWVkIHRvIGJlCisJCQkJCSAqIGNsZWFyZWQgKi8KKyNpZmRlZiBGRUFUX1NZTl9ITAorc3RhdGljIGludAluZWVkX2NsZWFyX3pzdWJleHByID0gRkFMU0U7CS8qIGV4dG1hdGNoIHN1YmV4cHJlc3Npb25zCisJCQkJCQkgKiBzdGlsbCBuZWVkIHRvIGJlIGNsZWFyZWQgKi8KKyNlbmRpZgorCitzdGF0aWMgaW50CW91dF9vZl9zdGFjazsJLyogVFJVRSB3aGVuIHJhbiBvdXQgb2Ygc3RhY2sgc3BhY2UgKi8KKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHNhdmUgdGhlIGN1cnJlbnQgaW5wdXQgc3RhdGUsIHdoZW4gaXQgbmVlZHMgdG8gYmUKKyAqIHJlc3RvcmVkIGFmdGVyIHRyeWluZyBhIG1hdGNoLiAgVXNlZCBieSByZWdfc2F2ZSgpIGFuZCByZWdfcmVzdG9yZSgpLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuaW9uCisgICAgeworCWNoYXJfdQkqcHRyOwkvKiByZWdpbnB1dCBwb2ludGVyLCBmb3Igc2luZ2xlLWxpbmUgcmVnZXhwICovCisJbHBvc19UCXBvczsJLyogcmVnaW5wdXQgcG9zLCBmb3IgbXVsdGktbGluZSByZWdleHAgKi8KKyAgICB9IHJzX3U7Cit9IHJlZ3NhdmVfVDsKKworLyogc3RydWN0IHRvIHNhdmUgc3RhcnQvZW5kIHBvaW50ZXIvcG9zaXRpb24gaW4gZm9yIFwoXCkgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5pb24KKyAgICB7CisJY2hhcl91CSpwdHI7CisJbHBvc19UCXBvczsKKyAgICB9IHNlX3U7Cit9IHNhdmVfc2VfVDsKKworc3RhdGljIGNoYXJfdQkqcmVnX2dldGxpbmUgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7CitzdGF0aWMgbG9uZwl2aW1fcmVnZXhlY19ib3RoIF9fQVJHUygoY2hhcl91ICpsaW5lLCBjb2xucl9UIGNvbCkpOworc3RhdGljIGxvbmcJcmVndHJ5IF9fQVJHUygocmVncHJvZ19UICpwcm9nLCBjb2xucl9UIGNvbCkpOworc3RhdGljIHZvaWQJY2xlYW51cF9zdWJleHByIF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfU1lOX0hMCitzdGF0aWMgdm9pZAljbGVhbnVwX3pzdWJleHByIF9fQVJHUygodm9pZCkpOworI2VuZGlmCitzdGF0aWMgdm9pZAlyZWdfbmV4dGxpbmUgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlyZWdfc2F2ZSBfX0FSR1MoKHJlZ3NhdmVfVCAqc2F2ZSkpOworc3RhdGljIHZvaWQJcmVnX3Jlc3RvcmUgX19BUkdTKChyZWdzYXZlX1QgKnNhdmUpKTsKK3N0YXRpYyBpbnQJcmVnX3NhdmVfZXF1YWwgX19BUkdTKChyZWdzYXZlX1QgKnNhdmUpKTsKK3N0YXRpYyB2b2lkCXNhdmVfc2VfbXVsdGkgX19BUkdTKChzYXZlX3NlX1QgKnNhdmVwLCBscG9zX1QgKnBvc3ApKTsKK3N0YXRpYyB2b2lkCXNhdmVfc2Vfb25lIF9fQVJHUygoc2F2ZV9zZV9UICpzYXZlcCwgY2hhcl91ICoqcHApKTsKKworLyogU2F2ZSB0aGUgc3ViLWV4cHJlc3Npb25zIGJlZm9yZSBhdHRlbXB0aW5nIGEgbWF0Y2guICovCisjZGVmaW5lIHNhdmVfc2Uoc2F2ZXAsIHBvc3AsIHBwKSBcCisgICAgUkVHX01VTFRJID8gc2F2ZV9zZV9tdWx0aSgoc2F2ZXApLCAocG9zcCkpIDogc2F2ZV9zZV9vbmUoKHNhdmVwKSwgKHBwKSkKKworLyogQWZ0ZXIgYSBmYWlsZWQgbWF0Y2ggcmVzdG9yZSB0aGUgc3ViLWV4cHJlc3Npb25zLiAqLworI2RlZmluZSByZXN0b3JlX3NlKHNhdmVwLCBwb3NwLCBwcCkgeyBcCisgICAgaWYgKFJFR19NVUxUSSkgXAorCSoocG9zcCkgPSAoc2F2ZXApLT5zZV91LnBvczsgXAorICAgIGVsc2UgXAorCSoocHApID0gKHNhdmVwKS0+c2VfdS5wdHI7IH0KKworc3RhdGljIGludAlyZV9udW1fY21wIF9fQVJHUygobG9uZ191IHZhbCwgY2hhcl91ICpzY2FuKSk7CitzdGF0aWMgaW50CXJlZ21hdGNoIF9fQVJHUygoY2hhcl91ICpwcm9nKSk7CitzdGF0aWMgaW50CXJlZ3JlcGVhdCBfX0FSR1MoKGNoYXJfdSAqcCwgbG9uZyBtYXhjb3VudCkpOworCisjaWZkZWYgREVCVUcKK2ludAkJcmVnbmFycmF0ZSA9IDA7CisjZW5kaWYKKworLyoKKyAqIEludGVybmFsIGNvcHkgb2YgJ2lnbm9yZWNhc2UnLiAgSXQgaXMgc2V0IGF0IGVhY2ggY2FsbCB0byB2aW1fcmVnZXhlYygpLgorICogTm9ybWFsbHkgaXQgZ2V0cyB0aGUgdmFsdWUgb2YgInJtX2ljIiBvciAicm1tX2ljIiwgYnV0IHdoZW4gdGhlIHBhdHRlcm4KKyAqIGNvbnRhaW5zICdcYycgb3IgJ1xDJyB0aGUgdmFsdWUgaXMgb3ZlcnJ1bGVkLgorICovCitzdGF0aWMgaW50CWlyZWdfaWM7CisKKyNpZmRlZiBGRUFUX01CWVRFCisvKgorICogU2ltaWxhciB0byBpcmVnX2ljLCBidXQgb25seSBmb3IgJ2NvbWJpbmluZycgY2hhcmFjdGVycy4gIFNldCB3aXRoIFxaIGZsYWcKKyAqIGluIHRoZSByZWdleHAuICBEZWZhdWx0cyB0byBmYWxzZSwgYWx3YXlzLgorICovCitzdGF0aWMgaW50CWlyZWdfaWNvbWJpbmU7CisjZW5kaWYKKworLyoKKyAqIFNvbWV0aW1lcyBuZWVkIHRvIHNhdmUgYSBjb3B5IG9mIGEgbGluZS4gIFNpbmNlIGFsbG9jKCkvZnJlZSgpIGlzIHZlcnkKKyAqIHNsb3csIHdlIGtlZXAgb25lIGFsbG9jYXRlZCBwaWVjZSBvZiBtZW1vcnkgYW5kIG9ubHkgcmUtYWxsb2NhdGUgaXQgd2hlbgorICogaXQncyB0b28gc21hbGwuICBJdCdzIGZyZWVkIGluIHZpbV9yZWdleGVjX2JvdGgoKSB3aGVuIGZpbmlzaGVkLgorICovCitzdGF0aWMgY2hhcl91CSpyZWdfdG9mcmVlOworc3RhdGljIHVuc2lnbmVkCXJlZ190b2ZyZWVsZW47CisKKy8qCisgKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHNldCB3aGVuIGV4ZWN1dGluZyBhIHJlZ2V4cCB0byBzcGVlZCB1cCB0aGUgZXhlY3V0aW9uLgorICogV2hpY2ggb25lcyBhcmUgc2V0IGRlcGVuZHMgb24gd2hldGhlcmUgYSBzaW5nbGUtbGluZSBvciBtdWx0aS1saW5lIG1hdGNoIGlzCisgKiBkb25lOgorICoJCQlzaW5nbGUtbGluZQkJbXVsdGktbGluZQorICogcmVnX21hdGNoCQkmcmVnbWF0Y2hfVAkJTlVMTAorICogcmVnX21tYXRjaAkJTlVMTAkJCSZyZWdtbWF0Y2hfVAorICogcmVnX3N0YXJ0cAkJcmVnX21hdGNoLT5zdGFydHAJPGludmFsaWQ+CisgKiByZWdfZW5kcAkJcmVnX21hdGNoLT5lbmRwCQk8aW52YWxpZD4KKyAqIHJlZ19zdGFydHBvcwkJPGludmFsaWQ+CQlyZWdfbW1hdGNoLT5zdGFydHBvcworICogcmVnX2VuZHBvcwkJPGludmFsaWQ+CQlyZWdfbW1hdGNoLT5lbmRwb3MKKyAqIHJlZ193aW4JCU5VTEwJCQl3aW5kb3cgaW4gd2hpY2ggdG8gc2VhcmNoCisgKiByZWdfYnVmCQk8aW52YWxpZD4JCWJ1ZmZlciBpbiB3aGljaCB0byBzZWFyY2gKKyAqIHJlZ19maXJzdGxudW0JPGludmFsaWQ+CQlmaXJzdCBsaW5lIGluIHdoaWNoIHRvIHNlYXJjaAorICogcmVnX21heGxpbmUJCTAJCQlsYXN0IGxpbmUgbnIKKyAqIHJlZ19saW5lX2xicgkJRkFMU0Ugb3IgVFJVRQkJRkFMU0UKKyAqLworc3RhdGljIHJlZ21hdGNoX1QJKnJlZ19tYXRjaDsKK3N0YXRpYyByZWdtbWF0Y2hfVAkqcmVnX21tYXRjaDsKK3N0YXRpYyBjaGFyX3UJCSoqcmVnX3N0YXJ0cCA9IE5VTEw7CitzdGF0aWMgY2hhcl91CQkqKnJlZ19lbmRwID0gTlVMTDsKK3N0YXRpYyBscG9zX1QJCSpyZWdfc3RhcnRwb3MgPSBOVUxMOworc3RhdGljIGxwb3NfVAkJKnJlZ19lbmRwb3MgPSBOVUxMOworc3RhdGljIHdpbl9UCQkqcmVnX3dpbjsKK3N0YXRpYyBidWZfVAkJKnJlZ19idWY7CitzdGF0aWMgbGluZW5yX1QJCXJlZ19maXJzdGxudW07CitzdGF0aWMgbGluZW5yX1QJCXJlZ19tYXhsaW5lOworc3RhdGljIGludAkJcmVnX2xpbmVfbGJyOwkgICAgLyogIlxuIiBpbiBzdHJpbmcgaXMgbGluZSBicmVhayAqLworCisvKgorICogR2V0IHBvaW50ZXIgdG8gdGhlIGxpbmUgImxudW0iLCB3aGljaCBpcyByZWxhdGl2ZSB0byAicmVnX2ZpcnN0bG51bSIuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3JlZ19nZXRsaW5lKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICAvKiB3aGVuIGxvb2tpbmcgYmVoaW5kIGZvciBhIG1hdGNoL25vLW1hdGNoIGxudW0gaXMgbmVnYXRpdmUuICBCdXQgd2UKKyAgICAgKiBjYW4ndCBnbyBiZWZvcmUgbGluZSAxICovCisgICAgaWYgKHJlZ19maXJzdGxudW0gKyBsbnVtIDwgMSkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbWxfZ2V0X2J1ZihyZWdfYnVmLCByZWdfZmlyc3RsbnVtICsgbG51bSwgRkFMU0UpOworfQorCitzdGF0aWMgcmVnc2F2ZV9UIGJlaGluZF9wb3M7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorc3RhdGljIGNoYXJfdQkqcmVnX3N0YXJ0enBbTlNVQkVYUF07CS8qIFdvcmtzcGFjZSB0byBtYXJrIGJlZ2lubmluZyAqLworc3RhdGljIGNoYXJfdQkqcmVnX2VuZHpwW05TVUJFWFBdOwkvKiAgIGFuZCBlbmQgb2YgXHooLi4uXCkgbWF0Y2hlcyAqLworc3RhdGljIGxwb3NfVAlyZWdfc3RhcnR6cG9zW05TVUJFWFBdOwkvKiBpZGVtLCBiZWdpbm5pbmcgcG9zICovCitzdGF0aWMgbHBvc19UCXJlZ19lbmR6cG9zW05TVUJFWFBdOwkvKiBpZGVtLCBlbmQgcG9zICovCisjZW5kaWYKKworLyogVFJVRSBpZiB1c2luZyBtdWx0aS1saW5lIHJlZ2V4cC4gKi8KKyNkZWZpbmUgUkVHX01VTFRJCShyZWdfbWF0Y2ggPT0gTlVMTCkKKworLyoKKyAqIE1hdGNoIGEgcmVnZXhwIGFnYWluc3QgYSBzdHJpbmcuCisgKiAicm1wLT5yZWdwcm9nIiBpcyBhIGNvbXBpbGVkIHJlZ2V4cCBhcyByZXR1cm5lZCBieSB2aW1fcmVnY29tcCgpLgorICogVXNlcyBjdXJidWYgZm9yIGxpbmUgY291bnQgYW5kICdpc2tleXdvcmQnLgorICoKKyAqIFJldHVybiBUUlVFIGlmIHRoZXJlIGlzIGEgbWF0Y2gsIEZBTFNFIGlmIG5vdC4KKyAqLworICAgIGludAordmltX3JlZ2V4ZWMocm1wLCBsaW5lLCBjb2wpCisgICAgcmVnbWF0Y2hfVAkqcm1wOworICAgIGNoYXJfdQkqbGluZTsJLyogc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QgKi8KKyAgICBjb2xucl9UCWNvbDsJLyogY29sdW1uIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIG1hdGNoICovCit7CisgICAgcmVnX21hdGNoID0gcm1wOworICAgIHJlZ19tbWF0Y2ggPSBOVUxMOworICAgIHJlZ19tYXhsaW5lID0gMDsKKyAgICByZWdfbGluZV9sYnIgPSBGQUxTRTsKKyAgICByZWdfd2luID0gTlVMTDsKKyAgICBpcmVnX2ljID0gcm1wLT5ybV9pYzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaXJlZ19pY29tYmluZSA9IEZBTFNFOworI2VuZGlmCisgICAgcmV0dXJuICh2aW1fcmVnZXhlY19ib3RoKGxpbmUsIGNvbCkgIT0gMCk7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTU9ESUZZX0ZOQU1FKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBMaWtlIHZpbV9yZWdleGVjKCksIGJ1dCBjb25zaWRlciBhICJcbiIgaW4gImxpbmUiIHRvIGJlIGEgbGluZSBicmVhay4KKyAqLworICAgIGludAordmltX3JlZ2V4ZWNfbmwocm1wLCBsaW5lLCBjb2wpCisgICAgcmVnbWF0Y2hfVAkqcm1wOworICAgIGNoYXJfdQkqbGluZTsJLyogc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QgKi8KKyAgICBjb2xucl9UCWNvbDsJLyogY29sdW1uIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIG1hdGNoICovCit7CisgICAgcmVnX21hdGNoID0gcm1wOworICAgIHJlZ19tbWF0Y2ggPSBOVUxMOworICAgIHJlZ19tYXhsaW5lID0gMDsKKyAgICByZWdfbGluZV9sYnIgPSBUUlVFOworICAgIHJlZ193aW4gPSBOVUxMOworICAgIGlyZWdfaWMgPSBybXAtPnJtX2ljOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpcmVnX2ljb21iaW5lID0gRkFMU0U7CisjZW5kaWYKKyAgICByZXR1cm4gKHZpbV9yZWdleGVjX2JvdGgobGluZSwgY29sKSAhPSAwKTsKK30KKyNlbmRpZgorCisvKgorICogTWF0Y2ggYSByZWdleHAgYWdhaW5zdCBtdWx0aXBsZSBsaW5lcy4KKyAqICJybXAtPnJlZ3Byb2ciIGlzIGEgY29tcGlsZWQgcmVnZXhwIGFzIHJldHVybmVkIGJ5IHZpbV9yZWdjb21wKCkuCisgKiBVc2VzIGN1cmJ1ZiBmb3IgbGluZSBjb3VudCBhbmQgJ2lza2V5d29yZCcuCisgKgorICogUmV0dXJuIHplcm8gaWYgdGhlcmUgaXMgbm8gbWF0Y2guICBSZXR1cm4gbnVtYmVyIG9mIGxpbmVzIGNvbnRhaW5lZCBpbiB0aGUKKyAqIG1hdGNoIG90aGVyd2lzZS4KKyAqLworICAgIGxvbmcKK3ZpbV9yZWdleGVjX211bHRpKHJtcCwgd2luLCBidWYsIGxudW0sIGNvbCkKKyAgICByZWdtbWF0Y2hfVAkqcm1wOworICAgIHdpbl9UCSp3aW47CQkvKiB3aW5kb3cgaW4gd2hpY2ggdG8gc2VhcmNoIG9yIE5VTEwgKi8KKyAgICBidWZfVAkqYnVmOwkJLyogYnVmZmVyIGluIHdoaWNoIHRvIHNlYXJjaCAqLworICAgIGxpbmVucl9UCWxudW07CQkvKiBuciBvZiBsaW5lIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIG1hdGNoICovCisgICAgY29sbnJfVAljb2w7CQkvKiBjb2x1bW4gdG8gc3RhcnQgbG9va2luZyBmb3IgbWF0Y2ggKi8KK3sKKyAgICBsb25nCXI7CisgICAgYnVmX1QJKnNhdmVfY3VyYnVmID0gY3VyYnVmOworCisgICAgcmVnX21hdGNoID0gTlVMTDsKKyAgICByZWdfbW1hdGNoID0gcm1wOworICAgIHJlZ19idWYgPSBidWY7CisgICAgcmVnX3dpbiA9IHdpbjsKKyAgICByZWdfZmlyc3RsbnVtID0gbG51bTsKKyAgICByZWdfbWF4bGluZSA9IHJlZ19idWYtPmJfbWwubWxfbGluZV9jb3VudCAtIGxudW07CisgICAgcmVnX2xpbmVfbGJyID0gRkFMU0U7CisgICAgaXJlZ19pYyA9IHJtcC0+cm1tX2ljOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpcmVnX2ljb21iaW5lID0gRkFMU0U7CisjZW5kaWYKKworICAgIC8qIE5lZWQgdG8gc3dpdGNoIHRvIGJ1ZmZlciAiYnVmIiB0byBtYWtlIHZpbV9pc3dvcmRjKCkgd29yay4gKi8KKyAgICBjdXJidWYgPSBidWY7CisgICAgciA9IHZpbV9yZWdleGVjX2JvdGgoTlVMTCwgY29sKTsKKyAgICBjdXJidWYgPSBzYXZlX2N1cmJ1ZjsKKworICAgIHJldHVybiByOworfQorCisvKgorICogTWF0Y2ggYSByZWdleHAgYWdhaW5zdCBhIHN0cmluZyAoImxpbmUiIHBvaW50cyB0byB0aGUgc3RyaW5nKSBvciBtdWx0aXBsZQorICogbGluZXMgKCJsaW5lIiBpcyBOVUxMLCB1c2UgcmVnX2dldGxpbmUoKSkuCisgKi8KKyNpZmRlZiBIQVZFX1NFVEpNUF9ICisgICAgc3RhdGljIGxvbmcKK3ZpbV9yZWdleGVjX2JvdGgobGluZV9hcmcsIGNvbF9hcmcpCisgICAgY2hhcl91CSpsaW5lX2FyZzsKKyAgICBjb2xucl9UCWNvbF9hcmc7CS8qIGNvbHVtbiB0byBzdGFydCBsb29raW5nIGZvciBtYXRjaCAqLworI2Vsc2UKKyAgICBzdGF0aWMgbG9uZwordmltX3JlZ2V4ZWNfYm90aChsaW5lLCBjb2wpCisgICAgY2hhcl91CSpsaW5lOworICAgIGNvbG5yX1QJY29sOwkJLyogY29sdW1uIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIG1hdGNoICovCisjZW5kaWYKK3sKKyAgICByZWdwcm9nX1QJKnByb2c7CisgICAgY2hhcl91CSpzOworICAgIGxvbmcJcmV0dmFsOworI2lmZGVmIEhBVkVfU0VUSk1QX0gKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgY29sbnJfVAljb2w7CisjZW5kaWYKKworICAgIHJlZ190b2ZyZWUgPSBOVUxMOworCisjaWZkZWYgSEFWRV9UUllfRVhDRVBUCisgICAgX190cnkKKyAgICB7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0VUSk1QX0gKKyAgICAvKgorICAgICAqIE1hdGNoaW5nIHdpdGggYSByZWdleHAgbWF5IGNhdXNlIGEgdmVyeSBkZWVwIHJlY3Vyc2l2ZSBjYWxsIG9mCisgICAgICogcmVnbWF0Y2goKS4gIFZpbSB3aWxsIGNyYXNoIHdoZW4gcnVubmluZyBvdXQgb2Ygc3RhY2sgc3BhY2UuICBDYXRjaAorICAgICAqIHRoaXMgaGVyZSBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGl0LgorICAgICAqLworICAgIG1jaF9zdGFydGptcCgpOworICAgIGlmIChTRVRKTVAobGNfanVtcF9lbnYpICE9IDApCisgICAgeworCW1jaF9kaWRqbXAoKTsKKyMgaWZkZWYgU0lHSEFTQVJHCisJaWYgKGxjX3NpZ25hbCAhPSBTSUdJTlQpCisjIGVuZGlmCisJICAgIEVNU0coXygiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iKSk7CisJcmV0dmFsID0gMEw7CisJZ290byB0aGVlbmQ7CisgICAgfQorCisgICAgLyogVHJpY2sgdG8gYXZvaWQgIm1pZ2h0IGJlIGNsb2JiZXJlZCBieSBgbG9uZ2ptcCciIHdhcm5pbmcgZnJvbSBnY2MuICovCisgICAgbGluZSA9IGxpbmVfYXJnOworICAgIGNvbCA9IGNvbF9hcmc7CisjZW5kaWYKKyAgICByZXR2YWwgPSAwTDsKKworICAgIGlmIChSRUdfTVVMVEkpCisgICAgeworCXByb2cgPSByZWdfbW1hdGNoLT5yZWdwcm9nOworCWxpbmUgPSByZWdfZ2V0bGluZSgobGluZW5yX1QpMCk7CisJcmVnX3N0YXJ0cG9zID0gcmVnX21tYXRjaC0+c3RhcnRwb3M7CisJcmVnX2VuZHBvcyA9IHJlZ19tbWF0Y2gtPmVuZHBvczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlwcm9nID0gcmVnX21hdGNoLT5yZWdwcm9nOworCXJlZ19zdGFydHAgPSByZWdfbWF0Y2gtPnN0YXJ0cDsKKwlyZWdfZW5kcCA9IHJlZ19tYXRjaC0+ZW5kcDsKKyAgICB9CisKKyAgICAvKiBCZSBwYXJhbm9pZC4uLiAqLworICAgIGlmIChwcm9nID09IE5VTEwgfHwgbGluZSA9PSBOVUxMKQorICAgIHsKKwlFTVNHKF8oZV9udWxsKSk7CisJZ290byB0aGVlbmQ7CisgICAgfQorCisgICAgLyogQ2hlY2sgdmFsaWRpdHkgb2YgcHJvZ3JhbS4gKi8KKyAgICBpZiAocHJvZ19tYWdpY193cm9uZygpKQorCWdvdG8gdGhlZW5kOworCisgICAgLyogSWYgcGF0dGVybiBjb250YWlucyAiXGMiIG9yICJcQyI6IG92ZXJydWxlIHZhbHVlIG9mIGlyZWdfaWMgKi8KKyAgICBpZiAocHJvZy0+cmVnZmxhZ3MgJiBSRl9JQ0FTRSkKKwlpcmVnX2ljID0gVFJVRTsKKyAgICBlbHNlIGlmIChwcm9nLT5yZWdmbGFncyAmIFJGX05PSUNBU0UpCisJaXJlZ19pYyA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIC8qIElmIHBhdHRlcm4gY29udGFpbnMgIlxaIiBvdmVycnVsZSB2YWx1ZSBvZiBpcmVnX2ljb21iaW5lICovCisgICAgaWYgKHByb2ctPnJlZ2ZsYWdzICYgUkZfSUNPTUJJTkUpCisJaXJlZ19pY29tYmluZSA9IFRSVUU7CisjZW5kaWYKKworICAgIC8qIElmIHRoZXJlIGlzIGEgIm11c3QgYXBwZWFyIiBzdHJpbmcsIGxvb2sgZm9yIGl0LiAqLworICAgIGlmIChwcm9nLT5yZWdtdXN0ICE9IE5VTEwpCisgICAgeworCWludCBjOworCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIGMgPSAoKm1iX3B0cjJjaGFyKShwcm9nLT5yZWdtdXN0KTsKKwllbHNlCisjZW5kaWYKKwkgICAgYyA9ICpwcm9nLT5yZWdtdXN0OworCXMgPSBsaW5lICsgY29sOworCXdoaWxlICgocyA9IGNzdHJjaHIocywgYykpICE9IE5VTEwpCisJeworCSAgICBpZiAoY3N0cm5jbXAocywgcHJvZy0+cmVnbXVzdCwgJnByb2ctPnJlZ21sZW4pID09IDApCisJCWJyZWFrOwkJLyogRm91bmQgaXQuICovCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQlzICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocyk7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3M7CisJfQorCWlmIChzID09IE5VTEwpCQkvKiBOb3QgcHJlc2VudC4gKi8KKwkgICAgZ290byB0aGVlbmQ7CisgICAgfQorCisgICAgcmVnbGluZSA9IGxpbmU7CisgICAgcmVnbG51bSA9IDA7CisgICAgb3V0X29mX3N0YWNrID0gRkFMU0U7CisKKyAgICAvKiBTaW1wbGVzdCBjYXNlOiBBbmNob3JlZCBtYXRjaCBuZWVkIGJlIHRyaWVkIG9ubHkgb25jZS4gKi8KKyAgICBpZiAocHJvZy0+cmVnYW5jaCkKKyAgICB7CisJaW50CWM7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgYyA9ICgqbWJfcHRyMmNoYXIpKHJlZ2xpbmUgKyBjb2wpOworCWVsc2UKKyNlbmRpZgorCSAgICBjID0gcmVnbGluZVtjb2xdOworCWlmIChwcm9nLT5yZWdzdGFydCA9PSBOVUwKKwkJfHwgcHJvZy0+cmVnc3RhcnQgPT0gYworCQl8fCAoaXJlZ19pYyAmJiAoKAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCShlbmNfdXRmOCAmJiB1dGZfZm9sZChwcm9nLT5yZWdzdGFydCkgPT0gdXRmX2ZvbGQoYykpKQorCQkJfHwgKGMgPCAyNTUgJiYgcHJvZy0+cmVnc3RhcnQgPCAyNTUgJiYKKyNlbmRpZgorCQkJICAgIFRPTE9XRVJfTE9DKHByb2ctPnJlZ3N0YXJ0KSA9PSBUT0xPV0VSX0xPQyhjKSkpKSkKKwkgICAgcmV0dmFsID0gcmVndHJ5KHByb2csIGNvbCk7CisJZWxzZQorCSAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIE1lc3N5IGNhc2VzOiAgdW5hbmNob3JlZCBtYXRjaC4gKi8KKwl3aGlsZSAoIWdvdF9pbnQgJiYgIW91dF9vZl9zdGFjaykKKwl7CisJICAgIGlmIChwcm9nLT5yZWdzdGFydCAhPSBOVUwpCisJICAgIHsKKwkJLyogU2tpcCB1bnRpbCB0aGUgY2hhciB3ZSBrbm93IGl0IG11c3Qgc3RhcnQgd2l0aC4gKi8KKwkJcyA9IGNzdHJjaHIocmVnbGluZSArIGNvbCwgcHJvZy0+cmVnc3RhcnQpOworCQlpZiAocyA9PSBOVUxMKQorCQl7CisJCSAgICByZXR2YWwgPSAwOworCQkgICAgYnJlYWs7CisJCX0KKwkJY29sID0gKGludCkocyAtIHJlZ2xpbmUpOworCSAgICB9CisKKwkgICAgcmV0dmFsID0gcmVndHJ5KHByb2csIGNvbCk7CisJICAgIGlmIChyZXR2YWwgPiAwKQorCQlicmVhazsKKworCSAgICAvKiBpZiBub3QgY3VycmVudGx5IG9uIHRoZSBmaXJzdCBsaW5lLCBnZXQgaXQgYWdhaW4gKi8KKwkgICAgaWYgKHJlZ2xudW0gIT0gMCkKKwkgICAgeworCQlyZWdsaW5lID0gcmVnX2dldGxpbmUoKGxpbmVucl9UKTApOworCQlyZWdsbnVtID0gMDsKKwkgICAgfQorCSAgICBpZiAocmVnbGluZVtjb2xdID09IE5VTCkKKwkJYnJlYWs7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQljb2wgKz0gKCptYl9wdHIybGVuX2NoZWNrKShyZWdsaW5lICsgY29sKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCSsrY29sOworCX0KKyAgICB9CisKKyAgICBpZiAob3V0X29mX3N0YWNrKQorCUVNU0coXygiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIikpOworCisjaWZkZWYgSEFWRV9UUllfRVhDRVBUCisgICAgfQorICAgIF9fZXhjZXB0KEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIpCisgICAgeworCWlmIChHZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XKQorCXsKKwkgICAgUkVTRVRTVEtPRkxXKCk7CisJICAgIEVNU0coXygiRTM2MzogcGF0dGVybiBjYXVzZWQgb3V0LW9mLXN0YWNrIGVycm9yIikpOworCX0KKwllbHNlCisJICAgIEVNU0coXygiRTM2MTogQ3Jhc2ggaW50ZXJjZXB0ZWQ7IHJlZ2V4cCB0b28gY29tcGxleD8iKSk7CisJcmV0dmFsID0gMEw7CisgICAgfQorI2VuZGlmCisKK3RoZWVuZDoKKyAgICAvKiBEaWRuJ3QgZmluZCBhIG1hdGNoLiAqLworICAgIHZpbV9mcmVlKHJlZ190b2ZyZWUpOworI2lmZGVmIEhBVkVfU0VUSk1QX0gKKyAgICBtY2hfZW5kam1wKCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgRkVBVF9TWU5fSEwKK3N0YXRpYyByZWdfZXh0bWF0Y2hfVCAqbWFrZV9leHRtYXRjaCBfX0FSR1MoKHZvaWQpKTsKKworLyoKKyAqIENyZWF0ZSBhIG5ldyBleHRtYXRjaCBhbmQgbWFyayBpdCBhcyByZWZlcmVuY2VkIG9uY2UuCisgKi8KKyAgICBzdGF0aWMgcmVnX2V4dG1hdGNoX1QgKgorbWFrZV9leHRtYXRjaCgpCit7CisgICAgcmVnX2V4dG1hdGNoX1QJKmVtOworCisgICAgZW0gPSAocmVnX2V4dG1hdGNoX1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKHJlZ19leHRtYXRjaF9UKSk7CisgICAgaWYgKGVtICE9IE5VTEwpCisJZW0tPnJlZmNudCA9IDE7CisgICAgcmV0dXJuIGVtOworfQorCisvKgorICogQWRkIGEgcmVmZXJlbmNlIHRvIGFuIGV4dG1hdGNoLgorICovCisgICAgcmVnX2V4dG1hdGNoX1QgKgorcmVmX2V4dG1hdGNoKGVtKQorICAgIHJlZ19leHRtYXRjaF9UCSplbTsKK3sKKyAgICBpZiAoZW0gIT0gTlVMTCkKKwllbS0+cmVmY250Kys7CisgICAgcmV0dXJuIGVtOworfQorCisvKgorICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGFuIGV4dG1hdGNoLiAgSWYgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgbGVmdCwgZnJlZQorICogdGhlIGluZm8uCisgKi8KKyAgICB2b2lkCit1bnJlZl9leHRtYXRjaChlbSkKKyAgICByZWdfZXh0bWF0Y2hfVAkqZW07Cit7CisgICAgaW50IGk7CisKKyAgICBpZiAoZW0gIT0gTlVMTCAmJiAtLWVtLT5yZWZjbnQgPD0gMCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IE5TVUJFWFA7ICsraSkKKwkgICAgdmltX2ZyZWUoZW0tPm1hdGNoZXNbaV0pOworCXZpbV9mcmVlKGVtKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIHJlZ3RyeSAtIHRyeSBtYXRjaCBvZiAicHJvZyIgd2l0aCBhdCByZWdsaW5lWyJjb2wiXS4KKyAqIFJldHVybnMgMCBmb3IgZmFpbHVyZSwgbnVtYmVyIG9mIGxpbmVzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2ggb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGxvbmcKK3JlZ3RyeShwcm9nLCBjb2wpCisgICAgcmVncHJvZ19UCSpwcm9nOworICAgIGNvbG5yX1QJY29sOworeworICAgIHJlZ2lucHV0ID0gcmVnbGluZSArIGNvbDsKKyAgICBuZWVkX2NsZWFyX3N1YmV4cHIgPSBUUlVFOworI2lmZGVmIEZFQVRfU1lOX0hMCisgICAgLyogQ2xlYXIgdGhlIGV4dGVybmFsIG1hdGNoIHN1YnBvaW50ZXJzIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICBpZiAocHJvZy0+cmVnaGFzeiA9PSBSRVhfU0VUKQorCW5lZWRfY2xlYXJfenN1YmV4cHIgPSBUUlVFOworI2VuZGlmCisKKyAgICBpZiAocmVnbWF0Y2gocHJvZy0+cHJvZ3JhbSArIDEpKQorICAgIHsKKwljbGVhbnVwX3N1YmV4cHIoKTsKKwlpZiAoUkVHX01VTFRJKQorCXsKKwkgICAgaWYgKHJlZ19zdGFydHBvc1swXS5sbnVtIDwgMCkKKwkgICAgeworCQlyZWdfc3RhcnRwb3NbMF0ubG51bSA9IDA7CisJCXJlZ19zdGFydHBvc1swXS5jb2wgPSBjb2w7CisJICAgIH0KKwkgICAgaWYgKHJlZ19lbmRwb3NbMF0ubG51bSA8IDApCisJICAgIHsKKwkJcmVnX2VuZHBvc1swXS5sbnVtID0gcmVnbG51bTsKKwkJcmVnX2VuZHBvc1swXS5jb2wgPSAoaW50KShyZWdpbnB1dCAtIHJlZ2xpbmUpOworCSAgICB9CisJICAgIGVsc2UKKwkJLyogVXNlIGxpbmUgbnVtYmVyIG9mICJcemUiLiAqLworCQlyZWdsbnVtID0gcmVnX2VuZHBvc1swXS5sbnVtOworCX0KKwllbHNlCisJeworCSAgICBpZiAocmVnX3N0YXJ0cFswXSA9PSBOVUxMKQorCQlyZWdfc3RhcnRwWzBdID0gcmVnbGluZSArIGNvbDsKKwkgICAgaWYgKHJlZ19lbmRwWzBdID09IE5VTEwpCisJCXJlZ19lbmRwWzBdID0gcmVnaW5wdXQ7CisJfQorI2lmZGVmIEZFQVRfU1lOX0hMCisJLyogUGFja2FnZSBhbnkgZm91bmQgXHooLi4uXCkgbWF0Y2hlcyBmb3IgZXhwb3J0LiBEZWZhdWx0IGlzIG5vbmUuICovCisJdW5yZWZfZXh0bWF0Y2gocmVfZXh0bWF0Y2hfb3V0KTsKKwlyZV9leHRtYXRjaF9vdXQgPSBOVUxMOworCisJaWYgKHByb2ctPnJlZ2hhc3ogPT0gUkVYX1NFVCkKKwl7CisJICAgIGludAkJaTsKKworCSAgICBjbGVhbnVwX3pzdWJleHByKCk7CisJICAgIHJlX2V4dG1hdGNoX291dCA9IG1ha2VfZXh0bWF0Y2goKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IE5TVUJFWFA7IGkrKykKKwkgICAgeworCQlpZiAoUkVHX01VTFRJKQorCQl7CisJCSAgICAvKiBPbmx5IGFjY2VwdCBzaW5nbGUgbGluZSBtYXRjaGVzLiAqLworCQkgICAgaWYgKHJlZ19zdGFydHpwb3NbaV0ubG51bSA+PSAwCisJCQkgICAgJiYgcmVnX2VuZHpwb3NbaV0ubG51bSA9PSByZWdfc3RhcnR6cG9zW2ldLmxudW0pCisJCQlyZV9leHRtYXRjaF9vdXQtPm1hdGNoZXNbaV0gPQorCQkJICAgIHZpbV9zdHJuc2F2ZShyZWdfZ2V0bGluZShyZWdfc3RhcnR6cG9zW2ldLmxudW0pCisJCQkJCQkgICAgICAgKyByZWdfc3RhcnR6cG9zW2ldLmNvbCwKKwkJCQkgICAgcmVnX2VuZHpwb3NbaV0uY29sIC0gcmVnX3N0YXJ0enBvc1tpXS5jb2wpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKHJlZ19zdGFydHpwW2ldICE9IE5VTEwgJiYgcmVnX2VuZHpwW2ldICE9IE5VTEwpCisJCQlyZV9leHRtYXRjaF9vdXQtPm1hdGNoZXNbaV0gPQorCQkJICAgIHZpbV9zdHJuc2F2ZShyZWdfc3RhcnR6cFtpXSwKKwkJCQkgICAgKGludCkocmVnX2VuZHpwW2ldIC0gcmVnX3N0YXJ0enBbaV0pKTsKKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisJcmV0dXJuIDEgKyByZWdsbnVtOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qIG11bHRpLWJ5dGU6IGFkdmFuY2UgcmVnaW5wdXQgd2l0aCBhIGZ1bmN0aW9uICovCisjIGRlZmluZSBBRFZBTkNFX1JFR0lOUFVUKCkgYWR2YW5jZV9yZWdpbnB1dCgpCisKK3N0YXRpYyB2b2lkIGFkdmFuY2VfcmVnaW5wdXQgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgaW50IHJlZ19wcmV2X2NsYXNzIF9fQVJHUygodm9pZCkpOworCisgICAgc3RhdGljIHZvaWQKK2FkdmFuY2VfcmVnaW5wdXQoKQoreworICAgIGlmIChoYXNfbWJ5dGUpCisJcmVnaW5wdXQgKz0gKCptYl9wdHIybGVuX2NoZWNrKShyZWdpbnB1dCk7CisgICAgZWxzZQorCSsrcmVnaW5wdXQ7Cit9CisKKy8qCisgKiBHZXQgY2xhc3Mgb2YgcHJldmlvdXMgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIGludAorcmVnX3ByZXZfY2xhc3MoKQoreworICAgIGlmIChyZWdpbnB1dCA+IHJlZ2xpbmUpCisJcmV0dXJuIG1iX2dldF9jbGFzcyhyZWdpbnB1dCAtIDEKKwkJCQkgICAgIC0gKCptYl9oZWFkX29mZikocmVnbGluZSwgcmVnaW5wdXQgLSAxKSk7CisgICAgcmV0dXJuIC0xOworfQorCisjZWxzZQorLyogTm8gbXVsdGktYnl0ZTogSXQncyB0b28gc2ltcGxlIHRvIG1ha2UgYSBmdW5jdGlvbiBmb3IuICovCisjIGRlZmluZSBBRFZBTkNFX1JFR0lOUFVUKCkgKytyZWdpbnB1dAorI2VuZGlmCisKKy8qCisgKiBUaGUgYXJndW1lbnRzIGZyb20gQlJBQ0VfTElNSVRTIGFyZSBzdG9yZWQgaGVyZS4gIFRoZXkgYXJlIGFjdHVhbGx5IGxvY2FsCisgKiB0byByZWdtYXRjaCgpLCBidXQgdGhleSBhcmUgaGVyZSB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB1c2VkCisgKiAoaXQgY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseSBtYW55IHRpbWVzKS4KKyAqLworc3RhdGljIGxvbmcJYmxfbWludmFsOworc3RhdGljIGxvbmcJYmxfbWF4dmFsOworCisvKgorICogcmVnbWF0Y2ggLSBtYWluIG1hdGNoaW5nIHJvdXRpbmUKKyAqCisgKiBDb25jZXB0dWFsbHkgdGhlIHN0cmF0ZWd5IGlzIHNpbXBsZTogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQKKyAqIG5vZGUgbWF0Y2hlcywgY2FsbCBzZWxmIHJlY3Vyc2l2ZWx5IHRvIHNlZSB3aGV0aGVyIHRoZSByZXN0IG1hdGNoZXMsCisgKiBhbmQgdGhlbiBhY3QgYWNjb3JkaW5nbHkuICBJbiBwcmFjdGljZSB3ZSBtYWtlIHNvbWUgZWZmb3J0IHRvIGF2b2lkCisgKiByZWN1cnNpb24sIGluIHBhcnRpY3VsYXIgYnkgZ29pbmcgdGhyb3VnaCAib3JkaW5hcnkiIG5vZGVzICh0aGF0IGRvbid0CisgKiBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgcmVzdCBvZiB0aGUgbWF0Y2ggZmFpbGVkKSBieSBhIGxvb3AgaW5zdGVhZCBvZgorICogYnkgcmVjdXJzaW9uLgorICoKKyAqIFJldHVybnMgVFJVRSB3aGVuIHRoZXJlIGlzIGEgbWF0Y2guICBMZWF2ZXMgcmVnaW5wdXQgYW5kIHJlZ2xudW0ganVzdCBhZnRlcgorICogdGhlIGxhc3QgbWF0Y2hlZCBjaGFyYWN0ZXIuCisgKiBSZXR1cm5zIEZBTFNFIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2guICBMZWF2ZXMgcmVnaW5wdXQgYW5kIHJlZ2xudW0gaW4gYW4KKyAqIHVuZGVmaW5lZCBzdGF0ZSEKKyAqLworICAgIHN0YXRpYyBpbnQKK3JlZ21hdGNoKHNjYW4pCisgICAgY2hhcl91CSpzY2FuOwkJLyogQ3VycmVudCBub2RlLiAqLworeworICAgIGNoYXJfdQkqbmV4dDsJCS8qIE5leHQgbm9kZS4gKi8KKyAgICBpbnQJCW9wOworICAgIGludAkJYzsKKworI2lmZGVmIEhBVkVfR0VUUkxJTUlUCisgICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgb3V0IG9mIHN0YWNrIHNwYWNlLiAgQ291bGQgYmUgY2F1c2VkIGJ5CisgICAgICogcmVjdXJzaXZlbHkgY2FsbGluZyBvdXJzZWx2ZXMuICovCisgICAgaWYgKG91dF9vZl9zdGFjayB8fCBtY2hfc3RhY2tjaGVjaygoY2hhciAqKSZvcCkgPT0gRkFJTCkKKyAgICB7CisJb3V0X29mX3N0YWNrID0gVFJVRTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTb21lIHBhdHRlcm5zIG15IGNhdXNlIGEgbG9uZyB0aW1lIHRvIG1hdGNoLCBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QKKyAgICAgKiBpbGxlZ2FsLiAgRS5nLiwgIlwoW2Etel1cK1wpXCtRIi4gIEFsbG93IGJyZWFraW5nIHRoZW0gd2l0aCBDVFJMLUMuICovCisgICAgZmFzdF9icmVha2NoZWNrKCk7CisKKyNpZmRlZiBERUJVRworICAgIGlmIChzY2FuICE9IE5VTEwgJiYgcmVnbmFycmF0ZSkKKyAgICB7CisJbWNoX2Vycm1zZyhyZWdwcm9wKHNjYW4pKTsKKwltY2hfZXJybXNnKCIoXG4iKTsKKyAgICB9CisjZW5kaWYKKyAgICB3aGlsZSAoc2NhbiAhPSBOVUxMKQorICAgIHsKKwlpZiAoZ290X2ludCB8fCBvdXRfb2Zfc3RhY2spCisJICAgIHJldHVybiBGQUxTRTsKKyNpZmRlZiBERUJVRworCWlmIChyZWduYXJyYXRlKQorCXsKKwkgICAgbWNoX2Vycm1zZyhyZWdwcm9wKHNjYW4pKTsKKwkgICAgbWNoX2Vycm1zZygiLi4uXG4iKTsKKyMgaWZkZWYgRkVBVF9TWU5fSEwKKwkgICAgaWYgKHJlX2V4dG1hdGNoX2luICE9IE5VTEwpCisJICAgIHsKKwkJaW50IGk7CisKKwkJbWNoX2Vycm1zZyhfKCJFeHRlcm5hbCBzdWJtYXRjaGVzOlxuIikpOworCQlmb3IgKGkgPSAwOyBpIDwgTlNVQkVYUDsgaSsrKQorCQl7CisJCSAgICBtY2hfZXJybXNnKCIgICAgXCIiKTsKKwkJICAgIGlmIChyZV9leHRtYXRjaF9pbi0+bWF0Y2hlc1tpXSAhPSBOVUxMKQorCQkJbWNoX2Vycm1zZyhyZV9leHRtYXRjaF9pbi0+bWF0Y2hlc1tpXSk7CisJCSAgICBtY2hfZXJybXNnKCJcIlxuIik7CisJCX0KKwkgICAgfQorIyBlbmRpZgorCX0KKyNlbmRpZgorCW5leHQgPSByZWduZXh0KHNjYW4pOworCisJb3AgPSBPUChzY2FuKTsKKwkvKiBDaGVjayBmb3IgY2hhcmFjdGVyIGNsYXNzIHdpdGggTkwgYWRkZWQuICovCisJaWYgKFdJVEhfTkwob3ApICYmICpyZWdpbnB1dCA9PSBOVUwgJiYgcmVnbG51bSA8IHJlZ19tYXhsaW5lKQorCXsKKwkgICAgcmVnX25leHRsaW5lKCk7CisJfQorCWVsc2UgaWYgKHJlZ19saW5lX2xiciAmJiBXSVRIX05MKG9wKSAmJiAqcmVnaW5wdXQgPT0gJ1xuJykKKwl7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwl9CisJZWxzZQorCXsKKwkgIGlmIChXSVRIX05MKG9wKSkKKwkgICAgb3AgLT0gQUREX05MOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgIGlmIChoYXNfbWJ5dGUpCisJICAgICAgYyA9ICgqbWJfcHRyMmNoYXIpKHJlZ2lucHV0KTsKKwkgIGVsc2UKKyNlbmRpZgorCSAgICAgIGMgPSAqcmVnaW5wdXQ7CisJICBzd2l0Y2ggKG9wKQorCSAgeworCSAgY2FzZSBCT0w6CisJICAgIGlmIChyZWdpbnB1dCAhPSByZWdsaW5lKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGJyZWFrOworCisJICBjYXNlIEVPTDoKKwkgICAgaWYgKGMgIT0gTlVMKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGJyZWFrOworCisJICBjYXNlIFJFX0JPRjoKKwkgICAgLyogUGFzc2luZyAtMSB0byB0aGUgZ2V0bGluZSgpIGZ1bmN0aW9uIHByb3ZpZGVkIGZvciB0aGUgc2VhcmNoCisJICAgICAqIHNob3VsZCBhbHdheXMgcmV0dXJuIE5VTEwgaWYgdGhlIGN1cnJlbnQgbGluZSBpcyB0aGUgZmlyc3QKKwkgICAgICogbGluZSBvZiB0aGUgZmlsZS4gKi8KKwkgICAgaWYgKHJlZ2xudW0gIT0gMCB8fCByZWdpbnB1dCAhPSByZWdsaW5lCisJCQl8fCAoUkVHX01VTFRJICYmIHJlZ19nZXRsaW5lKChsaW5lbnJfVCktMSkgIT0gTlVMTCkpCisJCXJldHVybiBGQUxTRTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgUkVfRU9GOgorCSAgICBpZiAocmVnbG51bSAhPSByZWdfbWF4bGluZSB8fCBjICE9IE5VTCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBicmVhazsKKworCSAgY2FzZSBDVVJTT1I6CisJICAgIC8qIENoZWNrIGlmIHRoZSBidWZmZXIgaXMgaW4gYSB3aW5kb3cgYW5kIGNvbXBhcmUgdGhlCisJICAgICAqIHJlZ193aW4tPndfY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBtYXRjaCBwb3NpdGlvbi4gKi8KKwkgICAgaWYgKHJlZ193aW4gPT0gTlVMTAorCQkgICAgfHwgKHJlZ2xudW0gKyByZWdfZmlyc3RsbnVtICE9IHJlZ193aW4tPndfY3Vyc29yLmxudW0pCisJCSAgICB8fCAoKGNvbG5yX1QpKHJlZ2lucHV0IC0gcmVnbGluZSkgIT0gcmVnX3dpbi0+d19jdXJzb3IuY29sKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBicmVhazsKKworCSAgY2FzZSBSRV9MTlVNOgorCSAgICBpZiAoIVJFR19NVUxUSSB8fCAhcmVfbnVtX2NtcCgobG9uZ191KShyZWdsbnVtICsgcmVnX2ZpcnN0bG51bSksCisJCQkJCQkJCQlzY2FuKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBicmVhazsKKworCSAgY2FzZSBSRV9DT0w6CisJICAgIGlmICghcmVfbnVtX2NtcCgobG9uZ191KShyZWdpbnB1dCAtIHJlZ2xpbmUpICsgMSwgc2NhbikpCisJCXJldHVybiBGQUxTRTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgUkVfVkNPTDoKKwkgICAgaWYgKCFyZV9udW1fY21wKChsb25nX3Upd2luX2xpbmV0YWJzaXplKAorCQkJICAgIHJlZ193aW4gPT0gTlVMTCA/IGN1cndpbiA6IHJlZ193aW4sCisJCQkgICAgcmVnbGluZSwgKGNvbG5yX1QpKHJlZ2lucHV0IC0gcmVnbGluZSkpICsgMSwgc2NhbikpCisJCXJldHVybiBGQUxTRTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQk9XOgkvKiBcPHdvcmQ7IHJlZ2lucHV0IHBvaW50cyB0byB3ICovCisJICAgIGlmIChjID09IE5VTCkJLyogQ2FuJ3QgbWF0Y2ggYXQgZW5kIG9mIGxpbmUgKi8KKwkJcmV0dXJuIEZBTFNFOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlpbnQgdGhpc19jbGFzczsKKworCQkvKiBHZXQgY2xhc3Mgb2YgY3VycmVudCBhbmQgcHJldmlvdXMgY2hhciAoaWYgaXQgZXhpc3RzKS4gKi8KKwkJdGhpc19jbGFzcyA9IG1iX2dldF9jbGFzcyhyZWdpbnB1dCk7CisJCWlmICh0aGlzX2NsYXNzIDw9IDEpCisJCSAgICByZXR1cm4gRkFMU0U7CS8qIG5vdCBvbiBhIHdvcmQgYXQgYWxsICovCisJCWlmIChyZWdfcHJldl9jbGFzcygpID09IHRoaXNfY2xhc3MpCisJCSAgICByZXR1cm4gRkFMU0U7CS8qIHByZXZpb3VzIGNoYXIgaXMgaW4gc2FtZSB3b3JkICovCisJICAgIH0KKyNlbmRpZgorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKCF2aW1faXN3b3JkYyhjKQorCQkJfHwgKHJlZ2lucHV0ID4gcmVnbGluZSAmJiB2aW1faXN3b3JkYyhyZWdpbnB1dFstMV0pKSkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSBFT1c6CS8qIHdvcmRcPjsgcmVnaW5wdXQgcG9pbnRzIGFmdGVyIGQgKi8KKwkgICAgaWYgKHJlZ2lucHV0ID09IHJlZ2xpbmUpICAgIC8qIENhbid0IG1hdGNoIGF0IHN0YXJ0IG9mIGxpbmUgKi8KKwkJcmV0dXJuIEZBTFNFOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlpbnQgdGhpc19jbGFzcywgcHJldl9jbGFzczsKKworCQkvKiBHZXQgY2xhc3Mgb2YgY3VycmVudCBhbmQgcHJldmlvdXMgY2hhciAoaWYgaXQgZXhpc3RzKS4gKi8KKwkJdGhpc19jbGFzcyA9IG1iX2dldF9jbGFzcyhyZWdpbnB1dCk7CisJCXByZXZfY2xhc3MgPSByZWdfcHJldl9jbGFzcygpOworCQlpZiAodGhpc19jbGFzcyA9PSBwcmV2X2NsYXNzKQorCQkgICAgcmV0dXJuIEZBTFNFOworCQlpZiAocHJldl9jbGFzcyA9PSAwIHx8IHByZXZfY2xhc3MgPT0gMSkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQlpZiAoIXZpbV9pc3dvcmRjKHJlZ2lucHV0Wy0xXSkpCisJCSAgICByZXR1cm4gRkFMU0U7CisJCWlmIChyZWdpbnB1dFswXSAhPSBOVUwgJiYgdmltX2lzd29yZGMoYykpCisJCSAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwkgICAgYnJlYWs7IC8qIE1hdGNoZWQgd2l0aCBFT1cgKi8KKworCSAgY2FzZSBBTlk6CisJICAgIGlmIChjID09IE5VTCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIElERU5UOgorCSAgICBpZiAoIXZpbV9pc0lEYyhjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNJREVOVDoKKwkgICAgaWYgKFZJTV9JU0RJR0lUKCpyZWdpbnB1dCkgfHwgIXZpbV9pc0lEYyhjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIEtXT1JEOgorCSAgICBpZiAoIXZpbV9pc3dvcmRwKHJlZ2lucHV0KSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNLV09SRDoKKwkgICAgaWYgKFZJTV9JU0RJR0lUKCpyZWdpbnB1dCkgfHwgIXZpbV9pc3dvcmRwKHJlZ2lucHV0KSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIEZOQU1FOgorCSAgICBpZiAoIXZpbV9pc2ZpbGVjKGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU0ZOQU1FOgorCSAgICBpZiAoVklNX0lTRElHSVQoKnJlZ2lucHV0KSB8fCAhdmltX2lzZmlsZWMoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBQUklOVDoKKwkgICAgaWYgKHB0cjJjZWxscyhyZWdpbnB1dCkgIT0gMSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNQUklOVDoKKwkgICAgaWYgKFZJTV9JU0RJR0lUKCpyZWdpbnB1dCkgfHwgcHRyMmNlbGxzKHJlZ2lucHV0KSAhPSAxKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgV0hJVEU6CisJICAgIGlmICghdmltX2lzd2hpdGUoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBOV0hJVEU6CisJICAgIGlmIChjID09IE5VTCB8fCB2aW1faXN3aGl0ZShjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIERJR0lUOgorCSAgICBpZiAoIXJpX2RpZ2l0KGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTkRJR0lUOgorCSAgICBpZiAoYyA9PSBOVUwgfHwgcmlfZGlnaXQoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBIRVg6CisJICAgIGlmICghcmlfaGV4KGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTkhFWDoKKwkgICAgaWYgKGMgPT0gTlVMIHx8IHJpX2hleChjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIE9DVEFMOgorCSAgICBpZiAoIXJpX29jdGFsKGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTk9DVEFMOgorCSAgICBpZiAoYyA9PSBOVUwgfHwgcmlfb2N0YWwoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBXT1JEOgorCSAgICBpZiAoIXJpX3dvcmQoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBOV09SRDoKKwkgICAgaWYgKGMgPT0gTlVMIHx8IHJpX3dvcmQoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBIRUFEOgorCSAgICBpZiAoIXJpX2hlYWQoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBOSEVBRDoKKwkgICAgaWYgKGMgPT0gTlVMIHx8IHJpX2hlYWQoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBBTFBIQToKKwkgICAgaWYgKCFyaV9hbHBoYShjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIE5BTFBIQToKKwkgICAgaWYgKGMgPT0gTlVMIHx8IHJpX2FscGhhKGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTE9XRVI6CisJICAgIGlmICghcmlfbG93ZXIoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBOTE9XRVI6CisJICAgIGlmIChjID09IE5VTCB8fCByaV9sb3dlcihjKSkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBBRFZBTkNFX1JFR0lOUFVUKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFVQUEVSOgorCSAgICBpZiAoIXJpX3VwcGVyKGMpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgTlVQUEVSOgorCSAgICBpZiAoYyA9PSBOVUwgfHwgcmlfdXBwZXIoYykpCisJCXJldHVybiBGQUxTRTsKKwkgICAgQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBFWEFDVExZOgorCSAgICB7CisJCWludAlsZW47CisJCWNoYXJfdQkqb3BuZDsKKworCQlvcG5kID0gT1BFUkFORChzY2FuKTsKKwkJLyogSW5saW5lIHRoZSBmaXJzdCBieXRlLCBmb3Igc3BlZWQuICovCisJCWlmICgqb3BuZCAhPSAqcmVnaW5wdXQKKwkJCSYmICghaXJlZ19pYyB8fCAoCisjaWZkZWYgRkVBVF9NQllURQorCQkJICAgICFlbmNfdXRmOCAmJgorI2VuZGlmCisJCQkgICAgVE9MT1dFUl9MT0MoKm9wbmQpICE9IFRPTE9XRVJfTE9DKCpyZWdpbnB1dCkpKSkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkJaWYgKCpvcG5kID09IE5VTCkKKwkJeworCQkgICAgLyogbWF0Y2ggZW1wdHkgc3RyaW5nIGFsd2F5cyB3b3JrczsgaGFwcGVucyB3aGVuICJ+IiBpcworCQkgICAgICogZW1wdHkuICovCisJCX0KKwkJZWxzZSBpZiAob3BuZFsxXSA9PSBOVUwKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkgICAgJiYgIShlbmNfdXRmOCAmJiBpcmVnX2ljKQorI2VuZGlmCisJCQkpCisJCSAgICArK3JlZ2lucHV0OwkJLyogbWF0Y2hlZCBhIHNpbmdsZSBjaGFyICovCisJCWVsc2UKKwkJeworCQkgICAgbGVuID0gKGludClTVFJMRU4ob3BuZCk7CisJCSAgICAvKiBOZWVkIHRvIG1hdGNoIGZpcnN0IGJ5dGUgYWdhaW4gZm9yIG11bHRpLWJ5dGUuICovCisJCSAgICBpZiAoY3N0cm5jbXAob3BuZCwgcmVnaW5wdXQsICZsZW4pICE9IDApCisJCQlyZXR1cm4gRkFMU0U7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgLyogQ2hlY2sgZm9yIGZvbGxvd2luZyBjb21wb3NpbmcgY2hhcmFjdGVyLiAqLworCQkgICAgaWYgKGVuY191dGY4ICYmIFVURl9DT01QT1NJTkdMSUtFKHJlZ2lucHV0LCByZWdpbnB1dCArIGxlbikpCisJCSAgICB7CisJCQkvKiByYWFyb246IFRoaXMgY29kZSBtYWtlcyBhIGNvbXBvc2luZyBjaGFyYWN0ZXIgZ2V0CisJCQkgKiBpZ25vcmVkLCB3aGljaCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciAoc29tZXRpbWVzKQorCQkJICogZm9yIHZvd2VsZWQgSGVicmV3IHRleHRzLiAqLworCQkJaWYgKCFpcmVnX2ljb21iaW5lKQorCQkJICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkgICAgcmVnaW5wdXQgKz0gbGVuOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQU5ZT0Y6CisJICBjYXNlIEFOWUJVVDoKKwkgICAgaWYgKGMgPT0gTlVMKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGlmICgoY3N0cmNocihPUEVSQU5EKHNjYW4pLCBjKSA9PSBOVUxMKSA9PSAob3AgPT0gQU5ZT0YpKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIEFEVkFOQ0VfUkVHSU5QVVQoKTsKKwkgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJICBjYXNlIE1VTFRJQllURUNPREU6CisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJaW50CWksIGxlbjsKKwkJY2hhcl91CSpvcG5kOworCisJCW9wbmQgPSBPUEVSQU5EKHNjYW4pOworCQkvKiBTYWZldHkgY2hlY2sgKGp1c3QgaW4gY2FzZSAnZW5jb2RpbmcnIHdhcyBjaGFuZ2VkIHNpbmNlCisJCSAqIGNvbXBpbGluZyB0aGUgcHJvZ3JhbSkuICovCisJCWlmICgobGVuID0gKCptYl9wdHIybGVuX2NoZWNrKShvcG5kKSkgPCAyKQorCQkgICAgcmV0dXJuIEZBTFNFOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCSAgICBpZiAob3BuZFtpXSAhPSByZWdpbnB1dFtpXSkKKwkJCXJldHVybiBGQUxTRTsKKwkJcmVnaW5wdXQgKz0gbGVuOworCSAgICB9CisJICAgIGVsc2UKKwkJcmV0dXJuIEZBTFNFOworCSAgICBicmVhazsKKyNlbmRpZgorCisJICBjYXNlIE5PVEhJTkc6CisJICAgIGJyZWFrOworCisJICBjYXNlIEJBQ0s6CisJICAgIGJyZWFrOworCisJICBjYXNlIE1PUEVOICsgMDogICAvKiBNYXRjaCBzdGFydDogXHpzICovCisJICBjYXNlIE1PUEVOICsgMTogICAvKiBcKCAqLworCSAgY2FzZSBNT1BFTiArIDI6CisJICBjYXNlIE1PUEVOICsgMzoKKwkgIGNhc2UgTU9QRU4gKyA0OgorCSAgY2FzZSBNT1BFTiArIDU6CisJICBjYXNlIE1PUEVOICsgNjoKKwkgIGNhc2UgTU9QRU4gKyA3OgorCSAgY2FzZSBNT1BFTiArIDg6CisJICBjYXNlIE1PUEVOICsgOToKKwkgICAgeworCQlpbnQJCW5vOworCQlzYXZlX3NlX1QJc2F2ZTsKKworCQlubyA9IG9wIC0gTU9QRU47CisJCWNsZWFudXBfc3ViZXhwcigpOworCQlzYXZlX3NlKCZzYXZlLCAmcmVnX3N0YXJ0cG9zW25vXSwgJnJlZ19zdGFydHBbbm9dKTsKKworCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCSAgICByZXR1cm4gVFJVRTsKKworCQlyZXN0b3JlX3NlKCZzYXZlLCAmcmVnX3N0YXJ0cG9zW25vXSwgJnJlZ19zdGFydHBbbm9dKTsKKwkJcmV0dXJuIEZBTFNFOworCSAgICB9CisJICAgIC8qIGJyZWFrOyBOb3QgUmVhY2hlZCAqLworCisJICBjYXNlIE5PUEVOOgkgICAgLyogXCUoICovCisJICBjYXNlIE5DTE9TRToJICAgIC8qIFwpIGFmdGVyIFwlKCAqLworCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCSAgICByZXR1cm4gVFJVRTsKKwkJcmV0dXJuIEZBTFNFOworCQkvKiBicmVhazsgTm90IFJlYWNoZWQgKi8KKworI2lmZGVmIEZFQVRfU1lOX0hMCisJICBjYXNlIFpPUEVOICsgMToKKwkgIGNhc2UgWk9QRU4gKyAyOgorCSAgY2FzZSBaT1BFTiArIDM6CisJICBjYXNlIFpPUEVOICsgNDoKKwkgIGNhc2UgWk9QRU4gKyA1OgorCSAgY2FzZSBaT1BFTiArIDY6CisJICBjYXNlIFpPUEVOICsgNzoKKwkgIGNhc2UgWk9QRU4gKyA4OgorCSAgY2FzZSBaT1BFTiArIDk6CisJICAgIHsKKwkJaW50CQlubzsKKwkJc2F2ZV9zZV9UCXNhdmU7CisKKwkJbm8gPSBvcCAtIFpPUEVOOworCQljbGVhbnVwX3pzdWJleHByKCk7CisJCXNhdmVfc2UoJnNhdmUsICZyZWdfc3RhcnR6cG9zW25vXSwgJnJlZ19zdGFydHpwW25vXSk7CisKKwkJaWYgKHJlZ21hdGNoKG5leHQpKQorCQkgICAgcmV0dXJuIFRSVUU7CisKKwkJcmVzdG9yZV9zZSgmc2F2ZSwgJnJlZ19zdGFydHpwb3Nbbm9dLCAmcmVnX3N0YXJ0enBbbm9dKTsKKwkJcmV0dXJuIEZBTFNFOworCSAgICB9CisJICAgIC8qIGJyZWFrOyBOb3QgUmVhY2hlZCAqLworI2VuZGlmCisKKwkgIGNhc2UgTUNMT1NFICsgMDogIC8qIE1hdGNoIGVuZDogXHplICovCisJICBjYXNlIE1DTE9TRSArIDE6ICAvKiBcKSAqLworCSAgY2FzZSBNQ0xPU0UgKyAyOgorCSAgY2FzZSBNQ0xPU0UgKyAzOgorCSAgY2FzZSBNQ0xPU0UgKyA0OgorCSAgY2FzZSBNQ0xPU0UgKyA1OgorCSAgY2FzZSBNQ0xPU0UgKyA2OgorCSAgY2FzZSBNQ0xPU0UgKyA3OgorCSAgY2FzZSBNQ0xPU0UgKyA4OgorCSAgY2FzZSBNQ0xPU0UgKyA5OgorCSAgICB7CisJCWludAkJbm87CisJCXNhdmVfc2VfVAlzYXZlOworCisJCW5vID0gb3AgLSBNQ0xPU0U7CisJCWNsZWFudXBfc3ViZXhwcigpOworCQlzYXZlX3NlKCZzYXZlLCAmcmVnX2VuZHBvc1tub10sICZyZWdfZW5kcFtub10pOworCisJCWlmIChyZWdtYXRjaChuZXh0KSkKKwkJICAgIHJldHVybiBUUlVFOworCisJCXJlc3RvcmVfc2UoJnNhdmUsICZyZWdfZW5kcG9zW25vXSwgJnJlZ19lbmRwW25vXSk7CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICAvKiBicmVhazsgTm90IFJlYWNoZWQgKi8KKworI2lmZGVmIEZFQVRfU1lOX0hMCisJICBjYXNlIFpDTE9TRSArIDE6ICAvKiBcKSBhZnRlciBceiggKi8KKwkgIGNhc2UgWkNMT1NFICsgMjoKKwkgIGNhc2UgWkNMT1NFICsgMzoKKwkgIGNhc2UgWkNMT1NFICsgNDoKKwkgIGNhc2UgWkNMT1NFICsgNToKKwkgIGNhc2UgWkNMT1NFICsgNjoKKwkgIGNhc2UgWkNMT1NFICsgNzoKKwkgIGNhc2UgWkNMT1NFICsgODoKKwkgIGNhc2UgWkNMT1NFICsgOToKKwkgICAgeworCQlpbnQJCW5vOworCQlzYXZlX3NlX1QJc2F2ZTsKKworCQlubyA9IG9wIC0gWkNMT1NFOworCQljbGVhbnVwX3pzdWJleHByKCk7CisJCXNhdmVfc2UoJnNhdmUsICZyZWdfZW5kenBvc1tub10sICZyZWdfZW5kenBbbm9dKTsKKworCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCSAgICByZXR1cm4gVFJVRTsKKworCQlyZXN0b3JlX3NlKCZzYXZlLCAmcmVnX2VuZHpwb3Nbbm9dLCAmcmVnX2VuZHpwW25vXSk7CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCSAgICAvKiBicmVhazsgTm90IFJlYWNoZWQgKi8KKyNlbmRpZgorCisJICBjYXNlIEJBQ0tSRUYgKyAxOgorCSAgY2FzZSBCQUNLUkVGICsgMjoKKwkgIGNhc2UgQkFDS1JFRiArIDM6CisJICBjYXNlIEJBQ0tSRUYgKyA0OgorCSAgY2FzZSBCQUNLUkVGICsgNToKKwkgIGNhc2UgQkFDS1JFRiArIDY6CisJICBjYXNlIEJBQ0tSRUYgKyA3OgorCSAgY2FzZSBCQUNLUkVGICsgODoKKwkgIGNhc2UgQkFDS1JFRiArIDk6CisJICAgIHsKKwkJaW50CQlubzsKKwkJaW50CQlsZW47CisJCWxpbmVucl9UCWNsbnVtOworCQljb2xucl9UCQljY29sOworCQljaGFyX3UJCSpwOworCisJCW5vID0gb3AgLSBCQUNLUkVGOworCQljbGVhbnVwX3N1YmV4cHIoKTsKKwkJaWYgKCFSRUdfTVVMVEkpCQkvKiBTaW5nbGUtbGluZSByZWdleHAgKi8KKwkJeworCQkgICAgaWYgKHJlZ19lbmRwW25vXSA9PSBOVUxMKQorCQkgICAgeworCQkJLyogQmFja3JlZiB3YXMgbm90IHNldDogTWF0Y2ggYW4gZW1wdHkgc3RyaW5nLiAqLworCQkJbGVuID0gMDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIENvbXBhcmUgY3VycmVudCBpbnB1dCB3aXRoIGJhY2stcmVmIGluIHRoZSBzYW1lCisJCQkgKiBsaW5lLiAqLworCQkJbGVuID0gKGludCkocmVnX2VuZHBbbm9dIC0gcmVnX3N0YXJ0cFtub10pOworCQkJaWYgKGNzdHJuY21wKHJlZ19zdGFydHBbbm9dLCByZWdpbnB1dCwgJmxlbikgIT0gMCkKKwkJCSAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCX0KKwkJZWxzZQkJCQkvKiBNdWx0aS1saW5lIHJlZ2V4cCAqLworCQl7CisJCSAgICBpZiAocmVnX2VuZHBvc1tub10ubG51bSA8IDApCisJCSAgICB7CisJCQkvKiBCYWNrcmVmIHdhcyBub3Qgc2V0OiBNYXRjaCBhbiBlbXB0eSBzdHJpbmcuICovCisJCQlsZW4gPSAwOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJaWYgKHJlZ19zdGFydHBvc1tub10ubG51bSA9PSByZWdsbnVtCisJCQkJJiYgcmVnX2VuZHBvc1tub10ubG51bSA9PSByZWdsbnVtKQorCQkJeworCQkJICAgIC8qIENvbXBhcmUgYmFjay1yZWYgd2l0aGluIHRoZSBjdXJyZW50IGxpbmUuICovCisJCQkgICAgbGVuID0gcmVnX2VuZHBvc1tub10uY29sIC0gcmVnX3N0YXJ0cG9zW25vXS5jb2w7CisJCQkgICAgaWYgKGNzdHJuY21wKHJlZ2xpbmUgKyByZWdfc3RhcnRwb3Nbbm9dLmNvbCwKKwkJCQkJCQkgIHJlZ2lucHV0LCAmbGVuKSAhPSAwKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICAvKiBNZXNzeSBzaXR1YXRpb246IE5lZWQgdG8gY29tcGFyZSBiZXR3ZWVuIHR3bworCQkJICAgICAqIGxpbmVzLiAqLworCQkJICAgIGNjb2wgPSByZWdfc3RhcnRwb3Nbbm9dLmNvbDsKKwkJCSAgICBjbG51bSA9IHJlZ19zdGFydHBvc1tub10ubG51bTsKKwkJCSAgICBmb3IgKDs7KQorCQkJICAgIHsKKwkJCQkvKiBTaW5jZSBnZXR0aW5nIG9uZSBsaW5lIG1heSBpbnZhbGlkYXRlCisJCQkJICogdGhlIG90aGVyLCBuZWVkIHRvIG1ha2UgY29weS4gIFNsb3chICovCisJCQkJaWYgKHJlZ2xpbmUgIT0gcmVnX3RvZnJlZSkKKwkJCQl7CisJCQkJICAgIGxlbiA9IChpbnQpU1RSTEVOKHJlZ2xpbmUpOworCQkJCSAgICBpZiAocmVnX3RvZnJlZSA9PSBOVUxMCisJCQkJCQkgfHwgbGVuID49IChpbnQpcmVnX3RvZnJlZWxlbikKKwkJCQkgICAgeworCQkJCQlsZW4gKz0gNTA7CS8qIGdldCBzb21lIGV4dHJhICovCisJCQkJCXZpbV9mcmVlKHJlZ190b2ZyZWUpOworCQkJCQlyZWdfdG9mcmVlID0gYWxsb2MobGVuKTsKKwkJCQkJaWYgKHJlZ190b2ZyZWUgPT0gTlVMTCkKKwkJCQkJICAgIHJldHVybiBGQUxTRTsgLyogb3V0IG9mIG1lbW9yeSEgKi8KKwkJCQkJcmVnX3RvZnJlZWxlbiA9IGxlbjsKKwkJCQkgICAgfQorCQkJCSAgICBTVFJDUFkocmVnX3RvZnJlZSwgcmVnbGluZSk7CisJCQkJICAgIHJlZ2lucHV0ID0gcmVnX3RvZnJlZQorCQkJCQkJICAgICAgICsgKHJlZ2lucHV0IC0gcmVnbGluZSk7CisJCQkJICAgIHJlZ2xpbmUgPSByZWdfdG9mcmVlOworCQkJCX0KKworCQkJCS8qIEdldCB0aGUgbGluZSB0byBjb21wYXJlIHdpdGguICovCisJCQkJcCA9IHJlZ19nZXRsaW5lKGNsbnVtKTsKKwkJCQlpZiAoY2xudW0gPT0gcmVnX2VuZHBvc1tub10ubG51bSkKKwkJCQkgICAgbGVuID0gcmVnX2VuZHBvc1tub10uY29sIC0gY2NvbDsKKwkJCQllbHNlCisJCQkJICAgIGxlbiA9IChpbnQpU1RSTEVOKHAgKyBjY29sKTsKKworCQkJCWlmIChjc3RybmNtcChwICsgY2NvbCwgcmVnaW5wdXQsICZsZW4pICE9IDApCisJCQkJICAgIHJldHVybiBGQUxTRTsJLyogZG9lc24ndCBtYXRjaCAqLworCQkJCWlmIChjbG51bSA9PSByZWdfZW5kcG9zW25vXS5sbnVtKQorCQkJCSAgICBicmVhazsJCS8qIG1hdGNoIGFuZCBhdCBlbmQhICovCisJCQkJaWYgKHJlZ2xudW0gPT0gcmVnX21heGxpbmUpCisJCQkJICAgIHJldHVybiBGQUxTRTsJLyogdGV4dCB0b28gc2hvcnQgKi8KKworCQkJCS8qIEFkdmFuY2UgdG8gbmV4dCBsaW5lLiAqLworCQkJCXJlZ19uZXh0bGluZSgpOworCQkJCSsrY2xudW07CisJCQkJY2NvbCA9IDA7CisJCQkJaWYgKGdvdF9pbnQgfHwgb3V0X29mX3N0YWNrKQorCQkJCSAgICByZXR1cm4gRkFMU0U7CisJCQkgICAgfQorCisJCQkgICAgLyogZm91bmQgYSBtYXRjaCEgIE5vdGUgdGhhdCByZWdsaW5lIG1heSBub3cgcG9pbnQKKwkJCSAgICAgKiB0byBhIGNvcHkgb2YgdGhlIGxpbmUsIHRoYXQgc2hvdWxkIG5vdCBtYXR0ZXIuICovCisJCQl9CisJCSAgICB9CisJCX0KKworCQkvKiBNYXRjaGVkIHRoZSBiYWNrcmVmLCBza2lwIG92ZXIgaXQuICovCisJCXJlZ2lucHV0ICs9IGxlbjsKKwkgICAgfQorCSAgICBicmVhazsKKworI2lmZGVmIEZFQVRfU1lOX0hMCisJICBjYXNlIFpSRUYgKyAxOgorCSAgY2FzZSBaUkVGICsgMjoKKwkgIGNhc2UgWlJFRiArIDM6CisJICBjYXNlIFpSRUYgKyA0OgorCSAgY2FzZSBaUkVGICsgNToKKwkgIGNhc2UgWlJFRiArIDY6CisJICBjYXNlIFpSRUYgKyA3OgorCSAgY2FzZSBaUkVGICsgODoKKwkgIGNhc2UgWlJFRiArIDk6CisJICAgIHsKKwkJaW50CW5vOworCQlpbnQJbGVuOworCisJCWNsZWFudXBfenN1YmV4cHIoKTsKKwkJbm8gPSBvcCAtIFpSRUY7CisJCWlmIChyZV9leHRtYXRjaF9pbiAhPSBOVUxMCisJCQkmJiByZV9leHRtYXRjaF9pbi0+bWF0Y2hlc1tub10gIT0gTlVMTCkKKwkJeworCQkgICAgbGVuID0gKGludClTVFJMRU4ocmVfZXh0bWF0Y2hfaW4tPm1hdGNoZXNbbm9dKTsKKwkJICAgIGlmIChjc3RybmNtcChyZV9leHRtYXRjaF9pbi0+bWF0Y2hlc1tub10sCisJCQkJCQkJICByZWdpbnB1dCwgJmxlbikgIT0gMCkKKwkJCXJldHVybiBGQUxTRTsKKwkJICAgIHJlZ2lucHV0ICs9IGxlbjsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIEJhY2tyZWYgd2FzIG5vdCBzZXQ6IE1hdGNoIGFuIGVtcHR5IHN0cmluZy4gKi8KKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisKKwkgIGNhc2UgQlJBTkNIOgorCSAgICB7CisJCWlmIChPUChuZXh0KSAhPSBCUkFOQ0gpIC8qIE5vIGNob2ljZS4gKi8KKwkJICAgIG5leHQgPSBPUEVSQU5EKHNjYW4pOwkvKiBBdm9pZCByZWN1cnNpb24uICovCisJCWVsc2UKKwkJeworCQkgICAgcmVnc2F2ZV9UCXNhdmU7CisKKwkJICAgIGRvCisJCSAgICB7CisJCQlyZWdfc2F2ZSgmc2F2ZSk7CisJCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkpCisJCQkgICAgcmV0dXJuIFRSVUU7CisJCQlyZWdfcmVzdG9yZSgmc2F2ZSk7CisJCQlzY2FuID0gcmVnbmV4dChzY2FuKTsKKwkJICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiBPUChzY2FuKSA9PSBCUkFOQ0gpOworCQkgICAgcmV0dXJuIEZBTFNFOworCQkgICAgLyogTk9UUkVBQ0hFRCAqLworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQlJBQ0VfTElNSVRTOgorCSAgICB7CisJCWludAlubzsKKworCQlpZiAoT1AobmV4dCkgPT0gQlJBQ0VfU0lNUExFKQorCQl7CisJCSAgICBibF9taW52YWwgPSBPUEVSQU5EX01JTihzY2FuKTsKKwkJICAgIGJsX21heHZhbCA9IE9QRVJBTkRfTUFYKHNjYW4pOworCQl9CisJCWVsc2UgaWYgKE9QKG5leHQpID49IEJSQUNFX0NPTVBMRVgKKwkJCSYmIE9QKG5leHQpIDwgQlJBQ0VfQ09NUExFWCArIDEwKQorCQl7CisJCSAgICBubyA9IE9QKG5leHQpIC0gQlJBQ0VfQ09NUExFWDsKKwkJICAgIGJyYWNlX21pbltub10gPSBPUEVSQU5EX01JTihzY2FuKTsKKwkJICAgIGJyYWNlX21heFtub10gPSBPUEVSQU5EX01BWChzY2FuKTsKKwkJICAgIGJyYWNlX2NvdW50W25vXSA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBFTVNHKF8oZV9pbnRlcm5hbCkpOwkgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLworCQkgICAgcmV0dXJuIEZBTFNFOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDA6CisJICBjYXNlIEJSQUNFX0NPTVBMRVggKyAxOgorCSAgY2FzZSBCUkFDRV9DT01QTEVYICsgMjoKKwkgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDM6CisJICBjYXNlIEJSQUNFX0NPTVBMRVggKyA0OgorCSAgY2FzZSBCUkFDRV9DT01QTEVYICsgNToKKwkgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDY6CisJICBjYXNlIEJSQUNFX0NPTVBMRVggKyA3OgorCSAgY2FzZSBCUkFDRV9DT01QTEVYICsgODoKKwkgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDk6CisJICAgIHsKKwkJaW50CQlubzsKKwkJcmVnc2F2ZV9UCXNhdmU7CisKKwkJbm8gPSBvcCAtIEJSQUNFX0NPTVBMRVg7CisJCSsrYnJhY2VfY291bnRbbm9dOworCisJCS8qIElmIG5vdCBtYXRjaGVkIGVub3VnaCB0aW1lcyB5ZXQsIHRyeSBvbmUgbW9yZSAqLworCQlpZiAoYnJhY2VfY291bnRbbm9dIDw9IChicmFjZV9taW5bbm9dIDw9IGJyYWNlX21heFtub10KKwkJCQkgICAgPyBicmFjZV9taW5bbm9dIDogYnJhY2VfbWF4W25vXSkpCisJCXsKKwkJICAgIHJlZ19zYXZlKCZzYXZlKTsKKwkJICAgIGlmIChyZWdtYXRjaChPUEVSQU5EKHNjYW4pKSkKKwkJCXJldHVybiBUUlVFOworCQkgICAgcmVnX3Jlc3RvcmUoJnNhdmUpOworCQkgICAgLS1icmFjZV9jb3VudFtub107CS8qIGZhaWxlZCwgZGVjcmVtZW50IG1hdGNoIGNvdW50ICovCisJCSAgICByZXR1cm4gRkFMU0U7CisJCX0KKworCQkvKiBJZiBtYXRjaGVkIGVub3VnaCB0aW1lcywgbWF5IHRyeSBtYXRjaGluZyBzb21lIG1vcmUgKi8KKwkJaWYgKGJyYWNlX21pbltub10gPD0gYnJhY2VfbWF4W25vXSkKKwkJeworCQkgICAgLyogUmFuZ2UgaXMgdGhlIG5vcm1hbCB3YXkgYXJvdW5kLCB1c2UgbG9uZ2VzdCBtYXRjaCAqLworCQkgICAgaWYgKGJyYWNlX2NvdW50W25vXSA8PSBicmFjZV9tYXhbbm9dKQorCQkgICAgeworCQkJcmVnX3NhdmUoJnNhdmUpOworCQkJaWYgKHJlZ21hdGNoKE9QRVJBTkQoc2NhbikpKQorCQkJICAgIHJldHVybiBUUlVFOwkvKiBtYXRjaGVkIHNvbWUgbW9yZSB0aW1lcyAqLworCQkJcmVnX3Jlc3RvcmUoJnNhdmUpOworCQkJLS1icmFjZV9jb3VudFtub107ICAvKiBtYXRjaGVkIGp1c3QgZW5vdWdoIHRpbWVzICovCisJCQkvKiBjb250aW51ZSB3aXRoIHRoZSBpdGVtcyBhZnRlciBce30gKi8KKwkJICAgIH0KKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIFJhbmdlIGlzIGJhY2t3YXJkcywgdXNlIHNob3J0ZXN0IG1hdGNoIGZpcnN0ICovCisJCSAgICBpZiAoYnJhY2VfY291bnRbbm9dIDw9IGJyYWNlX21pbltub10pCisJCSAgICB7CisJCQlyZWdfc2F2ZSgmc2F2ZSk7CisJCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCQkgICAgcmV0dXJuIFRSVUU7CisJCQlyZWdfcmVzdG9yZSgmc2F2ZSk7CisJCQluZXh0ID0gT1BFUkFORChzY2FuKTsKKwkJCS8qIG11c3QgdHJ5IHRvIG1hdGNoIG9uZSBtb3JlIGl0ZW0gKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIEJSQUNFX1NJTVBMRToKKwkgIGNhc2UgU1RBUjoKKwkgIGNhc2UgUExVUzoKKwkgICAgeworCQlpbnQJCW5leHRiOwkJLyogbmV4dCBieXRlICovCisJCWludAkJbmV4dGJfaWM7CS8qIG5leHQgYnl0ZSByZXZlcnNlIGNhc2UgKi8KKwkJbG9uZwkJY291bnQ7CisJCXJlZ3NhdmVfVAlzYXZlOworCQlsb25nCQltaW52YWw7CisJCWxvbmcJCW1heHZhbDsKKworCQkvKgorCQkgKiBMb29rYWhlYWQgdG8gYXZvaWQgdXNlbGVzcyBtYXRjaCBhdHRlbXB0cyB3aGVuIHdlIGtub3cKKwkJICogd2hhdCBjaGFyYWN0ZXIgY29tZXMgbmV4dC4KKwkJICovCisJCWlmIChPUChuZXh0KSA9PSBFWEFDVExZKQorCQl7CisJCSAgICBuZXh0YiA9ICpPUEVSQU5EKG5leHQpOworCQkgICAgaWYgKGlyZWdfaWMpCisJCSAgICB7CisJCQlpZiAoaXN1cHBlcihuZXh0YikpCisJCQkgICAgbmV4dGJfaWMgPSBUT0xPV0VSX0xPQyhuZXh0Yik7CisJCQllbHNlCisJCQkgICAgbmV4dGJfaWMgPSBUT1VQUEVSX0xPQyhuZXh0Yik7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQluZXh0Yl9pYyA9IG5leHRiOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgbmV4dGIgPSBOVUw7CisJCSAgICBuZXh0Yl9pYyA9IE5VTDsKKwkJfQorCQlpZiAob3AgIT0gQlJBQ0VfU0lNUExFKQorCQl7CisJCSAgICBtaW52YWwgPSAob3AgPT0gU1RBUikgPyAwIDogMTsKKwkJICAgIG1heHZhbCA9IE1BWF9MSU1JVDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIG1pbnZhbCA9IGJsX21pbnZhbDsKKwkJICAgIG1heHZhbCA9IGJsX21heHZhbDsKKwkJfQorCisJCS8qCisJCSAqIFdoZW4gbWF4dmFsID4gbWludmFsLCB0cnkgbWF0Y2hpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdXAKKwkJICogdG8gbWF4dmFsLiAgV2hlbiBtYXh2YWwgPCBtaW52YWwsIHRyeSBtYXRjaGluZyBhdCBsZWFzdCB0aGUKKwkJICogbWluaW1hbCBudW1iZXIgKHNpbmNlIHRoZSByYW5nZSBpcyBiYWNrd2FyZHMsIHRoYXQncyBhbHNvCisJCSAqIG1heHZhbCEpLgorCQkgKi8KKwkJY291bnQgPSByZWdyZXBlYXQoT1BFUkFORChzY2FuKSwgbWF4dmFsKTsKKwkJaWYgKGdvdF9pbnQpCisJCSAgICByZXR1cm4gRkFMU0U7CisJCWlmIChtaW52YWwgPD0gbWF4dmFsKQorCQl7CisJCSAgICAvKiBSYW5nZSBpcyB0aGUgbm9ybWFsIHdheSBhcm91bmQsIHVzZSBsb25nZXN0IG1hdGNoICovCisJCSAgICB3aGlsZSAoY291bnQgPj0gbWludmFsKQorCQkgICAgeworCQkJLyogSWYgaXQgY291bGQgbWF0Y2gsIHRyeSBpdC4gKi8KKwkJCWlmIChuZXh0YiA9PSBOVUwgfHwgKnJlZ2lucHV0ID09IG5leHRiCisJCQkJCQkgICAgfHwgKnJlZ2lucHV0ID09IG5leHRiX2ljKQorCQkJeworCQkJICAgIHJlZ19zYXZlKCZzYXZlKTsKKwkJCSAgICBpZiAocmVnbWF0Y2gobmV4dCkpCisJCQkJcmV0dXJuIFRSVUU7CisJCQkgICAgcmVnX3Jlc3RvcmUoJnNhdmUpOworCQkJfQorCQkJLyogQ291bGRuJ3Qgb3IgZGlkbid0IG1hdGNoIC0tIGJhY2sgdXAgb25lIGNoYXIuICovCisJCQlpZiAoLS1jb3VudCA8IG1pbnZhbCkKKwkJCSAgICBicmVhazsKKwkJCWlmIChyZWdpbnB1dCA9PSByZWdsaW5lKQorCQkJeworCQkJICAgIC8qIGJhY2t1cCB0byBsYXN0IGNoYXIgb2YgcHJldmlvdXMgbGluZSAqLworCQkJICAgIC0tcmVnbG51bTsKKwkJCSAgICByZWdsaW5lID0gcmVnX2dldGxpbmUocmVnbG51bSk7CisJCQkgICAgLyogSnVzdCBpbiBjYXNlIHJlZ3JlcGVhdCgpIGRpZG4ndCBjb3VudCByaWdodC4gKi8KKwkJCSAgICBpZiAocmVnbGluZSA9PSBOVUxMKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCSAgICByZWdpbnB1dCA9IHJlZ2xpbmUgKyBTVFJMRU4ocmVnbGluZSk7CisJCQkgICAgZmFzdF9icmVha2NoZWNrKCk7CisJCQkgICAgaWYgKGdvdF9pbnQgfHwgb3V0X29mX3N0YWNrKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICAtLXJlZ2lucHV0OworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJCXJlZ2lucHV0IC09ICgqbWJfaGVhZF9vZmYpKHJlZ2xpbmUsIHJlZ2lucHV0KTsKKyNlbmRpZgorCQkJfQorCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyogUmFuZ2UgaXMgYmFja3dhcmRzLCB1c2Ugc2hvcnRlc3QgbWF0Y2ggZmlyc3QuCisJCSAgICAgKiBDYXJlZnVsOiBtYXh2YWwgYW5kIG1pbnZhbCBhcmUgZXhjaGFuZ2VkISAqLworCQkgICAgaWYgKGNvdW50IDwgbWF4dmFsKQorCQkJcmV0dXJuIEZBTFNFOworCQkgICAgZm9yICg7OykKKwkJICAgIHsKKwkJCS8qIElmIGl0IGNvdWxkIHdvcmssIHRyeSBpdC4gKi8KKwkJCWlmIChuZXh0YiA9PSBOVUwgfHwgKnJlZ2lucHV0ID09IG5leHRiCisJCQkJCQkgICAgfHwgKnJlZ2lucHV0ID09IG5leHRiX2ljKQorCQkJeworCQkJICAgIHJlZ19zYXZlKCZzYXZlKTsKKwkJCSAgICBpZiAocmVnbWF0Y2gobmV4dCkpCisJCQkJcmV0dXJuIFRSVUU7CisJCQkgICAgcmVnX3Jlc3RvcmUoJnNhdmUpOworCQkJfQorCQkJLyogQ291bGRuJ3Qgb3IgZGlkbid0IG1hdGNoOiB0cnkgYWR2YW5jaW5nIG9uZSBjaGFyLiAqLworCQkJaWYgKGNvdW50ID09IG1pbnZhbAorCQkJCQkgfHwgcmVncmVwZWF0KE9QRVJBTkQoc2NhbiksIDFMKSA9PSAwKQorCQkJICAgIGJyZWFrOworCQkJKytjb3VudDsKKwkJCWlmIChnb3RfaW50IHx8IG91dF9vZl9zdGFjaykKKwkJCSAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCSAgICB9CisJICAgIC8qIGJyZWFrOyBOb3QgUmVhY2hlZCAqLworCisJICBjYXNlIE5PTUFUQ0g6CisJICAgIHsKKwkJcmVnc2F2ZV9UCXNhdmU7CisKKwkJLyogSWYgdGhlIG9wZXJhbmQgbWF0Y2hlcywgd2UgZmFpbC4gIE90aGVyd2lzZSBiYWNrdXAgYW5kCisJCSAqIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgaXRlbS4gKi8KKwkJcmVnX3NhdmUoJnNhdmUpOworCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkpCisJCSAgICByZXR1cm4gRkFMU0U7CisJCXJlZ19yZXN0b3JlKCZzYXZlKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSBNQVRDSDoKKwkgIGNhc2UgU1VCUEFUOgorCSAgICB7CisJCXJlZ3NhdmVfVAlzYXZlOworCisJCS8qIElmIHRoZSBvcGVyYW5kIGRvZXNuJ3QgbWF0Y2gsIHdlIGZhaWwuICBPdGhlcndpc2UgYmFja3VwCisJCSAqIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGl0ZW0uICovCisJCXJlZ19zYXZlKCZzYXZlKTsKKwkJaWYgKCFyZWdtYXRjaChPUEVSQU5EKHNjYW4pKSkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkJaWYgKG9wID09IE1BVENIKQkgICAgLyogemVyby13aWR0aCAqLworCQkgICAgcmVnX3Jlc3RvcmUoJnNhdmUpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIEJFSElORDoKKwkgIGNhc2UgTk9CRUhJTkQ6CisJICAgIHsKKwkJcmVnc2F2ZV9UCXNhdmVfYWZ0ZXIsIHNhdmVfc3RhcnQ7CisJCXJlZ3NhdmVfVAlzYXZlX2JlaGluZF9wb3M7CisJCWludAkJbmVlZG1hdGNoID0gKG9wID09IEJFSElORCk7CisKKwkJLyoKKwkJICogTG9vayBiYWNrIGluIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmFuZCBtYXRjaGVzIG9yIG5vdC4gVGhpcworCQkgKiBtdXN0IGJlIGRvbmUgYXQgZXZlcnkgcG9zaXRpb24gaW4gdGhlIGlucHV0IGFuZCBjaGVja2luZyBpZgorCQkgKiB0aGUgbWF0Y2ggZW5kcyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKwkJICogRmlyc3QgY2hlY2sgaWYgdGhlIG5leHQgaXRlbSBtYXRjaGVzLCB0aGF0J3MgcHJvYmFibHkKKwkJICogZmFzdGVyLgorCQkgKi8KKwkJcmVnX3NhdmUoJnNhdmVfc3RhcnQpOworCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCXsKKwkJICAgIC8qIHNhdmUgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSBmb3VuZCBtYXRjaCBmb3IgbmV4dCAqLworCQkgICAgcmVnX3NhdmUoJnNhdmVfYWZ0ZXIpOworCisJCSAgICAvKiBzdGFydCBsb29raW5nIGZvciBhIG1hdGNoIHdpdGggb3BlcmFuZCBhdCB0aGUgY3VycmVudAorCQkgICAgICogcG9zdGlvbi4gIEdvIGJhY2sgb25lIGNoYXJhY3RlciB1bnRpbCB3ZSBmaW5kIHRoZQorCQkgICAgICogcmVzdWx0LCBoaXR0aW5nIHRoZSBzdGFydCBvZiB0aGUgbGluZSBvciB0aGUgcHJldmlvdXMKKwkJICAgICAqIGxpbmUgKGZvciBtdWx0aS1saW5lIG1hdGNoaW5nKS4KKwkJICAgICAqIFNldCBiZWhpbmRfcG9zIHRvIHdoZXJlIHRoZSBtYXRjaCBzaG91bGQgZW5kLCBCSFBPUworCQkgICAgICogd2lsbCBtYXRjaCBpdC4gKi8KKwkJICAgIHNhdmVfYmVoaW5kX3BvcyA9IGJlaGluZF9wb3M7CisJCSAgICBiZWhpbmRfcG9zID0gc2F2ZV9zdGFydDsKKwkJICAgIGZvciAoOzspCisJCSAgICB7CisJCQlyZWdfcmVzdG9yZSgmc2F2ZV9zdGFydCk7CisJCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkKKwkJCQkmJiByZWdfc2F2ZV9lcXVhbCgmYmVoaW5kX3BvcykpCisJCQl7CisJCQkgICAgYmVoaW5kX3BvcyA9IHNhdmVfYmVoaW5kX3BvczsKKwkJCSAgICAvKiBmb3VuZCBhIG1hdGNoIHRoYXQgZW5kcyB3aGVyZSAibmV4dCIgc3RhcnRlZCAqLworCQkJICAgIGlmIChuZWVkbWF0Y2gpCisJCQkgICAgeworCQkJCXJlZ19yZXN0b3JlKCZzYXZlX2FmdGVyKTsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCSAgICB9CisJCQkgICAgcmV0dXJuIEZBTFNFOworCQkJfQorCQkJLyoKKwkJCSAqIE5vIG1hdGNoOiBHbyBiYWNrIG9uZSBjaGFyYWN0ZXIuICBNYXkgZ28gdG8KKwkJCSAqIHByZXZpb3VzIGxpbmUgb25jZS4KKwkJCSAqLworCQkJaWYgKFJFR19NVUxUSSkKKwkJCXsKKwkJCSAgICBpZiAoc2F2ZV9zdGFydC5yc191LnBvcy5jb2wgPT0gMCkKKwkJCSAgICB7CisJCQkJaWYgKHNhdmVfc3RhcnQucnNfdS5wb3MubG51bQorCQkJCQkJPCBiZWhpbmRfcG9zLnJzX3UucG9zLmxudW0KKwkJCQkJfHwgcmVnX2dldGxpbmUoCisJCQkJCSAgICAtLXNhdmVfc3RhcnQucnNfdS5wb3MubG51bSkgPT0gTlVMTCkKKwkJCQkgICAgYnJlYWs7CisJCQkJcmVnX3Jlc3RvcmUoJnNhdmVfc3RhcnQpOworCQkJCXNhdmVfc3RhcnQucnNfdS5wb3MuY29sID0KKwkJCQkJCSAgICAgKGNvbG5yX1QpU1RSTEVOKHJlZ2xpbmUpOworCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkJLS1zYXZlX3N0YXJ0LnJzX3UucG9zLmNvbDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBpZiAoc2F2ZV9zdGFydC5yc191LnB0ciA9PSByZWdsaW5lKQorCQkJCWJyZWFrOworCQkJICAgIC0tc2F2ZV9zdGFydC5yc191LnB0cjsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgLyogTk9CRUhJTkQgc3VjY2VlZHMgd2hlbiBubyBtYXRjaCB3YXMgZm91bmQgKi8KKwkJICAgIGJlaGluZF9wb3MgPSBzYXZlX2JlaGluZF9wb3M7CisJCSAgICBpZiAoIW5lZWRtYXRjaCkKKwkJICAgIHsKKwkJCXJlZ19yZXN0b3JlKCZzYXZlX2FmdGVyKTsKKwkJCXJldHVybiBUUlVFOworCQkgICAgfQorCQl9CisJCXJldHVybiBGQUxTRTsKKwkgICAgfQorCisJICBjYXNlIEJIUE9TOgorCSAgICBpZiAoUkVHX01VTFRJKQorCSAgICB7CisJCWlmIChiZWhpbmRfcG9zLnJzX3UucG9zLmNvbCAhPSAoY29sbnJfVCkocmVnaW5wdXQgLSByZWdsaW5lKQorCQkJfHwgYmVoaW5kX3Bvcy5yc191LnBvcy5sbnVtICE9IHJlZ2xudW0pCisJCSAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYmVoaW5kX3Bvcy5yc191LnB0ciAhPSByZWdpbnB1dCkKKwkJcmV0dXJuIEZBTFNFOworCSAgICBicmVhazsKKworCSAgY2FzZSBORVdMOgorCSAgICBpZiAoKGMgIT0gTlVMIHx8IHJlZ2xudW0gPT0gcmVnX21heGxpbmUpCisJCQkJCSAgICAgICYmIChjICE9ICdcbicgfHwgIXJlZ19saW5lX2xicikpCisJCXJldHVybiBGQUxTRTsKKwkgICAgaWYgKHJlZ19saW5lX2xicikKKwkJQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBlbHNlCisJCXJlZ19uZXh0bGluZSgpOworCSAgICBicmVhazsKKworCSAgY2FzZSBFTkQ6CisJICAgIHJldHVybiBUUlVFOwkvKiBTdWNjZXNzISAqLworCisJICBkZWZhdWx0OgorCSAgICBFTVNHKF8oZV9yZV9jb3JyKSk7CisjaWZkZWYgREVCVUcKKwkgICAgcHJpbnRmKCJJbGxlZ2FsIG9wIGNvZGUgJWRcbiIsIG9wKTsKKyNlbmRpZgorCSAgICByZXR1cm4gRkFMU0U7CisJICB9CisJfQorCisJc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBnZXQgaGVyZSBvbmx5IGlmIHRoZXJlJ3MgdHJvdWJsZSAtLSBub3JtYWxseSAiY2FzZSBFTkQiIGlzIHRoZQorICAgICAqIHRlcm1pbmF0aW5nIHBvaW50LgorICAgICAqLworICAgIEVNU0coXyhlX3JlX2NvcnIpKTsKKyNpZmRlZiBERUJVRworICAgIHByaW50ZigiUHJlbWF0dXJlIEVPTFxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBGRUFUX01CWVRFCisjIGRlZmluZSBBRFZBTkNFX1AoeCkgaWYgKGhhc19tYnl0ZSkgeCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHgpOyBlbHNlICsreAorI2Vsc2UKKyMgZGVmaW5lIEFEVkFOQ0VfUCh4KSArK3gKKyNlbmRpZgorCisvKgorICogcmVncmVwZWF0IC0gcmVwZWF0ZWRseSBtYXRjaCBzb21ldGhpbmcgc2ltcGxlLCByZXR1cm4gaG93IG1hbnkuCisgKiBBZHZhbmNlcyByZWdpbnB1dCAoYW5kIHJlZ2xudW0pIHRvIGp1c3QgYWZ0ZXIgdGhlIG1hdGNoZWQgY2hhcnMuCisgKi8KKyAgICBzdGF0aWMgaW50CityZWdyZXBlYXQocCwgbWF4Y291bnQpCisgICAgY2hhcl91CSpwOworICAgIGxvbmcJbWF4Y291bnQ7ICAgLyogbWF4aW11bSBudW1iZXIgb2YgbWF0Y2hlcyBhbGxvd2VkICovCit7CisgICAgbG9uZwljb3VudCA9IDA7CisgICAgY2hhcl91CSpzY2FuOworICAgIGNoYXJfdQkqb3BuZDsKKyAgICBpbnQJCW1hc2s7CisgICAgaW50CQl0ZXN0dmFsID0gMDsKKworICAgIHNjYW4gPSByZWdpbnB1dDsJICAgIC8qIE1ha2UgbG9jYWwgY29weSBvZiByZWdpbnB1dCBmb3Igc3BlZWQuICovCisgICAgb3BuZCA9IE9QRVJBTkQocCk7CisgICAgc3dpdGNoIChPUChwKSkKKyAgICB7CisgICAgICBjYXNlIEFOWToKKyAgICAgIGNhc2UgQU5ZICsgQUREX05MOgorCXdoaWxlIChjb3VudCA8IG1heGNvdW50KQorCXsKKwkgICAgLyogTWF0Y2hpbmcgYW55dGhpbmcgbWVhbnMgd2UgY29udGludWUgdW50aWwgZW5kLW9mLWxpbmUgKG9yCisJICAgICAqIGVuZC1vZi1maWxlIGZvciBBTlkgKyBBRERfTkwpLCBvbmx5IGxpbWl0ZWQgYnkgbWF4Y291bnQuICovCisJICAgIHdoaWxlICgqc2NhbiAhPSBOVUwgJiYgY291bnQgPCBtYXhjb3VudCkKKwkgICAgeworCQkrK2NvdW50OworCQlBRFZBTkNFX1Aoc2Nhbik7CisJICAgIH0KKwkgICAgaWYgKCFXSVRIX05MKE9QKHApKSB8fCByZWdsbnVtID09IHJlZ19tYXhsaW5lIHx8IGNvdW50ID09IG1heGNvdW50KQorCQlicmVhazsKKwkgICAgKytjb3VudDsJCS8qIGNvdW50IHRoZSBsaW5lLWJyZWFrICovCisJICAgIHJlZ19uZXh0bGluZSgpOworCSAgICBzY2FuID0gcmVnaW5wdXQ7CisJICAgIGlmIChnb3RfaW50KQorCQlicmVhazsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgSURFTlQ6CisgICAgICBjYXNlIElERU5UICsgQUREX05MOgorCXRlc3R2YWwgPSBUUlVFOworCS8qRkFMTFRIUk9VR0gqLworICAgICAgY2FzZSBTSURFTlQ6CisgICAgICBjYXNlIFNJREVOVCArIEFERF9OTDoKKwl3aGlsZSAoY291bnQgPCBtYXhjb3VudCkKKwl7CisJICAgIGlmICh2aW1faXNJRGMoKnNjYW4pICYmICh0ZXN0dmFsIHx8ICFWSU1fSVNESUdJVCgqc2NhbikpKQorCSAgICB7CisJCUFEVkFOQ0VfUChzY2FuKTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqc2NhbiA9PSBOVUwpCisJICAgIHsKKwkJaWYgKCFXSVRIX05MKE9QKHApKSB8fCByZWdsbnVtID09IHJlZ19tYXhsaW5lKQorCQkgICAgYnJlYWs7CisJCXJlZ19uZXh0bGluZSgpOworCQlzY2FuID0gcmVnaW5wdXQ7CisJCWlmIChnb3RfaW50KQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSBpZiAocmVnX2xpbmVfbGJyICYmICpzY2FuID09ICdcbicgJiYgV0lUSF9OTChPUChwKSkpCisJCSsrc2NhbjsKKwkgICAgZWxzZQorCQlicmVhazsKKwkgICAgKytjb3VudDsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgS1dPUkQ6CisgICAgICBjYXNlIEtXT1JEICsgQUREX05MOgorCXRlc3R2YWwgPSBUUlVFOworCS8qRkFMTFRIUk9VR0gqLworICAgICAgY2FzZSBTS1dPUkQ6CisgICAgICBjYXNlIFNLV09SRCArIEFERF9OTDoKKwl3aGlsZSAoY291bnQgPCBtYXhjb3VudCkKKwl7CisJICAgIGlmICh2aW1faXN3b3JkcChzY2FuKSAmJiAodGVzdHZhbCB8fCAhVklNX0lTRElHSVQoKnNjYW4pKSkKKwkgICAgeworCQlBRFZBTkNFX1Aoc2Nhbik7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnNjYW4gPT0gTlVMKQorCSAgICB7CisJCWlmICghV0lUSF9OTChPUChwKSkgfHwgcmVnbG51bSA9PSByZWdfbWF4bGluZSkKKwkJICAgIGJyZWFrOworCQlyZWdfbmV4dGxpbmUoKTsKKwkJc2NhbiA9IHJlZ2lucHV0OworCQlpZiAoZ290X2ludCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKHJlZ19saW5lX2xiciAmJiAqc2NhbiA9PSAnXG4nICYmIFdJVEhfTkwoT1AocCkpKQorCQkrK3NjYW47CisJICAgIGVsc2UKKwkJYnJlYWs7CisJICAgICsrY291bnQ7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlIEZOQU1FOgorICAgICAgY2FzZSBGTkFNRSArIEFERF9OTDoKKwl0ZXN0dmFsID0gVFJVRTsKKwkvKkZBTExUSFJPVUdIKi8KKyAgICAgIGNhc2UgU0ZOQU1FOgorICAgICAgY2FzZSBTRk5BTUUgKyBBRERfTkw6CisJd2hpbGUgKGNvdW50IDwgbWF4Y291bnQpCisJeworCSAgICBpZiAodmltX2lzZmlsZWMoKnNjYW4pICYmICh0ZXN0dmFsIHx8ICFWSU1fSVNESUdJVCgqc2NhbikpKQorCSAgICB7CisJCUFEVkFOQ0VfUChzY2FuKTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgqc2NhbiA9PSBOVUwpCisJICAgIHsKKwkJaWYgKCFXSVRIX05MKE9QKHApKSB8fCByZWdsbnVtID09IHJlZ19tYXhsaW5lKQorCQkgICAgYnJlYWs7CisJCXJlZ19uZXh0bGluZSgpOworCQlzY2FuID0gcmVnaW5wdXQ7CisJCWlmIChnb3RfaW50KQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSBpZiAocmVnX2xpbmVfbGJyICYmICpzY2FuID09ICdcbicgJiYgV0lUSF9OTChPUChwKSkpCisJCSsrc2NhbjsKKwkgICAgZWxzZQorCQlicmVhazsKKwkgICAgKytjb3VudDsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgUFJJTlQ6CisgICAgICBjYXNlIFBSSU5UICsgQUREX05MOgorCXRlc3R2YWwgPSBUUlVFOworCS8qRkFMTFRIUk9VR0gqLworICAgICAgY2FzZSBTUFJJTlQ6CisgICAgICBjYXNlIFNQUklOVCArIEFERF9OTDoKKwl3aGlsZSAoY291bnQgPCBtYXhjb3VudCkKKwl7CisJICAgIGlmICgqc2NhbiA9PSBOVUwpCisJICAgIHsKKwkJaWYgKCFXSVRIX05MKE9QKHApKSB8fCByZWdsbnVtID09IHJlZ19tYXhsaW5lKQorCQkgICAgYnJlYWs7CisJCXJlZ19uZXh0bGluZSgpOworCQlzY2FuID0gcmVnaW5wdXQ7CisJCWlmIChnb3RfaW50KQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSBpZiAocHRyMmNlbGxzKHNjYW4pID09IDEgJiYgKHRlc3R2YWwgfHwgIVZJTV9JU0RJR0lUKCpzY2FuKSkpCisJICAgIHsKKwkJQURWQU5DRV9QKHNjYW4pOworCSAgICB9CisJICAgIGVsc2UgaWYgKHJlZ19saW5lX2xiciAmJiAqc2NhbiA9PSAnXG4nICYmIFdJVEhfTkwoT1AocCkpKQorCQkrK3NjYW47CisJICAgIGVsc2UKKwkJYnJlYWs7CisJICAgICsrY291bnQ7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlIFdISVRFOgorICAgICAgY2FzZSBXSElURSArIEFERF9OTDoKKwl0ZXN0dmFsID0gbWFzayA9IFJJX1dISVRFOworZG9fY2xhc3M6CisJd2hpbGUgKGNvdW50IDwgbWF4Y291bnQpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaW50CQlsOworI2VuZGlmCisJICAgIGlmICgqc2NhbiA9PSBOVUwpCisJICAgIHsKKwkJaWYgKCFXSVRIX05MKE9QKHApKSB8fCByZWdsbnVtID09IHJlZ19tYXhsaW5lKQorCQkgICAgYnJlYWs7CisJCXJlZ19uZXh0bGluZSgpOworCQlzY2FuID0gcmVnaW5wdXQ7CisJCWlmIChnb3RfaW50KQorCQkgICAgYnJlYWs7CisJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGVsc2UgaWYgKGhhc19tYnl0ZSAmJiAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykoc2NhbikpID4gMSkKKwkgICAgeworCQlpZiAodGVzdHZhbCAhPSAwKQorCQkgICAgYnJlYWs7CisJCXNjYW4gKz0gbDsKKwkgICAgfQorI2VuZGlmCisJICAgIGVsc2UgaWYgKChjbGFzc190YWJbKnNjYW5dICYgbWFzaykgPT0gdGVzdHZhbCkKKwkJKytzY2FuOworCSAgICBlbHNlIGlmIChyZWdfbGluZV9sYnIgJiYgKnNjYW4gPT0gJ1xuJyAmJiBXSVRIX05MKE9QKHApKSkKKwkJKytzY2FuOworCSAgICBlbHNlCisJCWJyZWFrOworCSAgICArK2NvdW50OworCX0KKwlicmVhazsKKworICAgICAgY2FzZSBOV0hJVEU6CisgICAgICBjYXNlIE5XSElURSArIEFERF9OTDoKKwltYXNrID0gUklfV0hJVEU7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgRElHSVQ6CisgICAgICBjYXNlIERJR0lUICsgQUREX05MOgorCXRlc3R2YWwgPSBtYXNrID0gUklfRElHSVQ7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgTkRJR0lUOgorICAgICAgY2FzZSBORElHSVQgKyBBRERfTkw6CisJbWFzayA9IFJJX0RJR0lUOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIEhFWDoKKyAgICAgIGNhc2UgSEVYICsgQUREX05MOgorCXRlc3R2YWwgPSBtYXNrID0gUklfSEVYOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIE5IRVg6CisgICAgICBjYXNlIE5IRVggKyBBRERfTkw6CisJbWFzayA9IFJJX0hFWDsKKwlnb3RvIGRvX2NsYXNzOworICAgICAgY2FzZSBPQ1RBTDoKKyAgICAgIGNhc2UgT0NUQUwgKyBBRERfTkw6CisJdGVzdHZhbCA9IG1hc2sgPSBSSV9PQ1RBTDsKKwlnb3RvIGRvX2NsYXNzOworICAgICAgY2FzZSBOT0NUQUw6CisgICAgICBjYXNlIE5PQ1RBTCArIEFERF9OTDoKKwltYXNrID0gUklfT0NUQUw7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgV09SRDoKKyAgICAgIGNhc2UgV09SRCArIEFERF9OTDoKKwl0ZXN0dmFsID0gbWFzayA9IFJJX1dPUkQ7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgTldPUkQ6CisgICAgICBjYXNlIE5XT1JEICsgQUREX05MOgorCW1hc2sgPSBSSV9XT1JEOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIEhFQUQ6CisgICAgICBjYXNlIEhFQUQgKyBBRERfTkw6CisJdGVzdHZhbCA9IG1hc2sgPSBSSV9IRUFEOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIE5IRUFEOgorICAgICAgY2FzZSBOSEVBRCArIEFERF9OTDoKKwltYXNrID0gUklfSEVBRDsKKwlnb3RvIGRvX2NsYXNzOworICAgICAgY2FzZSBBTFBIQToKKyAgICAgIGNhc2UgQUxQSEEgKyBBRERfTkw6CisJdGVzdHZhbCA9IG1hc2sgPSBSSV9BTFBIQTsKKwlnb3RvIGRvX2NsYXNzOworICAgICAgY2FzZSBOQUxQSEE6CisgICAgICBjYXNlIE5BTFBIQSArIEFERF9OTDoKKwltYXNrID0gUklfQUxQSEE7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgTE9XRVI6CisgICAgICBjYXNlIExPV0VSICsgQUREX05MOgorCXRlc3R2YWwgPSBtYXNrID0gUklfTE9XRVI7CisJZ290byBkb19jbGFzczsKKyAgICAgIGNhc2UgTkxPV0VSOgorICAgICAgY2FzZSBOTE9XRVIgKyBBRERfTkw6CisJbWFzayA9IFJJX0xPV0VSOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIFVQUEVSOgorICAgICAgY2FzZSBVUFBFUiArIEFERF9OTDoKKwl0ZXN0dmFsID0gbWFzayA9IFJJX1VQUEVSOworCWdvdG8gZG9fY2xhc3M7CisgICAgICBjYXNlIE5VUFBFUjoKKyAgICAgIGNhc2UgTlVQUEVSICsgQUREX05MOgorCW1hc2sgPSBSSV9VUFBFUjsKKwlnb3RvIGRvX2NsYXNzOworCisgICAgICBjYXNlIEVYQUNUTFk6CisJeworCSAgICBpbnQJICAgIGN1LCBjbDsKKworCSAgICAvKiBUaGlzIGRvZXNuJ3QgZG8gYSBtdWx0aS1ieXRlIGNoYXJhY3RlciwgYmVjYXVzZSBhIE1VTFRJQllURUNPREUKKwkgICAgICogd291bGQgaGF2ZSBiZWVuIHVzZWQgZm9yIGl0LiAqLworCSAgICBpZiAoaXJlZ19pYykKKwkgICAgeworCQljdSA9IFRPVVBQRVJfTE9DKCpvcG5kKTsKKwkJY2wgPSBUT0xPV0VSX0xPQygqb3BuZCk7CisJCXdoaWxlIChjb3VudCA8IG1heGNvdW50ICYmICgqc2NhbiA9PSBjdSB8fCAqc2NhbiA9PSBjbCkpCisJCXsKKwkJICAgIGNvdW50Kys7CisJCSAgICBzY2FuKys7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJY3UgPSAqb3BuZDsKKwkJd2hpbGUgKGNvdW50IDwgbWF4Y291bnQgJiYgKnNjYW4gPT0gY3UpCisJCXsKKwkJICAgIGNvdW50Kys7CisJCSAgICBzY2FuKys7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgICBjYXNlIE1VTFRJQllURUNPREU6CisJeworCSAgICBpbnQJCWksIGxlbiwgY2YgPSAwOworCisJICAgIC8qIFNhZmV0eSBjaGVjayAoanVzdCBpbiBjYXNlICdlbmNvZGluZycgd2FzIGNoYW5nZWQgc2luY2UKKwkgICAgICogY29tcGlsaW5nIHRoZSBwcm9ncmFtKS4gKi8KKwkgICAgaWYgKChsZW4gPSAoKm1iX3B0cjJsZW5fY2hlY2spKG9wbmQpKSA+IDEpCisJICAgIHsKKwkJaWYgKGlyZWdfaWMgJiYgZW5jX3V0ZjgpCisJCSAgICBjZiA9IHV0Zl9mb2xkKHV0Zl9wdHIyY2hhcihvcG5kKSk7CisJCXdoaWxlIChjb3VudCA8IG1heGNvdW50KQorCQl7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQlpZiAob3BuZFtpXSAhPSBzY2FuW2ldKQorCQkJICAgIGJyZWFrOworCQkgICAgaWYgKGkgPCBsZW4gJiYgKCFpcmVnX2ljIHx8ICFlbmNfdXRmOAorCQkJCQl8fCB1dGZfZm9sZCh1dGZfcHRyMmNoYXIoc2NhbikpICE9IGNmKSkKKwkJCWJyZWFrOworCQkgICAgc2NhbiArPSBsZW47CisJCSAgICArK2NvdW50OworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisjZW5kaWYKKworICAgICAgY2FzZSBBTllPRjoKKyAgICAgIGNhc2UgQU5ZT0YgKyBBRERfTkw6CisJdGVzdHZhbCA9IFRSVUU7CisJLypGQUxMVEhST1VHSCovCisKKyAgICAgIGNhc2UgQU5ZQlVUOgorICAgICAgY2FzZSBBTllCVVQgKyBBRERfTkw6CisJd2hpbGUgKGNvdW50IDwgbWF4Y291bnQpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaW50IGxlbjsKKyNlbmRpZgorCSAgICBpZiAoKnNjYW4gPT0gTlVMKQorCSAgICB7CisJCWlmICghV0lUSF9OTChPUChwKSkgfHwgcmVnbG51bSA9PSByZWdfbWF4bGluZSkKKwkJICAgIGJyZWFrOworCQlyZWdfbmV4dGxpbmUoKTsKKwkJc2NhbiA9IHJlZ2lucHV0OworCQlpZiAoZ290X2ludCkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKHJlZ19saW5lX2xiciAmJiAqc2NhbiA9PSAnXG4nICYmIFdJVEhfTkwoT1AocCkpKQorCQkrK3NjYW47CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBlbHNlIGlmIChoYXNfbWJ5dGUgJiYgKGxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykoc2NhbikpID4gMSkKKwkgICAgeworCQlpZiAoKGNzdHJjaHIob3BuZCwgKCptYl9wdHIyY2hhcikoc2NhbikpID09IE5VTEwpID09IHRlc3R2YWwpCisJCSAgICBicmVhazsKKwkJc2NhbiArPSBsZW47CisJICAgIH0KKyNlbmRpZgorCSAgICBlbHNlCisJICAgIHsKKwkJaWYgKChjc3RyY2hyKG9wbmQsICpzY2FuKSA9PSBOVUxMKSA9PSB0ZXN0dmFsKQorCQkgICAgYnJlYWs7CisJCSsrc2NhbjsKKwkgICAgfQorCSAgICArK2NvdW50OworCX0KKwlicmVhazsKKworICAgICAgY2FzZSBORVdMOgorCXdoaWxlIChjb3VudCA8IG1heGNvdW50CisJCSYmICgoKnNjYW4gPT0gTlVMICYmIHJlZ2xudW0gPCByZWdfbWF4bGluZSkKKwkJICAgIHx8ICgqc2NhbiA9PSAnXG4nICYmIHJlZ19saW5lX2xicikpKQorCXsKKwkgICAgY291bnQrKzsKKwkgICAgaWYgKHJlZ19saW5lX2xicikKKwkJQURWQU5DRV9SRUdJTlBVVCgpOworCSAgICBlbHNlCisJCXJlZ19uZXh0bGluZSgpOworCSAgICBzY2FuID0gcmVnaW5wdXQ7CisJICAgIGlmIChnb3RfaW50KQorCQlicmVhazsKKwl9CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CQkJLyogT2ggZGVhci4gIENhbGxlZCBpbmFwcHJvcHJpYXRlbHkuICovCisJRU1TRyhfKGVfcmVfY29ycikpOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJDYWxsZWQgcmVncmVwZWF0IHdpdGggb3AgY29kZSAlZFxuIiwgT1AocCkpOworI2VuZGlmCisJYnJlYWs7CisgICAgfQorCisgICAgcmVnaW5wdXQgPSBzY2FuOworCisgICAgcmV0dXJuIChpbnQpY291bnQ7Cit9CisKKy8qCisgKiByZWduZXh0IC0gZGlnIHRoZSAibmV4dCIgcG9pbnRlciBvdXQgb2YgYSBub2RlCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3JlZ25leHQocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIGludAkgICAgb2Zmc2V0OworCisgICAgaWYgKHAgPT0gSlVTVF9DQUxDX1NJWkUpCisJcmV0dXJuIE5VTEw7CisKKyAgICBvZmZzZXQgPSBORVhUKHApOworICAgIGlmIChvZmZzZXQgPT0gMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmIChPUChwKSA9PSBCQUNLKQorCXJldHVybiBwIC0gb2Zmc2V0OworICAgIGVsc2UKKwlyZXR1cm4gcCArIG9mZnNldDsKK30KKworLyoKKyAqIENoZWNrIHRoZSByZWdleHAgcHJvZ3JhbSBmb3IgaXRzIG1hZ2ljIG51bWJlci4KKyAqIFJldHVybiBUUlVFIGlmIGl0J3Mgd3JvbmcuCisgKi8KKyAgICBzdGF0aWMgaW50Citwcm9nX21hZ2ljX3dyb25nKCkKK3sKKyAgICBpZiAoVUNIQVJBVChSRUdfTVVMVEkKKwkJPyByZWdfbW1hdGNoLT5yZWdwcm9nLT5wcm9ncmFtCisJCTogcmVnX21hdGNoLT5yZWdwcm9nLT5wcm9ncmFtKSAhPSBSRUdNQUdJQykKKyAgICB7CisJRU1TRyhfKGVfcmVfY29ycikpOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBDbGVhbnVwIHRoZSBzdWJleHByZXNzaW9ucywgaWYgdGhpcyB3YXNuJ3QgZG9uZSB5ZXQuCisgKiBUaGlzIGNvbnN0cnVjdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBzdWJleHByZXNzaW9ucyBvbmx5IHdoZW4gdGhleSBhcmUKKyAqIHVzZWQgKHRvIGluY3JlYXNlIHNwZWVkKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjbGVhbnVwX3N1YmV4cHIoKQoreworICAgIGlmIChuZWVkX2NsZWFyX3N1YmV4cHIpCisgICAgeworCWlmIChSRUdfTVVMVEkpCisJeworCSAgICAvKiBVc2UgMHhmZiB0byBzZXQgbG51bSB0byAtMSAqLworCSAgICB2aW1fbWVtc2V0KHJlZ19zdGFydHBvcywgMHhmZiwgc2l6ZW9mKGxwb3NfVCkgKiBOU1VCRVhQKTsKKwkgICAgdmltX21lbXNldChyZWdfZW5kcG9zLCAweGZmLCBzaXplb2YobHBvc19UKSAqIE5TVUJFWFApOworCX0KKwllbHNlCisJeworCSAgICB2aW1fbWVtc2V0KHJlZ19zdGFydHAsIDAsIHNpemVvZihjaGFyX3UgKikgKiBOU1VCRVhQKTsKKwkgICAgdmltX21lbXNldChyZWdfZW5kcCwgMCwgc2l6ZW9mKGNoYXJfdSAqKSAqIE5TVUJFWFApOworCX0KKwluZWVkX2NsZWFyX3N1YmV4cHIgPSBGQUxTRTsKKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIHN0YXRpYyB2b2lkCitjbGVhbnVwX3pzdWJleHByKCkKK3sKKyAgICBpZiAobmVlZF9jbGVhcl96c3ViZXhwcikKKyAgICB7CisJaWYgKFJFR19NVUxUSSkKKwl7CisJICAgIC8qIFVzZSAweGZmIHRvIHNldCBsbnVtIHRvIC0xICovCisJICAgIHZpbV9tZW1zZXQocmVnX3N0YXJ0enBvcywgMHhmZiwgc2l6ZW9mKGxwb3NfVCkgKiBOU1VCRVhQKTsKKwkgICAgdmltX21lbXNldChyZWdfZW5kenBvcywgMHhmZiwgc2l6ZW9mKGxwb3NfVCkgKiBOU1VCRVhQKTsKKwl9CisJZWxzZQorCXsKKwkgICAgdmltX21lbXNldChyZWdfc3RhcnR6cCwgMCwgc2l6ZW9mKGNoYXJfdSAqKSAqIE5TVUJFWFApOworCSAgICB2aW1fbWVtc2V0KHJlZ19lbmR6cCwgMCwgc2l6ZW9mKGNoYXJfdSAqKSAqIE5TVUJFWFApOworCX0KKwluZWVkX2NsZWFyX3pzdWJleHByID0gRkFMU0U7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBBZHZhbmNlIHJlZ2xudW0sIHJlZ2xpbmUgYW5kIHJlZ2lucHV0IHRvIHRoZSBuZXh0IGxpbmUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnX25leHRsaW5lKCkKK3sKKyAgICByZWdsaW5lID0gcmVnX2dldGxpbmUoKytyZWdsbnVtKTsKKyAgICByZWdpbnB1dCA9IHJlZ2xpbmU7CisgICAgZmFzdF9icmVha2NoZWNrKCk7Cit9CisKKy8qCisgKiBTYXZlIHRoZSBpbnB1dCBsaW5lIGFuZCBwb3NpdGlvbiBpbiBhIHJlZ3NhdmVfVC4KKyAqLworICAgIHN0YXRpYyB2b2lkCityZWdfc2F2ZShzYXZlKQorICAgIHJlZ3NhdmVfVAkqc2F2ZTsKK3sKKyAgICBpZiAoUkVHX01VTFRJKQorICAgIHsKKwlzYXZlLT5yc191LnBvcy5jb2wgPSAoY29sbnJfVCkocmVnaW5wdXQgLSByZWdsaW5lKTsKKwlzYXZlLT5yc191LnBvcy5sbnVtID0gcmVnbG51bTsKKyAgICB9CisgICAgZWxzZQorCXNhdmUtPnJzX3UucHRyID0gcmVnaW5wdXQ7Cit9CisKKy8qCisgKiBSZXN0b3JlIHRoZSBpbnB1dCBsaW5lIGFuZCBwb3NpdGlvbiBmcm9tIGEgcmVnc2F2ZV9ULgorICovCisgICAgc3RhdGljIHZvaWQKK3JlZ19yZXN0b3JlKHNhdmUpCisgICAgcmVnc2F2ZV9UCSpzYXZlOworeworICAgIGlmIChSRUdfTVVMVEkpCisgICAgeworCWlmIChyZWdsbnVtICE9IHNhdmUtPnJzX3UucG9zLmxudW0pCisJeworCSAgICAvKiBvbmx5IGNhbGwgcmVnX2dldGxpbmUoKSB3aGVuIHRoZSBsaW5lIG51bWJlciBjaGFuZ2VkIHRvIHNhdmUKKwkgICAgICogYSBiaXQgb2YgdGltZSAqLworCSAgICByZWdsbnVtID0gc2F2ZS0+cnNfdS5wb3MubG51bTsKKwkgICAgcmVnbGluZSA9IHJlZ19nZXRsaW5lKHJlZ2xudW0pOworCX0KKwlyZWdpbnB1dCA9IHJlZ2xpbmUgKyBzYXZlLT5yc191LnBvcy5jb2w7CisgICAgfQorICAgIGVsc2UKKwlyZWdpbnB1dCA9IHNhdmUtPnJzX3UucHRyOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBlcXVhbCB0byBzYXZlZCBwb3NpdGlvbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK3JlZ19zYXZlX2VxdWFsKHNhdmUpCisgICAgcmVnc2F2ZV9UCSpzYXZlOworeworICAgIGlmIChSRUdfTVVMVEkpCisJcmV0dXJuIHJlZ2xudW0gPT0gc2F2ZS0+cnNfdS5wb3MubG51bQorCQkJCSAgJiYgcmVnaW5wdXQgPT0gcmVnbGluZSArIHNhdmUtPnJzX3UucG9zLmNvbDsKKyAgICByZXR1cm4gcmVnaW5wdXQgPT0gc2F2ZS0+cnNfdS5wdHI7Cit9CisKKy8qCisgKiBUZW50YXRpdmVseSBzZXQgdGhlIHN1Yi1leHByZXNzaW9uIHN0YXJ0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIChhZnRlcgorICogY2FsbGluZyByZWdtYXRjaCgpIHRoZXkgd2lsbCBoYXZlIGNoYW5nZWQpLiAgTmVlZCB0byBzYXZlIHRoZSBleGlzdGluZworICogdmFsdWVzIGZvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoLgorICogVXNlIHNlX3NhdmUoKSB0byB1c2UgcG9pbnRlciAoc2F2ZV9zZV9tdWx0aSgpKSBvciBwb3NpdGlvbiAoc2F2ZV9zZV9vbmUoKSksCisgKiBkZXBlbmRpbmcgb24gUkVHX01VTFRJLgorICovCisgICAgc3RhdGljIHZvaWQKK3NhdmVfc2VfbXVsdGkoc2F2ZXAsIHBvc3ApCisgICAgc2F2ZV9zZV9UCSpzYXZlcDsKKyAgICBscG9zX1QJKnBvc3A7Cit7CisgICAgc2F2ZXAtPnNlX3UucG9zID0gKnBvc3A7CisgICAgcG9zcC0+bG51bSA9IHJlZ2xudW07CisgICAgcG9zcC0+Y29sID0gKGNvbG5yX1QpKHJlZ2lucHV0IC0gcmVnbGluZSk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorc2F2ZV9zZV9vbmUoc2F2ZXAsIHBwKQorICAgIHNhdmVfc2VfVAkqc2F2ZXA7CisgICAgY2hhcl91CSoqcHA7Cit7CisgICAgc2F2ZXAtPnNlX3UucHRyID0gKnBwOworICAgICpwcCA9IHJlZ2lucHV0OworfQorCisvKgorICogQ29tcGFyZSBhIG51bWJlciB3aXRoIHRoZSBvcGVyYW5kIG9mIFJFX0xOVU0sIFJFX0NPTCBvciBSRV9WQ09MLgorICovCisgICAgc3RhdGljIGludAorcmVfbnVtX2NtcCh2YWwsIHNjYW4pCisgICAgbG9uZ191CXZhbDsKKyAgICBjaGFyX3UJKnNjYW47Cit7CisgICAgbG9uZ191ICBuID0gT1BFUkFORF9NSU4oc2Nhbik7CisKKyAgICBpZiAoT1BFUkFORF9DTVAoc2NhbikgPT0gJz4nKQorCXJldHVybiB2YWwgPiBuOworICAgIGlmIChPUEVSQU5EX0NNUChzY2FuKSA9PSAnPCcpCisJcmV0dXJuIHZhbCA8IG47CisgICAgcmV0dXJuIHZhbCA9PSBuOworfQorCisKKyNpZmRlZiBERUJVRworCisvKgorICogcmVnZHVtcCAtIGR1bXAgYSByZWdleHAgb250byBzdGRvdXQgaW4gdmFndWVseSBjb21wcmVoZW5zaWJsZSBmb3JtCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnZHVtcChwYXR0ZXJuLCByKQorICAgIGNoYXJfdQkqcGF0dGVybjsKKyAgICByZWdwcm9nX1QJKnI7Cit7CisgICAgY2hhcl91ICAqczsKKyAgICBpbnQJICAgIG9wID0gRVhBQ1RMWTsJLyogQXJiaXRyYXJ5IG5vbi1FTkQgb3AuICovCisgICAgY2hhcl91ICAqbmV4dDsKKyAgICBjaGFyX3UgICplbmQgPSBOVUxMOworCisgICAgcHJpbnRmKCJcclxucmVnY29tcCglcyk6XHJcbiIsIHBhdHRlcm4pOworCisgICAgcyA9IHItPnByb2dyYW0gKyAxOworICAgIC8qCisgICAgICogTG9vcCB1bnRpbCB3ZSBmaW5kIHRoZSBFTkQgdGhhdCBpc24ndCBiZWZvcmUgYSByZWZlcnJlZCBuZXh0IChhbiBFTkQKKyAgICAgKiBjYW4gYWxzbyBhcHBlYXIgaW4gYSBOT01BVENIIG9wZXJhbmQpLgorICAgICAqLworICAgIHdoaWxlIChvcCAhPSBFTkQgfHwgcyA8PSBlbmQpCisgICAgeworCW9wID0gT1Aocyk7CisJcHJpbnRmKCIlMmQlcyIsIChpbnQpKHMgLSByLT5wcm9ncmFtKSwgcmVncHJvcChzKSk7IC8qIFdoZXJlLCB3aGF0LiAqLworCW5leHQgPSByZWduZXh0KHMpOworCWlmIChuZXh0ID09IE5VTEwpCS8qIE5leHQgcHRyLiAqLworCSAgICBwcmludGYoIigwKSIpOworCWVsc2UKKwkgICAgcHJpbnRmKCIoJWQpIiwgKGludCkoKHMgLSByLT5wcm9ncmFtKSArIChuZXh0IC0gcykpKTsKKwlpZiAoZW5kIDwgbmV4dCkKKwkgICAgZW5kID0gbmV4dDsKKwlpZiAob3AgPT0gQlJBQ0VfTElNSVRTKQorCXsKKwkgICAgLyogVHdvIHNob3J0IGludHMgKi8KKwkgICAgcHJpbnRmKCIgbWludmFsICVsZCwgbWF4dmFsICVsZCIsIE9QRVJBTkRfTUlOKHMpLCBPUEVSQU5EX01BWChzKSk7CisJICAgIHMgKz0gODsKKwl9CisJcyArPSAzOworCWlmIChvcCA9PSBBTllPRiB8fCBvcCA9PSBBTllPRiArIEFERF9OTAorCQl8fCBvcCA9PSBBTllCVVQgfHwgb3AgPT0gQU5ZQlVUICsgQUREX05MCisJCXx8IG9wID09IEVYQUNUTFkpCisJeworCSAgICAvKiBMaXRlcmFsIHN0cmluZywgd2hlcmUgcHJlc2VudC4gKi8KKwkgICAgd2hpbGUgKCpzICE9IE5VTCkKKwkJcHJpbnRmKCIlYyIsICpzKyspOworCSAgICBzKys7CisJfQorCXByaW50ZigiXHJcbiIpOworICAgIH0KKworICAgIC8qIEhlYWRlciBmaWVsZHMgb2YgaW50ZXJlc3QuICovCisgICAgaWYgKHItPnJlZ3N0YXJ0ICE9IE5VTCkKKwlwcmludGYoInN0YXJ0IGAlcycgMHgleDsgIiwgci0+cmVnc3RhcnQgPCAyNTYKKwkJPyAoY2hhciAqKXRyYW5zY2hhcihyLT5yZWdzdGFydCkKKwkJOiAibXVsdGlieXRlIiwgci0+cmVnc3RhcnQpOworICAgIGlmIChyLT5yZWdhbmNoKQorCXByaW50ZigiYW5jaG9yZWQ7ICIpOworICAgIGlmIChyLT5yZWdtdXN0ICE9IE5VTEwpCisJcHJpbnRmKCJtdXN0IGhhdmUgXCIlc1wiIiwgci0+cmVnbXVzdCk7CisgICAgcHJpbnRmKCJcclxuIik7Cit9CisKKy8qCisgKiByZWdwcm9wIC0gcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIG9wY29kZQorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZWdwcm9wKG9wKQorICAgIGNoYXJfdQkgICAqb3A7Cit7CisgICAgY2hhcl91CSAgICAqcDsKKyAgICBzdGF0aWMgY2hhcl91ICAgYnVmWzUwXTsKKworICAgICh2b2lkKSBzdHJjcHkoYnVmLCAiOiIpOworCisgICAgc3dpdGNoIChPUChvcCkpCisgICAgeworICAgICAgY2FzZSBCT0w6CisJcCA9ICJCT0wiOworCWJyZWFrOworICAgICAgY2FzZSBFT0w6CisJcCA9ICJFT0wiOworCWJyZWFrOworICAgICAgY2FzZSBSRV9CT0Y6CisJcCA9ICJCT0YiOworCWJyZWFrOworICAgICAgY2FzZSBSRV9FT0Y6CisJcCA9ICJFT0YiOworCWJyZWFrOworICAgICAgY2FzZSBDVVJTT1I6CisJcCA9ICJDVVJTT1IiOworCWJyZWFrOworICAgICAgY2FzZSBSRV9MTlVNOgorCXAgPSAiUkVfTE5VTSI7CisJYnJlYWs7CisgICAgICBjYXNlIFJFX0NPTDoKKwlwID0gIlJFX0NPTCI7CisJYnJlYWs7CisgICAgICBjYXNlIFJFX1ZDT0w6CisJcCA9ICJSRV9WQ09MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQk9XOgorCXAgPSAiQk9XIjsKKwlicmVhazsKKyAgICAgIGNhc2UgRU9XOgorCXAgPSAiRU9XIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQU5ZOgorCXAgPSAiQU5ZIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQU5ZICsgQUREX05MOgorCXAgPSAiQU5ZK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQU5ZT0Y6CisJcCA9ICJBTllPRiI7CisJYnJlYWs7CisgICAgICBjYXNlIEFOWU9GICsgQUREX05MOgorCXAgPSAiQU5ZT0YrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBBTllCVVQ6CisJcCA9ICJBTllCVVQiOworCWJyZWFrOworICAgICAgY2FzZSBBTllCVVQgKyBBRERfTkw6CisJcCA9ICJBTllCVVQrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBJREVOVDoKKwlwID0gIklERU5UIjsKKwlicmVhazsKKyAgICAgIGNhc2UgSURFTlQgKyBBRERfTkw6CisJcCA9ICJJREVOVCtOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIFNJREVOVDoKKwlwID0gIlNJREVOVCI7CisJYnJlYWs7CisgICAgICBjYXNlIFNJREVOVCArIEFERF9OTDoKKwlwID0gIlNJREVOVCtOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIEtXT1JEOgorCXAgPSAiS1dPUkQiOworCWJyZWFrOworICAgICAgY2FzZSBLV09SRCArIEFERF9OTDoKKwlwID0gIktXT1JEK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgU0tXT1JEOgorCXAgPSAiU0tXT1JEIjsKKwlicmVhazsKKyAgICAgIGNhc2UgU0tXT1JEICsgQUREX05MOgorCXAgPSAiU0tXT1JEK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgRk5BTUU6CisJcCA9ICJGTkFNRSI7CisJYnJlYWs7CisgICAgICBjYXNlIEZOQU1FICsgQUREX05MOgorCXAgPSAiRk5BTUUrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBTRk5BTUU6CisJcCA9ICJTRk5BTUUiOworCWJyZWFrOworICAgICAgY2FzZSBTRk5BTUUgKyBBRERfTkw6CisJcCA9ICJTRk5BTUUrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBQUklOVDoKKwlwID0gIlBSSU5UIjsKKwlicmVhazsKKyAgICAgIGNhc2UgUFJJTlQgKyBBRERfTkw6CisJcCA9ICJQUklOVCtOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIFNQUklOVDoKKwlwID0gIlNQUklOVCI7CisJYnJlYWs7CisgICAgICBjYXNlIFNQUklOVCArIEFERF9OTDoKKwlwID0gIlNQUklOVCtOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIFdISVRFOgorCXAgPSAiV0hJVEUiOworCWJyZWFrOworICAgICAgY2FzZSBXSElURSArIEFERF9OTDoKKwlwID0gIldISVRFK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTldISVRFOgorCXAgPSAiTldISVRFIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTldISVRFICsgQUREX05MOgorCXAgPSAiTldISVRFK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgRElHSVQ6CisJcCA9ICJESUdJVCI7CisJYnJlYWs7CisgICAgICBjYXNlIERJR0lUICsgQUREX05MOgorCXAgPSAiRElHSVQrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBORElHSVQ6CisJcCA9ICJORElHSVQiOworCWJyZWFrOworICAgICAgY2FzZSBORElHSVQgKyBBRERfTkw6CisJcCA9ICJORElHSVQrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBIRVg6CisJcCA9ICJIRVgiOworCWJyZWFrOworICAgICAgY2FzZSBIRVggKyBBRERfTkw6CisJcCA9ICJIRVgrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBOSEVYOgorCXAgPSAiTkhFWCI7CisJYnJlYWs7CisgICAgICBjYXNlIE5IRVggKyBBRERfTkw6CisJcCA9ICJOSEVYK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgT0NUQUw6CisJcCA9ICJPQ1RBTCI7CisJYnJlYWs7CisgICAgICBjYXNlIE9DVEFMICsgQUREX05MOgorCXAgPSAiT0NUQUwrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBOT0NUQUw6CisJcCA9ICJOT0NUQUwiOworCWJyZWFrOworICAgICAgY2FzZSBOT0NUQUwgKyBBRERfTkw6CisJcCA9ICJOT0NUQUwrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBXT1JEOgorCXAgPSAiV09SRCI7CisJYnJlYWs7CisgICAgICBjYXNlIFdPUkQgKyBBRERfTkw6CisJcCA9ICJXT1JEK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTldPUkQ6CisJcCA9ICJOV09SRCI7CisJYnJlYWs7CisgICAgICBjYXNlIE5XT1JEICsgQUREX05MOgorCXAgPSAiTldPUkQrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBIRUFEOgorCXAgPSAiSEVBRCI7CisJYnJlYWs7CisgICAgICBjYXNlIEhFQUQgKyBBRERfTkw6CisJcCA9ICJIRUFEK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTkhFQUQ6CisJcCA9ICJOSEVBRCI7CisJYnJlYWs7CisgICAgICBjYXNlIE5IRUFEICsgQUREX05MOgorCXAgPSAiTkhFQUQrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBBTFBIQToKKwlwID0gIkFMUEhBIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQUxQSEEgKyBBRERfTkw6CisJcCA9ICJBTFBIQStOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIE5BTFBIQToKKwlwID0gIk5BTFBIQSI7CisJYnJlYWs7CisgICAgICBjYXNlIE5BTFBIQSArIEFERF9OTDoKKwlwID0gIk5BTFBIQStOTCI7CisJYnJlYWs7CisgICAgICBjYXNlIExPV0VSOgorCXAgPSAiTE9XRVIiOworCWJyZWFrOworICAgICAgY2FzZSBMT1dFUiArIEFERF9OTDoKKwlwID0gIkxPV0VSK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTkxPV0VSOgorCXAgPSAiTkxPV0VSIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTkxPV0VSICsgQUREX05MOgorCXAgPSAiTkxPV0VSK05MIjsKKwlicmVhazsKKyAgICAgIGNhc2UgVVBQRVI6CisJcCA9ICJVUFBFUiI7CisJYnJlYWs7CisgICAgICBjYXNlIFVQUEVSICsgQUREX05MOgorCXAgPSAiVVBQRVIrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBOVVBQRVI6CisJcCA9ICJOVVBQRVIiOworCWJyZWFrOworICAgICAgY2FzZSBOVVBQRVIgKyBBRERfTkw6CisJcCA9ICJOVVBQRVIrTkwiOworCWJyZWFrOworICAgICAgY2FzZSBCUkFOQ0g6CisJcCA9ICJCUkFOQ0giOworCWJyZWFrOworICAgICAgY2FzZSBFWEFDVExZOgorCXAgPSAiRVhBQ1RMWSI7CisJYnJlYWs7CisgICAgICBjYXNlIE5PVEhJTkc6CisJcCA9ICJOT1RISU5HIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQkFDSzoKKwlwID0gIkJBQ0siOworCWJyZWFrOworICAgICAgY2FzZSBFTkQ6CisJcCA9ICJFTkQiOworCWJyZWFrOworICAgICAgY2FzZSBNT1BFTiArIDA6CisJcCA9ICJNQVRDSCBTVEFSVCI7CisJYnJlYWs7CisgICAgICBjYXNlIE1PUEVOICsgMToKKyAgICAgIGNhc2UgTU9QRU4gKyAyOgorICAgICAgY2FzZSBNT1BFTiArIDM6CisgICAgICBjYXNlIE1PUEVOICsgNDoKKyAgICAgIGNhc2UgTU9QRU4gKyA1OgorICAgICAgY2FzZSBNT1BFTiArIDY6CisgICAgICBjYXNlIE1PUEVOICsgNzoKKyAgICAgIGNhc2UgTU9QRU4gKyA4OgorICAgICAgY2FzZSBNT1BFTiArIDk6CisJc3ByaW50ZihidWYgKyBTVFJMRU4oYnVmKSwgIk1PUEVOJWQiLCBPUChvcCkgLSBNT1BFTik7CisJcCA9IE5VTEw7CisJYnJlYWs7CisgICAgICBjYXNlIE1DTE9TRSArIDA6CisJcCA9ICJNQVRDSCBFTkQiOworCWJyZWFrOworICAgICAgY2FzZSBNQ0xPU0UgKyAxOgorICAgICAgY2FzZSBNQ0xPU0UgKyAyOgorICAgICAgY2FzZSBNQ0xPU0UgKyAzOgorICAgICAgY2FzZSBNQ0xPU0UgKyA0OgorICAgICAgY2FzZSBNQ0xPU0UgKyA1OgorICAgICAgY2FzZSBNQ0xPU0UgKyA2OgorICAgICAgY2FzZSBNQ0xPU0UgKyA3OgorICAgICAgY2FzZSBNQ0xPU0UgKyA4OgorICAgICAgY2FzZSBNQ0xPU0UgKyA5OgorCXNwcmludGYoYnVmICsgU1RSTEVOKGJ1ZiksICJNQ0xPU0UlZCIsIE9QKG9wKSAtIE1DTE9TRSk7CisJcCA9IE5VTEw7CisJYnJlYWs7CisgICAgICBjYXNlIEJBQ0tSRUYgKyAxOgorICAgICAgY2FzZSBCQUNLUkVGICsgMjoKKyAgICAgIGNhc2UgQkFDS1JFRiArIDM6CisgICAgICBjYXNlIEJBQ0tSRUYgKyA0OgorICAgICAgY2FzZSBCQUNLUkVGICsgNToKKyAgICAgIGNhc2UgQkFDS1JFRiArIDY6CisgICAgICBjYXNlIEJBQ0tSRUYgKyA3OgorICAgICAgY2FzZSBCQUNLUkVGICsgODoKKyAgICAgIGNhc2UgQkFDS1JFRiArIDk6CisJc3ByaW50ZihidWYgKyBTVFJMRU4oYnVmKSwgIkJBQ0tSRUYlZCIsIE9QKG9wKSAtIEJBQ0tSRUYpOworCXAgPSBOVUxMOworCWJyZWFrOworICAgICAgY2FzZSBOT1BFTjoKKwlwID0gIk5PUEVOIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTkNMT1NFOgorCXAgPSAiTkNMT1NFIjsKKwlicmVhazsKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgICAgY2FzZSBaT1BFTiArIDE6CisgICAgICBjYXNlIFpPUEVOICsgMjoKKyAgICAgIGNhc2UgWk9QRU4gKyAzOgorICAgICAgY2FzZSBaT1BFTiArIDQ6CisgICAgICBjYXNlIFpPUEVOICsgNToKKyAgICAgIGNhc2UgWk9QRU4gKyA2OgorICAgICAgY2FzZSBaT1BFTiArIDc6CisgICAgICBjYXNlIFpPUEVOICsgODoKKyAgICAgIGNhc2UgWk9QRU4gKyA5OgorCXNwcmludGYoYnVmICsgU1RSTEVOKGJ1ZiksICJaT1BFTiVkIiwgT1Aob3ApIC0gWk9QRU4pOworCXAgPSBOVUxMOworCWJyZWFrOworICAgICAgY2FzZSBaQ0xPU0UgKyAxOgorICAgICAgY2FzZSBaQ0xPU0UgKyAyOgorICAgICAgY2FzZSBaQ0xPU0UgKyAzOgorICAgICAgY2FzZSBaQ0xPU0UgKyA0OgorICAgICAgY2FzZSBaQ0xPU0UgKyA1OgorICAgICAgY2FzZSBaQ0xPU0UgKyA2OgorICAgICAgY2FzZSBaQ0xPU0UgKyA3OgorICAgICAgY2FzZSBaQ0xPU0UgKyA4OgorICAgICAgY2FzZSBaQ0xPU0UgKyA5OgorCXNwcmludGYoYnVmICsgU1RSTEVOKGJ1ZiksICJaQ0xPU0UlZCIsIE9QKG9wKSAtIFpDTE9TRSk7CisJcCA9IE5VTEw7CisJYnJlYWs7CisgICAgICBjYXNlIFpSRUYgKyAxOgorICAgICAgY2FzZSBaUkVGICsgMjoKKyAgICAgIGNhc2UgWlJFRiArIDM6CisgICAgICBjYXNlIFpSRUYgKyA0OgorICAgICAgY2FzZSBaUkVGICsgNToKKyAgICAgIGNhc2UgWlJFRiArIDY6CisgICAgICBjYXNlIFpSRUYgKyA3OgorICAgICAgY2FzZSBaUkVGICsgODoKKyAgICAgIGNhc2UgWlJFRiArIDk6CisJc3ByaW50ZihidWYgKyBTVFJMRU4oYnVmKSwgIlpSRUYlZCIsIE9QKG9wKSAtIFpSRUYpOworCXAgPSBOVUxMOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFNUQVI6CisJcCA9ICJTVEFSIjsKKwlicmVhazsKKyAgICAgIGNhc2UgUExVUzoKKwlwID0gIlBMVVMiOworCWJyZWFrOworICAgICAgY2FzZSBOT01BVENIOgorCXAgPSAiTk9NQVRDSCI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BVENIOgorCXAgPSAiTUFUQ0giOworCWJyZWFrOworICAgICAgY2FzZSBCRUhJTkQ6CisJcCA9ICJCRUhJTkQiOworCWJyZWFrOworICAgICAgY2FzZSBOT0JFSElORDoKKwlwID0gIk5PQkVISU5EIjsKKwlicmVhazsKKyAgICAgIGNhc2UgU1VCUEFUOgorCXAgPSAiU1VCUEFUIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQlJBQ0VfTElNSVRTOgorCXAgPSAiQlJBQ0VfTElNSVRTIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQlJBQ0VfU0lNUExFOgorCXAgPSAiQlJBQ0VfU0lNUExFIjsKKwlicmVhazsKKyAgICAgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDA6CisgICAgICBjYXNlIEJSQUNFX0NPTVBMRVggKyAxOgorICAgICAgY2FzZSBCUkFDRV9DT01QTEVYICsgMjoKKyAgICAgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDM6CisgICAgICBjYXNlIEJSQUNFX0NPTVBMRVggKyA0OgorICAgICAgY2FzZSBCUkFDRV9DT01QTEVYICsgNToKKyAgICAgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDY6CisgICAgICBjYXNlIEJSQUNFX0NPTVBMRVggKyA3OgorICAgICAgY2FzZSBCUkFDRV9DT01QTEVYICsgODoKKyAgICAgIGNhc2UgQlJBQ0VfQ09NUExFWCArIDk6CisJc3ByaW50ZihidWYgKyBTVFJMRU4oYnVmKSwgIkJSQUNFX0NPTVBMRVglZCIsIE9QKG9wKSAtIEJSQUNFX0NPTVBMRVgpOworCXAgPSBOVUxMOworCWJyZWFrOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAgIGNhc2UgTVVMVElCWVRFQ09ERToKKwlwID0gIk1VTFRJQllURUNPREUiOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIE5FV0w6CisJcCA9ICJORVdMIjsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJc3ByaW50ZihidWYgKyBTVFJMRU4oYnVmKSwgImNvcnJ1cHQgJWQiLCBPUChvcCkpOworCXAgPSBOVUxMOworCWJyZWFrOworICAgIH0KKyAgICBpZiAocCAhPSBOVUxMKQorCSh2b2lkKSBzdHJjYXQoYnVmLCBwKTsKKyAgICByZXR1cm4gYnVmOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgdm9pZCBtYl9kZWNvbXBvc2UgX19BUkdTKChpbnQgYywgaW50ICpjMSwgaW50ICpjMiwgaW50ICpjMykpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBhLCBiLCBjOworfSBkZWNvbXBfVDsKKworCisvKiAweGZiMjAgLSAweGZiNGYgKi8KK2RlY29tcF9UIGRlY29tcF90YWJsZVsweGZiNGYtMHhmYjIwKzFdID0KK3sKKyAgICB7MHg1ZTIsMCwwfSwJCS8qIDB4ZmIyMAlhbHQgYXlpbiAqLworICAgIHsweDVkMCwwLDB9LAkJLyogMHhmYjIxCWFsdCBhbGVmICovCisgICAgezB4NWQzLDAsMH0sCQkvKiAweGZiMjIJYWx0IGRhbGV0ICovCisgICAgezB4NWQ0LDAsMH0sCQkvKiAweGZiMjMJYWx0IGhlICovCisgICAgezB4NWRiLDAsMH0sCQkvKiAweGZiMjQJYWx0IGthZiAqLworICAgIHsweDVkYywwLDB9LAkJLyogMHhmYjI1CWFsdCBsYW1lZCAqLworICAgIHsweDVkZCwwLDB9LAkJLyogMHhmYjI2CWFsdCBtZW0tc29maXQgKi8KKyAgICB7MHg1ZTgsMCwwfSwJCS8qIDB4ZmIyNwlhbHQgcmVzaCAqLworICAgIHsweDVlYSwwLDB9LAkJLyogMHhmYjI4CWFsdCB0YXYgKi8KKyAgICB7JysnLCAwLCAwfSwJCS8qIDB4ZmIyOQlhbHQgcGx1cyAqLworICAgIHsweDVlOSwgMHg1YzEsIDB9LAkJLyogMHhmYjJhCXNoaW4rc2hpbi1kb3QgKi8KKyAgICB7MHg1ZTksIDB4NWMyLCAwfSwJCS8qIDB4ZmIyYglzaGluK3Npbi1kb3QgKi8KKyAgICB7MHg1ZTksIDB4NWMxLCAweDViY30sCS8qIDB4ZmIyYwlzaGluK3NoaW4tZG90K2RhZ2VzaCAqLworICAgIHsweDVlOSwgMHg1YzIsIDB4NWJjfSwJLyogMHhmYjJkCXNoaW4rc2luLWRvdCtkYWdlc2ggKi8KKyAgICB7MHg1ZDAsIDB4NWI3LCAwfSwJCS8qIDB4ZmIyZQlhbGVmK3BhdGFoICovCisgICAgezB4NWQwLCAweDViOCwgMH0sCQkvKiAweGZiMmYJYWxlZitxYW1hdHMgKi8KKyAgICB7MHg1ZDAsIDB4NWI0LCAwfSwJCS8qIDB4ZmIzMAlhbGVmK2hpcmlxICovCisgICAgezB4NWQxLCAweDViYywgMH0sCQkvKiAweGZiMzEJYmV0K2RhZ2VzaCAqLworICAgIHsweDVkMiwgMHg1YmMsIDB9LAkJLyogMHhmYjMyCWdpbWVsK2RhZ2VzaCAqLworICAgIHsweDVkMywgMHg1YmMsIDB9LAkJLyogMHhmYjMzCWRhbGV0K2RhZ2VzaCAqLworICAgIHsweDVkNCwgMHg1YmMsIDB9LAkJLyogMHhmYjM0CWhlK2RhZ2VzaCAqLworICAgIHsweDVkNSwgMHg1YmMsIDB9LAkJLyogMHhmYjM1CXZhditkYWdlc2ggKi8KKyAgICB7MHg1ZDYsIDB4NWJjLCAwfSwJCS8qIDB4ZmIzNgl6YXlpbitkYWdlc2ggKi8KKyAgICB7MHhmYjM3LCAwLCAwfSwJCS8qIDB4ZmIzNyAtLSBVTlVTRUQgKi8KKyAgICB7MHg1ZDgsIDB4NWJjLCAwfSwJCS8qIDB4ZmIzOAl0ZXQrZGFnZXNoICovCisgICAgezB4NWQ5LCAweDViYywgMH0sCQkvKiAweGZiMzkJeXVkK2RhZ2VzaCAqLworICAgIHsweDVkYSwgMHg1YmMsIDB9LAkJLyogMHhmYjNhCWthZiBzb2ZpdCtkYWdlc2ggKi8KKyAgICB7MHg1ZGIsIDB4NWJjLCAwfSwJCS8qIDB4ZmIzYglrYWYrZGFnZXNoICovCisgICAgezB4NWRjLCAweDViYywgMH0sCQkvKiAweGZiM2MJbGFtZWQrZGFnZXNoICovCisgICAgezB4ZmIzZCwgMCwgMH0sCQkvKiAweGZiM2QgLS0gVU5VU0VEICovCisgICAgezB4NWRlLCAweDViYywgMH0sCQkvKiAweGZiM2UJbWVtK2RhZ2VzaCAqLworICAgIHsweGZiM2YsIDAsIDB9LAkJLyogMHhmYjNmIC0tIFVOVVNFRCAqLworICAgIHsweDVlMCwgMHg1YmMsIDB9LAkJLyogMHhmYjQwCW51bitkYWdlc2ggKi8KKyAgICB7MHg1ZTEsIDB4NWJjLCAwfSwJCS8qIDB4ZmI0MQlzYW1lY2grZGFnZXNoICovCisgICAgezB4ZmI0MiwgMCwgMH0sCQkvKiAweGZiNDIgLS0gVU5VU0VEICovCisgICAgezB4NWUzLCAweDViYywgMH0sCQkvKiAweGZiNDMJcGUgc29maXQrZGFnZXNoICovCisgICAgezB4NWU0LCAweDViYywwfSwJCS8qIDB4ZmI0NAlwZStkYWdlc2ggKi8KKyAgICB7MHhmYjQ1LCAwLCAwfSwJCS8qIDB4ZmI0NSAtLSBVTlVTRUQgKi8KKyAgICB7MHg1ZTYsIDB4NWJjLCAwfSwJCS8qIDB4ZmI0Ngl0c2FkaStkYWdlc2ggKi8KKyAgICB7MHg1ZTcsIDB4NWJjLCAwfSwJCS8qIDB4ZmI0Nwlxb2YrZGFnZXNoICovCisgICAgezB4NWU4LCAweDViYywgMH0sCQkvKiAweGZiNDgJcmVzaCtkYWdlc2ggKi8KKyAgICB7MHg1ZTksIDB4NWJjLCAwfSwJCS8qIDB4ZmI0OQlzaGluK2RhZ2VzaCAqLworICAgIHsweDVlYSwgMHg1YmMsIDB9LAkJLyogMHhmYjRhCXRhditkYWdlc2ggKi8KKyAgICB7MHg1ZDUsIDB4NWI5LCAwfSwJCS8qIDB4ZmI0Ygl2YXYraG9sYW0gKi8KKyAgICB7MHg1ZDEsIDB4NWJmLCAwfSwJCS8qIDB4ZmI0YwliZXQrcmFmZSAqLworICAgIHsweDVkYiwgMHg1YmYsIDB9LAkJLyogMHhmYjRkCWthZityYWZlICovCisgICAgezB4NWU0LCAweDViZiwgMH0sCQkvKiAweGZiNGUJcGUrcmFmZSAqLworICAgIHsweDVkMCwgMHg1ZGMsIDB9CQkvKiAweGZiNGYJYWxlZi1sYW1lZCAqLworfTsKKworICAgIHN0YXRpYyB2b2lkCittYl9kZWNvbXBvc2UoYywgYzEsIGMyLCBjMykKKyAgICBpbnQgYywgKmMxLCAqYzIsICpjMzsKK3sKKyAgICBkZWNvbXBfVCBkOworCisgICAgaWYgKGMgPj0gMHg0YjIwICYmIGMgPD0gMHhmYjRmKQorICAgIHsKKwlkID0gZGVjb21wX3RhYmxlW2MgLSAweGZiMjBdOworCSpjMSA9IGQuYTsKKwkqYzIgPSBkLmI7CisJKmMzID0gZC5jOworICAgIH0KKyAgICBlbHNlCisgICAgeworCSpjMSA9IGM7CisJKmMyID0gKmMzID0gMDsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yZSBjYXNlIGlmIGlyZWdfaWMgc2V0LgorICogUmV0dXJuIDAgaWYgc3RyaW5ncyBtYXRjaCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogQ29ycmVjdCB0aGUgbGVuZ3RoICIqbiIgd2hlbiBjb21wb3NpbmcgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NzdHJuY21wKHMxLCBzMiwgbikKKyAgICBjaGFyX3UJKnMxLCAqczI7CisgICAgaW50CQkqbjsKK3sKKyAgICBpbnQJCXJlc3VsdDsKKworICAgIGlmICghaXJlZ19pYykKKwlyZXN1bHQgPSBTVFJOQ01QKHMxLCBzMiwgKm4pOworICAgIGVsc2UKKwlyZXN1bHQgPSBNQl9TVFJOSUNNUChzMSwgczIsICpuKTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBpZiBpdCBmYWlsZWQgYW5kIGl0J3MgdXRmOCBhbmQgd2Ugd2FudCB0byBjb21iaW5laWdub3JlOiAqLworICAgIGlmIChyZXN1bHQgIT0gMCAmJiBlbmNfdXRmOCAmJiBpcmVnX2ljb21iaW5lKQorICAgIHsKKwljaGFyX3UJKnN0cjEsICpzdHIyOworCWludAljMSwgYzIsIGMxMSwgYzEyOworCWludAlpeDsKKwlpbnQJanVuazsKKworCS8qIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBzdHJjbXAgb3Vyc2VsdmVzLCBzaW5jZSBpdCBpcyBuZWNlc3NhcnkgdG8KKwkgKiBkZWFsIHdpdGggdGhlIGNvbXBvc2luZyBjaGFyYWN0ZXJzIGJ5IGlnbm9yaW5nIHRoZW06ICovCisJc3RyMSA9IHMxOworCXN0cjIgPSBzMjsKKwljMSA9IGMyID0gMDsKKwlmb3IgKGl4ID0gMDsgaXggPCAqbjsgKQorCXsKKwkgICAgYzEgPSBtYl9wdHIyY2hhcl9hZHYoJnN0cjEpOworCSAgICBjMiA9IG1iX3B0cjJjaGFyX2Fkdigmc3RyMik7CisJICAgIGl4ICs9IHV0Zl9jaGFyMmxlbihjMSk7CisKKwkgICAgLyogZGVjb21wb3NlIHRoZSBjaGFyYWN0ZXIgaWYgbmVjZXNzYXJ5LCBpbnRvICdiYXNlJyBjaGFyYWN0ZXJzCisJICAgICAqIGJlY2F1c2UgSSBkb24ndCBjYXJlIGFib3V0IEFyYWJpYywgSSB3aWxsIGhhcmQtY29kZSB0aGUgSGVicmV3CisJICAgICAqIHdoaWNoIEkgKmRvKiBjYXJlIGFib3V0ISAgU28gc3VlIG1lLi4uICovCisJICAgIGlmIChjMSAhPSBjMiAmJiAoIWlyZWdfaWMgfHwgdXRmX2ZvbGQoYzEpICE9IHV0Zl9mb2xkKGMyKSkpCisJICAgIHsKKwkJLyogZGVjb21wb3NpdGlvbiBuZWNlc3Nhcnk/ICovCisJCW1iX2RlY29tcG9zZShjMSwgJmMxMSwgJmp1bmssICZqdW5rKTsKKwkJbWJfZGVjb21wb3NlKGMyLCAmYzEyLCAmanVuaywgJmp1bmspOworCQljMSA9IGMxMTsKKwkJYzIgPSBjMTI7CisJCWlmIChjMTEgIT0gYzEyICYmICghaXJlZ19pYyB8fCB1dGZfZm9sZChjMTEpICE9IHV0Zl9mb2xkKGMxMikpKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwl9CisJcmVzdWx0ID0gYzIgLSBjMTsKKwlpZiAocmVzdWx0ID09IDApCisJICAgICpuID0gKGludCkoc3RyMiAtIHMyKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBjc3RyY2hyOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYSBsb3QgZm9yIHNpbXBsZSBzZWFyY2hlcywga2VlcCBpdCBmYXN0IQorICovCisgICAgc3RhdGljIGNoYXJfdSAqCitjc3RyY2hyKHMsIGMpCisgICAgY2hhcl91CSpzOworICAgIGludAkJYzsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQljYzsKKworICAgIGlmICghaXJlZ19pYworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgKCFlbmNfdXRmOCAmJiBtYl9jaGFyMmxlbihjKSA+IDEpCisjZW5kaWYKKwkgICAgKQorCXJldHVybiB2aW1fc3RyY2hyKHMsIGMpOworCisgICAgLyogdG9sb3dlcigpIGFuZCB0b3VwcGVyKCkgY2FuIGJlIHNsb3csIGNvbXBhcmluZyB0d2ljZSBzaG91bGQgYmUgYSBsb3QKKyAgICAgKiBmYXN0ZXIgKGVzcC4gd2hlbiB1c2luZyBNUyBWaXN1YWwgQysrISkuCisgICAgICogRm9yIFVURi04IG5lZWQgdG8gdXNlIGZvbGRlZCBjYXNlLiAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX3V0ZjggJiYgYyA+IDB4ODApCisJY2MgPSB1dGZfZm9sZChjKTsKKyAgICBlbHNlCisjZW5kaWYKKwkgaWYgKGlzdXBwZXIoYykpCisJY2MgPSBUT0xPV0VSX0xPQyhjKTsKKyAgICBlbHNlIGlmIChpc2xvd2VyKGMpKQorCWNjID0gVE9VUFBFUl9MT0MoYyk7CisgICAgZWxzZQorCXJldHVybiB2aW1fc3RyY2hyKHMsIGMpOworCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisgICAgeworCWZvciAocCA9IHM7ICpwICE9IE5VTDsgcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKQorCXsKKwkgICAgaWYgKGVuY191dGY4ICYmIGMgPiAweDgwKQorCSAgICB7CisJCWlmICh1dGZfZm9sZCh1dGZfcHRyMmNoYXIocCkpID09IGNjKQorCQkgICAgcmV0dXJuIHA7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKnAgPT0gYyB8fCAqcCA9PSBjYykKKwkJcmV0dXJuIHA7CisJfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwkvKiBGYXN0ZXIgdmVyc2lvbiBmb3Igd2hlbiB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiAqLworCWZvciAocCA9IHM7ICpwICE9IE5VTDsgKytwKQorCSAgICBpZiAoKnAgPT0gYyB8fCAqcCA9PSBjYykKKwkJcmV0dXJuIHA7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCSAgICAgIHJlZ3N1YiBzdHVmZgkJCSAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0dWZmIGJlbG93IHJlYWxseSBjb25mdXNlcyBjYyBvbiBhbiBTR0kgLS0gd2ViYiAqLworI2lmZGVmIF9fc2dpCisjIHVuZGVmIF9fQVJHUworIyBkZWZpbmUgX19BUkdTKHgpICAoKQorI2VuZGlmCisKKy8qCisgKiBXZSBzaG91bGQgZGVmaW5lIGZ0cHIgYXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcG9pbnRlciB0bworICogYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gLi4uCisgKiBUaGlzIGlzIGltcG9zc2libGUsIHNvIHdlIGRlY2xhcmUgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEKKyAqIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZC4gVGhpcyBzaG91bGQgd29yayBmb3IgYWxsIGNvbXBpbGVycy4KKyAqLwordHlwZWRlZiB2b2lkICgqKCpmcHRyKSBfX0FSR1MoKGNoYXJfdSAqLCBpbnQpKSkoKTsKKworc3RhdGljIGZwdHIgZG9fdXBwZXIgX19BUkdTKChjaGFyX3UgKiwgaW50KSk7CitzdGF0aWMgZnB0ciBkb19VcHBlciBfX0FSR1MoKGNoYXJfdSAqLCBpbnQpKTsKK3N0YXRpYyBmcHRyIGRvX2xvd2VyIF9fQVJHUygoY2hhcl91ICosIGludCkpOworc3RhdGljIGZwdHIgZG9fTG93ZXIgX19BUkdTKChjaGFyX3UgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQgdmltX3JlZ3N1Yl9ib3RoIF9fQVJHUygoY2hhcl91ICpzb3VyY2UsIGNoYXJfdSAqZGVzdCwgaW50IGNvcHksIGludCBtYWdpYywgaW50IGJhY2tzbGFzaCkpOworCisgICAgc3RhdGljIGZwdHIKK2RvX3VwcGVyKGQsIGMpCisgICAgY2hhcl91ICpkOworICAgIGludCBjOworeworICAgICpkID0gVE9VUFBFUl9MT0MoYyk7CisKKyAgICByZXR1cm4gKGZwdHIpTlVMTDsKK30KKworICAgIHN0YXRpYyBmcHRyCitkb19VcHBlcihkLCBjKQorICAgIGNoYXJfdSAqZDsKKyAgICBpbnQgYzsKK3sKKyAgICAqZCA9IFRPVVBQRVJfTE9DKGMpOworCisgICAgcmV0dXJuIChmcHRyKWRvX1VwcGVyOworfQorCisgICAgc3RhdGljIGZwdHIKK2RvX2xvd2VyKGQsIGMpCisgICAgY2hhcl91ICpkOworICAgIGludCBjOworeworICAgICpkID0gVE9MT1dFUl9MT0MoYyk7CisKKyAgICByZXR1cm4gKGZwdHIpTlVMTDsKK30KKworICAgIHN0YXRpYyBmcHRyCitkb19Mb3dlcihkLCBjKQorICAgIGNoYXJfdQkqZDsKKyAgICBpbnQJCWM7Cit7CisgICAgKmQgPSBUT0xPV0VSX0xPQyhjKTsKKworICAgIHJldHVybiAoZnB0cilkb19Mb3dlcjsKK30KKworLyoKKyAqIHJlZ3RpbGRlKCk6IFJlcGxhY2UgdGlsZGVzIGluIHRoZSBwYXR0ZXJuIGJ5IHRoZSBvbGQgcGF0dGVybi4KKyAqCisgKiBTaG9ydCBleHBsYW5hdGlvbiBvZiB0aGUgdGlsZGU6IEl0IHN0YW5kcyBmb3IgdGhlIHByZXZpb3VzIHJlcGxhY2VtZW50CisgKiBwYXR0ZXJuLiAgSWYgdGhhdCBwcmV2aW91cyBwYXR0ZXJuIGFsc28gY29udGFpbnMgYSB+IHdlIHNob3VsZCBnbyBiYWNrIGEKKyAqIHN0ZXAgZnVydGhlci4uLiAgQnV0IHdlIGluc2VydCB0aGUgcHJldmlvdXMgcGF0dGVybiBpbnRvIHRoZSBjdXJyZW50IG9uZQorICogYW5kIHJlbWVtYmVyIHRoYXQuCisgKiBUaGlzIHN0aWxsIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSAibWFnaWMiIGNoYW5nZXMuIFRPRE8/CisgKgorICogVGhlIHRpbGRlcyBhcmUgcGFyc2VkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIHZpbV9yZWdzdWIoKS4KKyAqLworICAgIGNoYXJfdSAqCityZWd0aWxkZShzb3VyY2UsIG1hZ2ljKQorICAgIGNoYXJfdQkqc291cmNlOworICAgIGludAkJbWFnaWM7Cit7CisgICAgY2hhcl91CSpuZXdzdWIgPSBzb3VyY2U7CisgICAgY2hhcl91CSp0bXBzdWI7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuOworICAgIGludAkJcHJldmxlbjsKKworICAgIGZvciAocCA9IG5ld3N1YjsgKnA7ICsrcCkKKyAgICB7CisJaWYgKCgqcCA9PSAnficgJiYgbWFnaWMpIHx8ICgqcCA9PSAnXFwnICYmICoocCArIDEpID09ICd+JyAmJiAhbWFnaWMpKQorCXsKKwkgICAgaWYgKHJlZ19wcmV2X3N1YiAhPSBOVUxMKQorCSAgICB7CisJCS8qIGxlbmd0aCA9IGxlbihuZXdzdWIpIC0gMSArIGxlbihwcmV2X3N1YikgKyAxICovCisJCXByZXZsZW4gPSAoaW50KVNUUkxFTihyZWdfcHJldl9zdWIpOworCQl0bXBzdWIgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihuZXdzdWIpICsgcHJldmxlbikpOworCQlpZiAodG1wc3ViICE9IE5VTEwpCisJCXsKKwkJICAgIC8qIGNvcHkgcHJlZml4ICovCisJCSAgICBsZW4gPSAoaW50KShwIC0gbmV3c3ViKTsJLyogbm90IGluY2x1ZGluZyB+ICovCisJCSAgICBtY2hfbWVtbW92ZSh0bXBzdWIsIG5ld3N1YiwgKHNpemVfdClsZW4pOworCQkgICAgLyogaW50ZXJwcmV0YXRlIHRpbGRlICovCisJCSAgICBtY2hfbWVtbW92ZSh0bXBzdWIgKyBsZW4sIHJlZ19wcmV2X3N1YiwgKHNpemVfdClwcmV2bGVuKTsKKwkJICAgIC8qIGNvcHkgcG9zdGZpeCAqLworCQkgICAgaWYgKCFtYWdpYykKKwkJCSsrcDsJCQkvKiBiYWNrIG9mZiBcICovCisJCSAgICBTVFJDUFkodG1wc3ViICsgbGVuICsgcHJldmxlbiwgcCArIDEpOworCisJCSAgICBpZiAobmV3c3ViICE9IHNvdXJjZSkJLyogYWxyZWFkeSBhbGxvY2F0ZWQgbmV3c3ViICovCisJCQl2aW1fZnJlZShuZXdzdWIpOworCQkgICAgbmV3c3ViID0gdG1wc3ViOworCQkgICAgcCA9IG5ld3N1YiArIGxlbiArIHByZXZsZW47CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmIChtYWdpYykKKwkJU1RSQ1BZKHAsIHAgKyAxKTsJCS8qIHJlbW92ZSAnficgKi8KKwkgICAgZWxzZQorCQlTVFJDUFkocCwgcCArIDIpOwkJLyogcmVtb3ZlICdcficgKi8KKwkgICAgLS1wOworCX0KKwllbHNlCisJeworCSAgICBpZiAoKnAgPT0gJ1xcJyAmJiBwWzFdKQkJLyogc2tpcCBlc2NhcGVkIGNoYXJhY3RlcnMgKi8KKwkJKytwOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJcCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApIC0gMTsKKyNlbmRpZgorCX0KKyAgICB9CisKKyAgICB2aW1fZnJlZShyZWdfcHJldl9zdWIpOworICAgIGlmIChuZXdzdWIgIT0gc291cmNlKQkvKiBuZXdzdWIgd2FzIGFsbG9jYXRlZCwganVzdCBrZWVwIGl0ICovCisJcmVnX3ByZXZfc3ViID0gbmV3c3ViOworICAgIGVsc2UJCQkvKiBubyB+IGZvdW5kLCBuZWVkIHRvIHNhdmUgbmV3c3ViICAqLworCXJlZ19wcmV2X3N1YiA9IHZpbV9zdHJzYXZlKG5ld3N1Yik7CisgICAgcmV0dXJuIG5ld3N1YjsKK30KKworI2lmZGVmIEZFQVRfRVZBTAorc3RhdGljIGludCBjYW5fZl9zdWJtYXRjaCA9IEZBTFNFOwkvKiBUUlVFIHdoZW4gc3VibWF0Y2goKSBjYW4gYmUgdXNlZCAqLworCisvKiBUaGVzZSBwb2ludGVycyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHJlZ19tYXRjaCBhbmQgcmVnX21tYXRjaCBmb3IKKyAqIHJlZ19zdWJtYXRjaCgpLiAgTmVlZGVkIGZvciB3aGVuIHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIGlzIGFuIGV4cHJlc3Npb24KKyAqIHRoYXQgY29udGFpbnMgYSBjYWxsIHRvIHN1YnN0aXR1dGUoKSBhbmQgc3VibWF0Y2goKS4gKi8KK3N0YXRpYyByZWdtYXRjaF9UCSpzdWJtYXRjaF9tYXRjaDsKK3N0YXRpYyByZWdtbWF0Y2hfVAkqc3VibWF0Y2hfbW1hdGNoOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTU9ESUZZX0ZOQU1FKSB8fCBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiB2aW1fcmVnc3ViKCkgLSBwZXJmb3JtIHN1YnN0aXR1dGlvbnMgYWZ0ZXIgYSB2aW1fcmVnZXhlYygpIG9yCisgKiB2aW1fcmVnZXhlY19tdWx0aSgpIG1hdGNoLgorICoKKyAqIElmICJjb3B5IiBpcyBUUlVFIHJlYWxseSBjb3B5IGludG8gImRlc3QiLgorICogSWYgImNvcHkiIGlzIEZBTFNFIG5vdGhpbmcgaXMgY29waWVkLCB0aGlzIGlzIGp1c3QgdG8gZmluZCBvdXQgdGhlIGxlbmd0aAorICogb2YgdGhlIHJlc3VsdC4KKyAqCisgKiBJZiAiYmFja3NsYXNoIiBpcyBUUlVFLCBhIGJhY2tzbGFzaCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIsIG5lZWQgdG8gZG91YmxlCisgKiB0aGVtIHRvIGtlZXAgdGhlbSwgYW5kIGluc2VydCBhIGJhY2tzbGFzaCBiZWZvcmUgYSBDUiB0byBhdm9pZCBpdCBiZWluZworICogcmVwbGFjZWQgd2l0aCBhIGxpbmUgYnJlYWsgbGF0ZXIuCisgKgorICogTm90ZTogVGhlIG1hdGNoZWQgdGV4dCBtdXN0IG5vdCBjaGFuZ2UgYmV0d2VlbiB0aGUgY2FsbCBvZgorICogdmltX3JlZ2V4ZWMoKS92aW1fcmVnZXhlY19tdWx0aSgpIGFuZCB2aW1fcmVnc3ViKCkhICBJdCB3b3VsZCBtYWtlIHRoZSBiYWNrCisgKiByZWZlcmVuY2VzIGludmFsaWQhCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcmVwbGFjZW1lbnQsIGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUwuCisgKi8KKyAgICBpbnQKK3ZpbV9yZWdzdWIocm1wLCBzb3VyY2UsIGRlc3QsIGNvcHksIG1hZ2ljLCBiYWNrc2xhc2gpCisgICAgcmVnbWF0Y2hfVAkqcm1wOworICAgIGNoYXJfdQkqc291cmNlOworICAgIGNoYXJfdQkqZGVzdDsKKyAgICBpbnQJCWNvcHk7CisgICAgaW50CQltYWdpYzsKKyAgICBpbnQJCWJhY2tzbGFzaDsKK3sKKyAgICByZWdfbWF0Y2ggPSBybXA7CisgICAgcmVnX21tYXRjaCA9IE5VTEw7CisgICAgcmVnX21heGxpbmUgPSAwOworICAgIHJldHVybiB2aW1fcmVnc3ViX2JvdGgoc291cmNlLCBkZXN0LCBjb3B5LCBtYWdpYywgYmFja3NsYXNoKTsKK30KKyNlbmRpZgorCisgICAgaW50Cit2aW1fcmVnc3ViX211bHRpKHJtcCwgbG51bSwgc291cmNlLCBkZXN0LCBjb3B5LCBtYWdpYywgYmFja3NsYXNoKQorICAgIHJlZ21tYXRjaF9UCSpybXA7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBjaGFyX3UJKnNvdXJjZTsKKyAgICBjaGFyX3UJKmRlc3Q7CisgICAgaW50CQljb3B5OworICAgIGludAkJbWFnaWM7CisgICAgaW50CQliYWNrc2xhc2g7Cit7CisgICAgcmVnX21hdGNoID0gTlVMTDsKKyAgICByZWdfbW1hdGNoID0gcm1wOworICAgIHJlZ19idWYgPSBjdXJidWY7CQkvKiBhbHdheXMgd29ya3Mgb24gdGhlIGN1cnJlbnQgYnVmZmVyISAqLworICAgIHJlZ19maXJzdGxudW0gPSBsbnVtOworICAgIHJlZ19tYXhsaW5lID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLSBsbnVtOworICAgIHJldHVybiB2aW1fcmVnc3ViX2JvdGgoc291cmNlLCBkZXN0LCBjb3B5LCBtYWdpYywgYmFja3NsYXNoKTsKK30KKworICAgIHN0YXRpYyBpbnQKK3ZpbV9yZWdzdWJfYm90aChzb3VyY2UsIGRlc3QsIGNvcHksIG1hZ2ljLCBiYWNrc2xhc2gpCisgICAgY2hhcl91CSpzb3VyY2U7CisgICAgY2hhcl91CSpkZXN0OworICAgIGludAkJY29weTsKKyAgICBpbnQJCW1hZ2ljOworICAgIGludAkJYmFja3NsYXNoOworeworICAgIGNoYXJfdQkqc3JjOworICAgIGNoYXJfdQkqZHN0OworICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWM7CisgICAgaW50CQlubyA9IC0xOworICAgIGZwdHIJZnVuYyA9IChmcHRyKU5VTEw7CisgICAgbGluZW5yX1QJY2xudW0gPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCWxlbiA9IDA7CS8qIGluaXQgZm9yIEdDQyAqLworI2lmZGVmIEZFQVRfRVZBTAorICAgIHN0YXRpYyBjaGFyX3UgKmV2YWxfcmVzdWx0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWw7CisjZW5kaWYKKworCisgICAgLyogQmUgcGFyYW5vaWQuLi4gKi8KKyAgICBpZiAoc291cmNlID09IE5VTEwgfHwgZGVzdCA9PSBOVUxMKQorICAgIHsKKwlFTVNHKF8oZV9udWxsKSk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwcm9nX21hZ2ljX3dyb25nKCkpCisJcmV0dXJuIDA7CisgICAgc3JjID0gc291cmNlOworICAgIGRzdCA9IGRlc3Q7CisKKyAgICAvKgorICAgICAqIFdoZW4gdGhlIHN1YnN0aXR1dGUgcGFydCBzdGFydHMgd2l0aCAiXD0iIGV2YWx1YXRlIGl0IGFzIGFuIGV4cHJlc3Npb24uCisgICAgICovCisgICAgaWYgKHNvdXJjZVswXSA9PSAnXFwnICYmIHNvdXJjZVsxXSA9PSAnPScKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgJiYgIWNhbl9mX3N1Ym1hdGNoCSAgICAvKiBjYW4ndCBkbyB0aGlzIHJlY3Vyc2l2ZWx5ICovCisjZW5kaWYKKwkgICAgKQorICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwkvKiBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgbGVuZ3RoIGRvZXNuJ3QgY2hhbmdlIGJldHdlZW4gY2hlY2tpbmcgdGhlCisJICogbGVuZ3RoIGFuZCBjb3B5aW5nIHRoZSBzdHJpbmcsIGFuZCB0byBzcGVlZCB1cCB0aGluZ3MsIHRoZQorCSAqIHJlc3VsdGluZyBzdHJpbmcgaXMgc2F2ZWQgZnJvbSB0aGUgY2FsbCB3aXRoICJjb3B5IiA9PSBGQUxTRSB0byB0aGUKKwkgKiBjYWxsIHdpdGggImNvcHkiID09IFRSVUUuICovCisJaWYgKGNvcHkpCisJeworCSAgICBpZiAoZXZhbF9yZXN1bHQgIT0gTlVMTCkKKwkgICAgeworCQlTVFJDUFkoZGVzdCwgZXZhbF9yZXN1bHQpOworCQlkc3QgKz0gU1RSTEVOKGV2YWxfcmVzdWx0KTsKKwkJdmltX2ZyZWUoZXZhbF9yZXN1bHQpOworCQlldmFsX3Jlc3VsdCA9IE5VTEw7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgbGluZW5yX1QJc2F2ZV9yZWdfbWF4bGluZTsKKwkgICAgd2luX1QJKnNhdmVfcmVnX3dpbjsKKwkgICAgaW50CQlzYXZlX2lyZWdfaWM7CisKKwkgICAgdmltX2ZyZWUoZXZhbF9yZXN1bHQpOworCisJICAgIC8qIFRoZSBleHByZXNzaW9uIG1heSBjb250YWluIHN1YnN0aXR1dGUoKSwgd2hpY2ggY2FsbHMgdXMKKwkgICAgICogcmVjdXJzaXZlbHkuICBNYWtlIHN1cmUgc3VibWF0Y2goKSBnZXRzIHRoZSB0ZXh0IGZyb20gdGhlIGZpcnN0CisJICAgICAqIGxldmVsLiAgRG9uJ3QgbmVlZCB0byBzYXZlICJyZWdfYnVmIiwgYmVjYXVzZQorCSAgICAgKiB2aW1fcmVnZXhlY19tdWx0aSgpIGNhbid0IGJlIGNhbGxlZCByZWN1cnNpdmVseS4gKi8KKwkgICAgc3VibWF0Y2hfbWF0Y2ggPSByZWdfbWF0Y2g7CisJICAgIHN1Ym1hdGNoX21tYXRjaCA9IHJlZ19tbWF0Y2g7CisJICAgIHNhdmVfcmVnX21heGxpbmUgPSByZWdfbWF4bGluZTsKKwkgICAgc2F2ZV9yZWdfd2luID0gcmVnX3dpbjsKKwkgICAgc2F2ZV9pcmVnX2ljID0gaXJlZ19pYzsKKwkgICAgY2FuX2Zfc3VibWF0Y2ggPSBUUlVFOworCisJICAgIGV2YWxfcmVzdWx0ID0gZXZhbF90b19zdHJpbmcoc291cmNlICsgMiwgTlVMTCk7CisJICAgIGlmIChldmFsX3Jlc3VsdCAhPSBOVUxMKQorCSAgICB7CisJCWZvciAocyA9IGV2YWxfcmVzdWx0OyAqcyAhPSBOVUw7ICsrcykKKwkJeworCQkgICAgLyogQ2hhbmdlIE5MIHRvIENSLCBzbyB0aGF0IGl0IGJlY29tZXMgYSBsaW5lIGJyZWFrLgorCQkgICAgICogU2tpcCBvdmVyIGEgYmFja3NsYXNoZWQgY2hhcmFjdGVyLiAqLworCQkgICAgaWYgKCpzID09IE5MKQorCQkJKnMgPSBDQVI7CisJCSAgICBlbHNlIGlmICgqcyA9PSAnXFwnICYmIHNbMV0gIT0gTlVMKQorCQkJKytzOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQlzICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocykgLSAxOworI2VuZGlmCisJCX0KKworCQlkc3QgKz0gU1RSTEVOKGV2YWxfcmVzdWx0KTsKKwkgICAgfQorCisJICAgIHJlZ19tYXRjaCA9IHN1Ym1hdGNoX21hdGNoOworCSAgICByZWdfbW1hdGNoID0gc3VibWF0Y2hfbW1hdGNoOworCSAgICByZWdfbWF4bGluZSA9IHNhdmVfcmVnX21heGxpbmU7CisJICAgIHJlZ193aW4gPSBzYXZlX3JlZ193aW47CisJICAgIGlyZWdfaWMgPSBzYXZlX2lyZWdfaWM7CisJICAgIGNhbl9mX3N1Ym1hdGNoID0gRkFMU0U7CisJfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHdoaWxlICgoYyA9ICpzcmMrKykgIT0gTlVMKQorICAgICAgeworCWlmIChjID09ICcmJyAmJiBtYWdpYykKKwkgICAgbm8gPSAwOworCWVsc2UgaWYgKGMgPT0gJ1xcJyAmJiAqc3JjICE9IE5VTCkKKwl7CisJICAgIGlmICgqc3JjID09ICcmJyAmJiAhbWFnaWMpCisJICAgIHsKKwkJKytzcmM7CisJCW5vID0gMDsKKwkgICAgfQorCSAgICBlbHNlIGlmICgnMCcgPD0gKnNyYyAmJiAqc3JjIDw9ICc5JykKKwkgICAgeworCQlubyA9ICpzcmMrKyAtICcwJzsKKwkgICAgfQorCSAgICBlbHNlIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikidVVsTGVFIiwgKnNyYykpCisJICAgIHsKKwkJc3dpdGNoICgqc3JjKyspCisJCXsKKwkJY2FzZSAndSc6ICAgZnVuYyA9IChmcHRyKWRvX3VwcGVyOworCQkJICAgIGNvbnRpbnVlOworCQljYXNlICdVJzogICBmdW5jID0gKGZwdHIpZG9fVXBwZXI7CisJCQkgICAgY29udGludWU7CisJCWNhc2UgJ2wnOiAgIGZ1bmMgPSAoZnB0cilkb19sb3dlcjsKKwkJCSAgICBjb250aW51ZTsKKwkJY2FzZSAnTCc6ICAgZnVuYyA9IChmcHRyKWRvX0xvd2VyOworCQkJICAgIGNvbnRpbnVlOworCQljYXNlICdlJzoKKwkJY2FzZSAnRSc6ICAgZnVuYyA9IChmcHRyKU5VTEw7CisJCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCX0KKwlpZiAobm8gPCAwKQkgICAgICAvKiBPcmRpbmFyeSBjaGFyYWN0ZXIuICovCisJeworCSAgICBpZiAoYyA9PSAnXFwnICYmICpzcmMgIT0gTlVMKQorCSAgICB7CisJCS8qIENoZWNrIGZvciBhYmJyZXZpYXRpb25zIC0tIHdlYmIgKi8KKwkJc3dpdGNoICgqc3JjKQorCQl7CisJCSAgICBjYXNlICdyJzoJYyA9IENBUjsJKytzcmM7CWJyZWFrOworCQkgICAgY2FzZSAnbic6CWMgPSBOTDsJCSsrc3JjOwlicmVhazsKKwkJICAgIGNhc2UgJ3QnOgljID0gVEFCOwkrK3NyYzsJYnJlYWs7CisJCSAvKiBPaCBubyEgIFxlIGFscmVhZHkgaGFzIG1lYW5pbmcgaW4gc3Vic3QgcGF0IDotKCAqLworCQkgLyogY2FzZSAnZSc6ICAgYyA9IEVTQzsJKytzcmM7CWJyZWFrOyAqLworCQkgICAgY2FzZSAnYic6CWMgPSBDdHJsX0g7CSsrc3JjOwlicmVhazsKKworCQkgICAgLyogSWYgImJhY2tzbGFzaCIgaXMgVFJVRSB0aGUgYmFja3NsYXNoIHdpbGwgYmUgcmVtb3ZlZAorCQkgICAgICogbGF0ZXIuICBVc2VkIHRvIGluc2VydCBhIGxpdGVyYWwgQ1IuICovCisJCSAgICBkZWZhdWx0OglpZiAoYmFja3NsYXNoKQorCQkJCXsKKwkJCQkgICAgaWYgKGNvcHkpCisJCQkJCSpkc3QgPSAnXFwnOworCQkJCSAgICArK2RzdDsKKwkJCQl9CisJCQkJYyA9ICpzcmMrKzsKKwkJfQorCSAgICB9CisKKwkgICAgLyogV3JpdGUgdG8gYnVmZmVyLCBpZiBjb3B5IGlzIHNldC4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHNyYyAtIDEpKSA+IDEpCisJICAgIHsKKwkJLyogVE9ETzogc2hvdWxkIHVzZSAiZnVuYyIgaGVyZS4gKi8KKwkJaWYgKGNvcHkpCisJCSAgICBtY2hfbWVtbW92ZShkc3QsIHNyYyAtIDEsIGwpOworCQlkc3QgKz0gbCAtIDE7CisJCXNyYyArPSBsIC0gMTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKyNlbmRpZgorCQlpZiAoY29weSkKKwkJeworCQkgICAgaWYgKGZ1bmMgPT0gKGZwdHIpTlVMTCkJLyoganVzdCBjb3B5ICovCisJCQkqZHN0ID0gYzsKKwkJICAgIGVsc2UJCQkvKiBjaGFuZ2UgY2FzZSAqLworCQkJZnVuYyA9IChmcHRyKShmdW5jKGRzdCwgYykpOworCQkgICAgLyogVHVyYm8gQyBjb21wbGFpbnMgd2l0aG91dCB0aGUgdHlwZWNhc3QgKi8KKwkJfQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfQorI2VuZGlmCisJICAgIGRzdCsrOworCX0KKwllbHNlCisJeworCSAgICBpZiAoUkVHX01VTFRJKQorCSAgICB7CisJCWNsbnVtID0gcmVnX21tYXRjaC0+c3RhcnRwb3Nbbm9dLmxudW07CisJCWlmIChjbG51bSA8IDAgfHwgcmVnX21tYXRjaC0+ZW5kcG9zW25vXS5sbnVtIDwgMCkKKwkJICAgIHMgPSBOVUxMOworCQllbHNlCisJCXsKKwkJICAgIHMgPSByZWdfZ2V0bGluZShjbG51bSkgKyByZWdfbW1hdGNoLT5zdGFydHBvc1tub10uY29sOworCQkgICAgaWYgKHJlZ19tbWF0Y2gtPmVuZHBvc1tub10ubG51bSA9PSBjbG51bSkKKwkJCWxlbiA9IHJlZ19tbWF0Y2gtPmVuZHBvc1tub10uY29sCisJCQkJCSAgICAgICAtIHJlZ19tbWF0Y2gtPnN0YXJ0cG9zW25vXS5jb2w7CisJCSAgICBlbHNlCisJCQlsZW4gPSAoaW50KVNUUkxFTihzKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlzID0gcmVnX21hdGNoLT5zdGFydHBbbm9dOworCQlpZiAocmVnX21hdGNoLT5lbmRwW25vXSA9PSBOVUxMKQorCQkgICAgcyA9IE5VTEw7CisJCWVsc2UKKwkJICAgIGxlbiA9IChpbnQpKHJlZ19tYXRjaC0+ZW5kcFtub10gLSBzKTsKKwkgICAgfQorCSAgICBpZiAocyAhPSBOVUxMKQorCSAgICB7CisJCWZvciAoOzspCisJCXsKKwkJICAgIGlmIChsZW4gPT0gMCkKKwkJICAgIHsKKwkJCWlmIChSRUdfTVVMVEkpCisJCQl7CisJCQkgICAgaWYgKHJlZ19tbWF0Y2gtPmVuZHBvc1tub10ubG51bSA9PSBjbG51bSkKKwkJCQlicmVhazsKKwkJCSAgICBpZiAoY29weSkKKwkJCQkqZHN0ID0gQ0FSOworCQkJICAgICsrZHN0OworCQkJICAgIHMgPSByZWdfZ2V0bGluZSgrK2NsbnVtKTsKKwkJCSAgICBpZiAocmVnX21tYXRjaC0+ZW5kcG9zW25vXS5sbnVtID09IGNsbnVtKQorCQkJCWxlbiA9IHJlZ19tbWF0Y2gtPmVuZHBvc1tub10uY29sOworCQkJICAgIGVsc2UKKwkJCQlsZW4gPSAoaW50KVNUUkxFTihzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKCpzID09IE5VTCkgLyogd2UgaGl0IE5VTC4gKi8KKwkJICAgIHsKKwkJCWlmIChjb3B5KQorCQkJICAgIEVNU0coXyhlX3JlX2RhbWcpKTsKKwkJCWdvdG8gZXhpdDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChiYWNrc2xhc2ggJiYgKCpzID09IENBUiB8fCAqcyA9PSAnXFwnKSkKKwkJCXsKKwkJCSAgICAvKgorCQkJICAgICAqIEluc2VydCBhIGJhY2tzbGFzaCBpbiBmcm9udCBvZiBhIENSLCBvdGhlcndpc2UKKwkJCSAgICAgKiBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgbGluZSBicmVhay4KKwkJCSAgICAgKiBOdW1iZXIgb2YgYmFja3NsYXNoZXMgd2lsbCBiZSBoYWx2ZWQgbGF0ZXIsCisJCQkgICAgICogZG91YmxlIHRoZW0gaGVyZS4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAoY29weSkKKwkJCSAgICB7CisJCQkJZHN0WzBdID0gJ1xcJzsKKwkJCQlkc3RbMV0gPSAqczsKKwkJCSAgICB9CisJCQkgICAgZHN0ICs9IDI7CisJCQl9CisjaWZkZWYgRkVBVF9NQllURQorCQkJZWxzZSBpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuX2NoZWNrKShzKSkgPiAxKQorCQkJeworCQkJICAgIC8qIFRPRE86IHNob3VsZCB1c2UgImZ1bmMiIGhlcmUuICovCisJCQkgICAgaWYgKGNvcHkpCisJCQkJbWNoX21lbW1vdmUoZHN0LCBzLCBsKTsKKwkJCSAgICBkc3QJKz0gbDsKKwkJCSAgICBzICs9IGwgLSAxOworCQkJICAgIGxlbgktPSBsIC0gMTsKKwkJCX0KKyNlbmRpZgorCQkJZWxzZQorCQkJeworCQkJICAgIGlmIChjb3B5KQorCQkJICAgIHsKKwkJCQlpZiAoZnVuYyA9PSAoZnB0cilOVUxMKQkgICAgLyoganVzdCBjb3B5ICovCisJCQkJICAgICpkc3QgPSAqczsKKwkJCQllbHNlCQkJICAgIC8qIGNoYW5nZSBjYXNlICovCisJCQkJICAgIGZ1bmMgPSAoZnB0cikoZnVuYyhkc3QsICpzKSk7CisJCQkJLyogVHVyYm8gQyBjb21wbGFpbnMgd2l0aG91dCB0aGUgdHlwZWNhc3QgKi8KKwkJCSAgICB9CisJCQkgICAgKytkc3Q7CisJCQl9CisJCQkrK3M7CisJCQktLWxlbjsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIG5vID0gLTE7CisJfQorICAgICAgfQorICAgIGlmIChjb3B5KQorCSpkc3QgPSBOVUw7CisKK2V4aXQ6CisgICAgcmV0dXJuIChpbnQpKChkc3QgLSBkZXN0KSArIDEpOworfQorCisjaWZkZWYgRkVBVF9FVkFMCisvKgorICogVXNlZCBmb3IgdGhlIHN1Ym1hdGNoKCkgZnVuY3Rpb246IGdldCB0aGUgc3RyaW5nIGZyb20gdG5lIG4ndGggc3VibWF0Y2ggaW4KKyAqIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiBub3QgaW4gYSAiOnMiIGNvbW1hbmQgYW5kIGZvciBhIG5vbi1leGlzdGluZyBzdWJtYXRjaC4KKyAqLworICAgIGNoYXJfdSAqCityZWdfc3VibWF0Y2gobm8pCisgICAgaW50CQlubzsKK3sKKyAgICBjaGFyX3UJKnJldHZhbCA9IE5VTEw7CisgICAgY2hhcl91CSpzOworICAgIGludAkJbGVuOworICAgIGludAkJcm91bmQ7CisgICAgbGluZW5yX1QJbG51bTsKKworICAgIGlmICghY2FuX2Zfc3VibWF0Y2gpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3VibWF0Y2hfbWF0Y2ggPT0gTlVMTCkKKyAgICB7CisJLyoKKwkgKiBGaXJzdCByb3VuZDogY29tcHV0ZSB0aGUgbGVuZ3RoIGFuZCBhbGxvY2F0ZSBtZW1vcnkuCisJICogU2Vjb25kIHJvdW5kOiBjb3B5IHRoZSB0ZXh0LgorCSAqLworCWZvciAocm91bmQgPSAxOyByb3VuZCA8PSAyOyArK3JvdW5kKQorCXsKKwkgICAgbG51bSA9IHN1Ym1hdGNoX21tYXRjaC0+c3RhcnRwb3Nbbm9dLmxudW07CisJICAgIGlmIChsbnVtIDwgMCB8fCBzdWJtYXRjaF9tbWF0Y2gtPmVuZHBvc1tub10ubG51bSA8IDApCisJCXJldHVybiBOVUxMOworCisJICAgIHMgPSByZWdfZ2V0bGluZShsbnVtKSArIHN1Ym1hdGNoX21tYXRjaC0+c3RhcnRwb3Nbbm9dLmNvbDsKKwkgICAgaWYgKHMgPT0gTlVMTCkgIC8qIGFudGktY3Jhc2ggY2hlY2ssIGNhbm5vdCBoYXBwZW4/ICovCisJCWJyZWFrOworCSAgICBpZiAoc3VibWF0Y2hfbW1hdGNoLT5lbmRwb3Nbbm9dLmxudW0gPT0gbG51bSkKKwkgICAgeworCQkvKiBXaXRoaW4gb25lIGxpbmU6IHRha2UgZm9ybSBzdGFydCB0byBlbmQgY29sLiAqLworCQlsZW4gPSBzdWJtYXRjaF9tbWF0Y2gtPmVuZHBvc1tub10uY29sCisJCQkJCSAgLSBzdWJtYXRjaF9tbWF0Y2gtPnN0YXJ0cG9zW25vXS5jb2w7CisJCWlmIChyb3VuZCA9PSAyKQorCQl7CisJCSAgICBTVFJOQ1BZKHJldHZhbCwgcywgbGVuKTsKKwkJICAgIHJldHZhbFtsZW5dID0gTlVMOworCQl9CisJCSsrbGVuOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBNdWx0aXBsZSBsaW5lczogdGFrZSBzdGFydCBsaW5lIGZyb20gc3RhcnQgY29sLCBtaWRkbGUKKwkJICogbGluZXMgY29tcGxldGVseSBhbmQgZW5kIGxpbmUgdXAgdG8gZW5kIGNvbC4gKi8KKwkJbGVuID0gKGludClTVFJMRU4ocyk7CisJCWlmIChyb3VuZCA9PSAyKQorCQl7CisJCSAgICBTVFJDUFkocmV0dmFsLCBzKTsKKwkJICAgIHJldHZhbFtsZW5dID0gJ1xuJzsKKwkJfQorCQkrK2xlbjsKKwkJKytsbnVtOworCQl3aGlsZSAobG51bSA8IHN1Ym1hdGNoX21tYXRjaC0+ZW5kcG9zW25vXS5sbnVtKQorCQl7CisJCSAgICBzID0gcmVnX2dldGxpbmUobG51bSsrKTsKKwkJICAgIGlmIChyb3VuZCA9PSAyKQorCQkJU1RSQ1BZKHJldHZhbCArIGxlbiwgcyk7CisJCSAgICBsZW4gKz0gKGludClTVFJMRU4ocyk7CisJCSAgICBpZiAocm91bmQgPT0gMikKKwkJCXJldHZhbFtsZW5dID0gJ1xuJzsKKwkJICAgICsrbGVuOworCQl9CisJCWlmIChyb3VuZCA9PSAyKQorCQkgICAgU1RSTkNQWShyZXR2YWwgKyBsZW4sIHJlZ19nZXRsaW5lKGxudW0pLAorCQkJCQkgICAgIHN1Ym1hdGNoX21tYXRjaC0+ZW5kcG9zW25vXS5jb2wpOworCQlsZW4gKz0gc3VibWF0Y2hfbW1hdGNoLT5lbmRwb3Nbbm9dLmNvbDsKKwkJaWYgKHJvdW5kID09IDIpCisJCSAgICByZXR2YWxbbGVuXSA9IE5VTDsKKwkJKytsZW47CisJICAgIH0KKworCSAgICBpZiAocm91bmQgPT0gMSkKKwkgICAgeworCQlyZXR2YWwgPSBsYWxsb2MoKGxvbmdfdSlsZW4sIFRSVUUpOworCQlpZiAocyA9PSBOVUxMKQorCQkgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKHN1Ym1hdGNoX21hdGNoLT5lbmRwW25vXSA9PSBOVUxMKQorCSAgICByZXR2YWwgPSBOVUxMOworCWVsc2UKKwl7CisJICAgIHMgPSBzdWJtYXRjaF9tYXRjaC0+c3RhcnRwW25vXTsKKwkgICAgcmV0dmFsID0gdmltX3N0cm5zYXZlKHMsIChpbnQpKHN1Ym1hdGNoX21hdGNoLT5lbmRwW25vXSAtIHMpKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3JlZ2V4cC5oIGIvc3JjL3JlZ2V4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjExZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcmVnZXhwLmgKQEAgLTAsMCArMSw4MCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBOT1RJQ0UgTk9USUNFIE5PVElDRSBOT1RJQ0UgTk9USUNFIE5PVElDRSBOT1RJQ0UgTk9USUNFIE5PVElDRSBOT1RJQ0UKKyAqCisgKiBUaGlzIGlzIE5PVCB0aGUgb3JpZ2luYWwgcmVndWxhciBleHByZXNzaW9uIGNvZGUgYXMgd3JpdHRlbiBieSBIZW5yeQorICogU3BlbmNlci4gIFRoaXMgY29kZSBoYXMgYmVlbiBtb2RpZmllZCBzcGVjaWZpY2FsbHkgZm9yIHVzZSB3aXRoIFZpbSwgYW5kCisgKiBzaG91bGQgbm90IGJlIHVzZWQgYXBhcnQgZnJvbSBjb21waWxpbmcgVmltLiAgSWYgeW91IHdhbnQgYSBnb29kIHJlZ3VsYXIKKyAqIGV4cHJlc3Npb24gbGlicmFyeSwgZ2V0IHRoZSBvcmlnaW5hbCBjb2RlLgorICoKKyAqIE5PVElDRSBOT1RJQ0UgTk9USUNFIE5PVElDRSBOT1RJQ0UgTk9USUNFIE5PVElDRSBOT1RJQ0UgTk9USUNFIE5PVElDRQorICovCisKKyNpZm5kZWYgX1JFR0VYUF9ICisjZGVmaW5lIF9SRUdFWFBfSAorCisvKgorICogVGhlIG51bWJlciBvZiBzdWItbWF0Y2hlcyBpcyBsaW1pdGVkIHRvIDEwLgorICogVGhlIGZpcnN0IG9uZSAoaW5kZXggMCkgaXMgdGhlIHdob2xlIG1hdGNoLCByZWZlcmVuY2VkIHdpdGggIlwwIi4KKyAqIFRoZSBzZWNvbmQgb25lIChpbmRleCAxKSBpcyB0aGUgZmlyc3Qgc3ViLW1hdGNoLCByZWZlcmVuY2VkIHdpdGggIlwxIi4KKyAqIFRoaXMgZ29lcyB1cCB0byB0aGUgdGVudGggKGluZGV4IDkpLCByZWZlcmVuY2VkIHdpdGggIlw5Ii4KKyAqLworI2RlZmluZSBOU1VCRVhQICAxMAorCisvKgorICogU3RydWN0dXJlIHJldHVybmVkIGJ5IHZpbV9yZWdjb21wKCkgdG8gcGFzcyBvbiB0byB2aW1fcmVnZXhlYygpLgorICogVGhlc2UgZmllbGRzIGFyZSBvbmx5IHRvIGJlIHVzZWQgaW4gcmVnZXhwLmMhCisgKiBTZWUgcmVnZXAuYyBmb3IgYW4gZXhwbGFuYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQkJcmVnc3RhcnQ7CisgICAgY2hhcl91CQlyZWdhbmNoOworICAgIGNoYXJfdQkJKnJlZ211c3Q7CisgICAgaW50CQkJcmVnbWxlbjsKKyAgICB1bnNpZ25lZAkJcmVnZmxhZ3M7CisgICAgY2hhcl91CQlyZWdoYXN6OworICAgIGNoYXJfdQkJcHJvZ3JhbVsxXTsJCS8qIGFjdHVhbGx5IGxvbmdlci4uICovCit9IHJlZ3Byb2dfVDsKKworLyoKKyAqIFN0cnVjdHVyZSB0byBiZSB1c2VkIGZvciBzaW5nbGUtbGluZSBtYXRjaGluZy4KKyAqIFN1Yi1tYXRjaCAibm8iIHN0YXJ0cyBhdCAic3RhcnRwW25vXSIgYW5kIGVuZHMganVzdCBiZWZvcmUgImVuZHBbbm9dIi4KKyAqIFdoZW4gdGhlcmUgaXMgbm8gbWF0Y2gsIHRoZSBwb2ludGVyIGlzIE5VTEwuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgcmVncHJvZ19UCQkqcmVncHJvZzsKKyAgICBjaGFyX3UJCSpzdGFydHBbTlNVQkVYUF07CisgICAgY2hhcl91CQkqZW5kcFtOU1VCRVhQXTsKKyAgICBpbnQJCQlybV9pYzsKK30gcmVnbWF0Y2hfVDsKKworLyoKKyAqIFN0cnVjdHVyZSB0byBiZSB1c2VkIGZvciBtdWx0aS1saW5lIG1hdGNoaW5nLgorICogU3ViLW1hdGNoICJubyIgc3RhcnRzIGluIGxpbmUgInN0YXJ0cG9zW25vXS5sbnVtIiBjb2x1bW4gInN0YXJ0cG9zW25vXS5jb2wiCisgKiBhbmQgZW5kcyBpbiBsaW5lICJlbmRwb3Nbbm9dLmxudW0iIGp1c3QgYmVmb3JlIGNvbHVtbiAiZW5kcG9zW25vXS5jb2wiLgorICogVGhlIGxpbmUgbnVtYmVycyBhcmUgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGxpbmUsIHRodXMgc3RhcnRwb3NbMF0ubG51bSBpcworICogYWx3YXlzIDAuCisgKiBXaGVuIHRoZXJlIGlzIG5vIG1hdGNoLCB0aGUgbGluZSBudW1iZXIgaXMgLTEuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgcmVncHJvZ19UCQkqcmVncHJvZzsKKyAgICBscG9zX1QJCXN0YXJ0cG9zW05TVUJFWFBdOworICAgIGxwb3NfVAkJZW5kcG9zW05TVUJFWFBdOworICAgIGludAkJCXJtbV9pYzsKK30gcmVnbW1hdGNoX1Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBleHRlcm5hbCByZWZlcmVuY2VzOiAiXHpcKFwpIiB0byAiXHpcMSIuCisgKiBVc2UgYSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY29weSB0aGlzIGFyb3VuZC4gIFdoZW4gaXQgZ29lcworICogZnJvbSAxIHRvIHplcm8gdGhlIG1hdGNoZXMgbmVlZCB0byBiZSBmcmVlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzaG9ydAkJcmVmY250OworICAgIGNoYXJfdQkJKm1hdGNoZXNbTlNVQkVYUF07Cit9IHJlZ19leHRtYXRjaF9UOworCisjZW5kaWYJLyogX1JFR0VYUF9IICovCmRpZmYgLS1naXQgYS9zcmMvc2NyZWVuLmMgYi9zcmMvc2NyZWVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0YzQyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zY3JlZW4uYwpAQCAtMCwwICsxLDg0MzcgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIHNjcmVlbi5jOiBjb2RlIGZvciBkaXNwbGF5aW5nIG9uIHRoZSBzY3JlZW4KKyAqCisgKiBPdXRwdXQgdG8gdGhlIHNjcmVlbiAoY29uc29sZSwgdGVybWluYWwgZW11bGF0b3Igb3IgR1VJIHdpbmRvdykgaXMgbWluaW1pemVkCisgKiBieSByZW1lbWJlcmluZyB3aGF0IGlzIGFscmVhZHkgb24gdGhlIHNjcmVlbiwgYW5kIG9ubHkgdXBkYXRpbmcgdGhlIHBhcnRzCisgKiB0aGF0IGNoYW5nZWQuCisgKgorICogU2NyZWVuTGluZXNbb2ZmXSAgQ29udGFpbnMgYSBjb3B5IG9mIHRoZSB3aG9sZSBzY3JlZW4sIGFzIGl0IGlzIGN1cnJlbnRseQorICoJCSAgICAgZGlzcGxheWVkIChleGNsdWRpbmcgdGV4dCB3cml0dGVuIGJ5IGV4dGVybmFsIGNvbW1hbmRzKS4KKyAqIFNjcmVlbkF0dHJzW29mZl0gIENvbnRhaW5zIHRoZSBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuCisgKiBMaW5lT2Zmc2V0W3Jvd10gICBDb250YWlucyB0aGUgb2Zmc2V0IGludG8gU2NyZWVuTGluZXMqW10gYW5kIFNjcmVlbkF0dHJzW10KKyAqCQkgICAgIGZvciBlYWNoIGxpbmUuCisgKiBMaW5lV3JhcHNbcm93XSAgICBGbGFnIGZvciBlYWNoIGxpbmUgd2hldGhlciBpdCB3cmFwcyB0byB0aGUgbmV4dCBsaW5lLgorICoKKyAqIEZvciBkb3VibGUtYnl0ZSBjaGFyYWN0ZXJzLCB0d28gY29uc2VjdXRpdmUgYnl0ZXMgaW4gU2NyZWVuTGluZXNbXSBjYW4gZm9ybQorICogb25lIGNoYXJhY3RlciB3aGljaCBvY2N1cGllcyB0d28gZGlzcGxheSBjZWxscy4KKyAqIEZvciBVVEYtOCBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGlzIGNvbnZlcnRlZCB0byBVbmljb2RlIGFuZCBzdG9yZWQgaW4KKyAqIFNjcmVlbkxpbmVzVUNbXS4gIFNjcmVlbkxpbmVzW10gY29udGFpbnMgdGhlIGZpcnN0IGJ5dGUgb25seS4gIEZvciBhbiBBU0NJSQorICogY2hhcmFjdGVyIHdpdGhvdXQgY29tcG9zaW5nIGNoYXJzIFNjcmVlbkxpbmVzVUNbXSB3aWxsIGJlIDAuICBXaGVuIHRoZQorICogY2hhcmFjdGVyIG9jY3VwaWVzIHR3byBkaXNwbGF5IGNlbGxzIHRoZSBuZXh0IGJ5dGUgaW4gU2NyZWVuTGluZXNbXSBpcyAwLgorICogU2NyZWVuTGluZXNDMVtdIGFuZCBTY3JlZW5MaW5lc0MyW10gY29udGFpbiB1cCB0byB0d28gY29tcG9zaW5nIGNoYXJhY3RlcnMKKyAqIChkcmF3biBvbiB0b3Agb2YgdGhlIGZpcnN0IGNoYXJhY3RlcikuICBUaGV5IGFyZSAwIHdoZW4gbm90IHVzZWQuCisgKiBTY3JlZW5MaW5lczJbXSBpcyBvbmx5IHVzZWQgZm9yIGV1Yy1qcCB0byBzdG9yZSB0aGUgc2Vjb25kIGJ5dGUgaWYgdGhlCisgKiBmaXJzdCBieXRlIGlzIDB4OGUgKHNpbmdsZS13aWR0aCBjaGFyYWN0ZXIpLgorICoKKyAqIFRoZSBzY3JlZW5fKigpIGZ1bmN0aW9ucyB3cml0ZSB0byB0aGUgc2NyZWVuIGFuZCBoYW5kbGUgdXBkYXRpbmcKKyAqIFNjcmVlbkxpbmVzW10uCisgKgorICogdXBkYXRlX3NjcmVlbigpIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgYWxsIHdpbmRvd3MgYW5kIHN0YXR1cyBsaW5lcy4KKyAqIEl0IGlzIGNhbGxlZCBmb3JtIHRoZSBtYWluIGxvb3Agd2hlbiBtdXN0X3JlZHJhdyBpcyBub24temVyby4gIEl0IG1heSBiZQorICogY2FsbGVkIGZyb20gb3RoZXIgcGxhY2VzIHdoZW4gYW4gaW1tZWRpYXRlZCBzY3JlZW4gdXBkYXRlIGlzIG5lZWRlZC4KKyAqCisgKiBUaGUgcGFydCBvZiB0aGUgYnVmZmVyIHRoYXQgaXMgZGlzcGxheWVkIGluIGEgd2luZG93IGlzIHNldCB3aXRoOgorICogLSB3X3RvcGxpbmUgKGZpcnN0IGJ1ZmZlciBsaW5lIGluIHdpbmRvdykKKyAqIC0gd190b3BmaWxsIChmaWxsZXIgbGluZSBhYm92ZSB0aGUgZmlyc3QgbGluZSkKKyAqIC0gd19sZWZ0Y29sIChsZWZ0bW9zdCB3aW5kb3cgY2VsbCBpbiB3aW5kb3cpLAorICogLSB3X3NraXBjb2wgKHNraXBwZWQgd2luZG93IGNlbGxzIG9mIGZpcnN0IGxpbmUpCisgKgorICogQ29tbWFuZHMgdGhhdCBvbmx5IG1vdmUgdGhlIGN1cnNvciBhcm91bmQgaW4gYSB3aW5kb3csIGRvIG5vdCBuZWVkIHRvIHRha2UKKyAqIGFjdGlvbiB0byB1cGRhdGUgdGhlIGRpc3BsYXkuICBUaGUgbWFpbiBsb29wIHdpbGwgY2hlY2sgaWYgd190b3BsaW5lIGlzCisgKiB2YWxpZCBhbmQgdXBkYXRlIGl0IChzY3JvbGwgdGhlIHdpbmRvdykgd2hlbiBuZWVkZWQuCisgKgorICogQ29tbWFuZHMgdGhhdCBzY3JvbGwgYSB3aW5kb3cgY2hhbmdlIHdfdG9wbGluZSBhbmQgbXVzdCBjYWxsCisgKiBjaGVja19jdXJzb3IoKSB0byBtb3ZlIHRoZSBjdXJzb3IgaW50byB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSB3aW5kb3csIGFuZAorICogY2FsbCByZWRyYXdfbGF0ZXIoVkFMSUQpIHRvIGhhdmUgdGhlIHdpbmRvdyBkaXNwbGF5ZWQgYnkgdXBkYXRlX3NjcmVlbigpCisgKiBsYXRlci4KKyAqCisgKiBDb21tYW5kcyB0aGF0IGNoYW5nZSB0ZXh0IGluIHRoZSBidWZmZXIgbXVzdCBjYWxsIGNoYW5nZWRfYnl0ZXMoKSBvcgorICogY2hhbmdlZF9saW5lcygpIHRvIG1hcmsgdGhlIGFyZWEgdGhhdCBjaGFuZ2VkIGFuZCB3aWxsIHJlcXVpcmUgdXBkYXRpbmcKKyAqIGxhdGVyLiAgVGhlIG1haW4gbG9vcCB3aWxsIGNhbGwgdXBkYXRlX3NjcmVlbigpLCB3aGljaCB3aWxsIHVwZGF0ZSBlYWNoCisgKiB3aW5kb3cgdGhhdCBzaG93cyB0aGUgY2hhbmdlZCBidWZmZXIuICBUaGlzIGFzc3VtZXMgdGV4dCBhYm92ZSB0aGUgY2hhbmdlCisgKiBjYW4gcmVtYWluIGRpc3BsYXllZCBhcyBpdCBpcy4gIFRleHQgYWZ0ZXIgdGhlIGNoYW5nZSBtYXkgbmVlZCB1cGRhdGluZyBmb3IKKyAqIHNjcm9sbGluZywgZm9sZGluZyBhbmQgc3ludGF4IGhpZ2hsaWdodGluZy4KKyAqCisgKiBDb21tYW5kcyB0aGF0IGNoYW5nZSBob3cgYSB3aW5kb3cgaXMgZGlzcGxheWVkIChlLmcuLCBzZXR0aW5nICdsaXN0Jykgb3IKKyAqIGludmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIGEgd2luZG93IGluIGFub3RoZXIgd2F5IChlLmcuLCBjaGFuZ2UgZm9sZAorICogc2V0dGluZ3MpLCBtdXN0IGNhbGwgcmVkcmF3X2xhdGVyKE5PVF9WQUxJRCkgdG8gaGF2ZSB0aGUgd2hvbGUgd2luZG93CisgKiByZWRpc3BsYXllZCBieSB1cGRhdGVfc2NyZWVuKCkgbGF0ZXIuCisgKgorICogQ29tbWFuZHMgdGhhdCBjaGFuZ2UgaG93IGEgYnVmZmVyIGlzIGRpc3BsYXllZCAoZS5nLiwgc2V0dGluZyAndGFic3RvcCcpCisgKiBtdXN0IGNhbGwgcmVkcmF3X2N1cmJ1Zl9sYXRlcihOT1RfVkFMSUQpIHRvIGhhdmUgYWxsIHRoZSB3aW5kb3dzIGZvciB0aGUKKyAqIGJ1ZmZlciByZWRpc3BsYXllZCBieSB1cGRhdGVfc2NyZWVuKCkgbGF0ZXIuCisgKgorICogQ29tbWFuZHMgdGhhdCBtb3ZlIHRoZSB3aW5kb3cgcG9zaXRpb24gbXVzdCBjYWxsIHJlZHJhd19sYXRlcihOT1RfVkFMSUQpLgorICogVE9ETzogc2hvdWxkIG1pbmltaXplIHJlZHJhd2luZyBieSBzY3JvbGxpbmcgd2hlbiBwb3NzaWJsZS4KKyAqCisgKiBDb21tYW5kcyB0aGF0IGNoYW5nZSBldmVyeXRoaW5nIChlLmcuLCByZXNpemluZyB0aGUgc2NyZWVuKSBtdXN0IGNhbGwKKyAqIHJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKSBvciByZWRyYXdfYWxsX2xhdGVyKENMRUFSKS4KKyAqCisgKiBUaGluZ3MgdGhhdCBhcmUgaGFuZGxlZCBpbmRpcmVjdGx5OgorICogLSBXaGVuIG1lc3NhZ2VzIHNjcm9sbCB0aGUgc2NyZWVuIHVwLCBtc2dfc2Nyb2xsZWQgd2lsbCBiZSBzZXQgYW5kCisgKiAgIHVwZGF0ZV9zY3JlZW4oKSBjYWxsZWQgdG8gcmVkcmF3LgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworLyoKKyAqIFRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIGFjdHVhbGx5IGFjdGl2ZSBmb3Igd3JpdGluZyB0byB0aGUgc2NyZWVuLgorICovCitzdGF0aWMgaW50CXNjcmVlbl9hdHRyID0gMDsKKworLyoKKyAqIFBvc2l0aW9uaW5nIHRoZSBjdXJzb3IgaXMgcmVkdWNlZCBieSByZW1lbWJlcmluZyB0aGUgbGFzdCBwb3NpdGlvbi4KKyAqIE1vc3RseSB1c2VkIGJ5IHdpbmRnb3RvKCkgYW5kIHNjcmVlbl9jaGFyKCkuCisgKi8KK3N0YXRpYyBpbnQJc2NyZWVuX2N1cl9yb3csIHNjcmVlbl9jdXJfY29sOwkvKiBsYXN0IGtub3duIGN1cnNvciBwb3NpdGlvbiAqLworCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKy8qCisgKiBTdHJ1Y3QgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nICdobHNlYXJjaCcgbWF0Y2hlcyBmb3IgdGhlIGxhc3QgdXNlIHNlYXJjaAorICogcGF0dGVybiBvciBhICI6bWF0Y2giIGl0ZW0uCisgKiBGb3IgJ2hsc2VhcmNoJyB0aGVyZSBpcyBvbmUgcGF0dGVybiBmb3IgYWxsIHdpbmRvd3MuICBGb3IgIjptYXRjaCIgdGhlcmUgaXMKKyAqIGEgZGlmZmVyZW50IHBhdHRlcm4gZm9yIGVhY2ggd2luZG93LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHJlZ21tYXRjaF9UCXJtOwkvKiBwb2ludHMgdG8gdGhlIHJlZ2V4cCBwcm9ncmFtOyBjb250YWlucyBsYXN0IGZvdW5kCisJCQkgICBtYXRjaCAobWF5IGNvbnRpbnVlIGluIG5leHQgbGluZSkgKi8KKyAgICBidWZfVAkqYnVmOwkvKiB0aGUgYnVmZmVyIHRvIHNlYXJjaCBmb3IgYSBtYXRjaCAqLworICAgIGxpbmVucl9UCWxudW07CS8qIHRoZSBsaW5lIHRvIHNlYXJjaCBmb3IgYSBtYXRjaCAqLworICAgIGludAkJYXR0cjsJLyogYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciBhIG1hdGNoICovCisgICAgaW50CQlhdHRyX2N1cjsgLyogYXR0cmlidXRlcyBjdXJyZW50bHkgYWN0aXZlIGluIHdpbl9saW5lKCkgKi8KKyAgICBsaW5lbnJfVAlmaXJzdF9sbnVtOwkvKiBmaXJzdCBsbnVtIHRvIHNlYXJjaCBmb3IgbXVsdGktbGluZSBwYXQgKi8KKyAgICBjaGFyX3UJKnN0YXJ0cDsgLyogaW4gd2luX2xpbmUoKSBwb2ludHMgdG8gY2hhciB3aGVyZSBITCBzdGFydHMgKi8KKyAgICBjaGFyX3UJKmVuZHA7CSAvKiBpbiB3aW5fbGluZSgpIHBvaW50cyB0byBjaGFyIHdoZXJlIEhMIGVuZHMgKi8KK30gbWF0Y2hfVDsKKworc3RhdGljIG1hdGNoX1Qgc2VhcmNoX2hsOwkvKiB1c2VkIGZvciAnaGxzZWFyY2gnIGhpZ2hsaWdodCBtYXRjaGluZyAqLworc3RhdGljIG1hdGNoX1QgbWF0Y2hfaGw7CS8qIHVzZWQgZm9yICI6bWF0Y2giIGhpZ2hsaWdodCBtYXRjaGluZyAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKK3N0YXRpYyBmb2xkaW5mb19UIHdpbl9mb2xkaW5mbzsJLyogaW5mbyBmb3IgJ2ZvbGRjb2x1bW4nICovCisjZW5kaWYKKworLyoKKyAqIEJ1ZmZlciBmb3Igb25lIHNjcmVlbiBsaW5lIChjaGFyYWN0ZXJzIGFuZCBhdHRyaWJ1dGVzKS4KKyAqLworc3RhdGljIHNjaGFyX1QJKmN1cnJlbnRfU2NyZWVuTGluZTsKKworc3RhdGljIHZvaWQgd2luX3VwZGF0ZSBfX0FSR1MoKHdpbl9UICp3cCkpOworc3RhdGljIHZvaWQgd2luX2RyYXdfZW5kIF9fQVJHUygod2luX1QgKndwLCBpbnQgYzEsIGludCBjMiwgaW50IHJvdywgaW50IGVuZHJvdywgZW51bSBobGZfdmFsdWUgaGwpKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKK3N0YXRpYyB2b2lkIGZvbGRfbGluZSBfX0FSR1MoKHdpbl9UICp3cCwgbG9uZyBmb2xkX2NvdW50LCBmb2xkaW5mb19UICpmb2xkaW5mbywgbGluZW5yX1QgbG51bSwgaW50IHJvdykpOworc3RhdGljIHZvaWQgZmlsbF9mb2xkY29sdW1uIF9fQVJHUygoY2hhcl91ICpwLCB3aW5fVCAqd3AsIGludCBjbG9zZWQsIGxpbmVucl9UIGxudW0pKTsKK3N0YXRpYyB2b2lkIGNvcHlfdGV4dF9hdHRyIF9fQVJHUygoaW50IG9mZiwgY2hhcl91ICpidWYsIGludCBsZW4sIGludCBhdHRyKSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgd2luX2xpbmUgX19BUkdTKCh3aW5fVCAqLCBsaW5lbnJfVCwgaW50LCBpbnQpKTsKK3N0YXRpYyBpbnQgY2hhcl9uZWVkc19yZWRyYXcgX19BUkdTKChpbnQgb2ZmX2Zyb20sIGludCBvZmZfdG8sIGludCBjb2xzKSk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKK3N0YXRpYyB2b2lkIHNjcmVlbl9saW5lIF9fQVJHUygoaW50IHJvdywgaW50IGNvbG9mZiwgaW50IGVuZGNvbCwgaW50IGNsZWFyX3dpZHRoLCBpbnQgcmxmbGFnKSk7CisjIGRlZmluZSBTQ1JFRU5fTElORShyLCBvLCBlLCBjLCBybCkgICAgc2NyZWVuX2xpbmUoKHIpLCAobyksIChlKSwgKGMpLCAocmwpKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNjcmVlbl9saW5lIF9fQVJHUygoaW50IHJvdywgaW50IGNvbG9mZiwgaW50IGVuZGNvbCwgaW50IGNsZWFyX3dpZHRoKSk7CisjIGRlZmluZSBTQ1JFRU5fTElORShyLCBvLCBlLCBjLCBybCkgICAgc2NyZWVuX2xpbmUoKHIpLCAobyksIChlKSwgKGMpKQorI2VuZGlmCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKK3N0YXRpYyB2b2lkIHJsX21pcnJvciBfX0FSR1MoKGNoYXJfdSAqc3RyKSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorc3RhdGljIHZvaWQgZHJhd192c2VwX3dpbiBfX0FSR1MoKHdpbl9UICp3cCwgaW50IHJvdykpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKK3N0YXRpYyB2b2lkIHN0YXJ0X3NlYXJjaF9obCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGVuZF9zZWFyY2hfaGwgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwcmVwYXJlX3NlYXJjaF9obCBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSkpOworc3RhdGljIHZvaWQgbmV4dF9zZWFyY2hfaGwgX19BUkdTKCh3aW5fVCAqd2luLCBtYXRjaF9UICpzaGwsIGxpbmVucl9UIGxudW0sIGNvbG5yX1QgbWluY29sKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNjcmVlbl9zdGFydF9oaWdobGlnaHQgX19BUkdTKChpbnQgYXR0cikpOworc3RhdGljIHZvaWQgc2NyZWVuX2NoYXIgX19BUkdTKCh1bnNpZ25lZCBvZmYsIGludCByb3csIGludCBjb2wpKTsKKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgdm9pZCBzY3JlZW5fY2hhcl8yIF9fQVJHUygodW5zaWduZWQgb2ZmLCBpbnQgcm93LCBpbnQgY29sKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNjcmVlbmNsZWFyMiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGxpbmVjbGVhciBfX0FSR1MoKHVuc2lnbmVkIG9mZiwgaW50IHdpZHRoKSk7CitzdGF0aWMgdm9pZCBsaW5laW52YWxpZCBfX0FSR1MoKHVuc2lnbmVkIG9mZiwgaW50IHdpZHRoKSk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK3N0YXRpYyB2b2lkIGxpbmVjb3B5IF9fQVJHUygoaW50IHRvLCBpbnQgZnJvbSwgd2luX1QgKndwKSk7CitzdGF0aWMgdm9pZCByZWRyYXdfYmxvY2sgX19BUkdTKChpbnQgcm93LCBpbnQgZW5kLCB3aW5fVCAqd3ApKTsKKyNlbmRpZgorc3RhdGljIGludCB3aW5fZG9fbGluZXMgX19BUkdTKCh3aW5fVCAqd3AsIGludCByb3csIGludCBsaW5lX2NvdW50LCBpbnQgbWF5Y2xlYXIsIGludCBkZWwpKTsKK3N0YXRpYyB2b2lkIHdpbl9yZXN0X2ludmFsaWQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyBpbnQgc2NyZWVuX2luc19saW5lcyBfX0FSR1MoKGludCwgaW50LCBpbnQsIGludCwgd2luX1QgKndwKSk7CitzdGF0aWMgdm9pZCBtc2dfcG9zX21vZGUgX19BUkdTKCh2b2lkKSk7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9XSUxETUVOVSkgfHwgZGVmaW5lZChGRUFUX1NUTF9PUFQpCitzdGF0aWMgaW50IGZpbGxjaGFyX3N0YXR1cyBfX0FSR1MoKGludCAqYXR0ciwgaW50IGlzX2N1cndpbikpOworI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK3N0YXRpYyBpbnQgZmlsbGNoYXJfdnNlcCBfX0FSR1MoKGludCAqYXR0cikpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TVExfT1BUCitzdGF0aWMgdm9pZCB3aW5fcmVkcl9jdXN0b20gX19BUkdTKCh3aW5fVCAqd3AsIGludCBSdWxlcikpOworI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KK3N0YXRpYyB2b2lkIHdpbl9yZWRyX3J1bGVyIF9fQVJHUygod2luX1QgKndwLCBpbnQgYWx3YXlzKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoRkVBVF9WRVJUU1BMSVQpCisvKiBVZ2x5IGdsb2JhbDogb3ZlcnJ1bGUgYXR0cmlidXRlIHVzZWQgYnkgc2NyZWVuX2NoYXIoKSAqLworc3RhdGljIGludCBzY3JlZW5fY2hhcl9hdHRyID0gMDsKKyNlbmRpZgorCisvKgorICogUmVkcmF3IHRoZSBjdXJyZW50IHdpbmRvdyBsYXRlciwgd2l0aCB1cGRhdGVfc2NyZWVuKHR5cGUpLgorICogU2V0IG11c3RfcmVkcmF3IG9ubHkgaWYgbm90IGFscmVhZHkgc2V0IHRvIGEgaGlnaGVyIHZhbHVlLgorICogZS5nLiBpZiBtdXN0X3JlZHJhdyBpcyBDTEVBUiwgdHlwZSBOT1RfVkFMSUQgd2lsbCBkbyBub3RoaW5nLgorICovCisgICAgdm9pZAorcmVkcmF3X2xhdGVyKHR5cGUpCisgICAgaW50CQl0eXBlOworeworICAgIHJlZHJhd193aW5fbGF0ZXIoY3Vyd2luLCB0eXBlKTsKK30KKworICAgIHZvaWQKK3JlZHJhd193aW5fbGF0ZXIod3AsIHR5cGUpCisgICAgd2luX1QJKndwOworICAgIGludAkJdHlwZTsKK3sKKyAgICBpZiAod3AtPndfcmVkcl90eXBlIDwgdHlwZSkKKyAgICB7CisJd3AtPndfcmVkcl90eXBlID0gdHlwZTsKKwlpZiAodHlwZSA+PSBOT1RfVkFMSUQpCisJICAgIHdwLT53X2xpbmVzX3ZhbGlkID0gMDsKKwlpZiAobXVzdF9yZWRyYXcgPCB0eXBlKQkvKiBtdXN0X3JlZHJhdyBpcyB0aGUgbWF4aW11bSBvZiBhbGwgd2luZG93cyAqLworCSAgICBtdXN0X3JlZHJhdyA9IHR5cGU7CisgICAgfQorfQorCisvKgorICogRm9yY2UgYSBjb21wbGV0ZSByZWRyYXcgbGF0ZXIuICBBbHNvIHJlc2V0cyB0aGUgaGlnaGxpZ2h0aW5nLiAgVG8gYmUgdXNlZAorICogYWZ0ZXIgZXhlY3V0aW5nIGEgc2hlbGwgY29tbWFuZCB0aGF0IG1lc3NlcyB1cCB0aGUgc2NyZWVuLgorICovCisgICAgdm9pZAorcmVkcmF3X2xhdGVyX2NsZWFyKCkKK3sKKyAgICByZWRyYXdfYWxsX2xhdGVyKENMRUFSKTsKKyAgICBzY3JlZW5fYXR0ciA9IEhMX0JPTEQgfCBITF9VTkRFUkxJTkU7Cit9CisKKy8qCisgKiBNYXJrIGFsbCB3aW5kb3dzIHRvIGJlIHJlZHJhd24gbGF0ZXIuCisgKi8KKyAgICB2b2lkCityZWRyYXdfYWxsX2xhdGVyKHR5cGUpCisgICAgaW50CQl0eXBlOworeworICAgIHdpbl9UCSp3cDsKKworICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKyAgICB7CisJcmVkcmF3X3dpbl9sYXRlcih3cCwgdHlwZSk7CisgICAgfQorfQorCisvKgorICogTWFyayBhbGwgd2luZG93cyB0aGF0IGFyZSBlZGl0aW5nIHRoZSBjdXJyZW50IGJ1ZmZlciB0byBiZSB1ZHBhdGVkIGxhdGVyLgorICovCisgICAgdm9pZAorcmVkcmF3X2N1cmJ1Zl9sYXRlcih0eXBlKQorICAgIGludAkJdHlwZTsKK3sKKyAgICByZWRyYXdfYnVmX2xhdGVyKGN1cmJ1ZiwgdHlwZSk7Cit9CisKKyAgICB2b2lkCityZWRyYXdfYnVmX2xhdGVyKGJ1ZiwgdHlwZSkKKyAgICBidWZfVAkqYnVmOworICAgIGludAkJdHlwZTsKK3sKKyAgICB3aW5fVAkqd3A7CisKKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3cC0+d19idWZmZXIgPT0gYnVmKQorCSAgICByZWRyYXdfd2luX2xhdGVyKHdwLCB0eXBlKTsKKyAgICB9Cit9CisKKy8qCisgKiBDaGFuZ2VkIHNvbWV0aGluZyBpbiB0aGUgY3VycmVudCB3aW5kb3csIGF0IGJ1ZmZlciBsaW5lICJsbnVtIiwgdGhhdAorICogcmVxdWlyZXMgdGhhdCBsaW5lIGFuZCBwb3NzaWJseSBvdGhlciBsaW5lcyB0byBiZSByZWRyYXduLgorICogVXNlZCB3aGVuIGVudGVyaW5nL2xlYXZpbmcgSW5zZXJ0IG1vZGUgd2l0aCB0aGUgY3Vyc29yIG9uIGEgZm9sZGVkIGxpbmUuCisgKiBVc2VkIHRvIHJlbW92ZSB0aGUgIiQiIGZyb20gYSBjaGFuZ2UgY29tbWFuZC4KKyAqIE5vdGUgdGhhdCB3aGVuIGFsc28gaW5zZXJ0aW5nL2RlbGV0aW5nIGxpbmVzIHdfcmVkcmF3X3RvcCBhbmQgd19yZWRyYXdfYm90CisgKiBtYXkgYmVjb21lIGludmFsaWQgYW5kIHRoZSB3aG9sZSB3aW5kb3cgd2lsbCBoYXZlIHRvIGJlIHJlZHJhd24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK3JlZHJhd1dpbmxpbmUobG51bSwgaW52YWxpZCkKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJaW52YWxpZDsJLyogd2luZG93IGxpbmUgaGVpZ2h0IGlzIGludmFsaWQgbm93ICovCit7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaW50CQlpOworI2VuZGlmCisKKyAgICBpZiAoY3Vyd2luLT53X3JlZHJhd190b3AgPT0gMCB8fCBjdXJ3aW4tPndfcmVkcmF3X3RvcCA+IGxudW0pCisJY3Vyd2luLT53X3JlZHJhd190b3AgPSBsbnVtOworICAgIGlmIChjdXJ3aW4tPndfcmVkcmF3X2JvdCA9PSAwIHx8IGN1cndpbi0+d19yZWRyYXdfYm90IDwgbG51bSkKKwljdXJ3aW4tPndfcmVkcmF3X2JvdCA9IGxudW07CisgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmIChpbnZhbGlkKQorICAgIHsKKwkvKiBBIHdfbGluZXNbXSBlbnRyeSBmb3IgdGhpcyBsbnVtIGhhcyBiZWNvbWUgaW52YWxpZC4gKi8KKwlpID0gZmluZF93bF9lbnRyeShjdXJ3aW4sIGxudW0pOworCWlmIChpID49IDApCisJICAgIGN1cndpbi0+d19saW5lc1tpXS53bF92YWxpZCA9IEZBTFNFOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogdXBkYXRlIGFsbCB3aW5kb3dzIHRoYXQgYXJlIGVkaXRpbmcgdGhlIGN1cnJlbnQgYnVmZmVyCisgKi8KKyAgICB2b2lkCit1cGRhdGVfY3VyYnVmKHR5cGUpCisgICAgaW50CQl0eXBlOworeworICAgIHJlZHJhd19jdXJidWZfbGF0ZXIodHlwZSk7CisgICAgdXBkYXRlX3NjcmVlbih0eXBlKTsKK30KKworLyoKKyAqIHVwZGF0ZV9zY3JlZW4oKQorICoKKyAqIEJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIGN1cndpbi0+d190b3BsaW5lLCB0cmFuc2ZlciBhIHNjcmVlbmZ1bGwKKyAqIG9mIHN0dWZmIGZyb20gRmlsZW1lbSB0byBTY3JlZW5MaW5lc1tdLCBhbmQgdXBkYXRlIGN1cndpbi0+d19ib3RsaW5lLgorICovCisgICAgdm9pZAordXBkYXRlX3NjcmVlbih0eXBlKQorICAgIGludAkJdHlwZTsKK3sKKyAgICB3aW5fVAkqd3A7CisgICAgc3RhdGljIGludAlkaWRfaW50cm8gPSBGQUxTRTsKKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIX0VYVFJBKSB8fCBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQorICAgIGludAkJZGlkX29uZTsKKyNlbmRpZgorCisgICAgaWYgKCFzY3JlZW5fdmFsaWQoVFJVRSkpCisJcmV0dXJuOworCisgICAgaWYgKG11c3RfcmVkcmF3KQorICAgIHsKKwlpZiAodHlwZSA8IG11c3RfcmVkcmF3KQkgICAgLyogdXNlIG1heGltYWwgdHlwZSAqLworCSAgICB0eXBlID0gbXVzdF9yZWRyYXc7CisJbXVzdF9yZWRyYXcgPSAwOworICAgIH0KKworICAgIC8qIE5lZWQgdG8gdXBkYXRlIHdfbGluZXNbXS4gKi8KKyAgICBpZiAoY3Vyd2luLT53X2xpbmVzX3ZhbGlkID09IDAgJiYgdHlwZSA8IE5PVF9WQUxJRCkKKwl0eXBlID0gTk9UX1ZBTElEOworCisgICAgaWYgKCFyZWRyYXdpbmcoKSkKKyAgICB7CisJcmVkcmF3X2xhdGVyKHR5cGUpOwkJLyogcmVtZW1iZXIgdHlwZSBmb3IgbmV4dCB0aW1lICovCisJbXVzdF9yZWRyYXcgPSB0eXBlOworCWlmICh0eXBlID4gSU5WRVJURURfQUxMKQorCSAgICBjdXJ3aW4tPndfbGluZXNfdmFsaWQgPSAwOwkvKiBkb24ndCB1c2Ugd19saW5lc1tdLndsX3NpemUgbm93ICovCisJcmV0dXJuOworICAgIH0KKworICAgIHVwZGF0aW5nX3NjcmVlbiA9IFRSVUU7CisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICArK2Rpc3BsYXlfdGljazsJICAgIC8qIGxldCBzeW50YXggY29kZSBrbm93IHdlJ3JlIGluIGEgbmV4dCByb3VuZCBvZgorCQkJICAgICAqIGRpc3BsYXkgdXBkYXRpbmcgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBpZiB0aGUgc2NyZWVuIHdhcyBzY3JvbGxlZCB1cCB3aGVuIGRpc3BsYXlpbmcgYSBtZXNzYWdlLCBzY3JvbGwgaXQgZG93bgorICAgICAqLworICAgIGlmIChtc2dfc2Nyb2xsZWQpCisgICAgeworCWNsZWFyX2NtZGxpbmUgPSBUUlVFOworCWlmIChtc2dfc2Nyb2xsZWQgPiBSb3dzIC0gNSkJICAgIC8qIGNsZWFyaW5nIGlzIGZhc3RlciAqLworCSAgICB0eXBlID0gQ0xFQVI7CisJZWxzZSBpZiAodHlwZSAhPSBDTEVBUikKKwl7CisJICAgIGNoZWNrX2Zvcl9kZWxheShGQUxTRSk7CisJICAgIGlmIChzY3JlZW5faW5zX2xpbmVzKDAsIDAsIG1zZ19zY3JvbGxlZCwgKGludClSb3dzLCBOVUxMKSA9PSBGQUlMKQorCQl0eXBlID0gQ0xFQVI7CisJICAgIEZPUl9BTExfV0lORE9XUyh3cCkKKwkgICAgeworCQlpZiAoV19XSU5ST1cod3ApIDwgbXNnX3Njcm9sbGVkKQorCQl7CisJCSAgICBpZiAoV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0ID4gbXNnX3Njcm9sbGVkCisJCQkgICAgJiYgd3AtPndfcmVkcl90eXBlIDwgUkVEUkFXX1RPUAorCQkJICAgICYmIHdwLT53X2xpbmVzX3ZhbGlkID4gMAorCQkJICAgICYmIHdwLT53X3RvcGxpbmUgPT0gd3AtPndfbGluZXNbMF0ud2xfbG51bSkKKwkJICAgIHsKKwkJCXdwLT53X3VwZF9yb3dzID0gbXNnX3Njcm9sbGVkIC0gV19XSU5ST1cod3ApOworCQkJd3AtPndfcmVkcl90eXBlID0gUkVEUkFXX1RPUDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCXdwLT53X3JlZHJfdHlwZSA9IE5PVF9WQUxJRDsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCWlmIChXX1dJTlJPVyh3cCkgKyB3cC0+d19oZWlnaHQgKyBXX1NUQVRVU19IRUlHSFQod3ApCisJCQkJPD0gbXNnX3Njcm9sbGVkKQorCQkJICAgIHdwLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyNlbmRpZgorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworCX0KKwltc2dfc2Nyb2xsZWQgPSAwOworCW5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKiByZXNldCBjbWRsaW5lX3JvdyBub3cgKG1heSBoYXZlIGJlZW4gY2hhbmdlZCB0ZW1wb3JhcmlseSkgKi8KKyAgICBjb21wdXRlX2NtZHJvdygpOworCisgICAgLyogQ2hlY2sgZm9yIGNoYW5nZWQgaGlnaGxpZ2h0aW5nICovCisgICAgaWYgKG5lZWRfaGlnaGxpZ2h0X2NoYW5nZWQpCisJaGlnaGxpZ2h0X2NoYW5nZWQoKTsKKworICAgIGlmICh0eXBlID09IENMRUFSKQkJLyogZmlyc3QgY2xlYXIgc2NyZWVuICovCisgICAgeworCXNjcmVlbmNsZWFyKCk7CQkvKiB3aWxsIHJlc2V0IGNsZWFyX2NtZGxpbmUgKi8KKwl0eXBlID0gTk9UX1ZBTElEOworICAgIH0KKworICAgIGlmIChjbGVhcl9jbWRsaW5lKQkJLyogZ29pbmcgdG8gY2xlYXIgY21kbGluZSAoZG9uZSBiZWxvdykgKi8KKwljaGVja19mb3JfZGVsYXkoRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBPbmx5IHN0YXJ0IHJlZHJhd2luZyBpZiB0aGVyZSBpcyByZWFsbHkgc29tZXRoaW5nIHRvIGRvLgorICAgICAqLworICAgIGlmICh0eXBlID09IElOVkVSVEVEKQorCXVwZGF0ZV9jdXJzd2FudCgpOworICAgIGlmIChjdXJ3aW4tPndfcmVkcl90eXBlIDwgdHlwZQorCSAgICAmJiAhKCh0eXBlID09IFZBTElECisJCSAgICAmJiBjdXJ3aW4tPndfbGluZXNbMF0ud2xfdmFsaWQKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgICYmIGN1cndpbi0+d190b3BmaWxsID09IGN1cndpbi0+d19vbGRfdG9wZmlsbAorCQkgICAgJiYgY3Vyd2luLT53X2JvdGZpbGwgPT0gY3Vyd2luLT53X29sZF9ib3RmaWxsCisjZW5kaWYKKwkJICAgICYmIGN1cndpbi0+d190b3BsaW5lID09IGN1cndpbi0+d19saW5lc1swXS53bF9sbnVtKQorI2lmZGVmIEZFQVRfVklTVUFMCisJCXx8ICh0eXBlID09IElOVkVSVEVECisJCSAgICAmJiBjdXJ3aW4tPndfb2xkX2N1cnNvcl9sbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bQorCQkgICAgJiYgY3Vyd2luLT53X29sZF92aXN1YWxfbW9kZSA9PSBWSXN1YWxfbW9kZQorCQkgICAgJiYgKGN1cndpbi0+d192YWxpZCAmIFZBTElEX1ZJUlRDT0wpCisJCSAgICAmJiBjdXJ3aW4tPndfb2xkX2N1cnN3YW50ID09IGN1cndpbi0+d19jdXJzd2FudCkKKyNlbmRpZgorCQkpKQorCWN1cndpbi0+d19yZWRyX3R5cGUgPSB0eXBlOworCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICAvKgorICAgICAqIENvcnJlY3Qgc3RvcmVkIHN5bnRheCBoaWdobGlnaHRpbmcgaW5mbyBmb3IgY2hhbmdlcyBpbiBlYWNoIGRpc3BsYXllZAorICAgICAqIGJ1ZmZlci4gIEVhY2ggYnVmZmVyIG11c3Qgb25seSBiZSBkb25lIG9uY2UuCisgICAgICovCisgICAgRk9SX0FMTF9XSU5ET1dTKHdwKQorICAgIHsKKwlpZiAod3AtPndfYnVmZmVyLT5iX21vZF9zZXQpCisJeworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKwkgICAgd2luX1QJKnd3cDsKKworCSAgICAvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGRpZCB0aGlzIGJ1ZmZlci4gKi8KKwkgICAgZm9yICh3d3AgPSBmaXJzdHdpbjsgd3dwICE9IHdwOyB3d3AgPSB3d3AtPndfbmV4dCkKKwkJaWYgKHd3cC0+d19idWZmZXIgPT0gd3AtPndfYnVmZmVyKQorCQkgICAgYnJlYWs7CisjIGVuZGlmCisJICAgIGlmICgKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisJCSAgICB3d3AgPT0gd3AgJiYKKyMgZW5kaWYKKwkJICAgIHN5bnRheF9wcmVzZW50KHdwLT53X2J1ZmZlcikpCisJCXN5bl9zdGFja19hcHBseV9jaGFuZ2VzKHdwLT53X2J1ZmZlcik7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBHbyBmcm9tIHRvcCB0byBib3R0b20gdGhyb3VnaCB0aGUgd2luZG93cywgcmVkcmF3aW5nIHRoZSBvbmVzIHRoYXQgbmVlZAorICAgICAqIGl0LgorICAgICAqLworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hfRVhUUkEpIHx8IGRlZmluZWQoRkVBVF9DTElQQk9BUkQpCisgICAgZGlkX29uZSA9IEZBTFNFOworI2VuZGlmCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBzZWFyY2hfaGwucm0ucmVncHJvZyA9IE5VTEw7CisjZW5kaWYKKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3cC0+d19yZWRyX3R5cGUgIT0gMCkKKwl7CisJICAgIGN1cnNvcl9vZmYoKTsKKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIX0VYVFJBKSB8fCBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQorCSAgICBpZiAoIWRpZF9vbmUpCisJICAgIHsKKwkJZGlkX29uZSA9IFRSVUU7CisjIGlmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJCXN0YXJ0X3NlYXJjaF9obCgpOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0NMSVBCT0FSRAorCQkvKiBXaGVuIFZpc3VhbCBhcmVhIGNoYW5nZWQsIG1heSBoYXZlIHRvIHVwZGF0ZSBzZWxlY3Rpb24uICovCisJCWlmIChjbGlwX3N0YXIuYXZhaWxhYmxlICYmIGNsaXBfaXNhdXRvc2VsKCkpCisJCSAgICBjbGlwX3VwZGF0ZV9zZWxlY3Rpb24oKTsKKyMgZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorCQkvKiBSZW1vdmUgdGhlIGN1cnNvciBiZWZvcmUgc3RhcnRpbmcgdG8gZG8gYW55dGhpbmcsIGJlY2F1c2UKKwkJICogc2Nyb2xsaW5nIG1heSBtYWtlIGl0IGRpZmZpY3VsdCB0byByZWRyYXcgdGhlIHRleHQgdW5kZXIKKwkJICogaXQuICovCisJCWlmIChndWkuaW5fdXNlKQorCQkgICAgZ3VpX3VuZHJhd19jdXJzb3IoKTsKKyNlbmRpZgorCSAgICB9CisjZW5kaWYKKwkgICAgd2luX3VwZGF0ZSh3cCk7CisJfQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJLyogcmVkcmF3IHN0YXR1cyBsaW5lIGFmdGVyIHRoZSB3aW5kb3cgdG8gbWluaW1pemUgY3Vyc29yIG1vdmVtZW50ICovCisJaWYgKHdwLT53X3JlZHJfc3RhdHVzKQorCXsKKwkgICAgY3Vyc29yX29mZigpOworCSAgICB3aW5fcmVkcl9zdGF0dXMod3ApOworCX0KKyNlbmRpZgorICAgIH0KKyNpZiBkZWZpbmVkKEZFQVRfU0VBUkNIX0VYVFJBKQorICAgIGVuZF9zZWFyY2hfaGwoKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgLyogUmVzZXQgYl9tb2Rfc2V0IGZsYWdzLiAgR29pbmcgdGhyb3VnaCBhbGwgd2luZG93cyBpcyBwcm9iYWJseSBmYXN0ZXIKKyAgICAgKiB0aGFuIGdvaW5nIHRocm91Z2ggYWxsIGJ1ZmZlcnMgKHRoZXJlIGNvdWxkIGJlIG1hbnkgYnVmZmVycykuICovCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisJd3AtPndfYnVmZmVyLT5iX21vZF9zZXQgPSBGQUxTRTsKKyNlbHNlCisJY3VyYnVmLT5iX21vZF9zZXQgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgdXBkYXRpbmdfc2NyZWVuID0gRkFMU0U7CisjaWZkZWYgRkVBVF9HVUkKKyAgICBndWlfbWF5X3Jlc2l6ZV9zaGVsbCgpOworI2VuZGlmCisKKyAgICAvKiBDbGVhciBvciByZWRyYXcgdGhlIGNvbW1hbmQgbGluZS4gIERvbmUgbGFzdCwgYmVjYXVzZSBzY3JvbGxpbmcgbWF5CisgICAgICogbWVzcyB1cCB0aGUgY29tbWFuZCBsaW5lLiAqLworICAgIGlmIChjbGVhcl9jbWRsaW5lIHx8IHJlZHJhd19jbWRsaW5lKQorCXNob3dtb2RlKCk7CisKKyAgICAvKiBNYXkgcHV0IHVwIGFuIGludHJvZHVjdG9yeSBtZXNzYWdlIHdoZW4gbm90IGVkaXRpbmcgYSBmaWxlICovCisgICAgaWYgKCFkaWRfaW50cm8gJiYgYnVmZW1wdHkoKQorCSAgICAmJiBjdXJidWYtPmJfZm5hbWUgPT0gTlVMTAorI2lmZGVmIEZFQVRfV0lORE9XUworCSAgICAmJiBmaXJzdHdpbi0+d19uZXh0ID09IE5VTEwKKyNlbmRpZgorCSAgICAmJiB2aW1fc3RyY2hyKHBfc2htLCBTSE1fSU5UUk8pID09IE5VTEwpCisJaW50cm9fbWVzc2FnZShGQUxTRSk7CisgICAgZGlkX2ludHJvID0gVFJVRTsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogUmVkcmF3IHRoZSBjdXJzb3IgYW5kIHVwZGF0ZSB0aGUgc2Nyb2xsYmFycyB3aGVuIGFsbCBzY3JlZW4gdXBkYXRpbmcgaXMKKyAgICAgKiBkb25lLiAqLworICAgIGlmIChndWkuaW5fdXNlKQorICAgIHsKKwlvdXRfZmx1c2goKTsJLyogcmVxdWlyZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBjdXJzb3IgKi8KKwlpZiAoZGlkX29uZSkKKwkgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoRkFMU0UsIEZBTFNFKTsKKwlndWlfdXBkYXRlX3Njcm9sbGJhcnMoRkFMU0UpOworICAgIH0KKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX1NJR05TKSB8fCBkZWZpbmVkKEZFQVRfR1VJKQorc3RhdGljIHZvaWQgdXBkYXRlX3ByZXBhcmUgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB1cGRhdGVfZmluaXNoIF9fQVJHUygodm9pZCkpOworCisvKgorICogUHJlcGFyZSBmb3IgdXBkYXRpbmcgb25lIG9yIG1vcmUgd2luZG93cy4KKyAqLworICAgIHN0YXRpYyB2b2lkCit1cGRhdGVfcHJlcGFyZSgpCit7CisgICAgY3Vyc29yX29mZigpOworICAgIHVwZGF0aW5nX3NjcmVlbiA9IFRSVUU7CisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBSZW1vdmUgdGhlIGN1cnNvciBiZWZvcmUgc3RhcnRpbmcgdG8gZG8gYW55dGhpbmcsIGJlY2F1c2Ugc2Nyb2xsaW5nIG1heQorICAgICAqIG1ha2UgaXQgZGlmZmljdWx0IHRvIHJlZHJhdyB0aGUgdGV4dCB1bmRlciBpdC4gKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfdW5kcmF3X2N1cnNvcigpOworI2VuZGlmCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBzdGFydF9zZWFyY2hfaGwoKTsKKyNlbmRpZgorfQorCisvKgorICogRmluaXNoIHVwZGF0aW5nIG9uZSBvciBtb3JlIHdpbmRvd3MuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordXBkYXRlX2ZpbmlzaCgpCit7CisgICAgaWYgKHJlZHJhd19jbWRsaW5lKQorCXNob3dtb2RlKCk7CisKKyMgaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBlbmRfc2VhcmNoX2hsKCk7CisjIGVuZGlmCisKKyAgICB1cGRhdGluZ19zY3JlZW4gPSBGQUxTRTsKKworIyBpZmRlZiBGRUFUX0dVSQorICAgIGd1aV9tYXlfcmVzaXplX3NoZWxsKCk7CisKKyAgICAvKiBSZWRyYXcgdGhlIGN1cnNvciBhbmQgdXBkYXRlIHRoZSBzY3JvbGxiYXJzIHdoZW4gYWxsIHNjcmVlbiB1cGRhdGluZyBpcworICAgICAqIGRvbmUuICovCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCW91dF9mbHVzaCgpOwkvKiByZXF1aXJlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIGN1cnNvciAqLworCWd1aV91cGRhdGVfY3Vyc29yKEZBTFNFLCBGQUxTRSk7CisJZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKEZBTFNFKTsKKyAgICB9CisjIGVuZGlmCit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9TSUdOUykgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCit1cGRhdGVfZGVidWdfc2lnbihidWYsIGxudW0pCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHdpbl9UCSp3cDsKKyAgICBpbnQJCWRvaXQgPSBGQUxTRTsKKworIyBpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICB3aW5fZm9sZGluZm8uZmlfbGV2ZWwgPSAwOworIyBlbmRpZgorCisgICAgLyogdXBkYXRlL2RlbGV0ZSBhIHNwZWNpZmljIG1hcmsgKi8KKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmIChidWYgIT0gTlVMTCAmJiBsbnVtID4gMCkKKwl7CisJICAgIGlmICh3cC0+d19idWZmZXIgPT0gYnVmICYmIGxudW0gPj0gd3AtPndfdG9wbGluZQorCQkJCQkJICAgICAgJiYgbG51bSA8IHdwLT53X2JvdGxpbmUpCisJICAgIHsKKwkJaWYgKHdwLT53X3JlZHJhd190b3AgPT0gMCB8fCB3cC0+d19yZWRyYXdfdG9wID4gbG51bSkKKwkJICAgIHdwLT53X3JlZHJhd190b3AgPSBsbnVtOworCQlpZiAod3AtPndfcmVkcmF3X2JvdCA9PSAwIHx8IHdwLT53X3JlZHJhd19ib3QgPCBsbnVtKQorCQkgICAgd3AtPndfcmVkcmF3X2JvdCA9IGxudW07CisJCXJlZHJhd193aW5fbGF0ZXIod3AsIFZBTElEKTsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIHJlZHJhd193aW5fbGF0ZXIod3AsIFZBTElEKTsKKwlpZiAod3AtPndfcmVkcl90eXBlICE9IDApCisJICAgIGRvaXQgPSBUUlVFOworICAgIH0KKworICAgIGlmICghZG9pdCkKKwlyZXR1cm47CisKKyAgICAvKiB1cGRhdGUgYWxsIHdpbmRvd3MgdGhhdCBuZWVkIHVwZGF0aW5nICovCisgICAgdXBkYXRlX3ByZXBhcmUoKTsKKworIyBpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdwOyB3cCA9IHdwLT53X25leHQpCisgICAgeworCWlmICh3cC0+d19yZWRyX3R5cGUgIT0gMCkKKwkgICAgd2luX3VwZGF0ZSh3cCk7CisJaWYgKHdwLT53X3JlZHJfc3RhdHVzKQorCSAgICB3aW5fcmVkcl9zdGF0dXMod3ApOworICAgIH0KKyMgZWxzZQorICAgIGlmIChjdXJ3aW4tPndfcmVkcl90eXBlICE9IDApCisJd2luX3VwZGF0ZShjdXJ3aW4pOworIyBlbmRpZgorCisgICAgdXBkYXRlX2ZpbmlzaCgpOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVXBkYXRlIGEgc2luZ2xlIHdpbmRvdywgaXRzIHN0YXR1cyBsaW5lIGFuZCBtYXliZSB0aGUgY29tbWFuZCBsaW5lIG1zZy4KKyAqIFVzZWQgZm9yIHRoZSBHVUkgc2Nyb2xsYmFyLgorICovCisgICAgdm9pZAordXBkYXRlV2luZG93KHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICB1cGRhdGVfcHJlcGFyZSgpOworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBXaGVuIFZpc3VhbCBhcmVhIGNoYW5nZWQsIG1heSBoYXZlIHRvIHVwZGF0ZSBzZWxlY3Rpb24uICovCisgICAgaWYgKGNsaXBfc3Rhci5hdmFpbGFibGUgJiYgY2xpcF9pc2F1dG9zZWwoKSkKKwljbGlwX3VwZGF0ZV9zZWxlY3Rpb24oKTsKKyNlbmRpZgorICAgIHdpbl91cGRhdGUod3ApOworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGlmICh3cC0+d19yZWRyX3N0YXR1cworIyBpZmRlZiBGRUFUX0NNRExfSU5GTworCSAgICB8fCBwX3J1CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfU1RMX09QVAorCSAgICB8fCAqcF9zdGwKKyMgZW5kaWYKKwkgICAgKQorCXdpbl9yZWRyX3N0YXR1cyh3cCk7CisjZW5kaWYKKworICAgIHVwZGF0ZV9maW5pc2goKTsKK30KKyNlbmRpZgorCisvKgorICogVXBkYXRlIGEgc2luZ2xlIHdpbmRvdy4KKyAqCisgKiBUaGlzIG1heSBjYXVzZSB0aGUgd2luZG93cyBiZWxvdyBpdCBhbHNvIHRvIGJlIHJlZHJhd24gKHdoZW4gY2xlYXJpbmcgdGhlCisgKiBzY3JlZW4gb3Igc2Nyb2xsaW5nIGxpbmVzKS4KKyAqCisgKiBIb3cgdGhlIHdpbmRvdyBpcyByZWRyYXduIGRlcGVuZHMgb24gd3AtPndfcmVkcl90eXBlLiAgRWFjaCB0eXBlIGFsc28KKyAqIGltcGxpZXMgdGhlIG9uZSBiZWxvdyBpdC4KKyAqIE5PVF9WQUxJRAlyZWRyYXcgdGhlIHdob2xlIHdpbmRvdworICogUkVEUkFXX1RPUAlyZWRyYXcgdGhlIHRvcCB3X3VwZF9yb3dzIHdpbmRvdyBsaW5lcywgb3RoZXJ3aXNlIGxpa2UgVkFMSUQKKyAqIElOVkVSVEVECXJlZHJhdyB0aGUgY2hhbmdlZCBwYXJ0IG9mIHRoZSBWaXN1YWwgYXJlYQorICogSU5WRVJURURfQUxMCXJlZHJhdyB0aGUgd2hvbGUgVmlzdWFsIGFyZWEKKyAqIFZBTElECTEuIHNjcm9sbCB1cC9kb3duIHRvIGFkanVzdCBmb3IgYSBjaGFuZ2VkIHdfdG9wbGluZQorICoJCTIuIHVwZGF0ZSBsaW5lcyBhdCB0aGUgdG9wIHdoZW4gc2Nyb2xsZWQgZG93bgorICoJCTMuIHJlZHJhdyBjaGFuZ2VkIHRleHQ6CisgKgkJICAgLSBpZiB3cC0+d19idWZmZXItPmJfbW9kX3NldCBzZXQsIHVkcGF0ZSBsaW5lcyBiZXR3ZWVuCisgKgkJICAgICBiX21vZF90b3AgYW5kIGJfbW9kX2JvdC4KKyAqCQkgICAtIGlmIHdwLT53X3JlZHJhd190b3Agbm9uLXplcm8sIHJlZHJhdyBsaW5lcyBiZXR3ZWVuCisgKgkJICAgICB3cC0+d19yZWRyYXdfdG9wIGFuZCB3cC0+d19yZWRyX2JvdC4KKyAqCQkgICAtIGNvbnRpbnVlIHJlZHJhd2luZyB3aGVuIHN5bnRheCBzdGF0dXMgaXMgaW52YWxpZC4KKyAqCQk0LiBpZiBzY3JvbGxlZCB1cCwgdXBkYXRlIGxpbmVzIGF0IHRoZSBib3R0b20uCisgKiBUaGlzIHJlc3VsdHMgaW4gdGhyZWUgYXJlYXMgdGhhdCBtYXkgbmVlZCB1cGRhdGluZzoKKyAqIHRvcDoJZnJvbSBmaXJzdCByb3cgdG8gdG9wX2VuZCAod2hlbiBzY3JvbGxlZCBkb3duKQorICogbWlkOiBmcm9tIG1pZF9zdGFydCB0byBtaWRfZW5kICh1cGRhdGUgaW52ZXJzaW9uIG9yIGNoYW5nZWQgdGV4dCkKKyAqIGJvdDogZnJvbSBib3Rfc3RhcnQgdG8gbGFzdCByb3cgKHdoZW4gc2Nyb2xsZWQgdXApCisgKi8KKyAgICBzdGF0aWMgdm9pZAord2luX3VwZGF0ZSh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgYnVmX1QJKmJ1ZiA9IHdwLT53X2J1ZmZlcjsKKyAgICBpbnQJCXR5cGU7CisgICAgaW50CQl0b3BfZW5kID0gMDsJLyogQmVsb3cgbGFzdCByb3cgb2YgdGhlIHRvcCBhcmVhIHRoYXQgbmVlZHMKKwkJCQkgICB1cGRhdGluZy4gIDAgd2hlbiBubyB0b3AgYXJlYSB1cGRhdGluZy4gKi8KKyAgICBpbnQJCW1pZF9zdGFydCA9IDk5OTsvKiBmaXJzdCByb3cgb2YgdGhlIG1pZCBhcmVhIHRoYXQgbmVlZHMKKwkJCQkgICB1cGRhdGluZy4gIDk5OSB3aGVuIG5vIG1pZCBhcmVhIHVwZGF0aW5nLiAqLworICAgIGludAkJbWlkX2VuZCA9IDA7CS8qIEJlbG93IGxhc3Qgcm93IG9mIHRoZSBtaWQgYXJlYSB0aGF0IG5lZWRzCisJCQkJICAgdXBkYXRpbmcuICAwIHdoZW4gbm8gbWlkIGFyZWEgdXBkYXRpbmcuICovCisgICAgaW50CQlib3Rfc3RhcnQgPSA5OTk7LyogZmlyc3Qgcm93IG9mIHRoZSBib3QgYXJlYSB0aGF0IG5lZWRzCisJCQkJICAgdXBkYXRpbmcuICA5OTkgd2hlbiBubyBib3QgYXJlYSB1cGRhdGluZyAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaW50CQlzY3JvbGxlZF9kb3duID0gRkFMU0U7CS8qIFRSVUUgd2hlbiBzY3JvbGxlZCBkb3duIHdoZW4KKwkJCQkJICAgd190b3BsaW5lIGdvdCBzbWFsbGVyIGEgYml0ICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIGludAkJdG9wX3RvX21vZCA9IEZBTFNFOyAgICAvKiByZWRyYXcgYWJvdmUgbW9kX3RvcCAqLworI2VuZGlmCisKKyAgICBpbnQJCXJvdzsJCS8qIGN1cnJlbnQgd2luZG93IHJvdyB0byBkaXNwbGF5ICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIGN1cnJlbnQgYnVmZmVyIGxudW0gdG8gZGlzcGxheSAqLworICAgIGludAkJaWR4OwkJLyogY3VycmVudCBpbmRleCBpbiB3X2xpbmVzW10gKi8KKyAgICBpbnQJCXNyb3c7CQkvKiBzdGFydGluZyByb3cgb2YgdGhlIGN1cnJlbnQgbGluZSAqLworCisgICAgaW50CQllb2YgPSBGQUxTRTsJLyogaWYgVFJVRSwgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KKyAgICBpbnQJCWRpZGxpbmUgPSBGQUxTRTsgLyogaWYgVFJVRSwgd2UgZmluaXNoZWQgdGhlIGxhc3QgbGluZSAqLworICAgIGludAkJaTsKKyAgICBsb25nCWo7CisgICAgc3RhdGljIGludAlyZWN1cnNpdmUgPSBGQUxTRTsJLyogYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgaW50CQlvbGRfYm90bGluZSA9IHdwLT53X2JvdGxpbmU7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgbG9uZwlmb2xkX2NvdW50OworI2VuZGlmCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICAvKiByZW1lbWJlciB3aGF0IGhhcHBlbmVkIHRvIHRoZSBwcmV2aW91cyBsaW5lLCB0byBrbm93IGlmCisgICAgICogY2hlY2tfdmlzdWFsX2hpZ2hsaWdodCgpIGNhbiBiZSB1c2VkICovCisjZGVmaW5lIERJRF9OT05FIDEJLyogZGlkbid0IHVwZGF0ZSBhIGxpbmUgKi8KKyNkZWZpbmUgRElEX0xJTkUgMgkvKiB1cGRhdGVkIGEgbm9ybWFsIGxpbmUgKi8KKyNkZWZpbmUgRElEX0ZPTEQgMwkvKiB1cGRhdGVkIGEgZm9sZGVkIGxpbmUgKi8KKyAgICBpbnQJCWRpZF91cGRhdGUgPSBESURfTk9ORTsKKyAgICBsaW5lbnJfVAlzeW50YXhfbGFzdF9wYXJzZWQgPSAwOwkJLyogbGFzdCBwYXJzZWQgdGV4dCBsaW5lICovCisjZW5kaWYKKyAgICBsaW5lbnJfVAltb2RfdG9wID0gMDsKKyAgICBsaW5lbnJfVAltb2RfYm90ID0gMDsKKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKEZFQVRfU0VBUkNIX0VYVFJBKQorICAgIGludAkJc2F2ZV9nb3RfaW50OworI2VuZGlmCisKKyAgICB0eXBlID0gd3AtPndfcmVkcl90eXBlOworCisgICAgaWYgKHR5cGUgPT0gTk9UX1ZBTElEKQorICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwl3cC0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisjZW5kaWYKKwl3cC0+d19saW5lc192YWxpZCA9IDA7CisgICAgfQorCisgICAgLyogV2luZG93IGlzIHplcm8taGVpZ2h0OiBub3RoaW5nIHRvIGRyYXcuICovCisgICAgaWYgKHdwLT53X2hlaWdodCA9PSAwKQorICAgIHsKKwl3cC0+d19yZWRyX3R5cGUgPSAwOworCXJldHVybjsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIC8qIFdpbmRvdyBpcyB6ZXJvLXdpZHRoOiBPbmx5IG5lZWQgdG8gZHJhdyB0aGUgc2VwYXJhdG9yLiAqLworICAgIGlmICh3cC0+d193aWR0aCA9PSAwKQorICAgIHsKKwkvKiBkcmF3IHRoZSB2ZXJ0aWNhbCBzZXBhcmF0b3IgcmlnaHQgb2YgdGhpcyB3aW5kb3cgKi8KKwlkcmF3X3ZzZXBfd2luKHdwLCAwKTsKKwl3cC0+d19yZWRyX3R5cGUgPSAwOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisgICAgLyogU2V0dXAgZm9yICI6bWF0Y2giIGhpZ2hsaWdodGluZy4gIERpc2FibGUgYW55IHByZXZpb3VzIG1hdGNoICovCisgICAgbWF0Y2hfaGwucm0gPSB3cC0+d19tYXRjaDsKKyAgICBpZiAod3AtPndfbWF0Y2hfaWQgPT0gMCkKKwltYXRjaF9obC5hdHRyID0gMDsKKyAgICBlbHNlCisJbWF0Y2hfaGwuYXR0ciA9IHN5bl9pZDJhdHRyKHdwLT53X21hdGNoX2lkKTsKKyAgICBtYXRjaF9obC5idWYgPSBidWY7CisgICAgbWF0Y2hfaGwubG51bSA9IDA7CisgICAgc2VhcmNoX2hsLmJ1ZiA9IGJ1ZjsKKyAgICBzZWFyY2hfaGwubG51bSA9IDA7CisgICAgc2VhcmNoX2hsLmZpcnN0X2xudW0gPSAwOworI2VuZGlmCisKKyAgICBpZiAoYnVmLT5iX21vZF9zZXQgJiYgYnVmLT5iX21vZF94bGluZXMgIT0gMCAmJiB3cC0+d19yZWRyYXdfdG9wICE9IDApCisgICAgeworCS8qCisJICogV2hlbiB0aGVyZSBhcmUgYm90aCBpbnNlcnRlZC9kZWxldGVkIGxpbmVzIGFuZCBzcGVjaWZpYyBsaW5lcyB0byBiZQorCSAqIHJlZHJhd24sIHdfcmVkcmF3X3RvcCBhbmQgd19yZWRyYXdfYm90IG1heSBiZSBpbnZhbGlkLCBqdXN0IHJlZHJhdworCSAqIGV2ZXJ5dGhpbmcgKG9ubHkgaGFwcGVucyB3aGVuIHJlZHJhd2luZyBpcyBvZmYgZm9yIHdoaWxlKS4KKwkgKi8KKwl0eXBlID0gTk9UX1ZBTElEOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogU2V0IG1vZF90b3AgdG8gdGhlIGZpcnN0IGxpbmUgdGhhdCBuZWVkcyBkaXNwbGF5aW5nIGJlY2F1c2Ugb2YKKwkgKiBjaGFuZ2VzLiAgU2V0IG1vZF9ib3QgdG8gdGhlIGZpcnN0IGxpbmUgYWZ0ZXIgdGhlIGNoYW5nZXMuCisJICovCisJbW9kX3RvcCA9IHdwLT53X3JlZHJhd190b3A7CisJaWYgKHdwLT53X3JlZHJhd19ib3QgIT0gMCkKKwkgICAgbW9kX2JvdCA9IHdwLT53X3JlZHJhd19ib3QgKyAxOworCWVsc2UKKwkgICAgbW9kX2JvdCA9IDA7CisJd3AtPndfcmVkcmF3X3RvcCA9IDA7CS8qIHJlc2V0IGZvciBuZXh0IHRpbWUgKi8KKwl3cC0+d19yZWRyYXdfYm90ID0gMDsKKwlpZiAoYnVmLT5iX21vZF9zZXQpCisJeworCSAgICBpZiAobW9kX3RvcCA9PSAwIHx8IG1vZF90b3AgPiBidWYtPmJfbW9kX3RvcCkKKwkgICAgeworCQltb2RfdG9wID0gYnVmLT5iX21vZF90b3A7CisjaWZkZWYgRkVBVF9TWU5fSEwKKwkJLyogTmVlZCB0byByZWRyYXcgbGluZXMgYWJvdmUgdGhlIGNoYW5nZSB0aGF0IG1heSBiZSBpbmNsdWRlZAorCQkgKiBpbiBhIHBhdHRlcm4gbWF0Y2guICovCisJCWlmIChzeW50YXhfcHJlc2VudChidWYpKQorCQl7CisJCSAgICBtb2RfdG9wIC09IGJ1Zi0+Yl9zeW5fc3luY19saW5lYnJlYWtzOworCQkgICAgaWYgKG1vZF90b3AgPCAxKQorCQkJbW9kX3RvcCA9IDE7CisJCX0KKyNlbmRpZgorCSAgICB9CisJICAgIGlmIChtb2RfYm90ID09IDAgfHwgbW9kX2JvdCA8IGJ1Zi0+Yl9tb2RfYm90KQorCQltb2RfYm90ID0gYnVmLT5iX21vZF9ib3Q7CisKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCSAgICAvKiBXaGVuICdobHNlYXJjaCcgaXMgb24gYW5kIHVzaW5nIGEgbXVsdGktbGluZSBzZWFyY2ggcGF0dGVybiwgYQorCSAgICAgKiBjaGFuZ2UgaW4gb25lIGxpbmUgbWF5IG1ha2UgdGhlIFNlYXJjaCBoaWdobGlnaHRpbmcgaW4gYQorCSAgICAgKiBwcmV2aW91cyBsaW5lIGludmFsaWQuICBTaW1wbGUgc29sdXRpb246IHJlZHJhdyBhbGwgdmlzaWJsZQorCSAgICAgKiBsaW5lcyBhYm92ZSB0aGUgY2hhbmdlLgorCSAgICAgKiBTYW1lIGZvciBhICI6bWF0Y2giIHBhdHRlcm4uCisJICAgICAqLworCSAgICBpZiAoKHNlYXJjaF9obC5ybS5yZWdwcm9nICE9IE5VTEwKKwkJCSYmIHJlX211bHRpbGluZShzZWFyY2hfaGwucm0ucmVncHJvZykpCisJCSAgICB8fCAobWF0Y2hfaGwucm0ucmVncHJvZyAhPSBOVUxMCisJCQkmJiByZV9tdWx0aWxpbmUobWF0Y2hfaGwucm0ucmVncHJvZykpKQorCQl0b3BfdG9fbW9kID0gVFJVRTsKKyNlbmRpZgorCX0KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwlpZiAobW9kX3RvcCAhPSAwICYmIGhhc0FueUZvbGRpbmcod3ApKQorCXsKKwkgICAgbGluZW5yX1QJbG51bXQsIGxudW1iOworCisJICAgIC8qCisJICAgICAqIEEgY2hhbmdlIGluIGEgbGluZSBjYW4gY2F1c2UgbGluZXMgYWJvdmUgaXQgdG8gYmVjb21lIGZvbGRlZCBvcgorCSAgICAgKiB1bmZvbGRlZC4gIEZpbmQgdGhlIHRvcCBtb3N0IGJ1ZmZlciBsaW5lIHRoYXQgbWF5IGJlIGFmZmVjdGVkLgorCSAgICAgKiBJZiB0aGUgbGluZSB3YXMgcHJldmlvdXNseSBmb2xkZWQgYW5kIGRpc3BsYXllZCwgZ2V0IHRoZSBmaXJzdAorCSAgICAgKiBsaW5lIG9mIHRoYXQgZm9sZC4gIElmIHRoZSBsaW5lIGlzIGZvbGRlZCBub3csIGdldCB0aGUgZmlyc3QKKwkgICAgICogZm9sZGVkIGxpbmUuICBVc2UgdGhlIG1pbmltdW0gb2YgdGhlc2UgdHdvLgorCSAgICAgKi8KKworCSAgICAvKiBGaW5kIGxhc3QgdmFsaWQgd19saW5lc1tdIGVudHJ5IGFib3ZlIG1vZF90b3AuICBTZXQgbG51bXQgdG8KKwkgICAgICogdGhlIGxpbmUgYmVsb3cgaXQuICBJZiB0aGVyZSBpcyBubyB2YWxpZCBlbnRyeSwgdXNlIHdfdG9wbGluZS4KKwkgICAgICogRmluZCB0aGUgZmlyc3QgdmFsaWQgd19saW5lc1tdIGVudHJ5IGJlbG93IG1vZF9ib3QuICBTZXQgbG51bWIKKwkgICAgICogdG8gdGhpcyBsaW5lLiAgSWYgdGhlcmUgaXMgbm8gdmFsaWQgZW50cnksIHVzZSBNQVhMTlVNLiAqLworCSAgICBsbnVtdCA9IHdwLT53X3RvcGxpbmU7CisJICAgIGxudW1iID0gTUFYTE5VTTsKKwkgICAgZm9yIChpID0gMDsgaSA8IHdwLT53X2xpbmVzX3ZhbGlkOyArK2kpCisJCWlmICh3cC0+d19saW5lc1tpXS53bF92YWxpZCkKKwkJeworCQkgICAgaWYgKHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtIDwgbW9kX3RvcCkKKwkJCWxudW10ID0gd3AtPndfbGluZXNbaV0ud2xfbGFzdGxudW0gKyAxOworCQkgICAgaWYgKGxudW1iID09IE1BWExOVU0gJiYgd3AtPndfbGluZXNbaV0ud2xfbG51bSA+PSBtb2RfYm90KQorCQkgICAgeworCQkJbG51bWIgPSB3cC0+d19saW5lc1tpXS53bF9sbnVtOworCQkJLyogV2hlbiB0aGVyZSBpcyBhIGZvbGQgY29sdW1uIGl0IG1pZ2h0IG5lZWQgdXBkYXRpbmcKKwkJCSAqIGluIHRoZSBuZXh0IGxpbmUgKCJKIiBqdXN0IGFib3ZlIGFuIG9wZW4gZm9sZCkuICovCisJCQlpZiAod3AtPndfcF9mZGMgPiAwKQorCQkJICAgICsrbG51bWI7CisJCSAgICB9CisJCX0KKworCSAgICAodm9pZCloYXNGb2xkaW5nV2luKHdwLCBtb2RfdG9wLCAmbW9kX3RvcCwgTlVMTCwgVFJVRSwgTlVMTCk7CisJICAgIGlmIChtb2RfdG9wID4gbG51bXQpCisJCW1vZF90b3AgPSBsbnVtdDsKKworCSAgICAvKiBOb3cgZG8gdGhlIHNhbWUgZm9yIHRoZSBib3R0b20gbGluZSAob25lIGFib3ZlIG1vZF9ib3QpLiAqLworCSAgICAtLW1vZF9ib3Q7CisJICAgICh2b2lkKWhhc0ZvbGRpbmdXaW4od3AsIG1vZF9ib3QsIE5VTEwsICZtb2RfYm90LCBUUlVFLCBOVUxMKTsKKwkgICAgKyttb2RfYm90OworCSAgICBpZiAobW9kX2JvdCA8IGxudW1iKQorCQltb2RfYm90ID0gbG51bWI7CisJfQorI2VuZGlmCisKKwkvKiBXaGVuIGEgY2hhbmdlIHN0YXJ0cyBhYm92ZSB3X3RvcGxpbmUgYW5kIHRoZSBlbmQgaXMgYmVsb3cKKwkgKiB3X3RvcGxpbmUsIHN0YXJ0IHJlZHJhd2luZyBhdCB3X3RvcGxpbmUuCisJICogSWYgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGlzIGFib3ZlIHdfdG9wbGluZTogZG8gbGlrZSBubyBjaGFuZ2VzIHdhcworCSAqIG1hZGVkLCBidXQgcmVkcmF3IHRoZSBmaXJzdCBsaW5lIHRvIGZpbmQgY2hhbmdlcyBpbiBzeW50YXguICovCisJaWYgKG1vZF90b3AgIT0gMCAmJiBtb2RfdG9wIDwgd3AtPndfdG9wbGluZSkKKwl7CisJICAgIGlmIChtb2RfYm90ID4gd3AtPndfdG9wbGluZSkKKwkJbW9kX3RvcCA9IHdwLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9TWU5fSEwKKwkgICAgZWxzZSBpZiAoc3ludGF4X3ByZXNlbnQoYnVmKSkKKwkJdG9wX2VuZCA9IDE7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXaGVuIG9ubHkgZGlzcGxheWluZyB0aGUgbGluZXMgYXQgdGhlIHRvcCwgc2V0IHRvcF9lbmQuICBVc2VkIHdoZW4KKyAgICAgKiB3aW5kb3cgaGFzIHNjcm9sbGVkIGRvd24gZm9yIG1zZ19zY3JvbGxlZC4KKyAgICAgKi8KKyAgICBpZiAodHlwZSA9PSBSRURSQVdfVE9QKQorICAgIHsKKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgd3AtPndfbGluZXNfdmFsaWQ7ICsraSkKKwl7CisJICAgIGogKz0gd3AtPndfbGluZXNbaV0ud2xfc2l6ZTsKKwkgICAgaWYgKGogPj0gd3AtPndfdXBkX3Jvd3MpCisJICAgIHsKKwkJdG9wX2VuZCA9IGo7CisJCWJyZWFrOworCSAgICB9CisJfQorCWlmICh0b3BfZW5kID09IDApCisJICAgIC8qIG5vdCBmb3VuZCAoY2Fubm90IGhhcHBlbj8pOiByZWRyYXcgZXZlcnl0aGluZyAqLworCSAgICB0eXBlID0gTk9UX1ZBTElEOworCWVsc2UKKwkgICAgLyogdG9wIGFyZWEgZGVmaW5lZCwgdGhlIHJlc3QgaXMgVkFMSUQgKi8KKwkgICAgdHlwZSA9IFZBTElEOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMgb24gdGhlIHNjcmVlbiB0aGF0IHJlcXVpcmUgYSBjb21wbGV0ZSByZWRyYXcsCisgICAgICogaGFuZGxlIHRocmVlIGNhc2VzOgorICAgICAqIDE6IHdlIGFyZSBvZmYgdGhlIHRvcCBvZiB0aGUgc2NyZWVuIGJ5IGEgZmV3IGxpbmVzOiBzY3JvbGwgZG93bgorICAgICAqIDI6IHdwLT53X3RvcGxpbmUgaXMgYmVsb3cgd3AtPndfbGluZXNbMF0ud2xfbG51bTogbWF5IHNjcm9sbCB1cAorICAgICAqIDM6IHdwLT53X3RvcGxpbmUgaXMgd3AtPndfbGluZXNbMF0ud2xfbG51bTogZmluZCBmaXJzdCBlbnRyeSBpbgorICAgICAqICAgIHdfbGluZXNbXSB0aGF0IG5lZWRzIHVwZGF0aW5nLgorICAgICAqLworICAgIGlmICgodHlwZSA9PSBWQUxJRCB8fCB0eXBlID09IElOVkVSVEVEIHx8IHR5cGUgPT0gSU5WRVJURURfQUxMKQorI2lmZGVmIEZFQVRfRElGRgorCSAgICAmJiAhd3AtPndfYm90ZmlsbCAmJiAhd3AtPndfb2xkX2JvdGZpbGwKKyNlbmRpZgorCSAgICApCisgICAgeworCWlmIChtb2RfdG9wICE9IDAgJiYgd3AtPndfdG9wbGluZSA9PSBtb2RfdG9wKQorCXsKKwkgICAgLyoKKwkgICAgICogd190b3BsaW5lIGlzIHRoZSBmaXJzdCBjaGFuZ2VkIGxpbmUsIHRoZSBzY3JvbGxpbmcgd2lsbCBiZSBkb25lCisJICAgICAqIGZ1cnRoZXIgZG93bi4KKwkgICAgICovCisJfQorCWVsc2UgaWYgKHdwLT53X2xpbmVzWzBdLndsX3ZhbGlkCisJCSYmICh3cC0+d190b3BsaW5lIDwgd3AtPndfbGluZXNbMF0ud2xfbG51bQorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgfHwgKHdwLT53X3RvcGxpbmUgPT0gd3AtPndfbGluZXNbMF0ud2xfbG51bQorCQkJJiYgd3AtPndfdG9wZmlsbCA+IHdwLT53X29sZF90b3BmaWxsKQorI2VuZGlmCisJCSAgICkpCisJeworCSAgICAvKgorCSAgICAgKiBOZXcgdG9wbGluZSBpcyBhYm92ZSBvbGQgdG9wbGluZTogTWF5IHNjcm9sbCBkb3duLgorCSAgICAgKi8KKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgaWYgKGhhc0FueUZvbGRpbmcod3ApKQorCSAgICB7CisJCWxpbmVucl9UIGxuOworCisJCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgd2UgYXJlIG9mZiwgY291bnRpbmcgYSBzZXF1ZW5jZQorCQkgKiBvZiBmb2xkZWQgbGluZXMgYXMgb25lICovCisJCWogPSAwOworCQlmb3IgKGxuID0gd3AtPndfdG9wbGluZTsgbG4gPCB3cC0+d19saW5lc1swXS53bF9sbnVtOyArK2xuKQorCQl7CisJCSAgICArK2o7CisJCSAgICBpZiAoaiA+PSB3cC0+d19oZWlnaHQgLSAyKQorCQkJYnJlYWs7CisJCSAgICAodm9pZCloYXNGb2xkaW5nV2luKHdwLCBsbiwgTlVMTCwgJmxuLCBUUlVFLCBOVUxMKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlqID0gd3AtPndfbGluZXNbMF0ud2xfbG51bSAtIHdwLT53X3RvcGxpbmU7CisJICAgIGlmIChqIDwgd3AtPndfaGVpZ2h0IC0gMikJCS8qIG5vdCB0b28gZmFyIG9mZiAqLworCSAgICB7CisJCWkgPSBwbGluZXNfbV93aW4od3AsIHdwLT53X3RvcGxpbmUsIHdwLT53X2xpbmVzWzBdLndsX2xudW0gLSAxKTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJLyogaW5zZXJ0IGV4dHJhIGxpbmVzIGZvciBwcmV2aW91c2x5IGludmlzaWJsZSBmaWxsZXIgbGluZXMgKi8KKwkJaWYgKHdwLT53X2xpbmVzWzBdLndsX2xudW0gIT0gd3AtPndfdG9wbGluZSkKKwkJICAgIGkgKz0gZGlmZl9jaGVja19maWxsKHdwLCB3cC0+d19saW5lc1swXS53bF9sbnVtKQorCQkJCQkJCSAgLSB3cC0+d19vbGRfdG9wZmlsbDsKKyNlbmRpZgorCQlpZiAoaSA8IHdwLT53X2hlaWdodCAtIDIpCS8qIGxlc3MgdGhhbiBhIHNjcmVlbiBvZmYgKi8KKwkJeworCQkgICAgLyoKKwkJICAgICAqIFRyeSB0byBpbnNlcnQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGxpbmVzLgorCQkgICAgICogSWYgbm90IHRoZSBsYXN0IHdpbmRvdywgZGVsZXRlIHRoZSBsaW5lcyBhdCB0aGUgYm90dG9tLgorCQkgICAgICogd2luX2luc19saW5lcyBtYXkgZmFpbCB3aGVuIHRoZSB0ZXJtaW5hbCBjYW4ndCBkbyBpdC4KKwkJICAgICAqLworCQkgICAgaWYgKGkgPiAwKQorCQkJY2hlY2tfZm9yX2RlbGF5KEZBTFNFKTsKKwkJICAgIGlmICh3aW5faW5zX2xpbmVzKHdwLCAwLCBpLCBGQUxTRSwgd3AgPT0gZmlyc3R3aW4pID09IE9LKQorCQkgICAgeworCQkJaWYgKHdwLT53X2xpbmVzX3ZhbGlkICE9IDApCisJCQl7CisJCQkgICAgLyogTmVlZCB0byB1cGRhdGUgcm93cyB0aGF0IGFyZSBuZXcsIHN0b3AgYXQgdGhlCisJCQkgICAgICogZmlyc3Qgb25lIHRoYXQgc2Nyb2xsZWQgZG93bi4gKi8KKwkJCSAgICB0b3BfZW5kID0gaTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQkJICAgIHNjcm9sbGVkX2Rvd24gPSBUUlVFOworI2VuZGlmCisKKwkJCSAgICAvKiBNb3ZlIHRoZSBlbnRyaWVzIHRoYXQgd2VyZSBzY3JvbGxlZCwgZGlzYWJsZQorCQkJICAgICAqIHRoZSBlbnRyaWVzIGZvciB0aGUgbGluZXMgdG8gYmUgcmVkcmF3bi4gKi8KKwkJCSAgICBpZiAoKHdwLT53X2xpbmVzX3ZhbGlkICs9IGopID4gd3AtPndfaGVpZ2h0KQorCQkJCXdwLT53X2xpbmVzX3ZhbGlkID0gd3AtPndfaGVpZ2h0OworCQkJICAgIGZvciAoaWR4ID0gd3AtPndfbGluZXNfdmFsaWQ7IGlkeCAtIGogPj0gMDsgaWR4LS0pCisJCQkJd3AtPndfbGluZXNbaWR4XSA9IHdwLT53X2xpbmVzW2lkeCAtIGpdOworCQkJICAgIHdoaWxlIChpZHggPj0gMCkKKwkJCQl3cC0+d19saW5lc1tpZHgtLV0ud2xfdmFsaWQgPSBGQUxTRTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCW1pZF9zdGFydCA9IDA7CQkvKiByZWRyYXcgYWxsIGxpbmVzICovCisJCX0KKwkJZWxzZQorCQkgICAgbWlkX3N0YXJ0ID0gMDsJCS8qIHJlZHJhdyBhbGwgbGluZXMgKi8KKwkgICAgfQorCSAgICBlbHNlCisJCW1pZF9zdGFydCA9IDA7CQkvKiByZWRyYXcgYWxsIGxpbmVzICovCisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIE5ldyB0b3BsaW5lIGlzIGF0IG9yIGJlbG93IG9sZCB0b3BsaW5lOiBNYXkgc2Nyb2xsIHVwLgorCSAgICAgKiBXaGVuIHRvcGxpbmUgZGlkbid0IGNoYW5nZSwgZmluZCBmaXJzdCBlbnRyeSBpbiB3X2xpbmVzW10gdGhhdAorCSAgICAgKiBuZWVkcyB1cGRhdGluZy4KKwkgICAgICovCisKKwkgICAgLyogdHJ5IHRvIGZpbmQgd3AtPndfdG9wbGluZSBpbiB3cC0+d19saW5lc1tdLndsX2xudW0gKi8KKwkgICAgaiA9IC0xOworCSAgICByb3cgPSAwOworCSAgICBmb3IgKGkgPSAwOyBpIDwgd3AtPndfbGluZXNfdmFsaWQ7IGkrKykKKwkgICAgeworCQlpZiAod3AtPndfbGluZXNbaV0ud2xfdmFsaWQKKwkJCSYmIHdwLT53X2xpbmVzW2ldLndsX2xudW0gPT0gd3AtPndfdG9wbGluZSkKKwkJeworCQkgICAgaiA9IGk7CisJCSAgICBicmVhazsKKwkJfQorCQlyb3cgKz0gd3AtPndfbGluZXNbaV0ud2xfc2l6ZTsKKwkgICAgfQorCSAgICBpZiAoaiA9PSAtMSkKKwkgICAgeworCQkvKiBpZiB3cC0+d190b3BsaW5lIGlzIG5vdCBpbiB3cC0+d19saW5lc1tdLndsX2xudW0gcmVkcmF3IGFsbAorCQkgKiBsaW5lcyAqLworCQltaWRfc3RhcnQgPSAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkgKiBUcnkgdG8gZGVsZXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBsaW5lcy4KKwkJICogd3AtPndfdG9wbGluZSBpcyBhdCB3cC0+d19saW5lc1tpXS53bF9sbnVtLgorCQkgKi8KKyNpZmRlZiBGRUFUX0RJRkYKKwkJLyogSWYgdGhlIHRvcGxpbmUgZGlkbid0IGNoYW5nZSwgZGVsZXRlIG9sZCBmaWxsZXIgbGluZXMsCisJCSAqIG90aGVyd2lzZSBkZWxldGUgZmlsbGVyIGxpbmVzIG9mIHRoZSBuZXcgdG9wbGluZS4uLiAqLworCQlpZiAod3AtPndfbGluZXNbMF0ud2xfbG51bSA9PSB3cC0+d190b3BsaW5lKQorCQkgICAgcm93ICs9IHdwLT53X29sZF90b3BmaWxsOworCQllbHNlCisJCSAgICByb3cgKz0gZGlmZl9jaGVja19maWxsKHdwLCB3cC0+d190b3BsaW5lKTsKKwkJLyogLi4uIGJ1dCBkb24ndCBkZWxldGUgbmV3IGZpbGxlciBsaW5lcy4gKi8KKwkJcm93IC09IHdwLT53X3RvcGZpbGw7CisjZW5kaWYKKwkJaWYgKHJvdyA+IDApCisJCXsKKwkJICAgIGNoZWNrX2Zvcl9kZWxheShGQUxTRSk7CisJCSAgICBpZiAod2luX2RlbF9saW5lcyh3cCwgMCwgcm93LCBGQUxTRSwgd3AgPT0gZmlyc3R3aW4pID09IE9LKQorCQkJYm90X3N0YXJ0ID0gd3AtPndfaGVpZ2h0IC0gcm93OworCQkgICAgZWxzZQorCQkJbWlkX3N0YXJ0ID0gMDsJCS8qIHJlZHJhdyBhbGwgbGluZXMgKi8KKwkJfQorCQlpZiAoKHJvdyA9PSAwIHx8IGJvdF9zdGFydCA8IDk5OSkgJiYgd3AtPndfbGluZXNfdmFsaWQgIT0gMCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFNraXAgdGhlIGxpbmVzIChiZWxvdyB0aGUgZGVsZXRlZCBsaW5lcykgdGhhdCBhcmUgc3RpbGwKKwkJICAgICAqIHZhbGlkIGFuZCBkb24ndCBuZWVkIHJlZHJhd2luZy4JQ29weSB0aGVpciBpbmZvCisJCSAgICAgKiB1cHdhcmRzLCB0byBjb21wZW5zYXRlIGZvciB0aGUgZGVsZXRlZCBsaW5lcy4gIFNldAorCQkgICAgICogYm90X3N0YXJ0IHRvIHRoZSBmaXJzdCByb3cgdGhhdCBuZWVkcyByZWRyYXdpbmcuCisJCSAgICAgKi8KKwkJICAgIGJvdF9zdGFydCA9IDA7CisJCSAgICBpZHggPSAwOworCQkgICAgZm9yICg7OykKKwkJICAgIHsKKwkJCXdwLT53X2xpbmVzW2lkeF0gPSB3cC0+d19saW5lc1tqXTsKKwkJCS8qIHN0b3AgYXQgbGluZSB0aGF0IGRpZG4ndCBmaXQsIHVubGVzcyBpdCBpcyBzdGlsbAorCQkJICogdmFsaWQgKG5vIGxpbmVzIGRlbGV0ZWQpICovCisJCQlpZiAocm93ID4gMCAmJiBib3Rfc3RhcnQgKyByb3cKKwkJCQkgKyAoaW50KXdwLT53X2xpbmVzW2pdLndsX3NpemUgPiB3cC0+d19oZWlnaHQpCisJCQl7CisJCQkgICAgd3AtPndfbGluZXNfdmFsaWQgPSBpZHggKyAxOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJYm90X3N0YXJ0ICs9IHdwLT53X2xpbmVzW2lkeCsrXS53bF9zaXplOworCisJCQkvKiBzdG9wIGF0IHRoZSBsYXN0IHZhbGlkIGVudHJ5IGluIHdfbGluZXNbXS53bF9zaXplICovCisJCQlpZiAoKytqID49IHdwLT53X2xpbmVzX3ZhbGlkKQorCQkJeworCQkJICAgIHdwLT53X2xpbmVzX3ZhbGlkID0gaWR4OworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgLyogQ29ycmVjdCB0aGUgZmlyc3QgZW50cnkgZm9yIGZpbGxlciBsaW5lcyBhdCB0aGUgdG9wCisJCSAgICAgKiB3aGVuIGl0IHdvbid0IGdldCB1cGRhdGVkIGJlbG93LiAqLworCQkgICAgaWYgKHdwLT53X3BfZGlmZiAmJiBib3Rfc3RhcnQgPiAwKQorCQkJd3AtPndfbGluZXNbMF0ud2xfc2l6ZSA9CisJCQkgICAgcGxpbmVzX3dpbl9ub2ZpbGwod3AsIHdwLT53X3RvcGxpbmUsIFRSVUUpCisJCQkJCQkJICAgICAgKyB3cC0+d190b3BmaWxsOworI2VuZGlmCisJCX0KKwkgICAgfQorCX0KKworCS8qIFdoZW4gc3RhcnRpbmcgcmVkcmF3IGluIHRoZSBmaXJzdCBsaW5lLCByZWRyYXcgYWxsIGxpbmVzLiAgV2hlbgorCSAqIHRoZXJlIGlzIG9ubHkgb25lIHdpbmRvdyBpdCdzIHByb2JhYmx5IGZhc3RlciB0byBjbGVhciB0aGUgc2NyZWVuCisJICogZmlyc3QuICovCisJaWYgKG1pZF9zdGFydCA9PSAwKQorCXsKKwkgICAgbWlkX2VuZCA9IHdwLT53X2hlaWdodDsKKwkgICAgaWYgKGxhc3R3aW4gPT0gZmlyc3R3aW4pCisJCXNjcmVlbmNsZWFyKCk7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIE5vdCBWQUxJRCBvciBJTlZFUlRFRDogcmVkcmF3IGFsbCBsaW5lcy4gKi8KKwltaWRfc3RhcnQgPSAwOworCW1pZF9lbmQgPSB3cC0+d19oZWlnaHQ7CisgICAgfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiBjaGVjayBpZiB3ZSBhcmUgdXBkYXRpbmcgb3IgcmVtb3ZpbmcgdGhlIGludmVydGVkIHBhcnQgKi8KKyAgICBpZiAoKFZJc3VhbF9hY3RpdmUgJiYgYnVmID09IGN1cndpbi0+d19idWZmZXIpCisJICAgIHx8ICh3cC0+d19vbGRfY3Vyc29yX2xudW0gIT0gMCAmJiB0eXBlICE9IE5PVF9WQUxJRCkpCisgICAgeworCWxpbmVucl9UICAgIGZyb20sIHRvOworCisJaWYgKFZJc3VhbF9hY3RpdmUpCisJeworCSAgICBpZiAoVklzdWFsX2FjdGl2ZQorCQkgICAgJiYgKFZJc3VhbF9tb2RlICE9IHdwLT53X29sZF92aXN1YWxfbW9kZQorCQkJfHwgdHlwZSA9PSBJTlZFUlRFRF9BTEwpKQorCSAgICB7CisJCS8qCisJCSAqIElmIHRoZSB0eXBlIG9mIFZpc3VhbCBzZWxlY3Rpb24gY2hhbmdlZCwgcmVkcmF3IHRoZSB3aG9sZQorCQkgKiBzZWxlY3Rpb24uICBBbHNvIHdoZW4gdGhlIG93bmVyc2hpcCBvZiB0aGUgWCBzZWxlY3Rpb24gaXMKKwkJICogZ2FpbmVkIG9yIGxvc3QuCisJCSAqLworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgVklzdWFsLmxudW0pCisJCXsKKwkJICAgIGZyb20gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCSAgICB0byA9IFZJc3VhbC5sbnVtOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgZnJvbSA9IFZJc3VhbC5sbnVtOworCQkgICAgdG8gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCX0KKwkJLyogcmVkcmF3IG1vcmUgd2hlbiB0aGUgY3Vyc29yIG1vdmVkIGFzIHdlbGwgKi8KKwkJaWYgKHdwLT53X29sZF9jdXJzb3JfbG51bSA8IGZyb20pCisJCSAgICBmcm9tID0gd3AtPndfb2xkX2N1cnNvcl9sbnVtOworCQlpZiAod3AtPndfb2xkX2N1cnNvcl9sbnVtID4gdG8pCisJCSAgICB0byA9IHdwLT53X29sZF9jdXJzb3JfbG51bTsKKwkJaWYgKHdwLT53X29sZF92aXN1YWxfbG51bSA8IGZyb20pCisJCSAgICBmcm9tID0gd3AtPndfb2xkX3Zpc3VhbF9sbnVtOworCQlpZiAod3AtPndfb2xkX3Zpc3VhbF9sbnVtID4gdG8pCisJCSAgICB0byA9IHdwLT53X29sZF92aXN1YWxfbG51bTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogRmluZCB0aGUgbGluZSBudW1iZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkOiBUaGUgbGluZXMKKwkJICogYmV0d2VlbiB0aGUgb2xkIGN1cnNvciBwb3NpdGlvbiBhbmQgdGhlIGN1cnJlbnQgY3Vyc29yCisJCSAqIHBvc2l0aW9uLiAgQWxzbyBjaGVjayBpZiB0aGUgVmlzdWFsIHBvc2l0aW9uIGNoYW5nZWQuCisJCSAqLworCQlpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDwgd3AtPndfb2xkX2N1cnNvcl9sbnVtKQorCQl7CisJCSAgICBmcm9tID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCQkgICAgdG8gPSB3cC0+d19vbGRfY3Vyc29yX2xudW07CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBmcm9tID0gd3AtPndfb2xkX2N1cnNvcl9sbnVtOworCQkgICAgdG8gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJCSAgICBpZiAoZnJvbSA9PSAwKQkvKiBWaXN1YWwgbW9kZSBqdXN0IHN0YXJ0ZWQgKi8KKwkJCWZyb20gPSB0bzsKKwkJfQorCisJCWlmIChWSXN1YWwubG51bSAhPSB3cC0+d19vbGRfdmlzdWFsX2xudW0pCisJCXsKKwkJICAgIGlmICh3cC0+d19vbGRfdmlzdWFsX2xudW0gPCBmcm9tCisJCQkJCQkmJiB3cC0+d19vbGRfdmlzdWFsX2xudW0gIT0gMCkKKwkJCWZyb20gPSB3cC0+d19vbGRfdmlzdWFsX2xudW07CisJCSAgICBpZiAod3AtPndfb2xkX3Zpc3VhbF9sbnVtID4gdG8pCisJCQl0byA9IHdwLT53X29sZF92aXN1YWxfbG51bTsKKwkJICAgIGlmIChWSXN1YWwubG51bSA8IGZyb20pCisJCQlmcm9tID0gVklzdWFsLmxudW07CisJCSAgICBpZiAoVklzdWFsLmxudW0gPiB0bykKKwkJCXRvID0gVklzdWFsLmxudW07CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIGluIGJsb2NrIG1vZGUgYW5kIGNoYW5nZWQgY29sdW1uIG9yIGN1cndpbi0+d19jdXJzd2FudDoKKwkgICAgICogdXBkYXRlIGFsbCBsaW5lcy4KKwkgICAgICogRmlyc3QgY29tcHV0ZSB0aGUgYWN0dWFsIHN0YXJ0IGFuZCBlbmQgY29sdW1uLgorCSAgICAgKi8KKwkgICAgaWYgKFZJc3VhbF9tb2RlID09IEN0cmxfVikKKwkgICAgeworCQljb2xucl9UCWZyb21jLCB0b2M7CisKKwkJZ2V0dmNvbHMod3AsICZWSXN1YWwsICZjdXJ3aW4tPndfY3Vyc29yLCAmZnJvbWMsICZ0b2MpOworCQkrK3RvYzsKKwkJaWYgKGN1cndpbi0+d19jdXJzd2FudCA9PSBNQVhDT0wpCisJCSAgICB0b2MgPSBNQVhDT0w7CisKKwkJaWYgKGZyb21jICE9IHdwLT53X29sZF9jdXJzb3JfZmNvbAorCQkJfHwgdG9jICE9IHdwLT53X29sZF9jdXJzb3JfbGNvbCkKKwkJeworCQkgICAgaWYgKGZyb20gPiBWSXN1YWwubG51bSkKKwkJCWZyb20gPSBWSXN1YWwubG51bTsKKwkJICAgIGlmICh0byA8IFZJc3VhbC5sbnVtKQorCQkJdG8gPSBWSXN1YWwubG51bTsKKwkJfQorCQl3cC0+d19vbGRfY3Vyc29yX2Zjb2wgPSBmcm9tYzsKKwkJd3AtPndfb2xkX2N1cnNvcl9sY29sID0gdG9jOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIC8qIFVzZSB0aGUgbGluZSBudW1iZXJzIG9mIHRoZSBvbGQgVmlzdWFsIGFyZWEuICovCisJICAgIGlmICh3cC0+d19vbGRfY3Vyc29yX2xudW0gPCB3cC0+d19vbGRfdmlzdWFsX2xudW0pCisJICAgIHsKKwkJZnJvbSA9IHdwLT53X29sZF9jdXJzb3JfbG51bTsKKwkJdG8gPSB3cC0+d19vbGRfdmlzdWFsX2xudW07CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWZyb20gPSB3cC0+d19vbGRfdmlzdWFsX2xudW07CisJCXRvID0gd3AtPndfb2xkX2N1cnNvcl9sbnVtOworCSAgICB9CisJfQorCisJLyoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSBsaW5lcyBhYm92ZSB0aGUgdG9wIG9mIHRoZSB3aW5kb3cuCisJICovCisJaWYgKGZyb20gPCB3cC0+d190b3BsaW5lKQorCSAgICBmcm9tID0gd3AtPndfdG9wbGluZTsKKworCS8qCisJICogSWYgd2Uga25vdyB0aGUgdmFsdWUgb2Ygd19ib3RsaW5lLCB1c2UgaXQgdG8gcmVzdHJpY3QgdGhlIHVwZGF0ZSB0bworCSAqIHRoZSBsaW5lcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSB3aW5kb3cuCisJICovCisJaWYgKHdwLT53X3ZhbGlkICYgVkFMSURfQk9UTElORSkKKwl7CisJICAgIGlmIChmcm9tID49IHdwLT53X2JvdGxpbmUpCisJCWZyb20gPSB3cC0+d19ib3RsaW5lIC0gMTsKKwkgICAgaWYgKHRvID49IHdwLT53X2JvdGxpbmUpCisJCXRvID0gd3AtPndfYm90bGluZSAtIDE7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBtaW5pbWFsIHBhcnQgdG8gYmUgdXBkYXRlZC4KKwkgKiBXYXRjaCBvdXQgZm9yIHNjcm9sbGluZyB0aGF0IG1hZGUgZW50cmllcyBpbiB3X2xpbmVzW10gaW52YWxpZC4KKwkgKiBFLmcuLCBDVFJMLVUgbWFrZXMgdGhlIGZpcnN0IGhhbGYgb2Ygd19saW5lc1tdIGludmFsaWQgYW5kIHNldHMKKwkgKiB0b3BfZW5kOyBuZWVkIHRvIHJlZHJhdyBmcm9tIHRvcF9lbmQgdG8gdGhlICJ0byIgbGluZS4KKwkgKiBBIG1pZGRsZSBtb3VzZSBjbGljayB3aXRoIGEgVmlzdWFsIHNlbGVjdGlvbiBtYXkgY2hhbmdlIHRoZSB0ZXh0CisJICogYWJvdmUgdGhlIFZpc3VhbCBhcmVhIGFuZCByZXNldCB3bF92YWxpZCwgZG8gY291bnQgdGhlc2UgZm9yCisJICogbWlkX2VuZCAoaW4gc3JvdykuCisJICovCisJaWYgKG1pZF9zdGFydCA+IDApCisJeworCSAgICBsbnVtID0gd3AtPndfdG9wbGluZTsKKwkgICAgaWR4ID0gMDsKKwkgICAgc3JvdyA9IDA7CisJICAgIGlmIChzY3JvbGxlZF9kb3duKQorCQltaWRfc3RhcnQgPSB0b3BfZW5kOworCSAgICBlbHNlCisJCW1pZF9zdGFydCA9IDA7CisJICAgIHdoaWxlIChsbnVtIDwgZnJvbSAmJiBpZHggPCB3cC0+d19saW5lc192YWxpZCkJLyogZmluZCBzdGFydCAqLworCSAgICB7CisJCWlmICh3cC0+d19saW5lc1tpZHhdLndsX3ZhbGlkKQorCQkgICAgbWlkX3N0YXJ0ICs9IHdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZTsKKwkJZWxzZSBpZiAoIXNjcm9sbGVkX2Rvd24pCisJCSAgICBzcm93ICs9IHdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZTsKKwkJKytpZHg7CisjIGlmZGVmIEZFQVRfRk9MRElORworCQlpZiAoaWR4IDwgd3AtPndfbGluZXNfdmFsaWQgJiYgd3AtPndfbGluZXNbaWR4XS53bF92YWxpZCkKKwkJICAgIGxudW0gPSB3cC0+d19saW5lc1tpZHhdLndsX2xudW07CisJCWVsc2UKKyMgZW5kaWYKKwkJICAgICsrbG51bTsKKwkgICAgfQorCSAgICBzcm93ICs9IG1pZF9zdGFydDsKKwkgICAgbWlkX2VuZCA9IHdwLT53X2hlaWdodDsKKwkgICAgZm9yICggOyBpZHggPCB3cC0+d19saW5lc192YWxpZDsgKytpZHgpCQkvKiBmaW5kIGVuZCAqLworCSAgICB7CisJCWlmICh3cC0+d19saW5lc1tpZHhdLndsX3ZhbGlkCisJCQkmJiB3cC0+d19saW5lc1tpZHhdLndsX2xudW0gPj0gdG8gKyAxKQorCQl7CisJCSAgICAvKiBPbmx5IHVwZGF0ZSB1bnRpbCBmaXJzdCByb3cgb2YgdGhpcyBsaW5lICovCisJCSAgICBtaWRfZW5kID0gc3JvdzsKKwkJICAgIGJyZWFrOworCQl9CisJCXNyb3cgKz0gd3AtPndfbGluZXNbaWR4XS53bF9zaXplOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChWSXN1YWxfYWN0aXZlICYmIGJ1ZiA9PSBjdXJ3aW4tPndfYnVmZmVyKQorICAgIHsKKwl3cC0+d19vbGRfdmlzdWFsX21vZGUgPSBWSXN1YWxfbW9kZTsKKwl3cC0+d19vbGRfY3Vyc29yX2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJd3AtPndfb2xkX3Zpc3VhbF9sbnVtID0gVklzdWFsLmxudW07CisJd3AtPndfb2xkX2N1cnN3YW50ID0gY3Vyd2luLT53X2N1cnN3YW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworCXdwLT53X29sZF92aXN1YWxfbW9kZSA9IDA7CisJd3AtPndfb2xkX2N1cnNvcl9sbnVtID0gMDsKKwl3cC0+d19vbGRfdmlzdWFsX2xudW0gPSAwOworICAgIH0KKyNlbmRpZiAvKiBGRUFUX1ZJU1VBTCAqLworCisjaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChGRUFUX1NFQVJDSF9FWFRSQSkKKyAgICAvKiByZXNldCBnb3RfaW50LCBvdGhlcndpc2UgcmVnZXhwIHdvbid0IHdvcmsgKi8KKyAgICBzYXZlX2dvdF9pbnQgPSBnb3RfaW50OworICAgIGdvdF9pbnQgPSAwOworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgd2luX2ZvbGRpbmZvLmZpX2xldmVsID0gMDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgYWxsIHRoZSB3aW5kb3cgcm93cy4KKyAgICAgKi8KKyAgICBpZHggPSAwOwkJLyogZmlyc3QgZW50cnkgaW4gd19saW5lc1tdLndsX3NpemUgKi8KKyAgICByb3cgPSAwOworICAgIHNyb3cgPSAwOworICAgIGxudW0gPSB3cC0+d190b3BsaW5lOwkvKiBmaXJzdCBsaW5lIHNob3duIGluIHdpbmRvdyAqLworICAgIGZvciAoOzspCisgICAgeworCS8qIHN0b3AgdXBkYXRpbmcgd2hlbiByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHdpbmRvdyAoY2hlY2sgZm9yIF9wYXN0XworCSAqIHRoZSBlbmQgb2YgdGhlIHdpbmRvdyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsb29wKSAqLworCWlmIChyb3cgPT0gd3AtPndfaGVpZ2h0KQorCXsKKwkgICAgZGlkbGluZSA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKworCS8qIHN0b3AgdXBkYXRpbmcgd2hlbiBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworCWlmIChsbnVtID4gYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBlb2YgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisKKwkvKiBSZW1lbWJlciB0aGUgc3RhcnRpbmcgcm93IG9mIHRoZSBsaW5lIHRoYXQgaXMgZ29pbmcgdG8gYmUgZGVhbHQKKwkgKiB3aXRoLiAgSXQgaXMgdXNlZCBmdXJ0aGVyIGRvd24gd2hlbiB0aGUgbGluZSBkb2Vzbid0IGZpdC4gKi8KKwlzcm93ID0gcm93OworCisJLyoKKwkgKiBVcGRhdGUgYSBsaW5lIHdoZW4gaXQgaXMgaW4gYW4gYXJlYSB0aGF0IG5lZWRzIHVwZGF0aW5nLCB3aGVuIGl0CisJICogaGFzIGNoYW5nZXMgb3Igd19saW5lc1tpZHhdIGlzIGludmFsaWQuCisJICogYm90X3N0YXJ0IG1heSBiZSBoYWxmd2F5IGEgd3JhcHBlZCBsaW5lIGFmdGVyIHVzaW5nCisJICogd2luX2RlbF9saW5lcygpLCBjaGVjayBpZiB0aGUgY3VycmVudCBsaW5lIGluY2x1ZGVzIGl0LgorCSAqIFdoZW4gc3ludGF4IGZvbGRpbmcgaXMgYmVpbmcgdXNlZCwgdGhlIHNhdmVkIHN5bnRheCBzdGF0ZXMgd2lsbAorCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHVwZGF0ZWQsIHdlIGNhbid0IHNlZSB3aGVyZSB0aGUgc3ludGF4IHN0YXRlIGlzCisJICogdGhlIHNhbWUgYWdhaW4sIGp1c3QgdXBkYXRlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4KKwkgKi8KKwlpZiAocm93IDwgdG9wX2VuZAorCQl8fCAocm93ID49IG1pZF9zdGFydCAmJiByb3cgPCBtaWRfZW5kKQorI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJCXx8IHRvcF90b19tb2QKKyNlbmRpZgorCQl8fCBpZHggPj0gd3AtPndfbGluZXNfdmFsaWQKKwkJfHwgKHJvdyArIHdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZSA+IGJvdF9zdGFydCkKKwkJfHwgKG1vZF90b3AgIT0gMAorCQkgICAgJiYgKGxudW0gPT0gbW9kX3RvcAorCQkJfHwgKGxudW0gPj0gbW9kX3RvcAorCQkJICAgICYmIChsbnVtIDwgbW9kX2JvdAorI2lmZGVmIEZFQVRfU1lOX0hMCisJCQkJfHwgZGlkX3VwZGF0ZSA9PSBESURfRk9MRAorCQkJCXx8IChkaWRfdXBkYXRlID09IERJRF9MSU5FCisJCQkJICAgICYmIHN5bnRheF9wcmVzZW50KGJ1ZikKKwkJCQkgICAgJiYgKAorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkJCQkJKGZvbGRtZXRob2RJc1N5bnRheCh3cCkKKwkJCQkJCSAgICAgICYmIGhhc0FueUZvbGRpbmcod3ApKSB8fAorIyBlbmRpZgorCQkJCQlzeW50YXhfY2hlY2tfY2hhbmdlZChsbnVtKSkpCisjZW5kaWYKKwkJCQkpKSkpKQorCXsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCSAgICBpZiAobG51bSA9PSBtb2RfdG9wKQorCQl0b3BfdG9fbW9kID0gRkFMU0U7CisjZW5kaWYKKworCSAgICAvKgorCSAgICAgKiBXaGVuIGF0IHN0YXJ0IG9mIGNoYW5nZWQgbGluZXM6IE1heSBzY3JvbGwgZm9sbG93aW5nIGxpbmVzCisJICAgICAqIHVwIG9yIGRvd24gdG8gbWluaW1pemUgcmVkcmF3aW5nLgorCSAgICAgKiBEb24ndCBkbyB0aGlzIHdoZW4gdGhlIGNoYW5nZSBjb250aW51ZXMgdW50aWwgdGhlIGVuZC4KKwkgICAgICogRG9uJ3Qgc2Nyb2xsIHdoZW4gZG9sbGFyX3Zjb2wgaXMgbm9uLXplcm8sIGtlZXAgdGhlICIkIi4KKwkgICAgICovCisJICAgIGlmIChsbnVtID09IG1vZF90b3AKKwkJICAgICYmIG1vZF9ib3QgIT0gTUFYTE5VTQorCQkgICAgJiYgIShkb2xsYXJfdmNvbCAhPSAwICYmIG1vZF9ib3QgPT0gbW9kX3RvcCArIDEpKQorCSAgICB7CisJCWludAkJb2xkX3Jvd3MgPSAwOworCQlpbnQJCW5ld19yb3dzID0gMDsKKwkJaW50CQl4dHJhX3Jvd3M7CisJCWxpbmVucl9UCWw7CisKKwkJLyogQ291bnQgdGhlIG9sZCBudW1iZXIgb2Ygd2luZG93IHJvd3MsIHVzaW5nIHdfbGluZXNbXSwgd2hpY2gKKwkJICogc2hvdWxkIHN0aWxsIGNvbnRhaW4gdGhlIHNpemVzIGZvciB0aGUgbGluZXMgYXMgdGhleSBhcmUKKwkJICogY3VycmVudGx5IGRpc3BsYXllZC4gKi8KKwkJZm9yIChpID0gaWR4OyBpIDwgd3AtPndfbGluZXNfdmFsaWQ7ICsraSkKKwkJeworCQkgICAgLyogT25seSB2YWxpZCBsaW5lcyBoYXZlIGEgbWVhbmluZ2Z1bCB3bF9sbnVtLiAgSW52YWxpZAorCQkgICAgICogbGluZXMgYXJlIHBhcnQgb2YgdGhlIGNoYW5nZWQgYXJlYS4gKi8KKwkJICAgIGlmICh3cC0+d19saW5lc1tpXS53bF92YWxpZAorCQkJICAgICYmIHdwLT53X2xpbmVzW2ldLndsX2xudW0gPT0gbW9kX2JvdCkKKwkJCWJyZWFrOworCQkgICAgb2xkX3Jvd3MgKz0gd3AtPndfbGluZXNbaV0ud2xfc2l6ZTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJICAgIGlmICh3cC0+d19saW5lc1tpXS53bF92YWxpZAorCQkJICAgICYmIHdwLT53X2xpbmVzW2ldLndsX2xhc3RsbnVtICsgMSA9PSBtb2RfYm90KQorCQkgICAgeworCQkJLyogTXVzdCBoYXZlIGZvdW5kIHRoZSBsYXN0IHZhbGlkIGVudHJ5IGFib3ZlIG1vZF9ib3QuCisJCQkgKiBBZGQgZm9sbG93aW5nIGludmFsaWQgZW50cmllcy4gKi8KKwkJCSsraTsKKwkJCXdoaWxlIChpIDwgd3AtPndfbGluZXNfdmFsaWQKKwkJCQkJCSAgJiYgIXdwLT53X2xpbmVzW2ldLndsX3ZhbGlkKQorCQkJICAgIG9sZF9yb3dzICs9IHdwLT53X2xpbmVzW2krK10ud2xfc2l6ZTsKKwkJCWJyZWFrOworCQkgICAgfQorI2VuZGlmCisJCX0KKworCQlpZiAoaSA+PSB3cC0+d19saW5lc192YWxpZCkKKwkJeworCQkgICAgLyogV2UgY2FuJ3QgZmluZCBhIHZhbGlkIGxpbmUgYmVsb3cgdGhlIGNoYW5nZWQgbGluZXMsCisJCSAgICAgKiBuZWVkIHRvIHJlZHJhdyB1bnRpbCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuCisJCSAgICAgKiBJbnNlcnRpbmcvZGVsZXRpbmcgbGluZXMgaGFzIG5vIHVzZS4gKi8KKwkJICAgIGJvdF9zdGFydCA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBBYmxlIHRvIGNvdW50IG9sZCBudW1iZXIgb2Ygcm93czogQ291bnQgbmV3IHdpbmRvdworCQkgICAgICogcm93cywgYW5kIG1heSBpbnNlcnQvZGVsZXRlIGxpbmVzICovCisJCSAgICBqID0gaWR4OworCQkgICAgZm9yIChsID0gbG51bTsgbCA8IG1vZF9ib3Q7ICsrbCkKKwkJICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJCWlmIChoYXNGb2xkaW5nV2luKHdwLCBsLCBOVUxMLCAmbCwgVFJVRSwgTlVMTCkpCisJCQkgICAgKytuZXdfcm93czsKKwkJCWVsc2UKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorCQkJICAgIGlmIChsID09IHdwLT53X3RvcGxpbmUpCisJCQkgICAgbmV3X3Jvd3MgKz0gcGxpbmVzX3dpbl9ub2ZpbGwod3AsIGwsIFRSVUUpCisJCQkJCQkJICAgICAgKyB3cC0+d190b3BmaWxsOworCQkJZWxzZQorI2VuZGlmCisJCQkgICAgbmV3X3Jvd3MgKz0gcGxpbmVzX3dpbih3cCwgbCwgVFJVRSk7CisJCQkrK2o7CisJCQlpZiAobmV3X3Jvd3MgPiB3cC0+d19oZWlnaHQgLSByb3cgLSAyKQorCQkJeworCQkJICAgIC8qIGl0J3MgZ2V0dGluZyB0b28gbXVjaCwgbXVzdCByZWRyYXcgdGhlIHJlc3QgKi8KKwkJCSAgICBuZXdfcm93cyA9IDk5OTk7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICB4dHJhX3Jvd3MgPSBuZXdfcm93cyAtIG9sZF9yb3dzOworCQkgICAgaWYgKHh0cmFfcm93cyA8IDApCisJCSAgICB7CisJCQkvKiBNYXkgc2Nyb2xsIHRleHQgdXAuICBJZiB0aGVyZSBpcyBub3QgZW5vdWdoCisJCQkgKiByZW1haW5pbmcgdGV4dCBvciBzY3JvbGxpbmcgZmFpbHMsIG11c3QgcmVkcmF3IHRoZQorCQkJICogcmVzdC4gIElmIHNjcm9sbGluZyB3b3JrcywgbXVzdCByZWRyYXcgdGhlIHRleHQKKwkJCSAqIGJlbG93IHRoZSBzY3JvbGxlZCB0ZXh0LiAqLworCQkJaWYgKHJvdyAtIHh0cmFfcm93cyA+PSB3cC0+d19oZWlnaHQgLSAyKQorCQkJICAgIG1vZF9ib3QgPSBNQVhMTlVNOworCQkJZWxzZQorCQkJeworCQkJICAgIGNoZWNrX2Zvcl9kZWxheShGQUxTRSk7CisJCQkgICAgaWYgKHdpbl9kZWxfbGluZXMod3AsIHJvdywKKwkJCQkJICAgIC14dHJhX3Jvd3MsIEZBTFNFLCBGQUxTRSkgPT0gRkFJTCkKKwkJCQltb2RfYm90ID0gTUFYTE5VTTsKKwkJCSAgICBlbHNlCisJCQkJYm90X3N0YXJ0ID0gd3AtPndfaGVpZ2h0ICsgeHRyYV9yb3dzOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZSBpZiAoeHRyYV9yb3dzID4gMCkKKwkJICAgIHsKKwkJCS8qIE1heSBzY3JvbGwgdGV4dCBkb3duLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaAorCQkJICogcmVtYWluaW5nIHRleHQgb2Ygc2Nyb2xsaW5nIGZhaWxzLCBtdXN0IHJlZHJhdyB0aGUKKwkJCSAqIHJlc3QuICovCisJCQlpZiAocm93ICsgeHRyYV9yb3dzID49IHdwLT53X2hlaWdodCAtIDIpCisJCQkgICAgbW9kX2JvdCA9IE1BWExOVU07CisJCQllbHNlCisJCQl7CisJCQkgICAgY2hlY2tfZm9yX2RlbGF5KEZBTFNFKTsKKwkJCSAgICBpZiAod2luX2luc19saW5lcyh3cCwgcm93ICsgb2xkX3Jvd3MsCisJCQkJCSAgICAgeHRyYV9yb3dzLCBGQUxTRSwgRkFMU0UpID09IEZBSUwpCisJCQkJbW9kX2JvdCA9IE1BWExOVU07CisJCQkgICAgZWxzZSBpZiAodG9wX2VuZCA+IHJvdyArIG9sZF9yb3dzKQorCQkJCS8qIFNjcm9sbGVkIHRoZSBwYXJ0IGF0IHRoZSB0b3AgdGhhdCByZXF1aXJlcworCQkJCSAqIHVwZGF0aW5nIGRvd24uICovCisJCQkJdG9wX2VuZCArPSB4dHJhX3Jvd3M7CisJCQl9CisJCSAgICB9CisKKwkJICAgIC8qIFdoZW4gbm90IHVwZGF0aW5nIHRoZSByZXN0LCBtYXkgbmVlZCB0byBtb3ZlIHdfbGluZXNbXQorCQkgICAgICogZW50cmllcy4gKi8KKwkJICAgIGlmIChtb2RfYm90ICE9IE1BWExOVU0gJiYgaSAhPSBqKQorCQkgICAgeworCQkJaWYgKGogPCBpKQorCQkJeworCQkJICAgIGludCB4ID0gcm93ICsgbmV3X3Jvd3M7CisKKwkJCSAgICAvKiBtb3ZlIGVudHJpZXMgaW4gd19saW5lc1tdIHVwd2FyZHMgKi8KKwkJCSAgICBmb3IgKDs7KQorCQkJICAgIHsKKwkJCQkvKiBzdG9wIGF0IGxhc3QgdmFsaWQgZW50cnkgaW4gd19saW5lc1tdICovCisJCQkJaWYgKGkgPj0gd3AtPndfbGluZXNfdmFsaWQpCisJCQkJeworCQkJCSAgICB3cC0+d19saW5lc192YWxpZCA9IGo7CisJCQkJICAgIGJyZWFrOworCQkJCX0KKwkJCQl3cC0+d19saW5lc1tqXSA9IHdwLT53X2xpbmVzW2ldOworCQkJCS8qIHN0b3AgYXQgYSBsaW5lIHRoYXQgd29uJ3QgZml0ICovCisJCQkJaWYgKHggKyAoaW50KXdwLT53X2xpbmVzW2pdLndsX3NpemUKKwkJCQkJCQkgICA+IHdwLT53X2hlaWdodCkKKwkJCQl7CisJCQkJICAgIHdwLT53X2xpbmVzX3ZhbGlkID0gaiArIDE7CisJCQkJICAgIGJyZWFrOworCQkJCX0KKwkJCQl4ICs9IHdwLT53X2xpbmVzW2orK10ud2xfc2l6ZTsKKwkJCQkrK2k7CisJCQkgICAgfQorCQkJICAgIGlmIChib3Rfc3RhcnQgPiB4KQorCQkJCWJvdF9zdGFydCA9IHg7CisJCQl9CisJCQllbHNlIC8qIGogPiBpICovCisJCQl7CisJCQkgICAgLyogbW92ZSBlbnRyaWVzIGluIHdfbGluZXNbXSBkb3dud2FyZHMgKi8KKwkJCSAgICBqIC09IGk7CisJCQkgICAgd3AtPndfbGluZXNfdmFsaWQgKz0gajsKKwkJCSAgICBpZiAod3AtPndfbGluZXNfdmFsaWQgPiB3cC0+d19oZWlnaHQpCisJCQkJd3AtPndfbGluZXNfdmFsaWQgPSB3cC0+d19oZWlnaHQ7CisJCQkgICAgZm9yIChpID0gd3AtPndfbGluZXNfdmFsaWQ7IGkgLSBqID49IGlkeDsgLS1pKQorCQkJCXdwLT53X2xpbmVzW2ldID0gd3AtPndfbGluZXNbaSAtIGpdOworCisJCQkgICAgLyogVGhlIHdfbGluZXNbXSBlbnRyaWVzIGZvciBpbnNlcnRlZCBsaW5lcyBhcmUKKwkJCSAgICAgKiBub3cgaW52YWxpZCwgYnV0IHdsX3NpemUgbWF5IGJlIHVzZWQgYWJvdmUuCisJCQkgICAgICogUmVzZXQgdG8gemVyby4gKi8KKwkJCSAgICB3aGlsZSAoaSA+PSBpZHgpCisJCQkgICAgeworCQkJCXdwLT53X2xpbmVzW2ldLndsX3NpemUgPSAwOworCQkJCXdwLT53X2xpbmVzW2ktLV0ud2xfdmFsaWQgPSBGQUxTRTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKworCQkvKiBXaGVuIGluc2VydGluZyBvciBkZWxldGluZyBsaW5lcyBhbmQgJ251bWJlcicgaXMgc2V0OgorCQkgKiBSZWRyYXcgYWxsIGxpbmVzIGJlbG93IHRoZSBjaGFuZ2UgdG8gdXBkYXRlIHRoZSBsaW5lCisJCSAqIG51bWJlcnMuICovCisJCWlmIChidWYtPmJfbW9kX3hsaW5lcyAhPSAwICYmIHdwLT53X3BfbnUpCisJCSAgICBib3Rfc3RhcnQgPSAwOworCSAgICB9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgLyoKKwkgICAgICogV2hlbiBsaW5lcyBhcmUgZm9sZGVkLCBkaXNwbGF5IG9uZSBsaW5lIGZvciBhbGwgb2YgdGhlbS4KKwkgICAgICogT3RoZXJ3aXNlLCBkaXNwbGF5IG5vcm1hbGx5IChjYW4gYmUgc2V2ZXJhbCBkaXNwbGF5IGxpbmVzIHdoZW4KKwkgICAgICogJ3dyYXAnIGlzIG9uKS4KKwkgICAgICovCisJICAgIGZvbGRfY291bnQgPSBmb2xkZWRDb3VudCh3cCwgbG51bSwgJndpbl9mb2xkaW5mbyk7CisJICAgIGlmIChmb2xkX2NvdW50ICE9IDApCisJICAgIHsKKwkJZm9sZF9saW5lKHdwLCBmb2xkX2NvdW50LCAmd2luX2ZvbGRpbmZvLCBsbnVtLCByb3cpOworCQkrK3JvdzsKKwkJLS1mb2xkX2NvdW50OworCQl3cC0+d19saW5lc1tpZHhdLndsX2ZvbGRlZCA9IFRSVUU7CisJCXdwLT53X2xpbmVzW2lkeF0ud2xfbGFzdGxudW0gPSBsbnVtICsgZm9sZF9jb3VudDsKKyMgaWZkZWYgRkVBVF9TWU5fSEwKKwkJZGlkX3VwZGF0ZSA9IERJRF9GT0xEOworIyBlbmRpZgorCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICBpZiAoaWR4IDwgd3AtPndfbGluZXNfdmFsaWQKKwkJICAgICYmIHdwLT53X2xpbmVzW2lkeF0ud2xfdmFsaWQKKwkJICAgICYmIHdwLT53X2xpbmVzW2lkeF0ud2xfbG51bSA9PSBsbnVtCisJCSAgICAmJiBsbnVtID4gd3AtPndfdG9wbGluZQorCQkgICAgJiYgIShkeV9mbGFncyAmIERZX0xBU1RMSU5FKQorCQkgICAgJiYgc3JvdyArIHdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZSA+IHdwLT53X2hlaWdodAorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgJiYgZGlmZl9jaGVja19maWxsKHdwLCBsbnVtKSA9PSAwCisjZW5kaWYKKwkJICAgICkKKwkgICAgeworCQkvKiBUaGlzIGxpbmUgaXMgbm90IGdvaW5nIHRvIGZpdC4gIERvbid0IGRyYXcgYW55dGhpbmcgaGVyZSwKKwkJICogd2lsbCBkcmF3ICJAICAiIGxpbmVzIGJlbG93LiAqLworCQlyb3cgPSB3cC0+d19oZWlnaHQgKyAxOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJCXByZXBhcmVfc2VhcmNoX2hsKHdwLCBsbnVtKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1lOX0hMCisJCS8qIExldCB0aGUgc3ludGF4IHN0dWZmIGtub3cgd2Ugc2tpcHBlZCBhIGZldyBsaW5lcy4gKi8KKwkJaWYgKHN5bnRheF9sYXN0X3BhcnNlZCAhPSAwICYmIHN5bnRheF9sYXN0X3BhcnNlZCArIDEgPCBsbnVtCisJCQkJCQkgICAgICAgJiYgc3ludGF4X3ByZXNlbnQoYnVmKSkKKwkJICAgIHN5bnRheF9lbmRfcGFyc2luZyhzeW50YXhfbGFzdF9wYXJzZWQgKyAxKTsKKyNlbmRpZgorCisJCS8qCisJCSAqIERpc3BsYXkgb25lIGxpbmUuCisJCSAqLworCQlyb3cgPSB3aW5fbGluZSh3cCwgbG51bSwgc3Jvdywgd3AtPndfaGVpZ2h0KTsKKworI2lmZGVmIEZFQVRfRk9MRElORworCQl3cC0+d19saW5lc1tpZHhdLndsX2ZvbGRlZCA9IEZBTFNFOworCQl3cC0+d19saW5lc1tpZHhdLndsX2xhc3RsbnVtID0gbG51bTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1lOX0hMCisJCWRpZF91cGRhdGUgPSBESURfTElORTsKKwkJc3ludGF4X2xhc3RfcGFyc2VkID0gbG51bTsKKyNlbmRpZgorCSAgICB9CisKKwkgICAgd3AtPndfbGluZXNbaWR4XS53bF9sbnVtID0gbG51bTsKKwkgICAgd3AtPndfbGluZXNbaWR4XS53bF92YWxpZCA9IFRSVUU7CisJICAgIGlmIChyb3cgPiB3cC0+d19oZWlnaHQpCS8qIHBhc3QgZW5kIG9mIHNjcmVlbiAqLworCSAgICB7CisJCS8qIHdlIG1heSBuZWVkIHRoZSBzaXplIG9mIHRoYXQgdG9vIGxvbmcgbGluZSBsYXRlciBvbiAqLworCQlpZiAoZG9sbGFyX3Zjb2wgPT0gMCkKKwkJICAgIHdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZSA9IHBsaW5lc193aW4od3AsIGxudW0sIFRSVUUpOworCQkrK2lkeDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGRvbGxhcl92Y29sID09IDApCisJCXdwLT53X2xpbmVzW2lkeF0ud2xfc2l6ZSA9IHJvdyAtIHNyb3c7CisJICAgICsraWR4OworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBsbnVtICs9IGZvbGRfY291bnQgKyAxOworI2Vsc2UKKwkgICAgKytsbnVtOworI2VuZGlmCisJfQorCWVsc2UKKwl7CisJICAgIC8qIFRoaXMgbGluZSBkb2VzIG5vdCBuZWVkIHVwZGF0aW5nLCBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZSAqLworCSAgICByb3cgKz0gd3AtPndfbGluZXNbaWR4KytdLndsX3NpemU7CisJICAgIGlmIChyb3cgPiB3cC0+d19oZWlnaHQpCS8qIHBhc3QgZW5kIG9mIHNjcmVlbiAqLworCQlicmVhazsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkgICAgbG51bSA9IHdwLT53X2xpbmVzW2lkeCAtIDFdLndsX2xhc3RsbnVtICsgMTsKKyNlbHNlCisJICAgICsrbG51bTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1lOX0hMCisJICAgIGRpZF91cGRhdGUgPSBESURfTk9ORTsKKyNlbmRpZgorCX0KKworCWlmIChsbnVtID4gYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBlb2YgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIC8qCisgICAgICogRW5kIG9mIGxvb3Agb3ZlciBhbGwgd2luZG93IGxpbmVzLgorICAgICAqLworCisKKyAgICBpZiAoaWR4ID4gd3AtPndfbGluZXNfdmFsaWQpCisJd3AtPndfbGluZXNfdmFsaWQgPSBpZHg7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIC8qCisgICAgICogTGV0IHRoZSBzeW50YXggc3R1ZmYga25vdyB3ZSBzdG9wIHBhcnNpbmcgaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoc3ludGF4X2xhc3RfcGFyc2VkICE9IDAgJiYgc3ludGF4X3ByZXNlbnQoYnVmKSkKKwlzeW50YXhfZW5kX3BhcnNpbmcoc3ludGF4X2xhc3RfcGFyc2VkICsgMSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgd2UgZGlkbid0IGhpdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgd2UgZGlkbid0IGZpbmlzaCB0aGUgbGFzdAorICAgICAqIGxpbmUgd2Ugd2VyZSB3b3JraW5nIG9uLCB0aGVuIHRoZSBsaW5lIGRpZG4ndCBmaXQuCisgICAgICovCisgICAgd3AtPndfZW1wdHlfcm93cyA9IDA7CisjaWZkZWYgRkVBVF9ESUZGCisgICAgd3AtPndfZmlsbGVyX3Jvd3MgPSAwOworI2VuZGlmCisgICAgaWYgKCFlb2YgJiYgIWRpZGxpbmUpCisgICAgeworCWlmIChsbnVtID09IHdwLT53X3RvcGxpbmUpCisJeworCSAgICAvKgorCSAgICAgKiBTaW5nbGUgbGluZSB0aGF0IGRvZXMgbm90IGZpdCEKKwkgICAgICogRG9uJ3Qgb3ZlcndyaXRlIGl0LCBpdCBjYW4gYmUgZWRpdGVkLgorCSAgICAgKi8KKwkgICAgd3AtPndfYm90bGluZSA9IGxudW0gKyAxOworCX0KKyNpZmRlZiBGRUFUX0RJRkYKKwllbHNlIGlmIChkaWZmX2NoZWNrX2ZpbGwod3AsIGxudW0pID49IHdwLT53X2hlaWdodCAtIHNyb3cpCisJeworCSAgICAvKiBXaW5kb3cgZW5kcyBpbiBmaWxsZXIgbGluZXMuICovCisJICAgIHdwLT53X2JvdGxpbmUgPSBsbnVtOworCSAgICB3cC0+d19maWxsZXJfcm93cyA9IHdwLT53X2hlaWdodCAtIHNyb3c7CisJfQorI2VuZGlmCisJZWxzZSBpZiAoZHlfZmxhZ3MgJiBEWV9MQVNUTElORSkJLyogJ2Rpc3BsYXknIGhhcyAibGFzdGxpbmUiICovCisJeworCSAgICAvKgorCSAgICAgKiBMYXN0IGxpbmUgaXNuJ3QgZmluaXNoZWQ6IERpc3BsYXkgIkBAQCIgYXQgdGhlIGVuZC4KKwkgICAgICovCisJICAgIHNjcmVlbl9maWxsKFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodCAtIDEsCisJCSAgICBXX1dJTlJPVyh3cCkgKyB3cC0+d19oZWlnaHQsCisJCSAgICAoaW50KVdfRU5EQ09MKHdwKSAtIDMsIChpbnQpV19FTkRDT0wod3ApLAorCQkgICAgJ0AnLCAnQCcsIGhsX2F0dHIoSExGX0FUKSk7CisJICAgIHNldF9lbXB0eV9yb3dzKHdwLCBzcm93KTsKKwkgICAgd3AtPndfYm90bGluZSA9IGxudW07CisJfQorCWVsc2UKKwl7CisJICAgIHdpbl9kcmF3X2VuZCh3cCwgJ0AnLCAnICcsIHNyb3csIHdwLT53X2hlaWdodCwgSExGX0FUKTsKKwkgICAgd3AtPndfYm90bGluZSA9IGxudW07CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJZHJhd192c2VwX3dpbih3cCwgcm93KTsKKyNlbmRpZgorCWlmIChlb2YpCQkvKiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworCXsKKwkgICAgd3AtPndfYm90bGluZSA9IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgaiA9IGRpZmZfY2hlY2tfZmlsbCh3cCwgd3AtPndfYm90bGluZSk7CisJICAgIGlmIChqID4gMCAmJiAhd3AtPndfYm90ZmlsbCkKKwkgICAgeworCQkvKgorCQkgKiBEaXNwbGF5IGZpbGxlciBsaW5lcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisJCSAqLworCQlpZiAoY2hhcjJjZWxscyhmaWxsX2RpZmYpID4gMSkKKwkJICAgIGkgPSAnLSc7CisJCWVsc2UKKwkJICAgIGkgPSBmaWxsX2RpZmY7CisJCWlmIChyb3cgKyBqID4gd3AtPndfaGVpZ2h0KQorCQkgICAgaiA9IHdwLT53X2hlaWdodCAtIHJvdzsKKwkJd2luX2RyYXdfZW5kKHdwLCBpLCBpLCByb3csIHJvdyArIChpbnQpaiwgSExGX0RFRCk7CisJCXJvdyArPSBqOworCSAgICB9CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoZG9sbGFyX3Zjb2wgPT0gMCkKKwkgICAgd3AtPndfYm90bGluZSA9IGxudW07CisKKwkvKiBtYWtlIHN1cmUgdGhlIHJlc3Qgb2YgdGhlIHNjcmVlbiBpcyBibGFuayAqLworCS8qIHB1dCAnfidzIG9uIHJvd3MgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgZmlsZS4gKi8KKwl3aW5fZHJhd19lbmQod3AsICd+JywgJyAnLCByb3csIHdwLT53X2hlaWdodCwgSExGX0FUKTsKKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgdHlwZSBvZiByZWRyYXdpbmcgcmVxdWlyZWQsIHRoZSB3aW5kb3cgaGFzIGJlZW4gdXBkYXRlZC4gKi8KKyAgICB3cC0+d19yZWRyX3R5cGUgPSAwOworI2lmZGVmIEZFQVRfRElGRgorICAgIHdwLT53X29sZF90b3BmaWxsID0gd3AtPndfdG9wZmlsbDsKKyAgICB3cC0+d19vbGRfYm90ZmlsbCA9IHdwLT53X2JvdGZpbGw7CisjZW5kaWYKKworICAgIGlmIChkb2xsYXJfdmNvbCA9PSAwKQorICAgIHsKKwkvKgorCSAqIFRoZXJlIGlzIGEgdHJpY2sgd2l0aCB3X2JvdGxpbmUuICBJZiB3ZSBpbnZhbGlkYXRlIGl0IG9uIGVhY2gKKwkgKiBjaGFuZ2UgdGhhdCBtaWdodCBtb2RpZnkgaXQsIHRoaXMgd2lsbCBjYXVzZSBhIGxvdCBvZiBleHBlbnNpdmUKKwkgKiBjYWxscyB0byBwbGluZXMoKSBpbiB1cGRhdGVfdG9wbGluZSgpIGVhY2ggdGltZS4gIFRoZXJlZm9yZSB0aGUKKwkgKiB2YWx1ZSBvZiB3X2JvdGxpbmUgaXMgb2Z0ZW4gYXBwcm94aW1hdGVkLCBhbmQgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvCisJICogY29tcHV0ZSB0aGUgdmFsdWUgb2Ygd190b3BsaW5lLiAgSWYgdGhlIHZhbHVlIG9mIHdfYm90bGluZSB3YXMKKwkgKiB3cm9uZywgY2hlY2sgdGhhdCB0aGUgdmFsdWUgb2Ygd190b3BsaW5lIGlzIGNvcnJlY3QgKGN1cnNvciBpcyBvbgorCSAqIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIHRleHQpLiAgSWYgaXQncyBub3QsIHdlIG5lZWQgdG8gcmVkcmF3CisJICogYWdhaW4uICBNb3N0bHkgdGhpcyBqdXN0IG1lYW5zIHNjcm9sbGluZyB1cCBhIGZldyBsaW5lcywgc28gaXQKKwkgKiBkb2Vzbid0IGxvb2sgdG9vIGJhZC4gIE9ubHkgZG8gdGhpcyBmb3IgdGhlIGN1cnJlbnQgd2luZG93ICh3aGVyZQorCSAqIGNoYW5nZXMgYXJlIHJlbGV2YW50KS4KKwkgKi8KKwl3cC0+d192YWxpZCB8PSBWQUxJRF9CT1RMSU5FOworCWlmICh3cCA9PSBjdXJ3aW4gJiYgd3AtPndfYm90bGluZSAhPSBvbGRfYm90bGluZSAmJiAhcmVjdXJzaXZlKQorCXsKKwkgICAgcmVjdXJzaXZlID0gVFJVRTsKKwkgICAgY3Vyd2luLT53X3ZhbGlkICY9IH5WQUxJRF9UT1BMSU5FOworCSAgICB1cGRhdGVfdG9wbGluZSgpOwkvKiBtYXkgaW52YWxpZGF0ZSB3X2JvdGxpbmUgYWdhaW4gKi8KKwkgICAgaWYgKG11c3RfcmVkcmF3ICE9IDApCisJICAgIHsKKwkJLyogRG9uJ3QgdXBkYXRlIGZvciBjaGFuZ2VzIGluIGJ1ZmZlciBhZ2Fpbi4gKi8KKwkJaSA9IGN1cmJ1Zi0+Yl9tb2Rfc2V0OworCQljdXJidWYtPmJfbW9kX3NldCA9IEZBTFNFOworCQl3aW5fdXBkYXRlKGN1cndpbik7CisJCW11c3RfcmVkcmF3ID0gMDsKKwkJY3VyYnVmLT5iX21vZF9zZXQgPSBpOworCSAgICB9CisJICAgIHJlY3Vyc2l2ZSA9IEZBTFNFOworCX0KKyAgICB9CisKKyNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKEZFQVRfU0VBUkNIX0VYVFJBKQorICAgIC8qIHJlc3RvcmUgZ290X2ludCwgdW5sZXNzIENUUkwtQyB3YXMgaGl0IHdoaWxlIHJlZHJhd2luZyAqLworICAgIGlmICghZ290X2ludCkKKwlnb3RfaW50ID0gc2F2ZV9nb3RfaW50OworI2VuZGlmCit9CisKKyNpZmRlZiBGRUFUX1NJR05TCitzdGF0aWMgaW50IGRyYXdfc2lnbmNvbHVtbiBfX0FSR1MoKHdpbl9UICp3cCkpOworCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiB3aW5kb3cgIndwIiBoYXMgYSBjb2x1bW4gdG8gZHJhdyBzaWducyBpbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2RyYXdfc2lnbmNvbHVtbih3cCkKKyAgICB3aW5fVCAqd3A7Cit7CisgICAgcmV0dXJuICh3cC0+d19idWZmZXItPmJfc2lnbmxpc3QgIT0gTlVMTAorIyBpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwkJCSAgICB8fCB1c2luZ05ldGJlYW5zCisjIGVuZGlmCisJCSAgICApOworfQorI2VuZGlmCisKKy8qCisgKiBDbGVhciB0aGUgcmVzdCBvZiB0aGUgd2luZG93IGFuZCBtYXJrIHRoZSB1bnVzZWQgbGluZXMgd2l0aCAiYzEiLiAgdXNlICJjMiIKKyAqIGFzIHRoZSBmaWxsZXIgY2hhcmFjdGVyLgorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9kcmF3X2VuZCh3cCwgYzEsIGMyLCByb3csIGVuZHJvdywgaGwpCisgICAgd2luX1QJKndwOworICAgIGludAkJYzE7CisgICAgaW50CQljMjsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWVuZHJvdzsKKyAgICBlbnVtIGhsZl92YWx1ZSBobDsKK3sKKyNpZiBkZWZpbmVkKEZFQVRfRk9MRElORykgfHwgZGVmaW5lZChGRUFUX1NJR05TKSB8fCBkZWZpbmVkKEZFQVRfQ01EV0lOKQorICAgIGludAkJbiA9IDA7CisjIGRlZmluZSBGRENfT0ZGIG4KKyNlbHNlCisjIGRlZmluZSBGRENfT0ZGIDAKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAod3AtPndfcF9ybCkKKyAgICB7CisJLyogTm8gY2hlY2sgZm9yIGNtZGxpbmUgd2luZG93OiBzaG91bGQgbmV2ZXIgYmUgcmlnaHQtbGVmdC4gKi8KKyMgaWZkZWYgRkVBVF9GT0xESU5HCisJbiA9IHdwLT53X3BfZmRjOworCisJaWYgKG4gPiAwKQorCXsKKwkgICAgLyogZHJhdyB0aGUgZm9sZCBjb2x1bW4gYXQgdGhlIHJpZ2h0ICovCisJICAgIGlmIChuID4gd3AtPndfd2lkdGgpCisJCW4gPSB3cC0+d193aWR0aDsKKwkgICAgc2NyZWVuX2ZpbGwoV19XSU5ST1cod3ApICsgcm93LCBXX1dJTlJPVyh3cCkgKyBlbmRyb3csCisJCSAgICBXX0VORENPTCh3cCkgLSBuLCAoaW50KVdfRU5EQ09MKHdwKSwKKwkJICAgICcgJywgJyAnLCBobF9hdHRyKEhMRl9GQykpOworCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9TSUdOUworCWlmIChkcmF3X3NpZ25jb2x1bW4od3ApKQorCXsKKwkgICAgaW50IG5uID0gbiArIDI7CisKKwkgICAgLyogZHJhdyB0aGUgc2lnbiBjb2x1bW4gbGVmdCBvZiB0aGUgZm9sZCBjb2x1bW4gKi8KKwkgICAgaWYgKG5uID4gd3AtPndfd2lkdGgpCisJCW5uID0gd3AtPndfd2lkdGg7CisJICAgIHNjcmVlbl9maWxsKFdfV0lOUk9XKHdwKSArIHJvdywgV19XSU5ST1cod3ApICsgZW5kcm93LAorCQkgICAgV19FTkRDT0wod3ApIC0gbm4sIChpbnQpV19FTkRDT0wod3ApIC0gbiwKKwkJICAgICcgJywgJyAnLCBobF9hdHRyKEhMRl9TQykpOworCSAgICBuID0gbm47CisJfQorIyBlbmRpZgorCXNjcmVlbl9maWxsKFdfV0lOUk9XKHdwKSArIHJvdywgV19XSU5ST1cod3ApICsgZW5kcm93LAorCQlXX1dJTkNPTCh3cCksIFdfRU5EQ09MKHdwKSAtIDEgLSBGRENfT0ZGLAorCQljMiwgYzIsIGhsX2F0dHIoaGwpKTsKKwlzY3JlZW5fZmlsbChXX1dJTlJPVyh3cCkgKyByb3csIFdfV0lOUk9XKHdwKSArIGVuZHJvdywKKwkJV19FTkRDT0wod3ApIC0gMSAtIEZEQ19PRkYsIFdfRU5EQ09MKHdwKSAtIEZEQ19PRkYsCisJCWMxLCBjMiwgaGxfYXR0cihobCkpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoY21kd2luX3R5cGUgIT0gMCAmJiB3cCA9PSBjdXJ3aW4pCisJeworCSAgICAvKiBkcmF3IHRoZSBjbWRsaW5lIGNoYXJhY3RlciBpbiB0aGUgbGVmdG1vc3QgY29sdW1uICovCisJICAgIG4gPSAxOworCSAgICBpZiAobiA+IHdwLT53X3dpZHRoKQorCQluID0gd3AtPndfd2lkdGg7CisJICAgIHNjcmVlbl9maWxsKFdfV0lOUk9XKHdwKSArIHJvdywgV19XSU5ST1cod3ApICsgZW5kcm93LAorCQkgICAgV19XSU5DT0wod3ApLCAoaW50KVdfV0lOQ09MKHdwKSArIG4sCisJCSAgICBjbWR3aW5fdHlwZSwgJyAnLCBobF9hdHRyKEhMRl9BVCkpOworCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCWlmICh3cC0+d19wX2ZkYyA+IDApCisJeworCSAgICBpbnQJICAgIG5uID0gbiArIHdwLT53X3BfZmRjOworCisJICAgIC8qIGRyYXcgdGhlIGZvbGQgY29sdW1uIGF0IHRoZSBsZWZ0ICovCisJICAgIGlmIChubiA+IFdfV0lEVEgod3ApKQorCQlubiA9IFdfV0lEVEgod3ApOworCSAgICBzY3JlZW5fZmlsbChXX1dJTlJPVyh3cCkgKyByb3csIFdfV0lOUk9XKHdwKSArIGVuZHJvdywKKwkJICAgIFdfV0lOQ09MKHdwKSArIG4sIChpbnQpV19XSU5DT0wod3ApICsgbm4sCisJCSAgICAnICcsICcgJywgaGxfYXR0cihITEZfRkMpKTsKKwkgICAgbiA9IG5uOworCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRfU0lHTlMKKwlpZiAoZHJhd19zaWduY29sdW1uKHdwKSkKKwl7CisJICAgIGludAkgICAgbm4gPSBuICsgMjsKKworCSAgICAvKiBkcmF3IHRoZSBzaWduIGNvbHVtbiBhZnRlciB0aGUgZm9sZCBjb2x1bW4gKi8KKwkgICAgaWYgKG5uID4gV19XSURUSCh3cCkpCisJCW5uID0gV19XSURUSCh3cCk7CisJICAgIHNjcmVlbl9maWxsKFdfV0lOUk9XKHdwKSArIHJvdywgV19XSU5ST1cod3ApICsgZW5kcm93LAorCQkgICAgV19XSU5DT0wod3ApICsgbiwgKGludClXX1dJTkNPTCh3cCkgKyBubiwKKwkJICAgICcgJywgJyAnLCBobF9hdHRyKEhMRl9TQykpOworCSAgICBuID0gbm47CisJfQorI2VuZGlmCisJc2NyZWVuX2ZpbGwoV19XSU5ST1cod3ApICsgcm93LCBXX1dJTlJPVyh3cCkgKyBlbmRyb3csCisJCVdfV0lOQ09MKHdwKSArIEZEQ19PRkYsIChpbnQpV19FTkRDT0wod3ApLAorCQljMSwgYzIsIGhsX2F0dHIoaGwpKTsKKyAgICB9CisgICAgc2V0X2VtcHR5X3Jvd3Mod3AsIHJvdyk7Cit9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKy8qCisgKiBEaXNwbGF5IG9uZSBmb2xkZWQgbGluZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmb2xkX2xpbmUod3AsIGZvbGRfY291bnQsIGZvbGRpbmZvLCBsbnVtLCByb3cpCisgICAgd2luX1QJKndwOworICAgIGxvbmcJZm9sZF9jb3VudDsKKyAgICBmb2xkaW5mb19UCSpmb2xkaW5mbzsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJcm93OworeworICAgIGNoYXJfdQlidWZbNTFdOworICAgIHBvc19UCSp0b3AsICpib3Q7CisgICAgbGluZW5yX1QJbG51bWUgPSBsbnVtICsgZm9sZF9jb3VudCAtIDE7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqdGV4dCA9IE5VTEw7CisgICAgaW50CQlmZGM7CisgICAgaW50CQlsZXZlbDsKKyAgICBpbnQJCWNvbDsKKyAgICBpbnQJCXR4dGNvbDsKKyAgICBpbnQJCW9mZiA9IChpbnQpKGN1cnJlbnRfU2NyZWVuTGluZSAtIFNjcmVlbkxpbmVzKTsKKworICAgIC8qIEJ1aWxkIHRoZSBmb2xkIGxpbmU6CisgICAgICogMS4gQWRkIHRoZSBjbWR3aW5fdHlwZSBmb3IgdGhlIGNvbW1hbmQtbGluZSB3aW5kb3cKKyAgICAgKiAyLiBBZGQgdGhlICdmb2xkY29sdW1uJworICAgICAqIDMuIEFkZCB0aGUgJ251bWJlcicgY29sdW1uCisgICAgICogNC4gQ29tcG9zZSB0aGUgdGV4dAorICAgICAqIDUuIEFkZCB0aGUgdGV4dAorICAgICAqIDYuIHNldCBoaWdobGlnaHRpbmcgZm9yIHRoZSBWaXN1YWwgYXJlYSBhbiBvdGhlciB0ZXh0CisgICAgICovCisgICAgY29sID0gMDsKKworICAgIC8qCisgICAgICogMS4gQWRkIHRoZSBjbWR3aW5fdHlwZSBmb3IgdGhlIGNvbW1hbmQtbGluZSB3aW5kb3cKKyAgICAgKiBJZ25vcmVzICdyaWdodGxlZnQnLCB0aGlzIHdpbmRvdyBpcyBuZXZlciByaWdodC1sZWZ0LgorICAgICAqLworI2lmZGVmIEZFQVRfQ01EV0lOCisgICAgaWYgKGNtZHdpbl90eXBlICE9IDAgJiYgd3AgPT0gY3Vyd2luKQorICAgIHsKKwlTY3JlZW5MaW5lc1tvZmZdID0gY21kd2luX3R5cGU7CisJU2NyZWVuQXR0cnNbb2ZmXSA9IGhsX2F0dHIoSExGX0FUKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4KQorCSAgICBTY3JlZW5MaW5lc1VDW29mZl0gPSAwOworI2VuZGlmCisJKytjb2w7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIDIuIEFkZCB0aGUgJ2ZvbGRjb2x1bW4nCisgICAgICovCisgICAgZmRjID0gd3AtPndfcF9mZGM7CisgICAgaWYgKGZkYyA+IFdfV0lEVEgod3ApIC0gY29sKQorCWZkYyA9IFdfV0lEVEgod3ApIC0gY29sOworICAgIGlmIChmZGMgPiAwKQorICAgIHsKKwlmaWxsX2ZvbGRjb2x1bW4oYnVmLCB3cCwgVFJVRSwgbG51bSk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwlpZiAod3AtPndfcF9ybCkKKwl7CisJICAgIGludAkJaTsKKworCSAgICBjb3B5X3RleHRfYXR0cihvZmYgKyBXX1dJRFRIKHdwKSAtIGZkYyAtIGNvbCwgYnVmLCBmZGMsCisJCQkJCQkJICAgICBobF9hdHRyKEhMRl9GQykpOworCSAgICAvKiByZXZlcnNlIHRoZSBmb2xkIGNvbHVtbiAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgZmRjOyArK2kpCisJCVNjcmVlbkxpbmVzW29mZiArIFdfV0lEVEgod3ApIC0gaSAtIDEgLSBjb2xdID0gYnVmW2ldOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgY29weV90ZXh0X2F0dHIob2ZmICsgY29sLCBidWYsIGZkYywgaGxfYXR0cihITEZfRkMpKTsKKwljb2wgKz0gZmRjOworICAgIH0KKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisjIGRlZmluZSBSTF9NRU1TRVQocCwgdiwgbCkgdmltX21lbXNldChTY3JlZW5BdHRycyArIG9mZiArICh3cC0+d19wX3JsID8gKFdfV0lEVEgod3ApIC0gKHApIC0gKGwpKSA6IChwKSksIHYsIGwpCisjZWxzZQorIyBkZWZpbmUgUkxfTUVNU0VUKHAsIHYsIGwpIHZpbV9tZW1zZXQoU2NyZWVuQXR0cnMgKyBvZmYgKyBwLCB2LCBsKQorI2VuZGlmCisKKyAgICAvKiBTZXQgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlICdudW1iZXInIGNvbHVtbiBhbmQgdGhlIHRleHQgKi8KKyAgICBSTF9NRU1TRVQoY29sLCBobF9hdHRyKEhMRl9GTCksIChzaXplX3QpKFdfV0lEVEgod3ApIC0gY29sKSk7CisKKyNpZmRlZiBGRUFUX1NJR05TCisgICAgLyogSWYgc2lnbnMgYXJlIGJlaW5nIGRpc3BsYXllZCwgYWRkIHR3byBzcGFjZXMuICovCisgICAgaWYgKGRyYXdfc2lnbmNvbHVtbih3cCkpCisgICAgeworCWxlbiA9IFdfV0lEVEgod3ApIC0gY29sOworCWlmIChsZW4gPiAwKQorCXsKKwkgICAgaWYgKGxlbiA+IDIpCisJCWxlbiA9IDI7CisjIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJICAgIGlmICh3cC0+d19wX3JsKQorCQkvKiB0aGUgbGluZSBudW1iZXIgaXNuJ3QgcmV2ZXJzZWQgKi8KKwkJY29weV90ZXh0X2F0dHIob2ZmICsgV19XSURUSCh3cCkgLSBsZW4gLSBjb2wsCisJCQkJCShjaGFyX3UgKikiICAiLCBsZW4sIGhsX2F0dHIoSExGX0ZMKSk7CisJICAgIGVsc2UKKyMgZW5kaWYKKwkJY29weV90ZXh0X2F0dHIob2ZmICsgY29sLCAoY2hhcl91ICopIiAgIiwgbGVuLCBobF9hdHRyKEhMRl9GTCkpOworCSAgICBjb2wgKz0gbGVuOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogMy4gQWRkIHRoZSAnbnVtYmVyJyBjb2x1bW4KKyAgICAgKi8KKyAgICBpZiAod3AtPndfcF9udSkKKyAgICB7CisJbGVuID0gV19XSURUSCh3cCkgLSBjb2w7CisJaWYgKGxlbiA+IDApCisJeworCSAgICBpZiAobGVuID4gOCkKKwkJbGVuID0gODsKKwkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIiU3bGQgIiwgKGxvbmcpbG51bSk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgaWYgKHdwLT53X3BfcmwpCisJCS8qIHRoZSBsaW5lIG51bWJlciBpc24ndCByZXZlcnNlZCAqLworCQljb3B5X3RleHRfYXR0cihvZmYgKyBXX1dJRFRIKHdwKSAtIGxlbiAtIGNvbCwgYnVmLCBsZW4sCisJCQkJCQkJICAgICBobF9hdHRyKEhMRl9GTCkpOworCSAgICBlbHNlCisjZW5kaWYKKwkJY29weV90ZXh0X2F0dHIob2ZmICsgY29sLCBidWYsIGxlbiwgaGxfYXR0cihITEZfRkwpKTsKKwkgICAgY29sICs9IGxlbjsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiA0LiBDb21wb3NlIHRoZSBmb2xkZWQtbGluZSBzdHJpbmcgd2l0aCAnZm9sZHRleHQnLCBpZiBzZXQuCisgICAgICovCisjaWZkZWYgRkVBVF9FVkFMCisgICAgaWYgKCp3cC0+d19wX2ZkdCAhPSBOVUwpCisgICAgeworCWNoYXJfdQlkYXNoZXNbNTFdOworCXdpbl9UCSpzYXZlX2N1cndpbjsKKworCS8qIFNldCAidjpmb2xkc3RhcnQiIGFuZCAidjpmb2xkZW5kIi4gKi8KKwlzZXRfdmltX3Zhcl9ucihWVl9GT0xEU1RBUlQsIGxudW0pOworCXNldF92aW1fdmFyX25yKFZWX0ZPTERFTkQsIGxudW1lKTsKKworCS8qIFNldCAidjpmb2xkZGFzaGVzIiB0byBhIHN0cmluZyBvZiAibGV2ZWwiIGRhc2hlcy4gKi8KKwkvKiBTZXQgInY6Zm9sZGxldmVsIiB0byAibGV2ZWwiLiAqLworCWxldmVsID0gZm9sZGluZm8tPmZpX2xldmVsOworCWlmIChsZXZlbCA+IDUwKQorCSAgICBsZXZlbCA9IDUwOworCXZpbV9tZW1zZXQoZGFzaGVzLCAnLScsIChzaXplX3QpbGV2ZWwpOworCWRhc2hlc1tsZXZlbF0gPSBOVUw7CisJc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZPTEREQVNIRVMsIGRhc2hlcywgLTEpOworCXNldF92aW1fdmFyX25yKFZWX0ZPTERMRVZFTCwgKGxvbmcpbGV2ZWwpOworCXNhdmVfY3Vyd2luID0gY3Vyd2luOworCWN1cndpbiA9IHdwOworCWN1cmJ1ZiA9IHdwLT53X2J1ZmZlcjsKKworCSsrZW1zZ19vZmY7CisJdGV4dCA9IGV2YWxfdG9fc3RyaW5nX3NhZmUod3AtPndfcF9mZHQsIE5VTEwpOworCS0tZW1zZ19vZmY7CisKKwljdXJ3aW4gPSBzYXZlX2N1cndpbjsKKwljdXJidWYgPSBjdXJ3aW4tPndfYnVmZmVyOworCXNldF92aW1fdmFyX3N0cmluZyhWVl9GT0xEREFTSEVTLCBOVUxMLCAtMSk7CisKKwlpZiAodGV4dCAhPSBOVUxMKQorCXsKKwkgICAgLyogUmVwbGFjZSB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCBpZiB0aGVyZSBhcmUgYW55LiAgQnV0CisJICAgICAqIHJlcGxhY2UgYSBUQUIgd2l0aCBhIHNwYWNlLiAqLworCSAgICBmb3IgKHAgPSB0ZXh0OyAqcCAhPSBOVUw7ICsrcCkKKwkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSAmJiAobGVuID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkgPiAxKQorCQl7CisJCSAgICBpZiAoIXZpbV9pc3ByaW50YygoKm1iX3B0cjJjaGFyKShwKSkpCisJCQlicmVhazsKKwkJICAgIHAgKz0gbGVuIC0gMTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJICAgIGlmICgqcCA9PSBUQUIpCisJCQkqcCA9ICcgJzsKKwkJICAgIGVsc2UgaWYgKHB0cjJjZWxscyhwKSA+IDEpCisJCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoKnAgIT0gTlVMKQorCSAgICB7CisJCXAgPSB0cmFuc3N0cih0ZXh0KTsKKwkJdmltX2ZyZWUodGV4dCk7CisJCXRleHQgPSBwOworCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAodGV4dCA9PSBOVUxMKQorI2VuZGlmCisgICAgeworCXNwcmludGYoKGNoYXIgKilidWYsIF8oIistLSUzbGQgbGluZXMgZm9sZGVkICIpLCBmb2xkX2NvdW50KTsKKwl0ZXh0ID0gYnVmOworICAgIH0KKworICAgIHR4dGNvbCA9IGNvbDsJLyogcmVtZW1iZXIgd2hlcmUgdGV4dCBzdGFydHMgKi8KKworICAgIC8qCisgICAgICogNS4gbW92ZSB0aGUgdGV4dCB0byBjdXJyZW50X1NjcmVlbkxpbmUuICBGaWxsIHVwIHdpdGggImZpbGxfZm9sZCIuCisgICAgICogICAgUmlnaHQtbGVmdCB0ZXh0IGlzIHB1dCBpbiBjb2x1bW5zIDAgLSBudW1iZXItY29sLCBub3JtYWwgdGV4dCBpcyBwdXQKKyAgICAgKiAgICBpbiBjb2x1bW5zIG51bWJlci1jb2wgLSB3aW5kb3ctd2lkdGguCisgICAgICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChoYXNfbWJ5dGUpCisgICAgeworCWludAljZWxsczsKKwlpbnQJdThjLCB1OGNfYzEsIHU4Y19jMjsKKwlpbnQJaWR4OworCWludAljX2xlbjsKKyMgaWZkZWYgRkVBVF9BUkFCSUMKKwlpbnQJcHJldl9jID0gMDsJCS8qIHByZXZpb3VzIEFyYWJpYyBjaGFyYWN0ZXIgKi8KKwlpbnQJcHJldl9jMSA9IDA7CQkvKiBmaXJzdCBjb21wb3NpbmcgY2hhciBmb3IgcHJldl9jICovCisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9SSUdIVExFRlQKKwlpZiAod3AtPndfcF9ybCkKKwkgICAgaWR4ID0gb2ZmOworCWVsc2UKKyMgZW5kaWYKKwkgICAgaWR4ID0gb2ZmICsgY29sOworCisJLyogU3RvcmUgbXVsdGlieXRlIGNoYXJhY3RlcnMgaW4gU2NyZWVuTGluZXNbXSBldCBhbC4gY29ycmVjdGx5LiAqLworCWZvciAocCA9IHRleHQ7ICpwICE9IE5VTDsgKQorCXsKKwkgICAgY2VsbHMgPSAoKm1iX3B0cjJjZWxscykocCk7CisJICAgIGNfbGVuID0gKCptYl9wdHIybGVuX2NoZWNrKShwKTsKKwkgICAgaWYgKGNvbCArIGNlbGxzID4gV19XSURUSCh3cCkKKyMgaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJICAgIC0gKHdwLT53X3BfcmwgPyBjb2wgOiAwKQorIyBlbmRpZgorCQkgICAgKQorCQlicmVhazsKKwkgICAgU2NyZWVuTGluZXNbaWR4XSA9ICpwOworCSAgICBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJdThjID0gdXRmY19wdHIyY2hhcihwLCAmdThjX2MxLCAmdThjX2MyKTsKKwkJaWYgKCpwIDwgMHg4MCAmJiB1OGNfYzEgPT0gMCAmJiB1OGNfYzIgPT0gMCkKKwkJeworCQkgICAgU2NyZWVuTGluZXNVQ1tpZHhdID0gMDsKKyNpZmRlZiBGRUFUX0FSQUJJQworCQkgICAgcHJldl9jID0gdThjOworI2VuZGlmCisJCX0KKwkJZWxzZQorCQl7CisjaWZkZWYgRkVBVF9BUkFCSUMKKwkJICAgIGlmIChwX2Fyc2hhcGUgJiYgIXBfdGJpZGkgJiYgQVJBQklDX0NIQVIodThjKSkKKwkJICAgIHsKKwkJCS8qIERvIEFyYWJpYyBzaGFwaW5nLiAqLworCQkJaW50CXBjLCBwYzEsIG5jLCBkdW1teTsKKwkJCWludAlmaXJzdGJ5dGUgPSAqcDsKKworCQkJLyogVGhlIGlkZWEgb2Ygd2hhdCBpcyB0aGUgcHJldmlvdXMgYW5kIG5leHQKKwkJCSAqIGNoYXJhY3RlciBkZXBlbmRzIG9uICdyaWdodGxlZnQnLiAqLworCQkJaWYgKHdwLT53X3BfcmwpCisJCQl7CisJCQkgICAgcGMgPSBwcmV2X2M7CisJCQkgICAgcGMxID0gcHJldl9jMTsKKwkJCSAgICBuYyA9IHV0Zl9wdHIyY2hhcihwICsgY19sZW4pOworCQkJICAgIHByZXZfYzEgPSB1OGNfYzE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkgICAgcGMgPSB1dGZjX3B0cjJjaGFyKHAgKyBjX2xlbiwgJnBjMSwgJmR1bW15KTsKKwkJCSAgICBuYyA9IHByZXZfYzsKKwkJCX0KKwkJCXByZXZfYyA9IHU4YzsKKworCQkJdThjID0gYXJhYmljX3NoYXBlKHU4YywgJmZpcnN0Ynl0ZSwgJnU4Y19jMSwKKwkJCQkJCQkJIHBjLCBwYzEsIG5jKTsKKwkJCVNjcmVlbkxpbmVzW2lkeF0gPSBmaXJzdGJ5dGU7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlwcmV2X2MgPSB1OGM7CisjZW5kaWYKKwkJICAgIC8qIE5vbi1CTVAgY2hhcmFjdGVyOiBkaXNwbGF5IGFzID8gb3IgZnVsbHdpZHRoID8uICovCisJCSAgICBpZiAodThjID49IDB4MTAwMDApCisJCQlTY3JlZW5MaW5lc1VDW2lkeF0gPSAoY2VsbHMgPT0gMikgPyAweGZmMWYgOiAoaW50KSc/JzsKKwkJICAgIGVsc2UKKwkJCVNjcmVlbkxpbmVzVUNbaWR4XSA9IHU4YzsKKwkJICAgIFNjcmVlbkxpbmVzQzFbaWR4XSA9IHU4Y19jMTsKKwkJICAgIFNjcmVlbkxpbmVzQzJbaWR4XSA9IHU4Y19jMjsKKwkJfQorCQlpZiAoY2VsbHMgPiAxKQorCQkgICAgU2NyZWVuTGluZXNbaWR4ICsgMV0gPSAwOworCSAgICB9CisJICAgIGVsc2UgaWYgKGNlbGxzID4gMSkJICAgIC8qIGRvdWJsZS1ieXRlIGNoYXJhY3RlciAqLworCSAgICB7CisJCWlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgKnAgPT0gMHg4ZSkKKwkJICAgIFNjcmVlbkxpbmVzMltpZHhdID0gcFsxXTsKKwkJZWxzZQorCQkgICAgU2NyZWVuTGluZXNbaWR4ICsgMV0gPSBwWzFdOworCSAgICB9CisJICAgIGNvbCArPSBjZWxsczsKKwkgICAgaWR4ICs9IGNlbGxzOworCSAgICBwICs9IGNfbGVuOworCX0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWxlbiA9IChpbnQpU1RSTEVOKHRleHQpOworCWlmIChsZW4gPiBXX1dJRFRIKHdwKSAtIGNvbCkKKwkgICAgbGVuID0gV19XSURUSCh3cCkgLSBjb2w7CisJaWYgKGxlbiA+IDApCisJeworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJICAgIGlmICh3cC0+d19wX3JsKQorCQlTVFJOQ1BZKGN1cnJlbnRfU2NyZWVuTGluZSwgdGV4dCwgbGVuKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCVNUUk5DUFkoY3VycmVudF9TY3JlZW5MaW5lICsgY29sLCB0ZXh0LCBsZW4pOworCSAgICBjb2wgKz0gbGVuOworCX0KKyAgICB9CisKKyAgICAvKiBGaWxsIHRoZSByZXN0IG9mIHRoZSBsaW5lIHdpdGggdGhlIGZvbGQgZmlsbGVyICovCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAod3AtPndfcF9ybCkKKwljb2wgLT0gdHh0Y29sOworI2VuZGlmCisgICAgd2hpbGUgKGNvbCA8IFdfV0lEVEgod3ApCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJICAgIC0gKHdwLT53X3BfcmwgPyB0eHRjb2wgOiAwKQorI2VuZGlmCisJICAgICkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChlbmNfdXRmOCkKKwl7CisJICAgIGlmIChmaWxsX2ZvbGQgPj0gMHg4MCkKKwkgICAgeworCQlTY3JlZW5MaW5lc1VDW29mZiArIGNvbF0gPSBmaWxsX2ZvbGQ7CisJCVNjcmVlbkxpbmVzQzFbb2ZmICsgY29sXSA9IDA7CisJCVNjcmVlbkxpbmVzQzJbb2ZmICsgY29sXSA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCQlTY3JlZW5MaW5lc1VDW29mZiArIGNvbF0gPSAwOworCX0KKyNlbmRpZgorCVNjcmVlbkxpbmVzW29mZiArIGNvbCsrXSA9IGZpbGxfZm9sZDsKKyAgICB9CisKKyAgICBpZiAodGV4dCAhPSBidWYpCisJdmltX2ZyZWUodGV4dCk7CisKKyAgICAvKgorICAgICAqIDYuIHNldCBoaWdobGlnaHRpbmcgZm9yIHRoZSBWaXN1YWwgYXJlYSBhbiBvdGhlciB0ZXh0LgorICAgICAqIElmIGFsbCBmb2xkZWQgbGluZXMgYXJlIGluIHRoZSBWaXN1YWwgYXJlYSwgaGlnaGxpZ2h0IHRoZSBsaW5lLgorICAgICAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUgJiYgd3AtPndfYnVmZmVyID09IGN1cndpbi0+d19idWZmZXIpCisgICAgeworCWlmIChsdG9yZXEoY3Vyd2luLT53X2N1cnNvciwgVklzdWFsKSkKKwl7CisJICAgIC8qIFZpc3VhbCBpcyBhZnRlciBjdXJ3aW4tPndfY3Vyc29yICovCisJICAgIHRvcCA9ICZjdXJ3aW4tPndfY3Vyc29yOworCSAgICBib3QgPSAmVklzdWFsOworCX0KKwllbHNlCisJeworCSAgICAvKiBWaXN1YWwgaXMgYmVmb3JlIGN1cndpbi0+d19jdXJzb3IgKi8KKwkgICAgdG9wID0gJlZJc3VhbDsKKwkgICAgYm90ID0gJmN1cndpbi0+d19jdXJzb3I7CisJfQorCWlmIChsbnVtID49IHRvcC0+bG51bQorCQkmJiBsbnVtZSA8PSBib3QtPmxudW0KKwkJJiYgKFZJc3VhbF9tb2RlICE9ICd2JworCQkgICAgfHwgKChsbnVtID4gdG9wLT5sbnVtCisJCQkgICAgfHwgKGxudW0gPT0gdG9wLT5sbnVtCisJCQkJJiYgdG9wLT5jb2wgPT0gMCkpCisJCQkmJiAobG51bWUgPCBib3QtPmxudW0KKwkJCSAgICB8fCAobG51bWUgPT0gYm90LT5sbnVtCisJCQkJJiYgKGJvdC0+Y29sIC0gKCpwX3NlbCA9PSAnZScpKQorCQk+PSBTVFJMRU4obWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW1lLCBGQUxTRSkpKSkpKSkKKwl7CisJICAgIGlmIChWSXN1YWxfbW9kZSA9PSBDdHJsX1YpCisJICAgIHsKKwkJLyogVmlzdWFsIGJsb2NrIG1vZGU6IGhpZ2hsaWdodCB0aGUgY2hhcnMgcGFydCBvZiB0aGUgYmxvY2sgKi8KKwkJaWYgKHdwLT53X29sZF9jdXJzb3JfZmNvbCArIHR4dGNvbCA8IChjb2xucl9UKVdfV0lEVEgod3ApKQorCQl7CisJCSAgICBpZiAod3AtPndfb2xkX2N1cnNvcl9sY29sICsgdHh0Y29sIDwgKGNvbG5yX1QpV19XSURUSCh3cCkpCisJCQlsZW4gPSB3cC0+d19vbGRfY3Vyc29yX2xjb2w7CisJCSAgICBlbHNlCisJCQlsZW4gPSBXX1dJRFRIKHdwKSAtIHR4dGNvbDsKKwkJICAgIFJMX01FTVNFVCh3cC0+d19vbGRfY3Vyc29yX2Zjb2wgKyB0eHRjb2wsIGhsX2F0dHIoSExGX1YpLAorCQkJCSAgICAgICAoc2l6ZV90KShsZW4gLSB3cC0+d19vbGRfY3Vyc29yX2Zjb2wpKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJLyogU2V0IGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSB0ZXh0ICovCisJCVJMX01FTVNFVCh0eHRjb2wsIGhsX2F0dHIoSExGX1YpLAorCQkJCQkgICAgICAoc2l6ZV90KShXX1dJRFRIKHdwKSAtIHR4dGNvbCkpOworCX0KKyAgICB9CisjZW5kaWYKKworCisgICAgU0NSRUVOX0xJTkUocm93ICsgV19XSU5ST1cod3ApLCBXX1dJTkNPTCh3cCksIChpbnQpV19XSURUSCh3cCksCisJCQkJCQkgICAgIChpbnQpV19XSURUSCh3cCksIEZBTFNFKTsKKworICAgIC8qCisgICAgICogVXBkYXRlIHdfY2xpbmVfaGVpZ2h0IGFuZCB3X2NsaW5lX2ZvbGRlZCBpZiB0aGUgY3Vyc29yIGxpbmUgd2FzCisgICAgICogdXBkYXRlZCAoc2F2ZXMgYSBjYWxsIHRvIHBsaW5lcygpIGxhdGVyKS4KKyAgICAgKi8KKyAgICBpZiAod3AgPT0gY3Vyd2luCisJICAgICYmIGxudW0gPD0gY3Vyd2luLT53X2N1cnNvci5sbnVtCisJICAgICYmIGxudW1lID49IGN1cndpbi0+d19jdXJzb3IubG51bSkKKyAgICB7CisJY3Vyd2luLT53X2NsaW5lX3JvdyA9IHJvdzsKKwljdXJ3aW4tPndfY2xpbmVfaGVpZ2h0ID0gMTsKKwljdXJ3aW4tPndfY2xpbmVfZm9sZGVkID0gVFJVRTsKKwljdXJ3aW4tPndfdmFsaWQgfD0gKFZBTElEX0NIRUlHSFR8VkFMSURfQ1JPVyk7CisgICAgfQorfQorCisvKgorICogQ29weSAiYnVmW2xlbl0iIHRvIFNjcmVlbkxpbmVzWyJvZmYiXSBhbmQgc2V0IGF0dHJpYnV0ZXMgdG8gImF0dHIiLgorICovCisgICAgc3RhdGljIHZvaWQKK2NvcHlfdGV4dF9hdHRyKG9mZiwgYnVmLCBsZW4sIGF0dHIpCisgICAgaW50CQlvZmY7CisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlsZW47CisgICAgaW50CQlhdHRyOworeworICAgIG1jaF9tZW1tb3ZlKFNjcmVlbkxpbmVzICsgb2ZmLCBidWYsIChzaXplX3QpbGVuKTsKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChlbmNfdXRmOCkKKwl2aW1fbWVtc2V0KFNjcmVlbkxpbmVzVUMgKyBvZmYsIDAsIHNpemVvZih1OGNoYXJfVCkgKiAoc2l6ZV90KWxlbik7CisjIGVuZGlmCisgICAgdmltX21lbXNldChTY3JlZW5BdHRycyArIG9mZiwgYXR0ciwgKHNpemVfdClsZW4pOworfQorCisvKgorICogRmlsbCB0aGUgZm9sZGNvbHVtbiBhdCAicCIgZm9yIHdpbmRvdyAid3AiLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZpbGxfZm9sZGNvbHVtbihwLCB3cCwgY2xvc2VkLCBsbnVtKQorICAgIGNoYXJfdQkqcDsKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQljbG9zZWQ7CQkvKiBUUlVFIG9mIEZBTFNFICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIGN1cnJlbnQgbGluZSBudW1iZXIgKi8KK3sKKyAgICBpbnQJCWkgPSAwOworICAgIGludAkJbGV2ZWw7CisgICAgaW50CQlmaXJzdF9sZXZlbDsKKworICAgIC8qIEluaXQgdG8gYWxsIHNwYWNlcy4gKi8KKyAgICBjb3B5X3NwYWNlcyhwLCAoc2l6ZV90KXdwLT53X3BfZmRjKTsKKworICAgIGxldmVsID0gd2luX2ZvbGRpbmZvLmZpX2xldmVsOworICAgIGlmIChsZXZlbCA+IDApCisgICAgeworCS8qIElmIHRoZSBjb2x1bW4gaXMgdG9vIG5hcnJvdywgd2Ugc3RhcnQgYXQgdGhlIGxvd2VzdCBsZXZlbCB0aGF0CisJICogZml0cyBhbmQgdXNlIG51bWJlcnMgdG8gaW5kaWNhdGVkIHRoZSBkZXB0aC4gKi8KKwlmaXJzdF9sZXZlbCA9IGxldmVsIC0gd3AtPndfcF9mZGMgLSBjbG9zZWQgKyAyOworCWlmIChmaXJzdF9sZXZlbCA8IDEpCisJICAgIGZpcnN0X2xldmVsID0gMTsKKworCWZvciAoaSA9IDA7IGkgKyAxIDwgd3AtPndfcF9mZGM7ICsraSkKKwl7CisJICAgIGlmICh3aW5fZm9sZGluZm8uZmlfbG51bSA9PSBsbnVtCisJCQkgICAgICAmJiBmaXJzdF9sZXZlbCArIGkgPj0gd2luX2ZvbGRpbmZvLmZpX2xvd19sZXZlbCkKKwkJcFtpXSA9ICctJzsKKwkgICAgZWxzZSBpZiAoZmlyc3RfbGV2ZWwgPT0gMSkKKwkJcFtpXSA9ICd8JzsKKwkgICAgZWxzZSBpZiAoZmlyc3RfbGV2ZWwgKyBpIDw9IDkpCisJCXBbaV0gPSAnMCcgKyBmaXJzdF9sZXZlbCArIGk7CisJICAgIGVsc2UKKwkJcFtpXSA9ICc+JzsKKwkgICAgaWYgKGZpcnN0X2xldmVsICsgaSA9PSBsZXZlbCkKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoY2xvc2VkKQorCXBbaV0gPSAnKyc7Cit9CisjZW5kaWYgLyogRkVBVF9GT0xESU5HICovCisKKy8qCisgKiBEaXNwbGF5IGxpbmUgImxudW0iIG9mIHdpbmRvdyAnd3AnIG9uIHRoZSBzY3JlZW4uCisgKiBTdGFydCBhdCByb3cgInN0YXJ0cm93Iiwgc3RvcCB3aGVuICJlbmRyb3ciIGlzIHJlYWNoZWQuCisgKiB3cC0+d192aXJ0Y29sIG5lZWRzIHRvIGJlIHZhbGlkLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxhc3Qgcm93IHRoZSBsaW5lIG9jY3VwaWVzLgorICovCisgICAgc3RhdGljIGludAord2luX2xpbmUod3AsIGxudW0sIHN0YXJ0cm93LCBlbmRyb3cpCisgICAgd2luX1QJKndwOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlzdGFydHJvdzsKKyAgICBpbnQJCWVuZHJvdzsKK3sKKyAgICBpbnQJCWNvbDsJCQkvKiB2aXN1YWwgY29sdW1uIG9uIHNjcmVlbiAqLworICAgIHVuc2lnbmVkCW9mZjsJCQkvKiBvZmZzZXQgaW4gU2NyZWVuTGluZXMvU2NyZWVuQXR0cnMgKi8KKyAgICBpbnQJCWMgPSAwOwkJCS8qIGluaXQgZm9yIEdDQyAqLworICAgIGxvbmcJdmNvbCA9IDA7CQkvKiB2aXJ0dWFsIGNvbHVtbiAoZm9yIHRhYnMpICovCisgICAgbG9uZwl2Y29sX3ByZXYgPSAtMTsJCS8qICJ2Y29sIiBvZiBwcmV2aW91cyBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyX3UJKmxpbmU7CQkJLyogY3VycmVudCBsaW5lICovCisgICAgY2hhcl91CSpwdHI7CQkJLyogY3VycmVudCBwb3NpdGlvbiBpbiAibGluZSIgKi8KKyAgICBpbnQJCXJvdzsJCQkvKiByb3cgaW4gdGhlIHdpbmRvdywgZXhjbCB3X3dpbnJvdyAqLworICAgIGludAkJc2NyZWVuX3JvdzsJCS8qIHJvdyBvbiB0aGUgc2NyZWVuLCBpbmNsIHdfd2lucm93ICovCisKKyAgICBjaGFyX3UJZXh0cmFbMThdOwkJLyogIiVsZCIgYW5kICdmZGMnIG11c3QgZml0IGluIGhlcmUgKi8KKyAgICBpbnQJCW5fZXh0cmEgPSAwOwkJLyogbnVtYmVyIG9mIGV4dHJhIGNoYXJzICovCisgICAgY2hhcl91CSpwX2V4dHJhID0gTlVMTDsJLyogc3RyaW5nIG9mIGV4dHJhIGNoYXJzICovCisgICAgaW50CQljX2V4dHJhID0gTlVMOwkJLyogZXh0cmEgY2hhcnMsIGFsbCB0aGUgc2FtZSAqLworICAgIGludAkJZXh0cmFfYXR0ciA9IDA7CQkvKiBhdHRyaWJ1dGVzIHdoZW4gbl9leHRyYSAhPSAwICovCisgICAgc3RhdGljIGNoYXJfdSAqYXRfZW5kX3N0ciA9IChjaGFyX3UgKikiIjsgLyogdXNlZCBmb3IgcF9leHRyYSB3aGVuCisJCQkJCSAgIGRpc3BsYXlpbmcgbGNzX2VvbCBhdCBlbmQtb2YtbGluZSAqLworICAgIGludAkJbGNzX2VvbF9vbmUgPSBsY3NfZW9sOwkvKiBsY3NfZW9sIHVudGlsIGl0J3MgYmVlbiB1c2VkICovCisgICAgaW50CQlsY3NfcHJlY190b2RvID0gbGNzX3ByZWM7ICAgLyogbGNzX3ByZWMgdW50aWwgaXQncyBiZWVuIHVzZWQgKi8KKworICAgIC8qIHNhdmVkICJleHRyYSIgaXRlbXMgZm9yIHdoZW4gZHJhd19zdGF0ZSBiZWNvbWVzIFdMX0xJTkUgKGFnYWluKSAqLworICAgIGludAkJc2F2ZWRfbl9leHRyYSA9IDA7CisgICAgY2hhcl91CSpzYXZlZF9wX2V4dHJhID0gTlVMTDsKKyAgICBpbnQJCXNhdmVkX2NfZXh0cmEgPSAwOworICAgIGludAkJc2F2ZWRfY2hhcl9hdHRyID0gMDsKKworICAgIGludAkJbl9hdHRyID0gMDsJCS8qIGNoYXJzIHdpdGggc3BlY2lhbCBhdHRyICovCisgICAgaW50CQlzYXZlZF9hdHRyMiA9IDA7CS8qIGNoYXJfYXR0ciBzYXZlZCBmb3Igbl9hdHRyICovCisgICAgaW50CQluX2F0dHIzID0gMDsJCS8qIGNoYXJzIHdpdGggb3ZlcnJ1bGluZyBzcGVjaWFsIGF0dHIgKi8KKyAgICBpbnQJCXNhdmVkX2F0dHIzID0gMDsJLyogY2hhcl9hdHRyIHNhdmVkIGZvciBuX2F0dHIzICovCisKKyAgICBpbnQJCW5fc2tpcCA9IDA7CQkvKiBuciBvZiBjaGFycyB0byBza2lwIGZvciAnbm93cmFwJyAqLworCisgICAgaW50CQlmcm9tY29sLCB0b2NvbDsJCS8qIHN0YXJ0L2VuZCBvZiBpbnZlcnRpbmcgKi8KKyAgICBpbnQJCWZyb21jb2xfcHJldiA9IC0yOwkvKiBzdGFydCBvZiBpbnZlcnRpbmcgYWZ0ZXIgY3Vyc29yICovCisgICAgaW50CQlub2ludmN1ciA9IEZBTFNFOwkvKiBkb24ndCBpbnZlcnQgdGhlIGN1cnNvciAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgcG9zX1QJKnRvcCwgKmJvdDsKKyNlbmRpZgorICAgIHBvc19UCXBvczsKKyAgICBsb25nCXY7CisKKyAgICBpbnQJCWNoYXJfYXR0ciA9IDA7CQkvKiBhdHRyaWJ1dGVzIGZvciBuZXh0IGNoYXJhY3RlciAqLworICAgIGludAkJYXJlYV9oaWdobGlnaHRpbmcgPSBGQUxTRTsgLyogVmlzdWFsIG9yIGluY3NlYXJjaCBoaWdobGlnaHRpbmcKKwkJCQkJICAgICAgaW4gdGhpcyBsaW5lICovCisgICAgaW50CQlhdHRyID0gMDsJCS8qIGF0dHJpYnV0ZXMgZm9yIGFyZWEgaGlnaGxpZ2h0aW5nICovCisgICAgaW50CQlhcmVhX2F0dHIgPSAwOwkJLyogYXR0cmlidXRlcyBkZXNpcmVkIGJ5IGhpZ2hsaWdodGluZyAqLworICAgIGludAkJc2VhcmNoX2F0dHIgPSAwOwkvKiBhdHRyaWJ1dGVzIGRlc2lyZWQgYnkgJ2hsc2VhcmNoJyAqLworI2lmZGVmIEZFQVRfU1lOX0hMCisgICAgaW50CQlzeW50YXhfYXR0ciA9IDA7CS8qIGF0dHJpYnV0ZXMgZGVzaXJlZCBieSBzeW50YXggKi8KKyAgICBpbnQJCWhhc19zeW50YXggPSBGQUxTRTsJLyogdGhpcyBidWZmZXIgaGFzIHN5bnRheCBoaWdobC4gKi8KKyAgICBpbnQJCXNhdmVfZGlkX2Vtc2c7CisjZW5kaWYKKyAgICBpbnQJCWV4dHJhX2NoZWNrOwkJLyogaGFzIHN5bnRheCBvciBsaW5lYnJlYWsgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQltdWx0aV9hdHRyID0gMDsJCS8qIGF0dHJpYnV0ZXMgZGVzaXJlZCBieSBtdWx0aWJ5dGUgKi8KKyAgICBpbnQJCW1iX2wgPSAxOwkJLyogbXVsdGktYnl0ZSBieXRlIGxlbmd0aCAqLworICAgIGludAkJbWJfYyA9IDA7CQkvKiBkZWNvZGVkIG11bHRpLWJ5dGUgY2hhcmFjdGVyICovCisgICAgaW50CQltYl91dGY4ID0gRkFMU0U7CS8qIHNjcmVlbiBjaGFyIGlzIFVURi04IGNoYXIgKi8KKyAgICBpbnQJCXU4Y19jMSA9IDA7CQkvKiBmaXJzdCBjb21wb3NpbmcgVVRGLTggY2hhciAqLworICAgIGludAkJdThjX2MyID0gMDsJCS8qIHNlY29uZCBjb21wb3NpbmcgVVRGLTggY2hhciAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQlmaWxsZXJfbGluZXM7CQkvKiBuciBvZiBmaWxsZXIgbGluZXMgdG8gYmUgZHJhd24gKi8KKyAgICBpbnQJCWZpbGxlcl90b2RvOwkJLyogbnIgb2YgZmlsbGVyIGxpbmVzIHN0aWxsIHRvIGRvICsgMSAqLworICAgIGVudW0gaGxmX3ZhbHVlIGRpZmZfaGxmID0gKGVudW0gaGxmX3ZhbHVlKTA7IC8qIHR5cGUgb2YgZGlmZiBoaWdobGlnaHRpbmcgKi8KKyAgICBpbnQJCWNoYW5nZV9zdGFydCA9IE1BWENPTDsJLyogZmlyc3QgY29sIG9mIGNoYW5nZWQgYXJlYSAqLworICAgIGludAkJY2hhbmdlX2VuZCA9IC0xOwkvKiBsYXN0IGNvbCBvZiBjaGFuZ2VkIGFyZWEgKi8KKyNlbmRpZgorICAgIGNvbG5yX1QJdHJhaWxjb2wgPSBNQVhDT0w7CS8qIHN0YXJ0IG9mIHRyYWlsaW5nIHNwYWNlcyAqLworI2lmZGVmIEZFQVRfTElORUJSRUFLCisgICAgaW50CQluZWVkX3Nob3dicmVhayA9IEZBTFNFOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX1NJR05TKSB8fCAoZGVmaW5lZChGRUFUX1FVSUNLRklYKSAmJiBkZWZpbmVkKEZFQVRfV0lORE9XUykpCisjIGRlZmluZSBMSU5FX0FUVFIKKyAgICBpbnQJCWxpbmVfYXR0ciA9IDA7CQkvKiBhdHJyaWJ1dGUgZm9yIHRoZSB3aG9sZSBsaW5lICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIG1hdGNoX1QJKnNobDsJCQkvKiBwb2ludHMgdG8gc2VhcmNoX2hsIG9yIG1hdGNoX2hsICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0FSQUJJQworICAgIGludAkJcHJldl9jID0gMDsJCS8qIHByZXZpb3VzIEFyYWJpYyBjaGFyYWN0ZXIgKi8KKyAgICBpbnQJCXByZXZfYzEgPSAwOwkJLyogZmlyc3QgY29tcG9zaW5nIGNoYXIgZm9yIHByZXZfYyAqLworI2VuZGlmCisKKyAgICAvKiBkcmF3X3N0YXRlOiBpdGVtcyB0aGF0IGFyZSBkcmF3biBpbiBzZXF1ZW5jZTogKi8KKyNkZWZpbmUgV0xfU1RBUlQJMAkJLyogbm90aGluZyBkb25lIHlldCAqLworI2lmZGVmIEZFQVRfQ01EV0lOCisjIGRlZmluZSBXTF9DTURMSU5FCVdMX1NUQVJUICsgMQkvKiBjbWRsaW5lIHdpbmRvdyBjb2x1bW4gKi8KKyNlbHNlCisjIGRlZmluZSBXTF9DTURMSU5FCVdMX1NUQVJUCisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyMgZGVmaW5lIFdMX0ZPTEQJV0xfQ01ETElORSArIDEJLyogJ2ZvbGRjb2x1bW4nICovCisjZWxzZQorIyBkZWZpbmUgV0xfRk9MRAlXTF9DTURMSU5FCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NJR05TCisjIGRlZmluZSBXTF9TSUdOCVdMX0ZPTEQgKyAxCS8qIGNvbHVtbiBmb3Igc2lnbnMgKi8KKyNlbHNlCisjIGRlZmluZSBXTF9TSUdOCVdMX0ZPTEQJCS8qIGNvbHVtbiBmb3Igc2lnbnMgKi8KKyNlbmRpZgorI2RlZmluZSBXTF9OUgkJV0xfU0lHTiArIDEJLyogbGluZSBudW1iZXIgKi8KKyNpZiBkZWZpbmVkKEZFQVRfTElORUJSRUFLKSB8fCBkZWZpbmVkKEZFQVRfRElGRikKKyMgZGVmaW5lIFdMX1NCUgkJV0xfTlIgKyAxCS8qICdzaG93YnJlYWsnIG9yICdkaWZmJyAqLworI2Vsc2UKKyMgZGVmaW5lIFdMX1NCUgkJV0xfTlIKKyNlbmRpZgorI2RlZmluZSBXTF9MSU5FCQlXTF9TQlIgKyAxCS8qIHRleHQgaW4gdGhlIGxpbmUgKi8KKyAgICBpbnQJCWRyYXdfc3RhdGUgPSBXTF9TVEFSVDsJLyogd2hhdCB0byBkcmF3IG5leHQgKi8KKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyAgICBpbnQJCWZlZWRiYWNrX2NvbCA9IDA7CisgICAgaW50CQlmZWVkYmFja19vbGRfYXR0ciA9IC0xOworI2VuZGlmCisKKworICAgIGlmIChzdGFydHJvdyA+IGVuZHJvdykJCS8qIHBhc3QgdGhlIGVuZCBhbHJlYWR5ISAqLworCXJldHVybiBzdGFydHJvdzsKKworICAgIHJvdyA9IHN0YXJ0cm93OworICAgIHNjcmVlbl9yb3cgPSByb3cgKyBXX1dJTlJPVyh3cCk7CisKKyAgICAvKgorICAgICAqIFRvIHNwZWVkIHVwIHRoZSBsb29wIGJlbG93LCBzZXQgZXh0cmFfY2hlY2sgd2hlbiB0aGVyZSBpcyBsaW5lYnJlYWssCisgICAgICogdHJhaWxpbmcgd2hpdGUgc3BhY2UgYW5kL29yIHN5bnRheCBwcm9jZXNzaW5nIHRvIGJlIGRvbmUuCisgICAgICovCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICBleHRyYV9jaGVjayA9IHdwLT53X3BfbGJyOworI2Vsc2UKKyAgICBleHRyYV9jaGVjayA9IDA7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGlmIChzeW50YXhfcHJlc2VudCh3cC0+d19idWZmZXIpKQorICAgIHsKKwkvKiBQcmVwYXJlIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoaXMgbGluZS4gIFdoZW4gdGhlcmUgaXMgYW4KKwkgKiBlcnJvciwgc3RvcCBzeW50YXggaGlnaGxpZ2h0aW5nLiAqLworCXNhdmVfZGlkX2Vtc2cgPSBkaWRfZW1zZzsKKwlkaWRfZW1zZyA9IEZBTFNFOworCXN5bnRheF9zdGFydCh3cCwgbG51bSk7CisJaWYgKGRpZF9lbXNnKQorCSAgICBzeW50YXhfY2xlYXIod3AtPndfYnVmZmVyKTsKKwllbHNlCisJeworCSAgICBkaWRfZW1zZyA9IHNhdmVfZGlkX2Vtc2c7CisJICAgIGhhc19zeW50YXggPSBUUlVFOworCSAgICBleHRyYV9jaGVjayA9IFRSVUU7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBoYW5kbGUgdmlzdWFsIGFjdGl2ZSBpbiB0aGlzIHdpbmRvdworICAgICAqLworICAgIGZyb21jb2wgPSAtMTA7CisgICAgdG9jb2wgPSBNQVhDT0w7CisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICBpZiAoVklzdWFsX2FjdGl2ZSAmJiB3cC0+d19idWZmZXIgPT0gY3Vyd2luLT53X2J1ZmZlcikKKyAgICB7CisJCQkJCS8qIFZpc3VhbCBpcyBhZnRlciBjdXJ3aW4tPndfY3Vyc29yICovCisJaWYgKGx0b3JlcShjdXJ3aW4tPndfY3Vyc29yLCBWSXN1YWwpKQorCXsKKwkgICAgdG9wID0gJmN1cndpbi0+d19jdXJzb3I7CisJICAgIGJvdCA9ICZWSXN1YWw7CisJfQorCWVsc2UJCQkJLyogVmlzdWFsIGlzIGJlZm9yZSBjdXJ3aW4tPndfY3Vyc29yICovCisJeworCSAgICB0b3AgPSAmVklzdWFsOworCSAgICBib3QgPSAmY3Vyd2luLT53X2N1cnNvcjsKKwl9CisJaWYgKFZJc3VhbF9tb2RlID09IEN0cmxfVikJLyogYmxvY2sgbW9kZSAqLworCXsKKwkgICAgaWYgKGxudW0gPj0gdG9wLT5sbnVtICYmIGxudW0gPD0gYm90LT5sbnVtKQorCSAgICB7CisJCWZyb21jb2wgPSB3cC0+d19vbGRfY3Vyc29yX2Zjb2w7CisJCXRvY29sID0gd3AtPndfb2xkX2N1cnNvcl9sY29sOworCSAgICB9CisJfQorCWVsc2UJCQkJLyogbm9uLWJsb2NrIG1vZGUgKi8KKwl7CisJICAgIGlmIChsbnVtID4gdG9wLT5sbnVtICYmIGxudW0gPD0gYm90LT5sbnVtKQorCQlmcm9tY29sID0gMDsKKwkgICAgZWxzZSBpZiAobG51bSA9PSB0b3AtPmxudW0pCisJICAgIHsKKwkJaWYgKFZJc3VhbF9tb2RlID09ICdWJykJLyogbGluZXdpc2UgKi8KKwkJICAgIGZyb21jb2wgPSAwOworCQllbHNlCisJCXsKKwkJICAgIGdldHZ2Y29sKHdwLCB0b3AsIChjb2xucl9UICopJmZyb21jb2wsIE5VTEwsIE5VTEwpOworCQkgICAgaWYgKGdjaGFyX3Bvcyh0b3ApID09IE5VTCkKKwkJCXRvY29sID0gZnJvbWNvbCArIDE7CisJCX0KKwkgICAgfQorCSAgICBpZiAoVklzdWFsX21vZGUgIT0gJ1YnICYmIGxudW0gPT0gYm90LT5sbnVtKQorCSAgICB7CisJCWlmICgqcF9zZWwgPT0gJ2UnICYmIGJvdC0+Y29sID09IDAKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCQkmJiBib3QtPmNvbGFkZCA9PSAwCisjZW5kaWYKKwkJICAgKQorCQl7CisJCSAgICBmcm9tY29sID0gLTEwOworCQkgICAgdG9jb2wgPSBNQVhDT0w7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBwb3MgPSAqYm90OworCQkgICAgaWYgKCpwX3NlbCA9PSAnZScpCisJCQlnZXR2dmNvbCh3cCwgJnBvcywgKGNvbG5yX1QgKikmdG9jb2wsIE5VTEwsIE5VTEwpOworCQkgICAgZWxzZQorCQkgICAgeworCQkJZ2V0dnZjb2wod3AsICZwb3MsIE5VTEwsIE5VTEwsIChjb2xucl9UICopJnRvY29sKTsKKwkJCSsrdG9jb2w7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworI2lmbmRlZiBNU0RPUworCS8qIENoZWNrIGlmIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvciBzaG91bGQgbm90IGJlIGludmVydGVkICovCisJaWYgKCFoaWdobGlnaHRfbWF0Y2ggJiYgbG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0gJiYgd3AgPT0gY3Vyd2luCisjIGlmZGVmIEZFQVRfR1VJCisJCSYmICFndWkuaW5fdXNlCisjIGVuZGlmCisJCSkKKwkgICAgbm9pbnZjdXIgPSBUUlVFOworI2VuZGlmCisKKwkvKiBpZiBpbnZlcnRpbmcgaW4gdGhpcyBsaW5lIHNldCBhcmVhX2hpZ2hsaWdodGluZyAqLworCWlmIChmcm9tY29sID49IDApCisJeworCSAgICBhcmVhX2hpZ2hsaWdodGluZyA9IFRSVUU7CisJICAgIGF0dHIgPSBobF9hdHRyKEhMRl9WKTsKKyNpZiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKSAmJiBkZWZpbmVkKEZFQVRfWDExKQorCSAgICBpZiAoY2xpcF9zdGFyLmF2YWlsYWJsZSAmJiAhY2xpcF9zdGFyLm93bmVkICYmIGNsaXBfaXNhdXRvc2VsKCkpCisJCWF0dHIgPSBobF9hdHRyKEhMRl9WTkMpOworI2VuZGlmCisJfQorICAgIH0KKworICAgIC8qCisgICAgICogaGFuZGxlICdpbnNlYXJjaCcgYW5kICI6cy8vL2MiIGhpZ2hsaWdodGluZworICAgICAqLworICAgIGVsc2UKKyNlbmRpZiAvKiBGRUFUX1ZJU1VBTCAqLworCWlmIChoaWdobGlnaHRfbWF0Y2gKKwkgICAgJiYgd3AgPT0gY3Vyd2luCisJICAgICYmIGxudW0gPj0gY3Vyd2luLT53X2N1cnNvci5sbnVtCisJICAgICYmIGxudW0gPD0gY3Vyd2luLT53X2N1cnNvci5sbnVtICsgc2VhcmNoX21hdGNoX2xpbmVzKQorICAgIHsKKwlpZiAobG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIGdldHZjb2woY3Vyd2luLCAmKGN1cndpbi0+d19jdXJzb3IpLAorCQkJCQkgICAgIChjb2xucl9UICopJmZyb21jb2wsIE5VTEwsIE5VTEwpOworCWVsc2UKKwkgICAgZnJvbWNvbCA9IDA7CisJaWYgKGxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtICsgc2VhcmNoX21hdGNoX2xpbmVzKQorCXsKKwkgICAgcG9zLmxudW0gPSBsbnVtOworCSAgICBwb3MuY29sID0gc2VhcmNoX21hdGNoX2VuZGNvbDsKKwkgICAgZ2V0dmNvbChjdXJ3aW4sICZwb3MsIChjb2xucl9UICopJnRvY29sLCBOVUxMLCBOVUxMKTsKKwl9CisJZWxzZQorCSAgICB0b2NvbCA9IE1BWENPTDsKKwlpZiAoZnJvbWNvbCA9PSB0b2NvbCkJCS8qIGRvIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgKi8KKwkgICAgdG9jb2wgPSBmcm9tY29sICsgMTsJLyogaGFwcGVucyB3aGVuIHBhc3QgZW5kIG9mIGxpbmUgKi8KKwlhcmVhX2hpZ2hsaWdodGluZyA9IFRSVUU7CisJYXR0ciA9IGhsX2F0dHIoSExGX0kpOworICAgIH0KKworI2lmZGVmIEZFQVRfRElGRgorICAgIGZpbGxlcl9saW5lcyA9IGRpZmZfY2hlY2sod3AsIGxudW0pOworICAgIGlmIChmaWxsZXJfbGluZXMgPCAwKQorICAgIHsKKwlpZiAoZmlsbGVyX2xpbmVzID09IC0xKQorCXsKKwkgICAgaWYgKGRpZmZfZmluZF9jaGFuZ2Uod3AsIGxudW0sICZjaGFuZ2Vfc3RhcnQsICZjaGFuZ2VfZW5kKSkKKwkJZGlmZl9obGYgPSBITEZfQUREOwkvKiBhZGRlZCBsaW5lICovCisJICAgIGVsc2UgaWYgKGNoYW5nZV9zdGFydCA9PSAwKQorCQlkaWZmX2hsZiA9IEhMRl9UWEQ7CS8qIGNoYW5nZWQgdGV4dCAqLworCSAgICBlbHNlCisJCWRpZmZfaGxmID0gSExGX0NIRDsJLyogY2hhbmdlZCBsaW5lICovCisJfQorCWVsc2UKKwkgICAgZGlmZl9obGYgPSBITEZfQUREOwkJLyogYWRkZWQgbGluZSAqLworCWZpbGxlcl9saW5lcyA9IDA7CisJYXJlYV9oaWdobGlnaHRpbmcgPSBUUlVFOworICAgIH0KKyAgICBpZiAobG51bSA9PSB3cC0+d190b3BsaW5lKQorCWZpbGxlcl9saW5lcyA9IHdwLT53X3RvcGZpbGw7CisgICAgZmlsbGVyX3RvZG8gPSBmaWxsZXJfbGluZXM7CisjZW5kaWYKKworI2lmZGVmIExJTkVfQVRUUgorIyBpZmRlZiBGRUFUX1NJR05TCisgICAgLyogSWYgdGhpcyBsaW5lIGhhcyBhIHNpZ24gd2l0aCBsaW5lIGhpZ2hsaWdodGluZyBzZXQgbGluZV9hdHRyLiAqLworICAgIHYgPSBidWZfZ2V0c2lnbnR5cGUod3AtPndfYnVmZmVyLCBsbnVtLCBTSUdOX0xJTkVITCk7CisgICAgaWYgKHYgIT0gMCkKKwlsaW5lX2F0dHIgPSBzaWduX2dldF9hdHRyKChpbnQpdiwgVFJVRSk7CisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisgICAgLyogSGlnaGxpZ2h0IHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIHF1aWNrZml4IHdpbmRvdy4gKi8KKyAgICBpZiAoYnRfcXVpY2tmaXgod3AtPndfYnVmZmVyKSAmJiBxZl9jdXJyZW50X2VudHJ5KCkgPT0gbG51bSkKKwlsaW5lX2F0dHIgPSBobF9hdHRyKEhMRl9MKTsKKyMgZW5kaWYKKyAgICBpZiAobGluZV9hdHRyICE9IDApCisJYXJlYV9oaWdobGlnaHRpbmcgPSBUUlVFOworI2VuZGlmCisKKyAgICBsaW5lID0gbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW0sIEZBTFNFKTsKKyAgICBwdHIgPSBsaW5lOworCisgICAgLyogZmluZCBzdGFydCBvZiB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisgICAgaWYgKHdwLT53X3BfbGlzdCAmJiBsY3NfdHJhaWwpCisgICAgeworCXRyYWlsY29sID0gKGNvbG5yX1QpU1RSTEVOKHB0cik7CisJd2hpbGUgKHRyYWlsY29sID4gKGNvbG5yX1QpMCAmJiB2aW1faXN3aGl0ZShwdHJbdHJhaWxjb2wgLSAxXSkpCisJICAgIC0tdHJhaWxjb2w7CisJdHJhaWxjb2wgKz0gKGNvbG5yX1QpIChwdHIgLSBsaW5lKTsKKwlleHRyYV9jaGVjayA9IFRSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAnbm93cmFwJyBvciAnd3JhcCcgYW5kIGEgc2luZ2xlIGxpbmUgdGhhdCBkb2Vzbid0IGZpdDogQWR2YW5jZSB0byB0aGUKKyAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIGlmICh3cC0+d19wX3dyYXApCisJdiA9IHdwLT53X3NraXBjb2w7CisgICAgZWxzZQorCXYgPSB3cC0+d19sZWZ0Y29sOworICAgIGlmICh2ID4gMCkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWNoYXJfdQkqcHJldl9wdHIgPSBwdHI7CisjZW5kaWYKKwl3aGlsZSAodmNvbCA8IHYgJiYgKnB0ciAhPSBOVUwpCisJeworCSAgICBjID0gd2luX2xicl9jaGFydGFic2l6ZSh3cCwgcHRyLCAoY29sbnJfVCl2Y29sLCBOVUxMKTsKKwkgICAgdmNvbCArPSBjOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgcHJldl9wdHIgPSBwdHI7CisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXB0ciArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cik7CisJICAgIGVsc2UKKyNlbmRpZgorCQkrK3B0cjsKKwl9CisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJLyogV2hlbiAndmlydHVhbGVkaXQnIGlzIHNldCB0aGUgZW5kIG9mIHRoZSBsaW5lIG1heSBiZSBiZWZvcmUgdGhlCisJICogc3RhcnQgb2YgdGhlIGRpc3BsYXllZCBwYXJ0LiAqLworCWlmICh2Y29sIDwgdiAmJiAqcHRyID09IE5VTCAmJiB2aXJ0dWFsX2FjdGl2ZSgpKQorCSAgICB2Y29sID0gdjsKKyNlbmRpZgorCisJLyogSGFuZGxlIGEgY2hhcmFjdGVyIHRoYXQncyBub3QgY29tcGxldGVseSBvbiB0aGUgc2NyZWVuOiBQdXQgcHRyIGF0CisJICogdGhhdCBjaGFyYWN0ZXIgYnV0IHNraXAgdGhlIGZpcnN0IGZldyBzY3JlZW4gY2hhcmFjdGVycy4gKi8KKwlpZiAodmNvbCA+IHYpCisJeworCSAgICB2Y29sIC09IGM7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBwdHIgPSBwcmV2X3B0cjsKKyNlbHNlCisJICAgIC0tcHRyOworI2VuZGlmCisJICAgIG5fc2tpcCA9IHYgLSB2Y29sOworCX0KKworCS8qCisJICogQWRqdXN0IGZvciB3aGVuIHRoZSBpbnZlcnRlZCB0ZXh0IGlzIGJlZm9yZSB0aGUgc2NyZWVuLAorCSAqIGFuZCB3aGVuIHRoZSBzdGFydCBvZiB0aGUgaW52ZXJ0ZWQgdGV4dCBpcyBiZWZvcmUgdGhlIHNjcmVlbi4KKwkgKi8KKwlpZiAodG9jb2wgPD0gdmNvbCkKKwkgICAgZnJvbWNvbCA9IDA7CisJZWxzZSBpZiAoZnJvbWNvbCA+PSAwICYmIGZyb21jb2wgPCB2Y29sKQorCSAgICBmcm9tY29sID0gdmNvbDsKKworI2lmZGVmIEZFQVRfTElORUJSRUFLCisJLyogV2hlbiB3X3NraXBjb2wgaXMgbm9uLXplcm8sIGZpcnN0IGxpbmUgbmVlZHMgJ3Nob3dicmVhaycgKi8KKwlpZiAod3AtPndfcF93cmFwKQorCSAgICBuZWVkX3Nob3dicmVhayA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcnJlY3QgaGlnaGxpZ2h0aW5nIGZvciBjdXJzb3IgdGhhdCBjYW4ndCBiZSBkaXNhYmxlZC4KKyAgICAgKiBBdm9pZHMgaGF2aW5nIHRvIGNoZWNrIHRoaXMgZm9yIGVhY2ggY2hhcmFjdGVyLgorICAgICAqLworICAgIGlmIChmcm9tY29sID49IDApCisgICAgeworCWlmIChub2ludmN1cikKKwl7CisJICAgIGlmICgoY29sbnJfVClmcm9tY29sID09IHdwLT53X3ZpcnRjb2wpCisJICAgIHsKKwkJLyogaGlnaGxpZ2h0aW5nIHN0YXJ0cyBhdCBjdXJzb3IsIGxldCBpdCBzdGFydCBqdXN0IGFmdGVyIHRoZQorCQkgKiBjdXJzb3IgKi8KKwkJZnJvbWNvbF9wcmV2ID0gZnJvbWNvbDsKKwkJZnJvbWNvbCA9IC0xOworCSAgICB9CisJICAgIGVsc2UgaWYgKChjb2xucl9UKWZyb21jb2wgPCB3cC0+d192aXJ0Y29sKQorCQkvKiByZXN0YXJ0IGhpZ2hsaWdodGluZyBhZnRlciB0aGUgY3Vyc29yICovCisJCWZyb21jb2xfcHJldiA9IHdwLT53X3ZpcnRjb2w7CisJfQorCWlmIChmcm9tY29sID49IHRvY29sKQorCSAgICBmcm9tY29sID0gLTE7CisgICAgfQorCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICAvKgorICAgICAqIEhhbmRsZSBoaWdobGlnaHRpbmcgdGhlIGxhc3QgdXNlZCBzZWFyY2ggcGF0dGVybi4KKyAgICAgKiBEbyB0aGlzIGZvciBib3RoIHNlYXJjaF9obCBhbmQgbWF0Y2hfaGwuCisgICAgICovCisgICAgc2hsID0gJnNlYXJjaF9obDsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlzaGwtPnN0YXJ0cCA9IE5VTEw7CisJc2hsLT5lbmRwID0gTlVMTDsKKwlzaGwtPmF0dHJfY3VyID0gMDsKKwlpZiAoc2hsLT5ybS5yZWdwcm9nICE9IE5VTEwpCisJeworCSAgICB2ID0gKGxvbmcpKHB0ciAtIGxpbmUpOworCSAgICBuZXh0X3NlYXJjaF9obCh3cCwgc2hsLCBsbnVtLCAoY29sbnJfVCl2KTsKKworCSAgICAvKiBOZWVkIHRvIGdldCB0aGUgbGluZSBhZ2FpbiwgYSBtdWx0aS1saW5lIHJlZ2V4cCBtYXkgaGF2ZSBtYWRlIGl0CisJICAgICAqIGludmFsaWQuICovCisJICAgIGxpbmUgPSBtbF9nZXRfYnVmKHdwLT53X2J1ZmZlciwgbG51bSwgRkFMU0UpOworCSAgICBwdHIgPSBsaW5lICsgdjsKKworCSAgICBpZiAoc2hsLT5sbnVtICE9IDAgJiYgc2hsLT5sbnVtIDw9IGxudW0pCisJICAgIHsKKwkJaWYgKHNobC0+bG51bSA9PSBsbnVtKQorCQkgICAgc2hsLT5zdGFydHAgPSBsaW5lICsgc2hsLT5ybS5zdGFydHBvc1swXS5jb2w7CisJCWVsc2UKKwkJICAgIHNobC0+c3RhcnRwID0gbGluZTsKKwkJaWYgKGxudW0gPT0gc2hsLT5sbnVtICsgc2hsLT5ybS5lbmRwb3NbMF0ubG51bQorCQkJCQkJICAtIHNobC0+cm0uc3RhcnRwb3NbMF0ubG51bSkKKwkJICAgIHNobC0+ZW5kcCA9IGxpbmUgKyBzaGwtPnJtLmVuZHBvc1swXS5jb2w7CisJCWVsc2UKKwkJICAgIHNobC0+ZW5kcCA9IGxpbmUgKyBNQVhDT0w7CisJCS8qIEhpZ2hsaWdodCBvbmUgY2hhcmFjdGVyIGZvciBhbiBlbXB0eSBtYXRjaC4gKi8KKwkJaWYgKHNobC0+c3RhcnRwID09IHNobC0+ZW5kcCkKKwkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChoYXNfbWJ5dGUgJiYgKnNobC0+ZW5kcCAhPSBOVUwpCisJCQlzaGwtPmVuZHAgKz0gKCptYl9wdHIybGVuX2NoZWNrKShzaGwtPmVuZHApOworCQkgICAgZWxzZQorI2VuZGlmCisJCQkrK3NobC0+ZW5kcDsKKwkJfQorCQlpZiAoc2hsLT5zdGFydHAgPCBwdHIpICAvKiBtYXRjaCBhdCBsZWZ0Y29sICovCisJCXsKKwkJICAgIHNobC0+YXR0cl9jdXIgPSBzaGwtPmF0dHI7CisJCSAgICBzZWFyY2hfYXR0ciA9IHNobC0+YXR0cjsKKwkJfQorCQlhcmVhX2hpZ2hsaWdodGluZyA9IFRSVUU7CisJICAgIH0KKwl9CisJaWYgKHNobCA9PSAmbWF0Y2hfaGwpCisJICAgIGJyZWFrOworCXNobCA9ICZtYXRjaF9obDsKKyAgICB9CisjZW5kaWYKKworICAgIG9mZiA9ICh1bnNpZ25lZCkgKGN1cnJlbnRfU2NyZWVuTGluZSAtIFNjcmVlbkxpbmVzKTsKKyAgICBjb2wgPSAwOworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisgICAgaWYgKHdwLT53X3BfcmwpCisgICAgeworCS8qIFJpZ2h0bGVmdCB3aW5kb3c6IHByb2Nlc3MgdGhlIHRleHQgaW4gdGhlIG5vcm1hbCBkaXJlY3Rpb24sIGJ1dCBwdXQKKwkgKiBpdCBpbiBjdXJyZW50X1NjcmVlbkxpbmVbXSBmcm9tIHJpZ2h0IHRvIGxlZnQuICBTdGFydCBhdCB0aGUKKwkgKiByaWdodG1vc3QgY29sdW1uIG9mIHRoZSB3aW5kb3cuICovCisJY29sID0gV19XSURUSCh3cCkgLSAxOworCW9mZiArPSBjb2w7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIFJlcGVhdCBmb3IgdGhlIHdob2xlIGRpc3BsYXllZCBsaW5lLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCS8qIFNraXAgdGhpcyBxdWlja2x5IHdoZW4gd29ya2luZyBvbiB0aGUgdGV4dC4gKi8KKwlpZiAoZHJhd19zdGF0ZSAhPSBXTF9MSU5FKQorCXsKKyNpZmRlZiBGRUFUX0NNRFdJTgorCSAgICBpZiAoZHJhd19zdGF0ZSA9PSBXTF9DTURMSU5FIC0gMSAmJiBuX2V4dHJhID09IDApCisJICAgIHsKKwkJZHJhd19zdGF0ZSA9IFdMX0NNRExJTkU7CisJCWlmIChjbWR3aW5fdHlwZSAhPSAwICYmIHdwID09IGN1cndpbikKKwkJeworCQkgICAgLyogRHJhdyB0aGUgY21kbGluZSBjaGFyYWN0ZXIuICovCisJCSAgICAqZXh0cmEgPSBjbWR3aW5fdHlwZTsKKwkJICAgIG5fZXh0cmEgPSAxOworCQkgICAgcF9leHRyYSA9IGV4dHJhOworCQkgICAgY19leHRyYSA9IE5VTDsKKwkJICAgIGNoYXJfYXR0ciA9IGhsX2F0dHIoSExGX0FUKTsKKwkJfQorCSAgICB9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoZHJhd19zdGF0ZSA9PSBXTF9GT0xEIC0gMSAmJiBuX2V4dHJhID09IDApCisJICAgIHsKKwkJZHJhd19zdGF0ZSA9IFdMX0ZPTEQ7CisJCWlmICh3cC0+d19wX2ZkYyA+IDApCisJCXsKKwkJICAgIC8qIERyYXcgdGhlICdmb2xkY29sdW1uJy4gKi8KKwkJICAgIGZpbGxfZm9sZGNvbHVtbihleHRyYSwgd3AsIEZBTFNFLCBsbnVtKTsKKwkJICAgIG5fZXh0cmEgPSB3cC0+d19wX2ZkYzsKKwkJICAgIHBfZXh0cmEgPSBleHRyYTsKKwkJICAgIGNfZXh0cmEgPSBOVUw7CisJCSAgICBjaGFyX2F0dHIgPSBobF9hdHRyKEhMRl9GQyk7CisJCX0KKwkgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NJR05TCisJICAgIGlmIChkcmF3X3N0YXRlID09IFdMX1NJR04gLSAxICYmIG5fZXh0cmEgPT0gMCkKKwkgICAgeworCQlkcmF3X3N0YXRlID0gV0xfU0lHTjsKKwkJLyogU2hvdyB0aGUgc2lnbiBjb2x1bW4gd2hlbiB0aGVyZSBhcmUgYW55IHNpZ25zIGluIHRoaXMKKwkJICogYnVmZmVyIG9yIHdoZW4gdXNpbmcgTmV0YmVhbnMuICovCisJCWlmIChkcmF3X3NpZ25jb2x1bW4od3ApCisjIGlmZGVmIEZFQVRfRElGRgorCQkJJiYgZmlsbGVyX3RvZG8gPD0gMAorIyBlbmRpZgorCQkgICApCisJCXsKKwkJICAgIGludF91CXRleHRfc2lnbjsKKyMgaWZkZWYgRkVBVF9TSUdOX0lDT05TCisJCSAgICBpbnRfdQlpY29uX3NpZ247CisjIGVuZGlmCisKKwkJICAgIC8qIERyYXcgdHdvIGNlbGxzIHdpdGggdGhlIHNpZ24gdmFsdWUgb3IgYmxhbmsuICovCisJCSAgICBjX2V4dHJhID0gJyAnOworCQkgICAgY2hhcl9hdHRyID0gaGxfYXR0cihITEZfU0MpOworCQkgICAgbl9leHRyYSA9IDI7CisKKwkJICAgIGlmIChyb3cgPT0gc3RhcnRyb3cpCisJCSAgICB7CisJCQl0ZXh0X3NpZ24gPSBidWZfZ2V0c2lnbnR5cGUod3AtPndfYnVmZmVyLCBsbnVtLAorCQkJCQkJCQkgICBTSUdOX1RFWFQpOworIyBpZmRlZiBGRUFUX1NJR05fSUNPTlMKKwkJCWljb25fc2lnbiA9IGJ1Zl9nZXRzaWdudHlwZSh3cC0+d19idWZmZXIsIGxudW0sCisJCQkJCQkJCSAgIFNJR05fSUNPTik7CisJCQlpZiAoZ3VpLmluX3VzZSAmJiBpY29uX3NpZ24gIT0gMCkKKwkJCXsKKwkJCSAgICAvKiBVc2UgdGhlIGltYWdlIGluIHRoaXMgcG9zaXRpb24uICovCisJCQkgICAgY19leHRyYSA9IFNJR05fQllURTsKKyMgIGlmZGVmIEZFQVRfTkVUQkVBTlNfSU5URworCQkJICAgIGlmIChidWZfc2lnbmNvdW50KHdwLT53X2J1ZmZlciwgbG51bSkgPiAxKQorCQkJCWNfZXh0cmEgPSBNVUxUSVNJR05fQllURTsKKyMgIGVuZGlmCisJCQkgICAgY2hhcl9hdHRyID0gaWNvbl9zaWduOworCQkJfQorCQkJZWxzZQorIyBlbmRpZgorCQkJICAgIGlmICh0ZXh0X3NpZ24gIT0gMCkKKwkJCXsKKwkJCSAgICBwX2V4dHJhID0gc2lnbl9nZXRfdGV4dCh0ZXh0X3NpZ24pOworCQkJICAgIGlmIChwX2V4dHJhICE9IE5VTEwpCisJCQkgICAgeworCQkJCWNfZXh0cmEgPSBOVUw7CisJCQkJbl9leHRyYSA9IFNUUkxFTihwX2V4dHJhKTsKKwkJCSAgICB9CisJCQkgICAgY2hhcl9hdHRyID0gc2lnbl9nZXRfYXR0cih0ZXh0X3NpZ24sIEZBTFNFKTsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYKKworCSAgICBpZiAoZHJhd19zdGF0ZSA9PSBXTF9OUiAtIDEgJiYgbl9leHRyYSA9PSAwKQorCSAgICB7CisJCWRyYXdfc3RhdGUgPSBXTF9OUjsKKwkJLyogRGlzcGxheSB0aGUgbGluZSBudW1iZXIuICBBZnRlciB0aGUgZmlyc3QgZmlsbCB3aXRoIGJsYW5rcworCQkgKiB3aGVuIHRoZSAnbicgZmxhZyBpc24ndCBpbiAnY3BvJyAqLworCQlpZiAod3AtPndfcF9udQorCQkJJiYgKHJvdyA9PSBzdGFydHJvdworI2lmZGVmIEZFQVRfRElGRgorCQkJICAgICsgZmlsbGVyX2xpbmVzCisjZW5kaWYKKwkJCSAgICB8fCB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fTlVNQ09MKSA9PSBOVUxMKSkKKwkJeworCQkgICAgLyogRHJhdyB0aGUgbGluZSBudW1iZXIgKGVtcHR5IHNwYWNlIGFmdGVyIHdyYXBwaW5nKS4gKi8KKwkJICAgIGlmIChyb3cgPT0gc3RhcnRyb3cKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCSAgICArIGZpbGxlcl9saW5lcworI2VuZGlmCisJCQkgICAgKQorCQkgICAgeworCQkJc3ByaW50ZigoY2hhciAqKWV4dHJhLCAiJTdsZCAiLCAobG9uZylsbnVtKTsKKwkJCWlmICh3cC0+d19za2lwY29sID4gMCkKKwkJCSAgICBmb3IgKHBfZXh0cmEgPSBleHRyYTsgKnBfZXh0cmEgPT0gJyAnOyArK3BfZXh0cmEpCisJCQkJKnBfZXh0cmEgPSAnLSc7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJCWlmICh3cC0+d19wX3JsKQkJICAgIC8qIHJldmVyc2UgbGluZSBudW1iZXJzICovCisJCQkgICAgcmxfbWlycm9yKGV4dHJhKTsKKyNlbmRpZgorCQkJcF9leHRyYSA9IGV4dHJhOworCQkJY19leHRyYSA9IE5VTDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCWNfZXh0cmEgPSAnICc7CisJCSAgICBuX2V4dHJhID0gODsKKwkJICAgIGNoYXJfYXR0ciA9IGhsX2F0dHIoSExGX04pOworCQl9CisJICAgIH0KKworI2lmIGRlZmluZWQoRkVBVF9MSU5FQlJFQUspIHx8IGRlZmluZWQoRkVBVF9ESUZGKQorCSAgICBpZiAoZHJhd19zdGF0ZSA9PSBXTF9TQlIgLSAxICYmIG5fZXh0cmEgPT0gMCkKKwkgICAgeworCQlkcmF3X3N0YXRlID0gV0xfU0JSOworIyBpZmRlZiBGRUFUX0RJRkYKKwkJaWYgKGZpbGxlcl90b2RvID4gMCkKKwkJeworCQkgICAgLyogRHJhdyAiZGVsZXRlZCIgZGlmZiBsaW5lKHMpLiAqLworCQkgICAgaWYgKGNoYXIyY2VsbHMoZmlsbF9kaWZmKSA+IDEpCisJCQljX2V4dHJhID0gJy0nOworCQkgICAgZWxzZQorCQkJY19leHRyYSA9IGZpbGxfZGlmZjsKKyMgIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCSAgICBpZiAod3AtPndfcF9ybCkKKwkJCW5fZXh0cmEgPSBjb2wgKyAxOworCQkgICAgZWxzZQorIyAgZW5kaWYKKwkJCW5fZXh0cmEgPSBXX1dJRFRIKHdwKSAtIGNvbDsKKwkJICAgIGNoYXJfYXR0ciA9IGhsX2F0dHIoSExGX0RFRCk7CisJCX0KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkJaWYgKCpwX3NiciAhPSBOVUwgJiYgbmVlZF9zaG93YnJlYWspCisJCXsKKwkJICAgIC8qIERyYXcgJ3Nob3dicmVhaycgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYnJva2VuIGxpbmUuICovCisJCSAgICBwX2V4dHJhID0gcF9zYnI7CisJCSAgICBjX2V4dHJhID0gTlVMOworCQkgICAgbl9leHRyYSA9IChpbnQpU1RSTEVOKHBfc2JyKTsKKwkJICAgIGNoYXJfYXR0ciA9IGhsX2F0dHIoSExGX0FUKTsKKwkJICAgIG5lZWRfc2hvd2JyZWFrID0gRkFMU0U7CisJCSAgICAvKiBDb3JyZWN0IGVuZCBvZiBoaWdobGlnaHRlZCBhcmVhIGZvciAnc2hvd2JyZWFrJywKKwkJICAgICAqIHJlcXVpcmVkIHdoZW4gJ2xpbmVicmVhaycgaXMgYWxzbyBzZXQuICovCisJCSAgICBpZiAodG9jb2wgPT0gdmNvbCkKKwkJCXRvY29sICs9IG5fZXh0cmE7CisJCX0KKyMgZW5kaWYKKwkgICAgfQorI2VuZGlmCisKKwkgICAgaWYgKGRyYXdfc3RhdGUgPT0gV0xfTElORSAtIDEgJiYgbl9leHRyYSA9PSAwKQorCSAgICB7CisJCWRyYXdfc3RhdGUgPSBXTF9MSU5FOworCQlpZiAoc2F2ZWRfbl9leHRyYSkKKwkJeworCQkgICAgLyogQ29udGludWUgaXRlbSBmcm9tIGVuZCBvZiB3cmFwcGVkIGxpbmUuICovCisJCSAgICBuX2V4dHJhID0gc2F2ZWRfbl9leHRyYTsKKwkJICAgIGNfZXh0cmEgPSBzYXZlZF9jX2V4dHJhOworCQkgICAgcF9leHRyYSA9IHNhdmVkX3BfZXh0cmE7CisJCSAgICBjaGFyX2F0dHIgPSBzYXZlZF9jaGFyX2F0dHI7CisJCX0KKwkJZWxzZQorCQkgICAgY2hhcl9hdHRyID0gMDsKKwkgICAgfQorCX0KKworCS8qIFdoZW4gc3RpbGwgZGlzcGxheWluZyAnJCcgb2YgY2hhbmdlIGNvbW1hbmQsIHN0b3AgYXQgY3Vyc29yICovCisJaWYgKGRvbGxhcl92Y29sICE9IDAgJiYgd3AgPT0gY3Vyd2luICYmIHZjb2wgPj0gKGxvbmcpd3AtPndfdmlydGNvbAorI2lmZGVmIEZFQVRfRElGRgorCQkJCSAgICYmIGZpbGxlcl90b2RvIDw9IDAKKyNlbmRpZgorCQkpCisJeworCSAgICBTQ1JFRU5fTElORShzY3JlZW5fcm93LCBXX1dJTkNPTCh3cCksIGNvbCwgLShpbnQpV19XSURUSCh3cCksCisJCQkJCQkJCSAgd3AtPndfcF9ybCk7CisJICAgIC8qIFByZXRlbmQgd2UgaGF2ZSBmaW5pc2hlZCB1cGRhdGluZyB0aGUgd2luZG93LiAqLworCSAgICByb3cgPSB3cC0+d19oZWlnaHQ7CisJICAgIGJyZWFrOworCX0KKworCWlmIChkcmF3X3N0YXRlID09IFdMX0xJTkUgJiYgYXJlYV9oaWdobGlnaHRpbmcpCisJeworCSAgICAvKiBoYW5kbGUgVmlzdWFsIG9yIG1hdGNoIGhpZ2hsaWdodGluZyBpbiB0aGlzIGxpbmUgKi8KKwkgICAgaWYgKHZjb2wgPT0gZnJvbWNvbAorI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIHx8IChoYXNfbWJ5dGUgJiYgdmNvbCArIDEgPT0gZnJvbWNvbCAmJiBuX2V4dHJhID09IDAKKwkJCSYmICgqbWJfcHRyMmNlbGxzKShwdHIpID4gMSkKKyNlbmRpZgorCQkgICAgfHwgKChpbnQpdmNvbF9wcmV2ID09IGZyb21jb2xfcHJldgorCQkJJiYgdmNvbCA8IHRvY29sKSkKKwkJYXJlYV9hdHRyID0gYXR0cjsJCS8qIHN0YXJ0IGhpZ2hsaWdodGluZyAqLworCSAgICBlbHNlIGlmIChhcmVhX2F0dHIgIT0gMAorCQkgICAgJiYgKHZjb2wgPT0gdG9jb2wKKwkJCXx8IChub2ludmN1ciAmJiAoY29sbnJfVCl2Y29sID09IHdwLT53X3ZpcnRjb2wpKSkKKyNpZmRlZiBMSU5FX0FUVFIKKwkJYXJlYV9hdHRyID0gbGluZV9hdHRyOwkJLyogc3RvcCBoaWdobGlnaHRpbmcgKi8KKwkgICAgZWxzZSBpZiAobGluZV9hdHRyICYmICgoZnJvbWNvbCA9PSAtMTAgJiYgdG9jb2wgPT0gTUFYQ09MKQorCQkJCQkgfHwgKHZjb2wgPCBmcm9tY29sIHx8IHZjb2wgPiB0b2NvbCkpKQorCQlhcmVhX2F0dHIgPSBsaW5lX2F0dHI7CisjZWxzZQorCQlhcmVhX2F0dHIgPSAwOwkJCS8qIHN0b3AgaGlnaGxpZ2h0aW5nICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJICAgIGlmICghbl9leHRyYSkKKwkgICAgeworCQkvKgorCQkgKiBDaGVjayBmb3Igc3RhcnQvZW5kIG9mIHNlYXJjaCBwYXR0ZXJuIG1hdGNoLgorCQkgKiBBZnRlciBlbmQsIGNoZWNrIGZvciBzdGFydC9lbmQgb2YgbmV4dCBtYXRjaC4KKwkJICogV2hlbiBhbm90aGVyIG1hdGNoLCBoYXZlIHRvIGNoZWNrIGZvciBzdGFydCBhZ2Fpbi4KKwkJICogV2F0Y2ggb3V0IGZvciBtYXRjaGluZyBhbiBlbXB0eSBzdHJpbmchCisJCSAqIERvIHRoaXMgZmlyc3QgZm9yIHNlYXJjaF9obCwgdGhlbiBmb3IgbWF0Y2hfaGwsIHNvIHRoYXQKKwkJICogIjptYXRjaCIgb3ZlcnJ1bGVzICdobHNlYXJjaCcuCisJCSAqLworCQlzaGwgPSAmc2VhcmNoX2hsOworCQlmb3IgKDs7KQorCQl7CisJCSAgICB3aGlsZSAoc2hsLT5ybS5yZWdwcm9nICE9IE5VTEwpCisJCSAgICB7CisJCQlpZiAoc2hsLT5zdGFydHAgIT0gTlVMTAorCQkJCSYmIHB0ciA+PSBzaGwtPnN0YXJ0cAorCQkJCSYmIHB0ciA8IHNobC0+ZW5kcCkKKwkJCXsKKwkJCSAgICBzaGwtPmF0dHJfY3VyID0gc2hsLT5hdHRyOworCQkJfQorCQkJZWxzZSBpZiAocHRyID09IHNobC0+ZW5kcCkKKwkJCXsKKwkJCSAgICBzaGwtPmF0dHJfY3VyID0gMDsKKworCQkJICAgIHYgPSAobG9uZykocHRyIC0gbGluZSk7CisJCQkgICAgbmV4dF9zZWFyY2hfaGwod3AsIHNobCwgbG51bSwgKGNvbG5yX1Qpdik7CisKKwkJCSAgICAvKiBOZWVkIHRvIGdldCB0aGUgbGluZSBhZ2FpbiwgYSBtdWx0aS1saW5lIHJlZ2V4cAorCQkJICAgICAqIG1heSBoYXZlIG1hZGUgaXQgaW52YWxpZC4gKi8KKwkJCSAgICBsaW5lID0gbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIGxudW0sIEZBTFNFKTsKKwkJCSAgICBwdHIgPSBsaW5lICsgdjsKKworCQkJICAgIGlmIChzaGwtPmxudW0gPT0gbG51bSkKKwkJCSAgICB7CisJCQkJc2hsLT5zdGFydHAgPSBsaW5lICsgc2hsLT5ybS5zdGFydHBvc1swXS5jb2w7CisJCQkJaWYgKHNobC0+cm0uZW5kcG9zWzBdLmxudW0gPT0gMCkKKwkJCQkgICAgc2hsLT5lbmRwID0gbGluZSArIHNobC0+cm0uZW5kcG9zWzBdLmNvbDsKKwkJCQllbHNlCisJCQkJICAgIHNobC0+ZW5kcCA9IGxpbmUgKyBNQVhDT0w7CisKKwkJCQlpZiAoc2hsLT5zdGFydHAgPT0gc2hsLT5lbmRwKQorCQkJCXsKKwkJCQkgICAgLyogaGlnaGxpZ2h0IGVtcHR5IG1hdGNoLCB0cnkgYWdhaW4gYWZ0ZXIKKwkJCQkgICAgICogaXQgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJCQkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQkJCXNobC0+ZW5kcCArPQorCQkJCQkgICAgICAgKCptYl9wdHIybGVuX2NoZWNrKShzaGwtPmVuZHApOworCQkJCSAgICBlbHNlCisjZW5kaWYKKwkJCQkJKytzaGwtPmVuZHA7CisJCQkJfQorCisJCQkJLyogTG9vcCB0byBjaGVjayBpZiB0aGUgbWF0Y2ggc3RhcnRzIGF0IHRoZQorCQkJCSAqIGN1cnJlbnQgcG9zaXRpb24gKi8KKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQl9CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmIChzaGwgPT0gJm1hdGNoX2hsKQorCQkJYnJlYWs7CisJCSAgICBzaGwgPSAmbWF0Y2hfaGw7CisJCX0KKwkJLyogIjptYXRjaCIgaGlnaGxpZ2h0aW5nIG92ZXJydWxlcyAnaGxzZWFyY2gnICovCisJCWlmIChtYXRjaF9obC5hdHRyX2N1ciAhPSAwKQorCQkgICAgc2VhcmNoX2F0dHIgPSBtYXRjaF9obC5hdHRyX2N1cjsKKwkJZWxzZQorCQkgICAgc2VhcmNoX2F0dHIgPSBzZWFyY2hfaGwuYXR0cl9jdXI7CisJICAgIH0KKyNlbmRpZgorCisJICAgIGlmIChhcmVhX2F0dHIgIT0gMCkKKwkJY2hhcl9hdHRyID0gYXJlYV9hdHRyOworI2lmZGVmIEZFQVRfU1lOX0hMCisJICAgIGVsc2UgaWYgKHNlYXJjaF9hdHRyID09IDAgJiYgaGFzX3N5bnRheCkKKwkJY2hhcl9hdHRyID0gc3ludGF4X2F0dHI7CisjZW5kaWYKKwkgICAgZWxzZQorCQljaGFyX2F0dHIgPSBzZWFyY2hfYXR0cjsKKworI2lmZGVmIEZFQVRfRElGRgorCSAgICBpZiAoZGlmZl9obGYgIT0gKGVudW0gaGxmX3ZhbHVlKTAgJiYgbl9leHRyYSA9PSAwKQorCSAgICB7CisJCWlmIChkaWZmX2hsZiA9PSBITEZfQ0hEICYmIHB0ciAtIGxpbmUgPj0gY2hhbmdlX3N0YXJ0KQorCQkgICAgZGlmZl9obGYgPSBITEZfVFhEOwkJLyogY2hhbmdlZCB0ZXh0ICovCisJCWlmIChkaWZmX2hsZiA9PSBITEZfVFhEICYmIHB0ciAtIGxpbmUgPiBjaGFuZ2VfZW5kKQorCQkgICAgZGlmZl9obGYgPSBITEZfQ0hEOwkJLyogY2hhbmdlZCBsaW5lICovCisJCWlmIChhdHRyID09IDAgfHwgYXJlYV9hdHRyICE9IGF0dHIpCisJCSAgICBhcmVhX2F0dHIgPSBobF9hdHRyKGRpZmZfaGxmKTsKKwkJaWYgKGF0dHIgPT0gMCB8fCBjaGFyX2F0dHIgIT0gYXR0cikKKwkJeworCQkgICAgaWYgKHNlYXJjaF9hdHRyICE9IDApCisJCQljaGFyX2F0dHIgPSBzZWFyY2hfYXR0cjsKKwkJICAgIGVsc2UKKwkJCWNoYXJfYXR0ciA9IGhsX2F0dHIoZGlmZl9obGYpOworCQl9CisJICAgIH0KKyNlbmRpZgorCX0KKworCS8qCisJICogR2V0IHRoZSBuZXh0IGNoYXJhY3RlciB0byBwdXQgb24gdGhlIHNjcmVlbi4KKwkgKi8KKwkvKgorCSAqIFRoZSAnZXh0cmEnIGFycmF5IGNvbnRhaW5zIHRoZSBleHRyYSBzdHVmZiB0aGF0IGlzIGluc2VydGVkIHRvCisJICogcmVwcmVzZW50IHNwZWNpYWwgY2hhcmFjdGVycyAobm9uLXByaW50YWJsZSBzdHVmZikuICBXaGVuIGFsbAorCSAqIGNoYXJhY3RlcnMgYXJlIHRoZSBzYW1lLCBjX2V4dHJhIGlzIHVzZWQuCisJICogRm9yIHRoZSAnJCcgb2YgdGhlICdsaXN0JyBvcHRpb24sIG5fZXh0cmEgPT0gMSwgcF9leHRyYSA9PSAiIi4KKwkgKi8KKwlpZiAobl9leHRyYSA+IDApCisJeworCSAgICBpZiAoY19leHRyYSAhPSBOVUwpCisJICAgIHsKKwkJYyA9IGNfZXh0cmE7CisjaWZkZWYgRkVBVF9NQllURQorCQltYl9jID0gYzsJLyogZG9lc24ndCBoYW5kbGUgbm9uLXV0Zi04IG11bHRpLWJ5dGUhICovCisJCWlmIChlbmNfdXRmOCAmJiAoKm1iX2NoYXIybGVuKShjKSA+IDEpCisJCXsKKwkJICAgIG1iX3V0ZjggPSBUUlVFOworCQkgICAgdThjX2MxID0gdThjX2MyID0gMDsKKwkJfQorCQllbHNlCisJCSAgICBtYl91dGY4ID0gRkFMU0U7CisjZW5kaWYKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJYyA9ICpwX2V4dHJhOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJeworCQkgICAgbWJfYyA9IGM7CisJCSAgICBpZiAoZW5jX3V0ZjgpCisJCSAgICB7CisJCQkvKiBJZiB0aGUgVVRGLTggY2hhcmFjdGVyIGlzIG1vcmUgdGhhbiBvbmUgYnl0ZToKKwkJCSAqIERlY29kZSBpdCBpbnRvICJtYl9jIi4gKi8KKwkJCW1iX2wgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHBfZXh0cmEpOworCQkJbWJfdXRmOCA9IEZBTFNFOworCQkJaWYgKG1iX2wgPiBuX2V4dHJhKQorCQkJICAgIG1iX2wgPSAxOworCQkJZWxzZSBpZiAobWJfbCA+IDEpCisJCQl7CisJCQkgICAgbWJfYyA9IHV0ZmNfcHRyMmNoYXIocF9leHRyYSwgJnU4Y19jMSwgJnU4Y19jMik7CisJCQkgICAgbWJfdXRmOCA9IFRSVUU7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQkvKiBpZiB0aGlzIGlzIGEgREJDUyBjaGFyYWN0ZXIsIHB1dCBpdCBpbiAibWJfYyIgKi8KKwkJCW1iX2wgPSBNQl9CWVRFMkxFTihjKTsKKwkJCWlmIChtYl9sID49IG5fZXh0cmEpCisJCQkgICAgbWJfbCA9IDE7CisJCQllbHNlIGlmIChtYl9sID4gMSkKKwkJCSAgICBtYl9jID0gKGMgPDwgOCkgKyBwX2V4dHJhWzFdOworCQkgICAgfQorCQkgICAgLyogSWYgYSBkb3VibGUtd2lkdGggY2hhciBkb2Vzbid0IGZpdCBkaXNwbGF5IGEgJz4nIGluIHRoZQorCQkgICAgICogbGFzdCBjb2x1bW4uICovCisJCSAgICBpZiAoCisjIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCQkgICAgd3AtPndfcF9ybCA/IChjb2wgPD0gMCkgOgorIyBlbmRpZgorCQkJCSAgICAoY29sID49IFdfV0lEVEgod3ApIC0gMSkKKwkJCSAgICAmJiAoKm1iX2NoYXIyY2VsbHMpKG1iX2MpID09IDIpCisJCSAgICB7CisJCQljID0gJz4nOworCQkJbWJfYyA9IGM7CisJCQltYl9sID0gMTsKKwkJCW1iX3V0ZjggPSBGQUxTRTsKKwkJCW11bHRpX2F0dHIgPSBobF9hdHRyKEhMRl9BVCk7CisJCQkvKiBwdXQgdGhlIHBvaW50ZXIgYmFjayB0byBvdXRwdXQgdGhlIGRvdWJsZS13aWR0aAorCQkJICogY2hhcmFjdGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLiAqLworCQkJKytuX2V4dHJhOworCQkJLS1wX2V4dHJhOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJbl9leHRyYSAtPSBtYl9sIC0gMTsKKwkJCXBfZXh0cmEgKz0gbWJfbCAtIDE7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCQkrK3BfZXh0cmE7CisJICAgIH0KKwkgICAgLS1uX2V4dHJhOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBHZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgbGluZSBpdHNlbGYuCisJICAgICAqLworCSAgICBjID0gKnB0cjsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJbWJfYyA9IGM7CisJCWlmIChlbmNfdXRmOCkKKwkJeworCQkgICAgLyogSWYgdGhlIFVURi04IGNoYXJhY3RlciBpcyBtb3JlIHRoYW4gb25lIGJ5dGU6IERlY29kZSBpdAorCQkgICAgICogaW50byAibWJfYyIuICovCisJCSAgICBtYl9sID0gKCptYl9wdHIybGVuX2NoZWNrKShwdHIpOworCQkgICAgbWJfdXRmOCA9IEZBTFNFOworCQkgICAgaWYgKG1iX2wgPiAxKQorCQkgICAgeworCQkJbWJfYyA9IHV0ZmNfcHRyMmNoYXIocHRyLCAmdThjX2MxLCAmdThjX2MyKTsKKwkJCS8qIE92ZXJsb25nIGVuY29kZWQgQVNDSUkgb3IgQVNDSUkgd2l0aCBjb21wb3NpbmcgY2hhcgorCQkJICogaXMgZGlzcGxheWVkIG5vcm1hbGx5LCBleGNlcHQgYSBOVUwuICovCisJCQlpZiAobWJfYyA8IDB4ODApCisJCQkgICAgYyA9IG1iX2M7CisJCQltYl91dGY4ID0gVFJVRTsKKwkJICAgIH0KKworCQkgICAgaWYgKChtYl9sID09IDEgJiYgYyA+PSAweDgwKQorCQkJICAgIHx8IChtYl9sID49IDEgJiYgbWJfYyA9PSAwKQorCQkJICAgIHx8IChtYl9sID4gMSAmJiAoIXZpbV9pc3ByaW50YyhtYl9jKQorCQkJCQkJCSB8fCBtYl9jID49IDB4MTAwMDApKSkKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBJbGxlZ2FsIFVURi04IGJ5dGU6IGRpc3BsYXkgYXMgPHh4Pi4KKwkJCSAqIE5vbi1CTVAgY2hhcmFjdGVyIDogZGlzcGxheSBhcyA/IG9yIGZ1bGx3aWR0aCA/LgorCQkJICovCisJCQlpZiAobWJfYyA8IDB4MTAwMDApCisJCQl7CisJCQkgICAgdHJhbnNjaGFyX2hleChleHRyYSwgbWJfYyk7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJCSAgICBpZiAod3AtPndfcF9ybCkJCS8qIHJldmVyc2UgKi8KKwkJCQlybF9taXJyb3IoZXh0cmEpOworI2VuZGlmCisJCQl9CisJCQllbHNlIGlmICh1dGZfY2hhcjJjZWxscyhtYl9jKSAhPSAyKQorCQkJICAgIFNUUkNQWShleHRyYSwgIj8iKTsKKwkJCWVsc2UKKwkJCSAgICAvKiAweGZmMWYgaW4gVVRGLTg6IGZ1bGwtd2lkdGggJz8nICovCisJCQkgICAgU1RSQ1BZKGV4dHJhLCAiXDM1N1wyNzRcMjM3Iik7CisKKwkJCXBfZXh0cmEgPSBleHRyYTsKKwkJCWMgPSAqcF9leHRyYTsKKwkJCW1iX2MgPSBtYl9wdHIyY2hhcl9hZHYoJnBfZXh0cmEpOworCQkJbWJfdXRmOCA9IChjID49IDB4ODApOworCQkJbl9leHRyYSA9IChpbnQpU1RSTEVOKHBfZXh0cmEpOworCQkJY19leHRyYSA9IE5VTDsKKwkJCWlmIChhcmVhX2F0dHIgPT0gMCAmJiBzZWFyY2hfYXR0ciA9PSAwKQorCQkJeworCQkJICAgIG5fYXR0ciA9IG5fZXh0cmEgKyAxOworCQkJICAgIGV4dHJhX2F0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkJCSAgICBzYXZlZF9hdHRyMiA9IGNoYXJfYXR0cjsgLyogc2F2ZSBjdXJyZW50IGF0dHIgKi8KKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKG1iX2wgPT0gMCkgIC8qIGF0IHRoZSBOVUwgYXQgZW5kLW9mLWxpbmUgKi8KKwkJCW1iX2wgPSAxOworI2lmZGVmIEZFQVRfQVJBQklDCisJCSAgICBlbHNlIGlmIChwX2Fyc2hhcGUgJiYgIXBfdGJpZGkgJiYgQVJBQklDX0NIQVIobWJfYykpCisJCSAgICB7CisJCQkvKiBEbyBBcmFiaWMgc2hhcGluZy4gKi8KKwkJCWludAlwYywgcGMxLCBuYywgZHVtbXk7CisKKwkJCS8qIFRoZSBpZGVhIG9mIHdoYXQgaXMgdGhlIHByZXZpb3VzIGFuZCBuZXh0CisJCQkgKiBjaGFyYWN0ZXIgZGVwZW5kcyBvbiAncmlnaHRsZWZ0Jy4gKi8KKwkJCWlmICh3cC0+d19wX3JsKQorCQkJeworCQkJICAgIHBjID0gcHJldl9jOworCQkJICAgIHBjMSA9IHByZXZfYzE7CisJCQkgICAgbmMgPSB1dGZfcHRyMmNoYXIocHRyICsgbWJfbCk7CisJCQkgICAgcHJldl9jMSA9IHU4Y19jMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBwYyA9IHV0ZmNfcHRyMmNoYXIocHRyICsgbWJfbCwgJnBjMSwgJmR1bW15KTsKKwkJCSAgICBuYyA9IHByZXZfYzsKKwkJCX0KKwkJCXByZXZfYyA9IG1iX2M7CisKKwkJCW1iX2MgPSBhcmFiaWNfc2hhcGUobWJfYywgJmMsICZ1OGNfYzEsIHBjLCBwYzEsIG5jKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCXByZXZfYyA9IG1iX2M7CisjZW5kaWYKKwkJfQorCQllbHNlCS8qIGVuY19kYmNzICovCisJCXsKKwkJICAgIG1iX2wgPSBNQl9CWVRFMkxFTihjKTsKKwkJICAgIGlmIChtYl9sID09IDApICAvKiBhdCB0aGUgTlVMIGF0IGVuZC1vZi1saW5lICovCisJCQltYl9sID0gMTsKKwkJICAgIGVsc2UgaWYgKG1iX2wgPiAxKQorCQkgICAgeworCQkJLyogV2UgYXNzdW1lIGEgc2Vjb25kIGJ5dGUgYmVsb3cgMzIgaXMgaWxsZWdhbC4KKwkJCSAqIEhvcGVmdWxseSB0aGlzIGlzIE9LIGZvciBhbGwgZG91YmxlLWJ5dGUgZW5jb2RpbmdzIQorCQkJICovCisJCQlpZiAocHRyWzFdID49IDMyKQorCQkJICAgIG1iX2MgPSAoYyA8PCA4KSArIHB0clsxXTsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBpZiAocHRyWzFdID09IE5VTCkKKwkJCSAgICB7CisJCQkJLyogaGVhZCBieXRlIGF0IGVuZCBvZiBsaW5lICovCisJCQkJbWJfbCA9IDE7CisJCQkJdHJhbnNjaGFyX25vbnByaW50KGV4dHJhLCBjKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQkvKiBpbGxlZ2FsIHRhaWwgYnl0ZSAqLworCQkJCW1iX2wgPSAyOworCQkJCVNUUkNQWShleHRyYSwgIlhYIik7CisJCQkgICAgfQorCQkJICAgIHBfZXh0cmEgPSBleHRyYTsKKwkJCSAgICBuX2V4dHJhID0gKGludClTVFJMRU4oZXh0cmEpIC0gMTsKKwkJCSAgICBjX2V4dHJhID0gTlVMOworCQkJICAgIGMgPSAqcF9leHRyYSsrOworCQkJICAgIGlmIChhcmVhX2F0dHIgPT0gMCAmJiBzZWFyY2hfYXR0ciA9PSAwKQorCQkJICAgIHsKKwkJCQluX2F0dHIgPSBuX2V4dHJhICsgMTsKKwkJCQlleHRyYV9hdHRyID0gaGxfYXR0cihITEZfOCk7CisJCQkJc2F2ZWRfYXR0cjIgPSBjaGFyX2F0dHI7IC8qIHNhdmUgY3VycmVudCBhdHRyICovCisJCQkgICAgfQorCQkJICAgIG1iX2MgPSBjOworCQkJfQorCQkgICAgfQorCQl9CisJCS8qIElmIGEgZG91YmxlLXdpZHRoIGNoYXIgZG9lc24ndCBmaXQgZGlzcGxheSBhICc+JyBpbiB0aGUKKwkJICogbGFzdCBjb2x1bW47IHRoZSBjaGFyYWN0ZXIgaXMgZGlzcGxheWVkIGF0IHRoZSBzdGFydCBvZiB0aGUKKwkJICogbmV4dCBsaW5lLiAqLworCQlpZiAoKAorIyBpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIHdwLT53X3BfcmwgPyAoY29sIDw9IDApIDoKKyMgZW5kaWYKKwkJCQkoY29sID49IFdfV0lEVEgod3ApIC0gMSkpCisJCQkmJiAoKm1iX2NoYXIyY2VsbHMpKG1iX2MpID09IDIpCisJCXsKKwkJICAgIGMgPSAnPic7CisJCSAgICBtYl9jID0gYzsKKwkJICAgIG1iX3V0ZjggPSBGQUxTRTsKKwkJICAgIG1iX2wgPSAxOworCQkgICAgbXVsdGlfYXR0ciA9IGhsX2F0dHIoSExGX0FUKTsKKwkJICAgIC8qIFB1dCBwb2ludGVyIGJhY2sgc28gdGhhdCB0aGUgY2hhcmFjdGVyIHdpbGwgYmUKKwkJICAgICAqIGRpc3BsYXllZCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZS4gKi8KKwkJICAgIC0tcHRyOworCQl9CisJCWVsc2UgaWYgKCpwdHIgIT0gTlVMKQorCQkgICAgcHRyICs9IG1iX2wgLSAxOworCisJCS8qIElmIGEgZG91YmxlLXdpZHRoIGNoYXIgZG9lc24ndCBmaXQgYXQgdGhlIGxlZnQgc2lkZSBkaXNwbGF5CisJCSAqIGEgJzwnIGluIHRoZSBmaXJzdCBjb2x1bW4uICovCisJCWlmIChuX3NraXAgPiAwICYmIG1iX2wgPiAxKQorCQl7CisJCSAgICBleHRyYVswXSA9ICc8JzsKKwkJICAgIHBfZXh0cmEgPSBleHRyYTsKKwkJICAgIG5fZXh0cmEgPSAxOworCQkgICAgY19leHRyYSA9IE5VTDsKKwkJICAgIGMgPSAnICc7CisJCSAgICBpZiAoYXJlYV9hdHRyID09IDAgJiYgc2VhcmNoX2F0dHIgPT0gMCkKKwkJICAgIHsKKwkJCW5fYXR0ciA9IG5fZXh0cmEgKyAxOworCQkJZXh0cmFfYXR0ciA9IGhsX2F0dHIoSExGX0FUKTsKKwkJCXNhdmVkX2F0dHIyID0gY2hhcl9hdHRyOyAvKiBzYXZlIGN1cnJlbnQgYXR0ciAqLworCQkgICAgfQorCQkgICAgbWJfYyA9IGM7CisJCSAgICBtYl91dGY4ID0gRkFMU0U7CisJCSAgICBtYl9sID0gMTsKKwkJfQorCisJICAgIH0KKyNlbmRpZgorCSAgICArK3B0cjsKKworCSAgICBpZiAoZXh0cmFfY2hlY2spCisJICAgIHsKKyNpZmRlZiBGRUFUX1NZTl9ITAorCQkvKiBHZXQgc3ludGF4IGF0dHJpYnV0ZSwgdW5sZXNzIHN0aWxsIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZQorCQkgKiAoZG91YmxlLXdpZGUgY2hhciB0aGF0IGRvZXNuJ3QgZml0KS4gKi8KKwkJaWYgKGhhc19zeW50YXggJiYgKHYgPSAobG9uZykocHRyIC0gbGluZSkpID4gMCkKKwkJeworCQkgICAgLyogR2V0IHRoZSBzeW50YXggYXR0cmlidXRlIGZvciB0aGUgY2hhcmFjdGVyLiAgSWYgdGhlcmUKKwkJICAgICAqIGlzIGFuIGVycm9yLCBkaXNhYmxlIHN5bnRheCBoaWdobGlnaHRpbmcuICovCisJCSAgICBzYXZlX2RpZF9lbXNnID0gZGlkX2Vtc2c7CisJCSAgICBkaWRfZW1zZyA9IEZBTFNFOworCisJCSAgICBzeW50YXhfYXR0ciA9IGdldF9zeW50YXhfYXR0cigoY29sbnJfVCl2IC0gMSk7CisKKwkJICAgIGlmIChkaWRfZW1zZykKKwkJCXN5bnRheF9jbGVhcih3cC0+d19idWZmZXIpOworCQkgICAgZWxzZQorCQkJZGlkX2Vtc2cgPSBzYXZlX2RpZF9lbXNnOworCisJCSAgICAvKiBOZWVkIHRvIGdldCB0aGUgbGluZSBhZ2FpbiwgYSBtdWx0aS1saW5lIHJlZ2V4cCBtYXkKKwkJICAgICAqIGhhdmUgbWFkZSBpdCBpbnZhbGlkLiAqLworCQkgICAgbGluZSA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBsbnVtLCBGQUxTRSk7CisJCSAgICBwdHIgPSBsaW5lICsgdjsKKworCQkgICAgaWYgKGFyZWFfYXR0ciA9PSAwICYmIHNlYXJjaF9hdHRyID09IDApCisJCQljaGFyX2F0dHIgPSBzeW50YXhfYXR0cjsKKwkJfQorI2VuZGlmCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkJLyoKKwkJICogRm91bmQgbGFzdCBzcGFjZSBiZWZvcmUgd29yZDogY2hlY2sgZm9yIGxpbmUgYnJlYWsKKwkJICovCisJCWlmICh3cC0+d19wX2xiciAmJiB2aW1faXNicmVhayhjKSAmJiAhdmltX2lzYnJlYWsoKnB0cikKKwkJCQkJCSAgICAgICYmICF3cC0+d19wX2xpc3QpCisJCXsKKwkJICAgIG5fZXh0cmEgPSB3aW5fbGJyX2NoYXJ0YWJzaXplKHdwLCBwdHIgLSAoCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCQloYXNfbWJ5dGUgPyBtYl9sIDoKKyMgZW5kaWYKKwkJCQkxKSwgKGNvbG5yX1QpdmNvbCwgTlVMTCkgLSAxOworCQkgICAgY19leHRyYSA9ICcgJzsKKwkJICAgIGlmICh2aW1faXN3aGl0ZShjKSkKKwkJCWMgPSAnICc7CisJCX0KKyNlbmRpZgorCisJCWlmICh0cmFpbGNvbCAhPSBNQVhDT0wgJiYgcHRyID4gbGluZSArIHRyYWlsY29sICYmIGMgPT0gJyAnKQorCQl7CisJCSAgICBjID0gbGNzX3RyYWlsOworCQkgICAgaWYgKGFyZWFfYXR0ciA9PSAwICYmIHNlYXJjaF9hdHRyID09IDApCisJCSAgICB7CisJCQluX2F0dHIgPSAxOworCQkJZXh0cmFfYXR0ciA9IGhsX2F0dHIoSExGXzgpOworCQkJc2F2ZWRfYXR0cjIgPSBjaGFyX2F0dHI7IC8qIHNhdmUgY3VycmVudCBhdHRyICovCisJCSAgICB9CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgbWJfYyA9IGM7CisJCSAgICBpZiAoZW5jX3V0ZjggJiYgKCptYl9jaGFyMmxlbikoYykgPiAxKQorCQkgICAgeworCQkJbWJfdXRmOCA9IFRSVUU7CisJCQl1OGNfYzEgPSB1OGNfYzIgPSAwOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJbWJfdXRmOCA9IEZBTFNFOworI2VuZGlmCisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIEhhbmRsaW5nIG9mIG5vbi1wcmludGFibGUgY2hhcmFjdGVycy4KKwkgICAgICovCisJICAgIGlmICghKGNoYXJ0YWJbY10gJiBDVF9QUklOVF9DSEFSKSkKKwkgICAgeworCQkvKgorCQkgKiB3aGVuIGdldHRpbmcgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgZmlsZSwgd2UgbWF5IGhhdmUgdG8KKwkJICogdHVybiBpdCBpbnRvIHNvbWV0aGluZyBlbHNlIG9uIHRoZSB3YXkgdG8gcHV0dGluZyBpdAorCQkgKiBpbnRvICJTY3JlZW5MaW5lcyIuCisJCSAqLworCQlpZiAoYyA9PSBUQUIgJiYgKCF3cC0+d19wX2xpc3QgfHwgbGNzX3RhYjEpKQorCQl7CisJCSAgICAvKiB0YWIgYW1vdW50IGRlcGVuZHMgb24gY3VycmVudCBjb2x1bW4gKi8KKwkJICAgIG5fZXh0cmEgPSAoaW50KXdwLT53X2J1ZmZlci0+Yl9wX3RzCisJCQkJICAgLSB2Y29sICUgKGludCl3cC0+d19idWZmZXItPmJfcF90cyAtIDE7CisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgbWJfdXRmOCA9IEZBTFNFOwkvKiBkb24ndCBkcmF3IGFzIFVURi04ICovCisjZW5kaWYKKwkJICAgIGlmICh3cC0+d19wX2xpc3QpCisJCSAgICB7CisJCQljID0gbGNzX3RhYjE7CisJCQljX2V4dHJhID0gbGNzX3RhYjI7CisJCQluX2F0dHIgPSBuX2V4dHJhICsgMTsKKwkJCWV4dHJhX2F0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkJCXNhdmVkX2F0dHIyID0gY2hhcl9hdHRyOyAvKiBzYXZlIGN1cnJlbnQgYXR0ciAqLworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCW1iX2MgPSBjOworCQkJaWYgKGVuY191dGY4ICYmICgqbWJfY2hhcjJsZW4pKGMpID4gMSkKKwkJCXsKKwkJCSAgICBtYl91dGY4ID0gVFJVRTsKKwkJCSAgICB1OGNfYzEgPSB1OGNfYzIgPSAwOworCQkJfQorI2VuZGlmCisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQljX2V4dHJhID0gJyAnOworCQkJYyA9ICcgJzsKKwkJICAgIH0KKwkJfQorCQllbHNlIGlmIChjID09IE5VTCAmJiB3cC0+d19wX2xpc3QgJiYgbGNzX2VvbF9vbmUgPiAwKQorCQl7CisjaWYgZGVmaW5lZChGRUFUX0RJRkYpIHx8IGRlZmluZWQoTElORV9BVFRSKQorCQkgICAgLyogRm9yIGEgZGlmZiBsaW5lIHRoZSBoaWdobGlnaHRpbmcgY29udGludWVzIGFmdGVyIHRoZQorCQkgICAgICogIiQiLiAqLworCQkgICAgaWYgKAorIyBpZmRlZiBGRUFUX0RJRkYKKwkJCSAgICBkaWZmX2hsZiA9PSAoZW51bSBobGZfdmFsdWUpMAorIyAgaWZkZWYgTElORV9BVFRSCisJCQkgICAgJiYKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIExJTkVfQVRUUgorCQkJICAgIGxpbmVfYXR0ciA9PSAwCisjIGVuZGlmCisJCSAgICAgICApCisjZW5kaWYKKwkJICAgIHsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCQkvKiBJbiB2aXJ0dWFsZWRpdCwgdmlzdWFsIHNlbGVjdGlvbnMgbWF5IGV4dGVuZAorCQkJICogYmV5b25kIGVuZCBvZiBsaW5lLiAqLworCQkJaWYgKGFyZWFfaGlnaGxpZ2h0aW5nICYmIHZpcnR1YWxfYWN0aXZlKCkKKwkJCQkmJiB0b2NvbCAhPSBNQVhDT0wgJiYgdmNvbCA8IHRvY29sKQorCQkJICAgIG5fZXh0cmEgPSAwOworCQkJZWxzZQorI2VuZGlmCisJCQl7CisJCQkgICAgcF9leHRyYSA9IGF0X2VuZF9zdHI7CisJCQkgICAgbl9leHRyYSA9IDE7CisJCQkgICAgY19leHRyYSA9IE5VTDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGMgPSBsY3NfZW9sOworCQkgICAgbGNzX2VvbF9vbmUgPSAtMTsKKwkJICAgIC0tcHRyOwkgICAgLyogcHV0IGl0IGJhY2sgYXQgdGhlIE5VTCAqLworCQkgICAgaWYgKGFyZWFfYXR0ciA9PSAwICYmIHNlYXJjaF9hdHRyID09IDApCisJCSAgICB7CisJCQlleHRyYV9hdHRyID0gaGxfYXR0cihITEZfQVQpOworCQkJbl9hdHRyID0gMTsKKwkJICAgIH0KKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBtYl9jID0gYzsKKwkJICAgIGlmIChlbmNfdXRmOCAmJiAoKm1iX2NoYXIybGVuKShjKSA+IDEpCisJCSAgICB7CisJCQltYl91dGY4ID0gVFJVRTsKKwkJCXU4Y19jMSA9IHU4Y19jMiA9IDA7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQltYl91dGY4ID0gRkFMU0U7CS8qIGRvbid0IGRyYXcgYXMgVVRGLTggKi8KKyNlbmRpZgorCQl9CisJCWVsc2UgaWYgKGMgIT0gTlVMKQorCQl7CisJCSAgICBwX2V4dHJhID0gdHJhbnNjaGFyKGMpOworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCSAgICBpZiAoKGR5X2ZsYWdzICYgRFlfVUhFWCkgJiYgd3AtPndfcF9ybCkKKwkJCXJsX21pcnJvcihwX2V4dHJhKTsJLyogcmV2ZXJzZSAiPDEyPiIgKi8KKyNlbmRpZgorCQkgICAgbl9leHRyYSA9IGJ5dGUyY2VsbHMoYykgLSAxOworCQkgICAgY19leHRyYSA9IE5VTDsKKwkJICAgIGMgPSAqcF9leHRyYSsrOworCQkgICAgaWYgKGFyZWFfYXR0ciA9PSAwICYmIHNlYXJjaF9hdHRyID09IDApCisJCSAgICB7CisJCQluX2F0dHIgPSBuX2V4dHJhICsgMTsKKwkJCWV4dHJhX2F0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkJCXNhdmVkX2F0dHIyID0gY2hhcl9hdHRyOyAvKiBzYXZlIGN1cnJlbnQgYXR0ciAqLworCQkgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIG1iX3V0ZjggPSBGQUxTRTsJLyogZG9uJ3QgZHJhdyBhcyBVVEYtOCAqLworI2VuZGlmCisJCX0KKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJCWVsc2UgaWYgKFZJc3VhbF9hY3RpdmUKKwkJCSAmJiAoVklzdWFsX21vZGUgPT0gQ3RybF9WCisJCQkgICAgIHx8IFZJc3VhbF9tb2RlID09ICd2JykKKwkJCSAmJiB2aXJ0dWFsX2FjdGl2ZSgpCisJCQkgJiYgdG9jb2wgIT0gTUFYQ09MCisJCQkgJiYgdmNvbCA8IHRvY29sCisJCQkgJiYgKAorIyBpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkJICAgIHdwLT53X3BfcmwgPyAoY29sID49IDApIDoKKyMgZW5kaWYKKwkJCSAgICAoY29sIDwgV19XSURUSCh3cCkpKSkKKwkJeworCQkgICAgYyA9ICcgJzsKKwkJICAgIC0tcHRyOwkgICAgLyogcHV0IGl0IGJhY2sgYXQgdGhlIE5VTCAqLworCQl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfRElGRikgfHwgZGVmaW5lZChMSU5FX0FUVFIpCisJCWVsc2UgaWYgKCgKKyMgaWZkZWYgRkVBVF9ESUZGCisJCQkgICAgZGlmZl9obGYgIT0gKGVudW0gaGxmX3ZhbHVlKTAKKyMgIGlmZGVmIExJTkVfQVRUUgorCQkJICAgIHx8CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBMSU5FX0FUVFIKKwkJCSAgICBsaW5lX2F0dHIgIT0gMAorIyBlbmRpZgorCQkJKSAmJiAoCisjIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCQkgICAgd3AtPndfcF9ybCA/IChjb2wgPj0gMCkgOgorIyBlbmRpZgorCQkJICAgIChjb2wgPCBXX1dJRFRIKHdwKSkpKQorCQl7CisJCSAgICAvKiBIaWdobGlnaHQgdW50aWwgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHdpbmRvdyAqLworCQkgICAgYyA9ICcgJzsKKwkJICAgIC0tcHRyOwkgICAgLyogcHV0IGl0IGJhY2sgYXQgdGhlIE5VTCAqLworIyBpZmRlZiBGRUFUX0RJRkYKKwkJICAgIGlmIChkaWZmX2hsZiA9PSBITEZfVFhEKQorCQkgICAgeworCQkJZGlmZl9obGYgPSBITEZfQ0hEOworCQkJaWYgKGF0dHIgPT0gMCB8fCBjaGFyX2F0dHIgIT0gYXR0cikKKwkJCSAgICBjaGFyX2F0dHIgPSBobF9hdHRyKGRpZmZfaGxmKTsKKwkJICAgIH0KKyMgZW5kaWYKKwkJfQorI2VuZGlmCisJICAgIH0KKwl9CisKKwkvKiBEb24ndCBvdmVycmlkZSB2aXN1YWwgc2VsZWN0aW9uIGhpZ2hsaWdodGluZy4gKi8KKwlpZiAobl9hdHRyID4gMAorCQkmJiBkcmF3X3N0YXRlID09IFdMX0xJTkUKKwkJJiYgKGFyZWFfYXR0ciA9PSAwIHx8IGNoYXJfYXR0ciAhPSBhcmVhX2F0dHIpCisJCSYmIChzZWFyY2hfYXR0ciA9PSAwIHx8IGNoYXJfYXR0ciAhPSBzZWFyY2hfYXR0cikpCisJICAgIGNoYXJfYXR0ciA9IGV4dHJhX2F0dHI7CisKKyNpZiBkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykKKwkvKiBYSU0gZG9uJ3Qgc2VuZCBwcmVlZGl0X3N0YXJ0IGFuZCBwcmVlZGl0X2VuZCwgYnV0IHRoZXkgc2VuZAorCSAqIHByZWVkaXRfY2hhbmdlZCBhbmQgY29tbWl0LiAgVGh1cyBWaW0gY2FuJ3Qgc2V0ICJpbV9pc19hY3RpdmUiLCB1c2UKKwkgKiBpbV9pc19wcmVlZGl0aW5nKCkgaGVyZS4gKi8KKwlpZiAoeGljICE9IE5VTEwKKwkJJiYgbG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJJiYgKFN0YXRlICYgSU5TRVJUKQorCQkmJiAhcF9pbWRpc2FibGUKKwkJJiYgaW1faXNfcHJlZWRpdGluZygpCisJCSYmIGRyYXdfc3RhdGUgPT0gV0xfTElORSkKKwl7CisJICAgIGNvbG5yX1QgdGNvbDsKKworCSAgICBpZiAocHJlZWRpdF9lbmRfY29sID09IE1BWENPTCkKKwkJZ2V0dmNvbChjdXJ3aW4sICYoY3Vyd2luLT53X2N1cnNvciksICZ0Y29sLCBOVUxMLCBOVUxMKTsKKwkgICAgZWxzZQorCQl0Y29sID0gcHJlZWRpdF9lbmRfY29sOworCSAgICBpZiAoKGxvbmcpcHJlZWRpdF9zdGFydF9jb2wgPD0gdmNvbCAmJiB2Y29sIDwgKGxvbmcpdGNvbCkKKwkgICAgeworCQlpZiAoZmVlZGJhY2tfb2xkX2F0dHIgPCAwKQorCQl7CisJCSAgICBmZWVkYmFja19jb2wgPSAwOworCQkgICAgZmVlZGJhY2tfb2xkX2F0dHIgPSBjaGFyX2F0dHI7CisJCX0KKwkJY2hhcl9hdHRyID0gaW1fZ2V0X2ZlZWRiYWNrX2F0dHIoZmVlZGJhY2tfY29sKTsKKwkJaWYgKGNoYXJfYXR0ciA8IDApCisJCSAgICBjaGFyX2F0dHIgPSBmZWVkYmFja19vbGRfYXR0cjsKKwkJZmVlZGJhY2tfY29sKys7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZmVlZGJhY2tfb2xkX2F0dHIgPj0gMCkKKwkgICAgeworCQljaGFyX2F0dHIgPSBmZWVkYmFja19vbGRfYXR0cjsKKwkJZmVlZGJhY2tfb2xkX2F0dHIgPSAtMTsKKwkJZmVlZGJhY2tfY29sID0gMDsKKwkgICAgfQorCX0KKyNlbmRpZgorCS8qCisJICogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBpbiBjb2x1bW4gMCBidXQgbm90IG9uIHRoZSBmaXJzdAorCSAqIGNoYXJhY3RlciBvZiB0aGUgbGluZSBhbmQgdGhlIHVzZXIgd2FudHMgdXMgdG8gc2hvdyB1cyBhCisJICogc3BlY2lhbCBjaGFyYWN0ZXIgKHZpYSAnbGlzdGNoYXJzJyBvcHRpb24gInByZWNlZGVzOjxjaGFyPiIuCisJICovCisJaWYgKGxjc19wcmVjX3RvZG8gIT0gTlVMCisJCSYmICh3cC0+d19wX3dyYXAgPyB3cC0+d19za2lwY29sID4gMCA6IHdwLT53X2xlZnRjb2wgPiAwKQorI2lmZGVmIEZFQVRfRElGRgorCQkmJiBmaWxsZXJfdG9kbyA8PSAwCisjZW5kaWYKKwkJJiYgZHJhd19zdGF0ZSA+IFdMX05SCisJCSYmIGMgIT0gTlVMKQorCXsKKwkgICAgYyA9IGxjc19wcmVjOworCSAgICBsY3NfcHJlY190b2RvID0gTlVMOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgbWJfYyA9IGM7CisJICAgIGlmIChlbmNfdXRmOCAmJiAoKm1iX2NoYXIybGVuKShjKSA+IDEpCisJICAgIHsKKwkJbWJfdXRmOCA9IFRSVUU7CisJCXU4Y19jMSA9IHU4Y19jMiA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCQltYl91dGY4ID0gRkFMU0U7CS8qIGRvbid0IGRyYXcgYXMgVVRGLTggKi8KKyNlbmRpZgorCSAgICBpZiAoKGFyZWFfYXR0ciA9PSAwIHx8IGNoYXJfYXR0ciAhPSBhcmVhX2F0dHIpCisJCSAgICAmJiAoc2VhcmNoX2F0dHIgPT0gMCB8fCBjaGFyX2F0dHIgIT0gc2VhcmNoX2F0dHIpKQorCSAgICB7CisJCXNhdmVkX2F0dHIzID0gY2hhcl9hdHRyOyAvKiBzYXZlIGN1cnJlbnQgYXR0ciAqLworCQljaGFyX2F0dHIgPSBobF9hdHRyKEhMRl9BVCk7IC8qIGxhdGVyIGNvcGllZCB0byBjaGFyX2F0dHIgKi8KKwkJbl9hdHRyMyA9IDE7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIEF0IGVuZCBvZiB0aGUgdGV4dCBsaW5lLgorCSAqLworCWlmIChjID09IE5VTCkKKwl7CisJICAgIC8qIGludmVydCBhdCBsZWFzdCBvbmUgY2hhciwgdXNlZCBmb3IgVmlzdWFsIGFuZCBlbXB0eSBsaW5lIG9yCisJICAgICAqIGhpZ2hsaWdodCBtYXRjaCBhdCBlbmQgb2YgbGluZS4gSWYgaXQncyBiZXlvbmQgdGhlIGxhc3QKKwkgICAgICogY2hhciBvbiB0aGUgc2NyZWVuLCBqdXN0IG92ZXJ3cml0ZSB0aGF0IG9uZSAodHJpY2t5ISkgIE5vdAorCSAgICAgKiBuZWVkZWQgd2hlbiBhICckJyB3YXMgZGlzcGxheWVkIGZvciAnbGlzdCcuICovCisJICAgIGlmIChsY3NfZW9sID09IGxjc19lb2xfb25lCisJCSAgICAmJiAoKGFyZWFfYXR0ciAhPSAwICYmIHZjb2wgPT0gZnJvbWNvbCkKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCQkJLyogaGlnaGxpZ2h0ICdobHNlYXJjaCcgbWF0Y2ggYXQgZW5kIG9mIGxpbmUgKi8KKwkJCXx8IHB0ciAtIDEgPT0gc2VhcmNoX2hsLnN0YXJ0cAorCQkJfHwgcHRyIC0gMSA9PSBtYXRjaF9obC5zdGFydHAKKyNlbmRpZgorCQkgICAgICAgKSkKKwkgICAgeworCQlpbnQgbiA9IDA7CisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlpZiAod3AtPndfcF9ybCkKKwkJeworCQkgICAgaWYgKGNvbCA8IDApCisJCQluID0gMTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgaWYgKGNvbCA+PSBXX1dJRFRIKHdwKSkKKwkJCW4gPSAtMTsKKwkJfQorCQlpZiAobiAhPSAwKQorCQl7CisJCSAgICAvKiBBdCB0aGUgd2luZG93IGJvdW5kYXJ5LCBoaWdobGlnaHQgdGhlIGxhc3QgY2hhcmFjdGVyCisJCSAgICAgKiBpbnN0ZWFkIChiZXR0ZXIgdGhhbiBub3RoaW5nKS4gKi8KKwkJICAgIG9mZiArPSBuOworCQkgICAgY29sICs9IG47CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBBZGQgYSBibGFuayBjaGFyYWN0ZXIgdG8gaGlnaGxpZ2h0LiAqLworCQkgICAgU2NyZWVuTGluZXNbb2ZmXSA9ICcgJzsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoZW5jX3V0ZjgpCisJCQlTY3JlZW5MaW5lc1VDW29mZl0gPSAwOworI2VuZGlmCisJCX0KKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCQlpZiAoYXJlYV9hdHRyID09IDApCisJCXsKKwkJICAgIGlmIChwdHIgLSAxID09IG1hdGNoX2hsLnN0YXJ0cCkKKwkJCWNoYXJfYXR0ciA9IG1hdGNoX2hsLmF0dHI7CisJCSAgICBlbHNlCisJCQljaGFyX2F0dHIgPSBzZWFyY2hfaGwuYXR0cjsKKwkJfQorI2VuZGlmCisJCVNjcmVlbkF0dHJzW29mZl0gPSBjaGFyX2F0dHI7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJaWYgKHdwLT53X3BfcmwpCisJCSAgICAtLWNvbDsKKwkJZWxzZQorI2VuZGlmCisJCSAgICArK2NvbDsKKwkgICAgfQorCisJICAgIFNDUkVFTl9MSU5FKHNjcmVlbl9yb3csIFdfV0lOQ09MKHdwKSwgY29sLCAoaW50KVdfV0lEVEgod3ApLAorCQkJCQkJCQkgIHdwLT53X3BfcmwpOworCSAgICByb3crKzsKKworCSAgICAvKgorCSAgICAgKiBVcGRhdGUgd19jbGluZV9oZWlnaHQgYW5kIHdfY2xpbmVfZm9sZGVkIGlmIHRoZSBjdXJzb3IgbGluZSB3YXMKKwkgICAgICogdXBkYXRlZCAoc2F2ZXMgYSBjYWxsIHRvIHBsaW5lcygpIGxhdGVyKS4KKwkgICAgICovCisJICAgIGlmICh3cCA9PSBjdXJ3aW4gJiYgbG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIHsKKwkJY3Vyd2luLT53X2NsaW5lX3JvdyA9IHN0YXJ0cm93OworCQljdXJ3aW4tPndfY2xpbmVfaGVpZ2h0ID0gcm93IC0gc3RhcnRyb3c7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWN1cndpbi0+d19jbGluZV9mb2xkZWQgPSBGQUxTRTsKKyNlbmRpZgorCQljdXJ3aW4tPndfdmFsaWQgfD0gKFZBTElEX0NIRUlHSFR8VkFMSURfQ1JPVyk7CisJICAgIH0KKworCSAgICBicmVhazsKKwl9CisKKwkvKiBsaW5lIGNvbnRpbnVlcyBiZXlvbmQgbGluZSBlbmQgKi8KKwlpZiAobGNzX2V4dAorCQkmJiAhd3AtPndfcF93cmFwCisjaWZkZWYgRkVBVF9ESUZGCisJCSYmIGZpbGxlcl90b2RvIDw9IDAKKyNlbmRpZgorCQkmJiAoCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJICAgIHdwLT53X3BfcmwgPyBjb2wgPT0gMCA6CisjZW5kaWYKKwkJICAgIGNvbCA9PSBXX1dJRFRIKHdwKSAtIDEpCisJCSYmICgqcHRyICE9IE5VTAorCQkgICAgfHwgKHdwLT53X3BfbGlzdCAmJiBsY3NfZW9sICE9IE5VTCAmJiBwX2V4dHJhICE9IGF0X2VuZF9zdHIpCisJCSAgICB8fCAobl9leHRyYSAmJiAoY19leHRyYSAhPSBOVUwgfHwgKnBfZXh0cmEgIT0gTlVMKSkpKQorCXsKKwkgICAgYyA9IGxjc19leHQ7CisJICAgIGNoYXJfYXR0ciA9IGhsX2F0dHIoSExGX0FUKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIG1iX2MgPSBjOworCSAgICBpZiAoZW5jX3V0ZjggJiYgKCptYl9jaGFyMmxlbikoYykgPiAxKQorCSAgICB7CisJCW1iX3V0ZjggPSBUUlVFOworCQl1OGNfYzEgPSB1OGNfYzIgPSAwOworCSAgICB9CisJICAgIGVsc2UKKwkJbWJfdXRmOCA9IEZBTFNFOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBTdG9yZSBjaGFyYWN0ZXIgdG8gYmUgZGlzcGxheWVkLgorCSAqIFNraXAgY2hhcmFjdGVycyB0aGF0IGFyZSBsZWZ0IG9mIHRoZSBzY3JlZW4gZm9yICdub3dyYXAnLgorCSAqLworCXZjb2xfcHJldiA9IHZjb2w7CisJaWYgKGRyYXdfc3RhdGUgPCBXTF9MSU5FIHx8IG5fc2tpcCA8PSAwKQorCXsKKwkgICAgLyoKKwkgICAgICogU3RvcmUgdGhlIGNoYXJhY3Rlci4KKwkgICAgICovCisjaWYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQorCSAgICBpZiAoaGFzX21ieXRlICYmIHdwLT53X3BfcmwgJiYgKCptYl9jaGFyMmNlbGxzKShtYl9jKSA+IDEpCisJICAgIHsKKwkJLyogQSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIgaXM6IHB1dCBmaXJzdCBoYWx2ZSBpbiBsZWZ0IGNlbGwuICovCisJCS0tb2ZmOworCQktLWNvbDsKKwkgICAgfQorI2VuZGlmCisJICAgIFNjcmVlbkxpbmVzW29mZl0gPSBjOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwkJU2NyZWVuTGluZXMyW29mZl0gPSBtYl9jICYgMHhmZjsKKwkgICAgZWxzZSBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJaWYgKG1iX3V0ZjgpCisJCXsKKwkJICAgIFNjcmVlbkxpbmVzVUNbb2ZmXSA9IG1iX2M7CisJCSAgICBTY3JlZW5MaW5lc0MxW29mZl0gPSB1OGNfYzE7CisJCSAgICBTY3JlZW5MaW5lc0MyW29mZl0gPSB1OGNfYzI7CisJCX0KKwkJZWxzZQorCQkgICAgU2NyZWVuTGluZXNVQ1tvZmZdID0gMDsKKwkgICAgfQorCSAgICBpZiAobXVsdGlfYXR0cikKKwkgICAgeworCQlTY3JlZW5BdHRyc1tvZmZdID0gbXVsdGlfYXR0cjsKKwkJbXVsdGlfYXR0ciA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCVNjcmVlbkF0dHJzW29mZl0gPSBjaGFyX2F0dHI7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKCptYl9jaGFyMmNlbGxzKShtYl9jKSA+IDEpCisJICAgIHsKKwkJLyogTmVlZCB0byBmaWxsIHR3byBzY3JlZW4gY29sdW1ucy4gKi8KKwkJKytvZmY7CisJCSsrY29sOworCQlpZiAoZW5jX3V0ZjgpCisJCSAgICAvKiBVVEYtODogUHV0IGEgMCBpbiB0aGUgc2Vjb25kIHNjcmVlbiBjaGFyLiAqLworCQkgICAgU2NyZWVuTGluZXNbb2ZmXSA9IDA7CisJCWVsc2UKKwkJICAgIC8qIERCQ1M6IFB1dCBzZWNvbmQgYnl0ZSBpbiB0aGUgc2Vjb25kIHNjcmVlbiBjaGFyLiAqLworCQkgICAgU2NyZWVuTGluZXNbb2ZmXSA9IG1iX2MgJiAweGZmOworCQkrK3Zjb2w7CisJCS8qIFdoZW4gInRvY29sIiBpcyBoYWxmd2F5IGEgY2hhcmFjdGVyLCBzZXQgaXQgdG8gdGhlIGVuZCBvZgorCQkgKiB0aGUgY2hhcmFjdGVyLCBvdGhlcndpc2UgaGlnaGxpZ2h0aW5nIHdvbid0IHN0b3AuICovCisJCWlmICh0b2NvbCA9PSB2Y29sKQorCQkgICAgKyt0b2NvbDsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlpZiAod3AtPndfcF9ybCkKKwkJeworCQkgICAgLyogbm93IGl0J3MgdGltZSB0byBiYWNrdXAgb25lIGNlbGwgKi8KKwkJICAgIC0tb2ZmOworCQkgICAgLS1jb2w7CisJCX0KKyNlbmRpZgorCSAgICB9CisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICBpZiAod3AtPndfcF9ybCkKKwkgICAgeworCQktLW9mZjsKKwkJLS1jb2w7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJKytvZmY7CisJCSsrY29sOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgLS1uX3NraXA7CisKKwkvKiBPbmx5IGFkdmFuY2UgdGhlICJ2Y29sIiB3aGVuIGFmdGVyIHRoZSAnbnVtYmVyJyBjb2x1bW4uICovCisJaWYgKGRyYXdfc3RhdGUgPj0gV0xfU0JSCisjaWZkZWYgRkVBVF9ESUZGCisJCSYmIGZpbGxlcl90b2RvIDw9IDAKKyNlbmRpZgorCQkpCisJICAgICsrdmNvbDsKKworCS8qIHJlc3RvcmUgYXR0cmlidXRlcyBhZnRlciAicHJlZGVjZXMiIGluICdsaXN0Y2hhcnMnICovCisJaWYgKGRyYXdfc3RhdGUgPiBXTF9OUiAmJiBuX2F0dHIzID4gMCAmJiAtLW5fYXR0cjMgPT0gMCkKKwkgICAgY2hhcl9hdHRyID0gc2F2ZWRfYXR0cjM7CisKKwkvKiByZXN0b3JlIGF0dHJpYnV0ZXMgYWZ0ZXIgbGFzdCAnbGlzdGNoYXJzJyBvciAnbnVtYmVyJyBjaGFyICovCisJaWYgKG5fYXR0ciA+IDAgJiYgZHJhd19zdGF0ZSA9PSBXTF9MSU5FICYmIC0tbl9hdHRyID09IDApCisJICAgIGNoYXJfYXR0ciA9IHNhdmVkX2F0dHIyOworCisJLyoKKwkgKiBBdCBlbmQgb2Ygc2NyZWVuIGxpbmUgYW5kIHRoZXJlIGlzIG1vcmUgdG8gY29tZTogRGlzcGxheSB0aGUgbGluZQorCSAqIHNvIGZhci4gIElmIHRoZXJlIGlzIG5vIG1vcmUgdG8gZGlzcGxheSBpdCBpcyBjYXRjaGVkIGFib3ZlLgorCSAqLworCWlmICgoCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkgICAgd3AtPndfcF9ybCA/IChjb2wgPCAwKSA6CisjZW5kaWYKKwkJCQkgICAgKGNvbCA+PSBXX1dJRFRIKHdwKSkpCisJCSYmICgqcHRyICE9IE5VTAorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgfHwgZmlsbGVyX3RvZG8gPiAwCisjZW5kaWYKKwkJICAgIHx8ICh3cC0+d19wX2xpc3QgJiYgbGNzX2VvbCAhPSBOVUwgJiYgcF9leHRyYSAhPSBhdF9lbmRfc3RyKQorCQkgICAgfHwgKG5fZXh0cmEgIT0gMCAmJiAoY19leHRyYSAhPSBOVUwgfHwgKnBfZXh0cmEgIT0gTlVMKSkpCisJCSkKKwl7CisJICAgIFNDUkVFTl9MSU5FKHNjcmVlbl9yb3csIFdfV0lOQ09MKHdwKSwgY29sLCAoaW50KVdfV0lEVEgod3ApLAorCQkJCQkJCQkgIHdwLT53X3BfcmwpOworCSAgICArK3JvdzsKKwkgICAgKytzY3JlZW5fcm93OworCisJICAgIC8qIFdoZW4gbm90IHdyYXBwaW5nIGFuZCBmaW5pc2hlZCBkaWZmIGxpbmVzLCBvciB3aGVuIGRpc3BsYXllZAorCSAgICAgKiAnJCcgYW5kIGhpZ2hsaWdodGluZyB1bnRpbCBsYXN0IGNvbHVtbiwgYnJlYWsgaGVyZS4gKi8KKwkgICAgaWYgKCghd3AtPndfcF93cmFwCisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICAmJiBmaWxsZXJfdG9kbyA8PSAwCisjZW5kaWYKKwkJICAgICkgfHwgbGNzX2VvbF9vbmUgPT0gLTEpCisJCWJyZWFrOworCisJICAgIC8qIFdoZW4gdGhlIHdpbmRvdyBpcyB0b28gbmFycm93IGRyYXcgYWxsICJAIiBsaW5lcy4gKi8KKwkgICAgaWYgKGRyYXdfc3RhdGUgIT0gV0xfTElORQorI2lmZGVmIEZFQVRfRElGRgorCQkgICAgJiYgZmlsbGVyX3RvZG8gPD0gMAorI2VuZGlmCisJCSAgICApCisJICAgIHsKKwkJd2luX2RyYXdfZW5kKHdwLCAnQCcsICcgJywgcm93LCB3cC0+d19oZWlnaHQsIEhMRl9BVCk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJZHJhd192c2VwX3dpbih3cCwgcm93KTsKKyNlbmRpZgorCQlyb3cgPSBlbmRyb3c7CisJICAgIH0KKworCSAgICAvKiBXaGVuIGxpbmUgZ290IHRvbyBsb25nIGZvciBzY3JlZW4gYnJlYWsgaGVyZS4gKi8KKwkgICAgaWYgKHJvdyA9PSBlbmRyb3cpCisJICAgIHsKKwkJKytyb3c7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKHNjcmVlbl9jdXJfcm93ID09IHNjcmVlbl9yb3cgLSAxCisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICAgJiYgZmlsbGVyX3RvZG8gPD0gMAorI2VuZGlmCisJCSAgICAgJiYgV19XSURUSCh3cCkgPT0gQ29sdW1ucykKKwkgICAgeworCQkvKiBSZW1lbWJlciB0aGF0IHRoZSBsaW5lIHdyYXBzLCB1c2VkIGZvciBtb2RlbGVzcyBjb3B5LiAqLworCQlMaW5lV3JhcHNbc2NyZWVuX3JvdyAtIDFdID0gVFJVRTsKKworCQkvKgorCQkgKiBTcGVjaWFsIHRyaWNrIHRvIG1ha2UgY29weS9wYXN0ZSBvZiB3cmFwcGVkIGxpbmVzIHdvcmsgd2l0aAorCQkgKiB4dGVybS9zY3JlZW46IHdyaXRlIGFuIGV4dHJhIGNoYXJhY3RlciBiZXlvbmQgdGhlIGVuZCBvZgorCQkgKiB0aGUgbGluZS4gVGhpcyB3aWxsIHdvcmsgd2l0aCBhbGwgdGVybWluYWwgdHlwZXMKKwkJICogKHJlZ2FyZGxlc3Mgb2YgdGhlIHhuLGFtIHNldHRpbmdzKS4KKwkJICogT25seSBkbyB0aGlzIG9uIGEgZmFzdCB0dHkuCisJCSAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBjdXJyZW50IGxpbmUKKwkJICogKHNvbWV0aGluZyBoYXMgYmVlbiB3cml0dGVuIGluIGl0KS4KKwkJICogRG9uJ3QgZG8gdGhpcyBmb3IgdGhlIEdVSS4KKwkJICogRG9uJ3QgZG8gdGhpcyBmb3IgZG91YmxlLXdpZHRoIGNoYXJhY3RlcnMuCisJCSAqIERvbid0IGRvIHRoaXMgZm9yIGEgd2luZG93IG5vdCBhdCB0aGUgcmlnaHQgc2NyZWVuIGJvcmRlci4KKwkJICovCisJCWlmIChwX3RmCisjaWZkZWYgRkVBVF9HVUkKKwkJCSAmJiAhZ3VpLmluX3VzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorCQkJICYmICEoaGFzX21ieXRlCisJCQkgICAgICYmICgoKm1iX29mZjJjZWxscykoTGluZU9mZnNldFtzY3JlZW5fcm93XSkgPT0gMgorCQkJCSB8fCAoKm1iX29mZjJjZWxscykoTGluZU9mZnNldFtzY3JlZW5fcm93IC0gMV0KKwkJCQkJCQkrIChpbnQpQ29sdW1ucyAtIDIpID09IDIpKQorI2VuZGlmCisJCSAgICkKKwkJeworCQkgICAgLyogRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzY3JlZW4gbGluZSwKKwkJICAgICAqIHRoZW4gb3V0cHV0IHRoZSBzYW1lIGNoYXJhY3RlciBhZ2FpbiB0byBsZXQgdGhlCisJCSAgICAgKiB0ZXJtaW5hbCBrbm93IGFib3V0IHRoZSB3cmFwLiAgSWYgdGhlIHRlcm1pbmFsIGRvZXNuJ3QKKwkJICAgICAqIGF1dG8td3JhcCwgd2Ugb3ZlcndyaXRlIHRoZSBjaGFyYWN0ZXIuICovCisJCSAgICBpZiAoc2NyZWVuX2N1cl9jb2wgIT0gV19XSURUSCh3cCkpCisJCQlzY3JlZW5fY2hhcihMaW5lT2Zmc2V0W3NjcmVlbl9yb3cgLSAxXQorCQkJCQkJICAgICAgKyAodW5zaWduZWQpQ29sdW1ucyAtIDEsCisJCQkJCSAgc2NyZWVuX3JvdyAtIDEsIChpbnQpKENvbHVtbnMgLSAxKSk7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICAvKiBXaGVuIHRoZXJlIGlzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIsIGp1c3Qgb3V0cHV0IGEKKwkJICAgICAqIHNwYWNlIHRvIGtlZXAgaXQgc2ltcGxlLiAqLworCQkgICAgaWYgKGhhc19tYnl0ZSAmJiBtYl9vZmYyY2VsbHMoTGluZU9mZnNldFtzY3JlZW5fcm93IC0gMV0KKwkJCQkJCSsgKHVuc2lnbmVkKUNvbHVtbnMgLSAxKSAhPSAxKQorCQkJb3V0X2NoYXIoJyAnKTsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJb3V0X2NoYXIoU2NyZWVuTGluZXNbTGluZU9mZnNldFtzY3JlZW5fcm93IC0gMV0KKwkJCQkJCQkgICAgKyAoQ29sdW1ucyAtIDEpXSk7CisJCSAgICAvKiBmb3JjZSBhIHJlZHJhdyBvZiB0aGUgZmlyc3QgY2hhciBvbiB0aGUgbmV4dCBsaW5lICovCisJCSAgICBTY3JlZW5BdHRyc1tMaW5lT2Zmc2V0W3NjcmVlbl9yb3ddXSA9IChzYXR0cl9UKS0xOworCQkgICAgc2NyZWVuX3N0YXJ0KCk7CS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCQl9CisJICAgIH0KKworCSAgICBjb2wgPSAwOworCSAgICBvZmYgPSAodW5zaWduZWQpKGN1cnJlbnRfU2NyZWVuTGluZSAtIFNjcmVlbkxpbmVzKTsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICBpZiAod3AtPndfcF9ybCkKKwkgICAgeworCQljb2wgPSBXX1dJRFRIKHdwKSAtIDE7CS8qIGNvbCBpcyBub3QgdXNlZCBpZiBicmVha2luZyEgKi8KKwkJb2ZmICs9IGNvbDsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgLyogcmVzZXQgdGhlIGRyYXdpbmcgc3RhdGUgZm9yIHRoZSBzdGFydCBvZiBhIHdyYXBwZWQgbGluZSAqLworCSAgICBkcmF3X3N0YXRlID0gV0xfU1RBUlQ7CisJICAgIHNhdmVkX25fZXh0cmEgPSBuX2V4dHJhOworCSAgICBzYXZlZF9wX2V4dHJhID0gcF9leHRyYTsKKwkgICAgc2F2ZWRfY19leHRyYSA9IGNfZXh0cmE7CisJICAgIHNhdmVkX2NoYXJfYXR0ciA9IGNoYXJfYXR0cjsKKwkgICAgbl9leHRyYSA9IDA7CisJICAgIGxjc19wcmVjX3RvZG8gPSBsY3NfcHJlYzsKKyNpZmRlZiBGRUFUX0xJTkVCUkVBSworIyBpZmRlZiBGRUFUX0RJRkYKKwkgICAgaWYgKGZpbGxlcl90b2RvIDw9IDApCisjIGVuZGlmCisJCW5lZWRfc2hvd2JyZWFrID0gVFJVRTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElGRgorCSAgICAtLWZpbGxlcl90b2RvOworCSAgICAvKiBXaGVuIHRoZSBmaWxsZXIgbGluZXMgYXJlIGFjdHVhbGx5IGJlbG93IHRoZSBsYXN0IGxpbmUgb2YgdGhlCisJICAgICAqIGZpbGUsIGRvbid0IGRyYXcgdGhlIGxpbmUgaXRzZWxmLCBicmVhayBoZXJlLiAqLworCSAgICBpZiAoZmlsbGVyX3RvZG8gPT0gMCAmJiB3cC0+d19ib3RmaWxsKQorCQlicmVhazsKKyNlbmRpZgorCX0KKworICAgIH0JLyogZm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgbGluZSAqLworCisgICAgcmV0dXJuIHJvdzsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBuZWVkcyByZWRyYXdpbmc6CisgKiAtIHRoZSAoZmlyc3QgYnl0ZSBvZiB0aGUpIGNoYXJhY3RlciBpcyBkaWZmZXJlbnQKKyAqIC0gdGhlIGF0dHJpYnV0ZXMgYXJlIGRpZmZlcmVudAorICogLSB0aGUgY2hhcmFjdGVyIGlzIG11bHRpLWJ5dGUgYW5kIHRoZSBuZXh0IGJ5dGUgaXMgZGlmZmVyZW50CisgKi8KKyAgICBzdGF0aWMgaW50CitjaGFyX25lZWRzX3JlZHJhdyhvZmZfZnJvbSwgb2ZmX3RvLCBjb2xzKQorICAgIGludAkJb2ZmX2Zyb207CisgICAgaW50CQlvZmZfdG87CisgICAgaW50CQljb2xzOworeworICAgIGlmIChjb2xzID4gMAorCSAgICAmJiAoKFNjcmVlbkxpbmVzW29mZl9mcm9tXSAhPSBTY3JlZW5MaW5lc1tvZmZfdG9dCisJCSAgICB8fCBTY3JlZW5BdHRyc1tvZmZfZnJvbV0gIT0gU2NyZWVuQXR0cnNbb2ZmX3RvXSkKKworI2lmZGVmIEZFQVRfTUJZVEUKKwkJfHwgKGVuY19kYmNzICE9IDAKKwkJICAgICYmIE1CX0JZVEUyTEVOKFNjcmVlbkxpbmVzW29mZl9mcm9tXSkgPiAxCisJCSAgICAmJiAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmIFNjcmVlbkxpbmVzW29mZl9mcm9tXSA9PSAweDhlCisJCQk/IFNjcmVlbkxpbmVzMltvZmZfZnJvbV0gIT0gU2NyZWVuTGluZXMyW29mZl90b10KKwkJCTogKGNvbHMgPiAxICYmIFNjcmVlbkxpbmVzW29mZl9mcm9tICsgMV0KKwkJCQkJCSAhPSBTY3JlZW5MaW5lc1tvZmZfdG8gKyAxXSkpKQorCQl8fCAoZW5jX3V0ZjgKKwkJICAgICYmIChTY3JlZW5MaW5lc1VDW29mZl9mcm9tXSAhPSBTY3JlZW5MaW5lc1VDW29mZl90b10KKwkJCXx8IChTY3JlZW5MaW5lc1VDW29mZl9mcm9tXSAhPSAwCisJCQkgICAgJiYgKFNjcmVlbkxpbmVzQzFbb2ZmX2Zyb21dCisJCQkJCQkgICAgICAhPSBTY3JlZW5MaW5lc0MxW29mZl90b10KKwkJCQl8fCBTY3JlZW5MaW5lc0MyW29mZl9mcm9tXQorCQkJCQkJICAhPSBTY3JlZW5MaW5lc0MyW29mZl90b10pKSkpCisjZW5kaWYKKwkgICAgICAgKSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBNb3ZlIG9uZSAiY29va2VkIiBzY3JlZW4gbGluZSB0byB0aGUgc2NyZWVuLCBidXQgb25seSB0aGUgY2hhcmFjdGVycyB0aGF0CisgKiBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuICBIYW5kbGUgaW5zZXJ0L2RlbGV0ZSBjaGFyYWN0ZXIuCisgKiAiY29sb2ZmIiBnaXZlcyB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4gZm9yIHRoaXMgbGluZS4KKyAqICJlbmRjb2wiIGdpdmVzIHRoZSBjb2x1bW5zIHdoZXJlIHZhbGlkIGNoYXJhY3RlcnMgYXJlLgorICogImNsZWFyX3dpZHRoIiBpcyB0aGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gIEl0J3MgPiAwIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lCisgKiBuZWVkcyB0byBiZSBjbGVhcmVkLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKiAicmxmbGFnIiBpcyBUUlVFIGluIGEgcmlnaHRsZWZ0IHdpbmRvdzoKKyAqICAgIFdoZW4gVFJVRSBhbmQgImNsZWFyX3dpZHRoIiA+IDAsIGNsZWFyIGNvbHVtbnMgMCB0byAiZW5kY29sIgorICogICAgV2hlbiBGQUxTRSBhbmQgImNsZWFyX3dpZHRoIiA+IDAsIGNsZWFyIGNvbHVtbnMgImVuZGNvbCIgdG8gImNsZWFyX3dpZHRoIgorICovCisgICAgc3RhdGljIHZvaWQKK3NjcmVlbl9saW5lKHJvdywgY29sb2ZmLCBlbmRjb2wsIGNsZWFyX3dpZHRoCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJCQkgICAgLCBybGZsYWcKKyNlbmRpZgorCQkJCQkJKQorICAgIGludAkgICAgcm93OworICAgIGludAkgICAgY29sb2ZmOworICAgIGludAkgICAgZW5kY29sOworICAgIGludAkgICAgY2xlYXJfd2lkdGg7CisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpbnQJICAgIHJsZmxhZzsKKyNlbmRpZgoreworICAgIHVuc2lnbmVkCSAgICBvZmZfZnJvbTsKKyAgICB1bnNpZ25lZAkgICAgb2ZmX3RvOworICAgIGludAkJICAgIGNvbCA9IDA7CisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfVkVSVFNQTElUKQorICAgIGludAkJICAgIGhsOworI2VuZGlmCisgICAgaW50CQkgICAgZm9yY2UgPSBGQUxTRTsJLyogZm9yY2UgdXBkYXRlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KKyAgICBpbnQJCSAgICByZWRyYXdfdGhpcwkJLyogYm9vbDogZG9lcyBjaGFyYWN0ZXIgbmVlZCByZWRyYXc/ICovCisjaWZkZWYgRkVBVF9HVUkKKwkJCQk9IFRSVUUJLyogRm9yIEdVSSB3aGVuIHdoaWxlLWxvb3AgZW1wdHkgKi8KKyNlbmRpZgorCQkJCTsKKyAgICBpbnQJCSAgICByZWRyYXdfbmV4dDsJLyogcmVkcmF3X3RoaXMgZm9yIG5leHQgY2hhcmFjdGVyICovCisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJICAgIGNsZWFyX25leHQgPSBGQUxTRTsKKyAgICBpbnQJCSAgICBjaGFyX2NlbGxzOwkJLyogMTogbm9ybWFsIGNoYXIgKi8KKwkJCQkJLyogMjogb2NjdXBpZXMgdHdvIGRpc3BsYXkgY2VsbHMgKi8KKyMgZGVmaW5lIENIQVJfQ0VMTFMgY2hhcl9jZWxscworI2Vsc2UKKyMgZGVmaW5lIENIQVJfQ0VMTFMgMQorI2VuZGlmCisKKyMgaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICBjbGlwX21heV9jbGVhcl9zZWxlY3Rpb24ocm93LCByb3cpOworIyBlbmRpZgorCisgICAgb2ZmX2Zyb20gPSAodW5zaWduZWQpKGN1cnJlbnRfU2NyZWVuTGluZSAtIFNjcmVlbkxpbmVzKTsKKyAgICBvZmZfdG8gPSBMaW5lT2Zmc2V0W3Jvd10gKyBjb2xvZmY7CisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGlmIChybGZsYWcpCisgICAgeworCS8qIENsZWFyIHJlc3QgZmlyc3QsIGJlY2F1c2UgaXQncyBsZWZ0IG9mIHRoZSB0ZXh0LiAqLworCWlmIChjbGVhcl93aWR0aCA+IDApCisJeworCSAgICB3aGlsZSAoY29sIDw9IGVuZGNvbCAmJiBTY3JlZW5MaW5lc1tvZmZfdG9dID09ICcgJworCQkgICAgJiYgU2NyZWVuQXR0cnNbb2ZmX3RvXSA9PSAwCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCQkgICYmICghZW5jX3V0ZjggfHwgU2NyZWVuTGluZXNVQ1tvZmZfdG9dID09IDApCisjIGVuZGlmCisJCQkJCQkgICkKKwkgICAgeworCQkrK29mZl90bzsKKwkJKytjb2w7CisJICAgIH0KKwkgICAgaWYgKGNvbCA8PSBlbmRjb2wpCisJCXNjcmVlbl9maWxsKHJvdywgcm93ICsgMSwgY29sICsgY29sb2ZmLAorCQkJCQkgICAgZW5kY29sICsgY29sb2ZmICsgMSwgJyAnLCAnICcsIDApOworCX0KKwljb2wgPSBlbmRjb2wgKyAxOworCW9mZl90byA9IExpbmVPZmZzZXRbcm93XSArIGNvbCArIGNvbG9mZjsKKwlvZmZfZnJvbSArPSBjb2w7CisJZW5kY29sID0gKGNsZWFyX3dpZHRoID4gMCA/IGNsZWFyX3dpZHRoIDogLWNsZWFyX3dpZHRoKTsKKyAgICB9CisjZW5kaWYgLyogRkVBVF9SSUdIVExFRlQgKi8KKworICAgIHJlZHJhd19uZXh0ID0gY2hhcl9uZWVkc19yZWRyYXcob2ZmX2Zyb20sIG9mZl90bywgZW5kY29sIC0gY29sKTsKKworICAgIHdoaWxlIChjb2wgPCBlbmRjb2wpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlICYmIChjb2wgKyAxIDwgZW5kY29sKSkKKwkgICAgY2hhcl9jZWxscyA9ICgqbWJfb2ZmMmNlbGxzKShvZmZfZnJvbSk7CisJZWxzZQorCSAgICBjaGFyX2NlbGxzID0gMTsKKyNlbmRpZgorCisJcmVkcmF3X3RoaXMgPSByZWRyYXdfbmV4dDsKKwlyZWRyYXdfbmV4dCA9IGZvcmNlIHx8IGNoYXJfbmVlZHNfcmVkcmF3KG9mZl9mcm9tICsgQ0hBUl9DRUxMUywKKwkJCSAgICAgIG9mZl90byArIENIQVJfQ0VMTFMsIGVuZGNvbCAtIGNvbCAtIENIQVJfQ0VMTFMpOworCisjaWZkZWYgRkVBVF9HVUkKKwkvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgd2FzIGJvbGQsIHRoZW4gcmVkcmF3IHRoZSBjdXJyZW50IGNoYXJhY3RlciB0bworCSAqIHJlbW92ZSBhbnkgcGl4ZWxzIHRoYXQgbWlnaHQgaGF2ZSBzcGlsdCBvdmVyIGludG8gdXMuICBUaGlzIG9ubHkKKwkgKiBoYXBwZW5zIGluIHRoZSBHVUkuCisJICovCisJaWYgKHJlZHJhd19uZXh0ICYmIGd1aS5pbl91c2UpCisJeworCSAgICBobCA9IFNjcmVlbkF0dHJzW29mZl90byArIENIQVJfQ0VMTFNdOworCSAgICBpZiAoaGwgPiBITF9BTEwgfHwgKGhsICYgSExfQk9MRCkpCisJCXJlZHJhd190aGlzID0gVFJVRTsKKwl9CisjZW5kaWYKKworCWlmIChyZWRyYXdfdGhpcykKKwl7CisJICAgIC8qCisJICAgICAqIFNwZWNpYWwgaGFuZGxpbmcgd2hlbiAneHMnIHRlcm1jYXAgZmxhZyBzZXQgKGhwdGVybSk6CisJICAgICAqIEF0dHJpYnV0ZXMgZm9yIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCBhdCB0aGUgcG9zaXRpb24gd2hlcmUgdGhlCisJICAgICAqIGN1cnNvciBpcyB3aGVuIHdyaXRpbmcgdGhlIGhpZ2hsaWdodGluZyBjb2RlLiAgVGhlCisJICAgICAqIHN0YXJ0LWhpZ2hsaWdodGluZyBjb2RlIG11c3QgYmUgd3JpdHRlbiB3aXRoIHRoZSBjdXJzb3Igb24gdGhlCisJICAgICAqIGZpcnN0IGhpZ2hsaWdodGVkIGNoYXJhY3Rlci4gIFRoZSBzdG9wLWhpZ2hsaWdodGluZyBjb2RlIG11c3QKKwkgICAgICogYmUgd3JpdHRlbiB3aXRoIHRoZSBjdXJzb3IganVzdCBhZnRlciB0aGUgbGFzdCBoaWdobGlnaHRlZAorCSAgICAgKiBjaGFyYWN0ZXIuCisJICAgICAqIE92ZXJ3cml0aW5nIGEgY2hhcmFjdGVyIGRvZXNuJ3QgcmVtb3ZlIGl0J3MgaGlnaGxpZ2h0aW5nLiAgTmVlZAorCSAgICAgKiB0byBjbGVhciB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIGZvcmNlIHJlZHJhd2luZyBpdAorCSAgICAgKiBjb21wbGV0ZWx5LgorCSAgICAgKi8KKwkgICAgaWYgKCAgICAgICBwX3dpdgorCQkgICAgJiYgIWZvcmNlCisjaWZkZWYgRkVBVF9HVUkKKwkJICAgICYmICFndWkuaW5fdXNlCisjZW5kaWYKKwkJICAgICYmIFNjcmVlbkF0dHJzW29mZl90b10gIT0gMAorCQkgICAgJiYgU2NyZWVuQXR0cnNbb2ZmX2Zyb21dICE9IFNjcmVlbkF0dHJzW29mZl90b10pCisJICAgIHsKKwkJLyoKKwkJICogTmVlZCB0byByZW1vdmUgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZXMgaGVyZS4KKwkJICovCisJCXdpbmRnb3RvKHJvdywgY29sICsgY29sb2ZmKTsKKwkJb3V0X3N0cihUX0NFKTsJCS8qIGNsZWFyIHJlc3Qgb2YgdGhpcyBzY3JlZW4gbGluZSAqLworCQlzY3JlZW5fc3RhcnQoKTsJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCQlmb3JjZSA9IFRSVUU7CQkvKiBmb3JjZSByZWRyYXcgb2YgcmVzdCBvZiB0aGUgbGluZSAqLworCQlyZWRyYXdfbmV4dCA9IFRSVUU7CS8qIG9yIGVsc2UgbmV4dCBjaGFyIHdvdWxkIG1pc3Mgb3V0ICovCisKKwkJLyoKKwkJICogSWYgdGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgaGlnaGxpZ2h0ZWQsIG5lZWQgdG8gc3RvcAorCQkgKiBoaWdobGlnaHRpbmcgYXQgdGhpcyBjaGFyYWN0ZXIuCisJCSAqLworCQlpZiAoY29sICsgY29sb2ZmID4gMCAmJiBTY3JlZW5BdHRyc1tvZmZfdG8gLSAxXSAhPSAwKQorCQl7CisJCSAgICBzY3JlZW5fYXR0ciA9IFNjcmVlbkF0dHJzW29mZl90byAtIDFdOworCQkgICAgdGVybV93aW5kZ290byhyb3csIGNvbCArIGNvbG9mZik7CisJCSAgICBzY3JlZW5fc3RvcF9oaWdobGlnaHQoKTsKKwkJfQorCQllbHNlCisJCSAgICBzY3JlZW5fYXR0ciA9IDA7CSAgICAvKiBoaWdobGlnaHRpbmcgaGFzIHN0b3BwZWQgKi8KKwkgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGVuY19kYmNzICE9IDApCisJICAgIHsKKwkJLyogQ2hlY2sgaWYgb3ZlcndyaXRpbmcgYSBkb3VibGUtYnl0ZSB3aXRoIGEgc2luZ2xlLWJ5dGUgb3IKKwkJICogdGhlIG90aGVyIHdheSBhcm91bmQgcmVxdWlyZXMgYW5vdGhlciBjaGFyYWN0ZXIgdG8gYmUKKwkJICogcmVkcmF3bi4gIEZvciBVVEYtOCB0aGlzIGlzbid0IG5lZWRlZCwgYmVjYXVzZSBjb21wYXJpbmcKKwkJICogU2NyZWVuTGluZXNVQ1tdIGlzIHN1ZmZpY2llbnQuICovCisJCWlmIChjaGFyX2NlbGxzID09IDEKKwkJCSYmIGNvbCArIDEgPCBlbmRjb2wKKwkJCSYmICgqbWJfb2ZmMmNlbGxzKShvZmZfdG8pID4gMSkKKwkJeworCQkgICAgLyogV3JpdGluZyBhIHNpbmdsZS1jZWxsIGNoYXJhY3RlciBvdmVyIGEgZG91YmxlLWNlbGwKKwkJICAgICAqIGNoYXJhY3RlcjogbmVlZCB0byByZWRyYXcgdGhlIG5leHQgY2VsbC4gKi8KKwkJICAgIFNjcmVlbkxpbmVzW29mZl90byArIDFdID0gMDsKKwkJICAgIHJlZHJhd19uZXh0ID0gVFJVRTsKKwkJfQorCQllbHNlIGlmIChjaGFyX2NlbGxzID09IDIKKwkJCSYmIGNvbCArIDIgPCBlbmRjb2wKKwkJCSYmICgqbWJfb2ZmMmNlbGxzKShvZmZfdG8pID09IDEKKwkJCSYmICgqbWJfb2ZmMmNlbGxzKShvZmZfdG8gKyAxKSA+IDEpCisJCXsKKwkJICAgIC8qIFdyaXRpbmcgdGhlIHNlY29uZCBoYWxmIG9mIGEgZG91YmxlLWNlbGwgY2hhcmFjdGVyIG92ZXIKKwkJICAgICAqIGEgZG91YmxlLWNlbGwgY2hhcmFjdGVyOiBuZWVkIHRvIHJlZHJhdyB0aGUgc2Vjb25kCisJCSAgICAgKiBjZWxsLiAqLworCQkgICAgU2NyZWVuTGluZXNbb2ZmX3RvICsgMl0gPSAwOworCQkgICAgcmVkcmF3X25leHQgPSBUUlVFOworCQl9CisKKwkJaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwkJICAgIFNjcmVlbkxpbmVzMltvZmZfdG9dID0gU2NyZWVuTGluZXMyW29mZl9mcm9tXTsKKwkgICAgfQorCSAgICAvKiBXaGVuIHdyaXRpbmcgYSBzaW5nbGUtd2lkdGggY2hhcmFjdGVyIG92ZXIgYSBkb3VibGUtd2lkdGgKKwkgICAgICogY2hhcmFjdGVyIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSByZWRyYXduIHRleHQsIG5lZWQgdG8gY2xlYXIgb3V0CisJICAgICAqIHRoZSByaWdodCBoYWx2ZSBvZiB0aGUgb2xkIGNoYXJhY3Rlci4KKwkgICAgICogQWxzbyByZXF1aXJlZCB3aGVuIHdyaXRpbmcgdGhlIHJpZ2h0IGhhbHZlIG9mIGEgZG91YmxlLXdpZHRoCisJICAgICAqIGNoYXIgb3ZlciB0aGUgbGVmdCBoYWx2ZSBvZiBhbiBleGlzdGluZyBvbmUuICovCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgY29sICsgY2hhcl9jZWxscyA9PSBlbmRjb2wKKwkJICAgICYmICgoY2hhcl9jZWxscyA9PSAxCisJCQkgICAgJiYgKCptYl9vZmYyY2VsbHMpKG9mZl90bykgPiAxKQorCQkJfHwgKGNoYXJfY2VsbHMgPT0gMgorCQkJICAgICYmICgqbWJfb2ZmMmNlbGxzKShvZmZfdG8pID09IDEKKwkJCSAgICAmJiAoKm1iX29mZjJjZWxscykob2ZmX3RvICsgMSkgPiAxKSkpCisJCWNsZWFyX25leHQgPSBUUlVFOworI2VuZGlmCisKKwkgICAgU2NyZWVuTGluZXNbb2ZmX3RvXSA9IFNjcmVlbkxpbmVzW29mZl9mcm9tXTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChlbmNfdXRmOCkKKwkgICAgeworCQlTY3JlZW5MaW5lc1VDW29mZl90b10gPSBTY3JlZW5MaW5lc1VDW29mZl9mcm9tXTsKKwkJaWYgKFNjcmVlbkxpbmVzVUNbb2ZmX2Zyb21dICE9IDApCisJCXsKKwkJICAgIFNjcmVlbkxpbmVzQzFbb2ZmX3RvXSA9IFNjcmVlbkxpbmVzQzFbb2ZmX2Zyb21dOworCQkgICAgU2NyZWVuTGluZXNDMltvZmZfdG9dID0gU2NyZWVuTGluZXNDMltvZmZfZnJvbV07CisJCX0KKwkgICAgfQorCSAgICBpZiAoY2hhcl9jZWxscyA9PSAyKQorCQlTY3JlZW5MaW5lc1tvZmZfdG8gKyAxXSA9IFNjcmVlbkxpbmVzW29mZl9mcm9tICsgMV07CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoVU5JWCkKKwkgICAgLyogVGhlIGJvbGQgdHJpY2sgbWFrZXMgYSBzaW5nbGUgcm93IG9mIHBpeGVscyBhcHBlYXIgaW4gdGhlIG5leHQKKwkgICAgICogY2hhcmFjdGVyLiAgV2hlbiBhIGJvbGQgY2hhcmFjdGVyIGlzIHJlbW92ZWQsIHRoZSBuZXh0CisJICAgICAqIGNoYXJhY3RlciBzaG91bGQgYmUgcmVkcmF3biB0b28uICBUaGlzIGhhcHBlbnMgZm9yIG91ciBvd24gR1VJCisJICAgICAqIGFuZCBmb3Igc29tZSB4dGVybXMuICovCisJICAgIGlmICgKKyMgaWZkZWYgRkVBVF9HVUkKKwkJICAgIGd1aS5pbl91c2UKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChVTklYKQorCQkgICAgfHwKKyMgZW5kaWYKKyMgaWZkZWYgVU5JWAorCQkgICAgdGVybV9pc194dGVybQorIyBlbmRpZgorCQkgICAgKQorCSAgICB7CisJCWhsID0gU2NyZWVuQXR0cnNbb2ZmX3RvXTsKKwkJaWYgKGhsID4gSExfQUxMIHx8IChobCAmIEhMX0JPTEQpKQorCQkgICAgcmVkcmF3X25leHQgPSBUUlVFOworCSAgICB9CisjZW5kaWYKKwkgICAgU2NyZWVuQXR0cnNbb2ZmX3RvXSA9IFNjcmVlbkF0dHJzW29mZl9mcm9tXTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChlbmNfZGJjcyAhPSAwICYmIGNoYXJfY2VsbHMgPT0gMikKKwkgICAgeworCQkvKiBqdXN0IGEgaGFjazogSXQgbWFrZXMgdHdvIGJ5dGVzIG9mIERCQ1MgaGF2ZSBzYW1lIGF0dHIgKi8KKwkJU2NyZWVuQXR0cnNbb2ZmX3RvICsgMV0gPSBTY3JlZW5BdHRyc1tvZmZfZnJvbV07CisJCXNjcmVlbl9jaGFyXzIob2ZmX3RvLCByb3csIGNvbCArIGNvbG9mZik7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCXNjcmVlbl9jaGFyKG9mZl90bywgcm93LCBjb2wgKyBjb2xvZmYpOworCX0KKwllbHNlIGlmICggIHBfd2l2CisjaWZkZWYgRkVBVF9HVUkKKwkJJiYgIWd1aS5pbl91c2UKKyNlbmRpZgorCQkmJiBjb2wgKyBjb2xvZmYgPiAwKQorCXsKKwkgICAgaWYgKFNjcmVlbkF0dHJzW29mZl90b10gPT0gU2NyZWVuQXR0cnNbb2ZmX3RvIC0gMV0pCisJICAgIHsKKwkJLyoKKwkJICogRG9uJ3Qgb3V0cHV0IHN0b3AtaGlnaGxpZ2h0IHdoZW4gbW92aW5nIHRoZSBjdXJzb3IsIGl0IHdpbGwKKwkJICogc3RvcCB0aGUgaGlnaGxpZ2h0aW5nIHdoZW4gaXQgc2hvdWxkIGNvbnRpbnVlLgorCQkgKi8KKwkJc2NyZWVuX2F0dHIgPSAwOworCSAgICB9CisJICAgIGVsc2UgaWYgKHNjcmVlbl9hdHRyICE9IDApCisJCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworCX0KKworCW9mZl90byArPSBDSEFSX0NFTExTOworCW9mZl9mcm9tICs9IENIQVJfQ0VMTFM7CisJY29sICs9IENIQVJfQ0VMTFM7CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChjbGVhcl9uZXh0KQorICAgIHsKKwkvKiBDbGVhciB0aGUgc2Vjb25kIGhhbGYgb2YgYSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIgb2Ygd2hpY2ggdGhlIGxlZnQKKwkgKiBoYWxmIHdhcyBvdmVyd3JpdHRlbiB3aXRoIGEgc2luZ2xlLXdpZGUgY2hhcmFjdGVyLiAqLworCVNjcmVlbkxpbmVzW29mZl90b10gPSAnICc7CisJaWYgKGVuY191dGY4KQorCSAgICBTY3JlZW5MaW5lc1VDW29mZl90b10gPSAwOworCXNjcmVlbl9jaGFyKG9mZl90bywgcm93LCBjb2wgKyBjb2xvZmYpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGNsZWFyX3dpZHRoID4gMAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCSAgICAmJiAhcmxmbGFnCisjZW5kaWYKKwkJCQkgICApCisgICAgeworI2lmZGVmIEZFQVRfR1VJCisJaW50IHN0YXJ0Q29sID0gY29sOworI2VuZGlmCisKKwkvKiBibGFuayBvdXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KKwl3aGlsZSAoY29sIDwgY2xlYXJfd2lkdGggJiYgU2NyZWVuTGluZXNbb2ZmX3RvXSA9PSAnICcKKwkJCQkJCSAgJiYgU2NyZWVuQXR0cnNbb2ZmX3RvXSA9PSAwCisjaWZkZWYgRkVBVF9NQllURQorCQkJCSAgJiYgKCFlbmNfdXRmOCB8fCBTY3JlZW5MaW5lc1VDW29mZl90b10gPT0gMCkKKyNlbmRpZgorCQkJCQkJICApCisJeworCSAgICArK29mZl90bzsKKwkgICAgKytjb2w7CisJfQorCWlmIChjb2wgPCBjbGVhcl93aWR0aCkKKwl7CisjaWZkZWYgRkVBVF9HVUkKKwkgICAgLyoKKwkgICAgICogSW4gdGhlIEdVSSwgY2xlYXJpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgbWF5IGxlYXZlIHBpeGVscworCSAgICAgKiBiZWhpbmQgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBjbGVhcmVkIHdhcyBib2xkLiAgU29tZSBib2xkCisJICAgICAqIGZvbnRzIHNwaWxsIG92ZXIgdGhlIGxlZnQuICBJbiB0aGlzIGNhc2Ugd2UgcmVkcmF3IHRoZSBwcmV2aW91cworCSAgICAgKiBjaGFyYWN0ZXIgdG9vLiAgSWYgd2UgZGlkbid0IHNraXAgYW55IGJsYW5rcyBhYm92ZSwgdGhlbiB3ZQorCSAgICAgKiBvbmx5IHJlZHJhdyBpZiB0aGUgY2hhcmFjdGVyIHdhc24ndCBhbHJlYWR5IHJlZHJhd24gYW55d2F5LgorCSAgICAgKi8KKwkgICAgaWYgKGd1aS5pbl91c2UgJiYgKGNvbCA+IHN0YXJ0Q29sIHx8ICFyZWRyYXdfdGhpcykKKyMgaWZkZWYgRkVBVF9NQllURQorCQkgICAgJiYgZW5jX2RiY3MgPT0gMAorIyBlbmRpZgorCSAgICAgICApCisJICAgIHsKKwkJaGwgPSBTY3JlZW5BdHRyc1tvZmZfdG9dOworCQlpZiAoaGwgPiBITF9BTEwgfHwgKGhsICYgSExfQk9MRCkpCisJCSAgICBzY3JlZW5fY2hhcihvZmZfdG8gLSAxLCByb3csIGNvbCArIGNvbG9mZiAtIDEpOworCSAgICB9CisjZW5kaWYKKwkgICAgc2NyZWVuX2ZpbGwocm93LCByb3cgKyAxLCBjb2wgKyBjb2xvZmYsIGNsZWFyX3dpZHRoICsgY29sb2ZmLAorCQkJCQkJCQkgJyAnLCAnICcsIDApOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIG9mZl90byArPSBjbGVhcl93aWR0aCAtIGNvbDsKKwkgICAgY29sID0gY2xlYXJfd2lkdGg7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgaWYgKGNsZWFyX3dpZHRoID4gMCkKKyAgICB7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkvKiBGb3IgYSB3aW5kb3cgdGhhdCdzIGxlZnQgb2YgYW5vdGhlciwgZHJhdyB0aGUgc2VwYXJhdG9yIGNoYXIuICovCisJaWYgKGNvbCArIGNvbG9mZiA8IENvbHVtbnMpCisJeworCSAgICBpbnQgYzsKKworCSAgICBjID0gZmlsbGNoYXJfdnNlcCgmaGwpOworCSAgICBpZiAoU2NyZWVuTGluZXNbb2ZmX3RvXSAhPSBjCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJICAgIHx8IChlbmNfdXRmOAorCQkJICAgICAgJiYgU2NyZWVuTGluZXNVQ1tvZmZfdG9dICE9IChjID49IDB4ODAgPyBjIDogMCkpCisjIGVuZGlmCisJCSAgICB8fCBTY3JlZW5BdHRyc1tvZmZfdG9dICE9IGhsKQorCSAgICB7CisJCVNjcmVlbkxpbmVzW29mZl90b10gPSBjOworCQlTY3JlZW5BdHRyc1tvZmZfdG9dID0gaGw7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGVuY191dGY4KQorCQl7CisJCSAgICBpZiAoYyA+PSAweDgwKQorCQkgICAgeworCQkJU2NyZWVuTGluZXNVQ1tvZmZfdG9dID0gYzsKKwkJCVNjcmVlbkxpbmVzQzFbb2ZmX3RvXSA9IDA7CisJCQlTY3JlZW5MaW5lc0MyW29mZl90b10gPSAwOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJU2NyZWVuTGluZXNVQ1tvZmZfdG9dID0gMDsKKwkJfQorIyBlbmRpZgorCQlzY3JlZW5fY2hhcihvZmZfdG8sIHJvdywgY29sICsgY29sb2ZmKTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwkgICAgTGluZVdyYXBzW3Jvd10gPSBGQUxTRTsKKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorLyoKKyAqIE1pcnJvciB0ZXh0ICJzdHIiIGZvciByaWdodC1saWVmdCBkaXNwbGF5aW5nLgorICovCisgICAgc3RhdGljIHZvaWQKK3JsX21pcnJvcihzdHIpCisgICAgY2hhcl91CSpzdHI7Cit7CisgICAgY2hhcl91CSpwMSwgKnAyOworICAgIGludAkJdDsKKworICAgIGZvciAocDEgPSBzdHIsIHAyID0gc3RyICsgU1RSTEVOKHN0cikgLSAxOyBwMSA8IHAyOyArK3AxLCAtLXAyKQorICAgIHsKKwl0ID0gKnAxOworCSpwMSA9ICpwMjsKKwkqcDIgPSB0OworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogbWFyayBhbGwgc3RhdHVzIGxpbmVzIGZvciByZWRyYXc7IHVzZWQgYWZ0ZXIgZmlyc3QgOmNkCisgKi8KKyAgICB2b2lkCitzdGF0dXNfcmVkcmF3X2FsbCgpCit7CisgICAgd2luX1QJKndwOworCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICh3cC0+d19zdGF0dXNfaGVpZ2h0KQorCXsKKwkgICAgd3AtPndfcmVkcl9zdGF0dXMgPSBUUlVFOworCSAgICByZWRyYXdfbGF0ZXIoVkFMSUQpOworCX0KK30KKworLyoKKyAqIG1hcmsgYWxsIHN0YXR1cyBsaW5lcyBvZiB0aGUgY3VycmVudCBidWZmZXIgZm9yIHJlZHJhdworICovCisgICAgdm9pZAorc3RhdHVzX3JlZHJhd19jdXJidWYoKQoreworICAgIHdpbl9UCSp3cDsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3A7IHdwID0gd3AtPndfbmV4dCkKKwlpZiAod3AtPndfc3RhdHVzX2hlaWdodCAhPSAwICYmIHdwLT53X2J1ZmZlciA9PSBjdXJidWYpCisJeworCSAgICB3cC0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisJICAgIHJlZHJhd19sYXRlcihWQUxJRCk7CisJfQorfQorCisvKgorICogUmVkcmF3IGFsbCBzdGF0dXMgbGluZXMgdGhhdCBuZWVkIHRvIGJlIHJlZHJhd24uCisgKi8KKyAgICB2b2lkCityZWRyYXdfc3RhdHVzbGluZXMoKQoreworICAgIHdpbl9UCSp3cDsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3A7IHdwID0gd3AtPndfbmV4dCkKKwlpZiAod3AtPndfcmVkcl9zdGF0dXMpCisJICAgIHdpbl9yZWRyX3N0YXR1cyh3cCk7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKEZFQVRfV0lMRE1FTlUpICYmIGRlZmluZWQoRkVBVF9WRVJUU1BMSVQpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlZHJhdyBhbGwgc3RhdHVzIGxpbmVzIGF0IHRoZSBib3R0b20gb2YgZnJhbWUgImZycCIuCisgKi8KKyAgICB2b2lkCit3aW5fcmVkcmF3X2xhc3Rfc3RhdHVzKGZycCkKKyAgICBmcmFtZV9UCSpmcnA7Cit7CisgICAgaWYgKGZycC0+ZnJfbGF5b3V0ID09IEZSX0xFQUYpCisJZnJwLT5mcl93aW4tPndfcmVkcl9zdGF0dXMgPSBUUlVFOworICAgIGVsc2UgaWYgKGZycC0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKyAgICB7CisJZm9yIChmcnAgPSBmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCSAgICB3aW5fcmVkcmF3X2xhc3Rfc3RhdHVzKGZycCk7CisgICAgfQorICAgIGVsc2UgLyogZnJwLT5mcl9sYXlvdXQgPT0gRlJfQ09MICovCisgICAgeworCWZycCA9IGZycC0+ZnJfY2hpbGQ7CisJd2hpbGUgKGZycC0+ZnJfbmV4dCAhPSBOVUxMKQorCSAgICBmcnAgPSBmcnAtPmZyX25leHQ7CisJd2luX3JlZHJhd19sYXN0X3N0YXR1cyhmcnApOworICAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKy8qCisgKiBEcmF3IHRoZSB2ZXJ0aWNhcCBzZXBhcmF0b3IgcmlnaHQgb2Ygd2luZG93ICJ3cCIgc3RhcnRpbmcgd2l0aCBsaW5lICJyb3ciLgorICovCisgICAgc3RhdGljIHZvaWQKK2RyYXdfdnNlcF93aW4od3AsIHJvdykKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQlyb3c7Cit7CisgICAgaW50CQlobDsKKyAgICBpbnQJCWM7CisKKyAgICBpZiAod3AtPndfdnNlcF93aWR0aCkKKyAgICB7CisJLyogZHJhdyB0aGUgdmVydGljYWwgc2VwYXJhdG9yIHJpZ2h0IG9mIHRoaXMgd2luZG93ICovCisJYyA9IGZpbGxjaGFyX3ZzZXAoJmhsKTsKKwlzY3JlZW5fZmlsbChXX1dJTlJPVyh3cCkgKyByb3csIFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodCwKKwkJV19FTkRDT0wod3ApLCBXX0VORENPTCh3cCkgKyAxLAorCQljLCAnICcsIGhsKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfV0lMRE1FTlUKK3N0YXRpYyBpbnQgc3RhdHVzX21hdGNoX2xlbiBfX0FSR1MoKGV4cGFuZF9UICp4cCwgY2hhcl91ICpzKSk7CisKKy8qCisgKiBHZXQgdGhlIGxlbmdodCBvZiBhbiBpdGVtIGFzIGl0IHdpbGwgYmUgc2hvd24gaW4gdGhlIHN0YXR1cyBsaW5lLgorICovCisgICAgc3RhdGljIGludAorc3RhdHVzX21hdGNoX2xlbih4cCwgcykKKyAgICBleHBhbmRfVAkqeHA7CisgICAgY2hhcl91CSpzOworeworICAgIGludAlsZW4gPSAwOworCisjaWZkZWYgRkVBVF9NRU5VCisgICAgaW50IGVtZW51ID0gKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9NRU5VUworCSAgICB8fCB4cC0+eHBfY29udGV4dCA9PSBFWFBBTkRfTUVOVU5BTUVTKTsKKworICAgIC8qIENoZWNrIGZvciBtZW51IHNlcGFyYXRvcnMgLSByZXBsYWNlIHdpdGggJ3wnLiAqLworICAgIGlmIChlbWVudSAmJiBtZW51X2lzX3NlcGFyYXRvcihzKSkKKwlyZXR1cm4gMTsKKyNlbmRpZgorCisgICAgd2hpbGUgKCpzICE9IE5VTCkKKyAgICB7CisJLyogRG9uJ3QgZGlzcGxheSBiYWNrc2xhc2hlcyB1c2VkIGZvciBlc2NhcGluZywgdGhleSBsb29rIHVnbHkuICovCisJaWYgKHJlbV9iYWNrc2xhc2gocykKKyNpZmRlZiBGRUFUX01FTlUKKwkJfHwgKGVtZW51ICYmIChzWzBdID09ICdcXCcgJiYgc1sxXSAhPSBOVUwpKQorI2VuZGlmCisJCSkKKwkgICAgKytzOworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgbGVuICs9IHB0cjJjZWxscyhzKTsKKwkgICAgcyArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgbGVuICs9IHB0cjJjZWxscyhzKyspOworCisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFNob3cgd2lsZGNoYXIgbWF0Y2hlcyBpbiB0aGUgc3RhdHVzIGxpbmUuCisgKiBTaG93IGF0IGxlYXN0IHRoZSAibWF0Y2giIGl0ZW0uCisgKiBXZSBzdGFydCBhdCBpdGVtICdmaXJzdF9tYXRjaCcgaW4gdGhlIGxpc3QgYW5kIHNob3cgYWxsIG1hdGNoZXMgdGhhdCBmaXQuCisgKgorICogSWYgaW52ZXJzaW9uIGlzIHBvc3NpYmxlIHdlIHVzZSBpdC4gRWxzZSAnPScgY2hhcmFjdGVycyBhcmUgdXNlZC4KKyAqLworICAgIHZvaWQKK3dpbl9yZWRyX3N0YXR1c19tYXRjaGVzKHhwLCBudW1fbWF0Y2hlcywgbWF0Y2hlcywgbWF0Y2gsIHNob3d0YWlsKQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBpbnQJCW51bV9tYXRjaGVzOworICAgIGNoYXJfdQkqKm1hdGNoZXM7CS8qIGxpc3Qgb2YgbWF0Y2hlcyAqLworICAgIGludAkJbWF0Y2g7CisgICAgaW50CQlzaG93dGFpbDsKK3sKKyNkZWZpbmUgTF9NQVRDSChtKSAoc2hvd3RhaWwgPyBzbV9nZXR0YWlsKG1hdGNoZXNbbV0pIDogbWF0Y2hlc1ttXSkKKyAgICBpbnQJCXJvdzsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWNsZW47CQkvKiBsZW5naHQgaW4gc2NyZWVuIGNlbGxzICovCisgICAgaW50CQlmaWxsY2hhcjsKKyAgICBpbnQJCWF0dHI7CisgICAgaW50CQlpOworICAgIGludAkJaGlnaGxpZ2h0ID0gVFJVRTsKKyAgICBjaGFyX3UJKnNlbHN0YXJ0ID0gTlVMTDsKKyAgICBpbnQJCXNlbHN0YXJ0X2NvbCA9IDA7CisgICAgY2hhcl91CSpzZWxlbmQgPSBOVUxMOworICAgIHN0YXRpYyBpbnQJZmlyc3RfbWF0Y2ggPSAwOworICAgIGludAkJYWRkX2xlZnQgPSBGQUxTRTsKKyAgICBjaGFyX3UJKnM7CisjaWZkZWYgRkVBVF9NRU5VCisgICAgaW50CQllbWVudTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChGRUFUX01FTlUpCisgICAgaW50CQlsOworI2VuZGlmCisKKyAgICBpZiAobWF0Y2hlcyA9PSBOVUxMKQkvKiBpbnRlcnJ1cHRlZCBjb21wbGV0aW9uPyAqLworCXJldHVybjsKKworICAgIGJ1ZiA9IGFsbG9jKCh1bnNpZ25lZClDb2x1bW5zICsgMSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChtYXRjaCA9PSAtMSkJLyogZG9uJ3Qgc2hvdyBtYXRjaCBidXQgb3JpZ2luYWwgdGV4dCAqLworICAgIHsKKwltYXRjaCA9IDA7CisJaGlnaGxpZ2h0ID0gRkFMU0U7CisgICAgfQorICAgIC8qIGNvdW50IDEgZm9yIHRoZSBlbmRpbmcgIj4iICovCisgICAgY2xlbiA9IHN0YXR1c19tYXRjaF9sZW4oeHAsIExfTUFUQ0gobWF0Y2gpKSArIDM7CisgICAgaWYgKG1hdGNoID09IDApCisJZmlyc3RfbWF0Y2ggPSAwOworICAgIGVsc2UgaWYgKG1hdGNoIDwgZmlyc3RfbWF0Y2gpCisgICAgeworCS8qIGp1bXBpbmcgbGVmdCwgYXMgZmFyIGFzIHdlIGNhbiBnbyAqLworCWZpcnN0X21hdGNoID0gbWF0Y2g7CisJYWRkX2xlZnQgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIGNoZWNrIGlmIG1hdGNoIGZpdHMgb24gdGhlIHNjcmVlbiAqLworCWZvciAoaSA9IGZpcnN0X21hdGNoOyBpIDwgbWF0Y2g7ICsraSkKKwkgICAgY2xlbiArPSBzdGF0dXNfbWF0Y2hfbGVuKHhwLCBMX01BVENIKGkpKSArIDI7CisJaWYgKGZpcnN0X21hdGNoID4gMCkKKwkgICAgY2xlbiArPSAyOworCS8qIGp1bXBpbmcgcmlnaHQsIHB1dCBtYXRjaCBhdCB0aGUgbGVmdCAqLworCWlmICgobG9uZyljbGVuID4gQ29sdW1ucykKKwl7CisJICAgIGZpcnN0X21hdGNoID0gbWF0Y2g7CisJICAgIC8qIGlmIHNob3dpbmcgdGhlIGxhc3QgbWF0Y2gsIHdlIGNhbiBhZGQgc29tZSBvbiB0aGUgbGVmdCAqLworCSAgICBjbGVuID0gMjsKKwkgICAgZm9yIChpID0gbWF0Y2g7IGkgPCBudW1fbWF0Y2hlczsgKytpKQorCSAgICB7CisJCWNsZW4gKz0gc3RhdHVzX21hdGNoX2xlbih4cCwgTF9NQVRDSChpKSkgKyAyOworCQlpZiAoKGxvbmcpY2xlbiA+PSBDb2x1bW5zKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGkgPT0gbnVtX21hdGNoZXMpCisJCWFkZF9sZWZ0ID0gVFJVRTsKKwl9CisgICAgfQorICAgIGlmIChhZGRfbGVmdCkKKwl3aGlsZSAoZmlyc3RfbWF0Y2ggPiAwKQorCXsKKwkgICAgY2xlbiArPSBzdGF0dXNfbWF0Y2hfbGVuKHhwLCBMX01BVENIKGZpcnN0X21hdGNoIC0gMSkpICsgMjsKKwkgICAgaWYgKChsb25nKWNsZW4gPj0gQ29sdW1ucykKKwkJYnJlYWs7CisJICAgIC0tZmlyc3RfbWF0Y2g7CisJfQorCisgICAgZmlsbGNoYXIgPSBmaWxsY2hhcl9zdGF0dXMoJmF0dHIsIFRSVUUpOworCisgICAgaWYgKGZpcnN0X21hdGNoID09IDApCisgICAgeworCSpidWYgPSBOVUw7CisJbGVuID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlTVFJDUFkoYnVmLCAiPCAiKTsKKwlsZW4gPSAyOworICAgIH0KKyAgICBjbGVuID0gbGVuOworCisgICAgaSA9IGZpcnN0X21hdGNoOworICAgIHdoaWxlICgobG9uZykoY2xlbiArIHN0YXR1c19tYXRjaF9sZW4oeHAsIExfTUFUQ0goaSkpICsgMikgPCBDb2x1bW5zKQorICAgIHsKKwlpZiAoaSA9PSBtYXRjaCkKKwl7CisJICAgIHNlbHN0YXJ0ID0gYnVmICsgbGVuOworCSAgICBzZWxzdGFydF9jb2wgPSBjbGVuOworCX0KKworCXMgPSBMX01BVENIKGkpOworCS8qIENoZWNrIGZvciBtZW51IHNlcGFyYXRvcnMgLSByZXBsYWNlIHdpdGggJ3wnICovCisjaWZkZWYgRkVBVF9NRU5VCisJZW1lbnUgPSAoeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX01FTlVTCisJCXx8IHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9NRU5VTkFNRVMpOworCWlmIChlbWVudSAmJiBtZW51X2lzX3NlcGFyYXRvcihzKSkKKwl7CisJICAgIFNUUkNQWShidWYgKyBsZW4sIHRyYW5zY2hhcignfCcpKTsKKwkgICAgbCA9IChpbnQpU1RSTEVOKGJ1ZiArIGxlbik7CisJICAgIGxlbiArPSBsOworCSAgICBjbGVuICs9IGw7CisJfQorCWVsc2UKKyNlbmRpZgorCSAgICBmb3IgKCA7ICpzICE9IE5VTDsgKytzKQorCXsKKwkgICAgLyogRG9uJ3QgZGlzcGxheSBiYWNrc2xhc2hlcyB1c2VkIGZvciBlc2NhcGluZywgdGhleSBsb29rIHVnbHkuICovCisJICAgIGlmIChyZW1fYmFja3NsYXNoKHMpCisjaWZkZWYgRkVBVF9NRU5VCisJCSAgICB8fCAoZW1lbnUKKwkJCSAgJiYgKHNbMF0gPT0gJ1x0JyB8fCAoc1swXSA9PSAnXFwnICYmIHNbMV0gIT0gTlVMKSkpCisjZW5kaWYKKwkJICAgICkKKwkJKytzOworCSAgICBjbGVuICs9IHB0cjJjZWxscyhzKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHMpKSA+IDEpCisJICAgIHsKKwkJU1RSTkNQWShidWYgKyBsZW4sIHMsIGwpOworCQlzICs9IGwgLSAxOworCQlsZW4gKz0gbDsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQlTVFJDUFkoYnVmICsgbGVuLCB0cmFuc2NoYXJfYnl0ZSgqcykpOworCQlsZW4gKz0gKGludClTVFJMRU4oYnVmICsgbGVuKTsKKwkgICAgfQorCX0KKwlpZiAoaSA9PSBtYXRjaCkKKwkgICAgc2VsZW5kID0gYnVmICsgbGVuOworCisJKihidWYgKyBsZW4rKykgPSAnICc7CisJKihidWYgKyBsZW4rKykgPSAnICc7CisJY2xlbiArPSAyOworCWlmICgrK2kgPT0gbnVtX21hdGNoZXMpCisJCWJyZWFrOworICAgIH0KKworICAgIGlmIChpICE9IG51bV9tYXRjaGVzKQorICAgIHsKKwkqKGJ1ZiArIGxlbisrKSA9ICc+JzsKKwkrK2NsZW47CisgICAgfQorCisgICAgYnVmW2xlbl0gPSBOVUw7CisKKyAgICByb3cgPSBjbWRsaW5lX3JvdyAtIDE7CisgICAgaWYgKHJvdyA+PSAwKQorICAgIHsKKwlpZiAod2lsZF9tZW51X3Nob3dpbmcgPT0gMCkKKwl7CisJICAgIGlmIChtc2dfc2Nyb2xsZWQgPiAwKQorCSAgICB7CisJCS8qIFB1dCB0aGUgd2lsZG1lbnUganVzdCBhYm92ZSB0aGUgY29tbWFuZCBsaW5lLiAgSWYgdGhlcmUgaXMKKwkJICogbm8gcm9vbSwgc2Nyb2xsIHRoZSBzY3JlZW4gb25lIGxpbmUgdXAuICovCisJCWlmIChjbWRsaW5lX3JvdyA9PSBSb3dzIC0gMSkKKwkJeworCQkgICAgc2NyZWVuX2RlbF9saW5lcygwLCAwLCAxLCAoaW50KVJvd3MsIFRSVUUsIE5VTEwpOworCQkgICAgKyttc2dfc2Nyb2xsZWQ7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICArK2NtZGxpbmVfcm93OworCQkgICAgKytyb3c7CisJCX0KKwkJd2lsZF9tZW51X3Nob3dpbmcgPSBXTV9TQ1JPTExFRDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ3JlYXRlIHN0YXR1cyBsaW5lIGlmIG5lZWRlZCBieSBzZXR0aW5nICdsYXN0c3RhdHVzJyB0byAyLgorCQkgKiBTZXQgJ3dpbm1pbmhlaWdodCcgdG8gemVybyB0byBhdm9pZCB0aGF0IHRoZSB3aW5kb3cgaXMKKwkJICogcmVzaXplZC4gKi8KKwkJaWYgKGxhc3R3aW4tPndfc3RhdHVzX2hlaWdodCA9PSAwKQorCQl7CisJCSAgICBzYXZlX3BfbHMgPSBwX2xzOworCQkgICAgc2F2ZV9wX3dtaCA9IHBfd21oOworCQkgICAgcF9scyA9IDI7CisJCSAgICBwX3dtaCA9IDA7CisJCSAgICBsYXN0X3N0YXR1cyhGQUxTRSk7CisJCX0KKwkJd2lsZF9tZW51X3Nob3dpbmcgPSBXTV9TSE9XTjsKKwkgICAgfQorCX0KKworCXNjcmVlbl9wdXRzKGJ1Ziwgcm93LCAwLCBhdHRyKTsKKwlpZiAoc2Vsc3RhcnQgIT0gTlVMTCAmJiBoaWdobGlnaHQpCisJeworCSAgICAqc2VsZW5kID0gTlVMOworCSAgICBzY3JlZW5fcHV0cyhzZWxzdGFydCwgcm93LCBzZWxzdGFydF9jb2wsIGhsX2F0dHIoSExGX1dNKSk7CisJfQorCisJc2NyZWVuX2ZpbGwocm93LCByb3cgKyAxLCBjbGVuLCAoaW50KUNvbHVtbnMsIGZpbGxjaGFyLCBmaWxsY2hhciwgYXR0cik7CisgICAgfQorCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICB3aW5fcmVkcmF3X2xhc3Rfc3RhdHVzKHRvcGZyYW1lKTsKKyNlbHNlCisgICAgbGFzdHdpbi0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisjZW5kaWYKKyAgICB2aW1fZnJlZShidWYpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZWRyYXcgdGhlIHN0YXR1cyBsaW5lIG9mIHdpbmRvdyB3cC4KKyAqCisgKiBJZiBpbnZlcnNpb24gaXMgcG9zc2libGUgd2UgdXNlIGl0LiBFbHNlICc9JyBjaGFyYWN0ZXJzIGFyZSB1c2VkLgorICovCisgICAgdm9pZAord2luX3JlZHJfc3RhdHVzKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBpbnQJCXJvdzsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlsZW47CisgICAgaW50CQlmaWxsY2hhcjsKKyAgICBpbnQJCWF0dHI7CisgICAgaW50CQl0aGlzX3J1X2NvbDsKKworICAgIHdwLT53X3JlZHJfc3RhdHVzID0gRkFMU0U7CisgICAgaWYgKHdwLT53X3N0YXR1c19oZWlnaHQgPT0gMCkKKyAgICB7CisJLyogbm8gc3RhdHVzIGxpbmUsIGNhbiBvbmx5IGJlIGxhc3Qgd2luZG93ICovCisJcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmICghcmVkcmF3aW5nKCkpCisgICAgeworCS8qIERvbid0IHJlZHJhdyByaWdodCBub3csIGRvIGl0IGxhdGVyLiAqLworCXdwLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyAgICB9CisjaWZkZWYgRkVBVF9TVExfT1BUCisgICAgZWxzZSBpZiAoKnBfc3RsKQorICAgIHsKKwkvKiByZWRyYXcgY3VzdG9tIHN0YXR1cyBsaW5lICovCisJd2luX3JlZHJfY3VzdG9tKHdwLCBGQUxTRSk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKwlmaWxsY2hhciA9IGZpbGxjaGFyX3N0YXR1cygmYXR0ciwgd3AgPT0gY3Vyd2luKTsKKworCWlmIChidWZfc3BuYW1lKHdwLT53X2J1ZmZlcikgIT0gTlVMTCkKKwkgICAgU1RSQ1BZKE5hbWVCdWZmLCBidWZfc3BuYW1lKHdwLT53X2J1ZmZlcikpOworCWVsc2UKKwkgICAgaG9tZV9yZXBsYWNlKHdwLT53X2J1ZmZlciwgd3AtPndfYnVmZmVyLT5iX2ZuYW1lLCBOYW1lQnVmZiwKKwkJCQkJCQkgICAgICBNQVhQQVRITCwgVFJVRSk7CisJdHJhbnNfY2hhcmFjdGVycyhOYW1lQnVmZiwgTUFYUEFUSEwpOworCXAgPSBOYW1lQnVmZjsKKwlsZW4gPSAoaW50KVNUUkxFTihwKTsKKworCWlmICh3cC0+d19idWZmZXItPmJfaGVscAorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkJfHwgd3AtPndfcF9wdncKKyNlbmRpZgorCQl8fCBidWZJc0NoYW5nZWQod3AtPndfYnVmZmVyKQorCQl8fCB3cC0+d19idWZmZXItPmJfcF9ybykKKwkgICAgKihwICsgbGVuKyspID0gJyAnOworCWlmICh3cC0+d19idWZmZXItPmJfaGVscCkKKwl7CisJICAgIFNUUkNQWShwICsgbGVuLCBfKCJbaGVscF0iKSk7CisJICAgIGxlbiArPSAoaW50KVNUUkxFTihwICsgbGVuKTsKKwl9CisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCWlmICh3cC0+d19wX3B2dykKKwl7CisJICAgIFNUUkNQWShwICsgbGVuLCBfKCJbUHJldmlld10iKSk7CisJICAgIGxlbiArPSAoaW50KVNUUkxFTihwICsgbGVuKTsKKwl9CisjZW5kaWYKKwlpZiAoYnVmSXNDaGFuZ2VkKHdwLT53X2J1ZmZlcikpCisJeworCSAgICBTVFJDUFkocCArIGxlbiwgIlsrXSIpOworCSAgICBsZW4gKz0gMzsKKwl9CisJaWYgKHdwLT53X2J1ZmZlci0+Yl9wX3JvKQorCXsKKwkgICAgU1RSQ1BZKHAgKyBsZW4sICJbUk9dIik7CisJICAgIGxlbiArPSA0OworCX0KKworI2lmbmRlZiBGRUFUX1ZFUlRTUExJVAorCXRoaXNfcnVfY29sID0gcnVfY29sOworCWlmICh0aGlzX3J1X2NvbCA8IChDb2x1bW5zICsgMSkgLyAyKQorCSAgICB0aGlzX3J1X2NvbCA9IChDb2x1bW5zICsgMSkgLyAyOworI2Vsc2UKKwl0aGlzX3J1X2NvbCA9IHJ1X2NvbCAtIChDb2x1bW5zIC0gV19XSURUSCh3cCkpOworCWlmICh0aGlzX3J1X2NvbCA8IChXX1dJRFRIKHdwKSArIDEpIC8gMikKKwkgICAgdGhpc19ydV9jb2wgPSAoV19XSURUSCh3cCkgKyAxKSAvIDI7CisJaWYgKHRoaXNfcnVfY29sIDw9IDEpCisJeworCSAgICBwID0gKGNoYXJfdSAqKSI8IjsJCS8qIE5vIHJvb20gZm9yIGZpbGUgbmFtZSEgKi8KKwkgICAgbGVuID0gMTsKKwl9CisJZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCWludAljbGVuID0gMCwgaTsKKworCQkvKiBDb3VudCB0b3RhbCBudW1iZXIgb2YgZGlzcGxheSBjZWxscy4gKi8KKwkJZm9yIChpID0gMDsgcFtpXSAhPSBOVUw7IGkgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwICsgaSkpCisJCSAgICBjbGVuICs9ICgqbWJfcHRyMmNlbGxzKShwICsgaSk7CisJCS8qIEZpbmQgZmlyc3QgY2hhcmFjdGVyIHRoYXQgd2lsbCBmaXQuCisJCSAqIEdvaW5nIGZyb20gc3RhcnQgdG8gZW5kIGlzIG11Y2ggZmFzdGVyIGZvciBEQkNTLiAqLworCQlmb3IgKGkgPSAwOyBwW2ldICE9IE5VTCAmJiBjbGVuID49IHRoaXNfcnVfY29sIC0gMTsKKwkJCQkJICAgICAgaSArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHAgKyBpKSkKKwkJICAgIGNsZW4gLT0gKCptYl9wdHIyY2VsbHMpKHAgKyBpKTsKKwkJbGVuID0gY2xlbjsKKwkJaWYgKGkgPiAwKQorCQl7CisJCSAgICBwID0gcCArIGkgLSAxOworCQkgICAgKnAgPSAnPCc7CisJCSAgICArK2xlbjsKKwkJfQorCisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIGlmIChsZW4gPiB0aGlzX3J1X2NvbCAtIDEpCisJICAgIHsKKwkJcCArPSBsZW4gLSAodGhpc19ydV9jb2wgLSAxKTsKKwkJKnAgPSAnPCc7CisJCWxlbiA9IHRoaXNfcnVfY29sIC0gMTsKKwkgICAgfQorCisJcm93ID0gV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0OworCXNjcmVlbl9wdXRzKHAsIHJvdywgV19XSU5DT0wod3ApLCBhdHRyKTsKKwlzY3JlZW5fZmlsbChyb3csIHJvdyArIDEsIGxlbiArIFdfV0lOQ09MKHdwKSwKKwkJCXRoaXNfcnVfY29sICsgV19XSU5DT0wod3ApLCBmaWxsY2hhciwgZmlsbGNoYXIsIGF0dHIpOworCisJaWYgKGdldF9rZXltYXBfc3RyKHdwLCBOYW1lQnVmZiwgTUFYUEFUSEwpCisJCSYmIChpbnQpKHRoaXNfcnVfY29sIC0gbGVuKSA+IChpbnQpKFNUUkxFTihOYW1lQnVmZikgKyAxKSkKKwkgICAgc2NyZWVuX3B1dHMoTmFtZUJ1ZmYsIHJvdywgKGludCkodGhpc19ydV9jb2wgLSBTVFJMRU4oTmFtZUJ1ZmYpCisJCQkJCQkgICAtIDEgKyBXX1dJTkNPTCh3cCkpLCBhdHRyKTsKKworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisJd2luX3JlZHJfcnVsZXIod3AsIFRSVUUpOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICAvKgorICAgICAqIE1heSBuZWVkIHRvIGRyYXcgdGhlIGNoYXJhY3RlciBiZWxvdyB0aGUgdmVydGljYWwgc2VwYXJhdG9yLgorICAgICAqLworICAgIGlmICh3cC0+d192c2VwX3dpZHRoICE9IDAgJiYgd3AtPndfc3RhdHVzX2hlaWdodCAhPSAwICYmIHJlZHJhd2luZygpKQorICAgIHsKKwlpZiAoc3RsX2Nvbm5lY3RlZCh3cCkpCisJICAgIGZpbGxjaGFyID0gZmlsbGNoYXJfc3RhdHVzKCZhdHRyLCB3cCA9PSBjdXJ3aW4pOworCWVsc2UKKwkgICAgZmlsbGNoYXIgPSBmaWxsY2hhcl92c2VwKCZhdHRyKTsKKwlzY3JlZW5fcHV0Y2hhcihmaWxsY2hhciwgV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0LCBXX0VORENPTCh3cCksCisJCQkJCQkJCQlhdHRyKTsKKyAgICB9CisjZW5kaWYKK30KKworIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBzdGF0dXMgbGluZSBvZiB3aW5kb3cgIndwIiBpcyBjb25uZWN0ZWQgdG8gdGhlIHN0YXR1cworICogbGluZSBvZiB0aGUgd2luZG93IHJpZ2h0IG9mIGl0LiAgSWYgbm90LCB0aGVuIGl0J3MgYSB2ZXJ0aWNhbCBzZXBhcmF0b3IuCisgKiBPbmx5IGNhbGwgaWYgKHdwLT53X3ZzZXBfd2lkdGggIT0gMCkuCisgKi8KKyAgICBpbnQKK3N0bF9jb25uZWN0ZWQod3ApCisgICAgd2luX1QJKndwOworeworICAgIGZyYW1lX1QJKmZyOworCisgICAgZnIgPSB3cC0+d19mcmFtZTsKKyAgICB3aGlsZSAoZnItPmZyX3BhcmVudCAhPSBOVUxMKQorICAgIHsKKwlpZiAoZnItPmZyX3BhcmVudC0+ZnJfbGF5b3V0ID09IEZSX0NPTCkKKwl7CisJICAgIGlmIChmci0+ZnJfbmV4dCAhPSBOVUxMKQorCQlicmVhazsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGZyLT5mcl9uZXh0ICE9IE5VTEwpCisJCXJldHVybiBUUlVFOworCX0KKwlmciA9IGZyLT5mcl9wYXJlbnQ7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKyMgZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfV0lORE9XUyAqLworCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9TVExfT1BUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdldCB0aGUgdmFsdWUgdG8gc2hvdyBmb3IgdGhlIGxhbmd1YWdlIG1hcHBpbmdzLCBhY3RpdmUgJ2tleW1hcCcuCisgKi8KKyAgICBpbnQKK2dldF9rZXltYXBfc3RyKHdwLCBidWYsIGxlbikKKyAgICB3aW5fVAkqd3A7CisgICAgY2hhcl91CSpidWY7CSAgICAvKiBidWZmZXIgZm9yIHRoZSByZXN1bHQgKi8KKyAgICBpbnQJCWxlbjsJICAgIC8qIGxlbmd0aCBvZiBidWZmZXIgKi8KK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAod3AtPndfYnVmZmVyLT5iX3BfaW1pbnNlcnQgIT0gQl9JTU9ERV9MTUFQKQorCXJldHVybiBGQUxTRTsKKworICAgIHsKKyNpZmRlZiBGRUFUX0VWQUwKKwlidWZfVAkqb2xkX2N1cmJ1ZiA9IGN1cmJ1ZjsKKwl3aW5fVAkqb2xkX2N1cndpbiA9IGN1cndpbjsKKwljaGFyX3UJKnM7CisKKwljdXJidWYgPSB3cC0+d19idWZmZXI7CisJY3Vyd2luID0gd3A7CisJU1RSQ1BZKGJ1ZiwgImI6a2V5bWFwX25hbWUiKTsJLyogbXVzdCBiZSB3cml0YWJsZSAqLworCSsrZW1zZ19za2lwOworCXMgPSBwID0gZXZhbF90b19zdHJpbmcoYnVmLCBOVUxMKTsKKwktLWVtc2dfc2tpcDsKKwljdXJidWYgPSBvbGRfY3VyYnVmOworCWN1cndpbiA9IG9sZF9jdXJ3aW47CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSBOVUwpCisjZW5kaWYKKwl7CisjaWZkZWYgRkVBVF9LRVlNQVAKKwkgICAgaWYgKHdwLT53X2J1ZmZlci0+Yl9rbWFwX3N0YXRlICYgS0VZTUFQX0xPQURFRCkKKwkJcCA9IHdwLT53X2J1ZmZlci0+Yl9wX2tleW1hcDsKKwkgICAgZWxzZQorI2VuZGlmCisJCXAgPSAoY2hhcl91ICopImxhbmciOworCX0KKwlpZiAoKGludCkoU1RSTEVOKHApICsgMykgPCBsZW4pCisJICAgIHNwcmludGYoKGNoYXIgKilidWYsICI8JXM+IiwgcCk7CisJZWxzZQorCSAgICBidWZbMF0gPSBOVUw7CisjaWZkZWYgRkVBVF9FVkFMCisJdmltX2ZyZWUocyk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGJ1ZlswXSAhPSBOVUw7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9TVExfT1BUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlZHJhdyB0aGUgc3RhdHVzIGxpbmUgb3IgcnVsZXIgb2Ygd2luZG93IHdwLgorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9yZWRyX2N1c3RvbSh3cCwgUnVsZXIpCisgICAgd2luX1QJKndwOworICAgIGludAkJUnVsZXI7Cit7CisgICAgaW50CQlhdHRyOworICAgIGludAkJY3VyYXR0cjsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWNvbCA9IDA7CisgICAgaW50CQltYXh3aWR0aDsKKyAgICBpbnQJCXdpZHRoOworICAgIGludAkJbjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWZpbGxjaGFyOworICAgIGNoYXJfdQlidWZbTUFYUEFUSExdOworICAgIGNoYXJfdQkqcDsKKyAgICBzdHJ1Y3QJc3RsX2hscmVjIGhsW1NUTF9NQVhfSVRFTV07CisKKyAgICAvKiBzZXR1cCBlbnZpcm9ubWVudCBmb3IgdGhlIHRhc2sgYXQgaGFuZCAqLworICAgIHJvdyA9IFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodDsKKyAgICBmaWxsY2hhciA9IGZpbGxjaGFyX3N0YXR1cygmYXR0ciwgd3AgPT0gY3Vyd2luKTsKKyAgICBtYXh3aWR0aCA9IFdfV0lEVEgod3ApOworICAgIHAgPSBwX3N0bDsKKyAgICBpZiAoUnVsZXIpCisgICAgeworCXAgPSBwX3J1ZjsKKwkvKiBhZHZhbmNlIHBhc3QgYW55IGxlYWRpbmcgZ3JvdXAgc3BlYyAtIGltcGxpY2l0IGluIHJ1X2NvbCAqLworCWlmICgqcCA9PSAnJScpCisJeworCSAgICBpZiAoKisrcCA9PSAnLScpCisJCXArKzsKKwkgICAgaWYgKGF0b2koKGNoYXIgKikgcCkpCisJCXdoaWxlIChWSU1fSVNESUdJVCgqcCkpCisJCSAgICBwKys7CisJICAgIGlmICgqcCsrICE9ICcoJykKKwkJcCA9IHBfcnVmOworCX0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCWNvbCA9IHJ1X2NvbCAtIChDb2x1bW5zIC0gV19XSURUSCh3cCkpOworCWlmIChjb2wgPCAoV19XSURUSCh3cCkgKyAxKSAvIDIpCisJICAgIGNvbCA9IChXX1dJRFRIKHdwKSArIDEpIC8gMjsKKyNlbHNlCisJY29sID0gcnVfY29sOworCWlmIChjb2wgPiAoQ29sdW1ucyArIDEpIC8gMikKKwkgICAgY29sID0gKENvbHVtbnMgKyAxKSAvIDI7CisjZW5kaWYKKwltYXh3aWR0aCA9IFdfV0lEVEgod3ApIC0gY29sOworI2lmZGVmIEZFQVRfV0lORE9XUworCWlmICghd3AtPndfc3RhdHVzX2hlaWdodCkKKyNlbmRpZgorCXsKKwkgICAgcm93ID0gUm93cyAtIDE7CisJICAgIC0tbWF4d2lkdGg7CS8qIHdyaXRpbmcgaW4gbGFzdCBjb2x1bW4gbWF5IGNhdXNlIHNjcm9sbGluZyAqLworCSAgICBmaWxsY2hhciA9ICcgJzsKKwkgICAgYXR0ciA9IDA7CisJfQorICAgIH0KKyAgICBpZiAobWF4d2lkdGggPD0gMCkKKwlyZXR1cm47CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBjb2wgKz0gV19XSU5DT0wod3ApOworI2VuZGlmCisKKyAgICB3aWR0aCA9IGJ1aWxkX3N0bF9zdHJfaGwod3AsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIHAsIGZpbGxjaGFyLCBtYXh3aWR0aCwgaGwpOworICAgIGxlbiA9IFNUUkxFTihidWYpOworCisgICAgd2hpbGUgKHdpZHRoIDwgbWF4d2lkdGggJiYgbGVuIDwgc2l6ZW9mKGJ1ZikgLSAxKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJbGVuICs9ICgqbWJfY2hhcjJieXRlcykoZmlsbGNoYXIsIGJ1ZiArIGxlbik7CisjZWxzZQorCWJ1ZltsZW4rK10gPSBmaWxsY2hhcjsKKyNlbmRpZgorCSsrd2lkdGg7CisgICAgfQorICAgIGJ1ZltsZW5dID0gTlVMOworCisgICAgY3VyYXR0ciA9IGF0dHI7CisgICAgcCA9IGJ1ZjsKKyAgICBmb3IgKG4gPSAwOyBobFtuXS5zdGFydCAhPSBOVUxMOyBuKyspCisgICAgeworCWxlbiA9IChpbnQpKGhsW25dLnN0YXJ0IC0gcCk7CisJc2NyZWVuX3B1dHNfbGVuKHAsIGxlbiwgcm93LCBjb2wsIGN1cmF0dHIpOworCWNvbCArPSB2aW1fc3RybnNpemUocCwgbGVuKTsKKwlwID0gaGxbbl0uc3RhcnQ7CisKKwlpZiAoaGxbbl0udXNlcmhsID09IDApCisJICAgIGN1cmF0dHIgPSBhdHRyOworI2lmZGVmIEZFQVRfV0lORE9XUworCWVsc2UgaWYgKHdwICE9IGN1cndpbiAmJiB3cC0+d19zdGF0dXNfaGVpZ2h0ICE9IDApCisJICAgIGN1cmF0dHIgPSBoaWdobGlnaHRfc3RsbmNbaGxbbl0udXNlcmhsIC0gMV07CisjZW5kaWYKKwllbHNlCisJICAgIGN1cmF0dHIgPSBoaWdobGlnaHRfdXNlcltobFtuXS51c2VyaGwgLSAxXTsKKyAgICB9CisgICAgc2NyZWVuX3B1dHMocCwgcm93LCBjb2wsIGN1cmF0dHIpOworfQorCisjZW5kaWYgLyogRkVBVF9TVExfT1BUICovCisKKy8qCisgKiBPdXRwdXQgYSBzaW5nbGUgY2hhcmFjdGVyIGRpcmVjdGx5IHRvIHRoZSBzY3JlZW4gYW5kIHVwZGF0ZSBTY3JlZW5MaW5lcy4KKyAqLworICAgIHZvaWQKK3NjcmVlbl9wdXRjaGFyKGMsIHJvdywgY29sLCBhdHRyKQorICAgIGludAkgICAgYzsKKyAgICBpbnQJICAgIHJvdywgY29sOworICAgIGludAkgICAgYXR0cjsKK3sKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOworCisgICAgYnVmWygqbWJfY2hhcjJieXRlcykoYywgYnVmKV0gPSBOVUw7CisjZWxzZQorICAgIGNoYXJfdQlidWZbMl07CisKKyAgICBidWZbMF0gPSBjOworICAgIGJ1ZlsxXSA9IE5VTDsKKyNlbmRpZgorICAgIHNjcmVlbl9wdXRzKGJ1Ziwgcm93LCBjb2wsIGF0dHIpOworfQorCisvKgorICogR2V0IGEgc2luZ2xlIGNoYXJhY3RlciBkaXJlY3RseSBmcm9tIFNjcmVlbkxpbmVzIGludG8gImJ5dGVzW10iLgorICogQWxzbyByZXR1cm4gaXRzIGF0dHJpYnV0ZSBpbiAqYXR0cnA7CisgKi8KKyAgICB2b2lkCitzY3JlZW5fZ2V0Ynl0ZXMocm93LCBjb2wsIGJ5dGVzLCBhdHRycCkKKyAgICBpbnQJICAgIHJvdywgY29sOworICAgIGNoYXJfdSAgKmJ5dGVzOworICAgIGludAkgICAgKmF0dHJwOworeworICAgIHVuc2lnbmVkIG9mZjsKKworICAgIC8qIHNhZmV0eSBjaGVjayAqLworICAgIGlmIChTY3JlZW5MaW5lcyAhPSBOVUxMICYmIHJvdyA8IHNjcmVlbl9Sb3dzICYmIGNvbCA8IHNjcmVlbl9Db2x1bW5zKQorICAgIHsKKwlvZmYgPSBMaW5lT2Zmc2V0W3Jvd10gKyBjb2w7CisJKmF0dHJwID0gU2NyZWVuQXR0cnNbb2ZmXTsKKwlieXRlc1swXSA9IFNjcmVlbkxpbmVzW29mZl07CisJYnl0ZXNbMV0gPSBOVUw7CisKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzVUNbb2ZmXSAhPSAwKQorCSAgICBieXRlc1t1dGZjX2NoYXIyYnl0ZXMob2ZmLCBieXRlcyldID0gTlVMOworCWVsc2UgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBTY3JlZW5MaW5lc1tvZmZdID09IDB4OGUpCisJeworCSAgICBieXRlc1swXSA9IFNjcmVlbkxpbmVzW29mZl07CisJICAgIGJ5dGVzWzFdID0gU2NyZWVuTGluZXMyW29mZl07CisJICAgIGJ5dGVzWzJdID0gTlVMOworCX0KKwllbHNlIGlmIChlbmNfZGJjcyAmJiBNQl9CWVRFMkxFTihieXRlc1swXSkgPiAxKQorCXsKKwkgICAgYnl0ZXNbMV0gPSBTY3JlZW5MaW5lc1tvZmYgKyAxXTsKKwkgICAgYnl0ZXNbMl0gPSBOVUw7CisJfQorI2VuZGlmCisgICAgfQorfQorCisvKgorICogUHV0IHN0cmluZyAnKnRleHQnIG9uIHRoZSBzY3JlZW4gYXQgcG9zaXRpb24gJ3JvdycgYW5kICdjb2wnLCB3aXRoCisgKiBhdHRyaWJ1dGVzICdhdHRyJywgYW5kIHVwZGF0ZSBTY3JlZW5MaW5lc1tdIGFuZCBTY3JlZW5BdHRyc1tdLgorICogTm90ZTogb25seSBvdXRwdXRzIHdpdGhpbiBvbmUgcm93LCBtZXNzYWdlIGlzIHRydW5jYXRlZCBhdCBzY3JlZW4gYm91bmRhcnkhCisgKiBOb3RlOiBpZiBTY3JlZW5MaW5lc1tdLCByb3cgYW5kL29yIGNvbCBpcyBpbnZhbGlkLCBub3RoaW5nIGlzIGRvbmUuCisgKi8KKyAgICB2b2lkCitzY3JlZW5fcHV0cyh0ZXh0LCByb3csIGNvbCwgYXR0cikKKyAgICBjaGFyX3UJKnRleHQ7CisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7CisgICAgaW50CQlhdHRyOworeworICAgIHNjcmVlbl9wdXRzX2xlbih0ZXh0LCAtMSwgcm93LCBjb2wsIGF0dHIpOworfQorCisvKgorICogTGlrZSBzY3JlZW5fcHV0cygpLCBidXQgb3V0cHV0ICJ0ZXh0W2xlbl0iLiAgV2hlbiAibGVuIiBpcyAtMSBvdXRwdXQgdXAgdG8KKyAqIGEgTlVMLgorICovCisgICAgdm9pZAorc2NyZWVuX3B1dHNfbGVuKHRleHQsIGxlbiwgcm93LCBjb2wsIGF0dHIpCisgICAgY2hhcl91CSp0ZXh0OworICAgIGludAkJbGVuOworICAgIGludAkJcm93OworICAgIGludAkJY29sOworICAgIGludAkJYXR0cjsKK3sKKyAgICB1bnNpZ25lZAlvZmY7CisgICAgY2hhcl91CSpwdHIgPSB0ZXh0OworICAgIGludAkJYzsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQltYnl0ZV9ibGVuID0gMTsKKyAgICBpbnQJCW1ieXRlX2NlbGxzID0gMTsKKyAgICBpbnQJCXU4YyA9IDA7CisgICAgaW50CQl1OGNfYzEgPSAwOworICAgIGludAkJdThjX2MyID0gMDsKKyAgICBpbnQJCWNsZWFyX25leHRfY2VsbCA9IEZBTFNFOworIyBpZmRlZiBGRUFUX0FSQUJJQworICAgIGludAkJcHJldl9jID0gMDsJCS8qIHByZXZpb3VzIEFyYWJpYyBjaGFyYWN0ZXIgKi8KKyAgICBpbnQJCXBjLCBuYywgbmMxLCBkdW1teTsKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgaWYgKFNjcmVlbkxpbmVzID09IE5VTEwgfHwgcm93ID49IHNjcmVlbl9Sb3dzKQkvKiBzYWZldHkgY2hlY2sgKi8KKwlyZXR1cm47CisKKyAgICBvZmYgPSBMaW5lT2Zmc2V0W3Jvd10gKyBjb2w7CisgICAgd2hpbGUgKCpwdHIgIT0gTlVMICYmIGNvbCA8IHNjcmVlbl9Db2x1bW5zCisJCQkJICAgICAgJiYgKGxlbiA8IDAgfHwgKGludCkocHRyIC0gdGV4dCkgPCBsZW4pKQorICAgIHsKKwljID0gKnB0cjsKKyNpZmRlZiBGRUFUX01CWVRFCisJLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpYnl0ZSAqLworCWlmIChoYXNfbWJ5dGUpCisJeworCSAgICBpZiAoZW5jX3V0ZjggJiYgbGVuID4gMCkKKwkJbWJ5dGVfYmxlbiA9IHV0ZmNfcHRyMmxlbl9jaGVja19sZW4ocHRyLAorCQkJCQkJICAgKGludCkoKHRleHQgKyBsZW4pIC0gcHRyKSk7CisJICAgIGVsc2UKKwkJbWJ5dGVfYmxlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyKTsKKwkgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBjID09IDB4OGUpCisJCW1ieXRlX2NlbGxzID0gMTsKKwkgICAgZWxzZSBpZiAoZW5jX2RiY3MgIT0gMCkKKwkJbWJ5dGVfY2VsbHMgPSBtYnl0ZV9ibGVuOworCSAgICBlbHNlCS8qIGVuY191dGY4ICovCisJICAgIHsKKwkJaWYgKGxlbiA+PSAwKQorCQkgICAgdThjID0gdXRmY19wdHIyY2hhcl9sZW4ocHRyLCAmdThjX2MxLCAmdThjX2MyLAorCQkJCQkJICAgKGludCkoKHRleHQgKyBsZW4pIC0gcHRyKSk7CisJCWVsc2UKKwkJICAgIHU4YyA9IHV0ZmNfcHRyMmNoYXIocHRyLCAmdThjX2MxLCAmdThjX2MyKTsKKwkJbWJ5dGVfY2VsbHMgPSB1dGZfY2hhcjJjZWxscyh1OGMpOworCQkvKiBOb24tQk1QIGNoYXJhY3RlcjogZGlzcGxheSBhcyA/IG9yIGZ1bGx3aWR0aCA/LiAqLworCQlpZiAodThjID49IDB4MTAwMDApCisJCXsKKwkJICAgIHU4YyA9IChtYnl0ZV9jZWxscyA9PSAyKSA/IDB4ZmYxZiA6IChpbnQpJz8nOworCQkgICAgaWYgKGF0dHIgPT0gMCkKKwkJCWF0dHIgPSBobF9hdHRyKEhMRl84KTsKKwkJfQorIyBpZmRlZiBGRUFUX0FSQUJJQworCQlpZiAocF9hcnNoYXBlICYmICFwX3RiaWRpICYmIEFSQUJJQ19DSEFSKHU4YykpCisJCXsKKwkJICAgIC8qIERvIEFyYWJpYyBzaGFwaW5nLiAqLworCQkgICAgaWYgKGxlbiA+PSAwICYmIChpbnQpKHB0ciAtIHRleHQpICsgbWJ5dGVfYmxlbiA+PSBsZW4pCisJCSAgICB7CisJCQkvKiBQYXN0IGVuZCBvZiBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLiAqLworCQkJbmMgPSBOVUw7CisJCQluYzEgPSBOVUw7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQluYyA9IHV0ZmNfcHRyMmNoYXIocHRyICsgbWJ5dGVfYmxlbiwgJm5jMSwgJmR1bW15KTsKKwkJICAgIHBjID0gcHJldl9jOworCQkgICAgcHJldl9jID0gdThjOworCQkgICAgdThjID0gYXJhYmljX3NoYXBlKHU4YywgJmMsICZ1OGNfYzEsIG5jLCBuYzEsIHBjKTsKKwkJfQorCQllbHNlCisJCSAgICBwcmV2X2MgPSB1OGM7CisjIGVuZGlmCisJICAgIH0KKwl9CisjZW5kaWYKKworCWlmIChTY3JlZW5MaW5lc1tvZmZdICE9IGMKKyNpZmRlZiBGRUFUX01CWVRFCisJCXx8IChtYnl0ZV9jZWxscyA9PSAyCisJCSAgICAmJiBTY3JlZW5MaW5lc1tvZmYgKyAxXSAhPSAoZW5jX2RiY3MgPyBwdHJbMV0gOiAwKSkKKwkJfHwgKGVuY19kYmNzID09IERCQ1NfSlBOVQorCQkgICAgJiYgYyA9PSAweDhlCisJCSAgICAmJiBTY3JlZW5MaW5lczJbb2ZmXSAhPSBwdHJbMV0pCisJCXx8IChlbmNfdXRmOAorCQkgICAgJiYgbWJ5dGVfYmxlbiA+IDEKKwkJICAgICYmIChTY3JlZW5MaW5lc1VDW29mZl0gIT0gdThjCisJCQl8fCBTY3JlZW5MaW5lc0MxW29mZl0gIT0gdThjX2MxCisJCQl8fCBTY3JlZW5MaW5lc0MyW29mZl0gIT0gdThjX2MyKSkKKyNlbmRpZgorCQl8fCBTY3JlZW5BdHRyc1tvZmZdICE9IGF0dHIKKwkJfHwgZXhtb2RlX2FjdGl2ZQorCQkpCisJeworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoVU5JWCkKKwkgICAgLyogVGhlIGJvbGQgdHJpY2sgbWFrZXMgYSBzaW5nbGUgcm93IG9mIHBpeGVscyBhcHBlYXIgaW4gdGhlIG5leHQKKwkgICAgICogY2hhcmFjdGVyLiAgV2hlbiBhIGJvbGQgY2hhcmFjdGVyIGlzIHJlbW92ZWQsIHRoZSBuZXh0CisJICAgICAqIGNoYXJhY3RlciBzaG91bGQgYmUgcmVkcmF3biB0b28uICBUaGlzIGhhcHBlbnMgZm9yIG91ciBvd24gR1VJCisJICAgICAqIGFuZCBmb3Igc29tZSB4dGVybXMuCisJICAgICAqIEZvcmNlIHRoZSByZWRyYXcgYnkgc2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgZGlmZmVyZW50IHZhbHVlCisJICAgICAqIHRoYW4gImF0dHIiLCB0aGUgY29udGVudHMgb2YgU2NyZWVuTGluZXNbXSBtYXkgYmUgbmVlZGVkIGJ5CisJICAgICAqIG1iX29mZjJjZWxscygpIGZ1cnRoZXIgb24uCisJICAgICAqIERvbid0IGRvIHRoaXMgZm9yIHRoZSBsYXN0IGRyYXduIGNoYXJhY3RlciwgYmVjYXVzZSB0aGUgbmV4dAorCSAgICAgKiBjaGFyYWN0ZXIgbWF5IG5vdCBiZSByZWRyYXduLiAqLworCSAgICBpZiAoCisjIGlmZGVmIEZFQVRfR1VJCisJCSAgICBndWkuaW5fdXNlCisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoVU5JWCkKKwkJICAgIHx8CisjIGVuZGlmCisjIGlmZGVmIFVOSVgKKwkJICAgIHRlcm1faXNfeHRlcm0KKyMgZW5kaWYKKwkgICAgICAgKQorCSAgICB7CisJCWludAkJbjsKKworCQluID0gU2NyZWVuQXR0cnNbb2ZmXTsKKyMgaWZkZWYgRkVBVF9NQllURQorCQlpZiAoY29sICsgbWJ5dGVfY2VsbHMgPCBzY3JlZW5fQ29sdW1ucworCQkJJiYgKG4gPiBITF9BTEwgfHwgKG4gJiBITF9CT0xEKSkKKwkJCSYmIChsZW4gPCAwID8gcHRyW21ieXRlX2JsZW5dICE9IE5VTAorCQkJCQkgICAgIDogcHRyICsgbWJ5dGVfYmxlbiA8IHRleHQgKyBsZW4pKQorCQkgICAgU2NyZWVuQXR0cnNbb2ZmICsgbWJ5dGVfY2VsbHNdID0gYXR0ciArIDE7CisjIGVsc2UKKwkJaWYgKGNvbCArIDEgPCBzY3JlZW5fQ29sdW1ucworCQkJJiYgKG4gPiBITF9BTEwgfHwgKG4gJiBITF9CT0xEKSkKKwkJCSYmIChsZW4gPCAwID8gcHRyWzFdICE9IE5VTCA6IHB0ciArIDEgPCB0ZXh0ICsgbGVuKSkKKwkJICAgIFNjcmVlbkxpbmVzW29mZiArIDFdID0gMDsKKyMgZW5kaWYKKwkgICAgfQorI2VuZGlmCisjaWZkZWYgRkVBVF9NQllURQorCSAgICAvKiBXaGVuIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQgYW5kIG92ZXJ3cml0aW5nIGEgdHdvLWNlbGwKKwkgICAgICogY2hhcmFjdGVyIHdpdGggYSBvbmUtY2VsbCBjaGFyYWN0ZXIsIG5lZWQgdG8gY2xlYXIgdGhlIG5leHQKKwkgICAgICogY2VsbC4gIEFsc28gd2hlbiBvdmVyd3JpdGluZyB0aGUgbGVmdCBoYWx2ZSBvZiBhIHR3by1jZWxsIGNoYXIKKwkgICAgICogd2l0aCB0aGUgcmlnaHQgaGFsdmUgb2YgYSB0d28tY2VsbCBjaGFyLiAgRG8gdGhpcyBvbmx5IG9uY2UKKwkgICAgICogKG1iX29mZjJjZWxscygpIG1heSByZXR1cm4gMiBvbiB0aGUgcmlnaHQgaGFsdmUpLiAqLworCSAgICBpZiAoY2xlYXJfbmV4dF9jZWxsKQorCQljbGVhcl9uZXh0X2NlbGwgPSBGQUxTRTsKKwkgICAgZWxzZSBpZiAoaGFzX21ieXRlCisJCSAgICAmJiAobGVuIDwgMCA/IHB0clttYnl0ZV9ibGVuXSA9PSBOVUwKKwkJCQkJICAgICA6IHB0ciArIG1ieXRlX2JsZW4gPj0gdGV4dCArIGxlbikKKwkJICAgICYmICgobWJ5dGVfY2VsbHMgPT0gMSAmJiAoKm1iX29mZjJjZWxscykob2ZmKSA+IDEpCisJCQl8fCAobWJ5dGVfY2VsbHMgPT0gMgorCQkJICAgICYmICgqbWJfb2ZmMmNlbGxzKShvZmYpID09IDEKKwkJCSAgICAmJiAoKm1iX29mZjJjZWxscykob2ZmICsgMSkgPiAxKSkpCisJCWNsZWFyX25leHRfY2VsbCA9IFRSVUU7CisKKwkgICAgLyogTWFrZSBzdXJlIHdlIG5ldmVyIGxlYXZlIGEgc2Vjb25kIGJ5dGUgb2YgYSBkb3VibGUtYnl0ZSBiZWhpbmQsCisJICAgICAqIGl0IGNvbmZ1c2VzIG1iX29mZjJjZWxscygpLiAqLworCSAgICBpZiAoZW5jX2RiY3MKKwkJICAgICYmICgobWJ5dGVfY2VsbHMgPT0gMSAmJiAoKm1iX29mZjJjZWxscykob2ZmKSA+IDEpCisJCQl8fCAobWJ5dGVfY2VsbHMgPT0gMgorCQkJICAgICYmICgqbWJfb2ZmMmNlbGxzKShvZmYpID09IDEKKwkJCSAgICAmJiAoKm1iX29mZjJjZWxscykob2ZmICsgMSkgPiAxKSkpCisJCVNjcmVlbkxpbmVzW29mZiArIG1ieXRlX2JsZW5dID0gMDsKKyNlbmRpZgorCSAgICBTY3JlZW5MaW5lc1tvZmZdID0gYzsKKwkgICAgU2NyZWVuQXR0cnNbb2ZmXSA9IGF0dHI7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoZW5jX3V0ZjgpCisJICAgIHsKKwkJaWYgKGMgPCAweDgwICYmIHU4Y19jMSA9PSAwICYmIHU4Y19jMiA9PSAwKQorCQkgICAgU2NyZWVuTGluZXNVQ1tvZmZdID0gMDsKKwkJZWxzZQorCQl7CisJCSAgICBTY3JlZW5MaW5lc1VDW29mZl0gPSB1OGM7CisJCSAgICBTY3JlZW5MaW5lc0MxW29mZl0gPSB1OGNfYzE7CisJCSAgICBTY3JlZW5MaW5lc0MyW29mZl0gPSB1OGNfYzI7CisJCX0KKwkJaWYgKG1ieXRlX2NlbGxzID09IDIpCisJCXsKKwkJICAgIFNjcmVlbkxpbmVzW29mZiArIDFdID0gMDsKKwkJICAgIFNjcmVlbkF0dHJzW29mZiArIDFdID0gYXR0cjsKKwkJfQorCQlzY3JlZW5fY2hhcihvZmYsIHJvdywgY29sKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChtYnl0ZV9jZWxscyA9PSAyKQorCSAgICB7CisJCVNjcmVlbkxpbmVzW29mZiArIDFdID0gcHRyWzFdOworCQlTY3JlZW5BdHRyc1tvZmYgKyAxXSA9IGF0dHI7CisJCXNjcmVlbl9jaGFyXzIob2ZmLCByb3csIGNvbCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmIGMgPT0gMHg4ZSkKKwkgICAgeworCQlTY3JlZW5MaW5lczJbb2ZmXSA9IHB0clsxXTsKKwkJc2NyZWVuX2NoYXIob2ZmLCByb3csIGNvbCk7CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJCXNjcmVlbl9jaGFyKG9mZiwgcm93LCBjb2wpOworCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIG9mZiArPSBtYnl0ZV9jZWxsczsKKwkgICAgY29sICs9IG1ieXRlX2NlbGxzOworCSAgICBwdHIgKz0gbWJ5dGVfYmxlbjsKKwkgICAgaWYgKGNsZWFyX25leHRfY2VsbCkKKwkJcHRyID0gKGNoYXJfdSAqKSIgIjsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICArK29mZjsKKwkgICAgKytjb2w7CisJICAgICsrcHRyOworCX0KKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorLyoKKyAqIFByZXBhcmUgZm9yICdzZWFyY2hobCcgaGlnaGxpZ2h0aW5nLgorICovCisgICAgc3RhdGljIHZvaWQKK3N0YXJ0X3NlYXJjaF9obCgpCit7CisgICAgaWYgKHBfaGxzICYmICFub19obHNlYXJjaCkKKyAgICB7CisJbGFzdF9wYXRfcHJvZygmc2VhcmNoX2hsLnJtKTsKKwlzZWFyY2hfaGwuYXR0ciA9IGhsX2F0dHIoSExGX0wpOworICAgIH0KK30KKworLyoKKyAqIENsZWFuIHVwIGZvciAnc2VhcmNoaGwnIGhpZ2hsaWdodGluZy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitlbmRfc2VhcmNoX2hsKCkKK3sKKyAgICBpZiAoc2VhcmNoX2hsLnJtLnJlZ3Byb2cgIT0gTlVMTCkKKyAgICB7CisJdmltX2ZyZWUoc2VhcmNoX2hsLnJtLnJlZ3Byb2cpOworCXNlYXJjaF9obC5ybS5yZWdwcm9nID0gTlVMTDsKKyAgICB9Cit9CisKKy8qCisgKiBBZHZhbmNlIHRvIHRoZSBtYXRjaCBpbiB3aW5kb3cgIndwIiBsaW5lICJsbnVtIiBvciBwYXN0IGl0LgorICovCisgICAgc3RhdGljIHZvaWQKK3ByZXBhcmVfc2VhcmNoX2hsKHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIG1hdGNoX1QJKnNobDsJCS8qIHBvaW50cyB0byBzZWFyY2hfaGwgb3IgbWF0Y2hfaGwgKi8KKyAgICBpbnQJCW47CisKKyAgICAvKgorICAgICAqIFdoZW4gdXNpbmcgYSBtdWx0aS1saW5lIHBhdHRlcm4sIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgdG9wCisgICAgICogb2YgdGhlIHdpbmRvdyBvciBqdXN0IGFmdGVyIGEgY2xvc2VkIGZvbGQuCisgICAgICogRG8gdGhpcyBib3RoIGZvciBzZWFyY2hfaGwgYW5kIG1hdGNoX2hsLgorICAgICAqLworICAgIHNobCA9ICZzZWFyY2hfaGw7CisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKHNobC0+cm0ucmVncHJvZyAhPSBOVUxMCisJCSYmIHNobC0+bG51bSA9PSAwCisJCSYmIHJlX211bHRpbGluZShzaGwtPnJtLnJlZ3Byb2cpKQorCXsKKwkgICAgaWYgKHNobC0+Zmlyc3RfbG51bSA9PSAwKQorCSAgICB7CisjIGlmZGVmIEZFQVRfRk9MRElORworCQlmb3IgKHNobC0+Zmlyc3RfbG51bSA9IGxudW07CisJCQkgICBzaGwtPmZpcnN0X2xudW0gPiB3cC0+d190b3BsaW5lOyAtLXNobC0+Zmlyc3RfbG51bSkKKwkJICAgIGlmIChoYXNGb2xkaW5nV2luKHdwLCBzaGwtPmZpcnN0X2xudW0gLSAxLAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCwgVFJVRSwgTlVMTCkpCisJCQlicmVhazsKKyMgZWxzZQorCQlzaGwtPmZpcnN0X2xudW0gPSB3cC0+d190b3BsaW5lOworIyBlbmRpZgorCSAgICB9CisJICAgIG4gPSAwOworCSAgICB3aGlsZSAoc2hsLT5maXJzdF9sbnVtIDwgbG51bSAmJiBzaGwtPnJtLnJlZ3Byb2cgIT0gTlVMTCkKKwkgICAgeworCQluZXh0X3NlYXJjaF9obCh3cCwgc2hsLCBzaGwtPmZpcnN0X2xudW0sIChjb2xucl9UKW4pOworCQlpZiAoc2hsLT5sbnVtICE9IDApCisJCXsKKwkJICAgIHNobC0+Zmlyc3RfbG51bSA9IHNobC0+bG51bQorCQkJCSAgICArIHNobC0+cm0uZW5kcG9zWzBdLmxudW0KKwkJCQkgICAgLSBzaGwtPnJtLnN0YXJ0cG9zWzBdLmxudW07CisJCSAgICBuID0gc2hsLT5ybS5lbmRwb3NbMF0uY29sOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgKytzaGwtPmZpcnN0X2xudW07CisJCSAgICBuID0gMDsKKwkJfQorCSAgICB9CisJfQorCWlmIChzaGwgPT0gJm1hdGNoX2hsKQorCSAgICBicmVhazsKKwlzaGwgPSAmbWF0Y2hfaGw7CisgICAgfQorfQorCisvKgorICogU2VhcmNoIGZvciBhIG5leHQgJ3NlYXJjaGwnIG9yICI6bWF0Y2giIG1hdGNoLgorICogVXNlcyBzaGwtPmJ1Zi4KKyAqIFNldHMgc2hsLT5sbnVtIGFuZCBzaGwtPnJtIGNvbnRlbnRzLgorICogTm90ZTogQXNzdW1lcyBhIHByZXZpb3VzIG1hdGNoIGlzIGFsd2F5cyBiZWZvcmUgImxudW0iLCB1bmxlc3MKKyAqIHNobC0+bG51bSBpcyB6ZXJvLgorICogQ2FyZWZ1bDogQW55IHBvaW50ZXJzIGZvciBidWZmZXIgbGluZXMgd2lsbCBiZWNvbWUgaW52YWxpZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCituZXh0X3NlYXJjaF9obCh3aW4sIHNobCwgbG51bSwgbWluY29sKQorICAgIHdpbl9UCSp3aW47CisgICAgbWF0Y2hfVAkqc2hsOwkJLyogcG9pbnRzIHRvIHNlYXJjaF9obCBvciBtYXRjaF9obCAqLworICAgIGxpbmVucl9UCWxudW07CisgICAgY29sbnJfVAltaW5jb2w7CQkvKiBtaW5pbWFsIGNvbHVtbiBmb3IgYSBtYXRjaCAqLworeworICAgIGxpbmVucl9UCWw7CisgICAgY29sbnJfVAltYXRjaGNvbDsKKyAgICBsb25nCW5tYXRjaGVkOworCisgICAgaWYgKHNobC0+bG51bSAhPSAwKQorICAgIHsKKwkvKiBDaGVjayBmb3IgdGhyZWUgc2l0dWF0aW9uczoKKwkgKiAxLiBJZiB0aGUgImxudW0iIGlzIGJlbG93IGEgcHJldmlvdXMgbWF0Y2gsIHN0YXJ0IGEgbmV3IHNlYXJjaC4KKwkgKiAyLiBJZiB0aGUgcHJldmlvdXMgbWF0Y2ggaW5jbHVkZXMgIm1pbmNvbCIsIHVzZSBpdC4KKwkgKiAzLiBDb250aW51ZSBhZnRlciB0aGUgcHJldmlvdXMgbWF0Y2guCisJICovCisJbCA9IHNobC0+bG51bSArIHNobC0+cm0uZW5kcG9zWzBdLmxudW0gLSBzaGwtPnJtLnN0YXJ0cG9zWzBdLmxudW07CisJaWYgKGxudW0gPiBsKQorCSAgICBzaGwtPmxudW0gPSAwOworCWVsc2UgaWYgKGxudW0gPCBsIHx8IHNobC0+cm0uZW5kcG9zWzBdLmNvbCA+IG1pbmNvbCkKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogUmVwZWF0IHNlYXJjaGluZyBmb3IgYSBtYXRjaCB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBpbmNsdWRlcyAibWluY29sIgorICAgICAqIG9yIG5vbmUgaXMgZm91bmQgaW4gdGhpcyBsaW5lLgorICAgICAqLworICAgIGNhbGxlZF9lbXNnID0gRkFMU0U7CisgICAgZm9yICg7OykKKyAgICB7CisJLyogVGhyZWUgc2l0dWF0aW9uczoKKwkgKiAxLiBObyB1c2VmdWwgcHJldmlvdXMgbWF0Y2g6IHNlYXJjaCBmcm9tIHN0YXJ0IG9mIGxpbmUuCisJICogMi4gTm90IFZpIGNvbXBhdGlibGUgb3IgZW1wdHkgbWF0Y2g6IGNvbnRpbnVlIGF0IG5leHQgY2hhcmFjdGVyLgorCSAqICAgIEJyZWFrIHRoZSBsb29wIGlmIHRoaXMgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisJICogMy4gVmkgY29tcGF0aWJsZSBzZWFyY2hpbmc6IGNvbnRpbnVlIGF0IGVuZCBvZiBwcmV2aW91cyBtYXRjaC4KKwkgKi8KKwlpZiAoc2hsLT5sbnVtID09IDApCisJICAgIG1hdGNoY29sID0gMDsKKwllbHNlIGlmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU0VBUkNIKSA9PSBOVUxMCisJCXx8IChzaGwtPnJtLmVuZHBvc1swXS5sbnVtID09IDAKKwkJICAgICYmIHNobC0+cm0uZW5kcG9zWzBdLmNvbCA9PSBzaGwtPnJtLnN0YXJ0cG9zWzBdLmNvbCkpCisJeworCSAgICBtYXRjaGNvbCA9IHNobC0+cm0uc3RhcnRwb3NbMF0uY29sICsgMTsKKwkgICAgaWYgKG1sX2dldF9idWYoc2hsLT5idWYsIGxudW0sIEZBTFNFKVttYXRjaGNvbCAtIDFdID09IE5VTCkKKwkgICAgeworCQlzaGwtPmxudW0gPSAwOworCQlicmVhazsKKwkgICAgfQorCX0KKwllbHNlCisJICAgIG1hdGNoY29sID0gc2hsLT5ybS5lbmRwb3NbMF0uY29sOworCisJc2hsLT5sbnVtID0gbG51bTsKKwlubWF0Y2hlZCA9IHZpbV9yZWdleGVjX211bHRpKCZzaGwtPnJtLCB3aW4sIHNobC0+YnVmLCBsbnVtLCBtYXRjaGNvbCk7CisJaWYgKGNhbGxlZF9lbXNnKQorCXsKKwkgICAgLyogRXJyb3Igd2hpbGUgaGFuZGxpbmcgcmVnZXhwOiBzdG9wIHVzaW5nIHRoaXMgcmVnZXhwLiAqLworCSAgICB2aW1fZnJlZShzaGwtPnJtLnJlZ3Byb2cpOworCSAgICBzaGwtPnJtLnJlZ3Byb2cgPSBOVUxMOworCSAgICBub19obHNlYXJjaCA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKwlpZiAobm1hdGNoZWQgPT0gMCkKKwl7CisJICAgIHNobC0+bG51bSA9IDA7CQkvKiBubyBtYXRjaCBmb3VuZCAqLworCSAgICBicmVhazsKKwl9CisJaWYgKHNobC0+cm0uc3RhcnRwb3NbMF0ubG51bSA+IDAKKwkJfHwgc2hsLT5ybS5zdGFydHBvc1swXS5jb2wgPj0gbWluY29sCisJCXx8IG5tYXRjaGVkID4gMQorCQl8fCBzaGwtPnJtLmVuZHBvc1swXS5jb2wgPiBtaW5jb2wpCisJeworCSAgICBzaGwtPmxudW0gKz0gc2hsLT5ybS5zdGFydHBvc1swXS5sbnVtOworCSAgICBicmVhazsJCQkvKiB1c2VmdWwgbWF0Y2ggZm91bmQgKi8KKwl9CisgICAgfQorfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyB2b2lkCitzY3JlZW5fc3RhcnRfaGlnaGxpZ2h0KGF0dHIpCisgICAgICBpbnQJYXR0cjsKK3sKKyAgICBhdHRyZW50cnlfVCAqYWVwID0gTlVMTDsKKworICAgIHNjcmVlbl9hdHRyID0gYXR0cjsKKyAgICBpZiAoZnVsbF9zY3JlZW4KKyNpZmRlZiBXSU4zMjY0CisJCSAgICAmJiB0ZXJtY2FwX2FjdGl2ZQorI2VuZGlmCisJCQkJICAgICAgICkKKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLmluX3VzZSkKKwl7CisJICAgIGNoYXIJYnVmWzIwXTsKKworCSAgICBzcHJpbnRmKGJ1ZiwgSUZfRUIoIlwwMzN8JWRoIiwgRVNDX1NUUiAifCVkaCIpLCBhdHRyKTsJCS8qIGludGVybmFsIEdVSSBjb2RlICovCisJICAgIE9VVF9TVFIoYnVmKTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBpZiAoYXR0ciA+IEhMX0FMTCkJCQkJLyogc3BlY2lhbCBITCBhdHRyLiAqLworCSAgICB7CisJCWlmICh0X2NvbG9ycyA+IDEpCisJCSAgICBhZXAgPSBzeW5fY3Rlcm1fYXR0cjJlbnRyeShhdHRyKTsKKwkJZWxzZQorCQkgICAgYWVwID0gc3luX3Rlcm1fYXR0cjJlbnRyeShhdHRyKTsKKwkJaWYgKGFlcCA9PSBOVUxMKQkgICAgLyogZGlkICI6c3ludGF4IGNsZWFyIiAqLworCQkgICAgYXR0ciA9IDA7CisJCWVsc2UKKwkJICAgIGF0dHIgPSBhZXAtPmFlX2F0dHI7CisJICAgIH0KKwkgICAgaWYgKChhdHRyICYgSExfQk9MRCkgJiYgVF9NRCAhPSBOVUxMKQkvKiBib2xkICovCisJCW91dF9zdHIoVF9NRCk7CisJICAgIGlmICgoYXR0ciAmIEhMX1NUQU5ET1VUKSAmJiBUX1NPICE9IE5VTEwpCS8qIHN0YW5kb3V0ICovCisJCW91dF9zdHIoVF9TTyk7CisJICAgIGlmICgoYXR0ciAmIEhMX1VOREVSTElORSkgJiYgVF9VUyAhPSBOVUxMKQkvKiB1bmRlcmxpbmUgKi8KKwkJb3V0X3N0cihUX1VTKTsKKwkgICAgaWYgKChhdHRyICYgSExfSVRBTElDKSAmJiBUX0NaSCAhPSBOVUxMKQkvKiBpdGFsaWMgKi8KKwkJb3V0X3N0cihUX0NaSCk7CisJICAgIGlmICgoYXR0ciAmIEhMX0lOVkVSU0UpICYmIFRfTVIgIT0gTlVMTCkJLyogaW52ZXJzZSAocmV2ZXJzZSkgKi8KKwkJb3V0X3N0cihUX01SKTsKKworCSAgICAvKgorCSAgICAgKiBPdXRwdXQgdGhlIGNvbG9yIG9yIHN0YXJ0IHN0cmluZyBhZnRlciBib2xkIGV0Yy4sIGluIGNhc2UgdGhlCisJICAgICAqIGJvbGQgZXRjLiBvdmVycmlkZSB0aGUgY29sb3Igc2V0dGluZy4KKwkgICAgICovCisJICAgIGlmIChhZXAgIT0gTlVMTCkKKwkgICAgeworCQlpZiAodF9jb2xvcnMgPiAxKQorCQl7CisJCSAgICBpZiAoYWVwLT5hZV91LmN0ZXJtLmZnX2NvbG9yKQorCQkJdGVybV9mZ19jb2xvcihhZXAtPmFlX3UuY3Rlcm0uZmdfY29sb3IgLSAxKTsKKwkJICAgIGlmIChhZXAtPmFlX3UuY3Rlcm0uYmdfY29sb3IpCisJCQl0ZXJtX2JnX2NvbG9yKGFlcC0+YWVfdS5jdGVybS5iZ19jb2xvciAtIDEpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGFlcC0+YWVfdS50ZXJtLnN0YXJ0ICE9IE5VTEwpCisJCQlvdXRfc3RyKGFlcC0+YWVfdS50ZXJtLnN0YXJ0KTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworICAgICAgdm9pZAorc2NyZWVuX3N0b3BfaGlnaGxpZ2h0KCkKK3sKKyAgICBpbnQJICAgIGRvX01FID0gRkFMU0U7CSAgICAvKiBvdXRwdXQgVF9NRSBjb2RlICovCisKKyAgICBpZiAoc2NyZWVuX2F0dHIgIT0gMAorI2lmZGVmIFdJTjMyNjQKKwkJCSYmIHRlcm1jYXBfYWN0aXZlCisjZW5kaWYKKwkJCQkJICAgKQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSQorCWlmIChndWkuaW5fdXNlKQorCXsKKwkgICAgY2hhcglidWZbMjBdOworCisJICAgIC8qIHVzZSBpbnRlcm5hbCBHVUkgY29kZSAqLworCSAgICBzcHJpbnRmKGJ1ZiwgSUZfRUIoIlwwMzN8JWRIIiwgRVNDX1NUUiAifCVkSCIpLCBzY3JlZW5fYXR0cik7CisJICAgIE9VVF9TVFIoYnVmKTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICBpZiAoc2NyZWVuX2F0dHIgPiBITF9BTEwpCQkJLyogc3BlY2lhbCBITCBhdHRyLiAqLworCSAgICB7CisJCWF0dHJlbnRyeV9UICphZXA7CisKKwkJaWYgKHRfY29sb3JzID4gMSkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIEFzc3VtZSB0aGF0IHRfbWUgcmVzdG9yZXMgdGhlIG9yaWdpbmFsIGNvbG9ycyEKKwkJICAgICAqLworCQkgICAgYWVwID0gc3luX2N0ZXJtX2F0dHIyZW50cnkoc2NyZWVuX2F0dHIpOworCQkgICAgaWYgKGFlcCAhPSBOVUxMICYmIChhZXAtPmFlX3UuY3Rlcm0uZmdfY29sb3IKKwkJCQkJCSB8fCBhZXAtPmFlX3UuY3Rlcm0uYmdfY29sb3IpKQorCQkJZG9fTUUgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgYWVwID0gc3luX3Rlcm1fYXR0cjJlbnRyeShzY3JlZW5fYXR0cik7CisJCSAgICBpZiAoYWVwICE9IE5VTEwgJiYgYWVwLT5hZV91LnRlcm0uc3RvcCAhPSBOVUxMKQorCQkgICAgeworCQkJaWYgKFNUUkNNUChhZXAtPmFlX3UudGVybS5zdG9wLCBUX01FKSA9PSAwKQorCQkJICAgIGRvX01FID0gVFJVRTsKKwkJCWVsc2UKKwkJCSAgICBvdXRfc3RyKGFlcC0+YWVfdS50ZXJtLnN0b3ApOworCQkgICAgfQorCQl9CisJCWlmIChhZXAgPT0gTlVMTCkJICAgIC8qIGRpZCAiOnN5bnRheCBjbGVhciIgKi8KKwkJICAgIHNjcmVlbl9hdHRyID0gMDsKKwkJZWxzZQorCQkgICAgc2NyZWVuX2F0dHIgPSBhZXAtPmFlX2F0dHI7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBPZnRlbiBhbGwgZW5kaW5nLWNvZGVzIGFyZSBlcXVhbCB0byBUX01FLiAgQXZvaWQgb3V0cHV0dGluZyB0aGUKKwkgICAgICogc2FtZSBzZXF1ZW5jZSBzZXZlcmFsIHRpbWVzLgorCSAgICAgKi8KKwkgICAgaWYgKHNjcmVlbl9hdHRyICYgSExfU1RBTkRPVVQpCisJICAgIHsKKwkJaWYgKFNUUkNNUChUX1NFLCBUX01FKSA9PSAwKQorCQkgICAgZG9fTUUgPSBUUlVFOworCQllbHNlCisJCSAgICBvdXRfc3RyKFRfU0UpOworCSAgICB9CisJICAgIGlmIChzY3JlZW5fYXR0ciAmIEhMX1VOREVSTElORSkKKwkgICAgeworCQlpZiAoU1RSQ01QKFRfVUUsIFRfTUUpID09IDApCisJCSAgICBkb19NRSA9IFRSVUU7CisJCWVsc2UKKwkJICAgIG91dF9zdHIoVF9VRSk7CisJICAgIH0KKwkgICAgaWYgKHNjcmVlbl9hdHRyICYgSExfSVRBTElDKQorCSAgICB7CisJCWlmIChTVFJDTVAoVF9DWlIsIFRfTUUpID09IDApCisJCSAgICBkb19NRSA9IFRSVUU7CisJCWVsc2UKKwkJICAgIG91dF9zdHIoVF9DWlIpOworCSAgICB9CisJICAgIGlmIChkb19NRSB8fCAoc2NyZWVuX2F0dHIgJiAoSExfQk9MRCB8IEhMX0lOVkVSU0UpKSkKKwkJb3V0X3N0cihUX01FKTsKKworCSAgICBpZiAodF9jb2xvcnMgPiAxKQorCSAgICB7CisJCS8qIHNldCBOb3JtYWwgY3Rlcm0gY29sb3JzICovCisJCWlmIChjdGVybV9ub3JtYWxfZmdfY29sb3IgIT0gMCkKKwkJICAgIHRlcm1fZmdfY29sb3IoY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yIC0gMSk7CisJCWlmIChjdGVybV9ub3JtYWxfYmdfY29sb3IgIT0gMCkKKwkJICAgIHRlcm1fYmdfY29sb3IoY3Rlcm1fbm9ybWFsX2JnX2NvbG9yIC0gMSk7CisJCWlmIChjdGVybV9ub3JtYWxfZmdfYm9sZCkKKwkJICAgIG91dF9zdHIoVF9NRCk7CisJICAgIH0KKwl9CisgICAgfQorICAgIHNjcmVlbl9hdHRyID0gMDsKK30KKworLyoKKyAqIFJlc2V0IHRoZSBjb2xvcnMgZm9yIGEgY3Rlcm0uICBVc2VkIHdoZW4gbGVhdmluZyBWaW0uCisgKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIG1heSBvdmVycmlkZSB0aGlzIGFnYWluLgorICovCisgICAgdm9pZAorcmVzZXRfY3Rlcm1fY29sb3JzKCkKK3sKKyAgICBpZiAodF9jb2xvcnMgPiAxKQorICAgIHsKKwkvKiBzZXQgTm9ybWFsIGN0ZXJtIGNvbG9ycyAqLworCWlmIChjdGVybV9ub3JtYWxfZmdfY29sb3IgPiAwIHx8IGN0ZXJtX25vcm1hbF9iZ19jb2xvciA+IDApCisJeworCSAgICBvdXRfc3RyKFRfT1ApOworCSAgICBzY3JlZW5fYXR0ciA9IC0xOworCX0KKwlpZiAoY3Rlcm1fbm9ybWFsX2ZnX2JvbGQpCisJeworCSAgICBvdXRfc3RyKFRfTUUpOworCSAgICBzY3JlZW5fYXR0ciA9IC0xOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBQdXQgY2hhcmFjdGVyIFNjcmVlbkxpbmVzWyJvZmYiXSBvbiB0aGUgc2NyZWVuIGF0IHBvc2l0aW9uICJyb3ciIGFuZCAiY29sIiwKKyAqIHVzaW5nIHRoZSBhdHRyaWJ1dGVzIGZyb20gU2NyZWVuQXR0cnNbIm9mZiJdLgorICovCisgICAgc3RhdGljIHZvaWQKK3NjcmVlbl9jaGFyKG9mZiwgcm93LCBjb2wpCisgICAgdW5zaWduZWQJb2ZmOworICAgIGludAkJcm93OworICAgIGludAkJY29sOworeworICAgIGludAkJYXR0cjsKKworICAgIC8qIENoZWNrIGZvciBpbGxlZ2FsIHZhbHVlcywganVzdCBpbiBjYXNlIChjb3VsZCBoYXBwZW4ganVzdCBhZnRlcgorICAgICAqIHJlc2l6aW5nKS4gKi8KKyAgICBpZiAocm93ID49IHNjcmVlbl9Sb3dzIHx8IGNvbCA+PSBzY3JlZW5fQ29sdW1ucykKKwlyZXR1cm47CisKKyAgICAvKiBPdXRwdXR0aW5nIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgc2NyZWVuIG1heSBzY3JvbGx1cCB0aGUgc2NyZWVuLgorICAgICAqIERvbid0IHRvIGl0ISAgTWFyayB0aGUgY2hhcmFjdGVyIGludmFsaWQgKHVwZGF0ZSBpdCB3aGVuIHNjcm9sbGVkIHVwKSAqLworICAgIGlmIChyb3cgPT0gc2NyZWVuX1Jvd3MgLSAxICYmIGNvbCA9PSBzY3JlZW5fQ29sdW1ucyAtIDEKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICAvKiBhY2NvdW50IGZvciBmaXJzdCBjb21tYW5kLWxpbmUgY2hhcmFjdGVyIGluIHJpZ2h0bGVmdCBtb2RlICovCisJICAgICYmICFjbWRtc2dfcmwKKyNlbmRpZgorICAgICAgICkKKyAgICB7CisJU2NyZWVuQXR0cnNbb2ZmXSA9IChzYXR0cl9UKS0xOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0b3AgaGlnaGxpZ2h0aW5nIGZpcnN0LCBzbyBpdCdzIGVhc2llciB0byBtb3ZlIHRoZSBjdXJzb3IuCisgICAgICovCisjaWYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkgfHwgZGVmaW5lZChGRUFUX1ZFUlRTUExJVCkKKyAgICBpZiAoc2NyZWVuX2NoYXJfYXR0ciAhPSAwKQorCWF0dHIgPSBzY3JlZW5fY2hhcl9hdHRyOworICAgIGVsc2UKKyNlbmRpZgorCWF0dHIgPSBTY3JlZW5BdHRyc1tvZmZdOworICAgIGlmIChzY3JlZW5fYXR0ciAhPSBhdHRyKQorCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworCisgICAgd2luZGdvdG8ocm93LCBjb2wpOworCisgICAgaWYgKHNjcmVlbl9hdHRyICE9IGF0dHIpCisJc2NyZWVuX3N0YXJ0X2hpZ2hsaWdodChhdHRyKTsKKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX3V0ZjggJiYgU2NyZWVuTGluZXNVQ1tvZmZdICE9IDApCisgICAgeworCWNoYXJfdQkgICAgYnVmW01CX01BWEJZVEVTICsgMV07CisKKwkvKiBDb252ZXJ0IFVURi04IGNoYXJhY3RlciB0byBieXRlcyBhbmQgd3JpdGUgaXQuICovCisKKwlidWZbdXRmY19jaGFyMmJ5dGVzKG9mZiwgYnVmKV0gPSBOVUw7CisKKwlvdXRfc3RyKGJ1Zik7CisJaWYgKHV0Zl9jaGFyMmNlbGxzKFNjcmVlbkxpbmVzVUNbb2ZmXSkgPiAxKQorCSAgICArK3NjcmVlbl9jdXJfY29sOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCW91dF9mbHVzaF9jaGVjaygpOworI2VuZGlmCisJb3V0X2NoYXIoU2NyZWVuTGluZXNbb2ZmXSk7CisjaWZkZWYgRkVBVF9NQllURQorCS8qIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBpbiBzaW5nbGUtd2lkdGggY2VsbCAqLworCWlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgU2NyZWVuTGluZXNbb2ZmXSA9PSAweDhlKQorCSAgICBvdXRfY2hhcihTY3JlZW5MaW5lczJbb2ZmXSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBzY3JlZW5fY3VyX2NvbCsrOworfQorCisjaWZkZWYgRkVBVF9NQllURQorCisvKgorICogVXNlZCBmb3IgZW5jX2RiY3Mgb25seTogUHV0IG9uZSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIgYXQgU2NyZWVuTGluZXNbIm9mZiJdCisgKiBvbiB0aGUgc2NyZWVuIGF0IHBvc2l0aW9uICdyb3cnIGFuZCAnY29sJy4KKyAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBieXRlIGlzIHVzZWQgZm9yIGFsbC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KKyAqIG91dHB1dCB0aGUgdHdvIGJ5dGVzIG9mIGEgZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHdpdGggbm90aGluZyBpbiBiZXR3ZWVuLgorICovCisgICAgc3RhdGljIHZvaWQKK3NjcmVlbl9jaGFyXzIob2ZmLCByb3csIGNvbCkKKyAgICB1bnNpZ25lZAlvZmY7CisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7Cit7CisgICAgLyogQ2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzIChjb3VsZCBiZSB3cm9uZyB3aGVuIHNjcmVlbiB3YXMgcmVzaXplZCkuICovCisgICAgaWYgKG9mZiArIDEgPj0gKHVuc2lnbmVkKShzY3JlZW5fUm93cyAqIHNjcmVlbl9Db2x1bW5zKSkKKwlyZXR1cm47CisKKyAgICAvKiBPdXRwdXR0aW5nIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgc2NyZWVuIG1heSBzY3JvbGx1cCB0aGUgc2NyZWVuLgorICAgICAqIERvbid0IHRvIGl0ISAgTWFyayB0aGUgY2hhcmFjdGVyIGludmFsaWQgKHVwZGF0ZSBpdCB3aGVuIHNjcm9sbGVkIHVwKSAqLworICAgIGlmIChyb3cgPT0gc2NyZWVuX1Jvd3MgLSAxICYmIGNvbCA+PSBzY3JlZW5fQ29sdW1ucyAtIDIpCisgICAgeworCVNjcmVlbkF0dHJzW29mZl0gPSAoc2F0dHJfVCktMTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogT3V0cHV0IHRoZSBmaXJzdCBieXRlIG5vcm1hbGx5IChwb3NpdGlvbnMgdGhlIGN1cnNvciksIHRoZW4gd3JpdGUgdGhlCisgICAgICogc2Vjb25kIGJ5dGUgZGlyZWN0bHkuICovCisgICAgc2NyZWVuX2NoYXIob2ZmLCByb3csIGNvbCk7CisgICAgb3V0X2NoYXIoU2NyZWVuTGluZXNbb2ZmICsgMV0pOworICAgICsrc2NyZWVuX2N1cl9jb2w7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoRkVBVF9WRVJUU1BMSVQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRHJhdyBhIHJlY3RhbmdsZSBvZiB0aGUgc2NyZWVuLCBpbnZlcnRlZCB3aGVuICJpbnZlcnQiIGlzIFRSVUUuCisgKiBUaGlzIHVzZXMgdGhlIGNvbnRlbnRzIG9mIFNjcmVlbkxpbmVzW10gYW5kIGRvZXNuJ3QgY2hhbmdlIGl0LgorICovCisgICAgdm9pZAorc2NyZWVuX2RyYXdfcmVjdGFuZ2xlKHJvdywgY29sLCBoZWlnaHQsIHdpZHRoLCBpbnZlcnQpCisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7CisgICAgaW50CQloZWlnaHQ7CisgICAgaW50CQl3aWR0aDsKKyAgICBpbnQJCWludmVydDsKK3sKKyAgICBpbnQJCXIsIGM7CisgICAgaW50CQlvZmY7CisKKyAgICBpZiAoaW52ZXJ0KQorCXNjcmVlbl9jaGFyX2F0dHIgPSBITF9JTlZFUlNFOworICAgIGZvciAociA9IHJvdzsgciA8IHJvdyArIGhlaWdodDsgKytyKQorICAgIHsKKwlvZmYgPSBMaW5lT2Zmc2V0W3JdOworCWZvciAoYyA9IGNvbDsgYyA8IGNvbCArIHdpZHRoOyArK2MpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGVuY19kYmNzICE9IDAgJiYgZGJjc19vZmYyY2VsbHMob2ZmICsgYykgPiAxKQorCSAgICB7CisJCXNjcmVlbl9jaGFyXzIob2ZmICsgYywgciwgYyk7CisJCSsrYzsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQlzY3JlZW5fY2hhcihvZmYgKyBjLCByLCBjKTsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmICh1dGZfb2ZmMmNlbGxzKG9mZiArIGMpID4gMSkKKwkJICAgICsrYzsKKyNlbmRpZgorCSAgICB9CisJfQorICAgIH0KKyAgICBzY3JlZW5fY2hhcl9hdHRyID0gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKy8qCisgKiBSZWRyYXcgdGhlIGNoYXJhY3RlcnMgZm9yIGEgdmVydGljYWxseSBzcGxpdCB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVkcmF3X2Jsb2NrKHJvdywgZW5kLCB3cCkKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWVuZDsKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaW50CQljb2w7CisgICAgaW50CQl3aWR0aDsKKworIyBpZmRlZiBGRUFUX0NMSVBCT0FSRAorICAgIGNsaXBfbWF5X2NsZWFyX3NlbGVjdGlvbihyb3csIGVuZCAtIDEpOworIyBlbmRpZgorCisgICAgaWYgKHdwID09IE5VTEwpCisgICAgeworCWNvbCA9IDA7CisJd2lkdGggPSBDb2x1bW5zOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWNvbCA9IHdwLT53X3dpbmNvbDsKKwl3aWR0aCA9IHdwLT53X3dpZHRoOworICAgIH0KKyAgICBzY3JlZW5fZHJhd19yZWN0YW5nbGUocm93LCBjb2wsIGVuZCAtIHJvdywgd2lkdGgsIEZBTFNFKTsKK30KKyNlbmRpZgorCisvKgorICogRmlsbCB0aGUgc2NyZWVuIGZyb20gJ3N0YXJ0X3JvdycgdG8gJ2VuZF9yb3cnLCBmcm9tICdzdGFydF9jb2wnIHRvICdlbmRfY29sJworICogd2l0aCBjaGFyYWN0ZXIgJ2MxJyBpbiBmaXJzdCBjb2x1bW4gZm9sbG93ZWQgYnkgJ2MyJyBpbiB0aGUgb3RoZXIgY29sdW1ucy4KKyAqIFVzZSBhdHRyaWJ1dGVzICdhdHRyJy4KKyAqLworICAgIHZvaWQKK3NjcmVlbl9maWxsKHN0YXJ0X3JvdywgZW5kX3Jvdywgc3RhcnRfY29sLCBlbmRfY29sLCBjMSwgYzIsIGF0dHIpCisgICAgaW50CSAgICBzdGFydF9yb3csIGVuZF9yb3c7CisgICAgaW50CSAgICBzdGFydF9jb2wsIGVuZF9jb2w7CisgICAgaW50CSAgICBjMSwgYzI7CisgICAgaW50CSAgICBhdHRyOworeworICAgIGludAkJICAgIHJvdzsKKyAgICBpbnQJCSAgICBjb2w7CisgICAgaW50CQkgICAgb2ZmOworICAgIGludAkJICAgIGVuZF9vZmY7CisgICAgaW50CQkgICAgZGlkX2RlbGV0ZTsKKyAgICBpbnQJCSAgICBjOworICAgIGludAkJICAgIG5vcm1fdGVybTsKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFVOSVgpCisgICAgaW50CQkgICAgZm9yY2VfbmV4dCA9IEZBTFNFOworI2VuZGlmCisKKyAgICBpZiAoZW5kX3JvdyA+IHNjcmVlbl9Sb3dzKQkJLyogc2FmZXR5IGNoZWNrICovCisJZW5kX3JvdyA9IHNjcmVlbl9Sb3dzOworICAgIGlmIChlbmRfY29sID4gc2NyZWVuX0NvbHVtbnMpCS8qIHNhZmV0eSBjaGVjayAqLworCWVuZF9jb2wgPSBzY3JlZW5fQ29sdW1uczsKKyAgICBpZiAoU2NyZWVuTGluZXMgPT0gTlVMTAorCSAgICB8fCBzdGFydF9yb3cgPj0gZW5kX3JvdworCSAgICB8fCBzdGFydF9jb2wgPj0gZW5kX2NvbCkJLyogbm90aGluZyB0byBkbyAqLworCXJldHVybjsKKworICAgIC8qIGl0J3MgYSAibm9ybWFsIiB0ZXJtaW5hbCB3aGVuIG5vdCBpbiBhIEdVSSBvciBjdGVybSAqLworICAgIG5vcm1fdGVybSA9ICgKKyNpZmRlZiBGRUFUX0dVSQorCSAgICAhZ3VpLmluX3VzZSAmJgorI2VuZGlmCisJCQkgICAgdF9jb2xvcnMgPD0gMSk7CisgICAgZm9yIChyb3cgPSBzdGFydF9yb3c7IHJvdyA8IGVuZF9yb3c7ICsrcm93KQorICAgIHsKKwkvKgorCSAqIFRyeSB0byB1c2UgZGVsZXRlLWxpbmUgdGVybWNhcCBjb2RlLCB3aGVuIG5vIGF0dHJpYnV0ZXMgb3IgaW4gYQorCSAqICJub3JtYWwiIHRlcm1pbmFsLCB3aGVyZSBhIGJvbGQvaXRhbGljIHNwYWNlIGlzIGp1c3QgYQorCSAqIHNwYWNlLgorCSAqLworCWRpZF9kZWxldGUgPSBGQUxTRTsKKwlpZiAoYzIgPT0gJyAnCisJCSYmIGVuZF9jb2wgPT0gQ29sdW1ucworCQkmJiBjYW5fY2xlYXIoVF9DRSkKKwkJJiYgKGF0dHIgPT0gMAorCQkgICAgfHwgKG5vcm1fdGVybQorCQkJJiYgYXR0ciA8PSBITF9BTEwKKwkJCSYmICgoYXR0ciAmIH4oSExfQk9MRCB8IEhMX0lUQUxJQykpID09IDApKSkpCisJeworCSAgICAvKgorCSAgICAgKiBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byBjbGVhciBzb21ldGhpbmcKKwkgICAgICovCisJICAgIGNvbCA9IHN0YXJ0X2NvbDsKKwkgICAgaWYgKGMxICE9ICcgJykJCQkvKiBkb24ndCBjbGVhciBmaXJzdCBjaGFyICovCisJCSsrY29sOworCisJICAgIG9mZiA9IExpbmVPZmZzZXRbcm93XSArIGNvbDsKKwkgICAgZW5kX29mZiA9IExpbmVPZmZzZXRbcm93XSArIGVuZF9jb2w7CisKKwkgICAgLyogc2tpcCBibGFua3MgKHVzZWQgb2Z0ZW4sIGtlZXAgaXQgZmFzdCEpICovCisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoZW5jX3V0ZjgpCisJCXdoaWxlIChvZmYgPCBlbmRfb2ZmICYmIFNjcmVlbkxpbmVzW29mZl0gPT0gJyAnCisJCQkgICYmIFNjcmVlbkF0dHJzW29mZl0gPT0gMCAmJiBTY3JlZW5MaW5lc1VDW29mZl0gPT0gMCkKKwkJICAgICsrb2ZmOworCSAgICBlbHNlCisjZW5kaWYKKwkJd2hpbGUgKG9mZiA8IGVuZF9vZmYgJiYgU2NyZWVuTGluZXNbb2ZmXSA9PSAnICcKKwkJCQkJCSAgICAgJiYgU2NyZWVuQXR0cnNbb2ZmXSA9PSAwKQorCQkgICAgKytvZmY7CisJICAgIGlmIChvZmYgPCBlbmRfb2ZmKQkJLyogc29tZXRoaW5nIHRvIGJlIGNsZWFyZWQgKi8KKwkgICAgeworCQljb2wgPSBvZmYgLSBMaW5lT2Zmc2V0W3Jvd107CisJCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworCQl0ZXJtX3dpbmRnb3RvKHJvdywgY29sKTsvKiBjbGVhciByZXN0IG9mIHRoaXMgc2NyZWVuIGxpbmUgKi8KKwkJb3V0X3N0cihUX0NFKTsKKwkJc2NyZWVuX3N0YXJ0KCk7CQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KKwkJY29sID0gZW5kX2NvbCAtIGNvbDsKKwkJd2hpbGUgKGNvbC0tKQkJLyogY2xlYXIgY2hhcnMgaW4gU2NyZWVuTGluZXMgKi8KKwkJeworCQkgICAgU2NyZWVuTGluZXNbb2ZmXSA9ICcgJzsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoZW5jX3V0ZjgpCisJCQlTY3JlZW5MaW5lc1VDW29mZl0gPSAwOworI2VuZGlmCisJCSAgICBTY3JlZW5BdHRyc1tvZmZdID0gMDsKKwkJICAgICsrb2ZmOworCQl9CisJICAgIH0KKwkgICAgZGlkX2RlbGV0ZSA9IFRSVUU7CQkvKiB0aGUgY2hhcnMgYXJlIGNsZWFyZWQgbm93ICovCisJfQorCisJb2ZmID0gTGluZU9mZnNldFtyb3ddICsgc3RhcnRfY29sOworCWMgPSBjMTsKKwlmb3IgKGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgKytjb2wpCisJeworCSAgICBpZiAoU2NyZWVuTGluZXNbb2ZmXSAhPSBjCisjaWZkZWYgRkVBVF9NQllURQorCQkgICAgfHwgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzVUNbb2ZmXSAhPSAoYyA+PSAweDgwID8gYyA6IDApKQorI2VuZGlmCisJCSAgICB8fCBTY3JlZW5BdHRyc1tvZmZdICE9IGF0dHIKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFVOSVgpCisJCSAgICB8fCBmb3JjZV9uZXh0CisjZW5kaWYKKwkJICAgICkKKwkgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoVU5JWCkKKwkJLyogVGhlIGJvbGQgdHJpY2sgbWF5IG1ha2UgYSBzaW5nbGUgcm93IG9mIHBpeGVscyBhcHBlYXIgaW4KKwkJICogdGhlIG5leHQgY2hhcmFjdGVyLiAgV2hlbiBhIGJvbGQgY2hhcmFjdGVyIGlzIHJlbW92ZWQsIHRoZQorCQkgKiBuZXh0IGNoYXJhY3RlciBzaG91bGQgYmUgcmVkcmF3biB0b28uICBUaGlzIGhhcHBlbnMgZm9yIG91cgorCQkgKiBvd24gR1VJIGFuZCBmb3Igc29tZSB4dGVybXMuICAqLworCQlpZiAoCisjIGlmZGVmIEZFQVRfR1VJCisJCQlndWkuaW5fdXNlCisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoVU5JWCkKKwkJCXx8CisjIGVuZGlmCisjIGlmZGVmIFVOSVgKKwkJCXRlcm1faXNfeHRlcm0KKyMgZW5kaWYKKwkJICAgKQorCQl7CisJCSAgICBpZiAoU2NyZWVuTGluZXNbb2ZmXSAhPSAnICcKKwkJCSAgICAmJiAoU2NyZWVuQXR0cnNbb2ZmXSA+IEhMX0FMTAorCQkJCXx8IFNjcmVlbkF0dHJzW29mZl0gJiBITF9CT0xEKSkKKwkJCWZvcmNlX25leHQgPSBUUlVFOworCQkgICAgZWxzZQorCQkJZm9yY2VfbmV4dCA9IEZBTFNFOworCQl9CisjZW5kaWYKKwkJU2NyZWVuTGluZXNbb2ZmXSA9IGM7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoZW5jX3V0ZjgpCisJCXsKKwkJICAgIGlmIChjID49IDB4ODApCisJCSAgICB7CisJCQlTY3JlZW5MaW5lc1VDW29mZl0gPSBjOworCQkJU2NyZWVuTGluZXNDMVtvZmZdID0gMDsKKwkJCVNjcmVlbkxpbmVzQzJbb2ZmXSA9IDA7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQlTY3JlZW5MaW5lc1VDW29mZl0gPSAwOworCQl9CisjZW5kaWYKKwkJU2NyZWVuQXR0cnNbb2ZmXSA9IGF0dHI7CisJCWlmICghZGlkX2RlbGV0ZSB8fCBjICE9ICcgJykKKwkJICAgIHNjcmVlbl9jaGFyKG9mZiwgcm93LCBjb2wpOworCSAgICB9CisJICAgICsrb2ZmOworCSAgICBpZiAoY29sID09IHN0YXJ0X2NvbCkKKwkgICAgeworCQlpZiAoZGlkX2RlbGV0ZSkKKwkJICAgIGJyZWFrOworCQljID0gYzI7CisJICAgIH0KKwl9CisJaWYgKGVuZF9jb2wgPT0gQ29sdW1ucykKKwkgICAgTGluZVdyYXBzW3Jvd10gPSBGQUxTRTsKKwlpZiAocm93ID09IFJvd3MgLSAxKQkJLyogb3ZlcndyaXR0ZW4gdGhlIGNvbW1hbmQgbGluZSAqLworCXsKKwkgICAgcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworCSAgICBpZiAoYzEgPT0gJyAnICYmIGMyID09ICcgJykKKwkJY2xlYXJfY21kbGluZSA9IEZBTFNFOwkvKiBjb21tYW5kIGxpbmUgaGFzIGJlZW4gY2xlYXJlZCAqLworCX0KKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGVyZSBzaG91bGQgYmUgYSBkZWxheS4gIFVzZWQgYmVmb3JlIGNsZWFyaW5nIG9yIHJlZHJhd2luZyB0aGUKKyAqIHNjcmVlbiBvciB0aGUgY29tbWFuZCBsaW5lLgorICovCisgICAgdm9pZAorY2hlY2tfZm9yX2RlbGF5KGNoZWNrX21zZ19zY3JvbGwpCisgICAgaW50CSAgICBjaGVja19tc2dfc2Nyb2xsOworeworICAgIGlmICgoZW1zZ19vbl9kaXNwbGF5IHx8IChjaGVja19tc2dfc2Nyb2xsICYmIG1zZ19zY3JvbGwpKQorCSAgICAmJiAhZGlkX3dhaXRfcmV0dXJuCisJICAgICYmIGVtc2dfc2lsZW50ID09IDApCisgICAgeworCW91dF9mbHVzaCgpOworCXVpX2RlbGF5KDEwMDBMLCBUUlVFKTsKKwllbXNnX29uX2Rpc3BsYXkgPSBGQUxTRTsKKwlpZiAoY2hlY2tfbXNnX3Njcm9sbCkKKwkgICAgbXNnX3Njcm9sbCA9IEZBTFNFOworICAgIH0KK30KKworLyoKKyAqIHNjcmVlbl92YWxpZCAtICBhbGxvY2F0ZSBzY3JlZW4gYnVmZmVycyBpZiBzaXplIGNoYW5nZWQKKyAqICAgSWYgImNsZWFyIiBpcyBUUlVFOiBjbGVhciBzY3JlZW4gaWYgaXQgaGFzIGJlZW4gcmVzaXplZC4KKyAqCVJldHVybnMgVFJVRSBpZiB0aGVyZSBpcyBhIHZhbGlkIHNjcmVlbiB0byB3cml0ZSB0by4KKyAqCVJldHVybnMgRkFMU0Ugd2hlbiBzdGFydGluZyB1cCBhbmQgc2NyZWVuIG5vdCBpbml0aWFsaXplZCB5ZXQuCisgKi8KKyAgICBpbnQKK3NjcmVlbl92YWxpZChjbGVhcikKKyAgICBpbnQJICAgIGNsZWFyOworeworICAgIHNjcmVlbmFsbG9jKGNsZWFyKTsJICAgIC8qIGFsbG9jYXRlIHNjcmVlbiBidWZmZXJzIGlmIHNpemUgY2hhbmdlZCAqLworICAgIHJldHVybiAoU2NyZWVuTGluZXMgIT0gTlVMTCk7Cit9CisKKy8qCisgKiBSZXNpemUgdGhlIHNoZWxsIHRvIFJvd3MgYW5kIENvbHVtbnMuCisgKiBBbGxvY2F0ZSBTY3JlZW5MaW5lc1tdIGFuZCBhc3NvY2lhdGVkIGl0ZW1zLgorICoKKyAqIFRoZXJlIG1heSBiZSBzb21lIHRpbWUgYmV0d2VlbiBzZXR0aW5nIFJvd3MgYW5kIENvbHVtbnMgYW5kIChyZSlhbGxvY2F0aW5nCisgKiBTY3JlZW5MaW5lc1tdLiAgVGhpcyBoYXBwZW5zIHdoZW4gc3RhcnRpbmcgdXAgYW5kIHdoZW4gKG1hbnVhbGx5KSBjaGFuZ2luZworICogdGhlIHNoZWxsIHNpemUuICBBbHdheXMgdXNlIHNjcmVlbl9Sb3dzIGFuZCBzY3JlZW5fQ29sdW1ucyB0byBhY2Nlc3MgaXRlbXMKKyAqIGluIFNjcmVlbkxpbmVzW10uICBVc2UgUm93cyBhbmQgQ29sdW1ucyBmb3IgcG9zaXRpb25pbmcgdGV4dCBldGMuIHdoZXJlIHRoZQorICogZmluYWwgc2l6ZSBvZiB0aGUgc2hlbGwgaXMgbmVlZGVkLgorICovCisgICAgdm9pZAorc2NyZWVuYWxsb2MoY2xlYXIpCisgICAgaW50CSAgICBjbGVhcjsKK3sKKyAgICBpbnQJCSAgICBuZXdfcm93LCBvbGRfcm93OworI2lmZGVmIEZFQVRfR1VJCisgICAgaW50CQkgICAgb2xkX1Jvd3M7CisjZW5kaWYKKyAgICB3aW5fVAkgICAgKndwOworICAgIGludAkJICAgIG91dG9mbWVtID0gRkFMU0U7CisgICAgaW50CQkgICAgbGVuOworICAgIHNjaGFyX1QJICAgICpuZXdfU2NyZWVuTGluZXM7CisjaWZkZWYgRkVBVF9NQllURQorICAgIHU4Y2hhcl9UCSAgICAqbmV3X1NjcmVlbkxpbmVzVUMgPSBOVUxMOworICAgIHU4Y2hhcl9UCSAgICAqbmV3X1NjcmVlbkxpbmVzQzEgPSBOVUxMOworICAgIHU4Y2hhcl9UCSAgICAqbmV3X1NjcmVlbkxpbmVzQzIgPSBOVUxMOworICAgIHNjaGFyX1QJICAgICpuZXdfU2NyZWVuTGluZXMyID0gTlVMTDsKKyNlbmRpZgorICAgIHNhdHRyX1QJICAgICpuZXdfU2NyZWVuQXR0cnM7CisgICAgdW5zaWduZWQJICAgICpuZXdfTGluZU9mZnNldDsKKyAgICBjaGFyX3UJICAgICpuZXdfTGluZVdyYXBzOworICAgIHN0YXRpYyBpbnQJICAgIGVudGVyZWQgPSBGQUxTRTsJCS8qIGF2b2lkIHJlY3Vyc2l2ZW5lc3MgKi8KKworICAgIC8qCisgICAgICogQWxsb2NhdGlvbiBvZiB0aGUgc2NyZWVuIGJ1ZmZlcnMgaXMgZG9uZSBvbmx5IHdoZW4gdGhlIHNpemUgY2hhbmdlcyBhbmQKKyAgICAgKiB3aGVuIFJvd3MgYW5kIENvbHVtbnMgaGF2ZSBiZWVuIHNldCBhbmQgd2UgaGF2ZSBzdGFydGVkIGRvaW5nIGZ1bGwKKyAgICAgKiBzY3JlZW4gc3R1ZmYuCisgICAgICovCisgICAgaWYgKChTY3JlZW5MaW5lcyAhPSBOVUxMCisJCSYmIFJvd3MgPT0gc2NyZWVuX1Jvd3MKKwkJJiYgQ29sdW1ucyA9PSBzY3JlZW5fQ29sdW1ucworI2lmZGVmIEZFQVRfTUJZVEUKKwkJJiYgZW5jX3V0ZjggPT0gKFNjcmVlbkxpbmVzVUMgIT0gTlVMTCkKKwkJJiYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkgPT0gKFNjcmVlbkxpbmVzMiAhPSBOVUxMKQorI2VuZGlmCisJCSkKKwkgICAgfHwgUm93cyA9PSAwCisJICAgIHx8IENvbHVtbnMgPT0gMAorCSAgICB8fCAoIWZ1bGxfc2NyZWVuICYmIFNjcmVlbkxpbmVzID09IE5VTEwpKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogSXQncyBwb3NzaWJsZSB0aGF0IHdlIHByb2R1Y2UgYW4gb3V0LW9mLW1lbW9yeSBtZXNzYWdlIGJlbG93LCB3aGljaAorICAgICAqIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWdhaW4uICBUbyBicmVhayB0aGUgbG9vcCwganVzdAorICAgICAqIHJldHVybiBoZXJlLgorICAgICAqLworICAgIGlmIChlbnRlcmVkKQorCXJldHVybjsKKyAgICBlbnRlcmVkID0gVFJVRTsKKworICAgIHdpbl9uZXdfc2hlbGxzaXplKCk7ICAgIC8qIGZpdCB0aGUgd2luZG93cyBpbiB0aGUgbmV3IHNpemVkIHNoZWxsICovCisKKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgdmltX2xvY2tfc2NyZWVuKCk7ICAvKiBiZSBzYWZlLCBwdXQgaXQgaGVyZSAqLworI2VuZGlmCisKKyAgICBjb21wX2NvbCgpOwkJLyogcmVjb21wdXRlIGNvbHVtbnMgZm9yIHNob3duIGNvbW1hbmQgYW5kIHJ1bGVyICovCisKKyAgICAvKgorICAgICAqIFdlJ3JlIGNoYW5naW5nIHRoZSBzaXplIG9mIHRoZSBzY3JlZW4uCisgICAgICogLSBBbGxvY2F0ZSBuZXcgYXJyYXlzIGZvciBTY3JlZW5MaW5lcyBhbmQgU2NyZWVuQXR0cnMuCisgICAgICogLSBNb3ZlIGxpbmVzIGZyb20gdGhlIG9sZCBhcnJheXMgaW50byB0aGUgbmV3IGFycmF5cywgY2xlYXIgZXh0cmEKKyAgICAgKgkgbGluZXMgKHVubGVzcyB0aGUgc2NyZWVuIGlzIGdvaW5nIHRvIGJlIGNsZWFyZWQpLgorICAgICAqIC0gRnJlZSB0aGUgb2xkIGFycmF5cy4KKyAgICAgKgorICAgICAqIElmIGFueXRoaW5nIGZhaWxzLCBtYWtlIFNjcmVlbkxpbmVzIE5VTEwsIHNvIHdlIGRvbid0IGRvIGFueXRoaW5nIQorICAgICAqIENvbnRpbnVpbmcgd2l0aCB0aGUgb2xkIFNjcmVlbkxpbmVzIG1heSByZXN1bHQgaW4gYSBjcmFzaCwgYmVjYXVzZSB0aGUKKyAgICAgKiBzaXplIGlzIHdyb25nLgorICAgICAqLworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3A7IHdwID0gd3AtPndfbmV4dCkKKwl3aW5fZnJlZV9sc2l6ZSh3cCk7CisjZWxzZQorCXdpbl9mcmVlX2xzaXplKGN1cndpbik7CisjZW5kaWYKKworICAgIG5ld19TY3JlZW5MaW5lcyA9IChzY2hhcl9UICopbGFsbG9jKChsb25nX3UpKAorCQkJICAgICAgKFJvd3MgKyAxKSAqIENvbHVtbnMgKiBzaXplb2Yoc2NoYXJfVCkpLCBGQUxTRSk7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChlbmNfdXRmOCkKKyAgICB7CisJbmV3X1NjcmVlbkxpbmVzVUMgPSAodThjaGFyX1QgKilsYWxsb2MoKGxvbmdfdSkoCisJCQkgICAgIChSb3dzICsgMSkgKiBDb2x1bW5zICogc2l6ZW9mKHU4Y2hhcl9UKSksIEZBTFNFKTsKKwluZXdfU2NyZWVuTGluZXNDMSA9ICh1OGNoYXJfVCAqKWxhbGxvYygobG9uZ191KSgKKwkJCSAgICAgKFJvd3MgKyAxKSAqIENvbHVtbnMgKiBzaXplb2YodThjaGFyX1QpKSwgRkFMU0UpOworCW5ld19TY3JlZW5MaW5lc0MyID0gKHU4Y2hhcl9UICopbGFsbG9jKChsb25nX3UpKAorCQkJICAgICAoUm93cyArIDEpICogQ29sdW1ucyAqIHNpemVvZih1OGNoYXJfVCkpLCBGQUxTRSk7CisgICAgfQorICAgIGlmIChlbmNfZGJjcyA9PSBEQkNTX0pQTlUpCisJbmV3X1NjcmVlbkxpbmVzMiA9IChzY2hhcl9UICopbGFsbG9jKChsb25nX3UpKAorCQkJICAgICAoUm93cyArIDEpICogQ29sdW1ucyAqIHNpemVvZihzY2hhcl9UKSksIEZBTFNFKTsKKyNlbmRpZgorICAgIG5ld19TY3JlZW5BdHRycyA9IChzYXR0cl9UICopbGFsbG9jKChsb25nX3UpKAorCQkJICAgICAgKFJvd3MgKyAxKSAqIENvbHVtbnMgKiBzaXplb2Yoc2F0dHJfVCkpLCBGQUxTRSk7CisgICAgbmV3X0xpbmVPZmZzZXQgPSAodW5zaWduZWQgKilsYWxsb2MoKGxvbmdfdSkoCisJCQkJCSBSb3dzICogc2l6ZW9mKHVuc2lnbmVkKSksIEZBTFNFKTsKKyAgICBuZXdfTGluZVdyYXBzID0gKGNoYXJfdSAqKWxhbGxvYygobG9uZ191KShSb3dzICogc2l6ZW9mKGNoYXJfdSkpLCBGQUxTRSk7CisKKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3aW5fYWxsb2NfbGluZXMod3ApID09IEZBSUwpCisJeworCSAgICBvdXRvZm1lbSA9IFRSVUU7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIGJyZWFrOworI2VuZGlmCisJfQorICAgIH0KKworICAgIGlmIChuZXdfU2NyZWVuTGluZXMgPT0gTlVMTAorI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgfHwgKGVuY191dGY4ICYmIChuZXdfU2NyZWVuTGluZXNVQyA9PSBOVUxMCisJCSAgIHx8IG5ld19TY3JlZW5MaW5lc0MxID09IE5VTEwgfHwgbmV3X1NjcmVlbkxpbmVzQzIgPT0gTlVMTCkpCisJICAgIHx8IChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgbmV3X1NjcmVlbkxpbmVzMiA9PSBOVUxMKQorI2VuZGlmCisJICAgIHx8IG5ld19TY3JlZW5BdHRycyA9PSBOVUxMCisJICAgIHx8IG5ld19MaW5lT2Zmc2V0ID09IE5VTEwKKwkgICAgfHwgbmV3X0xpbmVXcmFwcyA9PSBOVUxMCisJICAgIHx8IG91dG9mbWVtKQorICAgIHsKKwlkb19vdXRvZm1lbV9tc2coKGxvbmdfdSkoKFJvd3MgKyAxKSAqIENvbHVtbnMpKTsgICAgLyogZ3Vlc3MgdGhlIHNpemUgKi8KKwl2aW1fZnJlZShuZXdfU2NyZWVuTGluZXMpOworCW5ld19TY3JlZW5MaW5lcyA9IE5VTEw7CisjaWZkZWYgRkVBVF9NQllURQorCXZpbV9mcmVlKG5ld19TY3JlZW5MaW5lc1VDKTsKKwluZXdfU2NyZWVuTGluZXNVQyA9IE5VTEw7CisJdmltX2ZyZWUobmV3X1NjcmVlbkxpbmVzQzEpOworCW5ld19TY3JlZW5MaW5lc0MxID0gTlVMTDsKKwl2aW1fZnJlZShuZXdfU2NyZWVuTGluZXNDMik7CisJbmV3X1NjcmVlbkxpbmVzQzIgPSBOVUxMOworCXZpbV9mcmVlKG5ld19TY3JlZW5MaW5lczIpOworCW5ld19TY3JlZW5MaW5lczIgPSBOVUxMOworI2VuZGlmCisJdmltX2ZyZWUobmV3X1NjcmVlbkF0dHJzKTsKKwluZXdfU2NyZWVuQXR0cnMgPSBOVUxMOworCXZpbV9mcmVlKG5ld19MaW5lT2Zmc2V0KTsKKwluZXdfTGluZU9mZnNldCA9IE5VTEw7CisJdmltX2ZyZWUobmV3X0xpbmVXcmFwcyk7CisJbmV3X0xpbmVXcmFwcyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZm9yIChuZXdfcm93ID0gMDsgbmV3X3JvdyA8IFJvd3M7ICsrbmV3X3JvdykKKwl7CisJICAgIG5ld19MaW5lT2Zmc2V0W25ld19yb3ddID0gbmV3X3JvdyAqIENvbHVtbnM7CisJICAgIG5ld19MaW5lV3JhcHNbbmV3X3Jvd10gPSBGQUxTRTsKKworCSAgICAvKgorCSAgICAgKiBJZiB0aGUgc2NyZWVuIGlzIG5vdCBnb2luZyB0byBiZSBjbGVhcmVkLCBjb3B5IGFzIG11Y2ggYXMKKwkgICAgICogcG9zc2libGUgZnJvbSB0aGUgb2xkIHNjcmVlbiB0byB0aGUgbmV3IG9uZSBhbmQgY2xlYXIgdGhlIHJlc3QKKwkgICAgICogKHVzZWQgd2hlbiByZXNpemluZyB0aGUgd2luZG93IGF0IHRoZSAiLS1tb3JlLS0iIHByb21wdCBvciB3aGVuCisJICAgICAqIGV4ZWN1dGluZyBhbiBleHRlcm5hbCBjb21tYW5kLCBmb3IgdGhlIEdVSSkuCisJICAgICAqLworCSAgICBpZiAoIWNsZWFyKQorCSAgICB7CisJCSh2b2lkKXZpbV9tZW1zZXQobmV3X1NjcmVlbkxpbmVzICsgbmV3X3JvdyAqIENvbHVtbnMsCisJCQkJICAgICAgJyAnLCAoc2l6ZV90KUNvbHVtbnMgKiBzaXplb2Yoc2NoYXJfVCkpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGVuY191dGY4KQorCQl7CisJCSAgICAodm9pZCl2aW1fbWVtc2V0KG5ld19TY3JlZW5MaW5lc1VDICsgbmV3X3JvdyAqIENvbHVtbnMsCisJCQkJICAgICAgIDAsIChzaXplX3QpQ29sdW1ucyAqIHNpemVvZih1OGNoYXJfVCkpOworCQkgICAgKHZvaWQpdmltX21lbXNldChuZXdfU2NyZWVuTGluZXNDMSArIG5ld19yb3cgKiBDb2x1bW5zLAorCQkJCSAgICAgICAwLCAoc2l6ZV90KUNvbHVtbnMgKiBzaXplb2YodThjaGFyX1QpKTsKKwkJICAgICh2b2lkKXZpbV9tZW1zZXQobmV3X1NjcmVlbkxpbmVzQzIgKyBuZXdfcm93ICogQ29sdW1ucywKKwkJCQkgICAgICAgMCwgKHNpemVfdClDb2x1bW5zICogc2l6ZW9mKHU4Y2hhcl9UKSk7CisJCX0KKwkJaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwkJICAgICh2b2lkKXZpbV9tZW1zZXQobmV3X1NjcmVlbkxpbmVzMiArIG5ld19yb3cgKiBDb2x1bW5zLAorCQkJCSAgICAgICAwLCAoc2l6ZV90KUNvbHVtbnMgKiBzaXplb2Yoc2NoYXJfVCkpOworI2VuZGlmCisJCSh2b2lkKXZpbV9tZW1zZXQobmV3X1NjcmVlbkF0dHJzICsgbmV3X3JvdyAqIENvbHVtbnMsCisJCQkJCTAsIChzaXplX3QpQ29sdW1ucyAqIHNpemVvZihzYXR0cl9UKSk7CisJCW9sZF9yb3cgPSBuZXdfcm93ICsgKHNjcmVlbl9Sb3dzIC0gUm93cyk7CisJCWlmIChvbGRfcm93ID49IDApCisJCXsKKwkJICAgIGlmIChzY3JlZW5fQ29sdW1ucyA8IENvbHVtbnMpCisJCQlsZW4gPSBzY3JlZW5fQ29sdW1uczsKKwkJICAgIGVsc2UKKwkJCWxlbiA9IENvbHVtbnM7CisJCSAgICBtY2hfbWVtbW92ZShuZXdfU2NyZWVuTGluZXMgKyBuZXdfTGluZU9mZnNldFtuZXdfcm93XSwKKwkJCSAgICBTY3JlZW5MaW5lcyArIExpbmVPZmZzZXRbb2xkX3Jvd10sCisJCQkgICAgKHNpemVfdClsZW4gKiBzaXplb2Yoc2NoYXJfVCkpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGlmIChlbmNfdXRmOCAmJiBTY3JlZW5MaW5lc1VDICE9IE5VTEwpCisJCSAgICB7CisJCQltY2hfbWVtbW92ZShuZXdfU2NyZWVuTGluZXNVQyArIG5ld19MaW5lT2Zmc2V0W25ld19yb3ddLAorCQkJCVNjcmVlbkxpbmVzVUMgKyBMaW5lT2Zmc2V0W29sZF9yb3ddLAorCQkJCShzaXplX3QpbGVuICogc2l6ZW9mKHU4Y2hhcl9UKSk7CisJCQltY2hfbWVtbW92ZShuZXdfU2NyZWVuTGluZXNDMSArIG5ld19MaW5lT2Zmc2V0W25ld19yb3ddLAorCQkJCVNjcmVlbkxpbmVzQzEgKyBMaW5lT2Zmc2V0W29sZF9yb3ddLAorCQkJCShzaXplX3QpbGVuICogc2l6ZW9mKHU4Y2hhcl9UKSk7CisJCQltY2hfbWVtbW92ZShuZXdfU2NyZWVuTGluZXNDMiArIG5ld19MaW5lT2Zmc2V0W25ld19yb3ddLAorCQkJCVNjcmVlbkxpbmVzQzIgKyBMaW5lT2Zmc2V0W29sZF9yb3ddLAorCQkJCShzaXplX3QpbGVuICogc2l6ZW9mKHU4Y2hhcl9UKSk7CisJCSAgICB9CisJCSAgICBpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmIFNjcmVlbkxpbmVzMiAhPSBOVUxMKQorCQkJbWNoX21lbW1vdmUobmV3X1NjcmVlbkxpbmVzMiArIG5ld19MaW5lT2Zmc2V0W25ld19yb3ddLAorCQkJCVNjcmVlbkxpbmVzMiArIExpbmVPZmZzZXRbb2xkX3Jvd10sCisJCQkJKHNpemVfdClsZW4gKiBzaXplb2Yoc2NoYXJfVCkpOworI2VuZGlmCisJCSAgICBtY2hfbWVtbW92ZShuZXdfU2NyZWVuQXR0cnMgKyBuZXdfTGluZU9mZnNldFtuZXdfcm93XSwKKwkJCSAgICBTY3JlZW5BdHRycyArIExpbmVPZmZzZXRbb2xkX3Jvd10sCisJCQkgICAgKHNpemVfdClsZW4gKiBzaXplb2Yoc2F0dHJfVCkpOworCQl9CisJICAgIH0KKwl9CisJLyogVXNlIHRoZSBsYXN0IGxpbmUgb2YgdGhlIHNjcmVlbiBmb3IgdGhlIGN1cnJlbnQgbGluZS4gKi8KKwljdXJyZW50X1NjcmVlbkxpbmUgPSBuZXdfU2NyZWVuTGluZXMgKyBSb3dzICogQ29sdW1uczsKKyAgICB9CisKKyAgICB2aW1fZnJlZShTY3JlZW5MaW5lcyk7CisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbV9mcmVlKFNjcmVlbkxpbmVzVUMpOworICAgIHZpbV9mcmVlKFNjcmVlbkxpbmVzQzEpOworICAgIHZpbV9mcmVlKFNjcmVlbkxpbmVzQzIpOworICAgIHZpbV9mcmVlKFNjcmVlbkxpbmVzMik7CisjZW5kaWYKKyAgICB2aW1fZnJlZShTY3JlZW5BdHRycyk7CisgICAgdmltX2ZyZWUoTGluZU9mZnNldCk7CisgICAgdmltX2ZyZWUoTGluZVdyYXBzKTsKKyAgICBTY3JlZW5MaW5lcyA9IG5ld19TY3JlZW5MaW5lczsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgU2NyZWVuTGluZXNVQyA9IG5ld19TY3JlZW5MaW5lc1VDOworICAgIFNjcmVlbkxpbmVzQzEgPSBuZXdfU2NyZWVuTGluZXNDMTsKKyAgICBTY3JlZW5MaW5lc0MyID0gbmV3X1NjcmVlbkxpbmVzQzI7CisgICAgU2NyZWVuTGluZXMyID0gbmV3X1NjcmVlbkxpbmVzMjsKKyNlbmRpZgorICAgIFNjcmVlbkF0dHJzID0gbmV3X1NjcmVlbkF0dHJzOworICAgIExpbmVPZmZzZXQgPSBuZXdfTGluZU9mZnNldDsKKyAgICBMaW5lV3JhcHMgPSBuZXdfTGluZVdyYXBzOworCisgICAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCBzY3JlZW5fUm93cyBhbmQgc2NyZWVuX0NvbHVtbnMgcmVmbGVjdCB0aGUgYWN0dWFsCisgICAgICogc2l6ZSBvZiBTY3JlZW5MaW5lc1tdLiAgU2V0IHRoZW0gYmVmb3JlIGNhbGxpbmcgYW55dGhpbmcuICovCisjaWZkZWYgRkVBVF9HVUkKKyAgICBvbGRfUm93cyA9IHNjcmVlbl9Sb3dzOworI2VuZGlmCisgICAgc2NyZWVuX1Jvd3MgPSBSb3dzOworICAgIHNjcmVlbl9Db2x1bW5zID0gQ29sdW1uczsKKworICAgIG11c3RfcmVkcmF3ID0gQ0xFQVI7CS8qIG5lZWQgdG8gY2xlYXIgdGhlIHNjcmVlbiBsYXRlciAqLworICAgIGlmIChjbGVhcikKKwlzY3JlZW5jbGVhcjIoKTsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgZWxzZSBpZiAoZ3VpLmluX3VzZQorCSAgICAmJiAhZ3VpLnN0YXJ0aW5nCisJICAgICYmIFNjcmVlbkxpbmVzICE9IE5VTEwKKwkgICAgJiYgb2xkX1Jvd3MgIT0gUm93cykKKyAgICB7CisJKHZvaWQpZ3VpX3JlZHJhd19ibG9jaygwLCAwLCAoaW50KVJvd3MgLSAxLCAoaW50KUNvbHVtbnMgLSAxLCAwKTsKKwkvKgorCSAqIEFkanVzdCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciwgZm9yIHdoZW4gZXhlY3V0aW5nIGFuIGV4dGVybmFsCisJICogY29tbWFuZC4KKwkgKi8KKwlpZiAobXNnX3JvdyA+PSBSb3dzKQkJLyogUm93cyBnb3Qgc21hbGxlciAqLworCSAgICBtc2dfcm93ID0gUm93cyAtIDE7CQkvKiBwdXQgY3Vyc29yIGF0IGxhc3Qgcm93ICovCisJZWxzZSBpZiAoUm93cyA+IG9sZF9Sb3dzKQkvKiBSb3dzIGdvdCBiaWdnZXIgKi8KKwkgICAgbXNnX3JvdyArPSBSb3dzIC0gb2xkX1Jvd3M7IC8qIHB1dCBjdXJzb3IgaW4gc2FtZSBwbGFjZSAqLworCWlmIChtc2dfY29sID49IENvbHVtbnMpCQkvKiBDb2x1bW5zIGdvdCBzbWFsbGVyICovCisJICAgIG1zZ19jb2wgPSBDb2x1bW5zIC0gMTsJLyogcHV0IGN1cnNvciBhdCBsYXN0IGNvbHVtbiAqLworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfQkVPUworICAgIHZpbV91bmxvY2tfc2NyZWVuKCk7CisjZW5kaWYKKyAgICBlbnRlcmVkID0gRkFMU0U7Cit9CisKKyAgICB2b2lkCitzY3JlZW5jbGVhcigpCit7CisgICAgY2hlY2tfZm9yX2RlbGF5KEZBTFNFKTsKKyAgICBzY3JlZW5hbGxvYyhGQUxTRSk7CSAgICAvKiBhbGxvY2F0ZSBzY3JlZW4gYnVmZmVycyBpZiBzaXplIGNoYW5nZWQgKi8KKyAgICBzY3JlZW5jbGVhcjIoKTsJICAgIC8qIGNsZWFyIHRoZSBzY3JlZW4gKi8KK30KKworICAgIHN0YXRpYyB2b2lkCitzY3JlZW5jbGVhcjIoKQoreworICAgIGludAkgICAgaTsKKworICAgIGlmIChzdGFydGluZyA9PSBOT19TQ1JFRU4gfHwgU2NyZWVuTGluZXMgPT0gTlVMTAorI2lmZGVmIEZFQVRfR1VJCisJICAgIHx8IChndWkuaW5fdXNlICYmIGd1aS5zdGFydGluZykKKyNlbmRpZgorCSAgICApCisJcmV0dXJuOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoIWd1aS5pbl91c2UpCisjZW5kaWYKKwlzY3JlZW5fYXR0ciA9IC0xOwkvKiBmb3JjZSBzZXR0aW5nIHRoZSBOb3JtYWwgY29sb3JzICovCisgICAgc2NyZWVuX3N0b3BfaGlnaGxpZ2h0KCk7CS8qIGRvbid0IHdhbnQgaGlnaGxpZ2h0aW5nIGhlcmUgKi8KKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyogZGlzYWJsZSBzZWxlY3Rpb24gd2l0aG91dCByZWRyYXdpbmcgaXQgKi8KKyAgICBjbGlwX3Njcm9sbF9zZWxlY3Rpb24oOTk5OSk7CisjZW5kaWYKKworICAgIC8qIGJsYW5rIG91dCBTY3JlZW5MaW5lcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBSb3dzOyArK2kpCisgICAgeworCWxpbmVjbGVhcihMaW5lT2Zmc2V0W2ldLCAoaW50KUNvbHVtbnMpOworCUxpbmVXcmFwc1tpXSA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChjYW5fY2xlYXIoVF9DTCkpCisgICAgeworCW91dF9zdHIoVF9DTCk7CQkvKiBjbGVhciB0aGUgZGlzcGxheSAqLworCWNsZWFyX2NtZGxpbmUgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBjYW4ndCBjbGVhciB0aGUgc2NyZWVuLCBtYXJrIGFsbCBjaGFycyB3aXRoIGludmFsaWQgYXR0cmlidXRlcyAqLworCWZvciAoaSA9IDA7IGkgPCBSb3dzOyArK2kpCisJICAgIGxpbmVpbnZhbGlkKExpbmVPZmZzZXRbaV0sIChpbnQpQ29sdW1ucyk7CisJY2xlYXJfY21kbGluZSA9IFRSVUU7CisgICAgfQorCisgICAgc2NyZWVuX2NsZWFyZWQgPSBUUlVFOwkvKiBjYW4gdXNlIGNvbnRlbnRzIG9mIFNjcmVlbkxpbmVzIG5vdyAqLworCisgICAgd2luX3Jlc3RfaW52YWxpZChmaXJzdHdpbik7CisgICAgcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworICAgIGlmIChtdXN0X3JlZHJhdyA9PSBDTEVBUikJLyogbm8gbmVlZCB0byBjbGVhciBhZ2FpbiAqLworCW11c3RfcmVkcmF3ID0gTk9UX1ZBTElEOworICAgIGNvbXB1dGVfY21kcm93KCk7CisgICAgbXNnX3JvdyA9IGNtZGxpbmVfcm93OwkvKiBwdXQgY3Vyc29yIG9uIGxhc3QgbGluZSBmb3IgbWVzc2FnZXMgKi8KKyAgICBtc2dfY29sID0gMDsKKyAgICBzY3JlZW5fc3RhcnQoKTsJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworICAgIG1zZ19zY3JvbGxlZCA9IDA7CQkvKiBjYW4ndCBzY3JvbGwgYmFjayAqLworICAgIG1zZ19kaWRhbnkgPSBGQUxTRTsKKyAgICBtc2dfZGlkb3V0ID0gRkFMU0U7Cit9CisKKy8qCisgKiBDbGVhciBvbmUgbGluZSBpbiBTY3JlZW5MaW5lcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitsaW5lY2xlYXIob2ZmLCB3aWR0aCkKKyAgICB1bnNpZ25lZAlvZmY7CisgICAgaW50CQl3aWR0aDsKK3sKKyAgICAodm9pZCl2aW1fbWVtc2V0KFNjcmVlbkxpbmVzICsgb2ZmLCAnICcsIChzaXplX3Qpd2lkdGggKiBzaXplb2Yoc2NoYXJfVCkpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX3V0ZjgpCisJKHZvaWQpdmltX21lbXNldChTY3JlZW5MaW5lc1VDICsgb2ZmLCAwLAorCQkJCQkgIChzaXplX3Qpd2lkdGggKiBzaXplb2YodThjaGFyX1QpKTsKKyNlbmRpZgorICAgICh2b2lkKXZpbV9tZW1zZXQoU2NyZWVuQXR0cnMgKyBvZmYsIDAsIChzaXplX3Qpd2lkdGggKiBzaXplb2Yoc2F0dHJfVCkpOworfQorCisvKgorICogTWFyayBvbmUgbGluZSBpbiBTY3JlZW5MaW5lcyBpbnZhbGlkIGJ5IHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMgdG8gYW4KKyAqIGludmFsaWQgdmFsdWUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbGluZWludmFsaWQob2ZmLCB3aWR0aCkKKyAgICB1bnNpZ25lZAlvZmY7CisgICAgaW50CQl3aWR0aDsKK3sKKyAgICAodm9pZCl2aW1fbWVtc2V0KFNjcmVlbkF0dHJzICsgb2ZmLCAtMSwgKHNpemVfdCl3aWR0aCAqIHNpemVvZihzYXR0cl9UKSk7Cit9CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorLyoKKyAqIENvcHkgcGFydCBvZiBhIFNjcmVlbmxpbmUgZm9yIHZlcnRpY2FsbHkgc3BsaXQgd2luZG93ICJ3cCIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbGluZWNvcHkodG8sIGZyb20sIHdwKQorICAgIGludAkJdG87CisgICAgaW50CQlmcm9tOworICAgIHdpbl9UCSp3cDsKK3sKKyAgICB1bnNpZ25lZAlvZmZfdG8gPSBMaW5lT2Zmc2V0W3RvXSArIHdwLT53X3dpbmNvbDsKKyAgICB1bnNpZ25lZAlvZmZfZnJvbSA9IExpbmVPZmZzZXRbZnJvbV0gKyB3cC0+d193aW5jb2w7CisKKyAgICBtY2hfbWVtbW92ZShTY3JlZW5MaW5lcyArIG9mZl90bywgU2NyZWVuTGluZXMgKyBvZmZfZnJvbSwKKwkgICAgd3AtPndfd2lkdGggKiBzaXplb2Yoc2NoYXJfVCkpOworIyBpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY191dGY4KQorICAgIHsKKwltY2hfbWVtbW92ZShTY3JlZW5MaW5lc1VDICsgb2ZmX3RvLCBTY3JlZW5MaW5lc1VDICsgb2ZmX2Zyb20sCisJCXdwLT53X3dpZHRoICogc2l6ZW9mKHU4Y2hhcl9UKSk7CisJbWNoX21lbW1vdmUoU2NyZWVuTGluZXNDMSArIG9mZl90bywgU2NyZWVuTGluZXNDMSArIG9mZl9mcm9tLAorCQl3cC0+d193aWR0aCAqIHNpemVvZih1OGNoYXJfVCkpOworCW1jaF9tZW1tb3ZlKFNjcmVlbkxpbmVzQzIgKyBvZmZfdG8sIFNjcmVlbkxpbmVzQzIgKyBvZmZfZnJvbSwKKwkJd3AtPndfd2lkdGggKiBzaXplb2YodThjaGFyX1QpKTsKKyAgICB9CisgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSkKKwltY2hfbWVtbW92ZShTY3JlZW5MaW5lczIgKyBvZmZfdG8sIFNjcmVlbkxpbmVzMiArIG9mZl9mcm9tLAorCQl3cC0+d193aWR0aCAqIHNpemVvZihzY2hhcl9UKSk7CisjIGVuZGlmCisgICAgbWNoX21lbW1vdmUoU2NyZWVuQXR0cnMgKyBvZmZfdG8sIFNjcmVlbkF0dHJzICsgb2ZmX2Zyb20sCisJICAgIHdwLT53X3dpZHRoICogc2l6ZW9mKHNhdHRyX1QpKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgaWYgY2xlYXJpbmcgd2l0aCB0ZXJtIHN0cmluZyAicCIgd291bGQgd29yay4KKyAqIEl0IGNhbid0IHdvcmsgd2hlbiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGl0IHdvbid0IHNldCB0aGUgcmlnaHQgYmFja2dyb3VuZC4KKyAqLworICAgIGludAorY2FuX2NsZWFyKHApCisgICAgY2hhcl91CSpwOworeworICAgIHJldHVybiAoKnAgIT0gTlVMICYmICh0X2NvbG9ycyA8PSAxCisjaWZkZWYgRkVBVF9HVUkKKwkJfHwgZ3VpLmluX3VzZQorI2VuZGlmCisJCXx8IGN0ZXJtX25vcm1hbF9iZ19jb2xvciA9PSAwIHx8ICpUX1VUICE9IE5VTCkpOworfQorCisvKgorICogUmVzZXQgY3Vyc29yIHBvc2l0aW9uLiBVc2Ugd2hlbmV2ZXIgY3Vyc29yIHdhcyBtb3ZlZCBiZWNhdXNlIG9mIG91dHB1dHRpbmcKKyAqIHNvbWV0aGluZyBkaXJlY3RseSB0byB0aGUgc2NyZWVuIChzaGVsbCBjb21tYW5kcykgb3IgYSB0ZXJtaW5hbCBjb250cm9sCisgKiBjb2RlLgorICovCisgICAgdm9pZAorc2NyZWVuX3N0YXJ0KCkKK3sKKyAgICBzY3JlZW5fY3VyX3JvdyA9IHNjcmVlbl9jdXJfY29sID0gOTk5OTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCB0aGUgY3Vyc29yIGhhcyBnb25lIGRvd24gdG8gdGhlIG5leHQgbGluZSwgY29sdW1uIDAuCisgKiBVc2VkIGZvciBFeCBtb2RlLgorICovCisgICAgdm9pZAorc2NyZWVuX2Rvd24oKQoreworICAgIHNjcmVlbl9jdXJfY29sID0gMDsKKyAgICBpZiAoc2NyZWVuX2N1cl9yb3cgPCBSb3dzIC0gMSkKKwkrK3NjcmVlbl9jdXJfcm93OworfQorCisvKgorICogTW92ZSB0aGUgY3Vyc29yIHRvIHBvc2l0aW9uICJyb3ciLCJjb2wiIGluIHRoZSBzY3JlZW4uCisgKiBUaGlzIHRyaWVzIHRvIGZpbmQgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBtb3ZlLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YKKyAqIGNoYXJhY3RlcnMgc2VudCB0byB0aGUgdGVybWluYWwuCisgKi8KKyAgICB2b2lkCit3aW5kZ290byhyb3csIGNvbCkKKyAgICBpbnQJICAgIHJvdzsKKyAgICBpbnQJICAgIGNvbDsKK3sKKyAgICBjaGFyX3UJICAgICpwOworICAgIGludAkJICAgIGk7CisgICAgaW50CQkgICAgcGxhbjsKKyAgICBpbnQJCSAgICBjb3N0OworICAgIGludAkJICAgIHdvdWxkYmVfY29sOworICAgIGludAkJICAgIG5vaW52Y3VyczsKKyAgICBjaGFyX3UJICAgICpiczsKKyAgICBpbnQJCSAgICBnb3RvX2Nvc3Q7CisgICAgaW50CQkgICAgYXR0cjsKKworI2RlZmluZSBHT1RPX0NPU1QgICA3CS8qIGFzc3N1bWUgYSB0ZXJtX3dpbmRnb3RvKCkgdGFrZXMgYWJvdXQgNyBjaGFycyAqLworI2RlZmluZSBISUdITF9DT1NUICA1CS8qIGFzc3VtZSB1bmhpZ2hsaWdodCB0YWtlcyA1IGNoYXJzICovCisKKyNkZWZpbmUgUExBTl9MRQkgICAgMQorI2RlZmluZSBQTEFOX0NSCSAgICAyCisjZGVmaW5lIFBMQU5fTkwJICAgIDMKKyNkZWZpbmUgUExBTl9XUklURSAgNAorICAgIC8qIENhbid0IHVzZSBTY3JlZW5MaW5lcyB1bmxlc3MgaW5pdGlhbGl6ZWQgKi8KKyAgICBpZiAoU2NyZWVuTGluZXMgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAoY29sICE9IHNjcmVlbl9jdXJfY29sIHx8IHJvdyAhPSBzY3JlZW5fY3VyX3JvdykKKyAgICB7CisJLyogQ2hlY2sgZm9yIHZhbGlkIHBvc2l0aW9uLiAqLworCWlmIChyb3cgPCAwKQkvKiB3aW5kb3cgd2l0aG91dCB0ZXh0IGxpbmVzPyAqLworCSAgICByb3cgPSAwOworCWlmIChyb3cgPj0gc2NyZWVuX1Jvd3MpCisJICAgIHJvdyA9IHNjcmVlbl9Sb3dzIC0gMTsKKwlpZiAoY29sID49IHNjcmVlbl9Db2x1bW5zKQorCSAgICBjb2wgPSBzY3JlZW5fQ29sdW1ucyAtIDE7CisKKwkvKiBjaGVjayBpZiBubyBjdXJzb3IgbW92ZW1lbnQgaXMgYWxsb3dlZCBpbiBoaWdobGlnaHQgbW9kZSAqLworCWlmIChzY3JlZW5fYXR0ciAmJiAqVF9NUyA9PSBOVUwpCisJICAgIG5vaW52Y3VycyA9IEhJR0hMX0NPU1Q7CisJZWxzZQorCSAgICBub2ludmN1cnMgPSAwOworCWdvdG9fY29zdCA9IEdPVE9fQ09TVCArIG5vaW52Y3VyczsKKworCS8qCisJICogUGxhbiBob3cgdG8gZG8gdGhlIHBvc2l0aW9uaW5nOgorCSAqIDEuIFVzZSBDUiB0byBtb3ZlIGl0IHRvIGNvbHVtbiAwLCBzYW1lIHJvdy4KKwkgKiAyLiBVc2UgVF9MRSB0byBtb3ZlIGl0IGEgZmV3IGNvbHVtbnMgdG8gdGhlIGxlZnQuCisJICogMy4gVXNlIE5MIHRvIG1vdmUgYSBmZXcgbGluZXMgZG93biwgY29sdW1uIDAuCisJICogNC4gTW92ZSBhIGZldyBjb2x1bW5zIHRvIHRoZSByaWdodCB3aXRoIFRfTkQgb3IgYnkgd3JpdGluZyBjaGFycy4KKwkgKgorCSAqIERvbid0IGRvIHRoaXMgaWYgdGhlIGN1cnNvciB3ZW50IGJleW9uZCB0aGUgbGFzdCBjb2x1bW4sIHRoZSBjdXJzb3IKKwkgKiBwb3NpdGlvbiBpcyB1bmtub3duIHRoZW4gKHNvbWUgdGVybWluYWxzIHdyYXAsIHNvbWUgZG9uJ3QgKQorCSAqCisJICogRmlyc3QgY2hlY2sgaWYgdGhlIGhpZ2hsaWdodGluZyBhdHRpYnV0ZXMgYWxsb3cgdXMgdG8gd3JpdGUKKwkgKiBjaGFyYWN0ZXJzIHRvIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmlnaHQuCisJICovCisJaWYgKHJvdyA+PSBzY3JlZW5fY3VyX3JvdyAmJiBzY3JlZW5fY3VyX2NvbCA8IENvbHVtbnMpCisJeworCSAgICAvKgorCSAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIGluIHRoZSBzYW1lIHJvdywgYmlnZ2VyIGNvbCwgd2UgY2FuIHVzZSBDUgorCSAgICAgKiBvciBUX0xFLgorCSAgICAgKi8KKwkgICAgYnMgPSBOVUxMOwkJCSAgICAvKiBpbml0IGZvciBHQ0MgKi8KKwkgICAgYXR0ciA9IHNjcmVlbl9hdHRyOworCSAgICBpZiAocm93ID09IHNjcmVlbl9jdXJfcm93ICYmIGNvbCA8IHNjcmVlbl9jdXJfY29sKQorCSAgICB7CisJCS8qICJsZSIgaXMgcHJlZmVycmVkIG92ZXIgImJjIiwgYmVjYXVzZSAiYmMiIGlzIG9ic29sZXRlICovCisJCWlmICgqVF9MRSkKKwkJICAgIGJzID0gVF9MRTsJCSAgICAvKiAiY3Vyc29yIGxlZnQiICovCisJCWVsc2UKKwkJICAgIGJzID0gVF9CQzsJCSAgICAvKiAiYmFja3NwYWNlIGNoYXJhY3RlciAob2xkKSAqLworCQlpZiAoKmJzKQorCQkgICAgY29zdCA9IChzY3JlZW5fY3VyX2NvbCAtIGNvbCkgKiAoaW50KVNUUkxFTihicyk7CisJCWVsc2UKKwkJICAgIGNvc3QgPSA5OTk7CisJCWlmIChjb2wgKyAxIDwgY29zdCkJICAgIC8qIHVzaW5nIENSIGlzIGxlc3MgY2hhcmFjdGVycyAqLworCQl7CisJCSAgICBwbGFuID0gUExBTl9DUjsKKwkJICAgIHdvdWxkYmVfY29sID0gMDsKKwkJICAgIGNvc3QgPSAxOwkJICAgIC8qIENSIGlzIGp1c3Qgb25lIGNoYXJhY3RlciAqLworCQl9CisJCWVsc2UKKwkJeworCQkgICAgcGxhbiA9IFBMQU5fTEU7CisJCSAgICB3b3VsZGJlX2NvbCA9IGNvbDsKKwkJfQorCQlpZiAobm9pbnZjdXJzKQkJICAgIC8qIHdpbGwgc3RvcCBoaWdobGlnaHRpbmcgKi8KKwkJeworCQkgICAgY29zdCArPSBub2ludmN1cnM7CisJCSAgICBhdHRyID0gMDsKKwkJfQorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIGN1cnNvciBpcyBhYm92ZSB3aGVyZSB3ZSB3YW50IHRvIGJlLCB3ZSBjYW4gdXNlIENSIExGLgorCSAgICAgKi8KKwkgICAgZWxzZSBpZiAocm93ID4gc2NyZWVuX2N1cl9yb3cpCisJICAgIHsKKwkJcGxhbiA9IFBMQU5fTkw7CisJCXdvdWxkYmVfY29sID0gMDsKKwkJY29zdCA9IChyb3cgLSBzY3JlZW5fY3VyX3JvdykgKiAyOyAgLyogQ1IgTEYgKi8KKwkJaWYgKG5vaW52Y3VycykJCSAgICAvKiB3aWxsIHN0b3AgaGlnaGxpZ2h0aW5nICovCisJCXsKKwkJICAgIGNvc3QgKz0gbm9pbnZjdXJzOworCQkgICAgYXR0ciA9IDA7CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHNhbWUgcm93LCBzbWFsbGVyIGNvbCwganVzdCB1c2Ugd3JpdGUuCisJICAgICAqLworCSAgICBlbHNlCisJICAgIHsKKwkJcGxhbiA9IFBMQU5fV1JJVEU7CisJCXdvdWxkYmVfY29sID0gc2NyZWVuX2N1cl9jb2w7CisJCWNvc3QgPSAwOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgaWYgYW55IGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaGF2ZSB0aGUKKwkgICAgICogY29ycmVjdCBhdHRyaWJ1dGVzLiAgQWxzbyBhdm9pZCBVVEYtOCBjaGFyYWN0ZXJzLgorCSAgICAgKi8KKwkgICAgaSA9IGNvbCAtIHdvdWxkYmVfY29sOworCSAgICBpZiAoaSA+IDApCisJCWNvc3QgKz0gaTsKKwkgICAgaWYgKGNvc3QgPCBnb3RvX2Nvc3QgJiYgaSA+IDApCisJICAgIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGNvcnJlY3Qgd2l0aG91dCBhZGRpdGlvbmFsbHkKKwkJICogc3RvcHBpbmcgaGlnaGxpZ2h0aW5nLgorCQkgKi8KKwkJcCA9IFNjcmVlbkF0dHJzICsgTGluZU9mZnNldFtyb3ddICsgd291bGRiZV9jb2w7CisJCXdoaWxlIChpICYmICpwKysgPT0gYXR0cikKKwkJICAgIC0taTsKKwkJaWYgKGkgIT0gMCkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFRyeSBpZiBpdCB3b3JrcyB3aGVuIGhpZ2hsaWdodGluZyBpcyBzdG9wcGVkIGhlcmUuCisJCSAgICAgKi8KKwkJICAgIGlmICgqLS1wID09IDApCisJCSAgICB7CisJCQljb3N0ICs9IG5vaW52Y3VyczsKKwkJCXdoaWxlIChpICYmICpwKysgPT0gMCkKKwkJCSAgICAtLWk7CisJCSAgICB9CisJCSAgICBpZiAoaSAhPSAwKQorCQkJY29zdCA9IDk5OTsJLyogZGlmZmVyZW50IGF0dHJpYnV0ZXMsIGRvbid0IGRvIGl0ICovCisJCX0KKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChlbmNfdXRmOCkKKwkJeworCQkgICAgLyogRG9uJ3QgdXNlIGFuIFVURi04IGNoYXIgZm9yIHBvc2l0aW9uaW5nLCBpdCdzIHNsb3cuICovCisJCSAgICBmb3IgKGkgPSB3b3VsZGJlX2NvbDsgaSA8IGNvbDsgKytpKQorCQkJaWYgKFNjcmVlbkxpbmVzVUNbTGluZU9mZnNldFtyb3ddICsgaV0gIT0gMCkKKwkJCXsKKwkJCSAgICBjb3N0ID0gOTk5OworCQkJICAgIGJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFdlIGNhbiBkbyBpdCB3aXRob3V0IHRlcm1fd2luZGdvdG8oKSEKKwkgICAgICovCisJICAgIGlmIChjb3N0IDwgZ290b19jb3N0KQorCSAgICB7CisJCWlmIChwbGFuID09IFBMQU5fTEUpCisJCXsKKwkJICAgIGlmIChub2ludmN1cnMpCisJCQlzY3JlZW5fc3RvcF9oaWdobGlnaHQoKTsKKwkJICAgIHdoaWxlIChzY3JlZW5fY3VyX2NvbCA+IGNvbCkKKwkJICAgIHsKKwkJCW91dF9zdHIoYnMpOworCQkJLS1zY3JlZW5fY3VyX2NvbDsKKwkJICAgIH0KKwkJfQorCQllbHNlIGlmIChwbGFuID09IFBMQU5fQ1IpCisJCXsKKwkJICAgIGlmIChub2ludmN1cnMpCisJCQlzY3JlZW5fc3RvcF9oaWdobGlnaHQoKTsKKwkJICAgIG91dF9jaGFyKCdccicpOworCQkgICAgc2NyZWVuX2N1cl9jb2wgPSAwOworCQl9CisJCWVsc2UgaWYgKHBsYW4gPT0gUExBTl9OTCkKKwkJeworCQkgICAgaWYgKG5vaW52Y3VycykKKwkJCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworCQkgICAgd2hpbGUgKHNjcmVlbl9jdXJfcm93IDwgcm93KQorCQkgICAgeworCQkJb3V0X2NoYXIoJ1xuJyk7CisJCQkrK3NjcmVlbl9jdXJfcm93OworCQkgICAgfQorCQkgICAgc2NyZWVuX2N1cl9jb2wgPSAwOworCQl9CisKKwkJaSA9IGNvbCAtIHNjcmVlbl9jdXJfY29sOworCQlpZiAoaSA+IDApCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBVc2UgY3Vyc29yLXJpZ2h0IGlmIGl0J3Mgb25lIGNoYXJhY3RlciBvbmx5LiAgQXZvaWRzCisJCSAgICAgKiByZW1vdmluZyBhIGxpbmUgb2YgcGl4ZWxzIGZyb20gdGhlIGxhc3QgYm9sZCBjaGFyLCB3aGVuCisJCSAgICAgKiB1c2luZyB0aGUgYm9sZCB0cmljayBpbiB0aGUgR1VJLgorCQkgICAgICovCisJCSAgICBpZiAoVF9ORFswXSAhPSBOVUwgJiYgVF9ORFsxXSA9PSBOVUwpCisJCSAgICB7CisJCQl3aGlsZSAoaS0tID4gMCkKKwkJCSAgICBvdXRfY2hhcigqVF9ORCk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpbnQJb2ZmOworCisJCQlvZmYgPSBMaW5lT2Zmc2V0W3Jvd10gKyBzY3JlZW5fY3VyX2NvbDsKKwkJCXdoaWxlIChpLS0gPiAwKQorCQkJeworCQkJICAgIGlmIChTY3JlZW5BdHRyc1tvZmZdICE9IHNjcmVlbl9hdHRyKQorCQkJCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBvdXRfZmx1c2hfY2hlY2soKTsKKyNlbmRpZgorCQkJICAgIG91dF9jaGFyKFNjcmVlbkxpbmVzW29mZl0pOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VCisJCQkJCQkgICYmIFNjcmVlbkxpbmVzW29mZl0gPT0gMHg4ZSkKKwkJCQlvdXRfY2hhcihTY3JlZW5MaW5lczJbb2ZmXSk7CisjZW5kaWYKKwkJCSAgICArK29mZjsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCWVsc2UKKwkgICAgY29zdCA9IDk5OTsKKworCWlmIChjb3N0ID49IGdvdG9fY29zdCkKKwl7CisJICAgIGlmIChub2ludmN1cnMpCisJCXNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworCSAgICBpZiAocm93ID09IHNjcmVlbl9jdXJfcm93ICYmIChjb2wgPiBzY3JlZW5fY3VyX2NvbCkgJiYKKwkJCQkJCQkJKlRfQ1JJICE9IE5VTCkKKwkJdGVybV9jdXJzb3JfcmlnaHQoY29sIC0gc2NyZWVuX2N1cl9jb2wpOworCSAgICBlbHNlCisJCXRlcm1fd2luZGdvdG8ocm93LCBjb2wpOworCX0KKwlzY3JlZW5fY3VyX3JvdyA9IHJvdzsKKwlzY3JlZW5fY3VyX2NvbCA9IGNvbDsKKyAgICB9Cit9CisKKy8qCisgKiBTZXQgY3Vyc29yIHRvIGl0cyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitzZXRjdXJzb3IoKQoreworICAgIGlmIChyZWRyYXdpbmcoKSkKKyAgICB7CisJdmFsaWRhdGVfY3Vyc29yKCk7CisJd2luZGdvdG8oV19XSU5ST1coY3Vyd2luKSArIGN1cndpbi0+d193cm93LAorCQlXX1dJTkNPTChjdXJ3aW4pICsgKAorI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJCWN1cndpbi0+d19wX3JsID8gKChpbnQpV19XSURUSChjdXJ3aW4pIC0gY3Vyd2luLT53X3djb2wgLSAoCisjIGlmZGVmIEZFQVRfTUJZVEUKKwkJCWhhc19tYnl0ZSA/ICgqbWJfcHRyMmNlbGxzKShtbF9nZXRfY3Vyc29yKCkpIDoKKyMgZW5kaWYKKwkJCTEpKSA6CisjZW5kaWYKKwkJCQkJCQkgICAgY3Vyd2luLT53X3djb2wpKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGluc2VydCAnbGluZV9jb3VudCcgbGluZXMgYXQgJ3JvdycgaW4gd2luZG93ICd3cCcKKyAqIGlmICdpbnZhbGlkJyBpcyBUUlVFIHRoZSB3cC0+d19saW5lc1tdLndsX2xudW0gaXMgaW52YWxpZGF0ZWQuCisgKiBpZiAnbWF5Y2xlYXInIGlzIFRSVUUgdGhlIHNjcmVlbiB3aWxsIGJlIGNsZWFyZWQgaWYgaXQgaXMgZmFzdGVyIHRoYW4KKyAqIHNjcm9sbGluZy4KKyAqIFJldHVybnMgRkFJTCBpZiB0aGUgbGluZXMgYXJlIG5vdCBpbnNlcnRlZCwgT0sgZm9yIHN1Y2Nlc3MuCisgKi8KKyAgICBpbnQKK3dpbl9pbnNfbGluZXMod3AsIHJvdywgbGluZV9jb3VudCwgaW52YWxpZCwgbWF5Y2xlYXIpCisgICAgd2luX1QJKndwOworICAgIGludAkJcm93OworICAgIGludAkJbGluZV9jb3VudDsKKyAgICBpbnQJCWludmFsaWQ7CisgICAgaW50CQltYXljbGVhcjsKK3sKKyAgICBpbnQJCWRpZF9kZWxldGU7CisgICAgaW50CQluZXh0cm93OworICAgIGludAkJbGFzdHJvdzsKKyAgICBpbnQJCXJldHZhbDsKKworICAgIGlmIChpbnZhbGlkKQorCXdwLT53X2xpbmVzX3ZhbGlkID0gMDsKKworICAgIGlmICh3cC0+d19oZWlnaHQgPCA1KQorCXJldHVybiBGQUlMOworCisgICAgaWYgKGxpbmVfY291bnQgPiB3cC0+d19oZWlnaHQgLSByb3cpCisJbGluZV9jb3VudCA9IHdwLT53X2hlaWdodCAtIHJvdzsKKworICAgIHJldHZhbCA9IHdpbl9kb19saW5lcyh3cCwgcm93LCBsaW5lX2NvdW50LCBtYXljbGVhciwgRkFMU0UpOworICAgIGlmIChyZXR2YWwgIT0gTUFZQkUpCisJcmV0dXJuIHJldHZhbDsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgYSBuZXh0IHdpbmRvdyBvciBhIHN0YXR1cyBsaW5lLCB3ZSBmaXJzdCB0cnkgdG8gZGVsZXRlIHRoZQorICAgICAqIGxpbmVzIGF0IHRoZSBib3R0b20gdG8gYXZvaWQgbWVzc2luZyB3aGF0IGlzIGFmdGVyIHRoZSB3aW5kb3cuCisgICAgICogSWYgdGhpcyBmYWlscyBhbmQgdGhlcmUgYXJlIGZvbGxvd2luZyB3aW5kb3dzLCBkb24ndCBkbyBhbnl0aGluZyB0byBhdm9pZAorICAgICAqIG1lc3NpbmcgdXAgdGhvc2Ugd2luZG93cywgYmV0dGVyIGp1c3QgcmVkcmF3LgorICAgICAqLworICAgIGRpZF9kZWxldGUgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpZiAod3AtPndfbmV4dCAhPSBOVUxMIHx8IHdwLT53X3N0YXR1c19oZWlnaHQpCisgICAgeworCWlmIChzY3JlZW5fZGVsX2xpbmVzKDAsIFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodCAtIGxpbmVfY291bnQsCisJCQkJICAgIGxpbmVfY291bnQsIChpbnQpUm93cywgRkFMU0UsIE5VTEwpID09IE9LKQorCSAgICBkaWRfZGVsZXRlID0gVFJVRTsKKwllbHNlIGlmICh3cC0+d19uZXh0KQorCSAgICByZXR1cm4gRkFJTDsKKyAgICB9CisjZW5kaWYKKyAgICAvKgorICAgICAqIGlmIG5vIGxpbmVzIGRlbGV0ZWQsIGJsYW5rIHRoZSBsaW5lcyB0aGF0IHdpbGwgZW5kIHVwIGJlbG93IHRoZSB3aW5kb3cKKyAgICAgKi8KKyAgICBpZiAoIWRpZF9kZWxldGUpCisgICAgeworI2lmZGVmIEZFQVRfV0lORE9XUworCXdwLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyNlbmRpZgorCXJlZHJhd19jbWRsaW5lID0gVFJVRTsKKwluZXh0cm93ID0gV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0ICsgV19TVEFUVVNfSEVJR0hUKHdwKTsKKwlsYXN0cm93ID0gbmV4dHJvdyArIGxpbmVfY291bnQ7CisJaWYgKGxhc3Ryb3cgPiBSb3dzKQorCSAgICBsYXN0cm93ID0gUm93czsKKwlzY3JlZW5fZmlsbChuZXh0cm93IC0gbGluZV9jb3VudCwgbGFzdHJvdyAtIGxpbmVfY291bnQsCisJCSAgV19XSU5DT0wod3ApLCAoaW50KVdfRU5EQ09MKHdwKSwKKwkJICAnICcsICcgJywgMCk7CisgICAgfQorCisgICAgaWYgKHNjcmVlbl9pbnNfbGluZXMoMCwgV19XSU5ST1cod3ApICsgcm93LCBsaW5lX2NvdW50LCAoaW50KVJvd3MsIE5VTEwpCisJCQkJCQkJCSAgICAgID09IEZBSUwpCisgICAgeworCSAgICAvKiBkZWxldGlvbiB3aWxsIGhhdmUgbWVzc2VkIHVwIG90aGVyIHdpbmRvd3MgKi8KKwlpZiAoZGlkX2RlbGV0ZSkKKwl7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgIHdwLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyNlbmRpZgorCSAgICB3aW5fcmVzdF9pbnZhbGlkKFdfTkVYVCh3cCkpOworCX0KKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBkZWxldGUgImxpbmVfY291bnQiIHdpbmRvdyBsaW5lcyBhdCAicm93IiBpbiB3aW5kb3cgIndwIgorICogSWYgImludmFsaWQiIGlzIFRSVUUgY3Vyd2luLT53X2xpbmVzW10gaXMgaW52YWxpZGF0ZWQuCisgKiBJZiAibWF5Y2xlYXIiIGlzIFRSVUUgdGhlIHNjcmVlbiB3aWxsIGJlIGNsZWFyZWQgaWYgaXQgaXMgZmFzdGVyIHRoYW4KKyAqIHNjcm9sbGluZworICogUmV0dXJuIE9LIGZvciBzdWNjZXNzLCBGQUlMIGlmIHRoZSBsaW5lcyBhcmUgbm90IGRlbGV0ZWQuCisgKi8KKyAgICBpbnQKK3dpbl9kZWxfbGluZXMod3AsIHJvdywgbGluZV9jb3VudCwgaW52YWxpZCwgbWF5Y2xlYXIpCisgICAgd2luX1QJKndwOworICAgIGludAkJcm93OworICAgIGludAkJbGluZV9jb3VudDsKKyAgICBpbnQJCWludmFsaWQ7CisgICAgaW50CQltYXljbGVhcjsKK3sKKyAgICBpbnQJCXJldHZhbDsKKworICAgIGlmIChpbnZhbGlkKQorCXdwLT53X2xpbmVzX3ZhbGlkID0gMDsKKworICAgIGlmIChsaW5lX2NvdW50ID4gd3AtPndfaGVpZ2h0IC0gcm93KQorCWxpbmVfY291bnQgPSB3cC0+d19oZWlnaHQgLSByb3c7CisKKyAgICByZXR2YWwgPSB3aW5fZG9fbGluZXMod3AsIHJvdywgbGluZV9jb3VudCwgbWF5Y2xlYXIsIFRSVUUpOworICAgIGlmIChyZXR2YWwgIT0gTUFZQkUpCisJcmV0dXJuIHJldHZhbDsKKworICAgIGlmIChzY3JlZW5fZGVsX2xpbmVzKDAsIFdfV0lOUk9XKHdwKSArIHJvdywgbGluZV9jb3VudCwKKwkJCQkJICAgICAgKGludClSb3dzLCBGQUxTRSwgTlVMTCkgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIC8qCisgICAgICogSWYgdGhlcmUgYXJlIHdpbmRvd3Mgb3Igc3RhdHVzIGxpbmVzIGJlbG93LCB0cnkgdG8gcHV0IHRoZW0gYXQgdGhlCisgICAgICogY29ycmVjdCBwbGFjZS4gSWYgd2UgY2FuJ3QgZG8gdGhhdCwgdGhleSBoYXZlIHRvIGJlIHJlZHJhd24uCisgICAgICovCisgICAgaWYgKHdwLT53X25leHQgfHwgd3AtPndfc3RhdHVzX2hlaWdodCB8fCBjbWRsaW5lX3JvdyA8IFJvd3MgLSAxKQorICAgIHsKKwlpZiAoc2NyZWVuX2luc19saW5lcygwLCBXX1dJTlJPVyh3cCkgKyB3cC0+d19oZWlnaHQgLSBsaW5lX2NvdW50LAorCQkJCQkgbGluZV9jb3VudCwgKGludClSb3dzLCBOVUxMKSA9PSBGQUlMKQorCXsKKwkgICAgd3AtPndfcmVkcl9zdGF0dXMgPSBUUlVFOworCSAgICB3aW5fcmVzdF9pbnZhbGlkKHdwLT53X25leHQpOworCX0KKyAgICB9CisgICAgLyoKKyAgICAgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHdpbmRvdyBhbmQgdGhlcmUgaXMgbm8gc3RhdHVzIGxpbmUsIHJlZHJhdyB0aGUKKyAgICAgKiBjb21tYW5kIGxpbmUgbGF0ZXIuCisgICAgICovCisgICAgZWxzZQorI2VuZGlmCisJcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIENvbW1vbiBjb2RlIGZvciB3aW5faW5zX2xpbmVzKCkgYW5kIHdpbl9kZWxfbGluZXMoKS4KKyAqIFJldHVybnMgT0sgb3IgRkFJTCB3aGVuIHRoZSB3b3JrIGhhcyBiZWVuIGRvbmUuCisgKiBSZXR1cm5zIE1BWUJFIHdoZW4gbm90IGZpbmlzaGVkIHlldC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3dpbl9kb19saW5lcyh3cCwgcm93LCBsaW5lX2NvdW50LCBtYXljbGVhciwgZGVsKQorICAgIHdpbl9UCSp3cDsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWxpbmVfY291bnQ7CisgICAgaW50CQltYXljbGVhcjsKKyAgICBpbnQJCWRlbDsKK3sKKyAgICBpbnQJCXJldHZhbDsKKworICAgIGlmICghcmVkcmF3aW5nKCkgfHwgbGluZV9jb3VudCA8PSAwKQorCXJldHVybiBGQUlMOworCisgICAgLyogb25seSBhIGZldyBsaW5lcyBsZWZ0OiByZWRyYXcgaXMgZmFzdGVyICovCisgICAgaWYgKG1heWNsZWFyICYmIFJvd3MgLSBsaW5lX2NvdW50IDwgNQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgICYmIHdwLT53X3dpZHRoID09IENvbHVtbnMKKyNlbmRpZgorCSAgICApCisgICAgeworCXNjcmVlbmNsZWFyKCk7CSAgICAvKiB3aWxsIHNldCB3cC0+d19saW5lc192YWxpZCB0byAwICovCisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWxldGUgYWxsIHJlbWFpbmluZyBsaW5lcworICAgICAqLworICAgIGlmIChyb3cgKyBsaW5lX2NvdW50ID49IHdwLT53X2hlaWdodCkKKyAgICB7CisJc2NyZWVuX2ZpbGwoV19XSU5ST1cod3ApICsgcm93LCBXX1dJTlJPVyh3cCkgKyB3cC0+d19oZWlnaHQsCisJCVdfV0lOQ09MKHdwKSwgKGludClXX0VORENPTCh3cCksCisJCScgJywgJyAnLCAwKTsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB3aGVuIHNjcm9sbGluZywgdGhlIG1lc3NhZ2Ugb24gdGhlIGNvbW1hbmQgbGluZSBzaG91bGQgYmUgY2xlYXJlZCwKKyAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCBzdGF5IHRoZXJlIGZvcmV2ZXIuCisgICAgICovCisgICAgY2xlYXJfY21kbGluZSA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIElmIHRoZSB0ZXJtaW5hbCBjYW4gc2V0IGEgc2Nyb2xsIHJlZ2lvbiwgdXNlIHRoYXQuCisgICAgICogQWx3YXlzIGRvIHRoaXMgaW4gYSB2ZXJ0aWNhbGx5IHNwbGl0IHdpbmRvdy4gIFRoaXMgd2lsbCByZWRyYXcgZnJvbQorICAgICAqIFNjcmVlbkxpbmVzW10gd2hlbiB0X0NWIGlzbid0IGRlZmluZWQuICBUaGF0J3MgZmFzdGVyIHRoYW4gdXNpbmcKKyAgICAgKiB3aW5fbGluZSgpLgorICAgICAqIERvbid0IHVzZSBhIHNjcm9sbCByZWdpb24gd2hlbiB3ZSBhcmUgZ29pbmcgdG8gcmVkcmF3IHRoZSB0ZXh0LCB3cml0aW5nCisgICAgICogYSBjaGFyYWN0ZXIgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgc2Nyb2xsIHJlZ2lvbiBjYXVzZXMgYQorICAgICAqIHNjcm9sbC11cCBpbiB0aGUgREpHUFAgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBpZiAoc2Nyb2xsX3JlZ2lvbgorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIHx8IFdfV0lEVEgod3ApICE9IENvbHVtbnMKKyNlbmRpZgorCSAgICApCisgICAgeworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJaWYgKHNjcm9sbF9yZWdpb24gJiYgKHdwLT53X3dpZHRoID09IENvbHVtbnMgfHwgKlRfQ1NWICE9IE5VTCkpCisjZW5kaWYKKwkgICAgc2Nyb2xsX3JlZ2lvbl9zZXQod3AsIHJvdyk7CisJaWYgKGRlbCkKKwkgICAgcmV0dmFsID0gc2NyZWVuX2RlbF9saW5lcyhXX1dJTlJPVyh3cCkgKyByb3csIDAsIGxpbmVfY291bnQsCisJCQkJCSAgICAgICB3cC0+d19oZWlnaHQgLSByb3csIEZBTFNFLCB3cCk7CisJZWxzZQorCSAgICByZXR2YWwgPSBzY3JlZW5faW5zX2xpbmVzKFdfV0lOUk9XKHdwKSArIHJvdywgMCwgbGluZV9jb3VudCwKKwkJCQkJCSAgICAgIHdwLT53X2hlaWdodCAtIHJvdywgd3ApOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJaWYgKHNjcm9sbF9yZWdpb24gJiYgKHdwLT53X3dpZHRoID09IENvbHVtbnMgfHwgKlRfQ1NWICE9IE5VTCkpCisjZW5kaWYKKwkgICAgc2Nyb2xsX3JlZ2lvbl9yZXNldCgpOworCXJldHVybiByZXR2YWw7CisgICAgfQorCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKHdwLT53X25leHQgIT0gTlVMTCAmJiBwX3RmKSAvKiBkb24ndCBkZWxldGUvaW5zZXJ0IG9uIGZhc3QgdGVybWluYWwgKi8KKwlyZXR1cm4gRkFJTDsKKyNlbmRpZgorCisgICAgcmV0dXJuIE1BWUJFOworfQorCisvKgorICogd2luZG93ICd3cCcgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQgaXMgbWVzc2VkIHVwLCBtYXJrIGl0IGZvciByZWRyYXcKKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fcmVzdF9pbnZhbGlkKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aGlsZSAod3AgIT0gTlVMTCkKKyNlbHNlCisgICAgaWYgKHdwICE9IE5VTEwpCisjZW5kaWYKKyAgICB7CisJcmVkcmF3X3dpbl9sYXRlcih3cCwgTk9UX1ZBTElEKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwl3cC0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisJd3AgPSB3cC0+d19uZXh0OworI2VuZGlmCisgICAgfQorICAgIHJlZHJhd19jbWRsaW5lID0gVFJVRTsKK30KKworLyoKKyAqIFRoZSByZXN0IG9mIHRoZSByb3V0aW5lcyBpbiB0aGlzIGZpbGUgcGVyZm9ybSBzY3JlZW4gbWFuaXB1bGF0aW9ucy4gVGhlCisgKiBnaXZlbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIHBoeXNpY2FsbHkgb24gdGhlIHNjcmVlbi4gVGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNoYW5nZSBpcyBhbHNvIG1hZGUgdG8gdGhlIGludGVybmFsIHNjcmVlbiBpbWFnZS4gSW4gdGhpcyB3YXksIHRoZSBlZGl0b3IKKyAqIGFudGljaXBhdGVzIHRoZSBlZmZlY3Qgb2YgZWRpdGluZyBjaGFuZ2VzIG9uIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzY3JlZW4uCisgKiBUaGF0IHdheSwgd2hlbiB3ZSBjYWxsIHNjcmVlbnVwZGF0ZSBhIGNvbXBsZXRlIHJlZHJhdyBpc24ndCB1c3VhbGx5CisgKiBuZWNlc3NhcnkuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQgd2UgY2FuIGtlZXAgYWRkaW5nIGNvZGUgdG8gYW50aWNpcGF0ZQorICogc2NyZWVuIGNoYW5nZXMsIGFuZCBpbiB0aGUgbWVhbnRpbWUsIGV2ZXJ5dGhpbmcgc3RpbGwgd29ya3MuCisgKi8KKworLyoKKyAqIHR5cGVzIGZvciBpbnNlcnRpbmcgb3IgZGVsZXRpbmcgbGluZXMKKyAqLworI2RlZmluZSBVU0VfVF9DQUwgICAxCisjZGVmaW5lIFVTRV9UX0NETCAgIDIKKyNkZWZpbmUgVVNFX1RfQUwgICAgMworI2RlZmluZSBVU0VfVF9DRSAgICA0CisjZGVmaW5lIFVTRV9UX0RMICAgIDUKKyNkZWZpbmUgVVNFX1RfU1IgICAgNgorI2RlZmluZSBVU0VfTkwJICAgIDcKKyNkZWZpbmUgVVNFX1RfQ0QgICAgOAorI2RlZmluZSBVU0VfUkVEUkFXICA5CisKKy8qCisgKiBpbnNlcnQgbGluZXMgb24gdGhlIHNjcmVlbiBhbmQgdXBkYXRlIFNjcmVlbkxpbmVzW10KKyAqICdlbmQnIGlzIHRoZSBsaW5lIGFmdGVyIHRoZSBzY3JvbGxlZCBwYXJ0LiBOb3JtYWxseSBpdCBpcyBSb3dzLgorICogV2hlbiBzY3JvbGxpbmcgcmVnaW9uIHVzZWQgJ29mZicgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSB0b3AgZm9yIHRoZSByZWdpb24uCisgKiAncm93JyBhbmQgJ2VuZCcgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLgorICoKKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBmb3Igc3VjY2Vzcy4KKyAqLworICAgIHN0YXRpYyBpbnQKK3NjcmVlbl9pbnNfbGluZXMob2ZmLCByb3csIGxpbmVfY291bnQsIGVuZCwgd3ApCisgICAgaW50CQlvZmY7CisgICAgaW50CQlyb3c7CisgICAgaW50CQlsaW5lX2NvdW50OworICAgIGludAkJZW5kOworICAgIHdpbl9UCSp3cDsJICAgIC8qIE5VTEwgb3Igd2luZG93IHRvIHVzZSB3aWR0aCBmcm9tICovCit7CisgICAgaW50CQlpOworICAgIGludAkJajsKKyAgICB1bnNpZ25lZAl0ZW1wOworICAgIGludAkJY3Vyc29yX3JvdzsKKyAgICBpbnQJCXR5cGU7CisgICAgaW50CQlyZXN1bHRfZW1wdHk7CisgICAgaW50CQljYW5fY2UgPSBjYW5fY2xlYXIoVF9DRSk7CisKKyAgICAvKgorICAgICAqIEZBSUwgaWYKKyAgICAgKiAtIHRoZXJlIGlzIG5vIHZhbGlkIHNjcmVlbgorICAgICAqIC0gdGhlIHNjcmVlbiBoYXMgdG8gYmUgcmVkcmF3biBjb21wbGV0ZWx5CisgICAgICogLSB0aGUgbGluZSBjb3VudCBpcyBsZXNzIHRoYW4gb25lCisgICAgICogLSB0aGUgbGluZSBjb3VudCBpcyBtb3JlIHRoYW4gJ3R0eXNjcm9sbCcKKyAgICAgKi8KKyAgICBpZiAoIXNjcmVlbl92YWxpZChUUlVFKSB8fCBsaW5lX2NvdW50IDw9IDAgfHwgbGluZV9jb3VudCA+IHBfdHR5c2Nyb2xsKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBUaGVyZSBhcmUgc2V2ZW4gd2F5cyB0byBpbnNlcnQgbGluZXM6CisgICAgICogMC4gV2hlbiBpbiBhIHZlcnRpY2FsbHkgc3BsaXQgd2luZG93IGFuZCB0X0NWIGlzbid0IHNldCwgcmVkcmF3IHRoZQorICAgICAqICAgIGNoYXJhY3RlcnMgZnJvbSBTY3JlZW5MaW5lc1tdLgorICAgICAqIDEuIFVzZSBUX0NEIChjbGVhciB0byBlbmQgb2YgZGlzcGxheSkgaWYgaXQgZXhpc3RzIGFuZCB0aGUgcmVzdWx0IG9mCisgICAgICoJICB0aGUgaW5zZXJ0IGlzIGp1c3QgZW1wdHkgbGluZXMKKyAgICAgKiAyLiBVc2UgVF9DQUwgKGluc2VydCBtdWx0aXBsZSBsaW5lcykgaWYgaXQgZXhpc3RzIGFuZCBUX0FMIGlzIG5vdAorICAgICAqCSAgcHJlc2VudCBvciBsaW5lX2NvdW50ID4gMS4gSXQgbG9va3MgYmV0dGVyIGlmIHdlIGRvIGFsbCB0aGUgaW5zZXJ0cworICAgICAqCSAgYXQgb25jZS4KKyAgICAgKiAzLiBVc2UgVF9DREwgKGRlbGV0ZSBtdWx0aXBsZSBsaW5lcykgaWYgaXQgZXhpc3RzIGFuZCB0aGUgcmVzdWx0IG9mIHRoZQorICAgICAqCSAgaW5zZXJ0IGlzIGp1c3QgZW1wdHkgbGluZXMgYW5kIFRfQ0UgaXMgbm90IHByZXNlbnQgb3IgbGluZV9jb3VudCA+CisgICAgICoJICAxLgorICAgICAqIDQuIFVzZSBUX0FMIChpbnNlcnQgbGluZSkgaWYgaXQgZXhpc3RzLgorICAgICAqIDUuIFVzZSBUX0NFIChlcmFzZSBsaW5lKSBpZiBpdCBleGlzdHMgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGluc2VydCBpcworICAgICAqCSAganVzdCBlbXB0eSBsaW5lcy4KKyAgICAgKiA2LiBVc2UgVF9ETCAoZGVsZXRlIGxpbmUpIGlmIGl0IGV4aXN0cyBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgaW5zZXJ0IGlzCisgICAgICoJICBqdXN0IGVtcHR5IGxpbmVzLgorICAgICAqIDcuIFVzZSBUX1NSIChzY3JvbGwgcmV2ZXJzZSkgaWYgaXQgZXhpc3RzIGFuZCBpbnNlcnRpbmcgYXQgcm93IDAgYW5kCisgICAgICoJICB0aGUgJ2RhJyBmbGFnIGlzIG5vdCBzZXQgb3Igd2UgaGF2ZSBjbGVhciBsaW5lIGNhcGFiaWxpdHkuCisgICAgICogOC4gcmVkcmF3IHRoZSBjaGFyYWN0ZXJzIGZyb20gU2NyZWVuTGluZXNbXS4KKyAgICAgKgorICAgICAqIENhcmVmdWw6IEluIGEgaHB0ZXJtIHNjcm9sbCByZXZlcnNlIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCwgaXQgbW92ZXMKKyAgICAgKiB0aGUgc2Nyb2xsYmFyIGZvciB0aGUgd2luZG93LiBJdCBkb2VzIGhhdmUgaW5zZXJ0IGxpbmUsIHVzZSB0aGF0IGlmIGl0CisgICAgICogZXhpc3RzLgorICAgICAqLworICAgIHJlc3VsdF9lbXB0eSA9IChyb3cgKyBsaW5lX2NvdW50ID49IGVuZCk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAod3AgIT0gTlVMTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zICYmICpUX0NTViA9PSBOVUwpCisJdHlwZSA9IFVTRV9SRURSQVc7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKGNhbl9jbGVhcihUX0NEKSAmJiByZXN1bHRfZW1wdHkpCisJdHlwZSA9IFVTRV9UX0NEOworICAgIGVsc2UgaWYgKCpUX0NBTCAhPSBOVUwgJiYgKGxpbmVfY291bnQgPiAxIHx8ICpUX0FMID09IE5VTCkpCisJdHlwZSA9IFVTRV9UX0NBTDsKKyAgICBlbHNlIGlmICgqVF9DREwgIT0gTlVMICYmIHJlc3VsdF9lbXB0eSAmJiAobGluZV9jb3VudCA+IDEgfHwgIWNhbl9jZSkpCisJdHlwZSA9IFVTRV9UX0NETDsKKyAgICBlbHNlIGlmICgqVF9BTCAhPSBOVUwpCisJdHlwZSA9IFVTRV9UX0FMOworICAgIGVsc2UgaWYgKGNhbl9jZSAmJiByZXN1bHRfZW1wdHkpCisJdHlwZSA9IFVTRV9UX0NFOworICAgIGVsc2UgaWYgKCpUX0RMICE9IE5VTCAmJiByZXN1bHRfZW1wdHkpCisJdHlwZSA9IFVTRV9UX0RMOworICAgIGVsc2UgaWYgKCpUX1NSICE9IE5VTCAmJiByb3cgPT0gMCAmJiAoKlRfREEgPT0gTlVMIHx8IGNhbl9jZSkpCisJdHlwZSA9IFVTRV9UX1NSOworICAgIGVsc2UKKwlyZXR1cm4gRkFJTDsKKworICAgIC8qCisgICAgICogRm9yIGNsZWFyaW5nIHRoZSBsaW5lcyBzY3JlZW5fZGVsX2xpbmVzKCkgaXMgdXNlZC4gVGhpcyB3aWxsIGFsc28gdGFrZQorICAgICAqIGNhcmUgb2YgdF9kYiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgaWYgKHR5cGUgPT0gVVNFX1RfQ0QgfHwgdHlwZSA9PSBVU0VfVF9DREwgfHwKKwkJCQkJIHR5cGUgPT0gVVNFX1RfQ0UgfHwgdHlwZSA9PSBVU0VfVF9ETCkKKwlyZXR1cm4gc2NyZWVuX2RlbF9saW5lcyhvZmYsIHJvdywgbGluZV9jb3VudCwgZW5kLCBGQUxTRSwgd3ApOworCisgICAgLyoKKyAgICAgKiBJZiB0ZXh0IGlzIHJldGFpbmVkIGJlbG93IHRoZSBzY3JlZW4sIGZpcnN0IGNsZWFyIG9yIGRlbGV0ZSBhcyBtYW55CisgICAgICogbGluZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgd2luZG93IGFzIGFyZSBhYm91dCB0byBiZSBpbnNlcnRlZCBzbyB0aGF0CisgICAgICogdGhlIGRlbGV0ZWQgbGluZXMgd29uJ3QgbGF0ZXIgc3VyZmFjZSBkdXJpbmcgYSBzY3JlZW5fZGVsX2xpbmVzLgorICAgICAqLworICAgIGlmICgqVF9EQikKKwlzY3JlZW5fZGVsX2xpbmVzKG9mZiwgZW5kIC0gbGluZV9jb3VudCwgbGluZV9jb3VudCwgZW5kLCBGQUxTRSwgd3ApOworCisjaWZkZWYgRkVBVF9DTElQQk9BUkQKKyAgICAvKiBSZW1vdmUgYSBtb2RlbGVzcyBzZWxlY3Rpb24gd2hlbiBpbnNlcnRpbmcgbGluZXMgaGFsZndheSB0aGUgc2NyZWVuCisgICAgICogb3Igbm90IHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBzY3JlZW4uICovCisgICAgaWYgKG9mZiArIHJvdyA+IDAKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgfHwgKHdwICE9IE5VTEwgJiYgd3AtPndfd2lkdGggIT0gQ29sdW1ucykKKyMgZW5kaWYKKyAgICAgICApCisJY2xpcF9jbGVhcl9zZWxlY3Rpb24oKTsKKyAgICBlbHNlCisJY2xpcF9zY3JvbGxfc2VsZWN0aW9uKC1saW5lX2NvdW50KTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUlfQkVPUworICAgIHZpbV9sb2NrX3NjcmVlbigpOworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBEb24ndCB1cGRhdGUgdGhlIEdVSSBjdXJzb3IgaGVyZSwgU2NyZWVuTGluZXNbXSBpcyBpbnZhbGlkIHVudGlsIHRoZQorICAgICAqIHNjcm9sbGluZyBpcyBhY3R1YWxseSBjYXJyaWVkIG91dC4gKi8KKyAgICBndWlfZG9udF91cGRhdGVfY3Vyc29yKCk7CisjZW5kaWYKKworICAgIGlmICgqVF9DQ1MgIT0gTlVMKQkgICAvKiBjdXJzb3IgcmVsYXRpdmUgdG8gcmVnaW9uICovCisJY3Vyc29yX3JvdyA9IHJvdzsKKyAgICBlbHNlCisJY3Vyc29yX3JvdyA9IHJvdyArIG9mZjsKKworICAgIC8qCisgICAgICogU2hpZnQgTGluZU9mZnNldFtdIGxpbmVfY291bnQgZG93biB0byByZWZsZWN0IHRoZSBpbnNlcnRlZCBsaW5lcy4KKyAgICAgKiBDbGVhciB0aGUgaW5zZXJ0ZWQgbGluZXMgaW4gU2NyZWVuTGluZXNbXS4KKyAgICAgKi8KKyAgICByb3cgKz0gb2ZmOworICAgIGVuZCArPSBvZmY7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVfY291bnQ7ICsraSkKKyAgICB7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlpZiAod3AgIT0gTlVMTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zKQorCXsKKwkgICAgLyogbmVlZCB0byBjb3B5IHBhcnQgb2YgYSBsaW5lICovCisJICAgIGogPSBlbmQgLSAxIC0gaTsKKwkgICAgd2hpbGUgKChqIC09IGxpbmVfY291bnQpID49IHJvdykKKwkJbGluZWNvcHkoaiArIGxpbmVfY291bnQsIGosIHdwKTsKKwkgICAgaiArPSBsaW5lX2NvdW50OworCSAgICBpZiAoY2FuX2NsZWFyKChjaGFyX3UgKikiICIpKQorCQlsaW5lY2xlYXIoTGluZU9mZnNldFtqXSArIHdwLT53X3dpbmNvbCwgd3AtPndfd2lkdGgpOworCSAgICBlbHNlCisJCWxpbmVpbnZhbGlkKExpbmVPZmZzZXRbal0gKyB3cC0+d193aW5jb2wsIHdwLT53X3dpZHRoKTsKKwkgICAgTGluZVdyYXBzW2pdID0gRkFMU0U7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkgICAgaiA9IGVuZCAtIDEgLSBpOworCSAgICB0ZW1wID0gTGluZU9mZnNldFtqXTsKKwkgICAgd2hpbGUgKChqIC09IGxpbmVfY291bnQpID49IHJvdykKKwkgICAgeworCQlMaW5lT2Zmc2V0W2ogKyBsaW5lX2NvdW50XSA9IExpbmVPZmZzZXRbal07CisJCUxpbmVXcmFwc1tqICsgbGluZV9jb3VudF0gPSBMaW5lV3JhcHNbal07CisJICAgIH0KKwkgICAgTGluZU9mZnNldFtqICsgbGluZV9jb3VudF0gPSB0ZW1wOworCSAgICBMaW5lV3JhcHNbaiArIGxpbmVfY291bnRdID0gRkFMU0U7CisJICAgIGlmIChjYW5fY2xlYXIoKGNoYXJfdSAqKSIgIikpCisJCWxpbmVjbGVhcih0ZW1wLCAoaW50KUNvbHVtbnMpOworCSAgICBlbHNlCisJCWxpbmVpbnZhbGlkKHRlbXAsIChpbnQpQ29sdW1ucyk7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgdmltX3VubG9ja19zY3JlZW4oKTsKKyNlbmRpZgorCisgICAgc2NyZWVuX3N0b3BfaGlnaGxpZ2h0KCk7CisgICAgd2luZGdvdG8oY3Vyc29yX3JvdywgMCk7CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIC8qIHJlZHJhdyB0aGUgY2hhcmFjdGVycyAqLworICAgIGlmICh0eXBlID09IFVTRV9SRURSQVcpCisJcmVkcmF3X2Jsb2NrKHJvdywgZW5kLCB3cCk7CisgICAgZWxzZQorI2VuZGlmCisJaWYgKHR5cGUgPT0gVVNFX1RfQ0FMKQorICAgIHsKKwl0ZXJtX2FwcGVuZF9saW5lcyhsaW5lX2NvdW50KTsKKwlzY3JlZW5fc3RhcnQoKTsJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBsaW5lX2NvdW50OyBpKyspCisJeworCSAgICBpZiAodHlwZSA9PSBVU0VfVF9BTCkKKwkgICAgeworCQlpZiAoaSAmJiBjdXJzb3Jfcm93ICE9IDApCisJCSAgICB3aW5kZ290byhjdXJzb3Jfcm93LCAwKTsKKwkJb3V0X3N0cihUX0FMKTsKKwkgICAgfQorCSAgICBlbHNlICAvKiB0eXBlID09IFVTRV9UX1NSICovCisJCW91dF9zdHIoVF9TUik7CisJICAgIHNjcmVlbl9zdGFydCgpOwkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJfQorICAgIH0KKworICAgIC8qCisgICAgICogV2l0aCBzY3JvbGwtcmV2ZXJzZSBhbmQgJ2RhJyBmbGFnIHNldCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBsaW5lcyB0aGF0CisgICAgICogaGF2ZSBiZWVuIHNjcm9sbGVkIGRvd24gaW50byB0aGUgcmVnaW9uLgorICAgICAqLworICAgIGlmICh0eXBlID09IFVTRV9UX1NSICYmICpUX0RBKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZV9jb3VudDsgKytpKQorCXsKKwkgICAgd2luZGdvdG8ob2ZmICsgaSwgMCk7CisJICAgIG91dF9zdHIoVF9DRSk7CisJICAgIHNjcmVlbl9zdGFydCgpOwkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJfQorICAgIH0KKworI2lmZGVmIEZFQVRfR1VJCisgICAgZ3VpX2Nhbl91cGRhdGVfY3Vyc29yKCk7CisgICAgaWYgKGd1aS5pbl91c2UpCisJb3V0X2ZsdXNoKCk7CS8qIGFsd2F5cyBmbHVzaCBhZnRlciBhIHNjcm9sbCAqLworI2VuZGlmCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogZGVsZXRlIGxpbmVzIG9uIHRoZSBzY3JlZW4gYW5kIHVwZGF0ZSBTY3JlZW5MaW5lc1tdCisgKiAnZW5kJyBpcyB0aGUgbGluZSBhZnRlciB0aGUgc2Nyb2xsZWQgcGFydC4gTm9ybWFsbHkgaXQgaXMgUm93cy4KKyAqIFdoZW4gc2Nyb2xsaW5nIHJlZ2lvbiB1c2VkICdvZmYnIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wIGZvciB0aGUgcmVnaW9uLgorICogJ3JvdycgYW5kICdlbmQnIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbi4KKyAqCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgaWYgdGhlIGxpbmVzIGFyZSBub3QgZGVsZXRlZC4KKyAqLworLypBUkdTVVNFRCovCisgICAgaW50CitzY3JlZW5fZGVsX2xpbmVzKG9mZiwgcm93LCBsaW5lX2NvdW50LCBlbmQsIGZvcmNlLCB3cCkKKyAgICBpbnQJCW9mZjsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCWxpbmVfY291bnQ7CisgICAgaW50CQllbmQ7CisgICAgaW50CQlmb3JjZTsJCS8qIGV2ZW4gd2hlbiBsaW5lX2NvdW50ID4gcF90dHlzY3JvbGwgKi8KKyAgICB3aW5fVAkqd3A7CQkvKiBOVUxMIG9yIHdpbmRvdyB0byB1c2Ugd2lkdGggZnJvbSAqLworeworICAgIGludAkJajsKKyAgICBpbnQJCWk7CisgICAgdW5zaWduZWQJdGVtcDsKKyAgICBpbnQJCWN1cnNvcl9yb3c7CisgICAgaW50CQljdXJzb3JfZW5kOworICAgIGludAkJcmVzdWx0X2VtcHR5OwkvKiByZXN1bHQgaXMgZW1wdHkgdW50aWwgZW5kIG9mIHJlZ2lvbiAqLworICAgIGludAkJY2FuX2RlbGV0ZTsJLyogZGVsZXRpbmcgbGluZSBjb2RlcyBjYW4gYmUgdXNlZCAqLworICAgIGludAkJdHlwZTsKKworICAgIC8qCisgICAgICogRkFJTCBpZgorICAgICAqIC0gdGhlcmUgaXMgbm8gdmFsaWQgc2NyZWVuCisgICAgICogLSB0aGUgc2NyZWVuIGhhcyB0byBiZSByZWRyYXduIGNvbXBsZXRlbHkKKyAgICAgKiAtIHRoZSBsaW5lIGNvdW50IGlzIGxlc3MgdGhhbiBvbmUKKyAgICAgKiAtIHRoZSBsaW5lIGNvdW50IGlzIG1vcmUgdGhhbiAndHR5c2Nyb2xsJworICAgICAqLworICAgIGlmICghc2NyZWVuX3ZhbGlkKFRSVUUpIHx8IGxpbmVfY291bnQgPD0gMCB8fAorCQkJCQkgKCFmb3JjZSAmJiBsaW5lX2NvdW50ID4gcF90dHlzY3JvbGwpKQorCXJldHVybiBGQUlMOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCByZWdpb24gd2lsbCBiZWNvbWUgZW1wdHkuCisgICAgICovCisgICAgcmVzdWx0X2VtcHR5ID0gcm93ICsgbGluZV9jb3VudCA+PSBlbmQ7CisKKyAgICAvKgorICAgICAqIFdlIGNhbiBkZWxldGUgbGluZXMgb25seSB3aGVuICdkYicgZmxhZyBub3Qgc2V0IG9yIHdoZW4gJ2NlJyBvcHRpb24KKyAgICAgKiBhdmFpbGFibGUuCisgICAgICovCisgICAgY2FuX2RlbGV0ZSA9ICgqVF9EQiA9PSBOVUwgfHwgY2FuX2NsZWFyKFRfQ0UpKTsKKworICAgIC8qCisgICAgICogVGhlcmUgYXJlIHNpeCB3YXlzIHRvIGRlbGV0ZSBsaW5lczoKKyAgICAgKiAwLiBXaGVuIGluIGEgdmVydGljYWxseSBzcGxpdCB3aW5kb3cgYW5kIHRfQ1YgaXNuJ3Qgc2V0LCByZWRyYXcgdGhlCisgICAgICogICAgY2hhcmFjdGVycyBmcm9tIFNjcmVlbkxpbmVzW10uCisgICAgICogMS4gVXNlIFRfQ0QgaWYgaXQgZXhpc3RzIGFuZCB0aGUgcmVzdWx0IGlzIGVtcHR5LgorICAgICAqIDIuIFVzZSBuZXdsaW5lcyBpZiByb3cgPT0gMCBhbmQgY291bnQgPT0gMSBvciBUX0NETCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiAzLiBVc2UgVF9DREwgKGRlbGV0ZSBtdWx0aXBsZSBsaW5lcykgaWYgaXQgZXhpc3RzIGFuZCBsaW5lX2NvdW50ID4gMSBvcgorICAgICAqCSAgbm9uZSBvZiB0aGUgb3RoZXIgd2F5cyB3b3JrLgorICAgICAqIDQuIFVzZSBUX0NFIChlcmFzZSBsaW5lKSBpZiB0aGUgcmVzdWx0IGlzIGVtcHR5LgorICAgICAqIDUuIFVzZSBUX0RMIChkZWxldGUgbGluZSkgaWYgaXQgZXhpc3RzLgorICAgICAqIDYuIHJlZHJhdyB0aGUgY2hhcmFjdGVycyBmcm9tIFNjcmVlbkxpbmVzW10uCisgICAgICovCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAod3AgIT0gTlVMTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zICYmICpUX0NTViA9PSBOVUwpCisJdHlwZSA9IFVTRV9SRURSQVc7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKGNhbl9jbGVhcihUX0NEKSAmJiByZXN1bHRfZW1wdHkpCisJdHlwZSA9IFVTRV9UX0NEOworI2lmIGRlZmluZWQoX19CRU9TX18pICYmIGRlZmluZWQoQkVPU19EUjgpCisgICAgLyoKKyAgICAgKiBVU0VfTkwgZG9lcyBub3Qgc2VlbSB0byB3b3JrIGluIFRlcm1pbmFsIG9mIERSOCBzbyB3ZSBzZXQgVF9EQj0iIiBpbgorICAgICAqIGl0cyBpbnRlcm5hbCB0ZXJtY2FwLi4uIHRoaXMgd29ya3Mgb2theSBmb3IgdGVzdHMgd2hpY2ggdGVzdCAqVF9EQiAhPQorICAgICAqIE5VTC4gIEl0IGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgdGhlIHVzZXIgY2Fubm90IHVzZSBhbnkgOnNldCB0XyoKKyAgICAgKiBjb21tYW5kIHRvIGdldCBUX0RCIChiYWNrKSB0byBlbXB0eV9vcHRpb24sIG9ubHkgOnNldCB0ZXJtPS4uLiB3aWxsIGRvCisgICAgICogdGhlIHRyaWNrLi4uCisgICAgICogQW55d2F5LCB0aGlzIGhhY2sgd2lsbCBob3BlZnVsbHkgZ28gYXdheSB3aXRoIHRoZSBuZXh0IE9TIHJlbGVhc2UuCisgICAgICogKE9sYWYgU2VpYmVydCkKKyAgICAgKi8KKyAgICBlbHNlIGlmIChyb3cgPT0gMCAmJiBUX0RCID09IGVtcHR5X29wdGlvbgorCQkJCQkmJiAobGluZV9jb3VudCA9PSAxIHx8ICpUX0NETCA9PSBOVUwpKQorI2Vsc2UKKyAgICBlbHNlIGlmIChyb3cgPT0gMCAmJiAoCisjaWZuZGVmIEFNSUdBCisJLyogT24gdGhlIEFtaWdhLCBzb21laG93ICdcbicgb24gdGhlIGxhc3QgbGluZSBkb2Vzbid0IGFsd2F5cyBzY3JvbGwKKwkgKiB1cCwgc28gdXNlIGRlbGV0ZS1saW5lIGNvbW1hbmQgKi8KKwkJCSAgICBsaW5lX2NvdW50ID09IDEgfHwKKyNlbmRpZgorCQkJCQkJKlRfQ0RMID09IE5VTCkpCisjZW5kaWYKKwl0eXBlID0gVVNFX05MOworICAgIGVsc2UgaWYgKCpUX0NETCAhPSBOVUwgJiYgbGluZV9jb3VudCA+IDEgJiYgY2FuX2RlbGV0ZSkKKwl0eXBlID0gVVNFX1RfQ0RMOworICAgIGVsc2UgaWYgKGNhbl9jbGVhcihUX0NFKSAmJiByZXN1bHRfZW1wdHkKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICAmJiAod3AgPT0gTlVMTCB8fCB3cC0+d193aWR0aCA9PSBDb2x1bW5zKQorI2VuZGlmCisJICAgICkKKwl0eXBlID0gVVNFX1RfQ0U7CisgICAgZWxzZSBpZiAoKlRfREwgIT0gTlVMICYmIGNhbl9kZWxldGUpCisJdHlwZSA9IFVTRV9UX0RMOworICAgIGVsc2UgaWYgKCpUX0NETCAhPSBOVUwgJiYgY2FuX2RlbGV0ZSkKKwl0eXBlID0gVVNFX1RfQ0RMOworICAgIGVsc2UKKwlyZXR1cm4gRkFJTDsKKworI2lmZGVmIEZFQVRfQ0xJUEJPQVJECisgICAgLyogUmVtb3ZlIGEgbW9kZWxlc3Mgc2VsZWN0aW9uIHdoZW4gZGVsZXRpbmcgbGluZXMgaGFsZndheSB0aGUgc2NyZWVuIG9yCisgICAgICogbm90IHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBzY3JlZW4uICovCisgICAgaWYgKG9mZiArIHJvdyA+IDAKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgfHwgKHdwICE9IE5VTEwgJiYgd3AtPndfd2lkdGggIT0gQ29sdW1ucykKKyMgZW5kaWYKKyAgICAgICApCisJY2xpcF9jbGVhcl9zZWxlY3Rpb24oKTsKKyAgICBlbHNlCisJY2xpcF9zY3JvbGxfc2VsZWN0aW9uKGxpbmVfY291bnQpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgdmltX2xvY2tfc2NyZWVuKCk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qIERvbid0IHVwZGF0ZSB0aGUgR1VJIGN1cnNvciBoZXJlLCBTY3JlZW5MaW5lc1tdIGlzIGludmFsaWQgdW50aWwgdGhlCisgICAgICogc2Nyb2xsaW5nIGlzIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiAqLworICAgIGd1aV9kb250X3VwZGF0ZV9jdXJzb3IoKTsKKyNlbmRpZgorCisgICAgaWYgKCpUX0NDUyAhPSBOVUwpCSAgICAvKiBjdXJzb3IgcmVsYXRpdmUgdG8gcmVnaW9uICovCisgICAgeworCWN1cnNvcl9yb3cgPSByb3c7CisJY3Vyc29yX2VuZCA9IGVuZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljdXJzb3Jfcm93ID0gcm93ICsgb2ZmOworCWN1cnNvcl9lbmQgPSBlbmQgKyBvZmY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOb3cgc2hpZnQgTGluZU9mZnNldFtdIGxpbmVfY291bnQgdXAgdG8gcmVmbGVjdCB0aGUgZGVsZXRlZCBsaW5lcy4KKyAgICAgKiBDbGVhciB0aGUgaW5zZXJ0ZWQgbGluZXMgaW4gU2NyZWVuTGluZXNbXS4KKyAgICAgKi8KKyAgICByb3cgKz0gb2ZmOworICAgIGVuZCArPSBvZmY7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVfY291bnQ7ICsraSkKKyAgICB7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlpZiAod3AgIT0gTlVMTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zKQorCXsKKwkgICAgLyogbmVlZCB0byBjb3B5IHBhcnQgb2YgYSBsaW5lICovCisJICAgIGogPSByb3cgKyBpOworCSAgICB3aGlsZSAoKGogKz0gbGluZV9jb3VudCkgPD0gZW5kIC0gMSkKKwkJbGluZWNvcHkoaiAtIGxpbmVfY291bnQsIGosIHdwKTsKKwkgICAgaiAtPSBsaW5lX2NvdW50OworCSAgICBpZiAoY2FuX2NsZWFyKChjaGFyX3UgKikiICIpKQorCQlsaW5lY2xlYXIoTGluZU9mZnNldFtqXSArIHdwLT53X3dpbmNvbCwgd3AtPndfd2lkdGgpOworCSAgICBlbHNlCisJCWxpbmVpbnZhbGlkKExpbmVPZmZzZXRbal0gKyB3cC0+d193aW5jb2wsIHdwLT53X3dpZHRoKTsKKwkgICAgTGluZVdyYXBzW2pdID0gRkFMU0U7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkgICAgLyogd2hvbGUgd2lkdGgsIG1vdmluZyB0aGUgbGluZSBwb2ludGVycyBpcyBmYXN0ZXIgKi8KKwkgICAgaiA9IHJvdyArIGk7CisJICAgIHRlbXAgPSBMaW5lT2Zmc2V0W2pdOworCSAgICB3aGlsZSAoKGogKz0gbGluZV9jb3VudCkgPD0gZW5kIC0gMSkKKwkgICAgeworCQlMaW5lT2Zmc2V0W2ogLSBsaW5lX2NvdW50XSA9IExpbmVPZmZzZXRbal07CisJCUxpbmVXcmFwc1tqIC0gbGluZV9jb3VudF0gPSBMaW5lV3JhcHNbal07CisJICAgIH0KKwkgICAgTGluZU9mZnNldFtqIC0gbGluZV9jb3VudF0gPSB0ZW1wOworCSAgICBMaW5lV3JhcHNbaiAtIGxpbmVfY291bnRdID0gRkFMU0U7CisJICAgIGlmIChjYW5fY2xlYXIoKGNoYXJfdSAqKSIgIikpCisJCWxpbmVjbGVhcih0ZW1wLCAoaW50KUNvbHVtbnMpOworCSAgICBlbHNlCisJCWxpbmVpbnZhbGlkKHRlbXAsIChpbnQpQ29sdW1ucyk7CisJfQorICAgIH0KKyNpZmRlZiBGRUFUX0dVSV9CRU9TCisgICAgdmltX3VubG9ja19zY3JlZW4oKTsKKyNlbmRpZgorCisgICAgc2NyZWVuX3N0b3BfaGlnaGxpZ2h0KCk7CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIC8qIHJlZHJhdyB0aGUgY2hhcmFjdGVycyAqLworICAgIGlmICh0eXBlID09IFVTRV9SRURSQVcpCisJcmVkcmF3X2Jsb2NrKHJvdywgZW5kLCB3cCk7CisgICAgZWxzZQorI2VuZGlmCisJaWYgKHR5cGUgPT0gVVNFX1RfQ0QpCS8qIGRlbGV0ZSB0aGUgbGluZXMgKi8KKyAgICB7CisJd2luZGdvdG8oY3Vyc29yX3JvdywgMCk7CisJb3V0X3N0cihUX0NEKTsKKwlzY3JlZW5fc3RhcnQoKTsJCQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZSA9PSBVU0VfVF9DREwpCisgICAgeworCXdpbmRnb3RvKGN1cnNvcl9yb3csIDApOworCXRlcm1fZGVsZXRlX2xpbmVzKGxpbmVfY291bnQpOworCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworICAgIH0KKyAgICAvKgorICAgICAqIERlbGV0aW5nIGxpbmVzIGF0IHRvcCBvZiB0aGUgc2NyZWVuIG9yIHNjcm9sbCByZWdpb246IEp1c3Qgc2Nyb2xsCisgICAgICogdGhlIHdob2xlIHNjcmVlbiAoc2Nyb2xsIHJlZ2lvbikgdXAgYnkgb3V0cHV0dGluZyBuZXdsaW5lcyBvbiB0aGUKKyAgICAgKiBsYXN0IGxpbmUuCisgICAgICovCisgICAgZWxzZSBpZiAodHlwZSA9PSBVU0VfTkwpCisgICAgeworCXdpbmRnb3RvKGN1cnNvcl9lbmQgLSAxLCAwKTsKKwlmb3IgKGkgPSBsaW5lX2NvdW50OyAtLWkgPj0gMDsgKQorCSAgICBvdXRfY2hhcignXG4nKTsJCS8qIGN1cnNvciB3aWxsIHJlbWFpbiBvbiBzYW1lIGxpbmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSBsaW5lX2NvdW50OyAtLWkgPj0gMDsgKQorCXsKKwkgICAgaWYgKHR5cGUgPT0gVVNFX1RfREwpCisJICAgIHsKKwkJd2luZGdvdG8oY3Vyc29yX3JvdywgMCk7CisJCW91dF9zdHIoVF9ETCk7CQkvKiBkZWxldGUgYSBsaW5lICovCisJICAgIH0KKwkgICAgZWxzZSAvKiB0eXBlID09IFVTRV9UX0NFICovCisJICAgIHsKKwkJd2luZGdvdG8oY3Vyc29yX3JvdyArIGksIDApOworCQlvdXRfc3RyKFRfQ0UpOwkJLyogZXJhc2UgYSBsaW5lICovCisJICAgIH0KKwkgICAgc2NyZWVuX3N0YXJ0KCk7CQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgJ2RiJyBmbGFnIGlzIHNldCwgd2UgbmVlZCB0byBjbGVhciB0aGUgbGluZXMgdGhhdCBoYXZlIGJlZW4KKyAgICAgKiBzY3JvbGxlZCB1cCBhdCB0aGUgYm90dG9tIG9mIHRoZSByZWdpb24uCisgICAgICovCisgICAgaWYgKCpUX0RCICYmICh0eXBlID09IFVTRV9UX0RMIHx8IHR5cGUgPT0gVVNFX1RfQ0RMKSkKKyAgICB7CisJZm9yIChpID0gbGluZV9jb3VudDsgaSA+IDA7IC0taSkKKwl7CisJICAgIHdpbmRnb3RvKGN1cnNvcl9lbmQgLSBpLCAwKTsKKwkgICAgb3V0X3N0cihUX0NFKTsJCS8qIGVyYXNlIGEgbGluZSAqLworCSAgICBzY3JlZW5fc3RhcnQoKTsJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGd1aV9jYW5fdXBkYXRlX2N1cnNvcigpOworICAgIGlmIChndWkuaW5fdXNlKQorCW91dF9mbHVzaCgpOwkvKiBhbHdheXMgZmx1c2ggYWZ0ZXIgYSBzY3JvbGwgKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogc2hvdyB0aGUgY3VycmVudCBtb2RlIGFuZCBydWxlcgorICoKKyAqIElmIGNsZWFyX2NtZGxpbmUgaXMgVFJVRSwgY2xlYXIgdGhlIHJlc3Qgb2YgdGhlIGNtZGxpbmUuCisgKiBJZiBjbGVhcl9jbWRsaW5lIGlzIEZBTFNFIHRoZXJlIG1heSBiZSBhIG1lc3NhZ2UgdGhlcmUgdGhhdCBuZWVkcyB0byBiZQorICogY2xlYXJlZCBvbmx5IGlmIGEgbW9kZSBpcyBzaG93bi4KKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICgwIGlmIG5vIG1lc3NhZ2UpLgorICovCisgICAgaW50CitzaG93bW9kZSgpCit7CisgICAgaW50CQluZWVkX2NsZWFyOworICAgIGludAkJbGVuZ3RoID0gMDsKKyAgICBpbnQJCWRvX21vZGU7CisgICAgaW50CQlhdHRyOworICAgIGludAkJbndyX3NhdmU7CisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisgICAgaW50CQlzdWJfYXR0cjsKKyNlbmRpZgorCisgICAgZG9fbW9kZSA9IChwX3NtZCAmJiAoKFN0YXRlICYgSU5TRVJUKSB8fCByZXN0YXJ0X2VkaXQKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQl8fCBWSXN1YWxfYWN0aXZlCisjZW5kaWYKKwkJKSk7CisgICAgaWYgKGRvX21vZGUgfHwgUmVjb3JkaW5nKQorICAgIHsKKwkvKgorCSAqIERvbid0IHNob3cgbW9kZSByaWdodCBub3csIHdoZW4gbm90IHJlZHJhd2luZyBvciBpbnNpZGUgYSBtYXBwaW5nLgorCSAqIENhbGwgY2hhcl9hdmFpbCgpIG9ubHkgd2hlbiB3ZSBhcmUgZ29pbmcgdG8gc2hvdyBzb21ldGhpbmcsIGJlY2F1c2UKKwkgKiBpdCB0YWtlcyBhIGJpdCBvZiB0aW1lLgorCSAqLworCWlmICghcmVkcmF3aW5nKCkgfHwgKGNoYXJfYXZhaWwoKSAmJiAhS2V5VHlwZWQpIHx8IG1zZ19zaWxlbnQgIT0gMCkKKwl7CisJICAgIHJlZHJhd19jbWRsaW5lID0gVFJVRTsJCS8qIHNob3cgbW9kZSBsYXRlciAqLworCSAgICByZXR1cm4gMDsKKwl9CisKKwlud3Jfc2F2ZSA9IG5lZWRfd2FpdF9yZXR1cm47CisKKwkvKiB3YWl0IGEgYml0IGJlZm9yZSBvdmVyd3JpdGluZyBhbiBpbXBvcnRhbnQgbWVzc2FnZSAqLworCWNoZWNrX2Zvcl9kZWxheShGQUxTRSk7CisKKwkvKiBpZiB0aGUgY21kbGluZSBpcyBtb3JlIHRoYW4gb25lIGxpbmUgaGlnaCwgZXJhc2UgdG9wIGxpbmVzICovCisJbmVlZF9jbGVhciA9IGNsZWFyX2NtZGxpbmU7CisJaWYgKGNsZWFyX2NtZGxpbmUgJiYgY21kbGluZV9yb3cgPCBSb3dzIC0gMSkKKwkgICAgbXNnX2Nscl9jbWRsaW5lKCk7CQkJLyogd2lsbCByZXNldCBjbGVhcl9jbWRsaW5lICovCisKKwkvKiBQb3NpdGlvbiBvbiB0aGUgbGFzdCBsaW5lIGluIHRoZSB3aW5kb3csIGNvbHVtbiAwICovCisJbXNnX3Bvc19tb2RlKCk7CisJY3Vyc29yX29mZigpOworCWF0dHIgPSBobF9hdHRyKEhMRl9DTSk7CQkJLyogSGlnaGxpZ2h0IG1vZGUgKi8KKwlpZiAoZG9fbW9kZSkKKwl7CisJICAgIE1TR19QVVRTX0FUVFIoIi0tIiwgYXR0cik7CisjaWYgZGVmaW5lZChGRUFUX1hJTSkKKwkgICAgaWYgKHhpYyAhPSBOVUxMICYmIGltX2dldF9zdGF0dXMoKSAmJiAhcF9pbWRpc2FibGUKKwkJCQkJJiYgY3VyYnVmLT5iX3BfaW1pbnNlcnQgPT0gQl9JTU9ERV9JTSkKKyMgaWZkZWYgSEFWRV9HVEsyIC8qIG1vc3Qgb2YgdGhlIHRpbWUsIGl0J3Mgbm90IFhJTSBiZWluZyB1c2VkICovCisJCU1TR19QVVRTX0FUVFIoIiBJTSIsIGF0dHIpOworIyBlbHNlCisJCU1TR19QVVRTX0FUVFIoIiBYSU0iLCBhdHRyKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9IQU5HVUxJTikgJiYgZGVmaW5lZChGRUFUX0dVSSkKKwkgICAgaWYgKGd1aS5pbl91c2UpCisJICAgIHsKKwkJaWYgKGhhbmd1bF9pbnB1dF9zdGF0ZV9nZXQoKSkKKwkJICAgIE1TR19QVVRTX0FUVFIoIiDH0bHbIiwgYXR0cik7ICAgLyogSEFOR1VMICovCisJICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCSAgICBpZiAoZWRpdF9zdWJtb2RlICE9IE5VTEwpCQkvKiBDVFJMLVggaW4gSW5zZXJ0IG1vZGUgKi8KKwkgICAgeworCQkvKiBUaGVzZSBtZXNzYWdlcyBjYW4gZ2V0IGxvbmcsIGF2b2lkIGEgd3JhcCBpbiBhIG5hcnJvdworCQkgKiB3aW5kb3cuICBQcmVmZXIgc2hvd2luZyBlZGl0X3N1Ym1vZGVfZXh0cmEuICovCisJCWxlbmd0aCA9IChSb3dzIC0gbXNnX3JvdykgKiBDb2x1bW5zIC0gMzsKKwkJaWYgKGVkaXRfc3VibW9kZV9leHRyYSAhPSBOVUxMKQorCQkgICAgbGVuZ3RoIC09IHZpbV9zdHJzaXplKGVkaXRfc3VibW9kZV9leHRyYSk7CisJCWlmIChsZW5ndGggPiAwKQorCQl7CisJCSAgICBpZiAoZWRpdF9zdWJtb2RlX3ByZSAhPSBOVUxMKQorCQkJbGVuZ3RoIC09IHZpbV9zdHJzaXplKGVkaXRfc3VibW9kZV9wcmUpOworCQkgICAgaWYgKGxlbmd0aCAtIHZpbV9zdHJzaXplKGVkaXRfc3VibW9kZSkgPiAwKQorCQkgICAgeworCQkJaWYgKGVkaXRfc3VibW9kZV9wcmUgIT0gTlVMTCkKKwkJCSAgICBtc2dfcHV0c19hdHRyKGVkaXRfc3VibW9kZV9wcmUsIGF0dHIpOworCQkJbXNnX3B1dHNfYXR0cihlZGl0X3N1Ym1vZGUsIGF0dHIpOworCQkgICAgfQorCQkgICAgaWYgKGVkaXRfc3VibW9kZV9leHRyYSAhPSBOVUxMKQorCQkgICAgeworCQkJTVNHX1BVVFNfQVRUUigiICIsIGF0dHIpOyAgLyogYWRkIGEgc3BhY2UgaW4gYmV0d2VlbiAqLworCQkJaWYgKChpbnQpZWRpdF9zdWJtb2RlX2hpZ2hsIDwgKGludClITEZfQ09VTlQpCisJCQkgICAgc3ViX2F0dHIgPSBobF9hdHRyKGVkaXRfc3VibW9kZV9oaWdobCk7CisJCQllbHNlCisJCQkgICAgc3ViX2F0dHIgPSBhdHRyOworCQkJbXNnX3B1dHNfYXR0cihlZGl0X3N1Ym1vZGVfZXh0cmEsIHN1Yl9hdHRyKTsKKwkJICAgIH0KKwkJfQorCQlsZW5ndGggPSAwOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisjaWZkZWYgRkVBVF9WUkVQTEFDRQorCQlpZiAoU3RhdGUgJiBWUkVQTEFDRV9GTEFHKQorCQkgICAgTVNHX1BVVFNfQVRUUihfKCIgVlJFUExBQ0UiKSwgYXR0cik7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgaWYgKFN0YXRlICYgUkVQTEFDRV9GTEFHKQorCQkgICAgTVNHX1BVVFNfQVRUUihfKCIgUkVQTEFDRSIpLCBhdHRyKTsKKwkJZWxzZSBpZiAoU3RhdGUgJiBJTlNFUlQpCisJCXsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQkgICAgaWYgKHBfcmkpCisJCQlNU0dfUFVUU19BVFRSKF8oIiBSRVZFUlNFIiksIGF0dHIpOworI2VuZGlmCisJCSAgICBNU0dfUFVUU19BVFRSKF8oIiBJTlNFUlQiKSwgYXR0cik7CisJCX0KKwkJZWxzZSBpZiAocmVzdGFydF9lZGl0ID09ICdJJykKKwkJICAgIE1TR19QVVRTX0FUVFIoXygiIChpbnNlcnQpIiksIGF0dHIpOworCQllbHNlIGlmIChyZXN0YXJ0X2VkaXQgPT0gJ1InKQorCQkgICAgTVNHX1BVVFNfQVRUUihfKCIgKHJlcGxhY2UpIiksIGF0dHIpOworCQllbHNlIGlmIChyZXN0YXJ0X2VkaXQgPT0gJ1YnKQorCQkgICAgTVNHX1BVVFNfQVRUUihfKCIgKHZyZXBsYWNlKSIpLCBhdHRyKTsKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorCQlpZiAocF9oa21hcCkKKwkJICAgIE1TR19QVVRTX0FUVFIoXygiIEhlYnJldyIpLCBhdHRyKTsKKyMgaWZkZWYgRkVBVF9GS01BUAorCQlpZiAocF9ma21hcCkKKwkJICAgIE1TR19QVVRTX0FUVFIoZmFyc2lfdGV4dF81LCBhdHRyKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfS0VZTUFQCisJCWlmIChTdGF0ZSAmIExBTkdNQVApCisJCXsKKyMgaWZkZWYgRkVBVF9BUkFCSUMKKwkJICAgIGlmIChjdXJ3aW4tPndfcF9hcmFiKQorCQkJTVNHX1BVVFNfQVRUUihfKCIgQXJhYmljIiksIGF0dHIpOworCQkgICAgZWxzZQorIyBlbmRpZgorCQkJTVNHX1BVVFNfQVRUUihfKCIgKGxhbmcpIiksIGF0dHIpOworCQl9CisjZW5kaWYKKwkJaWYgKChTdGF0ZSAmIElOU0VSVCkgJiYgcF9wYXN0ZSkKKwkJICAgIE1TR19QVVRTX0FUVFIoXygiIChwYXN0ZSkiKSwgYXR0cik7CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlpZiAoVklzdWFsX2FjdGl2ZSkKKwkJeworCQkgICAgY2hhciAqcDsKKworCQkgICAgLyogRG9uJ3QgY29uY2F0ZW5hdGUgc2VwYXJhdGUgd29yZHMgdG8gYXZvaWQgdHJhbnNsYXRpb24KKwkJICAgICAqIHByb2JsZW1zLiAqLworCQkgICAgc3dpdGNoICgoVklzdWFsX3NlbGVjdCA/IDQgOiAwKQorCQkJICAgICsgKFZJc3VhbF9tb2RlID09IEN0cmxfVikgKiAyCisJCQkgICAgKyAoVklzdWFsX21vZGUgPT0gJ1YnKSkKKwkJICAgIHsKKwkJCWNhc2UgMDoJcCA9IE5fKCIgVklTVUFMIik7IGJyZWFrOworCQkJY2FzZSAxOiBwID0gTl8oIiBWSVNVQUwgTElORSIpOyBicmVhazsKKwkJCWNhc2UgMjogcCA9IE5fKCIgVklTVUFMIEJMT0NLIik7IGJyZWFrOworCQkJY2FzZSA0OiBwID0gTl8oIiBTRUxFQ1QiKTsgYnJlYWs7CisJCQljYXNlIDU6IHAgPSBOXygiIFNFTEVDVCBMSU5FIik7IGJyZWFrOworCQkJZGVmYXVsdDogcCA9IE5fKCIgU0VMRUNUIEJMT0NLIik7IGJyZWFrOworCQkgICAgfQorCQkgICAgTVNHX1BVVFNfQVRUUihfKHApLCBhdHRyKTsKKwkJfQorI2VuZGlmCisJCU1TR19QVVRTX0FUVFIoIiAtLSIsIGF0dHIpOworCSAgICB9CisJICAgIG5lZWRfY2xlYXIgPSBUUlVFOworCX0KKwlpZiAoUmVjb3JkaW5nCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJCSYmIGVkaXRfc3VibW9kZSA9PSBOVUxMCSAgICAvKiBvdGhlcndpc2UgaXQgZ2V0cyB0b28gbG9uZyAqLworI2VuZGlmCisJCSkKKwl7CisJICAgIE1TR19QVVRTX0FUVFIoXygicmVjb3JkaW5nIiksIGF0dHIpOworCSAgICBuZWVkX2NsZWFyID0gVFJVRTsKKwl9CisJaWYgKG5lZWRfY2xlYXIgfHwgY2xlYXJfY21kbGluZSkKKwkgICAgbXNnX2Nscl9lb3MoKTsKKwltc2dfZGlkb3V0ID0gRkFMU0U7CQkvKiBvdmVyd3JpdGUgdGhpcyBtZXNzYWdlICovCisJbGVuZ3RoID0gbXNnX2NvbDsKKwltc2dfY29sID0gMDsKKwluZWVkX3dhaXRfcmV0dXJuID0gbndyX3NhdmU7CS8qIG5ldmVyIGFzayBmb3IgaGl0LXJldHVybiBmb3IgdGhpcyAqLworICAgIH0KKyAgICBlbHNlIGlmIChjbGVhcl9jbWRsaW5lICYmIG1zZ19zaWxlbnQgPT0gMCkKKwkvKiBDbGVhciB0aGUgd2hvbGUgY29tbWFuZCBsaW5lLiAgV2lsbCByZXNldCAiY2xlYXJfY21kbGluZSIuICovCisJbXNnX2Nscl9jbWRsaW5lKCk7CisKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworIyBpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIEluIFZpc3VhbCBtb2RlIHRoZSBzaXplIG9mIHRoZSBzZWxlY3RlZCBhcmVhIG11c3QgYmUgcmVkcmF3bi4gKi8KKyAgICBpZiAoVklzdWFsX2FjdGl2ZSkKKwljbGVhcl9zaG93Y21kKCk7CisjIGVuZGlmCisKKyAgICAvKiBJZiB0aGUgbGFzdCB3aW5kb3cgaGFzIG5vIHN0YXR1cyBsaW5lLCB0aGUgcnVsZXIgaXMgYWZ0ZXIgdGhlIG1vZGUKKyAgICAgKiBtZXNzYWdlIGFuZCBtdXN0IGJlIHJlZHJhd24gKi8KKyAgICBpZiAocmVkcmF3aW5nKCkKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisJICAgICYmIGxhc3R3aW4tPndfc3RhdHVzX2hlaWdodCA9PSAwCisjIGVuZGlmCisgICAgICAgKQorCXdpbl9yZWRyX3J1bGVyKGxhc3R3aW4sIFRSVUUpOworI2VuZGlmCisgICAgcmVkcmF3X2NtZGxpbmUgPSBGQUxTRTsKKyAgICBjbGVhcl9jbWRsaW5lID0gRkFMU0U7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKgorICogUG9zaXRpb24gZm9yIGEgbW9kZSBtZXNzYWdlLgorICovCisgICAgc3RhdGljIHZvaWQKK21zZ19wb3NfbW9kZSgpCit7CisgICAgbXNnX2NvbCA9IDA7CisgICAgbXNnX3JvdyA9IFJvd3MgLSAxOworfQorCisvKgorICogRGVsZXRlIG1vZGUgbWVzc2FnZS4gIFVzZWQgd2hlbiBFU0MgaXMgdHlwZWQgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gZW5kCisgKiBJbnNlcnQgbW9kZSAoYnV0IEluc2VydCBtb2RlIGRpZG4ndCBlbmQgeWV0ISkuCisgKi8KKyAgICB2b2lkCit1bnNob3dtb2RlKGZvcmNlKQorICAgIGludAkgICAgZm9yY2U7Cit7CisgICAgLyoKKyAgICAgKiBEb24ndCBkZWxldGUgaXQgcmlnaHQgbm93LCB3aGVuIG5vdCByZWRyYXdpbmcgb3IgaW5zaWRlZCBhIG1hcHBpbmcuCisgICAgICovCisgICAgaWYgKCFyZWRyYXdpbmcoKSB8fCAoIWZvcmNlICYmIGNoYXJfYXZhaWwoKSAmJiAhS2V5VHlwZWQpKQorCXJlZHJhd19jbWRsaW5lID0gVFJVRTsJCS8qIGRlbGV0ZSBtb2RlIGxhdGVyICovCisgICAgZWxzZQorICAgIHsKKwltc2dfcG9zX21vZGUoKTsKKwlpZiAoUmVjb3JkaW5nKQorCSAgICBNU0dfUFVUU19BVFRSKF8oInJlY29yZGluZyIpLCBobF9hdHRyKEhMRl9DTSkpOworCW1zZ19jbHJfZW9zKCk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoRkVBVF9XSUxETUVOVSkgfHwgZGVmaW5lZChGRUFUX1NUTF9PUFQpCisvKgorICogR2V0IHRoZSBjaGFyYWN0ZXIgdG8gdXNlIGluIGEgc3RhdHVzIGxpbmUuICBHZXQgaXRzIGF0dHJpYnV0ZXMgaW4gIiphdHRyIi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpbGxjaGFyX3N0YXR1cyhhdHRyLCBpc19jdXJ3aW4pCisgICAgaW50CQkqYXR0cjsKKyAgICBpbnQJCWlzX2N1cndpbjsKK3sKKyAgICBpbnQgZmlsbDsKKyAgICBpZiAoaXNfY3Vyd2luKQorICAgIHsKKwkqYXR0ciA9IGhsX2F0dHIoSExGX1MpOworCWZpbGwgPSBmaWxsX3N0bDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkqYXR0ciA9IGhsX2F0dHIoSExGX1NOQyk7CisJZmlsbCA9IGZpbGxfc3RsbmM7CisgICAgfQorICAgIC8qIFVzZSBmaWxsIHdoZW4gdGhlcmUgaXMgaGlnaGxpZ2h0aW5nLCBhbmQgaGlnaGxpZ2h0aW5nIG9mIGN1cnJlbnQKKyAgICAgKiB3aW5kb3cgZGlmZmVycywgb3IgdGhlIGZpbGxjaGFycyBkaWZmZXIsIG9yIHRoaXMgaXMgbm90IHRoZQorICAgICAqIGN1cnJlbnQgd2luZG93ICovCisgICAgaWYgKCphdHRyICE9IDAgJiYgKChobF9hdHRyKEhMRl9TKSAhPSBobF9hdHRyKEhMRl9TTkMpCisJCQl8fCAhaXNfY3Vyd2luIHx8IGZpcnN0d2luID09IGxhc3R3aW4pCisJCSAgICB8fCAoZmlsbF9zdGwgIT0gZmlsbF9zdGxuYykpKQorCXJldHVybiBmaWxsOworICAgIGlmIChpc19jdXJ3aW4pCisJcmV0dXJuICdeJzsKKyAgICByZXR1cm4gJz0nOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorLyoKKyAqIEdldCB0aGUgY2hhcmFjdGVyIHRvIHVzZSBpbiBhIHNlcGFyYXRvciBiZXR3ZWVuIHZlcnRpY2FsbHkgc3BsaXQgd2luZG93cy4KKyAqIEdldCBpdHMgYXR0cmlidXRlcyBpbiAiKmF0dHIiLgorICovCisgICAgc3RhdGljIGludAorZmlsbGNoYXJfdnNlcChhdHRyKQorICAgIGludAkgICAgKmF0dHI7Cit7CisgICAgKmF0dHIgPSBobF9hdHRyKEhMRl9DKTsKKyAgICBpZiAoKmF0dHIgPT0gMCAmJiBmaWxsX3ZlcnQgPT0gJyAnKQorCXJldHVybiAnfCc7CisgICAgZWxzZQorCXJldHVybiBmaWxsX3ZlcnQ7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHJlZHJhd2luZyBzaG91bGQgY3VycmVudGx5IGJlIGRvbmUuCisgKi8KKyAgICBpbnQKK3JlZHJhd2luZygpCit7CisgICAgcmV0dXJuICghUmVkcmF3aW5nRGlzYWJsZWQKKwkJICAgICAgICYmICEocF9seiAmJiBjaGFyX2F2YWlsKCkgJiYgIUtleVR5cGVkICYmICFkb19yZWRyYXcpKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHByaW50aW5nIG1lc3NhZ2VzIHNob3VsZCBjdXJyZW50bHkgYmUgZG9uZS4KKyAqLworICAgIGludAorbWVzc2FnaW5nKCkKK3sKKyAgICByZXR1cm4gKCEocF9seiAmJiBjaGFyX2F2YWlsKCkgJiYgIUtleVR5cGVkKSk7Cit9CisKKy8qCisgKiBTaG93IGN1cnJlbnQgc3RhdHVzIGluZm8gaW4gcnVsZXIgYW5kIHZhcmlvdXMgb3RoZXIgcGxhY2VzCisgKiBJZiBhbHdheXMgaXMgRkFMU0UsIG9ubHkgc2hvdyBydWxlciBpZiBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK3Nob3dydWxlcihhbHdheXMpCisgICAgaW50CSAgICBhbHdheXM7Cit7CisgICAgaWYgKCFhbHdheXMgJiYgIXJlZHJhd2luZygpKQorCXJldHVybjsKKyNpZiBkZWZpbmVkKEZFQVRfU1RMX09QVCkgJiYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisgICAgaWYgKCpwX3N0bCAmJiBjdXJ3aW4tPndfc3RhdHVzX2hlaWdodCkKKwl3aW5fcmVkcl9jdXN0b20oY3Vyd2luLCBGQUxTRSk7CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwl3aW5fcmVkcl9ydWxlcihjdXJ3aW4sIGFsd2F5cyk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVElUTEUKKyAgICBpZiAobmVlZF9tYWtldGl0bGUKKyMgaWZkZWYgRkVBVF9TVExfT1BUCisJICAgIHx8IChwX2ljb24gJiYgKHN0bF9zeW50YXggJiBTVExfSU5fSUNPTikpCisJICAgIHx8IChwX3RpdGxlICYmIChzdGxfc3ludGF4ICYgU1RMX0lOX1RJVExFKSkKKyMgZW5kaWYKKyAgICAgICApCisJbWFrZXRpdGxlKCk7CisjZW5kaWYKK30KKworI2lmZGVmIEZFQVRfQ01ETF9JTkZPCisgICAgc3RhdGljIHZvaWQKK3dpbl9yZWRyX3J1bGVyKHdwLCBhbHdheXMpCisgICAgd2luX1QJKndwOworICAgIGludAkJYWx3YXlzOworeworICAgIGNoYXJfdQlidWZmZXJbNzBdOworICAgIGludAkJcm93OworICAgIGludAkJZmlsbGNoYXI7CisgICAgaW50CQlhdHRyOworICAgIGludAkJZW1wdHlfbGluZSA9IEZBTFNFOworICAgIGNvbG5yX1QJdmlydGNvbDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlvOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaW50CQl0aGlzX3J1X2NvbDsKKyAgICBpbnQJCW9mZiA9IDA7CisgICAgaW50CQl3aWR0aCA9IENvbHVtbnM7CisjIGRlZmluZSBXSVRIX09GRih4KSB4CisjIGRlZmluZSBXSVRIX1dJRFRIKHgpIHgKKyNlbHNlCisjIGRlZmluZSBXSVRIX09GRih4KSAwCisjIGRlZmluZSBXSVRIX1dJRFRIKHgpIENvbHVtbnMKKyMgZGVmaW5lIHRoaXNfcnVfY29sIHJ1X2NvbAorI2VuZGlmCisKKyAgICAvKiBJZiAncnVsZXInIG9mZiBvciByZWRyYXdpbmcgZGlzYWJsZWQsIGRvbid0IGRvIGFueXRoaW5nICovCisgICAgaWYgKCFwX3J1KQorCXJldHVybjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgY3Vyc29yLmxudW0gaXMgdmFsaWQsIHNpbmNlIHdpbl9yZWRyX3J1bGVyKCkgbWF5IGJlIGNhbGxlZAorICAgICAqIGFmdGVyIGRlbGV0aW5nIGxpbmVzLCBiZWZvcmUgY3Vyc29yLmxudW0gaXMgY29ycmVjdGVkLgorICAgICAqLworICAgIGlmICh3cC0+d19jdXJzb3IubG51bSA+IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50KQorCXJldHVybjsKKworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIC8qIERvbid0IGRyYXcgdGhlIHJ1bGVyIHdoaWxlIGRvaW5nIGluc2VydC1jb21wbGV0aW9uLCBpdCBtaWdodCBvdmVyd3JpdGUKKyAgICAgKiB0aGUgKGxvbmcpIG1vZGUgbWVzc2FnZS4gKi8KKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaWYgKHdwID09IGxhc3R3aW4gJiYgbGFzdHdpbi0+d19zdGF0dXNfaGVpZ2h0ID09IDApCisjIGVuZGlmCisJaWYgKGVkaXRfc3VibW9kZSAhPSBOVUxMKQorCSAgICByZXR1cm47CisjZW5kaWYKKworI2lmZGVmIEZFQVRfU1RMX09QVAorICAgIGlmICgqcF9ydWYpCisgICAgeworCXdpbl9yZWRyX2N1c3RvbSh3cCwgVFJVRSk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBub3QgaW4gSW5zZXJ0IG1vZGUgYW5kIHRoZSBsaW5lIGlzIGVtcHR5ICh3aWxsIHNob3cgIjAtMSIpLgorICAgICAqLworICAgIGlmICghKFN0YXRlICYgSU5TRVJUKQorCQkmJiAqbWxfZ2V0X2J1Zih3cC0+d19idWZmZXIsIHdwLT53X2N1cnNvci5sbnVtLCBGQUxTRSkgPT0gTlVMKQorCWVtcHR5X2xpbmUgPSBUUlVFOworCisgICAgLyoKKyAgICAgKiBPbmx5IGRyYXcgdGhlIHJ1bGVyIHdoZW4gc29tZXRoaW5nIGNoYW5nZWQuCisgICAgICovCisgICAgdmFsaWRhdGVfdmlydGNvbF93aW4od3ApOworICAgIGlmICggICAgICAgcmVkcmF3X2NtZGxpbmUKKwkgICAgfHwgYWx3YXlzCisJICAgIHx8IHdwLT53X2N1cnNvci5sbnVtICE9IHdwLT53X3J1X2N1cnNvci5sbnVtCisJICAgIHx8IHdwLT53X2N1cnNvci5jb2wgIT0gd3AtPndfcnVfY3Vyc29yLmNvbAorCSAgICB8fCB3cC0+d192aXJ0Y29sICE9IHdwLT53X3J1X3ZpcnRjb2wKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJICAgIHx8IHdwLT53X2N1cnNvci5jb2xhZGQgIT0gd3AtPndfcnVfY3Vyc29yLmNvbGFkZAorI2VuZGlmCisJICAgIHx8IHdwLT53X3RvcGxpbmUgIT0gd3AtPndfcnVfdG9wbGluZQorCSAgICB8fCB3cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCAhPSB3cC0+d19ydV9saW5lX2NvdW50CisjaWZkZWYgRkVBVF9ESUZGCisJICAgIHx8IHdwLT53X3RvcGZpbGwgIT0gd3AtPndfcnVfdG9wZmlsbAorI2VuZGlmCisJICAgIHx8IGVtcHR5X2xpbmUgIT0gd3AtPndfcnVfZW1wdHkpCisgICAgeworCWN1cnNvcl9vZmYoKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAod3AtPndfc3RhdHVzX2hlaWdodCkKKwl7CisJICAgIHJvdyA9IFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodDsKKwkgICAgZmlsbGNoYXIgPSBmaWxsY2hhcl9zdGF0dXMoJmF0dHIsIHdwID09IGN1cndpbik7CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIG9mZiA9IFdfV0lOQ09MKHdwKTsKKwkgICAgd2lkdGggPSBXX1dJRFRIKHdwKTsKKyMgZW5kaWYKKwl9CisJZWxzZQorI2VuZGlmCisJeworCSAgICByb3cgPSBSb3dzIC0gMTsKKwkgICAgZmlsbGNoYXIgPSAnICc7CisJICAgIGF0dHIgPSAwOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIHdpZHRoID0gQ29sdW1uczsKKwkgICAgb2ZmID0gMDsKKyNlbmRpZgorCX0KKworCS8qIEluIGxpc3QgbW9kZSB2aXJ0Y29sIG5lZWRzIHRvIGJlIHJlY29tcHV0ZWQgKi8KKwl2aXJ0Y29sID0gd3AtPndfdmlydGNvbDsKKwlpZiAod3AtPndfcF9saXN0ICYmIGxjc190YWIxID09IE5VTCkKKwl7CisJICAgIHdwLT53X3BfbGlzdCA9IEZBTFNFOworCSAgICBnZXR2dmNvbCh3cCwgJndwLT53X2N1cnNvciwgTlVMTCwgJnZpcnRjb2wsIE5VTEwpOworCSAgICB3cC0+d19wX2xpc3QgPSBUUlVFOworCX0KKworCS8qCisJICogU29tZSBzcHJpbnRmcyByZXR1cm4gdGhlIGxlbmd0aCwgc29tZSByZXR1cm4gYSBwb2ludGVyLgorCSAqIFRvIGF2b2lkIHBvcnRhYmlsaXR5IHByb2JsZW1zIHdlIHVzZSBzdHJsZW4oKSBoZXJlLgorCSAqLworCXNwcmludGYoKGNoYXIgKilidWZmZXIsICIlbGQsIiwKKwkJKHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKQorCQkgICAgPyAwTAorCQkgICAgOiAobG9uZykod3AtPndfY3Vyc29yLmxudW0pKTsKKwljb2xfcHJpbnQoYnVmZmVyICsgU1RSTEVOKGJ1ZmZlciksCisJCQllbXB0eV9saW5lID8gMCA6IChpbnQpd3AtPndfY3Vyc29yLmNvbCArIDEsCisJCQkoaW50KXZpcnRjb2wgKyAxKTsKKworCS8qCisJICogQWRkIGEgIjUwJSIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuCisJICogT24gdGhlIGxhc3QgbGluZSwgZG9uJ3QgcHJpbnQgaW4gdGhlIGxhc3QgY29sdW1uIChzY3JvbGxzIHRoZQorCSAqIHNjcmVlbiB1cCBvbiBzb21lIHRlcm1pbmFscykuCisJICovCisJaSA9IChpbnQpU1RSTEVOKGJ1ZmZlcik7CisJZ2V0X3JlbF9wb3Mod3AsIGJ1ZmZlciArIGkgKyAxKTsKKwlvID0gaSArIHZpbV9zdHJzaXplKGJ1ZmZlciArIGkgKyAxKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAod3AtPndfc3RhdHVzX2hlaWdodCA9PSAwKQkvKiBjYW4ndCB1c2UgbGFzdCBjaGFyIG9mIHNjcmVlbiAqLworI2VuZGlmCisJICAgICsrbzsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCXRoaXNfcnVfY29sID0gcnVfY29sIC0gKENvbHVtbnMgLSB3aWR0aCk7CisJaWYgKHRoaXNfcnVfY29sIDwgMCkKKwkgICAgdGhpc19ydV9jb2wgPSAwOworI2VuZGlmCisJLyogTmV2ZXIgdXNlIG1vcmUgdGhhbiBoYWxmIHRoZSB3aW5kb3cvc2NyZWVuIHdpZHRoLCBsZWF2ZSB0aGUgb3RoZXIKKwkgKiBoYWxmIGZvciB0aGUgZmlsZW5hbWUuICovCisJaWYgKHRoaXNfcnVfY29sIDwgKFdJVEhfV0lEVEgod2lkdGgpICsgMSkgLyAyKQorCSAgICB0aGlzX3J1X2NvbCA9IChXSVRIX1dJRFRIKHdpZHRoKSArIDEpIC8gMjsKKwlpZiAodGhpc19ydV9jb2wgKyBvIDwgV0lUSF9XSURUSCh3aWR0aCkpCisJeworCSAgICB3aGlsZSAodGhpc19ydV9jb2wgKyBvIDwgV0lUSF9XSURUSCh3aWR0aCkpCisJICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChoYXNfbWJ5dGUpCisJCSAgICBpICs9ICgqbWJfY2hhcjJieXRlcykoZmlsbGNoYXIsIGJ1ZmZlciArIGkpOworCQllbHNlCisjZW5kaWYKKwkJICAgIGJ1ZmZlcltpKytdID0gZmlsbGNoYXI7CisJCSsrbzsKKwkgICAgfQorCSAgICBnZXRfcmVsX3Bvcyh3cCwgYnVmZmVyICsgaSk7CisJfQorCS8qIFRydW5jYXRlIGF0IHdpbmRvdyBib3VuZGFyeS4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIG8gPSAwOworCSAgICBmb3IgKGkgPSAwOyBidWZmZXJbaV0gIT0gTlVMOyBpICs9ICgqbWJfcHRyMmxlbl9jaGVjaykoYnVmZmVyICsgaSkpCisJICAgIHsKKwkJbyArPSAoKm1iX3B0cjJjZWxscykoYnVmZmVyICsgaSk7CisJCWlmICh0aGlzX3J1X2NvbCArIG8gPiBXSVRIX1dJRFRIKHdpZHRoKSkKKwkJeworCQkgICAgYnVmZmVyW2ldID0gTlVMOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwlpZiAodGhpc19ydV9jb2wgKyAoaW50KVNUUkxFTihidWZmZXIpID4gV0lUSF9XSURUSCh3aWR0aCkpCisJICAgIGJ1ZmZlcltXSVRIX1dJRFRIKHdpZHRoKSAtIHRoaXNfcnVfY29sXSA9IE5VTDsKKworCXNjcmVlbl9wdXRzKGJ1ZmZlciwgcm93LCB0aGlzX3J1X2NvbCArIFdJVEhfT0ZGKG9mZiksIGF0dHIpOworCWkgPSByZWRyYXdfY21kbGluZTsKKwlzY3JlZW5fZmlsbChyb3csIHJvdyArIDEsCisJCXRoaXNfcnVfY29sICsgV0lUSF9PRkYob2ZmKSArIChpbnQpU1RSTEVOKGJ1ZmZlciksCisJCShpbnQpKFdJVEhfT0ZGKG9mZikgKyBXSVRIX1dJRFRIKHdpZHRoKSksCisJCWZpbGxjaGFyLCBmaWxsY2hhciwgYXR0cik7CisJLyogZG9uJ3QgcmVkcmF3IHRoZSBjbWRsaW5lIGJlY2F1c2Ugb2Ygc2hvd2luZyB0aGUgcnVsZXIgKi8KKwlyZWRyYXdfY21kbGluZSA9IGk7CisJd3AtPndfcnVfY3Vyc29yID0gd3AtPndfY3Vyc29yOworCXdwLT53X3J1X3ZpcnRjb2wgPSB3cC0+d192aXJ0Y29sOworCXdwLT53X3J1X2VtcHR5ID0gZW1wdHlfbGluZTsKKwl3cC0+d19ydV90b3BsaW5lID0gd3AtPndfdG9wbGluZTsKKwl3cC0+d19ydV9saW5lX2NvdW50ID0gd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQ7CisjaWZkZWYgRkVBVF9ESUZGCisJd3AtPndfcnVfdG9wZmlsbCA9IHdwLT53X3RvcGZpbGw7CisjZW5kaWYKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zZWFyY2guYyBiL3NyYy9zZWFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjRmOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NlYXJjaC5jCkBAIC0wLDAgKzEsNDQ4NyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqIHNlYXJjaC5jOiBjb2RlIGZvciBub3JtYWwgbW9kZSBzZWFyY2hpbmcgY29tbWFuZHMKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKK3N0YXRpYyB2b2lkIHNhdmVfcmVfcGF0IF9fQVJHUygoaW50IGlkeCwgY2hhcl91ICpwYXQsIGludCBtYWdpYykpOworI2lmZGVmIEZFQVRfRVZBTAorc3RhdGljIGludCBmaXJzdF9zdWJtYXRjaCBfX0FSR1MoKHJlZ21tYXRjaF9UICpycCkpOworI2VuZGlmCitzdGF0aWMgaW50IGNoZWNrX3ByZXZjb2wgX19BUkdTKChjaGFyX3UgKmxpbmVwLCBpbnQgY29sLCBpbnQgY2gsIGludCAqcHJldmNvbCkpOworc3RhdGljIGludCBpbm1hY3JvIF9fQVJHUygoY2hhcl91ICosIGNoYXJfdSAqKSk7CitzdGF0aWMgaW50IGNoZWNrX2xpbmVjb21tZW50IF9fQVJHUygoY2hhcl91ICpsaW5lKSk7CitzdGF0aWMgaW50IGNscyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgc2tpcF9jaGFycyBfX0FSR1MoKGludCwgaW50KSk7CisjaWZkZWYgRkVBVF9URVhUT0JKCitzdGF0aWMgdm9pZCBiYWNrX2luX2xpbmUgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBmaW5kX2ZpcnN0X2JsYW5rIF9fQVJHUygocG9zX1QgKikpOworc3RhdGljIHZvaWQgZmluZHNlbnRfZm9yd2FyZCBfX0FSR1MoKGxvbmcgY291bnQsIGludCBhdF9zdGFydF9zZW50KSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZJTkRfSUQKK3N0YXRpYyB2b2lkIHNob3dfcGF0X2luX3BhdGggX19BUkdTKChjaGFyX3UgKiwgaW50LAorCQkJCQkgaW50LCBpbnQsIEZJTEUgKiwgbGluZW5yX1QgKiwgbG9uZykpOworI2VuZGlmCisjaWZkZWYgRkVBVF9WSU1JTkZPCitzdGF0aWMgdm9pZCB3dnNwX29uZSBfX0FSR1MoKEZJTEUgKmZwLCBpbnQgaWR4LCBjaGFyICpzLCBpbnQgc2MpKTsKKyNlbmRpZgorCitzdGF0aWMgY2hhcl91ICp0b3BfYm90X21zZyA9IChjaGFyX3UgKilOXygic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIik7CitzdGF0aWMgY2hhcl91ICpib3RfdG9wX21zZyA9IChjaGFyX3UgKilOXygic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIik7CisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyBzZWFyY2hpbmctcmVsYXRlZCByb3V0aW5lcy4gVGhlc2UgZmFsbCBpbnRvCisgKiB0aHJlZSBncm91cHM6CisgKiAxLiBzdHJpbmcgc2VhcmNoZXMgKGZvciAvLCA/LCBuLCBhbmQgTikKKyAqIDIuIGNoYXJhY3RlciBzZWFyY2hlcyB3aXRoaW4gYSBzaW5nbGUgbGluZSAoZm9yIGYsIEYsIHQsIFQsIGV0YykKKyAqIDMuICJvdGhlciIga2luZHMgb2Ygc2VhcmNoZXMgbGlrZSB0aGUgJyUnIGNvbW1hbmQsIGFuZCAnd29yZCcgc2VhcmNoZXMuCisgKi8KKworLyoKKyAqIFN0cmluZyBzZWFyY2hlcworICoKKyAqIFRoZSBzdHJpbmcgc2VhcmNoIGZ1bmN0aW9ucyBhcmUgZGl2aWRlZCBpbnRvIHR3byBsZXZlbHM6CisgKiBsb3dlc3Q6ICBzZWFyY2hpdCgpOyB1c2VzIGFuIHBvc19UIGZvciBzdGFydGluZyBwb3NpdGlvbiBhbmQgZm91bmQgbWF0Y2guCisgKiBIaWdoZXN0OiBkb19zZWFyY2goKTsgdXNlcyBjdXJ3aW4tPndfY3Vyc29yOyBjYWxscyBzZWFyY2hpdCgpLgorICoKKyAqIFRoZSBsYXN0IHNlYXJjaCBwYXR0ZXJuIGlzIHJlbWVtYmVyZWQgZm9yIHJlcGVhdGluZyB0aGUgc2FtZSBzZWFyY2guCisgKiBUaGlzIHBhdHRlcm4gaXMgc2hhcmVkIGJldHdlZW4gdGhlIDpnLCA6cywgPyBhbmQgLyBjb21tYW5kcy4KKyAqIFRoaXMgaXMgaW4gc2VhcmNoX3JlZ2NvbXAoKS4KKyAqCisgKiBUaGUgYWN0dWFsIHN0cmluZyBtYXRjaGluZyBpcyBkb25lIHVzaW5nIGEgaGVhdmlseSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgKiBIZW5yeSBTcGVuY2VyJ3MgcmVndWxhciBleHByZXNzaW9uIGxpYnJhcnkuICBTZWUgcmVnZXhwLmMuCisgKi8KKworLyogVGhlIG9mZnNldCBmb3IgYSBzZWFyY2ggY29tbWFuZCBpcyBzdG9yZSBpbiBhIHNvZmYgc3RydWN0ICovCisvKiBOb3RlOiBvbmx5IHNwYXRzWzBdLm9mZiBpcyByZWFsbHkgdXNlZCAqLworc3RydWN0IHNvZmZzZXQKK3sKKyAgICBpbnQJCWRpcjsJCS8qIHNlYXJjaCBkaXJlY3Rpb24gKi8KKyAgICBpbnQJCWxpbmU7CQkvKiBzZWFyY2ggaGFzIGxpbmUgb2Zmc2V0ICovCisgICAgaW50CQllbmQ7CQkvKiBzZWFyY2ggc2V0IGN1cnNvciBhdCBlbmQgKi8KKyAgICBsb25nCW9mZjsJCS8qIGxpbmUgb3IgY2hhciBvZmZzZXQgKi8KK307CisKKy8qIEEgc2VhcmNoIHBhdHRlcm4gYW5kIGl0cyBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gYSBzcGF0IHN0cnVjdCAqLworc3RydWN0IHNwYXQKK3sKKyAgICBjaGFyX3UJICAgICpwYXQ7CS8qIHRoZSBwYXR0ZXJuIChpbiBhbGxvY2F0ZWQgbWVtb3J5KSBvciBOVUxMICovCisgICAgaW50CQkgICAgbWFnaWM7CS8qIG1hZ2ljbmVzcyBvZiB0aGUgcGF0dGVybiAqLworICAgIGludAkJICAgIG5vX3NjczsJLyogbm8gc21hcmNhc2UgZm9yIHRoaXMgcGF0dGVybiAqLworICAgIHN0cnVjdCBzb2Zmc2V0ICBvZmY7Cit9OworCisvKgorICogVHdvIHNlYXJjaCBwYXR0ZXJucyBhcmUgcmVtZW1iZXJlZDogT25lIGZvciB0aGUgOnN1YnN0aXR1dGUgY29tbWFuZCBhbmQKKyAqIG9uZSBmb3Igb3RoZXIgc2VhcmNoZXMuICBsYXN0X2lkeCBwb2ludHMgdG8gdGhlIG9uZSB0aGF0IHdhcyB1c2VkIHRoZSBsYXN0CisgKiB0aW1lLgorICovCitzdGF0aWMgc3RydWN0IHNwYXQgc3BhdHNbMl0gPQoreworICAgIHtOVUxMLCBUUlVFLCBGQUxTRSwgeycvJywgMCwgMCwgMEx9fSwJLyogbGFzdCB1c2VkIHNlYXJjaCBwYXQgKi8KKyAgICB7TlVMTCwgVFJVRSwgRkFMU0UsIHsnLycsIDAsIDAsIDBMfX0JLyogbGFzdCB1c2VkIHN1YnN0aXR1dGUgcGF0ICovCit9OworCitzdGF0aWMgaW50IGxhc3RfaWR4ID0gMDsJLyogaW5kZXggaW4gc3BhdHNbXSBmb3IgUkVfTEFTVCAqLworCisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpIHx8IGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyogY29weSBvZiBzcGF0c1tdLCBmb3Iga2VlcGluZyB0aGUgc2VhcmNoIHBhdHRlcm5zIHdoaWxlIGV4ZWN1dGluZyBhdXRvY21kcyAqLworc3RhdGljIHN0cnVjdCBzcGF0ICBzYXZlZF9zcGF0c1syXTsKK3N0YXRpYyBpbnQJICAgIHNhdmVkX2xhc3RfaWR4ID0gMDsKKyMgaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKK3N0YXRpYyBpbnQJICAgIHNhdmVkX25vX2hsc2VhcmNoID0gMDsKKyMgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgY2hhcl91CSAgICAqbXJfcGF0dGVybiA9IE5VTEw7CS8qIHBhdHRlcm4gdXNlZCBieSBzZWFyY2hfcmVnY29tcCgpICovCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKK3N0YXRpYyBpbnQJICAgIG1yX3BhdHRlcm5fYWxsb2NlZCA9IEZBTFNFOyAvKiBtcl9wYXR0ZXJuIHdhcyBhbGxvY2F0ZWQgKi8KK3N0YXRpYyBjaGFyX3UJICAgICpyZXZlcnNlX3RleHQgX19BUkdTKChjaGFyX3UgKnMpKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9GSU5EX0lECisvKgorICogVHlwZSB1c2VkIGJ5IGZpbmRfcGF0dGVybl9pbl9wYXRoKCkgdG8gcmVtZW1iZXIgd2hpY2ggaW5jbHVkZWQgZmlsZXMgaGF2ZQorICogYmVlbiBzZWFyY2hlZCBhbHJlYWR5LgorICovCit0eXBlZGVmIHN0cnVjdCBTZWFyY2hlZEZpbGUKK3sKKyAgICBGSUxFCSpmcDsJCS8qIEZpbGUgcG9pbnRlciAqLworICAgIGNoYXJfdQkqbmFtZTsJCS8qIEZ1bGwgbmFtZSBvZiBmaWxlICovCisgICAgbGluZW5yX1QJbG51bTsJCS8qIExpbmUgd2Ugd2VyZSB1cCB0byBpbiBmaWxlICovCisgICAgaW50CQltYXRjaGVkOwkvKiBGb3VuZCBhIG1hdGNoIGluIHRoaXMgZmlsZSAqLworfSBTZWFyY2hlZEZpbGU7CisjZW5kaWYKKworLyoKKyAqIHRyYW5zbGF0ZSBzZWFyY2ggcGF0dGVybiBmb3IgdmltX3JlZ2NvbXAoKQorICoKKyAqIHBhdF9zYXZlID09IFJFX1NFQVJDSDogc2F2ZSBwYXQgaW4gc3BhdHNbUkVfU0VBUkNIXS5wYXQgKG5vcm1hbCBzZWFyY2ggY21kKQorICogcGF0X3NhdmUgPT0gUkVfU1VCU1Q6IHNhdmUgcGF0IGluIHNwYXRzW1JFX1NVQlNUXS5wYXQgKDpzdWJzdGl0dXRlIGNvbW1hbmQpCisgKiBwYXRfc2F2ZSA9PSBSRV9CT1RIOiBzYXZlIHBhdCBpbiBib3RoIHBhdHRlcm5zICg6Z2xvYmFsIGNvbW1hbmQpCisgKiBwYXRfdXNlICA9PSBSRV9TRUFSQ0g6IHVzZSBwcmV2aW91cyBzZWFyY2ggcGF0dGVybiBpZiAicGF0IiBpcyBOVUxMCisgKiBwYXRfdXNlICA9PSBSRV9TVUJTVDogdXNlIHByZXZpb3VzIHN1c3RpdHV0ZSBwYXR0ZXJuIGlmICJwYXQiIGlzIE5VTEwKKyAqIHBhdF91c2UgID09IFJFX0xBU1Q6IHVzZSBsYXN0IHVzZWQgcGF0dGVybiBpZiAicGF0IiBpcyBOVUxMCisgKiBvcHRpb25zICYgU0VBUkNIX0hJUzogcHV0IHNlYXJjaCBzdHJpbmcgaW4gaGlzdG9yeQorICogb3B0aW9ucyAmIFNFQVJDSF9LRUVQOiBrZWVwIHByZXZpb3VzIHNlYXJjaCBwYXR0ZXJuCisgKgorICogcmV0dXJucyBGQUlMIGlmIGZhaWxlZCwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgaW50CitzZWFyY2hfcmVnY29tcChwYXQsIHBhdF9zYXZlLCBwYXRfdXNlLCBvcHRpb25zLCByZWdtYXRjaCkKKyAgICBjaGFyX3UJKnBhdDsKKyAgICBpbnQJCXBhdF9zYXZlOworICAgIGludAkJcGF0X3VzZTsKKyAgICBpbnQJCW9wdGlvbnM7CisgICAgcmVnbW1hdGNoX1QJKnJlZ21hdGNoOwkvKiByZXR1cm46IHBhdHRlcm4gYW5kIGlnbm9yZS1jYXNlIGZsYWcgKi8KK3sKKyAgICBpbnQJCW1hZ2ljOworICAgIGludAkJaTsKKworICAgIHJjX2RpZF9lbXNnID0gRkFMU0U7CisgICAgbWFnaWMgPSBwX21hZ2ljOworCisgICAgLyoKKyAgICAgKiBJZiBubyBwYXR0ZXJuIGdpdmVuLCB1c2UgYSBwcmV2aW91c2x5IGRlZmluZWQgcGF0dGVybi4KKyAgICAgKi8KKyAgICBpZiAocGF0ID09IE5VTEwgfHwgKnBhdCA9PSBOVUwpCisgICAgeworCWlmIChwYXRfdXNlID09IFJFX0xBU1QpCisJICAgIGkgPSBsYXN0X2lkeDsKKwllbHNlCisJICAgIGkgPSBwYXRfdXNlOworCWlmIChzcGF0c1tpXS5wYXQgPT0gTlVMTCkJLyogcGF0dGVybiB3YXMgbmV2ZXIgZGVmaW5lZCAqLworCXsKKwkgICAgaWYgKHBhdF91c2UgPT0gUkVfU1VCU1QpCisJCUVNU0coXyhlX25vcHJlc3ViKSk7CisJICAgIGVsc2UKKwkJRU1TRyhfKGVfbm9wcmV2cmUpKTsKKwkgICAgcmNfZGlkX2Vtc2cgPSBUUlVFOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisJcGF0ID0gc3BhdHNbaV0ucGF0OworCW1hZ2ljID0gc3BhdHNbaV0ubWFnaWM7CisJbm9fc21hcnRjYXNlID0gc3BhdHNbaV0ubm9fc2NzOworICAgIH0KKyNpZmRlZiBGRUFUX0NNREhJU1QKKyAgICBlbHNlIGlmIChvcHRpb25zICYgU0VBUkNIX0hJUykJLyogcHV0IG5ldyBwYXR0ZXJuIGluIGhpc3RvcnkgKi8KKwlhZGRfdG9faGlzdG9yeShISVNUX1NFQVJDSCwgcGF0LCBUUlVFLCBOVUwpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGlmIChtcl9wYXR0ZXJuX2FsbG9jZWQpCisgICAgeworCXZpbV9mcmVlKG1yX3BhdHRlcm4pOworCW1yX3BhdHRlcm5fYWxsb2NlZCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChjdXJ3aW4tPndfcF9ybCAmJiAqY3Vyd2luLT53X3BfcmxjID09ICdzJykKKyAgICB7CisJY2hhcl91ICpyZXZfcGF0dGVybjsKKworCXJldl9wYXR0ZXJuID0gcmV2ZXJzZV90ZXh0KHBhdCk7CisJaWYgKHJldl9wYXR0ZXJuID09IE5VTEwpCisJICAgIG1yX3BhdHRlcm4gPSBwYXQ7CSAgICAvKiBvdXQgb2YgbWVtb3J5LCBrZWVwIG5vcm1hbCBwYXR0ZXJuLiAqLworCWVsc2UKKwl7CisJICAgIG1yX3BhdHRlcm4gPSByZXZfcGF0dGVybjsKKwkgICAgbXJfcGF0dGVybl9hbGxvY2VkID0gVFJVRTsKKwl9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorCW1yX3BhdHRlcm4gPSBwYXQ7CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGN1cnJlbnRseSB1c2VkIHBhdHRlcm4gaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlLAorICAgICAqIHVubGVzcyB0aGUgcGF0dGVybiBzaG91bGQgbm90IGJlIHJlbWVtYmVyZWQuCisgICAgICovCisgICAgaWYgKCEob3B0aW9ucyAmIFNFQVJDSF9LRUVQKSkKKyAgICB7CisJLyogc2VhcmNoIG9yIGdsb2JhbCBjb21tYW5kICovCisJaWYgKHBhdF9zYXZlID09IFJFX1NFQVJDSCB8fCBwYXRfc2F2ZSA9PSBSRV9CT1RIKQorCSAgICBzYXZlX3JlX3BhdChSRV9TRUFSQ0gsIHBhdCwgbWFnaWMpOworCS8qIHN1YnN0aXR1dGUgb3IgZ2xvYmFsIGNvbW1hbmQgKi8KKwlpZiAocGF0X3NhdmUgPT0gUkVfU1VCU1QgfHwgcGF0X3NhdmUgPT0gUkVfQk9USCkKKwkgICAgc2F2ZV9yZV9wYXQoUkVfU1VCU1QsIHBhdCwgbWFnaWMpOworICAgIH0KKworICAgIHJlZ21hdGNoLT5ybW1faWMgPSBpZ25vcmVjYXNlKHBhdCk7CisgICAgcmVnbWF0Y2gtPnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIG1hZ2ljID8gUkVfTUFHSUMgOiAwKTsKKyAgICBpZiAocmVnbWF0Y2gtPnJlZ3Byb2cgPT0gTlVMTCkKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBHZXQgc2VhcmNoIHBhdHRlcm4gdXNlZCBieSBzZWFyY2hfcmVnY29tcCgpLgorICovCisgICAgY2hhcl91ICoKK2dldF9zZWFyY2hfcGF0KCkKK3sKKyAgICByZXR1cm4gbXJfcGF0dGVybjsKK30KKworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisvKgorICogUmV2ZXJzZSB0ZXh0IGludG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFJldHVybnMgdGhlIGFsbG9jYXRlZCBzdHJpbmcsIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZXZlcnNlX3RleHQocykKKyAgICBjaGFyX3UgKnM7Cit7CisgICAgdW5zaWduZWQJbGVuOworICAgIHVuc2lnbmVkCXNfaSwgcmV2X2k7CisgICAgY2hhcl91CSpyZXY7CisKKyAgICAvKgorICAgICAqIFJldmVyc2UgdGhlIHBhdHRlcm4uCisgICAgICovCisgICAgbGVuID0gKHVuc2lnbmVkKVNUUkxFTihzKTsKKyAgICByZXYgPSBhbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAocmV2ICE9IE5VTEwpCisgICAgeworCXJldl9pID0gbGVuOworCWZvciAoc19pID0gMDsgc19pIDwgbGVuOyArK3NfaSkKKwl7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQlpbnQJbWJfbGVuOworCisJCW1iX2xlbiA9ICgqbWJfcHRyMmxlbl9jaGVjaykocyArIHNfaSk7CisJCXJldl9pIC09IG1iX2xlbjsKKwkJbWNoX21lbW1vdmUocmV2ICsgcmV2X2ksIHMgKyBzX2ksIG1iX2xlbik7CisJCXNfaSArPSBtYl9sZW4gLSAxOworCSAgICB9CisJICAgIGVsc2UKKyMgZW5kaWYKKwkJcmV2Wy0tcmV2X2ldID0gc1tzX2ldOworCisJfQorCXJldltsZW5dID0gTlVMOworICAgIH0KKyAgICByZXR1cm4gcmV2OworfQorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAorc2F2ZV9yZV9wYXQoaWR4LCBwYXQsIG1hZ2ljKQorICAgIGludAkJaWR4OworICAgIGNoYXJfdQkqcGF0OworICAgIGludAkJbWFnaWM7Cit7CisgICAgaWYgKHNwYXRzW2lkeF0ucGF0ICE9IHBhdCkKKyAgICB7CisJdmltX2ZyZWUoc3BhdHNbaWR4XS5wYXQpOworCXNwYXRzW2lkeF0ucGF0ID0gdmltX3N0cnNhdmUocGF0KTsKKwlzcGF0c1tpZHhdLm1hZ2ljID0gbWFnaWM7CisJc3BhdHNbaWR4XS5ub19zY3MgPSBub19zbWFydGNhc2U7CisJbGFzdF9pZHggPSBpZHg7CisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKwkvKiBJZiAnaGxzZWFyY2gnIHNldCBhbmQgc2VhcmNoIHBhdCBjaGFuZ2VkOiBuZWVkIHJlZHJhdy4gKi8KKwlpZiAocF9obHMpCisJICAgIHJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKKwlub19obHNlYXJjaCA9IEZBTFNFOworI2VuZGlmCisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX0FVVE9DTUQpIHx8IGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNhdmUgdGhlIHNlYXJjaCBwYXR0ZXJucywgc28gdGhleSBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuCisgKiBVc2VkIGJlZm9yZS9hZnRlciBleGVjdXRpbmcgYXV0b2NvbW1hbmRzIGFuZCB1c2VyIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBzYXZlX2xldmVsID0gMDsKKworICAgIHZvaWQKK3NhdmVfc2VhcmNoX3BhdHRlcm5zKCkKK3sKKyAgICBpZiAoc2F2ZV9sZXZlbCsrID09IDApCisgICAgeworCXNhdmVkX3NwYXRzWzBdID0gc3BhdHNbMF07CisJaWYgKHNwYXRzWzBdLnBhdCAhPSBOVUxMKQorCSAgICBzYXZlZF9zcGF0c1swXS5wYXQgPSB2aW1fc3Ryc2F2ZShzcGF0c1swXS5wYXQpOworCXNhdmVkX3NwYXRzWzFdID0gc3BhdHNbMV07CisJaWYgKHNwYXRzWzFdLnBhdCAhPSBOVUxMKQorCSAgICBzYXZlZF9zcGF0c1sxXS5wYXQgPSB2aW1fc3Ryc2F2ZShzcGF0c1sxXS5wYXQpOworCXNhdmVkX2xhc3RfaWR4ID0gbGFzdF9pZHg7CisjIGlmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJc2F2ZWRfbm9faGxzZWFyY2ggPSBub19obHNlYXJjaDsKKyMgZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCityZXN0b3JlX3NlYXJjaF9wYXR0ZXJucygpCit7CisgICAgaWYgKC0tc2F2ZV9sZXZlbCA9PSAwKQorICAgIHsKKwl2aW1fZnJlZShzcGF0c1swXS5wYXQpOworCXNwYXRzWzBdID0gc2F2ZWRfc3BhdHNbMF07CisJdmltX2ZyZWUoc3BhdHNbMV0ucGF0KTsKKwlzcGF0c1sxXSA9IHNhdmVkX3NwYXRzWzFdOworCWxhc3RfaWR4ID0gc2F2ZWRfbGFzdF9pZHg7CisjIGlmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJbm9faGxzZWFyY2ggPSBzYXZlZF9ub19obHNlYXJjaDsKKyMgZW5kaWYKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gY2FzZSBzaG91bGQgYmUgaWdub3JlZCBmb3Igc2VhcmNoIHBhdHRlcm4gInBhdCIuCisgKiBVc2VzIHRoZSAnaWdub3JlY2FzZScgYW5kICdzbWFydGNhc2UnIG9wdGlvbnMuCisgKi8KKyAgICBpbnQKK2lnbm9yZWNhc2UocGF0KQorICAgIGNoYXJfdQkqcGF0OworeworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWljOworCisgICAgaWMgPSBwX2ljOworICAgIGlmIChpYyAmJiAhbm9fc21hcnRjYXNlICYmIHBfc2NzCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJCQkJJiYgIShjdHJsX3hfbW9kZSAmJiBjdXJidWYtPmJfcF9pbmYpCisjZW5kaWYKKwkJCQkJCQkJICAgICkKKyAgICB7CisJLyogZG9uJ3QgaWdub3JlIGNhc2UgaWYgcGF0dGVybiBoYXMgdXBwZXJjYXNlICovCisJZm9yIChwID0gcGF0OyAqcDsgKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGludAkJbDsKKworCSAgICBpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuX2NoZWNrKShwKSkgPiAxKQorCSAgICB7CisJCWlmIChlbmNfdXRmOCAmJiB1dGZfaXN1cHBlcih1dGZfcHRyMmNoYXIocCkpKQorCQl7CisJCSAgICBpYyA9IEZBTFNFOworCQkgICAgYnJlYWs7CisJCX0KKwkJcCArPSBsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQlpZiAoKnAgPT0gJ1xcJyAmJiBwWzFdICE9IE5VTCkJLyogc2tpcCAiXFMiIGV0IGFsLiAqLworCQkgICAgcCArPSAyOworCQllbHNlIGlmIChpc3VwcGVyKCpwKyspKQorCQl7CisJCSAgICBpYyA9IEZBTFNFOworCQkgICAgYnJlYWs7CisJCX0KKwl9CisgICAgfQorICAgIG5vX3NtYXJ0Y2FzZSA9IEZBTFNFOworCisgICAgcmV0dXJuIGljOworfQorCisgICAgY2hhcl91ICoKK2xhc3Rfc2VhcmNoX3BhdCgpCit7CisgICAgcmV0dXJuIHNwYXRzW2xhc3RfaWR4XS5wYXQ7Cit9CisKKy8qCisgKiBSZXNldCBzZWFyY2ggZGlyZWN0aW9uIHRvIGZvcndhcmQuICBGb3IgImdkIiBhbmQgImdEIiBjb21tYW5kcy4KKyAqLworICAgIHZvaWQKK3Jlc2V0X3NlYXJjaF9kaXIoKQoreworICAgIHNwYXRzWzBdLm9mZi5kaXIgPSAnLyc7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX1ZJTUlORk8pCisvKgorICogU2V0IHRoZSBsYXN0IHNlYXJjaCBwYXR0ZXJuLiAgRm9yICI6bGV0IEAvID0iIGFuZCB2aW1pbmZvLgorICogQWxzbyBzZXQgdGhlIHNhdmVkIHNlYXJjaCBwYXR0ZXJuLCBzbyB0aGF0IHRoaXMgd29ya3MgaW4gYW4gYXV0b2NvbW1hbmQuCisgKi8KKyAgICB2b2lkCitzZXRfbGFzdF9zZWFyY2hfcGF0KHMsIGlkeCwgbWFnaWMsIHNldGxhc3QpCisgICAgY2hhcl91CSpzOworICAgIGludAkJaWR4OworICAgIGludAkJbWFnaWM7CisgICAgaW50CQlzZXRsYXN0OworeworICAgIHZpbV9mcmVlKHNwYXRzW2lkeF0ucGF0KTsKKyAgICAvKiBBbiBlbXB0eSBzdHJpbmcgbWVhbnMgdGhhdCBub3RoaW5nIHNob3VsZCBiZSBtYXRjaGVkLiAqLworICAgIGlmICgqcyA9PSBOVUwpCisJc3BhdHNbaWR4XS5wYXQgPSBOVUxMOworICAgIGVsc2UKKwlzcGF0c1tpZHhdLnBhdCA9IHZpbV9zdHJzYXZlKHMpOworICAgIHNwYXRzW2lkeF0ubWFnaWMgPSBtYWdpYzsKKyAgICBzcGF0c1tpZHhdLm5vX3NjcyA9IEZBTFNFOworICAgIHNwYXRzW2lkeF0ub2ZmLmRpciA9ICcvJzsKKyAgICBzcGF0c1tpZHhdLm9mZi5saW5lID0gRkFMU0U7CisgICAgc3BhdHNbaWR4XS5vZmYuZW5kID0gRkFMU0U7CisgICAgc3BhdHNbaWR4XS5vZmYub2ZmID0gMDsKKyAgICBpZiAoc2V0bGFzdCkKKwlsYXN0X2lkeCA9IGlkeDsKKyAgICBpZiAoc2F2ZV9sZXZlbCkKKyAgICB7CisJdmltX2ZyZWUoc2F2ZWRfc3BhdHNbaWR4XS5wYXQpOworCXNhdmVkX3NwYXRzW2lkeF0gPSBzcGF0c1swXTsKKwlpZiAoc3BhdHNbaWR4XS5wYXQgPT0gTlVMTCkKKwkgICAgc2F2ZWRfc3BhdHNbaWR4XS5wYXQgPSBOVUxMOworCWVsc2UKKwkgICAgc2F2ZWRfc3BhdHNbaWR4XS5wYXQgPSB2aW1fc3Ryc2F2ZShzcGF0c1tpZHhdLnBhdCk7CisJc2F2ZWRfbGFzdF9pZHggPSBsYXN0X2lkeDsKKyAgICB9CisjIGlmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisgICAgLyogSWYgJ2hsc2VhcmNoJyBzZXQgYW5kIHNlYXJjaCBwYXQgY2hhbmdlZDogbmVlZCByZWRyYXcuICovCisgICAgaWYgKHBfaGxzICYmIGlkeCA9PSBsYXN0X2lkeCAmJiAhbm9faGxzZWFyY2gpCisJcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworIyBlbmRpZgorfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorLyoKKyAqIEdldCBhIHJlZ2V4cCBwcm9ncmFtIGZvciB0aGUgbGFzdCB1c2VkIHNlYXJjaCBwYXR0ZXJuLgorICogVGhpcyBpcyB1c2VkIGZvciBoaWdobGlnaHRpbmcgYWxsIG1hdGNoZXMgaW4gYSB3aW5kb3cuCisgKiBWYWx1ZXMgcmV0dXJuZWQgaW4gcmVnbWF0Y2gtPnJlZ3Byb2cgYW5kIHJlZ21hdGNoLT5ybW1faWMuCisgKi8KKyAgICB2b2lkCitsYXN0X3BhdF9wcm9nKHJlZ21hdGNoKQorICAgIHJlZ21tYXRjaF9UCSpyZWdtYXRjaDsKK3sKKyAgICBpZiAoc3BhdHNbbGFzdF9pZHhdLnBhdCA9PSBOVUxMKQorICAgIHsKKwlyZWdtYXRjaC0+cmVncHJvZyA9IE5VTEw7CisJcmV0dXJuOworICAgIH0KKyAgICArK2Vtc2dfb2ZmOwkJLyogU28gaXQgZG9lc24ndCBiZWVwIGlmIGJhZCBleHByICovCisgICAgKHZvaWQpc2VhcmNoX3JlZ2NvbXAoKGNoYXJfdSAqKSIiLCAwLCBsYXN0X2lkeCwgU0VBUkNIX0tFRVAsIHJlZ21hdGNoKTsKKyAgICAtLWVtc2dfb2ZmOworfQorI2VuZGlmCisKKy8qCisgKiBsb3dlc3QgbGV2ZWwgc2VhcmNoIGZ1bmN0aW9uLgorICogU2VhcmNoIGZvciAnY291bnQndGggb2NjdXJyZW5jZSBvZiBwYXR0ZXJuICdwYXQnIGluIGRpcmVjdGlvbiAnZGlyJy4KKyAqIFN0YXJ0IGF0IHBvc2l0aW9uICdwb3MnIGFuZCByZXR1cm4gdGhlIGZvdW5kIHBvc2l0aW9uIGluICdwb3MnLgorICoKKyAqIGlmIChvcHRpb25zICYgU0VBUkNIX01TRykgPT0gMCBkb24ndCBnaXZlIGFueSBtZXNzYWdlcworICogaWYgKG9wdGlvbnMgJiBTRUFSQ0hfTVNHKSA9PSBTRUFSQ0hfTkZNU0cgZG9uJ3QgZ2l2ZSAnbm90Zm91bmQnIG1lc3NhZ2VzCisgKiBpZiAob3B0aW9ucyAmIFNFQVJDSF9NU0cpID09IFNFQVJDSF9NU0cgZ2l2ZSBhbGwgbWVzc2FnZXMKKyAqIGlmIChvcHRpb25zICYgU0VBUkNIX0hJUykgcHV0IHNlYXJjaCBwYXR0ZXJuIGluIGhpc3RvcnkKKyAqIGlmIChvcHRpb25zICYgU0VBUkNIX0VORCkgcmV0dXJuIHBvc2l0aW9uIGF0IGVuZCBvZiBtYXRjaAorICogaWYgKG9wdGlvbnMgJiBTRUFSQ0hfU1RBUlQpIGFjY2VwdCBtYXRjaCBhdCBwb3MgaXRzZWxmCisgKiBpZiAob3B0aW9ucyAmIFNFQVJDSF9LRUVQKSBrZWVwIHByZXZpb3VzIHNlYXJjaCBwYXR0ZXJuCisgKiBpZiAob3B0aW9ucyAmIFNFQVJDSF9GT0xEKSBtYXRjaCBvbmx5IG9uY2UgaW4gYSBjbG9zZWQgZm9sZAorICogaWYgKG9wdGlvbnMgJiBTRUFSQ0hfUEVFSykgY2hlY2sgZm9yIHR5cGVkIGNoYXIsIGNhbmNlbCBzZWFyY2gKKyAqCisgKiBSZXR1cm4gRkFJTCAoemVybykgZm9yIGZhaWx1cmUsIG5vbi16ZXJvIGZvciBzdWNjZXNzLgorICogV2hlbiBGRUFUX0VWQUwgaXMgZGVmaW5lZCwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nCisgKiBzdWJwYXR0ZXJuIHBsdXMgb25lOyBvbmUgaWYgdGhlcmUgd2FzIG5vbmUuCisgKi8KKyAgICBpbnQKK3NlYXJjaGl0KHdpbiwgYnVmLCBwb3MsIGRpciwgcGF0LCBjb3VudCwgb3B0aW9ucywgcGF0X3VzZSkKKyAgICB3aW5fVAkqd2luOwkJLyogd2luZG93IHRvIHNlYXJjaCBpbjsgY2FuIGJlIE5VTEwgZm9yIGEKKwkJCQkgICBidWZmZXIgd2l0aG91dCBhIHdpbmRvdyEgKi8KKyAgICBidWZfVAkqYnVmOworICAgIHBvc19UCSpwb3M7CisgICAgaW50CQlkaXI7CisgICAgY2hhcl91CSpwYXQ7CisgICAgbG9uZwljb3VudDsKKyAgICBpbnQJCW9wdGlvbnM7CisgICAgaW50CQlwYXRfdXNlOworeworICAgIGludAkJZm91bmQ7CisgICAgbGluZW5yX1QJbG51bTsJCS8qIG5vIGluaXQgdG8gc2h1dCB1cCBBcG9sbG8gY2MgKi8KKyAgICByZWdtbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBjb2xucl9UCW1hdGNoY29sOworICAgIGNvbG5yX1QJc3RhcnRjb2w7CisgICAgbHBvc19UCWVuZHBvczsKKyAgICBpbnQJCWxvb3A7CisgICAgcG9zX1QJc3RhcnRfcG9zOworICAgIGludAkJYXRfZmlyc3RfbGluZTsKKyAgICBpbnQJCWV4dHJhX2NvbDsKKyAgICBpbnQJCW1hdGNoX29rOworICAgIGxvbmcJbm1hdGNoZWQ7CisgICAgaW50CQlzdWJtYXRjaCA9IDA7CisgICAgbGluZW5yX1QJZmlyc3RfbG51bTsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIGludAkJYnJlYWtfbG9vcCA9IEZBTFNFOworI2Vsc2UKKyMgZGVmaW5lIGJyZWFrX2xvb3AgRkFMU0UKKyNlbmRpZgorCisgICAgaWYgKHNlYXJjaF9yZWdjb21wKHBhdCwgUkVfU0VBUkNILCBwYXRfdXNlLAorCQkgICAob3B0aW9ucyAmIChTRUFSQ0hfSElTICsgU0VBUkNIX0tFRVApKSwgJnJlZ21hdGNoKSA9PSBGQUlMKQorICAgIHsKKwlpZiAoKG9wdGlvbnMgJiBTRUFSQ0hfTVNHKSAmJiAhcmNfZGlkX2Vtc2cpCisJICAgIEVNU0cyKF8oIkUzODM6IEludmFsaWQgc2VhcmNoIHN0cmluZzogJXMiKSwgbXJfcGF0dGVybik7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiBTRUFSQ0hfU1RBUlQpCisJZXh0cmFfY29sID0gMDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogV2F0Y2ggb3V0IGZvciB0aGUgImNvbCIgYmVpbmcgTUFYQ09MIC0gMiwgdXNlZCBpbiBhIGNsb3NlZCBmb2xkLiAqLworICAgIGVsc2UgaWYgKGhhc19tYnl0ZSAmJiBwb3MtPmxudW0gPj0gMSAmJiBwb3MtPmxudW0gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQKKwkJCQkJCSAgICAgJiYgcG9zLT5jb2wgPCBNQVhDT0wgLSAyKQorCWV4dHJhX2NvbCA9ICgqbWJfcHRyMmxlbl9jaGVjaykobWxfZ2V0X2J1ZihidWYsIHBvcy0+bG51bSwgRkFMU0UpCisJCQkJCQkJCSAgKyBwb3MtPmNvbCk7CisjZW5kaWYKKyAgICBlbHNlCisJZXh0cmFfY29sID0gMTsKKworLyoKKyAqIGZpbmQgdGhlIHN0cmluZworICovCisgICAgY2FsbGVkX2Vtc2cgPSBGQUxTRTsKKyAgICBkbwkvKiBsb29wIGZvciBjb3VudCAqLworICAgIHsKKwlzdGFydF9wb3MgPSAqcG9zOwkvKiByZW1lbWJlciBzdGFydCBwb3MgZm9yIGRldGVjdGluZyBubyBtYXRjaCAqLworCWZvdW5kID0gMDsJCS8qIGRlZmF1bHQ6IG5vdCBmb3VuZCAqLworCWF0X2ZpcnN0X2xpbmUgPSBUUlVFOwkvKiBkZWZhdWx0OiBzdGFydCBpbiBmaXJzdCBsaW5lICovCisJaWYgKHBvcy0+bG51bSA9PSAwKQkvKiBjb3JyZWN0IGxudW0gZm9yIHdoZW4gc3RhcnRpbmcgaW4gbGluZSAwICovCisJeworCSAgICBwb3MtPmxudW0gPSAxOworCSAgICBwb3MtPmNvbCA9IDA7CisJICAgIGF0X2ZpcnN0X2xpbmUgPSBGQUxTRTsgIC8qIG5vdCBpbiBmaXJzdCBsaW5lIG5vdyAqLworCX0KKworCS8qCisJICogU3RhcnQgc2VhcmNoaW5nIGluIGN1cnJlbnQgbGluZSwgdW5sZXNzIHNlYXJjaGluZyBiYWNrd2FyZHMgYW5kCisJICogd2UncmUgaW4gY29sdW1uIDAuCisJICovCisJaWYgKGRpciA9PSBCQUNLV0FSRCAmJiBzdGFydF9wb3MuY29sID09IDApCisJeworCSAgICBsbnVtID0gcG9zLT5sbnVtIC0gMTsKKwkgICAgYXRfZmlyc3RfbGluZSA9IEZBTFNFOworCX0KKwllbHNlCisJICAgIGxudW0gPSBwb3MtPmxudW07CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDw9IDE7ICsrbG9vcCkgICAvKiBsb29wIHR3aWNlIGlmICd3cmFwc2Nhbicgc2V0ICovCisJeworCSAgICBmb3IgKCA7IGxudW0gPiAwICYmIGxudW0gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCQkJCSAgIGxudW0gKz0gZGlyLCBhdF9maXJzdF9saW5lID0gRkFMU0UpCisJICAgIHsKKwkJLyoKKwkJICogTG9vayBmb3IgYSBtYXRjaCBzb21ld2hlcmUgaW4gdGhlIGxpbmUuCisJCSAqLworCQlmaXJzdF9sbnVtID0gbG51bTsKKwkJbm1hdGNoZWQgPSB2aW1fcmVnZXhlY19tdWx0aSgmcmVnbWF0Y2gsIHdpbiwgYnVmLAorCQkJCQkJCSAgICBsbnVtLCAoY29sbnJfVCkwKTsKKwkJLyogQWJvcnQgc2VhcmNoaW5nIG9uIGFuIGVycm9yIChlLmcuLCBvdXQgb2Ygc3RhY2spLiAqLworCQlpZiAoY2FsbGVkX2Vtc2cpCisJCSAgICBicmVhazsKKwkJaWYgKG5tYXRjaGVkID4gMCkKKwkJeworCQkgICAgLyogbWF0Y2ggbWF5IGFjdHVhbGx5IGJlIGluIGFub3RoZXIgbGluZSB3aGVuIHVzaW5nIFx6cyAqLworCQkgICAgbG51bSArPSByZWdtYXRjaC5zdGFydHBvc1swXS5sbnVtOworCQkgICAgcHRyID0gbWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKTsKKwkJICAgIHN0YXJ0Y29sID0gcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sOworCQkgICAgZW5kcG9zID0gcmVnbWF0Y2guZW5kcG9zWzBdOworIyBpZmRlZiBGRUFUX0VWQUwKKwkJICAgIHN1Ym1hdGNoID0gZmlyc3Rfc3VibWF0Y2goJnJlZ21hdGNoKTsKKyMgZW5kaWYKKworCQkgICAgLyoKKwkJICAgICAqIEZvcndhcmQgc2VhcmNoIGluIHRoZSBmaXJzdCBsaW5lOiBtYXRjaCBzaG91bGQgYmUgYWZ0ZXIKKwkJICAgICAqIHRoZSBzdGFydCBwb3NpdGlvbi4gSWYgbm90LCBjb250aW51ZSBhdCB0aGUgZW5kIG9mIHRoZQorCQkgICAgICogbWF0Y2ggKHRoaXMgaXMgdmkgY29tcGF0aWJsZSkgb3Igb24gdGhlIG5leHQgY2hhci4KKwkJICAgICAqLworCQkgICAgaWYgKGRpciA9PSBGT1JXQVJEICYmIGF0X2ZpcnN0X2xpbmUpCisJCSAgICB7CisJCQltYXRjaF9vayA9IFRSVUU7CisJCQkvKgorCQkJICogV2hlbiBtYXRjaCBsYW5kcyBvbiBhIE5VTCB0aGUgY3Vyc29yIHdpbGwgYmUgcHV0CisJCQkgKiBvbmUgYmFjayBhZnRlcndhcmRzLCBjb21wYXJlIHdpdGggdGhhdCBwb3NpdGlvbiwKKwkJCSAqIG90aGVyd2lzZSAiLyQiIHdpbGwgZ2V0IHN0dWNrIG9uIGVuZCBvZiBsaW5lLgorCQkJICovCisJCQl3aGlsZSAoKG9wdGlvbnMgJiBTRUFSQ0hfRU5EKQorCQkJCT8gIChubWF0Y2hlZCA9PSAxCisJCQkJICAgICYmIChpbnQpZW5kcG9zLmNvbCAtIDEKKwkJCQkJICAgICA8IChpbnQpc3RhcnRfcG9zLmNvbCArIGV4dHJhX2NvbCkKKwkJCQk6ICgoaW50KXN0YXJ0Y29sIC0gKHB0cltzdGFydGNvbF0gPT0gTlVMKQorCQkJCQkgICAgPCAoaW50KXN0YXJ0X3Bvcy5jb2wgKyBleHRyYV9jb2wpKQorCQkJeworCQkJICAgIC8qCisJCQkgICAgICogSWYgdmktY29tcGF0aWJsZSBzZWFyY2hpbmcsIGNvbnRpbnVlIGF0IHRoZSBlbmQKKwkJCSAgICAgKiBvZiB0aGUgbWF0Y2gsIG90aGVyd2lzZSBjb250aW51ZSBvbmUgcG9zaXRpb24KKwkJCSAgICAgKiBmb3J3YXJkLgorCQkJICAgICAqLworCQkJICAgIGlmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU0VBUkNIKSAhPSBOVUxMKQorCQkJICAgIHsKKwkJCQlpZiAobm1hdGNoZWQgPiAxKQorCQkJCXsKKwkJCQkgICAgLyogZW5kIGlzIGluIG5leHQgbGluZSwgdGh1cyBubyBtYXRjaCBpbgorCQkJCSAgICAgKiB0aGlzIGxpbmUgKi8KKwkJCQkgICAgbWF0Y2hfb2sgPSBGQUxTRTsKKwkJCQkgICAgYnJlYWs7CisJCQkJfQorCQkJCW1hdGNoY29sID0gZW5kcG9zLmNvbDsKKwkJCQkvKiBmb3IgZW1wdHkgbWF0Y2g6IGFkdmFuY2Ugb25lIGNoYXIgKi8KKwkJCQlpZiAobWF0Y2hjb2wgPT0gc3RhcnRjb2wKKwkJCQkJCSAgICAgICYmIHB0clttYXRjaGNvbF0gIT0gTlVMKQorCQkJCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQkJCW1hdGNoY29sICs9CisJCQkJCSAgKCptYl9wdHIybGVuX2NoZWNrKShwdHIgKyBtYXRjaGNvbCk7CisJCQkJICAgIGVsc2UKKyNlbmRpZgorCQkJCQkrK21hdGNoY29sOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQltYXRjaGNvbCA9IHN0YXJ0Y29sOworCQkJCWlmIChwdHJbbWF0Y2hjb2xdICE9IE5VTCkKKwkJCQl7CisjaWZkZWYgRkVBVF9NQllURQorCQkJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJCQltYXRjaGNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0cgorCQkJCQkJCQkgICsgbWF0Y2hjb2wpOworCQkJCSAgICBlbHNlCisjZW5kaWYKKwkJCQkJKyttYXRjaGNvbDsKKwkJCQl9CisJCQkgICAgfQorCQkJICAgIGlmIChwdHJbbWF0Y2hjb2xdID09IE5VTAorCQkJCSAgICB8fCAobm1hdGNoZWQgPSB2aW1fcmVnZXhlY19tdWx0aSgmcmVnbWF0Y2gsCisJCQkJCSAgICAgIHdpbiwgYnVmLCBsbnVtLCBtYXRjaGNvbCkpID09IDApCisJCQkgICAgeworCQkJCW1hdGNoX29rID0gRkFMU0U7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJICAgIHN0YXJ0Y29sID0gcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sOworCQkJICAgIGVuZHBvcyA9IHJlZ21hdGNoLmVuZHBvc1swXTsKKyMgaWZkZWYgRkVBVF9FVkFMCisJCQkgICAgc3VibWF0Y2ggPSBmaXJzdF9zdWJtYXRjaCgmcmVnbWF0Y2gpOworIyBlbmRpZgorCisJCQkgICAgLyogTmVlZCB0byBnZXQgdGhlIGxpbmUgcG9pbnRlciBhZ2FpbiwgYQorCQkJICAgICAqIG11bHRpLWxpbmUgc2VhcmNoIG1heSBoYXZlIG1hZGUgaXQgaW52YWxpZC4gKi8KKwkJCSAgICBwdHIgPSBtbF9nZXRfYnVmKGJ1ZiwgbG51bSwgRkFMU0UpOworCQkJfQorCQkJaWYgKCFtYXRjaF9vaykKKwkJCSAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICAgIGlmIChkaXIgPT0gQkFDS1dBUkQpCisJCSAgICB7CisJCQkvKgorCQkJICogTm93LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlcyBvbiB0aGlzIGxpbmUsCisJCQkgKiB3ZSBoYXZlIHRvIGdldCB0aGUgbGFzdCBvbmUuIE9yIHRoZSBsYXN0IG9uZSBiZWZvcmUKKwkJCSAqIHRoZSBjdXJzb3IsIGlmIHdlJ3JlIG9uIHRoYXQgbGluZS4KKwkJCSAqIFdoZW4gcHV0dGluZyB0aGUgbmV3IGN1cnNvciBhdCB0aGUgZW5kLCBjb21wYXJlCisJCQkgKiByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC4KKwkJCSAqLworCQkJbWF0Y2hfb2sgPSBGQUxTRTsKKwkJCWZvciAoOzspCisJCQl7CisJCQkgICAgaWYgKCFhdF9maXJzdF9saW5lCisJCQkJICAgIHx8ICgob3B0aW9ucyAmIFNFQVJDSF9FTkQpCisJCQkJCT8gIChubWF0Y2hlZCA9PSAxCisJCQkJCSAgICAmJiAoaW50KXJlZ21hdGNoLmVuZHBvc1swXS5jb2wgLSAxCisJCQkJCQkJCSAgICsgZXh0cmFfY29sCisJCQkJCQkJPD0gKGludClzdGFydF9wb3MuY29sKQorCQkJCQk6ICgoaW50KXJlZ21hdGNoLnN0YXJ0cG9zWzBdLmNvbAorCQkJCQkJCQkgICArIGV4dHJhX2NvbAorCQkJCQkJICAgICAgPD0gKGludClzdGFydF9wb3MuY29sKSkpCisJCQkgICAgeworCQkJCS8qIFJlbWVtYmVyIHRoaXMgcG9zaXRpb24sIHdlIHVzZSBpdCBpZiBpdCdzCisJCQkJICogdGhlIGxhc3QgbWF0Y2ggaW4gdGhlIGxpbmUuICovCisJCQkJbWF0Y2hfb2sgPSBUUlVFOworCQkJCXN0YXJ0Y29sID0gcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sOworCQkJCWVuZHBvcyA9IHJlZ21hdGNoLmVuZHBvc1swXTsKKyMgaWZkZWYgRkVBVF9FVkFMCisJCQkJc3VibWF0Y2ggPSBmaXJzdF9zdWJtYXRjaCgmcmVnbWF0Y2gpOworIyBlbmRpZgorCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkJYnJlYWs7CisKKwkJCSAgICAvKgorCQkJICAgICAqIFdlIGZvdW5kIGEgdmFsaWQgbWF0Y2gsIG5vdyBjaGVjayBpZiB0aGVyZSBpcworCQkJICAgICAqIGFub3RoZXIgb25lIGFmdGVyIGl0LgorCQkJICAgICAqIElmIHZpLWNvbXBhdGlibGUgc2VhcmNoaW5nLCBjb250aW51ZSBhdCB0aGUgZW5kCisJCQkgICAgICogb2YgdGhlIG1hdGNoLCBvdGhlcndpc2UgY29udGludWUgb25lIHBvc2l0aW9uCisJCQkgICAgICogZm9yd2FyZC4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAodmltX3N0cmNocihwX2NwbywgQ1BPX1NFQVJDSCkgIT0gTlVMTCkKKwkJCSAgICB7CisJCQkJaWYgKG5tYXRjaGVkID4gMSkKKwkJCQkgICAgYnJlYWs7CisJCQkJbWF0Y2hjb2wgPSBlbmRwb3MuY29sOworCQkJCS8qIGZvciBlbXB0eSBtYXRjaDogYWR2YW5jZSBvbmUgY2hhciAqLworCQkJCWlmIChtYXRjaGNvbCA9PSBzdGFydGNvbAorCQkJCQkJICAgICAgJiYgcHRyW21hdGNoY29sXSAhPSBOVUwpCisJCQkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCQkgICAgaWYgKGhhc19tYnl0ZSkKKwkJCQkJbWF0Y2hjb2wgKz0KKwkJCQkJICAoKm1iX3B0cjJsZW5fY2hlY2spKHB0ciArIG1hdGNoY29sKTsKKwkJCQkgICAgZWxzZQorI2VuZGlmCisJCQkJCSsrbWF0Y2hjb2w7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgeworCQkJCW1hdGNoY29sID0gc3RhcnRjb2w7CisJCQkJaWYgKHB0clttYXRjaGNvbF0gIT0gTlVMKQorCQkJCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkJICAgIGlmIChoYXNfbWJ5dGUpCisJCQkJCW1hdGNoY29sICs9CisJCQkJCSAgKCptYl9wdHIybGVuX2NoZWNrKShwdHIgKyBtYXRjaGNvbCk7CisJCQkJICAgIGVsc2UKKyNlbmRpZgorCQkJCQkrK21hdGNoY29sOworCQkJCX0KKwkJCSAgICB9CisJCQkgICAgaWYgKHB0clttYXRjaGNvbF0gPT0gTlVMCisJCQkJICAgIHx8IChubWF0Y2hlZCA9IHZpbV9yZWdleGVjX211bHRpKCZyZWdtYXRjaCwKKwkJCQkJICAgICAgd2luLCBidWYsIGxudW0sIG1hdGNoY29sKSkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJICAgIC8qIE5lZWQgdG8gZ2V0IHRoZSBsaW5lIHBvaW50ZXIgYWdhaW4sIGEKKwkJCSAgICAgKiBtdWx0aS1saW5lIHNlYXJjaCBtYXkgaGF2ZSBtYWRlIGl0IGludmFsaWQuICovCisJCQkgICAgcHRyID0gbWxfZ2V0X2J1ZihidWYsIGxudW0sIEZBTFNFKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGlzIG9ubHkgYSBtYXRjaCBhZnRlciB0aGUgY3Vyc29yLCBza2lwCisJCQkgKiB0aGlzIG1hdGNoLgorCQkJICovCisJCQlpZiAoIW1hdGNoX29rKQorCQkJICAgIGNvbnRpbnVlOworCQkgICAgfQorCisJCSAgICBpZiAob3B0aW9ucyAmIFNFQVJDSF9FTkQgJiYgIShvcHRpb25zICYgU0VBUkNIX05PT0YpKQorCQkgICAgeworCQkJcG9zLT5sbnVtID0gZW5kcG9zLmxudW0gKyBmaXJzdF9sbnVtOworCQkJcG9zLT5jb2wgPSBlbmRwb3MuY29sIC0gMTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCXBvcy0+bG51bSA9IGxudW07CisJCQlwb3MtPmNvbCA9IHN0YXJ0Y29sOworCQkgICAgfQorI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKwkJICAgIHBvcy0+Y29sYWRkID0gMDsKKyNlbmRpZgorCQkgICAgZm91bmQgPSAxOworCisJCSAgICAvKiBTZXQgdmFyaWFibGVzIHVzZWQgZm9yICdpbmNzZWFyY2gnIGhpZ2hsaWdodGluZy4gKi8KKwkJICAgIHNlYXJjaF9tYXRjaF9saW5lcyA9IGVuZHBvcy5sbnVtIC0gKGxudW0gLSBmaXJzdF9sbnVtKTsKKwkJICAgIHNlYXJjaF9tYXRjaF9lbmRjb2wgPSBlbmRwb3MuY29sOworCQkgICAgYnJlYWs7CisJCX0KKwkJbGluZV9icmVha2NoZWNrKCk7CS8qIHN0b3AgaWYgY3RybC1DIHR5cGVkICovCisJCWlmIChnb3RfaW50KQorCQkgICAgYnJlYWs7CisKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCQkvKiBDYW5jZWwgc2VhcmNoaW5nIGlmIGEgY2hhcmFjdGVyIHdhcyB0eXBlZC4gIFVzZWQgZm9yCisJCSAqICdpbmNzZWFyY2gnLiAgRG9uJ3QgY2hlY2sgdG9vIG9mdGVuLCB0aGF0IHdvdWxkIHNsb3dkb3duCisJCSAqIHNlYXJjaGluZyB0b28gbXVjaC4gKi8KKwkJaWYgKChvcHRpb25zICYgU0VBUkNIX1BFRUspCisJCQkmJiAoKGxudW0gLSBwb3MtPmxudW0pICYgMHgzZikgPT0gMAorCQkJJiYgY2hhcl9hdmFpbCgpKQorCQl7CisJCSAgICBicmVha19sb29wID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisjZW5kaWYKKworCQlpZiAobG9vcCAmJiBsbnVtID09IHN0YXJ0X3Bvcy5sbnVtKQorCQkgICAgYnJlYWs7CSAgICAvKiBpZiBzZWNvbmQgbG9vcCwgc3RvcCB3aGVyZSBzdGFydGVkICovCisJICAgIH0KKwkgICAgYXRfZmlyc3RfbGluZSA9IEZBTFNFOworCisJICAgIC8qCisJICAgICAqIFN0b3AgdGhlIHNlYXJjaCBpZiB3cmFwc2NhbiBpc24ndCBzZXQsIGFmdGVyIGFuIGludGVycnVwdCwKKwkgICAgICogYWZ0ZXIgYSBtYXRjaCBhbmQgYWZ0ZXIgbG9vcGluZyB0d2ljZS4KKwkgICAgICovCisJICAgIGlmICghcF93cyB8fCBnb3RfaW50IHx8IGNhbGxlZF9lbXNnIHx8IGJyZWFrX2xvb3AgfHwgZm91bmQgfHwgbG9vcCkKKwkJYnJlYWs7CisKKwkgICAgLyoKKwkgICAgICogSWYgJ3dyYXBzY2FuJyBpcyBzZXQgd2UgY29udGludWUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgZmlsZS4KKwkgICAgICogSWYgJ3Nob3J0bWVzcycgZG9lcyBub3QgY29udGFpbiAncycsIHdlIGdpdmUgYSBtZXNzYWdlLgorCSAgICAgKiBUaGlzIG1lc3NhZ2UgaXMgYWxzbyByZW1lbWJlcmVkIGluIGtlZXBfbXNnIGZvciB3aGVuIHRoZSBzY3JlZW4KKwkgICAgICogaXMgcmVkcmF3bi4gVGhlIGtlZXBfbXNnIGlzIGNsZWFyZWQgd2hlbmV2ZXIgYW5vdGhlciBtZXNzYWdlIGlzCisJICAgICAqIHdyaXR0ZW4uCisJICAgICAqLworCSAgICBpZiAoZGlyID09IEJBQ0tXQVJEKSAgICAvKiBzdGFydCBzZWNvbmQgbG9vcCBhdCB0aGUgb3RoZXIgZW5kICovCisJICAgIHsKKwkJbG51bSA9IGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCQlpZiAoIXNob3J0bWVzcyhTSE1fU0VBUkNIKSAmJiAob3B0aW9ucyAmIFNFQVJDSF9NU0cpKQorCQkgICAgZ2l2ZV93YXJuaW5nKChjaGFyX3UgKilfKHRvcF9ib3RfbXNnKSwgVFJVRSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWxudW0gPSAxOworCQlpZiAoIXNob3J0bWVzcyhTSE1fU0VBUkNIKSAmJiAob3B0aW9ucyAmIFNFQVJDSF9NU0cpKQorCQkgICAgZ2l2ZV93YXJuaW5nKChjaGFyX3UgKilfKGJvdF90b3BfbXNnKSwgVFJVRSk7CisJICAgIH0KKwl9CisJaWYgKGdvdF9pbnQgfHwgY2FsbGVkX2Vtc2cgfHwgYnJlYWtfbG9vcCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlICgtLWNvdW50ID4gMCAmJiBmb3VuZCk7ICAgLyogc3RvcCBhZnRlciBjb3VudCBtYXRjaGVzIG9yIG5vIG1hdGNoICovCisKKyAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKworICAgIGlmICghZm91bmQpCQkgICAgLyogZGlkIG5vdCBmaW5kIGl0ICovCisgICAgeworCWlmIChnb3RfaW50KQorCSAgICBFTVNHKF8oZV9pbnRlcnIpKTsKKwllbHNlIGlmICgob3B0aW9ucyAmIFNFQVJDSF9NU0cpID09IFNFQVJDSF9NU0cpCisJeworCSAgICBpZiAocF93cykKKwkJRU1TRzIoXyhlX3BhdG5vdGYyKSwgbXJfcGF0dGVybik7CisJICAgIGVsc2UgaWYgKGxudW0gPT0gMCkKKwkJRU1TRzIoXygiRTM4NDogc2VhcmNoIGhpdCBUT1Agd2l0aG91dCBtYXRjaCBmb3I6ICVzIiksCisJCQkJCQkJCSAgbXJfcGF0dGVybik7CisJICAgIGVsc2UKKwkJRU1TRzIoXygiRTM4NTogc2VhcmNoIGhpdCBCT1RUT00gd2l0aG91dCBtYXRjaCBmb3I6ICVzIiksCisJCQkJCQkJCSAgbXJfcGF0dGVybik7CisJfQorCXJldHVybiBGQUlMOworICAgIH0KKworICAgIHJldHVybiBzdWJtYXRjaCArIDE7Cit9CisKKyNpZmRlZiBGRUFUX0VWQUwKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3Qgc3VicGF0IHRoYXQgbWF0Y2hlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZpcnN0X3N1Ym1hdGNoKHJwKQorICAgIHJlZ21tYXRjaF9UCSpycDsKK3sKKyAgICBpbnQJCXN1Ym1hdGNoOworCisgICAgZm9yIChzdWJtYXRjaCA9IDE7IDsgKytzdWJtYXRjaCkKKyAgICB7CisJaWYgKHJwLT5zdGFydHBvc1tzdWJtYXRjaF0ubG51bSA+PSAwKQorCSAgICBicmVhazsKKwlpZiAoc3VibWF0Y2ggPT0gOSkKKwl7CisJICAgIHN1Ym1hdGNoID0gMDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICByZXR1cm4gc3VibWF0Y2g7Cit9CisjZW5kaWYKKworLyoKKyAqIEhpZ2hlc3QgbGV2ZWwgc3RyaW5nIHNlYXJjaCBmdW5jdGlvbi4KKyAqIFNlYXJjaCBmb3IgdGhlICdjb3VudCd0aCBvY2N1cmVuY2Ugb2YgcGF0dGVybiAncGF0JyBpbiBkaXJlY3Rpb24gJ2RpcmMnCisgKgkJICBJZiAnZGlyYycgaXMgMDogdXNlIHByZXZpb3VzIGRpci4KKyAqICAgIElmICdwYXQnIGlzIE5VTEwgb3IgZW1wdHkgOiB1c2UgcHJldmlvdXMgc3RyaW5nLgorICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfUkVWJyA6IGdvIGluIHJldmVyc2Ugb2YgcHJldmlvdXMgZGlyLgorICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfRUNITyc6IGVjaG8gdGhlIHNlYXJjaCBjb21tYW5kIGFuZCBoYW5kbGUgb3B0aW9ucworICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfTVNHJyA6IG1heSBnaXZlIGVycm9yIG1lc3NhZ2UKKyAqICAgIElmICdvcHRpb25zICYgU0VBUkNIX09QVCcgOiBpbnRlcnByZXQgb3B0aW9uYWwgZmxhZ3MKKyAqICAgIElmICdvcHRpb25zICYgU0VBUkNIX0hJUycgOiBwdXQgc2VhcmNoIHBhdHRlcm4gaW4gaGlzdG9yeQorICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfTk9PRic6IGRvbid0IGFkZCBvZmZzZXQgdG8gcG9zaXRpb24KKyAqICAgIElmICdvcHRpb25zICYgU0VBUkNIX01BUksnOiBzZXQgcHJldmlvdXMgY29udGV4dCBtYXJrCisgKiAgICBJZiAnb3B0aW9ucyAmIFNFQVJDSF9LRUVQJzoga2VlcCBwcmV2aW91cyBzZWFyY2ggcGF0dGVybgorICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfU1RBUlQnOiBhY2NlcHQgbWF0Y2ggYXQgY3VycG9zIGl0c2VsZgorICogICAgSWYgJ29wdGlvbnMgJiBTRUFSQ0hfUEVFSyc6IGNoZWNrIGZvciB0eXBlZCBjaGFyLCBjYW5jZWwgc2VhcmNoCisgKgorICogQ2FyZWZ1bDogSWYgc3BhdHNbMF0ub2ZmLmxpbmUgPT0gVFJVRSBhbmQgc3BhdHNbMF0ub2ZmLm9mZiA9PSAwIHRoaXMKKyAqIG1ha2VzIHRoZSBtb3ZlbWVudCBsaW5ld2lzZSB3aXRob3V0IG1vdmluZyB0aGUgbWF0Y2ggcG9zaXRpb24uCisgKgorICogcmV0dXJuIDAgZm9yIGZhaWx1cmUsIDEgZm9yIGZvdW5kLCAyIGZvciBmb3VuZCBhbmQgbGluZSBvZmZzZXQgYWRkZWQKKyAqLworICAgIGludAorZG9fc2VhcmNoKG9hcCwgZGlyYywgcGF0LCBjb3VudCwgb3B0aW9ucykKKyAgICBvcGFyZ19UCSAgICAqb2FwOwkvKiBjYW4gYmUgTlVMTCAqLworICAgIGludAkJICAgIGRpcmM7CS8qICcvJyBvciAnPycgKi8KKyAgICBjaGFyX3UJICAgKnBhdDsKKyAgICBsb25nCSAgICBjb3VudDsKKyAgICBpbnQJCSAgICBvcHRpb25zOworeworICAgIHBvc19UCSAgICBwb3M7CS8qIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hdGNoICovCisgICAgY2hhcl91CSAgICAqc2VhcmNoc3RyOworICAgIHN0cnVjdCBzb2Zmc2V0ICBvbGRfb2ZmOworICAgIGludAkJICAgIHJldHZhbDsJLyogUmV0dXJuIHZhbHVlICovCisgICAgY2hhcl91CSAgICAqcDsKKyAgICBsb25nCSAgICBjOworICAgIGNoYXJfdQkgICAgKmRpcmNwOworICAgIGNoYXJfdQkgICAgKnN0cmNvcHkgPSBOVUxMOworICAgIGNoYXJfdQkgICAgKnBzOworCisgICAgLyoKKyAgICAgKiBBIGxpbmUgb2Zmc2V0IGlzIG5vdCByZW1lbWJlcmVkLCB0aGlzIGlzIHZpIGNvbXBhdGlibGUuCisgICAgICovCisgICAgaWYgKHNwYXRzWzBdLm9mZi5saW5lICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19MSU5FT0ZGKSAhPSBOVUxMKQorICAgIHsKKwlzcGF0c1swXS5vZmYubGluZSA9IEZBTFNFOworCXNwYXRzWzBdLm9mZi5vZmYgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgdmFsdWVzIGZvciB3aGVuIChvcHRpb25zICYgU0VBUkNIX0tFRVApIGlzIHVzZWQuCisgICAgICogKHRoZXJlIGlzIG5vICJpZiAoKSIgYXJvdW5kIHRoaXMgYmVjYXVzZSBnY2Mgd2FudHMgdGhlbSBpbml0aWFsaXplZCkKKyAgICAgKi8KKyAgICBvbGRfb2ZmID0gc3BhdHNbMF0ub2ZmOworCisgICAgcG9zID0gY3Vyd2luLT53X2N1cnNvcjsJLyogc3RhcnQgc2VhcmNoaW5nIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24gKi8KKworICAgIC8qCisgICAgICogRmluZCBvdXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2VhcmNoLgorICAgICAqLworICAgIGlmIChkaXJjID09IDApCisJZGlyYyA9IHNwYXRzWzBdLm9mZi5kaXI7CisgICAgZWxzZQorCXNwYXRzWzBdLm9mZi5kaXIgPSBkaXJjOworICAgIGlmIChvcHRpb25zICYgU0VBUkNIX1JFVikKKyAgICB7CisjaWZkZWYgV0lOMzIKKwkvKiBUaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgVmlzdWFsIEMrKyAyLjIgY29tcGlsZXIgd2hpY2ggbWVhbnMgdGhhdAorCSAqIGRpcmMgYWx3YXlzIGVuZHMgdXAgYmVpbmcgJy8nICovCisJZGlyYyA9IChkaXJjID09ICcvJykgID8gICc/JyAgOiAgJy8nOworI2Vsc2UKKwlpZiAoZGlyYyA9PSAnLycpCisJICAgIGRpcmMgPSAnPyc7CisJZWxzZQorCSAgICBkaXJjID0gJy8nOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgLyogSWYgdGhlIGN1cnNvciBpcyBpbiBhIGNsb3NlZCBmb2xkLCBkb24ndCBmaW5kIGFub3RoZXIgbWF0Y2ggaW4gdGhlIHNhbWUKKyAgICAgKiBmb2xkLiAqLworICAgIGlmIChkaXJjID09ICcvJykKKyAgICB7CisJaWYgKGhhc0ZvbGRpbmcocG9zLmxudW0sIE5VTEwsICZwb3MubG51bSkpCisJICAgIHBvcy5jb2wgPSBNQVhDT0wgLSAyOwkvKiBhdm9pZCBvdmVyZmxvdyB3aGVuIGFkZGluZyAxICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKGhhc0ZvbGRpbmcocG9zLmxudW0sICZwb3MubG51bSwgTlVMTCkpCisJICAgIHBvcy5jb2wgPSAwOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICAvKgorICAgICAqIFR1cm4gJ2hsc2VhcmNoJyBoaWdobGlnaHRpbmcgYmFjayBvbi4KKyAgICAgKi8KKyAgICBpZiAobm9faGxzZWFyY2ggJiYgIShvcHRpb25zICYgU0VBUkNIX0tFRVApKQorICAgIHsKKwlyZWRyYXdfYWxsX2xhdGVyKE5PVF9WQUxJRCk7CisJbm9faGxzZWFyY2ggPSBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogUmVwZWF0IHRoZSBzZWFyY2ggd2hlbiBwYXR0ZXJuIGZvbGxvd2VkIGJ5ICc7JywgZS5nLiAiL2Zvby87P2JhciIuCisgICAgICovCisgICAgZm9yICg7OykKKyAgICB7CisJc2VhcmNoc3RyID0gcGF0OworCWRpcmNwID0gTlVMTDsKKwkJCQkJICAgIC8qIHVzZSBwcmV2aW91cyBwYXR0ZXJuICovCisJaWYgKHBhdCA9PSBOVUxMIHx8ICpwYXQgPT0gTlVMIHx8ICpwYXQgPT0gZGlyYykKKwl7CisJICAgIGlmIChzcGF0c1tSRV9TRUFSQ0hdLnBhdCA9PSBOVUxMKQkgICAgLyogbm8gcHJldmlvdXMgcGF0dGVybiAqLworCSAgICB7CisJCUVNU0coXyhlX25vcHJldnJlKSk7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZW5kX2RvX3NlYXJjaDsKKwkgICAgfQorCSAgICAvKiBtYWtlIHNlYXJjaF9yZWdjb21wKCkgdXNlIHNwYXRzW1JFX1NFQVJDSF0ucGF0ICovCisJICAgIHNlYXJjaHN0ciA9IChjaGFyX3UgKikiIjsKKwl9CisKKwlpZiAocGF0ICE9IE5VTEwgJiYgKnBhdCAhPSBOVUwpCS8qIGxvb2sgZm9yIChuZXcpIG9mZnNldCAqLworCXsKKwkgICAgLyoKKwkgICAgICogRmluZCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uLgorCSAgICAgKiBJZiB0aGVyZSBpcyBhIG1hdGNoaW5nICcvJyBvciAnPycsIHRvc3MgaXQuCisJICAgICAqLworCSAgICBwcyA9IHN0cmNvcHk7CisJICAgIHAgPSBza2lwX3JlZ2V4cChwYXQsIGRpcmMsIChpbnQpcF9tYWdpYywgJnN0cmNvcHkpOworCSAgICBpZiAoc3RyY29weSAhPSBwcykKKwkgICAgeworCQkvKiBtYWRlIGEgY29weSBvZiAicGF0IiB0byBjaGFuZ2UgIlw/IiB0byAiPyIgKi8KKwkJc2VhcmNoY21kbGVuICs9IFNUUkxFTihwYXQpIC0gU1RSTEVOKHN0cmNvcHkpOworCQlwYXQgPSBzdHJjb3B5OworCQlzZWFyY2hzdHIgPSBzdHJjb3B5OworCSAgICB9CisJICAgIGlmICgqcCA9PSBkaXJjKQorCSAgICB7CisJCWRpcmNwID0gcDsJLyogcmVtZW1iZXIgd2hlcmUgd2UgcHV0IHRoZSBOVUwgKi8KKwkJKnArKyA9IE5VTDsKKwkgICAgfQorCSAgICBzcGF0c1swXS5vZmYubGluZSA9IEZBTFNFOworCSAgICBzcGF0c1swXS5vZmYuZW5kID0gRkFMU0U7CisJICAgIHNwYXRzWzBdLm9mZi5vZmYgPSAwOworCSAgICAvKgorCSAgICAgKiBDaGVjayBmb3IgYSBsaW5lIG9mZnNldCBvciBhIGNoYXJhY3RlciBvZmZzZXQuCisJICAgICAqIEZvciBnZXRfYWRkcmVzcyAoZWNobyBvZmYpIHdlIGRvbid0IGNoZWNrIGZvciBhIGNoYXJhY3RlcgorCSAgICAgKiBvZmZzZXQsIGJlY2F1c2UgaXQgaXMgbWVhbmluZ2xlc3MgYW5kIHRoZSAncycgY291bGQgYmUgYQorCSAgICAgKiBzdWJzdGl0dXRlIGNvbW1hbmQuCisJICAgICAqLworCSAgICBpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJyB8fCBWSU1fSVNESUdJVCgqcCkpCisJCXNwYXRzWzBdLm9mZi5saW5lID0gVFJVRTsKKwkgICAgZWxzZSBpZiAoKG9wdGlvbnMgJiBTRUFSQ0hfT1BUKSAmJgorCQkJCQkoKnAgPT0gJ2UnIHx8ICpwID09ICdzJyB8fCAqcCA9PSAnYicpKQorCSAgICB7CisJCWlmICgqcCA9PSAnZScpCQkvKiBlbmQgKi8KKwkJICAgIHNwYXRzWzBdLm9mZi5lbmQgPSBTRUFSQ0hfRU5EOworCQkrK3A7CisJICAgIH0KKwkgICAgaWYgKFZJTV9JU0RJR0lUKCpwKSB8fCAqcCA9PSAnKycgfHwgKnAgPT0gJy0nKSAgLyogZ290IGFuIG9mZnNldCAqLworCSAgICB7CisJCQkJCSAgICAvKiAnbnInIG9yICcrbnInIG9yICctbnInICovCisJCWlmIChWSU1fSVNESUdJVCgqcCkgfHwgVklNX0lTRElHSVQoKihwICsgMSkpKQorCQkgICAgc3BhdHNbMF0ub2ZmLm9mZiA9IGF0b2woKGNoYXIgKilwKTsKKwkJZWxzZSBpZiAoKnAgPT0gJy0nKQkgICAgLyogc2luZ2xlICctJyAqLworCQkgICAgc3BhdHNbMF0ub2ZmLm9mZiA9IC0xOworCQllbHNlCQkJICAgIC8qIHNpbmdsZSAnKycgKi8KKwkJICAgIHNwYXRzWzBdLm9mZi5vZmYgPSAxOworCQkrK3A7CisJCXdoaWxlIChWSU1fSVNESUdJVCgqcCkpCSAgICAvKiBza2lwIG51bWJlciAqLworCQkgICAgKytwOworCSAgICB9CisKKwkgICAgLyogY29tcHV0ZSBsZW5ndGggb2Ygc2VhcmNoIGNvbW1hbmQgZm9yIGdldF9hZGRyZXNzKCkgKi8KKwkgICAgc2VhcmNoY21kbGVuICs9IChpbnQpKHAgLSBwYXQpOworCisJICAgIHBhdCA9IHA7CQkJICAgIC8qIHB1dCBwYXQgYWZ0ZXIgc2VhcmNoIGNvbW1hbmQgKi8KKwl9CisKKwlpZiAoKG9wdGlvbnMgJiBTRUFSQ0hfRUNITykgJiYgbWVzc2FnaW5nKCkKKwkJCQkJICAgICYmICFjbWRfc2lsZW50ICYmIG1zZ19zaWxlbnQgPT0gMCkKKwl7CisJICAgIGNoYXJfdQkqbXNnYnVmOworCSAgICBjaGFyX3UJKnRydW5jOworCisJICAgIGlmICgqc2VhcmNoc3RyID09IE5VTCkKKwkJcCA9IHNwYXRzW2xhc3RfaWR4XS5wYXQ7CisJICAgIGVsc2UKKwkJcCA9IHNlYXJjaHN0cjsKKwkgICAgbXNnYnVmID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4ocCkgKyA0MCkpOworCSAgICBpZiAobXNnYnVmICE9IE5VTEwpCisJICAgIHsKKwkJbXNnYnVmWzBdID0gZGlyYzsKKwkJU1RSQ1BZKG1zZ2J1ZiArIDEsIHApOworCQlpZiAoc3BhdHNbMF0ub2ZmLmxpbmUgfHwgc3BhdHNbMF0ub2ZmLmVuZCB8fCBzcGF0c1swXS5vZmYub2ZmKQorCQl7CisJCSAgICBwID0gbXNnYnVmICsgU1RSTEVOKG1zZ2J1Zik7CisJCSAgICAqcCsrID0gZGlyYzsKKwkJICAgIGlmIChzcGF0c1swXS5vZmYuZW5kKQorCQkJKnArKyA9ICdlJzsKKwkJICAgIGVsc2UgaWYgKCFzcGF0c1swXS5vZmYubGluZSkKKwkJCSpwKysgPSAncyc7CisJCSAgICBpZiAoc3BhdHNbMF0ub2ZmLm9mZiA+IDAgfHwgc3BhdHNbMF0ub2ZmLmxpbmUpCisJCQkqcCsrID0gJysnOworCQkgICAgaWYgKHNwYXRzWzBdLm9mZi5vZmYgIT0gMCB8fCBzcGF0c1swXS5vZmYubGluZSkKKwkJCXNwcmludGYoKGNoYXIgKilwLCAiJWxkIiwgc3BhdHNbMF0ub2ZmLm9mZik7CisJCSAgICBlbHNlCisJCQkqcCA9IE5VTDsKKwkJfQorCisJCW1zZ19zdGFydCgpOworCQl0cnVuYyA9IG1zZ19zdHJ0cnVuYyhtc2didWYpOworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJLyogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvdWxkIGJlIHNob3duIG9uIHRoZSByaWdodCBpbiByaWdodGxlZnQKKwkJICogbW9kZSwgYnV0IHRoZSAncnVsZXInIGFuZCAnc2hvd2NtZCcgYXJlYSB1c2UgaXQgdG9vLCB0aHVzCisJCSAqIGl0IHdvdWxkIGJlIGJsYW5rZWQgb3V0IGFnYWluIHZlcnkgc29vbi4gIFNob3cgaXQgb24gdGhlCisJCSAqIGxlZnQsIGJ1dCBkbyByZXZlcnNlIHRoZSB0ZXh0LiAqLworCQlpZiAoY3Vyd2luLT53X3BfcmwgJiYgKmN1cndpbi0+d19wX3JsYyA9PSAncycpCisJCXsKKwkJICAgIGNoYXJfdSAqcjsKKworCQkgICAgciA9IHJldmVyc2VfdGV4dCh0cnVuYyAhPSBOVUxMID8gdHJ1bmMgOiBtc2didWYpOworCQkgICAgaWYgKHIgIT0gTlVMTCkKKwkJICAgIHsKKwkJCXZpbV9mcmVlKHRydW5jKTsKKwkJCXRydW5jID0gcjsKKwkJICAgIH0KKwkJfQorI2VuZGlmCisJCWlmICh0cnVuYyAhPSBOVUxMKQorCQl7CisJCSAgICBtc2dfb3V0dHJhbnModHJ1bmMpOworCQkgICAgdmltX2ZyZWUodHJ1bmMpOworCQl9CisJCWVsc2UKKwkJICAgIG1zZ19vdXR0cmFucyhtc2didWYpOworCQltc2dfY2xyX2VvcygpOworCQltc2dfY2hlY2soKTsKKwkJdmltX2ZyZWUobXNnYnVmKTsKKworCQlnb3RvY21kbGluZShGQUxTRSk7CisJCW91dF9mbHVzaCgpOworCQltc2dfbm93YWl0ID0gVFJVRTsJICAgIC8qIGRvbid0IHdhaXQgZm9yIHRoaXMgbWVzc2FnZSAqLworCSAgICB9CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBvZmZzZXQsIHN1YnRyYWN0IGl0IGZyb20gdGhlIGN1cnJlbnQKKwkgKiBwb3NpdGlvbiwgc28gd2UgZG9uJ3QgZ2V0IHN0dWNrIGF0ICI/cGF0P2UrMiIgb3IgIi9wYXQvcy0yIi4KKwkgKiBUaGlzIGlzIG5vdCBkb25lIGZvciBhIGxpbmUgb2Zmc2V0LCBiZWNhdXNlIHRoZW4gd2Ugd291bGQgbm90IGJlIHZpCisJICogY29tcGF0aWJsZS4KKwkgKi8KKwlpZiAoIXNwYXRzWzBdLm9mZi5saW5lICYmIHNwYXRzWzBdLm9mZi5vZmYpCisJeworCSAgICBpZiAoc3BhdHNbMF0ub2ZmLm9mZiA+IDApCisJICAgIHsKKwkJZm9yIChjID0gc3BhdHNbMF0ub2ZmLm9mZjsgYzsgLS1jKQorCQkgICAgaWYgKGRlY2woJnBvcykgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKGMpCQkJLyogYXQgc3RhcnQgb2YgYnVmZmVyICovCisJCXsKKwkJICAgIHBvcy5sbnVtID0gMDsJLyogYWxsb3cgbG51bSA9PSAwIGhlcmUgKi8KKwkJICAgIHBvcy5jb2wgPSBNQVhDT0w7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZm9yIChjID0gc3BhdHNbMF0ub2ZmLm9mZjsgYzsgKytjKQorCQkgICAgaWYgKGluY2woJnBvcykgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKGMpCQkJLyogYXQgZW5kIG9mIGJ1ZmZlciAqLworCQl7CisJCSAgICBwb3MubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMTsKKwkJICAgIHBvcy5jb2wgPSAwOworCQl9CisJICAgIH0KKwl9CisKKyNpZmRlZiBGRUFUX0ZLTUFQCS8qIHdoZW4gaW4gRmFyc2kgbW9kZSwgcmV2ZXJzZSB0aGUgY2hhcmFjdGVyIGZsb3cgKi8KKwlpZiAocF9hbHRrZXltYXAgJiYgY3Vyd2luLT53X3BfcmwpCisJICAgICBsckZzd2FwKHNlYXJjaHN0ciwwKTsKKyNlbmRpZgorCisJYyA9IHNlYXJjaGl0KGN1cndpbiwgY3VyYnVmLCAmcG9zLCBkaXJjID09ICcvJyA/IEZPUldBUkQgOiBCQUNLV0FSRCwKKwkJc2VhcmNoc3RyLCBjb3VudCwgc3BhdHNbMF0ub2ZmLmVuZCArIChvcHRpb25zICYKKwkJICAgICAgIChTRUFSQ0hfS0VFUCArIFNFQVJDSF9QRUVLICsgU0VBUkNIX0hJUworCQkJKyBTRUFSQ0hfTVNHICsgU0VBUkNIX1NUQVJUCisJCQkrICgocGF0ICE9IE5VTEwgJiYgKnBhdCA9PSAnOycpID8gMCA6IFNFQVJDSF9OT09GKSkpLAorCQlSRV9MQVNUKTsKKworCWlmIChkaXJjcCAhPSBOVUxMKQorCSAgICAqZGlyY3AgPSBkaXJjOwkvKiByZXN0b3JlIHNlY29uZCAnLycgb3IgJz8nIGZvciBub3JtYWxfY21kKCkgKi8KKwlpZiAoYyA9PSBGQUlMKQorCXsKKwkgICAgcmV0dmFsID0gMDsKKwkgICAgZ290byBlbmRfZG9fc2VhcmNoOworCX0KKwlpZiAoc3BhdHNbMF0ub2ZmLmVuZCAmJiBvYXAgIT0gTlVMTCkKKwkgICAgb2FwLT5pbmNsdXNpdmUgPSBUUlVFOyAgLyogJ2UnIGluY2x1ZGVzIGxhc3QgY2hhcmFjdGVyICovCisKKwlyZXR2YWwgPSAxOwkJICAgIC8qIHBhdHRlcm4gZm91bmQgKi8KKworCS8qCisJICogQWRkIGNoYXJhY3RlciBhbmQvb3IgbGluZSBvZmZzZXQKKwkgKi8KKwlpZiAoIShvcHRpb25zICYgU0VBUkNIX05PT0YpIHx8ICpwYXQgPT0gJzsnKQorCXsKKwkgICAgaWYgKHNwYXRzWzBdLm9mZi5saW5lKQkvKiBBZGQgdGhlIG9mZnNldCB0byB0aGUgbGluZSBudW1iZXIuICovCisJICAgIHsKKwkJYyA9IHBvcy5sbnVtICsgc3BhdHNbMF0ub2ZmLm9mZjsKKwkJaWYgKGMgPCAxKQorCQkgICAgcG9zLmxudW0gPSAxOworCQllbHNlIGlmIChjID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCSAgICBwb3MubG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCQllbHNlCisJCSAgICBwb3MubG51bSA9IGM7CisJCXBvcy5jb2wgPSAwOworCisJCXJldHZhbCA9IDI7CSAgICAvKiBwYXR0ZXJuIGZvdW5kLCBsaW5lIG9mZnNldCBhZGRlZCAqLworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiB0byB0aGUgcmlnaHQsIGNoZWNrIGZvciBlbmQgb2YgZmlsZSAqLworCQlpZiAoc3BhdHNbMF0ub2ZmLm9mZiA+IDApCisJCXsKKwkJICAgIGZvciAoYyA9IHNwYXRzWzBdLm9mZi5vZmY7IGM7IC0tYykKKwkJCWlmIChpbmNsKCZwb3MpID09IC0xKQorCQkJICAgIGJyZWFrOworCQl9CisJCS8qIHRvIHRoZSBsZWZ0LCBjaGVjayBmb3Igc3RhcnQgb2YgZmlsZSAqLworCQllbHNlCisJCXsKKwkJICAgIGlmICgoYyA9IHBvcy5jb2wgKyBzcGF0c1swXS5vZmYub2ZmKSA+PSAwKQorCQkJcG9zLmNvbCA9IGM7CisJCSAgICBlbHNlCisJCQlmb3IgKGMgPSBzcGF0c1swXS5vZmYub2ZmOyBjOyArK2MpCisJCQkgICAgaWYgKGRlY2woJnBvcykgPT0gLTEpCisJCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworCS8qCisJICogVGhlIHNlYXJjaCBjb21tYW5kIGNhbiBiZSBmb2xsb3dlZCBieSBhICc7JyB0byBkbyBhbm90aGVyIHNlYXJjaC4KKwkgKiBGb3IgZXhhbXBsZTogIi9wYXQvOy9mb28vKzM7P2JhciIKKwkgKiBUaGlzIGlzIGxpa2UgZG9pbmcgYW5vdGhlciBzZWFyY2ggY29tbWFuZCwgZXhjZXB0OgorCSAqIC0gVGhlIHJlbWVtYmVyZWQgZGlyZWN0aW9uICcvJyBvciAnPycgaXMgZnJvbSB0aGUgZmlyc3Qgc2VhcmNoLgorCSAqIC0gV2hlbiBhbiBlcnJvciBoYXBwZW5zIHRoZSBjdXJzb3IgaXNuJ3QgbW92ZWQgYXQgYWxsLgorCSAqIERvbid0IGRvIHRoaXMgd2hlbiBjYWxsZWQgYnkgZ2V0X2FkZHJlc3MoKSAoaXQgaGFuZGxlcyAnOycgaXRzZWxmKS4KKwkgKi8KKwlpZiAoIShvcHRpb25zICYgU0VBUkNIX09QVCkgfHwgcGF0ID09IE5VTEwgfHwgKnBhdCAhPSAnOycpCisJICAgIGJyZWFrOworCisJZGlyYyA9ICorK3BhdDsKKwlpZiAoZGlyYyAhPSAnPycgJiYgZGlyYyAhPSAnLycpCisJeworCSAgICByZXR2YWwgPSAwOworCSAgICBFTVNHKF8oIkUzODY6IEV4cGVjdGVkICc/JyBvciAnLycgIGFmdGVyICc7JyIpKTsKKwkgICAgZ290byBlbmRfZG9fc2VhcmNoOworCX0KKwkrK3BhdDsKKyAgICB9CisKKyAgICBpZiAob3B0aW9ucyAmIFNFQVJDSF9NQVJLKQorCXNldHBjbWFyaygpOworICAgIGN1cndpbi0+d19jdXJzb3IgPSBwb3M7CisgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CisKK2VuZF9kb19zZWFyY2g6CisgICAgaWYgKG9wdGlvbnMgJiBTRUFSQ0hfS0VFUCkKKwlzcGF0c1swXS5vZmYgPSBvbGRfb2ZmOworICAgIHZpbV9mcmVlKHN0cmNvcHkpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9JTlNfRVhQQU5EKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHNlYXJjaF9mb3JfZXhhY3RfbGluZShidWYsIHBvcywgZGlyLCBwYXQpCisgKgorICogU2VhcmNoIGZvciBhIGxpbmUgc3RhcnRpbmcgd2l0aCB0aGUgZ2l2ZW4gcGF0dGVybiAoaWdub3JpbmcgbGVhZGluZworICogd2hpdGUtc3BhY2UpLCBzdGFydGluZyBmcm9tIHBvcyBhbmQgZ29pbmcgaW4gZGlyZWN0aW9uIGRpci4JcG9zIHdpbGwKKyAqIGNvbnRhaW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXRjaCBmb3VuZC4gICAgQmxhbmsgbGluZXMgbWF0Y2ggb25seSBpZgorICogQURESU5HIGlzIHNldC4gIGlmIHBfaWMgaXMgc2V0IHRoZW4gdGhlIHBhdHRlcm4gbXVzdCBiZSBpbiBsb3dlcmNhc2UuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIG9yIEZBSUwgaWYgbm8gbGluZSBmb3VuZC4KKyAqLworICAgIGludAorc2VhcmNoX2Zvcl9leGFjdF9saW5lKGJ1ZiwgcG9zLCBkaXIsIHBhdCkKKyAgICBidWZfVAkqYnVmOworICAgIHBvc19UCSpwb3M7CisgICAgaW50CQlkaXI7CisgICAgY2hhcl91CSpwYXQ7Cit7CisgICAgbGluZW5yX1QJc3RhcnQgPSAwOworICAgIGNoYXJfdQkqcHRyOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChidWYtPmJfbWwubWxfbGluZV9jb3VudCA9PSAwKQorCXJldHVybiBGQUlMOworICAgIGZvciAoOzspCisgICAgeworCXBvcy0+bG51bSArPSBkaXI7CisJaWYgKHBvcy0+bG51bSA8IDEpCisJeworCSAgICBpZiAocF93cykKKwkgICAgeworCQlwb3MtPmxudW0gPSBidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwkJaWYgKCFzaG9ydG1lc3MoU0hNX1NFQVJDSCkpCisJCSAgICBnaXZlX3dhcm5pbmcoKGNoYXJfdSAqKV8odG9wX2JvdF9tc2cpLCBUUlVFKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJcG9zLT5sbnVtID0gMTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJZWxzZSBpZiAocG9zLT5sbnVtID4gYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBpZiAocF93cykKKwkgICAgeworCQlwb3MtPmxudW0gPSAxOworCQlpZiAoIXNob3J0bWVzcyhTSE1fU0VBUkNIKSkKKwkJICAgIGdpdmVfd2FybmluZygoY2hhcl91ICopXyhib3RfdG9wX21zZyksIFRSVUUpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlwb3MtPmxudW0gPSAxOworCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAocG9zLT5sbnVtID09IHN0YXJ0KQorCSAgICBicmVhazsKKwlpZiAoc3RhcnQgPT0gMCkKKwkgICAgc3RhcnQgPSBwb3MtPmxudW07CisJcHRyID0gbWxfZ2V0X2J1ZihidWYsIHBvcy0+bG51bSwgRkFMU0UpOworCXAgPSBza2lwd2hpdGUocHRyKTsKKwlwb3MtPmNvbCA9IChjb2xucl9UKSAocCAtIHB0cik7CisKKwkvKiB3aGVuIGFkZGluZyBsaW5lcyB0aGUgbWF0Y2hpbmcgbGluZSBtYXkgYmUgZW1wdHkgYnV0IGl0IGlzIG5vdAorCSAqIGlnbm9yZWQgYmVjYXVzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgbmV4dCBsaW5lIC0tIEFjZXZlZG8gKi8KKwlpZiAoKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfQURESU5HKSAmJiAhKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU09MKSkKKwl7CisJICAgIGlmICgocF9pYyA/IE1CX1NUUklDTVAocCwgcGF0KSA6IFNUUkNNUChwLCBwYXQpKSA9PSAwKQorCQlyZXR1cm4gT0s7CisJfQorCWVsc2UgaWYgKCpwICE9IE5VTCkJLyogaWdub3JlIGVtcHR5IGxpbmVzICovCisJewkvKiBleHBhbmRpbmcgbGluZXMgb3Igd29yZHMgKi8KKwkgICAgaWYgKChwX2ljID8gTUJfU1RSTklDTVAocCwgcGF0LCBjb21wbGV0aW9uX2xlbmd0aCkKKwkJCQkgICA6IFNUUk5DTVAocCwgcGF0LCBjb21wbGV0aW9uX2xlbmd0aCkpID09IDApCisJCXJldHVybiBPSzsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUlMOworfQorI2VuZGlmIC8qIEZFQVRfSU5TX0VYUEFORCAqLworCisvKgorICogQ2hhcmFjdGVyIFNlYXJjaGVzCisgKi8KKworLyoKKyAqIFNlYXJjaCBmb3IgYSBjaGFyYWN0ZXIgaW4gYSBsaW5lLiAgSWYgInRfY21kIiBpcyBGQUxTRSwgbW92ZSB0byB0aGUKKyAqIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBtb3ZlIHRvIGp1c3QgYmVmb3JlIHRoZSBjaGFyLgorICogRG8gdGhpcyAiY2FwLT5jb3VudDEiIHRpbWVzLgorICogUmV0dXJuIEZBSUwgb3IgT0suCisgKi8KKyAgICBpbnQKK3NlYXJjaGMoY2FwLCB0X2NtZCkKKyAgICBjbWRhcmdfVAkqY2FwOworICAgIGludAkJdF9jbWQ7Cit7CisgICAgaW50CQkJYyA9IGNhcC0+bmNoYXI7CS8qIGNoYXIgdG8gc2VhcmNoIGZvciAqLworICAgIGludAkJCWRpciA9IGNhcC0+YXJnOwkvKiBUUlVFIGZvciBzZWFyY2hpbmcgZm9yd2FyZCAqLworICAgIGxvbmcJCWNvdW50ID0gY2FwLT5jb3VudDE7CS8qIHJlcGVhdCBjb3VudCAqLworICAgIHN0YXRpYyBpbnQJCWxhc3RjID0gTlVMOwkvKiBsYXN0IGNoYXJhY3RlciBzZWFyY2hlZCBmb3IgKi8KKyAgICBzdGF0aWMgaW50CQlsYXN0Y2RpcjsJLyogbGFzdCBkaXJlY3Rpb24gb2YgY2hhcmFjdGVyIHNlYXJjaCAqLworICAgIHN0YXRpYyBpbnQJCWxhc3RfdF9jbWQ7CS8qIGxhc3Qgc2VhcmNoIHRfY21kICovCisgICAgaW50CQkJY29sOworICAgIGNoYXJfdQkJKnA7CisgICAgaW50CQkJbGVuOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBzdGF0aWMgY2hhcl91CWJ5dGVzW01CX01BWEJZVEVTXTsKKyAgICBzdGF0aWMgaW50CQlieXRlbGVuID0gMTsJLyogPjEgZm9yIG11bHRpLWJ5dGUgY2hhciAqLworI2VuZGlmCisKKyAgICBpZiAoYyAhPSBOVUwpCS8qIG5vcm1hbCBzZWFyY2g6IHJlbWVtYmVyIGFyZ3MgZm9yIHJlcGVhdCAqLworICAgIHsKKwlpZiAoIUtleVN0dWZmZWQpICAgIC8qIGRvbid0IHJlbWVtYmVyIHdoZW4gcmVkb2luZyAqLworCXsKKwkgICAgbGFzdGMgPSBjOworCSAgICBsYXN0Y2RpciA9IGRpcjsKKwkgICAgbGFzdF90X2NtZCA9IHRfY21kOworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgYnl0ZWxlbiA9ICgqbWJfY2hhcjJieXRlcykoYywgYnl0ZXMpOworCSAgICBpZiAoY2FwLT5uY2hhckMxICE9IDApCisJICAgIHsKKwkJYnl0ZWxlbiArPSAoKm1iX2NoYXIyYnl0ZXMpKGNhcC0+bmNoYXJDMSwgYnl0ZXMgKyBieXRlbGVuKTsKKwkJaWYgKGNhcC0+bmNoYXJDMiAhPSAwKQorCQkgICAgYnl0ZWxlbiArPSAoKm1iX2NoYXIyYnl0ZXMpKGNhcC0+bmNoYXJDMiwgYnl0ZXMgKyBieXRlbGVuKTsKKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KKyAgICBlbHNlCQkvKiByZXBlYXQgcHJldmlvdXMgc2VhcmNoICovCisgICAgeworCWlmIChsYXN0YyA9PSBOVUwpCisJICAgIHJldHVybiBGQUlMOworCWlmIChkaXIpCS8qIHJlcGVhdCBpbiBvcHBvc2l0ZSBkaXJlY3Rpb24gKi8KKwkgICAgZGlyID0gLWxhc3RjZGlyOworCWVsc2UKKwkgICAgZGlyID0gbGFzdGNkaXI7CisJdF9jbWQgPSBsYXN0X3RfY21kOworCWMgPSBsYXN0YzsKKwkvKiBGb3IgbXVsdGktYnl0ZSByZS11c2UgbGFzdCBieXRlc1tdIGFuZCBieXRlbGVuLiAqLworICAgIH0KKworICAgIHAgPSBtbF9nZXRfY3VybGluZSgpOworICAgIGNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworICAgIGxlbiA9IChpbnQpU1RSTEVOKHApOworCisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCXsKKwkgICAgZm9yICg7OykKKwkgICAgeworCQlpZiAoZGlyID4gMCkKKwkJeworCQkgICAgY29sICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocCArIGNvbCk7CisJCSAgICBpZiAoY29sID49IGxlbikKKwkJCXJldHVybiBGQUlMOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKGNvbCA9PSAwKQorCQkJcmV0dXJuIEZBSUw7CisJCSAgICBjb2wgLT0gKCptYl9oZWFkX29mZikocCwgcCArIGNvbCAtIDEpICsgMTsKKwkJfQorCQlpZiAoYnl0ZWxlbiA9PSAxKQorCQl7CisJCSAgICBpZiAocFtjb2xdID09IGMpCisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGlmICh2aW1fbWVtY21wKHAgKyBjb2wsIGJ5dGVzLCBieXRlbGVuKSA9PSAwKQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGZvciAoOzspCisJICAgIHsKKwkJaWYgKChjb2wgKz0gZGlyKSA8IDAgfHwgY29sID49IGxlbikKKwkJICAgIHJldHVybiBGQUlMOworCQlpZiAocFtjb2xdID09IGMpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAodF9jbWQpCisgICAgeworCS8qIGJhY2t1cCB0byBiZWZvcmUgdGhlIGNoYXJhY3RlciAocG9zc2libHkgZG91YmxlLWJ5dGUpICovCisJY29sIC09IGRpcjsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwl7CisJICAgIGlmIChkaXIgPCAwKQorCQkvKiBMYW5kZWQgb24gdGhlIHNlYXJjaCBjaGFyIHdoaWNoIGlzIGJ5dGVsZW4gbG9uZyAqLworCQljb2wgKz0gYnl0ZWxlbiAtIDE7CisJICAgIGVsc2UKKwkJLyogVG8gcHJldmlvdXMgY2hhciwgd2hpY2ggbWF5IGJlIG11bHRpLWJ5dGUuICovCisJCWNvbCAtPSAoKm1iX2hlYWRfb2ZmKShwLCBwICsgY29sKTsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSBjb2w7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiAiT3RoZXIiIFNlYXJjaGVzCisgKi8KKworLyoKKyAqIGZpbmRtYXRjaCAtIGZpbmQgdGhlIG1hdGNoaW5nIHBhcmVuIG9yIGJyYWNlCisgKgorICogSW1wcm92ZW1lbnQgb3ZlciB2aTogQnJhY2VzIGluc2lkZSBxdW90ZXMgYXJlIGlnbm9yZWQuCisgKi8KKyAgICBwb3NfVCAqCitmaW5kbWF0Y2gob2FwLCBpbml0YykKKyAgICBvcGFyZ19UICAgKm9hcDsKKyAgICBpbnQJICAgIGluaXRjOworeworICAgIHJldHVybiBmaW5kbWF0Y2hsaW1pdChvYXAsIGluaXRjLCAwLCAwKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgYmVmb3JlICJsaW5lcFtjb2xdIiBlcXVhbHMgImNoIi4KKyAqIFJldHVybiBGQUxTRSBpZiAiY29sIiBpcyB6ZXJvLgorICogVXBkYXRlICIqcHJldmNvbCIgdG8gdGhlIGNvbHVtbiBvZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB1bmxlc3MgInByZXZjb2wiCisgKiBpcyBOVUxMLgorICogSGFuZGxlcyBtdWx0aWJ5dGUgc3RyaW5nIGNvcnJlY3RseS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX3ByZXZjb2wobGluZXAsIGNvbCwgY2gsIHByZXZjb2wpCisgICAgY2hhcl91CSpsaW5lcDsKKyAgICBpbnQJCWNvbDsKKyAgICBpbnQJCWNoOworICAgIGludAkJKnByZXZjb2w7Cit7CisgICAgLS1jb2w7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChjb2wgPiAwICYmIGhhc19tYnl0ZSkKKwljb2wgLT0gKCptYl9oZWFkX29mZikobGluZXAsIGxpbmVwICsgY29sKTsKKyNlbmRpZgorICAgIGlmIChwcmV2Y29sKQorCSpwcmV2Y29sID0gY29sOworICAgIHJldHVybiAoY29sID49IDAgJiYgbGluZXBbY29sXSA9PSBjaCkgPyBUUlVFIDogRkFMU0U7Cit9CisKKy8qCisgKiBmaW5kbWF0Y2hsaW1pdCAtLSBmaW5kIHRoZSBtYXRjaGluZyBwYXJlbiBvciBicmFjZSwgaWYgaXQgZXhpc3RzIHdpdGhpbgorICogbWF4dHJhdmVsIGxpbmVzIG9mIGhlcmUuICBBIG1heHRyYXZlbCBvZiAwIG1lYW5zIHNlYXJjaCB1bnRpbCBmYWxsaW5nIG9mZgorICogdGhlIGVkZ2Ugb2YgdGhlIGZpbGUuCisgKgorICogImluaXRjIiBpcyB0aGUgY2hhcmFjdGVyIHRvIGZpbmQgYSBtYXRjaCBmb3IuICBOVUwgbWVhbnMgdG8gZmluZCB0aGUKKyAqIGNoYXJhY3RlciBhdCBvciBhZnRlciB0aGUgY3Vyc29yLgorICoKKyAqIGZsYWdzOiBGTV9CQUNLV0FSRAlzZWFyY2ggYmFja3dhcmRzICh3aGVuIGluaXRjIGlzICcvJywgJyonIG9yICcjJykKKyAqCSAgRk1fRk9SV0FSRAlzZWFyY2ggZm9yd2FyZHMgKHdoZW4gaW5pdGMgaXMgJy8nLCAnKicgb3IgJyMnKQorICoJICBGTV9CTE9DS1NUT1AJc3RvcCBhdCBzdGFydC9lbmQgb2YgYmxvY2sgKHsgb3IgfSBpbiBjb2x1bW4gMCkKKyAqCSAgRk1fU0tJUENPTU0Jc2tpcCBjb21tZW50cyAobm90IGltcGxlbWVudGVkIHlldCEpCisgKi8KKworICAgIHBvc19UICoKK2ZpbmRtYXRjaGxpbWl0KG9hcCwgaW5pdGMsIGZsYWdzLCBtYXh0cmF2ZWwpCisgICAgb3BhcmdfVAkqb2FwOworICAgIGludAkJaW5pdGM7CisgICAgaW50CQlmbGFnczsKKyAgICBpbnQJCW1heHRyYXZlbDsKK3sKKyAgICBzdGF0aWMgcG9zX1QgcG9zOwkJCS8qIGN1cnJlbnQgc2VhcmNoIHBvc2l0aW9uICovCisgICAgaW50CQlmaW5kYyA9IDA7CQkvKiBtYXRjaGluZyBicmFjZSAqLworICAgIGludAkJYzsKKyAgICBpbnQJCWNvdW50ID0gMDsJCS8qIGN1bXVsYXRpdmUgbnVtYmVyIG9mIGJyYWNlcyAqLworICAgIGludAkJYmFja3dhcmRzID0gRkFMU0U7CS8qIGluaXQgZm9yIGdjYyAqLworICAgIGludAkJaW5xdW90ZSA9IEZBTFNFOwkvKiBUUlVFIHdoZW4gaW5zaWRlIHF1b3RlcyAqLworICAgIGNoYXJfdQkqbGluZXA7CQkJLyogcG9pbnRlciB0byBjdXJyZW50IGxpbmUgKi8KKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWRvX3F1b3RlczsJCS8qIGNoZWNrIGZvciBxdW90ZXMgaW4gY3VycmVudCBsaW5lICovCisgICAgaW50CQlhdF9zdGFydDsJCS8qIGRvX3F1b3RlcyB2YWx1ZSBhdCBzdGFydCBwb3NpdGlvbiAqLworICAgIGludAkJaGFzaF9kaXIgPSAwOwkJLyogRGlyZWN0aW9uIHNlYXJjaGVkIGZvciAjIHRoaW5ncyAqLworICAgIGludAkJY29tbWVudF9kaXIgPSAwOwkvKiBEaXJlY3Rpb24gc2VhcmNoZWQgZm9yIGNvbW1lbnRzICovCisgICAgcG9zX1QJbWF0Y2hfcG9zOwkJLyogV2hlcmUgbGFzdCBzbGFzaC1zdGFyIHdhcyBmb3VuZCAqLworICAgIGludAkJc3RhcnRfaW5fcXVvdGVzOwkvKiBzdGFydCBwb3NpdGlvbiBpcyBpbiBxdW90ZXMgKi8KKyAgICBpbnQJCXRyYXZlbGVkID0gMDsJCS8qIGhvdyBmYXIgd2UndmUgc2VhcmNoZWQgc28gZmFyICovCisgICAgaW50CQlpZ25vcmVfY2VuZCA9IEZBTFNFOyAgICAvKiBpZ25vcmUgY29tbWVudCBlbmQgKi8KKyAgICBpbnQJCWNwb19tYXRjaDsJCS8qIHZpIGNvbXBhdGlibGUgbWF0Y2hpbmcgKi8KKyAgICBpbnQJCWNwb19ic2w7CQkvKiBkb24ndCByZWNvZ25pemUgYmFja3NsYXNoZXMgKi8KKyAgICBpbnQJCW1hdGNoX2VzY2FwZWQgPSAwOwkvKiBzZWFyY2ggZm9yIGVzY2FwZWQgbWF0Y2ggKi8KKyAgICBpbnQJCWRpcjsJCQkvKiBEaXJlY3Rpb24gdG8gc2VhcmNoICovCisgICAgaW50CQljb21tZW50X2NvbCA9IE1BWENPTDsgICAvKiBzdGFydCBvZiAvIC8gY29tbWVudCAqLworCisgICAgcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBsaW5lcCA9IG1sX2dldChwb3MubG51bSk7CisKKyAgICBjcG9fbWF0Y2ggPSAodmltX3N0cmNocihwX2NwbywgQ1BPX01BVENIKSAhPSBOVUxMKTsKKyAgICBjcG9fYnNsID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19NQVRDSEJTTCkgIT0gTlVMTCk7CisKKyAgICAvKiBEaXJlY3Rpb24gdG8gc2VhcmNoIHdoZW4gaW5pdGMgaXMgJy8nLCAnKicgb3IgJyMnICovCisgICAgaWYgKGZsYWdzICYgRk1fQkFDS1dBUkQpCisJZGlyID0gQkFDS1dBUkQ7CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBGTV9GT1JXQVJEKQorCWRpciA9IEZPUldBUkQ7CisgICAgZWxzZQorCWRpciA9IDA7CisKKyAgICAvKgorICAgICAqIGlmIGluaXRjIGdpdmVuLCBsb29rIGluIHRoZSB0YWJsZSBmb3IgdGhlIG1hdGNoaW5nIGNoYXJhY3RlcgorICAgICAqICcvJyBhbmQgJyonIGFyZSBzcGVjaWFsIGNhc2VzOiBsb29rIGZvciBzdGFydCBvciBlbmQgb2YgY29tbWVudC4KKyAgICAgKiBXaGVuICcvJyBpcyB1c2VkLCB3ZSBpZ25vcmUgcnVubmluZyBiYWNrd2FyZHMgaW50byBhbiBzdGFyLXNsYXNoLCBmb3IKKyAgICAgKiAiWyoiIGNvbW1hbmQsIHdlIGp1c3Qgd2FudCB0byBmaW5kIGFueSBjb21tZW50LgorICAgICAqLworICAgIGlmIChpbml0YyA9PSAnLycgfHwgaW5pdGMgPT0gJyonKQorICAgIHsKKwljb21tZW50X2RpciA9IGRpcjsKKwlpZiAoaW5pdGMgPT0gJy8nKQorCSAgICBpZ25vcmVfY2VuZCA9IFRSVUU7CisJYmFja3dhcmRzID0gKGRpciA9PSBGT1JXQVJEKSA/IEZBTFNFIDogVFJVRTsKKwlpbml0YyA9IE5VTDsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5pdGMgIT0gJyMnICYmIGluaXRjICE9IE5VTCkKKyAgICB7CisJLyogJ21hdGNocGFpcnMnIGlzICJ4OnkseDp5IiAqLworCWZvciAocHRyID0gY3VyYnVmLT5iX3BfbXBzOyAqcHRyOyBwdHIgKz0gMikKKwl7CisJICAgIGlmICgqcHRyID09IGluaXRjKQorCSAgICB7CisJCWZpbmRjID0gaW5pdGM7CisJCWluaXRjID0gcHRyWzJdOworCQliYWNrd2FyZHMgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCSAgICBwdHIgKz0gMjsKKwkgICAgaWYgKCpwdHIgPT0gaW5pdGMpCisJICAgIHsKKwkJZmluZGMgPSBpbml0YzsKKwkJaW5pdGMgPSBwdHJbLTJdOworCQliYWNrd2FyZHMgPSBGQUxTRTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHB0clsxXSAhPSAnLCcpCisJCWJyZWFrOworCX0KKwlpZiAoIWZpbmRjKQkJLyogaW52YWxpZCBpbml0YyEgKi8KKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qCisgICAgICogRWl0aGVyIGluaXRjIGlzICcjJywgb3Igbm8gaW5pdGMgd2FzIGdpdmVuIGFuZCB3ZSBuZWVkIHRvIGxvb2sgdW5kZXIgdGhlCisgICAgICogY3Vyc29yLgorICAgICAqLworICAgIGVsc2UKKyAgICB7CisJaWYgKGluaXRjID09ICcjJykKKwl7CisJICAgIGhhc2hfZGlyID0gZGlyOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBpbml0YyB3YXMgbm90IGdpdmVuLCBtdXN0IGxvb2sgZm9yIHNvbWV0aGluZyB0byBtYXRjaCB1bmRlcgorCSAgICAgKiBvciBuZWFyIHRoZSBjdXJzb3IuCisJICAgICAqIE9ubHkgY2hlY2sgZm9yIHNwZWNpYWwgdGhpbmdzIHdoZW4gJ2NwbycgZG9lc24ndCBoYXZlICclJy4KKwkgICAgICovCisJICAgIGlmICghY3BvX21hdGNoKQorCSAgICB7CisJCS8qIEFyZSB3ZSBiZWZvcmUgb3IgYXQgI2lmLCAjZWxzZSBldGMuPyAqLworCQlwdHIgPSBza2lwd2hpdGUobGluZXApOworCQlpZiAoKnB0ciA9PSAnIycgJiYgcG9zLmNvbCA8PSAoY29sbnJfVCkocHRyIC0gbGluZXApKQorCQl7CisJCSAgICBwdHIgPSBza2lwd2hpdGUocHRyICsgMSk7CisJCSAgICBpZiAoICAgU1RSTkNNUChwdHIsICJpZiIsIDIpID09IDAKKwkJCXx8IFNUUk5DTVAocHRyLCAiZW5kaWYiLCA1KSA9PSAwCisJCQl8fCBTVFJOQ01QKHB0ciwgImVsIiwgMikgPT0gMCkKKwkJCWhhc2hfZGlyID0gMTsKKwkJfQorCisJCS8qIEFyZSB3ZSBvbiBhIGNvbW1lbnQ/ICovCisJCWVsc2UgaWYgKGxpbmVwW3Bvcy5jb2xdID09ICcvJykKKwkJeworCQkgICAgaWYgKGxpbmVwW3Bvcy5jb2wgKyAxXSA9PSAnKicpCisJCSAgICB7CisJCQljb21tZW50X2RpciA9IEZPUldBUkQ7CisJCQliYWNrd2FyZHMgPSBGQUxTRTsKKwkJCXBvcy5jb2wrKzsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKHBvcy5jb2wgPiAwICYmIGxpbmVwW3Bvcy5jb2wgLSAxXSA9PSAnKicpCisJCSAgICB7CisJCQljb21tZW50X2RpciA9IEJBQ0tXQVJEOworCQkJYmFja3dhcmRzID0gVFJVRTsKKwkJCXBvcy5jb2wtLTsKKwkJICAgIH0KKwkJfQorCQllbHNlIGlmIChsaW5lcFtwb3MuY29sXSA9PSAnKicpCisJCXsKKwkJICAgIGlmIChsaW5lcFtwb3MuY29sICsgMV0gPT0gJy8nKQorCQkgICAgeworCQkJY29tbWVudF9kaXIgPSBCQUNLV0FSRDsKKwkJCWJhY2t3YXJkcyA9IFRSVUU7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChwb3MuY29sID4gMCAmJiBsaW5lcFtwb3MuY29sIC0gMV0gPT0gJy8nKQorCQkgICAgeworCQkJY29tbWVudF9kaXIgPSBGT1JXQVJEOworCQkJYmFja3dhcmRzID0gRkFMU0U7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIHdlIGFyZSBub3Qgb24gYSBjb21tZW50IG9yIHRoZSAjIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsIHRoZW4KKwkgICAgICogbG9vayBmb3IgYnJhY2UgYW55d2hlcmUgb24gdGhpcyBsaW5lIGFmdGVyIHRoZSBjdXJzb3IuCisJICAgICAqLworCSAgICBpZiAoIWhhc2hfZGlyICYmICFjb21tZW50X2RpcikKKwkgICAgeworCQkvKgorCQkgKiBGaW5kIHRoZSBicmFjZSB1bmRlciBvciBhZnRlciB0aGUgY3Vyc29yLgorCQkgKiBJZiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGluZSwgdXNlIHRoZSBsYXN0IGNoYXJhY3RlciBpbgorCQkgKiB0aGUgbGluZS4KKwkJICovCisJCWlmIChsaW5lcFtwb3MuY29sXSA9PSBOVUwgJiYgcG9zLmNvbCkKKwkJICAgIC0tcG9zLmNvbDsKKwkJZm9yICg7OykKKwkJeworCQkgICAgaW5pdGMgPSBsaW5lcFtwb3MuY29sXTsKKwkJICAgIGlmIChpbml0YyA9PSBOVUwpCisJCQlicmVhazsKKworCQkgICAgZm9yIChwdHIgPSBjdXJidWYtPmJfcF9tcHM7ICpwdHI7ICsrcHRyKQorCQkgICAgeworCQkJaWYgKCpwdHIgPT0gaW5pdGMpCisJCQl7CisJCQkgICAgZmluZGMgPSBwdHJbMl07CisJCQkgICAgYmFja3dhcmRzID0gRkFMU0U7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQlwdHIgKz0gMjsKKwkJCWlmICgqcHRyID09IGluaXRjKQorCQkJeworCQkJICAgIGZpbmRjID0gcHRyWy0yXTsKKwkJCSAgICBiYWNrd2FyZHMgPSBUUlVFOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJaWYgKCEqKytwdHIpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCSAgICBpZiAoZmluZGMpCisJCQlicmVhazsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJcG9zLmNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGxpbmVwICsgcG9zLmNvbCk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCSsrcG9zLmNvbDsKKwkJfQorCQlpZiAoIWZpbmRjKQorCQl7CisJCSAgICAvKiBubyBicmFjZSBpbiB0aGUgbGluZSwgbWF5YmUgdXNlICIgICNpZiIgdGhlbiAqLworCQkgICAgaWYgKCFjcG9fbWF0Y2ggJiYgKnNraXB3aGl0ZShsaW5lcCkgPT0gJyMnKQorCQkJaGFzaF9kaXIgPSAxOworCQkgICAgZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZWxzZSBpZiAoIWNwb19ic2wpCisJCXsKKwkJICAgIGludCBjb2wsIGJzbGNudCA9IDA7CisKKwkJICAgIC8qIFNldCAibWF0Y2hfZXNjYXBlZCIgaWYgdGhlcmUgYXJlIGFuIG9kZCBudW1iZXIgb2YKKwkJICAgICAqIGJhY2tzbGFzaGVzLiAqLworCQkgICAgZm9yIChjb2wgPSBwb3MuY29sOyBjaGVja19wcmV2Y29sKGxpbmVwLCBjb2wsICdcXCcsICZjb2wpOykKKwkJCWJzbGNudCsrOworCQkgICAgbWF0Y2hfZXNjYXBlZCA9IChic2xjbnQgJiAxKTsKKwkJfQorCSAgICB9CisJfQorCWlmIChoYXNoX2RpcikKKwl7CisJICAgIC8qCisJICAgICAqIExvb2sgZm9yIG1hdGNoaW5nICNpZiwgI2Vsc2UsICNlbGlmLCBvciAjZW5kaWYKKwkgICAgICovCisJICAgIGlmIChvYXAgIT0gTlVMTCkKKwkJb2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOyAgIC8qIExpbmV3aXNlIGZvciB0aGlzIGNhc2Ugb25seSAqLworCSAgICBpZiAoaW5pdGMgIT0gJyMnKQorCSAgICB7CisJCXB0ciA9IHNraXB3aGl0ZShza2lwd2hpdGUobGluZXApICsgMSk7CisJCWlmIChTVFJOQ01QKHB0ciwgImlmIiwgMikgPT0gMCB8fCBTVFJOQ01QKHB0ciwgImVsIiwgMikgPT0gMCkKKwkJICAgIGhhc2hfZGlyID0gMTsKKwkJZWxzZSBpZiAoU1RSTkNNUChwdHIsICJlbmRpZiIsIDUpID09IDApCisJCSAgICBoYXNoX2RpciA9IC0xOworCQllbHNlCisJCSAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgICBwb3MuY29sID0gMDsKKwkgICAgd2hpbGUgKCFnb3RfaW50KQorCSAgICB7CisJCWlmIChoYXNoX2RpciA+IDApCisJCXsKKwkJICAgIGlmIChwb3MubG51bSA9PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKHBvcy5sbnVtID09IDEpCisJCSAgICBicmVhazsKKwkJcG9zLmxudW0gKz0gaGFzaF9kaXI7CisJCWxpbmVwID0gbWxfZ2V0KHBvcy5sbnVtKTsKKwkJbGluZV9icmVha2NoZWNrKCk7CS8qIGNoZWNrIGZvciBDVFJMLUMgdHlwZWQgKi8KKwkJcHRyID0gc2tpcHdoaXRlKGxpbmVwKTsKKwkJaWYgKCpwdHIgIT0gJyMnKQorCQkgICAgY29udGludWU7CisJCXBvcy5jb2wgPSAoY29sbnJfVCkgKHB0ciAtIGxpbmVwKTsKKwkJcHRyID0gc2tpcHdoaXRlKHB0ciArIDEpOworCQlpZiAoaGFzaF9kaXIgPiAwKQorCQl7CisJCSAgICBpZiAoU1RSTkNNUChwdHIsICJpZiIsIDIpID09IDApCisJCQljb3VudCsrOworCQkgICAgZWxzZSBpZiAoU1RSTkNNUChwdHIsICJlbCIsIDIpID09IDApCisJCSAgICB7CisJCQlpZiAoY291bnQgPT0gMCkKKwkJCSAgICByZXR1cm4gJnBvczsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKFNUUk5DTVAocHRyLCAiZW5kaWYiLCA1KSA9PSAwKQorCQkgICAgeworCQkJaWYgKGNvdW50ID09IDApCisJCQkgICAgcmV0dXJuICZwb3M7CisJCQljb3VudC0tOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKFNUUk5DTVAocHRyLCAiaWYiLCAyKSA9PSAwKQorCQkgICAgeworCQkJaWYgKGNvdW50ID09IDApCisJCQkgICAgcmV0dXJuICZwb3M7CisJCQljb3VudC0tOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAoaW5pdGMgPT0gJyMnICYmIFNUUk5DTVAocHRyLCAiZWwiLCAyKSA9PSAwKQorCQkgICAgeworCQkJaWYgKGNvdW50ID09IDApCisJCQkgICAgcmV0dXJuICZwb3M7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChTVFJOQ01QKHB0ciwgImVuZGlmIiwgNSkgPT0gMCkKKwkJCWNvdW50Kys7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICAvKiBUaGlzIGlzIGp1c3QgZ3Vlc3Npbmc6IHdoZW4gJ3JpZ2h0bGVmdCcgaXMgc2V0LCBzZWFyY2ggZm9yIGEgbWFjaGluZworICAgICAqIHBhcmVuL2JyYWNlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uICovCisgICAgaWYgKGN1cndpbi0+d19wX3JsICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIoKVtde308PiIsIGluaXRjKSAhPSBOVUxMKQorCWJhY2t3YXJkcyA9ICFiYWNrd2FyZHM7CisjZW5kaWYKKworICAgIGRvX3F1b3RlcyA9IC0xOworICAgIHN0YXJ0X2luX3F1b3RlcyA9IE1BWUJFOworICAgIC8qIGJhY2t3YXJkIHNlYXJjaDogQ2hlY2sgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgc2luZ2xlLWxpbmUgY29tbWVudCAqLworICAgIGlmIChiYWNrd2FyZHMgJiYgY29tbWVudF9kaXIpCisJY29tbWVudF9jb2wgPSBjaGVja19saW5lY29tbWVudChsaW5lcCk7CisgICAgd2hpbGUgKCFnb3RfaW50KQorICAgIHsKKwkvKgorCSAqIEdvIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBmb3J3YXJkIG9yIGJhY2t3YXJkLiBXZSBjb3VsZCB1c2UKKwkgKiBpbmMoKSBhbmQgZGVjKCkgaGVyZSwgYnV0IHRoYXQgaXMgbXVjaCBzbG93ZXIKKwkgKi8KKwlpZiAoYmFja3dhcmRzKQorCXsKKwkgICAgaWYgKHBvcy5jb2wgPT0gMCkJCS8qIGF0IHN0YXJ0IG9mIGxpbmUsIGdvIHRvIHByZXYuIG9uZSAqLworCSAgICB7CisJCWlmIChwb3MubG51bSA9PSAxKQkvKiBzdGFydCBvZiBmaWxlICovCisJCSAgICBicmVhazsKKwkJLS1wb3MubG51bTsKKworCQlpZiAobWF4dHJhdmVsICYmIHRyYXZlbGVkKysgPiBtYXh0cmF2ZWwpCisJCSAgICBicmVhazsKKworCQlsaW5lcCA9IG1sX2dldChwb3MubG51bSk7CisJCXBvcy5jb2wgPSAoY29sbnJfVClTVFJMRU4obGluZXApOyAvKiBwb3MuY29sIG9uIHRyYWlsaW5nIE5VTCAqLworCQlkb19xdW90ZXMgPSAtMTsKKwkJbGluZV9icmVha2NoZWNrKCk7CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgc2luZ2xlLWxpbmUgY29tbWVudCAqLworCQlpZiAoY29tbWVudF9kaXIpCisJCSAgICBjb21tZW50X2NvbCA9IGNoZWNrX2xpbmVjb21tZW50KGxpbmVwKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLS1wb3MuY29sOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKKwkJICAgIHBvcy5jb2wgLT0gKCptYl9oZWFkX29mZikobGluZXAsIGxpbmVwICsgcG9zLmNvbCk7CisjZW5kaWYKKwkgICAgfQorCX0KKwllbHNlCQkJCS8qIGZvcndhcmQgc2VhcmNoICovCisJeworCSAgICBpZiAobGluZXBbcG9zLmNvbF0gPT0gTlVMKQkvKiBhdCBlbmQgb2YgbGluZSwgZ28gdG8gbmV4dCBvbmUgKi8KKwkgICAgeworCQlpZiAocG9zLmxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpIC8qIGVuZCBvZiBmaWxlICovCisJCSAgICBicmVhazsKKwkJKytwb3MubG51bTsKKworCQlpZiAobWF4dHJhdmVsICYmIHRyYXZlbGVkKysgPiBtYXh0cmF2ZWwpCisJCSAgICBicmVhazsKKworCQlsaW5lcCA9IG1sX2dldChwb3MubG51bSk7CisJCXBvcy5jb2wgPSAwOworCQlkb19xdW90ZXMgPSAtMTsKKwkJbGluZV9icmVha2NoZWNrKCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQkgICAgcG9zLmNvbCArPSAoKm1iX3B0cjJsZW5fY2hlY2spKGxpbmVwICsgcG9zLmNvbCk7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgKytwb3MuY29sOworCSAgICB9CisJfQorCisJLyoKKwkgKiBJZiBGTV9CTE9DS1NUT1AgZ2l2ZW4sIHN0b3AgYXQgYSAneycgb3IgJ30nIGluIGNvbHVtbiAwLgorCSAqLworCWlmIChwb3MuY29sID09IDAgJiYgKGZsYWdzICYgRk1fQkxPQ0tTVE9QKSAmJgorCQkJCQkgKGxpbmVwWzBdID09ICd7JyB8fCBsaW5lcFswXSA9PSAnfScpKQorCXsKKwkgICAgaWYgKGxpbmVwWzBdID09IGZpbmRjICYmIGNvdW50ID09IDApCS8qIG1hdGNoISAqLworCQlyZXR1cm4gJnBvczsKKwkgICAgYnJlYWs7CQkJCQkvKiBvdXQgb2Ygc2NvcGUgKi8KKwl9CisKKwlpZiAoY29tbWVudF9kaXIpCisJeworCSAgICAvKiBOb3RlOiBjb21tZW50cyBkbyBub3QgbmVzdCwgYW5kIHdlIGlnbm9yZSBxdW90ZXMgaW4gdGhlbSAqLworCSAgICAvKiBUT0RPOiBpZ25vcmUgY29tbWVudCBicmFja2V0cyBpbnNpZGUgc3RyaW5ncyAqLworCSAgICBpZiAoY29tbWVudF9kaXIgPT0gRk9SV0FSRCkKKwkgICAgeworCQlpZiAobGluZXBbcG9zLmNvbF0gPT0gJyonICYmIGxpbmVwW3Bvcy5jb2wgKyAxXSA9PSAnLycpCisJCXsKKwkJICAgIHBvcy5jb2wrKzsKKwkJICAgIHJldHVybiAmcG9zOworCQl9CisJICAgIH0KKwkgICAgZWxzZSAgICAvKiBTZWFyY2hpbmcgYmFja3dhcmRzICovCisJICAgIHsKKwkJLyoKKwkJICogQSBjb21tZW50IG1heSBjb250YWluIC8gKiBvciAvIC8sIGl0IG1heSBhbHNvIHN0YXJ0IG9yIGVuZAorCQkgKiB3aXRoIC8gKiAvLglJZ25vcmUgYSAvICogYWZ0ZXIgLyAvLgorCQkgKi8KKwkJaWYgKHBvcy5jb2wgPT0gMCkKKwkJICAgIGNvbnRpbnVlOworCQllbHNlIGlmICggIGxpbmVwW3Bvcy5jb2wgLSAxXSA9PSAnLycKKwkJCSYmIGxpbmVwW3Bvcy5jb2xdID09ICcqJworCQkJJiYgKGludClwb3MuY29sIDwgY29tbWVudF9jb2wpCisJCXsKKwkJICAgIGNvdW50Kys7CisJCSAgICBtYXRjaF9wb3MgPSBwb3M7CisJCSAgICBtYXRjaF9wb3MuY29sLS07CisJCX0KKwkJZWxzZSBpZiAobGluZXBbcG9zLmNvbCAtIDFdID09ICcqJyAmJiBsaW5lcFtwb3MuY29sXSA9PSAnLycpCisJCXsKKwkJICAgIGlmIChjb3VudCA+IDApCisJCQlwb3MgPSBtYXRjaF9wb3M7CisJCSAgICBlbHNlIGlmIChwb3MuY29sID4gMSAmJiBsaW5lcFtwb3MuY29sIC0gMl0gPT0gJy8nCisJCQkJCSAgICAgICAmJiAoaW50KXBvcy5jb2wgPD0gY29tbWVudF9jb2wpCisJCQlwb3MuY29sIC09IDI7CisJCSAgICBlbHNlIGlmIChpZ25vcmVfY2VuZCkKKwkJCWNvbnRpbnVlOworCQkgICAgZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCSAgICByZXR1cm4gJnBvczsKKwkJfQorCSAgICB9CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qCisJICogSWYgc21hcnQgbWF0Y2hpbmcgKCdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJyUnKSwgYnJhY2VzIGluc2lkZQorCSAqIG9mIHF1b3RlcyBhcmUgaWdub3JlZCwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgYW4gZXZlbiBudW1iZXIgb2YKKwkgKiBxdW90ZXMgaW4gdGhlIGxpbmUuCisJICovCisJaWYgKGNwb19tYXRjaCkKKwkgICAgZG9fcXVvdGVzID0gMDsKKwllbHNlIGlmIChkb19xdW90ZXMgPT0gLTEpCisJeworCSAgICAvKgorCSAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHF1b3RlcyBpbiB0aGUgbGluZSwgc2tpcHBpbmcgXCIgYW5kICciJy4KKwkgICAgICogV2F0Y2ggb3V0IGZvciAiXFwiLgorCSAgICAgKi8KKwkgICAgYXRfc3RhcnQgPSBkb19xdW90ZXM7CisJICAgIGZvciAocHRyID0gbGluZXA7ICpwdHI7ICsrcHRyKQorCSAgICB7CisJCWlmIChwdHIgPT0gbGluZXAgKyBwb3MuY29sICsgYmFja3dhcmRzKQorCQkgICAgYXRfc3RhcnQgPSAoZG9fcXVvdGVzICYgMSk7CisJCWlmICgqcHRyID09ICciJworCQkJJiYgKHB0ciA9PSBsaW5lcCB8fCBwdHJbLTFdICE9ICdcJycgfHwgcHRyWzFdICE9ICdcJycpKQorCQkgICAgKytkb19xdW90ZXM7CisJCWlmICgqcHRyID09ICdcXCcgJiYgcHRyWzFdICE9IE5VTCkKKwkJICAgICsrcHRyOworCSAgICB9CisJICAgIGRvX3F1b3RlcyAmPSAxOwkgICAgLyogcmVzdWx0IGlzIDEgd2l0aCBldmVuIG51bWJlciBvZiBxdW90ZXMgKi8KKworCSAgICAvKgorCSAgICAgKiBJZiB3ZSBmaW5kIGFuIHVuZXZlbiBjb3VudCwgY2hlY2sgY3VycmVudCBsaW5lIGFuZCBwcmV2aW91cworCSAgICAgKiBvbmUgZm9yIGEgJ1wnIGF0IHRoZSBlbmQuCisJICAgICAqLworCSAgICBpZiAoIWRvX3F1b3RlcykKKwkgICAgeworCQlpbnF1b3RlID0gRkFMU0U7CisJCWlmIChwdHJbLTFdID09ICdcXCcpCisJCXsKKwkJICAgIGRvX3F1b3RlcyA9IDE7CisJCSAgICBpZiAoc3RhcnRfaW5fcXVvdGVzID09IE1BWUJFKQorCQkgICAgeworCQkJLyogRG8gd2UgbmVlZCB0byB1c2UgYXRfc3RhcnQgaGVyZT8gKi8KKwkJCWlucXVvdGUgPSBUUlVFOworCQkJc3RhcnRfaW5fcXVvdGVzID0gVFJVRTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGJhY2t3YXJkcykKKwkJCWlucXVvdGUgPSBUUlVFOworCQl9CisJCWlmIChwb3MubG51bSA+IDEpCisJCXsKKwkJICAgIHB0ciA9IG1sX2dldChwb3MubG51bSAtIDEpOworCQkgICAgaWYgKCpwdHIgJiYgKihwdHIgKyBTVFJMRU4ocHRyKSAtIDEpID09ICdcXCcpCisJCSAgICB7CisJCQlkb19xdW90ZXMgPSAxOworCQkJaWYgKHN0YXJ0X2luX3F1b3RlcyA9PSBNQVlCRSkKKwkJCXsKKwkJCSAgICBpbnF1b3RlID0gYXRfc3RhcnQ7CisJCQkgICAgaWYgKGlucXVvdGUpCisJCQkJc3RhcnRfaW5fcXVvdGVzID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFiYWNrd2FyZHMpCisJCQkgICAgaW5xdW90ZSA9IFRSVUU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlpZiAoc3RhcnRfaW5fcXVvdGVzID09IE1BWUJFKQorCSAgICBzdGFydF9pbl9xdW90ZXMgPSBGQUxTRTsKKworCS8qCisJICogSWYgJ3NtYXJ0bWF0Y2gnIGlzIHNldDoKKwkgKiAgIFRoaW5ncyBpbnNpZGUgcXVvdGVzIGFyZSBpZ25vcmVkIGJ5IHNldHRpbmcgJ2lucXVvdGUnLiAgSWYgd2UKKwkgKiAgIGZpbmQgYSBxdW90ZSB3aXRob3V0IGEgcHJlY2VkaW5nICdcJyBpbnZlcnQgJ2lucXVvdGUnLiAgQXQgdGhlCisJICogICBlbmQgb2YgYSBsaW5lIG5vdCBlbmRpbmcgaW4gJ1wnIHdlIHJlc2V0ICdpbnF1b3RlJy4KKwkgKgorCSAqICAgSW4gbGluZXMgd2l0aCBhbiB1bmV2ZW4gbnVtYmVyIG9mIHF1b3RlcyAod2l0aG91dCBwcmVjZWRpbmcgJ1wnKQorCSAqICAgd2UgZG8gbm90IGtub3cgd2hpY2ggcGFydCB0byBpZ25vcmUuIFRoZXJlZm9yZSB3ZSBvbmx5IHNldAorCSAqICAgaW5xdW90ZSBpZiB0aGUgbnVtYmVyIG9mIHF1b3RlcyBpbiBhIGxpbmUgaXMgZXZlbiwgdW5sZXNzIHRoaXMKKwkgKiAgIGxpbmUgb3IgdGhlIHByZXZpb3VzIG9uZSBlbmRzIGluIGEgJ1wnLiAgQ29tcGxpY2F0ZWQsIGlzbid0IGl0PworCSAqLworCXN3aXRjaCAoYyA9IGxpbmVwW3Bvcy5jb2xdKQorCXsKKwljYXNlIE5VTDoKKwkgICAgLyogYXQgZW5kIG9mIGxpbmUgd2l0aG91dCB0cmFpbGluZyBiYWNrc2xhc2gsIHJlc2V0IGlucXVvdGUgKi8KKwkgICAgaWYgKHBvcy5jb2wgPT0gMCB8fCBsaW5lcFtwb3MuY29sIC0gMV0gIT0gJ1xcJykKKwkgICAgeworCQlpbnF1b3RlID0gRkFMU0U7CisJCXN0YXJ0X2luX3F1b3RlcyA9IEZBTFNFOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnIic6CisJICAgIC8qIGEgcXVvdGUgdGhhdCBpcyBwcmVjZWRlZCB3aXRoIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMgaXMKKwkgICAgICogaWdub3JlZCAqLworCSAgICBpZiAoZG9fcXVvdGVzKQorCSAgICB7CisJCWludCBjb2w7CisKKwkJZm9yIChjb2wgPSBwb3MuY29sIC0gMTsgY29sID49IDA7IC0tY29sKQorCQkgICAgaWYgKGxpbmVwW2NvbF0gIT0gJ1xcJykKKwkJCWJyZWFrOworCQlpZiAoKCgoaW50KXBvcy5jb2wgLSAxIC0gY29sKSAmIDEpID09IDApCisJCXsKKwkJICAgIGlucXVvdGUgPSAhaW5xdW90ZTsKKwkJICAgIHN0YXJ0X2luX3F1b3RlcyA9IEZBTFNFOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkvKgorCSAqIElmIHNtYXJ0IG1hdGNoaW5nICgnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICclJyk6CisJICogICBTa2lwIHRoaW5ncyBpbiBzaW5nbGUgcXVvdGVzOiAneCcgb3IgJ1x4Jy4gIEJlIGNhcmVmdWwgZm9yIHNpbmdsZQorCSAqICAgc2luZ2xlIHF1b3RlcywgZWcgam9uJ3MuICBUaGluZ3MgbGlrZSAnXDIzMycgb3IgJ1x4M2YnIGFyZSBub3QKKwkgKiAgIHNraXBwZWQsIHRoZXJlIGlzIG5ldmVyIGEgYnJhY2UgaW4gdGhlbS4KKwkgKiAgIElnbm9yZSB0aGlzIHdoZW4gZmluZGluZyBtYXRjaGVzIGZvciBgJy4KKwkgKi8KKwljYXNlICdcJyc6CisJICAgIGlmICghY3BvX21hdGNoICYmIGluaXRjICE9ICdcJycgJiYgZmluZGMgIT0gJ1wnJykKKwkgICAgeworCQlpZiAoYmFja3dhcmRzKQorCQl7CisJCSAgICBpZiAocG9zLmNvbCA+IDEpCisJCSAgICB7CisJCQlpZiAobGluZXBbcG9zLmNvbCAtIDJdID09ICdcJycpCisJCQl7CisJCQkgICAgcG9zLmNvbCAtPSAyOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAobGluZXBbcG9zLmNvbCAtIDJdID09ICdcXCcgJiYKKwkJCQkgICAgcG9zLmNvbCA+IDIgJiYgbGluZXBbcG9zLmNvbCAtIDNdID09ICdcJycpCisJCQl7CisJCQkgICAgcG9zLmNvbCAtPSAzOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJCWVsc2UgaWYgKGxpbmVwW3Bvcy5jb2wgKyAxXSkJLyogZm9yd2FyZCBzZWFyY2ggKi8KKwkJeworCQkgICAgaWYgKGxpbmVwW3Bvcy5jb2wgKyAxXSA9PSAnXFwnICYmCisJCQkgICAgbGluZXBbcG9zLmNvbCArIDJdICYmIGxpbmVwW3Bvcy5jb2wgKyAzXSA9PSAnXCcnKQorCQkgICAgeworCQkJcG9zLmNvbCArPSAzOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChsaW5lcFtwb3MuY29sICsgMl0gPT0gJ1wnJykKKwkJICAgIHsKKwkJCXBvcy5jb2wgKz0gMjsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgLyogRkFMTFRIUk9VR0ggKi8KKworCWRlZmF1bHQ6CisjaWZkZWYgRkVBVF9MSVNQCisJICAgIC8qIEZvciBMaXNwIHNraXAgb3ZlciBiYWNrc2xhc2hlZCAoKSwge30gYW5kIFtdLiAqLworCSAgICBpZiAoY3VyYnVmLT5iX3BfbGlzcAorCQkgICAgJiYgdmltX3N0cmNocigoY2hhcl91ICopIigpe31bXSIsIGMpICE9IE5VTEwKKwkJICAgICYmIHBvcy5jb2wgPiAwCisJCSAgICAmJiBjaGVja19wcmV2Y29sKGxpbmVwLCBwb3MuY29sLCAnXFwnLCBOVUxMKSkKKwkJYnJlYWs7CisjZW5kaWYKKworCSAgICAvKiBDaGVjayBmb3IgbWF0Y2ggb3V0c2lkZSBvZiBxdW90ZXMsIGFuZCBpbnNpZGUgb2YKKwkgICAgICogcXVvdGVzIHdoZW4gdGhlIHN0YXJ0IGlzIGFsc28gaW5zaWRlIG9mIHF1b3Rlcy4gKi8KKwkgICAgaWYgKCghaW5xdW90ZSB8fCBzdGFydF9pbl9xdW90ZXMgPT0gVFJVRSkKKwkJICAgICYmIChjID09IGluaXRjIHx8IGMgPT0gZmluZGMpKQorCSAgICB7CisJCWludAljb2wsIGJzbGNudCA9IDA7CisKKwkJaWYgKCFjcG9fYnNsKQorCQl7CisJCSAgICBmb3IgKGNvbCA9IHBvcy5jb2w7IGNoZWNrX3ByZXZjb2wobGluZXAsIGNvbCwgJ1xcJywgJmNvbCk7KQorCQkJYnNsY250Kys7CisJCX0KKwkJLyogT25seSBhY2NlcHQgYSBtYXRjaCB3aGVuICdNJyBpcyBpbiAnY3BvJyBvciB3aGVuIGVjYXBpbmcgaXMKKwkJICogd2hhdCB3ZSBleHBlY3QuICovCisJCWlmIChjcG9fYnNsIHx8IChic2xjbnQgJiAxKSA9PSBtYXRjaF9lc2NhcGVkKQorCQl7CisJCSAgICBpZiAoYyA9PSBpbml0YykKKwkJCWNvdW50Kys7CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpZiAoY291bnQgPT0gMCkKKwkJCSAgICByZXR1cm4gJnBvczsKKwkJCWNvdW50LS07CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoY29tbWVudF9kaXIgPT0gQkFDS1dBUkQgJiYgY291bnQgPiAwKQorICAgIHsKKwlwb3MgPSBtYXRjaF9wb3M7CisJcmV0dXJuICZwb3M7CisgICAgfQorICAgIHJldHVybiAocG9zX1QgKilOVUxMOwkvKiBuZXZlciBmb3VuZCBpdCAqLworfQorCisvKgorICogQ2hlY2sgaWYgbGluZVtdIGNvbnRhaW5zIGEgLyAvIGNvbW1lbnQuCisgKiBSZXR1cm4gTUFYQ09MIGlmIG5vdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgY29sdW1uLgorICogVE9ETzogc2tpcCBzdHJpbmdzLgorICovCisgICAgc3RhdGljIGludAorY2hlY2tfbGluZWNvbW1lbnQobGluZSkKKyAgICBjaGFyX3UJKmxpbmU7Cit7CisgICAgY2hhcl91ICAqcDsKKworICAgIHAgPSBsaW5lOworICAgIHdoaWxlICgocCA9IHZpbV9zdHJjaHIocCwgJy8nKSkgIT0gTlVMTCkKKyAgICB7CisJaWYgKHBbMV0gPT0gJy8nKQorCSAgICBicmVhazsKKwkrK3A7CisgICAgfQorCisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm4gTUFYQ09MOworICAgIHJldHVybiAoaW50KShwIC0gbGluZSk7Cit9CisKKy8qCisgKiBNb3ZlIGN1cnNvciBicmllZmx5IHRvIGNoYXJhY3RlciBtYXRjaGluZyB0aGUgb25lIHVuZGVyIHRoZSBjdXJzb3IuCisgKiBVc2VkIGZvciBJbnNlcnQgbW9kZSBhbmQgInIiIGNvbW1hbmQuCisgKiBTaG93IHRoZSBtYXRjaCBvbmx5IGlmIGl0IGlzIHZpc2libGUgb24gdGhlIHNjcmVlbi4KKyAqIElmIHRoZXJlIGlzbid0IGEgbWF0Y2gsIHRoZW4gYmVlcC4KKyAqLworICAgIHZvaWQKK3Nob3dtYXRjaChjKQorICAgIGludAkJYzsJICAgIC8qIGNoYXIgdG8gc2hvdyBtYXRjaCBmb3IgKi8KK3sKKyAgICBwb3NfVAkqbHBvcywgc2F2ZV9jdXJzb3I7CisgICAgcG9zX1QJbXBvczsKKyAgICBjb2xucl9UCXZjb2w7CisgICAgbG9uZwlzYXZlX3NvOworICAgIGxvbmcJc2F2ZV9zaXNvOworI2lmZGVmIENVUlNPUl9TSEFQRQorICAgIGludAkJc2F2ZV9zdGF0ZTsKKyNlbmRpZgorICAgIGNvbG5yX1QJc2F2ZV9kb2xsYXJfdmNvbDsKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKgorICAgICAqIE9ubHkgc2hvdyBtYXRjaCBmb3IgY2hhcnMgaW4gdGhlICdtYXRjaHBhaXJzJyBvcHRpb24uCisgICAgICovCisgICAgLyogJ21hdGNocGFpcnMnIGlzICJ4OnkseDp5IiAqLworICAgIGZvciAocCA9IGN1cmJ1Zi0+Yl9wX21wczsgKnAgIT0gTlVMOyBwICs9IDIpCisgICAgeworI2lmZGVmIEZFQVRfUklHSFRMRUZUCisJaWYgKCpwID09IGMgJiYgKGN1cndpbi0+d19wX3JsIF4gcF9yaSkpCisJICAgIGJyZWFrOworI2VuZGlmCisJcCArPSAyOworCWlmICgqcCA9PSBjCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkJJiYgIShjdXJ3aW4tPndfcF9ybCBeIHBfcmkpCisjZW5kaWYKKwkgICApCisJICAgIGJyZWFrOworCWlmIChwWzFdICE9ICcsJykKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgobHBvcyA9IGZpbmRtYXRjaChOVUxMLCBOVUwpKSA9PSBOVUxMKQkgICAgLyogbm8gbWF0Y2gsIHNvIGJlZXAgKi8KKwl2aW1fYmVlcCgpOworICAgIGVsc2UgaWYgKGxwb3MtPmxudW0gPj0gY3Vyd2luLT53X3RvcGxpbmUpCisgICAgeworCWlmICghY3Vyd2luLT53X3Bfd3JhcCkKKwkgICAgZ2V0dmNvbChjdXJ3aW4sIGxwb3MsIE5VTEwsICZ2Y29sLCBOVUxMKTsKKwlpZiAoY3Vyd2luLT53X3Bfd3JhcCB8fCAodmNvbCA+PSBjdXJ3aW4tPndfbGVmdGNvbAorCQkJICAgICAgICYmIHZjb2wgPCBjdXJ3aW4tPndfbGVmdGNvbCArIFdfV0lEVEgoY3Vyd2luKSkpCisJeworCSAgICBtcG9zID0gKmxwb3M7ICAgIC8qIHNhdmUgdGhlIHBvcywgdXBkYXRlX3NjcmVlbigpIG1heSBjaGFuZ2UgaXQgKi8KKwkgICAgc2F2ZV9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOworCSAgICBzYXZlX3NvID0gcF9zbzsKKwkgICAgc2F2ZV9zaXNvID0gcF9zaXNvOworCSAgICAvKiBIYW5kbGUgIiQiIGluICdjcG8nOiBJZiB0aGUgJyknIGlzIHR5cGVkIG9uIHRvcCBvZiB0aGUgIiQiLAorCSAgICAgKiBzdG9wIGRpc3BsYXlpbmcgdGhlICIkIi4gKi8KKwkgICAgaWYgKGRvbGxhcl92Y29sID4gMCAmJiBkb2xsYXJfdmNvbCA9PSBjdXJ3aW4tPndfdmlydGNvbCkKKwkJZG9sbGFyX3Zjb2wgPSAwOworCSAgICArK2N1cndpbi0+d192aXJ0Y29sOwkvKiBkbyBkaXNwbGF5ICcpJyBqdXN0IGJlZm9yZSAiJCIgKi8KKwkgICAgdXBkYXRlX3NjcmVlbihWQUxJRCk7CS8qIHNob3cgdGhlIG5ldyBjaGFyIGZpcnN0ICovCisKKwkgICAgc2F2ZV9kb2xsYXJfdmNvbCA9IGRvbGxhcl92Y29sOworI2lmZGVmIENVUlNPUl9TSEFQRQorCSAgICBzYXZlX3N0YXRlID0gU3RhdGU7CisJICAgIFN0YXRlID0gU0hPV01BVENIOworCSAgICB1aV9jdXJzb3Jfc2hhcGUoKTsJCS8qIG1heSBzaG93IGRpZmZlcmVudCBjdXJzb3Igc2hhcGUgKi8KKyNlbmRpZgorCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gbXBvczsJLyogbW92ZSB0byBtYXRjaGluZyBjaGFyICovCisJICAgIHBfc28gPSAwOwkJCS8qIGRvbid0IHVzZSAnc2Nyb2xsb2ZmJyBoZXJlICovCisJICAgIHBfc2lzbyA9IDA7CQkJLyogZG9uJ3QgdXNlICdzaWRlc2Nyb2xsb2ZmJyBoZXJlICovCisJICAgIHNob3dydWxlcihGQUxTRSk7CisJICAgIHNldGN1cnNvcigpOworCSAgICBjdXJzb3Jfb24oKTsJCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBjdXJzb3IgaXMgc2hvd24gKi8KKwkgICAgb3V0X2ZsdXNoKCk7CisjaWZkZWYgRkVBVF9HVUkKKwkgICAgaWYgKGd1aS5pbl91c2UpCisJICAgIHsKKwkJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworCQlndWlfbWNoX2ZsdXNoKCk7CisJICAgIH0KKyNlbmRpZgorCSAgICAvKiBSZXN0b3JlIGRvbGxhcl92Y29sKCksIGJlY2F1c2Ugc2V0Y3Vyc29yKCkgbWF5IGNhbGwgY3Vyc19yb3dzKCkKKwkgICAgICogd2hpY2ggcmVzZXRzIGl0IGlmIHRoZSBtYXRjaGluZyBwb3NpdGlvbiBpcyBpbiBhIHByZXZpb3VzIGxpbmUKKwkgICAgICogYW5kIGhhcyBhIGhpZ2hlciBjb2x1bW4gbnVtYmVyLiAqLworCSAgICBkb2xsYXJfdmNvbCA9IHNhdmVfZG9sbGFyX3Zjb2w7CisKKwkgICAgLyoKKwkgICAgICogYnJpZWYgcGF1c2UsIHVubGVzcyAnbScgaXMgcHJlc2VudCBpbiAnY3BvJyBhbmQgYSBjaGFyYWN0ZXIgaXMKKwkgICAgICogYXZhaWxhYmxlLgorCSAgICAgKi8KKwkgICAgaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19TSE9XTUFUQ0gpICE9IE5VTEwpCisJCXVpX2RlbGF5KHBfbWF0ICogMTAwTCwgVFJVRSk7CisJICAgIGVsc2UgaWYgKCFjaGFyX2F2YWlsKCkpCisJCXVpX2RlbGF5KHBfbWF0ICogMTAwTCwgRkFMU0UpOworCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gc2F2ZV9jdXJzb3I7CS8qIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJICAgIHBfc28gPSBzYXZlX3NvOworCSAgICBwX3Npc28gPSBzYXZlX3Npc287CisjaWZkZWYgQ1VSU09SX1NIQVBFCisJICAgIFN0YXRlID0gc2F2ZV9zdGF0ZTsKKwkgICAgdWlfY3Vyc29yX3NoYXBlKCk7CQkvKiBtYXkgc2hvdyBkaWZmZXJlbnQgY3Vyc29yIHNoYXBlICovCisjZW5kaWYKKwl9CisgICAgfQorfQorCisvKgorICogZmluZHNlbnQoZGlyLCBjb3VudCkgLSBGaW5kIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzZW50ZW5jZSBpbiBkaXJlY3Rpb24KKyAqICdkaXInIFNlbnRlbmNlcyBhcmUgc3VwcG9zZWQgdG8gZW5kIGluICIuIiwgIiEiIG9yICI/IiBmb2xsb3dlZCBieSB3aGl0ZQorICogc3BhY2Ugb3IgYSBsaW5lIGJyZWFrLiBBbHNvIHN0b3AgYXQgYW4gZW1wdHkgbGluZS4KKyAqIFJldHVybiBPSyBpZiB0aGUgbmV4dCBzZW50ZW5jZSB3YXMgZm91bmQuCisgKi8KKyAgICBpbnQKK2ZpbmRzZW50KGRpciwgY291bnQpCisgICAgaW50CQlkaXI7CisgICAgbG9uZwljb3VudDsKK3sKKyAgICBwb3NfVAlwb3MsIHRwb3M7CisgICAgaW50CQljOworICAgIGludAkJKCpmdW5jKSBfX0FSR1MoKHBvc19UICopKTsKKyAgICBpbnQJCXN0YXJ0bG51bTsKKyAgICBpbnQJCW5vc2tpcCA9IEZBTFNFOwkgICAgLyogZG8gbm90IHNraXAgYmxhbmtzICovCisgICAgaW50CQljcG9fSjsKKworICAgIHBvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgaWYgKGRpciA9PSBGT1JXQVJEKQorCWZ1bmMgPSBpbmNsOworICAgIGVsc2UKKwlmdW5jID0gZGVjbDsKKworICAgIHdoaWxlIChjb3VudC0tKQorICAgIHsKKwkvKgorCSAqIGlmIG9uIGFuIGVtcHR5IGxpbmUsIHNraXAgdXB0byBhIG5vbi1lbXB0eSBsaW5lCisJICovCisJaWYgKGdjaGFyX3BvcygmcG9zKSA9PSBOVUwpCisJeworCSAgICBkbworCQlpZiAoKCpmdW5jKSgmcG9zKSA9PSAtMSkKKwkJICAgIGJyZWFrOworCSAgICB3aGlsZSAoZ2NoYXJfcG9zKCZwb3MpID09IE5VTCk7CisJICAgIGlmIChkaXIgPT0gRk9SV0FSRCkKKwkJZ290byBmb3VuZDsKKwl9CisJLyoKKwkgKiBpZiBvbiB0aGUgc3RhcnQgb2YgYSBwYXJhZ3JhcGggb3IgYSBzZWN0aW9uIGFuZCBzZWFyY2hpbmcgZm9yd2FyZCwKKwkgKiBnbyB0byB0aGUgbmV4dCBsaW5lCisJICovCisJZWxzZSBpZiAoZGlyID09IEZPUldBUkQgJiYgcG9zLmNvbCA9PSAwICYmCisJCQkJCQlzdGFydFBTKHBvcy5sbnVtLCBOVUwsIEZBTFNFKSkKKwl7CisJICAgIGlmIChwb3MubG51bSA9PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJcmV0dXJuIEZBSUw7CisJICAgICsrcG9zLmxudW07CisJICAgIGdvdG8gZm91bmQ7CisJfQorCWVsc2UgaWYgKGRpciA9PSBCQUNLV0FSRCkKKwkgICAgZGVjbCgmcG9zKTsKKworCS8qIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIG5vbi1ibGFuayBjaGFyICovCisJd2hpbGUgKChjID0gZ2NoYXJfcG9zKCZwb3MpKSA9PSAnICcgfHwgYyA9PSAnXHQnIHx8CisJICAgICAoZGlyID09IEJBQ0tXQVJEICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIuIT8pXVwiJyIsIGMpICE9IE5VTEwpKQorCXsKKwkgICAgaWYgKGRlY2woJnBvcykgPT0gLTEpCisJCWJyZWFrOworCSAgICAvKiB3aGVuIGdvaW5nIGZvcndhcmQ6IFN0b3AgaW4gZnJvbnQgb2YgZW1wdHkgbGluZSAqLworCSAgICBpZiAobGluZWVtcHR5KHBvcy5sbnVtKSAmJiBkaXIgPT0gRk9SV0FSRCkKKwkgICAgeworCQlpbmNsKCZwb3MpOworCQlnb3RvIGZvdW5kOworCSAgICB9CisJfQorCisJLyogcmVtZW1iZXIgdGhlIGxpbmUgd2hlcmUgdGhlIHNlYXJjaCBzdGFydGVkICovCisJc3RhcnRsbnVtID0gcG9zLmxudW07CisJY3BvX0ogPSB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fRU5ET0ZTRU5UKSAhPSBOVUxMOworCisJZm9yICg7OykJCS8qIGZpbmQgZW5kIG9mIHNlbnRlbmNlICovCisJeworCSAgICBjID0gZ2NoYXJfcG9zKCZwb3MpOworCSAgICBpZiAoYyA9PSBOVUwgfHwgKHBvcy5jb2wgPT0gMCAmJiBzdGFydFBTKHBvcy5sbnVtLCBOVUwsIEZBTFNFKSkpCisJICAgIHsKKwkJaWYgKGRpciA9PSBCQUNLV0FSRCAmJiBwb3MubG51bSAhPSBzdGFydGxudW0pCisJCSAgICArK3Bvcy5sbnVtOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoYyA9PSAnLicgfHwgYyA9PSAnIScgfHwgYyA9PSAnPycpCisJICAgIHsKKwkJdHBvcyA9IHBvczsKKwkJZG8KKwkJICAgIGlmICgoYyA9IGluYygmdHBvcykpID09IC0xKQorCQkJYnJlYWs7CisJCXdoaWxlICh2aW1fc3RyY2hyKChjaGFyX3UgKikiKV1cIiciLCBjID0gZ2NoYXJfcG9zKCZ0cG9zKSkKKwkJCSE9IE5VTEwpOworCQlpZiAoYyA9PSAtMSAgfHwgKCFjcG9fSiAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSkgfHwgYyA9PSBOVUwKKwkJICAgIHx8IChjcG9fSiAmJiAoYyA9PSAnICcgJiYgaW5jKCZ0cG9zKSA+PSAwCisJCQkgICAgICAmJiBnY2hhcl9wb3MoJnRwb3MpID09ICcgJykpKQorCQl7CisJCSAgICBwb3MgPSB0cG9zOworCQkgICAgaWYgKGdjaGFyX3BvcygmcG9zKSA9PSBOVUwpIC8qIHNraXAgTlVMIGF0IEVPTCAqLworCQkJaW5jKCZwb3MpOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBpZiAoKCpmdW5jKSgmcG9zKSA9PSAtMSkKKwkgICAgeworCQlpZiAoY291bnQpCisJCSAgICByZXR1cm4gRkFJTDsKKwkJbm9za2lwID0gVFJVRTsKKwkJYnJlYWs7CisJICAgIH0KKwl9Citmb3VuZDoKKwkgICAgLyogc2tpcCB3aGl0ZSBzcGFjZSAqLworCXdoaWxlICghbm9za2lwICYmICgoYyA9IGdjaGFyX3BvcygmcG9zKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCisJICAgIGlmIChpbmNsKCZwb3MpID09IC0xKQorCQlicmVhazsKKyAgICB9CisKKyAgICBzZXRwY21hcmsoKTsKKyAgICBjdXJ3aW4tPndfY3Vyc29yID0gcG9zOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGZpbmRwYXIoZGlyLCBjb3VudCwgd2hhdCkgLSBGaW5kIHRoZSBuZXh0IHBhcmFncmFwaCBpbiBkaXJlY3Rpb24gJ2RpcicKKyAqIFBhcmFncmFwaHMgYXJlIGN1cnJlbnRseSBzdXBwb3NlZCB0byBiZSBzZXBhcmF0ZWQgYnkgZW1wdHkgbGluZXMuCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2FzIGZvdW5kLgorICogSWYgJ3doYXQnIGlzICd7JyBvciAnfScgd2UgZ28gdG8gdGhlIG5leHQgc2VjdGlvbi4KKyAqIElmICdib3RoJyBpcyBUUlVFIGFsc28gc3RvcCBhdCAnfScuCisgKi8KKyAgICBpbnQKK2ZpbmRwYXIob2FwLCBkaXIsIGNvdW50LCB3aGF0LCBib3RoKQorICAgIG9wYXJnX1QJICAgICpvYXA7CisgICAgaW50CQkgICAgZGlyOworICAgIGxvbmcJICAgIGNvdW50OworICAgIGludAkJICAgIHdoYXQ7CisgICAgaW50CQkgICAgYm90aDsKK3sKKyAgICBsaW5lbnJfVAljdXJyOworICAgIGludAkJZGlkX3NraXA7ICAgLyogVFJVRSBhZnRlciBzZXBhcmF0aW5nIGxpbmVzIGhhdmUgYmVlbiBza2lwcGVkICovCisgICAgaW50CQlmaXJzdDsJICAgIC8qIFRSVUUgb24gZmlyc3QgbGluZSAqLworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGxpbmVucl9UCWZvbGRfZmlyc3Q7IC8qIGZpcnN0IGxpbmUgb2YgYSBjbG9zZWQgZm9sZCAqLworICAgIGxpbmVucl9UCWZvbGRfbGFzdDsgIC8qIGxhc3QgbGluZSBvZiBhIGNsb3NlZCBmb2xkICovCisgICAgaW50CQlmb2xkX3NraXBwZWQ7IC8qIFRSVUUgaWYgYSBjbG9zZWQgZm9sZCB3YXMgc2tpcHBlZCB0aGlzCisJCQkJIGl0ZXJhdGlvbiAqLworI2VuZGlmCisKKyAgICBjdXJyID0gY3Vyd2luLT53X2N1cnNvci5sbnVtOworCisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgeworCWRpZF9za2lwID0gRkFMU0U7CisJZm9yIChmaXJzdCA9IFRSVUU7IDsgZmlyc3QgPSBGQUxTRSkKKwl7CisJICAgIGlmICgqbWxfZ2V0KGN1cnIpICE9IE5VTCkKKwkJZGlkX3NraXAgPSBUUlVFOworCisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIC8qIHNraXAgZm9sZGVkIGxpbmVzICovCisJICAgIGZvbGRfc2tpcHBlZCA9IEZBTFNFOworCSAgICBpZiAoZmlyc3QgJiYgaGFzRm9sZGluZyhjdXJyLCAmZm9sZF9maXJzdCwgJmZvbGRfbGFzdCkpCisJICAgIHsKKwkJY3VyciA9ICgoZGlyID4gMCkgPyBmb2xkX2xhc3QgOiBmb2xkX2ZpcnN0KSArIGRpcjsKKwkJZm9sZF9za2lwcGVkID0gVFJVRTsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgaWYgKCFmaXJzdCAmJiBkaWRfc2tpcCAmJiBzdGFydFBTKGN1cnIsIHdoYXQsIGJvdGgpKQorCQlicmVhazsKKworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoZm9sZF9za2lwcGVkKQorCQljdXJyIC09IGRpcjsKKyNlbmRpZgorCSAgICBpZiAoKGN1cnIgKz0gZGlyKSA8IDEgfHwgY3VyciA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICB7CisJCWlmIChjb3VudCkKKwkJICAgIHJldHVybiBGQUxTRTsKKwkJY3VyciAtPSBkaXI7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICBzZXRwY21hcmsoKTsKKyAgICBpZiAoYm90aCAmJiAqbWxfZ2V0KGN1cnIpID09ICd9JykJLyogaW5jbHVkZSBsaW5lIHdpdGggJ30nICovCisJKytjdXJyOworICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGN1cnI7CisgICAgaWYgKGN1cnIgPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgJiYgd2hhdCAhPSAnfScpCisgICAgeworCWlmICgoY3Vyd2luLT53X2N1cnNvci5jb2wgPSAoY29sbnJfVClTVFJMRU4obWxfZ2V0KGN1cnIpKSkgIT0gMCkKKwl7CisJICAgIC0tY3Vyd2luLT53X2N1cnNvci5jb2w7CisJICAgIG9hcC0+aW5jbHVzaXZlID0gVFJVRTsKKwl9CisgICAgfQorICAgIGVsc2UKKwljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBjaGVjayBpZiB0aGUgc3RyaW5nICdzJyBpcyBhIG5yb2ZmIG1hY3JvIHRoYXQgaXMgaW4gb3B0aW9uICdvcHQnCisgKi8KKyAgICBzdGF0aWMgaW50Citpbm1hY3JvKG9wdCwgcykKKyAgICBjaGFyX3UJKm9wdDsKKyAgICBjaGFyX3UJKnM7Cit7CisgICAgY2hhcl91CSptYWNybzsKKworICAgIGZvciAobWFjcm8gPSBvcHQ7IG1hY3JvWzBdOyArK21hY3JvKQorICAgIHsKKwkvKiBBY2NlcHQgdHdvIGNoYXJhY3RlcnMgaW4gdGhlIG9wdGlvbiBiZWluZyBlcXVhbCB0byB0d28gY2hhcmFjdGVycworCSAqIGluIHRoZSBsaW5lLiAgQSBzcGFjZSBpbiB0aGUgb3B0aW9uIG1hdGNoZXMgd2l0aCBhIHNwYWNlIGluIHRoZQorCSAqIGxpbmUgb3IgdGhlIGxpbmUgaGF2aW5nIGVuZGVkLiAqLworCWlmICggICAgICAgKG1hY3JvWzBdID09IHNbMF0KKwkJICAgIHx8IChtYWNyb1swXSA9PSAnICcKKwkJCSYmIChzWzBdID09IE5VTCB8fCBzWzBdID09ICcgJykpKQorCQkmJiAobWFjcm9bMV0gPT0gc1sxXQorCQkgICAgfHwgKChtYWNyb1sxXSA9PSBOVUwgfHwgbWFjcm9bMV0gPT0gJyAnKQorCQkJJiYgKHNbMF0gPT0gTlVMIHx8IHNbMV0gPT0gTlVMIHx8IHNbMV0gPT0gJyAnKSkpKQorCSAgICBicmVhazsKKwkrK21hY3JvOworCWlmIChtYWNyb1swXSA9PSBOVUwpCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gKG1hY3JvWzBdICE9IE5VTCk7Cit9CisKKy8qCisgKiBzdGFydFBTOiByZXR1cm4gVFJVRSBpZiBsaW5lICdsbnVtJyBpcyB0aGUgc3RhcnQgb2YgYSBzZWN0aW9uIG9yIHBhcmFncmFwaC4KKyAqIElmICdwYXJhJyBpcyAneycgb3IgJ30nIG9ubHkgY2hlY2sgZm9yIHNlY3Rpb25zLgorICogSWYgJ2JvdGgnIGlzIFRSVUUgYWxzbyBzdG9wIGF0ICd9JworICovCisgICAgaW50CitzdGFydFBTKGxudW0sIHBhcmEsIGJvdGgpCisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXBhcmE7CisgICAgaW50CQlib3RoOworeworICAgIGNoYXJfdQkqczsKKworICAgIHMgPSBtbF9nZXQobG51bSk7CisgICAgaWYgKCpzID09IHBhcmEgfHwgKnMgPT0gJ1xmJyB8fCAoYm90aCAmJiAqcyA9PSAnfScpKQorCXJldHVybiBUUlVFOworICAgIGlmICgqcyA9PSAnLicgJiYgKGlubWFjcm8ocF9zZWN0aW9ucywgcyArIDEpIHx8CisJCQkJCSAgICghcGFyYSAmJiBpbm1hY3JvKHBfcGFyYSwgcyArIDEpKSkpCisJcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBkbyB0aGUgd29yZCBzZWFyY2hlcyBwZXJmb3JtZWQgYnkgdGhlICd3JywgJ1cnLAorICogJ2InLCAnQicsICdlJywgYW5kICdFJyBjb21tYW5kcy4KKyAqLworCisvKgorICogVG8gcGVyZm9ybSB0aGVzZSBzZWFyY2hlcywgY2hhcmFjdGVycyBhcmUgcGxhY2VkIGludG8gb25lIG9mIHRocmVlCisgKiBjbGFzc2VzLCBhbmQgdHJhbnNpdGlvbnMgYmV0d2VlbiBjbGFzc2VzIGRldGVybWluZSB3b3JkIGJvdW5kYXJpZXMuCisgKgorICogVGhlIGNsYXNzZXMgYXJlOgorICoKKyAqIDAgLSB3aGl0ZSBzcGFjZQorICogMSAtIHB1bmN0dWF0aW9uCisgKiAyIG9yIGhpZ2hlciAtIGtleXdvcmQgY2hhcmFjdGVycyAobGV0dGVycywgZGlnaXRzIGFuZCB1bmRlcnNjb3JlKQorICovCisKK3N0YXRpYyBpbnQJY2xzX2JpZ3dvcmQ7CS8qIFRSVUUgZm9yICJXIiwgIkIiIG9yICJFIiAqLworCisvKgorICogY2xzKCkgLSByZXR1cm5zIHRoZSBjbGFzcyBvZiBjaGFyYWN0ZXIgYXQgY3Vyd2luLT53X2N1cnNvcgorICoKKyAqIElmIGEgJ1cnLCAnQicsIG9yICdFJyBtb3Rpb24gaXMgYmVpbmcgZG9uZSAoY2xzX2JpZ3dvcmQgPT0gVFJVRSksIGNoYXJzCisgKiBmcm9tIGNsYXNzIDIgYW5kIGhpZ2hlciBhcmUgcmVwb3J0ZWQgYXMgY2xhc3MgMSBzaW5jZSBvbmx5IHdoaXRlIHNwYWNlCisgKiBib3VuZGFyaWVzIGFyZSBvZiBpbnRlcmVzdC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NscygpCit7CisgICAgaW50CSAgICBjOworCisgICAgYyA9IGdjaGFyX2N1cnNvcigpOworI2lmZGVmIEZFQVRfRktNQVAJLyogd2hlbiAnYWttJyAoRmFyc2kgbW9kZSksIHRha2UgY2FyZSBvZiBGYXJzaSBibGFuayAqLworICAgIGlmIChwX2FsdGtleW1hcCAmJiBjID09IEZfQkxBTkspCisJcmV0dXJuIDA7CisjZW5kaWYKKyAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gTlVMKQorCXJldHVybiAwOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBjID4gMHhGRikKKyAgICB7CisJLyogSWYgY2xzX2JpZ3dvcmQsIHJlcG9ydCBtdWx0aS1ieXRlIGNoYXJzIGFzIGNsYXNzIDEuICovCisJaWYgKGVuY19kYmNzID09IERCQ1NfS09SICYmIGNsc19iaWd3b3JkKQorCSAgICByZXR1cm4gMTsKKworCS8qIHByb2Nlc3MgY29kZSBsZWFkaW5nL3RyYWlsaW5nIGJ5dGVzICovCisJcmV0dXJuIGRiY3NfY2xhc3MoKCh1bnNpZ25lZCljID4+IDgpLCAoYyAmIDB4RkYpKTsKKyAgICB9CisgICAgaWYgKGVuY191dGY4KQorICAgIHsKKwljID0gdXRmX2NsYXNzKGMpOworCWlmIChjICE9IDAgJiYgY2xzX2JpZ3dvcmQpCisJICAgIHJldHVybiAxOworCXJldHVybiBjOworICAgIH0KKyNlbmRpZgorCisgICAgLyogSWYgY2xzX2JpZ3dvcmQgaXMgVFJVRSwgcmVwb3J0IGFsbCBub24tYmxhbmtzIGFzIGNsYXNzIDEuICovCisgICAgaWYgKGNsc19iaWd3b3JkKQorCXJldHVybiAxOworCisgICAgaWYgKHZpbV9pc3dvcmRjKGMpKQorCXJldHVybiAyOworICAgIHJldHVybiAxOworfQorCisKKy8qCisgKiBmd2Rfd29yZChjb3VudCwgdHlwZSwgZW9sKSAtIG1vdmUgZm9yd2FyZCBvbmUgd29yZAorICoKKyAqIFJldHVybnMgRkFJTCBpZiB0aGUgY3Vyc29yIHdhcyBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKiBJZiBlb2wgaXMgVFJVRSwgbGFzdCB3b3JkIHN0b3BzIGF0IGVuZCBvZiBsaW5lIChmb3Igb3BlcmF0b3JzKS4KKyAqLworICAgIGludAorZndkX3dvcmQoY291bnQsIGJpZ3dvcmQsIGVvbCkKKyAgICBsb25nCWNvdW50OworICAgIGludAkJYmlnd29yZDsgICAgLyogIlciLCAiRSIgb3IgIkIiICovCisgICAgaW50CQllb2w7Cit7CisgICAgaW50CQlzY2xhc3M7CSAgICAvKiBzdGFydGluZyBjbGFzcyAqLworICAgIGludAkJaTsKKyAgICBpbnQJCWxhc3RfbGluZTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyAgICBjbHNfYmlnd29yZCA9IGJpZ3dvcmQ7CisgICAgd2hpbGUgKC0tY291bnQgPj0gMCkKKyAgICB7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJLyogV2hlbiBpbnNpZGUgYSByYW5nZSBvZiBmb2xkZWQgbGluZXMsIG1vdmUgdG8gdGhlIGxhc3QgY2hhciBvZiB0aGUKKwkgKiBsYXN0IGxpbmUuICovCisJaWYgKGhhc0ZvbGRpbmcoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBOVUxMLCAmY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwkgICAgY29sYWR2YW5jZSgoY29sbnJfVClNQVhDT0wpOworI2VuZGlmCisJc2NsYXNzID0gY2xzKCk7CisKKwkvKgorCSAqIFdlIGFsd2F5cyBtb3ZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIHVubGVzcyBvbiB0aGUgbGFzdAorCSAqIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLgorCSAqLworCWxhc3RfbGluZSA9IChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpOworCWkgPSBpbmNfY3Vyc29yKCk7CisJaWYgKGkgPT0gLTEgfHwgKGkgPj0gMSAmJiBsYXN0X2xpbmUpKSAvKiBzdGFydGVkIGF0IGxhc3QgY2hhciBpbiBmaWxlICovCisJICAgIHJldHVybiBGQUlMOworCWlmIChpID09IDEgJiYgZW9sICYmIGNvdW50ID09IDApICAgICAgLyogc3RhcnRlZCBhdCBsYXN0IGNoYXIgaW4gbGluZSAqLworCSAgICByZXR1cm4gT0s7CisKKwkvKgorCSAqIEdvIG9uZSBjaGFyIHBhc3QgZW5kIG9mIGN1cnJlbnQgd29yZCAoaWYgYW55KQorCSAqLworCWlmIChzY2xhc3MgIT0gMCkKKwkgICAgd2hpbGUgKGNscygpID09IHNjbGFzcykKKwkgICAgeworCQlpID0gaW5jX2N1cnNvcigpOworCQlpZiAoaSA9PSAtMSB8fCAoaSA+PSAxICYmIGVvbCAmJiBjb3VudCA9PSAwKSkKKwkJICAgIHJldHVybiBPSzsKKwkgICAgfQorCisJLyoKKwkgKiBnbyB0byBuZXh0IG5vbi13aGl0ZQorCSAqLworCXdoaWxlIChjbHMoKSA9PSAwKQorCXsKKwkgICAgLyoKKwkgICAgICogV2UnbGwgc3RvcCBpZiB3ZSBsYW5kIG9uIGEgYmxhbmsgbGluZQorCSAgICAgKi8KKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID09IDAgJiYgKm1sX2dldF9jdXJsaW5lKCkgPT0gTlVMKQorCQlicmVhazsKKworCSAgICBpID0gaW5jX2N1cnNvcigpOworCSAgICBpZiAoaSA9PSAtMSB8fCAoaSA+PSAxICYmIGVvbCAmJiBjb3VudCA9PSAwKSkKKwkJcmV0dXJuIE9LOworCX0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogYmNrX3dvcmQoKSAtIG1vdmUgYmFja3dhcmQgJ2NvdW50JyB3b3JkcworICoKKyAqIElmIHN0b3AgaXMgVFJVRSBhbmQgd2UgYXJlIGFscmVhZHkgb24gdGhlIHN0YXJ0IG9mIGEgd29yZCwgbW92ZSBvbmUgbGVzcy4KKyAqCisgKiBSZXR1cm5zIEZBSUwgaWYgdG9wIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkLgorICovCisgICAgaW50CitiY2tfd29yZChjb3VudCwgYmlnd29yZCwgc3RvcCkKKyAgICBsb25nCWNvdW50OworICAgIGludAkJYmlnd29yZDsKKyAgICBpbnQJCXN0b3A7Cit7CisgICAgaW50CQlzY2xhc3M7CSAgICAvKiBzdGFydGluZyBjbGFzcyAqLworCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID0gMDsKKyNlbmRpZgorICAgIGNsc19iaWd3b3JkID0gYmlnd29yZDsKKyAgICB3aGlsZSAoLS1jb3VudCA+PSAwKQorICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkvKiBXaGVuIGluc2lkZSBhIHJhbmdlIG9mIGZvbGRlZCBsaW5lcywgbW92ZSB0byB0aGUgZmlyc3QgY2hhciBvZiB0aGUKKwkgKiBmaXJzdCBsaW5lLiAqLworCWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgJmN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCkpCisJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyNlbmRpZgorCXNjbGFzcyA9IGNscygpOworCWlmIChkZWNfY3Vyc29yKCkgPT0gLTEpCQkvKiBzdGFydGVkIGF0IHN0YXJ0IG9mIGZpbGUgKi8KKwkgICAgcmV0dXJuIEZBSUw7CisKKwlpZiAoIXN0b3AgfHwgc2NsYXNzID09IGNscygpIHx8IHNjbGFzcyA9PSAwKQorCXsKKwkgICAgLyoKKwkgICAgICogU2tpcCB3aGl0ZSBzcGFjZSBiZWZvcmUgdGhlIHdvcmQuCisJICAgICAqIFN0b3Agb24gYW4gZW1wdHkgbGluZS4KKwkgICAgICovCisJICAgIHdoaWxlIChjbHMoKSA9PSAwKQorCSAgICB7CisJCWlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA9PSAwCisJCQkJICAgICAgJiYgbGluZWVtcHR5KGN1cndpbi0+d19jdXJzb3IubG51bSkpCisJCSAgICBnb3RvIGZpbmlzaGVkOworCQlpZiAoZGVjX2N1cnNvcigpID09IC0xKSAvKiBoaXQgc3RhcnQgb2YgZmlsZSwgc3RvcCBoZXJlICovCisJCSAgICByZXR1cm4gT0s7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBNb3ZlIGJhY2t3YXJkIHRvIHN0YXJ0IG9mIHRoaXMgd29yZC4KKwkgICAgICovCisJICAgIGlmIChza2lwX2NoYXJzKGNscygpLCBCQUNLV0FSRCkpCisJCXJldHVybiBPSzsKKwl9CisKKwlpbmNfY3Vyc29yKCk7CQkJLyogb3ZlcnNob3QgLSBmb3J3YXJkIG9uZSAqLworZmluaXNoZWQ6CisJc3RvcCA9IEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBlbmRfd29yZCgpIC0gbW92ZSB0byB0aGUgZW5kIG9mIHRoZSB3b3JkCisgKgorICogVGhlcmUgaXMgYW4gYXBwYXJlbnQgYnVnIGluIHRoZSAnZScgbW90aW9uIG9mIHRoZSByZWFsIHZpLiBBdCBsZWFzdCBvbiB0aGUKKyAqIFN5c3RlbSBWIFJlbGVhc2UgMyB2ZXJzaW9uIGZvciB0aGUgODAzODYuIFVubGlrZSAnYicgYW5kICd3JywgdGhlICdlJworICogbW90aW9uIGNyb3NzZXMgYmxhbmsgbGluZXMuIFdoZW4gdGhlIHJlYWwgdmkgY3Jvc3NlcyBhIGJsYW5rIGxpbmUgaW4gYW4KKyAqICdlJyBtb3Rpb24sIHRoZSBjdXJzb3IgaXMgcGxhY2VkIG9uIHRoZSBGSVJTVCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQKKyAqIG5vbi1ibGFuayBsaW5lLiBUaGUgJ0UnIGNvbW1hbmQsIGhvd2V2ZXIsIHdvcmtzIGNvcnJlY3RseS4gU2luY2UgdGhpcworICogYXBwZWFycyB0byBiZSBhIGJ1ZywgSSBoYXZlIG5vdCBkdXBsaWNhdGVkIGl0IGhlcmUuCisgKgorICogUmV0dXJucyBGQUlMIGlmIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZC4KKyAqCisgKiBJZiBzdG9wIGlzIFRSVUUgYW5kIHdlIGFyZSBhbHJlYWR5IG9uIHRoZSBlbmQgb2YgYSB3b3JkLCBtb3ZlIG9uZSBsZXNzLgorICogSWYgZW1wdHkgaXMgVFJVRSBzdG9wIG9uIGFuIGVtcHR5IGxpbmUuCisgKi8KKyAgICBpbnQKK2VuZF93b3JkKGNvdW50LCBiaWd3b3JkLCBzdG9wLCBlbXB0eSkKKyAgICBsb25nCWNvdW50OworICAgIGludAkJYmlnd29yZDsKKyAgICBpbnQJCXN0b3A7CisgICAgaW50CQllbXB0eTsKK3sKKyAgICBpbnQJCXNjbGFzczsJICAgIC8qIHN0YXJ0aW5nIGNsYXNzICovCisKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisgICAgY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgY2xzX2JpZ3dvcmQgPSBiaWd3b3JkOworICAgIHdoaWxlICgtLWNvdW50ID49IDApCisgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCS8qIFdoZW4gaW5zaWRlIGEgcmFuZ2Ugb2YgZm9sZGVkIGxpbmVzLCBtb3ZlIHRvIHRoZSBsYXN0IGNoYXIgb2YgdGhlCisJICogbGFzdCBsaW5lLiAqLworCWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d19jdXJzb3IubG51bSwgTlVMTCwgJmN1cndpbi0+d19jdXJzb3IubG51bSkpCisJICAgIGNvbGFkdmFuY2UoKGNvbG5yX1QpTUFYQ09MKTsKKyNlbmRpZgorCXNjbGFzcyA9IGNscygpOworCWlmIChpbmNfY3Vyc29yKCkgPT0gLTEpCisJICAgIHJldHVybiBGQUlMOworCisJLyoKKwkgKiBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCwgd2UganVzdCBoYXZlIHRvIG1vdmUgdG8gdGhlIGVuZAorCSAqIG9mIGl0LgorCSAqLworCWlmIChjbHMoKSA9PSBzY2xhc3MgJiYgc2NsYXNzICE9IDApCisJeworCSAgICAvKgorCSAgICAgKiBNb3ZlIGZvcndhcmQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IHdvcmQKKwkgICAgICovCisJICAgIGlmIChza2lwX2NoYXJzKHNjbGFzcywgRk9SV0FSRCkpCisJCXJldHVybiBGQUlMOworCX0KKwllbHNlIGlmICghc3RvcCB8fCBzY2xhc3MgPT0gMCkKKwl7CisJICAgIC8qCisJICAgICAqIFdlIHdlcmUgYXQgdGhlIGVuZCBvZiBhIHdvcmQuIEdvIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZC4KKwkgICAgICogRmlyc3Qgc2tpcCB3aGl0ZSBzcGFjZSwgaWYgJ2VtcHR5JyBpcyBUUlVFLCBzdG9wIGF0IGVtcHR5IGxpbmUuCisJICAgICAqLworCSAgICB3aGlsZSAoY2xzKCkgPT0gMCkKKwkgICAgeworCQlpZiAoZW1wdHkgJiYgY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMAorCQkJCQkgICYmIGxpbmVlbXB0eShjdXJ3aW4tPndfY3Vyc29yLmxudW0pKQorCQkgICAgZ290byBmaW5pc2hlZDsKKwkJaWYgKGluY19jdXJzb3IoKSA9PSAtMSkJICAgIC8qIGhpdCBlbmQgb2YgZmlsZSwgc3RvcCBoZXJlICovCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIE1vdmUgZm9yd2FyZCB0byB0aGUgZW5kIG9mIHRoaXMgd29yZC4KKwkgICAgICovCisJICAgIGlmIChza2lwX2NoYXJzKGNscygpLCBGT1JXQVJEKSkKKwkJcmV0dXJuIEZBSUw7CisJfQorCWRlY19jdXJzb3IoKTsJCQkvKiBvdmVyc2hvdCAtIG9uZSBjaGFyIGJhY2t3YXJkICovCitmaW5pc2hlZDoKKwlzdG9wID0gRkFMU0U7CQkJLyogd2UgbW92ZSBvbmx5IG9uZSB3b3JkIGxlc3MgKi8KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogTW92ZSBiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmQuCisgKgorICogUmV0dXJucyBGQUlMIGlmIHN0YXJ0IG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkLgorICovCisgICAgaW50CitiY2tlbmRfd29yZChjb3VudCwgYmlnd29yZCwgZW9sKQorICAgIGxvbmcJY291bnQ7CisgICAgaW50CQliaWd3b3JkOyAgICAvKiBUUlVFIGZvciAiQiIgKi8KKyAgICBpbnQJCWVvbDsJICAgIC8qIFRSVUU6IHN0b3AgYXQgZW5kIG9mIGxpbmUuICovCit7CisgICAgaW50CQlzY2xhc3M7CSAgICAvKiBzdGFydGluZyBjbGFzcyAqLworICAgIGludAkJaTsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyAgICBjbHNfYmlnd29yZCA9IGJpZ3dvcmQ7CisgICAgd2hpbGUgKC0tY291bnQgPj0gMCkKKyAgICB7CisJc2NsYXNzID0gY2xzKCk7CisJaWYgKChpID0gZGVjX2N1cnNvcigpKSA9PSAtMSkKKwkgICAgcmV0dXJuIEZBSUw7CisJaWYgKGVvbCAmJiBpID09IDEpCisJICAgIHJldHVybiBPSzsKKworCS8qCisJICogTW92ZSBiYWNrd2FyZCB0byBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoaXMgd29yZC4KKwkgKi8KKwlpZiAoc2NsYXNzICE9IDApCisJeworCSAgICB3aGlsZSAoY2xzKCkgPT0gc2NsYXNzKQorCQlpZiAoKGkgPSBkZWNfY3Vyc29yKCkpID09IC0xIHx8IChlb2wgJiYgaSA9PSAxKSkKKwkJICAgIHJldHVybiBPSzsKKwl9CisKKwkvKgorCSAqIE1vdmUgYmFja3dhcmQgdG8gZW5kIG9mIHRoZSBwcmV2aW91cyB3b3JkCisJICovCisJd2hpbGUgKGNscygpID09IDApCisJeworCSAgICBpZiAoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCAmJiBsaW5lZW1wdHkoY3Vyd2luLT53X2N1cnNvci5sbnVtKSkKKwkJYnJlYWs7CisJICAgIGlmICgoaSA9IGRlY19jdXJzb3IoKSkgPT0gLTEgfHwgKGVvbCAmJiBpID09IDEpKQorCQlyZXR1cm4gT0s7CisJfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBTa2lwIGEgcm93IG9mIGNoYXJhY3RlcnMgb2YgdGhlIHNhbWUgY2xhc3MuCisgKiBSZXR1cm4gVFJVRSB3aGVuIGVuZC1vZi1maWxlIHJlYWNoZWQsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3NraXBfY2hhcnMoY2NsYXNzLCBkaXIpCisgICAgaW50CQljY2xhc3M7CisgICAgaW50CQlkaXI7Cit7CisgICAgd2hpbGUgKGNscygpID09IGNjbGFzcykKKwlpZiAoKGRpciA9PSBGT1JXQVJEID8gaW5jX2N1cnNvcigpIDogZGVjX2N1cnNvcigpKSA9PSAtMSkKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgRkVBVF9URVhUT0JKCisvKgorICogR28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQgb3IgdGhlIHN0YXJ0IG9mIHdoaXRlIHNwYWNlCisgKi8KKyAgICBzdGF0aWMgdm9pZAorYmFja19pbl9saW5lKCkKK3sKKyAgICBpbnQJCXNjbGFzczsJCSAgICAvKiBzdGFydGluZyBjbGFzcyAqLworCisgICAgc2NsYXNzID0gY2xzKCk7CisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID09IDApCSAgICAvKiBzdG9wIGF0IHN0YXJ0IG9mIGxpbmUgKi8KKwkgICAgYnJlYWs7CisJZGVjX2N1cnNvcigpOworCWlmIChjbHMoKSAhPSBzY2xhc3MpCQkgICAgLyogc3RvcCBhdCBzdGFydCBvZiB3b3JkICovCisJeworCSAgICBpbmNfY3Vyc29yKCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZmluZF9maXJzdF9ibGFuayhwb3NwKQorICAgIHBvc19UICAgICpwb3NwOworeworICAgIGludAkgICAgYzsKKworICAgIHdoaWxlIChkZWNsKHBvc3ApICE9IC0xKQorICAgIHsKKwljID0gZ2NoYXJfcG9zKHBvc3ApOworCWlmICghdmltX2lzd2hpdGUoYykpCisJeworCSAgICBpbmNsKHBvc3ApOworCSAgICBicmVhazsKKwl9CisgICAgfQorfQorCisvKgorICogU2tpcCBjb3VudC8yIHNlbnRlbmNlcyBhbmQgY291bnQvMiBzZXBhcmF0aW5nIHdoaXRlIHNwYWNlcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmaW5kc2VudF9mb3J3YXJkKGNvdW50LCBhdF9zdGFydF9zZW50KQorICAgIGxvbmcgICAgY291bnQ7CisgICAgaW50CSAgICBhdF9zdGFydF9zZW50OwkvKiBjdXJzb3IgaXMgYXQgc3RhcnQgb2Ygc2VudGVuY2UgKi8KK3sKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisJZmluZHNlbnQoRk9SV0FSRCwgMUwpOworCWlmIChhdF9zdGFydF9zZW50KQorCSAgICBmaW5kX2ZpcnN0X2JsYW5rKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwlpZiAoY291bnQgPT0gMCB8fCBhdF9zdGFydF9zZW50KQorCSAgICBkZWNsKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwlhdF9zdGFydF9zZW50ID0gIWF0X3N0YXJ0X3NlbnQ7CisgICAgfQorfQorCisvKgorICogRmluZCB3b3JkIHVuZGVyIGN1cnNvciwgY3Vyc29yIGF0IGVuZC4KKyAqIFVzZWQgd2hpbGUgYW4gb3BlcmF0b3IgaXMgcGVuZGluZywgYW5kIGluIFZpc3VhbCBtb2RlLgorICovCisgICAgaW50CitjdXJyZW50X3dvcmQob2FwLCBjb3VudCwgaW5jbHVkZSwgYmlnd29yZCkKKyAgICBvcGFyZ19UCSpvYXA7CisgICAgbG9uZwljb3VudDsKKyAgICBpbnQJCWluY2x1ZGU7CS8qIFRSVUU6IGluY2x1ZGUgd29yZCBhbmQgd2hpdGUgc3BhY2UgKi8KKyAgICBpbnQJCWJpZ3dvcmQ7CS8qIEZBTFNFID09IHdvcmQsIFRSVUUgPT0gV09SRCAqLworeworICAgIHBvc19UCXN0YXJ0X3BvczsKKyAgICBwb3NfVAlwb3M7CisgICAgaW50CQlpbmNsdXNpdmUgPSBUUlVFOworICAgIGludAkJaW5jbHVkZV93aGl0ZSA9IEZBTFNFOworCisgICAgY2xzX2JpZ3dvcmQgPSBiaWd3b3JkOworCisjaWZkZWYgRkVBVF9WSVNVQUwKKyAgICAvKiBDb3JyZWN0IGN1cnNvciB3aGVuICdzZWxlY3Rpb24nIGlzIGV4Y2x1c2l2ZSAqLworICAgIGlmIChWSXN1YWxfYWN0aXZlICYmICpwX3NlbCA9PSAnZScgJiYgbHQoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKwlkZWNfY3Vyc29yKCk7CisKKyAgICAvKgorICAgICAqIFdoZW4gVmlzdWFsIG1vZGUgaXMgbm90IGFjdGl2ZSwgb3Igd2hlbiB0aGUgVklzdWFsIGFyZWEgaXMgb25seSBvbmUKKyAgICAgKiBjaGFyYWN0ZXIsIHNlbGVjdCB0aGUgd29yZCBhbmQvb3Igd2hpdGUgc3BhY2UgdW5kZXIgdGhlIGN1cnNvci4KKyAgICAgKi8KKyAgICBpZiAoIVZJc3VhbF9hY3RpdmUgfHwgZXF1YWxwb3MoY3Vyd2luLT53X2N1cnNvciwgVklzdWFsKSkKKyNlbmRpZgorICAgIHsKKwkvKgorCSAqIEdvIHRvIHN0YXJ0IG9mIGN1cnJlbnQgd29yZCBvciB3aGl0ZSBzcGFjZS4KKwkgKi8KKwliYWNrX2luX2xpbmUoKTsKKwlzdGFydF9wb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworCisJLyoKKwkgKiBJZiB0aGUgc3RhcnQgaXMgb24gd2hpdGUgc3BhY2UsIGFuZCB3aGl0ZSBzcGFjZSBzaG91bGQgYmUgaW5jbHVkZWQKKwkgKiAoIgl3b3JkIiksIG9yIHN0YXJ0IGlzIG5vdCBvbiB3aGl0ZSBzcGFjZSwgYW5kIHdoaXRlIHNwYWNlIHNob3VsZAorCSAqIG5vdCBiZSBpbmNsdWRlZCAoIndvcmQiKSwgZmluZCBlbmQgb2Ygd29yZC4KKwkgKi8KKwlpZiAoKGNscygpID09IDApID09IGluY2x1ZGUpCisJeworCSAgICBpZiAoZW5kX3dvcmQoMUwsIGJpZ3dvcmQsIFRSVUUsIFRSVUUpID09IEZBSUwpCisJCXJldHVybiBGQUlMOworCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBJZiB0aGUgc3RhcnQgaXMgbm90IG9uIHdoaXRlIHNwYWNlLCBhbmQgd2hpdGUgc3BhY2Ugc2hvdWxkIGJlCisJICAgICAqIGluY2x1ZGVkICgid29yZAkgIiksIG9yIHN0YXJ0IGlzIG9uIHdoaXRlIHNwYWNlIGFuZCB3aGl0ZQorCSAgICAgKiBzcGFjZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkICgiCSAiKSwgZmluZCBzdGFydCBvZiB3b3JkLgorCSAgICAgKiBJZiB3ZSBlbmQgdXAgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgbmV4dCBsaW5lIChzaW5nbGUgY2hhcgorCSAgICAgKiB3b3JkKSBiYWNrIHVwIHRvIGVuZCBvZiB0aGUgbGluZS4KKwkgICAgICovCisJICAgIGZ3ZF93b3JkKDFMLCBiaWd3b3JkLCBUUlVFKTsKKwkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IuY29sID09IDApCisJCWRlY2woJmN1cndpbi0+d19jdXJzb3IpOworCSAgICBlbHNlCisJCW9uZWxlZnQoKTsKKworCSAgICBpZiAoaW5jbHVkZSkKKwkJaW5jbHVkZV93aGl0ZSA9IFRSVUU7CisJfQorCisjaWZkZWYgRkVBVF9WSVNVQUwKKwlpZiAoVklzdWFsX2FjdGl2ZSkKKwl7CisJICAgIC8qIHNob3VsZCBkbyBzb21ldGhpbmcgd2hlbiBpbmNsdXNpdmUgPT0gRkFMU0UgISAqLworCSAgICBWSXN1YWwgPSBzdGFydF9wb3M7CisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURUQpOwkvKiB1cGRhdGUgdGhlIGludmVyc2lvbiAqLworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIG9hcC0+c3RhcnQgPSBzdGFydF9wb3M7CisJICAgIG9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKwl9CisJLS1jb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gY291bnQgaXMgc3RpbGwgPiAwLCBleHRlbmQgd2l0aCBtb3JlIG9iamVjdHMuCisgICAgICovCisgICAgd2hpbGUgKGNvdW50ID4gMCkKKyAgICB7CisJaW5jbHVzaXZlID0gVFJVRTsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChWSXN1YWxfYWN0aXZlICYmIGx0KGN1cndpbi0+d19jdXJzb3IsIFZJc3VhbCkpCisJeworCSAgICAvKgorCSAgICAgKiBJbiBWaXN1YWwgbW9kZSwgd2l0aCBjdXJzb3IgYXQgc3RhcnQ6IG1vdmUgY3Vyc29yIGJhY2suCisJICAgICAqLworCSAgICBpZiAoZGVjbCgmY3Vyd2luLT53X2N1cnNvcikgPT0gLTEpCisJCXJldHVybiBGQUlMOworCSAgICBpZiAoaW5jbHVkZSAhPSAoY2xzKCkgIT0gMCkpCisJICAgIHsKKwkJaWYgKGJja193b3JkKDFMLCBiaWd3b3JkLCBUUlVFKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChiY2tlbmRfd29yZCgxTCwgYmlnd29yZCwgVFJVRSkgPT0gRkFJTCkKKwkJICAgIHJldHVybiBGQUlMOworCQkodm9pZClpbmNsKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIE1vdmUgY3Vyc29yIGZvcndhcmQgb25lIHdvcmQgYW5kL29yIHdoaXRlIGFyZWEuCisJICAgICAqLworCSAgICBpZiAoaW5jbCgmY3Vyd2luLT53X2N1cnNvcikgPT0gLTEpCisJCXJldHVybiBGQUlMOworCSAgICBpZiAoaW5jbHVkZSAhPSAoY2xzKCkgPT0gMCkpCisJICAgIHsKKwkJaWYgKGZ3ZF93b3JkKDFMLCBiaWd3b3JkLCBUUlVFKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisJCS8qCisJCSAqIElmIGVuZCBpcyBqdXN0IHBhc3QgYSBuZXctbGluZSwgd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCisJCSAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUKKwkJICovCisJCWlmIChvbmVsZWZ0KCkgPT0gRkFJTCkJLyogcHV0IGN1cnNvciBvbiBsYXN0IGNoYXIgb2Ygd2hpdGUgKi8KKwkJICAgIGluY2x1c2l2ZSA9IEZBTFNFOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoZW5kX3dvcmQoMUwsIGJpZ3dvcmQsIFRSVUUsIFRSVUUpID09IEZBSUwpCisJCSAgICByZXR1cm4gRkFJTDsKKwkgICAgfQorCX0KKwktLWNvdW50OworICAgIH0KKworICAgIGlmIChpbmNsdWRlX3doaXRlICYmIGNscygpICE9IDApCisgICAgeworCS8qCisJICogSWYgd2UgZG9uJ3QgaW5jbHVkZSB3aGl0ZSBzcGFjZSBhdCB0aGUgZW5kLCBtb3ZlIHRoZSBzdGFydAorCSAqIHRvIGluY2x1ZGUgc29tZSB3aGl0ZSBzcGFjZSB0aGVyZS4gVGhpcyBtYWtlcyAiZGF3IiB3b3JrCisJICogYmV0dGVyIG9uIHRoZSBsYXN0IHdvcmQgaW4gYSBzZW50ZW5jZSAoYW5kICIyZGF3IiBvbiBsYXN0LWJ1dC1vbmUKKwkgKiB3b3JkKS4gIEJ1dCBkb24ndCBkZWxldGUgd2hpdGUgc3BhY2UgYXQgc3RhcnQgb2YgbGluZSAoaW5kZW50KS4KKwkgKi8KKwlwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiBzYXZlIGN1cnNvciBwb3NpdGlvbiAqLworCWN1cndpbi0+d19jdXJzb3IgPSBzdGFydF9wb3M7CisJaWYgKG9uZWxlZnQoKSA9PSBPSykKKwl7CisJICAgIGJhY2tfaW5fbGluZSgpOworCSAgICBpZiAoY2xzKCkgPT0gMCAmJiBjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IDApCisJICAgIHsKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlpZiAoVklzdWFsX2FjdGl2ZSkKKwkJICAgIFZJc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgb2FwLT5zdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIH0KKwl9CisJY3Vyd2luLT53X2N1cnNvciA9IHBvczsJLyogcHV0IGN1cnNvciBiYWNrIGF0IGVuZCAqLworICAgIH0KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCWlmICgqcF9zZWwgPT0gJ2UnICYmIGluY2x1c2l2ZSAmJiBsdG9yZXEoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKwkgICAgaW5jX2N1cnNvcigpOworCWlmIChWSXN1YWxfbW9kZSA9PSAnVicpCisJeworCSAgICBWSXN1YWxfbW9kZSA9ICd2JzsKKwkgICAgcmVkcmF3X2NtZGxpbmUgPSBUUlVFOwkJLyogc2hvdyBtb2RlIGxhdGVyICovCisJfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlvYXAtPmluY2x1c2l2ZSA9IGluY2x1c2l2ZTsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIEZpbmQgc2VudGVuY2UocykgdW5kZXIgdGhlIGN1cnNvciwgY3Vyc29yIGF0IGVuZC4KKyAqIFdoZW4gVmlzdWFsIGFjdGl2ZSwgZXh0ZW5kIGl0IGJ5IG9uZSBvciBtb3JlIHNlbnRlbmNlcy4KKyAqLworICAgIGludAorY3VycmVudF9zZW50KG9hcCwgY291bnQsIGluY2x1ZGUpCisgICAgb3BhcmdfVAkqb2FwOworICAgIGxvbmcJY291bnQ7CisgICAgaW50CQlpbmNsdWRlOworeworICAgIHBvc19UCXN0YXJ0X3BvczsKKyAgICBwb3NfVAlwb3M7CisgICAgaW50CQlzdGFydF9ibGFuazsKKyAgICBpbnQJCWM7CisgICAgaW50CQlhdF9zdGFydF9zZW50OworICAgIGxvbmcJbmNvdW50OworCisgICAgc3RhcnRfcG9zID0gY3Vyd2luLT53X2N1cnNvcjsKKyAgICBwb3MgPSBzdGFydF9wb3M7CisgICAgZmluZHNlbnQoRk9SV0FSRCwgMUwpOwkvKiBGaW5kIHN0YXJ0IG9mIG5leHQgc2VudGVuY2UuICovCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qCisgICAgICogV2hlbiB2aXN1YWwgYXJlYSBpcyBiaWdnZXIgdGhhbiBvbmUgY2hhcmFjdGVyOiBFeHRlbmQgaXQuCisgICAgICovCisgICAgaWYgKFZJc3VhbF9hY3RpdmUgJiYgIWVxdWFscG9zKHN0YXJ0X3BvcywgVklzdWFsKSkKKyAgICB7CitleHRlbmQ6CisJaWYgKGx0KHN0YXJ0X3BvcywgVklzdWFsKSkKKwl7CisJICAgIC8qCisJICAgICAqIEN1cnNvciBhdCBzdGFydCBvZiBWaXN1YWwgYXJlYS4KKwkgICAgICogRmluZCBvdXQgd2hlcmUgd2UgYXJlOgorCSAgICAgKiAtIGluIHRoZSB3aGl0ZSBzcGFjZSBiZWZvcmUgYSBzZW50ZW5jZQorCSAgICAgKiAtIGluIGEgc2VudGVuY2Ugb3IganVzdCBhZnRlciBpdAorCSAgICAgKiAtIGF0IHRoZSBzdGFydCBvZiBhIHNlbnRlbmNlCisJICAgICAqLworCSAgICBhdF9zdGFydF9zZW50ID0gVFJVRTsKKwkgICAgZGVjbCgmcG9zKTsKKwkgICAgd2hpbGUgKGx0KHBvcywgY3Vyd2luLT53X2N1cnNvcikpCisJICAgIHsKKwkJYyA9IGdjaGFyX3BvcygmcG9zKTsKKwkJaWYgKCF2aW1faXN3aGl0ZShjKSkKKwkJeworCQkgICAgYXRfc3RhcnRfc2VudCA9IEZBTFNFOworCQkgICAgYnJlYWs7CisJCX0KKwkJaW5jbCgmcG9zKTsKKwkgICAgfQorCSAgICBpZiAoIWF0X3N0YXJ0X3NlbnQpCisJICAgIHsKKwkJZmluZHNlbnQoQkFDS1dBUkQsIDFMKTsKKwkJaWYgKGVxdWFscG9zKGN1cndpbi0+d19jdXJzb3IsIHN0YXJ0X3BvcykpCisJCSAgICBhdF9zdGFydF9zZW50ID0gVFJVRTsgIC8qIGV4YWN0bHkgYXQgc3RhcnQgb2Ygc2VudGVuY2UgKi8KKwkJZWxzZQorCQkgICAgLyogaW5zaWRlIGEgc2VudGVuY2UsIGdvIHRvIGl0cyBlbmQgKHN0YXJ0IG9mIG5leHQpICovCisJCSAgICBmaW5kc2VudChGT1JXQVJELCAxTCk7CisJICAgIH0KKwkgICAgaWYgKGluY2x1ZGUpCS8qICJhcyIgZ2V0cyB0d2ljZSBhcyBtdWNoIGFzICJpcyIgKi8KKwkJY291bnQgKj0gMjsKKwkgICAgd2hpbGUgKGNvdW50LS0pCisJICAgIHsKKwkJaWYgKGF0X3N0YXJ0X3NlbnQpCisJCSAgICBmaW5kX2ZpcnN0X2JsYW5rKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwkJYyA9IGdjaGFyX2N1cnNvcigpOworCQlpZiAoIWF0X3N0YXJ0X3NlbnQgfHwgKCFpbmNsdWRlICYmICF2aW1faXN3aGl0ZShjKSkpCisJCSAgICBmaW5kc2VudChCQUNLV0FSRCwgMUwpOworCQlhdF9zdGFydF9zZW50ID0gIWF0X3N0YXJ0X3NlbnQ7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgICogQ3Vyc29yIGF0IGVuZCBvZiBWaXN1YWwgYXJlYS4KKwkgICAgICogRmluZCBvdXQgd2hlcmUgd2UgYXJlOgorCSAgICAgKiAtIGp1c3QgYmVmb3JlIGEgc2VudGVuY2UKKwkgICAgICogLSBqdXN0IGJlZm9yZSBvciBpbiB0aGUgd2hpdGUgc3BhY2UgYmVmb3JlIGEgc2VudGVuY2UKKwkgICAgICogLSBpbiBhIHNlbnRlbmNlCisJICAgICAqLworCSAgICBpbmNsKCZwb3MpOworCSAgICBhdF9zdGFydF9zZW50ID0gVFJVRTsKKwkgICAgaWYgKCFlcXVhbHBvcyhwb3MsIGN1cndpbi0+d19jdXJzb3IpKSAvKiBub3QganVzdCBiZWZvcmUgYSBzZW50ZW5jZSAqLworCSAgICB7CisJCWF0X3N0YXJ0X3NlbnQgPSBGQUxTRTsKKwkJd2hpbGUgKGx0KHBvcywgY3Vyd2luLT53X2N1cnNvcikpCisJCXsKKwkJICAgIGMgPSBnY2hhcl9wb3MoJnBvcyk7CisJCSAgICBpZiAoIXZpbV9pc3doaXRlKGMpKQorCQkgICAgeworCQkJYXRfc3RhcnRfc2VudCA9IFRSVUU7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGluY2woJnBvcyk7CisJCX0KKwkJaWYgKGF0X3N0YXJ0X3NlbnQpCS8qIGluIHRoZSBzZW50ZW5jZSAqLworCQkgICAgZmluZHNlbnQoQkFDS1dBUkQsIDFMKTsKKwkJZWxzZQkJLyogaW4vYmVmb3JlIHdoaXRlIGJlZm9yZSBhIHNlbnRlbmNlICovCisJCSAgICBjdXJ3aW4tPndfY3Vyc29yID0gc3RhcnRfcG9zOworCSAgICB9CisKKwkgICAgaWYgKGluY2x1ZGUpCS8qICJhcyIgZ2V0cyB0d2ljZSBhcyBtdWNoIGFzICJpcyIgKi8KKwkJY291bnQgKj0gMjsKKwkgICAgZmluZHNlbnRfZm9yd2FyZChjb3VudCwgYXRfc3RhcnRfc2VudCk7CisJICAgIGlmICgqcF9zZWwgPT0gJ2UnKQorCQkrK2N1cndpbi0+d19jdXJzb3IuY29sOworCX0KKwlyZXR1cm4gT0s7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIElmIGN1cnNvciBzdGFydGVkIG9uIGJsYW5rLCBjaGVjayBpZiBpdCBpcyBqdXN0IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlCisgICAgICogbmV4dCBzZW50ZW5jZS4KKyAgICAgKi8KKyAgICB3aGlsZSAoYyA9IGdjaGFyX3BvcygmcG9zKSwgdmltX2lzd2hpdGUoYykpCS8qIHZpbV9pc3doaXRlKCkgaXMgYSBtYWNybyAqLworCWluY2woJnBvcyk7CisgICAgaWYgKGVxdWFscG9zKHBvcywgY3Vyd2luLT53X2N1cnNvcikpCisgICAgeworCXN0YXJ0X2JsYW5rID0gVFJVRTsKKwlmaW5kX2ZpcnN0X2JsYW5rKCZzdGFydF9wb3MpOwkvKiBnbyBiYWNrIHRvIGZpcnN0IGJsYW5rICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc3RhcnRfYmxhbmsgPSBGQUxTRTsKKwlmaW5kc2VudChCQUNLV0FSRCwgMUwpOworCXN0YXJ0X3BvcyA9IGN1cndpbi0+d19jdXJzb3I7CisgICAgfQorICAgIGlmIChpbmNsdWRlKQorCW5jb3VudCA9IGNvdW50ICogMjsKKyAgICBlbHNlCisgICAgeworCW5jb3VudCA9IGNvdW50OworCWlmIChzdGFydF9ibGFuaykKKwkgICAgLS1uY291bnQ7CisgICAgfQorICAgIGlmIChuY291bnQpCisJZmluZHNlbnRfZm9yd2FyZChuY291bnQsIFRSVUUpOworICAgIGVsc2UKKwlkZWNsKCZjdXJ3aW4tPndfY3Vyc29yKTsKKworICAgIGlmIChpbmNsdWRlKQorICAgIHsKKwkvKgorCSAqIElmIHRoZSBibGFuayBpbiBmcm9udCBvZiB0aGUgc2VudGVuY2UgaXMgaW5jbHVkZWQsIGV4Y2x1ZGUgdGhlCisJICogYmxhbmtzIGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlLCBnbyBiYWNrIHRvIHRoZSBmaXJzdCBibGFuay4KKwkgKiBJZiB0aGVyZSBhcmUgbm8gdHJhaWxpbmcgYmxhbmtzLCB0cnkgdG8gaW5jbHVkZSBsZWFkaW5nIGJsYW5rcy4KKwkgKi8KKwlpZiAoc3RhcnRfYmxhbmspCisJeworCSAgICBmaW5kX2ZpcnN0X2JsYW5rKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwkgICAgYyA9IGdjaGFyX3BvcygmY3Vyd2luLT53X2N1cnNvcik7CS8qIHZpbV9pc3doaXRlKCkgaXMgYSBtYWNybyAqLworCSAgICBpZiAodmltX2lzd2hpdGUoYykpCisJCWRlY2woJmN1cndpbi0+d19jdXJzb3IpOworCX0KKwllbHNlIGlmIChjID0gZ2NoYXJfY3Vyc29yKCksICF2aW1faXN3aGl0ZShjKSkKKwkgICAgZmluZF9maXJzdF9ibGFuaygmc3RhcnRfcG9zKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorICAgIHsKKwkvKiBhdm9pZCBnZXR0aW5nIHN0dWNrIHdpdGggImlzIiBvbiBhIHNpbmdsZSBzcGFjZSBiZWZvcmUgYSBzZW50LiAqLworCWlmIChlcXVhbHBvcyhzdGFydF9wb3MsIGN1cndpbi0+d19jdXJzb3IpKQorCSAgICBnb3RvIGV4dGVuZDsKKwlpZiAoKnBfc2VsID09ICdlJykKKwkgICAgKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKwlWSXN1YWwgPSBzdGFydF9wb3M7CisJVklzdWFsX21vZGUgPSAndic7CisJcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CS8qIHVwZGF0ZSB0aGUgaW52ZXJzaW9uICovCisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKiBpbmNsdWRlIGEgbmV3bGluZSBhZnRlciB0aGUgc2VudGVuY2UsIGlmIHRoZXJlIGlzIG9uZSAqLworCWlmIChpbmNsKCZjdXJ3aW4tPndfY3Vyc29yKSA9PSAtMSkKKwkgICAgb2FwLT5pbmNsdXNpdmUgPSBUUlVFOworCWVsc2UKKwkgICAgb2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKwlvYXAtPnN0YXJ0ID0gc3RhcnRfcG9zOworCW9hcC0+bW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CitjdXJyZW50X2Jsb2NrKG9hcCwgY291bnQsIGluY2x1ZGUsIHdoYXQsIG90aGVyKQorICAgIG9wYXJnX1QJKm9hcDsKKyAgICBsb25nCWNvdW50OworICAgIGludAkJaW5jbHVkZTsJLyogVFJVRSA9PSBpbmNsdWRlIHdoaXRlIHNwYWNlICovCisgICAgaW50CQl3aGF0OwkJLyogJygnLCAneycsIGV0Yy4gKi8KKyAgICBpbnQJCW90aGVyOwkJLyogJyknLCAnfScsIGV0Yy4gKi8KK3sKKyAgICBwb3NfVAlvbGRfcG9zOworICAgIHBvc19UCSpwb3MgPSBOVUxMOworICAgIHBvc19UCXN0YXJ0X3BvczsKKyAgICBwb3NfVAkqZW5kX3BvczsKKyAgICBwb3NfVAlvbGRfc3RhcnQsIG9sZF9lbmQ7CisgICAgY2hhcl91CSpzYXZlX2NwbzsKKyAgICBpbnQJCXNvbCA9IEZBTFNFOwkvKiB7IGF0IHN0YXJ0IG9mIGxpbmUgKi8KKworICAgIG9sZF9wb3MgPSBjdXJ3aW4tPndfY3Vyc29yOworICAgIG9sZF9lbmQgPSBjdXJ3aW4tPndfY3Vyc29yOwkJICAgIC8qIHJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQgKi8KKyAgICBvbGRfc3RhcnQgPSBvbGRfZW5kOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBzdGFydCBvbiAnKCcsICd7JywgJyknLCAnfScsIGV0Yy4sIHVzZSB0aGUgd2hvbGUgYmxvY2sgaW5jbHVzaXZlLgorICAgICAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKCFWSXN1YWxfYWN0aXZlIHx8IGVxdWFscG9zKFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisjZW5kaWYKKyAgICB7CisJc2V0cGNtYXJrKCk7CisJaWYgKHdoYXQgPT0gJ3snKQkJICAgIC8qIGlnbm9yZSBpbmRlbnQgKi8KKwkgICAgd2hpbGUgKGluaW5kZW50KDEpKQorCQlpZiAoaW5jX2N1cnNvcigpICE9IDApCisJCSAgICBicmVhazsKKwlpZiAoZ2NoYXJfY3Vyc29yKCkgPT0gd2hhdCkJICAgIC8qIGN1cnNvciBvbiAnKCcgb3IgJ3snICovCisJICAgICsrY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgfQorI2lmZGVmIEZFQVRfVklTVUFMCisgICAgZWxzZSBpZiAobHQoVklzdWFsLCBjdXJ3aW4tPndfY3Vyc29yKSkKKyAgICB7CisJb2xkX3N0YXJ0ID0gVklzdWFsOworCWN1cndpbi0+d19jdXJzb3IgPSBWSXN1YWw7CSAgICAvKiBjdXJzb3IgYXQgbG93IGVuZCBvZiBWaXN1YWwgKi8KKyAgICB9CisgICAgZWxzZQorCW9sZF9lbmQgPSBWSXN1YWw7CisjZW5kaWYKKworICAgIC8qCisgICAgICogU2VhcmNoIGJhY2t3YXJkcyBmb3IgdW5jbG9zZWQgJygnLCAneycsIGV0Yy4uCisgICAgICogUHV0IHRoaXMgcG9zaXRpb24gaW4gc3RhcnRfcG9zLgorICAgICAqIElnbm9yeSBxdW90ZXMgaGVyZS4KKyAgICAgKi8KKyAgICBzYXZlX2NwbyA9IHBfY3BvOworICAgIHBfY3BvID0gKGNoYXJfdSAqKSIlIjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApCisgICAgeworCWlmICgocG9zID0gZmluZG1hdGNoKE5VTEwsIHdoYXQpKSA9PSBOVUxMKQorCSAgICBicmVhazsKKwljdXJ3aW4tPndfY3Vyc29yID0gKnBvczsKKwlzdGFydF9wb3MgPSAqcG9zOyAgIC8qIHRoZSBmaW5kbWF0Y2ggZm9yIGVuZF9wb3Mgd2lsbCBvdmVyd3JpdGUgKnBvcyAqLworICAgIH0KKyAgICBwX2NwbyA9IHNhdmVfY3BvOworCisgICAgLyoKKyAgICAgKiBTZWFyY2ggZm9yIG1hdGNoaW5nICcpJywgJ30nLCBldGMuCisgICAgICogUHV0IHRoaXMgcG9zaXRpb24gaW4gY3Vyd2luLT53X2N1cnNvci4KKyAgICAgKi8KKyAgICBpZiAocG9zID09IE5VTEwgfHwgKGVuZF9wb3MgPSBmaW5kbWF0Y2goTlVMTCwgb3RoZXIpKSA9PSBOVUxMKQorICAgIHsKKwljdXJ3aW4tPndfY3Vyc29yID0gb2xkX3BvczsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisgICAgY3Vyd2luLT53X2N1cnNvciA9ICplbmRfcG9zOworCisgICAgLyoKKyAgICAgKiBUcnkgdG8gZXhjbHVkZSB0aGUgJygnLCAneycsICcpJywgJ30nLCBldGMuIHdoZW4gImluY2x1ZGUiIGlzIEZBTFNFLgorICAgICAqIElmIHRoZSBlbmRpbmcgJ30nIGlzIG9ubHkgcHJlY2VkZWQgYnkgaW5kZW50LCBza2lwIHRoYXQgaW5kZW50LgorICAgICAqIEJ1dCBvbmx5IGlmIHRoZSByZXN1bHRpbmcgYXJlYSBpcyBub3Qgc21hbGxlciB0aGFuIHdoYXQgd2Ugc3RhcnRlZCB3aXRoLgorICAgICAqLworICAgIHdoaWxlICghaW5jbHVkZSkKKyAgICB7CisJaW5jbCgmc3RhcnRfcG9zKTsKKwlzb2wgPSAoY3Vyd2luLT53X2N1cnNvci5jb2wgPT0gMCk7CisJZGVjbCgmY3Vyd2luLT53X2N1cnNvcik7CisJaWYgKHdoYXQgPT0gJ3snKQorCSAgICB3aGlsZSAoaW5pbmRlbnQoMSkpCisJICAgIHsKKwkJc29sID0gVFJVRTsKKwkJaWYgKGRlY2woJmN1cndpbi0+d19jdXJzb3IpICE9IDApCisJCSAgICBicmVhazsKKwkgICAgfQorI2lmZGVmIEZFQVRfVklTVUFMCisJLyoKKwkgKiBJbiBWaXN1YWwgbW9kZSwgd2hlbiB0aGUgcmVzdWx0aW5nIGFyZWEgaXMgbm90IGJpZ2dlciB0aGFuIHdoYXQgd2UKKwkgKiBzdGFydGVkIHdpdGgsIGV4dGVuZCBpdCB0byB0aGUgbmV4dCBibG9jaywgYW5kIHRoZW4gZXhjbHVkZSBhZ2Fpbi4KKwkgKi8KKwlpZiAoIWx0KHN0YXJ0X3Bvcywgb2xkX3N0YXJ0KSAmJiAhbHQob2xkX2VuZCwgY3Vyd2luLT53X2N1cnNvcikKKwkJJiYgVklzdWFsX2FjdGl2ZSkKKwl7CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSBvbGRfc3RhcnQ7CisJICAgIGRlY2woJmN1cndpbi0+d19jdXJzb3IpOworCSAgICBpZiAoKHBvcyA9IGZpbmRtYXRjaChOVUxMLCB3aGF0KSkgPT0gTlVMTCkKKwkgICAgeworCQljdXJ3aW4tPndfY3Vyc29yID0gb2xkX3BvczsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgc3RhcnRfcG9zID0gKnBvczsKKwkgICAgY3Vyd2luLT53X2N1cnNvciA9ICpwb3M7CisJICAgIGlmICgoZW5kX3BvcyA9IGZpbmRtYXRjaChOVUxMLCBvdGhlcikpID09IE5VTEwpCisJICAgIHsKKwkJY3Vyd2luLT53X2N1cnNvciA9IG9sZF9wb3M7CisJCXJldHVybiBGQUlMOworCSAgICB9CisJICAgIGN1cndpbi0+d19jdXJzb3IgPSAqZW5kX3BvczsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGJyZWFrOworICAgIH0KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCWlmICgqcF9zZWwgPT0gJ2UnKQorCSAgICArK2N1cndpbi0+d19jdXJzb3IuY29sOworCWlmIChzb2wpCisJICAgIGluYygmY3Vyd2luLT53X2N1cnNvcik7CS8qIGluY2x1ZGUgdGhlIGxpbmUgYnJlYWsgKi8KKwlWSXN1YWwgPSBzdGFydF9wb3M7CisJVklzdWFsX21vZGUgPSAndic7CisJcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CS8qIHVwZGF0ZSB0aGUgaW52ZXJzaW9uICovCisJc2hvd21vZGUoKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCW9hcC0+c3RhcnQgPSBzdGFydF9wb3M7CisJb2FwLT5tb3Rpb25fdHlwZSA9IE1DSEFSOworCWlmIChzb2wpCisJeworCSAgICBpbmNsKCZjdXJ3aW4tPndfY3Vyc29yKTsKKwkgICAgb2FwLT5pbmNsdXNpdmUgPSBGQUxTRTsKKwl9CisJZWxzZQorCSAgICBvYXAtPmluY2x1c2l2ZSA9IFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisgICAgaW50CitjdXJyZW50X3BhcihvYXAsIGNvdW50LCBpbmNsdWRlLCB0eXBlKQorICAgIG9wYXJnX1QJKm9hcDsKKyAgICBsb25nCWNvdW50OworICAgIGludAkJaW5jbHVkZTsJLyogVFJVRSA9PSBpbmNsdWRlIHdoaXRlIHNwYWNlICovCisgICAgaW50CQl0eXBlOwkJLyogJ3AnIGZvciBwYXJhZ3JhcGgsICdTJyBmb3Igc2VjdGlvbiAqLworeworICAgIGxpbmVucl9UCXN0YXJ0X2xudW07CisgICAgbGluZW5yX1QJZW5kX2xudW07CisgICAgaW50CQl3aGl0ZV9pbl9mcm9udDsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCXN0YXJ0X2lzX3doaXRlOworICAgIGludAkJcHJldl9zdGFydF9pc193aGl0ZTsKKyAgICBpbnQJCXJldHZhbCA9IE9LOworICAgIGludAkJZG9fd2hpdGUgPSBGQUxTRTsKKyAgICBpbnQJCXQ7CisgICAgaW50CQlpOworCisgICAgaWYgKHR5cGUgPT0gJ1MnKQkgICAgLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCXJldHVybiBGQUlMOworCisgICAgc3RhcnRfbG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bTsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiBXaGVuIHZpc3VhbCBhcmVhIGlzIG1vcmUgdGhhbiBvbmUgbGluZTogZXh0ZW5kIGl0LgorICAgICAqLworICAgIGlmIChWSXN1YWxfYWN0aXZlICYmIHN0YXJ0X2xudW0gIT0gVklzdWFsLmxudW0pCisgICAgeworZXh0ZW5kOgorCWlmIChzdGFydF9sbnVtIDwgVklzdWFsLmxudW0pCisJICAgIGRpciA9IEJBQ0tXQVJEOworCWVsc2UKKwkgICAgZGlyID0gRk9SV0FSRDsKKwlmb3IgKGkgPSBjb3VudDsgLS1pID49IDA7ICkKKwl7CisJICAgIGlmIChzdGFydF9sbnVtID09CisJCQkgICAoZGlyID09IEJBQ0tXQVJEID8gMSA6IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KSkKKwkgICAgeworCQlyZXR2YWwgPSBGQUlMOworCQlicmVhazsKKwkgICAgfQorCisJICAgIHByZXZfc3RhcnRfaXNfd2hpdGUgPSAtMTsKKwkgICAgZm9yICh0ID0gMDsgdCA8IDI7ICsrdCkKKwkgICAgeworCQlzdGFydF9sbnVtICs9IGRpcjsKKwkJc3RhcnRfaXNfd2hpdGUgPSBsaW5ld2hpdGUoc3RhcnRfbG51bSk7CisJCWlmIChwcmV2X3N0YXJ0X2lzX3doaXRlID09IHN0YXJ0X2lzX3doaXRlKQorCQl7CisJCSAgICBzdGFydF9sbnVtIC09IGRpcjsKKwkJICAgIGJyZWFrOworCQl9CisJCWZvciAoOzspCisJCXsKKwkJICAgIGlmIChzdGFydF9sbnVtID09IChkaXIgPT0gQkFDS1dBUkQKKwkJCQkJICAgID8gMSA6IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KSkKKwkJCWJyZWFrOworCQkgICAgaWYgKHN0YXJ0X2lzX3doaXRlICE9IGxpbmV3aGl0ZShzdGFydF9sbnVtICsgZGlyKQorCQkJICAgIHx8ICghc3RhcnRfaXNfd2hpdGUKKwkJCQkgICAgJiYgc3RhcnRQUyhzdGFydF9sbnVtICsgKGRpciA+IDAKKwkJCQkJCQkgICAgID8gMSA6IDApLCAwLCAwKSkpCisJCQlicmVhazsKKwkJICAgIHN0YXJ0X2xudW0gKz0gZGlyOworCQl9CisJCWlmICghaW5jbHVkZSkKKwkJICAgIGJyZWFrOworCQlpZiAoc3RhcnRfbG51bSA9PSAoZGlyID09IEJBQ0tXQVJECisJCQkJCSAgICA/IDEgOiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkpCisJCSAgICBicmVhazsKKwkJcHJldl9zdGFydF9pc193aGl0ZSA9IHN0YXJ0X2lzX3doaXRlOworCSAgICB9CisJfQorCWN1cndpbi0+d19jdXJzb3IubG51bSA9IHN0YXJ0X2xudW07CisJY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOworCXJldHVybiByZXR2YWw7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZpcnN0IG1vdmUgYmFjayB0byB0aGUgc3RhcnRfbG51bSBvZiB0aGUgcGFyYWdyYXBoIG9yIHdoaXRlIGxpbmVzCisgICAgICovCisgICAgd2hpdGVfaW5fZnJvbnQgPSBsaW5ld2hpdGUoc3RhcnRfbG51bSk7CisgICAgd2hpbGUgKHN0YXJ0X2xudW0gPiAxKQorICAgIHsKKwlpZiAod2hpdGVfaW5fZnJvbnQpCSAgICAvKiBzdG9wIGF0IGZpcnN0IHdoaXRlIGxpbmUgKi8KKwl7CisJICAgIGlmICghbGluZXdoaXRlKHN0YXJ0X2xudW0gLSAxKSkKKwkJYnJlYWs7CisJfQorCWVsc2UJCS8qIHN0b3AgYXQgZmlyc3Qgbm9uLXdoaXRlIGxpbmUgb2Ygc3RhcnQgb2YgcGFyYWdyYXBoICovCisJeworCSAgICBpZiAobGluZXdoaXRlKHN0YXJ0X2xudW0gLSAxKSB8fCBzdGFydFBTKHN0YXJ0X2xudW0sIDAsIDApKQorCQlicmVhazsKKwl9CisJLS1zdGFydF9sbnVtOworICAgIH0KKworICAgIC8qCisgICAgICogTW92ZSBwYXN0IHRoZSBlbmQgb2YgYW55IHdoaXRlIGxpbmVzLgorICAgICAqLworICAgIGVuZF9sbnVtID0gc3RhcnRfbG51bTsKKyAgICB3aGlsZSAobGluZXdoaXRlKGVuZF9sbnVtKSAmJiBlbmRfbG51bSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCSAgICArK2VuZF9sbnVtOworCisgICAgLS1lbmRfbG51bTsKKyAgICBpID0gY291bnQ7CisgICAgaWYgKCFpbmNsdWRlICYmIHdoaXRlX2luX2Zyb250KQorCS0taTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKwlpZiAoZW5kX2xudW0gPT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJICAgIHJldHVybiBGQUlMOworCisJaWYgKCFpbmNsdWRlKQorCSAgICBkb193aGl0ZSA9IGxpbmV3aGl0ZShlbmRfbG51bSArIDEpOworCisJaWYgKGluY2x1ZGUgfHwgIWRvX3doaXRlKQorCXsKKwkgICAgKytlbmRfbG51bTsKKwkgICAgLyoKKwkgICAgICogc2tpcCB0byBlbmQgb2YgcGFyYWdyYXBoCisJICAgICAqLworCSAgICB3aGlsZSAoZW5kX2xudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCQkgICAgJiYgIWxpbmV3aGl0ZShlbmRfbG51bSArIDEpCisJCSAgICAmJiAhc3RhcnRQUyhlbmRfbG51bSArIDEsIDAsIDApKQorCQkrK2VuZF9sbnVtOworCX0KKworCWlmIChpID09IDAgJiYgd2hpdGVfaW5fZnJvbnQgJiYgaW5jbHVkZSkKKwkgICAgYnJlYWs7CisKKwkvKgorCSAqIHNraXAgdG8gZW5kIG9mIHdoaXRlIGxpbmVzIGFmdGVyIHBhcmFncmFwaAorCSAqLworCWlmIChpbmNsdWRlIHx8IGRvX3doaXRlKQorCSAgICB3aGlsZSAoZW5kX2xudW0gPCBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudAorCQkJCQkJICAgJiYgbGluZXdoaXRlKGVuZF9sbnVtICsgMSkpCisJCSsrZW5kX2xudW07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbm8gZW1wdHkgbGluZXMgYXQgdGhlIGVuZCwgdHJ5IHRvIGZpbmQgc29tZSBlbXB0eSBsaW5lcyBhdAorICAgICAqIHRoZSBzdGFydCAodW5sZXNzIHRoYXQgaGFzIGJlZW4gZG9uZSBhbHJlYWR5KS4KKyAgICAgKi8KKyAgICBpZiAoIXdoaXRlX2luX2Zyb250ICYmICFsaW5ld2hpdGUoZW5kX2xudW0pICYmIGluY2x1ZGUpCisJd2hpbGUgKHN0YXJ0X2xudW0gPiAxICYmIGxpbmV3aGl0ZShzdGFydF9sbnVtIC0gMSkpCisJICAgIC0tc3RhcnRfbG51bTsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisgICAgeworCS8qIFByb2JsZW06IHdoZW4gZG9pbmcgIlZpcGlwaXAiIG5vdGhpbmcgaGFwcGVucyBpbiBhIHNpbmdsZSB3aGl0ZQorCSAqIGxpbmUsIHdlIGdldCBzdHVjayB0aGVyZS4gIFRyYXAgdGhpcyBoZXJlLiAqLworCWlmIChWSXN1YWxfbW9kZSA9PSAnVicgJiYgc3RhcnRfbG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisJICAgIGdvdG8gZXh0ZW5kOworCVZJc3VhbC5sbnVtID0gc3RhcnRfbG51bTsKKwlWSXN1YWxfbW9kZSA9ICdWJzsKKwlyZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsJLyogdXBkYXRlIHRoZSBpbnZlcnNpb24gKi8KKwlzaG93bW9kZSgpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJb2FwLT5zdGFydC5sbnVtID0gc3RhcnRfbG51bTsKKwlvYXAtPnN0YXJ0LmNvbCA9IDA7CisJb2FwLT5tb3Rpb25fdHlwZSA9IE1MSU5FOworICAgIH0KKyAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBlbmRfbG51bTsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9MSVNQKSB8fCBkZWZpbmVkKEZFQVRfQ0lOREVOVCkgfHwgZGVmaW5lZChGRUFUX1RFWFRPQkopIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIHJldHVybiBUUlVFIGlmIGxpbmUgJ2xudW0nIGlzIGVtcHR5IG9yIGhhcyB3aGl0ZSBjaGFycyBvbmx5LgorICovCisgICAgaW50CitsaW5ld2hpdGUobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGNoYXJfdSAgKnA7CisKKyAgICBwID0gc2tpcHdoaXRlKG1sX2dldChsbnVtKSk7CisgICAgcmV0dXJuICgqcCA9PSBOVUwpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfRklORF9JRCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBGaW5kIGlkZW50aWZpZXJzIG9yIGRlZmluZXMgaW4gaW5jbHVkZWQgZmlsZXMuCisgKiBpZiBwX2ljICYmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX1NPTCkgdGhlbiBwdHIgbXVzdCBiZSBpbiBsb3dlcmNhc2UuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2ZpbmRfcGF0dGVybl9pbl9wYXRoKHB0ciwgZGlyLCBsZW4sIHdob2xlLCBza2lwX2NvbW1lbnRzLAorCQkJCSAgICB0eXBlLCBjb3VudCwgYWN0aW9uLCBzdGFydF9sbnVtLCBlbmRfbG51bSkKKyAgICBjaGFyX3UJKnB0cjsJCS8qIHBvaW50ZXIgdG8gc2VhcmNoIHBhdHRlcm4gKi8KKyAgICBpbnQJCWRpcjsJCS8qIGRpcmVjdGlvbiBvZiBleHBhbnNpb24gKi8KKyAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiBzZWFyY2ggcGF0dGVybiAqLworICAgIGludAkJd2hvbGU7CQkvKiBtYXRjaCB3aG9sZSB3b3JkcyBvbmx5ICovCisgICAgaW50CQlza2lwX2NvbW1lbnRzOwkvKiBkb24ndCBtYXRjaCBpbnNpZGUgY29tbWVudHMgKi8KKyAgICBpbnQJCXR5cGU7CQkvKiBUeXBlIG9mIHNlYXJjaDsgYXJlIHdlIGxvb2tpbmcgZm9yIGEgdHlwZT8KKwkJCQkgICBhIG1hY3JvPyAqLworICAgIGxvbmcJY291bnQ7CisgICAgaW50CQlhY3Rpb247CQkvKiBXaGF0IHRvIGRvIHdoZW4gd2UgZmluZCBpdCAqLworICAgIGxpbmVucl9UCXN0YXJ0X2xudW07CS8qIGZpcnN0IGxpbmUgdG8gc3RhcnQgc2VhcmNoaW5nICovCisgICAgbGluZW5yX1QJZW5kX2xudW07CS8qIGxhc3QgbGluZSBmb3Igc2VhcmNoaW5nICovCit7CisgICAgU2VhcmNoZWRGaWxlICpmaWxlczsJCS8qIFN0YWNrIG9mIGluY2x1ZGVkIGZpbGVzICovCisgICAgU2VhcmNoZWRGaWxlICpiaWdnZXI7CQkvKiBXaGVuIHdlIG5lZWQgbW9yZSBzcGFjZSAqLworICAgIGludAkJbWF4X3BhdGhfZGVwdGggPSA1MDsKKyAgICBsb25nCW1hdGNoX2NvdW50ID0gMTsKKworICAgIGNoYXJfdQkqcGF0OworICAgIGNoYXJfdQkqbmV3X2ZuYW1lOworICAgIGNoYXJfdQkqY3Vycl9mbmFtZSA9IGN1cmJ1Zi0+Yl9mbmFtZTsKKyAgICBjaGFyX3UJKnByZXZfZm5hbWUgPSBOVUxMOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlkZXB0aDsKKyAgICBpbnQJCWRlcHRoX2Rpc3BsYXllZDsJLyogRm9yIHR5cGU9PUNIRUNLX1BBVEggKi8KKyAgICBpbnQJCW9sZF9maWxlczsKKyAgICBpbnQJCWFscmVhZHlfc2VhcmNoZWQ7CisgICAgY2hhcl91CSpmaWxlX2xpbmU7CisgICAgY2hhcl91CSpsaW5lOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJc2F2ZV9jaGFyOworICAgIGludAkJZGVmaW5lX21hdGNoZWQ7CisgICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICByZWdtYXRjaF9UCWluY2xfcmVnbWF0Y2g7CisgICAgcmVnbWF0Y2hfVAlkZWZfcmVnbWF0Y2g7CisgICAgaW50CQltYXRjaGVkID0gRkFMU0U7CisgICAgaW50CQlkaWRfc2hvdyA9IEZBTFNFOworICAgIGludAkJZm91bmQgPSBGQUxTRTsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSphbHJlYWR5ID0gTlVMTDsKKyAgICBjaGFyX3UJKnN0YXJ0cCA9IE5VTEw7CisjaWZkZWYgUklTQ09TCisgICAgaW50CQlwcmV2aW91c19tdW5naW5nID0gX19yaXNjb3NpZnlfY29udHJvbDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgd2luX1QJKmN1cndpbl9zYXZlID0gTlVMTDsKKyNlbmRpZgorCisgICAgcmVnbWF0Y2gucmVncHJvZyA9IE5VTEw7CisgICAgaW5jbF9yZWdtYXRjaC5yZWdwcm9nID0gTlVMTDsKKyAgICBkZWZfcmVnbWF0Y2gucmVncHJvZyA9IE5VTEw7CisKKyAgICBmaWxlX2xpbmUgPSBhbGxvYyhMU0laRSk7CisgICAgaWYgKGZpbGVfbGluZSA9PSBOVUxMKQorCXJldHVybjsKKworI2lmZGVmIFJJU0NPUworICAgIC8qIFVuaXhMaWIga25vd3MgYmVzdCBob3cgdG8gbXVuZ2UgYyBmaWxlIG5hbWVzIC0gdHVybiBtdW5naW5nIGJhY2sgb24uICovCisgICAgX19yaXNjb3NpZnlfY29udHJvbCA9IF9fUklTQ09TSUZZX0xPTkdfVFJVTkNBVEU7CisjZW5kaWYKKworICAgIGlmICh0eXBlICE9IENIRUNLX1BBVEggJiYgdHlwZSAhPSBGSU5EX0RFRklORQorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCS8qIHdoZW4gQ09OVF9TT0wgaXMgc2V0IGNvbXBhcmUgInB0ciIgd2l0aCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCisJICogaXMgZmFzdGVyIHRoYW4gcXVvdGVfbWV0YS9yZWdjb21wL3JlZ2V4ZWMgInB0ciIgLS0gQWNldmVkbyAqLworCSAgICAmJiAhKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU09MKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKwlwYXQgPSBhbGxvYyhsZW4gKyA1KTsKKwlpZiAocGF0ID09IE5VTEwpCisJICAgIGdvdG8gZnBpcF9lbmQ7CisJc3ByaW50ZigoY2hhciAqKXBhdCwgd2hvbGUgPyAiXFw8JS4qc1xcPiIgOiAiJS4qcyIsIGxlbiwgcHRyKTsKKwkvKiBpZ25vcmUgY2FzZSBhY2NvcmRpbmcgdG8gcF9pYywgcF9zY3MgYW5kIHBhdCAqLworCXJlZ21hdGNoLnJtX2ljID0gaWdub3JlY2FzZShwYXQpOworCXJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXQsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworCXZpbV9mcmVlKHBhdCk7CisJaWYgKHJlZ21hdGNoLnJlZ3Byb2cgPT0gTlVMTCkKKwkgICAgZ290byBmcGlwX2VuZDsKKyAgICB9CisgICAgaWYgKCpjdXJidWYtPmJfcF9pbmMgIT0gTlVMIHx8ICpwX2luYyAhPSBOVUwpCisgICAgeworCWluY2xfcmVnbWF0Y2gucmVncHJvZyA9IHZpbV9yZWdjb21wKCpjdXJidWYtPmJfcF9pbmMgPT0gTlVMCisJCQkgICA/IHBfaW5jIDogY3VyYnVmLT5iX3BfaW5jLCBwX21hZ2ljID8gUkVfTUFHSUMgOiAwKTsKKwlpZiAoaW5jbF9yZWdtYXRjaC5yZWdwcm9nID09IE5VTEwpCisJICAgIGdvdG8gZnBpcF9lbmQ7CisJaW5jbF9yZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwkvKiBkb24ndCBpZ25vcmUgY2FzZSBpbiBpbmNsLiBwYXQuICovCisgICAgfQorICAgIGlmICh0eXBlID09IEZJTkRfREVGSU5FICYmICgqY3VyYnVmLT5iX3BfZGVmICE9IE5VTCB8fCAqcF9kZWYgIT0gTlVMKSkKKyAgICB7CisJZGVmX3JlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcCgqY3VyYnVmLT5iX3BfZGVmID09IE5VTAorCQkJICAgPyBwX2RlZiA6IGN1cmJ1Zi0+Yl9wX2RlZiwgcF9tYWdpYyA/IFJFX01BR0lDIDogMCk7CisJaWYgKGRlZl9yZWdtYXRjaC5yZWdwcm9nID09IE5VTEwpCisJICAgIGdvdG8gZnBpcF9lbmQ7CisJZGVmX3JlZ21hdGNoLnJtX2ljID0gRkFMU0U7CS8qIGRvbid0IGlnbm9yZSBjYXNlIGluIGRlZmluZSBwYXQuICovCisgICAgfQorICAgIGZpbGVzID0gKFNlYXJjaGVkRmlsZSAqKWxhbGxvY19jbGVhcigobG9uZ191KQorCQkJICAgICAgIChtYXhfcGF0aF9kZXB0aCAqIHNpemVvZihTZWFyY2hlZEZpbGUpKSwgVFJVRSk7CisgICAgaWYgKGZpbGVzID09IE5VTEwpCisJZ290byBmcGlwX2VuZDsKKyAgICBvbGRfZmlsZXMgPSBtYXhfcGF0aF9kZXB0aDsKKyAgICBkZXB0aCA9IGRlcHRoX2Rpc3BsYXllZCA9IC0xOworCisgICAgbG51bSA9IHN0YXJ0X2xudW07CisgICAgaWYgKGVuZF9sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJZW5kX2xudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBpZiAobG51bSA+IGVuZF9sbnVtKQkJLyogZG8gYXQgbGVhc3Qgb25lIGxpbmUgKi8KKwlsbnVtID0gZW5kX2xudW07CisgICAgbGluZSA9IG1sX2dldChsbnVtKTsKKworICAgIGZvciAoOzspCisgICAgeworCWlmIChpbmNsX3JlZ21hdGNoLnJlZ3Byb2cgIT0gTlVMTAorCQkmJiB2aW1fcmVnZXhlYygmaW5jbF9yZWdtYXRjaCwgbGluZSwgKGNvbG5yX1QpMCkpCisJeworCSAgICBuZXdfZm5hbWUgPSBmaWxlX25hbWVfaW5fbGluZShpbmNsX3JlZ21hdGNoLmVuZHBbMF0sCisJCSAgICAwLCBGTkFNRV9FWFB8Rk5BTUVfSU5DTHxGTkFNRV9SRUwsIDFMLAorCQkgICAgY3Vycl9mbmFtZSA9PSBjdXJidWYtPmJfZm5hbWUKKwkJCQkJICAgICA/IGN1cmJ1Zi0+Yl9mZm5hbWUgOiBjdXJyX2ZuYW1lKTsKKwkgICAgYWxyZWFkeV9zZWFyY2hlZCA9IEZBTFNFOworCSAgICBpZiAobmV3X2ZuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgc2VhcmNoZWQgaW4gdGhpcyBmaWxlICovCisJCWZvciAoaSA9IDA7OyBpKyspCisJCXsKKwkJICAgIGlmIChpID09IGRlcHRoICsgMSkKKwkJCWkgPSBvbGRfZmlsZXM7CisJCSAgICBpZiAoaSA9PSBtYXhfcGF0aF9kZXB0aCkKKwkJCWJyZWFrOworCQkgICAgaWYgKGZ1bGxwYXRoY21wKG5ld19mbmFtZSwgZmlsZXNbaV0ubmFtZSwgVFJVRSkgJiBGUENfU0FNRSkKKwkJICAgIHsKKwkJCWlmICh0eXBlICE9IENIRUNLX1BBVEggJiYKKwkJCQlhY3Rpb24gPT0gQUNUSU9OX1NIT1dfQUxMICYmIGZpbGVzW2ldLm1hdGNoZWQpCisJCQl7CisJCQkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CSAgICAvKiBjdXJzb3IgYmVsb3cgbGFzdCBvbmUgKi8KKwkJCSAgICBpZiAoIWdvdF9pbnQpCSAgICAvKiBkb24ndCBkaXNwbGF5IGlmICdxJworCQkJCQkJICAgICAgIHR5cGVkIGF0ICItLW1vcmUtLSIKKwkJCQkJCSAgICAgICBtZXNhZ2UgKi8KKwkJCSAgICB7CisJCQkJbXNnX2hvbWVfcmVwbGFjZV9obChuZXdfZm5hbWUpOworCQkJCU1TR19QVVRTKF8oIiAoaW5jbHVkZXMgcHJldmlvdXNseSBsaXN0ZWQgbWF0Y2gpIikpOworCQkJCXByZXZfZm5hbWUgPSBOVUxMOworCQkJICAgIH0KKwkJCX0KKwkJCXZpbV9mcmVlKG5ld19mbmFtZSk7CisJCQluZXdfZm5hbWUgPSBOVUxMOworCQkJYWxyZWFkeV9zZWFyY2hlZCA9IFRSVUU7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHR5cGUgPT0gQ0hFQ0tfUEFUSCAmJiAoYWN0aW9uID09IEFDVElPTl9TSE9XX0FMTAorCQkJCSB8fCAobmV3X2ZuYW1lID09IE5VTEwgJiYgIWFscmVhZHlfc2VhcmNoZWQpKSkKKwkgICAgeworCQlpZiAoZGlkX3Nob3cpCisJCSAgICBtc2dfcHV0Y2hhcignXG4nKTsJICAgIC8qIGN1cnNvciBiZWxvdyBsYXN0IG9uZSAqLworCQllbHNlCisJCXsKKwkJICAgIGdvdG9jbWRsaW5lKFRSVUUpOwkgICAgLyogY3Vyc29yIGF0IHN0YXR1cyBsaW5lICovCisJCSAgICBNU0dfUFVUU19USVRMRShfKCItLS0gSW5jbHVkZWQgZmlsZXMgIikpOworCQkgICAgaWYgKGFjdGlvbiAhPSBBQ1RJT05fU0hPV19BTEwpCisJCQlNU0dfUFVUU19USVRMRShfKCJub3QgZm91bmQgIikpOworCQkgICAgTVNHX1BVVFNfVElUTEUoXygiaW4gcGF0aCAtLS1cbiIpKTsKKwkJfQorCQlkaWRfc2hvdyA9IFRSVUU7CisJCXdoaWxlIChkZXB0aF9kaXNwbGF5ZWQgPCBkZXB0aCAmJiAhZ290X2ludCkKKwkJeworCQkgICAgKytkZXB0aF9kaXNwbGF5ZWQ7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGhfZGlzcGxheWVkOyBpKyspCisJCQlNU0dfUFVUUygiICAiKTsKKwkJICAgIG1zZ19ob21lX3JlcGxhY2UoZmlsZXNbZGVwdGhfZGlzcGxheWVkXS5uYW1lKTsKKwkJICAgIE1TR19QVVRTKCIgLS0+XG4iKTsKKwkJfQorCQlpZiAoIWdvdF9pbnQpCQkgICAgLyogZG9uJ3QgZGlzcGxheSBpZiAncScgdHlwZWQKKwkJCQkJICAgICAgIGZvciAiLS1tb3JlLS0iIG1lc3NhZ2UgKi8KKwkJeworCQkgICAgZm9yIChpID0gMDsgaSA8PSBkZXB0aF9kaXNwbGF5ZWQ7IGkrKykKKwkJCU1TR19QVVRTKCIgICIpOworCQkgICAgaWYgKG5ld19mbmFtZSAhPSBOVUxMKQorCQkgICAgeworCQkJLyogdXNpbmcgIm5ld19mbmFtZSIgaXMgbW9yZSByZWxpYWJsZSwgZS5nLiwgd2hlbgorCQkJICogJ2luY2x1ZGVleHByJyBpcyBzZXQuICovCisJCQltc2dfb3V0dHJhbnNfYXR0cihuZXdfZm5hbWUsIGhsX2F0dHIoSExGX0QpKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBJc29sYXRlIHRoZSBmaWxlIG5hbWUuCisJCQkgKiBJbmNsdWRlIHRoZSBzdXJyb3VuZGluZyAiIiBvciA8PiBpZiBwcmVzZW50LgorCQkJICovCisJCQlmb3IgKHAgPSBpbmNsX3JlZ21hdGNoLmVuZHBbMF07ICF2aW1faXNmaWxlYygqcCk7IHArKykKKwkJCSAgICA7CisJCQlmb3IgKGkgPSAwOyB2aW1faXNmaWxlYyhwW2ldKTsgaSsrKQorCQkJICAgIDsKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkgICAgLyogTm90aGluZyBmb3VuZCwgdXNlIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAqLworCQkJICAgIHAgPSBpbmNsX3JlZ21hdGNoLmVuZHBbMF07CisJCQkgICAgaSA9IFNUUkxFTihwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBpZiAocFstMV0gPT0gJyInIHx8IHBbLTFdID09ICc8JykKKwkJCSAgICB7CisJCQkJLS1wOworCQkJCSsraTsKKwkJCSAgICB9CisJCQkgICAgaWYgKHBbaV0gPT0gJyInIHx8IHBbaV0gPT0gJz4nKQorCQkJCSsraTsKKwkJCX0KKwkJCXNhdmVfY2hhciA9IHBbaV07CisJCQlwW2ldID0gTlVMOworCQkJbXNnX291dHRyYW5zX2F0dHIocCwgaGxfYXR0cihITEZfRCkpOworCQkJcFtpXSA9IHNhdmVfY2hhcjsKKwkJICAgIH0KKworCQkgICAgaWYgKG5ld19mbmFtZSA9PSBOVUxMICYmIGFjdGlvbiA9PSBBQ1RJT05fU0hPV19BTEwpCisJCSAgICB7CisJCQlpZiAoYWxyZWFkeV9zZWFyY2hlZCkKKwkJCSAgICBNU0dfUFVUUyhfKCIgIChBbHJlYWR5IGxpc3RlZCkiKSk7CisJCQllbHNlCisJCQkgICAgTVNHX1BVVFMoXygiICBOT1QgRk9VTkQiKSk7CisJCSAgICB9CisJCX0KKwkJb3V0X2ZsdXNoKCk7CSAgICAvKiBvdXRwdXQgZWFjaCBsaW5lIGRpcmVjdGx5ICovCisJICAgIH0KKworCSAgICBpZiAobmV3X2ZuYW1lICE9IE5VTEwpCisJICAgIHsKKwkJLyogUHVzaCB0aGUgbmV3IGZpbGUgb250byB0aGUgZmlsZSBzdGFjayAqLworCQlpZiAoZGVwdGggKyAxID09IG9sZF9maWxlcykKKwkJeworCQkgICAgYmlnZ2VyID0gKFNlYXJjaGVkRmlsZSAqKWxhbGxvYygobG9uZ191KSgKKwkJCSAgICBtYXhfcGF0aF9kZXB0aCAqIDIgKiBzaXplb2YoU2VhcmNoZWRGaWxlKSksIFRSVUUpOworCQkgICAgaWYgKGJpZ2dlciAhPSBOVUxMKQorCQkgICAgeworCQkJZm9yIChpID0gMDsgaSA8PSBkZXB0aDsgaSsrKQorCQkJICAgIGJpZ2dlcltpXSA9IGZpbGVzW2ldOworCQkJZm9yIChpID0gZGVwdGggKyAxOyBpIDwgb2xkX2ZpbGVzICsgbWF4X3BhdGhfZGVwdGg7IGkrKykKKwkJCXsKKwkJCSAgICBiaWdnZXJbaV0uZnAgPSBOVUxMOworCQkJICAgIGJpZ2dlcltpXS5uYW1lID0gTlVMTDsKKwkJCSAgICBiaWdnZXJbaV0ubG51bSA9IDA7CisJCQkgICAgYmlnZ2VyW2ldLm1hdGNoZWQgPSBGQUxTRTsKKwkJCX0KKwkJCWZvciAoaSA9IG9sZF9maWxlczsgaSA8IG1heF9wYXRoX2RlcHRoOyBpKyspCisJCQkgICAgYmlnZ2VyW2kgKyBtYXhfcGF0aF9kZXB0aF0gPSBmaWxlc1tpXTsKKwkJCW9sZF9maWxlcyArPSBtYXhfcGF0aF9kZXB0aDsKKwkJCW1heF9wYXRoX2RlcHRoICo9IDI7CisJCQl2aW1fZnJlZShmaWxlcyk7CisJCQlmaWxlcyA9IGJpZ2dlcjsKKwkJICAgIH0KKwkJfQorCQlpZiAoKGZpbGVzW2RlcHRoICsgMV0uZnAgPSBtY2hfZm9wZW4oKGNoYXIgKiluZXdfZm5hbWUsICJyIikpCisJCQkJCQkJCSAgICA9PSBOVUxMKQorCQkgICAgdmltX2ZyZWUobmV3X2ZuYW1lKTsKKwkJZWxzZQorCQl7CisJCSAgICBpZiAoKytkZXB0aCA9PSBvbGRfZmlsZXMpCisJCSAgICB7CisJCQkvKgorCQkJICogbGFsbG9jKCkgZm9yICdiaWdnZXInIG11c3QgaGF2ZSBmYWlsZWQgYWJvdmUuICBXZQorCQkJICogd2lsbCBmb3JnZXQgb25lIG9mIG91ciBhbHJlYWR5IHZpc2l0ZWQgZmlsZXMgbm93LgorCQkJICovCisJCQl2aW1fZnJlZShmaWxlc1tvbGRfZmlsZXNdLm5hbWUpOworCQkJKytvbGRfZmlsZXM7CisJCSAgICB9CisJCSAgICBmaWxlc1tkZXB0aF0ubmFtZSA9IGN1cnJfZm5hbWUgPSBuZXdfZm5hbWU7CisJCSAgICBmaWxlc1tkZXB0aF0ubG51bSA9IDA7CisJCSAgICBmaWxlc1tkZXB0aF0ubWF0Y2hlZCA9IEZBTFNFOworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fRVhQQU5EKQorCQkgICAgeworCQkJc3ByaW50ZigoY2hhciopSU9idWZmLCBfKCJTY2FubmluZyBpbmNsdWRlZCBmaWxlOiAlcyIpLAorCQkJICAgIChjaGFyICopbmV3X2ZuYW1lKTsKKwkJCW1zZ190cnVuY19hdHRyKElPYnVmZiwgVFJVRSwgaGxfYXR0cihITEZfUikpOworCQkgICAgfQorI2VuZGlmCisJCX0KKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICAvKgorCSAgICAgKiBDaGVjayBpZiB0aGUgbGluZSBpcyBhIGRlZmluZSAodHlwZSA9PSBGSU5EX0RFRklORSkKKwkgICAgICovCisJICAgIHAgPSBsaW5lOworc2VhcmNoX2xpbmU6CisJICAgIGRlZmluZV9tYXRjaGVkID0gRkFMU0U7CisJICAgIGlmIChkZWZfcmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMCisJCQkgICAgICAmJiB2aW1fcmVnZXhlYygmZGVmX3JlZ21hdGNoLCBsaW5lLCAoY29sbnJfVCkwKSkKKwkgICAgeworCQkvKgorCQkgKiBQYXR0ZXJuIG11c3QgYmUgZmlyc3QgaWRlbnRpZmllciBhZnRlciAnZGVmaW5lJywgc28gc2tpcAorCQkgKiB0byB0aGF0IHBvc2l0aW9uIGJlZm9yZSBjaGVja2luZyBmb3IgbWF0Y2ggb2YgcGF0dGVybi4gIEFsc28KKwkJICogZG9uJ3QgbGV0IGl0IG1hdGNoIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgaWRlbnRpZmllci4KKwkJICovCisJCXAgPSBkZWZfcmVnbWF0Y2guZW5kcFswXTsKKwkJd2hpbGUgKCpwICYmICF2aW1faXN3b3JkYygqcCkpCisJCSAgICBwKys7CisJCWRlZmluZV9tYXRjaGVkID0gVFJVRTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIExvb2sgZm9yIGEgbWF0Y2guICBEb24ndCBkbyB0aGlzIGlmIHdlIGFyZSBsb29raW5nIGZvciBhCisJICAgICAqIGRlZmluZSBhbmQgdGhpcyBsaW5lIGRpZG4ndCBtYXRjaCBkZWZpbmVfcHJvZyBhYm92ZS4KKwkgICAgICovCisJICAgIGlmIChkZWZfcmVnbWF0Y2gucmVncHJvZyA9PSBOVUxMIHx8IGRlZmluZV9tYXRjaGVkKQorCSAgICB7CisJCWlmIChkZWZpbmVfbWF0Y2hlZAorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkJfHwgKGNvbnRpbnVlX3N0YXR1cyAmIENPTlRfU09MKQorI2VuZGlmCisJCSAgICApCisJCXsKKwkJICAgIC8qIGNvbXBhcmUgdGhlIGZpcnN0ICJsZW4iIGNoYXJzIGZyb20gInB0ciIgKi8KKwkJICAgIHN0YXJ0cCA9IHNraXB3aGl0ZShwKTsKKwkJICAgIGlmIChwX2ljKQorCQkJbWF0Y2hlZCA9ICFNQl9TVFJOSUNNUChzdGFydHAsIHB0ciwgbGVuKTsKKwkJICAgIGVsc2UKKwkJCW1hdGNoZWQgPSAhU1RSTkNNUChzdGFydHAsIHB0ciwgbGVuKTsKKwkJICAgIGlmIChtYXRjaGVkICYmIGRlZmluZV9tYXRjaGVkICYmIHdob2xlCisJCQkJCQkgICYmIHZpbV9pc3dvcmRjKHN0YXJ0cFtsZW5dKSkKKwkJCW1hdGNoZWQgPSBGQUxTRTsKKwkJfQorCQllbHNlIGlmIChyZWdtYXRjaC5yZWdwcm9nICE9IE5VTEwKKwkJCSAmJiB2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIGxpbmUsIChjb2xucl9UKShwIC0gbGluZSkpKQorCQl7CisJCSAgICBtYXRjaGVkID0gVFJVRTsKKwkJICAgIHN0YXJ0cCA9IHJlZ21hdGNoLnN0YXJ0cFswXTsKKwkJICAgIC8qCisJCSAgICAgKiBDaGVjayBpZiB0aGUgbGluZSBpcyBub3QgYSBjb21tZW50IGxpbmUgKHVubGVzcyB3ZSBhcmUKKwkJICAgICAqIGxvb2tpbmcgZm9yIGEgZGVmaW5lKS4gIEEgbGluZSBzdGFydGluZyB3aXRoICIjIGRlZmluZSIKKwkJICAgICAqIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIGEgY29tbWVudCBsaW5lLgorCQkgICAgICovCisJCSAgICBpZiAoIWRlZmluZV9tYXRjaGVkICYmIHNraXBfY29tbWVudHMpCisJCSAgICB7CisjaWZkZWYgRkVBVF9DT01NRU5UUworCQkJaWYgKCgqbGluZSAhPSAnIycgfHwKKwkJCQlTVFJOQ01QKHNraXB3aGl0ZShsaW5lICsgMSksICJkZWZpbmUiLCA2KSAhPSAwKQorCQkJCSYmIGdldF9sZWFkZXJfbGVuKGxpbmUsIE5VTEwsIEZBTFNFKSkKKwkJCSAgICBtYXRjaGVkID0gRkFMU0U7CisKKwkJCS8qCisJCQkgKiBBbHNvIGNoZWNrIGZvciBhICIvICoiIG9yICIvIC8iIGJlZm9yZSB0aGUgbWF0Y2guCisJCQkgKiBTa2lwcyBsaW5lcyBsaWtlICJpbnQgYmFja3dhcmRzOyAgLyAqIG5vcm1hbCBpbmRleAorCQkJICogKiAvIiB3aGVuIGxvb2tpbmcgZm9yICJub3JtYWwiLgorCQkJICogTm90ZTogRG9lc24ndCBza2lwICIvICoiIGluIGNvbW1lbnRzLgorCQkJICovCisJCQlwID0gc2tpcHdoaXRlKGxpbmUpOworCQkJaWYgKG1hdGNoZWQKKwkJCQl8fCAocFswXSA9PSAnLycgJiYgcFsxXSA9PSAnKicpIHx8IHBbMF0gPT0gJyonKQorI2VuZGlmCisJCQkgICAgZm9yIChwID0gbGluZTsgKnAgJiYgcCA8IHN0YXJ0cDsgKytwKQorCQkJICAgIHsKKwkJCQlpZiAobWF0Y2hlZAorCQkJCQkmJiBwWzBdID09ICcvJworCQkJCQkmJiAocFsxXSA9PSAnKicgfHwgcFsxXSA9PSAnLycpKQorCQkJCXsKKwkJCQkgICAgbWF0Y2hlZCA9IEZBTFNFOworCQkJCSAgICAvKiBBZnRlciAiLy8iIGFsbCB0ZXh0IGlzIGNvbW1lbnQgKi8KKwkJCQkgICAgaWYgKHBbMV0gPT0gJy8nKQorCQkJCQlicmVhazsKKwkJCQkgICAgKytwOworCQkJCX0KKwkJCQllbHNlIGlmICghbWF0Y2hlZCAmJiBwWzBdID09ICcqJyAmJiBwWzFdID09ICcvJykKKwkJCQl7CisJCQkJICAgIC8qIENhbiBmaW5kIG1hdGNoIGFmdGVyICIqIC8iLiAqLworCQkJCSAgICBtYXRjaGVkID0gVFJVRTsKKwkJCQkgICAgKytwOworCQkJCX0KKwkJCSAgICB9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlpZiAobWF0Y2hlZCkKKwl7CisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIGlmIChhY3Rpb24gPT0gQUNUSU9OX0VYUEFORCkKKwkgICAgeworCQlpbnQJcmV1c2UgPSAwOworCQlpbnQJYWRkX3I7CisJCWNoYXJfdQkqYXV4OworCisJCWlmIChkZXB0aCA9PSAtMSAmJiBsbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bSkKKwkJICAgIGJyZWFrOworCQlmb3VuZCA9IFRSVUU7CisJCWF1eCA9IHAgPSBzdGFydHA7CisJCWlmIChjb250aW51ZV9zdGF0dXMgJiBDT05UX0FERElORykKKwkJeworCQkgICAgcCArPSBjb21wbGV0aW9uX2xlbmd0aDsKKwkJICAgIGlmICh2aW1faXN3b3JkcChwKSkKKwkJCWdvdG8gZXhpdF9tYXRjaGVkOworCQkgICAgcCA9IGZpbmRfd29yZF9zdGFydChwKTsKKwkJfQorCQlwID0gZmluZF93b3JkX2VuZChwKTsKKwkJaSA9IChpbnQpKHAgLSBhdXgpOworCisJCWlmICgoY29udGludWVfc3RhdHVzICYgQ09OVF9BRERJTkcpICYmIGkgPT0gY29tcGxldGlvbl9sZW5ndGgpCisJCXsKKwkJICAgIC8qIGdldCB0aGUgbmV4dCBsaW5lICovCisJCSAgICAvKiBJT1NJWkUgPiBjb21wbGV0aW9uX2xlbmd0aCwgc28gdGhlIFNUUk5DUFkgd29ya3MgKi8KKwkJICAgIFNUUk5DUFkoSU9idWZmLCBhdXgsIGkpOworCQkgICAgaWYgKCEoICAgICBkZXB0aCA8IDAKKwkJCSAgICAmJiBsbnVtIDwgZW5kX2xudW0KKwkJCSAgICAmJiAobGluZSA9IG1sX2dldCgrK2xudW0pKSAhPSBOVUxMKQorCQkJJiYgISgJZGVwdGggPj0gMAorCQkJICAgICYmICF2aW1fZmdldHMobGluZSA9IGZpbGVfbGluZSwKKwkJCQkJCSAgICAgTFNJWkUsIGZpbGVzW2RlcHRoXS5mcCkpKQorCQkJZ290byBleGl0X21hdGNoZWQ7CisKKwkJICAgIC8qIHdlIHJlYWQgYSBsaW5lLCBzZXQgImFscmVhZHkiIHRvIGNoZWNrIHRoaXMgImxpbmUiIGxhdGVyCisJCSAgICAgKiBpZiBkZXB0aCA+PSAwIHdlJ2xsIGluY3JlYXNlIGZpbGVzW2RlcHRoXS5sbnVtIGZhcgorCQkgICAgICogYmVsbG93ICAtLSBBY2V2ZWRvICovCisJCSAgICBhbHJlYWR5ID0gYXV4ID0gcCA9IHNraXB3aGl0ZShsaW5lKTsKKwkJICAgIHAgPSBmaW5kX3dvcmRfc3RhcnQocCk7CisJCSAgICBwID0gZmluZF93b3JkX2VuZChwKTsKKwkJICAgIGlmIChwID4gYXV4KQorCQkgICAgeworCQkJaWYgKCphdXggIT0gJyknICYmIElPYnVmZltpLTFdICE9IFRBQikKKwkJCXsKKwkJCSAgICBpZiAoSU9idWZmW2ktMV0gIT0gJyAnKQorCQkJCUlPYnVmZltpKytdID0gJyAnOworCQkJICAgIC8qIElPYnVmID1+ICJcKFxrXHxcaVwpLiogIiwgdGh1cyBpID49IDIqLworCQkJICAgIGlmIChwX2pzCisJCQkJJiYgKElPYnVmZltpLTJdID09ICcuJworCQkJCSAgICB8fCAodmltX3N0cmNocihwX2NwbywgQ1BPX0pPSU5TUCkgPT0gTlVMTAorCQkJCQkmJiAoSU9idWZmW2ktMl0gPT0gJz8nCisJCQkJCSAgICB8fCBJT2J1ZmZbaS0yXSA9PSAnIScpKSkpCisJCQkJSU9idWZmW2krK10gPSAnICc7CisJCQl9CisJCQkvKiBjb3B5IGFzIG11Y2ggYXMgcG9zaWJsZSBvZiB0aGUgbmV3IHdvcmQgKi8KKwkJCWlmIChwIC0gYXV4ID49IElPU0laRSAtIGkpCisJCQkgICAgcCA9IGF1eCArIElPU0laRSAtIGkgLSAxOworCQkJU1RSTkNQWShJT2J1ZmYgKyBpLCBhdXgsIHAgLSBhdXgpOworCQkJaSArPSAoaW50KShwIC0gYXV4KTsKKwkJCXJldXNlIHw9IENPTlRfU19JUE9TOworCQkgICAgfQorCQkgICAgSU9idWZmW2ldID0gTlVMOworCQkgICAgYXV4ID0gSU9idWZmOworCisJCSAgICBpZiAoaSA9PSBjb21wbGV0aW9uX2xlbmd0aCkKKwkJCWdvdG8gZXhpdF9tYXRjaGVkOworCQl9CisKKwkJYWRkX3IgPSBpbnNfY29tcGxfYWRkX2luZmVyY2FzZShhdXgsIGksCisJCQljdXJyX2ZuYW1lID09IGN1cmJ1Zi0+Yl9mbmFtZSA/IE5VTEwgOiBjdXJyX2ZuYW1lLAorCQkJZGlyLCByZXVzZSk7CisJCWlmIChhZGRfciA9PSBPSykKKwkJICAgIC8qIGlmIGRpciB3YXMgQkFDS1dBUkQgdGhlbiBob25vciBpdCBqdXN0IG9uY2UgKi8KKwkJICAgIGRpciA9IEZPUldBUkQ7CisJCWVsc2UgaWYgKGFkZF9yID09IFJFVF9FUlJPUikKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQkgaWYgKGFjdGlvbiA9PSBBQ1RJT05fU0hPV19BTEwpCisJICAgIHsKKwkJZm91bmQgPSBUUlVFOworCQlpZiAoIWRpZF9zaG93KQorCQkgICAgZ290b2NtZGxpbmUoVFJVRSk7CQkvKiBjdXJzb3IgYXQgc3RhdHVzIGxpbmUgKi8KKwkJaWYgKGN1cnJfZm5hbWUgIT0gcHJldl9mbmFtZSkKKwkJeworCQkgICAgaWYgKGRpZF9zaG93KQorCQkJbXNnX3B1dGNoYXIoJ1xuJyk7CS8qIGN1cnNvciBiZWxvdyBsYXN0IG9uZSAqLworCQkgICAgaWYgKCFnb3RfaW50KQkJLyogZG9uJ3QgZGlzcGxheSBpZiAncScgdHlwZWQKKwkJCQkJCSAgICBhdCAiLS1tb3JlLS0iIG1lc2FnZSAqLworCQkJbXNnX2hvbWVfcmVwbGFjZV9obChjdXJyX2ZuYW1lKTsKKwkJICAgIHByZXZfZm5hbWUgPSBjdXJyX2ZuYW1lOworCQl9CisJCWRpZF9zaG93ID0gVFJVRTsKKwkJaWYgKCFnb3RfaW50KQorCQkgICAgc2hvd19wYXRfaW5fcGF0aChsaW5lLCB0eXBlLCBUUlVFLCBhY3Rpb24sCisJCQkgICAgKGRlcHRoID09IC0xKSA/IE5VTEwgOiBmaWxlc1tkZXB0aF0uZnAsCisJCQkgICAgKGRlcHRoID09IC0xKSA/ICZsbnVtIDogJmZpbGVzW2RlcHRoXS5sbnVtLAorCQkJICAgIG1hdGNoX2NvdW50KyspOworCisJCS8qIFNldCBtYXRjaGVkIGZsYWcgZm9yIHRoaXMgZmlsZSBhbmQgYWxsIHRoZSBvbmVzIHRoYXQKKwkJICogaW5jbHVkZSBpdCAqLworCQlmb3IgKGkgPSAwOyBpIDw9IGRlcHRoOyArK2kpCisJCSAgICBmaWxlc1tpXS5tYXRjaGVkID0gVFJVRTsKKwkgICAgfQorCSAgICBlbHNlIGlmICgtLWNvdW50IDw9IDApCisJICAgIHsKKwkJZm91bmQgPSBUUlVFOworCQlpZiAoZGVwdGggPT0gLTEgJiYgbG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQkJCQkJICAgICAgJiYgZ19kb190YWdwcmV2aWV3ID09IDAKKyNlbmRpZgorCQkJCQkJICAgICAgKQorCQkgICAgRU1TRyhfKCJFMzg3OiBNYXRjaCBpcyBvbiBjdXJyZW50IGxpbmUiKSk7CisJCWVsc2UgaWYgKGFjdGlvbiA9PSBBQ1RJT05fU0hPVykKKwkJeworCQkgICAgc2hvd19wYXRfaW5fcGF0aChsaW5lLCB0eXBlLCBkaWRfc2hvdywgYWN0aW9uLAorCQkJKGRlcHRoID09IC0xKSA/IE5VTEwgOiBmaWxlc1tkZXB0aF0uZnAsCisJCQkoZGVwdGggPT0gLTEpID8gJmxudW0gOiAmZmlsZXNbZGVwdGhdLmxudW0sIDFMKTsKKwkJICAgIGRpZF9zaG93ID0gVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBGRUFUX0dVSQorCQkgICAgbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCSAgICAvKiAiOnBzZWFyY2giIHVzZXMgdGhlIHByZXZpZXcgd2luZG93ICovCisJCSAgICBpZiAoZ19kb190YWdwcmV2aWV3ICE9IDApCisJCSAgICB7CisJCQljdXJ3aW5fc2F2ZSA9IGN1cndpbjsKKwkJCXByZXBhcmVfdGFncHJldmlldygpOworCQkgICAgfQorI2VuZGlmCisJCSAgICBpZiAoYWN0aW9uID09IEFDVElPTl9TUExJVCkKKwkJICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwkJCWlmICh3aW5fc3BsaXQoMCwgMCkgPT0gRkFJTCkKKyNlbmRpZgorCQkJICAgIGJyZWFrOworI2lmZGVmIEZFQVRfU0NST0xMQklORAorCQkJY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CisjZW5kaWYKKwkJICAgIH0KKwkJICAgIGlmIChkZXB0aCA9PSAtMSkKKwkJICAgIHsKKwkJCS8qIG1hdGNoIGluIGN1cnJlbnQgZmlsZSAqLworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCQlpZiAoZ19kb190YWdwcmV2aWV3ICE9IDApCisJCQl7CisJCQkgICAgaWYgKGdldGZpbGUoMCwgY3Vyd2luX3NhdmUtPndfYnVmZmVyLT5iX2ZuYW1lLAorCQkJCQkJIE5VTEwsIFRSVUUsIGxudW0sIEZBTFNFKSA+IDApCisJCQkJYnJlYWs7CS8qIGZhaWxlZCB0byBqdW1wIHRvIGZpbGUgKi8KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZgorCQkJICAgIHNldHBjbWFyaygpOworCQkJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gbG51bTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChnZXRmaWxlKDAsIGZpbGVzW2RlcHRoXS5uYW1lLCBOVUxMLCBUUlVFLAorCQkJCQkJZmlsZXNbZGVwdGhdLmxudW0sIEZBTFNFKSA+IDApCisJCQkgICAgYnJlYWs7CS8qIGZhaWxlZCB0byBqdW1wIHRvIGZpbGUgKi8KKwkJCS8qIGF1dG9jb21tYW5kcyBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBsbnVtLCB3ZSBkb24ndAorCQkJICogd2FudCB0aGF0IGhlcmUgKi8KKwkJCWN1cndpbi0+d19jdXJzb3IubG51bSA9IGZpbGVzW2RlcHRoXS5sbnVtOworCQkgICAgfQorCQl9CisJCWlmIChhY3Rpb24gIT0gQUNUSU9OX1NIT1cpCisJCXsKKwkJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gKGNvbG5yX1QpIChzdGFydHAgLSBsaW5lKTsKKwkJICAgIGN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCQl9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQlpZiAoZ19kb190YWdwcmV2aWV3ICE9IDAKKwkJCSYmIGN1cndpbiAhPSBjdXJ3aW5fc2F2ZSAmJiB3aW5fdmFsaWQoY3Vyd2luX3NhdmUpKQorCQl7CisJCSAgICAvKiBSZXR1cm4gY3Vyc29yIHRvIHdoZXJlIHdlIHdlcmUgKi8KKwkJICAgIHZhbGlkYXRlX2N1cnNvcigpOworCQkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkJICAgIHdpbl9lbnRlcihjdXJ3aW5fc2F2ZSwgVFJVRSk7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwkgICAgfQorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorZXhpdF9tYXRjaGVkOgorI2VuZGlmCisJICAgIG1hdGNoZWQgPSBGQUxTRTsKKwkgICAgLyogbG9vayBmb3Igb3RoZXIgbWF0Y2hlcyBpbiB0aGUgcmVzdCBvZiB0aGUgbGluZSBpZiB3ZQorCSAgICAgKiBhcmUgbm90IGF0IHRoZSBlbmQgb2YgaXQgYWxyZWFkeSAqLworCSAgICBpZiAoZGVmX3JlZ21hdGNoLnJlZ3Byb2cgPT0gTlVMTAorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkgICAgJiYgYWN0aW9uID09IEFDVElPTl9FWFBBTkQKKwkJICAgICYmICEoY29udGludWVfc3RhdHVzICYgQ09OVF9TT0wpCisjZW5kaWYKKwkJICAgICYmICoocCA9IHN0YXJ0cCArIDEpKQorCQlnb3RvIHNlYXJjaF9saW5lOworCX0KKwlsaW5lX2JyZWFrY2hlY2soKTsKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwlpZiAoYWN0aW9uID09IEFDVElPTl9FWFBBTkQpCisJICAgIGluc19jb21wbF9jaGVja19rZXlzKCk7CisJaWYgKGdvdF9pbnQgfHwgY29tcGxldGlvbl9pbnRlcnJ1cHRlZCkKKyNlbHNlCisJaWYgKGdvdF9pbnQpCisjZW5kaWYKKwkgICAgYnJlYWs7CisKKwkvKgorCSAqIFJlYWQgdGhlIG5leHQgbGluZS4gIFdoZW4gcmVhZGluZyBhbiBpbmNsdWRlZCBmaWxlIGFuZCBlbmNvdW50ZXJpbmcKKwkgKiBlbmQtb2YtZmlsZSwgY2xvc2UgdGhlIGZpbGUgYW5kIGNvbnRpbnVlIGluIHRoZSBmaWxlIHRoYXQgaW5jbHVkZWQKKwkgKiBpdC4KKwkgKi8KKwl3aGlsZSAoZGVwdGggPj0gMCAmJiAhYWxyZWFkeQorCQkmJiB2aW1fZmdldHMobGluZSA9IGZpbGVfbGluZSwgTFNJWkUsIGZpbGVzW2RlcHRoXS5mcCkpCisJeworCSAgICBmY2xvc2UoZmlsZXNbZGVwdGhdLmZwKTsKKwkgICAgLS1vbGRfZmlsZXM7CisJICAgIGZpbGVzW29sZF9maWxlc10ubmFtZSA9IGZpbGVzW2RlcHRoXS5uYW1lOworCSAgICBmaWxlc1tvbGRfZmlsZXNdLm1hdGNoZWQgPSBmaWxlc1tkZXB0aF0ubWF0Y2hlZDsKKwkgICAgLS1kZXB0aDsKKwkgICAgY3Vycl9mbmFtZSA9IChkZXB0aCA9PSAtMSkgPyBjdXJidWYtPmJfZm5hbWUKKwkJCQkgICAgICAgOiBmaWxlc1tkZXB0aF0ubmFtZTsKKwkgICAgaWYgKGRlcHRoIDwgZGVwdGhfZGlzcGxheWVkKQorCQlkZXB0aF9kaXNwbGF5ZWQgPSBkZXB0aDsKKwl9CisJaWYgKGRlcHRoID49IDApCQkvKiB3ZSBjb3VsZCByZWFkIHRoZSBsaW5lICovCisJICAgIGZpbGVzW2RlcHRoXS5sbnVtKys7CisJZWxzZSBpZiAoIWFscmVhZHkpCisJeworCSAgICBpZiAoKytsbnVtID4gZW5kX2xudW0pCisJCWJyZWFrOworCSAgICBsaW5lID0gbWxfZ2V0KGxudW0pOworCX0KKwlhbHJlYWR5ID0gTlVMTDsKKyAgICB9CisgICAgLyogRW5kIG9mIGJpZyBmb3IgKDs7KSBsb29wLiAqLworCisgICAgLyogQ2xvc2UgYW55IGZpbGVzIHRoYXQgYXJlIHN0aWxsIG9wZW4uICovCisgICAgZm9yIChpID0gMDsgaSA8PSBkZXB0aDsgaSsrKQorICAgIHsKKwlmY2xvc2UoZmlsZXNbaV0uZnApOworCXZpbV9mcmVlKGZpbGVzW2ldLm5hbWUpOworICAgIH0KKyAgICBmb3IgKGkgPSBvbGRfZmlsZXM7IGkgPCBtYXhfcGF0aF9kZXB0aDsgaSsrKQorCXZpbV9mcmVlKGZpbGVzW2ldLm5hbWUpOworICAgIHZpbV9mcmVlKGZpbGVzKTsKKworICAgIGlmICh0eXBlID09IENIRUNLX1BBVEgpCisgICAgeworCWlmICghZGlkX3Nob3cpCisJeworCSAgICBpZiAoYWN0aW9uICE9IEFDVElPTl9TSE9XX0FMTCkKKwkJTVNHKF8oIkFsbCBpbmNsdWRlZCBmaWxlcyB3ZXJlIGZvdW5kIikpOworCSAgICBlbHNlCisJCU1TRyhfKCJObyBpbmNsdWRlZCBmaWxlcyIpKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKCFmb3VuZAorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCQkgICAgJiYgYWN0aW9uICE9IEFDVElPTl9FWFBBTkQKKyNlbmRpZgorCQkJCQkJKQorICAgIHsKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKwlpZiAoZ290X2ludCB8fCBjb21wbGV0aW9uX2ludGVycnVwdGVkKQorI2Vsc2UKKwlpZiAoZ290X2ludCkKKyNlbmRpZgorCSAgICBFTVNHKF8oZV9pbnRlcnIpKTsKKwllbHNlIGlmICh0eXBlID09IEZJTkRfREVGSU5FKQorCSAgICBFTVNHKF8oIkUzODg6IENvdWxkbid0IGZpbmQgZGVmaW5pdGlvbiIpKTsKKwllbHNlCisJICAgIEVNU0coXygiRTM4OTogQ291bGRuJ3QgZmluZCBwYXR0ZXJuIikpOworICAgIH0KKyAgICBpZiAoYWN0aW9uID09IEFDVElPTl9TSE9XIHx8IGFjdGlvbiA9PSBBQ1RJT05fU0hPV19BTEwpCisJbXNnX2VuZCgpOworCitmcGlwX2VuZDoKKyAgICB2aW1fZnJlZShmaWxlX2xpbmUpOworICAgIHZpbV9mcmVlKHJlZ21hdGNoLnJlZ3Byb2cpOworICAgIHZpbV9mcmVlKGluY2xfcmVnbWF0Y2gucmVncHJvZyk7CisgICAgdmltX2ZyZWUoZGVmX3JlZ21hdGNoLnJlZ3Byb2cpOworCisjaWZkZWYgUklTQ09TCisgICAvKiBSZXN0b3JlIHByZXZpb3VzIGZpbGUgbXVuZ2luZyBzdGF0ZS4gKi8KKyAgICBfX3Jpc2Nvc2lmeV9jb250cm9sID0gcHJldmlvdXNfbXVuZ2luZzsKKyNlbmRpZgorfQorCisgICAgc3RhdGljIHZvaWQKK3Nob3dfcGF0X2luX3BhdGgobGluZSwgdHlwZSwgZGlkX3Nob3csIGFjdGlvbiwgZnAsIGxudW0sIGNvdW50KQorICAgIGNoYXJfdSAgKmxpbmU7CisgICAgaW50CSAgICB0eXBlOworICAgIGludAkgICAgZGlkX3Nob3c7CisgICAgaW50CSAgICBhY3Rpb247CisgICAgRklMRSAgICAqZnA7CisgICAgbGluZW5yX1QgKmxudW07CisgICAgbG9uZyAgICBjb3VudDsKK3sKKyAgICBjaGFyX3UgICpwOworCisgICAgaWYgKGRpZF9zaG93KQorCW1zZ19wdXRjaGFyKCdcbicpOwkvKiBjdXJzb3IgYmVsb3cgbGFzdCBvbmUgKi8KKyAgICBlbHNlCisJZ290b2NtZGxpbmUoVFJVRSk7CS8qIGN1cnNvciBhdCBzdGF0dXMgbGluZSAqLworICAgIGlmIChnb3RfaW50KQkJLyogJ3EnIHR5cGVkIGF0ICItLW1vcmUtLSIgbWVzc2FnZSAqLworCXJldHVybjsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlwID0gbGluZSArIFNUUkxFTihsaW5lKSAtIDE7CisJaWYgKGZwICE9IE5VTEwpCisJeworCSAgICAvKiBXZSB1c2VkIGZnZXRzKCksIHNvIGdldCByaWQgb2YgbmV3bGluZSBhdCBlbmQgKi8KKwkgICAgaWYgKHAgPj0gbGluZSAmJiAqcCA9PSAnXG4nKQorCQktLXA7CisJICAgIGlmIChwID49IGxpbmUgJiYgKnAgPT0gJ1xyJykKKwkJLS1wOworCSAgICAqKHAgKyAxKSA9IE5VTDsKKwl9CisJaWYgKGFjdGlvbiA9PSBBQ1RJT05fU0hPV19BTEwpCisJeworCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmLCAiJTNsZDogIiwgY291bnQpOwkvKiBzaG93IG1hdGNoIG5yICovCisJICAgIG1zZ19wdXRzKElPYnVmZik7CisJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsICIlNGxkIiwgKmxudW0pOwkvKiBzaG93IGxpbmUgbnIgKi8KKwkJCQkJCS8qIEhpZ2hsaWdodCBsaW5lIG51bWJlcnMgKi8KKwkgICAgbXNnX3B1dHNfYXR0cihJT2J1ZmYsIGhsX2F0dHIoSExGX04pKTsKKwkgICAgTVNHX1BVVFMoIiAiKTsKKwl9CisJbXNnX3BydF9saW5lKGxpbmUpOworCW91dF9mbHVzaCgpOwkJCS8qIHNob3cgb25lIGxpbmUgYXQgYSB0aW1lICovCisKKwkvKiBEZWZpbml0aW9uIGNvbnRpbnVlcyB1bnRpbCBsaW5lIHRoYXQgZG9lc24ndCBlbmQgd2l0aCAnXCcgKi8KKwlpZiAoZ290X2ludCB8fCB0eXBlICE9IEZJTkRfREVGSU5FIHx8IHAgPCBsaW5lIHx8ICpwICE9ICdcXCcpCisJICAgIGJyZWFrOworCisJaWYgKGZwICE9IE5VTEwpCisJeworCSAgICBpZiAodmltX2ZnZXRzKGxpbmUsIExTSVpFLCBmcCkpIC8qIGVuZCBvZiBmaWxlICovCisJCWJyZWFrOworCSAgICArKypsbnVtOworCX0KKwllbHNlCisJeworCSAgICBpZiAoKysqbG51bSA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCQlicmVhazsKKwkgICAgbGluZSA9IG1sX2dldCgqbG51bSk7CisJfQorCW1zZ19wdXRjaGFyKCdcbicpOworICAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9WSU1JTkZPCisgICAgaW50CityZWFkX3ZpbWluZm9fc2VhcmNoX3BhdHRlcm4odmlycCwgZm9yY2UpCisgICAgdmlyX1QJKnZpcnA7CisgICAgaW50CQlmb3JjZTsKK3sKKyAgICBjaGFyX3UJKmxwOworICAgIGludAkJaWR4ID0gLTE7CisgICAgaW50CQltYWdpYyA9IEZBTFNFOworICAgIGludAkJbm9fc2NzID0gRkFMU0U7CisgICAgaW50CQlvZmZfbGluZSA9IEZBTFNFOworICAgIGludAkJb2ZmX2VuZCA9IEZBTFNFOworICAgIGxvbmcJb2ZmID0gMDsKKyAgICBpbnQJCXNldGxhc3QgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIHN0YXRpYyBpbnQJaGxzZWFyY2hfb24gPSBGQUxTRTsKKyNlbmRpZgorICAgIGNoYXJfdQkqdmFsOworCisgICAgLyoKKyAgICAgKiBPbGQgbGluZSB0eXBlczoKKyAgICAgKiAiL3BhdCIsICImcGF0Ijogc2VhcmNoL3N1YnN0LiBwYXQKKyAgICAgKiAifi9wYXQiLCAifiZwYXQiOiBsYXN0IHVzZWQgc2VhcmNoL3N1YnN0LiBwYXQKKyAgICAgKiBOZXcgbGluZSB0eXBlczoKKyAgICAgKiAifmgiLCAifkgiOiBobHNlYXJjaCBoaWdobGlnaHRpbmcgb2ZmL29uCisgICAgICogIn48bWFnaWM+PHNtYXJ0Y2FzZT48bGluZT48ZW5kPjxvZmY+PGxhc3Q+PHdoaWNoPnBhdCIKKyAgICAgKiA8bWFnaWM+OiAnbScgb2ZmLCAnTScgb24KKyAgICAgKiA8c21hcnRjYXNlPjogJ3MnIG9mZiwgJ1MnIG9uCisgICAgICogPGxpbmU+OiAnTCcgbGluZSBvZmZzZXQsICdsJyBjaGFyIG9mZnNldAorICAgICAqIDxlbmQ+OiAnRScgZnJvbSBlbmQsICdlJyBmcm9tIHN0YXJ0CisgICAgICogPG9mZj46IGRlY2ltYWwsIG9mZnNldAorICAgICAqIDxsYXN0PjogJ34nIGxhc3QgdXNlZCBwYXR0ZXJuCisgICAgICogPHdoaWNoPjogJy8nIHNlYXJjaCBwYXQsICcmJyBzdWJzdC4gcGF0CisgICAgICovCisgICAgbHAgPSB2aXJwLT52aXJfbGluZTsKKyAgICBpZiAobHBbMF0gPT0gJ34nICYmIChscFsxXSA9PSAnbScgfHwgbHBbMV0gPT0gJ00nKSkJLyogbmV3IGxpbmUgdHlwZSAqLworICAgIHsKKwlpZiAobHBbMV0gPT0gJ00nKQkJLyogbWFnaWMgb24gKi8KKwkgICAgbWFnaWMgPSBUUlVFOworCWlmIChscFsyXSA9PSAncycpCisJICAgIG5vX3NjcyA9IFRSVUU7CisJaWYgKGxwWzNdID09ICdMJykKKwkgICAgb2ZmX2xpbmUgPSBUUlVFOworCWlmIChscFs0XSA9PSAnRScpCisJICAgIG9mZl9lbmQgPSBUUlVFOworCWxwICs9IDU7CisJb2ZmID0gZ2V0ZGlnaXRzKCZscCk7CisgICAgfQorICAgIGlmIChscFswXSA9PSAnficpCQkvKiB1c2UgdGhpcyBwYXR0ZXJuIGZvciBsYXN0LXVzZWQgcGF0dGVybiAqLworICAgIHsKKwlzZXRsYXN0ID0gVFJVRTsKKwlscCsrOworICAgIH0KKyAgICBpZiAobHBbMF0gPT0gJy8nKQorCWlkeCA9IFJFX1NFQVJDSDsKKyAgICBlbHNlIGlmIChscFswXSA9PSAnJicpCisJaWR4ID0gUkVfU1VCU1Q7CisjaWZkZWYgRkVBVF9TRUFSQ0hfRVhUUkEKKyAgICBlbHNlIGlmIChscFswXSA9PSAnaCcpCS8qIH5oOiAnaGxzZWFyY2gnIGhpZ2hsaWdodGluZyBvZmYgKi8KKwlobHNlYXJjaF9vbiA9IEZBTFNFOworICAgIGVsc2UgaWYgKGxwWzBdID09ICdIJykJLyogfkg6ICdobHNlYXJjaCcgaGlnaGxpZ2h0aW5nIG9uICovCisJaGxzZWFyY2hfb24gPSBUUlVFOworI2VuZGlmCisgICAgaWYgKGlkeCA+PSAwKQorICAgIHsKKwlpZiAoZm9yY2UgfHwgc3BhdHNbaWR4XS5wYXQgPT0gTlVMTCkKKwl7CisJICAgIHZhbCA9IHZpbWluZm9fcmVhZHN0cmluZyh2aXJwLCAoaW50KShscCAtIHZpcnAtPnZpcl9saW5lICsgMSksCisJCQkJCQkJCQlUUlVFKTsKKwkgICAgaWYgKHZhbCAhPSBOVUxMKQorCSAgICB7CisJCXNldF9sYXN0X3NlYXJjaF9wYXQodmFsLCBpZHgsIG1hZ2ljLCBzZXRsYXN0KTsKKwkJdmltX2ZyZWUodmFsKTsKKwkJc3BhdHNbaWR4XS5ub19zY3MgPSBub19zY3M7CisJCXNwYXRzW2lkeF0ub2ZmLmxpbmUgPSBvZmZfbGluZTsKKwkJc3BhdHNbaWR4XS5vZmYuZW5kID0gb2ZmX2VuZDsKKwkJc3BhdHNbaWR4XS5vZmYub2ZmID0gb2ZmOworI2lmZGVmIEZFQVRfU0VBUkNIX0VYVFJBCisJCWlmIChzZXRsYXN0KQorCQkgICAgbm9faGxzZWFyY2ggPSAhaGxzZWFyY2hfb247CisjZW5kaWYKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIHZpbWluZm9fcmVhZGxpbmUodmlycCk7Cit9CisKKyAgICB2b2lkCit3cml0ZV92aW1pbmZvX3NlYXJjaF9wYXR0ZXJuKGZwKQorICAgIEZJTEUJKmZwOworeworICAgIGlmIChnZXRfdmltaW5mb19wYXJhbWV0ZXIoJy8nKSAhPSAwKQorICAgIHsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCWZwcmludGYoZnAsICJcbiMgaGxzZWFyY2ggb24gKEgpIG9yIG9mZiAoaCk6XG5+JWMiLAorCSAgICAobm9faGxzZWFyY2ggfHwgZmluZF92aW1pbmZvX3BhcmFtZXRlcignaCcpICE9IE5VTEwpID8gJ2gnIDogJ0gnKTsKKyNlbmRpZgorCXd2c3Bfb25lKGZwLCBSRV9TRUFSQ0gsICIiLCAnLycpOworCXd2c3Bfb25lKGZwLCBSRV9TVUJTVCwgIlN1YnN0aXR1dGUgIiwgJyYnKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAord3ZzcF9vbmUoZnAsIGlkeCwgcywgc2MpCisgICAgRklMRQkqZnA7CS8qIGZpbGUgdG8gd3JpdGUgdG8gKi8KKyAgICBpbnQJCWlkeDsJLyogc3BhdHNbXSBpbmRleCAqLworICAgIGNoYXIJKnM7CS8qIHNlYXJjaCBwYXQgKi8KKyAgICBpbnQJCXNjOwkvKiBkaXIgY2hhciAqLworeworICAgIGlmIChzcGF0c1tpZHhdLnBhdCAhPSBOVUxMKQorICAgIHsKKwlmcHJpbnRmKGZwLCAiXG4jIExhc3QgJXNTZWFyY2ggUGF0dGVybjpcbn4iLCBzKTsKKwkvKiBvZmYuZGlyIGlzIG5vdCBzdG9yZWQsIGl0J3MgcmVzZXQgdG8gZm9yd2FyZCAqLworCWZwcmludGYoZnAsICIlYyVjJWMlYyVsZCVzJWMiLAorCQlzcGF0c1tpZHhdLm1hZ2ljICAgID8gJ00nIDogJ20nLAkvKiBtYWdpYyAqLworCQlzcGF0c1tpZHhdLm5vX3NjcyAgID8gJ3MnIDogJ1MnLAkvKiBzbWFydGNhc2UgKi8KKwkJc3BhdHNbaWR4XS5vZmYubGluZSA/ICdMJyA6ICdsJywJLyogbGluZSBvZmZzZXQgKi8KKwkJc3BhdHNbaWR4XS5vZmYuZW5kICA/ICdFJyA6ICdlJywJLyogb2Zmc2V0IGZyb20gZW5kICovCisJCXNwYXRzW2lkeF0ub2ZmLm9mZiwJCQkvKiBvZmZzZXQgKi8KKwkJbGFzdF9pZHggPT0gaWR4CSAgICA/ICJ+IiA6ICIiLAkJLyogbGFzdCB1c2VkIHBhdCAqLworCQlzYyk7CisJdmltaW5mb193cml0ZXN0cmluZyhmcCwgc3BhdHNbaWR4XS5wYXQpOworICAgIH0KK30KKyNlbmRpZiAvKiBGRUFUX1ZJTUlORk8gKi8KZGlmZiAtLWdpdCBhL3NyYy9zdHJ1Y3RzLmggYi9zcmMvc3RydWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGE3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RydWN0cy5oCkBAIC0wLDAgKzEsMTg4NyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMgdGhhdCBhcmUgdXNlZCBieSBWaW0KKyAqLworCisvKgorICogVGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIGluIHRoZSBTQVMgY29tcGlsZXIgdGhhdCBtYWtlcyB0eXBlZGVmcyBub3QKKyAqIHZhbGlkIGluIGluY2x1ZGUgZmlsZXMuICBIYXMgYmVlbiBmaXhlZCBpbiB2ZXJzaW9uIDYuNTguCisgKi8KKyNpZiBkZWZpbmVkKFNBU0MpICYmIFNBU0MgPCA2NTgKK3R5cGVkZWYgbG9uZwkJbGluZW5yX1Q7Cit0eXBlZGVmIHVuc2lnbmVkCWNvbG5yX1Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CXNob3J0X3U7CisjZW5kaWYKKworLyoKKyAqIHBvc2l0aW9uIGluIGZpbGUgb3IgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbGluZW5yX1QJbG51bTsJLyogbGluZSBudW1iZXIgKi8KKyAgICBjb2xucl9UCWNvbDsJLyogY29sdW1uIG51bWJlciAqLworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBjb2xucl9UCWNvbGFkZDsKKyNlbmRpZgorfSBwb3NfVDsKKworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyMgZGVmaW5lIElOSVRfUE9TX1QgezAsIDAsIDB9CisjZWxzZQorIyBkZWZpbmUgSU5JVF9QT1NfVCB7MCwgMH0KKyNlbmRpZgorCisvKgorICogU2FtZSwgYnV0IHdpdGhvdXQgY29sYWRkLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGxpbmVucl9UCWxudW07CS8qIGxpbmUgbnVtYmVyICovCisgICAgY29sbnJfVAljb2w7CS8qIGNvbHVtbiBudW1iZXIgKi8KK30gbHBvc19UOworCisvKgorICogU3RydWN0dXJlIHVzZWQgZm9yIGdyb3dpbmcgYXJyYXlzLgorICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgb25seSBncm93cywgaXMgZGVsZXRlZCBhbGwgYXQKKyAqIG9uY2UsIGFuZCBuZWVkcyB0byBiZSBhY2Nlc3NlZCBieSBpbmRleC4gIFNlZSBnYV9jbGVhcigpIGFuZCBnYV9ncm93KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGdyb3dhcnJheQoreworICAgIGludAkgICAgZ2FfbGVuOwkJICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGl0ZW1zIHVzZWQgKi8KKyAgICBpbnQJICAgIGdhX3Jvb207CQkgICAgLyogbnVtYmVyIG9mIHVudXNlZCBpdGVtcyBhdCB0aGUgZW5kICovCisgICAgaW50CSAgICBnYV9pdGVtc2l6ZTsJICAgIC8qIHNpemVvZiBvbmUgaXRlbSAqLworICAgIGludAkgICAgZ2FfZ3Jvd3NpemU7CSAgICAvKiBudW1iZXIgb2YgaXRlbXMgdG8gZ3JvdyBlYWNoIHRpbWUgKi8KKyAgICB2b2lkICAgICpnYV9kYXRhOwkJICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGl0ZW0gKi8KK30gZ2FycmF5X1Q7CisKKyNkZWZpbmUgR0FfRU1QVFkgICAgezAsIDAsIDAsIDAsIE5VTEx9CisKKy8qCisgKiBUaGlzIGlzIGhlcmUgYmVjYXVzZSByZWdleHAuaCBuZWVkcyBwb3NfVCBhbmQgYmVsb3cgcmVncHJvZ19UIGlzIHVzZWQuCisgKi8KKyNpbmNsdWRlICJyZWdleHAuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgd2luZG93CXdpbl9UOwordHlwZWRlZiBzdHJ1Y3Qgd2luaW5mbwl3aW5pbmZvX1Q7Cit0eXBlZGVmIHN0cnVjdCBmcmFtZQlmcmFtZV9UOwordHlwZWRlZiBpbnQJCXNjaWRfVDsJCS8qIHNjcmlwdCBJRCAqLworCisvKgorICogVGhpcyBpcyBoZXJlIGJlY2F1c2UgZ3VpLmggbmVlZHMgdGhlIHBvc19UIGFuZCB3aW5fVCwgYW5kIHdpbl9UIG5lZWRzIGd1aS5oCisgKiBmb3Igc2Nyb2xsYmFyX1QuCisgKi8KKyNpZmRlZiBGRUFUX0dVSQorIyBpbmNsdWRlICJndWkuaCIKKyNlbHNlCisjIGlmZGVmIEZFQVRfWENMSVBCT0FSRAorIyAgaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorIyBlbmRpZgorIyBkZWZpbmUgZ3VpY29sb3JfVCBpbnQJCS8qIGF2b2lkIGVycm9yIGluIHByb3RvdHlwZXMgKi8KKyNlbmRpZgorCisvKgorICogbWFya3M6IHBvc2l0aW9ucyBpbiBhIGZpbGUKKyAqIChhIG5vcm1hbCBtYXJrIGlzIGEgbG51bS9jb2wgcGFpciwgdGhlIHNhbWUgYXMgYSBmaWxlIHBvc2l0aW9uKQorICovCisKKy8qIChOb3RlOiBmb3IgRUJDRElDIHRoZXJlIGFyZSBtb3JlIHRoYW4gMjYsIGJlY2F1c2UgdGhlcmUgYXJlIGdhcHMgaW4gdGhlCisgKiBhbHBoYWJldCBjb2RpbmcuICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIHRvIHRoZSBjb2RlLCBJIGRlY2lkZWQgdG8ganVzdAorICogaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBtYXJrcy4gKi8KKyNkZWZpbmUgTk1BUktTCQkoJ3onIC0gJ2EnICsgMSkJLyogbWF4LiAjIG9mIG5hbWVkIG1hcmtzICovCisjZGVmaW5lIEpVTVBMSVNUU0laRQkxMDAJCS8qIG1heC4gIyBvZiBtYXJrcyBpbiBqdW1wIGxpc3QgKi8KKyNkZWZpbmUgVEFHU1RBQ0tTSVpFCTIwCQkvKiBtYXguICMgb2YgdGFncyBpbiB0YWcgc3RhY2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmlsZW1hcmsKK3sKKyAgICBwb3NfVAltYXJrOwkJLyogY3Vyc29yIHBvc2l0aW9uICovCisgICAgaW50CQlmbnVtOwkJLyogZmlsZSBudW1iZXIgKi8KK30gZm1hcmtfVDsKKworLyogWHRlbmRlZCBmaWxlIG1hcms6IGFsc28gaGFzIGEgZmlsZSBuYW1lICovCit0eXBlZGVmIHN0cnVjdCB4ZmlsZW1hcmsKK3sKKyAgICBmbWFya19UCWZtYXJrOworICAgIGNoYXJfdQkqZm5hbWU7CQkvKiBmaWxlIG5hbWUsIHVzZWQgd2hlbiBmbnVtID09IDAgKi8KK30geGZtYXJrX1Q7CisKKy8qCisgKiBUaGUgdGFnZ3kgc3RydWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgOnRhZyBjb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWdneQoreworICAgIGNoYXJfdQkqdGFnbmFtZTsJLyogdGFnIG5hbWUgKi8KKyAgICBmbWFya19UCWZtYXJrOwkJLyogY3Vyc29yIHBvc2l0aW9uIEJFRk9SRSAiOnRhZyIgKi8KKyAgICBpbnQJCWN1cl9tYXRjaDsJLyogbWF0Y2ggbnVtYmVyICovCisgICAgaW50CQljdXJfZm51bTsJLyogYnVmZmVyIG51bWJlciB1c2VkIGZvciBjdXJfbWF0Y2ggKi8KK30gdGFnZ3lfVDsKKworLyoKKyAqIFN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBvcHRpb25zIHRoYXQgYXJlIGxvY2FsIHRvIGEgd2luZG93LgorICogVXNlZCB0d2ljZSBpbiBhIHdpbmRvdzogZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBhbmQgZm9yIGFsbCBidWZmZXJzLgorICogQWxzbyB1c2VkIGluIHdpbmluZm9fVC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyNpZmRlZiBGRUFUX0FSQUJJQworICAgIGludAkJd29fYXJhYjsKKyMgZGVmaW5lIHdfcF9hcmFiIHdfb25lYnVmX29wdC53b19hcmFiCS8qICdhcmFiaWMnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBpbnQJCXdvX2RpZmY7CisjIGRlZmluZSB3X3BfZGlmZiB3X29uZWJ1Zl9vcHQud29fZGlmZgkvKiAnZGlmZicgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworICAgIGxvbmcJd29fZmRjOworIyBkZWZpbmUgd19wX2ZkYyB3X29uZWJ1Zl9vcHQud29fZmRjCS8qICdmb2xkY29sdW1uJyAqLworICAgIGludAkJd29fZmVuOworIyBkZWZpbmUgd19wX2ZlbiB3X29uZWJ1Zl9vcHQud29fZmVuCS8qICdmb2xkZW5hYmxlJyAqLworICAgIGNoYXJfdQkqd29fZmRpOworIyBkZWZpbmUgd19wX2ZkaSB3X29uZWJ1Zl9vcHQud29fZmRpCS8qICdmb2xkaWdub3JlJyAqLworICAgIGxvbmcJd29fZmRsOworIyBkZWZpbmUgd19wX2ZkbCB3X29uZWJ1Zl9vcHQud29fZmRsCS8qICdmb2xkbGV2ZWwnICovCisgICAgY2hhcl91CSp3b19mZG07CisjIGRlZmluZSB3X3BfZmRtIHdfb25lYnVmX29wdC53b19mZG0JLyogJ2ZvbGRtZXRob2QnICovCisgICAgbG9uZwl3b19mbWw7CisjIGRlZmluZSB3X3BfZm1sIHdfb25lYnVmX29wdC53b19mbWwJLyogJ2ZvbGRtaW5saW5lcycgKi8KKyAgICBsb25nCXdvX2ZkbjsKKyMgZGVmaW5lIHdfcF9mZG4gd19vbmVidWZfb3B0LndvX2ZkbgkvKiAnZm9sZG5leHRtYXgnICovCisjIGlmZGVmIEZFQVRfRVZBTAorICAgIGNoYXJfdQkqd29fZmRlOworIyBkZWZpbmUgd19wX2ZkZSB3X29uZWJ1Zl9vcHQud29fZmRlCS8qICdmb2xkZXhwcicgKi8KKyAgICBjaGFyX3UJKndvX2ZkdDsKKyMgIGRlZmluZSB3X3BfZmR0IHdfb25lYnVmX29wdC53b19mZHQJLyogJ2ZvbGR0ZXh0JyAqLworIyBlbmRpZgorICAgIGNoYXJfdQkqd29fZm1yOworIyBkZWZpbmUgd19wX2ZtciB3X29uZWJ1Zl9vcHQud29fZm1yCS8qICdmb2xkbWFya2VyJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKyAgICBpbnQJCXdvX2xicjsKKyMgZGVmaW5lIHdfcF9sYnIgd19vbmVidWZfb3B0LndvX2xicgkvKiAnbGluZWJyZWFrJyAqLworI2VuZGlmCisgICAgaW50CQl3b19saXN0OworI2RlZmluZSB3X3BfbGlzdCB3X29uZWJ1Zl9vcHQud29fbGlzdAkvKiAnbGlzdCcgKi8KKyAgICBpbnQJCXdvX251OworI2RlZmluZSB3X3BfbnUgd19vbmVidWZfb3B0LndvX251CS8qICdudW1iZXInICovCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpCisgICAgaW50CQl3b193Zmg7CisjIGRlZmluZSB3X3Bfd2ZoIHdfb25lYnVmX29wdC53b193ZmgJLyogJ3dpbmZpeGhlaWdodCcgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgaW50CQl3b19wdnc7CisjIGRlZmluZSB3X3BfcHZ3IHdfb25lYnVmX29wdC53b19wdncJLyogJ3ByZXZpZXd3aW5kb3cnICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX1JJR0hUTEVGVAorICAgIGludAkJd29fcmw7CisjIGRlZmluZSB3X3Bfcmwgd19vbmVidWZfb3B0LndvX3JsCS8qICdyaWdodGxlZnQnICovCisgICAgY2hhcl91CSp3b19ybGM7CisjIGRlZmluZSB3X3BfcmxjIHdfb25lYnVmX29wdC53b19ybGMJLyogJ3JpZ2h0bGVmdGNtZCcgKi8KKyNlbmRpZgorICAgIGxvbmcJd29fc2NyOworI2RlZmluZSB3X3Bfc2NyIHdfb25lYnVmX29wdC53b19zY3IJLyogJ3Njcm9sbCcgKi8KKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKyAgICBpbnQJCXdvX3NjYjsKKyMgZGVmaW5lIHdfcF9zY2Igd19vbmVidWZfb3B0LndvX3NjYgkvKiAnc2Nyb2xsYmluZCcgKi8KKyNlbmRpZgorICAgIGludAkJd29fd3JhcDsKKyNkZWZpbmUgd19wX3dyYXAgd19vbmVidWZfb3B0LndvX3dyYXAJLyogJ3dyYXAnICovCit9IHdpbm9wdF9UOworCisvKgorICogV2luZG93IGluZm8gc3RvcmVkIHdpdGggYSBidWZmZXIuCisgKgorICogVHdvIHR5cGVzIG9mIGluZm8gYXJlIGtlcHQgZm9yIGEgYnVmZmVyIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggYQorICogc3BlY2lmaWMgd2luZG93OgorICogMS4gRWFjaCB3aW5kb3cgY2FuIGhhdmUgYSBkaWZmZXJlbnQgbGluZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIGEgYnVmZmVyLgorICogMi4gVGhlIHdpbmRvdy1sb2NhbCBvcHRpb25zIGZvciBhIGJ1ZmZlciB3b3JrIGluIGEgc2ltaWxhciB3YXkuCisgKiBUaGUgd2luZG93LWluZm8gaXMga2VwdCBpbiBhIGxpc3QgYXQgYl93aW5pbmZvLiAgSXQgaXMga2VwdCBpbgorICogbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLgorICovCitzdHJ1Y3Qgd2luaW5mbworeworICAgIHdpbmluZm9fVAkqd2lfbmV4dDsJLyogbmV4dCBlbnRyeSBvciBOVUxMIGZvciBsYXN0IGVudHJ5ICovCisgICAgd2luaW5mb19UCSp3aV9wcmV2OwkvKiBwcmV2aW91cyBlbnRyeSBvciBOVUxMIGZvciBmaXJzdCBlbnRyeSAqLworICAgIHdpbl9UCSp3aV93aW47CS8qIHBvaW50ZXIgdG8gd2luZG93IHRoYXQgZGlkIHNldCB3aV9sbnVtICovCisgICAgcG9zX1QJd2lfZnBvczsJLyogbGFzdCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGZpbGUgKi8KKyAgICBpbnQJCXdpX29wdHNldDsJLyogVFJVRSB3aGVuIHdpX29wdCBoYXMgdXNlZnVsIHZhbHVlcyAqLworICAgIHdpbm9wdF9UCXdpX29wdDsJCS8qIGxvY2FsIHdpbmRvdyBvcHRpb25zICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaW50CQl3aV9mb2xkX21hbnVhbDsJLyogY29weSBvZiB3X2ZvbGRfbWFudWFsICovCisgICAgZ2FycmF5X1QJd2lfZm9sZHM7CS8qIGNsb25lIG9mIHdfZm9sZHMgKi8KKyNlbmRpZgorfTsKKworLyoKKyAqIEluZm8gdXNlZCB0byBwYXNzIGluZm8gYWJvdXQgYSBmb2xkIGZyb20gdGhlIGZvbGQtZGV0ZWN0aW9uIGNvZGUgdG8gdGhlCisgKiBjb2RlIHRoYXQgZGlzcGxheXMgdGhlIGZvbGRjb2x1bW4uCisgKi8KK3R5cGVkZWYgc3RydWN0IGZvbGRpbmZvCit7CisgICAgaW50CQlmaV9sZXZlbDsJLyogbGV2ZWwgb2YgdGhlIGZvbGQ7IHdoZW4gdGhpcyBpcyB6ZXJvIHRoZQorCQkJCSAgIG90aGVyIGZpZWxkcyBhcmUgaW52YWxpZCAqLworICAgIGludAkJZmlfbG51bTsJLyogbGluZSBudW1iZXIgd2hlcmUgZm9sZCBzdGFydHMgKi8KKyAgICBpbnQJCWZpX2xvd19sZXZlbDsJLyogbG93ZXN0IGZvbGQgbGV2ZWwgdGhhdCBzdGFydHMgaW4gdGhlIHNhbWUKKwkJCQkgICBsaW5lICovCit9IGZvbGRpbmZvX1Q7CisKKy8qCisgKiBzdHVjdHVyZXMgdXNlZCBmb3IgdW5kbworICovCisKK3R5cGVkZWYgc3RydWN0IHVfZW50cnkgdV9lbnRyeV9UOwordHlwZWRlZiBzdHJ1Y3QgdV9oZWFkZXIgdV9oZWFkZXJfVDsKK3N0cnVjdCB1X2VudHJ5Cit7CisgICAgdV9lbnRyeV9UCSp1ZV9uZXh0OwkvKiBwb2ludGVyIHRvIG5leHQgZW50cnkgaW4gbGlzdCAqLworICAgIGxpbmVucl9UCXVlX3RvcDsJCS8qIG51bWJlciBvZiBsaW5lIGFib3ZlIHVuZG8gYmxvY2sgKi8KKyAgICBsaW5lbnJfVAl1ZV9ib3Q7CQkvKiBudW1iZXIgb2YgbGluZSBiZWxvdyB1bmRvIGJsb2NrICovCisgICAgbGluZW5yX1QJdWVfbGNvdW50OwkvKiBsaW5lY291bnQgd2hlbiB1X3NhdmUgY2FsbGVkICovCisgICAgY2hhcl91CSoqdWVfYXJyYXk7CS8qIGFycmF5IG9mIGxpbmVzIGluIHVuZG8gYmxvY2sgKi8KKyAgICBsb25nCXVlX3NpemU7CS8qIG51bWJlciBvZiBsaW5lcyBpbiB1ZV9hcnJheSAqLworfTsKKworc3RydWN0IHVfaGVhZGVyCit7CisgICAgdV9oZWFkZXJfVAkqdWhfbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IGhlYWRlciBpbiBsaXN0ICovCisgICAgdV9oZWFkZXJfVAkqdWhfcHJldjsJLyogcG9pbnRlciB0byBwcmV2aW91cyBoZWFkZXIgaW4gbGlzdCAqLworICAgIHVfZW50cnlfVAkqdWhfZW50cnk7CS8qIHBvaW50ZXIgdG8gZmlyc3QgZW50cnkgKi8KKyAgICB1X2VudHJ5X1QJKnVoX2dldGJvdF9lbnRyeTsgLyogcG9pbnRlciB0byB3aGVyZSB1ZV9ib3QgbXVzdCBiZSBzZXQgKi8KKyAgICBwb3NfVAl1aF9jdXJzb3I7CS8qIGN1cnNvciBwb3NpdGlvbiBiZWZvcmUgc2F2aW5nICovCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIGxvbmcJdWhfY3Vyc29yX3Zjb2w7CisjZW5kaWYKKyAgICBpbnQJCXVoX2ZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKyAgICBwb3NfVAl1aF9uYW1lZG1bTk1BUktTXTsJLyogbWFya3MgYmVmb3JlIHVuZG8vYWZ0ZXIgcmVkbyAqLworfTsKKworLyogdmFsdWVzIGZvciB1aF9mbGFncyAqLworI2RlZmluZSBVSF9DSEFOR0VEICAweDAxCS8qIGJfY2hhbmdlZCBmbGFnIGJlZm9yZSB1bmRvL2FmdGVyIHJlZG8gKi8KKyNkZWZpbmUgVUhfRU1QVFlCVUYgMHgwMgkvKiBidWZmZXIgd2FzIGVtcHR5ICovCisKKy8qCisgKiBzdHVjdHVyZXMgdXNlZCBpbiB1bmRvLmMKKyAqLworI2lmIFNJWkVPRl9JTlQgPiAyCisjIGRlZmluZSBBTElHTl9MT05HCS8qIGxvbmd3b3JkIGFsaWdubWVudCBhbmQgdXNlIGZpbGxlciBieXRlICovCisjIGRlZmluZSBBTElHTl9TSVpFIChzaXplb2YobG9uZykpCisjZWxzZQorIyBkZWZpbmUgQUxJR05fU0laRSAoc2l6ZW9mKHNob3J0KSkKKyNlbmRpZgorCisjZGVmaW5lIEFMSUdOX01BU0sgKEFMSUdOX1NJWkUgLSAxKQorCit0eXBlZGVmIHN0cnVjdCBtX2luZm8gbWluZm9fVDsKKworLyoKKyAqIHN0dWN0dXJlIHVzZWQgdG8gbGluayBjaHVua3MgaW4gb25lIG9mIHRoZSBmcmVlIGNodW5rIGxpc3RzLgorICovCitzdHJ1Y3QgbV9pbmZvCit7CisjaWZkZWYgQUxJR05fTE9ORworICAgIGxvbmdfdQltX3NpemU7CQkvKiBzaXplIG9mIHRoZSBjaHVuayAoaW5jbHVkaW5nIG1faW5mbykgKi8KKyNlbHNlCisgICAgc2hvcnRfdQltX3NpemU7CQkvKiBzaXplIG9mIHRoZSBjaHVuayAoaW5jbHVkaW5nIG1faW5mbykgKi8KKyNlbmRpZgorICAgIG1pbmZvX1QJKm1fbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IGZyZWUgY2h1bmsgaW4gdGhlIGxpc3QgKi8KK307CisKKy8qCisgKiBzdHJ1Y3R1cmUgdXNlZCB0byBsaW5rIGJsb2NrcyBpbiB0aGUgbGlzdCBvZiBhbGxvY2F0ZWQgYmxvY2tzLgorICovCit0eXBlZGVmIHN0cnVjdCBtX2Jsb2NrIG1ibG9ja19UOworc3RydWN0IG1fYmxvY2sKK3sKKyAgICBtYmxvY2tfVAkqbWJfbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IGFsbG9jYXRlZCBibG9jayAqLworICAgIHNpemVfdAltYl9zaXplOwkvKiB0b3RhbCBzaXplIG9mIGFsbCBjaHVua3MgaW4gdGhpcyBibG9jayAqLworICAgIG1pbmZvX1QJbWJfaW5mbzsJLyogaGVhZCBvZiBmcmVlIGNodWNrIGxpc3QgZm9yIHRoaXMgYmxvY2sgKi8KK307CisKKy8qCisgKiB0aGluZ3MgdXNlZCBpbiBtZW1maWxlLmMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBibG9ja19oZHIgICAgYmhkcl9UOwordHlwZWRlZiBzdHJ1Y3QgbWVtZmlsZQkgICAgbWVtZmlsZV9UOwordHlwZWRlZiBsb25nCQkgICAgYmxvY2tucl9UOworCisvKgorICogZm9yIGVhY2ggKHByZXZpb3VzbHkpIHVzZWQgYmxvY2sgaW4gdGhlIG1lbWZpbGUgdGhlcmUgaXMgb25lIGJsb2NrIGhlYWRlci4KKyAqCisgKiBUaGUgYmxvY2sgbWF5IGJlIGxpbmtlZCBpbiB0aGUgdXNlZCBsaXN0IE9SIGluIHRoZSBmcmVlIGxpc3QuCisgKiBUaGUgdXNlZCBibG9ja3MgYXJlIGFsc28ga2VwdCBpbiBoYXNoIGxpc3RzLgorICoKKyAqIFRoZSB1c2VkIGxpc3QgaXMgYSBkb3VibHkgbGlua2VkIGxpc3QsIG1vc3QgcmVjZW50bHkgdXNlZCBibG9jayBmaXJzdC4KKyAqCVRoZSBibG9ja3MgaW4gdGhlIHVzZWQgbGlzdCBoYXZlIGEgYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZC4KKyAqCW1mX3VzZWRfY291bnQgaXMgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgdXNlZCBsaXN0LgorICogVGhlIGhhc2ggbGlzdHMgYXJlIHVzZWQgdG8gcXVpY2tseSBmaW5kIGEgYmxvY2sgaW4gdGhlIHVzZWQgbGlzdC4KKyAqIFRoZSBmcmVlIGxpc3QgaXMgYSBzaW5nbGUgbGlua2VkIGxpc3QsIG5vdCBzb3J0ZWQuCisgKglUaGUgYmxvY2tzIGluIHRoZSBmcmVlIGxpc3QgaGF2ZSBubyBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkIGFuZAorICoJdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayBpbiB0aGUgZmlsZSAoaWYgYW55KSBpcyBpcnJlbGV2YW50LgorICovCisKK3N0cnVjdCBibG9ja19oZHIKK3sKKyAgICBiaGRyX1QJKmJoX25leHQ7CSAgICAvKiBuZXh0IGJsb2NrX2hkciBpbiBmcmVlIG9yIHVzZWQgbGlzdCAqLworICAgIGJoZHJfVAkqYmhfcHJldjsJICAgIC8qIHByZXZpb3VzIGJsb2NrX2hkciBpbiB1c2VkIGxpc3QgKi8KKyAgICBiaGRyX1QJKmJoX2hhc2hfbmV4dDsJICAgIC8qIG5leHQgYmxvY2tfaGRyIGluIGhhc2ggbGlzdCAqLworICAgIGJoZHJfVAkqYmhfaGFzaF9wcmV2OwkgICAgLyogcHJldmlvdXMgYmxvY2tfaGRyIGluIGhhc2ggbGlzdCAqLworICAgIGJsb2NrbnJfVAliaF9ibnVtOwkJLyogYmxvY2sgbnVtYmVyICovCisgICAgY2hhcl91CSpiaF9kYXRhOwkgICAgLyogcG9pbnRlciB0byBtZW1vcnkgKGZvciB1c2VkIGJsb2NrKSAqLworICAgIGludAkJYmhfcGFnZV9jb3VudDsJICAgIC8qIG51bWJlciBvZiBwYWdlcyBpbiB0aGlzIGJsb2NrICovCisKKyNkZWZpbmUgQkhfRElSVFkgICAgMQorI2RlZmluZSBCSF9MT0NLRUQgICAyCisgICAgY2hhcgliaF9mbGFnczsJICAgIC8qIEJIX0RJUlRZIG9yIEJIX0xPQ0tFRCAqLworfTsKKworLyoKKyAqIHdoZW4gYSBibG9jayB3aXRoIGEgbmVnYXRpdmUgbnVtYmVyIGlzIGZsdXNoZWQgdG8gdGhlIGZpbGUsIGl0IGdldHMKKyAqIGEgcG9zaXRpdmUgbnVtYmVyLiBCZWNhdXNlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJsb2NrIGlzIHN0aWxsIHRoZSBuZWdhdGl2ZQorICogbnVtYmVyLCB3ZSByZW1lbWJlciB0aGUgdHJhbnNsYXRpb24gdG8gdGhlIG5ldyBwb3NpdGl2ZSBudW1iZXIgaW4gdGhlCisgKiBkb3VibGUgbGlua2VkIHRyYW5zIGxpc3RzLiBUaGUgc3RydWN0dXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBoYXNoIGxpc3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBucl90cmFucyBOUl9UUkFOUzsKKworc3RydWN0IG5yX3RyYW5zCit7CisgICAgTlJfVFJBTlMJKm50X25leHQ7CQkvKiBuZXh0IG5yX3RyYW5zIGluIGhhc2ggbGlzdCAqLworICAgIE5SX1RSQU5TCSpudF9wcmV2OwkJLyogcHJldmlvdXMgbnJfdHJhbnMgaW4gaGFzaCBsaXN0ICovCisgICAgYmxvY2tucl9UCW50X29sZF9ibnVtOwkJLyogb2xkLCBuZWdhdGl2ZSwgbnVtYmVyICovCisgICAgYmxvY2tucl9UCW50X25ld19ibnVtOwkJLyogbmV3LCBwb3NpdGl2ZSwgbnVtYmVyICovCit9OworCisvKgorICogc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgb25lIGJsb2NrIG9mIHRoZSBzdHVmZi9yZWRvL3JlY29yZGluZyBidWZmZXJzCisgKi8KK3N0cnVjdCBidWZmYmxvY2sKK3sKKyAgICBzdHJ1Y3QgYnVmZmJsb2NrCSpiX25leHQ7CS8qIHBvaW50ZXIgdG8gbmV4dCBidWZmYmxvY2sgKi8KKyAgICBjaGFyX3UJCWJfc3RyWzFdOwkvKiBjb250ZW50cyAoYWN0dWFsbHkgbG9uZ2VyKSAqLworfTsKKworLyoKKyAqIGhlYWRlciB1c2VkIGZvciB0aGUgc3R1ZmYgYnVmZmVyIGFuZCB0aGUgcmVkbyBidWZmZXIKKyAqLworc3RydWN0IGJ1ZmZoZWFkZXIKK3sKKyAgICBzdHJ1Y3QgYnVmZmJsb2NrCWJoX2ZpcnN0OwkvKiBmaXJzdCAoZHVtbXkpIGJsb2NrIG9mIGxpc3QgKi8KKyAgICBzdHJ1Y3QgYnVmZmJsb2NrCSpiaF9jdXJyOwkvKiBidWZmYmxvY2sgZm9yIGFwcGVuZGluZyAqLworICAgIGludAkJCWJoX2luZGV4OwkvKiBpbmRleCBmb3IgcmVhZGluZyAqLworICAgIGludAkJCWJoX3NwYWNlOwkvKiBzcGFjZSBpbiBiaF9jdXJyIGZvciBhcHBlbmRpbmcgKi8KK307CisKKy8qCisgKiB1c2VkIGZvciBjb21wbGV0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZXhwYW5kCit7CisgICAgaW50CQl4cF9jb250ZXh0OwkJLyogdHlwZSBvZiBleHBhbnNpb24gKi8KKyAgICBjaGFyX3UJKnhwX3BhdHRlcm47CQkvKiBzdGFydCBvZiBpdGVtIHRvIGV4cGFuZCAqLworI2lmIGRlZmluZWQoRkVBVF9VU1JfQ01EUykgJiYgZGVmaW5lZChGRUFUX0VWQUwpICYmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKQorICAgIGNoYXJfdQkqeHBfYXJnOwkJLyogY29tcGxldGlvbiBmdW5jdGlvbiAqLworICAgIGludAkJeHBfc2NyaXB0SUQ7CQkvKiBTSUQgZm9yIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKyNlbmRpZgorICAgIGludAkJeHBfYmFja3NsYXNoOwkJLyogb25lIG9mIHRoZSBYUF9CU18gdmFsdWVzICovCisgICAgaW50CQl4cF9udW1maWxlczsJCS8qIG51bWJlciBvZiBmaWxlcyBmb3VuZCBieQorCQkJCQkJICAgIGZpbGUgbmFtZSBjb21wbGV0aW9uICovCisgICAgY2hhcl91CSoqeHBfZmlsZXM7CQkvKiBsaXN0IG9mIGZpbGVzICovCit9IGV4cGFuZF9UOworCisvKiB2YWx1ZXMgZm9yIHhwX2JhY2tzbGFzaCAqLworI2RlZmluZSBYUF9CU19OT05FCTAJLyogbm90aGluZyBzcGVjaWFsIGZvciBiYWNrc2xhc2hlcyAqLworI2RlZmluZSBYUF9CU19PTkUJMQkvKiB1c2VzIG9uZSBiYWNrc2xhc2ggYmVmb3JlIGEgc3BhY2UgKi8KKyNkZWZpbmUgWFBfQlNfVEhSRUUJMgkvKiB1c2VzIHRocmVlIGJhY2tzbGFzaGVzIGJlZm9yZSBhIHNwYWNlICovCisKKy8qCisgKiBDb21tYW5kIG1vZGlmaWVycyAiOnZlcnRpY2FsIiwgIjpicm93c2UiLCAiOmNvbmZpcm0iIGFuZCAiOmhpZGUiIHNldCBhIGZsYWcuCisgKiBUaGlzIG5lZWRzIHRvIGJlIHNhdmVkIGZvciByZWN1cnNpdmUgY29tbWFuZHMsIHB1dCB0aGVtIGluIGEgc3RydWN0dXJlIGZvcgorICogZWFzeSBtYW5pcHVsYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQloaWRlOwkJCS8qIFRSVUUgd2hlbiAiOmhpZGUiIHdhcyB1c2VkICovCisjIGlmZGVmIEZFQVRfQlJPV1NFCisgICAgaW50CQlicm93c2U7CQkJLyogVFJVRSB0byBpbnZva2UgZmlsZSBkaWFsb2cgKi8KKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaW50CQlzcGxpdDsJCQkvKiBmbGFncyBmb3Igd2luX3NwbGl0KCkgKi8KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpIHx8IGRlZmluZWQoRkVBVF9DT05fRElBTE9HKQorICAgIGludAkJY29uZmlybTsJCS8qIFRSVUUgdG8gaW52b2tlIHllcy9ubyBkaWFsb2cgKi8KKyMgZW5kaWYKKyAgICBpbnQJCWtlZXBtYXJrczsJCS8qIFRSVUUgd2hlbiAiOmtlZXBtYXJrcyIgd2FzIHVzZWQgKi8KKyAgICBpbnQJCWtlZXBqdW1wczsJCS8qIFRSVUUgd2hlbiAiOmtlZXBqdW1wcyIgd2FzIHVzZWQgKi8KKyAgICBpbnQJCWxvY2ttYXJrczsJCS8qIFRSVUUgd2hlbiAiOmxvY2ttYXJrcyIgd2FzIHVzZWQgKi8KK30gY21kbW9kX1Q7CisKKy8qCisgKiBTaW1wbGlzdGljIGhhc2hpbmcgc2NoZW1lIHRvIHF1aWNrbHkgbG9jYXRlIHRoZSBibG9ja3MgaW4gdGhlIHVzZWQgbGlzdC4KKyAqIDY0IGJsb2NrcyBhcmUgZm91bmQgZGlyZWN0bHkgKDY0ICogNEsgPSAyNTZLLCBtb3N0IGZpbGVzIGFyZSBzbWFsbGVyKS4KKyAqLworI2RlZmluZSBNRU1IQVNIU0laRQk2NAorI2RlZmluZSBNRU1IQVNIKG5yKQkoKG5yKSAmIChNRU1IQVNIU0laRSAtIDEpKQorCitzdHJ1Y3QgbWVtZmlsZQoreworICAgIGNoYXJfdQkqbWZfZm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBmaWxlICovCisgICAgY2hhcl91CSptZl9mZm5hbWU7CQkvKiBpZGVtLCBmdWxsIHBhdGggKi8KKyAgICBpbnQJCW1mX2ZkOwkJCS8qIGZpbGUgZGVzY3JpcHRvciAqLworICAgIGJoZHJfVAkqbWZfZnJlZV9maXJzdDsJCS8qIGZpcnN0IGJsb2NrX2hkciBpbiBmcmVlIGxpc3QgKi8KKyAgICBiaGRyX1QJKm1mX3VzZWRfZmlyc3Q7CQkvKiBtcnUgYmxvY2tfaGRyIGluIHVzZWQgbGlzdCAqLworICAgIGJoZHJfVAkqbWZfdXNlZF9sYXN0OwkJLyogbHJ1IGJsb2NrX2hkciBpbiB1c2VkIGxpc3QgKi8KKyAgICB1bnNpZ25lZAltZl91c2VkX2NvdW50OwkJLyogbnVtYmVyIG9mIHBhZ2VzIGluIHVzZWQgbGlzdCAqLworICAgIHVuc2lnbmVkCW1mX3VzZWRfY291bnRfbWF4OwkvKiBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyBpbiBtZW1vcnkgKi8KKyAgICBiaGRyX1QJKm1mX2hhc2hbTUVNSEFTSFNJWkVdOwkvKiBhcnJheSBvZiBoYXNoIGxpc3RzICovCisgICAgTlJfVFJBTlMJKm1mX3RyYW5zW01FTUhBU0hTSVpFXTsJLyogYXJyYXkgb2YgdHJhbnMgbGlzdHMgKi8KKyAgICBibG9ja25yX1QJbWZfYmxvY2tucl9tYXg7CQkvKiBoaWdoZXN0IHBvc2l0aXZlIGJsb2NrIG51bWJlciArIDEqLworICAgIGJsb2NrbnJfVAltZl9ibG9ja25yX21pbjsJCS8qIGxvd2VzdCBuZWdhdGl2ZSBibG9jayBudW1iZXIgLSAxICovCisgICAgYmxvY2tucl9UCW1mX25lZ19jb3VudDsJCS8qIG51bWJlciBvZiBuZWdhdGl2ZSBibG9ja3MgbnVtYmVycyAqLworICAgIGJsb2NrbnJfVAltZl9pbmZpbGVfY291bnQ7CS8qIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZmlsZSAqLworICAgIHVuc2lnbmVkCW1mX3BhZ2Vfc2l6ZTsJCS8qIG51bWJlciBvZiBieXRlcyBpbiBhIHBhZ2UgKi8KKyAgICBpbnQJCW1mX2RpcnR5OwkJLyogVFJVRSBpZiB0aGVyZSBhcmUgZGlydHkgYmxvY2tzICovCit9OworCisvKgorICogdGhpbmdzIHVzZWQgaW4gbWVtbGluZS5jCisgKi8KKy8qCisgKiBXaGVuIHNlYXJjaGluZyBmb3IgYSBzcGVjaWZpYyBsaW5lLCB3ZSByZW1lbWJlciB3aGF0IGJsb2NrcyBpbiB0aGUgdHJlZQorICogYXJlIHRoZSBicmFuY2hlcyBsZWFkaW5nIHRvIHRoYXQgYmxvY2suIFRoaXMgaXMgc3RvcmVkIGluIG1sX3N0YWNrLiAgRWFjaAorICogZW50cnkgaXMgYSBwb2ludGVyIHRvIGluZm8gaW4gYSBibG9jayAobWF5IGJlIGRhdGEgYmxvY2sgb3IgcG9pbnRlciBibG9jaykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW5mb19wb2ludGVyCit7CisgICAgYmxvY2tucl9UCWlwX2JudW07CS8qIGJsb2NrIG51bWJlciAqLworICAgIGxpbmVucl9UCWlwX2xvdzsJCS8qIGxvd2VzdCBsbnVtIGluIHRoaXMgYmxvY2sgKi8KKyAgICBsaW5lbnJfVAlpcF9oaWdoOwkvKiBoaWdoZXN0IGxudW0gaW4gdGhpcyBibG9jayAqLworICAgIGludAkJaXBfaW5kZXg7CS8qIGluZGV4IGZvciBibG9jayB3aXRoIGN1cnJlbnQgbG51bSAqLworfSBpbmZvcHRyX1Q7CS8qIGJsb2NrL2luZGV4IHBhaXIgKi8KKworI2lmZGVmIEZFQVRfQllURU9GRgordHlwZWRlZiBzdHJ1Y3QgbWxfY2h1bmtzaXplCit7CisgICAgaW50CQltbGNzX251bWxpbmVzOworICAgIGxvbmcJbWxjc190b3RhbHNpemU7Cit9IGNodW5rc2l6ZV9UOworCisgLyogRmxhZ3Mgd2hlbiBjYWxsaW5nIG1sX3VwZGF0ZWNodW5rKCkgKi8KKworI2RlZmluZSBNTF9DSE5LX0FERExJTkUgMQorI2RlZmluZSBNTF9DSE5LX0RFTExJTkUgMgorI2RlZmluZSBNTF9DSE5LX1VQRExJTkUgMworI2VuZGlmCisKKy8qCisgKiB0aGUgbWVtbGluZSBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIG1lbWxpbmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVtbGluZQoreworICAgIGxpbmVucl9UCW1sX2xpbmVfY291bnQ7CS8qIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgYnVmZmVyICovCisKKyAgICBtZW1maWxlX1QJKm1sX21mcDsJLyogcG9pbnRlciB0byBhc3NvY2lhdGVkIG1lbWZpbGUgKi8KKworI2RlZmluZSBNTF9FTVBUWQkxCS8qIGVtcHR5IGJ1ZmZlciAqLworI2RlZmluZSBNTF9MSU5FX0RJUlRZCTIJLyogY2FjaGVkIGxpbmUgd2FzIGNoYW5nZWQgYW5kIGFsbG9jYXRlZCAqLworI2RlZmluZSBNTF9MT0NLRURfRElSVFkJNAkvKiBtbF9sb2NrZWQgd2FzIGNoYW5nZWQgKi8KKyNkZWZpbmUgTUxfTE9DS0VEX1BPUwk4CS8qIG1sX2xvY2tlZCBuZWVkcyBwb3NpdGl2ZSBibG9jayBudW1iZXIgKi8KKyAgICBpbnQJCW1sX2ZsYWdzOworCisgICAgaW5mb3B0cl9UCSptbF9zdGFjazsJLyogc3RhY2sgb2YgcG9pbnRlciBibG9ja3MgKGFycmF5IG9mIElQVFJzKSAqLworICAgIGludAkJbWxfc3RhY2tfdG9wOwkvKiBjdXJyZW50IHRvcCBpZiBtbF9zdGFjayAqLworICAgIGludAkJbWxfc3RhY2tfc2l6ZTsJLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gbWxfc3RhY2sgKi8KKworICAgIGxpbmVucl9UCW1sX2xpbmVfbG51bTsJLyogbGluZSBudW1iZXIgb2YgY2FjaGVkIGxpbmUsIDAgaWYgbm90IHZhbGlkICovCisgICAgY2hhcl91CSptbF9saW5lX3B0cjsJLyogcG9pbnRlciB0byBjYWNoZWQgbGluZSAqLworCisgICAgYmhkcl9UCSptbF9sb2NrZWQ7CS8qIGJsb2NrIHVzZWQgYnkgbGFzdCBtbF9nZXQgKi8KKyAgICBsaW5lbnJfVAltbF9sb2NrZWRfbG93OwkvKiBmaXJzdCBsaW5lIGluIG1sX2xvY2tlZCAqLworICAgIGxpbmVucl9UCW1sX2xvY2tlZF9oaWdoOwkvKiBsYXN0IGxpbmUgaW4gbWxfbG9ja2VkICovCisgICAgaW50CQltbF9sb2NrZWRfbGluZWFkZDsgIC8qIG51bWJlciBvZiBsaW5lcyBpbnNlcnRlZCBpbiBtbF9sb2NrZWQgKi8KKyNpZmRlZiBGRUFUX0JZVEVPRkYKKyAgICBjaHVua3NpemVfVCAqbWxfY2h1bmtzaXplOworICAgIGludAkJbWxfbnVtY2h1bmtzOworICAgIGludAkJbWxfdXNlZGNodW5rczsKKyNlbmRpZgorfSBtZW1saW5lX1Q7CisKKyNpZiBkZWZpbmVkKEZFQVRfU0lHTlMpIHx8IGRlZmluZWQoUFJPVE8pCit0eXBlZGVmIHN0cnVjdCBzaWdubGlzdCBzaWdubGlzdF9UOworCitzdHJ1Y3Qgc2lnbmxpc3QKK3sKKyAgICBpbnQJCWlkOwkJLyogdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggcGxhY2VkIHNpZ24gKi8KKyAgICBsaW5lbnJfVAlsbnVtOwkJLyogbGluZSBudW1iZXIgd2hpY2ggaGFzIHRoaXMgc2lnbiAqLworICAgIGludAkJdHlwZW5yOwkJLyogdHlwZW5yIG9mIHNpZ24gKi8KKyAgICBzaWdubGlzdF9UCSpuZXh0OwkJLyogbmV4dCBzaWdubGlzdCBlbnRyeSAqLworIyBpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBzaWdubGlzdF9UICAqcHJldjsJCS8qIHByZXZpb3VzIGVudHJ5IC0tIGZvciBlYXN5IHJlb3JkZXJpbmcgKi8KKyMgZW5kaWYKK307CisKKy8qIHR5cGUgYXJndW1lbnQgZm9yIGJ1Zl9nZXRzaWdudHlwZSgpICovCisjZGVmaW5lIFNJR05fQU5ZCTAKKyNkZWZpbmUgU0lHTl9MSU5FSEwJMQorI2RlZmluZSBTSUdOX0lDT04JMgorI2RlZmluZSBTSUdOX1RFWFQJMworI2VuZGlmCisKKy8qCisgKiBBcmd1bWVudCBsaXN0OiBBcnJheSBvZiBmaWxlIG5hbWVzLgorICogVXNlZCBmb3IgdGhlIGdsb2JhbCBhcmd1bWVudCBsaXN0IGFuZCB0aGUgYXJndW1lbnQgbGlzdHMgbG9jYWwgdG8gYSB3aW5kb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFyZ2xpc3QKK3sKKyAgICBnYXJyYXlfVAlhbF9nYTsJCS8qIGdyb3dhcnJheSB3aXRoIHRoZSBhcnJheSBvZiBmaWxlIG5hbWVzICovCisgICAgaW50CQlhbF9yZWZjb3VudDsJLyogbnVtYmVyIG9mIHdpbmRvd3MgdXNpbmcgdGhpcyBhcmdsaXN0ICovCit9IGFsaXN0X1Q7CisKKy8qCisgKiBGb3IgZWFjaCBhcmd1bWVudCByZW1lbWJlciB0aGUgZmlsZSBuYW1lIGFzIGl0IHdhcyBnaXZlbiwgYW5kIHRoZSBidWZmZXIKKyAqIG51bWJlciB0aGF0IGNvbnRhaW5zIHRoZSBleHBhbmRlZCBmaWxlIG5hbWUgKHJlcXVpcmVkIGZvciB3aGVuICI6Y2QiIGlzCisgKiB1c2VkLgorICovCit0eXBlZGVmIHN0cnVjdCBhcmdlbnRyeQoreworICAgIGNoYXJfdQkqYWVfZm5hbWU7CS8qIGZpbGUgbmFtZSBhcyBzcGVjaWZpZWQgKi8KKyAgICBpbnQJCWFlX2ZudW07CS8qIGJ1ZmZlciBudW1iZXIgd2l0aCBleHBhbmRlZCBmaWxlIG5hbWUgKi8KK30gYWVudHJ5X1Q7CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyMgZGVmaW5lIEFMSVNUKHdpbikgKHdpbiktPndfYWxpc3QKKyNlbHNlCisjIGRlZmluZSBBTElTVCh3aW4pICgmZ2xvYmFsX2FsaXN0KQorI2VuZGlmCisjZGVmaW5lIEdBUkdMSVNUCSgoYWVudHJ5X1QgKilnbG9iYWxfYWxpc3QuYWxfZ2EuZ2FfZGF0YSkKKyNkZWZpbmUgQVJHTElTVAkJKChhZW50cnlfVCAqKUFMSVNUKGN1cndpbiktPmFsX2dhLmdhX2RhdGEpCisjZGVmaW5lIFdBUkdMSVNUKHdwKQkoKGFlbnRyeV9UICopQUxJU1Qod3ApLT5hbF9nYS5nYV9kYXRhKQorI2RlZmluZSBBQVJHTElTVChhbCkJKChhZW50cnlfVCAqKSgoYWwpLT5hbF9nYS5nYV9kYXRhKSkKKyNkZWZpbmUgR0FSR0NPVU5UCShnbG9iYWxfYWxpc3QuYWxfZ2EuZ2FfbGVuKQorI2RlZmluZSBBUkdDT1VOVAkoQUxJU1QoY3Vyd2luKS0+YWxfZ2EuZ2FfbGVuKQorI2RlZmluZSBXQVJHQ09VTlQod3ApCShBTElTVCh3cCktPmFsX2dhLmdhX2xlbikKKworLyoKKyAqIEEgbGlzdCB1c2VkIGZvciBzYXZpbmcgdmFsdWVzIG9mICJlbXNnX3NpbGVudCIuICBVc2VkIGJ5IGV4X3RyeSgpIHRvIHNhdmUgdGhlCisgKiB2YWx1ZSBvZiAiZW1zZ19zaWxlbnQiIGlmIGl0IHdhcyBub24temVyby4gIFdoZW4gdGhpcyBpcyBkb25lLCB0aGUgQ1NGX1NJTEVOVAorICogZmxhZyBiZWxvdyBpcyBzZXQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZXNsaXN0X2VsZW0gZXNsaXN0X1Q7CitzdHJ1Y3QgZXNsaXN0X2VsZW0KK3sKKyAgICBpbnQJCXNhdmVkX2Vtc2dfc2lsZW50OwkvKiBzYXZlZCB2YWx1ZSBvZiAiZW1zZ19zaWxlbnQiICovCisgICAgZXNsaXN0X1QJKm5leHQ7CQkJLyogbmV4dCBlbGVtZW50IG9uIHRoZSBsaXN0ICovCit9OworCisvKgorICogRm9yIGNvbmRpdGlvbmFsIGNvbW1hbmRzIGEgc3RhY2sgaXMga2VwdCBvZiBuZXN0ZWQgY29uZGl0aW9uYWxzLgorICogV2hlbiBjc19pZHggPCAwLCB0aGVyZSBpcyBubyBjb25kaXRpb25hbCBjb21tYW5kLgorICovCisjZGVmaW5lIENTVEFDS19MRU4JNTAKKworc3RydWN0IGNvbmRzdGFjaworeworICAgIGNoYXIJY3NfZmxhZ3NbQ1NUQUNLX0xFTl07CS8qIENTRl8gZmxhZ3MgKi8KKyAgICBjaGFyCWNzX3BlbmRpbmdbQ1NUQUNLX0xFTl07CS8qIENTVFBfOiB3aGF0J3MgcGVuZGluZyBpbiAiOmZpbmFsbHkiKi8KKyAgICB1bmlvbiB7CisJdm9pZCAgICpjc19wZW5kX3J2W0NTVEFDS19MRU5dOwkvKiByZXR1cm52YWwgZm9yIHBlbmRpbmcgcmV0dXJuICovCisJdm9pZCAgICpjc19wZW5kX2V4W0NTVEFDS19MRU5dOwkvKiBleGNlcHRpb24gZm9yIHBlbmRpbmcgdGhyb3cgKi8KKyAgICB9CQljc19wZW5kOworICAgIGludAkJY3NfbGluZVtDU1RBQ0tfTEVOXTsJLyogbGluZSBudW1iZXIgb2YgIjp3aGlsZSIgbGluZSAqLworICAgIGludAkJY3NfaWR4OwkJCS8qIGN1cnJlbnQgZW50cnksIG9yIC0xIGlmIG5vbmUgKi8KKyAgICBpbnQJCWNzX3doaWxlbGV2ZWw7CQkvKiBudW1iZXIgb2YgbmVzdGVkICI6d2hpbGUicyAqLworICAgIGludAkJY3NfdHJ5bGV2ZWw7CQkvKiBudW1iZXIgb2YgbmVzdGVkICI6dHJ5InMgKi8KKyAgICBlc2xpc3RfVAkqY3NfZW1zZ19zaWxlbnRfbGlzdDsJLyogc2F2ZWQgdmFsdWVzIG9mICJlbXNnX3NpbGVudCIgKi8KKyAgICBjaGFyCWNzX2hhZF93aGlsZTsJCS8qIGp1c3QgZm91bmQgIjp3aGlsZSIgKi8KKyAgICBjaGFyCWNzX2hhZF9jb250aW51ZTsJLyoganVzdCBmb3VuZCAiOmNvbnRpbnVlIiAqLworICAgIGNoYXIJY3NfaGFkX2VuZHdoaWxlOwkvKiBqdXN0IGZvdW5kICI6ZW5kd2hpbGUiICovCisgICAgY2hhcgljc19oYWRfZmluYWxseTsJCS8qIGp1c3QgZm91bmQgIjpmaW5hbGx5IiAqLworfTsKKyMgZGVmaW5lIGNzX3JldHZhcgljc19wZW5kLmNzX3BlbmRfcnYKKyMgZGVmaW5lIGNzX2V4Y2VwdGlvbgljc19wZW5kLmNzX3BlbmRfZXgKKworIyBkZWZpbmUgQ1NGX1RSVUUJMQkvKiBjb25kaXRpb24gd2FzIFRSVUUgKi8KKyMgZGVmaW5lIENTRl9BQ1RJVkUJMgkvKiBjdXJyZW50IHN0YXRlIGlzIGFjdGl2ZSAqLworIyBkZWZpbmUgQ1NGX0VMU0UJNAkvKiAiOmVsc2UiIGhhcyBiZWVuIHBhc3NlZCAqLworIyBkZWZpbmUgQ1NGX1dISUxFCTgJLyogaXMgYSAiOndoaWxlIiAqLworIyBkZWZpbmUgQ1NGX1RSWQkxNgkvKiBpcyBhICI6dHJ5IiAqLworIyBkZWZpbmUgQ1NGX0ZJTkFMTFkJMzIJLyogIjpmaW5hbGx5IiBoYXMgYmVlbiBwYXNzZWQgKi8KKyMgZGVmaW5lIENTRl9USFJPV04JNjQJLyogZXhjZXB0aW9uIHRocm93biB0byB0aGlzIHRyeSBjb25kaXRpb25hbCAqLworIyBkZWZpbmUgQ1NGX0NBVUdIVAkxMjgJLyogZXhjZXB0aW9uIGNhdWdodCBieSB0aGlzIHRyeSBjb25kaXRpb25hbCAqLworIyBkZWZpbmUgQ1NGX1NJTEVOVAk0CS8qICJlbXNnX3NpbGVudCIgcmVzZXQgYnkgIjp0cnkiICovCisvKiBOb3RlIHRoYXQgQ1NGX0VMU0UgaXMgb25seSB1c2VkIHdoZW4gQ1NGX1RSWSBhbmQgQ1NGX1dISUxFIGFyZSB1bnNldAorICogKGFuICI6aWYiKSwgYW5kIENTRl9TSUxFTlQgaXMgb25seSB1c2VkIHdoZW4gQ1NGX1RSWSBpcyBzZXQuICovCisKKy8qCisgKiBXaGF0J3MgcGVuZGluZyBmb3IgYmVpbmcgcmVhY3RpdmF0ZWQgYXQgdGhlICI6ZW5kdHJ5IiBvZiB0aGlzIHRyeQorICogY29uZGl0aW9uYWw6CisgKi8KKyMgZGVmaW5lIENTVFBfTk9ORQkwCS8qIG5vdGhpbmcgcGVuZGluZyBpbiAiOmZpbmFsbHkiIGNsYXVzZSAqLworIyBkZWZpbmUgQ1NUUF9FUlJPUgkxCS8qIGFuIGVycm9yIGlzIHBlbmRpbmcgKi8KKyMgZGVmaW5lIENTVFBfSU5URVJSVVBUCTIJLyogYW4gaW50ZXJydXB0IGlzIHBlbmRpbmcgKi8KKyMgZGVmaW5lIENTVFBfVEhST1cJNAkvKiBhIHRocm93IGlzIHBlbmRpbmcgKi8KKyMgZGVmaW5lIENTVFBfQlJFQUsJOAkvKiAiOmJyZWFrIiBpcyBwZW5kaW5nICovCisjIGRlZmluZSBDU1RQX0NPTlRJTlVFCTE2CS8qICI6Y29udGludWUiIGlzIHBlbmRpbmcgKi8KKyMgZGVmaW5lIENTVFBfUkVUVVJOCTI0CS8qICI6cmV0dXJuIiBpcyBwZW5kaW5nICovCisjIGRlZmluZSBDU1RQX0ZJTklTSAkzMgkvKiAiOmZpbmlzaCIgaXMgcGVuZGluZyAqLworCisvKgorICogQSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhbiBleGNlcHRpb24uICAidGhyb3dfbXNnIgorICogaXMgb25seSBzZXQgaW4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QuICBVc3VhbGx5LCBpdCBwb2ludHMgdG8gdGhlCisgKiBvcmlnaW5hbCBtZXNzYWdlIHN0b3JlZCBpbiB0aGF0IGVsZW1lbnQsIGJ1dCBzb21ldGltZXMgaXQgcG9pbnRzIHRvIGEgbGF0ZXIKKyAqIG1lc3NhZ2UgaW4gdGhlIGxpc3QuICBTZWUgY2F1c2VfZXJydGhyb3coKSBiZWxvdy4KKyAqLworc3RydWN0IG1zZ2xpc3QKK3sKKyAgICBjaGFyX3UJCSptc2c7CQkvKiBvcmlnaW5hbCBtZXNzYWdlICovCisgICAgY2hhcl91CQkqdGhyb3dfbXNnOwkvKiBtc2cgdG8gdGhyb3c6IHVzdWFsbHkgb3JpZ2luYWwgb25lICovCisgICAgc3RydWN0IG1zZ2xpc3QJKm5leHQ7CQkvKiBuZXh0IG9mIHNldmVyYWwgbWVzc2FnZXMgaW4gYSByb3cgKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBleGNlcHRpb24uCisgKiAoZG9uJ3QgdXNlICJzdHJ1Y3QgZXhjZXB0aW9uIiwgaXQncyB1c2VkIGJ5IHRoZSBtYXRoIGxpYnJhcnkpLgorICovCit0eXBlZGVmIHN0cnVjdCB2aW1fZXhjZXB0aW9uIGV4Y2VwdF9UOworc3RydWN0IHZpbV9leGNlcHRpb24KK3sKKyAgICBpbnQJCQl0eXBlOwkJLyogZXhjZXB0aW9uIHR5cGUgKi8KKyAgICBjaGFyX3UJCSp2YWx1ZTsJCS8qIGV4Y2VwdGlvbiB2YWx1ZSAqLworICAgIHN0cnVjdCBtc2dsaXN0CSptZXNzYWdlczsJLyogbWVzc2FnZShzKSBjYXVzaW5nIGVycm9yIGV4Y2VwdGlvbiAqLworICAgIGNoYXJfdQkJKnRocm93X25hbWU7CS8qIG5hbWUgb2YgdGhlIHRocm93IHBvaW50ICovCisgICAgbGluZW5yX1QJCXRocm93X2xudW07CS8qIGxpbmUgbnVtYmVyIG9mIHRoZSB0aHJvdyBwb2ludCAqLworICAgIGV4Y2VwdF9UCQkqY2F1Z2h0OwkvKiBuZXh0IGV4Y2VwdGlvbiBvbiB0aGUgY2F1Z2h0IHN0YWNrICovCit9OworCisvKgorICogVGhlIGV4Y2VwdGlvbiB0eXBlcy4KKyAqLworI2RlZmluZSBFVF9VU0VSCQkwCS8qIGV4Y2VwdGlvbiBjYXVzZWQgYnkgIjp0aHJvdyIgY29tbWFuZCAqLworI2RlZmluZSBFVF9FUlJPUgkxCS8qIGVycm9yIGV4Y2VwdGlvbiAqLworI2RlZmluZSBFVF9JTlRFUlJVUFQJMgkvKiBpbnRlcnJ1cHQgZXhjZXB0aW9uIHRyaWdnZXJlZCBieSBDdHJsLUMgKi8KKworCisjaWZkZWYgRkVBVF9TWU5fSEwKKy8qIHN0cnVjdCBwYXNzZWQgdG8gaW5faWRfbGlzdCgpICovCitzdHJ1Y3Qgc3Bfc3luCit7CisgICAgaW50CQlpbmNfdGFnOwkvKiAiOnN5biBpbmNsdWRlIiB1bmlxdWUgdGFnICovCisgICAgc2hvcnQJaWQ7CQkvKiBoaWdobGlnaHQgZ3JvdXAgSUQgb2YgaXRlbSAqLworICAgIHNob3J0CSpjb250X2luX2xpc3Q7CS8qIGNvbnQuaW4gZ3JvdXAgSURzLCBpZiBub24temVybyAqLworfTsKKworLyoKKyAqIEVhY2gga2V5d29yZCBoYXMgb25lIGtleWVudHJ5LCB3aGljaCBpcyBsaW5rZWQgaW4gYSBoYXNoIGxpc3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IGtleWVudHJ5IGtleWVudHJ5X1Q7CisKK3N0cnVjdCBrZXllbnRyeQoreworICAgIGtleWVudHJ5X1QJKm5leHQ7CQkvKiBuZXh0IGtleXdvcmQgaW4gdGhlIGhhc2ggbGlzdCAqLworICAgIHN0cnVjdCBzcF9zeW4ga19zeW47CS8qIHN0cnVjdCBwYXNzZWQgdG8gaW5faWRfbGlzdCgpICovCisgICAgc2hvcnQJKm5leHRfbGlzdDsJLyogSUQgbGlzdCBmb3IgbmV4dCBtYXRjaCAoaWYgbm9uLXplcm8pICovCisgICAgc2hvcnQJZmxhZ3M7CQkvKiBzZWUgc3ludGF4LmMgKi8KKyAgICBjaGFyX3UJa2V5d29yZFsxXTsJLyogYWN0dWFsbHkgbG9uZ2VyICovCit9OworCisvKgorICogU3RydWN0IHVzZWQgdG8gc3RvcmUgb25lIHN0YXRlIG9mIHRoZSBzdGF0ZSBzdGFjay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYnVmX3N0YXRlCit7CisgICAgaW50CQkgICAgYnNfaWR4OwkgLyogaW5kZXggb2YgcGF0dGVybiAqLworICAgIGxvbmcJICAgIGJzX2ZsYWdzOwkgLyogZmxhZ3MgZm9yIHBhdHRlcm4gKi8KKyAgICByZWdfZXh0bWF0Y2hfVCAqYnNfZXh0bWF0Y2g7IC8qIGV4dGVybmFsIG1hdGNoZXMgZnJvbSBzdGFydCBwYXR0ZXJuICovCit9IGJ1ZnN0YXRlX1Q7CisKKy8qCisgKiBzeW5fc3RhdGUgY29udGFpbnMgdGhlIHN5bnRheCBzdGF0ZSBzdGFjayBmb3IgdGhlIHN0YXJ0IG9mIG9uZSBsaW5lLgorICogVXNlZCBieSBiX3NzdF9hcnJheVtdLgorICovCit0eXBlZGVmIHN0cnVjdCBzeW5fc3RhdGUgc3luc3RhdGVfVDsKKworc3RydWN0IHN5bl9zdGF0ZQoreworICAgIHN5bnN0YXRlX1QJKnNzdF9uZXh0OwkvKiBuZXh0IGVudHJ5IGluIHVzZWQgb3IgZnJlZSBsaXN0ICovCisgICAgbGluZW5yX1QJc3N0X2xudW07CS8qIGxpbmUgbnVtYmVyIGZvciB0aGlzIHN0YXRlICovCisgICAgdW5pb24KKyAgICB7CisJYnVmc3RhdGVfVAlzc3Rfc3RhY2tbU1NUX0ZJWF9TVEFURVNdOyAvKiBzaG9ydCBzdGF0ZSBzdGFjayAqLworCWdhcnJheV9UCXNzdF9nYTsJLyogZ3Jvd2FycmF5IGZvciBsb25nIHN0YXRlIHN0YWNrICovCisgICAgfSBzc3RfdW5pb247CisgICAgaW50CQlzc3RfbmV4dF9mbGFnczsJLyogZmxhZ3MgZm9yIHNzdF9uZXh0X2xpc3QgKi8KKyAgICBzaG9ydAkqc3N0X25leHRfbGlzdDsJLyogIm5leHRncm91cCIgbGlzdCBpbiB0aGlzIHN0YXRlCisJCQkJICogKHRoaXMgaXMgYSBjb3B5LCBkb24ndCBmcmVlIGl0ISAqLworICAgIHNob3J0CXNzdF9zdGFja3NpemU7CS8qIG51bWJlciBvZiBzdGF0ZXMgb24gdGhlIHN0YWNrICovCisgICAgZGlzcHRpY2tfVAlzc3RfdGljazsJLyogdGljayB3aGVuIGxhc3QgZGlzcGxheWVkICovCisgICAgbGluZW5yX1QJc3N0X2NoYW5nZV9sbnVtOy8qIHdoZW4gbm9uLXplcm8sIGNoYW5nZSBpbiB0aGlzIGxpbmUKKwkJCQkgKiBtYXkgaGF2ZSBtYWRlIHRoZSBzdGF0ZSBpbnZhbGlkICovCit9OworI2VuZGlmIC8qIEZFQVRfU1lOX0hMICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgc2hhcmVkIGJldHdlZW4gc3ludGF4LmMsIHNjcmVlbi5jIGFuZCBndWlfeDExLmMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJfZW50cnkKK3sKKyAgICBzaG9ydAkgICAgYWVfYXR0cjsJCS8qIEhMX0JPTEQsIGV0Yy4gKi8KKyAgICB1bmlvbgorICAgIHsKKwlzdHJ1Y3QKKwl7CisJICAgIGNoYXJfdQkgICAgKnN0YXJ0OwkvKiBzdGFydCBlc2NhcGUgc2VxdWVuY2UgKi8KKwkgICAgY2hhcl91CSAgICAqc3RvcDsJLyogc3RvcCBlc2NhcGUgc2VxdWVuY2UgKi8KKwl9IHRlcm07CisJc3RydWN0CisJeworCSAgICBjaGFyX3UJICAgIGZnX2NvbG9yOwkvKiBmb3JlZ3JvdW5kIGNvbG9yIG51bWJlciAqLworCSAgICBjaGFyX3UJICAgIGJnX2NvbG9yOwkvKiBiYWNrZ3JvdW5kIGNvbG9yIG51bWJlciAqLworCX0gY3Rlcm07CisjIGlmZGVmIEZFQVRfR1VJCisJc3RydWN0CisJeworCSAgICBndWljb2xvcl9UCSAgICBmZ19jb2xvcjsJLyogZm9yZWdyb3VuZCBjb2xvciBoYW5kbGUgKi8KKwkgICAgZ3VpY29sb3JfVAkgICAgYmdfY29sb3I7CS8qIGJhY2tncm91bmQgY29sb3IgaGFuZGxlICovCisJICAgIEd1aUZvbnQJICAgIGZvbnQ7CS8qIGZvbnQgaGFuZGxlICovCisjICBpZmRlZiBGRUFUX1hGT05UU0VUCisJICAgIEd1aUZvbnRzZXQJICAgIGZvbnRzZXQ7CS8qIGZvbnRzZXQgaGFuZGxlICovCisjICBlbmRpZgorCX0gZ3VpOworIyBlbmRpZgorICAgIH0gYWVfdTsKK30gYXR0cmVudHJ5X1Q7CisKKyNpZmRlZiBVU0VfSUNPTlYKKyMgaWZkZWYgSEFWRV9JQ09OVl9ICisjICBpbmNsdWRlIDxpY29udi5oPgorIyBlbHNlCisjICBpZiBkZWZpbmVkKE1BQ09TX1gpCisjICAgaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjICAgZGVmaW5lIEVJTFNFUSBFTk9FTlQgLyogTWFjT1MgWCBkb2VzIG5vdCBoYXZlIEVJTFNFUSAqLwordHlwZWRlZiBzdHJ1Y3QgX2ljb252X3QgKmljb252X3Q7CisjICBlbHNlCisjICAgaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQordHlwZWRlZiBzdHJ1Y3QgX2ljb252X3QgKmljb252X3Q7CisjICAgIGRlZmluZSBFSU5WQUwJMjIKKyMgICAgZGVmaW5lIEUyQklHCTcKKyMgICAgZGVmaW5lIEVOT0VOVAkyCisjICAgIGRlZmluZSBFRkFVTFQJMTQKKyMgICAgZGVmaW5lIEVJTFNFUQkxMjMKKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgZW5kaWYKKyMgIGVuZGlmCit0eXBlZGVmIHZvaWQgKmljb252X3Q7CisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIFVzZWQgZm9yIHRoZSB0eXBlYWhlYWQgYnVmZmVyOiB0eXBlYnVmLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXJfdQkqdGJfYnVmOwkvKiBidWZmZXIgZm9yIHR5cGVkIGNoYXJhY3RlcnMgKi8KKyAgICBjaGFyX3UJKnRiX25vcmVtYXA7CS8qIG1hcHBpbmcgZmxhZ3MgZm9yIGNoYXJhY3RlcnMgaW4gdGJfYnVmW10gKi8KKyAgICBpbnQJCXRiX2J1ZmxlbjsJLyogc2l6ZSBvZiB0Yl9idWZbXSAqLworICAgIGludAkJdGJfb2ZmOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiB0Yl9idWZbXSAqLworICAgIGludAkJdGJfbGVuOwkJLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIHRiX2J1ZltdICovCisgICAgaW50CQl0Yl9tYXBsZW47CS8qIG5yIG9mIG1hcHBlZCBieXRlcyBpbiB0Yl9idWZbXSAqLworICAgIGludAkJdGJfc2lsZW50OwkvKiBuciBvZiBzaWxlbnRseSBtYXBwZWQgYnl0ZXMgaW4gdGJfYnVmW10gKi8KKyAgICBpbnQJCXRiX25vX2FiYnJfY250OyAvKiBuciBvZiBieXRlcyB3aXRob3V0IGFiYnJldi4gaW4gdGJfYnVmW10gKi8KKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQ7CS8qIG5yIG9mIHRpbWUgdGJfYnVmIHdhcyBjaGFuZ2VkOyBuZXZlciB6ZXJvICovCit9IHR5cGVidWZfVDsKKworLyogU3RydWN0IHRvIGhvbGQgdGhlIHNhdmVkIHR5cGVhaGVhZCBmb3Igc2F2ZV90eXBlYWhlYWQoKS4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdHlwZWJ1Zl9UCQlzYXZlX3R5cGVidWY7CisgICAgaW50CQkJdHlwZWJ1Zl92YWxpZDsJICAgIC8qIFRSVUUgd2hlbiBzYXZlX3R5cGVidWYgdmFsaWQgKi8KKyAgICBzdHJ1Y3QgYnVmZmhlYWRlcglzYXZlX3N0dWZmYnVmZjsKKyNpZmRlZiBVU0VfSU5QVVRfQlVGCisgICAgY2hhcl91CQkqc2F2ZV9pbnB1dGJ1ZjsKKyNlbmRpZgorfSB0YXNhdmVfVDsKKworLyoKKyAqIFVzZWQgZm9yIGNvbnZlcnNpb24gb2YgdGVybWluYWwgSS9PIGFuZCBzY3JpcHQgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQl2Y190eXBlOwkvKiB6ZXJvIG9yIG9uZSBvZiB0aGUgQ09OVl8gdmFsdWVzICovCisgICAgaW50CQl2Y19mYWN0b3I7CS8qIG1heC4gZXhwYW5zaW9uIGZhY3RvciAqLworIyBpZmRlZiBXSU4zMjY0CisgICAgaW50CQl2Y19jcGZyb207CS8qIGNvZGVwYWdlIHRvIGNvbnZlcnQgZnJvbSAoQ09OVl9DT0RFUEFHRSkgKi8KKyAgICBpbnQJCXZjX2NwdG87CS8qIGNvZGVwYWdlIHRvIGNvbnZlcnQgdG8gKENPTlZfQ09ERVBBR0UpICovCisjIGVuZGlmCisjIGlmZGVmIFVTRV9JQ09OVgorICAgIGljb252X3QJdmNfZmQ7CQkvKiBmb3IgQ09OVl9JQ09OViAqLworIyBlbmRpZgorICAgIGludAkJdmNfZmFpbDsJLyogZmFpbCBmb3IgaW52YWxpZCBjaGFyLCBkb24ndCB1c2UgJz8nICovCit9IHZpbWNvbnZfVDsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIGZvciByZWFkaW5nIGZyb20gdGhlIHZpbWluZm8gZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyX3UJKnZpcl9saW5lOwkvKiB0ZXh0IG9mIHRoZSBjdXJyZW50IGxpbmUgKi8KKyAgICBGSUxFCSp2aXJfZmQ7CS8qIGZpbGUgZGVzY3JpcHRvciAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1jb252X1QJdmlyX2NvbnY7CS8qIGVuY29kaW5nIGNvbnZlcnNpb24gKi8KKyNlbmRpZgorfSB2aXJfVDsKKworI2RlZmluZSBDT05WX05PTkUJCTAKKyNkZWZpbmUgQ09OVl9UT19VVEY4CQkxCisjZGVmaW5lIENPTlZfVE9fTEFUSU4xCQkyCisjZGVmaW5lIENPTlZfSUNPTlYJCTMKKyNpZmRlZiBXSU4zMjY0CisjIGRlZmluZSBDT05WX0NPREVQQUdFCQk0CS8qIGNvZGVwYWdlIC0+IGNvZGVwYWdlICovCisjZW5kaWYKKyNpZmRlZiBNQUNPU19YCisjIGRlZmluZSBDT05WX01BQ19MQVRJTjEJNQorIyBkZWZpbmUgQ09OVl9MQVRJTjFfTUFDCTYKKyMgZGVmaW5lIENPTlZfTUFDX1VURjgJCTcKKyMgZGVmaW5lIENPTlZfVVRGOF9NQUMJCTgKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIHVzZWQgZm9yIG1hcHBpbmdzIGFuZCBhYmJyZXZpYXRpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCBtYXBibG9jayBtYXBibG9ja19UOworc3RydWN0IG1hcGJsb2NrCit7CisgICAgbWFwYmxvY2tfVAkqbV9uZXh0OwkvKiBuZXh0IG1hcGJsb2NrIGluIGxpc3QgKi8KKyAgICBjaGFyX3UJKm1fa2V5czsJLyogbWFwcGVkIGZyb20gKi8KKyAgICBpbnQJCW1fa2V5bGVuOwkvKiBzdHJsZW4obV9rZXlzKSAqLworICAgIGNoYXJfdQkqbV9zdHI7CQkvKiBtYXBwZWQgdG8gKi8KKyAgICBpbnQJCW1fbW9kZTsJCS8qIHZhbGlkIG1vZGUgKi8KKyAgICBpbnQJCW1fbm9yZW1hcDsJLyogaWYgbm9uLXplcm8gbm8gcmUtbWFwcGluZyBmb3IgbV9zdHIgKi8KKyAgICBjaGFyCW1fc2lsZW50OwkvKiA8c2lsZW50PiB1c2VkLCBkb24ndCBlY2hvIGNvbW1hbmRzICovCisjaWYgMCAgLyogTm90IHVzZWQgeWV0ICovCisgICAgc2NpZF9UCW1fc2NyaXB0X0lEOwkvKiBJRCBvZiBzY3JpcHQgd2hlcmUgbWFwIHdhcyBkZWZpbmVkLAorCQkJCSAgIHVzZWQgZm9yIHM6IHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zICovCisjZW5kaWYKK307CisKKy8qCisgKiBVc2VkIGZvciBoaWdobGlnaHRpbmcgaW4gdGhlIHN0YXR1cyBsaW5lLgorICovCitzdHJ1Y3Qgc3RsX2hscmVjCit7CisgICAgY2hhcl91CSpzdGFydDsKKyAgICBpbnQJCXVzZXJobDsKK307CisKKy8qCisgKiBidWZmZXI6IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBmaWxlCisgKgorICogU2V2ZXJhbCB3aW5kb3dzIGNhbiBzaGFyZSBhIHNpbmdsZSBCdWZmZXIKKyAqIEEgYnVmZmVyIGlzIHVuYWxsb2NhdGVkIGlmIHRoZXJlIGlzIG5vIG1lbWZpbGUgZm9yIGl0LgorICogQSBidWZmZXIgaXMgbmV3IGlmIHRoZSBhc3NvY2lhdGVkIGZpbGUgaGFzIG5ldmVyIGJlZW4gbG9hZGVkIHlldC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBmaWxlX2J1ZmZlciBidWZfVDsKKworc3RydWN0IGZpbGVfYnVmZmVyCit7CisgICAgbWVtbGluZV9UCWJfbWw7CQkvKiBhc3NvY2lhdGVkIG1lbWxpbmUgKGFsc28gY29udGFpbnMgbGluZQorCQkJCSAgIGNvdW50KSAqLworCisgICAgYnVmX1QJKmJfbmV4dDsJLyogbGlua3MgaW4gbGlzdCBvZiBidWZmZXJzICovCisgICAgYnVmX1QJKmJfcHJldjsKKworICAgIGludAkJYl9ud2luZG93czsJLyogbnIgb2Ygd2luZG93cyBvcGVuIG9uIHRoaXMgYnVmZmVyICovCisKKyAgICBpbnQJCWJfZmxhZ3M7CS8qIHZhcmlvdXMgQkZfIGZsYWdzICovCisKKyAgICAvKgorICAgICAqIGJfZmZuYW1lIGhhcyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlIChOVUxMIGZvciBubyBuYW1lKS4KKyAgICAgKiBiX3NmbmFtZSBpcyB0aGUgbmFtZSBhcyB0aGUgdXNlciB0eXBlZCBpdCAob3IgTlVMTCkuCisgICAgICogYl9mbmFtZSBpcyB0aGUgc2FtZSBhcyBiX3NmbmFtZSwgdW5sZXNzICI6Y2QiIGhhcyBiZWVuIGRvbmUsCisgICAgICoJCXRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgYl9mZm5hbWUgKE5VTEwgZm9yIG5vIG5hbWUpLgorICAgICAqLworICAgIGNoYXJfdQkqYl9mZm5hbWU7CS8qIGZ1bGwgcGF0aCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmJfc2ZuYW1lOwkvKiBzaG9ydCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyX3UJKmJfZm5hbWU7CS8qIGN1cnJlbnQgZmlsZSBuYW1lICovCisKKyNpZmRlZiBVTklYCisgICAgaW50CQliX2RldjsJCS8qIGRldmljZSBudW1iZXIgKC0xIGlmIG5vdCBzZXQpICovCisgICAgaW5vX3QJYl9pbm87CQkvKiBpbm9kZSBudW1iZXIgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfQ1dfRURJVE9SCisgICAgRlNTcGVjCWJfRlNTcGVjOwkvKiBNYWNPUyBGaWxlIElkZW50aWZpY2F0aW9uICovCisjZW5kaWYKKyNpZmRlZiBWTVMKKyAgICBjaGFyCWJfZmFiX3JmbTsJLyogUmVjb3JkIGZvcm1hdCAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9TTklGRgorICAgIGludAkJYl9zbmlmZjsJLyogZmlsZSB3YXMgbG9hZGVkIHRocm91Z2ggU25pZmYgKi8KKyNlbmRpZgorCisgICAgaW50CQliX2ZudW07CQkvKiBidWZmZXIgbnVtYmVyIGZvciB0aGlzIGZpbGUuICovCisKKyAgICBpbnQJCWJfY2hhbmdlZDsJLyogJ21vZGlmaWVkJzogU2V0IHRvIFRSVUUgaWYgc29tZXRoaW5nIGluIHRoZQorCQkJCSAgIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBhbmQgbm90IHdyaXR0ZW4gb3V0LiAqLworICAgIGludAkJYl9jaGFuZ2VkdGljazsJLyogaW5jcmVtZW50ZWQgZm9yIGVhY2ggY2hhbmdlLCBhbHNvIGZvciB1bmRvICovCisKKyAgICBpbnQJCWJfc2F2aW5nOwkvKiBTZXQgdG8gVFJVRSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZgorCQkJCSAgIHNhdmluZyB0aGUgYnVmZmVyLiAqLworCisgICAgLyoKKyAgICAgKiBDaGFuZ2VzIHRvIGEgYnVmZmVyIHJlcXVpcmUgdXBkYXRpbmcgb2YgdGhlIGRpc3BsYXkuICBUbyBtaW5pbWl6ZSB0aGUKKyAgICAgKiB3b3JrLCByZW1lbWJlciBjaGFuZ2VzIG1hZGUgYW5kIHVwZGF0ZSBldmVyeXRoaW5nIGF0IG9uY2UuCisgICAgICovCisgICAgaW50CQliX21vZF9zZXQ7CS8qIFRSVUUgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdAorCQkJCSAgIHRpbWUgdGhlIGRpc3BsYXkgd2FzIHVwZGF0ZWQgKi8KKyAgICBsaW5lbnJfVAliX21vZF90b3A7CS8qIHRvcG1vc3QgbG51bSB0aGF0IHdhcyBjaGFuZ2VkICovCisgICAgbGluZW5yX1QJYl9tb2RfYm90OwkvKiBsbnVtIGJlbG93IGxhc3QgY2hhbmdlZCBsaW5lLCBBRlRFUiB0aGUKKwkJCQkgICBjaGFuZ2UgKi8KKyAgICBsb25nCWJfbW9kX3hsaW5lczsJLyogbnVtYmVyIG9mIGV4dHJhIGJ1ZmZlciBsaW5lcyBpbnNlcnRlZDsKKwkJCQkgICBuZWdhdGl2ZSB3aGVuIGxpbmVzIHdlcmUgZGVsZXRlZCAqLworCisgICAgd2luaW5mb19UCSpiX3dpbmluZm87CS8qIGxpc3Qgb2YgbGFzdCB1c2VkIGluZm8gZm9yIGVhY2ggd2luZG93ICovCisKKyAgICBsb25nCWJfbXRpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgb2Ygb3JpZ2luYWwgZmlsZSAqLworICAgIGxvbmcJYl9tdGltZV9yZWFkOwkvKiBsYXN0IGNoYW5nZSB0aW1lIHdoZW4gcmVhZGluZyAqLworICAgIHNpemVfdAliX29yaWdfc2l6ZTsJLyogc2l6ZSBvZiBvcmlnaW5hbCBmaWxlIGluIGJ5dGVzICovCisgICAgaW50CQliX29yaWdfbW9kZTsJLyogbW9kZSBvZiBvcmlnaW5hbCBmaWxlICovCisKKyAgICBwb3NfVAliX25hbWVkbVtOTUFSS1NdOyAvKiBjdXJyZW50IG5hbWVkIG1hcmtzIChtYXJrLmMpICovCisKKyNpZmRlZiBGRUFUX1ZJU1VBTAorICAgIC8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgc2V0IHdoZW4gVklzdWFsX2FjdGl2ZSBiZWNvbWVzIEZBTFNFICovCisgICAgcG9zX1QJYl92aXN1YWxfc3RhcnQ7CS8qIHN0YXJ0IHBvcyBvZiBsYXN0IFZJc3VhbCAqLworICAgIHBvc19UCWJfdmlzdWFsX2VuZDsJLyogZW5kIHBvc2l0aW9uIG9mIGxhc3QgVklzdWFsICovCisgICAgaW50CQliX3Zpc3VhbF9tb2RlOwkvKiBWSXN1YWxfbW9kZSBvZiBsYXN0IFZJc3VhbCAqLworIyBpZmRlZiBGRUFUX0VWQUwKKyAgICBpbnQJCWJfdmlzdWFsX21vZGVfZXZhbDsgIC8qIGJfdmlzdWFsX21vZGUgZm9yIHZpc3VhbG1vZGUoKSAqLworIyBlbmRpZgorICAgIGNvbG5yX1QJYl92aXN1YWxfY3Vyc3dhbnQ7ICAgLyogTUFYQ09MIGZyb20gd19jdXJzd2FudCAqLworI2VuZGlmCisKKyAgICBwb3NfVAliX2xhc3RfY3Vyc29yOwkvKiBjdXJzb3IgcG9zaXRpb24gd2hlbiBsYXN0IHVubG9hZGluZyB0aGlzCisJCQkJICAgYnVmZmVyICovCisgICAgcG9zX1QJYl9sYXN0X2luc2VydDsJLyogd2hlcmUgSW5zZXJ0IG1vZGUgd2FzIGxlZnQgKi8KKyAgICBwb3NfVAliX2xhc3RfY2hhbmdlOwkvKiBwb3NpdGlvbiBvZiBsYXN0IGNoYW5nZTogJy4gbWFyayAqLworCisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIC8qCisgICAgICogdGhlIGNoYW5nZWxpc3QgY29udGFpbnMgb2xkIGNoYW5nZSBwb3NpdGlvbnMKKyAgICAgKi8KKyAgICBwb3NfVAliX2NoYW5nZWxpc3RbSlVNUExJU1RTSVpFXTsKKyAgICBpbnQJCWJfY2hhbmdlbGlzdGxlbjsJLyogbnVtYmVyIG9mIGFjdGl2ZSBlbnRyaWVzICovCisgICAgaW50CQliX25ld19jaGFuZ2U7CQkvKiBzZXQgYnkgdV9zYXZlY29tbW9uKCkgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBDaGFyYWN0ZXIgdGFibGUsIG9ubHkgdXNlZCBpbiBjaGFyc2V0LmMgZm9yICdpc2tleXdvcmQnCisgICAgICogMzIgYnl0ZXMgb2YgOCBiaXRzOiAxIGJpdCBwZXIgY2hhcmFjdGVyIDAtMjU1LgorICAgICAqLworICAgIGNoYXJfdQliX2NoYXJ0YWJbMzJdOworCisjaWZkZWYgRkVBVF9MT0NBTE1BUAorICAgIC8qIFRhYmxlIHVzZWQgZm9yIG1hcHBpbmdzIGxvY2FsIHRvIGEgYnVmZmVyLiAqLworICAgIG1hcGJsb2NrX1QJKihiX21hcGhhc2hbMjU2XSk7CisKKyAgICAvKiBGaXJzdCBhYmJyZXZpYXRpb24gbG9jYWwgdG8gYSBidWZmZXIuICovCisgICAgbWFwYmxvY2tfVAkqYl9maXJzdF9hYmJyOworI2VuZGlmCisjaWZkZWYgRkVBVF9VU1JfQ01EUworICAgIC8qIFVzZXIgY29tbWFuZHMgbG9jYWwgdG8gdGhlIGJ1ZmZlci4gKi8KKyAgICBnYXJyYXlfVAliX3VjbWRzOworI2VuZGlmCisgICAgLyoKKyAgICAgKiBzdGFydCBhbmQgZW5kIG9mIGFuIG9wZXJhdG9yLCBhbHNvIHVzZWQgZm9yICdbIGFuZCAnXQorICAgICAqLworICAgIHBvc19UCWJfb3Bfc3RhcnQ7CisgICAgcG9zX1QJYl9vcF9lbmQ7CisKKyNpZmRlZiBGRUFUX1ZJTUlORk8KKyAgICBpbnQJCWJfbWFya3NfcmVhZDsJLyogSGF2ZSB3ZSByZWFkIHZpbWluZm8gbWFya3MgeWV0PyAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgb25seSB1c2VkIGluIHVuZG8uYy4KKyAgICAgKi8KKyAgICB1X2hlYWRlcl9UCSpiX3Vfb2xkaGVhZDsJLyogcG9pbnRlciB0byBvbGRlc3QgaGVhZGVyICovCisgICAgdV9oZWFkZXJfVAkqYl91X25ld2hlYWQ7CS8qIHBvaW50ZXIgdG8gbmV3ZXN0IGhlYWRlciAqLworICAgIHVfaGVhZGVyX1QJKmJfdV9jdXJoZWFkOwkvKiBwb2ludGVyIHRvIGN1cnJlbnQgaGVhZGVyICovCisgICAgaW50CQliX3VfbnVtaGVhZDsJLyogY3VycmVudCBudW1iZXIgb2YgaGVhZGVycyAqLworICAgIGludAkJYl91X3N5bmNlZDsJLyogZW50cnkgbGlzdHMgYXJlIHN5bmNlZCAqLworCisgICAgLyoKKyAgICAgKiB2YXJpYWJsZXMgZm9yICJVIiBjb21tYW5kIGluIHVuZG8uYworICAgICAqLworICAgIGNoYXJfdQkqYl91X2xpbmVfcHRyOwkvKiBzYXZlZCBsaW5lIGZvciAiVSIgY29tbWFuZCAqLworICAgIGxpbmVucl9UCWJfdV9saW5lX2xudW07CS8qIGxpbmUgbnVtYmVyIG9mIGxpbmUgaW4gdV9saW5lICovCisgICAgY29sbnJfVAliX3VfbGluZV9jb2xucjsJLyogb3B0aW9uYWwgY29sdW1uIG51bWJlciAqLworCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIG9ubHkgdXNlZCBpbiB1bmRvLmMKKyAgICAgKi8KKyAgICBtYmxvY2tfVAliX2Jsb2NrX2hlYWQ7CS8qIGhlYWQgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBsaXN0ICovCisgICAgbWluZm9fVAkqYl9tX3NlYXJjaDsJLyogcG9pbnRlciB0byBjaHVuayBiZWZvcmUgcHJldmlvdXNseQorCQkJCSAgIGFsbG9jYXRlZC9mcmVlZCBjaHVuayAqLworICAgIG1ibG9ja19UCSpiX21iX2N1cnJlbnQ7CS8qIGJsb2NrIHdoZXJlIG1fc2VhcmNoIHBvaW50cyBpbiAqLworI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIGludAkJYl9zY2FubmVkOwkvKiBeTi9eUCBoYXZlIHNjYW5uZWQgdGhpcyBidWZmZXIgKi8KKyNlbmRpZgorCisgICAgLyogZmxhZ3MgZm9yIHVzZSBvZiAiOmxtYXAiIGFuZCBJTSBjb250cm9sICovCisgICAgbG9uZwliX3BfaW1pbnNlcnQ7CS8qIGlucHV0IG1vZGUgZm9yIGluc2VydCAqLworICAgIGxvbmcJYl9wX2ltc2VhcmNoOwkvKiBpbnB1dCBtb2RlIGZvciBzZWFyY2ggKi8KKyNkZWZpbmUgQl9JTU9ERV9VU0VfSU5TRVJUIC0xCS8qCVVzZSBiX3BfaW1pbnNlcnQgdmFsdWUgZm9yIHNlYXJjaCAqLworI2RlZmluZSBCX0lNT0RFX05PTkUgMAkJLyoJSW5wdXQgdmlhIG5vbmUgKi8KKyNkZWZpbmUgQl9JTU9ERV9MTUFQIDEJCS8qCUlucHV0IHZpYSBsYW5nbWFwICovCisjaWZuZGVmIFVTRV9JTV9DT05UUk9MCisjIGRlZmluZSBCX0lNT0RFX0xBU1QgMQorI2Vsc2UKKyMgZGVmaW5lIEJfSU1PREVfSU0gMgkJLyoJSW5wdXQgdmlhIGlucHV0IG1ldGhvZCAqLworIyBkZWZpbmUgQl9JTU9ERV9MQVNUIDIKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9LRVlNQVAKKyAgICBzaG9ydAliX2ttYXBfc3RhdGU7CS8qIHVzaW5nICJsbWFwIiBtYXBwaW5ncyAqLworIyBkZWZpbmUgS0VZTUFQX0lOSVQJMQkvKiAna2V5bWFwJyB3YXMgc2V0LCBjYWxsIGtleW1hcF9pbml0KCkgKi8KKyMgZGVmaW5lIEtFWU1BUF9MT0FERUQJMgkvKiAna2V5bWFwJyBtYXBwaW5ncyBoYXZlIGJlZW4gbG9hZGVkICovCisgICAgZ2FycmF5X1QJYl9rbWFwX2dhOwkvKiB0aGUga2V5bWFwIHRhYmxlICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogT3B0aW9ucyBsb2NhbCB0byBhIGJ1ZmZlci4KKyAgICAgKiBUaGV5IGFyZSBoZXJlIGJlY2F1c2UgdGhlaXIgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBmaWxlCisgICAgICogb3IgY29udGVudHMgb2YgdGhlIGZpbGUgYmVpbmcgZWRpdGVkLgorICAgICAqLworICAgIGludAkJYl9wX2luaXRpYWxpemVkOwkvKiBzZXQgd2hlbiBvcHRpb25zIGluaXRpYWxpemVkICovCisKKyAgICBpbnQJCWJfcF9haTsJCS8qICdhdXRvaW5kZW50JyAqLworICAgIGludAkJYl9wX2FpX25vcGFzdGU7CS8qIGJfcF9haSBzYXZlZCBmb3IgcGFzdGUgbW9kZSAqLworICAgIGludAkJYl9wX2NpOwkJLyogJ2NvcHlpbmRlbnQnICovCisgICAgaW50CQliX3BfYmluOwkvKiAnYmluYXJ5JyAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBpbnQJCWJfcF9ib21iOwkvKiAnYm9tYicgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKyAgICBjaGFyX3UJKmJfcF9iaDsJLyogJ2J1ZmhpZGRlbicgKi8KKyAgICBjaGFyX3UJKmJfcF9idDsJLyogJ2J1ZnR5cGUnICovCisjZW5kaWYKKyAgICBpbnQJCWJfcF9ibDsJCS8qICdidWZsaXN0ZWQnICovCisjaWZkZWYgRkVBVF9DSU5ERU5UCisgICAgaW50CQliX3BfY2luOwkvKiAnY2luZGVudCcgKi8KKyAgICBjaGFyX3UJKmJfcF9jaW5vOwkvKiAnY2lub3B0aW9ucycgKi8KKyAgICBjaGFyX3UJKmJfcF9jaW5rOwkvKiAnY2lua2V5cycgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9DSU5ERU5UKSB8fCBkZWZpbmVkKEZFQVRfU01BUlRJTkRFTlQpCisgICAgY2hhcl91CSpiX3BfY2ludzsJLyogJ2NpbndvcmRzJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9DT01NRU5UUworICAgIGNoYXJfdQkqYl9wX2NvbTsJLyogJ2NvbW1lbnRzJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgY2hhcl91CSpiX3BfY21zOwkvKiAnY29tbWVudHN0cmluZycgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorICAgIGNoYXJfdQkqYl9wX2NwdDsJLyogJ2NvbXBsZXRlJyAqLworI2VuZGlmCisgICAgaW50CQliX3BfZW9sOwkvKiAnZW5kb2ZsaW5lJyAqLworICAgIGludAkJYl9wX2V0OwkJLyogJ2V4cGFuZHRhYicgKi8KKyAgICBpbnQJCWJfcF9ldF9ub2JpbjsJLyogYl9wX2V0IHNhdmVkIGZvciBiaW5hcnkgbW9kZSAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJKmJfcF9mZW5jOwkvKiAnZmlsZWVuY29kaW5nJyAqLworI2VuZGlmCisgICAgY2hhcl91CSpiX3BfZmY7CS8qICdmaWxlZm9ybWF0JyAqLworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGNoYXJfdQkqYl9wX2Z0OwkvKiAnZmlsZXR5cGUnICovCisjZW5kaWYKKyAgICBjaGFyX3UJKmJfcF9mbzsJLyogJ2Zvcm1hdG9wdGlvbnMnICovCisgICAgaW50CQliX3BfaW5mOwkvKiAnaW5mZXJjYXNlJyAqLworICAgIGNoYXJfdQkqYl9wX2lzazsJLyogJ2lza2V5d29yZCcgKi8KKyNpZmRlZiBGRUFUX0ZJTkRfSUQKKyAgICBjaGFyX3UJKmJfcF9kZWY7CS8qICdkZWZpbmUnIGxvY2FsIHZhbHVlICovCisgICAgY2hhcl91CSpiX3BfaW5jOwkvKiAnaW5jbHVkZScgKi8KKyMgaWZkZWYgRkVBVF9FVkFMCisgICAgY2hhcl91CSpiX3BfaW5leDsJLyogJ2luY2x1ZGVleHByJyAqLworIyBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NJTkRFTlQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorICAgIGNoYXJfdQkqYl9wX2luZGU7CS8qICdpbmRlbnRleHByJyAqLworICAgIGNoYXJfdQkqYl9wX2luZGs7CS8qICdpbmRlbnRrZXlzJyAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9DUllQVAorICAgIGNoYXJfdQkqYl9wX2tleTsJLyogJ2tleScgKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqYl9wX2twOwkvKiAna2V5d29yZHByZycgKi8KKyNpZmRlZiBGRUFUX0xJU1AKKyAgICBpbnQJCWJfcF9saXNwOwkvKiAnbGlzcCcgKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqYl9wX21wczsJLyogJ21hdGNocGFpcnMnICovCisgICAgaW50CQliX3BfbWw7CQkvKiAnbW9kZWxpbmUnICovCisgICAgaW50CQliX3BfbWxfbm9iaW47CS8qIGJfcF9tbCBzYXZlZCBmb3IgYmluYXJ5IG1vZGUgKi8KKyAgICBpbnQJCWJfcF9tYTsJCS8qICdtb2RpZmlhYmxlJyAqLworICAgIGNoYXJfdQkqYl9wX25mOwkvKiAnbnJmb3JtYXRzJyAqLworI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorICAgIGNoYXJfdQkqYl9wX29mdDsJLyogJ29zZmlsZXR5cGUnICovCisjZW5kaWYKKyAgICBpbnQJCWJfcF9waTsJCS8qICdwcmVzZXJ2ZWluZGVudCcgKi8KKyAgICBpbnQJCWJfcF9ybzsJCS8qICdyZWFkb25seScgKi8KKyAgICBsb25nCWJfcF9zdzsJCS8qICdzaGlmdHdpZHRoJyAqLworI2lmbmRlZiBTSE9SVF9GTkFNRQorICAgIGludAkJYl9wX3NuOwkJLyogJ3Nob3J0bmFtZScgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKyAgICBpbnQJCWJfcF9zaTsJCS8qICdzbWFydGluZGVudCcgKi8KKyNlbmRpZgorICAgIGxvbmcJYl9wX3N0czsJLyogJ3NvZnR0YWJzdG9wJyAqLworICAgIGxvbmcJYl9wX3N0c19ub3Bhc3RlOyAvKiBiX3Bfc3RzIHNhdmVkIGZvciBwYXN0ZSBtb2RlICovCisjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICisgICAgY2hhcl91CSpiX3Bfc3VhOwkvKiAnc3VmZml4ZXNhZGQnICovCisjZW5kaWYKKyAgICBpbnQJCWJfcF9zd2Y7CS8qICdzd2FwZmlsZScgKi8KKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGNoYXJfdQkqYl9wX3N5bjsJLyogJ3N5bnRheCcgKi8KKyNlbmRpZgorICAgIGxvbmcJYl9wX3RzOwkJLyogJ3RhYnN0b3AnICovCisgICAgaW50CQliX3BfdHg7CQkvKiAndGV4dG1vZGUnICovCisgICAgbG9uZwliX3BfdHc7CQkvKiAndGV4dHdpZHRoJyAqLworICAgIGxvbmcJYl9wX3R3X25vYmluOwkvKiBiX3BfdHcgc2F2ZWQgZm9yIGJpbmFyeSBtb2RlICovCisgICAgbG9uZwliX3BfdHdfbm9wYXN0ZTsJLyogYl9wX3R3IHNhdmVkIGZvciBwYXN0ZSBtb2RlICovCisgICAgbG9uZwliX3Bfd207CQkvKiAnd3JhcG1hcmdpbicgKi8KKyAgICBsb25nCWJfcF93bV9ub2JpbjsJLyogYl9wX3dtIHNhdmVkIGZvciBiaW5hcnkgbW9kZSAqLworICAgIGxvbmcJYl9wX3dtX25vcGFzdGU7CS8qIGJfcF93bSBzYXZlZCBmb3IgcGFzdGUgbW9kZSAqLworI2lmZGVmIEZFQVRfS0VZTUFQCisgICAgY2hhcl91CSpiX3Bfa2V5bWFwOwkvKiAna2V5bWFwJyAqLworI2VuZGlmCisKKyAgICAvKiBsb2NhbCB2YWx1ZXMgZm9yIG9wdGlvbnMgd2hpY2ggYXJlIG5vcm1hbGx5IGdsb2JhbCAqLworI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKyAgICBjaGFyX3UJKmJfcF9ncDsJLyogJ2dyZXBwcmcnIGxvY2FsIHZhbHVlICovCisgICAgY2hhcl91CSpiX3BfbXA7CS8qICdtYWtlcHJnJyBsb2NhbCB2YWx1ZSAqLworICAgIGNoYXJfdQkqYl9wX2VmbTsJLyogJ2Vycm9yZm9ybWF0JyBsb2NhbCB2YWx1ZSAqLworI2VuZGlmCisgICAgY2hhcl91CSpiX3BfZXA7CS8qICdlcXVhbHByZycgbG9jYWwgdmFsdWUgKi8KKyAgICBjaGFyX3UJKmJfcF9wYXRoOwkvKiAncGF0aCcgbG9jYWwgdmFsdWUgKi8KKyAgICBpbnQJCWJfcF9hcjsJCS8qICdhdXRvcmVhZCcgbG9jYWwgdmFsdWUgKi8KKyAgICBjaGFyX3UJKmJfcF90YWdzOwkvKiAndGFncycgbG9jYWwgdmFsdWUgKi8KKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKyAgICBjaGFyX3UJKmJfcF9kaWN0OwkvKiAnZGljdGlvbmFyeScgbG9jYWwgdmFsdWUgKi8KKyAgICBjaGFyX3UJKmJfcF90c3I7CS8qICd0aGVzYXVydXMnIGxvY2FsIHZhbHVlICovCisjZW5kaWYKKworICAgIC8qIGVuZCBvZiBidWZmZXIgb3B0aW9ucyAqLworCisgICAgaW50CQliX3N0YXJ0X2VvbDsJLyogbGFzdCBsaW5lIGhhZCBlb2wgd2hlbiBpdCB3YXMgcmVhZCAqLworICAgIGludAkJYl9zdGFydF9mZmM7CS8qIGZpcnN0IGNoYXIgb2YgJ2ZmJyB3aGVuIGVkaXQgc3RhcnRlZCAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjaGFyX3UJKmJfc3RhcnRfZmVuYzsJLyogJ2ZpbGVlbmNvZGluZycgd2hlbiBlZGl0IHN0YXJ0ZWQgb3IgTlVMTCAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBnYXJyYXlfVAliX3ZhcnM7CQkvKiBpbnRlcm5hbCB2YXJpYWJsZXMsIGxvY2FsIHRvIGJ1ZmZlciAqLworI2VuZGlmCisKKyAgICAvKiBXaGVuIGEgYnVmZmVyIGlzIGNyZWF0ZWQsIGl0IHN0YXJ0cyB3aXRob3V0IGEgc3dhcCBmaWxlLiAgYl9tYXlfc3dhcCBpcworICAgICAqIHRoZW4gc2V0IHRvIGluZGljYXRlIHRoYXQgYSBzd2FwIGZpbGUgbWF5IGJlIG9wZW5lZCBsYXRlci4gIEl0IGlzIHJlc2V0CisgICAgICogaWYgYSBzd2FwIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgICAgKi8KKyAgICBpbnQJCWJfbWF5X3N3YXA7CisgICAgaW50CQliX2RpZF93YXJuOwkvKiBTZXQgdG8gMSBpZiB1c2VyIGhhcyBiZWVuIHdhcm5lZCBvbiBmaXJzdAorCQkJCSAgIGNoYW5nZSBvZiBhIHJlYWQtb25seSBmaWxlICovCisgICAgaW50CQliX2hlbHA7CQkvKiBidWZmZXIgZm9yIGhlbHAgZmlsZSAod2hlbiBzZXQgYl9wX2J0IGlzCisJCQkJICAgImhlbHAiKSAqLworCisjaWZuZGVmIFNIT1JUX0ZOQU1FCisgICAgaW50CQliX3Nob3J0bmFtZTsJLyogdGhpcyBmaWxlIGhhcyBhbiA4LjMgZmlsZSBuYW1lICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfUEVSTAorICAgIHZvaWQJKnBlcmxfcHJpdmF0ZTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9QWVRIT04KKyAgICB2b2lkCSpweXRob25fcmVmOwkvKiBUaGUgUHl0aG9uIHZhbHVlIHJlZmVycmluZyB0byB0aGlzIGJ1ZmZlciAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1RDTAorICAgIHZvaWQJKnRjbF9yZWY7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUlVCWQorICAgIHZvaWQJKnJ1YnlfcmVmOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIGtleWVudHJ5X1QJKipiX2tleXd0YWI7CQkvKiBzeW50YXgga2V5d29yZHMgaGFzaCB0YWJsZSAqLworICAgIGtleWVudHJ5X1QJKipiX2tleXd0YWJfaWM7CQkvKiBpZGVtLCBpZ25vcmUgY2FzZSAqLworICAgIGludAkJYl9zeW5faWM7CQkvKiBpZ25vcmUgY2FzZSBmb3IgOnN5biBjbWRzICovCisgICAgZ2FycmF5X1QJYl9zeW5fcGF0dGVybnM7CQkvKiB0YWJsZSBmb3Igc3ludGF4IHBhdHRlcm5zICovCisgICAgZ2FycmF5X1QJYl9zeW5fY2x1c3RlcnM7CQkvKiB0YWJsZSBmb3Igc3ludGF4IGNsdXN0ZXJzICovCisgICAgaW50CQliX3N5bl9jb250YWluZWRpbjsJLyogVFJVRSB3aGVuIHRoZXJlIGlzIGFuIGl0ZW0gd2l0aCBhCisJCQkJCSAgICJjb250YWluZWRpbiIgYXJndW1lbnQgKi8KKyAgICBpbnQJCWJfc3luX3N5bmNfZmxhZ3M7CS8qIGZsYWdzIGFib3V0IGhvdyB0byBzeW5jICovCisgICAgc2hvcnQJYl9zeW5fc3luY19pZDsJCS8qIGdyb3VwIHRvIHN5bmMgb24gKi8KKyAgICBsb25nCWJfc3luX3N5bmNfbWlubGluZXM7CS8qIG1pbmltYWwgc3luYyBsaW5lcyBvZmZzZXQgKi8KKyAgICBsb25nCWJfc3luX3N5bmNfbWF4bGluZXM7CS8qIG1heGltYWwgc3luYyBsaW5lcyBvZmZzZXQgKi8KKyAgICBsb25nCWJfc3luX3N5bmNfbGluZWJyZWFrczsJLyogb2Zmc2V0IGZvciBtdWx0aS1saW5lIHBhdHRlcm4gKi8KKyAgICBjaGFyX3UJKmJfc3luX2xpbmVjb250X3BhdDsJLyogbGluZSBjb250aW51YXRpb24gcGF0dGVybiAqLworICAgIHJlZ3Byb2dfVAkqYl9zeW5fbGluZWNvbnRfcHJvZzsJLyogbGluZSBjb250aW51YXRpb24gcHJvZ3JhbSAqLworICAgIGludAkJYl9zeW5fbGluZWNvbnRfaWM7CS8qIGlnbm9yZS1jYXNlIGZsYWcgZm9yIGFib3ZlICovCisgICAgaW50CQliX3N5bl90b3BncnA7CQkvKiBmb3IgIjpzeW50YXggaW5jbHVkZSIgKi8KKyMgaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaW50CQliX3N5bl9mb2xkaXRlbXM7CS8qIG51bWJlciBvZiBwYXR0ZXJucyB3aXRoIHRoZSBITF9GT0xECisJCQkJCSAgIGZsYWcgc2V0ICovCisjIGVuZGlmCisvKgorICogYl9zc3RfYXJyYXlbXSBjb250YWlucyB0aGUgc3RhdGUgc3RhY2sgZm9yIGEgbnVtYmVyIG9mIGxpbmVzLCBmb3IgdGhlIHN0YXJ0CisgKiBvZiB0aGF0IGxpbmUgKGNvbCA9PSAwKS4gIFRoaXMgYXZvaWRzIGhhdmluZyB0byByZWNvbXB1dGUgdGhlIHN5bnRheCBzdGF0ZQorICogdG9vIG9mdGVuLgorICogYl9zc3RfYXJyYXlbXSBpcyBhbGxvY2F0ZWQgdG8gaG9sZCB0aGUgc3RhdGUgZm9yIGFsbCBkaXNwbGF5ZWQgbGluZXMsIGFuZAorICogc3RhdGVzIGZvciAxIG91dCBvZiBhYm91dCAyMCBvdGhlciBsaW5lcy4KKyAqIGJfc3N0X2FycmF5CQlwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN5bnN0YXRlX1QKKyAqIGJfc3N0X2xlbgkJbnVtYmVyIG9mIGVudHJpZXMgaW4gYl9zc3RfYXJyYXlbXQorICogYl9zc3RfZmlyc3QJCXBvaW50ZXIgdG8gZmlyc3QgdXNlZCBlbnRyeSBpbiBiX3NzdF9hcnJheVtdIG9yIE5VTEwKKyAqIGJfc3N0X2ZpcnN0ZnJlZQlwb2ludGVyIHRvIGZpcnN0IGZyZWUgZW50cnkgaW4gYl9zc3RfYXJyYXlbXSBvciBOVUxMCisgKiBiX3NzdF9mcmVlY291bnQJbnVtYmVyIG9mIGZyZWUgZW50cmllcyBpbiBiX3NzdF9hcnJheVtdCisgKiBiX3NzdF9jaGVja19sbnVtCWVudHJpZXMgYWZ0ZXIgdGhpcyBsbnVtIG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IKKyAqCQkJdmFsaWRpdHkgKE1BWExOVU0gbWVhbnMgbm8gY2hlY2sgbmVlZGVkKQorICovCisgICAgc3luc3RhdGVfVAkqYl9zc3RfYXJyYXk7CisgICAgaW50CQliX3NzdF9sZW47CisgICAgc3luc3RhdGVfVAkqYl9zc3RfZmlyc3Q7CisgICAgc3luc3RhdGVfVAkqYl9zc3RfZmlyc3RmcmVlOworICAgIGludAkJYl9zc3RfZnJlZWNvdW50OworICAgIGxpbmVucl9UCWJfc3N0X2NoZWNrX2xudW07CisgICAgc2hvcnRfdQliX3NzdF9sYXN0dGljazsJLyogbGFzdCBkaXNwbGF5IHRpY2sgKi8KKyNlbmRpZiAvKiBGRUFUX1NZTl9ITCAqLworCisjaWZkZWYgRkVBVF9TSUdOUworICAgIHNpZ25saXN0X1QJKmJfc2lnbmxpc3Q7CS8qIGxpc3Qgb2Ygc2lnbnMgdG8gZHJhdyAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKyAgICBpbnQJCWJfbmV0YmVhbnNfZmlsZTsgICAgLyogVFJVRSB3aGVuIGJ1ZmZlciBpcyBvd25lZCBieSBOZXRCZWFucyAqLworICAgIGludAkJYl93YXNfbmV0YmVhbnNfZmlsZTsvKiBUUlVFIGlmIGJfbmV0YmVhbnNfZmlsZSB3YXMgb25jZSBzZXQgKi8KKyNlbmRpZgorCit9OworCisvKgorICogU3RydWN0dXJlIHRvIGNhY2hlIGluZm8gZm9yIGRpc3BsYXllZCBsaW5lcyBpbiB3X2xpbmVzW10uCisgKiBFYWNoIGxvZ2ljYWwgbGluZSBoYXMgb25lIGVudHJ5LgorICogVGhlIGVudHJ5IHRlbGxzIGhvdyB0aGUgbG9naWNhbCBsaW5lIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIHdpbmRvdy4KKyAqIFRoaXMgaXMgdXBkYXRlZCB3aGVuIGRpc3BsYXlpbmcgdGhlIHdpbmRvdy4KKyAqIFdoZW4gdGhlIGRpc3BsYXkgaXMgY2hhbmdlZCAoZS5nLiwgd2hlbiBjbGVhcmluZyB0aGUgc2NyZWVuKSB3X2xpbmVzX3ZhbGlkCisgKiBpcyBjaGFuZ2VkIHRvIGV4Y2x1ZGUgaW52YWxpZCBlbnRyaWVzLgorICogV2hlbiBtYWtpbmcgY2hhbmdlcyB0byB0aGUgYnVmZmVyLCB3bF92YWxpZCBpcyByZXNldCB0byBpbmRpY2F0ZSB3bF9zaXplCisgKiBtYXkgbm90IHJlZmxlY3Qgd2hhdCBpcyBhY3R1YWxseSBpbiB0aGUgYnVmZmVyLiAgV2hlbiB3bF92YWxpZCBpcyBGQUxTRSwKKyAqIHRoZSBlbnRyaWVzIGNhbiBvbmx5IGJlIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBkaXNwbGF5ZWQgbGluZXMgdXNlZC4KKyAqIHdsX2xudW0gYW5kIHdsX2xhc3RsbnVtIGFyZSBpbnZhbGlkIHRvby4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd19saW5lCit7CisgICAgbGluZW5yX1QJd2xfbG51bTsJLyogYnVmZmVyIGxpbmUgbnVtYmVyIGZvciBsb2dpY2FsIGxpbmUgKi8KKyAgICBzaG9ydF91CXdsX3NpemU7CS8qIGhlaWdodCBpbiBzY3JlZW4gbGluZXMgKi8KKyAgICBjaGFyCXdsX3ZhbGlkOwkvKiBUUlVFIHZhbHVlcyBhcmUgdmFsaWQgZm9yIHRleHQgaW4gYnVmZmVyICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgY2hhcgl3bF9mb2xkZWQ7CS8qIFRSVUUgd2hlbiB0aGlzIGlzIGEgcmFuZ2Ugb2YgZm9sZGVkIGxpbmVzICovCisgICAgbGluZW5yX1QJd2xfbGFzdGxudW07CS8qIGxhc3QgYnVmZmVyIGxpbmUgbnVtYmVyIGZvciBsb2dpY2FsIGxpbmUgKi8KKyNlbmRpZgorfSB3bGluZV9UOworCisvKgorICogV2luZG93cyBhcmUga2VwdCBpbiBhIHRyZWUgb2YgZnJhbWVzLiAgRWFjaCBmcmFtZSBoYXMgYSBjb2x1bW4gKEZSX0NPTCkKKyAqIG9yIHJvdyAoRlJfUk9XKSBsYXlvdXQgb3IgaXMgYSBsZWFmLCB3aGljaCBoYXMgYSB3aW5kb3cuCisgKi8KK3N0cnVjdCBmcmFtZQoreworICAgIGNoYXIJZnJfbGF5b3V0OwkvKiBGUl9MRUFGLCBGUl9DT0wgb3IgRlJfUk9XICovCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpbnQJCWZyX3dpZHRoOworI2VuZGlmCisgICAgaW50CQlmcl9oZWlnaHQ7CisgICAgaW50CQlmcl9uZXdoZWlnaHQ7CS8qIG5ldyBoZWlnaHQgdXNlZCBpbiB3aW5fZXF1YWxfcmVjKCkgKi8KKyAgICBmcmFtZV9UCSpmcl9wYXJlbnQ7CS8qIGNvbnRhaW5pbmcgZnJhbWUgb3IgTlVMTCAqLworICAgIGZyYW1lX1QJKmZyX25leHQ7CS8qIGZyYW1lIHJpZ2h0IG9yIGJlbG93IGluIHNhbWUgcGFyZW50LCBOVUxMCisJCQkJICAgZm9yIGZpcnN0ICovCisgICAgZnJhbWVfVAkqZnJfcHJldjsJLyogZnJhbWUgbGVmdCBvciBhYm92ZSBpbiBzYW1lIHBhcmVudCwgTlVMTAorCQkJCSAgIGZvciBsYXN0ICovCisgICAgLyogZnJfY2hpbGQgYW5kIGZyX3dpbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisgICAgZnJhbWVfVAkqZnJfY2hpbGQ7CS8qIGZpcnN0IGNvbnRhaW5lZCBmcmFtZSAqLworICAgIHdpbl9UCSpmcl93aW47CS8qIHdpbmRvdyB0aGF0IGZpbGxzIHRoaXMgZnJhbWUgKi8KK307CisKKyNkZWZpbmUgRlJfTEVBRgkwCS8qIGZyYW1lIGlzIGEgbGVhZiAqLworI2RlZmluZSBGUl9ST1cJMQkvKiBmcmFtZSB3aXRoIGEgcm93IG9mIHdpbmRvd3MgKi8KKyNkZWZpbmUgRlJfQ09MCTIJLyogZnJhbWUgd2l0aCBhIGNvbHVtbiBvZiB3aW5kb3dzICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHRoYXQgYmVsb25ncyB0byBhIHdpbmRvdworICoKKyAqIEFsbCByb3cgbnVtYmVycyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3csIGV4Y2VwdCB3X3dpbnJvdy4KKyAqLworc3RydWN0IHdpbmRvdworeworICAgIGJ1Zl9UCSp3X2J1ZmZlcjsJICAgIC8qIGJ1ZmZlciB3ZSBhcmUgYSB3aW5kb3cgaW50byAodXNlZAorCQkJCSAgICAgICBvZnRlbiwga2VlcCBpdCB0aGUgZmlyc3QgaXRlbSEpICovCisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3aW5fVAkqd19wcmV2OwkgICAgLyogbGluayB0byBwcmV2aW91cyB3aW5kb3cgKi8KKyAgICB3aW5fVAkqd19uZXh0OwkgICAgLyogbGluayB0byBuZXh0IHdpbmRvdyAqLworI2VuZGlmCisKKyAgICBmcmFtZV9UCSp3X2ZyYW1lOwkgICAgLyogZnJhbWUgY29udGFpbmluZyB0aGlzIHdpbmRvdyAqLworCisgICAgcG9zX1QJd19jdXJzb3I7CSAgICAvKiBjdXJzb3IgcG9zaXRpb24gaW4gYnVmZmVyICovCisKKyAgICBjb2xucl9UCXdfY3Vyc3dhbnQ7CSAgICAvKiBUaGUgY29sdW1uIHdlJ2QgbGlrZSB0byBiZSBhdC4gIFRoaXMgaXMKKwkJCQkgICAgICAgdXNlZCB0byB0cnkgdG8gc3RheSBpbiB0aGUgc2FtZSBjb2x1bW4KKwkJCQkgICAgICAgZm9yIHVwL2Rvd24gY3Vyc29yIG1vdGlvbnMuICovCisKKyAgICBpbnQJCXdfc2V0X2N1cnN3YW50OwkgICAgLyogSWYgc2V0LCB0aGVuIHVwZGF0ZSB3X2N1cnN3YW50IHRoZSBuZXh0CisJCQkJICAgICAgIHRpbWUgdGhyb3VnaCBjdXJzdXBkYXRlKCkgdG8gdGhlCisJCQkJICAgICAgIGN1cnJlbnQgdmlydHVhbCBjb2x1bW4gKi8KKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyoKKyAgICAgKiB0aGUgbmV4dCBzaXggYXJlIHVzZWQgdG8gdXBkYXRlIHRoZSB2aXN1YWwgcGFydAorICAgICAqLworICAgIGNoYXIJd19vbGRfdmlzdWFsX21vZGU7ICAvKiBsYXN0IGtub3duIFZJc3VhbF9tb2RlICovCisgICAgbGluZW5yX1QJd19vbGRfY3Vyc29yX2xudW07ICAvKiBsYXN0IGtub3duIGVuZCBvZiB2aXN1YWwgcGFydCAqLworICAgIGNvbG5yX1QJd19vbGRfY3Vyc29yX2Zjb2w7ICAvKiBmaXJzdCBjb2x1bW4gZm9yIGJsb2NrIHZpc3VhbCBwYXJ0ICovCisgICAgY29sbnJfVAl3X29sZF9jdXJzb3JfbGNvbDsgIC8qIGxhc3QgY29sdW1uIGZvciBibG9jayB2aXN1YWwgcGFydCAqLworICAgIGxpbmVucl9UCXdfb2xkX3Zpc3VhbF9sbnVtOyAgLyogbGFzdCBrbm93biBzdGFydCBvZiB2aXN1YWwgcGFydCAqLworICAgIGNvbG5yX1QJd19vbGRfY3Vyc3dhbnQ7CSAgICAvKiBsYXN0IGtub3duIHZhbHVlIG9mIEN1cnN3YW50ICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogVGhlIG5leHQgdGhyZWUgc3BlY2lmeSB0aGUgb2Zmc2V0cyBmb3IgZGlzcGxheWluZyB0aGUgYnVmZmVyOgorICAgICAqLworICAgIGxpbmVucl9UCXdfdG9wbGluZTsJICAgIC8qIGJ1ZmZlciBsaW5lIG51bWJlciBvZiB0aGUgbGluZSBhdCB0aGUKKwkJCQkgICAgICAgdG9wIG9mIHRoZSB3aW5kb3cgKi8KKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBpbnQJCXdfdG9wZmlsbDsJICAgIC8qIG51bWJlciBvZiBmaWxsZXIgbGluZXMgYWJvdmUgd190b3BsaW5lICovCisgICAgaW50CQl3X29sZF90b3BmaWxsOwkgICAgLyogd190b3BmaWxsIGF0IGxhc3QgcmVkcmF3ICovCisgICAgaW50CQl3X2JvdGZpbGw7CSAgICAvKiBUUlVFIHdoZW4gZmlsbGVyIGxpbmVzIGFyZSBhY3R1YWxseQorCQkJCSAgICAgICBiZWxvdyB3X3RvcGxpbmUgKGF0IGVuZCBvZiBmaWxlKSAqLworICAgIGludAkJd19vbGRfYm90ZmlsbDsJICAgIC8qIHdfYm90ZmlsbCBhdCBsYXN0IHJlZHJhdyAqLworI2VuZGlmCisgICAgY29sbnJfVAl3X2xlZnRjb2w7CSAgICAvKiB3aW5kb3cgY29sdW1uIG51bWJlciBvZiB0aGUgbGVmdCBtb3N0CisJCQkJICAgICAgIGNoYXJhY3RlciBpbiB0aGUgd2luZG93OyB1c2VkIHdoZW4KKwkJCQkgICAgICAgJ3dyYXAnIGlzIG9mZiAqLworICAgIGNvbG5yX1QJd19za2lwY29sOwkgICAgLyogc3RhcnRpbmcgY29sdW1uIHdoZW4gYSBzaW5nbGUgbGluZQorCQkJCSAgICAgICBkb2Vzbid0IGZpdCBpbiB0aGUgd2luZG93ICovCisKKyAgICAvKgorICAgICAqIExheW91dCBvZiB0aGUgd2luZG93IGluIHRoZSBzY3JlZW4uCisgICAgICogTWF5IG5lZWQgdG8gYWRkICJtc2dfc2Nyb2xsZWQiIHRvICJ3X3dpbnJvdyIgaW4gcmFyZSBzaXR1YXRpb25zLgorICAgICAqLworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGludAkJd193aW5yb3c7CSAgICAvKiBmaXJzdCByb3cgb2Ygd2luZG93IGluIHNjcmVlbiAqLworI2VuZGlmCisgICAgaW50CQl3X2hlaWdodDsJICAgIC8qIG51bWJlciBvZiByb3dzIGluIHdpbmRvdywgZXhjbHVkaW5nCisJCQkJICAgICAgIHN0YXR1cy9jb21tYW5kIGxpbmUocykgKi8KKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpbnQJCXdfc3RhdHVzX2hlaWdodDsgICAgLyogbnVtYmVyIG9mIHN0YXR1cyBsaW5lcyAoMCBvciAxKSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpbnQJCXdfd2luY29sOwkgICAgLyogTGVmdG1vc3QgY29sdW1uIG9mIHdpbmRvdyBpbiBzY3JlZW4uCisJCQkJICAgICAgIHVzZSBXX1dJTkNPTCgpICovCisgICAgaW50CQl3X3dpZHRoOwkgICAgLyogV2lkdGggb2Ygd2luZG93LCBleGNsdWRpbmcgc2VwYXJhdGlvbi4KKwkJCQkgICAgICAgdXNlIFdfV0lEVEgoKSAqLworICAgIGludAkJd192c2VwX3dpZHRoOwkgICAgLyogTnVtYmVyIG9mIHNlcGFyYXRvciBjb2x1bW5zICgwIG9yIDEpLgorCQkJCSAgICAgICB1c2UgV19WU0VQX1dJRFRIKCkgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiA9PT0gc3RhcnQgb2YgY2FjaGVkIHZhbHVlcyA9PT09CisgICAgICovCisgICAgLyoKKyAgICAgKiBSZWNvbXB1dGluZyBpcyBtaW5pbWl6ZWQgYnkgc3RvcmluZyB0aGUgcmVzdWx0IG9mIGNvbXB1dGF0aW9ucy4KKyAgICAgKiBVc2UgZnVuY3Rpb25zIGluIHNjcmVlbi5jIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHZhbGlkIGFuZCB0byB1cGRhdGUuCisgICAgICogd192YWxpZCBpcyBhIGJpdGZpZWxkIG9mIGZsYWdzLCB3aGljaCBpbmRpY2F0ZSBpZiBzcGVjaWZpYyB2YWx1ZXMgYXJlCisgICAgICogdmFsaWQgb3IgbmVlZCB0byBiZSByZWNvbXB1dGVkLglTZWUgc2NyZWVuLmMgZm9yIHZhbHVlcy4KKyAgICAgKi8KKyAgICBpbnQJCXdfdmFsaWQ7CisgICAgcG9zX1QJd192YWxpZF9jdXJzb3I7CSAgICAvKiBsYXN0IGtub3duIHBvc2l0aW9uIG9mIHdfY3Vyc29yLCB1c2VkCisJCQkJICAgICAgIHRvIGFkanVzdCB3X3ZhbGlkICovCisgICAgY29sbnJfVAl3X3ZhbGlkX2xlZnRjb2w7ICAgIC8qIGxhc3Qga25vd24gd19sZWZ0Y29sICovCisKKyAgICAvKgorICAgICAqIHdfY2xpbmVfaGVpZ2h0IGlzIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgbGluZXMgdGFrZW4gYnkgdGhlIGJ1ZmZlciBsaW5lCisgICAgICogdGhhdCB0aGUgY3Vyc29yIGlzIG9uLiAgV2UgdXNlIHRoaXMgdG8gYXZvaWQgZXh0cmEgY2FsbHMgdG8gcGxpbmVzKCkuCisgICAgICovCisgICAgaW50CQl3X2NsaW5lX2hlaWdodDsJICAgIC8qIGN1cnJlbnQgc2l6ZSBvZiBjdXJzb3IgbGluZSAqLworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGludAkJd19jbGluZV9mb2xkZWQ7CSAgICAvKiBjdXJzb3IgbGluZSBpcyBmb2xkZWQgKi8KKyNlbmRpZgorCisgICAgaW50CQl3X2NsaW5lX3JvdzsJICAgIC8qIHN0YXJ0aW5nIHJvdyBvZiB0aGUgY3Vyc29yIGxpbmUgKi8KKworICAgIGNvbG5yX1QJd192aXJ0Y29sOwkgICAgLyogY29sdW1uIG51bWJlciBvZiB0aGUgY3Vyc29yIGluIHRoZQorCQkJCSAgICAgICBidWZmZXIgbGluZSwgYXMgb3Bwb3NlZCB0byB0aGUgY29sdW1uCisJCQkJICAgICAgIG51bWJlciB3ZSdyZSBhdCBvbiB0aGUgc2NyZWVuLiAgVGhpcworCQkJCSAgICAgICBtYWtlcyBhIGRpZmZlcmVuY2Ugb24gbGluZXMgd2hpY2ggc3BhbgorCQkJCSAgICAgICBtb3JlIHRoYW4gb25lIHNjcmVlbiBsaW5lIG9yIHdoZW4KKwkJCQkgICAgICAgd19sZWZ0Y29sIGlzIG5vbi16ZXJvICovCisKKyAgICAvKgorICAgICAqIHdfd3JvdyBhbmQgd193Y29sIHNwZWNpZnkgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgd2luZG93LgorICAgICAqIFRoaXMgaXMgcmVsYXRlZCB0byBwb3NpdGlvbnMgaW4gdGhlIHdpbmRvdywgbm90IGluIHRoZSBkaXNwbGF5IG9yCisgICAgICogYnVmZmVyLCB0aHVzIHdfd3JvdyBpcyByZWxhdGl2ZSB0byB3X3dpbnJvdy4KKyAgICAgKi8KKyAgICBpbnQJCXdfd3Jvdywgd193Y29sOwkgICAgLyogY3Vyc29yIHBvc2l0aW9uIGluIHdpbmRvdyAqLworCisgICAgbGluZW5yX1QJd19ib3RsaW5lOwkgICAgLyogbnVtYmVyIG9mIHRoZSBsaW5lIGJlbG93IHRoZSBib3R0b20gb2YKKwkJCQkgICAgICAgdGhlIHNjcmVlbiAqLworICAgIGludAkJd19lbXB0eV9yb3dzOwkgICAgLyogbnVtYmVyIG9mIH4gcm93cyBpbiB3aW5kb3cgKi8KKyNpZmRlZiBGRUFUX0RJRkYKKyAgICBpbnQJCXdfZmlsbGVyX3Jvd3M7CSAgICAvKiBudW1iZXIgb2YgZmlsbGVyIHJvd3MgYXQgdGhlIGVuZCBvZiB0aGUKKwkJCQkgICAgICAgd2luZG93ICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogSW5mbyBhYm91dCB0aGUgbGluZXMgY3VycmVudGx5IGluIHRoZSB3aW5kb3cgaXMgcmVtZW1iZXJlZCB0byBhdm9pZAorICAgICAqIHJlY29tcHV0aW5nIGl0IGV2ZXJ5IHRpbWUuICBUaGUgYWxsb2NhdGVkIHNpemUgb2Ygd19saW5lc1tdIGlzIFJvd3MuCisgICAgICogT25seSB0aGUgd19saW5lc192YWxpZCBlbnRyaWVzIGFyZSBhY3R1YWxseSB2YWxpZC4KKyAgICAgKiBXaGVuIHRoZSBkaXNwbGF5IGlzIHVwLXRvLWRhdGUgd19saW5lc1swXS53bF9sbnVtIGlzIGVxdWFsIHRvIHdfdG9wbGluZQorICAgICAqIGFuZCB3X2xpbmVzW3dfbGluZXNfdmFsaWQgLSAxXS53bF9sbnVtIGlzIGVxdWFsIHRvIHdfYm90bGluZS4KKyAgICAgKiBCZXR3ZWVuIGNoYW5naW5nIHRleHQgYW5kIHVwZGF0aW5nIHRoZSBkaXNwbGF5IHdfbGluZXNbXSByZXByZXNlbnRzCisgICAgICogd2hhdCBpcyBjdXJyZW50bHkgZGlzcGxheWVkLiAgd2xfdmFsaWQgaXMgcmVzZXQgdG8gaW5kaWNhdGVkIHRoaXMuCisgICAgICogVGhpcyBpcyB1c2VkIGZvciBlZmZpY2llbnQgcmVkcmF3aW5nLgorICAgICAqLworICAgIGludAkJd19saW5lc192YWxpZDsJICAgIC8qIG51bWJlciBvZiB2YWxpZCBlbnRyaWVzICovCisgICAgd2xpbmVfVAkqd19saW5lczsKKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIGdhcnJheV9UCXdfZm9sZHM7CSAgICAvKiBhcnJheSBvZiBuZXN0ZWQgZm9sZHMgKi8KKyAgICBjaGFyCXdfZm9sZF9tYW51YWw7CSAgICAvKiB3aGVuIFRSVUU6IHNvbWUgZm9sZHMgYXJlIG9wZW5lZC9jbG9zZWQKKwkJCQkgICAgICAgbWFudWFsbHkgKi8KKyAgICBjaGFyCXdfZm9sZGludmFsaWQ7CSAgICAvKiB3aGVuIFRSVUU6IGZvbGRpbmcgbmVlZHMgdG8gYmUKKwkJCQkgICAgICAgcmVjb21wdXRlZCAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqID09PSBlbmQgb2YgY2FjaGVkIHZhbHVlcyA9PT0KKyAgICAgKi8KKworICAgIGludAkJd19yZWRyX3R5cGU7CSAgICAvKiB0eXBlIG9mIHJlZHJhdyB0byBiZSBwZXJmb3JtZWQgb24gd2luICovCisgICAgaW50CQl3X3VwZF9yb3dzOwkgICAgLyogbnVtYmVyIG9mIHdpbmRvdyBsaW5lcyB0byB1cGRhdGUgd2hlbgorCQkJCSAgICAgICB3X3JlZHJfdHlwZSBpcyBSRURSQVdfVE9QICovCisgICAgbGluZW5yX1QJd19yZWRyYXdfdG9wOwkgICAgLyogd2hlbiAhPSAwOiBmaXJzdCBsaW5lIG5lZWRpbmcgcmVkcmF3ICovCisgICAgbGluZW5yX1QJd19yZWRyYXdfYm90OwkgICAgLyogd2hlbiAhPSAwOiBsYXN0IGxpbmUgbmVlZGluZyByZWRyYXcgKi8KKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpbnQJCXdfcmVkcl9zdGF0dXM7CSAgICAvKiBpZiBUUlVFIHN0YXR1cyBsaW5lIG11c3QgYmUgcmVkcmF3biAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0NNRExfSU5GTworICAgIC8qIHJlbWVtYmVyIHdoYXQgaXMgc2hvd24gaW4gdGhlIHJ1bGVyIGZvciB0aGlzIHdpbmRvdyAoaWYgJ3J1bGVyJyBzZXQpICovCisgICAgcG9zX1QJd19ydV9jdXJzb3I7CSAgICAvKiBjdXJzb3IgcG9zaXRpb24gc2hvd24gaW4gcnVsZXIgKi8KKyAgICBjb2xucl9UCXdfcnVfdmlydGNvbDsJICAgIC8qIHZpcnRjb2wgc2hvd24gaW4gcnVsZXIgKi8KKyAgICBsaW5lbnJfVAl3X3J1X3RvcGxpbmU7CSAgICAvKiB0b3BsaW5lIHNob3duIGluIHJ1bGVyICovCisgICAgbGluZW5yX1QJd19ydV9saW5lX2NvdW50OyAgICAvKiBsaW5lIGNvdW50IHVzZWQgZm9yIHJ1bGVyICovCisjIGlmZGVmIEZFQVRfRElGRgorICAgIGludAkJd19ydV90b3BmaWxsOwkgICAgLyogdG9wZmlsbCBzaG93biBpbiBydWxlciAqLworIyBlbmRpZgorICAgIGNoYXIJd19ydV9lbXB0eTsJICAgIC8qIFRSVUUgaWYgcnVsZXIgc2hvd3MgMC0xIChlbXB0eSBsaW5lKSAqLworI2VuZGlmCisKKyAgICBpbnQJCXdfYWx0X2ZudW07CSAgICAvKiBhbHRlcm5hdGUgZmlsZSAoZm9yICMgYW5kIENUUkwtXikgKi8KKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGFsaXN0X1QJKndfYWxpc3Q7CSAgICAvKiBwb2ludGVyIHRvIGFyZ2xpc3QgZm9yIHRoaXMgd2luZG93ICovCisjZW5kaWYKKyAgICBpbnQJCXdfYXJnX2lkeDsJICAgIC8qIGN1cnJlbnQgaW5kZXggaW4gYXJndW1lbnQgbGlzdCAoY2FuIGJlCisJCQkJICAgICAgIG91dCBvZiByYW5nZSEpICovCisgICAgaW50CQl3X2FyZ19pZHhfaW52YWxpZDsgIC8qIGVkaXRpbmcgYW5vdGhlciBmaWxlIHRoYW4gd19hcmdfaWR4ICovCisKKyAgICBjaGFyX3UJKndfbG9jYWxkaXI7CSAgICAvKiBhYnNvbHV0ZSBwYXRoIG9mIGxvY2FsIGRpcmVjdG9yeSBvcgorCQkJCSAgICAgICBOVUxMICovCisgICAgLyoKKyAgICAgKiBPcHRpb25zIGxvY2FsIHRvIGEgd2luZG93LgorICAgICAqIFRoZXkgYXJlIGxvY2FsIGJlY2F1c2UgdGhleSBpbmZsdWVuY2UgdGhlIGxheW91dCBvZiB0aGUgd2luZG93IG9yCisgICAgICogZGVwZW5kIG9uIHRoZSB3aW5kb3cgbGF5b3V0LgorICAgICAqIFRoZXJlIGFyZSB0d28gdmFsdWVzOiB3X29uZWJ1Zl9vcHQgaXMgbG9jYWwgdG8gdGhlIGJ1ZmZlciBjdXJyZW50bHkgaW4KKyAgICAgKiB0aGlzIHdpbmRvdywgd19hbGxidWZfb3B0IGlzIGZvciBhbGwgYnVmZmVycyBpbiB0aGlzIHdpbmRvdy4KKyAgICAgKi8KKyAgICB3aW5vcHRfVAl3X29uZWJ1Zl9vcHQ7CisgICAgd2lub3B0X1QJd19hbGxidWZfb3B0OworCisgICAgLyogdHJhbnNmb3JtIGEgcG9pbnRlciB0byBhICJvbmVidWYiIG9wdGlvbiBpbnRvIGEgImFsbGJ1ZiIgb3B0aW9uICovCisjZGVmaW5lIEdMT0JBTF9XTyhwKQkoKGNoYXIgKilwICsgc2l6ZW9mKHdpbm9wdF9UKSkKKworI2lmZGVmIEZFQVRfU0NST0xMQklORAorICAgIGxvbmcJd19zY2JpbmRfcG9zOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBnYXJyYXlfVAl3X3ZhcnM7CQkvKiBpbnRlcm5hbCB2YXJpYWJsZXMsIGxvY2FsIHRvIHdpbmRvdyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKSAmJiBkZWZpbmVkKEZFQVRfRktNQVApCisgICAgaW50CQl3X2ZhcnNpOwkvKiBmb3IgdGhlIHdpbmRvdyBkZXBlbmRlbnQgRmFyc2kgZnVuY3Rpb25zICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogVGhlIHdfcHJldl9wY21hcmsgZmllbGQgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHdlIHJlYWxseSBkaWQganVtcCB0bworICAgICAqIGEgbmV3IGxpbmUgYWZ0ZXIgc2V0dGluZyB0aGUgd19wY21hcmsuICBJZiBub3QsIHRoZW4gd2UgcmV2ZXJ0IHRvCisgICAgICogdXNpbmcgdGhlIHByZXZpb3VzIHdfcGNtYXJrLgorICAgICAqLworICAgIHBvc19UCXdfcGNtYXJrOwkvKiBwcmV2aW91cyBjb250ZXh0IG1hcmsgKi8KKyAgICBwb3NfVAl3X3ByZXZfcGNtYXJrOwkvKiBwcmV2aW91cyB3X3BjbWFyayAqLworCisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIC8qCisgICAgICogdGhlIGp1bXBsaXN0IGNvbnRhaW5zIG9sZCBjdXJzb3IgcG9zaXRpb25zCisgICAgICovCisgICAgeGZtYXJrX1QJd19qdW1wbGlzdFtKVU1QTElTVFNJWkVdOworICAgIGludAkJd19qdW1wbGlzdGxlbjsJCS8qIG51bWJlciBvZiBhY3RpdmUgZW50cmllcyAqLworICAgIGludAkJd19qdW1wbGlzdGlkeDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gKi8KKworICAgIGludAkJd19jaGFuZ2VsaXN0aWR4OwkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJfY2hhbmdlbGlzdCAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIHJlZ21tYXRjaF9UCXdfbWF0Y2g7CS8qIHJlZ2V4cCBwcm9ncmFtIGZvciAiOm1hdGNoIiAqLworICAgIGludAkJd19tYXRjaF9pZDsJLyogaGlnaGxpZ2h0IElEIGZvciAiOm1hdGNoIiAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIHRoZSB0YWdzdGFjayBncm93cyBmcm9tIDAgdXB3YXJkczoKKyAgICAgKiBlbnRyeSAwOiBvbGRlcgorICAgICAqIGVudHJ5IDE6IG5ld2VyCisgICAgICogZW50cnkgMjogbmV3ZXN0CisgICAgICovCisgICAgdGFnZ3lfVAl3X3RhZ3N0YWNrW1RBR1NUQUNLU0laRV07CS8qIHRoZSB0YWcgc3RhY2sgKi8KKyAgICBpbnQJCXdfdGFnc3RhY2tpZHg7CQkvKiBpZHgganVzdCBiZWxvdyBhY3RpdiBlbnRyeSAqLworICAgIGludAkJd190YWdzdGFja2xlbjsJCS8qIG51bWJlciBvZiB0YWdzIG9uIHN0YWNrICovCisKKyAgICAvKgorICAgICAqIHdfZnJhY3Rpb24gaXMgdGhlIGZyYWN0aW9uYWwgcm93IG9mIHRoZSBjdXJzb3Igd2l0aGluIHRoZSB3aW5kb3csIGZyb20KKyAgICAgKiAwIGF0IHRoZSB0b3Agcm93IHRvIEZSQUNUSU9OX01VTFQgYXQgdGhlIGxhc3Qgcm93LgorICAgICAqIHdfcHJldl9mcmFjdGlvbl9yb3cgd2FzIHRoZSBhY3R1YWwgY3Vyc29yIHJvdyB3aGVuIHdfZnJhY3Rpb24gd2FzIGxhc3QKKyAgICAgKiBjYWxjdWxhdGVkLgorICAgICAqLworICAgIGludAkJd19mcmFjdGlvbjsKKyAgICBpbnQJCXdfcHJldl9mcmFjdGlvbl9yb3c7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIHNjcm9sbGJhcl9UCXdfc2Nyb2xsYmFyc1syXTsJLyogdmVydC4gU2Nyb2xsYmFycyBmb3IgdGhpcyB3aW5kb3cgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9QRVJMCisgICAgdm9pZAkqcGVybF9wcml2YXRlOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1BZVEhPTgorICAgIHZvaWQJKnB5dGhvbl9yZWY7CS8qIFRoZSBQeXRob24gdmFsdWUgcmVmZXJyaW5nIHRvIHRoaXMKKwkJCQkJICAgd2luZG93ICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfVENMCisgICAgdm9pZAkqdGNsX3JlZjsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9SVUJZCisgICAgdm9pZAkqcnVieV9yZWY7CisjZW5kaWYKK307CisKKy8qCisgKiBBcmd1bWVudHMgZm9yIG9wZXJhdG9ycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3BhcmcKK3sKKyAgICBpbnQJCW9wX3R5cGU7CS8qIGN1cnJlbnQgcGVuZGluZyBvcGVyYXRvciB0eXBlICovCisgICAgaW50CQlyZWduYW1lOwkvKiByZWdpc3RlciB0byB1c2UgZm9yIHRoZSBvcGVyYXRvciAqLworICAgIGludAkJbW90aW9uX3R5cGU7CS8qIHR5cGUgb2YgdGhlIGN1cnJlbnQgY3Vyc29yIG1vdGlvbiAqLworICAgIGludAkJbW90aW9uX2ZvcmNlOwkvKiBmb3JjZSBtb3Rpb24gdHlwZTogJ3YnLCAnVicgb3IgQ1RSTC1WICovCisgICAgaW50CQl1c2VfcmVnX29uZTsJLyogVFJVRSBpZiBkZWxldGUgdXNlcyByZWcgMSBldmVuIHdoZW4gbm90CisJCQkJICAgbGluZXdpc2UgKi8KKyAgICBpbnQJCWluY2x1c2l2ZTsJLyogVFJVRSBpZiBjaGFyIG1vdGlvbiBpcyBpbmNsdXNpdmUgKG9ubHkKKwkJCQkgICB2YWxpZCB3aGVuIG1vdGlvbl90eXBlIGlzIE1DSEFSICovCisgICAgaW50CQllbmRfYWRqdXN0ZWQ7CS8qIGJhY2t1cGVkIGJfb3BfZW5kIG9uZSBjaGFyIChvbmx5IHVzZWQgYnkKKwkJCQkgICBkb19mb3JtYXQoKSkgKi8KKyAgICBwb3NfVAlzdGFydDsJCS8qIHN0YXJ0IG9mIHRoZSBvcGVyYXRvciAqLworICAgIHBvc19UCWVuZDsJCS8qIGVuZCBvZiB0aGUgb3BlcmF0b3IgKi8KKyAgICBwb3NfVAljdXJzb3Jfc3RhcnQ7CS8qIGN1cnNvciBwb3NpdGlvbiBiZWZvcmUgbW90aW9uIGZvciAiZ3ciICovCisKKyAgICBsb25nCWxpbmVfY291bnQ7CS8qIG51bWJlciBvZiBsaW5lcyBmcm9tIG9wX3N0YXJ0IHRvIG9wX2VuZAorCQkJCSAgIChpbmNsdXNpdmUpICovCisgICAgaW50CQllbXB0eTsJCS8qIG9wX3N0YXJ0IGFuZCBvcF9lbmQgdGhlIHNhbWUgKG9ubHkgdXNlZCBieQorCQkJCSAgIGRvX2NoYW5nZSgpKSAqLworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaW50CQlpc19WSXN1YWw7CS8qIG9wZXJhdG9yIG9uIFZpc3VhbCBhcmVhICovCisgICAgaW50CQlibG9ja19tb2RlOwkvKiBjdXJyZW50IG9wZXJhdG9yIGlzIFZpc3VhbCBibG9jayBtb2RlICovCisjZW5kaWYKKyAgICBjb2xucl9UCXN0YXJ0X3Zjb2w7CS8qIHN0YXJ0IGNvbCBmb3IgYmxvY2sgbW9kZSBvcGVyYXRvciAqLworICAgIGNvbG5yX1QJZW5kX3Zjb2w7CS8qIGVuZCBjb2wgZm9yIGJsb2NrIG1vZGUgb3BlcmF0b3IgKi8KK30gb3BhcmdfVDsKKworLyoKKyAqIEFyZ3VtZW50cyBmb3IgTm9ybWFsIG1vZGUgY29tbWFuZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNtZGFyZworeworICAgIG9wYXJnX1QJKm9hcDsJCS8qIE9wZXJhdG9yIGFyZ3VtZW50cyAqLworICAgIGludAkJcHJlY2hhcjsJLyogcHJlZml4IGNoYXJhY3RlciAob3B0aW9uYWwsIGFsd2F5cyAnZycpICovCisgICAgaW50CQljbWRjaGFyOwkvKiBjb21tYW5kIGNoYXJhY3RlciAqLworICAgIGludAkJbmNoYXI7CQkvKiBuZXh0IGNvbW1hbmQgY2hhcmFjdGVyIChvcHRpb25hbCkgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQluY2hhckMxOwkvKiBmaXJzdCBjb21wb3NpbmcgY2hhcmFjdGVyIChvcHRpb25hbCkgKi8KKyAgICBpbnQJCW5jaGFyQzI7CS8qIHNlY29uZCBjb21wb3NpbmcgY2hhcmFjdGVyIChvcHRpb25hbCkgKi8KKyNlbmRpZgorICAgIGludAkJZXh0cmFfY2hhcjsJLyogeWV0IGFub3RoZXIgY2hhcmFjdGVyIChvcHRpb25hbCkgKi8KKyAgICBsb25nCW9wY291bnQ7CS8qIGNvdW50IGJlZm9yZSBhbiBvcGVyYXRvciAqLworICAgIGxvbmcJY291bnQwOwkJLyogY291bnQgYmVmb3JlIGNvbW1hbmQsIGRlZmF1bHQgMCAqLworICAgIGxvbmcJY291bnQxOwkJLyogY291bnQgYmVmb3JlIGNvbW1hbmQsIGRlZmF1bHQgMSAqLworICAgIGludAkJYXJnOwkJLyogZXh0cmEgYXJndW1lbnQgZnJvbSBudl9jbWRzW10gKi8KKyAgICBpbnQJCXJldHZhbDsJCS8qIHJldHVybjogQ0FfKiB2YWx1ZXMgKi8KKyAgICBjaGFyX3UJKnNlYXJjaGJ1ZjsJLyogcmV0dXJuOiBwb2ludGVyIHRvIHNlYXJjaCBwYXR0ZXJuIG9yIE5VTEwgKi8KK30gY21kYXJnX1Q7CisKKy8qIHZhbHVlcyBmb3IgcmV0dmFsOiAqLworI2RlZmluZSBDQV9DT01NQU5EX0JVU1kJICAgIDEJLyogc2tpcCByZXN0YXJ0aW5nIGVkaXQoKSBvbmNlICovCisjZGVmaW5lIENBX05PX0FESl9PUF9FTkQgICAgMgkvKiBkb24ndCBhZGp1c3Qgb3BlcmF0b3IgZW5kICovCisKKyNpZmRlZiBDVVJTT1JfU0hBUEUKKy8qCisgKiBzdHJ1Y3QgdG8gc3RvcmUgdmFsdWVzIGZyb20gJ2d1aWN1cnNvcicgYW5kICdtb3VzZXNoYXBlJworICovCisvKiBJbmRleGVzIGluIHNoYXBlX3RhYmxlW10gKi8KKyNkZWZpbmUgU0hBUEVfSURYX04JMAkvKiBOb3JtYWwgbW9kZSAqLworI2RlZmluZSBTSEFQRV9JRFhfVgkxCS8qIFZpc3VhbCBtb2RlICovCisjZGVmaW5lIFNIQVBFX0lEWF9JCTIJLyogSW5zZXJ0IG1vZGUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX1IJMwkvKiBSZXBsYWNlIG1vZGUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX0MJNAkvKiBDb21tYW5kIGxpbmUgTm9ybWFsIG1vZGUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX0NJCTUJLyogQ29tbWFuZCBsaW5lIEluc2VydCBtb2RlICovCisjZGVmaW5lIFNIQVBFX0lEWF9DUgk2CS8qIENvbW1hbmQgbGluZSBSZXBsYWNlIG1vZGUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX08JNwkvKiBPcGVyYXRvci1wZW5kaW5nIG1vZGUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX1ZFCTgJLyogVmlzdWFsIG1vZGUgd2l0aCAnc2VsZWNpdG9uJyBleGNsdXNpdmUgKi8KKyNkZWZpbmUgU0hBUEVfSURYX0NMSU5FCTkJLyogT24gY29tbWFuZCBsaW5lICovCisjZGVmaW5lIFNIQVBFX0lEWF9TVEFUVVMgMTAJLyogQSBzdGF0dXMgbGluZSAqLworI2RlZmluZSBTSEFQRV9JRFhfU0RSQUcgMTEJLyogZHJhZ2dpbmcgYSBzdGF0dXMgbGluZSAqLworI2RlZmluZSBTSEFQRV9JRFhfVlNFUAkxMgkvKiBBIHZlcnRpY2FsIHNlcGFyYXRvciBsaW5lICovCisjZGVmaW5lIFNIQVBFX0lEWF9WRFJBRyAxMwkvKiBkcmFnZ2luZyBhIHZlcnRpY2FsIHNlcGFyYXRvciBsaW5lICovCisjZGVmaW5lIFNIQVBFX0lEWF9NT1JFCTE0CS8qIEhpdC1yZXR1cm4gb3IgTW9yZSAqLworI2RlZmluZSBTSEFQRV9JRFhfTU9SRUwJMTUJLyogSGl0LXJldHVybiBvciBNb3JlIGluIGxhc3QgbGluZSAqLworI2RlZmluZSBTSEFQRV9JRFhfU00JMTYJLyogc2hvd2luZyBtYXRjaGluZyBwYXJlbiAqLworI2RlZmluZSBTSEFQRV9JRFhfQ09VTlQJMTcKKworI2RlZmluZSBTSEFQRV9CTE9DSwkwCS8qIGJsb2NrIGN1cnNvciAqLworI2RlZmluZSBTSEFQRV9IT1IJMQkvKiBob3Jpem9udGFsIGJhciBjdXJzb3IgKi8KKyNkZWZpbmUgU0hBUEVfVkVSCTIJLyogdmVydGljYWwgYmFyIGN1cnNvciAqLworCisjZGVmaW5lIE1TSEFQRV9OVU1CRVJFRAkxMDAwCS8qIG9mZnNldCBmb3Igc2hhcGVzIGlkZW50aWZpZWQgYnkgbnVtYmVyICovCisjZGVmaW5lIE1TSEFQRV9ISURFCTEJLyogaGlkZSBtb3VzZSBwb2ludGVyICovCisKKyNkZWZpbmUgU0hBUEVfTU9VU0UJMQkvKiB1c2VkIGZvciBtb3VzZSBwb2ludGVyIHNoYXBlICovCisjZGVmaW5lIFNIQVBFX0NVUlNPUgkyCS8qIHVzZWQgZm9yIHRleHQgY3Vyc29yIHNoYXBlICovCisKK3R5cGVkZWYgc3RydWN0IGN1cnNvcl9lbnRyeQoreworICAgIGludAkJc2hhcGU7CQkvKiBvbmUgb2YgdGhlIFNIQVBFXyBkZWZpbmVzICovCisgICAgaW50CQltc2hhcGU7CQkvKiBvbmUgb2YgdGhlIE1TSEFQRSBkZWZpbmVzICovCisgICAgaW50CQlwZXJjZW50YWdlOwkvKiBwZXJjZW50YWdlIG9mIGNlbGwgZm9yIGJhciAqLworICAgIGxvbmcJYmxpbmt3YWl0OwkvKiBibGlua2luZywgd2FpdCB0aW1lIGJlZm9yZSBibGlua2luZyBzdGFydHMgKi8KKyAgICBsb25nCWJsaW5rb247CS8qIGJsaW5raW5nLCBvbiB0aW1lICovCisgICAgbG9uZwlibGlua29mZjsJLyogYmxpbmtpbmcsIG9mZiB0aW1lICovCisgICAgaW50CQlpZDsJCS8qIGhpZ2hsaWdodCBncm91cCBJRCAqLworICAgIGludAkJaWRfbG07CQkvKiBoaWdobGlnaHQgZ3JvdXAgSUQgZm9yIDpsbWFwIG1vZGUgKi8KKyAgICBjaGFyCSpuYW1lOwkJLyogbW9kZSBuYW1lIChmaXhlZCkgKi8KKyAgICBjaGFyCXVzZWRfZm9yOwkvKiBTSEFQRV9NT1VTRSBhbmQvb3IgU0hBUEVfQ1VSU09SICovCit9IGN1cnNvcmVudHJ5X1Q7CisjZW5kaWYgLyogQ1VSU09SX1NIQVBFICovCisKKyNpZmRlZiBGRUFUX01FTlUKKworLyogSW5kaWNlcyBpbnRvIHZpbW1lbnVfVC0+c3RyaW5nc1tdIGFuZCB2aW1tZW51X1QtPm5vcmVtYXBbXSBmb3IgZWFjaCBtb2RlICovCisjZGVmaW5lIE1FTlVfSU5ERVhfSU5WQUxJRAktMQorI2RlZmluZSBNRU5VX0lOREVYX05PUk1BTAkwCisjZGVmaW5lIE1FTlVfSU5ERVhfVklTVUFMCTEKKyNkZWZpbmUgTUVOVV9JTkRFWF9PUF9QRU5ESU5HCTIKKyNkZWZpbmUgTUVOVV9JTkRFWF9JTlNFUlQJMworI2RlZmluZSBNRU5VX0lOREVYX0NNRExJTkUJNAorI2RlZmluZSBNRU5VX0lOREVYX1RJUAkJNQorI2RlZmluZSBNRU5VX01PREVTCQk2CisKKy8qIE1lbnUgbW9kZXMgKi8KKyNkZWZpbmUgTUVOVV9OT1JNQUxfTU9ERQkoMSA8PCBNRU5VX0lOREVYX05PUk1BTCkKKyNkZWZpbmUgTUVOVV9WSVNVQUxfTU9ERQkoMSA8PCBNRU5VX0lOREVYX1ZJU1VBTCkKKyNkZWZpbmUgTUVOVV9PUF9QRU5ESU5HX01PREUJKDEgPDwgTUVOVV9JTkRFWF9PUF9QRU5ESU5HKQorI2RlZmluZSBNRU5VX0lOU0VSVF9NT0RFCSgxIDw8IE1FTlVfSU5ERVhfSU5TRVJUKQorI2RlZmluZSBNRU5VX0NNRExJTkVfTU9ERQkoMSA8PCBNRU5VX0lOREVYX0NNRExJTkUpCisjZGVmaW5lIE1FTlVfVElQX01PREUJCSgxIDw8IE1FTlVfSU5ERVhfVElQKQorI2RlZmluZSBNRU5VX0FMTF9NT0RFUwkJKCgxIDw8IE1FTlVfSU5ERVhfVElQKSAtIDEpCisvKm5vdGUgTUVOVV9JTkRFWF9USVAgaXMgbm90IGEgJ3JlYWwnIG1vZGUqLworCisvKiBTdGFydCBhIG1lbnUgbmFtZSB3aXRoIHRoaXMgdG8gbm90IGluY2x1ZGUgaXQgb24gdGhlIG1haW4gbWVudSBiYXIgKi8KKyNkZWZpbmUgTU5VX0hJRERFTl9DSEFSCQknXScKKwordHlwZWRlZiBzdHJ1Y3QgVmltTWVudSB2aW1tZW51X1Q7CisKK3N0cnVjdCBWaW1NZW51Cit7CisgICAgaW50CQltb2RlczsJCSAgICAvKiBXaGljaCBtb2RlcyBpcyB0aGlzIG1lbnUgdmlzaWJsZSBmb3I/ICovCisgICAgaW50CQllbmFibGVkOwkgICAgLyogZm9yIHdoaWNoIG1vZGVzIHRoZSBtZW51IGlzIGVuYWJsZWQgKi8KKyAgICBjaGFyX3UJKm5hbWU7CQkgICAgLyogTmFtZSBvZiBtZW51ICovCisgICAgY2hhcl91CSpkbmFtZTsJCSAgICAvKiBEaXNwbGF5ZWQgTmFtZSAod2l0aG91dCAnJicpICovCisgICAgaW50CQltbmVtb25pYzsJICAgIC8qIG1uZW1vbmljIGtleSAoYWZ0ZXIgJyYnKSAqLworICAgIGNoYXJfdQkqYWN0ZXh0OwkgICAgLyogYWNjZWxlcmF0b3IgdGV4dCAoYWZ0ZXIgVEFCKSAqLworICAgIGludAkJcHJpb3JpdHk7CSAgICAvKiBNZW51IG9yZGVyIHByaW9yaXR5ICovCisjaWZkZWYgRkVBVF9HVUkKKyAgICB2b2lkCSgqY2IpKCk7CSAgICAvKiBDYWxsLWJhY2sgcm91dGluZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9UT09MQkFSCisgICAgY2hhcl91CSppY29uZmlsZTsJICAgIC8qIG5hbWUgb2YgZmlsZSBmb3IgaWNvbiBvciBOVUxMICovCisgICAgaW50CQlpY29uaWR4OwkgICAgLyogaWNvbiBpbmRleCAoLTEgaWYgbm90IHNldCkgKi8KKyAgICBpbnQJCWljb25fYnVpbHRpbjsJICAgIC8qIGljb24gbmFtZXMgaXMgQnVpbHRJbntucn0gKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqc3RyaW5nc1tNRU5VX01PREVTXTsgLyogTWFwcGVkIHN0cmluZyBmb3IgZWFjaCBtb2RlICovCisgICAgaW50CQlub3JlbWFwW01FTlVfTU9ERVNdOyAvKiBBIFJFTUFQXyBmbGFnIGZvciBlYWNoIG1vZGUgKi8KKyAgICBjaGFyCXNpbGVudFtNRU5VX01PREVTXTsgLyogQSBzaWxlbnQgZmxhZyBmb3IgZWFjaCBtb2RlICovCisgICAgdmltbWVudV9UCSpjaGlsZHJlbjsJICAgIC8qIENoaWxkcmVuIG9mIHN1Yi1tZW51ICovCisgICAgdmltbWVudV9UCSpwYXJlbnQ7CSAgICAvKiBQYXJlbnQgb2YgbWVudSAqLworICAgIHZpbW1lbnVfVAkqbmV4dDsJCSAgICAvKiBOZXh0IGl0ZW0gaW4gbWVudSAqLworI2lmZGVmIEZFQVRfR1VJX1gxMQorICAgIFdpZGdldAlpZDsJCSAgICAvKiBNYW5hZ2UgdGhpcyB0byBlbmFibGUgaXRlbSAqLworICAgIFdpZGdldAlzdWJtZW51X2lkOwkgICAgLyogSWYgdGhpcyBpcyBzdWJtZW51LCBhZGQgY2hpbGRyZW4gaGVyZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfR1RLCisgICAgR3RrV2lkZ2V0CSppZDsJCSAgICAvKiBNYW5hZ2UgdGhpcyB0byBlbmFibGUgaXRlbSAqLworICAgIEd0a1dpZGdldAkqc3VibWVudV9pZDsJICAgIC8qIElmIHRoaXMgaXMgc3VibWVudSwgYWRkIGNoaWxkcmVuIGhlcmUgKi8KKyAgICBHdGtXaWRnZXQJKnRlYXJvZmZfaGFuZGxlOworICAgIEd0a1dpZGdldCAgICpsYWJlbDsJCSAgICAvKiBVc2VkIGJ5ICJzZXQgd2FrPSIgY29kZS4gKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX01PVElGCisgICAgaW50CQlzZW5zaXRpdmU7CSAgICAvKiB0dXJuIGJ1dHRvbiBvbi9vZmYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSB8fCBkZWZpbmVkKEZFQVRfR1VJX01PVElGKQorICAgIFBpeG1hcAlpbWFnZTsJCSAgICAvKiBUb29sYmFyIGltYWdlICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dVSV9NT1RJRgorICAgIFBpeG1hcAlpbWFnZV9pbnM7CSAgICAvKiBUb29sYmFyIGltYWdlIGluc2Vuc2l0aXZlICovCisjZW5kaWYKKyNpZmRlZiBGRUFUX0JFVkFMX1RJUAorICAgIEJhbGxvb25FdmFsICp0aXA7CQkgICAgLyogdG9vbHRpcCBmb3IgdGhpcyBtZW51IGl0ZW0gKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1cxNgorICAgIFVJTlQJaWQ7CQkgICAgLyogSWQgb2YgbWVudSBpdGVtICovCisgICAgSE1FTlUJc3VibWVudV9pZDsJICAgIC8qIElmIHRoaXMgaXMgc3VibWVudSwgYWRkIGNoaWxkcmVuIGhlcmUgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1czMgorICAgIFVJTlQJaWQ7CQkgICAgLyogSWQgb2YgbWVudSBpdGVtICovCisgICAgSE1FTlUJc3VibWVudV9pZDsJICAgIC8qIElmIHRoaXMgaXMgc3VibWVudSwgYWRkIGNoaWxkcmVuIGhlcmUgKi8KKyAgICBIV05ECXRlYXJvZmZfaGFuZGxlOwkgICAgLyogaFduZCBvZiB0ZWFyb2ZmIGlmIGNyZWF0ZWQgKi8KKyNlbmRpZgorI2lmIEZFQVRfR1VJX0JFT1MKKyAgICBCTWVudUl0ZW0JKmlkOwkJICAgIC8qIElkIG9mIG1lbnUgaXRlbSAqLworICAgIEJNZW51CSpzdWJtZW51X2lkOwkgICAgLyogSWYgdGhpcyBpcyBzdWJtZW51LCBhZGQgY2hpbGRyZW4gaGVyZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUlfTUFDCisvKiAgTWVudUhhbmRsZQlpZDsgKi8KKy8qICBzaG9ydAlpbmRleDsJKi8JICAgIC8qIHRoZSBpdGVtIGluZGV4IHdpdGhpbiB0aGUgZmF0aGVyIG1lbnUgKi8KKyAgICBzaG9ydAltZW51X2lkOwkgICAgLyogdGhlIG1lbnUgaWQgdG8gd2hpY2ggdGhpcyBpdGVtIGJlbG9uZyAqLworICAgIHNob3J0CXN1Ym1lbnVfaWQ7CSAgICAvKiB0aGUgbWVudSBpZCBvZiB0aGUgY2hpbGRyZW4gKGNvdWxkIGJlCisJCQkJICAgICAgIGdldCB0aHJvdWdodCBzb21lIHRyaWNrcykgKi8KKyAgICBNZW51SGFuZGxlCW1lbnVfaGFuZGxlOworICAgIE1lbnVIYW5kbGUJc3VibWVudV9oYW5kbGU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0FNSUdBKQorCQkJCSAgICAvKiBvbmx5IG9uZSBvZiB0aGVzZSB3aWxsIGV2ZXIgYmUgc2V0LCBidXQKKwkJCQkgICAgICogdGhleSBhcmUgdXNlZCB0byBhbGxvdyB0aGUgbWVudSByb3V0aW5lCisJCQkJICAgICAqIHRvIGVhc2lseSBnZXQgYSBob2xkIG9mIHRoZSBwYXJlbnQgbWVudQorCQkJCSAgICAgKiBwb2ludGVyIHdoaWNoIGlzIG5lZWRlZCBieSBhbGwgaXRlbXMgdG8KKwkJCQkgICAgICogZm9ybSB0aGUgY2hhaW4gY29ycmVjdGx5ICovCisgICAgaW50CQkgICAgaWQ7CQkgICAgLyogdW51c2VkIGJ5IHRoZSBhbWlnYSwgYnV0IHVzZWQgaW4gdGhlCisJCQkJICAgICAqIGNvZGUga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAqLworICAgIHN0cnVjdCBNZW51CSAgICAqbWVudVB0cjsKKyAgICBzdHJ1Y3QgTWVudUl0ZW0gKm1lbnVJdGVtUHRyOworI2VuZGlmCisjaWZkZWYgUklTQ09TCisgICAgaW50CQkqaWQ7CQkgICAgLyogTm90IHVzZWQsIGJ1dCBndWkuYyBuZWVkcyBpdCAqLworICAgIGludAkJZ3JleWVkX291dDsJICAgIC8qIEZsYWcgKi8KKyAgICBpbnQJCWhpZGRlbjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1BIT1RPTgorICAgIFB0V2lkZ2V0X3QJKmlkOworICAgIFB0V2lkZ2V0X3QJKnN1Ym1lbnVfaWQ7CisjZW5kaWYKK307CisjZWxzZQorLyogRm9yIGdlbmVyYXRpbmcgcHJvdG90eXBlcyB3aGVuIEZFQVRfTUVOVSBpc24ndCBkZWZpbmVkLiAqLwordHlwZWRlZiBpbnQgdmltbWVudV9UOworCisjZW5kaWYgLyogRkVBVF9NRU5VICovCisKKy8qCisgKiBTdHJ1Y3QgdG8gc2F2ZSB2YWx1ZXMgaW4gYmVmb3JlIGV4ZWN1dGluZyBhdXRvY29tbWFuZHMgZm9yIGEgYnVmZmVyIHRoYXQgaXMKKyAqIG5vdCB0aGUgY3VycmVudCBidWZmZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYnVmX1QJKnNhdmVfYnVmOwkvKiBzYXZlZCBjdXJidWYgKi8KKyAgICBidWZfVAkqbmV3X2N1cmJ1ZjsJLyogYnVmZmVyIHRvIGJlIHVzZWQgKi8KKyAgICB3aW5fVAkqc2F2ZV9jdXJ3aW47CS8qIHNhdmVkIGN1cndpbiwgTlVMTCBpZiBpdCBkaWRuJ3QgY2hhbmdlICovCisgICAgd2luX1QJKm5ld19jdXJ3aW47CS8qIG5ldyBjdXJ3aW4gaWYgc2F2ZV9jdXJ3aW4gIT0gTlVMTCAqLworICAgIHBvc19UCXNhdmVfY3Vyc29yOwkvKiBzYXZlZCBjdXJzb3IgcG9zIG9mIHNhdmVfY3Vyd2luICovCisgICAgbGluZW5yX1QJc2F2ZV90b3BsaW5lOwkvKiBzYXZlZCB0b3BsaW5lIG9mIHNhdmVfY3Vyd2luICovCisjaWZkZWYgRkVBVF9ESUZGCisgICAgaW50CQlzYXZlX3RvcGZpbGw7CS8qIHNhdmVkIHRvcGZpbGwgb2Ygc2F2ZV9jdXJ3aW4gKi8KKyNlbmRpZgorfSBhY29fc2F2ZV9UOworCisvKgorICogR2VuZXJpYyBvcHRpb24gdGFibGUgaXRlbSwgb25seSB1c2VkIGZvciBwcmludGVyIGF0IHRoZSBtb21lbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhcgkqbmFtZTsKKyAgICBpbnQJCWhhc251bTsKKyAgICBsb25nCW51bWJlcjsKKyAgICBjaGFyX3UJKnN0cmluZzsJLyogcG9pbnRzIGludG8gb3B0aW9uIHN0cmluZyAqLworICAgIGludAkJc3RybGVuOworICAgIGludAkJcHJlc2VudDsKK30gb3B0aW9uX3RhYmxlX1Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdG8gaG9sZCBwcmludGluZyBjb2xvciBhbmQgZm9udCBhdHRyaWJ1dGVzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGxvbmdfdQlmZ19jb2xvcjsKKyAgICBsb25nX3UJYmdfY29sb3I7CisgICAgaW50CQlib2xkOworICAgIGludAkJaXRhbGljOworICAgIGludAkJdW5kZXJsaW5lOworfSBwcnRfdGV4dF9hdHRyX1Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgcGFzc2VkIGJhY2sgdG8gdGhlIGdlbmVyaWMgcHJpbnRlciBjb2RlLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkJbl9jb2xsYXRlZF9jb3BpZXM7CisgICAgaW50CQluX3VuY29sbGF0ZWRfY29waWVzOworICAgIGludAkJZHVwbGV4OworICAgIGludAkJY2hhcnNfcGVyX2xpbmU7CisgICAgaW50CQlsaW5lc19wZXJfcGFnZTsKKyAgICBpbnQJCWhhc19jb2xvcjsKKyAgICBwcnRfdGV4dF9hdHRyX1QgbnVtYmVyOworI2lmZGVmIEZFQVRfU1lOX0hMCisgICAgaW50CQltb2RlYzsKKyAgICBpbnQJCWRvX3N5bnRheDsKKyNlbmRpZgorICAgIGludAkJdXNlcl9hYm9ydDsKKyAgICBjaGFyX3UJKmpvYm5hbWU7CisjaWZkZWYgRkVBVF9QT1NUU0NSSVBUCisgICAgY2hhcl91CSpvdXRmaWxlOworICAgIGNoYXJfdQkqYXJndW1lbnRzOworI2VuZGlmCit9IHBydF9zZXR0aW5nc19UOworCisjZGVmaW5lIFBSSU5UX05VTUJFUl9XSURUSCA4CmRpZmYgLS1naXQgYS9zcmMvc3dpcy5zIGIvc3JjL3N3aXMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI3NDdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N3aXMucwpAQCAtMCwwICsxLDE0MyBAQAorOyBUaG9tYXMgTGVvbmFyZAorOyAyNC81Lzk4CisKK2FyMAlybgkwCithcjEJcm4JMQorYXIyCXJuCTIKK2FyMwlybgkzCithcjQJcm4JNAorYXI1CXJuCTUKK2FyNglybgk2CithcjcJcm4JNworYXIxMAlybgkxMAorYXIxMQlybgkxMQorbGsJcm4JMTQKK2FyMTUJcm4JMTUKKworCUFSRUEJREFUQQorCWFsaWduCTQKKworCWV4cG9ydAl8cjB8CityMDoJZGNkCTAKKworCWV4cG9ydAl8cjF8CityMToJZGNkCTAKKworCWV4cG9ydAl8cjJ8CityMjoJZGNkCTAKKworCWV4cG9ydAl8cjN8CityMzoJZGNkCTAKKworCWV4cG9ydAl8cjR8CityNDoJZGNkCTAKKworCWV4cG9ydAl8cjV8CityNToJZGNkCTAKKworCWV4cG9ydAl8cjZ8CityNjoJZGNkCTAKKworCWV4cG9ydAl8cjd8CityNzoJZGNkCTAKKworCWV4cG9ydAl8dGltZV9vZl9sYXN0X3BvbGx8Cit0aW1lX29mX2xhc3RfcG9sbDogIGRjZAkwCisKKwlBUkVBCUNPREUsIFJFQURPTkxZCisJYWxpZ24gNAorCWltcG9ydAl8cjB8CisJZXhwb3J0CXxzd2l8CisJPQkic3dpIgorCWFsaWduIDQKK3N3aToKKwk7IHIwID0gc3dpIG51bWJlcgorCXN0bWZkCXNwISx7YXI0LWFyMTAsbGt9CisJb3JyCWFyMTAsYXIwLCMxPDwxNwkJO2Fsd2F5cyB1c2UgdGhlIFggZm9ybQorCW1vdglhcjAsYXIxCisJbW92CWFyMSxhcjIKKwltb3YJYXIyLGFyMworCWFkZAlhcjMsc3AsIzQqOAorCWxkbWlhCWFyMyx7YXIzLWFyN30KKwlzd2kJMHg2ZgkJOyBPU19DYWxsQVNXSQorCWxkcglhcjEwLHJlZ3NfYWRkcgorCXN0bWlhCWFyMTAse2FyMC1hcjd9CisJbGRtdmNmZAlzcCEse2FyNC1hcjEwLHBjfV4KKwk7IHJlcG9ydCB0aGUgZXJyb3IgYW5kIHF1aXQgb24gQ2FuY2VsCisJbW92CXIxLCMweDE3CisJYWRyCXIyLHNfdGl0bGUKKwlzd2kJMHg0MDBkZgkJOyBXaW1wX1JlcG9ydEVycm9yCisJY21wCXIxLCMxCQkJO09LIHNlbGVjdGVkPworCWxkbWVxZmQJc3AhLHthcjQtYXIxMCxwY31eCTt5ZXMgLSB0cnkgdG8gY29udGludWUKKwlzd2kJMHgxMQkJCTtubyAgLSBkaWUgKE9TX0V4aXQpCitzX3RpdGxlOgorCT0gIk5hc3R5IGVycm9yIC0gQ2FuY2VsIHRvIHF1aXQiCisJPSAwCisKKwlhbGlnbiA0CisJZXhwb3J0CXx4c3dpfAorCT0JInhzd2kiCisJYWxpZ24gNAoreHN3aToKKwk7IHIwID0gc3dpIG51bWJlcgorCXN0bWZkCXNwISx7YXI0LWFyMTAsbGt9CisJb3JyCWFyMTAsYXIwLCMxPDwxNwkJO2Fsd2F5cyB1c2UgdGhlIFggZm9ybQorCW1vdglhcjAsYXIxCisJbW92CWFyMSxhcjIKKwltb3YJYXIyLGFyMworCWFkZAlhcjMsc3AsIzQqOAorCWxkbWlhCWFyMyx7YXIzLWFyN30KKwlzd2kJMHg2ZgkJOyBPU19DYWxsQVNXSQorCWxkcglhcjEwLHJlZ3NfYWRkcgorCXN0bWlhCWFyMTAse2FyMC1hcjd9CisJbW92CWFyMCwjMAorCW9ycglhcjAsYXIwLGFyMTUKKwlsZG1mZAlzcCEse2FyNC1hcjEwLHBjfV4KKworcmVnc19hZGRyOgorCWRjZAlyMAorCisJOyBUaGUgV2ltcF9Qb2xsIHN3aXMgaGF2ZSB0byBiZSBkb25lIHNwZWNpYWxseSBiZWNhdXNlLAorCTsgZm9yIHNvbWUgcmVhc29uLCByMTMgc29tZXRpbWVzIGdldHMgY29ycnVwdGVkIGJ5IFdpbXBfUG9sbAorCTsgKGVnIHdoZW4gcnVubmluZyBGaWxlRmluZCkKKwlBUkVBCUNPREUsIFJFQURPTkxZCisJYWxpZ24gNAorCWltcG9ydCAgfHRpbWVfb2ZfbGFzdF9wb2xsfAorCWV4cG9ydAl8d2ltcF9wb2xsfAorCT0JIndpbXBfcG9sbCIKKwlhbGlnbiA0Cit3aW1wX3BvbGw6CisJbW92CWFyMyxzcAorCXN3aQkweDQwMGM3CQk7IFdpbXBfUG9sbAorCW1vdglzcCxhcjMKKworCW1vdglhcjMsYXIwCisJc3dpCTB4NDIJCTsgT1NfUmVhZE1vbm90b25pY1RpbWUKKwlsZHIJYXIyLGFkZHJfdGltZQorCXN0cglhcjAsW2FyMl0KKwltb3YJYXIwLGFyMworCisJbW92CWFyMiwjMAorCXdmcwlhcjIJCTsgV3JpdGUgZmxvYXRpbmcgcG9pbnQgc3RhdHVzLiBOZWVkZWQ/CisJbW92cwlwYyxsaworCisJYWxpZ24gNAorCWV4cG9ydAl8d2ltcF9wb2xsaWRsZXwKKwk9CSJ3aW1wX3BvbGxpZGxlIgorCWFsaWduIDQKK3dpbXBfcG9sbGlkbGU6CisJbW92CWFyMyxzcAorCXN3aQkweDQwMGUxCQk7IFdpbXBfUG9sbElkbGUKKwltb3YJc3AsYXIzCisKKwltb3YJYXIzLGFyMAorCXN3aQkweDQyCQk7IE9TX1JlYWRNb25vdG9uaWNUaW1lCisJbGRyCWFyMixhZGRyX3RpbWUKKwlzdHIJYXIwLFthcjJdCisJbW92CWFyMCxhcjMKKworCW1vdglhcjIsIzAKKwl3ZnMJYXIyCQk7IFdyaXRlIGZsb2F0aW5nIHBvaW50IHN0YXR1cy4gTmVlZGVkPworCW1vdnMJcGMsbGsKKworYWRkcl90aW1lOiBkY2QJdGltZV9vZl9sYXN0X3BvbGwKZGlmZiAtLWdpdCBhL3NyYy9zeW50YXguYyBiL3NyYy9zeW50YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWZmNzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N5bnRheC5jCkBAIC0wLDAgKzEsODQ1NiBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogc3ludGF4LmM6IGNvZGUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmcKKyAqLworCisjaW5jbHVkZSAidmltLmgiCisKKy8qCisgKiBTdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBoaWdobGlnaHQgZ3JvdXAuCisgKiBUaGUgSUQgb2YgYSBoaWdobGlnaHQgZ3JvdXAgaXMgYWxzbyBjYWxsZWQgZ3JvdXAgSUQuICBJdCBpcyB0aGUgaW5kZXggaW4KKyAqIHRoZSBoaWdobGlnaHRfZ2EgYXJyYXkgUExVUyBPTkUuCisgKi8KK3N0cnVjdCBobF9ncm91cAoreworICAgIGNoYXJfdQkqc2dfbmFtZTsJLyogaGlnaGxpZ2h0IGdyb3VwIG5hbWUgKi8KKyAgICBjaGFyX3UJKnNnX25hbWVfdTsJLyogdXBwZXJjYXNlIG9mIHNnX25hbWUgKi8KKy8qIGZvciBub3JtYWwgdGVybWluYWxzICovCisgICAgaW50CQlzZ190ZXJtOwkvKiAidGVybT0iIGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzICovCisgICAgY2hhcl91CSpzZ19zdGFydDsJLyogdGVybWluYWwgc3RyaW5nIGZvciBzdGFydCBoaWdobCAqLworICAgIGNoYXJfdQkqc2dfc3RvcDsJLyogdGVybWluYWwgc3RyaW5nIGZvciBzdG9wIGhpZ2hsICovCisgICAgaW50CQlzZ190ZXJtX2F0dHI7CS8qIFNjcmVlbiBhdHRyIGZvciB0ZXJtIG1vZGUgKi8KKy8qIGZvciBjb2xvciB0ZXJtaW5hbHMgKi8KKyAgICBpbnQJCXNnX2N0ZXJtOwkvKiAiY3Rlcm09IiBoaWdobGlnaHRpbmcgYXR0ciAqLworICAgIGludAkJc2dfY3Rlcm1fYm9sZDsJLyogYm9sZCBhdHRyIHdhcyBzZXQgZm9yIGxpZ2h0IGNvbG9yICovCisgICAgaW50CQlzZ19jdGVybV9mZzsJLyogdGVybWluYWwgZmcgY29sb3IgbnVtYmVyICsgMSAqLworICAgIGludAkJc2dfY3Rlcm1fYmc7CS8qIHRlcm1pbmFsIGJnIGNvbG9yIG51bWJlciArIDEgKi8KKyAgICBpbnQJCXNnX2N0ZXJtX2F0dHI7CS8qIFNjcmVlbiBhdHRyIGZvciBjb2xvciB0ZXJtIG1vZGUgKi8KKyNpZmRlZiBGRUFUX0dVSQorLyogZm9yIHdoZW4gdXNpbmcgdGhlIEdVSSAqLworICAgIGludAkJc2dfZ3VpOwkJLyogImd1aT0iIGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzICovCisgICAgZ3VpY29sb3JfVAlzZ19ndWlfZmc7CS8qIEdVSSBmb3JlZ3JvdW5kIGNvbG9yIGhhbmRsZSAqLworICAgIGNoYXJfdQkqc2dfZ3VpX2ZnX25hbWU7LyogR1VJIGZvcmVncm91bmQgY29sb3IgbmFtZSAqLworICAgIGd1aWNvbG9yX1QJc2dfZ3VpX2JnOwkvKiBHVUkgYmFja2dyb3VuZCBjb2xvciBoYW5kbGUgKi8KKyAgICBjaGFyX3UJKnNnX2d1aV9iZ19uYW1lOy8qIEdVSSBiYWNrZ3JvdW5kIGNvbG9yIG5hbWUgKi8KKyAgICBHdWlGb250CXNnX2ZvbnQ7CS8qIEdVSSBmb250IGhhbmRsZSAqLworI2lmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBHdWlGb250c2V0CXNnX2ZvbnRzZXQ7CS8qIEdVSSBmb250c2V0IGhhbmRsZSAqLworI2VuZGlmCisgICAgY2hhcl91CSpzZ19mb250X25hbWU7ICAvKiBHVUkgZm9udCBvciBmb250c2V0IG5hbWUgKi8KKyAgICBpbnQJCXNnX2d1aV9hdHRyOyAgICAvKiBTY3JlZW4gYXR0ciBmb3IgR1VJIG1vZGUgKi8KKyNlbmRpZgorICAgIGludAkJc2dfbGluazsJLyogbGluayB0byB0aGlzIGhpZ2hsaWdodCBncm91cCBJRCAqLworICAgIGludAkJc2dfc2V0OwkJLyogY29tYmluYXRpb24gb2YgU0dfKiBmbGFncyAqLworfTsKKworI2RlZmluZSBTR19URVJNCQkxCS8qIHRlcm0gaGFzIGJlZW4gc2V0ICovCisjZGVmaW5lIFNHX0NURVJNCTIJLyogY3Rlcm0gaGFzIGJlZW4gc2V0ICovCisjZGVmaW5lIFNHX0dVSQkJNAkvKiBndWkgaGFzIGJlZW4gc2V0ICovCisjZGVmaW5lIFNHX0xJTksJCTgJLyogbGluayBoYXMgYmVlbiBzZXQgKi8KKworc3RhdGljIGdhcnJheV9UIGhpZ2hsaWdodF9nYTsJLyogaGlnaGxpZ2h0IGdyb3VwcyBmb3IgJ2hpZ2hsaWdodCcgb3B0aW9uICovCisKKyNkZWZpbmUgSExfVEFCTEUoKSAoKHN0cnVjdCBobF9ncm91cCAqKSgoaGlnaGxpZ2h0X2dhLmdhX2RhdGEpKSkKKworI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorc3RhdGljIGludCBpbmNsdWRlX2RlZmF1bHQgPSBGQUxTRTsJLyogaW5jbHVkZSAiZGVmYXVsdCIgZm9yIGV4cGFuc2lvbiAqLworc3RhdGljIGludCBpbmNsdWRlX2xpbmsgPSBGQUxTRTsJLyogaW5jbHVkZSAibGluayIgZm9yIGV4cGFuc2lvbiAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgInRlcm0iLCAiY3Rlcm0iIGFuZCAiZ3VpIiBhcmd1bWVudHMgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUKKyAqIGZvbGxvd2luZyBuYW1lcywgc2VwYXJhdGVkIGJ5IGNvbW1hcyAoYnV0IG5vIHNwYWNlcyEpLgorICovCitzdGF0aWMgY2hhciAqKGhsX25hbWVfdGFibGVbXSkgPQorICAgIHsiYm9sZCIsICJzdGFuZG91dCIsICJ1bmRlcmxpbmUiLCAiaXRhbGljIiwgInJldmVyc2UiLCAiaW52ZXJzZSIsICJOT05FIn07CitzdGF0aWMgaW50IGhsX2F0dHJfdGFibGVbXSA9CisgICAge0hMX0JPTEQsIEhMX1NUQU5ET1VULCBITF9VTkRFUkxJTkUsIEhMX0lUQUxJQywgSExfSU5WRVJTRSwgSExfSU5WRVJTRSwgMH07CisKK3N0YXRpYyBpbnQgZ2V0X2F0dHJfZW50cnkgIF9fQVJHUygoZ2FycmF5X1QgKnRhYmxlLCBhdHRyZW50cnlfVCAqYWVwKSk7CitzdGF0aWMgdm9pZCBzeW5fdW5hZGRfZ3JvdXAgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzZXRfaGxfYXR0ciBfX0FSR1MoKGludCBpZHgpKTsKK3N0YXRpYyB2b2lkIGhpZ2hsaWdodF9saXN0X29uZSBfX0FSR1MoKGludCBpZCkpOworc3RhdGljIGludCBoaWdobGlnaHRfbGlzdF9hcmcgX19BUkdTKChpbnQgaWQsIGludCBkaWRoLCBpbnQgdHlwZSwgaW50IGlhcmcsIGNoYXJfdSAqc2FyZywgY2hhciAqbmFtZSkpOworc3RhdGljIGludCBzeW5fYWRkX2dyb3VwIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgaW50IHN5bl9saXN0X2hlYWRlciBfX0FSR1MoKGludCBkaWRfaGVhZGVyLCBpbnQgb3V0bGVuLCBpbnQgaWQpKTsKK3N0YXRpYyBpbnQgaGxfaGFzX3NldHRpbmdzIF9fQVJHUygoaW50IGlkeCwgaW50IGNoZWNrX2xpbmspKTsKK3N0YXRpYyB2b2lkIGhpZ2hsaWdodF9jbGVhciBfX0FSR1MoKGludCBpZHgpKTsKKworI2lmZGVmIEZFQVRfR1VJCitzdGF0aWMgdm9pZCBndWlfZG9fb25lX2NvbG9yIF9fQVJHUygoaW50IGlkeCwgaW50IGRvX21lbnUsIGludCBkb190b29sdGlwKSk7CitzdGF0aWMgaW50ICBzZXRfZ3JvdXBfY29sb3JzIF9fQVJHUygoY2hhcl91ICpuYW1lLCBndWljb2xvcl9UICpmZ3AsIGd1aWNvbG9yX1QgKmJncCwgaW50IGRvX21lbnUsIGludCB1c2Vfbm9ybSwgaW50IGRvX3Rvb2x0aXApKTsKK3N0YXRpYyBndWljb2xvcl9UIGNvbG9yX25hbWUyaGFuZGxlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgR3VpRm9udCBmb250X25hbWUyaGFuZGxlIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKK3N0YXRpYyBHdWlGb250c2V0IGZvbnRzZXRfbmFtZTJoYW5kbGUgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBmaXhlZF93aWR0aCkpOworIyBlbmRpZgorc3RhdGljIHZvaWQgaGxfZG9fZm9udCBfX0FSR1MoKGludCBpZHgsIGNoYXJfdSAqYXJnLCBpbnQgZG9fbm9ybWFsLCBpbnQgZG9fbWVudSwgaW50IGRvX3Rvb2x0aXApKTsKKyNlbmRpZgorCisvKgorICogQW4gYXR0cmlidXRlIG51bWJlciBpcyB0aGUgaW5kZXggaW4gYXR0cl90YWJsZSBwbHVzIEFUVFJfT0ZGLgorICovCisjZGVmaW5lIEFUVFJfT0ZGIChITF9BTEwgKyAxKQorCisjaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChQUk9UTykKKworI2RlZmluZSBTWU5fTkFNRUxFTgk1MAkJLyogbWF4aW11bSBsZW5ndGggb2YgYSBzeW50YXggbmFtZSAqLworCisvKiBkaWZmZXJlbnQgdHlwZXMgb2Ygb2Zmc2V0cyB0aGF0IGFyZSBwb3NzaWJsZSAqLworI2RlZmluZSBTUE9fTVNfT0ZGCTAJLyogbWF0Y2ggIHN0YXJ0IG9mZnNldCAqLworI2RlZmluZSBTUE9fTUVfT0ZGCTEJLyogbWF0Y2ggIGVuZAlvZmZzZXQgKi8KKyNkZWZpbmUgU1BPX0hTX09GRgkyCS8qIGhpZ2hsLiBzdGFydCBvZmZzZXQgKi8KKyNkZWZpbmUgU1BPX0hFX09GRgkzCS8qIGhpZ2hsLiBlbmQJb2Zmc2V0ICovCisjZGVmaW5lIFNQT19SU19PRkYJNAkvKiByZWdpb24gc3RhcnQgb2Zmc2V0ICovCisjZGVmaW5lIFNQT19SRV9PRkYJNQkvKiByZWdpb24gZW5kCW9mZnNldCAqLworI2RlZmluZSBTUE9fTENfT0ZGCTYJLyogbGVhZGluZyBjb250ZXh0IG9mZnNldCAqLworI2RlZmluZSBTUE9fQ09VTlQJNworCitzdGF0aWMgY2hhciAqKHNwb19uYW1lX3RhYltTUE9fQ09VTlRdKSA9CisJICAgIHsibXM9IiwgIm1lPSIsICJocz0iLCAiaGU9IiwgInJzPSIsICJyZT0iLCAibGM9In07CisKKy8qCisgKiBUaGUgcGF0dGVybnMgdGhhdCBhcmUgYmVpbmcgc2VhcmNoZWQgZm9yIGFyZSBzdG9yZWQgaW4gYSBzeW5fcGF0dGVybi4KKyAqIEEgbWF0Y2ggaXRlbSBjb25zaXN0cyBvZiBvbmUgcGF0dGVybi4KKyAqIEEgc3RhcnQvZW5kIGl0ZW0gY29uc2lzdHMgb2YgbiBzdGFydCBwYXR0ZXJucyBhbmQgbSBlbmQgcGF0dGVybnMuCisgKiBBIHN0YXJ0L3NraXAvZW5kIGl0ZW0gY29uc2lzdHMgb2YgbiBzdGFydCBwYXR0ZXJucywgb25lIHNraXAgcGF0dGVybiBhbmQgbQorICogZW5kIHBhdHRlcm5zLgorICogRm9yIHRoZSBsYXR0ZXIgdHdvLCB0aGUgcGF0dGVybnMgYXJlIGFsd2F5cyBjb25zZWN1dGl2ZTogc3RhcnQtc2tpcC1lbmQuCisgKgorICogQSBjaGFyYWN0ZXIgb2Zmc2V0IGNhbiBiZSBnaXZlbiBmb3IgdGhlIG1hdGNoZWQgdGV4dCAoX21fc3RhcnQgYW5kIF9tX2VuZCkKKyAqIGFuZCBmb3IgdGhlIGFjdHVhbGx5IGhpZ2hsaWdodGVkIHRleHQgKF9oX3N0YXJ0IGFuZCBfaF9lbmQpLgorICovCit0eXBlZGVmIHN0cnVjdCBzeW5fcGF0dGVybgoreworICAgIGNoYXIJIHNwX3R5cGU7CQkvKiBzZWUgU1BUWVBFXyBkZWZpbmVzIGJlbG93ICovCisgICAgY2hhcgkgc3Bfc3luY2luZzsJCS8qIHRoaXMgaXRlbSB1c2VkIGZvciBzeW5jaW5nICovCisgICAgc2hvcnQJIHNwX2ZsYWdzOwkJLyogc2VlIEhMXyBkZWZpbmVzIGJlbG93ICovCisgICAgc3RydWN0IHNwX3N5biBzcF9zeW47CQkvKiBzdHJ1Y3QgcGFzc2VkIHRvIGluX2lkX2xpc3QoKSAqLworICAgIHNob3J0CSBzcF9zeW5fbWF0Y2hfaWQ7CS8qIGhpZ2hsaWdodCBncm91cCBJRCBvZiBwYXR0ZXJuICovCisgICAgY2hhcl91CSpzcF9wYXR0ZXJuOwkJLyogcmVnZXhwIHRvIG1hdGNoLCBwYXR0ZXJuICovCisgICAgcmVncHJvZ19UCSpzcF9wcm9nOwkJLyogcmVnZXhwIHRvIG1hdGNoLCBwcm9ncmFtICovCisgICAgaW50CQkgc3BfaWM7CQkJLyogaWdub3JlLWNhc2UgZmxhZyBmb3Igc3BfcHJvZyAqLworICAgIHNob3J0CSBzcF9vZmZfZmxhZ3M7CQkvKiBzZWUgYmVsb3cgKi8KKyAgICBpbnQJCSBzcF9vZmZzZXRzW1NQT19DT1VOVF07CS8qIG9mZnNldHMgKi8KKyAgICBzaG9ydAkqc3BfY29udF9saXN0OwkJLyogY29udC4gZ3JvdXAgSURzLCBpZiBub24temVybyAqLworICAgIHNob3J0CSpzcF9uZXh0X2xpc3Q7CQkvKiBuZXh0IGdyb3VwIElEcywgaWYgbm9uLXplcm8gKi8KKyAgICBpbnQJCSBzcF9zeW5jX2lkeDsJCS8qIHN5bmMgaXRlbSBpbmRleCAoc3luY2luZyBvbmx5KSAqLworICAgIGludAkJIHNwX2xpbmVfaWQ7CQkvKiBJRCBvZiBsYXN0IGxpbmUgd2hlcmUgdHJpZWQgKi8KKyAgICBpbnQJCSBzcF9zdGFydGNvbDsJCS8qIG5leHQgbWF0Y2ggaW4gc3BfbGluZV9pZCBsaW5lICovCit9IHN5bnBhdF9UOworCisvKiBUaGUgc3Bfb2ZmX2ZsYWdzIGFyZSBjb21wdXRlZCBsaWtlIHRoaXM6CisgKiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dDogKDEgPDwgU1BPX1hYX09GRikKKyAqIG9mZnNldCBmcm9tIHRoZSBlbmQJIG9mIHRoZSBtYXRjaGVkIHRleHQ6ICgxIDw8IChTUE9fWFhfT0ZGICsgU1BPX0NPVU5UKSkKKyAqIFdoZW4gYm90aCBhcmUgcHJlc2VudCwgb25seSBvbmUgaXMgdXNlZC4KKyAqLworCisjZGVmaW5lIFNQVFlQRV9NQVRDSAkxCS8qIG1hdGNoIGtleXdvcmQgd2l0aCB0aGlzIGdyb3VwIElEICovCisjZGVmaW5lIFNQVFlQRV9TVEFSVAkyCS8qIG1hdGNoIGEgcmVnZXhwLCBzdGFydCBvZiBpdGVtICovCisjZGVmaW5lIFNQVFlQRV9FTkQJMwkvKiBtYXRjaCBhIHJlZ2V4cCwgZW5kIG9mIGl0ZW0gKi8KKyNkZWZpbmUgU1BUWVBFX1NLSVAJNAkvKiBtYXRjaCBhIHJlZ2V4cCwgc2tpcCB3aXRoaW4gaXRlbSAqLworCisjZGVmaW5lIEhMX0NPTlRBSU5FRAkweDAxCS8qIG5vdCB1c2VkIG9uIHRvcGxldmVsICovCisjZGVmaW5lIEhMX1RSQU5TUAkweDAyCS8qIGhhcyBubyBoaWdobGlnaHRpbmcJKi8KKyNkZWZpbmUgSExfT05FTElORQkweDA0CS8qIG1hdGNoIHdpdGhpbiBvbmUgbGluZSBvbmx5ICovCisjZGVmaW5lIEhMX0hBU19FT0wJMHgwOAkvKiBlbmQgcGF0dGVybiB0aGF0IG1hdGNoZXMgd2l0aCAkICovCisjZGVmaW5lIEhMX1NZTkNfSEVSRQkweDEwCS8qIHN5bmMgcG9pbnQgYWZ0ZXIgdGhpcyBpdGVtIChzeW5jaW5nIG9ubHkpICovCisjZGVmaW5lIEhMX1NZTkNfVEhFUkUJMHgyMAkvKiBzeW5jIHBvaW50IGF0IGN1cnJlbnQgbGluZSAoc3luY2luZyBvbmx5KSAqLworI2RlZmluZSBITF9NQVRDSAkweDQwCS8qIHVzZSBtYXRjaCBJRCBpbnN0ZWFkIG9mIGl0ZW0gSUQgKi8KKyNkZWZpbmUgSExfU0tJUE5MCTB4ODAJLyogbmV4dGdyb3VwIGNhbiBza2lwIG5ld2xpbmVzICovCisjZGVmaW5lIEhMX1NLSVBXSElURQkweDEwMAkvKiBuZXh0Z3JvdXAgY2FuIHNraXAgd2hpdGUgc3BhY2UgKi8KKyNkZWZpbmUgSExfU0tJUEVNUFRZCTB4MjAwCS8qIG5leHRncm91cCBjYW4gc2tpcCBlbXB0eSBsaW5lcyAqLworI2RlZmluZSBITF9LRUVQRU5ECTB4NDAwCS8qIGVuZCBtYXRjaCBhbHdheXMga2VwdCAqLworI2RlZmluZSBITF9FWENMVURFTkwJMHg4MDAJLyogZXhjbHVkZSBOTCBmcm9tIG1hdGNoICovCisjZGVmaW5lIEhMX0RJU1BMQVkJMHgxMDAwCS8qIG9ubHkgdXNlZCBmb3IgZGlzcGxheWluZywgbm90IHN5bmNpbmcgKi8KKyNkZWZpbmUgSExfRk9MRAkJMHgyMDAwCS8qIGRlZmluZSBmb2xkICovCisjZGVmaW5lIEhMX0VYVEVORAkweDQwMDAJLyogaWdub3JlIGEga2VlcGVuZCAqLworLyogVGhlc2UgZG9uJ3QgZml0IGluIGEgc2hvcnQsIHRodXMgY2FuJ3QgYmUgdXNlZCBmb3Igc3ludGF4IGl0ZW1zLCBvbmx5IGZvcgorICogc2lfZmxhZ3MgYW5kIGJzX2ZsYWdzLiAqLworI2RlZmluZSBITF9NQVRDSENPTlQJMHg4MDAwCS8qIG1hdGNoIGNvbnRpbnVlZCBmcm9tIHByZXZpb3VzIGxpbmUgKi8KKyNkZWZpbmUgSExfVFJBTlNfQ09OVAkweDEwMDAwTCAvKiB0cmFuc3BhcmVudCBpdGVtIHdpdGhvdXQgY29udGFpbnMgYXJnICovCisKKyNkZWZpbmUgU1lOX0lURU1TKGJ1ZikJKChzeW5wYXRfVCAqKSgoYnVmKS0+Yl9zeW5fcGF0dGVybnMuZ2FfZGF0YSkpCisKKyNkZWZpbmUgTk9ORV9JRFgJLTIJLyogdmFsdWUgb2Ygc3Bfc3luY19pZHggZm9yICJOT05FIiAqLworCisvKgorICogRmxhZ3MgZm9yIGJfc3luX3N5bmNfZmxhZ3M6CisgKi8KKyNkZWZpbmUgU0ZfQ0NPTU1FTlQJMHgwMQkvKiBzeW5jIG9uIGEgQy1zdHlsZSBjb21tZW50ICovCisjZGVmaW5lIFNGX01BVENICTB4MDIJLyogc3luYyBieSBtYXRjaGluZyBhIHBhdHRlcm4gKi8KKworI2RlZmluZSBTWU5fU1RBVEVfUChzc3ApICAgICgoYnVmc3RhdGVfVCAqKSgoc3NwKS0+Z2FfZGF0YSkpCisKKy8qCisgKiBTZXR0aW5ncyBmb3Iga2V5d29yZCBoYXNoIHRhYmxlLiAgSXQgdXNlcyBhIHNpbXBsaXN0aWMgaGFzaCBmdW5jdGlvbjogYWRkCisgKiBhbGwgY2hhcmFjdGVycyB0b2dldGhlciwgbW9kdWxvIEtIQVNIX1NJWkUuCisgKi8KKyNkZWZpbmUgS0hBU0hfU0laRQk1MTIKKyNkZWZpbmUgS0hBU0hfTUFTSwkoS0hBU0hfU0laRSAtIDEpCisjZGVmaW5lIE1BWEtFWVdMRU4JODAJICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIGEga2V5d29yZCAqLworCisvKgorICogVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bnRheCBpdGVtIHRoYXQgaGFzIGJlZW4gcmVjb2duaXplZC4KKyAqLworc3RhdGljIGludCBjdXJyZW50X2F0dHIgPSAwOwkgICAgLyogYXR0ciBvZiBjdXJyZW50IHN5bnRheCB3b3JkICovCisjaWZkZWYgRkVBVF9FVkFMCitzdGF0aWMgaW50IGN1cnJlbnRfaWQgPSAwOwkgICAgLyogSUQgb2YgY3VycmVudCBjaGFyIGZvciBzeW5fZ2V0X2lkKCkgKi8KK3N0YXRpYyBpbnQgY3VycmVudF90cmFuc19pZCA9IDA7ICAgIC8qIGlkZW0sIHRyYW5zcGFyYW5jeSByZW1vdmVkICovCisjZW5kaWYKKworc3RydWN0IHN5bl9jbHVzdGVyCit7CisgICAgY2hhcl91CSAgICAqc2NsX25hbWU7CSAgICAvKiBzeW50YXggY2x1c3RlciBuYW1lICovCisgICAgY2hhcl91CSAgICAqc2NsX25hbWVfdTsgICAgLyogdXBwZXJjYXNlIG9mIHNjbF9uYW1lICovCisgICAgc2hvcnQJICAgICpzY2xfbGlzdDsJICAgIC8qIElEcyBpbiB0aGlzIHN5bnRheCBjbHVzdGVyICovCit9OworCisvKgorICogTWV0aG9kcyBvZiBjb21iaW5pbmcgdHdvIGNsdXN0ZXJzCisgKi8KKyNkZWZpbmUgQ0xVU1RFUl9SRVBMQUNFCSAgICAxCS8qIHJlcGxhY2UgZmlyc3QgbGlzdCB3aXRoIHNlY29uZCAqLworI2RlZmluZSBDTFVTVEVSX0FERAkgICAgMgkvKiBhZGQgc2Vjb25kIGxpc3QgdG8gZmlyc3QgKi8KKyNkZWZpbmUgQ0xVU1RFUl9TVUJUUkFDVCAgICAzCS8qIHN1YnRyYWN0IHNlY29uZCBsaXN0IGZyb20gZmlyc3QgKi8KKworI2RlZmluZSBTWU5fQ0xTVFIoYnVmKQkoKHN0cnVjdCBzeW5fY2x1c3RlciAqKSgoYnVmKS0+Yl9zeW5fY2x1c3RlcnMuZ2FfZGF0YSkpCisKKy8qCisgKiBTeW50YXggZ3JvdXAgSURzIGhhdmUgZGlmZmVyZW50IHR5cGVzOgorICogICAgIDAgLSAgOTk5OSAgbm9ybWFsIHN5bnRheCBncm91cHMKKyAqIDEwMDAwIC0gMTQ5OTkgIEFMTEJVVCBpbmRpY2F0b3IgKGN1cnJlbnRfc3luX2luY190YWcgYWRkZWQpCisgKiAxNTAwMCAtIDE5OTk5ICBUT1AgaW5kaWNhdG9yIChjdXJyZW50X3N5bl9pbmNfdGFnIGFkZGVkKQorICogMjAwMDAgLSAyNDk5OSAgQ09OVEFJTkVEIGluZGljYXRvciAoY3VycmVudF9zeW5faW5jX3RhZyBhZGRlZCkKKyAqID49IDI1MDAwCSAgY2x1c3RlciBJRHMgKHN1YnRyYWN0IFNZTklEX0NMVVNURVIgZm9yIHRoZSBjbHVzdGVyIElEKQorICovCisjZGVmaW5lIFNZTklEX0FMTEJVVAkxMDAwMAkgICAgLyogc3ludGF4IGdyb3VwIElEIGZvciBjb250YWlucz1BTExCVVQgKi8KKyNkZWZpbmUgU1lOSURfVE9QCTE1MDAwCSAgICAvKiBzeW50YXggZ3JvdXAgSUQgZm9yIGNvbnRhaW5zPVRPUCAqLworI2RlZmluZSBTWU5JRF9DT05UQUlORUQJMjAwMDAJICAgIC8qIHN5bnRheCBncm91cCBJRCBmb3IgY29udGFpbnM9Q09OVEFJTkVEICovCisjZGVmaW5lIFNZTklEX0NMVVNURVIJMjUwMDAJICAgIC8qIGZpcnN0IHN5bnRheCBncm91cCBJRCBmb3IgY2x1c3RlcnMgKi8KKworLyoKKyAqIEFubm95aW5nIEhhY2soVE0pOiAgIjpzeW4gaW5jbHVkZSIgbmVlZHMgdGhpcyBwb2ludGVyIHRvIHBhc3MgdG8KKyAqIGV4cGFuZF9maWxlbmFtZSgpLiAgTW9zdCBvZiB0aGUgb3RoZXIgc3ludGF4IGNvbW1hbmRzIGRvbid0IG5lZWQgaXQsIHNvCisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlbSwgd2Ugc3RvdyBpdCBoZXJlLgorICovCitzdGF0aWMgY2hhcl91ICoqc3luX2NtZGxpbmVwOworCisvKgorICogQW5vdGhlciBBbm5veWluZyBIYWNrKFRNKTogIFRvIHByZXZlbnQgcnVsZXMgZnJvbSBvdGhlciAiOnN5biBpbmNsdWRlIidkCisgKiBmaWxlcyBmcm9tIGZyb20gbGVha2luZyBpbnRvIEFMTEJVVCBsaXN0cywgd2UgYXNzaWduIGEgdW5pcXVlIElEIHRvIHRoZQorICogcnVsZXMgaW4gZWFjaCAiOnN5biBpbmNsdWRlIidkIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgY3VycmVudF9zeW5faW5jX3RhZyA9IDA7CitzdGF0aWMgaW50IHJ1bm5pbmdfc3luX2luY190YWcgPSAwOworCisvKgorICogVG8gcmVkdWNlIHRoZSB0aW1lIHNwZW50IGluIGtlZXBlbmQoKSwgcmVtZW1iZXIgYXQgd2hpY2ggbGV2ZWwgaW4gdGhlIHN0YXRlCisgKiBzdGFjayB0aGUgZmlyc3QgaXRlbSB3aXRoICJrZWVwZW5kIiBpcyBwcmVzZW50LiAgV2hlbiAiLTEiLCB0aGVyZSBpcyBubworICogImtlZXBlbmQiIG9uIHRoZSBzdGFjay4KKyAqLworc3RhdGljIGludCBrZWVwZW5kX2xldmVsID0gLTE7CisKKy8qCisgKiBGb3IgdGhlIGN1cnJlbnQgc3RhdGUgd2UgbmVlZCB0byByZW1lbWJlciBtb3JlIHRoYW4ganVzdCB0aGUgaWR4LgorICogV2hlbiBzaV9tX2VuZHBvcy5sbnVtIGlzIDAsIHRoZSBpdGVtcyBvdGhlciB0aGFuIHNpX2lkeCBhcmUgdW5rbm93bi4KKyAqIChUaGUgZW5kIHBvc2l0aW9ucyBoYXZlIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBuZXh0IGNoYXIpCisgKi8KK3R5cGVkZWYgc3RydWN0IHN0YXRlX2l0ZW0KK3sKKyAgICBpbnQJCXNpX2lkeDsJCQkvKiBpbmRleCBvZiBzeW50YXggcGF0dGVybiAqLworICAgIGludAkJc2lfaWQ7CQkJLyogaGlnaGxpZ2h0IGdyb3VwIElEIGZvciBrZXl3b3JkcyAqLworICAgIGludAkJc2lfdHJhbnNfaWQ7CQkvKiBpZGVtLCB0cmFuc3BhcmFuY3kgcmVtb3ZlZCAqLworICAgIGludAkJc2lfbV9sbnVtOwkJLyogbG51bSBvZiB0aGUgbWF0Y2ggKi8KKyAgICBpbnQJCXNpX21fc3RhcnRjb2w7CQkvKiBzdGFydGluZyBjb2x1bW4gb2YgdGhlIG1hdGNoICovCisgICAgbHBvc19UCXNpX21fZW5kcG9zOwkJLyoganVzdCBhZnRlciBlbmQgcG9zbiBvZiB0aGUgbWF0Y2ggKi8KKyAgICBscG9zX1QJc2lfaF9zdGFydHBvczsJCS8qIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBoaWdobGlnaHRpbmcgKi8KKyAgICBscG9zX1QJc2lfaF9lbmRwb3M7CQkvKiBlbmQgcG9zaXRpb24gb2YgdGhlIGhpZ2hsaWdodGluZyAqLworICAgIGxwb3NfVAlzaV9lb2VfcG9zOwkJLyogZW5kIHBvc2l0aW9uIG9mIGVuZCBwYXR0ZXJuICovCisgICAgaW50CQlzaV9lbmRfaWR4OwkJLyogZ3JvdXAgSUQgZm9yIGVuZCBwYXR0ZXJuIG9yIHplcm8gKi8KKyAgICBpbnQJCXNpX2VuZHM7CQkvKiBpZiBtYXRjaCBlbmRzIGJlZm9yZSBzaV9tX2VuZHBvcyAqLworICAgIGludAkJc2lfYXR0cjsJCS8qIGF0dHJpYnV0ZXMgaW4gdGhpcyBzdGF0ZSAqLworICAgIGxvbmcJc2lfZmxhZ3M7CQkvKiBITF9IQVNfRU9MIGZsYWcgaW4gdGhpcyBzdGF0ZSwgYW5kCisJCQkJCSAqIEhMX1NLSVAqIGZvciBzaV9uZXh0X2xpc3QgKi8KKyAgICBzaG9ydAkqc2lfY29udF9saXN0OwkJLyogbGlzdCBvZiBjb250YWluZWQgZ3JvdXBzICovCisgICAgc2hvcnQJKnNpX25leHRfbGlzdDsJCS8qIG5leHRncm91cCBJRHMgYWZ0ZXIgdGhpcyBpdGVtIGVuZHMgKi8KKyAgICByZWdfZXh0bWF0Y2hfVCAqc2lfZXh0bWF0Y2g7CS8qIFx6KC4uLlwpIG1hdGNoZXMgZnJvbSBzdGFydAorCQkJCQkgKiBwYXR0ZXJuICovCit9IHN0YXRlaXRlbV9UOworCisjZGVmaW5lIEtFWVdPUkRfSURYCS0xCSAgICAvKiB2YWx1ZSBvZiBzaV9pZHggZm9yIGtleXdvcmRzICovCisjZGVmaW5lIElEX0xJU1RfQUxMCShzaG9ydCAqKS0xIC8qIHZhbGlkIG9mIHNpX2NvbnRfbGlzdCBmb3IgY29udGFpbmluZyBhbGwKKwkJCQkgICAgICAgYnV0IGNvbnRhaW5lZCBncm91cHMgKi8KKworLyoKKyAqIFRoZSBuZXh0IHBvc3NpYmxlIG1hdGNoIGluIHRoZSBjdXJyZW50IGxpbmUgZm9yIGFueSBwYXR0ZXJuIGlzIHJlbWVtYmVyZWQsCisgKiB0byBhdm9pZCBoYXZpbmcgdG8gdHJ5IGZvciBhIG1hdGNoIGluIGVhY2ggY29sdW1uLgorICogSWYgbmV4dF9tYXRjaF9pZHggPT0gLTEsIG5vdCB0cmllZCAoaW4gdGhpcyBsaW5lKSB5ZXQuCisgKiBJZiBuZXh0X21hdGNoX2NvbCA9PSBNQVhDT0wsIG5vIG1hdGNoIGZvdW5kIGluIHRoaXMgbGluZS4KKyAqIChBbGwgZW5kIHBvc2l0aW9ucyBoYXZlIHRoZSBjb2x1bW4gb2YgdGhlIGNoYXIgYWZ0ZXIgdGhlIGVuZCkKKyAqLworc3RhdGljIGludCBuZXh0X21hdGNoX2NvbDsJCS8qIGNvbHVtbiBmb3Igc3RhcnQgb2YgbmV4dCBtYXRjaCAqLworc3RhdGljIGxwb3NfVCBuZXh0X21hdGNoX21fZW5kcG9zOwkvKiBwb3NpdGlvbiBmb3IgZW5kIG9mIG5leHQgbWF0Y2ggKi8KK3N0YXRpYyBscG9zX1QgbmV4dF9tYXRjaF9oX3N0YXJ0cG9zOyAgLyogcG9zLiBmb3IgaGlnaGwuIHN0YXJ0IG9mIG5leHQgbWF0Y2ggKi8KK3N0YXRpYyBscG9zX1QgbmV4dF9tYXRjaF9oX2VuZHBvczsJLyogcG9zLiBmb3IgaGlnaGwuIGVuZCBvZiBuZXh0IG1hdGNoICovCitzdGF0aWMgaW50IG5leHRfbWF0Y2hfaWR4OwkJLyogaW5kZXggb2YgbWF0Y2hlZCBpdGVtICovCitzdGF0aWMgbG9uZyBuZXh0X21hdGNoX2ZsYWdzOwkJLyogZmxhZ3MgZm9yIG5leHQgbWF0Y2ggKi8KK3N0YXRpYyBscG9zX1QgbmV4dF9tYXRjaF9lb3NfcG9zOwkvKiBlbmQgb2Ygc3RhcnQgcGF0dG4gKHN0YXJ0IHJlZ2lvbikgKi8KK3N0YXRpYyBscG9zX1QgbmV4dF9tYXRjaF9lb2VfcG9zOwkvKiBwb3MuIGZvciBlbmQgb2YgZW5kIHBhdHRlcm4gKi8KK3N0YXRpYyBpbnQgbmV4dF9tYXRjaF9lbmRfaWR4OwkJLyogSUQgb2YgZ3JvdXAgZm9yIGVuZCBwYXR0biBvciB6ZXJvICovCitzdGF0aWMgcmVnX2V4dG1hdGNoX1QgKm5leHRfbWF0Y2hfZXh0bWF0Y2ggPSBOVUxMOworCisvKgorICogQSBzdGF0ZSBzdGFjayBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycyBvciBzdGF0ZWl0ZW1fVCwgc3RvcmVkIGluIGEKKyAqIGdhcnJheV9ULiAgQSBzdGF0ZSBzdGFjayBpcyBpbnZhbGlkIGlmIGl0J3MgaXRlbXNpemUgZW50cnkgaXMgemVyby4KKyAqLworI2RlZmluZSBJTlZBTElEX1NUQVRFKHNzcCkgICgoc3NwKS0+Z2FfaXRlbXNpemUgPT0gMCkKKyNkZWZpbmUgVkFMSURfU1RBVEUoc3NwKSAgICAoKHNzcCktPmdhX2l0ZW1zaXplICE9IDApCisKKy8qCisgKiBUaGUgY3VycmVudCBzdGF0ZSAod2l0aGluIHRoZSBsaW5lKSBvZiB0aGUgcmVjb2duaXRpb24gZW5naW5lLgorICogV2hlbiBjdXJyZW50X3N0YXRlLmdhX2l0ZW1zaXplIGlzIDAgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW52YWxpZC4KKyAqLworc3RhdGljIHdpbl9UCSpzeW5fd2luOwkJLyogY3VycmVudCB3aW5kb3cgZm9yIGhpZ2hsaWdodGluZyAqLworc3RhdGljIGJ1Zl9UCSpzeW5fYnVmOwkJLyogY3VycmVudCBidWZmZXIgZm9yIGhpZ2hsaWdodGluZyAqLworc3RhdGljIGxpbmVucl9UIGN1cnJlbnRfbG51bSA9IDA7CS8qIGxudW0gb2YgY3VycmVudCBzdGF0ZSAqLworc3RhdGljIGNvbG5yX1QJY3VycmVudF9jb2wgPSAwOwkvKiBjb2x1bW4gb2YgY3VycmVudCBzdGF0ZSAqLworc3RhdGljIGludAljdXJyZW50X3N0YXRlX3N0b3JlZCA9IDA7IC8qIFRSVUUgaWYgc3RvcmVkIGN1cnJlbnQgc3RhdGUKKwkJCQkJICAgKiBhZnRlciBzZXR0aW5nIGN1cnJlbnRfZmluaXNoZWQgKi8KK3N0YXRpYyBpbnQJY3VycmVudF9maW5pc2hlZCA9IDA7CS8qIGN1cnJlbnQgbGluZSBoYXMgYmVlbiBmaW5pc2hlZCAqLworc3RhdGljIGdhcnJheV9UIGN1cnJlbnRfc3RhdGUJCS8qIGN1cnJlbnQgc3RhY2sgb2Ygc3RhdGVfaXRlbXMgKi8KKwkJPSB7MCwgMCwgMCwgMCwgTlVMTH07CitzdGF0aWMgc2hvcnQJKmN1cnJlbnRfbmV4dF9saXN0ID0gTlVMTDsgLyogd2hlbiBub24temVybywgbmV4dGdyb3VwIGxpc3QgKi8KK3N0YXRpYyBpbnQJY3VycmVudF9uZXh0X2ZsYWdzID0gMDsgLyogZmxhZ3MgZm9yIGN1cnJlbnRfbmV4dF9saXN0ICovCitzdGF0aWMgaW50CWN1cnJlbnRfbGluZV9pZCA9IDA7CS8qIHVuaXF1ZSBudW1iZXIgZm9yIGN1cnJlbnQgbGluZSAqLworCisjZGVmaW5lIENVUl9TVEFURShpZHgpCSgoc3RhdGVpdGVtX1QgKikoY3VycmVudF9zdGF0ZS5nYV9kYXRhKSlbaWR4XQorCitzdGF0aWMgdm9pZCBzeW5fc3luYyBfX0FSR1MoKHdpbl9UICp3cCwgbGluZW5yX1QgbG51bSwgc3luc3RhdGVfVCAqbGFzdF92YWxpZCkpOworc3RhdGljIGludCBzeW5fbWF0Y2hfbGluZWNvbnQgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7CitzdGF0aWMgdm9pZCBzeW5fc3RhcnRfbGluZSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHN5bl91cGRhdGVfZW5kcyBfX0FSR1MoKGludCBzdGFydG9mbGluZSkpOworc3RhdGljIHZvaWQgc3luX3N0YWNrX2FsbG9jIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBzeW5fc3RhY2tfY2xlYW51cCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHN5bl9zdGFja19mcmVlX2VudHJ5IF9fQVJHUygoYnVmX1QgKmJ1Ziwgc3luc3RhdGVfVCAqcCkpOworc3RhdGljIHN5bnN0YXRlX1QgKnN5bl9zdGFja19maW5kX2VudHJ5IF9fQVJHUygobGluZW5yX1QgbG51bSkpOworc3RhdGljIHN5bnN0YXRlX1QgKnN0b3JlX2N1cnJlbnRfc3RhdGUgX19BUkdTKChzeW5zdGF0ZV9UICpzcCkpOworc3RhdGljIHZvaWQgbG9hZF9jdXJyZW50X3N0YXRlIF9fQVJHUygoc3luc3RhdGVfVCAqZnJvbSkpOworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9jdXJyZW50X3N0YXRlIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBzeW5fc3RhY2tfZXF1YWwgX19BUkdTKChzeW5zdGF0ZV9UICpzcCkpOworc3RhdGljIHZvaWQgdmFsaWRhdGVfY3VycmVudF9zdGF0ZSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgc3luX2ZpbmlzaF9saW5lIF9fQVJHUygoaW50IHN5bmNpbmcpKTsKK3N0YXRpYyBpbnQgc3luX2N1cnJlbnRfYXR0ciBfX0FSR1MoKGludCBzeW5jaW5nLCBpbnQgZGlzcGxheWluZykpOworc3RhdGljIGludCBkaWRfbWF0Y2hfYWxyZWFkeSBfX0FSR1MoKGludCBpZHgsIGdhcnJheV9UICpnYXApKTsKK3N0YXRpYyBzdGF0ZWl0ZW1fVCAqcHVzaF9uZXh0X21hdGNoIF9fQVJHUygoc3RhdGVpdGVtX1QgKmN1cl9zaSkpOworc3RhdGljIHZvaWQgY2hlY2tfc3RhdGVfZW5kcyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zaV9hdHRyIF9fQVJHUygoaW50IGlkeCkpOworc3RhdGljIHZvaWQgY2hlY2tfa2VlcGVuZCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zaV9lbmQgX19BUkdTKChzdGF0ZWl0ZW1fVCAqc2lwLCBpbnQgc3RhcnRjb2wsIGludCBmb3JjZSkpOworc3RhdGljIHNob3J0ICpjb3B5X2lkX2xpc3QgX19BUkdTKChzaG9ydCAqbGlzdCkpOworc3RhdGljIGludCBpbl9pZF9saXN0IF9fQVJHUygoc3RhdGVpdGVtX1QgKml0ZW0sIHNob3J0ICpjb250X2xpc3QsIHN0cnVjdCBzcF9zeW4gKnNzcCwgaW50IGNvbnRhaW5lZCkpOworc3RhdGljIGludCBwdXNoX2N1cnJlbnRfc3RhdGUgX19BUkdTKChpbnQgaWR4KSk7CitzdGF0aWMgdm9pZCBwb3BfY3VycmVudF9zdGF0ZSBfX0FSR1MoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgZmluZF9lbmRwb3MgX19BUkdTKChpbnQgaWR4LCBscG9zX1QgKnN0YXJ0cG9zLCBscG9zX1QgKm1fZW5kcG9zLCBscG9zX1QgKmhsX2VuZHBvcywgbG9uZyAqZmxhZ3NwLCBscG9zX1QgKmVuZF9lbmRwb3MsIGludCAqZW5kX2lkeCwgcmVnX2V4dG1hdGNoX1QgKnN0YXJ0X2V4dCkpOworc3RhdGljIHZvaWQgY2xlYXJfc3luX3N0YXRlIF9fQVJHUygoc3luc3RhdGVfVCAqcCkpOworc3RhdGljIHZvaWQgY2xlYXJfY3VycmVudF9zdGF0ZSBfX0FSR1MoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgbGltaXRfcG9zIF9fQVJHUygobHBvc19UICpwb3MsIGxwb3NfVCAqbGltaXQpKTsKK3N0YXRpYyB2b2lkIGxpbWl0X3Bvc196ZXJvIF9fQVJHUygobHBvc19UICpwb3MsIGxwb3NfVCAqbGltaXQpKTsKK3N0YXRpYyB2b2lkIHN5bl9hZGRfZW5kX29mZiBfX0FSR1MoKGxwb3NfVCAqcmVzdWx0LCByZWdtbWF0Y2hfVCAqcmVnbWF0Y2gsIHN5bnBhdF9UICpzcHAsIGludCBpZHgsIGludCBleHRyYSkpOworc3RhdGljIHZvaWQgc3luX2FkZF9zdGFydF9vZmYgX19BUkdTKChscG9zX1QgKnJlc3VsdCwgcmVnbW1hdGNoX1QgKnJlZ21hdGNoLCBzeW5wYXRfVCAqc3BwLCBpbnQgaWR4LCBpbnQgZXh0cmEpKTsKK3N0YXRpYyBjaGFyX3UgKnN5bl9nZXRjdXJsaW5lIF9fQVJHUygodm9pZCkpOworc3RhdGljIGludCBzeW5fcmVnZXhlYyBfX0FSR1MoKHJlZ21tYXRjaF9UICpybXAsIGxpbmVucl9UIGxudW0sIGNvbG5yX1QgY29sKSk7CitzdGF0aWMgaW50IGNoZWNrX2tleXdvcmRfaWQgX19BUkdTKChjaGFyX3UgKmxpbmUsIGludCBzdGFydGNvbCwgaW50ICplbmRjb2wsIGxvbmcgKmZsYWdzLCBzaG9ydCAqKm5leHRfbGlzdCwgc3RhdGVpdGVtX1QgKmN1cl9zaSkpOworc3RhdGljIHZvaWQgc3luX2NtZF9jYXNlIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgc3luY2luZykpOworc3RhdGljIHZvaWQgc3ludGF4X3N5bmNfY2xlYXIgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzeW5fcmVtb3ZlX3BhdHRlcm4gX19BUkdTKChidWZfVCAqYnVmLCBpbnQgaWR4KSk7CitzdGF0aWMgdm9pZCBzeW5fY2xlYXJfcGF0dGVybiBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBpKSk7CitzdGF0aWMgdm9pZCBzeW5fY2xlYXJfY2x1c3RlciBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBpKSk7CitzdGF0aWMgdm9pZCBzeW5fY21kX2NsZWFyIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgc3luY2luZykpOworc3RhdGljIHZvaWQgc3luX2NsZWFyX29uZSBfX0FSR1MoKGludCBpZCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfb24gX19BUkdTKChleGFyZ19UICplYXAsIGludCBzeW5jaW5nKSk7CitzdGF0aWMgdm9pZCBzeW5fY21kX2VuYWJsZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfcmVzZXQgX19BUkdTKChleGFyZ19UICplYXAsIGludCBzeW5jaW5nKSk7CitzdGF0aWMgdm9pZCBzeW5fY21kX21hbnVhbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfb2ZmIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgc3luY2luZykpOworc3RhdGljIHZvaWQgc3luX2NtZF9vbm9mZiBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgY2hhciAqbmFtZSkpOworc3RhdGljIHZvaWQgc3luX2NtZF9saXN0IF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgc3luY2luZykpOworc3RhdGljIHZvaWQgc3luX2xpbmVzX21zZyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHN5bl9tYXRjaF9tc2cgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzeW5fbGlzdF9vbmUgX19BUkdTKChpbnQgaWQsIGludCBzeW5jaW5nLCBpbnQgbGlua19vbmx5KSk7CitzdGF0aWMgdm9pZCBzeW5fbGlzdF9jbHVzdGVyIF9fQVJHUygoaW50IGlkKSk7CitzdGF0aWMgdm9pZCBwdXRfaWRfbGlzdCBfX0FSR1MoKGNoYXJfdSAqbmFtZSwgc2hvcnQgKmxpc3QsIGludCBhdHRyKSk7CitzdGF0aWMgdm9pZCBwdXRfcGF0dGVybiBfX0FSR1MoKGNoYXIgKnMsIGludCBjLCBzeW5wYXRfVCAqc3BwLCBpbnQgYXR0cikpOworc3RhdGljIGludCBzeW5fbGlzdF9rZXl3b3JkcyBfX0FSR1MoKGludCBpZCwga2V5ZW50cnlfVCAqKmt0YWJwLCBpbnQgZGlkX2hlYWRlciwgaW50IGF0dHIpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbGVhcl9rZXl3b3JkIF9fQVJHUygoaW50IGlkLCBrZXllbnRyeV9UICoqa3RhYnApKTsKK3N0YXRpYyB2b2lkIGZyZWVfa2V5d3RhYiBfX0FSR1MoKGtleWVudHJ5X1QgKiprdGFicCkpOworc3RhdGljIHZvaWQgYWRkX2tleXdvcmQgX19BUkdTKChjaGFyX3UgKm5hbWUsIGludCBpZCwgaW50IGZsYWdzLCBzaG9ydCAqY29udF9pbl9saXN0LCBzaG9ydCAqbmV4dF9saXN0KSk7CitzdGF0aWMgaW50IHN5bl9raGFzaCBfX0FSR1MoKGNoYXJfdSAqcCkpOworc3RhdGljIGNoYXJfdSAqZ2V0X2dyb3VwX25hbWUgX19BUkdTKChjaGFyX3UgKmFyZywgY2hhcl91ICoqbmFtZV9lbmQpKTsKK3N0YXRpYyBjaGFyX3UgKmdldF9zeW5fb3B0aW9ucyBfX0FSR1MoKGNoYXJfdSAqYXJnLCBpbnQgKmZsYWdzcCwgaW50IGtleXdvcmQsIGludCAqc3luY19pZHgsIHNob3J0ICoqY29udF9saXN0LCBzaG9ydCAqKmNvbnRfaW5fbGlzdCwgc2hvcnQgKipuZXh0X2xpc3QpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfaW5jbHVkZSBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfa2V5d29yZCBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyB2b2lkIHN5bl9jbWRfbWF0Y2ggX19BUkdTKChleGFyZ19UICplYXAsIGludCBzeW5jaW5nKSk7CitzdGF0aWMgdm9pZCBzeW5fY21kX3JlZ2lvbiBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKKyNpZmRlZiBfX0JPUkxBTkRDX18KK3N0YXRpYyBpbnQgX1JUTEVOVFJZRiBzeW5fY29tcGFyZV9zdHViIF9fQVJHUygoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKSk7CisjZWxzZQorc3RhdGljIGludCBzeW5fY29tcGFyZV9zdHViIF9fQVJHUygoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHN5bl9jbWRfY2x1c3RlciBfX0FSR1MoKGV4YXJnX1QgKmVhcCwgaW50IHN5bmNpbmcpKTsKK3N0YXRpYyBpbnQgc3luX3NjbF9uYW1lMmlkIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgaW50IHN5bl9zY2xfbmFtZW4yaWQgX19BUkdTKChjaGFyX3UgKmxpbmVwLCBpbnQgbGVuKSk7CitzdGF0aWMgaW50IHN5bl9jaGVja19jbHVzdGVyIF9fQVJHUygoY2hhcl91ICpwcCwgaW50IGxlbikpOworc3RhdGljIGludCBzeW5fYWRkX2NsdXN0ZXIgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIGluaXRfc3luX3BhdHRlcm5zIF9fQVJHUygodm9pZCkpOworc3RhdGljIGNoYXJfdSAqZ2V0X3N5bl9wYXR0ZXJuIF9fQVJHUygoY2hhcl91ICphcmcsIHN5bnBhdF9UICpjaSkpOworc3RhdGljIHZvaWQgc3luX2NtZF9zeW5jIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBpbnQgc3luY2luZykpOworc3RhdGljIGludCBnZXRfaWRfbGlzdCBfX0FSR1MoKGNoYXJfdSAqKmFyZywgaW50IGtleWxlbiwgc2hvcnQgKipsaXN0KSk7CitzdGF0aWMgdm9pZCBzeW5fY29tYmluZV9saXN0IF9fQVJHUygoc2hvcnQgKipjbHN0cjEsIHNob3J0ICoqY2xzdHIyLCBpbnQgbGlzdF9vcCkpOworc3RhdGljIHZvaWQgc3luX2luY2xfdG9wbGV2ZWwgX19BUkdTKChpbnQgaWQsIGludCAqZmxhZ3NwKSk7CisKKy8qCisgKiBTdGFydCB0aGUgc3ludGF4IHJlY29nbml0aW9uIGZvciBhIGxpbmUuICBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IGNhbGxlZAorICogZnJvbSB0aGUgc2NyZWVuIHVwZGF0aW5nLCBvbmNlIGZvciBlYWNoIGRpc3BsYXllZCBsaW5lLgorICogVGhlIGJ1ZmZlciBpcyByZW1lbWJlcmVkIGluIHN5bl9idWYsIGJlY2F1c2UgZ2V0X3N5bnRheF9hdHRyKCkgZG9lc24ndCBnZXQKKyAqIGl0LglDYXJlZnVsOiBjdXJidWYgYW5kIGN1cndpbiBhcmUgbGlrZWx5IHRvIHBvaW50IHRvIGFub3RoZXIgYnVmZmVyIGFuZAorICogd2luZG93LgorICovCisgICAgdm9pZAorc3ludGF4X3N0YXJ0KHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHN5bnN0YXRlX1QJKnA7CisgICAgc3luc3RhdGVfVAkqbGFzdF92YWxpZCA9IE5VTEw7CisgICAgc3luc3RhdGVfVAkqbGFzdF9taW5fdmFsaWQgPSBOVUxMOworICAgIHN5bnN0YXRlX1QJKnNwLCAqcHJldjsKKyAgICBsaW5lbnJfVAlwYXJzZWRfbG51bTsKKyAgICBsaW5lbnJfVAlmaXJzdF9zdG9yZWQ7CisgICAgaW50CQlkaXN0OworCisgICAgcmVnX3N5biA9IFRSVUU7CS8qIGxldCB2aW1fcmVnZXhlYygpIGtub3cgd2UncmUgdXNpbmcgc3ludGF4ICovCisKKyAgICAvKgorICAgICAqIEFmdGVyIHN3aXRjaGluZyBidWZmZXJzLCBpbnZhbGlkYXRlIGN1cnJlbnRfc3RhdGUuCisgICAgICovCisgICAgaWYgKHN5bl9idWYgIT0gd3AtPndfYnVmZmVyKQorICAgIHsKKwlpbnZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKKwlzeW5fYnVmID0gd3AtPndfYnVmZmVyOworICAgIH0KKyAgICBzeW5fd2luID0gd3A7CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIHN5bnRheCBzdGFjayB3aGVuIG5lZWRlZC4KKyAgICAgKi8KKyAgICBzeW5fc3RhY2tfYWxsb2MoKTsKKyAgICBpZiAoc3luX2J1Zi0+Yl9zc3RfYXJyYXkgPT0gTlVMTCkKKwlnb3RvIHRoZWVuZDsJCS8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICBzeW5fYnVmLT5iX3NzdF9sYXN0dGljayA9IGRpc3BsYXlfdGljazsKKworICAgIC8qCisgICAgICogSWYgdGhlIHN0YXRlIG9mIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGxpbmUgaXMgdXNlZnVsLCBzdG9yZSBpdC4KKyAgICAgKi8KKyAgICBpZiAoVkFMSURfU1RBVEUoJmN1cnJlbnRfc3RhdGUpCisJICAgICYmIGN1cnJlbnRfbG51bSA8IGxudW0KKwkgICAgJiYgY3VycmVudF9sbnVtIDwgc3luX2J1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorICAgIHsKKwkodm9pZClzeW5fZmluaXNoX2xpbmUoRkFMU0UpOworCWlmICghY3VycmVudF9zdGF0ZV9zdG9yZWQpCisJeworCSAgICArK2N1cnJlbnRfbG51bTsKKwkgICAgKHZvaWQpc3RvcmVfY3VycmVudF9zdGF0ZShOVUxMKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50X2xudW0gaXMgbm93IHRoZSBzYW1lIGFzICJsbnVtIiwga2VlcCB0aGUgY3VycmVudAorCSAqIHN0YXRlICh0aGlzIGhhcHBlbnMgdmVyeSBvZnRlbiEpLiAgT3RoZXJ3aXNlIGludmFsaWRhdGUKKwkgKiBjdXJyZW50X3N0YXRlIGFuZCBmaWd1cmUgaXQgb3V0IGJlbG93LgorCSAqLworCWlmIChjdXJyZW50X2xudW0gIT0gbG51bSkKKwkgICAgaW52YWxpZGF0ZV9jdXJyZW50X3N0YXRlKCk7CisgICAgfQorICAgIGVsc2UKKwlpbnZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKKworICAgIC8qCisgICAgICogVHJ5IHRvIHN5bmNocm9uaXplIGZyb20gYSBzYXZlZCBzdGF0ZSBpbiBiX3NzdF9hcnJheVtdLgorICAgICAqIE9ubHkgZG8gdGhpcyBpZiBsbnVtIGlzIG5vdCBiZWZvcmUgYW5kIG5vdCB0byBmYXIgYmV5b25kIGEgc2F2ZWQgc3RhdGUuCisgICAgICovCisgICAgaWYgKElOVkFMSURfU1RBVEUoJmN1cnJlbnRfc3RhdGUpICYmIHN5bl9idWYtPmJfc3N0X2FycmF5ICE9IE5VTEwpCisgICAgeworCS8qIEZpbmQgbGFzdCB2YWxpZCBzYXZlZCBzdGF0ZSBiZWZvcmUgc3RhcnRfbG51bS4gKi8KKwlmb3IgKHAgPSBzeW5fYnVmLT5iX3NzdF9maXJzdDsgcCAhPSBOVUxMOyBwID0gcC0+c3N0X25leHQpCisJeworCSAgICBpZiAocC0+c3N0X2xudW0gPiBsbnVtKQorCQlicmVhazsKKwkgICAgaWYgKHAtPnNzdF9sbnVtIDw9IGxudW0gJiYgcC0+c3N0X2NoYW5nZV9sbnVtID09IDApCisJICAgIHsKKwkJbGFzdF92YWxpZCA9IHA7CisJCWlmIChwLT5zc3RfbG51bSA+PSBsbnVtIC0gc3luX2J1Zi0+Yl9zeW5fc3luY19taW5saW5lcykKKwkJICAgIGxhc3RfbWluX3ZhbGlkID0gcDsKKwkgICAgfQorCX0KKwlpZiAobGFzdF9taW5fdmFsaWQgIT0gTlVMTCkKKwkgICAgbG9hZF9jdXJyZW50X3N0YXRlKGxhc3RfbWluX3ZhbGlkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmICJsbnVtIiBpcyBiZWZvcmUgb3IgZmFyIGJleW9uZCBhIGxpbmUgd2l0aCBhIHNhdmVkIHN0YXRlLCBuZWVkIHRvCisgICAgICogcmUtc3luY2hyb25pemUuCisgICAgICovCisgICAgaWYgKElOVkFMSURfU1RBVEUoJmN1cnJlbnRfc3RhdGUpKQorICAgIHsKKwlzeW5fc3luYyh3cCwgbG51bSwgbGFzdF92YWxpZCk7CisJZmlyc3Rfc3RvcmVkID0gY3VycmVudF9sbnVtICsgc3luX2J1Zi0+Yl9zeW5fc3luY19taW5saW5lczsKKyAgICB9CisgICAgZWxzZQorCWZpcnN0X3N0b3JlZCA9IGN1cnJlbnRfbG51bTsKKworICAgIC8qCisgICAgICogQWR2YW5jZSBmcm9tIHRoZSBzeW5jIHBvaW50IG9yIHNhdmVkIHN0YXRlIHVudGlsIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICogU2F2ZSBzb21lIGVudHJpZXMgZm9yIHN5bmNpbmcgd2l0aCBsYXRlciBvbi4KKyAgICAgKi8KKyAgICBkaXN0ID0gc3luX2J1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC8gKHN5bl9idWYtPmJfc3N0X2xlbiAtIFJvd3MpICsgMTsKKyAgICBwcmV2ID0gc3luX3N0YWNrX2ZpbmRfZW50cnkoY3VycmVudF9sbnVtKTsKKyAgICB3aGlsZSAoY3VycmVudF9sbnVtIDwgbG51bSkKKyAgICB7CisJc3luX3N0YXJ0X2xpbmUoKTsKKwkodm9pZClzeW5fZmluaXNoX2xpbmUoRkFMU0UpOworCSsrY3VycmVudF9sbnVtOworCisJLyogSWYgd2UgcGFyc2VkIGF0IGxlYXN0ICJtaW5saW5lcyIgbGluZXMgb3Igc3RhcnRlZCBhdCBhIHZhbGlkCisJICogc3RhdGUsIHRoZSBjdXJyZW50IHN0YXRlIGlzIGNvbnNpZGVyZWQgdmFsaWQuICovCisJaWYgKGN1cnJlbnRfbG51bSA+PSBmaXJzdF9zdG9yZWQpCisJeworCSAgICAvKiBDaGVjayBpZiB0aGUgc2F2ZWQgc3RhdGUgZW50cnkgaXMgZm9yIHRoZSBjdXJyZW50IGxpbmUgYW5kIGlzCisJICAgICAqIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN0YXRlLiAgSWYgc28sIHRoZW4gdmFsaWRhdGUgYWxsIHNhdmVkCisJICAgICAqIHN0YXRlcyB0aGF0IGRlcGVuZGVkIG9uIGEgY2hhbmdlIGJlZm9yZSB0aGUgcGFyc2VkIGxpbmUuICovCisJICAgIGlmIChwcmV2ID09IE5VTEwpCisJCXNwID0gc3luX2J1Zi0+Yl9zc3RfZmlyc3Q7CisJICAgIGVsc2UKKwkJc3AgPSBwcmV2LT5zc3RfbmV4dDsKKwkgICAgaWYgKHNwICE9IE5VTEwKKwkJICAgICYmIHNwLT5zc3RfbG51bSA9PSBjdXJyZW50X2xudW0KKwkJICAgICYmIHN5bl9zdGFja19lcXVhbChzcCkpCisJICAgIHsKKwkJcGFyc2VkX2xudW0gPSBjdXJyZW50X2xudW07CisJCXByZXYgPSBzcDsKKwkJd2hpbGUgKHNwICE9IE5VTEwgJiYgc3AtPnNzdF9jaGFuZ2VfbG51bSA8PSBwYXJzZWRfbG51bSkKKwkJeworCQkgICAgaWYgKHNwLT5zc3RfbG51bSA8PSBsbnVtKQorCQkJLyogdmFsaWQgc3RhdGUgYmVmb3JlIGRlc2lyZWQgbGluZSwgdXNlIHRoaXMgb25lICovCisJCQlwcmV2ID0gc3A7CisJCSAgICBlbHNlIGlmIChzcC0+c3N0X2NoYW5nZV9sbnVtID09IDApCisJCQkvKiBwYXN0IHNhdmVkIHN0YXRlcyBkZXBlbmRpbmcgb24gY2hhbmdlLCBicmVhayBoZXJlLiAqLworCQkJYnJlYWs7CisJCSAgICBzcC0+c3N0X2NoYW5nZV9sbnVtID0gMDsKKwkJICAgIHNwID0gc3AtPnNzdF9uZXh0OworCQl9CisJCWxvYWRfY3VycmVudF9zdGF0ZShwcmV2KTsKKwkgICAgfQorCSAgICAvKiBTdG9yZSB0aGUgc3RhdGUgYXQgdGhpcyBsaW5lIHdoZW4gaXQncyB0aGUgZmlyc3Qgb25lLCB0aGUgbGluZQorCSAgICAgKiB3aGVyZSB3ZSBzdGFydCBwYXJzaW5nLCBvciBzb21lIGRpc3RhbmNlIGZyb20gdGhlIHByZXZpb3VzbHkKKwkgICAgICogc2F2ZWQgc3RhdGUuICBCdXQgb25seSB3aGVuIHBhcnNlZCBhdCBsZWFzdCAnbWlubGluZXMnLiAqLworCSAgICBlbHNlIGlmIChwcmV2ID09IE5VTEwKKwkJCXx8IGN1cnJlbnRfbG51bSA9PSBsbnVtCisJCQl8fCBjdXJyZW50X2xudW0gPj0gcHJldi0+c3N0X2xudW0gKyBkaXN0KQorCQlwcmV2ID0gc3RvcmVfY3VycmVudF9zdGF0ZShwcmV2KTsKKwl9CisKKwkvKiBUaGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lOiBicmVhayB3aGVuIENUUkwtQyBwcmVzc2VkLiAgVGhlIGN1cnJlbnQKKwkgKiBzdGF0ZSB3aWxsIGJlIHdyb25nIHRoZW4uICovCisJbGluZV9icmVha2NoZWNrKCk7CisJaWYgKGdvdF9pbnQpCisJeworCSAgICBjdXJyZW50X2xudW0gPSBsbnVtOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgc3luX3N0YXJ0X2xpbmUoKTsKKwordGhlZW5kOgorICAgIHJlZ19zeW4gPSBGQUxTRTsKK30KKworLyoKKyAqIFdlIGNhbm5vdCBzaW1wbHkgZGlzY2FyZCBncm93YXJyYXlzIGZ1bGwgb2Ygc3RhdGVfaXRlbXMgb3IgYnVmX3N0YXRlczsgd2UKKyAqIGhhdmUgdG8gbWFudWFsbHkgcmVsZWFzZSB0aGVpciBleHRtYXRjaCBwb2ludGVycyBmaXJzdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjbGVhcl9zeW5fc3RhdGUocCkKKyAgICBzeW5zdGF0ZV9UICpwOworeworICAgIGludAkJaTsKKyAgICBnYXJyYXlfVAkqZ2FwOworCisgICAgaWYgKHAtPnNzdF9zdGFja3NpemUgPiBTU1RfRklYX1NUQVRFUykKKyAgICB7CisJZ2FwID0gJihwLT5zc3RfdW5pb24uc3N0X2dhKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47IGkrKykKKwkgICAgdW5yZWZfZXh0bWF0Y2goU1lOX1NUQVRFX1AoZ2FwKVtpXS5ic19leHRtYXRjaCk7CisJZ2FfY2xlYXIoZ2FwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+c3N0X3N0YWNrc2l6ZTsgaSsrKQorCSAgICB1bnJlZl9leHRtYXRjaChwLT5zc3RfdW5pb24uc3N0X3N0YWNrW2ldLmJzX2V4dG1hdGNoKTsKKyAgICB9Cit9CisKKy8qCisgKiBDbGVhbnVwIHRoZSBjdXJyZW50X3N0YXRlIHN0YWNrLgorICovCisgICAgc3RhdGljIHZvaWQKK2NsZWFyX2N1cnJlbnRfc3RhdGUoKQoreworICAgIGludAkJaTsKKyAgICBzdGF0ZWl0ZW1fVAkqc2lwOworCisgICAgc2lwID0gKHN0YXRlaXRlbV9UICopKGN1cnJlbnRfc3RhdGUuZ2FfZGF0YSk7CisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfc3RhdGUuZ2FfbGVuOyBpKyspCisJdW5yZWZfZXh0bWF0Y2goc2lwW2ldLnNpX2V4dG1hdGNoKTsKKyAgICBnYV9jbGVhcigmY3VycmVudF9zdGF0ZSk7Cit9CisKKy8qCisgKiBUcnkgdG8gZmluZCBhIHN5bmNocm9uaXNhdGlvbiBwb2ludCBmb3IgbGluZSAibG51bSIuCisgKgorICogVGhpcyBzZXRzIGN1cnJlbnRfbG51bSBhbmQgdGhlIGN1cnJlbnQgc3RhdGUuICBPbmUgb2YgdGhyZWUgbWV0aG9kcyBpcworICogdXNlZDoKKyAqIDEuIFNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBlbmQgb2YgYSBDLWNvbW1lbnQuCisgKiAyLiBTZWFyY2ggYmFja3dhcmRzIGZvciBnaXZlbiBzeW5jIHBhdHRlcm5zLgorICogMy4gU2ltcGx5IHN0YXJ0IG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGxpbmVzIGFib3ZlICJsbnVtIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fc3luYyh3cCwgc3RhcnRfbG51bSwgbGFzdF92YWxpZCkKKyAgICB3aW5fVAkqd3A7CisgICAgbGluZW5yX1QJc3RhcnRfbG51bTsKKyAgICBzeW5zdGF0ZV9UCSpsYXN0X3ZhbGlkOworeworICAgIGJ1Zl9UCSpjdXJidWZfc2F2ZTsKKyAgICB3aW5fVAkqY3Vyd2luX3NhdmU7CisgICAgcG9zX1QJY3Vyc29yX3NhdmU7CisgICAgaW50CQlpZHg7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBsaW5lbnJfVAllbmRfbG51bTsKKyAgICBsaW5lbnJfVAlicmVha19sbnVtOworICAgIGludAkJaGFkX3N5bmNfcG9pbnQ7CisgICAgc3RhdGVpdGVtX1QJKmN1cl9zaTsKKyAgICBzeW5wYXRfVAkqc3BwOworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWZvdW5kX2ZsYWdzID0gMDsKKyAgICBpbnQJCWZvdW5kX21hdGNoX2lkeCA9IDA7CisgICAgbGluZW5yX1QJZm91bmRfY3VycmVudF9sbnVtID0gMDsKKyAgICBpbnQJCWZvdW5kX2N1cnJlbnRfY29sPSAwOworICAgIGxwb3NfVAlmb3VuZF9tX2VuZHBvczsKKworICAgIC8qCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgc3RhdGUgdGhhdCBtaWdodCBiZSBoYW5naW5nIGFyb3VuZC4KKyAgICAgKi8KKyAgICBpbnZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKKworICAgIC8qCisgICAgICogU3RhcnQgYXQgbGVhc3QgIm1pbmxpbmVzIiBiYWNrLiAgRGVmYXVsdCBzdGFydGluZyBwb2ludCBmb3IgcGFyc2luZyBpcworICAgICAqIHRoZXJlLgorICAgICAqIFN0YXJ0IGZ1cnRoZXIgYmFjaywgdG8gYXZvaWQgdGhhdCBzY3JvbGxpbmcgYmFja3dhcmRzIHdpbGwgcmVzdWx0IGluCisgICAgICogcmVzeW5jaW5nIGZvciBldmVyeSBsaW5lLiAgTm93IGl0IHJlc3luY3Mgb25seSBvbmUgb3V0IG9mIE4gbGluZXMsCisgICAgICogd2hlcmUgTiBpcyBtaW5saW5lcyAqIDEuNSwgb3IgbWlubGluZXMgKiAyIGlmIG1pbmxpbmVzIGlzIHNtYWxsLgorICAgICAqIFdhdGNoIG91dCBmb3Igb3ZlcmZsb3cgd2hlbiBtaW5saW5lcyBpcyBNQVhMTlVNLgorICAgICAqLworICAgIGlmIChzeW5fYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzID4gc3RhcnRfbG51bSkKKwlzdGFydF9sbnVtID0gMTsKKyAgICBlbHNlCisgICAgeworCWlmIChzeW5fYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzID09IDEpCisJICAgIGxudW0gPSAxOworCWVsc2UgaWYgKHN5bl9idWYtPmJfc3luX3N5bmNfbWlubGluZXMgPCAxMCkKKwkgICAgbG51bSA9IHN5bl9idWYtPmJfc3luX3N5bmNfbWlubGluZXMgKiAyOworCWVsc2UKKwkgICAgbG51bSA9IHN5bl9idWYtPmJfc3luX3N5bmNfbWlubGluZXMgKiAzIC8gMjsKKwlpZiAoc3luX2J1Zi0+Yl9zeW5fc3luY19tYXhsaW5lcyAhPSAwCisJCQkJICAgICAgICYmIGxudW0gPiBzeW5fYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzKQorCSAgICBsbnVtID0gc3luX2J1Zi0+Yl9zeW5fc3luY19tYXhsaW5lczsKKwlpZiAobG51bSA+PSBzdGFydF9sbnVtKQorCSAgICBzdGFydF9sbnVtID0gMTsKKwllbHNlCisJICAgIHN0YXJ0X2xudW0gLT0gbG51bTsKKyAgICB9CisgICAgY3VycmVudF9sbnVtID0gc3RhcnRfbG51bTsKKworICAgIC8qCisgICAgICogMS4gU2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGVuZCBvZiBhIEMtc3R5bGUgY29tbWVudC4KKyAgICAgKi8KKyAgICBpZiAoc3luX2J1Zi0+Yl9zeW5fc3luY19mbGFncyAmIFNGX0NDT01NRU5UKQorICAgIHsKKwkvKiBOZWVkIHRvIG1ha2Ugc3luX2J1ZiB0aGUgY3VycmVudCBidWZmZXIgZm9yIGEgbW9tZW50LCB0byBiZSBhYmxlIHRvCisJICogdXNlIGZpbmRfc3RhcnRfY29tbWVudCgpLiAqLworCWN1cndpbl9zYXZlID0gY3Vyd2luOworCWN1cndpbiA9IHdwOworCWN1cmJ1Zl9zYXZlID0gY3VyYnVmOworCWN1cmJ1ZiA9IHN5bl9idWY7CisKKwkvKgorCSAqIFNraXAgbGluZXMgdGhhdCBlbmQgaW4gYSBiYWNrc2xhc2guCisJICovCisJZm9yICggOyBzdGFydF9sbnVtID4gMTsgLS1zdGFydF9sbnVtKQorCXsKKwkgICAgbGluZSA9IG1sX2dldChzdGFydF9sbnVtIC0gMSk7CisJICAgIGlmICgqbGluZSA9PSBOVUwgfHwgKihsaW5lICsgU1RSTEVOKGxpbmUpIC0gMSkgIT0gJ1xcJykKKwkJYnJlYWs7CisJfQorCWN1cnJlbnRfbG51bSA9IHN0YXJ0X2xudW07CisKKwkvKiBzZXQgY3Vyc29yIHRvIHN0YXJ0IG9mIHNlYXJjaCAqLworCWN1cnNvcl9zYXZlID0gd3AtPndfY3Vyc29yOworCXdwLT53X2N1cnNvci5sbnVtID0gc3RhcnRfbG51bTsKKwl3cC0+d19jdXJzb3IuY29sID0gMDsKKworCS8qCisJICogSWYgdGhlIGxpbmUgaXMgaW5zaWRlIGEgY29tbWVudCwgbmVlZCB0byBmaW5kIHRoZSBzeW50YXggaXRlbSB0aGF0CisJICogZGVmaW5lcyB0aGUgY29tbWVudC4KKwkgKiBSZXN0cmljdCB0aGUgc2VhcmNoIGZvciB0aGUgZW5kIG9mIGEgY29tbWVudCB0byBiX3N5bl9zeW5jX21heGxpbmVzLgorCSAqLworCWlmIChmaW5kX3N0YXJ0X2NvbW1lbnQoKGludClzeW5fYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzKSAhPSBOVUxMKQorCXsKKwkgICAgZm9yIChpZHggPSBzeW5fYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47IC0taWR4ID49IDA7ICkKKwkJaWYgKFNZTl9JVEVNUyhzeW5fYnVmKVtpZHhdLnNwX3N5bi5pZCA9PSBzeW5fYnVmLT5iX3N5bl9zeW5jX2lkCisJCQkmJiBTWU5fSVRFTVMoc3luX2J1ZilbaWR4XS5zcF90eXBlID09IFNQVFlQRV9TVEFSVCkKKwkJeworCQkgICAgdmFsaWRhdGVfY3VycmVudF9zdGF0ZSgpOworCQkgICAgaWYgKHB1c2hfY3VycmVudF9zdGF0ZShpZHgpID09IE9LKQorCQkJdXBkYXRlX3NpX2F0dHIoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKwkJICAgIGJyZWFrOworCQl9CisJfQorCisJLyogcmVzdG9yZSBjdXJzb3IgYW5kIGJ1ZmZlciAqLworCXdwLT53X2N1cnNvciA9IGN1cnNvcl9zYXZlOworCWN1cndpbiA9IGN1cndpbl9zYXZlOworCWN1cmJ1ZiA9IGN1cmJ1Zl9zYXZlOworICAgIH0KKworICAgIC8qCisgICAgICogMi4gU2VhcmNoIGJhY2t3YXJkcyBmb3IgZ2l2ZW4gc3luYyBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChzeW5fYnVmLT5iX3N5bl9zeW5jX2ZsYWdzICYgU0ZfTUFUQ0gpCisgICAgeworCWlmIChzeW5fYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzICE9IDAKKwkJCQkgJiYgc3RhcnRfbG51bSA+IHN5bl9idWYtPmJfc3luX3N5bmNfbWF4bGluZXMpCisJICAgIGJyZWFrX2xudW0gPSBzdGFydF9sbnVtIC0gc3luX2J1Zi0+Yl9zeW5fc3luY19tYXhsaW5lczsKKwllbHNlCisJICAgIGJyZWFrX2xudW0gPSAwOworCisJZW5kX2xudW0gPSBzdGFydF9sbnVtOworCWxudW0gPSBzdGFydF9sbnVtOworCXdoaWxlICgtLWxudW0gPiBicmVha19sbnVtKQorCXsKKwkgICAgLyogVGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZTogYnJlYWsgd2hlbiBDVFJMLUMgcHJlc3NlZC4gKi8KKwkgICAgbGluZV9icmVha2NoZWNrKCk7CisJICAgIGlmIChnb3RfaW50KQorCSAgICB7CisJCWludmFsaWRhdGVfY3VycmVudF9zdGF0ZSgpOworCQljdXJyZW50X2xudW0gPSBzdGFydF9sbnVtOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgcnVuIGludG8gYSB2YWxpZCBzYXZlZCBzdGF0ZSBzdGFjayBub3cuICovCisJICAgIGlmIChsYXN0X3ZhbGlkICE9IE5VTEwgJiYgbG51bSA9PSBsYXN0X3ZhbGlkLT5zc3RfbG51bSkKKwkgICAgeworCQlsb2FkX2N1cnJlbnRfc3RhdGUobGFzdF92YWxpZCk7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgaWYgdGhlIHByZXZpb3VzIGxpbmUgaGFzIHRoZSBsaW5lLWNvbnRpbnVhdGlvbiBwYXR0ZXJuLgorCSAgICAgKi8KKwkgICAgaWYgKGxudW0gPiAxICYmIHN5bl9tYXRjaF9saW5lY29udChsbnVtIC0gMSkpCisJCWNvbnRpbnVlOworCisJICAgIC8qCisJICAgICAqIFN0YXJ0IHdpdGggbm90aGluZyBvbiB0aGUgc3RhdGUgc3RhY2sKKwkgICAgICovCisJICAgIHZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKKworCSAgICBmb3IgKGN1cnJlbnRfbG51bSA9IGxudW07IGN1cnJlbnRfbG51bSA8IGVuZF9sbnVtOyArK2N1cnJlbnRfbG51bSkKKwkgICAgeworCQlzeW5fc3RhcnRfbGluZSgpOworCQlmb3IgKDs7KQorCQl7CisJCSAgICBoYWRfc3luY19wb2ludCA9IHN5bl9maW5pc2hfbGluZShUUlVFKTsKKwkJICAgIC8qCisJCSAgICAgKiBXaGVuIGEgc3luYyBwb2ludCBoYXMgYmVlbiBmb3VuZCwgcmVtZW1iZXIgd2hlcmUsIGFuZAorCQkgICAgICogY29udGludWUgdG8gbG9vayBmb3IgYW5vdGhlciBvbmUsIGZ1cnRoZXIgb24gaW4gdGhlIGxpbmUuCisJCSAgICAgKi8KKwkJICAgIGlmIChoYWRfc3luY19wb2ludCAmJiBjdXJyZW50X3N0YXRlLmdhX2xlbikKKwkJICAgIHsKKwkJCWN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKwkJCWlmIChjdXJfc2ktPnNpX21fZW5kcG9zLmxudW0gPiBzdGFydF9sbnVtKQorCQkJeworCQkJICAgIC8qIGlnbm9yZSBtYXRjaCB0aGF0IGdvZXMgdG8gYWZ0ZXIgd2hlcmUgc3RhcnRlZCAqLworCQkJICAgIGN1cnJlbnRfbG51bSA9IGVuZF9sbnVtOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJc3BwID0gJihTWU5fSVRFTVMoc3luX2J1ZilbY3VyX3NpLT5zaV9pZHhdKTsKKwkJCWZvdW5kX2ZsYWdzID0gc3BwLT5zcF9mbGFnczsKKwkJCWZvdW5kX21hdGNoX2lkeCA9IHNwcC0+c3Bfc3luY19pZHg7CisJCQlmb3VuZF9jdXJyZW50X2xudW0gPSBjdXJyZW50X2xudW07CisJCQlmb3VuZF9jdXJyZW50X2NvbCA9IGN1cnJlbnRfY29sOworCQkJZm91bmRfbV9lbmRwb3MgPSBjdXJfc2ktPnNpX21fZW5kcG9zOworCQkJLyoKKwkJCSAqIENvbnRpbnVlIGFmdGVyIHRoZSBtYXRjaCAoYmUgYXdhcmUgb2YgYSB6ZXJvLWxlbmd0aAorCQkJICogbWF0Y2gpLgorCQkJICovCisJCQlpZiAoZm91bmRfbV9lbmRwb3MubG51bSA+IGN1cnJlbnRfbG51bSkKKwkJCXsKKwkJCSAgICBjdXJyZW50X2xudW0gPSBmb3VuZF9tX2VuZHBvcy5sbnVtOworCQkJICAgIGN1cnJlbnRfY29sID0gZm91bmRfbV9lbmRwb3MuY29sOworCQkJICAgIGlmIChjdXJyZW50X2xudW0gPj0gZW5kX2xudW0pCisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChmb3VuZF9tX2VuZHBvcy5jb2wgPiBjdXJyZW50X2NvbCkKKwkJCSAgICBjdXJyZW50X2NvbCA9IGZvdW5kX21fZW5kcG9zLmNvbDsKKwkJCWVsc2UKKwkJCSAgICArK2N1cnJlbnRfY29sOworCisJCQkvKiBzeW5fY3VycmVudF9hdHRyKCkgd2lsbCBoYXZlIHNraXBwZWQgdGhlIGNoZWNrIGZvcgorCQkJICogYW4gaXRlbSB0aGF0IGVuZHMgaGVyZSwgbmVlZCB0byBkbyB0aGF0IG5vdy4gKi8KKwkJCSsrY3VycmVudF9jb2w7CisJCQljaGVja19zdGF0ZV9lbmRzKCk7CisJCQktLWN1cnJlbnRfY29sOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIGEgc3luYyBwb2ludCB3YXMgZW5jb3VudGVyZWQsIGJyZWFrIGhlcmUuCisJICAgICAqLworCSAgICBpZiAoZm91bmRfZmxhZ3MpCisJICAgIHsKKwkJLyoKKwkJICogUHV0IHRoZSBpdGVtIHRoYXQgd2FzIHNwZWNpZmllZCBieSB0aGUgc3luYyBwb2ludCBvbiB0aGUKKwkJICogc3RhdGUgc3RhY2suICBJZiB0aGVyZSB3YXMgbm8gaXRlbSBzcGVjaWZpZWQsIG1ha2UgdGhlCisJCSAqIHN0YXRlIHN0YWNrIGVtcHR5LgorCQkgKi8KKwkJY2xlYXJfY3VycmVudF9zdGF0ZSgpOworCQlpZiAoZm91bmRfbWF0Y2hfaWR4ID49IDAKKwkJCSYmIHB1c2hfY3VycmVudF9zdGF0ZShmb3VuZF9tYXRjaF9pZHgpID09IE9LKQorCQkgICAgdXBkYXRlX3NpX2F0dHIoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKworCQkvKgorCQkgKiBXaGVuIHVzaW5nICJncm91cGhlcmUiLCBjb250aW51ZSBmcm9tIHRoZSBzeW5jIHBvaW50CisJCSAqIG1hdGNoLCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgUGFyc2luZyBzdGFydHMgYXQKKwkJICogdGhlIG5leHQgbGluZS4KKwkJICogRm9yICJncm91cHRoZXJlIiB0aGUgcGFyc2luZyBzdGFydHMgYXQgc3RhcnRfbG51bS4KKwkJICovCisJCWlmIChmb3VuZF9mbGFncyAmIEhMX1NZTkNfSEVSRSkKKwkJeworCQkgICAgaWYgKGN1cnJlbnRfc3RhdGUuZ2FfbGVuKQorCQkgICAgeworCQkJY3VyX3NpID0gJkNVUl9TVEFURShjdXJyZW50X3N0YXRlLmdhX2xlbiAtIDEpOworCQkJY3VyX3NpLT5zaV9oX3N0YXJ0cG9zLmxudW0gPSBmb3VuZF9jdXJyZW50X2xudW07CisJCQljdXJfc2ktPnNpX2hfc3RhcnRwb3MuY29sID0gZm91bmRfY3VycmVudF9jb2w7CisJCQl1cGRhdGVfc2lfZW5kKGN1cl9zaSwgKGludCljdXJyZW50X2NvbCwgVFJVRSk7CisJCQljaGVja19rZWVwZW5kKCk7CisJCSAgICB9CisJCSAgICBjdXJyZW50X2NvbCA9IGZvdW5kX21fZW5kcG9zLmNvbDsKKwkJICAgIGN1cnJlbnRfbG51bSA9IGZvdW5kX21fZW5kcG9zLmxudW07CisJCSAgICAodm9pZClzeW5fZmluaXNoX2xpbmUoRkFMU0UpOworCQkgICAgKytjdXJyZW50X2xudW07CisJCX0KKwkJZWxzZQorCQkgICAgY3VycmVudF9sbnVtID0gc3RhcnRfbG51bTsKKworCQlicmVhazsKKwkgICAgfQorCisJICAgIGVuZF9sbnVtID0gbG51bTsKKwkgICAgaW52YWxpZGF0ZV9jdXJyZW50X3N0YXRlKCk7CisJfQorCisJLyogUmFuIGludG8gc3RhcnQgb2YgdGhlIGZpbGUgb3IgZXhjZWVkZWQgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgKi8KKwlpZiAobG51bSA8PSBicmVha19sbnVtKQorCXsKKwkgICAgaW52YWxpZGF0ZV9jdXJyZW50X3N0YXRlKCk7CisJICAgIGN1cnJlbnRfbG51bSA9IGJyZWFrX2xudW0gKyAxOworCX0KKyAgICB9CisKKyAgICB2YWxpZGF0ZV9jdXJyZW50X3N0YXRlKCk7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgbGluZS1jb250aW51YXRpb24gcGF0dGVybiBtYXRjaGVzIGluIGxpbmUgImxudW0iLgorICovCisgICAgc3RhdGljIGludAorc3luX21hdGNoX2xpbmVjb250KGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICByZWdtbWF0Y2hfVCByZWdtYXRjaDsKKworICAgIGlmIChzeW5fYnVmLT5iX3N5bl9saW5lY29udF9wcm9nICE9IE5VTEwpCisgICAgeworCXJlZ21hdGNoLnJtbV9pYyA9IHN5bl9idWYtPmJfc3luX2xpbmVjb250X2ljOworCXJlZ21hdGNoLnJlZ3Byb2cgPSBzeW5fYnVmLT5iX3N5bl9saW5lY29udF9wcm9nOworCXJldHVybiBzeW5fcmVnZXhlYygmcmVnbWF0Y2gsIGxudW0sIChjb2xucl9UKTApOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBQcmVwYXJlIHRoZSBjdXJyZW50IHN0YXRlIGZvciB0aGUgc3RhcnQgb2YgYSBsaW5lLgorICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9zdGFydF9saW5lKCkKK3sKKyAgICBjdXJyZW50X2ZpbmlzaGVkID0gRkFMU0U7CisgICAgY3VycmVudF9jb2wgPSAwOworCisgICAgLyoKKyAgICAgKiBOZWVkIHRvIHVwZGF0ZSB0aGUgZW5kIG9mIGEgc3RhcnQvc2tpcC9lbmQgdGhhdCBjb250aW51ZXMgZnJvbSB0aGUKKyAgICAgKiBwcmV2aW91cyBsaW5lIGFuZCByZWdpb25zIHRoYXQgaGF2ZSAia2VlcGVuZCIuCisgICAgICovCisgICAgaWYgKGN1cnJlbnRfc3RhdGUuZ2FfbGVuID4gMCkKKwlzeW5fdXBkYXRlX2VuZHMoVFJVRSk7CisKKyAgICBuZXh0X21hdGNoX2lkeCA9IC0xOworICAgICsrY3VycmVudF9saW5lX2lkOworfQorCisvKgorICogQ2hlY2sgZm9yIGl0ZW1zIGluIHRoZSBzdGFjayB0aGF0IG5lZWQgdGhlaXIgZW5kIHVwZGF0ZWQuCisgKiBXaGVuICJzdGFydG9mbGluZSIgaXMgVFJVRSB0aGUgbGFzdCBpdGVtIGlzIGFsd2F5cyB1cGRhdGVkLgorICogV2hlbiAic3RhcnRvZmxpbmUiIGlzIEZBTFNFIHRoZSBpdGVtIHdpdGggImtlZXBlbmQiIGlzIGZvcmNlZnVsbHkgdXBkYXRlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fdXBkYXRlX2VuZHMoc3RhcnRvZmxpbmUpCisgICAgaW50CQlzdGFydG9mbGluZTsKK3sKKyAgICBzdGF0ZWl0ZW1fVAkqY3VyX3NpOworICAgIGludAkJaTsKKworICAgIGlmIChzdGFydG9mbGluZSkKKyAgICB7CisJLyogQ2hlY2sgZm9yIGEgbWF0Y2ggY2FycmllZCBvdmVyIGZyb20gYSBwcmV2aW91cyBsaW5lIHdpdGggYQorCSAqIGNvbnRhaW5lZCByZWdpb24uICBUaGUgbWF0Y2ggZW5kcyBhcyBzb29uIGFzIHRoZSByZWdpb24gZW5kcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zdGF0ZS5nYV9sZW47ICsraSkKKwl7CisJICAgIGN1cl9zaSA9ICZDVVJfU1RBVEUoaSk7CisJICAgIGlmIChjdXJfc2ktPnNpX2lkeCA+PSAwCisJCSAgICAmJiAoU1lOX0lURU1TKHN5bl9idWYpW2N1cl9zaS0+c2lfaWR4XSkuc3BfdHlwZQorCQkJCQkJCSAgICAgICA9PSBTUFRZUEVfTUFUQ0gKKwkJICAgICYmIGN1cl9zaS0+c2lfbV9lbmRwb3MubG51bSA8IGN1cnJlbnRfbG51bSkKKwkgICAgeworCQljdXJfc2ktPnNpX2ZsYWdzIHw9IEhMX01BVENIQ09OVDsKKwkJY3VyX3NpLT5zaV9tX2VuZHBvcy5sbnVtID0gMDsKKwkJY3VyX3NpLT5zaV9tX2VuZHBvcy5jb2wgPSAwOworCQljdXJfc2ktPnNpX2hfZW5kcG9zID0gY3VyX3NpLT5zaV9tX2VuZHBvczsKKwkJY3VyX3NpLT5zaV9lbmRzID0gVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5lZWQgdG8gdXBkYXRlIHRoZSBlbmQgb2YgYSBzdGFydC9za2lwL2VuZCB0aGF0IGNvbnRpbnVlcyBmcm9tIHRoZQorICAgICAqIHByZXZpb3VzIGxpbmUuICBBbmQgcmVnaW9ucyB0aGF0IGhhdmUgImtlZXBlbmQiLCBiZWNhdXNlIHRoZXkgbWF5CisgICAgICogaW5mbHVlbmNlIGNvbnRhaW5lZCBpdGVtcy4KKyAgICAgKiBUaGVuIGNoZWNrIGZvciBpdGVtcyBlbmRpbmcgaW4gY29sdW1uIDAuCisgICAgICovCisgICAgaSA9IGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMTsKKyAgICBpZiAoa2VlcGVuZF9sZXZlbCA+PSAwKQorCWZvciAoIDsgaSA+IGtlZXBlbmRfbGV2ZWw7IC0taSkKKwkgICAgaWYgKENVUl9TVEFURShpKS5zaV9mbGFncyAmIEhMX0VYVEVORCkKKwkJYnJlYWs7CisgICAgZm9yICggOyBpIDwgY3VycmVudF9zdGF0ZS5nYV9sZW47ICsraSkKKyAgICB7CisJY3VyX3NpID0gJkNVUl9TVEFURShpKTsKKwlpZiAoKGN1cl9zaS0+c2lfZmxhZ3MgJiBITF9LRUVQRU5EKQorCQkJICAgIHx8IChpID09IGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMSAmJiBzdGFydG9mbGluZSkpCisJeworCSAgICBjdXJfc2ktPnNpX2hfc3RhcnRwb3MuY29sID0gMDsJLyogc3RhcnQgaGlnaGwuIGluIGNvbCAwICovCisJICAgIGN1cl9zaS0+c2lfaF9zdGFydHBvcy5sbnVtID0gY3VycmVudF9sbnVtOworCisJICAgIGlmICghKGN1cl9zaS0+c2lfZmxhZ3MgJiBITF9NQVRDSENPTlQpKQorCQl1cGRhdGVfc2lfZW5kKGN1cl9zaSwgKGludCljdXJyZW50X2NvbCwgIXN0YXJ0b2ZsaW5lKTsKKwl9CisgICAgfQorICAgIGNoZWNrX2tlZXBlbmQoKTsKKyAgICBjaGVja19zdGF0ZV9lbmRzKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYW5kbGluZyBvZiB0aGUgc3RhdGUgc3RhY2sgY2FjaGUuCisgKi8KKworLyoKKyAqIEVYUExBTkFUSU9OIE9GIFRIRSBTWU5UQVggU1RBVEUgU1RBQ0sgQ0FDSEUKKyAqCisgKiBUbyBzcGVlZCB1cCBzeW50YXggaGlnaGxpZ2h0aW5nLCB0aGUgc3RhdGUgc3RhY2sgZm9yIHRoZSBzdGFydCBvZiBzb21lCisgKiBsaW5lcyBpcyBjYWNoZWQuICBUaGVzZSBlbnRyaWVzIGNhbiBiZSB1c2VkIHRvIHN0YXJ0IHBhcnNpbmcgYXQgdGhhdCBwb2ludC4KKyAqCisgKiBUaGUgc3RhY2sgaXMga2VwdCBpbiBiX3NzdF9hcnJheVtdIGZvciBlYWNoIGJ1ZmZlci4gIFRoZXJlIGlzIGEgbGlzdCBvZgorICogdmFsaWQgZW50cmllcy4gIGJfc3N0X2ZpcnN0IHBvaW50cyB0byB0aGUgZmlyc3Qgb25lLCB0aGVuIGZvbGxvdyBzc3RfbmV4dC4KKyAqIFRoZSBlbnRyaWVzIGFyZSBzb3J0ZWQgb24gbGluZSBudW1iZXIuICBUaGUgZmlyc3QgZW50cnkgaXMgb2Z0ZW4gZm9yIGxpbmUgMgorICogKGxpbmUgMSBhbHdheXMgc3RhcnRzIHdpdGggYW4gZW1wdHkgc3RhY2spLgorICogVGhlcmUgaXMgYWxzbyBhIGxpc3QgZm9yIGZyZWUgZW50cmllcy4gIFRoaXMgY29uc3RydWN0aW9uIGlzIHVzZWQgdG8gYXZvaWQKKyAqIGhhdmluZyB0byBhbGxvY2F0ZSBhbmQgZnJlZSBtZW1vcnkgYmxvY2tzIHRvbyBvZnRlbi4KKyAqCisgKiBXaGVuIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBidWZmZXIsIHRoaXMgaXMgbG9nZ2VkIGluIGJfbW9kXyouICBXaGVuIGNhbGxpbmcKKyAqIHVwZGF0ZV9zY3JlZW4oKSB0byB1cGRhdGUgdGhlIGRpc3BsYXksIGl0IHdpbGwgY2FsbAorICogc3luX3N0YWNrX2FwcGx5X2NoYW5nZXMoKSBmb3IgZWFjaCBkaXNwbGF5ZWQgYnVmZmVyIHRvIGFkanVzdCB0aGUgY2FjaGVkCisgKiBlbnRyaWVzLiAgVGhlIGVudHJpZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgY2hhbmdlZCBhcmVhIGFyZSByZW1vdmVkLAorICogYmVjYXVzZSB0aGV5IG11c3QgYmUgcmVjb21wdXRlZC4gIEVudHJpZXMgYmVsb3cgdGhlIGNoYW5nZWQgaGF2ZSB0aGVpciBsaW5lCisgKiBudW1iZXIgYWRqdXN0ZWQgZm9yIGRlbGV0ZWQvaW5zZXJ0ZWQgbGluZXMsIGFuZCBoYXZlIHRoZWlyIHNzdF9jaGFuZ2VfbG51bQorICogc2V0IHRvIGluZGljYXRlIHRoYXQgYSBjaGVjayBtdXN0IGJlIG1hZGUgaWYgdGhlIGNoYW5nZWQgbGluZXMgd291bGQgY2hhbmdlCisgKiB0aGUgY2FjaGVkIGVudHJ5LgorICoKKyAqIFdoZW4gbGF0ZXIgZGlzcGxheWluZyBsaW5lcywgYW4gZW50cnkgaXMgc3RvcmVkIGZvciBlYWNoIGxpbmUuICBEaXNwbGF5ZWQKKyAqIGxpbmVzIGFyZSBsaWtlbHkgdG8gYmUgZGlzcGxheWVkIGFnYWluLCBpbiB3aGljaCBjYXNlIHRoZSBzdGF0ZSBhdCB0aGUKKyAqIHN0YXJ0IG9mIHRoZSBsaW5lIGlzIG5lZWRlZC4KKyAqIEZvciBub3QgZGlzcGxheWVkIGxpbmVzLCBhbiBlbnRyeSBpcyBzdG9yZWQgZm9yIGV2ZXJ5IHNvIG1hbnkgbGluZXMuICBUaGVzZQorICogZW50cmllcyB3aWxsIGJlIHVzZWQgZS5nLiwgd2hlbiBzY3JvbGxpbmcgYmFja3dhcmRzLiAgVGhlIGRpc3RhbmNlIGJldHdlZW4KKyAqIGVudHJpZXMgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBidWZmZXIuICBGb3Igc21hbGwgYnVmZmVycworICogdGhlIGRpc3RhbmNlIGlzIGZpeGVkIGF0IFNTVF9ESVNULCBmb3IgbGFyZ2UgYnVmZmVycyB0aGVyZSBpcyBhIGZpeGVkCisgKiBudW1iZXIgb2YgZW50cmllcyBTU1RfTUFYX0VOVFJJRVMsIGFuZCB0aGUgZGlzdGFuY2UgaXMgY29tcHV0ZWQuCisgKi8KKworLyoKKyAqIEZyZWUgYl9zc3RfYXJyYXlbXSBmb3IgYnVmZmVyICJidWYiLgorICogVXNlZCB3aGVuIHN5bnRheCBpdGVtcyBjaGFuZ2VkIHRvIGZvcmNlIHJlc3luY2luZyBldmVyeXdoZXJlLgorICovCisgICAgdm9pZAorc3luX3N0YWNrX2ZyZWVfYWxsKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHN5bnN0YXRlX1QJKnA7CisgICAgd2luX1QJKndwOworCisgICAgaWYgKGJ1Zi0+Yl9zc3RfYXJyYXkgIT0gTlVMTCkKKyAgICB7CisJZm9yIChwID0gYnVmLT5iX3NzdF9maXJzdDsgcCAhPSBOVUxMOyBwID0gcC0+c3N0X25leHQpCisJICAgIGNsZWFyX3N5bl9zdGF0ZShwKTsKKwl2aW1fZnJlZShidWYtPmJfc3N0X2FycmF5KTsKKwlidWYtPmJfc3N0X2FycmF5ID0gTlVMTDsKKwlidWYtPmJfc3N0X2xlbiA9IDA7CisgICAgfQorI2lmZGVmIEZFQVRfRk9MRElORworICAgIC8qIFdoZW4gdXNpbmcgInN5bnRheCIgZm9sZCBtZXRob2QsIG11c3QgdXBkYXRlIGFsbCBmb2xkcy4gKi8KKyAgICBGT1JfQUxMX1dJTkRPV1Mod3ApCisgICAgeworCWlmICh3cC0+d19idWZmZXIgPT0gYnVmICYmIGZvbGRtZXRob2RJc1N5bnRheCh3cCkpCisJICAgIGZvbGRVcGRhdGVBbGwod3ApOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogQWxsb2NhdGUgdGhlIHN5bnRheCBzdGF0ZSBzdGFjayBmb3Igc3luX2J1ZiB3aGVuIG5lZWRlZC4KKyAqIElmIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBiX3NzdF9hcnJheVtdIGlzIG11Y2ggdG9vIGJpZyBvciBhIGJpdCB0b28KKyAqIHNtYWxsLCByZWFsbG9jYXRlIGl0LgorICogQWxzbyB1c2VkIHRvIGFsbG9jYXRlIGJfc3N0X2FycmF5W10gZm9yIHRoZSBmaXJzdCB0aW1lLgorICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9zdGFja19hbGxvYygpCit7CisgICAgbG9uZwlsZW47CisgICAgc3luc3RhdGVfVAkqdG8sICpmcm9tOworICAgIHN5bnN0YXRlX1QJKnNzdHA7CisKKyAgICBsZW4gPSBzeW5fYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLyBTU1RfRElTVCArIFJvd3MgKiAyOworICAgIGlmIChsZW4gPCBTU1RfTUlOX0VOVFJJRVMpCisJbGVuID0gU1NUX01JTl9FTlRSSUVTOworICAgIGVsc2UgaWYgKGxlbiA+IFNTVF9NQVhfRU5UUklFUykKKwlsZW4gPSBTU1RfTUFYX0VOVFJJRVM7CisgICAgaWYgKHN5bl9idWYtPmJfc3N0X2xlbiA+IGxlbiAqIDIgfHwgc3luX2J1Zi0+Yl9zc3RfbGVuIDwgbGVuKQorICAgIHsKKwkvKiBBbGxvY2F0ZSA1MCUgdG9vIG11Y2gsIHRvIGF2b2lkIHJlYWxsb2NhdGluZyB0b28gb2Z0ZW4uICovCisJbGVuID0gc3luX2J1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWxlbiA9IChsZW4gKyBsZW4gLyAyKSAvIFNTVF9ESVNUICsgUm93cyAqIDI7CisJaWYgKGxlbiA8IFNTVF9NSU5fRU5UUklFUykKKwkgICAgbGVuID0gU1NUX01JTl9FTlRSSUVTOworCWVsc2UgaWYgKGxlbiA+IFNTVF9NQVhfRU5UUklFUykKKwkgICAgbGVuID0gU1NUX01BWF9FTlRSSUVTOworCisJaWYgKHN5bl9idWYtPmJfc3N0X2FycmF5ICE9IE5VTEwpCisJeworCSAgICAvKiBXaGVuIHNocmlua2luZyB0aGUgYXJyYXksIGNsZWFudXAgdGhlIGV4aXN0aW5nIHN0YWNrLgorCSAgICAgKiBNYWtlIHN1cmUgdGhhdCBhbGwgdmFsaWQgZW50cmllcyBmaXQgaW4gdGhlIG5ldyBhcnJheS4gKi8KKwkgICAgd2hpbGUgKHN5bl9idWYtPmJfc3N0X2xlbiAtIHN5bl9idWYtPmJfc3N0X2ZyZWVjb3VudCArIDIgPiBsZW4KKwkJICAgICYmIHN5bl9zdGFja19jbGVhbnVwKCkpCisJCTsKKwkgICAgaWYgKGxlbiA8IHN5bl9idWYtPmJfc3N0X2xlbiAtIHN5bl9idWYtPmJfc3N0X2ZyZWVjb3VudCArIDIpCisJCWxlbiA9IHN5bl9idWYtPmJfc3N0X2xlbiAtIHN5bl9idWYtPmJfc3N0X2ZyZWVjb3VudCArIDI7CisJfQorCisJc3N0cCA9IChzeW5zdGF0ZV9UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKShsZW4gKiBzaXplb2Yoc3luc3RhdGVfVCkpKTsKKwlpZiAoc3N0cCA9PSBOVUxMKQkvKiBvdXQgb2YgbWVtb3J5ISAqLworCSAgICByZXR1cm47CisKKwl0byA9IHNzdHAgLSAxOworCWlmIChzeW5fYnVmLT5iX3NzdF9hcnJheSAhPSBOVUxMKQorCXsKKwkgICAgLyogTW92ZSB0aGUgc3RhdGVzIGZyb20gdGhlIG9sZCBhcnJheSB0byB0aGUgbmV3IG9uZS4gKi8KKwkgICAgZm9yIChmcm9tID0gc3luX2J1Zi0+Yl9zc3RfZmlyc3Q7IGZyb20gIT0gTlVMTDsKKwkJCQkJCQlmcm9tID0gZnJvbS0+c3N0X25leHQpCisJICAgIHsKKwkJKyt0bzsKKwkJKnRvID0gKmZyb207CisJCXRvLT5zc3RfbmV4dCA9IHRvICsgMTsKKwkgICAgfQorCX0KKwlpZiAodG8gIT0gc3N0cCAtIDEpCisJeworCSAgICB0by0+c3N0X25leHQgPSBOVUxMOworCSAgICBzeW5fYnVmLT5iX3NzdF9maXJzdCA9IHNzdHA7CisJICAgIHN5bl9idWYtPmJfc3N0X2ZyZWVjb3VudCA9IGxlbiAtIChpbnQpKHRvIC0gc3N0cCkgLSAxOworCX0KKwllbHNlCisJeworCSAgICBzeW5fYnVmLT5iX3NzdF9maXJzdCA9IE5VTEw7CisJICAgIHN5bl9idWYtPmJfc3N0X2ZyZWVjb3VudCA9IGxlbjsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGxpc3Qgb2YgZnJlZSBlbnRyaWVzLiAqLworCXN5bl9idWYtPmJfc3N0X2ZpcnN0ZnJlZSA9IHRvICsgMTsKKwl3aGlsZSAoKyt0byA8IHNzdHAgKyBsZW4pCisJICAgIHRvLT5zc3RfbmV4dCA9IHRvICsgMTsKKwkoc3N0cCArIGxlbiAtIDEpLT5zc3RfbmV4dCA9IE5VTEw7CisKKwl2aW1fZnJlZShzeW5fYnVmLT5iX3NzdF9hcnJheSk7CisJc3luX2J1Zi0+Yl9zc3RfYXJyYXkgPSBzc3RwOworCXN5bl9idWYtPmJfc3N0X2xlbiA9IGxlbjsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayBmb3IgY2hhbmdlcyBpbiBhIGJ1ZmZlciB0byBhZmZlY3Qgc3RvcmVkIHN5bnRheCBzdGF0ZXMuICBVc2VzIHRoZQorICogYl9tb2RfKiBmaWVsZHMuCisgKiBDYWxsZWQgZnJvbSB1cGRhdGVfc2NyZWVuKCksIGJlZm9yZSBzY3JlZW4gaXMgYmVpbmcgdXBkYXRlZCwgb25jZSBmb3IgZWFjaAorICogZGlzcGxheWVkIGJ1ZmZlci4KKyAqLworICAgIHZvaWQKK3N5bl9zdGFja19hcHBseV9jaGFuZ2VzKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHN5bnN0YXRlX1QJKnAsICpwcmV2LCAqbnA7CisgICAgbGluZW5yX1QJbjsKKworICAgIGlmIChidWYtPmJfc3N0X2FycmF5ID09IE5VTEwpCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisKKyAgICBwcmV2ID0gTlVMTDsKKyAgICBmb3IgKHAgPSBidWYtPmJfc3N0X2ZpcnN0OyBwICE9IE5VTEw7ICkKKyAgICB7CisJaWYgKHAtPnNzdF9sbnVtICsgc3luX2J1Zi0+Yl9zeW5fc3luY19saW5lYnJlYWtzID4gYnVmLT5iX21vZF90b3ApCisJeworCSAgICBuID0gcC0+c3N0X2xudW0gKyBidWYtPmJfbW9kX3hsaW5lczsKKwkgICAgaWYgKG4gPD0gYnVmLT5iX21vZF9ib3QpCisJICAgIHsKKwkJLyogdGhpcyBzdGF0ZSBpcyBpbnNpZGUgdGhlIGNoYW5nZWQgYXJlYSwgcmVtb3ZlIGl0ICovCisJCW5wID0gcC0+c3N0X25leHQ7CisJCWlmIChwcmV2ID09IE5VTEwpCisJCSAgICBidWYtPmJfc3N0X2ZpcnN0ID0gbnA7CisJCWVsc2UKKwkJICAgIHByZXYtPnNzdF9uZXh0ID0gbnA7CisJCXN5bl9zdGFja19mcmVlX2VudHJ5KGJ1ZiwgcCk7CisJCXAgPSBucDsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgLyogVGhpcyBzdGF0ZSBpcyBiZWxvdyB0aGUgY2hhbmdlZCBhcmVhLiAgUmVtZW1iZXIgdGhlIGxpbmUKKwkgICAgICogdGhhdCBuZWVkcyB0byBiZSBwYXJzZWQgYmVmb3JlIHRoaXMgZW50cnkgY2FuIGJlIG1hZGUgdmFsaWQKKwkgICAgICogYWdhaW4uICovCisJICAgIGlmIChwLT5zc3RfY2hhbmdlX2xudW0gIT0gMCAmJiBwLT5zc3RfY2hhbmdlX2xudW0gPiBidWYtPmJfbW9kX3RvcCkKKwkgICAgeworCQlpZiAocC0+c3N0X2NoYW5nZV9sbnVtICsgYnVmLT5iX21vZF94bGluZXMgPiBidWYtPmJfbW9kX3RvcCkKKwkJICAgIHAtPnNzdF9jaGFuZ2VfbG51bSArPSBidWYtPmJfbW9kX3hsaW5lczsKKwkJZWxzZQorCQkgICAgcC0+c3N0X2NoYW5nZV9sbnVtID0gYnVmLT5iX21vZF90b3A7CisJICAgIH0KKwkgICAgaWYgKHAtPnNzdF9jaGFuZ2VfbG51bSA9PSAwCisJCSAgICB8fCBwLT5zc3RfY2hhbmdlX2xudW0gPCBidWYtPmJfbW9kX2JvdCkKKwkJcC0+c3N0X2NoYW5nZV9sbnVtID0gYnVmLT5iX21vZF9ib3Q7CisKKwkgICAgcC0+c3N0X2xudW0gPSBuOworCX0KKwlwcmV2ID0gcDsKKwlwID0gcC0+c3N0X25leHQ7CisgICAgfQorfQorCisvKgorICogUmVkdWNlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc3RhdGUgc3RhY2sgZm9yIHN5bl9idWYuCisgKiBSZXR1cm5zIFRSVUUgaWYgYXQgbGVhc3Qgb25lIGVudHJ5IHdhcyBmcmVlZC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3N5bl9zdGFja19jbGVhbnVwKCkKK3sKKyAgICBzeW5zdGF0ZV9UCSpwLCAqcHJldjsKKyAgICBkaXNwdGlja19UCXRpY2s7CisgICAgaW50CQlhYm92ZTsKKyAgICBpbnQJCWRpc3Q7CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKworICAgIGlmIChzeW5fYnVmLT5iX3NzdF9hcnJheSA9PSBOVUxMIHx8IHN5bl9idWYtPmJfc3N0X2ZpcnN0ID09IE5VTEwpCisJcmV0dXJuIHJldHZhbDsKKworICAgIC8qIENvbXB1dGUgbm9ybWFsIGRpc3RhbmNlIGJldHdlZW4gbm9uLWRpc3BsYXllZCBlbnRyaWVzLiAqLworICAgIGRpc3QgPSBzeW5fYnVmLT5iX21sLm1sX2xpbmVfY291bnQgLyAoc3luX2J1Zi0+Yl9zc3RfbGVuIC0gUm93cykgKyAxOworCisgICAgLyoKKyAgICAgKiBHbyB0aHJvdWdodCB0aGUgbGlzdCB0byBmaW5kIHRoZSAidGljayIgZm9yIHRoZSBvbGRlc3QgZW50cnkgdGhhdCBjYW4KKyAgICAgKiBiZSByZW1vdmVkLiAgU2V0ICJhYm92ZSIgd2hlbiB0aGUgInRpY2siIGZvciB0aGUgb2xkZXN0IGVudHJ5IGlzIGFib3ZlCisgICAgICogImJfc3N0X2xhc3R0aWNrIiAodGhlIGRpc3BsYXkgdGljayB3cmFwcyBhcm91bmQpLgorICAgICAqLworICAgIHRpY2sgPSBzeW5fYnVmLT5iX3NzdF9sYXN0dGljazsKKyAgICBhYm92ZSA9IEZBTFNFOworICAgIHByZXYgPSBzeW5fYnVmLT5iX3NzdF9maXJzdDsKKyAgICBmb3IgKHAgPSBwcmV2LT5zc3RfbmV4dDsgcCAhPSBOVUxMOyBwcmV2ID0gcCwgcCA9IHAtPnNzdF9uZXh0KQorICAgIHsKKwlpZiAocHJldi0+c3N0X2xudW0gKyBkaXN0ID4gcC0+c3N0X2xudW0pCisJeworCSAgICBpZiAocC0+c3N0X3RpY2sgPiBzeW5fYnVmLT5iX3NzdF9sYXN0dGljaykKKwkgICAgeworCQlpZiAoIWFib3ZlIHx8IHAtPnNzdF90aWNrIDwgdGljaykKKwkJICAgIHRpY2sgPSBwLT5zc3RfdGljazsKKwkJYWJvdmUgPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UgaWYgKCFhYm92ZSAmJiBwLT5zc3RfdGljayA8IHRpY2spCisJCXRpY2sgPSBwLT5zc3RfdGljazsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHbyB0aHJvdWdoIHRoZSBsaXN0IHRvIG1ha2UgdGhlIGVudHJpZXMgZm9yIHRoZSBvbGRlc3QgdGljayBhdCBhbgorICAgICAqIGludGVydmFsIG9mIHNldmVyYWwgbGluZXMuCisgICAgICovCisgICAgcHJldiA9IHN5bl9idWYtPmJfc3N0X2ZpcnN0OworICAgIGZvciAocCA9IHByZXYtPnNzdF9uZXh0OyBwICE9IE5VTEw7IHByZXYgPSBwLCBwID0gcC0+c3N0X25leHQpCisgICAgeworCWlmIChwLT5zc3RfdGljayA9PSB0aWNrICYmIHByZXYtPnNzdF9sbnVtICsgZGlzdCA+IHAtPnNzdF9sbnVtKQorCXsKKwkgICAgLyogTW92ZSB0aGlzIGVudHJ5IGZyb20gdXNlZCBsaXN0IHRvIGZyZWUgbGlzdCAqLworCSAgICBwcmV2LT5zc3RfbmV4dCA9IHAtPnNzdF9uZXh0OworCSAgICBzeW5fc3RhY2tfZnJlZV9lbnRyeShzeW5fYnVmLCBwKTsKKwkgICAgcCA9IHByZXY7CisJICAgIHJldHZhbCA9IFRSVUU7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSBmb3IgYSBzeW5fc3RhdGUgaXRlbS4KKyAqIE1vdmUgdGhlIGVudHJ5IGludG8gdGhlIGZyZWUgbGlzdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fc3RhY2tfZnJlZV9lbnRyeShidWYsIHApCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBzeW5zdGF0ZV9UCSpwOworeworICAgIGNsZWFyX3N5bl9zdGF0ZShwKTsKKyAgICBwLT5zc3RfbmV4dCA9IGJ1Zi0+Yl9zc3RfZmlyc3RmcmVlOworICAgIGJ1Zi0+Yl9zc3RfZmlyc3RmcmVlID0gcDsKKyAgICArK2J1Zi0+Yl9zc3RfZnJlZWNvdW50OworfQorCisvKgorICogRmluZCBhbiBlbnRyeSBpbiB0aGUgbGlzdCBvZiBzdGF0ZSBzdGFja3MgYXQgb3IgYmVmb3JlICJsbnVtIi4KKyAqIFJldHVybnMgTlVMTCB3aGVuIHRoZXJlIGlzIG5vIGVudHJ5IG9yIHRoZSBmaXJzdCBlbnRyeSBpcyBhZnRlciAibG51bSIuCisgKi8KKyAgICBzdGF0aWMgc3luc3RhdGVfVCAqCitzeW5fc3RhY2tfZmluZF9lbnRyeShsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgc3luc3RhdGVfVAkqcCwgKnByZXY7CisKKyAgICBwcmV2ID0gTlVMTDsKKyAgICBmb3IgKHAgPSBzeW5fYnVmLT5iX3NzdF9maXJzdDsgcCAhPSBOVUxMOyBwcmV2ID0gcCwgcCA9IHAtPnNzdF9uZXh0KQorICAgIHsKKwlpZiAocC0+c3N0X2xudW0gPT0gbG51bSkKKwkgICAgcmV0dXJuIHA7CisJaWYgKHAtPnNzdF9sbnVtID4gbG51bSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBwcmV2OworfQorCisvKgorICogVHJ5IHNhdmluZyB0aGUgY3VycmVudCBzdGF0ZSBpbiBiX3NzdF9hcnJheVtdLgorICogVGhlIGN1cnJlbnQgc3RhdGUgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50X2xudW0gbGluZSEKKyAqLworICAgIHN0YXRpYyBzeW5zdGF0ZV9UICoKK3N0b3JlX2N1cnJlbnRfc3RhdGUoc3ApCisgICAgc3luc3RhdGVfVAkqc3A7CS8qIGF0IG9yIGJlZm9yZSB3aGVyZSBzdGF0ZSBpcyB0byBiZSBzYXZlZCBvcgorCQkJCSAgIE5VTEwgKi8KK3sKKyAgICBpbnQJCWk7CisgICAgc3luc3RhdGVfVAkqcDsKKyAgICBidWZzdGF0ZV9UCSpicDsKKyAgICBzdGF0ZWl0ZW1fVAkqY3VyX3NpOworCisgICAgaWYgKHNwID09IE5VTEwpCisJc3AgPSBzeW5fc3RhY2tfZmluZF9lbnRyeShjdXJyZW50X2xudW0pOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBjb250YWlucyBhIHN0YXJ0IG9yIGVuZCBwYXR0ZXJuIHRoYXQgY29udGludWVzCisgICAgICogZnJvbSB0aGUgcHJldmlvdXMgbGluZSwgd2UgY2FuJ3QgdXNlIGl0LiAgRG9uJ3Qgc3RvcmUgaXQgdGhlbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSBjdXJyZW50X3N0YXRlLmdhX2xlbiAtIDE7IGkgPj0gMDsgLS1pKQorICAgIHsKKwljdXJfc2kgPSAmQ1VSX1NUQVRFKGkpOworCWlmIChjdXJfc2ktPnNpX2hfc3RhcnRwb3MubG51bSA+PSBjdXJyZW50X2xudW0KKwkJfHwgY3VyX3NpLT5zaV9tX2VuZHBvcy5sbnVtID49IGN1cnJlbnRfbG51bQorCQl8fCBjdXJfc2ktPnNpX2hfZW5kcG9zLmxudW0gPj0gY3VycmVudF9sbnVtCisJCXx8IChjdXJfc2ktPnNpX2VuZF9pZHgKKwkJICAgICYmIGN1cl9zaS0+c2lfZW9lX3Bvcy5sbnVtID49IGN1cnJlbnRfbG51bSkpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA+PSAwKQorICAgIHsKKwlpZiAoc3AgIT0gTlVMTCkKKwl7CisJICAgIC8qIGZpbmQgInNwIiBpbiB0aGUgbGlzdCBhbmQgcmVtb3ZlIGl0ICovCisJICAgIGlmIChzeW5fYnVmLT5iX3NzdF9maXJzdCA9PSBzcCkKKwkJLyogaXQncyB0aGUgZmlyc3QgZW50cnkgKi8KKwkJc3luX2J1Zi0+Yl9zc3RfZmlyc3QgPSBzcC0+c3N0X25leHQ7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBmaW5kIHRoZSBlbnRyeSBqdXN0IGJlZm9yZSB0aGlzIG9uZSB0byBhZGp1c3Qgc3N0X25leHQgKi8KKwkJZm9yIChwID0gc3luX2J1Zi0+Yl9zc3RfZmlyc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPnNzdF9uZXh0KQorCQkgICAgaWYgKHAtPnNzdF9uZXh0ID09IHNwKQorCQkJYnJlYWs7CisJCXAtPnNzdF9uZXh0ID0gc3AtPnNzdF9uZXh0OworCSAgICB9CisJICAgIHN5bl9zdGFja19mcmVlX2VudHJ5KHN5bl9idWYsIHNwKTsKKwkgICAgc3AgPSBOVUxMOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoc3AgPT0gTlVMTCB8fCBzcC0+c3N0X2xudW0gIT0gY3VycmVudF9sbnVtKQorICAgIHsKKwkvKgorCSAqIEFkZCBhIG5ldyBlbnRyeQorCSAqLworCS8qIElmIG5vIGZyZWUgaXRlbXMsIGNsZWFudXAgdGhlIGFycmF5IGZpcnN0LiAqLworCWlmIChzeW5fYnVmLT5iX3NzdF9mcmVlY291bnQgPT0gMCkKKwl7CisJICAgICh2b2lkKXN5bl9zdGFja19jbGVhbnVwKCk7CisJICAgIC8qICJzcCIgbWF5IGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZnJlZWxpc3Qgbm93ICovCisJICAgIHNwID0gc3luX3N0YWNrX2ZpbmRfZW50cnkoY3VycmVudF9sbnVtKTsKKwl9CisJLyogU3RpbGwgbm8gZnJlZSBpdGVtcz8gIE11c3QgYmUgYSBzdHJhbmdlIHByb2JsZW0uLi4gKi8KKwlpZiAoc3luX2J1Zi0+Yl9zc3RfZnJlZWNvdW50ID09IDApCisJICAgIHNwID0gTlVMTDsKKwllbHNlCisJeworCSAgICAvKiBUYWtlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgcHV0IGl0IGluIHRoZSB1c2VkCisJICAgICAqIGxpc3QsIGFmdGVyICpzcCAqLworCSAgICBwID0gc3luX2J1Zi0+Yl9zc3RfZmlyc3RmcmVlOworCSAgICBzeW5fYnVmLT5iX3NzdF9maXJzdGZyZWUgPSBwLT5zc3RfbmV4dDsKKwkgICAgLS1zeW5fYnVmLT5iX3NzdF9mcmVlY291bnQ7CisJICAgIGlmIChzcCA9PSBOVUxMKQorCSAgICB7CisJCS8qIEluc2VydCBpbiBmcm9udCBvZiB0aGUgbGlzdCAqLworCQlwLT5zc3RfbmV4dCA9IHN5bl9idWYtPmJfc3N0X2ZpcnN0OworCQlzeW5fYnVmLT5iX3NzdF9maXJzdCA9IHA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIGluc2VydCBpbiBsaXN0IGFmdGVyICpzcCAqLworCQlwLT5zc3RfbmV4dCA9IHNwLT5zc3RfbmV4dDsKKwkJc3AtPnNzdF9uZXh0ID0gcDsKKwkgICAgfQorCSAgICBzcCA9IHA7CisJICAgIHNwLT5zc3Rfc3RhY2tzaXplID0gMDsKKwkgICAgc3AtPnNzdF9sbnVtID0gY3VycmVudF9sbnVtOworCX0KKyAgICB9CisgICAgaWYgKHNwICE9IE5VTEwpCisgICAgeworCS8qIFdoZW4gb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgc3RhY2ssIGNsZWFyIGl0IGZpcnN0ICovCisJY2xlYXJfc3luX3N0YXRlKHNwKTsKKwlzcC0+c3N0X3N0YWNrc2l6ZSA9IGN1cnJlbnRfc3RhdGUuZ2FfbGVuOworCWlmIChjdXJyZW50X3N0YXRlLmdhX2xlbiA+IFNTVF9GSVhfU1RBVEVTKQorCXsKKwkgICAgLyogTmVlZCB0byBjbGVhciBpdCwgbWlnaHQgYmUgc29tZXRoaW5nIHJlbWFpbmluZyBmcm9tIHdoZW4gdGhlCisJICAgICAqIGxlbmd0aCB3YXMgbGVzcyB0aGFuIFNTVF9GSVhfU1RBVEVTLiAqLworCSAgICBnYV9pbml0Migmc3AtPnNzdF91bmlvbi5zc3RfZ2EsIChpbnQpc2l6ZW9mKGJ1ZnN0YXRlX1QpLCAxKTsKKwkgICAgaWYgKGdhX2dyb3coJnNwLT5zc3RfdW5pb24uc3N0X2dhLCBjdXJyZW50X3N0YXRlLmdhX2xlbikgPT0gRkFJTCkKKwkJc3AtPnNzdF9zdGFja3NpemUgPSAwOworCSAgICBlbHNlCisJICAgIHsKKwkJc3AtPnNzdF91bmlvbi5zc3RfZ2EuZ2FfbGVuID0gY3VycmVudF9zdGF0ZS5nYV9sZW47CisJCXNwLT5zc3RfdW5pb24uc3N0X2dhLmdhX3Jvb20gLT0gY3VycmVudF9zdGF0ZS5nYV9sZW47CisJICAgIH0KKwkgICAgYnAgPSBTWU5fU1RBVEVfUCgmKHNwLT5zc3RfdW5pb24uc3N0X2dhKSk7CisJfQorCWVsc2UKKwkgICAgYnAgPSBzcC0+c3N0X3VuaW9uLnNzdF9zdGFjazsKKwlmb3IgKGkgPSAwOyBpIDwgc3AtPnNzdF9zdGFja3NpemU7ICsraSkKKwl7CisJICAgIGJwW2ldLmJzX2lkeCA9IENVUl9TVEFURShpKS5zaV9pZHg7CisJICAgIGJwW2ldLmJzX2ZsYWdzID0gQ1VSX1NUQVRFKGkpLnNpX2ZsYWdzOworCSAgICBicFtpXS5ic19leHRtYXRjaCA9IHJlZl9leHRtYXRjaChDVVJfU1RBVEUoaSkuc2lfZXh0bWF0Y2gpOworCX0KKwlzcC0+c3N0X25leHRfZmxhZ3MgPSBjdXJyZW50X25leHRfZmxhZ3M7CisJc3AtPnNzdF9uZXh0X2xpc3QgPSBjdXJyZW50X25leHRfbGlzdDsKKwlzcC0+c3N0X3RpY2sgPSBkaXNwbGF5X3RpY2s7CisJc3AtPnNzdF9jaGFuZ2VfbG51bSA9IDA7CisgICAgfQorICAgIGN1cnJlbnRfc3RhdGVfc3RvcmVkID0gVFJVRTsKKyAgICByZXR1cm4gc3A7Cit9CisKKy8qCisgKiBDb3B5IGEgc3RhdGUgc3RhY2sgZnJvbSAiZnJvbSIgaW4gYl9zc3RfYXJyYXlbXSB0byBjdXJyZW50X3N0YXRlOworICovCisgICAgc3RhdGljIHZvaWQKK2xvYWRfY3VycmVudF9zdGF0ZShmcm9tKQorICAgIHN5bnN0YXRlX1QJKmZyb207Cit7CisgICAgaW50CQlpOworICAgIGJ1ZnN0YXRlX1QJKmJwOworCisgICAgY2xlYXJfY3VycmVudF9zdGF0ZSgpOworICAgIHZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKKyAgICBrZWVwZW5kX2xldmVsID0gLTE7CisgICAgaWYgKGZyb20tPnNzdF9zdGFja3NpemUKKwkgICAgJiYgZ2FfZ3JvdygmY3VycmVudF9zdGF0ZSwgZnJvbS0+c3N0X3N0YWNrc2l6ZSkgIT0gRkFJTCkKKyAgICB7CisJaWYgKGZyb20tPnNzdF9zdGFja3NpemUgPiBTU1RfRklYX1NUQVRFUykKKwkgICAgYnAgPSBTWU5fU1RBVEVfUCgmKGZyb20tPnNzdF91bmlvbi5zc3RfZ2EpKTsKKwllbHNlCisJICAgIGJwID0gZnJvbS0+c3N0X3VuaW9uLnNzdF9zdGFjazsKKwlmb3IgKGkgPSAwOyBpIDwgZnJvbS0+c3N0X3N0YWNrc2l6ZTsgKytpKQorCXsKKwkgICAgQ1VSX1NUQVRFKGkpLnNpX2lkeCA9IGJwW2ldLmJzX2lkeDsKKwkgICAgQ1VSX1NUQVRFKGkpLnNpX2ZsYWdzID0gYnBbaV0uYnNfZmxhZ3M7CisJICAgIENVUl9TVEFURShpKS5zaV9leHRtYXRjaCA9IHJlZl9leHRtYXRjaChicFtpXS5ic19leHRtYXRjaCk7CisJICAgIGlmIChrZWVwZW5kX2xldmVsIDwgMCAmJiAoQ1VSX1NUQVRFKGkpLnNpX2ZsYWdzICYgSExfS0VFUEVORCkpCisJCWtlZXBlbmRfbGV2ZWwgPSBpOworCSAgICBDVVJfU1RBVEUoaSkuc2lfZW5kcyA9IEZBTFNFOworCSAgICBDVVJfU1RBVEUoaSkuc2lfbV9sbnVtID0gMDsKKwkgICAgaWYgKENVUl9TVEFURShpKS5zaV9pZHggPj0gMCkKKwkJQ1VSX1NUQVRFKGkpLnNpX25leHRfbGlzdCA9CisJCSAgICAgICAoU1lOX0lURU1TKHN5bl9idWYpW0NVUl9TVEFURShpKS5zaV9pZHhdKS5zcF9uZXh0X2xpc3Q7CisJICAgIGVsc2UKKwkJQ1VSX1NUQVRFKGkpLnNpX25leHRfbGlzdCA9IE5VTEw7CisJICAgIHVwZGF0ZV9zaV9hdHRyKGkpOworCX0KKwljdXJyZW50X3N0YXRlLmdhX2xlbiA9IGZyb20tPnNzdF9zdGFja3NpemU7CisJY3VycmVudF9zdGF0ZS5nYV9yb29tIC09IGN1cnJlbnRfc3RhdGUuZ2FfbGVuOworICAgIH0KKyAgICBjdXJyZW50X25leHRfbGlzdCA9IGZyb20tPnNzdF9uZXh0X2xpc3Q7CisgICAgY3VycmVudF9uZXh0X2ZsYWdzID0gZnJvbS0+c3N0X25leHRfZmxhZ3M7CisgICAgY3VycmVudF9sbnVtID0gZnJvbS0+c3N0X2xudW07Cit9CisKKy8qCisgKiBDb21wYXJlIHNhdmVkIHN0YXRlIHN0YWNrICIqc3AiIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUuCisgKiBSZXR1cm4gVFJVRSB3aGVuIHRoZXkgYXJlIGVxdWFsLgorICovCisgICAgc3RhdGljIGludAorc3luX3N0YWNrX2VxdWFsKHNwKQorICAgIHN5bnN0YXRlX1QgKnNwOworeworICAgIGludAkJaSwgajsKKyAgICBidWZzdGF0ZV9UCSpicDsKKyAgICByZWdfZXh0bWF0Y2hfVAkqc2l4LCAqYnN4OworCisgICAgLyogRmlyc3QgYSBxdWljayBjaGVjayBpZiB0aGUgc3RhY2tzIGhhdmUgdGhlIHNhbWUgc2l6ZSBlbmQgbmV4dGxpc3QuICovCisgICAgaWYgKHNwLT5zc3Rfc3RhY2tzaXplID09IGN1cnJlbnRfc3RhdGUuZ2FfbGVuCisJICAgICYmIHNwLT5zc3RfbmV4dF9saXN0ID09IGN1cnJlbnRfbmV4dF9saXN0KQorICAgIHsKKwkvKiBOZWVkIHRvIGNvbXBhcmUgYWxsIHN0YXRlcyBvbiBib3RoIHN0YWNrcy4gKi8KKwlpZiAoc3AtPnNzdF9zdGFja3NpemUgPiBTU1RfRklYX1NUQVRFUykKKwkgICAgYnAgPSBTWU5fU1RBVEVfUCgmKHNwLT5zc3RfdW5pb24uc3N0X2dhKSk7CisJZWxzZQorCSAgICBicCA9IHNwLT5zc3RfdW5pb24uc3N0X3N0YWNrOworCisJZm9yIChpID0gY3VycmVudF9zdGF0ZS5nYV9sZW47IC0taSA+PSAwOyApCisJeworCSAgICAvKiBJZiB0aGUgaXRlbSBoYXMgYW5vdGhlciBpbmRleCB0aGUgc3RhdGUgaXMgZGlmZmVyZW50LiAqLworCSAgICBpZiAoYnBbaV0uYnNfaWR4ICE9IENVUl9TVEFURShpKS5zaV9pZHgpCisJCWJyZWFrOworCSAgICBpZiAoYnBbaV0uYnNfZXh0bWF0Y2ggIT0gQ1VSX1NUQVRFKGkpLnNpX2V4dG1hdGNoKQorCSAgICB7CisJCS8qIFdoZW4gdGhlIGV4dG1hdGNoIHBvaW50ZXJzIGFyZSBkaWZmZXJlbnQsIHRoZSBzdHJpbmdzIGluCisJCSAqIHRoZW0gY2FuIHN0aWxsIGJlIHRoZSBzYW1lLiAgQ2hlY2sgaWYgdGhlIGV4dG1hdGNoCisJCSAqIHJlZmVyZW5jZXMgYXJlIGVxdWFsLiAqLworCQlic3ggPSBicFtpXS5ic19leHRtYXRjaDsKKwkJc2l4ID0gQ1VSX1NUQVRFKGkpLnNpX2V4dG1hdGNoOworCQkvKiBJZiBvbmUgb2YgdGhlIGV4dG1hdGNoIHBvaW50ZXJzIGlzIE5VTEwgdGhlIHN0YXRlcyBhcmUKKwkJICogZGlmZmVyZW50LiAqLworCQlpZiAoYnN4ID09IE5VTEwgfHwgc2l4ID09IE5VTEwpCisJCSAgICBicmVhazsKKwkJZm9yIChqID0gMDsgaiA8IE5TVUJFWFA7ICsraikKKwkJeworCQkgICAgLyogQ2hlY2sgZWFjaCByZWZlcmVuY2VkIG1hdGNoIHN0cmluZy4gVGhleSBtdXN0IGFsbCBiZQorCQkgICAgICogZXF1YWwuICovCisJCSAgICBpZiAoYnN4LT5tYXRjaGVzW2pdICE9IHNpeC0+bWF0Y2hlc1tqXSkKKwkJICAgIHsKKwkJCS8qIElmIHRoZSBwb2ludGVyIGlzIGRpZmZlcmVudCBpdCBjYW4gc3RpbGwgYmUgdGhlCisJCQkgKiBzYW1lIHRleHQuICBDb21wYXJlIHRoZSBzdHJpbmdzLCBpZ25vcmUgY2FzZSB3aGVuCisJCQkgKiB0aGUgc3RhcnQgaXRlbSBoYXMgdGhlIHNwX2ljIGZsYWcgc2V0LiAqLworCQkJaWYgKGJzeC0+bWF0Y2hlc1tqXSA9PSBOVUxMCisJCQkJfHwgc2l4LT5tYXRjaGVzW2pdID09IE5VTEwpCisJCQkgICAgYnJlYWs7CisJCQlpZiAoKFNZTl9JVEVNUyhzeW5fYnVmKVtDVVJfU1RBVEUoaSkuc2lfaWR4XSkuc3BfaWMKKwkJCQk/IE1CX1NUUklDTVAoYnN4LT5tYXRjaGVzW2pdLAorCQkJCQkJCSBzaXgtPm1hdGNoZXNbal0pICE9IDAKKwkJCQk6IFNUUkNNUChic3gtPm1hdGNoZXNbal0sIHNpeC0+bWF0Y2hlc1tqXSkgIT0gMCkKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCQlpZiAoaiAhPSBOU1VCRVhQKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKGkgPCAwKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogV2Ugc3RvcCBwYXJzaW5nIHN5bnRheCBhYm92ZSBsaW5lICJsbnVtIi4gIElmIHRoZSBzdG9yZWQgc3RhdGUgYXQgb3IgYmVsb3cKKyAqIHRoaXMgbGluZSBkZXBlbmRlZCBvbiBhIGNoYW5nZSBiZWZvcmUgaXQsIGl0IG5vdyBkZXBlbmRzIG9uIHRoZSBsaW5lIGJlbG93CisgKiB0aGUgbGFzdCBwYXJzZWQgbGluZS4KKyAqIFRoZSB3aW5kb3cgbG9va3MgbGlrZSB0aGlzOgorICoJICAgIGxpbmUgd2hpY2ggY2hhbmdlZAorICoJICAgIGRpc3BsYXllZCBsaW5lCisgKgkgICAgZGlzcGxheWVkIGxpbmUKKyAqIGxudW0gLT4gIGxpbmUgYmVsb3cgd2luZG93CisgKi8KKyAgICB2b2lkCitzeW50YXhfZW5kX3BhcnNpbmcobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIHN5bnN0YXRlX1QJKnNwOworCisgICAgc3AgPSBzeW5fc3RhY2tfZmluZF9lbnRyeShsbnVtKTsKKyAgICBpZiAoc3AgIT0gTlVMTCAmJiBzcC0+c3N0X2xudW0gPCBsbnVtKQorCXNwID0gc3AtPnNzdF9uZXh0OworCisgICAgaWYgKHNwICE9IE5VTEwgJiYgc3AtPnNzdF9jaGFuZ2VfbG51bSAhPSAwKQorCXNwLT5zc3RfY2hhbmdlX2xudW0gPSBsbnVtOworfQorCisvKgorICogRW5kIG9mIGhhbmRsaW5nIG9mIHRoZSBzdGF0ZSBzdGFjay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhdGljIHZvaWQKK2ludmFsaWRhdGVfY3VycmVudF9zdGF0ZSgpCit7CisgICAgY2xlYXJfY3VycmVudF9zdGF0ZSgpOworICAgIGN1cnJlbnRfc3RhdGUuZ2FfaXRlbXNpemUgPSAwOwkvKiBtYXJrIGN1cnJlbnRfc3RhdGUgaW52YWxpZCAqLworICAgIGN1cnJlbnRfbmV4dF9saXN0ID0gTlVMTDsKKyAgICBrZWVwZW5kX2xldmVsID0gLTE7Cit9CisKKyAgICBzdGF0aWMgdm9pZAordmFsaWRhdGVfY3VycmVudF9zdGF0ZSgpCit7CisgICAgY3VycmVudF9zdGF0ZS5nYV9pdGVtc2l6ZSA9IHNpemVvZihzdGF0ZWl0ZW1fVCk7CisgICAgY3VycmVudF9zdGF0ZS5nYV9ncm93c2l6ZSA9IDM7Cit9CisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgc3ludGF4IGF0IHN0YXJ0IG9mIGxudW0gY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUuCisgKiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQganVzdCBhZnRlciBnZXRfc3ludGF4X2F0dHIoKSBmb3IgdGhlIHByZXZpb3VzCisgKiBsaW5lLCB0byBjaGVjayBpZiB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGJlIHJlZHJhd24gdG9vLgorICovCisgICAgaW50CitzeW50YXhfY2hlY2tfY2hhbmdlZChsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgaW50CQlyZXR2YWwgPSBUUlVFOworICAgIHN5bnN0YXRlX1QJKnNwOworCisgICAgcmVnX3N5biA9IFRSVUU7CS8qIGxldCB2aW1fcmVnZXhlYygpIGtub3cgd2UncmUgdXNpbmcgc3ludGF4ICovCisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBzdGF0ZSBzdGFjayB3aGVuOgorICAgICAqIC0gbG51bSBpcyBqdXN0IGJlbG93IHRoZSBwcmV2aW91c2x5IHN5bnRheGVkIGxpbmUuCisgICAgICogLSBsbnVtIGlzIG5vdCBiZWZvcmUgdGhlIGxpbmVzIHdpdGggc2F2ZWQgc3RhdGVzLgorICAgICAqIC0gbG51bSBpcyBub3QgcGFzdCB0aGUgbGluZXMgd2l0aCBzYXZlZCBzdGF0ZXMuCisgICAgICogLSBsbnVtIGlzIGF0IG9yIGJlZm9yZSB0aGUgbGFzdCBjaGFuZ2VkIGxpbmUuCisgICAgICovCisgICAgaWYgKFZBTElEX1NUQVRFKCZjdXJyZW50X3N0YXRlKSAmJiBsbnVtID09IGN1cnJlbnRfbG51bSArIDEpCisgICAgeworCXNwID0gc3luX3N0YWNrX2ZpbmRfZW50cnkobG51bSk7CisJaWYgKHNwICE9IE5VTEwgJiYgc3AtPnNzdF9sbnVtID09IGxudW0pCisJeworCSAgICAvKgorCSAgICAgKiBmaW5pc2ggdGhlIHByZXZpb3VzIGxpbmUgKG5lZWRlZCB3aGVuIG5vdCBhbGwgb2YgdGhlIGxpbmUgd2FzCisJICAgICAqIGRyYXduKQorCSAgICAgKi8KKwkgICAgKHZvaWQpc3luX2ZpbmlzaF9saW5lKEZBTFNFKTsKKworCSAgICAvKgorCSAgICAgKiBDb21wYXJlIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggdGhlIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUgb2YKKwkgICAgICogdGhlIGxpbmUuCisJICAgICAqLworCSAgICBpZiAoc3luX3N0YWNrX2VxdWFsKHNwKSkKKwkJcmV0dmFsID0gRkFMU0U7CisKKwkgICAgLyoKKwkgICAgICogU3RvcmUgdGhlIGN1cnJlbnQgc3RhdGUgaW4gYl9zc3RfYXJyYXlbXSBmb3IgbGF0ZXIgdXNlLgorCSAgICAgKi8KKwkgICAgKytjdXJyZW50X2xudW07CisJICAgICh2b2lkKXN0b3JlX2N1cnJlbnRfc3RhdGUoTlVMTCk7CisJfQorICAgIH0KKworICAgIHJlZ19zeW4gPSBGQUxTRTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGaW5pc2ggdGhlIGN1cnJlbnQgbGluZS4KKyAqIFRoaXMgZG9lc24ndCByZXR1cm4gYW55IGF0dHJpYnV0ZXMsIGl0IG9ubHkgZ2V0cyB0aGUgc3RhdGUgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpbmUuICBJdCBjYW4gc3RhcnQgYW55d2hlcmUgaW4gdGhlIGxpbmUsIGFzIGxvbmcgYXMgdGhlIGN1cnJlbnQgc3RhdGUKKyAqIGlzIHZhbGlkLgorICovCisgICAgc3RhdGljIGludAorc3luX2ZpbmlzaF9saW5lKHN5bmNpbmcpCisgICAgaW50CSAgICBzeW5jaW5nOwkJLyogY2FsbGVkIGZvciBzeW5jaW5nICovCit7CisgICAgc3RhdGVpdGVtX1QJKmN1cl9zaTsKKworICAgIGlmICghY3VycmVudF9maW5pc2hlZCkKKyAgICB7CisJd2hpbGUgKCFjdXJyZW50X2ZpbmlzaGVkKQorCXsKKwkgICAgKHZvaWQpc3luX2N1cnJlbnRfYXR0cihzeW5jaW5nLCBGQUxTRSk7CisJICAgIC8qCisJICAgICAqIFdoZW4gc3luY2luZywgYW5kIGZvdW5kIHNvbWUgaXRlbSwgbmVlZCB0byBjaGVjayB0aGUgaXRlbS4KKwkgICAgICovCisJICAgIGlmIChzeW5jaW5nICYmIGN1cnJlbnRfc3RhdGUuZ2FfbGVuKQorCSAgICB7CisJCS8qCisJCSAqIENoZWNrIGZvciBtYXRjaCB3aXRoIHN5bmMgaXRlbS4KKwkJICovCisJCWN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKwkJaWYgKGN1cl9zaS0+c2lfaWR4ID49IDAKKwkJCSYmIChTWU5fSVRFTVMoc3luX2J1ZilbY3VyX3NpLT5zaV9pZHhdLnNwX2ZsYWdzCisJCQkJCSAgICAgICYgKEhMX1NZTkNfSEVSRXxITF9TWU5DX1RIRVJFKSkpCisJCSAgICByZXR1cm4gVFJVRTsKKworCQkvKiBzeW5fY3VycmVudF9hdHRyKCkgd2lsbCBoYXZlIHNraXBwZWQgdGhlIGNoZWNrIGZvciBhbiBpdGVtCisJCSAqIHRoYXQgZW5kcyBoZXJlLCBuZWVkIHRvIGRvIHRoYXQgbm93LiAqLworCQkrK2N1cnJlbnRfY29sOworCQljaGVja19zdGF0ZV9lbmRzKCk7CisJCS0tY3VycmVudF9jb2w7CisJICAgIH0KKwkgICAgKytjdXJyZW50X2NvbDsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFJldHVybiBoaWdobGlnaHQgYXR0cmlidXRlcyBmb3IgbmV4dCBjaGFyYWN0ZXIuCisgKiBNdXN0IGZpcnN0IGNhbGwgc3ludGF4X3N0YXJ0KCkgb25jZSBmb3IgdGhlIGxpbmUuCisgKiAiY29sIiBpcyBub3JtYWxseSAwIGZvciB0aGUgZmlyc3QgdXNlIGluIGEgbGluZSwgYW5kIGluY3JlbWVudHMgYnkgb25lIGVhY2gKKyAqIHRpbWUuICBJdCdzIGFsbG93ZWQgdG8gc2tpcCBjaGFyYWN0ZXJzIGFuZCB0byBzdG9wIGJlZm9yZSB0aGUgZW5kIG9mIHRoZQorICogbGluZS4gIEJ1dCBvbmx5IGEgImNvbCIgYWZ0ZXIgYSBwcmV2aW91c2x5IHVzZWQgY29sdW1uIGlzIGFsbG93ZWQuCisgKi8KKyAgICBpbnQKK2dldF9zeW50YXhfYXR0cihjb2wpCisgICAgY29sbnJfVAljb2w7Cit7CisgICAgaW50CSAgICBhdHRyID0gMDsKKworICAgIC8qIGNoZWNrIGZvciBvdXQgb2YgbWVtb3J5IHNpdHVhdGlvbiAqLworICAgIGlmIChzeW5fYnVmLT5iX3NzdF9hcnJheSA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgcmVnX3N5biA9IFRSVUU7CS8qIGxldCB2aW1fcmVnZXhlYygpIGtub3cgd2UncmUgdXNpbmcgc3ludGF4ICovCisKKyAgICAvKiBNYWtlIHN1cmUgY3VycmVudF9zdGF0ZSBpcyB2YWxpZCAqLworICAgIGlmIChJTlZBTElEX1NUQVRFKCZjdXJyZW50X3N0YXRlKSkKKwl2YWxpZGF0ZV9jdXJyZW50X3N0YXRlKCk7CisKKyAgICAvKgorICAgICAqIFNraXAgZnJvbSB0aGUgY3VycmVudCBjb2x1bW4gdG8gImNvbCIsIGdldCB0aGUgYXR0cmlidXRlcyBmb3IgImNvbCIuCisgICAgICovCisgICAgd2hpbGUgKGN1cnJlbnRfY29sIDw9IGNvbCkKKyAgICB7CisJYXR0ciA9IHN5bl9jdXJyZW50X2F0dHIoRkFMU0UsIFRSVUUpOworCSsrY3VycmVudF9jb2w7CisgICAgfQorCisgICAgcmVnX3N5biA9IEZBTFNFOworICAgIHJldHVybiBhdHRyOworfQorCisvKgorICogR2V0IHN5bnRheCBhdHRyaWJ1dGVzIGZvciBjdXJyZW50X2xudW0sIGN1cnJlbnRfY29sLgorICovCisgICAgc3RhdGljIGludAorc3luX2N1cnJlbnRfYXR0cihzeW5jaW5nLCBkaXNwbGF5aW5nKQorICAgIGludAkJc3luY2luZzsJCS8qIFdoZW4gMTogY2FsbGVkIGZvciBzeW5jaW5nICovCisgICAgaW50CQlkaXNwbGF5aW5nOwkJLyogcmVzdWx0IHdpbGwgYmUgZGlzcGxheWVkICovCit7CisgICAgaW50CQlzeW5faWQ7CisgICAgbHBvc19UCWVuZHBvczsJCS8qIHdhczogY2hhcl91ICplbmRwOyAqLworICAgIGxwb3NfVAlobF9zdGFydHBvczsJLyogd2FzOiBpbnQgaGxfc3RhcnRjb2w7ICovCisgICAgbHBvc19UCWhsX2VuZHBvczsKKyAgICBscG9zX1QJZW9zX3BvczsJLyogZW5kLW9mLXN0YXJ0IG1hdGNoIChzdGFydCByZWdpb24pICovCisgICAgbHBvc19UCWVvZV9wb3M7CS8qIGVuZC1vZi1lbmQgcGF0dGVybiAqLworICAgIGludAkJZW5kX2lkeDsJLyogZ3JvdXAgSUQgZm9yIGVuZCBwYXR0ZXJuICovCisgICAgaW50CQlpZHg7CisgICAgc3lucGF0X1QJKnNwcDsKKyAgICBzdGF0ZWl0ZW1fVAkqY3VyX3NpLCAqc2lwOworICAgIGludAkJc3RhcnRjb2w7CisgICAgaW50CQllbmRjb2w7CisgICAgbG9uZwlmbGFnczsKKyAgICBzaG9ydAkqbmV4dF9saXN0OworICAgIGludAkJZm91bmRfbWF0Y2g7CQkgICAgLyogZm91bmQgdXNhYmxlIG1hdGNoICovCisgICAgc3RhdGljIGludAl0cnlfbmV4dF9jb2x1bW4gPSBGQUxTRTsgICAgLyogbXVzdCB0cnkgaW4gbmV4dCBjb2wgKi8KKyAgICBpbnQJCWRvX2tleXdvcmRzOworICAgIHJlZ21tYXRjaF9UCXJlZ21hdGNoOworICAgIGxwb3NfVAlwb3M7CisgICAgaW50CQlsY19jb2w7CisgICAgcmVnX2V4dG1hdGNoX1QgKmN1cl9leHRtYXRjaCA9IE5VTEw7CisgICAgY2hhcl91CSpsaW5lOwkJLyogY3VycmVudCBsaW5lLiAgTk9URTogYmVjb21lcyBpbnZhbGlkIGFmdGVyCisJCQkJICAgbG9va2luZyBmb3IgYSBwYXR0ZXJuIG1hdGNoISAqLworCisgICAgLyogdmFyaWFibGVzIGZvciB6ZXJvLXdpZHRoIG1hdGNoZXMgdGhhdCBoYXZlIGEgIm5leHRncm91cCIgYXJndW1lbnQgKi8KKyAgICBpbnQJCWtlZXBfbmV4dF9saXN0OworICAgIGludAkJemVyb193aWR0aF9uZXh0X2xpc3QgPSBGQUxTRTsKKyAgICBnYXJyYXlfVAl6ZXJvX3dpZHRoX25leHRfZ2E7CisKKyAgICAvKgorICAgICAqIE5vIGNoYXJhY3Rlciwgbm8gYXR0cmlidXRlcyEgIFBhc3QgZW5kIG9mIGxpbmU/CisgICAgICogRG8gdHJ5IG1hdGNoaW5nIHdpdGggYW4gZW1wdHkgbGluZSAoY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgcmVnaW9uKS4KKyAgICAgKi8KKyAgICBsaW5lID0gc3luX2dldGN1cmxpbmUoKTsKKyAgICBpZiAobGluZVtjdXJyZW50X2NvbF0gPT0gTlVMICYmIGN1cnJlbnRfY29sICE9IDApCisgICAgeworCS8qCisJICogSWYgd2UgZm91bmQgYSBtYXRjaCBhZnRlciB0aGUgbGFzdCBjb2x1bW4sIHVzZSBpdC4KKwkgKi8KKwlpZiAobmV4dF9tYXRjaF9pZHggPj0gMCAmJiBuZXh0X21hdGNoX2NvbCA+PSAoaW50KWN1cnJlbnRfY29sCisJCQkJCQkgICYmIG5leHRfbWF0Y2hfY29sICE9IE1BWENPTCkKKwkgICAgKHZvaWQpcHVzaF9uZXh0X21hdGNoKE5VTEwpOworCisJY3VycmVudF9maW5pc2hlZCA9IFRSVUU7CisJY3VycmVudF9zdGF0ZV9zdG9yZWQgPSBGQUxTRTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgY3VycmVudCBvciBuZXh0IGNoYXJhY3RlciBpcyBOVUwsIHdlIHdpbGwgZmluaXNoIHRoZSBsaW5lIG5vdyAqLworICAgIGlmIChsaW5lW2N1cnJlbnRfY29sXSA9PSBOVUwgfHwgbGluZVtjdXJyZW50X2NvbCArIDFdID09IE5VTCkKKyAgICB7CisJY3VycmVudF9maW5pc2hlZCA9IFRSVUU7CisJY3VycmVudF9zdGF0ZV9zdG9yZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gaW4gdGhlIHByZXZpb3VzIGNvbHVtbiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgaXQgY291bGQgbm90IGJlIHVzZWQKKyAgICAgKiAoZW1wdHkgbWF0Y2ggb3IgYWxyZWFkeSBtYXRjaGVkIGluIHRoaXMgY29sdW1uKSBuZWVkIHRvIHRyeSBhZ2FpbiBpbgorICAgICAqIHRoZSBuZXh0IGNvbHVtbi4KKyAgICAgKi8KKyAgICBpZiAodHJ5X25leHRfY29sdW1uKQorICAgIHsKKwluZXh0X21hdGNoX2lkeCA9IC0xOworCXRyeV9uZXh0X2NvbHVtbiA9IEZBTFNFOworICAgIH0KKworICAgIC8qIE9ubHkgY2hlY2sgZm9yIGtleXdvcmRzIHdoZW4gbm90IHN5bmNpbmcgYW5kIHRoZXJlIGFyZSBzb21lLiAqLworICAgIGRvX2tleXdvcmRzID0gIXN5bmNpbmcKKwkJICAgICYmIChzeW5fYnVmLT5iX2tleXd0YWIgIT0gTlVMTAorCQkJICAgIHx8IHN5bl9idWYtPmJfa2V5d3RhYl9pYyAhPSBOVUxMKTsKKworICAgIC8qIEluaXQgdGhlIGxpc3Qgb2YgemVyby13aWR0aCBtYXRjaGVzIHdpdGggYSBuZXh0bGlzdC4gIFRoaXMgaXMgdXNlZCB0bworICAgICAqIGF2b2lkIG1hdGNoaW5nIHRoZSBzYW1lIGl0ZW0gaW4gdGhlIHNhbWUgcG9zaXRpb24gdHdpY2UuICovCisgICAgZ2FfaW5pdDIoJnplcm9fd2lkdGhfbmV4dF9nYSwgKGludClzaXplb2YoaW50KSwgMTApOworCisgICAgLyoKKyAgICAgKiBSZXBlYXQgbWF0Y2hpbmcga2V5d29yZHMgYW5kIHBhdHRlcm5zLCB0byBmaW5kIGNvbnRhaW5lZCBpdGVtcyBhdCB0aGUKKyAgICAgKiBzYW1lIGNvbHVtbi4gIFRoaXMgc3RvcHMgd2hlbiB0aGVyZSBhcmUgbm8gZXh0cmEgbWF0Y2hlcyBhdCB0aGUgY3VycmVudAorICAgICAqIGNvbHVtbi4KKyAgICAgKi8KKyAgICBkbworICAgIHsKKwlmb3VuZF9tYXRjaCA9IEZBTFNFOworCWtlZXBfbmV4dF9saXN0ID0gRkFMU0U7CisJc3luX2lkID0gMDsKKworCS8qCisJICogMS4gQ2hlY2sgZm9yIGEgY3VycmVudCBzdGF0ZS4KKwkgKiAgICBPbmx5IHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudCBzdGF0ZSwgb3IgaWYgdGhlIGN1cnJlbnQgc3RhdGUgbWF5CisJICogICAgY29udGFpbiBvdGhlciB0aGluZ3MsIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGtleXdvcmRzIGFuZCBwYXR0ZXJucy4KKwkgKiAgICBBbHdheXMgbmVlZCB0byBjaGVjayBmb3IgY29udGFpbmVkIGl0ZW1zIGlmIHNvbWUgaXRlbSBoYXMgdGhlCisJICogICAgImNvbnRhaW5lZGluIiBhcmd1bWVudCAodGFrZXMgZXh0cmEgdGltZSEpLgorCSAqLworCWlmIChjdXJyZW50X3N0YXRlLmdhX2xlbikKKwkgICAgY3VyX3NpID0gJkNVUl9TVEFURShjdXJyZW50X3N0YXRlLmdhX2xlbiAtIDEpOworCWVsc2UKKwkgICAgY3VyX3NpID0gTlVMTDsKKworCWlmIChzeW5fYnVmLT5iX3N5bl9jb250YWluZWRpbiB8fCBjdXJfc2kgPT0gTlVMTAorCQkJCQkgICAgICB8fCBjdXJfc2ktPnNpX2NvbnRfbGlzdCAhPSBOVUxMKQorCXsKKwkgICAgLyoKKwkgICAgICogMi4gQ2hlY2sgZm9yIGtleXdvcmRzLCBpZiBvbiBhIGtleXdvcmQgY2hhciBhZnRlciBhIG5vbi1rZXl3b3JkCisJICAgICAqCSAgY2hhci4gIERvbid0IGRvIHRoaXMgd2hlbiBzeW5jaW5nLgorCSAgICAgKi8KKwkgICAgaWYgKGRvX2tleXdvcmRzKQorCSAgICB7CisJICAgICAgbGluZSA9IHN5bl9nZXRjdXJsaW5lKCk7CisJICAgICAgaWYgKHZpbV9pc3dvcmRjX2J1ZihsaW5lICsgY3VycmVudF9jb2wsIHN5bl9idWYpCisJCSAgICAgICYmIChjdXJyZW50X2NvbCA9PSAwCisJCQkgIHx8ICF2aW1faXN3b3JkY19idWYobGluZSArIGN1cnJlbnRfY29sIC0gMQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICAgIC0gKGhhc19tYnl0ZQorCQkJCSAgPyAoKm1iX2hlYWRfb2ZmKShsaW5lLCBsaW5lICsgY3VycmVudF9jb2wgLSAxKQorCQkJCSAgOiAwKQorI2VuZGlmCisJCQkgICAgICAgLCBzeW5fYnVmKSkpCisJICAgICAgeworCQlzeW5faWQgPSBjaGVja19rZXl3b3JkX2lkKGxpbmUsIChpbnQpY3VycmVudF9jb2wsCisJCQkJCSAmZW5kY29sLCAmZmxhZ3MsICZuZXh0X2xpc3QsIGN1cl9zaSk7CisJCWlmIChzeW5faWQpCisJCXsKKwkJICAgIGlmIChwdXNoX2N1cnJlbnRfc3RhdGUoS0VZV09SRF9JRFgpID09IE9LKQorCQkgICAgeworCQkJY3VyX3NpID0gJkNVUl9TVEFURShjdXJyZW50X3N0YXRlLmdhX2xlbiAtIDEpOworCQkJY3VyX3NpLT5zaV9tX3N0YXJ0Y29sID0gY3VycmVudF9jb2w7CisJCQljdXJfc2ktPnNpX2hfc3RhcnRwb3MubG51bSA9IGN1cnJlbnRfbG51bTsKKwkJCWN1cl9zaS0+c2lfaF9zdGFydHBvcy5jb2wgPSAwOwkvKiBzdGFydHMgcmlnaHQgYXdheSAqLworCQkJY3VyX3NpLT5zaV9tX2VuZHBvcy5sbnVtID0gY3VycmVudF9sbnVtOworCQkJY3VyX3NpLT5zaV9tX2VuZHBvcy5jb2wgPSBlbmRjb2w7CisJCQljdXJfc2ktPnNpX2hfZW5kcG9zLmxudW0gPSBjdXJyZW50X2xudW07CisJCQljdXJfc2ktPnNpX2hfZW5kcG9zLmNvbCA9IGVuZGNvbDsKKwkJCWN1cl9zaS0+c2lfZW5kcyA9IFRSVUU7CisJCQljdXJfc2ktPnNpX2VuZF9pZHggPSAwOworCQkJY3VyX3NpLT5zaV9mbGFncyA9IGZsYWdzOworCQkJY3VyX3NpLT5zaV9pZCA9IHN5bl9pZDsKKwkJCWN1cl9zaS0+c2lfdHJhbnNfaWQgPSBzeW5faWQ7CisJCQlpZiAoZmxhZ3MgJiBITF9UUkFOU1ApCisJCQl7CisJCQkgICAgaWYgKGN1cnJlbnRfc3RhdGUuZ2FfbGVuIDwgMikKKwkJCSAgICB7CisJCQkJY3VyX3NpLT5zaV9hdHRyID0gMDsKKwkJCQljdXJfc2ktPnNpX3RyYW5zX2lkID0gMDsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQljdXJfc2ktPnNpX2F0dHIgPSBDVVJfU1RBVEUoCisJCQkJCWN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMikuc2lfYXR0cjsKKwkJCQljdXJfc2ktPnNpX3RyYW5zX2lkID0gQ1VSX1NUQVRFKAorCQkJCQljdXJyZW50X3N0YXRlLmdhX2xlbiAtIDIpLnNpX3RyYW5zX2lkOworCQkJICAgIH0KKwkJCX0KKwkJCWVsc2UKKwkJCSAgICBjdXJfc2ktPnNpX2F0dHIgPSBzeW5faWQyYXR0cihzeW5faWQpOworCQkJY3VyX3NpLT5zaV9jb250X2xpc3QgPSBOVUxMOworCQkJY3VyX3NpLT5zaV9uZXh0X2xpc3QgPSBuZXh0X2xpc3Q7CisJCQljaGVja19rZWVwZW5kKCk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQl2aW1fZnJlZShuZXh0X2xpc3QpOworCQl9CisJICAgICAgfQorCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogMy4gQ2hlY2sgZm9yIHBhdHRlcm5zIChvbmx5IGlmIG5vdCBmb3VuZCBhIGtleXdvcmQpLgorCSAgICAgKi8KKwkgICAgaWYgKHN5bl9pZCA9PSAwICYmIHN5bl9idWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbikKKwkgICAgeworCQkvKgorCQkgKiBJZiB3ZSBkaWRuJ3QgY2hlY2sgZm9yIGEgbWF0Y2ggeWV0LCBvciB3ZSBhcmUgcGFzdCBpdCwgY2hlY2sKKwkJICogZm9yIGFueSBtYXRjaCB3aXRoIGEgcGF0dGVybi4KKwkJICovCisJCWlmIChuZXh0X21hdGNoX2lkeCA8IDAgfHwgbmV4dF9tYXRjaF9jb2wgPCAoaW50KWN1cnJlbnRfY29sKQorCQl7CisJCSAgICAvKgorCQkgICAgICogQ2hlY2sgYWxsIHJlbGV2YW50IHBhdHRlcm5zIGZvciBhIG1hdGNoIGF0IHRoaXMKKwkJICAgICAqIHBvc2l0aW9uLiAgVGhpcyBpcyBjb21wbGljYXRlZCwgYmVjYXVzZSBtYXRjaGluZyB3aXRoIGEKKwkJICAgICAqIHBhdHRlcm4gdGFrZXMgcXVpdGUgYSBiaXQgb2YgdGltZSwgdGh1cyB3ZSB3YW50IHRvCisJCSAgICAgKiBhdm9pZCBkb2luZyBpdCB3aGVuIGl0J3Mgbm90IG5lZWRlZC4KKwkJICAgICAqLworCQkgICAgbmV4dF9tYXRjaF9pZHggPSAwOwkJLyogbm8gbWF0Y2ggaW4gdGhpcyBsaW5lIHlldCAqLworCQkgICAgbmV4dF9tYXRjaF9jb2wgPSBNQVhDT0w7CisJCSAgICBmb3IgKGlkeCA9IHN5bl9idWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbjsgLS1pZHggPj0gMDsgKQorCQkgICAgeworCQkJc3BwID0gJihTWU5fSVRFTVMoc3luX2J1ZilbaWR4XSk7CisJCQlpZiAoCSAgIHNwcC0+c3Bfc3luY2luZyA9PSBzeW5jaW5nCisJCQkJJiYgKGRpc3BsYXlpbmcgfHwgIShzcHAtPnNwX2ZsYWdzICYgSExfRElTUExBWSkpCisJCQkJJiYgKHNwcC0+c3BfdHlwZSA9PSBTUFRZUEVfTUFUQ0gKKwkJCQkgICAgfHwgc3BwLT5zcF90eXBlID09IFNQVFlQRV9TVEFSVCkKKwkJCQkmJiAoY3VycmVudF9uZXh0X2xpc3QgIT0gTlVMTAorCQkJCSAgICA/IGluX2lkX2xpc3QoTlVMTCwgY3VycmVudF9uZXh0X2xpc3QsCisJCQkJCQkJICAgICAgJnNwcC0+c3Bfc3luLCAwKQorCQkJCSAgICA6IChjdXJfc2kgPT0gTlVMTAorCQkJCQk/ICEoc3BwLT5zcF9mbGFncyAmIEhMX0NPTlRBSU5FRCkKKwkJCQkJOiBpbl9pZF9saXN0KGN1cl9zaSwKKwkJCQkJICAgIGN1cl9zaS0+c2lfY29udF9saXN0LCAmc3BwLT5zcF9zeW4sCisJCQkJCSAgICBzcHAtPnNwX2ZsYWdzICYgSExfQ09OVEFJTkVEKSkpKQorCQkJeworCQkJICAgIC8qIElmIHdlIGFscmVhZHkgdHJpZWQgbWF0Y2hpbmcgaW4gdGhpcyBsaW5lLCBhbmQKKwkJCSAgICAgKiB0aGVyZSBpc24ndCBhIG1hdGNoIGJlZm9yZSBuZXh0X21hdGNoX2NvbCwgc2tpcAorCQkJICAgICAqIHRoaXMgaXRlbS4gKi8KKwkJCSAgICBpZiAoc3BwLT5zcF9saW5lX2lkID09IGN1cnJlbnRfbGluZV9pZAorCQkJCSAgICAmJiBzcHAtPnNwX3N0YXJ0Y29sID49IG5leHRfbWF0Y2hfY29sKQorCQkJCWNvbnRpbnVlOworCQkJICAgIHNwcC0+c3BfbGluZV9pZCA9IGN1cnJlbnRfbGluZV9pZDsKKworCQkJICAgIGxjX2NvbCA9IGN1cnJlbnRfY29sIC0gc3BwLT5zcF9vZmZzZXRzW1NQT19MQ19PRkZdOworCQkJICAgIGlmIChsY19jb2wgPCAwKQorCQkJCWxjX2NvbCA9IDA7CisKKwkJCSAgICByZWdtYXRjaC5ybW1faWMgPSBzcHAtPnNwX2ljOworCQkJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBzcHAtPnNwX3Byb2c7CisJCQkgICAgaWYgKCFzeW5fcmVnZXhlYygmcmVnbWF0Y2gsIGN1cnJlbnRfbG51bSwKKwkJCQkJCQkgICAgIChjb2xucl9UKWxjX2NvbCkpCisJCQkgICAgeworCQkJCS8qIG5vIG1hdGNoIGluIHRoaXMgbGluZSwgdHJ5IGFub3RoZXIgb25lICovCisJCQkJc3BwLT5zcF9zdGFydGNvbCA9IE1BWENPTDsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisKKwkJCSAgICAvKgorCQkJICAgICAqIENvbXB1dGUgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgbWF0Y2guCisJCQkgICAgICovCisJCQkgICAgc3luX2FkZF9zdGFydF9vZmYoJnBvcywgJnJlZ21hdGNoLAorCQkJCQkJCSBzcHAsIFNQT19NU19PRkYsIC0xKTsKKwkJCSAgICBpZiAocG9zLmxudW0gPiBjdXJyZW50X2xudW0pCisJCQkgICAgeworCQkJCS8qIG11c3QgaGF2ZSB1c2VkIGVuZCBvZiBtYXRjaCBpbiBhIG5leHQgbGluZSwKKwkJCQkgKiB3ZSBjYW4ndCBoYW5kbGUgdGhhdCAqLworCQkJCXNwcC0+c3Bfc3RhcnRjb2wgPSBNQVhDT0w7CisJCQkJY29udGludWU7CisJCQkgICAgfQorCQkJICAgIHN0YXJ0Y29sID0gcG9zLmNvbDsKKworCQkJICAgIC8qIHJlbWVtYmVyIHRoZSBuZXh0IGNvbHVtbiB3aGVyZSB0aGlzIHBhdHRlcm4KKwkJCSAgICAgKiBtYXRjaGVzIGluIHRoZSBjdXJyZW50IGxpbmUgKi8KKwkJCSAgICBzcHAtPnNwX3N0YXJ0Y29sID0gc3RhcnRjb2w7CisKKwkJCSAgICAvKgorCQkJICAgICAqIElmIGEgcHJldmlvdXNseSBmb3VuZCBtYXRjaCBzdGFydHMgYXQgYSBsb3dlcgorCQkJICAgICAqIGNvbHVtbiBudW1iZXIsIGRvbid0IHVzZSB0aGlzIG9uZS4KKwkJCSAgICAgKi8KKwkJCSAgICBpZiAoc3RhcnRjb2wgPj0gbmV4dF9tYXRjaF9jb2wpCisJCQkJY29udGludWU7CisKKwkJCSAgICAvKgorCQkJICAgICAqIElmIHdlIG1hdGNoZWQgdGhpcyBwYXR0ZXJuIGF0IHRoaXMgcG9zaXRpb24KKwkJCSAgICAgKiBiZWZvcmUsIHNraXAgaXQuICBNdXN0IHJldHJ5IGluIHRoZSBuZXh0CisJCQkgICAgICogY29sdW1uLCBiZWNhdXNlIGl0IG1heSBtYXRjaCBmcm9tIHRoZXJlLgorCQkJICAgICAqLworCQkJICAgIGlmIChkaWRfbWF0Y2hfYWxyZWFkeShpZHgsICZ6ZXJvX3dpZHRoX25leHRfZ2EpKQorCQkJICAgIHsKKwkJCQl0cnlfbmV4dF9jb2x1bW4gPSBUUlVFOworCQkJCWNvbnRpbnVlOworCQkJICAgIH0KKworCQkJICAgIGVuZHBvcy5sbnVtID0gcmVnbWF0Y2guZW5kcG9zWzBdLmxudW07CisJCQkgICAgZW5kcG9zLmNvbCA9IHJlZ21hdGNoLmVuZHBvc1swXS5jb2w7CisKKwkJCSAgICAvKiBDb21wdXRlIHRoZSBoaWdobGlnaHQgc3RhcnQuICovCisJCQkgICAgc3luX2FkZF9zdGFydF9vZmYoJmhsX3N0YXJ0cG9zLCAmcmVnbWF0Y2gsCisJCQkJCQkJIHNwcCwgU1BPX0hTX09GRiwgLTEpOworCisJCQkgICAgLyogQ29tcHV0ZSB0aGUgcmVnaW9uIHN0YXJ0LiAqLworCQkJICAgIC8qIERlZmF1bHQgaXMgdG8gdXNlIHRoZSBlbmQgb2YgdGhlIG1hdGNoLiAqLworCQkJICAgIHN5bl9hZGRfZW5kX29mZigmZW9zX3BvcywgJnJlZ21hdGNoLAorCQkJCQkJCSBzcHAsIFNQT19SU19PRkYsIDApOworCisJCQkgICAgLyoKKwkJCSAgICAgKiBHcmFiIHRoZSBleHRlcm5hbCBzdWJtYXRjaGVzIGJlZm9yZSB0aGV5IGdldAorCQkJICAgICAqIG92ZXJ3cml0dGVuLiAgUmVmZXJlbmNlIGNvdW50IGRvZXNuJ3QgY2hhbmdlLgorCQkJICAgICAqLworCQkJICAgIHVucmVmX2V4dG1hdGNoKGN1cl9leHRtYXRjaCk7CisJCQkgICAgY3VyX2V4dG1hdGNoID0gcmVfZXh0bWF0Y2hfb3V0OworCQkJICAgIHJlX2V4dG1hdGNoX291dCA9IE5VTEw7CisKKwkJCSAgICBmbGFncyA9IDA7CisJCQkgICAgZW9lX3Bvcy5sbnVtID0gMDsJLyogYXZvaWQgd2FybmluZyAqLworCQkJICAgIGVvZV9wb3MuY29sID0gMDsKKwkJCSAgICBlbmRfaWR4ID0gMDsKKwkJCSAgICBobF9lbmRwb3MubG51bSA9IDA7CisKKwkJCSAgICAvKgorCQkJICAgICAqIEZvciBhICJvbmVsaW5lIiB0aGUgZW5kIG11c3QgYmUgZm91bmQgaW4gdGhlCisJCQkgICAgICogc2FtZSBsaW5lIHRvby4gIFNlYXJjaCBmb3IgaXQgYWZ0ZXIgdGhlIGVuZCBvZgorCQkJICAgICAqIHRoZSBtYXRjaCB3aXRoIHRoZSBzdGFydCBwYXR0ZXJuLiAgU2V0IHRoZQorCQkJICAgICAqIHJlc3VsdGluZyBlbmQgcG9zaXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkgICAgICovCisJCQkgICAgaWYgKHNwcC0+c3BfdHlwZSA9PSBTUFRZUEVfU1RBUlQKKwkJCQkJICAgICAgJiYgKHNwcC0+c3BfZmxhZ3MgJiBITF9PTkVMSU5FKSkKKwkJCSAgICB7CisJCQkJbHBvc19UCXN0YXJ0cG9zOworCisJCQkJc3RhcnRwb3MgPSBlbmRwb3M7CisJCQkJZmluZF9lbmRwb3MoaWR4LCAmc3RhcnRwb3MsICZlbmRwb3MsICZobF9lbmRwb3MsCisJCQkJICAgICZmbGFncywgJmVvZV9wb3MsICZlbmRfaWR4LCBjdXJfZXh0bWF0Y2gpOworCQkJCWlmIChlbmRwb3MubG51bSA9PSAwKQorCQkJCSAgICBjb250aW51ZTsJICAgIC8qIG5vdCBmb3VuZCAqLworCQkJICAgIH0KKworCQkJICAgIC8qCisJCQkgICAgICogRm9yIGEgIm1hdGNoIiB0aGUgc2l6ZSBtdXN0IGJlID4gMCBhZnRlciB0aGUKKwkJCSAgICAgKiBlbmQgb2Zmc2V0IG5lZWRzIGhhcyBiZWVuIGFkZGVkLiAgRXhjZXB0IHdoZW4KKwkJCSAgICAgKiBzeW5jaW5nLgorCQkJICAgICAqLworCQkJICAgIGVsc2UgaWYgKHNwcC0+c3BfdHlwZSA9PSBTUFRZUEVfTUFUQ0gpCisJCQkgICAgeworCQkJCXN5bl9hZGRfZW5kX29mZigmaGxfZW5kcG9zLCAmcmVnbWF0Y2gsIHNwcCwKKwkJCQkJCQkgICAgICAgU1BPX0hFX09GRiwgMCk7CisJCQkJc3luX2FkZF9lbmRfb2ZmKCZlbmRwb3MsICZyZWdtYXRjaCwgc3BwLAorCQkJCQkJCSAgICAgICBTUE9fTUVfT0ZGLCAwKTsKKwkJCQlpZiAoZW5kcG9zLmxudW0gPT0gY3VycmVudF9sbnVtCisJCQkJICAgICAgJiYgKGludCllbmRwb3MuY29sICsgc3luY2luZyA8IHN0YXJ0Y29sKQorCQkJCXsKKwkJCQkgICAgLyoKKwkJCQkgICAgICogSWYgYW4gZW1wdHkgc3RyaW5nIGlzIG1hdGNoZWQsIG1heSBuZWVkCisJCQkJICAgICAqIHRvIHRyeSBtYXRjaGluZyBhZ2FpbiBhdCBuZXh0IGNvbHVtbi4KKwkJCQkgICAgICovCisJCQkJICAgIGlmIChyZWdtYXRjaC5zdGFydHBvc1swXS5jb2wKKwkJCQkJCSAgICA9PSByZWdtYXRjaC5lbmRwb3NbMF0uY29sKQorCQkJCQl0cnlfbmV4dF9jb2x1bW4gPSBUUlVFOworCQkJCSAgICBjb250aW51ZTsKKwkJCQl9CisJCQkgICAgfQorCisJCQkgICAgLyoKKwkJCSAgICAgKiBrZWVwIHRoZSBiZXN0IG1hdGNoIHNvIGZhciBpbiBuZXh0X21hdGNoXyoKKwkJCSAgICAgKi8KKwkJCSAgICAvKiBIaWdobGlnaHRpbmcgbXVzdCBzdGFydCBhZnRlciBzdGFydHBvcyBhbmQgZW5kCisJCQkgICAgICogYmVmb3JlIGVuZHBvcy4gKi8KKwkJCSAgICBpZiAoaGxfc3RhcnRwb3MubG51bSA9PSBjdXJyZW50X2xudW0KKwkJCQkJICAgJiYgKGludClobF9zdGFydHBvcy5jb2wgPCBzdGFydGNvbCkKKwkJCQlobF9zdGFydHBvcy5jb2wgPSBzdGFydGNvbDsKKwkJCSAgICBsaW1pdF9wb3NfemVybygmaGxfZW5kcG9zLCAmZW5kcG9zKTsKKworCQkJICAgIG5leHRfbWF0Y2hfaWR4ID0gaWR4OworCQkJICAgIG5leHRfbWF0Y2hfY29sID0gc3RhcnRjb2w7CisJCQkgICAgbmV4dF9tYXRjaF9tX2VuZHBvcyA9IGVuZHBvczsKKwkJCSAgICBuZXh0X21hdGNoX2hfZW5kcG9zID0gaGxfZW5kcG9zOworCQkJICAgIG5leHRfbWF0Y2hfaF9zdGFydHBvcyA9IGhsX3N0YXJ0cG9zOworCQkJICAgIG5leHRfbWF0Y2hfZmxhZ3MgPSBmbGFnczsKKwkJCSAgICBuZXh0X21hdGNoX2Vvc19wb3MgPSBlb3NfcG9zOworCQkJICAgIG5leHRfbWF0Y2hfZW9lX3BvcyA9IGVvZV9wb3M7CisJCQkgICAgbmV4dF9tYXRjaF9lbmRfaWR4ID0gZW5kX2lkeDsKKwkJCSAgICB1bnJlZl9leHRtYXRjaChuZXh0X21hdGNoX2V4dG1hdGNoKTsKKwkJCSAgICBuZXh0X21hdGNoX2V4dG1hdGNoID0gY3VyX2V4dG1hdGNoOworCQkJICAgIGN1cl9leHRtYXRjaCA9IE5VTEw7CisJCQl9CisJCSAgICB9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBmb3VuZCBhIG1hdGNoIGF0IHRoZSBjdXJyZW50IGNvbHVtbiwgdXNlIGl0LgorCQkgKi8KKwkJaWYgKG5leHRfbWF0Y2hfaWR4ID49IDAgJiYgbmV4dF9tYXRjaF9jb2wgPT0gKGludCljdXJyZW50X2NvbCkKKwkJeworCQkgICAgc3lucGF0X1QJKmxzcHA7CisKKwkJICAgIC8qIFdoZW4gYSB6ZXJvLXdpZHRoIGl0ZW0gbWF0Y2hlZCB3aGljaCBoYXMgYSBuZXh0Z3JvdXAsCisJCSAgICAgKiBkb24ndCBwdXNoIHRoZSBpdGVtIGJ1dCBzZXQgbmV4dGdyb3VwLiAqLworCQkgICAgbHNwcCA9ICYoU1lOX0lURU1TKHN5bl9idWYpW25leHRfbWF0Y2hfaWR4XSk7CisJCSAgICBpZiAobmV4dF9tYXRjaF9tX2VuZHBvcy5sbnVtID09IGN1cnJlbnRfbG51bQorCQkJICAgICYmIG5leHRfbWF0Y2hfbV9lbmRwb3MuY29sID09IGN1cnJlbnRfY29sCisJCQkgICAgJiYgbHNwcC0+c3BfbmV4dF9saXN0ICE9IE5VTEwpCisJCSAgICB7CisJCQljdXJyZW50X25leHRfbGlzdCA9IGxzcHAtPnNwX25leHRfbGlzdDsKKwkJCWN1cnJlbnRfbmV4dF9mbGFncyA9IGxzcHAtPnNwX2ZsYWdzOworCQkJa2VlcF9uZXh0X2xpc3QgPSBUUlVFOworCQkJemVyb193aWR0aF9uZXh0X2xpc3QgPSBUUlVFOworCisJCQkvKiBBZGQgdGhlIGluZGV4IHRvIGEgbGlzdCwgc28gdGhhdCB3ZSBjYW4gY2hlY2sKKwkJCSAqIGxhdGVyIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggaXQgYWdhaW4gKGFuZCBjYXVzZSBhbgorCQkJICogZW5kbGVzcyBsb29wKS4gKi8KKwkJCWlmIChnYV9ncm93KCZ6ZXJvX3dpZHRoX25leHRfZ2EsIDEpID09IE9LKQorCQkJeworCQkJICAgICgoaW50ICopKHplcm9fd2lkdGhfbmV4dF9nYS5nYV9kYXRhKSkKKwkJCQlbemVyb193aWR0aF9uZXh0X2dhLmdhX2xlbisrXSA9IG5leHRfbWF0Y2hfaWR4OworCQkJICAgIC0temVyb193aWR0aF9uZXh0X2dhLmdhX3Jvb207CisJCQl9CisJCQluZXh0X21hdGNoX2lkeCA9IC0xOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJY3VyX3NpID0gcHVzaF9uZXh0X21hdGNoKGN1cl9zaSk7CisJCSAgICBmb3VuZF9tYXRjaCA9IFRSVUU7CisJCX0KKwkgICAgfQorCX0KKworCS8qCisJICogSGFuZGxlIHNlYXJjaGluZyBmb3IgbmV4dGdyb3VwIG1hdGNoLgorCSAqLworCWlmIChjdXJyZW50X25leHRfbGlzdCAhPSBOVUxMICYmICFrZWVwX25leHRfbGlzdCkKKwl7CisJICAgIC8qCisJICAgICAqIElmIGEgbmV4dGdyb3VwIHdhcyBub3QgZm91bmQsIGNvbnRpbnVlIGxvb2tpbmcgZm9yIG9uZSBpZjoKKwkgICAgICogLSB0aGlzIGlzIGFuIGVtcHR5IGxpbmUgYW5kIHRoZSAic2tpcGVtcHR5IiBvcHRpb24gd2FzIGdpdmVuCisJICAgICAqIC0gd2UgYXJlIG9uIHdoaXRlIHNwYWNlIGFuZCB0aGUgInNraXB3aGl0ZSIgb3B0aW9uIHdhcyBnaXZlbgorCSAgICAgKi8KKwkgICAgaWYgKCFmb3VuZF9tYXRjaCkKKwkgICAgeworCQlsaW5lID0gc3luX2dldGN1cmxpbmUoKTsKKwkJaWYgKCgoY3VycmVudF9uZXh0X2ZsYWdzICYgSExfU0tJUFdISVRFKQorCQkJICAgICYmIHZpbV9pc3doaXRlKGxpbmVbY3VycmVudF9jb2xdKSkKKwkJCXx8ICgoY3VycmVudF9uZXh0X2ZsYWdzICYgSExfU0tJUEVNUFRZKQorCQkJICAgICYmICpsaW5lID09IE5VTCkpCisJCSAgICBicmVhazsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIGEgbmV4dGdyb3VwIHdhcyBmb3VuZDogVXNlIGl0LCBhbmQgY29udGludWUgbG9va2luZyBmb3IKKwkgICAgICogY29udGFpbmVkIG1hdGNoZXMuCisJICAgICAqIElmIGEgbmV4dGdyb3VwIHdhcyBub3QgZm91bmQ6IENvbnRpbnVlIGxvb2tpbmcgZm9yIGEgbm9ybWFsCisJICAgICAqIG1hdGNoLgorCSAgICAgKiBXaGVuIGRpZCBzZXQgY3VycmVudF9uZXh0X2xpc3QgZm9yIGEgemVyby13aWR0aCBpdGVtIGFuZCBubworCSAgICAgKiBtYXRjaCB3YXMgZm91bmQgZG9uJ3QgbG9vcCAod291bGQgZ2V0IHN0dWNrKS4KKwkgICAgICovCisJICAgIGN1cnJlbnRfbmV4dF9saXN0ID0gTlVMTDsKKwkgICAgbmV4dF9tYXRjaF9pZHggPSAtMTsKKwkgICAgaWYgKCF6ZXJvX3dpZHRoX25leHRfbGlzdCkKKwkJZm91bmRfbWF0Y2ggPSBUUlVFOworCX0KKworICAgIH0gd2hpbGUgKGZvdW5kX21hdGNoKTsKKworICAgIC8qCisgICAgICogVXNlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSwgaWYgd2l0aGluIGl0cyBoaWdobGlnaHRpbmcuCisgICAgICogSWYgbm90LCB1c2UgYXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50LWJ1dC1vbmUgc3RhdGUsIGV0Yy4KKyAgICAgKi8KKyAgICBjdXJyZW50X2F0dHIgPSAwOworI2lmZGVmIEZFQVRfRVZBTAorICAgIGN1cnJlbnRfaWQgPSAwOworICAgIGN1cnJlbnRfdHJhbnNfaWQgPSAwOworI2VuZGlmCisgICAgaWYgKGN1cl9zaSAhPSBOVUxMKQorICAgIHsKKwlmb3IgKGlkeCA9IGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMTsgaWR4ID49IDA7IC0taWR4KQorCXsKKwkgICAgc2lwID0gJkNVUl9TVEFURShpZHgpOworCSAgICBpZiAoKGN1cnJlbnRfbG51bSA+IHNpcC0+c2lfaF9zdGFydHBvcy5sbnVtCisJCQl8fCAoY3VycmVudF9sbnVtID09IHNpcC0+c2lfaF9zdGFydHBvcy5sbnVtCisJCQkgICAgJiYgY3VycmVudF9jb2wgPj0gc2lwLT5zaV9oX3N0YXJ0cG9zLmNvbCkpCisJCSAgICAmJiAoc2lwLT5zaV9oX2VuZHBvcy5sbnVtID09IDAKKwkJCXx8IGN1cnJlbnRfbG51bSA8IHNpcC0+c2lfaF9lbmRwb3MubG51bQorCQkJfHwgKGN1cnJlbnRfbG51bSA9PSBzaXAtPnNpX2hfZW5kcG9zLmxudW0KKwkJCSAgICAmJiBjdXJyZW50X2NvbCA8IHNpcC0+c2lfaF9lbmRwb3MuY29sKSkpCisJICAgIHsKKwkJY3VycmVudF9hdHRyID0gc2lwLT5zaV9hdHRyOworI2lmZGVmIEZFQVRfRVZBTAorCQljdXJyZW50X2lkID0gc2lwLT5zaV9pZDsKKwkJY3VycmVudF90cmFuc19pZCA9IHNpcC0+c2lfdHJhbnNfaWQ7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBlbmQgb2YgY3VycmVudCBzdGF0ZSAoYW5kIHRoZSBzdGF0ZXMgYmVmb3JlIGl0KSBhdCB0aGUKKwkgKiBuZXh0IGNvbHVtbi4gIERvbid0IGRvIHRoaXMgZm9yIHN5bmNpbmcsIGJlY2F1c2Ugd2Ugd291bGQgbWlzcyBhCisJICogc2luZ2xlIGNoYXJhY3RlciBtYXRjaC4KKwkgKiBGaXJzdCBjaGVjayBpZiB0aGUgY3VycmVudCBzdGF0ZSBlbmRzIGF0IHRoZSBjdXJyZW50IGNvbHVtbi4gIEl0CisJICogbWF5IGJlIGZvciBhbiBlbXB0eSBtYXRjaCBhbmQgYSBjb250YWluaW5nIGl0ZW0gbWlnaHQgZW5kIGluIHRoZQorCSAqIGN1cnJlbnQgY29sdW1uLgorCSAqLworCWlmICghc3luY2luZykKKwl7CisJICAgIGNoZWNrX3N0YXRlX2VuZHMoKTsKKwkgICAgaWYgKGN1cnJlbnRfc3RhdGUuZ2FfbGVuID4gMCkKKwkgICAgeworCQkrK2N1cnJlbnRfY29sOworCQljaGVja19zdGF0ZV9lbmRzKCk7CisJCS0tY3VycmVudF9jb2w7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogbmV4dGdyb3VwIGVuZHMgYXQgZW5kIG9mIGxpbmUsIHVubGVzcyAic2tpcG5sIiBvciAic2tpcGVtdHB5IiBwcmVzZW50ICovCisgICAgaWYgKGN1cnJlbnRfbmV4dF9saXN0ICE9IE5VTEwKKwkgICAgJiYgc3luX2dldGN1cmxpbmUoKVtjdXJyZW50X2NvbCArIDFdID09IE5VTAorCSAgICAmJiAhKGN1cnJlbnRfbmV4dF9mbGFncyAmIChITF9TS0lQTkwgfCBITF9TS0lQRU1QVFkpKSkKKwljdXJyZW50X25leHRfbGlzdCA9IE5VTEw7CisKKyAgICBpZiAoemVyb193aWR0aF9uZXh0X2dhLmdhX2xlbiA+IDApCisJZ2FfY2xlYXIoJnplcm9fd2lkdGhfbmV4dF9nYSk7CisKKyAgICAvKiBObyBsb25nZXIgbmVlZCBleHRlcm5hbCBtYXRjaGVzLiAgQnV0IGtlZXAgbmV4dF9tYXRjaF9leHRtYXRjaC4gKi8KKyAgICB1bnJlZl9leHRtYXRjaChyZV9leHRtYXRjaF9vdXQpOworICAgIHJlX2V4dG1hdGNoX291dCA9IE5VTEw7CisgICAgdW5yZWZfZXh0bWF0Y2goY3VyX2V4dG1hdGNoKTsKKworICAgIHJldHVybiBjdXJyZW50X2F0dHI7Cit9CisKKworLyoKKyAqIENoZWNrIGlmIHdlIGFscmVhZHkgbWF0Y2hlZCBwYXR0ZXJuICJpZHgiIGF0IHRoZSBjdXJyZW50IGNvbHVtbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2RpZF9tYXRjaF9hbHJlYWR5KGlkeCwgZ2FwKQorICAgIGludAkJaWR4OworICAgIGdhcnJheV9UCSpnYXA7Cit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gY3VycmVudF9zdGF0ZS5nYV9sZW47IC0taSA+PSAwOyApCisJaWYgKENVUl9TVEFURShpKS5zaV9tX3N0YXJ0Y29sID09IChpbnQpY3VycmVudF9jb2wKKwkJJiYgQ1VSX1NUQVRFKGkpLnNpX21fbG51bSA9PSAoaW50KWN1cnJlbnRfbG51bQorCQkmJiBDVVJfU1RBVEUoaSkuc2lfaWR4ID09IGlkeCkKKwkgICAgcmV0dXJuIFRSVUU7CisKKyAgICAvKiBaZXJvLXdpZHRoIG1hdGNoZXMgd2l0aCBhIG5leHRncm91cCBhcmd1bWVudCBhcmUgbm90IHB1dCBvbiB0aGUgc3ludGF4CisgICAgICogc3RhY2ssIGFuZCBjYW4gb25seSBiZSBtYXRjaGVkIG9uY2UgYW55d2F5LiAqLworICAgIGZvciAoaSA9IGdhcC0+Z2FfbGVuOyAtLWkgPj0gMDsgKQorCWlmICgoKGludCAqKShnYXAtPmdhX2RhdGEpKVtpXSA9PSBpZHgpCisJICAgIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUHVzaCB0aGUgbmV4dCBtYXRjaCBvbnRvIHRoZSBzdGFjay4KKyAqLworICAgIHN0YXRpYyBzdGF0ZWl0ZW1fVCAqCitwdXNoX25leHRfbWF0Y2goY3VyX3NpKQorICAgIHN0YXRlaXRlbV9UCSpjdXJfc2k7Cit7CisgICAgc3lucGF0X1QJKnNwcDsKKworICAgIHNwcCA9ICYoU1lOX0lURU1TKHN5bl9idWYpW25leHRfbWF0Y2hfaWR4XSk7CisKKyAgICAvKgorICAgICAqIFB1c2ggdGhlIGl0ZW0gaW4gY3VycmVudF9zdGF0ZSBzdGFjazsKKyAgICAgKi8KKyAgICBpZiAocHVzaF9jdXJyZW50X3N0YXRlKG5leHRfbWF0Y2hfaWR4KSA9PSBPSykKKyAgICB7CisJLyoKKwkgKiBJZiBpdCdzIGEgc3RhcnQtc2tpcC1lbmQgdHlwZSB0aGF0IGNyb3NzZXMgbGluZXMsIGZpZ3VyZSBvdXQgaG93CisJICogbXVjaCBpdCBjb250aW51ZXMgaW4gdGhpcyBsaW5lLiAgT3RoZXJ3aXNlIGp1c3QgZmlsbCBpbiB0aGUgbGVuZ3RoLgorCSAqLworCWN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKwljdXJfc2ktPnNpX2hfc3RhcnRwb3MgPSBuZXh0X21hdGNoX2hfc3RhcnRwb3M7CisJY3VyX3NpLT5zaV9tX3N0YXJ0Y29sID0gY3VycmVudF9jb2w7CisJY3VyX3NpLT5zaV9tX2xudW0gPSBjdXJyZW50X2xudW07CisJY3VyX3NpLT5zaV9mbGFncyA9IHNwcC0+c3BfZmxhZ3M7CisJY3VyX3NpLT5zaV9uZXh0X2xpc3QgPSBzcHAtPnNwX25leHRfbGlzdDsKKwljdXJfc2ktPnNpX2V4dG1hdGNoID0gcmVmX2V4dG1hdGNoKG5leHRfbWF0Y2hfZXh0bWF0Y2gpOworCWlmIChzcHAtPnNwX3R5cGUgPT0gU1BUWVBFX1NUQVJUICYmICEoc3BwLT5zcF9mbGFncyAmIEhMX09ORUxJTkUpKQorCXsKKwkgICAgLyogVHJ5IHRvIGZpbmQgdGhlIGVuZCBwYXR0ZXJuIGluIHRoZSBjdXJyZW50IGxpbmUgKi8KKwkgICAgdXBkYXRlX3NpX2VuZChjdXJfc2ksIChpbnQpKG5leHRfbWF0Y2hfbV9lbmRwb3MuY29sKSwgVFJVRSk7CisJICAgIGNoZWNrX2tlZXBlbmQoKTsKKwl9CisJZWxzZQorCXsKKwkgICAgY3VyX3NpLT5zaV9tX2VuZHBvcyA9IG5leHRfbWF0Y2hfbV9lbmRwb3M7CisJICAgIGN1cl9zaS0+c2lfaF9lbmRwb3MgPSBuZXh0X21hdGNoX2hfZW5kcG9zOworCSAgICBjdXJfc2ktPnNpX2VuZHMgPSBUUlVFOworCSAgICBjdXJfc2ktPnNpX2ZsYWdzIHw9IG5leHRfbWF0Y2hfZmxhZ3M7CisJICAgIGN1cl9zaS0+c2lfZW9lX3BvcyA9IG5leHRfbWF0Y2hfZW9lX3BvczsKKwkgICAgY3VyX3NpLT5zaV9lbmRfaWR4ID0gbmV4dF9tYXRjaF9lbmRfaWR4OworCX0KKwlpZiAoa2VlcGVuZF9sZXZlbCA8IDAgJiYgKGN1cl9zaS0+c2lfZmxhZ3MgJiBITF9LRUVQRU5EKSkKKwkgICAga2VlcGVuZF9sZXZlbCA9IGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMTsKKwljaGVja19rZWVwZW5kKCk7CisJdXBkYXRlX3NpX2F0dHIoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKworCS8qCisJICogSWYgdGhlIHN0YXJ0IHBhdHRlcm4gaGFzIGFub3RoZXIgaGlnaGxpZ2h0IGdyb3VwLCBwdXNoIGFub3RoZXIgaXRlbQorCSAqIG9uIHRoZSBzdGFjayBmb3IgdGhlIHN0YXJ0IHBhdHRlcm4uCisJICovCisJaWYgKAkgICBzcHAtPnNwX3R5cGUgPT0gU1BUWVBFX1NUQVJUCisJCSYmIHNwcC0+c3Bfc3luX21hdGNoX2lkICE9IDAKKwkJJiYgcHVzaF9jdXJyZW50X3N0YXRlKG5leHRfbWF0Y2hfaWR4KSA9PSBPSykKKwl7CisJICAgIGN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKwkgICAgY3VyX3NpLT5zaV9oX3N0YXJ0cG9zID0gbmV4dF9tYXRjaF9oX3N0YXJ0cG9zOworCSAgICBjdXJfc2ktPnNpX21fc3RhcnRjb2wgPSBjdXJyZW50X2NvbDsKKwkgICAgY3VyX3NpLT5zaV9tX2xudW0gPSBjdXJyZW50X2xudW07CisJICAgIGN1cl9zaS0+c2lfbV9lbmRwb3MgPSBuZXh0X21hdGNoX2Vvc19wb3M7CisJICAgIGN1cl9zaS0+c2lfaF9lbmRwb3MgPSBuZXh0X21hdGNoX2Vvc19wb3M7CisJICAgIGN1cl9zaS0+c2lfZW5kcyA9IFRSVUU7CisJICAgIGN1cl9zaS0+c2lfZW5kX2lkeCA9IDA7CisJICAgIGN1cl9zaS0+c2lfZmxhZ3MgPSBITF9NQVRDSDsKKwkgICAgY3VyX3NpLT5zaV9uZXh0X2xpc3QgPSBOVUxMOworCSAgICBjaGVja19rZWVwZW5kKCk7CisJICAgIHVwZGF0ZV9zaV9hdHRyKGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMSk7CisJfQorICAgIH0KKworICAgIG5leHRfbWF0Y2hfaWR4ID0gLTE7CS8qIHRyeSBvdGhlciBtYXRjaCBuZXh0IHRpbWUgKi8KKworICAgIHJldHVybiBjdXJfc2k7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgZW5kIG9mIGN1cnJlbnQgc3RhdGUgKGFuZCB0aGUgc3RhdGVzIGJlZm9yZSBpdCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfc3RhdGVfZW5kcygpCit7CisgICAgc3RhdGVpdGVtX1QJKmN1cl9zaTsKKyAgICBpbnQJCWhhZF9leHRlbmQgPSBGQUxTRTsKKworICAgIGN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoY3VyX3NpLT5zaV9lbmRzCisJCSYmIChjdXJfc2ktPnNpX21fZW5kcG9zLmxudW0gPCBjdXJyZW50X2xudW0KKwkJICAgIHx8IChjdXJfc2ktPnNpX21fZW5kcG9zLmxudW0gPT0gY3VycmVudF9sbnVtCisJCQkmJiBjdXJfc2ktPnNpX21fZW5kcG9zLmNvbCA8PSBjdXJyZW50X2NvbCkpKQorCXsKKwkgICAgLyoKKwkgICAgICogSWYgdGhlcmUgaXMgYW4gZW5kIHBhdHRlcm4gZ3JvdXAgSUQsIGhpZ2hsaWdodCB0aGUgZW5kIHBhdHRlcm4KKwkgICAgICogbm93LiAgTm8gbmVlZCB0byBwb3AgdGhlIGN1cnJlbnQgaXRlbSBmcm9tIHRoZSBzdGFjay4KKwkgICAgICogT25seSBkbyB0aGlzIGlmIHRoZSBlbmQgcGF0dGVybiBjb250aW51ZXMgYmV5b25kIHRoZSBjdXJyZW50CisJICAgICAqIHBvc2l0aW9uLgorCSAgICAgKi8KKwkgICAgaWYgKGN1cl9zaS0+c2lfZW5kX2lkeAorCQkgICAgJiYgKGN1cl9zaS0+c2lfZW9lX3Bvcy5sbnVtID4gY3VycmVudF9sbnVtCisJCQl8fCAoY3VyX3NpLT5zaV9lb2VfcG9zLmxudW0gPT0gY3VycmVudF9sbnVtCisJCQkgICAgJiYgY3VyX3NpLT5zaV9lb2VfcG9zLmNvbCA+IGN1cnJlbnRfY29sKSkpCisJICAgIHsKKwkJY3VyX3NpLT5zaV9pZHggPSBjdXJfc2ktPnNpX2VuZF9pZHg7CisJCWN1cl9zaS0+c2lfZW5kX2lkeCA9IDA7CisJCWN1cl9zaS0+c2lfbV9lbmRwb3MgPSBjdXJfc2ktPnNpX2VvZV9wb3M7CisJCWN1cl9zaS0+c2lfaF9lbmRwb3MgPSBjdXJfc2ktPnNpX2VvZV9wb3M7CisJCWN1cl9zaS0+c2lfZmxhZ3MgfD0gSExfTUFUQ0g7CisJCXVwZGF0ZV9zaV9hdHRyKGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMSk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBoYW5kbGUgbmV4dF9saXN0LCB1bmxlc3MgYXQgZW5kIG9mIGxpbmUgYW5kIG5vICJza2lwbmwiIG9yCisJCSAqICJza2lwZW1wdHkiICovCisJCWN1cnJlbnRfbmV4dF9saXN0ID0gY3VyX3NpLT5zaV9uZXh0X2xpc3Q7CisJCWN1cnJlbnRfbmV4dF9mbGFncyA9IGN1cl9zaS0+c2lfZmxhZ3M7CisJCWlmICghKGN1cnJlbnRfbmV4dF9mbGFncyAmIChITF9TS0lQTkwgfCBITF9TS0lQRU1QVFkpKQorCQkJJiYgc3luX2dldGN1cmxpbmUoKVtjdXJyZW50X2NvbF0gPT0gTlVMKQorCQkgICAgY3VycmVudF9uZXh0X2xpc3QgPSBOVUxMOworCisJCS8qIFdoZW4gdGhlIGVuZGVkIGl0ZW0gaGFzICJleHRlbmQiLCBhbm90aGVyIGl0ZW0gd2l0aAorCQkgKiAia2VlcGVuZCIgbm93IG5lZWRzIHRvIGNoZWNrIGZvciBpdHMgZW5kLiAqLworCQkgaWYgKGN1cl9zaS0+c2lfZmxhZ3MgJiBITF9FWFRFTkQpCisJCSAgICAgaGFkX2V4dGVuZCA9IFRSVUU7CisKKwkJcG9wX2N1cnJlbnRfc3RhdGUoKTsKKworCQlpZiAoY3VycmVudF9zdGF0ZS5nYV9sZW4gPT0gMCkKKwkJICAgIGJyZWFrOworCisJCWlmIChoYWRfZXh0ZW5kKQorCQl7CisJCSAgICBzeW5fdXBkYXRlX2VuZHMoRkFMU0UpOworCQkgICAgaWYgKGN1cnJlbnRfc3RhdGUuZ2FfbGVuID09IDApCisJCQlicmVhazsKKwkJfQorCisJCWN1cl9zaSA9ICZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxKTsKKworCQkvKgorCQkgKiBPbmx5IGZvciBhIHJlZ2lvbiB0aGUgc2VhcmNoIGZvciB0aGUgZW5kIGNvbnRpbnVlcyBhZnRlcgorCQkgKiB0aGUgZW5kIG9mIHRoZSBjb250YWluZWQgaXRlbS4gIElmIHRoZSBjb250YWluZWQgbWF0Y2gKKwkJICogaW5jbHVkZWQgdGhlIGVuZC1vZi1saW5lLCBicmVhayBoZXJlLCB0aGUgcmVnaW9uIGNvbnRpbnVlcy4KKwkJICogRG9uJ3QgZG8gdGhpcyB3aGVuOgorCQkgKiAtICJrZWVwZW5kIiBpcyB1c2VkIGZvciB0aGUgY29udGFpbmVkIGl0ZW0KKwkJICogLSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoY291bGQgYmUgZW5kPSJ4JCJtZT1lLTEpLgorCQkgKiAtICJleGNsdWRlbmwiIGlzIHVzZWQgKEhMX0hBU19FT0wgd29uJ3QgYmUgc2V0KQorCQkgKi8KKwkJaWYgKGN1cl9zaS0+c2lfaWR4ID49IDAKKwkJCSYmIFNZTl9JVEVNUyhzeW5fYnVmKVtjdXJfc2ktPnNpX2lkeF0uc3BfdHlwZQorCQkJCQkJCSAgICAgICA9PSBTUFRZUEVfU1RBUlQKKwkJCSYmICEoY3VyX3NpLT5zaV9mbGFncyAmIChITF9NQVRDSCB8IEhMX0tFRVBFTkQpKSkKKwkJeworCQkgICAgdXBkYXRlX3NpX2VuZChjdXJfc2ksIChpbnQpY3VycmVudF9jb2wsIFRSVUUpOworCQkgICAgY2hlY2tfa2VlcGVuZCgpOworCQkgICAgaWYgKChjdXJyZW50X25leHRfZmxhZ3MgJiBITF9IQVNfRU9MKQorCQkJICAgICYmIGtlZXBlbmRfbGV2ZWwgPCAwCisJCQkgICAgJiYgc3luX2dldGN1cmxpbmUoKVtjdXJyZW50X2NvbF0gPT0gTlVMKQorCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIFVwZGF0ZSBhbiBlbnRyeSBpbiB0aGUgY3VycmVudF9zdGF0ZSBzdGFjayBmb3IgYSBtYXRjaCBvciByZWdpb24uICBUaGlzCisgKiBmaWxscyBpbiBzaV9hdHRyLCBzaV9uZXh0X2xpc3QgYW5kIHNpX2NvbnRfbGlzdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCit1cGRhdGVfc2lfYXR0cihpZHgpCisgICAgaW50CSAgICBpZHg7Cit7CisgICAgc3RhdGVpdGVtX1QJKnNpcCA9ICZDVVJfU1RBVEUoaWR4KTsKKyAgICBzeW5wYXRfVAkqc3BwOworCisgICAgc3BwID0gJihTWU5fSVRFTVMoc3luX2J1Zilbc2lwLT5zaV9pZHhdKTsKKyAgICBpZiAoc2lwLT5zaV9mbGFncyAmIEhMX01BVENIKQorCXNpcC0+c2lfaWQgPSBzcHAtPnNwX3N5bl9tYXRjaF9pZDsKKyAgICBlbHNlCisJc2lwLT5zaV9pZCA9IHNwcC0+c3Bfc3luLmlkOworICAgIHNpcC0+c2lfYXR0ciA9IHN5bl9pZDJhdHRyKHNpcC0+c2lfaWQpOworICAgIHNpcC0+c2lfdHJhbnNfaWQgPSBzaXAtPnNpX2lkOworICAgIGlmIChzaXAtPnNpX2ZsYWdzICYgSExfTUFUQ0gpCisJc2lwLT5zaV9jb250X2xpc3QgPSBOVUxMOworICAgIGVsc2UKKwlzaXAtPnNpX2NvbnRfbGlzdCA9IHNwcC0+c3BfY29udF9saXN0OworCisgICAgLyoKKyAgICAgKiBGb3IgdHJhbnNwYXJlbnQgaXRlbXMsIHRha2UgYXR0ciBmcm9tIG91dGVyIGl0ZW0uCisgICAgICogQWxzbyB0YWtlIGNvbnRfbGlzdCwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICAgKiBEb24ndCBkbyB0aGlzIGZvciB0aGUgbWF0Y2hncm91cCBvZiBhIHN0YXJ0IG9yIGVuZCBwYXR0ZXJuLgorICAgICAqLworICAgIGlmICgoc3BwLT5zcF9mbGFncyAmIEhMX1RSQU5TUCkgJiYgIShzaXAtPnNpX2ZsYWdzICYgSExfTUFUQ0gpKQorICAgIHsKKwlpZiAoaWR4ID09IDApCisJeworCSAgICBzaXAtPnNpX2F0dHIgPSAwOworCSAgICBzaXAtPnNpX3RyYW5zX2lkID0gMDsKKwkgICAgaWYgKHNpcC0+c2lfY29udF9saXN0ID09IE5VTEwpCisJCXNpcC0+c2lfY29udF9saXN0ID0gSURfTElTVF9BTEw7CisJfQorCWVsc2UKKwl7CisJICAgIHNpcC0+c2lfYXR0ciA9IENVUl9TVEFURShpZHggLSAxKS5zaV9hdHRyOworCSAgICBzaXAtPnNpX3RyYW5zX2lkID0gQ1VSX1NUQVRFKGlkeCAtIDEpLnNpX3RyYW5zX2lkOworCSAgICBpZiAoc2lwLT5zaV9jb250X2xpc3QgPT0gTlVMTCkKKwkgICAgeworCQlzaXAtPnNpX2ZsYWdzIHw9IEhMX1RSQU5TX0NPTlQ7CisJCXNpcC0+c2lfY29udF9saXN0ID0gQ1VSX1NUQVRFKGlkeCAtIDEpLnNpX2NvbnRfbGlzdDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayB0aGUgY3VycmVudCBzdGFjayBmb3IgcGF0dGVybnMgd2l0aCAia2VlcGVuZCIgZmxhZy4KKyAqIFByb3BhZ2F0ZSB0aGUgbWF0Y2gtZW5kIHRvIGNvbnRhaW5lZCBpdGVtcywgdW50aWwgYSAic2tpcGVuZCIgaXRlbSBpcyBmb3VuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjaGVja19rZWVwZW5kKCkKK3sKKyAgICBpbnQJCWk7CisgICAgbHBvc19UCW1heHBvczsKKyAgICBzdGF0ZWl0ZW1fVAkqc2lwOworCisgICAgLyoKKyAgICAgKiBUaGlzIGNoZWNrIGNhbiBjb25zdW1lIGEgbG90IG9mIHRpbWU7IG9ubHkgZG8gaXQgZnJvbSB0aGUgbGV2ZWwgd2hlcmUKKyAgICAgKiB0aGVyZSByZWFsbHkgaXMgYSBrZWVwZW5kLgorICAgICAqLworICAgIGlmIChrZWVwZW5kX2xldmVsIDwgMCkKKwlyZXR1cm47CisKKyAgICAvKgorICAgICAqIEZpbmQgdGhlIGxhc3QgaW5kZXggb2YgYW4gImV4dGVuZCIgaXRlbS4gICJrZWVwZW5kIiBpdGVtcyBiZWZvcmUgdGhhdAorICAgICAqIHdvbid0IGRvIGFueXRoaW5nLiAgSWYgdGhlcmUgaXMgbm8gImV4dGVuZCIgaXRlbSAiaSIgd2lsbCBiZQorICAgICAqICJrZWVwZW5kX2xldmVsIiBhbmQgYWxsICJrZWVwZW5kIiBpdGVtcyB3aWxsIHdvcmsgbm9ybWFsbHkuCisgICAgICovCisgICAgZm9yIChpID0gY3VycmVudF9zdGF0ZS5nYV9sZW4gLSAxOyBpID4ga2VlcGVuZF9sZXZlbDsgLS1pKQorCWlmIChDVVJfU1RBVEUoaSkuc2lfZmxhZ3MgJiBITF9FWFRFTkQpCisJICAgIGJyZWFrOworCisgICAgbWF4cG9zLmxudW0gPSAwOworICAgIGZvciAoIDsgaSA8IGN1cnJlbnRfc3RhdGUuZ2FfbGVuOyArK2kpCisgICAgeworCXNpcCA9ICZDVVJfU1RBVEUoaSk7CisJaWYgKG1heHBvcy5sbnVtICE9IDApCisJeworCSAgICBsaW1pdF9wb3NfemVybygmc2lwLT5zaV9tX2VuZHBvcywgJm1heHBvcyk7CisJICAgIGxpbWl0X3Bvc196ZXJvKCZzaXAtPnNpX2hfZW5kcG9zLCAmbWF4cG9zKTsKKwkgICAgbGltaXRfcG9zX3plcm8oJnNpcC0+c2lfZW9lX3BvcywgJm1heHBvcyk7CisJICAgIHNpcC0+c2lfZW5kcyA9IFRSVUU7CisJfQorCWlmIChzaXAtPnNpX2VuZHMKKwkJJiYgKHNpcC0+c2lfZmxhZ3MgJiBITF9LRUVQRU5EKQorCQkmJiAobWF4cG9zLmxudW0gPT0gMAorCQkgICAgfHwgbWF4cG9zLmxudW0gPiBzaXAtPnNpX21fZW5kcG9zLmxudW0KKwkJICAgIHx8IChtYXhwb3MubG51bSA9PSBzaXAtPnNpX21fZW5kcG9zLmxudW0KKwkJCSYmIG1heHBvcy5jb2wgPiBzaXAtPnNpX21fZW5kcG9zLmNvbCkpKQorCSAgICBtYXhwb3MgPSBzaXAtPnNpX21fZW5kcG9zOworICAgIH0KK30KKworLyoKKyAqIFVwZGF0ZSBhbiBlbnRyeSBpbiB0aGUgY3VycmVudF9zdGF0ZSBzdGFjayBmb3IgYSBzdGFydC1za2lwLWVuZCBwYXR0ZXJuLgorICogVGhpcyBmaW5kcyB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGl0ZW0sIGlmIGl0J3MgaW4gdGhlIGN1cnJlbnQgbGluZS4KKyAqCisgKiBSZXR1cm4gdGhlIGZsYWdzIGZvciB0aGUgbWF0Y2hlZCBFTkQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordXBkYXRlX3NpX2VuZChzaXAsIHN0YXJ0Y29sLCBmb3JjZSkKKyAgICBzdGF0ZWl0ZW1fVAkqc2lwOworICAgIGludAkJc3RhcnRjb2w7ICAgLyogd2hlcmUgdG8gc3RhcnQgc2VhcmNoaW5nIGZvciB0aGUgZW5kICovCisgICAgaW50CQlmb3JjZTsJICAgIC8qIHdoZW4gVFJVRSBvdmVycnVsZSBhIHByZXZpb3VzIGVuZCAqLworeworICAgIGxwb3NfVAlzdGFydHBvczsKKyAgICBscG9zX1QJZW5kcG9zOworICAgIGxwb3NfVAlobF9lbmRwb3M7CisgICAgbHBvc19UCWVuZF9lbmRwb3M7CisgICAgaW50CQllbmRfaWR4OworCisgICAgLyogRG9uJ3QgdXBkYXRlIHdoZW4gaXQncyBhbHJlYWR5IGRvbmUuICBDYW4gYmUgYSBtYXRjaCBvZiBhbiBlbmQgcGF0dGVybgorICAgICAqIHRoYXQgc3RhcnRlZCBpbiBhIHByZXZpb3VzIGxpbmUuICBXYXRjaCBvdXQ6IGNhbiBhbHNvIGJlIGEgImtlZXBlbmQiCisgICAgICogZnJvbSBhIGNvbnRhaW5pbmcgaXRlbS4gKi8KKyAgICBpZiAoIWZvcmNlICYmIHNpcC0+c2lfbV9lbmRwb3MubG51bSA+PSBjdXJyZW50X2xudW0pCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBXZSBuZWVkIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLiAgSXQgbWF5IGNvbnRpbnVlIGluIHRoZSBuZXh0CisgICAgICogbGluZS4KKyAgICAgKi8KKyAgICBlbmRfaWR4ID0gMDsKKyAgICBzdGFydHBvcy5sbnVtID0gY3VycmVudF9sbnVtOworICAgIHN0YXJ0cG9zLmNvbCA9IHN0YXJ0Y29sOworICAgIGZpbmRfZW5kcG9zKHNpcC0+c2lfaWR4LCAmc3RhcnRwb3MsICZlbmRwb3MsICZobF9lbmRwb3MsCisJCSAgICYoc2lwLT5zaV9mbGFncyksICZlbmRfZW5kcG9zLCAmZW5kX2lkeCwgc2lwLT5zaV9leHRtYXRjaCk7CisKKyAgICBpZiAoZW5kcG9zLmxudW0gPT0gMCkKKyAgICB7CisJLyogTm8gZW5kIHBhdHRlcm4gbWF0Y2hlZC4gKi8KKwlpZiAoU1lOX0lURU1TKHN5bl9idWYpW3NpcC0+c2lfaWR4XS5zcF9mbGFncyAmIEhMX09ORUxJTkUpCisJeworCSAgICAvKiBhICJvbmVsaW5lIiBuZXZlciBjb250aW51ZXMgaW4gdGhlIG5leHQgbGluZSAqLworCSAgICBzaXAtPnNpX2VuZHMgPSBUUlVFOworCSAgICBzaXAtPnNpX21fZW5kcG9zLmxudW0gPSBjdXJyZW50X2xudW07CisJICAgIHNpcC0+c2lfbV9lbmRwb3MuY29sID0gKGNvbG5yX1QpU1RSTEVOKHN5bl9nZXRjdXJsaW5lKCkpOworCX0KKwllbHNlCisJeworCSAgICAvKiBjb250aW51ZXMgaW4gdGhlIG5leHQgbGluZSAqLworCSAgICBzaXAtPnNpX2VuZHMgPSBGQUxTRTsKKwkgICAgc2lwLT5zaV9tX2VuZHBvcy5sbnVtID0gMDsKKwl9CisJc2lwLT5zaV9oX2VuZHBvcyA9IHNpcC0+c2lfbV9lbmRwb3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogbWF0Y2ggd2l0aGluIHRoaXMgbGluZSAqLworCXNpcC0+c2lfbV9lbmRwb3MgPSBlbmRwb3M7CisJc2lwLT5zaV9oX2VuZHBvcyA9IGhsX2VuZHBvczsKKwlzaXAtPnNpX2VvZV9wb3MgPSBlbmRfZW5kcG9zOworCXNpcC0+c2lfZW5kcyA9IFRSVUU7CisJc2lwLT5zaV9lbmRfaWR4ID0gZW5kX2lkeDsKKyAgICB9Cit9CisKKy8qCisgKiBBZGQgYSBuZXcgc3RhdGUgdG8gdGhlIGN1cnJlbnQgc3RhdGUgc3RhY2suCisgKiBJdCBpcyBjbGVhcmVkIGFuZCB0aGUgaW5kZXggc2V0IHRvICJpZHgiLgorICogUmV0dXJuIEZBSUwgaWYgaXQncyBub3QgcG9zc2libGUgKG91dCBvZiBtZW1vcnkpLgorICovCisgICAgc3RhdGljIGludAorcHVzaF9jdXJyZW50X3N0YXRlKGlkeCkKKyAgICBpbnQJICAgIGlkeDsKK3sKKyAgICBpZiAoZ2FfZ3JvdygmY3VycmVudF9zdGF0ZSwgMSkgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKyAgICB2aW1fbWVtc2V0KCZDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4pLCAwLCBzaXplb2Yoc3RhdGVpdGVtX1QpKTsKKyAgICBDVVJfU1RBVEUoY3VycmVudF9zdGF0ZS5nYV9sZW4pLnNpX2lkeCA9IGlkeDsKKyAgICArK2N1cnJlbnRfc3RhdGUuZ2FfbGVuOworICAgIC0tY3VycmVudF9zdGF0ZS5nYV9yb29tOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJlbW92ZSBhIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRfc3RhdGUgc3RhY2suCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcG9wX2N1cnJlbnRfc3RhdGUoKQoreworICAgIGlmIChjdXJyZW50X3N0YXRlLmdhX2xlbikKKyAgICB7CisJdW5yZWZfZXh0bWF0Y2goQ1VSX1NUQVRFKGN1cnJlbnRfc3RhdGUuZ2FfbGVuIC0gMSkuc2lfZXh0bWF0Y2gpOworCS0tY3VycmVudF9zdGF0ZS5nYV9sZW47CisJKytjdXJyZW50X3N0YXRlLmdhX3Jvb207CisgICAgfQorICAgIC8qIGFmdGVyIHRoZSBlbmQgb2YgYSBwYXR0ZXJuLCB0cnkgbWF0Y2hpbmcgYSBrZXl3b3JkIG9yIHBhdHRlcm4gKi8KKyAgICBuZXh0X21hdGNoX2lkeCA9IC0xOworCisgICAgLyogaWYgZmlyc3Qgc3RhdGUgd2l0aCAia2VlcGVuZCIgaXMgcG9wcGVkLCByZXNldCBrZWVwZW5kX2xldmVsICovCisgICAgaWYgKGtlZXBlbmRfbGV2ZWwgPj0gY3VycmVudF9zdGF0ZS5nYV9sZW4pCisJa2VlcGVuZF9sZXZlbCA9IC0xOworfQorCisvKgorICogRmluZCB0aGUgZW5kIG9mIGEgc3RhcnQvc2tpcC9lbmQgc3ludGF4IHJlZ2lvbiBhZnRlciAic3RhcnRwb3MiLgorICogT25seSBjaGVja3Mgb25lIGxpbmUuCisgKiBBbHNvIGhhbmRsZXMgYSBtYXRjaCBpdGVtIHRoYXQgY29udGludWVkIGZyb20gYSBwcmV2aW91cyBsaW5lLgorICogSWYgbm90IGZvdW5kLCB0aGUgc3ludGF4IGl0ZW0gY29udGludWVzIGluIHRoZSBuZXh0IGxpbmUuICBtX2VuZHBvcy0+bG51bQorICogd2lsbCBiZSAwLgorICogSWYgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiBhbmQgdGhlIGVuZCBvZiB0aGUgaGlnaGxpZ2h0aW5nIGlzCisgKiBjb21wdXRlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmaW5kX2VuZHBvcyhpZHgsIHN0YXJ0cG9zLCBtX2VuZHBvcywgaGxfZW5kcG9zLCBmbGFnc3AsIGVuZF9lbmRwb3MsCisJCQkJCQkJICAgZW5kX2lkeCwgc3RhcnRfZXh0KQorICAgIGludAkJaWR4OwkJLyogaW5kZXggb2YgdGhlIHBhdHRlcm4gKi8KKyAgICBscG9zX1QJKnN0YXJ0cG9zOwkvKiB3aGVyZSB0byBzdGFydCBsb29raW5nIGZvciBhbiBFTkQgbWF0Y2ggKi8KKyAgICBscG9zX1QJKm1fZW5kcG9zOwkvKiByZXR1cm46IGVuZCBvZiBtYXRjaCAqLworICAgIGxwb3NfVAkqaGxfZW5kcG9zOwkvKiByZXR1cm46IGVuZCBvZiBoaWdobGlnaHRpbmcgKi8KKyAgICBsb25nCSpmbGFnc3A7CS8qIHJldHVybjogZmxhZ3Mgb2YgbWF0Y2hpbmcgRU5EICovCisgICAgbHBvc19UCSplbmRfZW5kcG9zOwkvKiByZXR1cm46IGVuZCBvZiBlbmQgcGF0dGVybiBtYXRjaCAqLworICAgIGludAkJKmVuZF9pZHg7CS8qIHJldHVybjogZ3JvdXAgSUQgZm9yIGVuZCBwYXQuIG1hdGNoLCBvciAwICovCisgICAgcmVnX2V4dG1hdGNoX1QgKnN0YXJ0X2V4dDsJLyogc3VibWF0Y2hlcyBmcm9tIHRoZSBzdGFydCBwYXR0ZXJuICovCit7CisgICAgY29sbnJfVAltYXRjaGNvbDsKKyAgICBzeW5wYXRfVAkqc3BwLCAqc3BwX3NraXA7CisgICAgaW50CQlzdGFydF9pZHg7CisgICAgaW50CQliZXN0X2lkeDsKKyAgICByZWdtbWF0Y2hfVAlyZWdtYXRjaDsKKyAgICByZWdtbWF0Y2hfVAliZXN0X3JlZ21hdGNoOwkgICAgLyogc3RhcnRwb3MvZW5kcG9zIG9mIGJlc3QgbWF0Y2ggKi8KKyAgICBscG9zX1QJcG9zOworICAgIGNoYXJfdQkqbGluZTsKKyAgICBpbnQJCWhhZF9tYXRjaCA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYmVpbmcgY2FsbGVkIHdpdGggYSBTVEFSVCBwYXR0ZXJuLgorICAgICAqIENhbiBoYXBwZW4gd2l0aCBhIG1hdGNoIHRoYXQgY29udGludWVzIHRvIHRoZSBuZXh0IGxpbmUsIGJlY2F1c2UgaXQKKyAgICAgKiBjb250YWluZWQgYSByZWdpb24uCisgICAgICovCisgICAgc3BwID0gJihTWU5fSVRFTVMoc3luX2J1ZilbaWR4XSk7CisgICAgaWYgKHNwcC0+c3BfdHlwZSAhPSBTUFRZUEVfU1RBUlQpCisgICAgeworCSpobF9lbmRwb3MgPSAqc3RhcnRwb3M7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogRmluZCB0aGUgU0tJUCBvciBmaXJzdCBFTkQgcGF0dGVybiBhZnRlciB0aGUgbGFzdCBTVEFSVCBwYXR0ZXJuLgorICAgICAqLworICAgIGZvciAoOzspCisgICAgeworCXNwcCA9ICYoU1lOX0lURU1TKHN5bl9idWYpW2lkeF0pOworCWlmIChzcHAtPnNwX3R5cGUgIT0gU1BUWVBFX1NUQVJUKQorCSAgICBicmVhazsKKwkrK2lkeDsKKyAgICB9CisKKyAgICAvKgorICAgICAqCUxvb2t1cCB0aGUgU0tJUCBwYXR0ZXJuIChpZiBwcmVzZW50KQorICAgICAqLworICAgIGlmIChzcHAtPnNwX3R5cGUgPT0gU1BUWVBFX1NLSVApCisgICAgeworCXNwcF9za2lwID0gc3BwOworCSsraWR4OworICAgIH0KKyAgICBlbHNlCisJc3BwX3NraXAgPSBOVUxMOworCisgICAgLyogU2V0dXAgZXh0ZXJuYWwgbWF0Y2hlcyBmb3Igc3luX3JlZ2V4ZWMoKS4gKi8KKyAgICB1bnJlZl9leHRtYXRjaChyZV9leHRtYXRjaF9pbik7CisgICAgcmVfZXh0bWF0Y2hfaW4gPSByZWZfZXh0bWF0Y2goc3RhcnRfZXh0KTsKKworICAgIG1hdGNoY29sID0gc3RhcnRwb3MtPmNvbDsJLyogc3RhcnQgbG9va2luZyBmb3IgYSBtYXRjaCBhdCBzc3RhcnQgKi8KKyAgICBzdGFydF9pZHggPSBpZHg7CQkvKiByZW1lbWJlciB0aGUgZmlyc3QgRU5EIHBhdHRlcm4uICovCisgICAgYmVzdF9yZWdtYXRjaC5zdGFydHBvc1swXS5jb2wgPSAwOwkJLyogYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICAgIGZvciAoOzspCisgICAgeworCS8qCisJICogRmluZCBlbmQgcGF0dGVybiB0aGF0IG1hdGNoZXMgZmlyc3QgYWZ0ZXIgIm1hdGNoY29sIi4KKwkgKi8KKwliZXN0X2lkeCA9IC0xOworCWZvciAoaWR4ID0gc3RhcnRfaWR4OyBpZHggPCBzeW5fYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47ICsraWR4KQorCXsKKwkgICAgaW50IGxjX2NvbCA9IG1hdGNoY29sOworCisJICAgIHNwcCA9ICYoU1lOX0lURU1TKHN5bl9idWYpW2lkeF0pOworCSAgICBpZiAoc3BwLT5zcF90eXBlICE9IFNQVFlQRV9FTkQpCS8qIHBhc3QgbGFzdCBFTkQgcGF0dGVybiAqLworCQlicmVhazsKKwkgICAgbGNfY29sIC09IHNwcC0+c3Bfb2Zmc2V0c1tTUE9fTENfT0ZGXTsKKwkgICAgaWYgKGxjX2NvbCA8IDApCisJCWxjX2NvbCA9IDA7CisKKwkgICAgcmVnbWF0Y2gucm1tX2ljID0gc3BwLT5zcF9pYzsKKwkgICAgcmVnbWF0Y2gucmVncHJvZyA9IHNwcC0+c3BfcHJvZzsKKwkgICAgaWYgKHN5bl9yZWdleGVjKCZyZWdtYXRjaCwgc3RhcnRwb3MtPmxudW0sIGxjX2NvbCkpCisJICAgIHsKKwkJaWYgKGJlc3RfaWR4ID09IC0xIHx8IHJlZ21hdGNoLnN0YXJ0cG9zWzBdLmNvbAorCQkJCQkgICAgICA8IGJlc3RfcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sKQorCQl7CisJCSAgICBiZXN0X2lkeCA9IGlkeDsKKwkJICAgIGJlc3RfcmVnbWF0Y2guc3RhcnRwb3NbMF0gPSByZWdtYXRjaC5zdGFydHBvc1swXTsKKwkJICAgIGJlc3RfcmVnbWF0Y2guZW5kcG9zWzBdID0gcmVnbWF0Y2guZW5kcG9zWzBdOworCQl9CisJICAgIH0KKwl9CisKKwkvKgorCSAqIElmIGFsbCBlbmQgcGF0dGVybnMgaGF2ZSBiZWVuIHRyaWVkLCBhbmQgdGhlcmUgaXMgbm8gbWF0Y2gsIHRoZQorCSAqIGl0ZW0gY29udGludWVzIHVudGlsIGVuZC1vZi1saW5lLgorCSAqLworCWlmIChiZXN0X2lkeCA9PSAtMSkKKwkgICAgYnJlYWs7CisKKwkvKgorCSAqIElmIHRoZSBza2lwIHBhdHRlcm4gbWF0Y2hlcyBiZWZvcmUgdGhlIGVuZCBwYXR0ZXJuLAorCSAqIGNvbnRpbnVlIHNlYXJjaGluZyBhZnRlciB0aGUgc2tpcCBwYXR0ZXJuLgorCSAqLworCWlmIChzcHBfc2tpcCAhPSBOVUxMKQorCXsKKwkgICAgaW50IGxjX2NvbCA9IG1hdGNoY29sIC0gc3BwX3NraXAtPnNwX29mZnNldHNbU1BPX0xDX09GRl07CisKKwkgICAgaWYgKGxjX2NvbCA8IDApCisJCWxjX2NvbCA9IDA7CisJICAgIHJlZ21hdGNoLnJtbV9pYyA9IHNwcF9za2lwLT5zcF9pYzsKKwkgICAgcmVnbWF0Y2gucmVncHJvZyA9IHNwcF9za2lwLT5zcF9wcm9nOworCSAgICBpZiAoc3luX3JlZ2V4ZWMoJnJlZ21hdGNoLCBzdGFydHBvcy0+bG51bSwgbGNfY29sKQorCQkgICAgJiYgcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sCisJCQkJCSAgICAgPD0gYmVzdF9yZWdtYXRjaC5zdGFydHBvc1swXS5jb2wpCisJICAgIHsKKwkJLyogQWRkIG9mZnNldCB0byBza2lwIHBhdHRlcm4gbWF0Y2ggKi8KKwkJc3luX2FkZF9lbmRfb2ZmKCZwb3MsICZyZWdtYXRjaCwgc3BwX3NraXAsIFNQT19NRV9PRkYsIDEpOworCisJCS8qIElmIHRoZSBza2lwIHBhdHRlcm4gZ29lcyBvbiB0byB0aGUgbmV4dCBsaW5lLCB0aGVyZSBpcyBubworCQkgKiBtYXRjaCB3aXRoIGFuIGVuZCBwYXR0ZXJuIGluIHRoaXMgbGluZS4gKi8KKwkJaWYgKHBvcy5sbnVtID4gc3RhcnRwb3MtPmxudW0pCisJCSAgICBicmVhazsKKworCQlsaW5lID0gbWxfZ2V0X2J1ZihzeW5fYnVmLCBzdGFydHBvcy0+bG51bSwgRkFMU0UpOworCisJCS8qIHRha2UgY2FyZSBvZiBhbiBlbXB0eSBtYXRjaCBvciBuZWdhdGl2ZSBvZmZzZXQgKi8KKwkJaWYgKHBvcy5jb2wgPD0gbWF0Y2hjb2wpCisJCSAgICArK21hdGNoY29sOworCQllbHNlIGlmIChwb3MuY29sIDw9IHJlZ21hdGNoLmVuZHBvc1swXS5jb2wpCisJCSAgICBtYXRjaGNvbCA9IHBvcy5jb2w7CisJCWVsc2UKKwkJICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGp1bXAgb3ZlciB0aGUgTlVMIGF0IHRoZSBlbmQtb2YtbGluZSAqLworCQkgICAgZm9yIChtYXRjaGNvbCA9IHJlZ21hdGNoLmVuZHBvc1swXS5jb2w7CisJCQkgICAgbGluZVttYXRjaGNvbF0gIT0gTlVMICYmIG1hdGNoY29sIDwgcG9zLmNvbDsKKwkJCQkJCQkJICAgKyttYXRjaGNvbCkKKwkJCTsKKworCQkvKiBpZiB0aGUgc2tpcCBwYXR0ZXJuIGluY2x1ZGVzIGVuZC1vZi1saW5lLCBicmVhayBoZXJlICovCisJCWlmIChsaW5lW21hdGNoY29sXSA9PSBOVUwpCisJCSAgICBicmVhazsKKworCQljb250aW51ZTsJICAgIC8qIHN0YXJ0IHdpdGggZmlyc3QgZW5kIHBhdHRlcm4gYWdhaW4gKi8KKwkgICAgfQorCX0KKworCS8qCisJICogTWF0Y2ggZnJvbSBzdGFydCBwYXR0ZXJuIHRvIGVuZCBwYXR0ZXJuLgorCSAqIENvcnJlY3QgZm9yIG1hdGNoIGFuZCBoaWdobGlnaHQgb2Zmc2V0IG9mIGVuZCBwYXR0ZXJuLgorCSAqLworCXNwcCA9ICYoU1lOX0lURU1TKHN5bl9idWYpW2Jlc3RfaWR4XSk7CisJc3luX2FkZF9lbmRfb2ZmKG1fZW5kcG9zLCAmYmVzdF9yZWdtYXRjaCwgc3BwLCBTUE9fTUVfT0ZGLCAxKTsKKwkvKiBjYW4ndCBlbmQgYmVmb3JlIHRoZSBzdGFydCAqLworCWlmIChtX2VuZHBvcy0+bG51bSA9PSBzdGFydHBvcy0+bG51bSAmJiBtX2VuZHBvcy0+Y29sIDwgc3RhcnRwb3MtPmNvbCkKKwkgICAgbV9lbmRwb3MtPmNvbCA9IHN0YXJ0cG9zLT5jb2w7CisKKwlzeW5fYWRkX2VuZF9vZmYoZW5kX2VuZHBvcywgJmJlc3RfcmVnbWF0Y2gsIHNwcCwgU1BPX0hFX09GRiwgMSk7CisJLyogY2FuJ3QgZW5kIGJlZm9yZSB0aGUgc3RhcnQgKi8KKwlpZiAoZW5kX2VuZHBvcy0+bG51bSA9PSBzdGFydHBvcy0+bG51bQorCQkJCQkgICAmJiBlbmRfZW5kcG9zLT5jb2wgPCBzdGFydHBvcy0+Y29sKQorCSAgICBlbmRfZW5kcG9zLT5jb2wgPSBzdGFydHBvcy0+Y29sOworCS8qIGNhbid0IGVuZCBhZnRlciB0aGUgbWF0Y2ggKi8KKwlsaW1pdF9wb3MoZW5kX2VuZHBvcywgbV9lbmRwb3MpOworCisJLyoKKwkgKiBJZiB0aGUgZW5kIGdyb3VwIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBhZGp1c3QgdGhlIHBvaW50ZXJzLgorCSAqLworCWlmIChzcHAtPnNwX3N5bl9tYXRjaF9pZCAhPSBzcHAtPnNwX3N5bi5pZCAmJiBzcHAtPnNwX3N5bl9tYXRjaF9pZCAhPSAwKQorCXsKKwkgICAgKmVuZF9pZHggPSBiZXN0X2lkeDsKKwkgICAgaWYgKHNwcC0+c3Bfb2ZmX2ZsYWdzICYgKDEgPDwgKFNQT19SRV9PRkYgKyBTUE9fQ09VTlQpKSkKKwkgICAgeworCQlobF9lbmRwb3MtPmxudW0gPSBiZXN0X3JlZ21hdGNoLmVuZHBvc1swXS5sbnVtOworCQlobF9lbmRwb3MtPmNvbCA9IGJlc3RfcmVnbWF0Y2guZW5kcG9zWzBdLmNvbDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaGxfZW5kcG9zLT5sbnVtID0gYmVzdF9yZWdtYXRjaC5zdGFydHBvc1swXS5sbnVtOworCQlobF9lbmRwb3MtPmNvbCA9IGJlc3RfcmVnbWF0Y2guc3RhcnRwb3NbMF0uY29sOworCSAgICB9CisJICAgIGhsX2VuZHBvcy0+Y29sICs9IHNwcC0+c3Bfb2Zmc2V0c1tTUE9fUkVfT0ZGXTsKKworCSAgICAvKiBjYW4ndCBlbmQgYmVmb3JlIHRoZSBzdGFydCAqLworCSAgICBpZiAoaGxfZW5kcG9zLT5sbnVtID09IHN0YXJ0cG9zLT5sbnVtCisJCQkJCSAgICAmJiBobF9lbmRwb3MtPmNvbCA8IHN0YXJ0cG9zLT5jb2wpCisJCWhsX2VuZHBvcy0+Y29sID0gc3RhcnRwb3MtPmNvbDsKKwkgICAgbGltaXRfcG9zKGhsX2VuZHBvcywgbV9lbmRwb3MpOworCisJICAgIC8qIG5vdyB0aGUgbWF0Y2ggZW5kcyB3aGVyZSB0aGUgaGlnaGxpZ2h0aW5nIGVuZHMsIGl0IGlzIHR1cm5lZAorCSAgICAgKiBpbnRvIHRoZSBtYXRjaGdyb3VwIGZvciB0aGUgZW5kICovCisJICAgICptX2VuZHBvcyA9ICpobF9lbmRwb3M7CisJfQorCWVsc2UKKwl7CisJICAgICplbmRfaWR4ID0gMDsKKwkgICAgKmhsX2VuZHBvcyA9ICplbmRfZW5kcG9zOworCX0KKworCSpmbGFnc3AgPSBzcHAtPnNwX2ZsYWdzOworCisJaGFkX21hdGNoID0gVFJVRTsKKwlicmVhazsKKyAgICB9CisKKyAgICAvKiBubyBtYXRjaCBmb3IgYW4gRU5EIHBhdHRlcm4gaW4gdGhpcyBsaW5lICovCisgICAgaWYgKCFoYWRfbWF0Y2gpCisJbV9lbmRwb3MtPmxudW0gPSAwOworCisgICAgLyogUmVtb3ZlIGV4dGVybmFsIG1hdGNoZXMuICovCisgICAgdW5yZWZfZXh0bWF0Y2gocmVfZXh0bWF0Y2hfaW4pOworICAgIHJlX2V4dG1hdGNoX2luID0gTlVMTDsKK30KKworLyoKKyAqIExpbWl0ICJwb3MiIG5vdCB0byBiZSBhZnRlciAibGltaXQiLgorICovCisgICAgc3RhdGljIHZvaWQKK2xpbWl0X3Bvcyhwb3MsIGxpbWl0KQorICAgIGxwb3NfVAkqcG9zOworICAgIGxwb3NfVAkqbGltaXQ7Cit7CisgICAgaWYgKHBvcy0+bG51bSA+IGxpbWl0LT5sbnVtKQorCSpwb3MgPSAqbGltaXQ7CisgICAgZWxzZSBpZiAocG9zLT5sbnVtID09IGxpbWl0LT5sbnVtICYmIHBvcy0+Y29sID4gbGltaXQtPmNvbCkKKwlwb3MtPmNvbCA9IGxpbWl0LT5jb2w7Cit9CisKKy8qCisgKiBMaW1pdCAicG9zIiBub3QgdG8gYmUgYWZ0ZXIgImxpbWl0IiwgdW5sZXNzIHBvcy0+bG51bSBpcyB6ZXJvLgorICovCisgICAgc3RhdGljIHZvaWQKK2xpbWl0X3Bvc196ZXJvKHBvcywgbGltaXQpCisgICAgbHBvc19UCSpwb3M7CisgICAgbHBvc19UCSpsaW1pdDsKK3sKKyAgICBpZiAocG9zLT5sbnVtID09IDApCisJKnBvcyA9ICpsaW1pdDsKKyAgICBlbHNlCisJbGltaXRfcG9zKHBvcywgbGltaXQpOworfQorCisvKgorICogQWRkIG9mZnNldCB0byBtYXRjaGVkIHRleHQgZm9yIGVuZCBvZiBtYXRjaCBvciBoaWdobGlnaHQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3luX2FkZF9lbmRfb2ZmKHJlc3VsdCwgcmVnbWF0Y2gsIHNwcCwgaWR4LCBleHRyYSkKKyAgICBscG9zX1QJKnJlc3VsdDsJLyogcmV0dXJuZWQgcG9zaXRpb24gKi8KKyAgICByZWdtbWF0Y2hfVAkqcmVnbWF0Y2g7CS8qIHN0YXJ0L2VuZCBvZiBtYXRjaCAqLworICAgIHN5bnBhdF9UCSpzcHA7CQkvKiBtYXRjaGVkIHBhdHRlcm4gKi8KKyAgICBpbnQJCWlkeDsJCS8qIGluZGV4IG9mIG9mZnNldCAqLworICAgIGludAkJZXh0cmE7CQkvKiBleHRyYSBjaGFycyBmb3Igb2Zmc2V0IHRvIHN0YXJ0ICovCit7CisgICAgaW50CQljb2w7CisKKyAgICBpZiAoc3BwLT5zcF9vZmZfZmxhZ3MgJiAoMSA8PCBpZHgpKQorICAgIHsKKwlyZXN1bHQtPmxudW0gPSByZWdtYXRjaC0+c3RhcnRwb3NbMF0ubG51bTsKKwljb2wgPSByZWdtYXRjaC0+c3RhcnRwb3NbMF0uY29sICsgZXh0cmE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmVzdWx0LT5sbnVtID0gcmVnbWF0Y2gtPmVuZHBvc1swXS5sbnVtOworCWNvbCA9IHJlZ21hdGNoLT5lbmRwb3NbMF0uY29sOworICAgIH0KKyAgICBjb2wgKz0gc3BwLT5zcF9vZmZzZXRzW2lkeF07CisgICAgaWYgKGNvbCA8IDApCisJcmVzdWx0LT5jb2wgPSAwOworICAgIGVsc2UKKwlyZXN1bHQtPmNvbCA9IGNvbDsKK30KKworLyoKKyAqIEFkZCBvZmZzZXQgdG8gbWF0Y2hlZCB0ZXh0IGZvciBzdGFydCBvZiBtYXRjaCBvciBoaWdobGlnaHQuCisgKiBBdm9pZCByZXN1bHRpbmcgY29sdW1uIHRvIGJlY29tZSBuZWdhdGl2ZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fYWRkX3N0YXJ0X29mZihyZXN1bHQsIHJlZ21hdGNoLCBzcHAsIGlkeCwgZXh0cmEpCisgICAgbHBvc19UCSpyZXN1bHQ7CS8qIHJldHVybmVkIHBvc2l0aW9uICovCisgICAgcmVnbW1hdGNoX1QJKnJlZ21hdGNoOwkvKiBzdGFydC9lbmQgb2YgbWF0Y2ggKi8KKyAgICBzeW5wYXRfVAkqc3BwOworICAgIGludAkJaWR4OworICAgIGludAkJZXh0cmE7CSAgICAvKiBleHRyYSBjaGFycyBmb3Igb2Zmc2V0IHRvIGVuZCAqLworeworICAgIGludAkJY29sOworCisgICAgaWYgKHNwcC0+c3Bfb2ZmX2ZsYWdzICYgKDEgPDwgKGlkeCArIFNQT19DT1VOVCkpKQorICAgIHsKKwlyZXN1bHQtPmxudW0gPSByZWdtYXRjaC0+ZW5kcG9zWzBdLmxudW07CisJY29sID0gcmVnbWF0Y2gtPmVuZHBvc1swXS5jb2wgKyBleHRyYTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXN1bHQtPmxudW0gPSByZWdtYXRjaC0+c3RhcnRwb3NbMF0ubG51bTsKKwljb2wgPSByZWdtYXRjaC0+c3RhcnRwb3NbMF0uY29sOworICAgIH0KKyAgICBjb2wgKz0gc3BwLT5zcF9vZmZzZXRzW2lkeF07CisgICAgaWYgKGNvbCA8IDApCisJcmVzdWx0LT5jb2wgPSAwOworICAgIGVsc2UKKwlyZXN1bHQtPmNvbCA9IGNvbDsKK30KKworLyoKKyAqIEdldCBjdXJyZW50IGxpbmUgaW4gc3ludGF4IGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorc3luX2dldGN1cmxpbmUoKQoreworICAgIHJldHVybiBtbF9nZXRfYnVmKHN5bl9idWYsIGN1cnJlbnRfbG51bSwgRkFMU0UpOworfQorCisvKgorICogQ2FsbCB2aW1fcmVnZXhlYygpIHRvIG1hdGNoIGluIHN5bl9idWYuCisgKiBSZXR1cm5zIFRSVUUgd2hlbiB0aGVyZSBpcyBhIG1hdGNoLgorICovCisgICAgc3RhdGljIGludAorc3luX3JlZ2V4ZWMocm1wLCBsbnVtLCBjb2wpCisgICAgcmVnbW1hdGNoX1QJKnJtcDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGNvbG5yX1QJY29sOworeworICAgIGlmICh2aW1fcmVnZXhlY19tdWx0aShybXAsIHN5bl93aW4sIHN5bl9idWYsIGxudW0sIGNvbCkgPiAwKQorICAgIHsKKwlybXAtPnN0YXJ0cG9zWzBdLmxudW0gKz0gbG51bTsKKwlybXAtPmVuZHBvc1swXS5sbnVtICs9IGxudW07CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIENoZWNrIG9uZSBwb3NpdGlvbiBpbiBhIGxpbmUgZm9yIGEgbWF0Y2hpbmcga2V5d29yZC4KKyAqIFRoZSBjYWxsZXIgbXVzdCBjaGVjayBpZiBhIGtleXdvcmQgY2FuIHN0YXJ0IGF0IHN0YXJ0Y29sLgorICogUmV0dXJuIGl0J3MgSUQgaWYgZm91bmQsIDAgb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGludAorY2hlY2tfa2V5d29yZF9pZChsaW5lLCBzdGFydGNvbCwgZW5kY29scCwgZmxhZ3NwLCBuZXh0X2xpc3RwLCBjdXJfc2kpCisgICAgY2hhcl91CSpsaW5lOworICAgIGludAkJc3RhcnRjb2w7CS8qIHBvc2l0aW9uIGluIGxpbmUgdG8gY2hlY2sgZm9yIGtleXdvcmQgKi8KKyAgICBpbnQJCSplbmRjb2xwOwkvKiByZXR1cm46IGNoYXJhY3RlciBhZnRlciBmb3VuZCBrZXl3b3JkICovCisgICAgbG9uZwkqZmxhZ3NwOwkvKiByZXR1cm46IGZsYWdzIG9mIG1hdGNoaW5nIGtleXdvcmQgKi8KKyAgICBzaG9ydAkqKm5leHRfbGlzdHA7CS8qIHJldHVybjogbmV4dF9saXN0IG9mIG1hdGNoaW5nIGtleXdvcmQgKi8KKyAgICBzdGF0ZWl0ZW1fVAkqY3VyX3NpOwkvKiBpdGVtIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrICovCit7CisgICAga2V5ZW50cnlfVAkqa3RhYjsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlyb3VuZDsKKyAgICBpbnQJCWxlbjsKKyAgICBjaGFyX3UJa2V5d29yZFtNQVhLRVlXTEVOICsgMV07IC8qIGFzc3VtZSBtYXguIGtleXdvcmQgbGVuIGlzIDgwICovCisKKyAgICAvKiBGaW5kIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUga2V5d29yZC4gIEZpcnN0IGNoYXJhY3RlciB3YXMgYWxyZWFkeQorICAgICAqIGNoZWNrZWQuICovCisgICAgcCA9IGxpbmUgKyBzdGFydGNvbDsKKyAgICBsZW4gPSAwOworICAgIGRvCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBsZW4gKz0gKCptYl9wdHIybGVuX2NoZWNrKShwICsgbGVuKTsKKwllbHNlCisjZW5kaWYKKwkgICAgKytsZW47CisgICAgfQorICAgIHdoaWxlICh2aW1faXN3b3JkY19idWYocCArIGxlbiwgc3luX2J1ZikpOworCisgICAgaWYgKGxlbiA+IE1BWEtFWVdMRU4pCisJcmV0dXJuIDA7CisKKyAgICAvKgorICAgICAqIE11c3QgbWFrZSBhIGNvcHkgb2YgdGhlIGtleXdvcmQsIHNvIHdlIGNhbiBhZGQgYSBOVUwgYW5kIG1ha2UgaXQKKyAgICAgKiBsb3dlcmNhc2UuCisgICAgICovCisgICAgU1RSTkNQWShrZXl3b3JkLCBwLCBsZW4pOworICAgIGtleXdvcmRbbGVuXSA9IE5VTDsKKworICAgIC8qCisgICAgICogVHJ5IHR3aWNlOgorICAgICAqIDEuIG1hdGNoaW5nIGNhc2UKKyAgICAgKiAyLiBpZ25vcmluZyBjYXNlCisgICAgICovCisgICAgZm9yIChyb3VuZCA9IDE7IHJvdW5kIDw9IDI7ICsrcm91bmQpCisgICAgeworCWlmICgocm91bmQgPT0gMSA/IHN5bl9idWYtPmJfa2V5d3RhYiA6IHN5bl9idWYtPmJfa2V5d3RhYl9pYykgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJaWYgKHJvdW5kID09IDEpCS8qIG1hdGNoIGNhc2UgKi8KKwkgICAga3RhYiA9IHN5bl9idWYtPmJfa2V5d3RhYltzeW5fa2hhc2goa2V5d29yZCldOworCWVsc2UgLyogcm91bmQgPT0gMiwgaWdub3JlIGNhc2UgKi8KKwl7CisJICAgIHAgPSBzdHJfZm9sZGNhc2Uoa2V5d29yZCwgKGludClTVFJMRU4oa2V5d29yZCkpOworCSAgICBpZiAocCAhPSBOVUxMKQorCSAgICB7CisJCVNUUk5DUFkoa2V5d29yZCwgcCwgTUFYS0VZV0xFTik7CisJCWtleXdvcmRbTUFYS0VZV0xFTl0gPSBOVUw7CisJCXZpbV9mcmVlKHApOworCSAgICB9CisJICAgIGt0YWIgPSBzeW5fYnVmLT5iX2tleXd0YWJfaWNbc3luX2toYXNoKGtleXdvcmQpXTsKKwl9CisKKwkvKgorCSAqIEZpbmQga2V5d29yZHMgdGhhdCBtYXRjaC4KKwkgKiBXaGVuIGN1cnJlbnRfbmV4dF9saXN0IGlzIG5vbi16ZXJvIGFjY2VwdCBvbmx5IHRoYXQgZ3JvdXAsIG90aGVyd2lzZToKKwkgKiAgQWNjZXB0IGEgbm90LWNvbnRhaW5lZCBrZXl3b3JkIGF0IHRvcGxldmVsLgorCSAqICBBY2NlcHQgYSBrZXl3b3JkIGF0IG90aGVyIGxldmVscyBvbmx5IGlmIGl0IGlzIGluIHRoZSBjb250YWlucyBsaXN0LgorCSAqLworCWZvciAoIDsga3RhYiAhPSBOVUxMOyBrdGFiID0ga3RhYi0+bmV4dCkKKwkgICAgaWYgKCAgIFNUUkNNUChrZXl3b3JkLCBrdGFiLT5rZXl3b3JkKSA9PSAwCisJCSYmIChjdXJyZW50X25leHRfbGlzdCAhPSAwCisJCSAgICA/IGluX2lkX2xpc3QoTlVMTCwgY3VycmVudF9uZXh0X2xpc3QsICZrdGFiLT5rX3N5biwgMCkKKwkJICAgIDogKGN1cl9zaSA9PSBOVUxMCisJCQk/ICEoa3RhYi0+ZmxhZ3MgJiBITF9DT05UQUlORUQpCisJCQk6IGluX2lkX2xpc3QoY3VyX3NpLCBjdXJfc2ktPnNpX2NvbnRfbGlzdCwKKwkJCQkgICZrdGFiLT5rX3N5biwga3RhYi0+ZmxhZ3MgJiBITF9DT05UQUlORUQpKSkpCisJICAgIHsKKwkJKmVuZGNvbHAgPSBzdGFydGNvbCArIGxlbjsKKwkJKmZsYWdzcCA9IGt0YWItPmZsYWdzOworCQkqbmV4dF9saXN0cCA9IGt0YWItPm5leHRfbGlzdDsKKwkJcmV0dXJuIGt0YWItPmtfc3luLmlkOworCSAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IGNhc2UiIGNvbW1hbmQuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9jbWRfY2FzZShlYXAsIHN5bmNpbmcpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJc3luY2luZzsJICAgIC8qIG5vdCB1c2VkICovCit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKm5leHQ7CisKKyAgICBlYXAtPm5leHRjbWQgPSBmaW5kX25leHRjbWQoYXJnKTsKKyAgICBpZiAoZWFwLT5za2lwKQorCXJldHVybjsKKworICAgIG5leHQgPSBza2lwdG93aGl0ZShhcmcpOworICAgIGlmIChTVFJOSUNNUChhcmcsICJtYXRjaCIsIDUpID09IDAgJiYgbmV4dCAtIGFyZyA9PSA1KQorCWN1cmJ1Zi0+Yl9zeW5faWMgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChTVFJOSUNNUChhcmcsICJpZ25vcmUiLCA2KSA9PSAwICYmIG5leHQgLSBhcmcgPT0gNikKKwljdXJidWYtPmJfc3luX2ljID0gVFJVRTsKKyAgICBlbHNlCisJRU1TRzIoXygiRTM5MDogSWxsZWdhbCBhcmd1bWVudDogJXMiKSwgYXJnKTsKK30KKworLyoKKyAqIENsZWFyIGFsbCBzeW50YXggaW5mbyBmb3Igb25lIGJ1ZmZlci4KKyAqLworICAgIHZvaWQKK3N5bnRheF9jbGVhcihidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBpbnQgaTsKKworICAgIGN1cmJ1Zi0+Yl9zeW5faWMgPSBGQUxTRTsJICAgIC8qIFVzZSBjYXNlLCBieSBkZWZhdWx0ICovCisgICAgY3VyYnVmLT5iX3N5bl9jb250YWluZWRpbiA9IEZBTFNFOworCisgICAgLyogZnJlZSB0aGUga2V5d29yZHMgKi8KKyAgICBmcmVlX2tleXd0YWIoYnVmLT5iX2tleXd0YWIpOworICAgIGJ1Zi0+Yl9rZXl3dGFiID0gTlVMTDsKKyAgICBmcmVlX2tleXd0YWIoYnVmLT5iX2tleXd0YWJfaWMpOworICAgIGJ1Zi0+Yl9rZXl3dGFiX2ljID0gTlVMTDsKKworICAgIC8qIGZyZWUgdGhlIHN5bnRheCBwYXR0ZXJucyAqLworICAgIGZvciAoaSA9IGJ1Zi0+Yl9zeW5fcGF0dGVybnMuZ2FfbGVuOyAtLWkgPj0gMDsgKQorCXN5bl9jbGVhcl9wYXR0ZXJuKGJ1ZiwgaSk7CisgICAgZ2FfY2xlYXIoJmJ1Zi0+Yl9zeW5fcGF0dGVybnMpOworCisgICAgLyogZnJlZSB0aGUgc3ludGF4IGNsdXN0ZXJzICovCisgICAgZm9yIChpID0gYnVmLT5iX3N5bl9jbHVzdGVycy5nYV9sZW47IC0taSA+PSAwOyApCisJc3luX2NsZWFyX2NsdXN0ZXIoYnVmLCBpKTsKKyAgICBnYV9jbGVhcigmYnVmLT5iX3N5bl9jbHVzdGVycyk7CisKKyAgICBidWYtPmJfc3luX3N5bmNfZmxhZ3MgPSAwOworICAgIGJ1Zi0+Yl9zeW5fc3luY19taW5saW5lcyA9IDA7CisgICAgYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzID0gMDsKKyAgICBidWYtPmJfc3luX3N5bmNfbGluZWJyZWFrcyA9IDA7CisKKyAgICB2aW1fZnJlZShidWYtPmJfc3luX2xpbmVjb250X3Byb2cpOworICAgIGJ1Zi0+Yl9zeW5fbGluZWNvbnRfcHJvZyA9IE5VTEw7CisgICAgdmltX2ZyZWUoYnVmLT5iX3N5bl9saW5lY29udF9wYXQpOworICAgIGJ1Zi0+Yl9zeW5fbGluZWNvbnRfcGF0ID0gTlVMTDsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBidWYtPmJfc3luX2ZvbGRpdGVtcyA9IDA7CisjZW5kaWYKKworICAgIC8qIGZyZWUgdGhlIHN0b3JlZCBzdGF0ZXMgKi8KKyAgICBzeW5fc3RhY2tfZnJlZV9hbGwoYnVmKTsKKyAgICBpbnZhbGlkYXRlX2N1cnJlbnRfc3RhdGUoKTsKK30KKworLyoKKyAqIENsZWFyIHN5bmNpbmcgaW5mbyBmb3Igb25lIGJ1ZmZlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW50YXhfc3luY19jbGVhcigpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBmcmVlIHRoZSBzeW50YXggcGF0dGVybnMgKi8KKyAgICBmb3IgKGkgPSBjdXJidWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbjsgLS1pID49IDA7ICkKKwlpZiAoU1lOX0lURU1TKGN1cmJ1ZilbaV0uc3Bfc3luY2luZykKKwkgICAgc3luX3JlbW92ZV9wYXR0ZXJuKGN1cmJ1ZiwgaSk7CisKKyAgICBjdXJidWYtPmJfc3luX3N5bmNfZmxhZ3MgPSAwOworICAgIGN1cmJ1Zi0+Yl9zeW5fc3luY19taW5saW5lcyA9IDA7CisgICAgY3VyYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzID0gMDsKKyAgICBjdXJidWYtPmJfc3luX3N5bmNfbGluZWJyZWFrcyA9IDA7CisKKyAgICB2aW1fZnJlZShjdXJidWYtPmJfc3luX2xpbmVjb250X3Byb2cpOworICAgIGN1cmJ1Zi0+Yl9zeW5fbGluZWNvbnRfcHJvZyA9IE5VTEw7CisgICAgdmltX2ZyZWUoY3VyYnVmLT5iX3N5bl9saW5lY29udF9wYXQpOworICAgIGN1cmJ1Zi0+Yl9zeW5fbGluZWNvbnRfcGF0ID0gTlVMTDsKKworICAgIHN5bl9zdGFja19mcmVlX2FsbChjdXJidWYpOwkJLyogTmVlZCB0byByZWNvbXB1dGUgYWxsIHN5bnRheC4gKi8KK30KKworLyoKKyAqIFJlbW92ZSBvbmUgcGF0dGVybiBmcm9tIHRoZSBidWZmZXIncyBwYXR0ZXJuIGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3luX3JlbW92ZV9wYXR0ZXJuKGJ1ZiwgaWR4KQorICAgIGJ1Zl9UCSpidWY7CisgICAgaW50CQlpZHg7Cit7CisgICAgc3lucGF0X1QJKnNwcDsKKworICAgIHNwcCA9ICYoU1lOX0lURU1TKGJ1ZilbaWR4XSk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaWYgKHNwcC0+c3BfZmxhZ3MgJiBITF9GT0xEKQorCS0tYnVmLT5iX3N5bl9mb2xkaXRlbXM7CisjZW5kaWYKKyAgICBzeW5fY2xlYXJfcGF0dGVybihidWYsIGlkeCk7CisgICAgbWNoX21lbW1vdmUoc3BwLCBzcHAgKyAxLAorCQkgICBzaXplb2Yoc3lucGF0X1QpICogKGJ1Zi0+Yl9zeW5fcGF0dGVybnMuZ2FfbGVuIC0gaWR4IC0gMSkpOworICAgIC0tYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47CisgICAgLS1idWYtPmJfc3luX3BhdHRlcm5zLmdhX3Jvb207Cit9CisKKy8qCisgKiBDbGVhciBhbmQgZnJlZSBvbmUgc3ludGF4IHBhdHRlcm4uICBXaGVuIGNsZWFyaW5nIGFsbCwgbXVzdCBiZSBjYWxsZWQgZnJvbQorICogbGFzdCB0byBmaXJzdCEKKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY2xlYXJfcGF0dGVybihidWYsIGkpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCWk7Cit7CisgICAgdmltX2ZyZWUoU1lOX0lURU1TKGJ1ZilbaV0uc3BfcGF0dGVybik7CisgICAgdmltX2ZyZWUoU1lOX0lURU1TKGJ1ZilbaV0uc3BfcHJvZyk7CisgICAgLyogT25seSBmcmVlIHNwX2NvbnRfbGlzdCBhbmQgc3BfbmV4dF9saXN0IG9mIGZpcnN0IHN0YXJ0IHBhdHRlcm4gKi8KKyAgICBpZiAoaSA9PSAwIHx8IFNZTl9JVEVNUyhidWYpW2kgLSAxXS5zcF90eXBlICE9IFNQVFlQRV9TVEFSVCkKKyAgICB7CisJdmltX2ZyZWUoU1lOX0lURU1TKGJ1ZilbaV0uc3BfY29udF9saXN0KTsKKwl2aW1fZnJlZShTWU5fSVRFTVMoYnVmKVtpXS5zcF9uZXh0X2xpc3QpOworICAgIH0KK30KKworLyoKKyAqIENsZWFyIGFuZCBmcmVlIG9uZSBzeW50YXggY2x1c3Rlci4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY2xlYXJfY2x1c3RlcihidWYsIGkpCisgICAgYnVmX1QJKmJ1ZjsKKyAgICBpbnQJCWk7Cit7CisgICAgdmltX2ZyZWUoU1lOX0NMU1RSKGJ1ZilbaV0uc2NsX25hbWUpOworICAgIHZpbV9mcmVlKFNZTl9DTFNUUihidWYpW2ldLnNjbF9uYW1lX3UpOworICAgIHZpbV9mcmVlKFNZTl9DTFNUUihidWYpW2ldLnNjbF9saXN0KTsKK30KKworLyoKKyAqIEhhbmRsZSAiOnN5bnRheCBjbGVhciIgY29tbWFuZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2NsZWFyKGVhcCwgc3luY2luZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzeW5jaW5nOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSphcmdfZW5kOworICAgIGludAkJaWQ7CisKKyAgICBlYXAtPm5leHRjbWQgPSBmaW5kX25leHRjbWQoYXJnKTsKKyAgICBpZiAoZWFwLT5za2lwKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogV2UgaGF2ZSB0byBkaXNhYmxlIHRoaXMgd2l0aGluICI6c3luIGluY2x1ZGUgQGdyb3VwIGZpbGVuYW1lIiwKKyAgICAgKiBiZWNhdXNlIG90aGVyd2lzZSBAZ3JvdXAgd291bGQgZ2V0IGRlbGV0ZWQuCisgICAgICogT25seSByZXF1aXJlZCBmb3IgVmltIDUueCBzeW50YXggZmlsZXMsIDYuMCBvbmVzIGRvbid0IGNvbnRhaW4gIjpzeW4KKyAgICAgKiBjbGVhciIuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9zeW5fdG9wZ3JwICE9IDApCisJcmV0dXJuOworCisgICAgaWYgKGVuZHNfZXhjbWQoKmFyZykpCisgICAgeworCS8qCisJICogTm8gYXJndW1lbnQ6IENsZWFyIGFsbCBzeW50YXggaXRlbXMuCisJICovCisJaWYgKHN5bmNpbmcpCisJICAgIHN5bnRheF9zeW5jX2NsZWFyKCk7CisJZWxzZQorCXsKKwkgICAgc3ludGF4X2NsZWFyKGN1cmJ1Zik7CisJICAgIGRvX3VubGV0KChjaGFyX3UgKikiYjpjdXJyZW50X3N5bnRheCIpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIENsZWFyIHRoZSBncm91cCBJRHMgdGhhdCBhcmUgaW4gdGhlIGFyZ3VtZW50LgorCSAqLworCXdoaWxlICghZW5kc19leGNtZCgqYXJnKSkKKwl7CisJICAgIGFyZ19lbmQgPSBza2lwdG93aGl0ZShhcmcpOworCSAgICBpZiAoKmFyZyA9PSAnQCcpCisJICAgIHsKKwkJaWQgPSBzeW5fc2NsX25hbWVuMmlkKGFyZyArIDEsIChpbnQpKGFyZ19lbmQgLSBhcmcgLSAxKSk7CisJCWlmIChpZCA9PSAwKQorCQl7CisJCSAgICBFTVNHMihfKCJFMzkxOiBObyBzdWNoIHN5bnRheCBjbHVzdGVyOiAlcyIpLCBhcmcpOworCQkgICAgYnJlYWs7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKgorCQkgICAgICogV2UgY2FuJ3QgcGh5c2ljYWxseSBkZWxldGUgYSBjbHVzdGVyIHdpdGhvdXQgY2hhbmdpbmcKKwkJICAgICAqIHRoZSBJRHMgb2Ygb3RoZXIgY2x1c3RlcnMsIHNvIHdlIGRvIHRoZSBuZXh0IGJlc3QgdGhpbmcKKwkJICAgICAqIGFuZCBtYWtlIGl0IGVtcHR5LgorCQkgICAgICovCisJCSAgICBzaG9ydCBzY2xfaWQgPSBpZCAtIFNZTklEX0NMVVNURVI7CisKKwkJICAgIHZpbV9mcmVlKFNZTl9DTFNUUihjdXJidWYpW3NjbF9pZF0uc2NsX2xpc3QpOworCQkgICAgU1lOX0NMU1RSKGN1cmJ1Zilbc2NsX2lkXS5zY2xfbGlzdCA9IE5VTEw7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWQgPSBzeW5fbmFtZW4yaWQoYXJnLCAoaW50KShhcmdfZW5kIC0gYXJnKSk7CisJCWlmIChpZCA9PSAwKQorCQl7CisJCSAgICBFTVNHMihfKGVfbm9ncm91cCksIGFyZyk7CisJCSAgICBicmVhazsKKwkJfQorCQllbHNlCisJCSAgICBzeW5fY2xlYXJfb25lKGlkLCBzeW5jaW5nKTsKKwkgICAgfQorCSAgICBhcmcgPSBza2lwd2hpdGUoYXJnX2VuZCk7CisJfQorICAgIH0KKyAgICByZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisgICAgc3luX3N0YWNrX2ZyZWVfYWxsKGN1cmJ1Zik7CQkvKiBOZWVkIHRvIHJlY29tcHV0ZSBhbGwgc3ludGF4LiAqLworfQorCisvKgorICogQ2xlYXIgb25lIHN5bnRheCBncm91cCBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLgorICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9jbGVhcl9vbmUoaWQsIHN5bmNpbmcpCisgICAgaW50CQlpZDsKKyAgICBpbnQJCXN5bmNpbmc7Cit7CisgICAgc3lucGF0X1QJKnNwcDsKKyAgICBpbnQJCWlkeDsKKworICAgIC8qIENsZWFyIGtleXdvcmRzIG9ubHkgd2hlbiBub3QgIjpzeW4gc3luYyBjbGVhciBncm91cC1uYW1lIiAqLworICAgIGlmICghc3luY2luZykKKyAgICB7CisJKHZvaWQpc3luX2NsZWFyX2tleXdvcmQoaWQsIGN1cmJ1Zi0+Yl9rZXl3dGFiKTsKKwkodm9pZClzeW5fY2xlYXJfa2V5d29yZChpZCwgY3VyYnVmLT5iX2tleXd0YWJfaWMpOworICAgIH0KKworICAgIC8qIGNsZWFyIHRoZSBwYXR0ZXJucyBmb3IgImlkIiAqLworICAgIGZvciAoaWR4ID0gY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47IC0taWR4ID49IDA7ICkKKyAgICB7CisJc3BwID0gJihTWU5fSVRFTVMoY3VyYnVmKVtpZHhdKTsKKwlpZiAoc3BwLT5zcF9zeW4uaWQgIT0gaWQgfHwgc3BwLT5zcF9zeW5jaW5nICE9IHN5bmNpbmcpCisJICAgIGNvbnRpbnVlOworCXN5bl9yZW1vdmVfcGF0dGVybihjdXJidWYsIGlkeCk7CisgICAgfQorfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IG9uIiBjb21tYW5kLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX29uKGVhcCwgc3luY2luZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzeW5jaW5nOwkvKiBub3QgdXNlZCAqLworeworICAgIHN5bl9jbWRfb25vZmYoZWFwLCAic3ludGF4Iik7Cit9CisKKy8qCisgKiBIYW5kbGUgIjpzeW50YXggZW5hYmxlIiBjb21tYW5kLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2VuYWJsZShlYXAsIHN5bmNpbmcpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJc3luY2luZzsJLyogbm90IHVzZWQgKi8KK3sKKyAgICBzZXRfaW50ZXJuYWxfc3RyaW5nX3ZhcigoY2hhcl91ICopInN5bnRheF9jbWQiLCAoY2hhcl91ICopImVuYWJsZSIpOworICAgIHN5bl9jbWRfb25vZmYoZWFwLCAic3ludGF4Iik7CisgICAgZG9fdW5sZXQoKGNoYXJfdSAqKSJnOnN5bnRheF9jbWQiKTsKK30KKworLyoKKyAqIEhhbmRsZSAiOnN5bnRheCByZXNldCIgY29tbWFuZC4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorc3luX2NtZF9yZXNldChlYXAsIHN5bmNpbmcpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJc3luY2luZzsJLyogbm90IHVzZWQgKi8KK3sKKyAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGVhcC0+YXJnKTsKKyAgICBpZiAoIWVhcC0+c2tpcCkKKyAgICB7CisJc2V0X2ludGVybmFsX3N0cmluZ192YXIoKGNoYXJfdSAqKSJzeW50YXhfY21kIiwgKGNoYXJfdSAqKSJyZXNldCIpOworCWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikicnVudGltZSEgc3ludGF4L3N5bmNvbG9yLnZpbSIpOworCWRvX3VubGV0KChjaGFyX3UgKikiZzpzeW50YXhfY21kIik7CisgICAgfQorfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IG1hbnVhbCIgY29tbWFuZC4KKyAqLworLyogQVJHU1VTRUQgKi8KKyAgICBzdGF0aWMgdm9pZAorc3luX2NtZF9tYW51YWwoZWFwLCBzeW5jaW5nKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXN5bmNpbmc7CS8qIG5vdCB1c2VkICovCit7CisgICAgc3luX2NtZF9vbm9mZihlYXAsICJtYW51YWwiKTsKK30KKworLyoKKyAqIEhhbmRsZSAiOnN5bnRheCBvZmYiIGNvbW1hbmQuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9jbWRfb2ZmKGVhcCwgc3luY2luZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzeW5jaW5nOwkvKiBub3QgdXNlZCAqLworeworICAgIHN5bl9jbWRfb25vZmYoZWFwLCAibm9zeW50YXgiKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX29ub2ZmKGVhcCwgbmFtZSkKKyAgICBleGFyZ19UCSplYXA7CisgICAgY2hhcgkqbmFtZTsKK3sKKyAgICBjaGFyX3UJYnVmWzEwMF07CisKKyAgICBlYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKGVhcC0+YXJnKTsKKyAgICBpZiAoIWVhcC0+c2tpcCkKKyAgICB7CisJU1RSQ1BZKGJ1ZiwgInNvICIpOworCXNwcmludGYoKGNoYXIgKilidWYgKyAzLCBTWU5UQVhfRk5BTUUsIG5hbWUpOworCWRvX2NtZGxpbmVfY21kKGJ1Zik7CisgICAgfQorfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IFtsaXN0XSIgY29tbWFuZDogbGlzdCBjdXJyZW50IHN5bnRheCB3b3Jkcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2xpc3QoZWFwLCBzeW5jaW5nKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXN5bmNpbmc7CSAgICAvKiB3aGVuIFRSVUU6IGxpc3Qgc3luY2luZyBpdGVtcyAqLworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgaW50CQlpZDsKKyAgICBjaGFyX3UJKmFyZ19lbmQ7CisKKyAgICBlYXAtPm5leHRjbWQgPSBmaW5kX25leHRjbWQoYXJnKTsKKyAgICBpZiAoZWFwLT5za2lwKQorCXJldHVybjsKKworICAgIGlmICghc3ludGF4X3ByZXNlbnQoY3VyYnVmKSkKKyAgICB7CisJTVNHKF8oIk5vIFN5bnRheCBpdGVtcyBkZWZpbmVkIGZvciB0aGlzIGJ1ZmZlciIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHN5bmNpbmcpCisgICAgeworCWlmIChjdXJidWYtPmJfc3luX3N5bmNfZmxhZ3MgJiBTRl9DQ09NTUVOVCkKKwl7CisJICAgIE1TR19QVVRTKF8oInN5bmNpbmcgb24gQy1zdHlsZSBjb21tZW50cyIpKTsKKwkgICAgc3luX2xpbmVzX21zZygpOworCSAgICBzeW5fbWF0Y2hfbXNnKCk7CisJICAgIHJldHVybjsKKwl9CisJZWxzZSBpZiAoIShjdXJidWYtPmJfc3luX3N5bmNfZmxhZ3MgJiBTRl9NQVRDSCkpCisJeworCSAgICBpZiAoY3VyYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzID09IDApCisJCU1TR19QVVRTKF8oIm5vIHN5bmNpbmciKSk7CisJICAgIGVsc2UKKwkgICAgeworCQlNU0dfUFVUUyhfKCJzeW5jaW5nIHN0YXJ0cyAiKSk7CisJCW1zZ19vdXRudW0oY3VyYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzKTsKKwkJTVNHX1BVVFMoXygiIGxpbmVzIGJlZm9yZSB0b3AgbGluZSIpKTsKKwkJc3luX21hdGNoX21zZygpOworCSAgICB9CisJICAgIHJldHVybjsKKwl9CisJTVNHX1BVVFNfVElUTEUoXygiXG4tLS0gU3ludGF4IHN5bmMgaXRlbXMgLS0tIikpOworCWlmIChjdXJidWYtPmJfc3luX3N5bmNfbWlubGluZXMgPiAwCisJCXx8IGN1cmJ1Zi0+Yl9zeW5fc3luY19tYXhsaW5lcyA+IDAKKwkJfHwgY3VyYnVmLT5iX3N5bl9zeW5jX2xpbmVicmVha3MgPiAwKQorCXsKKwkgICAgTVNHX1BVVFMoXygiXG5zeW5jaW5nIG9uIGl0ZW1zIikpOworCSAgICBzeW5fbGluZXNfbXNnKCk7CisJICAgIHN5bl9tYXRjaF9tc2coKTsKKwl9CisgICAgfQorICAgIGVsc2UKKwlNU0dfUFVUU19USVRMRShfKCJcbi0tLSBTeW50YXggaXRlbXMgLS0tIikpOworICAgIGlmIChlbmRzX2V4Y21kKCphcmcpKQorICAgIHsKKwkvKgorCSAqIE5vIGFyZ3VtZW50OiBMaXN0IGFsbCBncm91cCBJRHMgYW5kIGFsbCBzeW50YXggY2x1c3RlcnMuCisJICovCisJZm9yIChpZCA9IDE7IGlkIDw9IGhpZ2hsaWdodF9nYS5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraWQpCisJICAgIHN5bl9saXN0X29uZShpZCwgc3luY2luZywgRkFMU0UpOworCWZvciAoaWQgPSAwOyBpZCA8IGN1cmJ1Zi0+Yl9zeW5fY2x1c3RlcnMuZ2FfbGVuICYmICFnb3RfaW50OyArK2lkKQorCSAgICBzeW5fbGlzdF9jbHVzdGVyKGlkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKgorCSAqIExpc3QgdGhlIGdyb3VwIElEcyBhbmQgc3ludGF4IGNsdXN0ZXJzIHRoYXQgYXJlIGluIHRoZSBhcmd1bWVudC4KKwkgKi8KKwl3aGlsZSAoIWVuZHNfZXhjbWQoKmFyZykgJiYgIWdvdF9pbnQpCisJeworCSAgICBhcmdfZW5kID0gc2tpcHRvd2hpdGUoYXJnKTsKKwkgICAgaWYgKCphcmcgPT0gJ0AnKQorCSAgICB7CisJCWlkID0gc3luX3NjbF9uYW1lbjJpZChhcmcgKyAxLCAoaW50KShhcmdfZW5kIC0gYXJnIC0gMSkpOworCQlpZiAoaWQgPT0gMCkKKwkJICAgIEVNU0cyKF8oIkUzOTI6IE5vIHN1Y2ggc3ludGF4IGNsdXN0ZXI6ICVzIiksIGFyZyk7CisJCWVsc2UKKwkJICAgIHN5bl9saXN0X2NsdXN0ZXIoaWQgLSBTWU5JRF9DTFVTVEVSKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJaWQgPSBzeW5fbmFtZW4yaWQoYXJnLCAoaW50KShhcmdfZW5kIC0gYXJnKSk7CisJCWlmIChpZCA9PSAwKQorCQkgICAgRU1TRzIoXyhlX25vZ3JvdXApLCBhcmcpOworCQllbHNlCisJCSAgICBzeW5fbGlzdF9vbmUoaWQsIHN5bmNpbmcsIFRSVUUpOworCSAgICB9CisJICAgIGFyZyA9IHNraXB3aGl0ZShhcmdfZW5kKTsKKwl9CisgICAgfQorICAgIGVhcC0+bmV4dGNtZCA9IGNoZWNrX25leHRjbWQoYXJnKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitzeW5fbGluZXNfbXNnKCkKK3sKKyAgICBpZiAoY3VyYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzID4gMCB8fCBjdXJidWYtPmJfc3luX3N5bmNfbWlubGluZXMgPiAwKQorICAgIHsKKwlNU0dfUFVUUygiOyAiKTsKKwlpZiAoY3VyYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzID4gMCkKKwl7CisJICAgIE1TR19QVVRTKF8oIm1pbmltYWwgIikpOworCSAgICBtc2dfb3V0bnVtKGN1cmJ1Zi0+Yl9zeW5fc3luY19taW5saW5lcyk7CisJICAgIGlmIChjdXJidWYtPmJfc3luX3N5bmNfbWF4bGluZXMpCisJCU1TR19QVVRTKCIsICIpOworCX0KKwlpZiAoY3VyYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzID4gMCkKKwl7CisJICAgIE1TR19QVVRTKF8oIm1heGltYWwgIikpOworCSAgICBtc2dfb3V0bnVtKGN1cmJ1Zi0+Yl9zeW5fc3luY19tYXhsaW5lcyk7CisJfQorCU1TR19QVVRTKF8oIiBsaW5lcyBiZWZvcmUgdG9wIGxpbmUiKSk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3N5bl9tYXRjaF9tc2coKQoreworICAgIGlmIChjdXJidWYtPmJfc3luX3N5bmNfbGluZWJyZWFrcyA+IDApCisgICAgeworCU1TR19QVVRTKF8oIjsgbWF0Y2ggIikpOworCW1zZ19vdXRudW0oY3VyYnVmLT5iX3N5bl9zeW5jX2xpbmVicmVha3MpOworCU1TR19QVVRTKF8oIiBsaW5lIGJyZWFrcyIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgIGxhc3RfbWF0Y2hncm91cDsKKworc3RydWN0IG5hbWVfbGlzdAoreworICAgIGludAkJZmxhZzsKKyAgICBjaGFyCSpuYW1lOworfTsKKworc3RhdGljIHZvaWQgc3luX2xpc3RfZmxhZ3MgX19BUkdTKChzdHJ1Y3QgbmFtZV9saXN0ICpubCwgaW50IGZsYWdzLCBpbnQgYXR0cikpOworCisvKgorICogTGlzdCBvbmUgc3ludGF4IGl0ZW0sIGZvciAiOnN5bnRheCIgb3IgInN5bnRheCBsaXN0IHN5bnRheF9uYW1lIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fbGlzdF9vbmUoaWQsIHN5bmNpbmcsIGxpbmtfb25seSkKKyAgICBpbnQJCWlkOworICAgIGludAkJc3luY2luZzsJICAgIC8qIHdoZW4gVFJVRTogbGlzdCBzeW5jaW5nIGl0ZW1zICovCisgICAgaW50CQlsaW5rX29ubHk7CSAgICAvKiB3aGVuIFRSVUU7IGxpc3QgbGluay1vbmx5IHRvbyAqLworeworICAgIGludAkJYXR0cjsKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCWRpZF9oZWFkZXIgPSBGQUxTRTsKKyAgICBzeW5wYXRfVAkqc3BwOworICAgIHN0YXRpYyBzdHJ1Y3QgbmFtZV9saXN0IG5hbWVsaXN0MVtdID0KKwkJeworCQkgICAge0hMX0RJU1BMQVksICJkaXNwbGF5In0sCisJCSAgICB7SExfQ09OVEFJTkVELCAiY29udGFpbmVkIn0sCisJCSAgICB7SExfT05FTElORSwgIm9uZWxpbmUifSwKKwkJICAgIHtITF9LRUVQRU5ELCAia2VlcGVuZCJ9LAorCQkgICAge0hMX0VYVEVORCwgImV4dGVuZCJ9LAorCQkgICAge0hMX0VYQ0xVREVOTCwgImV4Y2x1ZGVubCJ9LAorCQkgICAge0hMX1RSQU5TUCwgInRyYW5zcGFyZW50In0sCisJCSAgICB7SExfRk9MRCwgImZvbGQifSwKKwkJICAgIHswLCBOVUxMfQorCQl9OworICAgIHN0YXRpYyBzdHJ1Y3QgbmFtZV9saXN0IG5hbWVsaXN0MltdID0KKwkJeworCQkgICAge0hMX1NLSVBXSElURSwgInNraXB3aGl0ZSJ9LAorCQkgICAge0hMX1NLSVBOTCwgInNraXBubCJ9LAorCQkgICAge0hMX1NLSVBFTVBUWSwgInNraXBlbXB0eSJ9LAorCQkgICAgezAsIE5VTEx9CisJCX07CisKKyAgICBhdHRyID0gaGxfYXR0cihITEZfRCk7CQkvKiBoaWdobGlnaHQgbGlrZSBkaXJlY3RvcmllcyAqLworCisgICAgLyogbGlzdCB0aGUga2V5d29yZHMgZm9yICJpZCIgKi8KKyAgICBpZiAoIXN5bmNpbmcpCisgICAgeworCWRpZF9oZWFkZXIgPSBzeW5fbGlzdF9rZXl3b3JkcyhpZCwgY3VyYnVmLT5iX2tleXd0YWIsIEZBTFNFLCBhdHRyKTsKKwlkaWRfaGVhZGVyID0gc3luX2xpc3Rfa2V5d29yZHMoaWQsIGN1cmJ1Zi0+Yl9rZXl3dGFiX2ljLAorCQkJCQkJCSAgICBkaWRfaGVhZGVyLCBhdHRyKTsKKyAgICB9CisKKyAgICAvKiBsaXN0IHRoZSBwYXR0ZXJucyBmb3IgImlkIiAqLworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraWR4KQorICAgIHsKKwlzcHAgPSAmKFNZTl9JVEVNUyhjdXJidWYpW2lkeF0pOworCWlmIChzcHAtPnNwX3N5bi5pZCAhPSBpZCB8fCBzcHAtPnNwX3N5bmNpbmcgIT0gc3luY2luZykKKwkgICAgY29udGludWU7CisKKwkodm9pZClzeW5fbGlzdF9oZWFkZXIoZGlkX2hlYWRlciwgOTk5LCBpZCk7CisJZGlkX2hlYWRlciA9IFRSVUU7CisJbGFzdF9tYXRjaGdyb3VwID0gMDsKKwlpZiAoc3BwLT5zcF90eXBlID09IFNQVFlQRV9NQVRDSCkKKwl7CisJICAgIHB1dF9wYXR0ZXJuKCJtYXRjaCIsICcgJywgc3BwLCBhdHRyKTsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwl9CisJZWxzZSBpZiAoc3BwLT5zcF90eXBlID09IFNQVFlQRV9TVEFSVCkKKwl7CisJICAgIHdoaWxlIChTWU5fSVRFTVMoY3VyYnVmKVtpZHhdLnNwX3R5cGUgPT0gU1BUWVBFX1NUQVJUKQorCQlwdXRfcGF0dGVybigic3RhcnQiLCAnPScsICZTWU5fSVRFTVMoY3VyYnVmKVtpZHgrK10sIGF0dHIpOworCSAgICBpZiAoU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF90eXBlID09IFNQVFlQRV9TS0lQKQorCQlwdXRfcGF0dGVybigic2tpcCIsICc9JywgJlNZTl9JVEVNUyhjdXJidWYpW2lkeCsrXSwgYXR0cik7CisJICAgIHdoaWxlIChpZHggPCBjdXJidWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbgorCQkJICAgICAgJiYgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF90eXBlID09IFNQVFlQRV9FTkQpCisJCXB1dF9wYXR0ZXJuKCJlbmQiLCAnPScsICZTWU5fSVRFTVMoY3VyYnVmKVtpZHgrK10sIGF0dHIpOworCSAgICAtLWlkeDsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwl9CisJc3luX2xpc3RfZmxhZ3MobmFtZWxpc3QxLCBzcHAtPnNwX2ZsYWdzLCBhdHRyKTsKKworCWlmIChzcHAtPnNwX2NvbnRfbGlzdCAhPSBOVUxMKQorCSAgICBwdXRfaWRfbGlzdCgoY2hhcl91ICopImNvbnRhaW5zIiwgc3BwLT5zcF9jb250X2xpc3QsIGF0dHIpOworCisJaWYgKHNwcC0+c3Bfc3luLmNvbnRfaW5fbGlzdCAhPSBOVUxMKQorCSAgICBwdXRfaWRfbGlzdCgoY2hhcl91ICopImNvbnRhaW5lZGluIiwKKwkJCQkJICAgICAgc3BwLT5zcF9zeW4uY29udF9pbl9saXN0LCBhdHRyKTsKKworCWlmIChzcHAtPnNwX25leHRfbGlzdCAhPSBOVUxMKQorCXsKKwkgICAgcHV0X2lkX2xpc3QoKGNoYXJfdSAqKSJuZXh0Z3JvdXAiLCBzcHAtPnNwX25leHRfbGlzdCwgYXR0cik7CisJICAgIHN5bl9saXN0X2ZsYWdzKG5hbWVsaXN0Miwgc3BwLT5zcF9mbGFncywgYXR0cik7CisJfQorCWlmIChzcHAtPnNwX2ZsYWdzICYgKEhMX1NZTkNfSEVSRXxITF9TWU5DX1RIRVJFKSkKKwl7CisJICAgIGlmIChzcHAtPnNwX2ZsYWdzICYgSExfU1lOQ19IRVJFKQorCQltc2dfcHV0c19hdHRyKChjaGFyX3UgKikiZ3JvdXBoZXJlIiwgYXR0cik7CisJICAgIGVsc2UKKwkJbXNnX3B1dHNfYXR0cigoY2hhcl91ICopImdyb3VwdGhlcmUiLCBhdHRyKTsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkgICAgaWYgKHNwcC0+c3Bfc3luY19pZHggPj0gMCkKKwkJbXNnX291dHRyYW5zKEhMX1RBQkxFKClbU1lOX0lURU1TKGN1cmJ1ZikKKwkJCQkgICBbc3BwLT5zcF9zeW5jX2lkeF0uc3Bfc3luLmlkIC0gMV0uc2dfbmFtZSk7CisJICAgIGVsc2UKKwkJTVNHX1BVVFMoIk5PTkUiKTsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwl9CisgICAgfQorCisgICAgLyogbGlzdCB0aGUgbGluaywgaWYgdGhlcmUgaXMgb25lICovCisgICAgaWYgKEhMX1RBQkxFKClbaWQgLSAxXS5zZ19saW5rICYmIChkaWRfaGVhZGVyIHx8IGxpbmtfb25seSkgJiYgIWdvdF9pbnQpCisgICAgeworCSh2b2lkKXN5bl9saXN0X2hlYWRlcihkaWRfaGVhZGVyLCA5OTksIGlkKTsKKwltc2dfcHV0c19hdHRyKChjaGFyX3UgKikibGlua3MgdG8iLCBhdHRyKTsKKwltc2dfcHV0Y2hhcignICcpOworCW1zZ19vdXR0cmFucyhITF9UQUJMRSgpW0hMX1RBQkxFKClbaWQgLSAxXS5zZ19saW5rIC0gMV0uc2dfbmFtZSk7CisgICAgfQorfQorCisgICAgc3RhdGljIHZvaWQKK3N5bl9saXN0X2ZsYWdzKG5sLCBmbGFncywgYXR0cikKKyAgICBzdHJ1Y3QgbmFtZV9saXN0CSpubDsKKyAgICBpbnQJCQlmbGFnczsKKyAgICBpbnQJCQlhdHRyOworeworICAgIGludAkJaTsKKworICAgIGZvciAoaSA9IDA7IG5sW2ldLmZsYWcgIT0gMDsgKytpKQorCWlmIChmbGFncyAmIG5sW2ldLmZsYWcpCisJeworCSAgICBtc2dfcHV0c19hdHRyKChjaGFyX3UgKilubFtpXS5uYW1lLCBhdHRyKTsKKwkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwl9Cit9CisKKy8qCisgKiBMaXN0IG9uZSBzeW50YXggY2x1c3RlciwgZm9yICI6c3ludGF4IiBvciAic3ludGF4IGxpc3Qgc3ludGF4X25hbWUiLgorICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9saXN0X2NsdXN0ZXIoaWQpCisgICAgaW50IGlkOworeworICAgIGludAkgICAgZW5kY29sID0gMTU7CisKKyAgICAvKiBzbGlnaHQgaGFjazogIHJvdWdobHkgZHVwbGljYXRlIHRoZSBndXRzIG9mIHN5bl9saXN0X2hlYWRlcigpICovCisgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisgICAgbXNnX291dHRyYW5zKFNZTl9DTFNUUihjdXJidWYpW2lkXS5zY2xfbmFtZSk7CisKKyAgICBpZiAobXNnX2NvbCA+PSBlbmRjb2wpCS8qIG91dHB1dCBhdCBsZWFzdCBvbmUgc3BhY2UgKi8KKwllbmRjb2wgPSBtc2dfY29sICsgMTsKKyAgICBpZiAoQ29sdW1ucyA8PSBlbmRjb2wpCS8qIGF2b2lkIGhhbmcgZm9yIHRpbnkgd2luZG93ICovCisJZW5kY29sID0gQ29sdW1ucyAtIDE7CisKKyAgICBtc2dfYWR2YW5jZShlbmRjb2wpOworICAgIGlmIChTWU5fQ0xTVFIoY3VyYnVmKVtpZF0uc2NsX2xpc3QgIT0gTlVMTCkKKyAgICB7CisJcHV0X2lkX2xpc3QoKGNoYXJfdSAqKSJjbHVzdGVyIiwgU1lOX0NMU1RSKGN1cmJ1ZilbaWRdLnNjbF9saXN0LAorCQkgICAgaGxfYXR0cihITEZfRCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSJjbHVzdGVyIiwgaGxfYXR0cihITEZfRCkpOworCW1zZ19wdXRzKChjaGFyX3UgKikiPU5PTkUiKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcHV0X2lkX2xpc3QobmFtZSwgbGlzdCwgYXR0cikKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgc2hvcnQJKmxpc3Q7CisgICAgaW50CQlhdHRyOworeworICAgIHNob3J0CQkqcDsKKworICAgIG1zZ19wdXRzX2F0dHIobmFtZSwgYXR0cik7CisgICAgbXNnX3B1dGNoYXIoJz0nKTsKKyAgICBmb3IgKHAgPSBsaXN0OyAqcDsgKytwKQorICAgIHsKKwlpZiAoKnAgPj0gU1lOSURfQUxMQlVUICYmICpwIDwgU1lOSURfVE9QKQorCXsKKwkgICAgaWYgKHBbMV0pCisJCU1TR19QVVRTKCJBTExCVVQiKTsKKwkgICAgZWxzZQorCQlNU0dfUFVUUygiQUxMIik7CisJfQorCWVsc2UgaWYgKCpwID49IFNZTklEX1RPUCAmJiAqcCA8IFNZTklEX0NPTlRBSU5FRCkKKwl7CisJICAgIE1TR19QVVRTKCJUT1AiKTsKKwl9CisJZWxzZSBpZiAoKnAgPj0gU1lOSURfQ09OVEFJTkVEICYmICpwIDwgU1lOSURfQ0xVU1RFUikKKwl7CisJICAgIE1TR19QVVRTKCJDT05UQUlORUQiKTsKKwl9CisJZWxzZSBpZiAoKnAgPj0gU1lOSURfQ0xVU1RFUikKKwl7CisJICAgIHNob3J0IHNjbF9pZCA9ICpwIC0gU1lOSURfQ0xVU1RFUjsKKworCSAgICBtc2dfcHV0Y2hhcignQCcpOworCSAgICBtc2dfb3V0dHJhbnMoU1lOX0NMU1RSKGN1cmJ1Zilbc2NsX2lkXS5zY2xfbmFtZSk7CisJfQorCWVsc2UKKwkgICAgbXNnX291dHRyYW5zKEhMX1RBQkxFKClbKnAgLSAxXS5zZ19uYW1lKTsKKwlpZiAocFsxXSkKKwkgICAgbXNnX3B1dGNoYXIoJywnKTsKKyAgICB9CisgICAgbXNnX3B1dGNoYXIoJyAnKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitwdXRfcGF0dGVybihzLCBjLCBzcHAsIGF0dHIpCisgICAgY2hhcgkqczsKKyAgICBpbnQJCWM7CisgICAgc3lucGF0X1QJKnNwcDsKKyAgICBpbnQJCWF0dHI7Cit7CisgICAgbG9uZwluOworICAgIGludAkJbWFzazsKKyAgICBpbnQJCWZpcnN0OworICAgIHN0YXRpYyBjaGFyCSpzZXBjaGFycyA9ICIvKz0tI0BcInwnXiYiOworICAgIGludAkJaTsKKworICAgIC8qIE1heSBoYXZlIHRvIHdyaXRlICJtYXRjaGdyb3VwPWdyb3VwIiAqLworICAgIGlmIChsYXN0X21hdGNoZ3JvdXAgIT0gc3BwLT5zcF9zeW5fbWF0Y2hfaWQpCisgICAgeworCWxhc3RfbWF0Y2hncm91cCA9IHNwcC0+c3Bfc3luX21hdGNoX2lkOworCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSJtYXRjaGdyb3VwIiwgYXR0cik7CisJbXNnX3B1dGNoYXIoJz0nKTsKKwlpZiAobGFzdF9tYXRjaGdyb3VwID09IDApCisJICAgIG1zZ19vdXR0cmFucygoY2hhcl91ICopIk5PTkUiKTsKKwllbHNlCisJICAgIG1zZ19vdXR0cmFucyhITF9UQUJMRSgpW2xhc3RfbWF0Y2hncm91cCAtIDFdLnNnX25hbWUpOworCW1zZ19wdXRjaGFyKCcgJyk7CisgICAgfQorCisgICAgLyogb3V0cHV0IHRoZSBuYW1lIG9mIHRoZSBwYXR0ZXJuIGFuZCBhbiAnPScgb3IgJyAnICovCisgICAgbXNnX3B1dHNfYXR0cigoY2hhcl91ICopcywgYXR0cik7CisgICAgbXNnX3B1dGNoYXIoYyk7CisKKyAgICAvKiBvdXRwdXQgdGhlIHBhdHRlcm4sIGluIGJldHdlZW4gYSBjaGFyIHRoYXQgaXMgbm90IGluIHRoZSBwYXR0ZXJuICovCisgICAgZm9yIChpID0gMDsgdmltX3N0cmNocihzcHAtPnNwX3BhdHRlcm4sIHNlcGNoYXJzW2ldKSAhPSBOVUxMOyApCisJaWYgKHNlcGNoYXJzWysraV0gPT0gTlVMKQorCXsKKwkgICAgaSA9IDA7CS8qIG5vIGdvb2QgY2hhciBmb3VuZCwganVzdCB1c2UgdGhlIGZpcnN0IG9uZSAqLworCSAgICBicmVhazsKKwl9CisgICAgbXNnX3B1dGNoYXIoc2VwY2hhcnNbaV0pOworICAgIG1zZ19vdXR0cmFucyhzcHAtPnNwX3BhdHRlcm4pOworICAgIG1zZ19wdXRjaGFyKHNlcGNoYXJzW2ldKTsKKworICAgIC8qIG91dHB1dCBhbnkgcGF0dGVybiBvcHRpb25zICovCisgICAgZmlyc3QgPSBUUlVFOworICAgIGZvciAoaSA9IDA7IGkgPCBTUE9fQ09VTlQ7ICsraSkKKyAgICB7CisJbWFzayA9ICgxIDw8IGkpOworCWlmIChzcHAtPnNwX29mZl9mbGFncyAmIChtYXNrICsgKG1hc2sgPDwgU1BPX0NPVU5UKSkpCisJeworCSAgICBpZiAoIWZpcnN0KQorCQltc2dfcHV0Y2hhcignLCcpOwkvKiBzZXBhcmF0ZSB3aXRoIGNvbW1hcyAqLworCSAgICBtc2dfcHV0cygoY2hhcl91ICopc3BvX25hbWVfdGFiW2ldKTsKKwkgICAgbiA9IHNwcC0+c3Bfb2Zmc2V0c1tpXTsKKwkgICAgaWYgKGkgIT0gU1BPX0xDX09GRikKKwkgICAgeworCQlpZiAoc3BwLT5zcF9vZmZfZmxhZ3MgJiBtYXNrKQorCQkgICAgbXNnX3B1dGNoYXIoJ3MnKTsKKwkJZWxzZQorCQkgICAgbXNnX3B1dGNoYXIoJ2UnKTsKKwkJaWYgKG4gPiAwKQorCQkgICAgbXNnX3B1dGNoYXIoJysnKTsKKwkgICAgfQorCSAgICBpZiAobiB8fCBpID09IFNQT19MQ19PRkYpCisJCW1zZ19vdXRudW0obik7CisJICAgIGZpcnN0ID0gRkFMU0U7CisJfQorICAgIH0KKyAgICBtc2dfcHV0Y2hhcignICcpOworfQorCisvKgorICogTGlzdCBvciBjbGVhciB0aGUga2V5d29yZHMgZm9yIG9uZSBzeW50YXggZ3JvdXAuCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgaGVhZGVyIGhhcyBiZWVuIHByaW50ZWQuCisgKi8KKyAgICBzdGF0aWMgaW50CitzeW5fbGlzdF9rZXl3b3JkcyhpZCwga3RhYnAsIGRpZF9oZWFkZXIsIGF0dHIpCisgICAgaW50CQlpZDsKKyAgICBrZXllbnRyeV9UCSoqa3RhYnA7CisgICAgaW50CQlkaWRfaGVhZGVyOwkJLyogaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZCAqLworICAgIGludAkJYXR0cjsKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQlvdXRsZW47CisgICAga2V5ZW50cnlfVAkqa3RhYjsKKyAgICBpbnQJCXByZXZfY29udGFpbmVkID0gMDsKKyAgICBzaG9ydAkqcHJldl9uZXh0X2xpc3QgPSBOVUxMOworICAgIHNob3J0CSpwcmV2X2NvbnRfaW5fbGlzdCA9IE5VTEw7CisgICAgaW50CQlwcmV2X3NraXBubCA9IDA7CisgICAgaW50CQlwcmV2X3NraXB3aGl0ZSA9IDA7CisgICAgaW50CQlwcmV2X3NraXBlbXB0eSA9IDA7CisKKyAgICBpZiAoa3RhYnAgPT0gTlVMTCkKKwlyZXR1cm4gZGlkX2hlYWRlcjsKKworICAgIC8qCisgICAgICogVW5mb3J0dW5hdGVseSwgdGhpcyBsaXN0IG9mIGtleXdvcmRzIGlzIG5vdCBzb3J0ZWQgb24gYWxwaGFiZXQgYnV0IG9uCisgICAgICogaGFzaCB2YWx1ZS4uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBLSEFTSF9TSVpFOyArK2kpCisgICAgeworCWZvciAoa3RhYiA9IGt0YWJwW2ldOyBrdGFiICE9IE5VTEwgJiYgIWdvdF9pbnQ7IGt0YWIgPSBrdGFiLT5uZXh0KQorCXsKKwkgICAgaWYgKGt0YWItPmtfc3luLmlkID09IGlkKQorCSAgICB7CisJCWlmIChwcmV2X2NvbnRhaW5lZCAhPSAoa3RhYi0+ZmxhZ3MgJiBITF9DT05UQUlORUQpCisJCQl8fCBwcmV2X3NraXBubCAhPSAoa3RhYi0+ZmxhZ3MgJiBITF9TS0lQTkwpCisJCQl8fCBwcmV2X3NraXB3aGl0ZSAhPSAoa3RhYi0+ZmxhZ3MgJiBITF9TS0lQV0hJVEUpCisJCQl8fCBwcmV2X3NraXBlbXB0eSAhPSAoa3RhYi0+ZmxhZ3MgJiBITF9TS0lQRU1QVFkpCisJCQl8fCBwcmV2X2NvbnRfaW5fbGlzdCAhPSBrdGFiLT5rX3N5bi5jb250X2luX2xpc3QKKwkJCXx8IHByZXZfbmV4dF9saXN0ICE9IGt0YWItPm5leHRfbGlzdCkKKwkJICAgIG91dGxlbiA9IDk5OTk7CisJCWVsc2UKKwkJICAgIG91dGxlbiA9IChpbnQpU1RSTEVOKGt0YWItPmtleXdvcmQpOworCQkvKiBvdXRwdXQgImNvbnRhaW5lZCIgYW5kICJuZXh0Z3JvdXAiIG9uIGVhY2ggbGluZSAqLworCQlpZiAoc3luX2xpc3RfaGVhZGVyKGRpZF9oZWFkZXIsIG91dGxlbiwgaWQpKQorCQl7CisJCSAgICBwcmV2X2NvbnRhaW5lZCA9IDA7CisJCSAgICBwcmV2X25leHRfbGlzdCA9IE5VTEw7CisJCSAgICBwcmV2X2NvbnRfaW5fbGlzdCA9IE5VTEw7CisJCSAgICBwcmV2X3NraXBubCA9IDA7CisJCSAgICBwcmV2X3NraXB3aGl0ZSA9IDA7CisJCSAgICBwcmV2X3NraXBlbXB0eSA9IDA7CisJCX0KKwkJZGlkX2hlYWRlciA9IFRSVUU7CisJCWlmIChwcmV2X2NvbnRhaW5lZCAhPSAoa3RhYi0+ZmxhZ3MgJiBITF9DT05UQUlORUQpKQorCQl7CisJCSAgICBtc2dfcHV0c19hdHRyKChjaGFyX3UgKikiY29udGFpbmVkIiwgYXR0cik7CisJCSAgICBtc2dfcHV0Y2hhcignICcpOworCQkgICAgcHJldl9jb250YWluZWQgPSAoa3RhYi0+ZmxhZ3MgJiBITF9DT05UQUlORUQpOworCQl9CisJCWlmIChrdGFiLT5rX3N5bi5jb250X2luX2xpc3QgIT0gcHJldl9jb250X2luX2xpc3QpCisJCXsKKwkJICAgIHB1dF9pZF9saXN0KChjaGFyX3UgKikiY29udGFpbmVkaW4iLAorCQkJCQkgICAgICBrdGFiLT5rX3N5bi5jb250X2luX2xpc3QsIGF0dHIpOworCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJICAgIHByZXZfY29udF9pbl9saXN0ID0ga3RhYi0+a19zeW4uY29udF9pbl9saXN0OworCQl9CisJCWlmIChrdGFiLT5uZXh0X2xpc3QgIT0gcHJldl9uZXh0X2xpc3QpCisJCXsKKwkJICAgIHB1dF9pZF9saXN0KChjaGFyX3UgKikibmV4dGdyb3VwIiwga3RhYi0+bmV4dF9saXN0LCBhdHRyKTsKKwkJICAgIG1zZ19wdXRjaGFyKCcgJyk7CisJCSAgICBwcmV2X25leHRfbGlzdCA9IGt0YWItPm5leHRfbGlzdDsKKwkJICAgIGlmIChrdGFiLT5mbGFncyAmIEhMX1NLSVBOTCkKKwkJICAgIHsKKwkJCW1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSJza2lwbmwiLCBhdHRyKTsKKwkJCW1zZ19wdXRjaGFyKCcgJyk7CisJCQlwcmV2X3NraXBubCA9IChrdGFiLT5mbGFncyAmIEhMX1NLSVBOTCk7CisJCSAgICB9CisJCSAgICBpZiAoa3RhYi0+ZmxhZ3MgJiBITF9TS0lQV0hJVEUpCisJCSAgICB7CisJCQltc2dfcHV0c19hdHRyKChjaGFyX3UgKikic2tpcHdoaXRlIiwgYXR0cik7CisJCQltc2dfcHV0Y2hhcignICcpOworCQkJcHJldl9za2lwd2hpdGUgPSAoa3RhYi0+ZmxhZ3MgJiBITF9TS0lQV0hJVEUpOworCQkgICAgfQorCQkgICAgaWYgKGt0YWItPmZsYWdzICYgSExfU0tJUEVNUFRZKQorCQkgICAgeworCQkJbXNnX3B1dHNfYXR0cigoY2hhcl91ICopInNraXBlbXB0eSIsIGF0dHIpOworCQkJbXNnX3B1dGNoYXIoJyAnKTsKKwkJCXByZXZfc2tpcGVtcHR5ID0gKGt0YWItPmZsYWdzICYgSExfU0tJUEVNUFRZKTsKKwkJICAgIH0KKwkJfQorCQltc2dfb3V0dHJhbnMoa3RhYi0+a2V5d29yZCk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIGRpZF9oZWFkZXI7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorc3luX2NsZWFyX2tleXdvcmQoaWQsIGt0YWJwKQorICAgIGludAkJaWQ7CisgICAga2V5ZW50cnlfVAkqKmt0YWJwOworeworICAgIGludAkJaTsKKyAgICBrZXllbnRyeV9UCSprdGFiOworICAgIGtleWVudHJ5X1QJKmt0YWJfcHJldjsKKyAgICBrZXllbnRyeV9UCSprdGFiX25leHQ7CisKKyAgICBpZiAoa3RhYnAgPT0gTlVMTCkJICAgIC8qIG5vIGtleXdvcmRzIHByZXNlbnQgKi8KKwlyZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgS0hBU0hfU0laRTsgKytpKQorICAgIHsKKwlrdGFiX3ByZXYgPSBOVUxMOworCWZvciAoa3RhYiA9IGt0YWJwW2ldOyBrdGFiICE9IE5VTEw7ICkKKwl7CisJICAgIGlmIChrdGFiLT5rX3N5bi5pZCA9PSBpZCkKKwkgICAgeworCQlrdGFiX25leHQgPSBrdGFiLT5uZXh0OworCQlpZiAoa3RhYl9wcmV2ID09IE5VTEwpCisJCSAgICBrdGFicFtpXSA9IGt0YWJfbmV4dDsKKwkJZWxzZQorCQkgICAga3RhYl9wcmV2LT5uZXh0ID0ga3RhYl9uZXh0OworCQl2aW1fZnJlZShrdGFiKTsKKwkJa3RhYiA9IGt0YWJfbmV4dDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJa3RhYl9wcmV2ID0ga3RhYjsKKwkJa3RhYiA9IGt0YWItPm5leHQ7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgorICogUmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGZyZWUoKSBhIGJyYW5jaCBvZiBhIGt3b3JkdGFiLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZyZWVfa2V5d3RhYihrdGFicCkKKyAgICBrZXllbnRyeV9UCSoqa3RhYnA7Cit7CisgICAgaW50CQlpOworICAgIGtleWVudHJ5X1QJKmt0YWI7CisgICAga2V5ZW50cnlfVAkqa3RhYl9uZXh0OworCisgICAgaWYgKGt0YWJwICE9IE5VTEwpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBLSEFTSF9TSVpFOyArK2kpCisJICAgIGZvciAoa3RhYiA9IGt0YWJwW2ldOyBrdGFiICE9IE5VTEw7IGt0YWIgPSBrdGFiX25leHQpCisJICAgIHsKKwkJa3RhYl9uZXh0ID0ga3RhYi0+bmV4dDsKKwkJdmltX2ZyZWUoa3RhYi0+bmV4dF9saXN0KTsKKwkJdmltX2ZyZWUoa3RhYi0+a19zeW4uY29udF9pbl9saXN0KTsKKwkJdmltX2ZyZWUoa3RhYik7CisJICAgIH0KKwl2aW1fZnJlZShrdGFicCk7CisgICAgfQorfQorCisvKgorICogQWRkIGEga2V5d29yZCB0byB0aGUgbGlzdCBvZiBrZXl3b3Jkcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCithZGRfa2V5d29yZChuYW1lLCBpZCwgZmxhZ3MsIGNvbnRfaW5fbGlzdCwgbmV4dF9saXN0KQorICAgIGNoYXJfdQkqbmFtZTsJICAgIC8qIG5hbWUgb2Yga2V5d29yZCAqLworICAgIGludAkJaWQ7CSAgICAvKiBncm91cCBJRCBmb3IgdGhpcyBrZXl3b3JkICovCisgICAgaW50CQlmbGFnczsJICAgIC8qIGZsYWdzIGZvciB0aGlzIGtleXdvcmQgKi8KKyAgICBzaG9ydAkqY29udF9pbl9saXN0OyAvKiBjb250YWluZWRpbiBmb3IgdGhpcyBrZXl3b3JkICovCisgICAgc2hvcnQJKm5leHRfbGlzdDsgLyogbmV4dGdyb3VwIGZvciB0aGlzIGtleXdvcmQgKi8KK3sKKyAgICBrZXllbnRyeV9UCSprdGFiOworICAgIGtleWVudHJ5X1QJKioqa3RhYnBwOworICAgIGludAkJaGFzaDsKKyAgICBjaGFyX3UJKm5hbWVfaWMgPSBuYW1lOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9zeW5faWMpCisgICAgeworCW5hbWVfaWMgPSBzdHJfZm9sZGNhc2UobmFtZSwgKGludClTVFJMRU4obmFtZSkpOworCWlmIChuYW1lX2ljID09IE5VTEwpCisJICAgIG5hbWVfaWMgPSBuYW1lOworICAgIH0KKyAgICBrdGFiID0gKGtleWVudHJ5X1QgKilhbGxvYygoaW50KShzaXplb2Yoa2V5ZW50cnlfVCkgKyBTVFJMRU4obmFtZV9pYykpKTsKKyAgICBpZiAoa3RhYiA9PSBOVUxMKQorCXJldHVybjsKKyAgICBTVFJDUFkoa3RhYi0+a2V5d29yZCwgbmFtZV9pYyk7CisgICAgaWYgKG5hbWVfaWMgIT0gbmFtZSkKKwl2aW1fZnJlZShuYW1lX2ljKTsKKyAgICBrdGFiLT5rX3N5bi5pZCA9IGlkOworICAgIGt0YWItPmtfc3luLmluY190YWcgPSBjdXJyZW50X3N5bl9pbmNfdGFnOworICAgIGt0YWItPmZsYWdzID0gZmxhZ3M7CisgICAga3RhYi0+a19zeW4uY29udF9pbl9saXN0ID0gY29weV9pZF9saXN0KGNvbnRfaW5fbGlzdCk7CisgICAgaWYgKGNvbnRfaW5fbGlzdCAhPSBOVUxMKQorCWN1cmJ1Zi0+Yl9zeW5fY29udGFpbmVkaW4gPSBUUlVFOworICAgIGt0YWItPm5leHRfbGlzdCA9IGNvcHlfaWRfbGlzdChuZXh0X2xpc3QpOworCisgICAgaWYgKGN1cmJ1Zi0+Yl9zeW5faWMpCisJa3RhYnBwID0gJmN1cmJ1Zi0+Yl9rZXl3dGFiX2ljOworICAgIGVsc2UKKwlrdGFicHAgPSAmY3VyYnVmLT5iX2tleXd0YWI7CisKKyAgICBpZiAoKmt0YWJwcCA9PSBOVUxMKQorICAgIHsKKwkqa3RhYnBwID0gKGtleWVudHJ5X1QgKiopYWxsb2NfY2xlYXIoCisJCQkJICAgIChpbnQpKHNpemVvZihrZXllbnRyeV9UICopICogS0hBU0hfU0laRSkpOworCWlmICgqa3RhYnBwID09IE5VTEwpCisJICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYXNoID0gc3luX2toYXNoKGt0YWItPmtleXdvcmQpOworICAgIGt0YWItPm5leHQgPSAoKmt0YWJwcClbaGFzaF07CisgICAgKCprdGFicHApW2hhc2hdID0ga3RhYjsKK30KKworLyoKKyAqIENvbXB1dGUgYSBoYXNoIHZhbHVlIGZvciBhIGtleXdvcmQuICBVc2VzIHRoZSBFbGZIYXNoIGFsZ29yaXRobSwgd2hpY2ggaXMKKyAqIHN1cHBvc2VkIHRvIGhhdmUgYW4gZXZlbiBkaXN0cmlidXRpb24gKHN1Z2dlc3RlZCBieSBDaGFybGVzIENhbXBiZWxsKS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3N5bl9raGFzaChwKQorICAgIGNoYXJfdQkqcDsKK3sKKyAgICBsb25nX3UJaGFzaCA9IDA7CisgICAgbG9uZ191CWc7CisKKyAgICB3aGlsZSAoKnAgIT0gTlVMKQorICAgIHsKKwloYXNoID0gKGhhc2ggPDwgNCkgKyAqcCsrOwkvKiBjbGVhciBsb3cgNCBiaXRzIG9mIGhhc2gsIGFkZCBjaGFyICovCisJZyA9IGhhc2ggJiAweGYwMDAwMDAwTDsJCS8qIGcgaGFzIGhpZ2ggNCBiaXRzIG9mIGhhc2ggb25seSAqLworCWlmIChnICE9IDApCisJICAgIGhhc2ggXj0gZyA+PiAyNDsJCS8qIHhvciBnJ3MgaGlnaCA0IGJpdHMgaW50byBoYXNoICovCisgICAgfQorCisgICAgcmV0dXJuIChpbnQpKGhhc2ggJiBLSEFTSF9NQVNLKTsKK30KKworLyoKKyAqIEdldCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ3JvdXAgbmFtZSBhcmd1bWVudC4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGFyZ3VtZW50LgorICogUmV0dXJuIE5VTEwgaWYgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCB3YXMgZm91bmQgaW5zdGVhZCBvZiBmdXJ0aGVyIGFyZ3MuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2dldF9ncm91cF9uYW1lKGFyZywgbmFtZV9lbmQpCisgICAgY2hhcl91CSphcmc7CQkvKiBzdGFydCBvZiB0aGUgYXJndW1lbnQgKi8KKyAgICBjaGFyX3UJKipuYW1lX2VuZDsJLyogcG9pbnRlciB0byBlbmQgb2YgdGhlIG5hbWUgKi8KK3sKKyAgICBjaGFyX3UJKnJlc3Q7CisKKyAgICAqbmFtZV9lbmQgPSBza2lwdG93aGl0ZShhcmcpOworICAgIHJlc3QgPSBza2lwd2hpdGUoKm5hbWVfZW5kKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBhcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgbWF5IGJlIGEKKyAgICAgKiBwYXR0ZXJuLCB3aGVyZSAnfCcgaXMgYWxsb3dlZCwgc28gb25seSBjaGVjayBmb3IgTlVMLgorICAgICAqLworICAgIGlmIChlbmRzX2V4Y21kKCphcmcpIHx8ICpyZXN0ID09IE5VTCkKKwlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcmVzdDsKK30KKworLyoKKyAqIENoZWNrIGZvciBzeW50YXggY29tbWFuZCBvcHRpb24gYXJndW1lbnRzLgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSBwbGFjZSBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMsIGFuZCBqdXN0IHBpY2tzCisgKiBvdXQgdGhlIGFyZ3VtZW50cyB0aGF0IGFyZSBrbm93bi4gIENhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdyB0bworICogY29sbGVjdCBhbGwgb3B0aW9ucyBpbiBiZXR3ZWVuIG90aGVyIGFyZ3VtZW50cy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgYXJndW1lbnQgKHdoaWNoIGlzbid0IGFuIG9wdGlvbikuCisgKiBSZXR1cm4gTlVMTCBmb3IgYW55IGVycm9yOworICovCisgICAgc3RhdGljIGNoYXJfdSAqCitnZXRfc3luX29wdGlvbnMoYXJnLCBmbGFnc3AsIGtleXdvcmQsIHN5bmNfaWR4LCBjb250X2xpc3QsCisJCQkJCQkgICAgICBjb250X2luX2xpc3QsIG5leHRfbGlzdCkKKyAgICBjaGFyX3UJKmFyZzsJCS8qIG5leHQgYXJndW1lbnQgKi8KKyAgICBpbnQJCSpmbGFnc3A7CS8qIGZsYWdzIGZvciBjb250YWluZWQgYW5kIHRyYW5zcGFydGVudCAqLworICAgIGludAkJa2V5d29yZDsJLyogVFJVRSBmb3IgIjpzeW4ga2V5d29yZCIgKi8KKyAgICBpbnQJCSpzeW5jX2lkeDsJLyogc3ludGF4IGl0ZW0gZm9yICJncm91cGhlcmUiIGFyZ3VtZW50LCBOVUxMCisJCQkJICAgaWYgbm90IGFsbG93ZWQgKi8KKyAgICBzaG9ydAkqKmNvbnRfbGlzdDsJLyogZ3JvdXAgSURzIGZvciAiY29udGFpbnMiIGFyZ3VtZW50LCBOVUxMIGlmCisJCQkJICAgbm90IGFsbG93ZWQgKi8KKyAgICBzaG9ydAkqKmNvbnRfaW5fbGlzdDsJLyogZ3JvdXAgSURzIGZvciAiY29udGFpbmVkaW4iIGFyZ3VtZW50LCBOVUxMCisJCQkJICAgaWYgbm90IGFsbG93ZWQgKi8KKyAgICBzaG9ydAkqKm5leHRfbGlzdDsJLyogZ3JvdXAgSURzIGZvciAibmV4dGdyb3VwIiBhcmd1bWVudCAqLworeworICAgIGludAkJZmxhZ3M7CisgICAgY2hhcl91CSpnbmFtZV9zdGFydCwgKmduYW1lOworICAgIGludAkJc3luX2lkOworICAgIGludAkJbGVuOworICAgIGludAkJaTsKKyAgICBpbnQJCWZpZHg7CisgICAgc3RhdGljIHN0cnVjdCBmbGFnCisgICAgeworCWNoYXIJKm5hbWU7CisJaW50CWxlbjsKKwlpbnQJdmFsOworICAgIH0gZmxhZ3RhYltdID0geyB7ImNvbnRhaW5lZCIsICAgOSwJSExfQ09OVEFJTkVEfSwKKwkJICAgIHsib25lbGluZSIsCSAgICA3LAlITF9PTkVMSU5FfSwKKwkJICAgIHsia2VlcGVuZCIsCSAgICA3LAlITF9LRUVQRU5EfSwKKwkJICAgIHsiZXh0ZW5kIiwJICAgIDYsCUhMX0VYVEVORH0sCisJCSAgICB7ImV4Y2x1ZGVubCIsICAgOSwJSExfRVhDTFVERU5MfSwKKwkJICAgIHsidHJhbnNwYXJlbnQiLCAxMSwgSExfVFJBTlNQfSwKKwkJICAgIHsic2tpcG5sIiwJICAgIDYsCUhMX1NLSVBOTH0sCisJCSAgICB7InNraXB3aGl0ZSIsICAgOSwJSExfU0tJUFdISVRFfSwKKwkJICAgIHsic2tpcGVtcHR5IiwgICA5LAlITF9TS0lQRU1QVFl9LAorCQkgICAgeyJncm91cGhlcmUiLCAgIDksCUhMX1NZTkNfSEVSRX0sCisJCSAgICB7Imdyb3VwdGhlcmUiLCAgMTAsCUhMX1NZTkNfVEhFUkV9LAorCQkgICAgeyJkaXNwbGF5IiwJICAgIDcsCUhMX0RJU1BMQVl9LAorCQkgICAgeyJmb2xkIiwJICAgIDQsCUhMX0ZPTER9LAorCQl9OworI2RlZmluZSBNTEVOIDEyCisgICAgY2hhcglsb3duYW1lW01MRU5dOworICAgIGludAkJbGxlbjsKKworICAgIGlmIChhcmcgPT0gTlVMTCkJCS8qIGFscmVhZHkgZGV0ZWN0ZWQgZXJyb3IgKi8KKwlyZXR1cm4gTlVMTDsKKworICAgIGZsYWdzID0gKmZsYWdzcDsKKyAgICBmb3IgKDs7KQorICAgIHsKKwkvKiBTVFJOSUNNUCgpIGlzIGEgYml0IHNsb3csIGNoYW5nZSBhcmcgdG8gbG93ZXJjYXNlIGZpcnN0IGFuZCB1c2UKKwkgKiBTVFJOQ01QKCkgKi8KKwlmb3IgKGxsZW4gPSAwOyBsbGVuIDwgTUxFTjsgKytsbGVuKQorCXsKKwkgICAgaWYgKCFpc2FscGhhKGFyZ1tsbGVuXSkpCisJCWJyZWFrOworCSAgICBsb3duYW1lW2xsZW5dID0gVE9MT1dFUl9BU0MoYXJnW2xsZW5dKTsKKwl9CisKKwlmb3IgKGZpZHggPSBzaXplb2YoZmxhZ3RhYikgLyBzaXplb2Yoc3RydWN0IGZsYWcpOyAtLWZpZHggPj0gMDsgKQorCXsKKwkgICAgbGVuID0gZmxhZ3RhYltmaWR4XS5sZW47CisJICAgIGlmIChsZW4gPT0gbGxlbgorCQkgICAgJiYgU1RSTkNNUChsb3duYW1lLCBmbGFndGFiW2ZpZHhdLm5hbWUsIGxlbikgPT0gMAorCQkgICAgJiYgKGVuZHNfZXhjbWQoYXJnW2xlbl0pIHx8IHZpbV9pc3doaXRlKGFyZ1tsZW5dKSkpCisJICAgIHsKKwkJaWYgKGtleXdvcmQKKwkJCSYmIChmbGFndGFiW2ZpZHhdLnZhbCA9PSBITF9ESVNQTEFZCisJCQkgICAgfHwgZmxhZ3RhYltmaWR4XS52YWwgPT0gSExfRk9MRAorCQkJICAgIHx8IGZsYWd0YWJbZmlkeF0udmFsID09IEhMX0VYVEVORCkpCisJCXsKKwkJICAgIC8qIHRyZWF0ICJkaXNwbGF5IiwgImZvbGQiIGFuZCAiZXh0ZW5kIiBhcyBhIGtleXdvcmQgKi8KKwkJICAgIGZpZHggPSAtMTsKKwkJICAgIGJyZWFrOworCQl9CisKKwkJZmxhZ3MgfD0gZmxhZ3RhYltmaWR4XS52YWw7CisJCWFyZyA9IHNraXB3aGl0ZShhcmcgKyBsZW4pOworCisJCWlmIChmbGFndGFiW2ZpZHhdLnZhbCA9PSBITF9TWU5DX0hFUkUKKwkJCXx8IGZsYWd0YWJbZmlkeF0udmFsID09IEhMX1NZTkNfVEhFUkUpCisJCXsKKwkJICAgIGlmIChzeW5jX2lkeCA9PSBOVUxMKQorCQkgICAgeworCQkJRU1TRyhfKCJFMzkzOiBncm91cFt0XWhlcmUgbm90IGFjY2VwdGVkIGhlcmUiKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJICAgIH0KKwkJICAgIGduYW1lX3N0YXJ0ID0gYXJnOworCQkgICAgYXJnID0gc2tpcHRvd2hpdGUoYXJnKTsKKwkJICAgIGlmIChnbmFtZV9zdGFydCA9PSBhcmcpCisJCQlyZXR1cm4gTlVMTDsKKwkJICAgIGduYW1lID0gdmltX3N0cm5zYXZlKGduYW1lX3N0YXJ0LCAoaW50KShhcmcgLSBnbmFtZV9zdGFydCkpOworCQkgICAgaWYgKGduYW1lID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJICAgIGlmIChTVFJDTVAoZ25hbWUsICJOT05FIikgPT0gMCkKKwkJCSpzeW5jX2lkeCA9IE5PTkVfSURYOworCQkgICAgZWxzZQorCQkgICAgeworCQkJc3luX2lkID0gc3luX25hbWUyaWQoZ25hbWUpOworCQkJZm9yIChpID0gY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47IC0taSA+PSAwOyApCisJCQkgICAgaWYgKFNZTl9JVEVNUyhjdXJidWYpW2ldLnNwX3N5bi5pZCA9PSBzeW5faWQKKwkJCQkmJiBTWU5fSVRFTVMoY3VyYnVmKVtpXS5zcF90eXBlID09IFNQVFlQRV9TVEFSVCkKKwkJCSAgICB7CisJCQkJKnN5bmNfaWR4ID0gaTsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQlpZiAoaSA8IDApCisJCQl7CisJCQkgICAgRU1TRzIoXygiRTM5NDogRGlkbid0IGZpbmQgcmVnaW9uIGl0ZW0gZm9yICVzIiksIGduYW1lKTsKKwkJCSAgICB2aW1fZnJlZShnbmFtZSk7CisJCQkgICAgcmV0dXJuIE5VTEw7CisJCQl9CisJCSAgICB9CisKKwkJICAgIHZpbV9mcmVlKGduYW1lKTsKKwkJICAgIGFyZyA9IHNraXB3aGl0ZShhcmcpOworCQl9CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWVsc2UgaWYgKGZsYWd0YWJbZmlkeF0udmFsID09IEhMX0ZPTEQKKwkJCQkJCSYmIGZvbGRtZXRob2RJc1N5bnRheChjdXJ3aW4pKQorCQl7CisJCSAgICAvKiBOZWVkIHRvIHVwZGF0ZSBmb2xkcyBsYXRlci4gKi8KKwkJICAgIGZvbGRVcGRhdGVBbGwoY3Vyd2luKTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCSAgICB9CisJfQorCWlmIChmaWR4ID49IDApCisJICAgIGNvbnRpbnVlOworCisJaWYgKGxsZW4gPT0gOCAmJiBTVFJOQ01QKGxvd25hbWUsICJjb250YWlucyIsIDgpID09IDAKKwkJJiYgKHZpbV9pc3doaXRlKGFyZ1s4XSkgfHwgYXJnWzhdID09ICc9JykpCisJeworCSAgICBpZiAoY29udF9saXN0ID09IE5VTEwpCisJICAgIHsKKwkJRU1TRyhfKCJFMzk1OiBjb250YWlucyBhcmd1bWVudCBub3QgYWNjZXB0ZWQgaGVyZSIpKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgICAgaWYgKGdldF9pZF9saXN0KCZhcmcsIDgsIGNvbnRfbGlzdCkgPT0gRkFJTCkKKwkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UgaWYgKGxsZW4gPT0gMTEgJiYgU1RSTkNNUChsb3duYW1lLCAiY29udGFpbmVkaW4iLCAxMSkgPT0gMAorCQkmJiAodmltX2lzd2hpdGUoYXJnWzExXSkgfHwgYXJnWzExXSA9PSAnPScpKQorCXsKKwkgICAgaWYgKGNvbnRfaW5fbGlzdCA9PSBOVUxMKQorCSAgICB7CisJCUVNU0coXygiRTM5NjogY29udGFpbmVkaW4gYXJndW1lbnQgbm90IGFjY2VwdGVkIGhlcmUiKSk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIGlmIChnZXRfaWRfbGlzdCgmYXJnLCAxMSwgY29udF9pbl9saXN0KSA9PSBGQUlMKQorCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZSBpZiAobGxlbiA9PSA5ICYmIFNUUk5DTVAobG93bmFtZSwgIm5leHRncm91cCIsIDkpID09IDAKKwkJJiYgKHZpbV9pc3doaXRlKGFyZ1s5XSkgfHwgYXJnWzldID09ICc9JykpCisJeworCSAgICBpZiAoZ2V0X2lkX2xpc3QoJmFyZywgOSwgbmV4dF9saXN0KSA9PSBGQUlMKQorCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAqZmxhZ3NwID0gZmxhZ3M7CisKKyAgICByZXR1cm4gYXJnOworfQorCisvKgorICogQWRqdXN0bWVudHMgdG8gc3ludGF4IGl0ZW0gd2hlbiBkZWNsYXJlZCBpbiBhICI6c3luIGluY2x1ZGUiJ2QgZmlsZS4KKyAqIFNldCB0aGUgY29udGFpbmVkIGZsYWcsIGFuZCBpZiB0aGUgaXRlbSBpcyBub3QgYWxyZWFkeSBjb250YWluZWQsIGFkZCBpdAorICogdG8gdGhlIHNwZWNpZmllZCB0b3AtbGV2ZWwgZ3JvdXAsIGlmIGFueS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5faW5jbF90b3BsZXZlbChpZCwgZmxhZ3NwKQorICAgIGludAkJaWQ7CisgICAgaW50CQkqZmxhZ3NwOworeworICAgIGlmICgoKmZsYWdzcCAmIEhMX0NPTlRBSU5FRCkgfHwgY3VyYnVmLT5iX3N5bl90b3BncnAgPT0gMCkKKwlyZXR1cm47CisgICAgKmZsYWdzcCB8PSBITF9DT05UQUlORUQ7CisgICAgaWYgKGN1cmJ1Zi0+Yl9zeW5fdG9wZ3JwID49IFNZTklEX0NMVVNURVIpCisgICAgeworCS8qIFdlIGhhdmUgdG8gYWxsb2MgdGhpcywgYmVjYXVzZSBzeW5fY29tYmluZV9saXN0KCkgd2lsbCBmcmVlIGl0LiAqLworCXNob3J0CSAgICAqZ3JwX2xpc3QgPSAoc2hvcnQgKilhbGxvYygodW5zaWduZWQpKDIgKiBzaXplb2Yoc2hvcnQpKSk7CisJaW50CSAgICB0bGdfaWQgPSBjdXJidWYtPmJfc3luX3RvcGdycCAtIFNZTklEX0NMVVNURVI7CisKKwlpZiAoZ3JwX2xpc3QgIT0gTlVMTCkKKwl7CisJICAgIGdycF9saXN0WzBdID0gaWQ7CisJICAgIGdycF9saXN0WzFdID0gMDsKKwkgICAgc3luX2NvbWJpbmVfbGlzdCgmU1lOX0NMU1RSKGN1cmJ1ZilbdGxnX2lkXS5zY2xfbGlzdCwgJmdycF9saXN0LAorCQkJIENMVVNURVJfQUREKTsKKwl9CisgICAgfQorfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IGluY2x1ZGUgW0B7Z3JvdXAtbmFtZX1dIGZpbGVuYW1lIiBjb21tYW5kLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2luY2x1ZGUoZWFwLCBzeW5jaW5nKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXN5bmNpbmc7CSAgICAvKiBub3QgdXNlZCAqLworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgaW50CQlzZ2xfaWQgPSAxOworICAgIGNoYXJfdQkqZ3JvdXBfbmFtZV9lbmQ7CisgICAgY2hhcl91CSpyZXN0OworICAgIGNoYXJfdQkqZXJyb3Jtc2cgPSBOVUxMOworICAgIGludAkJcHJldl90b3BsdmxfZ3JwOworICAgIGludAkJcHJldl9zeW5faW5jX3RhZzsKKyAgICBpbnQJCXNvdXJjZSA9IEZBTFNFOworCisgICAgZWFwLT5uZXh0Y21kID0gZmluZF9uZXh0Y21kKGFyZyk7CisgICAgaWYgKGVhcC0+c2tpcCkKKwlyZXR1cm47CisKKyAgICBpZiAoYXJnWzBdID09ICdAJykKKyAgICB7CisJKythcmc7CisJcmVzdCA9IGdldF9ncm91cF9uYW1lKGFyZywgJmdyb3VwX25hbWVfZW5kKTsKKwlpZiAocmVzdCA9PSBOVUxMKQorCXsKKwkgICAgRU1TRygoY2hhcl91ICopXygiRTM5NzogRmlsZW5hbWUgcmVxdWlyZWQiKSk7CisJICAgIHJldHVybjsKKwl9CisJc2dsX2lkID0gc3luX2NoZWNrX2NsdXN0ZXIoYXJnLCAoaW50KShncm91cF9uYW1lX2VuZCAtIGFyZykpOworCS8qIHNlcGFyYXRlX25leHRjbWQoKSBhbmQgZXhwYW5kX2ZpbGVuYW1lKCkgZGVwZW5kIG9uIHRoaXMgKi8KKwllYXAtPmFyZyA9IHJlc3Q7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFdmVyeXRoaW5nIHRoYXQncyBsZWZ0LCB1cCB0byB0aGUgbmV4dCBjb21tYW5kLCBzaG91bGQgYmUgdGhlCisgICAgICogZmlsZW5hbWUgdG8gaW5jbHVkZS4KKyAgICAgKi8KKyAgICBlYXAtPmFyZ3QgfD0gKFhGSUxFIHwgTk9TUEMpOworICAgIHNlcGFyYXRlX25leHRjbWQoZWFwKTsKKyAgICBpZiAoKmVhcC0+YXJnID09ICc8JyB8fCAqZWFwLT5hcmcgPT0gJyQnIHx8IG1jaF9pc0Z1bGxOYW1lKGVhcC0+YXJnKSkKKyAgICB7CisJLyogRm9yIGFuIGFic29sdXRlIHBhdGgsICIkVklNLy4uLiIgb3IgIjxzZmlsZT4uLiIgd2UgIjpzb3VyY2UiIHRoZQorCSAqIGZpbGUuICBOZWVkIHRvIGV4cGFuZCB0aGUgZmlsZSBuYW1lIGZpcnN0LiAgSW4gb3RoZXIgY2FzZXMKKwkgKiAiOnJ1bnRpbWUhIiBpcyB1c2VkLiAqLworCXNvdXJjZSA9IFRSVUU7CisJaWYgKGV4cGFuZF9maWxlbmFtZShlYXAsIHN5bl9jbWRsaW5lcCwgJmVycm9ybXNnKSA9PSBGQUlMKQorCXsKKwkgICAgaWYgKGVycm9ybXNnICE9IE5VTEwpCisJCUVNU0coZXJyb3Jtc2cpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBhbmQgcmVzdG9yZSB0aGUgZXhpc3RpbmcgdG9wLWxldmVsIGdyb3VwbGlzdCBpZCBhbmQgIjpzeW4KKyAgICAgKiBpbmNsdWRlIiB0YWcgYXJvdW5kIHRoZSBhY3R1YWwgaW5jbHVzaW9uLgorICAgICAqLworICAgIHByZXZfc3luX2luY190YWcgPSBjdXJyZW50X3N5bl9pbmNfdGFnOworICAgIGN1cnJlbnRfc3luX2luY190YWcgPSArK3J1bm5pbmdfc3luX2luY190YWc7CisgICAgcHJldl90b3BsdmxfZ3JwID0gY3VyYnVmLT5iX3N5bl90b3BncnA7CisgICAgY3VyYnVmLT5iX3N5bl90b3BncnAgPSBzZ2xfaWQ7CisgICAgaWYgKHNvdXJjZSA/IGRvX3NvdXJjZShlYXAtPmFyZywgRkFMU0UsIEZBTFNFKSA9PSBGQUlMCisJCQkJCTogY21kX3J1bnRpbWUoZWFwLT5hcmcsIFRSVUUpID09IEZBSUwpCisJRU1TRzIoXyhlX25vdG9wZW4pLCBlYXAtPmFyZyk7CisgICAgY3VyYnVmLT5iX3N5bl90b3BncnAgPSBwcmV2X3RvcGx2bF9ncnA7CisgICAgY3VycmVudF9zeW5faW5jX3RhZyA9IHByZXZfc3luX2luY190YWc7Cit9CisKKy8qCisgKiBIYW5kbGUgIjpzeW50YXgga2V5d29yZCB7Z3JvdXAtbmFtZX0gW3tvcHRpb259XSBrZXl3b3JkIC4uIiBjb21tYW5kLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2tleXdvcmQoZWFwLCBzeW5jaW5nKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXN5bmNpbmc7CSAgICAvKiBub3QgdXNlZCAqLworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSpncm91cF9uYW1lX2VuZDsKKyAgICBpbnQJCXN5bl9pZDsKKyAgICBjaGFyX3UJKnJlc3Q7CisgICAgY2hhcl91CSprZXl3b3JkX2NvcHk7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqZmlyc3RfYXJnOworICAgIGludAkJcm91bmQ7CisgICAgaW50CQlmbGFncyA9IDA7CisgICAgc2hvcnQJKm5leHRfbGlzdCA9IE5VTEw7CisgICAgc2hvcnQJKmNvbnRfaW5fbGlzdCA9IE5VTEw7CisKKyAgICByZXN0ID0gZ2V0X2dyb3VwX25hbWUoYXJnLCAmZ3JvdXBfbmFtZV9lbmQpOworCisgICAgaWYgKHJlc3QgIT0gTlVMTCkKKyAgICB7CisJc3luX2lkID0gc3luX2NoZWNrX2dyb3VwKGFyZywgKGludCkoZ3JvdXBfbmFtZV9lbmQgLSBhcmcpKTsKKworCS8qIGFsbG9jYXRlIGEgYnVmZmVyLCBmb3IgcmVtb3ZpbmcgdGhlIGJhY2tzbGFzaGVzIGluIHRoZSBrZXl3b3JkICovCisJa2V5d29yZF9jb3B5ID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTihyZXN0KSArIDEpOworCWlmIChrZXl3b3JkX2NvcHkgIT0gTlVMTCkKKwl7CisJICAgIC8qCisJICAgICAqIFRoZSBvcHRpb25zIGdpdmVuIGFwcGx5IHRvIEFMTCBrZXl3b3Jkcywgc28gYWxsIG9wdGlvbnMgbXVzdCBiZQorCSAgICAgKiBmb3VuZCBiZWZvcmUga2V5d29yZHMgY2FuIGJlIGNyZWF0ZWQuCisJICAgICAqIHJvdW5kIDE6IGNvbGxlY3QgdGhlIG9wdGlvbnMuCisJICAgICAqIHJvdW5kIDI6IGNyZWF0ZSB0aGUga2V5d29yZHMuCisJICAgICAqLworCSAgICBmaXJzdF9hcmcgPSByZXN0OworCSAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKwkgICAgeworCQkvKgorCQkgKiBJc29sYXRlIGVhY2gga2V5d29yZCBhbmQgYWRkIGFuIGVudHJ5IGZvciBpdC4KKwkJICovCisJCWZvciAocmVzdCA9IGZpcnN0X2FyZzsgcmVzdCAhPSBOVUxMICYmICFlbmRzX2V4Y21kKCpyZXN0KTsKKwkJCQkJCSAgICAgICByZXN0ID0gc2tpcHdoaXRlKHJlc3QpKQorCQl7CisJCSAgICByZXN0ID0gZ2V0X3N5bl9vcHRpb25zKHJlc3QsICZmbGFncywgVFJVRSwgTlVMTCwKKwkJCQkJICAgICBOVUxMLCAmY29udF9pbl9saXN0LCAmbmV4dF9saXN0KTsKKwkJICAgIGlmIChyZXN0ID09IE5VTEwgfHwgZW5kc19leGNtZCgqcmVzdCkpCisJCQlicmVhazsKKwkJICAgIHAgPSBrZXl3b3JkX2NvcHk7CisJCSAgICB3aGlsZSAoKnJlc3QgIT0gMCAmJiAhdmltX2lzd2hpdGUoKnJlc3QpKQorCQkgICAgeworCQkJaWYgKCpyZXN0ID09ICdcXCcgJiYgcmVzdFsxXSAhPSBOVUwpCisJCQkgICAgKytyZXN0OworCQkJKnArKyA9ICpyZXN0Kys7CisJCSAgICB9CisJCSAgICAqcCA9IE5VTDsKKwkJICAgIGlmIChyb3VuZCA9PSAyICYmICFlYXAtPnNraXApCisJCSAgICB7CisJCQlmb3IgKHAgPSB2aW1fc3RyY2hyKGtleXdvcmRfY29weSwgJ1snKTsgOyApCisJCQl7CisJCQkgICAgaWYgKHAgIT0gTlVMTCkKKwkJCQkqcCA9IE5VTDsKKwkJCSAgICBhZGRfa2V5d29yZChrZXl3b3JkX2NvcHksIHN5bl9pZCwgZmxhZ3MsCisJCQkJCQkgICAgIGNvbnRfaW5fbGlzdCwgbmV4dF9saXN0KTsKKwkJCSAgICBpZiAocCA9PSBOVUxMIHx8IHBbMV0gPT0gTlVMIHx8IHBbMV0gPT0gJ10nKQorCQkJCWJyZWFrOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJICAgIHsKKwkJCQlpbnQgbCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCArIDEpOworCisJCQkJbWNoX21lbW1vdmUocCwgcCArIDEsIGwpOworCQkJCXAgKz0gbDsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorI2VuZGlmCisJCQkgICAgeworCQkJCXBbMF0gPSBwWzFdOworCQkJCSsrcDsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkJaWYgKHJvdW5kID09IDEpCisJCSAgICBzeW5faW5jbF90b3BsZXZlbChzeW5faWQsICZmbGFncyk7CisJICAgIH0KKwkgICAgdmltX2ZyZWUoa2V5d29yZF9jb3B5KTsKKwl9CisgICAgfQorCisgICAgaWYgKHJlc3QgIT0gTlVMTCkKKwllYXAtPm5leHRjbWQgPSBjaGVja19uZXh0Y21kKHJlc3QpOworICAgIGVsc2UKKwlFTVNHMihfKGVfaW52YXJnMiksIGFyZyk7CisKKyAgICB2aW1fZnJlZShjb250X2luX2xpc3QpOworICAgIHZpbV9mcmVlKG5leHRfbGlzdCk7CisgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihOT1RfVkFMSUQpOworICAgIHN5bl9zdGFja19mcmVlX2FsbChjdXJidWYpOwkJLyogTmVlZCB0byByZWNvbXB1dGUgYWxsIHN5bnRheC4gKi8KK30KKworLyoKKyAqIEhhbmRsZSAiOnN5bnRheCBtYXRjaCB7bmFtZX0gW3tvcHRpb25zfV0ge3BhdHRlcm59IFt7b3B0aW9uc31dIi4KKyAqCisgKiBBbHNvICI6c3ludGF4IHN5bmMgbWF0Y2gge25hbWV9IFtbZ3JvdXBoZXJlIHwgZ3JvdXB0aGVyZV0ge2dyb3VwLW5hbWV9XSAuLiIKKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX21hdGNoKGVhcCwgc3luY2luZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzeW5jaW5nOwkgICAgLyogVFJVRSBmb3IgIjpzeW50YXggc3luYyBtYXRjaCAuLiAiICovCit7CisgICAgY2hhcl91CSphcmcgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKmdyb3VwX25hbWVfZW5kOworICAgIGNoYXJfdQkqcmVzdDsKKyAgICBzeW5wYXRfVAlpdGVtOwkJLyogdGhlIGl0ZW0gZm91bmQgaW4gdGhlIGxpbmUgKi8KKyAgICBpbnQJCXN5bl9pZDsKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCWZsYWdzID0gMDsKKyAgICBpbnQJCXN5bmNfaWR4ID0gMDsKKyAgICBzaG9ydAkqY29udF9saXN0ID0gTlVMTDsKKyAgICBzaG9ydAkqY29udF9pbl9saXN0ID0gTlVMTDsKKyAgICBzaG9ydAkqbmV4dF9saXN0ID0gTlVMTDsKKworICAgIC8qIElzb2xhdGUgdGhlIGdyb3VwIG5hbWUsIGNoZWNrIGZvciB2YWxpZGl0eSAqLworICAgIHJlc3QgPSBnZXRfZ3JvdXBfbmFtZShhcmcsICZncm91cF9uYW1lX2VuZCk7CisKKyAgICAvKiBHZXQgb3B0aW9ucyBiZWZvcmUgdGhlIHBhdHRlcm4gKi8KKyAgICByZXN0ID0gZ2V0X3N5bl9vcHRpb25zKHJlc3QsICZmbGFncywgRkFMU0UsCisJICAgc3luY2luZyA/ICZzeW5jX2lkeCA6IE5VTEwsICZjb250X2xpc3QsICZjb250X2luX2xpc3QsICZuZXh0X2xpc3QpOworCisgICAgLyogZ2V0IHRoZSBwYXR0ZXJuLiAqLworICAgIGluaXRfc3luX3BhdHRlcm5zKCk7CisgICAgdmltX21lbXNldCgmaXRlbSwgMCwgc2l6ZW9mKGl0ZW0pKTsKKyAgICByZXN0ID0gZ2V0X3N5bl9wYXR0ZXJuKHJlc3QsICZpdGVtKTsKKyAgICBpZiAodmltX3JlZ2NvbXBfaGFkX2VvbCgpICYmICEoZmxhZ3MgJiBITF9FWENMVURFTkwpKQorCWZsYWdzIHw9IEhMX0hBU19FT0w7CisKKyAgICAvKiBHZXQgb3B0aW9ucyBhZnRlciB0aGUgcGF0dGVybiAqLworICAgIHJlc3QgPSBnZXRfc3luX29wdGlvbnMocmVzdCwgJmZsYWdzLCBGQUxTRSwKKwkgICBzeW5jaW5nID8gJnN5bmNfaWR4IDogTlVMTCwgJmNvbnRfbGlzdCwgJmNvbnRfaW5fbGlzdCwgJm5leHRfbGlzdCk7CisKKyAgICBpZiAocmVzdCAhPSBOVUxMKQkJLyogYWxsIGFyZ3VtZW50cyBhcmUgdmFsaWQgKi8KKyAgICB7CisJLyoKKwkgKiBDaGVjayBmb3IgdHJhaWxpbmcgY29tbWFuZCBhbmQgaWxsZWdhbCB0cmFpbGluZyBhcmd1bWVudHMuCisJICovCisJZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChyZXN0KTsKKwlpZiAoIWVuZHNfZXhjbWQoKnJlc3QpIHx8IGVhcC0+c2tpcCkKKwkgICAgcmVzdCA9IE5VTEw7CisJZWxzZSBpZiAoZ2FfZ3JvdygmY3VyYnVmLT5iX3N5bl9wYXR0ZXJucywgMSkgIT0gRkFJTAorCQkmJiAoc3luX2lkID0gc3luX2NoZWNrX2dyb3VwKGFyZywKKwkJCQkJICAgKGludCkoZ3JvdXBfbmFtZV9lbmQgLSBhcmcpKSkgIT0gMCkKKwl7CisJICAgIHN5bl9pbmNsX3RvcGxldmVsKHN5bl9pZCwgJmZsYWdzKTsKKwkgICAgLyoKKwkgICAgICogU3RvcmUgdGhlIHBhdHRlcm4gaW4gdGhlIHN5bl9pdGVtcyBsaXN0CisJICAgICAqLworCSAgICBpZHggPSBjdXJidWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbjsKKwkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XSA9IGl0ZW07CisJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luY2luZyA9IHN5bmNpbmc7CisJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3BfdHlwZSA9IFNQVFlQRV9NQVRDSDsKKwkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9zeW4uaWQgPSBzeW5faWQ7CisJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luLmluY190YWcgPSBjdXJyZW50X3N5bl9pbmNfdGFnOworCSAgICBTWU5fSVRFTVMoY3VyYnVmKVtpZHhdLnNwX2ZsYWdzID0gZmxhZ3M7CisJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luY19pZHggPSBzeW5jX2lkeDsKKwkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9jb250X2xpc3QgPSBjb250X2xpc3Q7CisJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luLmNvbnRfaW5fbGlzdCA9IGNvbnRfaW5fbGlzdDsKKwkgICAgaWYgKGNvbnRfaW5fbGlzdCAhPSBOVUxMKQorCQljdXJidWYtPmJfc3luX2NvbnRhaW5lZGluID0gVFJVRTsKKwkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9uZXh0X2xpc3QgPSBuZXh0X2xpc3Q7CisJICAgICsrY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9sZW47CisJICAgIC0tY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9yb29tOworCisJICAgIC8qIHJlbWVtYmVyIHRoYXQgd2UgZm91bmQgYSBtYXRjaCBmb3Igc3luY2luZyBvbiAqLworCSAgICBpZiAoZmxhZ3MgJiAoSExfU1lOQ19IRVJFfEhMX1NZTkNfVEhFUkUpKQorCQljdXJidWYtPmJfc3luX3N5bmNfZmxhZ3MgfD0gU0ZfTUFUQ0g7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJICAgIGlmIChmbGFncyAmIEhMX0ZPTEQpCisJCSsrY3VyYnVmLT5iX3N5bl9mb2xkaXRlbXM7CisjZW5kaWYKKworCSAgICByZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisJICAgIHN5bl9zdGFja19mcmVlX2FsbChjdXJidWYpOwkvKiBOZWVkIHRvIHJlY29tcHV0ZSBhbGwgc3ludGF4LiAqLworCSAgICByZXR1cm47CS8qIGRvbid0IGZyZWUgdGhlIHByb2dzIGFuZCBwYXR0ZXJucyBub3cgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTb21ldGhpbmcgZmFpbGVkLCBmcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICAgICAqLworICAgIHZpbV9mcmVlKGl0ZW0uc3BfcHJvZyk7CisgICAgdmltX2ZyZWUoaXRlbS5zcF9wYXR0ZXJuKTsKKyAgICB2aW1fZnJlZShjb250X2xpc3QpOworICAgIHZpbV9mcmVlKGNvbnRfaW5fbGlzdCk7CisgICAgdmltX2ZyZWUobmV4dF9saXN0KTsKKworICAgIGlmIChyZXN0ID09IE5VTEwpCisJRU1TRzIoXyhlX2ludmFyZzIpLCBhcmcpOworfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IHJlZ2lvbiB7Z3JvdXAtbmFtZX0gW21hdGNoZ3JvdXA9e2dyb3VwLW5hbWV9XQorICoJCXN0YXJ0IHtzdGFydH0gLi4gW3NraXAge3NraXB9XSBlbmQge2VuZH0gLi4gW3tvcHRpb25zfV0iLgorICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9jbWRfcmVnaW9uKGVhcCwgc3luY2luZykKKyAgICBleGFyZ19UCSplYXA7CisgICAgaW50CQlzeW5jaW5nOwkgICAgLyogVFJVRSBmb3IgIjpzeW50YXggc3luYyByZWdpb24gLi4iICovCit7CisgICAgY2hhcl91CQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CQkqZ3JvdXBfbmFtZV9lbmQ7CisgICAgY2hhcl91CQkqcmVzdDsJCQkvKiBuZXh0IGFyZywgTlVMTCBvbiBlcnJvciAqLworICAgIGNoYXJfdQkJKmtleV9lbmQ7CisgICAgY2hhcl91CQkqa2V5ID0gTlVMTDsKKyAgICBjaGFyX3UJCSpwOworICAgIGludAkJCWl0ZW07CisjZGVmaW5lIElURU1fU1RBUlQJICAgIDAKKyNkZWZpbmUgSVRFTV9TS0lQCSAgICAxCisjZGVmaW5lIElURU1fRU5ECSAgICAyCisjZGVmaW5lIElURU1fTUFUQ0hHUk9VUAkgICAgMworICAgIHN0cnVjdCBwYXRfcHRyCisgICAgeworCXN5bnBhdF9UCSpwcF9zeW5wOwkJLyogcG9pbnRlciB0byBzeW5fcGF0dGVybiAqLworCWludAkJcHBfbWF0Y2hncm91cF9pZDsJLyogbWF0Y2hncm91cCBJRCAqLworCXN0cnVjdCBwYXRfcHRyCSpwcF9uZXh0OwkJLyogcG9pbnRlciB0byBuZXh0IHBhdF9wdHIgKi8KKyAgICB9CQkJKihwYXRfcHRyc1szXSk7CisJCQkJCS8qIHBhdHRlcm5zIGZvdW5kIGluIHRoZSBsaW5lICovCisgICAgc3RydWN0IHBhdF9wdHIJKnBwcDsKKyAgICBzdHJ1Y3QgcGF0X3B0cgkqcHBwX25leHQ7CisgICAgaW50CQkJcGF0X2NvdW50ID0gMDsJCS8qIG5yIG9mIHN5bl9wYXR0ZXJucyBmb3VuZCAqLworICAgIGludAkJCXN5bl9pZDsKKyAgICBpbnQJCQltYXRjaGdyb3VwX2lkID0gMDsKKyAgICBpbnQJCQlub3RfZW5vdWdoID0gRkFMU0U7CS8qIG5vdCBlbm91Z2ggYXJndW1lbnRzICovCisgICAgaW50CQkJaWxsZWdhbCA9IEZBTFNFOwkvKiBpbGxlZ2FsIGFyZ3VtZW50cyAqLworICAgIGludAkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyAgICBpbnQJCQlpZHg7CisgICAgaW50CQkJZmxhZ3MgPSAwOworICAgIHNob3J0CQkqY29udF9saXN0ID0gTlVMTDsKKyAgICBzaG9ydAkJKmNvbnRfaW5fbGlzdCA9IE5VTEw7CisgICAgc2hvcnQJCSpuZXh0X2xpc3QgPSBOVUxMOworCisgICAgLyogSXNvbGF0ZSB0aGUgZ3JvdXAgbmFtZSwgY2hlY2sgZm9yIHZhbGlkaXR5ICovCisgICAgcmVzdCA9IGdldF9ncm91cF9uYW1lKGFyZywgJmdyb3VwX25hbWVfZW5kKTsKKworICAgIHBhdF9wdHJzWzBdID0gTlVMTDsKKyAgICBwYXRfcHRyc1sxXSA9IE5VTEw7CisgICAgcGF0X3B0cnNbMl0gPSBOVUxMOworCisgICAgaW5pdF9zeW5fcGF0dGVybnMoKTsKKworICAgIC8qCisgICAgICogZ2V0IHRoZSBvcHRpb25zLCBwYXR0ZXJucyBhbmQgbWF0Y2hncm91cC4KKyAgICAgKi8KKyAgICB3aGlsZSAocmVzdCAhPSBOVUxMICYmICFlbmRzX2V4Y21kKCpyZXN0KSkKKyAgICB7CisJLyogQ2hlY2sgZm9yIG9wdGlvbiBhcmd1bWVudHMgKi8KKwlyZXN0ID0gZ2V0X3N5bl9vcHRpb25zKHJlc3QsICZmbGFncywgRkFMU0UsIE5VTEwsCisJCQkJICAgICAgICZjb250X2xpc3QsICZjb250X2luX2xpc3QsICZuZXh0X2xpc3QpOworCWlmIChyZXN0ID09IE5VTEwgfHwgZW5kc19leGNtZCgqcmVzdCkpCisJICAgIGJyZWFrOworCisJLyogbXVzdCBiZSBhIHBhdHRlcm4gb3IgbWF0Y2hncm91cCB0aGVuICovCisJa2V5X2VuZCA9IHJlc3Q7CisJd2hpbGUgKCprZXlfZW5kICYmICF2aW1faXN3aGl0ZSgqa2V5X2VuZCkgJiYgKmtleV9lbmQgIT0gJz0nKQorCSAgICArK2tleV9lbmQ7CisJdmltX2ZyZWUoa2V5KTsKKwlrZXkgPSB2aW1fc3RybnNhdmVfdXAocmVzdCwgKGludCkoa2V5X2VuZCAtIHJlc3QpKTsKKwlpZiAoa2V5ID09IE5VTEwpCQkJLyogb3V0IG9mIG1lbW9yeSAqLworCXsKKwkgICAgcmVzdCA9IE5VTEw7CisJICAgIGJyZWFrOworCX0KKwlpZiAoU1RSQ01QKGtleSwgIk1BVENIR1JPVVAiKSA9PSAwKQorCSAgICBpdGVtID0gSVRFTV9NQVRDSEdST1VQOworCWVsc2UgaWYgKFNUUkNNUChrZXksICJTVEFSVCIpID09IDApCisJICAgIGl0ZW0gPSBJVEVNX1NUQVJUOworCWVsc2UgaWYgKFNUUkNNUChrZXksICJFTkQiKSA9PSAwKQorCSAgICBpdGVtID0gSVRFTV9FTkQ7CisJZWxzZSBpZiAoU1RSQ01QKGtleSwgIlNLSVAiKSA9PSAwKQorCXsKKwkgICAgaWYgKHBhdF9wdHJzW0lURU1fU0tJUF0gIT0gTlVMTCkJLyogb25lIHNraXAgcGF0dGVybiBhbGxvd2VkICovCisJICAgIHsKKwkJaWxsZWdhbCA9IFRSVUU7CisJCWJyZWFrOworCSAgICB9CisJICAgIGl0ZW0gPSBJVEVNX1NLSVA7CisJfQorCWVsc2UKKwkgICAgYnJlYWs7CisJcmVzdCA9IHNraXB3aGl0ZShrZXlfZW5kKTsKKwlpZiAoKnJlc3QgIT0gJz0nKQorCXsKKwkgICAgcmVzdCA9IE5VTEw7CisJICAgIEVNU0cyKF8oIkUzOTg6IE1pc3NpbmcgJz0nOiAlcyIpLCBhcmcpOworCSAgICBicmVhazsKKwl9CisJcmVzdCA9IHNraXB3aGl0ZShyZXN0ICsgMSk7CisJaWYgKCpyZXN0ID09IE5VTCkKKwl7CisJICAgIG5vdF9lbm91Z2ggPSBUUlVFOworCSAgICBicmVhazsKKwl9CisKKwlpZiAoaXRlbSA9PSBJVEVNX01BVENIR1JPVVApCisJeworCSAgICBwID0gc2tpcHRvd2hpdGUocmVzdCk7CisJICAgIGlmICgocCAtIHJlc3QgPT0gNCAmJiBTVFJOQ01QKHJlc3QsICJOT05FIiwgNCkgPT0gMCkgfHwgZWFwLT5za2lwKQorCQltYXRjaGdyb3VwX2lkID0gMDsKKwkgICAgZWxzZQorCSAgICB7CisJCW1hdGNoZ3JvdXBfaWQgPSBzeW5fY2hlY2tfZ3JvdXAocmVzdCwgKGludCkocCAtIHJlc3QpKTsKKwkJaWYgKG1hdGNoZ3JvdXBfaWQgPT0gMCkKKwkJeworCQkgICAgaWxsZWdhbCA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIHJlc3QgPSBza2lwd2hpdGUocCk7CisJfQorCWVsc2UKKwl7CisJICAgIC8qCisJICAgICAqIEFsbG9jYXRlIHJvb20gZm9yIGEgc3luX3BhdHRlcm4sIGFuZCBsaW5rIGl0IGluIHRoZSBsaXN0IG9mCisJICAgICAqIHN5bl9wYXR0ZXJucyBmb3IgdGhpcyBpdGVtLCBhdCB0aGUgc3RhcnQgKGJlY2F1c2UgdGhlIGxpc3QgaXMKKwkgICAgICogdXNlZCBmcm9tIGVuZCB0byBzdGFydCkuCisJICAgICAqLworCSAgICBwcHAgPSAoc3RydWN0IHBhdF9wdHIgKilhbGxvYygodW5zaWduZWQpc2l6ZW9mKHN0cnVjdCBwYXRfcHRyKSk7CisJICAgIGlmIChwcHAgPT0gTlVMTCkKKwkgICAgeworCQlyZXN0ID0gTlVMTDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgcHBwLT5wcF9uZXh0ID0gcGF0X3B0cnNbaXRlbV07CisJICAgIHBhdF9wdHJzW2l0ZW1dID0gcHBwOworCSAgICBwcHAtPnBwX3N5bnAgPSAoc3lucGF0X1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKHN5bnBhdF9UKSk7CisJICAgIGlmIChwcHAtPnBwX3N5bnAgPT0gTlVMTCkKKwkgICAgeworCQlyZXN0ID0gTlVMTDsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBHZXQgdGhlIHN5bnRheCBwYXR0ZXJuIGFuZCB0aGUgZm9sbG93aW5nIG9mZnNldChzKS4KKwkgICAgICovCisJICAgIC8qIEVuYWJsZSB0aGUgYXBwcm9wcmlhdGUgXHogc3BlY2lhbHMuICovCisJICAgIGlmIChpdGVtID09IElURU1fU1RBUlQpCisJCXJlZ19kb19leHRtYXRjaCA9IFJFWF9TRVQ7CisJICAgIGVsc2UgaWYgKGl0ZW0gPT0gSVRFTV9TS0lQIHx8IGl0ZW0gPT0gSVRFTV9FTkQpCisJCXJlZ19kb19leHRtYXRjaCA9IFJFWF9VU0U7CisJICAgIHJlc3QgPSBnZXRfc3luX3BhdHRlcm4ocmVzdCwgcHBwLT5wcF9zeW5wKTsKKwkgICAgcmVnX2RvX2V4dG1hdGNoID0gMDsKKwkgICAgaWYgKGl0ZW0gPT0gSVRFTV9FTkQgJiYgdmltX3JlZ2NvbXBfaGFkX2VvbCgpCisJCQkJCQkgICAmJiAhKGZsYWdzICYgSExfRVhDTFVERU5MKSkKKwkJcHBwLT5wcF9zeW5wLT5zcF9mbGFncyB8PSBITF9IQVNfRU9MOworCSAgICBwcHAtPnBwX21hdGNoZ3JvdXBfaWQgPSBtYXRjaGdyb3VwX2lkOworCSAgICArK3BhdF9jb3VudDsKKwl9CisgICAgfQorICAgIHZpbV9mcmVlKGtleSk7CisgICAgaWYgKGlsbGVnYWwgfHwgbm90X2Vub3VnaCkKKwlyZXN0ID0gTlVMTDsKKworICAgIC8qCisgICAgICogTXVzdCBoYXZlIGEgInN0YXJ0IiBhbmQgImVuZCIgcGF0dGVybi4KKyAgICAgKi8KKyAgICBpZiAocmVzdCAhPSBOVUxMICYmIChwYXRfcHRyc1tJVEVNX1NUQVJUXSA9PSBOVUxMIHx8CisJCQkJCQkgIHBhdF9wdHJzW0lURU1fRU5EXSA9PSBOVUxMKSkKKyAgICB7CisJbm90X2Vub3VnaCA9IFRSVUU7CisJcmVzdCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHJlc3QgIT0gTlVMTCkKKyAgICB7CisJLyoKKwkgKiBDaGVjayBmb3IgdHJhaWxpbmcgZ2FyYmFnZSBvciBjb21tYW5kLgorCSAqIElmIE9LLCBhZGQgdGhlIGl0ZW0uCisJICovCisJZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChyZXN0KTsKKwlpZiAoIWVuZHNfZXhjbWQoKnJlc3QpIHx8IGVhcC0+c2tpcCkKKwkgICAgcmVzdCA9IE5VTEw7CisJZWxzZSBpZiAoZ2FfZ3JvdygmKGN1cmJ1Zi0+Yl9zeW5fcGF0dGVybnMpLCBwYXRfY291bnQpICE9IEZBSUwKKwkJJiYgKHN5bl9pZCA9IHN5bl9jaGVja19ncm91cChhcmcsCisJCQkJCSAgIChpbnQpKGdyb3VwX25hbWVfZW5kIC0gYXJnKSkpICE9IDApCisJeworCSAgICBzeW5faW5jbF90b3BsZXZlbChzeW5faWQsICZmbGFncyk7CisJICAgIC8qCisJICAgICAqIFN0b3JlIHRoZSBzdGFydC9za2lwL2VuZCBpbiB0aGUgc3luX2l0ZW1zIGxpc3QKKwkgICAgICovCisJICAgIGlkeCA9IGN1cmJ1Zi0+Yl9zeW5fcGF0dGVybnMuZ2FfbGVuOworCSAgICBmb3IgKGl0ZW0gPSBJVEVNX1NUQVJUOyBpdGVtIDw9IElURU1fRU5EOyArK2l0ZW0pCisJICAgIHsKKwkJZm9yIChwcHAgPSBwYXRfcHRyc1tpdGVtXTsgcHBwICE9IE5VTEw7IHBwcCA9IHBwcC0+cHBfbmV4dCkKKwkJeworCQkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XSA9ICoocHBwLT5wcF9zeW5wKTsKKwkJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luY2luZyA9IHN5bmNpbmc7CisJCSAgICBTWU5fSVRFTVMoY3VyYnVmKVtpZHhdLnNwX3R5cGUgPQorCQkJICAgIChpdGVtID09IElURU1fU1RBUlQpID8gU1BUWVBFX1NUQVJUIDoKKwkJCSAgICAoaXRlbSA9PSBJVEVNX1NLSVApID8gU1BUWVBFX1NLSVAgOiBTUFRZUEVfRU5EOworCQkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9mbGFncyB8PSBmbGFnczsKKwkJICAgIFNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3Bfc3luLmlkID0gc3luX2lkOworCQkgICAgU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9zeW4uaW5jX3RhZyA9IGN1cnJlbnRfc3luX2luY190YWc7CisJCSAgICBTWU5fSVRFTVMoY3VyYnVmKVtpZHhdLnNwX3N5bl9tYXRjaF9pZCA9CisJCQkJCQkJcHBwLT5wcF9tYXRjaGdyb3VwX2lkOworCQkgICAgaWYgKGl0ZW0gPT0gSVRFTV9TVEFSVCkKKwkJICAgIHsKKwkJCVNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3BfY29udF9saXN0ID0gY29udF9saXN0OworCQkJU1lOX0lURU1TKGN1cmJ1ZilbaWR4XS5zcF9zeW4uY29udF9pbl9saXN0ID0KKwkJCQkJCQkJIGNvbnRfaW5fbGlzdDsKKwkJCWlmIChjb250X2luX2xpc3QgIT0gTlVMTCkKKwkJCSAgICBjdXJidWYtPmJfc3luX2NvbnRhaW5lZGluID0gVFJVRTsKKwkJCVNZTl9JVEVNUyhjdXJidWYpW2lkeF0uc3BfbmV4dF9saXN0ID0gbmV4dF9saXN0OworCQkgICAgfQorCQkgICAgKytjdXJidWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbjsKKwkJICAgIC0tY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9yb29tOworCQkgICAgKytpZHg7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCSAgICBpZiAoZmxhZ3MgJiBITF9GT0xEKQorCQkJKytjdXJidWYtPmJfc3luX2ZvbGRpdGVtczsKKyNlbmRpZgorCQl9CisJICAgIH0KKworCSAgICByZWRyYXdfY3VyYnVmX2xhdGVyKE5PVF9WQUxJRCk7CisJICAgIHN5bl9zdGFja19mcmVlX2FsbChjdXJidWYpOwkvKiBOZWVkIHRvIHJlY29tcHV0ZSBhbGwgc3ludGF4LiAqLworCSAgICBzdWNjZXNzID0gVFJVRTsJICAgIC8qIGRvbid0IGZyZWUgdGhlIHByb2dzIGFuZCBwYXR0ZXJucyBub3cgKi8KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICAgICAqLworICAgIGZvciAoaXRlbSA9IElURU1fU1RBUlQ7IGl0ZW0gPD0gSVRFTV9FTkQ7ICsraXRlbSkKKwlmb3IgKHBwcCA9IHBhdF9wdHJzW2l0ZW1dOyBwcHAgIT0gTlVMTDsgcHBwID0gcHBwX25leHQpCisJeworCSAgICBpZiAoIXN1Y2Nlc3MpCisJICAgIHsKKwkJdmltX2ZyZWUocHBwLT5wcF9zeW5wLT5zcF9wcm9nKTsKKwkJdmltX2ZyZWUocHBwLT5wcF9zeW5wLT5zcF9wYXR0ZXJuKTsKKwkgICAgfQorCSAgICB2aW1fZnJlZShwcHAtPnBwX3N5bnApOworCSAgICBwcHBfbmV4dCA9IHBwcC0+cHBfbmV4dDsKKwkgICAgdmltX2ZyZWUocHBwKTsKKwl9CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgeworCXZpbV9mcmVlKGNvbnRfbGlzdCk7CisJdmltX2ZyZWUoY29udF9pbl9saXN0KTsKKwl2aW1fZnJlZShuZXh0X2xpc3QpOworCWlmIChub3RfZW5vdWdoKQorCSAgICBFTVNHMihfKCJFMzk5OiBOb3QgZW5vdWdoIGFyZ3VtZW50czogc3ludGF4IHJlZ2lvbiAlcyIpLCBhcmcpOworCWVsc2UgaWYgKGlsbGVnYWwgfHwgcmVzdCA9PSBOVUxMKQorCSAgICBFTVNHMihfKGVfaW52YXJnMiksIGFyZyk7CisgICAgfQorfQorCisvKgorICogQSBzaW1wbGUgc3ludGF4IGdyb3VwIElEIGNvbXBhcmlzb24gZnVuY3Rpb24gc3VpdGFibGUgZm9yIHVzZSBpbiBxc29ydCgpCisgKi8KKyAgICBzdGF0aWMgaW50CisjaWZkZWYgX19CT1JMQU5EQ19fCitfUlRMRU5UUllGCisjZW5kaWYKK3N5bl9jb21wYXJlX3N0dWIodjEsIHYyKQorICAgIGNvbnN0IHZvaWQJKnYxOworICAgIGNvbnN0IHZvaWQJKnYyOworeworICAgIGNvbnN0IHNob3J0CSpzMSA9IHYxOworICAgIGNvbnN0IHNob3J0CSpzMiA9IHYyOworCisgICAgcmV0dXJuICgqczEgPiAqczIgPyAxIDogKnMxIDwgKnMyID8gLTEgOiAwKTsKK30KKworLyoKKyAqIENvbWJpbmVzIGxpc3RzIG9mIHN5bnRheCBjbHVzdGVycy4KKyAqICpjbHN0cjEgYW5kICpjbHN0cjIgbXVzdCBib3RoIGJlIGFsbG9jYXRlZCBtZW1vcnk7IHRoZXkgd2lsbCBiZSBjb25zdW1lZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY29tYmluZV9saXN0KGNsc3RyMSwgY2xzdHIyLCBsaXN0X29wKQorICAgIHNob3J0CSoqY2xzdHIxOworICAgIHNob3J0CSoqY2xzdHIyOworICAgIGludAkJbGlzdF9vcDsKK3sKKyAgICBpbnQJCWNvdW50MSA9IDA7CisgICAgaW50CQljb3VudDIgPSAwOworICAgIHNob3J0CSpnMTsKKyAgICBzaG9ydAkqZzI7CisgICAgc2hvcnQJKmNsc3RyID0gTlVMTDsKKyAgICBpbnQJCWNvdW50OworICAgIGludAkJcm91bmQ7CisKKyAgICAvKgorICAgICAqIEhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzLgorICAgICAqLworICAgIGlmICgqY2xzdHIyID09IE5VTEwpCisJcmV0dXJuOworICAgIGlmICgqY2xzdHIxID09IE5VTEwgfHwgbGlzdF9vcCA9PSBDTFVTVEVSX1JFUExBQ0UpCisgICAgeworCWlmIChsaXN0X29wID09IENMVVNURVJfUkVQTEFDRSkKKwkgICAgdmltX2ZyZWUoKmNsc3RyMSk7CisJaWYgKGxpc3Rfb3AgPT0gQ0xVU1RFUl9SRVBMQUNFIHx8IGxpc3Rfb3AgPT0gQ0xVU1RFUl9BREQpCisJICAgICpjbHN0cjEgPSAqY2xzdHIyOworCWVsc2UKKwkgICAgdmltX2ZyZWUoKmNsc3RyMik7CisJcmV0dXJuOworICAgIH0KKworICAgIGZvciAoZzEgPSAqY2xzdHIxOyAqZzE7IGcxKyspCisJKytjb3VudDE7CisgICAgZm9yIChnMiA9ICpjbHN0cjI7ICpnMjsgZzIrKykKKwkrK2NvdW50MjsKKworICAgIC8qCisgICAgICogRm9yIHNwZWVkIHB1cnBvc2VzLCBzb3J0IGJvdGggbGlzdHMuCisgICAgICovCisgICAgcXNvcnQoKmNsc3RyMSwgKHNpemVfdCljb3VudDEsIHNpemVvZihzaG9ydCksIHN5bl9jb21wYXJlX3N0dWIpOworICAgIHFzb3J0KCpjbHN0cjIsIChzaXplX3QpY291bnQyLCBzaXplb2Yoc2hvcnQpLCBzeW5fY29tcGFyZV9zdHViKTsKKworICAgIC8qCisgICAgICogV2UgcHJvY2VlZCBpbiB0d28gcGFzc2VzOyBpbiByb3VuZCAxLCB3ZSBjb3VudCB0aGUgZWxlbWVudHMgdG8gcGxhY2UKKyAgICAgKiBpbiB0aGUgbmV3IGxpc3QsIGFuZCBpbiByb3VuZCAyLCB3ZSBhbGxvY2F0ZSBhbmQgcG9wdWxhdGUgdGhlIG5ldworICAgICAqIGxpc3QuICBGb3Igc3BlZWQsIHdlIHVzZSBhIG1lcmdlc29ydC1saWtlIG1ldGhvZCwgYWRkaW5nIHRoZSBzbWFsbGVyCisgICAgICogb2YgdGhlIGN1cnJlbnQgZWxlbWVudHMgaW4gZWFjaCBsaXN0IHRvIHRoZSBuZXcgbGlzdC4KKyAgICAgKi8KKyAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgcm91bmQrKykKKyAgICB7CisJZzEgPSAqY2xzdHIxOworCWcyID0gKmNsc3RyMjsKKwljb3VudCA9IDA7CisKKwkvKgorCSAqIEZpcnN0LCBsb29wIHRocm91Z2ggdGhlIGxpc3RzIHVudGlsIG9uZSBvZiB0aGVtIGlzIGVtcHR5LgorCSAqLworCXdoaWxlICgqZzEgJiYgKmcyKQorCXsKKwkgICAgLyoKKwkgICAgICogV2UgYWx3YXlzIHdhbnQgdG8gYWRkIGZyb20gdGhlIGZpcnN0IGxpc3QuCisJICAgICAqLworCSAgICBpZiAoKmcxIDwgKmcyKQorCSAgICB7CisJCWlmIChyb3VuZCA9PSAyKQorCQkgICAgY2xzdHJbY291bnRdID0gKmcxOworCQljb3VudCsrOworCQlnMSsrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICAvKgorCSAgICAgKiBXZSBvbmx5IHdhbnQgdG8gYWRkIGZyb20gdGhlIHNlY29uZCBsaXN0IGlmIHdlJ3JlIGFkZGluZyB0aGUKKwkgICAgICogbGlzdHMuCisJICAgICAqLworCSAgICBpZiAobGlzdF9vcCA9PSBDTFVTVEVSX0FERCkKKwkgICAgeworCQlpZiAocm91bmQgPT0gMikKKwkJICAgIGNsc3RyW2NvdW50XSA9ICpnMjsKKwkJY291bnQrKzsKKwkgICAgfQorCSAgICBpZiAoKmcxID09ICpnMikKKwkJZzErKzsKKwkgICAgZzIrKzsKKwl9CisKKwkvKgorCSAqIE5vdyBhZGQgdGhlIGxlZnRvdmVycyBmcm9tIHdoaWNoZXZlciBsaXN0IGRpZG4ndCBnZXQgZmluaXNoZWQKKwkgKiBmaXJzdC4gIEFzIGJlZm9yZSwgd2Ugb25seSB3YW50IHRvIGFkZCBmcm9tIHRoZSBzZWNvbmQgbGlzdCBpZgorCSAqIHdlJ3JlIGFkZGluZyB0aGUgbGlzdHMuCisJICovCisJZm9yICg7ICpnMTsgZzErKywgY291bnQrKykKKwkgICAgaWYgKHJvdW5kID09IDIpCisJCWNsc3RyW2NvdW50XSA9ICpnMTsKKwlpZiAobGlzdF9vcCA9PSBDTFVTVEVSX0FERCkKKwkgICAgZm9yICg7ICpnMjsgZzIrKywgY291bnQrKykKKwkJaWYgKHJvdW5kID09IDIpCisJCSAgICBjbHN0cltjb3VudF0gPSAqZzI7CisKKwlpZiAocm91bmQgPT0gMSkKKwl7CisJICAgIC8qCisJICAgICAqIElmIHRoZSBncm91cCBlbmRlZCB1cCBlbXB0eSwgd2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBhbnkKKwkgICAgICogc3BhY2UgZm9yIGl0LgorCSAgICAgKi8KKwkgICAgaWYgKGNvdW50ID09IDApCisJICAgIHsKKwkJY2xzdHIgPSBOVUxMOworCQlicmVhazsKKwkgICAgfQorCSAgICBjbHN0ciA9IChzaG9ydCAqKWFsbG9jKCh1bnNpZ25lZCkoKGNvdW50ICsgMSkgKiBzaXplb2Yoc2hvcnQpKSk7CisJICAgIGlmIChjbHN0ciA9PSBOVUxMKQorCQlicmVhazsKKwkgICAgY2xzdHJbY291bnRdID0gMDsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaW5hbGx5LCBwdXQgdGhlIG5ldyBsaXN0IGluIHBsYWNlLgorICAgICAqLworICAgIHZpbV9mcmVlKCpjbHN0cjEpOworICAgIHZpbV9mcmVlKCpjbHN0cjIpOworICAgICpjbHN0cjEgPSBjbHN0cjsKK30KKworLyoKKyAqIExvb2t1cCBhIHN5bnRheCBjbHVzdGVyIG5hbWUgYW5kIHJldHVybiBpdCdzIElELgorICogSWYgaXQgaXMgbm90IGZvdW5kLCAwIGlzIHJldHVybmVkLgorICovCisgICAgc3RhdGljIGludAorc3luX3NjbF9uYW1lMmlkKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKm5hbWVfdTsKKworICAgIC8qIEF2b2lkIHVzaW5nIHN0cmljbXAoKSB0b28gbXVjaCwgaXQncyBzbG93IG9uIHNvbWUgc3lzdGVtcyAqLworICAgIG5hbWVfdSA9IHZpbV9zdHJzYXZlX3VwKG5hbWUpOworICAgIGlmIChuYW1lX3UgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICBmb3IgKGkgPSBjdXJidWYtPmJfc3luX2NsdXN0ZXJzLmdhX2xlbjsgLS1pID49IDA7ICkKKwlpZiAoU1lOX0NMU1RSKGN1cmJ1ZilbaV0uc2NsX25hbWVfdSAhPSBOVUxMCisJCSYmIFNUUkNNUChuYW1lX3UsIFNZTl9DTFNUUihjdXJidWYpW2ldLnNjbF9uYW1lX3UpID09IDApCisJICAgIGJyZWFrOworICAgIHZpbV9mcmVlKG5hbWVfdSk7CisgICAgcmV0dXJuIChpIDwgMCA/IDAgOiBpICsgU1lOSURfQ0xVU1RFUik7Cit9CisKKy8qCisgKiBMaWtlIHN5bl9zY2xfbmFtZTJpZCgpLCBidXQgdGFrZSBhIHBvaW50ZXIgKyBsZW5ndGggYXJndW1lbnQuCisgKi8KKyAgICBzdGF0aWMgaW50CitzeW5fc2NsX25hbWVuMmlkKGxpbmVwLCBsZW4pCisgICAgY2hhcl91ICAqbGluZXA7CisgICAgaW50CSAgICBsZW47Cit7CisgICAgY2hhcl91ICAqbmFtZTsKKyAgICBpbnQJICAgIGlkID0gMDsKKworICAgIG5hbWUgPSB2aW1fc3RybnNhdmUobGluZXAsIGxlbik7CisgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB7CisJaWQgPSBzeW5fc2NsX25hbWUyaWQobmFtZSk7CisJdmltX2ZyZWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBpZDsKK30KKworLyoKKyAqIEZpbmQgc3ludGF4IGNsdXN0ZXIgbmFtZSBpbiB0aGUgdGFibGUgYW5kIHJldHVybiBpdCdzIElELgorICogVGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgbmFtZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4KKyAqIElmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LCBhIG5ldyBlbnRyeSBpcyBjcmVhdGVkLgorICogUmV0dXJuIDAgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBzdGF0aWMgaW50CitzeW5fY2hlY2tfY2x1c3RlcihwcCwgbGVuKQorICAgIGNoYXJfdQkqcHA7CisgICAgaW50CQlsZW47Cit7CisgICAgaW50CQlpZDsKKyAgICBjaGFyX3UJKm5hbWU7CisKKyAgICBuYW1lID0gdmltX3N0cm5zYXZlKHBwLCBsZW4pOworICAgIGlmIChuYW1lID09IE5VTEwpCisJcmV0dXJuIDA7CisKKyAgICBpZCA9IHN5bl9zY2xfbmFtZTJpZChuYW1lKTsKKyAgICBpZiAoaWQgPT0gMCkJCQkvKiBkb2Vzbid0IGV4aXN0IHlldCAqLworCWlkID0gc3luX2FkZF9jbHVzdGVyKG5hbWUpOworICAgIGVsc2UKKwl2aW1fZnJlZShuYW1lKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8qCisgKiBBZGQgbmV3IHN5bnRheCBjbHVzdGVyIGFuZCByZXR1cm4gaXQncyBJRC4KKyAqICJuYW1lIiBtdXN0IGJlIGFuIGFsbG9jYXRlZCBzdHJpbmcsIGl0IHdpbGwgYmUgY29uc3VtZWQuCisgKiBSZXR1cm4gMCBmb3IgZmFpbHVyZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK3N5bl9hZGRfY2x1c3RlcihuYW1lKQorICAgIGNoYXJfdQkJKm5hbWU7Cit7CisgICAgaW50IGxlbjsKKworICAgIC8qCisgICAgICogRmlyc3QgY2FsbCBmb3IgdGhpcyBncm93YXJyYXk6IGluaXQgZ3Jvd2luZyBhcnJheS4KKyAgICAgKi8KKyAgICBpZiAoY3VyYnVmLT5iX3N5bl9jbHVzdGVycy5nYV9kYXRhID09IE5VTEwpCisgICAgeworCWN1cmJ1Zi0+Yl9zeW5fY2x1c3RlcnMuZ2FfaXRlbXNpemUgPSBzaXplb2Yoc3RydWN0IHN5bl9jbHVzdGVyKTsKKwljdXJidWYtPmJfc3luX2NsdXN0ZXJzLmdhX2dyb3dzaXplID0gMTA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYWtlIHJvb20gZm9yIGF0IGxlYXN0IG9uZSBvdGhlciBjbHVzdGVyIGVudHJ5LgorICAgICAqLworICAgIGlmIChnYV9ncm93KCZjdXJidWYtPmJfc3luX2NsdXN0ZXJzLCAxKSA9PSBGQUlMKQorICAgIHsKKwl2aW1fZnJlZShuYW1lKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgbGVuID0gY3VyYnVmLT5iX3N5bl9jbHVzdGVycy5nYV9sZW47CisKKyAgICB2aW1fbWVtc2V0KCYoU1lOX0NMU1RSKGN1cmJ1ZilbbGVuXSksIDAsIHNpemVvZihzdHJ1Y3Qgc3luX2NsdXN0ZXIpKTsKKyAgICBTWU5fQ0xTVFIoY3VyYnVmKVtsZW5dLnNjbF9uYW1lID0gbmFtZTsKKyAgICBTWU5fQ0xTVFIoY3VyYnVmKVtsZW5dLnNjbF9uYW1lX3UgPSB2aW1fc3Ryc2F2ZV91cChuYW1lKTsKKyAgICBTWU5fQ0xTVFIoY3VyYnVmKVtsZW5dLnNjbF9saXN0ID0gTlVMTDsKKyAgICArK2N1cmJ1Zi0+Yl9zeW5fY2x1c3RlcnMuZ2FfbGVuOworICAgIC0tY3VyYnVmLT5iX3N5bl9jbHVzdGVycy5nYV9yb29tOworCisgICAgcmV0dXJuIGxlbiArIFNZTklEX0NMVVNURVI7Cit9CisKKy8qCisgKiBIYW5kbGUgIjpzeW50YXggY2x1c3RlciB7Y2x1c3Rlci1uYW1lfSBbY29udGFpbnM9e2dyb3VwbmFtZX0sLi5dCisgKgkJW2FkZD17Z3JvdXBuYW1lfSwuLl0gW3JlbW92ZT17Z3JvdXBuYW1lfSwuLl0iLgorICovCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fY21kX2NsdXN0ZXIoZWFwLCBzeW5jaW5nKQorICAgIGV4YXJnX1QJKmVhcDsKKyAgICBpbnQJCXN5bmNpbmc7CSAgICAvKiBub3QgdXNlZCAqLworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSpncm91cF9uYW1lX2VuZDsKKyAgICBjaGFyX3UJKnJlc3Q7CisgICAgaW50CQlzY2xfaWQ7CisgICAgc2hvcnQJKmNsc3RyX2xpc3Q7CisgICAgaW50CQlnb3RfY2xzdHIgPSBGQUxTRTsKKyAgICBpbnQJCW9wdF9sZW47CisgICAgaW50CQlsaXN0X29wOworCisgICAgZWFwLT5uZXh0Y21kID0gZmluZF9uZXh0Y21kKGFyZyk7CisgICAgaWYgKGVhcC0+c2tpcCkKKwlyZXR1cm47CisKKyAgICByZXN0ID0gZ2V0X2dyb3VwX25hbWUoYXJnLCAmZ3JvdXBfbmFtZV9lbmQpOworCisgICAgaWYgKHJlc3QgIT0gTlVMTCkKKyAgICB7CisJc2NsX2lkID0gc3luX2NoZWNrX2NsdXN0ZXIoYXJnLCAoaW50KShncm91cF9uYW1lX2VuZCAtIGFyZykpCisJCSAgICAtIFNZTklEX0NMVVNURVI7CisKKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKFNUUk5JQ01QKHJlc3QsICJhZGQiLCAzKSA9PSAwCisJCSAgICAmJiAodmltX2lzd2hpdGUocmVzdFszXSkgfHwgcmVzdFszXSA9PSAnPScpKQorCSAgICB7CisJCW9wdF9sZW4gPSAzOworCQlsaXN0X29wID0gQ0xVU1RFUl9BREQ7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoU1RSTklDTVAocmVzdCwgInJlbW92ZSIsIDYpID09IDAKKwkJICAgICYmICh2aW1faXN3aGl0ZShyZXN0WzZdKSB8fCByZXN0WzZdID09ICc9JykpCisJICAgIHsKKwkJb3B0X2xlbiA9IDY7CisJCWxpc3Rfb3AgPSBDTFVTVEVSX1NVQlRSQUNUOworCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUk5JQ01QKHJlc3QsICJjb250YWlucyIsIDgpID09IDAKKwkJCSYmICh2aW1faXN3aGl0ZShyZXN0WzhdKSB8fCByZXN0WzhdID09ICc9JykpCisJICAgIHsKKwkJb3B0X2xlbiA9IDg7CisJCWxpc3Rfb3AgPSBDTFVTVEVSX1JFUExBQ0U7CisJICAgIH0KKwkgICAgZWxzZQorCQlicmVhazsKKworCSAgICBjbHN0cl9saXN0ID0gTlVMTDsKKwkgICAgaWYgKGdldF9pZF9saXN0KCZyZXN0LCBvcHRfbGVuLCAmY2xzdHJfbGlzdCkgPT0gRkFJTCkKKwkgICAgeworCQlFTVNHMihfKGVfaW52YXJnMiksIHJlc3QpOworCQlicmVhazsKKwkgICAgfQorCSAgICBzeW5fY29tYmluZV9saXN0KCZTWU5fQ0xTVFIoY3VyYnVmKVtzY2xfaWRdLnNjbF9saXN0LAorCQkJICAgICAmY2xzdHJfbGlzdCwgbGlzdF9vcCk7CisJICAgIGdvdF9jbHN0ciA9IFRSVUU7CisJfQorCisJaWYgKGdvdF9jbHN0cikKKwl7CisJICAgIHJlZHJhd19jdXJidWZfbGF0ZXIoTk9UX1ZBTElEKTsKKwkgICAgc3luX3N0YWNrX2ZyZWVfYWxsKGN1cmJ1Zik7CS8qIE5lZWQgdG8gcmVjb21wdXRlIGFsbCBzeW50YXguICovCisJfQorICAgIH0KKworICAgIGlmICghZ290X2Nsc3RyKQorCUVNU0coXygiRTQwMDogTm8gY2x1c3RlciBzcGVjaWZpZWQiKSk7CisgICAgaWYgKHJlc3QgPT0gTlVMTCB8fCAhZW5kc19leGNtZCgqcmVzdCkpCisJRU1TRzIoXyhlX2ludmFyZzIpLCBhcmcpOworfQorCisvKgorICogT24gZmlyc3QgY2FsbCBmb3IgY3VycmVudCBidWZmZXI6IEluaXQgZ3Jvd2luZyBhcnJheS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitpbml0X3N5bl9wYXR0ZXJucygpCit7CisgICAgY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9pdGVtc2l6ZSA9IHNpemVvZihzeW5wYXRfVCk7CisgICAgY3VyYnVmLT5iX3N5bl9wYXR0ZXJucy5nYV9ncm93c2l6ZSA9IDEwOworfQorCisvKgorICogR2V0IG9uZSBwYXR0ZXJuIGZvciBhICI6c3ludGF4IG1hdGNoIiBvciAiOnN5bnRheCByZWdpb24iIGNvbW1hbmQuCisgKiBTdG9yZXMgdGhlIHBhdHRlcm4gYW5kIHByb2dyYW0gaW4gYSBzeW5wYXRfVC4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGFyZ3VtZW50LCBvciBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK2dldF9zeW5fcGF0dGVybihhcmcsIGNpKQorICAgIGNoYXJfdQkqYXJnOworICAgIHN5bnBhdF9UCSpjaTsKK3sKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBpbnQJCSpwOworICAgIGludAkJaWR4OworICAgIGNoYXJfdQkqY3BvX3NhdmU7CisKKyAgICAvKiBuZWVkIGF0IGxlYXN0IHRocmVlIGNoYXJzICovCisgICAgaWYgKGFyZyA9PSBOVUxMIHx8IGFyZ1sxXSA9PSBOVUwgfHwgYXJnWzJdID09IE5VTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGVuZCA9IHNraXBfcmVnZXhwKGFyZyArIDEsICphcmcsIFRSVUUsIE5VTEwpOworICAgIGlmICgqZW5kICE9ICphcmcpCQkJICAgIC8qIGVuZCBkZWxpbWl0ZXIgbm90IGZvdW5kICovCisgICAgeworCUVNU0cyKF8oIkU0MDE6IFBhdHRlcm4gZGVsaW1pdGVyIG5vdCBmb3VuZDogJXMiKSwgYXJnKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogc3RvcmUgdGhlIHBhdHRlcm4gYW5kIGNvbXBpbGVkIHJlZ2V4cCBwcm9ncmFtICovCisgICAgaWYgKChjaS0+c3BfcGF0dGVybiA9IHZpbV9zdHJuc2F2ZShhcmcgKyAxLCAoaW50KShlbmQgLSBhcmcgLSAxKSkpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBNYWtlICdjcG9wdGlvbnMnIGVtcHR5LCB0byBhdm9pZCB0aGUgJ2wnIGZsYWcgKi8KKyAgICBjcG9fc2F2ZSA9IHBfY3BvOworICAgIHBfY3BvID0gKGNoYXJfdSAqKSIiOworICAgIGNpLT5zcF9wcm9nID0gdmltX3JlZ2NvbXAoY2ktPnNwX3BhdHRlcm4sIFJFX01BR0lDKTsKKyAgICBwX2NwbyA9IGNwb19zYXZlOworCisgICAgaWYgKGNpLT5zcF9wcm9nID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgY2ktPnNwX2ljID0gY3VyYnVmLT5iX3N5bl9pYzsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGEgbWF0Y2gsIGhpZ2hsaWdodCBvciByZWdpb24gb2Zmc2V0LgorICAgICAqLworICAgICsrZW5kOworICAgIGRvCisgICAgeworCWZvciAoaWR4ID0gU1BPX0NPVU5UOyAtLWlkeCA+PSAwOyApCisJICAgIGlmIChTVFJOQ01QKGVuZCwgc3BvX25hbWVfdGFiW2lkeF0sIDMpID09IDApCisJCWJyZWFrOworCWlmIChpZHggPj0gMCkKKwl7CisJICAgIHAgPSAmKGNpLT5zcF9vZmZzZXRzW2lkeF0pOworCSAgICBpZiAoaWR4ICE9IFNQT19MQ19PRkYpCisJCXN3aXRjaCAoZW5kWzNdKQorCQl7CisJCSAgICBjYXNlICdzJzogICBicmVhazsKKwkJICAgIGNhc2UgJ2InOiAgIGJyZWFrOworCQkgICAgY2FzZSAnZSc6ICAgaWR4ICs9IFNQT19DT1VOVDsgYnJlYWs7CisJCSAgICBkZWZhdWx0OiAgICBpZHggPSAtMTsgYnJlYWs7CisJCX0KKwkgICAgaWYgKGlkeCA+PSAwKQorCSAgICB7CisJCWNpLT5zcF9vZmZfZmxhZ3MgfD0gKDEgPDwgaWR4KTsKKwkJaWYgKGlkeCA9PSBTUE9fTENfT0ZGKQkgICAgLyogbGM9OTkgKi8KKwkJeworCQkgICAgZW5kICs9IDM7CisJCSAgICAqcCA9IGdldGRpZ2l0cygmZW5kKTsKKworCQkgICAgLyogImxjPSIgb2Zmc2V0IGF1dG9tYXRpY2FsbHkgc2V0cyAibXM9IiBvZmZzZXQgKi8KKwkJICAgIGlmICghKGNpLT5zcF9vZmZfZmxhZ3MgJiAoMSA8PCBTUE9fTVNfT0ZGKSkpCisJCSAgICB7CisJCQljaS0+c3Bfb2ZmX2ZsYWdzIHw9ICgxIDw8IFNQT19NU19PRkYpOworCQkJY2ktPnNwX29mZnNldHNbU1BPX01TX09GRl0gPSAqcDsKKwkJICAgIH0KKwkJfQorCQllbHNlCQkJICAgIC8qIHl5PXgrOTkgKi8KKwkJeworCQkgICAgZW5kICs9IDQ7CisJCSAgICBpZiAoKmVuZCA9PSAnKycpCisJCSAgICB7CisJCQkrK2VuZDsKKwkJCSpwID0gZ2V0ZGlnaXRzKCZlbmQpOwkJLyogcG9zaXRpdmUgb2Zmc2V0ICovCisJCSAgICB9CisJCSAgICBlbHNlIGlmICgqZW5kID09ICctJykKKwkJICAgIHsKKwkJCSsrZW5kOworCQkJKnAgPSAtZ2V0ZGlnaXRzKCZlbmQpOwkJLyogbmVnYXRpdmUgb2Zmc2V0ICovCisJCSAgICB9CisJCX0KKwkJaWYgKCplbmQgIT0gJywnKQorCQkgICAgYnJlYWs7CisJCSsrZW5kOworCSAgICB9CisJfQorICAgIH0gd2hpbGUgKGlkeCA+PSAwKTsKKworICAgIGlmICghZW5kc19leGNtZCgqZW5kKSAmJiAhdmltX2lzd2hpdGUoKmVuZCkpCisgICAgeworCUVNU0cyKF8oIkU0MDI6IEdhcmJhZ2UgYWZ0ZXIgcGF0dGVybjogJXMiKSwgYXJnKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNraXB3aGl0ZShlbmQpOworfQorCisvKgorICogSGFuZGxlICI6c3ludGF4IHN5bmMgLi4iIGNvbW1hbmQuCisgKi8KKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK3N5bl9jbWRfc3luYyhlYXAsIHN5bmNpbmcpCisgICAgZXhhcmdfVAkqZWFwOworICAgIGludAkJc3luY2luZzsJICAgIC8qIG5vdCB1c2VkICovCit7CisgICAgY2hhcl91CSphcmdfc3RhcnQgPSBlYXAtPmFyZzsKKyAgICBjaGFyX3UJKmFyZ19lbmQ7CisgICAgY2hhcl91CSprZXkgPSBOVUxMOworICAgIGNoYXJfdQkqbmV4dF9hcmc7CisgICAgaW50CQlpbGxlZ2FsID0gRkFMU0U7CisgICAgaW50CQlmaW5pc2hlZCA9IEZBTFNFOworICAgIGxvbmcJbjsKKyAgICBjaGFyX3UJKmNwb19zYXZlOworCisgICAgaWYgKGVuZHNfZXhjbWQoKmFyZ19zdGFydCkpCisgICAgeworCXN5bl9jbWRfbGlzdChlYXAsIFRSVUUpOworCXJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWVuZHNfZXhjbWQoKmFyZ19zdGFydCkpCisgICAgeworCWFyZ19lbmQgPSBza2lwdG93aGl0ZShhcmdfc3RhcnQpOworCW5leHRfYXJnID0gc2tpcHdoaXRlKGFyZ19lbmQpOworCXZpbV9mcmVlKGtleSk7CisJa2V5ID0gdmltX3N0cm5zYXZlX3VwKGFyZ19zdGFydCwgKGludCkoYXJnX2VuZCAtIGFyZ19zdGFydCkpOworCWlmIChTVFJDTVAoa2V5LCAiQ0NPTU1FTlQiKSA9PSAwKQorCXsKKwkgICAgaWYgKCFlYXAtPnNraXApCisJCWN1cmJ1Zi0+Yl9zeW5fc3luY19mbGFncyB8PSBTRl9DQ09NTUVOVDsKKwkgICAgaWYgKCFlbmRzX2V4Y21kKCpuZXh0X2FyZykpCisJICAgIHsKKwkJYXJnX2VuZCA9IHNraXB0b3doaXRlKG5leHRfYXJnKTsKKwkJaWYgKCFlYXAtPnNraXApCisJCSAgICBjdXJidWYtPmJfc3luX3N5bmNfaWQgPSBzeW5fY2hlY2tfZ3JvdXAobmV4dF9hcmcsCisJCQkJCQkgICAoaW50KShhcmdfZW5kIC0gbmV4dF9hcmcpKTsKKwkJbmV4dF9hcmcgPSBza2lwd2hpdGUoYXJnX2VuZCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoIWVhcC0+c2tpcCkKKwkJY3VyYnVmLT5iX3N5bl9zeW5jX2lkID0gc3luX25hbWUyaWQoKGNoYXJfdSAqKSJDb21tZW50Iik7CisJfQorCWVsc2UgaWYgKCAgU1RSTkNNUChrZXksICJMSU5FUyIsIDUpID09IDAKKwkJfHwgU1RSTkNNUChrZXksICJNSU5MSU5FUyIsIDgpID09IDAKKwkJfHwgU1RSTkNNUChrZXksICJNQVhMSU5FUyIsIDgpID09IDAKKwkJfHwgU1RSTkNNUChrZXksICJMSU5FQlJFQUtTIiwgMTApID09IDApCisJeworCSAgICBpZiAoa2V5WzRdID09ICdTJykKKwkJYXJnX2VuZCA9IGtleSArIDY7CisJICAgIGVsc2UgaWYgKGtleVswXSA9PSAnTCcpCisJCWFyZ19lbmQgPSBrZXkgKyAxMTsKKwkgICAgZWxzZQorCQlhcmdfZW5kID0ga2V5ICsgOTsKKwkgICAgaWYgKGFyZ19lbmRbLTFdICE9ICc9JyB8fCAhVklNX0lTRElHSVQoKmFyZ19lbmQpKQorCSAgICB7CisJCWlsbGVnYWwgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCSAgICBuID0gZ2V0ZGlnaXRzKCZhcmdfZW5kKTsKKwkgICAgaWYgKCFlYXAtPnNraXApCisJICAgIHsKKwkJaWYgKGtleVs0XSA9PSAnQicpCisJCSAgICBjdXJidWYtPmJfc3luX3N5bmNfbGluZWJyZWFrcyA9IG47CisJCWVsc2UgaWYgKGtleVsxXSA9PSAnQScpCisJCSAgICBjdXJidWYtPmJfc3luX3N5bmNfbWF4bGluZXMgPSBuOworCQllbHNlCisJCSAgICBjdXJidWYtPmJfc3luX3N5bmNfbWlubGluZXMgPSBuOworCSAgICB9CisJfQorCWVsc2UgaWYgKFNUUkNNUChrZXksICJGUk9NU1RBUlQiKSA9PSAwKQorCXsKKwkgICAgaWYgKCFlYXAtPnNraXApCisJICAgIHsKKwkJY3VyYnVmLT5iX3N5bl9zeW5jX21pbmxpbmVzID0gTUFYTE5VTTsKKwkJY3VyYnVmLT5iX3N5bl9zeW5jX21heGxpbmVzID0gMDsKKwkgICAgfQorCX0KKwllbHNlIGlmIChTVFJDTVAoa2V5LCAiTElORUNPTlQiKSA9PSAwKQorCXsKKwkgICAgaWYgKGN1cmJ1Zi0+Yl9zeW5fbGluZWNvbnRfcGF0ICE9IE5VTEwpCisJICAgIHsKKwkJRU1TRyhfKCJFNDAzOiBzeW50YXggc3luYzogbGluZSBjb250aW51YXRpb25zIHBhdHRlcm4gc3BlY2lmaWVkIHR3aWNlIikpOworCQlmaW5pc2hlZCA9IFRSVUU7CisJCWJyZWFrOworCSAgICB9CisJICAgIGFyZ19lbmQgPSBza2lwX3JlZ2V4cChuZXh0X2FyZyArIDEsICpuZXh0X2FyZywgVFJVRSwgTlVMTCk7CisJICAgIGlmICgqYXJnX2VuZCAhPSAqbmV4dF9hcmcpCSAgICAvKiBlbmQgZGVsaW1pdGVyIG5vdCBmb3VuZCAqLworCSAgICB7CisJCWlsbGVnYWwgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCisJICAgIGlmICghZWFwLT5za2lwKQorCSAgICB7CisJCS8qIHN0b3JlIHRoZSBwYXR0ZXJuIGFuZCBjb21waWxlZCByZWdleHAgcHJvZ3JhbSAqLworCQlpZiAoKGN1cmJ1Zi0+Yl9zeW5fbGluZWNvbnRfcGF0ID0gdmltX3N0cm5zYXZlKG5leHRfYXJnICsgMSwKKwkJCQkgICAgICAoaW50KShhcmdfZW5kIC0gbmV4dF9hcmcgLSAxKSkpID09IE5VTEwpCisJCXsKKwkJICAgIGZpbmlzaGVkID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisJCWN1cmJ1Zi0+Yl9zeW5fbGluZWNvbnRfaWMgPSBjdXJidWYtPmJfc3luX2ljOworCisJCS8qIE1ha2UgJ2Nwb3B0aW9ucycgZW1wdHksIHRvIGF2b2lkIHRoZSAnbCcgZmxhZyAqLworCQljcG9fc2F2ZSA9IHBfY3BvOworCQlwX2NwbyA9IChjaGFyX3UgKikiIjsKKwkJY3VyYnVmLT5iX3N5bl9saW5lY29udF9wcm9nID0KKwkJCSAgICB2aW1fcmVnY29tcChjdXJidWYtPmJfc3luX2xpbmVjb250X3BhdCwgUkVfTUFHSUMpOworCQlwX2NwbyA9IGNwb19zYXZlOworCisJCWlmIChjdXJidWYtPmJfc3luX2xpbmVjb250X3Byb2cgPT0gTlVMTCkKKwkJeworCQkgICAgdmltX2ZyZWUoY3VyYnVmLT5iX3N5bl9saW5lY29udF9wYXQpOworCQkgICAgY3VyYnVmLT5iX3N5bl9saW5lY29udF9wYXQgPSBOVUxMOworCQkgICAgZmluaXNoZWQgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBuZXh0X2FyZyA9IHNraXB3aGl0ZShhcmdfZW5kICsgMSk7CisJfQorCWVsc2UKKwl7CisJICAgIGVhcC0+YXJnID0gbmV4dF9hcmc7CisJICAgIGlmIChTVFJDTVAoa2V5LCAiTUFUQ0giKSA9PSAwKQorCQlzeW5fY21kX21hdGNoKGVhcCwgVFJVRSk7CisJICAgIGVsc2UgaWYgKFNUUkNNUChrZXksICJSRUdJT04iKSA9PSAwKQorCQlzeW5fY21kX3JlZ2lvbihlYXAsIFRSVUUpOworCSAgICBlbHNlIGlmIChTVFJDTVAoa2V5LCAiQ0xFQVIiKSA9PSAwKQorCQlzeW5fY21kX2NsZWFyKGVhcCwgVFJVRSk7CisJICAgIGVsc2UKKwkJaWxsZWdhbCA9IFRSVUU7CisJICAgIGZpbmlzaGVkID0gVFJVRTsKKwkgICAgYnJlYWs7CisJfQorCWFyZ19zdGFydCA9IG5leHRfYXJnOworICAgIH0KKyAgICB2aW1fZnJlZShrZXkpOworICAgIGlmIChpbGxlZ2FsKQorCUVNU0cyKF8oIkU0MDQ6IElsbGVnYWwgYXJndW1lbnRzOiAlcyIpLCBhcmdfc3RhcnQpOworICAgIGVsc2UgaWYgKCFmaW5pc2hlZCkKKyAgICB7CisJZWFwLT5uZXh0Y21kID0gY2hlY2tfbmV4dGNtZChhcmdfc3RhcnQpOworCXJlZHJhd19jdXJidWZfbGF0ZXIoTk9UX1ZBTElEKTsKKwlzeW5fc3RhY2tfZnJlZV9hbGwoY3VyYnVmKTsJLyogTmVlZCB0byByZWNvbXB1dGUgYWxsIHN5bnRheC4gKi8KKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbGluZSBvZiBoaWdobGlnaHQgZ3JvdXAgbmFtZXMgaW50byBhIGxpc3Qgb2YgZ3JvdXAgSUQgbnVtYmVycy4KKyAqICJhcmciIHNob3VsZCBwb2ludCB0byB0aGUgImNvbnRhaW5zIiBvciAibmV4dGdyb3VwIiBrZXl3b3JkLgorICogImFyZyIgaXMgYWR2YW5jZWQgdG8gYWZ0ZXIgdGhlIGxhc3QgZ3JvdXAgbmFtZS4KKyAqIENhcmVmdWw6IHRoZSBhcmd1bWVudCBpcyBtb2RpZmllZCAoTlVMcyBhZGRlZCkuCisgKiByZXR1cm5zIEZBSUwgZm9yIHNvbWUgZXJyb3IsIE9LIGZvciBzdWNjZXNzLgorICovCisgICAgc3RhdGljIGludAorZ2V0X2lkX2xpc3QoYXJnLCBrZXlsZW4sIGxpc3QpCisgICAgY2hhcl91CSoqYXJnOworICAgIGludAkJa2V5bGVuOwkJLyogbGVuZ3RoIG9mIGtleXdvcmQgKi8KKyAgICBzaG9ydAkqKmxpc3Q7CQkvKiB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGxpc3QsIGlmIG5vdAorCQkJCSAgIE5VTEwsIHRoZSBsaXN0IGlzIHNpbGVudGx5IHNraXBwZWQhICovCit7CisgICAgY2hhcl91CSpwID0gTlVMTDsKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBpbnQJCXJvdW5kOworICAgIGludAkJY291bnQ7CisgICAgaW50CQl0b3RhbF9jb3VudCA9IDA7CisgICAgc2hvcnQJKnJldHZhbCA9IE5VTEw7CisgICAgY2hhcl91CSpuYW1lOworICAgIHJlZ21hdGNoX1QJcmVnbWF0Y2g7CisgICAgaW50CQlpZDsKKyAgICBpbnQJCWk7CisgICAgaW50CQlmYWlsZWQgPSBGQUxTRTsKKworICAgIC8qCisgICAgICogV2UgcGFyc2UgdGhlIGxpc3QgdHdpY2U6CisgICAgICogcm91bmQgPT0gMTogY291bnQgdGhlIG51bWJlciBvZiBpdGVtcywgYWxsb2NhdGUgdGhlIGFycmF5LgorICAgICAqIHJvdW5kID09IDI6IGZpbGwgdGhlIGFycmF5IHdpdGggdGhlIGl0ZW1zLgorICAgICAqIEluIHJvdW5kIDEgbmV3IGdyb3VwcyBtYXkgYmUgYWRkZWQsIGNhdXNpbmcgdGhlIG51bWJlciBvZiBpdGVtcyB0bworICAgICAqIGdyb3cgd2hlbiBhIHJlZ2V4cCBpcyB1c2VkLiAgSW4gdGhhdCBjYXNlIHJvdW5kIDEgaXMgZG9uZSBvbmNlIGFnYWluLgorICAgICAqLworICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAyOyArK3JvdW5kKQorICAgIHsKKwkvKgorCSAqIHNraXAgImNvbnRhaW5zIgorCSAqLworCXAgPSBza2lwd2hpdGUoKmFyZyArIGtleWxlbik7CisJaWYgKCpwICE9ICc9JykKKwl7CisJICAgIEVNU0cyKF8oIkU0MDU6IE1pc3NpbmcgZXF1YWwgc2lnbjogJXMiKSwgKmFyZyk7CisJICAgIGJyZWFrOworCX0KKwlwID0gc2tpcHdoaXRlKHAgKyAxKTsKKwlpZiAoZW5kc19leGNtZCgqcCkpCisJeworCSAgICBFTVNHMihfKCJFNDA2OiBFbXB0eSBhcmd1bWVudDogJXMiKSwgKmFyZyk7CisJICAgIGJyZWFrOworCX0KKworCS8qCisJICogcGFyc2UgdGhlIGFyZ3VtZW50cyBhZnRlciAiY29udGFpbnMiCisJICovCisJY291bnQgPSAwOworCXdoaWxlICghZW5kc19leGNtZCgqcCkpCisJeworCSAgICBmb3IgKGVuZCA9IHA7ICplbmQgJiYgIXZpbV9pc3doaXRlKCplbmQpICYmICplbmQgIT0gJywnOyArK2VuZCkKKwkJOworCSAgICBuYW1lID0gYWxsb2MoKGludCkoZW5kIC0gcCArIDMpKTsJICAgIC8qIGxlYXZlIHJvb20gZm9yICJeJCIgKi8KKwkgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgeworCQlmYWlsZWQgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCSAgICBTVFJOQ1BZKG5hbWUgKyAxLCBwLCBlbmQgLSBwKTsKKwkgICAgbmFtZVtlbmQgLSBwICsgMV0gPSBOVUw7CisJICAgIGlmICggICAgICAgU1RSQ01QKG5hbWUgKyAxLCAiQUxMQlVUIikgPT0gMAorCQkgICAgfHwgU1RSQ01QKG5hbWUgKyAxLCAiQUxMIikgPT0gMAorCQkgICAgfHwgU1RSQ01QKG5hbWUgKyAxLCAiVE9QIikgPT0gMAorCQkgICAgfHwgU1RSQ01QKG5hbWUgKyAxLCAiQ09OVEFJTkVEIikgPT0gMCkKKwkgICAgeworCQlpZiAoVE9VUFBFUl9BU0MoKiphcmcpICE9ICdDJykKKwkJeworCQkgICAgRU1TRzIoXygiRTQwNzogJXMgbm90IGFsbG93ZWQgaGVyZSIpLCBuYW1lICsgMSk7CisJCSAgICBmYWlsZWQgPSBUUlVFOworCQkgICAgdmltX2ZyZWUobmFtZSk7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoY291bnQgIT0gMCkKKwkJeworCQkgICAgRU1TRzIoXygiRTQwODogJXMgbXVzdCBiZSBmaXJzdCBpbiBjb250YWlucyBsaXN0IiksIG5hbWUgKyAxKTsKKwkJICAgIGZhaWxlZCA9IFRSVUU7CisJCSAgICB2aW1fZnJlZShuYW1lKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChuYW1lWzFdID09ICdBJykKKwkJICAgIGlkID0gU1lOSURfQUxMQlVUOworCQllbHNlIGlmIChuYW1lWzFdID09ICdUJykKKwkJICAgIGlkID0gU1lOSURfVE9QOworCQllbHNlCisJCSAgICBpZCA9IFNZTklEX0NPTlRBSU5FRDsKKwkJaWQgKz0gY3VycmVudF9zeW5faW5jX3RhZzsKKwkgICAgfQorCSAgICBlbHNlIGlmIChuYW1lWzFdID09ICdAJykKKwkgICAgeworCQlpZCA9IHN5bl9jaGVja19jbHVzdGVyKG5hbWUgKyAyLCAoaW50KShlbmQgLSBwIC0gMSkpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKgorCQkgKiBIYW5kbGUgZnVsbCBncm91cCBuYW1lLgorCQkgKi8KKwkJaWYgKHZpbV9zdHJwYnJrKG5hbWUgKyAxLCAoY2hhcl91ICopIlxcLipeJH5bIikgPT0gTlVMTCkKKwkJICAgIGlkID0gc3luX2NoZWNrX2dyb3VwKG5hbWUgKyAxLCAoaW50KShlbmQgLSBwKSk7CisJCWVsc2UKKwkJeworCQkgICAgLyoKKwkJICAgICAqIEhhbmRsZSBtYXRjaCBvZiByZWdleHAgd2l0aCBncm91cCBuYW1lcy4KKwkJICAgICAqLworCQkgICAgKm5hbWUgPSAnXic7CisJCSAgICBTVFJDQVQobmFtZSwgIiQiKTsKKwkJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChuYW1lLCBSRV9NQUdJQyk7CisJCSAgICBpZiAocmVnbWF0Y2gucmVncHJvZyA9PSBOVUxMKQorCQkgICAgeworCQkJZmFpbGVkID0gVFJVRTsKKwkJCXZpbV9mcmVlKG5hbWUpOworCQkJYnJlYWs7CisJCSAgICB9CisKKwkJICAgIHJlZ21hdGNoLnJtX2ljID0gVFJVRTsKKwkJICAgIGlkID0gMDsKKwkJICAgIGZvciAoaSA9IGhpZ2hsaWdodF9nYS5nYV9sZW47IC0taSA+PSAwOyApCisJCSAgICB7CisJCQlpZiAodmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCBITF9UQUJMRSgpW2ldLnNnX25hbWUsCisJCQkJCQkJCSAgKGNvbG5yX1QpMCkpCisJCQl7CisJCQkgICAgaWYgKHJvdW5kID09IDIpCisJCQkgICAgeworCQkJCS8qIEdvdCBtb3JlIGl0ZW1zIHRoYW4gZXhwZWN0ZWQ7IGNhbiBoYXBwZW4KKwkJCQkgKiB3aGVuIGFkZGluZyBpdGVtcyB0aGF0IG1hdGNoOgorCQkJCSAqICJjb250YWlucz1hLipiLGF4YiIuCisJCQkJICogR28gYmFjayB0byBmaXJzdCByb3VuZCAqLworCQkJCWlmIChjb3VudCA+PSB0b3RhbF9jb3VudCkKKwkJCQl7CisJCQkJICAgIHZpbV9mcmVlKHJldHZhbCk7CisJCQkJICAgIHJvdW5kID0gMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCSAgICByZXR2YWxbY291bnRdID0gaSArIDE7CisJCQkgICAgfQorCQkJICAgICsrY291bnQ7CisJCQkgICAgaWQgPSAtMTsJICAgIC8qIHJlbWVtYmVyIHRoYXQgd2UgZm91bmQgb25lICovCisJCQl9CisJCSAgICB9CisJCSAgICB2aW1fZnJlZShyZWdtYXRjaC5yZWdwcm9nKTsKKwkJfQorCSAgICB9CisJICAgIHZpbV9mcmVlKG5hbWUpOworCSAgICBpZiAoaWQgPT0gMCkKKwkgICAgeworCQlFTVNHMihfKCJFNDA5OiBVbmtub3duIGdyb3VwIG5hbWU6ICVzIiksIHApOworCQlmYWlsZWQgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoaWQgPiAwKQorCSAgICB7CisJCWlmIChyb3VuZCA9PSAyKQorCQl7CisJCSAgICAvKiBHb3QgbW9yZSBpdGVtcyB0aGFuIGV4cGVjdGVkLCBnbyBiYWNrIHRvIGZpcnN0IHJvdW5kICovCisJCSAgICBpZiAoY291bnQgPj0gdG90YWxfY291bnQpCisJCSAgICB7CisJCQl2aW1fZnJlZShyZXR2YWwpOworCQkJcm91bmQgPSAxOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJcmV0dmFsW2NvdW50XSA9IGlkOworCQl9CisJCSsrY291bnQ7CisJICAgIH0KKwkgICAgcCA9IHNraXB3aGl0ZShlbmQpOworCSAgICBpZiAoKnAgIT0gJywnKQorCQlicmVhazsKKwkgICAgcCA9IHNraXB3aGl0ZShwICsgMSk7CS8qIHNraXAgY29tbWEgaW4gYmV0d2VlbiBhcmd1bWVudHMgKi8KKwl9CisJaWYgKGZhaWxlZCkKKwkgICAgYnJlYWs7CisJaWYgKHJvdW5kID09IDEpCisJeworCSAgICByZXR2YWwgPSAoc2hvcnQgKilhbGxvYygodW5zaWduZWQpKChjb3VudCArIDEpICogc2l6ZW9mKHNob3J0KSkpOworCSAgICBpZiAocmV0dmFsID09IE5VTEwpCisJCWJyZWFrOworCSAgICByZXR2YWxbY291bnRdID0gMDsJICAgIC8qIHplcm8gbWVhbnMgZW5kIG9mIHRoZSBsaXN0ICovCisJICAgIHRvdGFsX2NvdW50ID0gY291bnQ7CisJfQorICAgIH0KKworICAgICphcmcgPSBwOworICAgIGlmIChmYWlsZWQgfHwgcmV0dmFsID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKHJldHZhbCk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorCisgICAgaWYgKCpsaXN0ID09IE5VTEwpCisJKmxpc3QgPSByZXR2YWw7CisgICAgZWxzZQorCXZpbV9mcmVlKHJldHZhbCk7CS8qIGxpc3QgYWxyZWFkeSBmb3VuZCwgZG9uJ3Qgb3ZlcndyaXRlIGl0ICovCisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBNYWtlIGEgY29weSBvZiBhbiBJRCBsaXN0LgorICovCisgICAgc3RhdGljIHNob3J0ICoKK2NvcHlfaWRfbGlzdChsaXN0KQorICAgIHNob3J0ICAgKmxpc3Q7Cit7CisgICAgaW50CSAgICBsZW47CisgICAgaW50CSAgICBjb3VudDsKKyAgICBzaG9ydCAgICpyZXR2YWw7CisKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgZm9yIChjb3VudCA9IDA7IGxpc3RbY291bnRdOyArK2NvdW50KQorCTsKKyAgICBsZW4gPSAoY291bnQgKyAxKSAqIHNpemVvZihzaG9ydCk7CisgICAgcmV0dmFsID0gKHNob3J0ICopYWxsb2MoKHVuc2lnbmVkKWxlbik7CisgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCW1jaF9tZW1tb3ZlKHJldHZhbCwgbGlzdCwgKHNpemVfdClsZW4pOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIENoZWNrIGlmIHN5bnRheCBncm91cCAic3NwIiBpcyBpbiB0aGUgSUQgbGlzdCAibGlzdCIgb2YgImN1cl9zaSIuCisgKiAiY3VyX3NpIiBjYW4gYmUgTlVMTCBpZiBub3QgY2hlY2tpbmcgdGhlICJjb250YWluZWRpbiIgbGlzdC4KKyAqIFVzZWQgdG8gY2hlY2sgaWYgYSBzeW50YXggaXRlbSBpcyBpbiB0aGUgImNvbnRhaW5zIiBvciAibmV4dGdyb3VwIiBsaXN0IG9mCisgKiB0aGUgY3VycmVudCBpdGVtLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmVyeSBvZnRlbiwga2VlcCBpdCBmYXN0ISEKKyAqLworICAgIHN0YXRpYyBpbnQKK2luX2lkX2xpc3QoY3VyX3NpLCBsaXN0LCBzc3AsIGNvbnRhaW5lZCkKKyAgICBzdGF0ZWl0ZW1fVAkqY3VyX3NpOwkvKiBjdXJyZW50IGl0ZW0gb3IgTlVMTCAqLworICAgIHNob3J0CSpsaXN0OwkJLyogaWQgbGlzdCAqLworICAgIHN0cnVjdCBzcF9zeW4gKnNzcDsJCS8qIGdyb3VwIGlkIGFuZCAiOnN5biBpbmNsdWRlIiB0YWcgb2YgZ3JvdXAgKi8KKyAgICBpbnQJCWNvbnRhaW5lZDsJLyogZ3JvdXAgaWQgaXMgY29udGFpbmVkICovCit7CisgICAgaW50CQlyZXR2YWw7CisgICAgc2hvcnQJKnNjbF9saXN0OworICAgIHNob3J0CWl0ZW07CisgICAgc2hvcnQJaWQgPSBzc3AtPmlkOworICAgIHN0YXRpYyBpbnQJZGVwdGggPSAwOworICAgIGludAkJcjsKKworICAgIC8qIElmIHNwcCBoYXMgYSAiY29udGFpbmVkaW4iIGxpc3QgYW5kICJjdXJfc2kiIGlzIGluIGl0LCByZXR1cm4gVFJVRS4gKi8KKyAgICBpZiAoY3VyX3NpICE9IE5VTEwgJiYgc3NwLT5jb250X2luX2xpc3QgIT0gTlVMTCkKKyAgICB7CisJLyogSWdub3JlIHRyYW5zcGFyZW50IGl0ZW1zIHdpdGhvdXQgYSBjb250YWlucyBhcmd1bWVudC4gIERvdWJsZSBjaGVjaworCSAqIHRoYXQgd2UgZG9uJ3QgZ28gYmFjayBwYXN0IHRoZSBmaXJzdCBvbmUuICovCisJd2hpbGUgKChjdXJfc2ktPnNpX2ZsYWdzICYgSExfVFJBTlNfQ09OVCkKKwkJJiYgY3VyX3NpID4gKHN0YXRlaXRlbV9UICopKGN1cnJlbnRfc3RhdGUuZ2FfZGF0YSkpCisJICAgIC0tY3VyX3NpOworCS8qIGN1cl9zaS0+c2lfaWR4IGlzIC0xIGZvciBrZXl3b3JkcywgdGhlc2UgbmV2ZXIgY29udGFpbiBhbnl0aGluZy4gKi8KKwlpZiAoY3VyX3NpLT5zaV9pZHggPj0gMCAmJiBpbl9pZF9saXN0KE5VTEwsIHNzcC0+Y29udF9pbl9saXN0LAorCQkmKFNZTl9JVEVNUyhzeW5fYnVmKVtjdXJfc2ktPnNpX2lkeF0uc3Bfc3luKSwKKwkJICBTWU5fSVRFTVMoc3luX2J1ZilbY3VyX3NpLT5zaV9pZHhdLnNwX2ZsYWdzICYgSExfQ09OVEFJTkVEKSkKKwkgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvKgorICAgICAqIElmIGxpc3QgaXMgSURfTElTVF9BTEwsIHdlIGFyZSBpbiBhIHRyYW5zcGFyZW50IGl0ZW0gdGhhdCBpc24ndAorICAgICAqIGluc2lkZSBhbnl0aGluZy4gIE9ubHkgYWxsb3cgbm90LWNvbnRhaW5lZCBncm91cHMuCisgICAgICovCisgICAgaWYgKGxpc3QgPT0gSURfTElTVF9BTEwpCisJcmV0dXJuICFjb250YWluZWQ7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBmaXJzdCBpdGVtIGlzICJBTExCVVQiLCByZXR1cm4gVFJVRSBpZiAiaWQiIGlzIE5PVCBpbiB0aGUKKyAgICAgKiBjb250YWlucyBsaXN0LiAgV2UgYWxzbyByZXF1aXJlIHRoYXQgImlkIiBpcyBhdCB0aGUgc2FtZSAiOnN5biBpbmNsdWRlIgorICAgICAqIGxldmVsIGFzIHRoZSBsaXN0LgorICAgICAqLworICAgIGl0ZW0gPSAqbGlzdDsKKyAgICBpZiAoaXRlbSA+PSBTWU5JRF9BTExCVVQgJiYgaXRlbSA8IFNZTklEX0NMVVNURVIpCisgICAgeworCWlmIChpdGVtIDwgU1lOSURfVE9QKQorCXsKKwkgICAgLyogQUxMIG9yIEFMTEJVVDogYWNjZXB0IGFsbCBncm91cHMgaW4gdGhlIHNhbWUgZmlsZSAqLworCSAgICBpZiAoaXRlbSAtIFNZTklEX0FMTEJVVCAhPSBzc3AtPmluY190YWcpCisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZSBpZiAoaXRlbSA8IFNZTklEX0NPTlRBSU5FRCkKKwl7CisJICAgIC8qIFRPUDogYWNjZXB0IGFsbCBub3QtY29udGFpbmVkIGdyb3VwcyBpbiB0aGUgc2FtZSBmaWxlICovCisJICAgIGlmIChpdGVtIC0gU1lOSURfVE9QICE9IHNzcC0+aW5jX3RhZyB8fCBjb250YWluZWQpCisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogQ09OVEFJTkVEOiBhY2NlcHQgYWxsIGNvbnRhaW5lZCBncm91cHMgaW4gdGhlIHNhbWUgZmlsZSAqLworCSAgICBpZiAoaXRlbSAtIFNZTklEX0NPTlRBSU5FRCAhPSBzc3AtPmluY190YWcgfHwgIWNvbnRhaW5lZCkKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpdGVtID0gKisrbGlzdDsKKwlyZXR2YWwgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorCXJldHZhbCA9IFRSVUU7CisKKyAgICAvKgorICAgICAqIFJldHVybiAicmV0dmFsIiBpZiBpZCBpcyBpbiB0aGUgY29udGFpbnMgbGlzdC4KKyAgICAgKi8KKyAgICB3aGlsZSAoaXRlbSAhPSAwKQorICAgIHsKKwlpZiAoaXRlbSA9PSBpZCkKKwkgICAgcmV0dXJuIHJldHZhbDsKKwlpZiAoaXRlbSA+PSBTWU5JRF9DTFVTVEVSKQorCXsKKwkgICAgc2NsX2xpc3QgPSBTWU5fQ0xTVFIoc3luX2J1ZilbaXRlbSAtIFNZTklEX0NMVVNURVJdLnNjbF9saXN0OworCSAgICAvKiByZXN0cmljdCByZWN1cnNpdmVuZXNzIHRvIDMwIHRvIGF2b2lkIGFuIGVuZGxlc3MgbG9vcCBmb3IgYQorCSAgICAgKiBjbHVzdGVyIHRoYXQgaW5jbHVkZXMgaXRzZWxmIChpbmRpcmVjdGx5KSAqLworCSAgICBpZiAoc2NsX2xpc3QgIT0gTlVMTCAmJiBkZXB0aCA8IDMwKQorCSAgICB7CisJCSsrZGVwdGg7CisJCXIgPSBpbl9pZF9saXN0KE5VTEwsIHNjbF9saXN0LCBzc3AsIGNvbnRhaW5lZCk7CisJCS0tZGVwdGg7CisJCWlmIChyKQorCQkgICAgcmV0dXJuIHJldHZhbDsKKwkgICAgfQorCX0KKwlpdGVtID0gKisrbGlzdDsKKyAgICB9CisgICAgcmV0dXJuICFyZXR2YWw7Cit9CisKK3N0cnVjdCBzdWJjb21tYW5kCit7CisgICAgY2hhciAgICAqbmFtZTsJCQkJLyogc3ViY29tbWFuZCBuYW1lICovCisgICAgdm9pZCAgICAoKmZ1bmMpX19BUkdTKChleGFyZ19UICosIGludCkpOwkvKiBmdW5jdGlvbiB0byBjYWxsICovCit9OworCitzdGF0aWMgc3RydWN0IHN1YmNvbW1hbmQgc3ViY29tbWFuZHNbXSA9Cit7CisgICAgeyJjYXNlIiwJCXN5bl9jbWRfY2FzZX0sCisgICAgeyJjbGVhciIsCQlzeW5fY21kX2NsZWFyfSwKKyAgICB7ImNsdXN0ZXIiLAkJc3luX2NtZF9jbHVzdGVyfSwKKyAgICB7ImVuYWJsZSIsCQlzeW5fY21kX2VuYWJsZX0sCisgICAgeyJpbmNsdWRlIiwJCXN5bl9jbWRfaW5jbHVkZX0sCisgICAgeyJrZXl3b3JkIiwJCXN5bl9jbWRfa2V5d29yZH0sCisgICAgeyJsaXN0IiwJCXN5bl9jbWRfbGlzdH0sCisgICAgeyJtYW51YWwiLAkJc3luX2NtZF9tYW51YWx9LAorICAgIHsibWF0Y2giLAkJc3luX2NtZF9tYXRjaH0sCisgICAgeyJvbiIsCQlzeW5fY21kX29ufSwKKyAgICB7Im9mZiIsCQlzeW5fY21kX29mZn0sCisgICAgeyJyZWdpb24iLAkJc3luX2NtZF9yZWdpb259LAorICAgIHsicmVzZXQiLAkJc3luX2NtZF9yZXNldH0sCisgICAgeyJzeW5jIiwJCXN5bl9jbWRfc3luY30sCisgICAgeyIiLAkJc3luX2NtZF9saXN0fSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKKy8qCisgKiAiOnN5bnRheCIuCisgKiBUaGlzIHNlYXJjaGVzIHRoZSBzdWJjb21tYW5kc1tdIHRhYmxlIGZvciB0aGUgc3ViY29tbWFuZCBuYW1lLCBhbmQgY2FsbHMgYQorICogc3ludGF4X3N1YmNvbW1hbmQoKSBmdW5jdGlvbiB0byBkbyB0aGUgcmVzdC4KKyAqLworICAgIHZvaWQKK2V4X3N5bnRheChlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGNoYXJfdQkqYXJnID0gZWFwLT5hcmc7CisgICAgY2hhcl91CSpzdWJjbWRfZW5kOworICAgIGNoYXJfdQkqc3ViY21kX25hbWU7CisgICAgaW50CQlpOworCisgICAgc3luX2NtZGxpbmVwID0gZWFwLT5jbWRsaW5lcDsKKworICAgIC8qIGlzb2xhdGUgc3ViY29tbWFuZCBuYW1lICovCisgICAgZm9yIChzdWJjbWRfZW5kID0gYXJnOyBBU0NJSV9JU0FMUEhBKCpzdWJjbWRfZW5kKTsgKytzdWJjbWRfZW5kKQorCTsKKyAgICBzdWJjbWRfbmFtZSA9IHZpbV9zdHJuc2F2ZShhcmcsIChpbnQpKHN1YmNtZF9lbmQgLSBhcmcpKTsKKyAgICBpZiAoc3ViY21kX25hbWUgIT0gTlVMTCkKKyAgICB7CisJaWYgKGVhcC0+c2tpcCkJCS8qIHNraXAgZXJyb3IgbWVzc2FnZXMgZm9yIGFsbCBzdWJjb21tYW5kcyAqLworCSAgICArK2Vtc2dfc2tpcDsKKwlmb3IgKGkgPSAwOyA7ICsraSkKKwl7CisJICAgIGlmIChzdWJjb21tYW5kc1tpXS5uYW1lID09IE5VTEwpCisJICAgIHsKKwkJRU1TRzIoXygiRTQxMDogSW52YWxpZCA6c3ludGF4IHN1YmNvbW1hbmQ6ICVzIiksIHN1YmNtZF9uYW1lKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKFNUUkNNUChzdWJjbWRfbmFtZSwgKGNoYXJfdSAqKXN1YmNvbW1hbmRzW2ldLm5hbWUpID09IDApCisJICAgIHsKKwkJZWFwLT5hcmcgPSBza2lwd2hpdGUoc3ViY21kX2VuZCk7CisJCShzdWJjb21tYW5kc1tpXS5mdW5jKShlYXAsIEZBTFNFKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJdmltX2ZyZWUoc3ViY21kX25hbWUpOworCWlmIChlYXAtPnNraXApCisJICAgIC0tZW1zZ19za2lwOworICAgIH0KK30KKworICAgIGludAorc3ludGF4X3ByZXNlbnQoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgcmV0dXJuIChidWYtPmJfc3luX3BhdHRlcm5zLmdhX2xlbiAhPSAwCisJICAgIHx8IGJ1Zi0+Yl9zeW5fY2x1c3RlcnMuZ2FfbGVuICE9IDAKKwkgICAgfHwgY3VyYnVmLT5iX2tleXd0YWIgIT0gTlVMTAorCSAgICB8fCBjdXJidWYtPmJfa2V5d3RhYl9pYyAhPSBOVUxMKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQorCitzdGF0aWMgZW51bQoreworICAgIEVYUF9TVUJDTUQsCSAgICAvKiBleHBhbmQgIjpzeW4iIHN1Yi1jb21tYW5kcyAqLworICAgIEVYUF9DQVNFCSAgICAvKiBleHBhbmQgIjpzeW4gY2FzZSIgYXJndW1lbnRzICovCit9IGV4cGFuZF93aGF0OworCisKKy8qCisgKiBIYW5kbGUgY29tbWFuZCBsaW5lIGNvbXBsZXRpb24gZm9yIDpzeW50YXggY29tbWFuZC4KKyAqLworICAgIHZvaWQKK3NldF9jb250ZXh0X2luX3N5bnRheF9jbWQoeHAsIGFyZykKKyAgICBleHBhbmRfVAkqeHA7CisgICAgY2hhcl91CSphcmc7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgLyogRGVmYXVsdDogZXhwYW5kIHN1YmNvbW1hbmRzICovCisgICAgeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfU1lOVEFYOworICAgIGV4cGFuZF93aGF0ID0gRVhQX1NVQkNNRDsKKyAgICB4cC0+eHBfcGF0dGVybiA9IGFyZzsKKyAgICBpbmNsdWRlX2xpbmsgPSBGQUxTRTsKKyAgICBpbmNsdWRlX2RlZmF1bHQgPSBGQUxTRTsKKworICAgIC8qIChwYXJ0IG9mKSBzdWJjb21tYW5kIGFscmVhZHkgdHlwZWQgKi8KKyAgICBpZiAoKmFyZyAhPSBOVUwpCisgICAgeworCXAgPSBza2lwdG93aGl0ZShhcmcpOworCWlmICgqcCAhPSBOVUwpCQkgICAgLyogcGFzdCBmaXJzdCB3b3JkICovCisJeworCSAgICB4cC0+eHBfcGF0dGVybiA9IHNraXB3aGl0ZShwKTsKKwkgICAgaWYgKCpza2lwdG93aGl0ZSh4cC0+eHBfcGF0dGVybikgIT0gTlVMKQorCQl4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCSAgICBlbHNlIGlmIChTVFJOSUNNUChhcmcsICJjYXNlIiwgcCAtIGFyZykgPT0gMCkKKwkJZXhwYW5kX3doYXQgPSBFWFBfQ0FTRTsKKwkgICAgZWxzZSBpZiAoICBTVFJOSUNNUChhcmcsICJrZXl3b3JkIiwgcCAtIGFyZykgPT0gMAorCQkgICAgfHwgU1RSTklDTVAoYXJnLCAicmVnaW9uIiwgcCAtIGFyZykgPT0gMAorCQkgICAgfHwgU1RSTklDTVAoYXJnLCAibWF0Y2giLCBwIC0gYXJnKSA9PSAwCisJCSAgICB8fCBTVFJOSUNNUChhcmcsICJsaXN0IiwgcCAtIGFyZykgPT0gMCkKKwkJeHAtPnhwX2NvbnRleHQgPSBFWFBBTkRfSElHSExJR0hUOworCSAgICBlbHNlCisJCXhwLT54cF9jb250ZXh0ID0gRVhQQU5EX05PVEhJTkc7CisJfQorICAgIH0KK30KKworc3RhdGljIGNoYXIgKihjYXNlX2FyZ3NbXSkgPSB7Im1hdGNoIiwgImlnbm9yZSIsIE5VTEx9OworCisvKgorICogRnVuY3Rpb24gZ2l2ZW4gdG8gRXhwYW5kR2VuZXJpYygpIHRvIG9idGFpbiB0aGUgbGlzdCBzeW50YXggbmFtZXMgZm9yCisgKiBleHBhbnNpb24uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGNoYXJfdSAqCitnZXRfc3ludGF4X25hbWUoeHAsIGlkeCkKKyAgICBleHBhbmRfVAkqeHA7CisgICAgaW50CQlpZHg7Cit7CisgICAgaWYgKGV4cGFuZF93aGF0ID09IEVYUF9TVUJDTUQpCisJcmV0dXJuIChjaGFyX3UgKilzdWJjb21tYW5kc1tpZHhdLm5hbWU7CisgICAgcmV0dXJuIChjaGFyX3UgKiljYXNlX2FyZ3NbaWR4XTsKK30KKworI2VuZGlmIC8qIEZFQVRfQ01ETF9DT01QTCAqLworCisjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoRkVBVF9QUklOVEVSKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZ1bmN0aW9uIGNhbGxlZCBmb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uOiBnZXQgc3ludGF4IElEIGF0IGZpbGUgcG9zaXRpb24uCisgKi8KKyAgICBpbnQKK3N5bl9nZXRfaWQobG51bSwgY29sLCB0cmFucykKKyAgICBsb25nCWxudW07CisgICAgbG9uZwljb2w7CisgICAgaW50CQl0cmFuczsJICAgIC8qIHJlbW92ZSB0cmFuc3BhcmFuY3kgKi8KK3sKKyAgICAvKiBXaGVuIHRoZSBwb3NpdGlvbiBpcyBub3QgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluIHRoZSBzYW1lCisgICAgICogbGluZSBvZiB0aGUgc2FtZSBidWZmZXIsIG5lZWQgdG8gcmVzdGFydCBwYXJzaW5nLiAqLworICAgIGlmIChjdXJ3aW4tPndfYnVmZmVyICE9IHN5bl9idWYKKwkgICAgfHwgbG51bSAhPSBjdXJyZW50X2xudW0KKwkgICAgfHwgY29sIDwgKGxvbmcpY3VycmVudF9jb2wpCisJc3ludGF4X3N0YXJ0KGN1cndpbiwgbG51bSk7CisKKyAgICAodm9pZClnZXRfc3ludGF4X2F0dHIoKGNvbG5yX1QpY29sKTsKKworICAgIHJldHVybiAodHJhbnMgPyBjdXJyZW50X3RyYW5zX2lkIDogY3VycmVudF9pZCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9GT0xESU5HKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZ1bmN0aW9uIGNhbGxlZCB0byBnZXQgZm9sZGluZyBsZXZlbCBmb3IgbGluZSAibG51bSIgaW4gd2luZG93ICJ3cCIuCisgKi8KKyAgICBpbnQKK3N5bl9nZXRfZm9sZGxldmVsKHdwLCBsbnVtKQorICAgIHdpbl9UCSp3cDsKKyAgICBsb25nCWxudW07Cit7CisgICAgaW50CQlsZXZlbCA9IDA7CisgICAgaW50CQlpOworCisgICAgLyogUmV0dXJuIHF1aWNrbHkgd2hlbiB0aGVyZSBhcmUgbm8gZm9sZCBpdGVtcyBhdCBhbGwuICovCisgICAgaWYgKHdwLT53X2J1ZmZlci0+Yl9zeW5fZm9sZGl0ZW1zICE9IDApCisgICAgeworCXN5bnRheF9zdGFydCh3cCwgbG51bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zdGF0ZS5nYV9sZW47ICsraSkKKwkgICAgaWYgKENVUl9TVEFURShpKS5zaV9mbGFncyAmIEhMX0ZPTEQpCisJCSsrbGV2ZWw7CisgICAgfQorICAgIGlmIChsZXZlbCA+IHdwLT53X3BfZmRuKQorCWxldmVsID0gd3AtPndfcF9mZG47CisgICAgcmV0dXJuIGxldmVsOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGRUFUX1NZTl9ITCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEhpZ2hsaWdodGluZyBzdHVmZgkJICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGRlZmF1bHQgaGlnaGxpZ2h0IGdyb3Vwcy4gIFRoZXNlIGFyZSBjb21waWxlZC1pbiBmb3IgZmFzdCBzdGFydHVwIGFuZAorICogdGhleSBzdGlsbCB3b3JrIHdoZW4gdGhlIHJ1bnRpbWUgZmlsZXMgY2FuJ3QgYmUgZm91bmQuCisgKiBXaGVuIG1ha2luZyBjaGFuZ2VzIGhlcmUsIGFsc28gY2hhbmdlIHJ1bnRpbWUvY29sb3JzL2RlZmF1bHQudmltIQorICovCitzdGF0aWMgY2hhciAqKGhpZ2hsaWdodF9pbml0X2JvdGhbXSkgPQorICAgIHsKKyNpZmRlZiBGRUFUX0dVSQorCSJDdXJzb3IgZ3VpYmc9ZmcgZ3VpZmc9YmciLAorCSJsQ3Vyc29yIGd1aWJnPWZnIGd1aWZnPWJnIiwJLyogc2hvdWxkIGJlIGRpZmZlcmVudCwgYnV0IHdoYXQ/ICovCisjZW5kaWYKKwkiRXJyb3JNc2cgdGVybT1zdGFuZG91dCBjdGVybWJnPURhcmtSZWQgY3Rlcm1mZz1XaGl0ZSBndWliZz1SZWQgZ3VpZmc9V2hpdGUiLAorCSJJbmNTZWFyY2ggdGVybT1yZXZlcnNlIGN0ZXJtPXJldmVyc2UgZ3VpPXJldmVyc2UiLAorCSJNb2RlTXNnIHRlcm09Ym9sZCBjdGVybT1ib2xkIGd1aT1ib2xkIiwKKwkiTm9uVGV4dCB0ZXJtPWJvbGQgY3Rlcm1mZz1CbHVlIGd1aT1ib2xkIGd1aWZnPUJsdWUiLAorCSJTdGF0dXNMaW5lIHRlcm09cmV2ZXJzZSxib2xkIGN0ZXJtPXJldmVyc2UsYm9sZCBndWk9cmV2ZXJzZSxib2xkIiwKKwkiU3RhdHVzTGluZU5DIHRlcm09cmV2ZXJzZSBjdGVybT1yZXZlcnNlIGd1aT1yZXZlcnNlIiwKKwkiVmVydFNwbGl0IHRlcm09cmV2ZXJzZSBjdGVybT1yZXZlcnNlIGd1aT1yZXZlcnNlIiwKKwkiVmlzdWFsIHRlcm09cmV2ZXJzZSBjdGVybT1yZXZlcnNlIGd1aT1yZXZlcnNlIGd1aWZnPUdyZXkgZ3VpYmc9ZmciLAorCSJWaXN1YWxOT1MgdGVybT11bmRlcmxpbmUsYm9sZCBjdGVybT11bmRlcmxpbmUsYm9sZCBndWk9dW5kZXJsaW5lLGJvbGQiLAorCSJEaWZmVGV4dCB0ZXJtPXJldmVyc2UgY3Rlcm09Ym9sZCBjdGVybWJnPVJlZCBndWk9Ym9sZCBndWliZz1SZWQiLAorCU5VTEwKKyAgICB9OworCitzdGF0aWMgY2hhciAqKGhpZ2hsaWdodF9pbml0X2xpZ2h0W10pID0KKyAgICB7CisJIkRpcmVjdG9yeSB0ZXJtPWJvbGQgY3Rlcm1mZz1EYXJrQmx1ZSBndWlmZz1CbHVlIiwKKwkiTGluZU5yIHRlcm09dW5kZXJsaW5lIGN0ZXJtZmc9QnJvd24gZ3VpZmc9QnJvd24iLAorCSJNb3JlTXNnIHRlcm09Ym9sZCBjdGVybWZnPURhcmtHcmVlbiBndWk9Ym9sZCBndWlmZz1TZWFHcmVlbiIsCisJIk5vcm1hbCBndWk9Tk9ORSIsCisJIlF1ZXN0aW9uIHRlcm09c3RhbmRvdXQgY3Rlcm1mZz1EYXJrR3JlZW4gZ3VpPWJvbGQgZ3VpZmc9U2VhR3JlZW4iLAorCSJTZWFyY2ggdGVybT1yZXZlcnNlIGN0ZXJtYmc9WWVsbG93IGN0ZXJtZmc9Tk9ORSBndWliZz1ZZWxsb3cgZ3VpZmc9Tk9ORSIsCisJIlNwZWNpYWxLZXkgdGVybT1ib2xkIGN0ZXJtZmc9RGFya0JsdWUgZ3VpZmc9Qmx1ZSIsCisJIlRpdGxlIHRlcm09Ym9sZCBjdGVybWZnPURhcmtNYWdlbnRhIGd1aT1ib2xkIGd1aWZnPU1hZ2VudGEiLAorCSJXYXJuaW5nTXNnIHRlcm09c3RhbmRvdXQgY3Rlcm1mZz1EYXJrUmVkIGd1aWZnPVJlZCIsCisJIldpbGRNZW51IHRlcm09c3RhbmRvdXQgY3Rlcm1iZz1ZZWxsb3cgY3Rlcm1mZz1CbGFjayBndWliZz1ZZWxsb3cgZ3VpZmc9QmxhY2siLAorCSJGb2xkZWQgdGVybT1zdGFuZG91dCBjdGVybWJnPUdyZXkgY3Rlcm1mZz1EYXJrQmx1ZSBndWliZz1MaWdodEdyZXkgZ3VpZmc9RGFya0JsdWUiLAorCSJGb2xkQ29sdW1uIHRlcm09c3RhbmRvdXQgY3Rlcm1iZz1HcmV5IGN0ZXJtZmc9RGFya0JsdWUgZ3VpYmc9R3JleSBndWlmZz1EYXJrQmx1ZSIsCisJIlNpZ25Db2x1bW4gdGVybT1zdGFuZG91dCBjdGVybWJnPUdyZXkgY3Rlcm1mZz1EYXJrQmx1ZSBndWliZz1HcmV5IGd1aWZnPURhcmtCbHVlIiwKKwkiRGlmZkFkZCB0ZXJtPWJvbGQgY3Rlcm1iZz1MaWdodEJsdWUgZ3VpYmc9TGlnaHRCbHVlIiwKKwkiRGlmZkNoYW5nZSB0ZXJtPWJvbGQgY3Rlcm1iZz1MaWdodE1hZ2VudGEgZ3VpYmc9TGlnaHRNYWdlbnRhIiwKKwkiRGlmZkRlbGV0ZSB0ZXJtPWJvbGQgY3Rlcm1mZz1CbHVlIGN0ZXJtYmc9TGlnaHRDeWFuIGd1aT1ib2xkIGd1aWZnPUJsdWUgZ3VpYmc9TGlnaHRDeWFuIiwKKwlOVUxMCisgICAgfTsKKworc3RhdGljIGNoYXIgKihoaWdobGlnaHRfaW5pdF9kYXJrW10pID0KKyAgICB7CisJIkRpcmVjdG9yeSB0ZXJtPWJvbGQgY3Rlcm1mZz1MaWdodEN5YW4gZ3VpZmc9Q3lhbiIsCisJIkxpbmVOciB0ZXJtPXVuZGVybGluZSBjdGVybWZnPVllbGxvdyBndWlmZz1ZZWxsb3ciLAorCSJNb3JlTXNnIHRlcm09Ym9sZCBjdGVybWZnPUxpZ2h0R3JlZW4gZ3VpPWJvbGQgZ3VpZmc9U2VhR3JlZW4iLAorCSJOb3JtYWwgZ3VpPU5PTkUiLAorCSJRdWVzdGlvbiB0ZXJtPXN0YW5kb3V0IGN0ZXJtZmc9TGlnaHRHcmVlbiBndWk9Ym9sZCBndWlmZz1HcmVlbiIsCisJIlNlYXJjaCB0ZXJtPXJldmVyc2UgY3Rlcm1iZz1ZZWxsb3cgY3Rlcm1mZz1CbGFjayBndWliZz1ZZWxsb3cgZ3VpZmc9QmxhY2siLAorCSJTcGVjaWFsS2V5IHRlcm09Ym9sZCBjdGVybWZnPUxpZ2h0Qmx1ZSBndWlmZz1DeWFuIiwKKwkiVGl0bGUgdGVybT1ib2xkIGN0ZXJtZmc9TGlnaHRNYWdlbnRhIGd1aT1ib2xkIGd1aWZnPU1hZ2VudGEiLAorCSJXYXJuaW5nTXNnIHRlcm09c3RhbmRvdXQgY3Rlcm1mZz1MaWdodFJlZCBndWlmZz1SZWQiLAorCSJXaWxkTWVudSB0ZXJtPXN0YW5kb3V0IGN0ZXJtYmc9WWVsbG93IGN0ZXJtZmc9QmxhY2sgZ3VpYmc9WWVsbG93IGd1aWZnPUJsYWNrIiwKKwkiRm9sZGVkIHRlcm09c3RhbmRvdXQgY3Rlcm1iZz1EYXJrR3JleSBjdGVybWZnPUN5YW4gZ3VpYmc9RGFya0dyZXkgZ3VpZmc9Q3lhbiIsCisJIkZvbGRDb2x1bW4gdGVybT1zdGFuZG91dCBjdGVybWJnPURhcmtHcmV5IGN0ZXJtZmc9Q3lhbiBndWliZz1HcmV5IGd1aWZnPUN5YW4iLAorCSJTaWduQ29sdW1uIHRlcm09c3RhbmRvdXQgY3Rlcm1iZz1EYXJrR3JleSBjdGVybWZnPUN5YW4gZ3VpYmc9R3JleSBndWlmZz1DeWFuIiwKKwkiRGlmZkFkZCB0ZXJtPWJvbGQgY3Rlcm1iZz1EYXJrQmx1ZSBndWliZz1EYXJrQmx1ZSIsCisJIkRpZmZDaGFuZ2UgdGVybT1ib2xkIGN0ZXJtYmc9RGFya01hZ2VudGEgZ3VpYmc9RGFya01hZ2VudGEiLAorCSJEaWZmRGVsZXRlIHRlcm09Ym9sZCBjdGVybWZnPUJsdWUgY3Rlcm1iZz1EYXJrQ3lhbiBndWk9Ym9sZCBndWlmZz1CbHVlIGd1aWJnPURhcmtDeWFuIiwKKwlOVUxMCisgICAgfTsKKworICAgIHZvaWQKK2luaXRfaGlnaGxpZ2h0KGJvdGgsIHJlc2V0KQorICAgIGludAkJYm90aDsJICAgIC8qIGluY2x1ZGUgZ3JvdXBzIHdoZXJlICdiZycgZG9lc24ndCBtYXR0ZXIgKi8KKyAgICBpbnQJCXJlc2V0OwkgICAgLyogY2xlYXIgZ3JvdXAgZmlyc3QgKi8KK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcgkqKnBwOworICAgIHN0YXRpYyBpbnQJaGFkX2JvdGggPSBGQUxTRTsKKyNpZmRlZiBGRUFUX0VWQUwKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKgorICAgICAqIFRyeSBmaW5kaW5nIHRoZSBjb2xvciBzY2hlbWUgZmlsZS4gIFVzZWQgd2hlbiBhIGNvbG9yIGZpbGUgd2FzIGxvYWRlZAorICAgICAqIGFuZCAnYmFja2dyb3VuZCcgb3IgJ3RfQ28nIGlzIGNoYW5nZWQuCisgICAgICovCisgICAgcCA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOmNvbG9yc19uYW1lIik7CisgICAgaWYgKHAgIT0gTlVMTCAmJiBsb2FkX2NvbG9ycyhwKSA9PSBPSykKKwlyZXR1cm47CisjZW5kaWYKKworICAgIC8qCisgICAgICogRGlkbid0IHVzZSBhIGNvbG9yIGZpbGUsIHVzZSB0aGUgY29tcGlsZWQtaW4gY29sb3JzLgorICAgICAqLworICAgIGlmIChib3RoKQorICAgIHsKKwloYWRfYm90aCA9IFRSVUU7CisJcHAgPSBoaWdobGlnaHRfaW5pdF9ib3RoOworCWZvciAoaSA9IDA7IHBwW2ldICE9IE5VTEw7ICsraSkKKwkgICAgZG9faGlnaGxpZ2h0KChjaGFyX3UgKilwcFtpXSwgcmVzZXQsIFRSVUUpOworICAgIH0KKyAgICBlbHNlIGlmICghaGFkX2JvdGgpCisJLyogRG9uJ3QgZG8gYW55dGhpbmcgYmVmb3JlIHRoZSBjYWxsIHdpdGggYm90aCA9PSBUUlVFIGZyb20gbWFpbigpLgorCSAqIE5vdCBldmVyeXRoaW5nIGhhcyBiZWVuIHNldHVwIHRoZW4sIGFuZCB0aGF0IGNhbGwgd2lsbCBvdmVycnVsZQorCSAqIGV2ZXJ5dGhpbmcgYW55d2F5LiAqLworCXJldHVybjsKKworICAgIGlmICgqcF9iZyA9PSAnbCcpCisJcHAgPSBoaWdobGlnaHRfaW5pdF9saWdodDsKKyAgICBlbHNlCisJcHAgPSBoaWdobGlnaHRfaW5pdF9kYXJrOworICAgIGZvciAoaSA9IDA7IHBwW2ldICE9IE5VTEw7ICsraSkKKwlkb19oaWdobGlnaHQoKGNoYXJfdSAqKXBwW2ldLCByZXNldCwgVFJVRSk7CisKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIC8qCisgICAgICogSWYgc3ludGF4IGhpZ2hsaWdodGluZyBpcyBlbmFibGVkIGxvYWQgdGhlIGhpZ2hsaWdodGluZyBmb3IgaXQuCisgICAgICovCisgICAgaWYgKGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOnN5bnRheF9vbiIpICE9IE5VTEwpCisJKHZvaWQpY21kX3J1bnRpbWUoKGNoYXJfdSAqKSJzeW50YXgvc3luY29sb3IudmltIiwgVFJVRSk7CisjZW5kaWYKK30KKworLyoKKyAqIExvYWQgY29sb3IgZmlsZSAicCIuCisgKiBSZXR1cm4gT0sgZm9yIHN1Y2Nlc3MsIEZBSUwgZm9yIGZhaWx1cmUuCisgKi8KKyAgICBpbnQKK2xvYWRfY29sb3JzKHApCisgICAgY2hhcl91CSpwOworeworICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJcmV0dmFsID0gRkFJTDsKKyAgICBzdGF0aWMgaW50CXJlY3Vyc2l2ZSA9IEZBTFNFOworCisgICAgLyogV2hlbiBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHksIHRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBzZXR0aW5nCisgICAgICogJ2JhY2tncm91bmQnIGNhdXNlZCB0aGUgaGlnaGxpZ2h0aW5nIHRvIGJlIHJlbG9hZGVkLiAgVGhpcyBtZWFucyBpdCBpcworICAgICAqIHdvcmtpbmcsIHRodXMgd2Ugc2hvdWxkIHJldHVybiBPSy4gKi8KKyAgICBpZiAocmVjdXJzaXZlKQorCXJldHVybiBPSzsKKworICAgIHJlY3Vyc2l2ZSA9IFRSVUU7CisgICAgYnVmID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4ocCkgKyAxMikpOworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICB7CisJc3ByaW50ZigoY2hhciAqKWJ1ZiwgImNvbG9ycy8lcy52aW0iLCBwKTsKKwlyZXR2YWwgPSBjbWRfcnVudGltZShidWYsIEZBTFNFKTsKKwl2aW1fZnJlZShidWYpOworICAgIH0KKyAgICByZWN1cnNpdmUgPSBGQUxTRTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlICI6aGlnaGxpZ2h0IC4uIiBjb21tYW5kLgorICogV2hlbiB1c2luZyAiOmhpIGNsZWFyIiB0aGlzIGlzIGNhbGxlZCByZWN1cnNpdmVseSBmb3IgZWFjaCBncm91cCB3aXRoCisgKiAiZm9yY2VpdCIgYW5kICJpbml0IiBib3RoIFRSVUUuCisgKi8KKyAgICB2b2lkCitkb19oaWdobGlnaHQobGluZSwgZm9yY2VpdCwgaW5pdCkKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgaW50CQlmb3JjZWl0OworICAgIGludAkJaW5pdDsJICAgIC8qIFRSVUUgd2hlbiBjYWxsZWQgZm9yIGluaXRpYWxpemluZyAqLworeworICAgIGNoYXJfdQkqbmFtZV9lbmQ7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqbGluZXA7CisgICAgY2hhcl91CSprZXlfc3RhcnQ7CisgICAgY2hhcl91CSphcmdfc3RhcnQ7CisgICAgY2hhcl91CSprZXkgPSBOVUxMLCAqYXJnID0gTlVMTDsKKyAgICBsb25nCWk7CisgICAgaW50CQlvZmY7CisgICAgaW50CQlsZW47CisgICAgaW50CQlhdHRyOworICAgIGludAkJaWQ7CisgICAgaW50CQlpZHg7CisgICAgaW50CQlkb2RlZmF1bHQgPSBGQUxTRTsKKyAgICBpbnQJCWRvY2xlYXIgPSBGQUxTRTsKKyAgICBpbnQJCWRvbGluayA9IEZBTFNFOworICAgIGludAkJZXJyb3IgPSBGQUxTRTsKKyAgICBpbnQJCWNvbG9yOworICAgIGludAkJaXNfbm9ybWFsX2dyb3VwID0gRkFMU0U7CS8qICJOb3JtYWwiIGdyb3VwICovCisjaWZkZWYgRkVBVF9HVUlfWDExCisgICAgaW50CQlpc19tZW51X2dyb3VwID0gRkFMU0U7CQkvKiAiTWVudSIgZ3JvdXAgKi8KKyAgICBpbnQJCWlzX3Njcm9sbGJhcl9ncm91cCA9IEZBTFNFOwkvKiAiU2Nyb2xsYmFyIiBncm91cCAqLworICAgIGludAkJaXNfdG9vbHRpcF9ncm91cCA9IEZBTFNFOwkvKiAiVG9vbHRpcCIgZ3JvdXAgKi8KKyAgICBpbnQJCWRvX2NvbG9ycyA9IEZBTFNFOwkJLyogbmVlZCB0byB1cGRhdGUgY29sb3JzPyAqLworI2Vsc2UKKyMgZGVmaW5lIGlzX21lbnVfZ3JvdXAgMAorIyBkZWZpbmUgaXNfdG9vbHRpcF9ncm91cCAwCisjZW5kaWYKKworICAgIC8qCisgICAgICogSWYgbm8gYXJndW1lbnQsIGxpc3QgY3VycmVudCBoaWdobGlnaHRpbmcuCisgICAgICovCisgICAgaWYgKGVuZHNfZXhjbWQoKmxpbmUpKQorICAgIHsKKwlmb3IgKGkgPSAxOyBpIDw9IGhpZ2hsaWdodF9nYS5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsraSkKKwkgICAgLyogVE9ETzogb25seSBjYWxsIHdoZW4gdGhlIGdyb3VwIGhhcyBhdHRyaWJ1dGVzIHNldCAqLworCSAgICBoaWdobGlnaHRfbGlzdF9vbmUoKGludClpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJc29sYXRlIHRoZSBuYW1lLgorICAgICAqLworICAgIG5hbWVfZW5kID0gc2tpcHRvd2hpdGUobGluZSk7CisgICAgbGluZXAgPSBza2lwd2hpdGUobmFtZV9lbmQpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgImRlZmF1bHQiIGFyZ3VtZW50LgorICAgICAqLworICAgIGlmIChTVFJOQ01QKGxpbmUsICJkZWZhdWx0IiwgbmFtZV9lbmQgLSBsaW5lKSA9PSAwKQorICAgIHsKKwlkb2RlZmF1bHQgPSBUUlVFOworCWxpbmUgPSBsaW5lcDsKKwluYW1lX2VuZCA9IHNraXB0b3doaXRlKGxpbmUpOworCWxpbmVwID0gc2tpcHdoaXRlKG5hbWVfZW5kKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciAiY2xlYXIiIG9yICJsaW5rIiBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBpZiAoU1RSTkNNUChsaW5lLCAiY2xlYXIiLCBuYW1lX2VuZCAtIGxpbmUpID09IDApCisJZG9jbGVhciA9IFRSVUU7CisgICAgaWYgKFNUUk5DTVAobGluZSwgImxpbmsiLCBuYW1lX2VuZCAtIGxpbmUpID09IDApCisJZG9saW5rID0gVFJVRTsKKworICAgIC8qCisgICAgICogIjpoaWdobGlnaHQge2dyb3VwLW5hbWV9IjogbGlzdCBoaWdobGlnaHRpbmcgZm9yIG9uZSBncm91cC4KKyAgICAgKi8KKyAgICBpZiAoIWRvY2xlYXIgJiYgIWRvbGluayAmJiBlbmRzX2V4Y21kKCpsaW5lcCkpCisgICAgeworCWlkID0gc3luX25hbWVuMmlkKGxpbmUsIChpbnQpKG5hbWVfZW5kIC0gbGluZSkpOworCWlmIChpZCA9PSAwKQorCSAgICBFTVNHMihfKCJFNDExOiBoaWdobGlnaHQgZ3JvdXAgbm90IGZvdW5kOiAlcyIpLCBsaW5lKTsKKwllbHNlCisJICAgIGhpZ2hsaWdodF9saXN0X29uZShpZCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogSGFuZGxlICI6aGlnaGxpZ2h0IGxpbmsge2Zyb219IHt0b30iIGNvbW1hbmQuCisgICAgICovCisgICAgaWYgKGRvbGluaykKKyAgICB7CisJY2hhcl91CSAgICAqZnJvbV9zdGFydCA9IGxpbmVwOworCWNoYXJfdQkgICAgKmZyb21fZW5kOworCWNoYXJfdQkgICAgKnRvX3N0YXJ0OworCWNoYXJfdQkgICAgKnRvX2VuZDsKKwlpbnQJICAgIGZyb21faWQ7CisJaW50CSAgICB0b19pZDsKKworCWZyb21fZW5kID0gc2tpcHRvd2hpdGUoZnJvbV9zdGFydCk7CisJdG9fc3RhcnQgPSBza2lwd2hpdGUoZnJvbV9lbmQpOworCXRvX2VuZAkgPSBza2lwdG93aGl0ZSh0b19zdGFydCk7CisKKwlpZiAoZW5kc19leGNtZCgqZnJvbV9zdGFydCkgfHwgZW5kc19leGNtZCgqdG9fc3RhcnQpKQorCXsKKwkgICAgRU1TRzIoXygiRTQxMjogTm90IGVub3VnaCBhcmd1bWVudHM6IFwiOmhpZ2hsaWdodCBsaW5rICVzXCIiKSwKKwkJCQkJCQkJICBmcm9tX3N0YXJ0KTsKKwkgICAgcmV0dXJuOworCX0KKworCWlmICghZW5kc19leGNtZCgqc2tpcHdoaXRlKHRvX2VuZCkpKQorCXsKKwkgICAgRU1TRzIoXygiRTQxMzogVG9vIG1hbnkgYXJndW1lbnRzOiBcIjpoaWdobGlnaHQgbGluayAlc1wiIiksIGZyb21fc3RhcnQpOworCSAgICByZXR1cm47CisJfQorCisJZnJvbV9pZCA9IHN5bl9jaGVja19ncm91cChmcm9tX3N0YXJ0LCAoaW50KShmcm9tX2VuZCAtIGZyb21fc3RhcnQpKTsKKwlpZiAoU1RSTkNNUCh0b19zdGFydCwgIk5PTkUiLCA0KSA9PSAwKQorCSAgICB0b19pZCA9IDA7CisJZWxzZQorCSAgICB0b19pZCA9IHN5bl9jaGVja19ncm91cCh0b19zdGFydCwgKGludCkodG9fZW5kIC0gdG9fc3RhcnQpKTsKKworCWlmIChmcm9tX2lkID4gMCAmJiAoIWluaXQgfHwgSExfVEFCTEUoKVtmcm9tX2lkIC0gMV0uc2dfc2V0ID09IDApKQorCXsKKwkgICAgLyoKKwkgICAgICogRG9uJ3QgYWxsb3cgYSBsaW5rIHdoZW4gdGhlcmUgYWxyZWFkeSBpcyBzb21lIGhpZ2hsaWdodGluZworCSAgICAgKiBmb3IgdGhlIGdyb3VwLCB1bmxlc3MgJyEnIGlzIHVzZWQKKwkgICAgICovCisJICAgIGlmICh0b19pZCA+IDAgJiYgIWZvcmNlaXQgJiYgIWluaXQKKwkJCQkgICAmJiBobF9oYXNfc2V0dGluZ3MoZnJvbV9pZCAtIDEsIGRvZGVmYXVsdCkpCisJICAgIHsKKwkJaWYgKHNvdXJjaW5nX25hbWUgPT0gTlVMTCAmJiAhZG9kZWZhdWx0KQorCQkgICAgRU1TRyhfKCJFNDE0OiBncm91cCBoYXMgc2V0dGluZ3MsIGhpZ2hsaWdodCBsaW5rIGlnbm9yZWQiKSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWlmICghaW5pdCkKKwkJICAgIEhMX1RBQkxFKClbZnJvbV9pZCAtIDFdLnNnX3NldCB8PSBTR19MSU5LOworCQlITF9UQUJMRSgpW2Zyb21faWQgLSAxXS5zZ19saW5rID0gdG9faWQ7CisJCXJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKKwkgICAgfQorCX0KKworCS8qIE9ubHkgY2FsbCBoaWdobGlnaHRfY2hhbmdlZCgpIG9uY2UsIGFmdGVyIHNvdXJjaW5nIGEgc3ludGF4IGZpbGUgKi8KKwluZWVkX2hpZ2hsaWdodF9jaGFuZ2VkID0gVFJVRTsKKworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZG9jbGVhcikKKyAgICB7CisJLyoKKwkgKiAiOmhpZ2hsaWdodCBjbGVhciBbZ3JvdXBdIiBjb21tYW5kLgorCSAqLworCWxpbmUgPSBsaW5lcDsKKwlpZiAoZW5kc19leGNtZCgqbGluZSkpCisJeworI2lmZGVmIEZFQVRfR1VJCisJICAgIC8qIEZpcnN0LCB3ZSBkbyBub3QgZGVzdHJveSB0aGUgb2xkIHZhbHVlcywgYnV0IGFsbG9jYXRlIHRoZSBuZXcKKwkgICAgICogb25lcyBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5LiBUSEVOIHdlIGRlc3Ryb3kgdGhlIG9sZCB2YWx1ZXMuCisJICAgICAqIElmIHdlIGRlc3Ryb3kgdGhlIG9sZCB2YWx1ZXMgZmlyc3QsIHRoZW4gdGhlIG9sZCB2YWx1ZXMKKwkgICAgICogKHN1Y2ggYXMgR3VpRm9udCdzIG9yIEd1aUZvbnRzZXQncykgd2lsbCBzdGlsbCBiZSBkaXNwbGF5ZWQgYnV0CisJICAgICAqIGludmFsaWQgYmVjYXVzZSB0aGV5IHdlcmUgZnJlZSdkLgorCSAgICAgKi8KKwkgICAgaWYgKGd1aS5pbl91c2UpCisJICAgIHsKKyMgaWZkZWYgRkVBVF9CRVZBTF9USVAKKwkJZ3VpX2luaXRfdG9vbHRpcF9mb250KCk7CisjIGVuZGlmCisjIGlmIGRlZmluZWQoRkVBVF9NRU5VKSAmJiAoZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpKQorCQlndWlfaW5pdF9tZW51X2ZvbnQoKTsKKyMgZW5kaWYKKwkgICAgfQorIyBpZiBkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1gxMSkKKwkgICAgZ3VpX21jaF9kZWZfY29sb3JzKCk7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfR1VJX1gxMQorIyAgaWZkZWYgRkVBVF9NRU5VCisKKwkgICAgLyogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgd2hlbiB0aGVyZSBpcyBubyBNZW51IGhpZ2hsaWdodAorCSAgICAgKiBncm91cCBkZWZpbmVkIGJ5IGRlZmF1bHQsIHdoaWNoIElTIGN1cnJlbnRseSB0aGUgY2FzZS4KKwkgICAgICovCisJICAgIGd1aV9tY2hfbmV3X21lbnVfY29sb3JzKCk7CisjICBlbmRpZgorCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkgICAgeworCQlndWlfbmV3X3Njcm9sbGJhcl9jb2xvcnMoKTsKKyMgIGlmZGVmIEZFQVRfQkVWQUwKKwkJZ3VpX21jaF9uZXdfdG9vbHRpcF9jb2xvcnMoKTsKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX01FTlUKKwkJZ3VpX21jaF9uZXdfbWVudV9mb250KCk7CisjICBlbmRpZgorCSAgICB9CisjIGVuZGlmCisKKwkgICAgLyogT2ssIHdlJ3JlIGRvbmUgYWxsb2NhdGluZyB0aGUgbmV3IGRlZmF1bHQgZ3JhcGhpY3MgaXRlbXMuCisJICAgICAqIFRoZSBzY3JlZW4gc2hvdWxkIGFscmVhZHkgYmUgcmVmcmVzaGVkIGF0IHRoaXMgcG9pbnQuCisJICAgICAqIEl0IGlzIG5vdyBPayB0byBjbGVhciBvdXQgdGhlIG9sZCBkYXRhLgorCSAgICAgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfRVZBTAorCSAgICBkb191bmxldCgoY2hhcl91ICopImNvbG9yc19uYW1lIik7CisjZW5kaWYKKwkgICAgcmVzdG9yZV9jdGVybV9jb2xvcnMoKTsKKworCSAgICAvKgorCSAgICAgKiBDbGVhciBhbGwgZGVmYXVsdCBoaWdobGlnaHQgZ3JvdXBzIGFuZCBsb2FkIHRoZSBkZWZhdWx0cy4KKwkgICAgICovCisJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgaGlnaGxpZ2h0X2dhLmdhX2xlbjsgKytpZHgpCisJCWhpZ2hsaWdodF9jbGVhcihpZHgpOworCSAgICBpbml0X2hpZ2hsaWdodChUUlVFLCBUUlVFKTsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkJaGlnaGxpZ2h0X2d1aV9zdGFydGVkKCk7CisjZW5kaWYKKwkgICAgaGlnaGxpZ2h0X2NoYW5nZWQoKTsKKwkgICAgcmVkcmF3X2xhdGVyX2NsZWFyKCk7CisJICAgIHJldHVybjsKKwl9CisJbmFtZV9lbmQgPSBza2lwdG93aGl0ZShsaW5lKTsKKwlsaW5lcCA9IHNraXB3aGl0ZShuYW1lX2VuZCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBncm91cCBuYW1lIGluIHRoZSB0YWJsZS4gIElmIGl0IGRvZXMgbm90IGV4aXN0IHlldCwgYWRkIGl0LgorICAgICAqLworICAgIGlkID0gc3luX2NoZWNrX2dyb3VwKGxpbmUsIChpbnQpKG5hbWVfZW5kIC0gbGluZSkpOworICAgIGlmIChpZCA9PSAwKQkJCS8qIGZhaWxlZCAob3V0IG9mIG1lbW9yeSkgKi8KKwlyZXR1cm47CisgICAgaWR4ID0gaWQgLSAxOwkJCS8qIGluZGV4IGlzIElEIG1pbnVzIG9uZSAqLworCisgICAgLyogUmV0dXJuIGlmICJkZWZhdWx0IiB3YXMgdXNlZCBhbmQgdGhlIGdyb3VwIGFscmVhZHkgaGFzIHNldHRpbmdzLiAqLworICAgIGlmIChkb2RlZmF1bHQgJiYgaGxfaGFzX3NldHRpbmdzKGlkeCwgVFJVRSkpCisJcmV0dXJuOworCisgICAgaWYgKFNUUkNNUChITF9UQUJMRSgpW2lkeF0uc2dfbmFtZV91LCAiTk9STUFMIikgPT0gMCkKKwlpc19ub3JtYWxfZ3JvdXAgPSBUUlVFOworI2lmZGVmIEZFQVRfR1VJX1gxMQorICAgIGVsc2UgaWYgKFNUUkNNUChITF9UQUJMRSgpW2lkeF0uc2dfbmFtZV91LCAiTUVOVSIpID09IDApCisJaXNfbWVudV9ncm91cCA9IFRSVUU7CisgICAgZWxzZSBpZiAoU1RSQ01QKEhMX1RBQkxFKClbaWR4XS5zZ19uYW1lX3UsICJTQ1JPTExCQVIiKSA9PSAwKQorCWlzX3Njcm9sbGJhcl9ncm91cCA9IFRSVUU7CisgICAgZWxzZSBpZiAoU1RSQ01QKEhMX1RBQkxFKClbaWR4XS5zZ19uYW1lX3UsICJUT09MVElQIikgPT0gMCkKKwlpc190b29sdGlwX2dyb3VwID0gVFJVRTsKKyNlbmRpZgorCisgICAgLyogQ2xlYXIgdGhlIGhpZ2hsaWdodGluZyBmb3IgIjpoaSBjbGVhciB7Z3JvdXB9IiBhbmQgIjpoaSBjbGVhciIuICovCisgICAgaWYgKGRvY2xlYXIgfHwgKGZvcmNlaXQgJiYgaW5pdCkpCisgICAgeworCWhpZ2hsaWdodF9jbGVhcihpZHgpOworCWlmICghZG9jbGVhcikKKwkgICAgSExfVEFCTEUoKVtpZHhdLnNnX3NldCA9IDA7CisgICAgfQorCisgICAgaWYgKCFkb2NsZWFyKQorICAgICAgd2hpbGUgKCFlbmRzX2V4Y21kKCpsaW5lcCkpCisgICAgICB7CisJa2V5X3N0YXJ0ID0gbGluZXA7CisJaWYgKCpsaW5lcCA9PSAnPScpCisJeworCSAgICBFTVNHMihfKCJFNDE1OiB1bmV4cGVjdGVkIGVxdWFsIHNpZ246ICVzIiksIGtleV9zdGFydCk7CisJICAgIGVycm9yID0gVFJVRTsKKwkgICAgYnJlYWs7CisJfQorCisJLyoKKwkgKiBJc29sYXRlIHRoZSBrZXkgKCJ0ZXJtIiwgImN0ZXJtZmciLCAiY3Rlcm1iZyIsICJmb250IiwgImd1aWZnIiBvcgorCSAqICJndWliZyIpLgorCSAqLworCXdoaWxlICgqbGluZXAgJiYgIXZpbV9pc3doaXRlKCpsaW5lcCkgJiYgKmxpbmVwICE9ICc9JykKKwkgICAgKytsaW5lcDsKKwl2aW1fZnJlZShrZXkpOworCWtleSA9IHZpbV9zdHJuc2F2ZV91cChrZXlfc3RhcnQsIChpbnQpKGxpbmVwIC0ga2V5X3N0YXJ0KSk7CisJaWYgKGtleSA9PSBOVUxMKQorCXsKKwkgICAgZXJyb3IgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisJbGluZXAgPSBza2lwd2hpdGUobGluZXApOworCisJaWYgKFNUUkNNUChrZXksICJOT05FIikgPT0gMCkKKwl7CisJICAgIGlmICghaW5pdCB8fCBITF9UQUJMRSgpW2lkeF0uc2dfc2V0ID09IDApCisJICAgIHsKKwkJaWYgKCFpbml0KQorCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX3NldCB8PSBTR19URVJNK1NHX0NURVJNK1NHX0dVSTsKKwkJaGlnaGxpZ2h0X2NsZWFyKGlkeCk7CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGVxdWFsIHNpZ24uCisJICovCisJaWYgKCpsaW5lcCAhPSAnPScpCisJeworCSAgICBFTVNHMihfKCJFNDE2OiBtaXNzaW5nIGVxdWFsIHNpZ246ICVzIiksIGtleV9zdGFydCk7CisJICAgIGVycm9yID0gVFJVRTsKKwkgICAgYnJlYWs7CisJfQorCSsrbGluZXA7CisKKwkvKgorCSAqIElzb2xhdGUgdGhlIGFyZ3VtZW50LgorCSAqLworCWxpbmVwID0gc2tpcHdoaXRlKGxpbmVwKTsKKwlpZiAoKmxpbmVwID09ICdcJycpCQkvKiBndWlmZz0nY29sb3IgbmFtZScgKi8KKwl7CisJICAgIGFyZ19zdGFydCA9ICsrbGluZXA7CisJICAgIGxpbmVwID0gdmltX3N0cmNocihsaW5lcCwgJ1wnJyk7CisJICAgIGlmIChsaW5lcCA9PSBOVUxMKQorCSAgICB7CisJCUVNU0cyKF8oZV9pbnZhcmcyKSwga2V5X3N0YXJ0KTsKKwkJZXJyb3IgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBhcmdfc3RhcnQgPSBsaW5lcDsKKwkgICAgbGluZXAgPSBza2lwdG93aGl0ZShsaW5lcCk7CisJfQorCWlmIChsaW5lcCA9PSBhcmdfc3RhcnQpCisJeworCSAgICBFTVNHMihfKCJFNDE3OiBtaXNzaW5nIGFyZ3VtZW50OiAlcyIpLCBrZXlfc3RhcnQpOworCSAgICBlcnJvciA9IFRSVUU7CisJICAgIGJyZWFrOworCX0KKwl2aW1fZnJlZShhcmcpOworCWFyZyA9IHZpbV9zdHJuc2F2ZShhcmdfc3RhcnQsIChpbnQpKGxpbmVwIC0gYXJnX3N0YXJ0KSk7CisJaWYgKGFyZyA9PSBOVUxMKQorCXsKKwkgICAgZXJyb3IgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisJaWYgKCpsaW5lcCA9PSAnXCcnKQorCSAgICArK2xpbmVwOworCisJLyoKKwkgKiBTdG9yZSB0aGUgYXJndW1lbnQuCisJICovCisJaWYgKCAgU1RSQ01QKGtleSwgIlRFUk0iKSA9PSAwCisJCXx8IFNUUkNNUChrZXksICJDVEVSTSIpID09IDAKKwkJfHwgU1RSQ01QKGtleSwgIkdVSSIpID09IDApCisJeworCSAgICBhdHRyID0gMDsKKwkgICAgb2ZmID0gMDsKKwkgICAgd2hpbGUgKGFyZ1tvZmZdICE9IE5VTCkKKwkgICAgeworCQlmb3IgKGkgPSBzaXplb2YoaGxfYXR0cl90YWJsZSkgLyBzaXplb2YoaW50KTsgLS1pID49IDA7ICkKKwkJeworCQkgICAgbGVuID0gKGludClTVFJMRU4oaGxfbmFtZV90YWJsZVtpXSk7CisJCSAgICBpZiAoU1RSTklDTVAoYXJnICsgb2ZmLCBobF9uYW1lX3RhYmxlW2ldLCBsZW4pID09IDApCisJCSAgICB7CisJCQlhdHRyIHw9IGhsX2F0dHJfdGFibGVbaV07CisJCQlvZmYgKz0gbGVuOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYgKGkgPCAwKQorCQl7CisJCSAgICBFTVNHMihfKCJFNDE4OiBJbGxlZ2FsIHZhbHVlOiAlcyIpLCBhcmcpOworCQkgICAgZXJyb3IgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKGFyZ1tvZmZdID09ICcsJykJCS8qIGFub3RoZXIgb25lIGZvbGxvd3MgKi8KKwkJICAgICsrb2ZmOworCSAgICB9CisJICAgIGlmIChlcnJvcikKKwkJYnJlYWs7CisJICAgIGlmICgqa2V5ID09ICdUJykKKwkgICAgeworCQlpZiAoIWluaXQgfHwgIShITF9UQUJMRSgpW2lkeF0uc2dfc2V0ICYgU0dfVEVSTSkpCisJCXsKKwkJICAgIGlmICghaW5pdCkKKwkJCUhMX1RBQkxFKClbaWR4XS5zZ19zZXQgfD0gU0dfVEVSTTsKKwkJICAgIEhMX1RBQkxFKClbaWR4XS5zZ190ZXJtID0gYXR0cjsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgaWYgKCprZXkgPT0gJ0MnKQorCSAgICB7CisJCWlmICghaW5pdCB8fCAhKEhMX1RBQkxFKClbaWR4XS5zZ19zZXQgJiBTR19DVEVSTSkpCisJCXsKKwkJICAgIGlmICghaW5pdCkKKwkJCUhMX1RBQkxFKClbaWR4XS5zZ19zZXQgfD0gU0dfQ1RFUk07CisJCSAgICBITF9UQUJMRSgpW2lkeF0uc2dfY3Rlcm0gPSBhdHRyOworCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2JvbGQgPSBGQUxTRTsKKwkJfQorCSAgICB9CisjaWZkZWYgRkVBVF9HVUkKKwkgICAgZWxzZQorCSAgICB7CisJCWlmICghaW5pdCB8fCAhKEhMX1RBQkxFKClbaWR4XS5zZ19zZXQgJiBTR19HVUkpKQorCQl7CisJCSAgICBpZiAoIWluaXQpCisJCQlITF9UQUJMRSgpW2lkeF0uc2dfc2V0IHw9IFNHX0dVSTsKKwkJICAgIEhMX1RBQkxFKClbaWR4XS5zZ19ndWkgPSBhdHRyOworCQl9CisJICAgIH0KKyNlbmRpZgorCX0KKwllbHNlIGlmIChTVFJDTVAoa2V5LCAiRk9OVCIpID09IDApCisJeworCSAgICAvKiBpbiBub24tR1VJIGZvbnRzIGFyZSBzaW1wbHkgaWdub3JlZCAqLworI2lmZGVmIEZFQVRfR1VJCisJICAgIGlmICghZ3VpLnNoZWxsX2NyZWF0ZWQpCisJICAgIHsKKwkJLyogR1VJIG5vdCBzdGFydGVkIHlldCwgYWx3YXlzIGFjY2VwdCB0aGUgbmFtZS4gKi8KKwkJdmltX2ZyZWUoSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRfbmFtZSk7CisJCUhMX1RBQkxFKClbaWR4XS5zZ19mb250X25hbWUgPSB2aW1fc3Ryc2F2ZShhcmcpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlHdWlGb250IHRlbXBfc2dfZm9udCA9IEhMX1RBQkxFKClbaWR4XS5zZ19mb250OworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisJCUd1aUZvbnRzZXQgdGVtcF9zZ19mb250c2V0ID0gSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQ7CisjIGVuZGlmCisJCS8qIEZpcnN0LCBzYXZlIHRoZSBjdXJyZW50IGZvbnQvZm9udHNldC4KKwkJICogVGhlbiB0cnkgdG8gYWxsb2NhdGUgdGhlIGZvbnQvZm9udHNldC4KKwkJICogSWYgdGhlIGFsbG9jYXRpb24gZmFpbHMsIEhMX1RBQkxFKClbaWR4XS5zZ19mb250IE9SCisJCSAqIHNnX2ZvbnRzZXQgd2lsbCBiZSBzZXQgdG8gTk9GT05UIG9yIE5PRk9OVFNFVCByZXNwZWN0aXZlbHkuCisJCSAqLworCisJCUhMX1RBQkxFKClbaWR4XS5zZ19mb250ID0gTk9GT05UOworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisJCUhMX1RBQkxFKClbaWR4XS5zZ19mb250c2V0ID0gTk9GT05UU0VUOworIyBlbmRpZgorCQlobF9kb19mb250KGlkeCwgYXJnLCBpc19ub3JtYWxfZ3JvdXAsIGlzX21lbnVfZ3JvdXAsCisJCQkJCQkJICAgIGlzX3Rvb2x0aXBfZ3JvdXApOworCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwkJaWYgKEhMX1RBQkxFKClbaWR4XS5zZ19mb250c2V0ICE9IE5PRk9OVFNFVCkKKwkJeworCQkgICAgLyogTmV3IGZvbnRzZXQgd2FzIGFjY2VwdGVkLiBGcmVlIHRoZSBvbGQgb25lLCBpZiB0aGVyZSB3YXMKKwkJICAgICAqIG9uZS4KKwkJICAgICAqLworCQkgICAgZ3VpX21jaF9mcmVlX2ZvbnRzZXQodGVtcF9zZ19mb250c2V0KTsKKwkJICAgIHZpbV9mcmVlKEhMX1RBQkxFKClbaWR4XS5zZ19mb250X25hbWUpOworCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRfbmFtZSA9IHZpbV9zdHJzYXZlKGFyZyk7CisJCX0KKwkJZWxzZQorCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQgPSB0ZW1wX3NnX2ZvbnRzZXQ7CisjIGVuZGlmCisJCWlmIChITF9UQUJMRSgpW2lkeF0uc2dfZm9udCAhPSBOT0ZPTlQpCisJCXsKKwkJICAgIC8qIE5ldyBmb250IHdhcyBhY2NlcHRlZC4gRnJlZSB0aGUgb2xkIG9uZSwgaWYgdGhlcmUgd2FzCisJCSAgICAgKiBvbmUuCisJCSAgICAgKi8KKwkJICAgIGd1aV9tY2hfZnJlZV9mb250KHRlbXBfc2dfZm9udCk7CisJCSAgICB2aW1fZnJlZShITF9UQUJMRSgpW2lkeF0uc2dfZm9udF9uYW1lKTsKKwkJICAgIEhMX1RBQkxFKClbaWR4XS5zZ19mb250X25hbWUgPSB2aW1fc3Ryc2F2ZShhcmcpOworCQl9CisJCWVsc2UKKwkJICAgIEhMX1RBQkxFKClbaWR4XS5zZ19mb250ID0gdGVtcF9zZ19mb250OworCSAgICB9CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoU1RSQ01QKGtleSwgIkNURVJNRkciKSA9PSAwIHx8IFNUUkNNUChrZXksICJDVEVSTUJHIikgPT0gMCkKKwl7CisJICBpZiAoIWluaXQgfHwgIShITF9UQUJMRSgpW2lkeF0uc2dfc2V0ICYgU0dfQ1RFUk0pKQorCSAgeworCSAgICBpZiAoIWluaXQpCisJCUhMX1RBQkxFKClbaWR4XS5zZ19zZXQgfD0gU0dfQ1RFUk07CisKKwkgICAgLyogV2hlbiBzZXR0aW5nIHRoZSBmb3JlZ3JvdW5kIGNvbG9yLCBhbmQgcHJldmlvdXNseSB0aGUgImJvbGQiCisJICAgICAqIGZsYWcgd2FzIHNldCBmb3IgYSBsaWdodCBjb2xvciwgcmVzZXQgaXQgbm93ICovCisJICAgIGlmIChrZXlbNV0gPT0gJ0YnICYmIEhMX1RBQkxFKClbaWR4XS5zZ19jdGVybV9ib2xkKQorCSAgICB7CisJCUhMX1RBQkxFKClbaWR4XS5zZ19jdGVybSAmPSB+SExfQk9MRDsKKwkJSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2JvbGQgPSBGQUxTRTsKKwkgICAgfQorCisJICAgIGlmIChWSU1fSVNESUdJVCgqYXJnKSkKKwkJY29sb3IgPSBhdG9pKChjaGFyICopYXJnKTsKKwkgICAgZWxzZSBpZiAoU1RSSUNNUChhcmcsICJmZyIpID09IDApCisJICAgIHsKKwkJaWYgKGN0ZXJtX25vcm1hbF9mZ19jb2xvcikKKwkJICAgIGNvbG9yID0gY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yIC0gMTsKKwkJZWxzZQorCQl7CisJCSAgICBFTVNHKF8oIkU0MTk6IEZHIGNvbG9yIHVua25vd24iKSk7CisJCSAgICBlcnJvciA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUklDTVAoYXJnLCAiYmciKSA9PSAwKQorCSAgICB7CisJCWlmIChjdGVybV9ub3JtYWxfYmdfY29sb3IgPiAwKQorCQkgICAgY29sb3IgPSBjdGVybV9ub3JtYWxfYmdfY29sb3IgLSAxOworCQllbHNlCisJCXsKKwkJICAgIEVNU0coXygiRTQyMDogQkcgY29sb3IgdW5rbm93biIpKTsKKwkJICAgIGVycm9yID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXN0YXRpYyBjaGFyICooY29sb3JfbmFtZXNbMjhdKSA9IHsKKwkJCSAgICAiQmxhY2siLCAiRGFya0JsdWUiLCAiRGFya0dyZWVuIiwgIkRhcmtDeWFuIiwKKwkJCSAgICAiRGFya1JlZCIsICJEYXJrTWFnZW50YSIsICJCcm93biIsICJEYXJrWWVsbG93IiwKKwkJCSAgICAiR3JheSIsICJHcmV5IiwKKwkJCSAgICAiTGlnaHRHcmF5IiwgIkxpZ2h0R3JleSIsICJEYXJrR3JheSIsICJEYXJrR3JleSIsCisJCQkgICAgIkJsdWUiLCAiTGlnaHRCbHVlIiwgIkdyZWVuIiwgIkxpZ2h0R3JlZW4iLAorCQkJICAgICJDeWFuIiwgIkxpZ2h0Q3lhbiIsICJSZWQiLCAiTGlnaHRSZWQiLCAiTWFnZW50YSIsCisJCQkgICAgIkxpZ2h0TWFnZW50YSIsICJZZWxsb3ciLCAiTGlnaHRZZWxsb3ciLCAiV2hpdGUiLCAiTk9ORSJ9OworCQlzdGF0aWMgaW50IGNvbG9yX251bWJlcnNfMTZbMjhdID0gezAsIDEsIDIsIDMsCisJCQkJCQkgNCwgNSwgNiwgNiwKKwkJCQkJCSA3LCA3LAorCQkJCQkJIDcsIDcsIDgsIDgsCisJCQkJCQkgOSwgOSwgMTAsIDEwLAorCQkJCQkJIDExLCAxMSwgMTIsIDEyLCAxMywKKwkJCQkJCSAxMywgMTQsIDE0LCAxNSwgLTF9OworCQkvKiBmb3IgeHRlcm0gd2l0aCA4OCBjb2xvcnMuLi4gKi8KKwkJc3RhdGljIGludCBjb2xvcl9udW1iZXJzXzg4WzI4XSA9IHswLCA0LCAyLCA2LAorCQkJCQkJIDEsIDUsIDMyLCA3MiwKKwkJCQkJCSA4NCwgODQsCisJCQkJCQkgNywgNywgODIsIDgyLAorCQkJCQkJIDEyLCA0MywgMTAsIDYxLAorCQkJCQkJIDE0LCA2MywgOSwgNzQsIDEzLAorCQkJCQkJIDc1LCAxMSwgNzgsIDE1LCAtMX07CisJCS8qIGZvciB4dGVybSB3aXRoIDI1NiBjb2xvcnMuLi4gKi8KKwkJc3RhdGljIGludCBjb2xvcl9udW1iZXJzXzI1NlsyOF0gPSB7MCwgNCwgMiwgNiwKKwkJCQkJCSAxLCA1LCAxMzAsIDEzMCwKKwkJCQkJCSAyNDgsIDI0OCwKKwkJCQkJCSA3LCA3LCAyNDIsIDI0MiwKKwkJCQkJCSAxMiwgODEsIDEwLCAxMjEsCisJCQkJCQkgMTQsIDE1OSwgOSwgMjI0LCAxMywKKwkJCQkJCSAyMjUsIDExLCAyMjksIDE1LCAtMX07CisJCS8qIGZvciB0ZXJtaW5hbHMgd2l0aCBsZXNzIHRoYW4gMTYgY29sb3JzLi4uICovCisJCXN0YXRpYyBpbnQgY29sb3JfbnVtYmVyc184WzI4XSA9IHswLCA0LCAyLCA2LAorCQkJCQkJIDEsIDUsIDMsIDMsCisJCQkJCQkgNywgNywKKwkJCQkJCSA3LCA3LCAwKzgsIDArOCwKKwkJCQkJCSA0KzgsIDQrOCwgMis4LCAyKzgsCisJCQkJCQkgNis4LCA2KzgsIDErOCwgMSs4LCA1KzgsCisJCQkJCQkgNSs4LCAzKzgsIDMrOCwgNys4LCAtMX07CisjaWYgZGVmaW5lZChfX1FOWE5UT19fKQorCQlzdGF0aWMgaW50ICpjb2xvcl9udW1iZXJzXzhfcWFuc2kgPSBjb2xvcl9udW1iZXJzXzg7CisJCS8qIE9uIHFueCwgdGhlIDggJiAxNiBjb2xvciBhcnJheXMgYXJlIHRoZSBzYW1lICovCisJCWlmIChTVFJOQ01QKFRfTkFNRSwgInFhbnNpIiwgNSkgPT0gMCkKKwkJICAgIGNvbG9yX251bWJlcnNfOF9xYW5zaSA9IGNvbG9yX251bWJlcnNfMTY7CisjZW5kaWYKKworCQkvKiByZWR1Y2UgY2FsbHMgdG8gU1RSSUNNUCBhIGJpdCwgaXQgY2FuIGJlIHNsb3cgKi8KKwkJb2ZmID0gVE9VUFBFUl9BU0MoKmFyZyk7CisJCWZvciAoaSA9IChzaXplb2YoY29sb3JfbmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpOyAtLWkgPj0gMDsgKQorCQkgICAgaWYgKG9mZiA9PSBjb2xvcl9uYW1lc1tpXVswXQorCQkJCSAmJiBTVFJJQ01QKGFyZyArIDEsIGNvbG9yX25hbWVzW2ldICsgMSkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoaSA8IDApCisJCXsKKwkJICAgIEVNU0cyKF8oIkU0MjE6IENvbG9yIG5hbWUgb3IgbnVtYmVyIG5vdCByZWNvZ25pemVkOiAlcyIpLCBrZXlfc3RhcnQpOworCQkgICAgZXJyb3IgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKworCQkvKiBVc2UgdGhlIF8xNiB0YWJsZSB0byBjaGVjayBpZiBpdHMgYSB2YWxpZCBjb2xvciBuYW1lLiAqLworCQljb2xvciA9IGNvbG9yX251bWJlcnNfMTZbaV07CisJCWlmIChjb2xvciA+PSAwKQorCQl7CisJCSAgICBpZiAodF9jb2xvcnMgPT0gOCkKKwkJICAgIHsKKwkJCS8qIHRfQ28gaXMgODogdXNlIHRoZSA4IGNvbG9ycyB0YWJsZSAqLworI2lmIGRlZmluZWQoX19RTlhOVE9fXykKKwkJCWNvbG9yID0gY29sb3JfbnVtYmVyc184X3FhbnNpW2ldOworI2Vsc2UKKwkJCWNvbG9yID0gY29sb3JfbnVtYmVyc184W2ldOworI2VuZGlmCisJCQlpZiAoa2V5WzVdID09ICdGJykKKwkJCXsKKwkJCSAgICAvKiBzZXQvcmVzZXQgYm9sZCBhdHRyaWJ1dGUgdG8gZ2V0IGxpZ2h0IGZvcmVncm91bmQKKwkJCSAgICAgKiBjb2xvcnMgKG9uIHNvbWUgdGVybWluYWxzLCBlLmcuICJsaW51eCIpICovCisJCQkgICAgaWYgKGNvbG9yICYgOCkKKwkJCSAgICB7CisJCQkJSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtIHw9IEhMX0JPTEQ7CisJCQkJSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2JvbGQgPSBUUlVFOworCQkJICAgIH0KKwkJCSAgICBlbHNlCisJCQkJSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtICY9IH5ITF9CT0xEOworCQkJfQorCQkJY29sb3IgJj0gNzsJLyogdHJ1bmNhdGUgdG8gOCBjb2xvcnMgKi8KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKHRfY29sb3JzID09IDE2IHx8IHRfY29sb3JzID09IDg4CisJCQkJCQkJICAgfHwgdF9jb2xvcnMgPT0gMjU2KQorCQkgICAgeworCQkJLyoKKwkJCSAqIEd1ZXNzOiBpZiB0aGUgdGVybWNhcCBlbnRyeSBlbmRzIGluICdtJywgaXQgaXMKKwkJCSAqIHByb2JhYmx5IGFuIHh0ZXJtLWxpa2UgdGVybWluYWwuICBVc2UgdGhlIGNoYW5nZWQKKwkJCSAqIG9yZGVyIGZvciBjb2xvcnMuCisJCQkgKi8KKwkJCWlmICgqVF9DQUYgIT0gTlVMKQorCQkJICAgIHAgPSBUX0NBRjsKKwkJCWVsc2UKKwkJCSAgICBwID0gVF9DU0Y7CisJCQlpZiAoKnAgIT0gTlVMICYmICoocCArIFNUUkxFTihwKSAtIDEpID09ICdtJykKKwkJCSAgICBzd2l0Y2ggKHRfY29sb3JzKQorCQkJICAgIHsKKwkJCQljYXNlIDE2OgorCQkJCSAgICBjb2xvciA9IGNvbG9yX251bWJlcnNfOFtpXTsKKwkJCQkgICAgYnJlYWs7CisJCQkJY2FzZSA4ODoKKwkJCQkgICAgY29sb3IgPSBjb2xvcl9udW1iZXJzXzg4W2ldOworCQkJCSAgICBicmVhazsKKwkJCQljYXNlIDI1NjoKKwkJCQkgICAgY29sb3IgPSBjb2xvcl9udW1iZXJzXzI1NltpXTsKKwkJCQkgICAgYnJlYWs7CisJCQkgICAgfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgLyogQWRkIG9uZSB0byB0aGUgYXJndW1lbnQsIHRvIGF2b2lkIHplcm8gKi8KKwkgICAgaWYgKGtleVs1XSA9PSAnRicpCisJICAgIHsKKwkJSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2ZnID0gY29sb3IgKyAxOworCQlpZiAoaXNfbm9ybWFsX2dyb3VwKQorCQl7CisJCSAgICBjdGVybV9ub3JtYWxfZmdfY29sb3IgPSBjb2xvciArIDE7CisJCSAgICBjdGVybV9ub3JtYWxfZmdfYm9sZCA9IChITF9UQUJMRSgpW2lkeF0uc2dfY3Rlcm0gJiBITF9CT0xEKTsKKyNpZmRlZiBGRUFUX0dVSQorCQkgICAgLyogRG9uJ3QgZG8gdGhpcyBpZiB0aGUgR1VJIGlzIHVzZWQuICovCisJCSAgICBpZiAoIWd1aS5pbl91c2UgJiYgIWd1aS5zdGFydGluZykKKyNlbmRpZgorCQkgICAgeworCQkJbXVzdF9yZWRyYXcgPSBDTEVBUjsKKwkJCWlmICh0ZXJtY2FwX2FjdGl2ZSkKKwkJCSAgICB0ZXJtX2ZnX2NvbG9yKGNvbG9yKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlITF9UQUJMRSgpW2lkeF0uc2dfY3Rlcm1fYmcgPSBjb2xvciArIDE7CisJCWlmIChpc19ub3JtYWxfZ3JvdXApCisJCXsKKwkJICAgIGN0ZXJtX25vcm1hbF9iZ19jb2xvciA9IGNvbG9yICsgMTsKKyNpZmRlZiBGRUFUX0dVSQorCQkgICAgLyogRG9uJ3QgbWVzcyB3aXRoICdiYWNrZ3JvdW5kJyBpZiB0aGUgR1VJIGlzIHVzZWQuICovCisJCSAgICBpZiAoIWd1aS5pbl91c2UgJiYgIWd1aS5zdGFydGluZykKKyNlbmRpZgorCQkgICAgeworCQkJbXVzdF9yZWRyYXcgPSBDTEVBUjsKKwkJCWlmICh0ZXJtY2FwX2FjdGl2ZSkKKwkJCSAgICB0ZXJtX2JnX2NvbG9yKGNvbG9yKTsKKwkJCWlmICh0X2NvbG9ycyA8IDE2KQorCQkJICAgIGkgPSAoY29sb3IgPT0gMCB8fCBjb2xvciA9PSA0KTsKKwkJCWVsc2UKKwkJCSAgICBpID0gKGNvbG9yIDwgNyB8fCBjb2xvciA9PSA4KTsKKwkJCS8qIFNldCB0aGUgJ2JhY2tncm91bmQnIG9wdGlvbiBpZiB0aGUgdmFsdWUgaXMgd3JvbmcuICovCisJCQlpZiAoaSAhPSAoKnBfYmcgPT0gJ2QnKSkKKwkJCSAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikiYmciLCAwTCwKKwkJCQkgaSA/IChjaGFyX3UgKikiZGFyayIgOiAoY2hhcl91ICopImxpZ2h0IiwgMCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgfQorCX0KKwllbHNlIGlmIChTVFJDTVAoa2V5LCAiR1VJRkciKSA9PSAwKQorCXsKKyNpZmRlZiBGRUFUX0dVSQkgICAgLyogaW4gbm9uLUdVSSBndWlmZyBjb2xvcnMgYXJlIHNpbXBseSBpZ25vcmVkICovCisJICBpZiAoIWluaXQgfHwgIShITF9UQUJMRSgpW2lkeF0uc2dfc2V0ICYgU0dfR1VJKSkKKwkgIHsKKwkgICAgaWYgKCFpbml0KQorCQlITF9UQUJMRSgpW2lkeF0uc2dfc2V0IHw9IFNHX0dVSTsKKworCSAgICBpID0gY29sb3JfbmFtZTJoYW5kbGUoYXJnKTsKKwkgICAgaWYgKGkgIT0gSU5WQUxDT0xPUiB8fCBTVFJDTVAoYXJnLCAiTk9ORSIpID09IDAgfHwgIWd1aS5pbl91c2UpCisJICAgIHsKKwkJSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9mZyA9IGk7CisJCXZpbV9mcmVlKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmdfbmFtZSk7CisJCWlmIChTVFJDTVAoYXJnLCAiTk9ORSIpKQorCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9mZ19uYW1lID0gdmltX3N0cnNhdmUoYXJnKTsKKwkJZWxzZQorCQkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9mZ19uYW1lID0gTlVMTDsKKyMgaWZkZWYgRkVBVF9HVUlfWDExCisJCWlmIChpc19tZW51X2dyb3VwKQorCQkgICAgZ3VpLm1lbnVfZmdfcGl4ZWwgPSBpOworCQlpZiAoaXNfc2Nyb2xsYmFyX2dyb3VwKQorCQkgICAgZ3VpLnNjcm9sbF9mZ19waXhlbCA9IGk7CisjICBpZmRlZiBGRUFUX0JFVkFMCisJCWlmIChpc190b29sdGlwX2dyb3VwKQorCQkgICAgZ3VpLnRvb2x0aXBfZmdfcGl4ZWwgPSBpOworIyAgZW5kaWYKKwkJZG9fY29sb3JzID0gVFJVRTsKKyMgZW5kaWYKKwkgICAgfQorCSAgfQorI2VuZGlmCisJfQorCWVsc2UgaWYgKFNUUkNNUChrZXksICJHVUlCRyIpID09IDApCisJeworI2lmZGVmIEZFQVRfR1VJCSAgICAvKiBpbiBub24tR1VJIGd1aWJnIGNvbG9ycyBhcmUgc2ltcGx5IGlnbm9yZWQgKi8KKwkgIGlmICghaW5pdCB8fCAhKEhMX1RBQkxFKClbaWR4XS5zZ19zZXQgJiBTR19HVUkpKQorCSAgeworCSAgICBpZiAoIWluaXQpCisJCUhMX1RBQkxFKClbaWR4XS5zZ19zZXQgfD0gU0dfR1VJOworCisJICAgIGkgPSBjb2xvcl9uYW1lMmhhbmRsZShhcmcpOworCSAgICBpZiAoaSAhPSBJTlZBTENPTE9SIHx8IFNUUkNNUChhcmcsICJOT05FIikgPT0gMCB8fCAhZ3VpLmluX3VzZSkKKwkgICAgeworCQlITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2JnID0gaTsKKwkJdmltX2ZyZWUoSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9iZ19uYW1lKTsKKwkJaWYgKFNUUkNNUChhcmcsICJOT05FIikpCisJCSAgICBITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2JnX25hbWUgPSB2aW1fc3Ryc2F2ZShhcmcpOworCQllbHNlCisJCSAgICBITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2JnX25hbWUgPSBOVUxMOworIyBpZmRlZiBGRUFUX0dVSV9YMTEKKwkJaWYgKGlzX21lbnVfZ3JvdXApCisJCSAgICBndWkubWVudV9iZ19waXhlbCA9IGk7CisJCWlmIChpc19zY3JvbGxiYXJfZ3JvdXApCisJCSAgICBndWkuc2Nyb2xsX2JnX3BpeGVsID0gaTsKKyMgIGlmZGVmIEZFQVRfQkVWQUwKKwkJaWYgKGlzX3Rvb2x0aXBfZ3JvdXApCisJCSAgICBndWkudG9vbHRpcF9iZ19waXhlbCA9IGk7CisjICBlbmRpZgorCQlkb19jb2xvcnMgPSBUUlVFOworIyBlbmRpZgorCSAgICB9CisJICB9CisjZW5kaWYKKwl9CisJZWxzZSBpZiAoU1RSQ01QKGtleSwgIlNUQVJUIikgPT0gMCB8fCBTVFJDTVAoa2V5LCAiU1RPUCIpID09IDApCisJeworCSAgICBjaGFyX3UJYnVmWzEwMF07CisJICAgIGNoYXJfdQkqdG5hbWU7CisKKwkgICAgaWYgKCFpbml0KQorCQlITF9UQUJMRSgpW2lkeF0uc2dfc2V0IHw9IFNHX1RFUk07CisKKwkgICAgLyoKKwkgICAgICogVGhlICJzdGFydCIgYW5kICJzdG9wIiAgYXJndW1lbnRzIGNhbiBiZSBhIGxpdGVyYWwgZXNjYXBlCisJICAgICAqIHNlcXVlbmNlLCBvciBhIGNvbW1hIHNlcGVyYXRlZCBsaXN0IG9mIHRlcm1pbmFsIGNvZGVzLgorCSAgICAgKi8KKwkgICAgaWYgKFNUUk5DTVAoYXJnLCAidF8iLCAyKSA9PSAwKQorCSAgICB7CisJCW9mZiA9IDA7CisJCWJ1ZlswXSA9IDA7CisJCXdoaWxlIChhcmdbb2ZmXSAhPSBOVUwpCisJCXsKKwkJICAgIC8qIElzb2xhdGUgb25lIHRlcm1jYXAgbmFtZSAqLworCQkgICAgZm9yIChsZW4gPSAwOyBhcmdbb2ZmICsgbGVuXSAmJgorCQkJCQkJIGFyZ1tvZmYgKyBsZW5dICE9ICcsJzsgKytsZW4pCisJCQk7CisJCSAgICB0bmFtZSA9IHZpbV9zdHJuc2F2ZShhcmcgKyBvZmYsIGxlbik7CisJCSAgICBpZiAodG5hbWUgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJICAgIHsKKwkJCWVycm9yID0gVFJVRTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgLyogbG9va3VwIHRoZSBlc2NhcGUgc2VxdWVuY2UgZm9yIHRoZSBpdGVtICovCisJCSAgICBwID0gZ2V0X3Rlcm1fY29kZSh0bmFtZSk7CisJCSAgICB2aW1fZnJlZSh0bmFtZSk7CisJCSAgICBpZiAocCA9PSBOVUxMKQkgICAgLyogaWdub3JlIG5vbi1leGlzdGluZyB0aGluZ3MgKi8KKwkJCXAgPSAoY2hhcl91ICopIiI7CisKKwkJICAgIC8qIEFwcGVuZCBpdCB0byB0aGUgYWxyZWFkeSBmb3VuZCBzdHVmZiAqLworCQkgICAgaWYgKChpbnQpKFNUUkxFTihidWYpICsgU1RSTEVOKHApKSA+PSA5OSkKKwkJICAgIHsKKwkJCUVNU0cyKF8oIkU0MjI6IHRlcm1pbmFsIGNvZGUgdG9vIGxvbmc6ICVzIiksIGFyZyk7CisJCQllcnJvciA9IFRSVUU7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIFNUUkNBVChidWYsIHApOworCisJCSAgICAvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGl0ZW0gKi8KKwkJICAgIG9mZiArPSBsZW47CisJCSAgICBpZiAoYXJnW29mZl0gPT0gJywnKQkgICAgLyogYW5vdGhlciBvbmUgZm9sbG93cyAqLworCQkJKytvZmY7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJICogQ29weSBjaGFyYWN0ZXJzIGZyb20gYXJnW10gdG8gYnVmW10sIHRyYW5zbGF0aW5nIDw+IGNvZGVzLgorCQkgKi8KKwkJZm9yIChwID0gYXJnLCBvZmYgPSAwOyBvZmYgPCAxMDAgJiYgKnA7ICkKKwkJeworCQkgICAgbGVuID0gdHJhbnNfc3BlY2lhbCgmcCwgYnVmICsgb2ZmLCBGQUxTRSk7CisJCSAgICBpZiAobGVuKQkJICAgIC8qIHJlY29nbml6ZWQgc3BlY2lhbCBjaGFyICovCisJCQlvZmYgKz0gbGVuOworCQkgICAgZWxzZQkJICAgIC8qIGNvcHkgYXMgbm9ybWFsIGNoYXIgKi8KKwkJCWJ1ZltvZmYrK10gPSAqcCsrOworCQl9CisJCWJ1ZltvZmZdID0gTlVMOworCSAgICB9CisJICAgIGlmIChlcnJvcikKKwkJYnJlYWs7CisKKwkgICAgaWYgKFNUUkNNUChidWYsICJOT05FIikgPT0gMCkJLyogcmVzZXR0aW5nIHRoZSB2YWx1ZSAqLworCQlwID0gTlVMTDsKKwkgICAgZWxzZQorCQlwID0gdmltX3N0cnNhdmUoYnVmKTsKKwkgICAgaWYgKGtleVsyXSA9PSAnQScpCisJICAgIHsKKwkJdmltX2ZyZWUoSExfVEFCTEUoKVtpZHhdLnNnX3N0YXJ0KTsKKwkJSExfVEFCTEUoKVtpZHhdLnNnX3N0YXJ0ID0gcDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJdmltX2ZyZWUoSExfVEFCTEUoKVtpZHhdLnNnX3N0b3ApOworCQlITF9UQUJMRSgpW2lkeF0uc2dfc3RvcCA9IHA7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgRU1TRzIoXygiRTQyMzogSWxsZWdhbCBhcmd1bWVudDogJXMiKSwga2V5X3N0YXJ0KTsKKwkgICAgZXJyb3IgPSBUUlVFOworCSAgICBicmVhazsKKwl9CisKKwkvKgorCSAqIFdoZW4gaGlnaGxpZ2h0aW5nIGhhcyBiZWVuIGdpdmVuIGZvciBhIGdyb3VwLCBkb24ndCBsaW5rIGl0LgorCSAqLworCWlmICghaW5pdCB8fCAhKEhMX1RBQkxFKClbaWR4XS5zZ19zZXQgJiBTR19MSU5LKSkKKwkgICAgSExfVEFCTEUoKVtpZHhdLnNnX2xpbmsgPSAwOworCisJLyoKKwkgKiBDb250aW51ZSB3aXRoIG5leHQgYXJndW1lbnQuCisJICovCisJbGluZXAgPSBza2lwd2hpdGUobGluZXApOworICAgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgYW5kIGl0J3MgYSBuZXcgZW50cnksIHJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBpZiAoZXJyb3IgJiYgaWR4ID09IGhpZ2hsaWdodF9nYS5nYV9sZW4pCisJc3luX3VuYWRkX2dyb3VwKCk7CisgICAgZWxzZQorICAgIHsKKwlpZiAoaXNfbm9ybWFsX2dyb3VwKQorCXsKKwkgICAgSExfVEFCTEUoKVtpZHhdLnNnX3Rlcm1fYXR0ciA9IDA7CisJICAgIEhMX1RBQkxFKClbaWR4XS5zZ19jdGVybV9hdHRyID0gMDsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICBITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2F0dHIgPSAwOworCSAgICAvKgorCSAgICAgKiBOZWVkIHRvIHVwZGF0ZSBhbGwgZ3JvdXBzLCBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNpbmcgImJnIgorCSAgICAgKiBhbmQvb3IgImZnIiwgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgbm93LgorCSAgICAgKi8KKwkgICAgaWYgKGd1aS5pbl91c2UpCisJCWhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOworI2VuZGlmCisJfQorI2lmZGVmIEZFQVRfR1VJX1gxMQorIyBpZmRlZiBGRUFUX01FTlUKKwllbHNlIGlmIChpc19tZW51X2dyb3VwKQorCXsKKwkgICAgaWYgKGd1aS5pbl91c2UgJiYgZG9fY29sb3JzKQorCQlndWlfbWNoX25ld19tZW51X2NvbG9ycygpOworCX0KKyMgZW5kaWYKKwllbHNlIGlmIChpc19zY3JvbGxiYXJfZ3JvdXApCisJeworCSAgICBpZiAoZ3VpLmluX3VzZSAmJiBkb19jb2xvcnMpCisJCWd1aV9uZXdfc2Nyb2xsYmFyX2NvbG9ycygpOworCX0KKyMgaWZkZWYgRkVBVF9CRVZBTAorCWVsc2UgaWYgKGlzX3Rvb2x0aXBfZ3JvdXApCisJeworCSAgICBpZiAoZ3VpLmluX3VzZSAmJiBkb19jb2xvcnMpCisJCWd1aV9tY2hfbmV3X3Rvb2x0aXBfY29sb3JzKCk7CisJfQorIyBlbmRpZgorI2VuZGlmCisJZWxzZQorCSAgICBzZXRfaGxfYXR0cihpZHgpOworCXJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKKyAgICB9CisgICAgdmltX2ZyZWUoa2V5KTsKKyAgICB2aW1fZnJlZShhcmcpOworCisgICAgLyogT25seSBjYWxsIGhpZ2hsaWdodF9jaGFuZ2VkKCkgb25jZSwgYWZ0ZXIgc291cmNpbmcgYSBzeW50YXggZmlsZSAqLworICAgIG5lZWRfaGlnaGxpZ2h0X2NoYW5nZWQgPSBUUlVFOworfQorCisvKgorICogUmVzZXQgdGhlIGN0ZXJtIGNvbG9ycyB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgVmltIHdhcyBzdGFydGVkLCBpZgorICogcG9zc2libGUuICBPdGhlcndpc2UgcmVzZXQgdGhlbSB0byB6ZXJvLgorICovCisgICAgdm9pZAorcmVzdG9yZV9jdGVybV9jb2xvcnMoKQoreworI2lmIGRlZmluZWQoTVNET1MpIHx8IChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikpCisgICAgLyogU2luY2UgdF9tZSBoYXMgYmVlbiBzZXQsIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdXNlcgorICAgICAqIHdhbnRzIHRvIHVzZSB0aGlzIGFzIGRlZmF1bHQgY29sb3JzLiAgTmVlZCB0byByZXNldCBkZWZhdWx0CisgICAgICogYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9ycy4gKi8KKyAgICBtY2hfc2V0X25vcm1hbF9jb2xvcnMoKTsKKyNlbHNlCisgICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gMDsKKyAgICBjdGVybV9ub3JtYWxfZmdfYm9sZCA9IDA7CisgICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gMDsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgaGlnaGxpZ2h0IGdyb3VwICJpZHgiIGhhcyBhbnkgc2V0dGluZ3MuCisgKiBXaGVuICJjaGVja19saW5rIiBpcyBUUlVFIGFsc28gY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGxpbmsuCisgKi8KKyAgICBzdGF0aWMgaW50CitobF9oYXNfc2V0dGluZ3MoaWR4LCBjaGVja19saW5rKQorICAgIGludAkJaWR4OworICAgIGludAkJY2hlY2tfbGluazsKK3sKKyAgICByZXR1cm4gKCAgIEhMX1RBQkxFKClbaWR4XS5zZ190ZXJtX2F0dHIgIT0gMAorCSAgICB8fCBITF9UQUJMRSgpW2lkeF0uc2dfY3Rlcm1fYXR0ciAhPSAwCisjaWZkZWYgRkVBVF9HVUkKKwkgICAgfHwgSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9hdHRyICE9IDAKKyNlbmRpZgorCSAgICB8fCAoY2hlY2tfbGluayAmJiAoSExfVEFCTEUoKVtpZHhdLnNnX3NldCAmIFNHX0xJTkspKSk7Cit9CisKKy8qCisgKiBDbGVhciBoaWdobGlnaHRpbmcgZm9yIG9uZSBncm91cC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitoaWdobGlnaHRfY2xlYXIoaWR4KQorICAgIGludCBpZHg7Cit7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX3Rlcm0gPSAwOworICAgIHZpbV9mcmVlKEhMX1RBQkxFKClbaWR4XS5zZ19zdGFydCk7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX3N0YXJ0ID0gTlVMTDsKKyAgICB2aW1fZnJlZShITF9UQUJMRSgpW2lkeF0uc2dfc3RvcCk7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX3N0b3AgPSBOVUxMOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ190ZXJtX2F0dHIgPSAwOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19jdGVybSA9IDA7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2JvbGQgPSBGQUxTRTsKKyAgICBITF9UQUJMRSgpW2lkeF0uc2dfY3Rlcm1fZmcgPSAwOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19jdGVybV9iZyA9IDA7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX2N0ZXJtX2F0dHIgPSAwOworI2lmZGVmIEZFQVRfR1VJCSAgICAvKiBpbiBub24tR1VJIGZvbnRzIGFyZSBzaW1wbHkgaWdub3JlZCAqLworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19ndWkgPSAwOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmcgPSBJTlZBTENPTE9SOworICAgIHZpbV9mcmVlKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmdfbmFtZSk7CisgICAgSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9mZ19uYW1lID0gTlVMTDsKKyAgICBITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2JnID0gSU5WQUxDT0xPUjsKKyAgICB2aW1fZnJlZShITF9UQUJMRSgpW2lkeF0uc2dfZ3VpX2JnX25hbWUpOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYmdfbmFtZSA9IE5VTEw7CisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnQpOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19mb250ID0gTk9GT05UOworIyBpZmRlZiBGRUFUX1hGT05UU0VUCisgICAgZ3VpX21jaF9mcmVlX2ZvbnRzZXQoSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQpOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19mb250c2V0ID0gTk9GT05UU0VUOworIyBlbmRpZgorICAgIHZpbV9mcmVlKEhMX1RBQkxFKClbaWR4XS5zZ19mb250X25hbWUpOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19mb250X25hbWUgPSBOVUxMOworICAgIEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYXR0ciA9IDA7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU2V0IHRoZSBub3JtYWwgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgYWNjb3JkaW5nIHRvIHRoZSAiTm9ybWFsIgorICogaGlnaGxpZ2hpZ2h0aW5nIGdyb3VwLiAgRm9yIFgxMSBhbHNvIHNldCAiTWVudSIsICJTY3JvbGxiYXIiLCBhbmQKKyAqICJUb29sdGlwIiBjb2xvcnMuCisgKi8KKyAgICB2b2lkCitzZXRfbm9ybWFsX2NvbG9ycygpCit7CisgICAgaWYgKHNldF9ncm91cF9jb2xvcnMoKGNoYXJfdSAqKSJOb3JtYWwiLAorCQkJICAgICAgICZndWkubm9ybV9waXhlbCwgJmd1aS5iYWNrX3BpeGVsLCBGQUxTRSwgVFJVRSwKKwkJCSAgICAgICBGQUxTRSkpCisgICAgeworCWd1aV9tY2hfbmV3X2NvbG9ycygpOworCW11c3RfcmVkcmF3ID0gQ0xFQVI7CisgICAgfQorI2lmZGVmIEZFQVRfR1VJX1gxMQorICAgIGlmIChzZXRfZ3JvdXBfY29sb3JzKChjaGFyX3UgKikiTWVudSIsCisJCQkgJmd1aS5tZW51X2ZnX3BpeGVsLCAmZ3VpLm1lbnVfYmdfcGl4ZWwsIFRSVUUsIEZBTFNFLAorCQkJIEZBTFNFKSkKKyAgICB7CisjIGlmZGVmIEZFQVRfTUVOVQorCWd1aV9tY2hfbmV3X21lbnVfY29sb3JzKCk7CisjIGVuZGlmCisJbXVzdF9yZWRyYXcgPSBDTEVBUjsKKyAgICB9CisjIGlmZGVmIEZFQVRfQkVWQUwKKyAgICBpZiAoc2V0X2dyb3VwX2NvbG9ycygoY2hhcl91ICopIlRvb2x0aXAiLAorCQkJICZndWkudG9vbHRpcF9mZ19waXhlbCwgJmd1aS50b29sdGlwX2JnX3BpeGVsLAorCQkJIEZBTFNFLCBGQUxTRSwgVFJVRSkpCisgICAgeworIyBpZmRlZiBGRUFUX1RPT0xCQVIKKwlndWlfbWNoX25ld190b29sdGlwX2NvbG9ycygpOworIyBlbmRpZgorCW11c3RfcmVkcmF3ID0gQ0xFQVI7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNldF9ncm91cF9jb2xvcnMoKGNoYXJfdSAqKSJTY3JvbGxiYXIiLAorCQkgICAgJmd1aS5zY3JvbGxfZmdfcGl4ZWwsICZndWkuc2Nyb2xsX2JnX3BpeGVsLCBGQUxTRSwgRkFMU0UsCisJCSAgICBGQUxTRSkpCisgICAgeworCWd1aV9uZXdfc2Nyb2xsYmFyX2NvbG9ycygpOworCW11c3RfcmVkcmF3ID0gQ0xFQVI7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBTZXQgdGhlIGNvbG9ycyBmb3IgIk5vcm1hbCIsICJNZW51IiwgIlRvb2x0aXAiIG9yICJTY3JvbGxiYXIiLgorICovCisgICAgc3RhdGljIGludAorc2V0X2dyb3VwX2NvbG9ycyhuYW1lLCBmZ3AsIGJncCwgZG9fbWVudSwgdXNlX25vcm0sIGRvX3Rvb2x0aXApCisgICAgY2hhcl91CSpuYW1lOworICAgIGd1aWNvbG9yX1QJKmZncDsKKyAgICBndWljb2xvcl9UCSpiZ3A7CisgICAgaW50CQlkb19tZW51OworICAgIGludAkJdXNlX25vcm07CisgICAgaW50CQlkb190b29sdGlwOworeworICAgIGludAkJaWR4OworCisgICAgaWR4ID0gc3luX25hbWUyaWQobmFtZSkgLSAxOworICAgIGlmIChpZHggPj0gMCkKKyAgICB7CisJZ3VpX2RvX29uZV9jb2xvcihpZHgsIGRvX21lbnUsIGRvX3Rvb2x0aXApOworCisJaWYgKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmcgIT0gSU5WQUxDT0xPUikKKwkgICAgKmZncCA9IEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmc7CisJZWxzZSBpZiAodXNlX25vcm0pCisJICAgICpmZ3AgPSBndWkuZGVmX25vcm1fcGl4ZWw7CisJaWYgKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYmcgIT0gSU5WQUxDT0xPUikKKwkgICAgKmJncCA9IEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYmc7CisJZWxzZSBpZiAodXNlX25vcm0pCisJICAgICpiZ3AgPSBndWkuZGVmX2JhY2tfcGl4ZWw7CisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIEdldCB0aGUgZm9udCBvZiB0aGUgIk5vcm1hbCIgZ3JvdXAuCisgKiBSZXR1cm5zICIiIHdoZW4gaXQncyBub3QgZm91bmQgb3Igbm90IHNldC4KKyAqLworICAgIGNoYXJfdSAqCitobF9nZXRfZm9udF9uYW1lKCkKK3sKKyAgICBpbnQJCWlkOworICAgIGNoYXJfdQkqczsKKworICAgIGlkID0gc3luX25hbWUyaWQoKGNoYXJfdSAqKSJOb3JtYWwiKTsKKyAgICBpZiAoaWQgPiAwKQorICAgIHsKKwlzID0gSExfVEFCTEUoKVtpZCAtIDFdLnNnX2ZvbnRfbmFtZTsKKwlpZiAocyAhPSBOVUxMKQorCSAgICByZXR1cm4gczsKKyAgICB9CisgICAgcmV0dXJuIChjaGFyX3UgKikiIjsKK30KKworLyoKKyAqIFNldCBmb250IGZvciAiTm9ybWFsIiBncm91cC4gIENhbGxlZCBieSBndWlfbWNoX2luaXRfZm9udCgpIHdoZW4gYSBmb250IGhhcworICogYWN0dWFsbHkgY2hvc2VuIHRvIGJlIHVzZWQuCisgKi8KKyAgICB2b2lkCitobF9zZXRfZm9udF9uYW1lKGZvbnRfbmFtZSkKKyAgICBjaGFyX3UJKmZvbnRfbmFtZTsKK3sKKyAgICBpbnQJICAgIGlkOworCisgICAgaWQgPSBzeW5fbmFtZTJpZCgoY2hhcl91ICopIk5vcm1hbCIpOworICAgIGlmIChpZCA+IDApCisgICAgeworCXZpbV9mcmVlKEhMX1RBQkxFKClbaWQgLSAxXS5zZ19mb250X25hbWUpOworCUhMX1RBQkxFKClbaWQgLSAxXS5zZ19mb250X25hbWUgPSB2aW1fc3Ryc2F2ZShmb250X25hbWUpOworICAgIH0KK30KKworLyoKKyAqIFNldCBiYWNrZ3JvdW5kIGNvbG9yIGZvciAiTm9ybWFsIiBncm91cC4gIENhbGxlZCBieSBndWlfc2V0X2JnX2NvbG9yKCkKKyAqIHdoZW4gdGhlIGNvbG9yIGlzIGtub3duLgorICovCisgICAgdm9pZAoraGxfc2V0X2JnX2NvbG9yX25hbWUobmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOwkgICAgLyogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkICovCit7CisgICAgaW50CSAgICBpZDsKKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworCWlkID0gc3luX25hbWUyaWQoKGNoYXJfdSAqKSJOb3JtYWwiKTsKKwlpZiAoaWQgPiAwKQorCXsKKwkgICAgdmltX2ZyZWUoSExfVEFCTEUoKVtpZCAtIDFdLnNnX2d1aV9iZ19uYW1lKTsKKwkgICAgSExfVEFCTEUoKVtpZCAtIDFdLnNnX2d1aV9iZ19uYW1lID0gbmFtZTsKKwl9CisgICAgfQorfQorCisvKgorICogU2V0IGZvcmVncm91bmQgY29sb3IgZm9yICJOb3JtYWwiIGdyb3VwLiAgQ2FsbGVkIGJ5IGd1aV9zZXRfZmdfY29sb3IoKQorICogd2hlbiB0aGUgY29sb3IgaXMga25vd24uCisgKi8KKyAgICB2b2lkCitobF9zZXRfZmdfY29sb3JfbmFtZShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7CSAgICAvKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgKi8KK3sKKyAgICBpbnQJICAgIGlkOworCisgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB7CisJaWQgPSBzeW5fbmFtZTJpZCgoY2hhcl91ICopIk5vcm1hbCIpOworCWlmIChpZCA+IDApCisJeworCSAgICB2aW1fZnJlZShITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpX2ZnX25hbWUpOworCSAgICBITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpX2ZnX25hbWUgPSBuYW1lOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhbmRsZSBmb3IgYSBjb2xvciBuYW1lLgorICogUmV0dXJucyBJTlZBTENPTE9SIHdoZW4gZmFpbGVkLgorICovCisgICAgc3RhdGljIGd1aWNvbG9yX1QKK2NvbG9yX25hbWUyaGFuZGxlKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICBpZiAoU1RSQ01QKG5hbWUsICJOT05FIikgPT0gMCkKKwlyZXR1cm4gSU5WQUxDT0xPUjsKKworICAgIGlmIChTVFJJQ01QKG5hbWUsICJmZyIpID09IDAgfHwgU1RSSUNNUChuYW1lLCAiZm9yZWdyb3VuZCIpID09IDApCisJcmV0dXJuIGd1aS5ub3JtX3BpeGVsOworICAgIGlmIChTVFJJQ01QKG5hbWUsICJiZyIpID09IDAgfHwgU1RSSUNNUChuYW1lLCAiYmFja2dyb3VuZCIpID09IDApCisJcmV0dXJuIGd1aS5iYWNrX3BpeGVsOworCisgICAgcmV0dXJuIGd1aV9nZXRfY29sb3IobmFtZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhbmRsZSBmb3IgYSBmb250IG5hbWUuCisgKiBSZXR1cm5zIE5PRk9OVCB3aGVuIGZhaWxlZC4KKyAqLworICAgIHN0YXRpYyBHdWlGb250Citmb250X25hbWUyaGFuZGxlKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICBpZiAoU1RSQ01QKG5hbWUsICJOT05FIikgPT0gMCkKKwlyZXR1cm4gTk9GT05UOworCisgICAgcmV0dXJuIGd1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgVFJVRSk7Cit9CisKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorLyoKKyAqIFJldHVybiB0aGUgaGFuZGxlIGZvciBhIGZvbnRzZXQgbmFtZS4KKyAqIFJldHVybnMgTk9GT05UU0VUIHdoZW4gZmFpbGVkLgorICovCisgICAgc3RhdGljIEd1aUZvbnRzZXQKK2ZvbnRzZXRfbmFtZTJoYW5kbGUobmFtZSwgZml4ZWRfd2lkdGgpCisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJZml4ZWRfd2lkdGg7Cit7CisgICAgaWYgKFNUUkNNUChuYW1lLCAiTk9ORSIpID09IDApCisJcmV0dXJuIE5PRk9OVFNFVDsKKworICAgIHJldHVybiBndWlfbWNoX2dldF9mb250c2V0KG5hbWUsIFRSVUUsIGZpeGVkX3dpZHRoKTsKK30KKyMgZW5kaWYKKworLyoKKyAqIEdldCB0aGUgZm9udCBvciBmb250c2V0IGZvciBvbmUgaGlnaGxpZ2h0IGdyb3VwLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgdm9pZAoraGxfZG9fZm9udChpZHgsIGFyZywgZG9fbm9ybWFsLCBkb19tZW51LCBkb190b29sdGlwKQorICAgIGludAkJaWR4OworICAgIGNoYXJfdQkqYXJnOworICAgIGludAkJZG9fbm9ybWFsOwkvKiBzZXQgbm9ybWFsIGZvbnQgKi8KKyAgICBpbnQJCWRvX21lbnU7CS8qIHNldCBtZW51IGZvbnQgKi8KKyAgICBpbnQJCWRvX3Rvb2x0aXA7CS8qIHNldCB0b29sdGlwIGZvbnQgKi8KK3sKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorICAgIC8qIElmICdndWlmb250c2V0JyBpcyBub3QgZW1wdHksIGZpcnN0IHRyeSB1c2luZyB0aGUgbmFtZSBhcyBhCisgICAgICogZm9udHNldC4gIElmIHRoYXQgZG9lc24ndCB3b3JrLCB1c2UgaXQgYXMgYSBmb250IG5hbWUuICovCisgICAgaWYgKCpwX2d1aWZvbnRzZXQgIT0gTlVMCisjICBpZmRlZiBGT05UU0VUX0FMV0FZUworCXx8IGRvX21lbnUKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX0JFVkFMX1RJUAorCS8qIEluIEF0aGVuYSAmIE1vdGlmLCB0aGUgVG9vbHRpcCBoaWdobGlnaHQgZ3JvdXAgaXMgYWx3YXlzIGEgZm9udHNldCAqLworCXx8IGRvX3Rvb2x0aXAKKyMgIGVuZGlmCisJICAgICkKKwlITF9UQUJMRSgpW2lkeF0uc2dfZm9udHNldCA9IGZvbnRzZXRfbmFtZTJoYW5kbGUoYXJnLCAwCisjICBpZmRlZiBGT05UU0VUX0FMV0FZUworCQl8fCBkb19tZW51CisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9CRVZBTF9USVAKKwkJfHwgZG9fdG9vbHRpcAorIyAgZW5kaWYKKwkJKTsKKyAgICBpZiAoSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQgIT0gTk9GT05UU0VUKQorICAgIHsKKwkvKiBJZiBpdCB3b3JrZWQgYW5kIGl0J3MgdGhlIE5vcm1hbCBncm91cCwgdXNlIGl0IGFzIHRoZQorCSAqIG5vcm1hbCBmb250c2V0LiAgU2FtZSBmb3IgdGhlIE1lbnUgZ3JvdXAuICovCisJaWYgKGRvX25vcm1hbCkKKwkgICAgZ3VpX2luaXRfZm9udChhcmcsIFRSVUUpOworIyAgIGlmIChkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0FUSEVOQSkpICYmIGRlZmluZWQoRkVBVF9NRU5VKQorCWlmIChkb19tZW51KQorCXsKKyMgICAgaWZkZWYgRk9OVFNFVF9BTFdBWVMKKwkgICAgZ3VpLm1lbnVfZm9udHNldCA9IEhMX1RBQkxFKClbaWR4XS5zZ19mb250c2V0OworIyAgICBlbHNlCisJICAgIC8qIFlJS0VTISAgVGhpcyBpcyBhIGJ1ZyB3YWl0aW5nIHRvIGNyYXNoIHRoZSBwcm9ncmFtICovCisJICAgIGd1aS5tZW51X2ZvbnQgPSBITF9UQUJMRSgpW2lkeF0uc2dfZm9udHNldDsKKyMgICAgZW5kaWYKKwkgICAgZ3VpX21jaF9uZXdfbWVudV9mb250KCk7CisJfQorIyAgICBpZmRlZiBGRUFUX0JFVkFMCisJaWYgKGRvX3Rvb2x0aXApCisJeworCSAgICAvKiBUaGUgQXRoZW5hIHdpZGdldCBzZXQgY2Fubm90IGN1cnJlbnRseSBoYW5kbGUgc3dpdGNoaW5nIGJldHdlZW4KKwkgICAgICogZGlzcGxheWluZyBhIHNpbmdsZSBmb250IGFuZCBhIGZvbnRzZXQuCisJICAgICAqIElmIHRoZSBYdE5pbnRlcm5hdGlvbmFsIHJlc291cmNlIGlzIHNldCB0byBUcnVlIGF0IHdpZGdldAorCSAgICAgKiBjcmVhdGlvbiwgdGhlbiBhIGZvbnRzZXQgaXMgYWx3YXlzIHVzZWQsIG90aHdpc2UgYW4KKwkgICAgICogWEZvbnRTdHJ1Y3QgaXMgdXNlZC4KKwkgICAgICovCisJICAgIGd1aS50b29sdGlwX2ZvbnRzZXQgPSAoWEZvbnRTZXQpSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQ7CisJICAgIGd1aV9tY2hfbmV3X3Rvb2x0aXBfZm9udCgpOworCX0KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisgICAgeworCUhMX1RBQkxFKClbaWR4XS5zZ19mb250ID0gZm9udF9uYW1lMmhhbmRsZShhcmcpOworCS8qIElmIGl0IHdvcmtlZCBhbmQgaXQncyB0aGUgTm9ybWFsIGdyb3VwLCB1c2UgaXQgYXMgdGhlCisJICogbm9ybWFsIGZvbnQuICBTYW1lIGZvciB0aGUgTWVudSBncm91cC4gKi8KKwlpZiAoSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnQgIT0gTk9GT05UKQorCXsKKwkgICAgaWYgKGRvX25vcm1hbCkKKwkJZ3VpX2luaXRfZm9udChhcmcsIEZBTFNFKTsKKyNpZm5kZWYgRk9OVFNFVF9BTFdBWVMKKyMgaWYgKGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfQVRIRU5BKSkgJiYgZGVmaW5lZChGRUFUX01FTlUpCisJICAgIGlmIChkb19tZW51KQorCSAgICB7CisJCWd1aS5tZW51X2ZvbnQgPSBITF9UQUJMRSgpW2lkeF0uc2dfZm9udDsKKwkJZ3VpX21jaF9uZXdfbWVudV9mb250KCk7CisJICAgIH0KKyMgZW5kaWYKKyNlbmRpZgorCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBGRUFUX0dVSSAqLworCisvKgorICogVGFibGUgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbnMgZm9yIGFuIGF0dHJpYnV0ZSBudW1iZXIuCisgKiBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyB1c2VkIGJ5IEFMTCBidWZmZXJzLiAgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZQorICogR1VJIGNhbiByZWRyYXcgYXQgYW55IHRpbWUgZm9yIGFueSBidWZmZXIuCisgKi8KK2dhcnJheV9UCXRlcm1fYXR0cl90YWJsZSA9IHswLCAwLCAwLCAwLCBOVUxMfTsKKworI2RlZmluZSBURVJNX0FUVFJfRU5UUlkoaWR4KSAoKGF0dHJlbnRyeV9UICopdGVybV9hdHRyX3RhYmxlLmdhX2RhdGEpW2lkeF0KKworZ2FycmF5X1QJY3Rlcm1fYXR0cl90YWJsZSA9IHswLCAwLCAwLCAwLCBOVUxMfTsKKworI2RlZmluZSBDVEVSTV9BVFRSX0VOVFJZKGlkeCkgKChhdHRyZW50cnlfVCAqKWN0ZXJtX2F0dHJfdGFibGUuZ2FfZGF0YSlbaWR4XQorCisjaWZkZWYgRkVBVF9HVUkKK2dhcnJheV9UCWd1aV9hdHRyX3RhYmxlID0gezAsIDAsIDAsIDAsIE5VTEx9OworCisjZGVmaW5lIEdVSV9BVFRSX0VOVFJZKGlkeCkgKChhdHRyZW50cnlfVCAqKWd1aV9hdHRyX3RhYmxlLmdhX2RhdGEpW2lkeF0KKyNlbmRpZgorCisvKgorICogUmV0dXJuIHRoZSBhdHRyIG51bWJlciBmb3IgYSBzZXQgb2YgY29sb3JzIGFuZCBmb250LgorICogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSB0ZXJtX2F0dHJfdGFibGUsIGN0ZXJtX2F0dHJfdGFibGUgb3IgZ3VpX2F0dHJfdGFibGUKKyAqIGlmIHRoZSBjb21iaW5hdGlvbiBpcyBuZXcuCisgKiBSZXR1cm4gMCBmb3IgZXJyb3IgKG5vIG1vcmUgcm9vbSkuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfYXR0cl9lbnRyeSh0YWJsZSwgYWVwKQorICAgIGdhcnJheV9UCSp0YWJsZTsKKyAgICBhdHRyZW50cnlfVAkqYWVwOworeworICAgIGludAkJaTsKKyAgICBhdHRyZW50cnlfVAkqZ2FwOworICAgIHN0YXRpYyBpbnQJcmVjdXJzaXZlID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIEluaXQgdGhlIHRhYmxlLCBpbiBjYXNlIGl0IHdhc24ndCBkb25lIHlldC4KKyAgICAgKi8KKyAgICB0YWJsZS0+Z2FfaXRlbXNpemUgPSBzaXplb2YoYXR0cmVudHJ5X1QpOworICAgIHRhYmxlLT5nYV9ncm93c2l6ZSA9IDc7CisKKyAgICAvKgorICAgICAqIFRyeSB0byBmaW5kIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgc3BlY2lmaWNhdGlvbnMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5nYV9sZW47ICsraSkKKyAgICB7CisJZ2FwID0gJigoKGF0dHJlbnRyeV9UICopdGFibGUtPmdhX2RhdGEpW2ldKTsKKwlpZiAoCSAgIGFlcC0+YWVfYXR0ciA9PSBnYXAtPmFlX2F0dHIKKwkJJiYgKAorI2lmZGVmIEZFQVRfR1VJCisJCSAgICAgICAodGFibGUgPT0gJmd1aV9hdHRyX3RhYmxlCisJCQkmJiAoYWVwLT5hZV91Lmd1aS5mZ19jb2xvciA9PSBnYXAtPmFlX3UuZ3VpLmZnX2NvbG9yCisJCQkgICAgJiYgYWVwLT5hZV91Lmd1aS5iZ19jb2xvciA9PSBnYXAtPmFlX3UuZ3VpLmJnX2NvbG9yCisJCQkgICAgJiYgYWVwLT5hZV91Lmd1aS5mb250ID09IGdhcC0+YWVfdS5ndWkuZm9udAorIyAgaWZkZWYgRkVBVF9YRk9OVFNFVAorCQkJICAgICYmIGFlcC0+YWVfdS5ndWkuZm9udHNldCA9PSBnYXAtPmFlX3UuZ3VpLmZvbnRzZXQKKyMgIGVuZGlmCisJCQkgICAgKSkKKwkJICAgIHx8CisjZW5kaWYKKwkJICAgICAgICh0YWJsZSA9PSAmdGVybV9hdHRyX3RhYmxlCisJCQkmJiAoYWVwLT5hZV91LnRlcm0uc3RhcnQgPT0gTlVMTCkgPT0KKwkJCQkJCShnYXAtPmFlX3UudGVybS5zdGFydCA9PSBOVUxMKQorCQkJJiYgKGFlcC0+YWVfdS50ZXJtLnN0YXJ0ID09IE5VTEwKKwkJCSAgICB8fCBTVFJDTVAoYWVwLT5hZV91LnRlcm0uc3RhcnQsCisJCQkJCQkgICBnYXAtPmFlX3UudGVybS5zdGFydCkgPT0gMCkKKwkJCSYmIChhZXAtPmFlX3UudGVybS5zdG9wID09IE5VTEwpID09CisJCQkJCQkgKGdhcC0+YWVfdS50ZXJtLnN0b3AgPT0gTlVMTCkKKwkJCSYmIChhZXAtPmFlX3UudGVybS5zdG9wID09IE5VTEwKKwkJCSAgICB8fCBTVFJDTVAoYWVwLT5hZV91LnRlcm0uc3RvcCwKKwkJCQkJCSAgIGdhcC0+YWVfdS50ZXJtLnN0b3ApID09IDApKQorCQkgICAgfHwgKHRhYmxlID09ICZjdGVybV9hdHRyX3RhYmxlCisJCQkmJiBhZXAtPmFlX3UuY3Rlcm0uZmdfY29sb3IgPT0gZ2FwLT5hZV91LmN0ZXJtLmZnX2NvbG9yCisJCQkmJiBhZXAtPmFlX3UuY3Rlcm0uYmdfY29sb3IgPT0gZ2FwLT5hZV91LmN0ZXJtLmJnX2NvbG9yKQorCQkgICAgICkpCisKKwlyZXR1cm4gaSArIEFUVFJfT0ZGOworICAgIH0KKworICAgIGlmICh0YWJsZS0+Z2FfbGVuICsgQVRUUl9PRkYgPT0gMjU2KQorICAgIHsKKwkvKgorCSAqIFJ1bm5pbmcgb3V0IG9mIGF0dHJpYnV0ZSBlbnRyaWVzISAgcmVtb3ZlIGFsbCBhdHRyaWJ1dGVzLCBhbmQKKwkgKiBjb21wdXRlIG5ldyBvbmVzIGZvciBhbGwgZ3JvdXBzLgorCSAqIFdoZW4gY2FsbGVkIHJlY3Vyc2l2ZWx5LCB3ZSBhcmUgcmVhbGx5IG91dCBvZiBudW1iZXJzLgorCSAqLworCWlmIChyZWN1cnNpdmUpCisJeworCSAgICBFTVNHKF8oIkU0MjQ6IFRvbyBtYW55IGRpZmZlcmVudCBoaWdobGlnaHRpbmcgYXR0cmlidXRlcyBpbiB1c2UiKSk7CisJICAgIHJldHVybiAwOworCX0KKwlyZWN1cnNpdmUgPSBUUlVFOworCisjaWZkZWYgRkVBVF9HVUkKKwlnYV9jbGVhcigmZ3VpX2F0dHJfdGFibGUpOworI2VuZGlmCisJZ2FfY2xlYXIoJnRlcm1fYXR0cl90YWJsZSk7CisJZ2FfY2xlYXIoJmN0ZXJtX2F0dHJfdGFibGUpOworCW11c3RfcmVkcmF3ID0gQ0xFQVI7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGlnaGxpZ2h0X2dhLmdhX2xlbjsgKytpKQorCSAgICBzZXRfaGxfYXR0cihpKTsKKworCXJlY3Vyc2l2ZSA9IEZBTFNFOworICAgIH0KKworICAgIC8qCisgICAgICogVGhpcyBpcyBhIG5ldyBjb21iaW5hdGlvbiBvZiBjb2xvcnMgYW5kIGZvbnQsIGFkZCBhbiBlbnRyeS4KKyAgICAgKi8KKyAgICBpZiAoZ2FfZ3Jvdyh0YWJsZSwgMSkgPT0gRkFJTCkKKwlyZXR1cm4gMDsKKworICAgIGdhcCA9ICYoKChhdHRyZW50cnlfVCAqKXRhYmxlLT5nYV9kYXRhKVt0YWJsZS0+Z2FfbGVuXSk7CisgICAgdmltX21lbXNldChnYXAsIDAsIHNpemVvZihhdHRyZW50cnlfVCkpOworICAgIGdhcC0+YWVfYXR0ciA9IGFlcC0+YWVfYXR0cjsKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmICh0YWJsZSA9PSAmZ3VpX2F0dHJfdGFibGUpCisgICAgeworCWdhcC0+YWVfdS5ndWkuZmdfY29sb3IgPSBhZXAtPmFlX3UuZ3VpLmZnX2NvbG9yOworCWdhcC0+YWVfdS5ndWkuYmdfY29sb3IgPSBhZXAtPmFlX3UuZ3VpLmJnX2NvbG9yOworCWdhcC0+YWVfdS5ndWkuZm9udCA9IGFlcC0+YWVfdS5ndWkuZm9udDsKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAorCWdhcC0+YWVfdS5ndWkuZm9udHNldCA9IGFlcC0+YWVfdS5ndWkuZm9udHNldDsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAodGFibGUgPT0gJnRlcm1fYXR0cl90YWJsZSkKKyAgICB7CisJaWYgKGFlcC0+YWVfdS50ZXJtLnN0YXJ0ID09IE5VTEwpCisJICAgIGdhcC0+YWVfdS50ZXJtLnN0YXJ0ID0gTlVMTDsKKwllbHNlCisJICAgIGdhcC0+YWVfdS50ZXJtLnN0YXJ0ID0gdmltX3N0cnNhdmUoYWVwLT5hZV91LnRlcm0uc3RhcnQpOworCWlmIChhZXAtPmFlX3UudGVybS5zdG9wID09IE5VTEwpCisJICAgIGdhcC0+YWVfdS50ZXJtLnN0b3AgPSBOVUxMOworCWVsc2UKKwkgICAgZ2FwLT5hZV91LnRlcm0uc3RvcCA9IHZpbV9zdHJzYXZlKGFlcC0+YWVfdS50ZXJtLnN0b3ApOworICAgIH0KKyAgICBlbHNlIGlmICh0YWJsZSA9PSAmY3Rlcm1fYXR0cl90YWJsZSkKKyAgICB7CisJZ2FwLT5hZV91LmN0ZXJtLmZnX2NvbG9yID0gYWVwLT5hZV91LmN0ZXJtLmZnX2NvbG9yOworCWdhcC0+YWVfdS5jdGVybS5iZ19jb2xvciA9IGFlcC0+YWVfdS5jdGVybS5iZ19jb2xvcjsKKyAgICB9CisgICAgKyt0YWJsZS0+Z2FfbGVuOworICAgIC0tdGFibGUtPmdhX3Jvb207CisgICAgcmV0dXJuICh0YWJsZS0+Z2FfbGVuIC0gMSArIEFUVFJfT0ZGKTsKK30KKworI2lmZGVmIEZFQVRfR1VJCisKKyAgICBhdHRyZW50cnlfVCAqCitzeW5fZ3VpX2F0dHIyZW50cnkoYXR0cikKKyAgICBpbnQJCSAgICBhdHRyOworeworICAgIGF0dHIgLT0gQVRUUl9PRkY7CisgICAgaWYgKGF0dHIgPj0gZ3VpX2F0dHJfdGFibGUuZ2FfbGVuKQkgICAgLyogZGlkICI6c3ludGF4IGNsZWFyIiAqLworCXJldHVybiBOVUxMOworICAgIHJldHVybiAmKEdVSV9BVFRSX0VOVFJZKGF0dHIpKTsKK30KKworI2VuZGlmIC8qIEZFQVRfR1VJICovCisKKyAgICBhdHRyZW50cnlfVCAqCitzeW5fdGVybV9hdHRyMmVudHJ5KGF0dHIpCisgICAgaW50CQkgICAgYXR0cjsKK3sKKyAgICBhdHRyIC09IEFUVFJfT0ZGOworICAgIGlmIChhdHRyID49IHRlcm1fYXR0cl90YWJsZS5nYV9sZW4pCSAgICAvKiBkaWQgIjpzeW50YXggY2xlYXIiICovCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICYoVEVSTV9BVFRSX0VOVFJZKGF0dHIpKTsKK30KKworICAgIGF0dHJlbnRyeV9UICoKK3N5bl9jdGVybV9hdHRyMmVudHJ5KGF0dHIpCisgICAgaW50CQkgICAgYXR0cjsKK3sKKyAgICBhdHRyIC09IEFUVFJfT0ZGOworICAgIGlmIChhdHRyID49IGN0ZXJtX2F0dHJfdGFibGUuZ2FfbGVuKQkvKiBkaWQgIjpzeW50YXggY2xlYXIiICovCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICYoQ1RFUk1fQVRUUl9FTlRSWShhdHRyKSk7Cit9CisKKyNkZWZpbmUgTElTVF9BVFRSICAgMQorI2RlZmluZSBMSVNUX1NUUklORyAyCisjZGVmaW5lIExJU1RfSU5UICAgIDMKKworICAgIHN0YXRpYyB2b2lkCitoaWdobGlnaHRfbGlzdF9vbmUoaWQpCisgICAgaW50CQlpZDsKK3sKKyAgICBzdHJ1Y3QgaGxfZ3JvdXAJKnNncDsKKyAgICBpbnQJCQlkaWRoID0gRkFMU0U7CisKKyAgICBzZ3AgPSAmSExfVEFCTEUoKVtpZCAtIDFdOwkgICAgLyogaW5kZXggaXMgSUQgbWludXMgb25lICovCisKKyAgICBkaWRoID0gaGlnaGxpZ2h0X2xpc3RfYXJnKGlkLCBkaWRoLCBMSVNUX0FUVFIsCisJCQkJICAgIHNncC0+c2dfdGVybSwgTlVMTCwgInRlcm0iKTsKKyAgICBkaWRoID0gaGlnaGxpZ2h0X2xpc3RfYXJnKGlkLCBkaWRoLCBMSVNUX1NUUklORywKKwkJCQkgICAgMCwgc2dwLT5zZ19zdGFydCwgInN0YXJ0Iik7CisgICAgZGlkaCA9IGhpZ2hsaWdodF9saXN0X2FyZyhpZCwgZGlkaCwgTElTVF9TVFJJTkcsCisJCQkJICAgIDAsIHNncC0+c2dfc3RvcCwgInN0b3AiKTsKKworICAgIGRpZGggPSBoaWdobGlnaHRfbGlzdF9hcmcoaWQsIGRpZGgsIExJU1RfQVRUUiwKKwkJCQkgICAgc2dwLT5zZ19jdGVybSwgTlVMTCwgImN0ZXJtIik7CisgICAgZGlkaCA9IGhpZ2hsaWdodF9saXN0X2FyZyhpZCwgZGlkaCwgTElTVF9JTlQsCisJCQkJICAgIHNncC0+c2dfY3Rlcm1fZmcsIE5VTEwsICJjdGVybWZnIik7CisgICAgZGlkaCA9IGhpZ2hsaWdodF9saXN0X2FyZyhpZCwgZGlkaCwgTElTVF9JTlQsCisJCQkJICAgIHNncC0+c2dfY3Rlcm1fYmcsIE5VTEwsICJjdGVybWJnIik7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGRpZGggPSBoaWdobGlnaHRfbGlzdF9hcmcoaWQsIGRpZGgsIExJU1RfQVRUUiwKKwkJCQkgICAgc2dwLT5zZ19ndWksIE5VTEwsICJndWkiKTsKKyAgICBkaWRoID0gaGlnaGxpZ2h0X2xpc3RfYXJnKGlkLCBkaWRoLCBMSVNUX1NUUklORywKKwkJCQkgICAgMCwgc2dwLT5zZ19ndWlfZmdfbmFtZSwgImd1aWZnIik7CisgICAgZGlkaCA9IGhpZ2hsaWdodF9saXN0X2FyZyhpZCwgZGlkaCwgTElTVF9TVFJJTkcsCisJCQkJICAgIDAsIHNncC0+c2dfZ3VpX2JnX25hbWUsICJndWliZyIpOworICAgIGRpZGggPSBoaWdobGlnaHRfbGlzdF9hcmcoaWQsIGRpZGgsIExJU1RfU1RSSU5HLAorCQkJCSAgICAwLCBzZ3AtPnNnX2ZvbnRfbmFtZSwgImZvbnQiKTsKKyNlbmRpZgorCisgICAgaWYgKHNncC0+c2dfbGluaykKKyAgICB7CisJKHZvaWQpc3luX2xpc3RfaGVhZGVyKGRpZGgsIDk5OTksIGlkKTsKKwltc2dfcHV0c19hdHRyKChjaGFyX3UgKikibGlua3MgdG8iLCBobF9hdHRyKEhMRl9EKSk7CisJbXNnX3B1dGNoYXIoJyAnKTsKKwltc2dfb3V0dHJhbnMoSExfVEFCTEUoKVtITF9UQUJMRSgpW2lkIC0gMV0uc2dfbGluayAtIDFdLnNnX25hbWUpOworICAgIH0KK30KKworICAgIHN0YXRpYyBpbnQKK2hpZ2hsaWdodF9saXN0X2FyZyhpZCwgZGlkaCwgdHlwZSwgaWFyZywgc2FyZywgbmFtZSkKKyAgICBpbnQJCWlkOworICAgIGludAkJZGlkaDsKKyAgICBpbnQJCXR5cGU7CisgICAgaW50CQlpYXJnOworICAgIGNoYXJfdQkqc2FyZzsKKyAgICBjaGFyCSpuYW1lOworeworICAgIGNoYXJfdQlidWZbMTAwXTsKKyAgICBjaGFyX3UJKnRzOworICAgIGludAkJaTsKKworICAgIGlmICh0eXBlID09IExJU1RfU1RSSU5HID8gKHNhcmcgIT0gTlVMTCkgOiAoaWFyZyAhPSAwKSkKKyAgICB7CisJdHMgPSBidWY7CisJaWYgKHR5cGUgPT0gTElTVF9JTlQpCisJICAgIHNwcmludGYoKGNoYXIgKilidWYsICIlZCIsIGlhcmcgLSAxKTsKKwllbHNlIGlmICh0eXBlID09IExJU1RfU1RSSU5HKQorCSAgICB0cyA9IHNhcmc7CisJZWxzZSAvKiB0eXBlID09IExJU1RfQVRUUiAqLworCXsKKwkgICAgYnVmWzBdID0gTlVMOworCSAgICBmb3IgKGkgPSAwOyBobF9hdHRyX3RhYmxlW2ldICE9IDA7ICsraSkKKwkgICAgeworCQlpZiAoaWFyZyAmIGhsX2F0dHJfdGFibGVbaV0pCisJCXsKKwkJICAgIGlmIChidWZbMF0gIT0gTlVMKQorCQkJU1RSQ0FUKGJ1ZiwgIiwiKTsKKwkJICAgIFNUUkNBVChidWYsIGhsX25hbWVfdGFibGVbaV0pOworCQkgICAgaWFyZyAmPSB+aGxfYXR0cl90YWJsZVtpXTsJICAgIC8qIGRvbid0IHdhbnQgImludmVyc2UiICovCisJCX0KKwkgICAgfQorCX0KKworCSh2b2lkKXN5bl9saXN0X2hlYWRlcihkaWRoLAorCQkJICAgICAgIChpbnQpKHZpbV9zdHJzaXplKHRzKSArIFNUUkxFTihuYW1lKSArIDEpLCBpZCk7CisJZGlkaCA9IFRSVUU7CisKKwlNU0dfUFVUU19BVFRSKG5hbWUsIGhsX2F0dHIoSExGX0QpKTsKKwlNU0dfUFVUU19BVFRSKCI9IiwgaGxfYXR0cihITEZfRCkpOworCW1zZ19vdXR0cmFucyh0cyk7CisgICAgfQorICAgIHJldHVybiBkaWRoOworfQorCisjaWYgKCgoZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoRkVBVF9QUklOVEVSKSkpICYmIGRlZmluZWQoRkVBVF9TWU5fSEwpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiAiMSIgaWYgaGlnaGxpZ2h0IGdyb3VwICJpZCIgaGFzIGF0dHJpYnV0ZSAiZmxhZyIuCisgKiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCisgKi8KKyAgICBjaGFyX3UgKgoraGlnaGxpZ2h0X2hhc19hdHRyKGlkLCBmbGFnLCBtb2RlYykKKyAgICBpbnQJCWlkOworICAgIGludAkJZmxhZzsKKyAgICBpbnQJCW1vZGVjOwkvKiAnZycgZm9yIEdVSSwgJ2MnIGZvciBjdGVybSwgJ3QnIGZvciB0ZXJtICovCit7CisgICAgaW50CQlhdHRyOworCisgICAgaWYgKGlkIDw9IDAgfHwgaWQgPiBoaWdobGlnaHRfZ2EuZ2FfbGVuKQorCXJldHVybiBOVUxMOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAobW9kZWMgPT0gJ2cnKQorCWF0dHIgPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpOworICAgIGVsc2UKKyNlbmRpZgorCSBpZiAobW9kZWMgPT0gJ2MnKQorCWF0dHIgPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfY3Rlcm07CisgICAgZWxzZQorCWF0dHIgPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfdGVybTsKKworICAgIGlmIChhdHRyICYgZmxhZykKKwlyZXR1cm4gKGNoYXJfdSAqKSIxIjsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoRkVBVF9TWU5fSEwpICYmIGRlZmluZWQoRkVBVF9FVkFMKSkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gY29sb3IgbmFtZSBvZiBoaWdobGlnaHQgZ3JvdXAgImlkIi4KKyAqLworICAgIGNoYXJfdSAqCitoaWdobGlnaHRfY29sb3IoaWQsIHdoYXQsIG1vZGVjKQorICAgIGludAkJaWQ7CisgICAgY2hhcl91CSp3aGF0OwkvKiAiZmciLCAiYmciLCAiZmcjIiBvciAiYmcjIiAqLworICAgIGludAkJbW9kZWM7CS8qICdnJyBmb3IgR1VJLCAnYycgZm9yIGN0ZXJtLCAndCcgZm9yIHRlcm0gKi8KK3sKKyAgICBzdGF0aWMgY2hhcl91CW5hbWVbMjBdOworICAgIGludAkJCW47CisgICAgaW50CQkJZmc7CisKKyAgICBpZiAoaWQgPD0gMCB8fCBpZCA+IGhpZ2hsaWdodF9nYS5nYV9sZW4pCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoVE9MT1dFUl9BU0Mod2hhdFswXSkgPT0gJ2YnKQorCWZnID0gVFJVRTsKKyAgICBlbHNlCisJZmcgPSBGQUxTRTsKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChtb2RlYyA9PSAnZycpCisgICAgeworCS8qIHJldHVybiAjUlJHR0JCIGZvcm0gKG9ubHkgcG9zc2libGUgd2hlbiBHVUkgaXMgcnVubmluZykgKi8KKwlpZiAoZ3VpLmluX3VzZSAmJiB3aGF0WzFdICYmIHdoYXRbMl0gPT0gJyMnKQorCXsKKwkgICAgZ3VpY29sb3JfVAkJY29sb3I7CisJICAgIGxvbmdfdQkJcmdiOworCSAgICBzdGF0aWMgY2hhcl91CWJ1ZlsxMF07CisKKwkgICAgaWYgKGZnKQorCQljb2xvciA9IEhMX1RBQkxFKClbaWQgLSAxXS5zZ19ndWlfZmc7CisJICAgIGVsc2UKKwkJY29sb3IgPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpX2JnOworCSAgICBpZiAoY29sb3IgPT0gSU5WQUxDT0xPUikKKwkJcmV0dXJuIE5VTEw7CisJICAgIHJnYiA9IGd1aV9tY2hfZ2V0X3JnYihjb2xvcik7CisJICAgIHNwcmludGYoKGNoYXIgKilidWYsICIjJTAyeCUwMnglMDJ4IiwKKwkJCQkgICAgICAodW5zaWduZWQpKHJnYiA+PiAxNiksCisJCQkJICAgICAgKHVuc2lnbmVkKShyZ2IgPj4gOCkgJiAyNTUsCisJCQkJICAgICAgKHVuc2lnbmVkKXJnYiAmIDI1NSk7CisJICAgIHJldHVybiBidWY7CisJfQorCWlmIChmZykKKwkgICAgcmV0dXJuIChITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpX2ZnX25hbWUpOworCXJldHVybiAoSExfVEFCTEUoKVtpZCAtIDFdLnNnX2d1aV9iZ19uYW1lKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAobW9kZWMgPT0gJ2MnKQorICAgIHsKKwlpZiAoZmcpCisJICAgIG4gPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfY3Rlcm1fZmcgLSAxOworCWVsc2UKKwkgICAgbiA9IEhMX1RBQkxFKClbaWQgLSAxXS5zZ19jdGVybV9iZyAtIDE7CisJc3ByaW50ZigoY2hhciAqKW5hbWUsICIlZCIsIG4pOworCXJldHVybiBuYW1lOworICAgIH0KKyAgICAvKiB0ZXJtIGRvZXNuJ3QgaGF2ZSBjb2xvciAqLworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChGRUFUX1NZTl9ITCkgJiYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChGRUFUX1BSSU5URVIpKSBcCisJfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gY29sb3IgbmFtZSBvZiBoaWdobGlnaHQgZ3JvdXAgImlkIiBhcyBSR0IgdmFsdWUuCisgKi8KKyAgICBsb25nX3UKK2hpZ2hsaWdodF9ndWlfY29sb3JfcmdiKGlkLCBmZykKKyAgICBpbnQJCWlkOworICAgIGludAkJZmc7CS8qIFRSVUUgPSBmZywgRkFMU0UgPSBiZyAqLworeworICAgIGd1aWNvbG9yX1QJY29sb3I7CisKKyAgICBpZiAoaWQgPD0gMCB8fCBpZCA+IGhpZ2hsaWdodF9nYS5nYV9sZW4pCisJcmV0dXJuIDBMOworCisgICAgaWYgKGZnKQorCWNvbG9yID0gSExfVEFCTEUoKVtpZCAtIDFdLnNnX2d1aV9mZzsKKyAgICBlbHNlCisJY29sb3IgPSBITF9UQUJMRSgpW2lkIC0gMV0uc2dfZ3VpX2JnOworCisgICAgaWYgKGNvbG9yID09IElOVkFMQ09MT1IpCisJcmV0dXJuIDBMOworCisgICAgcmV0dXJuIGd1aV9tY2hfZ2V0X3JnYihjb2xvcik7Cit9CisjZW5kaWYKKworLyoKKyAqIE91dHB1dCB0aGUgc3ludGF4IGxpc3QgaGVhZGVyLgorICogUmV0dXJuIFRSVUUgd2hlbiBzdGFydGVkIGEgbmV3IGxpbmUuCisgKi8KKyAgICBzdGF0aWMgaW50CitzeW5fbGlzdF9oZWFkZXIoZGlkX2hlYWRlciwgb3V0bGVuLCBpZCkKKyAgICBpbnQJICAgIGRpZF9oZWFkZXI7CQkvKiBkaWQgaGVhZGVyIGFscmVhZHkgKi8KKyAgICBpbnQJICAgIG91dGxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgdGhhdCBjb21lcyAqLworICAgIGludAkgICAgaWQ7CQkJLyogaGlnaGxpZ2h0IGdyb3VwIGlkICovCit7CisgICAgaW50CSAgICBlbmRjb2wgPSAxOTsKKyAgICBpbnQJICAgIG5ld2xpbmUgPSBUUlVFOworCisgICAgaWYgKCFkaWRfaGVhZGVyKQorICAgIHsKKwltc2dfcHV0Y2hhcignXG4nKTsKKwltc2dfb3V0dHJhbnMoSExfVEFCTEUoKVtpZCAtIDFdLnNnX25hbWUpOworCWVuZGNvbCA9IDE1OworICAgIH0KKyAgICBlbHNlIGlmIChtc2dfY29sICsgb3V0bGVuICsgMSA+PSBDb2x1bW5zKQorCW1zZ19wdXRjaGFyKCdcbicpOworICAgIGVsc2UKKyAgICB7CisJaWYgKG1zZ19jb2wgPj0gZW5kY29sKQkvKiB3cmFwIGFyb3VuZCBpcyBsaWtlIHN0YXJ0aW5nIGEgbmV3IGxpbmUgKi8KKwkgICAgbmV3bGluZSA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChtc2dfY29sID49IGVuZGNvbCkJLyogb3V0cHV0IGF0IGxlYXN0IG9uZSBzcGFjZSAqLworCWVuZGNvbCA9IG1zZ19jb2wgKyAxOworICAgIGlmIChDb2x1bW5zIDw9IGVuZGNvbCkJLyogYXZvaWQgaGFuZyBmb3IgdGlueSB3aW5kb3cgKi8KKwllbmRjb2wgPSBDb2x1bW5zIC0gMTsKKworICAgIG1zZ19hZHZhbmNlKGVuZGNvbCk7CisKKyAgICAvKiBTaG93ICJ4eHgiIHdpdGggdGhlIGF0dHJpYnV0ZXMuICovCisgICAgaWYgKCFkaWRfaGVhZGVyKQorICAgIHsKKwltc2dfcHV0c19hdHRyKChjaGFyX3UgKikieHh4Iiwgc3luX2lkMmF0dHIoaWQpKTsKKwltc2dfcHV0Y2hhcignICcpOworICAgIH0KKworICAgIHJldHVybiBuZXdsaW5lOworfQorCisvKgorICogU2V0IHRoZSBhdHRyaWJ1dGUgbnVtYmVycyBmb3IgYSBoaWdobGlnaHQgZ3JvdXAuCisgKiBDYWxsZWQgYWZ0ZXIgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIGhhcyBjaGFuZ2VkLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9obF9hdHRyKGlkeCkKKyAgICBpbnQJCWlkeDsJICAgIC8qIGluZGV4IGluIGFycmF5ICovCit7CisgICAgYXR0cmVudHJ5X1QJCWF0X2VuOworICAgIHN0cnVjdCBobF9ncm91cAkqc2dwID0gSExfVEFCTEUoKSArIGlkeDsKKworICAgIC8qIFRoZSAiTm9ybWFsIiBncm91cCBkb2Vzbid0IG5lZWQgYW4gYXR0cmlidXRlIG51bWJlciAqLworICAgIGlmIChzZ3AtPnNnX25hbWVfdSAhPSBOVUxMICYmIFNUUkNNUChzZ3AtPnNnX25hbWVfdSwgIk5PUk1BTCIpID09IDApCisJcmV0dXJuOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKgorICAgICAqIEZvciB0aGUgR1VJIG1vZGU6IElmIHRoZXJlIGFyZSBvdGhlciB0aGFuICJub3JtYWwiIGhpZ2hsaWdodGluZworICAgICAqIGF0dHJpYnV0ZXMsIG5lZWQgdG8gYWxsb2NhdGUgYW4gYXR0ciBudW1iZXIuCisgICAgICovCisgICAgaWYgKHNncC0+c2dfZ3VpX2ZnID09IElOVkFMQ09MT1IKKwkgICAgJiYgc2dwLT5zZ19ndWlfYmcgPT0gSU5WQUxDT0xPUgorCSAgICAmJiBzZ3AtPnNnX2ZvbnQgPT0gTk9GT05UCisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwkgICAgJiYgc2dwLT5zZ19mb250c2V0ID09IE5PRk9OVFNFVAorIyBlbmRpZgorCSAgICApCisgICAgeworCXNncC0+c2dfZ3VpX2F0dHIgPSBzZ3AtPnNnX2d1aTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlhdF9lbi5hZV9hdHRyID0gc2dwLT5zZ19ndWk7CisJYXRfZW4uYWVfdS5ndWkuZmdfY29sb3IgPSBzZ3AtPnNnX2d1aV9mZzsKKwlhdF9lbi5hZV91Lmd1aS5iZ19jb2xvciA9IHNncC0+c2dfZ3VpX2JnOworCWF0X2VuLmFlX3UuZ3VpLmZvbnQgPSBzZ3AtPnNnX2ZvbnQ7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlhdF9lbi5hZV91Lmd1aS5mb250c2V0ID0gc2dwLT5zZ19mb250c2V0OworIyBlbmRpZgorCXNncC0+c2dfZ3VpX2F0dHIgPSBnZXRfYXR0cl9lbnRyeSgmZ3VpX2F0dHJfdGFibGUsICZhdF9lbik7CisgICAgfQorI2VuZGlmCisgICAgLyoKKyAgICAgKiBGb3IgdGhlIHRlcm0gbW9kZTogSWYgdGhlcmUgYXJlIG90aGVyIHRoYW4gIm5vcm1hbCIgaGlnaGxpZ2h0aW5nCisgICAgICogYXR0cmlidXRlcywgbmVlZCB0byBhbGxvY2F0ZSBhbiBhdHRyIG51bWJlci4KKyAgICAgKi8KKyAgICBpZiAoc2dwLT5zZ19zdGFydCA9PSBOVUxMICYmIHNncC0+c2dfc3RvcCA9PSBOVUxMKQorCXNncC0+c2dfdGVybV9hdHRyID0gc2dwLT5zZ190ZXJtOworICAgIGVsc2UKKyAgICB7CisJYXRfZW4uYWVfYXR0ciA9IHNncC0+c2dfdGVybTsKKwlhdF9lbi5hZV91LnRlcm0uc3RhcnQgPSBzZ3AtPnNnX3N0YXJ0OworCWF0X2VuLmFlX3UudGVybS5zdG9wID0gc2dwLT5zZ19zdG9wOworCXNncC0+c2dfdGVybV9hdHRyID0gZ2V0X2F0dHJfZW50cnkoJnRlcm1fYXR0cl90YWJsZSwgJmF0X2VuKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB0aGUgY29sb3IgdGVybSBtb2RlOiBJZiB0aGVyZSBhcmUgb3RoZXIgdGhhbiAibm9ybWFsIgorICAgICAqIGhpZ2hsaWdodGluZyBhdHRyaWJ1dGVzLCBuZWVkIHRvIGFsbG9jYXRlIGFuIGF0dHIgbnVtYmVyLgorICAgICAqLworICAgIGlmIChzZ3AtPnNnX2N0ZXJtX2ZnID09IDAgJiYgc2dwLT5zZ19jdGVybV9iZyA9PSAwKQorCXNncC0+c2dfY3Rlcm1fYXR0ciA9IHNncC0+c2dfY3Rlcm07CisgICAgZWxzZQorICAgIHsKKwlhdF9lbi5hZV9hdHRyID0gc2dwLT5zZ19jdGVybTsKKwlhdF9lbi5hZV91LmN0ZXJtLmZnX2NvbG9yID0gc2dwLT5zZ19jdGVybV9mZzsKKwlhdF9lbi5hZV91LmN0ZXJtLmJnX2NvbG9yID0gc2dwLT5zZ19jdGVybV9iZzsKKwlzZ3AtPnNnX2N0ZXJtX2F0dHIgPSBnZXRfYXR0cl9lbnRyeSgmY3Rlcm1fYXR0cl90YWJsZSwgJmF0X2VuKTsKKyAgICB9Cit9CisKKy8qCisgKiBMb29rdXAgYSBoaWdobGlnaHQgZ3JvdXAgbmFtZSBhbmQgcmV0dXJuIGl0J3MgSUQuCisgKiBJZiBpdCBpcyBub3QgZm91bmQsIDAgaXMgcmV0dXJuZWQuCisgKi8KKyAgICBpbnQKK3N5bl9uYW1lMmlkKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJbmFtZV91WzIwMF07CisKKyAgICAvKiBBdm9pZCB1c2luZyBzdHJpY21wKCkgdG9vIG11Y2gsIGl0J3Mgc2xvdyBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICAvKiBBdm9pZCBhbGxvYygpL2ZyZWUoKSwgdGhlc2UgYXJlIHNsb3cgdG9vLiAgSUQgbmFtZXMgb3ZlciAyMDAgY2hhcnMKKyAgICAgKiBkb24ndCBkZXNlcnZlIHRvIGJlIGZvdW5kISAqLworICAgIFNUUk5DUFkobmFtZV91LCBuYW1lLCAxOTkpOworICAgIG5hbWVfdVsxOTldID0gTlVMOworICAgIHZpbV9zdHJ1cChuYW1lX3UpOworICAgIGZvciAoaSA9IGhpZ2hsaWdodF9nYS5nYV9sZW47IC0taSA+PSAwOyApCisJaWYgKEhMX1RBQkxFKClbaV0uc2dfbmFtZV91ICE9IE5VTEwKKwkJJiYgU1RSQ01QKG5hbWVfdSwgSExfVEFCTEUoKVtpXS5zZ19uYW1lX3UpID09IDApCisJICAgIGJyZWFrOworICAgIHJldHVybiBpICsgMTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiBUUlVFIGlmIGhpZ2hsaWdodCBncm91cCAibmFtZSIgZXhpc3RzLgorICovCisgICAgaW50CitoaWdobGlnaHRfZXhpc3RzKG5hbWUpCisgICAgY2hhcl91CSpuYW1lOworeworICAgIHJldHVybiAoc3luX25hbWUyaWQobmFtZSkgPiAwKTsKK30KKyNlbmRpZgorCisvKgorICogTGlrZSBzeW5fbmFtZTJpZCgpLCBidXQgdGFrZSBhIHBvaW50ZXIgKyBsZW5ndGggYXJndW1lbnQuCisgKi8KKyAgICBpbnQKK3N5bl9uYW1lbjJpZChsaW5lcCwgbGVuKQorICAgIGNoYXJfdSAgKmxpbmVwOworICAgIGludAkgICAgbGVuOworeworICAgIGNoYXJfdSAgKm5hbWU7CisgICAgaW50CSAgICBpZCA9IDA7CisKKyAgICBuYW1lID0gdmltX3N0cm5zYXZlKGxpbmVwLCBsZW4pOworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworCWlkID0gc3luX25hbWUyaWQobmFtZSk7CisJdmltX2ZyZWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBpZDsKK30KKworLyoKKyAqIEZpbmQgaGlnaGxpZ2h0IGdyb3VwIG5hbWUgaW4gdGhlIHRhYmxlIGFuZCByZXR1cm4gaXQncyBJRC4KKyAqIFRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuCisgKiBJZiBpdCBkb2Vzbid0IGV4aXN0IHlldCwgYSBuZXcgZW50cnkgaXMgY3JlYXRlZC4KKyAqIFJldHVybiAwIGZvciBmYWlsdXJlLgorICovCisgICAgaW50CitzeW5fY2hlY2tfZ3JvdXAocHAsIGxlbikKKyAgICBjaGFyX3UJCSpwcDsKKyAgICBpbnQJCQlsZW47Cit7CisgICAgaW50CSAgICBpZDsKKyAgICBjaGFyX3UgICpuYW1lOworCisgICAgbmFtZSA9IHZpbV9zdHJuc2F2ZShwcCwgbGVuKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgaWQgPSBzeW5fbmFtZTJpZChuYW1lKTsKKyAgICBpZiAoaWQgPT0gMCkJCQkvKiBkb2Vzbid0IGV4aXN0IHlldCAqLworCWlkID0gc3luX2FkZF9ncm91cChuYW1lKTsKKyAgICBlbHNlCisJdmltX2ZyZWUobmFtZSk7CisgICAgcmV0dXJuIGlkOworfQorCisvKgorICogQWRkIG5ldyBoaWdobGlnaHQgZ3JvdXAgYW5kIHJldHVybiBpdCdzIElELgorICogIm5hbWUiIG11c3QgYmUgYW4gYWxsb2NhdGVkIHN0cmluZywgaXQgd2lsbCBiZSBjb25zdW1lZC4KKyAqIFJldHVybiAwIGZvciBmYWlsdXJlLgorICovCisgICAgc3RhdGljIGludAorc3luX2FkZF9ncm91cChuYW1lKQorICAgIGNoYXJfdQkqbmFtZTsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuYW1lIGlzIEFTQ0lJIGxldHRlcnMsIGRpZ2l0cyBhbmQgdW5kZXJzY29yZS4gKi8KKyAgICBmb3IgKHAgPSBuYW1lOyAqcCAhPSBOVUw7ICsrcCkKKyAgICB7CisJaWYgKCF2aW1faXNwcmludGMoKnApKQorCXsKKwkgICAgRU1TRyhfKCJFNjY5OiBVbnByaW50YWJsZSBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIpKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCWVsc2UgaWYgKCFBU0NJSV9JU0FMTlVNKCpwKSAmJiAqcCAhPSAnXycpCisJeworCSAgICAvKiBUaGlzIGlzIGFuIGVycm9yLCBidXQgc2luY2UgdGhlcmUgcHJldmlvdXNseSB3YXMgbm8gY2hlY2sgb25seQorCSAgICAgKiBnaXZlIGEgd2FybmluZy4gKi8KKwkgICAgTVNHKF8oIlcxODogSW52YWxpZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIpKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogRmlyc3QgY2FsbCBmb3IgdGhpcyBncm93YXJyYXk6IGluaXQgZ3Jvd2luZyBhcnJheS4KKyAgICAgKi8KKyAgICBpZiAoaGlnaGxpZ2h0X2dhLmdhX2RhdGEgPT0gTlVMTCkKKyAgICB7CisJaGlnaGxpZ2h0X2dhLmdhX2l0ZW1zaXplID0gc2l6ZW9mKHN0cnVjdCBobF9ncm91cCk7CisJaGlnaGxpZ2h0X2dhLmdhX2dyb3dzaXplID0gMTA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYWtlIHJvb20gZm9yIGF0IGxlYXN0IG9uZSBvdGhlciBzeW50YXhfaGlnaGxpZ2h0IGVudHJ5LgorICAgICAqLworICAgIGlmIChnYV9ncm93KCZoaWdobGlnaHRfZ2EsIDEpID09IEZBSUwpCisgICAgeworCXZpbV9mcmVlKG5hbWUpOworCXJldHVybiAwOworICAgIH0KKworICAgIHZpbV9tZW1zZXQoJihITF9UQUJMRSgpW2hpZ2hsaWdodF9nYS5nYV9sZW5dKSwgMCwgc2l6ZW9mKHN0cnVjdCBobF9ncm91cCkpOworICAgIEhMX1RBQkxFKClbaGlnaGxpZ2h0X2dhLmdhX2xlbl0uc2dfbmFtZSA9IG5hbWU7CisgICAgSExfVEFCTEUoKVtoaWdobGlnaHRfZ2EuZ2FfbGVuXS5zZ19uYW1lX3UgPSB2aW1fc3Ryc2F2ZV91cChuYW1lKTsKKyNpZmRlZiBGRUFUX0dVSQorICAgIEhMX1RBQkxFKClbaGlnaGxpZ2h0X2dhLmdhX2xlbl0uc2dfZ3VpX2JnID0gSU5WQUxDT0xPUjsKKyAgICBITF9UQUJMRSgpW2hpZ2hsaWdodF9nYS5nYV9sZW5dLnNnX2d1aV9mZyA9IElOVkFMQ09MT1I7CisjZW5kaWYKKyAgICArK2hpZ2hsaWdodF9nYS5nYV9sZW47CisgICAgLS1oaWdobGlnaHRfZ2EuZ2Ffcm9vbTsKKworICAgIHJldHVybiBoaWdobGlnaHRfZ2EuZ2FfbGVuOwkJICAgIC8qIElEIGlzIGluZGV4IHBsdXMgb25lICovCit9CisKKy8qCisgKiBXaGVuLCBqdXN0IGFmdGVyIGNhbGxpbmcgc3luX2FkZF9ncm91cCgpLCBhbiBlcnJvciBpcyBkaXNjb3ZlcmVkLCB0aGlzCisgKiBmdW5jdGlvbiBkZWxldGVzIHRoZSBuZXcgbmFtZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzeW5fdW5hZGRfZ3JvdXAoKQoreworICAgIC0taGlnaGxpZ2h0X2dhLmdhX2xlbjsKKyAgICArK2hpZ2hsaWdodF9nYS5nYV9yb29tOworICAgIHZpbV9mcmVlKEhMX1RBQkxFKClbaGlnaGxpZ2h0X2dhLmdhX2xlbl0uc2dfbmFtZSk7CisgICAgdmltX2ZyZWUoSExfVEFCTEUoKVtoaWdobGlnaHRfZ2EuZ2FfbGVuXS5zZ19uYW1lX3UpOworfQorCisvKgorICogVHJhbnNsYXRlIGEgZ3JvdXAgSUQgdG8gaGlnaGxpZ2h0IGF0dHJpYnV0ZXMuCisgKi8KKyAgICBpbnQKK3N5bl9pZDJhdHRyKGhsX2lkKQorICAgIGludAkJCWhsX2lkOworeworICAgIGludAkJCWF0dHI7CisgICAgc3RydWN0IGhsX2dyb3VwCSpzZ3A7CisKKyAgICBobF9pZCA9IHN5bl9nZXRfZmluYWxfaWQoaGxfaWQpOworICAgIHNncCA9ICZITF9UQUJMRSgpW2hsX2lkIC0gMV07CSAgICAvKiBpbmRleCBpcyBJRCBtaW51cyBvbmUgKi8KKworI2lmZGVmIEZFQVRfR1VJCisgICAgLyoKKyAgICAgKiBPbmx5IHVzZSBHVUkgYXR0ciB3aGVuIHRoZSBHVUkgaXMgYmVpbmcgdXNlZC4KKyAgICAgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlhdHRyID0gc2dwLT5zZ19ndWlfYXR0cjsKKyAgICBlbHNlCisjZW5kaWYKKwlpZiAodF9jb2xvcnMgPiAxKQorCSAgICBhdHRyID0gc2dwLT5zZ19jdGVybV9hdHRyOworCWVsc2UKKwkgICAgYXR0ciA9IHNncC0+c2dfdGVybV9hdHRyOworCisgICAgcmV0dXJuIGF0dHI7Cit9CisKKyNpZmRlZiBGRUFUX0dVSQorLyoKKyAqIEdldCB0aGUgR1VJIGNvbG9ycyBhbmQgYXR0cmlidXRlcyBmb3IgYSBncm91cCBJRC4KKyAqIE5PVEU6IHRoZSBjb2xvcnMgd2lsbCBiZSBJTlZBTENPTE9SIHdoZW4gbm90IHNldCwgdGhlIGNvbG9yIG90aGVyd2lzZS4KKyAqLworICAgIGludAorc3luX2lkMmNvbG9ycyhobF9pZCwgZmdwLCBiZ3ApCisgICAgaW50CQlobF9pZDsKKyAgICBndWljb2xvcl9UCSpmZ3A7CisgICAgZ3VpY29sb3JfVAkqYmdwOworeworICAgIHN0cnVjdCBobF9ncm91cAkqc2dwOworCisgICAgaGxfaWQgPSBzeW5fZ2V0X2ZpbmFsX2lkKGhsX2lkKTsKKyAgICBzZ3AgPSAmSExfVEFCTEUoKVtobF9pZCAtIDFdOwkgICAgLyogaW5kZXggaXMgSUQgbWludXMgb25lICovCisKKyAgICAqZmdwID0gc2dwLT5zZ19ndWlfZmc7CisgICAgKmJncCA9IHNncC0+c2dfZ3VpX2JnOworICAgIHJldHVybiBzZ3AtPnNnX2d1aTsKK30KKyNlbmRpZgorCisvKgorICogVHJhbnNsYXRlIGEgZ3JvdXAgSUQgdG8gdGhlIGZpbmFsIGdyb3VwIElEIChmb2xsb3dpbmcgbGlua3MpLgorICovCisgICAgaW50CitzeW5fZ2V0X2ZpbmFsX2lkKGhsX2lkKQorICAgIGludAkJCWhsX2lkOworeworICAgIGludAkJCWNvdW50OworICAgIHN0cnVjdCBobF9ncm91cAkqc2dwOworCisgICAgaWYgKGhsX2lkID4gaGlnaGxpZ2h0X2dhLmdhX2xlbiB8fCBobF9pZCA8IDEpCisJcmV0dXJuIDA7CQkJLyogQ2FuIGJlIGNhbGxlZCBmcm9tIGV2YWwhISAqLworCisgICAgLyoKKyAgICAgKiBGb2xsb3cgbGlua3MgdW50aWwgdGhlcmUgaXMgbm8gbW9yZS4KKyAgICAgKiBMb29rIG91dCBmb3IgbG9vcHMhICBCcmVhayBhZnRlciAxMDAgbGlua3MuCisgICAgICovCisgICAgZm9yIChjb3VudCA9IDEwMDsgLS1jb3VudCA+PSAwOyApCisgICAgeworCXNncCA9ICZITF9UQUJMRSgpW2hsX2lkIC0gMV07CSAgICAvKiBpbmRleCBpcyBJRCBtaW51cyBvbmUgKi8KKwlpZiAoc2dwLT5zZ19saW5rID09IDAgfHwgc2dwLT5zZ19saW5rID4gaGlnaGxpZ2h0X2dhLmdhX2xlbikKKwkgICAgYnJlYWs7CisJaGxfaWQgPSBzZ3AtPnNnX2xpbms7CisgICAgfQorCisgICAgcmV0dXJuIGhsX2lkOworfQorCisjaWZkZWYgRkVBVF9HVUkKKy8qCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24ganVzdCBhZnRlciB0aGUgR1VJIGhhcyBzdGFydGVkLgorICogSXQgZmluZHMgdGhlIGZvbnQgYW5kIGNvbG9yIGhhbmRsZXMgZm9yIHRoZSBoaWdobGlnaHRpbmcgZ3JvdXBzLgorICovCisgICAgdm9pZAoraGlnaGxpZ2h0X2d1aV9zdGFydGVkKCkKK3sKKyAgICBpbnQJICAgIGlkeDsKKworICAgIC8qIEZpcnN0IGdldCB0aGUgY29sb3JzIGZyb20gdGhlICJOb3JtYWwiIGFuZCAiTWVudSIgZ3JvdXAsIGlmIHNldCAqLworICAgIHNldF9ub3JtYWxfY29sb3JzKCk7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGhpZ2hsaWdodF9nYS5nYV9sZW47ICsraWR4KQorCWd1aV9kb19vbmVfY29sb3IoaWR4LCBGQUxTRSwgRkFMU0UpOworCisgICAgaGlnaGxpZ2h0X2NoYW5nZWQoKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitndWlfZG9fb25lX2NvbG9yKGlkeCwgZG9fbWVudSwgZG9fdG9vbHRpcCkKKyAgICBpbnQJCWlkeDsKKyAgICBpbnQJCWRvX21lbnU7CS8qIFRSVUU6IG1pZ2h0IHNldCB0aGUgbWVudSBmb250ICovCisgICAgaW50CQlkb190b29sdGlwOwkvKiBUUlVFOiBtaWdodCBzZXQgdGhlIHRvb2x0aXAgZm9udCAqLworeworICAgIGludAkJZGlkaXQgPSBGQUxTRTsKKworICAgIGlmIChITF9UQUJMRSgpW2lkeF0uc2dfZm9udF9uYW1lICE9IE5VTEwpCisgICAgeworCWhsX2RvX2ZvbnQoaWR4LCBITF9UQUJMRSgpW2lkeF0uc2dfZm9udF9uYW1lLCBGQUxTRSwgZG9fbWVudSwKKwkJICAgZG9fdG9vbHRpcCk7CisJZGlkaXQgPSBUUlVFOworICAgIH0KKyAgICBpZiAoSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9mZ19uYW1lICE9IE5VTEwpCisgICAgeworCUhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmcgPQorCQkJICAgIGNvbG9yX25hbWUyaGFuZGxlKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfZmdfbmFtZSk7CisJZGlkaXQgPSBUUlVFOworICAgIH0KKyAgICBpZiAoSExfVEFCTEUoKVtpZHhdLnNnX2d1aV9iZ19uYW1lICE9IE5VTEwpCisgICAgeworCUhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYmcgPQorCQkJICAgIGNvbG9yX25hbWUyaGFuZGxlKEhMX1RBQkxFKClbaWR4XS5zZ19ndWlfYmdfbmFtZSk7CisJZGlkaXQgPSBUUlVFOworICAgIH0KKyAgICBpZiAoZGlkaXQpCS8qIG5lZWQgdG8gZ2V0IGEgbmV3IGF0dHIgbnVtYmVyICovCisJc2V0X2hsX2F0dHIoaWR4KTsKK30KKworI2VuZGlmCisKKy8qCisgKiBUcmFuc2xhdGUgdGhlICdoaWdobGlnaHQnIG9wdGlvbiBpbnRvIGF0dHJpYnV0ZXMgaW4gaGlnaGxpZ2h0X2F0dHJbXSBhbmQKKyAqIHNldCB1cCB0aGUgdXNlciBoaWdobGlnaHRzIFVzZXIxLi45LiAgSWYgRkVBVF9TVExfT1BUIGlzIGluIHVzZSwgYSBzZXQgb2YKKyAqIGNvcnJlc3BvbmRpbmcgaGlnaGxpZ2h0cyB0byB1c2Ugb24gdG9wIG9mIEhMRl9TTkMgaXMgY29tcHV0ZWQuCisgKiBDYWxsZWQgb25seSB3aGVuIHRoZSAnaGlnaGxpZ2h0JyBvcHRpb24gaGFzIGJlZW4gY2hhbmdlZCBhbmQgdXBvbiBmaXJzdAorICogc2NyZWVuIHJlZHJhdyBhZnRlciBhbnkgOmhpZ2hsaWdodCBjb21tYW5kLgorICogUmV0dXJuIEZBSUwgd2hlbiBhbiBpbnZhbGlkIGZsYWcgaXMgZm91bmQgaW4gJ2hpZ2hsaWdodCcuICBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK2hpZ2hsaWdodF9jaGFuZ2VkKCkKK3sKKyAgICBpbnQJCWhsZjsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpwOworICAgIGludAkJYXR0cjsKKyAgICBjaGFyX3UJKmVuZDsKKyAgICBpbnQJCWlkOworI2lmZGVmIFVTRVJfSElHSExJR0hUCisgICAgY2hhcl91ICAgICAgdXNlcmhsWzEwXTsKKyMgaWZkZWYgRkVBVF9TVExfT1BUCisgICAgaW50CQlpZF9TTkMgPSAtMTsKKyAgICBpbnQJCWlkX1MgPSAtMTsKKyAgICBpbnQJCWhsY250OworIyBlbmRpZgorI2VuZGlmCisgICAgc3RhdGljIGludAlobF9mbGFnc1tITEZfQ09VTlRdID0gSExfRkxBR1M7CisKKyAgICBuZWVkX2hpZ2hsaWdodF9jaGFuZ2VkID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIENsZWFyIGFsbCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIGZvciAoaGxmID0gMDsgaGxmIDwgKGludClITEZfQ09VTlQ7ICsraGxmKQorCWhpZ2hsaWdodF9hdHRyW2hsZl0gPSAwOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBzZXQgYWxsIGF0dHJpYnV0ZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBUaGVuIHVzZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSAnaGlnaGxpZ2h0JyBvcHRpb24uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKKyAgICB7CisJaWYgKGkpCisJICAgIHAgPSBwX2hsOworCWVsc2UKKwkgICAgcCA9IGdldF9oaWdobGlnaHRfZGVmYXVsdCgpOworCWlmIChwID09IE5VTEwpCSAgICAvKiBqdXN0IGluIGNhc2UgKi8KKwkgICAgY29udGludWU7CisKKwl3aGlsZSAoKnApCisJeworCSAgICBmb3IgKGhsZiA9IDA7IGhsZiA8IChpbnQpSExGX0NPVU5UOyArK2hsZikKKwkJaWYgKGhsX2ZsYWdzW2hsZl0gPT0gKnApCisJCSAgICBicmVhazsKKwkgICAgKytwOworCSAgICBpZiAoaGxmID09IChpbnQpSExGX0NPVU5UIHx8ICpwID09IE5VTCkKKwkJcmV0dXJuIEZBSUw7CisKKwkgICAgLyoKKwkgICAgICogQWxsb3cgc2V2ZXJhbCBobF9mbGFncyB0byBiZSBjb21iaW5lZCwgbGlrZSAiYnUiIGZvcgorCSAgICAgKiBib2xkLXVuZGVybGluZWQuCisJICAgICAqLworCSAgICBhdHRyID0gMDsKKwkgICAgZm9yICggOyAqcCAmJiAqcCAhPSAnLCc7ICsrcCkJICAgIC8qIHBhcnNlIHVwdG8gY29tbWEgKi8KKwkgICAgeworCQlpZiAodmltX2lzd2hpdGUoKnApKQkJICAgIC8qIGlnbm9yZSB3aGl0ZSBzcGFjZSAqLworCQkgICAgY29udGludWU7CisKKwkJaWYgKGF0dHIgPiBITF9BTEwpICAvKiBDb21iaW5hdGlvbiB3aXRoICc6JyBpcyBub3QgYWxsb3dlZC4gKi8KKwkJICAgIHJldHVybiBGQUlMOworCisJCXN3aXRjaCAoKnApCisJCXsKKwkJICAgIGNhc2UgJ2InOglhdHRyIHw9IEhMX0JPTEQ7CisJCQkJYnJlYWs7CisJCSAgICBjYXNlICdpJzoJYXR0ciB8PSBITF9JVEFMSUM7CisJCQkJYnJlYWs7CisJCSAgICBjYXNlICctJzoKKwkJICAgIGNhc2UgJ24nOgkJCSAgICAvKiBubyBoaWdobGlnaHRpbmcgKi8KKwkJCQlicmVhazsKKwkJICAgIGNhc2UgJ3InOglhdHRyIHw9IEhMX0lOVkVSU0U7CisJCQkJYnJlYWs7CisJCSAgICBjYXNlICdzJzoJYXR0ciB8PSBITF9TVEFORE9VVDsKKwkJCQlicmVhazsKKwkJICAgIGNhc2UgJ3UnOglhdHRyIHw9IEhMX1VOREVSTElORTsKKwkJCQlicmVhazsKKwkJICAgIGNhc2UgJzonOgkrK3A7CQkgICAgLyogaGlnaGxpZ2h0IGdyb3VwIG5hbWUgKi8KKwkJCQlpZiAoYXR0ciB8fCAqcCA9PSBOVUwpCSAvKiBubyBjb21iaW5hdGlvbnMgKi8KKwkJCQkgICAgcmV0dXJuIEZBSUw7CisJCQkJZW5kID0gdmltX3N0cmNocihwLCAnLCcpOworCQkJCWlmIChlbmQgPT0gTlVMTCkKKwkJCQkgICAgZW5kID0gcCArIFNUUkxFTihwKTsKKwkJCQlpZCA9IHN5bl9jaGVja19ncm91cChwLCAoaW50KShlbmQgLSBwKSk7CisJCQkJaWYgKGlkID09IDApCisJCQkJICAgIHJldHVybiBGQUlMOworCQkJCWF0dHIgPSBzeW5faWQyYXR0cihpZCk7CisJCQkJcCA9IGVuZCAtIDE7CisjaWYgZGVmaW5lZChGRUFUX1NUTF9PUFQpICYmIGRlZmluZWQoVVNFUl9ISUdITElHSFQpCisJCQkJaWYgKGhsZiA9PSAoaW50KUhMRl9TTkMpCisJCQkJICAgIGlkX1NOQyA9IHN5bl9nZXRfZmluYWxfaWQoaWQpOworCQkJCWVsc2UgaWYgKGhsZiA9PSAoaW50KUhMRl9TKQorCQkJCSAgICBpZF9TID0gc3luX2dldF9maW5hbF9pZChpZCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CXJldHVybiBGQUlMOworCQl9CisJICAgIH0KKwkgICAgaGlnaGxpZ2h0X2F0dHJbaGxmXSA9IGF0dHI7CisKKwkgICAgcCA9IHNraXBfdG9fb3B0aW9uX3BhcnQocCk7CSAgICAvKiBza2lwIGNvbW1hIGFuZCBzcGFjZXMgKi8KKwl9CisgICAgfQorCisjaWZkZWYgVVNFUl9ISUdITElHSFQKKyAgICAvKiBTZXR1cCB0aGUgdXNlciBoaWdobGlnaHRzCisgICAgICoKKyAgICAgKiBUZW1wb3JhcmlseSAgdXRpbGl6ZSAxMCBtb3JlIGhsIGVudHJpZXMuICBIYXZlIHRvIGJlIGluIHRoZXJlCisgICAgICogc2ltdWx0YW5lb3VzbHkgaW4gY2FzZSBvZiB0YWJsZSBvdmVyZmxvd3MgaW4gZ2V0X2F0dHJfZW50cnkoKQorICAgICAqLworIyBpZmRlZiBGRUFUX1NUTF9PUFQKKyAgICBpZiAoZ2FfZ3JvdygmaGlnaGxpZ2h0X2dhLCAxMCkgPT0gRkFJTCkKKwlyZXR1cm4gRkFJTDsKKyAgICBobGNudCA9IGhpZ2hsaWdodF9nYS5nYV9sZW47CisgICAgaWYgKGlkX1MgPT0gMCkKKyAgICB7CQkgICAgLyogTWFrZSBzdXJlIGlkX1MgaXMgYWx3YXlzIHZhbGlkIHRvIHNpbXBsaWZ5IGNvZGUgYmVsb3cgKi8KKwltZW1zZXQoJkhMX1RBQkxFKClbaGxjbnQgKyA5XSwgMCwgc2l6ZW9mKHN0cnVjdCBobF9ncm91cCkpOworCUhMX1RBQkxFKClbaGxjbnQgKyA5XS5zZ190ZXJtID0gaGlnaGxpZ2h0X2F0dHJbSExGX1NdOworCWlkX1MgPSBobGNudCArIDEwOworICAgIH0KKyMgZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgIHsKKwlzcHJpbnRmKChjaGFyICopdXNlcmhsLCAiVXNlciVkIiwgaSArIDEpOworCWlkID0gc3luX25hbWUyaWQodXNlcmhsKTsKKwlpZiAoaWQgPT0gMCkKKwl7CisJICAgIGhpZ2hsaWdodF91c2VyW2ldID0gMDsKKyMgaWZkZWYgRkVBVF9TVExfT1BUCisJICAgIGhpZ2hsaWdodF9zdGxuY1tpXSA9IDA7CisjIGVuZGlmCisJfQorCWVsc2UKKwl7CisjIGlmZGVmIEZFQVRfU1RMX09QVAorCSAgICBzdHJ1Y3QgaGxfZ3JvdXAgKmhsdCA9IEhMX1RBQkxFKCk7CisjIGVuZGlmCisKKwkgICAgaGlnaGxpZ2h0X3VzZXJbaV0gPSBzeW5faWQyYXR0cihpZCk7CisjIGlmZGVmIEZFQVRfU1RMX09QVAorCSAgICBpZiAoaWRfU05DID09IDApCisJICAgIHsKKwkJbWVtc2V0KCZobHRbaGxjbnQgKyBpXSwgMCwgc2l6ZW9mKHN0cnVjdCBobF9ncm91cCkpOworCQlobHRbaGxjbnQgKyBpXS5zZ190ZXJtID0gaGlnaGxpZ2h0X2F0dHJbSExGX1NOQ107CisJCWhsdFtobGNudCArIGldLnNnX2N0ZXJtID0gaGlnaGxpZ2h0X2F0dHJbSExGX1NOQ107CisjICBpZmRlZiBGRUFUX0dVSQorCQlobHRbaGxjbnQgKyBpXS5zZ19ndWkgPSBoaWdobGlnaHRfYXR0cltITEZfU05DXTsKKyMgIGVuZGlmCisJICAgIH0KKwkgICAgZWxzZQorCQltY2hfbWVtbW92ZSgmaGx0W2hsY250ICsgaV0sCisJCQkgICAgJmhsdFtpZF9TTkMgLSAxXSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGhsX2dyb3VwKSk7CisJICAgIGhsdFtobGNudCArIGldLnNnX2xpbmsgPSAwOworCisJICAgIC8qIEFwcGx5IGRpZmZlcmVuY2UgYmV0d2VlbiBVc2VyWCBhbmQgSExGX1MgdG8gSExGX1NOQyAqLworCSAgICBobHRbaGxjbnQgKyBpXS5zZ190ZXJtIF49CisJCWhsdFtpZCAtIDFdLnNnX3Rlcm0gXiBobHRbaWRfUyAtIDFdLnNnX3Rlcm07CisJICAgIGlmIChobHRbaWQgLSAxXS5zZ19zdGFydCAhPSBobHRbaWRfUyAtIDFdLnNnX3N0YXJ0KQorCQlobHRbaGxjbnQgKyBpXS5zZ19zdGFydCA9IGhsdFtpZCAtIDFdLnNnX3N0YXJ0OworCSAgICBpZiAoaGx0W2lkIC0gMV0uc2dfc3RvcCAhPSBobHRbaWRfUyAtIDFdLnNnX3N0b3ApCisJCWhsdFtobGNudCArIGldLnNnX3N0b3AgPSBobHRbaWQgLSAxXS5zZ19zdG9wOworCSAgICBobHRbaGxjbnQgKyBpXS5zZ19jdGVybSBePQorCQlobHRbaWQgLSAxXS5zZ19jdGVybSBeIGhsdFtpZF9TIC0gMV0uc2dfY3Rlcm07CisJICAgIGlmIChobHRbaWQgLSAxXS5zZ19jdGVybV9mZyAhPSBobHRbaWRfUyAtIDFdLnNnX2N0ZXJtX2ZnKQorCQlobHRbaGxjbnQgKyBpXS5zZ19jdGVybV9mZyA9IGhsdFtpZCAtIDFdLnNnX2N0ZXJtX2ZnOworCSAgICBpZiAoaGx0W2lkIC0gMV0uc2dfY3Rlcm1fYmcgIT0gaGx0W2lkX1MgLSAxXS5zZ19jdGVybV9iZykKKwkJaGx0W2hsY250ICsgaV0uc2dfY3Rlcm1fYmcgPSBobHRbaWQgLSAxXS5zZ19jdGVybV9iZzsKKyMgIGlmZGVmIEZFQVRfR1VJCisJICAgIGhsdFtobGNudCArIGldLnNnX2d1aSBePQorCQlobHRbaWQgLSAxXS5zZ19ndWkgXiBobHRbaWRfUyAtIDFdLnNnX2d1aTsKKwkgICAgaWYgKGhsdFtpZCAtIDFdLnNnX2d1aV9mZyAhPSBobHRbaWRfUyAtIDFdLnNnX2d1aV9mZykKKwkJaGx0W2hsY250ICsgaV0uc2dfZ3VpX2ZnID0gaGx0W2lkIC0gMV0uc2dfZ3VpX2ZnOworCSAgICBpZiAoaGx0W2lkIC0gMV0uc2dfZ3VpX2JnICE9IGhsdFtpZF9TIC0gMV0uc2dfZ3VpX2JnKQorCQlobHRbaGxjbnQgKyBpXS5zZ19ndWlfYmcgPSBobHRbaWQgLSAxXS5zZ19ndWlfYmc7CisJICAgIGlmIChobHRbaWQgLSAxXS5zZ19mb250ICE9IGhsdFtpZF9TIC0gMV0uc2dfZm9udCkKKwkJaGx0W2hsY250ICsgaV0uc2dfZm9udCA9IGhsdFtpZCAtIDFdLnNnX2ZvbnQ7CisjICAgaWZkZWYgRkVBVF9YRk9OVFNFVAorCSAgICBpZiAoaGx0W2lkIC0gMV0uc2dfZm9udHNldCAhPSBobHRbaWRfUyAtIDFdLnNnX2ZvbnRzZXQpCisJCWhsdFtobGNudCArIGldLnNnX2ZvbnRzZXQgPSBobHRbaWQgLSAxXS5zZ19mb250c2V0OworIyAgIGVuZGlmCisjICBlbmRpZgorCSAgICBoaWdobGlnaHRfZ2EuZ2FfbGVuID0gaGxjbnQgKyBpICsgMTsKKwkgICAgc2V0X2hsX2F0dHIoaGxjbnQgKyBpKTsJLyogQXQgbG9uZyBsYXN0IHdlIGNhbiBhcHBseSAqLworCSAgICBoaWdobGlnaHRfc3RsbmNbaV0gPSBzeW5faWQyYXR0cihobGNudCArIGkgKyAxKTsKKyMgZW5kaWYKKwl9CisgICAgfQorIyBpZmRlZiBGRUFUX1NUTF9PUFQKKyAgICBoaWdobGlnaHRfZ2EuZ2FfbGVuID0gaGxjbnQ7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVU0VSX0hJR0hMSUdIVCAqLworCisgICAgcmV0dXJuIE9LOworfQorCisjaWZkZWYgRkVBVF9DTURMX0NPTVBMCisKK3N0YXRpYyB2b2lkIGhpZ2hsaWdodF9saXN0IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgaGlnaGxpZ2h0X2xpc3RfdHdvIF9fQVJHUygoaW50IGNudCwgaW50IGF0dHIpKTsKKworLyoKKyAqIEhhbmRsZSBjb21tYW5kIGxpbmUgY29tcGxldGlvbiBmb3IgOmhpZ2hsaWdodCBjb21tYW5kLgorICovCisgICAgdm9pZAorc2V0X2NvbnRleHRfaW5faGlnaGxpZ2h0X2NtZCh4cCwgYXJnKQorICAgIGV4cGFuZF9UCSp4cDsKKyAgICBjaGFyX3UJKmFyZzsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICAvKiBEZWZhdWx0OiBleHBhbmQgZ3JvdXAgbmFtZXMgKi8KKyAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9ISUdITElHSFQ7CisgICAgeHAtPnhwX3BhdHRlcm4gPSBhcmc7CisgICAgaW5jbHVkZV9saW5rID0gVFJVRTsKKyAgICBpbmNsdWRlX2RlZmF1bHQgPSBUUlVFOworCisgICAgLyogKHBhcnQgb2YpIHN1YmNvbW1hbmQgYWxyZWFkeSB0eXBlZCAqLworICAgIGlmICgqYXJnICE9IE5VTCkKKyAgICB7CisJcCA9IHNraXB0b3doaXRlKGFyZyk7CisJaWYgKCpwICE9IE5VTCkJCQkvKiBwYXN0ICJkZWZhdWx0IiBvciBncm91cCBuYW1lICovCisJeworCSAgICBpbmNsdWRlX2RlZmF1bHQgPSBGQUxTRTsKKwkgICAgaWYgKFNUUk5DTVAoImRlZmF1bHQiLCBhcmcsIHAgLSBhcmcpID09IDApCisJICAgIHsKKwkJYXJnID0gc2tpcHdoaXRlKHApOworCQl4cC0+eHBfcGF0dGVybiA9IGFyZzsKKwkJcCA9IHNraXB0b3doaXRlKGFyZyk7CisJICAgIH0KKwkgICAgaWYgKCpwICE9IE5VTCkJCQkvKiBwYXN0IGdyb3VwIG5hbWUgKi8KKwkgICAgeworCQlpbmNsdWRlX2xpbmsgPSBGQUxTRTsKKwkJaWYgKGFyZ1sxXSA9PSAnaScgJiYgYXJnWzBdID09ICdOJykKKwkJICAgIGhpZ2hsaWdodF9saXN0KCk7CisJCWlmIChTVFJOQ01QKCJsaW5rIiwgYXJnLCBwIC0gYXJnKSA9PSAwCisJCQl8fCBTVFJOQ01QKCJjbGVhciIsIGFyZywgcCAtIGFyZykgPT0gMCkKKwkJeworCQkgICAgeHAtPnhwX3BhdHRlcm4gPSBza2lwd2hpdGUocCk7CisJCSAgICBwID0gc2tpcHRvd2hpdGUoeHAtPnhwX3BhdHRlcm4pOworCQkgICAgaWYgKCpwICE9IE5VTCkJCS8qIHBhc3QgZmlyc3QgZ3JvdXAgbmFtZSAqLworCQkgICAgeworCQkJeHAtPnhwX3BhdHRlcm4gPSBza2lwd2hpdGUocCk7CisJCQlwID0gc2tpcHRvd2hpdGUoeHAtPnhwX3BhdHRlcm4pOworCQkgICAgfQorCQl9CisJCWlmICgqcCAhPSBOVUwpCQkJLyogcGFzdCBncm91cCBuYW1lKHMpICovCisJCSAgICB4cC0+eHBfY29udGV4dCA9IEVYUEFORF9OT1RISU5HOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIExpc3QgaGlnaGxpZ2h0aW5nIG1hdGNoZXMgaW4gYSBuaWNlIHdheS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitoaWdobGlnaHRfbGlzdCgpCit7CisgICAgaW50CQlpOworCisgICAgZm9yIChpID0gMTA7IC0taSA+PSAwOyApCisJaGlnaGxpZ2h0X2xpc3RfdHdvKGksIGhsX2F0dHIoSExGX0QpKTsKKyAgICBmb3IgKGkgPSA0MDsgLS1pID49IDA7ICkKKwloaWdobGlnaHRfbGlzdF90d28oOTksIDApOworfQorCisgICAgc3RhdGljIHZvaWQKK2hpZ2hsaWdodF9saXN0X3R3byhjbnQsIGF0dHIpCisgICAgaW50CSAgICBjbnQ7CisgICAgaW50CSAgICBhdHRyOworeworICAgIG1zZ19wdXRzX2F0dHIoKGNoYXJfdSAqKSgiTiBcYkkgXGIhICBcYiIgKyBjbnQgLyAxMSksIGF0dHIpOworICAgIG1zZ19jbHJfZW9zKCk7CisgICAgb3V0X2ZsdXNoKCk7CisgICAgdWlfZGVsYXkoY250ID09IDk5ID8gNDBMIDogKGxvbmcpY250ICogNTBMLCBGQUxTRSk7Cit9CisKKyNlbmRpZiAvKiBGRUFUX0NNRExfQ09NUEwgKi8KKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCAoZGVmaW5lZChGRUFUX1NZTl9ITCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpKSBcCisgICAgfHwgZGVmaW5lZChGRUFUX1NJR05TKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZ1bmN0aW9uIGdpdmVuIHRvIEV4cGFuZEdlbmVyaWMoKSB0byBvYnRhaW4gdGhlIGxpc3Qgb2YgZ3JvdXAgbmFtZXMuCisgKiBBbHNvIHVzZWQgZm9yIHN5bklEYXR0cigpIGZ1bmN0aW9uLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBjaGFyX3UgKgorZ2V0X2hpZ2hsaWdodF9uYW1lKHhwLCBpZHgpCisgICAgZXhwYW5kX1QJKnhwOworICAgIGludAkJaWR4OworeworICAgIGlmIChpZHggPT0gaGlnaGxpZ2h0X2dhLmdhX2xlbgorI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorCSAgICAmJiBpbmNsdWRlX2xpbmsKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIChjaGFyX3UgKikibGluayI7CisgICAgaWYgKGlkeCA9PSBoaWdobGlnaHRfZ2EuZ2FfbGVuICsgMQorI2lmZGVmIEZFQVRfQ01ETF9DT01QTAorCSAgICAmJiBpbmNsdWRlX2xpbmsKKyNlbmRpZgorCSAgICApCisJcmV0dXJuIChjaGFyX3UgKikiY2xlYXIiOworICAgIGlmIChpZHggPT0gaGlnaGxpZ2h0X2dhLmdhX2xlbiArIDIKKyNpZmRlZiBGRUFUX0NNRExfQ09NUEwKKwkgICAgJiYgaW5jbHVkZV9kZWZhdWx0CisjZW5kaWYKKwkgICAgKQorCXJldHVybiAoY2hhcl91ICopImRlZmF1bHQiOworICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBoaWdobGlnaHRfZ2EuZ2FfbGVuKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBITF9UQUJMRSgpW2lkeF0uc2dfbmFtZTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKy8qCisgKiBGcmVlIGFsbCB0aGUgaGlnaGxpZ2h0IGdyb3VwIGZvbnRzLgorICogVXNlZCB3aGVuIHF1aXR0aW5nIGZvciBzeXN0ZW1zIHdoaWNoIG5lZWQgaXQuCisgKi8KKyAgICB2b2lkCitmcmVlX2hpZ2hsaWdodF9mb250cygpCit7CisgICAgaW50CSAgICBpZHg7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGhpZ2hsaWdodF9nYS5nYV9sZW47ICsraWR4KQorICAgIHsKKwlndWlfbWNoX2ZyZWVfZm9udChITF9UQUJMRSgpW2lkeF0uc2dfZm9udCk7CisJSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnQgPSBOT0ZPTlQ7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKwlndWlfbWNoX2ZyZWVfZm9udHNldChITF9UQUJMRSgpW2lkeF0uc2dfZm9udHNldCk7CisJSExfVEFCTEUoKVtpZHhdLnNnX2ZvbnRzZXQgPSBOT0ZPTlRTRVQ7CisjIGVuZGlmCisgICAgfQorCisgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLm5vcm1fZm9udCk7CisjIGlmZGVmIEZFQVRfWEZPTlRTRVQKKyAgICBndWlfbWNoX2ZyZWVfZm9udHNldChndWkuZm9udHNldCk7CisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX0dUSzIKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkuYm9sZF9mb250KTsKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkuaXRhbF9mb250KTsKKyAgICBndWlfbWNoX2ZyZWVfZm9udChndWkuYm9sZGl0YWxfZm9udCk7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRW5kIG9mIEhpZ2hsaWdodGluZyBzdHVmZgkgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9zcmMvdGFnLmMgYi9zcmMvdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZDVhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90YWcuYwpAQCAtMCwwICsxLDM1MzQgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIENvZGUgdG8gaGFuZGxlIHRhZ3MgYW5kIHRoZSB0YWcgc3RhY2sKKyAqLworCisjaWYgZGVmaW5lZCBNU0RPUyB8fCBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQoX1dJTjY0KQorIyBpbmNsdWRlIDxpby5oPgkvKiBmb3IgbHNlZWsoKSwgbXVzdCBiZSBiZWZvcmUgdmltLmggKi8KKyNlbmRpZgorCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4JLyogZm9yIGxzZWVrKCkgKi8KKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIHRvIGhvbGQgcG9pbnRlcnMgdG8gdmFyaW91cyBpdGVtcyBpbiBhIHRhZyBsaW5lLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWdfcG9pbnRlcnMKK3sKKyAgICAvKiBmaWxsZWQgaW4gYnkgcGFyc2VfdGFnX2xpbmUoKTogKi8KKyAgICBjaGFyX3UJKnRhZ25hbWU7CS8qIHN0YXJ0IG9mIHRhZyBuYW1lIChza2lwICJmaWxlOiIpICovCisgICAgY2hhcl91CSp0YWduYW1lX2VuZDsJLyogY2hhciBhZnRlciB0YWcgbmFtZSAqLworICAgIGNoYXJfdQkqZm5hbWU7CQkvKiBmaXJzdCBjaGFyIG9mIGZpbGUgbmFtZSAqLworICAgIGNoYXJfdQkqZm5hbWVfZW5kOwkvKiBjaGFyIGFmdGVyIGZpbGUgbmFtZSAqLworICAgIGNoYXJfdQkqY29tbWFuZDsJLyogZmlyc3QgY2hhciBvZiBjb21tYW5kICovCisgICAgLyogZmlsbGVkIGluIGJ5IHBhcnNlX21hdGNoKCk6ICovCisgICAgY2hhcl91CSpjb21tYW5kX2VuZDsJLyogZmlyc3QgY2hhciBhZnRlciBjb21tYW5kICovCisgICAgY2hhcl91CSp0YWdfZm5hbWU7CS8qIGZpbGUgbmFtZSBvZiB0aGUgdGFncyBmaWxlICovCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgaW50CQlpc19ldGFnOwkvKiBUUlVFIGZvciBlbWFjcyB0YWcgKi8KKyNlbmRpZgorICAgIGNoYXJfdQkqdGFna2luZDsJLyogImtpbmQ6IiB2YWx1ZSAqLworICAgIGNoYXJfdQkqdGFna2luZF9lbmQ7CS8qIGVuZCBvZiB0YWdraW5kICovCit9IHRhZ3B0cnNfVDsKKworLyoKKyAqIFRoZSBtYXRjaGluZyB0YWdzIGFyZSBmaXJzdCBzdG9yZWQgaW4gZ2FfbWF0Y2hbXS4gIEluIHdoaWNoIG9uZSBkZXBlbmRzIG9uCisgKiB0aGUgcHJpb3JpdHkgb2YgdGhlIG1hdGNoLgorICogQXQgdGhlIGVuZCwgdGhlIG1hdGNoZXMgZnJvbSBnYV9tYXRjaFtdIGFyZSBjb25jYXRlbmF0ZWQsIHRvIG1ha2UgYSBsaXN0CisgKiBzb3J0ZWQgb24gcHJpb3JpdHkuCisgKi8KKyNkZWZpbmUgTVRfU1RfQ1VSCTAJCS8qIHN0YXRpYyBtYXRjaCBpbiBjdXJyZW50IGZpbGUgKi8KKyNkZWZpbmUgTVRfR0xfQ1VSCTEJCS8qIGdsb2JhbCBtYXRjaCBpbiBjdXJyZW50IGZpbGUgKi8KKyNkZWZpbmUgTVRfR0xfT1RICTIJCS8qIGdsb2JhbCBtYXRjaCBpbiBvdGhlciBmaWxlICovCisjZGVmaW5lIE1UX1NUX09USAkzCQkvKiBzdGF0aWMgbWF0Y2ggaW4gb3RoZXIgZmlsZSAqLworI2RlZmluZSBNVF9JQ19TVF9DVVIJNAkJLyogaWNhc2Ugc3RhdGljIG1hdGNoIGluIGN1cnJlbnQgZmlsZSAqLworI2RlZmluZSBNVF9JQ19HTF9DVVIJNQkJLyogaWNhc2UgZ2xvYmFsIG1hdGNoIGluIGN1cnJlbnQgZmlsZSAqLworI2RlZmluZSBNVF9JQ19HTF9PVEgJNgkJLyogaWNhc2UgZ2xvYmFsIG1hdGNoIGluIG90aGVyIGZpbGUgKi8KKyNkZWZpbmUgTVRfSUNfU1RfT1RICTcJCS8qIGljYXNlIHN0YXRpYyBtYXRjaCBpbiBvdGhlciBmaWxlICovCisjZGVmaW5lIE1UX0lDX09GRgk0CQkvKiBhZGQgZm9yIGljYXNlIG1hdGNoICovCisjZGVmaW5lIE1UX1JFX09GRgk4CQkvKiBhZGQgZm9yIHJlZ2V4cCBtYXRjaCAqLworI2RlZmluZSBNVF9NQVNLCQk3CQkvKiBtYXNrIGZvciBwcmludGluZyBwcmlvcml0eSAqLworI2RlZmluZSBNVF9DT1VOVAkxNgorCitzdGF0aWMgY2hhcgkqbXRfbmFtZXNbTVRfQ09VTlQvMl0gPQorCQl7IkZTQyIsICJGIEMiLCAiRiAgIiwgIkZTICIsICIgU0MiLCAiICBDIiwgIiAgICIsICIgUyAifTsKKworI2RlZmluZSBOT1RBR0ZJTEUJOTkJCS8qIHJldHVybiB2YWx1ZSBmb3IganVtcHRvX3RhZyAqLworc3RhdGljIGNoYXJfdQkqbm9maWxlX2ZuYW1lID0gTlVMTDsJLyogZm5hbWUgZm9yIE5PVEFHRklMRSBlcnJvciAqLworCitzdGF0aWMgdm9pZCB0YWdsZW5fYWR2YW5jZSBfX0FSR1MoKGludCBsKSk7CitzdGF0aWMgaW50IGdldF90YWdmbmFtZSBfX0FSR1MoKGludCBmaXJzdCwgY2hhcl91ICpidWYpKTsKKworc3RhdGljIGludCBqdW1wdG9fdGFnIF9fQVJHUygoY2hhcl91ICpsYnVmLCBpbnQgZm9yY2VpdCwgaW50IGtlZXBfaGVscCkpOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworc3RhdGljIGludCBwYXJzZV90YWdfbGluZSBfX0FSR1MoKGNoYXJfdSAqbGJ1ZiwgaW50IGlzX2V0YWcsIHRhZ3B0cnNfVCAqdGFncCkpOworI2Vsc2UKK3N0YXRpYyBpbnQgcGFyc2VfdGFnX2xpbmUgX19BUkdTKChjaGFyX3UgKmxidWYsIHRhZ3B0cnNfVCAqdGFncCkpOworI2VuZGlmCitzdGF0aWMgaW50IHRlc3RfZm9yX3N0YXRpYyBfX0FSR1MoKHRhZ3B0cnNfVCAqKSk7CitzdGF0aWMgaW50IHBhcnNlX21hdGNoIF9fQVJHUygoY2hhcl91ICpsYnVmLCB0YWdwdHJzX1QgKnRhZ3ApKTsKK3N0YXRpYyBjaGFyX3UgKnRhZ19mdWxsX2ZuYW1lIF9fQVJHUygodGFncHRyc19UICp0YWdwKSk7CitzdGF0aWMgY2hhcl91ICpleHBhbmRfdGFnX2ZuYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICp0YWdfZm5hbWUsIGludCBleHBhbmQpKTsKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKK3N0YXRpYyBpbnQgdGVzdF9mb3JfY3VycmVudCBfX0FSR1MoKGludCwgY2hhcl91ICosIGNoYXJfdSAqLCBjaGFyX3UgKiwgY2hhcl91ICopKTsKKyNlbHNlCitzdGF0aWMgaW50IHRlc3RfZm9yX2N1cnJlbnQgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGNoYXJfdSAqLCBjaGFyX3UgKikpOworI2VuZGlmCitzdGF0aWMgaW50IGZpbmRfZXh0cmEgX19BUkdTKChjaGFyX3UgKipwcCkpOworCitzdGF0aWMgY2hhcl91ICpib3R0b21tc2cgPSAoY2hhcl91ICopTl8oIkU1NTU6IGF0IGJvdHRvbSBvZiB0YWcgc3RhY2siKTsKK3N0YXRpYyBjaGFyX3UgKnRvcG1zZyA9IChjaGFyX3UgKilOXygiRTU1NjogYXQgdG9wIG9mIHRhZyBzdGFjayIpOworCitzdGF0aWMgY2hhcl91CSp0YWdtYXRjaG5hbWUgPSBOVUxMOwkvKiBuYW1lIG9mIGxhc3QgdXNlZCB0YWcgKi8KKworLyoKKyAqIFdlIHVzZSBmdGVsbG8oKSBoZXJlLCBpZiBhdmFpbGFibGUuICBJdCByZXR1cm5zIG9mZl90IGluc3RlYWQgb2YgbG9uZywKKyAqIHdoaWNoIGhlbHBzIGlmIGxvbmcgaXMgMzIgYml0IGFuZCBvZmZfdCBpcyA2NCBiaXQuCisgKi8KKyNpZmRlZiBIQVZFX0ZURUxMTworIyBkZWZpbmUgZnRlbGwgZnRlbGxvCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisvKgorICogVGFnIGZvciBwcmV2aWV3IHdpbmRvdyBpcyByZW1lbWJlcmVkIHNlcGFyYXRlbHksIHRvIGF2b2lkIG1lc3NpbmcgdXAgdGhlCisgKiBub3JtYWwgdGFnc3RhY2suCisgKi8KK3N0YXRpYyB0YWdneV9UIHB0YWdfZW50cnkgPSB7TlVMTH07CisjZW5kaWYKKworLyoKKyAqIEp1bXAgdG8gdGFnOyBoYW5kbGluZyBvZiB0YWcgY29tbWFuZHMgYW5kIHRhZyBzdGFjaworICoKKyAqICp0YWcgIT0gTlVMOiAiOnRhZyB7dGFnfSIsIGp1bXAgdG8gbmV3IHRhZywgYWRkIHRvIHRhZyBzdGFjaworICoKKyAqIHR5cGUgPT0gRFRfVEFHOgkiOnRhZyBbdGFnXSIsIGp1bXAgdG8gbmV3ZXIgcG9zaXRpb24gb3Igc2FtZSB0YWcgYWdhaW4KKyAqIHR5cGUgPT0gRFRfSEVMUDoJbGlrZSBEVF9UQUcsIGJ1dCBkb24ndCB1c2UgcmVnZXhwLgorICogdHlwZSA9PSBEVF9QT1A6CSI6cG9wIiBvciBDVFJMLVQsIGp1bXAgdG8gb2xkIHBvc2l0aW9uCisgKiB0eXBlID09IERUX05FWFQ6CWp1bXAgdG8gbmV4dCBtYXRjaCBvZiBzYW1lIHRhZworICogdHlwZSA9PSBEVF9QUkVWOglqdW1wIHRvIHByZXZpb3VzIG1hdGNoIG9mIHNhbWUgdGFnCisgKiB0eXBlID09IERUX0ZJUlNUOglqdW1wIHRvIGZpcnN0IG1hdGNoIG9mIHNhbWUgdGFnCisgKiB0eXBlID09IERUX0xBU1Q6CWp1bXAgdG8gbGFzdCBtYXRjaCBvZiBzYW1lIHRhZworICogdHlwZSA9PSBEVF9TRUxFQ1Q6CSI6dHNlbGVjdCBbdGFnXSIsIHNlbGVjdCB0YWcgZnJvbSBhIGxpc3Qgb2YgYWxsIG1hdGNoZXMKKyAqIHR5cGUgPT0gRFRfSlVNUDoJIjp0anVtcCBbdGFnXSIsIGp1bXAgdG8gdGFnIG9yIHNlbGVjdCB0YWcgZnJvbSBhIGxpc3QKKyAqIHR5cGUgPT0gRFRfQ1NDT1BFOgl1c2UgY3Njb3BlIHRvIGZpbmQgdGhlIHRhZy4KKyAqCisgKiBmb3IgY3Njb3BlLCByZXR1cm5zIFRSVUUgaWYgd2UganVtcGVkIHRvIHRhZyBvciBhYm9ydGVkLCBGQUxTRSBvdGhlcndpc2UKKyAqLworICAgIGludAorZG9fdGFnKHRhZywgdHlwZSwgY291bnQsIGZvcmNlaXQsIHZlcmJvc2UpCisgICAgY2hhcl91CSp0YWc7CQkvKiB0YWcgKHBhdHRlcm4pIHRvIGp1bXAgdG8gKi8KKyAgICBpbnQJCXR5cGU7CisgICAgaW50CQljb3VudDsKKyAgICBpbnQJCWZvcmNlaXQ7CS8qIDp0YSB3aXRoICEgKi8KKyAgICBpbnQJCXZlcmJvc2U7CS8qIHByaW50ICJ0YWcgbm90IGZvdW5kIiBtZXNzYWdlICovCit7CisgICAgdGFnZ3lfVAkqdGFnc3RhY2sgPSBjdXJ3aW4tPndfdGFnc3RhY2s7CisgICAgaW50CQl0YWdzdGFja2lkeCA9IGN1cndpbi0+d190YWdzdGFja2lkeDsKKyAgICBpbnQJCXRhZ3N0YWNrbGVuID0gY3Vyd2luLT53X3RhZ3N0YWNrbGVuOworICAgIGludAkJY3VyX21hdGNoID0gMDsKKyAgICBpbnQJCWN1cl9mbnVtID0gY3VyYnVmLT5iX2ZudW07CisgICAgaW50CQlvbGR0YWdzdGFja2lkeCA9IHRhZ3N0YWNraWR4OworICAgIGludAkJcHJldnRhZ3N0YWNraWR4ID0gdGFnc3RhY2tpZHg7CisgICAgaW50CQlwcmV2X251bV9tYXRjaGVzOworICAgIGludAkJbmV3X3RhZyA9IEZBTFNFOworICAgIGludAkJb3RoZXJfbmFtZTsKKyAgICBpbnQJCWksIGosIGs7CisgICAgaW50CQlpZHg7CisgICAgaW50CQlpYzsKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpuYW1lOworICAgIGludAkJbm9fcmVnZXhwID0gRkFMU0U7CisgICAgaW50CQllcnJvcl9jdXJfbWF0Y2ggPSAwOworICAgIGNoYXJfdQkqY29tbWFuZF9lbmQ7CisgICAgaW50CQlzYXZlX3BvcyA9IEZBTFNFOworICAgIGZtYXJrX1QJc2F2ZWRfZm1hcms7CisgICAgaW50CQl0YWdsZW47CisjaWZkZWYgRkVBVF9DU0NPUEUKKyAgICBpbnQJCWp1bXBlZF90b190YWcgPSBGQUxTRTsKKyNlbmRpZgorICAgIHRhZ3B0cnNfVAl0YWdwLCB0YWdwMjsKKyAgICBpbnQJCW5ld19udW1fbWF0Y2hlczsKKyAgICBjaGFyX3UJKipuZXdfbWF0Y2hlczsKKyAgICBpbnQJCWF0dHI7CisgICAgaW50CQl1c2VfdGFnc3RhY2s7CisgICAgaW50CQlza2lwX21zZyA9IEZBTFNFOworICAgIGNoYXJfdQkqYnVmX2ZmbmFtZSA9IGN1cmJ1Zi0+Yl9mZm5hbWU7CSAgICAvKiBuYW1lIHRvIHVzZSBmb3IKKwkJCQkJCSAgICAgICBwcmlvcml0eSBjb21wdXRhdGlvbiAqLworCisgICAgLyogcmVtZW1iZXIgdGhlIG1hdGNoZXMgZm9yIHRoZSBsYXN0IHVzZWQgdGFnICovCisgICAgc3RhdGljIGludAkJbnVtX21hdGNoZXMgPSAwOworICAgIHN0YXRpYyBpbnQJCW1heF9udW1fbWF0Y2hlcyA9IDA7ICAvKiBsaW1pdCB1c2VkIGZvciBtYXRjaCBzZWFyY2ggKi8KKyAgICBzdGF0aWMgY2hhcl91CSoqbWF0Y2hlcyA9IE5VTEw7CisgICAgc3RhdGljIGludAkJZmxhZ3M7CisKKyAgICBpZiAodHlwZSA9PSBEVF9IRUxQKQorICAgIHsKKwl0eXBlID0gRFRfVEFHOworCW5vX3JlZ2V4cCA9IFRSVUU7CisgICAgfQorCisgICAgcHJldl9udW1fbWF0Y2hlcyA9IG51bV9tYXRjaGVzOworICAgIGZyZWVfc3RyaW5nX29wdGlvbihub2ZpbGVfZm5hbWUpOworICAgIG5vZmlsZV9mbmFtZSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIERvbid0IGFkZCBhIHRhZyB0byB0aGUgdGFnc3RhY2sgaWYgJ3RhZ3N0YWNrJyBoYXMgYmVlbiByZXNldC4KKyAgICAgKi8KKyAgICBpZiAoKCFwX3Rnc3QgJiYgKnRhZyAhPSBOVUwpKQorICAgIHsKKwl1c2VfdGFnc3RhY2sgPSBGQUxTRTsKKwluZXdfdGFnID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCWlmIChnX2RvX3RhZ3ByZXZpZXcpCisJICAgIHVzZV90YWdzdGFjayA9IEZBTFNFOworCWVsc2UKKyNlbmRpZgorCSAgICB1c2VfdGFnc3RhY2sgPSBUUlVFOworCisJLyogbmV3IHBhdHRlcm4sIGFkZCB0byB0aGUgdGFnIHN0YWNrICovCisJaWYgKCp0YWcgJiYgKHR5cGUgPT0gRFRfVEFHIHx8IHR5cGUgPT0gRFRfU0VMRUNUIHx8IHR5cGUgPT0gRFRfSlVNUAorI2lmZGVmIEZFQVRfQ1NDT1BFCisJCSAgICB8fCB0eXBlID09IERUX0NTQ09QRQorI2VuZGlmCisJCSAgICApKQorCXsKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCSAgICBpZiAoZ19kb190YWdwcmV2aWV3KQorCSAgICB7CisJCWlmIChwdGFnX2VudHJ5LnRhZ25hbWUgIT0gTlVMTAorCQkJJiYgU1RSQ01QKHB0YWdfZW50cnkudGFnbmFtZSwgdGFnKSA9PSAwKQorCQl7CisJCSAgICAvKiBKdW1waW5nIHRvIHNhbWUgdGFnOiBrZWVwIHRoZSBjdXJyZW50IG1hdGNoLCBzbyB0aGF0CisJCSAgICAgKiB0aGUgQ3Vyc29ySG9sZCBhdXRvY29tbWFuZCBleGFtcGxlIHdvcmtzLiAqLworCQkgICAgY3VyX21hdGNoID0gcHRhZ19lbnRyeS5jdXJfbWF0Y2g7CisJCSAgICBjdXJfZm51bSA9IHB0YWdfZW50cnkuY3VyX2ZudW07CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICB2aW1fZnJlZShwdGFnX2VudHJ5LnRhZ25hbWUpOworCQkgICAgaWYgKChwdGFnX2VudHJ5LnRhZ25hbWUgPSB2aW1fc3Ryc2F2ZSh0YWcpKSA9PSBOVUxMKQorCQkJZ290byBlbmRfZG9fdGFnOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJLyoKKwkJICogSWYgdGhlIGxhc3QgdXNlZCBlbnRyeSBpcyBub3QgYXQgdGhlIHRvcCwgZGVsZXRlIGFsbCB0YWcKKwkJICogc3RhY2sgZW50cmllcyBhYm92ZSBpdC4KKwkJICovCisJCXdoaWxlICh0YWdzdGFja2lkeCA8IHRhZ3N0YWNrbGVuKQorCQkgICAgdmltX2ZyZWUodGFnc3RhY2tbLS10YWdzdGFja2xlbl0udGFnbmFtZSk7CisKKwkJLyogaWYgdGhlIHRhZ3N0YWNrIGlzIGZ1bGw6IHJlbW92ZSBvbGRlc3QgZW50cnkgKi8KKwkJaWYgKCsrdGFnc3RhY2tsZW4gPiBUQUdTVEFDS1NJWkUpCisJCXsKKwkJICAgIHRhZ3N0YWNrbGVuID0gVEFHU1RBQ0tTSVpFOworCQkgICAgdmltX2ZyZWUodGFnc3RhY2tbMF0udGFnbmFtZSk7CisJCSAgICBmb3IgKGkgPSAxOyBpIDwgdGFnc3RhY2tsZW47ICsraSkKKwkJCXRhZ3N0YWNrW2kgLSAxXSA9IHRhZ3N0YWNrW2ldOworCQkgICAgLS10YWdzdGFja2lkeDsKKwkJfQorCisJCS8qCisJCSAqIHB1dCB0aGUgdGFnIG5hbWUgaW4gdGhlIHRhZyBzdGFjaworCQkgKi8KKwkJaWYgKCh0YWdzdGFja1t0YWdzdGFja2lkeF0udGFnbmFtZSA9IHZpbV9zdHJzYXZlKHRhZykpID09IE5VTEwpCisJCXsKKwkJICAgIGN1cndpbi0+d190YWdzdGFja2xlbiA9IHRhZ3N0YWNrbGVuIC0gMTsKKwkJICAgIGdvdG8gZW5kX2RvX3RhZzsKKwkJfQorCQljdXJ3aW4tPndfdGFnc3RhY2tsZW4gPSB0YWdzdGFja2xlbjsKKworCQlzYXZlX3BvcyA9IFRSVUU7CS8qIHNhdmUgdGhlIGN1cnNvciBwb3NpdGlvbiBiZWxvdyAqLworCSAgICB9CisKKwkgICAgbmV3X3RhZyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJICAgIGlmICgKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCQkgICAgZ19kb190YWdwcmV2aWV3ID8gcHRhZ19lbnRyeS50YWduYW1lID09IE5VTEwgOgorI2VuZGlmCisJCSAgICB0YWdzdGFja2xlbiA9PSAwKQorCSAgICB7CisJCS8qIGVtcHR5IHN0YWNrICovCisJCUVNU0coXyhlX3RhZ3N0YWNrKSk7CisJCWdvdG8gZW5kX2RvX3RhZzsKKwkgICAgfQorCisJICAgIGlmICh0eXBlID09IERUX1BPUCkJCS8qIGdvIHRvIG9sZGVyIHBvc2l0aW9uICovCisJICAgIHsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJaW50CW9sZF9LZXlUeXBlZCA9IEtleVR5cGVkOworI2VuZGlmCisJCWlmICgodGFnc3RhY2tpZHggLT0gY291bnQpIDwgMCkKKwkJeworCQkgICAgRU1TRyhfKGJvdHRvbW1zZykpOworCQkgICAgaWYgKHRhZ3N0YWNraWR4ICsgY291bnQgPT0gMCkKKwkJICAgIHsKKwkJCS8qIFdlIGRpZCBbbnVtXV5UIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgKi8KKwkJCXRhZ3N0YWNraWR4ID0gMDsKKwkJCWdvdG8gZW5kX2RvX3RhZzsKKwkJICAgIH0KKwkJICAgIC8qIFdlIHdlcmVuJ3QgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssIHNvIGp1bXAgYWxsIHRoZQorCQkgICAgICogd2F5IHRvIHRoZSBib3R0b20gbm93LgorCQkgICAgICovCisJCSAgICB0YWdzdGFja2lkeCA9IDA7CisJCX0KKwkJZWxzZSBpZiAodGFnc3RhY2tpZHggPj0gdGFnc3RhY2tsZW4pICAgIC8qIGNvdW50ID09IDA/ICovCisJCXsKKwkJICAgIEVNU0coXyh0b3Btc2cpKTsKKwkJICAgIGdvdG8gZW5kX2RvX3RhZzsKKwkJfQorCisJCS8qIE1ha2UgYSBjb3B5IG9mIHRoZSBmbWFyaywgYXV0b2NvbW1hbmRzIG1heSBpbnZhbGlkYXRlIHRoZQorCQkgKiB0YWdzdGFjayBiZWZvcmUgaXQncyB1c2VkLiAqLworCQlzYXZlZF9mbWFyayA9IHRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5mbWFyazsKKwkJaWYgKHNhdmVkX2ZtYXJrLmZudW0gIT0gY3VyYnVmLT5iX2ZudW0pCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBKdW1wIHRvIG90aGVyIGZpbGUuIElmIHRoaXMgZmFpbHMgKGUuZy4gYmVjYXVzZSB0aGUKKwkJICAgICAqIGZpbGUgd2FzIGNoYW5nZWQpIGtlZXAgb3JpZ2luYWwgcG9zaXRpb24gaW4gdGFnIHN0YWNrLgorCQkgICAgICovCisJCSAgICBpZiAoYnVmbGlzdF9nZXRmaWxlKHNhdmVkX2ZtYXJrLmZudW0sIHNhdmVkX2ZtYXJrLm1hcmsubG51bSwKKwkJCQkJICAgICAgIEdFVEZfU0VUTUFSSywgZm9yY2VpdCkgPT0gRkFJTCkKKwkJICAgIHsKKwkJCXRhZ3N0YWNraWR4ID0gb2xkdGFnc3RhY2tpZHg7ICAvKiBiYWNrIHRvIG9sZCBwb3NuICovCisJCQlnb3RvIGVuZF9kb190YWc7CisJCSAgICB9CisJCSAgICAvKiBBbiBCdWZSZWFkUG9zdCBhdXRvY29tbWFuZCBtYXkganVtcCB0byB0aGUgJyIgbWFyaywgYnV0CisJCSAgICAgKiB3ZSBkb24ndCB3aGF0IHRoYXQgaGVyZS4gKi8KKwkJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IHNhdmVkX2ZtYXJrLm1hcmsubG51bTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHNldHBjbWFyaygpOworCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gc2F2ZWRfZm1hcmsubWFyay5sbnVtOworCQl9CisJCWN1cndpbi0+d19jdXJzb3IuY29sID0gc2F2ZWRfZm1hcmsubWFyay5jb2w7CisJCWN1cndpbi0+d19zZXRfY3Vyc3dhbnQgPSBUUlVFOworCQljaGVja19jdXJzb3IoKTsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkJaWYgKChmZG9fZmxhZ3MgJiBGRE9fVEFHKSAmJiBvbGRfS2V5VHlwZWQpCisJCSAgICBmb2xkT3BlbkN1cnNvcigpOworI2VuZGlmCisKKwkJLyogcmVtb3ZlIHRoZSBvbGQgbGlzdCBvZiBtYXRjaGVzICovCisJCUZyZWVXaWxkKG51bV9tYXRjaGVzLCBtYXRjaGVzKTsKKyNpZmRlZiBGRUFUX0NTQ09QRQorCQljc19mcmVlX3RhZ3MoKTsKKyNlbmRpZgorCQludW1fbWF0Y2hlcyA9IDA7CisJCWdvdG8gZW5kX2RvX3RhZzsKKwkgICAgfQorCisJICAgIGlmICh0eXBlID09IERUX1RBRykKKwkgICAgeworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCWlmIChnX2RvX3RhZ3ByZXZpZXcpCisJCXsKKwkJICAgIGN1cl9tYXRjaCA9IHB0YWdfZW50cnkuY3VyX21hdGNoOworCQkgICAgY3VyX2ZudW0gPSBwdGFnX2VudHJ5LmN1cl9mbnVtOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCSAgICAvKiAiOnRhZyIgKG5vIGFyZ3VtZW50KTogZ28gdG8gbmV3ZXIgcGF0dGVybiAqLworCQkgICAgc2F2ZV9wb3MgPSBUUlVFOwkvKiBzYXZlIHRoZSBjdXJzb3IgcG9zaXRpb24gYmVsb3cgKi8KKwkJICAgIGlmICgodGFnc3RhY2tpZHggKz0gY291bnQgLSAxKSA+PSB0YWdzdGFja2xlbikKKwkJICAgIHsKKwkJCS8qCisJCQkgKiBCZXlvbmQgdGhlIGxhc3Qgb25lLCBqdXN0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBhbmQKKwkJCSAqIGdvIHRvIHRoZSBsYXN0IG9uZS4gIERvbid0IHN0b3JlIHRoZSBjdXJzb3IKKwkJCSAqIHBvc3RpdGlvbi4KKwkJCSAqLworCQkJdGFnc3RhY2tpZHggPSB0YWdzdGFja2xlbiAtIDE7CisJCQlFTVNHKF8odG9wbXNnKSk7CisJCQlzYXZlX3BvcyA9IEZBTFNFOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAodGFnc3RhY2tpZHggPCAwKQkvKiBtdXN0IGhhdmUgYmVlbiBjb3VudCA9PSAwICovCisJCSAgICB7CisJCQlFTVNHKF8oYm90dG9tbXNnKSk7CisJCQl0YWdzdGFja2lkeCA9IDA7CisJCQlnb3RvIGVuZF9kb190YWc7CisJCSAgICB9CisJCSAgICBjdXJfbWF0Y2ggPSB0YWdzdGFja1t0YWdzdGFja2lkeF0uY3VyX21hdGNoOworCQkgICAgY3VyX2ZudW0gPSB0YWdzdGFja1t0YWdzdGFja2lkeF0uY3VyX2ZudW07CisJCX0KKwkJbmV3X3RhZyA9IFRSVUU7CisJICAgIH0KKwkgICAgZWxzZQkJCQkvKiBnbyB0byBvdGhlciBtYXRjaGluZyB0YWcgKi8KKwkgICAgeworCQkvKiBTYXZlIGluZGV4IGZvciB3aGVuIHNlbGVjdGlvbiBpcyBjYW5jZWxsZWQuICovCisJCXByZXZ0YWdzdGFja2lkeCA9IHRhZ3N0YWNraWR4OworCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKwkJaWYgKGdfZG9fdGFncHJldmlldykKKwkJeworCQkgICAgY3VyX21hdGNoID0gcHRhZ19lbnRyeS5jdXJfbWF0Y2g7CisJCSAgICBjdXJfZm51bSA9IHB0YWdfZW50cnkuY3VyX2ZudW07CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgIGlmICgtLXRhZ3N0YWNraWR4IDwgMCkKKwkJCXRhZ3N0YWNraWR4ID0gMDsKKwkJICAgIGN1cl9tYXRjaCA9IHRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5jdXJfbWF0Y2g7CisJCSAgICBjdXJfZm51bSA9IHRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5jdXJfZm51bTsKKwkJfQorCQlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJICAgIGNhc2UgRFRfRklSU1Q6IGN1cl9tYXRjaCA9IGNvdW50IC0gMTsgYnJlYWs7CisJCSAgICBjYXNlIERUX1NFTEVDVDoKKwkJICAgIGNhc2UgRFRfSlVNUDoKKyNpZmRlZiBGRUFUX0NTQ09QRQorCQkgICAgY2FzZSBEVF9DU0NPUEU6CisjZW5kaWYKKwkJICAgIGNhc2UgRFRfTEFTVDogIGN1cl9tYXRjaCA9IE1BWENPTCAtIDE7IGJyZWFrOworCQkgICAgY2FzZSBEVF9ORVhUOiAgY3VyX21hdGNoICs9IGNvdW50OyBicmVhazsKKwkJICAgIGNhc2UgRFRfUFJFVjogIGN1cl9tYXRjaCAtPSBjb3VudDsgYnJlYWs7CisJCX0KKwkJaWYgKGN1cl9tYXRjaCA+PSBNQVhDT0wpCisJCSAgICBjdXJfbWF0Y2ggPSBNQVhDT0wgLSAxOworCQllbHNlIGlmIChjdXJfbWF0Y2ggPCAwKQorCQl7CisJCSAgICBFTVNHKF8oIkU0MjU6IENhbm5vdCBnbyBiZWZvcmUgZmlyc3QgbWF0Y2hpbmcgdGFnIikpOworCQkgICAgc2tpcF9tc2cgPSBUUlVFOworCQkgICAgY3VyX21hdGNoID0gMDsKKwkJICAgIGN1cl9mbnVtID0gY3VyYnVmLT5iX2ZudW07CisJCX0KKwkgICAgfQorCX0KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJaWYgKGdfZG9fdGFncHJldmlldykKKwl7CisJICAgIGlmICh0eXBlICE9IERUX1NFTEVDVCAmJiB0eXBlICE9IERUX0pVTVApCisJICAgIHsKKwkJcHRhZ19lbnRyeS5jdXJfbWF0Y2ggPSBjdXJfbWF0Y2g7CisJCXB0YWdfZW50cnkuY3VyX2ZudW0gPSBjdXJfZm51bTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIEZvciAiOnRhZyBbYXJnXSIgb3IgIjp0c2VsZWN0IiByZW1lbWJlciBwb3NpdGlvbiBiZWZvcmUgdGhlIGp1bXAuCisJICAgICAqLworCSAgICBzYXZlZF9mbWFyayA9IHRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5mbWFyazsKKwkgICAgaWYgKHNhdmVfcG9zKQorCSAgICB7CisJCXRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5mbWFyay5tYXJrID0gY3Vyd2luLT53X2N1cnNvcjsKKwkJdGFnc3RhY2tbdGFnc3RhY2tpZHhdLmZtYXJrLmZudW0gPSBjdXJidWYtPmJfZm51bTsKKwkgICAgfQorCisJICAgIC8qIEN1cndpbiB3aWxsIGNoYW5nZSBpbiB0aGUgY2FsbCB0byBqdW1wdG9fdGFnKCkgaWYgIjpzdGFnIiB3YXMKKwkgICAgICogdXNlZCBvciBhbiBhdXRvY29tbWFuZCBqdW1wcyB0byBhbm90aGVyIHdpbmRvdzsgc3RvcmUgdmFsdWUgb2YKKwkgICAgICogdGFnc3RhY2tpZHggbm93LiAqLworCSAgICBjdXJ3aW4tPndfdGFnc3RhY2tpZHggPSB0YWdzdGFja2lkeDsKKwkgICAgaWYgKHR5cGUgIT0gRFRfU0VMRUNUICYmIHR5cGUgIT0gRFRfSlVNUCkKKwkgICAgeworCQljdXJ3aW4tPndfdGFnc3RhY2tbdGFnc3RhY2tpZHhdLmN1cl9tYXRjaCA9IGN1cl9tYXRjaDsKKwkJY3Vyd2luLT53X3RhZ3N0YWNrW3RhZ3N0YWNraWR4XS5jdXJfZm51bSA9IGN1cl9mbnVtOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIFdoZW4gbm90IHVzaW5nIHRoZSBjdXJyZW50IGJ1ZmZlciBnZXQgdGhlIG5hbWUgb2YgYnVmZmVyICJjdXJfZm51bSIuCisgICAgICogTWFrZXMgc3VyZSB0aGF0IHRoZSB0YWcgb3JkZXIgZG9lc24ndCBjaGFuZ2Ugd2hlbiB1c2luZyBhIHJlbWVtYmVyZWQKKyAgICAgKiBwb3NpdGlvbiBmb3IgImN1cl9tYXRjaCIuICovCisgICAgaWYgKGN1cl9mbnVtICE9IGN1cmJ1Zi0+Yl9mbnVtKQorICAgIHsKKwlidWZfVCAqYnVmID0gYnVmbGlzdF9maW5kbnIoY3VyX2ZudW0pOworCisJaWYgKGJ1ZiAhPSBOVUxMKQorCSAgICBidWZfZmZuYW1lID0gYnVmLT5iX2ZmbmFtZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcGVhdCBzZWFyY2hpbmcgZm9yIHRhZ3MsIHdoZW4gYSBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZC4KKyAgICAgKi8KKyAgICBmb3IgKDs7KQorICAgIHsKKwkvKgorCSAqIFdoZW4gZGVzaXJlZCBtYXRjaCBub3QgZm91bmQgeWV0LCB0cnkgdG8gZmluZCBpdCAoYW5kIG90aGVycykuCisJICovCisJaWYgKHVzZV90YWdzdGFjaykKKwkgICAgbmFtZSA9IHRhZ3N0YWNrW3RhZ3N0YWNraWR4XS50YWduYW1lOworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJZWxzZSBpZiAoZ19kb190YWdwcmV2aWV3KQorCSAgICBuYW1lID0gcHRhZ19lbnRyeS50YWduYW1lOworI2VuZGlmCisJZWxzZQorCSAgICBuYW1lID0gdGFnOworCW90aGVyX25hbWUgPSAodGFnbWF0Y2huYW1lID09IE5VTEwgfHwgU1RSQ01QKHRhZ21hdGNobmFtZSwgbmFtZSkgIT0gMCk7CisJaWYgKG5ld190YWcKKwkJfHwgKGN1cl9tYXRjaCA+PSBudW1fbWF0Y2hlcyAmJiBtYXhfbnVtX21hdGNoZXMgIT0gTUFYQ09MKQorCQl8fCBvdGhlcl9uYW1lKQorCXsKKwkgICAgaWYgKG90aGVyX25hbWUpCisJICAgIHsKKwkJdmltX2ZyZWUodGFnbWF0Y2huYW1lKTsKKwkJdGFnbWF0Y2huYW1lID0gdmltX3N0cnNhdmUobmFtZSk7CisJICAgIH0KKworCSAgICBpZiAodHlwZSA9PSBEVF9TRUxFQ1QgfHwgdHlwZSA9PSBEVF9KVU1QKQorCQljdXJfbWF0Y2ggPSBNQVhDT0wgLSAxOworCSAgICBtYXhfbnVtX21hdGNoZXMgPSBjdXJfbWF0Y2ggKyAxOworCisJICAgIC8qIHdoZW4gdGhlIGFyZ3VtZW50IHN0YXJ0cyB3aXRoICcvJywgdXNlIGl0IGFzIGEgcmVnZXhwICovCisJICAgIGlmICghbm9fcmVnZXhwICYmICpuYW1lID09ICcvJykKKwkgICAgeworCQlmbGFncyA9IFRBR19SRUdFWFA7CisJCSsrbmFtZTsKKwkgICAgfQorCSAgICBlbHNlCisJCWZsYWdzID0gVEFHX05PSUM7CisKKyNpZmRlZiBGRUFUX0NTQ09QRQorCSAgICBpZiAodHlwZSA9PSBEVF9DU0NPUEUpCisJCWZsYWdzID0gVEFHX0NTQ09QRTsKKyNlbmRpZgorCSAgICBpZiAodmVyYm9zZSkKKwkJZmxhZ3MgfD0gVEFHX1ZFUkJPU0U7CisJICAgIGlmIChmaW5kX3RhZ3MobmFtZSwgJm5ld19udW1fbWF0Y2hlcywgJm5ld19tYXRjaGVzLCBmbGFncywKKwkJCQkJICAgIG1heF9udW1fbWF0Y2hlcywgYnVmX2ZmbmFtZSkgPT0gT0sKKwkJICAgICYmIG5ld19udW1fbWF0Y2hlcyA8IG1heF9udW1fbWF0Y2hlcykKKwkJbWF4X251bV9tYXRjaGVzID0gTUFYQ09MOyAvKiBJZiBsZXNzIHRoYW4gbWF4X251bV9tYXRjaGVzCisJCQkJCSAgICAgZm91bmQ6IGFsbCBtYXRjaGVzIGZvdW5kLiAqLworCisJICAgIC8qIElmIHRoZXJlIGFscmVhZHkgd2VyZSBzb21lIG1hdGNoZXMgZm9yIHRoZSBzYW1lIG5hbWUsIG1vdmUgdGhlbQorCSAgICAgKiB0byB0aGUgc3RhcnQuICBBdm9pZHMgdGhhdCB0aGUgb3JkZXIgY2hhbmdlcyB3aGVuIHVzaW5nCisJICAgICAqICI6dG5leHQiIGFuZCBqdW1waW5nIHRvIGFub3RoZXIgZmlsZS4gKi8KKwkgICAgaWYgKCFuZXdfdGFnICYmICFvdGhlcl9uYW1lKQorCSAgICB7CisJCS8qIEZpbmQgdGhlIHBvc2l0aW9uIG9mIGVhY2ggb2xkIG1hdGNoIGluIHRoZSBuZXcgbGlzdC4gIE5lZWQKKwkJICogdG8gdXNlIHBhcnNlX21hdGNoKCkgdG8gZmluZCB0aGUgdGFnIGxpbmUuICovCisJCWlkeCA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBudW1fbWF0Y2hlczsgKytqKQorCQl7CisJCSAgICBwYXJzZV9tYXRjaChtYXRjaGVzW2pdLCAmdGFncCk7CisJCSAgICBmb3IgKGkgPSBpZHg7IGkgPCBuZXdfbnVtX21hdGNoZXM7ICsraSkKKwkJICAgIHsKKwkJCXBhcnNlX21hdGNoKG5ld19tYXRjaGVzW2ldLCAmdGFncDIpOworCQkJaWYgKFNUUkNNUCh0YWdwLnRhZ25hbWUsIHRhZ3AyLnRhZ25hbWUpID09IDApCisJCQl7CisJCQkgICAgcCA9IG5ld19tYXRjaGVzW2ldOworCQkJICAgIGZvciAoayA9IGk7IGsgPiBpZHg7IC0taykKKwkJCQluZXdfbWF0Y2hlc1trXSA9IG5ld19tYXRjaGVzW2sgLSAxXTsKKwkJCSAgICBuZXdfbWF0Y2hlc1tpZHgrK10gPSBwOworCQkJICAgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgRnJlZVdpbGQobnVtX21hdGNoZXMsIG1hdGNoZXMpOworCSAgICBudW1fbWF0Y2hlcyA9IG5ld19udW1fbWF0Y2hlczsKKwkgICAgbWF0Y2hlcyA9IG5ld19tYXRjaGVzOworCX0KKworCWlmIChudW1fbWF0Y2hlcyA8PSAwKQorCXsKKwkgICAgaWYgKHZlcmJvc2UpCisJCUVNU0cyKF8oIkU0MjY6IHRhZyBub3QgZm91bmQ6ICVzIiksIG5hbWUpOworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJICAgIGdfZG9fdGFncHJldmlldyA9IDA7CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKwkgICAgaW50IGFza19mb3Jfc2VsZWN0aW9uID0gRkFMU0U7CisKKyNpZmRlZiBGRUFUX0NTQ09QRQorCSAgICBpZiAodHlwZSA9PSBEVF9DU0NPUEUgJiYgbnVtX21hdGNoZXMgPiAxKQorCSAgICB7CisJCWNzX3ByaW50X3RhZ3MoKTsKKwkJYXNrX2Zvcl9zZWxlY3Rpb24gPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICBpZiAodHlwZSA9PSBEVF9TRUxFQ1QgfHwgKHR5cGUgPT0gRFRfSlVNUCAmJiBudW1fbWF0Y2hlcyA+IDEpKQorCSAgICB7CisJCS8qCisJCSAqIExpc3QgYWxsIHRoZSBtYXRjaGluZyB0YWdzLgorCQkgKiBBc3N1bWUgdGhhdCB0aGUgZmlyc3QgbWF0Y2ggaW5kaWNhdGVzIGhvdyBsb25nIHRoZSB0YWdzIGNhbgorCQkgKiBiZSwgYW5kIGFsaWduIHRoZSBmaWxlIG5hbWVzIHRvIHRoYXQuCisJCSAqLworCQlwYXJzZV9tYXRjaChtYXRjaGVzWzBdLCAmdGFncCk7CisJCXRhZ2xlbiA9IChpbnQpKHRhZ3AudGFnbmFtZV9lbmQgLSB0YWdwLnRhZ25hbWUgKyAyKTsKKwkJaWYgKHRhZ2xlbiA8IDE4KQorCQkgICAgdGFnbGVuID0gMTg7CisJCWlmICh0YWdsZW4gPiBDb2x1bW5zIC0gMjUpCisJCSAgICB0YWdsZW4gPSBNQVhDT0w7CisJCWlmIChtc2dfY29sID09IDApCisJCSAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CS8qIG92ZXJ3cml0ZSBwcmV2aW91cyBtZXNzYWdlICovCisJCW1zZ19zdGFydCgpOworCQlNU0dfUFVUU19BVFRSKF8oIiAgIyBwcmkga2luZCB0YWciKSwgaGxfYXR0cihITEZfVCkpOworCQltc2dfY2xyX2VvcygpOworCQl0YWdsZW5fYWR2YW5jZSh0YWdsZW4pOworCQlNU0dfUFVUU19BVFRSKF8oImZpbGVcbiIpLCBobF9hdHRyKEhMRl9UKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9tYXRjaGVzOyArK2kpCisJCXsKKwkJICAgIHBhcnNlX21hdGNoKG1hdGNoZXNbaV0sICZ0YWdwKTsKKwkJICAgIGlmICghbmV3X3RhZyAmJiAoCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKwkJCQkoZ19kb190YWdwcmV2aWV3CisJCQkJICYmIGkgPT0gcHRhZ19lbnRyeS5jdXJfbWF0Y2gpIHx8CisjZW5kaWYKKwkJCQkodXNlX3RhZ3N0YWNrCisJCQkJICYmIGkgPT0gdGFnc3RhY2tbdGFnc3RhY2tpZHhdLmN1cl9tYXRjaCkpKQorCQkJKklPYnVmZiA9ICc+JzsKKwkJICAgIGVsc2UKKwkJCSpJT2J1ZmYgPSAnICc7CisJCSAgICBzcHJpbnRmKChjaGFyICopSU9idWZmICsgMSwgIiUyZCAlcyAiLCBpICsgMSwKKwkJCQkJICAgbXRfbmFtZXNbbWF0Y2hlc1tpXVswXSAmIE1UX01BU0tdKTsKKwkJICAgIG1zZ19wdXRzKElPYnVmZik7CisJCSAgICBpZiAodGFncC50YWdraW5kICE9IE5VTEwpCisJCQltc2dfb3V0dHJhbnNfbGVuKHRhZ3AudGFna2luZCwKKwkJCQkgICAgICAoaW50KSh0YWdwLnRhZ2tpbmRfZW5kIC0gdGFncC50YWdraW5kKSk7CisJCSAgICBtc2dfYWR2YW5jZSgxMyk7CisJCSAgICBtc2dfb3V0dHJhbnNfbGVuX2F0dHIodGFncC50YWduYW1lLAorCQkJCSAgICAgICAoaW50KSh0YWdwLnRhZ25hbWVfZW5kIC0gdGFncC50YWduYW1lKSwKKwkJCQkJCQkgICAgICBobF9hdHRyKEhMRl9UKSk7CisJCSAgICBtc2dfcHV0Y2hhcignICcpOworCQkgICAgdGFnbGVuX2FkdmFuY2UodGFnbGVuKTsKKworCQkgICAgLyogRmluZCBvdXQgdGhlIGFjdHVhbCBmaWxlIG5hbWUuIElmIGl0IGlzIGxvbmcsIHRydW5jYXRlCisJCSAgICAgKiBpdCBhbmQgcHV0ICIuLi4iIGluIHRoZSBtaWRkbGUgKi8KKwkJICAgIHAgPSB0YWdfZnVsbF9mbmFtZSgmdGFncCk7CisJCSAgICBpZiAocCAhPSBOVUxMKQorCQkgICAgeworCQkJbXNnX3B1dHNfbG9uZ19hdHRyKHAsIGhsX2F0dHIoSExGX0QpKTsKKwkJCXZpbV9mcmVlKHApOworCQkgICAgfQorCQkgICAgaWYgKG1zZ19jb2wgPiAwKQorCQkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJCSAgICBtc2dfYWR2YW5jZSgxNSk7CisKKwkJICAgIC8qIHByaW50IGFueSBleHRyYSBmaWVsZHMgKi8KKwkJICAgIGNvbW1hbmRfZW5kID0gdGFncC5jb21tYW5kX2VuZDsKKwkJICAgIGlmIChjb21tYW5kX2VuZCAhPSBOVUxMKQorCQkgICAgeworCQkJcCA9IGNvbW1hbmRfZW5kICsgMzsKKwkJCXdoaWxlICgqcCAmJiAqcCAhPSAnXHInICYmICpwICE9ICdcbicpCisJCQl7CisJCQkgICAgd2hpbGUgKCpwID09IFRBQikKKwkJCQkrK3A7CisKKwkJCSAgICAvKiBza2lwICJmaWxlOiIgd2l0aG91dCBhIHZhbHVlIChzdGF0aWMgdGFnKSAqLworCQkJICAgIGlmIChTVFJOQ01QKHAsICJmaWxlOiIsIDUpID09IDAKKwkJCQkJCQkgJiYgdmltX2lzc3BhY2UocFs1XSkpCisJCQkgICAgeworCQkJCXAgKz0gNTsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQkgICAgLyogc2tpcCAia2luZDo8a2luZD4iIGFuZCAiPGtpbmQ+IiAqLworCQkJICAgIGlmIChwID09IHRhZ3AudGFna2luZAorCQkJCSAgICB8fCAocCArIDUgPT0gdGFncC50YWdraW5kCisJCQkJCSAgICAmJiBTVFJOQ01QKHAsICJraW5kOiIsIDUpID09IDApKQorCQkJICAgIHsKKwkJCQlwID0gdGFncC50YWdraW5kX2VuZDsKKwkJCQljb250aW51ZTsKKwkJCSAgICB9CisJCQkgICAgLyogcHJpbnQgYWxsIG90aGVyIGV4dHJhIGZpZWxkcyAqLworCQkJICAgIGF0dHIgPSBobF9hdHRyKEhMRl9DTSk7CisJCQkgICAgd2hpbGUgKCpwICYmICpwICE9ICdccicgJiYgKnAgIT0gJ1xuJykKKwkJCSAgICB7CisJCQkJaWYgKG1zZ19jb2wgKyBwdHIyY2VsbHMocCkgPj0gQ29sdW1ucykKKwkJCQl7CisJCQkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCQkJCSAgICBtc2dfYWR2YW5jZSgxNSk7CisJCQkJfQorCQkJCXAgPSBtc2dfb3V0dHJhbnNfb25lKHAsIGF0dHIpOworCQkJCWlmICgqcCA9PSBUQUIpCisJCQkJeworCQkJCSAgICBtc2dfcHV0c19hdHRyKChjaGFyX3UgKikiICIsIGF0dHIpOworCQkJCSAgICBicmVhazsKKwkJCQl9CisJCQkJaWYgKCpwID09ICc6JykKKwkJCQkgICAgYXR0ciA9IDA7CisJCQkgICAgfQorCQkJfQorCQkJaWYgKG1zZ19jb2wgPiAxNSkKKwkJCXsKKwkJCSAgICBtc2dfcHV0Y2hhcignXG4nKTsKKwkJCSAgICBtc2dfYWR2YW5jZSgxNSk7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlmb3IgKHAgPSB0YWdwLmNvbW1hbmQ7CisJCQkJCSAgKnAgJiYgKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nOyArK3ApCisJCQkgICAgOworCQkJY29tbWFuZF9lbmQgPSBwOworCQkgICAgfQorCisJCSAgICAvKgorCQkgICAgICogUHV0IHRoZSBpbmZvIChpbiBzZXZlcmFsIGxpbmVzKSBhdCBjb2x1bW4gMTUuCisJCSAgICAgKiBEb24ndCBkaXNwbGF5ICIvXiIgYW5kICI/XiIuCisJCSAgICAgKi8KKwkJICAgIHAgPSB0YWdwLmNvbW1hbmQ7CisJCSAgICBpZiAoKnAgPT0gJy8nIHx8ICpwID09ICc/JykKKwkJICAgIHsKKwkJCSsrcDsKKwkJCWlmICgqcCA9PSAnXicpCisJCQkgICAgKytwOworCQkgICAgfQorCQkgICAgLyogUmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHBhdHRlcm4gKi8KKwkJICAgIHdoaWxlIChwICE9IGNvbW1hbmRfZW5kICYmIHZpbV9pc3NwYWNlKCpwKSkKKwkJCSsrcDsKKworCQkgICAgd2hpbGUgKHAgIT0gY29tbWFuZF9lbmQpCisJCSAgICB7CisJCQlpZiAobXNnX2NvbCArICgqcCA9PSBUQUIgPyAxIDogcHRyMmNlbGxzKHApKSA+IENvbHVtbnMpCisJCQkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJCQltc2dfYWR2YW5jZSgxNSk7CisKKwkJCS8qIHNraXAgYmFja3NsYXNoIHVzZWQgZm9yIGVzY2FwaW5nIGNvbW1hbmQgY2hhciAqLworCQkJaWYgKCpwID09ICdcXCcgJiYgKihwICsgMSkgPT0gKnRhZ3AuY29tbWFuZCkKKwkJCSAgICArK3A7CisKKwkJCWlmICgqcCA9PSBUQUIpCisJCQl7CisJCQkgICAgbXNnX3B1dGNoYXIoJyAnKTsKKwkJCSAgICArK3A7CisJCQl9CisJCQllbHNlCisJCQkgICAgcCA9IG1zZ19vdXR0cmFuc19vbmUocCwgMCk7CisKKwkJCS8qIGRvbid0IGRpc3BsYXkgdGhlICIkLztcIiIgYW5kICIkPztcIiIgKi8KKwkJCWlmIChwID09IGNvbW1hbmRfZW5kIC0gMiAmJiAqcCA9PSAnJCcKKwkJCQkJCSAmJiAqKHAgKyAxKSA9PSAqdGFncC5jb21tYW5kKQorCQkJICAgIGJyZWFrOworCQkJLyogZG9uJ3QgZGlzcGxheSBtYXRjaGluZyAnLycgb3IgJz8nICovCisJCQlpZiAocCA9PSBjb21tYW5kX2VuZCAtIDEgJiYgKnAgPT0gKnRhZ3AuY29tbWFuZAorCQkJCQkJICYmICgqcCA9PSAnLycgfHwgKnAgPT0gJz8nKSkKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJICAgIGlmIChtc2dfY29sKQorCQkJbXNnX3B1dGNoYXIoJ1xuJyk7CisJCSAgICB1aV9icmVha2NoZWNrKCk7CisJCSAgICBpZiAoZ290X2ludCkKKwkJICAgIHsKKwkJCWdvdF9pbnQgPSBGQUxTRTsJLyogb25seSBzdG9wIHRoZSBsaXN0aW5nICovCisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCQlhc2tfZm9yX3NlbGVjdGlvbiA9IFRSVUU7CisJICAgIH0KKworCSAgICBpZiAoYXNrX2Zvcl9zZWxlY3Rpb24gPT0gVFJVRSkKKwkgICAgeworCQkvKgorCQkgKiBBc2sgdG8gc2VsZWN0IGEgdGFnIGZyb20gdGhlIGxpc3QuCisJCSAqIFdoZW4gdXNpbmcgIjpzaWxlbnQiIGFzc3VtZSB0aGF0IDxDUj4gd2FzIGVudGVyZWQuCisJCSAqLworCQlNU0dfUFVUUyhfKCJFbnRlciBuciBvZiBjaG9pY2UgKDxDUj4gdG8gYWJvcnQpOiAiKSk7CisJCWkgPSBnZXRfbnVtYmVyKFRSVUUpOworCQlpZiAoS2V5VHlwZWQpCQkvKiBkb24ndCBjYWxsIHdhaXRfcmV0dXJuKCkgbm93ICovCisJCXsKKwkJICAgIG1zZ19wdXRjaGFyKCdcbicpOworCQkgICAgY21kbGluZV9yb3cgPSBtc2dfcm93IC0gMTsKKwkJICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKwkJICAgIG1zZ19kaWRhbnkgPSBGQUxTRTsKKwkJfQorCQlpZiAoaSA8PSAwIHx8IGkgPiBudW1fbWF0Y2hlcyB8fCBnb3RfaW50KQorCQl7CisJCSAgICAvKiBubyB2YWxpZCBjaG9pY2U6IGRvbid0IGNoYW5nZSBhbnl0aGluZyAqLworCQkgICAgaWYgKHVzZV90YWdzdGFjaykKKwkJICAgIHsKKwkJCXRhZ3N0YWNrW3RhZ3N0YWNraWR4XS5mbWFyayA9IHNhdmVkX2ZtYXJrOworCQkJdGFnc3RhY2tpZHggPSBwcmV2dGFnc3RhY2tpZHg7CisJCSAgICB9CisjaWZkZWYgRkVBVF9DU0NPUEUKKwkJICAgIGNzX2ZyZWVfdGFncygpOworCQkgICAganVtcGVkX3RvX3RhZyA9IFRSVUU7CisjZW5kaWYKKwkJICAgIGJyZWFrOworCQl9CisjaWYgMAorCQkvKiBhdm9pZCB0aGUgbmVlZCB0byBoaXQgPENSPiB3aGVuIGp1bXBpbmcgdG8gYW5vdGhlciBmaWxlICovCisJCW1zZ19zY3JvbGxlZCA9IDA7CisJCXJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKKyNlbmRpZgorCQljdXJfbWF0Y2ggPSBpIC0gMTsKKwkgICAgfQorCisJICAgIGlmIChjdXJfbWF0Y2ggPj0gbnVtX21hdGNoZXMpCisJICAgIHsKKwkJLyogQXZvaWQgZ2l2aW5nIHRoaXMgZXJyb3Igd2hlbiBhIGZpbGUgd2Fzbid0IGZvdW5kIGFuZCB3ZSdyZQorCQkgKiBsb29raW5nIGZvciBhIG1hdGNoIGluIGFub3RoZXIgZmlsZSwgd2hpY2ggd2Fzbid0IGZvdW5kLgorCQkgKiBUaGVyZSB3aWxsIGJlIGFuIEVNU0coImZpbGUgZG9lc24ndCBleGlzdCIpIGJlbG93IHRoZW4uICovCisJCWlmICgodHlwZSA9PSBEVF9ORVhUIHx8IHR5cGUgPT0gRFRfRklSU1QpCisJCQkJCQkgICAgICAmJiBub2ZpbGVfZm5hbWUgPT0gTlVMTCkKKwkJeworCQkgICAgaWYgKG51bV9tYXRjaGVzID09IDEpCisJCQlFTVNHKF8oIkU0Mjc6IFRoZXJlIGlzIG9ubHkgb25lIG1hdGNoaW5nIHRhZyIpKTsKKwkJICAgIGVsc2UKKwkJCUVNU0coXygiRTQyODogQ2Fubm90IGdvIGJleW9uZCBsYXN0IG1hdGNoaW5nIHRhZyIpKTsKKwkJICAgIHNraXBfbXNnID0gVFJVRTsKKwkJfQorCQljdXJfbWF0Y2ggPSBudW1fbWF0Y2hlcyAtIDE7CisJICAgIH0KKwkgICAgaWYgKHVzZV90YWdzdGFjaykKKwkgICAgeworCQl0YWdzdGFja1t0YWdzdGFja2lkeF0uY3VyX21hdGNoID0gY3VyX21hdGNoOworCQl0YWdzdGFja1t0YWdzdGFja2lkeF0uY3VyX2ZudW0gPSBjdXJfZm51bTsKKwkJKyt0YWdzdGFja2lkeDsKKwkgICAgfQorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJICAgIGVsc2UgaWYgKGdfZG9fdGFncHJldmlldykKKwkgICAgeworCQlwdGFnX2VudHJ5LmN1cl9tYXRjaCA9IGN1cl9tYXRjaDsKKwkJcHRhZ19lbnRyeS5jdXJfZm51bSA9IGN1cl9mbnVtOworCSAgICB9CisjZW5kaWYKKworCSAgICAvKgorCSAgICAgKiBPbmx5IHdoZW4gZ29pbmcgdG8gdHJ5IHRoZSBuZXh0IG1hdGNoLCByZXBvcnQgdGhhdCB0aGUgcHJldmlvdXMKKwkgICAgICogZmlsZSBkaWRuJ3QgZXhpc3QuICBPdGhlcndpc2UgYW4gRU1TRygpIGlzIGdpdmVuIGJlbG93LgorCSAgICAgKi8KKwkgICAgaWYgKG5vZmlsZV9mbmFtZSAhPSBOVUxMICYmIGVycm9yX2N1cl9tYXRjaCAhPSBjdXJfbWF0Y2gpCisJCW1zZ19zdHIoKGNoYXJfdSAqKV8oIkZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IiksCisJCQkJCQkJCW5vZmlsZV9mbmFtZSk7CisKKworCSAgICBpYyA9IChtYXRjaGVzW2N1cl9tYXRjaF1bMF0gJiBNVF9JQ19PRkYpOworCSAgICBpZiAodHlwZSAhPSBEVF9TRUxFQ1QgJiYgdHlwZSAhPSBEVF9KVU1QCisjaWZkZWYgRkVBVF9DU0NPUEUKKwkJJiYgdHlwZSAhPSBEVF9DU0NPUEUKKyNlbmRpZgorCQkmJiAobnVtX21hdGNoZXMgPiAxIHx8IGljKQorCQkmJiAhc2tpcF9tc2cpCisJICAgIHsKKwkJLyogR2l2ZSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgdGFncyAqLworCQlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJ0YWcgJWQgb2YgJWQlcyIpLAorCQkJCWN1cl9tYXRjaCArIDEsCisJCQkJbnVtX21hdGNoZXMsCisJCQkJbWF4X251bV9tYXRjaGVzICE9IE1BWENPTCA/IF8oIiBvciBtb3JlIikgOiAiIik7CisJCWlmIChpYykKKwkJICAgIFNUUkNBVChJT2J1ZmYsIF8oIiAgVXNpbmcgdGFnIHdpdGggZGlmZmVyZW50IGNhc2UhIikpOworCQlpZiAoKG51bV9tYXRjaGVzID4gcHJldl9udW1fbWF0Y2hlcyB8fCBuZXdfdGFnKQorCQkJCQkJCSAgICYmIG51bV9tYXRjaGVzID4gMSkKKwkJeworCQkgICAgaWYgKGljKQorCQkJbXNnX2F0dHIoSU9idWZmLCBobF9hdHRyKEhMRl9XKSk7CisJCSAgICBlbHNlCisJCQltc2coSU9idWZmKTsKKwkJICAgIG1zZ19zY3JvbGwgPSBUUlVFOwkvKiBkb24ndCBvdmVyd3JpdGUgdGhpcyBtZXNzYWdlICovCisJCX0KKwkJZWxzZQorCQkgICAgZ2l2ZV93YXJuaW5nKElPYnVmZiwgaWMpOworCQlpZiAoaWMgJiYgIW1zZ19zY3JvbGxlZCAmJiBtc2dfc2lsZW50ID09IDApCisJCXsKKwkJICAgIG91dF9mbHVzaCgpOworCQkgICAgdWlfZGVsYXkoMTAwMEwsIFRSVUUpOworCQl9CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBKdW1wIHRvIHRoZSBkZXNpcmVkIG1hdGNoLgorCSAgICAgKi8KKwkgICAgaWYgKGp1bXB0b190YWcobWF0Y2hlc1tjdXJfbWF0Y2hdLCBmb3JjZWl0LCB0eXBlICE9IERUX0NTQ09QRSkKKwkJCQkJCQkJID09IE5PVEFHRklMRSkKKwkgICAgeworCQkvKiBGaWxlIG5vdCBmb3VuZDogdHJ5IGFnYWluIHdpdGggYW5vdGhlciBtYXRjaGluZyB0YWcgKi8KKwkJaWYgKCh0eXBlID09IERUX1BSRVYgJiYgY3VyX21hdGNoID4gMCkKKwkJCXx8ICgodHlwZSA9PSBEVF9UQUcgfHwgdHlwZSA9PSBEVF9ORVhUCisJCQkJCQkJICB8fCB0eXBlID09IERUX0ZJUlNUKQorCQkJICAgICYmIChtYXhfbnVtX21hdGNoZXMgIT0gTUFYQ09MCisJCQkJCSAgICAgfHwgY3VyX21hdGNoIDwgbnVtX21hdGNoZXMgLSAxKSkpCisJCXsKKwkJICAgIGVycm9yX2N1cl9tYXRjaCA9IGN1cl9tYXRjaDsKKwkJICAgIGlmICh1c2VfdGFnc3RhY2spCisJCQktLXRhZ3N0YWNraWR4OworCQkgICAgaWYgKHR5cGUgPT0gRFRfUFJFVikKKwkJCS0tY3VyX21hdGNoOworCQkgICAgZWxzZQorCQkgICAgeworCQkJdHlwZSA9IERUX05FWFQ7CisJCQkrK2N1cl9tYXRjaDsKKwkJICAgIH0KKwkJICAgIGNvbnRpbnVlOworCQl9CisJCUVNU0cyKF8oIkU0Mjk6IEZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0IiksIG5vZmlsZV9mbmFtZSk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIFdlIG1heSBoYXZlIGp1bXBlZCB0byBhbm90aGVyIHdpbmRvdywgY2hlY2sgdGhhdAorCQkgKiB0YWdzdGFja2lkeCBpcyBzdGlsbCB2YWxpZC4gKi8KKwkJaWYgKHVzZV90YWdzdGFjayAmJiB0YWdzdGFja2lkeCA+IGN1cndpbi0+d190YWdzdGFja2xlbikKKwkJICAgIHRhZ3N0YWNraWR4ID0gY3Vyd2luLT53X3RhZ3N0YWNraWR4OworI2lmZGVmIEZFQVRfQ1NDT1BFCisJCWp1bXBlZF90b190YWcgPSBUUlVFOworI2VuZGlmCisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorCitlbmRfZG9fdGFnOgorICAgIC8qIE9ubHkgc3RvcmUgdGhlIG5ldyBpbmRleCB3aGVuIHVzaW5nIHRoZSB0YWdzdGFjayBhbmQgaXQncyB2YWxpZC4gKi8KKyAgICBpZiAodXNlX3RhZ3N0YWNrICYmIHRhZ3N0YWNraWR4IDw9IGN1cndpbi0+d190YWdzdGFja2xlbikKKwljdXJ3aW4tPndfdGFnc3RhY2tpZHggPSB0YWdzdGFja2lkeDsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBwb3N0cG9uZWRfc3BsaXQgPSAwOwkvKiBkb24ndCBzcGxpdCBuZXh0IHRpbWUgKi8KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9DU0NPUEUKKyAgICByZXR1cm4ganVtcGVkX3RvX3RhZzsKKyNlbHNlCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qCisgKiBGcmVlIGNhY2hlZCB0YWdzLgorICovCisgICAgdm9pZAordGFnX2ZyZWVtYXRjaCgpCit7CisgICAgdmltX2ZyZWUodGFnbWF0Y2huYW1lKTsKKyAgICB0YWdtYXRjaG5hbWUgPSBOVUxMOworfQorCisgICAgc3RhdGljIHZvaWQKK3RhZ2xlbl9hZHZhbmNlKGwpCisgICAgaW50CQlsOworeworICAgIGlmIChsID09IE1BWENPTCkKKyAgICB7CisJbXNnX3B1dGNoYXIoJ1xuJyk7CisJbXNnX2FkdmFuY2UoMjQpOworICAgIH0KKyAgICBlbHNlCisJbXNnX2FkdmFuY2UoMTMgKyBsKTsKK30KKworLyoKKyAqIFByaW50IHRoZSB0YWcgc3RhY2sKKyAqLworLypBUkdTVVNFRCovCisgICAgdm9pZAorZG9fdGFncyhlYXApCisgICAgZXhhcmdfVAkqZWFwOworeworICAgIGludAkJaTsKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgdGFnZ3lfVAkqdGFnc3RhY2sgPSBjdXJ3aW4tPndfdGFnc3RhY2s7CisgICAgaW50CQl0YWdzdGFja2lkeCA9IGN1cndpbi0+d190YWdzdGFja2lkeDsKKyAgICBpbnQJCXRhZ3N0YWNrbGVuID0gY3Vyd2luLT53X3RhZ3N0YWNrbGVuOworCisgICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCisgICAgTVNHX1BVVFNfVElUTEUoXygiXG4gICMgVE8gdGFnICAgICAgICAgRlJPTSBsaW5lICBpbiBmaWxlL3RleHQiKSk7CisgICAgZm9yIChpID0gMDsgaSA8IHRhZ3N0YWNrbGVuOyArK2kpCisgICAgeworCWlmICh0YWdzdGFja1tpXS50YWduYW1lICE9IE5VTEwpCisJeworCSAgICBuYW1lID0gZm1fZ2V0bmFtZSgmKHRhZ3N0YWNrW2ldLmZtYXJrKSwgMzApOworCSAgICBpZiAobmFtZSA9PSBOVUxMKQkgICAgLyogZmlsZSBuYW1lIG5vdCBhdmFpbGFibGUgKi8KKwkJY29udGludWU7CisKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CisJICAgIHNwcmludGYoKGNoYXIgKilJT2J1ZmYsICIlYyUyZCAlMmQgJS0xNXMgJTVsZCAgIiwKKwkJaSA9PSB0YWdzdGFja2lkeCA/ICc+JyA6ICcgJywKKwkJaSArIDEsCisJCXRhZ3N0YWNrW2ldLmN1cl9tYXRjaCArIDEsCisJCXRhZ3N0YWNrW2ldLnRhZ25hbWUsCisJCXRhZ3N0YWNrW2ldLmZtYXJrLm1hcmsubG51bSk7CisJICAgIG1zZ19vdXR0cmFucyhJT2J1ZmYpOworCSAgICBtc2dfb3V0dHJhbnNfYXR0cihuYW1lLCB0YWdzdGFja1tpXS5mbWFyay5mbnVtID09IGN1cmJ1Zi0+Yl9mbnVtCisJCQkJCQkJPyBobF9hdHRyKEhMRl9EKSA6IDApOworCSAgICB2aW1fZnJlZShuYW1lKTsKKwl9CisJb3V0X2ZsdXNoKCk7CQkgICAgLyogc2hvdyBvbmUgbGluZSBhdCBhIHRpbWUgKi8KKyAgICB9CisgICAgaWYgKHRhZ3N0YWNraWR4ID09IHRhZ3N0YWNrbGVuKQkvKiBpZHggYXQgdG9wIG9mIHN0YWNrICovCisJTVNHX1BVVFMoIlxuPiIpOworfQorCisvKiBXaGVuIG5vdCB1c2luZyBhIENSIGZvciBsaW5lIHNlcGFyYXRvciwgdXNlIHZpbV9mZ2V0cygpIHRvIHJlYWQgdGFnIGxpbmVzLgorICogRm9yIHRoZSBNYWMgdXNlIHRhZ19mZ2V0cygpLiAgSXQgY2FuIGhhbmRsZSBhbnkgbGluZSBzZXBhcmF0b3IsIGJ1dCBpcyBtdWNoCisgKiBzbG93ZXIgdGhhbiB2aW1fZmdldHMoKS4KKyAqLworI2lmbmRlZiBVU0VfQ1IKKyMgZGVmaW5lIHRhZ19mZ2V0cyB2aW1fZmdldHMKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9UQUdfQklOUworc3RhdGljIGludCB0YWdfc3RybmljbXAgX19BUkdTKChjaGFyX3UgKnMxLCBjaGFyX3UgKnMyLCBzaXplX3QgbGVuKSk7CisKKy8qCisgKiBDb21wYXJlIHR3byBzdHJpbmdzLCBmb3IgbGVuZ3RoICJsZW4iLCBpZ25vcmluZyBjYXNlIHRoZSBBU0NJSSB3YXkuCisgKiByZXR1cm4gMCBmb3IgbWF0Y2gsIDwgMCBmb3Igc21hbGxlciwgPiAwIGZvciBiaWdnZXIKKyAqIE1ha2Ugc3VyZSBjYXNlIGlzIGZvbGRlZCB0byB1cHBlcmNhc2UgaW4gY29tcGFyaXNvbiAobGlrZSBmb3IgJ3NvcnQgLWYnKQorICovCisgICAgc3RhdGljIGludAordGFnX3N0cm5pY21wKHMxLCBzMiwgbGVuKQorICAgIGNoYXJfdQkqczE7CisgICAgY2hhcl91CSpzMjsKKyAgICBzaXplX3QJbGVuOworeworICAgIGludAkJaTsKKworICAgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKwlpID0gKGludClUT1VQUEVSX0FTQygqczEpIC0gKGludClUT1VQUEVSX0FTQygqczIpOworCWlmIChpICE9IDApCisJICAgIHJldHVybiBpOwkJCS8qIHRoaXMgY2hhcmFjdGVyIGRpZmZlcmVudCAqLworCWlmICgqczEgPT0gTlVMKQorCSAgICBicmVhazsJCQkvKiBzdHJpbmdzIG1hdGNoIHVudGlsIE5VTCAqLworCSsrczE7CisJKytzMjsKKwktLWxlbjsKKyAgICB9CisgICAgcmV0dXJuIDA7CQkJCS8qIHN0cmluZ3MgbWF0Y2ggKi8KK30KKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIHRvIGhvbGQgaW5mbyBhYm91dCB0aGUgdGFnIHBhdHRlcm4gYmVpbmcgdXNlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyX3UJKnBhdDsJCS8qIHRoZSBwYXR0ZXJuICovCisgICAgaW50CQlsZW47CQkvKiBsZW5ndGggb2YgcGF0W10gKi8KKyAgICBjaGFyX3UJKmhlYWQ7CQkvKiBzdGFydCBvZiBwYXR0ZXJuIGhlYWQgKi8KKyAgICBpbnQJCWhlYWRsZW47CS8qIGxlbmd0aCBvZiBoZWFkW10gKi8KKyAgICByZWdtYXRjaF9UCXJlZ21hdGNoOwkvKiByZWdleHAgcHJvZ3JhbSwgbWF5IGJlIE5VTEwgKi8KK30gcGF0X1Q7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcGF0cyBfX0FSR1MoKHBhdF9UICpwYXRzLCBpbnQgaGFzX3JlKSk7CisKKy8qCisgKiBFeHRyYWN0IGluZm8gZnJvbSB0aGUgdGFnIHNlYXJjaCBwYXR0ZXJuICJwYXRzLT5wYXQiLgorICovCisgICAgc3RhdGljIHZvaWQKK3ByZXBhcmVfcGF0cyhwYXRzLCBoYXNfcmUpCisgICAgcGF0X1QJKnBhdHM7CisgICAgaW50CQloYXNfcmU7Cit7CisgICAgcGF0cy0+aGVhZCA9IHBhdHMtPnBhdDsKKyAgICBwYXRzLT5oZWFkbGVuID0gcGF0cy0+bGVuOworICAgIGlmIChoYXNfcmUpCisgICAgeworCS8qIFdoZW4gdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggJ14nIG9yICJcXDwiLCBiaW5hcnkgc2VhcmNoaW5nIGNhbiBiZQorCSAqIHVzZWQgKG11Y2ggZmFzdGVyKS4gKi8KKwlpZiAocGF0cy0+cGF0WzBdID09ICdeJykKKwkgICAgcGF0cy0+aGVhZCA9IHBhdHMtPnBhdCArIDE7CisJZWxzZSBpZiAocGF0cy0+cGF0WzBdID09ICdcXCcgJiYgcGF0cy0+cGF0WzFdID09ICc8JykKKwkgICAgcGF0cy0+aGVhZCA9IHBhdHMtPnBhdCArIDI7CisJaWYgKHBhdHMtPmhlYWQgPT0gcGF0cy0+cGF0KQorCSAgICBwYXRzLT5oZWFkbGVuID0gMDsKKwllbHNlCisJICAgIGZvciAocGF0cy0+aGVhZGxlbiA9IDA7IHBhdHMtPmhlYWRbcGF0cy0+aGVhZGxlbl0gIT0gTlVMOworCQkJCQkJCSAgICAgICsrcGF0cy0+aGVhZGxlbikKKwkJaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKShwX21hZ2ljID8gIi5bfipcXCQiIDogIlxcJCIpLAorCQkJCQkgICBwYXRzLT5oZWFkW3BhdHMtPmhlYWRsZW5dKSAhPSBOVUxMKQorCQkgICAgYnJlYWs7CisJaWYgKHBfdGwgIT0gMCAmJiBwYXRzLT5oZWFkbGVuID4gcF90bCkJLyogYWRqdXN0IGZvciAndGFnbGVuZ3RoJyAqLworCSAgICBwYXRzLT5oZWFkbGVuID0gcF90bDsKKyAgICB9CisKKyAgICBpZiAoaGFzX3JlKQorCXBhdHMtPnJlZ21hdGNoLnJlZ3Byb2cgPSB2aW1fcmVnY29tcChwYXRzLT5wYXQsIHBfbWFnaWMgPyBSRV9NQUdJQyA6IDApOworICAgIGVsc2UKKwlwYXRzLT5yZWdtYXRjaC5yZWdwcm9nID0gTlVMTDsKK30KKworLyoKKyAqIGZpbmRfdGFncygpIC0gc2VhcmNoIGZvciB0YWdzIGluIHRhZ3MgZmlsZXMKKyAqCisgKiBSZXR1cm4gRkFJTCBpZiBzZWFyY2ggY29tcGxldGVseSBmYWlsZWQgKCpudW1fbWF0Y2hlcyB3aWxsIGJlIDAsICptYXRjaGVzcAorICogd2lsbCBiZSBOVUxMKSwgT0sgb3RoZXJ3aXNlLgorICoKKyAqIFRoZXJlIGlzIGEgcHJpb3JpdHkgaW4gd2hpY2ggdHlwZSBvZiB0YWcgaXMgcmVjb2duaXplZC4KKyAqCisgKiAgNi4JQSBzdGF0aWMgb3IgZ2xvYmFsIHRhZyB3aXRoIGEgZnVsbCBtYXRjaGluZyB0YWcgZm9yIHRoZSBjdXJyZW50IGZpbGUuCisgKiAgNS4JQSBnbG9iYWwgdGFnIHdpdGggYSBmdWxsIG1hdGNoaW5nIHRhZyBmb3IgYW5vdGhlciBmaWxlLgorICogIDQuCUEgc3RhdGljIHRhZyB3aXRoIGEgZnVsbCBtYXRjaGluZyB0YWcgZm9yIGFub3RoZXIgZmlsZS4KKyAqICAzLglBIHN0YXRpYyBvciBnbG9iYWwgdGFnIHdpdGggYW4gaWdub3JlLWNhc2UgbWF0Y2hpbmcgdGFnIGZvciB0aGUKKyAqCWN1cnJlbnQgZmlsZS4KKyAqICAyLglBIGdsb2JhbCB0YWcgd2l0aCBhbiBpZ25vcmUtY2FzZSBtYXRjaGluZyB0YWcgZm9yIGFub3RoZXIgZmlsZS4KKyAqICAxLglBIHN0YXRpYyB0YWcgd2l0aCBhbiBpZ25vcmUtY2FzZSBtYXRjaGluZyB0YWcgZm9yIGFub3RoZXIgZmlsZS4KKyAqCisgKiBUYWdzIGluIGFuIGVtYWNzLXN0eWxlIHRhZ3MgZmlsZSBhcmUgYWx3YXlzIGdsb2JhbC4KKyAqCisgKiBmbGFnczoKKyAqIFRBR19IRUxQCSAgb25seSBzZWFyY2ggZm9yIGhlbHAgdGFncworICogVEFHX05BTUVTCSAgb25seSByZXR1cm4gbmFtZSBvZiB0YWcKKyAqIFRBR19SRUdFWFAJICB1c2UgInBhdCIgYXMgYSByZWdleHAKKyAqIFRBR19OT0lDCSAgZG9uJ3QgYWx3YXlzIGlnbm9yZSBjYXNlCisgKiBUQUdfS0VFUF9MQU5HICBrZWVwIGxhbmd1YWdlCisgKi8KKyAgICBpbnQKK2ZpbmRfdGFncyhwYXQsIG51bV9tYXRjaGVzLCBtYXRjaGVzcCwgZmxhZ3MsIG1pbmNvdW50LCBidWZfZmZuYW1lKQorICAgIGNoYXJfdQkqcGF0OwkJCS8qIHBhdHRlcm4gdG8gc2VhcmNoIGZvciAqLworICAgIGludAkJKm51bV9tYXRjaGVzOwkJLyogcmV0dXJuOiBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCAqLworICAgIGNoYXJfdQkqKiptYXRjaGVzcDsJCS8qIHJldHVybjogYXJyYXkgb2YgbWF0Y2hlcyBmb3VuZCAqLworICAgIGludAkJZmxhZ3M7CisgICAgaW50CQltaW5jb3VudDsJCS8qICBNQVhDT0w6IGZpbmQgYWxsIG1hdGNoZXMKKwkJCQkJICAgICBvdGhlcjogbWluaW1hbCBudW1iZXIgb2YgbWF0Y2hlcyAqLworICAgIGNoYXJfdQkqYnVmX2ZmbmFtZTsJCS8qIG5hbWUgb2YgYnVmZmVyIGZvciBwcmlvcml0eSAqLworeworICAgIEZJTEUgICAgICAgKmZwOworICAgIGNoYXJfdSAgICAgKmxidWY7CQkJLyogbGluZSBidWZmZXIgKi8KKyAgICBjaGFyX3UgICAgICp0YWdfZm5hbWU7CQkvKiBuYW1lIG9mIHRhZyBmaWxlICovCisgICAgaW50CQlmaXJzdF9maWxlOwkJLyogdHJ5aW5nIGZpcnN0IHRhZyBmaWxlICovCisgICAgdGFncHRyc19UCXRhZ3A7CisgICAgaW50CQlkaWRfb3BlbiA9IEZBTFNFOwkvKiBkaWQgb3BlbiBhIHRhZyBmaWxlICovCisgICAgaW50CQlzdG9wX3NlYXJjaGluZyA9IEZBTFNFOwkvKiBzdG9wIHdoZW4gbWF0Y2ggZm91bmQgb3IgZXJyb3IgKi8KKyAgICBpbnQJCXJldHZhbCA9IEZBSUw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKyAgICBpbnQJCWlzX3N0YXRpYzsJCS8qIGN1cnJlbnQgdGFnIGxpbmUgaXMgc3RhdGljICovCisgICAgaW50CQlpc19jdXJyZW50OwkJLyogZmlsZSBuYW1lIG1hdGNoZXMgKi8KKyAgICBpbnQJCWVvZiA9IEZBTFNFOwkJLyogZm91bmQgZW5kLW9mLWZpbGUgKi8KKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpzOworICAgIGludAkJaTsKKyNpZmRlZiBGRUFUX1RBR19CSU5TCisgICAgc3RydWN0IHRhZ19zZWFyY2hfaW5mbwkvKiBCaW5hcnkgc2VhcmNoIGZpbGUgb2Zmc2V0cyAqLworICAgIHsKKwlvZmZfdAlsb3dfb2Zmc2V0OwkvKiBvZmZzZXQgZm9yIGZpcnN0IGNoYXIgb2YgZmlyc3QgbGluZSB0aGF0CisJCQkJICAgY291bGQgbWF0Y2ggKi8KKwlvZmZfdAloaWdoX29mZnNldDsJLyogb2Zmc2V0IG9mIGNoYXIgYWZ0ZXIgbGFzdCBsaW5lIHRoYXQgY291bGQKKwkJCQkgICBtYXRjaCAqLworCW9mZl90CWN1cnJfb2Zmc2V0OwkvKiBDdXJyZW50IGZpbGUgb2Zmc2V0IGluIHNlYXJjaCByYW5nZSAqLworCW9mZl90CWN1cnJfb2Zmc2V0X3VzZWQ7IC8qIGN1cnJfb2Zmc2V0IHVzZWQgd2hlbiBza2lwcGluZyBiYWNrICovCisJb2ZmX3QJbWF0Y2hfb2Zmc2V0OwkvKiBXaGVyZSB0aGUgYmluYXJ5IHNlYXJjaCBmb3VuZCBhIHRhZyAqLworCWludAlsb3dfY2hhcjsJLyogZmlyc3QgY2hhciBhdCBsb3dfb2Zmc2V0ICovCisJaW50CWhpZ2hfY2hhcjsJLyogZmlyc3QgY2hhciBhdCBoaWdoX29mZnNldCAqLworICAgIH0gc2VhcmNoX2luZm87CisgICAgb2ZmX3QJZmlsZXNpemU7CisgICAgaW50CQl0YWdjbXA7CisgICAgb2ZmX3QJb2Zmc2V0OworICAgIGludAkJcm91bmQ7CisjZW5kaWYKKyAgICBlbnVtCisgICAgeworCVRTX1NUQVJULAkJLyogYXQgc3RhcnQgb2YgZmlsZSAqLworCVRTX0xJTkVBUgkJLyogbGluZWFyIHNlYXJjaGluZyBmb3J3YXJkLCB0aWxsIEVPRiAqLworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKwksIFRTX0JJTkFSWSwJCS8qIGJpbmFyeSBzZWFyY2hpbmcgKi8KKwlUU19TS0lQX0JBQ0ssCQkvKiBza2lwcGluZyBiYWNrd2FyZHMgKi8KKwlUU19TVEVQX0ZPUldBUkQJCS8qIHN0ZXBwaW5nIGZvcndhcmRzICovCisjZW5kaWYKKyAgICB9CXN0YXRlOwkJCS8qIEN1cnJlbnQgc2VhcmNoIHN0YXRlICovCisKKyAgICBpbnQJCWNtcGxlbjsKKyAgICBpbnQJCW1hdGNoOwkJLyogbWF0Y2hlcyAqLworICAgIGludAkJbWF0Y2hfbm9faWMgPSAwOy8qIG1hdGNoZXMgd2l0aCBybV9pYyA9PSBGQUxTRSAqLworICAgIGludAkJbWF0Y2hfcmU7CS8qIG1hdGNoIHdpdGggcmVnZXhwICovCisgICAgaW50CQltYXRjaG9mZiA9IDA7CisKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKyAgICAvKgorICAgICAqIFN0YWNrIGZvciBpbmNsdWRlZCBlbWFjcy10YWdzIGZpbGUuCisgICAgICogSXQgaGFzIGEgZml4ZWQgc2l6ZSwgdG8gdHJ1bmNhdGUgY3ljbGljIGluY2x1ZGVzLiBqdworICAgICAqLworIyBkZWZpbmUgSU5DU1RBQ0tfU0laRSA0MgorICAgIHN0cnVjdAorICAgIHsKKwlGSUxFCSpmcDsKKwljaGFyX3UJKmV0YWdfZm5hbWU7CisgICAgfSBpbmNzdGFja1tJTkNTVEFDS19TSVpFXTsKKworICAgIGludAkJaW5jc3RhY2tfaWR4ID0gMDsJLyogaW5kZXggaW4gaW5jc3RhY2sgKi8KKyAgICBjaGFyX3UgICAgICplYnVmOwkJCS8qIGFkaXRpb25hbCBidWZmZXIgZm9yIGV0YWcgZm5hbWUgKi8KKyAgICBpbnQJCWlzX2V0YWc7CQkvKiBjdXJyZW50IGZpbGUgaXMgZW1hY2VzIHN0eWxlICovCisjZW5kaWYKKworICAgIHN0cnVjdCBtYXRjaF9mb3VuZAorICAgIHsKKwlpbnQJbGVuOwkJLyogbnIgb2YgY2hhcnMgb2YgbWF0Y2hbXSB0byBiZSBjb21wYXJlZCAqLworCWNoYXJfdQltYXRjaFsxXTsJLyogYWN0dWFsbHkgbG9uZ2VyICovCisgICAgfSAqbWZwLCAqbWZwMjsKKyAgICBnYXJyYXlfVAlnYV9tYXRjaFtNVF9DT1VOVF07CisgICAgaW50CQltYXRjaF9jb3VudCA9IDA7CQkvKiBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCAqLworICAgIGNoYXJfdQkqKm1hdGNoZXM7CisgICAgaW50CQltdHQ7CisgICAgaW50CQlsZW47CisgICAgaW50CQloZWxwX3NhdmU7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgaW50CQloZWxwX3ByaSA9IDA7CisgICAgY2hhcl91CSpoZWxwX2xhbmdfZmluZCA9IE5VTEw7CQkvKiBsYW5nIHRvIGJlIGZvdW5kICovCisgICAgY2hhcl91CWhlbHBfbGFuZ1szXTsJCQkvKiBsYW5nIG9mIGN1cnJlbnQgdGFncyBmaWxlICovCisgICAgY2hhcl91CSpzYXZlZF9wYXQgPSBOVUxMOwkJLyogY29weSBvZiBwYXRbXSAqLworI2VuZGlmCisKKyAgICAvKiBVc2UgdHdvIHNldHMgb2YgdmFyaWFibGVzIGZvciB0aGUgcGF0dGVybjogIm9yZ3BhdCIgaG9sZHMgdGhlIHZhbHVlcworICAgICAqIGZvciB0aGUgb3JpZ2luYWwgcGF0dGVybiBhbmQgImNvbnZwYXQiIGNvbnZlcnRlZCBmcm9tICdlbmNvZGluZycgdG8KKyAgICAgKiBlbmNvZGluZyBvZiB0aGUgdGFncyBmaWxlLiAgInBhdHMiIHBvaW50IHRvIGVpdGhlciBvbmUgb2YgdGhlc2UuICovCisgICAgcGF0X1QJKnBhdHM7CisgICAgcGF0X1QJb3JncGF0OwkJCS8qIGhvbGRzIHVuY29udmVydGVkIHBhdHRlcm4gaW5mbyAqLworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBwYXRfVAljb252cGF0OwkJLyogaG9sZHMgY29udmVydGVkIHBhdHRlcm4gaW5mbyAqLworICAgIHZpbWNvbnZfVAl2aW1jb252OworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1RBR19CSU5TCisgICAgaW50CQlmaW5kYWxsID0gKG1pbmNvdW50ID09IE1BWENPTCB8fCBtaW5jb3VudCA9PSBUQUdfTUFOWSk7CisJCQkJCQkvKiBmaW5kIGFsbCBtYXRjaGluZyB0YWdzICovCisgICAgaW50CQlzb3J0X2Vycm9yID0gRkFMU0U7CQkvKiB0YWdzIGZpbGUgbm90IHNvcnRlZCAqLworICAgIGludAkJbGluZWFyOwkJCQkvKiBkbyBhIGxpbmVhciBzZWFyY2ggKi8KKyAgICBpbnQJCXNvcnRpYyA9IEZBTFNFOwkJCS8qIHRhZyBmaWxlIHNvcnRlZCBpbiBub2Nhc2UgKi8KKyNlbmRpZgorICAgIGludAkJbGluZV9lcnJvciA9IEZBTFNFOwkJLyogc3ludGF4IGVycm9yICovCisgICAgaW50CQloYXNfcmUgPSAoZmxhZ3MgJiBUQUdfUkVHRVhQKTsJLyogcmVnZXhwIHVzZWQgKi8KKyAgICBpbnQJCWhlbHBfb25seSA9IChmbGFncyAmIFRBR19IRUxQKTsKKyAgICBpbnQJCW5hbWVfb25seSA9IChmbGFncyAmIFRBR19OQU1FUyk7CisgICAgaW50CQlub2ljID0gKGZsYWdzICYgVEFHX05PSUMpOworICAgIGludAkJZ2V0X2l0X2FnYWluID0gRkFMU0U7CisjaWZkZWYgRkVBVF9DU0NPUEUKKyAgICBpbnQJCXVzZV9jc2NvcGUgPSAoZmxhZ3MgJiBUQUdfQ1NDT1BFKTsKKyNlbmRpZgorICAgIGludAkJdmVyYm9zZSA9IChmbGFncyAmIFRBR19WRVJCT1NFKTsKKworICAgIGhlbHBfc2F2ZSA9IGN1cmJ1Zi0+Yl9oZWxwOworICAgIG9yZ3BhdC5wYXQgPSBwYXQ7CisgICAgcGF0cyA9ICZvcmdwYXQ7CisjaWZkZWYgRkVBVF9NQllURQorICAgIHZpbWNvbnYudmNfdHlwZSA9IENPTlZfTk9ORTsKKyNlbmRpZgorCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYnVmZmVycyB0aGF0IGFyZSB1c2VkCisgKi8KKyAgICBsYnVmID0gYWxsb2MoTFNJWkUpOworICAgIHRhZ19mbmFtZSA9IGFsbG9jKE1BWFBBVEhMICsgMSk7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgZWJ1ZiA9IGFsbG9jKExTSVpFKTsKKyNlbmRpZgorICAgIGZvciAobXR0ID0gMDsgbXR0IDwgTVRfQ09VTlQ7ICsrbXR0KQorCWdhX2luaXQyKCZnYV9tYXRjaFttdHRdLCAoaW50KXNpemVvZihzdHJ1Y3QgbWF0Y2hfZm91bmQgKiksIDEwMCk7CisKKyAgICAvKiBjaGVjayBmb3Igb3V0IG9mIG1lbW9yeSBzaXR1YXRpb24gKi8KKyAgICBpZiAobGJ1ZiA9PSBOVUxMIHx8IHRhZ19mbmFtZSA9PSBOVUxMCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJCQkJCSB8fCBlYnVmID09IE5VTEwKKyNlbmRpZgorCQkJCQkJCSkKKwlnb3RvIGZpbmR0YWdfZW5kOworCisjaWZkZWYgRkVBVF9DU0NPUEUKKyAgICBTVFJDUFkodGFnX2ZuYW1lLCAiZnJvbSBjc2NvcGUiKTsJCS8qIGZvciBlcnJvciBtZXNzYWdlcyAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgYSBmZXcgdmFyaWFibGVzCisgICAgICovCisgICAgaWYgKGhlbHBfb25seSkJCQkJLyogd2FudCB0YWdzIGZyb20gaGVscCBmaWxlICovCisJY3VyYnVmLT5iX2hlbHAgPSBUUlVFOwkJCS8qIHdpbGwgYmUgcmVzdG9yZWQgbGF0ZXIgKi8KKworICAgIHBhdHMtPmxlbiA9IChpbnQpU1RSTEVOKHBhdCk7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgaWYgKGN1cmJ1Zi0+Yl9oZWxwKQorICAgIHsKKwkvKiBXaGVuICJAYWIiIGlzIHNwZWNpZmllZCB1c2Ugb25seSB0aGUgImFiIiBsYW5ndWFnZSwgb3RoZXJ3aXNlCisJICogc2VhcmNoIGFsbCBsYW5ndWFnZXMuICovCisJaWYgKHBhdHMtPmxlbiA+IDMgJiYgcGF0W3BhdHMtPmxlbiAtIDNdID09ICdAJworCQkJCQkgICYmIEFTQ0lJX0lTQUxQSEEocGF0W3BhdHMtPmxlbiAtIDJdKQorCQkJCQkgJiYgQVNDSUlfSVNBTFBIQShwYXRbcGF0cy0+bGVuIC0gMV0pKQorCXsKKwkgICAgc2F2ZWRfcGF0ID0gdmltX3N0cm5zYXZlKHBhdCwgcGF0cy0+bGVuIC0gMyk7CisJICAgIGlmIChzYXZlZF9wYXQgIT0gTlVMTCkKKwkgICAgeworCQloZWxwX2xhbmdfZmluZCA9ICZwYXRbcGF0cy0+bGVuIC0gMl07CisJCXBhdHMtPnBhdCA9IHNhdmVkX3BhdDsKKwkJcGF0cy0+bGVuIC09IDM7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisgICAgaWYgKHBfdGwgIT0gMCAmJiBwYXRzLT5sZW4gPiBwX3RsKQkJLyogYWRqdXN0IGZvciAndGFnbGVuZ3RoJyAqLworCXBhdHMtPmxlbiA9IHBfdGw7CisKKyAgICBwcmVwYXJlX3BhdHMocGF0cywgaGFzX3JlKTsKKworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKyAgICAvKiBUaGlzIGlzIG9ubHkgdG8gYXZvaWQgYSBjb21waWxlciB3YXJuaW5nIGZvciB1c2luZyBzZWFyY2hfaW5mbworICAgICAqIHVuaW5pdGlhbGlzZWQuICovCisgICAgdmltX21lbXNldCgmc2VhcmNoX2luZm8sIDAsIChzaXplX3QpMSk7CisjZW5kaWYKKworLyoKKyAqIFdoZW4gZmluZGluZyBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWF0Y2hlcywgZmlyc3QgdHJ5IHdpdGggbWF0Y2hpbmcgY2FzZSwKKyAqIHNvIGJpbmFyeSBzZWFyY2ggY2FuIGJlIHVzZWQsIGFuZCB0cnkgaWdub3JlLWNhc2UgbWF0Y2hlcyBpbiBhIHNlY29uZCBsb29wLgorICogV2hlbiBmaW5kaW5nIGFsbCBtYXRjaGVzLCAndGFnYnNlYXJjaCcgaXMgb2ZmLCBvciB0aGVyZSBpcyBubyBmaXhlZCBzdHJpbmcKKyAqIHRvIGxvb2sgZm9yLCBpZ25vcmUgY2FzZSByaWdodCBhd2F5IHRvIGF2b2lkIGdvaW5nIHRob3VnaCB0aGUgdGFncyBmaWxlcworICogdHdpY2UuCisgKiBXaGVuIHRoZSB0YWcgZmlsZSBpcyBjYXNlLWZvbGQgc29ydGVkLCBpdCBpcyBlaXRoZXIgb25lIG9yIHRoZSBvdGhlci4KKyAqIE9ubHkgaWdub3JlIGNhc2Ugd2hlbiBUQUdfTk9JQyBub3QgdXNlZCBvciAnaWdub3JlY2FzZScgc2V0LgorICovCisjaWZkZWYgRkVBVF9UQUdfQklOUworICAgIHBhdHMtPnJlZ21hdGNoLnJtX2ljID0gKChwX2ljIHx8ICFub2ljKQorCQkJCSAgICYmIChmaW5kYWxsIHx8IHBhdHMtPmhlYWRsZW4gPT0gMCB8fCAhcF90YnMpKTsKKyAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKyAgICB7CisgICAgICBsaW5lYXIgPSAocGF0cy0+aGVhZGxlbiA9PSAwIHx8ICFwX3RicyB8fCByb3VuZCA9PSAyKTsKKyNlbHNlCisgICAgICBwYXRzLT5yZWdtYXRjaC5ybV9pYyA9IChwX2ljIHx8ICFub2ljKTsKKyNlbmRpZgorCisgICAgICAvKgorICAgICAgICogVHJ5IHRhZyBmaWxlIG5hbWVzIGZyb20gdGFncyBvcHRpb24gb25lIGJ5IG9uZS4KKyAgICAgICAqLworICAgICAgZm9yIChmaXJzdF9maWxlID0gVFJVRTsKKyNpZmRlZiBGRUFUX0NTQ09QRQorCSAgICB1c2VfY3Njb3BlIHx8CisjZW5kaWYKKwkJZ2V0X3RhZ2ZuYW1lKGZpcnN0X2ZpbGUsIHRhZ19mbmFtZSkgPT0gT0s7IGZpcnN0X2ZpbGUgPSBGQUxTRSkKKyAgICAgIHsKKwkvKgorCSAqIEEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QgaXMgc2lsZW50bHkgaWdub3JlZC4gIE9ubHkgd2hlbiBub3QgYQorCSAqIHNpbmdsZSBmaWxlIGlzIGZvdW5kLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdpdmVuIChmdXJ0aGVyIG9uKS4KKwkgKi8KKyNpZmRlZiBGRUFUX0NTQ09QRQorCWlmICh1c2VfY3Njb3BlKQorCSAgICBmcCA9IE5VTEw7CSAgICAvKiBhdm9pZCBHQ0Mgd2FybmluZyAqLworCWVsc2UKKyNlbmRpZgorCXsKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKwkgICAgaWYgKGN1cmJ1Zi0+Yl9oZWxwKQorCSAgICB7CisJCS8qIFByZWZlciBoZWxwIHRhZ3MgYWNjb3JkaW5nIHRvICdoZWxwbGFuZycuICBQdXQgdGhlCisJCSAqIHR3by1sZXR0ZXIgbGFuZ3VhZ2UgbmFtZSBpbiBoZWxwX2xhbmdbXS4gKi8KKwkJaSA9IFNUUkxFTih0YWdfZm5hbWUpOworCQlpZiAoaSA+IDMgJiYgdGFnX2ZuYW1lW2kgLSAzXSA9PSAnLScpCisJCSAgICBTVFJDUFkoaGVscF9sYW5nLCB0YWdfZm5hbWUgKyBpIC0gMik7CisJCWVsc2UKKwkJICAgIFNUUkNQWShoZWxwX2xhbmcsICJlbiIpOworCisJCS8qIFdoZW4gc2VhcmNoaW5nIGZvciBhIHNwZWNpZmljIGxhbmd1YWdlIHNraXAgdGFncyBmaWxlcworCQkgKiBmb3Igb3RoZXIgbGFuZ3VhZ2VzLiAqLworCQlpZiAoaGVscF9sYW5nX2ZpbmQgIT0gTlVMTAorCQkJCSAgICYmIFNUUklDTVAoaGVscF9sYW5nLCBoZWxwX2xhbmdfZmluZCkgIT0gMCkKKwkJICAgIGNvbnRpbnVlOworCisJCS8qIEZvciBDVFJMLV0gaW4gYSBoZWxwIGZpbGUgcHJlZmVyIGEgbWF0Y2ggd2l0aCB0aGUgc2FtZQorCQkgKiBsYW5ndWFnZS4gKi8KKwkJaWYgKChmbGFncyAmIFRBR19LRUVQX0xBTkcpCisJCQkmJiBoZWxwX2xhbmdfZmluZCA9PSBOVUxMCisJCQkmJiBjdXJidWYtPmJfZm5hbWUgIT0gTlVMTAorCQkJJiYgKGkgPSBTVFJMRU4oY3VyYnVmLT5iX2ZuYW1lKSkgPiA0CisJCQkmJiBjdXJidWYtPmJfZm5hbWVbaSAtIDFdID09ICd4JworCQkJJiYgY3VyYnVmLT5iX2ZuYW1lW2kgLSA0XSA9PSAnLicKKwkJCSYmIFNUUk5JQ01QKGN1cmJ1Zi0+Yl9mbmFtZSArIGkgLSAzLCBoZWxwX2xhbmcsIDIpID09IDApCisJCSAgICBoZWxwX3ByaSA9IDA7CisJCWVsc2UKKwkJeworCQkgICAgaGVscF9wcmkgPSAxOworCQkgICAgZm9yIChzID0gcF9obGc7ICpzICE9IE5VTDsgKytzKQorCQkgICAgeworCQkJaWYgKFNUUk5JQ01QKHMsIGhlbHBfbGFuZywgMikgPT0gMCkKKwkJCSAgICBicmVhazsKKwkJCSsraGVscF9wcmk7CisJCQlpZiAoKHMgPSB2aW1fc3RyY2hyKHMsICcsJykpID09IE5VTEwpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCSAgICBpZiAocyA9PSBOVUxMIHx8ICpzID09IE5VTCkKKwkJICAgIHsKKwkJCS8qIExhbmd1YWdlIG5vdCBpbiAnaGVscGxhbmcnOiB1c2UgbGFzdCwgcHJlZmVyIEVuZ2xpc2gsCisJCQkgKiB1bmxlc3MgZm91bmQgYWxyZWFkeS4gKi8KKwkJCSsraGVscF9wcmk7CisJCQlpZiAoU1RSSUNNUChoZWxwX2xhbmcsICJlbiIpICE9IDApCisJCQkgICAgKytoZWxwX3ByaTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisjZW5kaWYKKworCSAgICBpZiAoKGZwID0gbWNoX2ZvcGVuKChjaGFyICopdGFnX2ZuYW1lLCAiciIpKSA9PSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICBpZiAocF92ZXJib3NlID49IDUpCisJCW1zZ19zdHIoKGNoYXJfdSAqKV8oIlNlYXJjaGluZyB0YWdzIGZpbGUgJXMiKSwgdGFnX2ZuYW1lKTsKKwl9CisJZGlkX29wZW4gPSBUUlVFOyAgICAvKiByZW1lbWJlciB0aGF0IHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBmaWxlICovCisKKwlzdGF0ZSA9IFRTX1NUQVJUOyAgIC8qIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCWlzX2V0YWcgPSAwOwkgICAgLyogZGVmYXVsdCBpczogbm90IGVtYWNzIHN0eWxlICovCisjZW5kaWYKKworCS8qCisJICogUmVhZCBhbmQgcGFyc2UgdGhlIGxpbmVzIGluIHRoZSBmaWxlIG9uZSBieSBvbmUKKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgbGluZV9icmVha2NoZWNrKCk7CSAgICAvKiBjaGVjayBmb3IgQ1RSTC1DIHR5cGVkICovCisjaWZkZWYgRkVBVF9JTlNfRVhQQU5ECisJICAgIGlmICgoZmxhZ3MgJiBUQUdfSU5TX0NPTVApKQkvKiBEb3VibGUgYnJhY2tldHMgZm9yIGdjYyAqLworCQlpbnNfY29tcGxfY2hlY2tfa2V5cygpOworCSAgICBpZiAoZ290X2ludCB8fCBjb21wbGV0aW9uX2ludGVycnVwdGVkKQorI2Vsc2UKKwkgICAgaWYgKGdvdF9pbnQpCisjZW5kaWYKKwkgICAgeworCQlzdG9wX3NlYXJjaGluZyA9IFRSVUU7CisJCWJyZWFrOworCSAgICB9CisJICAgIC8qIFdoZW4gbWluY291bnQgaXMgVEFHX01BTlksIHN0b3Agd2hlbiBlbm91Z2ggbWF0Y2hlcyBoYXZlIGJlZW4KKwkgICAgICogZm91bmQgKGZvciBjb21wbGV0aW9uKS4gKi8KKwkgICAgaWYgKG1pbmNvdW50ID09IFRBR19NQU5ZICYmIG1hdGNoX2NvdW50ID49IFRBR19NQU5ZKQorCSAgICB7CisJCXN0b3Bfc2VhcmNoaW5nID0gVFJVRTsKKwkJcmV0dmFsID0gT0s7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChnZXRfaXRfYWdhaW4pCisJCWdvdG8gbGluZV9yZWFkX2luOworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKwkgICAgLyoKKwkgICAgICogRm9yIGJpbmFyeSBzZWFyY2g6IGNvbXB1dGUgdGhlIG5leHQgb2Zmc2V0IHRvIHVzZS4KKwkgICAgICovCisJICAgIGlmIChzdGF0ZSA9PSBUU19CSU5BUlkpCisJICAgIHsKKwkJb2Zmc2V0ID0gc2VhcmNoX2luZm8ubG93X29mZnNldCArICgoc2VhcmNoX2luZm8uaGlnaF9vZmZzZXQKKwkJCQkJICAgICAgIC0gc2VhcmNoX2luZm8ubG93X29mZnNldCkgLyAyKTsKKwkJaWYgKG9mZnNldCA9PSBzZWFyY2hfaW5mby5jdXJyX29mZnNldCkKKwkJICAgIGJyZWFrOwkvKiBFbmQgdGhlIGJpbmFyeSBzZWFyY2ggd2l0aG91dCBhIG1hdGNoLiAqLworCQllbHNlCisJCSAgICBzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9IG9mZnNldDsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIFNraXBwaW5nIGJhY2sgKGFmdGVyIGEgbWF0Y2ggZHVyaW5nIGJpbmFyeSBzZWFyY2gpLgorCSAgICAgKi8KKwkgICAgZWxzZSBpZiAoc3RhdGUgPT0gVFNfU0tJUF9CQUNLKQorCSAgICB7CisJCXNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0IC09IExTSVpFICogMjsKKwkJaWYgKHNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0IDwgMCkKKwkJeworCQkgICAgc2VhcmNoX2luZm8uY3Vycl9vZmZzZXQgPSAwOworCQkgICAgcmV3aW5kKGZwKTsKKwkJICAgIHN0YXRlID0gVFNfU1RFUF9GT1JXQVJEOworCQl9CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBXaGVuIGp1bXBpbmcgYXJvdW5kIGluIHRoZSBmaWxlLCBmaXJzdCByZWFkIGEgbGluZSB0byBmaW5kIHRoZQorCSAgICAgKiBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLgorCSAgICAgKi8KKwkgICAgaWYgKHN0YXRlID09IFRTX0JJTkFSWSB8fCBzdGF0ZSA9PSBUU19TS0lQX0JBQ0spCisJICAgIHsKKwkJLyogQWRqdXN0IHRoZSBzZWFyY2ggZmlsZSBvZmZzZXQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gKi8KKwkJc2VhcmNoX2luZm8uY3Vycl9vZmZzZXRfdXNlZCA9IHNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0OworI2lmZGVmIEhBVkVfRlNFRUtPCisJCWZzZWVrbyhmcCwgc2VhcmNoX2luZm8uY3Vycl9vZmZzZXQsIFNFRUtfU0VUKTsKKyNlbHNlCisJCWZzZWVrKGZwLCAobG9uZylzZWFyY2hfaW5mby5jdXJyX29mZnNldCwgU0VFS19TRVQpOworI2VuZGlmCisJCWVvZiA9IHRhZ19mZ2V0cyhsYnVmLCBMU0laRSwgZnApOworCQlpZiAoIWVvZiAmJiBzZWFyY2hfaW5mby5jdXJyX29mZnNldCAhPSAwKQorCQl7CisJCSAgICBzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9IGZ0ZWxsKGZwKTsKKwkJICAgIGlmIChzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9PSBzZWFyY2hfaW5mby5oaWdoX29mZnNldCkKKwkJICAgIHsKKwkJCS8qIG9vcHMsIGdvbmUgYSBiaXQgdG9vIGZhcjsgdHJ5IGZyb20gbG93IG9mZnNldCAqLworI2lmZGVmIEhBVkVfRlNFRUtPCisJCQlmc2Vla28oZnAsIHNlYXJjaF9pbmZvLmxvd19vZmZzZXQsIFNFRUtfU0VUKTsKKyNlbHNlCisJCQlmc2VlayhmcCwgKGxvbmcpc2VhcmNoX2luZm8ubG93X29mZnNldCwgU0VFS19TRVQpOworI2VuZGlmCisJCQlzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9IHNlYXJjaF9pbmZvLmxvd19vZmZzZXQ7CisJCSAgICB9CisJCSAgICBlb2YgPSB0YWdfZmdldHMobGJ1ZiwgTFNJWkUsIGZwKTsKKwkJfQorCQkvKiBza2lwIGVtcHR5IGFuZCBibGFuayBsaW5lcyAqLworCQl3aGlsZSAoIWVvZiAmJiB2aW1faXNibGFua2xpbmUobGJ1ZikpCisJCXsKKwkJICAgIHNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0ID0gZnRlbGwoZnApOworCQkgICAgZW9mID0gdGFnX2ZnZXRzKGxidWYsIExTSVpFLCBmcCk7CisJCX0KKwkJaWYgKGVvZikKKwkJeworCQkgICAgLyogSGl0IGVuZCBvZiBmaWxlLiAgU2tpcCBiYWNrd2FyZHMuICovCisJCSAgICBzdGF0ZSA9IFRTX1NLSVBfQkFDSzsKKwkJICAgIHNlYXJjaF9pbmZvLm1hdGNoX29mZnNldCA9IGZ0ZWxsKGZwKTsKKwkJICAgIHNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0ID0gc2VhcmNoX2luZm8uY3Vycl9vZmZzZXRfdXNlZDsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBOb3QganVtcGluZyBhcm91bmQgaW4gdGhlIGZpbGU6IFJlYWQgdGhlIG5leHQgbGluZS4KKwkgICAgICovCisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCS8qIHNraXAgZW1wdHkgYW5kIGJsYW5rIGxpbmVzICovCisJCWRvCisJCXsKKyNpZmRlZiBGRUFUX0NTQ09QRQorCQkgICAgaWYgKHVzZV9jc2NvcGUpCisJCQllb2YgPSBjc19mZ2V0cyhsYnVmLCBMU0laRSk7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJCWVvZiA9IHRhZ19mZ2V0cyhsYnVmLCBMU0laRSwgZnApOworCQl9IHdoaWxlICghZW9mICYmIHZpbV9pc2JsYW5rbGluZShsYnVmKSk7CisKKwkJaWYgKGVvZikKKwkJeworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCQkgICAgaWYgKGluY3N0YWNrX2lkeCkJLyogdGhpcyB3YXMgYW4gaW5jbHVkZWQgZmlsZSAqLworCQkgICAgeworCQkJLS1pbmNzdGFja19pZHg7CisJCQlmY2xvc2UoZnApOwkvKiBlbmQgb2YgdGhpcyBmaWxlIC4uLiAqLworCQkJZnAgPSBpbmNzdGFja1tpbmNzdGFja19pZHhdLmZwOworCQkJU1RSQ1BZKHRhZ19mbmFtZSwgaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lKTsKKwkJCXZpbV9mcmVlKGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZXRhZ19mbmFtZSk7CisJCQlpc19ldGFnID0gMTsJLyogKG9ubHkgZXRhZ3MgY2FuIGluY2x1ZGUpICovCisJCQljb250aW51ZTsJLyogLi4uIGNvbnRpbnVlIHdpdGggcGFyZW50IGZpbGUgKi8KKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJYnJlYWs7CQkJICAgIC8qIGVuZCBvZiBmaWxlICovCisJCX0KKwkgICAgfQorbGluZV9yZWFkX2luOgorCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJICAgIC8qCisJICAgICAqIEVtYWNzIHRhZ3MgbGluZSB3aXRoIENUUkwtTDogTmV3IGZpbGUgbmFtZSBvbiBuZXh0IGxpbmUuCisJICAgICAqIFRoZSBmaWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSAnLCcuCisJICAgICAqLworCSAgICBpZiAoKmxidWYgPT0gQ3RybF9MKQkvKiByZW1lbWJlciBldGFnIGZpbGUgbmFtZSBpbiBlYnVmICovCisJICAgIHsKKwkJaXNfZXRhZyA9IDE7CQkvKiBpbiBjYXNlIGF0IHRoZSBzdGFydCAqLworCQlzdGF0ZSA9IFRTX0xJTkVBUjsKKwkJaWYgKCF0YWdfZmdldHMoZWJ1ZiwgTFNJWkUsIGZwKSkKKwkJeworCQkgICAgZm9yIChwID0gZWJ1ZjsgKnAgJiYgKnAgIT0gJywnOyBwKyspCisJCQk7CisJCSAgICAqcCA9IE5VTDsKKworCQkgICAgLyoKKwkJICAgICAqIGF0b2kocCsxKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJlZm9yZSB0aGUgbmV4dCBeTAorCQkgICAgICogdW5sZXNzIGl0IGlzIGFuIGluY2x1ZGUgc3RhdGVtZW50LgorCQkgICAgICovCisJCSAgICBpZiAoU1RSTkNNUChwICsgMSwgImluY2x1ZGUiLCA3KSA9PSAwCisJCQkJCSAgICAgICYmIGluY3N0YWNrX2lkeCA8IElOQ1NUQUNLX1NJWkUpCisJCSAgICB7CisJCQkvKiBTYXZlIGN1cnJlbnQgImZwIiBhbmQgInRhZ19mbmFtZSIgaW4gdGhlIHN0YWNrLiAqLworCQkJaWYgKChpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUgPQorCQkJCQkgICAgICB2aW1fc3Ryc2F2ZSh0YWdfZm5hbWUpKSAhPSBOVUxMKQorCQkJeworCQkJICAgIGNoYXJfdSAqZnVsbHBhdGhfZWJ1ZjsKKworCQkJICAgIGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZnAgPSBmcDsKKwkJCSAgICBmcCA9IE5VTEw7CisKKwkJCSAgICAvKiBGaWd1cmUgb3V0ICJ0YWdfZm5hbWUiIGFuZCAiZnAiIHRvIHVzZSBmb3IKKwkJCSAgICAgKiBpbmNsdWRlZCBmaWxlLiAqLworCQkJICAgIGZ1bGxwYXRoX2VidWYgPSBleHBhbmRfdGFnX2ZuYW1lKGVidWYsCisJCQkJCQkJICAgIHRhZ19mbmFtZSwgRkFMU0UpOworCQkJICAgIGlmIChmdWxscGF0aF9lYnVmICE9IE5VTEwpCisJCQkgICAgeworCQkJCWZwID0gbWNoX2ZvcGVuKChjaGFyICopZnVsbHBhdGhfZWJ1ZiwgInIiKTsKKwkJCQlpZiAoZnAgIT0gTlVMTCkKKwkJCQl7CisJCQkJICAgIGlmIChTVFJMRU4oZnVsbHBhdGhfZWJ1ZikgPiBMU0laRSkKKwkJCQkJICBFTVNHMihfKCJFNDMwOiBUYWcgZmlsZSBwYXRoIHRydW5jYXRlZCBmb3IgJXNcbiIpLCBlYnVmKTsKKwkJCQkgICAgU1RSTkNQWSh0YWdfZm5hbWUsIGZ1bGxwYXRoX2VidWYsIExTSVpFKTsKKwkJCQkgICAgdGFnX2ZuYW1lW0xTSVpFXSA9IE5VTDsKKwkJCQkgICAgKytpbmNzdGFja19pZHg7CisJCQkJICAgIGlzX2V0YWcgPSAwOyAvKiB3ZSBjYW4gaW5jbHVkZSBhbnl0aGluZyAqLworCQkJCX0KKwkJCQl2aW1fZnJlZShmdWxscGF0aF9lYnVmKTsKKwkJCSAgICB9CisJCQkgICAgaWYgKGZwID09IE5VTEwpCisJCQkgICAgeworCQkJCS8qIENhbid0IG9wZW4gdGhlIGluY2x1ZGVkIGZpbGUsIHNraXAgaXQgYW5kCisJCQkJICogcmVzdG9yZSBvbGQgdmFsdWUgb2YgImZwIi4gKi8KKwkJCQlmcCA9IGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZnA7CisJCQkJdmltX2ZyZWUoaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCisJICAgIC8qCisJICAgICAqIFdoZW4gc3RpbGwgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBjaGVjayBmb3IgRW1hY3MgdGFncyBmaWxlCisJICAgICAqIGZvcm1hdCwgYW5kIGZvciAibm90IHNvcnRlZCIgZmxhZy4KKwkgICAgICovCisJICAgIGlmIChzdGF0ZSA9PSBUU19TVEFSVCkKKwkgICAgeworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKwkJLyoKKwkJICogV2hlbiB0aGVyZSBpcyBubyB0YWcgaGVhZCwgb3IgaWdub3JpbmcgY2FzZSwgbmVlZCB0byBkbyBhCisJCSAqIGxpbmVhciBzZWFyY2guCisJCSAqIFdoZW4gbm8gIiFfVEFHXyIgaXMgZm91bmQsIGRlZmF1bHQgdG8gYmluYXJ5IHNlYXJjaC4gIElmCisJCSAqIHRoZSB0YWcgZmlsZSBpc24ndCBzb3J0ZWQsIHRoZSBzZWNvbmQgbG9vcCB3aWxsIGZpbmQgaXQuCisJCSAqIFdoZW4gIiFfVEFHX0ZJTEVfU09SVEVEIiBmb3VuZDogc3RhcnQgYmluYXJ5IHNlYXJjaCBpZgorCQkgKiBmbGFnIHNldC4KKwkJICogRm9yIGNzY29wZSwgaXQncyBhbHdheXMgbGluZWFyLgorCQkgKi8KKyMgaWZkZWYgRkVBVF9DU0NPUEUKKwkJaWYgKGxpbmVhciB8fCB1c2VfY3Njb3BlKQorIyBlbHNlCisJCWlmIChsaW5lYXIpCisjIGVuZGlmCisJCSAgICBzdGF0ZSA9IFRTX0xJTkVBUjsKKwkJZWxzZSBpZiAoU1RSTkNNUChsYnVmLCAiIV9UQUdfIiwgNikgPiAwKQorCQkgICAgc3RhdGUgPSBUU19CSU5BUlk7CisJCWVsc2UgaWYgKFNUUk5DTVAobGJ1ZiwgIiFfVEFHX0ZJTEVfU09SVEVEXHQiLCAxOCkgPT0gMCkKKwkJeworCQkgICAgLyogQ2hlY2sgc29ydGVkIGZsYWcgKi8KKwkJICAgIGlmIChsYnVmWzE4XSA9PSAnMScpCisJCQlzdGF0ZSA9IFRTX0JJTkFSWTsKKwkJICAgIGVsc2UgaWYgKGxidWZbMThdID09ICcyJykKKwkJICAgIHsKKwkJCXN0YXRlID0gVFNfQklOQVJZOworCQkJc29ydGljID0gVFJVRTsKKwkJCXBhdHMtPnJlZ21hdGNoLnJtX2ljID0gKHBfaWMgfHwgIW5vaWMpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJc3RhdGUgPSBUU19MSU5FQVI7CisJCX0KKworCQlpZiAoc3RhdGUgPT0gVFNfQklOQVJZICYmIHBhdHMtPnJlZ21hdGNoLnJtX2ljICYmICFzb3J0aWMpCisJCXsKKwkJICAgIC8qIGJpbmFyeSBzZWFyY2ggd29uJ3Qgd29yayBmb3IgaWdub3JpbmcgY2FzZSwgdXNlIGxpbmVhcgorCQkgICAgICogc2VhcmNoLiAqLworCQkgICAgbGluZWFyID0gVFJVRTsKKwkJICAgIHN0YXRlID0gVFNfTElORUFSOworCQl9CisjZWxzZQorCQlzdGF0ZSA9IFRTX0xJTkVBUjsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9UQUdfQklOUworCQkvKgorCQkgKiBXaGVuIHN0YXJ0aW5nIGEgYmluYXJ5IHNlYXJjaCwgZ2V0IHRoZSBzaXplIG9mIHRoZSBmaWxlIGFuZAorCQkgKiBjb21wdXRlIHRoZSBmaXJzdCBvZmZzZXQuCisJCSAqLworCQlpZiAoc3RhdGUgPT0gVFNfQklOQVJZKQorCQl7CisJCSAgICAvKiBHZXQgdGhlIHRhZyBmaWxlIHNpemUgKGRvbid0IHVzZSBtY2hfZnN0YXQoKSwgaXQncyBub3QKKwkJICAgICAqIHBvcnRhYmxlKS4gKi8KKwkJICAgIGlmICgoZmlsZXNpemUgPSBsc2VlayhmaWxlbm8oZnApLAorCQkJCQkJICAgKG9mZl90KTBMLCBTRUVLX0VORCkpIDw9IDApCisJCQlzdGF0ZSA9IFRTX0xJTkVBUjsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWxzZWVrKGZpbGVubyhmcCksIChvZmZfdCkwTCwgU0VFS19TRVQpOworCisJCQkvKiBDYWxjdWxhdGUgdGhlIGZpcnN0IHJlYWQgb2Zmc2V0IGluIHRoZSBmaWxlLiAgU3RhcnQKKwkJCSAqIHRoZSBzZWFyY2ggaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmlsZS4gKi8KKwkJCXNlYXJjaF9pbmZvLmxvd19vZmZzZXQgPSAwOworCQkJc2VhcmNoX2luZm8ubG93X2NoYXIgPSAwOworCQkJc2VhcmNoX2luZm8uaGlnaF9vZmZzZXQgPSBmaWxlc2l6ZTsKKwkJCXNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0ID0gMDsKKwkJCXNlYXJjaF9pbmZvLmhpZ2hfY2hhciA9IDB4ZmY7CisJCSAgICB9CisJCSAgICBjb250aW51ZTsKKwkJfQorI2VuZGlmCisJICAgIH0KKworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGxidWZbMF0gPT0gJyEnICYmIHBhdHMgPT0gJm9yZ3BhdAorCQkJICAgJiYgU1RSTkNNUChsYnVmLCAiIV9UQUdfRklMRV9FTkNPRElOR1x0IiwgMjApID09IDApCisJICAgIHsKKwkJLyogQ29udmVydCB0aGUgc2VhcmNoIHBhdHRlcm4gZnJvbSAnZW5jb2RpbmcnIHRvIHRoZQorCQkgKiBzcGVjaWZpZWQgZW5jb2RpbmcuICovCisJCWZvciAocCA9IGxidWYgKyAyMDsgKnAgPiAnICcgJiYgKnAgPCAxMjc7ICsrcCkKKwkJICAgIDsKKwkJKnAgPSBOVUw7CisJCWNvbnZlcnRfc2V0dXAoJnZpbWNvbnYsIHBfZW5jLCBsYnVmICsgMjApOworCQlpZiAodmltY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkJeworCQkgICAgY29udnBhdC5wYXQgPSBzdHJpbmdfY29udmVydCgmdmltY29udiwgcGF0cy0+cGF0LCBOVUxMKTsKKwkJICAgIGlmIChjb252cGF0LnBhdCAhPSBOVUxMKQorCQkgICAgeworCQkJcGF0cyA9ICZjb252cGF0OworCQkJcGF0cy0+bGVuID0gKGludClTVFJMRU4ocGF0cy0+cGF0KTsKKwkJCXByZXBhcmVfcGF0cyhwYXRzLCBoYXNfcmUpOworCQkJcGF0cy0+cmVnbWF0Y2gucm1faWMgPSBvcmdwYXQucmVnbWF0Y2gucm1faWM7CisJCSAgICB9CisJCX0KKworCQkvKiBQcmVwYXJlIGZvciBjb252ZXJ0aW5nIGEgbWF0Y2ggdGhlIG90aGVyIHdheSBhcm91bmQuICovCisJCWNvbnZlcnRfc2V0dXAoJnZpbWNvbnYsIGxidWYgKyAyMCwgcF9lbmMpOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgLyoKKwkgICAgICogRmlndXJlIG91dCB3aGVyZSB0aGUgZGlmZmVyZW50IHN0cmluZ3MgYXJlIGluIHRoaXMgbGluZS4KKwkgICAgICogRm9yICJub3JtYWwiIHRhZ3M6IERvIGEgcXVpY2sgY2hlY2sgaWYgdGhlIHRhZyBtYXRjaGVzLgorCSAgICAgKiBUaGlzIHNwZWVkcyB1cCB0YWcgc2VhcmNoaW5nIGEgbG90IQorCSAgICAgKi8KKwkgICAgaWYgKHBhdHMtPmhlYWRsZW4KKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkJCSAgICAmJiAhaXNfZXRhZworI2VuZGlmCisJCQkJCSkKKwkgICAgeworCQl0YWdwLnRhZ25hbWUgPSBsYnVmOworI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJCXRhZ3AudGFnbmFtZV9lbmQgPSBza2lwdG93aGl0ZShsYnVmKTsKKwkJaWYgKCp0YWdwLnRhZ25hbWVfZW5kID09IE5VTCkJICAgIC8qIGNvcnJ1cHRlZCB0YWcgbGluZSAqLworI2Vsc2UKKwkJdGFncC50YWduYW1lX2VuZCA9IHZpbV9zdHJjaHIobGJ1ZiwgVEFCKTsKKwkJaWYgKHRhZ3AudGFnbmFtZV9lbmQgPT0gTlVMTCkJICAgIC8qIGNvcnJ1cHRlZCB0YWcgbGluZSAqLworI2VuZGlmCisJCXsKKwkJICAgIGxpbmVfZXJyb3IgPSBUUlVFOworCQkgICAgYnJlYWs7CisJCX0KKworI2lmZGVmIEZFQVRfVEFHX09MRFNUQVRJQworCQkvKgorCQkgKiBDaGVjayBmb3Igb2xkIHN0eWxlIHN0YXRpYyB0YWc6ICJmaWxlOnRhZyBmaWxlIC4uIgorCQkgKi8KKwkJdGFncC5mbmFtZSA9IE5VTEw7CisJCWZvciAocCA9IGxidWY7IHAgPCB0YWdwLnRhZ25hbWVfZW5kOyArK3ApCisJCXsKKwkJICAgIGlmICgqcCA9PSAnOicpCisJCSAgICB7CisJCQlpZiAodGFncC5mbmFtZSA9PSBOVUxMKQorI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJCQkgICAgdGFncC5mbmFtZSA9IHNraXB3aGl0ZSh0YWdwLnRhZ25hbWVfZW5kKTsKKyNlbHNlCisJCQkgICAgdGFncC5mbmFtZSA9IHRhZ3AudGFnbmFtZV9lbmQgKyAxOworI2VuZGlmCisJCQlpZiAoCSAgIGZuYW1lbmNtcChsYnVmLCB0YWdwLmZuYW1lLCBwIC0gbGJ1ZikgPT0gMAorI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJCQkJJiYgdmltX2lzd2hpdGUodGFncC5mbmFtZVtwIC0gbGJ1Zl0pCisjZWxzZQorCQkJCSYmIHRhZ3AuZm5hbWVbcCAtIGxidWZdID09IFRBQgorI2VuZGlmCisJCQkJICAgICkKKwkJCXsKKwkJCSAgICAvKiBmb3VuZCBvbmUgKi8KKwkJCSAgICB0YWdwLnRhZ25hbWUgPSBwICsgMTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogU2tpcCB0aGlzIGxpbmUgaWYgdGhlIGxlbmd0aCBvZiB0aGUgdGFnIGlzIGRpZmZlcmVudCBhbmQKKwkJICogdGhlcmUgaXMgbm8gcmVnZXhwLCBvciB0aGUgdGFnIGlzIHRvbyBzaG9ydC4KKwkJICovCisJCWNtcGxlbiA9IChpbnQpKHRhZ3AudGFnbmFtZV9lbmQgLSB0YWdwLnRhZ25hbWUpOworCQlpZiAocF90bCAhPSAwICYmIGNtcGxlbiA+IHBfdGwpCSAgICAvKiBhZGp1c3QgZm9yICd0YWdsZW5ndGgnICovCisJCSAgICBjbXBsZW4gPSBwX3RsOworCQlpZiAoaGFzX3JlICYmIHBhdHMtPmhlYWRsZW4gPCBjbXBsZW4pCisJCSAgICBjbXBsZW4gPSBwYXRzLT5oZWFkbGVuOworCQllbHNlIGlmIChzdGF0ZSA9PSBUU19MSU5FQVIgJiYgcGF0cy0+aGVhZGxlbiAhPSBjbXBsZW4pCisJCSAgICBjb250aW51ZTsKKworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKwkJaWYgKHN0YXRlID09IFRTX0JJTkFSWSkKKwkJeworCQkgICAgLyoKKwkJICAgICAqIFNpbXBsaXN0aWMgY2hlY2sgZm9yIHVuc29ydGVkIHRhZ3MgZmlsZS4KKwkJICAgICAqLworCQkgICAgaSA9IChpbnQpdGFncC50YWduYW1lWzBdOworCQkgICAgaWYgKHNvcnRpYykKKwkJCWkgPSAoaW50KVRPVVBQRVJfQVNDKHRhZ3AudGFnbmFtZVswXSk7CisJCSAgICBpZiAoaSA8IHNlYXJjaF9pbmZvLmxvd19jaGFyIHx8IGkgPiBzZWFyY2hfaW5mby5oaWdoX2NoYXIpCisJCQlzb3J0X2Vycm9yID0gVFJVRTsKKworCQkgICAgLyoKKwkJICAgICAqIENvbXBhcmUgdGhlIGN1cnJlbnQgdGFnIHdpdGggdGhlIHNlYXJjaGVkIHRhZy4KKwkJICAgICAqLworCQkgICAgaWYgKHNvcnRpYykKKwkJCXRhZ2NtcCA9IHRhZ19zdHJuaWNtcCh0YWdwLnRhZ25hbWUsIHBhdHMtPmhlYWQsCisJCQkJCQkJICAgICAgKHNpemVfdCljbXBsZW4pOworCQkgICAgZWxzZQorCQkJdGFnY21wID0gU1RSTkNNUCh0YWdwLnRhZ25hbWUsIHBhdHMtPmhlYWQsIGNtcGxlbik7CisKKwkJICAgIC8qCisJCSAgICAgKiBBIG1hdGNoIHdpdGggYSBzaG9ydGVyIHRhZyBtZWFucyB0byBzZWFyY2ggZm9yd2FyZC4KKwkJICAgICAqIEEgbWF0Y2ggd2l0aCBhIGxvbmdlciB0YWcgbWVhbnMgdG8gc2VhcmNoIGJhY2t3YXJkLgorCQkgICAgICovCisJCSAgICBpZiAodGFnY21wID09IDApCisJCSAgICB7CisJCQlpZiAoY21wbGVuIDwgcGF0cy0+aGVhZGxlbikKKwkJCSAgICB0YWdjbXAgPSAtMTsKKwkJCWVsc2UgaWYgKGNtcGxlbiA+IHBhdHMtPmhlYWRsZW4pCisJCQkgICAgdGFnY21wID0gMTsKKwkJICAgIH0KKworCQkgICAgaWYgKHRhZ2NtcCA9PSAwKQorCQkgICAgeworCQkJLyogV2UndmUgbG9jYXRlZCB0aGUgdGFnLCBub3cgc2tpcCBiYWNrIGFuZCBzZWFyY2gKKwkJCSAqIGZvcndhcmQgdW50aWwgdGhlIGZpcnN0IG1hdGNoaW5nIHRhZyBpcyBmb3VuZC4KKwkJCSAqLworCQkJc3RhdGUgPSBUU19TS0lQX0JBQ0s7CisJCQlzZWFyY2hfaW5mby5tYXRjaF9vZmZzZXQgPSBzZWFyY2hfaW5mby5jdXJyX29mZnNldDsKKwkJCWNvbnRpbnVlOworCQkgICAgfQorCQkgICAgaWYgKHRhZ2NtcCA8IDApCisJCSAgICB7CisJCQlzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9IGZ0ZWxsKGZwKTsKKwkJCWlmIChzZWFyY2hfaW5mby5jdXJyX29mZnNldCA8IHNlYXJjaF9pbmZvLmhpZ2hfb2Zmc2V0KQorCQkJeworCQkJICAgIHNlYXJjaF9pbmZvLmxvd19vZmZzZXQgPSBzZWFyY2hfaW5mby5jdXJyX29mZnNldDsKKwkJCSAgICBpZiAoc29ydGljKQorCQkJCXNlYXJjaF9pbmZvLmxvd19jaGFyID0KKwkJCQkJCSBUT1VQUEVSX0FTQyh0YWdwLnRhZ25hbWVbMF0pOworCQkJICAgIGVsc2UKKwkJCQlzZWFyY2hfaW5mby5sb3dfY2hhciA9IHRhZ3AudGFnbmFtZVswXTsKKwkJCSAgICBjb250aW51ZTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGlmICh0YWdjbXAgPiAwCisJCQkmJiBzZWFyY2hfaW5mby5jdXJyX29mZnNldCAhPSBzZWFyY2hfaW5mby5oaWdoX29mZnNldCkKKwkJICAgIHsKKwkJCXNlYXJjaF9pbmZvLmhpZ2hfb2Zmc2V0ID0gc2VhcmNoX2luZm8uY3Vycl9vZmZzZXQ7CisJCQlpZiAoc29ydGljKQorCQkJICAgIHNlYXJjaF9pbmZvLmhpZ2hfY2hhciA9CisJCQkJCQkgVE9VUFBFUl9BU0ModGFncC50YWduYW1lWzBdKTsKKwkJCWVsc2UKKwkJCSAgICBzZWFyY2hfaW5mby5oaWdoX2NoYXIgPSB0YWdwLnRhZ25hbWVbMF07CisJCQljb250aW51ZTsKKwkJICAgIH0KKworCQkgICAgLyogTm8gbWF0Y2ggeWV0IGFuZCBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgYmluYXJ5IHNlYXJjaC4gKi8KKwkJICAgIGJyZWFrOworCQl9CisJCWVsc2UgaWYgKHN0YXRlID09IFRTX1NLSVBfQkFDSykKKwkJeworCQkgICAgaWYgKE1CX1NUUk5JQ01QKHRhZ3AudGFnbmFtZSwgcGF0cy0+aGVhZCwgY21wbGVuKSAhPSAwKQorCQkJc3RhdGUgPSBUU19TVEVQX0ZPUldBUkQ7CisJCSAgICBlbHNlCisJCQkvKiBIYXZlIHRvIHNraXAgYmFjayBtb3JlLiAgUmVzdG9yZSB0aGUgY3Vycl9vZmZzZXQKKwkJCSAqIHVzZWQsIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgYXQgYSBsb25nIGxpbmUuICovCisJCQlzZWFyY2hfaW5mby5jdXJyX29mZnNldCA9IHNlYXJjaF9pbmZvLmN1cnJfb2Zmc2V0X3VzZWQ7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChzdGF0ZSA9PSBUU19TVEVQX0ZPUldBUkQpCisJCXsKKwkJICAgIGlmIChNQl9TVFJOSUNNUCh0YWdwLnRhZ25hbWUsIHBhdHMtPmhlYWQsIGNtcGxlbikgIT0gMCkKKwkJICAgIHsKKwkJCWlmICgob2ZmX3QpZnRlbGwoZnApID4gc2VhcmNoX2luZm8ubWF0Y2hfb2Zmc2V0KQorCQkJICAgIGJyZWFrOwkvKiBwYXN0IGxhc3QgbWF0Y2ggKi8KKwkJCWVsc2UKKwkJCSAgICBjb250aW51ZTsJLyogYmVmb3JlIGZpcnN0IG1hdGNoICovCisJCSAgICB9CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCSAgICAvKiBza2lwIHRoaXMgbWF0Y2ggaWYgaXQgY2FuJ3QgbWF0Y2ggKi8KKwkJICAgIGlmIChNQl9TVFJOSUNNUCh0YWdwLnRhZ25hbWUsIHBhdHMtPmhlYWQsIGNtcGxlbikgIT0gMCkKKwkJICAgIGNvbnRpbnVlOworCisJCS8qCisJCSAqIENhbiBiZSBhIG1hdGNoaW5nIHRhZywgaXNvbGF0ZSB0aGUgZmlsZSBuYW1lIGFuZCBjb21tYW5kLgorCQkgKi8KKyNpZmRlZiBGRUFUX1RBR19PTERTVEFUSUMKKwkJaWYgKHRhZ3AuZm5hbWUgPT0gTlVMTCkKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJCSAgICB0YWdwLmZuYW1lID0gc2tpcHdoaXRlKHRhZ3AudGFnbmFtZV9lbmQpOworI2Vsc2UKKwkJICAgIHRhZ3AuZm5hbWUgPSB0YWdwLnRhZ25hbWVfZW5kICsgMTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJCXRhZ3AuZm5hbWVfZW5kID0gc2tpcHRvd2hpdGUodGFncC5mbmFtZSk7CisJCXRhZ3AuY29tbWFuZCA9IHNraXB3aGl0ZSh0YWdwLmZuYW1lX2VuZCk7CisJCWlmICgqdGFncC5jb21tYW5kID09IE5VTCkKKyNlbHNlCisJCXRhZ3AuZm5hbWVfZW5kID0gdmltX3N0cmNocih0YWdwLmZuYW1lLCBUQUIpOworCQl0YWdwLmNvbW1hbmQgPSB0YWdwLmZuYW1lX2VuZCArIDE7CisJCWlmICh0YWdwLmZuYW1lX2VuZCA9PSBOVUxMKQorI2VuZGlmCisJCSAgICBpID0gRkFJTDsKKwkJZWxzZQorCQkgICAgaSA9IE9LOworCSAgICB9CisJICAgIGVsc2UKKwkJaSA9IHBhcnNlX3RhZ19saW5lKGxidWYsCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJCQkJICAgICAgIGlzX2V0YWcsCisjZW5kaWYKKwkJCQkJICAgICAgICZ0YWdwKTsKKwkgICAgaWYgKGkgPT0gRkFJTCkKKwkgICAgeworCQlsaW5lX2Vycm9yID0gVFJVRTsKKwkJYnJlYWs7CisJICAgIH0KKworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCSAgICBpZiAoaXNfZXRhZykKKwkJdGFncC5mbmFtZSA9IGVidWY7CisjZW5kaWYKKwkgICAgLyoKKwkgICAgICogRmlyc3QgdHJ5IG1hdGNoaW5nIHdpdGggdGhlIHBhdHRlcm4gbGl0ZXJhbGx5IChhbHNvIHdoZW4gaXQgaXMKKwkgICAgICogYSByZWdleHApLgorCSAgICAgKi8KKwkgICAgY21wbGVuID0gKGludCkodGFncC50YWduYW1lX2VuZCAtIHRhZ3AudGFnbmFtZSk7CisJICAgIGlmIChwX3RsICE9IDAgJiYgY21wbGVuID4gcF90bCkJICAgIC8qIGFkanVzdCBmb3IgJ3RhZ2xlbmd0aCcgKi8KKwkJY21wbGVuID0gcF90bDsKKwkgICAgLyogaWYgdGFnIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCwgZG9uJ3QgdHJ5IGNvbXBhcmluZyAqLworCSAgICBpZiAocGF0cy0+bGVuICE9IGNtcGxlbikKKwkJbWF0Y2ggPSBGQUxTRTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChwYXRzLT5yZWdtYXRjaC5ybV9pYykKKwkJeworCQkgICAgbWF0Y2ggPSAoTUJfU1RSTklDTVAodGFncC50YWduYW1lLCBwYXRzLT5wYXQsIGNtcGxlbikgPT0gMCk7CisJCSAgICBpZiAobWF0Y2gpCisJCQltYXRjaF9ub19pYyA9IChTVFJOQ01QKHRhZ3AudGFnbmFtZSwgcGF0cy0+cGF0LAorCQkJCQkJCQljbXBsZW4pID09IDApOworCQl9CisJCWVsc2UKKwkJICAgIG1hdGNoID0gKFNUUk5DTVAodGFncC50YWduYW1lLCBwYXRzLT5wYXQsIGNtcGxlbikgPT0gMCk7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBIYXMgYSByZWdleHA6IEFsc28gZmluZCB0YWdzIG1hdGNoaW5nIHJlZ2V4cC4KKwkgICAgICovCisJICAgIG1hdGNoX3JlID0gRkFMU0U7CisJICAgIGlmICghbWF0Y2ggJiYgcGF0cy0+cmVnbWF0Y2gucmVncHJvZyAhPSBOVUxMKQorCSAgICB7CisJCWludAljYzsKKworCQljYyA9ICp0YWdwLnRhZ25hbWVfZW5kOworCQkqdGFncC50YWduYW1lX2VuZCA9IE5VTDsKKwkJbWF0Y2ggPSB2aW1fcmVnZXhlYygmcGF0cy0+cmVnbWF0Y2gsIHRhZ3AudGFnbmFtZSwgKGNvbG5yX1QpMCk7CisJCWlmIChtYXRjaCkKKwkJeworCQkgICAgbWF0Y2hvZmYgPSAoaW50KShwYXRzLT5yZWdtYXRjaC5zdGFydHBbMF0gLSB0YWdwLnRhZ25hbWUpOworCQkgICAgaWYgKHBhdHMtPnJlZ21hdGNoLnJtX2ljKQorCQkgICAgeworCQkJcGF0cy0+cmVnbWF0Y2gucm1faWMgPSBGQUxTRTsKKwkJCW1hdGNoX25vX2ljID0gdmltX3JlZ2V4ZWMoJnBhdHMtPnJlZ21hdGNoLCB0YWdwLnRhZ25hbWUsCisJCQkJCQkJCSAgKGNvbG5yX1QpMCk7CisJCQlwYXRzLT5yZWdtYXRjaC5ybV9pYyA9IFRSVUU7CisJCSAgICB9CisJCX0KKwkJKnRhZ3AudGFnbmFtZV9lbmQgPSBjYzsKKwkJbWF0Y2hfcmUgPSBUUlVFOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogSWYgYSBtYXRjaCBpcyBmb3VuZCwgYWRkIGl0IHRvIGdhX21hdGNoW10uCisJICAgICAqLworCSAgICBpZiAobWF0Y2gpCisJICAgIHsKKyNpZmRlZiBGRUFUX0NTQ09QRQorCQlpZiAodXNlX2NzY29wZSkKKwkJeworCQkgICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBvcmRlcmluZywgYWx3YXlzIHVzZSB0aGUgc2FtZSB0YWJsZS4gKi8KKwkJICAgIG10dCA9IE1UX0dMX09USDsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgLyogRGVjaWRlIGluIHdoaWNoIGFycmF5IHRvIHN0b3JlIHRoaXMgbWF0Y2guICovCisJCSAgICBpc19jdXJyZW50ID0gdGVzdF9mb3JfY3VycmVudCgKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkJCSAgICBpc19ldGFnLAorI2VuZGlmCisJCQkJICAgICB0YWdwLmZuYW1lLCB0YWdwLmZuYW1lX2VuZCwgdGFnX2ZuYW1lLAorCQkJCSAgICAgYnVmX2ZmbmFtZSk7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJCSAgICBpc19zdGF0aWMgPSBGQUxTRTsKKwkJICAgIGlmICghaXNfZXRhZykJLyogZW1hY3MgdGFncyBhcmUgbmV2ZXIgc3RhdGljICovCisjZW5kaWYKKwkJICAgIHsKKyNpZmRlZiBGRUFUX1RBR19PTERTVEFUSUMKKwkJCWlmICh0YWdwLnRhZ25hbWUgIT0gbGJ1ZikKKwkJCSAgICBpc19zdGF0aWMgPSBUUlVFOwkvKiBkZXRlY3RlZCBzdGF0aWMgdGFnIGJlZm9yZSAqLworCQkJZWxzZQorI2VuZGlmCisJCQkgICAgaXNfc3RhdGljID0gdGVzdF9mb3Jfc3RhdGljKCZ0YWdwKTsKKwkJICAgIH0KKworCQkgICAgLyogZGVjaWRlIGluIHdoaWNoIG9mIHRoZSBzaXh0ZWVuIHRhYmxlcyB0byBzdG9yZSB0aGlzCisJCSAgICAgKiBtYXRjaCAqLworCQkgICAgaWYgKGlzX3N0YXRpYykKKwkJICAgIHsKKwkJCWlmIChpc19jdXJyZW50KQorCQkJICAgIG10dCA9IE1UX1NUX0NVUjsKKwkJCWVsc2UKKwkJCSAgICBtdHQgPSBNVF9TVF9PVEg7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlpZiAoaXNfY3VycmVudCkKKwkJCSAgICBtdHQgPSBNVF9HTF9DVVI7CisJCQllbHNlCisJCQkgICAgbXR0ID0gTVRfR0xfT1RIOworCQkgICAgfQorCQkgICAgaWYgKHBhdHMtPnJlZ21hdGNoLnJtX2ljICYmICFtYXRjaF9ub19pYykKKwkJCW10dCArPSBNVF9JQ19PRkY7CisJCSAgICBpZiAobWF0Y2hfcmUpCisJCQltdHQgKz0gTVRfUkVfT0ZGOworCQl9CisKKwkJLyoKKwkJICogQWRkIHRoZSBmb3VuZCBtYXRjaCBpbiBnYV9tYXRjaFttdHRdLCBhdm9pZGluZyBkdXBsaWNhdGVzLgorCQkgKiBTdG9yZSB0aGUgaW5mbyB3ZSBuZWVkIGxhdGVyLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mCisJCSAqIHRhZ3Mgd2UgYXJlIGRlYWxpbmcgd2l0aC4KKwkJICovCisJCWlmIChnYV9ncm93KCZnYV9tYXRjaFttdHRdLCAxKSA9PSBPSykKKwkJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIGNoYXJfdQkqY29udl9saW5lID0gTlVMTDsKKwkJICAgIGNoYXJfdQkqbGJ1Zl9saW5lID0gbGJ1ZjsKKworCQkgICAgaWYgKHZpbWNvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCisJCSAgICB7CisJCQkvKiBDb252ZXJ0IHRoZSB0YWcgbGluZSBmcm9tIHRoZSBlbmNvZGluZyBvZiB0aGUgdGFncworCQkJICogZmlsZSB0byAnZW5jb2RpbmcnLiAgVGhlbiBwYXJzZSB0aGUgbGluZSBhZ2Fpbi4gKi8KKwkJCWNvbnZfbGluZSA9IHN0cmluZ19jb252ZXJ0KCZ2aW1jb252LCBsYnVmLCBOVUxMKTsKKwkJCWlmIChjb252X2xpbmUgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICBpZiAocGFyc2VfdGFnX2xpbmUoY29udl9saW5lLAorI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCQkJCQlpc19ldGFnLAorI2VuZGlmCisJCQkJCSZ0YWdwKSA9PSBPSykKKwkJCQlsYnVmX2xpbmUgPSBjb252X2xpbmU7CisJCQkgICAgZWxzZQorCQkJCS8qIGRvZXNuJ3Qgd29yaywgZ28gYmFjayB0byB1bmNvbnZlcnRlZCBsaW5lLiAqLworCQkJCSh2b2lkKXBhcnNlX3RhZ19saW5lKGxidWYsCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJCQkJCQkgICAgIGlzX2V0YWcsCisjZW5kaWYKKwkJCQkJCSAgICAgJnRhZ3ApOworCQkJfQorCQkgICAgfQorI2Vsc2UKKyMgZGVmaW5lIGxidWZfbGluZSBsYnVmCisjZW5kaWYKKwkJICAgIGlmIChoZWxwX29ubHkpCisJCSAgICB7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisjIGRlZmluZSBNTF9FWFRSQSAzCisjZWxzZQorIyBkZWZpbmUgTUxfRVhUUkEgMAorI2VuZGlmCisJCQkvKgorCQkJICogQXBwZW5kIHRoZSBoZWxwLWhldXJpc3RpYyBudW1iZXIgYWZ0ZXIgdGhlCisJCQkgKiB0YWduYW1lLCBmb3Igc29ydGluZyBpdCBsYXRlci4KKwkJCSAqLworCQkJKnRhZ3AudGFnbmFtZV9lbmQgPSBOVUw7CisJCQlsZW4gPSAoaW50KSh0YWdwLnRhZ25hbWVfZW5kIC0gdGFncC50YWduYW1lKTsKKwkJCW1mcCA9IChzdHJ1Y3QgbWF0Y2hfZm91bmQgKikKKwkJCQkgYWxsb2MoKGludClzaXplb2Yoc3RydWN0IG1hdGNoX2ZvdW5kKSArIGxlbgorCQkJCQkJCSAgICAgKyAxMCArIE1MX0VYVFJBKTsKKwkJCWlmIChtZnAgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICAvKiAibGVuIiBpbmNsdWRlcyB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSBOVUwsIGJ1dAorCQkJICAgICAqIG5vdCB0aGUgcHJpb3JpdHkuICovCisJCQkgICAgbWZwLT5sZW4gPSBsZW4gKyBNTF9FWFRSQSArIDE7CisjZGVmaW5lIE1MX0hFTFBfTEVOIDYKKwkJCSAgICBwID0gbWZwLT5tYXRjaDsKKwkJCSAgICBTVFJDUFkocCwgdGFncC50YWduYW1lKTsKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKwkJCSAgICBwW2xlbl0gPSAnQCc7CisJCQkgICAgU1RSQ1BZKHAgKyBsZW4gKyAxLCBoZWxwX2xhbmcpOworI2VuZGlmCisJCQkgICAgc3ByaW50ZigoY2hhciAqKXAgKyBsZW4gKyAxICsgTUxfRVhUUkEsICIlMDZkIiwKKwkJCQkgICAgaGVscF9oZXVyaXN0aWModGFncC50YWduYW1lLAorCQkJCQltYXRjaF9yZSA/IG1hdGNob2ZmIDogMCwgIW1hdGNoX25vX2ljKQorI2lmZGVmIEZFQVRfTVVMVElfTEFORworCQkJCSAgICArIGhlbHBfcHJpCisjZW5kaWYKKwkJCQkgICAgKTsKKwkJCX0KKwkJCSp0YWdwLnRhZ25hbWVfZW5kID0gVEFCOworCQkgICAgfQorCQkgICAgZWxzZSBpZiAobmFtZV9vbmx5KQorCQkgICAgeworCQkJaWYgKGdldF9pdF9hZ2FpbikKKwkJCXsKKwkJCSAgICBjaGFyX3UgKnRlbXBfZW5kID0gdGFncC5jb21tYW5kOworCisJCQkgICAgaWYgKCp0ZW1wX2VuZCA9PSAnLycpCisJCQkJd2hpbGUgKCp0ZW1wX2VuZCAmJiAqdGVtcF9lbmQgIT0gJ1xyJworCQkJCQkmJiAqdGVtcF9lbmQgIT0gJ1xuJworCQkJCQkmJiAqdGVtcF9lbmQgIT0gJyQnKQorCQkJCSAgICB0ZW1wX2VuZCsrOworCisJCQkgICAgaWYgKHRhZ3AuY29tbWFuZCArIDIgPCB0ZW1wX2VuZCkKKwkJCSAgICB7CisJCQkJbGVuID0gKGludCkodGVtcF9lbmQgLSB0YWdwLmNvbW1hbmQgLSAyKTsKKwkJCQltZnAgPSAoc3RydWN0IG1hdGNoX2ZvdW5kICopYWxsb2MoCisJCQkJCShpbnQpc2l6ZW9mKHN0cnVjdCBtYXRjaF9mb3VuZCkgKyBsZW4pOworCQkJCWlmIChtZnAgIT0gTlVMTCkKKwkJCQl7CisJCQkJICAgIG1mcC0+bGVuID0gbGVuICsgMTsgLyogaW5jbHVkZSB0aGUgTlVMICovCisJCQkJICAgIHAgPSBtZnAtPm1hdGNoOworCQkJCSAgICBTVFJOQ1BZKHAsIHRhZ3AuY29tbWFuZCArIDIsIGxlbik7CisJCQkJICAgIHBbbGVuXSA9IE5VTDsKKwkJCQl9CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCQltZnAgPSBOVUxMOworCQkJICAgIGdldF9pdF9hZ2FpbiA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIGxlbiA9IChpbnQpKHRhZ3AudGFnbmFtZV9lbmQgLSB0YWdwLnRhZ25hbWUpOworCQkJICAgIG1mcCA9IChzdHJ1Y3QgbWF0Y2hfZm91bmQgKilhbGxvYygKKwkJCQkgICAgICAgKGludClzaXplb2Yoc3RydWN0IG1hdGNoX2ZvdW5kKSArIGxlbik7CisJCQkgICAgaWYgKG1mcCAhPSBOVUxMKQorCQkJICAgIHsKKwkJCQltZnAtPmxlbiA9IGxlbiArIDE7IC8qIGluY2x1ZGUgdGhlIE5VTCAqLworCQkJCXAgPSBtZnAtPm1hdGNoOworCQkJCVNUUk5DUFkocCwgdGFncC50YWduYW1lLCBsZW4pOworCQkJCXBbbGVuXSA9IE5VTDsKKwkJCSAgICB9CisKKwkJCSAgICAvKiBpZiB3YW50ZWQsIHJlLXJlYWQgbGluZSB0byBnZXQgbG9uZyBmb3JtIHRvbyAqLworCQkJICAgIGlmIChTdGF0ZSAmIElOU0VSVCkKKwkJCQlnZXRfaXRfYWdhaW4gPSBwX3NmdDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIFNhdmUgdGhlIHRhZyBpbiBhIGJ1ZmZlci4KKwkJCSAqIEVtYWNzIHRhZzogPG10dD48dGFnX2ZuYW1lPjxOVUw+PGVidWY+PE5VTD48bGJ1Zj4KKwkJCSAqIG90aGVyIHRhZzogPG10dD48dGFnX2ZuYW1lPjxOVUw+PE5VTD48bGJ1Zj4KKwkJCSAqIHdpdGhvdXQgRW1hY3MgdGFnczogPG10dD48dGFnX2ZuYW1lPjxOVUw+PGxidWY+CisJCQkgKi8KKwkJCWxlbiA9IChpbnQpU1RSTEVOKHRhZ19mbmFtZSkgKyAoaW50KVNUUkxFTihsYnVmX2xpbmUpICsgMzsKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkJCWlmIChpc19ldGFnKQorCQkJICAgIGxlbiArPSAoaW50KVNUUkxFTihlYnVmKSArIDE7CisJCQllbHNlCisJCQkgICAgKytsZW47CisjZW5kaWYKKwkJCW1mcCA9IChzdHJ1Y3QgbWF0Y2hfZm91bmQgKilhbGxvYygKKwkJCQkgICAgICAgKGludClzaXplb2Yoc3RydWN0IG1hdGNoX2ZvdW5kKSArIGxlbik7CisJCQlpZiAobWZwICE9IE5VTEwpCisJCQl7CisJCQkgICAgbWZwLT5sZW4gPSBsZW47CisJCQkgICAgcCA9IG1mcC0+bWF0Y2g7CisJCQkgICAgcFswXSA9IG10dDsKKwkJCSAgICBTVFJDUFkocCArIDEsIHRhZ19mbmFtZSk7CisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJCQkgICAgLyogSWdub3JlIGRpZmZlcmVuY2VzIGluIHNsYXNoZXMsIGF2b2lkIGFkZGluZworCQkJICAgICAqIGJvdGggcGF0aC9maWxlIGFuZCBwYXRoXGZpbGUuICovCisJCQkgICAgc2xhc2hfYWRqdXN0KHAgKyAxKTsKKyNlbmRpZgorCQkJICAgIHMgPSBwICsgMSArIFNUUkxFTih0YWdfZm5hbWUpICsgMTsKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkJCSAgICBpZiAoaXNfZXRhZykKKwkJCSAgICB7CisJCQkJU1RSQ1BZKHMsIGVidWYpOworCQkJCXMgKz0gU1RSTEVOKGVidWYpICsgMTsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJCSpzKysgPSBOVUw7CisjZW5kaWYKKwkJCSAgICBTVFJDUFkocywgbGJ1Zl9saW5lKTsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgaWYgKG1mcCAhPSBOVUxMKQorCQkgICAgeworCQkJLyoKKwkJCSAqIERvbid0IGFkZCBpZGVudGljYWwgbWF0Y2hlcy4KKwkJCSAqIFRoaXMgY2FuIHRha2UgYSBsb3Qgb2YgdGltZSB3aGVuIGZpbmRpbmcgbWFueQorCQkJICogbWF0Y2hlcywgY2hlY2sgZm9yIENUUkwtQyBub3cgYW5kIHRoZW4uCisJCQkgKiBBZGQgYWxsIGNzY29wZSB0YWdzLCBiZWNhdXNlIHRoZXkgYXJlIGFsbCBsaXN0ZWQuCisJCQkgKi8KKyNpZmRlZiBGRUFUX0NTQ09QRQorCQkJaWYgKHVzZV9jc2NvcGUpCisJCQkgICAgaSA9IC0xOworCQkJZWxzZQorI2VuZGlmCisJCQkgIGZvciAoaSA9IGdhX21hdGNoW210dF0uZ2FfbGVuOyAtLWkgPj0gMCAmJiAhZ290X2ludDsgKQorCQkJICB7CisJCQkgICAgICBtZnAyID0gKChzdHJ1Y3QgbWF0Y2hfZm91bmQgKiopCisJCQkJCQkgIChnYV9tYXRjaFttdHRdLmdhX2RhdGEpKVtpXTsKKwkJCSAgICAgIGlmIChtZnAyLT5sZW4gPT0gbWZwLT5sZW4KKwkJCQkgICAgICAmJiB2aW1fbWVtY21wKG1mcDItPm1hdGNoLCBtZnAtPm1hdGNoLAorCQkJCQkJICAgICAgIChzaXplX3QpbWZwLT5sZW4pID09IDApCisJCQkJICBicmVhazsKKwkJCSAgICAgIGxpbmVfYnJlYWtjaGVjaygpOworCQkJICB9CisJCQlpZiAoaSA8IDApCisJCQl7CisJCQkgICAgKChzdHJ1Y3QgbWF0Y2hfZm91bmQgKiopKGdhX21hdGNoW210dF0uZ2FfZGF0YSkpCisJCQkJCSAgICAgICBbZ2FfbWF0Y2hbbXR0XS5nYV9sZW4rK10gPSBtZnA7CisJCQkgICAgZ2FfbWF0Y2hbbXR0XS5nYV9yb29tLS07CisJCQkgICAgKyttYXRjaF9jb3VudDsKKwkJCX0KKwkJCWVsc2UKKwkJCSAgICB2aW1fZnJlZShtZnApOworCQkgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIC8qIE5vdGU6IHRoaXMgbWFrZXMgdGhlIHZhbHVlcyBpbiAidGFncCIgaW52YWxpZCEgKi8KKwkJICAgIHZpbV9mcmVlKGNvbnZfbGluZSk7CisjZW5kaWYKKwkJfQorCQllbHNlICAgIC8qIE91dCBvZiBtZW1vcnkhIEp1c3QgZm9yZ2V0IGFib3V0IHRoZSByZXN0LiAqLworCQl7CisJCSAgICByZXR2YWwgPSBPSzsKKwkJICAgIHN0b3Bfc2VhcmNoaW5nID0gVFJVRTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKyNpZmRlZiBGRUFUX0NTQ09QRQorCSAgICBpZiAodXNlX2NzY29wZSAmJiBlb2YpCisJCWJyZWFrOworI2VuZGlmCisJfSAvKiBmb3JldmVyICovCisKKwlpZiAobGluZV9lcnJvcikKKwl7CisJICAgIEVNU0cyKF8oIkU0MzE6IEZvcm1hdCBlcnJvciBpbiB0YWdzIGZpbGUgXCIlc1wiIiksIHRhZ19mbmFtZSk7CisjaWZkZWYgRkVBVF9DU0NPUEUKKwkgICAgaWYgKCF1c2VfY3Njb3BlKQorI2VuZGlmCisJCUVNU0dOKF8oIkJlZm9yZSBieXRlICVsZCIpLCAobG9uZylmdGVsbChmcCkpOworCSAgICBzdG9wX3NlYXJjaGluZyA9IFRSVUU7CisJICAgIGxpbmVfZXJyb3IgPSBGQUxTRTsKKwl9CisKKyNpZmRlZiBGRUFUX0NTQ09QRQorCWlmICghdXNlX2NzY29wZSkKKyNlbmRpZgorCSAgICBmY2xvc2UoZnApOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCXdoaWxlIChpbmNzdGFja19pZHgpCisJeworCSAgICAtLWluY3N0YWNrX2lkeDsKKwkgICAgZmNsb3NlKGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZnApOworCSAgICB2aW1fZnJlZShpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUpOworCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAocGF0cyA9PSAmY29udnBhdCkKKwl7CisJICAgIC8qIEdvIGJhY2sgZnJvbSBjb252ZXJ0ZWQgcGF0dGVybiB0byBvcmlnaW5hbCBwYXR0ZXJuLiAqLworCSAgICB2aW1fZnJlZShwYXRzLT5wYXQpOworCSAgICB2aW1fZnJlZShwYXRzLT5yZWdtYXRjaC5yZWdwcm9nKTsKKwkgICAgb3JncGF0LnJlZ21hdGNoLnJtX2ljID0gcGF0cy0+cmVnbWF0Y2gucm1faWM7CisJICAgIHBhdHMgPSAmb3JncGF0OworCX0KKwlpZiAodmltY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgY29udmVydF9zZXR1cCgmdmltY29udiwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVEFHX0JJTlMKKwlpZiAoc29ydF9lcnJvcikKKwl7CisJICAgIEVNU0cyKF8oIkU0MzI6IFRhZ3MgZmlsZSBub3Qgc29ydGVkOiAlcyIpLCB0YWdfZm5hbWUpOworCSAgICBzb3J0X2Vycm9yID0gRkFMU0U7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFN0b3Agc2VhcmNoaW5nIGlmIHN1ZmZpY2llbnQgdGFncyBoYXZlIGJlZW4gZm91bmQuCisJICovCisJaWYgKG1hdGNoX2NvdW50ID49IG1pbmNvdW50KQorCXsKKwkgICAgcmV0dmFsID0gT0s7CisJICAgIHN0b3Bfc2VhcmNoaW5nID0gVFJVRTsKKwl9CisKKyNpZmRlZiBGRUFUX0NTQ09QRQorCWlmIChzdG9wX3NlYXJjaGluZyB8fCB1c2VfY3Njb3BlKQorI2Vsc2UKKwlpZiAoc3RvcF9zZWFyY2hpbmcpCisjZW5kaWYKKwkgICAgYnJlYWs7CisKKyAgICAgIH0gLyogZW5kIG9mIGZvci1lYWNoLWZpbGUgbG9vcCAqLworCisjaWZkZWYgRkVBVF9UQUdfQklOUworICAgICAgLyogc3RvcCBzZWFyY2hpbmcgd2hlbiBhbHJlYWR5IGRpZCBhIGxpbmVhciBzZWFyY2gsIG9yIHdoZW4KKyAgICAgICAqIFRBR19OT0lDIHVzZWQsIGFuZCAnaWdub3JlY2FzZScgbm90IHNldAorICAgICAgICogb3IgYWxyZWFkeSBkaWQgY2FzZS1pZ25vcmUgc2VhcmNoICovCisgICAgICBpZiAoc3RvcF9zZWFyY2hpbmcgfHwgbGluZWFyIHx8ICghcF9pYyAmJiBub2ljKSB8fCBwYXRzLT5yZWdtYXRjaC5ybV9pYykKKwkgIGJyZWFrOworIyBpZmRlZiBGRUFUX0NTQ09QRQorICAgICAgaWYgKHVzZV9jc2NvcGUpCisJICBicmVhazsKKyMgZW5kaWYKKyAgICAgIHBhdHMtPnJlZ21hdGNoLnJtX2ljID0gVFJVRTsJLyogdHJ5IGFub3RoZXIgdGltZSB3aGlsZSBpZ25vcmluZyBjYXNlICovCisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIXN0b3Bfc2VhcmNoaW5nKQorICAgIHsKKwlpZiAoIWRpZF9vcGVuICYmIHZlcmJvc2UpCS8qIG5ldmVyIG9wZW5lZCBhbnkgdGFncyBmaWxlICovCisJICAgIEVNU0coXygiRTQzMzogTm8gdGFncyBmaWxlIikpOworCXJldHZhbCA9IE9LOwkJLyogSXQncyBPSyBldmVuIHdoZW4gbm8gdGFnIGZvdW5kICovCisgICAgfQorCitmaW5kdGFnX2VuZDoKKyAgICB2aW1fZnJlZShsYnVmKTsKKyAgICB2aW1fZnJlZShwYXRzLT5yZWdtYXRjaC5yZWdwcm9nKTsKKyAgICB2aW1fZnJlZSh0YWdfZm5hbWUpOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworICAgIHZpbV9mcmVlKGVidWYpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIE1vdmUgdGhlIG1hdGNoZXMgZnJvbSB0aGUgZ2FfbWF0Y2hbXSBhcnJheXMgaW50byBvbmUgbGlzdCBvZgorICAgICAqIG1hdGNoZXMuICBXaGVuIHJldHZhbCA9PSBGQUlMLCBmcmVlIHRoZSBtYXRjaGVzLgorICAgICAqLworICAgIGlmIChyZXR2YWwgPT0gRkFJTCkKKwltYXRjaF9jb3VudCA9IDA7CisKKyAgICBpZiAobWF0Y2hfY291bnQgPiAwKQorCW1hdGNoZXMgPSAoY2hhcl91ICoqKWxhbGxvYygobG9uZ191KShtYXRjaF9jb3VudCAqIHNpemVvZihjaGFyX3UgKikpLAorCQkJCQkJCQkJVFJVRSk7CisgICAgZWxzZQorCW1hdGNoZXMgPSBOVUxMOworICAgIG1hdGNoX2NvdW50ID0gMDsKKyAgICBmb3IgKG10dCA9IDA7IG10dCA8IE1UX0NPVU5UOyArK210dCkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IGdhX21hdGNoW210dF0uZ2FfbGVuOyArK2kpCisJeworCSAgICBtZnAgPSAoKHN0cnVjdCBtYXRjaF9mb3VuZCAqKikoZ2FfbWF0Y2hbbXR0XS5nYV9kYXRhKSlbaV07CisJICAgIGlmIChtYXRjaGVzID09IE5VTEwpCisJCXZpbV9mcmVlKG1mcCk7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBUbyBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSBhZ2FpbiB3ZSB0dXJuIHRoZSBzdHJ1Y3QKKwkJICogbWF0Y2hfZm91bmQgaW50byBhIHN0cmluZy4gIEZvciBoZWxwIHRoZSBwcmlvcml0eSB3YXMgbm90CisJCSAqIGluY2x1ZGVkIGluIHRoZSBsZW5ndGguICovCisJCW1jaF9tZW1tb3ZlKG1mcCwgbWZwLT5tYXRjaCwKKwkJCSAoc2l6ZV90KShtZnAtPmxlbiArIChoZWxwX29ubHkgPyBNTF9IRUxQX0xFTiA6IDApKSk7CisJCW1hdGNoZXNbbWF0Y2hfY291bnQrK10gPSAoY2hhcl91ICopbWZwOworCSAgICB9CisJfQorCWdhX2NsZWFyKCZnYV9tYXRjaFttdHRdKTsKKyAgICB9CisKKyAgICAqbWF0Y2hlc3AgPSBtYXRjaGVzOworICAgICpudW1fbWF0Y2hlcyA9IG1hdGNoX2NvdW50OworCisgICAgY3VyYnVmLT5iX2hlbHAgPSBoZWxwX3NhdmU7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgdmltX2ZyZWUoc2F2ZWRfcGF0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGdhcnJheV9UIHRhZ19mbmFtZXMgPSBHQV9FTVBUWTsKK3N0YXRpYyB2b2lkIGZvdW5kX3RhZ2ZpbGVfY2IgX19BUkdTKChjaGFyX3UgKmZuYW1lKSk7CisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZmluZGluZyBhbGwgInRhZ3MiIGFuZCAidGFncy0/PyIgZmlsZXMgaW4KKyAqICdydW50aW1lcGF0aCcgZG9jIGRpcmVjdG9yaWVzLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZvdW5kX3RhZ2ZpbGVfY2IoZm5hbWUpCisgICAgY2hhcl91CSpmbmFtZTsKK3sKKyAgICBpZiAoZ2FfZ3JvdygmdGFnX2ZuYW1lcywgMSkgPT0gT0spCisgICAgeworCSgoY2hhcl91ICoqKSh0YWdfZm5hbWVzLmdhX2RhdGEpKVt0YWdfZm5hbWVzLmdhX2xlbisrXSA9CisJCQkJCQkJICAgdmltX3N0cnNhdmUoZm5hbWUpOworCS0tdGFnX2ZuYW1lcy5nYV9yb29tOworICAgIH0KK30KKworLyoKKyAqIEdldCB0aGUgbmV4dCBuYW1lIG9mIGEgdGFnIGZpbGUgZnJvbSB0aGUgdGFnIGZpbGUgbGlzdC4KKyAqIEZvciBoZWxwIGZpbGVzLCB1c2UgInRhZ3MiIGZpbGUgb25seS4KKyAqCisgKiBSZXR1cm4gRkFJTCBpZiBubyBtb3JlIHRhZyBmaWxlIG5hbWVzLCBPSyBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfdGFnZm5hbWUoZmlyc3QsIGJ1ZikKKyAgICBpbnQJCWZpcnN0OwkvKiBUUlVFIHdoZW4gZmlyc3QgZmlsZSBuYW1lIGlzIHdhbnRlZCAqLworICAgIGNoYXJfdQkqYnVmOwkvKiBwb2ludGVyIHRvIGJ1ZmZlciBvZiBNQVhQQVRITCBjaGFycyAqLworeworICAgIHN0YXRpYyB2b2lkCQkqc2VhcmNoX2N0eCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXJfdQkqbnAgPSBOVUxMOworICAgIHN0YXRpYyBpbnQJCWRpZF9maWxlZmluZF9pbml0OworICAgIHN0YXRpYyBpbnQJCWhmX2lkeCA9IDA7CisgICAgY2hhcl91CQkqZm5hbWUgPSBOVUxMOworICAgIGNoYXJfdQkJKnJfcHRyOworCisgICAgaWYgKGZpcnN0KQorICAgIHsKKwlpZiAoY3VyYnVmLT5iX2hlbHApCisJeworCSAgICAvKgorCSAgICAgKiBGb3IgYSBoZWxwIHdpbmRvdyBmaW5kICJkb2MvdGFncyIgYW5kICJkb2MvdGFncy0/PyIgaW4gYWxsCisJICAgICAqIGRpcmVjdG9yaWVzIGluICdydW50aW1lcGF0aCcuCisJICAgICAqLworCSAgICBnYV9jbGVhcl9zdHJpbmdzKCZ0YWdfZm5hbWVzKTsKKwkgICAgZ2FfaW5pdDIoJnRhZ19mbmFtZXMsIChpbnQpc2l6ZW9mKGNoYXJfdSAqKSwgMTApOworCSAgICBkb19pbl9ydW50aW1lcGF0aCgoY2hhcl91ICopCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisJCSAgICAiZG9jL3RhZ3MgZG9jL3RhZ3MtPz8iCisjZWxzZQorCQkgICAgImRvYy90YWdzIgorI2VuZGlmCisJCQkJCQkgICAgLCBUUlVFLCBmb3VuZF90YWdmaWxlX2NiKTsKKwkgICAgaGZfaWR4ID0gMDsKKwl9CisJZWxzZSBpZiAoKmN1cmJ1Zi0+Yl9wX3RhZ3MgIT0gTlVMKQorCSAgICBucCA9IGN1cmJ1Zi0+Yl9wX3RhZ3M7CisJZWxzZQorCSAgICBucCA9IHBfdGFnczsKKwl2aW1fZmluZGZpbGVfZnJlZV92aXNpdGVkKHNlYXJjaF9jdHgpOworCWRpZF9maWxlZmluZF9pbml0ID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGN1cmJ1Zi0+Yl9oZWxwKQorICAgIHsKKwlpZiAoaGZfaWR4ID49IHRhZ19mbmFtZXMuZ2FfbGVuKQorCXsKKwkgICAgLyogTm90IGZvdW5kIGluICdydW50aW1lcGF0aCcsIHVzZSAnaGVscGZpbGUnLCBpZiBpdCBleGlzdHMgYW5kCisJICAgICAqIHdhc24ndCB1c2VkIHlldCwgcmVwbGFjaW5nICJoZWxwLnR4dCIgd2l0aCAidGFncyIuICovCisJICAgIGlmIChoZl9pZHggPiB0YWdfZm5hbWVzLmdhX2xlbiB8fCAqcF9oZiA9PSBOVUwpCisJCXJldHVybiBGQUlMOworCSAgICArK2hmX2lkeDsKKwkgICAgU1RSQ1BZKGJ1ZiwgcF9oZik7CisJICAgIFNUUkNQWShnZXR0YWlsKGJ1ZiksICJ0YWdzIik7CisJfQorCWVsc2UKKwl7CisJICAgIFNUUk5DUFkoYnVmLCAoKGNoYXJfdSAqKikodGFnX2ZuYW1lcy5nYV9kYXRhKSlbaGZfaWR4KytdLCBNQVhQQVRITCk7CisJICAgIGJ1ZltNQVhQQVRITCAtIDFdID0gTlVMOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiB0cmllZCBhbHJlYWR5IChvciBib2d1cyBjYWxsKSAqLworCWlmIChucCA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKworCS8qCisJICogTG9vcCB1bnRpbCB3ZSBoYXZlIGZvdW5kIGEgZmlsZSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQuCisJICogVGhlcmUgYXJlIHR3byBzdGF0ZXM6CisJICogZGlkX2ZpbGVmaW5kX2luaXQgPT0gRkFMU0U6IHNldHVwIGZvciBuZXh0IHBhcnQgaW4gJ3RhZ3MnLgorCSAqIGRpZF9maWxlZmluZF9pbml0ID09IFRSVUU6IGZpbmQgbmV4dCBmaWxlIGluIHRoaXMgcGFydC4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKGRpZF9maWxlZmluZF9pbml0KQorCSAgICB7CisJCWZuYW1lID0gdmltX2ZpbmRmaWxlKHNlYXJjaF9jdHgpOworCQlpZiAoZm5hbWUgIT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCWRpZF9maWxlZmluZF9pbml0ID0gRkFMU0U7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWNoYXJfdSAgKmZpbGVuYW1lID0gTlVMTDsKKworCQkvKiBTdG9wIHdoZW4gdXNlZCBhbGwgcGFydHMgb2YgJ3RhZ3MnLiAqLworCQlpZiAoKm5wID09IE5VTCkKKwkJeworCQkgICAgdmltX2ZpbmRmaWxlX2NsZWFudXAoc2VhcmNoX2N0eCk7CisJCSAgICBzZWFyY2hfY3R4ID0gTlVMTDsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisKKwkJLyoKKwkJICogQ29weSBuZXh0IGZpbGUgbmFtZSBpbnRvIGJ1Zi4KKwkJICovCisJCWJ1ZlswXSA9IE5VTDsKKwkJKHZvaWQpY29weV9vcHRpb25fcGFydCgmbnAsIGJ1ZiwgTUFYUEFUSEwgLSAxLCAiICwiKTsKKworI2lmZGVmIEZFQVRfUEFUSF9FWFRSQQorCQlyX3B0ciA9IHZpbV9maW5kZmlsZV9zdG9wZGlyKGJ1Zik7CisjZWxzZQorCQlyX3B0ciA9IE5VTEw7CisjZW5kaWYKKwkJLyogbW92ZSB0aGUgZmlsZW5hbWUgb25lIGNoYXIgZm9yd2FyZCBhbmQgdHJ1bmNhdGUgdGhlCisJCSAqIGZpbGVwYXRoIHdpdGggYSBOVUwgKi8KKwkJZmlsZW5hbWUgPSBnZXR0YWlsKGJ1Zik7CisJCW1jaF9tZW1tb3ZlKGZpbGVuYW1lICsgMSwgZmlsZW5hbWUsIFNUUkxFTihmaWxlbmFtZSkgKyAxKTsKKwkJKmZpbGVuYW1lKysgPSBOVUw7CisKKwkJc2VhcmNoX2N0eCA9IHZpbV9maW5kZmlsZV9pbml0KGJ1ZiwgZmlsZW5hbWUsIHJfcHRyLCAxMDAsCisJCQlGQUxTRSwgLyogZG9uJ3QgZnJlZSB2aXNpdGVkIGxpc3QgKi8KKwkJCUZBTFNFLCAvKiB3ZSBzZWFyY2ggZm9yIGEgZmlsZSAqLworCQkJc2VhcmNoX2N0eCwgVFJVRSwgY3VyYnVmLT5iX2ZmbmFtZSk7CisJCWlmIChzZWFyY2hfY3R4ICE9IE5VTEwpCisJCSAgICBkaWRfZmlsZWZpbmRfaW5pdCA9IFRSVUU7CisJICAgIH0KKwl9CisJU1RSQ1BZKGJ1ZiwgZm5hbWUpOworCXZpbV9mcmVlKGZuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBQYXJzZSBvbmUgbGluZSBmcm9tIHRoZSB0YWdzIGZpbGUuIEZpbmQgc3RhcnQvZW5kIG9mIHRhZyBuYW1lLCBzdGFydC9lbmQgb2YKKyAqIGZpbGUgbmFtZSBhbmQgc3RhcnQgb2Ygc2VhcmNoIHBhdHRlcm4uCisgKgorICogSWYgaXNfZXRhZyBpcyBUUlVFLCB0YWdwLT5mbmFtZSBhbmQgdGFncC0+Zm5hbWVfZW5kIGFyZSBub3Qgc2V0LgorICoKKyAqIFJldHVybiBGQUlMIGlmIHRoZXJlIGlzIGEgZm9ybWF0IGVycm9yIGluIHRoaXMgbGluZSwgT0sgb3RoZXJ3aXNlLgorICovCisgICAgc3RhdGljIGludAorcGFyc2VfdGFnX2xpbmUobGJ1ZiwKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkJICAgIGlzX2V0YWcsCisjZW5kaWYKKwkJCSAgICAgIHRhZ3ApCisgICAgY2hhcl91CSpsYnVmOwkJLyogbGluZSB0byBiZSBwYXJzZWQgKi8KKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKyAgICBpbnQJCWlzX2V0YWc7CisjZW5kaWYKKyAgICB0YWdwdHJzX1QJKnRhZ3A7Cit7CisgICAgY2hhcl91CSpwOworCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgY2hhcl91CSpwXzdmOworCisgICAgaWYgKGlzX2V0YWcpCisgICAgeworCS8qCisJICogVGhlcmUgYXJlIHR3byBmb3JtYXRzIGZvciBhbiBlbWFjcyB0YWcgbGluZToKKwkgKiAxOiAgc3RydWN0IEVudkJhc2UgXj9FbnZCYXNlXkExMzksNDYyNworCSAqIDI6ICNkZWZpbmUJQVJQQl9XSUxEX1dPUkxEIF4/MTUzLDUxOTQKKwkgKi8KKwlwXzdmID0gdmltX3N0cmNocihsYnVmLCAweDdmKTsKKwlpZiAocF83ZiA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKworCS8qIEZpbmQgXkEuICBJZiBub3QgZm91bmQgdGhlIGxpbmUgbnVtYmVyIGlzIGFmdGVyIHRoZSAweDdmICovCisJcCA9IHZpbV9zdHJjaHIocF83ZiwgQ3RybF9BKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICBwID0gcF83ZiArIDE7CisJZWxzZQorCSAgICArK3A7CisKKwlpZiAoIVZJTV9JU0RJR0lUKCpwKSkJICAgIC8qIGNoZWNrIGZvciBzdGFydCBvZiBsaW5lIG51bWJlciAqLworCSAgICByZXR1cm4gRkFJTDsKKwl0YWdwLT5jb21tYW5kID0gcDsKKworCisJaWYgKHBbLTFdID09IEN0cmxfQSkJICAgIC8qIGZpcnN0IGZvcm1hdDogZXhwbGljaXQgdGFnbmFtZSBnaXZlbiAqLworCXsKKwkgICAgdGFncC0+dGFnbmFtZSA9IHBfN2YgKyAxOworCSAgICB0YWdwLT50YWduYW1lX2VuZCA9IHAgLSAxOworCX0KKwllbHNlCQkJICAgIC8qIHNlY29uZCBmb3JtYXQ6IGlzb2xhdGUgdGFnbmFtZSAqLworCXsKKwkgICAgLyogZmluZCBlbmQgb2YgdGFnbmFtZSAqLworCSAgICBmb3IgKHAgPSBwXzdmIC0gMTsgIXZpbV9pc3dvcmRjKCpwKTsgLS1wKQorCQlpZiAocCA9PSBsYnVmKQorCQkgICAgcmV0dXJuIEZBSUw7CisJICAgIHRhZ3AtPnRhZ25hbWVfZW5kID0gcCArIDE7CisJICAgIHdoaWxlIChwID49IGxidWYgJiYgdmltX2lzd29yZGMoKnApKQorCQktLXA7CisJICAgIHRhZ3AtPnRhZ25hbWUgPSBwICsgMTsKKwl9CisgICAgfQorICAgIGVsc2UJLyogbm90IGFuIEVtYWNzIHRhZyAqLworICAgIHsKKyNlbmRpZgorCS8qIElzb2xhdGUgdGhlIHRhZ25hbWUsIGZyb20gbGJ1ZiB1cCB0byB0aGUgZmlyc3Qgd2hpdGUgKi8KKwl0YWdwLT50YWduYW1lID0gbGJ1ZjsKKyNpZmRlZiBGRUFUX1RBR19BTllXSElURQorCXAgPSBza2lwdG93aGl0ZShsYnVmKTsKKyNlbHNlCisJcCA9IHZpbV9zdHJjaHIobGJ1ZiwgVEFCKTsKKwlpZiAocCA9PSBOVUxMKQorCSAgICByZXR1cm4gRkFJTDsKKyNlbmRpZgorCXRhZ3AtPnRhZ25hbWVfZW5kID0gcDsKKworCS8qIElzb2xhdGUgZmlsZSBuYW1lLCBmcm9tIGZpcnN0IHRvIHNlY29uZCB3aGl0ZSBzcGFjZSAqLworI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJcCA9IHNraXB3aGl0ZShwKTsKKyNlbHNlCisJaWYgKCpwICE9IE5VTCkKKwkgICAgKytwOworI2VuZGlmCisJdGFncC0+Zm5hbWUgPSBwOworI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJcCA9IHNraXB0b3doaXRlKHApOworI2Vsc2UKKwlwID0gdmltX3N0cmNocihwLCBUQUIpOworCWlmIChwID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworI2VuZGlmCisJdGFncC0+Zm5hbWVfZW5kID0gcDsKKworCS8qIGZpbmQgc3RhcnQgb2Ygc2VhcmNoIGNvbW1hbmQsIGFmdGVyIHNlY29uZCB3aGl0ZSBzcGFjZSAqLworI2lmZGVmIEZFQVRfVEFHX0FOWVdISVRFCisJcCA9IHNraXB3aGl0ZShwKTsKKyNlbHNlCisJaWYgKCpwICE9IE5VTCkKKwkgICAgKytwOworI2VuZGlmCisJaWYgKCpwID09IE5VTCkKKwkgICAgcmV0dXJuIEZBSUw7CisJdGFncC0+Y29tbWFuZCA9IHA7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0YWduYW1lIGlzIGEgc3RhdGljIHRhZworICoKKyAqIFN0YXRpYyB0YWdzIHByb2R1Y2VkIGJ5IHRoZSBvbGRlciBjdGFncyBwcm9ncmFtIGhhdmUgdGhlIGZvcm1hdDoKKyAqCSdmaWxlOnRhZyAgZmlsZSAgL3BhdHRlcm4nLgorICogVGhpcyBpcyBvbmx5IHJlY29nbml6ZWQgd2hlbiBib3RoIG9jY3VyZW5jZXMgb2YgJ2ZpbGUnIGFyZSB0aGUgc2FtZSwgdG8KKyAqIGF2b2lkIHJlY29nbml6aW5nICJzdHJpbmc6OnN0cmluZyIgb3IgIjpleGl0Ii4KKyAqCisgKiBTdGF0aWMgdGFncyBwcm9kdWNlZCBieSB0aGUgbmV3IGN0YWdzIHByb2dyYW0gaGF2ZSB0aGUgZm9ybWF0OgorICoJJ3RhZyAgZmlsZSAgL3BhdHRlcm4vOyI8VGFiPmZpbGU6JwkgICAgIgorICoKKyAqIFJldHVybiBUUlVFIGlmIGl0IGlzIGEgc3RhdGljIHRhZyBhbmQgYWRqdXN0ICp0YWduYW1lIHRvIHRoZSByZWFsIHRhZy4KKyAqIFJldHVybiBGQUxTRSBpZiBpdCBpcyBub3QgYSBzdGF0aWMgdGFnLgorICovCisgICAgc3RhdGljIGludAordGVzdF9mb3Jfc3RhdGljKHRhZ3ApCisgICAgdGFncHRyc19UCSp0YWdwOworeworICAgIGNoYXJfdQkqcDsKKworI2lmZGVmIEZFQVRfVEFHX09MRFNUQVRJQworICAgIGludAkJbGVuOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3Igb2xkIHN0eWxlIHN0YXRpYyB0YWc6ICJmaWxlOnRhZyBmaWxlIC4uIgorICAgICAqLworICAgIGxlbiA9IChpbnQpKHRhZ3AtPmZuYW1lX2VuZCAtIHRhZ3AtPmZuYW1lKTsKKyAgICBwID0gdGFncC0+dGFnbmFtZSArIGxlbjsKKyAgICBpZiAoICAgICAgIHAgPCB0YWdwLT50YWduYW1lX2VuZAorCSAgICAmJiAqcCA9PSAnOicKKwkgICAgJiYgZm5hbWVuY21wKHRhZ3AtPnRhZ25hbWUsIHRhZ3AtPmZuYW1lLCBsZW4pID09IDApCisgICAgeworCXRhZ3AtPnRhZ25hbWUgPSBwICsgMTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIG5ldyBzdHlsZSBzdGF0aWMgdGFnICI6Li4uPFRhYj5maWxlOls8VGFiPi4uLl0iCisgICAgICovCisgICAgcCA9IHRhZ3AtPmNvbW1hbmQ7CisgICAgd2hpbGUgKChwID0gdmltX3N0cmNocihwLCAnXHQnKSkgIT0gTlVMTCkKKyAgICB7CisJKytwOworCWlmIChTVFJOQ01QKHAsICJmaWxlOiIsIDUpID09IDApCisJICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFBhcnNlIGEgbGluZSBmcm9tIGEgbWF0Y2hpbmcgdGFnLiAgRG9lcyBub3QgY2hhbmdlIHRoZSBsaW5lIGl0c2VsZi4KKyAqCisgKiBUaGUgbGluZSB0aGF0IHdlIGdldCBsb29rcyBsaWtlIHRoaXM6CisgKiBFbWFjcyB0YWc6IDxtdHQ+PHRhZ19mbmFtZT48TlVMPjxlYnVmPjxOVUw+PGxidWY+CisgKiBvdGhlciB0YWc6IDxtdHQ+PHRhZ19mbmFtZT48TlVMPjxOVUw+PGxidWY+CisgKiB3aXRob3V0IEVtYWNzIHRhZ3M6IDxtdHQ+PHRhZ19mbmFtZT48TlVMPjxsYnVmPgorICoKKyAqIFJldHVybiBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorcGFyc2VfbWF0Y2gobGJ1ZiwgdGFncCkKKyAgICBjaGFyX3UJKmxidWY7CSAgICAvKiBpbnB1dDogbWF0Y2hpbmcgbGluZSAqLworICAgIHRhZ3B0cnNfVAkqdGFncDsJICAgIC8qIG91dHB1dDogcG9pbnRlcnMgaW50byB0aGUgbGluZSAqLworeworICAgIGludAkJcmV0dmFsOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnBjLCAqcHQ7CisKKyAgICB0YWdwLT50YWdfZm5hbWUgPSBsYnVmICsgMTsKKyAgICBsYnVmICs9IFNUUkxFTih0YWdwLT50YWdfZm5hbWUpICsgMjsKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKyAgICBpZiAoKmxidWYpCisgICAgeworCXRhZ3AtPmlzX2V0YWcgPSBUUlVFOworCXRhZ3AtPmZuYW1lID0gbGJ1ZjsKKwlsYnVmICs9IFNUUkxFTihsYnVmKTsKKwl0YWdwLT5mbmFtZV9lbmQgPSBsYnVmKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdGFncC0+aXNfZXRhZyA9IEZBTFNFOworCSsrbGJ1ZjsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZpbmQgc2VhcmNoIHBhdHRlcm4gYW5kIHRoZSBmaWxlIG5hbWUgZm9yIG5vbi1ldGFncy4gKi8KKyAgICByZXR2YWwgPSBwYXJzZV90YWdfbGluZShsYnVmLAorI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCQkJdGFncC0+aXNfZXRhZywKKyNlbmRpZgorCQkJdGFncCk7CisKKyAgICB0YWdwLT50YWdraW5kID0gTlVMTDsKKyAgICB0YWdwLT5jb21tYW5kX2VuZCA9IE5VTEw7CisKKyAgICBpZiAocmV0dmFsID09IE9LKQorICAgIHsKKwkvKiBUcnkgdG8gZmluZCBhIGtpbmQgZmllbGQ6ICJraW5kOjxraW5kPiIgb3IganVzdCAiPGtpbmQ+IiovCisJcCA9IHRhZ3AtPmNvbW1hbmQ7CisJaWYgKGZpbmRfZXh0cmEoJnApID09IE9LKQorCXsKKwkgICAgdGFncC0+Y29tbWFuZF9lbmQgPSBwOworCSAgICBwICs9IDI7CS8qIHNraXAgIjtcIiIgKi8KKwkgICAgaWYgKCpwKysgPT0gVEFCKQorCQl3aGlsZSAoQVNDSUlfSVNBTFBIQSgqcCkpCisJCXsKKwkJICAgIGlmIChTVFJOQ01QKHAsICJraW5kOiIsIDUpID09IDApCisJCSAgICB7CisJCQl0YWdwLT50YWdraW5kID0gcCArIDU7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIHBjID0gdmltX3N0cmNocihwLCAnOicpOworCQkgICAgcHQgPSB2aW1fc3RyY2hyKHAsICdcdCcpOworCQkgICAgaWYgKHBjID09IE5VTEwgfHwgKHB0ICE9IE5VTEwgJiYgcGMgPiBwdCkpCisJCSAgICB7CisJCQl0YWdwLT50YWdraW5kID0gcDsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgaWYgKHB0ID09IE5VTEwpCisJCQlicmVhazsKKwkJICAgIHAgPSBwdCArIDE7CisJCX0KKwl9CisJaWYgKHRhZ3AtPnRhZ2tpbmQgIT0gTlVMTCkKKwl7CisJICAgIGZvciAocCA9IHRhZ3AtPnRhZ2tpbmQ7CisJCQkgICAgKnAgJiYgKnAgIT0gJ1x0JyAmJiAqcCAhPSAnXHInICYmICpwICE9ICdcbic7ICsrcCkKKwkJOworCSAgICB0YWdwLT50YWdraW5kX2VuZCA9IHA7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRmluZCBvdXQgdGhlIGFjdHVhbCBmaWxlIG5hbWUgb2YgYSB0YWcuICBDb25jYXRlbmF0ZSB0aGUgdGFncyBmaWxlIG5hbWUKKyAqIHdpdGggdGhlIG1hdGNoaW5nIHRhZyBmaWxlIG5hbWUuCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgb3IgTlVMTCAob3V0IG9mIG1lbW9yeSkuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3RhZ19mdWxsX2ZuYW1lKHRhZ3ApCisgICAgdGFncHRyc19UCSp0YWdwOworeworICAgIGNoYXJfdQkqZnVsbG5hbWU7CisgICAgaW50CQljOworCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgaWYgKHRhZ3AtPmlzX2V0YWcpCisJYyA9IDA7CSAgICAvKiB0byBzaHV0IHVwIEdDQyAqLworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwljID0gKnRhZ3AtPmZuYW1lX2VuZDsKKwkqdGFncC0+Zm5hbWVfZW5kID0gTlVMOworICAgIH0KKyAgICBmdWxsbmFtZSA9IGV4cGFuZF90YWdfZm5hbWUodGFncC0+Zm5hbWUsIHRhZ3AtPnRhZ19mbmFtZSwgRkFMU0UpOworCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgaWYgKCF0YWdwLT5pc19ldGFnKQorI2VuZGlmCisJKnRhZ3AtPmZuYW1lX2VuZCA9IGM7CisKKyAgICByZXR1cm4gZnVsbG5hbWU7Cit9CisKKy8qCisgKiBKdW1wIHRvIGEgdGFnIHRoYXQgaGFzIGJlZW4gZm91bmQgaW4gb25lIG9mIHRoZSB0YWcgZmlsZXMKKyAqCisgKiByZXR1cm5zIE9LIGZvciBzdWNjZXNzLCBOT1RBR0ZJTEUgd2hlbiBmaWxlIG5vdCBmb3VuZCwgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitqdW1wdG9fdGFnKGxidWYsIGZvcmNlaXQsIGtlZXBfaGVscCkKKyAgICBjaGFyX3UJKmxidWY7CQkvKiBsaW5lIGZyb20gdGhlIHRhZ3MgZmlsZSBmb3IgdGhpcyB0YWcgKi8KKyAgICBpbnQJCWZvcmNlaXQ7CS8qIDp0YSB3aXRoICEgKi8KKyAgICBpbnQJCWtlZXBfaGVscDsJLyoga2VlcCBoZWxwIGZsYWcgKEZBTFNFIGZvciBjc2NvcGUpICovCit7CisgICAgaW50CQlzYXZlX3NlY3VyZTsKKyAgICBpbnQJCXNhdmVfbWFnaWM7CisgICAgaW50CQlzYXZlX3Bfd3MsIHNhdmVfcF9zY3MsIHNhdmVfcF9pYzsKKyAgICBsaW5lbnJfVAlzYXZlX2xudW07CisgICAgaW50CQljc2F2ZSA9IDA7CisgICAgY2hhcl91CSpzdHI7CisgICAgY2hhcl91CSpwYnVmOwkJCS8qIHNlYXJjaCBwYXR0ZXJuIGJ1ZmZlciAqLworICAgIGNoYXJfdQkqcGJ1Zl9lbmQ7CisgICAgY2hhcl91CSp0b2ZyZWVfZm5hbWUgPSBOVUxMOworICAgIGNoYXJfdQkqZm5hbWU7CisgICAgdGFncHRyc19UCXRhZ3A7CisgICAgaW50CQlyZXR2YWwgPSBGQUlMOworICAgIGludAkJZ2V0ZmlsZV9yZXN1bHQ7CisgICAgaW50CQlzZWFyY2hfb3B0aW9uczsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIGludAkJc2F2ZV9ub19obHNlYXJjaDsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgd2luX1QJKmN1cndpbl9zYXZlID0gTlVMTDsKKyNlbmRpZgorICAgIGNoYXJfdQkqZnVsbF9mbmFtZSA9IE5VTEw7CisjaWZkZWYgRkVBVF9GT0xESU5HCisgICAgaW50CQlvbGRfS2V5VHlwZWQgPSBLZXlUeXBlZDsgICAgLyogZ2V0dGluZyB0aGUgZmlsZSBtYXkgcmVzZXQgaXQgKi8KKyNlbmRpZgorCisgICAgcGJ1ZiA9IGFsbG9jKExTSVpFKTsKKworICAgIC8qIHBhcnNlIHRoZSBtYXRjaCBsaW5lIGludG8gdGhlIHRhZ3Agc3RydWN0dXJlICovCisgICAgaWYgKHBidWYgPT0gTlVMTCB8fCBwYXJzZV9tYXRjaChsYnVmLCAmdGFncCkgPT0gRkFJTCkKKyAgICB7CisJdGFncC5mbmFtZV9lbmQgPSBOVUxMOworCWdvdG8gZXJyZXQ7CisgICAgfQorCisgICAgLyogdHJ1bmNhdGUgdGhlIGZpbGUgbmFtZSwgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBzdHJpbmcgKi8KKyAgICBjc2F2ZSA9ICp0YWdwLmZuYW1lX2VuZDsKKyAgICAqdGFncC5mbmFtZV9lbmQgPSBOVUw7CisgICAgZm5hbWUgPSB0YWdwLmZuYW1lOworCisgICAgLyogY29weSB0aGUgY29tbWFuZCB0byBwYnVmW10sIHJlbW92ZSB0cmFpbGluZyBDUi9OTCAqLworICAgIHN0ciA9IHRhZ3AuY29tbWFuZDsKKyAgICBmb3IgKHBidWZfZW5kID0gcGJ1ZjsgKnN0ciAmJiAqc3RyICE9ICdcbicgJiYgKnN0ciAhPSAnXHInOyApCisgICAgeworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCWlmICh0YWdwLmlzX2V0YWcgJiYgKnN0ciA9PSAnLCcpLyogc3RvcCBhdCAnLCcgYWZ0ZXIgbGluZSBudW1iZXIgKi8KKwkgICAgYnJlYWs7CisjZW5kaWYKKwkqcGJ1Zl9lbmQrKyA9ICpzdHIrKzsKKyAgICB9CisgICAgKnBidWZfZW5kID0gTlVMOworCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisgICAgaWYgKCF0YWdwLmlzX2V0YWcpCisjZW5kaWYKKyAgICB7CisJLyoKKwkgKiBSZW1vdmUgdGhlICI8VGFiPmZpZWxkbmFtZTp2YWx1ZSIgc3R1ZmY7IHdlIGRvbid0IG5lZWQgaXQgaGVyZS4KKwkgKi8KKwlzdHIgPSBwYnVmOworCWlmIChmaW5kX2V4dHJhKCZzdHIpID09IE9LKQorCXsKKwkgICAgcGJ1Zl9lbmQgPSBzdHI7CisJICAgICpwYnVmX2VuZCA9IE5VTDsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFeHBhbmQgZmlsZSBuYW1lLCB3aGVuIG5lZWRlZCAoZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcykuCisgICAgICogSWYgJ3RhZ3JlbGF0aXZlJyBvcHRpb24gc2V0LCBtYXkgY2hhbmdlIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBmbmFtZSA9IGV4cGFuZF90YWdfZm5hbWUoZm5hbWUsIHRhZ3AudGFnX2ZuYW1lLCBUUlVFKTsKKyAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwlnb3RvIGVycmV0OworICAgIHRvZnJlZV9mbmFtZSA9IGZuYW1lOwkvKiBmcmVlKCkgaXQgbGF0ZXIgKi8KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGZpbGUgd2l0aCB0aGUgdGFnIGV4aXN0cyBiZWZvcmUgYWJhbmRvbmluZyB0aGUgY3VycmVudAorICAgICAqIGZpbGUuICBBbHNvIGFjY2VwdCBhIGZpbGUgbmFtZSBmb3Igd2hpY2ggdGhlcmUgaXMgYSBtYXRjaGluZyBCdWZSZWFkQ21kCisgICAgICogYXV0b2NvbW1hbmQgZXZlbnQgKGUuZy4sIGh0dHA6Ly9zeXMvZmlsZSkuCisgICAgICovCisgICAgaWYgKG1jaF9nZXRwZXJtKGZuYW1lKSA8IDAKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgJiYgIWhhc19hdXRvY21kKEVWRU5UX0JVRlJFQURDTUQsIGZuYW1lKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKwlyZXR2YWwgPSBOT1RBR0ZJTEU7CisJdmltX2ZyZWUobm9maWxlX2ZuYW1lKTsKKwlub2ZpbGVfZm5hbWUgPSB2aW1fc3Ryc2F2ZShmbmFtZSk7CisJaWYgKG5vZmlsZV9mbmFtZSA9PSBOVUxMKQorCSAgICBub2ZpbGVfZm5hbWUgPSBlbXB0eV9vcHRpb247CisJZ290byBlcnJldDsKKyAgICB9CisKKyAgICArK1JlZHJhd2luZ0Rpc2FibGVkOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorICAgIGlmIChnX2RvX3RhZ3ByZXZpZXcpCisgICAgeworCS8qIGRvbid0IHNwbGl0IGFnYWluIGJlbG93ICovCisJcG9zdHBvbmVkX3NwbGl0ID0gMDsKKwkvKiBTYXZlIGN1cnJlbnQgd2luZG93ICovCisJY3Vyd2luX3NhdmUgPSBjdXJ3aW47CisJLyoKKwkgKiBJZiB3ZSBhcmUgcmV1c2luZyBhIHdpbmRvdywgd2UgbWF5IGNoYW5nZSBkaXIgd2hlbgorCSAqIGVudGVyaW5nIGl0IChhdXRvY29tbWFuZHMpIHNvIHR1cm4gdGhlIHRhZyBmaWxlbmFtZQorCSAqIGludG8gYSBmdWxscGF0aAorCSAqLworCWlmICghY3Vyd2luLT53X3BfcHZ3KQorCXsKKwkgICAgZnVsbF9mbmFtZSA9IEZ1bGxOYW1lX3NhdmUoZm5hbWUsIEZBTFNFKTsKKwkgICAgZm5hbWUgPSBmdWxsX2ZuYW1lOworCisJICAgIC8qCisJICAgICAqIE1ha2UgdGhlIHByZXZpZXcgd2luZG93IHRoZSBjdXJyZW50IHdpbmRvdy4KKwkgICAgICogT3BlbiBhIHByZXZpZXcgd2luZG93IHdoZW4gbmVlZGVkLgorCSAgICAgKi8KKwkgICAgcHJlcGFyZV90YWdwcmV2aWV3KCk7CisJfQorICAgIH0KKworICAgIC8qIGlmIGl0IHdhcyBhIENUUkwtVyBDVFJMLV0gY29tbWFuZCBzcGxpdCB3aW5kb3cgbm93ICovCisgICAgaWYgKHBvc3Rwb25lZF9zcGxpdCkKKyAgICB7CisJd2luX3NwbGl0KHBvc3Rwb25lZF9zcGxpdCA+IDAgPyBwb3N0cG9uZWRfc3BsaXQgOiAwLAorCQkJCQkJICAgICAgIHBvc3Rwb25lZF9zcGxpdF9mbGFncyk7CisjIGlmZGVmIEZFQVRfU0NST0xMQklORAorCWN1cndpbi0+d19wX3NjYiA9IEZBTFNFOworIyBlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGtlZXBfaGVscCkKKyAgICB7CisJLyogQSA6dGEgZnJvbSBhIGhlbHAgZmlsZSB3aWxsIGtlZXAgdGhlIGJfaGVscCBmbGFnIHNldC4gIEZvciAiOnB0YWciCisJICogd2UgbmVlZCB0byB1c2UgdGhlIGZsYWcgZnJvbSB0aGUgd2luZG93IHdoZXJlIHdlIGNhbWUgZnJvbS4gKi8KKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorCWlmIChnX2RvX3RhZ3ByZXZpZXcpCisJICAgIGtlZXBfaGVscF9mbGFnID0gY3Vyd2luX3NhdmUtPndfYnVmZmVyLT5iX2hlbHA7CisJZWxzZQorI2VuZGlmCisJICAgIGtlZXBfaGVscF9mbGFnID0gY3VyYnVmLT5iX2hlbHA7CisgICAgfQorICAgIGdldGZpbGVfcmVzdWx0ID0gZ2V0ZmlsZSgwLCBmbmFtZSwgTlVMTCwgVFJVRSwgKGxpbmVucl9UKTAsIGZvcmNlaXQpOworICAgIGtlZXBfaGVscF9mbGFnID0gRkFMU0U7CisKKyAgICBpZiAoZ2V0ZmlsZV9yZXN1bHQgPD0gMCkJCS8qIGdvdCB0byB0aGUgcmlnaHQgZmlsZSAqLworICAgIHsKKwljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlwb3N0cG9uZWRfc3BsaXQgPSAwOworI2VuZGlmCisKKwlzYXZlX3NlY3VyZSA9IHNlY3VyZTsKKwlzZWN1cmUgPSAxOworI2lmZGVmIEhBVkVfU0FOREJPWAorCSsrc2FuZGJveDsKKyNlbmRpZgorCXNhdmVfbWFnaWMgPSBwX21hZ2ljOworCXBfbWFnaWMgPSBGQUxTRTsJLyogYWx3YXlzIGV4ZWN1dGUgd2l0aCAnbm9tYWdpYycgKi8KKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCS8qIFNhdmUgdmFsdWUgb2Ygbm9faGxzZWFyY2gsIGp1bXBpbmcgdG8gYSB0YWcgaXMgbm90IGEgcmVhbCBzZWFyY2ggKi8KKwlzYXZlX25vX2hsc2VhcmNoID0gbm9faGxzZWFyY2g7CisjZW5kaWYKKworCS8qCisJICogSWYgJ2Nwb3B0aW9ucycgY29udGFpbnMgJ3QnLCBzdG9yZSB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSAibiIKKwkgKiBjb21tYW5kLiAgSWYgJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAndCcsIHRoZSBzZWFyY2ggcGF0dGVybgorCSAqIGlzIG5vdCBzdG9yZWQuCisJICovCisJaWYgKHZpbV9zdHJjaHIocF9jcG8sIENQT19UQUdQQVQpICE9IE5VTEwpCisJICAgIHNlYXJjaF9vcHRpb25zID0gMDsKKwllbHNlCisJICAgIHNlYXJjaF9vcHRpb25zID0gU0VBUkNIX0tFRVA7CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIGlzIGEgc2VhcmNoLCB0cnkgaGVyZS4KKwkgKgorCSAqIFJlc2V0ICdzbWFydGNhc2UnIGZvciB0aGUgc2VhcmNoLCBzaW5jZSB0aGUgc2VhcmNoIHBhdHRlcm4gd2FzIG5vdAorCSAqIHR5cGVkIGJ5IHRoZSB1c2VyLgorCSAqIE9ubHkgdXNlIGRvX3NlYXJjaCgpIHdoZW4gdGhlcmUgaXMgYSBmdWxsIHNlYXJjaCBjb21tYW5kLCB3aXRob3V0CisJICogYW55dGhpbmcgZm9sbG93aW5nLgorCSAqLworCXN0ciA9IHBidWY7CisJaWYgKHBidWZbMF0gPT0gJy8nIHx8IHBidWZbMF0gPT0gJz8nKQorCSAgICBzdHIgPSBza2lwX3JlZ2V4cChwYnVmICsgMSwgcGJ1ZlswXSwgRkFMU0UsIE5VTEwpICsgMTsKKwlpZiAoc3RyID4gcGJ1Zl9lbmQgLSAxKQkvKiBzZWFyY2ggY29tbWFuZCB3aXRoIG5vdGhpbmcgZm9sbG93aW5nICovCisJeworCSAgICBzYXZlX3Bfd3MgPSBwX3dzOworCSAgICBzYXZlX3BfaWMgPSBwX2ljOworCSAgICBzYXZlX3Bfc2NzID0gcF9zY3M7CisJICAgIHBfd3MgPSBUUlVFOwkvKiBuZWVkICd3cmFwc2NhbicgZm9yIGJhY2t3YXJkIHNlYXJjaGVzICovCisJICAgIHBfaWMgPSBGQUxTRTsJLyogZG9uJ3QgaWdub3JlIGNhc2Ugbm93ICovCisJICAgIHBfc2NzID0gRkFMU0U7CisjaWYgMAkvKiBkaXNhYmxlZCBmb3Igbm93ICovCisjaWZkZWYgRkVBVF9DTURISVNUCisJICAgIC8qIHB1dCBwYXR0ZXJuIGluIHNlYXJjaCBoaXN0b3J5ICovCisJICAgIGFkZF90b19oaXN0b3J5KEhJU1RfU0VBUkNILCBwYnVmICsgMSwgVFJVRSwgcGJ1ZlswXSk7CisjZW5kaWYKKyNlbmRpZgorCSAgICBzYXZlX2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IDA7CS8qIHN0YXJ0IHNlYXJjaCBiZWZvcmUgZmlyc3QgbGluZSAqLworCSAgICBpZiAoZG9fc2VhcmNoKE5VTEwsIHBidWZbMF0sIHBidWYgKyAxLCAobG9uZykxLCBzZWFyY2hfb3B0aW9ucykpCisJCXJldHZhbCA9IE9LOworCSAgICBlbHNlCisJICAgIHsKKwkJaW50CWZvdW5kID0gMTsKKwkJaW50CWNjOworCisJCS8qCisJCSAqIHRyeSBhZ2FpbiwgaWdub3JlIGNhc2Ugbm93CisJCSAqLworCQlwX2ljID0gVFJVRTsKKwkJaWYgKCFkb19zZWFyY2goTlVMTCwgcGJ1ZlswXSwgcGJ1ZiArIDEsIChsb25nKTEsCisJCQkJCQkJICAgICAgc2VhcmNoX29wdGlvbnMpKQorCQl7CisJCSAgICAvKgorCQkgICAgICogRmFpbGVkIHRvIGZpbmQgcGF0dGVybiwgdGFrZSBhIGd1ZXNzOiAiXmZ1bmMgICgiCisJCSAgICAgKi8KKwkJICAgIGZvdW5kID0gMjsKKwkJICAgICh2b2lkKXRlc3RfZm9yX3N0YXRpYygmdGFncCk7CisJCSAgICBjYyA9ICp0YWdwLnRhZ25hbWVfZW5kOworCQkgICAgKnRhZ3AudGFnbmFtZV9lbmQgPSBOVUw7CisJCSAgICBzcHJpbnRmKChjaGFyICopcGJ1ZiwgIl4lc1xcc1xcKigiLCB0YWdwLnRhZ25hbWUpOworCQkgICAgaWYgKCFkb19zZWFyY2goTlVMTCwgJy8nLCBwYnVmLCAobG9uZykxLCBzZWFyY2hfb3B0aW9ucykpCisJCSAgICB7CisJCQkvKiBHdWVzcyBhZ2FpbjogIl5jaGFyICogXDxmdW5jICAoIiAqLworCQkJc3ByaW50ZigoY2hhciAqKXBidWYsICJeXFxbI2EtekEtWl9dXFwuXFwqXFw8JXNcXHNcXCooIiwKKwkJCQkJCQkJdGFncC50YWduYW1lKTsKKwkJCWlmICghZG9fc2VhcmNoKE5VTEwsICcvJywgcGJ1ZiwgKGxvbmcpMSwKKwkJCQkJCQkgICAgICBzZWFyY2hfb3B0aW9ucykpCisJCQkgICAgZm91bmQgPSAwOworCQkgICAgfQorCQkgICAgKnRhZ3AudGFnbmFtZV9lbmQgPSBjYzsKKwkJfQorCQlpZiAoZm91bmQgPT0gMCkKKwkJeworCQkgICAgRU1TRyhfKCJFNDM0OiBDYW4ndCBmaW5kIHRhZyBwYXR0ZXJuIikpOworCQkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gc2F2ZV9sbnVtOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgLyoKKwkJICAgICAqIE9ubHkgZ2l2ZSBhIG1lc3NhZ2Ugd2hlbiByZWFsbHkgZ3Vlc3NlZCwgbm90IHdoZW4gJ2ljJworCQkgICAgICogaXMgc2V0IGFuZCBtYXRjaCBmb3VuZCB3aGlsZSBpZ25vcmluZyBjYXNlLgorCQkgICAgICovCisJCSAgICBpZiAoZm91bmQgPT0gMiB8fCAhc2F2ZV9wX2ljKQorCQkgICAgeworCQkJTVNHKF8oIkU0MzU6IENvdWxkbid0IGZpbmQgdGFnLCBqdXN0IGd1ZXNzaW5nISIpKTsKKwkJCWlmICghbXNnX3Njcm9sbGVkICYmIG1zZ19zaWxlbnQgPT0gMCkKKwkJCXsKKwkJCSAgICBvdXRfZmx1c2goKTsKKwkJCSAgICB1aV9kZWxheSgxMDAwTCwgVFJVRSk7CisJCQl9CisJCSAgICB9CisJCSAgICByZXR2YWwgPSBPSzsKKwkJfQorCSAgICB9CisJICAgIHBfd3MgPSBzYXZlX3Bfd3M7CisJICAgIHBfaWMgPSBzYXZlX3BfaWM7CisJICAgIHBfc2NzID0gc2F2ZV9wX3NjczsKKworCSAgICAvKiBBIHNlYXJjaCBjb21tYW5kIG1heSBoYXZlIHBvc2l0aW9uZWQgdGhlIGN1cnNvciBiZXlvbmQgdGhlIGVuZAorCSAgICAgKiBvZiB0aGUgbGluZS4gIE1heSBuZWVkIHRvIGNvcnJlY3QgdGhhdCBoZXJlLiAqLworCSAgICBjaGVja19jdXJzb3IoKTsKKwl9CisJZWxzZQorCXsKKwkgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gMTsJCS8qIHN0YXJ0IGNvbW1hbmQgaW4gbGluZSAxICovCisJICAgIGRvX2NtZGxpbmVfY21kKHBidWYpOworCSAgICByZXR2YWwgPSBPSzsKKwl9CisKKwkvKgorCSAqIFdoZW4gdGhlIGNvbW1hbmQgaGFzIGRvbmUgc29tZXRoaW5nIHRoYXQgaXMgbm90IGFsbG93ZWQgbWFrZSBzdXJlCisJICogdGhlIGVycm9yIG1lc3NhZ2UgY2FuIGJlIHNlZW4uCisJICovCisJaWYgKHNlY3VyZSA9PSAyKQorCSAgICB3YWl0X3JldHVybihUUlVFKTsKKwlzZWN1cmUgPSBzYXZlX3NlY3VyZTsKKwlwX21hZ2ljID0gc2F2ZV9tYWdpYzsKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKwktLXNhbmRib3g7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCS8qIHJlc3RvcmUgbm9faGxzZWFyY2ggd2hlbiBrZWVwaW5nIHRoZSBvbGQgc2VhcmNoIHBhdHRlcm4gKi8KKwlpZiAoc2VhcmNoX29wdGlvbnMpCisJICAgIG5vX2hsc2VhcmNoID0gc2F2ZV9ub19obHNlYXJjaDsKKyNlbmRpZgorCisJLyogUmV0dXJuIE9LIGlmIGp1bXBlZCB0byBhbm90aGVyIGZpbGUgKGF0IGxlYXN0IHdlIGZvdW5kIHRoZSBmaWxlISkuICovCisJaWYgKGdldGZpbGVfcmVzdWx0ID09IC0xKQorCSAgICByZXR2YWwgPSBPSzsKKworCWlmIChyZXR2YWwgPT0gT0spCisJeworCSAgICAvKgorCSAgICAgKiBGb3IgYSBoZWxwIGJ1ZmZlcjogUHV0IHRoZSBjdXJzb3IgbGluZSBhdCB0aGUgdG9wIG9mIHRoZSB3aW5kb3csCisJICAgICAqIHRoZSBoZWxwIHN1YmplY3Qgd2lsbCBiZSBiZWxvdyBpdC4KKwkgICAgICovCisJICAgIGlmIChjdXJidWYtPmJfaGVscCkKKwkJc2V0X3RvcGxpbmUoY3Vyd2luLCBjdXJ3aW4tPndfY3Vyc29yLmxudW0pOworI2lmZGVmIEZFQVRfRk9MRElORworCSAgICBpZiAoKGZkb19mbGFncyAmIEZET19UQUcpICYmIG9sZF9LZXlUeXBlZCkKKwkJZm9sZE9wZW5DdXJzb3IoKTsKKyNlbmRpZgorCX0KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJaWYgKGdfZG9fdGFncHJldmlldyAmJiBjdXJ3aW4gIT0gY3Vyd2luX3NhdmUgJiYgd2luX3ZhbGlkKGN1cndpbl9zYXZlKSkKKwl7CisJICAgIC8qIFJldHVybiBjdXJzb3IgdG8gd2hlcmUgd2Ugd2VyZSAqLworCSAgICB2YWxpZGF0ZV9jdXJzb3IoKTsKKwkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkgICAgd2luX2VudGVyKGN1cndpbl9zYXZlLCBUUlVFKTsKKwl9CisjZW5kaWYKKworCS0tUmVkcmF3aW5nRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLS1SZWRyYXdpbmdEaXNhYmxlZDsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAocG9zdHBvbmVkX3NwbGl0KQkJLyogY2xvc2UgdGhlIHdpbmRvdyAqLworCXsKKwkgICAgd2luX2Nsb3NlKGN1cndpbiwgRkFMU0UpOworCSAgICBwb3N0cG9uZWRfc3BsaXQgPSAwOworCX0KKyNlbmRpZgorICAgIH0KKworZXJyZXQ6CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9RVUlDS0ZJWCkKKyAgICBnX2RvX3RhZ3ByZXZpZXcgPSAwOyAvKiBGb3IgbmV4dCB0aW1lICovCisjZW5kaWYKKyAgICBpZiAodGFncC5mbmFtZV9lbmQgIT0gTlVMTCkKKwkqdGFncC5mbmFtZV9lbmQgPSBjc2F2ZTsKKyAgICB2aW1fZnJlZShwYnVmKTsKKyAgICB2aW1fZnJlZSh0b2ZyZWVfZm5hbWUpOworICAgIHZpbV9mcmVlKGZ1bGxfZm5hbWUpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIElmICJleHBhbmQiIGlzIFRSVUUsIGV4cGFuZCB3aWxkY2FyZHMgaW4gZm5hbWUuCisgKiBJZiAndGFncmVsYXRpdmUnIG9wdGlvbiBzZXQsIGNoYW5nZSBmbmFtZSAobmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgdGFnKQorICogYWNjb3JkaW5nIHRvIHRhZ19mbmFtZSAobmFtZSBvZiB0YWcgZmlsZSBjb250YWluaW5nIGZuYW1lKS4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgKG9yIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5KS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgorZXhwYW5kX3RhZ19mbmFtZShmbmFtZSwgdGFnX2ZuYW1lLCBleHBhbmQpCisgICAgY2hhcl91CSpmbmFtZTsKKyAgICBjaGFyX3UJKnRhZ19mbmFtZTsKKyAgICBpbnQJCWV4cGFuZDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgY2hhcl91CSpyZXR2YWw7CisgICAgY2hhcl91CSpleHBhbmRlZF9mbmFtZSA9IE5VTEw7CisgICAgZXhwYW5kX1QJeHBjOworCisgICAgLyoKKyAgICAgKiBFeHBhbmQgZmlsZSBuYW1lIChmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzKSB3aGVuIG5lZWRlZC4KKyAgICAgKi8KKyAgICBpZiAoZXhwYW5kICYmIG1jaF9oYXNfd2lsZGNhcmQoZm5hbWUpKQorICAgIHsKKwlFeHBhbmRJbml0KCZ4cGMpOworCXhwYy54cF9jb250ZXh0ID0gRVhQQU5EX0ZJTEVTOworCWV4cGFuZGVkX2ZuYW1lID0gRXhwYW5kT25lKCZ4cGMsIChjaGFyX3UgKilmbmFtZSwgTlVMTCwKKwkJCSAgICBXSUxEX0xJU1RfTk9URk9VTkR8V0lMRF9TSUxFTlQsIFdJTERfRVhQQU5EX0ZSRUUpOworCUV4cGFuZENsZWFudXAoJnhwYyk7CisJaWYgKGV4cGFuZGVkX2ZuYW1lICE9IE5VTEwpCisJICAgIGZuYW1lID0gZXhwYW5kZWRfZm5hbWU7CisgICAgfQorCisgICAgaWYgKChwX3RyIHx8IGN1cmJ1Zi0+Yl9oZWxwKQorCSAgICAmJiAhdmltX2lzQWJzTmFtZShmbmFtZSkKKwkgICAgJiYgKHAgPSBnZXR0YWlsKHRhZ19mbmFtZSkpICE9IHRhZ19mbmFtZSkKKyAgICB7CisJcmV0dmFsID0gYWxsb2MoTUFYUEFUSEwpOworCWlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICAgIFNUUkNQWShyZXR2YWwsIHRhZ19mbmFtZSk7CisJICAgIFNUUk5DUFkocmV0dmFsICsgKHAgLSB0YWdfZm5hbWUpLCBmbmFtZSwKKwkJCQkJCSAgTUFYUEFUSEwgLSAocCAtIHRhZ19mbmFtZSkpOworCSAgICAvKgorCSAgICAgKiBUcmFuc2xhdGUgbmFtZXMgbGlrZSAic3JjL2EvLi4vYi9maWxlLmMiIGludG8gInNyYy9iL2ZpbGUuYyIuCisJICAgICAqLworCSAgICBzaW1wbGlmeV9maWxlbmFtZShyZXR2YWwpOworCX0KKyAgICB9CisgICAgZWxzZQorCXJldHZhbCA9IHZpbV9zdHJzYXZlKGZuYW1lKTsKKworICAgIHZpbV9mcmVlKGV4cGFuZGVkX2ZuYW1lKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBNb3ZlcyB0aGUgdGFpbCBwYXJ0IG9mIHRoZSBwYXRoIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTCkgcG9pbnRlZCB0bworICogYnkgInRhaWwiIHRvIHRoZSBuZXcgbG9jYXRpb24gcG9pbnRlZCB0byBieSAiaGVyZSIuIFRoaXMgc2hvdWxkIGFjY29tb2RhdGUKKyAqIGFuIG92ZXJsYXBwaW5nIG1vdmUuCisgKi8KKyNkZWZpbmUgbW92ZXRhaWwoaGVyZSwgdGFpbCkgIG1jaF9tZW1tb3ZlKGhlcmUsIHRhaWwsIFNUUkxFTih0YWlsKSArIChzaXplX3QpMSkKKworLyoKKyAqIENvbnZlcnRzIGEgZmlsZSBuYW1lIGludG8gYSBjYW5vbmljYWwgZm9ybS4gSXQgc2ltcGxpZmllcyBhIGZpbGUgbmFtZSBpbnRvCisgKiBpdHMgc2ltcGxlc3QgZm9ybSBieSBzdHJpcHBpbmcgb3V0IHVubmVlZGVkIGNvbXBvbmVudHMsIGlmIGFueS4gIFRoZQorICogcmVzdWx0aW5nIGZpbGUgbmFtZSBpcyBzaW1wbGlmaWVkIGluIHBsYWNlIGFuZCB3aWxsIGVpdGhlciBiZSB0aGUgc2FtZQorICogbGVuZ3RoIGFzIHRoYXQgc3VwcGxpZWQsIG9yIHNob3J0ZXIuCisgKi8KKyAgICB2b2lkCitzaW1wbGlmeV9maWxlbmFtZShmaWxlbmFtZSkKKyAgICBjaGFyX3UJKmZpbGVuYW1lOworeworI2lmbmRlZiBBTUlHQQkgICAgLyogQW1pZ2EgZG9lc24ndCBoYXZlICIuLiIsIGl0IHVzZXMgIi8iICovCisgICAgaW50CQljb21wb25lbnRzID0gMDsKKyAgICBjaGFyX3UJKnAsICp0YWlsLCAqc3RhcnQ7CisgICAgaW50CQlzdHJpcHBpbmdfZGlzYWJsZWQgPSBGQUxTRTsKKyAgICBpbnQJCXJlbGF0aXZlID0gVFJVRTsKKworICAgIHAgPSBmaWxlbmFtZTsKKyNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKKyAgICBpZiAocFsxXSA9PSAnOicpCSAgICAvKiBza2lwICJ4OiIgKi8KKwlwICs9IDI7CisjZW5kaWYKKworICAgIGlmICh2aW1faXNwYXRoc2VwKCpwKSkKKyAgICB7CisJcmVsYXRpdmUgPSBGQUxTRTsKKwlkbworCSAgICArK3A7CisJd2hpbGUgKHZpbV9pc3BhdGhzZXAoKnApKTsKKyAgICB9CisgICAgc3RhcnQgPSBwOwkgICAgLyogcmVtZW1iZXIgc3RhcnQgYWZ0ZXIgImM6LyIgb3IgIi8iIG9yICIvLy8iICovCisKKyAgICBkbworICAgIHsKKwkvKiBBdCB0aGlzIHBvaW50ICJwIiBpcyBwb2ludGluZyB0byB0aGUgY2hhciBmb2xsb3dpbmcgYSBzaW5nbGUgIi8iCisJICogb3IgInAiIGlzIGF0IHRoZSAic3RhcnQiIG9mIHRoZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpIHBhdGggbmFtZS4gKi8KKyNpZmRlZiBWTVMKKwkvKiBWTVMgYWxsb3dzIGRldmljZTpbcGF0aF0gLSBkb24ndCBzdHJpcCB0aGUgWyBpbiBkaXJlY3RvcnkgICovCisJaWYgKCgqcCA9PSAnWycgfHwgKnAgPT0gJzwnKSAmJiBwID4gZmlsZW5hbWUgJiYgcFstMV0gPT0gJzonKQorCXsKKwkgICAgLyogOlsgb3IgOjwgY29tcG9zaXRpb246IHZtcyBkaXJlY3RvcnkgY29tcG9uZW50ICovCisJICAgICsrY29tcG9uZW50czsKKwkgICAgcCA9IGdldG5leHRjb21wKHAgKyAxKTsKKwl9CisJLyogYWxsb3cgcmVtb3RlIGNhbGxzIGFzIGhvc3QidXNlciBwYXNzd2QiOjpkZXZpY2U6W3BhdGhdICovCisJZWxzZSBpZiAocFswXSA9PSAnOicgJiYgcFsxXSA9PSAnOicgJiYgcCA+IGZpbGVuYW1lICYmIHBbLTFdID09ICciJyApCisJeworCSAgICAvKiAiOjogY29tcG9zaXRpb246IHZtcyBob3N0L3Bhc3N3ZCBjb21wb25lbnQgKi8KKwkgICAgKytjb21wb25lbnRzOworCSAgICBwID0gZ2V0bmV4dGNvbXAocCArIDIpOworCX0KKwllbHNlCisjZW5kaWYKKwkgIGlmICh2aW1faXNwYXRoc2VwKCpwKSkKKwkgICAgbW92ZXRhaWwocCwgcCArIDEpOwkJLyogcmVtb3ZlIGR1cGxpY2F0ZSAiLyIgKi8KKwllbHNlIGlmIChwWzBdID09ICcuJyAmJiAodmltX2lzcGF0aHNlcChwWzFdKSB8fCBwWzFdID09IE5VTCkpCisJeworCSAgICBpZiAocCA9PSBzdGFydCAmJiByZWxhdGl2ZSkKKwkJcCArPSAxICsgKHBbMV0gIT0gTlVMKTsJLyoga2VlcCBzaW5nbGUgIi4iIG9yIGxlYWRpbmcgIi4vIiAqLworCSAgICBlbHNlCisJICAgIHsKKwkJLyogU3RyaXAgIi4vIiBvciAiLi8vLyIuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lCisJCSAqIGFuZCB0aGVyZSBpcyBubyB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciwgZWl0aGVyIHN0cmlwICIvLiIgaWYKKwkJICogd2UgYXJlIGFmdGVyICJzdGFydCIsIG9yIHN0cmlwICIuIiBpZiB3ZSBhcmUgYXQgdGhlIGJlZ2lubmluZworCQkgKiBvZiBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUgLiAqLworCQl0YWlsID0gcCArIDE7CisJCWlmIChwWzFdICE9IE5VTCkKKwkJICAgIHdoaWxlICh2aW1faXNwYXRoc2VwKCp0YWlsKSkKKwkJCSsrdGFpbDsKKwkJZWxzZSBpZiAocCA+IHN0YXJ0KQorCQkgICAgLS1wOwkJLyogc3RyaXAgcHJlY2VkaW5nIHBhdGggc2VwYXJhdG9yICovCisJCW1vdmV0YWlsKHAsIHRhaWwpOworCSAgICB9CisJfQorCWVsc2UgaWYgKHBbMF0gPT0gJy4nICYmIHBbMV0gPT0gJy4nICYmCisJICAgICh2aW1faXNwYXRoc2VwKHBbMl0pIHx8IHBbMl0gPT0gTlVMKSkKKwl7CisJICAgIC8qIFNraXAgdG8gYWZ0ZXIgIi4uIiBvciAiLi4vIiBvciAiLi4vLy8iLiAqLworCSAgICB0YWlsID0gcCArIDI7CisJICAgIHdoaWxlICh2aW1faXNwYXRoc2VwKCp0YWlsKSkKKwkJKyt0YWlsOworCisJICAgIGlmIChjb21wb25lbnRzID4gMCkJCS8qIHN0cmlwIG9uZSBwcmVjZWRpbmcgY29tcG9uZW50ICovCisJICAgIHsKKwkJaW50CQlkb19zdHJpcCA9IEZBTFNFOworCQljaGFyX3UJCXNhdmVkX2NoYXI7CisJCXN0cnVjdCBzdGF0CXN0OworCisJCS8qIERvbid0IHN0cmlwIGZvciBhbiBlcnJvbmVvdXMgZmlsZSBuYW1lLiAqLworCQlpZiAoIXN0cmlwcGluZ19kaXNhYmxlZCkKKwkJeworCQkgICAgLyogSWYgdGhlIHByZWNlZGluZyBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGZpbGUKKwkJICAgICAqIHN5c3RlbSwgd2Ugc3RyaXAgaXQuICBPbiBVbml4LCB3ZSBkb24ndCBhY2NlcHQgYSBzeW1ib2xpYworCQkgICAgICogbGluayB0aGF0IHJlZmVycyB0byBhIG5vbi1leGlzdGVudCBmaWxlLiAqLworCQkgICAgc2F2ZWRfY2hhciA9IHBbLTFdOworCQkgICAgcFstMV0gPSBOVUw7CisjaWZkZWYgVU5JWAorCQkgICAgaWYgKG1jaF9sc3RhdCgoY2hhciAqKWZpbGVuYW1lLCAmc3QpIDwgMCkKKyNlbHNlCisJCQlpZiAobWNoX3N0YXQoKGNoYXIgKilmaWxlbmFtZSwgJnN0KSA8IDApCisjZW5kaWYKKwkJCSAgICBkb19zdHJpcCA9IFRSVUU7CisJCSAgICBwWy0xXSA9IHNhdmVkX2NoYXI7CisKKwkJICAgIC0tcDsKKwkJICAgIC8qIFNraXAgYmFjayB0byBhZnRlciBwcmV2aW91cyAnLycuICovCisJCSAgICB3aGlsZSAocCA+IHN0YXJ0ICYmICF2aW1faXNwYXRoc2VwKHBbLTFdKSkKKwkJCS0tcDsKKworCQkgICAgaWYgKCFkb19zdHJpcCkKKwkJICAgIHsKKwkJCS8qIElmIHRoZSBjb21wb25lbnQgZXhpc3RzIGluIHRoZSBmaWxlIHN5c3RlbSwgY2hlY2sKKwkJCSAqIHRoYXQgc3RyaXBwaW5nIGl0IHdvbid0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUKKwkJCSAqIGZpbGUgbmFtZS4gIEZpcnN0IGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKwkJCSAqIHVuc3RyaXBwZWQgZmlsZSBuYW1lLiAgVGhpcyBtYXkgZmFpbCBpZiB0aGUgY29tcG9uZW50CisJCQkgKiB0byBzdHJpcCBpcyBub3QgYSBzZWFyY2hhYmxlIGRpcmVjdG9yeSAoYnV0IGEgcmVndWxhcgorCQkJICogZmlsZSwgZm9yIGluc3RhbmNlKSwgc2luY2UgdGhlIHRyYWlsaW5nICIvLi4iIGNhbm5vdAorCQkJICogYmUgYXBwbGllZCB0aGVuLiAgV2UgZG9uJ3Qgc3RyaXAgaXQgdGhlbiBzaW5jZSB3ZQorCQkJICogZG9uJ3Qgd2FudCB0byByZXBsYWNlIGFuIGVycm9uZW91cyBmaWxlIG5hbWUgYnkKKwkJCSAqIGEgdmFsaWQgb25lLCBhbmQgd2UgZGlzYWJsZSBzdHJpcHBpbmcgb2YgbGF0ZXIKKwkJCSAqIGNvbXBvbmVudHMuICovCisJCQlzYXZlZF9jaGFyID0gKnRhaWw7CisJCQkqdGFpbCA9IE5VTDsKKwkJCWlmIChtY2hfc3RhdCgoY2hhciAqKWZpbGVuYW1lLCAmc3QpID49IDApCisJCQkgICAgZG9fc3RyaXAgPSBUUlVFOworCQkJZWxzZQorCQkJICAgIHN0cmlwcGluZ19kaXNhYmxlZCA9IFRSVUU7CisJCQkqdGFpbCA9IHNhdmVkX2NoYXI7CisjaWZkZWYgVU5JWAorCQkJaWYgKGRvX3N0cmlwKQorCQkJeworCQkJICAgIHN0cnVjdCBzdGF0CW5ld19zdDsKKworCQkJICAgIC8qIE9uIFVuaXgsIHRoZSBjaGVjayBmb3IgdGhlIHVuc3RyaXBwZWQgZmlsZSBuYW1lCisJCQkgICAgICogYWJvdmUgd29ya3MgYWxzbyBmb3IgYSBzeW1ib2xpYyBsaW5rIHBvaW50aW5nIHRvCisJCQkgICAgICogYSBzZWFyY2hhYmxlIGRpcmVjdG9yeS4gIEJ1dCB0aGVuIHRoZSBwYXJlbnQgb2YKKwkJCSAgICAgKiB0aGUgZGlyZWN0b3J5IHBvaW50ZWQgdG8gYnkgdGhlIGxpbmsgbXVzdCBiZSB0aGUKKwkJCSAgICAgKiBzYW1lIGFzIHRoZSBzdHJpcHBlZCBmaWxlIG5hbWUuICAoVGhlIGxhdHRlcgorCQkJICAgICAqIGV4aXN0cyBpbiB0aGUgZmlsZSBzeXN0ZW0gc2luY2UgaXQgaXMgdGhlCisJCQkgICAgICogY29tcG9uZW50J3MgcGFyZW50IGRpcmVjdG9yeS4pICovCisJCQkgICAgaWYgKHAgPT0gc3RhcnQgJiYgcmVsYXRpdmUpCisJCQkJKHZvaWQpbWNoX3N0YXQoIi4iLCAmbmV3X3N0KTsKKwkJCSAgICBlbHNlCisJCQkgICAgeworCQkJCXNhdmVkX2NoYXIgPSAqcDsKKwkJCQkqcCA9IE5VTDsKKwkJCQkodm9pZCltY2hfc3RhdCgoY2hhciAqKWZpbGVuYW1lLCAmbmV3X3N0KTsKKwkJCQkqcCA9IHNhdmVkX2NoYXI7CisJCQkgICAgfQorCisJCQkgICAgaWYgKG5ld19zdC5zdF9pbm8gIT0gc3Quc3RfaW5vIHx8CisJCQkJbmV3X3N0LnN0X2RldiAhPSBzdC5zdF9kZXYpCisJCQkgICAgeworCQkJCWRvX3N0cmlwID0gRkFMU0U7CisJCQkJLyogV2UgZG9uJ3QgZGlzYWJsZSBzdHJpcHBpbmcgb2YgbGF0ZXIKKwkJCQkgKiBjb21wb25lbnRzIHNpbmNlIHRoZSB1bnN0cmlwcGVkIHBhdGggbmFtZSBpcworCQkJCSAqIHN0aWxsIHZhbGlkLiAqLworCQkJICAgIH0KKwkJCX0KKyNlbmRpZgorCQkgICAgfQorCQl9CisKKwkJaWYgKCFkb19zdHJpcCkKKwkJeworCQkgICAgLyogU2tpcCB0aGUgIi4uIiBvciAiLi4vIiBhbmQgcmVzZXQgdGhlIGNvdW50ZXIgZm9yIHRoZQorCQkgICAgICogY29tcG9uZW50cyB0aGF0IG1pZ2h0IGJlIHN0cmlwcGVkIGxhdGVyIG9uLiAqLworCQkgICAgcCA9IHRhaWw7CisJCSAgICBjb21wb25lbnRzID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIC8qIFN0cmlwIHByZXZpb3VzIGNvbXBvbmVudC4gIElmIHRoZSByZXN1bHQgd291bGQgZ2V0IGVtcHR5CisJCSAgICAgKiBhbmQgdGhlcmUgaXMgbm8gdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IsIGxlYXZlIGEgc2luZ2xlCisJCSAgICAgKiAiLiIgaW5zdGVhZC4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUgYW5kCisJCSAgICAgKiB0aGVyZSBpcyBubyB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBhbmQgYSBwcmVjZWRpbmcKKwkJICAgICAqIGNvbXBvbmVudCBpcyBsZWZ0IGFmdGVyIHN0cmlwcGluZywgc3RyaXAgaXRzIHRyYWlsaW5nCisJCSAgICAgKiBwYXRoIHNlcGFyYXRvciBhcyB3ZWxsLiAqLworCQkgICAgaWYgKHAgPT0gc3RhcnQgJiYgcmVsYXRpdmUgJiYgdGFpbFstMV0gPT0gJy4nKQorCQkgICAgeworCQkJKnArKyA9ICcuJzsKKwkJCSpwID0gTlVMOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJaWYgKHAgPiBzdGFydCAmJiB0YWlsWy0xXSA9PSAnLicpCisJCQkgICAgLS1wOworCQkJbW92ZXRhaWwocCwgdGFpbCk7CS8qIHN0cmlwIHByZXZpb3VzIGNvbXBvbmVudCAqLworCQkgICAgfQorCisJCSAgICAtLWNvbXBvbmVudHM7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmIChwID09IHN0YXJ0ICYmICFyZWxhdGl2ZSkJLyogbGVhZGluZyAiLy4uIiBvciAiLy4uLyIgKi8KKwkJbW92ZXRhaWwocCwgdGFpbCk7CQkvKiBzdHJpcCAiLi4iIG9yICIuLi8iICovCisJICAgIGVsc2UKKwkgICAgeworCQlpZiAocCA9PSBzdGFydCArIDIgJiYgcFstMl0gPT0gJy4nKQkvKiBsZWFkaW5nICIuLy4uLyIgKi8KKwkJeworCQkgICAgbW92ZXRhaWwocCAtIDIsIHApOwkJCS8qIHN0cmlwIGxlYWRpbmcgIi4vIiAqLworCQkgICAgdGFpbCAtPSAyOworCQl9CisJCXAgPSB0YWlsOwkJLyogc2tpcCB0byBjaGFyIGFmdGVyICIuLiIgb3IgIi4uLyIgKi8KKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICArK2NvbXBvbmVudHM7CQkvKiBzaW1wbGUgcGF0aCBjb21wb25lbnQgKi8KKwkgICAgcCA9IGdldG5leHRjb21wKHApOworCX0KKyAgICB9IHdoaWxlICgqcCAhPSBOVUwpOworI2VuZGlmIC8qICFBTUlHQSAqLworfQorCisvKgorICogQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhZyBmb3IgdGhlIGJ1ZmZlciB3aXRoIG5hbWUgImJ1Zl9mZm5hbWUiLgorICogVGhpcyBpcyBhIGJpdCBzbG93LCBiZWNhdXNlIG9mIHRoZSBmdWxsIHBhdGggY29tcGFyZSBpbiBmdWxscGF0aGNtcCgpLgorICogUmV0dXJuIFRSVUUgaWYgdGFnIGZvciBmaWxlICJmbmFtZSIgaWYgdGFnIGZpbGUgInRhZ19mbmFtZSIgaXMgZm9yIGN1cnJlbnQKKyAqIGZpbGUuCisgKi8KKyAgICBzdGF0aWMgaW50CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCit0ZXN0X2Zvcl9jdXJyZW50KGlzX2V0YWcsIGZuYW1lLCBmbmFtZV9lbmQsIHRhZ19mbmFtZSwgYnVmX2ZmbmFtZSkKKyAgICBpbnQJICAgIGlzX2V0YWc7CisjZWxzZQordGVzdF9mb3JfY3VycmVudChmbmFtZSwgZm5hbWVfZW5kLCB0YWdfZm5hbWUsIGJ1Zl9mZm5hbWUpCisjZW5kaWYKKyAgICBjaGFyX3UgICpmbmFtZTsKKyAgICBjaGFyX3UgICpmbmFtZV9lbmQ7CisgICAgY2hhcl91ICAqdGFnX2ZuYW1lOworICAgIGNoYXJfdSAgKmJ1Zl9mZm5hbWU7Cit7CisgICAgaW50CSAgICBjOworICAgIGludAkgICAgcmV0dmFsID0gRkFMU0U7CisgICAgY2hhcl91ICAqZnVsbG5hbWU7CisKKyAgICBpZiAoYnVmX2ZmbmFtZSAhPSBOVUxMKQkvKiBpZiB0aGUgYnVmZmVyIGhhcyBhIG5hbWUgKi8KKyAgICB7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJaWYgKGlzX2V0YWcpCisJICAgIGMgPSAwOwkgICAgLyogdG8gc2h1dCB1cCBHQ0MgKi8KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGMgPSAqZm5hbWVfZW5kOworCSAgICAqZm5hbWVfZW5kID0gTlVMOworCX0KKwlmdWxsbmFtZSA9IGV4cGFuZF90YWdfZm5hbWUoZm5hbWUsIHRhZ19mbmFtZSwgVFJVRSk7CisJaWYgKGZ1bGxuYW1lICE9IE5VTEwpCisJeworCSAgICByZXR2YWwgPSAoZnVsbHBhdGhjbXAoZnVsbG5hbWUsIGJ1Zl9mZm5hbWUsIFRSVUUpICYgRlBDX1NBTUUpOworCSAgICB2aW1fZnJlZShmdWxsbmFtZSk7CisJfQorI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCWlmICghaXNfZXRhZykKKyNlbmRpZgorCSAgICAqZm5hbWVfZW5kID0gYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRmluZCB0aGUgZW5kIG9mIHRoZSB0YWdhZGRyZXNzLgorICogUmV0dXJuIE9LIGlmICI7XCIiIGlzIGZvbGxvd2luZywgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitmaW5kX2V4dHJhKHBwKQorICAgIGNoYXJfdQkqKnBwOworeworICAgIGNoYXJfdQkqc3RyID0gKnBwOworCisgICAgLyogUmVwZWF0IGZvciBhZGRyZXNzZXMgc2VwYXJhdGVkIHdpdGggJzsnICovCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKFZJTV9JU0RJR0lUKCpzdHIpKQorCSAgICBzdHIgPSBza2lwZGlnaXRzKHN0cik7CisJZWxzZSBpZiAoKnN0ciA9PSAnLycgfHwgKnN0ciA9PSAnPycpCisJeworCSAgICBzdHIgPSBza2lwX3JlZ2V4cChzdHIgKyAxLCAqc3RyLCBGQUxTRSwgTlVMTCk7CisJICAgIGlmICgqc3RyICE9ICoqcHApCisJCXN0ciA9IE5VTEw7CisJICAgIGVsc2UKKwkJKytzdHI7CisJfQorCWVsc2UKKwkgICAgc3RyID0gTlVMTDsKKwlpZiAoc3RyID09IE5VTEwgfHwgKnN0ciAhPSAnOycKKwkJICB8fCAhKFZJTV9JU0RJR0lUKHN0clsxXSkgfHwgc3RyWzFdID09ICcvJyB8fCBzdHJbMV0gPT0gJz8nKSkKKwkgICAgYnJlYWs7CisJKytzdHI7CS8qIHNraXAgJzsnICovCisgICAgfQorCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIFNUUk5DTVAoc3RyLCAiO1wiIiwgMikgPT0gMCkKKyAgICB7CisJKnBwID0gc3RyOworCXJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK2V4cGFuZF90YWdzKHRhZ25hbWVzLCBwYXQsIG51bV9maWxlLCBmaWxlKQorICAgIGludAkJdGFnbmFtZXM7CS8qIGV4cGFuZCB0YWcgbmFtZXMgKi8KKyAgICBjaGFyX3UJKnBhdDsKKyAgICBpbnQJCSpudW1fZmlsZTsKKyAgICBjaGFyX3UJKioqZmlsZTsKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQljOworICAgIGludAkJdGFnbm1mbGFnOworICAgIGNoYXJfdSAgICAgIHRhZ25tWzEwMF07CisgICAgdGFncHRyc19UCXRfcDsKKyAgICBpbnQJCXJldDsKKworICAgIGlmICh0YWduYW1lcykKKwl0YWdubWZsYWcgPSBUQUdfTkFNRVM7CisgICAgZWxzZQorCXRhZ25tZmxhZyA9IDA7CisgICAgaWYgKHBhdFswXSA9PSAnLycpCisJcmV0ID0gZmluZF90YWdzKHBhdCArIDEsIG51bV9maWxlLCBmaWxlLAorCQlUQUdfUkVHRVhQIHwgdGFnbm1mbGFnIHwgVEFHX1ZFUkJPU0UsCisJCVRBR19NQU5ZLCBjdXJidWYtPmJfZmZuYW1lKTsKKyAgICBlbHNlCisJcmV0ID0gZmluZF90YWdzKHBhdCwgbnVtX2ZpbGUsIGZpbGUsCisJCVRBR19SRUdFWFAgfCB0YWdubWZsYWcgfCBUQUdfVkVSQk9TRSB8IFRBR19OT0lDLAorCQlUQUdfTUFOWSwgY3VyYnVmLT5iX2ZmbmFtZSk7CisgICAgaWYgKHJldCA9PSBPSyAmJiAhdGFnbmFtZXMpCisgICAgeworCSAvKiBSZW9yZ2FuaXplIHRoZSB0YWdzIGZvciBkaXNwbGF5IGFuZCBtYXRjaGluZyBhcyBzdHJpbmdzIG9mOgorCSAgKiAiPHRhZ25hbWU+XDA8a2luZD5cMDxmaWxlbmFtZT5cMCIKKwkgICovCisJIGZvciAoaSA9IDA7IGkgPCAqbnVtX2ZpbGU7IGkrKykKKwkgeworCSAgICAgcGFyc2VfbWF0Y2goKCpmaWxlKVtpXSwgJnRfcCk7CisJICAgICBjID0gKGludCkodF9wLnRhZ25hbWVfZW5kIC0gdF9wLnRhZ25hbWUpOworCSAgICAgbWNoX21lbW1vdmUodGFnbm0sIHRfcC50YWduYW1lLCAoc2l6ZV90KWMpOworCSAgICAgdGFnbm1bYysrXSA9IDA7CisJICAgICB0YWdubVtjKytdID0gKHRfcC50YWdraW5kICE9IE5VTEwgJiYgKnRfcC50YWdraW5kKQorCQkJCQkJCSA/ICp0X3AudGFna2luZCA6ICdmJzsKKwkgICAgIHRhZ25tW2MrK10gPSAwOworCSAgICAgbWNoX21lbW1vdmUoKCpmaWxlKVtpXSArIGMsIHRfcC5mbmFtZSwgdF9wLmZuYW1lX2VuZCAtIHRfcC5mbmFtZSk7CisJICAgICAoKmZpbGUpW2ldW2MgKyAodF9wLmZuYW1lX2VuZCAtIHRfcC5mbmFtZSldID0gMDsKKwkgICAgIG1jaF9tZW1tb3ZlKCgqZmlsZSlbaV0sIHRhZ25tLCAoc2l6ZV90KWMpOworCX0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RlYXJvZmYuYm1wIGIvc3JjL3RlYXJvZmYuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDMxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVhcm9mZi5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RlZS9NYWtlZmlsZSBiL3NyYy90ZWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxYTFjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZWUvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyBBIHZlcnkgKGlmIG5vdCB0aGUgbW9zdCkgc2ltcGxpc3RpYyBNYWtlZmlsZSBmb3IgT1MvMgorCitDQz1nY2MKK0NGTEFHUz0tTzIgLWZuby1zdHJlbmd0aC1yZWR1Y2UKKwordGVlLmV4ZTogdGVlLm8KKwkkKENDKSAkKENGTEFHUykgLXMgLW8gJEAgJDwKKwordGVlLm86IHRlZS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2NsZWFuOgorCS0gZGVsIHRlZS5vCisJLSBkZWwgdGVlLmV4ZQorCmRpZmYgLS1naXQgYS9zcmMvdGVlL3RlZS5jIGIvc3JjL3RlZS90ZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg1NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RlZS90ZWUuYwpAQCAtMCwwICsxLDE1MyBAQAorLyogIHZpbTpzZXQgdHM9NCBzdz00OgorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5NiwgUGF1bCBTbG9vdG1hbgorICoKKyAqCUF1dGhvcjogUGF1bCBTbG9vdG1hbgorICoJCQkocGF1bEB3dXJ0ZWwuaG9iYnkubmwsIHBhdWxAbXVycGh5Lm5sLCBwYXVsU0B0b2Vjb21wc3QubmwpCisgKgorICoJVGhpcyBzb3VyY2UgY29kZSBpcyByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLiBJdCBpcyBwcm92aWRlZCBvbiBhbgorICoJYXMtaXMgYmFzaXMgYW5kIG5vIHJlc3BvbnNpYmlsaXR5IGlzIGFjY2VwdGVkIGZvciBpdHMgZmFpbHVyZSB0byBwZXJmb3JtCisgKglhcyBleHBlY3RlZC4gSXQgaXMgd29ydGggYXQgbGVhc3QgYXMgbXVjaCBhcyB5b3UgcGFpZCBmb3IgaXQhCisgKgorICogdGVlLmMgLSBwaXBlIGZpdHRpbmcKKyAqCisgKiB0ZWUgcmVhZHMgc3RkaW4sIGFuZCB3cml0ZXMgd2hhdCBpdCByZWFkcyB0byBlYWNoIG9mIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGVzLiBUaGUgcHJpbWFyeSByZWFzb24gb2YgZXhpc3RlbmNlIGZvciB0aGlzIHZlcnNpb24gaXMgYSBxdWljaworICogYW5kIGRpcnR5IGltcGxlbWVudGF0aW9uIHRvIGRpc3RyaWJ1dGUgd2l0aCBWaW0sIHRvIG1ha2Ugb25lIG9mIHRoZQorICogbW9zdCB1c2VmdWwgZmVhdHVyZXMgb2YgVmltIHBvc3NpYmxlIG9uIE9TLzI6IHF1aWNrZml4LgorICoKKyAqIE9mIGNvdXJzZSwgbm90IHVzaW5nIHRlZSBidXQgaW5zdGVhZCByZWRpcmVjdGluZyBtYWtlJ3Mgb3V0cHV0IGRpcmVjdGx5CisgKiBpbnRvIGEgdGVtcCBmaWxlIGFuZCB0aGVuIHByb2Nlc3NpbmcgdGhhdCBpcyBwb3NzaWJsZSwgYnV0IGlmIHdlIGhhdmUgYQorICogc3lzdGVtIGNhcGFibGUgb2YgY29ycmVjdGx5IHBpcGluZyAodW5saWtlIERPUywgZm9yIGV4YW1wbGUpLCB3aHkgbm90CisgKiB1c2UgaXQgYXMgd2VsbCBhcyBwb3NzaWJsZT8gVGhpcyB0ZWUgc2hvdWxkIGFsc28gd29yayBvbiBvdGhlciBzeXN0ZW1zLAorICogYnV0IGl0J3Mgbm90IGJlZW4gdGVzdGVkIHRoZXJlLCBvbmx5IG9uIE9TLzIuCisgKgorICogdGVlIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoZSBHTlUgc2hlbGx1dGlscyBwYWNrYWdlLCB3aGljaCBpcyBhdmFpbGFibGUKKyAqIHByZWNvbXBpbGVkIGZvciBPUy8yLiBUaGF0IG9uZSBwcm9iYWJseSB3b3JrcyBiZXR0ZXIuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKyJ0ZWUgdXNhZ2U6XG5cCitcdHRlZSBbLWFdIGZpbGUgLi4uIGZpbGVfblxuXAorXG5cCitcdC1hXHRhcHBlbmQgdG8gZmlsZXMgaW5zdGVhZCBvZiB0cnVuY2F0aW5nXG5cCitcblRlZSByZWFkcyBpdHMgaW5wdXQsIGFuZCB3cml0ZXMgdG8gZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGZpbGVzLFxuXAorYXMgd2VsbCBhcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LlxuXAorXG5cCitUaGlzIHZlcnNpb24gc3VwcGxpZWQgd2l0aCBWaW0gNC4yIHRvIG1ha2UgJzptYWtlJyBwb3NzaWJsZS5cblwKK0ZvciBhIG1vcmUgY29tcGxldGUgYW5kIHN0YWJsZSB2ZXJzaW9uLCBjb25zaWRlciBnZXR0aW5nXG5cCitbYSBwb3J0IG9mXSB0aGUgR05VIHNoZWxsdXRpbHMgcGFja2FnZS5cblwKKyIpOworfQorCisvKgorICogZnJlYWQgb25seSByZXR1cm5zIHdoZW4gY291bnQgaXMgcmVhZCBvciBhdCBFT0YuCisgKiBXZSBjb3VsZCB1c2UgZmdldHMsIGJ1dCBJIHdhbnQgdG8gYmUgYWJsZSB0byBoYW5kbGUgYmluYXJ5IGJsdWJiZXIuCisgKi8KKworaW50CitteWZyZWFkKGNoYXIgKmJ1ZiwgaW50IGVsc2l6ZSAvKmlnbm9yZWQqLywgaW50IG1heCwgRklMRSAqZnApCit7CisJaW50CWM7CisJaW50CW4gPSAwOworCisJd2hpbGUgKChuIDwgbWF4KSAmJiAoKGMgPSBnZXRjaGFyKCkpICE9IEVPRikpCisJeworCQkqKGJ1ZisrKSA9IGM7CisJCW4rKzsKKwkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG47Cit9CisKKwordm9pZAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludAlhcHBlbmQgPSAwOworCWludAludW1maWxlczsKKwlpbnQJb3B0OworCWludAltYXhmaWxlczsKKwlGSUxFCSoqZmlsZXBvaW50ZXJzOworCWludAlpOworCWNoYXIJYnVmW0JVRlNJWl07CisJaW50CW47CisJZXh0ZXJuIGludAlvcHRpbmQ7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYSIpKSAhPSBFT0YpCisJeworCQlzd2l0Y2ggKG9wdCkKKwkJeworCQkJY2FzZSAnYSc6CWFwcGVuZCsrOworCQkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CXVzYWdlKCk7CisJCQkJCWV4aXQoMik7CisJCX0KKwl9CisKKwludW1maWxlcyA9IGFyZ2MgLSBvcHRpbmQ7CisKKwlpZiAobnVtZmlsZXMgPT0gMCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdXNpbmcgdGVlIHdpdGhvdXQgYW55IGZpbGUgbmFtZSBhcmd1bWVudHMuLi5cbiIpOworCQl1c2FnZSgpOworCQlleGl0KDIpOworCX0KKworCW1heGZpbGVzID0gc3lzY29uZihfU0NfT1BFTl9NQVgpOwkvKiBvciBmaWxsIGluIDEwIG9yIHNvICovCisJaWYgKG1heGZpbGVzIDwgMCkKKwkJbWF4ZmlsZXMgPSAxMDsKKwlpZiAobnVtZmlsZXMgKyAzID4gbWF4ZmlsZXMpCS8qICszIGFjY291bnRzIGZvciBzdGRpbiwgb3V0LCBlcnIgKi8KKwl7CisJCWZwcmludGYoc3RkZXJyLCAiU29ycnksIHRoZXJlIGlzIGEgbGltaXQgb2YgbWF4ICVkIGZpbGVzLlxuIiwgbWF4ZmlsZXMgLSAzKTsKKwkJZXhpdCgxKTsKKwl9CisJZmlsZXBvaW50ZXJzID0gY2FsbG9jKG51bWZpbGVzLCBzaXplb2YoRklMRSAqKSk7CisJaWYgKGZpbGVwb2ludGVycyA9PSBOVUxMKQorCXsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgJWQgZmlsZXNcbiIsIG51bWZpbGVzKTsKKwkJZXhpdCgxKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bWZpbGVzOyBpKyspCisJeworCQlmaWxlcG9pbnRlcnNbaV0gPSBmb3Blbihhcmd2W2krb3B0aW5kXSwgYXBwZW5kID8gImFiIiA6ICJ3YiIpOworCQlpZiAoZmlsZXBvaW50ZXJzW2ldID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBcIiVzXCJcbiIsIGFyZ3ZbaStvcHRpbmRdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJX2ZzZXRtb2RlKHN0ZGluLCAgImIiKTsKKwlmZmx1c2goc3Rkb3V0KTsJLyogbmVlZGVkIGZvciBfZnNldG1vZGUoc3Rkb3V0KSAqLworCV9mc2V0bW9kZShzdGRvdXQsICJiIik7CisKKwl3aGlsZSAoKG4gPSBteWZyZWFkKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBzaXplb2YoYnVmKSwgc3RkaW4pKSA+IDApCisJeworCQlmd3JpdGUoYnVmLCBzaXplb2YoY2hhciksIG4sIHN0ZG91dCk7CisJCWZmbHVzaChzdGRvdXQpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtZmlsZXM7IGkrKykKKwkJeworCQkJaWYgKGZpbGVwb2ludGVyc1tpXSAmJgorCQkJICAgICBmd3JpdGUoYnVmLCBzaXplb2YoY2hhciksIG4sIGZpbGVwb2ludGVyc1tpXSkgIT0gbikKKwkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgdG8gZmlsZSBcIiVzXCJcbiIsIGFyZ3ZbaStvcHRpbmRdKTsKKwkJCQlmY2xvc2UoZmlsZXBvaW50ZXJzW2ldKTsKKwkJCQlmaWxlcG9pbnRlcnNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1maWxlczsgaSsrKQorCXsKKwkJaWYgKGZpbGVwb2ludGVyc1tpXSkKKwkJCWZjbG9zZShmaWxlcG9pbnRlcnNbaV0pOworCX0KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVybS5jIGIvc3JjL3Rlcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZhNDBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlcm0uYwpAQCAtMCwwICsxLDUzODEgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKy8qCisgKgorICogdGVybS5jOiBmdW5jdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSB0ZXJtaW5hbAorICoKKyAqIHByaW1pdGl2ZSB0ZXJtY2FwIHN1cHBvcnQgZm9yIEFtaWdhLCBNU0RPUywgYW5kIFdpbjMyIGluY2x1ZGVkCisgKgorICogTk9URTogcGFkZGluZyBhbmQgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBwZXJmb3JtZWQsCisgKiB3aGVuIGNvbXBpbGluZyB3aXRob3V0IEhBVkVfVEdFVEVOVCwgd2UgdXNlIHRwdXRzKCkgYW5kIHRnb3RvKCkgZHVtbWllcy4KKyAqLworCisvKgorICogU29tZSBzeXN0ZW1zIGhhdmUgYSBwcm90b3R5cGUgZm9yIHRnZXRzdHIoKSB3aXRoIChjaGFyICopIGluc3RlYWQgb2YKKyAqIChjaGFyICoqKS4gVGhpcyBkZWZpbmUgcmVtb3ZlcyB0aGF0IHByb3RvdHlwZS4gV2UgaW5jbHVkZSBvdXIgb3duIHByb3RvdHlwZQorICogYmVsb3cuCisgKi8KKworI2RlZmluZSB0Z2V0c3RyIHRnZXRzdHJfZGVmaW5lZF93cm9uZworI2luY2x1ZGUgInZpbS5oIgorCisjaWZkZWYgSEFWRV9UR0VURU5UCisjIGlmZGVmIEhBVkVfVEVSTUlPU19ICisjICBpbmNsdWRlIDx0ZXJtaW9zLmg+CSAgICAvKiBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3Igc29tZSBMaW51eCAqLworIyBlbmRpZgorIyBpZmRlZiBIQVZFX1RFUk1DQVBfSAorIyAgaW5jbHVkZSA8dGVybWNhcC5oPgorIyBlbmRpZgorCisvKgorICogQSBmZXcgbGludXggc3lzdGVtcyBkZWZpbmUgb3V0ZnVudHlwZSBpbiB0ZXJtY2FwLmggdG8gYmUgdXNlZCBhcyB0aGUgdGhpcmQKKyAqIGFyZ3VtZW50IGZvciB0cHV0cygpLgorICovCisjIGlmZGVmIFZNUworIyAgZGVmaW5lIFRQVVRTRlVOQ0FTVAorIyBlbHNlCisjICBpZmRlZiBIQVZFX09VVEZVTlRZUEUKKyMgICBkZWZpbmUgVFBVVFNGVU5DQVNUIChvdXRmdW50eXBlKQorIyAgZWxzZQorIyAgIGRlZmluZSBUUFVUU0ZVTkNBU1QgKGludCAoKikoKSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIHRnZXRzdHIKKworLyoKKyAqIEhlcmUgYXJlIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4gIFRoZXkgYXJlIG5vdCBzdG9yZWQgYXMgY29tcGxldGUKKyAqIFRjYXJyIHN0cnVjdHVyZXMsIGFzIHN1Y2ggYSBzdHJ1Y3R1cmUgaXMgdG9vIGJpZy4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgY29tcGFjdCwgdGhlcmVmb3JlIHRoZXkgbm9ybWFsbHkgYXJlIGluY2x1ZGVkIGV2ZW4gd2hlbgorICogSEFWRV9UR0VURU5UIGlzIGRlZmluZWQuIFdoZW4gSEFWRV9UR0VURU5UIGlzIGRlZmluZWQsIHRoZSBidWlsdGluIGVudHJpZXMKKyAqIGNhbiBiZSBhY2Nlc3NlZCB3aXRoICJidWlsdGluX2FtaWdhIiwgImJ1aWx0aW5fYW5zaSIsICJidWlsdGluX2RlYnVnIiwgZXRjLgorICoKKyAqIEVhY2ggdGVybWNhcCBpcyBhIGxpc3Qgb2YgYnVpbHRpbl90ZXJtIHN0cnVjdHVyZXMuIEl0IGFsd2F5cyBzdGFydHMgd2l0aAorICogS1NfTkFNRSwgd2hpY2ggc2VwYXJhdGVzIHRoZSBlbnRyaWVzLiAgU2VlIHBhcnNlX2J1aWx0aW5fdGNhcCgpIGZvciBhbGwKKyAqIGRldGFpbHMuCisgKiBidF9lbnRyeSBpcyBlaXRoZXIgYSBLU194eHggY29kZSAoPj0gMCksIG9yIGEgS194eHggY29kZS4KKyAqCisgKiBFbnRyaWVzIG1hcmtlZCB3aXRoICJndWVzc2VkIiBtYXkgYmUgd3JvbmcuCisgKi8KK3N0cnVjdCBidWlsdGluX3Rlcm0KK3sKKyAgICBpbnQJCWJ0X2VudHJ5OworICAgIGNoYXIJKmJ0X3N0cmluZzsKK307CisKKy8qIHN0YXJ0IG9mIGtleXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHVzZWQgYnkgVmltIGJ1dCBjYW4gYmUgbWFwcGVkICovCisjZGVmaW5lIEJUX0VYVFJBX0tFWVMJMHgxMDEKKworc3RhdGljIHN0cnVjdCBidWlsdGluX3Rlcm0gKmZpbmRfYnVpbHRpbl90ZXJtIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgdm9pZCBwYXJzZV9idWlsdGluX3RjYXAgX19BUkdTKChjaGFyX3UgKnMpKTsKK3N0YXRpYyB2b2lkIHRlcm1fY29sb3IgX19BUkdTKChjaGFyX3UgKnMsIGludCBuKSk7CitzdGF0aWMgdm9pZCBnYXRoZXJfdGVybWxlYWRlciBfX0FSR1MoKHZvaWQpKTsKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorc3RhdGljIHZvaWQgcmVxX2NvZGVzX2Zyb21fdGVybSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHJlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdvdF9jb2RlX2Zyb21fdGVybSBfX0FSR1MoKGNoYXJfdSAqY29kZSwgaW50IGxlbikpOworc3RhdGljIHZvaWQgY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKKyAgICB8fCAoZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSkpCitzdGF0aWMgaW50IGdldF9ieXRlc19mcm9tX2J1ZiBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKiwgaW50KSk7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorc3RhdGljIHZvaWQgbWF5X3JlcV90ZXJtcmVzcG9uc2UgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGRlbF90ZXJtY29kZV9pZHggX19BUkdTKChpbnQgaWR4KSk7CitzdGF0aWMgaW50IHRlcm1faXNfYnVpbHRpbiBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOworc3RhdGljIGludCB0ZXJtXzd0bzhiaXQgX19BUkdTKChjaGFyX3UgKnApKTsKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorc3RhdGljIHZvaWQgc3dpdGNoX3RvXzhiaXQgX19BUkdTKCh2b2lkKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEdFVEVOVAorc3RhdGljIGNoYXJfdSAqdGdldGVudF9lcnJvciBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOworCisvKgorICogSGVyZSBpcyBvdXIgb3duIHByb3RvdHlwZSBmb3IgdGdldHN0cigpLCBhbnkgcHJvdG90eXBlcyBmcm9tIHRoZSBpbmNsdWRlCisgKiBmaWxlcyBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgdGhlIGRlZmluZSBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgorICovCitjaGFyCQkqdGdldHN0ciBfX0FSR1MoKGNoYXIgKiwgY2hhciAqKikpOworCisjIGlmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisvKiBSZXF1ZXN0IFRlcm1pbmFsIFZlcnNpb24gc3RhdHVzOiAqLworIyAgZGVmaW5lIENSVl9HRVQJMQkvKiBzZW5kIFRfQ1JWIHdoZW4gc3dpdGNoZWQgdG8gUkFXIG1vZGUgKi8KKyMgIGRlZmluZSBDUlZfU0VOVAkyCS8qIGRpZCBzZW5kIFRfQ1JWLCB3YWl0aW5nIGZvciBhbnN3ZXIgKi8KKyMgIGRlZmluZSBDUlZfR09UCTMJLyogcmVjZWl2ZWQgVF9DUlYgcmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgY3J2X3N0YXR1cyA9IENSVl9HRVQ7CisjIGVuZGlmCisKKy8qCisgKiBEb24ndCBkZWNsYXJlIHRoZXNlIHZhcmlhYmxlcyBpZiB0ZXJtY2FwLmggY29udGFpbnMgdGhlbS4KKyAqIEF1dG9jb25mIGNoZWNrcyBpZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGV4dGVybiAobm90IGFsbAorICogc3lzdGVtcyBoYXZlIHRoZW0pLgorICogU29tZSB2ZXJzaW9ucyBkZWZpbmUgb3NwZWVkIHRvIGJlIHNwZWVkX3QsIGJ1dCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoCisgKiBCU0QsIHdoZXJlIG9zcGVlZCBpcyBzaG9ydCBhbmQgc3BlZWRfdCBpcyBsb25nLgorICovCisjIGlmbmRlZiBIQVZFX09TUEVFRAorIyAgaWZkZWYgT1NQRUVEX0VYVEVSTgorZXh0ZXJuIHNob3J0IG9zcGVlZDsKKyMgICBlbHNlCitzaG9ydCBvc3BlZWQ7CisjICAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfVVBfQkNfUEMKKyMgIGlmZGVmIFVQX0JDX1BDX0VYVEVSTgorZXh0ZXJuIGNoYXIgKlVQLCAqQkMsIFBDOworIyAgZWxzZQorY2hhciAqVVAsICpCQywgUEM7CisjICBlbmRpZgorIyBlbmRpZgorCisjIGRlZmluZSBUR0VUU1RSKHMsIHApCXZpbV90Z2V0c3RyKChzKSwgKHApKQorIyBkZWZpbmUgVEdFVEVOVChiLCB0KQl0Z2V0ZW50KChjaGFyICopKGIpLCAoY2hhciAqKSh0KSkKK3N0YXRpYyBjaGFyX3UgKnZpbV90Z2V0c3RyIF9fQVJHUygoY2hhciAqcywgY2hhcl91ICoqcHApKTsKKyNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KKworc3RhdGljIGludCAgZGV0ZWN0ZWRfOGJpdCA9IEZBTFNFOwkvKiBkZXRlY3RlZCA4LWJpdCB0ZXJtaW5hbCAqLworCitzdHJ1Y3QgYnVpbHRpbl90ZXJtIGJ1aWx0aW5fdGVybWNhcHNbXSA9Cit7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKQorLyoKKyAqIEdVSSBwc2V1ZG8gdGVybS1jYXAuCisgKi8KKyAgICB7KGludClLU19OQU1FLAkiZ3VpIn0sCisgICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzfCQiLCBFU0NfU1RSICJ8JCIpfSwKKyAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzN8aSIsIEVTQ19TVFIgInxpIil9LAorIyBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzN8JXAxJWRJIiwgRVNDX1NUUiAifCVwMSVkSSIpfSwKKyMgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzN8JWRJIiwgRVNDX1NUUiAifCVkSSIpfSwKKyMgZW5kaWYKKyAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzN8ZCIsIEVTQ19TVFIgInxkIil9LAorIyBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzN8JXAxJWREIiwgRVNDX1NUUiAifCVwMSVkRCIpfSwKKyAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzN8JXAxJWQ7JXAyJWRSIiwgRVNDX1NUUiAifCVwMSVkOyVwMiVkUiIpfSwKKyMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgeyhpbnQpS1NfQ1NWLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZFYiLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRWIil9LAorIyAgZW5kaWYKKyMgZWxzZQorICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzN8JWREIiwgRVNDX1NUUiAifCVkRCIpfSwKKyAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzN8JWQ7JWRSIiwgRVNDX1NUUiAifCVkOyVkUiIpfSwKKyMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgeyhpbnQpS1NfQ1NWLAlJRl9FQigiXDAzM3wlZDslZFYiLCBFU0NfU1RSICJ8JWQ7JWRWIil9LAorIyAgZW5kaWYKKyMgZW5kaWYKKyAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzN8QyIsIEVTQ19TVFIgInxDIil9LAorCQkJLyogYXR0cmlidXRlcyBzd2l0Y2hlZCBvbiB3aXRoICdoJywgb2ZmIHdpdGggKiAnSCcgKi8KKyAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzN8MzFIIiwgRVNDX1NUUiAifDMxSCIpfSwgLyogSExfQUxMICovCisgICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzfDFoIiwgRVNDX1NUUiAifDFoIil9LCAgIC8qIEhMX0lOVkVSU0UgKi8KKyAgICB7KGludClLU19NRCwJSUZfRUIoIlwwMzN8MmgiLCBFU0NfU1RSICJ8MmgiKX0sICAgLyogSExfQk9MRCAqLworICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3wxNkgiLCBFU0NfU1RSICJ8MTZIIil9LCAvKiBITF9TVEFORE9VVCAqLworICAgIHsoaW50KUtTX1NPLAlJRl9FQigiXDAzM3wxNmgiLCBFU0NfU1RSICJ8MTZoIil9LCAvKiBITF9TVEFORE9VVCAqLworICAgIHsoaW50KUtTX1VFLAlJRl9FQigiXDAzM3w4SCIsIEVTQ19TVFIgInw4SCIpfSwgICAvKiBITF9VTkRFUkxJTkUgKi8KKyAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzN8OGgiLCBFU0NfU1RSICJ8OGgiKX0sICAgLyogSExfVU5ERVJMSU5FICovCisgICAgeyhpbnQpS1NfQ1pSLAlJRl9FQigiXDAzM3w0SCIsIEVTQ19TVFIgInw0SCIpfSwgICAvKiBITF9JVEFMSUMgKi8KKyAgICB7KGludClLU19DWkgsCUlGX0VCKCJcMDMzfDRoIiwgRVNDX1NUUiAifDRoIil9LCAgIC8qIEhMX0lUQUxJQyAqLworICAgIHsoaW50KUtTX1ZCLAlJRl9FQigiXDAzM3xmIiwgRVNDX1NUUiAifGYiKX0sCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCisgICAgeyhpbnQpS1NfVVQsCSJ5In0sCisgICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAkJLyogY3Vyc29yLWxlZnQgPSBCUyAqLworICAgIHsoaW50KUtTX05ELAkiXDAxNCJ9LAkvKiBjdXJzb3ItcmlnaHQgPSBDVFJMLUwgKi8KKyMgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzN8JXAxJWQ7JXAyJWRNIiwgRVNDX1NUUiAifCVwMSVkOyVwMiVkTSIpfSwKKyMgZWxzZQorICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlZDslZE0iLCBFU0NfU1RSICJ8JWQ7JWRNIil9LAorIyBlbmRpZgorCS8qIHRoZXJlIGFyZSBubyBrZXkgc2VxdWVuY2VzIGhlcmUsIHRoZSBHVUkgc2VxdWVuY2VzIGFyZSByZWNvZ25pemVkCisJICogaW4gY2hlY2tfdGVybWNvZGVzKCkgKi8KKyNlbmRpZgorCisjaWZuZGVmIE5PX0JVSUxUSU5fVENBUFMKKyMgaWYgZGVmaW5lZChSSVNDT1MpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisvKgorICogRGVmYXVsdCBmb3IgdGhlIEFjb3JuLgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJInJpc2NvcyJ9LAorICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAkJLyogQ2xzIGFuZCBIb21lIEN1cnNvciAqLworICAgIHsoaW50KUtTX0NNLAkiXDAwMSVkXDAwMSVkXDAwMiJ9LAkvKiBQb3NpdGlvbiBjdXJzb3IgKi8KKworICAgIHsoaW50KUtTX0NDTywJIjE2In0sCQkJLyogQWxsb3cgMTYgY29sb3JzICovCisKKyAgICB7KGludClLU19DQUYsCSJcMDAxJWRcMDIxIn0sCQkvKiBTZXQgZm9yZWdyb3VuZCBjb2xvdXIgKi8KKyAgICB7KGludClLU19DQUIsCSJcMDAxJWRcMDIyIn0sCQkvKiBTZXQgYmFja2dyb3VuZCBjb2xvdXIgKi8KKworCisgICAgeyhpbnQpS1NfTUUsCSJcMDA0In0sCQkvKiBOb3JtYWwgbW9kZSAqLworICAgIHsoaW50KUtTX01SLAkiXDAwNSJ9LAkJLyogUmV2ZXJzZSAqLworCisgICAgeyhpbnQpS1NfVkksCSJcMDE2In0sCQkvKiBDdXJzb3IgaW52aXNpYmxlICovCisgICAgeyhpbnQpS1NfVkUsCSJcMDE3In0sCQkvKiBDdXJzb3IgdmlzaWJsZSAqLworICAgIHsoaW50KUtTX1ZTLAkiXDAyMCJ9LAkJLyogQ3Vyc29yIHZlcnkgdmlzaWJsZSAqLworCisgICAgeyhpbnQpS1NfQ1MsCSJcMDAxJWRcMDAxJWRcMDAzIn0sCS8qIFNldCBzY3JvbGwgcmVnaW9uICovCisgICAgeyhpbnQpS1NfU1IsCSJcMDIzIn0sCQkvKiBTY3JvbGwgdGV4dCBkb3duICovCisgICAge0tfVVAsCQkiXDIxNyJ9LAorICAgIHtLX0RPV04sCQkiXDIxNiJ9LAorICAgIHtLX0xFRlQsCQkiXDIxNCJ9LAorICAgIHtLX1JJR0hULAkJIlwyMTUifSwKKyAgICB7S19TX1VQLAkJIlwyMzcifSwKKyAgICB7S19TX0RPV04sCQkiXDIzNiJ9LAorICAgIHtLX1NfTEVGVCwJCSJcMjM0In0sCisgICAge0tfU19SSUdIVCwJCSJcMjM1In0sCisKKyAgICB7S19GMSwJCSJcMjAxIn0sCisgICAge0tfRjIsCQkiXDIwMiJ9LAorICAgIHtLX0YzLAkJIlwyMDMifSwKKyAgICB7S19GNCwJCSJcMjA0In0sCisgICAge0tfRjUsCQkiXDIwNSJ9LAorICAgIHtLX0Y2LAkJIlwyMDYifSwKKyAgICB7S19GNywJCSJcMjA3In0sCisgICAge0tfRjgsCQkiXDIxMCJ9LAorICAgIHtLX0Y5LAkJIlwyMTEifSwKKyAgICB7S19GMTAsCQkiXDMxMiJ9LAorICAgIHtLX0YxMSwJCSJcMzEzIn0sCisgICAge0tfRjEyLAkJIlwzMTQifSwKKyAgICB7S19TX0YxLAkJIlwyMjEifSwKKyAgICB7S19TX0YyLAkJIlwyMjIifSwKKyAgICB7S19TX0YzLAkJIlwyMjMifSwKKyAgICB7S19TX0Y0LAkJIlwyMjQifSwKKyAgICB7S19TX0Y1LAkJIlwyMjUifSwKKyAgICB7S19TX0Y2LAkJIlwyMjYifSwKKyAgICB7S19TX0Y3LAkJIlwyMjcifSwKKyAgICB7S19TX0Y4LAkJIlwyMzAifSwKKyAgICB7S19TX0Y5LAkJIlwyMzEifSwKKyAgICB7S19TX0YxMCwJCSJcMzMyIn0sCisgICAge0tfU19GMTEsCQkiXDMzMyJ9LAorICAgIHtLX1NfRjEyLAkJIlwzMzQifSwKKyAgICB7S19CUywJCSJcMDEwIn0sCisgICAge0tfSU5TLAkJIlwzMTUifSwKKyAgICB7S19ERUwsCQkiXDE3NyJ9LAorICAgIHtLX0hPTUUsCQkiXDAzNiJ9LAorICAgIHtLX0VORCwJCSJcMjEzIn0sCisgICAge0tfUEFHRVVQLAkJIlwyMzcifSwKKyAgICB7S19QQUdFRE9XTiwJIlwyMzYifSwKKyMgZW5kaWYJLyogQWNvcm4gdGVybWluYWwgKi8KKworCisjIGlmIGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisvKgorICogQW1pZ2EgY29uc29sZSB3aW5kb3csIGRlZmF1bHQgZm9yIEFtaWdhCisgKi8KKyAgICB7KGludClLU19OQU1FLAkiYW1pZ2EifSwKKyAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAorICAgIHsoaW50KUtTX0NELAkiXDAzM1tKIn0sCisgICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAkiXDAzM1slcDElZEwifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DREwsCSJcMDMzWyVwMSVkTSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAorICAgIHsoaW50KUtTX1ZJLAkiXDAzM1swIHAifSwKKyAgICB7KGludClLU19WRSwJIlwwMzNbMSBwIn0sCisgICAgeyhpbnQpS1NfTUUsCSJcMDMzWzBtIn0sCisgICAgeyhpbnQpS1NfTVIsCSJcMDMzWzdtIn0sCisgICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzWzBtIn0sCisgICAgeyhpbnQpS1NfU08sCSJcMDMzWzMzbSJ9LAorICAgIHsoaW50KUtTX1VTLAkiXDAzM1s0bSJ9LAorICAgIHsoaW50KUtTX1VFLAkiXDAzM1swbSJ9LAorICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbM20ifSwKKyAgICB7KGludClLU19DWlIsCSJcMDMzWzBtIn0sCisjaWYgZGVmaW5lZChfX01PUlBIT1NfXykgfHwgZGVmaW5lZChfX0FST1NfXykKKyAgICB7KGludClLU19DQ08sCSI4In0sCQkvKiBhbGxvdyA4IGNvbG9ycyAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLworI2VuZGlmCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCisgICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCisgICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DTSwJIlwwMzNbJWklZDslZEgifSwKKyMgIGVuZGlmCisjaWYgZGVmaW5lZChfX01PUlBIT1NfXykKKyAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCisjZW5kaWYKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slcDElZEMifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAorIyAgZW5kaWYKKyAgICB7S19VUCwJCSJcMjMzQSJ9LAorICAgIHtLX0RPV04sCQkiXDIzM0IifSwKKyAgICB7S19MRUZULAkJIlwyMzNEIn0sCisgICAge0tfUklHSFQsCQkiXDIzM0MifSwKKyAgICB7S19TX1VQLAkJIlwyMzNUIn0sCisgICAge0tfU19ET1dOLAkJIlwyMzNTIn0sCisgICAge0tfU19MRUZULAkJIlwyMzMgQSJ9LAorICAgIHtLX1NfUklHSFQsCQkiXDIzMyBAIn0sCisgICAge0tfU19UQUIsCQkiXDIzM1oifSwKKyAgICB7S19GMSwJCSJcMjMzXDA2MH4ifSwvKiBzb21lIGNvbXBpbGVycyBkb24ndCBkaWcgIlwyMzMwIiAqLworICAgIHtLX0YyLAkJIlwyMzNcMDYxfiJ9LAorICAgIHtLX0YzLAkJIlwyMzNcMDYyfiJ9LAorICAgIHtLX0Y0LAkJIlwyMzNcMDYzfiJ9LAorICAgIHtLX0Y1LAkJIlwyMzNcMDY0fiJ9LAorICAgIHtLX0Y2LAkJIlwyMzNcMDY1fiJ9LAorICAgIHtLX0Y3LAkJIlwyMzNcMDY2fiJ9LAorICAgIHtLX0Y4LAkJIlwyMzNcMDY3fiJ9LAorICAgIHtLX0Y5LAkJIlwyMzNcMDcwfiJ9LAorICAgIHtLX0YxMCwJCSJcMjMzXDA3MX4ifSwKKyAgICB7S19TX0YxLAkJIlwyMzNcMDYxXDA2MH4ifSwKKyAgICB7S19TX0YyLAkJIlwyMzNcMDYxXDA2MX4ifSwKKyAgICB7S19TX0YzLAkJIlwyMzNcMDYxXDA2Mn4ifSwKKyAgICB7S19TX0Y0LAkJIlwyMzNcMDYxXDA2M34ifSwKKyAgICB7S19TX0Y1LAkJIlwyMzNcMDYxXDA2NH4ifSwKKyAgICB7S19TX0Y2LAkJIlwyMzNcMDYxXDA2NX4ifSwKKyAgICB7S19TX0Y3LAkJIlwyMzNcMDYxXDA2Nn4ifSwKKyAgICB7S19TX0Y4LAkJIlwyMzNcMDYxXDA2N34ifSwKKyAgICB7S19TX0Y5LAkJIlwyMzNcMDYxXDA3MH4ifSwKKyAgICB7S19TX0YxMCwJCSJcMjMzXDA2MVwwNzF+In0sCisgICAge0tfSEVMUCwJCSJcMjMzP34ifSwKKyAgICB7S19JTlMsCQkiXDIzM1wwNjRcMDYwfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCisgICAge0tfUEFHRVVQLAkJIlwyMzNcMDY0XDA2MX4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLworICAgIHtLX1BBR0VET1dOLAkiXDIzM1wwNjRcMDYyfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCisgICAge0tfSE9NRSwJCSJcMjMzXDA2NFwwNjR+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KKyAgICB7S19FTkQsCQkiXDIzM1wwNjRcMDY1fiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCisKKyAgICB7QlRfRVhUUkFfS0VZUywJIiJ9LAorICAgIHtURVJNQ0FQMktFWSgnIycsICcyJyksICJcMjMzXDA2NVwwNjR+In0sCS8qIHNoaWZ0ZWQgaG9tZSBrZXkgKi8KKyAgICB7VEVSTUNBUDJLRVkoJyMnLCAnMycpLCAiXDIzM1wwNjVcMDYwfiJ9LAkvKiBzaGlmdGVkIGluc2VydCBrZXkgKi8KKyAgICB7VEVSTUNBUDJLRVkoJyonLCAnNycpLCAiXDIzM1wwNjVcMDY1fiJ9LAkvKiBzaGlmdGVkIGVuZCBrZXkgKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKF9fQkVPU19fKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQorLyoKKyAqIGFsbW9zdCBzdGFuZGFyZCBBTlNJIHRlcm1pbmFsLCBkZWZhdWx0IGZvciBiZWJveAorICovCisgICAgeyhpbnQpS1NfTkFNRSwJImJlb3MtYW5zaSJ9LAorICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCisgICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKKyAgICB7KGludClLU19BTCwJIlwwMzNbTCJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAkiXDAzM1tNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKKyMgIGVuZGlmCisjaWZkZWYgQkVPU19QUl9PUl9CRVRURVIKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJWQ7JWRyIn0sCS8qIHNjcm9sbCByZWdpb24gKi8KKyMgIGVuZGlmCisjZW5kaWYKKyAgICB7KGludClLU19DTCwJIlwwMzNbSFwwMzNbMkoifSwKKyNpZmRlZiBub3R5ZXQKKyAgICB7KGludClLU19WSSwJIltWSV0ifSwgLyogY3Vyc29yIGludmlzaWJsZSwgVlQzMjA6IENTSSA/IDI1IGwgKi8KKyAgICB7KGludClLU19WRSwJIltWRV0ifSwgLyogY3Vyc29yIHZpc2libGUsIFZUMzIwOiBDU0kgPyAyNSBoICovCisjZW5kaWYKKyAgICB7KGludClLU19NRSwJIlwwMzNbbSJ9LAkvKiBub3JtYWwgbW9kZSAqLworICAgIHsoaW50KUtTX01SLAkiXDAzM1s3bSJ9LAkvKiByZXZlcnNlICovCisgICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCS8qIGJvbGQgKi8KKyAgICB7KGludClLU19TTywJIlwwMzNbMzFtIn0sCS8qIHN0YW5kb3V0IG1vZGU6IHJlZCAqLworICAgIHsoaW50KUtTX1NFLAkiXDAzM1ttIn0sCS8qIHN0YW5kb3V0IGVuZCAqLworICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbMzVtIn0sCS8qIGl0YWxpYzogcHVycGxlICovCisgICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1ttIn0sCS8qIGl0YWxpYyBlbmQgKi8KKyAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwJLyogdW5kZXJzY29yZSBtb2RlICovCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzW20ifSwJLyogdW5kZXJzY29yZSBlbmQgKi8KKyAgICB7KGludClLU19DQ08sCSI4In0sCQkvKiBhbGxvdyA4IGNvbG9ycyAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLworICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogc2FmZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KKyAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slZEMifSwKKyMgIGVuZGlmCisjaWYgZGVmaW5lZChCRU9TX0RSOCkKKyAgICB7KGludClLU19EQiwJIiJ9LAkJLyogaGFjayEgc2VlIHNjcmVlbi5jICovCisjZW5kaWYKKworICAgIHtLX1VQLAkJIlwwMzNbQSJ9LAorICAgIHtLX0RPV04sCQkiXDAzM1tCIn0sCisgICAge0tfTEVGVCwJCSJcMDMzW0QifSwKKyAgICB7S19SSUdIVCwJCSJcMDMzW0MifSwKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoU09NRV9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCisvKgorICogc3RhbmRhcmQgQU5TSSB0ZXJtaW5hbCwgZGVmYXVsdCBmb3IgdW5peAorICovCisgICAgeyhpbnQpS1NfTkFNRSwJImFuc2kifSwKKyAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAorICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1tMIiwgRVNDX1NUUiAiW0wiKX0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVkTCIsIEVTQ19TVFIgIlslZEwiKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1tNIiwgRVNDX1NUUiAiW00iKX0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVkTSIsIEVTQ19TVFIgIlslZE0iKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM1tIXDAzM1sySiIsIEVTQ19TVFIgIltIIiBFU0NfU1RSX25jICJbMkoiKX0sCisgICAgeyhpbnQpS1NfTUUsCUlGX0VCKCJcMDMzWzBtIiwgRVNDX1NUUiAiWzBtIil9LAorICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCisjICBlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCisvKgorICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIHdoZW4gbmFuc2kuc3lzIG9yIGVxdWl2YWxlbnQgaGFzIGJlZW4gaW5zdGFsbGVkLgorICogRnVuY3Rpb24ga2V5cyBvbiBhIFBDIGFyZSBwcmVjZWRlZCB3aXRoIGEgTlVMLiBUaGVzZSBhcmUgY29udmVydGVkIGludG8KKyAqIEtfTlVMICdcMzE2JyBpbiBtY2hfaW5jaGFyKCksIGJlY2F1c2Ugd2UgY2Fubm90IGhhbmRsZSBOVUxzIGluIGtleSBjb2Rlcy4KKyAqIENUUkwtYXJyb3cgaXMgdXNlZCBpbnN0ZWFkIG9mIFNISUZULWFycm93LgorICovCisjaWZkZWYgX19FTVhfXworICAgIHsoaW50KUtTX05BTUUsCSJvczJhbnNpIn0sCisjZWxzZQorICAgIHsoaW50KUtTX05BTUUsCSJwY2Fuc2kifSwKKyAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAorICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCisjZW5kaWYKKyAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAorICAgIHsoaW50KUtTX0NMLAkiXDAzM1sySiJ9LAorICAgIHsoaW50KUtTX01FLAkiXDAzM1swbSJ9LAorICAgIHsoaW50KUtTX01SLAkiXDAzM1s1bSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyZXkgKi8KKyAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwJLyogYm9sZDogd2hpdGUgdGV4dCAqLworICAgIHsoaW50KUtTX1NFLAkiXDAzM1swbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KKyAgICB7KGludClLU19TTywJIlwwMzNbMzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCisgICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szNDs0M20ifSwJLyogaXRhbGljIG1vZGU6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KKyAgICB7KGludClLU19DWlIsCSJcMDMzWzBtIn0sCS8qIGl0YWxpYyBtb2RlIGVuZCAqLworICAgIHsoaW50KUtTX1VTLAkiXDAzM1szNjs0MW0ifSwJLyogdW5kZXJzY29yZSBtb2RlOiBjeWFuIHRleHQgb24gcmVkICovCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzWzBtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSBlbmQgKi8KKyAgICB7KGludClLU19DQ08sCSI4In0sCQkvKiBhbGxvdyA4IGNvbG9ycyAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX09QLAkiXDAzM1swbSJ9LAkvKiByZXNldCBjb2xvcnMgKi8KKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAorIyAgZW5kaWYKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slcDElZEMifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAorIyAgZW5kaWYKKyAgICB7S19VUCwJCSJcMzE2SCJ9LAorICAgIHtLX0RPV04sCQkiXDMxNlAifSwKKyAgICB7S19MRUZULAkJIlwzMTZLIn0sCisgICAge0tfUklHSFQsCQkiXDMxNk0ifSwKKyAgICB7S19TX0xFRlQsCQkiXDMxNnMifSwKKyAgICB7S19TX1JJR0hULAkJIlwzMTZ0In0sCisgICAge0tfRjEsCQkiXDMxNjsifSwKKyAgICB7S19GMiwJCSJcMzE2PCJ9LAorICAgIHtLX0YzLAkJIlwzMTY9In0sCisgICAge0tfRjQsCQkiXDMxNj4ifSwKKyAgICB7S19GNSwJCSJcMzE2PyJ9LAorICAgIHtLX0Y2LAkJIlwzMTZAIn0sCisgICAge0tfRjcsCQkiXDMxNkEifSwKKyAgICB7S19GOCwJCSJcMzE2QiJ9LAorICAgIHtLX0Y5LAkJIlwzMTZDIn0sCisgICAge0tfRjEwLAkJIlwzMTZEIn0sCisgICAge0tfRjExLAkJIlwzMTZcMjA1In0sCS8qIGd1ZXNzZWQgKi8KKyAgICB7S19GMTIsCQkiXDMxNlwyMDYifSwJLyogZ3Vlc3NlZCAqLworICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKKyAgICB7S19TX0YyLAkJIlwzMTZVIn0sCisgICAge0tfU19GMywJCSJcMzE2ViJ9LAorICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKKyAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCisgICAge0tfU19GNiwJCSJcMzE2WSJ9LAorICAgIHtLX1NfRjcsCQkiXDMxNloifSwKKyAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCisgICAge0tfU19GOSwJCSJcMzE2XFwifSwKKyAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAorICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCS8qIGd1ZXNzZWQgKi8KKyAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAkvKiBndWVzc2VkICovCisgICAge0tfSU5TLAkJIlwzMTZSIn0sCisgICAge0tfREVMLAkJIlwzMTZTIn0sCisgICAge0tfSE9NRSwJCSJcMzE2RyJ9LAorICAgIHtLX0VORCwJCSJcMzE2TyJ9LAorICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKKyAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKE1TRE9TKQorLyoKKyAqIFRoZXNlIGNvZGVzIGFyZSB2YWxpZCBmb3IgdGhlIHBjIHZpZGVvLiAgVGhlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIEVTQyB8CisgKiBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvbmlvIGNhbGxzIGluIG9zX21zZG9zLmMuIERlZmF1bHQgZm9yIE1TRE9TLgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJInBjdGVybSJ9LAorICAgIHsoaW50KUtTX0NFLAkiXDAzM3xLIn0sCisgICAgeyhpbnQpS1NfQUwsCSJcMDMzfEwifSwKKyAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwKKyMgICBpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIHsoaW50KUtTX0NTViwJIlwwMzN8JWklcDElZDslcDIlZFYifSwKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVkOyVkciJ9LAorIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgeyhpbnQpS1NfQ1NWLAkiXDAzM3wlaSVkOyVkViJ9LAorIyAgIGVuZGlmCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAkiXDAzM3xKIn0sCisgICAgeyhpbnQpS1NfTUUsCSJcMDMzfDBtIn0sCS8qIG5vcm1hbCAqLworICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JleSAqLworICAgIHsoaW50KUtTX01ELAkiXDAzM3wxNW0ifSwJLyogYm9sZDogd2hpdGUgdGV4dCAqLworICAgIHsoaW50KUtTX1NFLAkiXDAzM3wwbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KKyAgICB7KGludClLU19TTywJIlwwMzN8MzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCisgICAgeyhpbnQpS1NfQ1pILAkiXDAzM3wyMjVtIn0sCS8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCisgICAgeyhpbnQpS1NfQ1pSLAkiXDAzM3wwbSJ9LAkvKiBpdGFsaWMgbW9kZSBlbmQgKi8KKyAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZTogY3lhbiB0ZXh0IG9uIHJlZCAqLworICAgIHsoaW50KUtTX1VFLAkiXDAzM3wwbSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGUgZW5kICovCisgICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCS8qIGFsbG93IDE2IGNvbG9ycyAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JXAxJWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzfCVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLworIyAgZW5kaWYKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVwMSVkOyVwMiVkSCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LAorIyAgZW5kaWYKKyNpZmRlZiBESkdQUAorICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCisjZW5kaWYKKyAgICB7S19VUCwJCSJcMzE2SCJ9LAorICAgIHtLX0RPV04sCQkiXDMxNlAifSwKKyAgICB7S19MRUZULAkJIlwzMTZLIn0sCisgICAge0tfUklHSFQsCQkiXDMxNk0ifSwKKyAgICB7S19TX0xFRlQsCQkiXDMxNnMifSwKKyAgICB7S19TX1JJR0hULAkJIlwzMTZ0In0sCisgICAge0tfU19UQUIsCQkiXDMxNlwwMTcifSwKKyAgICB7S19GMSwJCSJcMzE2OyJ9LAorICAgIHtLX0YyLAkJIlwzMTY8In0sCisgICAge0tfRjMsCQkiXDMxNj0ifSwKKyAgICB7S19GNCwJCSJcMzE2PiJ9LAorICAgIHtLX0Y1LAkJIlwzMTY/In0sCisgICAge0tfRjYsCQkiXDMxNkAifSwKKyAgICB7S19GNywJCSJcMzE2QSJ9LAorICAgIHtLX0Y4LAkJIlwzMTZCIn0sCisgICAge0tfRjksCQkiXDMxNkMifSwKKyAgICB7S19GMTAsCQkiXDMxNkQifSwKKyAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwKKyAgICB7S19GMTIsCQkiXDMxNlwyMDYifSwKKyAgICB7S19TX0YxLAkJIlwzMTZUIn0sCisgICAge0tfU19GMiwJCSJcMzE2VSJ9LAorICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKKyAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCisgICAge0tfU19GNSwJCSJcMzE2WCJ9LAorICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKKyAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCisgICAge0tfU19GOCwJCSJcMzE2WyJ9LAorICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCisgICAge0tfU19GMTAsCQkiXDMxNl0ifSwKKyAgICB7S19TX0YxMSwJCSJcMzE2XDIwNyJ9LAorICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCisgICAge0tfSU5TLAkJIlwzMTZSIn0sCisgICAge0tfREVMLAkJIlwzMTZTIn0sCisgICAge0tfSE9NRSwJCSJcMzE2RyJ9LAorICAgIHtLX0VORCwJCSJcMzE2TyJ9LAorICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKKyAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKKyAgICB7S19LUExVUywJCSJcMzE2TiJ9LAorICAgIHtLX0tNSU5VUywJCSJcMzE2SiJ9LAorICAgIHtLX0tNVUxUSVBMWSwJIlwzMTY3In0sCisgICAge0tfSzAsCQkiXDMxNlwzMzIifSwKKyAgICB7S19LMSwJCSJcMzE2XDMzNiJ9LAorICAgIHtLX0syLAkJIlwzMTZcMzQyIn0sCisgICAge0tfSzMsCQkiXDMxNlwzNDYifSwKKyAgICB7S19LNCwJCSJcMzE2XDM1MiJ9LAorICAgIHtLX0s1LAkJIlwzMTZcMzU2In0sCisgICAge0tfSzYsCQkiXDMxNlwzNjIifSwKKyAgICB7S19LNywJCSJcMzE2XDM2NiJ9LAorICAgIHtLX0s4LAkJIlwzMTZcMzcyIn0sCisgICAge0tfSzksCQkiXDMxNlwzNzYifSwKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKKy8qCisgKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgZm9yIHRoZSBXaW4zMiBDb25zb2xlIC4gIFRoZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aAorICogRVNDIHwgYXJlIHRyYW5zbGF0ZWQgaW50byBjb25zb2xlIGNhbGxzIGluIG9zX3dpbjMyLmMuICBUaGUgZnVuY3Rpb24ga2V5cworICogYXJlIGFsc28gdHJhbnNsYXRlZCBpbiBvc193aW4zMi5jLgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJIndpbjMyIn0sCisgICAgeyhpbnQpS1NfQ0UsCSJcMDMzfEsifSwJLyogY2xlYXIgdG8gZW5kIG9mIGxpbmUgKi8KKyAgICB7KGludClLU19BTCwJIlwwMzN8TCJ9LAkvKiBhZGQgbmV3IGJsYW5rIGxpbmUgKi8KKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAkiXDAzM3wlcDElZEwifSwJLyogYWRkIG51bWJlciBvZiBuZXcgYmxhbmsgbGluZXMgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUwsCSJcMDMzfCVkTCJ9LAkvKiBhZGQgbnVtYmVyIG9mIG5ldyBibGFuayBsaW5lcyAqLworIyAgZW5kaWYKKyAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAkvKiBkZWxldGUgbGluZSAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DREwsCSJcMDMzfCVwMSVkTSJ9LAkvKiBkZWxldGUgbnVtYmVyIG9mIGxpbmVzICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM3wlZE0ifSwJLyogZGVsZXRlIG51bWJlciBvZiBsaW5lcyAqLworIyAgZW5kaWYKKyAgICB7KGludClLU19DTCwJIlwwMzN8SiJ9LAkvKiBjbGVhciBzY3JlZW4gKi8KKyAgICB7KGludClLU19DRCwJIlwwMzN8aiJ9LAkvKiBjbGVhciB0byBlbmQgb2YgZGlzcGxheSAqLworICAgIHsoaW50KUtTX1ZJLAkiXDAzM3x2In0sCS8qIGN1cnNvciBpbnZpc2libGUgKi8KKyAgICB7KGludClLU19WRSwJIlwwMzN8ViJ9LAkvKiBjdXJzb3IgdmlzaWJsZSAqLworCisgICAgeyhpbnQpS1NfTUUsCSJcMDMzfDBtIn0sCS8qIG5vcm1hbCAqLworICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JheSAqLworICAgIHsoaW50KUtTX01ELAkiXDAzM3wxNW0ifSwJLyogYm9sZDogd2hpdGUgb24gYmxhY2sgKi8KKyNpZiAxCisgICAgeyhpbnQpS1NfU08sCSJcMDMzfDMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLworICAgIHsoaW50KUtTX1NFLAkiXDAzM3wwbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KKyNlbHNlCisgICAgeyhpbnQpS1NfU08sCSJcMDMzfEYifSwJLyogc3RhbmRvdXQ6IGhpZ2ggaW50ZW5zaXR5ICovCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzfGYifSwJLyogc3RhbmRvdXQgZW5kICovCisjZW5kaWYKKyAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljOiBibHVlIHRleHQgb24geWVsbG93ICovCisgICAgeyhpbnQpS1NfQ1pSLAkiXDAzM3wwbSJ9LAkvKiBpdGFsaWMgZW5kICovCisgICAgeyhpbnQpS1NfVVMsCSJcMDMzfDY3bSJ9LAkvKiB1bmRlcnNjb3JlOiBjeWFuIHRleHQgb24gcmVkICovCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgZW5kICovCisgICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCS8qIGFsbG93IDE2IGNvbG9ycyAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JXAxJWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzfCVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLworIyAgZW5kaWYKKworICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogc2F2ZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KKyAgICB7KGludClLU19VVCwJInkifSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVwMSVkOyVwMiVkSCJ9LC8qIGN1cnNvciBtb3Rpb24gKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DTSwJIlwwMzN8JWklZDslZEgifSwvKiBjdXJzb3IgbW90aW9uICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCisgICAgeyhpbnQpS1NfVEksCSJcMDMzfFMifSwJLyogcHV0IHRlcm1pbmFsIGluIHRlcm1jYXAgbW9kZSAqLworICAgIHsoaW50KUtTX1RFLAkiXDAzM3xFIn0sCS8qIG91dCBvZiB0ZXJtY2FwIG1vZGUgKi8KKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJXAxJWQ7JXAyJWRyIn0sLyogc2Nyb2xsIHJlZ2lvbiAqLworIyAgZWxzZQorICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVkOyVkciJ9LC8qIHNjcm9sbCByZWdpb24gKi8KKyMgIGVuZGlmCisKKyAgICB7S19VUCwJCSJcMzE2SCJ9LAorICAgIHtLX0RPV04sCQkiXDMxNlAifSwKKyAgICB7S19MRUZULAkJIlwzMTZLIn0sCisgICAge0tfUklHSFQsCQkiXDMxNk0ifSwKKyAgICB7S19TX1VQLAkJIlwzMTZcMzA0In0sCisgICAge0tfU19ET1dOLAkJIlwzMTZcMzE3In0sCisgICAge0tfU19MRUZULAkJIlwzMTZcMzExIn0sCisgICAge0tfQ19MRUZULAkJIlwzMTZzIn0sCisgICAge0tfU19SSUdIVCwJCSJcMzE2XDMxMyJ9LAorICAgIHtLX0NfUklHSFQsCQkiXDMxNnQifSwKKyAgICB7S19TX1RBQiwJCSJcMzE2XDAxNyJ9LAorICAgIHtLX0YxLAkJIlwzMTY7In0sCisgICAge0tfRjIsCQkiXDMxNjwifSwKKyAgICB7S19GMywJCSJcMzE2PSJ9LAorICAgIHtLX0Y0LAkJIlwzMTY+In0sCisgICAge0tfRjUsCQkiXDMxNj8ifSwKKyAgICB7S19GNiwJCSJcMzE2QCJ9LAorICAgIHtLX0Y3LAkJIlwzMTZBIn0sCisgICAge0tfRjgsCQkiXDMxNkIifSwKKyAgICB7S19GOSwJCSJcMzE2QyJ9LAorICAgIHtLX0YxMCwJCSJcMzE2RCJ9LAorICAgIHtLX0YxMSwJCSJcMzE2XDIwNSJ9LAorICAgIHtLX0YxMiwJCSJcMzE2XDIwNiJ9LAorICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKKyAgICB7S19TX0YyLAkJIlwzMTZVIn0sCisgICAge0tfU19GMywJCSJcMzE2ViJ9LAorICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKKyAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCisgICAge0tfU19GNiwJCSJcMzE2WSJ9LAorICAgIHtLX1NfRjcsCQkiXDMxNloifSwKKyAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCisgICAge0tfU19GOSwJCSJcMzE2XFwifSwKKyAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAorICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCisgICAge0tfU19GMTIsCQkiXDMxNlwyMTAifSwKKyAgICB7S19JTlMsCQkiXDMxNlIifSwKKyAgICB7S19ERUwsCQkiXDMxNlMifSwKKyAgICB7S19IT01FLAkJIlwzMTZHIn0sCisgICAge0tfU19IT01FLAkJIlwzMTZcMzAyIn0sCisgICAge0tfQ19IT01FLAkJIlwzMTZ3In0sCisgICAge0tfRU5ELAkJIlwzMTZPIn0sCisgICAge0tfU19FTkQsCQkiXDMxNlwzMTUifSwKKyAgICB7S19DX0VORCwJCSJcMzE2dSJ9LAorICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKKyAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKKyAgICB7S19LUExVUywJCSJcMzE2TiJ9LAorICAgIHtLX0tNSU5VUywJCSJcMzE2SiJ9LAorICAgIHtLX0tNVUxUSVBMWSwJIlwzMTZcMDY3In0sCisgICAge0tfSzAsCQkiXDMxNlwzMzIifSwKKyAgICB7S19LMSwJCSJcMzE2XDMzNiJ9LAorICAgIHtLX0syLAkJIlwzMTZcMzQyIn0sCisgICAge0tfSzMsCQkiXDMxNlwzNDYifSwKKyAgICB7S19LNCwJCSJcMzE2XDM1MiJ9LAorICAgIHtLX0s1LAkJIlwzMTZcMzU2In0sCisgICAge0tfSzYsCQkiXDMxNlwzNjIifSwKKyAgICB7S19LNywJCSJcMzE2XDM2NiJ9LAorICAgIHtLX0s4LAkJIlwzMTZcMzcyIn0sCisgICAge0tfSzksCQkiXDMxNlwzNzYifSwKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKKy8qCisgKiBWVDMyMCBpcyB3b3JraW5nIGFzIGFuIEFOU0kgdGVybWluYWwgY29tcGF0aWJsZSBERUMgdGVybWluYWwuCisgKiAoaXQgY292ZXJzIFZUMXgwLCBWVDJ4MCBhbmQgVlQzeDAgdXAgdG8gVlQzMjAgb24gVk1TIGFzIHdlbGwpCisgKiBOb3RlOiBLX0YxLi4uS19GNSBhcmUgZm9yIGludGVybmFsIHVzZSwgc2hvdWxkIG5vdCBiZSBkZWZpbmVkLgorICogVE9ETzotIHJld3JpdGUgRVNDWyBjb2RlcyB0byBDU0kKKyAqICAgICAgLSBrZXlib2FyZCBsYW5ndWFnZXMgKENTSSA/IDI2IG4pCisgKi8KKyAgICB7KGludClLU19OQU1FLAkidnQzMjAifSwKKyAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAorICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1tMIiwgRVNDX1NUUiAiW0wiKX0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVkTCIsIEVTQ19TVFIgIlslZEwiKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM1tNIiwgRVNDX1NUUiAiW00iKX0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVkTSIsIEVTQ19TVFIgIlslZE0iKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM1tIXDAzM1sySiIsIEVTQ19TVFIgIltIIiBFU0NfU1RSX25jICJbMkoiKX0sCisgICAgeyhpbnQpS1NfTUUsCUlGX0VCKCJcMDMzWzBtIiwgRVNDX1NUUiAiWzBtIil9LAorICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsCisJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCisjICBlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAorIyAgZW5kaWYKKyAgICB7S19VUCwJCUlGX0VCKCJcMDMzW0EiLCBFU0NfU1RSICJbQSIpfSwKKyAgICB7S19ET1dOLAkJSUZfRUIoIlwwMzNbQiIsIEVTQ19TVFIgIltCIil9LAorICAgIHtLX1JJR0hULAkJSUZfRUIoIlwwMzNbQyIsIEVTQ19TVFIgIltDIil9LAorICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM1tEIiwgRVNDX1NUUiAiW0QiKX0sCisgICAge0tfRjYsCQlJRl9FQigiXDAzM1sxN34iLCBFU0NfU1RSICJbMTd+Iil9LAorICAgIHtLX0Y3LAkJSUZfRUIoIlwwMzNbMTh+IiwgRVNDX1NUUiAiWzE4fiIpfSwKKyAgICB7S19GOCwJCUlGX0VCKCJcMDMzWzE5fiIsIEVTQ19TVFIgIlsxOX4iKX0sCisgICAge0tfRjksCQlJRl9FQigiXDAzM1syMH4iLCBFU0NfU1RSICJbMjB+Iil9LAorICAgIHtLX0YxMCwJCUlGX0VCKCJcMDMzWzIxfiIsIEVTQ19TVFIgIlsyMX4iKX0sCisvKiAge0tfRjExLAkJSUZfRUIoIlwwMzNbMjN+IiwgRVNDX1NUUiAiWzIzfiIpfSwKKwkJCSogIChFU0MpIHNob3VsZCBub3QgZGVmaW5lLCBzb21ldGltZXMgZG9lcyBub3Qgd29yayAqLworICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0fiIsIEVTQ19TVFIgIlsyNH4iKX0sCisgICAge0tfRjEzLAkJSUZfRUIoIlwwMzNbMjV+IiwgRVNDX1NUUiAiWzI1fiIpfSwKKyAgICB7S19GMTQsCQlJRl9FQigiXDAzM1syNn4iLCBFU0NfU1RSICJbMjZ+Iil9LAorICAgIHtLX0YxNSwJCUlGX0VCKCJcMDMzWzI4fiIsIEVTQ19TVFIgIlsyOH4iKX0sCS8qIEhlbHAgKi8KKyAgICB7S19GMTYsCQlJRl9FQigiXDAzM1syOX4iLCBFU0NfU1RSICJbMjl+Iil9LAkvKiBTZWxlY3QgKi8KKyAgICB7S19GMTcsCQlJRl9FQigiXDAzM1szMX4iLCBFU0NfU1RSICJbMzF+Iil9LAorICAgIHtLX0YxOCwJCUlGX0VCKCJcMDMzWzMyfiIsIEVTQ19TVFIgIlszMn4iKX0sCisgICAge0tfRjE5LAkJSUZfRUIoIlwwMzNbMzN+IiwgRVNDX1NUUiAiWzMzfiIpfSwKKyAgICB7S19GMjAsCQlJRl9FQigiXDAzM1szNH4iLCBFU0NfU1RSICJbMzR+Iil9LAorICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzWzJ+IiwgRVNDX1NUUiAiWzJ+Iil9LAorICAgIHtLX0RFTCwJCUlGX0VCKCJcMDMzWzN+IiwgRVNDX1NUUiAiWzN+Iil9LAorICAgIHtLX0hPTUUsCQlJRl9FQigiXDAzM1sxfiIsIEVTQ19TVFIgIlsxfiIpfSwKKyAgICB7S19FTkQsCQlJRl9FQigiXDAzM1s0fiIsIEVTQ19TVFIgIls0fiIpfSwKKyAgICB7S19QQUdFVVAsCQlJRl9FQigiXDAzM1s1fiIsIEVTQ19TVFIgIls1fiIpfSwKKyAgICB7S19QQUdFRE9XTiwJSUZfRUIoIlwwMzNbNn4iLCBFU0NfU1RSICJbNn4iKX0sCisgICAge0tfS1BMVVMsCQlJRl9FQigiXDAzM09rIiwgRVNDX1NUUiAiT2siKX0sCS8qIGtleXBhZCBwbHVzICovCisgICAge0tfS01JTlVTLAkJSUZfRUIoIlwwMzNPbSIsIEVTQ19TVFIgIk9tIil9LAkvKiBrZXlwYWQgbWludXMgKi8KKyAgICB7S19LRElWSURFLAkJSUZfRUIoIlwwMzNPbyIsIEVTQ19TVFIgIk9vIil9LAkvKiBrZXlwYWQgLyAqLworICAgIHtLX0tNVUxUSVBMWSwJSUZfRUIoIlwwMzNPaiIsIEVTQ19TVFIgIk9qIil9LAkvKiBrZXlwYWQgKiAqLworICAgIHtLX0tFTlRFUiwJCUlGX0VCKCJcMDMzT00iLCBFU0NfU1RSICJPTSIpfSwJLyoga2V5cGFkIEVudGVyICovCisgICAge0tfQlMsCQkiXHg3ZiJ9LAkvKiBmb3Igc29tZSByZWFzb24gMDE3NyBkb2Vzbid0IHdvcmsgKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fTUlOVF9fKQorLyoKKyAqIE9yZGluYXJ5IHZ0NTIKKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJ2dDUyIn0sCisgICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzSyIsIEVTQ19TVFIgIksiKX0sCisgICAgeyhpbnQpS1NfQ0QsCUlGX0VCKCJcMDMzSiIsIEVTQ19TVFIgIkoiKX0sCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWSUrICUrICIsIEVTQ19TVFIgIlklKyAlKyAiKX0sCisgICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAorIyAgaWZkZWYgX19NSU5UX18KKyAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNMIiwgRVNDX1NUUiAiTCIpfSwKKyAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNNIiwgRVNDX1NUUiAiTSIpfSwKKyAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzNFIiwgRVNDX1NUUiAiRSIpfSwKKyAgICB7KGludClLU19TUiwJSUZfRUIoIlwwMzNJIiwgRVNDX1NUUiAiSSIpfSwKKyAgICB7KGludClLU19WRSwJSUZfRUIoIlwwMzNlIiwgRVNDX1NUUiAiZSIpfSwKKyAgICB7KGludClLU19WSSwJSUZfRUIoIlwwMzNmIiwgRVNDX1NUUiAiZiIpfSwKKyAgICB7KGludClLU19TTywJSUZfRUIoIlwwMzNwIiwgRVNDX1NUUiAicCIpfSwKKyAgICB7KGludClLU19TRSwJSUZfRUIoIlwwMzNxIiwgRVNDX1NUUiAicSIpfSwKKyAgICB7S19VUCwJCUlGX0VCKCJcMDMzQSIsIEVTQ19TVFIgIkEiKX0sCisgICAge0tfRE9XTiwJCUlGX0VCKCJcMDMzQiIsIEVTQ19TVFIgIkIiKX0sCisgICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzRCIsIEVTQ19TVFIgIkQiKX0sCisgICAge0tfUklHSFQsCQlJRl9FQigiXDAzM0MiLCBFU0NfU1RSICJDIil9LAorICAgIHtLX1NfVVAsCQlJRl9FQigiXDAzM2EiLCBFU0NfU1RSICJhIil9LAorICAgIHtLX1NfRE9XTiwJCUlGX0VCKCJcMDMzYiIsIEVTQ19TVFIgImIiKX0sCisgICAge0tfU19MRUZULAkJSUZfRUIoIlwwMzNkIiwgRVNDX1NUUiAiZCIpfSwKKyAgICB7S19TX1JJR0hULAkJSUZfRUIoIlwwMzNjIiwgRVNDX1NUUiAiYyIpfSwKKyAgICB7S19GMSwJCUlGX0VCKCJcMDMzUCIsIEVTQ19TVFIgIlAiKX0sCisgICAge0tfRjIsCQlJRl9FQigiXDAzM1EiLCBFU0NfU1RSICJRIil9LAorICAgIHtLX0YzLAkJSUZfRUIoIlwwMzNSIiwgRVNDX1NUUiAiUiIpfSwKKyAgICB7S19GNCwJCUlGX0VCKCJcMDMzUyIsIEVTQ19TVFIgIlMiKX0sCisgICAge0tfRjUsCQlJRl9FQigiXDAzM1QiLCBFU0NfU1RSICJUIil9LAorICAgIHtLX0Y2LAkJSUZfRUIoIlwwMzNVIiwgRVNDX1NUUiAiVSIpfSwKKyAgICB7S19GNywJCUlGX0VCKCJcMDMzViIsIEVTQ19TVFIgIlYiKX0sCisgICAge0tfRjgsCQlJRl9FQigiXDAzM1ciLCBFU0NfU1RSICJXIil9LAorICAgIHtLX0Y5LAkJSUZfRUIoIlwwMzNYIiwgRVNDX1NUUiAiWCIpfSwKKyAgICB7S19GMTAsCQlJRl9FQigiXDAzM1kiLCBFU0NfU1RSICJZIil9LAorICAgIHtLX1NfRjEsCQlJRl9FQigiXDAzM3AiLCBFU0NfU1RSICJwIil9LAorICAgIHtLX1NfRjIsCQlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAorICAgIHtLX1NfRjMsCQlJRl9FQigiXDAzM3IiLCBFU0NfU1RSICJyIil9LAorICAgIHtLX1NfRjQsCQlJRl9FQigiXDAzM3MiLCBFU0NfU1RSICJzIil9LAorICAgIHtLX1NfRjUsCQlJRl9FQigiXDAzM3QiLCBFU0NfU1RSICJ0Iil9LAorICAgIHtLX1NfRjYsCQlJRl9FQigiXDAzM3UiLCBFU0NfU1RSICJ1Iil9LAorICAgIHtLX1NfRjcsCQlJRl9FQigiXDAzM3YiLCBFU0NfU1RSICJ2Iil9LAorICAgIHtLX1NfRjgsCQlJRl9FQigiXDAzM3ciLCBFU0NfU1RSICJ3Iil9LAorICAgIHtLX1NfRjksCQlJRl9FQigiXDAzM3giLCBFU0NfU1RSICJ4Iil9LAorICAgIHtLX1NfRjEwLAkJSUZfRUIoIlwwMzN5IiwgRVNDX1NUUiAieSIpfSwKKyAgICB7S19JTlMsCQlJRl9FQigiXDAzM0kiLCBFU0NfU1RSICJJIil9LAorICAgIHtLX0hPTUUsCQlJRl9FQigiXDAzM0UiLCBFU0NfU1RSICJFIil9LAorICAgIHtLX1BBR0VET1dOLAlJRl9FQigiXDAzM2IiLCBFU0NfU1RSICJiIil9LAorICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzYSIsIEVTQ19TVFIgImEiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzVCIsIEVTQ19TVFIgIlQiKX0sCisgICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzVSIsIEVTQ19TVFIgIlUiKX0sCisgICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzSFwwMzNKIiwgRVNDX1NUUiAiSCIgRVNDX1NUUl9uYyAiSiIpfSwKKyAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNTTyIsIEVTQ19TVFIgIlNPIil9LAorICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1MyIiwgRVNDX1NUUiAiUzIiKX0sCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChTT01FX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKKy8qCisgKiBUaGUgeHRlcm0gdGVybWNhcCBpcyBtaXNzaW5nIEYxNCBhbmQgRjE1LCBiZWNhdXNlIHRoZXkgc2VuZCB0aGUgc2FtZQorICogY29kZXMgYXMgdGhlIHVuZG8gYW5kIGhlbHAga2V5LCBhbHRob3VnaCB0aGV5IGRvbid0IHdvcmsgb24gYWxsIGtleWJvYXJkcy4KKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJ4dGVybSJ9LAorICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM1tLIiwgRVNDX1NUUiAiW0siKX0sCisgICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slcDElZEwiLCBFU0NfU1RSICJbJXAxJWRMIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slcDElZE0iLCBFU0NfU1RSICJbJXAxJWRNIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKKyMgIGVuZGlmCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NTLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkciIsCisJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkciIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzNbJWklZDslZHIiLCBFU0NfU1RSICJbJWklZDslZHIiKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM1tIXDAzM1sySiIsIEVTQ19TVFIgIltIIiBFU0NfU1RSX25jICJbMkoiKX0sCisgICAgeyhpbnQpS1NfQ0QsCUlGX0VCKCJcMDMzW0oiLCBFU0NfU1RSICJbSiIpfSwKKyAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbbSIsIEVTQ19TVFIgIlttIil9LAorICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKKyAgICB7KGludClLU19NRCwJSUZfRUIoIlwwMzNbMW0iLCBFU0NfU1RSICJbMW0iKX0sCisgICAgeyhpbnQpS1NfVUUsCUlGX0VCKCJcMDMzW20iLCBFU0NfU1RSICJbbSIpfSwKKyAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzNbNG0iLCBFU0NfU1RSICJbNG0iKX0sCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCisgICAgeyhpbnQpS1NfVVQsCSJ5In0sCisgICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAorCQkJCQkJICBFU0NfU1RSICJbJWklcDElZDslcDIlZEgiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19TUiwJSUZfRUIoIlwwMzNNIiwgRVNDX1NUUiAiTSIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slcDElZEMiLCBFU0NfU1RSICJbJXAxJWRDIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJWRDIiwgRVNDX1NUUiAiWyVkQyIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfS1MsCUlGX0VCKCJcMDMzWz8xaFwwMzM9IiwgRVNDX1NUUiAiWz8xaCIgRVNDX1NUUl9uYyAiPSIpfSwKKyAgICB7KGludClLU19LRSwJSUZfRUIoIlwwMzNbPzFsXDAzMz4iLCBFU0NfU1RSICJbPzFsIiBFU0NfU1RSX25jICI+Iil9LAorIyAgaWZkZWYgRkVBVF9YVEVSTV9TQVZFCisgICAgeyhpbnQpS1NfVEksCUlGX0VCKCJcMDMzN1wwMzNbPzQ3aCIsIEVTQ19TVFIgIjciIEVTQ19TVFJfbmMgIls/NDdoIil9LAorICAgIHsoaW50KUtTX1RFLAlJRl9FQigiXDAzM1sySlwwMzNbPzQ3bFwwMzM4IiwKKwkJCQkgIEVTQ19TVFIgIlsySiIgRVNDX1NUUl9uYyAiWz80N2wiIEVTQ19TVFJfbmMgIjgiKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NJUywJSUZfRUIoIlwwMzNdMTsiLCBFU0NfU1RSICJdMTsiKX0sCisgICAgeyhpbnQpS1NfQ0lFLAkiXDAwNyJ9LAorICAgIHsoaW50KUtTX1RTLAlJRl9FQigiXDAzM10yOyIsIEVTQ19TVFIgIl0yOyIpfSwKKyAgICB7KGludClLU19GUywJIlwwMDcifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1dTLAlJRl9FQigiXDAzM1s4OyVwMSVkOyVwMiVkdCIsCisJCQkJCQkgIEVTQ19TVFIgIls4OyVwMSVkOyVwMiVkdCIpfSwKKyAgICB7KGludClLU19DV1AsCUlGX0VCKCJcMDMzWzM7JXAxJWQ7JXAyJWR0IiwKKwkJCQkJCSAgRVNDX1NUUiAiWzM7JXAxJWQ7JXAyJWR0Iil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NXUywJSUZfRUIoIlwwMzNbODslZDslZHQiLCBFU0NfU1RSICJbODslZDslZHQiKX0sCisgICAgeyhpbnQpS1NfQ1dQLAlJRl9FQigiXDAzM1szOyVkOyVkdCIsIEVTQ19TVFIgIlszOyVkOyVkdCIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ1JWLAlJRl9FQigiXDAzM1s+YyIsIEVTQ19TVFIgIls+YyIpfSwKKyAgICB7S19VUCwJCUlGX0VCKCJcMDMzT0EiLCBFU0NfU1RSICJPQSIpfSwKKyAgICB7S19ET1dOLAkJSUZfRUIoIlwwMzNPQiIsIEVTQ19TVFIgIk9CIil9LAorICAgIHtLX1JJR0hULAkJSUZfRUIoIlwwMzNPQyIsIEVTQ19TVFIgIk9DIil9LAorICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM09EIiwgRVNDX1NUUiAiT0QiKX0sCisgICAge0tfU19VUCwJCUlGX0VCKCJcMDMzTzJBIiwgRVNDX1NUUiAiTzJBIil9LAorICAgIHtLX1NfRE9XTiwJCUlGX0VCKCJcMDMzTzJCIiwgRVNDX1NUUiAiTzJCIil9LAorICAgIHtLX1NfUklHSFQsCQlJRl9FQigiXDAzM08yQyIsIEVTQ19TVFIgIk8yQyIpfSwKKyAgICB7S19DX1JJR0hULAkJSUZfRUIoIlwwMzNPNUMiLCBFU0NfU1RSICJPNUMiKX0sCisgICAge0tfU19MRUZULAkJSUZfRUIoIlwwMzNPMkQiLCBFU0NfU1RSICJPMkQiKX0sCisgICAge0tfQ19MRUZULAkJSUZfRUIoIlwwMzNPNUQiLCBFU0NfU1RSICJPNUQiKX0sCisgICAgLyogQW4gZXh0cmEgc2V0IG9mIGZ1bmN0aW9uIGtleXMgZm9yIHZ0MTAwIG1vZGUgKi8KKyAgICB7S19YRjEsCQlJRl9FQigiXDAzM09QIiwgRVNDX1NUUiAiT1AiKX0sCisgICAge0tfWEYyLAkJSUZfRUIoIlwwMzNPUSIsIEVTQ19TVFIgIk9RIil9LAorICAgIHtLX1hGMywJCUlGX0VCKCJcMDMzT1IiLCBFU0NfU1RSICJPUiIpfSwKKyAgICB7S19YRjQsCQlJRl9FQigiXDAzM09TIiwgRVNDX1NUUiAiT1MiKX0sCisgICAge0tfRjEsCQlJRl9FQigiXDAzM1sxMX4iLCBFU0NfU1RSICJbMTF+Iil9LAorICAgIHtLX0YyLAkJSUZfRUIoIlwwMzNbMTJ+IiwgRVNDX1NUUiAiWzEyfiIpfSwKKyAgICB7S19GMywJCUlGX0VCKCJcMDMzWzEzfiIsIEVTQ19TVFIgIlsxM34iKX0sCisgICAge0tfRjQsCQlJRl9FQigiXDAzM1sxNH4iLCBFU0NfU1RSICJbMTR+Iil9LAorICAgIHtLX0Y1LAkJSUZfRUIoIlwwMzNbMTV+IiwgRVNDX1NUUiAiWzE1fiIpfSwKKyAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3fiIsIEVTQ19TVFIgIlsxN34iKX0sCisgICAge0tfRjcsCQlJRl9FQigiXDAzM1sxOH4iLCBFU0NfU1RSICJbMTh+Iil9LAorICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNbMTl+IiwgRVNDX1NUUiAiWzE5fiIpfSwKKyAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwfiIsIEVTQ19TVFIgIlsyMH4iKX0sCisgICAge0tfRjEwLAkJSUZfRUIoIlwwMzNbMjF+IiwgRVNDX1NUUiAiWzIxfiIpfSwKKyAgICB7S19GMTEsCQlJRl9FQigiXDAzM1syM34iLCBFU0NfU1RSICJbMjN+Iil9LAorICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0fiIsIEVTQ19TVFIgIlsyNH4iKX0sCisgICAge0tfU19YRjEsCQlJRl9FQigiXDAzM08yUCIsIEVTQ19TVFIgIk8yUCIpfSwKKyAgICB7S19TX1hGMiwJCUlGX0VCKCJcMDMzTzJRIiwgRVNDX1NUUiAiTzJRIil9LAorICAgIHtLX1NfWEYzLAkJSUZfRUIoIlwwMzNPMlIiLCBFU0NfU1RSICJPMlIiKX0sCisgICAge0tfU19YRjQsCQlJRl9FQigiXDAzM08yUyIsIEVTQ19TVFIgIk8yUyIpfSwKKyAgICB7S19TX0YxLAkJSUZfRUIoIlwwMzNbMTE7Mn4iLCBFU0NfU1RSICJbMTE7Mn4iKX0sCisgICAge0tfU19GMiwJCUlGX0VCKCJcMDMzWzEyOzJ+IiwgRVNDX1NUUiAiWzEyOzJ+Iil9LAorICAgIHtLX1NfRjMsCQlJRl9FQigiXDAzM1sxMzsyfiIsIEVTQ19TVFIgIlsxMzsyfiIpfSwKKyAgICB7S19TX0Y0LAkJSUZfRUIoIlwwMzNbMTQ7Mn4iLCBFU0NfU1RSICJbMTQ7Mn4iKX0sCisgICAge0tfU19GNSwJCUlGX0VCKCJcMDMzWzE1OzJ+IiwgRVNDX1NUUiAiWzE1OzJ+Iil9LAorICAgIHtLX1NfRjYsCQlJRl9FQigiXDAzM1sxNzsyfiIsIEVTQ19TVFIgIlsxNzsyfiIpfSwKKyAgICB7S19TX0Y3LAkJSUZfRUIoIlwwMzNbMTg7Mn4iLCBFU0NfU1RSICJbMTg7Mn4iKX0sCisgICAge0tfU19GOCwJCUlGX0VCKCJcMDMzWzE5OzJ+IiwgRVNDX1NUUiAiWzE5OzJ+Iil9LAorICAgIHtLX1NfRjksCQlJRl9FQigiXDAzM1syMDsyfiIsIEVTQ19TVFIgIlsyMDsyfiIpfSwKKyAgICB7S19TX0YxMCwJCUlGX0VCKCJcMDMzWzIxOzJ+IiwgRVNDX1NUUiAiWzIxOzJ+Iil9LAorICAgIHtLX1NfRjExLAkJSUZfRUIoIlwwMzNbMjM7Mn4iLCBFU0NfU1RSICJbMjM7Mn4iKX0sCisgICAge0tfU19GMTIsCQlJRl9FQigiXDAzM1syNDsyfiIsIEVTQ19TVFIgIlsyNDsyfiIpfSwKKyAgICB7S19TX1RBQiwJCUlGX0VCKCJcMDMzW1oiLCBFU0NfU1RSICJbWiIpfSwKKyAgICB7S19IRUxQLAkJSUZfRUIoIlwwMzNbMjh+IiwgRVNDX1NUUiAiWzI4fiIpfSwKKyAgICB7S19VTkRPLAkJSUZfRUIoIlwwMzNbMjZ+IiwgRVNDX1NUUiAiWzI2fiIpfSwKKyAgICB7S19JTlMsCQlJRl9FQigiXDAzM1syfiIsIEVTQ19TVFIgIlsyfiIpfSwKKyAgICB7S19IT01FLAkJSUZfRUIoIlwwMzNbN34iLCBFU0NfU1RSICJbN34iKX0sCisgICAge0tfU19IT01FLAkJSUZfRUIoIlwwMzNPMkgiLCBFU0NfU1RSICJPMkgiKX0sCisgICAge0tfQ19IT01FLAkJSUZfRUIoIlwwMzNPNUgiLCBFU0NfU1RSICJPNUgiKX0sCisgICAge0tfS0hPTUUsCQlJRl9FQigiXDAzM1sxfiIsIEVTQ19TVFIgIlsxfiIpfSwKKyAgICB7S19YSE9NRSwJCUlGX0VCKCJcMDMzT0giLCBFU0NfU1RSICJPSCIpfSwJLyogYWx0ZXJuYXRlIEhvbWUgKi8KKyAgICB7S19FTkQsCQlJRl9FQigiXDAzM1s4fiIsIEVTQ19TVFIgIls4fiIpfSwKKyAgICB7S19TX0VORCwJCUlGX0VCKCJcMDMzTzJGIiwgRVNDX1NUUiAiTzJGIil9LAorICAgIHtLX0NfRU5ELAkJSUZfRUIoIlwwMzNPNUYiLCBFU0NfU1RSICJPNUYiKX0sCisgICAge0tfS0VORCwJCUlGX0VCKCJcMDMzWzR+IiwgRVNDX1NUUiAiWzR+Iil9LAorICAgIHtLX1hFTkQsCQlJRl9FQigiXDAzM09GIiwgRVNDX1NUUiAiT0YiKX0sCS8qIGFsdGVybmF0ZSBFbmQgKi8KKyAgICB7S19QQUdFVVAsCQlJRl9FQigiXDAzM1s1fiIsIEVTQ19TVFIgIls1fiIpfSwKKyAgICB7S19QQUdFRE9XTiwJSUZfRUIoIlwwMzNbNn4iLCBFU0NfU1RSICJbNn4iKX0sCisgICAge0tfS1BMVVMsCQlJRl9FQigiXDAzM09rIiwgRVNDX1NUUiAiT2siKX0sCS8qIGtleXBhZCBwbHVzICovCisgICAge0tfS01JTlVTLAkJSUZfRUIoIlwwMzNPbSIsIEVTQ19TVFIgIk9tIil9LAkvKiBrZXlwYWQgbWludXMgKi8KKyAgICB7S19LRElWSURFLAkJSUZfRUIoIlwwMzNPbyIsIEVTQ19TVFIgIk9vIil9LAkvKiBrZXlwYWQgLyAqLworICAgIHtLX0tNVUxUSVBMWSwJSUZfRUIoIlwwMzNPaiIsIEVTQ19TVFIgIk9qIil9LAkvKiBrZXlwYWQgKiAqLworICAgIHtLX0tFTlRFUiwJCUlGX0VCKCJcMDMzT00iLCBFU0NfU1RSICJPTSIpfSwJLyoga2V5cGFkIEVudGVyICovCisgICAge0tfS0RFTCwJCUlGX0VCKCJcMDMzWzN+IiwgRVNDX1NUUiAiWzN+Iil9LAkvKiBrZXlwYWQgRGVsICovCisKKyAgICB7QlRfRVhUUkFfS0VZUywgICAiIn0sCisgICAge1RFUk1DQVAyS0VZKCdrJywgJzAnKSwgSUZfRUIoIlwwMzNbMTB+IiwgRVNDX1NUUiAiWzEwfiIpfSwJLyogRjAgKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnMycpLCBJRl9FQigiXDAzM1syNX4iLCBFU0NfU1RSICJbMjV+Iil9LAkvKiBGMTMgKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNicpLCBJRl9FQigiXDAzM1syOX4iLCBFU0NfU1RSICJbMjl+Iil9LAkvKiBGMTYgKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNycpLCBJRl9FQigiXDAzM1szMX4iLCBFU0NfU1RSICJbMzF+Iil9LAkvKiBGMTcgKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOCcpLCBJRl9FQigiXDAzM1szMn4iLCBFU0NfU1RSICJbMzJ+Iil9LAkvKiBGMTggKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOScpLCBJRl9FQigiXDAzM1szM34iLCBFU0NfU1RSICJbMzN+Iil9LAkvKiBGMTkgKi8KKyAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnQScpLCBJRl9FQigiXDAzM1szNH4iLCBFU0NfU1RSICJbMzR+Iil9LAkvKiBGMjAgKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisvKgorICogaXJpcy1hbnNpIGZvciBTaWxpY29uIEdyYXBoaWNzIG1hY2hpbmVzLgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJImlyaXMtYW5zaSJ9LAorICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCisgICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKKyAgICB7KGludClLU19BTCwJIlwwMzNbTCJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAkiXDAzM1tNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKKyMgIGVuZGlmCisjaWYgMAkvKiBUaGUgc2Nyb2xsIHJlZ2lvbiBpcyBub3Qgd29ya2luZyBhcyBWaW0gZXhwZWN0cy4gKi8KKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJWQ7JWRyIn0sCisjICBlbmRpZgorI2VuZGlmCisgICAgeyhpbnQpS1NfQ0wsCSJcMDMzW0hcMDMzWzJKIn0sCisgICAgeyhpbnQpS1NfVkUsCSJcMDMzWzkveVwwMzNbMTIveSJ9LAkvKiBUaGVzZSBhcmVuJ3QgZG9jdW1lbnRlZCAqLworICAgIHsoaW50KUtTX1ZTLAkiXDAzM1sxMC95XDAzM1s9MWhcMDMzWz0ybCJ9LCAvKiBUaGVzZSBhcmVuJ3QgZG9jdW1lbnRlZCAqLworICAgIHsoaW50KUtTX1RJLAkiXDAzM1s9NmgifSwKKyAgICB7KGludClLU19URSwJIlwwMzNbPTZsIn0sCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzWzIxOzI3bSJ9LAorICAgIHsoaW50KUtTX1NPLAkiXDAzM1sxOzdtIn0sCisgICAgeyhpbnQpS1NfTUUsCSJcMDMzW20ifSwKKyAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwKKyAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwKKyAgICB7KGludClLU19DQ08sCSI4In0sCQkJLyogYWxsb3cgOCBjb2xvcnMgKi8KKyAgICB7KGludClLU19DWkgsCSJcMDMzWzNtIn0sCQkvKiBpdGFsaWMgbW9kZSBvbiAqLworICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMjNtIn0sCQkvKiBpdGFsaWMgbW9kZSBvZmYgKi8KKyAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwJCS8qIHVuZGVybGluZSBvbiAqLworICAgIHsoaW50KUtTX1VFLAkiXDAzM1syNG0ifSwJCS8qIHVuZGVybGluZSBvZmYgKi8KKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JXAxJWRtIn0sICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVwMSVkbSJ9LCAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KKyAgICB7KGludClLU19DU0IsCSJcMDMzWzEwMjslcDElZG0ifSwgLyogc2V0IHNjcmVlbiBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ1NGLAkiXDAzM1sxMDE7JXAxJWRtIn0sIC8qIHNldCBzY3JlZW4gZm9yZWdyb3VuZCBjb2xvciAqLworIyAgZWxzZQorICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVkbSJ9LAkgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCSAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KKyAgICB7KGludClLU19DU0IsCSJcMDMzWzEwMjslZG0ifSwgICAgLyogc2V0IHNjcmVlbiBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ1NGLAkiXDAzM1sxMDE7JWRtIn0sICAgIC8qIHNldCBzY3JlZW4gZm9yZWdyb3VuZCBjb2xvciAqLworIyAgZW5kaWYKKyAgICB7KGludClLU19NUywJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slZEMifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0lTLAkiXDAzM1AzLnkifSwKKyAgICB7KGludClLU19DSUUsCSJcMjM0In0sICAgIC8qIFNUICJTdHJpbmcgVGVybWluYXRvciIgKi8KKyAgICB7KGludClLU19UUywJIlwwMzNQMS55In0sCisgICAgeyhpbnQpS1NfRlMsCSJcMjM0In0sICAgIC8qIFNUICJTdHJpbmcgVGVybWluYXRvciIgKi8KKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1dTLAkiXDAzM1syMDM7JXAxJWQ7JXAyJWQveSJ9LAorICAgIHsoaW50KUtTX0NXUCwJIlwwMzNbMjA1OyVwMSVkOyVwMiVkL3kifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DV1MsCSJcMDMzWzIwMzslZDslZC95In0sCisgICAgeyhpbnQpS1NfQ1dQLAkiXDAzM1syMDU7JWQ7JWQveSJ9LAorIyAgZW5kaWYKKyAgICB7S19VUCwJCSJcMDMzW0EifSwKKyAgICB7S19ET1dOLAkJIlwwMzNbQiJ9LAorICAgIHtLX0xFRlQsCQkiXDAzM1tEIn0sCisgICAge0tfUklHSFQsCQkiXDAzM1tDIn0sCisgICAge0tfU19VUCwJCSJcMDMzWzE2MXEifSwKKyAgICB7S19TX0RPV04sCQkiXDAzM1sxNjRxIn0sCisgICAge0tfU19MRUZULAkJIlwwMzNbMTU4cSJ9LAorICAgIHtLX1NfUklHSFQsCQkiXDAzM1sxNjdxIn0sCisgICAge0tfRjEsCQkiXDAzM1swMDFxIn0sCisgICAge0tfRjIsCQkiXDAzM1swMDJxIn0sCisgICAge0tfRjMsCQkiXDAzM1swMDNxIn0sCisgICAge0tfRjQsCQkiXDAzM1swMDRxIn0sCisgICAge0tfRjUsCQkiXDAzM1swMDVxIn0sCisgICAge0tfRjYsCQkiXDAzM1swMDZxIn0sCisgICAge0tfRjcsCQkiXDAzM1swMDdxIn0sCisgICAge0tfRjgsCQkiXDAzM1swMDhxIn0sCisgICAge0tfRjksCQkiXDAzM1swMDlxIn0sCisgICAge0tfRjEwLAkJIlwwMzNbMDEwcSJ9LAorICAgIHtLX0YxMSwJCSJcMDMzWzAxMXEifSwKKyAgICB7S19GMTIsCQkiXDAzM1swMTJxIn0sCisgICAge0tfU19GMSwJCSJcMDMzWzAxM3EifSwKKyAgICB7S19TX0YyLAkJIlwwMzNbMDE0cSJ9LAorICAgIHtLX1NfRjMsCQkiXDAzM1swMTVxIn0sCisgICAge0tfU19GNCwJCSJcMDMzWzAxNnEifSwKKyAgICB7S19TX0Y1LAkJIlwwMzNbMDE3cSJ9LAorICAgIHtLX1NfRjYsCQkiXDAzM1swMThxIn0sCisgICAge0tfU19GNywJCSJcMDMzWzAxOXEifSwKKyAgICB7S19TX0Y4LAkJIlwwMzNbMDIwcSJ9LAorICAgIHtLX1NfRjksCQkiXDAzM1swMjFxIn0sCisgICAge0tfU19GMTAsCQkiXDAzM1swMjJxIn0sCisgICAge0tfU19GMTEsCQkiXDAzM1swMjNxIn0sCisgICAge0tfU19GMTIsCQkiXDAzM1swMjRxIn0sCisgICAge0tfSU5TLAkJIlwwMzNbMTM5cSJ9LAorICAgIHtLX0hPTUUsCQkiXDAzM1tIIn0sCisgICAge0tfRU5ELAkJIlwwMzNbMTQ2cSJ9LAorICAgIHtLX1BBR0VVUCwJCSJcMDMzWzE1MHEifSwKKyAgICB7S19QQUdFRE9XTiwJIlwwMzNbMTU0cSJ9LAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisvKgorICogZm9yIGRlYnVnZ2luZworICovCisgICAgeyhpbnQpS1NfTkFNRSwJImRlYnVnIn0sCisgICAgeyhpbnQpS1NfQ0UsCSJbQ0VdIn0sCisgICAgeyhpbnQpS1NfQ0QsCSJbQ0RdIn0sCisgICAgeyhpbnQpS1NfQUwsCSJbQUxdIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJIltDQUwlcDElZF0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DQUwsCSJbQ0FMJWRdIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAkiW0RMXSJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DREwsCSJbQ0RMJXAxJWRdIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAkiW0NETCVkXSJ9LAorIyAgZW5kaWYKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1MsCSJbJXAxJWRDUyVwMiVkXSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NTLAkiWyVkQ1MlZF0ifSwKKyMgIGVuZGlmCisjICBpZmRlZiBGRUFUX1ZFUlRTUExJVAorIyAgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1NWLAkiWyVwMSVkQ1NWJXAyJWRdIn0sCisjICAgZWxzZQorICAgIHsoaW50KUtTX0NTViwJIlslZENTViVkXSJ9LAorIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJbQ0FCJXAxJWRdIn0sCisgICAgeyhpbnQpS1NfQ0FGLAkiW0NBRiVwMSVkXSJ9LAorICAgIHsoaW50KUtTX0NTQiwJIltDU0IlcDElZF0ifSwKKyAgICB7KGludClLU19DU0YsCSJbQ1NGJXAxJWRdIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiW0NBQiVkXSJ9LAorICAgIHsoaW50KUtTX0NBRiwJIltDQUYlZF0ifSwKKyAgICB7KGludClLU19DU0IsCSJbQ1NCJWRdIn0sCisgICAgeyhpbnQpS1NfQ1NGLAkiW0NTRiVkXSJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19PUCwJIltPUF0ifSwKKyAgICB7KGludClLU19MRSwJIltMRV0ifSwKKyAgICB7KGludClLU19DTCwJIltDTF0ifSwKKyAgICB7KGludClLU19WSSwJIltWSV0ifSwKKyAgICB7KGludClLU19WRSwJIltWRV0ifSwKKyAgICB7KGludClLU19WUywJIltWU10ifSwKKyAgICB7KGludClLU19NRSwJIltNRV0ifSwKKyAgICB7KGludClLU19NUiwJIltNUl0ifSwKKyAgICB7KGludClLU19NQiwJIltNQl0ifSwKKyAgICB7KGludClLU19NRCwJIltNRF0ifSwKKyAgICB7KGludClLU19TRSwJIltTRV0ifSwKKyAgICB7KGludClLU19TTywJIltTT10ifSwKKyAgICB7KGludClLU19VRSwJIltVRV0ifSwKKyAgICB7KGludClLU19VUywJIltVU10ifSwKKyAgICB7KGludClLU19NUywJIltNU10ifSwKKyAgICB7KGludClLU19VVCwJIltVVF0ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJbJXAxJWRDTSVwMiVkXSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiWyVkQ00lZF0ifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfU1IsCSJbU1JdIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NSSSwJIltDUkklcDElZF0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCSJbQ1JJJWRdIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX1ZCLAkiW1ZCXSJ9LAorICAgIHsoaW50KUtTX0tTLAkiW0tTXSJ9LAorICAgIHsoaW50KUtTX0tFLAkiW0tFXSJ9LAorICAgIHsoaW50KUtTX1RJLAkiW1RJXSJ9LAorICAgIHsoaW50KUtTX1RFLAkiW1RFXSJ9LAorICAgIHsoaW50KUtTX0NJUywJIltDSVNdIn0sCisgICAgeyhpbnQpS1NfQ0lFLAkiW0NJRV0ifSwKKyAgICB7KGludClLU19UUywJIltUU10ifSwKKyAgICB7KGludClLU19GUywJIltGU10ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1dTLAkiWyVwMSVkQ1dTJXAyJWRdIn0sCisgICAgeyhpbnQpS1NfQ1dQLAkiWyVwMSVkQ1dQJXAyJWRdIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1dTLAkiWyVkQ1dTJWRdIn0sCisgICAgeyhpbnQpS1NfQ1dQLAkiWyVkQ1dQJWRdIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NSViwJIltDUlZdIn0sCisgICAge0tfVVAsCQkiW0tVXSJ9LAorICAgIHtLX0RPV04sCQkiW0tEXSJ9LAorICAgIHtLX0xFRlQsCQkiW0tMXSJ9LAorICAgIHtLX1JJR0hULAkJIltLUl0ifSwKKyAgICB7S19TX1VQLAkJIltTLUtVXSJ9LAorICAgIHtLX1NfRE9XTiwJCSJbUy1LRF0ifSwKKyAgICB7S19TX0xFRlQsCQkiW1MtS0xdIn0sCisgICAge0tfQ19MRUZULAkJIltDLUtMXSJ9LAorICAgIHtLX1NfUklHSFQsCQkiW1MtS1JdIn0sCisgICAge0tfQ19SSUdIVCwJCSJbQy1LUl0ifSwKKyAgICB7S19GMSwJCSJbRjFdIn0sCisgICAge0tfWEYxLAkJIlt4RjFdIn0sCisgICAge0tfRjIsCQkiW0YyXSJ9LAorICAgIHtLX1hGMiwJCSJbeEYyXSJ9LAorICAgIHtLX0YzLAkJIltGM10ifSwKKyAgICB7S19YRjMsCQkiW3hGM10ifSwKKyAgICB7S19GNCwJCSJbRjRdIn0sCisgICAge0tfWEY0LAkJIlt4RjRdIn0sCisgICAge0tfRjUsCQkiW0Y1XSJ9LAorICAgIHtLX0Y2LAkJIltGNl0ifSwKKyAgICB7S19GNywJCSJbRjddIn0sCisgICAge0tfRjgsCQkiW0Y4XSJ9LAorICAgIHtLX0Y5LAkJIltGOV0ifSwKKyAgICB7S19GMTAsCQkiW0YxMF0ifSwKKyAgICB7S19GMTEsCQkiW0YxMV0ifSwKKyAgICB7S19GMTIsCQkiW0YxMl0ifSwKKyAgICB7S19TX0YxLAkJIltTLUYxXSJ9LAorICAgIHtLX1NfWEYxLAkJIltTLXhGMV0ifSwKKyAgICB7S19TX0YyLAkJIltTLUYyXSJ9LAorICAgIHtLX1NfWEYyLAkJIltTLXhGMl0ifSwKKyAgICB7S19TX0YzLAkJIltTLUYzXSJ9LAorICAgIHtLX1NfWEYzLAkJIltTLXhGM10ifSwKKyAgICB7S19TX0Y0LAkJIltTLUY0XSJ9LAorICAgIHtLX1NfWEY0LAkJIltTLXhGNF0ifSwKKyAgICB7S19TX0Y1LAkJIltTLUY1XSJ9LAorICAgIHtLX1NfRjYsCQkiW1MtRjZdIn0sCisgICAge0tfU19GNywJCSJbUy1GN10ifSwKKyAgICB7S19TX0Y4LAkJIltTLUY4XSJ9LAorICAgIHtLX1NfRjksCQkiW1MtRjldIn0sCisgICAge0tfU19GMTAsCQkiW1MtRjEwXSJ9LAorICAgIHtLX1NfRjExLAkJIltTLUYxMV0ifSwKKyAgICB7S19TX0YxMiwJCSJbUy1GMTJdIn0sCisgICAge0tfSEVMUCwJCSJbSEVMUF0ifSwKKyAgICB7S19VTkRPLAkJIltVTkRPXSJ9LAorICAgIHtLX0JTLAkJIltCU10ifSwKKyAgICB7S19JTlMsCQkiW0lOU10ifSwKKyAgICB7S19LSU5TLAkJIltLSU5TXSJ9LAorICAgIHtLX0RFTCwJCSJbREVMXSJ9LAorICAgIHtLX0tERUwsCQkiW0tERUxdIn0sCisgICAge0tfSE9NRSwJCSJbSE9NRV0ifSwKKyAgICB7S19TX0hPTUUsCQkiW0MtSE9NRV0ifSwKKyAgICB7S19DX0hPTUUsCQkiW0MtSE9NRV0ifSwKKyAgICB7S19LSE9NRSwJCSJbS0hPTUVdIn0sCisgICAge0tfWEhPTUUsCQkiW1hIT01FXSJ9LAorICAgIHtLX0VORCwJCSJbRU5EXSJ9LAorICAgIHtLX1NfRU5ELAkJIltDLUVORF0ifSwKKyAgICB7S19DX0VORCwJCSJbQy1FTkRdIn0sCisgICAge0tfS0VORCwJCSJbS0VORF0ifSwKKyAgICB7S19YRU5ELAkJIltYRU5EXSJ9LAorICAgIHtLX1BBR0VVUCwJCSJbUEFHRVVQXSJ9LAorICAgIHtLX1BBR0VET1dOLAkiW1BBR0VET1dOXSJ9LAorICAgIHtLX0tQQUdFVVAsCQkiW0tQQUdFVVBdIn0sCisgICAge0tfS1BBR0VET1dOLAkiW0tQQUdFRE9XTl0ifSwKKyAgICB7S19NT1VTRSwJCSJbTU9VU0VdIn0sCisgICAge0tfS1BMVVMsCQkiW0tQTFVTXSJ9LAorICAgIHtLX0tNSU5VUywJCSJbS01JTlVTXSJ9LAorICAgIHtLX0tESVZJREUsCQkiW0tESVZJREVdIn0sCisgICAge0tfS01VTFRJUExZLAkiW0tNVUxUSVBMWV0ifSwKKyAgICB7S19LRU5URVIsCQkiW0tFTlRFUl0ifSwKKyAgICB7S19LUE9JTlQsCQkiW0tQT0lOVF0ifSwKKyAgICB7S19LMCwJCSJbSzBdIn0sCisgICAge0tfSzEsCQkiW0sxXSJ9LAorICAgIHtLX0syLAkJIltLMl0ifSwKKyAgICB7S19LMywJCSJbSzNdIn0sCisgICAge0tfSzQsCQkiW0s0XSJ9LAorICAgIHtLX0s1LAkJIltLNV0ifSwKKyAgICB7S19LNiwJCSJbSzZdIn0sCisgICAge0tfSzcsCQkiW0s3XSJ9LAorICAgIHtLX0s4LAkJIltLOF0ifSwKKyAgICB7S19LOSwJCSJbSzldIn0sCisjIGVuZGlmCisKKyNlbmRpZiAvKiBOT19CVUlMVElOX1RDQVBTICovCisKKy8qCisgKiBUaGUgbW9zdCBtaW5pbWFsIHRlcm1pbmFsOiBvbmx5IGNsZWFyIHNjcmVlbiBhbmQgY3Vyc29yIHBvc2l0aW9uaW5nCisgKiBBbHdheXMgaW5jbHVkZWQuCisgKi8KKyAgICB7KGludClLU19OQU1FLAkiZHVtYiJ9LAorICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAorI2lmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRIIiwKKwkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAorI2Vsc2UKKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCisjZW5kaWYKKworLyoKKyAqIGVuZCBtYXJrZXIKKyAqLworICAgIHsoaW50KUtTX05BTUUsCU5VTEx9CisKK307CS8qIGVuZCBvZiBidWlsdGluX3Rlcm1jYXBzICovCisKKy8qCisgKiBERUZBVUxUX1RFUk0gaXMgdXNlZCwgd2hlbiBubyB0ZXJtaW5hbCBpcyBzcGVjaWZpZWQgd2l0aCAtVCBvcHRpb24gb3IgJFRFUk0uCisgKi8KKyNpZmRlZiBSSVNDT1MKKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInJpc2NvcyIKKyNlbmRpZgorCisjaWZkZWYgQU1JR0EKKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImFtaWdhIgorI2VuZGlmCisKKyNpZmRlZiBNU1dJTgorIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikid2luMzIiCisjZW5kaWYKKworI2lmZGVmIE1TRE9TCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJwY3Rlcm0iCisjZW5kaWYKKworI2lmIGRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoX19NSU5UX18pCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJhbnNpIgorI2VuZGlmCisKKyNpZmRlZiBfX01JTlRfXworIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikidnQ1MiIKKyNlbmRpZgorCisjaWZkZWYgX19FTVhfXworIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikib3MyYW5zaSIKKyNlbmRpZgorCisjaWZkZWYgVk1TCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ2dDMyMCIKKyNlbmRpZgorCisjaWZkZWYgX19CRU9TX18KKyMgdW5kZWYgREVGQVVMVF9URVJNCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJiZW9zLWFuc2kiCisjZW5kaWYKKworI2lmbmRlZiBERUZBVUxUX1RFUk0KKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImR1bWIiCisjZW5kaWYKKworLyoKKyAqIFRlcm1fc3RyaW5ncyBjb250YWlucyBjdXJyZW50bHkgdXNlZCB0ZXJtaW5hbCBvdXRwdXQgc3RyaW5ncy4KKyAqIEl0IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGJ5IHBhcnNlX2J1aWx0aW5fdGNhcCgpLgorICogVGhlIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSBvcHRpb24gd2l0aCB0aGUgc2FtZSBuYW1lLgorICovCitjaGFyX3UgKih0ZXJtX3N0cmluZ3NbKGludClLU19MQVNUICsgMV0pOworCitzdGF0aWMgaW50CW5lZWRfZ2F0aGVyID0gRkFMU0U7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCitzdGF0aWMgY2hhcl91CXRlcm1sZWFkZXJbMjU2ICsgMV07CQkvKiBmb3IgY2hlY2tfdGVybWNvZGUoKSAqLworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCitzdGF0aWMgaW50CWNoZWNrX2Zvcl9jb2RlcyA9IEZBTFNFOwkvKiBjaGVjayBmb3Iga2V5IGNvZGUgcmVwb25zZSAqLworI2VuZGlmCisKKyAgICBzdGF0aWMgc3RydWN0IGJ1aWx0aW5fdGVybSAqCitmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKQorICAgIGNoYXJfdQkqdGVybTsKK3sKKyAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpwOworCisgICAgcCA9IGJ1aWx0aW5fdGVybWNhcHM7CisgICAgd2hpbGUgKHAtPmJ0X3N0cmluZyAhPSBOVUxMKQorICAgIHsKKwlpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19OQU1FKQorCXsKKyNpZmRlZiBVTklYCisJICAgIGlmIChTVFJDTVAocC0+YnRfc3RyaW5nLCAiaXJpcy1hbnNpIikgPT0gMCAmJiB2aW1faXNfaXJpcyh0ZXJtKSkKKwkJcmV0dXJuIHA7CisJICAgIGVsc2UgaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJ4dGVybSIpID09IDAgJiYgdmltX2lzX3h0ZXJtKHRlcm0pKQorCQlyZXR1cm4gcDsKKwkgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgVk1TCisJCWlmIChTVFJDTVAocC0+YnRfc3RyaW5nLCAidnQzMjAiKSA9PSAwICYmIHZpbV9pc192dDMwMCh0ZXJtKSkKKwkJICAgIHJldHVybiBwOworCQllbHNlCisjZW5kaWYKKwkJICBpZiAoU1RSQ01QKHRlcm0sIHAtPmJ0X3N0cmluZykgPT0gMCkKKwkJICAgIHJldHVybiBwOworCX0KKwkrK3A7CisgICAgfQorICAgIHJldHVybiBwOworfQorCisvKgorICogUGFyc2luZyBvZiB0aGUgYnVpbHRpbiB0ZXJtY2FwIGVudHJpZXMuCisgKiBDYWxsZXIgc2hvdWxkIGNoZWNrIGlmICduYW1lJyBpcyBhIHZhbGlkIGJ1aWx0aW4gdGVybS4KKyAqIFRoZSB0ZXJtaW5hbCdzIG5hbWUgaXMgbm90IHNldCwgYXMgdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGVybWNhcGluaXQoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitwYXJzZV9idWlsdGluX3RjYXAodGVybSkKKyAgICBjaGFyX3UgICp0ZXJtOworeworICAgIHN0cnVjdCBidWlsdGluX3Rlcm0JICAgICpwOworICAgIGNoYXJfdQkJICAgIG5hbWVbMl07CisgICAgaW50CQkJICAgIHRlcm1fOGJpdDsKKworICAgIHAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKKyAgICB0ZXJtXzhiaXQgPSB0ZXJtX2lzXzhiaXQodGVybSk7CisKKyAgICAvKiBEbyBub3QgcGFyc2UgaWYgYnVpbHRpbiB0ZXJtIG5vdCBmb3VuZCAqLworICAgIGlmIChwLT5idF9zdHJpbmcgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBmb3IgKCsrcDsgcC0+YnRfZW50cnkgIT0gKGludClLU19OQU1FICYmIHAtPmJ0X2VudHJ5ICE9IEJUX0VYVFJBX0tFWVM7ICsrcCkKKyAgICB7CisJaWYgKChpbnQpcC0+YnRfZW50cnkgPj0gMCkJLyogS1NfeHggZW50cnkgKi8KKwl7CisJICAgIC8qIE9ubHkgc2V0IHRoZSB2YWx1ZSBpZiBpdCB3YXNuJ3Qgc2V0IHlldC4gKi8KKwkgICAgaWYgKHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPT0gTlVMTAorCQkJCSB8fCB0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID09IGVtcHR5X29wdGlvbikKKwkgICAgeworCQkvKiA4Yml0IHRlcm1pbmFsOiB1c2UgQ1NJIGluc3RlYWQgb2YgPEVzYz5bICovCisJCWlmICh0ZXJtXzhiaXQgJiYgdGVybV83dG84Yml0KChjaGFyX3UgKilwLT5idF9zdHJpbmcpICE9IDApCisJCXsKKwkJICAgIGNoYXJfdSAgKnMsICp0OworCisJCSAgICBzID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKXAtPmJ0X3N0cmluZyk7CisJCSAgICBpZiAocyAhPSBOVUxMKQorCQkgICAgeworCQkJZm9yICh0ID0gczsgKnQ7ICsrdCkKKwkJCSAgICBpZiAodGVybV83dG84Yml0KHQpKQorCQkJICAgIHsKKwkJCQkqdCA9IHRlcm1fN3RvOGJpdCh0KTsKKwkJCQlTVFJDUFkodCArIDEsIHQgKyAyKTsKKwkJCSAgICB9CisJCQl0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID0gczsKKwkJCXNldF90ZXJtX29wdGlvbl9hbGxvY2VkKCZ0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldKTsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCSAgICB0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID0gKGNoYXJfdSAqKXAtPmJ0X3N0cmluZzsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBuYW1lWzBdID0gS0VZMlRFUk1DQVAwKChpbnQpcC0+YnRfZW50cnkpOworCSAgICBuYW1lWzFdID0gS0VZMlRFUk1DQVAxKChpbnQpcC0+YnRfZW50cnkpOworCSAgICBpZiAoZmluZF90ZXJtY29kZShuYW1lKSA9PSBOVUxMKQorCQlhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKXAtPmJ0X3N0cmluZywgdGVybV84Yml0KTsKKwl9CisgICAgfQorfQorI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKQorc3RhdGljIHZvaWQgc2V0X2NvbG9yX2NvdW50IF9fQVJHUygoaW50IG5yKSk7CisKKy8qCisgKiBTZXQgbnVtYmVyIG9mIGNvbG9ycy4KKyAqIFN0b3JlIGl0IGFzIGEgbnVtYmVyIGluIHRfY29sb3JzLgorICogU3RvcmUgaXQgYXMgYSBzdHJpbmcgaW4gVF9DQ08gKHVzaW5nIG5yX2NvbG9yc1tdKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzZXRfY29sb3JfY291bnQobnIpCisgICAgaW50CQlucjsKK3sKKyAgICBjaGFyX3UJbnJfY29sb3JzWzIwXTsJCS8qIHN0cmluZyBmb3IgbnVtYmVyIG9mIGNvbG9ycyAqLworCisgICAgdF9jb2xvcnMgPSBucjsKKyAgICBpZiAodF9jb2xvcnMgPiAxKQorCXNwcmludGYoKGNoYXIgKilucl9jb2xvcnMsICIlZCIsIHRfY29sb3JzKTsKKyAgICBlbHNlCisJKm5yX2NvbG9ycyA9IE5VTDsKKyAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0X0NvIiwgLTEsIG5yX2NvbG9ycywgT1BUX0ZSRUUpOworfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RHRVRFTlQKK3N0YXRpYyBjaGFyICooa2V5X25hbWVzW10pID0KK3sKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorICAgIC8qIERvIHRoaXMgb25lIGZpcnN0LCBpdCBtYXkgY2F1c2UgYSBzY3JlZW4gcmVkcmF3LiAqLworICAgICJDbyIsCisjZW5kaWYKKyAgICAia3UiLCAia2QiLCAia3IiLCAia2wiLAorIyBpZmRlZiBBUkNISUUKKyAgICAic3UiLCAic2QiLAkJLyogVGVybWNhcCBjb2RlIG1hZGUgdXAhICovCisjIGVuZGlmCisgICAgIiMyIiwgIiM0IiwgIiVpIiwgIio3IiwKKyAgICAiazEiLCAiazIiLCAiazMiLCAiazQiLCAiazUiLCAiazYiLAorICAgICJrNyIsICJrOCIsICJrOSIsICJrOyIsICJGMSIsICJGMiIsCisgICAgIiUxIiwgIiY4IiwgImtiIiwgImtJIiwgImtEIiwgImtoIiwKKyAgICAiQDciLCAia1AiLCAia04iLCAiSzEiLCAiSzMiLCAiSzQiLCAiSzUiLCAia0IiLAorICAgIE5VTEwKK307CisjZW5kaWYKKworLyoKKyAqIFNldCB0ZXJtaW5hbCBvcHRpb25zIGZvciB0ZXJtaW5hbCAidGVybSIuCisgKiBSZXR1cm4gT0sgaWYgdGVybWluYWwgJ3Rlcm0nIHdhcyBmb3VuZCBpbiBhIHRlcm1jYXAsIEZBSUwgb3RoZXJ3aXNlLgorICoKKyAqIFdoaWxlIGRvaW5nIHRoaXMsIHVudGlsIHR0ZXN0KCksIHNvbWUgb3B0aW9ucyBtYXkgYmUgTlVMTCwgYmUgY2FyZWZ1bC4KKyAqLworICAgIGludAorc2V0X3Rlcm1uYW1lKHRlcm0pCisgICAgY2hhcl91ICp0ZXJtOworeworICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnRlcm1wOworI2lmZGVmIEhBVkVfVEdFVEVOVAorICAgIGludAkJYnVpbHRpbl9maXJzdCA9IHBfdGJpOworICAgIGludAkJdHJ5OworICAgIGludAkJdGVybWNhcF9jbGVhcmVkID0gRkFMU0U7CisjZW5kaWYKKyAgICBpbnQJCXdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKyAgICBjaGFyX3UJKmVycm9yX21zZyA9IE5VTEw7CisgICAgY2hhcl91CSpic19wLCAqZGVsX3A7CisKKyAgICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CQkvKiByZXNldCA4LWJpdCBkZXRlY3Rpb24gKi8KKworICAgIGlmICh0ZXJtX2lzX2J1aWx0aW4odGVybSkpCisgICAgeworCXRlcm0gKz0gODsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwlidWlsdGluX2ZpcnN0ID0gMTsKKyNlbmRpZgorICAgIH0KKworLyoKKyAqIElmIEhBVkVfVEdFVEVOVCBpcyBub3QgZGVmaW5lZCwgb25seSB0aGUgYnVpbHRpbiB0ZXJtY2FwIGlzIHVzZWQsIG90aGVyd2lzZToKKyAqICAgSWYgYnVpbHRpbl9maXJzdCBpcyBUUlVFOgorICogICAgIDAuIHRyeSBidWlsdGluIHRlcm1jYXAKKyAqICAgICAxLiB0cnkgZXh0ZXJuYWwgdGVybWNhcAorICogICAgIDIuIGlmIGJvdGggZmFpbCBkZWZhdWx0IHRvIGEgYnVpbHRpbiB0ZXJtaW5hbAorICogICBJZiBidWlsdGluX2ZpcnN0IGlzIEZBTFNFOgorICogICAgIDEuIHRyeSBleHRlcm5hbCB0ZXJtY2FwCisgKiAgICAgMi4gdHJ5IGJ1aWx0aW4gdGVybWNhcCwgaWYgYm90aCBmYWlsIGRlZmF1bHQgdG8gYSBidWlsdGluIHRlcm1pbmFsCisgKi8KKyNpZmRlZiBIQVZFX1RHRVRFTlQKKyAgICBmb3IgKHRyeSA9IGJ1aWx0aW5fZmlyc3QgPyAwIDogMTsgdHJ5IDwgMzsgKyt0cnkpCisgICAgeworCS8qCisJICogVXNlIGV4dGVybmFsIHRlcm1jYXAKKwkgKi8KKwlpZiAodHJ5ID09IDEpCisJeworCSAgICBjaGFyX3UJICAgICpwOworCSAgICBzdGF0aWMgY2hhcl91ICAgdHN0cmJ1ZltUQlVGU1pdOworCSAgICBpbnQJCSAgICBpOworCSAgICBjaGFyX3UJICAgIHRidWZbVEJVRlNaXTsKKwkgICAgY2hhcl91CSAgICAqdHA7CisJICAgIHN0YXRpYyBzdHJ1Y3QgeworCQkJICAgIGVudW0gU3BlY2lhbEtleSBkZXN0OyAvKiBpbmRleCBpbiB0ZXJtX3N0cmluZ3NbXSAqLworCQkJICAgIGNoYXIgKm5hbWU7CQkgIC8qIHRlcm1jYXAgbmFtZSBmb3Igc3RyaW5nICovCisJCQkgIH0gc3RyaW5nX25hbWVzW10gPQorCQkJICAgIHsJe0tTX0NFLCAiY2UifSwge0tTX0FMLCAiYWwifSwge0tTX0NBTCwiQUwifSwKKwkJCQl7S1NfREwsICJkbCJ9LCB7S1NfQ0RMLCJETCJ9LCB7S1NfQ1MsICJjcyJ9LAorCQkJCXtLU19DTCwgImNsIn0sIHtLU19DRCwgImNkIn0sCisJCQkJe0tTX1ZJLCAidmkifSwge0tTX1ZFLCAidmUifSwge0tTX01CLCAibWIifSwKKwkJCQl7S1NfVlMsICJ2cyJ9LCB7S1NfTUUsICJtZSJ9LCB7S1NfTVIsICJtciJ9LAorCQkJCXtLU19NRCwgIm1kIn0sIHtLU19TRSwgInNlIn0sIHtLU19TTywgInNvIn0sCisJCQkJe0tTX0NaSCwiWkgifSwge0tTX0NaUiwiWlIifSwge0tTX1VFLCAidWUifSwKKwkJCQl7S1NfVVMsICJ1cyJ9LCB7S1NfQ00sICJjbSJ9LCB7S1NfU1IsICJzciJ9LAorCQkJCXtLU19DUkksIlJJIn0sIHtLU19WQiwgInZiIn0sIHtLU19LUywgImtzIn0sCisJCQkJe0tTX0tFLCAia2UifSwge0tTX1RJLCAidGkifSwge0tTX1RFLCAidGUifSwKKwkJCQl7S1NfQkMsICJiYyJ9LCB7S1NfQ1NCLCJTYiJ9LCB7S1NfQ1NGLCJTZiJ9LAorCQkJCXtLU19DQUIsIkFCIn0sIHtLU19DQUYsIkFGIn0sIHtLU19MRSwgImxlIn0sCisJCQkJe0tTX05ELCAibmQifSwge0tTX09QLCAib3AifSwge0tTX0NSViwgIlJWIn0sCisJCQkJe0tTX0NJUywgIklTIn0sIHtLU19DSUUsICJJRSJ9LAorCQkJCXtLU19UUywgInRzIn0sIHtLU19GUywgImZzIn0sCisJCQkJe0tTX0NXUCwgIldQIn0sIHtLU19DV1MsICJXUyJ9LAorCQkJCXsoZW51bSBTcGVjaWFsS2V5KTAsIE5VTEx9CisJCQkgICAgfTsKKworCSAgICAvKgorCSAgICAgKiBJZiB0aGUgZXh0ZXJuYWwgdGVybWNhcCBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgZW50cnksIHRyeSB0aGUKKwkgICAgICogYnVpbHRpbiBvbmVzLgorCSAgICAgKi8KKwkgICAgaWYgKChlcnJvcl9tc2cgPSB0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pKSA9PSBOVUxMKQorCSAgICB7CisJCXRwID0gdHN0cmJ1ZjsKKwkJaWYgKCF0ZXJtY2FwX2NsZWFyZWQpCisJCXsKKwkJICAgIGNsZWFyX3Rlcm1vcHRpb25zKCk7CS8qIGNsZWFyIG9sZCBvcHRpb25zICovCisJCSAgICB0ZXJtY2FwX2NsZWFyZWQgPSBUUlVFOworCQl9CisKKwkgICAgLyogZ2V0IG91dHB1dCBzdHJpbmdzICovCisJCWZvciAoaSA9IDA7IHN0cmluZ19uYW1lc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKKwkJeworCQkgICAgaWYgKHRlcm1fc3RyKHN0cmluZ19uYW1lc1tpXS5kZXN0KSA9PSBOVUxMCisJCQkgICAgfHwgdGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID09IGVtcHR5X29wdGlvbikKKwkJCXRlcm1fc3RyKHN0cmluZ19uYW1lc1tpXS5kZXN0KSA9CisJCQkJCSAgIFRHRVRTVFIoc3RyaW5nX25hbWVzW2ldLm5hbWUsICZ0cCk7CisJCX0KKworCQkvKiB0Z2V0ZmxhZygpIHJldHVybnMgMSBpZiB0aGUgZmxhZyBpcyBwcmVzZW50LCAwIGlmIG5vdCBhbmQKKwkJICogcG9zc2libHkgLTEgaWYgdGhlIGZsYWcgZG9lc24ndCBleGlzdC4gKi8KKwkJaWYgKChUX01TID09IE5VTEwgfHwgVF9NUyA9PSBlbXB0eV9vcHRpb24pCisJCQkJCQkJJiYgdGdldGZsYWcoIm1zIikgPiAwKQorCQkgICAgVF9NUyA9IChjaGFyX3UgKikieSI7CisJCWlmICgoVF9YUyA9PSBOVUxMIHx8IFRfWFMgPT0gZW1wdHlfb3B0aW9uKQorCQkJCQkJCSYmIHRnZXRmbGFnKCJ4cyIpID4gMCkKKwkJICAgIFRfWFMgPSAoY2hhcl91ICopInkiOworCQlpZiAoKFRfREIgPT0gTlVMTCB8fCBUX0RCID09IGVtcHR5X29wdGlvbikKKwkJCQkJCQkmJiB0Z2V0ZmxhZygiZGIiKSA+IDApCisJCSAgICBUX0RCID0gKGNoYXJfdSAqKSJ5IjsKKwkJaWYgKChUX0RBID09IE5VTEwgfHwgVF9EQSA9PSBlbXB0eV9vcHRpb24pCisJCQkJCQkJJiYgdGdldGZsYWcoImRhIikgPiAwKQorCQkgICAgVF9EQSA9IChjaGFyX3UgKikieSI7CisJCWlmICgoVF9VVCA9PSBOVUxMIHx8IFRfVVQgPT0gZW1wdHlfb3B0aW9uKQorCQkJCQkJCSYmIHRnZXRmbGFnKCJ1dCIpID4gMCkKKwkJICAgIFRfVVQgPSAoY2hhcl91ICopInkiOworCisKKwkJLyoKKwkJICogZ2V0IGtleSBjb2RlcworCQkgKi8KKwkJZm9yIChpID0gMDsga2V5X25hbWVzW2ldICE9IE5VTEw7ICsraSkKKwkJeworCQkgICAgaWYgKGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKWtleV9uYW1lc1tpXSkgPT0gTlVMTCkKKwkJICAgIHsKKwkJCXAgPSBUR0VUU1RSKGtleV9uYW1lc1tpXSwgJnRwKTsKKwkJCS8qIGlmIGN1cnNvci1sZWZ0ID09IGJhY2tzcGFjZSwgaWdub3JlIGl0ICh0ZWxldmlkZW8KKwkJCSAqIDkyNSkgKi8KKwkJCWlmIChwICE9IE5VTEwKKwkJCQkmJiAoKnAgIT0gQ3RybF9ICisJCQkJICAgIHx8IGtleV9uYW1lc1tpXVswXSAhPSAnaycKKwkJCQkgICAgfHwga2V5X25hbWVzW2ldWzFdICE9ICdsJykpCisJCQkgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKilrZXlfbmFtZXNbaV0sIHAsIEZBTFNFKTsKKwkJICAgIH0KKwkJfQorCisJCWlmIChoZWlnaHQgPT0gMCkKKwkJICAgIGhlaWdodCA9IHRnZXRudW0oImxpIik7CisJCWlmICh3aWR0aCA9PSAwKQorCQkgICAgd2lkdGggPSB0Z2V0bnVtKCJjbyIpOworCisJCS8qCisJCSAqIEdldCBudW1iZXIgb2YgY29sb3JzIChpZiBub3QgZG9uZSBhbHJlYWR5KS4KKwkJICovCisJCWlmICh0ZXJtX3N0cihLU19DQ08pID09IE5VTEwKKwkJCXx8IHRlcm1fc3RyKEtTX0NDTykgPT0gZW1wdHlfb3B0aW9uKQorCQkgICAgc2V0X2NvbG9yX2NvdW50KHRnZXRudW0oIkNvIikpOworCisjIGlmbmRlZiBocHV4CisJCUJDID0gKGNoYXIgKilUR0VUU1RSKCJiYyIsICZ0cCk7CisJCVVQID0gKGNoYXIgKilUR0VUU1RSKCJ1cCIsICZ0cCk7CisJCXAgPSBUR0VUU1RSKCJwYyIsICZ0cCk7CisJCWlmIChwKQorCQkgICAgUEMgPSAqcDsKKyMgZW5kaWYgLyogaHB1eCAqLworCSAgICB9CisJfQorCWVsc2UJICAgIC8qIHRyeSA9PSAwIHx8IHRyeSA9PSAyICovCisjZW5kaWYgLyogSEFWRV9UR0VURU5UICovCisJLyoKKwkgKiBVc2UgYnVpbHRpbiB0ZXJtY2FwCisJICovCisJeworI2lmZGVmIEhBVkVfVEdFVEVOVAorCSAgICAvKgorCSAgICAgKiBJZiBidWlsdGluIHRlcm1jYXAgd2FzIGFscmVhZHkgdXNlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZWFyY2gKKwkgICAgICogZm9yIHRoZSBidWlsdGluIHRlcm1jYXAgYWdhaW4sIHF1aXQgbm93LgorCSAgICAgKi8KKwkgICAgaWYgKHRyeSA9PSAyICYmIGJ1aWx0aW5fZmlyc3QgJiYgdGVybWNhcF9jbGVhcmVkKQorCQlicmVhazsKKyNlbmRpZgorCSAgICAvKgorCSAgICAgKiBzZWFyY2ggZm9yICd0ZXJtJyBpbiBidWlsdGluX3Rlcm1jYXBzW10KKwkgICAgICovCisJICAgIHRlcm1wID0gZmluZF9idWlsdGluX3Rlcm0odGVybSk7CisJICAgIGlmICh0ZXJtcC0+YnRfc3RyaW5nID09IE5VTEwpCS8qIGRpZCBub3QgZmluZCBpdCAqLworCSAgICB7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJCS8qCisJCSAqIElmIHRyeSA9PSAwLCBmaXJzdCB0cnkgdGhlIGV4dGVybmFsIHRlcm1jYXAuIElmIHRoYXQgaXMgbm90CisJCSAqIGZvdW5kIHdlJ2xsIGdldCBiYWNrIGhlcmUgd2l0aCB0cnkgPT0gMi4KKwkJICogSWYgdGVybWNhcF9jbGVhcmVkIGlzIHNldCB3ZSB1c2VkIHRoZSBleHRlcm5hbCB0ZXJtY2FwLAorCQkgKiBkb24ndCBjb21wbGFpbiBhYm91dCBub3QgZmluZGluZyB0aGUgdGVybSBpbiB0aGUgYnVpbHRpbgorCQkgKiB0ZXJtY2FwLgorCQkgKi8KKwkJaWYgKHRyeSA9PSAwKQkJCS8qIHRyeSBleHRlcm5hbCBvbmUgKi8KKwkJICAgIGNvbnRpbnVlOworCQlpZiAodGVybWNhcF9jbGVhcmVkKQkJLyogZm91bmQgaW4gZXh0ZXJuYWwgdGVybWNhcCAqLworCQkgICAgYnJlYWs7CisjZW5kaWYKKworCQltY2hfZXJybXNnKCJcclxuIik7CisJCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwkJeworCQkgICAgbWNoX2Vycm1zZygoY2hhciAqKWVycm9yX21zZyk7CisJCSAgICBtY2hfZXJybXNnKCJcclxuIik7CisJCX0KKwkJbWNoX2Vycm1zZygiJyIpOworCQltY2hfZXJybXNnKChjaGFyICopdGVybSk7CisJCW1jaF9lcnJtc2coXygiJyBub3Qga25vd24uIEF2YWlsYWJsZSBidWlsdGluIHRlcm1pbmFscyBhcmU6IikpOworCQltY2hfZXJybXNnKCJcclxuIik7CisJCWZvciAodGVybXAgPSAmKGJ1aWx0aW5fdGVybWNhcHNbMF0pOyB0ZXJtcC0+YnRfc3RyaW5nICE9IE5VTEw7CisJCQkJCQkJCSAgICAgICsrdGVybXApCisJCXsKKwkJICAgIGlmICh0ZXJtcC0+YnRfZW50cnkgPT0gKGludClLU19OQU1FKQorCQkgICAgeworI2lmZGVmIEhBVkVfVEdFVEVOVAorCQkJbWNoX2Vycm1zZygiICAgIGJ1aWx0aW5fIik7CisjZWxzZQorCQkJbWNoX2Vycm1zZygiICAgICIpOworI2VuZGlmCisJCQltY2hfZXJybXNnKHRlcm1wLT5idF9zdHJpbmcpOworCQkJbWNoX2Vycm1zZygiXHJcbiIpOworCQkgICAgfQorCQl9CisJCS8qIHdoZW4gdXNlciB0eXBlZCA6c2V0IHRlcm09eHh4LCBxdWl0IGhlcmUgKi8KKwkJaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKKwkJeworCQkgICAgc2NyZWVuX3N0YXJ0KCk7CS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCQkgICAgd2FpdF9yZXR1cm4oVFJVRSk7CisJCSAgICByZXR1cm4gRkFJTDsKKwkJfQorCQl0ZXJtID0gREVGQVVMVF9URVJNOworCQltY2hfZXJybXNnKF8oImRlZmF1bHRpbmcgdG8gJyIpKTsKKwkJbWNoX2Vycm1zZygoY2hhciAqKXRlcm0pOworCQltY2hfZXJybXNnKCInXHJcbiIpOworCQlpZiAoZW1zZ19zaWxlbnQgPT0gMCkKKwkJeworCQkgICAgc2NyZWVuX3N0YXJ0KCk7CS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCQkgICAgb3V0X2ZsdXNoKCk7CisJCSAgICB1aV9kZWxheSgyMDAwTCwgVFJVRSk7CisJCX0KKwkJc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikidGVybSIsIC0xLCB0ZXJtLCBPUFRfRlJFRSk7CisJCWRpc3BsYXlfZXJyb3JzKCk7CisJICAgIH0KKwkgICAgb3V0X2ZsdXNoKCk7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJICAgIGlmICghdGVybWNhcF9jbGVhcmVkKQorCSAgICB7CisjZW5kaWYKKwkJY2xlYXJfdGVybW9wdGlvbnMoKTsJICAgIC8qIGNsZWFyIG9sZCBvcHRpb25zICovCisjaWZkZWYgSEFWRV9UR0VURU5UCisJCXRlcm1jYXBfY2xlYXJlZCA9IFRSVUU7CisJICAgIH0KKyNlbmRpZgorCSAgICBwYXJzZV9idWlsdGluX3RjYXAodGVybSk7CisjaWZkZWYgRkVBVF9HVUkKKwkgICAgaWYgKHRlcm1faXNfZ3VpKHRlcm0pKQorCSAgICB7CisJCW91dF9mbHVzaCgpOworCQlndWlfaW5pdCgpOworCQkvKiBJZiBzdGFydGluZyB0aGUgR1VJIGZhaWxlZCwgZG9uJ3QgZG8gYW55IG9mIHRoZSBvdGhlcgorCQkgKiB0aGluZ3MgZm9yIHRoaXMgdGVybWluYWwgKi8KKwkJaWYgKCFndWkuaW5fdXNlKQorCQkgICAgcmV0dXJuIEZBSUw7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJCWJyZWFrOwkJLyogZG9uJ3QgdHJ5IHVzaW5nIGV4dGVybmFsIHRlcm1jYXAgKi8KKyNlbmRpZgorCSAgICB9CisjZW5kaWYgLyogRkVBVF9HVUkgKi8KKwl9CisjaWZkZWYgSEFWRV9UR0VURU5UCisgICAgfQorI2VuZGlmCisKKy8qCisgKiBzcGVjaWFsOiBUaGVyZSBpcyBubyBpbmZvIGluIHRoZSB0ZXJtY2FwIGFib3V0IHdoZXRoZXIgdGhlIGN1cnNvcgorICogcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzY3JlZW4gb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICogc2Nyb2xsaW5nIHJlZ2lvbi4gIFdlIGp1c3QgZ3Vlc3MgaGVyZS4gT25seSBtc2RvcyBwY3Rlcm0gaXMga25vd24gdG8gZG8gaXQKKyAqIHJlbGF0aXZlLgorICovCisgICAgaWYgKFNUUkNNUCh0ZXJtLCAicGN0ZXJtIikgPT0gMCkKKwlUX0NDUyA9IChjaGFyX3UgKikieWVzIjsKKyAgICBlbHNlCisJVF9DQ1MgPSBlbXB0eV9vcHRpb247CisKKyNpZmRlZiBVTklYCisvKgorICogQW55ICJzdHR5IiBzZXR0aW5ncyBvdmVycmlkZSB0aGUgZGVmYXVsdCBmb3IgdF9rYiBmcm9tIHRoZSB0ZXJtY2FwLgorICogVGhpcyBpcyBpbiBvc191bml4LmMsIGJlY2F1c2UgaXQgZGVwZW5kcyBhIGxvdCBvbiB0aGUgdmVyc2lvbiBvZiB1bml4IHRoYXQKKyAqIGlzIGJlaW5nIHVzZWQuCisgKiBEb24ndCBkbyB0aGlzIHdoZW4gdGhlIEdVSSBpcyBhY3RpdmUsIGl0IHVzZXMgInRfa2IiIGFuZCAidF9rRCIgZGlyZWN0bHkuCisgKi8KKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmICghZ3VpLmluX3VzZSkKKyNlbmRpZgorCWdldF9zdHR5KCk7CisjZW5kaWYKKworLyoKKyAqIElmIHRoZSB0ZXJtY2FwIGhhcyBubyBlbnRyeSBmb3IgJ2JzJyBhbmQvb3IgJ2RlbCcgYW5kIHRoZSBpb2N0bCgpIGFsc28KKyAqIGRpZG4ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgQ1RSTC1ICisgKiBUaGUgZGVmYXVsdCBmb3IgdF9rRCBpcyBERUwsIHVubGVzcyB0X2tiIGlzIERFTC4KKyAqIFRoZSB2aW1fc3Ryc2F2ZSdkIHN0cmluZ3MgYXJlIHByb2JhYmx5IGxvc3QgZm9yZXZlciwgd2VsbCBpdCdzIG9ubHkgdHdvCisgKiBieXRlcy4gIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgR1VJIGlzIGFjdGl2ZSwgaXQgdXNlcyAidF9rYiIgYW5kICJ0X2tEIgorICogZGlyZWN0bHkuCisgKi8KKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmICghZ3VpLmluX3VzZSkKKyNlbmRpZgorICAgIHsKKwlic19wID0gZmluZF90ZXJtY29kZSgoY2hhcl91ICopImtiIik7CisJZGVsX3AgPSBmaW5kX3Rlcm1jb2RlKChjaGFyX3UgKikia0QiKTsKKwlpZiAoYnNfcCA9PSBOVUxMIHx8ICpic19wID09IE5VTCkKKwkgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKikia2IiLCAoYnNfcCA9IChjaGFyX3UgKilDVFJMX0hfU1RSKSwgRkFMU0UpOworCWlmICgoZGVsX3AgPT0gTlVMTCB8fCAqZGVsX3AgPT0gTlVMKSAmJgorCQkJCQkgICAgKGJzX3AgPT0gTlVMTCB8fCAqYnNfcCAhPSBERUwpKQorCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKSJrRCIsIChjaGFyX3UgKilERUxfU1RSLCBGQUxTRSk7CisgICAgfQorCisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKyAgICB0ZXJtX2lzX3h0ZXJtID0gdmltX2lzX3h0ZXJtKHRlcm0pOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX01PVVNFCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisjICBpZmRlZiBGRUFUX01PVVNFX1RUWQorICAgIC8qCisgICAgICogRm9yIFVuaXgsIHNldCB0aGUgJ3R0eW1vdXNlJyBvcHRpb24gdG8gdGhlIHR5cGUgb2YgbW91c2UgdG8gYmUgdXNlZC4KKyAgICAgKiBUaGUgdGVybWNvZGUgZm9yIHRoZSBtb3VzZSBpcyBhZGRlZCBhcyBhIHNpZGUgZWZmZWN0IGluIG9wdGlvbi5jLgorICAgICAqLworICAgIHsKKwljaGFyX3UJKnA7CisKKwlwID0gKGNoYXJfdSAqKSIiOworIyAgaWZkZWYgRkVBVF9NT1VTRV9YVEVSTQorIyAgIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisjICAgIGlmZGVmIEZFQVRfR1VJCisJaWYgKCFndWkuaW5fdXNlKQorIyAgICBlbmRpZgorCSAgICBjbGlwX2luaXQoRkFMU0UpOworIyAgIGVuZGlmCisJaWYgKHRlcm1faXNfeHRlcm0pCisJeworCSAgICBpZiAodXNlX3h0ZXJtX21vdXNlKCkpCisJCXAgPSBOVUxMOwkvKiBrZWVwIGV4aXN0aW5nIHZhbHVlLCBtaWdodCBiZSAieHRlcm0yIiAqLworCSAgICBlbHNlCisJCXAgPSAoY2hhcl91ICopInh0ZXJtIjsKKwl9CisjICBlbmRpZgorCWlmIChwICE9IE5VTEwpCisJICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJ0dHltIiwgMEwsIHAsIDApOworCWlmIChwID09IE5VTEwKKyMgICBpZmRlZiBGRUFUX0dVSQorCQl8fCBndWkuaW5fdXNlCisjICAgZW5kaWYKKwkJKQorCSAgICBjaGVja19tb3VzZV90ZXJtY29kZSgpOwkvKiBzZXQgbW91c2UgdGVybWNvZGUgYW55d2F5ICovCisgICAgfQorIyAgZW5kaWYKKyMgZWxzZQorICAgIHNldF9tb3VzZV90ZXJtY29kZShLU19NT1VTRSwgKGNoYXJfdSAqKSJcMjMzTSIpOworIyBlbmRpZgorI2VuZGlmCS8qIEZFQVRfTU9VU0UgKi8KKworI2lmZGVmIEZFQVRfU05JRkYKKyAgICB7CisJY2hhcl91CW5hbWVbMl07CisKKwluYW1lWzBdID0gKGludClLU19FWFRSQTsKKwluYW1lWzFdID0gKGludClLRV9TTklGRjsKKwlhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKSJcMjMzc25pZmYiLCBGQUxTRSk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBVU0VfVEVSTV9DT05TT0xFCisgICAgLyogREVGQVVMVF9URVJNIGluZGljYXRlcyB0aGF0IGl0IGlzIHRoZSBtYWNoaW5lIGNvbnNvbGUuICovCisgICAgaWYgKFNUUkNNUCh0ZXJtLCBERUZBVUxUX1RFUk0pICE9IDApCisJdGVybV9jb25zb2xlID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKwl0ZXJtX2NvbnNvbGUgPSBUUlVFOworIyBpZmRlZiBBTUlHQQorCXdpbl9yZXNpemVfb24oKTsJLyogZW5hYmxlIHdpbmRvdyByZXNpemluZyByZXBvcnRzICovCisjIGVuZGlmCisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorICAgIC8qCisgICAgICogJ3R0eWZhc3QnIGlzIGRlZmF1bHQgb24gZm9yIHh0ZXJtLCBpcmlzLWFuc2kgYW5kIGEgZmV3IG90aGVycy4KKyAgICAgKi8KKyAgICBpZiAodmltX2lzX2Zhc3R0ZXJtKHRlcm0pKQorCXBfdGYgPSBUUlVFOworI2VuZGlmCisjaWZkZWYgVVNFX1RFUk1fQ09OU09MRQorICAgIC8qCisgICAgICogJ3R0eWZhc3QnIGlzIGRlZmF1bHQgb24gY29uc29sZXMKKyAgICAgKi8KKyAgICBpZiAodGVybV9jb25zb2xlKQorCXBfdGYgPSBUUlVFOworI2VuZGlmCisKKyAgICB0dGVzdChUUlVFKTsJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzZXQgb2YgdGVybWluYWwgY29kZXMgKi8KKworICAgIGZ1bGxfc2NyZWVuID0gVFJVRTsJCS8qIHdlIGNhbiB1c2UgdGVybWNhcCBjb2RlcyBmcm9tIG5vdyBvbiAqLworICAgIHNldF90ZXJtX2RlZmF1bHRzKCk7CS8qIHVzZSBjdXJyZW50IHZhbHVlcyBhcyBkZWZhdWx0cyAqLworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisgICAgY3J2X3N0YXR1cyA9IENSVl9HRVQ7CS8qIEdldCB0ZXJtaW5hbCB2ZXJzaW9uIGxhdGVyICovCisjZW5kaWYKKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdGVybWNhcCBjb2Rlcy4KKyAgICAgKiBTZXQgdGhlIG1vdXNlIGFuZCB3aW5kb3cgdGl0bGUgaWYgcG9zc2libGUuCisgICAgICogRG9uJ3QgZG8gdGhpcyB3aGVuIHN0YXJ0aW5nLCBuZWVkIHRvIHBhcnNlIHRoZSAudmltcmMgZmlyc3QsIGJlY2F1c2UgaXQKKyAgICAgKiBtYXkgcmVkZWZpbmUgdF9USSBldGMuCisgICAgICovCisgICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKKyAgICB7CisJc3RhcnR0ZXJtY2FwKCk7CQkvKiBtYXkgY2hhbmdlIHRlcm1pbmFsIG1vZGUgKi8KKyNpZmRlZiBGRUFUX01PVVNFCisJc2V0bW91c2UoKTsJCS8qIG1heSBzdGFydCB1c2luZyB0aGUgbW91c2UgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfVElUTEUKKwltYWtldGl0bGUoKTsJCS8qIG1heSBkaXNwbGF5IHdpbmRvdyB0aXRsZSAqLworI2VuZGlmCisgICAgfQorCisJLyogZGlzcGxheSBpbml0aWFsIHNjcmVlbiBhZnRlciB0dGVzdCgpIGNoZWNraW5nLiBqdy4gKi8KKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKKyAgICB7CisJLyogdGVybWNhcCBmYWlsZWQgdG8gcmVwb3J0IHNpemUgKi8KKwkvKiBzZXQgZGVmYXVsdHMsIGluIGNhc2UgdWlfZ2V0X3NoZWxsc2l6ZSgpIGFsc28gZmFpbHMgKi8KKwl3aWR0aCA9IDgwOworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKwloZWlnaHQgPSAyNTsJICAgIC8qIGNvbnNvbGUgaXMgb2Z0ZW4gMjUgbGluZXMgKi8KKyNlbHNlCisJaGVpZ2h0ID0gMjQ7CSAgICAvKiBtb3N0IHRlcm1pbmFscyBhcmUgMjQgbGluZXMgKi8KKyNlbmRpZgorICAgIH0KKyAgICBzZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIEZBTFNFKTsJLyogbWF5IGNoYW5nZSBSb3dzICovCisgICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKKyAgICB7CisJaWYgKHNjcm9sbF9yZWdpb24pCisJICAgIHNjcm9sbF9yZWdpb25fcmVzZXQoKTsJCS8qIEluIGNhc2UgUm93cyBjaGFuZ2VkICovCisJY2hlY2tfbWFwX2tleWNvZGVzKCk7CS8qIGNoZWNrIG1hcHBpbmdzIGZvciB0ZXJtaW5hbCBjb2RlcyB1c2VkICovCisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwl7CisJICAgIGJ1Zl9UCSpvbGRfY3VyYnVmOworCisJICAgIC8qCisJICAgICAqIEV4ZWN1dGUgdGhlIFRlcm1DaGFuZ2VkIGF1dG9jb21tYW5kcyBmb3IgZWFjaCBidWZmZXIgdGhhdCBpcworCSAgICAgKiBsb2FkZWQuCisJICAgICAqLworCSAgICBvbGRfY3VyYnVmID0gY3VyYnVmOworCSAgICBmb3IgKGN1cmJ1ZiA9IGZpcnN0YnVmOyBjdXJidWYgIT0gTlVMTDsgY3VyYnVmID0gY3VyYnVmLT5iX25leHQpCisJICAgIHsKKwkJaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9tZnAgIT0gTlVMTCkKKwkJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1RFUk1DSEFOR0VELCBOVUxMLCBOVUxMLCBGQUxTRSwKKwkJCQkJCQkJICAgICAgY3VyYnVmKTsKKwkgICAgfQorCSAgICBpZiAoYnVmX3ZhbGlkKG9sZF9jdXJidWYpKQorCQljdXJidWYgPSBvbGRfY3VyYnVmOworCX0KKyNlbmRpZgorICAgIH0KKworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisgICAgbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE9LOworfQorCisjaWYgZGVmaW5lZChGRUFUX01PVVNFKSB8fCBkZWZpbmVkKFBST1RPKQorCisjIGlmZGVmIEZFQVRfTU9VU0VfVFRZCisjICBkZWZpbmUgSE1UX05PUk1BTAkxCisjICBkZWZpbmUgSE1UX05FVFRFUk0JMgorIyAgZGVmaW5lIEhNVF9ERUMJNAorIyAgZGVmaW5lIEhNVF9KU0JURVJNCTgKKyMgIGRlZmluZSBITVRfUFRFUk0JMTYKK3N0YXRpYyBpbnQgaGFzX21vdXNlX3Rlcm1jb2RlID0gMDsKKyMgZW5kaWYKKworIyBpZiAoIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfTkVUKSBcCisJfHwgZGVmaW5lZChGRUFUX01PVVNFX0RFQykpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9KU0IpIFwKKwl8fCBkZWZpbmVkKEZFQVRfTU9VU0VfUFRFUk0pIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorc2V0X21vdXNlX3Rlcm1jb2RlKG4sIHMpCisgICAgaW50CQluOwkvKiBLU19NT1VTRSwgS1NfTkVUVEVSTV9NT1VTRSBvciBLU19ERUNfTU9VU0UgKi8KKyAgICBjaGFyX3UJKnM7Cit7CisgICAgY2hhcl91CW5hbWVbMl07CisKKyAgICBuYW1lWzBdID0gbjsKKyAgICBuYW1lWzFdID0gS0VfRklMTEVSOworICAgIGFkZF90ZXJtY29kZShuYW1lLCBzLCBGQUxTRSk7CisjICBpZmRlZiBGRUFUX01PVVNFX1RUWQorIyAgIGlmZGVmIEZFQVRfTU9VU0VfSlNCCisgICAgaWYgKG4gPT0gS1NfSlNCVEVSTV9NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX0pTQlRFUk07CisgICAgZWxzZQorIyAgIGVuZGlmCisjICAgaWZkZWYgRkVBVF9NT1VTRV9ORVQKKyAgICBpZiAobiA9PSBLU19ORVRURVJNX01PVVNFKQorCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfTkVUVEVSTTsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX0RFQworICAgIGlmIChuID09IEtTX0RFQ19NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX0RFQzsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX1BURVJNCisgICAgaWYgKG4gPT0gS1NfUFRFUk1fTU9VU0UpCisJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9QVEVSTTsKKyAgICBlbHNlCisjICAgZW5kaWYKKwloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX05PUk1BTDsKKyMgIGVuZGlmCit9CisjIGVuZGlmCisKKyMgaWYgKChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE9TMikpIFwKKwkmJiAoZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKSBcCisJICAgIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9HUE0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9QVEVSTSkpKSBcCisJICAgIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAorZGVsX21vdXNlX3Rlcm1jb2RlKG4pCisgICAgaW50CQluOwkvKiBLU19NT1VTRSwgS1NfTkVUVEVSTV9NT1VTRSBvciBLU19ERUNfTU9VU0UgKi8KK3sKKyAgICBjaGFyX3UJbmFtZVsyXTsKKworICAgIG5hbWVbMF0gPSBuOworICAgIG5hbWVbMV0gPSBLRV9GSUxMRVI7CisgICAgZGVsX3Rlcm1jb2RlKG5hbWUpOworIyAgaWZkZWYgRkVBVF9NT1VTRV9UVFkKKyMgICBpZmRlZiBGRUFUX01PVVNFX0pTQgorICAgIGlmIChuID09IEtTX0pTQlRFUk1fTU9VU0UpCisJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfSlNCVEVSTTsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX05FVAorICAgIGlmIChuID09IEtTX05FVFRFUk1fTU9VU0UpCisJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfTkVUVEVSTTsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX0RFQworICAgIGlmIChuID09IEtTX0RFQ19NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9ERUM7CisgICAgZWxzZQorIyAgIGVuZGlmCisjICAgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQorICAgIGlmIChuID09IEtTX1BURVJNX01PVVNFKQorCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX1BURVJNOworICAgIGVsc2UKKyMgICBlbmRpZgorCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX05PUk1BTDsKKyMgIGVuZGlmCit9CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEdFVEVOVAorLyoKKyAqIENhbGwgdGdldGVudCgpCisgKiBSZXR1cm4gZXJyb3IgbWVzc2FnZSBpZiBpdCBmYWlscywgTlVMTCBpZiBpdCdzIE9LLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCit0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pCisgICAgY2hhcl91ICAqdGJ1ZjsKKyAgICBjaGFyX3UgICp0ZXJtOworeworICAgIGludAkgICAgaTsKKworICAgIGkgPSBUR0VURU5UKHRidWYsIHRlcm0pOworICAgIGlmIChpIDwgMAkJICAgIC8qIC0xIGlzIGFsd2F5cyBhbiBlcnJvciAqLworIyBpZmRlZiBUR0VURU5UX1pFUk9fRVJSCisJICAgIHx8IGkgPT0gMAkgICAgLyogc29tZXRpbWVzIHplcm8gaXMgYWxzbyBhbiBlcnJvciAqLworIyBlbmRpZgorICAgICAgICkKKyAgICB7CisJLyogT24gRnJlZUJTRCB0cHV0cygpIGdldHMgYSBTRUdWIGFmdGVyIGEgdGdldGVudCgpIHdoaWNoIGZhaWxzLiAgQ2FsbAorCSAqIHRnZXRlbnQoKSB3aXRoIHRoZSBhbHdheXMgZXhpc3RpbmcgImR1bWIiIGVudHJ5IHRvIGF2b2lkIGEgY3Jhc2ggb3IKKwkgKiBoYW5nLiAqLworCSh2b2lkKVRHRVRFTlQodGJ1ZiwgImR1bWIiKTsKKworCWlmIChpIDwgMCkKKyMgaWZkZWYgVEdFVEVOVF9aRVJPX0VSUgorCSAgICByZXR1cm4gKGNoYXJfdSAqKV8oIkU1NTc6IENhbm5vdCBvcGVuIHRlcm1jYXAgZmlsZSIpOworCWlmIChpID09IDApCisjIGVuZGlmCisjaWZkZWYgVEVSTUlORk8KKwkgICAgcmV0dXJuIChjaGFyX3UgKilfKCJFNTU4OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iKTsKKyNlbHNlCisJICAgIHJldHVybiAoY2hhcl91ICopXygiRTU1OTogVGVybWluYWwgZW50cnkgbm90IGZvdW5kIGluIHRlcm1jYXAiKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNvbWUgdmVyc2lvbnMgb2YgdGdldHN0cigpIGhhdmUgYmVlbiByZXBvcnRlZCB0byByZXR1cm4gLTEgaW5zdGVhZCBvZiBOVUxMLgorICogRml4IHRoYXQgaGVyZS4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgordmltX3RnZXRzdHIocywgcHApCisgICAgY2hhcgkqczsKKyAgICBjaGFyX3UJKipwcDsKK3sKKyAgICBjaGFyCSpwOworCisgICAgcCA9IHRnZXRzdHIocywgKGNoYXIgKiopcHApOworICAgIGlmIChwID09IChjaGFyICopLTEpCisJcCA9IE5VTEw7CisgICAgcmV0dXJuIChjaGFyX3UgKilwOworfQorI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLworCisjaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpICYmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1NfWCkpCisvKgorICogR2V0IENvbHVtbnMgYW5kIFJvd3MgZnJvbSB0aGUgdGVybWNhcC4gVXNlZCBhZnRlciBhIHdpbmRvdyBzaWduYWwgaWYgdGhlCisgKiBpb2N0bCgpIGZhaWxzLiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2FsbCB0Z2V0ZW50IGVhY2ggdGltZSBpZiB0aGUgImNvIgorICogYW5kICJsaSIgZW50cmllcyBuZXZlciBjaGFuZ2UuIEJ1dCBvbiBzb21lIHN5c3RlbXMgdGhpcyB3b3Jrcy4KKyAqIEVycm9ycyB3aGlsZSBnZXR0aW5nIHRoZSBlbnRyaWVzIGFyZSBpZ25vcmVkLgorICovCisgICAgdm9pZAorZ2V0bGluZWNvbChjcCwgcnApCisgICAgbG9uZwkqY3A7CS8qIHBvaW50ZXIgdG8gY29sdW1ucyAqLworICAgIGxvbmcJKnJwOwkvKiBwb2ludGVyIHRvIHJvd3MgKi8KK3sKKyAgICBjaGFyX3UJdGJ1ZltUQlVGU1pdOworCisgICAgaWYgKFRfTkFNRSAhPSBOVUxMICYmICpUX05BTUUgIT0gTlVMICYmIHRnZXRlbnRfZXJyb3IodGJ1ZiwgVF9OQU1FKSA9PSBOVUxMKQorICAgIHsKKwlpZiAoKmNwID09IDApCisJICAgICpjcCA9IHRnZXRudW0oImNvIik7CisJaWYgKCpycCA9PSAwKQorCSAgICAqcnAgPSB0Z2V0bnVtKCJsaSIpOworICAgIH0KK30KKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgJiYgZGVmaW5lZChVTklYKSAqLworCisvKgorICogR2V0IGEgc3RyaW5nIGVudHJ5IGZyb20gdGhlIHRlcm1jYXAgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB0ZXJtY29kZXMuCisgKiBVc2VkIGZvciA8dF94eD4gc3BlY2lhbCBrZXlzLgorICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlIHdoZW4gbm90IHNvdXJjaW5nLgorICogSWYgZm9yY2UgZ2l2ZW4sIHJlcGxhY2UgYW4gZXhpc3RpbmcgZW50cnkuCisgKiBSZXR1cm4gRkFJTCBpZiB0aGUgZW50cnkgd2FzIG5vdCBmb3VuZCwgT0sgaWYgdGhlIGVudHJ5IHdhcyBhZGRlZC4KKyAqLworICAgIGludAorYWRkX3Rlcm1jYXBfZW50cnkobmFtZSwgZm9yY2UpCisgICAgY2hhcl91ICAqbmFtZTsKKyAgICBpbnQJICAgIGZvcmNlOworeworICAgIGNoYXJfdSAgKnRlcm07CisgICAgaW50CSAgICBrZXk7CisgICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqdGVybXA7CisjaWZkZWYgSEFWRV9UR0VURU5UCisgICAgY2hhcl91ICAqc3RyaW5nOworICAgIGludAkgICAgaTsKKyAgICBpbnQJICAgIGJ1aWx0aW5fZmlyc3Q7CisgICAgY2hhcl91ICB0YnVmW1RCVUZTWl07CisgICAgY2hhcl91ICB0c3RyYnVmW1RCVUZTWl07CisgICAgY2hhcl91ICAqdHAgPSB0c3RyYnVmOworICAgIGNoYXJfdSAgKmVycm9yX21zZyA9IE5VTEw7CisjZW5kaWYKKworLyoKKyAqIElmIHRoZSBHVUkgaXMgcnVubmluZyBvciB3aWxsIHN0YXJ0IGluIGEgbW9tZW50LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGtleXMKKyAqIHRoYXQgdGhlIEdVSSBjYW4gcHJvZHVjZS4KKyAqLworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UgfHwgZ3VpLnN0YXJ0aW5nKQorCXJldHVybiBndWlfbWNoX2hhc2tleShuYW1lKTsKKyNlbmRpZgorCisgICAgaWYgKCFmb3JjZSAmJiBmaW5kX3Rlcm1jb2RlKG5hbWUpICE9IE5VTEwpCSAgICAvKiBpdCdzIGFscmVhZHkgdGhlcmUgKi8KKwlyZXR1cm4gT0s7CisKKyAgICB0ZXJtID0gVF9OQU1FOworICAgIGlmICh0ZXJtID09IE5VTEwgfHwgKnRlcm0gPT0gTlVMKQkgICAgLyogJ3Rlcm0nIG5vdCBkZWZpbmVkIHlldCAqLworCXJldHVybiBGQUlMOworCisgICAgaWYgKHRlcm1faXNfYnVpbHRpbih0ZXJtKSkJCSAgICAvKiBuYW1lIHN0YXJ0cyB3aXRoICJidWlsdGluXyIgKi8KKyAgICB7CisJdGVybSArPSA4OworI2lmZGVmIEhBVkVfVEdFVEVOVAorCWJ1aWx0aW5fZmlyc3QgPSBUUlVFOworI2VuZGlmCisgICAgfQorI2lmZGVmIEhBVkVfVEdFVEVOVAorICAgIGVsc2UKKwlidWlsdGluX2ZpcnN0ID0gcF90Ymk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEdFVEVOVAorLyoKKyAqIFdlIGNhbiBnZXQgdGhlIGVudHJ5IGZyb20gdGhlIGJ1aWx0aW4gdGVybWNhcCBhbmQgZnJvbSB0aGUgZXh0ZXJuYWwgb25lLgorICogSWYgJ3R0eWJ1aWx0aW4nIGlzIG9uIG9yIHRoZSB0ZXJtaW5hbCBuYW1lIHN0YXJ0cyB3aXRoICJidWlsdGluXyIsIHRyeQorICogYnVpbHRpbiB0ZXJtY2FwIGZpcnN0LgorICogSWYgJ3R0eWJ1aWx0aW4nIGlzIG9mZiwgdHJ5IGV4dGVybmFsIHRlcm1jYXAgZmlyc3QuCisgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQorICAgIHsKKwlpZiAoIWJ1aWx0aW5fZmlyc3QgPT0gaSkKKyNlbmRpZgorCS8qCisJICogU2VhcmNoIGluIGJ1aWx0aW4gdGVybWNhcAorCSAqLworCXsKKwkgICAgdGVybXAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKKwkgICAgaWYgKHRlcm1wLT5idF9zdHJpbmcgIT0gTlVMTCkJLyogZm91bmQgaXQgKi8KKwkgICAgeworCQlrZXkgPSBURVJNQ0FQMktFWShuYW1lWzBdLCBuYW1lWzFdKTsKKwkJd2hpbGUgKHRlcm1wLT5idF9lbnRyeSAhPSAoaW50KUtTX05BTUUpCisJCXsKKwkJICAgIGlmICgoaW50KXRlcm1wLT5idF9lbnRyeSA9PSBrZXkpCisJCSAgICB7CisJCQlhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKXRlcm1wLT5idF9zdHJpbmcsCisJCQkJCQkJICB0ZXJtX2lzXzhiaXQodGVybSkpOworCQkJcmV0dXJuIE9LOworCQkgICAgfQorCQkgICAgKyt0ZXJtcDsKKwkJfQorCSAgICB9CisJfQorI2lmZGVmIEhBVkVfVEdFVEVOVAorCWVsc2UKKwkvKgorCSAqIFNlYXJjaCBpbiBleHRlcm5hbCB0ZXJtY2FwCisJICovCisJeworCSAgICBlcnJvcl9tc2cgPSB0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pOworCSAgICBpZiAoZXJyb3JfbXNnID09IE5VTEwpCisJICAgIHsKKwkJc3RyaW5nID0gVEdFVFNUUigoY2hhciAqKW5hbWUsICZ0cCk7CisJCWlmIChzdHJpbmcgIT0gTlVMTCAmJiAqc3RyaW5nICE9IE5VTCkKKwkJeworCQkgICAgYWRkX3Rlcm1jb2RlKG5hbWUsIHN0cmluZywgRkFMU0UpOworCQkgICAgcmV0dXJuIE9LOworCQl9CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoc291cmNpbmdfbmFtZSA9PSBOVUxMKQorICAgIHsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwlpZiAoZXJyb3JfbXNnICE9IE5VTEwpCisJICAgIEVNU0coZXJyb3JfbXNnKTsKKwllbHNlCisjZW5kaWYKKwkgICAgRU1TRzIoXygiRTQzNjogTm8gXCIlc1wiIGVudHJ5IGluIHRlcm1jYXAiKSwgbmFtZSk7CisgICAgfQorICAgIHJldHVybiBGQUlMOworfQorCisgICAgc3RhdGljIGludAordGVybV9pc19idWlsdGluKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICByZXR1cm4gKFNUUk5DTVAobmFtZSwgImJ1aWx0aW5fIiwgKHNpemVfdCk4KSA9PSAwKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRlcm1pbmFsICJuYW1lIiB1c2VzIENTSSBpbnN0ZWFkIG9mIDxFc2M+Wy4KKyAqIEFzc3VtZSB0aGF0IHRoZSB0ZXJtaW5hbCBpcyB1c2luZyA4LWJpdCBjb250cm9scyB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zCisgKiAiOGJpdCIsIGxpa2UgaW4gInh0ZXJtLThiaXQiLgorICovCisgICAgaW50Cit0ZXJtX2lzXzhiaXQobmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOworeworICAgIHJldHVybiAoZGV0ZWN0ZWRfOGJpdCB8fCBzdHJzdHIoKGNoYXIgKiluYW1lLCAiOGJpdCIpICE9IE5VTEwpOworfQorCisvKgorICogVHJhbnNsYXRlIHRlcm1pbmFsIGNvbnRyb2wgY2hhcnMgZnJvbSA3LWJpdCB0byA4LWJpdDoKKyAqIDxFc2M+WyAtPiBDU0kKKyAqIDxFc2M+XSAtPiA8TS1DLV0+CisgKiA8RXNjPk8gLT4gPE0tQy1PPgorICovCisgICAgc3RhdGljIGludAordGVybV83dG84Yml0KHApCisgICAgY2hhcl91ICAqcDsKK3sKKyAgICBpZiAoKnAgPT0gRVNDKQorICAgIHsKKwlpZiAocFsxXSA9PSAnWycpCisJICAgIHJldHVybiBDU0k7CisJaWYgKHBbMV0gPT0gJ10nKQorCSAgICByZXR1cm4gMHg5ZDsKKwlpZiAocFsxXSA9PSAnTycpCisJICAgIHJldHVybiAweDhmOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIEZFQVRfR1VJCisgICAgaW50Cit0ZXJtX2lzX2d1aShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgcmV0dXJuIChTVFJDTVAobmFtZSwgImJ1aWx0aW5fZ3VpIikgPT0gMCB8fCBTVFJDTVAobmFtZSwgImd1aSIpID09IDApOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1RHRVRFTlQpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoUFJPVE8pCisKKyAgICBjaGFyX3UgKgordGx0b2EoaSkKKyAgICB1bnNpZ25lZCBsb25nIGk7Cit7CisgICAgc3RhdGljIGNoYXJfdSBidWZbMTZdOworICAgIGNoYXJfdQkqcDsKKworICAgIHAgPSBidWYgKyAxNTsKKyAgICAqcCA9ICdcMCc7CisgICAgZG8KKyAgICB7CisJLS1wOworCSpwID0gKGNoYXJfdSkgKGkgJSAxMCArICcwJyk7CisJaSAvPSAxMDsKKyAgICB9CisgICAgd2hpbGUgKGkgPiAwICYmIHAgPiBidWYpOworICAgIHJldHVybiBwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9UR0VURU5UCisKKy8qCisgKiBtaW5pbWFsIHRnb3RvKCkgaW1wbGVtZW50YXRpb24uCisgKiBubyBwYWRkaW5nIGFuZCB3ZSBvbmx5IHBhcnNlIGZvciAlaSAlZCBhbmQgJStjaGFyCisgKi8KK2NoYXIgKnRnb3RvIF9fQVJHUygoY2hhciAqLCBpbnQsIGludCkpOworCisgICAgY2hhciAqCit0Z290byhjbSwgeCwgeSkKKyAgICBjaGFyICpjbTsKKyAgICBpbnQgeCwgeTsKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbMzBdOworICAgIGNoYXIgKnAsICpzLCAqZTsKKworICAgIGlmICghY20pCisJcmV0dXJuICJPT1BTIjsKKyAgICBlID0gYnVmICsgMjk7CisgICAgZm9yIChzID0gYnVmOyBzIDwgZSAmJiAqY207IGNtKyspCisgICAgeworCWlmICgqY20gIT0gJyUnKQorCXsKKwkgICAgKnMrKyA9ICpjbTsKKwkgICAgY29udGludWU7CisJfQorCXN3aXRjaCAoKisrY20pCisJeworCWNhc2UgJ2QnOgorCSAgICBwID0gKGNoYXIgKil0bHRvYSgodW5zaWduZWQgbG9uZyl5KTsKKwkgICAgeSA9IHg7CisJICAgIHdoaWxlICgqcCkKKwkJKnMrKyA9ICpwKys7CisJICAgIGJyZWFrOworCWNhc2UgJ2knOgorCSAgICB4Kys7CisJICAgIHkrKzsKKwkgICAgYnJlYWs7CisJY2FzZSAnKyc6CisJICAgICpzKysgPSAoY2hhcikoKisrY20gKyB5KTsKKwkgICAgeSA9IHg7CisJICAgIGJyZWFrOworCWNhc2UgJyUnOgorCSAgICAqcysrID0gKmNtOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICByZXR1cm4gIk9PUFMiOworCX0KKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIHJldHVybiBidWY7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KKworLyoKKyAqIFNldCB0aGUgdGVybWluYWwgbmFtZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgb3B0aW9ucy4KKyAqIElmICJuYW1lIiBpcyBOVUxMIG9yIGVtcHR5LCBnZXQgdGhlIHRlcm1pbmFsIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQuCisgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGRlZmF1bHQgdGVybWluYWwgbmFtZS4KKyAqLworICAgIHZvaWQKK3Rlcm1jYXBpbml0KG5hbWUpCisgICAgY2hhcl91ICpuYW1lOworeworICAgIGNoYXJfdQkqdGVybTsKKworICAgIGlmIChuYW1lICE9IE5VTEwgJiYgKm5hbWUgPT0gTlVMKQorCW5hbWUgPSBOVUxMOwkgICAgLyogZW1wdHkgbmFtZSBpcyBlcXVhbCB0byBubyBuYW1lICovCisgICAgdGVybSA9IG5hbWU7CisKKyNpZmRlZiBfX0JFT1NfXworICAgIC8qCisgICAgICogVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3JtYWxseSBzZXQgdG8gJ2Fuc2knIG9uIHRoZSBCZWJveDsKKyAgICAgKiBTaW5jZSB0aGUgQmVCb3ggZG9lc24ndCBxdWl0ZSBzdXBwb3J0IGZ1bGwgQU5TSSB5ZXQsIHdlIHVzZSBvdXIKKyAgICAgKiBvd24gY3VzdG9tICdhbnNpLWJlb3MnIHRlcm1jYXAgaW5zdGVhZCwgdW5sZXNzIHRoZSAtVCBvcHRpb24gaGFzCisgICAgICogYmVlbiBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqLworICAgIGlmICh0ZXJtID09IE5VTEwKKwkJICYmIHN0cmNtcCgoY2hhciAqKW1jaF9nZXRlbnYoKGNoYXJfdSAqKSJURVJNIiksICJhbnNpIikgPT0gMCkKKwl0ZXJtID0gREVGQVVMVF9URVJNOworI2VuZGlmCisjaWZuZGVmIE1TV0lOCisgICAgaWYgKHRlcm0gPT0gTlVMTCkKKwl0ZXJtID0gbWNoX2dldGVudigoY2hhcl91ICopIlRFUk0iKTsKKyNlbmRpZgorICAgIGlmICh0ZXJtID09IE5VTEwgfHwgKnRlcm0gPT0gTlVMKQorCXRlcm0gPSBERUZBVUxUX1RFUk07CisgICAgc2V0X3N0cmluZ19vcHRpb25fZGlyZWN0KChjaGFyX3UgKikidGVybSIsIC0xLCB0ZXJtLCBPUFRfRlJFRSk7CisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdGVybWluYWwgbmFtZS4gKi8KKyAgICBzZXRfc3RyaW5nX2RlZmF1bHQoInRlcm0iLCB0ZXJtKTsKKyAgICBzZXRfc3RyaW5nX2RlZmF1bHQoInR0eXR5cGUiLCB0ZXJtKTsKKworICAgIC8qCisgICAgICogQXZvaWQgdXNpbmcgInRlcm0iIGhlcmUsIGJlY2F1c2UgdGhlIG5leHQgbWNoX2dldGVudigpIG1heSBvdmVyd3JpdGUgaXQuCisgICAgICovCisgICAgc2V0X3Rlcm1uYW1lKFRfTkFNRSAhPSBOVUxMID8gVF9OQU1FIDogdGVybSk7Cit9CisKKy8qCisgKiB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHVpX3dyaXRlIGlzIHJlZHVjZWQgYnkgdXNpbmcgdGhlIGJ1ZmZlciAib3V0X2J1ZiIKKyAqLworI2lmZGVmIERPUzE2CisjIGRlZmluZSBPVVRfU0laRQkyNTUJCS8qIG9ubHkgaGF2ZSA2NDBLIHRvdGFsLi4uICovCisjZWxzZQorIyBpZmRlZiBGRUFUX0dVSV9XMTYKKyMgIGRlZmluZSBPVVRfU0laRQkxMDIzCQkvKiBTYXZlIHByZWNpb3VzIDFLIG5lYXIgZGF0YSAqLworIyBlbHNlCisjICBkZWZpbmUgT1VUX1NJWkUJMjA0NworIyBlbmRpZgorI2VuZGlmCisJICAgIC8qIEFkZCBvbmUgdG8gYWxsb3cgbWNoX3dyaXRlKCkgaW4gb3Nfd2luMzIuYyB0byBhcHBlbmQgYSBOVUwgKi8KK3N0YXRpYyBjaGFyX3UJCW91dF9idWZbT1VUX1NJWkUgKyAxXTsKK3N0YXRpYyBpbnQJCW91dF9wb3MgPSAwOwkvKiBudW1iZXIgb2YgY2hhcnMgaW4gb3V0X2J1ZiAqLworCisvKgorICogb3V0X2ZsdXNoKCk6IGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyCisgKi8KKyAgICB2b2lkCitvdXRfZmx1c2goKQoreworICAgIGludAkgICAgbGVuOworCisgICAgaWYgKG91dF9wb3MgIT0gMCkKKyAgICB7CisJLyogc2V0IG91dF9wb3MgdG8gMCBiZWZvcmUgdWlfd3JpdGUsIHRvIGF2b2lkIHJlY3Vyc2l2ZW5lc3MgKi8KKwlsZW4gPSBvdXRfcG9zOworCW91dF9wb3MgPSAwOworCXVpX3dyaXRlKG91dF9idWYsIGxlbik7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNvbWV0aW1lcyBhIGJ5dGUgb3V0IG9mIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgaXMgd3JpdHRlbiB3aXRoIG91dF9jaGFyKCkuCisgKiBUbyBhdm9pZCBmbHVzaGluZyBoYWxmIG9mIHRoZSBjaGFyYWN0ZXIsIGNhbGwgdGhpcyBmdW5jdGlvbiBmaXJzdC4KKyAqLworICAgIHZvaWQKK291dF9mbHVzaF9jaGVjaygpCit7CisgICAgaWYgKGVuY19kYmNzICE9IDAgJiYgb3V0X3BvcyA+PSBPVVRfU0laRSAtIE1CX01BWEJZVEVTKQorCW91dF9mbHVzaCgpOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSQorLyoKKyAqIG91dF90cmFzaCgpOiBUaHJvdyBhd2F5IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICovCisgICAgdm9pZAorb3V0X3RyYXNoKCkKK3sKKyAgICBvdXRfcG9zID0gMDsKK30KKyNlbmRpZgorCisvKgorICogb3V0X2NoYXIoYyk6IHB1dCBhIGJ5dGUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCQlGbHVzaCBpdCBpZiBpdCBiZWNvbWVzIGZ1bGwuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igb3V0cHV0dGluZyB0ZXh0IG9uIHRoZSBzY3JlZW4gKHVzZSBmdW5jdGlvbnMKKyAqIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCisgKi8KKyAgICB2b2lkCitvdXRfY2hhcihjKQorICAgIHVuc2lnbmVkCWM7Cit7CisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChNQUNPU19YX1VOSVgpCisgICAgaWYgKGMgPT0gJ1xuJykJLyogdHVybiBMRiBpbnRvIENSLUxGIChDUk1PRCBkb2Vzbid0IHNlZW0gdG8gZG8gdGhpcykgKi8KKwlvdXRfY2hhcignXHInKTsKKyNlbmRpZgorCisgICAgb3V0X2J1ZltvdXRfcG9zKytdID0gYzsKKworICAgIC8qIEZvciB0ZXN0aW5nIHdlIGZsdXNoIGVhY2ggdGltZS4gKi8KKyAgICBpZiAob3V0X3BvcyA+PSBPVVRfU0laRSB8fCBwX3dkKQorCW91dF9mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZCBvdXRfY2hhcl9uZiBfX0FSR1MoKHVuc2lnbmVkKSk7CisKKy8qCisgKiBvdXRfY2hhcl9uZihjKTogbGlrZSBvdXRfY2hhcigpLCBidXQgZG9uJ3QgZmx1c2ggd2hlbiBwX3dkIGlzIHNldAorICovCisgICAgc3RhdGljIHZvaWQKK291dF9jaGFyX25mKGMpCisgICAgdW5zaWduZWQJYzsKK3sKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyAgICBpZiAoYyA9PSAnXG4nKQkvKiB0dXJuIExGIGludG8gQ1ItTEYgKENSTU9EIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzKSAqLworCW91dF9jaGFyX25mKCdccicpOworI2VuZGlmCisKKyAgICBvdXRfYnVmW291dF9wb3MrK10gPSBjOworCisgICAgaWYgKG91dF9wb3MgPj0gT1VUX1NJWkUpCisJb3V0X2ZsdXNoKCk7Cit9CisKKy8qCisgKiBBIG5ldmVyLXBhZGRpbmcgb3V0X3N0ci4KKyAqIHVzZSB0aGlzIHdoZW5ldmVyIHlvdSBkb24ndCB3YW50IHRvIHJ1biB0aGUgc3RyaW5nIHRocm91Z2ggdHB1dHMuCisgKiB0cHV0cyBhYm92ZSBpcyBoYXJtbGVzcywgYnV0IHRwdXRzIGZyb20gdGhlIHRlcm1jYXAgbGlicmFyeQorICogaXMgbGlrZWx5IHRvIHN0cmlwIG9mZiBsZWFkaW5nIGRpZ2l0cywgdGhhdCBpdCBtaXN0YWtlcyBmb3IgcGFkZGluZworICogaW5mb3JtYXRpb24sIGFuZCAiJWkiLCAiJWQiLCBldGMuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHdyaXRpbmcgdGVybWluYWwgY29kZXMsIG5vdCBmb3Igb3V0cHV0dGluZworICogbm9ybWFsIHRleHQgKHVzZSBmdW5jdGlvbnMgbGlrZSBtc2dfcHV0cygpIGFuZCBzY3JlZW5fcHV0Y2hhcigpIGZvciB0aGF0KS4KKyAqLworICAgIHZvaWQKK291dF9zdHJfbmYocykKKyAgICBjaGFyX3UgKnM7Cit7CisgICAgaWYgKG91dF9wb3MgPiBPVVRfU0laRSAtIDIwKSAgLyogYXZvaWQgdGVybWluYWwgc3RyaW5ncyBiZWluZyBzcGxpdCB1cCAqLworCW91dF9mbHVzaCgpOworICAgIHdoaWxlICgqcykKKwlvdXRfY2hhcl9uZigqcysrKTsKKworICAgIC8qIEZvciB0ZXN0aW5nIHdlIHdyaXRlIG9uZSBzdHJpbmcgYXQgYSB0aW1lLiAqLworICAgIGlmIChwX3dkKQorCW91dF9mbHVzaCgpOworfQorCisvKgorICogb3V0X3N0cihzKTogUHV0IGEgY2hhcmFjdGVyIHN0cmluZyBhIGJ5dGUgYXQgYSB0aW1lIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBJZiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCB1c2UgdGhlIHRlcm1jYXAgcGFyc2VyLiAoancpCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHdyaXRpbmcgdGVybWluYWwgY29kZXMsIG5vdCBmb3Igb3V0cHV0dGluZworICogbm9ybWFsIHRleHQgKHVzZSBmdW5jdGlvbnMgbGlrZSBtc2dfcHV0cygpIGFuZCBzY3JlZW5fcHV0Y2hhcigpIGZvciB0aGF0KS4KKyAqLworICAgIHZvaWQKK291dF9zdHIocykKKyAgICBjaGFyX3UJICpzOworeworICAgIGlmIChzICE9IE5VTEwgJiYgKnMpCisgICAgeworI2lmZGVmIEZFQVRfR1VJCisJLyogRG9uJ3QgdXNlIHRwdXRzKCkgd2hlbiBHVUkgaXMgdXNlZCwgbmN1cnNlcyBjcmFzaGVzLiAqLworCWlmIChndWkuaW5fdXNlKQorCXsKKwkgICAgb3V0X3N0cl9uZihzKTsKKwkgICAgcmV0dXJuOworCX0KKyNlbmRpZgorCS8qIGF2b2lkIHRlcm1pbmFsIHN0cmluZ3MgYmVpbmcgc3BsaXQgdXAgKi8KKwlpZiAob3V0X3BvcyA+IE9VVF9TSVpFIC0gMjApCisJICAgIG91dF9mbHVzaCgpOworI2lmZGVmIEhBVkVfVEdFVEVOVAorCXRwdXRzKChjaGFyICopcywgMSwgVFBVVFNGVU5DQVNUIG91dF9jaGFyX25mKTsKKyNlbHNlCisJd2hpbGUgKCpzKQorCSAgICBvdXRfY2hhcl9uZigqcysrKTsKKyNlbmRpZgorCisJLyogRm9yIHRlc3Rpbmcgd2Ugd3JpdGUgb25lIHN0cmluZyBhdCBhIHRpbWUuICovCisJaWYgKHBfd2QpCisJICAgIG91dF9mbHVzaCgpOworICAgIH0KK30KKworLyoKKyAqIGN1cnNvciBwb3NpdGlvbmluZyB1c2luZyB0ZXJtY2FwIHBhcnNlci4gKGp3KQorICovCisgICAgdm9pZAordGVybV93aW5kZ290byhyb3csIGNvbCkKKyAgICBpbnQJICAgIHJvdzsKKyAgICBpbnQJICAgIGNvbDsKK3sKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DTSwgY29sLCByb3cpKTsKK30KKworICAgIHZvaWQKK3Rlcm1fY3Vyc29yX3JpZ2h0KGkpCisgICAgaW50CSAgICBpOworeworICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NSSSwgMCwgaSkpOworfQorCisgICAgdm9pZAordGVybV9hcHBlbmRfbGluZXMobGluZV9jb3VudCkKKyAgICBpbnQJICAgIGxpbmVfY291bnQ7Cit7CisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ0FMLCAwLCBsaW5lX2NvdW50KSk7Cit9CisKKyAgICB2b2lkCit0ZXJtX2RlbGV0ZV9saW5lcyhsaW5lX2NvdW50KQorICAgIGludAkgICAgbGluZV9jb3VudDsKK3sKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DREwsIDAsIGxpbmVfY291bnQpKTsKK30KKworI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIHZvaWQKK3Rlcm1fc2V0X3dpbnBvcyh4LCB5KQorICAgIGludAkgICAgeDsKKyAgICBpbnQJICAgIHk7Cit7CisgICAgLyogQ2FuJ3QgaGFuZGxlIGEgbmVnYXRpdmUgdmFsdWUgaGVyZSAqLworICAgIGlmICh4IDwgMCkKKwl4ID0gMDsKKyAgICBpZiAoeSA8IDApCisJeSA9IDA7CisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1dQLCB5LCB4KSk7Cit9CisKKyAgICB2b2lkCit0ZXJtX3NldF93aW5zaXplKHdpZHRoLCBoZWlnaHQpCisgICAgaW50CSAgICB3aWR0aDsKKyAgICBpbnQJICAgIGhlaWdodDsKK3sKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DV1MsIGhlaWdodCwgd2lkdGgpKTsKK30KKyNlbmRpZgorCisgICAgdm9pZAordGVybV9mZ19jb2xvcihuKQorICAgIGludAkgICAgbjsKK3sKKyAgICAvKiBVc2UgIkFGIiB0ZXJtY2FwIGVudHJ5IGlmIHByZXNlbnQsICJTZiIgZW50cnkgb3RoZXJ3aXNlICovCisgICAgaWYgKCpUX0NBRikKKwl0ZXJtX2NvbG9yKFRfQ0FGLCBuKTsKKyAgICBlbHNlIGlmICgqVF9DU0YpCisJdGVybV9jb2xvcihUX0NTRiwgbik7Cit9CisKKyAgICB2b2lkCit0ZXJtX2JnX2NvbG9yKG4pCisgICAgaW50CSAgICBuOworeworICAgIC8qIFVzZSAiQUIiIHRlcm1jYXAgZW50cnkgaWYgcHJlc2VudCwgIlNiIiBlbnRyeSBvdGhlcndpc2UgKi8KKyAgICBpZiAoKlRfQ0FCKQorCXRlcm1fY29sb3IoVF9DQUIsIG4pOworICAgIGVsc2UgaWYgKCpUX0NTQikKKwl0ZXJtX2NvbG9yKFRfQ1NCLCBuKTsKK30KKworICAgIHN0YXRpYyB2b2lkCit0ZXJtX2NvbG9yKHMsIG4pCisgICAgY2hhcl91CSpzOworICAgIGludAkJbjsKK3sKKyAgICBjaGFyCWJ1ZlsyMF07CisgICAgaW50IGkgPSAyOwkvKiBpbmRleCBpbiBzW10ganVzdCBhZnRlciA8RXNjPlsgb3IgQ1NJICovCisKKyAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIG9mIDE2IGNvbG9ycywgYmVjYXVzZSB0ZXJtY2FwIGNhbid0IGhhbmRsZSBpdCAqLworICAgIC8qIEFsc28gYWNjZXB0ICJcZVszJWRtIiBmb3IgVEVSTUlORk8sIGl0IGlzIHNvbWV0aW1lcyB1c2VkICovCisgICAgLyogQWxzbyBhY2NlcHQgQ1NJIGluc3RlYWQgb2YgPEVzYz5bICovCisgICAgaWYgKG4gPj0gOCAmJiB0X2NvbG9ycyA+PSAxNgorCSAgICAgICYmICgoc1swXSA9PSBFU0MgJiYgc1sxXSA9PSAnWycpIHx8IChzWzBdID09IENTSSAmJiAoaSA9IDEpID09IDEpKQorCSAgICAgICYmIHNbaV0gIT0gTlVMCisJICAgICAgJiYgKFNUUkNNUChzICsgaSArIDEsICIlcDElZG0iKSA9PSAwCisJCSAgfHwgU1RSQ01QKHMgKyBpICsgMSwgIiVkbSIpID09IDApCisJICAgICAgJiYgKHNbaV0gPT0gJzMnIHx8IHNbaV0gPT0gJzQnKSkKKyAgICB7CisJc3ByaW50ZihidWYsCisjaWZkZWYgVEVSTUlORk8KKwkJIiVzJXMlJXAxJSVkbSIsCisjZWxzZQorCQkiJXMlcyUlZG0iLAorI2VuZGlmCisJCWkgPT0gMiA/IElGX0VCKCJcMDMzWyIsIEVTQ19TVFIgIlsiKSA6ICJcMjMzIiwKKwkJc1tpXSA9PSAnMycgPyAobiA+PSAxNiA/ICIzODs1OyIgOiAiOSIpCisJCQkgICAgOiAobiA+PSAxNiA/ICI0ODs1OyIgOiAiMTAiKSk7CisJT1VUX1NUUih0Z290byhidWYsIDAsIG4gPj0gMTYgPyBuIDogbiAtIDgpKTsKKyAgICB9CisgICAgZWxzZQorCU9VVF9TVFIodGdvdG8oKGNoYXIgKilzLCAwLCBuKSk7Cit9CisKKyNpZiAoZGVmaW5lZChGRUFUX1RJVExFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1NfWCkpKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEdlbmVyaWMgZnVuY3Rpb24gdG8gc2V0IHdpbmRvdyB0aXRsZSwgdXNpbmcgdF90cyBhbmQgdF9mcy4KKyAqLworICAgIHZvaWQKK3Rlcm1fc2V0dGl0bGUodGl0bGUpCisgICAgY2hhcl91CSp0aXRsZTsKK3sKKyAgICAvKiB0X3RzIHRha2VzIG9uZSBhcmd1bWVudDogY29sdW1uIGluIHN0YXR1cyBsaW5lICovCisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfVFMsIDAsIDApKTsJLyogc2V0IHRpdGxlIHN0YXJ0ICovCisgICAgb3V0X3N0cl9uZih0aXRsZSk7CisgICAgb3V0X3N0cihUX0ZTKTsJCQkvKiBzZXQgdGl0bGUgZW5kICovCisgICAgb3V0X2ZsdXNoKCk7Cit9CisjZW5kaWYKKworLyoKKyAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgc2V0IG9yIHRlcm1pbmFsIG9wdGlvbnMuCisgKiBSZXBsYWNlIGFsbCBlbnRyaWVzIHRoYXQgYXJlIE5VTEwgYnkgZW1wdHlfb3B0aW9uCisgKi8KKyAgICB2b2lkCit0dGVzdChwYWlycykKKyAgICBpbnQJcGFpcnM7Cit7CisgICAgY2hlY2tfb3B0aW9ucygpOwkJICAgIC8qIG1ha2Ugc3VyZSBubyBvcHRpb25zIGFyZSBOVUxMICovCisKKyAgICAvKgorICAgICAqIE1VU1QgaGF2ZSAiY20iOiBjdXJzb3IgbW90aW9uLgorICAgICAqLworICAgIGlmICgqVF9DTSA9PSBOVUwpCisJRU1TRyhfKCJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIpKTsKKworICAgIC8qCisgICAgICogaWYgImNzIiBkZWZpbmVkLCB1c2UgYSBzY3JvbGwgcmVnaW9uLCBpdCdzIGZhc3Rlci4KKyAgICAgKi8KKyAgICBpZiAoKlRfQ1MgIT0gTlVMKQorCXNjcm9sbF9yZWdpb24gPSBUUlVFOworICAgIGVsc2UKKwlzY3JvbGxfcmVnaW9uID0gRkFMU0U7CisKKyAgICBpZiAocGFpcnMpCisgICAgeworCS8qCisJICogb3B0aW9uYWwgcGFpcnMKKwkgKi8KKwkvKiBUUCBnb2VzIHRvIG5vcm1hbCBtb2RlIGZvciBUSSAoaW52ZXJ0KSBhbmQgVEIgKGJvbGQpICovCisJaWYgKCpUX01FID09IE5VTCkKKwkgICAgVF9NRSA9IFRfTVIgPSBUX01EID0gVF9NQiA9IGVtcHR5X29wdGlvbjsKKwlpZiAoKlRfU08gPT0gTlVMIHx8ICpUX1NFID09IE5VTCkKKwkgICAgVF9TTyA9IFRfU0UgPSBlbXB0eV9vcHRpb247CisJaWYgKCpUX1VTID09IE5VTCB8fCAqVF9VRSA9PSBOVUwpCisJICAgIFRfVVMgPSBUX1VFID0gZW1wdHlfb3B0aW9uOworCWlmICgqVF9DWkggPT0gTlVMIHx8ICpUX0NaUiA9PSBOVUwpCisJICAgIFRfQ1pIID0gVF9DWlIgPSBlbXB0eV9vcHRpb247CisKKwkvKiBUX1ZFIGlzIG5lZWRlZCBldmVuIHRob3VnaCBUX1ZJIGlzIG5vdCBkZWZpbmVkICovCisJaWYgKCpUX1ZFID09IE5VTCkKKwkgICAgVF9WSSA9IGVtcHR5X29wdGlvbjsKKworCS8qIGlmICdtcicgb3IgJ21lJyBpcyBub3QgZGVmaW5lZCB1c2UgJ3NvJyBhbmQgJ3NlJyAqLworCWlmICgqVF9NRSA9PSBOVUwpCisJeworCSAgICBUX01FID0gVF9TRTsKKwkgICAgVF9NUiA9IFRfU087CisJICAgIFRfTUQgPSBUX1NPOworCX0KKworCS8qIGlmICdzbycgb3IgJ3NlJyBpcyBub3QgZGVmaW5lZCB1c2UgJ21yJyBhbmQgJ21lJyAqLworCWlmICgqVF9TTyA9PSBOVUwpCisJeworCSAgICBUX1NFID0gVF9NRTsKKwkgICAgaWYgKCpUX01SID09IE5VTCkKKwkJVF9TTyA9IFRfTUQ7CisJICAgIGVsc2UKKwkJVF9TTyA9IFRfTVI7CisJfQorCisJLyogaWYgJ1pIJyBvciAnWlInIGlzIG5vdCBkZWZpbmVkIHVzZSAnbXInIGFuZCAnbWUnICovCisJaWYgKCpUX0NaSCA9PSBOVUwpCisJeworCSAgICBUX0NaUiA9IFRfTUU7CisJICAgIGlmICgqVF9NUiA9PSBOVUwpCisJCVRfQ1pIID0gVF9NRDsKKwkgICAgZWxzZQorCQlUX0NaSCA9IFRfTVI7CisJfQorCisJLyogIlNiIiBhbmQgIlNmIiBjb21lIGluIHBhaXJzICovCisJaWYgKCpUX0NTQiA9PSBOVUwgfHwgKlRfQ1NGID09IE5VTCkKKwl7CisJICAgIFRfQ1NCID0gZW1wdHlfb3B0aW9uOworCSAgICBUX0NTRiA9IGVtcHR5X29wdGlvbjsKKwl9CisKKwkvKiAiQUIiIGFuZCAiQUYiIGNvbWUgaW4gcGFpcnMgKi8KKwlpZiAoKlRfQ0FCID09IE5VTCB8fCAqVF9DQUYgPT0gTlVMKQorCXsKKwkgICAgVF9DQUIgPSBlbXB0eV9vcHRpb247CisJICAgIFRfQ0FGID0gZW1wdHlfb3B0aW9uOworCX0KKworCS8qIGlmICdTYicgYW5kICdBQicgYXJlIG5vdCBkZWZpbmVkLCByZXNldCAiQ28iICovCisJaWYgKCpUX0NTQiA9PSBOVUwgJiYgKlRfQ0FCID09IE5VTCkKKwkgICAgVF9DQ08gPSBlbXB0eV9vcHRpb247CisKKwkvKiBTZXQgJ3dlaXJkaW52ZXJ0JyBhY2NvcmRpbmcgdG8gdmFsdWUgb2YgJ3RfeHMnICovCisJcF93aXYgPSAoKlRfWFMgIT0gTlVMKTsKKyAgICB9CisgICAgbmVlZF9nYXRoZXIgPSBUUlVFOworCisgICAgLyogU2V0IHRfY29sb3JzIHRvIHRoZSB2YWx1ZSBvZiB0X0NvLiAqLworICAgIHRfY29sb3JzID0gYXRvaSgoY2hhciAqKVRfQ0NPKTsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfR1VJKSAmJiAoZGVmaW5lZChGRUFUX01FTlUpIHx8ICFkZWZpbmVkKFVTRV9PTl9GTFlfU0NST0xMKSkpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlcHJlc2VudCB0aGUgZ2l2ZW4gbG9uZ191IGFzIGluZGl2aWR1YWwgYnl0ZXMsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAqIGJ5dGUgZmlyc3QsIGFuZCBzdG9yZSB0aGVtIGluIGRzdC4KKyAqLworICAgIHZvaWQKK2FkZF9sb25nX3RvX2J1Zih2YWwsIGRzdCkKKyAgICBsb25nX3UgIHZhbDsKKyAgICBjaGFyX3UgICpkc3Q7Cit7CisgICAgaW50CSAgICBpOworICAgIGludAkgICAgc2hpZnQ7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IHNpemVvZihsb25nX3UpOyBpKyspCisgICAgeworCXNoaWZ0ID0gOCAqIChzaXplb2YobG9uZ191KSAtIGkpOworCWRzdFtpIC0gMV0gPSAoY2hhcl91KSAoKHZhbCA+PiBzaGlmdCkgJiAweGZmKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xvbmdfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKmJ1ZiwgbG9uZ191ICp2YWwpKTsKKworLyoKKyAqIEludGVycHJldCB0aGUgbmV4dCBzdHJpbmcgb2YgYnl0ZXMgaW4gYnVmIGFzIGEgbG9uZyBpbnRlZ2VyLCB3aXRoIHRoZSBtb3N0CisgKiBzaWduaWZpY2FudCBieXRlIGZpcnN0LiAgTm90ZSB0aGF0IGl0IGlzIGFzc3VtZWQgdGhhdCBidWYgaGFzIGJlZW4gdGhyb3VnaAorICogaW5jaGFyKCksIHNvIHRoYXQgTlVMIGFuZCBLX1NQRUNJQUwgd2lsbCBiZSByZXByZXNlbnRlZCBhcyB0aHJlZSBieXRlcyBlYWNoLgorICogUHV0cyByZXN1bHQgaW4gdmFsLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBidWYKKyAqIChiZXR3ZWVuIHNpemVvZihsb25nX3UpIGFuZCAyICogc2l6ZW9mKGxvbmdfdSkpLCBvciAtMSBpZiBub3QgZW5vdWdoIGJ5dGVzCisgKiB3ZXJlIHByZXNlbnQuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfbG9uZ19mcm9tX2J1ZihidWYsIHZhbCkKKyAgICBjaGFyX3UgICpidWY7CisgICAgbG9uZ191ICAqdmFsOworeworICAgIGludAkgICAgbGVuOworICAgIGNoYXJfdSAgYnl0ZXNbc2l6ZW9mKGxvbmdfdSldOworICAgIGludAkgICAgaTsKKyAgICBpbnQJICAgIHNoaWZ0OworCisgICAgKnZhbCA9IDA7CisgICAgbGVuID0gZ2V0X2J5dGVzX2Zyb21fYnVmKGJ1ZiwgYnl0ZXMsIChpbnQpc2l6ZW9mKGxvbmdfdSkpOworICAgIGlmIChsZW4gIT0gLTEpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobG9uZ191KTsgaSsrKQorCXsKKwkgICAgc2hpZnQgPSA4ICogKHNpemVvZihsb25nX3UpIC0gMSAtIGkpOworCSAgICAqdmFsICs9IChsb25nX3UpYnl0ZXNbaV0gPDwgc2hpZnQ7CisJfQorICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSBcCisgICAgfHwgKGRlZmluZWQoRkVBVF9NT1VTRSkgJiYgKCFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkpKQorLyoKKyAqIFJlYWQgdGhlIG5leHQgbnVtX2J5dGVzIGJ5dGVzIGZyb20gYnVmLCBhbmQgc3RvcmUgdGhlbSBpbiBieXRlcy4gIEFzc3VtZQorICogdGhhdCBidWYgaGFzIGJlZW4gdGhyb3VnaCBpbmNoYXIoKS4JUmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB1c2VkCisgKiBmcm9tIGJ1ZiAoYmV0d2VlbiBudW1fYnl0ZXMgYW5kIG51bV9ieXRlcyoyKSwgb3IgLTEgaWYgbm90IGVub3VnaCBieXRlcyB3ZXJlCisgKiBhdmFpbGFibGUuCisgKi8KKyAgICBzdGF0aWMgaW50CitnZXRfYnl0ZXNfZnJvbV9idWYoYnVmLCBieXRlcywgbnVtX2J5dGVzKQorICAgIGNoYXJfdSAgKmJ1ZjsKKyAgICBjaGFyX3UgICpieXRlczsKKyAgICBpbnQJICAgIG51bV9ieXRlczsKK3sKKyAgICBpbnQJICAgIGxlbiA9IDA7CisgICAgaW50CSAgICBpOworICAgIGNoYXJfdSAgYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXM7IGkrKykKKyAgICB7CisJaWYgKChjID0gYnVmW2xlbisrXSkgPT0gTlVMKQorCSAgICByZXR1cm4gLTE7CisJaWYgKGMgPT0gS19TUEVDSUFMKQorCXsKKwkgICAgaWYgKGJ1ZltsZW5dID09IE5VTCB8fCBidWZbbGVuICsgMV0gPT0gTlVMKQkgICAgLyogY2Fubm90IGhhcHBlbj8gKi8KKwkJcmV0dXJuIC0xOworCSAgICBpZiAoYnVmW2xlbisrXSA9PSAoaW50KUtTX1pFUk8pCisJCWMgPSBOVUw7CisJICAgICsrbGVuOwkvKiBza2lwIEtFX0ZJTExFUiAqLworCSAgICAvKiBlbHNlIGl0IHNob3VsZCBiZSBLU19TUEVDSUFMLCBhbmQgYyBhbHJlYWR5IGVxdWFscyBLX1NQRUNJQUwgKi8KKwl9CisJYnl0ZXNbaV0gPSBjOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayBpZiB0aGUgbmV3IHNoZWxsIHNpemUgaXMgdmFsaWQsIGNvcnJlY3QgaXQgaWYgaXQncyB0b28gc21hbGwuCisgKi8KKyAgICB2b2lkCitjaGVja19zaGVsbHNpemUoKQoreworICAgIGlmIChDb2x1bW5zIDwgTUlOX0NPTFVNTlMpCisJQ29sdW1ucyA9IE1JTl9DT0xVTU5TOworICAgIGlmIChSb3dzIDwgbWluX3Jvd3MoKSkJLyogbmVlZCByb29tIGZvciBvbmUgd2luZG93IGFuZCBjb21tYW5kIGxpbmUgKi8KKwlSb3dzID0gbWluX3Jvd3MoKTsKK30KKworICAgIHZvaWQKK3dpbl9uZXdfc2hlbGxzaXplKCkKK3sKKyAgICBzdGF0aWMgaW50CW9sZF9Sb3dzID0gMDsKKyAgICBzdGF0aWMgaW50CW9sZF9Db2x1bW5zID0gMDsKKworICAgIGlmIChvbGRfUm93cyAhPSBSb3dzIHx8IG9sZF9Db2x1bW5zICE9IENvbHVtbnMpCisJdWlfbmV3X3NoZWxsc2l6ZSgpOworICAgIGlmIChvbGRfUm93cyAhPSBSb3dzKQorICAgIHsKKwlvbGRfUm93cyA9IFJvd3M7CisJc2hlbGxfbmV3X3Jvd3MoKTsJLyogdXBkYXRlIHdpbmRvdyBzaXplcyAqLworICAgIH0KKyAgICBpZiAob2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKKyAgICB7CisJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJc2hlbGxfbmV3X2NvbHVtbnMoKTsJLyogdXBkYXRlIHdpbmRvdyBzaXplcyAqLworI2VuZGlmCisgICAgfQorfQorCisvKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIFZpbSBzaGVsbCBoYXMgYmVlbiByZXNpemVkIGluIGFueSB3YXkuCisgKiBXaWxsIG9idGFpbiB0aGUgY3VycmVudCBzaXplIGFuZCByZWRyYXcgKGFsc28gd2hlbiBzaXplIGRpZG4ndCBjaGFuZ2UpLgorICovCisgICAgdm9pZAorc2hlbGxfcmVzaXplZCgpCit7CisgICAgc2V0X3NoZWxsc2l6ZSgwLCAwLCBGQUxTRSk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgc2hlbGwgc2l6ZSBjaGFuZ2VkLiAgSGFuZGxlIGEgcmVzaXplLgorICogV2hlbiB0aGUgc2l6ZSBkaWRuJ3QgY2hhbmdlLCBub3RoaW5nIGhhcHBlbnMuCisgKi8KKyAgICB2b2lkCitzaGVsbF9yZXNpemVkX2NoZWNrKCkKK3sKKyAgICBpbnQJCW9sZF9Sb3dzID0gUm93czsKKyAgICBpbnQJCW9sZF9Db2x1bW5zID0gQ29sdW1uczsKKworICAgICh2b2lkKXVpX2dldF9zaGVsbHNpemUoKTsKKyAgICBjaGVja19zaGVsbHNpemUoKTsKKyAgICBpZiAob2xkX1Jvd3MgIT0gUm93cyB8fCBvbGRfQ29sdW1ucyAhPSBDb2x1bW5zKQorCXNoZWxsX3Jlc2l6ZWQoKTsKK30KKworLyoKKyAqIFNldCBzaXplIG9mIHRoZSBWaW0gc2hlbGwuCisgKiBJZiAnbXVzdHNldCcgaXMgVFJVRSwgd2UgbXVzdCBzZXQgUm93cyBhbmQgQ29sdW1ucywgZG8gbm90IGdldCB0aGUgcmVhbAorICogd2luZG93IHNpemUgKHRoaXMgaXMgdXNlZCBmb3IgdGhlIDp3aW4gY29tbWFuZCkuCisgKiBJZiAnbXVzdHNldCcgaXMgRkFMU0UsIHdlIG1heSB0cnkgdG8gZ2V0IHRoZSByZWFsIHdpbmRvdyBzaXplIGFuZCBpZgorICogaXQgZmFpbHMgdXNlICd3aWR0aCcgYW5kICdoZWlnaHQnLgorICovCisgICAgdm9pZAorc2V0X3NoZWxsc2l6ZSh3aWR0aCwgaGVpZ2h0LCBtdXN0c2V0KQorICAgIGludAkgICAgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQJICAgIG11c3RzZXQ7Cit7CisgICAgc3RhdGljIGludAkJYnVzeSA9IEZBTFNFOworCisgICAgLyoKKyAgICAgKiBBdm9pZCByZWN1cnNpdmVuZXNzLCBjYW4gaGFwcGVuIHdoZW4gc2V0dGluZyB0aGUgd2luZG93IHNpemUgY2F1c2VzCisgICAgICogYW5vdGhlciB3aW5kb3ctY2hhbmdlZCBzaWduYWwuCisgICAgICovCisgICAgaWYgKGJ1c3kpCisJcmV0dXJuOworCisgICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSAgICAvKiBqdXN0IGNoZWNraW5nLi4uICovCisJcmV0dXJuOworCisgICAgaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBTRVRXU0laRSkgLyogcG9zdHBvbmUgdGhlIHJlc2l6aW5nICovCisgICAgeworCVN0YXRlID0gU0VUV1NJWkU7CisJcmV0dXJuOworICAgIH0KKworICAgICsrYnVzeTsKKworI2lmZGVmIEFNSUdBCisgICAgb3V0X2ZsdXNoKCk7CSAgICAvKiBtdXN0IGRvIHRoaXMgYmVmb3JlIG1jaF9nZXRfc2hlbGxzaXplKCkgZm9yCisJCQkgICAgICAgc29tZSBvYnNjdXJlIHJlYXNvbiAqLworI2VuZGlmCisKKyAgICBpZiAobXVzdHNldCB8fCAodWlfZ2V0X3NoZWxsc2l6ZSgpID09IEZBSUwgJiYgaGVpZ2h0ICE9IDApKQorICAgIHsKKwlSb3dzID0gaGVpZ2h0OworCUNvbHVtbnMgPSB3aWR0aDsKKwljaGVja19zaGVsbHNpemUoKTsKKwl1aV9zZXRfc2hlbGxzaXplKG11c3RzZXQpOworICAgIH0KKyAgICBlbHNlCisJY2hlY2tfc2hlbGxzaXplKCk7CisKKyAgICAvKiBUaGUgd2luZG93IGxheW91dCB1c2VkIHRvIGJlIGFkanVzdGVkIGhlcmUsIGJ1dCBpdCBub3cgaGFwcGVucyBpbgorICAgICAqIHNjcmVlbmFsbG9jKCkgKGFsc28gaW52b2tlZCBmcm9tIHNjcmVlbmNsZWFyKCkpLiAgVGhhdCBpcyBiZWNhdXNlIHRoZQorICAgICAqICJidXN5IiBjaGVjayBhYm92ZSBtYXkgc2tpcCB0aGlzLCBidXQgbm90IHNjcmVlbmFsbG9jKCkuICovCisKKyAgICBpZiAoU3RhdGUgIT0gQVNLTU9SRSAmJiBTdGF0ZSAhPSBFWFRFUk5DTUQgJiYgU3RhdGUgIT0gQ09ORklSTSkKKwlzY3JlZW5jbGVhcigpOworICAgIGVsc2UKKwlzY3JlZW5fc3RhcnQoKTsJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCisgICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKKyAgICB7CisjaWZkZWYgRkVBVF9USVRMRQorCW1ha2V0aXRsZSgpOworI2VuZGlmCisJY2hhbmdlZF9saW5lX2Fidl9jdXJzKCk7CisJaW52YWxpZGF0ZV9ib3RsaW5lKCk7CisKKwkvKgorCSAqIFdlIG9ubHkgcmVkcmF3IHdoZW4gaXQncyBuZWVkZWQ6CisJICogLSBXaGlsZSBhdCB0aGUgbW9yZSBwcm9tcHQgb3IgZXhlY3V0aW5nIGFuIGV4dGVybmFsIGNvbW1hbmQsIGRvbid0CisJICogICByZWRyYXcsIGJ1dCBwb3NpdGlvbiB0aGUgY3Vyc29yLgorCSAqIC0gV2hpbGUgZWRpdGluZyB0aGUgY29tbWFuZCBsaW5lLCBvbmx5IHJlZHJhdyB0aGF0LgorCSAqIC0gaW4gRXggbW9kZSwgZG9uJ3QgcmVkcmF3IGFueXRoaW5nLgorCSAqIC0gT3RoZXJ3aXNlLCByZWRyYXcgcmlnaHQgbm93LCBhbmQgcG9zaXRpb24gdGhlIGN1cnNvci4KKwkgKiBBbHdheXMgbmVlZCB0byBjYWxsIHVwZGF0ZV9zY3JlZW4oKSBvciBzY3JlZW5hbGxvYygpLCB0byBtYWtlCisJICogc3VyZSBSb3dzL0NvbHVtbnMgYW5kIHRoZSBzaXplIG9mIFNjcmVlbkxpbmVzW10gaXMgY29ycmVjdCEKKwkgKi8KKwlpZiAoU3RhdGUgPT0gQVNLTU9SRSB8fCBTdGF0ZSA9PSBFWFRFUk5DTUQgfHwgU3RhdGUgPT0gQ09ORklSTQorCQkJCQkJCSAgICAgfHwgZXhtb2RlX2FjdGl2ZSkKKwl7CisJICAgIHNjcmVlbmFsbG9jKEZBTFNFKTsKKwkgICAgcmVwZWF0X21lc3NhZ2UoKTsKKwl9CisJZWxzZSBpZiAoU3RhdGUgJiBDTURMSU5FKQorCXsKKwkgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworCSAgICByZWRyYXdjbWRsaW5lKCk7CisJfQorCWVsc2UKKwl7CisJICAgIHVwZGF0ZV90b3BsaW5lKCk7CisJICAgIHVwZGF0ZV9zY3JlZW4oTk9UX1ZBTElEKTsKKwkgICAgaWYgKHJlZHJhd2luZygpKQorCQlzZXRjdXJzb3IoKTsKKwl9CisJY3Vyc29yX29uKCk7CSAgICAvKiByZWRyYXdpbmcgbWF5IGhhdmUgc3dpdGNoZWQgaXQgb2ZmICovCisgICAgfQorICAgIG91dF9mbHVzaCgpOworICAgIC0tYnVzeTsKK30KKworLyoKKyAqIFNldCB0aGUgdGVybWluYWwgdG8gVE1PREVfUkFXIChmb3IgTm9ybWFsIG1vZGUpIG9yIFRNT0RFX0NPT0sgKGZvciBleHRlcm5hbAorICogY29tbWFuZHMgYW5kIEV4IG1vZGUpLgorICovCisgICAgdm9pZAorc2V0dG1vZGUodG1vZGUpCisgICAgaW50CSB0bW9kZTsKK3sKKyNpZmRlZiBGRUFUX0dVSQorICAgIC8qIGRvbid0IHNldCB0aGUgdGVybSB3aGVyZSBndmltIHdhcyBzdGFydGVkIHRvIGFueSBtb2RlICovCisgICAgaWYgKGd1aS5pbl91c2UpCisJcmV0dXJuOworI2VuZGlmCisKKyAgICBpZiAoZnVsbF9zY3JlZW4pCisgICAgeworCS8qIEluIEV4IG1vZGUsIG5ldmVyIHNldCB0byBSQVcgKi8KKwlpZiAoZXhtb2RlX2FjdGl2ZSA9PSBFWE1PREVfTk9STUFMKQorCSAgICB0bW9kZSA9IFRNT0RFX0NPT0s7CisKKwkvKgorCSAqIFdoZW4gcmV0dXJuaW5nIGFmdGVyIGNhbGxpbmcgYSBzaGVsbCB3ZSB3YW50IHRvIHJlYWxseSBzZXQgdGhlCisJICogdGVybWluYWwgdG8gcmF3IG1vZGUsIGV2ZW4gdGhvdWdoIHdlIHRoaW5rIGl0IGFscmVhZHkgaXMsIGJlY2F1c2UKKwkgKiB0aGUgc2hlbGwgcHJvZ3JhbSBtYXkgaGF2ZSByZXNldCB0aGUgdGVybWluYWwgbW9kZS4KKwkgKiBXaGVuIHdlIHRoaW5rIHRoZSB0ZXJtaW5hbCBpcyBub3JtYWwsIGRvbid0IHRyeSB0byBzZXQgaXQgdG8KKwkgKiBub3JtYWwgYWdhaW4sIGJlY2F1c2UgdGhhdCBjYXVzZXMgcHJvYmxlbXMgKGxvZ291dCEpIG9uIHNvbWUKKwkgKiBtYWNoaW5lcy4KKwkgKi8KKwlpZiAodG1vZGUgIT0gVE1PREVfQ09PSyB8fCBjdXJfdG1vZGUgIT0gVE1PREVfQ09PSykKKwl7CisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwkgICAgLyogTWF5IG5lZWQgdG8gY2hlY2sgZm9yIFRfQ1JWIHJlc3BvbnNlIGFuZCB0ZXJtY29kZXMsIGl0IGRvZXNuJ3QKKwkgICAgICogd29yayBpbiBDb29rZWQgbW9kZSwgYW4gZXh0ZXJuYWwgcHJvZ3JhbSBtYXkgZ2V0IHRoZW0uICovCisJICAgIGlmICh0bW9kZSAhPSBUTU9ERV9SQVcgJiYgY3J2X3N0YXR1cyA9PSBDUlZfU0VOVCkKKwkJKHZvaWQpdnBlZWtjX25vbWFwKCk7CisJICAgIGNoZWNrX2Zvcl9jb2Rlc19mcm9tX3Rlcm0oKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfTU9VU0VfVFRZCisJICAgIGlmICh0bW9kZSAhPSBUTU9ERV9SQVcpCisJCW1jaF9zZXRtb3VzZShGQUxTRSk7CQkvKiBzd2l0Y2ggbW91c2Ugb2ZmICovCisjZW5kaWYKKwkgICAgb3V0X2ZsdXNoKCk7CisJICAgIG1jaF9zZXR0bW9kZSh0bW9kZSk7ICAgIC8qIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gKi8KKwkgICAgY3VyX3Rtb2RlID0gdG1vZGU7CisjaWZkZWYgRkVBVF9NT1VTRQorCSAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQorCQlzZXRtb3VzZSgpOwkJCS8qIG1heSBzd2l0Y2ggbW91c2Ugb24gKi8KKyNlbmRpZgorCSAgICBvdXRfZmx1c2goKTsKKwl9CisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwltYXlfcmVxX3Rlcm1yZXNwb25zZSgpOworI2VuZGlmCisgICAgfQorfQorCisgICAgdm9pZAorc3RhcnR0ZXJtY2FwKCkKK3sKKyAgICBpZiAoZnVsbF9zY3JlZW4gJiYgIXRlcm1jYXBfYWN0aXZlKQorICAgIHsKKwlvdXRfc3RyKFRfVEkpOwkJCS8qIHN0YXJ0IHRlcm1jYXAgbW9kZSAqLworCW91dF9zdHIoVF9LUyk7CQkJLyogc3RhcnQgImtleXBhZCB0cmFuc21pdCIgbW9kZSAqLworCW91dF9mbHVzaCgpOworCXRlcm1jYXBfYWN0aXZlID0gVFJVRTsKKwlzY3JlZW5fc3RhcnQoKTsJCQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorCW1heV9yZXFfdGVybXJlc3BvbnNlKCk7CisJLyogSW1tZWRpYXRlbHkgY2hlY2sgZm9yIGEgcmVzcG9uc2UuICBJZiB0X0NvIGNoYW5nZXMsIHdlIGRvbid0IHdhbnQKKwkgKiB0byByZWRyYXcgd2l0aCB3cm9uZyBjb2xvcnMgZmlyc3QuICovCisJY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOworI2VuZGlmCisgICAgfQorfQorCisgICAgdm9pZAorc3RvcHRlcm1jYXAoKQoreworICAgIHNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOworICAgIHJlc2V0X2N0ZXJtX2NvbG9ycygpOworICAgIGlmICh0ZXJtY2FwX2FjdGl2ZSkKKyAgICB7CisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwkvKiBNYXkgbmVlZCB0byBjaGVjayBmb3IgVF9DUlYgcmVzcG9uc2UuICovCisJaWYgKGNydl9zdGF0dXMgPT0gQ1JWX1NFTlQpCisJICAgICh2b2lkKXZwZWVrY19ub21hcCgpOworCS8qIENoZWNrIGZvciB0ZXJtY29kZXMgZmlyc3QsIG90aGVyd2lzZSBhbiBleHRlcm5hbCBwcm9ncmFtIG1heSBnZXQKKwkgKiB0aGVtLiAqLworCWNoZWNrX2Zvcl9jb2Rlc19mcm9tX3Rlcm0oKTsKKyNlbmRpZgorCW91dF9zdHIoVF9LRSk7CQkJLyogc3RvcCAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCisJb3V0X2ZsdXNoKCk7CisJdGVybWNhcF9hY3RpdmUgPSBGQUxTRTsKKwljdXJzb3Jfb24oKTsJCQkvKiBqdXN0IGluIGNhc2UgaXQgaXMgc3RpbGwgb2ZmICovCisJb3V0X3N0cihUX1RFKTsJCQkvKiBzdG9wIHRlcm1jYXAgbW9kZSAqLworCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworCW91dF9mbHVzaCgpOworICAgIH0KK30KKworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisvKgorICogUmVxdWVzdCB2ZXJzaW9uIHN0cmluZyAoZm9yIHh0ZXJtKSB3aGVuIG5lZWRlZC4KKyAqIE9ubHkgZG8gdGhpcyBhZnRlciBzd2l0Y2hpbmcgdG8gcmF3IG1vZGUsIG90aGVyd2lzZSB0aGUgcmVzdWx0IHdpbGwgYmUKKyAqIGVjaG9lZC4KKyAqIE9ubHkgZG8gdGhpcyBhZnRlciB0ZXJtY2FwIG1vZGUgaGFzIGJlZW4gc3RhcnRlZCwgb3RoZXJ3aXNlIHRoZSBjb2RlcyBmb3IKKyAqIHRoZSBjdXJzb3Iga2V5cyBtYXkgYmUgd3JvbmcuCisgKiBUaGUgcmVzdWx0IGlzIGNhdWdodCBpbiBjaGVja190ZXJtY29kZSgpLgorICovCisgICAgc3RhdGljIHZvaWQKK21heV9yZXFfdGVybXJlc3BvbnNlKCkKK3sKKyAgICBpZiAoY3J2X3N0YXR1cyA9PSBDUlZfR0VUCisJICAgICYmIGN1cl90bW9kZSA9PSBUTU9ERV9SQVcKKwkgICAgJiYgdGVybWNhcF9hY3RpdmUKKyNpZmRlZiBVTklYCisJICAgICYmIGlzYXR0eSgxKQorI2VuZGlmCisJICAgICYmICpUX0NSViAhPSBOVUwpCisgICAgeworCW91dF9zdHIoVF9DUlYpOworCWNydl9zdGF0dXMgPSBDUlZfU0VOVDsKKwkvKiBjaGVjayBmb3IgdGhlIGNoYXJhY3RlcnMgbm93LCBvdGhlcndpc2UgdGhleSBtaWdodCBiZSBlYXRlbiBieQorCSAqIGdldF9rZXlzdHJva2UoKSAqLworCW91dF9mbHVzaCgpOworCSh2b2lkKXZwZWVrY19ub21hcCgpOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgc2NyZWVuLgorICovCisgICAgaW50Citzd2FwcGluZ19zY3JlZW4oKQoreworICAgIHJldHVybiAoZnVsbF9zY3JlZW4gJiYgKlRfVEkgIT0gTlVMKTsKK30KKworI2lmZGVmIEZFQVRfTU9VU0UKKy8qCisgKiBzZXRtb3VzZSgpIC0gc3dpdGNoIG1vdXNlIG9uL29mZiBkZXBlbmRpbmcgb24gY3VycmVudCBtb2RlIGFuZCAnbW91c2UnCisgKi8KKyAgICB2b2lkCitzZXRtb3VzZSgpCit7CisjIGlmZGVmIEZFQVRfTU9VU0VfVFRZCisgICAgaW50CSAgICBjaGVja2ZvcjsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX01PVVNFU0hBUEUKKyAgICB1cGRhdGVfbW91c2VzaGFwZSgtMSk7CisjIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9NT1VTRV9UVFkgLyogU2hvdWxkIGJlIG91dHNpZGUgcHJvYywgYnV0IG1heSBicmVhayBNT1VTRVNIQVBFICovCisjICBpZmRlZiBGRUFUX0dVSQorICAgIC8qIEluIHRoZSBHVUkgdGhlIG1vdXNlIGlzIGFsd2F5cyBlbmFibGVkLiAqLworICAgIGlmIChndWkuaW5fdXNlKQorCXJldHVybjsKKyMgIGVuZGlmCisgICAgLyogYmUgcXVpY2sgd2hlbiBtb3VzZSBpcyBvZmYgKi8KKyAgICBpZiAoKnBfbW91c2UgPT0gTlVMIHx8IGhhc19tb3VzZV90ZXJtY29kZSA9PSAwKQorCXJldHVybjsKKworICAgIC8qIGRvbid0IHN3aXRjaCBtb3VzZSBvbiB3aGVuIG5vdCBpbiByYXcgbW9kZSAoRXggbW9kZSkgKi8KKyAgICBpZiAoY3VyX3Rtb2RlICE9IFRNT0RFX1JBVykKKyAgICB7CisJbWNoX3NldG1vdXNlKEZBTFNFKTsKKwlyZXR1cm47CisgICAgfQorCisjICBpZmRlZiBGRUFUX1ZJU1VBTAorICAgIGlmIChWSXN1YWxfYWN0aXZlKQorCWNoZWNrZm9yID0gTU9VU0VfVklTVUFMOworICAgIGVsc2UKKyMgIGVuZGlmCisJaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IFNFVFdTSVpFKQorCWNoZWNrZm9yID0gTU9VU0VfUkVUVVJOOworICAgIGVsc2UgaWYgKFN0YXRlICYgSU5TRVJUKQorCWNoZWNrZm9yID0gTU9VU0VfSU5TRVJUOworICAgIGVsc2UgaWYgKFN0YXRlICYgQ01ETElORSkKKwljaGVja2ZvciA9IE1PVVNFX0NPTU1BTkQ7CisgICAgZWxzZSBpZiAoU3RhdGUgPT0gQ09ORklSTSB8fCBTdGF0ZSA9PSBFWFRFUk5DTUQpCisJY2hlY2tmb3IgPSAnICc7IC8qIGRvbid0IHVzZSBtb3VzZSBmb3IgIjpjb25maXJtIiBvciAiOiFjbWQiICovCisgICAgZWxzZQorCWNoZWNrZm9yID0gTU9VU0VfTk9STUFMOyAgICAvKiBhc3N1bWUgbm9ybWFsIG1vZGUgKi8KKworICAgIGlmIChtb3VzZV9oYXMoY2hlY2tmb3IpKQorCW1jaF9zZXRtb3VzZShUUlVFKTsKKyAgICBlbHNlCisJbWNoX3NldG1vdXNlKEZBTFNFKTsKKyMgZW5kaWYKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmCisgKiAtICJjIiBpcyBpbiAnbW91c2UnLCBvcgorICogLSAnYScgaXMgaW4gJ21vdXNlJyBhbmQgImMiIGlzIGluIE1PVVNFX0EsIG9yCisgKiAtIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBhIGhlbHAgZmlsZSBhbmQgJ2gnIGlzIGluICdtb3VzZScgYW5kIHdlIGFyZSBpbiBhCisgKiAgIG5vcm1hbCBlZGl0aW5nIG1vZGUgKG5vdCBhdCBoaXQtcmV0dXJuIG1lc3NhZ2UpLgorICovCisgICAgaW50Cittb3VzZV9oYXMoYykKKyAgICBpbnQJICAgIGM7Cit7CisgICAgY2hhcl91CSpwOworCisgICAgZm9yIChwID0gcF9tb3VzZTsgKnA7ICsrcCkKKwlzd2l0Y2ggKCpwKQorCXsKKwkgICAgY2FzZSAnYSc6IGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilNT1VTRV9BLCBjKSAhPSBOVUxMKQorCQkJICByZXR1cm4gVFJVRTsKKwkJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTU9VU0VfSEVMUDogaWYgKGMgIT0gTU9VU0VfUkVUVVJOICYmIGN1cmJ1Zi0+Yl9oZWxwKQorCQkJCSByZXR1cm4gVFJVRTsKKwkJCSAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6IGlmIChjID09ICpwKSByZXR1cm4gVFJVRTsgYnJlYWs7CisJfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gJ21vdXNlbW9kZWwnIGlzIHNldCB0byAicG9wdXAiIG9yICJwb3B1cF9zZXRwb3MiLgorICovCisgICAgaW50Cittb3VzZV9tb2RlbF9wb3B1cCgpCit7CisgICAgcmV0dXJuIChwX21vdXNlbVswXSA9PSAncCcpOworfQorI2VuZGlmCisKKy8qCisgKiBCeSBvdXRwdXR0aW5nIHRoZSAnY3Vyc29yIHZlcnkgdmlzaWJsZScgdGVybWNhcCBjb2RlLCBmb3Igc29tZSB3aW5kb3dlZAorICogdGVybWluYWxzIHRoaXMgbWFrZXMgdGhlIHNjcmVlbiBzY3JvbGxlZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbi4KKyAqIFVzZWQgd2hlbiBzdGFydGluZyBWaW0gb3IgcmV0dXJuaW5nIGZyb20gYSBzaGVsbC4KKyAqLworICAgIHZvaWQKK3Njcm9sbF9zdGFydCgpCit7CisgICAgaWYgKCpUX1ZTICE9IE5VTCkKKyAgICB7CisJb3V0X3N0cihUX1ZTKTsKKwlvdXRfc3RyKFRfVkUpOworCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworICAgIH0KK30KKworc3RhdGljIGludCBjdXJzb3JfaXNfb2ZmID0gRkFMU0U7CisKKy8qCisgKiBFbmFibGUgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2N1cnNvcl9vbigpCit7CisgICAgaWYgKGN1cnNvcl9pc19vZmYpCisgICAgeworCW91dF9zdHIoVF9WRSk7CisJY3Vyc29yX2lzX29mZiA9IEZBTFNFOworICAgIH0KK30KKworLyoKKyAqIERpc2FibGUgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK2N1cnNvcl9vZmYoKQoreworICAgIGlmIChmdWxsX3NjcmVlbikKKyAgICB7CisJaWYgKCFjdXJzb3JfaXNfb2ZmKQorCSAgICBvdXRfc3RyKFRfVkkpOwkgICAgLyogZGlzYWJsZSBjdXJzb3IgKi8KKwljdXJzb3JfaXNfb2ZmID0gVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBTZXQgc2Nyb2xsaW5nIHJlZ2lvbiBmb3Igd2luZG93ICd3cCcuCisgKiBUaGUgcmVnaW9uIHN0YXJ0cyAnb2ZmJyBsaW5lcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgd2luZG93LgorICogQWxzbyBzZXQgdGhlIHZlcnRpY2FsIHNjcm9sbCByZWdpb24gZm9yIGEgdmVydGljYWxseSBzcGxpdCB3aW5kb3cuICBBbHdheXMKKyAqIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSB3aW5kb3csIGV4Y2x1ZGluZyB0aGUgdmVydGljYWwgc2VwYXJhdG9yLgorICovCisgICAgdm9pZAorc2Nyb2xsX3JlZ2lvbl9zZXQod3AsIG9mZikKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQlvZmY7Cit7CisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1MsIFdfV0lOUk9XKHdwKSArIHdwLT53X2hlaWdodCAtIDEsCisJCQkJCQkJIFdfV0lOUk9XKHdwKSArIG9mZikpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKCpUX0NTViAhPSBOVUwgJiYgd3AtPndfd2lkdGggIT0gQ29sdW1ucykKKwlPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DU1YsIFdfV0lOQ09MKHdwKSArIHdwLT53X3dpZHRoIC0gMSwKKwkJCQkJCQkgICAgICAgV19XSU5DT0wod3ApKSk7CisjZW5kaWYKKyAgICBzY3JlZW5fc3RhcnQoKTsJCSAgICAvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KK30KKworLyoKKyAqIFJlc2V0IHNjcm9sbGluZyByZWdpb24gdG8gdGhlIHdob2xlIHNjcmVlbi4KKyAqLworICAgIHZvaWQKK3Njcm9sbF9yZWdpb25fcmVzZXQoKQoreworICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTLCAoaW50KVJvd3MgLSAxLCAwKSk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAoKlRfQ1NWICE9IE5VTCkKKwlPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DU1YsIChpbnQpQ29sdW1ucyAtIDEsIDApKTsKKyNlbmRpZgorICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworfQorCisKKy8qCisgKiBMaXN0IG9mIHRlcm1pbmFsIGNvZGVzIHRoYXQgYXJlIGN1cnJlbnRseSByZWNvZ25pemVkLgorICovCisKK3N0cnVjdCB0ZXJtY29kZQoreworICAgIGNoYXJfdSAgbmFtZVsyXTsJICAgIC8qIHRlcm1jYXAgbmFtZSBvZiBlbnRyeSAqLworICAgIGNoYXJfdSAgKmNvZGU7CSAgICAvKiB0ZXJtaW5hbCBjb2RlIChpbiBhbGxvY2F0ZWQgbWVtb3J5KSAqLworICAgIGludAkgICAgbGVuOwkgICAgLyogU1RSTEVOKGNvZGUpICovCit9ICp0ZXJtY29kZXMgPSBOVUxMOworCitzdGF0aWMgaW50ICB0Y19tYXhfbGVuID0gMDsgLyogbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0ZXJtY29kZXNbXSBjYW4gaG9sZCAqLworc3RhdGljIGludCAgdGNfbGVuID0gMDsJICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGVybWNvZGVzW10gKi8KKworICAgIHZvaWQKK2NsZWFyX3Rlcm1jb2RlcygpCit7CisgICAgd2hpbGUgKHRjX2xlbiA+IDApCisJdmltX2ZyZWUodGVybWNvZGVzWy0tdGNfbGVuXS5jb2RlKTsKKyAgICB2aW1fZnJlZSh0ZXJtY29kZXMpOworICAgIHRlcm1jb2RlcyA9IE5VTEw7CisgICAgdGNfbWF4X2xlbiA9IDA7CisKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKyAgICBCQyA9IChjaGFyICopZW1wdHlfb3B0aW9uOworICAgIFVQID0gKGNoYXIgKillbXB0eV9vcHRpb247CisgICAgUEMgPSBOVUw7CQkJLyogc2V0IHBhZCBjaGFyYWN0ZXIgdG8gTlVMICovCisgICAgb3NwZWVkID0gMDsKKyNlbmRpZgorCisgICAgbmVlZF9nYXRoZXIgPSBUUlVFOwkJLyogbmVlZCB0byBmaWxsIHRlcm1sZWFkZXJbXSAqLworfQorCisvKgorICogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBsaXN0IG9mIHRlcm1pbmFsIGNvZGVzLgorICogVGhlIGxpc3QgaXMga2VwdCBhbHBoYWJldGljYWwgZm9yICI6c2V0IHRlcm1jYXAiCisgKi8KKyAgICB2b2lkCithZGRfdGVybWNvZGUobmFtZSwgc3RyaW5nLCB1c2VfOGJpdCkKKyAgICBjaGFyX3UJKm5hbWU7CisgICAgY2hhcl91CSpzdHJpbmc7CisgICAgaW50CQl1c2VfOGJpdDsJLyogcmVwbGFjZSA3LWJpdCBjb250cm9sIGJ5IDgtYml0IG9uZSAqLworeworICAgIHN0cnVjdCB0ZXJtY29kZSAqbmV3X3RjOworICAgIGludAkJICAgIGksIGo7CisgICAgY2hhcl91CSAgICAqczsKKworICAgIGlmIChzdHJpbmcgPT0gTlVMTCB8fCAqc3RyaW5nID09IE5VTCkKKyAgICB7CisJZGVsX3Rlcm1jb2RlKG5hbWUpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzID0gdmltX3N0cnNhdmUoc3RyaW5nKTsKKyAgICBpZiAocyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIENoYW5nZSBsZWFkaW5nIDxFc2M+WyB0byBDU0ksIGNoYW5nZSA8RXNjPk8gdG8gPE0tTz4uICovCisgICAgaWYgKHVzZV84Yml0ICYmIHRlcm1fN3RvOGJpdChzdHJpbmcpICE9IDApCisgICAgeworCW1jaF9tZW1tb3ZlKHMsIHMgKyAxLCBTVFJMRU4ocykpOworCXNbMF0gPSB0ZXJtXzd0bzhiaXQoc3RyaW5nKTsKKyAgICB9CisKKyAgICBuZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCisKKyAgICAvKgorICAgICAqIG5lZWQgdG8gbWFrZSBzcGFjZSBmb3IgbW9yZSBlbnRyaWVzCisgICAgICovCisgICAgaWYgKHRjX2xlbiA9PSB0Y19tYXhfbGVuKQorICAgIHsKKwl0Y19tYXhfbGVuICs9IDIwOworCW5ld190YyA9IChzdHJ1Y3QgdGVybWNvZGUgKilhbGxvYygKKwkJCSAgICAodW5zaWduZWQpKHRjX21heF9sZW4gKiBzaXplb2Yoc3RydWN0IHRlcm1jb2RlKSkpOworCWlmIChuZXdfdGMgPT0gTlVMTCkKKwl7CisJICAgIHRjX21heF9sZW4gLT0gMjA7CisJICAgIHJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorCSAgICBuZXdfdGNbaV0gPSB0ZXJtY29kZXNbaV07CisJdmltX2ZyZWUodGVybWNvZGVzKTsKKwl0ZXJtY29kZXMgPSBuZXdfdGM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb29rIGZvciBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIG5hbWUsIGl0IGlzIHJlcGxhY2VkLgorICAgICAqIExvb2sgZm9yIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgYWxwaGFiZXRpY2FsIGhpZ2hlciwgdGhlIG5ldyBlbnRyeQorICAgICAqIGlzIGluc2VydGVkIGluIGZyb250IG9mIGl0LgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKKyAgICB7CisJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdIDwgbmFtZVswXSkKKwkgICAgY29udGludWU7CisJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IG5hbWVbMF0pCisJeworCSAgICBpZiAodGVybWNvZGVzW2ldLm5hbWVbMV0gPCBuYW1lWzFdKQorCQljb250aW51ZTsKKwkgICAgLyoKKwkgICAgICogRXhhY3QgbWF0Y2g6IFJlcGxhY2Ugb2xkIGNvZGUuCisJICAgICAqLworCSAgICBpZiAodGVybWNvZGVzW2ldLm5hbWVbMV0gPT0gbmFtZVsxXSkKKwkgICAgeworCQl2aW1fZnJlZSh0ZXJtY29kZXNbaV0uY29kZSk7CisJCS0tdGNfbGVuOworCQlicmVhazsKKwkgICAgfQorCX0KKwkvKgorCSAqIEZvdW5kIGFscGhhYmV0aWNhbCBsYXJnZXIgZW50cnksIG1vdmUgcmVzdCB0byBpbnNlcnQgbmV3IGVudHJ5CisJICovCisJZm9yIChqID0gdGNfbGVuOyBqID4gaTsgLS1qKQorCSAgICB0ZXJtY29kZXNbal0gPSB0ZXJtY29kZXNbaiAtIDFdOworCWJyZWFrOworICAgIH0KKworICAgIHRlcm1jb2Rlc1tpXS5uYW1lWzBdID0gbmFtZVswXTsKKyAgICB0ZXJtY29kZXNbaV0ubmFtZVsxXSA9IG5hbWVbMV07CisgICAgdGVybWNvZGVzW2ldLmNvZGUgPSBzOworICAgIHRlcm1jb2Rlc1tpXS5sZW4gPSAoaW50KVNUUkxFTihzKTsKKyAgICArK3RjX2xlbjsKK30KKworICAgIGNoYXJfdSAgKgorZmluZF90ZXJtY29kZShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaW50CSAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCisJICAgIHJldHVybiB0ZXJtY29kZXNbaV0uY29kZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQorICAgIGNoYXJfdSAqCitnZXRfdGVybWNvZGUoaSkKKyAgICBpbnQJICAgIGk7Cit7CisgICAgaWYgKGkgPj0gdGNfbGVuKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiAmdGVybWNvZGVzW2ldLm5hbWVbMF07Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2RlbF90ZXJtY29kZShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaW50CSAgICBpOworCisgICAgaWYgKHRlcm1jb2RlcyA9PSBOVUxMKQkvKiBub3RoaW5nIHRoZXJlIHlldCAqLworCXJldHVybjsKKworICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKKwlpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPT0gbmFtZVswXSAmJiB0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBuYW1lWzFdKQorCXsKKwkgICAgZGVsX3Rlcm1jb2RlX2lkeChpKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICAvKiBub3QgZm91bmQuIEdpdmUgZXJyb3IgbWVzc2FnZT8gKi8KK30KKworICAgIHN0YXRpYyB2b2lkCitkZWxfdGVybWNvZGVfaWR4KGlkeCkKKyAgICBpbnQJCWlkeDsKK3sKKyAgICBpbnQJCWk7CisKKyAgICB2aW1fZnJlZSh0ZXJtY29kZXNbaWR4XS5jb2RlKTsKKyAgICAtLXRjX2xlbjsKKyAgICBmb3IgKGkgPSBpZHg7IGkgPCB0Y19sZW47ICsraSkKKwl0ZXJtY29kZXNbaV0gPSB0ZXJtY29kZXNbaSArIDFdOworfQorCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKy8qCisgKiBDYWxsZWQgd2hlbiBkZXRlY3RlZCB0aGF0IHRoZSB0ZXJtaW5hbCBzZW5kcyA4LWJpdCBjb2Rlcy4KKyAqIENvbnZlcnQgYWxsIDctYml0IGNvZGVzIHRvIHRoZWlyIDgtYml0IGVxdWl2YWxlbnQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3dpdGNoX3RvXzhiaXQoKQoreworICAgIGludAkJaTsKKyAgICBpbnQJCWM7CisKKyAgICAvKiBPbmx5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHdoZW4gbm90IGFscmVhZHkgdXNpbmcgOC1iaXQgY29kZXMuICovCisgICAgaWYgKCF0ZXJtX2lzXzhiaXQoVF9OQU1FKSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorCXsKKwkgICAgYyA9IHRlcm1fN3RvOGJpdCh0ZXJtY29kZXNbaV0uY29kZSk7CisJICAgIGlmIChjICE9IDApCisJICAgIHsKKwkJbWNoX21lbW1vdmUodGVybWNvZGVzW2ldLmNvZGUgKyAxLCB0ZXJtY29kZXNbaV0uY29kZSArIDIsCisJCQkJCSAgICAgICBTVFJMRU4odGVybWNvZGVzW2ldLmNvZGUgKyAxKSk7CisJCXRlcm1jb2Rlc1tpXS5jb2RlWzBdID0gYzsKKwkgICAgfQorCX0KKwluZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCisgICAgfQorICAgIGRldGVjdGVkXzhiaXQgPSBUUlVFOworfQorI2VuZGlmCisKKyNpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKK3N0YXRpYyBsaW5lbnJfVCBvcmlnX3RvcGxpbmUgPSAwOworIyBpZmRlZiBGRUFUX0RJRkYKK3N0YXRpYyBpbnQgb3JpZ190b3BmaWxsID0gMDsKKyMgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChDSEVDS19ET1VCTEVfQ0xJQ0spKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENoZWNraW5nIGZvciBkb3VibGUgY2xpY2tzIG91cnNlbHZlcy4KKyAqICJvcmlnX3RvcGxpbmUiIGlzIHVzZWQgdG8gYXZvaWQgZGV0ZWN0aW5nIGEgZG91YmxlLWNsaWNrIHdoZW4gdGhlIHdpbmRvdworICogY29udGVudHMgc2Nyb2xsZWQgKGUuZy4sIHdoZW4gJ3Njcm9sbG9mZicgaXMgbm9uLXplcm8pLgorICovCisvKgorICogU2V0IG9yaWdfdG9wbGluZS4gIFVzZWQgd2hlbiBqdW1waW5nIHRvIGFub3RoZXIgd2luZG93LCBzbyB0aGF0IGEgZG91YmxlCisgKiBjbGljayBzdGlsbCB3b3Jrcy4KKyAqLworICAgIHZvaWQKK3NldF9tb3VzZV90b3BsaW5lKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICBvcmlnX3RvcGxpbmUgPSB3cC0+d190b3BsaW5lOworIyBpZmRlZiBGRUFUX0RJRkYKKyAgICBvcmlnX3RvcGZpbGwgPSB3cC0+d190b3BmaWxsOworIyBlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayBpZiB0eXBlYnVmLnRiX2J1ZltdIGNvbnRhaW5zIGEgdGVybWluYWwga2V5IGNvZGUuCisgKiBDaGVjayBmcm9tIHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmXSB0byB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZgorICogKyBtYXhfb2Zmc2V0XS4KKyAqIFJldHVybiAwIGZvciBubyBtYXRjaCwgLTEgZm9yIHBhcnRpYWwgbWF0Y2gsID4gMCBmb3IgZnVsbCBtYXRjaC4KKyAqIFdpdGggYSBtYXRjaCwgdGhlIG1hdGNoIGlzIHJlbW92ZWQsIHRoZSByZXBsYWNlbWVudCBjb2RlIGlzIGluc2VydGVkIGluCisgKiB0eXBlYnVmLnRiX2J1ZltdIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHlwZWJ1Zi50Yl9idWZbXSBpcworICogcmV0dXJuZWQuCisgKiBXaGVuICJidWYiIGlzIG5vdCBOVUxMLCBpdCBpcyB1c2VkIGluc3RlYWQgb2YgdHlwZWJ1Zi50Yl9idWZbXS4gImJ1ZmxlbiIgaXMKKyAqIHRoZW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ1ZltdLgorICovCisgICAgaW50CitjaGVja190ZXJtY29kZShtYXhfb2Zmc2V0LCBidWYsIGJ1ZmxlbikKKyAgICBpbnQJCW1heF9vZmZzZXQ7CisgICAgY2hhcl91CSpidWY7CisgICAgaW50CQlidWZsZW47Cit7CisgICAgY2hhcl91CSp0cDsKKyAgICBjaGFyX3UJKnA7CisgICAgaW50CQlzbGVuID0gMDsJLyogaW5pdCBmb3IgR0NDICovCisgICAgaW50CQlsZW47CisgICAgaW50CQlvZmZzZXQ7CisgICAgY2hhcl91CWtleV9uYW1lWzJdOworICAgIGludAkJbmV3X3NsZW47CisgICAgaW50CQlleHRyYTsKKyAgICBjaGFyX3UJc3RyaW5nW01BWF9LRVlfQ09ERV9MRU4gKyAxXTsKKyAgICBpbnQJCWksIGo7CisgICAgaW50CQlpZHggPSAwOworI2lmZGVmIEZFQVRfTU9VU0UKKyMgaWYgIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfR1VJKQorICAgIGNoYXJfdQlieXRlc1s2XTsKKyAgICBpbnQJCW51bV9ieXRlczsKKyMgZW5kaWYKKyAgICBpbnQJCW1vdXNlX2NvZGUgPSAwOwkgICAgLyogaW5pdCBmb3IgR0NDICovCisgICAgaW50CQltb2RpZmllcnM7CisgICAgaW50CQlpc19jbGljaywgaXNfZHJhZzsKKyAgICBpbnQJCXdoZWVsX2NvZGUgPSAwOworICAgIGludAkJY3VycmVudF9idXR0b247CisgICAgc3RhdGljIGludAloZWxkX2J1dHRvbiA9IE1PVVNFX1JFTEVBU0U7CisgICAgc3RhdGljIGludAlvcmlnX251bV9jbGlja3MgPSAxOworICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9jb2RlID0gMHgwOworIyBpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKKyAgICBzdGF0aWMgaW50CW9yaWdfbW91c2VfY29sID0gMDsKKyAgICBzdGF0aWMgaW50CW9yaWdfbW91c2Vfcm93ID0gMDsKKyAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgIG9yaWdfbW91c2VfdGltZSA9IHswLCAwfTsKKwkJCQkJLyogdGltZSBvZiBwcmV2aW91cyBtb3VzZSBjbGljayAqLworICAgIHN0cnVjdCB0aW1ldmFsICBtb3VzZV90aW1lOwkJLyogdGltZSBvZiBjdXJyZW50IG1vdXNlIGNsaWNrICovCisgICAgbG9uZwl0aW1lZGlmZjsJCS8qIGVsYXBzZWQgdGltZSBpbiBtc2VjICovCisjIGVuZGlmCisjZW5kaWYKKyAgICBpbnQJCWNwb19rb2Zmc2V0OworI2lmZGVmIEZFQVRfTU9VU0VfR1BNCisgICAgZXh0ZXJuIGludAlncG1fZmxhZzsgLyogZ3BtIGxpYnJhcnkgdmFyaWFibGUgKi8KKyNlbmRpZgorCisgICAgY3BvX2tvZmZzZXQgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tPRkZTRVQpICE9IE5VTEwpOworCisgICAgLyoKKyAgICAgKiBTcGVlZCB1cCB0aGUgY2hlY2tzIGZvciB0ZXJtaW5hbCBjb2RlcyBieSBnYXRoZXJpbmcgYWxsIGZpcnN0IGJ5dGVzCisgICAgICogdXNlZCBpbiB0ZXJtbGVhZGVyW10uICBPZnRlbiB0aGlzIGlzIGp1c3QgYSBzaW5nbGUgPEVzYz4uCisgICAgICovCisgICAgaWYgKG5lZWRfZ2F0aGVyKQorCWdhdGhlcl90ZXJtbGVhZGVyKCk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGF0IHNldmVyYWwgcG9zaXRpb25zIGluIHR5cGVidWYudGJfYnVmW10sIHRvIGNhdGNoIHNvbWV0aGluZyBsaWtlCisgICAgICogIng8VXA+IiB0aGF0IGNhbiBiZSBtYXBwZWQuIFN0b3AgYXQgbWF4X29mZnNldCwgYmVjYXVzZSBjaGFyYWN0ZXJzCisgICAgICogYWZ0ZXIgdGhhdCBjYW5ub3QgYmUgdXNlZCBmb3IgbWFwcGluZywgYW5kIHdpdGggQHIgY29tbWFuZHMKKyAgICAgKiB0eXBlYnVmLnRiX2J1ZltdCisgICAgICogY2FuIGJlY29tZSB2ZXJ5IGxvbmcuCisgICAgICogVGhpcyBpcyB1c2VkIG9mdGVuLCBLRUVQIElUIEZBU1QhCisgICAgICovCisgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBtYXhfb2Zmc2V0OyArK29mZnNldCkKKyAgICB7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCXsKKwkgICAgaWYgKG9mZnNldCA+PSB0eXBlYnVmLnRiX2xlbikKKwkJYnJlYWs7CisJICAgIHRwID0gdHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldDsKKwkgICAgbGVuID0gdHlwZWJ1Zi50Yl9sZW4gLSBvZmZzZXQ7CS8qIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi8KKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKG9mZnNldCA+PSBidWZsZW4pCisJCWJyZWFrOworCSAgICB0cCA9IGJ1ZiArIG9mZnNldDsKKwkgICAgbGVuID0gYnVmbGVuIC0gb2Zmc2V0OworCX0KKworCS8qCisJICogRG9uJ3QgY2hlY2sgY2hhcmFjdGVycyBhZnRlciBLX1NQRUNJQUwsIHRob3NlIGFyZSBhbHJlYWR5CisJICogdHJhbnNsYXRlZCB0ZXJtaW5hbCBjaGFycyAoYXZvaWQgdHJhbnNsYXRpbmcgfkBeSHgpLgorCSAqLworCWlmICgqdHAgPT0gS19TUEVDSUFMKQorCXsKKwkgICAgb2Zmc2V0ICs9IDI7CS8qIHRoZXJlIGFyZSBhbHdheXMgMiBleHRyYSBjaGFyYWN0ZXJzICovCisJICAgIGNvbnRpbnVlOworCX0KKworCS8qCisJICogU2tpcCB0aGlzIHBvc2l0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgZG9lcyBub3QgYXBwZWFyIGFzIHRoZSBmaXJzdAorCSAqIGNoYXJhY3RlciBpbiB0ZXJtX3N0cmluZ3MuIFRoaXMgc3BlZWRzIHVwIGEgbG90LCBzaW5jZSBtb3N0CisJICogdGVybWNvZGVzIHN0YXJ0IHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyIChFU0Mgb3IgQ1NJKS4KKwkgKi8KKwlpID0gKnRwOworCWZvciAocCA9IHRlcm1sZWFkZXI7ICpwICYmICpwICE9IGk7ICsrcCkKKwkgICAgOworCWlmICgqcCA9PSBOVUwpCisJICAgIGNvbnRpbnVlOworCisJLyoKKwkgKiBTa2lwIHRoaXMgcG9zaXRpb24gaWYgcF9layBpcyBub3Qgc2V0IGFuZCB0cFswXSBpcyBhbiBFU0MgYW5kIHdlCisJICogYXJlIGluIEluc2VydCBtb2RlLgorCSAqLworCWlmICgqdHAgPT0gRVNDICYmICFwX2VrICYmIChTdGF0ZSAmIElOU0VSVCkpCisJICAgIGNvbnRpbnVlOworCisJbmV3X3NsZW4gPSAwOwkJLyogTGVuZ3RoIG9mIHdoYXQgd2lsbCByZXBsYWNlIHRoZSB0ZXJtY29kZSAqLworCWtleV9uYW1lWzBdID0gTlVMOwkvKiBubyBrZXkgbmFtZSBmb3VuZCB5ZXQgKi8KKworI2lmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5pbl91c2UpCisJeworCSAgICAvKgorCSAgICAgKiBHVUkgc3BlY2lhbCBrZXkgY29kZXMgYXJlIGFsbCBvZiB0aGUgZm9ybSBbQ1NJIHh4XS4KKwkgICAgICovCisJICAgIGlmICgqdHAgPT0gQ1NJKQkgICAgLyogU3BlY2lhbCBrZXkgZnJvbSBHVUkgKi8KKwkgICAgeworCQlpZiAobGVuIDwgMykKKwkJICAgIHJldHVybiAtMTsJICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkJc2xlbiA9IDM7CisJCWtleV9uYW1lWzBdID0gdHBbMV07CisJCWtleV9uYW1lWzFdID0gdHBbMl07CisJICAgIH0KKwl9CisJZWxzZQorI2VuZGlmIC8qIEZFQVRfR1VJICovCisJeworCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRjX2xlbjsgKytpZHgpCisJICAgIHsKKwkJLyoKKwkJICogSWdub3JlIHRoZSBlbnRyeSBpZiB3ZSBhcmUgbm90IGF0IHRoZSBzdGFydCBvZgorCQkgKiB0eXBlYnVmLnRiX2J1ZltdCisJCSAqIGFuZCB0aGVyZSBhcmUgbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2UgYSBtYXRjaC4KKwkJICogQnV0IG9ubHkgd2hlbiB0aGUgJ0snIGZsYWcgaXMgaW4gJ2Nwb3B0aW9ucycuCisJCSAqLworCQlzbGVuID0gdGVybWNvZGVzW2lkeF0ubGVuOworCQlpZiAoY3BvX2tvZmZzZXQgJiYgb2Zmc2V0ICYmIGxlbiA8IHNsZW4pCisJCSAgICBjb250aW51ZTsKKwkJaWYgKFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwgdHAsCisJCQkJICAgICAoc2l6ZV90KShzbGVuID4gbGVuID8gbGVuIDogc2xlbikpID09IDApCisJCXsKKwkJICAgIGlmIChsZW4gPCBzbGVuKQkJLyogZ290IGEgcGFydGlhbCBzZXF1ZW5jZSAqLworCQkJcmV0dXJuIC0xOwkJLyogbmVlZCB0byBnZXQgbW9yZSBjaGFycyAqLworCisJCSAgICAvKgorCQkgICAgICogV2hlbiBmb3VuZCBhIGtleXBhZCBrZXksIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIga2V5CisJCSAgICAgKiB0aGF0IG1hdGNoZXMgYW5kIHVzZSB0aGF0IG9uZS4gIFRoaXMgbWFrZXMgPEhvbWU+IHRvIGJlCisJCSAgICAgKiBmb3VuZCBpbnN0ZWFkIG9mIDxrSG9tZT4gd2hlbiB0aGV5IHByb2R1Y2UgdGhlIHNhbWUKKwkJICAgICAqIGtleSBjb2RlLgorCQkgICAgICovCisJCSAgICBpZiAodGVybWNvZGVzW2lkeF0ubmFtZVswXSA9PSAnSycKKwkJCQkgICAgICAgJiYgVklNX0lTRElHSVQodGVybWNvZGVzW2lkeF0ubmFtZVsxXSkpCisJCSAgICB7CisJCQlmb3IgKGogPSBpZHggKyAxOyBqIDwgdGNfbGVuOyArK2opCisJCQkgICAgaWYgKHRlcm1jb2Rlc1tqXS5sZW4gPT0gc2xlbiAmJgorCQkJCSAgICBTVFJOQ01QKHRlcm1jb2Rlc1tpZHhdLmNvZGUsCisJCQkJCSAgICB0ZXJtY29kZXNbal0uY29kZSwgc2xlbikgPT0gMCkKKwkJCSAgICB7CisJCQkJaWR4ID0gajsKKwkJCQlicmVhazsKKwkJCSAgICB9CisJCSAgICB9CisKKwkJICAgIGtleV9uYW1lWzBdID0gdGVybWNvZGVzW2lkeF0ubmFtZVswXTsKKwkJICAgIGtleV9uYW1lWzFdID0gdGVybWNvZGVzW2lkeF0ubmFtZVsxXTsKKworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisJaWYgKGtleV9uYW1lWzBdID09IE5VTCkKKwl7CisJICAgIC8qIENoZWNrIGZvciB4dGVybSB2ZXJzaW9uIHN0cmluZzogIjxFc2M+Wz57eH07e3ZlcnN9O3t5fWMiLiAgQWxzbworCSAgICAgKiBlYXQgb3RoZXIgcG9zc2libGUgcmVzcG9uc2VzIHRvIHRfUlYsIHJ4dnQgcmV0dXJucworCSAgICAgKiAiPEVzYz5bPzE7MmMiLiAgQWxzbyBhY2NlcHQgQ1NJIGluc3RlYWQgb2YgPEVzYz5bLiAqLworCSAgICBpZiAoKlRfQ1JWICE9IE5VTCAmJiAoKHRwWzBdID09IEVTQyAmJiB0cFsxXSA9PSAnWycgJiYgbGVuID49IDMpCisJCQkJCSAgICAgICB8fCAodHBbMF0gPT0gQ1NJICYmIGxlbiA+PSAyKSkpCisJICAgIHsKKwkJaiA9IDA7CisJCWV4dHJhID0gMDsKKwkJZm9yIChpID0gMiArICh0cFswXSAhPSBDU0kpOworCQkJaSA8IGxlbiAmJiAoVklNX0lTRElHSVQodHBbaV0pCisJCQkgICAgfHwgdHBbaV0gPT0gJzsnIHx8IHRwW2ldID09ICcuJyk7ICsraSkKKwkJICAgIGlmICh0cFtpXSA9PSAnOycgJiYgKytqID09IDEpCisJCQlleHRyYSA9IGF0b2koKGNoYXIgKil0cCArIGkgKyAxKTsKKwkJaWYgKGkgPT0gbGVuKQorCQkgICAgcmV0dXJuIC0xOwkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzICovCisKKwkJLyogZWF0IGl0IHdoZW4gYXQgbGVhc3Qgb25lIGRpZ2l0IGFuZCBlbmRpbmcgaW4gJ2MnICovCisJCWlmIChpID4gMiArICh0cFswXSAhPSBDU0kpICYmIHRwW2ldID09ICdjJykKKwkJeworCQkgICAgY3J2X3N0YXR1cyA9IENSVl9HT1Q7CisKKwkJICAgIC8qIElmIHRoaXMgY29kZSBzdGFydHMgd2l0aCBDU0ksIHlvdSBjYW4gYmV0IHRoYXQgdGhlCisJCSAgICAgKiB0ZXJtaW5hbCB1c2VzIDgtYml0IGNvZGVzLiAqLworCQkgICAgaWYgKHRwWzBdID09IENTSSkKKwkJCXN3aXRjaF90b184Yml0KCk7CisKKwkJICAgIC8qIHJ4dnQgc2VuZHMgaXRzIHZlcnNpb24gbnVtYmVyOiAiMjA3MDMiIGlzIDIuNy4zLgorCQkgICAgICogSWdub3JlIGl0IGZvciB3aGVuIHRoZSB1c2VyIGhhcyBzZXQgJ3Rlcm0nIHRvIHh0ZXJtLAorCQkgICAgICogZXZlbiB0aG91Z2ggaXQncyBhbiByeHZ0LiAqLworCQkgICAgaWYgKGV4dHJhID4gMjAwMDApCisJCQlleHRyYSA9IDA7CisKKwkJICAgIGlmICh0cFsxICsgKHRwWzBdICE9IENTSSldID09ICc+JyAmJiBqID09IDIpCisJCSAgICB7CisJCQkvKiBpZiB4dGVybSB2ZXJzaW9uID49IDk1IHVzZSBtb3VzZSBkcmFnZ2luZyAqLworCQkJaWYgKGV4dHJhID49IDk1KQorCQkJICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJ0dHltIiwgMEwsCisJCQkJCQkgICAgICAgKGNoYXJfdSAqKSJ4dGVybTIiLCAwKTsKKwkJCS8qIGlmIHh0ZXJtIHZlcnNpb24gPj0gMTQxIHRyeSB0byBnZXQgdGVybWNhcCBjb2RlcyAqLworCQkJaWYgKGV4dHJhID49IDE0MSkKKwkJCXsKKwkJCSAgICBjaGVja19mb3JfY29kZXMgPSBUUlVFOworCQkJICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsKKwkJCSAgICByZXFfY29kZXNfZnJvbV90ZXJtKCk7CisJCQl9CisJCSAgICB9CisjIGlmZGVmIEZFQVRfRVZBTAorCQkgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX1RFUk1SRVNQT05TRSwgdHAsIGkgKyAxKTsKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9BVVRPQ01ECisJCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9URVJNUkVTUE9OU0UsCisJCQkJCQkgICBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKyMgZW5kaWYKKwkJICAgIGtleV9uYW1lWzBdID0gKGludClLU19FWFRSQTsKKwkJICAgIGtleV9uYW1lWzFdID0gKGludClLRV9JR05PUkU7CisJCSAgICBzbGVuID0gaSArIDE7CisJCX0KKwkgICAgfQorCisJICAgIC8qIENoZWNrIGZvciAnPEVzYz5QMStyPGhleCBieXRlcz48RXNjPlwnLiAgQSAiMCIgaW5zdGVhZCBvZiB0aGUKKwkgICAgICogIjEiIG1lYW5zIGFuIGludmFsaWQgcmVxdWVzdC4gKi8KKwkgICAgZWxzZSBpZiAoY2hlY2tfZm9yX2NvZGVzCisJCSAgICAmJiAoKHRwWzBdID09IEVTQyAmJiB0cFsxXSA9PSAnUCcgJiYgbGVuID49IDIpCisJCQl8fCB0cFswXSA9PSBEQ1MpKQorCSAgICB7CisJCWogPSAxICsgKHRwWzBdICE9IERDUyk7CisJCWZvciAoaSA9IGo7IGkgPCBsZW47ICsraSkKKwkJICAgIGlmICgodHBbaV0gPT0gRVNDICYmIHRwW2kgKyAxXSA9PSAnXFwnICYmIGkgKyAxIDwgbGVuKQorCQkJICAgIHx8IHRwW2ldID09IFNURVJNKQorCQkgICAgeworCQkJaWYgKGkgLSBqID49IDMgJiYgdHBbaiArIDFdID09ICcrJyAmJiB0cFtqICsgMl0gPT0gJ3InKQorCQkJICAgIGdvdF9jb2RlX2Zyb21fdGVybSh0cCArIGosIGkpOworCQkJa2V5X25hbWVbMF0gPSAoaW50KUtTX0VYVFJBOworCQkJa2V5X25hbWVbMV0gPSAoaW50KUtFX0lHTk9SRTsKKwkJCXNsZW4gPSBpICsgMSArICh0cFtpXSA9PSBFU0MpOworCQkJYnJlYWs7CisJCSAgICB9CisKKwkJaWYgKGkgPT0gbGVuKQorCQkgICAgcmV0dXJuIC0xOwkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzICovCisJICAgIH0KKwl9CisjZW5kaWYKKworCWlmIChrZXlfbmFtZVswXSA9PSBOVUwpCisJICAgIGNvbnRpbnVlOwkgICAgLyogTm8gbWF0Y2ggYXQgdGhpcyBwb3NpdGlvbiwgdHJ5IG5leHQgb25lICovCisKKwkvKiBXZSBvbmx5IGdldCBoZXJlIHdoZW4gd2UgaGF2ZSBhIGNvbXBsZXRlIHRlcm1jb2RlIG1hdGNoICovCisKKyNpZmRlZiBGRUFUX01PVVNFCisjIGlmZGVmIEZFQVRfR1VJCisJLyoKKwkgKiBPbmx5IGluIHRoZSBHVUk6IEZldGNoIHRoZSBwb2ludGVyIGNvb3JkaW5hdGVzIG9mIHRoZSBzY3JvbGwgZXZlbnQKKwkgKiBzbyB0aGF0IHdlIGtub3cgd2hpY2ggd2luZG93IHRvIHNjcm9sbCBsYXRlci4KKwkgKi8KKwlpZiAoZ3VpLmluX3VzZQorCQkmJiBrZXlfbmFtZVswXSA9PSAoaW50KUtTX0VYVFJBCisJCSYmIChrZXlfbmFtZVsxXSA9PSAoaW50KUtFX1gxTU9VU0UKKwkJICAgIHx8IGtleV9uYW1lWzFdID09IChpbnQpS0VfWDJNT1VTRQorCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9NT1VTRURPV04KKwkJICAgIHx8IGtleV9uYW1lWzFdID09IChpbnQpS0VfTU9VU0VVUCkpCisJeworCSAgICBudW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgNCk7CisJICAgIGlmIChudW1fYnl0ZXMgPT0gLTEpCS8qIG5vdCBlbm91Z2ggY29vcmRpbmF0ZXMgKi8KKwkJcmV0dXJuIC0xOworCSAgICBtb3VzZV9jb2wgPSAxMjggKiAoYnl0ZXNbMF0gLSAnICcgLSAxKSArIGJ5dGVzWzFdIC0gJyAnIC0gMTsKKwkgICAgbW91c2Vfcm93ID0gMTI4ICogKGJ5dGVzWzJdIC0gJyAnIC0gMSkgKyBieXRlc1szXSAtICcgJyAtIDE7CisJICAgIHNsZW4gKz0gbnVtX2J5dGVzOworCX0KKwllbHNlCisjIGVuZGlmCisJLyoKKwkgKiBJZiBpdCBpcyBhIG1vdXNlIGNsaWNrLCBnZXQgdGhlIGNvb3JkaW5hdGVzLgorCSAqLworCWlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX01PVVNFCisjIGlmZGVmIEZFQVRfTU9VU0VfSlNCCisJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfSlNCVEVSTV9NT1VTRQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX05FVAorCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX05FVFRFUk1fTU9VU0UKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9ERUMKKwkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19ERUNfTU9VU0UKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQorCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX1BURVJNX01PVVNFCisjIGVuZGlmCisJCSkKKwl7CisJICAgIGlzX2NsaWNrID0gaXNfZHJhZyA9IEZBTFNFOworCisjIGlmICFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX0dVSSkKKwkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTU9VU0UpCisJICAgIHsKKwkJLyoKKwkJICogRm9yIHh0ZXJtIGFuZCBNU0RPUyB3ZSBnZXQgIjx0X21vdXNlPnNjciIsIHdoZXJlCisJCSAqICBzID09IGVuY29kZWQgYnV0dG9uIHN0YXRlOgorCQkgKgkgICAweDIwID0gbGVmdCBidXR0b24gZG93bgorCQkgKgkgICAweDIxID0gbWlkZGxlIGJ1dHRvbiBkb3duCisJCSAqCSAgIDB4MjIgPSByaWdodCBidXR0b24gZG93bgorCQkgKgkgICAweDIzID0gYW55IGJ1dHRvbiByZWxlYXNlCisJCSAqCSAgIDB4NjAgPSBidXR0b24gNCBkb3duIChzY3JvbGwgd2hlZWwgZG93bikKKwkJICoJICAgMHg2MSA9IGJ1dHRvbiA1IGRvd24gKHNjcm9sbCB3aGVlbCB1cCkKKwkJICoJYWRkIDB4MDQgZm9yIFNISUZUCisJCSAqCWFkZCAweDA4IGZvciBBTFQKKwkJICoJYWRkIDB4MTAgZm9yIENUUkwKKwkJICoJYWRkIDB4MjAgZm9yIG1vdXNlIGRyYWcgKDB4NDAgaXMgZHJhZyB3aXRoIGxlZnQgYnV0dG9uKQorCQkgKiAgYyA9PSBjb2x1bW4gKyAnICcgKyAxID09IGNvbHVtbiArIDMzCisJCSAqICByID09IHJvdyArICcgJyArIDEgPT0gcm93ICsgMzMKKwkJICoKKwkJICogVGhlIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWQgb24gdGhyb3VnaCBnbG9iYWwgdmFyaWFibGVzLgorCQkgKiBVZ2x5LCBidXQgdGhpcyBhdm9pZHMgdHJvdWJsZSB3aXRoIG1vdXNlIGNsaWNrcyBhdCBhbgorCQkgKiB1bmV4cGVjdGVkIG1vbWVudCBhbmQgYWxsb3dzIGZvciBtYXBwaW5nIHRoZW0uCisJCSAqLworCQlmb3IgKDs7KQorCQl7CisjaWZkZWYgRkVBVF9HVUkKKwkJICAgIGlmIChndWkuaW5fdXNlKQorCQkgICAgeworCQkJLyogR1VJIHVzZXMgbW9yZSBiaXRzIGZvciBjb2x1bW5zID4gMjIzICovCisJCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgNSk7CisJCQlpZiAobnVtX2J5dGVzID09IC0xKQkvKiBub3QgZW5vdWdoIGNvb3JkaW5hdGVzICovCisJCQkgICAgcmV0dXJuIC0xOworCQkJbW91c2VfY29kZSA9IGJ5dGVzWzBdOworCQkJbW91c2VfY29sID0gMTI4ICogKGJ5dGVzWzFdIC0gJyAnIC0gMSkKKwkJCQkJCQkgKyBieXRlc1syXSAtICcgJyAtIDE7CisJCQltb3VzZV9yb3cgPSAxMjggKiAoYnl0ZXNbM10gLSAnICcgLSAxKQorCQkJCQkJCSArIGJ5dGVzWzRdIC0gJyAnIC0gMTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKyNlbmRpZgorCQkgICAgeworCQkJbnVtX2J5dGVzID0gZ2V0X2J5dGVzX2Zyb21fYnVmKHRwICsgc2xlbiwgYnl0ZXMsIDMpOworCQkJaWYgKG51bV9ieXRlcyA9PSAtMSkJLyogbm90IGVub3VnaCBjb29yZGluYXRlcyAqLworCQkJICAgIHJldHVybiAtMTsKKwkJCW1vdXNlX2NvZGUgPSBieXRlc1swXTsKKwkJCW1vdXNlX2NvbCA9IGJ5dGVzWzFdIC0gJyAnIC0gMTsKKwkJCW1vdXNlX3JvdyA9IGJ5dGVzWzJdIC0gJyAnIC0gMTsKKwkJICAgIH0KKwkJICAgIHNsZW4gKz0gbnVtX2J5dGVzOworCisJCSAgICAvKiBJZiB0aGUgZm9sbG93aW5nIGJ5dGVzIGlzIGFsc28gYSBtb3VzZSBjb2RlIGFuZCBpdCBoYXMKKwkJICAgICAqIHRoZSBzYW1lIGNvZGUsIGR1bXAgdGhpcyBvbmUgYW5kIGdldCB0aGUgbmV4dC4gIFRoaXMKKwkJICAgICAqIG1ha2VzIGRyYWdnaW5nIGEgd2hvbGUgbG90IGZhc3Rlci4gKi8KKyNpZmRlZiBGRUFUX0dVSQorCQkgICAgaWYgKGd1aS5pbl91c2UpCisJCQlqID0gMzsKKwkJICAgIGVsc2UKKyNlbmRpZgorCQkJaiA9IHRlcm1jb2Rlc1tpZHhdLmxlbjsKKwkJICAgIGlmIChTVFJOQ01QKHRwLCB0cCArIHNsZW4sIChzaXplX3QpaikgPT0gMAorCQkJICAgICYmIHRwW3NsZW4gKyBqXSA9PSBtb3VzZV9jb2RlCisJCQkgICAgJiYgdHBbc2xlbiArIGogKyAxXSAhPSBOVUwKKwkJCSAgICAmJiB0cFtzbGVuICsgaiArIDJdICE9IE5VTAorI2lmZGVmIEZFQVRfR1VJCisJCQkgICAgJiYgKCFndWkuaW5fdXNlCisJCQkJfHwgKHRwW3NsZW4gKyBqICsgM10gIT0gTlVMCisJCQkJCSYmIHRwW3NsZW4gKyBqICsgNF0gIT0gTlVMKSkKKyNlbmRpZgorCQkJICAgICkKKwkJCXNsZW4gKz0gajsKKwkJICAgIGVsc2UKKwkJCWJyZWFrOworCQl9CisKKyMgIGlmICFkZWZpbmVkKE1TV0lOKSAmJiAhZGVmaW5lZChNU0RPUykKKwkJLyoKKwkJICogSGFuZGxlIG1vdXNlIGV2ZW50cy4KKwkJICogUmVjb2duaXplIHRoZSB4dGVybSBtb3VzZSB3aGVlbCwgYnV0IG5vdCBpbiB0aGUgR1VJLCB0aGUKKwkJICogTGludXggY29uc29sZSB3aXRoIEdQTSBhbmQgdGhlIE1TLURPUyBvciBXaW4zMiBjb25zb2xlCisJCSAqIChtdWx0aS1jbGlja3MgdXNlID49IDB4NjApLgorCQkgKi8KKwkJaWYgKG1vdXNlX2NvZGUgPj0gTU9VU0VXSEVFTF9MT1cKKyMgICBpZmRlZiBGRUFUX0dVSQorCQkJJiYgIWd1aS5pbl91c2UKKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisJCQkmJiBncG1fZmxhZyA9PSAwCisjICAgZW5kaWYKKwkJCSkKKwkJeworCQkgICAgLyogS2VlcCB0aGUgbW91c2VfY29kZSBiZWZvcmUgaXQncyBjaGFuZ2VkLCBzbyB0aGF0IHdlCisJCSAgICAgKiByZW1lbWJlciB0aGF0IGl0IHdhcyBhIG1vdXNlIHdoZWVsIGNsaWNrLiAqLworCQkgICAgd2hlZWxfY29kZSA9IG1vdXNlX2NvZGU7CisJCX0KKyMgICBpZmRlZiBGRUFUX01PVVNFX1hURVJNCisJCWVsc2UgaWYgKGhlbGRfYnV0dG9uID09IE1PVVNFX1JFTEVBU0UKKyMgICAgaWZkZWYgRkVBVF9HVUkKKwkJCSYmICFndWkuaW5fdXNlCisjICAgIGVuZGlmCisJCQkmJiAobW91c2VfY29kZSA9PSAweDIzIHx8IG1vdXNlX2NvZGUgPT0gMHgyNCkpCisJCXsKKwkJICAgIC8qIEFwcGFyZW50bHkgdXNlZCBieSByeHZ0IHNjcm9sbCB3aGVlbC4gKi8KKwkJICAgIHdoZWVsX2NvZGUgPSBtb3VzZV9jb2RlIC0gMHgyMyArIE1PVVNFV0hFRUxfTE9XOworCQl9CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoVU5JWCkgJiYgZGVmaW5lZChGRUFUX01PVVNFX1RUWSkKKwkJZWxzZSBpZiAodXNlX3h0ZXJtX21vdXNlKCkgPiAxKQorCQl7CisJCSAgICBpZiAobW91c2VfY29kZSAmIE1PVVNFX0RSQUdfWFRFUk0pCisJCQltb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CisJCX0KKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfWENMSVBCT0FSRAorCQllbHNlIGlmICghKG1vdXNlX2NvZGUgJiBNT1VTRV9EUkFHICYgfk1PVVNFX0NMSUNLX01BU0spKQorCQl7CisJCSAgICBpZiAoKG1vdXNlX2NvZGUgJiBNT1VTRV9SRUxFQVNFKSA9PSBNT1VTRV9SRUxFQVNFKQorCQkJc3RvcF94dGVybV90cmFjZSgpOworCQkgICAgZWxzZQorCQkJc3RhcnRfeHRlcm1fdHJhY2UobW91c2VfY29kZSk7CisJCX0KKyMgICBlbmRpZgorIyAgZW5kaWYKKwkgICAgfQorIyBlbmRpZiAvKiAhVU5JWCB8fCBGRUFUX01PVVNFX1hURVJNICovCisjIGlmZGVmIEZFQVRfTU9VU0VfTkVUCisJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX05FVFRFUk1fTU9VU0UpCisJICAgIHsKKwkJaW50IG1jLCBtcjsKKworCQkvKiBleHBlY3QgYSByYXRoZXIgbGltaXRlZCBzZXF1ZW5jZSBsaWtlOiBiYWxhbmNpbmcgeworCQkgKiBcMDMzfTYsNDVccgorCQkgKiAnNicgaXMgdGhlIHJvdywgNDUgaXMgdGhlIGNvbHVtbgorCQkgKi8KKwkJcCA9IHRwICsgc2xlbjsKKwkJbXIgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnLCcpCisJCSAgICByZXR1cm4gLTE7CisJCW1jID0gZ2V0ZGlnaXRzKCZwKTsKKwkJaWYgKCpwKysgIT0gJ1xyJykKKwkJICAgIHJldHVybiAtMTsKKworCQltb3VzZV9jb2wgPSBtYyAtIDE7CisJCW1vdXNlX3JvdyA9IG1yIC0gMTsKKwkJbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7CisJCXNsZW4gKz0gKGludCkocCAtICh0cCArIHNsZW4pKTsKKwkgICAgfQorIyBlbmRpZgkvKiBGRUFUX01PVVNFX05FVCAqLworIyBpZmRlZiBGRUFUX01PVVNFX0pTQgorCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19KU0JURVJNX01PVVNFKQorCSAgICB7CisJCWludCBtdWx0LCB2YWwsIGl0ZXIsIGJ1dHRvbiwgc3RhdHVzOworCisJCS8qIEpTQlRFUk0gSW5wdXQgTW9kZWwKKwkJICogXDAzM1swfnp3IHVuaXEgZXNjYXBlIHNlcXVlbmNlCisJCSAqIChMLXgpICBMZWZ0IGJ1dHRvbiBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCisJCSAqIChNLXgpICBNaWRkbGUgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKKwkJICogKFIteCkgIFJpZ2h0IGJ1dHRvbiBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCisJCSAqIChTRG1kdSkgIFNpbmdsZSAsIERvdWJsZSBjbGljaywgbSBtb3VzZSBtb3ZlIGQgYnV0dG9uIGRvd24KKwkJICoJCQkJCQkgICB1IGJ1dHRvbiB1cAorCQkgKiAgIyMjICAgWCBjdXJzb3IgcG9zaXRpb24gcGFkZGVkIHRvIDMgZGlnaXRzCisJCSAqICAjIyMgICBZIGN1cnNvciBwb3NpdGlvbiBwYWRkZWQgdG8gMyBkaWdpdHMKKwkJICogKHMteCkgIFNISUZUIGtleSBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCisJCSAqIChjLXgpICBDVFJMIGtleSBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCisJCSAqIFwwMzNcXCB0ZXJtaW5hdGVpbmcgc2VxdWVuY2UKKwkJICovCisKKwkJcCA9IHRwICsgc2xlbjsKKwkJYnV0dG9uID0gbW91c2VfY29kZSA9IDA7CisJCXN3aXRjaCAoKnArKykKKwkJeworCQkgICAgY2FzZSAnTCc6IGJ1dHRvbiA9IDE7IGJyZWFrOworCQkgICAgY2FzZSAnLSc6IGJyZWFrOworCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KKwkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCisJCX0KKwkJc3dpdGNoICgqcCsrKQorCQl7CisJCSAgICBjYXNlICdNJzogYnV0dG9uIHw9IDI7IGJyZWFrOworCQkgICAgY2FzZSAnLSc6IGJyZWFrOworCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KKwkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCisJCX0KKwkJc3dpdGNoICgqcCsrKQorCQl7CisJCSAgICBjYXNlICdSJzogYnV0dG9uIHw9IDQ7IGJyZWFrOworCQkgICAgY2FzZSAnLSc6IGJyZWFrOworCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KKwkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCisJCX0KKwkJc3RhdHVzID0gKnArKzsKKwkJZm9yICh2YWwgPSAwLCBtdWx0ID0gMTAwLCBpdGVyID0gMDsgaXRlciA8IDM7IGl0ZXIrKywKKwkJCQkJCQkgICAgICBtdWx0IC89IDEwLCBwKyspCisJCSAgICBpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKKwkJCXZhbCArPSAoKnAgLSAnMCcpICogbXVsdDsKKwkJICAgIGVsc2UKKwkJCXJldHVybiAtMTsKKwkJbW91c2VfY29sID0gdmFsOworCQlmb3IgKHZhbCA9IDAsIG11bHQgPSAxMDAsIGl0ZXIgPSAwOyBpdGVyIDwgMzsgaXRlcisrLAorCQkJCQkJCSAgICAgIG11bHQgLz0gMTAsIHArKykKKwkJICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQorCQkJdmFsICs9ICgqcCAtICcwJykgKiBtdWx0OworCQkgICAgZWxzZQorCQkJcmV0dXJuIC0xOworCQltb3VzZV9yb3cgPSB2YWw7CisJCXN3aXRjaCAoKnArKykKKwkJeworCQkgICAgY2FzZSAncyc6IGJ1dHRvbiB8PSA4OyBicmVhazsgIC8qIFNISUZUIGtleSBQcmVzc2VkICovCisJCSAgICBjYXNlICctJzogYnJlYWs7ICAvKiBOb3QgUHJlc3NlZCAqLworCQkgICAgY2FzZSAneCc6IGJyZWFrOyAgLyogTm90IFJlcG9ydGluZyAqLworCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KKwkJfQorCQlzd2l0Y2ggKCpwKyspCisJCXsKKwkJICAgIGNhc2UgJ2MnOiBidXR0b24gfD0gMTY7IGJyZWFrOyAgLyogQ1RSTCBrZXkgUHJlc3NlZCAqLworCQkgICAgY2FzZSAnLSc6IGJyZWFrOyAgLyogTm90IFByZXNzZWQgKi8KKwkJICAgIGNhc2UgJ3gnOiBicmVhazsgIC8qIE5vdCBSZXBvcnRpbmcgKi8KKwkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCisJCX0KKwkJaWYgKCpwKysgIT0gJ1wwMzMnKQorCQkgICAgcmV0dXJuIC0xOworCQlpZiAoKnArKyAhPSAnXFwnKQorCQkgICAgcmV0dXJuIC0xOworCQlzd2l0Y2ggKHN0YXR1cykKKwkJeworCQkgICAgY2FzZSAnRCc6IC8qIERvdWJsZSBDbGljayAqLworCQkgICAgY2FzZSAnUyc6IC8qIFNpbmdsZSBDbGljayAqLworCQkJaWYgKGJ1dHRvbiAmIDEpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVDsKKwkJCWlmIChidXR0b24gJiAyKSBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRTsKKwkJCWlmIChidXR0b24gJiA0KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUOworCQkJaWYgKGJ1dHRvbiAmIDgpIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CisJCQlpZiAoYnV0dG9uICYgMTYpIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAnbSc6IC8qIE1vdXNlIG1vdmUgKi8KKwkJCWlmIChidXR0b24gJiAxKSBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQ7CisJCQlpZiAoYnV0dG9uICYgMikgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEU7CisJCQlpZiAoYnV0dG9uICYgNCkgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVDsKKwkJCWlmIChidXR0b24gJiA4KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOworCQkJaWYgKGJ1dHRvbiAmIDE2KSBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CisJCQlpZiAoKGJ1dHRvbiAmIDcpICE9IDApCisJCQl7CisJCQkgICAgaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlOworCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKKwkJCX0KKwkJCWlzX2RyYWcgPSBUUlVFOworCQkJc2hvd21vZGUoKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAnZCc6IC8qIEJ1dHRvbiBEb3duICovCisJCQlpZiAoYnV0dG9uICYgMSkgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUOworCQkJaWYgKGJ1dHRvbiAmIDIpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFOworCQkJaWYgKGJ1dHRvbiAmIDQpIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQ7CisJCQlpZiAoYnV0dG9uICYgOCkgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKKwkJCWlmIChidXR0b24gJiAxNikgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOworCQkJYnJlYWs7CisJCSAgICBjYXNlICd1JzogLyogQnV0dG9uIFVwICovCisJCQlpZiAoYnV0dG9uICYgMSkKKwkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQgfCBNT1VTRV9SRUxFQVNFOworCQkJaWYgKGJ1dHRvbiAmIDIpCisJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEUgfCBNT1VTRV9SRUxFQVNFOworCQkJaWYgKGJ1dHRvbiAmIDQpCisJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVCB8IE1PVVNFX1JFTEVBU0U7CisJCQlpZiAoYnV0dG9uICYgOCkKKwkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOworCQkJaWYgKGJ1dHRvbiAmIDE2KQorCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDogcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLworCQl9CisKKwkJc2xlbiArPSAocCAtICh0cCArIHNsZW4pKTsKKwkgICAgfQorIyBlbmRpZiAvKiBGRUFUX01PVVNFX0pTQiAqLworIyBpZmRlZiBGRUFUX01PVVNFX0RFQworCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19ERUNfTU9VU0UpCisJICAgIHsKKwkgICAgICAgLyogVGhlIERFQyBMb2NhdG9yIElucHV0IE1vZGVsCisJCSogTmV0dGVybSBkZWxpdmVycyB0aGUgY29kZSBzZXF1ZW5jZToKKwkJKiAgXDAzM1syOzQ7MjQ7ODAmdyAgKGxlZnQgYnV0dG9uIGRvd24pCisJCSogIFwwMzNbMzswOzI0OzgwJncgIChsZWZ0IGJ1dHRvbiB1cCkKKwkJKiAgXDAzM1s2OzE7MjQ7ODAmdyAgKHJpZ2h0IGJ1dHRvbiBkb3duKQorCQkqICBcMDMzWzc7MDsyNDs4MCZ3ICAocmlnaHQgYnV0dG9uIHVwKQorCQkqIENTSSBQZSA7IFBiIDsgUHIgOyBQYyA7IFBwICYgdworCQkqIFBlIGlzIHRoZSBldmVudCBjb2RlCisJCSogUGIgaXMgdGhlIGJ1dHRvbiBjb2RlCisJCSogUHIgaXMgdGhlIHJvdyBjb29yZGluYXRlCisJCSogUGMgaXMgdGhlIGNvbHVtbiBjb29yZGluYXRlCisJCSogUHAgaXMgdGhlIHRoaXJkIGNvb3JkaW5hdGUgKHBhZ2UgbnVtYmVyKQorCQkqIFBlLCB0aGUgZXZlbnQgY29kZSBpbmRpY2F0ZXMgd2hhdCBldmVudCBjYXVzZWQgdGhpcyByZXBvcnQKKwkJKiAgICBUaGUgZm9sbG93aW5nIGV2ZW50IGNvZGVzIGFyZSBkZWZpbmVkOgorCQkqICAgIDAgLSByZXF1ZXN0LCB0aGUgdGVybWluYWwgcmVjZWl2ZWQgYW4gZXhwbGljaXQgcmVxdWVzdAorCQkqCSBmb3IgYSBsb2NhdG9yIHJlcG9ydCwgYnV0IHRoZSBsb2NhdG9yIGlzIHVuYXZhaWxhYmxlCisJCSogICAgMSAtIHJlcXVlc3QsIHRoZSB0ZXJtaW5hbCByZWNlaXZlZCBhbiBleHBsaWNpdCByZXF1ZXN0CisJCSoJIGZvciBhIGxvY2F0b3IgcmVwb3J0CisJCSogICAgMiAtIGxlZnQgYnV0dG9uIGRvd24KKwkJKiAgICAzIC0gbGVmdCBidXR0b24gdXAKKwkJKiAgICA0IC0gbWlkZGxlIGJ1dHRvbiBkb3duCisJCSogICAgNSAtIG1pZGRsZSBidXR0b24gdXAKKwkJKiAgICA2IC0gcmlnaHQgYnV0dG9uIGRvd24KKwkJKiAgICA3IC0gcmlnaHQgYnV0dG9uIHVwCisJCSogICAgOCAtIGZvdXJ0aCBidXR0b24gZG93bgorCQkqICAgIDkgLSBmb3VydGggYnV0dG9uIHVwCisJCSogICAgMTAgLSBsb2NhdG9yIG91dHNpZGUgZmlsdGVyIHJlY3RhbmdsZQorCQkqIFBiLCB0aGUgYnV0dG9uIGNvZGUsIEFTQ0lJIGRlY2ltYWwgMC0xNSBpbmRpY2F0aW5nIHdoaWNoCisJCSogICBidXR0b25zIGFyZSBkb3duIGlmIGFueS4gVGhlIHN0YXRlIG9mIHRoZSBmb3VyIGJ1dHRvbnMKKwkJKiAgIG9uIHRoZSBsb2NhdG9yIGNvcnJlc3BvbmQgdG8gdGhlIGxvdyBmb3VyIGJpdHMgb2YgdGhlCisJCSogICBkZWNpbWFsIHZhbHVlLAorCQkqICAgIjEiIG1lYW5zIGJ1dHRvbiBkZXByZXNzZWQKKwkJKiAgIDAgLSBubyBidXR0b25zIGRvd24sCisJCSogICAxIC0gcmlnaHQsCisJCSogICAyIC0gbWlkZGxlLAorCQkqICAgNCAtIGxlZnQsCisJCSogICA4IC0gZm91cnRoCisJCSogUHIgaXMgdGhlIHJvdyBjb29yZGluYXRlIG9mIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGluIHRoZSBwYWdlLAorCQkqICAgZW5jb2RlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIHZhbHVlLgorCQkqICAgSWYgUHIgaXMgb21pdHRlZCwgdGhlIGxvY2F0b3IgcG9zaXRpb24gaXMgdW5kZWZpbmVkCisJCSogICAob3V0c2lkZSB0aGUgdGVybWluYWwgd2luZG93IGZvciBleGFtcGxlKS4KKwkJKiBQYyBpcyB0aGUgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24gaW4gdGhlCisJCSogICBwYWdlLCBlbmNvZGVkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgdmFsdWUuCisJCSogICBJZiBQYyBpcyBvbWl0dGVkLCB0aGUgbG9jYXRvciBwb3NpdGlvbiBpcyB1bmRlZmluZWQKKwkJKiAgIChvdXRzaWRlIHRoZSB0ZXJtaW5hbCB3aW5kb3cgZm9yIGV4YW1wbGUpLgorCQkqIFBwIGlzIHRoZSBwYWdlIGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24KKwkJKiAgIGVuY29kZWQgYXMgYW4gQVNDSUkgZGVjaW1hbCB2YWx1ZS4KKwkJKiAgIFRoZSBwYWdlIGNvb3JkaW5hdGUgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGxvY2F0b3IgaXMgb24KKwkJKiAgIHBhZ2Ugb25lICh0aGUgZGVmYXVsdCkuICBXZSBpZ25vcmUgaXQgYW55d2F5LgorCQkqLworCQlpbnQgUGUsIFBiLCBQciwgUGM7CisKKwkJcCA9IHRwICsgc2xlbjsKKworCQkvKiBnZXQgZXZlbnQgc3RhdHVzICovCisJCVBlID0gZ2V0ZGlnaXRzKCZwKTsKKwkJaWYgKCpwKysgIT0gJzsnKQorCQkgICAgcmV0dXJuIC0xOworCisJCS8qIGdldCBidXR0b24gc3RhdHVzICovCisJCVBiID0gZ2V0ZGlnaXRzKCZwKTsKKwkJaWYgKCpwKysgIT0gJzsnKQorCQkgICAgcmV0dXJuIC0xOworCisJCS8qIGdldCByb3cgc3RhdHVzICovCisJCVByID0gZ2V0ZGlnaXRzKCZwKTsKKwkJaWYgKCpwKysgIT0gJzsnKQorCQkgICAgcmV0dXJuIC0xOworCisJCS8qIGdldCBjb2x1bW4gc3RhdHVzICovCisJCVBjID0gZ2V0ZGlnaXRzKCZwKTsKKworCQkvKiB0aGUgcGFnZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgKi8KKwkJaWYgKCpwID09ICc7JykKKwkJeworCQkgICAgcCsrOworCQkgICAgKHZvaWQpZ2V0ZGlnaXRzKCZwKTsKKwkJfQorCQlpZiAoKnArKyAhPSAnJicpCisJCSAgICByZXR1cm4gLTE7CisJCWlmICgqcCsrICE9ICd3JykKKwkJICAgIHJldHVybiAtMTsKKworCQltb3VzZV9jb2RlID0gMDsKKwkJc3dpdGNoIChQZSkKKwkJeworCQljYXNlICAwOiByZXR1cm4gLTE7IC8qIHBvc2l0aW9uIHJlcXVlc3Qgd2hpbGUgdW5hdmFpbGFibGUgKi8KKwkJY2FzZSAgMTogLyogYSByZXNwb25zZSB0byBhIGxvY2F0b3IgcG9zaXRpb24gcmVxdWVzdCBpbmNsdWRlcworCQkJICAgIHRoZSBzdGF0dXMgb2YgYWxsIGJ1dHRvbnMgKi8KKwkJCSBQYiAmPSA3OyAgIC8qIG1hc2sgb2ZmIGFuZCBpZ25vcmUgZm91cnRoIGJ1dHRvbiAqLworCQkJIGlmIChQYiAmIDQpCisJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfTEVGVDsKKwkJCSBpZiAoUGIgJiAyKQorCQkJICAgICBtb3VzZV9jb2RlICA9IE1PVVNFX01JRERMRTsKKwkJCSBpZiAoUGIgJiAxKQorCQkJICAgICBtb3VzZV9jb2RlICA9IE1PVVNFX1JJR0hUOworCQkJIGlmIChQYikKKwkJCSB7CisJCQkgICAgIGhlbGRfYnV0dG9uID0gbW91c2VfY29kZTsKKwkJCSAgICAgbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOworCQkJICAgICBXYW50UXVlcnlNb3VzZSA9IDE7CisJCQkgfQorCQkJIGlzX2RyYWcgPSBUUlVFOworCQkJIHNob3dtb2RlKCk7CisJCQkgYnJlYWs7CisJCWNhc2UgIDI6IG1vdXNlX2NvZGUgPSBNT1VTRV9MRUZUOworCQkJIFdhbnRRdWVyeU1vdXNlID0gMTsKKwkJCSBicmVhazsKKwkJY2FzZSAgMzogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9MRUZUOworCQkJIGJyZWFrOworCQljYXNlICA0OiBtb3VzZV9jb2RlID0gTU9VU0VfTUlERExFOworCQkJIFdhbnRRdWVyeU1vdXNlID0gMTsKKwkJCSBicmVhazsKKwkJY2FzZSAgNTogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9NSURETEU7CisJCQkgYnJlYWs7CisJCWNhc2UgIDY6IG1vdXNlX2NvZGUgPSBNT1VTRV9SSUdIVDsKKwkJCSBXYW50UXVlcnlNb3VzZSA9IDE7CisJCQkgYnJlYWs7CisJCWNhc2UgIDc6IG1vdXNlX2NvZGUgPSBNT1VTRV9SRUxFQVNFIHwgTU9VU0VfUklHSFQ7CisJCQkgYnJlYWs7CisJCWNhc2UgIDg6IHJldHVybiAtMTsgLyogZm91cnRoIGJ1dHRvbiBkb3duICovCisJCWNhc2UgIDk6IHJldHVybiAtMTsgLyogZm91cnRoIGJ1dHRvbiB1cCAqLworCQljYXNlIDEwOiByZXR1cm4gLTE7IC8qIG1vdXNlIG91dHNpZGUgb2YgZmlsdGVyIHJlY3RhbmdsZSAqLworCQlkZWZhdWx0OiByZXR1cm4gLTE7IC8qIHNob3VsZCBuZXZlciBvY2N1ciAqLworCQl9CisKKwkJbW91c2VfY29sID0gUGMgLSAxOworCQltb3VzZV9yb3cgPSBQciAtIDE7CisKKwkJc2xlbiArPSAoaW50KShwIC0gKHRwICsgc2xlbikpOworCSAgICB9CisjIGVuZGlmIC8qIEZFQVRfTU9VU0VfREVDICovCisjIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KKwkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfUFRFUk1fTU9VU0UpCisJICAgIHsKKwkJaW50IGJ1dHRvbiwgbnVtX2NsaWNrcywgYWN0aW9uLCBtYywgbXI7CisKKwkJcCA9IHRwICsgc2xlbjsKKworCQlhY3Rpb24gPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisKKwkJbW91c2Vfcm93ID0gZ2V0ZGlnaXRzKCZwKTsKKwkJaWYgKCpwKysgIT0gJzsnKQorCQkgICAgcmV0dXJuIC0xOworCQltb3VzZV9jb2wgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisKKwkJYnV0dG9uID0gZ2V0ZGlnaXRzKCZwKTsKKwkJbW91c2VfY29kZSA9IDA7CisKKwkJc3dpdGNoKCBidXR0b24gKQorCQl7CisJCSAgICBjYXNlIDQ6IG1vdXNlX2NvZGUgPSBNT1VTRV9MRUZUOyBicmVhazsKKwkJICAgIGNhc2UgMTogbW91c2VfY29kZSA9IE1PVVNFX1JJR0hUOyBicmVhazsKKwkJICAgIGNhc2UgMjogbW91c2VfY29kZSA9IE1PVVNFX01JRERMRTsgYnJlYWs7CisJCSAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisJCX0KKworCQlzd2l0Y2goIGFjdGlvbiApCisJCXsKKwkJICAgIGNhc2UgMzE6IC8qIEluaXRpYWwgcHJlc3MgKi8KKwkJCWlmICgqcCsrICE9ICc7JykKKwkJCSAgICByZXR1cm4gLTE7CisKKwkJCW51bV9jbGlja3MgPSBnZXRkaWdpdHMoJnApOyAvKiBOb3QgdXNlZCAqLworCQkJYnJlYWs7CisKKwkJICAgIGNhc2UgMzI6IC8qIFJlbGVhc2UgKi8KKwkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfUkVMRUFTRTsKKwkJCWJyZWFrOworCisJCSAgICBjYXNlIDMzOiAvKiBEcmFnICovCisJCQloZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGU7CisJCQltb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CisJCQlicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICgqcCsrICE9ICd0JykKKwkJICAgIHJldHVybiAtMTsKKworCQlzbGVuICs9IChwIC0gKHRwICsgc2xlbikpOworCSAgICB9CisjIGVuZGlmIC8qIEZFQVRfTU9VU0VfUFRFUk0gKi8KKworCSAgICAvKiBJbnRlcnByZXQgdGhlIG1vdXNlIGNvZGUgKi8KKwkgICAgY3VycmVudF9idXR0b24gPSAobW91c2VfY29kZSAmIE1PVVNFX0NMSUNLX01BU0spOworCSAgICBpZiAoY3VycmVudF9idXR0b24gPT0gTU9VU0VfUkVMRUFTRQorIyBpZmRlZiBGRUFUX01PVVNFX1hURVJNCisJCSAgICAmJiB3aGVlbF9jb2RlID09IDAKKyMgZW5kaWYKKwkJICAgICkKKwkgICAgeworCQkvKgorCQkgKiBJZiB3ZSBnZXQgYSBtb3VzZSBkcmFnIG9yIHJlbGVhc2UgZXZlbnQgd2hlbgorCQkgKiB0aGVyZSBpcyBubyBtb3VzZSBidXR0b24gaGVsZCBkb3duIChoZWxkX2J1dHRvbiA9PQorCQkgKiBNT1VTRV9SRUxFQVNFKSwgcHJvZHVjZSBhIEtfSUdOT1JFIGJlbG93LgorCQkgKiAoY2FuIGhhcHBlbiB3aGVuIHlvdSBob2xkIGRvd24gdHdvIGJ1dHRvbnMKKwkJICogYW5kIHRoZW4gbGV0IHRoZW0gZ28sIG9yIGNsaWNrIGluIHRoZSBtZW51IGJhciwgYnV0IG5vdAorCQkgKiBvbiBhIG1lbnUsIGFuZCBkcmFnIGludG8gdGhlIHRleHQpLgorCQkgKi8KKwkJaWYgKChtb3VzZV9jb2RlICYgTU9VU0VfRFJBRykgPT0gTU9VU0VfRFJBRykKKwkJICAgIGlzX2RyYWcgPSBUUlVFOworCQljdXJyZW50X2J1dHRvbiA9IGhlbGRfYnV0dG9uOworCSAgICB9CisJICAgIGVsc2UgaWYgKHdoZWVsX2NvZGUgPT0gMCkKKwkgICAgeworIyBpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKKyMgIGlmZGVmIEZFQVRfTU9VU0VfR1BNCisjICAgaWZkZWYgRkVBVF9HVUkKKwkJLyoKKwkJICogT25seSBmb3IgVW5peCwgd2hlbiBHVUkgb3IgZ3BtIGlzIG5vdCBhY3RpdmUsIHdlIGhhbmRsZQorCQkgKiBtdWx0aS1jbGlja3MgaGVyZS4KKwkJICovCisJCWlmIChncG1fZmxhZyA9PSAwICYmICFndWkuaW5fdXNlKQorIyAgIGVsc2UKKwkJaWYgKGdwbV9mbGFnID09IDApCisjICAgZW5kaWYKKyMgIGVsc2UKKyMgICBpZmRlZiBGRUFUX0dVSQorCQlpZiAoIWd1aS5pbl91c2UpCisjICAgZW5kaWYKKyMgIGVuZGlmCisJCXsKKwkJICAgIC8qCisJCSAgICAgKiBDb21wdXRlIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIHByZXZpb3VzIG1vdXNlIGNsaWNrLgorCQkgICAgICovCisJCSAgICBnZXR0aW1lb2ZkYXkoJm1vdXNlX3RpbWUsIE5VTEwpOworCQkgICAgdGltZWRpZmYgPSAobW91c2VfdGltZS50dl91c2VjCisJCQkJCSAgICAtIG9yaWdfbW91c2VfdGltZS50dl91c2VjKSAvIDEwMDA7CisJCSAgICBpZiAodGltZWRpZmYgPCAwKQorCQkJLS1vcmlnX21vdXNlX3RpbWUudHZfc2VjOworCQkgICAgdGltZWRpZmYgKz0gKG1vdXNlX3RpbWUudHZfc2VjCisJCQkJCSAgICAgLSBvcmlnX21vdXNlX3RpbWUudHZfc2VjKSAqIDEwMDA7CisJCSAgICBvcmlnX21vdXNlX3RpbWUgPSBtb3VzZV90aW1lOworCQkgICAgaWYgKG1vdXNlX2NvZGUgPT0gb3JpZ19tb3VzZV9jb2RlCisJCQkgICAgJiYgdGltZWRpZmYgPCBwX21vdXNldAorCQkJICAgICYmIG9yaWdfbnVtX2NsaWNrcyAhPSA0CisJCQkgICAgJiYgb3JpZ19tb3VzZV9jb2wgPT0gbW91c2VfY29sCisJCQkgICAgJiYgb3JpZ19tb3VzZV9yb3cgPT0gbW91c2Vfcm93CisjaWZkZWYgRkVBVF9ESUZGCisJCQkgICAgJiYgb3JpZ190b3BmaWxsID09IGN1cndpbi0+d190b3BmaWxsCisjZW5kaWYKKwkJCSAgICAmJiBvcmlnX3RvcGxpbmUgPT0gY3Vyd2luLT53X3RvcGxpbmUpCisJCQkrK29yaWdfbnVtX2NsaWNrczsKKwkJICAgIGVsc2UKKwkJCW9yaWdfbnVtX2NsaWNrcyA9IDE7CisJCSAgICBvcmlnX21vdXNlX2NvbCA9IG1vdXNlX2NvbDsKKwkJICAgIG9yaWdfbW91c2Vfcm93ID0gbW91c2Vfcm93OworCQkgICAgb3JpZ190b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisJCSAgICBvcmlnX3RvcGZpbGwgPSBjdXJ3aW4tPndfdG9wZmlsbDsKKyNlbmRpZgorCQl9CisjICBpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfR1BNKQorCQllbHNlCisJCSAgICBvcmlnX251bV9jbGlja3MgPSBOVU1fTU9VU0VfQ0xJQ0tTKG1vdXNlX2NvZGUpOworIyAgZW5kaWYKKyMgZWxzZQorCQlvcmlnX251bV9jbGlja3MgPSBOVU1fTU9VU0VfQ0xJQ0tTKG1vdXNlX2NvZGUpOworIyBlbmRpZgorCQlpc19jbGljayA9IFRSVUU7CisJCW9yaWdfbW91c2VfY29kZSA9IG1vdXNlX2NvZGU7CisJICAgIH0KKwkgICAgaWYgKCFpc19kcmFnKQorCQloZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGUgJiBNT1VTRV9DTElDS19NQVNLOworCisJICAgIC8qCisJICAgICAqIFRyYW5zbGF0ZSB0aGUgYWN0dWFsIG1vdXNlIGV2ZW50IGludG8gYSBwc2V1ZG8gbW91c2UgZXZlbnQuCisJICAgICAqIEZpcnN0IHdvcmsgb3V0IHdoYXQgbW9kaWZpZXJzIGFyZSB0byBiZSB1c2VkLgorCSAgICAgKi8KKwkgICAgbW9kaWZpZXJzID0gMHgwOworCSAgICBpZiAob3JpZ19tb3VzZV9jb2RlICYgTU9VU0VfU0hJRlQpCisJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKKwkgICAgaWYgKG9yaWdfbW91c2VfY29kZSAmIE1PVVNFX0NUUkwpCisJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOworCSAgICBpZiAob3JpZ19tb3VzZV9jb2RlICYgTU9VU0VfQUxUKQorCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOworCSAgICBpZiAob3JpZ19udW1fY2xpY2tzID09IDIpCisJCW1vZGlmaWVycyB8PSBNT0RfTUFTS18yQ0xJQ0s7CisJICAgIGVsc2UgaWYgKG9yaWdfbnVtX2NsaWNrcyA9PSAzKQorCQltb2RpZmllcnMgfD0gTU9EX01BU0tfM0NMSUNLOworCSAgICBlbHNlIGlmIChvcmlnX251bV9jbGlja3MgPT0gNCkKKwkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLXzRDTElDSzsKKworCSAgICAvKiBBZGQgdGhlIG1vZGlmaWVyIGNvZGVzIHRvIG91ciBzdHJpbmcgKi8KKwkgICAgaWYgKG1vZGlmaWVycyAhPSAwKQorCSAgICB7CisJCXN0cmluZ1tuZXdfc2xlbisrXSA9IEtfU1BFQ0lBTDsKKwkJc3RyaW5nW25ld19zbGVuKytdID0gKGludClLU19NT0RJRklFUjsKKwkJc3RyaW5nW25ld19zbGVuKytdID0gbW9kaWZpZXJzOworCSAgICB9CisKKwkgICAgLyogV29yayBvdXQgb3VyIHBzZXVkbyBtb3VzZSBldmVudCAqLworCSAgICBrZXlfbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CisJICAgIGlmICh3aGVlbF9jb2RlICE9IDApCisJCWtleV9uYW1lWzFdID0gKHdoZWVsX2NvZGUgJiAxKQorCQkJCQk/IChpbnQpS0VfTU9VU0VVUCA6IChpbnQpS0VfTU9VU0VET1dOOworCSAgICBlbHNlCisJCWtleV9uYW1lWzFdID0gZ2V0X3BzZXVkb19tb3VzZV9jb2RlKGN1cnJlbnRfYnV0dG9uLAorCQkJCQkJCSAgIGlzX2NsaWNrLCBpc19kcmFnKTsKKwl9CisjZW5kaWYgLyogRkVBVF9NT1VTRSAqLworCisjaWZkZWYgRkVBVF9HVUkKKwkvKgorCSAqIElmIHVzaW5nIHRoZSBHVUksIHRoZW4gd2UgZ2V0IG1lbnUgYW5kIHNjcm9sbGJhciBldmVudHMuCisJICoKKwkgKiBBIG1lbnUgZXZlbnQgaXMgZW5jb2RlZCBhcyBLX1NQRUNJQUwsIEtTX01FTlUsIEtFX0ZJTExFUiBmb2xsb3dlZCBieQorCSAqIGZvdXIgYnl0ZXMgd2hpY2ggYXJlIHRvIGJlIHRha2VuIGFzIGEgcG9pbnRlciB0byB0aGUgdmltbWVudV9UCisJICogc3RydWN0dXJlLgorCSAqCisJICogQSBzY3JvbGxiYXIgZXZlbnQgaXMgS19TUEVDSUFMLCBLU19WRVJfU0NST0xMQkFSLCBLRV9GSUxMRVIgZm9sbG93ZWQKKwkgKiBieSBvbmUgYnl0ZSByZXByZXNlbnRpbmcgdGhlIHNjcm9sbGJhciBudW1iZXIsIGFuZCB0aGVuIGZvdXIgYnl0ZXMKKwkgKiByZXByZXNlbnRpbmcgYSBsb25nX3Ugd2hpY2ggaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgc2Nyb2xsYmFyLgorCSAqCisJICogQSBob3Jpem9udGFsIHNjcm9sbGJhciBldmVudCBpcyBLX1NQRUNJQUwsIEtTX0hPUl9TQ1JPTExCQVIsCisJICogS0VfRklMTEVSIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMgcmVwcmVzZW50aW5nIGEgbG9uZ191IHdoaWNoIGlzIHRoZQorCSAqIG5ldyB2YWx1ZSBvZiB0aGUgc2Nyb2xsYmFyLgorCSAqLworIyBpZmRlZiBGRUFUX01FTlUKKwllbHNlIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX01FTlUpCisJeworCSAgICBsb25nX3UJdmFsOworCisJICAgIG51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgc2xlbiwgJnZhbCk7CisJICAgIGlmIChudW1fYnl0ZXMgPT0gLTEpCisJCXJldHVybiAtMTsKKwkgICAgY3VycmVudF9tZW51ID0gKHZpbW1lbnVfVCAqKXZhbDsKKwkgICAgc2xlbiArPSBudW1fYnl0ZXM7CisJfQorIyBlbmRpZgorIyBpZm5kZWYgVVNFX09OX0ZMWV9TQ1JPTEwKKwllbHNlIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX1ZFUl9TQ1JPTExCQVIpCisJeworCSAgICBsb25nX3UJdmFsOworCisJICAgIC8qIEdldCB0aGUgbGFzdCBzY3JvbGxiYXIgZXZlbnQgaW4gdGhlIHF1ZXVlIG9mIHRoZSBzYW1lIHR5cGUgKi8KKwkgICAgaiA9IDA7CisJICAgIGZvciAoaSA9IDA7IHRwW2pdID09IENTSSAmJiB0cFtqICsgMV0gPT0gS1NfVkVSX1NDUk9MTEJBUgorCQkJCQkJICAgICAmJiB0cFtqICsgMl0gIT0gTlVMOyArK2kpCisJICAgIHsKKwkJaiArPSAzOworCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBqLCBieXRlcywgMSk7CisJCWlmIChudW1fYnl0ZXMgPT0gLTEpCisJCSAgICBicmVhazsKKwkJaWYgKGkgPT0gMCkKKwkJICAgIGN1cnJlbnRfc2Nyb2xsYmFyID0gKGludClieXRlc1swXTsKKwkJZWxzZSBpZiAoY3VycmVudF9zY3JvbGxiYXIgIT0gKGludClieXRlc1swXSkKKwkJICAgIGJyZWFrOworCQlqICs9IG51bV9ieXRlczsKKwkJbnVtX2J5dGVzID0gZ2V0X2xvbmdfZnJvbV9idWYodHAgKyBqLCAmdmFsKTsKKwkJaWYgKG51bV9ieXRlcyA9PSAtMSkKKwkJICAgIGJyZWFrOworCQlzY3JvbGxiYXJfdmFsdWUgPSB2YWw7CisJCWogKz0gbnVtX2J5dGVzOworCQlzbGVuID0gajsKKwkgICAgfQorCSAgICBpZiAoaSA9PSAwKQkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2Ugb25lICovCisJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19IT1JfU0NST0xMQkFSKQorCXsKKwkgICAgbG9uZ191CXZhbDsKKworCSAgICAvKiBHZXQgdGhlIGxhc3QgaG9yaXouIHNjcm9sbGJhciBldmVudCBpbiB0aGUgcXVldWUgKi8KKwkgICAgaiA9IDA7CisJICAgIGZvciAoaSA9IDA7IHRwW2pdID09IENTSSAmJiB0cFtqICsgMV0gPT0gS1NfSE9SX1NDUk9MTEJBUgorCQkJCQkJICAgICAmJiB0cFtqICsgMl0gIT0gTlVMOyArK2kpCisJICAgIHsKKwkJaiArPSAzOworCQludW1fYnl0ZXMgPSBnZXRfbG9uZ19mcm9tX2J1Zih0cCArIGosICZ2YWwpOworCQlpZiAobnVtX2J5dGVzID09IC0xKQorCQkgICAgYnJlYWs7CisJCXNjcm9sbGJhcl92YWx1ZSA9IHZhbDsKKwkJaiArPSBudW1fYnl0ZXM7CisJCXNsZW4gPSBqOworCSAgICB9CisJICAgIGlmIChpID09IDApCQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgdG8gbWFrZSBvbmUgKi8KKwkJcmV0dXJuIC0xOworCX0KKyMgZW5kaWYgLyogIVVTRV9PTl9GTFlfU0NST0xMICovCisjZW5kaWYgLyogRkVBVF9HVUkgKi8KKworCS8qIEZpbmFsbHksIGFkZCB0aGUgc3BlY2lhbCBrZXkgY29kZSB0byBvdXIgc3RyaW5nICovCisJaWYgKGtleV9uYW1lWzBdID09IEtTX0tFWSkKKwkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMV07CS8qIGZyb20gIjpzZXQgPE0tYj49eHgiICovCisJZWxzZQorCXsKKwkgICAgc3RyaW5nW25ld19zbGVuKytdID0gS19TUEVDSUFMOworCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBrZXlfbmFtZVswXTsKKwkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMV07CisJfQorCXN0cmluZ1tuZXdfc2xlbl0gPSBOVUw7CisJZXh0cmEgPSBuZXdfc2xlbiAtIHNsZW47CisJaWYgKGJ1ZiA9PSBOVUxMKQorCXsKKwkgICAgaWYgKGV4dHJhIDwgMCkKKwkJLyogcmVtb3ZlIG1hdGNoZWQgY2hhcnMsIHRha2luZyBjYXJlIG9mIG5vcmVtYXAgKi8KKwkJZGVsX3R5cGVidWYoLWV4dHJhLCBvZmZzZXQpOworCSAgICBlbHNlIGlmIChleHRyYSA+IDApCisJCS8qIGluc2VydCB0aGUgZXh0cmEgc3BhY2Ugd2UgbmVlZCAqLworCQlpbnNfdHlwZWJ1ZihzdHJpbmcgKyBzbGVuLCBSRU1BUF9ZRVMsIG9mZnNldCwgRkFMU0UsIEZBTFNFKTsKKworCSAgICAvKgorCSAgICAgKiBDYXJlZnVsOiBkZWxfdHlwZWJ1ZigpIGFuZCBpbnNfdHlwZWJ1ZigpIG1heSBoYXZlIHJlYWxsb2NhdGVkCisJICAgICAqIHR5cGVidWYudGJfYnVmW10hCisJICAgICAqLworCSAgICBtY2hfbWVtbW92ZSh0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0LCBzdHJpbmcsCisJCQkJCQkJICAgIChzaXplX3QpbmV3X3NsZW4pOworCX0KKwllbHNlCisJeworCSAgICBpZiAoZXh0cmEgPCAwKQorCQkvKiByZW1vdmUgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCisJCW1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCwgYnVmICsgb2Zmc2V0IC0gZXh0cmEsCisJCQkJCSAgIChzaXplX3QpKGJ1ZmxlbiArIG9mZnNldCArIGV4dHJhKSk7CisJICAgIGVsc2UgaWYgKGV4dHJhID4gMCkKKwkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCisJCW1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCArIGV4dHJhLCBidWYgKyBvZmZzZXQsCisJCQkJCQkgICAoc2l6ZV90KShidWZsZW4gLSBvZmZzZXQpKTsKKwkgICAgbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0LCBzdHJpbmcsIChzaXplX3QpbmV3X3NsZW4pOworCX0KKwlyZXR1cm4gKGxlbiArIGV4dHJhICsgb2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsJCQkgICAgLyogbm8gbWF0Y2ggZm91bmQgKi8KK30KKworLyoKKyAqIFJlcGxhY2UgYW55IHRlcm1pbmFsIGNvZGUgc3RyaW5ncyBpbiBmcm9tW10gd2l0aCB0aGUgZXF1aXZhbGVudCBpbnRlcm5hbAorICogdmltIHJlcHJlc2VudGF0aW9uLglUaGlzIGlzIHVzZWQgZm9yIHRoZSAiZnJvbSIgYW5kICJ0byIgcGFydCBvZiBhCisgKiBtYXBwaW5nLCBhbmQgdGhlICJ0byIgcGFydCBvZiBhIG1lbnUgY29tbWFuZC4KKyAqIEFueSBzdHJpbmdzIGxpa2UgIjxDLVVQPiIgYXJlIGFsc28gcmVwbGFjZWQsIHVubGVzcyAnY3BvcHRpb25zJyBjb250YWlucworICogJzwnLgorICogS19TUEVDSUFMIGJ5IGl0c2VsZiBpcyByZXBsYWNlZCBieSBLX1NQRUNJQUwgS1NfU1BFQ0lBTCBLRV9GSUxMRVIuCisgKgorICogVGhlIHJlcGxhY2VtZW50IGlzIGRvbmUgaW4gcmVzdWx0W10gYW5kIGZpbmFsbHkgY29waWVkIGludG8gYWxsb2NhdGVkCisgKiBtZW1vcnkuIElmIHRoaXMgYWxsIHdvcmtzIHdlbGwgKmJ1ZnAgaXMgc2V0IHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBhCisgKiBwb2ludGVyIHRvIGl0IGlzIHJldHVybmVkLiBJZiBzb21ldGhpbmcgZmFpbHMgKmJ1ZnAgaXMgc2V0IHRvIE5VTEwgYW5kIGZyb20KKyAqIGlzIHJldHVybmVkLgorICoKKyAqIENUUkwtViBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkLiAgV2hlbiAiZnJvbV9wYXJ0IiBpcyBUUlVFLCBhIHRyYWlsaW5nIENUUkwtVgorICogaXMgaW5jbHVkZWQsIG90aGVyd2lzZSBpdCBpcyByZW1vdmVkIChmb3IgIjptYXAgeHggXlYiLCBtYXBzIHh4IHRvCisgKiBub3RoaW5nKS4gIFdoZW4gJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAnQicsIGEgYmFja3NsYXNoIGNhbiBiZSB1c2VkCisgKiBpbnN0ZWFkIG9mIGEgQ1RSTC1WLgorICovCisgICAgY2hhcl91ICAqCityZXBsYWNlX3Rlcm1jb2Rlcyhmcm9tLCBidWZwLCBmcm9tX3BhcnQsIGRvX2x0KQorICAgIGNoYXJfdQkqZnJvbTsKKyAgICBjaGFyX3UJKipidWZwOworICAgIGludAkJZnJvbV9wYXJ0OworICAgIGludAkJZG9fbHQ7CQkvKiBhbHNvIHRyYW5zbGF0ZSA8bHQ+ICovCit7CisgICAgaW50CQlpOworICAgIGludAkJc2xlbjsKKyAgICBpbnQJCWtleTsKKyAgICBpbnQJCWRsZW4gPSAwOworICAgIGNoYXJfdQkqc3JjOworICAgIGludAkJZG9fYmFja3NsYXNoOwkvKiBiYWNrc2xhc2ggaXMgYSBzcGVjaWFsIGNoYXJhY3RlciAqLworICAgIGludAkJZG9fc3BlY2lhbDsJLyogcmVjb2duaXplIDw+IGtleSBjb2RlcyAqLworICAgIGludAkJZG9fa2V5X2NvZGU7CS8qIHJlY29nbml6ZSByYXcga2V5IGNvZGVzICovCisgICAgY2hhcl91CSpyZXN1bHQ7CS8qIGJ1ZmZlciBmb3IgcmVzdWx0aW5nIHN0cmluZyAqLworCisgICAgZG9fYmFja3NsYXNoID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19CU0xBU0gpID09IE5VTEwpOworICAgIGRvX3NwZWNpYWwgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX1NQRUNJKSA9PSBOVUxMKTsKKyAgICBkb19rZXlfY29kZSA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS0VZQ09ERSkgPT0gTlVMTCk7CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdHJhbnNsYXRpb24uICBXb3JzdCBjYXNlIGEgc2luZ2xlIGNoYXJhY3RlciBpcworICAgICAqIHJlcGxhY2VkIGJ5IDYgYnl0ZXMgKHNoaWZ0ZWQgc3BlY2lhbCBrZXkpLCBwbHVzIGEgTlVMIGF0IHRoZSBlbmQuCisgICAgICovCisgICAgcmVzdWx0ID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTihmcm9tKSAqIDYgKyAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCQkvKiBvdXQgb2YgbWVtb3J5ICovCisgICAgeworCSpidWZwID0gTlVMTDsKKwlyZXR1cm4gZnJvbTsKKyAgICB9CisKKyAgICBzcmMgPSBmcm9tOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgI24gYXQgc3RhcnQgb25seTogZnVuY3Rpb24ga2V5IG4KKyAgICAgKi8KKyAgICBpZiAoZnJvbV9wYXJ0ICYmIHNyY1swXSA9PSAnIycgJiYgVklNX0lTRElHSVQoc3JjWzFdKSkgIC8qIGZ1bmN0aW9uIGtleSAqLworICAgIHsKKwlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKKwlyZXN1bHRbZGxlbisrXSA9ICdrJzsKKwlpZiAoc3JjWzFdID09ICcwJykKKwkgICAgcmVzdWx0W2RsZW4rK10gPSAnOyc7CS8qICMwIGlzIEYxMCBpcyAiazsiICovCisJZWxzZQorCSAgICByZXN1bHRbZGxlbisrXSA9IHNyY1sxXTsJLyogIzMgaXMgRjMgaXMgImszIiAqLworCXNyYyArPSAyOworICAgIH0KKworICAgIC8qCisgICAgICogQ29weSBlYWNoIGJ5dGUgZnJvbSAqZnJvbSB0byByZXN1bHRbZGxlbl0KKyAgICAgKi8KKyAgICB3aGlsZSAoKnNyYyAhPSBOVUwpCisgICAgeworCS8qCisJICogSWYgJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAnPCcsIGNoZWNrIGZvciBzcGVjaWFsIGtleSBjb2RlcywKKwkgKiBsaWtlICI8Qy1TLU1vdXNlTGVmdD4iCisJICovCisJaWYgKGRvX3NwZWNpYWwgJiYgKGRvX2x0IHx8IFNUUk5DTVAoc3JjLCAiPGx0PiIsIDQpICE9IDApKQorCXsKKyNpZmRlZiBGRUFUX0VWQUwKKwkgICAgLyoKKwkgICAgICogUmVwbGFjZSA8U0lEPiBieSBLX1NOUiA8c2NyaXB0LW5yPiBfLgorCSAgICAgKiAocm9vbTogNSAqIDYgPSAzMCBieXRlczsgbmVlZGVkOiAzICsgPG5yPiArIDEgPD0gMTQpCisJICAgICAqLworCSAgICBpZiAoU1RSTklDTVAoc3JjLCAiPFNJRD4iLCA1KSA9PSAwKQorCSAgICB7CisJCWlmIChjdXJyZW50X1NJRCA8PSAwKQorCQkgICAgRU1TRyhfKGVfdXNpbmdzaWQpKTsKKwkJZWxzZQorCQl7CisJCSAgICBzcmMgKz0gNTsKKwkJICAgIHJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOworCQkgICAgcmVzdWx0W2RsZW4rK10gPSAoaW50KUtTX0VYVFJBOworCQkgICAgcmVzdWx0W2RsZW4rK10gPSAoaW50KUtFX1NOUjsKKwkJICAgIHNwcmludGYoKGNoYXIgKilyZXN1bHQgKyBkbGVuLCAiJWxkIiwgKGxvbmcpY3VycmVudF9TSUQpOworCQkgICAgZGxlbiArPSAoaW50KVNUUkxFTihyZXN1bHQgKyBkbGVuKTsKKwkJICAgIHJlc3VsdFtkbGVuKytdID0gJ18nOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorI2VuZGlmCisKKwkgICAgc2xlbiA9IHRyYW5zX3NwZWNpYWwoJnNyYywgcmVzdWx0ICsgZGxlbiwgVFJVRSk7CisJICAgIGlmIChzbGVuKQorCSAgICB7CisJCWRsZW4gKz0gc2xlbjsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ2snLCBzZWUgaWYgaXQncyBhbiBhY3R1YWwga2V5LWNvZGUuCisJICogTm90ZSB0aGF0IHRoaXMgaXMgYWxzbyBjaGVja2VkIGFmdGVyIHJlcGxhY2luZyB0aGUgPD4gZm9ybS4KKwkgKiBTaW5nbGUgY2hhcmFjdGVyIGNvZGVzIGFyZSBOT1QgcmVwbGFjZWQgKGUuZy4gXkggb3IgREVMKSwgYmVjYXVzZQorCSAqIGl0IGNvdWxkIGJlIGEgY2hhcmFjdGVyIGluIHRoZSBmaWxlLgorCSAqLworCWlmIChkb19rZXlfY29kZSkKKwl7CisJICAgIGkgPSBmaW5kX3Rlcm1fYnlrZXlzKHNyYyk7CisJICAgIGlmIChpID49IDApCisJICAgIHsKKwkJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CisJCXJlc3VsdFtkbGVuKytdID0gdGVybWNvZGVzW2ldLm5hbWVbMF07CisJCXJlc3VsdFtkbGVuKytdID0gdGVybWNvZGVzW2ldLm5hbWVbMV07CisJCXNyYyArPSB0ZXJtY29kZXNbaV0ubGVuOworCQkvKiBJZiB0ZXJtaW5hbCBjb2RlIG1hdGNoZWQsIGNvbnRpbnVlIGFmdGVyIGl0LiAqLworCQljb250aW51ZTsKKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfRVZBTAorCWlmIChkb19zcGVjaWFsKQorCXsKKwkgICAgY2hhcl91CSpwLCAqcywgbGVuOworCisJICAgIC8qCisJICAgICAqIFJlcGxhY2UgPExlYWRlcj4gYnkgdGhlIHZhbHVlIG9mICJtYXBsZWFkZXIiLgorCSAgICAgKiBSZXBsYWNlIDxMb2NhbExlYWRlcj4gYnkgdGhlIHZhbHVlIG9mICJtYXBsb2NhbGxlYWRlciIuCisJICAgICAqIElmICJtYXBsZWFkZXIiIG9yICJtYXBsb2NhbGxlYWRlciIgaXNuJ3Qgc2V0IHVzZSBhIGJhY2tzbGFzaC4KKwkgICAgICovCisJICAgIGlmIChTVFJOSUNNUChzcmMsICI8TGVhZGVyPiIsIDgpID09IDApCisJICAgIHsKKwkJbGVuID0gODsKKwkJcCA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOm1hcGxlYWRlciIpOworCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUk5JQ01QKHNyYywgIjxMb2NhbExlYWRlcj4iLCAxMykgPT0gMCkKKwkgICAgeworCQlsZW4gPSAxMzsKKwkJcCA9IGdldF92YXJfdmFsdWUoKGNoYXJfdSAqKSJnOm1hcGxvY2FsbGVhZGVyIik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWxlbiA9IDA7CisJCXAgPSBOVUxMOworCSAgICB9CisJICAgIGlmIChsZW4gIT0gMCkKKwkgICAgeworCQkvKiBBbGxvdyB1cCB0byA4ICogNiBjaGFyYWN0ZXJzIGZvciAibWFwbGVhZGVyIi4gKi8KKwkJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSBOVUwgfHwgU1RSTEVOKHApID4gOCAqIDYpCisJCSAgICBzID0gKGNoYXJfdSAqKSJcXCI7CisJCWVsc2UKKwkJICAgIHMgPSBwOworCQl3aGlsZSAoKnMgIT0gTlVMKQorCQkgICAgcmVzdWx0W2RsZW4rK10gPSAqcysrOworCQlzcmMgKz0gbGVuOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisJLyoKKwkgKiBSZW1vdmUgQ1RSTC1WIGFuZCBpZ25vcmUgdGhlIG5leHQgY2hhcmFjdGVyLgorCSAqIEZvciAiZnJvbSIgc2lkZSB0aGUgQ1RSTC1WIGF0IHRoZSBlbmQgaXMgaW5jbHVkZWQsIGZvciB0aGUgInRvIgorCSAqIHBhcnQgaXQgaXMgcmVtb3ZlZC4KKwkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdCJywgYWxzbyBhY2NlcHQgYSBiYWNrc2xhc2guCisJICovCisJa2V5ID0gKnNyYzsKKwlpZiAoa2V5ID09IEN0cmxfViB8fCAoZG9fYmFja3NsYXNoICYmIGtleSA9PSAnXFwnKSkKKwl7CisJICAgICsrc3JjOwkJCQkvKiBza2lwIENUUkwtViBvciBiYWNrc2xhc2ggKi8KKwkgICAgaWYgKCpzcmMgPT0gTlVMKQorCSAgICB7CisJCWlmIChmcm9tX3BhcnQpCisJCSAgICByZXN1bHRbZGxlbisrXSA9IGtleTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyNpZmRlZiBGRUFUX01CWVRFCisJLyogc2tpcCBtdWx0aWJ5dGUgY2hhciBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHNyYyk7IGkgPiAwOyAtLWkpCisjZW5kaWYKKwl7CisJICAgIC8qCisJICAgICAqIElmIHRoZSBjaGFyYWN0ZXIgaXMgS19TUEVDSUFMLCByZXBsYWNlIGl0IHdpdGggS19TUEVDSUFMCisJICAgICAqIEtTX1NQRUNJQUwgS0VfRklMTEVSLgorCSAgICAgKiBJZiBjb21waWxlZCB3aXRoIHRoZSBHVUkgcmVwbGFjZSBDU0kgd2l0aCBLX0NTSS4KKwkgICAgICovCisJICAgIGlmICgqc3JjID09IEtfU1BFQ0lBTCkKKwkgICAgeworCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKKwkJcmVzdWx0W2RsZW4rK10gPSBLU19TUEVDSUFMOworCQlyZXN1bHRbZGxlbisrXSA9IEtFX0ZJTExFUjsKKwkgICAgfQorIyBpZmRlZiBGRUFUX0dVSQorCSAgICBlbHNlIGlmICgqc3JjID09IENTSSkKKwkgICAgeworCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKKwkJcmVzdWx0W2RsZW4rK10gPSBLU19FWFRSQTsKKwkJcmVzdWx0W2RsZW4rK10gPSAoaW50KUtFX0NTSTsKKwkgICAgfQorIyBlbmRpZgorCSAgICBlbHNlCisJCXJlc3VsdFtkbGVuKytdID0gKnNyYzsKKwkgICAgKytzcmM7CisJfQorICAgIH0KKyAgICByZXN1bHRbZGxlbl0gPSBOVUw7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBzdHJpbmcgdG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAgICAgKiBJZiB0aGlzIGZhaWxzLCBqdXN0IHJldHVybiBmcm9tLgorICAgICAqLworICAgIGlmICgoKmJ1ZnAgPSB2aW1fc3Ryc2F2ZShyZXN1bHQpKSAhPSBOVUxMKQorCWZyb20gPSAqYnVmcDsKKyAgICB2aW1fZnJlZShyZXN1bHQpOworICAgIHJldHVybiBmcm9tOworfQorCisvKgorICogRmluZCBhIHRlcm1jb2RlIHdpdGgga2V5cyAnc3JjJyAobXVzdCBiZSBOVUwgdGVybWluYXRlZCkuCisgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRlcm1jb2Rlc1tdLCBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KKyAgICBpbnQKK2ZpbmRfdGVybV9ieWtleXMoc3JjKQorICAgIGNoYXJfdQkqc3JjOworeworICAgIGludAkJaTsKKyAgICBpbnQJCXNsZW47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisgICAgeworCXNsZW4gPSB0ZXJtY29kZXNbaV0ubGVuOworCWlmIChzbGVuID4gMSAmJiBTVFJOQ01QKHRlcm1jb2Rlc1tpXS5jb2RlLCBzcmMsIChzaXplX3Qpc2xlbikgPT0gMCkKKwkgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIEdhdGhlciB0aGUgZmlyc3QgY2hhcmFjdGVycyBpbiB0aGUgdGVybWluYWwga2V5IGNvZGVzIGludG8gYSBzdHJpbmcuCisgKiBVc2VkIHRvIHNwZWVkIHVwIGNoZWNrX3Rlcm1jb2RlKCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ2F0aGVyX3Rlcm1sZWFkZXIoKQoreworICAgIGludAkgICAgaTsKKyAgICBpbnQJICAgIGxlbiA9IDA7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCXRlcm1sZWFkZXJbbGVuKytdID0gQ1NJOyAgICAvKiB0aGUgR1VJIGNvZGVzIGFyZSBub3QgaW4gdGVybWNvZGVzW10gKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisgICAgaWYgKGNoZWNrX2Zvcl9jb2RlcykKKwl0ZXJtbGVhZGVyW2xlbisrXSA9IERDUzsgICAgLyogdGhlIHRlcm1jb2RlIHJlc3BvbnNlIHN0YXJ0cyB3aXRoIERDUworCQkJCSAgICAgICBpbiA4LWJpdCBtb2RlICovCisjZW5kaWYKKyAgICB0ZXJtbGVhZGVyW2xlbl0gPSBOVUw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisJaWYgKHZpbV9zdHJjaHIodGVybWxlYWRlciwgdGVybWNvZGVzW2ldLmNvZGVbMF0pID09IE5VTEwpCisJeworCSAgICB0ZXJtbGVhZGVyW2xlbisrXSA9IHRlcm1jb2Rlc1tpXS5jb2RlWzBdOworCSAgICB0ZXJtbGVhZGVyW2xlbl0gPSBOVUw7CisJfQorCisgICAgbmVlZF9nYXRoZXIgPSBGQUxTRTsKK30KKworLyoKKyAqIFNob3cgYWxsIHRlcm1jb2RlcyAoZm9yICI6c2V0IHRlcm1jYXAiKQorICogVGhpcyBjb2RlIGxvb2tzIGEgbG90IGxpa2Ugc2hvd29wdGlvbnMoKSwgYnV0IGlzIGRpZmZlcmVudC4KKyAqLworICAgIHZvaWQKK3Nob3dfdGVybWNvZGVzKCkKK3sKKyAgICBpbnQJCWNvbDsKKyAgICBpbnQJCSppdGVtczsKKyAgICBpbnQJCWl0ZW1fY291bnQ7CisgICAgaW50CQlydW47CisgICAgaW50CQlyb3csIHJvd3M7CisgICAgaW50CQljb2xzOworICAgIGludAkJaTsKKyAgICBpbnQJCWxlbjsKKworI2RlZmluZSBJTkMgMjcJICAgIC8qIHRyeSB0byBtYWtlIHRocmVlIGNvbHVtbnMgKi8KKyNkZWZpbmUgR0FQIDIJICAgIC8qIHNwYWNlcyBiZXR3ZWVuIGNvbHVtbnMgKi8KKworICAgIGlmICh0Y19sZW4gPT0gMCkJICAgIC8qIG5vIHRlcm1pbmFsIGNvZGVzIChtdXN0IGJlIEdVSSkgKi8KKwlyZXR1cm47CisgICAgaXRlbXMgPSAoaW50ICopYWxsb2MoKHVuc2lnbmVkKShzaXplb2YoaW50KSAqIHRjX2xlbikpOworICAgIGlmIChpdGVtcyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIEhpZ2hsaWdodCB0aXRsZSAqLworICAgIE1TR19QVVRTX1RJVExFKF8oIlxuLS0tIFRlcm1pbmFsIGtleXMgLS0tIikpOworCisgICAgLyoKKyAgICAgKiBkbyB0aGUgbG9vcCB0d28gdGltZXM6CisgICAgICogMS4gZGlzcGxheSB0aGUgc2hvcnQgaXRlbXMgKG5vbi1zdHJpbmdzIGFuZCBzaG9ydCBzdHJpbmdzKQorICAgICAqIDIuIGRpc3BsYXkgdGhlIGxvbmcgaXRlbXMgKHN0cmluZ3MpCisgICAgICovCisgICAgZm9yIChydW4gPSAxOyBydW4gPD0gMiAmJiAhZ290X2ludDsgKytydW4pCisgICAgeworCS8qCisJICogY29sbGVjdCB0aGUgaXRlbXMgaW4gaXRlbXNbXQorCSAqLworCWl0ZW1fY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47IGkrKykKKwl7CisJICAgIGxlbiA9IHNob3dfb25lX3Rlcm1jb2RlKHRlcm1jb2Rlc1tpXS5uYW1lLAorCQkJCQkJICAgIHRlcm1jb2Rlc1tpXS5jb2RlLCBGQUxTRSk7CisJICAgIGlmICgobGVuIDw9IElOQyAtIEdBUCAmJiBydW4gPT0gMSkgfHwgKGxlbiA+IElOQyAtIEdBUCAmJiBydW4gPT0gMikpCisJCWl0ZW1zW2l0ZW1fY291bnQrK10gPSBpOworCX0KKworCS8qCisJICogZGlzcGxheSB0aGUgaXRlbXMKKwkgKi8KKwlpZiAocnVuID09IDEpCisJeworCSAgICBjb2xzID0gKENvbHVtbnMgKyBHQVApIC8gSU5DOworCSAgICBpZiAoY29scyA9PSAwKQorCQljb2xzID0gMTsKKwkgICAgcm93cyA9IChpdGVtX2NvdW50ICsgY29scyAtIDEpIC8gY29sczsKKwl9CisJZWxzZQkvKiBydW4gPT0gMiAqLworCSAgICByb3dzID0gaXRlbV9jb3VudDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd3MgJiYgIWdvdF9pbnQ7ICsrcm93KQorCXsKKwkgICAgbXNnX3B1dGNoYXIoJ1xuJyk7CQkJLyogZ28gdG8gbmV4dCBsaW5lICovCisJICAgIGlmIChnb3RfaW50KQkJCS8qICdxJyB0eXBlZCBpbiBtb3JlICovCisJCWJyZWFrOworCSAgICBjb2wgPSAwOworCSAgICBmb3IgKGkgPSByb3c7IGkgPCBpdGVtX2NvdW50OyBpICs9IHJvd3MpCisJICAgIHsKKwkJbXNnX2NvbCA9IGNvbDsJCQkvKiBtYWtlIGNvbHVtbnMgKi8KKwkJc2hvd19vbmVfdGVybWNvZGUodGVybWNvZGVzW2l0ZW1zW2ldXS5uYW1lLAorCQkJCQkgICAgICB0ZXJtY29kZXNbaXRlbXNbaV1dLmNvZGUsIFRSVUUpOworCQljb2wgKz0gSU5DOworCSAgICB9CisJICAgIG91dF9mbHVzaCgpOworCSAgICB1aV9icmVha2NoZWNrKCk7CisJfQorICAgIH0KKyAgICB2aW1fZnJlZShpdGVtcyk7Cit9CisKKy8qCisgKiBTaG93IG9uZSB0ZXJtY29kZSBlbnRyeS4KKyAqIE91dHB1dCBnb2VzIGludG8gSU9idWZmW10KKyAqLworICAgIGludAorc2hvd19vbmVfdGVybWNvZGUobmFtZSwgY29kZSwgcHJpbnRpdCkKKyAgICBjaGFyX3UgICpuYW1lOworICAgIGNoYXJfdSAgKmNvZGU7CisgICAgaW50CSAgICBwcmludGl0OworeworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCWxlbjsKKworICAgIGlmIChuYW1lWzBdID4gJ34nKQorICAgIHsKKwlJT2J1ZmZbMF0gPSAnICc7CisJSU9idWZmWzFdID0gJyAnOworCUlPYnVmZlsyXSA9ICcgJzsKKwlJT2J1ZmZbM10gPSAnICc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJSU9idWZmWzBdID0gJ3QnOworCUlPYnVmZlsxXSA9ICdfJzsKKwlJT2J1ZmZbMl0gPSBuYW1lWzBdOworCUlPYnVmZlszXSA9IG5hbWVbMV07CisgICAgfQorICAgIElPYnVmZls0XSA9ICcgJzsKKworICAgIHAgPSBnZXRfc3BlY2lhbF9rZXlfbmFtZShURVJNQ0FQMktFWShuYW1lWzBdLCBuYW1lWzFdKSwgMCk7CisgICAgaWYgKHBbMV0gIT0gJ3QnKQorCVNUUkNQWShJT2J1ZmYgKyA1LCBwKTsKKyAgICBlbHNlCisJSU9idWZmWzVdID0gTlVMOworICAgIGxlbiA9IChpbnQpU1RSTEVOKElPYnVmZik7CisgICAgZG8KKwlJT2J1ZmZbbGVuKytdID0gJyAnOworICAgIHdoaWxlIChsZW4gPCAxNyk7CisgICAgSU9idWZmW2xlbl0gPSBOVUw7CisgICAgaWYgKGNvZGUgPT0gTlVMTCkKKwlsZW4gKz0gNDsKKyAgICBlbHNlCisJbGVuICs9IHZpbV9zdHJzaXplKGNvZGUpOworCisgICAgaWYgKHByaW50aXQpCisgICAgeworCW1zZ19wdXRzKElPYnVmZik7CisJaWYgKGNvZGUgPT0gTlVMTCkKKwkgICAgbXNnX3B1dHMoKGNoYXJfdSAqKSJOVUxMIik7CisJZWxzZQorCSAgICBtc2dfb3V0dHJhbnMoY29kZSk7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZvciBYdGVybSA+PSAxNDAgY29tcGlsZWQgd2l0aCBPUFRfVENBUF9RVUVSWTogT2J0YWluIHRoZSBhY3R1YWxseSB1c2VkCisgKiB0ZXJtY2FwIGNvZGVzIGZyb20gdGhlIHRlcm1pbmFsIGl0c2VsZi4KKyAqIFdlIGdldCB0aGVtIG9uZSBieSBvbmUgdG8gYXZvaWQgYSB2ZXJ5IGxvbmcgcmVzcG9uc2Ugc3RyaW5nLgorICovCitzdGF0aWMgaW50IHh0X2luZGV4X2luID0gMDsKK3N0YXRpYyBpbnQgeHRfaW5kZXhfb3V0ID0gMDsKKworICAgIHN0YXRpYyB2b2lkCityZXFfY29kZXNfZnJvbV90ZXJtKCkKK3sKKyAgICB4dF9pbmRleF9vdXQgPSAwOworICAgIHh0X2luZGV4X2luID0gMDsKKyAgICByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKTsKK30KKworICAgIHN0YXRpYyB2b2lkCityZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKQoreworICAgIGNoYXIJYnVmWzExXTsKKyAgICBpbnQJCW9sZF9pZHggPSB4dF9pbmRleF9vdXQ7CisKKyAgICAvKiBEb24ndCBkbyBhbnl0aGluZyB3aGVuIGdvaW5nIHRvIGV4aXQuICovCisgICAgaWYgKGV4aXRpbmcpCisJcmV0dXJuOworCisgICAgLyogU2VuZCB1cCB0byAxMCBtb3JlIHJlcXVlc3RzIG91dCB0aGFuIHdlIHJlY2VpdmVkLiAgQXZvaWQgc2VuZGluZyB0b28KKyAgICAgKiBtYW55LCB0aGVyZSBjYW4gYmUgYSBidWZmZXIgb3ZlcmZsb3cgc29tZXdoZXJlLiAqLworICAgIHdoaWxlICh4dF9pbmRleF9vdXQgPCB4dF9pbmRleF9pbiArIDEwICYmIGtleV9uYW1lc1t4dF9pbmRleF9vdXRdICE9IE5VTEwpCisgICAgeworCXNwcmludGYoYnVmLCAiXDAzM1ArcSUwMnglMDJ4XDAzM1xcIiwKKwkJICAgICAga2V5X25hbWVzW3h0X2luZGV4X291dF1bMF0sIGtleV9uYW1lc1t4dF9pbmRleF9vdXRdWzFdKTsKKwlvdXRfc3RyX25mKChjaGFyX3UgKilidWYpOworCSsreHRfaW5kZXhfb3V0OworICAgIH0KKworICAgIC8qIFNlbmQgdGhlIGNvZGVzIG91dCByaWdodCBhd2F5LiAqLworICAgIGlmICh4dF9pbmRleF9vdXQgIT0gb2xkX2lkeCkKKwlvdXRfZmx1c2goKTsKK30KKworLyoKKyAqIERlY29kZSBrZXkgY29kZSByZXNwb25zZSBmcm9tIHh0ZXJtOiAnPEVzYz5QMStyPG5hbWU+PTxzdHJpbmc+PEVzYz5cJy4KKyAqIEEgIjAiIGluc3RlYWQgb2YgdGhlICIxIiBpbmRpY2F0ZXMgYSBjb2RlIHRoYXQgaXNuJ3Qgc3VwcG9ydGVkLgorICogQm90aCA8bmFtZT4gYW5kIDxzdHJpbmc+IGFyZSBlbmNvZGVkIGluIGhleC4KKyAqICJjb2RlIiBwb2ludHMgdG8gdGhlICIwIiBvciAiMSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZ290X2NvZGVfZnJvbV90ZXJtKGNvZGUsIGxlbikKKyAgICBjaGFyX3UJKmNvZGU7CisgICAgaW50CQlsZW47Cit7CisjZGVmaW5lIFhUX0xFTiAxMDAKKyAgICBjaGFyX3UJbmFtZVszXTsKKyAgICBjaGFyX3UJc3RyW1hUX0xFTl07CisgICAgaW50CQlpOworICAgIGludAkJaiA9IDA7CisgICAgaW50CQljOworCisgICAgLyogQSAnMScgbWVhbnMgdGhlIGNvZGUgaXMgc3VwcG9ydGVkLCBhICcwJyBtZWFucyBpdCBpc24ndC4KKyAgICAgKiBXaGVuIGhhbGYgdGhlIGxlbmd0aCBpcyA+IFhUX0xFTiB3ZSBjYW4ndCB1c2UgaXQuCisgICAgICogT3VyIG5hbWVzIGFyZSBjdXJyZW50bHkgYWxsIDIgY2hhcmFjdGVycy4gKi8KKyAgICBpZiAoY29kZVswXSA9PSAnMScgJiYgY29kZVs3XSA9PSAnPScgJiYgbGVuIC8gMiA8IFhUX0xFTikKKyAgICB7CisJLyogR2V0IHRoZSBuYW1lIGZyb20gdGhlIHJlc3BvbnNlIGFuZCBmaW5kIGl0IGluIHRoZSB0YWJsZS4gKi8KKwluYW1lWzBdID0gaGV4aGV4Mm5yKGNvZGUgKyAzKTsKKwluYW1lWzFdID0gaGV4aGV4Mm5yKGNvZGUgKyA1KTsKKwluYW1lWzJdID0gTlVMOworCWZvciAoaSA9IDA7IGtleV9uYW1lc1tpXSAhPSBOVUxMOyArK2kpCisJeworCSAgICBpZiAoU1RSQ01QKGtleV9uYW1lc1tpXSwgbmFtZSkgPT0gMCkKKwkgICAgeworCQl4dF9pbmRleF9pbiA9IGk7CisJCWJyZWFrOworCSAgICB9CisJfQorCWlmIChrZXlfbmFtZXNbaV0gIT0gTlVMTCkKKwl7CisJICAgIGZvciAoaSA9IDg7IChjID0gaGV4aGV4Mm5yKGNvZGUgKyBpKSkgPj0gMDsgaSArPSAyKQorCQlzdHJbaisrXSA9IGM7CisJICAgIHN0cltqXSA9IE5VTDsKKwkgICAgaWYgKG5hbWVbMF0gPT0gJ0MnICYmIG5hbWVbMV0gPT0gJ28nKQorCSAgICB7CisJCS8qIENvbG9yIGNvdW50IGlzIG5vdCBhIGtleSBjb2RlLiAqLworCQlpID0gYXRvaSgoY2hhciAqKXN0cik7CisJCWlmIChpICE9IHRfY29sb3JzKQorCQl7CisJCSAgICAvKiBOciBvZiBjb2xvcnMgY2hhbmdlZCwgaW5pdGlhbGl6ZSBoaWdobGlnaHRpbmcgYW5kCisJCSAgICAgKiByZWRyYXcgZXZlcnl0aGluZy4gKi8KKwkJICAgIHNldF9jb2xvcl9jb3VudChpKTsKKwkJICAgIGluaXRfaGlnaGxpZ2h0KFRSVUUsIEZBTFNFKTsKKwkJICAgIHJlZHJhd19sYXRlcihDTEVBUik7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogRmlyc3QgZGVsZXRlIGFueSBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIGNvZGUuICovCisJCWkgPSBmaW5kX3Rlcm1fYnlrZXlzKHN0cik7CisJCWlmIChpID49IDApCisJCSAgICBkZWxfdGVybWNvZGVfaWR4KGkpOworCQlhZGRfdGVybWNvZGUobmFtZSwgc3RyLCBGQUxTRSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogTWF5IHJlcXVlc3QgbW9yZSBjb2RlcyBub3cgdGhhdCB3ZSByZWNlaXZlZCBvbmUuICovCisgICAgKyt4dF9pbmRleF9pbjsKKyAgICByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdW5hbnN3ZXJlZCByZXF1ZXN0cyBhbmQgZGVhbCB3aXRoIHRoZW0uCisgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYW4gZXh0ZXJuYWwgcHJvZ3JhbSBvciBnZXR0aW5nIGRpcmVjdAorICoga2V5Ym9hcmQgaW5wdXQuICBXZSBkb24ndCB3YW50IHJlc3BvbnNlcyB0byBiZSBzZW5kIHRvIHRoYXQgcHJvZ3JhbSBvcgorICogaGFuZGxlZCBhcyB0eXBlZCB0ZXh0LgorICovCisgICAgc3RhdGljIHZvaWQKK2NoZWNrX2Zvcl9jb2Rlc19mcm9tX3Rlcm0oKQoreworICAgIGludAkJYzsKKworICAgIC8qIElmIG5vIGNvZGVzIHJlcXVlc3RlZCBvciBhbGwgYXJlIGFuc3dlcmVkLCBubyBuZWVkIHRvIHdhaXQuICovCisgICAgaWYgKHh0X2luZGV4X291dCA9PSAwIHx8IHh0X2luZGV4X291dCA9PSB4dF9pbmRleF9pbikKKwlyZXR1cm47CisKKyAgICAvKiBWZ2V0YygpIHdpbGwgY2hlY2sgZm9yIGFuZCBoYW5kbGUgYW55IHJlc3BvbnNlLgorICAgICAqIEtlZXAgY2FsbGluZyB2cGVla2MoKSB1bnRpbCB3ZSBkb24ndCBnZXQgYW55IHJlc3BvbnNlcy4gKi8KKyAgICArK25vX21hcHBpbmc7CisgICAgKythbGxvd19rZXlzOworICAgIGZvciAoOzspCisgICAgeworCWMgPSB2cGVla2MoKTsKKwlpZiAoYyA9PSBOVUwpCSAgICAvKiBub3RoaW5nIGF2YWlsYWJsZSAqLworCSAgICBicmVhazsKKworCS8qIElmIGEgcmVzcG9uc2UgaXMgcmVjb2duaXplZCBpdCdzIHJlcGxhY2VkIHdpdGggS19JR05PUkUsIG11c3QgcmVhZAorCSAqIGl0IGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIElmIHRoZXJlIGlzIG5vIEtfSUdOT1JFIHdlIGNhbid0IGRvCisJICogYW55dGhpbmcsIGJyZWFrIGhlcmUgKHRoZXJlIG1pZ2h0IGJlIHNvbWUgcmVzcG9uc2VzIGZ1cnRoZXIgb24sIGJ1dAorCSAqIHdlIGRvbid0IHdhbnQgdG8gdGhyb3cgYXdheSBhbnkgdHlwZWQgY2hhcnMpLiAqLworCWlmIChjICE9IEtfU1BFQ0lBTCAmJiBjICE9IEtfSUdOT1JFKQorCSAgICBicmVhazsKKwljID0gdmdldGMoKTsKKwlpZiAoYyAhPSBLX0lHTk9SRSkKKwl7CisJICAgIHZ1bmdldGMoYyk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgLS1ub19tYXBwaW5nOworICAgIC0tYWxsb3dfa2V5czsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVHJhbnNsYXRlIGFuIGludGVybmFsIG1hcHBpbmcvYWJicmV2aWF0aW9uIHJlcHJlc2VudGF0aW9uIGludG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGV4dGVybmFsIG9uZSByZWNvZ25pemVkIGJ5IDptYXAvOmFiYnJldiBjb21tYW5kczsKKyAqIHJlc3BlY3RzIHRoZSBjdXJyZW50IEIvay88IHNldHRpbmdzIG9mICdjcG9wdGlvbicuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBleHBhbmRpbmcgbWFwcGluZ3MvYWJicmV2aWF0aW9ucyBvbiB0aGUKKyAqIGNvbW1hbmQtbGluZSwgYW5kIGZvciBidWlsZGluZyB0aGUgIkFtYmlndW91cyBtYXBwaW5nLi4uIiBlcnJvciBtZXNz5mdlLgorICoKKyAqIEl0IHVzZXMgYSBncm93YXJyYXkgdG8gYnVpbGQgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBzaW5jZSB0aGUKKyAqIGxhdHRlciBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb24uIFRoZSBjYWxsZXIgaGFzIHRvCisgKiBmcmVlIHRoZSBzdHJpbmcgYWZ0ZXJ3YXJkcy4KKyAqCisgKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0uCisgKi8KKyAgICBjaGFyX3UgKgordHJhbnNsYXRlX21hcHBpbmcoc3RyLCBleHBtYXApCisgICAgY2hhcl91CSpzdHI7CisgICAgaW50CQlleHBtYXA7ICAvKiBUUlVFIHdoZW4gZXhwYW5kaW5nIG1hcHBpbmdzIG9uIGNvbW1hbmQtbGluZSAqLworeworICAgIGdhcnJheV9UCWdhOworICAgIGludAkJYzsKKyAgICBpbnQJCW1vZGlmaWVyczsKKyAgICBpbnQJCWNwb19ic2xhc2g7CisgICAgaW50CQljcG9fc3BlY2lhbDsKKyAgICBpbnQJCWNwb19rZXljb2RlOworCisgICAgZ2FfaW5pdCgmZ2EpOworICAgIGdhLmdhX2l0ZW1zaXplID0gMTsKKyAgICBnYS5nYV9ncm93c2l6ZSA9IDQwOworCisgICAgY3BvX2JzbGFzaCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlNMQVNIKSAhPSBOVUxMKTsKKyAgICBjcG9fc3BlY2lhbCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1BFQ0kpICE9IE5VTEwpOworICAgIGNwb19rZXljb2RlID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19LRVlDT0RFKSA9PSBOVUxMKTsKKworICAgIGZvciAoOyAqc3RyOyArK3N0cikKKyAgICB7CisJYyA9ICpzdHI7CisJaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKKwl7CisJICAgIG1vZGlmaWVycyA9IDA7CisJICAgIGlmIChzdHJbMV0gPT0gS1NfTU9ESUZJRVIpCisJICAgIHsKKwkJc3RyKys7CisJCW1vZGlmaWVycyA9ICorK3N0cjsKKwkJYyA9ICorK3N0cjsKKwkgICAgfQorCSAgICBpZiAoY3BvX3NwZWNpYWwgJiYgY3BvX2tleWNvZGUgJiYgYyA9PSBLX1NQRUNJQUwgJiYgIW1vZGlmaWVycykKKwkgICAgeworCQlpbnQJaTsKKworCQkvKiB0cnkgdG8gZmluZCBzcGVjaWFsIGtleSBpbiB0ZXJtY29kZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorCQkgICAgaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IHN0clsxXQorCQkJCQkgICAgJiYgdGVybWNvZGVzW2ldLm5hbWVbMV0gPT0gc3RyWzJdKQorCQkJYnJlYWs7CisJCWlmIChpIDwgdGNfbGVuKQorCQl7CisJCSAgICBnYV9jb25jYXQoJmdhLCB0ZXJtY29kZXNbaV0uY29kZSk7CisJCSAgICBzdHIgKz0gMjsKKwkJICAgIGNvbnRpbnVlOyAvKiBmb3IgKHN0cikgKi8KKwkJfQorCSAgICB9CisJICAgIGlmIChjID09IEtfU1BFQ0lBTCAmJiBzdHJbMV0gIT0gTlVMICYmIHN0clsyXSAhPSBOVUwpCisJICAgIHsKKwkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKKwkJeworCQkgICAgZ2FfY2xlYXIoJmdhKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCWMgPSBUT19TUEVDSUFMKHN0clsxXSwgc3RyWzJdKTsKKwkJaWYgKGMgPT0gS19aRVJPKQkvKiBkaXNwbGF5IDxOdWw+IGFzIF5AICovCisJCSAgICBjID0gTlVMOworCQlzdHIgKz0gMjsKKwkgICAgfQorCSAgICBpZiAoSVNfU1BFQ0lBTChjKSB8fCBtb2RpZmllcnMpCS8qIHNwZWNpYWwga2V5ICovCisJICAgIHsKKwkJaWYgKGV4cG1hcCAmJiBjcG9fc3BlY2lhbCkKKwkJeworCQkgICAgZ2FfY2xlYXIoJmdhKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCWdhX2NvbmNhdCgmZ2EsIGdldF9zcGVjaWFsX2tleV9uYW1lKGMsIG1vZGlmaWVycykpOworCQljb250aW51ZTsgLyogZm9yIChzdHIpICovCisJICAgIH0KKwl9CisJaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09IEN0cmxfSiB8fCBjID09IEN0cmxfVgorCSAgICB8fCAoYyA9PSAnPCcgJiYgIWNwb19zcGVjaWFsKSB8fCAoYyA9PSAnXFwnICYmICFjcG9fYnNsYXNoKSkKKwkgICAgZ2FfYXBwZW5kKCZnYSwgY3BvX2JzbGFzaCA/IEN0cmxfViA6ICdcXCcpOworCWlmIChjKQorCSAgICBnYV9hcHBlbmQoJmdhLCBjKTsKKyAgICB9CisgICAgZ2FfYXBwZW5kKCZnYSwgTlVMKTsKKyAgICByZXR1cm4gKGNoYXJfdSAqKShnYS5nYV9kYXRhKTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUkpKSB8fCBkZWZpbmVkKFBST1RPKQorc3RhdGljIGNoYXIga3NtZV9zdHJbMjBdOworc3RhdGljIGNoYXIga3Ntcl9zdHJbMjBdOworc3RhdGljIGNoYXIga3NtZF9zdHJbMjBdOworCisvKgorICogRm9yIFdpbjMyIGNvbnNvbGU6IHVwZGF0ZSB0ZXJtY2FwIGNvZGVzIGZvciBleGlzdGluZyBjb25zb2xlIGF0dHJpYnV0ZXMuCisgKi8KKyAgICB2b2lkCit1cGRhdGVfdGNhcChhdHRyKQorICAgIGludCBhdHRyOworeworICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnA7CisKKyAgICBwID0gZmluZF9idWlsdGluX3Rlcm0oREVGQVVMVF9URVJNKTsKKyAgICBzcHJpbnRmKGtzbWVfc3RyLCBJRl9FQigiXDAzM3wlZG0iLCBFU0NfU1RSICJ8JWRtIiksIGF0dHIpOworICAgIHNwcmludGYoa3NtZF9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwKKwkJCQkgICAgIGF0dHIgfCAweDA4KTsgIC8qIEZPUkVHUk9VTkRfSU5URU5TSVRZICovCisgICAgc3ByaW50Zihrc21yX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLAorCQkJCSAoKGF0dHIgJiAweDBGKSA8PCA0KSB8ICgoYXR0ciAmIDB4RjApID4+IDQpKTsKKworICAgIHdoaWxlIChwLT5idF9zdHJpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19NRSkKKwkgIHAtPmJ0X3N0cmluZyA9ICZrc21lX3N0clswXTsKKyAgICAgIGVsc2UgaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTVIpCisJICBwLT5idF9zdHJpbmcgPSAma3Ntcl9zdHJbMF07CisgICAgICBlbHNlIGlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX01EKQorCSAgcC0+YnRfc3RyaW5nID0gJmtzbWRfc3RyWzBdOworICAgICAgKytwOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlcm0uaCBiL3NyYy90ZXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiMTA2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXJtLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluZXMgZm9yIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBlc2NhcGUgc2VxdWVuY2VzCisgKiB0aGF0IHRoZSBlZGl0b3IgbmVlZHMgdG8gcGVyZm9ybSB2YXJpb3VzIG9wZXJhdGlvbnMuIEFsbCBvZiB0aGUgc2VxdWVuY2VzCisgKiBoZXJlIGFyZSBvcHRpb25hbCwgZXhjZXB0ICJjbSIgKGN1cnNvciBtb3Rpb24pLgorICovCisKKyNpZiBkZWZpbmVkKFNBU0MpICYmIFNBU0MgPCA2NTgKKy8qCisgKiBUaGUgU0FTIEMgY29tcGlsZXIgaGFzIGEgYnVnIHRoYXQgbWFrZXMgdHlwZWRlZnMgYmVpbmcgZm9yZ290IGluIGluY2x1ZGUKKyAqIGZpbGVzLiAgSGFzIGJlZW4gZml4ZWQgaW4gdmVyc2lvbiA2LjU4LgorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgY2hhcl91OworI2VuZGlmCisKKy8qCisgKiBJbmRleCBvZiB0aGUgdGVybWNhcCBjb2RlcyBpbiB0aGUgdGVybV9zdHJpbmdzIGFycmF5LgorICovCitlbnVtIFNwZWNpYWxLZXkKK3sKKyAgICBLU19OQU1FID0gMCwvKiBuYW1lIG9mIHRoaXMgdGVybWluYWwgZW50cnkgKi8KKyAgICBLU19DRSwJLyogY2xlYXIgdG8gZW5kIG9mIGxpbmUgKi8KKyAgICBLU19BTCwJLyogYWRkIG5ldyBibGFuayBsaW5lICovCisgICAgS1NfQ0FMLAkvKiBhZGQgbnVtYmVyIG9mIGJsYW5rIGxpbmVzICovCisgICAgS1NfREwsCS8qIGRlbGV0ZSBsaW5lICovCisgICAgS1NfQ0RMLAkvKiBkZWxldGUgbnVtYmVyIG9mIGxpbmVzICovCisgICAgS1NfQ1MsCS8qIHNjcm9sbCByZWdpb24gKi8KKyAgICBLU19DTCwJLyogY2xlYXIgc2NyZWVuICovCisgICAgS1NfQ0QsCS8qIGNsZWFyIHRvIGVuZCBvZiBkaXNwbGF5ICovCisgICAgS1NfVVQsCS8qIGNsZWFyaW5nIHVzZXMgY3VycmVudCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgS1NfREEsCS8qIHRleHQgbWF5IGJlIHNjcm9sbGVkIGRvd24gZnJvbSB1cCAqLworICAgIEtTX0RCLAkvKiB0ZXh0IG1heSBiZSBzY3JvbGxlZCB1cCBmcm9tIGRvd24gKi8KKyAgICBLU19WSSwJLyogY3Vyc29yIGludmlzaWJsZSAqLworICAgIEtTX1ZFLAkvKiBjdXJzb3IgdmlzaWJsZSAqLworICAgIEtTX1ZTLAkvKiBjdXJzb3IgdmVyeSB2aXNpYmxlICovCisgICAgS1NfTUUsCS8qIG5vcm1hbCBtb2RlICovCisgICAgS1NfTVIsCS8qIHJldmVyc2UgbW9kZSAqLworICAgIEtTX01ELAkvKiBib2xkIG1vZGUgKi8KKyAgICBLU19TRSwJLyogbm9ybWFsIG1vZGUgKi8KKyAgICBLU19TTywJLyogc3RhbmRvdXQgbW9kZSAqLworICAgIEtTX0NaSCwJLyogaXRhbGljIG1vZGUgc3RhcnQgKi8KKyAgICBLU19DWlIsCS8qIGl0YWxpYyBtb2RlIGVuZCAqLworICAgIEtTX1VFLAkvKiBleGl0IHVuZGVyc2NvcmUgbW9kZSAqLworICAgIEtTX1VTLAkvKiB1bmRlcnNjb3JlIG1vZGUgKi8KKyAgICBLU19NUywJLyogc2F2ZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KKyAgICBLU19DTSwJLyogY3Vyc29yIG1vdGlvbiAqLworICAgIEtTX1NSLAkvKiBzY3JvbGwgcmV2ZXJzZSAoYmFja3dhcmQpICovCisgICAgS1NfQ1JJLAkvKiBjdXJzb3IgbnVtYmVyIG9mIGNoYXJzIHJpZ2h0ICovCisgICAgS1NfVkIsCS8qIHZpc3VhbCBiZWxsICovCisgICAgS1NfS1MsCS8qIHB1dCB0ZXJtIGluICJrZXlwYWQgdHJhbnNtaXQiIG1vZGUgKi8KKyAgICBLU19LRSwJLyogb3V0IG9mICJrZXlwYWQgdHJhbnNtaXQiIG1vZGUgKi8KKyAgICBLU19USSwJLyogcHV0IHRlcm1pbmFsIGluIHRlcm1jYXAgbW9kZSAqLworICAgIEtTX1RFLAkvKiBvdXQgb2YgdGVybWNhcCBtb2RlICovCisgICAgS1NfQkMsCS8qIGJhY2tzcGFjZSBjaGFyYWN0ZXIgKGN1cnNvciBsZWZ0KSAqLworICAgIEtTX0NDUywJLyogY3VyIGlzIHJlbGF0aXZlIHRvIHNjcm9sbCByZWdpb24gKi8KKyAgICBLU19DQ08sCS8qIG51bWJlciBvZiBjb2xvcnMgKi8KKyAgICBLU19DU0YsCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisgICAgS1NfQ1NCLAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIEtTX1hTLAkvKiBzdGFuZG91dCBub3QgZXJhc2VkIGJ5IG92ZXJ3cml0aW5nIChocHRlcm0pICovCisgICAgS1NfTUIsCS8qIGJsaW5rIG1vZGUgKi8KKyAgICBLU19DQUYsCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLworICAgIEtTX0NBQiwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCisgICAgS1NfTEUsCS8qIGN1cnNvciBsZWZ0IChtb3N0bHkgYmFja3NwYWNlKSAqLworICAgIEtTX05ELAkvKiBjdXJzb3IgcmlnaHQgKi8KKyAgICBLU19DSVMsCS8qIHNldCBpY29uIHRleHQgc3RhcnQgKi8KKyAgICBLU19DSUUsCS8qIHNldCBpY29uIHRleHQgZW5kICovCisgICAgS1NfVFMsCS8qIHNldCB3aW5kb3cgdGl0bGUgc3RhcnQgKHRvIHN0YXR1cyBsaW5lKSovCisgICAgS1NfRlMsCS8qIHNldCB3aW5kb3cgdGl0bGUgZW5kIChmcm9tIHN0YXR1cyBsaW5lKSAqLworICAgIEtTX0NXUCwJLyogc2V0IHdpbmRvdyBwb3NpdGlvbiBpbiBwaXhlbHMgKi8KKyAgICBLU19DV1MsCS8qIHNldCB3aW5kb3cgc2l6ZSBpbiBjaGFyYWN0ZXJzICovCisgICAgS1NfQ1JWLAkvKiByZXF1ZXN0IHZlcnNpb24gc3RyaW5nICovCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBLU19DU1YsCS8qIHNjcm9sbCByZWdpb24gdmVydGljYWwgKi8KKyNlbmRpZgorICAgIEtTX09QCS8qIG9yaWdpbmFsIGNvbG9yIHBhaXIgKi8KK307CisKKyNkZWZpbmUgS1NfTEFTVAkgICAgS1NfT1AKKworLyoKKyAqIHRoZSB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMgYXJlIHN0b3JlZCBpbiB0aGlzIGFycmF5CisgKiBJTVBPUlRBTlQ6IFdoZW4gbWFraW5nIGNoYW5nZXMsIG5vdGUgdGhlIGZvbGxvd2luZzoKKyAqIC0gdGhlcmUgc2hvdWxkIGJlIGFuIGVudHJ5IGZvciBlYWNoIGNvZGUgaW4gdGhlIGJ1aWx0aW4gdGVybWNhcHMKKyAqIC0gdGhlcmUgc2hvdWxkIGJlIGFuIG9wdGlvbiBmb3IgZWFjaCBjb2RlIGluIG9wdGlvbi5jCisgKiAtIHRoZXJlIHNob3VsZCBiZSBjb2RlIGluIHRlcm0uYyB0byBvYnRhaW4gdGhlIHZhbHVlIGZyb20gdGhlIHRlcm1jYXAKKyAqLworCitleHRlcm4gY2hhcl91ICoodGVybV9zdHJpbmdzW10pOyAgICAvKiBjdXJyZW50IHRlcm1pbmFsIHN0cmluZ3MgKi8KKworLyoKKyAqIHN0cmluZ3MgdXNlZCBmb3IgdGVybWluYWwKKyAqLworI2RlZmluZSBUX05BTUUJKHRlcm1fc3RyKEtTX05BTUUpKQkvKiB0ZXJtaW5hbCBuYW1lICovCisjZGVmaW5lIFRfQ0UJKHRlcm1fc3RyKEtTX0NFKSkJLyogY2xlYXIgdG8gZW5kIG9mIGxpbmUgKi8KKyNkZWZpbmUgVF9BTAkodGVybV9zdHIoS1NfQUwpKQkvKiBhZGQgbmV3IGJsYW5rIGxpbmUgKi8KKyNkZWZpbmUgVF9DQUwJKHRlcm1fc3RyKEtTX0NBTCkpCS8qIGFkZCBudW1iZXIgb2YgYmxhbmsgbGluZXMgKi8KKyNkZWZpbmUgVF9ETAkodGVybV9zdHIoS1NfREwpKQkvKiBkZWxldGUgbGluZSAqLworI2RlZmluZSBUX0NETAkodGVybV9zdHIoS1NfQ0RMKSkJLyogZGVsZXRlIG51bWJlciBvZiBsaW5lcyAqLworI2RlZmluZSBUX0NTCSh0ZXJtX3N0cihLU19DUykpCS8qIHNjcm9sbCByZWdpb24gKi8KKyNkZWZpbmUgVF9DU1YJKHRlcm1fc3RyKEtTX0NTVikpCS8qIHNjcm9sbCByZWdpb24gdmVydGljYWwgKi8KKyNkZWZpbmUgVF9DTAkodGVybV9zdHIoS1NfQ0wpKQkvKiBjbGVhciBzY3JlZW4gKi8KKyNkZWZpbmUgVF9DRAkodGVybV9zdHIoS1NfQ0QpKQkvKiBjbGVhciB0byBlbmQgb2YgZGlzcGxheSAqLworI2RlZmluZSBUX1VUCSh0ZXJtX3N0cihLU19VVCkpCS8qIGNsZWFyaW5nIHVzZXMgYmFja2dyb3VuZCBjb2xvciAqLworI2RlZmluZSBUX0RBCSh0ZXJtX3N0cihLU19EQSkpCS8qIHRleHQgbWF5IGJlIHNjcm9sbGVkIGRvd24gZnJvbSB1cCAqLworI2RlZmluZSBUX0RCCSh0ZXJtX3N0cihLU19EQikpCS8qIHRleHQgbWF5IGJlIHNjcm9sbGVkIHVwIGZyb20gZG93biAqLworI2RlZmluZSBUX1ZJCSh0ZXJtX3N0cihLU19WSSkpCS8qIGN1cnNvciBpbnZpc2libGUgKi8KKyNkZWZpbmUgVF9WRQkodGVybV9zdHIoS1NfVkUpKQkvKiBjdXJzb3IgdmlzaWJsZSAqLworI2RlZmluZSBUX1ZTCSh0ZXJtX3N0cihLU19WUykpCS8qIGN1cnNvciB2ZXJ5IHZpc2libGUgKi8KKyNkZWZpbmUgVF9NRQkodGVybV9zdHIoS1NfTUUpKQkvKiBub3JtYWwgbW9kZSAqLworI2RlZmluZSBUX01SCSh0ZXJtX3N0cihLU19NUikpCS8qIHJldmVyc2UgbW9kZSAqLworI2RlZmluZSBUX01ECSh0ZXJtX3N0cihLU19NRCkpCS8qIGJvbGQgbW9kZSAqLworI2RlZmluZSBUX1NFCSh0ZXJtX3N0cihLU19TRSkpCS8qIG5vcm1hbCBtb2RlICovCisjZGVmaW5lIFRfU08JKHRlcm1fc3RyKEtTX1NPKSkJLyogc3RhbmRvdXQgbW9kZSAqLworI2RlZmluZSBUX0NaSAkodGVybV9zdHIoS1NfQ1pIKSkJLyogaXRhbGljIG1vZGUgc3RhcnQgKi8KKyNkZWZpbmUgVF9DWlIJKHRlcm1fc3RyKEtTX0NaUikpCS8qIGl0YWxpYyBtb2RlIGVuZCAqLworI2RlZmluZSBUX1VFCSh0ZXJtX3N0cihLU19VRSkpCS8qIGV4aXQgdW5kZXJzY29yZSBtb2RlICovCisjZGVmaW5lIFRfVVMJKHRlcm1fc3RyKEtTX1VTKSkJLyogdW5kZXJzY29yZSBtb2RlICovCisjZGVmaW5lIFRfTVMJKHRlcm1fc3RyKEtTX01TKSkJLyogc2F2ZSB0byBtb3ZlIGN1ciBpbiByZXZlcnNlIG1vZGUgKi8KKyNkZWZpbmUgVF9DTQkodGVybV9zdHIoS1NfQ00pKQkvKiBjdXJzb3IgbW90aW9uICovCisjZGVmaW5lIFRfU1IJKHRlcm1fc3RyKEtTX1NSKSkJLyogc2Nyb2xsIHJldmVyc2UgKGJhY2t3YXJkKSAqLworI2RlZmluZSBUX0NSSQkodGVybV9zdHIoS1NfQ1JJKSkJLyogY3Vyc29yIG51bWJlciBvZiBjaGFycyByaWdodCAqLworI2RlZmluZSBUX1ZCCSh0ZXJtX3N0cihLU19WQikpCS8qIHZpc3VhbCBiZWxsICovCisjZGVmaW5lIFRfS1MJKHRlcm1fc3RyKEtTX0tTKSkJLyogcHV0IHRlcm0gaW4gImtleXBhZCB0cmFuc21pdCIgbW9kZSAqLworI2RlZmluZSBUX0tFCSh0ZXJtX3N0cihLU19LRSkpCS8qIG91dCBvZiAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCisjZGVmaW5lIFRfVEkJKHRlcm1fc3RyKEtTX1RJKSkJLyogcHV0IHRlcm1pbmFsIGluIHRlcm1jYXAgbW9kZSAqLworI2RlZmluZSBUX1RFCSh0ZXJtX3N0cihLU19URSkpCS8qIG91dCBvZiB0ZXJtY2FwIG1vZGUgKi8KKyNkZWZpbmUgVF9CQwkodGVybV9zdHIoS1NfQkMpKQkvKiBiYWNrc3BhY2UgY2hhcmFjdGVyICovCisjZGVmaW5lIFRfQ0NTCSh0ZXJtX3N0cihLU19DQ1MpKQkvKiBjdXIgaXMgcmVsYXRpdmUgdG8gc2Nyb2xsIHJlZ2lvbiAqLworI2RlZmluZSBUX0NDTwkodGVybV9zdHIoS1NfQ0NPKSkJLyogbnVtYmVyIG9mIGNvbG9ycyAqLworI2RlZmluZSBUX0NTRgkodGVybV9zdHIoS1NfQ1NGKSkJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyNkZWZpbmUgVF9DU0IJKHRlcm1fc3RyKEtTX0NTQikpCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisjZGVmaW5lIFRfWFMJKHRlcm1fc3RyKEtTX1hTKSkJLyogc3RhbmRvdXQgbm90IGVyYXNlZCBieSBvdmVyd3JpdGluZyAqLworI2RlZmluZSBUX01CCSh0ZXJtX3N0cihLU19NQikpCS8qIGJsaW5rIG1vZGUgKi8KKyNkZWZpbmUgVF9DQUYJKHRlcm1fc3RyKEtTX0NBRikpCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLworI2RlZmluZSBUX0NBQgkodGVybV9zdHIoS1NfQ0FCKSkJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCisjZGVmaW5lIFRfTEUJKHRlcm1fc3RyKEtTX0xFKSkJLyogY3Vyc29yIGxlZnQgKi8KKyNkZWZpbmUgVF9ORAkodGVybV9zdHIoS1NfTkQpKQkvKiBjdXJzb3IgcmlnaHQgKi8KKyNkZWZpbmUgVF9DSVMJKHRlcm1fc3RyKEtTX0NJUykpCS8qIHNldCBpY29uIHRleHQgc3RhcnQgKi8KKyNkZWZpbmUgVF9DSUUJKHRlcm1fc3RyKEtTX0NJRSkpCS8qIHNldCBpY29uIHRleHQgZW5kICovCisjZGVmaW5lIFRfVFMJKHRlcm1fc3RyKEtTX1RTKSkJLyogc2V0IHdpbmRvdyB0aXRsZSBzdGFydCAqLworI2RlZmluZSBUX0ZTCSh0ZXJtX3N0cihLU19GUykpCS8qIHNldCB3aW5kb3cgdGl0bGUgZW5kICovCisjZGVmaW5lIFRfQ1dQCSh0ZXJtX3N0cihLU19DV1ApKQkvKiB3aW5kb3cgcG9zaXRpb24gKi8KKyNkZWZpbmUgVF9DV1MJKHRlcm1fc3RyKEtTX0NXUykpCS8qIHdpbmRvdyBzaXplICovCisjZGVmaW5lIFRfQ1JWCSh0ZXJtX3N0cihLU19DUlYpKQkvKiByZXF1ZXN0IHZlcnNpb24gc3RyaW5nICovCisjZGVmaW5lIFRfT1AJKHRlcm1fc3RyKEtTX09QKSkJLyogb3JpZ2luYWwgY29sb3IgcGFpciAqLworCisjZGVmaW5lIFRNT0RFX0NPT0sgIDAJLyogdGVybWluYWwgbW9kZSBmb3IgZXh0ZXJuYWwgY21kcyBhbmQgRXggbW9kZSAqLworI2RlZmluZSBUTU9ERV9TTEVFUCAxCS8qIHRlcm1pbmFsIG1vZGUgZm9yIHNsZWVwaW5nIChjb29rZWQgYnV0IG5vIGVjaG8pICovCisjZGVmaW5lIFRNT0RFX1JBVyAgIDIJLyogdGVybWluYWwgbW9kZSBmb3IgTm9ybWFsIGFuZCBJbnNlcnQgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlcm1saWIuYyBiL3NyYy90ZXJtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwMzZjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXJtbGliLmMKQEAgLTAsMCArMSw2MjggQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6ICovCisvKgorICogVGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBpcyAoQykgMTk4NCBQZXRlciBkYSBTaWx2YSwgdGhlIE1hZCBBdXN0cmFsaWFuLCBpbgorICogdGhlIHB1YmxpYyBkb21haW4uIEl0IG1heSBiZSByZS1kaXN0cmlidXRlZCBmb3IgYW55IHB1cnBvc2Ugd2l0aCB0aGUKKyAqIGluY2x1c2lvbiBvZiB0aGlzIG5vdGljZS4KKyAqLworCisvKiBNb2RpZmllZCBieSBCcmFtIE1vb2xlbmFhciBmb3IgdXNlIHdpdGggVklNIC0gVmkgSW1wcm92ZWQuICovCisvKiBBIGZldyBidWdzIHJlbW92ZWQgYnkgT2xhZiAnUmhpYWx0bycgU2VpYmVydC4gKi8KKworLyogVEVSTUxJQjogVGVybWluYWwgaW5kZXBlbmRhbnQgZGF0YWJhc2UuICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKyNpbmNsdWRlICJ0ZXJtbGliLnBybyIKKworI2lmICFkZWZpbmVkKEFNSUdBKSAmJiAhZGVmaW5lZChWTVMpICYmICFkZWZpbmVkKE1BQ09TKSAmJiAhZGVmaW5lZChSSVNDT1MpCisjIGluY2x1ZGUgPHNndHR5Lmg+CisjZW5kaWYKKworc3RhdGljIGludCAgZ2V0ZW50IF9fQVJHUygoY2hhciAqLCBjaGFyICosIEZJTEUgKiwgaW50KSk7CitzdGF0aWMgaW50ICBuZXh0ZW50IF9fQVJHUygoY2hhciAqLCBGSUxFICosIGludCkpOworc3RhdGljIGludCAgX21hdGNoIF9fQVJHUygoY2hhciAqLCBjaGFyICopKTsKK3N0YXRpYyBjaGFyICpfYWRkZm10IF9fQVJHUygoY2hhciAqLCBjaGFyICosIGludCkpOworc3RhdGljIGNoYXIgKl9maW5kIF9fQVJHUygoY2hhciAqLCBjaGFyICopKTsKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMgZm9yIHRlcm1saWIKKyAqLworCitjaGFyCSp0ZW50OwkJICAgICAgLyogUG9pbnRlciB0byB0ZXJtaW5hbCBlbnRyeSwgc2V0IGJ5IHRnZXRlbnQgKi8KK2NoYXIJUEMgPSAwOwkJICAgICAgLyogUGFkIGNoYXJhY3RlciwgZGVmYXVsdCBOVUxMICovCitjaGFyCSpVUCA9IDAsICpCQyA9IDA7ICAgICAvKiBQb2ludGVycyB0byBVUCBhbmQgQkMgc3RyaW5ncyBmcm9tIGRhdGFiYXNlICovCitzaG9ydAlvc3BlZWQ7CQkgICAgICAvKiBCYXVkIHJhdGUgKDEtMTYsIDE9MzAwLCAxNj0xOTIwMCksIGFzIGluIHN0dHkgKi8KKworLyoKKyAqIE1vZHVsZTogdGdldGVudAorICoKKyAqIFB1cnBvc2U6IEdldCB0ZXJtY2FwIGVudHJ5IGZvciA8dGVybT4gaW50byBidWZmZXIgYXQgPHRidWY+LgorICoKKyAqIENhbGxpbmcgY29udmVudGlvbnM6IGNoYXIgdGJ1ZltUQlVGU1orXSwgdGVybT1jYW5vbmljYWwgbmFtZSBmb3IgdGVybWluYWwuCisgKgorICogUmV0dXJuZWQgdmFsdWVzOiAxID0gc3VjY2VzcywgLTEgPSBjYW4ndCBvcGVuIGZpbGUsCisgKgkgICAgMCA9IGNhbid0IGZpbmQgdGVybWluYWwuCisgKgorICogTm90ZXM6CisgKiAtIFNob3VsZCBwcm9iYWJseSBzdXBwbHkgc3RhdGljIGJ1ZmZlci4KKyAqIC0gVXNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgIlRFUk0iIGFuZCAiVEVSTUNBUCIuIElmIFRFUk0gPSB0ZXJtICh0aGF0IGlzLAorICogICBpZiB0aGUgYXJndW1lbnQgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQpIHRoZW4gaXQgbG9va3MgYXQgVEVSTUNBUC4KKyAqIC0gSWYgVEVSTUNBUCBiZWdpbnMgd2l0aCBhIHNsYXNoLCB0aGVuIGl0IGFzc3VtZXMgdGhpcyBpcyB0aGUgZmlsZSB0bworICogICBzZWFyY2ggcmF0aGVyIHRoYW4gL2V0Yy90ZXJtY2FwLgorICogLSBJZiBURVJNQ0FQIGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCwgYW5kIGl0IG1hdGNoZXMgVEVSTSwgdGhlbiB0aGlzIGlzCisgKiAgIHVzZWQgYXMgdGhlIGVudHJ5LgorICogLSBUaGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgY29uc2lkZXJhYmx5IGZvciBub24tVU5JWCBzeXN0ZW1zLgorICovCisKKyNpZm5kZWYgVEVSTUNBUEZJTEUKKyMgaWZkZWYgQU1JR0EKKyMgIGRlZmluZSBURVJNQ0FQRklMRSAiczp0ZXJtY2FwIgorIyBlbHNlCisjICBpZmRlZiBWTVMKKyMgICBkZWZpbmUgVEVSTUNBUEZJTEUgIlZJTVJVTlRJTUU6dGVybWNhcCIKKyMgIGVsc2UKKyMgICBkZWZpbmUgVEVSTUNBUEZJTEUgIi9ldGMvdGVybWNhcCIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworICAgIGludAordGdldGVudCh0YnVmLCB0ZXJtKQorICAgIGNoYXIgICAgKnRidWY7CQkvKiBCdWZmZXIgdG8gaG9sZCB0ZXJtY2FwIGVudHJ5LCBUQlVGU1ogYnl0ZXMgbWF4ICovCisgICAgY2hhciAgICAqdGVybTsJCS8qIE5hbWUgb2YgdGVybWluYWwgKi8KK3sKKyAgICBjaGFyICAgIHRjYnVmWzMyXTsJCS8qIFRlbXAgYnVmZmVyIHRvIGhhbmRsZSAqLworICAgIGNoYXIgICAgKnRjcHRyID0gdGNidWY7CS8qIGV4dGVuZGVkIGVudHJpZXMgKi8KKyAgICBjaGFyICAgICp0Y2FwID0gVEVSTUNBUEZJTEU7IC8qIERlZmF1bHQgdGVybWNhcCBmaWxlICovCisgICAgY2hhciAgICAqdG1wOworICAgIEZJTEUgICAgKnRlcm1jYXA7CisgICAgaW50CSAgICByZXR2YWwgPSAwOworICAgIGludAkgICAgbGVuOworCisgICAgaWYgKCh0bXAgPSAoY2hhciAqKW1jaF9nZXRlbnYoKGNoYXJfdSAqKSJURVJNQ0FQIikpICE9IE5VTEwpCisgICAgeworCWlmICgqdG1wID09ICcvJykJCS8qIFRFUk1DQVAgPSBuYW1lIG9mIHRlcm1jYXAgZmlsZSAqLworCXsKKwkgICAgdGNhcCA9IHRtcCA7CisjaWYgZGVmaW5lZChBTUlHQSkKKwkgICAgLyogQ29udmVydCAvdXNyL3NoYXJlL2xpYi90ZXJtY2FwIHRvIHVzcjpzaGFyZS9saWIvdGVybWNhcCAqLworCSAgICB0Y2FwKys7CisJICAgIHRtcCA9IHN0cmNocih0Y2FwLCAnLycpOworCSAgICBpZiAodG1wKQorCQkqdG1wID0gJzonOworI2VuZGlmCisJfQorCWVsc2UJCQkJLyogVEVSTUNBUCA9IHRlcm1jYXAgZW50cnkgaXRzZWxmICovCisJeworCSAgICBpbnQgdGxlbiA9IHN0cmxlbih0ZXJtKTsKKworCSAgICB3aGlsZSAoKnRtcCAmJiAqdG1wICE9ICc6JykJCS8qIENoZWNrIGlmIFRFUk0gbWF0Y2hlcyAqLworCSAgICB7CisJCWNoYXIgKm5leHR0bXA7CisKKwkJd2hpbGUgKCp0bXAgPT0gJ3wnKQorCQkgICAgdG1wKys7CisJCW5leHR0bXAgID0gX2ZpbmQodG1wLCAiOnwiKTsJLyogUmhpYWx0byAqLworCQlpZiAodG1wK3RsZW4gPT0gbmV4dHRtcCAmJiBfbWF0Y2godG1wLCB0ZXJtKSA9PSB0bGVuKQorCQl7CisJCSAgICBzdHJjcHkodGJ1ZiwgdG1wKTsKKwkJICAgIHRlbnQgPSB0YnVmOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQkgICAgdG1wID0gbmV4dHRtcDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKCEodGVybWNhcCA9IG1jaF9mb3Blbih0Y2FwLCAiciIpKSkKKyAgICB7CisJc3RyY3B5KHRidWYsIHRjYXApOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBsZW4gPSAwOworICAgIHdoaWxlIChnZXRlbnQodGJ1ZiArIGxlbiwgdGVybSwgdGVybWNhcCwgVEJVRlNaIC0gbGVuKSkKKyAgICB7CisJdGNwdHIgPSB0Y2J1ZjsJCQkJLyogUmhpYWx0byAqLworCWlmICgodGVybSA9IHRnZXRzdHIoInRjIiwgJnRjcHRyKSkpCS8qIGV4dGVuZGVkIGVudHJ5ICovCisJeworCSAgICByZXdpbmQodGVybWNhcCk7CisJICAgIGxlbiA9IHN0cmxlbih0YnVmKTsKKwl9CisJZWxzZQorCXsKKwkgICAgcmV0dmFsID0gMTsKKwkgICAgdGVudCA9IHRidWY7CS8qIHJlc2V0IGl0IGJhY2sgdG8gdGhlIGJlZ2lubmluZyAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGZjbG9zZSh0ZXJtY2FwKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisgICAgc3RhdGljIGludAorZ2V0ZW50KHRidWYsIHRlcm0sIHRlcm1jYXAsIGJ1ZmxlbikKKyAgICBjaGFyICAgICp0YnVmLCAqdGVybTsKKyAgICBGSUxFICAgICp0ZXJtY2FwOworICAgIGludAkgICAgYnVmbGVuOworeworICAgIGNoYXIgICAgKnRwdHI7CisgICAgaW50CSAgICB0bGVuID0gc3RybGVuKHRlcm0pOworCisgICAgd2hpbGUgKG5leHRlbnQodGJ1ZiwgdGVybWNhcCwgYnVmbGVuKSkJLyogRm9yIGVhY2ggcG9zc2libGUgZW50cnkgKi8KKyAgICB7CisJdHB0ciA9IHRidWY7CisJd2hpbGUgKCp0cHRyICYmICp0cHRyICE9ICc6JykJCS8qIDogdGVybWluYXRlcyBuYW1lIGZpZWxkICovCisJeworCSAgICBjaGFyICAgICpuZXh0dHB0cjsKKworCSAgICB3aGlsZSAoKnRwdHIgPT0gJ3wnKQkJLyogfCBzZXBlcmF0ZXMgbmFtZXMgKi8KKwkJdHB0cisrOworCSAgICBuZXh0dHB0ciA9IF9maW5kKHRwdHIsICI6fCIpOwkvKiBSaGlhbHRvICovCisJICAgIGlmICh0cHRyICsgdGxlbiA9PSBuZXh0dHB0ciAmJgorCQlfbWF0Y2godHB0ciwgdGVybSkgPT0gdGxlbikJLyogRk9VTkQhICovCisJICAgIHsKKwkJdGVudCA9IHRidWY7CisJCXJldHVybiAxOworCSAgICB9CisJICAgIGVsc2UJCQkJLyogTG9vayBmb3IgbmV4dCBuYW1lICovCisJCXRwdHIgPSBuZXh0dHB0cjsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisgICAgc3RhdGljIGludAorbmV4dGVudCh0YnVmLCB0ZXJtY2FwLCBidWZsZW4pCQkvKiBSZWFkIDEgZW50cnkgZnJvbSBURVJNQ0FQIGZpbGUgKi8KKyAgICBjaGFyICAgICp0YnVmOworICAgIEZJTEUgICAgKnRlcm1jYXA7CisgICAgaW50CSAgICBidWZsZW47Cit7CisgICAgY2hhciAqbGJ1ZiA9IHRidWY7CQkJCS8qIGxidWY9bGluZSBidWZmZXIgKi8KKwkJCQkvKiByZWFkIGxpbmVzIHN0cmFpZ2h0IGludG8gYnVmZmVyICovCisKKyAgICB3aGlsZSAobGJ1ZiA8IHRidWYrYnVmbGVuICYmCQkvKiBUaGVyZSdzIHJvb20gYW5kICovCisJICBmZ2V0cyhsYnVmLCAoaW50KSh0YnVmK2J1Zmxlbi1sYnVmKSwgdGVybWNhcCkpIC8qIGFub3RoZXIgbGluZSAqLworICAgIHsKKwlpbnQgbGxlbiA9IHN0cmxlbihsYnVmKTsKKworCWlmICgqbGJ1ZiA9PSAnIycpCQkJLyogZWF0IGNvbW1lbnRzICovCisJICAgIGNvbnRpbnVlOworCWlmIChsYnVmWy0xXSA9PSAnOicgJiYJCQkvKiBhbmQgd2hpdGVzcGFjZSAqLworCSAgICBsYnVmWzBdID09ICdcdCcgJiYKKwkgICAgbGJ1ZlsxXSA9PSAnOicpCisJeworCSAgICBzdHJjcHkobGJ1ZiwgbGJ1ZisyKTsKKwkgICAgbGxlbiAtPSAyOworCX0KKwlpZiAobGJ1ZltsbGVuLTJdID09ICdcXCcpCQkvKiBhbmQgY29udGludWF0aW9ucyAqLworCSAgICBsYnVmICs9IGxsZW4tMjsKKwllbHNlCisJeworCSAgICBsYnVmW2xsZW4tMV09MDsJCQkvKiBubyBjb250aW51YXRpb24sIHJldHVybiAqLworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7CQkJCQkvKiByYW4gaW50byBlbmQgb2YgZmlsZSAqLworfQorCisvKgorICogTW9kdWxlOiB0Z2V0ZmxhZworICoKKyAqIFB1cnBvc2U6IHJldHVybnMgZmxhZyB0cnVlIG9yIGZhbHNlIGFzIHRvIHRoZSBleGlzdGVuY2Ugb2YgYSBnaXZlbiBlbnRyeS4KKyAqIHVzZWQgd2l0aCAnYnMnLCAnYW0nLCBldGMuLi4KKyAqCisgKiBDYWxsaW5nIGNvbnZlbnRpb25zOiBpZCBpcyB0aGUgMiBjaGFyYWN0ZXIgY2FwYWJpbGl0eSBpZC4KKyAqCisgKiBSZXR1cm5lZCB2YWx1ZXM6IDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuCisgKi8KKworICAgIGludAordGdldGZsYWcoaWQpCisgICAgY2hhciAqaWQ7Cit7CisgICAgY2hhciAgICBidWZbMjU2XSwgKnB0ciA9IGJ1ZjsKKworICAgIHJldHVybiB0Z2V0c3RyKGlkLCAmcHRyKSA/IDEgOiAwOworfQorCisvKgorICogTW9kdWxlOiB0Z2V0bnVtCisgKgorICogUHVycG9zZTogZ2V0IG51bWVyaWMgdmFsdWUgc3VjaCBhcyAnbGknIG9yICdjbycgZnJvbSB0ZXJtY2FwLgorICoKKyAqIENhbGxpbmcgY29udmVudGlvbnM6IGlkID0gMiBjaGFyYWN0ZXIgaWQuCisgKgorICogUmV0dXJuZWQgdmFsdWVzOiAtMSBmb3IgZmFpbHVyZSwgZWxzZSBudW1lcmljYWwgdmFsdWUuCisgKi8KKworICAgIGludAordGdldG51bShpZCkKKyAgICBjaGFyICppZDsKK3sKKyAgICBjaGFyICpwdHIsIGJ1ZlsyNTZdOworICAgIHB0ciA9IGJ1ZjsKKworICAgIGlmICh0Z2V0c3RyKGlkLCAmcHRyKSkKKwlyZXR1cm4gYXRvaShidWYpOworICAgIGVsc2UKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1vZHVsZTogdGdldHN0cgorICoKKyAqIFB1cnBvc2U6IGdldCB0ZXJtaW5hbCBjYXBhYmlsaXR5IHN0cmluZyBmcm9tIGRhdGFiYXNlLgorICoKKyAqIENhbGxpbmcgY29udmVudGlvbnM6IGlkIGlzIHRoZSB0d28gY2hhcmFjdGVyIGNhcGFiaWxpdHkgaWQuCisgKgkgICAgKCpidWYpIHBvaW50cyBpbnRvIGEgaG9sZCBidWZmZXIgZm9yIHRoZQorICoJICAgIGlkLiB0aGUgY2FwYWJpbGl0eSBpcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyCisgKgkgICAgYW5kICgqYnVmKSBpcyBhZHZhbmNlZCB0byBwb2ludCB0byB0aGUgbmV4dAorICoJICAgIGZyZWUgYnl0ZSBpbiB0aGUgYnVmZmVyLgorICoKKyAqIFJldHVybmVkIHZhbHVlczogMCA9IG5vIHN1Y2ggZW50cnksIG90aGVyd2lzZSByZXR1cm5zIG9yaWdpbmFsCisgKgkgICAgKCpidWYpIChub3cgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcpLgorICoKKyAqIE5vdGVzCisgKglJdCBhbHNvIGRlY29kZXMgY2VydGFpbiBlc2NhcGUgc2VxdWVuY2VzIGluIHRoZSBidWZmZXIuCisgKiAgdGhleSBzaG91bGQgYmUgb2J2aW91cyBmcm9tIHRoZSBjb2RlOgorICoJXEUgPSBlc2NhcGUuCisgKglcbiwgXHIsIFx0LCBcZiwgXGIgbWF0Y2ggdGhlICdjJyBlc2NhcGVzLgorICoJXnggbWF0Y2hlcyBjb250cm9sLXggKF5ALi4uXl8pLgorICoJXG5ubiBtYXRjaGVzIG5ubiBvY3RhbC4KKyAqCVx4LCB3aGVyZSB4IGlzIGFueXRoaW5nIGVsc2UsIG1hdGNoZXMgeC4gSSBkaWZmZXIKKyAqICBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGhlcmUsIGluIHRoYXQgSSBhbGxvdyBeOiB0byBtYXRjaAorICogIDouCisgKgorICovCisKKyAgICBjaGFyICoKK3RnZXRzdHIoaWQsIGJ1ZikKKyAgICBjaGFyCSppZCwgKipidWY7Cit7CisgICAgaW50CQlsZW4gPSBzdHJsZW4oaWQpOworICAgIGNoYXIJKnRtcD10ZW50OworICAgIGNoYXIJKmhvbGQ7CisgICAgaW50CQlpOworCisgICAgZG8geworCXRtcCA9IF9maW5kKHRtcCwgIjoiKTsJCQkvKiBGb3IgZWFjaCBmaWVsZCAqLworCXdoaWxlICgqdG1wID09ICc6JykJCQkvKiBza2lwIGVtcHR5IGZpZWxkcyAqLworCSAgICB0bXArKzsKKwlpZiAoISp0bXApCisJICAgIGJyZWFrOworCisJaWYgKF9tYXRjaChpZCwgdG1wKSA9PSBsZW4pIHsKKwkgICAgdG1wICs9IGxlbjsJCQkJLyogZmluZCAnPScgJ0AnIG9yICcjJyAqLworCSAgICBpZiAoKnRtcCA9PSAnQCcpCQkJLyogOnh4QDogZW50cnkgZm9yIHRjICovCisJCXJldHVybiAwOwkJCS8qIGRlbGV0ZWQgZW50cnkgKi8KKwkgICAgaG9sZD0gKmJ1ZjsKKwkgICAgd2hpbGUgKCorK3RtcCAmJiAqdG1wICE9ICc6JykgewkvKiBub3QgYXQgZW5kIG9mIGZpZWxkICovCisJCXN3aXRjaCgqdG1wKSB7CisJCWNhc2UgJ1xcJzoJCQkvKiBFeHBhbmQgZXNjYXBlcyBoZXJlICovCisJCSAgICBzd2l0Y2goKisrdG1wKSB7CisJCSAgICBjYXNlIDA6CQkJLyogaWdub3JlIGJhY2tzbGFzaGVzICovCisJCQl0bXAtLTsJCQkvKiBhdCBlbmQgb2YgZW50cnkgKi8KKwkJCWJyZWFrOwkJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJICAgIGNhc2UgJ2UnOgorCQkgICAgY2FzZSAnRSc6CQkJLyogRVNDICovCisJCQkqKCpidWYpKysgPSBFU0M7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ24nOgkJCS8qIFxuICovCisJCQkqKCpidWYpKysgPSAnXG4nOworCQkJYnJlYWs7CisJCSAgICBjYXNlICdyJzoJCQkvKiBcciAqLworCQkJKigqYnVmKSsrID0gJ1xyJzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAndCc6CQkJLyogXHQgKi8KKwkJCSooKmJ1ZikrKyA9ICdcdCc7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ2InOgkJCS8qIFxiICovCisJCQkqKCpidWYpKysgPSAnXGInOworCQkJYnJlYWs7CisJCSAgICBjYXNlICdmJzoJCQkvKiBcZiAqLworCQkJKigqYnVmKSsrID0gJ1xmJzsKKwkJCWJyZWFrOworCQkgICAgY2FzZSAnMCc6CQkJLyogXG5ubiAqLworCQkgICAgY2FzZSAnMSc6CisJCSAgICBjYXNlICcyJzoKKwkJICAgIGNhc2UgJzMnOgorCQkgICAgY2FzZSAnNCc6CisJCSAgICBjYXNlICc1JzoKKwkJICAgIGNhc2UgJzYnOgorCQkgICAgY2FzZSAnNyc6CisJCSAgICBjYXNlICc4JzoKKwkJICAgIGNhc2UgJzknOgorCQkJKipidWYgPSAwOworCQkJICAgIC8qIGdldCB1cCB0byB0aHJlZSBkaWdpdHMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAzICYmIFZJTV9JU0RJR0lUKCp0bXApOyArK2kpCisJCQkgICAgKipidWYgPSAqKmJ1ZiAqIDggKyAqdG1wKysgLSAnMCc7CisJCQkoKmJ1ZikrKzsKKwkJCXRtcC0tOworCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OgkJCS8qIFx4LCBmb3IgYWxsIG90aGVyIHggKi8KKwkJCSooKmJ1ZikrKz0gKnRtcDsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlICdeJzoJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwkJICAgICsrdG1wOworCQkgICAgKigqYnVmKSsrID0gQ3RybF9jaHIoKnRtcCk7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgICooKmJ1ZikrKyA9ICp0bXA7CisJCX0KKwkgICAgfQorCSAgICAqKCpidWYpKysgPSAwOworCSAgICByZXR1cm4gaG9sZDsKKwl9CisgICAgfSB3aGlsZSAoKnRtcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIE1vZHVsZTogdGdvdG8KKyAqCisgKiBQdXJwb3NlOiBkZWNvZGUgY20gY3Vyc29yIG1vdGlvbiBzdHJpbmcuCisgKgorICogQ2FsbGluZyBjb252ZW50aW9uczogY20gaXMgY3Vyc29yIG1vdGlvbiBzdHJpbmcuICBsaW5lLCBjb2wsIGFyZSB0aGUKKyAqIGRlc2lyZWQgZGVzdGluYXRpb24uCisgKgorICogUmV0dXJuZWQgdmFsdWVzOiBhIHN0cmluZyBwb2ludGluZyB0byB0aGUgZGVjb2RlZCBzdHJpbmcsIG9yICJPT1BTIiBpZiBpdAorICogY2Fubm90IGJlIGRlY29kZWQuCisgKgorICogTm90ZXMKKyAqCVRoZSBhY2NlcHRlZCBlc2NhcGVzIGFyZToKKyAqCSVkCSBhcyBpbiBwcmludGYsIDAgb3JpZ2luLgorICoJJTIsICUzICAgbGlrZSAlMDJkLCAlMDNkIGluIHByaW50Zi4KKyAqCSUuCSBsaWtlICVjCisgKgklK3gJIGFkZHMgPHg+IHRvIHZhbHVlLCB0aGVuICUuCisgKgklPnh5ICAgICBpZiB2YWx1ZT54LCBhZGRzIHkuIE5vIG91dHB1dC4KKyAqCSVpCSBpbmNyZW1lbnRzIGxpbmUmIGNvbCwgbm8gb3V0cHV0LgorICoJJXIJIHJldmVyc2VzIG9yZGVyIG9mIGxpbmUmY29sLiBObyBvdXRwdXQuCisgKgklJQkgcHJpbnRzIGFzIGEgc2luZ2xlICUuCisgKgklbgkgZXhjbHVzaXZlIG9yIHJvdyAmIGNvbCB3aXRoIDAxNDAuCisgKgklQgkgQkNELCBubyBvdXRwdXQuCisgKgklRAkgcmV2ZXJzZSBjb2RpbmcgKHgtMiooeCUxNikpLCBubyBvdXRwdXQuCisgKi8KKworICAgIGNoYXIgKgordGdvdG8oY20sIGNvbCwgbGluZSkKKyAgICBjaGFyCSpjbTsJCQkJLyogY20gc3RyaW5nLCBmcm9tIHRlcm1jYXAgKi8KKyAgICBpbnQgY29sLAkJCQkJLyogY29sdW1uLCB4IHBvc2l0aW9uICovCisgICAgbGluZTsJCQkJCS8qIGxpbmUsIHkgcG9zaXRpb24gKi8KK3sKKyAgICBjaGFyICAgIGd4LCBneSwJCQkJLyogeCwgeSAqLworCSpwdHIsCQkJCQkvKiBwb2ludGVyIGluICdjbScgKi8KKwlyZXZlcnNlID0gMCwJCQkJLyogcmV2ZXJzZSBmbGFnICovCisJKmJ1ZnAsCQkJCQkvKiBwb2ludGVyIGluIHJldHVybmVkIHN0cmluZyAqLworCWFkZHVwID0gMCwJCQkJLyogYWRkIHVwbGluZSAqLworCWFkZGJhayA9IDAsCQkJCS8qIGFkZCBiYWNrdXAgKi8KKwljOworICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07CisKKyAgICBpZiAoIWNtKQorCXJldHVybiAiT09QUyI7CQkJCS8qIEtsdWRnZSwgYnV0IHN0YW5kYXJkICovCisKKyAgICBidWZwID0gYnVmZmVyOworICAgIHB0ciA9IGNtOworCisgICAgd2hpbGUgKCpwdHIpIHsKKwlpZiAoKGMgPSAqcHRyKyspICE9ICclJykgewkJLyogbm9ybWFsIGNoYXIgKi8KKwkgICAgKmJ1ZnArKyA9IGM7CisJfSBlbHNlIHsJCQkJLyogJSBlc2NhcGUgKi8KKwkgICAgc3dpdGNoKGMgPSAqcHRyKyspIHsKKwkgICAgY2FzZSAnZCc6CQkJCS8qIGRlY2ltYWwgKi8KKwkJYnVmcCA9IF9hZGRmbXQoYnVmcCwgIiVkIiwgbGluZSk7CisJCWxpbmUgPSBjb2w7CisJCWJyZWFrOworCSAgICBjYXNlICcyJzoJCQkJLyogMiBkaWdpdCBkZWNpbWFsICovCisJCWJ1ZnAgPSBfYWRkZm10KGJ1ZnAsICIlMDJkIiwgbGluZSk7CisJCWxpbmUgPSBjb2w7CisJCWJyZWFrOworCSAgICBjYXNlICczJzoJCQkJLyogMyBkaWdpdCBkZWNpbWFsICovCisJCWJ1ZnAgPSBfYWRkZm10KGJ1ZnAsICIlMDNkIiwgbGluZSk7CisJCWxpbmUgPSBjb2w7CisJCWJyZWFrOworCSAgICBjYXNlICc+JzoJCQkJLyogJT54eTogaWYgPngsIGFkZCB5ICovCisJCWd4ID0gKnB0cisrOworCQlneSA9ICpwdHIrKzsKKwkJaWYgKGNvbD5neCkgY29sICs9IGd5OworCQlpZiAobGluZT5neCkgbGluZSArPSBneTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJysnOgkJCQkvKiAlK2M6IGFkZCBjICovCisJCWxpbmUgKz0gKnB0cisrOworCSAgICBjYXNlICcuJzoJCQkJLyogcHJpbnQgeC95ICovCisJCWlmIChsaW5lID09ICdcdCcgfHwJCS8qIHRoZXNlIGFyZSAqLworCQkgICBsaW5lID09ICdcbicgfHwJCS8qIGNoYXJzIHRoYXQgKi8KKwkJICAgbGluZSA9PSAnXDAwNCcgfHwJCS8qIFVOSVggaGF0ZXMgKi8KKwkJICAgbGluZSA9PSAnXDAnKSB7CisJCSAgICBsaW5lKys7CQkJLyogc28gZ28gdG8gbmV4dCBwb3MgKi8KKwkJICAgIGlmIChyZXZlcnNlID09IChsaW5lID09IGNvbCkpCisJCQlhZGR1cD0xOwkJLyogYW5kIG1hcmsgVVAgKi8KKwkJICAgIGVsc2UKKwkJCWFkZGJhaz0xOwkJLyogb3IgQkMgKi8KKwkJfQorCQkqYnVmcCsrPWxpbmU7CisJCWxpbmUgPSBjb2w7CisJCWJyZWFrOworCSAgICBjYXNlICdyJzoJCQkJLyogcjogcmV2ZXJzZSAqLworCQlneCA9IGxpbmU7CisJCWxpbmUgPSBjb2w7CisJCWNvbCA9IGd4OworCQlyZXZlcnNlID0gMTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJ2knOgkJCS8qIGluY3JlbWVudCAoMS1vcmlnaW4gc2NyZWVuKSAqLworCQljb2wrKzsKKwkJbGluZSsrOworCQlicmVhazsKKwkgICAgY2FzZSAnJSc6CQkJCS8qICUlPSUgbGl0ZXJhbGx5ICovCisJCSpidWZwKys9JyUnOworCQlicmVhazsKKwkgICAgY2FzZSAnbic6CQkJCS8qIG1hZ2ljIERNMjUwMCBjb2RlICovCisJCWxpbmUgXj0gMDE0MDsKKwkJY29sIF49IDAxNDA7CisJCWJyZWFrOworCSAgICBjYXNlICdCJzoJCQkJLyogYmNkIGVuY29kaW5nICovCisJCWxpbmUgPSBsaW5lLzEwPDw0K2xpbmUlMTA7CisJCWNvbCA9IGNvbC8xMDw8NCtjb2wlMTA7CisJCWJyZWFrOworCSAgICBjYXNlICdEJzoJCQkJLyogbWFnaWMgRGVsdGEgRGF0YSBjb2RlICovCisJCWxpbmUgPSBsaW5lLTIqKGxpbmUmMTUpOworCQljb2wgPSBjb2wtMiooY29sJjE1KTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CQkJCS8qIFVua25vd24gZXNjYXBlICovCisJCXJldHVybiAiT09QUyI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGFkZHVwKQkJCQkJLyogYWRkIHVwbGluZSAqLworCWlmIChVUCkgeworCSAgICBwdHI9VVA7CisJICAgIHdoaWxlIChWSU1fSVNESUdJVCgqcHRyKSB8fCAqcHRyID09ICcuJykKKwkJcHRyKys7CisJICAgIGlmICgqcHRyID09ICcqJykKKwkJcHRyKys7CisJICAgIHdoaWxlICgqcHRyKQorCQkqYnVmcCsrID0gKnB0cisrOworCX0KKworICAgIGlmIChhZGRiYWspCQkJCQkvKiBhZGQgYmFja3NwYWNlICovCisJaWYgKEJDKSB7CisJICAgIHB0cj1CQzsKKwkgICAgd2hpbGUgKFZJTV9JU0RJR0lUKCpwdHIpIHx8ICpwdHIgPT0gJy4nKQorCQlwdHIrKzsKKwkgICAgaWYgKCpwdHIgPT0gJyonKQorCQlwdHIrKzsKKwkgICAgd2hpbGUgKCpwdHIpCisJCSpidWZwKysgPSAqcHRyKys7CisJfQorCWVsc2UKKwkgICAgKmJ1ZnArKz0nXGInOworCisgICAgKmJ1ZnAgPSAwOworCisgICAgcmV0dXJuKGJ1ZmZlcik7Cit9CisKKy8qCisgKiBNb2R1bGU6IHRwdXRzCisgKgorICogUHVycG9zZTogZGVjb2RlIHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsaW5nIGNvbnZlbnRpb25zOiBjcCA9IHN0cmluZyB0byBiZSBwYWRkZWQsIGFmZmNudCA9ICMgb2YgaXRlbXMgYWZmZWN0ZWQKKyAqCShsaW5lcywgY2hhcmFjdGVycywgd2hhdGV2ZXIpLCBvdXRjID0gcm91dGluZSB0byBvdXRwdXQgMSBjaGFyYWN0ZXIuCisgKgorICogUmV0dXJuZWQgdmFsdWVzOiBub25lCisgKgorICogTm90ZXMKKyAqCWNwIGhhcyBwYWRkaW5nIGluZm9ybWF0aW9uIGFoZWFkIG9mIGl0LCBpbiB0aGUgZm9ybQorICogIG5ublRFWFQgb3Igbm5uKlRFWFQuIG5ubiBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSwKKyAqICBhbmQgbWF5IGJlIGEgZGVjaW1hbCAobm5uLm1tbSkuIElmIHRoZSBhc3RlcmlzayBpcyBnaXZlbiwgdGhlbgorICogIHRoZSBkZWxheSBpcyBtdWx0aXBsaWVkIGJ5IGFmY250LiBUaGUgZGVsYXkgaXMgcHJvZHVjZWQgYnkgb3V0cHV0dGluZworICogIGEgbnVtYmVyIG9mIG51bGxzIChvciBvdGhlciBwYWRkaW5nIGNoYXIpIGFmdGVyIHByaW50aW5nIHRoZQorICogIFRFWFQuCisgKgorICovCisKK2xvbmcgX2JhdWRzWzE2XT17CisgICAgMCwJNTAsIDc1LAkxMTAsCisgICAgMTM0LCAgICAxNTAsICAgIDIwMCwgICAgMzAwLAorICAgIDYwMCwgICAgMTIwMCwgICAxODAwLCAgIDI0MDAsCisgICAgNDgwMCwgICA5NjAwLCAgIDE5MjAwLCAgMTkyMDAgfTsKKworICAgIGludAordHB1dHMoY3AsIGFmZmNudCwgb3V0YykKKyAgICBjaGFyICpjcDsJCQkJLyogc3RyaW5nIHRvIHByaW50ICovCisgICAgaW50IGFmZmNudDsJCQkJLyogTnVtYmVyIG9mIGxpbmVzIGFmZmVjdGVkICovCisgICAgdm9pZCAoKm91dGMpIF9fQVJHUygodW5zaWduZWQgaW50KSk7Lyogcm91dGluZSB0byBvdXRwdXQgMSBjaGFyYWN0ZXIgKi8KK3sKKyAgICBsb25nICAgIGZyYWMsCQkJLyogMTBeKCNkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCkgKi8KKwljb3VudGVyLAkJCS8qIGRpZ2l0cyAqLworCWF0b2wgX19BUkdTKChjb25zdCBjaGFyICopKTsKKworICAgIGlmIChWSU1fSVNESUdJVCgqY3ApKSB7CisJY291bnRlciA9IDA7CisJZnJhYyA9IDEwMDA7CisJd2hpbGUgKFZJTV9JU0RJR0lUKCpjcCkpCisJICAgIGNvdW50ZXIgPSBjb3VudGVyICogMTBMICsgKGxvbmcpKCpjcCsrIC0gJzAnKTsKKwlpZiAoKmNwID09ICcuJykKKwkgICAgd2hpbGUgKFZJTV9JU0RJR0lUKCorK2NwKSkgeworCQljb3VudGVyID0gY291bnRlciAqIDEwTCArIChsb25nKSgqY3ArKyAtICcwJyk7CisJCWZyYWMgPSBmcmFjICogMTA7CisJICAgIH0KKwlpZiAoKmNwIT0nKicpIHsJCQkvKiBtdWx0aXBseSBieSBhZmZlY3RlZCBsaW5lcyAqLworCSAgICBpZiAoYWZmY250PjEpIGFmZmNudCA9IDE7CisJfQorCWVsc2UKKwkgICAgY3ArKzsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgcGFkZGluZyBjb3VudGVyL2ZyYWMgbXMgZGVsYXkgKi8KKwlpZiAob3NwZWVkKQorCSAgICBjb3VudGVyID0gKGNvdW50ZXIgKiBfYmF1ZHNbb3NwZWVkXSAqIChsb25nKWFmZmNudCkgLyBmcmFjOworCisJd2hpbGUgKCpjcCkJCQkvKiBvdXRwdXQgc3RyaW5nICovCisJICAgICgqb3V0YykoKmNwKyspOworCWlmIChvc3BlZWQpCisJICAgIHdoaWxlIChjb3VudGVyLS0pCQkvKiBmb2xsb3dlZCBieSBwYWQgY2hhcmFjdGVycyAqLworCQkoKm91dGMpKFBDKTsKKyAgICB9CisgICAgZWxzZQorCXdoaWxlICgqY3ApCisJICAgICgqb3V0YykoKmNwKyspOworICAgIHJldHVybiAwOworfQorCisvKgorICogTW9kdWxlOiB0dXRpbC5jCisgKgorICogUHVycG9zZTogVXRpbGl0eSByb3V0aW5lcyBmb3IgVEVSTUxJQiBmdW5jdGlvbnMuCisgKgorICovCisgICAgc3RhdGljIGludAorX21hdGNoKHMxLCBzMikJCS8qIHJldHVybnMgbGVuZ3RoIG9mIHRleHQgY29tbW9uIHRvIHMxIGFuZCBzMiAqLworICAgIGNoYXIgKnMxLCAqczI7Cit7CisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKHMxW2ldICYmIHMxW2ldID09IHMyW2ldKQorCWkrKzsKKworICAgIHJldHVybiBpOworfQorCisvKgorICogZmluZHMgbmV4dCBjIGluIHMgdGhhdCdzIGEgbWVtYmVyIG9mIHNldCwgcmV0dXJucyBwb2ludGVyCisgKi8KKyAgICBzdGF0aWMgY2hhciAqCitfZmluZChzLCBzZXQpCisgICAgY2hhciAqcywgKnNldDsKK3sKKyAgICBmb3IoOyAqczsgcysrKQorICAgIHsKKwljaGFyCSpwdHIgPSBzZXQ7CisKKwl3aGlsZSAoKnB0ciAmJiAqcyAhPSAqcHRyKQorCSAgICBwdHIrKzsKKworCWlmICgqcHRyKQorCSAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICByZXR1cm4gczsKK30KKworLyoKKyAqIGFkZCB2YWwgdG8gYnVmIGFjY29yZGluZyB0byBmb3JtYXQgZm10CisgKi8KKyAgICBzdGF0aWMgY2hhciAqCitfYWRkZm10KGJ1ZiwgZm10LCB2YWwpCisgICAgY2hhciAqYnVmLCAqZm10OworICAgIGludCB2YWw7Cit7CisgICAgc3ByaW50ZihidWYsIGZtdCwgdmFsKTsKKyAgICB3aGlsZSAoKmJ1ZikKKwlidWYrKzsKKyAgICByZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvTWFrZV9hbWlnYS5tYWsgYi9zcmMvdGVzdGRpci9NYWtlX2FtaWdhLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTcwYjcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvTWFrZV9hbWlnYS5tYWsKQEAgLTAsMCArMSw5NyBAQAorIworIyBNYWtlZmlsZSB0byBydW4gYWwgdGVzdHMgZm9yIFZpbSwgb24gQW1pZ2EKKyMKKyMgUmVxdWlyZXMgInJtIiwgImNzaCIgYW5kICJkaWZmIiEKKworVklNUFJPRyA9IC92aW0KKworIyBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrICh5ZXQpOgorIyB0ZXN0MgkJIlxcdG1wIiBkb2Vzbid0IHdvcmsKKyMgdGVzdDEwCSdlcnJvcmZvcm1hdCcgaXMgZGlmZmVyZW50CisjIHRlc3QxMQkiY2F0IiBkb2Vzbid0IHdvcmsgcHJvcGVybHkKKyMgdGVzdDEyCWNhbid0IHVubGluayBhIHN3YXAgZmlsZQorIyB0ZXN0MjUJdXNlcyBzeW1ib2xpYyBsaW5rCisjIHRlc3QyNwljYW4ndCBlZGl0IGZpbGUgd2l0aCAiKiIKKyMgdGVzdDUyCW9ubHkgZm9yIFdpbjMyCisKK1NDUklQVFMgPSB0ZXN0MS5vdXQgdGVzdDMub3V0IHRlc3Q0Lm91dCB0ZXN0NS5vdXQgdGVzdDYub3V0IFwKKwkJdGVzdDcub3V0IHRlc3Q4Lm91dCB0ZXN0OS5vdXQgXAorCQl0ZXN0MTMub3V0IHRlc3QxNC5vdXQgdGVzdDE1Lm91dCB0ZXN0MTcub3V0IFwKKwkJdGVzdDE4Lm91dCB0ZXN0MTkub3V0IHRlc3QyMC5vdXQgdGVzdDIxLm91dCB0ZXN0MjIub3V0IFwKKwkJdGVzdDIzLm91dCB0ZXN0MjQub3V0IHRlc3QyNi5vdXQgXAorCQl0ZXN0Mjgub3V0IHRlc3QyOS5vdXQgdGVzdDMwLm91dCB0ZXN0MzEub3V0IHRlc3QzMi5vdXQgXAorCQl0ZXN0MzMub3V0IHRlc3QzNC5vdXQgdGVzdDM1Lm91dCB0ZXN0MzYub3V0IHRlc3QzNy5vdXQgXAorCQl0ZXN0Mzgub3V0IHRlc3QzOS5vdXQgdGVzdDQwLm91dCB0ZXN0NDEub3V0IHRlc3Q0Mi5vdXQgXAorCQl0ZXN0NDMub3V0IHRlc3Q0NC5vdXQgdGVzdDQ1Lm91dCB0ZXN0NDYub3V0IHRlc3Q0Ny5vdXQgXAorCQl0ZXN0NDgub3V0IHRlc3Q1MS5vdXQKKworLlNVRkZJWEVTOiAuaW4gLm91dAorCitub25ndWk6CS90bXAgJChTQ1JJUFRTKQorCWNzaCAtYyBlY2hvIEFMTCBET05FCisKK2NsZWFuOgorCWNzaCAtYyBccm0gLXJmICoub3V0IC90bXAvKiBYZG90ZXN0IHNtYWxsLnZpbSB0aW55LnZpbSBtYnl0ZS52aW0gdGVzdC5vayB2aW1pbmZvCisKKy5pbi5vdXQ6CisJY29weSAkKi5vayB0ZXN0Lm9rCisJJChWSU1QUk9HKSAtdSBhbWlnYS52aW0gLVUgTk9ORSAtLW5vcGx1Z2luIC1zIGRvdGVzdC5pbiAkKi5pbgorCWRpZmYgdGVzdC5vdXQgJCoub2sKKwlyZW5hbWUgdGVzdC5vdXQgJCoub3V0CisJLWRlbGV0ZSBYIz8gQUxMIFFVSUVUCisJLWRlbGV0ZSB0ZXN0Lm9rCisKKyMgQ3JlYXRlIGEgZGlyZWN0b3J5IGZvciB0ZW1wIGZpbGVzCisvdG1wOgorCW1ha2VkaXIgL3RtcAorCisjIE1hbnggcmVxdWlyZXMgYWxsIGRlcGVuZGVuY2llcy4uLgordGVzdDEub3V0OiB0ZXN0MS5pbgordGVzdDIub3V0OiB0ZXN0Mi5pbgordGVzdDMub3V0OiB0ZXN0My5pbgordGVzdDQub3V0OiB0ZXN0NC5pbgordGVzdDUub3V0OiB0ZXN0NS5pbgordGVzdDYub3V0OiB0ZXN0Ni5pbgordGVzdDcub3V0OiB0ZXN0Ny5pbgordGVzdDgub3V0OiB0ZXN0OC5pbgordGVzdDkub3V0OiB0ZXN0OS5pbgordGVzdDEwLm91dDogdGVzdDEwLmluCit0ZXN0MTEub3V0OiB0ZXN0MTEuaW4KK3Rlc3QxMi5vdXQ6IHRlc3QxMi5pbgordGVzdDEzLm91dDogdGVzdDEzLmluCit0ZXN0MTQub3V0OiB0ZXN0MTQuaW4KK3Rlc3QxNS5vdXQ6IHRlc3QxNS5pbgordGVzdDE2Lm91dDogdGVzdDE2LmluCit0ZXN0MTcub3V0OiB0ZXN0MTcuaW4KK3Rlc3QxOC5vdXQ6IHRlc3QxOC5pbgordGVzdDE5Lm91dDogdGVzdDE5LmluCit0ZXN0MjAub3V0OiB0ZXN0MjAuaW4KK3Rlc3QyMS5vdXQ6IHRlc3QyMS5pbgordGVzdDIyLm91dDogdGVzdDIyLmluCit0ZXN0MjMub3V0OiB0ZXN0MjMuaW4KK3Rlc3QyNC5vdXQ6IHRlc3QyNC5pbgordGVzdDI1Lm91dDogdGVzdDI1LmluCit0ZXN0MjYub3V0OiB0ZXN0MjYuaW4KK3Rlc3QyNy5vdXQ6IHRlc3QyNy5pbgordGVzdDI4Lm91dDogdGVzdDI4LmluCit0ZXN0Mjkub3V0OiB0ZXN0MjkuaW4KK3Rlc3QzMC5vdXQ6IHRlc3QzMC5pbgordGVzdDMxLm91dDogdGVzdDMxLmluCit0ZXN0MzIub3V0OiB0ZXN0MzIuaW4KK3Rlc3QzMy5vdXQ6IHRlc3QzMy5pbgordGVzdDM0Lm91dDogdGVzdDM0LmluCit0ZXN0MzUub3V0OiB0ZXN0MzUuaW4KK3Rlc3QzNi5vdXQ6IHRlc3QzNi5pbgordGVzdDM3Lm91dDogdGVzdDM3LmluCit0ZXN0Mzgub3V0OiB0ZXN0MzguaW4KK3Rlc3QzOS5vdXQ6IHRlc3QzOS5pbgordGVzdDQwLm91dDogdGVzdDQwLmluCit0ZXN0NDEub3V0OiB0ZXN0NDEuaW4KK3Rlc3Q0Mi5vdXQ6IHRlc3Q0Mi5pbgordGVzdDQzLm91dDogdGVzdDQzLmluCit0ZXN0NDQub3V0OiB0ZXN0NDQuaW4KK3Rlc3Q0NS5vdXQ6IHRlc3Q0NS5pbgordGVzdDQ2Lm91dDogdGVzdDQ2LmluCit0ZXN0NDcub3V0OiB0ZXN0NDcuaW4KK3Rlc3Q0OC5vdXQ6IHRlc3Q0OC5pbgordGVzdDUxLm91dDogdGVzdDUxLmluCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci9NYWtlX2Rvcy5tYWsgYi9zcmMvdGVzdGRpci9NYWtlX2Rvcy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1OTUxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL01ha2VfZG9zLm1hawpAQCAtMCwwICsxLDY0IEBACisjCisjIE1ha2VmaWxlIHRvIHJ1biBhbCB0ZXN0cyBmb3IgVmltLCBvbiBEb3MtbGlrZSBtYWNoaW5lcy4KKyMKKyMgUmVxdWlyZXMgYSBzZXQgb2YgVW5peCB0b29sczogZWNobywgZGlmZiwgZXRjLgorCitWSU1QUk9HID0gLi5cXHZpbQorCisjIE9taXR0ZWQ6CisjIHRlc3QyCQkiXFx0bXAiIGRvZXNuJ3Qgd29yay4KKyMgdGVzdDEwCSdlcnJvcmZvcm1hdCcgaXMgZGlmZmVyZW50CisjIHRlc3QxMgljYW4ndCB1bmxpbmsgYSBzd2FwIGZpbGUKKyMgdGVzdDI1CXVzZXMgc3ltYm9saWMgbGluaworIyB0ZXN0MjcJY2FuJ3QgZWRpdCBmaWxlIHdpdGggIioiIGluIGZpbGUgbmFtZQorIyB0ZXN0MzEJMTYgYml0IHZlcnNpb24gcnVucyBvdXQgb2YgbWVtb3J5Li4uCisKK1NDUklQVFMxNiA9CXRlc3QxLm91dCB0ZXN0MTkub3V0IHRlc3QyMC5vdXQgdGVzdDIyLm91dCBcCisJCXRlc3QyMy5vdXQgdGVzdDI0Lm91dCB0ZXN0Mjgub3V0IHRlc3QyOS5vdXQgXAorCQl0ZXN0MzUub3V0IHRlc3QzNi5vdXQgdGVzdDQzLm91dCBcCisJCXRlc3Q0NC5vdXQgdGVzdDQ1Lm91dCB0ZXN0NDYub3V0IHRlc3Q0Ny5vdXQgXAorCQl0ZXN0NDgub3V0IHRlc3Q1MS5vdXQKKworU0NSSVBUUyA9CXRlc3QzLm91dCB0ZXN0NC5vdXQgdGVzdDUub3V0IHRlc3Q2Lm91dCB0ZXN0Ny5vdXQgXAorCQl0ZXN0OC5vdXQgdGVzdDkub3V0IHRlc3QxMS5vdXQgdGVzdDEzLm91dCB0ZXN0MTQub3V0IFwKKwkJdGVzdDE1Lm91dCB0ZXN0MTcub3V0IHRlc3QxOC5vdXQgdGVzdDIxLm91dCB0ZXN0MjYub3V0IFwKKwkJdGVzdDMwLm91dCB0ZXN0MzEub3V0IHRlc3QzMi5vdXQgdGVzdDMzLm91dCB0ZXN0MzQub3V0IFwKKwkJdGVzdDM3Lm91dCB0ZXN0Mzgub3V0IHRlc3QzOS5vdXQgdGVzdDQwLm91dCB0ZXN0NDEub3V0IFwKKwkJdGVzdDQyLm91dCB0ZXN0NTIub3V0CisKK1NDUklQVFMzMiA9CXRlc3Q1MC5vdXQKKworU0NSSVBUU19HVUkgPSB0ZXN0MTYub3V0CisKKy5TVUZGSVhFUzogLmluIC5vdXQKKworbm9uZ3VpOgkkKFNDUklQVFMxNikgJChTQ1JJUFRTKQorCWVjaG8gQUxMIERPTkUKKworc21hbGw6CSQoU0NSSVBUUzE2KQorCWVjaG8gQUxMIERPTkUKKworZ3VpOgkkKFNDUklQVFMxNikgJChTQ1JJUFRTKSAkKFNDUklQVFNfR1VJKQorCWVjaG8gQUxMIERPTkUKKword2luMzI6CSQoU0NSSVBUUzE2KSAkKFNDUklQVFMpICQoU0NSSVBUUzMyKQorCWVjaG8gQUxMIERPTkUKKworY2xlYW46CisJLWRlbCAqLm91dAorCS1kZWwgdGVzdC5vaworCS1kZWwgc21hbGwudmltCisJLWRlbCB0aW55LnZpbQorCS1kZWwgbWJ5dGUudmltCisJLWRlbCBYKgorCS1kZWwgdmltaW5mbworCisuaW4ub3V0OgorCWNvcHkgJCoub2sgdGVzdC5vaworCSQoVklNUFJPRykgLXUgZG9zLnZpbSAtVSBOT05FIC0tbm9wbHVnaW4gLXMgZG90ZXN0LmluICQqLmluCisJZGlmZiB0ZXN0Lm91dCAkKi5vaworCS1kZWwgJCoub3V0CisJcmVuYW1lIHRlc3Qub3V0ICQqLm91dAorCS1kZWwgWCoKKwktZGVsIHRlc3Qub2sKKwktZGVsIHZpbWluZm8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL01ha2Vfb3MyLm1hayBiL3NyYy90ZXN0ZGlyL01ha2Vfb3MyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU4MjAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvTWFrZV9vczIubWFrCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTWFrZWZpbGUgdG8gcnVuIGFsIHRlc3RzIGZvciBWaW0sIG9uIE9TLzIKKyMKKyMgUmVxdWlyZXMgYSBzZXQgb2YgVW5peCB0b29sczogZWNobywgZGlmZiwgZXRjLgorCitWSU1QUk9HID0gLi4vdmltLmV4ZQorCisjIE9taXR0ZWQ6CisjIHRlc3QyCQkiXFx0bXAiIGRvZXNuJ3Qgd29yay4KKyMgdGVzdDEwCSdlcnJvcmZvcm1hdCcgaXMgZGlmZmVyZW50CisjIHRlc3QxMQlyZXF1aXJlcyBzZWQKKyMgdGVzdDEyCWNhbid0IHVubGluayBhIHN3YXAgZmlsZQorIyB0ZXN0MjUJdXNlcyBzeW1ib2xpYyBsaW5rCisjIHRlc3QyNwljYW4ndCBlZGl0IGZpbGUgd2l0aCAiKiIgaW4gZmlsZSBuYW1lCisjIHRlc3Q1Mglvbmx5IGZvciBXaW4zMgorCitTQ1JJUFRTID0gdGVzdDEub3V0IHRlc3QzLm91dCB0ZXN0NC5vdXQgdGVzdDUub3V0IHRlc3Q2Lm91dCBcCisJCXRlc3Q3Lm91dCB0ZXN0OC5vdXQgdGVzdDkub3V0IFwKKwkJdGVzdDEzLm91dCB0ZXN0MTQub3V0IHRlc3QxNS5vdXQgdGVzdDE3Lm91dCBcCisJCXRlc3QxOC5vdXQgdGVzdDE5Lm91dCB0ZXN0MjAub3V0IHRlc3QyMS5vdXQgdGVzdDIyLm91dCBcCisJCXRlc3QyMy5vdXQgdGVzdDI0Lm91dCB0ZXN0MjYub3V0IFwKKwkJdGVzdDI4Lm91dCB0ZXN0Mjkub3V0IHRlc3QzMC5vdXQgdGVzdDMxLm91dCB0ZXN0MzIub3V0IFwKKwkJdGVzdDMzLm91dCB0ZXN0MzQub3V0IHRlc3QzNS5vdXQgdGVzdDM2Lm91dCB0ZXN0Mzcub3V0IFwKKwkJdGVzdDM4Lm91dCB0ZXN0Mzkub3V0IHRlc3Q0MC5vdXQgdGVzdDQxLm91dCB0ZXN0NDIub3V0IFwKKwkJdGVzdDQzLm91dCB0ZXN0NDQub3V0IHRlc3Q0NS5vdXQgdGVzdDQ2Lm91dCB0ZXN0NDcub3V0IFwKKwkJdGVzdDQ4Lm91dCB0ZXN0NTEub3V0CisKKy5TVUZGSVhFUzogLmluIC5vdXQKKworYWxsOgkvdG1wICQoU0NSSVBUUykKKwlAZWNobyBBTEwgRE9ORQorCiskKFNDUklQVFMpOiAkKFZJTVBST0cpCisKK2NsZWFuOgorCS1ybSAtcmYgKi5vdXQgWGRvdGVzdCB0ZXN0Lm9rIHRpbnkudmltIHNtYWxsLnZpbSBtYnl0ZS52aW0gdmltaW5mbworCisjIE1ha2Ugc3VyZSBhbGwgLmluIGFuZCAub3V0IGZpbGVzIGFyZSBpbiBET1MgZmlsZWZvcm1hdC4KKy5pbi5vdXQ6CisJJChWSU1QUk9HKSAtdSBOT05FIC1zIHRvZG9zLnZpbSAkKi5pbgorCSQoVklNUFJPRykgLXUgTk9ORSAtcyB0b2Rvcy52aW0gJCoub2sKKwljb3B5ICQqLm9rIHRlc3Qub2sKKwkkKFZJTVBST0cpIC11IG9zMi52aW0gLS1ub3BsdWdpbiAtcyBkb3Rlc3QuaW4gJCouaW4KKwkkKFZJTVBST0cpIC11IE5PTkUgLXMgdG9kb3MudmltIHRlc3Qub3V0CisJZGlmZiB0ZXN0Lm91dCAkKi5vaworCXJlbmFtZSB0ZXN0Lm91dCAkKi5vdXQKKwktcm0gLXJmIFgqIHZpbWluZm8KKwktZGVsIHRlc3Qub2sKKworIyBDcmVhdGUgYSBkaXJlY3RvcnkgZm9yIHRlbXAgZmlsZXMKKy90bXA6CisJLW1rZGlyIC90bXAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL01ha2Vfdm1zLm1tcyBiL3NyYy90ZXN0ZGlyL01ha2Vfdm1zLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2IwYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvTWFrZV92bXMubW1zCkBAIC0wLDAgKzEsMTI0IEBACisjCisjIE1ha2VmaWxlIHRvIHJ1biBhbGwgdGVzdHMgZm9yIFZpbSBvbiBWTVMKKyMKKyMgQXV0aG9yczoJWm9sdGFuIEFycGFkZmZ5LCA8YXJwYWRmZnlAcG9sYXJob21lLmNvbT4KKyMJCVNhbmRvciBLb3BhbnlpLCAgPHNhbmRvci5rb3BhbnlpQG1haWxib3guaHU+CisjCisjIExhc3QgY2hhbmdlOiAgMjAwNCBNYXkgMDMKKyMKKyMgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgb24gVk1TIDYuMiB0byA3LjIgb24gREVDIEFscGhhIGFuZCBWQVguCisjIEVkaXQgdGhlIGxpbmVzIGluIHRoZSBDb25maWd1cmF0aW9uIHNlY3Rpb24gYmVsb3cgdG8gc2VsZWN0LgorIworIyBFeGVjdXRlIHdpdGg6CisjCQltbXMvZGVzY3JpcD1NYWtlX3Ztcy5tbXMKKyMgQ2xlYW51cCB3aXRoOgorIwkJbW1zL2Rlc2NyaXA9TWFrZV92bXMubW1zIGNsZWFuCisjCisjIE1ha2UgZmlsZXMgYXJlIE1NSyBjb21wYXRpYmxlLgorIworIyBOT1RFOiBZb3UgY2FuIHJ1biB0aGlzIHNjcmlwdCBqdXN0IGluIFgvV2luZG93IGVudmlyb25tZW50LiBJdCB3aWxsCisjIGNyZWF0ZSBhIG5ldyB0ZXJtaW5hbHMsIHRoZXJlZm9yZSB5b3UgaGF2ZSB0byBzZXQgdXAgeW91ciBESVNQTEFZCisjIGxvZ2ljYWwuIE1vcmUgaW5mbyBpbiBWTVMgZG9jdW1lbnRhdGlvbiBvciB3aXRoOiBoZWxwIHNldCBkaXNwLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBVbmNvbW1lbnQgaWYgeW91IHdhbnQgdGVzdHMgaW4gR1VJIG1vZGUuICBUZXJtaW5hbCBtb2RlIGlzIGRlZmF1bHQuCisjIFdBTlRfR1VJICA9IFlFUworCisjIENvbW1lbnQgb3V0IGlmIHlvdSB3YW50IHRvIHJ1biBVbml4IHNwZWNpZmljIHRlc3RzIGFzIHdlbGwsIGJ1dCBwbGVhc2UKKyMgYmUgYXdhcmUsIHRoYXQgb24gT3BlblZNUyB3aWxsIGZhaWwsIGJlY2F1c2Ugb2YgY2F0LCBybSwgZXRjIGNvbW1hbmRzCisjIGFuZCBkaXJlY3RvcnkgaGFuZGxpbmcuCisjIFdBTlRfVU5JWCA9IFlFUworCisjIENvbW1lbnQgb3V0IGlmIHlvdSBoYXZlIGd6aXAgb24geW91ciBzeXN0ZW0KKyMgSEFWRV9HWklQID0gWUVTCisKKyMgQ29tbWVudCBvdXQgaWYgeW91IGhhdmUgR05VIGNvbXBhdGlibGUgZGlmZiBvbiB5b3VyIHN5c3RlbQorIyBIQVZFX0dESUZGID0gWUVTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVuZCBvZiBjb25maWd1cmF0aW9uIHNlY3Rpb24uCisjCisjIFBsZWFzZSwgZG8gbm90IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB3aXRob3V0IHByb2dyYW1taW5nIGV4cGVyaWVuY2UuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitWSU1QUk9HID0gPC0+dmltLmV4ZQorCisuU1VGRklYRVMgOiAub3V0IC5pbgorCitTQ1JJUFQgPSB0ZXN0MS5vdXQgIHRlc3QyLm91dCAgdGVzdDMub3V0ICB0ZXN0NC5vdXQgIHRlc3Q1Lm91dCAgXAorCSB0ZXN0Ni5vdXQgIHRlc3Q3Lm91dCAgdGVzdDgub3V0ICB0ZXN0OS5vdXQgIHRlc3QxMGEub3V0XAorCSB0ZXN0MTMub3V0IHRlc3QxNC5vdXQgdGVzdDE1Lm91dCB0ZXN0MTcub3V0IFwKKwkgdGVzdDE4Lm91dCB0ZXN0MTkub3V0IHRlc3QyMC5vdXQgdGVzdDIxLm91dCB0ZXN0MjIub3V0IFwKKwkgdGVzdDIzLm91dCB0ZXN0MjQub3V0IHRlc3QyNi5vdXQgXAorCSB0ZXN0Mjgub3V0IHRlc3QyOS5vdXQgdGVzdDMxLm91dCB0ZXN0MzIub3V0IFwKKwkgdGVzdDMzLm91dCB0ZXN0MzQub3V0IHRlc3QzNS5vdXQgdGVzdDM2Lm91dCB0ZXN0Mzcub3V0IFwKKwkgdGVzdDM4Lm91dCB0ZXN0Mzkub3V0IHRlc3Q0MC5vdXQgdGVzdDQxLm91dCB0ZXN0NDIub3V0IFwKKwkgdGVzdDQzLm91dCB0ZXN0NDQub3V0IHRlc3Q0NS5vdXQgdGVzdDQ2Lm91dCBcCisJIHRlc3Q0OC5vdXQgdGVzdDUxLm91dAorCisuSUZERUYgV0FOVF9HVUkKK1NDUklQVF9HVUkgPSB0ZXN0MTYub3V0CitHVUlfT1BUSU9OID0gLWcKKy5FTkRJRgorCisuSUZERUYgV0FOVF9VTklYCitTQ1JJUFRfVU5JWCA9IHRlc3QxMC5vdXQgdGVzdDEyLm91dCB0ZXN0MjUub3V0IHRlc3QyNy5vdXQgdGVzdDMwLm91dCB0ZXN0NDkub3V0CisuRU5ESUYKKworLklGREVGIEhBVkVfR1pJUAorU0NSSVBUX0daSVAgPSB0ZXN0MTEub3V0CisuRU5ESUYKKworLklGREVGIEhBVkVfR0RJRkYKK1NDUklQVF9HRElGRiA9IHRlc3Q0Ny5vdXQKKy5FTkRJRgorCisuaW4ub3V0IDoKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICIgIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIiAgICAgICAgICAgICAgICAiJCoiICIKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwktQCBjcmVhdGUvdGVybS93YWl0IG1jciAkKFZJTVBST0cpICQoR1VJX09QVElPTikgLXUgdm1zLnZpbSAtLW5vcGx1Z2luIC1zIGRvdGVzdC5pbiAkKi5pbgorCS1AIGlmICInJ0YkU0VBUkNIKCJ0ZXN0Lm91dC4qIiknIiAuTkVTLiAiIiB0aGVuIGRpZmZlcmVuY2VzIHRlc3Qub3V0ICQqLm9rOworCS1AIGlmICInJ0YkU0VBUkNIKCJ0ZXN0Lm91dC4qIiknIiAuTkVTLiAiIiB0aGVuIHJlbmFtZSB0ZXN0Lm91dCAkKi5vdXQKKwktQCBpZiAiJydGJFNFQVJDSCgiWGRvdGVzdC4qIiknIiAgLk5FUy4gIiIgdGhlbiBkZWxldGUvbm9jb25maXJtL25vbG9nIFhkb3Rlc3QuKi4qCisKK2FsbCA6IGNsZWFuIG5vbG9nICQoU0NSSVBUKSAkKFNDUklQVF9HVUkpICQoU0NSSVBUX1VOSVgpICQoU0NSSVBUX0daSVApICQoU0NSSVBUX0dESUZGKQorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIiAiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgICAgICAgICAgICAgIEFsbCBkb25lIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCS1AIGRlYXNzaWduIHN5cyRvdXRwdXQKKwktQCBkZWxldGUvbm9jb25maXJtL25vbG9nIHgqLiouKgorCS1AIHR5cGUgdGVzdC5sb2cKKworbm9sb2cgOgorCS1AIGRlZmluZSBzeXMkb3V0cHV0IHRlc3QubG9nCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgICAgICAgICBTdGFuZGFyZCBWSU0gdGVzdCBjYXNlcyIKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwktQCB3cml0ZSBzeXMkb3V0cHV0ICIgT3BlblZNUyB2ZXJzaW9uOiAnJ0YkR0VUU1lJKCJWRVJTSU9OIiknIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIiBWaW0gdmVyc2lvbjoiCisJLUAgbWNyICQoVklNUFJPRykgLS12ZXJzaW9uCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiIFRlc3QgZGF0ZToiCisJLUAgc2hvdyB0aW1lCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgICAgICAgICAgICAgIFRlc3QgcmVzdWx0czoiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiTUFLRV9WTVMuTU1TIG9wdGlvbnM6IgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIiAgIFdBTlRfR1VJICA9ICIiJChXQU5UX0dVSSkiIiAiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgV0FOVF9VTklYID0gIiIkKFdBTlRfVU5JWCkiIiAiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgSEFWRV9HWklQID0gIiIkKEhBVkVfR1pJUCkiIiAiCisJLUAgd3JpdGUgc3lzJG91dHB1dCAiICAgSEFWRV9HRElGRj0gIiIkKEhBVkVfR0RJRkYpIiIgIgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIkRlZmF1bHQgdmltcmMgZmlsZSBpcyBWTVMuVklNOgorCS1AIHdyaXRlIHN5cyRvdXRwdXQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCS1AIHR5cGUgVk1TLlZJTQorCitjbGVhbiA6CisJLUAgaWYgIicnRiRTRUFSQ0goIioub3V0IiknIiAgICAgLk5FUy4gIiIgdGhlbiBkZWxldGUvbm9jb25maXJtL25vbG9nICoub3V0LioKKwktQCBpZiAiJydGJFNFQVJDSCgidGVzdC5sb2ciKSciICAuTkVTLiAiIiB0aGVuIGRlbGV0ZS9ub2NvbmZpcm0vbm9sb2cgdGVzdC5sb2cuKgorCS1AIGlmICInJ0YkU0VBUkNIKCJYZG90ZXN0LioiKSciIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyBYZG90ZXN0LiouKgorCS1AIGlmICInJ0YkU0VBUkNIKCIqLipfc3cqIiknIiAgIC5ORVMuICIiIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyAqLipfc3cqLioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL01ha2VmaWxlIGIvc3JjL3Rlc3RkaXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkOTdmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL01ha2VmaWxlCkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTWFrZWZpbGUgdG8gcnVuIGFsIHRlc3RzIGZvciBWaW0KKyMKKworVklNUFJPRyA9IC4uL3ZpbQorCitTQ1JJUFRTID0gdGVzdDEub3V0IHRlc3QyLm91dCB0ZXN0My5vdXQgdGVzdDQub3V0IHRlc3Q1Lm91dCB0ZXN0Ni5vdXQgXAorCQl0ZXN0Ny5vdXQgdGVzdDgub3V0IHRlc3Q5Lm91dCB0ZXN0MTAub3V0IHRlc3QxMS5vdXQgXAorCQl0ZXN0MTIub3V0ICB0ZXN0MTMub3V0IHRlc3QxNC5vdXQgdGVzdDE1Lm91dCB0ZXN0MTcub3V0IFwKKwkJdGVzdDE4Lm91dCB0ZXN0MTkub3V0IHRlc3QyMC5vdXQgdGVzdDIxLm91dCB0ZXN0MjIub3V0IFwKKwkJdGVzdDIzLm91dCB0ZXN0MjQub3V0IHRlc3QyNS5vdXQgdGVzdDI2Lm91dCB0ZXN0Mjcub3V0IFwKKwkJdGVzdDI4Lm91dCB0ZXN0Mjkub3V0IHRlc3QzMC5vdXQgdGVzdDMxLm91dCB0ZXN0MzIub3V0IFwKKwkJdGVzdDMzLm91dCB0ZXN0MzQub3V0IHRlc3QzNS5vdXQgdGVzdDM2Lm91dCB0ZXN0Mzcub3V0IFwKKwkJdGVzdDM4Lm91dCB0ZXN0Mzkub3V0IHRlc3Q0MC5vdXQgdGVzdDQxLm91dCB0ZXN0NDIub3V0IFwKKwkJdGVzdDQzLm91dCB0ZXN0NDQub3V0IHRlc3Q0NS5vdXQgdGVzdDQ2Lm91dCB0ZXN0NDcub3V0IFwKKwkJdGVzdDQ4Lm91dCB0ZXN0NDkub3V0IHRlc3Q1MS5vdXQgdGVzdDUyLm91dAorCitTQ1JJUFRTX0dVSSA9IHRlc3QxNi5vdXQKKworLlNVRkZJWEVTOiAuaW4gLm91dAorCitub25ndWk6CW5vbG9nICQoU0NSSVBUUykKKwlAZWNobworCUBjYXQgdGVzdC5sb2cKKwlAZWNobyBBTEwgRE9ORQorCitndWk6CW5vbG9nICQoU0NSSVBUUykgJChTQ1JJUFRTX0dVSSkKKwlAZWNobworCUBjYXQgdGVzdC5sb2cKKwlAZWNobyBBTEwgRE9ORQorCiskKFNDUklQVFMpICQoU0NSSVBUU19HVUkpOiAkKFZJTVBST0cpCisKK2NsZWFuOgorCS1ybSAtcmYgKi5vdXQgKi5yZWogKi5vcmlnIHRlc3QubG9nIHRpbnkudmltIHNtYWxsLnZpbSBtYnl0ZS52aW0gdGVzdC5vayBYKiB2aW1pbmZvCisKK3Rlc3QxLm91dDogdGVzdDEuaW4KKwktcm0gLWYgJCouZmFpbGVkIHRpbnkudmltIHNtYWxsLnZpbSBtYnl0ZS52aW0gdGVzdC5vayBYKiB2aW1pbmZvCisJJChWSU1QUk9HKSAtdSB1bml4LnZpbSAtVSBOT05FIC0tbm9wbHVnaW4gLXMgZG90ZXN0LmluICQqLmluCisJQC9iaW4vc2ggLWMgImlmIGRpZmYgdGVzdC5vdXQgJCoub2s7IFwKKwkJdGhlbiBtdiAtZiB0ZXN0Lm91dCAkKi5vdXQ7IFwKKwkJZWxzZSBlY2hvOyBcCisJCWVjaG8gdGVzdDEgRkFJTEVEIC0gU29tZXRoaW5nIGJhc2ljIGlzIHdyb25nOyBcCisJCWVjaG87IGV4aXQgMTsgZmkiCisJLXJtIC1yZiBYKiB2aW1pbmZvCisKKy5pbi5vdXQ6CisJLXJtIC1mICQqLmZhaWxlZCB0ZXN0Lm9rIFgqCisJY3AgJCoub2sgdGVzdC5vaworCSQoVklNUFJPRykgLXUgdW5peC52aW0gLVUgTk9ORSAtLW5vcGx1Z2luIC1zIGRvdGVzdC5pbiAkKi5pbgorCUAvYmluL3NoIC1jICJpZiBkaWZmIHRlc3Qub3V0ICQqLm9rOyBcCisJCXRoZW4gbXYgLWYgdGVzdC5vdXQgJCoub3V0OyBcCisJCWVsc2UgZWNobyAkKiBGQUlMRUQgPj50ZXN0LmxvZzsgbXYgLWYgdGVzdC5vdXQgJCouZmFpbGVkOyBcCisJCWZpIgorCS1ybSAtcmYgWCogdGVzdC5vayB2aW1pbmZvCisKK25vbG9nOgorCS1lY2hvIFRlc3QgcmVzdWx0czogPnRlc3QubG9nCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci9hbWlnYS52aW0gYi9zcmMvdGVzdGRpci9hbWlnYS52aW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjYTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL2FtaWdhLnZpbQpAQCAtMCwwICsxLDQgQEAKKyIgU2V0dGluZ3MgZm9yIHRlc3Qgc2NyaXB0IGV4ZWN1dGlvbgorc2V0IHNoZWxsPWNzaAorbWFwISAvdG1wIHQ6CitjbWFwICFybSAhRGVsZXRlIGFsbApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvZG9zLnZpbSBiL3NyYy90ZXN0ZGlyL2Rvcy52aW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3NjRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL2Rvcy52aW0KQEAgLTAsMCArMSw3IEBACisiIFNldHRpbmdzIGZvciB0ZXN0IHNjcmlwdCBleGVjdXRpb24KKyIgQWx3YXlzIHVzZSAiQ09NTUFORC5DT00iLCBkb24ndCB1c2UgdGhlIHZhbHVlIG9mICIkU0hFTEwiLgorc2V0IHNoZWxsPWM6XENPTU1BTkQuQ09NIHNoZWxscXVvdGU9IHNoZWxseHF1b3RlPSBzaGVsbGNtZGZsYWc9L2Mgc2hlbGxyZWRpcj0+CisiIFRoaXMgaXMgdXNlZCBvbmx5IHdoZW4gdGhlICtldmFsIGZlYXR1cmUgaXMgYXZhaWxhYmxlLgoraWYgZXhlY3V0YWJsZSgiY21kLmV4ZSIpCisgICBzZXQgc2hlbGw9Y21kLmV4ZQorZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL2RvdGVzdC5pbiBiL3NyYy90ZXN0ZGlyL2RvdGVzdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmEwZTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvZG90ZXN0LmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL21haW4uYWFwIGIvc3JjL3Rlc3RkaXIvbWFpbi5hYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5M2I5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL21haW4uYWFwCkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTWFrZWZpbGUgdG8gcnVuIGFsIHRlc3RzIGZvciBWaW0KKyMKKworVmltUHJvZyA/PSAuLi92aW0KKworU2NyaXB0cyA9IHRlc3QxLm91dCB0ZXN0Mi5vdXQgdGVzdDMub3V0IHRlc3Q0Lm91dCB0ZXN0NS5vdXQgdGVzdDYub3V0CisJCXRlc3Q3Lm91dCB0ZXN0OC5vdXQgdGVzdDkub3V0IHRlc3QxMC5vdXQgdGVzdDExLm91dAorCQl0ZXN0MTIub3V0ICB0ZXN0MTMub3V0IHRlc3QxNC5vdXQgdGVzdDE1Lm91dCB0ZXN0MTcub3V0CisJCXRlc3QxOC5vdXQgdGVzdDE5Lm91dCB0ZXN0MjAub3V0IHRlc3QyMS5vdXQgdGVzdDIyLm91dAorCQl0ZXN0MjMub3V0IHRlc3QyNC5vdXQgdGVzdDI1Lm91dCB0ZXN0MjYub3V0IHRlc3QyNy5vdXQKKwkJdGVzdDI4Lm91dCB0ZXN0Mjkub3V0IHRlc3QzMC5vdXQgdGVzdDMxLm91dCB0ZXN0MzIub3V0CisJCXRlc3QzMy5vdXQgdGVzdDM0Lm91dCB0ZXN0MzUub3V0IHRlc3QzNi5vdXQgdGVzdDM3Lm91dAorCQl0ZXN0Mzgub3V0IHRlc3QzOS5vdXQgdGVzdDQwLm91dCB0ZXN0NDEub3V0IHRlc3Q0Mi5vdXQKKwkJdGVzdDQzLm91dCB0ZXN0NDQub3V0IHRlc3Q0NS5vdXQgdGVzdDQ2Lm91dCB0ZXN0NDcub3V0CisJCXRlc3Q0OC5vdXQgdGVzdDQ5Lm91dAorCitTY3JpcHRzR1VJID0gdGVzdDE2Lm91dAorCisjIEJ1aWxkICJub25ndWkiIHdoZW4gbm8gdGFyZ2V0IHdhcyBzcGVjaWZpZWQuCitub25ndWk6CW5ld2xvZyAkU2NyaXB0cworCTpwcmludAorCTpjYXQgdGVzdC5sb2cKKwk6cHJpbnQgQUxMIERPTkUKKworIyBCdWlsZCAibmd1aSIgd2hlbiBzcGVjaWZpZWQuCitndWk6CW5ld2xvZyAkU2NyaXB0cyAkU2NyaXB0c0dVSQorCTpwcmludAorCTpjYXQgdGVzdC5sb2cKKwk6cHJpbnQgQUxMIERPTkUKKworJFNjcmlwdHMgJFNjcmlwdHNHVUk6ICRWaW1Qcm9nCisKK2NsZWFuOgorCTpkZWwge3J9e2ZvcmNlfSAqLm91dCB0ZXN0LmxvZyB0aW55LnZpbSBzbWFsbC52aW0gbWJ5dGUudmltIHRlc3Qub2sgWCoKKworIyB0ZXN0MSBpcyBzcGVjaWFsLCBpdCBjaGVja3MgZm9yIGZlYXR1cmVzCit0ZXN0MS5vdXQ6IHRlc3QxLmluCisJOmRlbCB7Zm9yY2V9IHRlc3QxLmZhaWxlZCB0aW55LnZpbSBzbWFsbC52aW0gbWJ5dGUudmltCisJOnN5cyB7aX0gJFZpbVByb2cgLXUgdW5peC52aW0gLVUgTk9ORSAtLW5vcGx1Z2luIC1zIGRvdGVzdC5pbiB0ZXN0MS5pbgorCUBpZiBvcy5zeXN0ZW0oImRpZmYgdGVzdC5vdXQgdGVzdDEub2siKSAhPSAwOgorCQk6ZXJyb3IgdGVzdDEgRkFJTEVEIC0gU29tZXRoaW5nIGJhc2ljIGlzIHdyb25nCisJOm1vdmUge2ZvcmNlfSB0ZXN0Lm91dCB0ZXN0MS5vdXQKKwk6ZGVsIHtyfXtmb3JjZX0gWCoKKworOnJ1bGUgJS5vdXQgOiAlLmluCisJOmRlbCB7Zm9yY2V9ICQobWF0Y2gpLmZhaWxlZCB0ZXN0Lm9rCisJOmNvcHkgJChtYXRjaCkub2sgdGVzdC5vaworCTpzeXMge2l9ICRWaW1Qcm9nIC11IHVuaXgudmltIC1VIE5PTkUgLS1ub3BsdWdpbiAtcyBkb3Rlc3QuaW4gJChtYXRjaCkuaW4KKwlAaWYgb3Muc3lzdGVtKCJkaWZmIHRlc3Qub3V0ICIgKyBtYXRjaCArICIub2siKSAhPSAwOgorCQk6cHJpbnQgJG1hdGNoIEZBSUxFRCA+PnRlc3QubG9nCisJCTptb3ZlIHtmb3JjZX0gdGVzdC5vdXQgJChtYXRjaCkuZmFpbGVkCisJQGVsc2U6CisJCTptb3ZlIHtmb3JjZX0gdGVzdC5vdXQgJChtYXRjaCkub3V0CisJOmRlbCB7cn17Zm9yY2V9IFgqIHRlc3Qub2sKKworbmV3bG9nOgorCTpwcmludCBUZXN0IHJlc3VsdHM6ID4hIHRlc3QubG9nCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci9vczIudmltIGIvc3JjL3Rlc3RkaXIvb3MyLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdiYTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvb3MyLnZpbQpAQCAtMCwwICsxLDMgQEAKKyIgU2V0dGluZ3MgZm9yIHRlc3Qgc2NyaXB0IGV4ZWN1dGlvbgorIiBBbHdheXMgdXNlICJDTUQuRVhFIiwgZG9uJ3QgdXNlIHRoZSB2YWx1ZSBvZiAiJFNIRUxMIi4KK3NldCBzaGVsbD1DTUQuRVhFIHNoZWxscXVvdGU9IHNoZWxseHF1b3RlPSBzaGVsbGNtZGZsYWc9L2Mgc2hlbGxyZWRpcj0+CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWJkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MS5pbgpAQCAtMCwwICsxLDQwIEBACisKK0ZpcnN0IGEgc2ltcGxlIHRlc3QgdG8gY2hlY2sgaWYgdGhlIHRlc3Qgc2NyaXB0IHdvcmtzLgorCitJZiBWaW0gd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSArZXZhbCBmZWF0dXJlLCB0aGUgc21hbGwudmltIHNjcmlwdCB3aWxsIGJlCitzZXQgdG8gY29weSB0aGUgdGVzdC5vayBmaWxlIHRvIHRlc3Qub3V0LCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlIHRlc3QKK3N1Y2NlZWRlZC4gIE90aGVyd2lzZSBhbiBlbXB0eSBzbWFsbC52aW0gaXMgd3JpdHRlbi4gIHNtYWxsLnZpbSBpcyBzb3VyY2VkIGJ5Cit0ZXN0cyB0aGF0IHJlcXVpcmUgdGhlICtldmFsIGZlYXR1cmUgb3Igb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgbWlzc2luZyBpbiB0aGUKK3NtYWxsIHZlcnNpb24uCisKK0lmIFZpbSB3YXMgbm90IGNvbXBpbGVkIHdpdGggdGhlICt3aW5kb3dzIGZlYXR1cmUsIHRoZSB0aW55LnZpbSBzY3JpcHQgd2lsbCBiZQorc2V0IGxpa2Ugc21hbGwudmltIGFib3ZlLiAgdGlueS52aW0gaXMgc291cmNlZCBieSB0ZXN0cyB0aGF0IHJlcXVpcmUgdGhlCisrd2luZG93cyBmZWF0dXJlIG9yIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIG1pc3NpbmcgaW4gdGhlIHRpbnkgdmVyc2lvbi4KKworSWYgVmltIHdhcyBub3QgY29tcGlsZWQgd2l0aCB0aGUgK211bHRpX2J5dGUgZmVhdHVyZSwgdGhlIG1ieXRlLnZpbSBzY3JpcHQgd2lsbCBiZSBzZXQgbGlrZSBzbWFsbC52aW0gYWJvdmUuICBtYnl0ZS52aW0gaXMgc291cmNlZCBieSB0ZXN0cyB0aGF0IHJlcXVpcmUgdGhlCisrbXVsdGlfYnl0ZSBmZWF0dXJlLgorCitTVEFSVFRFU1QKKzoiIFdyaXRlIGEgc2luZ2xlIGxpbmUgdG8gdGVzdC5vdXQgdG8gY2hlY2sgaWYgdGVzdGluZyB3b3JrcyBhdCBhbGwuCis6JWQKK2F0aGlzIGlzIGEgdGVzdBs6dyEgdGVzdC5vdXQKKzoiIENyZWF0ZSBzbWFsbC52aW0gYW5kIHRpbnkudmltIGVtcHR5LCBjcmVhdGUgbWJ5dGUudmltIHRvIHNraXAgdGhlIHRlc3QuCiswRDp3ISBzbWFsbC52aW0KKzp3ISB0aW55LnZpbQorYWUhIHRlc3Qub2sKK3chIHRlc3Qub3V0CitxYSEKKxs6dyEgbWJ5dGUudmltCis6IiBJZiArbXVsdGlfYnl0ZSBmZWF0dXJlIHN1cHBvcnRlZCwgbWFrZSBtYnl0ZS52aW0gZW1wdHkuCis6aWYgaGFzKCJtdWx0aV9ieXRlIikgfCBzcCBhbm90aGVyIHwgdyEgbWJ5dGUudmltIHwgcSB8IGVuZGlmCis6IiBJZiArZXZhbCBmZWF0dXJlIHN1cHBvcnRlZCBxdWl0IGhlcmUsIGxlYXZpbmcgdGlueS52aW0gYW5kIHNtYWxsLnZpbSBlbXB0eS4KKzoiIE90aGVyd2lzZSB3cml0ZSBzbWFsbC52aW0gdG8gc2tpcCB0aGUgdGVzdC4KKzppZiAxIHwgcSEgfCBlbmRpZgorOnchIHNtYWxsLnZpbQorOiIgSWYgK3dpbmRvd3MgZmVhdHVyZSBub3Qgc3VwcG9ydGVkIDpzcCB3aWxsIGZhaWwgYW5kIHRpbnkudmltIHdpbGwgYmUKKzoiIHdyaXR0ZW4gdG8gc2tpcCB0aGUgdGVzdC4KKzpzcCBhbm90aGVyCis6d3EhIHRpbnkudmltCis6cWEhCitFTkRURVNUCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDEub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZmNiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxLm9rCkBAIC0wLDAgKzEgQEAKK3RoaXMgaXMgYSB0ZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTAuaW4gYi9zcmMvdGVzdGRpci90ZXN0MTAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1YzRmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxMC5pbgpAQCAtMCwwICsxLDU3IEBACitUZXN0IGZvciAnZXJyb3Jmb3JtYXQnLgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzovc3RhcnQgb2YgZXJyb3JmaWxlLywvZW5kIG9mIGVycm9yZmlsZS93ISBYZXJyb3JmaWxlCis6L3N0YXJ0IG9mIHRlc3RmaWxlLywvZW5kIG9mIHRlc3RmaWxlL3chIFh0ZXN0ZmlsZQorOmNmIFhlcnJvcmZpbGUKK3JBCis6Y24KK3JCCis6Y24KK3JDCis6Y24KK3JECis6Y24KK3JFCis6dyEgdGVzdC5vdXQgICAgICAgICAgICAgIiBXcml0ZSBjb250ZW50cyBvZiB0aGlzIGZpbGUKKzpxYSEKK0VORFRFU1QKKworc3RhcnQgb2YgZXJyb3JmaWxlCisiWHRlc3RmaWxlIiwgbGluZSA0LjEyOiAxNTA2LTA0NSAoUykgVW5kZWNsYXJlZCBpZGVudGlmaWVyIGZkX3NldC4KKyJYdGVzdGZpbGUiLCBsaW5lIDcgY29sIDE5OyB0aGlzIGlzIGFuIGVycm9yCitnY2MgLWMgLURIQVZFX0NPTkZJc2luZy1wcm90b3R5cGVzIC1JL3Vzci9YMTFSNi9pbmNsdWRlICB2ZXJzaW9uLmMKK1h0ZXN0ZmlsZToxMzogcGFyc2UgZXJyb3IgYmVmb3JlIGBhc2QnCittYWtlOiAqKiogW3ZpbV0gRXJyb3IgMQoraW4gZmlsZSAiWHRlc3RmaWxlIiBsaW5lbnIgMTY6IHRoZXJlIGlzIGFuIGVycm9yCisKKzIgcmV0dXJuZWQKKyJYdGVzdGZpbGUiLCBsaW5lbnIgMTk6IHlldCBhbm90aGVyIHByb2JsZW0KKworRG9lcyBhbnlvbmUga25vdyB3aGF0IGlzIHRoZSBwcm9ibGVtIGFuZCBob3cgdG8gY29ycmVjdGlvbiBpdD8KK2VuZCBvZiBlcnJvcmZpbGUKKworc3RhcnQgb2YgdGVzdGZpbGUKK2xpbmUgMiAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDMgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA0ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNSAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDYgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA3ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgOCAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDkgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMCB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTEgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDEyIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMyB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTQgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE1IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxNiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTcgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE4IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxOSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMjAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDIxIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAyMiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2VuZCBvZiB0ZXN0ZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDEwLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDEwLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODY4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTAub2sKQEAgLTAsMCArMSwyMyBAQAorc3RhcnQgb2YgdGVzdGZpbGUKK2xpbmUgMiAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDMgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA0ICB4eHhBeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNSAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDYgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA3ICB4eHh4eHh4eHh4Qnh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgOCAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDkgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMCB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTEgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDEyIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorQ2luZSAxMyB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTQgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE1IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorRGluZSAxNiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTcgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE4IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorRWluZSAxOSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMjAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDIxIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAyMiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2VuZCBvZiB0ZXN0ZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDEwYS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxMGEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllODY1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxMGEuaW4KQEAgLTAsMCArMSw3MyBAQAorVGVzdCBmb3IgJ2Vycm9yZm9ybWF0Jy4KKworU1RBUlRURVNUCis6c28gc21hbGwudmltCis6L3N0YXJ0IG9mIGVycm9yZmlsZS8sL2VuZCBvZiBlcnJvcmZpbGUvdyEgWGVycm9yZmlsZQorOi9zdGFydCBvZiB0ZXN0ZmlsZS8sL2VuZCBvZiB0ZXN0ZmlsZS93ISBYdGVzdGZpbGUKKzpjZiBYZXJyb3JmaWxlCityQQorOmNuCityQgorOmNuCityQworOmNuCityRAorOmNuCityRQorOnchIHRlc3Qub3V0ICAgICAgICAgICAgICIgV3JpdGUgY29udGVudHMgb2YgdGhpcyBmaWxlCis6cWEhCitFTkRURVNUCisKK3N0YXJ0IG9mIGVycm9yZmlsZQorCisgICAgICAgICAgICAgICAgICBwcmludGYoIiAlZCBcbiIsIChudW1iZXIvb3RoZXIpJTEwICk7CisuLi4uLi4uLi4uLi4uLi4uLi5eCislQ0MtRS1OT1NFTUksIE1pc3NpbmcgIjsiLgorYXQgbGluZSBudW1iZXIgNCBpbiBmaWxlIFNZUyRESVNLOlhURVNURklMRQorCisgICAgICAgICAgICAgb3RoZXI9MTAwMDAwMDA7CisuLi4uLi4uLi4uLi4uXgorJUNDLUUtVU5ERUNMQVJFRCwgSW4gdGhpcyBzdGF0ZW1lbnQsICJvc3p0IiBpcyBub3QgZGVjbGFyZWQuCithdCBsaW5lIG51bWJlciA3IGluIGZpbGUgU1lTJERJU0s6WFRFU1RGSUxFCisKKyAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpPDcgOyBpKysgKXsKKy4uLi4uLi4uLi4uLi4uLi4uLl4KKyVDQy1FLVVOREVDTEFSRUQsIEluIHRoaXMgc3RhdGVtZW50LCAiaSIgaXMgbm90IGRlY2xhcmVkLgorYXQgbGluZSBudW1iZXIgMTYgaW4gZmlsZSBTWVMkRElTSzpYVEVTVEZJTEUKKworc29tZSBvdGhlciBlcnJvciBzb21ld2hlcmUgaGVyZS4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLl4KKyVDQy1XLVdBUlJJTkcsIFNvcnJ5LCBidXQgbm8gZXhwYWxuYXRpb24gZm9yIHN1Y2ggYW4gd2FycmluZy4KK2F0IGxpbmUgbnVtYmVyIDE5IGluIGZpbGUgU1lTJERJU0s6WFRFU1RGSUxFCisKK2FuZCBmaW5hbGx5IHNvbWUgb3RoZXIgZXJyb3IgZXhhY3RseSBoZXJlLgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLl4KKyVDQy1JLUlORk9STUFUSU9OQUwsIEl0IHNob3VsZCBiZSBzb21lIGluZm9ybWF0aW9uYWwgbWVzc2FnZS4KK2F0IGxpbmUgbnVtYmVyIDIwIGluIGZpbGUgU1lTJERJU0s6WFRFU1RGSUxFCisKK0RvZXMgYW55b25lIGtub3cgd2hhdCBpcyB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIGNvcnJlY3QgPz8gIDopCitlbmQgb2YgZXJyb3JmaWxlCisKK3N0YXJ0IG9mIHRlc3RmaWxlCiswMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NworbGluZSAzICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNCAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDUgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA2ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNyAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDggIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA5ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDExIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTMgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE0IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxNSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTYgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE3IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxOCB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTkgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDIwIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAyMSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMjIgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitlbmQgb2YgdGVzdGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxMGEub2sgYi9zcmMvdGVzdGRpci90ZXN0MTBhLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTc4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTBhLm9rCkBAIC0wLDAgKzEsMjMgQEAKK3N0YXJ0IG9mIHRlc3RmaWxlCiswMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NworbGluZSAzICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNCAgeHh4eHh4eHh4eEF4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDUgIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA2ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNyAgeHh4eHhCeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDggIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA5ICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDExIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTMgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE0IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxNSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTYgeHh4eHh4eHh4eEN4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDE3IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxOCB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTkgeHh4eHh4eHh4eHh4eHh4eHh4eER4eHh4eHh4eHh4CitsaW5lIDIwIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4RQorbGluZSAyMSB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMjIgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitlbmQgb2YgdGVzdGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxMS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxMS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI5NmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDExLmluCkBAIC0wLDAgKzEsNzcgQEAKK1Rlc3RzIGZvciBhdXRvY29tbWFuZHM6CistIEZpbGVXcml0ZVByZQkJd3JpdGluZyBhIGNvbXByZXNzZWQgZmlsZQorLSBGaWxlUmVhZFBvc3QJCXJlYWRpbmcgYSBjb21wcmVzc2VkIGZpbGUKKy0gQnVmTmV3RmlsZQkJcmVhZGluZyBhIGZpbGUgdGVtcGxhdGUKKy0gQnVmUmVhZFByZQkJZGVjb21wcmVzc2luZyB0aGUgZmlsZSB0byBiZSByZWFkCistIEZpbHRlclJlYWRQcmUJCXN1YnN0aXR1dGluZyBjaGFyYWN0ZXJzIGluIHRoZSB0ZW1wIGZpbGUKKy0gRmlsdGVyUmVhZFBvc3QJc3Vic3RpdHV0aW5nIGNoYXJhY3RlcnMgYWZ0ZXIgZmlsdGVyaW5nCistIEZpbGVSZWFkUHJlCQlzZXQgb3B0aW9ucyBmb3IgZGVjb21wcmVzc2lvbgorLSBGaWxlUmVhZFBvc3QJCWRlY29tcHJlc3MgdGhlIGZpbGUKKworTm90ZTogVGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiAiZ3ppcCIgaXMgbm90IGF2YWlsYWJsZS4KKyRHWklQIGlzIG1hZGUgZW1wdHksICItdiIgd291bGQgY2F1c2UgdHJvdWJsZS4KK1VzZSBhIEZpbGVDaGFuZ2VkU2hlbGwgYXV0b2NvbW1hbmQgdG8gYXZvaWQgYSBwcm9tcHQgZm9yICJYdGVzdGZpbGUuZ3oiIGJlaW5nCittb2RpZmllZCBvdXRzaWRlIG9mIFZpbSAobm90aWNlZCBvbiBTb2xhcmlzKS4KKworU1RBUlRURVNUCis6c28gc21hbGwudmltCis6bGV0ICRHWklQID0gIiIKKzphdSBGaWxlQ2hhbmdlZFNoZWxsICogZWNobyAiY2F1Z2h0IEZpbGVDaGFuZ2VkU2hlbGwiCis6c2V0IGJpbgorOmF1IEZpbGVXcml0ZVByZSAgICAqLmd6ICAgJ1ssJ10hZ3ppcAorOmF1IEZpbGVXcml0ZVBvc3QgICAqLmd6ICAgdW5kbworOi9zdGFydCBvZiB0ZXN0ZmlsZS8sL2VuZCBvZiB0ZXN0ZmlsZS93ISBYdGVzdGZpbGUuZ3oKKzphdSBGaWxlUmVhZFBvc3QgICAgKi5neiAgICdbLCddIWd6aXAgLWQKKzokciBYdGVzdGZpbGUuZ3ogICAgICAgICAgICAgICAgIiBSZWFkIGFuZCBkZWNvbXByZXNzIHRoZSB0ZXN0ZmlsZQorOj9zdGFydHN0YXJ0PywkdyEgdGVzdC5vdXQgICAgICAiIFdyaXRlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZQorOmF1IEJ1Zk5ld0ZpbGUgICAgICAqLmMgICAgcmVhZCBYdGVzdC5jCitnZy9eZW5kIG9mIHRlc3RmaWxlCis6L3N0YXJ0IG9mIHRlc3QuYy8rMSwvZW5kIG9mIHRlc3QuYy8tMXchIFh0ZXN0LmMKKzplISBmb28uYyAgICAgICAgICAgICAgICAgICAgICAgIiBXaWxsIGxvYWQgWHRlc3QuYworOmF1IEZpbGVBcHBlbmRQcmUgICAqLm91dCAgJ1ssJ11zL25ldy9ORVcvCis6YXUgRmlsZUFwcGVuZFBvc3QgICoub3V0ICAhY2F0IFh0ZXN0LmMgPj50ZXN0Lm91dAorOnc+PnRlc3Qub3V0ICAgICAgICAgICAgICAgICAgICAiIEFwcGVuZCBpdCB0byB0aGUgb3V0cHV0IGZpbGUKKzphdSEgRmlsZUFwcGVuZFByZQorOiIgc2V0dXAgYXV0b2NvbW1hbmRzIHRvIGRlY29tcHJlc3MgYmVmb3JlIHJlYWRpbmcgYW5kIHJlLWNvbXByZXNzIGFmdGVyd2FyZHMKKzphdSBCdWZSZWFkUHJlICAgICAgKi5neiAgICFnemlwIC1kIDxhZmlsZT4KKzphdSBCdWZSZWFkUHJlICAgICAgKi5neiAgIGNhbGwgcmVuYW1lKGV4cGFuZCgiPGFmaWxlPjpyIiksIGV4cGFuZCgiPGFmaWxlPiIpKQorOmF1IEJ1ZlJlYWRQb3N0ICAgICAqLmd6ICAgY2FsbCByZW5hbWUoZXhwYW5kKCI8YWZpbGU+IiksIGV4cGFuZCgiPGFmaWxlPjpyIikpCis6YXUgQnVmUmVhZFBvc3QgICAgICouZ3ogICAhZ3ppcCA8YWZpbGU+OnIKKzplISBYdGVzdGZpbGUuZ3ogICAgICAgICAgICAgICAgIiBFZGl0IGNvbXByZXNzZWQgZmlsZQorOnc+PnRlc3Qub3V0ICAgICAgICAgICAgICAgICAgICAiIEFwcGVuZCBpdCB0byB0aGUgb3V0cHV0IGZpbGUKKzphdSBGaWx0ZXJSZWFkUHJlICAgKi5vdXQgIGNhbGwgcmVuYW1lKGV4cGFuZCgiPGFmaWxlPiIpLCBleHBhbmQoIjxhZmlsZT4iKS4iLnQiKQorOmF1IEZpbHRlclJlYWRQcmUgICAqLm91dCAgIXNlZCBzL2UvRS8gPGFmaWxlPi50ID48YWZpbGU+Cis6YXUgRmlsdGVyUmVhZFByZSAgICoub3V0ICAhcm0gPGFmaWxlPi50Cis6YXUgRmlsdGVyUmVhZFBvc3QgICoub3V0ICAnWywnXXMveC9YL2cKKzplISB0ZXN0Lm91dCAgICAgICAgICAgICAgICAgICAgIiBFZGl0IHRoZSBvdXRwdXQgZmlsZQorOjIzLCQhY2F0Cis6YXUhIEZpbGVSZWFkUHJlICAgICouZ3ogICAhZ3ppcCAtZCA8YWZpbGU+Cis6YXUgIEZpbGVSZWFkUHJlICAgICouZ3ogICBjYWxsIHJlbmFtZShleHBhbmQoIjxhZmlsZT46ciIpLCBleHBhbmQoIjxhZmlsZT4iKSkKKzphdSEgRmlsZVJlYWRQb3N0ICAgKi5neiAgICdbLCddcy9sL0wvCis6JHIgWHRlc3RmaWxlLmd6ICAgICAgICAgICAgICIgUmVhZCBjb21wcmVzc2VkIGZpbGUKKzp3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3cml0ZSBpdCwgYWZ0ZXIgZmlsdGVyaW5nCis6YXUhICAgICAgICAgICAgICIgcmVtb3ZlIGFsbCBhdXRvY29tbWFuZHMKKzplICAgICAgICAgICAgICAgIiBFZGl0IHRlc3Qub3V0IGFnYWluCis6c2V0IG5vYmluIGZmJiAgICIgdXNlIHRoZSBkZWZhdWx0IGZpbGVmb3JtYXQgZm9yIHdyaXRpbmcKKzp3Cis6cWEhCitFTkRURVNUCisKK3N0YXJ0c3RhcnQKK3N0YXJ0IG9mIHRlc3RmaWxlCitsaW5lIDIJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK2xpbmUgMwl4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgNAlBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorbGluZSA1CXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA2CUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitsaW5lIDcJeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDgJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK2xpbmUgOQl4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgMTAgQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK2VuZCBvZiB0ZXN0ZmlsZQorCitzdGFydCBvZiB0ZXN0LmMKKy8qCisgKiBIZXJlIGlzIGEgbmV3IC5jIGZpbGUKKyAqLworZW5kIG9mIHRlc3QuYwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDExLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDExLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGM1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTEub2sKQEAgLTAsMCArMSw2MSBAQAorc3RhcnRzdGFydAorc3RhcnQgb2YgdGVzdGZpbGUKK2xpbmUgMglBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorbGluZSAzCXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSA0CUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitsaW5lIDUJeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDYJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK2xpbmUgNwl4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK2xpbmUgOAlBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorbGluZSA5CXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorbGluZSAxMCBBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorZW5kIG9mIHRlc3RmaWxlCisKK3N0YXJ0IG9mIHRlc3QuYworLyoKKyAqIEhlcmUgaXMgYSBuZXcgLmMgZmlsZQorICovCitlbmQgb2YgdGVzdC5jCitzdGFydCBvZiB0ZXN0ZmlsZQorbGluZSAyCUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitsaW5lIDMJeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitsaW5lIDQJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK2xpbkUgNQlYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKK2xpbkUgNglBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d1h5egorbGluRSA3CVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAorbGluRSA4CUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3WHl6CitsaW5FIDkJWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCitsaW5FIDEwIEFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3WHl6CitFbmQgb2YgdGVzdGZpbGUKKworLyoKKyAqIEhFcmUgaXMgYSBORVcgLmMgZmlsZQorICovCisvKgorICogSEVyZSBpcyBhIG5ldyAuYyBmaWxlCisgKi8KK3N0YXJ0IG9mIHRFc3RmaWxlCitsaW5FIDIJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dndYeXoKK2xpbkUgMwlYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKK2xpbkUgNAlBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d1h5egorbGluRSA1CVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAorbGluRSA2CUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3WHl6CitsaW5FIDcJWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCitsaW5FIDgJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dndYeXoKK2xpbkUgOQlYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKK2xpbkUgMTAgQWJjZGVmZ2hpamtsbW5vcHFyc3R1dndYeXoKK0VuZCBvZiB0ZXN0ZmlsZQorLyoKKyAqIEhFcmUgaXMgYSBuZXcgLmMgZmlsZQorICovCitzdGFydCBvZiB0ZXN0ZmlMZQorTGluZSAyCUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitMaW5lIDMJeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitMaW5lIDQJQWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKK0xpbmUgNQl4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKK0xpbmUgNglBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorTGluZSA3CXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorTGluZSA4CUFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitMaW5lIDkJeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CitMaW5lIDEwIEFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CitlbmQgb2YgdGVzdGZpTGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxMi5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxMi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU5YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDEyLmluCkBAIC0wLDAgKzEsNTIgQEAKK1Rlc3RzIGZvciAnZGlyZWN0b3J5JyBvcHRpb24uCistICIuIiwgaW4gc2FtZSBkaXIgYXMgZmlsZQorLSAiLi9kaXIiLCBpbiBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gZmlsZQorLSAiZGlyIiwgaW4gZGlyZWN0b3J5IHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOnNldCBub2NvbXBhdGlibGUgdmltaW5mbys9bnZpbWluZm8KKzpzZXQgZGlyPS4sfgorOi9zdGFydCBvZiB0ZXN0ZmlsZS8sL2VuZCBvZiB0ZXN0ZmlsZS93ISBYdGVzdDEKKzoiIGRvIGFuIGxzIG9mIHRoZSBjdXJyZW50IGRpciB0byBmaW5kIHRoZSBzd2FwIGZpbGUgKHNob3VsZCBub3QgYmUgdGhlcmUpCis6aWYgaGFzKCJ1bml4IikKKzogICFscyAuWCouc3dwID50ZXN0Lm91dAorOmVsc2UKKzogIHIgIWxzIFgqLnN3cCA+dGVzdC5vdXQKKzplbmRpZgorOiFlY2hvIGZpcnN0IGxpbmUgPj50ZXN0Lm91dAorOmUgWHRlc3QxCis6aWYgaGFzKCJ1bml4IikKKzoiIERvIGFuIGxzIG9mIHRoZSBjdXJyZW50IGRpciB0byBmaW5kIHRoZSBzd2FwIGZpbGUsIHJlbW92ZSB0aGUgbGVhZGluZyBkb3QKKzoiIHRvIG1ha2UgdGhlIHJlc3VsdCB0aGUgc2FtZSBmb3IgYWxsIHN5c3RlbXMuCis6ICByIWxzIC5YKi5zd3AKKzogIHMvXC4qWC9YLworOiAgLncgPj50ZXN0Lm91dAorOiAgdW5kbworOmVsc2UKKzogICFscyBYKi5zd3AgPj50ZXN0Lm91dAorOmVuZGlmCis6IWVjaG8gdW5kZXIgWHRlc3QxLnN3cCA+PnRlc3Qub3V0Cis6IW1rZGlyIFh0ZXN0MgorOnNldCBkaXI9Li9YdGVzdDIsLix+Cis6ZSBYdGVzdDEKKzohbHMgWCouc3dwID4+dGVzdC5vdXQKKzohZWNobyB1bmRlciB1bmRlciA+PnRlc3Qub3V0Cis6IWxzIFh0ZXN0MiA+PnRlc3Qub3V0Cis6IWVjaG8gdW5kZXIgWHRlc3QxLnN3cCA+PnRlc3Qub3V0Cis6IW1rZGlyIFh0ZXN0LmplCis6L3N0YXJ0IG9mIHRlc3RmaWxlLywvZW5kIG9mIHRlc3RmaWxlL3chIFh0ZXN0Mi9YdGVzdDMKKzpzZXQgZGlyPVh0ZXN0LmplLH4KKzplIFh0ZXN0Mi9YdGVzdDMKKzpzd2FwCis6IWxzIFh0ZXN0MiA+PnRlc3Qub3V0Cis6IWVjaG8gdW5kZXIgWHRlc3QzID4+dGVzdC5vdXQKKzohbHMgWHRlc3QuamUgPj50ZXN0Lm91dAorOiFlY2hvIHVuZGVyIFh0ZXN0My5zd3AgPj50ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCitzdGFydCBvZiB0ZXN0ZmlsZQorbGluZSAyIEFiY2RlZmdoaWoKK2xpbmUgMyBBYmNkZWZnaGlqCitlbmQgb2YgdGVzdGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxMi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QxMi5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU2MjNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDEyLm9rCkBAIC0wLDAgKzEsMTAgQEAKK2ZpcnN0IGxpbmUKK1h0ZXN0MS5zd3AKK3VuZGVyIFh0ZXN0MS5zd3AKK3VuZGVyIHVuZGVyCitYdGVzdDEuc3dwCit1bmRlciBYdGVzdDEuc3dwCitYdGVzdDMKK3VuZGVyIFh0ZXN0MworWHRlc3QzLnN3cAordW5kZXIgWHRlc3QzLnN3cApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDEzLmluIGIvc3JjL3Rlc3RkaXIvdGVzdDEzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOGE2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTMuaW4KQEAgLTAsMCArMSw1OCBAQAorVGVzdHMgZm9yIGF1dG9jb21tYW5kcyBvbiA6Y2xvc2UgY29tbWFuZAorCitXcml0ZSB0aHJlZSBmaWxlcyBhbmQgb3BlbiB0aGVtLCBlYWNoIGluIGEgd2luZG93LgorVGhlbiBnbyB0byBuZXh0IHdpbmRvdywgd2l0aCBhdXRvY29tbWFuZCB0aGF0IGRlbGV0ZXMgdGhlIHByZXZpb3VzIG9uZS4KK0RvIHRoaXMgdHdpY2UsIHdyaXRpbmcgdGhlIGZpbGUuCisKK0Fsc28gdGVzdCBkZWxldGluZyB0aGUgYnVmZmVyIG9uIGEgVW5sb2FkIGV2ZW50LiAgSWYgdGhpcyBnb2VzIHdyb25nIHRoZXJlCit3aWxsIGJlIHRoZSBBVFRFTlRJT04gcHJvbXB0LgorCitBbHNvIHRlc3QgY2hhbmdpbmcgYnVmZmVycyBpbiBhIEJ1ZkRlbCBhdXRvY29tbWFuZC4gIElmIHRoaXMgZ29lcyB3cm9uZyB0aGVyZQorYXJlIG1sX2xpbmUgZXJyb3JzIGFuZC9vciBhIENyYXNoLgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzovXnN0YXJ0IG9mIHRlc3RmaWxlLywvXmVuZCBvZiB0ZXN0ZmlsZS93ISBYdGVzdGplMQorOi9ec3RhcnQgb2YgdGVzdGZpbGUvLC9eZW5kIG9mIHRlc3RmaWxlL3chIFh0ZXN0amUyCis6L15zdGFydCBvZiB0ZXN0ZmlsZS8sL15lbmQgb2YgdGVzdGZpbGUvdyEgWHRlc3RqZTMKKzplIFh0ZXN0amUxCitvdGVzdGplMRsKKzp3Cis6c3AgWHRlc3RqZTIKK290ZXN0amUyGworOncKKzpzcCBYdGVzdGplMworb3Rlc3RqZTMbCis6dworFxcKKzphdSBXaW5MZWF2ZSBYdGVzdGplMiBid2lwZQorFxcKKzp3ISB0ZXN0Lm91dAorOmF1IFdpbkxlYXZlIFh0ZXN0amUxIGJ3aXBlIFh0ZXN0amUzCis6Y2xvc2UKKzp3ID4+dGVzdC5vdXQKKzplIFh0ZXN0amUxCis6YndpcGUgWHRlc3RqZTIgWHRlc3RqZTMgdGVzdC5vdXQKKzphdSEKKzphdSEgQnVmVW5sb2FkIFh0ZXN0amUxIGJ3aXBlCis6ZSBYdGVzdGplMworOncgPj50ZXN0Lm91dAorOmUgWHRlc3RqZTIKKzpzcCBYdGVzdGplMQorOmUKKzp3ID4+dGVzdC5vdXQKKzphdSEKKzpvbmx5Cis6ZSBYdGVzdGplMQorOmJ3aXBlIFh0ZXN0amUyIFh0ZXN0amUzIHRlc3Qub3V0IHRlc3QxMy5pbgorOmF1IEJ1ZldpcGVvdXQgWHRlc3RqZTEgYnVmIFh0ZXN0amUxCis6YndpcGUKKzp3ID4+dGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworc3RhcnQgb2YgdGVzdGZpbGUKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDEzLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDEzLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWZjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTMub2sKQEAgLTAsMCArMSwzMCBAQAorc3RhcnQgb2YgdGVzdGZpbGUKK3Rlc3RqZTEKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQorc3RhcnQgb2YgdGVzdGZpbGUKK3Rlc3RqZTEKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQorc3RhcnQgb2YgdGVzdGZpbGUKK3Rlc3RqZTMKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQorc3RhcnQgb2YgdGVzdGZpbGUKK3Rlc3RqZTIKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQorc3RhcnQgb2YgdGVzdGZpbGUKK3Rlc3RqZTEKKwljb250ZW50cworCWNvbnRlbnRzCisJY29udGVudHMKK2VuZCBvZiB0ZXN0ZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDE0LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDE0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmI5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTQuaW4KQEAgLTAsMCArMSw2NSBAQAorVGVzdHMgZm9yICJ2YUJpQiIsIGVuZCBjb3VsZCBiZSB3cm9uZy4KK0Fsc28gdGVzdCAiOnMvcGF0L3N1Yi8iIHdpdGggZGlmZmVyZW50IH5zIGluIHN1Yi4KK0Fsc28gdGVzdCBmb3IgXlZ4ZmYgYW5kIF5WbzEyMyBpbiBJbnNlcnQgbW9kZS4KK0Fsc28gdGVzdCAiW20iLCAiXW0iLCAiW00iIGFuZCAiXU0iCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorL1N0YXJ0IGN1cnNvciBoZXJlCit2YUJpQkQ6P0J1Zz8sL1BpZWNlLy0ydyEgdGVzdC5vdXQKKy9eLSBCdWcKKzpzL3UvfnV+LworOnMvaS9+dX4vCis6cy9vL35+fi8KKzoudyA+PnRlc3Qub3V0Cis6aWYgaGFzKCJlYmNkaWMiKQorOiBsZXQgdHQgPSAib1w8Qy1WPjE5M1w8Qy1WPnhjMlw8Qy1WPm8zMDMgXDxDLVY+OTBhXDxDLVY+eGZnXDxDLVY+bzU3OFw8RXNjPiIKKzplbHNlCis6IGxldCB0dCA9ICJvXDxDLVY+NjVcPEMtVj54NDJcPEMtVj5vMTAzIFw8Qy1WPjMzYVw8Qy1WPnhmZ1w8Qy1WPm83OFw8RXNjPiIKKzplbmRpZgorOmV4ZSAibm9ybWFsICIgLiB0dAorOi53ID4+dGVzdC5vdXQKKzpzZXQgdmIKKy9eUGllY2UKKzJdbWFBGzoudyA+PnRlc3Qub3V0CitqXW1hQhs6LncgPj50ZXN0Lm91dAorXW1hQxs6LncgPj50ZXN0Lm91dAorW21hRBs6LncgPj50ZXN0Lm91dAorazJbbWFFGzoudyA+PnRlc3Qub3V0CiszW21hRhs6LncgPj50ZXN0Lm91dAorXU1hRxs6LncgPj50ZXN0Lm91dAorajJdTWFIGzoudyA+PnRlc3Qub3V0CitdTV1NYUkbOi53ID4+dGVzdC5vdXQKKzJbTWFKGzoudyA+PnRlc3Qub3V0CitrW01hSxs6LncgPj50ZXN0Lm91dAorM1tNYUwbOi53ID4+dGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworLSBCdWcgaW4gInZQUFBQIiBvbiB0aGlzIHRleHQgKFdlYmIpOgorCXsKKwkJY21kOworCQl7CisJCQljbWQ7CS8qIDwtLSBTdGFydCBjdXJzb3IgaGVyZSAqLworCQkJeworCQkJfQorCQl9CisJfQorCitQaWVjZSBvZiBKYXZhCit7CisJdHQgbTEgeworCQl0MTsKKwl9IGUxCisKKwl0dCBtMiB7CisJCXQyOworCX0gZTIKKworCXR0IG0zIHsKKwkJaWYgKHgpCisJCXsKKwkJCXQzOworCQl9CisJfSBlMworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDE0Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDE0Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTNiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTQub2sKQEAgLTAsMCArMSwxNyBAQAorLSBCdWcgaW4gInZQUFBQIiBvbiB0aGlzIHRleHQgKFdlYmIpOgorCXsKKwl9CistIEJ1ZyB1dXVuICJ2UFBQUCIgdXV1dXV1dXV1biB0aGlzIHRleHQgKFdlYmIpOgorQUJDICFhD2cHOAorCXR0IG0xIHtBCisJdHQgbTIge0IKKwl0dCBtMyB7QworCXR0IG0zIHtEQworCXR0IG0xIHtFQQore0YKKwl9RyBlMQorCX1IIGUzCit9SQorCX1KSCBlMworCX1LIGUyCit7TEYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxNS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxNS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY1MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDE1LmluCkBAIC0wLDAgKzEsMTM2IEBACitUZXN0cyBmb3IgOnJpZ2h0IG9uIHRleHQgd2l0aCBlbWJlZGRlZCBUQUIuCitBbHNvIHRlc3QgZm9ybWF0dGluZyBhIHBhcmFncmFwaC4KK0Fsc28gdGVzdCB1bmRvIGFmdGVyICI6JXMiIGFuZCBmb3JtYXR0aW5nLgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzpzZXQgdHc9NjUKKworOi9eXHMqdGVzdCBmb3IgOmxlZnQvLC9eXHMqdGVzdCBmb3IgOmNlbnRlci8gbGVmdAorOi9eXHMqdGVzdCBmb3IgOmNlbnRlci8sL15ccyp0ZXN0IGZvciA6cmlnaHQvIGNlbnRlcgorOi9eXHMqdGVzdCBmb3IgOnJpZ2h0LywvXnh4eC8tMSByaWdodAorOnNldCBmbys9dGNyb3FsIHR3PTcyCisveHh4eHh4eHgkCiswZ3E2a2sKKzpzZXQgbm9jcCB2aW1pbmZvKz1udmltaW5mbworOiIgdW5kby9yZWRvIGhlcmUgdG8gbWFrZSB0aGUgbmV4dCB1bmRvIG9ubHkgd29yayBvbiB0aGUgZm9sbG93aW5nIGNoYW5nZXMKK3USCis6bWFwIGdnIDouLC4rMnMvXi94LzxDUj5razpzZXQgdHc9MzxDUj5ncXEKKy9eYWEKK2dndQorOj90ZXN0IGZvciA6bGVmdD8sJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKKwl0ZXN0IGZvciA6bGVmdAorCSAgYQkJYQorCSAgICBmYQkJYQorCSAgZGZhCQlhCisJICAgICAgICBzZGZhCQlhCisJICBhc2RmYQkJYQorCSAgICAgICAgeGFzZGZhCQlhCithc3h4ZGZhCQlhCisKKwl0ZXN0IGZvciA6Y2VudGVyCisJICBhCQlhCisJICAgIGZhCQlhZmQgYXNkZgorCSAgZGZhCQlhCisJICAgICAgICBzZGZhCQlhZmQgYXNkZgorCSAgYXNkZmEJCWEKKwkgICAgICAgIHhhc2RmYQkJYXNkZmFzZGZhc2RmYXNkZmFzZGYKK2FzeHhkZmEJCWEKKworCXRlc3QgZm9yIDpyaWdodAorCWEJCWEKKwlmYQkJYQorCWRmYQkJYQorCXNkZmEJCWEKKwlhc2RmYQkJYQorCXhhc2RmYQkJYQorCWFzeHhkZmEJCWEKKwlhc3hhO29mYQkJYQorCWFzZGZhcXdlcgkJYQorCWEJCWF4CisJZmEJCWF4CisJZGZhCQlheAorCXNkZmEJCWF4CisJYXNkZmEJCWF4CisJeGFzZGZhCQlheAorCWFzeHhkZmEJCWF4CisJYXN4YTtvZmEJCWF4CisJYXNkZmFxd2VyCQlheAorCWEJCWF4eAorCWZhCQlheHgKKwlkZmEJCWF4eAorCXNkZmEJCWF4eAorCWFzZGZhCQlheHgKKwl4YXNkZmEJCWF4eAorCWFzeHhkZmEJCWF4eAorCWFzeGE7b2ZhCQlheHgKKwlhc2RmYXF3ZXIJCWF4eAorCWEJCWF4eHgKKwlmYQkJYXh4eAorCWRmYQkJYXh4eAorCXNkZmEJCWF4eHgKKwlhc2RmYQkJYXh4eAorCXhhc2RmYQkJYXh4eAorCWFzeHhkZmEJCWF4eHgKKwlhc3hhO29mYQkJYXh4eAorCWFzZGZhcXdlcgkJYXh4eAorCWEJCWF4eHhvCisJZmEJCWF4eHhvCisJZGZhCQlheHh4bworCXNkZmEJCWF4eHhvCisJYXNkZmEJCWF4eHhvCisJeGFzZGZhCQlheHh4bworCWFzeHhkZmEJCWF4eHhvCisJYXN4YTtvZmEJCWF4eHhvCisJYXNkZmFxd2VyCQlheHh4bworCWEJCWF4eHhvaQorCWZhCQlheHh4b2kKKwlkZmEJCWF4eHhvaQorCXNkZmEJCWF4eHhvaQorCWFzZGZhCQlheHh4b2kKKwl4YXNkZmEJCWF4eHhvaQorCWFzeHhkZmEJCWF4eHhvaQorCWFzeGE7b2ZhCQlheHh4b2kKKwlhc2RmYXF3ZXIJCWF4eHhvaQorCWEJCWF4eHhvaWsKKwlmYQkJYXh4eG9paworCWRmYQkJYXh4eG9paworCXNkZmEJCWF4eHhvaWsKKwlhc2RmYQkJYXh4eG9paworCXhhc2RmYQkJYXh4eG9paworCWFzeHhkZmEJCWF4eHhvaWsKKwlhc3hhO29mYQkJYXh4eG9paworCWFzZGZhcXdlcgkJYXh4eG9paworCWEJCWF4eHhvaWtlCisJZmEJCWF4eHhvaWtlCisJZGZhCQlheHh4b2lrZQorCXNkZmEJCWF4eHhvaWtlCisJYXNkZmEJCWF4eHhvaWtlCisJeGFzZGZhCQlheHh4b2lrZQorCWFzeHhkZmEJCWF4eHhvaWtlCisJYXN4YTtvZmEJCWF4eHhvaWtlCisJYXNkZmFxd2VyCQlheHh4b2lrZQorCWEJCWF4eHhvaWtleQorCWZhCQlheHh4b2lrZXkKKwlkZmEJCWF4eHhvaWtleQorCXNkZmEJCWF4eHhvaWtleQorCWFzZGZhCQlheHh4b2lrZXkKKwl4YXNkZmEJCWF4eHhvaWtleQorCWFzeHhkZmEJCWF4eHhvaWtleQorCWFzeGE7b2ZhCQlheHh4b2lrZXkKKwlhc2RmYXF3ZXIJCWF4eHhvaWtleQorCit4eHh4eCB4eCB4eHh4eHggCit4eHh4eHh4IHh4eHh4eHh4eCB4eHggeHh4eCB4eHh4eCB4eHh4eCB4eHggeHgKK3h4eHh4eHh4eHh4eHh4eHh4eCB4eHh4eCB4eHh4LCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eCB4eCB4eAoreHggeHh4eHh4eC4geHh4eCB4eHh4LgorCis+IHh4IHh4LCB4eHh4IHh4eHggeHh4IHh4eHggeHh4IHh4eHh4IHh4eCB4eHggeHh4eHh4eCB4eHggeHh4eHgKKz4geHh4eHh4IHh4eHh4eHg6IHh4eHggeHh4eHh4eCwgeHggeHh4eHh4IHh4eHggeHh4eHh4eHh4eAorCithYSBhYSBhYSBhYQorYmIgYmIgYmIgYmIKK2NjIGNjIGNjIGNjCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTUub2sgYi9zcmMvdGVzdGRpci90ZXN0MTUub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwOWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxNS5vawpAQCAtMCwwICsxLDExMSBAQAordGVzdCBmb3IgOmxlZnQKK2EJCWEKK2ZhCQlhCitkZmEJCWEKK3NkZmEJCWEKK2FzZGZhCQlhCit4YXNkZmEJCWEKK2FzeHhkZmEJCWEKKworCQkJdGVzdCBmb3IgOmNlbnRlcgorCQkJIGEJCWEKKwkJICAgICAgZmEJCWFmZCBhc2RmCisJCQkgZGZhCQlhCisJCSAgICBzZGZhCQlhZmQgYXNkZgorCQkJIGFzZGZhCQlhCisJICAgICAgeGFzZGZhCQlhc2RmYXNkZmFzZGZhc2RmYXNkZgorCQkJYXN4eGRmYQkJYQorCisJCQkJCQkgIHRlc3QgZm9yIDpyaWdodAorCQkJCQkJICAgICAgYQkJYQorCQkJCQkJICAgICBmYQkJYQorCQkJCQkJICAgIGRmYQkJYQorCQkJCQkJICAgc2RmYQkJYQorCQkJCQkJICBhc2RmYQkJYQorCQkJCQkJIHhhc2RmYQkJYQorCQkJCQkJYXN4eGRmYQkJYQorCQkJCQkgICAgICAgYXN4YTtvZmEJCWEKKwkJCQkJICAgICAgYXNkZmFxd2VyCQlhCisJCQkJCSAgICAgIGEJCWF4CisJCQkJCSAgICAgZmEJCWF4CisJCQkJCSAgICBkZmEJCWF4CisJCQkJCSAgIHNkZmEJCWF4CisJCQkJCSAgYXNkZmEJCWF4CisJCQkJCSB4YXNkZmEJCWF4CisJCQkJCWFzeHhkZmEJCWF4CisJCQkJICAgICAgIGFzeGE7b2ZhCQlheAorCQkJCSAgICAgIGFzZGZhcXdlcgkJYXgKKwkJCQkJICAgICAgYQkJYXh4CisJCQkJCSAgICAgZmEJCWF4eAorCQkJCQkgICAgZGZhCQlheHgKKwkJCQkJICAgc2RmYQkJYXh4CisJCQkJCSAgYXNkZmEJCWF4eAorCQkJCQkgeGFzZGZhCQlheHgKKwkJCQkJYXN4eGRmYQkJYXh4CisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHgKKwkJCQkgICAgICBhc2RmYXF3ZXIJCWF4eAorCQkJCQkgICAgICBhCQlheHh4CisJCQkJCSAgICAgZmEJCWF4eHgKKwkJCQkJICAgIGRmYQkJYXh4eAorCQkJCQkgICBzZGZhCQlheHh4CisJCQkJCSAgYXNkZmEJCWF4eHgKKwkJCQkJIHhhc2RmYQkJYXh4eAorCQkJCQlhc3h4ZGZhCQlheHh4CisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4CisJCQkJICAgICAgYXNkZmFxd2VyCQlheHh4CisJCQkJCSAgICAgIGEJCWF4eHhvCisJCQkJCSAgICAgZmEJCWF4eHhvCisJCQkJCSAgICBkZmEJCWF4eHhvCisJCQkJCSAgIHNkZmEJCWF4eHhvCisJCQkJCSAgYXNkZmEJCWF4eHhvCisJCQkJCSB4YXNkZmEJCWF4eHhvCisJCQkJCWFzeHhkZmEJCWF4eHhvCisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4bworCQkJCSAgICAgIGFzZGZhcXdlcgkJYXh4eG8KKwkJCQkJICAgICAgYQkJYXh4eG9pCisJCQkJCSAgICAgZmEJCWF4eHhvaQorCQkJCQkgICAgZGZhCQlheHh4b2kKKwkJCQkJICAgc2RmYQkJYXh4eG9pCisJCQkJCSAgYXNkZmEJCWF4eHhvaQorCQkJCQkgeGFzZGZhCQlheHh4b2kKKwkJCQkJYXN4eGRmYQkJYXh4eG9pCisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4b2kKKwkJCQkgICAgICBhc2RmYXF3ZXIJCWF4eHhvaQorCQkJCQkgICAgICBhCQlheHh4b2lrCisJCQkJCSAgICAgZmEJCWF4eHhvaWsKKwkJCQkJICAgIGRmYQkJYXh4eG9paworCQkJCQkgICBzZGZhCQlheHh4b2lrCisJCQkJCSAgYXNkZmEJCWF4eHhvaWsKKwkJCQkJIHhhc2RmYQkJYXh4eG9paworCQkJCQlhc3h4ZGZhCQlheHh4b2lrCisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4b2lrCisJCQkJICAgICAgYXNkZmFxd2VyCQlheHh4b2lrCisJCQkJCSAgICAgIGEJCWF4eHhvaWtlCisJCQkJCSAgICAgZmEJCWF4eHhvaWtlCisJCQkJCSAgICBkZmEJCWF4eHhvaWtlCisJCQkJCSAgIHNkZmEJCWF4eHhvaWtlCisJCQkJCSAgYXNkZmEJCWF4eHhvaWtlCisJCQkJCSB4YXNkZmEJCWF4eHhvaWtlCisJCQkJCWFzeHhkZmEJCWF4eHhvaWtlCisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4b2lrZQorCQkJCSAgICAgIGFzZGZhcXdlcgkJYXh4eG9pa2UKKwkJCQkJICAgICAgYQkJYXh4eG9pa2V5CisJCQkJCSAgICAgZmEJCWF4eHhvaWtleQorCQkJCQkgICAgZGZhCQlheHh4b2lrZXkKKwkJCQkJICAgc2RmYQkJYXh4eG9pa2V5CisJCQkJCSAgYXNkZmEJCWF4eHhvaWtleQorCQkJCQkgeGFzZGZhCQlheHh4b2lrZXkKKwkJCQkJYXN4eGRmYQkJYXh4eG9pa2V5CisJCQkJICAgICAgIGFzeGE7b2ZhCQlheHh4b2lrZXkKKwkJCQkgICAgICBhc2RmYXF3ZXIJCWF4eHhvaWtleQorCit4eHh4eCB4eCB4eHh4eHggeHh4eHh4eCB4eHh4eHh4eHggeHh4IHh4eHggeHh4eHggeHh4eHggeHh4IHh4Cit4eHh4eHh4eHh4eHh4eHh4eHggeHh4eHggeHh4eCwgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHggeHggeHggeHggeHh4eHh4eC4KK3h4eHggeHh4eC4KKworPiB4eCB4eCwgeHh4eCB4eHh4IHh4eCB4eHh4IHh4eCB4eHh4eCB4eHggeHh4IHh4eHh4eHggeHh4IHh4eHh4IHh4eHh4eAorPiB4eHh4eHh4OiB4eHh4IHh4eHh4eHgsIHh4IHh4eHh4eCB4eHh4IHh4eHh4eHh4eHgKKworYWEgYWEgYWEgYWEKK2JiIGJiIGJiIGJiCitjYyBjYyBjYyBjYwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDE2LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDE2LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzBkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTYuaW4KQEAgLTAsMCArMSwxMCBAQAorVGVzdHMgZm9yIHJlc2V0dGluZyAic2VjdXJlIiBmbGFnIGFmdGVyIEdVSSBoYXMgc3RhcnRlZC4KKworU1RBUlRURVNUCis6c2V0IGV4cmMgc2VjdXJlCis6Z3VpIC1mCis6LiwkdyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworCWp1c3Qgc29tZSB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTYub2sgYi9zcmMvdGVzdGRpci90ZXN0MTYub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlMmVlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxNi5vawpAQCAtMCwwICsxLDIgQEAKKworCWp1c3Qgc29tZSB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTcuaW4gYi9zcmMvdGVzdGRpci90ZXN0MTcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5MTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxNy5pbgpAQCAtMCwwICsxLDI3IEBACitUZXN0cyBmb3IgImdmIiBvbiAke1ZBUn0KKworU1RBUlRURVNUCis6c28gc21hbGwudmltCis6aWYgaGFzKCJlYmNkaWMiKQorOiBzZXQgaXNmbmFtZT1ALDI0MC0yNDksLywuLC0sXywrLCwsJCw6LH4seyx9Cis6ZWxzZQorOiBzZXQgaXNmbmFtZT1ALDQ4LTU3LC8sLiwtLF8sKywsLCQsOix+LHssfQorOmVuZGlmCis6aWYgaGFzKCJ1bml4IikKKzpsZXQgJENESVIgPSAiLiIKKy9DRElSCis6ZWxzZQorOmlmIGhhcygiYW1pZ2EiKQorOmxldCAkVERJUiA9ICIvdGVzdGRpciIKKzplbHNlCis6bGV0ICRURElSID0gIi4iCis6ZW5kaWYKKy9URElSCis6ZW5kaWYKK2dmCis6dyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworCSR7Q0RJUn0vdGVzdDE3YS5pbgorCSRURElSL3Rlc3QxN2EuaW4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxNy5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QxNy5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGMzNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDE3Lm9rCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBmaWxlIGlzIGp1c3QgdG8gdGVzdCAiZ2YiIGluIHRlc3QgMTcuCitUaGUgY29udGVudHMgaXMgbm90IGltcG9ydGVudC4KK0p1c3QgdGVzdGluZyEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxN2EuaW4gYi9zcmMvdGVzdGRpci90ZXN0MTdhLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzM1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MTdhLmluCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBmaWxlIGlzIGp1c3QgdG8gdGVzdCAiZ2YiIGluIHRlc3QgMTcuCitUaGUgY29udGVudHMgaXMgbm90IGltcG9ydGVudC4KK0p1c3QgdGVzdGluZyEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxOC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZkOTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDE4LmluCkBAIC0wLDAgKzEsMTYgQEAKK1Rlc3RzIGZvciBub3QgZG9pbmcgc21hcnQgaW5kZW50aW5nIHdoZW4gaXQgaXNuJ3Qgc2V0LgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzpzZXQgbm9jaW4gbm9zaSBhaQorL3NvbWUKKzJjYyN0ZXN0GworOj9zdGFydD8sJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKK3N0YXJ0IHRleHQKKwkJc29tZSB0ZXN0IHRleHQKKwkJdGVzdCB0ZXh0Cit0ZXN0IHRleHQKKwkJdGVzdCB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTgub2sgYi9zcmMvdGVzdGRpci90ZXN0MTgub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxOTcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxOC5vawpAQCAtMCwwICsxLDQgQEAKK3N0YXJ0IHRleHQKKwkJI3Rlc3QKK3Rlc3QgdGV4dAorCQl0ZXN0IHRleHQKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QxOS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QxOS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDliNDIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDE5LmluCkBAIC0wLDAgKzEsMjMgQEAKK1Rlc3RzIGZvciAicjxUYWI+IiB3aXRoICdzbWFydHRhYicgYW5kICdleHBhbmR0YWInIHNldC9ub3Qgc2V0LgorCitTVEFSVFRFU1QKKzpzZXQgc21hcnR0YWIgZXhwYW5kdGFiIHRzPTggc3c9NAorL3NvbWUKK3IJOnNldCBub2V4cGFuZHRhYgorL290aGVyCityCQorOiIgVGVzdCByZXBsYWNpbmcgd2l0aCBUYWJzIGFuZCB0aGVuIGJhY2tzcGFjaW5nIHRvIHVuZG8gaXQKKzB3UgkJCQgICBsKKzoiIFRlc3QgcmVwbGFjaW5nIHdpdGggVGFicworMHdSCQkJGworOj9ec3RhcnQ/LCR3ISB0ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCitzdGFydCB0ZXh0CisJCXNvbWUgdGVzdCB0ZXh0Cit0ZXN0IHRleHQKKwkJb3RoZXIgdGVzdCB0ZXh0CisgICAgYSBjZGUKKyAgICBmIGdoaQordGVzdCB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MTkub2sgYi9zcmMvdGVzdGRpci90ZXN0MTkub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0ZWI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QxOS5vawpAQCAtMCwwICsxLDcgQEAKK3N0YXJ0IHRleHQKKwkJICAgIG9tZSB0ZXN0IHRleHQKK3Rlc3QgdGV4dAorCQkgICAgdGhlciB0ZXN0IHRleHQKKyAgICBhIGNkZQorICAgIAkJaGkKK3Rlc3QgdGV4dApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDIuaW4gYi9zcmMvdGVzdGRpci90ZXN0Mi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I1YTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDIuaW4KQEAgLTAsMCArMSwyOSBAQAorCitUaGlzIGlzIGEgdGVzdCBpZiBhIFVSTCBpcyByZWNvZ25pemVkIGJ5ICJnZiIsIHdpdGggdGhlIGN1cnNvciBiZWZvcmUgYW5kCithZnRlciB0aGUgIjovLyIuICBBbHNvIHRlc3QgIjpcXCIuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorL15maXJzdAorL3RtcAorOmNhbGwgYXBwZW5kKDAsIGV4cGFuZCgiPGNmaWxlPiIpKQorL15zZWNvbmQKKy9VUkwKKzpjYWxsIGFwcGVuZCgxLCBleHBhbmQoIjxjZmlsZT4iKSkKKzppZiBoYXMoImViY2RpYyIpCis6IHNldCBpc2Y9QCwyNDAtMjQ5LC8sLiwtLF8sKywsLCQsOix+LFwKKzplbHNlCis6IHNldCBpc2Y9QCw0OC01NywvLC4sLSxfLCssLCwkLDosfixcCis6ZW5kaWYKKy9edGhpcmQKKy9uYW1lCis6Y2FsbCBhcHBlbmQoMiwgZXhwYW5kKCI8Y2ZpbGU+IikpCisvXmZvdXJ0aAorL1VSTAorOmNhbGwgYXBwZW5kKDMsIGV4cGFuZCgiPGNmaWxlPiIpKQorNUdkRzp3cSEgdGVzdC5vdXQKK0VORFRFU1QKK2ZpcnN0IHRlc3QgZm9yIFVSTDovL21hY2hpbmUubmFtZS90bXAvdmltdGVzdDJhIGFuZCBvdGhlciB0ZXh0CitzZWNvbmQgdGVzdCBmb3IgVVJMOi8vbWFjaGluZS5uYW1lL3RtcC92aW10ZXN0MmIuIEFuZCBvdGhlciB0ZXh0Cit0aGlyZCB0ZXN0IGZvciBVUkw6XFxtYWNoaW5lLm5hbWVcdmltdGVzdDJjIGFuZCBvdGhlciB0ZXh0Citmb3VydGggdGVzdCBmb3IgVVJMOlxcbWFjaGluZS5uYW1lXHRtcFx2aW10ZXN0MmQsIGFuZCBvdGhlciB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0Mi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QyLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTc4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0Mi5vawpAQCAtMCwwICsxLDQgQEAKK1VSTDovL21hY2hpbmUubmFtZS90bXAvdmltdGVzdDJhCitVUkw6Ly9tYWNoaW5lLm5hbWUvdG1wL3ZpbXRlc3QyYgorVVJMOlxcbWFjaGluZS5uYW1lXHZpbXRlc3QyYworVVJMOlxcbWFjaGluZS5uYW1lXHRtcFx2aW10ZXN0MmQKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QyMC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QyMC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjAxYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDIwLmluCkBAIC0wLDAgKzEsMjIgQEAKK1Rlc3RzIEJsb2Nrd2lzZSBWaXN1YWwgd2hlbiB0aGVyZSBhcmUgVEFCcyBiZWZvcmUgdGhlIHRleHQuCitGaXJzdCB0ZXN0IGZvciB1bmRvIHdvcmtpbmcgcHJvcGVybHkgd2hlbiBleGVjdXRpbmcgY29tbWFuZHMgZnJvbSBhIHJlZ2lzdGVyLgorQWxzbyB0ZXN0IHRoaXMgaW4gYW4gZW1wdHkgYnVmZmVyLgorCitTVEFSVFRFU1QKKzpzbyB0aW55LnZpbQorRzAiYXkka0BhdQorOm5ldworQGF1WTpxdWl0IQorR1AKKy9zdGFydCBoZXJlJAorFmpqbGxkCis6L2hlcmUkLywkLTF3ISB0ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCit0ZXN0IHRleHQgdGVzdCB0ZXggc3RhcnQgaGVyZQorCQlzb21lIHRleHQKKwkJdGVzdCB0ZXh0Cit0ZXN0IHRleHQKKworT3gbakF5G2tkZApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDIwLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDIwLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDRlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjAub2sKQEAgLTAsMCArMSw2IEBACit0ZXN0IHRleHQgdGVzdCB0ZXggcnQgaGVyZQorCQlzb21leHQKKwkJdGVzZXh0Cit0ZXN0IHRleHQKKworCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjEuaW4gYi9zcmMvdGVzdGRpci90ZXN0MjEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxYjlmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyMS5pbgpAQCAtMCwwICsxLDE5IEBACitUZXN0cyBmb3IgWyBDVFJMLUkgd2l0aCBhIGNvdW50IGFuZCBDVFJMLVcgQ1RSTC1JIHdpdGggYSBjb3VudAorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKy9zdGFydAorNlsJOi53ISB0ZXN0Lm91dAorP3N0YXJ0IGhlcmUKKzYXCToudyA+PnRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKKyNpbmNsdWRlIHRlc3QyMS5pbgorCisvKiB0ZXN0IHRleHQgdGVzdCB0ZXggc3RhcnQgaGVyZQorCQlzb21lIHRleHQKKwkJdGVzdCB0ZXh0CisJCXN0YXJ0IE9LIGlmIGZvdW5kIHRoaXMgbGluZQorCXN0YXJ0IGZvdW5kIHdyb25nIGxpbmUKK3Rlc3QgdGV4dApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDIxLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDIxLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjFiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjEub2sKQEAgLTAsMCArMSwyIEBACisJCXN0YXJ0IE9LIGlmIGZvdW5kIHRoaXMgbGluZQorCQlzdGFydCBPSyBpZiBmb3VuZCB0aGlzIGxpbmUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QyMi5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QyMi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNjMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDIyLmluCkBAIC0wLDAgKzEsMTMgQEAKK1Rlc3RzIGZvciBmaWxlIHdpdGggc29tZSBsaW5lcyBlbmRpbmcgaW4gQ1RSTC1NLCBzb21lIG5vdA0KKw0KK1NUQVJUVEVTVAorOnNldCB0YSB0eAorOmUhCis6JC0zLCR3ISB0ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCit0aGlzIGxpbmVzIGVuZHMgaW4gYQ0KK3RoaXMgb25lIGRvZXNuJ3QKK3RoaXMgb25lIGRvZXMNCithbmQgdGhlIGxhc3Qgb25lIGRvZXNuJ3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QyMi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QyMi5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZmODllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDIyLm9rCkBAIC0wLDAgKzEsNCBAQAordGhpcyBsaW5lcyBlbmRzIGluIGENCit0aGlzIG9uZSBkb2Vzbid0Cit0aGlzIG9uZSBkb2VzDQorYW5kIHRoZSBsYXN0IG9uZSBkb2Vzbid0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjMuaW4gYi9zcmMvdGVzdGRpci90ZXN0MjMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwZTYwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyMy5pbgpAQCAtMCwwICsxLDE1IEBACitUZXN0cyBmb3IgY29tcGxpY2F0ZWQgKyBhcmd1bWVudCB0byA6ZWRpdCBjb21tYW5kCisKK1NUQVJUVEVTVAorOiQtMXchIFhmaWxlMQorOiR3ISBYZmlsZTIKKzplZGl0ICsxfHMvfC9QSVBFL3x3IFhmaWxlMXwgZSBYZmlsZTJ8MSB8IHMvXC8vU0xBU0gvfHcKKzp3ISB0ZXN0Lm91dAorOmUgWGZpbGUxCis6dyA+PiB0ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCitUaGUgcmVzdWx0IHNob3VsZCBiZSBpbiBYZmlsZTE6ICJmb29QSVBFYmFyIiwgaW4gWGZpbGUyOiAiZm9vU0xBU0hiYXIiCitmb298YmFyCitmb28vYmFyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjMub2sgYi9zcmMvdGVzdGRpci90ZXN0MjMub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5MzBhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyMy5vawpAQCAtMCwwICsxLDIgQEAKK2Zvb1NMQVNIYmFyCitmb29QSVBFYmFyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjQuaW4gYi9zcmMvdGVzdGRpci90ZXN0MjQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MjFkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyNC5pbgpAQCAtMCwwICsxLDIxIEBACitUZXN0cyBmb3IgcmVnZXhwIHdpdGggYmFja3NsYXNoIGFuZCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgaW5zaWRlIFtdCisKK1NUQVJUVEVTVAorOnNldCBub2NvbXBhdGlibGUgdmltaW5mbys9bnZpbWluZm8KKy9bXHhdCit4L1tcdFxdXQoreC9bXXldCit4L1tcXV0KK3gvW3leXQoreC9bJHldCit4Oj9zdGFydD8sJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKK3N0YXJ0Cit0ZXN0IFx0ZXh0IHRlc3QgdGV4dAordGVzdCAJdGV4dCB0ZXN0IHRleHQKK3Rlc3QgdGV4dCBddGVzdCB0ZXh0Cit0ZXN0IF10ZXh0IHRlc3QgdGV4dAordGVzdCB0ZXh0IHRlXnN0IHRleHQKK3Rlc3QgdGUkeHQgdGVzdCB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjQub2sgYi9zcmMvdGVzdGRpci90ZXN0MjQub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2YjUwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyNC5vawpAQCAtMCwwICsxLDcgQEAKK3N0YXJ0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0Cit0ZXN0IHRleHQgdGVzdCB0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjUuaW4gYi9zcmMvdGVzdGRpci90ZXN0MjUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzOTg2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyNS5pbgpAQCAtMCwwICsxLDMxIEBACitUZXN0IGZvciBqdW1waW5nIHRvIGEgdGFnIHdpdGggJ2hpZGRlbicgc2V0LCB3aXRoIHN5bWJvbGljIGxpbmsgaW4gcGF0aCBvZiB0YWcuCitUaGlzIG9ubHkgd29ya3MgZm9yIFVuaXgsIGJlY2F1c2Ugb2YgdGhlIHN5bWJvbGljIGxpbmsuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOnNldCBoaWRkZW4KKzoiIENyZWF0ZSBhIGxpbmsgZnJvbSB0ZXN0MjUuZGlyIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKzohcm0gLWYgdGVzdDI1LmRpcgorOiFsbiAtcyAuIHRlc3QyNS5kaXIKKzoiIENyZWF0ZSB0YWdzLnRleHQsIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG5hbWUgaW5zZXJ0ZWQuCisvdGFncyBsaW5lCis6ciAhcHdkCitkJC90ZXN0CitoUDoudyEgdGFncy50ZXN0Cis6IiBUcnkganVtcGluZyB0byBhIHRhZyBpbiB0aGUgY3VycmVudCBmaWxlLCBidXQgd2l0aCBhIHBhdGggdGhhdCBjb250YWlucyBhCis6IiBzeW1ib2xpYyBsaW5rLiAgV2hlbiB3cm9uZywgdGhpcyB3aWxsIGdpdmUgdGhlIEFUVEVOVElPTiBtZXNzYWdlLiAgVGhlIG5leHQKKzoiIHNwYWNlIHdpbGwgdGhlbiBiZSBlYXRlbiBieSBoaXQtcmV0dXJuLCBpbnN0ZWFkIG9mIG1vdmluZyB0aGUgY3Vyc29yIHRvICdkJy4KKzpzZXQgdGFncz10YWdzLnRlc3QKK0cdIHg6LnchIHRlc3Qub3V0Cis6IXJtIC1mIHRlc3QyNS5kaXIgdGFncy50ZXN0Cis6cWEhCitFTkRURVNUCisKK3RhZ3MgbGluZToKK1NFQ1RJT05fT0ZGCS90ZXN0MjUuZGlyL3Rlc3QyNS5pbgkvXiNkZWZpbmUgIFNFQ1RJT05fT0ZGICAzJC8KKworLyp0eC5jKi8KKyNkZWZpbmUgIFNFQ1RJT05fT0ZGICAzCisjZGVmaW5lICBOVU1fU0VDVElPTlMgMworCitTRUNUSU9OX09GRgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDI1Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDI1Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZmMwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjUub2sKQEAgLTAsMCArMSBAQAorI2VmaW5lICBTRUNUSU9OX09GRiAgMwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDI2LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDI2LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjYuaW4KQEAgLTAsMCArMSw0MyBAQAorVGVzdCBmb3IgOmV4ZWN1dGUsIDp3aGlsZSBhbmQgOmlmCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorbXQ6bGV0IGkgPSAwCis6d2hpbGUgaSA8IDEyCis6ICBsZXQgaSA9IGkgKyAxCis6ICBpZiBoYXMoImViY2RpYyIpCis6ICAgIGV4ZWN1dGUgIm5vcm1hbCBvIiAuIGkgLiAiXDA0NyIKKzogIGVsc2UKKzogICAgZXhlY3V0ZSAibm9ybWFsIG8iIC4gaSAuICJcMDMzIgorOiAgZW5kaWYKKzogIGlmIGkgJSAyCis6ICAgIG5vcm1hbCBBeBYbCis6ICAgIGlmIGkgPT0gOQorOiAgICAgIGJyZWFrCis6ICAgIGVuZGlmCis6ICAgIGlmIGkgPT0gNQorOiAgICAgIGNvbnRpbnVlCis6ICAgIGVsc2UKKzogICAgICBsZXQgaiA9IDkKKzogICAgICB3aGlsZSBqID4gMAorOiAgICAgICAgaWYgaGFzKCJlYmNkaWMiKQorOiAgICAgICAgICBleGVjdXRlICJub3JtYWwiIGogLiAiYSIgLiBqIC4gIlx4MjciCis6ICAgICAgICBlbHNlCis6ICAgICAgICAgIGV4ZWN1dGUgIm5vcm1hbCIgaiAuICJhIiAuIGogLiAiXHgxYiIKKzogICAgICAgIGVuZGlmCis6ICAgICAgICBsZXQgaiA9IGogLSAxCis6ICAgICAgZW5kd2hpbGUKKzogICAgZW5kaWYKKzogIGVuZGlmCis6ICBpZiBpID09IDkKKzogICAgaWYgaGFzKCJlYmNkaWMiKQorOiAgICAgIGV4ZWN1dGUgIm5vcm1hbCBBelwwNDciCis6ICAgIGVsc2UKKzogICAgICBleGVjdXRlICJub3JtYWwgQXpcMDMzIgorOiAgICBlbmRpZgorOiAgZW5kaWYKKzplbmR3aGlsZQorOid0LCR3ISB0ZXN0Lm91dAorOnFhIQorRU5EVEVTVAorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjYub2sgYi9zcmMvdGVzdGRpci90ZXN0MjYub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NDc2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyNi5vawpAQCAtMCwwICsxLDEwIEBACisKKzF4OTk5OTk5OTk5ODg4ODg4ODg3Nzc3Nzc3NjY2NjY2NTU1NTU0NDQ0MzMzMjIxCisyCiszeDk5OTk5OTk5OTg4ODg4ODg4Nzc3Nzc3NzY2NjY2NjU1NTU1NDQ0NDMzMzIyMQorNAorNXgKKzYKKzd4OTk5OTk5OTk5ODg4ODg4ODg3Nzc3Nzc3NjY2NjY2NTU1NTU0NDQ0MzMzMjIxCis4Cis5eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDI3LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDI3LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZjE2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjcuaW4KQEAgLTAsMCArMSwyMCBAQAorVGVzdCBmb3IgZXhwYW5kaW5nIGZpbGUgbmFtZXMKKworU1RBUlRURVNUCis6IW1rZGlyIFhkaXIxCis6IW1rZGlyIFhkaXIyCis6IW1rZGlyIFhkaXIzCis6Y2QgWGRpcjMKKzohbWtkaXIgWGRpcjQKKzpjZCAuLgorOncgWGRpcjEvZmlsZQorOncgWGRpcjMvWGRpcjQvZmlsZQorOm4gWGRpcj8vKi9maWxlCitHbxIlGzoudyEgdGVzdC5vdXQKKzpuISBYZGlyPy8qL25vZmlsZQorR28SJRs6LncgPj50ZXN0Lm91dAorOmUhIHh4Cis6IXJtIC1yZiBYZGlyMSBYZGlyMiBYZGlyMworOnFhIQorRU5EVEVTVAorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0Mjcub2sgYi9zcmMvdGVzdGRpci90ZXN0Mjcub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1ZjI0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyNy5vawpAQCAtMCwwICsxLDIgQEAKK1hkaXIzL1hkaXI0L2ZpbGUKK1hkaXI/Lyovbm9maWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MjguaW4gYi9zcmMvdGVzdGRpci90ZXN0MjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MmM5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyOC5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0Mjgub2sgYi9zcmMvdGVzdGRpci90ZXN0Mjgub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExZDg1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QyOC5vawpAQCAtMCwwICsxLDIgQEAKK3NkCittYXAgX18yIGFzZBtzZWNvbmRzZBtzZDBtYXAgX181IGFzZDBmaWZ0aApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDI5LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDI5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTNjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MjkuaW4KQEAgLTAsMCArMSw2NyBAQAorVGVzdCBmb3Igam9pbmluZyBsaW5lcyB3aXRoICdqb2luc3BhY2VzJyBzZXQgb3Igbm90CisKK1NUQVJUVEVTVAorOnNldCBub2pvaW5zcGFjZXMKKy9maXJzdGxpbmUvCitqSmpKakpqSmpKakpqSmpKakpqSmpKakpqSmpKOnNldCBqb2luc3BhY2VzCitqSmpKakpqSmpKakpqSmpKakpqSmpKakpqSmpKOj9maXJzdGxpbmU/KzEsJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKK2ZpcnN0bGluZQorYXNkZmFzZGYuCithc2RmCithc2RmYXNkZi4gCithc2RmCithc2RmYXNkZi4gIAorYXNkZgorYXNkZmFzZGYuCQorYXNkZgorYXNkZmFzZGYuIAkKK2FzZGYKK2FzZGZhc2RmLgkgCithc2RmCithc2RmYXNkZi4JCQorYXNkZgorYXNkZmFzZGYKK2FzZGYKK2FzZGZhc2RmIAorYXNkZgorYXNkZmFzZGYgIAorYXNkZgorYXNkZmFzZGYJCithc2RmCithc2RmYXNkZgkgCithc2RmCithc2RmYXNkZiAJCithc2RmCithc2RmYXNkZgkJCithc2RmCithc2RmYXNkZi4KK2FzZGYKK2FzZGZhc2RmLiAKK2FzZGYKK2FzZGZhc2RmLiAgCithc2RmCithc2RmYXNkZi4JCithc2RmCithc2RmYXNkZi4gCQorYXNkZgorYXNkZmFzZGYuCSAKK2FzZGYKK2FzZGZhc2RmLgkJCithc2RmCithc2RmYXNkZgorYXNkZgorYXNkZmFzZGYgCithc2RmCithc2RmYXNkZiAgCithc2RmCithc2RmYXNkZgkKK2FzZGYKK2FzZGZhc2RmCSAKK2FzZGYKK2FzZGZhc2RmIAkKK2FzZGYKK2FzZGZhc2RmCQkKK2FzZGYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QyOS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QyOS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZmNzdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDI5Lm9rCkBAIC0wLDAgKzEsMjggQEAKK2FzZGZhc2RmLiBhc2RmCithc2RmYXNkZi4gYXNkZgorYXNkZmFzZGYuICBhc2RmCithc2RmYXNkZi4JYXNkZgorYXNkZmFzZGYuIAlhc2RmCithc2RmYXNkZi4JIGFzZGYKK2FzZGZhc2RmLgkJYXNkZgorYXNkZmFzZGYgYXNkZgorYXNkZmFzZGYgYXNkZgorYXNkZmFzZGYgIGFzZGYKK2FzZGZhc2RmCWFzZGYKK2FzZGZhc2RmCSBhc2RmCithc2RmYXNkZiAJYXNkZgorYXNkZmFzZGYJCWFzZGYKK2FzZGZhc2RmLiAgYXNkZgorYXNkZmFzZGYuICBhc2RmCithc2RmYXNkZi4gIGFzZGYKK2FzZGZhc2RmLglhc2RmCithc2RmYXNkZi4gCWFzZGYKK2FzZGZhc2RmLgkgYXNkZgorYXNkZmFzZGYuCQlhc2RmCithc2RmYXNkZiBhc2RmCithc2RmYXNkZiBhc2RmCithc2RmYXNkZiAgYXNkZgorYXNkZmFzZGYJYXNkZgorYXNkZmFzZGYJIGFzZGYKK2FzZGZhc2RmIAlhc2RmCithc2RmYXNkZgkJYXNkZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDMuaW4gYi9zcmMvdGVzdGRpci90ZXN0My5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDcyNWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMuaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDMub2sgYi9zcmMvdGVzdGRpci90ZXN0My5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBmOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMub2sKQEAgLTAsMCArMSwxMDkwIEBACisvKiBzdGFydCBvZiBBVVRPIG1hdGljYWxseSBjaGVja2VkICovCit7CisJaWYgKHRlc3QpCisJCWNtZDE7CisJY21kMjsKK30KKworeworCWlmICh0ZXN0KQorCQljbWQxOworCWVsc2UKKwkJY21kMjsKK30KKworeworCWlmICh0ZXN0KQorCXsKKwkJY21kMTsKKwkJY21kMjsKKwl9Cit9CisKK3sKKwlpZiAodGVzdCkKKwl7CisJCWNtZDE7CisJCWVsc2UKKwl9Cit9CisKK3sKKwl3aGlsZSAodGhpcykKKwkJaWYgKHRlc3QpCisJCQljbWQxOworCWNtZDI7Cit9CisKK3sKKwl3aGlsZSAodGhpcykKKwkJaWYgKHRlc3QpCisJCQljbWQxOworCQllbHNlCisJCQljbWQyOworfQorCit7CisJaWYgKHRlc3QpCisJeworCQljbWQ7CisJfQorCisJaWYgKHRlc3QpCisJCWNtZDsKK30KKworeworCWlmICh0ZXN0KSB7CisJCWNtZDsKKwl9CisKKwlpZiAodGVzdCkgY21kOworfQorCit7CisJY21kMTsKKwlmb3IgKGJsYWgpCisJCXdoaWxlICh0aGlzKQorCQkJaWYgKHRlc3QpCisJCQkJY21kMjsKKwljbWQzOworfQorCit7CisJY21kMTsKKwlmb3IgKGJsYWgpCisJCXdoaWxlICh0aGlzKQorCQkJaWYgKHRlc3QpCisJCQkJY21kMjsKKwljbWQzOworCisJaWYgKHRlc3QpCisJeworCQljbWQxOworCQljbWQyOworCQljbWQzOworCX0KK30KKworCisvKiBUZXN0IGZvciAnY2luZGVudCcgZG8vd2hpbGUgbWl4ZWQgd2l0aCBpZi9lbHNlOiAqLworCit7CisJZG8KKwkJaWYgKGFzZGYpCisJCQlhc2RmYXNkOworCXdoaWxlIChjb25kKTsKKworCWRvCisJCWlmIChhc2RmKQorCQkJd2hpbGUgKGFzZGYpCisJCQkJYXNkZjsKKwl3aGlsZSAoYXNkZik7Cit9CisKKy8qIFRlc3QgZm9yICdjaW5kZW50JyB3aXRoIHR3byApIG9uIGEgY29udGludWF0aW9uIGxpbmUgKi8KK3sKKwlpZiAoYXNkZmFzZGY7YXNsZGtmaiBhc2Rsa2ZqIGFzO2xka2ZqIHNhbDtkCisJCQlhYWw7c2RramYgICggO2FzbGRma2phO3NsZGZrCisJCQkJYWw7c2RqZmthIDtzbGtkZiApIHNhO2xka2pmc2EgZGxrOykKKwkJbGluZSB1cCBoZXJlOworfQorCisKKy8qIEMrKyB0ZXN0czogKi8KKworLy8gZm9vKCkJCXRoZXNlIHRocmVlIGxpbmVzIHNob3VsZCByZW1haW4gaW4gY29sdW1uIDAKKy8vIHsKKy8vIH0KKworLyogVGVzdCBmb3IgY29udGludWF0aW9uIGFuZCB1bnRlcm1pbmF0ZWQgbGluZXM6ICovCit7CisJaSA9IDk5ICsgMTQzMjUgKworCQkyMTM0NSArCisJCTIxMzQ1ICsKKwkJMjEzNDUgKyAoIDIxMzQ1ICsKKwkJCQkyMTM0NSkgKworCQkyMzQ1ICsKKwkJMTIzNDsKKwljID0gMTsKK30KKworLyoKKyAgIHRlc3RqZSBmb3IgaW5kZW50IHdpdGggZW1wdHkgbGluZQorCisgICBoZXJlICovCisKK3sKKwlpZiAodGVzdGluZyAmJgorCQkJbm90IGEgam9rZSB8fAorCQkJbGluZSB1cCBoZXJlKQorCQloYXk7CisJaWYgKHRlc3RpbmcgJiYKKwkJCShub3QgYSBqb2tlIHx8IHRlc3RpbmcKKwkJCSlsaW5lIHVwIGhlcmUpCisJCWhheTsKKwlpZiAodGVzdGluZyAmJgorCQkJKG5vdCBhIGpva2UgfHwgdGVzdGluZworCQkJIGxpbmUgdXAgaGVyZSkpCisJCWhheTsKK30KKworCit7CisJc3dpdGNoIChjKQorCXsKKwkJY2FzZSB4eDoKKwkJCWRvCisJCQkJaWYgKGFzZGYpCisJCQkJCWRvCisJCQkJCQlhc2RmYXNkZjsKKwkJCQkJd2hpbGUgKGFzZGYpOworCQkJCWVsc2UKKwkJCQkJYXNkZmFzZGY7CisJCQl3aGlsZSAoY29uZCk7CisJCWNhc2UgeXk6CisJCWNhc2UgeHg6CisJCWNhc2Ugeno6CisJCQl0ZXN0aW5nOworCX0KK30KKworeworCWlmIChjb25kKSB7CisJCWZvbzsKKwl9CisJZWxzZQorCXsKKwkJYmFyOworCX0KK30KKworeworCWlmIChhbHNrZGZqIDthbHNka2ZqYWw7c2tkamYgKDtzYWRsa2ZzYSA7ZGxrZiBqO2Fsa3NkZmogO2Fsc2tkamYKKwkJCQlhbHNka2ZqIChhc2xkaztmagorCQkJCQlhd2l0aCBjaW5vPSgwIDtsZiB0aGlzIG9uZSBnb2VzIHRvIGJlbG93IHRoZSBwYXJlbiB3aXRoID09CisJCQkJCQk7bGFrc2pmZCA7bHNha2RqZiA7YWxza2RmIGFzZCkKKwkJCQkJYXNkZmFzZGY7KSkpCisJCWFzZGZhc2RmOworfQorCisJaW50CitmdW5jKGEsIGIpCisJaW50IGE7CisJaW50IGM7Cit7CisJaWYgKGMxICYmIChjMiB8fAorCQkJCWMzKSkKKwkJZm9vOworCWlmIChjMSAmJgorCQkJKGMyIHx8IGMzKQorCSAgICkKK30KKworeworCXdoaWxlIChhc2QpCisJeworCQlpZiAoYXNkZikKKwkJCWlmICh0ZXN0KQorCQkJCWlmICh0aGF0KQorCQkJCXsKKwkJCQkJaWYgKGFzZGYpCisJCQkJCQlkbworCQkJCQkJCWNkYXNkOworCQkJCQkJd2hpbGUgKGFzCisJCQkJCQkJCWRmKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlpZiAoYXNkZikKKwkJCQkJCWFzZGY7CisJCQkJCWVsc2UKKwkJCQkJCWFzZGY7CisJCWFzZGY7CisJfQorfQorCit7CisJcyA9ICIvKiI7IGIgPSAnOycKKwkJcyA9ICIvKiI7IGIgPSAnOyc7CisJYSA9IGI7Cit9CisKK3sKKwlzd2l0Y2ggKGEpCisJeworCQljYXNlIGE6CisJCQlzd2l0Y2ggKHQpCisJCQl7CisJCQkJY2FzZSAxOgorCQkJCQljbWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJY21kOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWNtZDsKKwkJCWJyZWFrOworCQljYXNlIGI6CisJCQl7CisJCQkJaW50IGk7CisJCQkJY21kOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgYzogeworCQkJCQlpbnQgaTsKKwkJCQkJY21kOworCQkJCX0KKwkJY2FzZSBkOiBpZiAoY29uZCAmJgorCQkJCQkJdGVzdCkgewkJLyogdGhpcyBsaW5lIGRvZXNuJ3Qgd29yayByaWdodCAqLworCQkJCQlpbnQgaTsKKwkJCQkJY21kOworCQkJCX0KKwkJCQlicmVhazsKKwl9Cit9CisKK3sKKwlpZiAoISh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlVGT1BUR0xPQikgIT0gTlVMTCAmJiBlbnRlcmluZykgJiYKKwkJCShicF90by0+Yl9wX2luaXRpYWxpemVkIHx8CisJCQkgKCFlbnRlcmluZyAmJiB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlVGT1BUKSAhPSBOVUxMKSkpCisJCXJldHVybjsKK2xhYmVsIDoKKwlhc2RmID0gYXNkZiA/CisJCWFzZGYgOiBhc2RmOworCWFzZGYgPSBhc2RmID8KKwkJYXNkZjogYXNkZjsKK30KKworLyogU3BlY2lhbCBDb21tZW50cwk6IFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBhZGRlZCBjb21wbGV4aXR5IChjb21wYXJlZCAgKi8KKy8qCQkJCQk6IHRvIGFkZHRvbGlzdCkgb2YgaGF2aW5nIHRvIGNoZWNrIGZvciBhIGRldGFpbCAgICAgKi8KKy8qCQkJCQk6IHRleHR1cmUgYW5kIGFkZCB0aGF0IHRvIHRoZSBsaXN0IGZpcnN0LgkgCSAgICAqLworCitjaGFyICooYXJyYXlbMTAwXSkgPSB7CisJInRlc3RqZSIsCisJImZvbyIsCisJImJhciIsCit9CisKK2VudW0gc29wcGllCit7CisJeWVzID0gMCwKKwlubywKKwltYXliZQorfTsKKwordHlwZWRlZiBlbnVtIHNvcHBpZQoreworCXllcyA9IDAsCisJbm8sCisJbWF5YmUKK307CisKK3sKKwlpbnQgYSwKKwkJYjsKK30KKworeworCXN0cnVjdCBUeXBlCisJeworCQlpbnQgaTsKKwkJY2hhciAqc3RyOworCX0gdmFyW10gPQorCXsKKwkJMCwgInplcm8iLAorCQkxLCAib25lIiwKKwkJMiwgInR3byIsCisJCTMsICJ0aHJlZSIKKwl9OworCisJZmxvYXQgbWF0cml4WzNdWzNdID0KKwl7CisJCXsKKwkJCTAsCisJCQkxLAorCQkJMgorCQl9LAorCQl7CisJCQkzLAorCQkJNCwKKwkJCTUKKwkJfSwKKwkJeworCQkJNiwKKwkJCTcsCisJCQk4CisJCX0KKwl9OworfQorCit7CisJLyogYmxhaCAoIGJsYWggKi8KKwkvKiB3aGVyZSBkb2VzIHRoaXMgZ28/ICovCisKKwkvKiBibGFoICggYmxhaCAqLworCWNtZDsKKworCWZ1bmMoYXJnMSwKKwkJCS8qIGNvbW1lbnQgKi8KKwkJCWFyZzIpOworCWE7CisJeworCQliOworCQl7CisJCQljOyAvKiBIZXksIE5PVyBpdCBpbmRlbnRzPyEgKi8KKwkJfQorCX0KKworCXsKKwkJZnVuYyhhcmcxLAorCQkJCWFyZzIsCisJCQkJYXJnMyk7CisJCS8qIEhleSwgd2hhdCBhbSBJIGRvaW5nIGhlcmU/ICBJcyB0aGlzIGNveiBvZiB0aGUgIiwiPyAqLworCX0KK30KKworbWFpbiAoKQoreworCWlmIChjb25kKQorCXsKKwkJYSA9IGI7CisJfQorCWlmIChjb25kKSB7CisJCWEgPSBjOworCX0KKwlpZiAoY29uZCkKKwkJYSA9IGQ7CisJcmV0dXJuOworfQorCit7CisJY2FzZSAyOiBpZiAoYXNkZiAmJgorCQkJCQlhc2RmYXNkZikKKwkJCQlhYXNkZjsKKwkJCWEgPSA5OworCWNhc2UgMzogaWYgKGFzZGYpCisJCQkJYWFzZGY7CisJCQlhID0gOTsKKwljYXNlIDQ6ICAgIHggPSAxOworCQkJICAgeSA9IDI7CisKK2xhYmVsOglpZiAoYXNkZikKKwkJCWhlcmU7CisKK2xhYmVsOiAgaWYgKGFzZGYgJiYKKwkJCQlhc2RmYXNkZikKKwkJeworCQl9CisKK2xhYmVsOiAgaWYgKGFzZGYgJiYKKwkJCQlhc2RmYXNkZikgeworCQkJdGhlcmU7CisJCX0KKworbGFiZWw6ICBpZiAoYXNkZiAmJgorCQkJCWFzZGZhc2RmKQorCQkJdGhlcmU7Cit9CisKK3sKKwkvKgorCSAgIGhlbGxvIHdpdGggIjpzZXQgY29tbWVudHM9IGNpbm89YzUiCisJICovCisKKwkvKgorCSAgIGhlbGxvIHdpdGggIjpzZXQgY29tbWVudHM9IGNpbm89IgorCSAqLworfQorCisKK3sKKwlpZiAoYSA8IGIpIHsKKwkJYSA9IGEgKyAxOworCX0gZWxzZQorCQlhID0gYSArIDI7CisKKwlpZiAoYSkKKwkJZG8geworCQkJdGVzdGluZzsKKwkJfSB3aGlsZSAoYXNkZmFzZGYpOworCWEgPSBiICsgMTsKKwlhc2RmYXNkZgorfQorCitjbGFzcyBib2IKK3sKKwlpbnQgZm9vKCkge3JldHVybiAxO30KKwlpbnQgYmFyOworfQorCittYWluKCkKK3sKKwl3aGlsZSgxKQorCQlpZiAoZm9vKQorCQl7CisJCQliYXI7CisJCX0KKwkJZWxzZSB7CisJCQlhc2RmOworCQl9CisJbWlzcGxhY2VkbGluZTsKK30KKworeworCWlmIChjbGlwYm9hcmQuc3RhdGUgPT0gU0VMRUNUX0RPTkUKKwkJCSYmICgocm93ID09IGNsaXBib2FyZC5zdGFydC5sbnVtCisJCQkJCSYmIGNvbCA+PSBjbGlwYm9hcmQuc3RhcnQuY29sKQorCQkJCXx8IHJvdyA+IGNsaXBib2FyZC5zdGFydC5sbnVtKSkKK30KKworeworCWlmICgxKSB7aSArPSA0O30KKwl3aGVyZV9hbV9pOworCXJldHVybiAwOworfQorCit7CisJeworCX0gLy8gc2RmKGFzZGYKKwlpZiAoYXNkZikKKwkJYXNkOworfQorCit7CitsYWJlbDE6CitsYWJlbDI6Cit9CisKK3sKKwlpbnQgZm9vUmV0ID0gZm9vKHBCYXIxLCBmYWxzZSAvKmZLQiovLAorCQkJdHJ1ZSAvKmZQVEIqLywgMyAvKm5UKi8sIGZhbHNlIC8qZkRGKi8pOworCWYoKSB7CisJCWZvciAoIGkgPSAwOworCQkJCWkgPCBtOworCQkJCS8qIGMgKi8gaSsrICkgeworCQkJYSA9IGI7CisJCX0KKwl9Cit9CisKK3sKKwlmMSgvKmNvbW1lbnQqLyk7CisJZjIoKTsKK30KKworeworCWRvIHsKKwkJaWYgKGZvbykgeworCQl9IGVsc2UKKwkJCTsKKwl9IHdoaWxlIChmb28pOworCWZvbygpOwkvLyB3YXMgd3JvbmcKK30KKworaW50IHg7CSAgICAvLyBubyBleHRyYSBpbmRlbnQgYmVjYXVzZSBvZiB0aGUgOwordm9pZCBmdW5jKCkKK3sKK30KKworY2hhciAqdGFiW10gPSB7ImFhYSIsCisJIn07IiwgLyogfTsgKi8gTlVMTH0KKwlpbnQgaW5kZW50ZWQ7Cit7fQorCitjaGFyICphW10gPSB7ImFhYSIsICJiYmIiLAorCSJjY2MiLCBOVUxMfTsKKy8vIGhlcmUKKworY2hhciAqdGFiW10gPSB7ImFhYSIsCisJInh4IiwgLyogeHggKi99OyAgICAvKiBhc2RmICovCitpbnQgbm90X2luZGVudGVkOworCit7CisJZG8geworCQlzd2l0Y2ggKGJsYSkKKwkJeworCQkJY2FzZSAxOiBpZiAoZm9vKQorCQkJCQkJYmFyOworCQl9CisJfSB3aGlsZSAoYm9vKTsKKwl3cm9uZzsKK30KKworaW50CWZvbywKKwliYXI7CitpbnQgZm9vOworCisjaWYgZGVmaW5lZChmb28pIFwKKwkmJiBkZWZpbmVkKGJhcikKK2NoYXIgKiB4eCA9ICJhc2RmXAorCQkJIGZvb1wKKwkJCSBib3IiOworaW50IHg7CisKK2NoYXIgICAgKmZvbyA9ICJhc2RmXAorCQkJCWFzZGZcCisJCQkJYXNkZiIsCisJCSpiYXI7CisKK3ZvaWQgZigpCit7CisjaWYgZGVmaW5lZChmb28pIFwKKwkmJiBkZWZpbmVkKGJhcikKKwljaGFyICAgICpmb28gPSAiYXNkZlwKKwkJCQkJYXNkZlwKKwkJCQkJYXNkZiIsCisJCQkqYmFyOworCXsKKwkJaW50IGk7CisJCWNoYXIgICAgKmZvbyA9ICJhc2RmXAorCQkJCQkJYXNkZlwKKwkJCQkJCWFzZGYiLAorCQkJCSpiYXI7CisJfQorI2VuZGlmCit9CisjZW5kaWYKKworaW50IHk7CQkvLyBjb21tZW50CisvLyBjb21tZW50CisKKy8vIGNvbW1lbnQKKworeworCUNvbnN0cnVjdG9yKGludCBhLAorCQkJaW50IGIgKSAgOiBCYXNlQ2xhc3MoYSkKKwl7CisJfQorfQorCit2b2lkIGZvbygpCit7CisJY2hhciBvbmUsCisJCSB0d287CisJc3RydWN0IGJsYSBwaWV0LAorCQkJICAgamFuOworCWVudW0gZm9vIGtlZXMsCisJCQkgamFubmllOworCXN0YXRpYyB1bnNpZ25lZCBzZGYsCisJCQkJCWtyYXA7CisJdW5zaWduZWQgaW50IHBpZXQsCisJCQkJIGphbjsKKwlpbnQKKwkJa2VlcywKKwkJamFuOworfQorCit7CisJdChpbnQgZiwKKwkJCWludCBkKTsJCS8vICkKKwlkKCk7Cit9CisKK0NvbnN0cnVjdG9yOjpDb25zdHJ1Y3RvcihpbnQgYSwKKwkJaW50IGIgCisJCSkgIDogCisJQmFzZUNsYXNzKGEsCisJCQliLAorCQkJYyksCisJbU1lbWJlcihiKSwKK3sKK30KKworQ29uc3RydWN0b3I6OkNvbnN0cnVjdG9yKGludCBhLAorCQlpbnQgYiApICA6IAorCUJhc2VDbGFzcyhhKQoreworfQorCitDb25zdHJ1Y3Rvcjo6Q29uc3RydWN0b3IoaW50IGEsCisJCWludCBiICkgLyp4Ki8gOiAvKngqLyBCYXNlQ2xhc3MoYSksCisJCQkJCQkJICBtZW1iZXIoYikKK3sKK30KKworY2xhc3MgQ0FiYyA6CisJcHVibGljIEJhc2VDbGFzczEsCisJcHJvdGVjdGVkIEJhc2VDbGFzczIKK3sKKwlpbnQgVGVzdCgpIHsgcmV0dXJuIEZBTFNFOyB9CisJaW50IFRlc3QxKCkgeyByZXR1cm4gVFJVRTsgfQorCisJQ0FiYyhpbnQgYSwgaW50IGIgKSAgOiAKKwkJQmFzZUNsYXNzKGEpCisJeyAKKwkJc3dpdGNoKHh4eCkKKwkJeworCQkJY2FzZSBhYmM6CisJCQkJYXNkZigpOworCQkJCWJyZWFrOworCisJCQljYXNlIDk5OToKKwkJCQliYWVyKCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdWJsaWM6IC8vIDwtLSB0aGlzIHdhcyBpbmNvcmVlY3RseSBpbmRlbnRlZCBiZWZvcmUhIQorCXZvaWQgdGVzdGZhbGwoKTsKKwlwcm90ZWN0ZWQ6CisJdm9pZCB0ZXN0ZmFsbCgpOworfTsKKworY2xhc3MgQ0FiYyA6IHB1YmxpYyBCYXNlQ2xhc3MxLAorCQkJIHByb3RlY3RlZCBCYXNlQ2xhc3MyCit7Cit9OworCitzdGF0aWMgc3RydWN0Cit7CisJaW50IGE7CisJaW50IGI7Cit9IHZhcmlhYmxlW0NPVU5UXSA9Cit7CisJeworCQkxMjMsCisJCTQ1NgorCX0sCisJeworCQkxMjMsCisJCTQ1NgorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlpbnQgYTsKKwlpbnQgYjsKK30gdmFyaWFibGVbQ09VTlRdID0KK3sKKwl7IDEyMywgNDU2IH0sCisJeyAxMjMsIDQ1NiB9Cit9OworCit2b2lkIGFzZGYoKQkJLyogaW5kX21heHBhcmVuIG1heSBjYXVzZSB0cm91YmxlIGhlcmUgKi8KK3sKKwlpZiAoKDAKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxCisJCQkJJiYgMQorCQkJCSYmIDEKKwkJCQkmJiAxKSkgYnJlYWs7Cit9CisKKy8qIGVuZCBvZiBBVVRPICovCisKKworeworCisvKiB0aGlzIGlzCisgKiBhIHJlYWwgc2VyaW91cworICogYWJvdXQgbGlmZSwgdGhlCisgKiB1bml2ZXJzZSwgYW5kIHRoZQorICogcmVzdCBpbXBvcnRhbnQgYmlnCisgKiBjb21tZW50CisgKi8KKwkvKiBpbnNlcnQgIiBhYm91dCBsaWZlLCB0aGUgdW5pdmVyc2UsIGFuZCB0aGUgcmVzdCIgYWZ0ZXIgInNlcmlvdXMiICovCit9CisKKworeworCS8qCisJICogVGVzdGluZyBmb3IgY29tbWVudHMsIHdpdGhvdXQgJ2Npbicgc2V0CisJICovCithYm91dCBsaWZlCisKKy8qCisqIHdoYXQgaGFwcGVucyBoZXJlPworKi8KK3RoZXJlCisKKwkvKgorCSAgIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQsIHRyeSBpbnNlcnRpbmcgYSBsaW5lIGJlbG93ICovCitsaW5lCisKKwkJLyogaG93IGFib3V0CitoZWxsbworCQkgICAgICAgICAgICAgICAgdGhpcyBvbmUgKi8KK30KKworCit7CisgICAgdmFyID0gdGhpcyArIHRoYXQgKyB2ZWNbMF0gKiB2ZWNbMF0KKwkJCQkgICAgICArIHZlY1sxXSAqIHZlY1sxXQorCQkJCQkgICsgdmVjMlsyXSAqIHZlY1syXTsKK30KKworCit7CisJCWFzZGYgYXNkZmxrYWpkcyBmOworCWlmICh0ZXMgJiB0aW5nKSB7CisJCWFzZGYgYXNkZiBhc2RmIDsKKwkJYXNkZmEgc2RmIGFzZGY7CisJCX0KKwl0ZXN0aW5nMTsKKwlpZiAodGVzICYgdGluZykKKwl7CisJCWFzZGYgYXNkZiBhc2RmIDsKKwkJYXNkZmEgc2RmIGFzZGY7CisJCX0KKwl0ZXN0aW5nMjsKK30KKworCittYWluICggaW50IGZpcnN0X3BhciwgLyoKKwkJCQkJICAgKiBDb21tZW50IGZvcgorCQkJCQkgICAqIGZpcnN0IHBhcgorCQkJCQkgICAqLworCSAgIGludCBzZWNvbmRfcGFyIC8qCisJCQkJCSAgICogQ29tbWVudCBmb3IKKwkJCQkJICAgKiBzZWNvbmQgcGFyCisJCQkJCSAgICovCisJICkKK3sKKwlmdW5jKCBmaXJzdF9wYXIsIC8qCisJCQkJCSAgKiBDb21tZW50IGZvcgorCQkJCQkgICogZmlyc3QgcGFyCisJCQkJCSAgKi8KKwkJICBzZWNvbmRfcGFyIC8qCisJCQkJCSAgKiBDb21tZW50IGZvcgorCQkJCQkgICogc2Vjb25kIHBhcgorCQkJCQkgICovCisJCSk7CisKK30KKworCit7CisJZG8KKwl7CisJCWlmICgpCisJCXsKKwkJCWlmICgpCisJCQkJYXNkZjsKKwkJCWVsc2UKKwkJCQlhc2RmOworCQl9CisJfSB3aGlsZSAoKTsKKwljbWQ7CQkvKiB0aGlzIHNob3VsZCBnbyB1bmRlciB0aGUgfSAqLworfQorCisKK3ZvaWQgZigpCit7CisJaWYgKCBrKCkgKSB7CisJCWwoKTsKKworCX0gZWxzZSB7IC8qIFN0YXJ0ICh0d28gd29yZHMpIGVuZCAqLworCQltKCk7CisJfQorCisJbigpOworfQorCisKK3ZvaWQgZigpCisJeworCWlmICggaygpICkKKwkJeworCQlsKCk7CisJCX0gZWxzZSB7IC8qIFN0YXJ0ICh0d28gd29yZHMpIGVuZCAqLworCQltKCk7CisJCX0KKwluKCk7CS8qIHNob3VsZCBiZSB1bmRlciB0aGUgaWYgKCkgKi8KK30KKworCit2b2lkIGJhcih2b2lkKQorCXsKKwlzdGF0aWMgYXJyYXlbMl1bMl0gPQorCQl7CisJCQl7IDEsIDIgfSwKKwkJCXsgMywgNCB9LAorCQl9CisKKwl3aGlsZSAoYSkKKwkJeworCQlmb28oJmEpOworCQl9CisKKwkJeworCQlpbnQgYTsKKwkJCXsKKwkJCWEgPSBhICsgMTsKKwkJCX0KKwkJfQorCWIgPSBhOworCX0KKwordm9pZCBmdW5jKHZvaWQpCisJeworCWEgPSAxOworCQl7CisJCWIgPSAyOworCQl9CisJYyA9IDM7CisJZCA9IDQ7CisJfQorLyogZm9vICovCisKKworYSgpCit7CisgIGRvIHsKKyAgICBhID0gYSArCisgICAgICBhOworICB9IHdoaWxlICggYSApOwkJLyogYWRkIHRleHQgdW5kZXIgdGhpcyBsaW5lICovCisgIGhlcmUKKyAgICBpZiAoIGEgKQorICAgICAgYTsKK30KKworCithKCkKK3sKK2xhYmVsMToKKyAgICAgICAgICAgIC8qIGhtbSAqLworICAgICAgICAgICAgLy8gY29tbWVudAorbGFiZWwyOiBiKCk7CitsYWJlbDMgLyogcG9zdCAqLzoKKy8qIHByZSAqLyBsYWJlbDQ6CisJCWYoLypjb20qLyk7CisJCWlmICgvKmNvbSovKQorCQkJY21kKCk7Cit9CisKKworLyoKKyAqIEEgc2ltcGxlIGNvbW1lbnQKKyAqLworCisvKgorKiogQSBkaWZmZXJlbnQgY29tbWVudAorKi8KKworCit2b2lkIGYoKQoreworCisJLyoqKioqKioqKgorCSAgQSBjb21tZW50LgorCSoqKioqKioqKi8KK30KKworCit2b2lkIGYoKQoreworCisJLyoqKioqKioqKgorCUEgY29tbWVudC4KKwkqKioqKioqKiovCit9CisKKwordm9pZCBmKCkKK3sKKwljID0gYzEgJiYKKwkJKAorCQkgYzIgfHwKKwkJIGMzCisJCSkgJiYgYzQ7Cit9CisKKwordm9pZCBmKCkKK3sKKwljID0gYzEgJiYKKwkJKAorCQkgYzIgfHwKKwkJIGMzCisJCSkgJiYgYzQ7Cit9CisKKwordm9pZCBmKCkKK3sKKwljID0gYzEgJiYKKwkJKAorCQkJYzIgfHwKKwkJCWMzCisJCSkgJiYgYzQ7Cit9CisKKwordm9pZCBmKCkKK3sKKwlpZiAoICAgYzEKKwkJICAgJiYgKCAgIGMyCisJCQkJICB8fCBjMykpCisJCWZvbzsKK30KKworCit2b2lkIGYoKQoreworCWlmICggICBjMQorCQkmJiAoICAgYzIKKwkJCXx8IGMzKSkKKwkJZm9vOworfQorCisKK3ZvaWQgZigpCit7CisJYyA9IGMxICYmICgKKwkJYzIgfHwKKwkJYzMKKwkJKSAmJiBjNDsKKwlpZiAoCisJCWMxICYmIGMyCisJICAgKQorCQlmb287Cit9CisKKwordm9pZCBmKCkKK3sKKwljID0gYzEgJiYgKAorCQljMiB8fAorCQljMworCSkgJiYgYzQ7CisJaWYgKAorCQljMSAmJiBjMgorCSkKKwkJZm9vOworfQorCisKK3ZvaWQgZigpCit7CisJc3dpdGNoICh4KQorCXsKKwkJY2FzZSAxOgorCQkJYSA9IGI7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYSA9IDA7CisJCWJyZWFrOworCX0KK30KKworCit2b2lkIGYoKQoreworCWludm9rZW1lKAorCQkgYXJndSwKKwkJIG1lbnQpOworCWludm9rZW1lKAorCQkgYXJndSwKKwkJIG1lbnQKKwkJICk7CisJaW52b2tlbWUoYXJndSwKKwkJCSBtZW50CisJCQkpOworfQorCisKK3ZvaWQgZigpCit7CisJc3RhdGVtZW50OworCQkgIC8vIGNvbW1lbnQgMQorCQkgIC8vIGNvbW1lbnQgMgorfQorCisKK3ZvaWQgZigpCit7CisJc3RhdGVtZW50OworCSAgIC8vIGNvbW1lbnQgMQorCSAgIC8vIGNvbW1lbnQgMgorfQorCisKK2NsYXNzIENBYmMKK3sKKwlpbnQgVGVzdCgpIHsgcmV0dXJuIEZBTFNFOyB9CisKK3B1YmxpYzogLy8gY29tbWVudAorCXZvaWQgdGVzdGZhbGwoKTsKK3Byb3RlY3RlZDoKKwl2b2lkIHRlc3RmYWxsKCk7Cit9OworCisKK3sKKwlhdmVyeWxvbmdmdW5jdGlvbm5hbWVsb25nZnVuY3Rpb25uYW1lYXZlcnlsb25nZnVuY3Rpb25uYW1lKCktPmFzZCgKKwkJCWFzZGFzZGYsCisJCQlmdW5jKGFzZGYsCisJCQkJIGFzZGZhZHNmKSwKKwkJCWFzZGZhc2RmCisJCQkpOworCisJLyogdGhvc2UgYXJlIHVnbHksIGJ1dCBjb25zZXF1ZW50ICovCisKKwlmdW5jKCktPmFzZChhc2Rhc2RmLAorCQkJCWF2ZXJ5bG9uZ2Z1bmN0aW9ubmFtZSgKKwkJCQkJCWFiYywKKwkJCQkJCWRlYyktPmF2ZXJ5bG9uZ2Z1bmN0aW9ubmFtZSgKKwkJCQkJCQkJYXNkZmFkc2YsCisJCQkJCQkJCWFzZGZhc2RmLAorCQkJCQkJCQlhc2RmYXNkZiwKKwkJCQkJCQkJKSwKKwkJCQlmdW5jKGFzZGZhZGYsCisJCQkJCSBhc2RmYXNkZgorCQkJCQkpLAorCQkJCWFzZGFzZGYKKwkJCSAgICk7CisKKwlhdmVyeWxvbmdmdW5jdGlvbm5hbWVhdmVyeWxvbmdmdW5jdGlvbm5hbWVhdmVyeSgpLT5hc2QoZmFzZGYoCisJCQkJCWFiYywKKwkJCQkJZGVjKS0+YXNkZmFzZGZhc2RmKAorCQkJCQkJCWFzZGZhZHNmLAorCQkJCQkJCWFzZGZhc2RmLAorCQkJCQkJCWFzZGZhc2RmLAorCQkJCQkJCSksCisJCQlmdW5jKGFzZGZhZGYsCisJCQkJIGFzZGZhc2RmKSwKKwkJCWFzZGFzZGYKKwkJCSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzMC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QzMC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkyNzQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMwLmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzMC5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzMC5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjk0NDgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMwLm9rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzMS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QzMS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRkMDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMxLmluCkBAIC0wLDAgKzEsNjggQEAKK1Rlc3QgZm9yIGNvbW1hbmRzIHRoYXQgY2xvc2Ugd2luZG93cyBhbmQvb3IgYnVmZmVyczoKKzpxdWl0Cis6Y2xvc2UKKzpoaWRlCis6b25seQorOnNhbGwKKzphbGwKKzpiYWxsCis6YnVmCis6ZWRpdAorCitTVEFSVFRFU1QKKzpzbyB0aW55LnZpbQorR0EgMRs6JHchIFh0ZXN0MQorJHIyOiR3ISBYdGVzdDIKKyRyMzokdyEgWHRlc3QzCis6biEgWHRlc3QxIFh0ZXN0MgorQSAxGzpzZXQgaGlkZGVuCis6IiB0ZXN0IGZvciB3b3JraW5nIDpuIHdoZW4gaGlkZGVuIHNldDsgd3JpdGUgInRlc3R0ZXh0IDIiCis6bgorOnchIHRlc3Qub3V0Cis6IiB0ZXN0IGZvciBmYWlsaW5nIDpyZXcgd2hlbiBoaWRkZW4gbm90IHNldDsgd3JpdGUgInRlc3R0ZXh0IDIgMiIKKzpzZXQgbm9oaWRkZW4KK0EgMhs6cmV3Cis6dyA+PnRlc3Qub3V0Cis6IiB0ZXN0IGZvciB3b3JraW5nIDpyZXcgd2hlbiBoaWRkZW4gc2V0OyB3cml0ZSAidGVzdHRleHQgMSAxIgorOnNldCBoaWRkZW4KKzpyZXcKKzp3ID4+dGVzdC5vdXQKKzoiIHRlc3QgZm9yIDphbGwga2VlcGluZyBhIGJ1ZmZlciB3aGVuIGl0J3MgbW9kaWZpZWQ7IHdyaXRlICJ0ZXN0dGV4dCAxIDEgMSIKKzpzZXQgbm9oaWRkZW4KK0EgMRs6c3AKKzpuIFh0ZXN0MiBYdGVzdDMKKzphbGwKKzp3ID4+dGVzdC5vdXQKKzoiIHRlc3QgYWJhbmRvbmluZyBjaGFuZ2VkIGJ1ZmZlciwgc2hvdWxkIGJlIHVubG9hZGVkIGV2ZW4gd2hlbiAnaGlkZGVuJyBzZXQKKzoiIHdyaXRlICJ0ZXN0dGV4dCAyIDIiIHR3aWNlCis6c2V0IGhpZGRlbgorQSAxGzpxIQorOncgPj50ZXN0Lm91dAorOnVuaGlkZQorOncgPj50ZXN0Lm91dAorOiIgdGVzdCAiOmhpZGUiIGhpZGVzIGFueXdheSB3aGVuICdoaWRkZW4nIG5vdCBzZXQ7IHdyaXRlICJ0ZXN0dGV4dCAzIgorOnNldCBub2hpZGRlbgorQSAyGzpoaWRlCis6dyA+PnRlc3Qub3V0Cis6IiB0ZXN0ICI6ZWRpdCIgZmFpbGluZyBpbiBtb2RpZmllZCBidWZmZXIgd2hlbiAnaGlkZGVuJyBub3Qgc2V0Cis6IiB3cml0ZSAidGVzdHRleHQgMyAzIgorQSAzGzplIFh0ZXN0MQorOncgPj50ZXN0Lm91dAorOiIgdGVzdCAiOmVkaXQiIHdvcmtpbmcgaW4gbW9kaWZpZWQgYnVmZmVyIHdoZW4gJ2hpZGRlbicgc2V0OyB3cml0ZSAidGVzdHRleHQgMSIKKzpzZXQgaGlkZGVuCis6ZSBYdGVzdDEKKzp3ID4+dGVzdC5vdXQKKzoiIHRlc3QgIjpjbG9zZSIgbm90IGhpZGluZyB3aGVuICdoaWRkZW4nIG5vdCBzZXQgaW4gbW9kaWZpZWQgYnVmZmVyOworOiIgd3JpdGUgInRlc3R0ZXh0IDMgMyAzIgorOnNwIFh0ZXN0MworOnNldCBub2hpZGRlbgorQSAzGzpjbG9zZQorOncgPj50ZXN0Lm91dAorOiIgdGVzdCAiOmNsb3NlISIgZG9lcyBoaWRlIHdoZW4gJ2hpZGRlbicgbm90IHNldCBpbiBtb2RpZmllZCBidWZmZXI7Cis6IiB3cml0ZSAidGVzdHRleHQgMSIKK0EgMxs6Y2xvc2UhCis6dyA+PnRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKK3Rlc3R0ZXh0CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MzEub2sgYi9zcmMvdGVzdGRpci90ZXN0MzEub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QzMS5vawpAQCAtMCwwICsxLDExIEBACit0ZXN0dGV4dCAyCit0ZXN0dGV4dCAyIDIKK3Rlc3R0ZXh0IDEgMQordGVzdHRleHQgMSAxIDEKK3Rlc3R0ZXh0IDIgMgordGVzdHRleHQgMiAyCit0ZXN0dGV4dCAzCit0ZXN0dGV4dCAzIDMKK3Rlc3R0ZXh0IDEKK3Rlc3R0ZXh0IDMgMyAzCit0ZXN0dGV4dCAxCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MzIuaW4gYi9zcmMvdGVzdGRpci90ZXN0MzIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1NDA1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QzMi5pbgpAQCAtMCwwICsxLDU2IEBACitUZXN0IGZvciBpbnNlcnQgZXhwYW5zaW9uCisKKzpzZSBjcHQ9Lix3CisqIGFkZC1leHBhbmRzICh3b3JkIGZyb20gbmV4dCBsaW5lKSBmcm9tIG90aGVyIHdpbmRvdworKiBhZGQtZXhwYW5kcyAoY3VycmVudCBidWZmZXIgZmlyc3QpCisqIExvY2FsIGV4cGFuc2lvbiwgZW5kcyBpbiBhbiBlbXB0eSBsaW5lICh1bmxlc3MgaXQgYmVjb21lcyBhIGdsb2JhbCBleHBhbnNpb24pCisqIHN0YXJ0cyBMb2NhbCBhbmQgc3dpdGNoZXMgdG8gZ2xvYmFsIGFkZC1leHBhbnNpb24KKzpzZSBjcHQ9Lix3LGkKKyogaS1hZGQtZXhwYW5kcyBhbmQgc3dpdGNoZXMgdG8gbG9jYWwKKyogYWRkLWV4cGFuZHMgbGluZXMgKGl0IHdvdWxkIGVuZCBpbiBhbiBlbXB0eSBsaW5lIGlmIGl0IGRpZG4ndCBpZ25vcmVkIGl0IHNlbGYpCis6c2UgY3B0PWtYdGVzdGZpbGUKKyogY2hlY2tzIGstZXhwYW5zaW9uLCBhbmQgZmlsZSBleHBhbnNpb24gKHVzZSBYdGVzdDExIGluc3RlYWQgb2YgdGVzdDExLAorKiBiZWNhdXNlIFRFU1QxMS5PVVQgbWF5IG1hdGNoIGZpcnN0IG9uIERPUykKKzpzZSBjcHQ9dworKiBjaGVja3MgbWFrZV9jeWNsaWMgaW4gb3RoZXIgd2luZG93Cis6c2UgY3B0PXUgbm9oaWQKKyogY2hlY2tzIHVubG9hZGVkIGJ1ZmZlciBleHBhbnNpb24KKyogY2hlY2tzIGFkZGluZyBtb2RlIGFib3J0aW9uCis6c2UgY3B0PXQsZAorKiB0YWcgZXhwYW5zaW9uLCBkZWZpbmUgYWRkLWV4cGFuc2lvbiBpbnRlcnJ1cHRlZAorKiB0LWV4cGFuc2lvbgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzpzZSBub2NwIHZpbWluZm8rPW52aW1pbmZvIGNwdD0uLHcgZmY9dW5peCB8ICQtMiwkdyFYdGVzdGZpbGUgfCBzZXQgZmYmCisXbk8jaW5jbHVkZSAiWHRlc3RmaWxlIgorcnUODhgOGwEKK08QGA4KKxgQEBAQEAorGBAQGBgOGA4OGworOnNlIGNwdD0uLHcsaQora09NDhgOGA4YGBgQCisYDBgMEBAbCis6c2UgY3B0PWtYdGVzdGZpbGUKKzp3IFh0ZXN0MTEub25lCis6dyBYdGVzdDExLnR3bworTw4bSVgbQRgGDhsKKzpzZSBjcHQ9dworT1NUDhAQEBAbCis6c2UgY3B0PXUgbm9oaWQKKxdvT0VODgordW5sDhgYEBsKKzpzZSBjcHQ9dCxkIGRlZj1eXFxrKiB0YWdzPVh0ZXN0ZmlsZSBub3RhZ2JzZWFyY2gKK08YHRgEGAQYGAQYBBgEGAQKK2EOGworOndxISB0ZXN0Lm91dAorRU5EVEVTVAorCitzdGFydCBvZiB0ZXN0ZmlsZQorcnVuMQorcnVuMgorZW5kIG9mIHRlc3RmaWxlCisKK3Rlc3QxMQkzNkdlcGV0bwkvVGFnLworYXNkCXRlc3QxMWZpbGUJMzZHCitNYWtlZmlsZQl0bwlydW4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzMi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzMi5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM0NDYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMyLm9rCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICJYdGVzdGZpbGUiCitydW4xIHJ1bjMKK3J1bjMgcnVuMworCitNYWtlZmlsZQl0bwlydW4zCitNYWtlZmlsZQl0bwlydW4zCitNYWtlZmlsZQl0bwlydW4zCitYdGVzdDExLnR3bworU1RBUlRURVNUCitFTkRURVNUCit1bmxlc3MKK3Rlc3QxMWZpbGUJMzZHZXBldG8JL1RhZy8gYXNkCithc2QKK3J1bjEgcnVuMgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MzMuaW4gYi9zcmMvdGVzdGRpci90ZXN0MzMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0NDc2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QzMy5pbgpAQCAtMCwwICsxLDM0IEBACitUZXN0IGZvciAnbGlzcCcKK0lmIHRoZSBsaXNwIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHRoaXMgd2lsbCBmYWlsIQorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzpzZXQgbGlzcAorL14oZGVmdW4KKz1HOi9eKGRlZnVuLywkdyEgdGVzdC5vdXQKKzpxIQorRU5EVEVTVAorCisoZGVmdW4gaHRtbC1maWxlIChiYXNlKQorKGZvcm1hdCBuaWwgIn4ofkF+KS5odG1sIiBiYXNlKSkKKworKGRlZm1hY3JvIHBhZ2UgKG5hbWUgdGl0bGUgJnJlc3QgYm9keSkKKyhsZXQgKCh0aSAoZ2Vuc3ltKSkpCitgKHdpdGgtb3Blbi1maWxlICgqc3RhbmRhcmQtb3V0cHV0KgorKGh0bWwtZmlsZSAsbmFtZSkKKzpkaXJlY3Rpb24gOm91dHB1dAorOmlmLWV4aXN0cyA6c3VwZXJzZWRlKQorKGxldCAoKCx0aSAsdGl0bGUpKQorKGFzIHRpdGxlICx0aSkKKyh3aXRoIGNlbnRlciAKKyhhcyBoMiAoc3RyaW5nLXVwY2FzZSAsdGkpKSkKKyhicnMgMykKKyxAYm9keSkpKSkKKworOzs7IFV0aWxpdGllcyBmb3IgZ2VuZXJhdGluZyBsaW5rcworCisoZGVmbWFjcm8gd2l0aC1saW5rIChkZXN0ICZyZXN0IGJvZHkpCitgKHByb2duCisoZm9ybWF0IHQgIjxhIGhyZWY9XCJ+QVwiPiIgKGh0bWwtZmlsZSAsZGVzdCkpCissQGJvZHkKKyhwcmluYyAiPC9hPiIpKSkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzMy5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzMy5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkODdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDMzLm9rCkBAIC0wLDAgKzEsMjMgQEAKKyhkZWZ1biBodG1sLWZpbGUgKGJhc2UpCisgIChmb3JtYXQgbmlsICJ+KH5BfikuaHRtbCIgYmFzZSkpCisKKyhkZWZtYWNybyBwYWdlIChuYW1lIHRpdGxlICZyZXN0IGJvZHkpCisgIChsZXQgKCh0aSAoZ2Vuc3ltKSkpCisgICAgICAgYCh3aXRoLW9wZW4tZmlsZSAoKnN0YW5kYXJkLW91dHB1dCoKKwkJCSAoaHRtbC1maWxlICxuYW1lKQorCQkJIDpkaXJlY3Rpb24gOm91dHB1dAorCQkJIDppZi1leGlzdHMgOnN1cGVyc2VkZSkKKwkJCShsZXQgKCgsdGkgLHRpdGxlKSkKKwkJCSAgICAgKGFzIHRpdGxlICx0aSkKKwkJCSAgICAgKHdpdGggY2VudGVyIAorCQkJCSAgIChhcyBoMiAoc3RyaW5nLXVwY2FzZSAsdGkpKSkKKwkJCSAgICAgKGJycyAzKQorCQkJICAgICAsQGJvZHkpKSkpCisKKzs7OyBVdGlsaXRpZXMgZm9yIGdlbmVyYXRpbmcgbGlua3MKKworKGRlZm1hY3JvIHdpdGgtbGluayAoZGVzdCAmcmVzdCBib2R5KQorICBgKHByb2duCisgICAgKGZvcm1hdCB0ICI8YSBocmVmPVwifkFcIj4iIChodG1sLWZpbGUgLGRlc3QpKQorICAgICxAYm9keQorICAgIChwcmluYyAiPC9hPiIpKSkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzNC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QzNC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzYwNzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM0LmluCkBAIC0wLDAgKzEsMzEgQEAKK1Rlc3QgZm9yIHVzZXIgZnVuY3Rpb25zCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOmZ1bmN0aW9uIFRhYmxlKHRpdGxlLCAuLi4pCis6ICBsZXQgcmV0ID0gYTp0aXRsZQorOiAgbGV0IGlkeCA9IDEKKzogIHdoaWxlIGlkeCA8PSBhOjAKKzogICAgZXhlICJsZXQgcmV0ID0gcmV0IC4gYToiIC4gaWR4Cis6ICAgIGxldCBpZHggPSBpZHggKyAxCis6ICBlbmR3aGlsZQorOiAgcmV0dXJuIHJldAorOmVuZGZ1bmN0aW9uCis6ZnVuY3Rpb24gQ29tcHV0ZShuMSwgbjIsIGRpdm5hbWUpCis6ICBpZiBhOm4yID09IDAKKzogICAgcmV0dXJuICJmYWlsIgorOiAgZW5kaWYKKzogIGV4ZSAibGV0IGc6IiAuIGE6ZGl2bmFtZSAuICIgPSAiLiBhOm4xIC8gYTpuMgorOiAgcmV0dXJuICJvayIKKzplbmRmdW5jdGlvbgorOmxldCByZXR2YWwgPSAibm9wIgorL15oZXJlCitDEj1UYWJsZSgieHh4IiwgNCwgImFzZGYiKQorIBI9Q29tcHV0ZSg0NSwgMCwgInJldHZhbCIpCisgEj1yZXR2YWwKKyASPUNvbXB1dGUoNDUsIDUsICJyZXR2YWwiKQorIBI9cmV0dmFsCisbOi53cSEgdGVzdC5vdXQKK0VORFRFU1QKKworaGVyZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDM0Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDM0Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWI1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MzQub2sKQEAgLTAsMCArMSBAQAoreHh4NGFzZGYgZmFpbCBub3Agb2sgOQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDM1LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDM1LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTc5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MzUuaW4KQEAgLTAsMCArMSwyMSBAQAorVGVzdCBDdHJsLUEgYW5kIEN0cmwtWCwgd2hpY2ggaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgZGVjaW1hbCwgaGV4YWRlY2ltYWwsCithbmQgb2N0YWwgbnVtYmVycy4KKworU1RBUlRURVNUCisvXnN0YXJ0LWhlcmUKKzpzZXQgbnJmb3JtYXRzPW9jdGFsLGhleAoragExMDIYAWwYbAE2NAExMjgYJBgKKzpzZXQgbnJmb3JtYXRzPW9jdGFsCiswATEwMhgBbBgyAXc2NQExMjkYYmx4NmxECis6c2V0IG5yZm9ybWF0cz1oZXgKKzAxMDEYbDI1NxgBVHhsZHQgASAYIBgKKzpzZXQgbnJmb3JtYXRzPQorMDIwMBhsMTAwGHc3OBgBaworOiQtMywkd3EhIHRlc3Qub3V0CitFTkRURVNUCisKK3N0YXJ0LWhlcmUKKzEwMCAgICAgMHgxMDAgICAgIDA3NyAgICAgMAorMTAwICAgICAweDEwMCAgICAgMDc3ICAgICAKKzEwMCAgICAgMHgxMDAgICAgIDA3NyAgICAgMHhmRiAgICAgMHhGZgorMTAwICAgICAweDEwMCAgICAgMDc3ICAgICAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzNS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzNS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTNhZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM1Lm9rCkBAIC0wLDAgKzEsNCBAQAorMCAgICAgMHgwZmYgICAgIDAwMDAgICAgIC0xCiswICAgICAxeDEwMCAgICAgMDc3Nzc3NworLTEgICAgIDB4MCAgICAgMDc4ICAgICAweEZFICAgICAweGZlCistMTAwICAgICAtMTAweDEwMCAgICAgMDAwICAgICAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzNi5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QzNi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNiNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM2LmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzNi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzNi5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjcwZmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM2Lm9rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzNy5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3QzNy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWFlYTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM3LmluCkBAIC0wLDAgKzEsMTE2IEBACitUZXN0IGZvciAnc2Nyb2xsYmluZCcuIDxlcmFsc3RvbkBjb21wdXRlci5vcmc+CitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzpzZXQgbm9zY3JvbGxiaW5kCis6c2V0IHNjcm9sbG9wdD12ZXIsanVtcAorOnNldCBzY3JvbGxvZmY9MgorOnNldCBub3dyYXAKKzpzZXQgbm9lcXVhbGFsd2F5cworOnNldCBzcGxpdGJlbG93Cis6IiBURVNUIHVzaW5nIHR3byB3aW5kb3dzIG9wZW4gdG8gb25lIGJ1ZmZlciwgb25lIGV4dHJhIGVtcHR5IHdpbmRvdworOnNwbGl0Cis6bmV3CisXdDoKKzpyZXNpemUgOAorL15zdGFydCBvZiB3aW5kb3cgMSQvCit6dDoKKzpzZXQgc2Nyb2xsYmluZAorF2o6Cis6cmVzaXplIDcKKy9ec3RhcnQgb2Ygd2luZG93IDIkLworenQ6Cis6c2V0IHNjcm9sbGJpbmQKKzoiIC0tIHN0YXJ0IG9mIHRlc3RzIC0tCis6IiBURVNUIHNjcm9sbGluZyBkb3duCitMNWpIeXkXYnByMBd0SHl5F2JwcjEXdEw2akh5eRdicHIyF2tIeXkXYnByMzoKKzoiIFRFU1Qgc2Nyb2xsaW5nIHVwCisXdEg0axdqSBd0SHl5F2JwcjQXa0h5eRdicHI1F2szaxd0SBdqSHl5F2JwcjYXdEh5eRdicHI3OgorOiIgVEVTVCBob3Jpem9udGFsIHNjcm9sbGluZworOnNldCBzY3JvbGxvcHQrPWhvcgorZ2cienl5RyJ6cEcXdDAxNXpseSQXYnAienBHF2t5JBdicCJ6cEc6CisXazEwakg3emhnMHkkF2JwInpwRxd0SGcweSQXYnAienBHOgorOnNldCBzY3JvbGxvcHQtPWhvcgorOiIgKioqKioqIHRlc3RzIHVzaW5nIHR3byBkaWZmZXJlbnQgYnVmZmVycyAqKioqKgorF3QXajoKKzpjbG9zZQorF3Q6Cis6c2V0IG5vc2Nyb2xsYmluZAorOi9ec3RhcnQgb2Ygd2luZG93IDIkLywvXmVuZCBvZiB3aW5kb3cgMiQveQorOm5ldworF3QXajQienBHcDoKKxd0L15zdGFydCBvZiB3aW5kb3cgMSQvCit6dDoKKzpzZXQgc2Nyb2xsYmluZAorF2o6CisvXnN0YXJ0IG9mIHdpbmRvdyAyJC8KK3p0OgorOnNldCBzY3JvbGxiaW5kCis6IiAtLSBzdGFydCBvZiB0ZXN0cyAtLQorOiIgVEVTVCBzY3JvbGxpbmcgZG93bgorTDVqSHl5F2JwcjAXdEh5eRdicHIxF3RMNmpIeXkXYnByMhdrSHl5F2JwcjM6Cis6IiBURVNUIHNjcm9sbGluZyB1cAorF3RINGsXakgXdEh5eRdicHI0F2tIeXkXYnByNRdrM2sXdEgXakh5eRdicHI2F3RIeXkXYnByNzoKKzoiIFRFU1QgaG9yaXpvbnRhbCBzY3JvbGxpbmcKKzpzZXQgc2Nyb2xsb3B0Kz1ob3IKK2dnInp5eUcienBHF3QwMTV6bHkkF2JwInpwRxdreSQXYnAienBHOgorF2sxMGpIN3poZzB5JBdicCJ6cEcXdEhnMHkkF2JwInpwRzoKKzpzZXQgc2Nyb2xsb3B0LT1ob3IKKzoiIFRFU1Qgc3luY2JpbmQKKxd0OnNldCBub3NjYgorZ2dMF2o6c2V0IG5vc2NiCitnZ0w6c2V0IHNjYgorF3Q6c2V0IHNjYgorRxdqRzpzeW5jYmluZAorSGsXdEgXakh5eRdicBd0eXkXYnA6CisXdDpzZXQgbm9zY2IKK2dnTBdqOnNldCBub3NjYgorZ2dMOnNldCBzY2IKKxd0OnNldCBzY2IKKxd0RxdqRxd0OnN5bmNiaW5kCitIaxdqSBd0SHl5F2JwF3QXanl5F2JwOgorF3RIM2sXakgXdEh5eRdicBd0F2p5eRdicDoKKzoiICoqKioqIGRvbmUgd2l0aCB0ZXN0cyAqKioqKgorOnchIHRlc3Qub3V0ICAgICAgICAgICAgICIgV3JpdGUgY29udGVudHMgb2YgdGhpcyBmaWxlCis6cWEhCitFTkRURVNUCisKKworc3RhcnQgb2Ygd2luZG93IDEKKy4gbGluZSAwMSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDEKKy4gbGluZSAwMiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDIKKy4gbGluZSAwMyAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDMKKy4gbGluZSAwNCAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDQKKy4gbGluZSAwNSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDUKKy4gbGluZSAwNiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDYKKy4gbGluZSAwNyAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDcKKy4gbGluZSAwOCAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDgKKy4gbGluZSAwOSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDkKKy4gbGluZSAxMCAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTAKKy4gbGluZSAxMSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTEKKy4gbGluZSAxMiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTIKKy4gbGluZSAxMyAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTMKKy4gbGluZSAxNCAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTQKKy4gbGluZSAxNSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTUKK2VuZCBvZiB3aW5kb3cgMQorCisKK3N0YXJ0IG9mIHdpbmRvdyAyCisuIGxpbmUgMDEgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDAxCisuIGxpbmUgMDIgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDAyCisuIGxpbmUgMDMgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDAzCisuIGxpbmUgMDQgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA0CisuIGxpbmUgMDUgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA1CisuIGxpbmUgMDYgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA2CisuIGxpbmUgMDcgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA3CisuIGxpbmUgMDggWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA4CisuIGxpbmUgMDkgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDA5CisuIGxpbmUgMTAgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDEwCisuIGxpbmUgMTEgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDExCisuIGxpbmUgMTIgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDEyCisuIGxpbmUgMTMgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDEzCisuIGxpbmUgMTQgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDE0CisuIGxpbmUgMTUgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDE1CisuIGxpbmUgMTYgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDE2CitlbmQgb2Ygd2luZG93IDIKKworZW5kIG9mIHRlc3QzNy5pbiAocGxlYXNlIGRvbid0IGRlbGV0ZSB0aGlzIGxpbmUpCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0Mzcub2sgYi9zcmMvdGVzdGRpci90ZXN0Mzcub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwOTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QzNy5vawpAQCAtMCwwICsxLDMzIEBACisKKzAgbGluZSAwNSBaWVhXVlVUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMDUKKzEgbGluZSAwNSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDUKKzIgbGluZSAxMSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTEKKzMgbGluZSAxMSBaWVhXVlVUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMTEKKzQgbGluZSAwNiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDYKKzUgbGluZSAwNiBaWVhXVlVUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMDYKKzYgbGluZSAwMiBaWVhXVlVUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMDIKKzcgbGluZSAwMiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDIKKzU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDIKK1VUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMDIKKy4gbGluZSAxMSBaWVhXVlVUU1JRUE9OTUxLSklIR1JFRENCQTk4NzY1NDMyMTAgMTEKKy4gbGluZSAxMSAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTEKKworMCBsaW5lIDA1IFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAwNQorMSBsaW5lIDA1IDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAwNQorMiBsaW5lIDExIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAxMQorMyBsaW5lIDExIFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAxMQorNCBsaW5lIDA2IDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAwNgorNSBsaW5lIDA2IFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAwNgorNiBsaW5lIDAyIFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAwMgorNyBsaW5lIDAyIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAwMgorNTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAwMgorVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAwMgorLiBsaW5lIDExIFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAxMQorLiBsaW5lIDExIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAxMQorCisuIGxpbmUgMTYgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDE2Cis6c2V0IHNjcm9sbGJpbmQKK3p0OgorLiBsaW5lIDE1IFpZWFdWVVRTUlFQT05NTEtKSUhHUkVEQ0JBOTg3NjU0MzIxMCAxNQorOnNldCBzY3JvbGxiaW5kCisuIGxpbmUgMTEgWllYV1ZVVFNSUVBPTk1MS0pJSEdSRURDQkE5ODc2NTQzMjEwIDExCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0MzguaW4gYi9zcmMvdGVzdGRpci90ZXN0MzguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1YmQwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3QzOC5pbgpAQCAtMCwwICsxLDMzIEBACisKK1Rlc3QgVmlydHVhbCByZXBsYWNlIG1vZGUuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorZ2dkR2EKK2FiY2RlZmdoaQoramsJbG1uCisgICAgb3BxCXJzdAorBHV2d3h5egorG2dnOnNldCBhaQorOnNldCBicz0yCitnUjAEIDEKK0EKK0JDREVGR0hJSgorCUtMCitNTk8KK1BRUhtHOmthCitvMAQKK2FiY2RlZmdoaQoramsJbG1uCisgICAgb3BxCXJzdAorBHV2d3h5egorGydhamdSMAQgMQorQQorQkNERUZHSElKCisJS0wKK01OTworUFFSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbOiQKK2lhYgljZGVmZ2hpCWprbBswZ1JBQi4uLi4uLkNERUZHSEkuShtvGzoKK2lhYmNkZWZnaGlqa2xtbm9wcXJzdBswZ1JBQglJSktMTU5PCVFSGzp3cSEgdGVzdC5vdXQKK0VORFRFU1QKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDM4Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDM4Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDIwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0Mzgub2sKQEAgLTAsMCArMSwxMyBAQAorIDEKKyBBCisgQkNERUZHSElKCisgCUtMCisJTU5PCisJUFFSCisgMQorYWJjZGVmZ2hpCitqawlsbW4KKyAgICBvcHEJcnN0Cit1dnd4eXoKK0FCLi4uLi4uQ0RFRkdISS5Ka2wKK0FCCUlKS0xNTk8JUVJzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDM5LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDM5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjI5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0MzkuaW4KQEAgLTAsMCArMSwyNCBAQAorCitUZXN0IFZpc3VhbCBibG9jayBtb2RlIGNvbW1hbmRzCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorL15hYmNkZQorOiIgVGVzdCBzaGlmdC1yaWdodCBvZiBhIGJsb2NrCitqbGxsbBZqaj53bGwWamxsbD4KKzoiIFRlc3Qgc2hpZnQtbGVmdCBvZiBhIGJsb2NrCitHJGhoaGgWa2s8Cis6IiBUZXN0IGJsb2NrLWluc2VydAorR2tsFmtra0l4eXobCis6IiBUZXN0IGJsb2NrLXJlcGxhY2UKK0dsbGxsFmtra2xsbHJxCis6IiBUZXN0IGJsb2NrLWNoYW5nZQorRyRraGhoFmhoa2tjbW5vGworOiQtNCwkd3EhIHRlc3Qub3V0CitFTkRURVNUCisKK2FiY2RlZmdoaWprbG0KK2FiY2RlZmdoaWprbG0KK2FiY2RlZmdoaWprbG0KK2FiY2RlZmdoaWprbG0KK2FiY2RlZmdoaWprbG0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3QzOS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3QzOS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEyODY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDM5Lm9rCkBAIC0wLDAgKzEsNSBAQAorYXh5emJjZGVmZ2hpamtsbQorYXh5enFxcXEgICBtbm8JICAgICAgZ2hpamtsbQorYXh5enFxcXFlZiBtbm8gICAgICAgIGdoaWprbG0KK2F4eXpxcXFxZWZnbW5va2xtCithYmNkcXFxcWlqa2xtCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3Q0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTJmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NC5pbgpAQCAtMCwwICsxLDMxIEBACitUZXN0IGZvciBhdXRvY29tbWFuZCB0aGF0IGNoYW5nZXMgY3VycmVudCBidWZmZXIgb24gQnVmRW50ZXIgZXZlbnQuCitDaGVjayBpZiBtb2RlbGluZXMgYXJlIGludGVycHJldGVkIGZvciB0aGUgY29ycmVjdCBidWZmZXIuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOnNldCBub2NvbXBhdGlibGUgdmltaW5mbys9bnZpbWluZm8KKzphdSBCdWZFbnRlciBYeHggYnJldworL3N0YXJ0IG9mCis6LiwvZW5kIG9mL3chIFh4eCAgICIgd3JpdGUgdGVzdCBmaWxlIFh4eAorOnNldCBhaSBtb2RlbGluZSBtb2RlbGluZXM9MworOnNwIFh4eCAgICAgICAgICAgICAiIHNwbGl0IHRvIFh4eCwgYXV0b2NtZCB3aWxsIGRvIDpicmV3CitHP3RoaXMgaXMgYQorb3RoaXMgc2hvdWxkIGJlIGF1dG8taW5kZW50ZWQbCis6ICAgICAgICAgICAgICAgICAgICIgQXBwZW5kIHRleHQgd2l0aCBhdXRvaW5kZW50IHRvIHRoaXMgZmlsZQorOmF1ISBCdWZFbnRlciBYeHgKKzpidWYgWHh4ICAgICAgICAgICAgIiBnbyB0byBYeHgsIG5vIGF1dG9jbWQgYW55bW9yZQorRz90aGlzIGlzIGEKK290aGlzIHNob3VsZCBiZSBpbiBjb2x1bW4gMRs6d3EgIiBhcHBlbmQgdGV4dCB3aXRob3V0IGF1dG9pbmRlbnQgdG8gWHh4CitHOnIgWHh4ICAgICAgICAgICAgICIgaW5jbHVkZSBYeHggaW4gdGhlIGN1cnJlbnQgZmlsZQorOj9zdGFydHN0YXJ0PywkdyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworc3RhcnRzdGFydAorc3RhcnQgb2YgdGVzdCBmaWxlIFh4eAordmltOiBzZXQgbm9haSA6CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKK2VuZCBvZiB0ZXN0IGZpbGUgWHh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NC5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q0Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZmVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NC5vawpAQCAtMCwwICsxLDE3IEBACitzdGFydHN0YXJ0CitzdGFydCBvZiB0ZXN0IGZpbGUgWHh4Cit2aW06IHNldCBub2FpIDoKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgc2hvdWxkIGJlIGF1dG8taW5kZW50ZWQKK2VuZCBvZiB0ZXN0IGZpbGUgWHh4CitzdGFydCBvZiB0ZXN0IGZpbGUgWHh4Cit2aW06IHNldCBub2FpIDoKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAordGhpcyBzaG91bGQgYmUgaW4gY29sdW1uIDEKK2VuZCBvZiB0ZXN0IGZpbGUgWHh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDAuaW4gYi9zcmMvdGVzdGRpci90ZXN0NDAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmYjYxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0MC5pbgpAQCAtMCwwICsxLDYzIEBACitUZXN0IGZvciAiKkNtZCIgYXV0b2NvbW1hbmRzCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOi9ec3RhcnQvLCR3ISBYeHgJCSIgd3JpdGUgbGluZXMgYmVsb3cgdG8gWHh4Cis6YXUgQnVmUmVhZENtZCB0ZXN0QSAwciBYeHh8JGRlbAorOmUgdGVzdEEJCQkiIHdpbGwgcmVhZCB0ZXh0IG9mIFh4ZCBpbnN0ZWFkCis6YXUgQnVmV3JpdGVDbWQgdGVzdEEgY2FsbCBhcHBlbmQobGluZSgiJCIpLCAid3JpdGUiKQorOncJCQkJIiB3aWxsIGFwcGVuZCBhIGxpbmUgdG8gdGhlIGZpbGUKKzpyIHRlc3RBCQkJIiBzaG91bGQgbm90IHJlYWQgYW55dGhpbmcKKzoJCQkJIiBub3cgd2UgaGF2ZToKKzoJCQkJIiAxCXN0YXJ0IG9mIFh4eAorOgkJCQkiIDIJCXRlc3Q0MAorOgkJCQkiIDMJZW5kIG9mIFh4eAorOgkJCQkiIDQJd3JpdGUKKzphdSBGaWxlUmVhZENtZCB0ZXN0QiAnW3IgWHh4Cis6MnIgdGVzdEIJCQkiIHdpbGwgcmVhZCBYeHggYmVsb3cgbGluZSAyIGluc3RlYWQKKzoJCQkJIiAxCXN0YXJ0IG9mIFh4eAorOgkJCQkiIDIJCXRlc3Q0MAorOgkJCQkiIDMJc3RhcnQgb2YgWHh4Cis6CQkJCSIgNAkJdGVzdDQwCis6CQkJCSIgNQllbmQgb2YgWHh4Cis6CQkJCSIgNgllbmQgb2YgWHh4Cis6CQkJCSIgNwl3cml0ZQorOmF1IEZpbGVXcml0ZUNtZCB0ZXN0QyAnWywnXWNvcHkgJAorNEdBMRsKKzo0LDV3IHRlc3RDCQkJIiB3aWxsIGNvcHkgbGluZXMgNCBhbmQgNSB0byB0aGUgZW5kCis6ciB0ZXN0QwkJCSIgc2hvdWxkIG5vdCByZWFkIGFueXRoaW5nCis6CQkJCSIgMQlzdGFydCBvZiBYeHgKKzoJCQkJIiAyCQl0ZXN0NDAKKzoJCQkJIiAzCXN0YXJ0IG9mIFh4eAorOgkJCQkiIDQJCXRlc3Q0MDEKKzoJCQkJIiA1CWVuZCBvZiBYeHgKKzoJCQkJIiA2CWVuZCBvZiBYeHgKKzoJCQkJIiA3CXdyaXRlCis6CQkJCSIgOAkJdGVzdDQwMQorOgkJCQkiIDkJZW5kIG9mIFh4eAorOmF1IEZJTEVBcHBlbmRDbWQgdGVzdEQgJ1ssJ113ISB0ZXN0Lm91dAorOncgPj50ZXN0RAkJCSIgd2lsbCB3cml0ZSBhbGwgbGluZXMgdG8gdGVzdC5vdXQKKzokciB0ZXN0RAkJCSIgc2hvdWxkIG5vdCByZWFkIGFueXRoaW5nCis6JHcgPj50ZXN0Lm91dAkJCSIgYXBwZW5kICJlbmQgb2YgWHh4IiB0byB0ZXN0Lm91dAorOmF1IEJ1ZlJlYWRDbWQgdGVzdEUgMHIgdGVzdC5vdXR8JGRlbAorOnNwIHRlc3RFCQkJIiBzcGxpdCB3aW5kb3cgd2l0aCB0ZXN0Lm91dAorNUdvYXNkZhsXFzoiCis6YXUgQnVmV3JpdGVDbWQgdGVzdEUgdyEgdGVzdC5vdXQKKzp3YWxsCQkJCSIgd2lsbCB3cml0ZSBvdGhlciB3aW5kb3cgdG8gdGVzdC5vdXQKKzoJCQkJIiAxCXN0YXJ0IG9mIFh4eAorOgkJCQkiIDIJCXRlc3Q0MAorOgkJCQkiIDMJc3RhcnQgb2YgWHh4Cis6CQkJCSIgNAkJdGVzdDQwMQorOgkJCQkiIDUJZW5kIG9mIFh4eAorOgkJCQkiIDYJYXNkZgorOgkJCQkiIDcJZW5kIG9mIFh4eAorOgkJCQkiIDgJd3JpdGUKKzoJCQkJIiA5CQl0ZXN0NDAxCis6CQkJCSIgMTAJZW5kIG9mIFh4eAorOgkJCQkiIDExCWVuZCBvZiBYeHgKKzpxYSEKK0VORFRFU1QKKworc3RhcnQgb2YgWHh4CisJdGVzdDQwCitlbmQgb2YgWHh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDAub2sgYi9zcmMvdGVzdGRpci90ZXN0NDAub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1MDEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0MC5vawpAQCAtMCwwICsxLDExIEBACitzdGFydCBvZiBYeHgKKwl0ZXN0NDAKK3N0YXJ0IG9mIFh4eAorCXRlc3Q0MDEKK2VuZCBvZiBYeHgKK2FzZGYKK2VuZCBvZiBYeHgKK3dyaXRlCisJdGVzdDQwMQorZW5kIG9mIFh4eAorZW5kIG9mIFh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQxLmluIGIvc3JjL3Rlc3RkaXIvdGVzdDQxLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjk0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDEuaW4KQEAgLTAsMCArMSwyNCBAQAorVGVzdCBmb3Igd3JpdGluZyBhbmQgcmVhZGluZyBhIGZpbGUgb2Ygb3ZlciAxMDAgS2J5dGUKKworMSBsaW5lOiAiVGhpcyBpcyB0aGUgc3RhcnQiCiszMDAxIGxpbmVzOiAiVGhpcyBpcyB0aGUgbGVhZGVyIgorMSBsaW5lOiAiVGhpcyBpcyB0aGUgbWlkZGxlIgorMzAwMSBsaW5lczogIlRoaXMgaXMgdGhlIHRyYWlsZXIiCisxIGxpbmU6ICJUaGlzIGlzIHRoZSBlbmQiCisKK1NUQVJUVEVTVAorOiVkCithVGhpcyBpcyB0aGUgc3RhcnQKK1RoaXMgaXMgdGhlIGxlYWRlcgorVGhpcyBpcyB0aGUgbWlkZGxlCitUaGlzIGlzIHRoZSB0cmFpbGVyCitUaGlzIGlzIHRoZSBlbmQba1kzMDAwcDJHWTMwMDBwCis6dyEgWHRlc3QKKzolZAorOmUhIFh0ZXN0Cis6LnchIHRlc3Qub3V0CiszMDAzRzoudyA+PnRlc3Qub3V0Cis2MDA1RzoudyA+PnRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q0MS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q0MS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhlNWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQxLm9rCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyB0aGUgc3RhcnQKK1RoaXMgaXMgdGhlIG1pZGRsZQorVGhpcyBpcyB0aGUgZW5kCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDIuaW4gYi9zcmMvdGVzdGRpci90ZXN0NDIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1NTY5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0Mi5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDIub2sgYi9zcmMvdGVzdGRpci90ZXN0NDIub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNDFlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0Mi5vawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDMuaW4gYi9zcmMvdGVzdGRpci90ZXN0NDMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmMGUwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0My5pbgpAQCAtMCwwICsxLDI3IEBACitUZXN0cyBmb3IgcmVnZXhwIHdpdGggdmFyaW91cyBtYWdpYyBzZXR0aW5ncy4KKworU1RBUlRURVNUCis6c2V0IG5vY29tcGF0aWJsZSB2aW1pbmZvKz1udmltaW5mbworL14xCisvYSpiXHsyfWNcKy9lCit4L1xNZFwqZVx7Mn1mXCsvZQoreDpzZXQgbm9tYWdpYworL2dcKmhcezJ9aVwrL2UKK3gvXG1qKmtcezJ9bFwrL2UKK3gvXHZtKm57Mn1vKy9lCit4L1xWXmFhJAoreDpzZXQgbWFnaWMKKy9cdihhKShiKVwyXDFcMS9lCit4L1xWW2FiXVwoXFt4eV1cKVwxCit4Oj9eMT8sJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKKzEgYSBhYSBhYmIgYWJiY2NjCisyIGQgZGQgZGVlIGRlZWZmZgorMyBnIGdnIGdoaCBnaGhpaWkKKzQgaiBqaiBqa2sgamtrbGxsCis1IG0gbW0gbW5uIG1ubm9vbworNiB4IF5hYSQgeAorNyAoYSkoYikgYWJiYWEKKzggYXh4IFthYl14eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQzLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDQzLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTMxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDMub2sKQEAgLTAsMCArMSw4IEBACisxIGEgYWEgYWJiIGFiYmNjCisyIGQgZGQgZGVlIGRlZWZmCiszIGcgZ2cgZ2hoIGdoaGlpCis0IGogamogamtrIGpra2xsCis1IG0gbW0gbW5uIG1ubm9vCis2IHggYWEkIHgKKzcgKGEpKGIpIGFiYmEKKzggYXh4IGFiXXh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDQuaW4gYi9zcmMvdGVzdGRpci90ZXN0NDQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwYTk2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0NC5pbgpAQCAtMCwwICsxLDM3IEBACitUZXN0cyBmb3IgcmVnZXhwIHdpdGggbXVsdGktYnl0ZSBlbmNvZGluZyBhbmQgdmFyaW91cyBtYWdpYyBzZXR0aW5ncy4KKworU1RBUlRURVNUCis6c28gbWJ5dGUudmltCis6c2V0IG5vY29tcGF0aWJsZSBlbmNvZGluZz11dGYtOCB0ZXJtZW5jb2Rpbmc9bGF0aW4xIHZpbWluZm8rPW52aW1pbmZvCisvXjEKKy9hKmJcezJ9Y1wrL2UKK3gvXE1kXCplXHsyfWZcKy9lCit4OnNldCBub21hZ2ljCisvZ1wqaFx7Mn1pXCsvZQoreC9cbWoqa1x7Mn1sXCsvZQoreC9cdm0qbnsyfW8rL2UKK3gvXFZeYWEkCit4OnNldCBtYWdpYworL1x2KGEpKGIpXDJcMVwxL2UKK3gvXFZbYWJdXChcW3h5XVwpXDEKK3g6IiBOb3cgc2VhcmNoIGZvciBtdWx0aS1ieXRlIHdpdGhvdXQgY29tcG9zaW5nIGNoYXIKKy/guKEKK3g6IiBOb3cgc2VhcmNoIGZvciBtdWx0aS1ieXRlIHdpdGggY29tcG9zaW5nIGNoYXIKKy/guKHguYgKK3g6IiBmaW5kIHdvcmQgYnkgY2hhbmdlIG9mIHdvcmQgY2xhc3MKKy/jgaFcPOOCq+ODqFw+44GvCit4Oj9eMT8sJHchIHRlc3Qub3V0Cis6cWEhCitFTkRURVNUCisKKzEgYSBhYSBhYmIgYWJiY2NjCisyIGQgZGQgZGVlIGRlZWZmZgorMyBnIGdnIGdoaCBnaGhpaWkKKzQgaiBqaiBqa2sgamtrbGxsCis1IG0gbW0gbW5uIG1ubm9vbworNiB4IF5hYSQgeAorNyAoYSkoYikgYWJiYWEKKzggYXh4IFthYl14eAorOSDguKvguKHguYh4IOC4reC4oXgKK2Eg4Lit4LiheCDguKvguKHguYh4CitiIOOBoeOCq+ODqOOBrwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQ0Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDQ0Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODUwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDQub2sKQEAgLTAsMCArMSwxMSBAQAorMSBhIGFhIGFiYiBhYmJjYworMiBkIGRkIGRlZSBkZWVmZgorMyBnIGdnIGdoaCBnaGhpaQorNCBqIGpqIGprayBqa2tsbAorNSBtIG1tIG1ubiBtbm5vbworNiB4IGFhJCB4Cis3IChhKShiKSBhYmJhCis4IGF4eCBhYl14eAorOSDguKvguKHguYh4IOC4rXgKK2Eg4Lit4LiheCDguKt4CitiIOOCq+ODqOOBrwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQ1LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDQ1LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTM3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDUuaW4KQEAgLTAsMCArMSw3MiBAQAorVGVzdHMgZm9yIGZvbGRpbmcuIHZpbTogc2V0IGZ0PXZpbSA6CisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOiIgV2UgYWxzbyBuZWVkIHRoZSArc3ludGF4IGZlYXR1cmUgaGVyZS4KKzppZiAhaGFzKCJzeW50YXgiKQorICAgZSEgdGVzdC5vaworICAgdyEgdGVzdC5vdXQKKyAgIHFhIQorOmVuZGlmCis6IiBiYXNpYyB0ZXN0IGlmIGEgZm9sZCBjYW4gYmUgY3JlYXRlZCwgb3BlbmVkLCBtb3ZpbmcgdG8gdGhlIGVuZCBhbmQgY2xvc2VkCisvXjEKK3pmMmo6Y2FsbCBhcHBlbmQoIiQiLCAibWFudWFsICIgLiBnZXRsaW5lKGZvbGRjbG9zZWQoIi4iKSkpCit6bzpjYWxsIGFwcGVuZCgiJCIsIGZvbGRjbG9zZWQoIi4iKSkKK116OmNhbGwgYXBwZW5kKCIkIiwgZ2V0bGluZSgiLiIpKQoremM6Y2FsbCBhcHBlbmQoIiQiLCBnZXRsaW5lKGZvbGRjbG9zZWQoIi4iKSkpCis6IiB0ZXN0IGZvbGRpbmcgd2l0aCBtYXJrZXJzLgorOnNldCBmZG09bWFya2VyIGZkbD0xIGZkYz0zCisvXjUKKzpjYWxsIGFwcGVuZCgiJCIsICJtYXJrZXIgIiAuIGZvbGRsZXZlbCgiLiIpKQorW3o6Y2FsbCBhcHBlbmQoIiQiLCBmb2xkbGV2ZWwoIi4iKSkKK2pve3sgG3J7amo6Y2FsbCBhcHBlbmQoIiQiLCBmb2xkbGV2ZWwoIi4iKSkKK2tZcGo6Y2FsbCBhcHBlbmQoIiQiLCBmb2xkbGV2ZWwoIi4iKSkKKzoiIHRlc3QgZm9sZGluZyB3aXRoIGluZGVudAorOnNldCBmZG09aW5kZW50IHN3PTIKKy9eMiBiCitpICAbakkgICAgGzpjYWxsIGFwcGVuZCgiJCIsICJpbmRlbnQgIiAuIGZvbGRsZXZlbCgiLiIpKQorazpjYWxsIGFwcGVuZCgiJCIsIGZvbGRsZXZlbCgiLiIpKQorOiIgdGVzdCBzeW50YXggZm9sZGluZworOnNldCBmZG09c3ludGF4IGZkbD0wCis6c3luIHJlZ2lvbiBIdXAgc3RhcnQ9ImRkIiBlbmQ9ImhoIiBmb2xkCitHems6Y2FsbCBhcHBlbmQoIiQiLCAiZm9sZGluZyAiIC4gZ2V0bGluZSgiLiIpKQorazpjYWxsIGFwcGVuZCgiJCIsIGdldGxpbmUoIi4iKSkKKzoiIHRlc3QgZXhwcmVzc2lvbiBmb2xkaW5nCis6ZnVuIEZsdmwoKQorICBsZXQgbCA9IGdldGxpbmUodjpsbnVtKQorICBpZiBsID1+ICJiYiQiCisgICAgcmV0dXJuIDIKKyAgZWxzZWlmIGwgPX4gImdnJCIKKyAgICByZXR1cm4gInMxIgorICBlbHNlaWYgbCA9fiAiaWkkIgorICAgIHJldHVybiAiPjIiCisgIGVsc2VpZiBsID1+ICJrayQiCisgICAgcmV0dXJuICIwIgorICBlbmRpZgorICByZXR1cm4gIj0iCitlbmRmdW4KKzpzZXQgZmRtPWV4cHIgZmRlPUZsdmwoKQorL2JiJAorOmNhbGwgYXBwZW5kKCIkIiwgImV4cHIgIiAuIGZvbGRsZXZlbCgiLiIpKQorL2hoJAorOmNhbGwgYXBwZW5kKCIkIiwgZm9sZGxldmVsKCIuIikpCisvaWkkCis6Y2FsbCBhcHBlbmQoIiQiLCBmb2xkbGV2ZWwoIi4iKSkKKy9rayQKKzpjYWxsIGFwcGVuZCgiJCIsIGZvbGRsZXZlbCgiLiIpKQorOi9ebGFzdC8rMSwkdyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworMSBhYQorMiBiYgorMyBjYworNCBkZCB7e3sKKzUgZWUge3t7IH19fQorNiBmZiB9fX0KKzcgZ2cKKzggaGgKKzkgaWkKK2EgamoKK2Iga2sKK2xhc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q0NS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q0NS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWExMzgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQ1Lm9rCkBAIC0wLDAgKzEsMTYgQEAKK21hbnVhbCAxIGFhCistMQorMyBjYworMSBhYQorbWFya2VyIDIKKzEKKzEKKzAKK2luZGVudCAyCisxCitmb2xkaW5nIDggaGgKKyAgICAzIGNjCitleHByIDIKKzEKKzIKKzAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q0Ni5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3Q0Ni5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlkYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQ2LmluCkBAIC0wLDAgKzEsMjcgQEAKK1Rlc3RzIGZvciBtdWx0aS1saW5lIHJlZ2V4cHMgd2l0aCAiOnMiLiB2aW06IHNldCBmdD12aW0gOgorCitTVEFSVFRFU1QKKzoiIHRlc3QgaWYgcmVwbGFjaW5nIGEgbGluZSBicmVhayB3b3JrcyB3aXRoIGEgYmFjayByZWZlcmVuY2UKKzovXjEvLC9eMi9zL1xuXCguXCkvIFwxLworOiIgdGVzdCBpZiBpbnNlcnRpbmcgYSBsaW5lIGJyZWFrIHdvcmtzIHdpdGggYSBiYWNrIHJlZmVyZW5jZQorOi9eMy8sL140L3MvXCguXCkkL1xyXDEvCis6IiB0ZXN0IGlmIHJlcGxhY2luZyBhIGxpbmUgYnJlYWsgd2l0aCBhbm90aGVyIGxpbmUgYnJlYWsgd29ya3MKKzovXjUvLC9eNi9zL1woXF9kXHszfVwpL3hcMXgvCis6L14xLywkdyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworMSBhYQorYmIKK2NjCisyIGRkCitlZQorMyBlZgorZ2gKKzQgaWoKKzUgYTgKKzhiIGM5Cis5ZAorNiBlNworNzdmCit4eHh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQ2Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDQ2Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjM1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDYub2sKQEAgLTAsMCArMSwxMyBAQAorMSBhYSBiYiBjYyAyIGRkIGVlCiszIGUKK2YKK2cKK2gKKzQgaQoragorNSBheDgKKzh4YiBjeDkKKzl4ZAorNiBleDcKKzd4N2YKK3h4eHh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDcuaW4gYi9zcmMvdGVzdGRpci90ZXN0NDcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViYjlmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0Ny5pbgpAQCAtMCwwICsxLDQ0IEBACitUZXN0cyBmb3IgdmVydGljYWwgc3BsaXRzIGFuZCBmaWxsZXIgbGluZXMgaW4gZGlmZiBtb2RlCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorL14xCit5RzpuZXcKK3BrZGQ6dyEgWHRlc3QKK2RkR3Bra3JYb3h4eBs6dyEgWHRlc3QyCis6ZmlsZSBOb3AKK2dnb3l5eRtqampvenp6ehsKKzp2ZXJ0IGRpZmZzcGxpdCBYdGVzdAorOnZlcnQgZGlmZnNwbGl0IFh0ZXN0MgorOiIganVtcCB0byBzZWNvbmQgd2luZG93IGZvciBhIG1vbWVudCB0byBoYXZlIGZpbGxlciBsaW5lIGFwcGVhciBhdCBzdGFydCBvZgorOiIgZmlyc3Qgd2luZG93CisXF2dnF3BnZzpsZXQgb25lID0gd2lubGluZSgpCitqOmxldCBvbmUgPSBvbmUgLiAiLSIgLiB3aW5saW5lKCkKK2o6bGV0IG9uZSA9IG9uZSAuICItIiAuIHdpbmxpbmUoKQorajpsZXQgb25lID0gb25lIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCBvbmUgPSBvbmUgLiAiLSIgLiB3aW5saW5lKCkKK2o6bGV0IG9uZSA9IG9uZSAuICItIiAuIHdpbmxpbmUoKQorFxdnZzpsZXQgdHdvID0gd2lubGluZSgpCitqOmxldCB0d28gPSB0d28gLiAiLSIgLiB3aW5saW5lKCkKK2o6bGV0IHR3byA9IHR3byAuICItIiAuIHdpbmxpbmUoKQorajpsZXQgdHdvID0gdHdvIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0d28gPSB0d28gLiAiLSIgLiB3aW5saW5lKCkKKxcXZ2c6bGV0IHRocmVlID0gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCitqOmxldCB0aHJlZSA9IHRocmVlIC4gIi0iIC4gd2lubGluZSgpCisXFzpjYWxsIGFwcGVuZCgiJCIsIG9uZSkKKzpjYWxsIGFwcGVuZCgiJCIsIHR3bykKKzpjYWxsIGFwcGVuZCgiJCIsIHRocmVlKQorOiQtMiwkdyEgdGVzdC5vdXQKKzpxYSEKK0VORFRFU1QKKworMSBhYQorMiBiYgorMyBjYworNCBkZAorNSBlZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDQ3Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDQ3Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDdiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NDcub2sKQEAgLTAsMCArMSwzIEBACisyLTQtNS02LTgtOQorMS0yLTQtNS04CisyLTMtNC01LTYtNy04CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDguaW4gYi9zcmMvdGVzdGRpci90ZXN0NDguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3OWZlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0OC5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDgub2sgYi9zcmMvdGVzdGRpci90ZXN0NDgub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjYmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q0OC5vawpAQCAtMCwwICsxLDIxIEBACitrZXl3b3JkIGtleXdvcmQKK2FsbCB5b3VyIGJhc2UgCithcmUgYmVsb25nIHRvIHZpbQorMSAyIDMgNCA1IDcKKydpJyAgIDwtLSBzaG91bGQgYmUgMyAnICcKKydDJyAgIDwtLSBzaG91bGQgYmUgMyAnICcKKydhJyAgICA8LS0gc2hvdWxkIGJlIDQgJyAnCisnQSc8LS0gc2hvdWxkIGJlIDAgJyAnCisnRCcgICA8LS0gJ0QnIHNob3VsZCBiZSBpbnRhY3QKK3RoaXMgaXMgYSB0ZXN0Cit0aGlzIGlzIGEgdGVzdAordGhpcyBpcyBhIHRlc3QKKyJyIiAgICB4PC0tIHNob3VsZCBiZSAneCcKK1tUaGlzIGxpbmUgc2hvdWxkIGNvbnRhaW4gb25seSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBicmFja2V0cy5dCisgICB2ICAgaSAgIG0gICA8LS0gc2hvdWxkIHNob3cgdGhlIG5hbWUgb2YgYSBub3RlZCB0ZXh0IGVkaXRvcgorICAgIDYgICAuICAgMCAgIDwtLSBhbmQgaXRzIHZlcnNpb24gbnVtYmVyCisKK2EKK2EKK2EKKyAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q0OS5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3Q0OS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQ5LmluCkBAIC0wLDAgKzEsMTMgQEAKK1RoaXMgaXMgYSB0ZXN0IG9mIHRoZSBzY3JpcHQgbGFuZ3VhZ2UuCisKK0lmIGFmdGVyIGFkZGluZyBhIG5ldyB0ZXN0LCB0aGUgdGVzdCBvdXRwdXQgZG9lc24ndCBhcHBlYXIgcHJvcGVybHkgaW4KK3Rlc3Q0OS5mYWlsZWQsIHRyeSB0byBhZGQgb25lIG9yZSBtb3JlICJHInMgYXQgdGhlIGxpbmUgYmVmb3JlIEVORFRFU1QuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOnNlIG5vY3Agbm9tb3JlIHZpbWluZm8rPW52aW1pbmZvCis6c28gdGVzdDQ5LnZpbQorR0dHR0dHR0dHRyJycDouLSwkd3EhIHRlc3Qub3V0CitFTkRURVNUCisKK1Jlc3VsdHMgb2YgdGVzdDQ5LnZpbToKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q0OS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q0OS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQyYWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQ5Lm9rCkBAIC0wLDAgKzEsOTIgQEAKK1Jlc3VsdHMgb2YgdGVzdDQ5LnZpbToKKyoqKiBUZXN0ICAgMTogT0sgKDM0Njk1KQorKioqIFRlc3QgICAyOiBPSyAoMzQ2OTUpCisqKiogVGVzdCAgIDM6IE9LICgxMzg0NjQ4MTk1KQorKioqIFRlc3QgICA0OiBPSyAoMzI4ODMpCisqKiogVGVzdCAgIDU6IE9LICgzMjg4MykKKyoqKiBUZXN0ICAgNjogT0sgKDYwMzk3ODk0NykKKyoqKiBUZXN0ICAgNzogT0sgKDkwNTYzKQorKioqIFRlc3QgICA4OiBPSyAoNTYyNDkzNDMxKQorKioqIFRlc3QgICA5OiBPSyAoMzYzKQorKioqIFRlc3QgIDEwOiBPSyAoNTU5NjE1KQorKioqIFRlc3QgIDExOiBPSyAoMjA0OSkKKyoqKiBUZXN0ICAxMjogT0sgKDM1MjI1NikKKyoqKiBUZXN0ICAxMzogT0sgKDE0NSkKKyoqKiBUZXN0ICAxNDogT0sgKDQyNDEzKQorKioqIFRlc3QgIDE1OiBPSyAoNDI0MTMpCisqKiogVGVzdCAgMTY6IE9LICg4NzIyKQorKioqIFRlc3QgIDE3OiBPSyAoMjg1MTI3OTkzKQorKioqIFRlc3QgIDE4OiBPSyAoNjcyMjQ1ODMpCisqKiogVGVzdCAgMTk6IE9LICg2OTI3NTk3MykKKyoqKiBUZXN0ICAyMDogT0sgKDE4NzQ1NzUwODUpCisqKiogVGVzdCAgMjE6IE9LICgxNDc5MzIyMjUpCisqKiogVGVzdCAgMjI6IE9LICg0MTYxKQorKioqIFRlc3QgIDIzOiBPSyAoNDkpCisqKiogVGVzdCAgMjQ6IE9LICg0MSkKKyoqKiBUZXN0ICAyNTogT0sgKDI2MDE3NzgxMSkKKyoqKiBUZXN0ICAyNjogT0sgKDE2ODE1MDA0NzYpCisqKiogVGVzdCAgMjc6IE9LICgxOTk2NDU5KQorKioqIFRlc3QgIDI4OiBPSyAoMTk5NjQ1OSkKKyoqKiBUZXN0ICAyOTogT0sgKDE3MDQyODU1NSkKKyoqKiBUZXN0ICAzMDogT0sgKDE5MDkwNTE3MykKKyoqKiBUZXN0ICAzMTogT0sgKDE5MDkwNTE3MykKKyoqKiBUZXN0ICAzMjogT0sgKDM1NDgzMzA2NykKKy0tLSBUZXN0ICAzMzogc3VtID0gMTc4Mjc1NjAwIChvaykKKyoqKiBUZXN0ICAzMzogT0sgKDEyMTY5MDc1MzgpCisqKiogVGVzdCAgMzQ6IE9LICgyMTQ2NTg0ODY4KQorKioqIFRlc3QgIDM1OiBPSyAoMjE0NjU4NDg2OCkKKyoqKiBUZXN0ICAzNjogT0sgKDEwNzE2NDQ2NzIpCisqKiogVGVzdCAgMzc6IE9LICgxMDcxNjQ0NjcyKQorKioqIFRlc3QgIDM4OiBPSyAoMzU3OTA4NDgwKQorKioqIFRlc3QgIDM5OiBPSyAoMzU3OTA4NDgwKQorKioqIFRlc3QgIDQwOiBPSyAoMzU3OTA4NDgwKQorKioqIFRlc3QgIDQxOiBPSyAoMzA3NjA5NSkKKyoqKiBUZXN0ICA0MjogT0sgKDE1MDUxNTU5NDkpCisqKiogVGVzdCAgNDM6IE9LICgxMTU3NzYzMzI5KQorKioqIFRlc3QgIDQ0OiBPSyAoMTAzMTc2MTQwNykKKyoqKiBUZXN0ICA0NTogT0sgKDExNTc3NjMzMjkpCisqKiogVGVzdCAgNDY6IE9LICg3Mzk0MDcpCisqKiogVGVzdCAgNDc6IE9LICgzNzEyMTM5MzUpCisqKiogVGVzdCAgNDg6IE9LICg3NTYyNTU0NjEpCisqKiogVGVzdCAgNDk6IE9LICgxNzkwMDA2NjkpCisqKiogVGVzdCAgNTA6IE9LICgzNjM1NTAwNDUpCisqKiogVGVzdCAgNTE6IE9LICg0MDc0NDY2NykKKyoqKiBUZXN0ICA1MjogT0sgKDEyNDcxMTIwMTEpCisqKiogVGVzdCAgNTM6IE9LICgxMzEwNzEpCisqKiogVGVzdCAgNTQ6IE9LICgyMDQ3KQorKioqIFRlc3QgIDU1OiBPSyAoMTAyMykKKyoqKiBUZXN0ICA1NjogT0sgKDUxMSkKKyoqKiBUZXN0ICA1NzogT0sgKDIxNDc0NTA4ODApCisqKiogVGVzdCAgNTg6IE9LICg2MjQ5NDUpCisqKiogVGVzdCAgNTk6IE9LICgyMDM4NDMxNzQzKQorKioqIFRlc3QgIDYwOiBPSyAoMzExNTExMzM5KQorKioqIFRlc3QgIDYxOiBPSyAoMzc0ODg5NTE3KQorKioqIFRlc3QgIDYyOiBPSyAoMjg2MzMxMTUzKQorKioqIFRlc3QgIDYzOiBPSyAoMjM2OTc4MTI3KQorKioqIFRlc3QgIDY0OiBPSyAoMTQ5OTY0NTMzNSkKKyoqKiBUZXN0ICA2NTogT0sgKDcwMTg3KQorKioqIFRlc3QgIDY2OiBPSyAoNTQ2NCkKKyoqKiBUZXN0ICA2NzogT0sgKDIxMjUxNDQyMykKKyoqKiBUZXN0ICA2ODogT0sgKDIxMjUxNDQyMykKKyoqKiBUZXN0ICA2OTogT0sgKDg5OTU0NzEpCisqKiogVGVzdCAgNzA6IE9LICg2OTU0NDI3NykKKyoqKiBUZXN0ICA3MTogT0sgKDM0ODg2OTk3KQorKioqIFRlc3QgIDcyOiBPSyAoMTc4OTU2OTM2NSkKKyoqKiBUZXN0ICA3MzogT0sgKDkwMzI2MTUpCisqKiogVGVzdCAgNzQ6IE9LICgyMjQ5MDc2NjkpCisqKiogVGVzdCAgNzU6IE9LICgyMDAwNDAzNDA4KQorKioqIFRlc3QgIDc2OiBPSyAoMTYxMDA4NzkzNSkKKyoqKiBUZXN0ICA3NzogT0sgKDEzODg2NzEpCisqKiogVGVzdCAgNzg6IE9LICgxMzQyMTc3MjgpCisqKiogVGVzdCAgNzk6IE9LICg3MDI4ODkyOSkKKyoqKiBUZXN0ICA4MDogT0sgKDE3ODk1NzY1KQorKioqIFRlc3QgIDgxOiBPSyAoMzg3KQorKioqIFRlc3QgIDgyOiBPSyAoODQ1NDQwMSkKKyoqKiBUZXN0ICA4MzogT0sgKDI4MzUpCisqKiogVGVzdCAgODQ6IE9LICg5MzQ3ODIxMDEpCisqKiogVGVzdCAgODU6IE9LICgxOTg2ODkpCistLS0gVGVzdCAgODY6IEFsbCB0ZXN0cyB3ZXJlIHJ1biB3aXRoIHRocm93aW5nIGV4Y2VwdGlvbnMgb24gZXJyb3IuCisJICAgICAgVGhlICRWSU1OT0VSUlRIUk9XIGNvbnRyb2wgaXMgbm90IGNvbmZpZ3VyZWQuCistLS0gVGVzdCAgODY6IEFsbCB0ZXN0cyB3ZXJlIHJ1biB3aXRoIHRocm93aW5nIGV4Y2VwdGlvbnMgb24gaW50ZXJydXB0LgorCSAgICAgIFRoZSAkVklNTk9JTlRUSFJPVyBjb250cm9sIGlzIG5vdCBjb25maWd1cmVkLgorKioqIFRlc3QgIDg2OiBPSyAoNTA0NDM5OTUpCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NDkudmltIGIvc3JjL3Rlc3RkaXIvdGVzdDQ5LnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQyYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDQ5LnZpbQpAQCAtMCwwICsxLDk2NjYgQEAKKyIgVmltIHNjcmlwdCBsYW5ndWFnZSB0ZXN0cworIiBBdXRob3I6CVNlcnZhdGl1cyBCcmFuZHQgPFNlcnZhdGl1cy5CcmFuZHRAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyIgTGFzdCBDaGFuZ2U6CTIwMDQgQXByIDAzCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgZW52aXJvbm1lbnQJCQkJCQkJICAgIHt7ezEKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIiBBZGRpbmcgbmV3IHRlc3RzIGVhc2lseS4JCQkJCQkgICAge3t7MgorIgorIiBXcml0aW5nIG5ldyB0ZXN0cyBpcyBlYXNlZCBjb25zaWRlcmFibHkgd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQKKyIgYWJicmV2aWF0aW9ucyAoc2VlICJDb21tYW5kcyBmb3IgcmVjb3JkaW5nIHRoZSBleGVjdXRpb24gcGF0aCIsICJBdXRvbWF0aWMKKyIgYXJndW1lbnQgZ2VuZXJhdGlvbiIpLgorIgorIiBUbyBnZXQgdGhlIGFiYnJldmlhdGlvbnMsIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyIKKyIgICAgOmxldCB0ZXN0NDlfc2V0X2VudiA9IDEgfCBzb3VyY2UgdGVzdDQ5LnZpbQorIgorIiBUbyBnZXQgdGhlbSBhbHdheXMgKGZyb20gc3JjL3Rlc3RkaXIpLCBwdXQgYSBsaW5lCisiCisiICAgIGF1ISBCdWZSZWFkIHRlc3Q0OS52aW0gbGV0IHRlc3Q0OV9zZXRfZW52ID0gMSB8IHNvdXJjZSB0ZXN0NDkudmltCisiCisiIGludG8gdGhlIGxvY2FsIC52aW1yYyBmaWxlIGluIHRoZSBzcmMvdGVzdGRpciBkaXJlY3RvcnkuCisiCitpZiBleGlzdHMoInRlc3Q0OV9zZXRfZW52IikgJiYgdGVzdDQ5X3NldF9lbnYKKworICAgICIgQXV0b21hdGljIGFyZ3VtZW50IGdlbmVyYXRpb24gZm9yIHRoZSB0ZXN0IGVudmlyb25tZW50IGNvbW1hbmRzLgorCisgICAgZnVuY3Rpb24hIFhzdW0oKQorCWxldCBhZGRlbmQgPSBzdWJzdGl0dXRlKGdldGxpbmUoIi4iKSwgJ14uKiJccypYOlxzKlx8Xi4qJywgJycsICIiKQorCSIgRXZhbHVhdGUgYXJpdGhtZXRpYyBleHByZXNzaW9uLgorCWlmIGFkZGVuZCAhPSAiIgorCSAgICBleGVjICJsZXQgZzpYc3VtID0gZzpYc3VtICsgIiAuIGFkZGVuZAorCWVuZGlmCisgICAgZW5kZnVuY3Rpb24KKworICAgIGZ1bmN0aW9uISBYY2hlY2soKQorCWxldCBnOlhzdW09MAorCT9YcGF0aElOSVQ/LC5jYWxsIFhzdW0oKQorCWV4ZWMgIm5vcm0gQSAiCisJcmV0dXJuIGc6WHN1bQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBpYWIgWGNoZWNrIFhjaGVjazxTcGFjZT48Qy1SPj1YY2hlY2soKTxDUj48Qy1PPngKKworICAgIGZ1bmN0aW9uISBYY29tbWVudChudW0pCisJbGV0IHN0ciA9ICIiCisJbGV0IHRhYndpZHRoID0gJnN0cyA/ICZzdHMgOiAmdHMKKwlsZXQgdGFicyA9ICg0OCt0YWJ3aWR0aCAtIGE6bnVtIC0gdmlydGNvbCgiLiIpKSAvIHRhYndpZHRoCisJd2hpbGUgdGFicyA+IDAKKwkgICAgbGV0IHN0ciA9IHN0ciAuICJcdCIKKwkgICAgbGV0IHRhYnMgPSB0YWJzIC0gMQorCWVuZHdoaWxlCisJbGV0IHN0ciA9IHN0ciAuICciIFg6JworCXJldHVybiBzdHIKKyAgICBlbmRmdW5jdGlvbgorCisgICAgZnVuY3Rpb24hIFhsb29wKCkKKwlsZXQgYmFjayA9IGxpbmUoIi4iKSAuICJ8bm9ybSIgLiB2aXJ0Y29sKCIuIikgLiAifCIKKwlub3JtIDAKKwlsZXQgbGFzdCA9IHNlYXJjaCgnWFwobG9vcFx8cGF0aFwpSU5JVFx8WGxvb3BcPicsICJiVyIpCisJZXhlYyBiYWNrCisJbGV0IHRoZWxpbmUgPSBnZXRsaW5lKGxhc3QpCisJaWYgdGhlbGluZSA9fiAnWFwobG9vcFx8cGF0aFwpSU5JVCcKKwkgICAgbGV0IG51bSA9IDEKKwllbHNlCisJICAgIGxldCBudW0gPSAyICogc3Vic3RpdHV0ZSh0aGVsaW5lLCAnLipYbG9vcFxzKlwoXGRcK1wpLionLCAnXDEnLCAiIikKKwllbmRpZgorCT9YXChsb29wXHxwYXRoXClJTklUPworCSAgICBccy9cKFhsb29wSU5JVCFcPVxzKlxkXCtcc1wrXClcQDw9XChcZFwrXCkvXD0yKnN1Ym1hdGNoKDIpLworCWV4ZWMgYmFjaworCWV4ZWMgIm5vcm0gYSAiCisJcmV0dXJuIG51bSAuIFhjb21tZW50KHN0cmxlbihudW0pKQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBpYWIgWGxvb3AgWGxvb3A8U3BhY2U+PEMtUj49WGxvb3AoKTxDUj48Qy1PPngKKworICAgIGZ1bmN0aW9uISBYcGF0aChsb29waW5pdCkKKwlsZXQgYmFjayA9IGxpbmUoIi4iKSAuICJ8bm9ybSIgLiB2aXJ0Y29sKCIuIikgLiAifCIKKwlub3JtIDAKKwlsZXQgbGFzdCA9IHNlYXJjaCgnWHBhdGhJTklUXHxYcGF0aFw+XHxYbG9vcElOSVQnLCAiYlciKQorCWV4ZWMgYmFjaworCWxldCB0aGVsaW5lID0gZ2V0bGluZShsYXN0KQorCWlmIHRoZWxpbmUgPX4gJ1hwYXRoSU5JVCcKKwkgICAgbGV0IG51bSA9IDEKKwllbHNlaWYgdGhlbGluZSA9fiAnWHBhdGhcPicKKwkgICAgbGV0IG51bSA9IDIgKiBzdWJzdGl0dXRlKHRoZWxpbmUsICcuKlhwYXRoXHMqXChcZFwrXCkuKicsICdcMScsICIiKQorCWVsc2UKKwkgICAgbGV0IHBhdHRlcm4gPSAnLipYbG9vcElOSVQhXD1ccypcKFxkXCtcKVxzKlwoXGRcK1wpLionCisJICAgIGxldCBudW0gPSBzdWJzdGl0dXRlKHRoZWxpbmUsIHBhdHRlcm4sICdcMScsICIiKQorCSAgICBsZXQgZmFjdG9yID0gc3Vic3RpdHV0ZSh0aGVsaW5lLCBwYXR0ZXJuLCAnXDInLCAiIikKKwkgICAgIiBUaGUgIjxDLU8+eCIgZnJvbSB0aGUgIlhwYXRoIiBpYWIgYW5kIHRoZSBjaGFyYWN0ZXIgdHJpZ2dlcmluZyBpdHMKKwkgICAgIiBleHBhbnNpb24gYXJlIGluIHRoZSBpbnB1dCBidWZmZXIuICBTYXZlIGFuZCBjbGVhciB0eXBlYWhlYWQgc28KKwkgICAgIiB0aGF0IGl0IGlzIG5vdCByZWFkIGF3YXkgYnkgdGhlIGNhbGwgdG8gImlucHV0KCkiIGJlbG93LiAgUmVzdG9yZQorCSAgICAiIGFmdGVyd2FyZHMuCisJICAgIGNhbGwgaW5wdXRzYXZlKCkKKwkgICAgbGV0IGxvb3BzID0gaW5wdXQoIk51bWJlciBvZiBpdGVyYXRpb25zIGluIHByZXZpb3VzIGxvb3A/ICIpCisJICAgIGNhbGwgaW5wdXRyZXN0b3JlKCkKKwkgICAgd2hpbGUgKGxvb3BzID4gMCkKKwkJbGV0IG51bSA9IG51bSAqIGZhY3RvcgorCQlsZXQgbG9vcHMgPSBsb29wcyAtIDEKKwkgICAgZW5kd2hpbGUKKwllbmRpZgorCWV4ZWMgIm5vcm0gYSAiCisJaWYgYTpsb29waW5pdAorCSAgICByZXR1cm4gbnVtIC4gIiAxIgorCWVuZGlmCisJcmV0dXJuIG51bSAuIFhjb21tZW50KHN0cmxlbihudW0pKQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBpYWIgWHBhdGggWHBhdGg8U3BhY2U+PEMtUj49WHBhdGgoMCk8Q1I+PEMtTz54CisgICAgaWFiIFhsb29wSU5JVCBYbG9vcElOSVQ8U3BhY2U+PEMtUj49WHBhdGgoMSk8Q1I+PEMtTz54CisKKyAgICAiIEFsc28gdXNlZnVsIChzZWUgRXh0cmFWaW0gYmVsb3cpOgorICAgIGF1ZyBFeHRyYVZpbQorCWF1IQorCWF1ICBCdWZFbnRlciA8c2ZpbGU+IHN5biByZWdpb24gRXh0cmFWaW0KKwkJICAgIFwgc3RhcnQ9K15pZlxzXCtFeHRyYVZpbSguKikrIGVuZD0rXmVuZGlmKworCQkgICAgXCB0cmFuc3BhcmVudCBrZWVwZW5kCisJYXUgIEJ1ZkVudGVyIDxzZmlsZT4gc3luIG1hdGNoIEV4dHJhQ29tbWVudCAvXiIvCisJCSAgICBcIGNvbnRhaW5lZCBjb250YWluZWRpbj1FeHRyYVZpbQorCWF1ICBCdWZFbnRlciA8c2ZpbGU+IGhpIGxpbmsgRXh0cmFDb21tZW50IHZpbUNvbW1lbnQKKyAgICBhdWcgRU5ECisKKyAgICBhdWcgWHBhdGgKKwlhdSAgQnVmRW50ZXIgPHNmaWxlPiBzeW4ga2V5d29yZCBYcGF0aAorCQkgICAgXCBYcGF0aElOSVQgWHBhdGggWGxvb3BJTklUIFhsb29wIFhsb29wTkVYVCBYY2hlY2sgWG91dAorCWF1ICBCdWZFbnRlciA8c2ZpbGU+IGhpIGxpbmsgWHBhdGggU3BlY2lhbAorICAgIGF1ZyBFTkQKKworICAgIGRvIEJ1ZkVudGVyIDxzZmlsZT4KKworICAgICIgRG8gbm90IGV4ZWN1dGUgdGhlIHRlc3RzIHdoZW4gc291cmNpbmcgdGhpcyBmaWxlIGZvciBnZXR0aW5nIHRoZSBmdW5jdGlvbnMKKyAgICAiIGFuZCBhYmJyZXZpYXRpb25zIGFib3ZlLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIGVhc2lseSBhZGRpbmcgbmV3IHRlc3QKKyAgICAiIGNhc2VzOyB0aGV5IGFyZSBub3QgbmVlZGVkIGZvciB0ZXN0IGV4ZWN1dGlvbi4gIFVubGV0IHRoZSB2YXJpYWJsZQorICAgICIgY29udHJvbGxpbmcgdGhpcyBzbyB0aGF0IGFuIGV4cGxpY2l0ICI6c291cmNlIiBjb21tYW5kIGZvciB0aGlzIGZpbGUgd2lsbAorICAgICIgZXhlY3V0ZSB0aGUgdGVzdHMuCisgICAgdW5sZXQgdGVzdDQ5X3NldF9lbnYKKyAgICBmaW5pc2gKKworZW5kaWYKKworCisiIENvbW1hbmRzIGZvciByZWNvcmRpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoLgkJCQkgICAge3t7MgorIgorIiBUaGUgWHBhdGgvWGxvb3AgY29tbWFuZHMgY2FuIGJlIHVzZWQgZm9yIGNvbXB1dGluZyB0aGUgZVhlY3V0aW9uIHBhdGggYnkKKyIgYWRkaW5nIChkaWZmZXJlbnQpIHBvd2VycyBvZiAyIGZyb20gdGhvc2Ugc2NyaXB0IGxpbmVzLCBmb3Igd2hpY2ggdGhlCisiIGV4ZWN1dGlvbiBzaG91bGQgYmUgY2hlY2tlZC4gIFhsb29wIHByb3ZpZGVzIGRpZmZlcmVudCBhZGRlbmRzIGZvciBlYWNoCisiIGV4ZWN1dGlvbiBvZiBhIGxvb3AuICBQZXJtaXR0YWJsZSB2YWx1ZXMgYXJlIDJeMCB0byAyXjMwLCBzbyB0aGF0IDMxIGV4ZWN1dGlvbgorIiBwb2ludHMgKG11bHRpcGx5IGNvdW50ZWQgaW5zaWRlIGxvb3BzKSBjYW4gYmUgdGVzdGVkLgorIgorIiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50cyBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGNhbiBiZSBnZW5lcmF0ZWQKKyIgYXV0b21hdGljYWxseSwgc2VlIGJlbG93LgorIgorIiBVc2FnZToJCQkJCQkJCSAgICB7e3szCisiCisiICAgLSBVc2UgWHBhdGhJTklUIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3QuCisiCisiICAgLSBVc2UgWHBhdGggdG8gY2hlY2sgaWYgYSBsaW5lIGlzIGV4ZWN1dGVkLgorIiAgICAgQXJndW1lbnQ6IHBvd2VyIG9mIDIgKGRlY2ltYWwpLgorIgorIiAgIC0gVG8gY2hlY2sgbXVsdGlwbGUgZXhlY3V0aW9uIG9mIGxvb3BzIHVzZSBYbG9vcCBmb3IgYXV0b21hdGljYWxseQorIiAgICAgY29tcHV0aW5nIFhwYXRoIHZhbHVlczoKKyIKKyIJLSBVc2UgWGxvb3BJTklUIGJlZm9yZSB0aGUgbG9vcC4KKyIJICBUd28gYXJndW1lbnRzOgorIgkJLSB0aGUgZmlyc3QgWHBhdGggdmFsdWUgKHBvd2VyIG9mIDIpIHRvIGJlIHVzZWQgKFhuZXh0KSwKKyIJCS0gZmFjdG9yIGZvciBjb21wdXRpbmcgYSBuZXcgWG5leHQgdmFsdWUgd2hlbiByZWV4ZWN1dGluZyBhIGxvb3AKKyIJCSAgKGJ5IGEgIjpjb250aW51ZSIgb3IgIjplbmR3aGlsZSIpOyB0aGlzIHNob3VsZCBiZSAyXm4gd2hlcmUKKyIJCSAgbiBpcyB0aGUgbnVtYmVyIG9mIFhsb29wIGNvbW1hbmRzIGluc2lkZSB0aGUgbG9vcC4KKyIJICBJZiBYbG9vcElOSVQhIGlzIHVzZWQsIHRoZSBmaXJzdCBleGVjdXRpb24gb2YgWGxvb3BORVhUIGlzCisiCSAgYSBuby1vcGVyYXRpb24uCisiCisiICAgICAgIC0gVXNlIFhsb29wIGluc2lkZSB0aGUgbG9vcDoKKyIJICBPbmUgYXJndW1lbnQ6CisiCQlUaGUgYXJndW1lbnQgYW5kIHRoZSBYbmV4dCB2YWx1ZSBhcmUgbXVsdGlwbGllZCB0byBidWlsZCB0aGUKKyIJCW5leHQgWHBhdGggdmFsdWUuICBObyBuZXcgWG5leHQgdmFsdWUgaXMgcHJlcGFyZWQuICBUaGUgYXJndW1lbnQKKyIJCXNob3VsZCBiZSAyXihuLTEpIGZvciB0aGUgbnRoIFhsb29wIGNvbW1hbmQgaW5zaWRlIHRoZSBsb29wLgorIgkJSWYgdGhlIGxvb3AgaGFzIG9ubHkgb25lIFhsb29wIGNvbW1hbmQsIHRoZSBhcmd1bWVudCBjYW4gYmUKKyIJCW9tbWl0dGVkIChkZWZhdWx0OiAxKS4KKyIKKyIJLSBVc2UgWGxvb3BORVhUIGJlZm9yZSAiOmNvbnRpbnVlIiBhbmQgIjplbmR3aGlsZSIuICBUaGlzIGNvbXB1dGVzIGEgbmV3CisiCSAgWG5leHQgdmFsdWUgZm9yIHRoZSBuZXh0IGV4ZWN1dGlvbiBvZiB0aGUgbG9vcCBieSBtdWx0aXBseWluZyB0aGUgb2xkCisiCSAgb25lIHdpdGggdGhlIGZhY3RvciBzcGVjaWZpZWQgaW4gdGhlIFhsb29wSU5JVCBjb21tYW5kLiAgTm8gQXJndW1lbnQuCisiCSAgQWx0ZXJuYXRpdmVseSwgd2hlbiBYbG9vcElOSVQhIGlzIHVzZWQsIGEgc2luZ2xlIFhsb29wTkVYVCBhdCB0aGUKKyIJICBiZWdpbm5pbmcgb2YgdGhlIGxvb3AgY2FuIGJlIHVzZWQuCisiCisiICAgICBOZXN0ZWQgbG9vcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisiCisiICAgLSBVc2UgWGNoZWNrIGF0IGVuZCBvZiBlYWNoIHRlc3QuICBJdCBwcmludHMgdGhlIHRlc3QgbnVtYmVyLCB0aGUgZXhwZWN0ZWQKKyIgICAgIGV4ZWN1dGlvbiBwYXRoIHZhbHVlLCB0aGUgdGVzdCByZXN1bHQgKCJPSyIgb3IgIkZBSUwiKSwgYW5kLCBpZiB0aGUgdGVzdHMKKyIgICAgIGZhaWxzLCB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBwYXRoLgorIiAgICAgT25lIGFyZ3VtZW50OgorIgkgICAgRXhwZWN0ZWQgWHBhdGgvWGxvb3Agc3VtIGZvciB0aGUgY29ycmVjdCBleGVjdXRpb24gcGF0aC4KKyIJICAgIEluIG9yZGVyIHRoYXQgdGhpcyB2YWx1ZSBjYW4gYmUgY29tcHV0ZWQgYXV0b21hdGljYWxseSwgZG8gdGhlCisiCSAgICBmb2xsb3dpbmc6IEZvciBlYWNoIGxpbmUgaW4gdGhlIHRlc3Qgd2l0aCBhbiBYcGF0aCBhbmQgWGxvb3AKKyIJICAgIGNvbW1hbmQsIGFkZCBhIGNvbW1lbnQgc3RhcnRpbmcgd2l0aCAiWDoiIGFuZCBzcGVjaWZ5aW5nIGFuCisiCSAgICBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBjb250cmlidXRlZCBieSB0aGlzIGxpbmUgdG8KKyIJICAgIHRoZSBjb3JyZWN0IGV4ZWN1dGlvbiBwYXRoLiAgKEZvciBjb3B5aW5nIGFuIFhwYXRoIGFyZ3VtZW50IG9mIGF0CisiCSAgICBsZWFzdCB0d28gZGlnaXRzIGludG8gdGhlIGNvbW1lbnQsIHByZXNzIDxDLVA+LikgIEF0IHRoZSBlbmQgb2YgdGhlCisiCSAgICB0ZXN0LCBqdXN0IHR5cGUgIlhjaGVjayIgYW5kIHByZXNzIDxFc2M+LgorIgorIiAgIC0gSW4gb3JkZXIgdG8gYWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIHRlc3Qgb3V0cHV0IGZpbGUsIHVzZSB0aGUKKyIgICAgIFhvdXQgY29tbWFuZC4gIEFyZ3VtZW50KHMpIGxpa2UgIjplY2hvIi4KKyIKKyIgQXV0b21hdGljIGFyZ3VtZW50IGdlbmVyYXRpb246CQkJCQkgICAge3t7MworIgorIiAgIFRoZSBhcmd1bWVudHMgb2YgdGhlIFhwYXRoLCBYbG9vcElOSVQsIFhsb29wLCBhbmQgWGNoZWNrIGNvbW1hbmRzIGNhbiBiZQorIiAgIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCBzbyB0aGF0IG5ldyB0ZXN0cyBjYW4gZWFzaWx5IGJlIHdyaXR0ZW4gd2l0aG91dAorIiAgIG1lbnRhbCBhcml0aG1ldGljLiAgVGhlIFhjaGVjayBhcmd1bWVudCBpcyBjb21wdXRlZCBmcm9tIHRoZSAiWDoiIGNvbW1lbnRzCisiICAgb2YgdGhlIHByZWNlZGluZyBYcGF0aCBhbmQgWGxvb3AgY29tbWFuZHMuICBTZWUgdGhlIGNvbW1hbmRzIGFuZAorIiAgIGFiYnJldmlhdGlvbnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUuCisiCisiIEltcGxlbWVudGF0aW9uOgkJCQkJCQkgICAge3t7MworIiAgICAgWHBhdGhJTklULCBYcGF0aCwgWGxvb3BJTklULCBYbG9vcCwgWGxvb3BORVhULCBYY2hlY2ssIFhvdXQuCisiCisiIFRoZSB2YXJpYW50cyBmb3IgZXhpc3RpbmcgZzpFeHRyYVZpbVJlc3VsdCBhcmUgbmVlZGVkIHdoZW4gZXhlY3V0aW5nIGEgc2NyaXB0CisiIGluIGFuIGV4dHJhIFZpbSBwcm9jZXNzLCBzZWUgRXh0cmFWaW0gYmVsb3cuCisKKyIgRVhUUkFfVklNX1NUQVJUIC0gZG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhpcyBsaW5lLgorCitjb20hCQkgICAgWHBhdGhJTklUCWxldCBnOlhwYXRoID0gMAorCitpZiBleGlzdHMoImc6RXh0cmFWaW1SZXN1bHQiKQorICAgIGNvbSEgLWNvdW50IC1iYXIgICAgWHBhdGgJZXhlYyAiIWVjaG8gPGNvdW50PiA+PiIgLiBnOkV4dHJhVmltUmVzdWx0CitlbHNlCisgICAgY29tISAtY291bnQgLWJhciAgICBYcGF0aAlsZXQgZzpYcGF0aCA9IGc6WHBhdGggKyA8Y291bnQ+CitlbmRpZgorCitjb20hIC1jb3VudCAtbmFyZ3M9MSAtYmFuZworCQkgIFwgWGxvb3BJTklUCWxldCBnOlhuZXh0ID0gPGNvdW50PiB8CisJCQkJICAgIFwgbGV0IGc6WGZhY3RvciA9IDxhcmdzPiB8CisJCQkJICAgIFwgbGV0IGc6WHNraXAgPSBzdHJsZW4oIjxiYW5nPiIpCisKK2lmIGV4aXN0cygiZzpFeHRyYVZpbVJlc3VsdCIpCisgICAgY29tISAtY291bnQ9MSAtYmFyICBYbG9vcAlleGVjICIhZWNobyAiIC4gKGc6WG5leHQgKiA8Y291bnQ+KSAuICIgPj4iIC4KKwkJCQkgICAgXCBnOkV4dHJhVmltUmVzdWx0CitlbHNlCisgICAgY29tISAtY291bnQ9MSAtYmFyICBYbG9vcAlsZXQgZzpYcGF0aCA9IGc6WHBhdGggKyBnOlhuZXh0ICogPGNvdW50PgorZW5kaWYKKworY29tIQkJICAgIFhsb29wTkVYVAlsZXQgZzpYbmV4dCA9IGc6WG5leHQgKgorCQkJCSAgICBcIChnOlhza2lwID8gMSA6IGc6WGZhY3RvcikgfAorCQkJCSAgICBcIGxldCBnOlhza2lwID0gMAorCitsZXQgQHIgPSAiIgorbGV0IFh0ZXN0ID0gMQorY29tISAtY291bnQJICAgIFhjaGVjawlsZXQgWHJlc3VsdCA9ICIqKiogVGVzdCAiIC4KKwkJCQkgICAgXCAoWHRlc3Q8MTA/IiAgIjpYdGVzdDwxMDA/IiAiOiIiKSAuCisJCQkJICAgIFwgWHRlc3QgLiAiOiAiIC4gKAorCQkJCSAgICBcIChYcGF0aD09PGNvdW50PikgPyAiT0sgKCIuWHBhdGguIikiIDoKKwkJCQkJXCAiRkFJTCAoIi5YcGF0aC4iIGluc3RlYWQgb2YgPGNvdW50PikiCisJCQkJICAgIFwgKSB8CisJCQkJICAgIFwgbGV0IEBSID0gWHJlc3VsdCAuICJcbiIgfAorCQkJCSAgICBcIGVjaG8gWHJlc3VsdCB8CisJCQkJICAgIFwgbGV0IFh0ZXN0ID0gWHRlc3QgKyAxCisKK2lmIGV4aXN0cygiZzpFeHRyYVZpbVJlc3VsdCIpCisgICAgY29tISAtbmFyZ3M9KyAgICBYb3V0CWV4ZWMgImV4ZWMgXCIhZWNobyBAUjonXCIgLiIKKwkJCQkgICAgXCAnc3Vic3RpdHV0ZShzdWJzdGl0dXRlKCInIC4gPGFyZ3M+IC4KKwkJCQkgICAgXCAnIiwgIicgLiAiJyIgLiAnIiwgJyAuICInIiAuICcmXFwmJicgLiAiJyIKKwkJCQkgICAgXCAuICcsICJnIiksICJcbiIsICJATkxAIiwgImciKScKKwkJCQkgICAgXCAiLiBcIicgPj5cIiAuIGc6RXh0cmFWaW1SZXN1bHQiCitlbHNlCisgICAgY29tISAtbmFyZ3M9KyAgICBYb3V0CWV4ZWMgJ2xldCBAUiA9ICItLS0gVGVzdCAnIC4KKwkJCQkgICAgXCAoZzpYdGVzdDwxMD8iICAiOmc6WHRlc3Q8MTAwPyIgIjoiIikgLgorCQkJCSAgICBcIGc6WHRlc3QgLiAiOiAiIC4KKwkJCQkgICAgXCAnIiAuIHN1YnN0aXR1dGUoIicgLiA8YXJncz4gLgorCQkJCSAgICBcICciLCAiXG4iLCAiJlx0ICAgICAgIiwgImciKSAuICJcbiInCitlbmRpZgorCisiIFN3aXRjaCBvZmYgc3RvcmluZyBvZiBsaW5lcyBmb3IgdW5kb2luZyBjaGFuZ2VzLiAgU3BlZWRzIHRoaW5ncyB1cCBhIGxpdHRsZS4KK3NldCB1bmRvbGV2ZWxzPS0xCisKKyIgRVhUUkFfVklNX1NUT1AgLSBkbyBub3QgY2hhbmdlIG9yIHJlbW92ZSB0aGlzIGxpbmUuCisKKworIiBFeHRyYVZpbSgpIC0gUnVuIGEgc2NyaXB0IGZpbGUgaW4gYW4gZXh0cmEgVmltIHByb2Nlc3MuCQkgICAge3t7MgorIgorIiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBpbW1lZGlhdGUgYWJvcnRpb24gb2YgdGhlIHNjcmlwdCBwcm9jZXNzaW5nIGR1ZSB0bworIiBhbiBlcnJvciBpbiBhIGNvbW1hbmQgZHluYW1pY2FsbHkgZW5jbG9zZWQgYnkgYSA6dHJ5Lzp0cnllbmQgcmVnaW9uIG9yIHdoZW4gYW4KKyIgZXhjZXB0aW9uIGlzIHRocm93biBidXQgbm90IGNhdWdodCBvciB3aGVuIGFuIGludGVycnVwdCBvY2N1cnMuICBJdCBjYW4gYWxzbworIiBiZSB1c2VkIGZvciB0ZXN0aW5nIDpmaW5pc2guCisiCisiIEFuIGludGVycnVwdCBsb2NhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGJ5IGFuICJJTlRFUlJVUFQiIGNvbW1lbnQuICBBIG51bWJlcgorIiB0ZWxsaW5nIGhvdyBvZnRlbiB0aGlzIGxvY2F0aW9uIGlzIHJlYWNoZWQgKGluIGEgbG9vcCBvciBpbiBzZXZlcmFsIGZ1bmN0aW9uCisiIGNhbGxzKSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIGFyZ3VtZW50LiAgV2hlbiBtaXNzaW5nLCBvbmNlIHBlciBzY3JpcHQKKyIgaW52b2NhdGlvbiBvciBmdW5jdGlvbiBjYWxsIGlzIGFzc3VtZWQuICBJTlRFUlJVUFQgbG9jYXRpb25zIGFyZSB0ZXN0ZWQgYnkKKyIgc2V0dGluZyBhIGJyZWFrcG9pbnQgaW4gdGhhdCBsaW5lIGFuZCB1c2luZyB0aGUgIj5xdWl0IiBkZWJ1ZyBjb21tYW5kIHdoZW4KKyIgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZC4gIEEgZnVuY3Rpb24gZm9yIHdoaWNoIGFuIElOVEVSUlVQVCBsb2NhdGlvbiBpcworIiBzcGVjaWZpZWQgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBjYWxsaW5nIGl0IChvciBleGVjdXRpbmcgaXQgYXMgYSBzY3JpcHQgYnkKKyIgdXNpbmcgRXhlY0FzU2NyaXB0IGJlbG93KS4KKyIKKyIgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpbiBub3JtYWwgbW9kdXMgKCJnOkV4dHJhVmltUmVzdWx0IiB1bmRlZmluZWQpLgorIgorIiBUZXN0cyB0byBiZSBleGVjdXRlZCBhcyBhbiBleHRyYSBzY3JpcHQgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgZm9sbG93czoKKyIKKyIJY29sdW1uIDEJCQljb2x1bW4gMQorIgl8CQkJCXwKKyIJdgkJCQl2CisiCisiCVhwYXRoSU5JVAkJCVhwYXRoSU5JVAorIglpZiBFeHRyYVZpbSgpCQkJaWYgRXh0cmFWaW0oKQorIgkgICAgLi4uCQkJCSIgICAuLi4KKyIJICAgIC4uLgkJCQkiICAgLi4uCisiCWVuZGlmCQkJCWVuZGlmCisiCVhjaGVjayA8bnVtYmVyPgkJCVhjaGVjayA8bnVtYmVyPgorIgorIiBEb3VibGUgcXVvdGVzIGluIGNvbHVtbiAxIGFyZSByZW1vdmVkIGJlZm9yZSB0aGUgc2NyaXB0IGlzIGV4ZWN1dGVkLgorIiBUaGV5IHNob3VsZCBiZSB1c2VkIGlmIHRoZSB0ZXN0IGhhcyB1bmJhbGFuY2VkIGNvbmRpdGlvbmFscyAoOmlmLzplbmRpZiwKKyIgOndoaWxlOi9lbmR3aGlsZSwgOnRyeS86ZW5kdHJ5KSBvciBmb3IgYSBsaW5lIHdpdGggYSBzeW50YXggZXJyb3IuICBUaGUKKyIgZXh0cmEgc2NyaXB0IG1heSB1c2UgWHBhdGgsIFhsb29wSU5JVCwgWGxvb3AsIFhsb29wTkVYVCwgYW5kIFhvdXQgYXMgdXN1YWwuCisiCisiIEEgZmlsZSBuYW1lIG1heSBiZSBzcGVjaWZpZWQgYXMgYXJndW1lbnQuICBBbGwgbWVzc2FnZXMgb2YgdGhlIGV4dHJhIFZpbQorIiBwcm9jZXNzIGFyZSB0aGVuIHJlZGlyZWN0ZWQgdG8gdGhlIGZpbGUuICBBbiBleGlzdGluZyBmaWxlIGlzIG92ZXJ3cml0dGVuLgorIgorbGV0IEV4dHJhVmltQ291bnQgPSAwCitsZXQgRXh0cmFWaW1CYXNlID0gZXhwYW5kKCI8c2ZpbGU+IikKK2xldCBFeHRyYVZpbVRlc3RFbnYgPSAiIgorIgorZnVuY3Rpb24hIEV4dHJhVmltKC4uLikKKyAgICAiIENvdW50IGhvdyBvZnRlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgICBsZXQgZzpFeHRyYVZpbUNvdW50ID0gZzpFeHRyYVZpbUNvdW50ICsgMQorCisgICAgIiBEaXNhYmxlIGZvbGRzIHRvIHByZXZlbnQgdGhhdCB0aGUgcmFuZ2VzIGluIHRoZSAiOndyaXRlIiBjb21tYW5kcyBiZWxvdworICAgICIgYXJlIGV4dGVuZGVkIHVwIHRvIHRoZSBlbmQgb2YgYSBjbG9zZWQgZm9sZC4gIFRoaXMgYWxzbyBzcGVlZHMgdGhpbmdzIHVwCisgICAgIiBjb25zaWRlcmFibHkuCisgICAgc2V0IG5vZm9sZGVuYWJsZQorCisgICAgIiBPcGVuIGEgYnVmZmVyIGZvciB0aGlzIHRlc3Qgc2NyaXB0IGFuZCBjb3B5IHRoZSB0ZXN0IGVudmlyb25tZW50IHRvCisgICAgIiBhIHRlbXBvcmFyeSBmaWxlLiAgVGFrZSBhY2NvdW50IG9mIHBhcnRzIHJlbGV2YW50IGZvciB0aGUgZXh0cmEgc2NyaXB0CisgICAgIiBleGVjdXRpb24gb25seS4KKyAgICBsZXQgY3VycmVudF9idWZmbnIgPSBidWZucigiJSIpCisgICAgZXhlY3V0ZSAidmlldyArMSIgZzpFeHRyYVZpbUJhc2UKKyAgICBpZiBnOkV4dHJhVmltQ291bnQgPT0gMQorCWxldCBnOkV4dHJhVmltVGVzdEVudiA9IHRlbXBuYW1lKCkKKwlleGVjdXRlICIvRSIgLiAiWFRSQV9WSU1fU1RBUlQvKywvRSIgLiAiWFRSQV9WSU1fU1RPUC8tdyIKKwkJICAgIFwgZzpFeHRyYVZpbVRlc3RFbnYgInwnXSsiCisJZXhlY3V0ZSAiL0UiIC4gIlhUUkFfVklNX1NUQVJULyssL0UiIC4gIlhUUkFfVklNX1NUT1AvLXcgPj4iCisJCSAgICBcIGc6RXh0cmFWaW1UZXN0RW52ICJ8J10rIgorCWV4ZWN1dGUgIi9FIiAuICJYVFJBX1ZJTV9TVEFSVC8rLC9FIiAuICJYVFJBX1ZJTV9TVE9QLy13ID4+IgorCQkgICAgXCBnOkV4dHJhVmltVGVzdEVudiAifCddKyIKKwlleGVjdXRlICIvRSIgLiAiWFRSQV9WSU1fU1RBUlQvKywvRSIgLiAiWFRSQV9WSU1fU1RPUC8tdyA+PiIKKwkJICAgIFwgZzpFeHRyYVZpbVRlc3RFbnYgInwnXSsiCisgICAgZW5kaWYKKworICAgICIgU3RhcnQgdGhlIGV4dHJhIFZpbSBzY3JpcHQgd2l0aCBhICI6c291cmNlIiBjb21tYW5kIGZvciB0aGUgdGVzdAorICAgICIgZW52aXJvbm1lbnQuICBUaGUgc291cmNlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBleHRyYSBzY3JpcHQgd2lsbCBiZQorICAgICIgYXBwZW5kZWQsIG5lZWRzIHRvIGJlIHBhc3NlZCBhcyB2YXJpYWJsZSAiRXh0cmFWaW1CZWdpbiIgdG8gdGhlIHNjcmlwdC4KKyAgICBsZXQgZXh0cmFfc2NyaXB0ID0gdGVtcG5hbWUoKQorICAgIGV4ZWMgIiFlY2hvICdzb3VyY2UgIiAuIGc6RXh0cmFWaW1UZXN0RW52IC4gIicgPiIgLiBleHRyYV9zY3JpcHQKKyAgICBsZXQgZXh0cmFfYmVnaW4gPSAxCisKKyAgICAiIFN0YXJ0aW5nIGJlaGluZCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgc2tpcCBvdmVyIHRoZSBmaXJzdCBnOkV4dHJhVmltQ291bnQKKyAgICAiIG9jY3VycmVuY2VzIG9mICJpZiBFeHRyYVZpbSgpIiBhbmQgY29weSB0aGUgZm9sbG93aW5nIGxpbmVzIHVwIHRvIHRoZQorICAgICIgbWF0Y2hpbmcgImVuZGlmIiB0byB0aGUgZXh0cmEgVmltIHNjcmlwdC4KKyAgICBleGVjdXRlICIvRSIgLiAiTkRfT0ZfVEVTVF9FTlZJUk9OTUVOVC8iCisgICAgZXhlYyAnbm9ybSAnIC4gZzpFeHRyYVZpbUNvdW50IC4gJy9eXHMqaWZcc1wrRXh0cmFWaW0oLiopLysnIC4gIlxuIgorICAgIGV4ZWN1dGUgIi4sL15lbmRpZi8td3JpdGUgPj4iIC4gZXh0cmFfc2NyaXB0CisKKyAgICAiIE9wZW4gYSBidWZmZXIgZm9yIHRoZSBleHRyYSBWaW0gc2NyaXB0LCBkZWxldGUgYWxsIF4iLCBhbmQgd3JpdGUgdGhlCisgICAgIiBzY3JpcHQgaWYgd2FzIGFjdHVhbGx5IG1vZGlmaWVkLgorICAgIGV4ZWN1dGUgImVkaXQgKyIgLiAoZXh0cmFfYmVnaW4gKyAxKSBleHRyYV9zY3JpcHQKKyAgICAsJHMvXiIvL2UKKyAgICB1cGRhdGUKKworICAgICIgQ291bnQgdGhlIElOVEVSUlVQVHMgYW5kIGJ1aWxkIHRoZSBicmVha3BvaW50IGFuZCBxdWl0IGNvbW1hbmRzLgorICAgIGxldCBicmVha3BvaW50cyA9ICIiCisgICAgbGV0IGRlYnVnX3F1aXRzID0gIiIKKyAgICBsZXQgaW5fZnVuYyA9IDAKKyAgICBleGVjIGV4dHJhX2JlZ2luCisgICAgd2hpbGUgc2VhcmNoKAorCSAgICBcICciXHMqSU5URVJSVVBUXGhcQCFcfF5ccypmdVwlW25jdGlvbl1cPiFcPVxzKlwlKFx1XHxzOlwpXHcqXHMqKFx8JworCSAgICBcIC4gJ15ccypcXFx8XlxzKmVuZGZcJVt1bmN0aW9uXVw+XHwnCisJICAgIFwgLiAnXCUoXlxzKmZ1XCVbbmN0aW9uXSFcPVxzKlwpXEA8IVwlKFx1XHxzOlwpXHcqXHMqKFx8JworCSAgICBcIC4gJ0V4ZWNBc1NjcmlwdFxzXCtcJShcdVx8czpcKVx3KicsCisJICAgIFwgIlciKSA+IDAKKwlsZXQgdGhlbGluZSA9IGdldGxpbmUoIi4iKQorCWlmIHRoZWxpbmUgPX4gJ15ccypmdScKKwkgICAgIiBGdW5jdGlvbiBkZWZpbml0aW9uLgorCSAgICBsZXQgaW5fZnVuYyA9IDEKKwkgICAgbGV0IGZ1bmNfc3RhcnQgPSBsaW5lKCIuIikKKwkgICAgbGV0IGZ1bmNfbmFtZSA9IHN1YnN0aXR1dGUodGhlbGluZSwKKwkJXCAnXlxzKmZ1XCVbbmN0aW9uXSFcPVxzKlwoXCUoXHVcfHM6XClcdypcKS4qJywgJ1wxJywgIiIpCisJICAgIGxldCBmdW5jX2NvbnRzID0gMAorCWVsc2VpZiB0aGVsaW5lID1+ICdeXHMqXFwnCisJICAgIGlmIGluX2Z1bmMKKwkJbGV0IGZ1bmNfY29udHMgPSBmdW5jX2NvbnRzICsgMQorCSAgICBlbmRpZgorCWVsc2VpZiB0aGVsaW5lID1+ICdeXHMqZW5kZicKKwkgICAgIiBFbmQgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKwkgICAgbGV0IGluX2Z1bmMgPSAwCisJZWxzZQorCSAgICBsZXQgZmluZGluZyA9IHN1YnN0aXR1dGUodGhlbGluZSwgJy4qXChcJScgLiBjb2woIi4iKSAuICdjLipcKScsCisJCVwgJ1wxJywgIiIpCisJICAgIGlmIGZpbmRpbmcgPX4gJ14iXHMqSU5URVJSVVBUXGhcQCEnCisJCSIgSW50ZXJydXB0IGNvbW1lbnQuICBDb21wb3NlIGFzIG1hbnkgcXVpdCBjb21tYW5kcyBhcworCQkiIHNwZWNpZmllZC4KKwkJbGV0IGNudCA9IHN1YnN0aXR1dGUoZmluZGluZywKKwkJICAgIFwgJ14iXHMqSU5URVJSVVBUXHMqXChcZCpcKS4qJCcsICdcMScsICIiKQorCQlsZXQgcXVpdHMgPSAiIgorCQl3aGlsZSBjbnQgPiAwCisJCSAgICAiIFVzZSAiXHIiIHJhdGhlciB0aGFuICJcbiIgdG8gc2VwYXJhdGUgdGhlIHF1aXQgY29tbWFuZHMuCisJCSAgICAiICJcciIgaXMgbm90IGludGVycHJldGVkIGFzIGNvbW1hbmQgc2VwYXJhdG9yIGJ5IHRoZSAiOiEiCisJCSAgICAiIGNvbW1hbmQgYmVsb3cgYnV0IHdvcmtzIHRvIHNlcGFyYXRlIGNvbW1hbmRzIGluIHRoZQorCQkgICAgIiBleHRlcm5hbCB2aW0uCisJCSAgICBsZXQgcXVpdHMgPSBxdWl0cyAuICJxXHIiCisJCSAgICBsZXQgY250ID0gY250IC0gMQorCQllbmR3aGlsZQorCQlpZiBpbl9mdW5jCisJCSAgICAiIEFkZCB0aGUgZnVuY3Rpb24gYnJlYWtwb2ludCBhbmQgbm90ZSB0aGUgbnVtYmVyIG9mIHF1aXRzCisJCSAgICAiIHRvIGJlIHVzZWQsIGlmIHNwZWNpZmllZCwgb3Igb25lIGZvciBldmVyeSBjYWxsIGVsc2UuCisJCSAgICBsZXQgYnJlYWtwb2ludHMgPSBicmVha3BvaW50cyAuICIgLWMgJ2JyZWFrYWRkIGZ1bmMgIiAuCisJCQlcIChsaW5lKCIuIikgLSBmdW5jX3N0YXJ0IC0gZnVuY19jb250cykgLiAiICIgLgorCQkJXCBmdW5jX25hbWUgLiAiJyIKKwkJICAgIGlmIHF1aXRzICE9ICIiCisJCQlsZXQgZGVidWdfcXVpdHMgPSBkZWJ1Z19xdWl0cyAuIHF1aXRzCisJCSAgICBlbHNlaWYgIWV4aXN0cygicXVpdHN7ZnVuY19uYW1lfSIpCisJCQlsZXQgcXVpdHN7ZnVuY19uYW1lfSA9ICJxXHIiCisJCSAgICBlbHNlCisJCQlsZXQgcXVpdHN7ZnVuY19uYW1lfSA9IHF1aXRze2Z1bmNfbmFtZX0gLiAicVxyIgorCQkgICAgZW5kaWYKKwkJZWxzZQorCQkgICAgIiBBZGQgdGhlIGZpbGUgYnJlYWtwb2ludCBhbmQgdGhlIHF1aXRzIHRvIGJlIHVzZWQgZm9yIGl0LgorCQkgICAgbGV0IGJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHMgLiAiIC1jICdicmVha2FkZCBmaWxlICIgLgorCQkJXCBsaW5lKCIuIikgLiAiICIgLiBleHRyYV9zY3JpcHQgLiAiJyIKKwkJICAgIGlmIHF1aXRzID09ICIiCisJCQlsZXQgcXVpdHMgPSAicVxyIgorCQkgICAgZW5kaWYKKwkJICAgIGxldCBkZWJ1Z19xdWl0cyA9IGRlYnVnX3F1aXRzIC4gcXVpdHMKKwkJZW5kaWYKKwkgICAgZWxzZQorCQkiIEFkZCB0aGUgcXVpdHMgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyB0aGUgZnVuY3Rpb24gb3IgZXhlY3V0aW5nCisJCSIgaXQgYXMgc2NyaXB0IGZpbGUuCisJCWlmIGZpbmRpbmcgPX4gJ15FeGVjQXNTY3JpcHQnCisJCSAgICAiIFNvdXJjaW5nIGZ1bmN0aW9uIGFzIHNjcmlwdC4KKwkJICAgIGxldCBmaW5kaW5nID0gc3Vic3RpdHV0ZShmaW5kaW5nLAorCQkJXCAnXkV4ZWNBc1NjcmlwdFxzXCtcKFwlKFx1XHxzOlwpXHcqXCkuKicsICdcMScsICIiKQorCQllbHNlCisJCSAgICAiIEZ1bmN0aW9uIGNhbGwuCisJCSAgICBsZXQgZmluZGluZyA9IHN1YnN0aXR1dGUoZmluZGluZywKKwkJCVwgJ15cKFwlKFx1XHxzOlwpXHcqXCkuKicsICdcMScsICIiKQorCQllbmRpZgorCQlpZiBleGlzdHMoInF1aXRze2ZpbmRpbmd9IikKKwkJICAgIGxldCBkZWJ1Z19xdWl0cyA9IGRlYnVnX3F1aXRzIC4gcXVpdHN7ZmluZGluZ30KKwkJZW5kaWYKKwkgICAgZW5kaWYKKwllbmRpZgorICAgIGVuZHdoaWxlCisKKyAgICAiIENsb3NlIHRoZSBidWZmZXIgZm9yIHRoZSBzY3JpcHQgYW5kIGNyZWF0ZSBhbiAoZW1wdHkpIHJlc3VsdGZpbGUuCisgICAgYndpcGVvdXQKKyAgICBsZXQgcmVzdWx0ZmlsZSA9IHRlbXBuYW1lKCkKKyAgICBleGVjICIhPiIgLiByZXN1bHRmaWxlCisKKyAgICAiIFJ1biB0aGUgc2NyaXB0IGluIGFuIGV4dHJhIHZpbS4gIFN3aXRjaCB0byBleHRyYSBtb2R1cyBieSBwYXNzaW5nIHRoZQorICAgICIgcmVzdWx0ZmlsZSBpbiBFeHRyYVZpbVJlc3VsdC4gIFJlZGlyZWN0IG1lc3NhZ2VzIHRvIHRoZSBmaWxlIHNwZWNpZmllZCBhcworICAgICIgYXJndW1lbnQgaWYgYW55LiAgVXNlICI6ZGVidWdncmVlZHkiIHNvIHRoYXQgdGhlIGNvbW1hbmRzIHByb3ZpZGVkIG9uIHRoZQorICAgICIgcGlwZSBhcmUgY29uc3VtZWQgYXQgdGhlIGRlYnVnIHByb21wdC4gIFVzZSAiLU4iIHRvIGVuYWJsZSBjb21tYW5kLWxpbmUKKyAgICAiIGNvbnRpdW5hdGlvbiAoIkMiIGluICdjcG8nKS4gIEFkZCAibnZpbWluZm8iIHRvICd2aW1pbmZvJyB0byBhdm9pZAorICAgICIgbWVzc2luZyB1cCB0aGUgdXNlcidzIHZpbWluZm8gZmlsZS4KKyAgICBsZXQgcmVkaXJlY3QgPSBhOjAgPworCVwgIiAtYyAnYXUgVmltTGVhdmUgKiByZWRpciBFTkQnIC1jICdyZWRpclxcISA+IiAuIGE6MSAuICInIiA6ICIiCisgICAgZXhlYyAiIWVjaG8gJyIgLiBkZWJ1Z19xdWl0cyAuICJxJyB8IC4uL3ZpbSAtdSBOT05FIC1OIC1YZXMiIC4gcmVkaXJlY3QgLgorCVwgIiAtYyAnZGVidWdncmVlZHl8c2V0IHZpbWluZm8rPW52aW1pbmZvJyIgLgorCVwgIiAtYyAnbGV0IEV4dHJhVmltQmVnaW4gPSAiIC4gZXh0cmFfYmVnaW4gLiAiJyIgLgorCVwgIiAtYyAnbGV0IEV4dHJhVmltUmVzdWx0ID0gXCIiIC4gcmVzdWx0ZmlsZSAuICJcIiciIC4gYnJlYWtwb2ludHMgLgorCVwgIiAtUyAiIC4gZXh0cmFfc2NyaXB0CisKKyAgICAiIEJ1aWxkIHRoZSByZXN1bHRpbmcgc3VtIGZvciByZXN1bHRmaWxlIGFuZCBhZGQgaXQgdG8gZzpYcGF0aC4gIEFkZCBYb3V0CisgICAgIiBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgZXh0cmEgVmltIHByb2Nlc3MgdG8gdGhlIHRlc3Qgb3V0cHV0LgorICAgIGxldCBzdW0gPSAwCisgICAgZXhlYyAiZWRpdCIgcmVzdWx0ZmlsZQorICAgIGxldCBsaW5lID0gMQorICAgIHdoaWxlIGxpbmUgPD0gbGluZSgiJCIpCisJbGV0IHRoZWxpbmUgPSBnZXRsaW5lKGxpbmUpCisJaWYgdGhlbGluZSA9fiAnXkBSOicKKwkgICAgZXhlYyAnWG91dCAiJyAuIHN1YnN0aXR1dGUoc3Vic3RpdHV0ZSgKKwkJXCBlc2NhcGUoZXNjYXBlKHRoZWxpbmUsICciJyksICdcIicpLAorCQlcICdeQFI6JywgJycsICIiKSwgJ0BOTEAnLCAiXG4iLCAiZyIpIC4gJyInCisJZWxzZQorCSAgICBsZXQgc3VtID0gc3VtICsgZ2V0bGluZShsaW5lKQorCWVuZGlmCisJbGV0IGxpbmUgPSBsaW5lICsgMQorICAgIGVuZHdoaWxlCisgICAgYndpcGVvdXQKKyAgICBsZXQgZzpYcGF0aCA9IGc6WHBhdGggKyBzdW0KKworICAgICIgRGVsZXRlIHRoZSBleHRyYSBzY3JpcHQgYW5kIHRoZSByZXN1bHRmaWxlLgorICAgIGNhbGwgZGVsZXRlKGV4dHJhX3NjcmlwdCkKKyAgICBjYWxsIGRlbGV0ZShyZXN1bHRmaWxlKQorCisgICAgIiBTd2l0Y2ggYmFjayB0byB0aGUgYnVmZmVyIHRoYXQgd2FzIGFjdGl2ZSB3aGVuIHRoaXMgZnVuY3Rpb24gd2FzIGVudGVyZWQuCisgICAgZXhlYyAiYnVmZmVyIiBjdXJyZW50X2J1ZmZucgorCisgICAgIiBSZXR1cm4gMC4gIFRoaXMgcHJvdGVjdHMgZXh0cmEgc2NyaXB0cyBmcm9tIGJlaW5nIHJ1biBpbiB0aGUgbWFpbiBWaW0KKyAgICAiIHByb2Nlc3MuCisgICAgcmV0dXJuIDAKK2VuZGZ1bmN0aW9uCisKKworIiBFeHRyYVZpbVRocm93cG9pbnQoKSAtIFJlbGF0aXZlIHRocm93cG9pbnQgaW4gRXh0cmFWaW0gc2NyaXB0CQkgICAge3t7MgorIgorIiBFdmFsdWF0ZXMgdjp0aHJvd3BvaW50IGFuZCByZXR1cm5zIHRoZSB0aHJvd3BvaW50IHJlbGF0aXYgdG8gdGhlIGJlZ2lubmluZyBvZgorIiBhbiBFeHRyYVZpbSBzY3JpcHQgYXMgcGFzc2VkIGJ5IEV4dHJhVmltKCkgaW4gRXh0cmFWaW1CZWdpbi4KKyIKKyIgRVhUUkFfVklNX1NUQVJUIC0gZG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhpcyBsaW5lLgorZnVuY3Rpb24hIEV4dHJhVmltVGhyb3dwb2ludCgpCisgICAgaWYgIWV4aXN0cygiZzpFeHRyYVZpbUJlZ2luIikKKwlYb3V0ICJFeHRyYVZpbVRocm93cG9pbnQoKSB1c2VkIG91dHNpZGUgRXh0cmFWaW0oKSBzY3JpcHQuIgorCXJldHVybiB2OnRocm93cG9pbnQKKyAgICBlbmRpZgorCisgICAgaWYgdjp0aHJvd3BvaW50ID1+ICdeZnVuY3Rpb25cPicKKwlyZXR1cm4gdjp0aHJvd3BvaW50CisgICAgZW5kaWYKKworICAgIHJldHVybiAibGluZSAiIC4KKwlcIChzdWJzdGl0dXRlKHY6dGhyb3dwb2ludCwgJy4qLCBsaW5lICcsICcnLCAiIikgLSBnOkV4dHJhVmltQmVnaW4pIC4KKwlcICIgb2YgRXh0cmFWaW0oKSBzY3JpcHQiCitlbmRmdW5jdGlvbgorIiBFWFRSQV9WSU1fU1RPUCAtIGRvIG5vdCBjaGFuZ2Ugb3IgcmVtb3ZlIHRoaXMgbGluZS4KKworCisiIE1ha2VTY3JpcHQoKSAtIE1ha2UgYSBzY3JpcHQgZmlsZSBmcm9tIGEgZnVuY3Rpb24uCQkJICAgIHt7ezIKKyIKKyIgQ3JlYXRlIGEgc2NyaXB0IHRoYXQgY29uc2lzdHMgb2YgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIGE6ZnVuY25hbWUuCisiIFJlcGxhY2UgYW55ICI6cmV0dXJuIiBieSBhICI6ZmluaXNoIiwgYW55IGFyZ3VtZW50IHZhcmlhYmxlIGJ5IGEgZ2xvYmFsCisiIHZhcmlhYmxlLCBhbmQgYW5kIGV2ZXJ5ICI6Y2FsbCIgYnkgYSAiOnNvdXJjZSIgZm9yIHRoZSBuZXh0IGZvbGxvd2luZyBhcmd1bWVudAorIiBpbiB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGlmIHNpbWlsYXIgdGVzdHMgYXJlCisiIHRvIGJlIG1hZGUgZm9yIGEgIjpyZXR1cm4iIGZyb20gYSBmdW5jdGlvbiBjYWxsIG9yIGEgIjpmaW5pc2giIGluIGEgc2NyaXB0CisiIGZpbGUuCisiCisiIEluIG9yZGVyIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIElOVEVSUlVQVCBsb2NhdGlvbiAoc2VlIEV4dHJhVmltKQorIiBhcyBhIHNjcmlwdCBmaWxlLCB1c2UgRXhlY0FzU2NyaXB0IGJlbG93LgorIgorIiBFWFRSQV9WSU1fU1RBUlQgLSBkbyBub3QgY2hhbmdlIG9yIHJlbW92ZSB0aGlzIGxpbmUuCitmdW5jdGlvbiEgTWFrZVNjcmlwdChmdW5jbmFtZSwgLi4uKQorICAgIGxldCBzY3JpcHQgPSB0ZW1wbmFtZSgpCisgICAgZXhlY3V0ZSAicmVkaXIhID4iIC4gc2NyaXB0CisgICAgZXhlY3V0ZSAiZnVuY3Rpb24iIGE6ZnVuY25hbWUKKyAgICByZWRpciBFTkQKKyAgICBleGVjdXRlICJlZGl0IiBzY3JpcHQKKyAgICAiIERlbGV0ZSB0aGUgImZ1bmN0aW9uIiBhbmQgdGhlICJlbmRmdW5jdGlvbiIgbGluZXMuICBEbyBub3QgaW5jbHVkZSB0aGUKKyAgICAiIHdvcmQgImZ1bmN0aW9uIiBpbiB0aGUgcGF0dGVybiBzaW5jZSBpdCBtaWdodCBiZSB0cmFuc2xhdGVkIGlmIExBTkcgaXMKKyAgICAiIHNldC4gIFdoZW4gTWFrZVNjcmlwdCgpIGlzIGJlaW5nIGRlYnVnZ2VkLCB0aGlzIGRlbGV0ZXMgYWxzbyB0aGUgZGVidWdnaW5nCisgICAgIiBvdXRwdXQgb2YgaXRzIGxpbmUgMyBhbmQgNC4KKyAgICBleGVjICcxLC8uKicgLiBhOmZ1bmNuYW1lIC4gJyguKikvZCcKKyAgICAvXlxkKlxzKmVuZGZ1bmN0aW9uXD4vLCRkCisgICAgJXMvXlxkKi8vZQorICAgICVzL3JldHVybi9maW5pc2gvZQorICAgICVzL1w8YTpcKFxoXHcqXCkvZzpcMS9nZQorICAgIG5vcm1hbCBnZzAKKyAgICBsZXQgY250ID0gMAorICAgIHdoaWxlIHNlYXJjaCgnXDxjYWxsXHMqXCUoXHVcfHM6XClcdypccyooLiopJywgJ1cnKSA+IDAKKwlsZXQgY250ID0gY250ICsgMQorCXMvXDxjYWxsXHMqXCUoXHVcfHM6XClcdypccyooLiopL1w9J3NvdXJjZSAnIC4gYTp7Y250fS8KKyAgICBlbmR3aGlsZQorICAgIGcvXlxzKiQvZAorICAgIHdyaXRlCisgICAgYndpcGVvdXQKKyAgICByZXR1cm4gc2NyaXB0CitlbmRmdW5jdGlvbgorIiBFWFRSQV9WSU1fU1RPUCAtIGRvIG5vdCBjaGFuZ2Ugb3IgcmVtb3ZlIHRoaXMgbGluZS4KKworCisiIEV4ZWNBc1NjcmlwdCAtIFNvdXJjZSBhIHRlbXBvcmFyeSBzY3JpcHQgbWFkZSBmcm9tIGEgZnVuY3Rpb24uCSAgICB7e3syCisiCisiIE1ha2UgYSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUgZnJvbSB0aGUgZnVuY3Rpb24gYTpmdW5jbmFtZSwgIjpzb3VyY2UiIGl0LCBhbmQKKyIgZGVsZXRlIGl0IGFmdGVyd2FyZHMuCisiCisiIFdoZW4gaW5zaWRlICI6aWYgRXh0cmFWaW0oKSIsIGFkZCBhIGZpbGUgYnJlYWtwb2ludCBmb3IgZWFjaCBJTlRFUlJVUFQKKyIgbG9jYXRpb24gc3BlY2lmaWVkIGluIHRoZSBmdW5jdGlvbi4KKyIKKyIgRVhUUkFfVklNX1NUQVJUIC0gZG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhpcyBsaW5lLgorZnVuY3Rpb24hIEV4ZWNBc1NjcmlwdChmdW5jbmFtZSkKKyAgICAiIE1ha2UgYSBzY3JpcHQgZnJvbSB0aGUgZnVuY3Rpb24gcGFzc2VkIGFzIGFyZ3VtZW50LgorICAgIGxldCBzY3JpcHQgPSBNYWtlU2NyaXB0KGE6ZnVuY25hbWUpCisKKyAgICAiIFdoZW4gcnVubmluZyBpbiBhbiBleHRyYSBWaW0gcHJvY2VzcywgYWRkIGEgZmlsZSBicmVha3BvaW50IGZvciBlYWNoCisgICAgIiBmdW5jdGlvbiBicmVha3BvaW50IHNldCB3aGVuIHRoZSBleHRyYSBWaW0gcHJvY2VzcyB3YXMgaW52b2tlZCBieQorICAgICIgRXh0cmFWaW0oKS4KKyAgICBpZiBleGlzdHMoImc6RXh0cmFWaW1SZXN1bHQiKQorCWxldCBicGxpc3QgPSB0ZW1wbmFtZSgpCisJZXhlY3V0ZSAicmVkaXIhID4iIC4gYnBsaXN0CisJYnJlYWtsaXN0CisJcmVkaXIgRU5ECisJZXhlY3V0ZSAiZWRpdCIgYnBsaXN0CisJIiBHZXQgdGhlIGxpbmUgbnVtYmVyIGZyb20gdGhlIGZ1bmN0aW9uIGJyZWFrcG9pbnQuICBXb3JrcyBhbHNvIHdoZW4KKwkiIExBTkcgaXMgc2V0LgorCWV4ZWN1dGUgJ3YvXlxzKlxkXCtcc1wrZnVuY1xzXCsnIC4gYTpmdW5jbmFtZSAuICdccy4qL2QnCisJJXMvXlxzKlxkXCtcc1wrZnVuY1xzXCtcJShcdVx8czpcKVx3KlxzXEQqXChcZCpcKS4qL1wxL2UKKwlsZXQgY250ID0gMAorCXdoaWxlIGNudCA8IGxpbmUoIiQiKQorCSAgICBsZXQgY250ID0gY250ICsgMQorCSAgICBpZiBnZXRsaW5lKGNudCkgIT0gIiIKKwkJZXhlY3V0ZSAiYnJlYWthZGQgZmlsZSIgZ2V0bGluZShjbnQpIHNjcmlwdAorCSAgICBlbmRpZgorCWVuZHdoaWxlCisJYndpcGVvdXQhCisJY2FsbCBkZWxldGUoYnBsaXN0KQorICAgIGVuZGlmCisKKyAgICAiIFNvdXJjZSBhbmQgZGVsZXRlIHRoZSBzY3JpcHQuCisgICAgZXhlYyAic291cmNlIiBzY3JpcHQKKyAgICBjYWxsIGRlbGV0ZShzY3JpcHQpCitlbmRmdW5jdGlvbgorCitjb20hIC1uYXJncz0xIC1iYXIgRXhlY0FzU2NyaXB0IGNhbGwgRXhlY0FzU2NyaXB0KDxmLWFyZ3M+KQorIiBFWFRSQV9WSU1fU1RPUCAtIGRvIG5vdCBjaGFuZ2Ugb3IgcmVtb3ZlIHRoaXMgbGluZS4KKworCisiIEVORF9PRl9URVNUX0VOVklST05NRU5UIC0gZG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhpcyBsaW5lLgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMTogICA6ZW5kd2hpbGUgaW4gZnVuY3Rpb24JCQkJCSAgICB7e3sxCisiCisiCSAgICBEZXRlY3QgaWYgYSBicm9rZW4gbG9vcCBpcyAoaW5jb3JyZWN0bHkpIHJlYWN0aXZhdGVkIGJ5IHRoZQorIgkgICAgOmVuZHdoaWxlLiAgVXNlIGEgOnJldHVybiB0byBwcmV2ZW50IGFuIGVuZGxlc3MgbG9vcCwgYW5kIG1ha2UKKyIJICAgIHRoaXMgdGVzdCBmaXJzdCB0byBnZXQgYSBtZWFuaW5nZnVsIHJlc3VsdCBvbiBhbiBlcnJvciBiZWZvcmUgb3RoZXIKKyIJICAgIHRlc3RzIHdpbGwgaGFuZy4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitmdW5jdGlvbiEgRigpCisgICAgWHBhdGggMQkJCQkJIiBYOiAxCisgICAgbGV0IGZpcnN0ID0gMQorICAgIFhsb29wSU5JVCAyIDgKKyAgICB3aGlsZSAxCisJWGxvb3AgMQkJCQkJIiBYOiAyCSAgICArIDAgKiAxNgorCWlmIGZpcnN0CisJICAgIFhsb29wIDIJCQkJIiBYOiA0CSAgICArIDAgKiAzMgorCSAgICBsZXQgZmlyc3QgPSAwCisJICAgIFhsb29wTkVYVAorCSAgICBicmVhaworCWVsc2UKKwkgICAgWGxvb3AgNAkJCQkiIFg6IDAJICAgICsgMCAqIDY0CisJICAgIHJldHVybgorCWVuZGlmCisgICAgZW5kd2hpbGUKK2VuZGZ1bmN0aW9uCisKK2NhbGwgRigpCitYcGF0aCAxMjgJCQkJCSIgWDogMTI4CisKK2Z1bmN0aW9uISBHKCkKKyAgICBYcGF0aCAyNTYJCQkJCSIgWDogMjU2ICAgICsgMCAqIDIwNDgKKyAgICBsZXQgZmlyc3QgPSAxCisgICAgWGxvb3BJTklUIDUxMiA4CisgICAgd2hpbGUgMQorCVhsb29wIDEJCQkJCSIgWDogNTEyICAgICsgMCAqIDQwOTYKKwlpZiBmaXJzdAorCSAgICBYbG9vcCAyCQkJCSIgWDogMTAyNCAgICsgMCAqIDgxOTIKKwkgICAgbGV0IGZpcnN0ID0gMAorCSAgICBYbG9vcE5FWFQKKwkgICAgYnJlYWsKKwllbHNlCisJICAgIFhsb29wIDQJCQkJIiBYOiAwCSAgICArIDAgKiAxNjM4NAorCSAgICByZXR1cm4KKwllbmRpZgorCWlmIDEJIiB1bm1hdGNoZWQgOmlmCisgICAgZW5kd2hpbGUKK2VuZGZ1bmN0aW9uCisKK2NhbGwgRygpCitYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorCitYY2hlY2sgMzQ2OTUKKworIiBMZWF2ZSBGIGFuZCBHIGZvciBleGVjdXRpb24gYXMgc2NyaXB0cyBpbiB0aGUgbmV4dCB0ZXN0LgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMjogICA6ZW5kd2hpbGUgaW4gc2NyaXB0CQkJCQkJICAgIHt7ezEKKyIKKyIJICAgIERldGVjdCBpZiBhIGJyb2tlbiBsb29wIGlzIChpbmNvcnJlY3RseSkgcmVhY3RpdmF0ZWQgYnkgdGhlCisiCSAgICA6ZW5kd2hpbGUuICBVc2UgYSA6ZmluaXNoIHRvIHByZXZlbnQgYW4gZW5kbGVzcyBsb29wLCBhbmQgcGxhY2UKKyIJICAgIHRoaXMgdGVzdCBiZWZvcmUgb3RoZXJzIHRoYXQgbWlnaHQgaGFuZyB0byBnZXQgYSBtZWFuaW5nZnVsIHJlc3VsdAorIgkgICAgb24gYW4gZXJyb3IuCisiCisiCSAgICBUaGlzIHRlc3QgZXhlY3V0ZXMgdGhlIGJvZGllcyBvZiB0aGUgZnVuY3Rpb25zIEYgYW5kIEcgZnJvbSB0aGUKKyIJICAgIHByZXZpb3VzIHRlc3QgYXMgc2NyaXB0IGZpbGVzICg6cmV0dXJuIHJlcGxhY2VkIGJ5IDpmaW5pc2gpLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK0V4ZWNBc1NjcmlwdCBGCQkJCQkiIFg6IDEgKyAyICsgNAorWHBhdGggMTI4CQkJCQkiIFg6IDEyOAorCitFeGVjQXNTY3JpcHQgRwkJCQkJIiBYOiAyNTYgKyA1MTIgKyAxMDI0CitYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorCit1bmxldCBmaXJzdAorZGVsZnVuY3Rpb24gRgorZGVsZnVuY3Rpb24gRworCitYY2hlY2sgMzQ2OTUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDM6ICAgOmlmLCA6ZWxzZWlmLCA6d2hpbGUsIDpjb250aW51ZSwgOmJyZWFrCQkJICAgIHt7ezEKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAoraWYgMQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorICAgIGxldCBsb29wcyA9IDMKKyAgICBYbG9vcElOSVQgMiA1MTIKKyAgICB3aGlsZSBsb29wcyA+IC0xCSAgICAiIG1haW4gbG9vcDogbG9vcHMgPT0gMywgMiwgMSAod2hpY2ggYnJlYWtzKQorCWlmIGxvb3BzIDw9IDAKKwkgICAgbGV0IGJyZWFrX2VyciA9IDEKKwkgICAgbGV0IGxvb3BzID0gLTEKKwllbHNlCQkJCQkiICAgIDM6ICAyOiAgICAgIDE6CisJICAgIFhsb29wIDEJCQkJIiBYOiAyICsgMio1MTIgKyAyKjUxMio1MTIKKwllbmRpZgorCWlmIChsb29wcyA9PSAyKQorCSAgICB3aGlsZSBsb29wcyA9PSAyICIgZHVtbXkgbG9vcAorCQlYbG9vcCAyCQkJCSIgWDogICAgIDQqNTEyCisJCWxldCBsb29wcyA9IGxvb3BzIC0gMQorCQljb250aW51ZSAgICAiIHN0b3AgZHVtbXkgbG9vcAorCQlYbG9vcCA0CQkJCSIgWDogICAgIDAKKwkgICAgZW5kd2hpbGUKKwkgICAgWGxvb3BORVhUCisJICAgIGNvbnRpbnVlCSAgICAiIGNvbnRpbnVlIG1haW4gbG9vcAorCSAgICBYbG9vcCA4CQkJCSIgWDogICAgIDAKKwllbHNlaWYgKGxvb3BzID09IDEpCisJICAgIGxldCBwID0gMQorCSAgICB3aGlsZSBwCSAgICAiIGR1bW15IGxvb3AKKwkJWGxvb3AgMTYJCQkiIFg6CQkgMzIqNTEyKjUxMgorCQlsZXQgcCA9IDAKKwkJYnJlYWsJICAgICIgYnJlYWsgZHVtbXkgbG9vcAorCQlYbG9vcCAzMgkJCSIgWDoJCSAwCisJICAgIGVuZHdoaWxlCisJICAgIFhsb29wIDY0CQkJCSIgWDoJCSAxMjgqNTEyKjUxMgorCSAgICB1bmxldCBwCisJICAgIGJyZWFrCSAgICAiIGJyZWFrIG1haW4gbG9vcAorCSAgICBYbG9vcCAxMjgJCQkJIiBYOgkJIDAKKwllbmRpZgorCWlmIChsb29wcyA+IDApCisJICAgIFhsb29wIDI1NgkJCQkiIFg6IDUxMgorCWVuZGlmCisJd2hpbGUgbG9vcHMgPT0gMyAgICAiIGR1bW15IGxvb3AKKwkgICAgbGV0IGxvb3BzID0gbG9vcHMgLSAxCisJZW5kd2hpbGUJICAgICIgZW5kIGR1bW15IGxvb3AKKwlYbG9vcE5FWFQKKyAgICBlbmR3aGlsZQkJICAgICIgZW5kIG1haW4gbG9vcAorICAgIFhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDEwMjQqNTEyKjUxMgorZWxzZQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKK2VuZGlmCitYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogNDA5Nio1MTIqNTEyCitpZiBleGlzdHMoImJyZWFrX2VyciIpCisgICAgIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBhZGQgZXhwbGljaXRseToKKyAgICBsZXQgWHBhdGggPSBYcGF0aCArIDIxNDc0ODM2NDgJCSIgWDogMAorICAgIHVubGV0IGJyZWFrX2VycgorZW5kaWYKKwordW5sZXQgbG9vcHMKKworWGNoZWNrIDEzODQ2NDgxOTUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDQ6ICAgOnJldHVybgkJCQkJCQkgICAge3t7MQorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBGKCkKKyAgICBpZiAxCisJWHBhdGggMQkJCQkJIiBYOiAxCisJbGV0IGxvb3BzID0gMworCVhsb29wSU5JVCAyIDE2CisJd2hpbGUgbG9vcHMgPiAwCQkJCSIgICAgMzogIDI6ICAgICAxOgorCSAgICBYbG9vcCAxCQkJCSIgWDogMiArIDIqMTYgKyAwKjE2KjE2CisJICAgIGlmIChsb29wcyA9PSAyKQorCQlYbG9vcCAyCQkJCSIgWDogICAgIDQqMTYKKwkJcmV0dXJuCisJCVhsb29wIDQJCQkJIiBYOiAgICAgMAorCSAgICBlbmRpZgorCSAgICBYbG9vcCA4CQkJCSIgWDogMTYKKwkgICAgbGV0IGxvb3BzID0gbG9vcHMgLSAxCisJICAgIFhsb29wTkVYVAorCWVuZHdoaWxlCisJWHBhdGggODE5MgkJCQkiIFg6IDAKKyAgICBlbHNlCisJWHBhdGggMTYzODQJCQkJIiBYOiAwCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK2NhbGwgRigpCitYcGF0aCAzMjc2OAkJCQkJIiBYOiA4KjE2KjE2KjE2CisKK1hjaGVjayAzMjg4MworCisiIExlYXZlIEYgZm9yIGV4ZWN1dGlvbiBhcyBhIHNjcmlwdCBpbiB0aGUgbmV4dCB0ZXN0LgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNTogICA6ZmluaXNoCQkJCQkJCSAgICB7e3sxCisiCisiCSAgICBUaGlzIHRlc3QgZXhlY3V0ZXMgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIEYgZnJvbSB0aGUgcHJldmlvdXMgdGVzdAorIgkgICAgYXMgYSBzY3JpcHQgZmlsZSAoOnJldHVybiByZXBsYWNlZCBieSA6ZmluaXNoKS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitFeGVjQXNTY3JpcHQgRgkJCQkJIiBYOiAxICsgMiArIDIqMTYgKyA0KjE2ICsgMTYKK1hwYXRoIDMyNzY4CQkJCQkiIFg6IDMyNzY4CisKK3VubGV0IGxvb3BzCitkZWxmdW5jdGlvbiBGCisKK1hjaGVjayAzMjg4MworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjogICBEZWZpbmluZyBmdW5jdGlvbnMgaW4gOndoaWxlIGxvb3BzCQkJCSAgICB7e3sxCisiCisiCSAgICAgRnVuY3Rpb25zIGNhbiBiZSBkZWZpbmVkIGluc2lkZSBvdGhlciBmdW5jdGlvbnMuICBBbiBpbm5lciBmdW5jdGlvbgorIgkgICAgIGdldHMgZGVmaW5lZCB3aGVuIHRoZSBvdXRlciBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIEZ1bmN0aW9ucyBtYXkKKyIJICAgICBhbHNvIGJlIGRlZmluZWQgaW5zaWRlIHdoaWxlIGxvb3BzLiAgRXhwcmVzc2lvbnMgaW4gYnJhY2VzIGZvcgorIgkgICAgIGRlZmluaW5nIHRoZSBmdW5jdGlvbiBuYW1lIGFyZSBhbGxvd2VkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2lmIEV4dHJhVmltKCkKKworICAgICIgVGhlIGNvbW1hbmQgQ0FMTCBjb2xsZWN0cyB0aGUgYXJndW1lbnQgb2YgYWxsIGl0cyBpbnZvY2F0aW9ucyBpbiAiY2FsbHMiCisgICAgIiB3aGVuIHVzZWQgZnJvbSBhIGZ1bmN0aW9uICh0aGF0IGlzLCB3aGVuIHRoZSBnbG9iYWwgdmFyaWFibGUgImNhbGxzIiBuZWVkcworICAgICIgdGhlICJnOiIgcHJlZml4KS4gIFRoaXMgaXMgdG8gY2hlY2sgdGhhdCB0aGUgZnVuY3Rpb24gY29kZSBpcyBza2lwcGVkIHdoZW4KKyAgICAiIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLiAgRm9yIGlubmVyIGZ1bmN0aW9ucywgZG8gc28gb25seSBpZiB0aGUgb3V0ZXIKKyAgICAiIGZ1bmN0aW9uIGlzIG5vdCBiZWluZyBleGVjdXRlZC4KKyAgICAiCisgICAgbGV0IGNhbGxzID0gIiIKKyAgICBjb20hIC1uYXJncz0xIENBTEwKKwkJXCBpZiAhZXhpc3RzKCJjYWxscyIpICYmICFleGlzdHMoIm91dGVyIikgfAorCQlcIGxldCBnOmNhbGxzID0gZzpjYWxscyAuIDxhcmdzPiB8CisJCVwgZW5kaWYKKworCisgICAgWGxvb3BJTklUISAxIDE2CisKKyAgICBsZXQgaSA9IDAKKyAgICB3aGlsZSBpIDwgMworCisJWGxvb3BORVhUCisJbGV0IGkgPSBpICsgMQorCisJaWYgaSA9PSAxCisJICAgIFhsb29wIDEJCQkJIiBYOiAxCisJICAgIGZ1bmN0aW9uISBGMShhcmcpCisJCUNBTEwgYTphcmcKKwkJbGV0IG91dGVyID0gMQorCisJCVhsb29wSU5JVCEgNDA5NiA0CisJCWxldCBqID0gMAorCQl3aGlsZSBqIDwgMQorCQkgICAgWGxvb3BORVhUCisJCSAgICBYbG9vcCAxCQkJIiBYOiA0MDk2CisJCSAgICBsZXQgaiA9IGogKyAxCisJCSAgICBmdW5jdGlvbiEgRzEoYXJnKQorCQkJQ0FMTCBhOmFyZworCQkgICAgZW5kZnVuY3Rpb24KKwkJICAgIFhsb29wIDIJCQkiIFg6IDgxOTIKKwkJZW5kd2hpbGUKKwkgICAgZW5kZnVuY3Rpb24KKwkgICAgWGxvb3AgMgkJCQkiIFg6IDIKKworCSAgICBjb250aW51ZQorCWVuZGlmCisKKwlYbG9vcCA0CQkJCQkiIFg6IDQgKiAoMTYgKyAyNTYpCisJZnVuY3Rpb24hIEZ7aX0oaSwgYXJnKQorCSAgICBDQUxMIGE6YXJnCisJICAgIGxldCBvdXRlciA9IDEKKworCSAgICBYbG9vcElOSVQhIDE2Mzg0IDQKKwkgICAgaWYgYTppID09IDMKKwkJWGxvb3BORVhUCisJCVhsb29wTkVYVAorCQlYbG9vcE5FWFQKKwkgICAgZW5kaWYKKwkgICAgbGV0IGsgPSAwCisJICAgIHdoaWxlIGsgPCAzCisJCVhsb29wTkVYVAorCQlYbG9vcCAxCQkJCSIgWDogMTYzODQqKDErNCsxNis2NCsyNTYrMTAyNCkKKwkJbGV0IGsgPSBrICsgMQorCQlmdW5jdGlvbiEgR3thOml9e2t9KGFyZykKKwkJICAgIENBTEwgYTphcmcKKwkJZW5kZnVuY3Rpb24KKwkJWGxvb3AgMgkJCQkiIFg6IDMyNzY4KigxKzQrMTYrNjQrMjU2KzEwMjQpCisJICAgIGVuZHdoaWxlCisJZW5kZnVuY3Rpb24KKwlYbG9vcCA4CQkJCQkiIFg6IDggKiAoMTYgKyAyNTYpCisKKyAgICBlbmR3aGlsZQorCisgICAgaWYgZXhpc3RzKCIqRzEiKQorCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogMAorICAgIGVuZGlmCisgICAgaWYgZXhpc3RzKCIqRjEiKQorCWNhbGwgRjEoIkYxIikKKwlpZiBleGlzdHMoIipHMSIpCisJICAgIGNhbGwgRzEoIkcxIikKKwllbmRpZgorICAgIGVuZGlmCisKKyAgICBpZiBleGlzdHMoIkcyMSIpIHx8IGV4aXN0cygiRzIxIikgfHwgZXhpc3RzKCJHMjEiKQorCVhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIGlmIGV4aXN0cygiKkYyIikKKwljYWxsIEYyKDIsICJGMiIpCisJaWYgZXhpc3RzKCIqRzIxIikKKwkgICAgY2FsbCBHMjEoIkcyMSIpCisJZW5kaWYKKwlpZiBleGlzdHMoIipHMjIiKQorCSAgICBjYWxsIEcyMigiRzIyIikKKwllbmRpZgorCWlmIGV4aXN0cygiKkcyMyIpCisJICAgIGNhbGwgRzIzKCJHMjMiKQorCWVuZGlmCisgICAgZW5kaWYKKworICAgIGlmIGV4aXN0cygiRzMxIikgfHwgZXhpc3RzKCJHMzEiKSB8fCBleGlzdHMoIkczMSIpCisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorICAgIGVuZGlmCisgICAgaWYgZXhpc3RzKCIqRjMiKQorCWNhbGwgRjMoMywgIkYzIikKKwlpZiBleGlzdHMoIipHMzEiKQorCSAgICBjYWxsIEczMSgiRzMxIikKKwllbmRpZgorCWlmIGV4aXN0cygiKkczMiIpCisJICAgIGNhbGwgRzMyKCJHMzIiKQorCWVuZGlmCisJaWYgZXhpc3RzKCIqRzMzIikKKwkgICAgY2FsbCBHMzMoIkczMyIpCisJZW5kaWYKKyAgICBlbmRpZgorCisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogNTM2ODcwOTEyCisKKyAgICBpZiBjYWxscyAhPSAiRjFHMUYyRzIxRzIyRzIzRjNHMzFHMzJHMzMiCisJWHBhdGggMTA3Mzc0MTgyNAkJCSIgWDogMAorCVhvdXQgImNhbGxzIGlzIiBjYWxscworICAgIGVuZGlmCisKKyAgICBkZWxmdW5jdGlvbiBGMQorICAgIGRlbGZ1bmN0aW9uIEcxCisgICAgZGVsZnVuY3Rpb24gRjIKKyAgICBkZWxmdW5jdGlvbiBHMjEKKyAgICBkZWxmdW5jdGlvbiBHMjIKKyAgICBkZWxmdW5jdGlvbiBHMjMKKyAgICBkZWxmdW5jdGlvbiBHMzEKKyAgICBkZWxmdW5jdGlvbiBHMzIKKyAgICBkZWxmdW5jdGlvbiBHMzMKKworZW5kaWYKKworWGNoZWNrIDYwMzk3ODk0NworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzogICBDb250aW51aW5nIG9uIGVycm9ycyBvdXRzaWRlIGZ1bmN0aW9ucwkJCSAgICB7e3sxCisiCisiCSAgICBPbiBhbiBlcnJvciBvdXRzaWRlIGEgZnVuY3Rpb24sIHRoZSBzY3JpcHQgcHJvY2Vzc2luZyBjb250aW51ZXMKKyIJICAgIGF0IHRoZSBsaW5lIGZvbGxvd2luZyB0aGUgb3V0ZXJtb3N0IDplbmRpZiBvciA6ZW5kd2hpbGUuICBXaGVuIG5vdAorIgkgICAgaW5zaWRlIGFuIDppZiBvciA6d2hpbGUsIHRoZSBzY3JpcHQgcHJvY2Vzc2luZyBjb250aW51ZXMgYXQgdGhlIG5leHQKKyIJICAgIGxpbmUuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgMQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorICAgIHdoaWxlIDEKKwlYcGF0aCAyCQkJCQkiIFg6IDIKKwlhc2RmCisJWHBhdGggNAkJCQkJIiBYOiAwCisJYnJlYWsKKyAgICBlbmR3aGlsZSB8IFhwYXRoIDgJCQkJIiBYOiAwCisgICAgWHBhdGggMTYJCQkJCSIgWDogMAorZW5kaWYgfCBYcGF0aCAzMgkJCQkiIFg6IDAKK1hwYXRoIDY0CQkJCQkiIFg6IDY0CisKK3doaWxlIDEKKyAgICBYcGF0aCAxMjgJCQkJCSIgWDogMTI4CisgICAgaWYgMQorCVhwYXRoIDI1NgkJCQkiIFg6IDI1NgorCWFzZGYKKwlYcGF0aCA1MTIJCQkJIiBYOiAwCisgICAgZW5kaWYgfCBYcGF0aCAxMDI0CQkJCSIgWDogMAorICAgIFhwYXRoIDIwNDgJCQkJCSIgWDogMAorICAgIGJyZWFrCitlbmR3aGlsZSB8IFhwYXRoIDQwOTYJCQkJIiBYOiAwCitYcGF0aCA4MTkyCQkJCQkiIFg6IDgxOTIKKworYXNkZgorWHBhdGggMTYzODQJCQkJCSIgWDogMTYzODQKKworYXNkZiB8IFhwYXRoIDMyNzY4CQkJCSIgWDogMAorWHBhdGggNjU1MzYJCQkJCSIgWDogNjU1MzYKKworWGNoZWNrIDkwNTYzCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA4OiAgIEFib3J0aW5nIGFuZCBjb250aW51aW5nIG9uIGVycm9ycyBpbnNpZGUgZnVuY3Rpb25zCQkgICAge3t7MQorIgorIgkgICAgT24gYW4gZXJyb3IgaW5zaWRlIGEgZnVuY3Rpb24gd2l0aG91dCB0aGUgImFib3J0IiBhdHRyaWJ1dGUsIHRoZQorIgkgICAgc2NyaXB0IHByb2Nlc3NpbmcgY29udGludWVzIGF0IHRoZSBuZXh0IGxpbmUgKHVubGVzcyB0aGUgZXJyb3Igd2FzCisiCSAgICBpbiBhIDpyZXR1cm4gY29tbWFuZCkuICBPbiBhbiBlcnJvciBpbnNpZGUgYSBmdW5jdGlvbiB3aXRoIHRoZQorIgkgICAgImFib3J0IiBhdHRyaWJ1dGUsIHRoZSBmdW5jdGlvbiBpcyBhYm9ydGVkIGFuZCB0aGUgc2NyaXB0IHByb2Nlc3NpbmcKKyIJICAgIGNvbnRpbnVlcyBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbDsgdGhlIHZhbHVlIC0xIGlzIHJldHVybmVkIHRoZW4uCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIEYoKQorICAgIGlmIDEKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl3aGlsZSAxCisJICAgIFhwYXRoIDIJCQkJIiBYOiAyCisJICAgIGFzZGYKKwkgICAgWHBhdGggNAkJCQkiIFg6IDQKKwkgICAgYXNkZiB8IFhwYXRoIDgJCQkiIFg6IDAKKwkgICAgWHBhdGggMTYJCQkJIiBYOiAxNgorCSAgICBicmVhaworCWVuZHdoaWxlCisJWHBhdGggMzIJCQkJIiBYOiAzMgorICAgIGVuZGlmIHwgWHBhdGggNjQJCQkJIiBYOiA2NAorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAxMjgKKworICAgIHdoaWxlIDEKKwlYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwlpZiAxCisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDUxMgorCSAgICBhc2RmCisJICAgIFhwYXRoIDEwMjQJCQkJIiBYOiAxMDI0CisJICAgIGFzZGYgfCBYcGF0aCAyMDQ4CQkJIiBYOiAwCisJICAgIFhwYXRoIDQwOTYJCQkJIiBYOiA0MDk2CisJZW5kaWYKKwlYcGF0aCA4MTkyCQkJCSIgWDogODE5MgorCWJyZWFrCisgICAgZW5kd2hpbGUgfCBYcGF0aCAxNjM4NAkJCSIgWDogMTYzODQKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorCisgICAgcmV0dXJuIG5vdmFyCQkiIHJldHVybnMgKGRlZmF1bHQgcmV0dXJuIHZhbHVlIDApCisgICAgWHBhdGggNjU1MzYJCQkJCSIgWDogMAorICAgIHJldHVybiAxCQkJIiBub3QgcmVhY2hlZAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEcoKSBhYm9ydAorICAgIGlmIDEKKwlYcGF0aCAxMzEwNzIJCQkJIiBYOiAxMzEwNzIKKwl3aGlsZSAxCisJICAgIFhwYXRoIDI2MjE0NAkJCSIgWDogMjYyMTQ0CisJICAgIGFzZGYJCSIgcmV0dXJucyAtMQorCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDAKKwkgICAgYnJlYWsKKwllbmR3aGlsZQorCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisgICAgZW5kaWYgfCBYcGF0aCAyMDk3MTUyCQkJIiBYOiAwCisgICAgWHBhdGggWHBhdGggNDE5NDMwNAkJCQkiIFg6IDAKKworICAgIHJldHVybiAtNAkJCSIgbm90IHJlYWNoZWQKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBIKCkgYWJvcnQKKyAgICB3aGlsZSAxCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKwlpZiAxCisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorCSAgICBhc2RmCQkiIHJldHVybnMgLTEKKwkgICAgWHBhdGggMzM1NTQ0MzIJCQkiIFg6IDAKKwllbmRpZgorCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogMAorCWJyZWFrCisgICAgZW5kd2hpbGUgfCBYcGF0aCAxMzQyMTc3MjgJCQkiIFg6IDAKKyAgICBYcGF0aCAyNjg0MzU0NTYJCQkJIiBYOiAwCisKKyAgICByZXR1cm4gLTQJCQkiIG5vdCByZWFjaGVkCitlbmRmdW5jdGlvbgorCisiIEFib3J0ZWQgZnVuY3Rpb25zIChHIGFuZCBIKSByZXR1cm4gLTEuCitsZXQgc3VtID0gKEYoKSArIDEpIC0gNCpHKCkgLSA4KkgoKQorWHBhdGggNTM2ODcwOTEyCQkJCQkiIFg6IDUzNjg3MDkxMgoraWYgc3VtICE9IDEzCisgICAgWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDAKKyAgICBYb3V0ICJzdW0gaXMiIHN1bQorZW5kaWYKKwordW5sZXQgc3VtCitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBHCitkZWxmdW5jdGlvbiBICisKK1hjaGVjayA1NjI0OTM0MzEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDk6ICAgQ29udGludWluZyBhZnRlciBhYm9ydGVkIGZ1bmN0aW9ucwkJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIGZ1bmN0aW9uIHdpdGggdGhlICJhYm9ydCIgYXR0cmlidXRlIGlzIGFib3J0ZWQgZHVlIHRvIGFuCisiCSAgICBlcnJvciwgdGhlIG5leHQgZnVuY3Rpb24gYmFjayBpbiB0aGUgY2FsbCBoaWVyYXJjaHkgd2l0aG91dCBhbgorIgkgICAgImFib3J0IiBhdHRyaWJ1dGUgY29udGludWVzOyB0aGUgdmFsdWUgLTEgaXMgcmV0dXJuZWQgdGhlbi4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitmdW5jdGlvbiEgRigpIGFib3J0CisgICAgWHBhdGggMQkJCQkJIiBYOiAxCisgICAgbGV0IHJlc3VsdCA9IEcoKQkiIG5vdCBhYm9ydGVkCisgICAgWHBhdGggMgkJCQkJIiBYOiAyCisgICAgaWYgcmVzdWx0ICE9IDIKKwlYcGF0aCA0CQkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIHJldHVybiAxCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgRygpCQkiIG5vIGFib3J0IGF0dHJpYnV0ZQorICAgIFhwYXRoIDgJCQkJCSIgWDogOAorICAgIGlmIEgoKSAhPSAtMQkiIGFib3J0ZWQKKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIFhwYXRoIDMyCQkJCQkiIFg6IDMyCisgICAgcmV0dXJuIDIKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBIKCkgYWJvcnQKKyAgICBYcGF0aCA2NAkJCQkJIiBYOiA2NAorICAgIGNhbGwgSSgpCQkiIGFib3J0ZWQKKyAgICBYcGF0aCAxMjgJCQkJCSIgWDogMAorICAgIHJldHVybiA0CitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgSSgpIGFib3J0CisgICAgWHBhdGggMjU2CQkJCQkiIFg6IDI1NgorICAgIGFzZGYJCSIgZXJyb3IKKyAgICBYcGF0aCA1MTIJCQkJCSIgWDogMAorICAgIHJldHVybiA4CitlbmRmdW5jdGlvbgorCitpZiBGKCkgIT0gMQorICAgIFhwYXRoIDEwMjQJCQkJCSIgWDogMAorZW5kaWYKKworZGVsZnVuY3Rpb24gRgorZGVsZnVuY3Rpb24gRworZGVsZnVuY3Rpb24gSAorZGVsZnVuY3Rpb24gSQorCitYY2hlY2sgMzYzCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAxMDogIDppZiwgOmVsc2VpZiwgOndoaWxlIGFyZ3VtZW50IHBhcnNpbmcJCQkgICAge3t7MQorIgorIgkgICAgQSAnIicgb3IgJ3wnIGluIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24gbXVzdCBub3QgYmUgbWl4ZWQgdXAgd2l0aAorIgkgICAgYSBjb21tZW50IG9yIGEgbmV4dCBjb21tYW5kIGFmdGVyIGEgYmFyLiAgUGFyc2luZyBlcnJvcnMgc2hvdWxkCisiCSAgICBiZSByZWNvZ25pemVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBNU0coZW5yLCBlbXNnKQorICAgIGxldCBlbmdsaXNoID0gdjpsYW5nID09ICJDIiB8fCB2OmxhbmcgPX4gJ15bRWVdbicKKyAgICBpZiBhOmVuciA9PSAiIgorCVhvdXQgIlRPRE86IEFkZCBtZXNzYWdlIG51bWJlciBmb3I6IiBhOmVtc2cKKwlsZXQgdjplcnJtc2cgPSAiOiIgLiB2OmVycm1zZworICAgIGVuZGlmCisgICAgbGV0IG1hdGNoID0gMQorICAgIGlmIHY6ZXJybXNnICF+ICdeJy5hOmVuci4nOicgfHwgKGVuZ2xpc2ggJiYgdjplcnJtc2cgIX4gYTplbXNnKQorCWxldCBtYXRjaCA9IDAKKwlpZiB2OmVycm1zZyA9PSAiIgorCSAgICBYb3V0ICJNZXNzYWdlIG1pc3NpbmcuIgorCWVsc2UKKwkgICAgbGV0IHY6ZXJybXNnID0gZXNjYXBlKHY6ZXJybXNnLCAnIicpCisJICAgIFhvdXQgIlVuZXhwZWN0ZWQgbWVzc2FnZToiIHY6ZXJybXNnCisJZW5kaWYKKyAgICBlbmRpZgorICAgIHJldHVybiBtYXRjaAorZW5kZnVuY3Rpb24KKworaWYgMSB8fCBzdHJsZW4oIlwiIikgfCBYcGF0aCAxCQkJIiBYOiAxCisgICAgWHBhdGggMgkJCQkJIiBYOiAyCitlbmRpZgorWHBhdGggNAkJCQkJCSIgWDogNAorCitpZiAwCitlbHNlaWYgMSB8fCBzdHJsZW4oIlwiIikgfCBYcGF0aCA4CQkiIFg6IDgKKyAgICBYcGF0aCAxNgkJCQkJIiBYOiAxNgorZW5kaWYKK1hwYXRoIDMyCQkJCQkiIFg6IDMyCisKK3doaWxlIDEgfHwgc3RybGVuKCJcIiIpIHwgWHBhdGggNjQJCSIgWDogNjQKKyAgICBYcGF0aCAxMjgJCQkJCSIgWDogMTI4CisgICAgYnJlYWsKK2VuZHdoaWxlCitYcGF0aCAyNTYJCQkJCSIgWDogMjU2CisKK2xldCB2OmVycm1zZyA9ICIiCitpZiAxIHx8fCBzdHJsZW4oIlwiIikgfCBYcGF0aCA1MTIJCSIgWDogMAorICAgIFhwYXRoIDEwMjQJCQkJCSIgWDogMAorZW5kaWYKK1hwYXRoIDIwNDgJCQkJCSIgWDogMjA0OAoraWYgIU1TRygnRTE1JywgIkludmFsaWQgZXhwcmVzc2lvbiIpCisgICAgWHBhdGggNDA5NgkJCQkJIiBYOiAwCitlbmRpZgorCitsZXQgdjplcnJtc2cgPSAiIgoraWYgMAorZWxzZWlmIDEgfHx8IHN0cmxlbigiXCIiKSB8IFhwYXRoIDgxOTIJCSIgWDogMAorICAgIFhwYXRoIDE2Mzg0CQkJCQkiIFg6IDAKK2VuZGlmCitYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAoraWYgIU1TRygnRTE1JywgIkludmFsaWQgZXhwcmVzc2lvbiIpCisgICAgWHBhdGggNjU1MzYJCQkJCSIgWDogMAorZW5kaWYKKworbGV0IHY6ZXJybXNnID0gIiIKK3doaWxlIDEgfHx8IHN0cmxlbigiXCIiKSB8IFhwYXRoIDEzMTA3MgkJIiBYOiAwCisgICAgWHBhdGggMjYyMTQ0CQkJCSIgWDogMAorICAgIGJyZWFrCitlbmR3aGlsZQorWHBhdGggNTI0Mjg4CQkJCQkiIFg6IDUyNDI4OAoraWYgIU1TRygnRTE1JywgIkludmFsaWQgZXhwcmVzc2lvbiIpCisgICAgWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKK2VuZGlmCisKK2RlbGZ1bmN0aW9uIE1TRworCitYY2hlY2sgNTU5NjE1CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAxMTogIDppZiwgOmVsc2VpZiwgOndoaWxlIGFyZ3VtZW50IGV2YWx1YXRpb24gYWZ0ZXIgYWJvcnQJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gY29kZSBpcyBza2lwcGVkIG92ZXIgZHVlIHRvIGFuIGVycm9yLCB0aGUgYm9vbGVhbiBhcmd1bWVudCB0bworIgkgICAgYW4gOmlmLCA6ZWxzZWlmLCBvciA6d2hpbGUgbXVzdCBub3QgYmUgZXZhbHVhdGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCBjYWxscyA9IDAKKworZnVuY3Rpb24hIFAobnVtKQorICAgIGxldCBnOmNhbGxzID0gZzpjYWxscyArIGE6bnVtICAgIiBzaWRlIGVmZmVjdCBvbiBjYWxsCisgICAgcmV0dXJuIDAKK2VuZGZ1bmN0aW9uCisKK2lmIDEKKyAgICBYcGF0aCAxCQkJCQkiIFg6IDEKKyAgICBhc2RmCQkiIGVycm9yCisgICAgWHBhdGggMgkJCQkJIiBYOiAwCisgICAgaWYgUCgxKQkJIiBzaG91bGQgbm90IGJlIGNhbGxlZAorCVhwYXRoIDQJCQkJCSIgWDogMAorICAgIGVsc2VpZiAhUCgyKQkiIHNob3VsZCBub3QgYmUgY2FsbGVkCisJWHBhdGggOAkJCQkJIiBYOiAwCisgICAgZWxzZQorCVhwYXRoIDE2CQkJCSIgWDogMAorICAgIGVuZGlmCisgICAgWHBhdGggMzIJCQkJCSIgWDogMAorICAgIHdoaWxlIFAoNCkJCSIgc2hvdWxkIG5vdCBiZSBjYWxsZWQKKwlYcGF0aCA2NAkJCQkiIFg6IDAKKyAgICBlbmR3aGlsZQorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAwCitlbmRpZgorCitpZiBjYWxscyAlIDIKKyAgICBYcGF0aCAyNTYJCQkJCSIgWDogMAorZW5kaWYKK2lmIChjYWxscy8yKSAlIDIKKyAgICBYcGF0aCA1MTIJCQkJCSIgWDogMAorZW5kaWYKK2lmIChjYWxscy80KSAlIDIKKyAgICBYcGF0aCAxMDI0CQkJCQkiIFg6IDAKK2VuZGlmCitYcGF0aCAyMDQ4CQkJCQkiIFg6IDIwNDgKKwordW5sZXQgY2FsbHMKK2RlbGZ1bmN0aW9uIFAKKworWGNoZWNrIDIwNDkKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDEyOiAgRXhwcmVzc2lvbnMgaW4gYnJhY2VzIGluIHNraXBwZWQgY29kZQkJCSAgICB7e3sxCisiCisiCSAgICBJbiBjb2RlIHNraXBwZWQgb3ZlciBkdWUgdG8gYW4gZXJyb3Igb3IgaW5hY3RpdmUgY29uZGl0aW9uYWwsCisiCSAgICBhbiBleHByZXNzaW9uIGluIGJyYWNlcyBhcyBwYXJ0IG9mIGEgdmFyaWFibGUgb3IgZnVuY3Rpb24gbmFtZQorIgkgICAgc2hvdWxkIG5vdCBiZSBldmFsdWF0ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworWGxvb3BJTklUIDEgOAorCitmdW5jdGlvbiEgTlVMTCgpCisgICAgWGxvb3AgMQkJCQkJIiBYOiAwCisgICAgcmV0dXJuIDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBaRVJPKCkKKyAgICBYbG9vcCAyCQkJCQkiIFg6IDAKKyAgICByZXR1cm4gMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEYwKCkKKyAgICBYbG9vcCA0CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBGMShhcmcpCisgICAgWHBhdGggNDA5NgkJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitsZXQgVjAgPSAxCisKK1hwYXRoIDgxOTIJCQkJCSIgWDogODE5MgorZWNobyAwID8gRntOVUxMKCkgKyBWe1pFUk8oKX19KCkgOiAxCitYbG9vcE5FWFQKKworWHBhdGggMTYzODQJCQkJCSIgWDogMTYzODQKK2lmIDAKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAwCisgICAgY2FsbCBGe05VTEwoKSArIFZ7WkVSTygpfX0oKQorZW5kaWYKK1hsb29wTkVYVAorCitYcGF0aCA2NTUzNgkJCQkJIiBYOiA2NTUzNgoraWYgMQorICAgIGFzZGYJCSIgZXJyb3IKKyAgICBYcGF0aCAxMzEwNzIJCQkJIiBYOiAwCisgICAgY2FsbCBGMShGe05VTEwoKSArIFZ7WkVSTygpfX0oKSkKK2VuZGlmCitYbG9vcE5FWFQKKworWHBhdGggMjYyMTQ0CQkJCQkiIFg6IDI2MjE0NAoraWYgMQorICAgIGFzZGYJCSIgZXJyb3IKKyAgICBYcGF0aCA1MjQyODgJCQkJIiBYOiAwCisgICAgY2FsbCBGe05VTEwoKSArIFZ7WkVSTygpfX0oKQorZW5kaWYKKworWGNoZWNrIDM1MjI1NgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMTM6ICBGYWlsdXJlIGluIGFyZ3VtZW50IGV2YWx1YXRpb24gZm9yIDp3aGlsZQkJCSAgICB7e3sxCisiCisiCSAgICBBIGZhaWx1cmUgaW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBmb3IgdGhlIGNvbmRpdGlvbiBvZiBhIDp3aGlsZQorIgkgICAgY2F1c2VzIHRoZSB3aG9sZSA6d2hpbGUgbG9vcCB1bnRpbCB0aGUgbWF0Y2hpbmcgOmVuZHdoaWxlIGJlaW5nCisiCSAgICBpZ25vcmVkLiAgQ29udGludWF0aW9uIGlzIGF0IHRoZSBuZXh0IGZvbGxvd2luZyBsaW5lLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK1hwYXRoIDEJCQkJCQkiIFg6IDEKK3doaWxlIGFzZGYKKyAgICBYcGF0aCAyCQkJCQkiIFg6IDAKKyAgICB3aGlsZSAxCisJWHBhdGggNAkJCQkJIiBYOiAwCisJYnJlYWsKKyAgICBlbmR3aGlsZQorICAgIFhwYXRoIDgJCQkJCSIgWDogMAorICAgIGJyZWFrCitlbmR3aGlsZQorWHBhdGggMTYJCQkJCSIgWDogMTYKKword2hpbGUgYXNkZiB8IFhwYXRoIDMyIHwgZW5kd2hpbGUgfCBYcGF0aCA2NAkiIFg6IDAKK1hwYXRoIDEyOAkJCQkJIiBYOiAxMjgKKworWGNoZWNrIDE0NQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMTQ6ICBGYWlsdXJlIGluIGFyZ3VtZW50IGV2YWx1YXRpb24gZm9yIDppZgkJCSAgICB7e3sxCisiCisiCSAgICBBIGZhaWx1cmUgaW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBmb3IgdGhlIGNvbmRpdGlvbiBvZiBhbiA6aWYKKyIJICAgIGRvZXMgbm90IGNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIDplbHNlIG9yIDplbmRpZiBiZWluZyBtYXRjaGVkIHRvCisiCSAgICBhIHByZXZpb3VzIDppZi86ZWxzZWlmLiAgTmVpdGhlciBvZiBib3RoIGJyYW5jaGVzIG9mIHRoZSBmYWlsZWQgOmlmCisiCSAgICBhcmUgZXhlY3V0ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKK1hsb29wSU5JVCAxIDI1NgorCitmdW5jdGlvbiEgRigpCisgICAgWGxvb3AgMQkJCQkJIiBYOiAxCSAgICArIDI1NiAqIDEKKyAgICBsZXQgeCA9IDAKKyAgICBpZiB4CQkiIGZhbHNlCisJWGxvb3AgMgkJCQkJIiBYOiAwCSAgICArIDI1NiAqIDAKKyAgICBlbHNlaWYgIXgJCSIgYWx3YXlzIHRydWUKKwlYbG9vcCA0CQkJCQkiIFg6IDQJICAgICsgMjU2ICogNAorCWxldCB4ID0gMQorCWlmIGc6Ym9vbHZhcgkiIHBvc3NpYmx5IHVuZGVmaW5lZAorCSAgICBYbG9vcCA4CQkJCSIgWDogOAkgICAgKyAyNTYgKiAwCisJZWxzZQorCSAgICBYbG9vcCAxNgkJCQkiIFg6IDAJICAgICsgMjU2ICogMAorCWVuZGlmCisJWGxvb3AgMzIJCQkJIiBYOiAzMgkgICAgKyAyNTYgKiAzMgorICAgIGVsc2VpZiB4CQkiIG5ldmVyIGV4ZWN1dGVkCisJWGxvb3AgNjQJCQkJIiBYOiAwCSAgICArIDI1NiAqIDAKKyAgICBlbmRpZgorICAgIFhsb29wIDEyOAkJCQkJIiBYOiAxMjggICAgKyAyNTYgKiAxMjgKK2VuZGZ1bmN0aW9uCisKK2xldCBib29sdmFyID0gMQorY2FsbCBGKCkKKworWGxvb3BORVhUCit1bmxldCBib29sdmFyCitjYWxsIEYoKQorCitkZWxmdW5jdGlvbiBGCisKK1hjaGVjayA0MjQxMworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMTU6ICBGYWlsdXJlIGluIGFyZ3VtZW50IGV2YWx1YXRpb24gZm9yIDppZiAoYmFyKQkJICAgIHt7ezEKKyIKKyIJICAgIExpa2UgcHJldmlvdXMgdGVzdCwgZXhjZXB0IHRoYXQgdGhlIGZhaWxpbmcgOmlmIC4uLiB8IC4uLiB8IDplbmRpZgorIgkgICAgaXMgaW4gYSBzaW5nbGUgbGluZS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorWGxvb3BJTklUIDEgMjU2CisKK2Z1bmN0aW9uISBGKCkKKyAgICBYbG9vcCAxCQkJCQkiIFg6IDEJICAgICsgMjU2ICogMQorICAgIGxldCB4ID0gMAorICAgIGlmIHgJCSIgZmFsc2UKKwlYbG9vcCAyCQkJCQkiIFg6IDAJICAgICsgMjU2ICogMAorICAgIGVsc2VpZiAheAkJIiBhbHdheXMgdHJ1ZQorCVhsb29wIDQJCQkJCSIgWDogNAkgICAgKyAyNTYgKiA0CisJbGV0IHggPSAxCisJaWYgZzpib29sdmFyIHwgWGxvb3AgOCB8IGVsc2UgfCBYbG9vcCAxNiB8IGVuZGlmICAgICIgWDogOAorCVhsb29wIDMyCQkJCSIgWDogMzIJICAgICsgMjU2ICogMzIKKyAgICBlbHNlaWYgeAkJIiBuZXZlciBleGVjdXRlZAorCVhsb29wIDY0CQkJCSIgWDogMAkgICAgKyAyNTYgKiAwCisgICAgZW5kaWYKKyAgICBYbG9vcCAxMjgJCQkJCSIgWDogMTI4ICAgICsgMjU2ICogMTI4CitlbmRmdW5jdGlvbgorCitsZXQgYm9vbHZhciA9IDEKK2NhbGwgRigpCisKK1hsb29wTkVYVAordW5sZXQgYm9vbHZhcgorY2FsbCBGKCkKKworZGVsZnVuY3Rpb24gRgorCitYY2hlY2sgNDI0MTMKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDE2OiAgRG91YmxlIDplbHNlIG9yIDplbHNlaWYgYWZ0ZXIgOmVsc2UJCQkJICAgIHt7ezEKKyIKKyIJICAgIE11bHRpcGxlIDplbHNlcyBvciBhbiA6ZWxzZWlmIGFmdGVyIGFuIDplbHNlIGFyZSBmb3JiaWRkZW4uCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIEYoKSBhYm9ydAorICAgIGlmIDAKKwlYcGF0aCAxCQkJCQkiIFg6IDAKKyAgICBlbHNlCisJWHBhdGggMgkJCQkJIiBYOiAyCisgICAgZWxzZQkJIiBhYm9ydHMgZnVuY3Rpb24KKwlYcGF0aCA0CQkJCQkiIFg6IDAKKyAgICBlbmRpZgorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEcoKSBhYm9ydAorICAgIGlmIDAKKwlYcGF0aCA4CQkJCQkiIFg6IDAKKyAgICBlbHNlCisJWHBhdGggMTYJCQkJIiBYOiAxNgorICAgIGVsc2VpZiAxCQkiIGFib3J0cyBmdW5jdGlvbgorCVhwYXRoIDMyCQkJCSIgWDogMAorICAgIGVsc2UKKwlYcGF0aCA2NAkJCQkiIFg6IDAKKyAgICBlbmRpZgorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEgoKSBhYm9ydAorICAgIGlmIDAKKwlYcGF0aCAxMjgJCQkJIiBYOiAwCisgICAgZWxzZWlmIDAKKwlYcGF0aCAyNTYJCQkJIiBYOiAwCisgICAgZWxzZQorCVhwYXRoIDUxMgkJCQkiIFg6IDUxMgorICAgIGVsc2UJCSIgYWJvcnRzIGZ1bmN0aW9uCisJWHBhdGggMTAyNAkJCQkiIFg6IDAKKyAgICBlbmRpZgorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEkoKSBhYm9ydAorICAgIGlmIDAKKwlYcGF0aCAyMDQ4CQkJCSIgWDogMAorICAgIGVsc2VpZiAwCisJWHBhdGggNDA5NgkJCQkiIFg6IDAKKyAgICBlbHNlCisJWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKyAgICBlbHNlaWYgMQkJIiBhYm9ydHMgZnVuY3Rpb24KKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDAKKyAgICBlbHNlCisJWHBhdGggMzI3NjgJCQkJIiBYOiAwCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK2NhbGwgRigpCitjYWxsIEcoKQorY2FsbCBIKCkKK2NhbGwgSSgpCisKK2RlbGZ1bmN0aW9uIEYKK2RlbGZ1bmN0aW9uIEcKK2RlbGZ1bmN0aW9uIEgKK2RlbGZ1bmN0aW9uIEkKKworWGNoZWNrIDg3MjIKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDE3OiAgTmVzdGluZyBvZiB1bm1hdGNoZWQgOmlmIG9yIDplbmRpZiBpbnNpZGUgYSA6d2hpbGUJCSAgICB7e3sxCisiCisiCSAgICBUaGUgOndoaWxlLzplbmR3aGlsZSB0YWtlcyBwcmVjZWRlbmNlIGluIG5lc3Rpbmcgb3ZlciBhbiB1bmNsb3NlZAorIgkgICAgOmlmIG9yIGFuIHVub3BlbmVkIDplbmRpZi4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitmdW5jdGlvbiEgTVNHKGVuciwgZW1zZykKKyAgICBsZXQgZW5nbGlzaCA9IHY6bGFuZyA9PSAiQyIgfHwgdjpsYW5nID1+ICdeW0VlXW4nCisgICAgaWYgYTplbnIgPT0gIiIKKwlYb3V0ICJUT0RPOiBBZGQgbWVzc2FnZSBudW1iZXIgZm9yOiIgYTplbXNnCisJbGV0IHY6ZXJybXNnID0gIjoiIC4gdjplcnJtc2cKKyAgICBlbmRpZgorICAgIGxldCBtYXRjaCA9IDEKKyAgICBpZiB2OmVycm1zZyAhfiAnXicuYTplbnIuJzonIHx8IChlbmdsaXNoICYmIHY6ZXJybXNnICF+IGE6ZW1zZykKKwlsZXQgbWF0Y2ggPSAwCisJaWYgdjplcnJtc2cgPT0gIiIKKwkgICAgWG91dCAiTWVzc2FnZSBtaXNzaW5nLiIKKwllbHNlCisJICAgIGxldCB2OmVycm1zZyA9IGVzY2FwZSh2OmVycm1zZywgJyInKQorCSAgICBYb3V0ICJVbmV4cGVjdGVkIG1lc3NhZ2U6IiB2OmVycm1zZworCWVuZGlmCisgICAgZW5kaWYKKyAgICByZXR1cm4gbWF0Y2gKK2VuZGZ1bmN0aW9uCisKK2xldCBtZXNzYWdlcyA9ICIiCisKKyIgV2hpbGUgbG9vcHMgaW5zaWRlIGEgZnVuY3Rpb24gYXJlIGNvbnRpbnVlZCBvbiBlcnJvci4KK2Z1bmN0aW9uISBGKCkKKyAgICBsZXQgdjplcnJtc2cgPSAiIgorICAgIFhsb29wSU5JVCAxIDE2CisgICAgbGV0IGxvb3BzID0gMworICAgIHdoaWxlIGxvb3BzID4gMAorCWxldCBsb29wcyA9IGxvb3BzIC0gMQkJCSIgICAgMjogIDE6ICAgICAwOgorCVhsb29wIDEJCQkJCSIgWDogMSArIDEqMTYgKyAxKjE2KjE2CisJaWYgKGxvb3BzID09IDEpCisJICAgIFhsb29wIDIJCQkJIiBYOiAgICAgMioxNgorCSAgICBYbG9vcE5FWFQKKwkgICAgY29udGludWUKKwllbHNlaWYgKGxvb3BzID09IDApCisJICAgIFhsb29wIDQJCQkJIiBYOgkJNCoxNioxNgorCSAgICBicmVhaworCWVsc2VpZiAxCisJICAgIFhsb29wIDgJCQkJIiBYOiA4CisJICAgIFhsb29wTkVYVAorCSIgZW5kaWYgbWlzc2luZyEKKyAgICBlbmR3aGlsZQkiIDplbmR3aGlsZSBhZnRlciA6aWYgMQorICAgIFhwYXRoIDQwOTYJCQkJCSIgWDogMTYqMTYqMTYKKyAgICBpZiBNU0coJ0UxNzEnLCAiTWlzc2luZyA6ZW5kaWYiKQorCWxldCBnOm1lc3NhZ2VzID0gZzptZXNzYWdlcyAuICJBIgorICAgIGVuZGlmCisKKyAgICBsZXQgdjplcnJtc2cgPSAiIgorICAgIFhsb29wSU5JVCEgODE5MiA0CisgICAgbGV0IGxvb3BzID0gMgorICAgIHdoaWxlIGxvb3BzID4gMAkJCQkiICAgIDI6ICAgICAxOgorCVhsb29wTkVYVAorCWxldCBsb29wcyA9IGxvb3BzIC0gMQorCVhsb29wIDEJCQkJCSIgWDogODE5MiArIDgxOTIqNAorCWlmIDAKKwkgICAgWGxvb3AgMgkJCQkiIFg6IDAKKwkiIGVuZGlmIG1pc3NpbmcKKyAgICBlbmR3aGlsZQkiIDplbmR3aGlsZSBhZnRlciA6aWYgMAorICAgIFhwYXRoIDEzMTA3MgkJCQkiIFg6IDgxOTIqNCo0CisgICAgaWYgTVNHKCdFMTcxJywgIk1pc3NpbmcgOmVuZGlmIikKKwlsZXQgZzptZXNzYWdlcyA9IGc6bWVzc2FnZXMgLiAiQiIKKyAgICBlbmRpZgorCisgICAgbGV0IHY6ZXJybXNnID0gIiIKKyAgICBYbG9vcElOSVQgMjYyMTQ0IDQKKyAgICBsZXQgbG9vcHMgPSAyCisgICAgd2hpbGUgbG9vcHMgPiAwCQkJCSIgICAgMjogICAgIDE6CisJbGV0IGxvb3BzID0gbG9vcHMgLSAxCisJWGxvb3AgMQkJCQkJIiBYOiAyNjIxNDQgKyAyNjIxNDQgKiA0CisJIiBpZiBtaXNzaW5nIQorCWVuZGlmCSIgOmVuZGlmIHdpdGhvdXQgOmlmIGluIHdoaWxlCisJWGxvb3AgMgkJCQkJIiBYOiA1MjQyODggKyA1MjQyODggKiA0CisJWGxvb3BORVhUCisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCA0MTk0MzA0CQkJCSIgWDogMjYyMTQ0KjQqNAorICAgIGlmIE1TRygnRTU4MCcsICI6ZW5kaWYgd2l0aG91dCA6aWYiKQorCWxldCBnOm1lc3NhZ2VzID0gZzptZXNzYWdlcyAuICJDIgorICAgIGVuZGlmCitlbmRmdW5jdGlvbgorCitjYWxsIEYoKQorCisiIEVycm9yIGNvbnRpbnVhdGlvbiBvdXRzaWRlIGEgZnVuY3Rpb24gaXMgYXQgdGhlIG91dGVybW9zdCA6ZW5kd2hpbGUgb3IgOmVuZGlmLgorbGV0IHY6ZXJybXNnID0gIiIKK1hsb29wSU5JVCEgODM4ODYwOCA0CitsZXQgbG9vcHMgPSAyCit3aGlsZSBsb29wcyA+IDAJCQkJCSIgICAgMjoJCTE6CisgICAgWGxvb3BORVhUCisgICAgbGV0IGxvb3BzID0gbG9vcHMgLSAxCisgICAgWGxvb3AgMQkJCQkJIiBYOiA4Mzg4NjA4ICsgMCAqIDQKKyAgICBpZiAwCisJWGxvb3AgMgkJCQkJIiBYOiAwCisgICAgIiBlbmRpZiBtaXNzaW5nISBGb2xsb3dpbmcgOmVuZHdoaWxlIGZhaWxzLgorZW5kd2hpbGUgfCBYcGF0aCAxMzQyMTc3MjgJCQkiIFg6IDAKK1hwYXRoIDI2ODQzNTQ1NgkJCQkJIiBYOiAyKjgzODg2MDgqNCo0CitpZiBNU0coJ0UxNzEnLCAiTWlzc2luZyA6ZW5kaWYiKQorICAgIGxldCBtZXNzYWdlcyA9IGc6bWVzc2FnZXMgLiAiRCIKK2VuZGlmCisKK2lmIG1lc3NhZ2VzICE9ICJBQkNEIgorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKKyAgICBYb3V0ICJtZXNzYWdlcyBpcyIgbWVzc2FnZXMgImluc3RlYWQgb2YgQUJDRCIKK2VuZGlmCisKK3VubGV0IGxvb3BzIG1lc3NhZ2VzCitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBNU0cKKworWGNoZWNrIDI4NTEyNzk5MworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMTg6ICBJbnRlcnJ1cHQgKEN0cmwtQyBwcmVzc2VkKQkJCQkJICAgIHt7ezEKKyIKKyIJICAgIE9uIGFuIGludGVycnVwdCwgdGhlIHNjcmlwdCBwcm9jZXNzaW5nIGlzIHRlcm1pbmF0ZWQgaW1tZWRpYXRlbHkuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorICAgIGlmIDEKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl3aGlsZSAxCisJICAgIFhwYXRoIDIJCQkJIiBYOiAyCisJICAgIGlmIDEKKwkJWHBhdGggNAkJCQkiIFg6IDQKKwkJIklOVEVSUlVQVAorCQlYcGF0aCA4CQkJCSIgWDogMAorCQlicmVhaworCQlmaW5pc2gKKwkgICAgZW5kaWYgfCBYcGF0aCAxNgkJCSIgWDogMAorCSAgICBYcGF0aCAzMgkJCQkiIFg6IDAKKwllbmR3aGlsZSB8IFhwYXRoIDY0CQkJIiBYOiAwCisJWHBhdGggMTI4CQkJCSIgWDogMAorICAgIGVuZGlmIHwgWHBhdGggMjU2CQkJCSIgWDogMAorICAgIFhwYXRoIDUxMgkJCQkJIiBYOiAwCitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJWHBhdGggMTAyNAkJCQkiIFg6IDEwMjQKKwkiSU5URVJSVVBUCisJWHBhdGggMjA0OAkJCQkiIFg6IDAKKyAgICBlbmR0cnkgfCBYcGF0aCA0MDk2CQkJCSIgWDogMAorICAgIFhwYXRoIDgxOTIJCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBGKCkKKwlpZiAxCisJICAgIFhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwkgICAgd2hpbGUgMQorCQlYcGF0aCAzMjc2OAkJCSIgWDogMzI3NjgKKwkJaWYgMQorCQkgICAgWHBhdGggNjU1MzYJCQkiIFg6IDY1NTM2CisJCSAgICAiSU5URVJSVVBUCisJCSAgICBYcGF0aCAxMzEwNzIJCSIgWDogMAorCQkgICAgYnJlYWsKKwkJICAgIHJldHVybgorCQllbmRpZiB8IFhwYXRoIDI2MjE0NAkJIiBYOiAwCisJCVhwYXRoIFhwYXRoIDUyNDI4OAkJIiBYOiAwCisJICAgIGVuZHdoaWxlIHwgWHBhdGggMTA0ODU3NgkJIiBYOiAwCisJICAgIFhwYXRoIFhwYXRoIDIwOTcxNTIJCQkiIFg6IDAKKwllbmRpZiB8IFhwYXRoIFhwYXRoIDQxOTQzMDQJCSIgWDogMAorCVhwYXRoIFhwYXRoIDgzODg2MDgJCQkiIFg6IDAKKyAgICBlbmRmdW5jdGlvbgorCisgICAgY2FsbCBGKCkgfCBYcGF0aCAxNjc3NzIxNgkJCSIgWDogMAorICAgIFhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBHKCkKKwl0cnkKKwkgICAgWHBhdGggNjcxMDg4NjQJCQkiIFg6IDY3MTA4ODY0CisJICAgICJJTlRFUlJVUFQKKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAwCisJZW5kdHJ5IHwgWHBhdGggMjY4NDM1NDU2CQkiIFg6IDAKKwlYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIGNhbGwgRygpIHwgWHBhdGggMTA3Mzc0MTgyNAkJCSIgWDogMAorICAgICIgVGhlIFhwYXRoIGNvbW1hbmQgZG9lcyBub3QgYWNjZXB0IDJeMzEgKG5lZ2F0aXZlKTsgZGlzcGxheSBleHBsaWNpdGx5OgorICAgIGV4ZWMgIiFlY2hvIDIxNDc0ODM2NDggPj4iIC4gZzpFeHRyYVZpbVJlc3VsdAorCQkJCQkJIiBYOiAwCitlbmRpZgorCitYY2hlY2sgNjcyMjQ1ODMKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDE5OiAgQWJvcnRpbmcgb24gZXJyb3JzIGluc2lkZSA6dHJ5LzplbmR0cnkJCQkgICAge3t7MQorIgorIgkgICAgQW4gZXJyb3IgaW4gYSBjb21tYW5kIGR5bmFtaWNhbGx5IGVuY2xvc2VkIGluIGEgOnRyeS86ZW5kdHJ5IHJlZ2lvbgorIgkgICAgYWJvcnRzIHNjcmlwdCBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5LiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIKKyIJICAgIHRoZSBmYWlsaW5nIGNvbW1hbmQgaXMgb3V0c2lkZSBvciBpbnNpZGUgYSBmdW5jdGlvbiBhbmQgd2hldGhlciBhCisiCSAgICBmdW5jdGlvbiBoYXMgYW4gImFib3J0IiBhdHRyaWJ1dGUuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBGKCkgYWJvcnQKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwlhc2RmCisJWHBhdGggMgkJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIHRyeQorCVhwYXRoIDQJCQkJCSIgWDogNAorCWNhbGwgRigpCisJWHBhdGggOAkJCQkJIiBYOiAwCisgICAgZW5kdHJ5IHwgWHBhdGggMTYJCQkJIiBYOiAwCisgICAgWHBhdGggMzIJCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBHKCkKKwlYcGF0aCA2NAkJCQkiIFg6IDY0CisJYXNkZgorCVhwYXRoIDEyOAkJCQkiIFg6IDAKKyAgICBlbmRmdW5jdGlvbgorCisgICAgdHJ5CisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisJY2FsbCBHKCkKKwlYcGF0aCA1MTIJCQkJIiBYOiAwCisgICAgZW5kdHJ5IHwgWHBhdGggMTAyNAkJCQkiIFg6IDAKKyAgICBYcGF0aCAyMDQ4CQkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICB0cnkKKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorCWFzZGYKKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorICAgIGVuZHRyeSB8IFhwYXRoIDE2Mzg0CQkJIiBYOiAwCisgICAgWHBhdGggMzI3NjgJCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGlmIDEKKwl0cnkKKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCSAgICBhc2RmCisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMAorCWVuZHRyeSB8IFhwYXRoIDI2MjE0NAkJCSIgWDogMAorICAgIGVuZGlmIHwgWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisgICAgWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICBsZXQgcCA9IDEKKyAgICB3aGlsZSBwCisJbGV0IHAgPSAwCisJdHJ5CisJICAgIFhwYXRoIDIwOTcxNTIJCQkiIFg6IDIwOTcxNTIKKwkgICAgYXNkZgorCSAgICBYcGF0aCA0MTk0MzA0CQkJIiBYOiAwCisJZW5kdHJ5IHwgWHBhdGggODM4ODYwOAkJCSIgWDogMAorICAgIGVuZHdoaWxlIHwgWHBhdGggMTY3NzcyMTYJCQkiIFg6IDAKKyAgICBYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICBsZXQgcCA9IDEKKyAgICB3aGlsZSBwCisJbGV0IHAgPSAwCisiCXRyeQorCSAgICBYcGF0aCA2NzEwODg2NAkJCSIgWDogNjcxMDg4NjQKKyAgICBlbmR3aGlsZSB8IFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMAorICAgIFhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDAKK2VuZGlmCisKK1hjaGVjayA2OTI3NTk3MworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAyMDogIEFib3J0aW5nIG9uIGVycm9ycyBhZnRlciA6dHJ5LzplbmR0cnkJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhbiBlcnJvciBvY2N1cnMgYWZ0ZXIgdGhlIGxhc3QgYWN0aXZlIDp0cnkvOmVuZHRyeSByZWdpb24gaGFzCisiCSAgICBiZWVuIGxlZnQsIHRlcm1pbmF0aW9uIGJlaGF2aW9yIGlzIGFzIGlmIG5vIDp0cnkvOmVuZHRyeSBoYXMgYmVlbgorIgkgICAgc2Vlbi4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgbGV0IHAgPSAxCisgICAgd2hpbGUgcAorCWxldCBwID0gMAorCXRyeQorCSAgICBYcGF0aCAxCQkJCSIgWDogMQorCWVuZHRyeQorCWFzZGYKKyAgICBlbmR3aGlsZSB8IFhwYXRoIDIJCQkJIiBYOiAwCisgICAgWHBhdGggNAkJCQkJIiBYOiA0CitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBYcGF0aCA4CQkJCSIgWDogOAorCSAgICBicmVhaworCSAgICBYcGF0aCAxNgkJCQkiIFg6IDAKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorICAgIFhwYXRoIDMyCQkJCQkiIFg6IDMyCisgICAgYXNkZgorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDY0CitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBYcGF0aCAxMjgJCQkJIiBYOiAxMjgKKwkgICAgYnJlYWsKKwkgICAgWHBhdGggMjU2CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggNTEyCQkJCSIgWDogNTEyCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCAxMDI0CQkJCQkiIFg6IDEwMjQKKyAgICBhc2RmCisgICAgWHBhdGggMjA0OAkJCQkJIiBYOiAyMDQ4CitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorCWZpbmFsbHkKKwkgICAgWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwkgICAgYnJlYWsKKwkgICAgWHBhdGggMTYzODQJCQkJIiBYOiAwCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorICAgIGFzZGYKKyAgICBYcGF0aCA2NTUzNgkJCQkJIiBYOiA2NTUzNgorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGxldCBwID0gMQorICAgIHdoaWxlIHAKKwlsZXQgcCA9IDAKKwl0cnkKKwkgICAgWHBhdGggMTMxMDcyCQkJIiBYOiAxMzEwNzIKKwkgICAgY29udGludWUKKwkgICAgWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCA1MjQyODgJCQkJIiBYOiA1MjQyODgKKyAgICBhc2RmCisgICAgWHBhdGggMTA0ODU3NgkJCQkiIFg6IDEwNDg1NzYKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICBsZXQgcCA9IDEKKyAgICB3aGlsZSBwCisJbGV0IHAgPSAwCisJdHJ5CisJICAgIFhwYXRoIDIwOTcxNTIJCQkiIFg6IDIwOTcxNTIKKwkgICAgY29udGludWUKKwkgICAgWHBhdGggNDE5NDMwNAkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggODM4ODYwOAkJCSIgWDogODM4ODYwOAorCWVuZHRyeQorICAgIGVuZHdoaWxlCisgICAgWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAxNjc3NzIxNgorICAgIGFzZGYKKyAgICBYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDMzNTU0NDMyCitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgbGV0IHAgPSAxCisgICAgd2hpbGUgcAorCWxldCBwID0gMAorCXRyeQorCSAgICBYcGF0aCA2NzEwODg2NAkJCSIgWDogNjcxMDg4NjQKKwlmaW5hbGx5CisJICAgIFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMTM0MjE3NzI4CisJICAgIGNvbnRpbnVlCisJICAgIFhwYXRoIDI2ODQzNTQ1NgkJCSIgWDogMAorCWVuZHRyeQorICAgIGVuZHdoaWxlCisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogNTM2ODcwOTEyCisgICAgYXNkZgorICAgIFhwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAxMDczNzQxODI0CitlbmRpZgorCitYY2hlY2sgMTg3NDU3NTA4NQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMjE6ICA6ZmluYWxseSBmb3IgOnRyeSBhZnRlciA6Y29udGludWUvOmJyZWFrLzpyZXR1cm4vOmZpbmlzaAkgICAge3t7MQorIgorIgkgICAgSWYgYSA6dHJ5IGNvbmRpdGlvbmFsIHN0YXlzIGluYWN0aXZlIGR1ZSB0byBhIHByZWNlZGluZyA6Y29udGludWUsCisiCSAgICA6YnJlYWssIDpyZXR1cm4sIG9yIDpmaW5pc2gsIGl0cyA6ZmluYWxseSBjbGF1c2Ugc2hvdWxkIG5vdCBiZQorIgkgICAgZXhlY3V0ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uIEYoKQorCWxldCBsb29wcyA9IDIKKwlYbG9vcElOSVQhIDEgMjU2CisJd2hpbGUgbG9vcHMgPiAwCisJICAgIFhsb29wTkVYVAorCSAgICBsZXQgbG9vcHMgPSBsb29wcyAtIDEKKwkgICAgdHJ5CisJCWlmIGxvb3BzID09IDEKKwkJICAgIFhsb29wIDEJCQkiIFg6IDEKKwkJICAgIGNvbnRpbnVlCisJCSAgICBYbG9vcCAyCQkJIiBYOiAwCisJCWVsc2VpZiBsb29wcyA9PSAwCisJCSAgICBYbG9vcCA0CQkJIiBYOiA0KjI1NgorCQkgICAgYnJlYWsKKwkJICAgIFhsb29wIDgJCQkiIFg6IDAKKwkJZW5kaWYKKworCQl0cnkJCSIgaW5hY3RpdmUKKwkJICAgIFhsb29wIDE2CQkJIiBYOiAwCisJCWZpbmFsbHkKKwkJICAgIFhsb29wIDMyCQkJIiBYOiAwCisJCWVuZHRyeQorCSAgICBmaW5hbGx5CisJCVhsb29wIDY0CQkJIiBYOiA2NCArIDY0KjI1NgorCSAgICBlbmR0cnkKKwkgICAgWGxvb3AgMTI4CQkJCSIgWDogMAorCWVuZHdoaWxlCisKKwl0cnkKKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCSAgICByZXR1cm4KKwkgICAgWHBhdGggMTMxMDcyCQkJIiBYOiAwCisJICAgIHRyeQkJICAgICIgaW5hY3RpdmUKKwkJWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisJICAgIGVuZHRyeQorCWZpbmFsbHkKKwkgICAgWHBhdGggMTA0ODU3NgkJCSIgWDogMTA0ODU3NgorCWVuZHRyeQorCVhwYXRoIDIwOTcxNTIJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIHRyeQorCVhwYXRoIDQxOTQzMDQJCQkJIiBYOiA0MTk0MzA0CisJY2FsbCBGKCkKKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogODM4ODYwOAorCWZpbmlzaAorCVhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorCXRyeQkJIiBpbmFjdGl2ZQorCSAgICBYcGF0aCAzMzU1NDQzMgkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggNjcxMDg4NjQJCQkiIFg6IDAKKwllbmR0cnkKKyAgICBmaW5hbGx5CisJWHBhdGggMTM0MjE3NzI4CQkJCSIgWDogMTM0MjE3NzI4CisgICAgZW5kdHJ5CisgICAgWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorZW5kaWYKKworWGNoZWNrIDE0NzkzMjIyNQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMjI6ICA6ZmluYWxseSBmb3IgYSA6dHJ5IGFmdGVyIGFuIGVycm9yL2ludGVycnVwdC86dGhyb3cJCSAgICB7e3sxCisiCisiCSAgICBJZiBhIDp0cnkgY29uZGl0aW9uYWwgc3RheXMgaW5hY3RpdmUgZHVlIHRvIGEgcHJlY2VkaW5nIGVycm9yIG9yCisiCSAgICBpbnRlcnJ1cHQgb3IgOnRocm93LCBpdHMgOmZpbmFsbHkgY2xhdXNlIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBFcnJvcigpCisJdHJ5CisJICAgIGFzZGYgICAgIiBhYm9ydGluZyBlcnJvciwgdHJpZ2dlcmluZyBlcnJvciBleGNlcHRpb24KKwllbmR0cnkKKyAgICBlbmRmdW5jdGlvbgorCisgICAgWHBhdGggMQkJCQkJIiBYOiAxCisgICAgY2FsbCBFcnJvcigpCisgICAgWHBhdGggMgkJCQkJIiBYOiAwCisKKyAgICBpZiAxCSIgbm90IGFjdGl2ZSBkdWUgdG8gZXJyb3IKKwl0cnkJIiBub3QgYWN0aXZlIHNpbmNlIDppZiBpbmFjdGl2ZQorCSAgICBYcGF0aCA0CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggOAkJCQkiIFg6IDAKKwllbmR0cnkKKyAgICBlbmRpZgorCisgICAgdHJ5CQkiIG5vdCBhY3RpdmUgZHVlIHRvIGVycm9yCisJWHBhdGggMTYJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDMyCQkJCSIgWDogMAorICAgIGVuZHRyeQorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBJbnRlcnJ1cHQoKQorCXRyeQorCSAgICAiSU5URVJSVVBUCSIgdHJpZ2dlcmluZyBpbnRlcnJ1cHQgZXhjZXB0aW9uCisJZW5kdHJ5CisgICAgZW5kZnVuY3Rpb24KKworICAgIFhwYXRoIDY0CQkJCQkiIFg6IDY0CisgICAgY2FsbCBJbnRlcnJ1cHQoKQorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAwCisKKyAgICBpZiAxCSIgbm90IGFjdGl2ZSBkdWUgdG8gaW50ZXJydXB0CisJdHJ5CSIgbm90IGFjdGl2ZSBzaW5jZSA6aWYgaW5hY3RpdmUKKwkgICAgWHBhdGggMjU2CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggNTEyCQkJCSIgWDogMAorCWVuZHRyeQorICAgIGVuZGlmCisKKyAgICB0cnkJCSIgbm90IGFjdGl2ZSBkdWUgdG8gaW50ZXJydXB0CisJWHBhdGggMTAyNAkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMjA0OAkJCQkiIFg6IDAKKyAgICBlbmR0cnkKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICBmdW5jdGlvbiEgVGhyb3coKQorCXRocm93ICJ4eXoiCisgICAgZW5kZnVuY3Rpb24KKworICAgIFhwYXRoIDQwOTYJCQkJCSIgWDogNDA5NgorICAgIGNhbGwgVGhyb3coKQorICAgIFhwYXRoIDgxOTIJCQkJCSIgWDogMAorCisgICAgaWYgMQkiIG5vdCBhY3RpdmUgZHVlIHRvIDp0aHJvdworCXRyeQkiIG5vdCBhY3RpdmUgc2luY2UgOmlmIGluYWN0aXZlCisJICAgIFhwYXRoIDE2Mzg0CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggMzI3NjgJCQkJIiBYOiAwCisJZW5kdHJ5CisgICAgZW5kaWYKKworICAgIHRyeQkJIiBub3QgYWN0aXZlIGR1ZSB0byA6dGhyb3cKKwlYcGF0aCA2NTUzNgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMTMxMDcyCQkJCSIgWDogMAorICAgIGVuZHRyeQorZW5kaWYKKworWGNoZWNrIDQxNjEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDIzOiAgOmNhdGNoIGNsYXVzZXMgZm9yIGEgOnRyeSBhZnRlciBhIDp0aHJvdwkJCSAgICB7e3sxCisiCisiCSAgICBJZiBhIDp0cnkgY29uZGl0aW9uYWwgc3RheXMgaW5hY3RpdmUgZHVlIHRvIGEgcHJlY2VkaW5nIDp0aHJvdywKKyIJICAgIG5vbmUgb2YgaXRzIDpjYXRjaCBjbGF1c2VzIHNob3VsZCBiZSBleGVjdXRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJWHBhdGggMQkJCQkJIiBYOiAxCisJdGhyb3cgInh5eiIKKwlYcGF0aCAyCQkJCQkiIFg6IDAKKworCWlmIDEJIiBub3QgYWN0aXZlIGR1ZSB0byA6dGhyb3cKKwkgICAgdHJ5CSIgbm90IGFjdGl2ZSBzaW5jZSA6aWYgaW5hY3RpdmUKKwkJWHBhdGggNAkJCQkiIFg6IDAKKwkgICAgY2F0Y2ggL3h5ei8KKwkJWHBhdGggOAkJCQkiIFg6IDAKKwkgICAgZW5kdHJ5CisJZW5kaWYKKyAgICBjYXRjaCAveHl6LworCVhwYXRoIDE2CQkJCSIgWDogMTYKKyAgICBlbmR0cnkKKworICAgIFhwYXRoIDMyCQkJCQkiIFg6IDMyCisgICAgdGhyb3cgImFiYyIKKyAgICBYcGF0aCA2NAkJCQkJIiBYOiAwCisKKyAgICB0cnkJCSIgbm90IGFjdGl2ZSBkdWUgdG8gOnRocm93CisJWHBhdGggMTI4CQkJCSIgWDogMAorICAgIGNhdGNoIC9hYmMvCisJWHBhdGggMjU2CQkJCSIgWDogMAorICAgIGVuZHRyeQorZW5kaWYKKworWGNoZWNrIDQ5CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAyNDogIDplbmR0cnkgZm9yIGEgOnRyeSBhZnRlciBhIDp0aHJvdwkJCQkgICAge3t7MQorIgorIgkgICAgSWYgYSA6dHJ5IGNvbmRpdGlvbmFsIHN0YXlzIGluYWN0aXZlIGR1ZSB0byBhIHByZWNlZGluZyA6dGhyb3csCisiCSAgICBpdHMgOmVuZHRyeSBzaG91bGQgbm90IHJldGhyb3cgdGhlIGV4Y2VwdGlvbiB0byB0aGUgbmV4dCBzdXJyb3VuZGluZworIgkgICAgYWN0aXZlIDp0cnkgY29uZGl0aW9uYWwuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorICAgIHRyeQkJCSIgdHJ5IDEKKwl0cnkJCSIgdHJ5IDIKKwkgICAgWHBhdGggMQkJCQkiIFg6IDEKKwkgICAgdGhyb3cgInh5eiIJIiBtYWtlcyB0cnkgMiBpbmFjdGl2ZQorCSAgICBYcGF0aCAyCQkJCSIgWDogMAorCisJICAgIHRyeQkJIiB0cnkgMworCQlYcGF0aCA0CQkJCSIgWDogMAorCSAgICBlbmR0cnkJIiBubyByZXRocm93IHRvIHRyeSAxCisJY2F0Y2ggL3h5ei8JIiBzaG91bGQgY2F0Y2ggYWx0aG91Z2ggdHJ5IDIgaW5hY3RpdmUKKwkgICAgWHBhdGggOAkJCQkiIFg6IDgKKwllbmR0cnkKKyAgICBjYXRjaCAveHl6LwkJIiB0cnkgMSBhY3RpdmUsIGJ1dCBleGNlcHRpb24gYWxyZWFkeSBjYXVnaHQKKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAzMgorZW5kaWYKKworWGNoZWNrIDQxCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAyNTogIEV4ZWN1dGluZyA6ZmluYWxseSBjbGF1c2VzIG9uIG5vcm1hbCBjb250cm9sIGZsb3cJCSAgICB7e3sxCisiCisiCSAgICBDb250cm9sIGZsb3cgaW4gYSA6dHJ5IGNvbmRpdGlvbmFsIHNob3VsZCBhbHdheXMgZmFsbCB0aHJvdWdoIHRvIGl0cworIgkgICAgOmZpbmFsbHkgY2xhdXNlLiAgQSA6ZmluYWxseSBjbGF1c2Ugb2YgYSA6dHJ5IGNvbmRpdGlvbmFsIGluc2lkZSBhbgorIgkgICAgaW5hY3RpdmUgY29uZGl0aW9uYWwgc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBGKCkKKyAgICBsZXQgbG9vcHMgPSAzCisgICAgWGxvb3BJTklUIDEgMjU2CisgICAgd2hpbGUgbG9vcHMgPiAwCQkJCSIgICAgIDM6ICAgMjogICAgICAgMToKKwlYbG9vcCAxCQkJCQkiIFg6ICAxICsgIDEqMjU2ICsgMSoyNTYqMjU2CisJaWYgbG9vcHMgPj0gMgorCSAgICB0cnkKKwkJWGxvb3AgMgkJCQkiIFg6ICAyICsgIDIqMjU2CisJCWlmIGxvb3BzID09IDIKKwkJICAgIHRyeQorCQkJWGxvb3AgNAkJCSIgWDogICAgICAgNCoyNTYKKwkJICAgIGZpbmFsbHkKKwkJCVhsb29wIDgJCQkiIFg6ICAgICAgIDgqMjU2CisJCSAgICBlbmR0cnkKKwkJZW5kaWYKKwkgICAgZmluYWxseQorCQlYbG9vcCAxNgkJCSIgWDogMTYgKyAxNioyNTYKKwkJaWYgbG9vcHMgPT0gMgorCQkgICAgdHJ5CisJCQlYbG9vcCAzMgkJIiBYOiAgICAgIDMyKjI1NgorCQkgICAgZmluYWxseQorCQkJWGxvb3AgNjQJCSIgWDogICAgICA2NCoyNTYKKwkJICAgIGVuZHRyeQorCQllbmRpZgorCSAgICBlbmR0cnkKKwllbmRpZgorCVhsb29wIDEyOAkJCQkiIFg6IDEyOCArIDEyOCoyNTYgKyAxMjgqMjU2KjI1NgorCWxldCBsb29wcyA9IGxvb3BzIC0gMQorCVhsb29wTkVYVAorICAgIGVuZHdoaWxlCisgICAgWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAxNjc3NzIxNgorZW5kZnVuY3Rpb24KKworaWYgMQorICAgIHRyeQorCVhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMzM1NTQ0MzIKKwljYWxsIEYoKQorCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKKyAgICBmaW5hbGx5CisJWHBhdGggMTM0MjE3NzI4CQkJCSIgWDogMTM0MjE3NzI4CisgICAgZW5kdHJ5CitlbHNlCisgICAgdHJ5CisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CitlbmRpZgorCitkZWxmdW5jdGlvbiBGCisKK1hjaGVjayAyNjAxNzc4MTEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDI2OiAgRXhlY3V0aW5nIDpmaW5hbGx5IGNsYXVzZXMgYWZ0ZXIgOmNvbnRpbnVlIG9yIDpicmVhawkgICAge3t7MQorIgorIgkgICAgRm9yIGEgOmNvbnRpbnVlIG9yIDpicmVhayBkeW5hbWljYWxseSBlbmNsb3NlZCBpbiBhIDp0cnkvOmVuZHRyeQorIgkgICAgcmVnaW9uIGluc2lkZSB0aGUgbmV4dCBzdXJyb3VuZGluZyA6d2hpbGUvOmVuZHdoaWxlLCBpZiB0aGUKKyIJICAgIDpjb250aW51ZS86YnJlYWsgaXMgYmVmb3JlIHRoZSA6ZmluYWxseSwgdGhlIDpmaW5hbGx5IGNsYXVzZSBpcworIgkgICAgZXhlY3V0ZWQgZmlyc3QuICBJZiB0aGUgOmNvbnRpbnVlLzpicmVhayBpcyBhZnRlciB0aGUgOmZpbmFsbHksIHRoZQorIgkgICAgOmZpbmFsbHkgY2xhdXNlIGlzIGJyb2tlbiAobGlrZSBhbiA6aWYvOmVuZGlmIHJlZ2lvbikuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKwordHJ5CisgICAgbGV0IGxvb3BzID0gMworICAgIFhsb29wSU5JVCEgMSAzMgorICAgIHdoaWxlIGxvb3BzID4gMAorCVhsb29wTkVYVAorCXRyeQorCSAgICB0cnkKKwkJaWYgbG9vcHMgPT0gMgkJCSIgICAgMzogICAyOiAgICAgMToKKwkJICAgIFhsb29wIDEJCQkiIFg6ICAgICAgMSozMgorCQkgICAgbGV0IGxvb3BzID0gbG9vcHMgLSAxCisJCSAgICBjb250aW51ZQorCQllbHNlaWYgbG9vcHMgPT0gMQorCQkgICAgWGxvb3AgMgkJCSIgWDoJCSAyKjMyKjMyCisJCSAgICBicmVhaworCQkgICAgZmluaXNoCisJCWVuZGlmCisJCVhsb29wIDQJCQkJIiBYOiA0CisJICAgIGVuZHRyeQorCWZpbmFsbHkKKwkgICAgWGxvb3AgOAkJCQkiIFg6IDggICsgOCozMiArIDgqMzIqMzIKKwllbmR0cnkKKwlYbG9vcCAxNgkJCQkiIFg6IDE2CisJbGV0IGxvb3BzID0gbG9vcHMgLSAxCisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorZmluYWxseQorICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDY1NTM2CisgICAgbGV0IGxvb3BzID0gMworICAgIFhsb29wSU5JVCAxMzEwNzIgMTYKKyAgICB3aGlsZSBsb29wcyA+IDAKKwl0cnkKKwlmaW5hbGx5CisJICAgIHRyeQorCQlpZiBsb29wcyA9PSAyCisJCSAgICBYbG9vcCAxCQkJIiBYOiAxMzEwNzIqMTYKKwkJICAgIGxldCBsb29wcyA9IGxvb3BzIC0gMQorCQkgICAgWGxvb3BORVhUCisJCSAgICBjb250aW51ZQorCQllbHNlaWYgbG9vcHMgPT0gMQorCQkgICAgWGxvb3AgMgkJCSIgWDogMTMxMDcyKjIqMTYqMTYKKwkJICAgIGJyZWFrCisJCSAgICBmaW5pc2gKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJICAgIFhsb29wIDQJCQkJIiBYOiAxMzEwNzIqNAorCWVuZHRyeQorCVhsb29wIDgJCQkJCSIgWDogMTMxMDcyKjgKKwlsZXQgbG9vcHMgPSBsb29wcyAtIDEKKwlYbG9vcE5FWFQKKyAgICBlbmR3aGlsZQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDUzNjg3MDkxMgorZW5kdHJ5CitYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCit1bmxldCBsb29wcworCitYY2hlY2sgMTY4MTUwMDQ3NgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMjc6ICBFeGVjdXRpbmcgOmZpbmFsbHkgY2xhdXNlcyBhZnRlciA6cmV0dXJuCQkJICAgIHt7ezEKKyIKKyIJICAgIEZvciBhIDpyZXR1cm4gY29tbWFuZCBkeW5hbWljYWxseSBlbmNsb3NlZCBpbiBhIDp0cnkvOmVuZHRyeSByZWdpb24sCisiCSAgICA6ZmluYWxseSBjbGF1c2VzIGFyZSBleGVjdXRlZCBhbmQgdGhlIGNhbGxlZCBmdW5jdGlvbiBpcyBlbmRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitmdW5jdGlvbiEgRigpCisgICAgdHJ5CisJWHBhdGggMQkJCQkJIiBYOiAxCisJdHJ5CisJICAgIFhwYXRoIDIJCQkJIiBYOiAyCisJICAgIHJldHVybgorCSAgICBYcGF0aCA0CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggOAkJCQkiIFg6IDgKKwllbmR0cnkKKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMzIJCQkJIiBYOiAzMgorICAgIGVuZHRyeQorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBHKCkKKyAgICB0cnkKKwlYcGF0aCAxMjgJCQkJIiBYOiAxMjgKKwlyZXR1cm4KKwlYcGF0aCAyNTYJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDUxMgkJCQkiIFg6IDUxMgorCWNhbGwgRigpCisJWHBhdGggMTAyNAkJCQkiIFg6IDEwMjQKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAyMDQ4CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBIKCkKKyAgICB0cnkKKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorCWNhbGwgRygpCisJWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKyAgICBmaW5hbGx5CisJWHBhdGggMTYzODQJCQkJIiBYOiAxNjM4NAorCXJldHVybgorCVhwYXRoIDMyNzY4CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK3RyeQorICAgIFhwYXRoIDEzMTA3MgkJCQkiIFg6IDEzMTA3MgorICAgIGNhbGwgSCgpCisgICAgWHBhdGggMjYyMTQ0CQkJCSIgWDogMjYyMTQ0CitmaW5hbGx5CisgICAgWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CitlbmR0cnkKK1hwYXRoIDEwNDg1NzYJCQkJCSIgWDogMTA0ODU3NgorCitYY2hlY2sgMTk5NjQ1OQorCisiIExlYXZlIEYsIEcsIGFuZCBIIGZvciBleGVjdXRpb24gYXMgc2NyaXB0cyBpbiB0aGUgbmV4dCB0ZXN0LgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgMjg6ICBFeGVjdXRpbmcgOmZpbmFsbHkgY2xhdXNlcyBhZnRlciA6ZmluaXNoCQkJICAgIHt7ezEKKyIKKyIJICAgIEZvciBhIDpmaW5pc2ggY29tbWFuZCBkeW5hbWljYWxseSBlbmNsb3NlZCBpbiBhIDp0cnkvOmVuZHRyeSByZWdpb24sCisiCSAgICA6ZmluYWxseSBjbGF1c2VzIGFyZSBleGVjdXRlZCBhbmQgdGhlIHNvdXJjZWQgZmlsZSBpcyBmaW5pc2hlZC4KKyIKKyIJICAgIFRoaXMgdGVzdCBleGVjdXRlcyB0aGUgYm9kaWVzIG9mIHRoZSBmdW5jdGlvbnMgRiwgRywgYW5kIEggZnJvbSB0aGUKKyIJICAgIHByZXZpb3VzIHRlc3QgYXMgc2NyaXB0IGZpbGVzICg6cmV0dXJuIHJlcGxhY2VkIGJ5IDpmaW5pc2gpLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCBzY3JpcHRGID0gTWFrZVNjcmlwdCgiRiIpCQkJIiBYOiAxICsgMiArIDggKyAzMgorbGV0IHNjcmlwdEcgPSBNYWtlU2NyaXB0KCJHIiwgc2NyaXB0RikJCSIgWDogMTI4ICsgNTEyICsgMTAyNAorbGV0IHNjcmlwdEggPSBNYWtlU2NyaXB0KCJIIiwgc2NyaXB0RykJCSIgWDogNDA5NiArIDgxOTIgKyAxNjM4NAorCit0cnkKKyAgICBYcGF0aCAxMzEwNzIJCQkJIiBYOiAxMzEwNzIKKyAgICBleGVjICJzb3VyY2UiIHNjcmlwdEgKKyAgICBYcGF0aCAyNjIxNDQJCQkJIiBYOiAyNjIxNDQKK2ZpbmFsbHkKKyAgICBYcGF0aCA1MjQyODgJCQkJIiBYOiA1MjQyODgKK2VuZHRyeQorWHBhdGggMTA0ODU3NgkJCQkJIiBYOiAxMDQ4NTc2CisKK2NhbGwgZGVsZXRlKHNjcmlwdEYpCitjYWxsIGRlbGV0ZShzY3JpcHRHKQorY2FsbCBkZWxldGUoc2NyaXB0SCkKK3VubGV0IHNjcmlwdEYgc2NyaXB0RyBzY3JpcHRICitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBHCitkZWxmdW5jdGlvbiBICisKK1hjaGVjayAxOTk2NDU5CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAyOTogIEV4ZWN1dGluZyA6ZmluYWxseSBjbGF1c2VzIG9uIGVycm9ycwkJCSAgICB7e3sxCisiCisiCSAgICBBZnRlciBhbiBlcnJvciBpbiBhIGNvbW1hbmQgZHluYW1pY2FsbHkgZW5jbG9zZWQgaW4gYSA6dHJ5LzplbmR0cnkKKyIJICAgIHJlZ2lvbiwgOmZpbmFsbHkgY2xhdXNlcyBhcmUgZXhlY3V0ZWQgYW5kIHRoZSBzY3JpcHQgcHJvY2Vzc2luZyBpcworIgkgICAgdGVybWluYXRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgZnVuY3Rpb24hIEYoKQorCXdoaWxlIDEKKwkgICAgdHJ5CisJCVhwYXRoIDEJCQkJIiBYOiAxCisJCXdoaWxlIDEKKwkJICAgIHRyeQorCQkJWHBhdGggMgkJCSIgWDogMgorCQkJYXNkZgkgICAgIiBlcnJvcgorCQkJWHBhdGggNAkJCSIgWDogMAorCQkgICAgZmluYWxseQorCQkJWHBhdGggOAkJCSIgWDogOAorCQkgICAgZW5kdHJ5IHwgWHBhdGggMTYJCSIgWDogMAorCQkgICAgWHBhdGggMzIJCQkiIFg6IDAKKwkJICAgIGJyZWFrCisJCWVuZHdoaWxlCisJCVhwYXRoIDY0CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMTI4CQkJIiBYOiAxMjgKKwkgICAgZW5kdHJ5IHwgWHBhdGggMjU2CQkJIiBYOiAwCisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDAKKwkgICAgYnJlYWsKKwllbmR3aGlsZQorCVhwYXRoIDEwMjQJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwkgICAgd2hpbGUgMQorCQljYWxsIEYoKQorCQlYcGF0aCA0MDk2CQkJIiBYOiAwCisJCWJyZWFrCisJICAgIGVuZHdoaWxlICB8IFhwYXRoIDgxOTIJCSIgWDogMAorCSAgICBYcGF0aCAxNjM4NAkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDMyNzY4CQkJCSIgWDogMzI3NjgKKwllbmR0cnkgfCBYcGF0aCA2NTUzNgkJCSIgWDogMAorICAgIGVuZHdoaWxlIHwgWHBhdGggMTMxMDcyCQkJIiBYOiAwCisgICAgWHBhdGggMjYyMTQ0CQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uISBHKCkgYWJvcnQKKwlpZiAxCisJICAgIHRyeQorCQlYcGF0aCA1MjQyODgJCQkiIFg6IDUyNDI4OAorCQlhc2RmCSAgICAiIGVycm9yCisJCVhwYXRoIDEwNDg1NzYJCQkiIFg6IDAKKwkgICAgZmluYWxseQorCQlYcGF0aCAyMDk3MTUyCQkJIiBYOiAyMDk3MTUyCisJICAgIGVuZHRyeSB8IFhwYXRoIDQxOTQzMDQJCSIgWDogMAorCWVuZGlmIHwgWHBhdGggODM4ODYwOAkJCSIgWDogMAorCVhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBpZiAxCisJdHJ5CisJICAgIFhwYXRoIDMzNTU0NDMyCQkJIiBYOiAzMzU1NDQzMgorCSAgICBjYWxsIEcoKQorCSAgICBYcGF0aCA2NzEwODg2NAkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAxMzQyMTc3MjgKKwllbmR0cnkgfCBYcGF0aCAyNjg0MzU0NTYJCSIgWDogMAorICAgIGVuZGlmIHwgWHBhdGggNTM2ODcwOTEyCQkJIiBYOiAwCisgICAgWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDAKK2VuZGlmCisKK1hjaGVjayAxNzA0Mjg1NTUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDMwOiAgRXhlY3V0aW5nIDpmaW5hbGx5IGNsYXVzZXMgb24gaW50ZXJydXB0CQkJICAgIHt7ezEKKyIKKyIJICAgIEFmdGVyIGFuIGludGVycnVwdCBpbiBhIGNvbW1hbmQgZHluYW1pY2FsbHkgZW5jbG9zZWQgaW4KKyIJICAgIGEgOnRyeS86ZW5kdHJ5IHJlZ2lvbiwgOmZpbmFsbHkgY2xhdXNlcyBhcmUgZXhlY3V0ZWQgYW5kIHRoZQorIgkgICAgc2NyaXB0IHByb2Nlc3NpbmcgaXMgdGVybWluYXRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgWGxvb3BJTklUIDEgMTYKKworICAgIGZ1bmN0aW9uISBGKCkKKwl0cnkKKwkgICAgWGxvb3AgMQkJCQkiIFg6IDEgKyAxKjE2CisJICAgICJJTlRFUlJVUFQKKwkgICAgWGxvb3AgMgkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhsb29wIDQJCQkJIiBYOiA0ICsgNCoxNgorCWVuZHRyeQorCVhsb29wIDgJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICB0cnkKKwlYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwl0cnkKKwkgICAgWHBhdGggNTEyCQkJCSIgWDogNTEyCisJICAgICJJTlRFUlJVUFQKKwkgICAgWHBhdGggMTAyNAkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDIwNDgJCQkJIiBYOiAyMDQ4CisJICAgIHRyeQorCQlYcGF0aCA0MDk2CQkJIiBYOiA0MDk2CisJCXRyeQorCQkgICAgWHBhdGggODE5MgkJCSIgWDogODE5MgorCQlmaW5hbGx5CisJCSAgICBYcGF0aCAxNjM4NAkJCSIgWDogMTYzODQKKwkJICAgIHRyeQorCQkJWHBhdGggMzI3NjgJCSIgWDogMzI3NjgKKwkJCSJJTlRFUlJVUFQKKwkJCVhwYXRoIDY1NTM2CQkiIFg6IDAKKwkJICAgIGVuZHRyeQorCQkgICAgWHBhdGggMTMxMDcyCQkiIFg6IDAKKwkJZW5kdHJ5CisJCVhwYXRoIDI2MjE0NAkJCSIgWDogMAorCSAgICBlbmR0cnkKKwkgICAgWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisJZW5kdHJ5CisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDIwOTcxNTIKKwl0cnkKKwkgICAgWHBhdGggNDE5NDMwNAkJCSIgWDogNDE5NDMwNAorCSAgICBjYWxsIEYoKQorCSAgICBYcGF0aCA4Mzg4NjA4CQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAxNjc3NzIxNgkJCSIgWDogMTY3NzcyMTYKKwkgICAgdHJ5CisJCVhwYXRoIDMzNTU0NDMyCQkJIiBYOiAzMzU1NDQzMgorCQlYbG9vcE5FWFQKKwkJRXhlY0FzU2NyaXB0IEYKKwkJWHBhdGggNjcxMDg4NjQJCQkiIFg6IDAKKwkgICAgZmluYWxseQorCQlYcGF0aCAxMzQyMTc3MjgJCQkiIFg6IDEzNDIxNzcyOAorCSAgICBlbmR0cnkKKwkgICAgWHBhdGggMjY4NDM1NDU2CQkJIiBYOiAwCisJZW5kdHJ5CisJWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAwCitlbmRpZgorCitYY2hlY2sgMTkwOTA1MTczCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAzMTogIEV4ZWN1dGluZyA6ZmluYWxseSBjbGF1c2VzIGFmdGVyIDp0aHJvdwkJCSAgICB7e3sxCisiCisiCSAgICBBZnRlciBhIDp0aHJvdyBkeW5hbWljYWxseSBlbmNsb3NlZCBpbiBhIDp0cnkvOmVuZHRyeSByZWdpb24sCisiCSAgICA6ZmluYWxseSBjbGF1c2VzIGFyZSBleGVjdXRlZCBhbmQgdGhlIHNjcmlwdCBwcm9jZXNzaW5nIGlzCisiCSAgICB0ZXJtaW5hdGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2lmIEV4dHJhVmltKCkKKyAgICBYbG9vcElOSVQgMSAxNgorCisgICAgZnVuY3Rpb24hIEYoKQorCXRyeQorCSAgICBYbG9vcCAxCQkJCSIgWDogMSArIDEqMTYKKwkgICAgdGhyb3cgImV4Y2VwdGlvbiIKKwkgICAgWGxvb3AgMgkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhsb29wIDQJCQkJIiBYOiA0ICsgNCoxNgorCWVuZHRyeQorCVhsb29wIDgJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICB0cnkKKwlYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwl0cnkKKwkgICAgWHBhdGggNTEyCQkJCSIgWDogNTEyCisJICAgIHRocm93ICJleGNlcHRpb24iCisJICAgIFhwYXRoIDEwMjQJCQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAyMDQ4CQkJCSIgWDogMjA0OAorCSAgICB0cnkKKwkJWHBhdGggNDA5NgkJCSIgWDogNDA5NgorCQl0cnkKKwkJICAgIFhwYXRoIDgxOTIJCQkiIFg6IDgxOTIKKwkJZmluYWxseQorCQkgICAgWHBhdGggMTYzODQJCQkiIFg6IDE2Mzg0CisJCSAgICB0cnkKKwkJCVhwYXRoIDMyNzY4CQkiIFg6IDMyNzY4CisJCQl0aHJvdyAiZXhjZXB0aW9uIgorCQkJWHBhdGggNjU1MzYJCSIgWDogMAorCQkgICAgZW5kdHJ5CisJCSAgICBYcGF0aCAxMzEwNzIJCSIgWDogMAorCQllbmR0cnkKKwkJWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJICAgIGVuZHRyeQorCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDAKKwllbmR0cnkKKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorCXRyeQorCSAgICBYcGF0aCA0MTk0MzA0CQkJIiBYOiA0MTk0MzA0CisJICAgIGNhbGwgRigpCisJICAgIFhwYXRoIDgzODg2MDgJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorCSAgICB0cnkKKwkJWHBhdGggMzM1NTQ0MzIJCQkiIFg6IDMzNTU0NDMyCisJCVhsb29wTkVYVAorCQlFeGVjQXNTY3JpcHQgRgorCQlYcGF0aCA2NzEwODg2NAkJCSIgWDogMAorCSAgICBmaW5hbGx5CisJCVhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMTM0MjE3NzI4CisJICAgIGVuZHRyeQorCSAgICBYcGF0aCAyNjg0MzU0NTYJCQkiIFg6IDAKKwllbmR0cnkKKwlYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDAKK2VuZGlmCisKK1hjaGVjayAxOTA5MDUxNzMKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDMyOiAgUmVtZW1iZXJpbmcgdGhlIDpyZXR1cm4gdmFsdWUgb24gOmZpbmFsbHkJCQkgICAge3t7MQorIgorIgkgICAgSWYgYSA6ZmluYWxseSBjbGF1c2UgaXMgZXhlY3V0ZWQgZHVlIHRvIGEgOnJldHVybiBzcGVjaWZ5aW5nCisiCSAgICBhIHZhbHVlLCB0aGlzIGlzIHRoZSB2YWx1ZSB2aXNpYmxlIHRvIHRoZSBjYWxsZXIgaWYgbm90IG92ZXJ3cml0dGVuCisiCSAgICBieSBhIG5ldyA6cmV0dXJuIGluIHRoZSA6ZmluYWxseSBjbGF1c2UuICBBIDpyZXR1cm4gd2l0aG91dCBhIHZhbHVlCisiCSAgICBpbiB0aGUgOmZpbmFsbHkgY2xhdXNlIG92ZXJ3cml0ZXMgd2l0aCB2YWx1ZSAwLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBGKCkKKyAgICB0cnkKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl0cnkKKwkgICAgWHBhdGggMgkJCQkiIFg6IDIKKwkgICAgcmV0dXJuICJBQkNEIgorCSAgICBYcGF0aCA0CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggOAkJCQkiIFg6IDgKKwllbmR0cnkKKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMzIJCQkJIiBYOiAzMgorICAgIGVuZHRyeQorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBHKCkKKyAgICB0cnkKKwlYcGF0aCAxMjgJCQkJIiBYOiAxMjgKKwlyZXR1cm4gOAorCVhwYXRoIDI1NgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggNTEyCQkJCSIgWDogNTEyCisJcmV0dXJuIDE2ICsgc3RybGVuKEYoKSkKKwlYcGF0aCAxMDI0CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDIwNDgJCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEgoKQorICAgIHRyeQorCVhwYXRoIDQwOTYJCQkJIiBYOiA0MDk2CisJcmV0dXJuIDMyCisJWHBhdGggODE5MgkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMTYzODQJCQkJIiBYOiAxNjM4NAorCXJldHVybgorCVhwYXRoIDMyNzY4CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBJKCkKKyAgICB0cnkKKwlYcGF0aCAxMzEwNzIJCQkJIiBYOiAxMzEwNzIKKyAgICBmaW5hbGx5CisJWHBhdGggMjYyMTQ0CQkJCSIgWDogMjYyMTQ0CisJcmV0dXJuIEcoKSArIEgoKSArIDY0CisJWHBhdGggNTI0Mjg4CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitsZXQgcmV0Y29kZSA9IEkoKQorWHBhdGggMjA5NzE1MgkJCQkJIiBYOiAyMDk3MTUyCisKK2lmIHJldGNvZGUgPCAwCisgICAgWHBhdGggNDE5NDMwNAkJCQkiIFg6IDAKK2VuZGlmCitpZiByZXRjb2RlICUgNAorICAgIFhwYXRoIDgzODg2MDgJCQkJIiBYOiAwCitlbmRpZgoraWYgKHJldGNvZGUvNCkgJSAyCisgICAgWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAxNjc3NzIxNgorZW5kaWYKK2lmIChyZXRjb2RlLzgpICUgMgorICAgIFhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMAorZW5kaWYKK2lmIChyZXRjb2RlLzE2KSAlIDIKKyAgICBYcGF0aCA2NzEwODg2NAkJCQkiIFg6IDY3MTA4ODY0CitlbmRpZgoraWYgKHJldGNvZGUvMzIpICUgMgorICAgIFhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDAKK2VuZGlmCitpZiAocmV0Y29kZS82NCkgJSAyCisgICAgWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMjY4NDM1NDU2CitlbmRpZgoraWYgcmV0Y29kZS8xMjgKKyAgICBYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCitlbmRpZgorCit1bmxldCByZXRjb2RlCitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBHCitkZWxmdW5jdGlvbiBICitkZWxmdW5jdGlvbiBJCisKK1hjaGVjayAzNTQ4MzMwNjcKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDMzOiAgOnJldHVybiB1bmRlciA6ZXhlY3V0ZSBvciB1c2VyIGNvbW1hbmQgYW5kIDpmaW5hbGx5CQkgICAge3t7MQorIgorIgkgICAgQSA6cmV0dXJuIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkIHVuZGVyIGFuICI6ZXhlY3V0ZSIgb3IgZnJvbQorIgkgICAgYSB1c2VyIGNvbW1hbmQuICBFeGVjdXRpbmcgb2YgOmZpbmFsbHkgY2xhdXNlcyBhbmQgcGFzc2luZyB0aHJvdWdoCisiCSAgICB0aGUgcmV0dXJuIGNvZGUgd29ya3MgYWxzbyB0aGVuLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1hwYXRoSU5JVAorCitjb21tYW5kISAtbmFyZ3M9PyBSRVRVUk4KKyAgICBcIHRyeSB8IHJldHVybiA8YXJncz4gfCBmaW5hbGx5IHwgcmV0dXJuIDxhcmdzPiAqIDIgfCBlbmR0cnkKKworZnVuY3Rpb24hIEYoKQorICAgIHRyeQorCVJFVFVSTiA4CisJWHBhdGggMQkJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDIJCQkJCSIgWDogMgorICAgIGVuZHRyeQorICAgIFhwYXRoIDQJCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEcoKQorICAgIHRyeQorCVJFVFVSTiAzMgorCVhwYXRoIDgJCQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCAxNgkJCQkiIFg6IDE2CisJUkVUVVJOIDEyOAorCVhwYXRoIDMyCQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBIKCkKKyAgICB0cnkKKwlleGVjdXRlICJ0cnkgfCByZXR1cm4gNTEyIHwgZmluYWxseSB8IHJldHVybiAxMDI0IHwgZW5kdHJ5IgorCVhwYXRoIDEyOAkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisgICAgZW5kdHJ5CisgICAgWHBhdGggNTEyCQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBJKCkKKyAgICB0cnkKKwlleGVjdXRlICJ0cnkgfCByZXR1cm4gMjA0OCB8IGZpbmFsbHkgfCByZXR1cm4gNDA5NiB8IGVuZHRyeSIKKwlYcGF0aCAxMDI0CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCAyMDQ4CQkJCSIgWDogMjA0OAorCWV4ZWN1dGUgInRyeSB8IHJldHVybiA4MTkyIHwgZmluYWxseSB8IHJldHVybiAxNjM4NCB8IGVuZHRyeSIKKwlYcGF0aCA0MDk2CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDgxOTIJCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEooKQorICAgIHRyeQorCVJFVFVSTiAzMjc2OAorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisJcmV0dXJuCisJWHBhdGggNjU1MzYJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMTMxMDcyCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEsoKQorICAgIHRyeQorCWV4ZWN1dGUgInRyeSB8IHJldHVybiAxMzEwNzIgfCBmaW5hbGx5IHwgcmV0dXJuIDI2MjE0NCB8IGVuZHRyeSIKKwlYcGF0aCAyNjIxNDQJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDUyNDI4OAkJCQkiIFg6IDUyNDI4OAorCWV4ZWN1dGUgInRyeSB8IHJldHVybiA1MjQyODggfCBmaW5hbGx5IHwgcmV0dXJuIHwgZW5kdHJ5IgorCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMjA5NzE1MgkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBMKCkKKyAgICB0cnkKKwlyZXR1cm4KKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogODM4ODYwOAorCVJFVFVSTiAxMDQ4NTc2CisJWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgTSgpCisgICAgdHJ5CisJcmV0dXJuCisJWHBhdGggNjcxMDg4NjQJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCWV4ZWN1dGUgInRyeSB8IHJldHVybiA0MTk0MzA0IHwgZmluYWxseSB8IHJldHVybiA4Mzg4NjA4IHwgZW5kdHJ5IgorCVhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKyAgICBYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgTigpCisgICAgUkVUVVJOIDE2Nzc3MjE2CitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgTygpCisgICAgZXhlY3V0ZSAidHJ5IHwgcmV0dXJuIDY3MTA4ODY0IHwgZmluYWxseSB8IHJldHVybiAxMzQyMTc3MjggfCBlbmR0cnkiCitlbmRmdW5jdGlvbgorCitsZXQgc3VtCSAgICAgPSBGKCkgKyBHKCkgKyBIKCkgICsgSSgpICAgKyBKKCkgKyBLKCkgKyBMKCkgICAgICsgTSgpCitsZXQgZXhwZWN0ZWQgPSAxNiAgKyAyNTYgKyAxMDI0ICsgMTYzODQgKyAwICAgKyAwICAgKyAyMDk3MTUyICsgODM4ODYwOAorbGV0IHN1bQkgICAgID0gc3VtICAgICAgKyBOKCkgICAgICArIE8oKQorbGV0IGV4cGVjdGVkID0gZXhwZWN0ZWQgKyAzMzU1NDQzMiArIDEzNDIxNzcyOAorCitpZiBzdW0gPT0gZXhwZWN0ZWQKKyAgICBYb3V0ICJzdW0gPSAiIC4gc3VtIC4gIiAob2spIgorZWxzZQorICAgIFhvdXQgInN1bSA9ICIgLiBzdW0gLiAiLCBleHBlY3RlZDogIiAuIGV4cGVjdGVkCitlbmRpZgorCitYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCitpZiBzdW0gIT0gZXhwZWN0ZWQKKyAgICAiIFRoZSBYcGF0aCBjb21tYW5kIGRvZXMgbm90IGFjY2VwdCAyXjMxIChuZWdhdGl2ZSk7IGFkZCBleHBsaWNpdGx5OgorICAgIGxldCBYcGF0aCA9IFhwYXRoICsgMjE0NzQ4MzY0OAkJIiBYOiAwCitlbmRpZgorCit1bmxldCBzdW0gZXhwZWN0ZWQKK2RlbGZ1bmN0aW9uIEYKK2RlbGZ1bmN0aW9uIEcKK2RlbGZ1bmN0aW9uIEgKK2RlbGZ1bmN0aW9uIEkKK2RlbGZ1bmN0aW9uIEoKK2RlbGZ1bmN0aW9uIEsKK2RlbGZ1bmN0aW9uIEwKK2RlbGZ1bmN0aW9uIE0KK2RlbGZ1bmN0aW9uIE4KK2RlbGZ1bmN0aW9uIE8KKworWGNoZWNrIDEyMTY5MDc1MzgKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDM0OiAgOmZpbmFsbHkgcmVhc29uIGRpc2NhcmRlZCBieSA6Y29udGludWUJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIDpmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZCBkdWUgdG8gYSA6Y29udGludWUsIDpicmVhaywKKyIJICAgIDpyZXR1cm4sIDpmaW5pc2gsIGVycm9yLCBpbnRlcnJ1cHQgb3IgOnRocm93LCB0aGUganVtcCByZWFzb24gaXMKKyIJICAgIGRpc2NhcmRlZCBieSBhIDpjb250aW51ZSBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgWGxvb3BJTklUISAxIDgKKworICAgIGZ1bmN0aW9uISBDKGp1bXApCisJWGxvb3BORVhUCisJbGV0IGxvb3AgPSAwCisJd2hpbGUgbG9vcCA8IDIKKwkgICAgbGV0IGxvb3AgPSBsb29wICsgMQorCSAgICBpZiBsb29wID09IDEKKwkJdHJ5CisJCSAgICBpZiBhOmp1bXAgPT0gImNvbnRpbnVlIgorCQkJY29udGludWUKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImJyZWFrIgorCQkJYnJlYWsKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gInJldHVybiIgfHwgYTpqdW1wID09ICJmaW5pc2giCisJCQlyZXR1cm4KKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImVycm9yIgorCQkJYXNkZgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiaW50ZXJydXB0IgorCQkJIklOVEVSUlVQVAorCQkJbGV0IGR1bW15ID0gMAorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAidGhyb3ciCisJCQl0aHJvdyAiYWJjIgorCQkgICAgZW5kaWYKKwkJZmluYWxseQorCQkgICAgY29udGludWUJIiBkaXNjYXJkcyBqdW1wIHRoYXQgY2F1c2VkIHRoZSA6ZmluYWxseQorCQkgICAgWGxvb3AgMQkJIiBYOiAwCisJCWVuZHRyeQorCQlYbG9vcCAyCQkJIiBYOiAwCisJICAgIGVsc2VpZiBsb29wID09IDIKKwkJWGxvb3AgNAkJCSIgWDogNCooMSs4KzY0KzUxMis0MDk2KzMyNzY4KzI2MjE0NCkKKwkgICAgZW5kaWYKKwllbmR3aGlsZQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBjYWxsIEMoImNvbnRpbnVlIikKKyAgICBYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorICAgIGNhbGwgQygiYnJlYWsiKQorICAgIFhwYXRoIDQxOTQzMDQJCQkJIiBYOiA0MTk0MzA0CisgICAgY2FsbCBDKCJyZXR1cm4iKQorICAgIFhwYXRoIDgzODg2MDgJCQkJIiBYOiA4Mzg4NjA4CisgICAgbGV0IGc6anVtcCA9ICJmaW5pc2giCisgICAgRXhlY0FzU2NyaXB0IEMKKyAgICB1bmxldCBnOmp1bXAKKyAgICBYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDE2Nzc3MjE2CisgICAgdHJ5CisJY2FsbCBDKCJlcnJvciIpCisJWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAzMzU1NDQzMgorICAgIGZpbmFsbHkKKwlYcGF0aCA2NzEwODg2NAkJCQkiIFg6IDY3MTA4ODY0CisJdHJ5CisJICAgIGNhbGwgQygiaW50ZXJydXB0IikKKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAxMzQyMTc3MjgKKwlmaW5hbGx5CisJICAgIFhwYXRoIDI2ODQzNTQ1NgkJCSIgWDogMjY4NDM1NDU2CisJICAgIGNhbGwgQygidGhyb3ciKQorCSAgICBYcGF0aCA1MzY4NzA5MTIJCQkiIFg6IDUzNjg3MDkxMgorCWVuZHRyeQorICAgIGVuZHRyeQorICAgIFhwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAxMDczNzQxODI0CisKKyAgICBkZWxmdW5jdGlvbiBDCisKK2VuZGlmCisKK1hjaGVjayAyMTQ2NTg0ODY4CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAzNTogIDpmaW5hbGx5IHJlYXNvbiBkaXNjYXJkZWQgYnkgOmJyZWFrCQkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGEgOmZpbmFsbHkgY2xhdXNlIGlzIGV4ZWN1dGVkIGR1ZSB0byBhIDpjb250aW51ZSwgOmJyZWFrLAorIgkgICAgOnJldHVybiwgOmZpbmlzaCwgZXJyb3IsIGludGVycnVwdCBvciA6dGhyb3csIHRoZSBqdW1wIHJlYXNvbiBpcworIgkgICAgZGlzY2FyZGVkIGJ5IGEgOmJyZWFrIGluIHRoZSBmaW5hbGx5IGNsYXVzZS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisKKyAgICBYbG9vcElOSVQhIDEgOAorCisgICAgZnVuY3Rpb24hIEIoanVtcCkKKwlYbG9vcE5FWFQKKwlsZXQgbG9vcCA9IDAKKwl3aGlsZSBsb29wIDwgMgorCSAgICBsZXQgbG9vcCA9IGxvb3AgKyAxCisJICAgIGlmIGxvb3AgPT0gMQorCQl0cnkKKwkJICAgIGlmIGE6anVtcCA9PSAiY29udGludWUiCisJCQljb250aW51ZQorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiYnJlYWsiCisJCQlicmVhaworCQkgICAgZWxzZWlmIGE6anVtcCA9PSAicmV0dXJuIiB8fCBhOmp1bXAgPT0gImZpbmlzaCIKKwkJCXJldHVybgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiZXJyb3IiCisJCQlhc2RmCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJpbnRlcnJ1cHQiCisJCQkiSU5URVJSVVBUCisJCQlsZXQgZHVtbXkgPSAwCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJ0aHJvdyIKKwkJCXRocm93ICJhYmMiCisJCSAgICBlbmRpZgorCQlmaW5hbGx5CisJCSAgICBicmVhawkiIGRpc2NhcmRzIGp1bXAgdGhhdCBjYXVzZWQgdGhlIDpmaW5hbGx5CisJCSAgICBYbG9vcCAxCQkiIFg6IDAKKwkJZW5kdHJ5CisJICAgIGVsc2VpZiBsb29wID09IDIKKwkJWGxvb3AgMgkJCSIgWDogMAorCSAgICBlbmRpZgorCWVuZHdoaWxlCisJWGxvb3AgNAkJCQkiIFg6IDQqKDErOCs2NCs1MTIrNDA5NiszMjc2OCsyNjIxNDQpCisgICAgZW5kZnVuY3Rpb24KKworICAgIGNhbGwgQigiY29udGludWUiKQorICAgIFhwYXRoIDIwOTcxNTIJCQkJIiBYOiAyMDk3MTUyCisgICAgY2FsbCBCKCJicmVhayIpCisgICAgWHBhdGggNDE5NDMwNAkJCQkiIFg6IDQxOTQzMDQKKyAgICBjYWxsIEIoInJldHVybiIpCisgICAgWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKyAgICBsZXQgZzpqdW1wID0gImZpbmlzaCIKKyAgICBFeGVjQXNTY3JpcHQgQgorICAgIHVubGV0IGc6anVtcAorICAgIFhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMTY3NzcyMTYKKyAgICB0cnkKKwljYWxsIEIoImVycm9yIikKKwlYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDMzNTU0NDMyCisgICAgZmluYWxseQorCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKKwl0cnkKKwkgICAgY2FsbCBCKCJpbnRlcnJ1cHQiKQorCSAgICBYcGF0aCAxMzQyMTc3MjgJCQkiIFg6IDEzNDIxNzcyOAorCWZpbmFsbHkKKwkgICAgWHBhdGggMjY4NDM1NDU2CQkJIiBYOiAyNjg0MzU0NTYKKwkgICAgY2FsbCBCKCJ0aHJvdyIpCisJICAgIFhwYXRoIDUzNjg3MDkxMgkJCSIgWDogNTM2ODcwOTEyCisJZW5kdHJ5CisgICAgZW5kdHJ5CisgICAgWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDEwNzM3NDE4MjQKKworICAgIGRlbGZ1bmN0aW9uIEIKKworZW5kaWYKKworWGNoZWNrIDIxNDY1ODQ4NjgKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDM2OiAgOmZpbmFsbHkgcmVhc29uIGRpc2NhcmRlZCBieSA6cmV0dXJuCQkJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYSA6ZmluYWxseSBjbGF1c2UgaXMgZXhlY3V0ZWQgZHVlIHRvIGEgOmNvbnRpbnVlLCA6YnJlYWssCisiCSAgICA6cmV0dXJuLCA6ZmluaXNoLCBlcnJvciwgaW50ZXJydXB0IG9yIDp0aHJvdywgdGhlIGp1bXAgcmVhc29uIGlzCisiCSAgICBkaXNjYXJkZWQgYnkgYSA6cmV0dXJuIGluIHRoZSBmaW5hbGx5IGNsYXVzZS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisKKyAgICBYbG9vcElOSVQhIDEgOAorCisgICAgZnVuY3Rpb24hIFIoanVtcCwgcmV0dmFsKSBhYm9ydAorCVhsb29wTkVYVAorCWxldCBsb29wID0gMAorCXdoaWxlIGxvb3AgPCAyCisJICAgIGxldCBsb29wID0gbG9vcCArIDEKKwkgICAgaWYgbG9vcCA9PSAxCisJCXRyeQorCQkgICAgaWYgYTpqdW1wID09ICJjb250aW51ZSIKKwkJCWNvbnRpbnVlCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJicmVhayIKKwkJCWJyZWFrCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJyZXR1cm4iCisJCQlyZXR1cm4KKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImVycm9yIgorCQkJYXNkZgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiaW50ZXJydXB0IgorCQkJIklOVEVSUlVQVAorCQkJbGV0IGR1bW15ID0gMAorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAidGhyb3ciCisJCQl0aHJvdyAiYWJjIgorCQkgICAgZW5kaWYKKwkJZmluYWxseQorCQkgICAgcmV0dXJuIGE6cmV0dmFsCSIgZGlzY2FyZHMganVtcCB0aGF0IGNhdXNlZCB0aGUgOmZpbmFsbHkKKwkJICAgIFhsb29wIDEJCQkiIFg6IDAKKwkJZW5kdHJ5CisJICAgIGVsc2VpZiBsb29wID09IDIKKwkJWGxvb3AgMgkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR3aGlsZQorCVhsb29wIDQJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBsZXQgc3VtID0gIC1SKCJjb250aW51ZSIsIC04KQorICAgIFhwYXRoIDIwOTcxNTIJCQkJIiBYOiAyMDk3MTUyCisgICAgbGV0IHN1bSA9IHN1bSAtIFIoImJyZWFrIiwgLTE2KQorICAgIFhwYXRoIDQxOTQzMDQJCQkJIiBYOiA0MTk0MzA0CisgICAgbGV0IHN1bSA9IHN1bSAtIFIoInJldHVybiIsIC0zMikKKyAgICBYcGF0aCA4Mzg4NjA4CQkJCSIgWDogODM4ODYwOAorICAgIHRyeQorCWxldCBzdW0gPSBzdW0gLSBSKCJlcnJvciIsIC02NCkKKwlYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDE2Nzc3MjE2CisgICAgZmluYWxseQorCVhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMzM1NTQ0MzIKKwl0cnkKKwkgICAgbGV0IHN1bSA9IHN1bSAtIFIoImludGVycnVwdCIsIC0xMjgpCisJICAgIFhwYXRoIDY3MTA4ODY0CQkJIiBYOiA2NzEwODg2NAorCWZpbmFsbHkKKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAxMzQyMTc3MjgKKwkgICAgbGV0IHN1bSA9IHN1bSAtIFIoInRocm93IiwgLTI1NikKKwkgICAgWHBhdGggMjY4NDM1NDU2CQkJIiBYOiAyNjg0MzU0NTYKKwllbmR0cnkKKyAgICBlbmR0cnkKKyAgICBYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiA1MzY4NzA5MTIKKworICAgIGxldCBleHBlY3RlZCA9IDggKyAxNiArIDMyICsgNjQgKyAxMjggKyAyNTYKKyAgICBpZiBzdW0gIT0gZXhwZWN0ZWQKKwlYcGF0aCAxMDczNzQxODI0CQkJIiBYOiAwCisJWG91dCAic3VtID0iIC4gc3VtIC4gIiwgZXhwZWN0ZWQ6ICIgLiBleHBlY3RlZAorICAgIGVuZGlmCisKKyAgICB1bmxldCBzdW0gZXhwZWN0ZWQKKyAgICBkZWxmdW5jdGlvbiBSCisKK2VuZGlmCisKK1hjaGVjayAxMDcxNjQ0NjcyCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAzNzogIDpmaW5hbGx5IHJlYXNvbiBkaXNjYXJkZWQgYnkgOmZpbmlzaAkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGEgOmZpbmFsbHkgY2xhdXNlIGlzIGV4ZWN1dGVkIGR1ZSB0byBhIDpjb250aW51ZSwgOmJyZWFrLAorIgkgICAgOnJldHVybiwgOmZpbmlzaCwgZXJyb3IsIGludGVycnVwdCBvciA6dGhyb3csIHRoZSBqdW1wIHJlYXNvbiBpcworIgkgICAgZGlzY2FyZGVkIGJ5IGEgOmZpbmlzaCBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgWGxvb3BJTklUISAxIDgKKworICAgIGZ1bmN0aW9uISBGKGp1bXApCSIgbm90IGV4ZWN1dGVkIGFzIGZ1bmN0aW9uLCB0cmFuc2Zvcm1lZCB0byBhIHNjcmlwdAorCVhsb29wTkVYVAorCWxldCBsb29wID0gMAorCXdoaWxlIGxvb3AgPCAyCisJICAgIGxldCBsb29wID0gbG9vcCArIDEKKwkgICAgaWYgbG9vcCA9PSAxCisJCXRyeQorCQkgICAgaWYgYTpqdW1wID09ICJjb250aW51ZSIKKwkJCWNvbnRpbnVlCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJicmVhayIKKwkJCWJyZWFrCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJmaW5pc2giCisJCQlmaW5pc2gKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImVycm9yIgorCQkJYXNkZgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiaW50ZXJydXB0IgorCQkJIklOVEVSUlVQVAorCQkJbGV0IGR1bW15ID0gMAorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAidGhyb3ciCisJCQl0aHJvdyAiYWJjIgorCQkgICAgZW5kaWYKKwkJZmluYWxseQorCQkgICAgZmluaXNoCSIgZGlzY2FyZHMganVtcCB0aGF0IGNhdXNlZCB0aGUgOmZpbmFsbHkKKwkJICAgIFhsb29wIDEJCQkiIFg6IDAKKwkJZW5kdHJ5CisJICAgIGVsc2VpZiBsb29wID09IDIKKwkJWGxvb3AgMgkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR3aGlsZQorCVhsb29wIDQJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBsZXQgc2NyaXB0RiA9IE1ha2VTY3JpcHQoIkYiKQorICAgIGRlbGZ1bmN0aW9uIEYKKworICAgIGxldCBnOmp1bXAgPSAiY29udGludWUiCisgICAgZXhlYyAic291cmNlIiBzY3JpcHRGCisgICAgWHBhdGggMjA5NzE1MgkJCQkiIFg6IDIwOTcxNTIKKyAgICBsZXQgZzpqdW1wID0gImJyZWFrIgorICAgIGV4ZWMgInNvdXJjZSIgc2NyaXB0RgorICAgIFhwYXRoIDQxOTQzMDQJCQkJIiBYOiA0MTk0MzA0CisgICAgbGV0IGc6anVtcCA9ICJmaW5pc2giCisgICAgZXhlYyAic291cmNlIiBzY3JpcHRGCisgICAgWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKyAgICB0cnkKKwlsZXQgZzpqdW1wID0gImVycm9yIgorCWV4ZWMgInNvdXJjZSIgc2NyaXB0RgorCVhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMTY3NzcyMTYKKyAgICBmaW5hbGx5CisJWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAzMzU1NDQzMgorCXRyeQorCSAgICBsZXQgZzpqdW1wID0gImludGVycnVwdCIKKwkgICAgZXhlYyAic291cmNlIiBzY3JpcHRGCisJICAgIFhwYXRoIDY3MTA4ODY0CQkJIiBYOiA2NzEwODg2NAorCWZpbmFsbHkKKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAxMzQyMTc3MjgKKwkgICAgdHJ5CisJCWxldCBnOmp1bXAgPSAidGhyb3ciCisJCWV4ZWMgInNvdXJjZSIgc2NyaXB0RgorCQlYcGF0aCAyNjg0MzU0NTYJCQkiIFg6IDI2ODQzNTQ1NgorCSAgICBmaW5hbGx5CisJCVhwYXRoIDUzNjg3MDkxMgkJCSIgWDogNTM2ODcwOTEyCisJICAgIGVuZHRyeQorCWVuZHRyeQorICAgIGVuZHRyeQorICAgIHVubGV0IGc6anVtcAorCisgICAgY2FsbCBkZWxldGUoc2NyaXB0RikKKyAgICB1bmxldCBzY3JpcHRGCisKK2VuZGlmCisKK1hjaGVjayAxMDcxNjQ0NjcyCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAzODogIDpmaW5hbGx5IHJlYXNvbiBkaXNjYXJkZWQgYnkgYW4gZXJyb3IJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIDpmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZCBkdWUgdG8gYSA6Y29udGludWUsIDpicmVhaywKKyIJICAgIDpyZXR1cm4sIDpmaW5pc2gsIGVycm9yLCBpbnRlcnJ1cHQgb3IgOnRocm93LCB0aGUganVtcCByZWFzb24gaXMKKyIJICAgIGRpc2NhcmRlZCBieSBhbiBlcnJvciBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgWGxvb3BJTklUISAxIDQKKworICAgIGZ1bmN0aW9uISBFKGp1bXApCisJWGxvb3BORVhUCisJbGV0IGxvb3AgPSAwCisJd2hpbGUgbG9vcCA8IDIKKwkgICAgbGV0IGxvb3AgPSBsb29wICsgMQorCSAgICBpZiBsb29wID09IDEKKwkJdHJ5CisJCSAgICBpZiBhOmp1bXAgPT0gImNvbnRpbnVlIgorCQkJY29udGludWUKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImJyZWFrIgorCQkJYnJlYWsKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gInJldHVybiIgfHwgYTpqdW1wID09ICJmaW5pc2giCisJCQlyZXR1cm4KKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImVycm9yIgorCQkJYXNkZgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiaW50ZXJydXB0IgorCQkJIklOVEVSUlVQVAorCQkJbGV0IGR1bW15ID0gMAorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAidGhyb3ciCisJCQl0aHJvdyAiYWJjIgorCQkgICAgZW5kaWYKKwkJZmluYWxseQorCQkgICAgYXNkZgkiIGVycm9yOyBkaXNjYXJkcyBqdW1wIHRoYXQgY2F1c2VkIHRoZSA6ZmluYWxseQorCQllbmR0cnkKKwkgICAgZWxzZWlmIGxvb3AgPT0gMgorCQlYbG9vcCAxCQkJCSIgWDogMAorCSAgICBlbmRpZgorCWVuZHdoaWxlCisJWGxvb3AgMgkJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIHRyeQorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwljYWxsIEUoImNvbnRpbnVlIikKKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJdHJ5CisJICAgIFhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwkgICAgY2FsbCBFKCJicmVhayIpCisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgdHJ5CisJCVhwYXRoIDI2MjE0NAkJCSIgWDogMjYyMTQ0CisJCWNhbGwgRSgicmV0dXJuIikKKwkJWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJdHJ5CisJCSAgICBYcGF0aCAxMDQ4NTc2CQkiIFg6IDEwNDg1NzYKKwkJICAgIGxldCBnOmp1bXAgPSAiZmluaXNoIgorCQkgICAgRXhlY0FzU2NyaXB0IEUKKwkJICAgIFhwYXRoIDIwOTcxNTIJCSIgWDogMAorCQlmaW5hbGx5CisJCSAgICB1bmxldCBnOmp1bXAKKwkJICAgIHRyeQorCQkJWHBhdGggNDE5NDMwNAkJIiBYOiA0MTk0MzA0CisJCQljYWxsIEUoImVycm9yIikKKwkJCVhwYXRoIDgzODg2MDgJCSIgWDogMAorCQkgICAgZmluYWxseQorCQkJdHJ5CisJCQkgICAgWHBhdGggMTY3NzcyMTYJIiBYOiAxNjc3NzIxNgorCQkJICAgIGNhbGwgRSgiaW50ZXJydXB0IikKKwkJCSAgICBYcGF0aCAzMzU1NDQzMgkiIFg6IDAKKwkJCWZpbmFsbHkKKwkJCSAgICB0cnkKKwkJCQlYcGF0aCA2NzEwODg2NAkiIFg6IDY3MTA4ODY0CisJCQkJY2FsbCBFKCJ0aHJvdyIpCisJCQkJWHBhdGggMTM0MjE3NzI4CSIgWDogMAorCQkJICAgIGZpbmFsbHkKKwkJCQlYcGF0aCAyNjg0MzU0NTYJIiBYOiAyNjg0MzU0NTYKKwkJCQlkZWxmdW5jdGlvbiBFCisJCQkgICAgZW5kdHJ5CisJCQllbmR0cnkKKwkJICAgIGVuZHRyeQorCQllbmR0cnkKKwkgICAgZW5kdHJ5CisJZW5kdHJ5CisgICAgZW5kdHJ5CisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogMAorCitlbmRpZgorCitYY2hlY2sgMzU3OTA4NDgwCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCAzOTogIDpmaW5hbGx5IHJlYXNvbiBkaXNjYXJkZWQgYnkgYW4gaW50ZXJydXB0CQkJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYSA6ZmluYWxseSBjbGF1c2UgaXMgZXhlY3V0ZWQgZHVlIHRvIGEgOmNvbnRpbnVlLCA6YnJlYWssCisiCSAgICA6cmV0dXJuLCA6ZmluaXNoLCBlcnJvciwgaW50ZXJydXB0IG9yIDp0aHJvdywgdGhlIGp1bXAgcmVhc29uIGlzCisiCSAgICBkaXNjYXJkZWQgYnkgYW4gaW50ZXJydXB0IGluIHRoZSBmaW5hbGx5IGNsYXVzZS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisKKyAgICBYbG9vcElOSVQhIDEgNAorCisgICAgZnVuY3Rpb24hIEkoanVtcCkKKwlYbG9vcE5FWFQKKwlsZXQgbG9vcCA9IDAKKwl3aGlsZSBsb29wIDwgMgorCSAgICBsZXQgbG9vcCA9IGxvb3AgKyAxCisJICAgIGlmIGxvb3AgPT0gMQorCQl0cnkKKwkJICAgIGlmIGE6anVtcCA9PSAiY29udGludWUiCisJCQljb250aW51ZQorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiYnJlYWsiCisJCQlicmVhaworCQkgICAgZWxzZWlmIGE6anVtcCA9PSAicmV0dXJuIiB8fCBhOmp1bXAgPT0gImZpbmlzaCIKKwkJCXJldHVybgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiZXJyb3IiCisJCQlhc2RmCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJpbnRlcnJ1cHQiCisJCQkiSU5URVJSVVBUCisJCQlsZXQgZHVtbXkgPSAwCisJCSAgICBlbHNlaWYgYTpqdW1wID09ICJ0aHJvdyIKKwkJCXRocm93ICJhYmMiCisJCSAgICBlbmRpZgorCQlmaW5hbGx5CisJCSAgICAiSU5URVJSVVBUIC0gZGlzY2FyZHMganVtcCB0aGF0IGNhdXNlZCB0aGUgOmZpbmFsbHkKKwkJICAgIGxldCBkdW1teSA9IDAKKwkJZW5kdHJ5CisJICAgIGVsc2VpZiBsb29wID09IDIKKwkJWGxvb3AgMQkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR3aGlsZQorCVhsb29wIDIJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICB0cnkKKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDE2Mzg0CisJY2FsbCBJKCJjb250aW51ZSIpCisJWHBhdGggMzI3NjgJCQkJIiBYOiAwCisgICAgZmluYWxseQorCXRyeQorCSAgICBYcGF0aCA2NTUzNgkJCQkiIFg6IDY1NTM2CisJICAgIGNhbGwgSSgiYnJlYWsiKQorCSAgICBYcGF0aCAxMzEwNzIJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIHRyeQorCQlYcGF0aCAyNjIxNDQJCQkiIFg6IDI2MjE0NAorCQljYWxsIEkoInJldHVybiIpCisJCVhwYXRoIDUyNDI4OAkJCSIgWDogMAorCSAgICBmaW5hbGx5CisJCXRyeQorCQkgICAgWHBhdGggMTA0ODU3NgkJIiBYOiAxMDQ4NTc2CisJCSAgICBsZXQgZzpqdW1wID0gImZpbmlzaCIKKwkJICAgIEV4ZWNBc1NjcmlwdCBJCisJCSAgICBYcGF0aCAyMDk3MTUyCQkiIFg6IDAKKwkJZmluYWxseQorCQkgICAgdW5sZXQgZzpqdW1wCisJCSAgICB0cnkKKwkJCVhwYXRoIDQxOTQzMDQJCSIgWDogNDE5NDMwNAorCQkJY2FsbCBJKCJlcnJvciIpCisJCQlYcGF0aCA4Mzg4NjA4CQkiIFg6IDAKKwkJICAgIGZpbmFsbHkKKwkJCXRyeQorCQkJICAgIFhwYXRoIDE2Nzc3MjE2CSIgWDogMTY3NzcyMTYKKwkJCSAgICBjYWxsIEkoImludGVycnVwdCIpCisJCQkgICAgWHBhdGggMzM1NTQ0MzIJIiBYOiAwCisJCQlmaW5hbGx5CisJCQkgICAgdHJ5CisJCQkJWHBhdGggNjcxMDg4NjQJIiBYOiA2NzEwODg2NAorCQkJCWNhbGwgSSgidGhyb3ciKQorCQkJCVhwYXRoIDEzNDIxNzcyOAkiIFg6IDAKKwkJCSAgICBmaW5hbGx5CisJCQkJWHBhdGggMjY4NDM1NDU2CSIgWDogMjY4NDM1NDU2CisJCQkJZGVsZnVuY3Rpb24gSQorCQkJICAgIGVuZHRyeQorCQkJZW5kdHJ5CisJCSAgICBlbmR0cnkKKwkJZW5kdHJ5CisJICAgIGVuZHRyeQorCWVuZHRyeQorICAgIGVuZHRyeQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKKworZW5kaWYKKworWGNoZWNrIDM1NzkwODQ4MAorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNDA6ICA6ZmluYWxseSByZWFzb24gZGlzY2FyZGVkIGJ5IDp0aHJvdwkJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIDpmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZCBkdWUgdG8gYSA6Y29udGludWUsIDpicmVhaywKKyIJICAgIDpyZXR1cm4sIDpmaW5pc2gsIGVycm9yLCBpbnRlcnJ1cHQgb3IgOnRocm93LCB0aGUganVtcCByZWFzb24gaXMKKyIJICAgIGRpc2NhcmRlZCBieSBhIDp0aHJvdyBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgWGxvb3BJTklUISAxIDQKKworICAgIGZ1bmN0aW9uISBUKGp1bXApCisJWGxvb3BORVhUCisJbGV0IGxvb3AgPSAwCisJd2hpbGUgbG9vcCA8IDIKKwkgICAgbGV0IGxvb3AgPSBsb29wICsgMQorCSAgICBpZiBsb29wID09IDEKKwkJdHJ5CisJCSAgICBpZiBhOmp1bXAgPT0gImNvbnRpbnVlIgorCQkJY29udGludWUKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImJyZWFrIgorCQkJYnJlYWsKKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gInJldHVybiIgfHwgYTpqdW1wID09ICJmaW5pc2giCisJCQlyZXR1cm4KKwkJICAgIGVsc2VpZiBhOmp1bXAgPT0gImVycm9yIgorCQkJYXNkZgorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAiaW50ZXJydXB0IgorCQkJIklOVEVSUlVQVAorCQkJbGV0IGR1bW15ID0gMAorCQkgICAgZWxzZWlmIGE6anVtcCA9PSAidGhyb3ciCisJCQl0aHJvdyAiYWJjIgorCQkgICAgZW5kaWYKKwkJZmluYWxseQorCQkgICAgdGhyb3cgInh5eiIJIiBkaXNjYXJkcyBqdW1wIHRoYXQgY2F1c2VkIHRoZSA6ZmluYWxseQorCQllbmR0cnkKKwkgICAgZWxzZWlmIGxvb3AgPT0gMgorCQlYbG9vcCAxCQkJCSIgWDogMAorCSAgICBlbmRpZgorCWVuZHdoaWxlCisJWGxvb3AgMgkJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIHRyeQorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwljYWxsIFQoImNvbnRpbnVlIikKKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJdHJ5CisJICAgIFhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwkgICAgY2FsbCBUKCJicmVhayIpCisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgdHJ5CisJCVhwYXRoIDI2MjE0NAkJCSIgWDogMjYyMTQ0CisJCWNhbGwgVCgicmV0dXJuIikKKwkJWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJdHJ5CisJCSAgICBYcGF0aCAxMDQ4NTc2CQkiIFg6IDEwNDg1NzYKKwkJICAgIGxldCBnOmp1bXAgPSAiZmluaXNoIgorCQkgICAgRXhlY0FzU2NyaXB0IFQKKwkJICAgIFhwYXRoIDIwOTcxNTIJCSIgWDogMAorCQlmaW5hbGx5CisJCSAgICB1bmxldCBnOmp1bXAKKwkJICAgIHRyeQorCQkJWHBhdGggNDE5NDMwNAkJIiBYOiA0MTk0MzA0CisJCQljYWxsIFQoImVycm9yIikKKwkJCVhwYXRoIDgzODg2MDgJCSIgWDogMAorCQkgICAgZmluYWxseQorCQkJdHJ5CisJCQkgICAgWHBhdGggMTY3NzcyMTYJIiBYOiAxNjc3NzIxNgorCQkJICAgIGNhbGwgVCgiaW50ZXJydXB0IikKKwkJCSAgICBYcGF0aCAzMzU1NDQzMgkiIFg6IDAKKwkJCWZpbmFsbHkKKwkJCSAgICB0cnkKKwkJCQlYcGF0aCA2NzEwODg2NAkiIFg6IDY3MTA4ODY0CisJCQkJY2FsbCBUKCJ0aHJvdyIpCisJCQkJWHBhdGggMTM0MjE3NzI4CSIgWDogMAorCQkJICAgIGZpbmFsbHkKKwkJCQlYcGF0aCAyNjg0MzU0NTYJIiBYOiAyNjg0MzU0NTYKKwkJCQlkZWxmdW5jdGlvbiBUCisJCQkgICAgZW5kdHJ5CisJCQllbmR0cnkKKwkJICAgIGVuZHRyeQorCQllbmR0cnkKKwkgICAgZW5kdHJ5CisJZW5kdHJ5CisgICAgZW5kdHJ5CisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogMAorCitlbmRpZgorCitYY2hlY2sgMzU3OTA4NDgwCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA0MTogIFNraXBwZWQgOnRocm93IGZpbmRpbmcgbmV4dCBjb21tYW5kCQkJCSAgICB7e3sxCisiCisiCSAgICBBIDp0aHJvdyBpbiBhbiBpbmFjdGl2ZSBjb25kaXRpb25hbCBtdXN0IG5vdCBoaWRlIGEgZm9sbG93aW5nCisiCSAgICBjb21tYW5kLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBGKCkKKyAgICBYcGF0aCAxCQkJCQkiIFg6IDEKKyAgICBpZiAwIHwgdGhyb3cgIm5ldmVyIiB8IGVuZGlmIHwgWHBhdGggMgkiIFg6IDIKKyAgICBYcGF0aCA0CQkJCQkiIFg6IDQKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBHKCkKKyAgICBYcGF0aCA4CQkJCQkgICAgIiBYOiA4CisgICAgd2hpbGUgMCB8IHRocm93ICJuZXZlciIgfCBlbmR3aGlsZSB8IFhwYXRoIDE2ICAgIiBYOiAxNgorICAgIFhwYXRoIDMyCQkJCQkgICAgIiBYOiAzMgorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24gSCgpCisgICAgWHBhdGggNjQJCQkJCQkgICAgIiBYOiA2NAorICAgIGlmIDAgfCB0cnkgfCB0aHJvdyAibmV2ZXIiIHwgZW5kdHJ5IHwgZW5kaWYgfCBYcGF0aCAxMjggIiBYOiAxMjgKKyAgICBYcGF0aCAyNTYJCQkJCQkgICAgIiBYOiAyNTYKK2VuZGZ1bmN0aW9uCisKK1hwYXRoIDUxMgkJCQkJIiBYOiA1MTIKKwordHJ5CisgICAgWHBhdGggMTAyNAkJCQkJIiBYOiAxMDI0CisgICAgY2FsbCBGKCkKKyAgICBYcGF0aCAyMDQ4CQkJCQkiIFg6IDIwNDgKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCA0MDk2CQkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworWHBhdGggODE5MgkJCQkJIiBYOiA4MTkyCisKK3RyeQorICAgIFhwYXRoIDE2Mzg0CQkJCQkiIFg6IDE2Mzg0CisgICAgY2FsbCBHKCkKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorY2F0Y2ggLy4qLworICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworWHBhdGggMTMxMDcyCQkJCQkiIFg6IDEzMTA3MgorCit0cnkKKyAgICBYcGF0aCAyNjIxNDQJCQkJIiBYOiAyNjIxNDQKKyAgICBjYWxsIEgoKQorICAgIFhwYXRoIDUyNDI4OAkJCQkiIFg6IDUyNDI4OAorY2F0Y2ggLy4qLworICAgIFhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CisKK1hwYXRoIDIwOTcxNTIJCQkJCSIgWDogMjA5NzE1MgorCitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBHCitkZWxmdW5jdGlvbiBICisKK1hjaGVjayAzMDc2MDk1CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA0MjogIENhdGNoaW5nIG51bWJlciBhbmQgc3RyaW5nIGV4Y2VwdGlvbnMJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIG51bWJlciBpcyB0aHJvd24sIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBleGNlcHRpb24uCisiCSAgICBOdW1iZXJzIGFuZCBzdHJpbmdzIG1heSBiZSBjYXVnaHQgYnkgc3BlY2lmeWluZyBhIHJlZ3VsYXIgZXhjZXB0aW9uCisiCSAgICBhcyBhcmd1bWVudCB0byB0aGUgOmNhdGNoIGNvbW1hbmQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKwordHJ5CisKKyAgICB0cnkKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl0aHJvdyA0NzExCisJWHBhdGggMgkJCQkJIiBYOiAwCisgICAgY2F0Y2ggLzQ3MTEvCisJWHBhdGggNAkJCQkJIiBYOiA0CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA4CQkJCQkiIFg6IDgKKwl0aHJvdyA0NzExCisJWHBhdGggMTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggL140NzExJC8KKwlYcGF0aCAzMgkJCQkiIFg6IDMyCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA2NAkJCQkiIFg6IDY0CisJdGhyb3cgNDcxMQorCVhwYXRoIDEyOAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXGQvCisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA1MTIJCQkJIiBYOiA1MTIKKwl0aHJvdyA0NzExCisJWHBhdGggMTAyNAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXlxkXCskLworCVhwYXRoIDIwNDgJCQkJIiBYOiAyMDQ4CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorCXRocm93ICJhcnJnaCIKKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorICAgIGNhdGNoIC9hcnJnaC8KKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDE2Mzg0CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisJdGhyb3cgImFycmdoIgorCVhwYXRoIDY1NTM2CQkJCSIgWDogMAorICAgIGNhdGNoIC9eYXJyZ2gkLworCVhwYXRoIDEzMTA3MgkJCQkiIFg6IDEzMTA3MgorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMjYyMTQ0CQkJCSIgWDogMjYyMTQ0CisJdGhyb3cgImFycmdoIgorCVhwYXRoIDUyNDI4OAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXGwvCisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDEwNDg1NzYKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDIwOTcxNTIJCQkJIiBYOiAyMDk3MTUyCisJdGhyb3cgImFycmdoIgorCVhwYXRoIDQxOTQzMDQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15cbFwrJC8KKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogODM4ODYwOAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJdHJ5CisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorCSAgICB0aHJvdyAiQVJSR0giCisJICAgIFhwYXRoIDMzNTU0NDMyCQkJIiBYOiAwCisJY2F0Y2ggL15hcnJnaCQvCisJICAgIFhwYXRoIDY3MTA4ODY0CQkJIiBYOiAwCisJZW5kdHJ5CisgICAgY2F0Y2ggL15cY2FycmdoJC8KKwlYcGF0aCAxMzQyMTc3MjgJCQkJIiBYOiAxMzQyMTc3MjgKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDI2ODQzNTQ1NgorCXRocm93ICIiCisJWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogMAorICAgIGNhdGNoIC9eJC8KKwlYcGF0aCAxMDczNzQxODI0CQkJIiBYOiAxMDczNzQxODI0CisgICAgZW5kdHJ5CisKK2NhdGNoIC8uKi8KKyAgICAiIFRoZSBYcGF0aCBjb21tYW5kIGRvZXMgbm90IGFjY2VwdCAyXjMxIChuZWdhdGl2ZSk7IGFkZCBleHBsaWNpdGx5OgorICAgIGxldCBYcGF0aCA9IFhwYXRoICsgMjE0NzQ4MzY0OAkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CisKK1hjaGVjayAxNTA1MTU1OTQ5CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA0MzogIFNlbGVjdGluZyB0aGUgY29ycmVjdCA6Y2F0Y2ggY2xhdXNlCQkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIHRoZXJlIGFyZSBtdWx0aXBsZSA6Y2F0Y2ggY2xhdXNlcywKKyIJICAgIHRoZSBmaXJzdCBtYXRjaGluZyBvbmUgaXMgdGFrZW4uCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworWGxvb3BJTklUIDEgMTAyNAorbGV0IGxvb3BzID0gMword2hpbGUgbG9vcHMgPiAwCisgICAgdHJ5CisJaWYgbG9vcHMgPT0gMworCSAgICBYbG9vcCAxCQkJCSIgWDogMQorCSAgICB0aHJvdyAiYSIKKwkgICAgWGxvb3AgMgkJCQkiIFg6IDAKKwllbHNlaWYgbG9vcHMgPT0gMgorCSAgICBYbG9vcCA0CQkJCSIgWDogNCoxMDI0CisJICAgIHRocm93ICJhYiIKKwkgICAgWGxvb3AgOAkJCQkiIFg6IDAKKwllbHNlaWYgbG9vcHMgPT0gMQorCSAgICBYbG9vcCAxNgkJCQkiIFg6IDE2KjEwMjQqMTAyNAorCSAgICB0aHJvdyAiYWJjIgorCSAgICBYbG9vcCAzMgkJCQkiIFg6IDAKKwllbmRpZgorICAgIGNhdGNoIC9hYmMvCisJWGxvb3AgNjQJCQkJIiBYOiA2NCoxMDI0KjEwMjQKKyAgICBjYXRjaCAvYWIvCisJWGxvb3AgMTI4CQkJCSIgWDogMTI4KjEwMjQKKyAgICBjYXRjaCAvLiovCisJWGxvb3AgMjU2CQkJCSIgWDogMjU2CisgICAgY2F0Y2ggL2EvCisJWGxvb3AgNTEyCQkJCSIgWDogMAorICAgIGVuZHRyeQorCisgICAgbGV0IGxvb3BzID0gbG9vcHMgLSAxCisgICAgWGxvb3BORVhUCitlbmR3aGlsZQorWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDEwNzM3NDE4MjQKKwordW5sZXQgbG9vcHMKKworWGNoZWNrIDExNTc3NjMzMjkKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDQ0OiAgTWlzc2luZyBvciBlbXB0eSA6Y2F0Y2ggcGF0dGVybnMJCQkJICAgIHt7ezEKKyIKKyIJICAgIEEgbWlzc2luZyBvciBlbXB0eSA6Y2F0Y2ggcGF0dGVybiBtZWFucyB0aGUgc2FtZSBhcyAvLiovLCB0aGF0IGlzLAorIgkgICAgY2F0Y2hlcyBldmVyeXRoaW5nLiAgVG8gY2F0Y2ggb25seSBlbXB0eSBleGNlcHRpb25zLCAvXiQvIG11c3QgYmUKKyIJICAgIHVzZWQuICBBIDpjYXRjaCB3aXRoIG1pc3NpbmcsIGVtcHR5LCBvciAvLiovIGFyZ3VtZW50IGFsc28gd29ya3MKKyIJICAgIHdoZW4gZm9sbG93ZWQgYnkgYW5vdGhlciBjb21tYW5kIHNlcGFyYXRlZCBieSBhIGJhciBvbiB0aGUgc2FtZQorIgkgICAgbGluZS4gIDpjYXRjaCBwYXR0ZXJucyBjYW5ub3QgYmUgc3BlY2lmaWVkIGJldHdlZW4gfHwuICBCdXQgb3RoZXIKKyIJICAgIHBhdHRlcm4gc2VwYXJhdG9ycyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIC8vLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK3RyeQorICAgIHRyeQorCVhwYXRoIDEJCQkJCSIgWDogMQorCXRocm93ICIiCisgICAgY2F0Y2ggL14kLworCVhwYXRoIDIJCQkJCSIgWDogMgorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggNAkJCQkJIiBYOiA0CisJdGhyb3cgIiIKKyAgICBjYXRjaCAvLiovCisJWHBhdGggOAkJCQkJIiBYOiA4CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCAxNgkJCQkiIFg6IDE2CisJdGhyb3cgIiIKKyAgICBjYXRjaCAvLworCVhwYXRoIDMyCQkJCSIgWDogMzIKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDY0CQkJCSIgWDogNjQKKwl0aHJvdyAiIgorICAgIGNhdGNoCisJWHBhdGggMTI4CQkJCSIgWDogMTI4CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwl0aHJvdyAib29wcyIKKyAgICBjYXRjaCAvXiQvCisJWHBhdGggNTEyCQkJCSIgWDogMAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAxMDI0CQkJCSIgWDogMTAyNAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwl0aHJvdyAiYXJyZ2giCisgICAgY2F0Y2ggL14kLworCVhwYXRoIDQwOTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggLy8KKwlYcGF0aCA4MTkyCQkJCSIgWDogODE5MgorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMTYzODQJCQkJIiBYOiAxNjM4NAorCXRocm93ICJicnJyIgorICAgIGNhdGNoIC9eJC8KKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKyAgICBjYXRjaAorCVhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKyAgICBlbmR0cnkKKworICAgIHRyeSB8IFhwYXRoIDEzMTA3MiB8IHRocm93ICJ4IiB8IGNhdGNoIC8uKi8gfCBYcGF0aCAyNjIxNDQgfCBlbmR0cnkKKwkJCQkJCSIgWDogMTMxMDcyICsgMjYyMTQ0CisKKyAgICB0cnkgfCBYcGF0aCA1MjQyODggfCB0aHJvdyAieSIgfCBjYXRjaCAvLyB8IFhwYXRoIDEwNDg1NzYgfCBlbmR0cnkKKwkJCQkJCSIgWDogNTI0Mjg4ICsgMTA0ODU3NgorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICAiIEV4dHJhIHRyeSBsZXZlbDogIGlmICI6Y2F0Y2giIHdpdGhvdXQgYXJndW1lbnRzIGJlbG93IHJhaXNlcworCSAgICAiIGEgc3ludGF4IGVycm9yIGJlY2F1c2UgaXQgbWlzaW50ZXJwcmV0cyB0aGUgIlhwYXRoIiBhcyBhIHBhdHRlcm4sCisJICAgICIgbGV0IGl0IGJlIGNhdWdodCBieSB0aGUgIjpjYXRjaCAvLiovIiBiZWxvdy4KKwkgICAgdHJ5CisJCXRyeSB8IFhwYXRoIDIwOTcxNTIgfCB0aHJvdyAieiIgfCBjYXRjaCB8IFhwYXRoIDQxOTQzMDQgfCA6CisJCWVuZHRyeQkJCQkiIFg6IDIwOTcxNTIgKyA0MTk0MzA0CisJICAgIGVuZHRyeQorCWNhdGNoIC8uKi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorCWZpbmFsbHkKKwkgICAgaWYgJFZJTU5PRVJSVEhST1cgJiYgdjplcnJtc2cgIT0gIiIKKwkJWG91dCB2OmVycm1zZworCSAgICBlbmRpZgorCSAgICBpZiBjYXVnaHQgfHwgJFZJTU5PRVJSVEhST1cgJiYgdjplcnJtc2cgIT0gIiIKKwkJWHBhdGggODM4ODYwOAkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgbGV0IGNvbG9nbmUgPSA0NzExCisgICAgdHJ5CisJdHJ5CisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorCSAgICB0aHJvdyAidGhyb3cgY29sb2duZSIKKwkiIE5leHQgbGluZXMgY2F0Y2hlcyBhbGwgYW5kIHRocm93cyA0NzExOgorCWNhdGNoIHx0aHJvdyBjb2xvZ25lfAorCSAgICBYcGF0aCAzMzU1NDQzMgkJCSIgWDogMAorCWVuZHRyeQorICAgIGNhdGNoIC80NzExLworCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCXRocm93ICJwbHVzIgorICAgIGNhdGNoICtwbHVzKworCVhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDI2ODQzNTQ1NgorICAgIGVuZHRyeQorCisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogNTM2ODcwOTEyCitjYXRjaCAvLiovCisgICAgWHBhdGggMTA3Mzc0MTgyNAkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKwordW5sZXQhIGNhdWdodCBjb2xvZ25lCisKK1hjaGVjayAxMDMxNzYxNDA3CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA0NTogIENhdGNoaW5nIGV4Y2VwdGlvbnMgZnJvbSBuZXN0ZWQgOnRyeSBibG9ja3MJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiA6dHJ5IGJsb2NrcyBhcmUgbmVzdGVkLCBhbiBleGNlcHRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBpbm5lcm1vc3QKKyIJICAgIHRyeSBjb25kaXRpb25hbCB0aGF0IGhhcyBhIG1hdGNoaW5nIDpjYXRjaCBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworWGxvb3BJTklUIDEgMTAyNAorbGV0IGxvb3BzID0gMword2hpbGUgbG9vcHMgPiAwCisgICAgdHJ5CisJdHJ5CisJICAgIHRyeQorCQl0cnkKKwkJICAgIGlmIGxvb3BzID09IDMKKwkJCVhsb29wIDEJCQkiIFg6IDEKKwkJCXRocm93ICJhIgorCQkJWGxvb3AgMgkJCSIgWDogMAorCQkgICAgZWxzZWlmIGxvb3BzID09IDIKKwkJCVhsb29wIDQJCQkiIFg6IDQqMTAyNAorCQkJdGhyb3cgImFiIgorCQkJWGxvb3AgOAkJCSIgWDogMAorCQkgICAgZWxzZWlmIGxvb3BzID09IDEKKwkJCVhsb29wIDE2CQkiIFg6IDE2KjEwMjQqMTAyNAorCQkJdGhyb3cgImFiYyIKKwkJCVhsb29wIDMyCQkiIFg6IDAKKwkJICAgIGVuZGlmCisJCWNhdGNoIC9hYmMvCisJCSAgICBYbG9vcCA2NAkJCSIgWDogNjQqMTAyNCoxMDI0CisJCWVuZHRyeQorCSAgICBjYXRjaCAvYWIvCisJCVhsb29wIDEyOAkJCSIgWDogMTI4KjEwMjQKKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYbG9vcCAyNTYJCQkJIiBYOiAyNTYKKwllbmR0cnkKKyAgICBjYXRjaCAvYS8KKwlYbG9vcCA1MTIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICBsZXQgbG9vcHMgPSBsb29wcyAtIDEKKyAgICBYbG9vcE5FWFQKK2VuZHdoaWxlCitYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCit1bmxldCBsb29wcworCitYY2hlY2sgMTE1Nzc2MzMyOQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNDY6ICBFeGVjdXRpbmcgOmZpbmFsbHkgYWZ0ZXIgYSA6dGhyb3cgaW4gbmVzdGVkIDp0cnkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB3aXRoaW4gbmVzdGVkIDp0cnkgYmxvY2tzLCB0aGUKKyIJICAgIDpmaW5hbGx5IGNsYXVzZXMgb2YgdGhlIG5vbi1jYXRjaGluZyB0cnkgY29uZGl0aW9uYWxzIHNob3VsZCBiZQorIgkgICAgZXhlY3V0ZWQgYmVmb3JlIHRoZSBtYXRjaGluZyA6Y2F0Y2ggb2YgdGhlIG5leHQgc3Vycm91bmRpbmcgOnRyeQorIgkgICAgZ2V0cyB0aGUgY29udHJvbC4gIElmIHRoaXMgYWxzbyBoYXMgYSA6ZmluYWxseSBjbGF1c2UsIGl0IGlzCisiCSAgICBleGVjdXRlZCBhZnRlcndhcmRzLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCBzdW0gPSAwCisKK3RyeQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorICAgIHRyeQorCVhwYXRoIDIJCQkJCSIgWDogMgorCXRyeQorCSAgICBYcGF0aCA0CQkJCSIgWDogNAorCSAgICB0cnkKKwkJWHBhdGggOAkJCQkiIFg6IDgKKwkJdGhyb3cgIkFCQyIKKwkJWHBhdGggMTYJCQkiIFg6IDAKKwkgICAgY2F0Y2ggL3h5ei8KKwkJWHBhdGggMzIJCQkiIFg6IDAKKwkgICAgZmluYWxseQorCQlYcGF0aCA2NAkJCSIgWDogNjQKKwkJaWYgc3VtICE9IDAKKwkJICAgIFhwYXRoIDEyOAkJCSIgWDogMAorCQllbmRpZgorCQlsZXQgc3VtID0gc3VtICsgMQorCSAgICBlbmR0cnkKKwkgICAgWHBhdGggMjU2CQkJCSIgWDogMAorCWNhdGNoIC8xMjMvCisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDAKKwljYXRjaCAvMzIxLworCSAgICBYcGF0aCAxMDI0CQkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwkgICAgaWYgc3VtICE9IDEKKwkJWHBhdGggNDA5NgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBsZXQgc3VtID0gc3VtICsgMgorCWVuZHRyeQorCVhwYXRoIDgxOTIJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwlpZiBzdW0gIT0gMworCSAgICBYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKwllbmRpZgorCWxldCBzdW0gPSBzdW0gKyA0CisgICAgZW5kdHJ5CisgICAgWHBhdGggNjU1MzYJCQkJCSIgWDogMAorY2F0Y2ggL0FCQy8KKyAgICBYcGF0aCAxMzEwNzIJCQkJIiBYOiAxMzEwNzIKKyAgICBpZiBzdW0gIT0gNworCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIGxldCBzdW0gPSBzdW0gKyA4CitmaW5hbGx5CisgICAgWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CisgICAgaWYgc3VtICE9IDE1CisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIGxldCBzdW0gPSBzdW0gKyAxNgorZW5kdHJ5CitYcGF0aCA2NTUzNgkJCQkJIiBYOiA2NTUzNgoraWYgc3VtICE9IDMxCisgICAgWHBhdGggMTMxMDcyCQkJCSIgWDogMAorZW5kaWYKKwordW5sZXQgc3VtCisKK1hjaGVjayA3Mzk0MDcKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDQ3OiAgVGhyb3dpbmcgZXhjZXB0aW9ucyBmcm9tIGEgOmNhdGNoIGNsYXVzZQkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBhIDpjYXRjaCBjbGF1c2UsIGl0IHNob3VsZCBub3QgYmUKKyIJICAgIGNhdWdodCBieSBhIDpjYXRjaCBvZiB0aGUgc2FtZSA6dHJ5IGNvbmRpdGlvbmFsLiAgQWZ0ZXIgZXhlY3V0aW5nCisiCSAgICB0aGUgOmZpbmFsbHkgY2xhdXNlIChpZiBwcmVzZW50KSwgc3Vycm91bmRpbmcgdHJ5IGNvbmRpdGlvbmFscworIgkgICAgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGEgbWF0Y2hpbmcgOmNhdGNoLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK1hwYXRoIDEJCQkJCQkiIFg6IDEKK3RyeQorICAgIFhwYXRoIDIJCQkJCSIgWDogMgorICAgIHRyeQorCVhwYXRoIDQJCQkJCSIgWDogNAorCXRyeQorCSAgICBYcGF0aCA4CQkJCSIgWDogOAorCSAgICB0aHJvdyAieDEiCisJICAgIFhwYXRoIDE2CQkJCSIgWDogMAorCWNhdGNoIC94MS8KKwkgICAgWHBhdGggMzIJCQkJIiBYOiAzMgorCSAgICB0cnkKKwkJWHBhdGggNjQJCQkiIFg6IDY0CisJCXRocm93ICJ4MiIKKwkJWHBhdGggMTI4CQkJIiBYOiAwCisJICAgIGNhdGNoIC94MS8KKwkJWHBhdGggMjU2CQkJIiBYOiAwCisJICAgIGNhdGNoIC94Mi8KKwkJWHBhdGggNTEyCQkJIiBYOiA1MTIKKwkJdHJ5CisJCSAgICBYcGF0aCAxMDI0CQkJIiBYOiAxMDI0CisJCSAgICB0aHJvdyAieDMiCisJCSAgICBYcGF0aCAyMDQ4CQkJIiBYOiAwCisJCWNhdGNoIC94MS8KKwkJICAgIFhwYXRoIDQwOTYJCQkiIFg6IDAKKwkJY2F0Y2ggL3gyLworCQkgICAgWHBhdGggODE5MgkJCSIgWDogMAorCQlmaW5hbGx5CisJCSAgICBYcGF0aCAxNjM4NAkJCSIgWDogMTYzODQKKwkJZW5kdHJ5CisJCVhwYXRoIDMyNzY4CQkJIiBYOiAwCisJICAgIGNhdGNoIC94My8KKwkJWHBhdGggNjU1MzYJCQkiIFg6IDAKKwkgICAgZW5kdHJ5CisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMAorCWNhdGNoIC94MS8KKwkgICAgWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJY2F0Y2ggL3gyLworCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDAKKwljYXRjaCAveDMvCisJICAgIFhwYXRoIDEwNDg1NzYJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDIwOTcxNTIJCQkiIFg6IDIwOTcxNTIKKwllbmR0cnkKKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorICAgIGNhdGNoIC94MS8KKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogMAorICAgIGNhdGNoIC94Mi8KKwlYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDAKKyAgICBjYXRjaCAveDMvCisJWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAzMzU1NDQzMgorICAgIGVuZHRyeQorICAgIFhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAxMzQyMTc3MjgJCQkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CitYcGF0aCAyNjg0MzU0NTYJCQkJCSIgWDogMjY4NDM1NDU2CisKK1hjaGVjayAzNzEyMTM5MzUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDQ4OiAgVGhyb3dpbmcgZXhjZXB0aW9ucyBmcm9tIGEgOmZpbmFsbHkgY2xhdXNlCQkJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGEgOmZpbmFsbHkgY2xhdXNlLCBpdCBzaG91bGQgbm90IGJlCisiCSAgICBjYXVnaHQgYnkgYSA6Y2F0Y2ggb2YgdGhlIHNhbWUgOnRyeSBjb25kaXRpb25hbC4gIFN1cnJvdW5kaW5nIHRyeQorIgkgICAgY29uZGl0aW9uYWxzIHNob3VsZCBiZSBjaGVja2VkIGZvciBhIG1hdGNoaW5nIDpjYXRjaC4gIEEgcHJldmlvdXNseQorIgkgICAgdGhyb3duIGV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKwordHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggMQkJCQkiIFg6IDEKKwljYXRjaCAveDEvCisJICAgIFhwYXRoIDIJCQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCA0CQkJCSIgWDogNAorCSAgICB0aHJvdyAieDEiCisJICAgIFhwYXRoIDgJCQkJIiBYOiAwCisJZW5kdHJ5CisJWHBhdGggMTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggL3gxLworCVhwYXRoIDMyCQkJCSIgWDogMzIKKyAgICBlbmR0cnkKKyAgICBYcGF0aCA2NAkJCQkJIiBYOiA2NAorCisgICAgdHJ5CisJdHJ5CisJICAgIFhwYXRoIDEyOAkJCQkiIFg6IDEyOAorCSAgICB0aHJvdyAieDIiCisJICAgIFhwYXRoIDI1NgkJCQkiIFg6IDAKKwljYXRjaCAveDIvCisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDUxMgorCWNhdGNoIC94My8KKwkgICAgWHBhdGggMTAyNAkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDIwNDgJCQkJIiBYOiAyMDQ4CisJICAgIHRocm93ICJ4MyIKKwkgICAgWHBhdGggNDA5NgkJCQkiIFg6IDAKKwllbmR0cnkKKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorICAgIGNhdGNoIC94Mi8KKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDAKKyAgICBjYXRjaCAveDMvCisJWHBhdGggMzI3NjgJCQkJIiBYOiAzMjc2OAorICAgIGVuZHRyeQorICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDY1NTM2CisKKyAgICB0cnkKKwl0cnkKKwkgICAgdHJ5CisJCVhwYXRoIDEzMTA3MgkJCSIgWDogMTMxMDcyCisJCXRocm93ICJ4NCIKKwkJWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJICAgIGNhdGNoIC94NS8KKwkJWHBhdGggNTI0Mjg4CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMTA0ODU3NgkJCSIgWDogMTA0ODU3NgorCQl0aHJvdyAieDUiCSIgZGlzY2FyZHMgIng0IgorCQlYcGF0aCAyMDk3MTUyCQkJIiBYOiAwCisJICAgIGVuZHRyeQorCSAgICBYcGF0aCA0MTk0MzA0CQkJIiBYOiAwCisJY2F0Y2ggL3g0LworCSAgICBYcGF0aCA4Mzg4NjA4CQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAxNjc3NzIxNgkJCSIgWDogMTY3NzcyMTYKKwllbmR0cnkKKwlYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDAKKyAgICBjYXRjaCAveDUvCisJWHBhdGggNjcxMDg4NjQJCQkJIiBYOiA2NzEwODg2NAorICAgIGVuZHRyeQorICAgIFhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCitjYXRjaCAvLiovCisgICAgWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2VuZHRyeQorWHBhdGggNTM2ODcwOTEyCQkJCQkiIFg6IDUzNjg3MDkxMgorCitYY2hlY2sgNzU2MjU1NDYxCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA0OTogIFRocm93aW5nIGV4Y2VwdGlvbnMgYWNjcm9zcyBmdW5jdGlvbnMJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGJ1dCBub3QgY2F1Z2h0IGluc2lkZSBhIGZ1bmN0aW9uLCB0aGUKKyIJICAgIGNhbGxlciBpcyBjaGVja2VkIGZvciBhIG1hdGNoaW5nIDpjYXRjaCBjbGF1c2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIEMoKQorICAgIHRyeQorCVhwYXRoIDEJCQkJCSIgWDogMQorCXRocm93ICJhcnJnaCIKKwlYcGF0aCAyCQkJCQkiIFg6IDAKKyAgICBjYXRjaCAvYXJyZ2gvCisJWHBhdGggNAkJCQkJIiBYOiA0CisgICAgZW5kdHJ5CisgICAgWHBhdGggOAkJCQkJIiBYOiA4CitlbmRmdW5jdGlvbgorCitYbG9vcElOSVQhIDE2IDE2CisKK2Z1bmN0aW9uISBUMSgpCisgICAgWGxvb3BORVhUCisgICAgdHJ5CisJWGxvb3AgMQkJCQkJIiBYOiAxNiArIDE2KjE2CisJdGhyb3cgImFycmdoIgorCVhsb29wIDIJCQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYbG9vcCA0CQkJCQkiIFg6IDY0ICsgNjQqMTYKKyAgICBlbmR0cnkKKyAgICBYbG9vcCA4CQkJCQkiIFg6IDAKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBUMigpCisgICAgdHJ5CisJWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKwljYWxsIFQxKCkKKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDE2Mzg0CisgICAgZW5kdHJ5CisgICAgWHBhdGggMzI3NjgJCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKwordHJ5CisgICAgWHBhdGggNjU1MzYJCQkJCSIgWDogNjU1MzYKKyAgICBjYWxsIEMoKQkiIHRocm93IGFuZCBjYXRjaAorICAgIFhwYXRoIDEzMTA3MgkJCQkiIFg6IDEzMTA3MgorY2F0Y2ggLy4qLworICAgIFhwYXRoIDI2MjE0NAkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKwordHJ5CisgICAgWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CisgICAgY2FsbCBUMSgpICAiIHRocm93LCBvbmUgbGV2ZWwKKyAgICBYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorY2F0Y2ggL2FycmdoLworICAgIFhwYXRoIDIwOTcxNTIJCQkJIiBYOiAyMDk3MTUyCitjYXRjaCAvLiovCisgICAgWHBhdGggNDE5NDMwNAkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKwordHJ5CisgICAgWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKyAgICBjYWxsIFQyKCkJIiB0aHJvdywgdHdvIGxldmVscworICAgIFhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorY2F0Y2ggL2FycmdoLworICAgIFhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMzM1NTQ0MzIKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCA2NzEwODg2NAkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKK1hwYXRoIDEzNDIxNzcyOAkJCQkJIiBYOiAxMzQyMTc3MjgKKworWGNoZWNrIDE3OTAwMDY2OQorCisiIExlYXZlIEMsIFQxLCBhbmQgVDIgZm9yIGV4ZWN1dGlvbiBhcyBzY3JpcHRzIGluIHRoZSBuZXh0IHRlc3QuCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA1MDogIFRocm93aW5nIGV4Y2VwdGlvbnMgYWNjcm9zcyBzY3JpcHQgZmlsZXMJCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGJ1dCBub3QgY2F1Z2h0IGluc2lkZSBhIHNjcmlwdCBmaWxlLAorIgkgICAgdGhlIHNvdXJjaW5nIHNjcmlwdCBvciBmdW5jdGlvbiBpcyBjaGVja2VkIGZvciBhIG1hdGNoaW5nIDpjYXRjaAorIgkgICAgY2xhdXNlLgorIgorIgkgICAgVGhpcyB0ZXN0IGV4ZWN1dGVzIHRoZSBib2RpZXMgb2YgdGhlIGZ1bmN0aW9ucyBDLCBUMSwgYW5kIFQyIGZyb20KKyIJICAgIHRoZSBwcmV2aW91cyB0ZXN0IGFzIHNjcmlwdCBmaWxlcyAoOnJldHVybiByZXBsYWNlZCBieSA6ZmluaXNoKS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitsZXQgc2NyaXB0QyA9IE1ha2VTY3JpcHQoIkMiKQkJCSIgWDogMSArIDQgKyA4CitkZWxmdW5jdGlvbiBDCisKK1hsb29wSU5JVCEgMTYgMTYKKworbGV0IHNjcmlwdFQxID0gTWFrZVNjcmlwdCgiVDEiKQkJCSIgWDogMTYgKyA2NCArIDE2KjE2ICsgNjQqMTYKK2RlbGZ1bmN0aW9uIFQxCisKK2xldCBzY3JpcHRUMiA9IE1ha2VTY3JpcHQoIlQyIiwgc2NyaXB0VDEpCSIgWDogNDA5NiArIDE2Mzg0CitkZWxmdW5jdGlvbiBUMgorCitmdW5jdGlvbiEgRigpCisgICAgdHJ5CisJWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCWV4ZWMgInNvdXJjZSIgZzpzY3JpcHRDCisJWHBhdGggMTMxMDcyCQkJCSIgWDogMTMxMDcyCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA1MjQyODgJCQkJIiBYOiA1MjQyODgKKwlleGVjICJzb3VyY2UiIGc6c2NyaXB0VDEKKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorICAgIGNhdGNoIC9hcnJnaC8KKwlYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKK2VuZGZ1bmN0aW9uCisKK3RyeQorICAgIFhwYXRoIDgzODg2MDgJCQkJIiBYOiA4Mzg4NjA4CisgICAgY2FsbCBGKCkKKyAgICBYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDE2Nzc3MjE2CisgICAgZXhlYyAic291cmNlIiBzY3JpcHRUMgorICAgIFhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMAorY2F0Y2ggL2FycmdoLworICAgIFhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAxMzQyMTc3MjgJCQkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CitYcGF0aCAyNjg0MzU0NTYJCQkJCSIgWDogMjY4NDM1NDU2CisKK2NhbGwgZGVsZXRlKHNjcmlwdEMpCitjYWxsIGRlbGV0ZShzY3JpcHRUMSkKK2NhbGwgZGVsZXRlKHNjcmlwdFQyKQordW5sZXQgc2NyaXB0QyBzY3JpcHRUMSBzY3JpcHRUMgorZGVsZnVuY3Rpb24gRgorCitYY2hlY2sgMzYzNTUwMDQ1CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA1MTogIFRocm93aW5nIGV4Y2VwdGlvbnMgYWNjcm9zcyA6ZXhlY3V0ZSBhbmQgdXNlciBjb21tYW5kcwkgICAge3t7MQorIgorIgkgICAgQSA6dGhyb3cgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQgdW5kZXIgYW4gIjpleGVjdXRlIiBvciBmcm9tCisiCSAgICBhIHVzZXIgY29tbWFuZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitjb21tYW5kISAtbmFyZ3M9PyBUSFJPVzEgICAgdGhyb3cgPGFyZ3M+IHwgdGhyb3cgMQorY29tbWFuZCEgLW5hcmdzPT8gVEhST1cyICAgIHRyeSB8IHRocm93IDxhcmdzPiB8IGVuZHRyeSB8IHRocm93IDIKK2NvbW1hbmQhIC1uYXJncz0/IFRIUk9XMyAgICB0cnkgfCB0aHJvdyAzIHwgY2F0Y2ggLzMvIHwgdGhyb3cgPGFyZ3M+IHwgZW5kdHJ5Citjb21tYW5kISAtbmFyZ3M9PyBUSFJPVzQgICAgdHJ5IHwgdGhyb3cgNCB8IGZpbmFsbHkgICB8IHRocm93IDxhcmdzPiB8IGVuZHRyeQorCit0cnkKKworICAgIHRyeQorCXRyeQorCSAgICBYcGF0aCAxCQkJCSIgWDogMQorCSAgICBUSFJPVzEgIkEiCisJY2F0Y2ggL0EvCisJICAgIFhwYXRoIDIJCQkJIiBYOiAyCisJZW5kdHJ5CisgICAgY2F0Y2ggLzEvCisJWHBhdGggNAkJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggOAkJCQkiIFg6IDgKKwkgICAgVEhST1cyICJCIgorCWNhdGNoIC9CLworCSAgICBYcGF0aCAxNgkJCQkiIFg6IDE2CisJZW5kdHJ5CisgICAgY2F0Y2ggLzIvCisJWHBhdGggMzIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggNjQJCQkJIiBYOiA2NAorCSAgICBUSFJPVzMgIkMiCisJY2F0Y2ggL0MvCisJICAgIFhwYXRoIDEyOAkJCQkiIFg6IDEyOAorCWVuZHRyeQorICAgIGNhdGNoIC8zLworCVhwYXRoIDI1NgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKworICAgIHRyeQorCXRyeQorCSAgICBYcGF0aCA1MTIJCQkJIiBYOiA1MTIKKwkgICAgVEhST1c0ICJEIgorCWNhdGNoIC9ELworCSAgICBYcGF0aCAxMDI0CQkJCSIgWDogMTAyNAorCWVuZHRyeQorICAgIGNhdGNoIC80LworCVhwYXRoIDIwNDgJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKwkgICAgZXhlY3V0ZSAndGhyb3cgIkUiIHwgdGhyb3cgNScKKwljYXRjaCAvRS8KKwkgICAgWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwllbmR0cnkKKyAgICBjYXRjaCAvNS8KKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKworICAgIHRyeQorCXRyeQorCSAgICBYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisJICAgIGV4ZWN1dGUgJ3RyeSB8IHRocm93ICJGIiB8IGVuZHRyeSB8IHRocm93IDYnCisJY2F0Y2ggL0YvCisJICAgIFhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwllbmR0cnkKKyAgICBjYXRjaCAvNi8KKwlYcGF0aCAxMzEwNzIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggMjYyMTQ0CQkJIiBYOiAyNjIxNDQKKwkgICAgZXhlY3V0ZSd0cnkgfCB0aHJvdyA3IHwgY2F0Y2ggLzcvIHwgdGhyb3cgIkciIHwgZW5kdHJ5JworCWNhdGNoIC9HLworCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDUyNDI4OAorCWVuZHRyeQorICAgIGNhdGNoIC83LworCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggMjA5NzE1MgkJCSIgWDogMjA5NzE1MgorCSAgICBleGVjdXRlICd0cnkgfCB0aHJvdyA4IHwgZmluYWxseSAgIHwgdGhyb3cgIkgiIHwgZW5kdHJ5JworCWNhdGNoIC9ILworCSAgICBYcGF0aCA0MTk0MzA0CQkJIiBYOiA0MTk0MzA0CisJZW5kdHJ5CisgICAgY2F0Y2ggLzgvCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKworY2F0Y2ggLy4qLworICAgIFhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2VuZHRyeQorCitYcGF0aCAzMzU1NDQzMgkJCQkJIiBYOiAzMzU1NDQzMgorCitkZWxjb21tYW5kIFRIUk9XMQorZGVsY29tbWFuZCBUSFJPVzIKK2RlbGNvbW1hbmQgVEhST1czCitkZWxjb21tYW5kIFRIUk9XNAorCitYY2hlY2sgNDA3NDQ2NjcKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDUyOiAgVW5jYXVnaHQgZXhjZXB0aW9ucwkJCQkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnV0IG5vdCBjYXVnaHQsIGFuIGVycm9yIG1lc3NhZ2UgaXMKKyIJICAgIGRpc3BsYXllZCB3aGVuIHRoZSBzY3JpcHQgaXMgdGVybWluYXRlZC4gIEluIGNhc2Ugb2YgYW4gaW50ZXJydXB0CisiCSAgICBvciBlcnJvciBleGNlcHRpb24sIHRoZSBub3JtYWwgaW50ZXJydXB0IG9yIGVycm9yIG1lc3NhZ2UocykgYXJlCisiCSAgICBkaXNwbGF5ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworbGV0IG1zZ2ZpbGUgPSB0ZW1wbmFtZSgpCisKK2Z1bmN0aW9uISBNRVNTQUdFUyguLi4pCisgICAgdHJ5CisJZXhlYyAiZWRpdCIgZzptc2dmaWxlCisgICAgY2F0Y2ggL15WaW0oZWRpdCk6LworCXJldHVybiAwCisgICAgZW5kdHJ5CisKKyAgICBsZXQgZW5nbGlzaCA9IHY6bGFuZyA9PSAiQyIgfHwgdjpsYW5nID1+ICdeW0VlXW4nCisgICAgbGV0IG1hdGNoID0gMQorICAgIG5vcm0gZ2cKKworICAgIGxldCBudW0gPSBhOjAgLyAyCisgICAgbGV0IGNudCA9IDEKKyAgICB3aGlsZSBjbnQgPD0gbnVtCisJbGV0IGVuciA9IGE6ezIqY250IC0gMX0KKwlsZXQgZW1zZz0gYTp7MipjbnR9CisJbGV0IGNudCA9IGNudCArIDEKKworCWlmIGVuciA9PSAiIgorCSAgICBYb3V0ICJUT0RPOiBBZGQgbWVzc2FnZSBudW1iZXIgZm9yOiIgZW1zZworCWVsc2VpZiBlbnIgPT0gIklOVCIKKwkgICAgbGV0IGVuciA9ICIiCisJZW5kaWYKKwlpZiBlbnIgPT0gIiIgJiYgIWVuZ2xpc2gKKwkgICAgY29udGludWUKKwllbmRpZgorCWxldCBwYXR0ZXJuID0gKGVuciAhPSAiIikgPyBlbnIgLiAnOi4qJyA6ICcnCisJaWYgZW5nbGlzaAorCSAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm4gLiBlbXNnCisJZW5kaWYKKwlpZiAhc2VhcmNoKHBhdHRlcm4sICJXIikKKwkgICAgbGV0IG1hdGNoID0gMAorCSAgICBYb3V0ICJObyBtYXRjaCBmb3I6IiBwYXR0ZXJuCisJZW5kaWYKKwlub3JtICQKKyAgICBlbmR3aGlsZQorCisgICAgYndpcGVvdXQhCisgICAgcmV0dXJuIG1hdGNoCitlbmRmdW5jdGlvbgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorICAgIHRocm93ICJhcnJnaCIKK2VuZGlmCisKK1hwYXRoIDIJCQkJCQkiIFg6IDIKK2lmICFNRVNTQUdFUygnRTYwNScsICJFeGNlcHRpb24gbm90IGNhdWdodCIpCisgICAgWHBhdGggNAkJCQkJIiBYOiAwCitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorICAgIHRyeQorCVhwYXRoIDgJCQkJCSIgWDogOAorCXRocm93ICJvb3BzIgorICAgIGNhdGNoIC9hcnJnaC8KKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAwCitlbmRpZgorCitYcGF0aCA2NAkJCQkJIiBYOiA2NAoraWYgIU1FU1NBR0VTKCdFNjA1JywgIkV4Y2VwdGlvbiBub3QgY2F1Z2h0IikKKyAgICBYcGF0aCAxMjgJCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyAgICBmdW5jdGlvbiEgVCgpCisJdGhyb3cgImJycnIiCisgICAgZW5kZnVuY3Rpb24KKworICAgIHRyeQorCVhwYXRoIDI1NgkJCQkiIFg6IDI1NgorCXRocm93ICJhcnJnaCIKKyAgICBjYXRjaCAvLiovCisJWHBhdGggNTEyCQkJCSIgWDogNTEyCisJY2FsbCBUKCkKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAxMDI0CQkJCQkiIFg6IDAKK2VuZGlmCisKK1hwYXRoIDIwNDgJCQkJCSIgWDogMjA0OAoraWYgIU1FU1NBR0VTKCdFNjA1JywgIkV4Y2VwdGlvbiBub3QgY2F1Z2h0IikKKyAgICBYcGF0aCA0MDk2CQkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisgICAgdHJ5CisJWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwl0aHJvdyAiYXJyZ2giCisgICAgZmluYWxseQorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwl0aHJvdyAiYnJyciIKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAwCitlbmRpZgorCitYcGF0aCA2NTUzNgkJCQkJIiBYOiA2NTUzNgoraWYgIU1FU1NBR0VTKCdFNjA1JywgIkV4Y2VwdGlvbiBub3QgY2F1Z2h0IikKKyAgICBYcGF0aCAxMzEwNzIJCQkJIiBYOiAwCitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorICAgIHRyeQorCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDI2MjE0NAorCSJJTlRFUlJVUFQKKyAgICBlbmR0cnkKKyAgICBYcGF0aCA1MjQyODgJCQkJIiBYOiAwCitlbmRpZgorCitYcGF0aCAxMDQ4NTc2CQkJCQkiIFg6IDEwNDg1NzYKK2lmICFNRVNTQUdFUygnSU5UJywgIkludGVycnVwdGVkIikKKyAgICBYcGF0aCAyMDk3MTUyCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyAgICB0cnkKKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogNDE5NDMwNAorCWxldCB4ID0gbm92YXIJIiBlcnJvciBFMTIxL0UxNTsgZXhjZXB0aW9uOiBFMTIxCisgICAgY2F0Y2ggL0UxNTovCSIgc2hvdWxkIG5vdCBjYXRjaAorCVhwYXRoIDgzODg2MDgJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAwCitlbmRpZgorCitYcGF0aCAzMzU1NDQzMgkJCQkJIiBYOiAzMzU1NDQzMgoraWYgIU1FU1NBR0VTKCdFMTIxJywgIlVuZGVmaW5lZCB2YXJpYWJsZSIsICdFMTUnLCAiSW52YWxpZCBleHByZXNzaW9uIikKKyAgICBYcGF0aCA2NzEwODg2NAkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisgICAgdHJ5CisJWHBhdGggMTM0MjE3NzI4CQkJCSIgWDogMTM0MjE3NzI4CisiCXVubGV0IG5vdmFyICMJIiBlcnJvciBFMTA4L0U0ODg7IGV4Y2VwdGlvbjogRTQ4OAorICAgIGNhdGNoIC9FMTA4Oi8JIiBzaG91bGQgbm90IGNhdGNoCisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKK2VuZGlmCisKK1hwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAxMDczNzQxODI0CitpZiAhTUVTU0FHRVMoJ0UxMDgnLCAiTm8gc3VjaCB2YXJpYWJsZSIsICdFNDg4JywgIlRyYWlsaW5nIGNoYXJhY3RlcnMiKQorICAgICIgVGhlIFhwYXRoIGNvbW1hbmQgZG9lcyBub3QgYWNjZXB0IDJeMzEgKG5lZ2F0aXZlKTsgYWRkIGV4cGxpY2l0bHk6CisgICAgbGV0IFhwYXRoID0gWHBhdGggKyAyMTQ3NDgzNjQ4CQkiIFg6IDAKK2VuZGlmCisKK2NhbGwgZGVsZXRlKG1zZ2ZpbGUpCit1bmxldCBtc2dmaWxlCisKK1hjaGVjayAxMjQ3MTEyMDExCisKKyIgTGVhdmUgTUVTU0FHRVMoKSBmb3IgdGhlIG5leHQgdGVzdHMuCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA1MzogIE5lc3RpbmcgZXJyb3JzOiA6ZW5kaWYvOmVsc2UvOmVsc2VpZgkJCSAgICB7e3sxCisiCisiCSAgICBGb3IgbmVzdGluZyBlcnJvcnMgb2YgOmlmIGNvbmRpdGlvbmFscyB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlcworIgkgICAgc2hvdWxkIGJlIGdpdmVuLgorIgorIgkgICAgVGhpcyB0ZXN0IHJldXNlcyB0aGUgZnVuY3Rpb24gTUVTU0FHRVMoKSBmcm9tIHRoZSBwcmV2aW91cyB0ZXN0LgorIgkgICAgVGhpcyBmdW5jdGlvbnMgY2hlY2tzIHRoZSBtZXNzYWdlcyBpbiBnOm1zZ2ZpbGUuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworbGV0IG1zZ2ZpbGUgPSB0ZW1wbmFtZSgpCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgZW5kaWYKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4MCcsICI6ZW5kaWYgd2l0aG91dCA6aWYiKQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIGVuZGlmCisiICAgZW5kd2hpbGUKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4MCcsICI6ZW5kaWYgd2l0aG91dCA6aWYiKQorICAgIFhwYXRoIDIJCQkJCSIgWDogMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB0cnkKKyIgICBmaW5hbGx5CisiICAgICAgIGVuZGlmCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODAnLCAiOmVuZGlmIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCA0CQkJCQkiIFg6IDQKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIGVuZGlmCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODAnLCAiOmVuZGlmIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCA4CQkJCQkiIFg6IDgKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIHRocm93ICJhIgorIiAgIGNhdGNoIC9hLworIiAgICAgICBlbmRpZgorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgwJywgIjplbmRpZiB3aXRob3V0IDppZiIpCisgICAgWHBhdGggMTYJCQkJCSIgWDogMTYKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgZWxzZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgxJywgIjplbHNlIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAzMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIGVsc2UKKyIgICBlbmR3aGlsZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgxJywgIjplbHNlIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCA2NAkJCQkJIiBYOiA2NAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB0cnkKKyIgICBmaW5hbGx5CisiICAgICAgIGVsc2UKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4MScsICI6ZWxzZSB3aXRob3V0IDppZiIpCisgICAgWHBhdGggMTI4CQkJCQkiIFg6IDEyOAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB0cnkKKyIgICAgICAgZWxzZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgxJywgIjplbHNlIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCAyNTYJCQkJCSIgWDogMjU2CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICB0aHJvdyAiYSIKKyIgICBjYXRjaCAvYS8KKyIgICAgICAgZWxzZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgxJywgIjplbHNlIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCA1MTIJCQkJCSIgWDogNTEyCitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIGVsc2VpZgorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgyJywgIjplbHNlaWYgd2l0aG91dCA6aWYiKQorICAgIFhwYXRoIDEwMjQJCQkJCSIgWDogMTAyNAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIGVsc2VpZgorIiAgIGVuZHdoaWxlCitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODInLCAiOmVsc2VpZiB3aXRob3V0IDppZiIpCisgICAgWHBhdGggMjA0OAkJCQkJIiBYOiAyMDQ4CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgIGZpbmFsbHkKKyIgICAgICAgZWxzZWlmCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODInLCAiOmVsc2VpZiB3aXRob3V0IDppZiIpCisgICAgWHBhdGggNDA5NgkJCQkJIiBYOiA0MDk2CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICBlbHNlaWYKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4MicsICI6ZWxzZWlmIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCA4MTkyCQkJCQkiIFg6IDgxOTIKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIHRocm93ICJhIgorIiAgIGNhdGNoIC9hLworIiAgICAgICBlbHNlaWYKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4MicsICI6ZWxzZWlmIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCAxNjM4NAkJCQkJIiBYOiAxNjM4NAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICBpZiAxCisiICAgZWxzZQorIiAgIGVsc2UKKyIgICBlbmRpZgorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTgzJywgIm11bHRpcGxlIDplbHNlIikKKyAgICBYcGF0aCAzMjc2OAkJCQkJIiBYOiAzMjc2OAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICBpZiAxCisiICAgZWxzZQorIiAgIGVsc2VpZiAxCisiICAgZW5kaWYKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4NCcsICI6ZWxzZWlmIGFmdGVyIDplbHNlIikKKyAgICBYcGF0aCA2NTUzNgkJCQkJIiBYOiA2NTUzNgorZW5kaWYKKworY2FsbCBkZWxldGUobXNnZmlsZSkKK3VubGV0IG1zZ2ZpbGUKKworWGNoZWNrIDEzMTA3MQorCisiIExlYXZlIE1FU1NBR0VTKCkgZm9yIHRoZSBuZXh0IHRlc3QuCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA1NDogIE5lc3RpbmcgZXJyb3JzOiA6d2hpbGUvOmVuZHdoaWxlCQkJCSAgICB7e3sxCisiCisiCSAgICBGb3IgbmVzdGluZyBlcnJvcnMgb2YgOndoaWxlIGNvbmRpdGlvbmFscyB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlcworIgkgICAgc2hvdWxkIGJlIGdpdmVuLgorIgorIgkgICAgVGhpcyB0ZXN0IHJldXNlcyB0aGUgZnVuY3Rpb24gTUVTU0FHRVMoKSBmcm9tIHRoZSBwcmV2aW91cyB0ZXN0LgorIgkgICAgVGhpcyBmdW5jdGlvbnMgY2hlY2tzIHRoZSBtZXNzYWdlcyBpbiBnOm1zZ2ZpbGUuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworbGV0IG1zZ2ZpbGUgPSB0ZW1wbmFtZSgpCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgZW5kd2hpbGUKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4OCcsICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDEJCQkJCSIgWDogMQorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICBpZiAxCisiICAgICAgIGVuZHdoaWxlCisiICAgZW5kaWYKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4OCcsICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDIJCQkJCSIgWDogMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIGlmIDEKKyIgICBlbmR3aGlsZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFMTcxJywgIk1pc3NpbmcgOmVuZGlmIikKKyAgICBYcGF0aCA0CQkJCQkiIFg6IDQKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgZmluYWxseQorIiAgICAgICBlbmR3aGlsZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTg4JywgIjplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIpCisgICAgWHBhdGggOAkJCQkJIiBYOiA4CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHdoaWxlIDEKKyIgICAgICAgdHJ5CisiICAgICAgIGZpbmFsbHkKKyIgICBlbmR3aGlsZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNjAwJywgIk1pc3NpbmcgOmVuZHRyeSIpCisgICAgWHBhdGggMTYJCQkJCSIgWDogMTYKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgd2hpbGUgMQorIiAgICAgICBpZiAxCisiCSAgICB0cnkKKyIJICAgIGZpbmFsbHkKKyIgICBlbmR3aGlsZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNjAwJywgIk1pc3NpbmcgOmVuZHRyeSIpCisgICAgWHBhdGggMzIJCQkJCSIgWDogMzIKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgd2hpbGUgMQorIiAgICAgICB0cnkKKyIgICAgICAgZmluYWxseQorIgkgICAgaWYgMQorIiAgIGVuZHdoaWxlCitlbmRpZgoraWYgTUVTU0FHRVMoJ0UxNzEnLCAiTWlzc2luZyA6ZW5kaWYiKQorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDY0CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICBlbmR3aGlsZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTg4JywgIjplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIpCisgICAgWHBhdGggMTI4CQkJCQkiIFg6IDEyOAorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIHRyeQorIgkgICAgZW5kd2hpbGUKKyIgICAgICAgZW5kdHJ5CisiICAgZW5kd2hpbGUKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4OCcsICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDI1NgkJCQkJIiBYOiAyNTYKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIHRocm93ICJhIgorIiAgIGNhdGNoIC9hLworIiAgICAgICBlbmR3aGlsZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTg4JywgIjplbmR3aGlsZSB3aXRob3V0IDp3aGlsZSIpCisgICAgWHBhdGggNTEyCQkJCQkiIFg6IDUxMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB3aGlsZSAxCisiICAgICAgIHRyeQorIgkgICAgdGhyb3cgImEiCisiCWNhdGNoIC9hLworIgkgICAgZW5kd2hpbGUKKyIgICAgICAgZW5kdHJ5CisiICAgZW5kd2hpbGUKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4OCcsICI6ZW5kd2hpbGUgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDEwMjQJCQkJCSIgWDogMTAyNAorZW5kaWYKKworCitjYWxsIGRlbGV0ZShtc2dmaWxlKQordW5sZXQgbXNnZmlsZQorCitYY2hlY2sgMjA0NworCisiIExlYXZlIE1FU1NBR0VTKCkgZm9yIHRoZSBuZXh0IHRlc3QuCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA1NTogIE5lc3RpbmcgZXJyb3JzOiA6Y29udGludWUvOmJyZWFrCQkJCSAgICB7e3sxCisiCisiCSAgICBGb3IgbmVzdGluZyBlcnJvcnMgb2YgOmNvbnRpbnVlIGFuZCA6YnJlYWsgY29tbWFuZHMgdGhlIGNvcnJlY3QKKyIJICAgIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBnaXZlbi4KKyIKKyIJICAgIFRoaXMgdGVzdCByZXVzZXMgdGhlIGZ1bmN0aW9uIE1FU1NBR0VTKCkgZnJvbSB0aGUgcHJldmlvdXMgdGVzdC4KKyIJICAgIFRoaXMgZnVuY3Rpb25zIGNoZWNrcyB0aGUgbWVzc2FnZXMgaW4gZzptc2dmaWxlLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCBtc2dmaWxlID0gdGVtcG5hbWUoKQorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIGNvbnRpbnVlCitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODYnLCAiOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIikKKyAgICBYcGF0aCAxCQkJCQkiIFg6IDEKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgaWYgMQorIiAgICAgICBjb250aW51ZQorIiAgIGVuZGlmCitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODYnLCAiOmNvbnRpbnVlIHdpdGhvdXQgOndoaWxlIikKKyAgICBYcGF0aCAyCQkJCQkiIFg6IDIKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgZmluYWxseQorIiAgICAgICBjb250aW51ZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTg2JywgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIpCisgICAgWHBhdGggNAkJCQkJIiBYOiA0CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICBjb250aW51ZQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNTg2JywgIjpjb250aW51ZSB3aXRob3V0IDp3aGlsZSIpCisgICAgWHBhdGggOAkJCQkJIiBYOiA4CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICB0aHJvdyAiYSIKKyIgICBjYXRjaCAvYS8KKyIgICAgICAgY29udGludWUKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4NicsICI6Y29udGludWUgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDE2CQkJCQkiIFg6IDE2CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIGJyZWFrCitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODcnLCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIikKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAzMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICBpZiAxCisiICAgICAgIGJyZWFrCisiICAgZW5kaWYKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4NycsICI6YnJlYWsgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDY0CQkJCQkiIFg6IDY0CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgIGZpbmFsbHkKKyIgICAgICAgYnJlYWsKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4NycsICI6YnJlYWsgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAxMjgKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIGJyZWFrCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0U1ODcnLCAiOmJyZWFrIHdpdGhvdXQgOndoaWxlIikKKyAgICBYcGF0aCAyNTYJCQkJCSIgWDogMjU2CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICB0aHJvdyAiYSIKKyIgICBjYXRjaCAvYS8KKyIgICAgICAgYnJlYWsKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTU4NycsICI6YnJlYWsgd2l0aG91dCA6d2hpbGUiKQorICAgIFhwYXRoIDUxMgkJCQkJIiBYOiA1MTIKK2VuZGlmCisKK2NhbGwgZGVsZXRlKG1zZ2ZpbGUpCit1bmxldCBtc2dmaWxlCisKK1hjaGVjayAxMDIzCisKKyIgTGVhdmUgTUVTU0FHRVMoKSBmb3IgdGhlIG5leHQgdGVzdC4KKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDU2OiAgTmVzdGluZyBlcnJvcnM6IDplbmR0cnkJCQkJCSAgICB7e3sxCisiCisiCSAgICBGb3IgbmVzdGluZyBlcnJvcnMgb2YgOnRyeSBjb25kaXRpb25hbHMgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZXMKKyIJICAgIHNob3VsZCBiZSBnaXZlbi4KKyIKKyIJICAgIFRoaXMgdGVzdCByZXVzZXMgdGhlIGZ1bmN0aW9uIE1FU1NBR0VTKCkgZnJvbSB0aGUgcHJldmlvdXMgdGVzdC4KKyIJICAgIFRoaXMgZnVuY3Rpb25zIGNoZWNrcyB0aGUgbWVzc2FnZXMgaW4gZzptc2dmaWxlLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCBtc2dmaWxlID0gdGVtcG5hbWUoKQorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNjAyJywgIjplbmR0cnkgd2l0aG91dCA6dHJ5IikKKyAgICBYcGF0aCAxCQkJCQkiIFg6IDEKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgaWYgMQorIiAgICAgICBlbmR0cnkKKyIgICBlbmRpZgorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNjAyJywgIjplbmR0cnkgd2l0aG91dCA6dHJ5IikKKyAgICBYcGF0aCAyCQkJCQkiIFg6IDIKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgd2hpbGUgMQorIiAgICAgICBlbmR0cnkKKyIgICBlbmR3aGlsZQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFNjAyJywgIjplbmR0cnkgd2l0aG91dCA6dHJ5IikKKyAgICBYcGF0aCA0CQkJCQkiIFg6IDQKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIGlmIDEKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTE3MScsICJNaXNzaW5nIDplbmRpZiIpCisgICAgWHBhdGggOAkJCQkJIiBYOiA4CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgICAgICB3aGlsZSAxCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0UxNzAnLCAiTWlzc2luZyA6ZW5kd2hpbGUiKQorICAgIFhwYXRoIDE2CQkJCQkiIFg6IDE2CitlbmRpZgorCitpZiBFeHRyYVZpbShtc2dmaWxlKQorIiAgIHRyeQorIiAgIGZpbmFsbHkKKyIgICAgICAgaWYgMQorIiAgIGVuZHRyeQorZW5kaWYKK2lmIE1FU1NBR0VTKCdFMTcxJywgIk1pc3NpbmcgOmVuZGlmIikKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAzMgorZW5kaWYKKworaWYgRXh0cmFWaW0obXNnZmlsZSkKKyIgICB0cnkKKyIgICBmaW5hbGx5CisiICAgICAgIHdoaWxlIDEKKyIgICBlbmR0cnkKK2VuZGlmCitpZiBNRVNTQUdFUygnRTE3MCcsICJNaXNzaW5nIDplbmR3aGlsZSIpCisgICAgWHBhdGggNjQJCQkJCSIgWDogNjQKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIHRocm93ICJhIgorIiAgIGNhdGNoIC9hLworIiAgICAgICBpZiAxCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0UxNzEnLCAiTWlzc2luZyA6ZW5kaWYiKQorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAxMjgKK2VuZGlmCisKK2lmIEV4dHJhVmltKG1zZ2ZpbGUpCisiICAgdHJ5CisiICAgICAgIHRocm93ICJhIgorIiAgIGNhdGNoIC9hLworIiAgICAgICB3aGlsZSAxCisiICAgZW5kdHJ5CitlbmRpZgoraWYgTUVTU0FHRVMoJ0UxNzAnLCAiTWlzc2luZyA6ZW5kd2hpbGUiKQorICAgIFhwYXRoIDI1NgkJCQkJIiBYOiAyNTYKK2VuZGlmCisKK2NhbGwgZGVsZXRlKG1zZ2ZpbGUpCit1bmxldCBtc2dmaWxlCisKK2RlbGZ1bmN0aW9uIE1FU1NBR0VTCisKK1hjaGVjayA1MTEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDU3OiAgdjpleGNlcHRpb24gYW5kIHY6dGhyb3dwb2ludCBmb3IgdXNlciBleGNlcHRpb25zCQkgICAge3t7MQorIgorIgkgICAgdjpleGNlcHRpb24gZXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodAorIgkgICAgbW9zdCByZWNlbnRseSBhbmQgaXMgbm90IGZpbmlzaGVkLiAgKEEgY2F1Z2h0IGV4Y2VwdGlvbiBpcyBmaW5pc2hlZAorIgkgICAgd2hlbiB0aGUgbmV4dCAiOmNhdGNoIiwgIjpmaW5hbGx5Iiwgb3IgIjplbmR0cnkiIGlzIHJlYWNoZWQuKQorIgkgICAgdjp0aHJvd3BvaW50IGV2YWx1YXRlcyB0byB0aGUgc2NyaXB0L2Z1bmN0aW9uIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisiCSAgICB3aGVyZSB0aGF0IGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24uCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIEZ1bmNFeGNlcHRpb24oKQorICAgIGxldCBnOmV4Y2VwdGlvbiA9IHY6ZXhjZXB0aW9uCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgRnVuY1Rocm93cG9pbnQoKQorICAgIGxldCBnOnRocm93cG9pbnQgPSB2OnRocm93cG9pbnQKK2VuZGZ1bmN0aW9uCisKK2xldCBzY3JpcHRFeGNlcHRpb24gID0gTWFrZVNjcmlwdCgiRnVuY0V4Y2VwdGlvbiIpCitsZXQgc2NyaXB0VGhyb3dQb2ludCA9IE1ha2VTY3JpcHQoIkZ1bmNUaHJvd3BvaW50IikKKworY29tbWFuZCEgQ21kRXhjZXB0aW9uICBsZXQgZzpleGNlcHRpb24gID0gdjpleGNlcHRpb24KK2NvbW1hbmQhIENtZFRocm93cG9pbnQgbGV0IGc6dGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCitYbG9vcElOSVQhIDEgMgorCitmdW5jdGlvbiEgQ0hFQ0sobiwgZXhjZXB0aW9uLCB0aHJvd25hbWUsIHRocm93bGluZSkKKyAgICBYbG9vcE5FWFQKKyAgICBsZXQgZXJyb3IgPSAwCisgICAgaWYgdjpleGNlcHRpb24gIT0gYTpleGNlcHRpb24KKwlYb3V0IGE6bi4iOiB2OmV4Y2VwdGlvbiBpcyIgdjpleGNlcHRpb24gImluc3RlYWQgb2YiIGE6ZXhjZXB0aW9uCisJbGV0IGVycm9yID0gMQorICAgIGVuZGlmCisgICAgaWYgdjp0aHJvd3BvaW50ICF+IGE6dGhyb3duYW1lCisJbGV0IG5hbWUgPSBlc2NhcGUoYTp0aHJvd25hbWUsICdcJykKKwlYb3V0IGE6bi4iOiB2OnRocm93cG9pbnQgKCIudjp0aHJvd3BvaW50LiIpIGRvZXMgbm90IG1hdGNoIiBuYW1lCisJbGV0IGVycm9yID0gMQorICAgIGVuZGlmCisgICAgaWYgdjp0aHJvd3BvaW50ICF+IGE6dGhyb3dsaW5lCisJbGV0IGxpbmUgPSBlc2NhcGUoYTp0aHJvd2xpbmUsICdcJykKKwlYb3V0IGE6bi4iOiB2OnRocm93cG9pbnQgKCIudjp0aHJvd3BvaW50LiIpIGRvZXMgbm90IG1hdGNoIiBsaW5lCisJbGV0IGVycm9yID0gMQorICAgIGVuZGlmCisgICAgaWYgZXJyb3IKKwlYbG9vcCAxCQkJCQkiIFg6IDAKKyAgICBlbmRpZgorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIFQoYXJnLCBsaW5lKQorICAgIGlmIGE6bGluZSA9PSAyCisJdGhyb3cgYTphcmcJCSIgaW4gbGluZSAyCisgICAgZWxzZWlmIGE6bGluZSA9PSA0CisJdGhyb3cgYTphcmcJCSIgaW4gbGluZSA0CisgICAgZWxzZWlmIGE6bGluZSA9PSA2CisJdGhyb3cgYTphcmcJCSIgaW4gbGluZSA2CisgICAgZWxzZWlmIGE6bGluZSA9PSA4CisJdGhyb3cgYTphcmcJCSIgaW4gbGluZSA4CisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBHKGFyZywgbGluZSkKKyAgICBjYWxsIFQoYTphcmcsIGE6bGluZSkKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBGKGFyZywgbGluZSkKKyAgICBjYWxsIEcoYTphcmcsIGE6bGluZSkKK2VuZGZ1bmN0aW9uCisKK2xldCBzY3JpcHRUID0gTWFrZVNjcmlwdCgiVCIpCitsZXQgc2NyaXB0RyA9IE1ha2VTY3JpcHQoIkciLCBzY3JpcHRUKQorbGV0IHNjcmlwdEYgPSBNYWtlU2NyaXB0KCJGIiwgc2NyaXB0RykKKwordHJ5CisgICAgWHBhdGggMzI3NjgJCQkJCSIgWDogMzI3NjgKKyAgICBjYWxsIEYoIm9vcHMiLCAyKQorY2F0Y2ggLy4qLworICAgIFhwYXRoIDY1NTM2CQkJCQkiIFg6IDY1NTM2CisgICAgbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorICAgIGxldCB0aHJvd3BvaW50ID0gdjp0aHJvd3BvaW50CisgICAgY2FsbCBDSEVDSygxLCAib29wcyIsICdcPEZcLlwuR1wuXC5UXD4nLCAnXDwyXD4nKQorICAgIGV4ZWMgImxldCBleGNlcHRpb24gID0gdjpleGNlcHRpb24iCisgICAgZXhlYyAibGV0IHRocm93cG9pbnQgPSB2OnRocm93cG9pbnQiCisgICAgY2FsbCBDSEVDSygyLCAib29wcyIsICdcPEZcLlwuR1wuXC5UXD4nLCAnXDwyXD4nKQorICAgIENtZEV4Y2VwdGlvbgorICAgIENtZFRocm93cG9pbnQKKyAgICBjYWxsIENIRUNLKDMsICJvb3BzIiwgJ1w8RlwuXC5HXC5cLlRcPicsICdcPDJcPicpCisgICAgY2FsbCBGdW5jRXhjZXB0aW9uKCkKKyAgICBjYWxsIEZ1bmNUaHJvd3BvaW50KCkKKyAgICBjYWxsIENIRUNLKDQsICJvb3BzIiwgJ1w8RlwuXC5HXC5cLlRcPicsICdcPDJcPicpCisgICAgZXhlYyAic291cmNlIiBzY3JpcHRFeGNlcHRpb24KKyAgICBleGVjICJzb3VyY2UiIHNjcmlwdFRocm93UG9pbnQKKyAgICBjYWxsIENIRUNLKDUsICJvb3BzIiwgJ1w8RlwuXC5HXC5cLlRcPicsICdcPDJcPicpCisgICAgdHJ5CisJWHBhdGggMTMxMDcyCQkJCSIgWDogMTMxMDcyCisJY2FsbCBHKCJhcnJnaCIsIDQpCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDI2MjE0NAorCWxldCBleGNlcHRpb24gID0gdjpleGNlcHRpb24KKwlsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCWNhbGwgQ0hFQ0soNiwgImFycmdoIiwgJ1w8R1wuXC5UXD4nLCAnXDw0XD4nKQorCXRyeQorCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDUyNDI4OAorCSAgICBsZXQgZzphcmcgPSAiYXV0c2NoIgorCSAgICBsZXQgZzpsaW5lID0gNgorCSAgICBleGVjICJzb3VyY2UiIHNjcmlwdEYKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDEwNDg1NzYJCQkiIFg6IDEwNDg1NzYKKwkgICAgbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorCSAgICBsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCSAgICAiIFN5bWJvbGljIGxpbmtzIGluIHRlbXBuYW1lKClzIGFyZSBub3QgcmVzb2x2ZWQsIHdoZXJlYXMgcmVzb2x2aW5nCisJICAgICIgaXMgZG9uZSBmb3Igdjp0aHJvd3BvaW50LiAgUmVzb2x2ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IKKwkgICAgIiBzY3JpcHRULCBzbyB0aGF0IGl0IGNhbiBiZSBtYXRjaGVkIGFnYWluc3Qgdjp0aHJvd3BvaW50LgorCSAgICBjYWxsIENIRUNLKDcsICJhdXRzY2giLCByZXNvbHZlKHNjcmlwdFQpLCAnXDw2XD4nKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMjA5NzE1MgkJCSIgWDogMjA5NzE1MgorCSAgICBsZXQgZXhjZXB0aW9uICA9IHY6ZXhjZXB0aW9uCisJICAgIGxldCB0aHJvd3BvaW50ID0gdjp0aHJvd3BvaW50CisJICAgIGNhbGwgQ0hFQ0soOCwgImFycmdoIiwgJ1w8R1wuXC5UXD4nLCAnXDw0XD4nKQorCSAgICB0cnkKKwkJWHBhdGggNDE5NDMwNAkJCSIgWDogNDE5NDMwNAorCQlsZXQgZzphcmcgPSAiYnJycnIiCisJCWxldCBnOmxpbmUgPSA4CisJCWV4ZWMgInNvdXJjZSIgc2NyaXB0RworCSAgICBjYXRjaCAvLiovCisJCVhwYXRoIDgzODg2MDgJCQkiIFg6IDgzODg2MDgKKwkJbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorCQlsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCQkiIFJlc29sdmUgc2NyaXB0VCBmb3IgbWF0Y2hpbmcgaXQgYWdhaW5zdCB2OnRocm93cG9pbnQuCisJCWNhbGwgQ0hFQ0soOSwgImJycnJyIiwgcmVzb2x2ZShzY3JpcHRUKSwgJ1w8OFw+JykKKwkgICAgZmluYWxseQorCQlYcGF0aCAxNjc3NzIxNgkJCSIgWDogMTY3NzcyMTYKKwkJbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorCQlsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCQljYWxsIENIRUNLKDEwLCAiYXJyZ2giLCAnXDxHXC5cLlRcPicsICdcPDRcPicpCisJICAgIGVuZHRyeQorCSAgICBYcGF0aCAzMzU1NDQzMgkJCSIgWDogMzM1NTQ0MzIKKwkgICAgbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorCSAgICBsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCSAgICBjYWxsIENIRUNLKDExLCAiYXJyZ2giLCAnXDxHXC5cLlRcPicsICdcPDRcPicpCisJZW5kdHJ5CisJWHBhdGggNjcxMDg4NjQJCQkJIiBYOiA2NzEwODg2NAorCWxldCBleGNlcHRpb24gID0gdjpleGNlcHRpb24KKwlsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorCWNhbGwgQ0hFQ0soMTIsICJhcnJnaCIsICdcPEdcLlwuVFw+JywgJ1w8NFw+JykKKyAgICBmaW5hbGx5CisJWHBhdGggMTM0MjE3NzI4CQkJCSIgWDogMTM0MjE3NzI4CisJbGV0IGV4Y2VwdGlvbiAgPSB2OmV4Y2VwdGlvbgorCWxldCB0aHJvd3BvaW50ID0gdjp0aHJvd3BvaW50CisJY2FsbCBDSEVDSygxMywgIm9vcHMiLCAnXDxGXC5cLkdcLlwuVFw+JywgJ1w8Mlw+JykKKyAgICBlbmR0cnkKKyAgICBYcGF0aCAyNjg0MzU0NTYJCQkJIiBYOiAyNjg0MzU0NTYKKyAgICBsZXQgZXhjZXB0aW9uICA9IHY6ZXhjZXB0aW9uCisgICAgbGV0IHRocm93cG9pbnQgPSB2OnRocm93cG9pbnQKKyAgICBjYWxsIENIRUNLKDE0LCAib29wcyIsICdcPEZcLlwuR1wuXC5UXD4nLCAnXDwyXD4nKQorZmluYWxseQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDUzNjg3MDkxMgorICAgIGxldCBleGNlcHRpb24gID0gdjpleGNlcHRpb24KKyAgICBsZXQgdGhyb3dwb2ludCA9IHY6dGhyb3dwb2ludAorICAgIGNhbGwgQ0hFQ0soMTUsICIiLCAnXiQnLCAnXiQnKQorZW5kdHJ5CisKK1hwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAxMDczNzQxODI0CisKK3VubGV0IGV4Y2VwdGlvbiB0aHJvd3BvaW50CitkZWxmdW5jdGlvbiBGdW5jRXhjZXB0aW9uCitkZWxmdW5jdGlvbiBGdW5jVGhyb3dwb2ludAorY2FsbCBkZWxldGUoc2NyaXB0RXhjZXB0aW9uKQorY2FsbCBkZWxldGUoc2NyaXB0VGhyb3dQb2ludCkKK3VubGV0IHNjcmlwdEV4Y2VwdGlvbiBzY3JpcHRUaHJvd1BvaW50CitkZWxjb21tYW5kIENtZEV4Y2VwdGlvbgorZGVsY29tbWFuZCBDbWRUaHJvd3BvaW50CitkZWxmdW5jdGlvbiBUCitkZWxmdW5jdGlvbiBHCitkZWxmdW5jdGlvbiBGCitjYWxsIGRlbGV0ZShzY3JpcHRUKQorY2FsbCBkZWxldGUoc2NyaXB0RykKK2NhbGwgZGVsZXRlKHNjcmlwdEYpCit1bmxldCBzY3JpcHRUIHNjcmlwdEcgc2NyaXB0RgorCitYY2hlY2sgMjE0NzQ1MDg4MAorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiCisiIFRlc3QgNTg6ICB2OmV4Y2VwdGlvbiBhbmQgdjp0aHJvd3BvaW50IGZvciBlcnJvci9pbnRlcnJ1cHQgZXhjZXB0aW9ucwkgICAge3t7MQorIgorIgkgICAgdjpleGNlcHRpb24gYW5kIHY6dGhyb3dwb2ludCB3b3JrIGFsc28gZm9yIGVycm9yIGFuZCBpbnRlcnJ1cHQKKyIJICAgIGV4Y2VwdGlvbnMuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgZnVuY3Rpb24hIFQobGluZSkKKwlpZiBhOmxpbmUgPT0gMgorCSAgICBkZWxmdW5jdGlvbiBUCQkiIGVycm9yIChmdW5jdGlvbiBpbiB1c2UpIGluIGxpbmUgMgorCWVsc2VpZiBhOmxpbmUgPT0gNAorCSAgICBsZXQgZHVtbXkgPSAwCQkiIElOVEVSUlVQVDEgLSBpbnRlcnJ1cHQgaW4gbGluZSA0CisJZW5kaWYKKyAgICBlbmRmdW5jdGlvbgorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBYcGF0aCAxCQkJCSIgWDogMQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBjYWxsIFQoMikKKwljYXRjaCAvLiovCisJICAgIGxldCBjYXVnaHQgPSAxCisJICAgIGlmIHY6ZXhjZXB0aW9uICF+ICdWaW0oZGVsZnVuY3Rpb24pOicKKwkJWHBhdGggMgkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgaWYgdjp0aHJvd3BvaW50ICF+ICdcPFRcPicKKwkJWHBhdGggNAkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgaWYgdjp0aHJvd3BvaW50ICF+ICdcPDJcPicKKwkJWHBhdGggOAkJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwlmaW5hbGx5CisJICAgIFhwYXRoIDE2CQkJCSIgWDogMTYKKwkgICAgaWYgY2F1Z2h0IHx8ICRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDMyCQkJIiBYOiAzMgorCSAgICBlbmRpZgorCSAgICBpZiB2OmV4Y2VwdGlvbiAhPSAiIgorCQlYcGF0aCA2NAkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiB2OnRocm93cG9pbnQgIT0gIiIKKwkJWHBhdGggMTI4CQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIFhwYXRoIDI1NgkJCQkJIiBYOiAyNTYKKyAgICBpZiB2OmV4Y2VwdGlvbiAhPSAiIgorCVhwYXRoIDUxMgkJCQkiIFg6IDAKKyAgICBlbmRpZgorICAgIGlmIHY6dGhyb3dwb2ludCAhPSAiIgorCVhwYXRoIDEwMjQJCQkJIiBYOiAwCisgICAgZW5kaWYKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgY2FsbCBUKDQpCisJY2F0Y2ggLy4qLworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBpZiB2OmV4Y2VwdGlvbiAhPSAnVmltOkludGVycnVwdCcKKwkJWHBhdGggNDA5NgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiB2OnRocm93cG9pbnQgIX4gJ1w8VFw+JworCQlYcGF0aCA4MTkyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIHY6dGhyb3dwb2ludCAhfiAnXDw0XD4nCisJCVhwYXRoIDE2Mzg0CQkJIiBYOiAwCisJICAgIGVuZGlmCisJZmluYWxseQorCSAgICBYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisJICAgIGlmIGNhdWdodCB8fCAkVklNTk9JTlRUSFJPVworCQlYcGF0aCA2NTUzNgkJCSIgWDogNjU1MzYKKwkgICAgZW5kaWYKKwkgICAgaWYgdjpleGNlcHRpb24gIT0gIiIKKwkJWHBhdGggMTMxMDcyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIHY6dGhyb3dwb2ludCAhPSAiIgorCQlYcGF0aCAyNjIxNDQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CisgICAgaWYgdjpleGNlcHRpb24gIT0gIiIKKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorICAgIGVuZGlmCisgICAgaWYgdjp0aHJvd3BvaW50ICE9ICIiCisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDAKKyAgICBlbmRpZgorCitlbmRpZgorCitYY2hlY2sgNjI0OTQ1CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIKKyIgVGVzdCA1OTogIHY6ZXhjZXB0aW9uIGFuZCB2OnRocm93cG9pbnQgd2hlbiBkaXNjYXJkaW5nIGV4Y2VwdGlvbnMJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYSA6Y2F0Y2ggY2xhdXNlIGlzIGxlZnQgYnkgYSAiOmJyZWFrIiBldGMgb3IgYW4gZXJyb3Igb3IKKyIJICAgIGludGVycnVwdCBleGNlcHRpb24sIHY6ZXhjZXB0aW9uIGFuZCB2OnRocm93cG9pbnQgYXJlIHJlc2V0LiAgVGhleQorIgkgICAgYXJlIG5vdCBhZmZlY3RlZCBieSBhbiBleGNlcHRpb24gdGhhdCBpcyBkaXNjYXJkZWQgYmVmb3JlIGJlaW5nCisiCSAgICBjYXVnaHQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgWGxvb3BJTklUISAxIDIKKworICAgIGxldCBzZmlsZSA9IGV4cGFuZCgiPHNmaWxlPiIpCisKKyAgICBmdW5jdGlvbiEgTGluZU51bWJlcigpCisJcmV0dXJuIHN1YnN0aXR1dGUoc3Vic3RpdHV0ZSh2OnRocm93cG9pbnQsIGc6c2ZpbGUsICcnLCAiIiksCisJICAgIFwgJ1xEKlwoXGQqXCkuKicsICdcMScsICIiKQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBjb21tYW5kISAtbmFyZ3M9MSBTZXRMaW5lTnVtYmVyCisJXCB0cnkgfCB0aHJvdyAibGluZSIgfCBjYXRjaCAvLiovIHwgbGV0IDxhcmdzPiA9ICBMaW5lTnVtYmVyKCkgfCBlbmR0cnkKKworICAgICIgQ2hlY2sgdjpleGNlcHRpb24vdjp0aHJvd3BvaW50IGFnYWluc3Qgc2Vjb25kL2ZvdXJ0aCBwYXJhbWV0ZXIgaWYKKyAgICAiIHNwZWNpZmllZCwgY2hlY2sgZm9yIGJlaW5nIGVtcHR5IGVsc2UuCisgICAgZnVuY3Rpb24hIENIRUNLKG4sIC4uLikKKwlYbG9vcE5FWFQKKwlsZXQgZXhjZXB0aW9uID0gYTowICE9IDAgPyBhOjEgOiAiIgkiIHNlY29uZCBwYXJhbWV0ZXIgKG9wdGlvbmFsKQorCWxldCBlbXNnICAgICAgPSBhOjAgIT0gMCA/IGE6MiA6ICIiCSIgdGhpcmQgcGFyYW1ldGVyIChvcHRpb25hbCkKKwlsZXQgbGluZSAgICAgID0gYTowICE9IDAgPyBhOjMgOiAwCSIgZm91cnRoIHBhcmFtZXRlciAob3B0aW9uYWwpCisJbGV0IGVycm9yID0gMAorCWlmIGVtc2cgIT0gIiIKKwkgICAgIiBleGNlcHRpb24gaXMgdGhlIGVycm9yIG51bWJlciwgZW1zZyB0aGUgZW5nbGlzaCBlcnJvciBtZXNzYWdlIHRleHQKKwkgICAgaWYgZXhjZXB0aW9uICF+ICdeRVxkXCskJworCQlYb3V0ICJUT0RPOiBBZGQgbWVzc2FnZSBudW1iZXIgZm9yOiIgZW1zZworCSAgICBlbHNlaWYgdjpsYW5nID09ICJDIiB8fCB2OmxhbmcgPX4gJ15bRWVdbicKKwkJaWYgZXhjZXB0aW9uID09ICJFNDkyIiAmJiBlbXNnID09ICJOb3QgYW4gZWRpdG9yIGNvbW1hbmQiCisJCSAgICBsZXQgZXhjZXB0aW9uID0gJ15WaW06JyAuIGV4Y2VwdGlvbiAuICc6ICcgLiBlbXNnCisJCWVsc2UKKwkJICAgIGxldCBleGNlcHRpb24gPSAnXlZpbShcYVwrKTonIC4gZXhjZXB0aW9uIC4gJzogJyAuIGVtc2cKKwkJZW5kaWYKKwkgICAgZWxzZQorCQlpZiBleGNlcHRpb24gPT0gIkU0OTIiCisJCSAgICBsZXQgZXhjZXB0aW9uID0gJ15WaW06JyAuIGV4Y2VwdGlvbgorCQllbHNlCisJCSAgICBsZXQgZXhjZXB0aW9uID0gJ15WaW0oXGFcKyk6JyAuIGV4Y2VwdGlvbgorCQllbmRpZgorCSAgICBlbmRpZgorCWVuZGlmCisJaWYgZXhjZXB0aW9uID09ICIiICYmIHY6ZXhjZXB0aW9uICE9ICIiCisJICAgIFhvdXQgYTpuLiI6IHY6ZXhjZXB0aW9uIGlzIHNldDoiIHY6ZXhjZXB0aW9uCisJICAgIGxldCBlcnJvciA9IDEKKwllbHNlaWYgZXhjZXB0aW9uICE9ICIiICYmIHY6ZXhjZXB0aW9uICF+IGV4Y2VwdGlvbgorCSAgICBYb3V0IGE6bi4iOiB2OmV4Y2VwdGlvbiAoIi52OmV4Y2VwdGlvbi4iKSBkb2VzIG5vdCBtYXRjaCIgZXhjZXB0aW9uCisJICAgIGxldCBlcnJvciA9IDEKKwllbmRpZgorCWlmIGxpbmUgPT0gMCAmJiB2OnRocm93cG9pbnQgIT0gIiIKKwkgICAgWG91dCBhOm4uIjogdjp0aHJvd3BvaW50IGlzIHNldDoiIHY6dGhyb3dwb2ludAorCSAgICBsZXQgZXJyb3IgPSAxCisJZWxzZWlmIGxpbmUgIT0gMCAmJiB2OnRocm93cG9pbnQgIX4gJ1w8JyAuIGxpbmUgLiAnXD4nCisJICAgIFhvdXQgYTpuLiI6IHY6dGhyb3dwb2ludCAoIi52OnRocm93cG9pbnQuIikgZG9lcyBub3QgbWF0Y2giIGxpbmUKKwkgICAgbGV0IGVycm9yID0gMQorCWVuZGlmCisJaWYgIWVycm9yCisJICAgIFhsb29wIDEJCQkJIiBYOiAyMDk3MTUxCisJZW5kaWYKKyAgICBlbmRmdW5jdGlvbgorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICB0aHJvdyAieDEiCisJY2F0Y2ggLy4qLworCSAgICBicmVhaworCWVuZHRyeQorICAgIGVuZHdoaWxlCisgICAgY2FsbCBDSEVDSygxKQorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICB0aHJvdyAieDIiCisJY2F0Y2ggLy4qLworCSAgICBicmVhaworCWZpbmFsbHkKKwkgICAgY2FsbCBDSEVDSygyKQorCWVuZHRyeQorCWJyZWFrCisgICAgZW5kd2hpbGUKKyAgICBjYWxsIENIRUNLKDMpCisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIGxldCBlcnJjYXVnaHQgPSAwCisJICAgIHRyeQorCQl0cnkKKwkJICAgIHRocm93ICJ4MyIKKwkJY2F0Y2ggLy4qLworCQkgICAgU2V0TGluZU51bWJlciBsaW5lX2JlZm9yZV9lcnJvcgorCQkgICAgYXNkZgorCQllbmR0cnkKKwkgICAgY2F0Y2ggLy4qLworCQlsZXQgZXJyY2F1Z2h0ID0gMQorCQljYWxsIENIRUNLKDQsICdFNDkyJywgIk5vdCBhbiBlZGl0b3IgY29tbWFuZCIsCisJCSAgICBcIGxpbmVfYmVmb3JlX2Vycm9yICsgMSkKKwkgICAgZW5kdHJ5CisJZmluYWxseQorCSAgICBpZiAhZXJyY2F1Z2h0ICYmICRWSU1OT0VSUlRIUk9XCisJCWNhbGwgQ0hFQ0soNCkKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorICAgIGNhbGwgQ0hFQ0soNSkKKworICAgIFhwYXRoIDIwOTcxNTIJCQkJIiBYOiAyMDk3MTUyCisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIGxldCBpbnRjYXVnaHQgPSAwCisJICAgIHRyeQorCQl0cnkKKwkJICAgIHRocm93ICJ4NCIKKwkJY2F0Y2ggLy4qLworCQkgICAgU2V0TGluZU51bWJlciB0d29fbGluZXNfYmVmb3JlX2ludGVycnVwdAorCQkgICAgIklOVEVSUlVQVAorCQkgICAgbGV0IGR1bW15ID0gMAorCQllbmR0cnkKKwkgICAgY2F0Y2ggLy4qLworCQlsZXQgaW50Y2F1Z2h0ID0gMQorCQljYWxsIENIRUNLKDYsICJWaW06SW50ZXJydXB0IiwgJycsCisJCSAgICBcIHR3b19saW5lc19iZWZvcmVfaW50ZXJydXB0ICsgMikKKwkgICAgZW5kdHJ5CisJZmluYWxseQorCSAgICBpZiAhaW50Y2F1Z2h0ICYmICRWSU1OT0lOVFRIUk9XCisJCWNhbGwgQ0hFQ0soNikKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBpbnRlcnJ1cHQgZm9yICRWSU1OT0lOVFRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBjYWxsIENIRUNLKDcpCisKKyAgICBYcGF0aCA0MTk0MzA0CQkJCSIgWDogNDE5NDMwNAorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgZXJyY2F1Z2h0ID0gMAorCSAgICB0cnkKKwkJdHJ5CisiCQkgICAgaWYgMQorCQkJU2V0TGluZU51bWJlciBsaW5lX2JlZm9yZV90aHJvdworCQkJdGhyb3cgIng1IgorCQkgICAgIiBtaXNzaW5nIGVuZGlmCisJCWNhdGNoIC8uKi8KKwkJICAgIFhwYXRoIDgzODg2MDgJCQkiIFg6IDAKKwkJZW5kdHJ5CisJICAgIGNhdGNoIC8uKi8KKwkJbGV0IGVycmNhdWdodCA9IDEKKwkJY2FsbCBDSEVDSyg4LCAnRTE3MScsICJNaXNzaW5nIDplbmRpZiIsIGxpbmVfYmVmb3JlX3Rocm93ICsgMykKKwkgICAgZW5kdHJ5CisJZmluYWxseQorCSAgICBpZiAhZXJyY2F1Z2h0ICYmICRWSU1OT0VSUlRIUk9XCisJCWNhbGwgQ0hFQ0soOCkKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorICAgIGNhbGwgQ0hFQ0soOSkKKworICAgIFhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMTY3NzcyMTYKKworICAgIHRyeQorCXdoaWxlIDEKKwkgICAgdHJ5CisJCXRocm93ICJ4NiIKKwkgICAgZmluYWxseQorCQlicmVhaworCSAgICBlbmR0cnkKKwkgICAgYnJlYWsKKwllbmR3aGlsZQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKyAgICBjYWxsIENIRUNLKDEwKQorCisgICAgdHJ5CisJd2hpbGUgMQorCSAgICB0cnkKKwkJdGhyb3cgIng3IgorCSAgICBmaW5hbGx5CisJCWJyZWFrCisJICAgIGVuZHRyeQorCSAgICBicmVhaworCWVuZHdoaWxlCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogMAorICAgIGZpbmFsbHkKKwljYWxsIENIRUNLKDExKQorICAgIGVuZHRyeQorICAgIGNhbGwgQ0hFQ0soMTIpCisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIGxldCBlcnJjYXVnaHQgPSAwCisJICAgIHRyeQorCQl0cnkKKwkJICAgIHRocm93ICJ4OCIKKwkJZmluYWxseQorCQkgICAgU2V0TGluZU51bWJlciBsaW5lX2JlZm9yZV9lcnJvcgorCQkgICAgYXNkZgorCQllbmR0cnkKKwkgICAgY2F0Y2ggLy4qLworCQlsZXQgZXJyY2F1Z2h0ID0gMQorCQljYWxsIENIRUNLKDEzLCAnRTQ5MicsICJOb3QgYW4gZWRpdG9yIGNvbW1hbmQiLAorCQkgICAgXCBsaW5lX2JlZm9yZV9lcnJvciArIDEpCisJICAgIGVuZHRyeQorCWZpbmFsbHkKKwkgICAgaWYgIWVycmNhdWdodCAmJiAkVklNTk9FUlJUSFJPVworCQljYWxsIENIRUNLKDEzKQorCSAgICBlbmRpZgorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisgICAgY2FsbCBDSEVDSygxNCkKKworICAgIFhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgaW50Y2F1Z2h0ID0gMAorCSAgICB0cnkKKwkJdHJ5CisJCSAgICB0aHJvdyAieDkiCisJCWZpbmFsbHkKKwkJICAgIFNldExpbmVOdW1iZXIgdHdvX2xpbmVzX2JlZm9yZV9pbnRlcnJ1cHQKKwkJICAgICJJTlRFUlJVUFQKKwkJZW5kdHJ5CisJICAgIGNhdGNoIC8uKi8KKwkJbGV0IGludGNhdWdodCA9IDEKKwkJY2FsbCBDSEVDSygxNSwgIlZpbTpJbnRlcnJ1cHQiLCAnJywKKwkJICAgIFwgdHdvX2xpbmVzX2JlZm9yZV9pbnRlcnJ1cHQgKyAyKQorCSAgICBlbmR0cnkKKwlmaW5hbGx5CisJICAgIGlmICFpbnRjYXVnaHQgJiYgJFZJTU5PSU5UVEhST1cKKwkJY2FsbCBDSEVDSygxNSkKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBpbnRlcnJ1cHQgZm9yICRWSU1OT0lOVFRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBjYWxsIENIRUNLKDE2KQorCisgICAgWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMjY4NDM1NDU2CisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIGxldCBlcnJjYXVnaHQgPSAwCisJICAgIHRyeQorCQl0cnkKKyIJCSAgICBpZiAxCisJCQlTZXRMaW5lTnVtYmVyIGxpbmVfYmVmb3JlX3Rocm93CisJCQl0aHJvdyAieDEwIgorCQkgICAgIiBtaXNzaW5nIGVuZGlmCisJCWZpbmFsbHkKKwkJICAgIGNhbGwgQ0hFQ0soMTcpCisJCWVuZHRyeQorCSAgICBjYXRjaCAvLiovCisJCWxldCBlcnJjYXVnaHQgPSAxCisJCWNhbGwgQ0hFQ0soMTgsICdFMTcxJywgIk1pc3NpbmcgOmVuZGlmIiwgbGluZV9iZWZvcmVfdGhyb3cgKyAzKQorCSAgICBlbmR0cnkKKwlmaW5hbGx5CisJICAgIGlmICFlcnJjYXVnaHQgJiYgJFZJTU5PRVJSVEhST1cKKwkJY2FsbCBDSEVDSygxOCkKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorICAgIGNhbGwgQ0hFQ0soMTkpCisKKyAgICBYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiA1MzY4NzA5MTIKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgbGV0IGVycmNhdWdodCA9IDAKKwkgICAgdHJ5CisJCXRyeQorIgkJICAgIGlmIDEKKwkJCVNldExpbmVOdW1iZXIgbGluZV9iZWZvcmVfdGhyb3cKKwkJCXRocm93ICJ4MTEiCisJCSAgICAiIG1pc3NpbmcgZW5kaWYKKwkJZW5kdHJ5CisJICAgIGNhdGNoIC8uKi8KKwkJbGV0IGVycmNhdWdodCA9IDEKKwkJY2FsbCBDSEVDSygyMCwgJ0UxNzEnLCAiTWlzc2luZyA6ZW5kaWYiLCBsaW5lX2JlZm9yZV90aHJvdyArIDMpCisJICAgIGVuZHRyeQorCWZpbmFsbHkKKwkgICAgaWYgIWVycmNhdWdodCAmJiAkVklNTk9FUlJUSFJPVworCQljYWxsIENIRUNLKDIwKQorCSAgICBlbmRpZgorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisgICAgY2FsbCBDSEVDSygyMSkKKworICAgIFhwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAxMDczNzQxODI0CisKK2VuZGlmCisKK1hjaGVjayAyMDM4NDMxNzQzCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIKKyIgVGVzdCA2MDogIChSZSl0aHJvd2luZyB2OmV4Y2VwdGlvbjsgOmVjaG9lcnIuCQkJCSAgICB7e3sxCisiCisiCSAgICBBIHVzZXIgZXhjZXB0aW9uIGNhbiBiZSByZXRocm93biBhZnRlciBjYXRjaGluZyBieSB0aHJvd2luZworIgkgICAgdjpleGNlcHRpb24uICBBbiBlcnJvciBvciBpbnRlcnJ1cHQgZXhjZXB0aW9uIGNhbm5vdCBiZSByZXRocm93bgorIgkgICAgYmVjYXVzZSBWaW0gZXhjZXB0aW9ucyBjYW5ub3QgYmUgZmFrZWQuICBBIFZpbSBleGNlcHRpb24gdXNpbmcgdGhlCisiCSAgICB2YWx1ZSBvZiB2OmV4Y2VwdGlvbiBjYW4sIGhvd2V2ZXIsIGJlIHRyaWdnZXJlZCBieSB0aGUgOmVjaG9lcnIKKyIJICAgIGNvbW1hbmQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKwordHJ5CisgICAgdHJ5CisJWHBhdGggMQkJCQkJIiBYOiAxCisJdGhyb3cgIm9vcHMiCisgICAgY2F0Y2ggL29vcHMvCisJWHBhdGggMgkJCQkJIiBYOiAyCisJdGhyb3cgdjpleGNlcHRpb24JIiByZXRocm93IHVzZXIgZXhjZXB0aW9uCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDQJCQkJCSIgWDogMAorICAgIGVuZHRyeQorY2F0Y2ggL15vb3BzJC8JCQkiIGNhdGNoZXMgcmV0aHJvd24gdXNlciBleGNlcHRpb24KKyAgICBYcGF0aCA4CQkJCQkiIFg6IDgKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAxNgkJCQkJIiBYOiAwCitlbmR0cnkKKworZnVuY3Rpb24hIEYoKQorICAgIHRyeQorCWxldCBjYXVnaHQgPSAwCisJdHJ5CisJICAgIFhwYXRoIDMyCQkJCSIgWDogMzIKKwkgICAgd3JpdGUgL24vby9uL3cvci9pL3QvYS9iL2wvZS9fL2YvaS9sL2UKKwkgICAgWHBhdGggNjQJCQkJIiBYOiAwCisJICAgIFhvdXQgImRpZF9lbXNnIHdhcyByZXNldCBiZWZvcmUgZXhlY3V0aW5nICIgLgorCQlcICJCdWZXcml0ZVBvc3QgYXV0b2NvbW1hbmRzLiIKKwljYXRjaCAvXlZpbSh3cml0ZSk6LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICB0aHJvdyB2OmV4Y2VwdGlvbgkiIHRocm93IGVycm9yOiBjYW5ub3QgZmFrZSBWaW0gZXhjZXB0aW9uCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCAxMjgJCQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggNTEyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJZW5kdHJ5CisgICAgY2F0Y2ggL15WaW0odGhyb3cpOi8JIiBjYXRjaGVzIHRocm93IGVycm9yCisJbGV0IGNhdWdodCA9IGNhdWdodCArIDEKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMTAyNAkJCQkiIFg6IDAKKyAgICBmaW5hbGx5CisJWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwlpZiBjYXVnaHQgIT0gMgorCSAgICBpZiAhY2F1Z2h0ICYmICEkVklNTk9FUlJUSFJPVworCQlYcGF0aCA0MDk2CQkJIiBYOiAwCisJICAgIGVsc2VpZiBjYXVnaHQKKwkJWHBhdGggODE5MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICByZXR1cm4JCXwgIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZGlmCisgICAgZW5kdHJ5CitlbmRmdW5jdGlvbgorCitjYWxsIEYoKQorZGVsZnVuY3Rpb24gRgorCitmdW5jdGlvbiEgRygpCisgICAgdHJ5CisJbGV0IGNhdWdodCA9IDAKKwl0cnkKKwkgICAgWHBhdGggMTYzODQJCQkJIiBYOiAxNjM4NAorCSAgICBhc2RmCisJY2F0Y2ggL15WaW0vCQkiIGNhdGNoIGVycm9yIGV4Y2VwdGlvbgorCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICAiIFRyaWdnZXIgVmltIGVycm9yIGV4Y2VwdGlvbiB3aXRoIHZhbHVlIHNwZWNpZmllZCBhZnRlciA6ZWNob2VycgorCSAgICBsZXQgdmFsdWUgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbVwoKC4qKVwpXD06JywgJycsICIiKQorCSAgICBlY2hvZXJyIHZhbHVlCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwkgICAgaWYgIWNhdWdodAorCQlpZiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDEzMTA3MgkJIiBYOiAwCisJCWVsc2UKKwkJICAgIGxldCB2YWx1ZSA9ICJFcnJvciIKKwkJICAgIGVjaG9lcnIgdmFsdWUKKwkJZW5kaWYKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvXlZpbShlY2hvZXJyKTovCisJbGV0IGNhdWdodCA9IGNhdWdodCArIDEKKwlpZiB2OmV4Y2VwdGlvbiAhfiB2YWx1ZQorCSAgICBYcGF0aCAyNjIxNDQJCQkiIFg6IDAKKwllbmRpZgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA1MjQyODgJCQkJIiBYOiAwCisgICAgZmluYWxseQorCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAxMDQ4NTc2CisJaWYgY2F1Z2h0ICE9IDIKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggMjA5NzE1MgkJCSIgWDogMAorCSAgICBlbHNlaWYgY2F1Z2h0CisJCVhwYXRoIDQxOTQzMDQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgcmV0dXJuCQl8ICIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmRpZgorICAgIGVuZHRyeQorZW5kZnVuY3Rpb24KKworY2FsbCBHKCkKK2RlbGZ1bmN0aW9uIEcKKwordW5sZXQhIHZhbHVlIGNhdWdodAorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJbGV0IGVycmNhdWdodCA9IDAKKwl0cnkKKwkgICAgWHBhdGggODM4ODYwOAkJCSIgWDogODM4ODYwOAorCSAgICBsZXQgaW50Y2F1Z2h0ID0gMAorCSAgICAiSU5URVJSVVBUCisJY2F0Y2ggL15WaW06LwkJIiBjYXRjaCBpbnRlcnJ1cHQgZXhjZXB0aW9uCisJICAgIGxldCBpbnRjYXVnaHQgPSAxCisJICAgICIgVHJpZ2dlciBWaW0gZXJyb3IgZXhjZXB0aW9uIHdpdGggdmFsdWUgc3BlY2lmaWVkIGFmdGVyIDplY2hvZXJyCisJICAgIGVjaG9lcnIgc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW1cKCguKilcKVw9OicsICcnLCAiIikKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAzMzU1NDQzMgkJCSIgWDogMzM1NTQ0MzIKKwkgICAgaWYgIWludGNhdWdodAorCQlpZiAhJFZJTU5PSU5UVEhST1cKKwkJICAgIFhwYXRoIDY3MTA4ODY0CQkiIFg6IDAKKwkJZWxzZQorCQkgICAgZWNob2VyciAiSW50ZXJydXB0IgorCQllbmRpZgorCSAgICBlbmRpZgorCWVuZHRyeQorICAgIGNhdGNoIC9eVmltKGVjaG9lcnIpOi8KKwlsZXQgZXJyY2F1Z2h0ID0gMQorCWlmIHY6ZXhjZXB0aW9uICF+ICJJbnRlcnJ1cHQiCisJICAgIFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMAorCWVuZGlmCisgICAgZmluYWxseQorCVhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDI2ODQzNTQ1NgorCWlmICFlcnJjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJICAgIFhwYXRoIDUzNjg3MDkxMgkJCSIgWDogMAorCWVuZGlmCisgICAgZW5kdHJ5CitlbmRpZgorCitYY2hlY2sgMzExNTExMzM5CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA2MTogIENhdGNoaW5nIGludGVycnVwdCBleGNlcHRpb25zCQkJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGludGVycnVwdCBvY2N1cnMgaW5zaWRlIGEgOnRyeS86ZW5kdHJ5IHJlZ2lvbiwgYW4KKyIJICAgIGludGVycnVwdCBleGNlcHRpb24gaXMgdGhyb3duIGFuZCBjYW4gYmUgY2F1Z2h0LiAgSXRzIHZhbHVlIGlzCisiCSAgICAiVmltOkludGVycnVwdCIuICBJZiB0aGUgaW50ZXJydXB0IG9jY3VycyBhZnRlciBhbiBlcnJvciBvciBhIDp0aHJvdworIgkgICAgYnV0IGJlZm9yZSBhIG1hdGNoaW5nIDpjYXRjaCBpcyByZWFjaGVkLCBhbGwgZm9sbG93aW5nIDpjYXRjaGVzIG9mCisiCSAgICB0aGF0IHRyeSBibG9jayBhcmUgaWdub3JlZCwgYnV0IHRoZSBpbnRlcnJ1cHQgZXhjZXB0aW9uIGNhbiBiZQorIgkgICAgY2F1Z2h0IGJ5IHRoZSBuZXh0IHN1cnJvdW5kaW5nIHRyeSBjb25kaXRpb25hbC4gIEFuIGludGVycnVwdCBpcworIgkgICAgaWdub3JlZCB3aGVuIHRoZXJlIGlzIGEgcHJldmlvdXMgaW50ZXJydXB0IHRoYXQgaGFzIG5vdCBiZWVuIGNhdWdodAorIgkgICAgb3IgY2F1c2VzIGEgOmZpbmFsbHkgY2xhdXNlIHRvIGJlIGV4ZWN1dGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2lmIEV4dHJhVmltKCkKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCVhwYXRoIDEJCQkJIiBYOiAxCisJCWxldCBjYXVnaHQgPSAwCisJCSJJTlRFUlJVUFQKKwkJWHBhdGggMgkJCQkiIFg6IDAKKwkgICAgY2F0Y2ggL15WaW06SW50ZXJydXB0JC8KKwkJbGV0IGNhdWdodCA9IDEKKwkgICAgZmluYWxseQorCQlYcGF0aCA0CQkJCSIgWDogNAorCQlpZiBjYXVnaHQgfHwgJFZJTU5PSU5UVEhST1cKKwkJICAgIFhwYXRoIDgJCQkiIFg6IDgKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCAxNgkJCQkiIFg6IDAKKwkgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorCWZpbmFsbHkKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBpbnRlcnJ1cHQgZm9yICRWSU1OT0lOVFRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCWxldCBjYXVnaHQgPSAwCisJCXRyeQorCQkgICAgWHBhdGggMzIJCQkiIFg6IDMyCisJCSAgICBhc2RmCisJCSAgICBYcGF0aCA2NAkJCSIgWDogMAorCQljYXRjaCAvZG9fbm90X2NhdGNoLworCQkgICAgWHBhdGggMTI4CQkJIiBYOiAwCisJCWNhdGNoIC8uKi8JIklOVEVSUlVQVCAtIHRocm93IGludGVycnVwdCBpZiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDI1NgkJCSIgWDogMAorCQljYXRjaCAvLiovCisJCSAgICBYcGF0aCA1MTIJCQkiIFg6IDAKKwkJZmluYWxseQkJIklOVEVSUlVQVCAtIHRocm93IGludGVycnVwdCBpZiAkVklNTk9FUlJUSFJPVworCQkgICAgWHBhdGggMTAyNAkJCSIgWDogMTAyNAorCQllbmR0cnkKKwkgICAgY2F0Y2ggL15WaW06SW50ZXJydXB0JC8KKwkJbGV0IGNhdWdodCA9IDEKKwkgICAgZmluYWxseQorCQlYcGF0aCAyMDQ4CQkJIiBYOiAyMDQ4CisJCWlmIGNhdWdodCB8fCAkVklNTk9JTlRUSFJPVworCQkgICAgWHBhdGggNDA5NgkJCSIgWDogNDA5NgorCQllbmRpZgorCSAgICBlbmR0cnkKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDgxOTIJCQkJIiBYOiAwCisJICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKwlmaW5hbGx5CisJICAgIGJyZWFrCQkiIGRpc2NhcmQgaW50ZXJydXB0IGZvciAkVklNTk9JTlRUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIHRyeQorCQlsZXQgY2F1Z2h0ID0gMAorCQl0cnkKKwkJICAgIFhwYXRoIDE2Mzg0CQkJIiBYOiAxNjM4NAorCQkgICAgdGhyb3cgIngiCisJCSAgICBYcGF0aCAzMjc2OAkJCSIgWDogMAorCQljYXRjaCAvZG9fbm90X2NhdGNoLworCQkgICAgWHBhdGggNjU1MzYJCQkiIFg6IDAKKwkJY2F0Y2ggL3gvCSJJTlRFUlJVUFQKKwkJICAgIFhwYXRoIDEzMTA3MgkJIiBYOiAwCisJCWNhdGNoIC8uKi8KKwkJICAgIFhwYXRoIDI2MjE0NAkJIiBYOiAwCisJCWVuZHRyeQorCSAgICBjYXRjaCAvXlZpbTpJbnRlcnJ1cHQkLworCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCVhwYXRoIDUyNDI4OAkJCSIgWDogNTI0Mjg4CisJCWlmIGNhdWdodCB8fCAkVklNTk9JTlRUSFJPVworCQkgICAgWHBhdGggMTA0ODU3NgkJIiBYOiAxMDQ4NTc2CisJCWVuZGlmCisJICAgIGVuZHRyeQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggMjA5NzE1MgkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisJZmluYWxseQorCSAgICBicmVhawkJIiBkaXNjYXJkIGludGVycnVwdCBmb3IgJFZJTU5PSU5UVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICB0cnkKKwkJWHBhdGggNDE5NDMwNAkJCSIgWDogNDE5NDMwNAorCQkiSU5URVJSVVBUCisJCVhwYXRoIDgzODg2MDgJCQkiIFg6IDAKKwkgICAgY2F0Y2ggL2RvX25vdF9jYXRjaC8gIklOVEVSUlVQVAorCQlYcGF0aCAxNjc3NzIxNgkJCSIgWDogMAorCSAgICBjYXRjaCAvXlZpbTpJbnRlcnJ1cHQkLworCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCVhwYXRoIDMzNTU0NDMyCQkJIiBYOiAzMzU1NDQzMgorCQlpZiBjYXVnaHQgfHwgJFZJTU5PSU5UVEhST1cKKwkJICAgIFhwYXRoIDY3MTA4ODY0CQkiIFg6IDY3MTA4ODY0CisJCWVuZGlmCisJICAgIGVuZHRyeQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggMTM0MjE3NzI4CQkJIiBYOiAwCisJICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKwlmaW5hbGx5CisJICAgIGJyZWFrCQkiIGRpc2NhcmQgaW50ZXJydXB0IGZvciAkVklNTk9JTlRUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisKKyAgICBYcGF0aCAyNjg0MzU0NTYJCQkJIiBYOiAyNjg0MzU0NTYKKworZW5kaWYKKworWGNoZWNrIDM3NDg4OTUxNworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjI6ICBDYXRjaGluZyBlcnJvciBleGNlcHRpb25zCQkJCQkgICAge3t7MQorIgorIgkgICAgQW4gZXJyb3IgaW5zaWRlIGEgOnRyeS86ZW5kdHJ5IHJlZ2lvbiBpcyBjb252ZXJ0ZWQgdG8gYW4gZXhjZXB0aW9uCisiCSAgICBhbmQgY2FuIGJlIGNhdWdodC4gIFRoZSBlcnJvciBleGNlcHRpb24gaGFzIGEgIlZpbShjbWRuYW1lKToiIHByZWZpeAorIgkgICAgd2hlcmUgY21kbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmFpbGluZyBjb21tYW5kLCBvciBhICJWaW06IiBwcmVmaXgKKyIJICAgIGlmIG5vIGNvbW1hbmQgbmFtZSBpcyBrbm93bi4gIFRoZSAiVmltIiBwcmVmaXhlcyBjYW5ub3QgYmUgZmFrZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIE1TRyhlbnIsIGVtc2cpCisgICAgbGV0IGVuZ2xpc2ggPSB2OmxhbmcgPT0gIkMiIHx8IHY6bGFuZyA9fiAnXltFZV1uJworICAgIGlmIGE6ZW5yID09ICIiCisJWG91dCAiVE9ETzogQWRkIG1lc3NhZ2UgbnVtYmVyIGZvcjoiIGE6ZW1zZworCWxldCB2OmVycm1zZyA9ICI6IiAuIHY6ZXJybXNnCisgICAgZW5kaWYKKyAgICBsZXQgbWF0Y2ggPSAxCisgICAgaWYgdjplcnJtc2cgIX4gJ14nLmE6ZW5yLic6JyB8fCAoZW5nbGlzaCAmJiB2OmVycm1zZyAhfiBhOmVtc2cpCisJbGV0IG1hdGNoID0gMAorCWlmIHY6ZXJybXNnID09ICIiCisJICAgIFhvdXQgIk1lc3NhZ2UgbWlzc2luZy4iCisJZWxzZQorCSAgICBsZXQgdjplcnJtc2cgPSBlc2NhcGUodjplcnJtc2csICciJykKKwkgICAgWG91dCAiVW5leHBlY3RlZCBtZXNzYWdlOiIgdjplcnJtc2cKKwllbmRpZgorICAgIGVuZGlmCisgICAgcmV0dXJuIG1hdGNoCitlbmRmdW5jdGlvbgorCit3aGlsZSAxCisgICAgdHJ5CisJdHJ5CisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIHVubGV0IG5vdmFyCisJY2F0Y2ggL15WaW0odW5sZXQpOi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW0odW5sZXQpOicsICcnLCAiIikKKwlmaW5hbGx5CisJICAgIFhwYXRoIDEJCQkJIiBYOiAxCisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDIJCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmICFNU0coJ0UxMDgnLCAiTm8gc3VjaCB2YXJpYWJsZSIpCisJCVhwYXRoIDQJCQkJIiBYOiAwCisJICAgIGVuZGlmCisJZW5kdHJ5CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDgJCQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKyAgICBlbmR0cnkKK2VuZHdoaWxlCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgdGhyb3cgbm92YXIJCQkiIGVycm9yIGluIDp0aHJvdworCWNhdGNoIC9eVmltKHRocm93KTovCisJICAgIGxldCBjYXVnaHQgPSAxCisJICAgIGxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltKHRocm93KTonLCAnJywgIiIpCisJZmluYWxseQorCSAgICBYcGF0aCAxNgkJCQkiIFg6IDE2CisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDMyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIGNhdWdodCA/ICFNU0coJ0UxMjEnLCAiVW5kZWZpbmVkIHZhcmlhYmxlIikKKwkJCVwgOiAhTVNHKCdFMTUnLCAiSW52YWxpZCBleHByZXNzaW9uIikKKwkJWHBhdGggNjQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMTI4CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKyAgICBlbmR0cnkKK2VuZHdoaWxlCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgdGhyb3cgIlZpbTpmYWtlZCIJCSIgZXJyb3I6IGNhbm5vdCBmYWtlIFZpbSBleGNlcHRpb24KKwljYXRjaCAvXlZpbSh0aHJvdyk6LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbSh0aHJvdyk6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMjU2CQkJCSIgWDogMjU2CisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDUxMgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiAhTVNHKCdFNjA4JywgIkNhbm5vdCA6dGhyb3cgZXhjZXB0aW9ucyB3aXRoICdWaW0nIHByZWZpeCIpCisJCVhwYXRoIDEwMjQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMjA0OAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisgICAgZW5kdHJ5CitlbmR3aGlsZQorCitmdW5jdGlvbiEgRigpCisgICAgd2hpbGUgMQorICAgICIgTWlzc2luZyA6ZW5kd2hpbGUKK2VuZGZ1bmN0aW9uCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgY2FsbCBGKCkKKwljYXRjaCAvXlZpbShlbmRmdW5jdGlvbik6LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbShlbmRmdW5jdGlvbik6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggODE5MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiAhTVNHKCdFMTcwJywgIk1pc3NpbmcgOmVuZHdoaWxlIikKKwkJWHBhdGggMTYzODQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMzI3NjgJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGZpbmFsbHkKKwlicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworICAgIGVuZHRyeQorZW5kd2hpbGUKKword2hpbGUgMQorICAgIHRyeQorCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBFeGVjQXNTY3JpcHQgRgorCWNhdGNoIC9eVmltOi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW06JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCSAgICBpZiAhY2F1Z2h0ICYmICEkVklNTk9FUlJUSFJPVworCQlYcGF0aCAxMzEwNzIJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgaWYgIU1TRygnRTE3MCcsICJNaXNzaW5nIDplbmR3aGlsZSIpCisJCVhwYXRoIDI2MjE0NAkJCSIgWDogMAorCSAgICBlbmRpZgorCWVuZHRyeQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA1MjQyODgJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGZpbmFsbHkKKwlicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworICAgIGVuZHRyeQorZW5kd2hpbGUKKworZnVuY3Rpb24hIEcoKQorICAgIGNhbGwgRygpCitlbmRmdW5jdGlvbgorCit3aGlsZSAxCisgICAgdHJ5CisJbGV0IG1mZF9zYXZlID0gJm1mZAorCXNldCBtZmQ9MworCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBjYWxsIEcoKQorCWNhdGNoIC9eVmltKGNhbGwpOi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW0oY2FsbCk6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMTA0ODU3NgkJCSIgWDogMTA0ODU3NgorCSAgICBpZiAhY2F1Z2h0ICYmICEkVklNTk9FUlJUSFJPVworCQlYcGF0aCAyMDk3MTUyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmICFNU0coJ0UxMzInLCAiRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIpCisJCVhwYXRoIDQxOTQzMDQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWxldCAmbWZkID0gbWZkX3NhdmUKKwlicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworICAgIGVuZHRyeQorZW5kd2hpbGUKKworZnVuY3Rpb24hIEgoKQorICAgIHJldHVybiBIKCkKK2VuZGZ1bmN0aW9uCisKK3doaWxlIDEKKyAgICB0cnkKKwlsZXQgbWZkX3NhdmUgPSAmbWZkCisJc2V0IG1mZD0zCisJdHJ5CisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIGNhbGwgSCgpCisJY2F0Y2ggL15WaW0ocmV0dXJuKTovCisJICAgIGxldCBjYXVnaHQgPSAxCisJICAgIGxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltKHJldHVybik6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMTY3NzcyMTYJCQkiIFg6IDE2Nzc3MjE2CisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDMzNTU0NDMyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmICFNU0coJ0UxMzInLCAiRnVuY3Rpb24gY2FsbCBkZXB0aCBpcyBoaWdoZXIgdGhhbiAnbWF4ZnVuY2RlcHRoJyIpCisJCVhwYXRoIDY3MTA4ODY0CQkJIiBYOiAwCisJICAgIGVuZGlmCisJZW5kdHJ5CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWxldCAmbWZkID0gbWZkX3NhdmUKKwlicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworICAgIGVuZHRyeQorZW5kd2hpbGUKKwordW5sZXQhIGNhdWdodCBtZmRfc2F2ZQorZGVsZnVuY3Rpb24gRgorZGVsZnVuY3Rpb24gRworZGVsZnVuY3Rpb24gSAorWHBhdGggMjY4NDM1NDU2CQkJCQkiIFg6IDI2ODQzNTQ1NgorCitYY2hlY2sgMjg2MzMxMTUzCisKKyIgTGVhdmUgTVNHKCkgZm9yIHRoZSBuZXh0IHRlc3QuCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA2MzogIFN1cHByZXNzaW5nIGVycm9yIGV4Y2VwdGlvbnMgYnkgOnNpbGVudCEuCQkJICAgIHt7ezEKKyIKKyIJICAgIEEgOnNpbGVudCEgY29tbWFuZCBpbnNpZGUgYSA6dHJ5LzplbmR0cnkgcmVnaW9uIHN1cHByZXNzZXMgdGhlCisiCSAgICBjb252ZXJzaW9uIG9mIGVycm9ycyB0byBhbiBleGNlcHRpb24gYW5kIHRoZSBpbW1lZGlhdGUgYWJvcnRpb24gb24KKyIJICAgIGVycm9yLiAgV2hlbiB0aGUgY29tbWFuZHMgZXhlY3V0ZWQgYnkgdGhlIDpzaWxlbnQhIHRoZW1zZWx2ZXMgb3BlbgorIgkgICAgYSBuZXcgOnRyeS86ZW5kdHJ5IHJlZ2lvbiwgY29udmVyc2lvbiBvZiBlcnJvcnMgdG8gZXhjZXB0aW9uIGFuZAorIgkgICAgaW1tZWRpYXRlIGFib3J0aW9uIGlzIHN3aXRjaGVkIG9uIGFnYWluIC0gdW50aWwgdGhlIG5leHQgOnNpbGVudCEKKyIJICAgIGV0Yy4gIFRoZSA6c2lsZW50ISBoYXMgdGhlIGVmZmVjdCBvZiBzZXR0aW5nIHY6ZXJybXNnIHRvIHRoZSBlcnJvcgorIgkgICAgbWVzc2FnZSB0ZXh0ICh3aXRob3V0IGRpc3BsYXlpbmcgaXQpIGFuZCBjb250aW51aW5nIHdpdGggdGhlIG5leHQKKyIJICAgIHNjcmlwdCBsaW5lLgorIgorIgkgICAgV2hlbiBhIGNvbW1hbmQgdHJpZ2dlcmluZyBhdXRvY29tbWFuZHMgaXMgZXhlY3V0ZWQgYnkgOnNpbGVudCEKKyIJICAgIGluc2lkZSBhIDp0cnkvOmVuZHRyeSwgdGhlIGF1dG9jb21tYW5kIGV4ZWN1dGlvbiBpcyBub3Qgc3VwcHJlc3NlZAorIgkgICAgb24gZXJyb3IuCisiCisiCSAgICBUaGlzIHRlc3QgcmV1c2VzIHRoZSBmdW5jdGlvbiBNU0coKSBmcm9tIHRoZSBwcmV2aW91cyB0ZXN0LgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK1hsb29wSU5JVCEgMSA0CisKK2xldCB0YWtlbiA9ICIiCisKK2Z1bmN0aW9uISBTKG4pIGFib3J0CisgICAgWGxvb3BORVhUCisgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIkUiIC4gYTpuCisgICAgbGV0IHY6ZXJybXNnID0gIiIKKyAgICBleGVjICJhc2RmIiAuIGE6bgorCisgICAgIiBDaGVjayB0aGF0ICI6c2lsZW50ISIgY29udGludWVzOgorICAgIFhsb29wIDEKKworICAgICIgQ2hlY2sgdGhhdCAiOnNpbGVudCEiIHNldHMgInY6ZXJybXNnIjoKKyAgICBpZiBNU0coJ0U0OTInLCAiTm90IGFuIGVkaXRvciBjb21tYW5kIikKKwlYbG9vcCAyCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBGb28oKQorICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCWxldCBjYXVnaHQgPSAwCisJCSIgVGhpcyBpcyBub3Qgc2lsZW50OgorCQljYWxsIFMoMykJCQkJIiBYOiAwICogMTYKKwkgICAgY2F0Y2ggL15WaW06LworCQlsZXQgY2F1Z2h0ID0gMQorCQlsZXQgZXJybXNnMyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltOicsICcnLCAiIikKKwkJc2lsZW50ISBjYWxsIFMoNCkJCQkiIFg6IDMgKiA2NAorCSAgICBmaW5hbGx5CisJCWlmICFjYXVnaHQKKwkJICAgIGxldCBlcnJtc2czID0gdjplcnJtc2cKKwkJICAgICIgRG8gY2FsbCBTKDQpIGhlcmUgaWYgbm90IGV4ZWN1dGVkIGluIDpjYXRjaC4KKwkJICAgIHNpbGVudCEgY2FsbCBTKDQpCisJCWVuZGlmCisJCVhwYXRoIDEwNDg1NzYJCQkiIFg6IDEwNDg1NzYKKwkJaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDIwOTcxNTIJCSIgWDogMAorCQllbmRpZgorCQlsZXQgdjplcnJtc2cgPSBlcnJtc2czCisJCWlmICFNU0coJ0U0OTInLCAiTm90IGFuIGVkaXRvciBjb21tYW5kIikKKwkJICAgIFhwYXRoIDQxOTQzMDQJCSIgWDogMAorCQllbmRpZgorCQlzaWxlbnQhIGNhbGwgUyg1KQkJCSIgWDogMyAqIDI1NgorCQkiIEJyZWFrIG91dCBvZiB0cnkgY29uZHMgdGhhdCBjb3ZlciAiOnNpbGVudCEiLiAgVGhpcyBhbHNvCisJCSIgZGlzY2FyZHMgdGhlIGFib3J0aW5nIGVycm9yIHdoZW4gJFZJTU5PRVJSVEhST1cgaXMgbm9uLXplcm8uCisJCWJyZWFrCisJICAgIGVuZHRyeQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggODM4ODYwOAkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICAiIFRoaXMgaXMgYSBkb3VibGUgIjpzaWxlbnQhIiAoc2VlIGNhbGxlcikuCisgICAgc2lsZW50ISBjYWxsIFMoNikJCQkJCSIgWDogMyAqIDEwMjQKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBCYXIoKQorICAgIHRyeQorCXNpbGVudCEgY2FsbCBTKDIpCQkJCSIgWDogMyAqIDQKKwkJCQkJCQkiIFg6IDMgKiA0MDk2CisJc2lsZW50ISBleGVjdXRlICJjYWxsIEZvbygpIHwgY2FsbCBTKDcpIgorCXNpbGVudCEgY2FsbCBTKDgpCQkJCSIgWDogMyAqIDE2Mzg0CisgICAgZW5kdHJ5CSIgbm9ybWFsIGVuZCBvZiB0cnkgY29uZCB0aGF0IGNvdmVycyAiOnNpbGVudCEiCisgICAgIiBUaGlzIGhhcyBhICI6c2lsZW50ISIgZnJvbSB0aGUgY2FsbGVyOgorICAgIGNhbGwgUyg5KQkJCQkJCSIgWDogMyAqIDY1NTM2CitlbmRmdW5jdGlvbgorCitzaWxlbnQhIGNhbGwgUygxKQkJCQkJIiBYOiAzICogMQorc2lsZW50ISBjYWxsIEJhcigpCitzaWxlbnQhIGNhbGwgUygxMCkJCQkJCSIgWDogMyAqIDI2MjE0NAorCitsZXQgZXhwZWN0ZWQgPSAiRTFFMkUzRTRFNUU2RTdFOEU5RTEwIgoraWYgdGFrZW4gIT0gZXhwZWN0ZWQKKyAgICBYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDAKKyAgICBYb3V0ICIndGFrZW4nIGlzIiB0YWtlbiAiaW5zdGVhZCBvZiIgZXhwZWN0ZWQKK2VuZGlmCisKK2F1Z3JvdXAgVE1QCisgICAgYXV0b2NtZCBCdWZXcml0ZVBvc3QgKiBYcGF0aCAzMzU1NDQzMgkiIFg6IDMzNTU0NDMyCithdWdyb3VwIEVORAorCitYcGF0aCA2NzEwODg2NAkJCQkJIiBYOiA2NzEwODg2NAord3JpdGUgL2kvbS9wL28vcy9zL2kvYi9sL2UKK1hwYXRoIDEzNDIxNzcyOAkJCQkJIiBYOiAxMzQyMTc3MjgKKworYXV0b2NtZCEgVE1QCit1bmxldCEgY2F1Z2h0IGVycm1zZzMgdGFrZW4gZXhwZWN0ZWQKK2RlbGZ1bmN0aW9uIFMKK2RlbGZ1bmN0aW9uIEZvbworZGVsZnVuY3Rpb24gQmFyCitkZWxmdW5jdGlvbiBNU0cKKworWGNoZWNrIDIzNjk3ODEyNworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjQ6ICBFcnJvciBleGNlcHRpb25zIGFmdGVyIGVycm9yLCBpbnRlcnJ1cHQgb3IgOnRocm93CQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhbiBlcnJvciBvY2N1cnMgYWZ0ZXIgYW4gaW50ZXJydXB0IG9yIGEgOnRocm93IGJ1dCBiZWZvcmUKKyIJICAgIGEgbWF0Y2hpbmcgOmNhdGNoIGlzIHJlYWNoZWQsIGFsbCBmb2xsb3dpbmcgOmNhdGNoZXMgb2YgdGhhdCB0cnkKKyIJICAgIGJsb2NrIGFyZSBpZ25vcmVkLCBidXQgdGhlIGVycm9yIGV4Y2VwdGlvbiBjYW4gYmUgY2F1Z2h0IGJ5IHRoZSBuZXh0CisiCSAgICBzdXJyb3VuZGluZyB0cnkgY29uZGl0aW9uYWwuICBBbnkgcHJldmlvdXMgZXJyb3IgZXhjZXB0aW9uIGlzCisiCSAgICBkaXNjYXJkZWQuICBBbiBlcnJvciBpcyBpZ25vcmVkIHdoZW4gdGhlcmUgaXMgYSBwcmV2aW91cyBlcnJvciB0aGF0CisiCSAgICBoYXMgbm90IGJlZW4gY2F1Z2h0LgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2lmIEV4dHJhVmltKCkKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCVhwYXRoIDEJCQkJIiBYOiAxCisJCWxldCBjYXVnaHQgPSAwCisJCXdoaWxlIDEKKyIJCSAgICBpZiAxCisJCSAgICAiIE1pc3NpbmcgOmVuZGlmCisJCWVuZHdoaWxlCSIgdGhyb3cgZXJyb3IgZXhjZXB0aW9uCisJICAgIGNhdGNoIC9eVmltKC8KKwkJbGV0IGNhdWdodCA9IDEKKwkgICAgZmluYWxseQorCQlYcGF0aCAyCQkJCSIgWDogMgorCQlpZiBjYXVnaHQgfHwgJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDQJCQkiIFg6IDQKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA4CQkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisJZmluYWxseQorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisKKyAgICB3aGlsZSAxCisJdHJ5CisJICAgIHRyeQorCQlYcGF0aCAxNgkJCSIgWDogMTYKKwkJbGV0IGNhdWdodCA9IDAKKwkJdHJ5CisiCQkgICAgaWYgMQorCQkgICAgIiBNaXNzaW5nIDplbmRpZgorCQljYXRjaCAvLiovCSIgdGhyb3cgZXJyb3IgZXhjZXB0aW9uCisJCSAgICBYcGF0aCAzMgkJCSIgWDogMAorCQljYXRjaCAvLiovCisJCSAgICBYcGF0aCA2NAkJCSIgWDogMAorCQllbmR0cnkKKwkgICAgY2F0Y2ggL15WaW0oLworCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCVhwYXRoIDEyOAkJCSIgWDogMTI4CisJCWlmIGNhdWdodCB8fCAkVklNTk9FUlJUSFJPVworCQkgICAgWHBhdGggMjU2CQkJIiBYOiAyNTYKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA1MTIJCQkJIiBYOiAwCisJICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKwlmaW5hbGx5CisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCWxldCBjYXVnaHQgPSAwCisJCXRyeQorCQkgICAgWHBhdGggMTAyNAkJCSIgWDogMTAyNAorCQkgICAgIklOVEVSUlVQVAorCQljYXRjaCAvZG9fbm90X2NhdGNoLworCQkgICAgWHBhdGggMjA0OAkJCSIgWDogMAorIgkJICAgIGlmIDEKKwkJICAgICIgTWlzc2luZyA6ZW5kaWYKKwkJY2F0Y2ggLy4qLwkiIHRocm93IGVycm9yIGV4Y2VwdGlvbgorCQkgICAgWHBhdGggNDA5NgkJCSIgWDogMAorCQljYXRjaCAvLiovCisJCSAgICBYcGF0aCA4MTkyCQkJIiBYOiAwCisJCWVuZHRyeQorCSAgICBjYXRjaCAvXlZpbSgvCisJCWxldCBjYXVnaHQgPSAxCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMTYzODQJCQkiIFg6IDE2Mzg0CisJCWlmIGNhdWdodCB8fCAkVklNTk9FUlJUSFJPVworCQkgICAgWHBhdGggMzI3NjgJCQkiIFg6IDMyNzY4CisJCWVuZGlmCisJICAgIGVuZHRyeQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiAwCisJICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKwlmaW5hbGx5CisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCWxldCBjYXVnaHQgPSAwCisJCXRyeQorCQkgICAgWHBhdGggMTMxMDcyCQkiIFg6IDEzMTA3MgorCQkgICAgdGhyb3cgIngiCisJCWNhdGNoIC9kb19ub3RfY2F0Y2gvCisJCSAgICBYcGF0aCAyNjIxNDQJCSIgWDogMAorIgkJICAgIGlmIDEKKwkJICAgICIgTWlzc2luZyA6ZW5kaWYKKwkJY2F0Y2ggL3gvCSIgdGhyb3cgZXJyb3IgZXhjZXB0aW9uCisJCSAgICBYcGF0aCA1MjQyODgJCSIgWDogMAorCQljYXRjaCAvLiovCisJCSAgIFhwYXRoIDEwNDg1NzYJCSIgWDogMAorCQllbmR0cnkKKwkgICAgY2F0Y2ggL15WaW0oLworCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCVhwYXRoIDIwOTcxNTIJCQkiIFg6IDIwOTcxNTIKKwkJaWYgY2F1Z2h0IHx8ICRWSU1OT0VSUlRIUk9XCisJCSAgICBYcGF0aCA0MTk0MzA0CQkiIFg6IDQxOTQzMDQKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA4Mzg4NjA4CQkJIiBYOiAwCisJICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKwlmaW5hbGx5CisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgdHJ5CisJCWxldCBjYXVnaHQgPSAwCisJCVhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorIgkJZW5kaWYJCSIgOmVuZGlmIHdpdGhvdXQgOmlmOyB0aHJvdyBlcnJvciBleGNlcHRpb24KKyIJCWlmIDEKKwkJIiBNaXNzaW5nIDplbmRpZgorCSAgICBjYXRjaCAvZG9fbm90X2NhdGNoLyAiIGlnbm9yZSBuZXcgZXJyb3IKKwkJWHBhdGggMzM1NTQ0MzIJCQkiIFg6IDAKKwkgICAgY2F0Y2ggL15WaW0oZW5kaWYpOi8KKwkJbGV0IGNhdWdodCA9IDEKKwkgICAgY2F0Y2ggL15WaW0oLworCQlYcGF0aCA2NzEwODg2NAkJCSIgWDogMAorCSAgICBmaW5hbGx5CisJCVhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMTM0MjE3NzI4CisJCWlmIGNhdWdodCB8fCAkVklNTk9FUlJUSFJPVworCQkgICAgWHBhdGggMjY4NDM1NDU2CQkiIFg6IDI2ODQzNTQ1NgorCQllbmRpZgorCSAgICBlbmR0cnkKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDUzNjg3MDkxMgkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisJZmluYWxseQorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCisKKyAgICBYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCitlbmRpZgorCitYY2hlY2sgMTQ5OTY0NTMzNQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjU6ICBFcnJvcnMgaW4gdGhlIC9wYXR0ZXJuLyBhcmd1bWVudCBvZiBhIDpjYXRjaAkJICAgIHt7ezEKKyIKKyIJICAgIE9uIGFuIGVycm9yIGluIHRoZSAvcGF0dGVybi8gYXJndW1lbnQgb2YgYSA6Y2F0Y2gsIHRoZSA6Y2F0Y2ggZG9lcworIgkgICAgbm90IG1hdGNoLiAgQW55IGZvbGxvd2luZyA6Y2F0Y2hlcyBvZiB0aGUgc2FtZSA6dHJ5LzplbmR0cnkgZG9uJ3QKKyIJICAgIG1hdGNoIGVpdGhlci4gIEZpbmFsbHkgY2xhdXNlcyBhcmUgZXhlY3V0ZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIE1TRyhlbnIsIGVtc2cpCisgICAgbGV0IGVuZ2xpc2ggPSB2OmxhbmcgPT0gIkMiIHx8IHY6bGFuZyA9fiAnXltFZV1uJworICAgIGlmIGE6ZW5yID09ICIiCisJWG91dCAiVE9ETzogQWRkIG1lc3NhZ2UgbnVtYmVyIGZvcjoiIGE6ZW1zZworCWxldCB2OmVycm1zZyA9ICI6IiAuIHY6ZXJybXNnCisgICAgZW5kaWYKKyAgICBsZXQgbWF0Y2ggPSAxCisgICAgaWYgdjplcnJtc2cgIX4gJ14nLmE6ZW5yLic6JyB8fCAoZW5nbGlzaCAmJiB2OmVycm1zZyAhfiBhOmVtc2cpCisJbGV0IG1hdGNoID0gMAorCWlmIHY6ZXJybXNnID09ICIiCisJICAgIFhvdXQgIk1lc3NhZ2UgbWlzc2luZy4iCisJZWxzZQorCSAgICBsZXQgdjplcnJtc2cgPSBlc2NhcGUodjplcnJtc2csICciJykKKwkgICAgWG91dCAiVW5leHBlY3RlZCBtZXNzYWdlOiIgdjplcnJtc2cKKwllbmRpZgorICAgIGVuZGlmCisgICAgcmV0dXJuIG1hdGNoCitlbmRmdW5jdGlvbgorCit0cnkKKyAgICB0cnkKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl0aHJvdyAib29wcyIKKyAgICBjYXRjaCAvXm9vcHMkLworCVhwYXRoIDIJCQkJCSIgWDogMgorICAgIGNhdGNoIC9cKS8JCSIgbm90IGNoZWNrZWQ7IGV4Y2VwdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhdWdodAorCVhwYXRoIDQJCQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDgJCQkJCSIgWDogOAorY2F0Y2ggLy4qLworICAgIFhwYXRoIDE2CQkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworZnVuY3Rpb24hIEYoKQorICAgIHRyeQorCWxldCBjYXVnaHQgPSAwCisJdHJ5CisJICAgIHRyeQorCQlYcGF0aCAzMgkJCSIgWDogMzIKKwkJdGhyb3cgImFiIgorCSAgICBjYXRjaCAvYWJjLwkiIGRvZXMgbm90IGNhdGNoCisJCVhwYXRoIDY0CQkJIiBYOiAwCisJICAgIGNhdGNoIC9cKS8JIiBlcnJvcjsgZGlzY2FyZHMgZXhjZXB0aW9uCisJCVhwYXRoIDEyOAkJCSIgWDogMAorCSAgICBjYXRjaCAvLiovCSIgbm90IGNoZWNrZWQKKwkJWHBhdGggMjU2CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJWHBhdGggNTEyCQkJIiBYOiA1MTIKKwkgICAgZW5kdHJ5CisJICAgIFhwYXRoIDEwMjQJCQkJIiBYOiAwCisJY2F0Y2ggL15hYiQvCSIgY2hlY2tlZCwgYnV0IG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDAKKwljYXRjaCAvXlZpbShjYXRjaCk6LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbShjYXRjaCk6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggODE5MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiBjYXVnaHQgPyAhTVNHKCdFNTUnLCAnVW5tYXRjaGVkIFxcKScpCisJCQlcIDogIU1TRygnRTQ3NScsICJJbnZhbGlkIGFyZ3VtZW50IikKKwkJWHBhdGggMTYzODQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgaWYgIWNhdWdodAorCQlyZXR1cm4JfCAiIGRpc2NhcmQgZXJyb3IKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMzI3NjgJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorZW5kZnVuY3Rpb24KKworY2FsbCBGKCkKK1hwYXRoIDY1NTM2CQkJCQkiIFg6IDY1NTM2CisKK2RlbGZ1bmN0aW9uIE1TRworZGVsZnVuY3Rpb24gRgordW5sZXQhIGNhdWdodAorCitYY2hlY2sgNzAxODcKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDY2OiAgU3RvcCByYW5nZSA6Y2FsbCBvbiBlcnJvciwgaW50ZXJydXB0LCBvciA6dGhyb3cJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGEgZnVuY3Rpb24gd2hpY2ggaXMgbXVsdGlwbHkgY2FsbGVkIGZvciBhIHJhbmdlIHNpbmNlIGl0CisiCSAgICBkb2Vzbid0IGhhbmRsZSB0aGUgcmFuZ2UgaXRzZWxmIGhhcyBhbiBlcnJvciBpbiBhIGNvbW1hbmQKKyIJICAgIGR5bmFtaWNhbGx5IGVuY2xvc2VkIGJ5IDp0cnkvOmVuZHRyeSBvciBnZXRzIGFuIGludGVycnVwdCBvcgorIgkgICAgZXhlY3V0ZXMgYSA6dGhyb3csIG5vIG1vcmUgY2FsbHMgZm9yIHRoZSByZW1haW5pbmcgbGluZXMgaW4gdGhlCisiCSAgICByYW5nZSBhcmUgbWFkZS4gIE9uIGFuIGVycm9yIGluIGEgY29tbWFuZCBub3QgZHluYW1pY2FsbHkgZW5jbG9zZWQKKyIJICAgIGJ5IDp0cnkvOmVuZHRyeSwgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFnYWluIGZvciB0aGUgcmVtYWluaW5nCisiCSAgICBsaW5lcyBpbiB0aGUgcmFuZ2UuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgbGV0IGZpbGUgPSB0ZW1wbmFtZSgpCisgICAgZXhlYyAiZWRpdCIgZmlsZQorCisgICAgaW5zZXJ0CitsaW5lIDEKK2xpbmUgMgorbGluZSAzCisuCisKKyAgICBYbG9vcElOSVQhIDEgMgorCisgICAgbGV0IHRha2VuID0gIiIKKyAgICBsZXQgZXhwZWN0ZWQgPSAiRzFFRjFFKDEpRjFFKDIpRjFFKDMpRzJFRjJFKDEpRzNJRjNJKDEpRzRURjRUKDEpRzVBRjVBKDEpIgorCisgICAgZnVuY3Rpb24hIEYocmVhc29uLCBuKSBhYm9ydAorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICJGIiAuIGE6biAuCisJICAgIFwgc3Vic3RpdHV0ZShhOnJlYXNvbiwgJ1woXGxcKS4qJywgJ1x1XDEnLCAiIikgLgorCSAgICBcICIoIiAuIGxpbmUoIi4iKSAuICIpIgorCisJaWYgYTpyZWFzb24gPT0gImVycm9yIgorCSAgICBhc2RmCisJZWxzZWlmIGE6cmVhc29uID09ICJpbnRlcnJ1cHQiCisJICAgICJJTlRFUlJVUFQKKwkgICAgbGV0IGR1bW15ID0gMAorCWVsc2VpZiBhOnJlYXNvbiA9PSAidGhyb3ciCisJICAgIHRocm93ICJ4eXoiCisJZWxzZWlmIGE6cmVhc29uID09ICJhYm9ydGluZyBlcnJvciIKKwkgICAgWGxvb3BORVhUCisJICAgIGlmIGc6dGFrZW4gIT0gZzpleHBlY3RlZAorCQlYbG9vcCAxCQkJCSIgWDogMAorCQlYb3V0ICIndGFrZW4nIGlzIiBnOnRha2VuICJpbnN0ZWFkIG9mIiBnOmV4cGVjdGVkCisJICAgIGVuZGlmCisJICAgIHRyeQorCQlid2lwZW91dCEKKwkJY2FsbCBkZWxldGUoZmlsZSkKKwkJYXNkZgorCSAgICBlbmR0cnkKKwllbmRpZgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgRyhyZWFzb24sIG4pCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIkciIC4gYTpuIC4KKwkgICAgXCBzdWJzdGl0dXRlKGE6cmVhc29uLCAnXChcbFwpLionLCAnXHVcMScsICIiKQorCTEsM2NhbGwgRihhOnJlYXNvbiwgYTpuKQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBYcGF0aCA4CQkJCQkiIFg6IDgKKyAgICBjYWxsIEcoImVycm9yIiwgMSkKKyAgICB0cnkKKwlYcGF0aCAxNgkJCQkiIFg6IDE2CisJdHJ5CisJICAgIGNhbGwgRygiZXJyb3IiLCAyKQorCSAgICBYcGF0aCAzMgkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDY0CQkJCSIgWDogNjQKKwkgICAgdHJ5CisJCWNhbGwgRygiaW50ZXJydXB0IiwgMykKKwkJWHBhdGggMTI4CQkJIiBYOiAwCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMjU2CQkJIiBYOiAyNTYKKwkJdHJ5CisJCSAgICBjYWxsIEcoInRocm93IiwgNCkKKwkJICAgIFhwYXRoIDUxMgkJCSIgWDogMAorCQllbmR0cnkKKwkgICAgZW5kdHJ5CisJZW5kdHJ5CisgICAgY2F0Y2ggL3h5ei8KKwlYcGF0aCAxMDI0CQkJCSIgWDogMTAyNAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAyMDQ4CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiBFeHRyYVZpbVRocm93cG9pbnQoKQorICAgIGVuZHRyeQorICAgIFhwYXRoIDQwOTYJCQkJCSIgWDogNDA5NgorICAgIGNhbGwgRygiYWJvcnRpbmcgZXJyb3IiLCA1KQorICAgIFhwYXRoIDgxOTIJCQkJCSIgWDogMAorICAgIFhvdXQgIid0YWtlbicgaXMiIHRha2VuICJpbnN0ZWFkIG9mIiBleHBlY3RlZAorCitlbmRpZgorCitYY2hlY2sgNTQ2NAorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjc6ICA6dGhyb3cgYWNjcm9zcyA6Y2FsbCBjb21tYW5kCQkJCSAgICB7e3sxCisiCisiCSAgICBPbiBhIGNhbGwgY29tbWFuZCwgYW4gZXhjZXB0aW9uIG1pZ2h0IGJlIHRocm93biB3aGVuIGV2YWx1YXRpbmcgdGhlCisiCSAgICBmdW5jdGlvbiBuYW1lLCBkdXJpbmcgZXZhbHVhdGlvbiBvZiB0aGUgYXJndW1lbnRzLCBvciB3aGVuIHRoZQorIgkgICAgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuICBUaGUgZXhjZXB0aW9uIGNhbiBiZSBjYXVnaHQgYnkgdGhlCisiCSAgICBjYWxsZXIuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIFRIUk9XKHgsIG4pCisgICAgaWYgYTpuID09IDEKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKyAgICBlbHNlaWYgYTpuID09IDIKKwlYcGF0aCAyCQkJCQkiIFg6IDIKKyAgICBlbHNlaWYgYTpuID09IDMKKwlYcGF0aCA0CQkJCQkiIFg6IDQKKyAgICBlbmRpZgorICAgIHRocm93IGE6eAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIE5BTUUoeCwgbikKKyAgICBpZiBhOm4gPT0gMQorCVhwYXRoIDgJCQkJCSIgWDogMAorICAgIGVsc2VpZiBhOm4gPT0gMgorCVhwYXRoIDE2CQkJCSIgWDogMTYKKyAgICBlbHNlaWYgYTpuID09IDMKKwlYcGF0aCAzMgkJCQkiIFg6IDMyCisgICAgZWxzZWlmIGE6biA9PSA0CisJWHBhdGggNjQJCQkJIiBYOiA2NAorICAgIGVuZGlmCisgICAgcmV0dXJuIGE6eAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEFSRyh4LCBuKQorICAgIGlmIGE6biA9PSAxCisJWHBhdGggMTI4CQkJCSIgWDogMAorICAgIGVsc2VpZiBhOm4gPT0gMgorCVhwYXRoIDI1NgkJCQkiIFg6IDAKKyAgICBlbHNlaWYgYTpuID09IDMKKwlYcGF0aCA1MTIJCQkJIiBYOiA1MTIKKyAgICBlbHNlaWYgYTpuID09IDQKKwlYcGF0aCAxMDI0CQkJCSIgWDogMTAyNAorICAgIGVuZGlmCisgICAgcmV0dXJuIGE6eAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEYoeCwgbikKKyAgICBpZiBhOm4gPT0gMgorCVhwYXRoIDIwNDgJCQkJIiBYOiAwCisgICAgZWxzZWlmIGE6biA9PSA0CisJWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKyAgICBlbmRpZgorZW5kZnVuY3Rpb24KKwordHJ5CisKKyAgICB0cnkKKwlYcGF0aCA4MTkyCQkJCSIgWDogODE5MgorCWNhbGwge05BTUUoVEhST1coIm5hbWUiLCAxKSwgMSl9KEFSRyg0NzExLCAxKSwgMSkKKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXm5hbWUkLworCVhwYXRoIDMyNzY4CQkJCSIgWDogMzI3NjgKKyAgICBjYXRjaCAvLiovCisJWHBhdGggNjU1MzYJCQkJIiBYOiAwCisJWG91dCAiMToiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCAxMzEwNzIJCQkJIiBYOiAxMzEwNzIKKwljYWxsIHtOQU1FKCJGIiwgMil9KEFSRyhUSFJPVygiYXJnIiwgMiksIDIpLCAyKQorCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXmFyZyQvCisJWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisJWG91dCAiMjoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorCWNhbGwge05BTUUoIlRIUk9XIiwgMyl9KEFSRygiY2FsbCIsIDMpLCAzKQorCVhwYXRoIDQxOTQzMDQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15jYWxsJC8KKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogODM4ODYwOAorICAgIGNhdGNoIC9eMCQvCSAgICAiIGRlZmF1bHQgcmV0dXJuIHZhbHVlCisJWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAwCisJWG91dCAiMzoiIHY6dGhyb3dwb2ludAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDAKKwlYb3V0ICIzOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDY3MTA4ODY0CQkJCSIgWDogNjcxMDg4NjQKKwljYWxsIHtOQU1FKCJGIiwgNCl9KEFSRyg0NzExLCA0KSwgNCkKKwlYcGF0aCAxMzQyMTc3MjgJCQkJIiBYOiAxMzQyMTc3MjgKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorCVhvdXQgIjQ6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCitjYXRjaCAvXjAkLwkgICAgIiBkZWZhdWx0IHJldHVybiB2YWx1ZQorICAgIFhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKKyAgICBYb3V0IHY6dGhyb3dwb2ludAorY2F0Y2ggLy4qLworICAgIFhwYXRoIDEwNzM3NDE4MjQJCQkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CisKK2RlbGZ1bmN0aW9uIEYKKworWGNoZWNrIDIxMjUxNDQyMworCisiIExlYXZlIFRIUk9XKCksIE5BTUUoKSwgYW5kIEFSRygpIGZvciB0aGUgbmV4dCB0ZXN0LgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNjg6ICA6dGhyb3cgYWNjcm9zcyBmdW5jdGlvbiBjYWxscyBpbiBleHByZXNzaW9ucwkJICAgIHt7ezEKKyIKKyIJICAgIE9uIGEgZnVuY3Rpb24gY2FsbCB3aXRoaW4gYW4gZXhwcmVzc2lvbiwgYW4gZXhjZXB0aW9uIG1pZ2h0IGJlCisiCSAgICB0aHJvd24gd2hlbiBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbiBuYW1lLCBkdXJpbmcgZXZhbHVhdGlvbiBvZiB0aGUKKyIJICAgIGFyZ3VtZW50cywgb3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuICBUaGUgZXhjZXB0aW9uCisiCSAgICBjYW4gYmUgY2F1Z2h0IGJ5IHRoZSBjYWxsZXIuCisiCisiCSAgICBUaGlzIHRlc3QgcmV1c2VzIHRoZSBmdW5jdGlvbnMgVEhST1coKSwgTkFNRSgpLCBhbmQgQVJHKCkgZnJvbSB0aGUKKyIJICAgIHByZXZpb3VzIHRlc3QuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworZnVuY3Rpb24hIEYoeCwgbikKKyAgICBpZiBhOm4gPT0gMgorCVhwYXRoIDIwNDgJCQkJIiBYOiAwCisgICAgZWxzZWlmIGE6biA9PSA0CisJWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKyAgICBlbmRpZgorICAgIHJldHVybiBhOngKK2VuZGZ1bmN0aW9uCisKK3VubGV0ISB2YXIxIHZhcjIgdmFyMyB2YXI0CisKK3RyeQorCisgICAgdHJ5CisJWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwlsZXQgdmFyMSA9IHtOQU1FKFRIUk9XKCJuYW1lIiwgMSksIDEpfShBUkcoNDcxMSwgMSksIDEpCisJWHBhdGggMTYzODQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15uYW1lJC8KKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDY1NTM2CQkJCSIgWDogMAorCVhvdXQgIjE6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMTMxMDcyCQkJCSIgWDogMTMxMDcyCisJbGV0IHZhcjIgPSB7TkFNRSgiRiIsIDIpfShBUkcoVEhST1coImFyZyIsIDIpLCAyKSwgMikKKwlYcGF0aCAyNjIxNDQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15hcmckLworCVhwYXRoIDUyNDI4OAkJCQkiIFg6IDUyNDI4OAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorCVhvdXQgIjI6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDIwOTcxNTIKKwlsZXQgdmFyMyA9IHtOQU1FKCJUSFJPVyIsIDMpfShBUkcoImNhbGwiLCAzKSwgMykKKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorICAgIGNhdGNoIC9eY2FsbCQvCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKyAgICBjYXRjaCAvXjAkLwkgICAgIiBkZWZhdWx0IHJldHVybiB2YWx1ZQorCVhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorCVhvdXQgIjM6IiB2OnRocm93cG9pbnQKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAwCisJWG91dCAiMzoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA2NzEwODg2NAkJCQkiIFg6IDY3MTA4ODY0CisJbGV0IHZhcjQgPSB7TkFNRSgiRiIsIDQpfShBUkcoNDcxMSwgNCksIDQpCisJWHBhdGggMTM0MjE3NzI4CQkJCSIgWDogMTM0MjE3NzI4CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDI2ODQzNTQ1NgkJCQkiIFg6IDAKKwlYb3V0ICI0OiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworY2F0Y2ggL14wJC8JICAgICIgZGVmYXVsdCByZXR1cm4gdmFsdWUKKyAgICBYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCisgICAgWG91dCB2OnRocm93cG9pbnQKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2VuZHRyeQorCitpZiBleGlzdHMoInZhcjEiKSB8fCBleGlzdHMoInZhcjIiKSB8fCBleGlzdHMoInZhcjMiKSB8fAorCSAgICBcICFleGlzdHMoInZhcjQiKSB8fCB2YXI0ICE9IDQ3MTEKKyAgICAiIFRoZSBYcGF0aCBjb21tYW5kIGRvZXMgbm90IGFjY2VwdCAyXjMxIChuZWdhdGl2ZSk7IGFkZCBleHBsaWNpdGx5OgorICAgIGxldCBYcGF0aCA9IFhwYXRoICsgMjE0NzQ4MzY0OAkJIiBYOiAwCisgICAgaWYgZXhpc3RzKCJ2YXIxIikKKwlYb3V0ICJ2YXIxID0iIHZhcjEKKyAgICBlbmRpZgorICAgIGlmIGV4aXN0cygidmFyMiIpCisJWG91dCAidmFyMiA9IiB2YXIyCisgICAgZW5kaWYKKyAgICBpZiBleGlzdHMoInZhcjMiKQorCVhvdXQgInZhcjMgPSIgdmFyMworICAgIGVuZGlmCisgICAgaWYgIWV4aXN0cygidmFyNCIpCisJWG91dCAidmFyNCB1bnNldCIKKyAgICBlbHNlaWYgdmFyNCAhPSA0NzExCisJWG91dCAidmFyNCA9IiB2YXI0CisgICAgZW5kaWYKK2VuZGlmCisKK3VubGV0ISB2YXIxIHZhcjIgdmFyMyB2YXI0CitkZWxmdW5jdGlvbiBUSFJPVworZGVsZnVuY3Rpb24gTkFNRQorZGVsZnVuY3Rpb24gQVJHCitkZWxmdW5jdGlvbiBGCisKK1hjaGVjayAyMTI1MTQ0MjMKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDY5OiAgOnRocm93IGFjY3Jvc3MgOmlmLCA6ZWxzZWlmLCA6d2hpbGUJCQkJICAgIHt7ezEKKyIKKyIJICAgIE9uIGFuIDppZiwgOmVsc2VpZiwgb3IgOndoaWxlIGNvbW1hbmQsIGFuIGV4Y2VwdGlvbiBtaWdodCBiZSB0aHJvd24KKyIJICAgIGR1cmluZyBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHRvIHRlc3QuICBUaGUgZXhjZXB0aW9uIGNhbiBiZQorIgkgICAgY2F1Z2h0IGJ5IHRoZSBzY3JpcHQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworWGxvb3BJTklUISAxIDIKKworZnVuY3Rpb24hIFRIUk9XKHgpCisgICAgWGxvb3BORVhUCisgICAgWGxvb3AgMQkJCQkJIiBYOiAxICsgMiArIDQKKyAgICB0aHJvdyBhOngKK2VuZGZ1bmN0aW9uCisKK3RyeQorCisgICAgdHJ5CisJWHBhdGggOAkJCQkJIiBYOiA4CisJaWYgNDcxMSA9PSBUSFJPVygiaWYiKSArIDExMQorCSAgICBYcGF0aCAxNgkJCQkiIFg6IDAKKwllbHNlCisJICAgIFhwYXRoIDMyCQkJCSIgWDogMAorCWVuZGlmCisJWHBhdGggNjQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15pZiQvCisJWHBhdGggMTI4CQkJCSIgWDogMTI4CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDI1NgkJCQkiIFg6IDAKKwlYb3V0ICJpZjoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA1MTIJCQkJIiBYOiA1MTIKKwlpZiA0NzExID09IDQgKyA3ICsgMSArIDEKKwkgICAgWHBhdGggMTAyNAkJCQkiIFg6IDAKKwllbHNlaWYgNDcxMSA9PSBUSFJPVygiZWxzZWlmIikgKyAyMjIKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDAKKwllbHNlCisJICAgIFhwYXRoIDQwOTYJCQkJIiBYOiAwCisJZW5kaWYKKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorICAgIGNhdGNoIC9eZWxzZWlmJC8KKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDE2Mzg0CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDMyNzY4CQkJCSIgWDogMAorCVhvdXQgImVsc2VpZjoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA2NTUzNgkJCQkiIFg6IDY1NTM2CisJd2hpbGUgNDcxMSA9PSBUSFJPVygid2hpbGUiKSArIDQ3MTEKKwkgICAgWHBhdGggMTMxMDcyCQkJIiBYOiAwCisJICAgIGJyZWFrCisJZW5kd2hpbGUKKwlYcGF0aCAyNjIxNDQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL153aGlsZSQvCisJWHBhdGggNTI0Mjg4CQkJCSIgWDogNTI0Mjg4CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisJWG91dCAid2hpbGU6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCitjYXRjaCAvXjAkLwkgICAgIiBkZWZhdWx0IHJldHVybiB2YWx1ZQorICAgIFhwYXRoIDIwOTcxNTIJCQkJIiBYOiAwCisgICAgWG91dCB2OnRocm93cG9pbnQKK2NhdGNoIC8uKi8KKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgWHBhdGggNDE5NDMwNAkJCQkiIFg6IDAKK2VuZHRyeQorCitYcGF0aCA4Mzg4NjA4CQkJCQkiIFg6IDgzODg2MDgKKworZGVsZnVuY3Rpb24gVEhST1cKKworWGNoZWNrIDg5OTU0NzEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDcwOiAgOnRocm93IGFjY3Jvc3MgOnJldHVybiBvciA6dGhyb3cJCQkJICAgIHt7ezEKKyIKKyIJICAgIE9uIGEgOnJldHVybiBvciA6dGhyb3cgY29tbWFuZCwgYW4gZXhjZXB0aW9uIG1pZ2h0IGJlIHRocm93biBkdXJpbmcKKyIJICAgIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gdG8gcmV0dXJuIG9yIHRocm93LCByZXNwZWN0aXZlbHkuICBUaGUKKyIJICAgIGV4Y2VwdGlvbiBjYW4gYmUgY2F1Z2h0IGJ5IHRoZSBzY3JpcHQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworbGV0IHRha2VuID0gIiIKKworZnVuY3Rpb24hIFRIUk9XKHgsIG4pCisgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIlQiIC4gYTpuCisgICAgdGhyb3cgYTp4CitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgRih4LCB5LCBuKQorICAgIGxldCBnOnRha2VuID0gZzp0YWtlbiAuICJGIiAuIGE6bgorICAgIHJldHVybiBhOnggKyBUSFJPVyhhOnksIGE6bikKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBHKHgsIHksIG4pCisgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIkciIC4gYTpuCisgICAgdGhyb3cgYTp4IC4gVEhST1coYTp5LCBhOm4pCisgICAgcmV0dXJuIGE6eAorZW5kZnVuY3Rpb24KKwordHJ5CisgICAgdHJ5CisJWHBhdGggMQkJCQkJIiBYOiAxCisJY2FsbCBGKDQ3MTEsICJyZXR1cm4iLCAxKQorCVhwYXRoIDIJCQkJCSIgWDogMAorICAgIGNhdGNoIC9ecmV0dXJuJC8KKwlYcGF0aCA0CQkJCQkiIFg6IDQKKyAgICBjYXRjaCAvLiovCisJWHBhdGggOAkJCQkJIiBYOiAwCisJWG91dCAicmV0dXJuOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDE2CQkJCSIgWDogMTYKKwlsZXQgdmFyID0gRig0NzEyLCAicmV0dXJuLXZhciIsIDIpCisJWHBhdGggMzIJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15yZXR1cm4tdmFyJC8KKwlYcGF0aCA2NAkJCQkiIFg6IDY0CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDEyOAkJCQkiIFg6IDAKKwlYb3V0ICJyZXR1cm4tdmFyOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJdW5sZXQhIHZhcgorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisJdGhyb3cgImV4Y2VwdDEiIC4gVEhST1coInRocm93MSIsIDMpCisJWHBhdGggNTEyCQkJCSIgWDogMAorICAgIGNhdGNoIC9eZXhjZXB0MS8KKwlYcGF0aCAxMDI0CQkJCSIgWDogMAorICAgIGNhdGNoIC9edGhyb3cxJC8KKwlYcGF0aCAyMDQ4CQkJCSIgWDogMjA0OAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA0MDk2CQkJCSIgWDogMAorCVhvdXQgInRocm93MToiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA4MTkyCQkJCSIgWDogODE5MgorCWNhbGwgRygiZXhjZXB0MiIsICJ0aHJvdzIiLCA0KQorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMAorICAgIGNhdGNoIC9eZXhjZXB0Mi8KKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXnRocm93MiQvCisJWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAxMzEwNzIJCQkJIiBYOiAwCisJWG91dCAidGhyb3cyOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDI2MjE0NAorCWxldCB2YXIgPSBHKCJleGNlcHQzIiwgInRocm93MyIsIDUpCisJWHBhdGggNTI0Mjg4CQkJCSIgWDogMAorICAgIGNhdGNoIC9eZXhjZXB0My8KKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorICAgIGNhdGNoIC9edGhyb3czJC8KKwlYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorCVhvdXQgInRocm93MzoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCXVubGV0ISB2YXIKKyAgICBlbmR0cnkKKworICAgIGxldCBleHBlY3RlZCA9ICJGMVQxRjJUMlQzRzRUNEc1VDUiCisgICAgaWYgdGFrZW4gIT0gZXhwZWN0ZWQKKwlYcGF0aCA4Mzg4NjA4CQkJCSIgWDogMAorCVhvdXQgIid0YWtlbicgaXMiIHRha2VuICJpbnN0ZWFkIG9mIiBleHBlY3RlZAorICAgIGVuZGlmCisKK2NhdGNoIC9eMCQvCSAgICAiIGRlZmF1bHQgcmV0dXJuIHZhbHVlCisgICAgWHBhdGggMTY3NzcyMTYJCQkJIiBYOiAwCisgICAgWG91dCB2OnRocm93cG9pbnQKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAzMzU1NDQzMgkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworWHBhdGggNjcxMDg4NjQJCQkJCSIgWDogNjcxMDg4NjQKKwordW5sZXQgdGFrZW4gZXhwZWN0ZWQKK2RlbGZ1bmN0aW9uIFRIUk9XCitkZWxmdW5jdGlvbiBGCitkZWxmdW5jdGlvbiBHCisKK1hjaGVjayA2OTU0NDI3NworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzE6ICA6dGhyb3cgYWNjcm9zcyA6ZWNobyB2YXJpYW50cyBhbmQgOmV4ZWN1dGUJCQkgICAge3t7MQorIgorIgkgICAgT24gYW4gOmVjaG8sIDplY2hvbiwgOmVjaG9tc2csIDplY2hvZXJyLCBvciA6ZXhlY3V0ZSBjb21tYW5kLCBhbgorIgkgICAgZXhjZXB0aW9uIG1pZ2h0IGJlIHRocm93biBkdXJpbmcgZXZhbHVhdGlvbiBvZiB0aGUgYXJndW1lbnRzIHRvCisiCSAgICBiZSBkaXNwbGF5ZWQgb3IgZXhlY3V0ZWQgYXMgYSBjb21tYW5kLCByZXNwZWN0aXZlbHkuICBBbnkgZm9sbG93aW5nCisiCSAgICBhcmd1bWVudHMgYXJlIG5vdCBldmFsdWF0ZWQsIHRoZW4uICBUaGUgZXhjZXB0aW9uIGNhbiBiZSBjYXVnaHQgYnkKKyIJICAgIHRoZSBzY3JpcHQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworbGV0IHRha2VuID0gIiIKKworZnVuY3Rpb24hIFRIUk9XKHgsIG4pCisgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIlQiIC4gYTpuCisgICAgdGhyb3cgYTp4CitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgRihuKQorICAgIGxldCBnOnRha2VuID0gZzp0YWtlbiAuICJGIiAuIGE6bgorICAgIHJldHVybiAiRiIgLiBhOm4KK2VuZGZ1bmN0aW9uCisKK3RyeQorICAgIHRyeQorCVhwYXRoIDEJCQkJCSIgWDogMQorCWVjaG8gImVjaG8iIC4gVEhST1coImVjaG8tZXhjZXB0IiwgMSkgRigxKQorCVhwYXRoIDIJCQkJCSIgWDogMAorICAgIGNhdGNoIC9eZWNoby1leGNlcHQkLworCVhwYXRoIDQJCQkJCSIgWDogNAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA4CQkJCQkiIFg6IDAKKwlYb3V0ICJlY2hvOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDE2CQkJCSIgWDogMTYKKwllY2hvbiAiZWNob24iIC4gVEhST1coImVjaG9uLWV4Y2VwdCIsIDIpIEYoMikKKwlYcGF0aCAzMgkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXmVjaG9uLWV4Y2VwdCQvCisJWHBhdGggNjQJCQkJIiBYOiA2NAorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAxMjgJCQkJIiBYOiAwCisJWG91dCAiZWNob246IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisJZWNob21zZyAiZWNob21zZyIgLiBUSFJPVygiZWNob21zZy1leGNlcHQiLCAzKSBGKDMpCisJWHBhdGggNTEyCQkJCSIgWDogMAorICAgIGNhdGNoIC9eZWNob21zZy1leGNlcHQkLworCVhwYXRoIDEwMjQJCQkJIiBYOiAxMDI0CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDIwNDgJCQkJIiBYOiAwCisJWG91dCAiZWNob21zZzoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorCWVjaG9lcnIgImVjaG9lcnIiIC4gVEhST1coImVjaG9lcnItZXhjZXB0IiwgNCkgRig0KQorCVhwYXRoIDgxOTIJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15lY2hvZXJyLWV4Y2VwdCQvCisJWHBhdGggMTYzODQJCQkJIiBYOiAxNjM4NAorICAgIGNhdGNoIC9WaW0vCisJWHBhdGggMzI3NjgJCQkJIiBYOiAwCisgICAgY2F0Y2ggL2VjaG9lcnIvCisJWHBhdGggNjU1MzYJCQkJIiBYOiAwCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDEzMTA3MgkJCQkiIFg6IDAKKwlYb3V0ICJlY2hvZXJyOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDI2MjE0NAkJCQkiIFg6IDI2MjE0NAorCWV4ZWN1dGUgImVjaG8gJ2V4ZWN1dGUiIC4gVEhST1coImV4ZWN1dGUtZXhjZXB0IiwgNSkgRig1KSAiJyIKKwlYcGF0aCA1MjQyODgJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15leGVjdXRlLWV4Y2VwdCQvCisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDEwNDg1NzYKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDAKKwlYb3V0ICJleGVjdXRlOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIGxldCBleHBlY3RlZCA9ICJUMVQyVDNUNFQ1IgorICAgIGlmIHRha2VuICE9IGV4cGVjdGVkCisJWHBhdGggNDE5NDMwNAkJCQkiIFg6IDAKKwlYb3V0ICIndGFrZW4nIGlzIiB0YWtlbiAiaW5zdGVhZCBvZiIgZXhwZWN0ZWQKKyAgICBlbmRpZgorCitjYXRjaCAvXjAkLwkgICAgIiBkZWZhdWx0IHJldHVybiB2YWx1ZQorICAgIFhwYXRoIDgzODg2MDgJCQkJIiBYOiAwCisgICAgWG91dCB2OnRocm93cG9pbnQKK2NhdGNoIC8uKi8KKyAgICBYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDAKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworWHBhdGggMzM1NTQ0MzIJCQkJCSIgWDogMzM1NTQ0MzIKKwordW5sZXQgdGFrZW4gZXhwZWN0ZWQKK2RlbGZ1bmN0aW9uIFRIUk9XCitkZWxmdW5jdGlvbiBGCisKK1hjaGVjayAzNDg4Njk5NworCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzI6ICA6dGhyb3cgYWNjcm9zcyA6bGV0IG9yIDp1bmxldAkJCQkgICAge3t7MQorIgorIgkgICAgT24gYSA6bGV0IGNvbW1hbmQsIGFuIGV4Y2VwdGlvbiBtaWdodCBiZSB0aHJvd24gZHVyaW5nIGV2YWx1YXRpb24KKyIJICAgIG9mIHRoZSBleHByZXNzaW9uIHRvIGFzc2lnbi4gIE9uIGFuIDpsZXQgb3IgOnVubGV0IGNvbW1hbmQsIHRoZQorIgkgICAgZXZhbHVhdGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgYXNzaWduZWQgb3IgbGlzdCBvcgorIgkgICAgZGVsZXRlZCwgcmVzcGVjdGl2ZWx5LCBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uLiAgQW55IGZvbGxvd2luZworIgkgICAgYXJndW1lbnRzIGFyZSBub3QgZXZhbHVhdGVkLCB0aGVuLiAgVGhlIGV4Y2VwdGlvbiBjYW4gYmUgY2F1Z2h0IGJ5CisiCSAgICB0aGUgc2NyaXB0LgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCB0aHJvd2NvdW50ID0gMAorCitmdW5jdGlvbiEgVEhST1coeCkKKyAgICBsZXQgZzp0aHJvd2NvdW50ID0gZzp0aHJvd2NvdW50ICsgMQorICAgIHRocm93IGE6eAorZW5kZnVuY3Rpb24KKwordHJ5CisgICAgdHJ5CisJbGV0ICRWQVIgPSAib2xkX3ZhbHVlIgorCVhwYXRoIDEJCQkJCSIgWDogMQorCWxldCAkVkFSID0gImxldCgiIC4gVEhST1coInZhciIpIC4gIikiCisJWHBhdGggMgkJCQkJIiBYOiAwCisgICAgY2F0Y2ggL152YXIkLworCVhwYXRoIDQJCQkJCSIgWDogNAorICAgIGZpbmFsbHkKKwlpZiAkVkFSICE9ICJvbGRfdmFsdWUiCisJICAgIFhwYXRoIDgJCQkJIiBYOiAwCisJZW5kaWYKKyAgICBlbmR0cnkKKworICAgIHRyeQorCWxldCBAYSA9ICJvbGRfdmFsdWUiCisJWHBhdGggMTYJCQkJIiBYOiAxNgorCWxldCBAYSA9ICJsZXQoIiAuIFRIUk9XKCJyZWciKSAuICIpIgorCVhwYXRoIDMyCQkJCSIgWDogMAorICAgIGNhdGNoIC9ecmVnJC8KKwl0cnkKKwkgICAgWHBhdGggNjQJCQkJIiBYOiA2NAorCSAgICBsZXQgQEEgPSAibGV0KCIgLiBUSFJPVygiUkVHIikgLiAiKSIKKwkgICAgWHBhdGggMTI4CQkJCSIgWDogMAorCWNhdGNoIC9eUkVHJC8KKwkgICAgWHBhdGggMjU2CQkJCSIgWDogMjU2CisJZW5kdHJ5CisgICAgZmluYWxseQorCWlmIEBhICE9ICJvbGRfdmFsdWUiCisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDAKKwllbmRpZgorCWlmIEBBICE9ICJvbGRfdmFsdWUiCisJICAgIFhwYXRoIDEwMjQJCQkJIiBYOiAwCisJZW5kaWYKKyAgICBlbmR0cnkKKworICAgIHRyeQorCWxldCBzYXZlZF9ncGF0aCA9ICZnOnBhdGgKKwlsZXQgc2F2ZWRfbHBhdGggPSAmbDpwYXRoCisJWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwlsZXQgJnBhdGggPSAibGV0KCIgLiBUSFJPVygib3B0IikgLiAiKSIKKwlYcGF0aCA0MDk2CQkJCSIgWDogMAorICAgIGNhdGNoIC9eb3B0JC8KKwl0cnkKKwkgICAgWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwkgICAgbGV0ICZnOnBhdGggPSAibGV0KCIgLiBUSFJPVygiZ29wdCIpIC4gIikiCisJICAgIFhwYXRoIDE2Mzg0CQkJCSIgWDogMAorCWNhdGNoIC9eZ29wdCQvCisJICAgIHRyeQorCQlYcGF0aCAzMjc2OAkJCSIgWDogMzI3NjgKKwkJbGV0ICZsOnBhdGggPSAibGV0KCIgLiBUSFJPVygibG9wdCIpIC4gIikiCisJCVhwYXRoIDY1NTM2CQkJIiBYOiAwCisJICAgIGNhdGNoIC9ebG9wdCQvCisJCVhwYXRoIDEzMTA3MgkJCSIgWDogMTMxMDcyCisJICAgIGVuZHRyeQorCWVuZHRyeQorICAgIGZpbmFsbHkKKwlpZiAmZzpwYXRoICE9IHNhdmVkX2dwYXRoIHx8ICZsOnBhdGggIT0gc2F2ZWRfbHBhdGgKKwkgICAgWHBhdGggMjYyMTQ0CQkJIiBYOiAwCisJZW5kaWYKKwlsZXQgJmc6cGF0aCA9IHNhdmVkX2dwYXRoCisJbGV0ICZsOnBhdGggPSBzYXZlZF9scGF0aAorICAgIGVuZHRyeQorCisgICAgdW5sZXQhIHZhcjEgdmFyMiB2YXIzCisKKyAgICB0cnkKKwlYcGF0aCA1MjQyODgJCQkJIiBYOiA1MjQyODgKKwlsZXQgdmFyMSA9ICJsZXQoIiAuIFRIUk9XKCJ2YXIxIikgLiAiKSIKKwlYcGF0aCAxMDQ4NTc2CQkJCSIgWDogMAorICAgIGNhdGNoIC9edmFyMSQvCisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDIwOTcxNTIKKyAgICBmaW5hbGx5CisJaWYgZXhpc3RzKCJ2YXIxIikKKwkgICAgWHBhdGggNDE5NDMwNAkJCSIgWDogMAorCWVuZGlmCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlsZXQgdmFyMiA9ICJvbGRfdmFsdWUiCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDgzODg2MDgKKwlsZXQgdmFyMiA9ICJsZXQoIiAuIFRIUk9XKCJ2YXIyIikuICIpIgorCVhwYXRoIDE2Nzc3MjE2CQkJCSIgWDogMAorICAgIGNhdGNoIC9edmFyMiQvCisJWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAzMzU1NDQzMgorICAgIGZpbmFsbHkKKwlpZiB2YXIyICE9ICJvbGRfdmFsdWUiCisJICAgIFhwYXRoIDY3MTA4ODY0CQkJIiBYOiAwCisJZW5kaWYKKyAgICBlbmR0cnkKKworICAgIHRyeQorCVhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCWxldCB2YXJ7VEhST1coInZhcjMiKX0gPSA0NzExCisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorICAgIGNhdGNoIC9edmFyMyQvCisJWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogNTM2ODcwOTEyCisgICAgZW5kdHJ5CisKKyAgICBsZXQgYWRkcGF0aCA9ICIiCisKKyAgICBmdW5jdGlvbiBBRERQQVRIKHApCisJbGV0IGc6YWRkcGF0aCA9IGc6YWRkcGF0aCAuIGE6cAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICB0cnkKKwljYWxsIEFERFBBVEgoIlQxIikKKwlsZXQgdmFye1RIUk9XKCJ2YXI0Iil9IHZhcntBRERQQVRIKCJUMiIpfSB8IGNhbGwgQUREUEFUSCgiVDMiKQorCWNhbGwgQUREUEFUSCgiVDQiKQorICAgIGNhdGNoIC9edmFyNCQvCisJY2FsbCBBRERQQVRIKCJUNSIpCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwljYWxsIEFERFBBVEgoIlQ2IikKKwl1bmxldCB2YXJ7VEhST1coInZhcjUiKX0gdmFye0FERFBBVEgoIlQ3Iil9IHwgY2FsbCBBRERQQVRIKCJUOCIpCisJY2FsbCBBRERQQVRIKCJUOSIpCisgICAgY2F0Y2ggL152YXI1JC8KKwljYWxsIEFERFBBVEgoIlQxMCIpCisgICAgZW5kdHJ5CisKKyAgICBpZiBhZGRwYXRoICE9ICJUMVQ1VDZUMTAiIHx8IHRocm93Y291bnQgIT0gMTEKKwl0aHJvdyAiYWRkcGF0aDogIiAuIGFkZHBhdGggLiAiLCB0aHJvd2NvdW50OiAiIC4gdGhyb3djb3VudAorICAgIGVuZGlmCisKKyAgICBYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCitjYXRjaCAvLiovCisgICAgIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBhZGQgZXhwbGljaXRseToKKyAgICBsZXQgWHBhdGggPSBYcGF0aCArIDIxNDc0ODM2NDgJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2VuZHRyeQorCit1bmxldCEgdmFyMSB2YXIyIHZhcjMgYWRkcGF0aCB0aHJvd2NvdW50CitkZWxmdW5jdGlvbiBUSFJPVworCitYY2hlY2sgMTc4OTU2OTM2NQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzM6ICA6dGhyb3cgYWNjcm9zcyA6ZnVuY3Rpb24sIDpkZWxmdW5jdGlvbgkJCSAgICB7e3sxCisiCisiCSAgICBUaGUgOmZ1bmN0aW9uIGFuZCA6ZGVsZnVuY3Rpb24gY29tbWFuZHMgbWF5IGNhdXNlIGFuIGV4cHJlc3Npb24KKyIJICAgIHNwZWNpZmllZCBpbiBicmFjZXMgdG8gYmUgZXZhbHVhdGVkLiAgRHVyaW5nIGV2YWx1YXRpb24sIGFuCisiCSAgICBleGNlcHRpb24gbWlnaHQgYmUgdGhyb3duLiAgVGhlIGV4Y2VwdGlvbiBjYW4gYmUgY2F1Z2h0IGJ5IHRoZQorIgkgICAgc2NyaXB0LgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2xldCB0YWtlbiA9ICIiCisKK2Z1bmN0aW9uISBUSFJPVyh4LCBuKQorICAgIGxldCBnOnRha2VuID0gZzp0YWtlbiAuICJUIiAuIGE6bgorICAgIHRocm93IGE6eAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEVYUFIoeCwgbikKKyAgICBsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAiRSIgLiBhOm4KKyAgICBpZiBhOm4gJSAyID09IDAKKwljYWxsIFRIUk9XKGE6eCwgYTpuKQorICAgIGVuZGlmCisgICAgcmV0dXJuIDIgLSBhOm4gJSAyCitlbmRmdW5jdGlvbgorCit0cnkKKyAgICB0cnkKKwkiIERlZmluZSBmdW5jdGlvbi4KKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwlmdW5jdGlvbiEgRjAoKQorCWVuZGZ1bmN0aW9uCisJWHBhdGggMgkJCQkJIiBYOiAyCisJZnVuY3Rpb24hIEZ7RVhQUigiZnVuY3Rpb24tZGVmLW9rIiwgMSl9KCkKKwllbmRmdW5jdGlvbgorCVhwYXRoIDQJCQkJCSIgWDogNAorCWZ1bmN0aW9uISBGe0VYUFIoImZ1bmN0aW9uLWRlZiIsIDIpfSgpCisJZW5kZnVuY3Rpb24KKwlYcGF0aCA4CQkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXmZ1bmN0aW9uLWRlZi1vayQvCisJWHBhdGggMTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15mdW5jdGlvbi1kZWYkLworCVhwYXRoIDMyCQkJCSIgWDogMzIKKyAgICBjYXRjaCAvLiovCisJWHBhdGggNjQJCQkJIiBYOiAwCisJWG91dCAiZGVmOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIHRyeQorCSIgTGlzdCBmdW5jdGlvbi4KKwlYcGF0aCAxMjgJCQkJIiBYOiAxMjgKKwlmdW5jdGlvbiBGMAorCVhwYXRoIDI1NgkJCQkiIFg6IDI1NgorCWZ1bmN0aW9uIEZ7RVhQUigiZnVuY3Rpb24tbHN0LW9rIiwgMyl9CisJWHBhdGggNTEyCQkJCSIgWDogNTEyCisJZnVuY3Rpb24gRntFWFBSKCJmdW5jdGlvbi1sc3QiLCA0KX0KKwlYcGF0aCAxMDI0CQkJCSIgWDogMAorICAgIGNhdGNoIC9eZnVuY3Rpb24tbHN0LW9rJC8KKwlYcGF0aCAyMDQ4CQkJCSIgWDogMAorICAgIGNhdGNoIC9eZnVuY3Rpb24tbHN0JC8KKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorCVhvdXQgImxzdDoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwkiIERlbGV0ZSBmdW5jdGlvbgorCVhwYXRoIDE2Mzg0CQkJCSIgWDogMTYzODQKKwlkZWxmdW5jdGlvbiBGMAorCVhwYXRoIDMyNzY4CQkJCSIgWDogMzI3NjgKKwlkZWxmdW5jdGlvbiBGe0VYUFIoImZ1bmN0aW9uLWRlbC1vayIsIDUpfQorCVhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwlkZWxmdW5jdGlvbiBGe0VYUFIoImZ1bmN0aW9uLWRlbCIsIDYpfQorCVhwYXRoIDEzMTA3MgkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXmZ1bmN0aW9uLWRlbC1vayQvCisJWHBhdGggMjYyMTQ0CQkJCSIgWDogMAorICAgIGNhdGNoIC9eZnVuY3Rpb24tZGVsJC8KKwlYcGF0aCA1MjQyODgJCQkJIiBYOiA1MjQyODgKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKKwlYb3V0ICJkZWw6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgbGV0IGV4cGVjdGVkID0gIkUxRTJUMkUzRTRUNEU1RTZUNiIKKyAgICBpZiB0YWtlbiAhPSBleHBlY3RlZAorCVhwYXRoIDIwOTcxNTIJCQkJIiBYOiAwCisJWG91dCAiJ3Rha2VuJyBpcyIgdGFrZW4gImluc3RlYWQgb2YiIGV4cGVjdGVkCisgICAgZW5kaWYKKworY2F0Y2ggLy4qLworICAgIFhwYXRoIDQxOTQzMDQJCQkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CisKK1hwYXRoIDgzODg2MDgJCQkJCSIgWDogODM4ODYwOAorCit1bmxldCB0YWtlbiBleHBlY3RlZAorZGVsZnVuY3Rpb24gVEhST1cKK2RlbGZ1bmN0aW9uIEVYUFIKKworWGNoZWNrIDkwMzI2MTUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDc0OiAgOnRocm93IGFjY3Jvc3MgYnVpbHRpbiBmdW5jdGlvbnMgYW5kIGNvbW1hbmRzCQkgICAge3t7MQorIgorIgkgICAgU29tZSBmdW5jdGlvbnMgbGlrZSBleGlzdHMoKSwgc2VhcmNocGFpcigpIHRha2UgZXhwcmVzc2lvbgorIgkgICAgYXJndW1lbnRzLCBvdGhlciBmdW5jdGlvbnMgb3IgY29tbWFuZHMgbGlrZSBzdWJzdGl0dXRlKCkgb3IKKyIJICAgIDpzdWJzdGl0dXRlIGNhdXNlIGFuIGV4cHJlc3Npb24gKHNwZWNpZmllZCBpbiB0aGUgcmVndWxhcgorIgkgICAgZXhwcmVzc2lvbikgdG8gYmUgZXZhbHVhdGVkLiAgRHVyaW5nIGV2YWx1YXRpb24gYW4gZXhjZXB0aW9uCisiCSAgICBtaWdodCBiZSB0aHJvd24uICBUaGUgZXhjZXB0aW9uIGNhbiBiZSBjYXVnaHQgYnkgdGhlIHNjcmlwdC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitsZXQgdGFrZW4gPSAiIgorCitmdW5jdGlvbiEgVEhST1coeCwgbikKKyAgICBsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAiVCIgLiBhOm4KKyAgICB0aHJvdyBhOngKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBFWFBSKHgsIG4pCisgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIkUiIC4gYTpuCisgICAgY2FsbCBUSFJPVyhhOnggLiBhOm4sIGE6bikKKyAgICByZXR1cm4gIkVYUFIiCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgU0tJUCh4LCBuKQorICAgIGxldCBnOnRha2VuID0gZzp0YWtlbiAuICJTIiAuIGE6biAuICIoIiAuIGxpbmUoIi4iKQorICAgIGxldCB0aGVsaW5lID0gZ2V0bGluZSgiLiIpCisgICAgaWYgdGhlbGluZSA9fiAic2tpcCIKKwlsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAicykiCisJcmV0dXJuIDEKKyAgICBlbHNlaWYgdGhlbGluZSA9fiAidGhyb3ciCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gInQpIgorCWNhbGwgVEhST1coYTp4IC4gYTpuLCBhOm4pCisgICAgZWxzZQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICIpIgorCXJldHVybiAwCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBTVUJTVCh4LCBuKQorICAgIGxldCBnOnRha2VuID0gZzp0YWtlbiAuICJVIiAuIGE6biAuICIoIiAuIGxpbmUoIi4iKQorICAgIGxldCB0aGVsaW5lID0gZ2V0bGluZSgiLiIpCisgICAgaWYgdGhlbGluZSA9fiAibm90IgkgICAgIiBTVUJTVCgpIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciB0aGlzIGxpbmUKKwlsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAibikiCisJY2FsbCBUSFJPVyhhOnggLiBhOm4sIGE6bikKKyAgICBlbHNlaWYgdGhlbGluZSA9fiAidGhyb3ciCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gInQpIgorCWNhbGwgVEhST1coYTp4IC4gYTpuLCBhOm4pCisgICAgZWxzZQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICIpIgorCXJldHVybiAicmVwbGFjZWQiCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCisKK3RyeQorICAgIHRyeQorCVhwYXRoIDEJCQkJCSIgWDogMQorCWxldCByZXN1bHQgPSBleGlzdHMoJyp7RVhQUigiZXhpc3RzIiwgMSl9JykKKwlYcGF0aCAyCQkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXmV4aXN0czEkLworCVhwYXRoIDQJCQkJCSIgWDogNAorCXRyeQorCSAgICBsZXQgcmVzdWx0ID0gZXhpc3RzKCd7RVhQUigiZXhpc3RzIiwgMil9JykKKwkgICAgWHBhdGggOAkJCQkiIFg6IDAKKwljYXRjaCAvXmV4aXN0czIkLworCSAgICBYcGF0aCAxNgkJCQkiIFg6IDE2CisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCAzMgkJCQkiIFg6IDAKKwkgICAgWG91dCAiZXhpc3RzMjoiIHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisJZW5kdHJ5CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDY0CQkJCSIgWDogMAorCVhvdXQgImV4aXN0czE6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJbGV0IGZpbGUgPSB0ZW1wbmFtZSgpCisJZXhlYyAiZWRpdCIgZmlsZQorCWluc2VydAorYmVnaW4KKyAgICB4eAorbWlkZGxlIDMKKyAgICB4eAorbWlkZGxlIDUgc2tpcAorICAgIHh4CittaWRkbGUgNyB0aHJvdworICAgIHh4CitlbmQKKy4KKwlub3JtYWwhIGdnCisJWHBhdGggMTI4CQkJCSIgWDogMTI4CisJbGV0IHJlc3VsdCA9CisJICAgIFwgc2VhcmNocGFpcigiYmVnaW4iLCAibWlkZGxlIiwgImVuZCIsICcnLCAnU0tJUCgic2VhcmNocGFpciIsIDMpJykKKwlYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwlsZXQgcmVzdWx0ID0KKwkgICAgXCBzZWFyY2hwYWlyKCJiZWdpbiIsICJtaWRkbGUiLCAiZW5kIiwgJycsICdTS0lQKCJzZWFyY2hwYWlyIiwgNCknKQorCVhwYXRoIDUxMgkJCQkiIFg6IDAKKwlsZXQgcmVzdWx0ID0KKwkgICAgXCBzZWFyY2hwYWlyKCJiZWdpbiIsICJtaWRkbGUiLCAiZW5kIiwgJycsICdTS0lQKCJzZWFyY2hwYWlyIiwgNSknKQorCVhwYXRoIDEwMjQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15zZWFyY2hwYWlyWzM1XSQvCisJWHBhdGggMjA0OAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvXnNlYXJjaHBhaXI0JC8KKwlYcGF0aCA0MDk2CQkJCSIgWDogNDA5NgorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA4MTkyCQkJCSIgWDogMAorCVhvdXQgInNlYXJjaHBhaXI6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGZpbmFsbHkKKwlid2lwZW91dCEKKwljYWxsIGRlbGV0ZShmaWxlKQorICAgIGVuZHRyeQorCisgICAgdHJ5CisJbGV0IGZpbGUgPSB0ZW1wbmFtZSgpCisJZXhlYyAiZWRpdCIgZmlsZQorCWluc2VydAorc3Vic3QgMQorc3Vic3QgMgorbm90CitzdWJzdCA0CitzdWJzdCB0aHJvdworc3Vic3QgNgorLgorCW5vcm1hbCEgZ2cKKwlYcGF0aCAxNjM4NAkJCQkiIFg6IDE2Mzg0CisJMSwyc3Vic3RpdHV0ZS9zdWJzdC9cPVNVQlNUKCJzdWJzdGl0dXRlIiwgNikvCisJdHJ5CisJICAgIFhwYXRoIDMyNzY4CQkJCSIgWDogMzI3NjgKKwkgICAgdHJ5CisJCWxldCB2OmVycm1zZyA9ICIiCisJCTNzdWJzdGl0dXRlL3N1YnN0L1w9U1VCU1QoInN1YnN0aXR1dGUiLCA3KS8KKwkgICAgZmluYWxseQorCQlpZiB2OmVycm1zZyAhPSAiIgorCQkgICAgIiBJZiBleGNlcHRpb25zIGFyZSBub3QgdGhyb3duIG9uIGVycm9ycywgZmFrZSB0aGUgZXJyb3IKKwkJICAgICIgZXhjZXB0aW9uIGluIG9yZGVyIHRvIGdldCB0aGUgc2FtZSBleGVjdXRpb24gcGF0aC4KKwkJICAgIHRocm93ICJmYWtlZCBWaW0oc3Vic3RpdHV0ZSkiCisJCWVuZGlmCisJICAgIGVuZHRyeQorCWNhdGNoIC9WaW0oc3Vic3RpdHV0ZSkvCSAgICAiIFBhdHRlcm4gbm90IGZvdW5kICgnZScgZmxhZyBtaXNzaW5nKQorCSAgICBYcGF0aCA2NTUzNgkJCQkiIFg6IDY1NTM2CisJICAgIDNzdWJzdGl0dXRlL3N1YnN0L1w9U1VCU1QoInN1YnN0aXR1dGUiLCA4KS9lCisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMTMxMDcyCisJZW5kdHJ5CisJWHBhdGggMjYyMTQ0CQkJCSIgWDogMjYyMTQ0CisJNCw2c3Vic3RpdHV0ZS9zdWJzdC9cPVNVQlNUKCJzdWJzdGl0dXRlIiwgOSkvCisJWHBhdGggNTI0Mjg4CQkJCSIgWDogMAorICAgIGNhdGNoIC9ec3Vic3RpdHV0ZVs2NzhdLworCVhwYXRoIDEwNDg1NzYJCQkJIiBYOiAwCisgICAgY2F0Y2ggL15zdWJzdGl0dXRlOS8KKwlYcGF0aCAyMDk3MTUyCQkJCSIgWDogMjA5NzE1MgorICAgIGZpbmFsbHkKKwlid2lwZW91dCEKKwljYWxsIGRlbGV0ZShmaWxlKQorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggNDE5NDMwNAkJCQkiIFg6IDQxOTQzMDQKKwlsZXQgdmFyID0gc3Vic3RpdHV0ZSgic3ViIiwgInN1YiIsICdcPVRIUk9XKCJzdWJzdGl0dXRlKCl5IiwgMTApJywgJycpCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDAKKyAgICBjYXRjaCAvc3Vic3RpdHV0ZSgpeS8KKwlYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDE2Nzc3MjE2CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDMzNTU0NDMyCQkJCSIgWDogMAorCVhvdXQgInN1YnN0aXR1dGUoKXk6IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdHJ5CisJWHBhdGggNjcxMDg4NjQJCQkJIiBYOiA2NzEwODg2NAorCWxldCB2YXIgPSBzdWJzdGl0dXRlKCJub3QiLCAic3ViIiwgJ1w9VEhST1coInN1YnN0aXR1dGUoKW4iLCAxMSknLCAnJykKKwlYcGF0aCAxMzQyMTc3MjgJCQkJIiBYOiAxMzQyMTc3MjgKKyAgICBjYXRjaCAvc3Vic3RpdHV0ZSgpbi8KKwlYcGF0aCAyNjg0MzU0NTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDUzNjg3MDkxMgkJCQkiIFg6IDAKKwlYb3V0ICJzdWJzdGl0dXRlKCluOiIgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBlbmR0cnkKKworICAgIGxldCBleHBlY3RlZCA9ICJFMVQxRTJUMlMzKDMpUzQoNXMpUzQoN3QpVDRVNigxKVU2KDIpVTkoNClVOSg1dClUOVQxMCIKKyAgICBpZiB0YWtlbiAhPSBleHBlY3RlZAorCVhwYXRoIDEwNzM3NDE4MjQJCQkiIFg6IDAKKwlYb3V0ICIndGFrZW4nIGlzIiB0YWtlbiAiaW5zdGVhZCBvZiIgZXhwZWN0ZWQKKyAgICBlbmRpZgorCitjYXRjaCAvLiovCisgICAgIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBhZGQgZXhwbGljaXRseToKKyAgICBsZXQgWHBhdGggPSBYcGF0aCArIDIxNDc0ODM2NDgJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2VuZHRyeQorCit1bmxldCByZXN1bHQgdmFyIHRha2VuIGV4cGVjdGVkCitkZWxmdW5jdGlvbiBUSFJPVworZGVsZnVuY3Rpb24gRVhQUgorZGVsZnVuY3Rpb24gU0tJUAorZGVsZnVuY3Rpb24gU1VCU1QKKworWGNoZWNrIDIyNDkwNzY2OQorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzU6ICBFcnJvcnMgaW4gYnVpbHRpbiBmdW5jdGlvbnMuCQkJCSAgICB7e3sxCisiCisiCSAgICBPbiBhbiBlcnJvciBpbiBhIGJ1aWx0aW4gZnVuY3Rpb24gY2FsbGVkIGluc2lkZSBhIDp0cnkvOmVuZHRyeQorIgkgICAgcmVnaW9uLCB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBjYWxsaW5nIHRoYXQgZnVuY3Rpb24gYW5kCisiCSAgICB0aGUgY29tbWFuZCBjb250YWluaW5nIHRoYXQgZXhwcmVzc2lvbiBhcmUgYWJhbmRvbmVkLiAgVGhlIGVycm9yIGNhbgorIgkgICAgYmUgY2F1Z2h0IGFzIGFuIGV4Y2VwdGlvbi4KKyIKKyIJICAgIEEgc2ltcGxlIDpjYWxsIG9mIHRoZSBidWlsdGluIGZ1bmN0aW9uIGlzIGEgdHJpdmlhbCBjYXNlLiAgSWYgdGhlCisiCSAgICBidWlsdGluIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgYXJndW1lbnQgbGlzdCBvZiBhbm90aGVyIGZ1bmN0aW9uLAorIgkgICAgbm8gZnVydGhlciBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCwgYW5kIHRoZSBvdGhlciBmdW5jdGlvbiBpcyBub3QKKyIJICAgIGV4ZWN1dGVkLiAgSWYgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGFyZ3VtZW50IG9mCisiCSAgICBhIDpyZXR1cm4gY29tbWFuZCwgdGhlIDpyZXR1cm4gY29tbWFuZCBpcyBub3QgZXhlY3V0ZWQuICBJZiB0aGUKKyIJICAgIGJ1aWx0aW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGFyZ3VtZW50IG9mIGEgOnRocm93IGNvbW1hbmQsCisiCSAgICB0aGUgOnRocm93IGNvbW1hbmQgaXMgbm90IGV4ZWN1dGVkLiAgVGhlIGV2YWx1YXRpb24gb2YgdGhlCisiCSAgICBleHByZXNzaW9uIGNhbGxpbmcgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gaXMgYWJhbmRvbmVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBGMShhcmcxKQorICAgIFhwYXRoIDEJCQkJCSIgWDogMAorZW5kZnVuY3Rpb24KKworZnVuY3Rpb24hIEYyKGFyZzEsIGFyZzIpCisgICAgWHBhdGggMgkJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgRygpCisgICAgWHBhdGggNAkJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgSCgpCisgICAgWHBhdGggOAkJCQkJIiBYOiAwCitlbmRmdW5jdGlvbgorCitmdW5jdGlvbiEgUigpCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICBYcGF0aCAxNgkJCQkiIFg6IDE2CisJICAgIHJldHVybiBhcHBlbmQoMSwgInMiKQorCWNhdGNoIC9FMjEvCisJICAgIGxldCBjYXVnaHQgPSAxCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCAzMgkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDY0CQkJCSIgWDogNjQKKwkgICAgaWYgY2F1Z2h0IHx8ICRWSU1OT0VSUlRIUk9XICYmIHY6ZXJybXNnID1+ICdFMjEnCisJCVhwYXRoIDEyOAkJCSIgWDogMTI4CisJICAgIGVuZGlmCisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKyAgICBYcGF0aCAyNTYJCQkJCSIgWDogMjU2CitlbmRmdW5jdGlvbgorCit0cnkKKyAgICBzZXQgbm9tYQkiIGxldCBhcHBlbmQoKSBmYWlsIHdpdGggIkUyMSIKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgWHBhdGggNTEyCQkJCSIgWDogNTEyCisJICAgIGNhbGwgYXBwZW5kKDEsICJzIikKKwljYXRjaCAvRTIxLworCSAgICBsZXQgY2F1Z2h0ID0gMQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggMTAyNAkJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDIwNDgJCQkJIiBYOiAyMDQ4CisJICAgIGlmIGNhdWdodCB8fCAkVklNTk9FUlJUSFJPVyAmJiB2OmVycm1zZyA9fiAnRTIxJworCQlYcGF0aCA0MDk2CQkJIiBYOiA0MDk2CisJICAgIGVuZGlmCisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKwkgICAgY2FsbCBGMSgneCcgLiBhcHBlbmQoMSwgInMiKSkKKwljYXRjaCAvRTIxLworCSAgICBsZXQgY2F1Z2h0ID0gMQorCWNhdGNoIC8uKi8KKwkgICAgWHBhdGggMTYzODQJCQkJIiBYOiAwCisJZmluYWxseQorCSAgICBYcGF0aCAzMjc2OAkJCQkiIFg6IDMyNzY4CisJICAgIGlmIGNhdWdodCB8fCAkVklNTk9FUlJUSFJPVyAmJiB2OmVycm1zZyA9fiAnRTIxJworCQlYcGF0aCA2NTUzNgkJCSIgWDogNjU1MzYKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICBYcGF0aCAxMzEwNzIJCQkiIFg6IDEzMTA3MgorCSAgICBjYWxsIEYyKCd4JyAuIGFwcGVuZCgxLCAicyIpLCBHKCkpCisJY2F0Y2ggL0UyMS8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDI2MjE0NAkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggNTI0Mjg4CQkJIiBYOiA1MjQyODgKKwkgICAgaWYgY2F1Z2h0IHx8ICRWSU1OT0VSUlRIUk9XICYmIHY6ZXJybXNnID1+ICdFMjEnCisJCVhwYXRoIDEwNDg1NzYJCQkiIFg6IDEwNDg1NzYKKwkgICAgZW5kaWYKKwkgICAgYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgY2FsbCBSKCkKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgWHBhdGggMjA5NzE1MgkJCSIgWDogMjA5NzE1MgorCSAgICB0aHJvdyAiVCIgLiBhcHBlbmQoMSwgInMiKQorCWNhdGNoIC9FMjEvCisJICAgIGxldCBjYXVnaHQgPSAxCisJY2F0Y2ggL15ULiovCisJICAgIFhwYXRoIDQxOTQzMDQJCQkiIFg6IDAKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDgzODg2MDgJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIFhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAxNjc3NzIxNgorCSAgICBpZiBjYXVnaHQgfHwgJFZJTU5PRVJSVEhST1cgJiYgdjplcnJtc2cgPX4gJ0UyMScKKwkJWHBhdGggMzM1NTQ0MzIJCQkiIFg6IDMzNTU0NDMyCisJICAgIGVuZGlmCisJICAgIGJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisJZW5kdHJ5CisgICAgZW5kd2hpbGUKKworICAgIHdoaWxlIDEKKwl0cnkKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgWHBhdGggNjcxMDg4NjQJCQkiIFg6IDY3MTA4ODY0CisJICAgIGxldCB4ID0gImEiCisJICAgIGxldCB4ID0geCAuICJiIiAuIGFwcGVuZCgxLCAicyIpIC4gSCgpCisJY2F0Y2ggL0UyMS8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMAorCWZpbmFsbHkKKwkgICAgWHBhdGggMjY4NDM1NDU2CQkJIiBYOiAyNjg0MzU0NTYKKwkgICAgaWYgY2F1Z2h0IHx8ICRWSU1OT0VSUlRIUk9XICYmIHY6ZXJybXNnID1+ICdFMjEnCisJCVhwYXRoIDUzNjg3MDkxMgkJCSIgWDogNTM2ODcwOTEyCisJICAgIGVuZGlmCisJICAgIGlmIHggPT0gImEiCisJCVhwYXRoIDEwNzM3NDE4MjQJCSIgWDogMTA3Mzc0MTgyNAorCSAgICBlbmRpZgorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQorICAgIGVuZHdoaWxlCitjYXRjaCAvLiovCisgICAgIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBhZGQgZXhwbGljaXRseToKKyAgICBsZXQgWHBhdGggPSBYcGF0aCArIDIxNDc0ODM2NDgJCSIgWDogMAorICAgIFhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKK2ZpbmFsbHkKKyAgICBzZXQgbWEmCitlbmR0cnkKKwordW5sZXQhIGNhdWdodCB4CitkZWxmdW5jdGlvbiBGMQorZGVsZnVuY3Rpb24gRjIKK2RlbGZ1bmN0aW9uIEcKK2RlbGZ1bmN0aW9uIEgKK2RlbGZ1bmN0aW9uIFIKKworWGNoZWNrIDIwMDA0MDM0MDgKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDc2OiAgRXJyb3JzLCBpbnRlcnVwdHMsIDp0aHJvdyBkdXJpbmcgZXhwcmVzc2lvbiBldmFsdWF0aW9uCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGEgZnVuY3Rpb24gY2FsbCBtYWRlIGR1cmluZyBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgYWJvcnRlZAorIgkgICAgZHVlIHRvIGFuIGVycm9yIGluc2lkZSBhIDp0cnkvOmVuZHRyeSByZWdpb24gb3IgZHVlIHRvIGFuIGludGVycnVwdAorIgkgICAgb3IgYSA6dGhyb3csIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgYWJvcnRlZCBhcyB3ZWxsLglObworIgkgICAgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgZm9yIHRoZSBjYW5jZWxsZWQgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiAgT24gYW4KKyIJICAgIGVycm9yIG5vdCBpbnNpZGUgOnRyeS86ZW5kdHJ5LCB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGNvbnRpbnVlcy4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisKKyAgICBsZXQgdGFrZW4gPSAiIgorCisgICAgZnVuY3Rpb24hIEVSUihuKQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICJFIiAuIGE6bgorCWFzZGYKKyAgICBlbmRmdW5jdGlvbgorCisgICAgZnVuY3Rpb24hIEVSUmFib3J0KG4pIGFib3J0CisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIkEiIC4gYTpuCisJYXNkZgorICAgIGVuZGZ1bmN0aW9uCSIgcmV0dXJucyAtMQorCisgICAgZnVuY3Rpb24hIElOVChuKQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICJJIiAuIGE6bgorCSJJTlRFUlJVUFQ5CisJbGV0IGR1bW15ID0gMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgVEhSKG4pCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIlQiIC4gYTpuCisJdGhyb3cgInNob3VsZCBub3QgYmUgY2F1Z2h0IgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgQ09OVChuKQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICJDIiAuIGE6bgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgTVNHKG4pCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIk0iIC4gYTpuCisJaWYgKGE6biA+PSAxMCAmJiBhOm4gPD0gMjcpID8gdjplcnJtc2cgIT0gIiIgOiB2OmVycm1zZyAhfiAiYXNkZiIKKwkgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIngiCisJZW5kaWYKKwlsZXQgdjplcnJtc2cgPSAiIgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBsZXQgdjplcnJtc2cgPSAiIgorCisgICAgdHJ5CisJbGV0IHQgPSAxCisJWGxvb3BJTklUIDEgMgorCXdoaWxlIHQgPD0gOQorCSAgICBYbG9vcCAxCQkJCSIgWDogNTExCisJICAgIHRyeQorCQlpZiB0ID09IDEKKwkJICAgIGxldCB2e0VSUih0KSArIENPTlQodCl9ID0gMAorCQllbHNlaWYgdCA9PSAyCisJCSAgICBsZXQgdntFUlIodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAzCisJCSAgICBsZXQgdmFyID0gZXhpc3RzKCd2e0VSUih0KSArIENPTlQodCl9JykKKwkJZWxzZWlmIHQgPT0gNAorCQkgICAgdW5sZXQgdntFUlIodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSA1CisJCSAgICBmdW5jdGlvbiBGe0VSUih0KSArIENPTlQodCl9KCkKKwkJICAgIGVuZGZ1bmN0aW9uCisJCWVsc2VpZiB0ID09IDYKKwkJICAgIGZ1bmN0aW9uIEZ7RVJSKHQpICsgQ09OVCh0KX0KKwkJZWxzZWlmIHQgPT0gNworCQkgICAgbGV0IHZhciA9IGV4aXN0cygnKkZ7RVJSKHQpICsgQ09OVCh0KX0nKQorCQllbHNlaWYgdCA9PSA4CisJCSAgICBkZWxmdW5jdGlvbiBGe0VSUih0KSArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDkKKwkJICAgIGxldCB2YXIgPSBFUlIodCkgKyBDT05UKHQpCisJCWVuZGlmCisJICAgIGNhdGNoIC9hc2RmLworCQkiIHY6ZXJybXNnIGlzIG5vdCBzZXQgd2hlbiB0aGUgZXJyb3IgbWVzc2FnZSBpcyBjb252ZXJ0ZWQgdG8gYW4KKwkJIiBleGNlcHRpb24uICBTZXQgaXQgdG8gdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UuCisJCWxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltOicsICcnLCAiIikKKwkgICAgY2F0Y2ggL15WaW1cKChcYVwrKVwpXD06LworCQkiIEFuIGVycm9yIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gYWZ0ZXIgdGhlIG9yaWdpbmFsIGVycm9yLgorCQlsZXQgdjplcnJtc2cgPSAiIgorCSAgICBmaW5hbGx5CisJCWNhbGwgTVNHKHQpCisJCWxldCB0ID0gdCArIDEKKwkJWGxvb3BORVhUCisJCWNvbnRpbnVlCSIgZGlzY2FyZCBhbiBhYm9ydGluZyBlcnJvcgorCSAgICBlbmR0cnkKKwllbmR3aGlsZQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA1MTIJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIEV4dHJhVmltVGhyb3dwb2ludCgpCisgICAgZW5kdHJ5CisKKyAgICB0cnkKKwlsZXQgdCA9IDEwCisJWGxvb3BJTklUIDEwMjQgMgorCXdoaWxlIHQgPD0gMTgKKwkgICAgWGxvb3AgMQkJCQkiIFg6IDEwMjQgKiA1MTEKKwkgICAgdHJ5CisJCWlmIHQgPT0gMTAKKwkJICAgIGxldCB2e0lOVCh0KSArIENPTlQodCl9ID0gMAorCQllbHNlaWYgdCA9PSAxMQorCQkgICAgbGV0IHZ7SU5UKHQpICsgQ09OVCh0KX0KKwkJZWxzZWlmIHQgPT0gMTIKKwkJICAgIGxldCB2YXIgPSBleGlzdHMoJ3Z7SU5UKHQpICsgQ09OVCh0KX0nKQorCQllbHNlaWYgdCA9PSAxMworCQkgICAgdW5sZXQgdntJTlQodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAxNAorCQkgICAgZnVuY3Rpb24gRntJTlQodCkgKyBDT05UKHQpfSgpCisJCSAgICBlbmRmdW5jdGlvbgorCQllbHNlaWYgdCA9PSAxNQorCQkgICAgZnVuY3Rpb24gRntJTlQodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAxNgorCQkgICAgbGV0IHZhciA9IGV4aXN0cygnKkZ7SU5UKHQpICsgQ09OVCh0KX0nKQorCQllbHNlaWYgdCA9PSAxNworCQkgICAgZGVsZnVuY3Rpb24gRntJTlQodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAxOAorCQkgICAgbGV0IHZhciA9IElOVCh0KSArIENPTlQodCkKKwkJZW5kaWYKKwkgICAgY2F0Y2ggL15WaW1cKChcYVwrKVwpXD06XChJbnRlcnJ1cHRcKVxAIS8KKwkJIiBBbiBlcnJvciBleGNlcHRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGFmdGVyIHRoZSBpbnRlcnJ1cHQuCisJCWxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sCisJCSAgICBcICdeVmltXCgoXGFcKylcKVw9OicsICcnLCAiIikKKwkgICAgZmluYWxseQorCQljYWxsIE1TRyh0KQorCQlsZXQgdCA9IHQgKyAxCisJCVhsb29wTkVYVAorCQljb250aW51ZQkiIGRpc2NhcmQgaW50ZXJydXB0CisJICAgIGVuZHRyeQorCWVuZHdoaWxlCisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDUyNDI4OAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKyAgICBlbmR0cnkKKworICAgIHRyeQorCWxldCB0ID0gMTkKKwlYbG9vcElOSVQgMTA0ODU3NiAyCisJd2hpbGUgdCA8PSAyNworCSAgICBYbG9vcCAxCQkJCSIgWDogMTA0ODU3NiAqIDUxMQorCSAgICB0cnkKKwkJaWYgdCA9PSAxOQorCQkgICAgbGV0IHZ7VEhSKHQpICsgQ09OVCh0KX0gPSAwCisJCWVsc2VpZiB0ID09IDIwCisJCSAgICBsZXQgdntUSFIodCkgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAyMQorCQkgICAgbGV0IHZhciA9IGV4aXN0cygndntUSFIodCkgKyBDT05UKHQpfScpCisJCWVsc2VpZiB0ID09IDIyCisJCSAgICB1bmxldCB2e1RIUih0KSArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDIzCisJCSAgICBmdW5jdGlvbiBGe1RIUih0KSArIENPTlQodCl9KCkKKwkJICAgIGVuZGZ1bmN0aW9uCisJCWVsc2VpZiB0ID09IDI0CisJCSAgICBmdW5jdGlvbiBGe1RIUih0KSArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDI1CisJCSAgICBsZXQgdmFyID0gZXhpc3RzKCcqRntUSFIodCkgKyBDT05UKHQpfScpCisJCWVsc2VpZiB0ID09IDI2CisJCSAgICBkZWxmdW5jdGlvbiBGe1RIUih0KSArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDI3CisJCSAgICBsZXQgdmFyID0gVEhSKHQpICsgQ09OVCh0KQorCQllbmRpZgorCSAgICBjYXRjaCAvXlZpbVwoKFxhXCspXClcPTovCisJCSIgQW4gZXJyb3IgZXhjZXB0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBhZnRlciB0aGUgOnRocm93LgorCQlsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLAorCQkgICAgXCAnXlZpbVwoKFxhXCspXClcPTonLCAnJywgIiIpCisJICAgIGZpbmFsbHkKKwkJY2FsbCBNU0codCkKKwkJbGV0IHQgPSB0ICsgMQorCQlYbG9vcE5FWFQKKwkJY29udGludWUJIiBkaXNjYXJkIGV4Y2VwdGlvbgorCSAgICBlbmR0cnkKKwllbmR3aGlsZQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCA1MzY4NzA5MTIJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIEV4dHJhVmltVGhyb3dwb2ludCgpCisgICAgZW5kdHJ5CisKKyAgICBsZXQgdntFUlIoMjgpICsgQ09OVCgyOCl9ID0gMAorICAgIGNhbGwgTVNHKDI4KQorICAgIGxldCB2e0VSUigyOSkgKyBDT05UKDI5KX0KKyAgICBjYWxsIE1TRygyOSkKKyAgICBsZXQgdmFyID0gZXhpc3RzKCd2e0VSUigzMCkgKyBDT05UKDMwKX0nKQorICAgIGNhbGwgTVNHKDMwKQorICAgIHVubGV0IHZ7RVJSKDMxKSArIENPTlQoMzEpfQorICAgIGNhbGwgTVNHKDMxKQorICAgIGZ1bmN0aW9uIEZ7RVJSKDMyKSArIENPTlQoMzIpfSgpCisgICAgZW5kZnVuY3Rpb24KKyAgICBjYWxsIE1TRygzMikKKyAgICBmdW5jdGlvbiBGe0VSUigzMykgKyBDT05UKDMzKX0KKyAgICBjYWxsIE1TRygzMykKKyAgICBsZXQgdmFyID0gZXhpc3RzKCcqRntFUlIoMzQpICsgQ09OVCgzNCl9JykKKyAgICBjYWxsIE1TRygzNCkKKyAgICBkZWxmdW5jdGlvbiBGe0VSUigzNSkgKyBDT05UKDM1KX0KKyAgICBjYWxsIE1TRygzNSkKKyAgICBsZXQgdmFyID0gRVJSKDM2KSArIENPTlQoMzYpCisgICAgY2FsbCBNU0coMzYpCisKKyAgICBsZXQgdntFUlJhYm9ydCgzNykgKyBDT05UKDM3KX0gPSAwCisgICAgY2FsbCBNU0coMzcpCisgICAgbGV0IHZ7RVJSYWJvcnQoMzgpICsgQ09OVCgzOCl9CisgICAgY2FsbCBNU0coMzgpCisgICAgbGV0IHZhciA9IGV4aXN0cygndntFUlJhYm9ydCgzOSkgKyBDT05UKDM5KX0nKQorICAgIGNhbGwgTVNHKDM5KQorICAgIHVubGV0IHZ7RVJSYWJvcnQoNDApICsgQ09OVCg0MCl9CisgICAgY2FsbCBNU0coNDApCisgICAgZnVuY3Rpb24gRntFUlJhYm9ydCg0MSkgKyBDT05UKDQxKX0oKQorICAgIGVuZGZ1bmN0aW9uCisgICAgY2FsbCBNU0coNDEpCisgICAgZnVuY3Rpb24gRntFUlJhYm9ydCg0MikgKyBDT05UKDQyKX0KKyAgICBjYWxsIE1TRyg0MikKKyAgICBsZXQgdmFyID0gZXhpc3RzKCcqRntFUlJhYm9ydCg0MykgKyBDT05UKDQzKX0nKQorICAgIGNhbGwgTVNHKDQzKQorICAgIGRlbGZ1bmN0aW9uIEZ7RVJSYWJvcnQoNDQpICsgQ09OVCg0NCl9CisgICAgY2FsbCBNU0coNDQpCisgICAgbGV0IHZhciA9IEVSUmFib3J0KDQ1KSArIENPTlQoNDUpCisgICAgY2FsbCBNU0coNDUpCisKKyAgICBYcGF0aCAxMDczNzQxODI0CQkJCSIgWDogMTA3Mzc0MTgyNAorCisgICAgbGV0IGV4cGVjdGVkID0gIiIKKwlcIC4gIkUxTTFFMk0yRTNNM0U0TTRFNU01RTZNNkU3TTdFOE04RTlNOSIKKwlcIC4gIkkxME0xMEkxMU0xMUkxMk0xMkkxM00xM0kxNE0xNEkxNU0xNUkxNk0xNkkxN00xN0kxOE0xOCIKKwlcIC4gIlQxOU0xOVQyME0yMFQyMU0yMVQyMk0yMlQyM00yM1QyNE0yNFQyNU0yNVQyNk0yNlQyN00yNyIKKwlcIC4gIkUyOEMyOE0yOEUyOUMyOU0yOUUzMEMzME0zMEUzMUMzMU0zMUUzMkMzMk0zMkUzM0MzM00zMyIKKwlcIC4gIkUzNEMzNE0zNEUzNUMzNU0zNUUzNkMzNk0zNiIKKwlcIC4gIkEzN0MzN00zN0EzOEMzOE0zOEEzOUMzOU0zOUE0MEM0ME00MEE0MUM0MU00MUE0MkM0Mk00MiIKKwlcIC4gIkE0M0M0M000M0E0NEM0NE00NEE0NUM0NU00NSIKKworICAgIGlmIHRha2VuICE9IGV4cGVjdGVkCisJIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBkaXNwbGF5IGV4cGxpY2l0bHk6CisJZXhlYyAiIWVjaG8gMjE0NzQ4MzY0OCA+PiIgLiBnOkV4dHJhVmltUmVzdWx0CisJCQkJCQkiIFg6IDAKKwlYb3V0ICIndGFrZW4nIGlzIiB0YWtlbiAiaW5zdGVhZCBvZiIgZXhwZWN0ZWQKKwlpZiBzdWJzdGl0dXRlKHRha2VuLAorCVwgJ1woLipcKUUzQzNNM3hcKC4qXClFMzBDMzBNMzB4XCguKlwpQTM5QzM5TTM5eFwoLipcKScsCisJXCAnXDFFM00zXDJFMzBDMzBNMzBcM0EzOUMzOU0zOVw0JywKKwlcICIiKSA9PSBleHBlY3RlZAorCSAgICBYb3V0ICJJcyArK2Vtc2dfc2tpcCBmb3IgdmFyIHdpdGggZXhwcl9zdGFydCBub24tTlVMTCIKKwkJXCAiaW4gZl9leGlzdHMgb2s/IgorCWVuZGlmCisgICAgZW5kaWYKKworICAgIHVubGV0ISB2YXIgdGFrZW4gZXhwZWN0ZWQKKyAgICBjYWxsIGRlbGV0ZShXQV90NSkKKyAgICBjYWxsIGRlbGV0ZShXQV90MTQpCisgICAgY2FsbCBkZWxldGUoV0FfdDIzKQorICAgIHVubGV0ISBXQV90NSBXQV90MTQgV0FfdDIzCisgICAgZGVsZnVuY3Rpb24gV0FfdDUKKyAgICBkZWxmdW5jdGlvbiBXQV90MTQKKyAgICBkZWxmdW5jdGlvbiBXQV90MjMKKworZW5kaWYKKworWGNoZWNrIDE2MTAwODc5MzUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDc3OiAgRXJyb3JzLCBpbnRlcnVwdHMsIDp0aHJvdyBpbiBuYW1le2JyYWNlLWV4cHJlc3Npb259CQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhIGZ1bmN0aW9uIGNhbGwgbWFkZSBkdXJpbmcgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluCisiCSAgICBicmFjZXMgYXMgcGFydCBvZiBhIGZ1bmN0aW9uIG5hbWUgYWZ0ZXIgIjpmdW5jdGlvbiIgaXMgYWJvcnRlZCBkdWUKKyIJICAgIHRvIGFuIGVycm9yIGluc2lkZSBhIDp0cnkvOmVuZHRyeSByZWdpb24gb3IgZHVlIHRvIGFuIGludGVycnVwdCBvcgorIgkgICAgYSA6dGhyb3csIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgYWJvcnRlZCBhcyB3ZWxsLCBhbmQgdGhlCisiCSAgICBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGlnbm9yZWQsIHNraXBwaW5nIGFsbCBjb21tYW5kcyB0byB0aGUKKyIJICAgICI6ZW5kZnVuY3Rpb24iLiAgT24gYW4gZXJyb3Igbm90IGluc2lkZSA6dHJ5LzplbmR0cnksIHRoZSBleHByZXNzaW9uCisiCSAgICBldmFsdWF0aW9uIGNvbnRpbnVlcyBhbmQgdGhlIGZ1bmN0aW9uIGdldHMgZGVmaW5lZCwgYW5kIGNhbiBiZQorIgkgICAgY2FsbGVkIGFuZCBkZWxldGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK1hsb29wSU5JVCAxIDQKKworZnVuY3Rpb24hIEVSUigpIGFib3J0CisgICAgWGxvb3AgMQkJCQkJIiBYOiAxICsgNCArIDE2ICsgNjQKKyAgICBhc2RmCitlbmRmdW5jdGlvbgkJIiByZXR1cm5zIC0xCisKK2Z1bmN0aW9uISBPSygpCisgICAgWGxvb3AgMgkJCQkJIiBYOiAyICogKDEgKyA0ICsgMTYpCisgICAgbGV0IHY6ZXJybXNnID0gIiIKKyAgICByZXR1cm4gMAorZW5kZnVuY3Rpb24KKworbGV0IHY6ZXJybXNnID0gIiIKKworWHBhdGggNDA5NgkJCQkJIiBYOiA0MDk2CitmdW5jdGlvbiEgRnsxICsgRVJSKCkgKyBPSygpfShhcmcpCisgICAgIiBGMCBzaG91bGQgYmUgZGVmaW5lZC4KKyAgICBpZiBleGlzdHMoImE6YXJnIikgJiYgYTphcmcgPT0gImNhbGxpbmciCisJWHBhdGggODE5MgkJCQkiIFg6IDgxOTIKKyAgICBlbHNlCisJWHBhdGggMTYzODQJCQkJIiBYOiAwCisgICAgZW5kaWYKK2VuZGZ1bmN0aW9uCitpZiB2OmVycm1zZyAhPSAiIgorICAgIFhwYXRoIDMyNzY4CQkJCQkiIFg6IDAKK2VuZGlmCitYbG9vcE5FWFQKKworWHBhdGggNjU1MzYJCQkJCSIgWDogNjU1MzYKK2NhbGwgRnsxICsgRVJSKCkgKyBPSygpfSgiY2FsbGluZyIpCitpZiB2OmVycm1zZyAhPSAiIgorICAgIFhwYXRoIDEzMTA3MgkJCQkiIFg6IDAKK2VuZGlmCitYbG9vcE5FWFQKKworWHBhdGggMjYyMTQ0CQkJCQkiIFg6IDI2MjE0NAorZGVsZnVuY3Rpb24gRnsxICsgRVJSKCkgKyBPSygpfQoraWYgdjplcnJtc2cgIT0gIiIKKyAgICBYcGF0aCA1MjQyODgJCQkJIiBYOiAwCitlbmRpZgorWGxvb3BORVhUCisKK3RyeQorICAgIHdoaWxlIDEKKwlsZXQgY2F1Z2h0ID0gMAorCXRyeQorCSAgICBYcGF0aCAxMDQ4NTc2CQkJIiBYOiAxMDQ4NTc2CisJICAgIGZ1bmN0aW9uISBHezEgKyBFUlIoKSArIE9LKCl9KGFyZykKKwkJIiBHMCBzaG91bGQgbm90IGJlIGRlZmluZWQsIGFuZCB0aGUgZnVuY3Rpb24gYm9keSBzaG91bGQgYmUKKwkJIiBza2lwcGVkLgorCQlpZiBleGlzdHMoImE6YXJnIikgJiYgYTphcmcgPT0gImNhbGxpbmciCisJCSAgICBYcGF0aCAyMDk3MTUyCQkiIFg6IDAKKwkJZWxzZQorCQkgICAgWHBhdGggNDE5NDMwNAkJIiBYOiAwCisJCWVuZGlmCisJCSIgVXNlIGFuIHVubWF0Y2hlZCAiOmZpbmFsbHkiIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJvZHkgaXMKKwkJIiBza2lwcGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIEVSUigpLiAgVGhpcyB3b3JrcyB3aGV0aGVyIG9yCisJCSIgbm90IHRoZSBleGNlcHRpb24gaXMgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbi4KKwkJZmluYWxseQorCQkgICAgWHBhdGggODM4ODYwOAkJIiBYOiAwCisJCSAgICBYb3V0ICJCb2R5IG9mIEd7MSArIEVSUigpICsgT0soKX0oKSBub3Qgc2tpcHBlZCIKKwkJICAgICIgRGlzY2FyZCB0aGUgYWJvcnRpbmcgZXJyb3Igb3IgZXhjZXB0aW9uLCBhbmQgYnJlYWsgdGhlCisJCSAgICAiIHdoaWxlIGxvb3AuCisJCSAgICBicmVhaworCQkiIEVuZCB0aGUgdHJ5IGNvbmRpdGlvbmFsIGFuZCBzdGFydCBhIG5ldyBvbmUgdG8gYXZvaWQKKwkJIiAiOmNhdGNoIGFmdGVyIDpmaW5hbGx5IiBlcnJvcnMuCisJCWVuZHRyeQorCQl0cnkKKwkJWHBhdGggMTY3NzcyMTYJCQkiIFg6IDAKKwkgICAgZW5kZnVuY3Rpb24KKworCSAgICAiIFdoZW4gdGhlIGZ1bmN0aW9uIHdhcyBub3QgZGVmaW5lZCwgdGhpcyB3b24ndCBiZSByZWFjaGVkIC0gd2hldGhlcgorCSAgICAiIHRoZSBib2R5IHdhcyBza2lwcGVkIG9yIG5vdC4gIFdoZW4gdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLCBpdAorCSAgICAiIGNhbiBiZSBjYWxsZWQgYW5kIGRlbGV0ZWQgaGVyZS4KKwkgICAgWHBhdGggMzM1NTQ0MzIJCQkiIFg6IDAKKwkgICAgWG91dCAiRzAoKSBoYXMgYmVlbiBkZWZpbmVkIgorCSAgICBYbG9vcE5FWFQKKwkgICAgdHJ5CisJCWNhbGwgR3sxICsgRVJSKCkgKyBPSygpfSgiY2FsbGluZyIpCisJICAgIGNhdGNoIC8uKi8KKwkJWHBhdGggNjcxMDg4NjQJCQkiIFg6IDAKKwkgICAgZW5kdHJ5CisJICAgIFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMAorCSAgICBYbG9vcE5FWFQKKwkgICAgdHJ5CisJCWRlbGZ1bmN0aW9uIEd7MSArIEVSUigpICsgT0soKX0KKwkgICAgY2F0Y2ggLy4qLworCQlYcGF0aCAyNjg0MzU0NTYJCQkiIFg6IDAKKwkgICAgZW5kdHJ5CisJY2F0Y2ggL2FzZGYvCisJICAgICIgSnVtcGVkIHRvIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgYm9keSBpcworCSAgICAiIHNraXBwZWQuCisJICAgIGxldCBjYXVnaHQgPSAxCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA1MzY4NzA5MTIJCQkiIFg6IDAKKwlmaW5hbGx5CisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDEwNzM3NDE4MjQJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworCWVuZHRyeQkJCSIganVtcGVkIHRvIHdoZW4gdGhlIGJvZHkgaXMgbm90IHNraXBwZWQKKyAgICBlbmR3aGlsZQorY2F0Y2ggLy4qLworICAgICIgVGhlIFhwYXRoIGNvbW1hbmQgZG9lcyBub3QgYWNjZXB0IDJeMzEgKG5lZ2F0aXZlKTsgYWRkIGV4cGxpY2l0bHk6CisgICAgbGV0IFhwYXRoID0gWHBhdGggKyAyMTQ3NDgzNjQ4CQkiIFg6IDAKKyAgICBYb3V0ICJCb2R5IG9mIEd7MSArIEVSUigpICsgT0soKX0oKSBub3Qgc2tpcHBlZCwgZXhjZXB0aW9uIGNhdWdodCIKKyAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CitlbmR0cnkKKworWGNoZWNrIDEzODg2NzEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDc4OiAgTWVzc2FnZXMgb24gcGFyc2luZyBlcnJvcnMgaW4gZXhwcmVzc2lvbiBldmFsdWF0aW9uCQkgICAge3t7MQorIgorIgkgICAgV2hlbiBhbiBleHByZXNzaW9uIGV2YWx1YXRpb24gZGV0ZWN0cyBhIHBhcnNpbmcgZXJyb3IsIGFuIGVycm9yCisiCSAgICBtZXNzYWdlIGlzIGdpdmVuIGFuZCBjb252ZXJ0ZWQgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIGV4cHJlc3Npb24KKyIJICAgIGV2YWx1YXRpb24gaXMgYWJvcnRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisKKyAgICBsZXQgdGFrZW4gPSAiIgorCisgICAgZnVuY3Rpb24hIEYobikKKwlsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAiRiIgLiBhOm4KKyAgICBlbmRmdW5jdGlvbgorCisgICAgZnVuY3Rpb24hIE1TRyhuLCBlbnIsIGVtc2cpCisJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIk0iIC4gYTpuCisJbGV0IGVuZ2xpc2ggPSB2OmxhbmcgPT0gIkMiIHx8IHY6bGFuZyA9fiAnXltFZV1uJworCWlmIGE6ZW5yID09ICIiCisJICAgIFhvdXQgIlRPRE86IEFkZCBtZXNzYWdlIG51bWJlciBmb3I6IiBhOmVtc2cKKwkgICAgbGV0IHY6ZXJybXNnID0gIjoiIC4gdjplcnJtc2cKKwllbmRpZgorCWlmIHY6ZXJybXNnICF+ICdeJy5hOmVuci4nOicgfHwgKGVuZ2xpc2ggJiYgdjplcnJtc2cgIX4gYTplbXNnKQorCSAgICBpZiB2OmVycm1zZyA9PSAiIgorCQlYb3V0ICJFeHByIiBhOm4uIjogTWVzc2FnZSBtaXNzaW5nLiIKKwkJbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIngiCisJICAgIGVsc2UKKwkJbGV0IHY6ZXJybXNnID0gZXNjYXBlKHY6ZXJybXNnLCAnIicpCisJCVhvdXQgIkV4cHIiIGE6bi4iOiBVbmV4cGVjdGVkIG1lc3NhZ2U6IiB2OmVycm1zZworCQlsZXQgZzp0YWtlbiA9IGc6dGFrZW4gLiAiWCIKKwkgICAgZW5kaWYKKwllbmRpZgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgQ09OVChuKQorCWxldCBnOnRha2VuID0gZzp0YWtlbiAuICJDIiAuIGE6bgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBsZXQgdjplcnJtc2cgPSAiIgorICAgIFhsb29wSU5JVCAxIDIKKworICAgIHRyeQorCWxldCB0ID0gMQorCXdoaWxlIHQgPD0gMTQKKwkgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIlQiIC4gdAorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICB0cnkKKwkJbGV0IGNhdWdodCA9IDAKKwkJaWYgdCA9PSAxCisJCSAgICBsZXQgdntub3ZhciArIENPTlQodCl9ID0gMAorCQllbHNlaWYgdCA9PSAyCisJCSAgICBsZXQgdntub3ZhciArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDMKKwkJICAgIGxldCB2YXIgPSBleGlzdHMoJ3Z7bm92YXIgKyBDT05UKHQpfScpCisJCWVsc2VpZiB0ID09IDQKKwkJICAgIHVubGV0IHZ7bm92YXIgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSA1CisJCSAgICBmdW5jdGlvbiBGe25vdmFyICsgQ09OVCh0KX0oKQorCQkgICAgZW5kZnVuY3Rpb24KKwkJZWxzZWlmIHQgPT0gNgorCQkgICAgZnVuY3Rpb24gRntub3ZhciArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDcKKwkJICAgIGxldCB2YXIgPSBleGlzdHMoJypGe25vdmFyICsgQ09OVCh0KX0nKQorCQllbHNlaWYgdCA9PSA4CisJCSAgICBkZWxmdW5jdGlvbiBGe25vdmFyICsgQ09OVCh0KX0KKwkJZWxzZWlmIHQgPT0gOQorCQkgICAgZWNobyBub3ZhciArIENPTlQodCkKKwkJZWxzZWlmIHQgPT0gMTAKKwkJICAgIGVjaG8gdntub3ZhciArIENPTlQodCl9CisJCWVsc2VpZiB0ID09IDExCisJCSAgICBlY2hvIEZ7bm92YXIgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAxMgorCQkgICAgbGV0IHZhciA9IG5vdmFyICsgQ09OVCh0KQorCQllbHNlaWYgdCA9PSAxMworCQkgICAgbGV0IHZhciA9IHZ7bm92YXIgKyBDT05UKHQpfQorCQllbHNlaWYgdCA9PSAxNAorCQkgICAgbGV0IHZhciA9IEZ7bm92YXIgKyBDT05UKHQpfSgpCisJCWVuZGlmCisJICAgIGNhdGNoIC9eVmltXCgoXGFcKylcKVw9Oi8KKwkJIiB2OmVycm1zZyBpcyBub3Qgc2V0IHdoZW4gdGhlIGVycm9yIG1lc3NhZ2UgaXMgY29udmVydGVkIHRvIGFuCisJCSIgZXhjZXB0aW9uLiAgU2V0IGl0IHRvIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlLgorCQlsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLAorCQkgICAgXCAnXlZpbVwoKFxhXCspXClcPTonLCAnJywgIiIpCisJCWxldCBjYXVnaHQgPSAxCisJICAgIGZpbmFsbHkKKwkJaWYgIWNhdWdodAkiIG5vIGVycm9yIGV4Y2VwdGlvbnMgKCRWSU1OT0VSUlRIUk9XIHNldCkKKwkJICAgIGlmIHQgPD0gOCAmJiB0ICE9IDMKKwkJCWNhbGwgTVNHKHQsICdFNDc1JywgJ0ludmFsaWQgYXJndW1lbnRcPicpCisJCSAgICBlbHNlCisJCQljYWxsIE1TRyh0LCAnRTE1JywgIkludmFsaWQgZXhwcmVzc2lvbiIpCisJCSAgICBlbmRpZgorCQllbHNlCisJCSAgICBpZiB0ID09IDIgfHwgdCA9PSA0CisJCQljYWxsIE1TRyh0LCAnRTQ3NScsICdJbnZhbGlkIGFyZ3VtZW50XD4nKQorCQkgICAgZWxzZQorCQkJY2FsbCBNU0codCwgJ0UxMjEnLCAiVW5kZWZpbmVkIHZhcmlhYmxlIikKKwkJICAgIGVuZGlmCisJCWVuZGlmCisJCWxldCB0ID0gdCArIDEKKwkJWGxvb3BORVhUCisJCWNvbnRpbnVlCSIgZGlzY2FyZCBhbiBhYm9ydGluZyBlcnJvcgorCSAgICBlbmR0cnkKKwllbmR3aGlsZQorICAgIGNhdGNoIC8uKi8KKwlYbG9vcCAxCQkJCQkiIFg6IDAKKwlYb3V0IHQuIjoiIHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKyAgICBlbmR0cnkKKworICAgIGZ1bmN0aW9uISBUKG4sIGV4cHIsIGVuciwgZW1zZykKKwl0cnkKKwkgICAgbGV0IGc6dGFrZW4gPSBnOnRha2VuIC4gIlQiIC4gYTpuCisJICAgIGxldCB2OmVycm1zZyA9ICIiCisJICAgIHRyeQorCQlsZXQgY2F1Z2h0ID0gMAorCQlleGVjdXRlICJsZXQgdmFyID0gIiAuIGE6ZXhwcgorCSAgICBjYXRjaCAvXlZpbVwoKFxhXCspXClcPTovCisJCSIgdjplcnJtc2cgaXMgbm90IHNldCB3aGVuIHRoZSBlcnJvciBtZXNzYWdlIGlzIGNvbnZlcnRlZCB0byBhbgorCQkiIGV4Y2VwdGlvbi4gIFNldCBpdCB0byB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZS4KKwkJbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwKKwkJICAgIFwgJ15WaW1cKChcYVwrKVwpXD06JywgJycsICIiKQorCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCWlmICFjYXVnaHQJIiBubyBlcnJvciBleGNlcHRpb25zICgkVklNTk9FUlJUSFJPVyBzZXQpCisJCSAgICBjYWxsIE1TRyhhOm4sICdFMTUnLCAiSW52YWxpZCBleHByZXNzaW9uIikKKwkJZWxzZQorCQkgICAgY2FsbCBNU0coYTpuLCBhOmVuciwgYTplbXNnKQorCQllbmRpZgorCQlYbG9vcE5FWFQKKwkJIiBEaXNjYXJkIGFuIGFib3J0aW5nIGVycm9yOgorCQlyZXR1cm4KKwkgICAgZW5kdHJ5CisJY2F0Y2ggLy4qLworCSAgICBYbG9vcCAxCQkJCSIgWDogMAorCSAgICBYb3V0IGE6bi4iOiIgdjpleGNlcHRpb24gImluIiBFeHRyYVZpbVRocm93cG9pbnQoKQorCWVuZHRyeQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBjYWxsIFQoMTUsICdOb2Z1bmMoKSArIENPTlQoMTUpJywJJ0UxMTcnLAkiVW5rbm93biBmdW5jdGlvbiIpCisgICAgY2FsbCBUKDE2LCAnRigxIDIgKyBDT05UKDE2KSknLAknRTExNicsCSJJbnZhbGlkIGFyZ3VtZW50cyIpCisgICAgY2FsbCBUKDE3LCAnRigxLCAyKSArIENPTlQoMTcpJywJJ0UxMTgnLAkiVG9vIG1hbnkgYXJndW1lbnRzIikKKyAgICBjYWxsIFQoMTgsICdGKCkgKyBDT05UKDE4KScsCSdFMTE5JywJIk5vdCBlbm91Z2ggYXJndW1lbnRzIikKKyAgICBjYWxsIFQoMTksICd7KDF9ICsgQ09OVCgxOSknLAknRTExMCcsCSJNaXNzaW5nICcpJyIpCisgICAgY2FsbCBUKDIwLCAnKCJhYmMiWzEpICsgQ09OVCgyMCknLAknRTExMScsCSJNaXNzaW5nICddJyIpCisgICAgY2FsbCBUKDIxLCAnKDEgKykgKyBDT05UKDIxKScsCSdFMTUnLAkiSW52YWxpZCBleHByZXNzaW9uIikKKyAgICBjYWxsIFQoMjIsICcxIDIgKyBDT05UKDIyKScsCSdFMTUnLAkiSW52YWxpZCBleHByZXNzaW9uIikKKyAgICBjYWxsIFQoMjMsICcoMSA/IDIpICsgQ09OVCgyMyknLAknRTEwOScsCSJNaXNzaW5nICc6JyBhZnRlciAnPyciKQorICAgIGNhbGwgVCgyNCwgJygiYWJjKSArIENPTlQoMjQpJywJJ0UxMTQnLAkiTWlzc2luZyBxdW90ZSIpCisgICAgY2FsbCBUKDI1LCAiKCdhYmMpICsgQ09OVCgyNSkiLAknRTExNScsCSJNaXNzaW5nIHF1b3RlIikKKyAgICBjYWxsIFQoMjYsICcmICsgQ09OVCgyNiknLAkJJ0UxMTInLCAiT3B0aW9uIG5hbWUgbWlzc2luZyIpCisgICAgY2FsbCBUKDI3LCAnJmFzZGYgKyBDT05UKDI3KScsCSdFMTEzJywgIlVua25vd24gb3B0aW9uIikKKworICAgIFhwYXRoIDEzNDIxNzcyOAkJCQkiIFg6IDEzNDIxNzcyOAorCisgICAgbGV0IGV4cGVjdGVkID0gIiIKKwlcIC4gIlQxTTFUMk0yVDNNM1Q0TTRUNU01VDZNNlQ3TTdUOE04VDlNOVQxME0xMFQxMU0xMVQxMk0xMlQxM00xM1QxNE0xNCIKKwlcIC4gIlQxNU0xNVQxNk0xNlQxN00xN1QxOE0xOFQxOU0xOVQyME0yMFQyMU0yMVQyMk0yMlQyM00yM1QyNE0yNFQyNU0yNSIKKwlcIC4gIlQyNk0yNlQyN00yNyIKKworICAgIGlmIHRha2VuICE9IGV4cGVjdGVkCisJWHBhdGggMjY4NDM1NDU2CQkJCSIgWDogMAorCVhvdXQgIid0YWtlbicgaXMiIHRha2VuICJpbnN0ZWFkIG9mIiBleHBlY3RlZAorCWlmIHN1YnN0aXR1dGUodGFrZW4sICdcKC4qXClUM00zeFwoLipcKScsICdcMVQzTTNcMicsICIiKSA9PSBleHBlY3RlZAorCSAgICBYb3V0ICJJcyArK2Vtc2dfc2tpcCBmb3IgdmFyIHdpdGggZXhwcl9zdGFydCBub24tTlVMTCIKKwkJXCAiaW4gZl9leGlzdHMgb2s/IgorCWVuZGlmCisgICAgZW5kaWYKKworICAgIHVubGV0ISB2YXIgY2F1Z2h0IHRha2VuIGV4cGVjdGVkCisgICAgY2FsbCBkZWxldGUoV0FfdDUpCisgICAgdW5sZXQhIFdBX3Q1CisgICAgZGVsZnVuY3Rpb24gV0FfdDUKKworZW5kaWYKKworWGNoZWNrIDEzNDIxNzcyOAorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIFRlc3QgNzk6ICBUaHJvd2luZyBvbmUgb2Ygc2V2ZXJhbCBlcnJvcnMgZm9yIHRoZSBzYW1lIGNvbW1hbmQJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIHNldmVyYWwgZXJyb3JzIGFwcGVhciBpbiBhIHJvdyAoZm9yIGluc3RhbmNlIGR1cmluZyBleHByZXNzaW9uCisiCSAgICBldmFsdWF0aW9uKSwgdGhlIGZpcnN0IGFzIHRoZSBtb3N0IHNwZWNpZmljIG9uZSBpcyB1c2VkIHdoZW4KKyIJICAgIHRocm93aW5nIGFuIGVycm9yIGV4Y2VwdGlvbi4gIElmLCBob3dldmVyLCBhIHN5bnRheCBlcnJvciBpcworIgkgICAgZGV0ZWN0ZWQgYWZ0ZXJ3YXJkcywgdGhpcyBvbmUgaXMgdXNlZCBmb3IgdGhlIGVycm9yIGV4Y2VwdGlvbi4KKyIJICAgIE9uIGEgc3ludGF4IGVycm9yLCB0aGUgbmV4dCBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCwgb24gYSBub3JtYWwKKyIJICAgIGVycm9yLCBob3dldmVyLCBpdCBpcyAocmVsZXZhbnQgb25seSBpbiBhIGZ1bmN0aW9uIHdpdGhvdXQgdGhlCisiCSAgICAiYWJvcnQiIGZsYWcpLiAgdjplcnJtc2cgaXMgbm90IHNldC4KKyIKKyIJICAgIElmIHRocm93aW5nIGVycm9yIGV4Y2VwdGlvbnMgaXMgY29uZmlndXJlZCBvZmYsIHY6ZXJybXNnIGlzIGFsd2F5cworIgkgICAgc2V0IHRvIHRoZSBsYXRlc3QgZXJyb3IgbWVzc2FnZSwgdGhhdCBpcywgdG8gdGhlIG1vcmUgZ2VuZXJhbAorIgkgICAgbWVzc2FnZSBvciB0aGUgc3ludGF4IGVycm9yLCByZXNwZWN0aXZlbHkuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworWGxvb3BJTklUIDEgMgorCitmdW5jdGlvbiEgTkVYVChjbWQpCisgICAgZXhlYyBhOmNtZCAuICIgfCBYbG9vcCAxIgorZW5kZnVuY3Rpb24KKworY2FsbCBORVhUKCdlY2hvIG5vdmFyJykJCQkJIiBYOiAxICogIDEgIChjaGVja3MgbmV4dGNtZCkKK1hsb29wTkVYVAorY2FsbCBORVhUKCdsZXQgbm92YXIgIycpCQkJIiBYOiAwICogIDIgIChza2lwcyBuZXh0Y21kKQorWGxvb3BORVhUCitjYWxsIE5FWFQoJ3VubGV0IG5vdmFyICMnKQkJCSIgWDogMCAqICA0ICAoc2tpcHMgbmV4dGNtZCkKK1hsb29wTkVYVAorY2FsbCBORVhUKCdsZXQge25vdmFyfScpCQkJIiBYOiAwICogIDggIChza2lwcyBuZXh0Y21kKQorWGxvb3BORVhUCitjYWxsIE5FWFQoJ3VubGV0eyBub3Zhcn0nKQkJCSIgWDogMCAqIDE2ICAoc2tpcHMgbmV4dGNtZCkKKworZnVuY3Rpb24hIEVYRUMoY21kKQorICAgIGV4ZWMgYTpjbWQKK2VuZGZ1bmN0aW9uCisKK2Z1bmN0aW9uISBNQVRDSChleHBlY3RlZCwgbXNnLCBlbnIsIGVtc2cpCisgICAgbGV0IG1zZyA9IGE6bXNnCisgICAgaWYgYTplbnIgPT0gIiIKKwlYb3V0ICJUT0RPOiBBZGQgbWVzc2FnZSBudW1iZXIgZm9yOiIgYTplbXNnCisJbGV0IG1zZyA9ICI6IiAuIG1zZworICAgIGVuZGlmCisgICAgbGV0IGVuZ2xpc2ggPSB2OmxhbmcgPT0gIkMiIHx8IHY6bGFuZyA9fiAnXltFZV1uJworICAgIGlmIG1zZyAhfiAnXicuYTplbnIuJzonIHx8IChlbmdsaXNoICYmIG1zZyAhfiBhOmVtc2cpCisJbGV0IG1hdGNoID0gIDAKKwlpZiBhOmV4cGVjdGVkCQkiIG5vIG1hdGNoIGFsdGhvdWdoIGV4cGVjdGVkCisJICAgIGlmIGE6bXNnID09ICIiCisJCVhvdXQgIk1lc3NhZ2UgbWlzc2luZy4iCisJICAgIGVsc2UKKwkJbGV0IG1zZyA9IGVzY2FwZShtc2csICciJykKKwkJWG91dCAiVW5leHBlY3RlZCBtZXNzYWdlOiIgbXNnCisJICAgIGVuZGlmCisJZW5kaWYKKyAgICBlbHNlCisJbGV0IG1hdGNoID0gIDEKKwlpZiAhYTpleHBlY3RlZAkJIiBtYXRjaCBhbHRob3VnaCBub3QgZXhwZWN0ZWQKKwkgICAgbGV0IG1zZyA9IGVzY2FwZShtc2csICciJykKKwkgICAgWG91dCAiVW5leHBlY3RlZCBtZXNzYWdlOiIgbXNnCisJZW5kaWYKKyAgICBlbmRpZgorICAgIHJldHVybiBtYXRjaAorZW5kZnVuY3Rpb24KKwordHJ5CisKKyAgICB3aGlsZSAxCQkJCSIgZHVtbXkgbG9vcAorCXRyeQorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBsZXQgdGhybXNnID0gIiIKKwkgICAgY2FsbCBFWEVDKCdlY2hvIG5vdmFyJykJIiBub3JtYWwgZXJyb3IKKwljYXRjaCAvXlZpbVwoKFxhXCspXClcPTovCisJICAgIGxldCBjYXVnaHQgPSAxCisJICAgIGxldCB0aHJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbVwoKFxhXCspXClcPTonLCAnJywgIiIpCisJZmluYWxseQorCSAgICBYcGF0aCAzMgkJCQkiIFg6IDMyCisJICAgIGlmICFjYXVnaHQKKwkJaWYgISRWSU1OT0VSUlRIUk9XCisJCSAgICBYcGF0aCA2NAkJCSIgWDogMAorCQllbmRpZgorCSAgICBlbHNlaWYgIU1BVENIKDEsIHRocm1zZywgJ0UxMjEnLCAiVW5kZWZpbmVkIHZhcmlhYmxlIikKKwkgICAgXCB8fCB2OmVycm1zZyAhPSAiIgorCQlYcGF0aCAxMjgJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwkgICAgaWYgIWNhdWdodCAmJiAhTUFUQ0goMSwgdjplcnJtc2csICdFMTUnLCAiSW52YWxpZCBleHByZXNzaW9uIikKKwkJWHBhdGggMjU2CQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGJyZWFrCQkJIiBkaXNjYXJkIGVycm9yIGlmICRWSU1OT0VSUlRIUk9XID09IDEKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgWHBhdGggNTEyCQkJCQkiIFg6IDUxMgorICAgIGxldCBjbWQgPSAibGV0IgorICAgIFhsb29wSU5JVCAxMDI0IDMyCisgICAgd2hpbGUgY21kICE9ICIiCisJdHJ5CisJICAgIGxldCB2OmVycm1zZyA9ICIiCisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIGxldCB0aHJtc2cgPSAiIgorCSAgICBjYWxsIEVYRUMoY21kIC4gJyBub3ZhciAjJykJCSIgbm9ybWFsIHBsdXMgc3ludGF4IGVycm9yCisJY2F0Y2ggL15WaW1cKChcYVwrKVwpXD06LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdGhybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW1cKChcYVwrKVwpXD06JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWGxvb3AgMQkJCQkiIFg6IDEwMjQgKiAoMSArIDMyKQorCSAgICBpZiAhY2F1Z2h0CisJCWlmICEkVklNTk9FUlJUSFJPVworCQkgICAgWGxvb3AgMgkJCSIgWDogMAorCQllbmRpZgorCSAgICBlbHNlCisJCWlmIGNtZCA9PSAibGV0IgorCQkgICAgbGV0IG1hdGNoID0gTUFUQ0goMCwgdGhybXNnLCAnRTEwNicsICJVbmtub3duIHZhcmlhYmxlIikKKwkJZWxzZWlmIGNtZCA9PSAidW5sZXQiCisJCSAgICBsZXQgbWF0Y2ggPSBNQVRDSCgwLCB0aHJtc2csICdFMTA4JywgIk5vIHN1Y2ggdmFyaWFibGUiKQorCQllbmRpZgorCQlpZiBtYXRjaAkJCQkJIiBub3JtYWwgZXJyb3IKKwkJICAgIFhsb29wIDQJCQkiIFg6IDAKKwkJZW5kaWYKKwkJaWYgIU1BVENIKDEsIHRocm1zZywgJ0U0ODgnLCAiVHJhaWxpbmcgY2hhcmFjdGVycyIpCisJCVx8fCB2OmVycm1zZyAhPSAiIgorCQkJCQkJCQkiIHN5bnRheCBlcnJvcgorCQkgICAgWGxvb3AgOAkJCSIgWDogMAorCQllbmRpZgorCSAgICBlbmRpZgorCSAgICBpZiAhY2F1Z2h0ICYmICFNQVRDSCgxLCB2OmVycm1zZywgJ0U0ODgnLCAiVHJhaWxpbmcgY2hhcmFjdGVycyIpCisJCQkJCQkJCSIgbGFzdCBlcnJvcgorCQlYbG9vcCAxNgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiBjbWQgPT0gImxldCIKKwkJbGV0IGNtZCA9ICJ1bmxldCIKKwkgICAgZWxzZQorCQlsZXQgY21kID0gIiIKKwkgICAgZW5kaWYKKwkgICAgWGxvb3BORVhUCisJICAgIGNvbnRpbnVlCQkJIiBkaXNjYXJkIGVycm9yIGlmICRWSU1OT0VSUlRIUk9XID09IDEKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorCisgICAgWHBhdGggMTA0ODU3NgkJCQkiIFg6IDEwNDg1NzYKKyAgICBsZXQgY21kID0gImxldCIKKyAgICBYbG9vcElOSVQgMjA5NzE1MiAzMgorICAgIHdoaWxlIGNtZCAhPSAiIgorCXRyeQorCSAgICBsZXQgdjplcnJtc2cgPSAiIgorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBsZXQgdGhybXNnID0gIiIKKwkgICAgY2FsbCBFWEVDKGNtZCAuICcge25vdmFyfScpCQkiIG5vcm1hbCBwbHVzIHN5bnRheCBlcnJvcgorCWNhdGNoIC9eVmltXCgoXGFcKylcKVw9Oi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHRocm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltXCgoXGFcKylcKVw9OicsICcnLCAiIikKKwlmaW5hbGx5CisJICAgIFhsb29wIDEJCQkJIiBYOiAyMDk3MTUyICogKDEgKyAzMikKKwkgICAgaWYgIWNhdWdodAorCQlpZiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhsb29wIDIJCQkiIFg6IDAKKwkJZW5kaWYKKwkgICAgZWxzZQorCQlpZiBNQVRDSCgwLCB0aHJtc2csICdFMTIxJywgIlVuZGVmaW5lZCB2YXJpYWJsZSIpICIgbm9ybWFsIGVycm9yCisJCSAgICBYbG9vcCA0CQkJIiBYOiAwCisJCWVuZGlmCisJCWlmICFNQVRDSCgxLCB0aHJtc2csICdFNDc1JywgJ0ludmFsaWQgYXJndW1lbnRcPicpCisJCVwgfHwgdjplcnJtc2cgIT0gIiIJCQkJICAiIHN5bnRheCBlcnJvcgorCQkgICAgWGxvb3AgOAkJCSIgWDogMAorCQllbmRpZgorCSAgICBlbmRpZgorCSAgICBpZiAhY2F1Z2h0ICYmICFNQVRDSCgxLCB2OmVycm1zZywgJ0U0NzUnLCAnSW52YWxpZCBhcmd1bWVudFw+JykKKwkJCQkJCQkJIiBsYXN0IGVycm9yCisJCVhsb29wIDE2CQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIGNtZCA9PSAibGV0IgorCQlsZXQgY21kID0gInVubGV0IgorCSAgICBlbHNlCisJCWxldCBjbWQgPSAiIgorCSAgICBlbmRpZgorCSAgICBYbG9vcE5FWFQKKwkgICAgY29udGludWUJCQkiIGRpc2NhcmQgZXJyb3IgaWYgJFZJTU5PRVJSVEhST1cgPT0gMQorCWVuZHRyeQorICAgIGVuZHdoaWxlCisKK2NhdGNoIC8uKi8KKyAgICAiIFRoZSBYcGF0aCBjb21tYW5kIGRvZXMgbm90IGFjY2VwdCAyXjMxIChuZWdhdGl2ZSk7IGFkZCBleHBsaWNpdGx5OgorICAgIGxldCBYcGF0aCA9IFhwYXRoICsgMjE0NzQ4MzY0OAkJIiBYOiAwCisgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorZW5kdHJ5CisKK3VubGV0ISBuZXh0X2NvbW1hbmQgdGhybXNnIG1hdGNoCitkZWxmdW5jdGlvbiBORVhUCitkZWxmdW5jdGlvbiBFWEVDCitkZWxmdW5jdGlvbiBNQVRDSAorCitYY2hlY2sgNzAyODg5MjkKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDgwOiAgU3ludGF4IGVycm9yIGluIGV4cHJlc3Npb24gZm9yIGlsbGVnYWwgOmVsc2VpZgkJICAgIHt7ezEKKyIKKyIJICAgIElmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yIGluIHRoZSBleHByZXNzaW9uIGFmdGVyIGFuIGlsbGVnYWwKKyIJICAgIDplbHNlaWYsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4gKG9yIGFuIGVycm9yIGV4Y2VwdGlvbiB0aHJvd24pCisiCSAgICBmb3IgdGhlIGlsbGVnYWwgOmVsc2VpZiByYXRoZXIgdGhhbiB0aGUgZXhwcmVzc2lvbiBlcnJvci4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitmdW5jdGlvbiEgTVNHKGVuciwgZW1zZykKKyAgICBsZXQgZW5nbGlzaCA9IHY6bGFuZyA9PSAiQyIgfHwgdjpsYW5nID1+ICdeW0VlXW4nCisgICAgaWYgYTplbnIgPT0gIiIKKwlYb3V0ICJUT0RPOiBBZGQgbWVzc2FnZSBudW1iZXIgZm9yOiIgYTplbXNnCisJbGV0IHY6ZXJybXNnID0gIjoiIC4gdjplcnJtc2cKKyAgICBlbmRpZgorICAgIGxldCBtYXRjaCA9IDEKKyAgICBpZiB2OmVycm1zZyAhfiAnXicuYTplbnIuJzonIHx8IChlbmdsaXNoICYmIHY6ZXJybXNnICF+IGE6ZW1zZykKKwlsZXQgbWF0Y2ggPSAwCisJaWYgdjplcnJtc2cgPT0gIiIKKwkgICAgWG91dCAiTWVzc2FnZSBtaXNzaW5nLiIKKwllbHNlCisJICAgIGxldCB2OmVycm1zZyA9IGVzY2FwZSh2OmVycm1zZywgJyInKQorCSAgICBYb3V0ICJVbmV4cGVjdGVkIG1lc3NhZ2U6IiB2OmVycm1zZworCWVuZGlmCisgICAgZW5kaWYKKyAgICByZXR1cm4gbWF0Y2gKK2VuZGZ1bmN0aW9uCisKK2xldCB2OmVycm1zZyA9ICIiCitpZiAwCitlbHNlCitlbHNlaWYgMSB8fHwgMgorZW5kaWYKK1hwYXRoIDEJCQkJCQkiIFg6IDEKK2lmICFNU0coJ0U1ODQnLCAiOmVsc2VpZiBhZnRlciA6ZWxzZSIpCisgICAgWHBhdGggMgkJCQkJIiBYOiAwCitlbmRpZgorCitsZXQgdjplcnJtc2cgPSAiIgoraWYgMQorZWxzZQorZWxzZWlmIDEgfHx8IDIKK2VuZGlmCitYcGF0aCA0CQkJCQkJIiBYOiA0CitpZiAhTVNHKCdFNTg0JywgIjplbHNlaWYgYWZ0ZXIgOmVsc2UiKQorICAgIFhwYXRoIDgJCQkJCSIgWDogMAorZW5kaWYKKworbGV0IHY6ZXJybXNnID0gIiIKK2Vsc2VpZiAxIHx8fCAyCitYcGF0aCAxNgkJCQkJIiBYOiAxNgoraWYgIU1TRygnRTU4MicsICI6ZWxzZWlmIHdpdGhvdXQgOmlmIikKKyAgICBYcGF0aCAzMgkJCQkJIiBYOiAwCitlbmRpZgorCitsZXQgdjplcnJtc2cgPSAiIgord2hpbGUgMQorICAgIGVsc2VpZiAxIHx8fCAyCitlbmR3aGlsZQorWHBhdGggNjQJCQkJCSIgWDogNjQKK2lmICFNU0coJ0U1ODInLCAiOmVsc2VpZiB3aXRob3V0IDppZiIpCisgICAgWHBhdGggMTI4CQkJCQkiIFg6IDAKK2VuZGlmCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgaWYgMAorCSAgICBlbHNlCisJICAgIGVsc2VpZiAxIHx8fCAyCisJICAgIGVuZGlmCisJY2F0Y2ggL15WaW1cKChcYVwrKVwpXD06LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbVwoKFxhXCspXClcPTonLCAnJywgIiIpCisJZmluYWxseQorCSAgICBYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggNTEyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmICFNU0coJ0U1ODQnLCAiOmVsc2VpZiBhZnRlciA6ZWxzZSIpCisJCVhwYXRoIDEwMjQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggMjA0OAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisgICAgZW5kdHJ5CitlbmR3aGlsZQorCit3aGlsZSAxCisgICAgdHJ5CisJdHJ5CisJICAgIGxldCB2OmVycm1zZyA9ICIiCisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIGlmIDEKKwkgICAgZWxzZQorCSAgICBlbHNlaWYgMSB8fHwgMgorCSAgICBlbmRpZgorCWNhdGNoIC9eVmltXCgoXGFcKylcKVw9Oi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW1cKChcYVwrKVwpXD06JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggNDA5NgkJCQkiIFg6IDQwOTYKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggODE5MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiAhTVNHKCdFNTg0JywgIjplbHNlaWYgYWZ0ZXIgOmVsc2UiKQorCQlYcGF0aCAxNjM4NAkJCSIgWDogMAorCSAgICBlbmRpZgorCWVuZHRyeQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisgICAgZW5kdHJ5CitlbmR3aGlsZQorCit3aGlsZSAxCisgICAgdHJ5CisJdHJ5CisJICAgIGxldCB2OmVycm1zZyA9ICIiCisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIGVsc2VpZiAxIHx8fCAyCisJY2F0Y2ggL15WaW1cKChcYVwrKVwpXD06LworCSAgICBsZXQgY2F1Z2h0ID0gMQorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbVwoKFxhXCspXClcPTonLCAnJywgIiIpCisJZmluYWxseQorCSAgICBYcGF0aCA2NTUzNgkJCQkiIFg6IDY1NTM2CisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDEzMTA3MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiAhTVNHKCdFNTgyJywgIjplbHNlaWYgd2l0aG91dCA6aWYiKQorCQlYcGF0aCAyNjIxNDQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggNTI0Mjg4CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKyAgICBlbmR0cnkKK2VuZHdoaWxlCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IHY6ZXJybXNnID0gIiIKKwkgICAgbGV0IGNhdWdodCA9IDAKKwkgICAgd2hpbGUgMQorCQllbHNlaWYgMSB8fHwgMgorCSAgICBlbmR3aGlsZQorCWNhdGNoIC9eVmltXCgoXGFcKylcKVw9Oi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW1cKChcYVwrKVwpXD06JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMTA0ODU3NgkJCSIgWDogMTA0ODU3NgorCSAgICBpZiAhY2F1Z2h0ICYmICEkVklNTk9FUlJUSFJPVworCQlYcGF0aCAyMDk3MTUyCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmICFNU0coJ0U1ODInLCAiOmVsc2VpZiB3aXRob3V0IDppZiIpCisJCVhwYXRoIDQxOTQzMDQJCQkiIFg6IDAKKwkgICAgZW5kaWYKKwllbmR0cnkKKyAgICBjYXRjaCAvLiovCisJWHBhdGggODM4ODYwOAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisgICAgZW5kdHJ5CitlbmR3aGlsZQorCitYcGF0aCAxNjc3NzIxNgkJCQkJIiBYOiAxNjc3NzIxNgorCit1bmxldCEgY2F1Z2h0CitkZWxmdW5jdGlvbiBNU0cKKworWGNoZWNrIDE3ODk1NzY1CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA4MTogIERpc2NhcmRpbmcgZXhjZXB0aW9ucyBhZnRlciBhbiBlcnJvciBvciBpbnRlcnJ1cHQJCSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbnNpZGUgYSA6dHJ5IGNvbmRpdGlvbmFsIHdpdGhvdXQKKyIJICAgIDpjYXRjaCBhbmQgOmZpbmFsbHkgY2xhdXNlcyBhbmQgYW4gZXJyb3Igb3IgaW50ZXJydXB0IG9jY3VycyBiZWZvcmUKKyIJICAgIHRoZSA6ZW5kdHJ5IGlzIHJlYWNoZWQsIHRoZSBleGNlcHRpb24gaXMgZGlzY2FyZGVkLgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2lmIEV4dHJhVmltKCkKKyAgICB0cnkKKwlYcGF0aCAxCQkJCQkiIFg6IDEKKwl0cnkKKwkgICAgWHBhdGggMgkJCQkiIFg6IDIKKwkgICAgdGhyb3cgImFycmdoIgorCSAgICBYcGF0aCA0CQkJCSIgWDogMAorIgkgICAgaWYgMQorCQlYcGF0aCA4CQkJCSIgWDogMAorCSAgICAiIGVycm9yIGFmdGVyIDp0aHJvdzogbWlzc2luZyA6ZW5kaWYKKwllbmR0cnkKKwlYcGF0aCAxNgkJCQkiIFg6IDAKKyAgICBjYXRjaCAvYXJyZ2gvCisJWHBhdGggMzIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggNjQJCQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIHRyeQorCVhwYXRoIDEyOAkJCQkiIFg6IDEyOAorCXRyeQorCSAgICBYcGF0aCAyNTYJCQkJIiBYOiAyNTYKKwkgICAgdGhyb3cgImFycmdoIgorCSAgICBYcGF0aCA1MTIJCQkJIiBYOiAwCisJZW5kdHJ5CQkiIElOVEVSUlVQVAorCVhwYXRoIDEwMjQJCQkJIiBYOiAwCisgICAgY2F0Y2ggL2FycmdoLworCVhwYXRoIDIwNDgJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggNDA5NgkJCQkJIiBYOiAwCitlbmRpZgorCitYY2hlY2sgMzg3CisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA4MjogIElnbm9yaW5nIDpjYXRjaCBjbGF1c2VzIGFmdGVyIGFuIGVycm9yIG9yIGludGVycnVwdAkJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQgYW4gZXJyb3Igb3IgaW50ZXJydXB0IG9jY3VycyBiZWZvcmUKKyIJICAgIHRoZSBtYXRjaGluZyA6Y2F0Y2ggY2xhdXNlIGlzIHJlYWNoZWQsIHRoZSBleGNlcHRpb24gaXMgZGlzY2FyZGVkCisiCSAgICBhbmQgdGhlIDpjYXRjaCBjbGF1c2UgaXMgaWdub3JlZCAoYWxzbyBmb3IgdGhlIGVycm9yIG9yIGludGVycnVwdAorIgkgICAgZXhjZXB0aW9uIGJlaW5nIHRocm93biB0aGVuKS4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJdHJ5CisJICAgIFhwYXRoIDEJCQkJIiBYOiAxCisJICAgIHRocm93ICJhcnJnaCIKKwkgICAgWHBhdGggMgkJCQkiIFg6IDAKKyIJICAgIGlmIDEKKwkJWHBhdGggNAkJCQkiIFg6IDAKKwkJIiBlcnJvciBhZnRlciA6dGhyb3c6IG1pc3NpbmcgOmVuZGlmCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA4CQkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKwljYXRjaCAvLiovCisJICAgIFhwYXRoIDE2CQkJCSIgWDogMAorCSAgICBYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKwllbmR0cnkKKwlYcGF0aCAzMgkJCQkiIFg6IDAKKyAgICBjYXRjaCAvYXJyZ2gvCisJWHBhdGggNjQJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMTI4CQkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICBmdW5jdGlvbiEgRSgpCisJdHJ5CisJICAgIHRyeQorCQlYcGF0aCAyNTYJCQkiIFg6IDI1NgorCQl0aHJvdyAiYXJyZ2giCisJCVhwYXRoIDUxMgkJCSIgWDogMAorIgkJaWYgMQorCQkgICAgWHBhdGggMTAyNAkJCSIgWDogMAorCQkgICAgIiBlcnJvciBhZnRlciA6dGhyb3c6IG1pc3NpbmcgOmVuZGlmCisJICAgIGNhdGNoIC8uKi8KKwkJWHBhdGggMjA0OAkJCSIgWDogMAorCQlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKwkgICAgY2F0Y2ggLy4qLworCQlYcGF0aCA0MDk2CQkJIiBYOiAwCisJCVhvdXQgdjpleGNlcHRpb24gImluIiBFeHRyYVZpbVRocm93cG9pbnQoKQorCSAgICBlbmR0cnkKKwkgICAgWHBhdGggODE5MgkJCQkiIFg6IDAKKwljYXRjaCAvYXJyZ2gvCisJICAgIFhwYXRoIDE2Mzg0CQkJCSIgWDogMAorCWVuZHRyeQorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBjYWxsIEUoKQorICAgIFhwYXRoIDMyNzY4CQkJCQkiIFg6IDAKK2VuZGlmCisKK2lmIEV4dHJhVmltKCkKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCSAgICB0aHJvdyAiYXJyZ2giCisJICAgIFhwYXRoIDEzMTA3MgkJCSIgWDogMAorCWNhdGNoIC8uKi8JIklOVEVSUlVQVAorCSAgICBYcGF0aCAyNjIxNDQJCQkiIFg6IDAKKwkgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIEV4dHJhVmltVGhyb3dwb2ludCgpCisJY2F0Y2ggLy4qLworCSAgICBYcGF0aCA1MjQyODgJCQkiIFg6IDAKKwkgICAgWG91dCB2OmV4Y2VwdGlvbiAiaW4iIEV4dHJhVmltVGhyb3dwb2ludCgpCisJZW5kdHJ5CisJWHBhdGggMTA0ODU3NgkJCQkiIFg6IDAKKyAgICBjYXRjaCAvYXJyZ2gvCisJWHBhdGggMjA5NzE1MgkJCQkiIFg6IDAKKyAgICBlbmR0cnkKKyAgICBYcGF0aCA0MTk0MzA0CQkJCSIgWDogMAorZW5kaWYKKworaWYgRXh0cmFWaW0oKQorICAgIGZ1bmN0aW9uIEkoKQorCXRyeQorCSAgICB0cnkKKwkJWHBhdGggODM4ODYwOAkJCSIgWDogODM4ODYwOAorCQl0aHJvdyAiYXJyZ2giCisJCVhwYXRoIDE2Nzc3MjE2CQkJIiBYOiAwCisJICAgIGNhdGNoIC8uKi8JIklOVEVSUlVQVAorCQlYcGF0aCAzMzU1NDQzMgkJCSIgWDogMAorCQlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKwkgICAgY2F0Y2ggLy4qLworCQlYcGF0aCA2NzEwODg2NAkJCSIgWDogMAorCQlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgRXh0cmFWaW1UaHJvd3BvaW50KCkKKwkgICAgZW5kdHJ5CisJICAgIFhwYXRoIDEzNDIxNzcyOAkJCSIgWDogMAorCWNhdGNoIC9hcnJnaC8KKwkgICAgWHBhdGggMjY4NDM1NDU2CQkJIiBYOiAwCisJZW5kdHJ5CisgICAgZW5kZnVuY3Rpb24KKworICAgIGNhbGwgSSgpCisgICAgWHBhdGggNTM2ODcwOTEyCQkJCSIgWDogMAorZW5kaWYKKworWGNoZWNrIDg0NTQ0MDEKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDgzOiAgRXhlY3V0aW5nIDpmaW5hbGx5IGNsYXVzZXMgYWZ0ZXIgYW4gZXJyb3Igb3IgaW50ZXJydXB0CSAgICB7e3sxCisiCisiCSAgICBXaGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIGFuIGVycm9yIG9yIGludGVycnVwdCBvY2N1cnMgYmVmb3JlCisiCSAgICB0aGUgOmZpbmFsbHkgb2YgdGhlIGlubmVybW9zdCA6dHJ5IGlzIHJlYWNoZWQsIHRoZSBleGNlcHRpb24gaXMKKyIJICAgIGRpc2NhcmRlZCBhbmQgdGhlIDpmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZC4KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1hwYXRoSU5JVAorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJWHBhdGggMQkJCQkJIiBYOiAxCisJdHJ5CisJICAgIFhwYXRoIDIJCQkJIiBYOiAyCisJICAgIHRocm93ICJhcnJnaCIKKwkgICAgWHBhdGggNAkJCQkiIFg6IDAKKyIJICAgIGlmIDEKKwkJWHBhdGggOAkJCQkiIFg6IDAKKwkgICAgIiBlcnJvciBhZnRlciA6dGhyb3c6IG1pc3NpbmcgOmVuZGlmCisJZmluYWxseQorCSAgICBYcGF0aCAxNgkJCQkiIFg6IDE2CisJZW5kdHJ5CisJWHBhdGggMzIJCQkJIiBYOiAwCisgICAgY2F0Y2ggL2FycmdoLworCVhwYXRoIDY0CQkJCSIgWDogMAorICAgIGVuZHRyeQorICAgIFhwYXRoIDEyOAkJCQkJIiBYOiAwCitlbmRpZgorCitpZiBFeHRyYVZpbSgpCisgICAgdHJ5CisJWHBhdGggMjU2CQkJCSIgWDogMjU2CisJdHJ5CisJICAgIFhwYXRoIDUxMgkJCQkiIFg6IDUxMgorCSAgICB0aHJvdyAiYXJyZ2giCisJICAgIFhwYXRoIDEwMjQJCQkJIiBYOiAwCisJZmluYWxseQkJIklOVEVSUlVQVAorCSAgICBYcGF0aCAyMDQ4CQkJCSIgWDogMjA0OAorCWVuZHRyeQorCVhwYXRoIDQwOTYJCQkJIiBYOiAwCisgICAgY2F0Y2ggL2FycmdoLworCVhwYXRoIDgxOTIJCQkJIiBYOiAwCisgICAgZW5kdHJ5CisgICAgWHBhdGggMTYzODQJCQkJCSIgWDogMAorZW5kaWYKKworWGNoZWNrIDI4MzUKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDg0OiAgRXhjZXB0aW9ucyBpbiBhdXRvY29tbWFuZCBzZXF1ZW5jZXMuCQkJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBhIHNlcXVlbmNlIG9mIGF1dG9jb21tYW5kcyBmb3IKKyIJICAgIGEgc3BlY2lmaWMgZXZlbnQsIHRoZSByZXN0IG9mIHRoZSBzZXF1ZW5jZSBpcyBub3QgZXhlY3V0ZWQuICBUaGUKKyIJICAgIGNvbW1hbmQgdGhhdCB0cmlnZ2VyZWQgdGhlIGF1dG9jb21tYW5kIGV4ZWN1dGlvbiBhYm9ydHMsIGFuZCB0aGUKKyIJICAgIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIuCisiCisiCSAgICBGb3IgdGhlIEZ1bmNVbmRlZmluZWQgZXZlbnQgdW5kZXIgYSBmdW5jdGlvbiBjYWxsIGV4cHJlc3Npb24gb3IKKyIJICAgIDpjYWxsIGNvbW1hbmQsIHRoZSBmdW5jdGlvbiBpcyBub3QgZXhleGVjdXRlZCwgZXZlbiB3aGVuIGl0IGhhcworIgkgICAgYmVlbiBkZWZpbmVkIGJ5IHRoZSBhdXRvY29tbWFuZHMgYmVmb3JlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgZnVuY3Rpb24hIElOVCgpCisJIklOVEVSUlVQVAorCWxldCBkdW1teSA9IDAKKyAgICBlbmRmdW5jdGlvbgorCisgICAgYXVnIFRNUAorCWF1dG9jbWQhCisKKwlhdXRvY21kIFVzZXIgeDEgWHBhdGggMQkJCSIgWDogMQorCWF1dG9jbWQgVXNlciB4MSB0aHJvdyAieDEiCisJYXV0b2NtZCBVc2VyIHgxIFhwYXRoIDIJCQkiIFg6IDAKKworCWF1dG9jbWQgVXNlciB4MiBYcGF0aCA0CQkJIiBYOiA0CisJYXV0b2NtZCBVc2VyIHgyIGFzZGYKKwlhdXRvY21kIFVzZXIgeDIgWHBhdGggOAkJCSIgWDogMAorCisJYXV0b2NtZCBVc2VyIHgzIFhwYXRoIDE2CQkiIFg6IDE2CisJYXV0b2NtZCBVc2VyIHgzIGNhbGwgSU5UKCkKKwlhdXRvY21kIFVzZXIgeDMgWHBhdGggMzIJCSIgWDogMAorCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUxIGZ1bmN0aW9uISBVMSgpCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUxICAgICBYcGF0aCA2NAkiIFg6IDAKKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTEgZW5kZnVuY3Rpb24KKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTEgWHBhdGggMTI4CSIgWDogMTI4CisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUxIHRocm93ICJVMSIKKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTEgWHBhdGggMjU2CSIgWDogMAorCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUyIGZ1bmN0aW9uISBVMigpCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUyICAgICBYcGF0aCA1MTIJIiBYOiAwCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUyIGVuZGZ1bmN0aW9uCisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUyIFhwYXRoIDEwMjQJIiBYOiAxMDI0CisJYXV0b2NtZCBGdW5jVW5kZWZpbmVkIFUyIEFTREYKKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTIgWHBhdGggMjA0OAkiIFg6IDAKKworCWF1dG9jbWQgRnVuY1VuZGVmaW5lZCBVMyBmdW5jdGlvbiEgVTMoKQorCWF1dG9jbWQgRnVuY1VuZGVmaW5lZCBVMyAgICAgWHBhdGggNDA5NgkiIFg6IDAKKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTMgZW5kZnVuY3Rpb24KKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTMgWHBhdGggODE5MgkiIFg6IDgxOTIKKwlhdXRvY21kIEZ1bmNVbmRlZmluZWQgVTMgY2FsbCBJTlQoKQorCWF1dG9jbWQgRnVuY1VuZGVmaW5lZCBVMyBYcGF0aCAxNjM4NAkiIFg6IDAKKyAgICBhdWcgRU5ECisKKyAgICB0cnkKKwl0cnkKKwkgICAgWHBhdGggMzI3NjgJCQkJIiBYOiAzMjc2OAorCSAgICBkb2F1dG9jbWQgVXNlciB4MQorCWNhdGNoIC94MS8KKwkgICAgWHBhdGggNjU1MzYJCQkJIiBYOiA2NTUzNgorCWVuZHRyeQorCisJd2hpbGUgMQorCSAgICB0cnkKKwkJWHBhdGggMTMxMDcyCQkJIiBYOiAxMzEwNzIKKwkJbGV0IGNhdWdodCA9IDAKKwkJZG9hdXRvY21kIFVzZXIgeDIKKwkgICAgY2F0Y2ggL2FzZGYvCisJCWxldCBjYXVnaHQgPSAxCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMjYyMTQ0CQkJIiBYOiAyNjIxNDQKKwkJaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDUyNDI4OAkJIiBYOiAwCisJCSAgICAiIFByb3BhZ2F0ZSB1bmNhdWdodCBlcnJvciBleGNlcHRpb24sCisJCWVsc2UKKwkJICAgICIgLi4uIGJ1dCBicmVhayBsb29wIGZvciBjYXVnaHQgZXJyb3IgZXhjZXB0aW9uLAorCQkgICAgIiBvciBkaXNjYXJkIGVycm9yIGFuZCBicmVhayBsb29wIGlmICRWSU1OT0VSUlRIUk9XCisJCSAgICBicmVhaworCQllbmRpZgorCSAgICBlbmR0cnkKKwllbmR3aGlsZQorCisJd2hpbGUgMQorCSAgICB0cnkKKwkJWHBhdGggMTA0ODU3NgkJCSIgWDogMTA0ODU3NgorCQlsZXQgY2F1Z2h0ID0gMAorCQlkb2F1dG9jbWQgVXNlciB4MworCSAgICBjYXRjaCAvVmltOkludGVycnVwdC8KKwkJbGV0IGNhdWdodCA9IDEKKwkgICAgZmluYWxseQorCQlYcGF0aCAyMDk3MTUyCQkJIiBYOiAyMDk3MTUyCisJCWlmICFjYXVnaHQgJiYgISRWSU1OT0lOVFRIUk9XCisJCSAgICBYcGF0aCA0MTk0MzA0CQkiIFg6IDAKKwkJICAgICIgUHJvcGFnYXRlIHVuY2F1Z2h0IGludGVycnVwdCBleGNlcHRpb24sCisJCWVsc2UKKwkJICAgICIgLi4uIGJ1dCBicmVhayBsb29wIGZvciBjYXVnaHQgaW50ZXJydXB0IGV4Y2VwdGlvbiwKKwkJICAgICIgb3IgZGlzY2FyZCBpbnRlcnJ1cHQgYW5kIGJyZWFrIGxvb3AgaWYgJFZJTU5PSU5UVEhST1cKKwkJICAgIGJyZWFrCisJCWVuZGlmCisJICAgIGVuZHRyeQorCWVuZHdoaWxlCisKKwlpZiBleGlzdHMoIipVMSIpIHwgZGVsZnVuY3Rpb24gVTEgfCBlbmRpZgorCWlmIGV4aXN0cygiKlUyIikgfCBkZWxmdW5jdGlvbiBVMiB8IGVuZGlmCisJaWYgZXhpc3RzKCIqVTMiKSB8IGRlbGZ1bmN0aW9uIFUzIHwgZW5kaWYKKworCXRyeQorCSAgICBYcGF0aCA4Mzg4NjA4CQkJIiBYOiA4Mzg4NjA4CisJICAgIGNhbGwgVTEoKQorCWNhdGNoIC9VMS8KKwkgICAgWHBhdGggMTY3NzcyMTYJCQkiIFg6IDE2Nzc3MjE2CisJZW5kdHJ5CisKKwl3aGlsZSAxCisJICAgIHRyeQorCQlYcGF0aCAzMzU1NDQzMgkJCSIgWDogMzM1NTQ0MzIKKwkJbGV0IGNhdWdodCA9IDAKKwkJY2FsbCBVMigpCisJICAgIGNhdGNoIC9BU0RGLworCQlsZXQgY2F1Z2h0ID0gMQorCSAgICBmaW5hbGx5CisJCVhwYXRoIDY3MTA4ODY0CQkJIiBYOiA2NzEwODg2NAorCQlpZiAhY2F1Z2h0ICYmICEkVklNTk9FUlJUSFJPVworCQkgICAgWHBhdGggMTM0MjE3NzI4CQkiIFg6IDAKKwkJICAgICIgUHJvcGFnYXRlIHVuY2F1Z2h0IGVycm9yIGV4Y2VwdGlvbiwKKwkJZWxzZQorCQkgICAgIiAuLi4gYnV0IGJyZWFrIGxvb3AgZm9yIGNhdWdodCBlcnJvciBleGNlcHRpb24sCisJCSAgICAiIG9yIGRpc2NhcmQgZXJyb3IgYW5kIGJyZWFrIGxvb3AgaWYgJFZJTU5PRVJSVEhST1cKKwkJICAgIGJyZWFrCisJCWVuZGlmCisJICAgIGVuZHRyeQorCWVuZHdoaWxlCisKKwl3aGlsZSAxCisJICAgIHRyeQorCQlYcGF0aCAyNjg0MzU0NTYJCQkiIFg6IDI2ODQzNTQ1NgorCQlsZXQgY2F1Z2h0ID0gMAorCQljYWxsIFUzKCkKKwkgICAgY2F0Y2ggL1ZpbTpJbnRlcnJ1cHQvCisJCWxldCBjYXVnaHQgPSAxCisJICAgIGZpbmFsbHkKKwkJWHBhdGggNTM2ODcwOTEyCQkJIiBYOiA1MzY4NzA5MTIKKwkJaWYgIWNhdWdodCAmJiAhJFZJTU5PSU5UVEhST1cKKwkJICAgIFhwYXRoIDEwNzM3NDE4MjQJCSIgWDogMAorCQkgICAgIiBQcm9wYWdhdGUgdW5jYXVnaHQgaW50ZXJydXB0IGV4Y2VwdGlvbiwKKwkJZWxzZQorCQkgICAgIiAuLi4gYnV0IGJyZWFrIGxvb3AgZm9yIGNhdWdodCBpbnRlcnJ1cHQgZXhjZXB0aW9uLAorCQkgICAgIiBvciBkaXNjYXJkIGludGVycnVwdCBhbmQgYnJlYWsgbG9vcCBpZiAkVklNTk9JTlRUSFJPVworCQkgICAgYnJlYWsKKwkJZW5kaWYKKwkgICAgZW5kdHJ5CisJZW5kd2hpbGUKKyAgICBjYXRjaCAvLiovCisJIiBUaGUgWHBhdGggY29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgMl4zMSAobmVnYXRpdmUpOyBkaXNwbGF5IGV4cGxpY2l0bHk6CisJZXhlYyAiIWVjaG8gMjE0NzQ4MzY0OCA+PiIgLiBnOkV4dHJhVmltUmVzdWx0CisJWG91dCAiQ2F1Z2h0IiB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGVuZHRyeQorCisgICAgdW5sZXQgY2F1Z2h0CisgICAgZGVsZnVuY3Rpb24gSU5UCisgICAgZGVsZnVuY3Rpb24gVTEKKyAgICBkZWxmdW5jdGlvbiBVMgorICAgIGRlbGZ1bmN0aW9uIFUzCisgICAgYXUhIFRNUAorICAgIGF1ZyEgVE1QCitlbmRpZgorCitYY2hlY2sgOTM0NzgyMTAxCisKKworIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIgVGVzdCA4NTogIEVycm9yIGV4Y2VwdGlvbnMgaW4gYXV0b2NvbW1hbmRzIGZvciBJL08gY29tbWFuZCBldmVudHMJICAgIHt7ezEKKyIKKyIJICAgIFdoZW4gYW4gSS9PIGNvbW1hbmQgaXMgaW5zaWRlIDp0cnkvOmVuZHRyeSwgYXV0b2NvbW1hbmRzIHRvIGJlCisiCSAgICBleGVjdXRlZCBhZnRlciBpdCBzaG91bGQgYmUgc2tpcHBlZCBvbiBhbiBlcnJvciAoZXhjZXB0aW9uKSBpbiB0aGUKKyIJICAgIGNvbW1hbmQgaXRzZWxmIG9yIGluIGF1dG9jb21tYW5kcyB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGNvbW1hbmQuCisiCSAgICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBJL08gY29tbWFuZCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGVpdGhlci4KKyIJICAgIEV4YW1wbGUgMTogQnVmV3JpdGVQcmUsIDp3cml0ZSwgQnVmV3JpdGVQb3N0CisiCSAgICBFeGFtcGxlIDI6IEZpbGVSZWFkUHJlLCA6cmVhZCwgRmlsZVJlYWRQb3N0LgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWHBhdGhJTklUCisKK2Z1bmN0aW9uISBNU0coZW5yLCBlbXNnKQorICAgIGxldCBlbmdsaXNoID0gdjpsYW5nID09ICJDIiB8fCB2OmxhbmcgPX4gJ15bRWVdbicKKyAgICBpZiBhOmVuciA9PSAiIgorCVhvdXQgIlRPRE86IEFkZCBtZXNzYWdlIG51bWJlciBmb3I6IiBhOmVtc2cKKwlsZXQgdjplcnJtc2cgPSAiOiIgLiB2OmVycm1zZworICAgIGVuZGlmCisgICAgbGV0IG1hdGNoID0gMQorICAgIGlmIHY6ZXJybXNnICF+ICdeJy5hOmVuci4nOicgfHwgKGVuZ2xpc2ggJiYgdjplcnJtc2cgIX4gYTplbXNnKQorCWxldCBtYXRjaCA9IDAKKwlpZiB2OmVycm1zZyA9PSAiIgorCSAgICBYb3V0ICJNZXNzYWdlIG1pc3NpbmcuIgorCWVsc2UKKwkgICAgbGV0IHY6ZXJybXNnID0gZXNjYXBlKHY6ZXJybXNnLCAnIicpCisJICAgIFhvdXQgIlVuZXhwZWN0ZWQgbWVzc2FnZToiIHY6ZXJybXNnCisJZW5kaWYKKyAgICBlbmRpZgorICAgIHJldHVybiBtYXRjaAorZW5kZnVuY3Rpb24KKworIiBSZW1vdmUgdGhlIGF1dG9jb21tYW5kcyBmb3IgdGhlIGV2ZW50cyBzcGVjaWZpZWQgYXMgYXJndW1lbnRzIGluIGFsbCB1c2VkCisiIGF1dG9ncm91cHMuCitmdW5jdGlvbiEgRGVsZXRlX2F1dG9jb21tYW5kcyguLi4pCisgICAgbGV0IGF1Z2ZpbGUgPSB0ZW1wbmFtZSgpCisgICAgd2hpbGUgMQorCXRyeQorCSAgICBleGVjICJyZWRpciA+IiAuIGF1Z2ZpbGUKKwkgICAgYXVnCisJICAgIHJlZGlyIEVORAorCSAgICBleGVjICJlZGl0IiBhdWdmaWxlCisJICAgIGcvXiQvZAorCSAgICBub3JtIEckCisJICAgIGxldCB3cmFwID0gInciCisJICAgIHdoaWxlIHNlYXJjaCgnXCUoICBcfF5cKVxAPD0uXHstfVwlKCAgXClcQD0nLCB3cmFwKSA+IDAKKwkJbGV0IHdyYXAgPSAiVyIKKwkJZXhlYyAibm9ybSB5LyAgXG4iCisJCWxldCBhcmdubyA9IDEKKwkJd2hpbGUgYXJnbm8gPD0gYTowCisJCSAgICBleGVjICJhdSEiIGVzY2FwZShAIiwgIiAiKSBhOnthcmdub30KKwkJICAgIGxldCBhcmdubyA9IGFyZ25vICsgMQorCQllbmR3aGlsZQorCSAgICBlbmR3aGlsZQorCWNhdGNoIC8uKi8KKwlmaW5hbGx5CisJICAgIGJ3aXBlb3V0IQorCSAgICBjYWxsIGRlbGV0ZShhdWdmaWxlKQorCSAgICBicmVhawkJIiBkaXNjYXJkIGVycm9ycyBmb3IgJFZJTU5PRVJSVEhST1cKKwllbmR0cnkKKyAgICBlbmR3aGlsZQorZW5kZnVuY3Rpb24KKworY2FsbCBEZWxldGVfYXV0b2NvbW1hbmRzKCJCdWZXcml0ZVByZSIsICJCdWZXcml0ZVBvc3QiKQorCit3aGlsZSAxCisgICAgdHJ5CisJdHJ5CisJICAgIGxldCBwb3N0ID0gMAorCSAgICBhdWcgVE1QCisJCWF1ISBCdWZXcml0ZVBvc3QgKiBsZXQgcG9zdCA9IDEKKwkgICAgYXVnIEVORAorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICB3cml0ZSAvbi9vL24vZS94L2kvcy90L2Uvbi90CisJY2F0Y2ggL15WaW0od3JpdGUpOi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW0od3JpdGUpOicsICcnLCAiIikKKwlmaW5hbGx5CisJICAgIFhwYXRoIDEJCQkJIiBYOiAxCisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDIJCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjplcnJtc2csICdeIi9uL28vbi9lL3gvaS9zL3QvZS9uL3QiICcsCisJCVwgJycsICIiKQorCSAgICBpZiAhTVNHKCdFMjEyJywgIkNhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIpCisJCVhwYXRoIDQJCQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIHBvc3QKKwkJWHBhdGggOAkJCQkiIFg6IDAKKwkJWG91dCAiQnVmV3JpdGVQb3N0IGNvbW1hbmRzIGV4ZWN1dGVkIGFmdGVyIHdyaXRlIGVycm9yIgorCSAgICBlbmRpZgorCSAgICBhdSEgVE1QCisJICAgIGF1ZyEgVE1QCisJZW5kdHJ5CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDE2CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKyAgICBlbmR0cnkKK2VuZHdoaWxlCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IHBvc3QgPSAwCisJICAgIGF1ZyBUTVAKKwkJYXUhIEJ1ZldyaXRlUHJlICAqIGFzZGYKKwkJYXUhIEJ1ZldyaXRlUG9zdCAqIGxldCBwb3N0ID0gMQorCSAgICBhdWcgRU5ECisJICAgIGxldCB0bXBmaWxlID0gdGVtcG5hbWUoKQorCSAgICBsZXQgY2F1Z2h0ID0gMAorCSAgICBleGVjICJ3cml0ZSIgdG1wZmlsZQorCWNhdGNoIC9eVmltXCgod3JpdGUpXClcPTovCisJICAgIGxldCBjYXVnaHQgPSAxCisJICAgIGxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjpleGNlcHRpb24sICdeVmltXCgod3JpdGUpXClcPTonLCAnJywgIiIpCisJZmluYWxseQorCSAgICBYcGF0aCAzMgkJCQkiIFg6IDMyCisJICAgIGlmICFjYXVnaHQgJiYgISRWSU1OT0VSUlRIUk9XCisJCVhwYXRoIDY0CQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjplcnJtc2csICdeIicudG1wZmlsZS4nIiAnLCAnJywgIiIpCisJICAgIGlmICFNU0coJ0U0OTInLCAiTm90IGFuIGVkaXRvciBjb21tYW5kIikKKwkJWHBhdGggMTI4CQkJIiBYOiAwCisJICAgIGVuZGlmCisJICAgIGlmIGZpbGVyZWFkYWJsZSh0bXBmaWxlKQorCQlYcGF0aCAyNTYJCQkiIFg6IDAKKwkJWG91dCAiOndyaXRlIGNvbW1hbmQgbm90IHN1cHByZXNzZWQgYWZ0ZXIgQnVmV3JpdGVQcmUgZXJyb3IiCisJICAgIGVuZGlmCisJICAgIGlmIHBvc3QKKwkJWHBhdGggNTEyCQkJIiBYOiAwCisJCVhvdXQgIkJ1ZldyaXRlUG9zdCBjb21tYW5kcyBleGVjdXRlZCBhZnRlciBCdWZXcml0ZVByZSBlcnJvciIKKwkgICAgZW5kaWYKKwkgICAgYXUhIFRNUAorCSAgICBhdWchIFRNUAorCWVuZHRyeQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAxMDI0CQkJCSIgWDogMAorCVhvdXQgdjpleGNlcHRpb24gImluIiB2OnRocm93cG9pbnQKKyAgICBmaW5hbGx5CisJYnJlYWsJCSIgZGlzY2FyZCBlcnJvciBmb3IgJFZJTU5PRVJSVEhST1cKKyAgICBlbmR0cnkKK2VuZHdoaWxlCisKK2NhbGwgZGVsZXRlKHRtcGZpbGUpCisKK2NhbGwgRGVsZXRlX2F1dG9jb21tYW5kcygiQnVmV3JpdGVQcmUiLCAiQnVmV3JpdGVQb3N0IiwKKyAgICBcICJCdWZSZWFkUHJlIiwgIkJ1ZlJlYWRQb3N0IiwgIkZpbGVSZWFkUHJlIiwgIkZpbGVSZWFkUG9zdCIpCisKK3doaWxlIDEKKyAgICB0cnkKKwl0cnkKKwkgICAgbGV0IHBvc3QgPSAwCisJICAgIGF1ZyBUTVAKKwkJYXUhIEZpbGVSZWFkUG9zdCAqIGxldCBwb3N0ID0gMQorCSAgICBhdWcgRU5ECisJICAgIGxldCBjYXVnaHQgPSAwCisJICAgIHJlYWQgL24vby9uL2UveC9pL3MvdC9lL24vdAorCWNhdGNoIC9eVmltKHJlYWQpOi8KKwkgICAgbGV0IGNhdWdodCA9IDEKKwkgICAgbGV0IHY6ZXJybXNnID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJ15WaW0ocmVhZCk6JywgJycsICIiKQorCWZpbmFsbHkKKwkgICAgWHBhdGggMjA0OAkJCQkiIFg6IDIwNDgKKwkgICAgaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJWHBhdGggNDA5NgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXJybXNnLCAnIC9uL28vbi9lL3gvaS9zL3QvZS9uL3QkJywKKwkJXCAnJywgIiIpCisJICAgIGlmICFNU0coJ0U0ODQnLCAiQ2FuJ3Qgb3BlbiBmaWxlIikKKwkJWHBhdGggODE5MgkJCSIgWDogMAorCSAgICBlbmRpZgorCSAgICBpZiBwb3N0CisJCVhwYXRoIDE2Mzg0CQkJIiBYOiAwCisJCVhvdXQgIkZpbGVSZWFkUG9zdCBjb21tYW5kcyBleGVjdXRlZCBhZnRlciB3cml0ZSBlcnJvciIKKwkgICAgZW5kaWYKKwkgICAgYXUhIFRNUAorCSAgICBhdWchIFRNUAorCWVuZHRyeQorICAgIGNhdGNoIC8uKi8KKwlYcGF0aCAzMjc2OAkJCQkiIFg6IDAKKwlYb3V0IHY6ZXhjZXB0aW9uICJpbiIgdjp0aHJvd3BvaW50CisgICAgZmluYWxseQorCWJyZWFrCQkiIGRpc2NhcmQgZXJyb3IgZm9yICRWSU1OT0VSUlRIUk9XCisgICAgZW5kdHJ5CitlbmR3aGlsZQorCit3aGlsZSAxCisgICAgdHJ5CisJbGV0IGluZmlsZSA9IHRlbXBuYW1lKCkKKwlsZXQgdG1wZmlsZSA9IHRlbXBuYW1lKCkKKwlleGVjICIhZWNobyBYWVogPiIgLiBpbmZpbGUKKwlleGVjICJlZGl0IiB0bXBmaWxlCisJdHJ5CisJICAgIFhwYXRoIDY1NTM2CQkJCSIgWDogNjU1MzYKKwkgICAgdHJ5CisJCWxldCBwb3N0ID0gMAorCQlhdWcgVE1QCisJCSAgICBhdSEgRmlsZVJlYWRQcmUgICogYXNkZgorCQkgICAgYXUhIEZpbGVSZWFkUG9zdCAqIGxldCBwb3N0ID0gMQorCQlhdWcgRU5ECisJCWxldCBjYXVnaHQgPSAwCisJCWV4ZWMgIjByZWFkIiBpbmZpbGUKKwkgICAgY2F0Y2ggL15WaW1cKChyZWFkKVwpXD06LworCQlsZXQgY2F1Z2h0ID0gMQorCQlsZXQgdjplcnJtc2cgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnXlZpbVwoKHJlYWQpXClcPTonLCAnJywKKwkJICAgIFwgIiIpCisJICAgIGZpbmFsbHkKKwkJWHBhdGggMTMxMDcyCQkJIiBYOiAxMzEwNzIKKwkJaWYgIWNhdWdodCAmJiAhJFZJTU5PRVJSVEhST1cKKwkJICAgIFhwYXRoIDI2MjE0NAkJIiBYOiAwCisJCWVuZGlmCisJCWxldCB2OmVycm1zZyA9IHN1YnN0aXR1dGUodjplcnJtc2csICcgJy5pbmZpbGUuJyQnLCAnJywgIiIpCisJCWlmICFNU0coJ0U0OTInLCAiTm90IGFuIGVkaXRvciBjb21tYW5kIikKKwkJICAgIFhwYXRoIDUyNDI4OAkJIiBYOiAwCisJCWVuZGlmCisJCWlmIGdldGxpbmUoIjEiKSA9PSAiWFlaIgorCQkgICAgWHBhdGggMTA0ODU3NgkJIiBYOiAwCisJCSAgICBYb3V0ICI6cmVhZCBjb21tYW5kIG5vdCBzdXBwcmVzc2VkIGFmdGVyIEZpbGVSZWFkUHJlIGVycm9yIgorCQllbmRpZgorCQlpZiBwb3N0CisJCSAgICBYcGF0aCAyMDk3MTUyCQkiIFg6IDAKKwkJICAgIFhvdXQgIkZpbGVSZWFkUG9zdCBjb21tYW5kcyBleGVjdXRlZCBhZnRlciAiIC4KKwkJCVwgIkZpbGVSZWFkUHJlIGVycm9yIgorCQllbmRpZgorCQlhdSEgVE1QCisJCWF1ZyEgVE1QCisJICAgIGVuZHRyeQorCWZpbmFsbHkKKwkgICAgYndpcGVvdXQhCisJZW5kdHJ5CisgICAgY2F0Y2ggLy4qLworCVhwYXRoIDQxOTQzMDQJCQkJIiBYOiAwCisJWG91dCB2OmV4Y2VwdGlvbiAiaW4iIHY6dGhyb3dwb2ludAorICAgIGZpbmFsbHkKKwlicmVhawkJIiBkaXNjYXJkIGVycm9yIGZvciAkVklNTk9FUlJUSFJPVworICAgIGVuZHRyeQorZW5kd2hpbGUKKworY2FsbCBkZWxldGUoaW5maWxlKQorY2FsbCBkZWxldGUodG1wZmlsZSkKK3VubGV0ISBjYXVnaHQgcG9zdCBpbmZpbGUgdG1wZmlsZQorZGVsZnVuY3Rpb24gTVNHCitkZWxmdW5jdGlvbiBEZWxldGVfYXV0b2NvbW1hbmRzCisKK1hjaGVjayAxOTg2ODkKKworCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiBUZXN0IDg2OiAgJFZJTU5PRVJSVEhST1cgYW5kICRWSU1OT0lOVFRIUk9XIHN1cHBvcnQJCQkgICAge3t7MQorIgorIgkgICAgSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIFZpbSBmb3IgdGhyb3dpbmcgZXhjZXB0aW9ucyBvbiBlcnJvcgorIgkgICAgb3IgaW50ZXJydXB0LCBjb250cm9sbGVkIGJ5IHZhcmlhYmxlcyAkVklNTk9FUlJUSFJPVyBhbmQKKyIJICAgICRWSU1OT0lOVFRIUk9XLiAgVGhpcyBpcyBqdXN0IGZvciBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgdGVzdHMuCisiCSAgICBBbGwgdGVzdHMgaGVyZSBzaG91bGQgcnVuIGZvciBhbGwgZm91ciBjb21iaW5hdGlvbnMgb2Ygc2V0dGluZworIgkgICAgdGhlc2UgdmFyaWFibGVzIHRvIDAgb3IgMS4gIFRoZSB2YXJpYWJsZXMgYXJlIGludGVuZGVkIGZvciB0aGUKKyIJICAgIGRldmVsb3BtZW50IHBoYXNlIG9ubHkuICBJbiB0aGUgZmluYWwgcmVsZWFzZSwgVmltIHNob3VsZCBiZQorIgkgICAgY29uZmlndXJlZCB0byBhbHdheXMgdXNlIGVycm9yIGFuZCBpbnRlcnJ1cHQgZXhjZXB0aW9ucy4KKyIKKyIJICAgIFRoZSB0ZXN0IHJlc3VsdCBpcyAiT0siLAorIgorIgkJLSBpZiB0aGUgJFZJTU5PRVJSVEhST1cgYW5kIHRoZSAkVklNTk9JTlRUSFJPVyBjb250cm9sIGFyZSBub3QKKyIJCSAgY29uZmlndXJlZCBhbmQgZXhjZXB0aW9ucyBhcmUgdGhyb3duIG9uIGVycm9yIGFuZCBvbgorIgkJICBpbnRlcnJ1cHQuCisiCisiCQktIGlmIHRoZSAkVklNTk9FUlJUSFJPVyBvciB0aGUgJFZJTU5PSU5UVEhST1cgY29udHJvbCBpcworIgkJICBjb25maWd1cmVkIGFuZCB3b3JrcyBhcyBpbnRlbmRlZC4KKyIKKyIJICAgIFdoYXQgYWN0dWFsbHkgaGFwcGVucywgaXMgc2hvd24gaW4gdGhlIHRlc3Qgb3V0cHV0LgorIgorIgkgICAgT3RoZXJ3aXNlLCB0aGUgdGVzdCByZXN1bHQgaXMgIkZBSUwiLCBhbmQgdGhlIHRlc3Qgb3V0cHV0IGRlc2NyaWJlcworIgkgICAgdGhlIHByb2JsZW0uCisiCisiIElNUE9SVEFOVDogIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCB0ZXN0IGJlY2F1c2UgaXQgc2V0cyAkVklNTk9FUlJUSFJPVyBhbmQKKyIJICAgICAgJFZJTU5PSU5UVEhST1cuCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYcGF0aElOSVQKKworaWYgRXh0cmFWaW0oKQorCisgICAgZnVuY3Rpb24hIFRocm93T25FcnJvcigpCisJWGxvb3BORVhUCisJbGV0IGNhdWdodCA9IDAKKwl0cnkKKwkgICAgWGxvb3AgMQkJCQkiIFg6IDEgKyA4ICsgNjQKKwkgICAgYXNkZgorCWNhdGNoIC8uKi8KKwkgICAgbGV0IGNhdWdodCA9IDEJIiBlcnJvciBleGNlcHRpb24gY2F1Z2h0CisJZmluYWxseQorCSAgICBYbG9vcCAyCQkJCSIgWDogMiArIDE2ICsgMTI4CisJICAgIHJldHVybiBjYXVnaHQJIiBkaXNjYXJkIGFib3J0aW5nIGVycm9yCisJZW5kdHJ5CisJWGxvb3AgNAkJCQkJIiBYOiAwCisgICAgZW5kZnVuY3Rpb24KKworICAgIGxldCBxdWl0c19za2lwcGVkID0gMAorCisgICAgZnVuY3Rpb24hIFRocm93T25JbnRlcnJ1cHQoKQorCVhsb29wTkVYVAorCWxldCBjYXVnaHQgPSAwCisJdHJ5CisJICAgIFhsb29wIDEJCQkJIiBYOiAoMSArIDggKyA2NCkgKiA1MTIKKwkgICAgIklOVEVSUlVQVDMKKwkgICAgbGV0IGR1bW15ID0gMAorCSAgICBsZXQgZzpxdWl0c19za2lwcGVkID0gZzpxdWl0c19za2lwcGVkICsgMQorCWNhdGNoIC8uKi8KKwkgICAgbGV0IGNhdWdodCA9IDEJIiBpbnRlcnJ1cHQgZXhjZXB0aW9uIGNhdWdodAorCWZpbmFsbHkKKwkgICAgWGxvb3AgMgkJCQkiIFg6ICgyICsgMTYgKyAxMjgpICogNTEyCisJICAgIHJldHVybiBjYXVnaHQJIiBkaXNjYXJkIGludGVycnVwdAorCWVuZHRyeQorCVhsb29wIDQJCQkJCSIgWDogMAorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBmdW5jdGlvbiEgQ2hlY2tUaHJvdyhUeXBlKQorCWV4ZWN1dGUgJ3JldHVybiBUaHJvd09uJyAuIGE6VHlwZSAuICcoKScKKyAgICBlbmRmdW5jdGlvbgorCisgICAgZnVuY3Rpb24hIENoZWNrQ29uZmlndXJhdGlvbih0eXBlKQkgICAgIiB0eXBlIGlzICJlcnJvciIgb3IgImludGVycnVwdCIKKworCWxldCB0eXBlID0gYTp0eXBlCisJbGV0IFR5cGUgPSBzdWJzdGl0dXRlKHR5cGUsICcuKicsICdcdSYnLCAiIikKKwlsZXQgVkFSID0gJyRWSU1OTycgLiBzdWJzdGl0dXRlKHR5cGUsICdcKC4uLlwpLionLCAnXFVcMScsICIiKSAuICdUSFJPVycKKworCWlmIHR5cGUgPT0gImVycm9yIgorCSAgICBYbG9vcElOSVQhIDEgOAorCWVsc2VpZiB0eXBlID09ICJpbnRlcnJ1cHQiCisJICAgIFhsb29wSU5JVCEgNTEyIDgKKwllbmRpZgorCisJZXhlYyAnbGV0IHJlcXVlc3RlZF9mb3JfdGVzdHMgPSBleGlzdHMoVkFSKSAmJiAnIC4gVkFSIC4gJyA9PSAwJworCWV4ZWMgJ2xldCBzdXBwcmVzc2VkX2Zvcl90ZXN0cyA9ICcgLiBWQVIgLiAnICE9IDAnCisJbGV0IHVzZWRfaW5fdGVzdHMgPSBDaGVja1Rocm93KFR5cGUpCisKKwlleGVjICdsZXQgJyAuIFZBUiAuICcgPSAwJworCWxldCByZXF1ZXN0X3dvcmtzID0gQ2hlY2tUaHJvdyhUeXBlKQorCisJZXhlYyAnbGV0ICcgLiBWQVIgLiAnID0gMScKKwlsZXQgc3VwcHJlc3Nfd29ya3MgPSAhQ2hlY2tUaHJvdyhUeXBlKQorCisJaWYgdHlwZSA9PSAiZXJyb3IiCisJICAgIFhsb29wSU5JVCEgMjYyMTQ0IDgKKwllbHNlaWYgdHlwZSA9PSAiaW50ZXJydXB0IgorCSAgICBYbG9vcElOSVQhIDIwOTcxNTIgOAorCisJICAgIGlmIGc6cXVpdHNfc2tpcHBlZCAhPSAwCisJCVhsb29wIDEJCQkJIiBYOiAwKjIwOTcxNTIKKwkJWG91dCAiVGVzdCBlbnZpcm9ubWVudCBlcnJvci4gIEludGVycnVwdCBicmVha3BvaW50cyBza2lwcGVkOiAiCisJCSAgICBcIC4gZzpxdWl0c19za2lwcGVkIC4gIi5cbiIKKwkJICAgIFwgLiAiQ2Fubm90IGNoZWNrIHdoZXRoZXIgaW50ZXJydXB0IGV4Y2VwdGlvbnMgYXJlIHRocm93bi4iCisJCXJldHVybgorCSAgICBlbmRpZgorCWVuZGlmCisKKwlsZXQgZmFpbHVyZSA9CisJICAgIFwgIXN1cHByZXNzZWRfZm9yX3Rlc3RzICYmICF1c2VkX2luX3Rlc3RzCisJICAgIFwgfHwgIXJlcXVlc3Rfd29ya3MKKworCWxldCBjb250cmFkaWN0aW9uID0KKwkgICAgXCB1c2VkX2luX3Rlc3RzCisJCVwgPyBzdXBwcmVzc2VkX2Zvcl90ZXN0cyAmJiAhcmVxdWVzdF93b3JrcworCQlcIDogIXN1cHByZXNzZWRfZm9yX3Rlc3RzCisKKwlpZiBmYWlsdXJlCisJICAgICIgRmFpbHVyZSBpbiBjb25maWd1cmF0aW9uLgorCSAgICBYbG9vcCAyCQkJCSIgWDogMCAqIDIqICAoMjYyMTQ0ICsgMjA5NzE1MikKKwllbHNlaWYgY29udHJhZGljdGlvbgorCSAgICAiIEZhaWx1cmUgaW4gdGVzdCBsb2dpYy4gIFNob3VsZCBub3QgaGFwcGVuLgorCSAgICBYbG9vcCA0CQkJCSIgWDogMCAqIDQgKiAoMjYyMTQ0ICsgMjA5NzE1MikKKwllbmRpZgorCisJbGV0IHZhcl9jb250cm9sX2NvbmZpZ3VyZWQgPQorCSAgICBcIHJlcXVlc3Rfd29ya3MgIT0gdXNlZF9pbl90ZXN0cworCSAgICBcIHx8IHN1cHByZXNzX3dvcmtzID09IHVzZWRfaW5fdGVzdHMKKworCWxldCB2YXJfY29udHJvbF9ub3RfY29uZmlndXJlZCA9CisJICAgIFwgcmVxdWVzdGVkX2Zvcl90ZXN0cyB8fCBzdXBwcmVzc2VkX2Zvcl90ZXN0cworCQlcID8gcmVxdWVzdF93b3JrcyAmJiAhc3VwcHJlc3Nfd29ya3MKKwkJXCA6IHJlcXVlc3Rfd29ya3MgPT0gdXNlZF9pbl90ZXN0cworCQkgICAgXCAmJiBzdXBwcmVzc193b3JrcyAhPSB1c2VkX2luX3Rlc3RzCisKKwlsZXQgd2l0aCA9IHVzZWRfaW5fdGVzdHMgPyAid2l0aCIgOiAid2l0aG91dCIKKworCWxldCBzZXQgPSBzdXBwcmVzc2VkX2Zvcl90ZXN0cyA/ICJub24temVybyIgOgorCSAgICBcIHJlcXVlc3RlZF9mb3JfdGVzdHMgPyAiMCIgOiAidW5zZXQiCisKKwlsZXQgYWx0aG91Z2ggPSBjb250cmFkaWN0aW9uICYmICF2YXJfY29udHJvbF9ub3RfY29uZmlndXJlZAorCSAgICBcID8gIixcbmFsdGhvdWdoICIKKwkgICAgXCA6ICIuXG4iCisKKwlsZXQgb3V0cHV0ID0gIkFsbCB0ZXN0cyB3ZXJlIHJ1biAiIC4gd2l0aCAuICIgdGhyb3dpbmcgZXhjZXB0aW9ucyBvbiAiCisJICAgIFwgLiB0eXBlIC4gYWx0aG91Z2gKKworCWlmICF2YXJfY29udHJvbF9ub3RfY29uZmlndXJlZAorCSAgICBsZXQgb3V0cHV0ID0gb3V0cHV0IC4gVkFSIC4gIiB3YXMgIiAuIHNldCAuICIuIgorCisJICAgIGlmICFyZXF1ZXN0X3dvcmtzICYmICFyZXF1ZXN0ZWRfZm9yX3Rlc3RzCisJCWxldCBvdXRwdXQgPSBvdXRwdXQgLgorCQkgICAgXCAiXG4iIC4gVHlwZSAuICIgZXhjZXB0aW9ucyBhcmUgbm90IHRocm93biB3aGVuICIgLiBWQVIgLgorCQkgICAgXCAiIGlzXG5zZXQgdG8gMC4iCisJICAgIGVuZGlmCisKKwkgICAgaWYgIXN1cHByZXNzX3dvcmtzICYmICghdXNlZF9pbl90ZXN0cyB8fAorCSAgICBcICFyZXF1ZXN0X3dvcmtzICYmCisJICAgIFwgIXJlcXVlc3RlZF9mb3JfdGVzdHMgJiYgIXN1cHByZXNzZWRfZm9yX3Rlc3RzKQorCQlsZXQgb3V0cHV0ID0gb3V0cHV0IC4KKwkJICAgIFwgIlxuIiAuIFR5cGUgLiAiIGV4Y2VwdGlvbnMgYXJlIHRocm93biB3aGVuICIgLiBWQVIgLgorCQkgICAgXCAiIGlzIHNldCB0byAxLiIKKwkgICAgZW5kaWYKKworCSAgICBpZiAhZmFpbHVyZSAmJiB2YXJfY29udHJvbF9jb25maWd1cmVkCisJCWxldCBvdXRwdXQgPSBvdXRwdXQgLgorCQkgICAgXCAiXG5SdW4gdGVzdHMgYWxzbyB3aXRoICIgLiBzdWJzdGl0dXRlKFZBUiwgJ15cJCcsICcnLCAiIikKKwkJICAgIFwgLiAiPSIgLiB1c2VkX2luX3Rlc3RzIC4gIi4iCisJCSAgICBcIC4gIlxuVGhpcyBpcyBmb3IgdGVzdGluZyBpbiB0aGUgZGV2ZWxvcG1lbnQgcGhhc2Ugb25seS4iCisJCSAgICBcIC4gIiAgUmVtb3ZlIHRoZSBcbiIKKwkJICAgIFwgLiBWQVIgLiAiIGNvbnRyb2wgaW4gdGhlIGZpbmFsIHJlbGVhc2UuIgorCSAgICBlbmRpZgorCWVsc2UKKwkgICAgbGV0IG91dHB1dCA9IG91dHB1dCAuCisJCVwgIlRoZSAiIC4gVkFSIC4gIiBjb250cm9sIGlzIG5vdCBjb25maWd1cmVkLiIKKwllbmRpZgorCisJWG91dCBvdXRwdXQKKyAgICBlbmRmdW5jdGlvbgorCisgICAgY2FsbCBDaGVja0NvbmZpZ3VyYXRpb24oImVycm9yIikKKyAgICBYcGF0aCAxNjc3NzIxNgkJCQkiIFg6IDE2Nzc3MjE2CisgICAgY2FsbCBDaGVja0NvbmZpZ3VyYXRpb24oImludGVycnVwdCIpCisgICAgWHBhdGggMzM1NTQ0MzIJCQkJIiBYOiAzMzU1NDQzMgorZW5kaWYKKworWGNoZWNrIDUwNDQzOTk1CisKKyIgSU1QT1JUQU5UOiBObyB0ZXN0IHNob3VsZCBiZSBhZGRlZCBhZnRlciB0aGlzIHRlc3QgYmVjYXVzZSBpdCBjaGFuZ2VzCisiCSAgICAgJFZJTU5PRVJSVEhST1cgYW5kICRWSU1OT0lOVFRIUk9XLgorCisKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIE1vZGVsaW5lcwkJCQkJCQkJICAgIHt7ezEKKyIgdmltOiB0cz04IHN3PTQgdHc9ODAgZmRtPW1hcmtlcgorIiB2aW06IGZkdD1zdWJzdGl0dXRlKHN1YnN0aXR1dGUoZm9sZHRleHQoKSxcICdcXCUoXistLVxcKVxcQDw9XFwoXFxzKlxcKVxcKC5cXHstfVxcKVw6XCBcXCUoXCJcIFxcKVxcPVxcKFRlc3RcIFxcZCpcXClcOlxccyonLFwgJ1xcM1wgKFxcMilcOlwgXFwxJyxcIFwiXCIpLFwgJ1xcKFRlc3RcXHMqXFwpXFwoXFxkXFwpXFxEXFxAPScsXCAnXFwxXCBcXDInLFwgIiIpCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDUuaW4gYi9zcmMvdGVzdGRpci90ZXN0NS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTllMjBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDUuaW4KQEAgLTAsMCArMSwyOSBAQAorVGVzdCBmb3IgYXV0b2NvbW1hbmQgdGhhdCBkZWxldGVzIHRoZSBjdXJyZW50IGJ1ZmZlciBvbiBCdWZMZWF2ZSBldmVudC4KK0Fsc28gdGVzdCBkZWxldGluZyB0aGUgbGFzdCBidWZmZXIsIHNob3VsZCBnaXZlIGEgbmV3LCBlbXB0eSBidWZmZXIuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOmF1IEJ1ZkxlYXZlIFh4eCBid2lwZQorL3N0YXJ0IG9mCis6LiwvZW5kIG9mL3chIFh4eCAgICAgICAgICAgICAgICIgd3JpdGUgdGVzdCBmaWxlIFh4eAorOnNwIFh4eCAgICAgICAgICAgICAgICAgICAgICAgICAiIHNwbGl0IHRvIFh4eAorOmJ3aXBlICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbGV0ZSBidWZmZXIgWHh4LCBub3cgd2UncmUgYmFjayBoZXJlCitHP3RoaXMgaXMgYQorb3RoaXMgaXMgc29tZSBtb3JlIHRleHQbCis6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQXBwZW5kIHNvbWUgdGV4dCB0byB0aGlzIGZpbGUKKzo/c3RhcnQ/LCR3ISB0ZXN0Lm91dCAgICAgICAgICAgIiBXcml0ZSBjdXJyZW50IGZpbGUgY29udGVudHMKKzpid2lwZSB0ZXN0Lm91dCAgICAgICAgICAgICAgICAgIiBkZWxldGUgYWx0ZXJuYXRlIGJ1ZmZlcgorOmF1IGJ1ZmxlYXZlIHRlc3Q1LmluIGJ3aXBlCis6YndpcGUhICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsZXRlIGN1cnJlbnQgYnVmZmVyLCBnZXQgYW4gZW1wdHkgb25lCitpdGhpcyBpcyBhbm90aGVyIHRlc3QgbGluZRs6dyA+PnRlc3Qub3V0Cis6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXBwZW5kIGFuIGV4dHJhIGxpbmUgdG8gdGhlIG91dHB1dCBmaWxlCis6cWEhCitFTkRURVNUCisKK3N0YXJ0IG9mIHRlc3QgZmlsZSBYeHgKK3ZpbTogc2V0IG5vYWkgOgorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDUub2sgYi9zcmMvdGVzdGRpci90ZXN0NS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQzMDYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDUub2sKQEAgLTAsMCArMSw5IEBACitzdGFydCBvZiB0ZXN0IGZpbGUgWHh4Cit2aW06IHNldCBub2FpIDoKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAordGhpcyBpcyBzb21lIG1vcmUgdGV4dAorZW5kIG9mIHRlc3QgZmlsZSBYeHgKK3RoaXMgaXMgYW5vdGhlciB0ZXN0IGxpbmUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q1MC5pbiBiL3NyYy90ZXN0ZGlyL3Rlc3Q1MC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzhhYzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDUwLmluCkBAIC0wLDAgKzEsODUgQEAKK1Rlc3QgZm9yIHNob3J0cGF0aG5hbWUgJzo4JyBleHRlbnNpb24uCitPbmx5IGZvciB1c2Ugb24gV2luMzIgc3lzdGVtcyEKKworU1RBUlRURVNUCis6c28gc21hbGwudmltCis6ZnVuISBUZXN0SXQoZmlsZSwgYml0cywgZXhwZWN0ZWQpCisJbGV0IHJlcz1mbmFtZW1vZGlmeShhOmZpbGUsYTpiaXRzKQorCWlmIGE6ZXhwZWN0ZWQgPT0gJycKKwkJZWNobyAiJyIuYTpmaWxlLiInLT4oIi5hOmJpdHMuIiktPiciLnJlcy4iJyIKKwllbHNlCisJCWlmIHN1YnN0aXR1dGUocmVzLCcvJywnXFwnLCAnZycpICE9IHN1YnN0aXR1dGUoIGE6ZXhwZWN0ZWQsICcvJywnXFwnLCAnZycpIAorCQkJZWNobyAiRkFJTEVEOiAnIi5hOmZpbGUuIictPigiLmE6Yml0cy4iKS0+JyIucmVzLiInIgorCQkJZWNobyAiRXhwZWN0ZWQ6ICciLmE6ZXhwZWN0ZWQuIiciCisJCWVsc2UKKwkJCWVjaG8gIk9LIgorCQllbmRpZgorCWVuZGlmCitlbmRmdW4KKzpmdW4hIE1ha2VEaXIoIGRpcm5hbWUgKQorCSJleGUgJyFta2RpciAnLnN1YnN0aXR1dGUoYTpkaXJuYW1lLCcvJywnXFwnLCdnJykKKwljYWxsIHN5c3RlbSgnbWtkaXIgJy5zdWJzdGl0dXRlKGE6ZGlybmFtZSwnLycsJ1xcJywnZycpKQorZW5kZnVuCis6ZnVuISBSTURpciggZGlybmFtZSkKKwkiZXhlICchcm1kaXIgJy5zdWJzdGl0dXRlKGE6ZGlybmFtZSwnLycsJ1xcJywnZycpCisJY2FsbCBzeXN0ZW0oJ3JtZGlyICcuc3Vic3RpdHV0ZShhOmRpcm5hbWUsJy8nLCdcXCcsJ2cnKSkKK2VuZGZ1bgorOmZ1biEgTWFrZUZpbGUoIGZpbGVuYW1lKQorCSJleGUgJyFjb3B5IG51bCAnLnN1YnN0aXR1dGUoYTpmaWxlbmFtZSwnLycsJ1xcJywnZycpCisJY2FsbCBzeXN0ZW0oJ2NvcHkgbnVsICcuc3Vic3RpdHV0ZShhOmZpbGVuYW1lLCcvJywnXFwnLCdnJykpCitlbmRmdW4KKzpmdW4hIFRlc3RDb2xvbkVpZ2h0KCkKKyAgIHJlZGlyISA+dGVzdC5vdXQKKwkiIFRoaXMgY291bGQgY2hhbmdlIGZvciBDeWdXaW4gdG8gLy9jeWdkcml2ZS9jCisJbGV0IGRpcjE9J2M6L3gueC55JworCWlmIGZpbGVyZWFkYWJsZShkaXIxKSB8fCBpc2RpcmVjdG9yeShkaXIxKQorCQljYWxsIGNvbmZpcm0oICInIi5kaXIxLiInIGV4aXN0cywgY2Fubm90IHJ1biB0ZXN0IiApCisJCXJldHVybgorCWVuZGlmCisJbGV0IGZpbGUxPWRpcjEuJy96ei55LnR4dCcKKwlsZXQgbm9maWxlMT1kaXIxLicvei55LnR4dCcKKwlsZXQgZGlyMj1kaXIxLicvVmltSXNUaGVHcmVhdGVzdFNpbmNlU2xpY2VkQnJlYWQnCisJbGV0IGZpbGUyPWRpcjIuJy96LnR4dCcKKwlsZXQgbm9maWxlMj1kaXIyLicvenoudHh0JworCWxldCByZXNkaXIxPSdjOi9YWDIyMzV+MS5ZJworCWxldCByZXNmaWxlMT1yZXNkaXIxLicvWlpZfjEuVFhUJworCWxldCByZXNub2ZpbGUxPXJlc2RpcjEuJy96LnkudHh0JworCWxldCByZXNkaXIyPXJlc2RpcjEuJy9WSU1JU1R+MScKKwlsZXQgcmVzZmlsZTI9cmVzZGlyMi4nL3oudHh0JworCWxldCByZXNub2ZpbGUyPXJlc2RpcjIuJy96ei50eHQnCisJY2FsbCBNYWtlRGlyKCBkaXIxICkKKwljYWxsIE1ha2VEaXIoIGRpcjIgKQorCWNhbGwgTWFrZUZpbGUoIGZpbGUxICkKKwljYWxsIE1ha2VGaWxlKCBmaWxlMiApCisJY2FsbCBUZXN0SXQoZmlsZTEsICc6cDo4JywgcmVzZmlsZTEpCisJY2FsbCBUZXN0SXQobm9maWxlMSwgJzpwOjgnLCByZXNub2ZpbGUxKQorCWNhbGwgVGVzdEl0KGZpbGUyLCAnOnA6OCcsIHJlc2ZpbGUyKQorCWNhbGwgVGVzdEl0KG5vZmlsZTIsICc6cDo4JywgcmVzbm9maWxlMikKKwljYWxsIFRlc3RJdChub2ZpbGUyLCAnOnA6ODpoJywgZm5hbWVtb2RpZnkocmVzbm9maWxlMiwnOmgnKSkKKwlleGUgJ2NkICcuZGlyMQorCWNhbGwgVGVzdEl0KGZpbGUxLCAnOi46OCcsIHN0cnBhcnQocmVzZmlsZTEsc3RybGVuKHJlc2RpcjEpKzEpKQorCWNhbGwgVGVzdEl0KG5vZmlsZTEsICc6Ljo4Jywgc3RycGFydChyZXNub2ZpbGUxLHN0cmxlbihyZXNkaXIxKSsxKSkKKwljYWxsIFRlc3RJdChmaWxlMiwgJzouOjgnLCBzdHJwYXJ0KHJlc2ZpbGUyLHN0cmxlbihyZXNkaXIxKSsxKSkKKwljYWxsIFRlc3RJdChub2ZpbGUyLCAnOi46OCcsIHN0cnBhcnQocmVzbm9maWxlMixzdHJsZW4ocmVzZGlyMSkrMSkpCisJbGV0ICRIT01FPWRpcjEKKwljYWxsIFRlc3RJdChmaWxlMSwgJzp+OjgnLCAnficuc3RycGFydChyZXNmaWxlMSxzdHJsZW4ocmVzZGlyMSkpKQorCWNhbGwgVGVzdEl0KG5vZmlsZTEsICc6fjo4JywgJ34nLnN0cnBhcnQocmVzbm9maWxlMSxzdHJsZW4ocmVzZGlyMSkpKQorCWNhbGwgVGVzdEl0KGZpbGUyLCAnOn46OCcsICd+Jy5zdHJwYXJ0KHJlc2ZpbGUyLHN0cmxlbihyZXNkaXIxKSkpCisJY2FsbCBUZXN0SXQobm9maWxlMiwgJzp+OjgnLCAnficuc3RycGFydChyZXNub2ZpbGUyLHN0cmxlbihyZXNkaXIxKSkpCisJY2QgYzovCisJY2FsbCBkZWxldGUoIGZpbGUyICkKKwljYWxsIGRlbGV0ZSggZmlsZTEgKQorCWNhbGwgUk1EaXIoIGRpcjIgKQorCWNhbGwgUk1EaXIoIGRpcjEgKQorICAgICAgIGVjaG8KKyAgIHJlZGlyIEVORAorZW5kZnVuCis6bGV0IGRpciA9IGdldGN3ZCgpCis6Y2FsbCBUZXN0Q29sb25FaWdodCgpCis6ZXhlICJjZCAiIC4gZGlyCis6ZWRpdCEgdGVzdC5vdXQKKzpzZXQgZmY9ZG9zCis6dworOnFhIQorRU5EVEVTVAorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NTAub2sgYi9zcmMvdGVzdGRpci90ZXN0NTAub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZjFkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q1MC5vawpAQCAtMCwwICsxLDE0IEBACisKK09LCitPSworT0sKK09LCitPSworT0sKK09LCitPSworT0sKK09LCitPSworT0sKK09LCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NTEuaW4gYi9zcmMvdGVzdGRpci90ZXN0NTEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1OGM4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q1MS5pbgpAQCAtMCwwICsxLDM0IEBACitUZXN0cyBmb3IgIjpoaWdobGlnaHQiLiB2aW06IHNldCBmdD12aW0gOgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzoiIGJhc2ljIHRlc3QgaWYgIjpoaWdobGlnaHQiIGRvZXNuJ3QgY3Jhc2gKKzpoaWdobGlnaHQKKzpoaSBTZWFyY2gKKzoiIHRlc3Qgc2V0dGluZyBjb2xvcnMuCis6IiB0ZXN0IGNsZWFyaW5nIG9uZSBjb2xvciBhbmQgYWxsIGRvZXNuJ3QgZ2VuZXJhdGUgZXJyb3Igb3Igd2FybmluZworOmhpIE5ld0dyb3VwIHRlcm09Ym9sZCBjdGVybT1pdGFsaWMgY3Rlcm1mZz1EYXJrQmx1ZSBjdGVybWJnPUdyZXkgZ3VpPSBndWlmZz0jMDBmZjAwIGd1aWJnPUN5YW4KKzpoaSBHcm91cDIgdGVybT0gY3Rlcm09Cis6aGkgR3JvdXAzIHRlcm09dW5kZXJsaW5lIGN0ZXJtPWJvbGQKKzpyZWRpciA+dGVzdC5vdXQKKzpoaSBOZXdHcm91cAorOmhpIEdyb3VwMgorOmhpIEdyb3VwMworOmhpIGNsZWFyIE5ld0dyb3VwCis6aGkgTmV3R3JvdXAKKzpoaSBHcm91cDIKKzpoaSBHcm91cDIgTk9ORQorOmhpIEdyb3VwMgorOmhpIGNsZWFyCis6aGkgR3JvdXAzCis6aGkgQ3Jhc2ggdGVybT0nYXNkZgorOnJlZGlyIEVORAorOiIgZmlsdGVyIGN0ZXJtZmcgYW5kIGN0ZXJtYmcsIHRoZSBudW1iZXJzIGRlcGVuZCBvbiB0aGUgdGVybWluYWwKKzplIHRlc3Qub3V0Cis6JXMvY3Rlcm1mZz1cZCovY3Rlcm1mZz0yLworOiVzL2N0ZXJtYmc9XGQqL2N0ZXJtYmc9My8KKzoiIGZpbHRlciBvdXQgcG9zc2libHkgdHJhbnNsYXRlZCBlcnJvciBtZXNzYWdlCis6JXMvRTQ3NTogW146XSo6L0U0NzU6LworOndxIQorRU5EVEVTVAorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NTEub2sgYi9zcmMvdGVzdGRpci90ZXN0NTEub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlODM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q1MS5vawpAQCAtMCwwICsxLDE1IEBACisKKworTmV3R3JvdXAgICAgICAgeHh4IHRlcm09Ym9sZCBjdGVybT1pdGFsaWMgY3Rlcm1mZz0yIGN0ZXJtYmc9MworCisKK0dyb3VwMyAgICAgICAgIHh4eCB0ZXJtPXVuZGVybGluZSBjdGVybT1ib2xkCisKKworCisKKworCisKKworRTQ3NTogdGVybT0nYXNkZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDUyLmluIGIvc3JjL3Rlc3RkaXIvdGVzdDUyLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmI2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NTIuaW4KQEAgLTAsMCArMSw2NSBAQAorVGVzdHMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgd2l0aCBjb252ZXJzaW9uIGZvciBXaW4zMi4KKworU1RBUlRURVNUCis6c28gbWJ5dGUudmltCis6IiBtYWtlIHRoaXMgYSBkdW1teSB0ZXN0IGZvciBub24tV2luMzIgc3lzdGVtcworOmlmICFoYXMoIndpbjMyIikgfCBlISB0ZXN0Lm9rIHwgd3EhIHRlc3Qub3V0IHwgZW5kaWYKKzoiCis6IiB3cml0ZSB0ZXN0czoKKzoiIGNvbWJpbmUgdGhyZWUgdmFsdWVzIGZvciAnZW5jb2RpbmcnIHdpdGggdGhyZWUgdmFsdWVzIGZvciAnZmlsZWVuY29kaW5nJworOiIgYWxzbyB3cml0ZSBmaWxlcyBmb3IgcmVhZCB0ZXN0cworL14xCis6c2V0IGVuY29kaW5nPXV0Zi04Cis6LnchICsrZW5jPXV0Zi04IHRlc3Qub3V0Cis6LncgKytlbmM9Y3AxMjUxID4+dGVzdC5vdXQKKzoudyArK2VuYz1jcDg2NiA+PnRlc3Qub3V0Cis6LnchICsrZW5jPXV0Zi04IFh1dGY4CisvXjIKKzpzZXQgZW5jb2Rpbmc9Y3AxMjUxCis6LncgKytlbmM9dXRmLTggPj50ZXN0Lm91dAorOi53ICsrZW5jPWNwMTI1MSA+PnRlc3Qub3V0Cis6LncgKytlbmM9Y3A4NjYgPj50ZXN0Lm91dAorOi53ISArK2VuYz1jcDEyNTEgWGNwMTI1MQorL14zCis6c2V0IGVuY29kaW5nPWNwODY2Cis6LncgKytlbmM9dXRmLTggPj50ZXN0Lm91dAorOi53ICsrZW5jPWNwMTI1MSA+PnRlc3Qub3V0Cis6LncgKytlbmM9Y3A4NjYgPj50ZXN0Lm91dAorOi53ISArK2VuYz1jcDg2NiBYY3A4NjYKKzoiCis6IiByZWFkIHRocmVlICdmaWxlZW5jb2RpbmcncyB3aXRoIHV0Zi04ICdlbmNvZGluZycKKzpzZXQgZW5jb2Rpbmc9dXRmLTggZmVuY3M9dXRmLTgsY3AxMjUxCis6ZSBYdXRmOAorOi53ICsrZW5jPXV0Zi04ID4+dGVzdC5vdXQKKzplIFhjcDEyNTEKKzoudyArK2VuYz11dGYtOCA+PnRlc3Qub3V0Cis6c2V0IGZlbmNzPXV0Zi04LGNwODY2Cis6ZSBYY3A4NjYKKzoudyArK2VuYz11dGYtOCA+PnRlc3Qub3V0Cis6IgorOiIgcmVhZCB0aHJlZSAnZmlsZWVuY29kaW5nJ3Mgd2l0aCBjcDEyNTEgJ2VuY29kaW5nJworOnNldCBlbmNvZGluZz11dGYtOCBmZW5jcz11dGYtOCxjcDEyNTEKKzplIFh1dGY4Cis6LncgKytlbmM9Y3AxMjUxID4+dGVzdC5vdXQKKzplIFhjcDEyNTEKKzoudyArK2VuYz1jcDEyNTEgPj50ZXN0Lm91dAorOnNldCBmZW5jcz11dGYtOCxjcDg2NgorOmUgWGNwODY2Cis6LncgKytlbmM9Y3AxMjUxID4+dGVzdC5vdXQKKzoiCis6IiByZWFkIHRocmVlICdmaWxlZW5jb2RpbmcncyB3aXRoIGNwODY2ICdlbmNvZGluZycKKzpzZXQgZW5jb2Rpbmc9Y3A4NjYgZmVuY3M9dXRmLTgsY3AxMjUxCis6ZSBYdXRmOAorOi53ICsrZW5jPWNwODY2ID4+dGVzdC5vdXQKKzplIFhjcDEyNTEKKzoudyArK2VuYz1jcDg2NiA+PnRlc3Qub3V0Cis6c2V0IGZlbmNzPXV0Zi04LGNwODY2Cis6ZSBYY3A4NjYKKzoudyArK2VuYz1jcDg2NiA+PnRlc3Qub3V0Cis6IgorOnFhIQorRU5EVEVTVAorCisxIHV0Zi04IHRleHQ6INCU0LvRjyBWaW0gdmVyc2lvbiA2LjIuICDQn9C+0YHQu9C10LTQvdC10LUg0LjQt9C80LXQvdC10L3QuNC1OiAxOTcwIEphbiAwMQorMiBjcDEyNTEgdGV4dDogxOv/IFZpbSB2ZXJzaW9uIDYuMi4gIM/u8evl5O3l5SDo5+zl7eXt6OU6IDE5NzAgSmFuIDAxCiszIGNwODY2IHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDUyLm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDUyLm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NTIub2sKQEAgLTAsMCArMSwxOCBAQAorMSB1dGYtOCB0ZXh0OiDQlNC70Y8gVmltIHZlcnNpb24gNi4yLiAg0J/QvtGB0LvQtdC00L3QtdC1INC40LfQvNC10L3QtdC90LjQtTogMTk3MCBKYW4gMDEKKzEgdXRmLTggdGV4dDogxOv/IFZpbSB2ZXJzaW9uIDYuMi4gIM/u8evl5O3l5SDo5+zl7eXt6OU6IDE5NzAgSmFuIDAxCisxIHV0Zi04IHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQorMiBjcDEyNTEgdGV4dDog0JTQu9GPIFZpbSB2ZXJzaW9uIDYuMi4gINCf0L7RgdC70LXQtNC90LXQtSDQuNC30LzQtdC90LXQvdC40LU6IDE5NzAgSmFuIDAxCisyIGNwMTI1MSB0ZXh0OiDE6/8gVmltIHZlcnNpb24gNi4yLiAgz+7x6+Xk7eXlIOjn7OXt5e3o5TogMTk3MCBKYW4gMDEKKzIgY3AxMjUxIHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQorMyBjcDg2NiB0ZXh0OiDQlNC70Y8gVmltIHZlcnNpb24gNi4yLiAg0J/QvtGB0LvQtdC00L3QtdC1INC40LfQvNC10L3QtdC90LjQtTogMTk3MCBKYW4gMDEKKzMgY3A4NjYgdGV4dDogxOv/IFZpbSB2ZXJzaW9uIDYuMi4gIM/u8evl5O3l5SDo5+zl7eXt6OU6IDE5NzAgSmFuIDAxCiszIGNwODY2IHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQorMSB1dGYtOCB0ZXh0OiDQlNC70Y8gVmltIHZlcnNpb24gNi4yLiAg0J/QvtGB0LvQtdC00L3QtdC1INC40LfQvNC10L3QtdC90LjQtTogMTk3MCBKYW4gMDEKKzIgY3AxMjUxIHRleHQ6INCU0LvRjyBWaW0gdmVyc2lvbiA2LjIuICDQn9C+0YHQu9C10LTQvdC10LUg0LjQt9C80LXQvdC10L3QuNC1OiAxOTcwIEphbiAwMQorMyBjcDg2NiB0ZXh0OiDQlNC70Y8gVmltIHZlcnNpb24gNi4yLiAg0J/QvtGB0LvQtdC00L3QtdC1INC40LfQvNC10L3QtdC90LjQtTogMTk3MCBKYW4gMDEKKzEgdXRmLTggdGV4dDogxOv/IFZpbSB2ZXJzaW9uIDYuMi4gIM/u8evl5O3l5SDo5+zl7eXt6OU6IDE5NzAgSmFuIDAxCisyIGNwMTI1MSB0ZXh0OiDE6/8gVmltIHZlcnNpb24gNi4yLiAgz+7x6+Xk7eXlIOjn7OXt5e3o5TogMTk3MCBKYW4gMDEKKzMgY3A4NjYgdGV4dDogxOv/IFZpbSB2ZXJzaW9uIDYuMi4gIM/u8evl5O3l5SDo5+zl7eXt6OU6IDE5NzAgSmFuIDAxCisxIHV0Zi04IHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQorMiBjcDEyNTEgdGV4dDoghKvvIFZpbSB2ZXJzaW9uIDYuMi4gII+u4aulpK2lpSCop6ylraWtqKU6IDE5NzAgSmFuIDAxCiszIGNwODY2IHRleHQ6IISr7yBWaW0gdmVyc2lvbiA2LjIuICCPruGrpaStpaUgqKespa2lrailOiAxOTcwIEphbiAwMQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDYuaW4gYi9zcmMvdGVzdGRpci90ZXN0Ni5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJiZTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDYuaW4KQEAgLTAsMCArMSwyNCBAQAorVGVzdCBmb3IgYXV0b2NvbW1hbmQgdGhhdCByZWRlZmluZXMgdGhlIGFyZ3VtZW50IGxpc3QsIHdoZW4gZG9pbmcgIjphbGwiLgorCitTVEFSVFRFU1QKKzpzbyBzbWFsbC52aW0KKzphdSBCdWZSZWFkUG9zdCBYeHgyIG5leHQgWHh4MiBYeHgxCisvXnN0YXJ0IG9mCitBMRs6LiwvZW5kIG9mL3chIFh4eDEgICAgIiB3cml0ZSB0ZXN0IGZpbGUgWHh4MQorJHIyOi4sL2VuZCBvZi93ISBYeHgyICAgICAiIHdyaXRlIHRlc3QgZmlsZSBYeHgyCiskcjM6LiwvZW5kIG9mL3chIFh4eDMgICAgICIgd3JpdGUgdGVzdCBmaWxlIFh4eDMKKzpuZXh0ISBYeHgxIFh4eDIgWHh4MyAgICAgIiByZWRlZmluZSBhcmdsaXN0OyBnbyB0byBYeHgxCis6YWxsICAgICAgICAgICAgICAgICAgICAgICIgb3BlbiB3aW5kb3cgZm9yIGFsbCBhcmdzCis6dyEgdGVzdC5vdXQgICAgICAgICAgICAgICIgV3JpdGUgY29udGVudHMgb2YgWHh4MQorFxcXFzp3ID4+dGVzdC5vdXQgICAgICIgQXBwZW5kIGNvbnRlbnRzIG9mIGxhc3Qgd2luZG93IChYeHgxKQorOnJldyAgICAgICAgICAgICAgICAgICAgICAiIHNob3VsZCBub3cgYmUgaW4gWHh4MgorOncgPj50ZXN0Lm91dCAgICAgICAgICAgICAiIEFwcGVuZCBjb250ZW50cyBvZiBYeHgyCis6cWEhCitFTkRURVNUCisKK3N0YXJ0IG9mIHRlc3QgZmlsZSBYeHgKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorZW5kIG9mIHRlc3QgZmlsZSBYeHgKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q2Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDYub2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMGM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q2Lm9rCkBAIC0wLDAgKzEsMTggQEAKK3N0YXJ0IG9mIHRlc3QgZmlsZSBYeHgxCisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKK2VuZCBvZiB0ZXN0IGZpbGUgWHh4CitzdGFydCBvZiB0ZXN0IGZpbGUgWHh4MQorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eAorc3RhcnQgb2YgdGVzdCBmaWxlIFh4eDIKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CisJdGhpcyBpcyBhIHRlc3QKKwl0aGlzIGlzIGEgdGVzdAorZW5kIG9mIHRlc3QgZmlsZSBYeHgKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q3LmluIGIvc3JjL3Rlc3RkaXIvdGVzdDcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYzA1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q3LmluCkBAIC0wLDAgKzEsMjYgQEAKK1Rlc3QgZm9yIGF1dG9jb21tYW5kIHRoYXQgY2hhbmdlcyB0aGUgYnVmZmVyIGxpc3QsIHdoZW4gZG9pbmcgIjpiYWxsIi4KKworU1RBUlRURVNUCis6c28gc21hbGwudmltCisvXnN0YXJ0IG9mCitBMRs6LiwvZW5kIG9mL3chIFh4eDEgICAiIHdyaXRlIHRlc3QgZmlsZSBYeHgxCis6c3AgWHh4MQorOmNsb3NlCiskcjI6LiwvZW5kIG9mL3chIFh4eDIgICAgIiB3cml0ZSB0ZXN0IGZpbGUgWHh4MgorOnNwIFh4eDIKKzpjbG9zZQorJHIzOi4sL2VuZCBvZi93ISBYeHgzICAgICIgd3JpdGUgdGVzdCBmaWxlIFh4eDMKKzpzcCBYeHgzCis6Y2xvc2UKKzphdSBCdWZSZWFkUG9zdCBYeHgyIGJ3aXBlCiskcjQ6YmFsbCAgICAgICAgICAgICAgICAgIiBvcGVuIHdpbmRvdyBmb3IgYWxsIGFyZ3MsIGNsb3NlIFh4eDIKKzouLCR3ISB0ZXN0Lm91dCAgICAgICAgICAiIFdyaXRlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZQorFxc6dyA+PnRlc3Qub3V0ICAgICAgICAiIEFwcGVuZCBjb250ZW50cyBvZiBzZWNvbmQgd2luZG93IChYeHgxKQorFxc6L15zdGFydCBvZi8sJHcgPj50ZXN0Lm91dCAgICIgQXBwZW5kIGNvbnRlbnRzIG9mIGxhc3Qgd2luZG93ICh0aGlzIGZpbGUpCis6cWEhCitFTkRURVNUCisKK3N0YXJ0IG9mIHRlc3QgZmlsZSBYeHgKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDcub2sgYi9zcmMvdGVzdGRpci90ZXN0Ny5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQxZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDcub2sKQEAgLTAsMCArMSwxMiBAQAorc3RhcnQgb2YgdGVzdCBmaWxlIFh4eDQKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eAorc3RhcnQgb2YgdGVzdCBmaWxlIFh4eDEKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eAorc3RhcnQgb2YgdGVzdCBmaWxlIFh4eDQKKwl0aGlzIGlzIGEgdGVzdAorCXRoaXMgaXMgYSB0ZXN0CitlbmQgb2YgdGVzdCBmaWxlIFh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDguaW4gYi9zcmMvdGVzdGRpci90ZXN0OC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmUxNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDguaW4KQEAgLTAsMCArMSwyNCBAQAorVGVzdCBmb3IgQnVmV3JpdGVQcmUgYXV0b2NvbW1hbmQgdGhhdCBkZWxldGVzIG9yIHVubG9hZHMgdGhlIGJ1ZmZlci4KKworU1RBUlRURVNUCis6c28gc21hbGwudmltCis6YXUgQnVmV3JpdGVQcmUgWHh4MSBidW5sb2FkCis6YXUgQnVmV3JpdGVQcmUgWHh4MiBid2lwZQorL15zdGFydCBvZgorQTEbOi4sL2VuZCBvZi93ISBYeHgxICAiIHdyaXRlIHRlc3QgZmlsZSBYeHgxCiskcjI6LiwvZW5kIG9mL3chIFh4eDIgICAiIHdyaXRlIHRlc3QgZmlsZSBYeHgyCis6ZSEgWHh4MiAgICAgICAgICAgICAgICAiIGVkaXQgWHh4MgorOmJkZWwgdGVzdDguaW4JCSIgZGVsZXRlIHRoaXMgZmlsZSBmcm9tIHRoZSBidWZmZXIgbGlzdAorOmUgWHh4MSAgICAgICAgICAgICAgICAgIiBlZGl0IFh4eDEKKzp3ICAgICAgICAgICAgICAgICAgICAgICIgd3JpdGUgaXQsIHdpbGwgdW5sb2FkIGl0IGFuZCBnaXZlIGFuIGVycm9yIG1zZworOnchIHRlc3Qub3V0ICAgICAgICAgICAgIiBXcml0ZSBjb250ZW50cyBvZiB0aGlzIGZpbGUKKzplISBYeHgyICAgICAgICAgICAgICAgICIgc3RhcnQgZWRpdGluZyBYeHgyCis6YndpcGUgdGVzdC5vdXQgICAgICAgICAiIHJlbW92ZSB0ZXN0Lm91dCBmcm9tIHRoZSBidWZmZXIgbGlzdAorOncgICAgICAgICAgICAgICAgICAgICAgIiB3cml0ZSBpdCwgd2lsbCBkZWxldGUgdGhlIGJ1ZmZlciBhbmQgZ2l2ZSBhbiBlcnJvciBtc2cKKzp3ID4+dGVzdC5vdXQgICAgICAgICAgICIgQXBwZW5kIGNvbnRlbnRzIG9mIHRoaXMgZmlsZQorOnFhIQorRU5EVEVTVAorCitzdGFydCBvZiBYeHgKKwl0ZXN0CitlbmQgb2YgWHh4CmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0OC5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q4Lm9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjA2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0OC5vawpAQCAtMCwwICsxLDYgQEAKK3N0YXJ0IG9mIFh4eDIKKwl0ZXN0CitlbmQgb2YgWHh4CitzdGFydCBvZiBYeHgxCisJdGVzdAorZW5kIG9mIFh4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDkuaW4gYi9zcmMvdGVzdGRpci90ZXN0OS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUxNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDkuaW4KQEAgLTAsMCArMSwxMiBAQAorVGVzdCBmb3IgQnVmbGVhdmUgYXV0b2NvbW1hbmQgdGhhdCBkZWxldGVzIHRoZSBidWZmZXIgd2UgYXJlIGFib3V0IHRvIGVkaXQuCisKK1NUQVJUVEVTVAorOnNvIHNtYWxsLnZpbQorOmF1IEJ1ZkxlYXZlIHRlc3Q5LmluIGJ3aXBlIHl5Cis6ZSB5eQorOi9ec3RhcnQgb2YvLCR3ISB0ZXN0Lm91dCAgICAgICIgV3JpdGUgY29udGVudHMgb2YgdGhpcyBmaWxlCis6cWEhCitFTkRURVNUCisKK3N0YXJ0IG9mIHRlc3QgZmlsZSB4eAorZW5kIG9mIHRlc3QgZmlsZSB4eApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDkub2sgYi9zcmMvdGVzdGRpci90ZXN0OS5vawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2NiNWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDkub2sKQEAgLTAsMCArMSwyIEBACitzdGFydCBvZiB0ZXN0IGZpbGUgeHgKK2VuZCBvZiB0ZXN0IGZpbGUgeHgKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3RvZG9zLnZpbSBiL3NyYy90ZXN0ZGlyL3RvZG9zLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU2YTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RkaXIvdG9kb3MudmltCkBAIC0wLDAgKzEsMyBAQAorOiIgU2NyaXB0IHRvIG1ha2Ugc3VyZSBhIGZpbGUgaXMgaW4gImRvcyIgZmlsZSBmb3JtYXQuCis6c2V0IGZmPWRvcworOndxCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci91bml4LnZpbSBiL3NyYy90ZXN0ZGlyL3VuaXgudmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjZlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci91bml4LnZpbQpAQCAtMCwwICsxLDMgQEAKKyIgU2V0dGluZ3MgZm9yIHRlc3Qgc2NyaXB0IGV4ZWN1dGlvbgorIiBBbHdheXMgdXNlICJzaCIsIGRvbid0IHVzZSB0aGUgdmFsdWUgb2YgIiRTSEVMTCIuCitzZXQgc2hlbGw9c2gKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Ztcy52aW0gYi9zcmMvdGVzdGRpci92bXMudmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDVhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci92bXMudmltCkBAIC0wLDAgKzEsNCBAQAorIiBTZXR0aW5ncyBmb3IgdGVzdCBzY3JpcHQgZXhlY3V0aW9uIHVuZGVyIE9wZW5WTVMKKworIiBEbyBub3QgbWFrZSBhbnkgc3dhcCBmaWxlcworc2V0IG5vc3dhcGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90b29sYmFyLnBoaSBiL3NyYy90b29sYmFyLnBoaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkwNDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rvb2xiYXIucGhpCkBAIC0wLDAgKzEsMTI4MyBAQAorLyogQnVpbHRpbiBpY29ucyBmb3IgdGhlIHRvb2xiYXIgaW4gcGhvdG9uICovCisKK3N0YXRpYyBQZ0NvbG9yX3QgdGJfcGFsZXR0ZVtdID0geworCVBnUkdCKDAsMCwwKSwKKwlQZ1JHQigxMjgsMCwwKSwKKwlQZ1JHQigxMjgsMTI4LDApLAorCVBnUkdCKDEyOCwxMjgsMTI4KSwKKwlQZ1JHQigxOTIsMTkyLDE5MiksCisJUGdSR0IoMjU1LDAsMCksCisJUGdSR0IoMjU1LDI1NSwwKSwKKwlQZ1JHQigyNTUsMjU1LDI1NSksCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9jbG9zZV9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MTQsMHg0NCwweDQ0LDB4NDQsMHgxNCwweDQ0LDB4NDQsCisJMHg0NCwweDQxLDB4NTEsMHgwMCwweDAwLDB4MDEsMHg1MSwweDA0LDB4NDQsCisJMHg0NCwweDE1LDB4NTUsMHgxNCwweDQ0LDB4MTUsMHg1NSwweDEzLDB4NDQsCisJMHg0NCwweDQxLDB4NTUsMHg1MSwweDQxLDB4NTUsMHg1MSwweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4MTUsMHg1NSwweDE1LDB4NTUsMHgxNywweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4NDEsMHg1NSwweDU1LDB4NTEsMHg0NywweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4NDQsMHgxNSwweDU1LDB4MTQsMHg0NywweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4NDEsMHg1NSwweDU1LDB4NTEsMHg0NywweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4MTUsMHg1NSwweDE1LDB4NTUsMHgxNywweDAzLDB4NDQsCisJMHg0NCwweDQxLDB4NTUsMHg1MSwweDQxLDB4NTUsMHg1MSwweDAzLDB4NDQsCisJMHg0NCwweDE1LDB4NTUsMHgxNCwweDQ0LDB4MTUsMHg1NSwweDEzLDB4NDQsCisJMHg0NCwweDQxLDB4NTEsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDUxLDB4NDQsCisJMHg0NCwweDQwLDB4MTQsMHg0NCwweDQ0LDB4NDQsMHgxNSwweDEzLDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg0MSwweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX2Nsb3NlX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9jbG9zZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9jb3B5X2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHg0NCwKKwkweDQwLDB4NzAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NzAsMHgzNCwKKwkweDQwLDB4NzcsMHg3NywweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHgzNCwKKwkweDQwLDB4NzAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4NzAsMHgzNCwKKwkweDQwLDB4NzcsMHg3NywweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHgzNCwKKwkweDQwLDB4NzAsMHgwNywweDA3LDB4MDAsMHgwMCwweDAwLDB4NzAsMHgzNCwKKwkweDQwLDB4NzcsMHg3NywweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHgzNCwKKwkweDQwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHg3NywweDc3LDB4NzAsMHgzNCwKKwkweDQ0LDB4MzMsMHgzMywweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHgzNCwKKwkweDQ0LDB4NDQsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfY29weV9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfY29weV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9jdGFnc19kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDAsMHgwNCwweDAwLDB4MDAsMHgwNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDcsMHg3MCwweDc3LDB4NzcsMHg3MCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDcsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDcsMHg3MCwweDc3LDB4NzcsMHgwMCwweDcwLDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwNCwweDAwLDB4MDAsMHgzNCwweDAwLDB4NDQsCisJMHg0NCwweDQyLDB4MjQsMHg0MiwweDQwLDB4MDAsMHg0MiwweDQwLDB4NDQsCisJMHg0NCwweDIzLDB4NjYsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHg0MiwweDM2LDB4NjYsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHgyMywweDY0LDB4MzQsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHgyNiwweDYzLDB4MDMsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHgzNiwweDY0LDB4MzQsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHgzMCwweDY2LDB4NjYsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHg0MywweDA2LDB4NjYsMHg2NiwweDYwLDB4MDAsMHgzNiwweDY2LDB4MDMsCisJMHg0NCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDAwLDB4MDMsCisJMHg0NCwweDQzLDB4MzMsMHgzMywweDMwLDB4MDAsMHgzMywweDMzLDB4MzMsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDAsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDAsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MzMsMHgzNCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX2N0YWdzX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9jdGFnc19kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9jdXRfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4NDQsMHg0NCwweDQwLDB4MzQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MzQsMHg0NCwweDQwLDB4MzQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MDQsMHg0NCwweDAzLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MDMsMHg0NCwweDAzLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDAsMHg0MCwweDM0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDAsMHgzMCwweDM0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHgwMywweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDAsMHgwMCwweDM0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQzLDB4MDMsMHg0NCwweDAzLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDAwLDB4MDMsMHg0NCwweDAwLDB4MDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0MCwweDMzLDB4MDMsMHg0NCwweDAzLDB4NDAsMHg0NCwweDQ0LAorCTB4NDQsMHg0MCwweDQ0LDB4MDMsMHg0NCwweDAzLDB4NDAsMHgzNCwweDQ0LAorCTB4NDQsMHg0MCwweDQ0LDB4MDMsMHg0NCwweDAzLDB4NDAsMHgzNCwweDQ0LAorCTB4NDQsMHg0NCwweDAwLDB4MzMsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDMzLDB4NDQsMHg0NCwweDQzLDB4MzQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9jdXRfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX2N1dF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9maW5kX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzAsMHgwNCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzAsMHg0MCwweDQ0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzAsMHgwMCwweDA0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzAsMHgwMCwweDA0LDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4MDQsMHg0NCwweDQwLDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDcwLDB4NDcsMHg3NCwweDQ0LDB4MDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDcwLDB4NDcsMHg0NCwweDQ0LDB4MDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDcwLDB4NDQsMHg0NCwweDQ0LDB4MDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDcwLDB4NDQsMHg0NywweDQ0LDB4MDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4MDQsMHg0NCwweDQwLDB4NDQsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzAsMHgwMCwweDA0LDB4MDAsMHg0NCwKKwkweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4MDAsMHgwNCwKKwkweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDAsMHgwNCwKKwkweDQ0LDB4NDQsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfZmluZF9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfZmluZF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9maW5kX2hlbHBfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDAwLDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0MCwweDA0LDB4NDMsMHgwMCwweDM0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwMCwweDM0LDB4NDQsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwMCwweDM0LDB4NDQsMHgwMCwweDAwLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgzMCwweDA0LDB4NDAsMHg0NywweDc0LDB4MDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MDQsMHg0NCwweDc0LDB4NDAsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MDcsMHg3NywweDc0LDB4NzAsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MDQsMHg3NywweDQ0LDB4NDAsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MDAsMHg0NywweDc0LDB4MDMsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHgwMCwweDAwLDB4MzAsMHgwNCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDAsMHgwMCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHgwMCwweDQ0LAorCTB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MzMsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9maW5kX2hlbHBfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX2ZpbmRfaGVscF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9maW5kX25leHRfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDAwLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDA0LDB4MDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwNywweDE3LDB4NzcsMHg3NywweDAwLDB4MDAsMHg0NCwweDQ0LAorCTB4NDQsMHg3NywweDExLDB4NzcsMHg3NywweDc3LDB4NzAsMHg0NCwweDQ0LAorCTB4MTEsMHgxMSwweDE1LDB4MTcsMHg3NywweDAwLDB4MDAsMHg0NCwweDQ0LAorCTB4MTUsMHg1NSwweDU1LDB4NTEsMHg3MCwweDQ0LDB4NDQsMHgwNCwweDQ0LAorCTB4MTUsMHg1NSwweDU1LDB4NTUsMHgxNCwweDc3LDB4NDQsMHg0MCwweDQ0LAorCTB4MTUsMHg1NSwweDU1LDB4NTEsMHgwNCwweDc0LDB4NDQsMHg0MCwweDQ0LAorCTB4MTEsMHgxMSwweDE1LDB4MTcsMHgwNCwweDQ0LDB4NDQsMHg0MCwweDQ0LAorCTB4NDQsMHg3NywweDExLDB4NzcsMHgwNCwweDQ0LDB4NzQsMHg0MCwweDQ0LAorCTB4NDQsMHgwNywweDE3LDB4NzcsMHg3MCwweDQ0LDB4NDQsMHgwNCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDAwLDB4MDAsMHg0MCwweDA0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4NzAsMHg0MCwweDAwLAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDAwLAorCTB4NDQsMHg0NCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9maW5kX25leHRfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX2ZpbmRfbmV4dF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9maW5kX3ByZXZfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDAwLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDA0LDB4MDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NywweDE3LDB4NzcsMHg3NywweDAwLDB4MDAsMHg0NCwweDQ0LAorCTB4NDQsMHg3MSwweDE3LDB4NzcsMHg3NywweDc3LDB4NzAsMHg0NCwweDQ0LAorCTB4NDQsMHgxNSwweDExLDB4MTEsMHgxNywweDAwLDB4MDAsMHg0NCwweDQ0LAorCTB4NDEsMHg1NSwweDU1LDB4NTUsMHgxMCwweDQ0LDB4NDQsMHgwNCwweDQ0LAorCTB4MTUsMHg1NSwweDU1LDB4NTUsMHgwNCwweDc3LDB4NDQsMHg0MCwweDQ0LAorCTB4NDEsMHg1NSwweDU1LDB4NTUsMHgwNCwweDc0LDB4NDQsMHg0MCwweDQ0LAorCTB4NDQsMHgxNSwweDExLDB4MTEsMHgwNCwweDQ0LDB4NDQsMHg0MCwweDQ0LAorCTB4NDQsMHg3MSwweDE3LDB4NzcsMHgwNCwweDQ0LDB4NzQsMHg0MCwweDQ0LAorCTB4NDQsMHg0NywweDE3LDB4NzcsMHg3MCwweDQ0LDB4NDQsMHgwNCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDAwLDB4MDAsMHg0MCwweDA0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4NzAsMHg0MCwweDAwLAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDAwLAorCTB4NDQsMHg0NCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9maW5kX3ByZXZfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX2ZpbmRfcHJldl9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9oZWxwX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDAwLDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0MCwweDA0LDB4NDMsMHgwMCwweDM0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDM0LDB4NDQsMHgwMCwweDA0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDM0LDB4NDQsMHgwMCwweDA0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgzMCwweDA0LDB4NDMsMHgwMCwweDM0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQwLDB4MDMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MzMsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfaGVscF9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfaGVscF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9qdW1wX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDIsMHgyMiwweDIyLDB4MjIsMHgyMiwweDIyLDB4MjIsMHgyNCwKKwkweDQ0LDB4MjMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDQyLDB4MzYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDIzLDB4NjQsMHgzNCwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDI2LDB4NjMsMHgwMywweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDM2LDB4NjQsMHgzNCwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDMwLDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDQzLDB4MDYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMywKKwkweDQ0LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywKKwkweDQ0LDB4NDMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfanVtcF9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfanVtcF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9sb2FkX3Nlc3Npb25fZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHgxMSwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MTUsMHg1NSwweDUxLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQxLDB4MTEsMHg1NSwweDExLDB4MTQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHgxMSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4NzQsMHg0MywweDA0LAorCTB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHgzMywweDA0LAorCTB4NDAsMHg3NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NTUsMHgzMywweDA0LAorCTB4NDAsMHg3NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHgzMywweDA0LAorCTB4NDAsMHg3MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgzMywweDAzLAorCTB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4NzQsMHgzMywweDAzLAorCTB4NDAsMHg0MywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMCwweDM0LAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDQ0LAorCTB4NDQsMHg0NCwweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9sb2FkX3Nlc3Npb25fcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX2xvYWRfc2Vzc2lvbl9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9tYWNyb19kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDMsMHgwMCwweDM0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzAsMHg3NywweDAzLDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDcsMHg3NywweDcwLDB4MzQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQzLDB4MDcsMHg3NywweDcwLDB4MzQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzAsMHg3NywweDAzLDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDAwLDB4MzQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4MDAsMHgwMCwweDcwLDB4MzQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDMwLDB4NzcsMHg3NywweDc3LDB4MDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDAwLDB4NzcsMHg3NywweDc3LDB4MDAsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQzLDB4MDAsMHgwMCwweDc3LDB4MzAsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzAsMHgwMCwweDc3LDB4NzAsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDAsMHg3NywweDc3LDB4NzAsMHgwNCwweDQ0LDB4NDQsCisJMHg0NCwweDQzLDB4MDcsMHg3NywweDc3LDB4NzcsMHgwMCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3MCwweDAwLDB4NzcsMHg3MCwweDA0LDB4NDQsCisJMHg0NCwweDA3LDB4NzcsMHgwMywweDQwLDB4MDcsMHg3NywweDcwLDB4NDQsCisJMHg0NCwweDA3LDB4NzAsMHgzNCwweDQ0LDB4MzAsMHg3NywweDcwLDB4NDQsCisJMHg0NCwweDMwLDB4MDAsMHg0NCwweDQ0LDB4NDMsMHgwMCwweDAzLDB4NDQsCisJMHg0NCwweDQzLDB4MzQsMHg0NCwweDQ0LDB4NDQsMHg0MywweDA0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX21hY3JvX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9tYWNyb19kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9tYWtlX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDQwLDB4MDAsMHgwMCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDA3LDB4NzcsMHg3NywweDA0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDcwLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3MywweDA3LDB4NzcsMHg3MCwweDA3LDB4MDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDQwLDB4MDAsMHgwMywweDQwLDB4MDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwNCwweDQ0LDB4MDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDAsMHgwMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDMsMHgzMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfbWFrZV9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfbWFrZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9tYXhpbWl6ZV9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg3NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDcsMHg3NCwweDA0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0MCwweDAwLDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHgwMCwweDAwLDB4MDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHgwMCwweDAwLDB4MDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0MCwweDAwLDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDA0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDMsMHgzMywweDMzLDB4MzMsMHgzMywweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX21heGltaXplX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9tYXhpbWl6ZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9tYXh3aWR0aF9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg3MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsCisJMHg3MCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDQsCisJMHg3MCwweDQ0LDB4NzQsMHg0MCwweDQ0LDB4MDQsMHg0NCwweDQ3LDB4MDMsCisJMHg3MCwweDQ3LDB4NzQsMHgwMCwweDQ0LDB4MDAsMHg0NCwweDQ3LDB4MDMsCisJMHg3MCwweDQ0LDB4NDAsMHgwMCwweDQ0LDB4MDAsMHgwNCwweDQ3LDB4MDMsCisJMHg3MCwweDQ0LDB4NDQsMHgwMCwweDQ0LDB4MDAsMHg0NCwweDQ3LDB4MDMsCisJMHg3MCwweDQ0LDB4NDQsMHg0MCwweDQ0LDB4MDQsMHg0NCwweDQ3LDB4MDMsCisJMHg3MCwweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4MDMsCisJMHg3MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsCisJMHg0NCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX21heHdpZHRoX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9tYXh3aWR0aF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9taW5pbWl6ZV9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDAwLDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0MCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDQsCisJMHg0NywweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NywweDA0LDB4NDQsCisJMHg0NywweDA0LDB4NDcsMHg0NCwweDQ0LDB4NDQsMHg0NywweDAzLDB4NDQsCisJMHg0NywweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NywweDAzLDB4NDQsCisJMHg0NywweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3NywweDAzLDB4NDQsCisJMHg0NywweDA3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDAzLDB4NDQsCisJMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NDQsCisJMHg0NCwweDQ0LDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0MCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDAwLDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX21pbmltaXplX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9taW5pbWl6ZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9taW53aWR0aF9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDcsMHgwMCwweDAwLDB4MDAsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDcsMHgwNCwweDQ0LDB4NzAsMHg0NCwweDQ0LDB4NDQsCisJMHg0MCwweDQ0LDB4NDcsMHgwNCwweDc0LDB4NzAsMHgzNCwweDQ0LDB4MDQsCisJMHg0MCwweDA0LDB4NDcsMHgwNCwweDQ0LDB4NzAsMHgzNCwweDQwLDB4MDQsCisJMHg0MCwweDAwLDB4NDcsMHgwNCwweDQ0LDB4NzAsMHgzNCwweDAwLDB4MDQsCisJMHg0MCwweDA0LDB4NDcsMHgwNCwweDQ0LDB4NzAsMHgzNCwweDQwLDB4MDQsCisJMHg0MCwweDQ0LDB4NDcsMHgwNCwweDQ0LDB4NzAsMHgzNCwweDQ0LDB4MDQsCisJMHg0NCwweDQ0LDB4NDcsMHgwNywweDc3LDB4NzAsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDcsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMzLDB4MzMsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX21pbndpZHRoX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9taW53aWR0aF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9uZXdfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0MywweDQ0LDB4MzcsMHgzNCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NywweDM0LDB4MzcsMHgzNCwweDczLAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDczLDB4MDcsMHgwNywweDM3LAorCTB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4NzcsMHg3MCwweDMzLAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDc3LDB4NzcsMHg3NywweDc3LAorCTB4NDAsMHg0NCwweDc0LDB4NDQsMHg0NCwweDA3LDB4MDcsMHg3MCwweDMzLAorCTB4NDAsMHg0NywweDc0LDB4NDQsMHg0MywweDQ3LDB4MDcsMHgwNywweDQ0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHgzNCwweDQ3LDB4MDcsMHgzMywweDc0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDcsMHgzNCwweDM3LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQzLAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4MDMsMHg0NCwweDQ0LAorCTB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9uZXdfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX25ld19kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9uZXdfc2Vzc2lvbl9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4MzQsMHg0MywweDczLDB4NDQsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDMsMHg0MCwweDcwLDB4NDMsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzMsMHgwNywweDc3LDB4MDMsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzMsMHgwNywweDc3LDB4MDMsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDMsMHg0MCwweDcwLDB4NDMsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MzQsMHg0MywweDczLDB4NDQsMHgzNCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDM0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsCisJMHg0NCwweDA3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NCwweDQzLDB4MDQsCisJMHg0MCwweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDMzLDB4MDQsCisJMHg0MCwweDc0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg1NSwweDMzLDB4MDQsCisJMHg0MCwweDc0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMzLDB4MDQsCisJMHg0MCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDMzLDB4MDMsCisJMHg0MCwweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NCwweDMzLDB4MDMsCisJMHg0MCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMwLDB4MzQsCisJMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NDQsCisJMHg0NCwweDQ0LDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDM0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX25ld19zZXNzaW9uX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9uZXdfc2Vzc2lvbl9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9vcGVuX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwNywweDc3LDB4NzcsMHg3MCwweDcwLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwNywweDc3LDB4NzcsMHg3MCwweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDQsMHgwNywweDc3LDB4NzcsMHg3MCwweDAwLDB4MDMsMHg0NCwKKwkweDQ0LDB4MDAsMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4MDAsMHgwNCwKKwkweDQ0LDB4MDQsMHgwNCwweDQ0LDB4NDQsMHg0NCwweDQ3LDB4MDQsMHgwNCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDMsMHgwMywKKwkweDA3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDcwLDB4MDMsMHgwMywKKwkweDQwLDB4NzQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQzLDB4MDMsMHgwMywKKwkweDQwLDB4NzQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDMsMHgwMywKKwkweDQ0LDB4MDcsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MzAsMHgwMywKKwkweDQ0LDB4MDcsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDAsMHgwMywKKwkweDQ0LDB4NDAsMHg3MywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgwMywKKwkweDQ0LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywKKwkweDQ0LDB4NDQsMHg0MywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfb3Blbl9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfb3Blbl9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9wYXN0ZV9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDA0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDAwLDB4MDQsMHg0NCwweDQwLDB4MDAsMHgzNCwweDQ0LDB4NDQsCisJMHg0MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgwMywweDQ0LDB4NDQsCisJMHg0MCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgwMywweDQ0LDB4NDQsCisJMHg0MCwweDQzLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDAwLDB4MDAsMHgwMCwweDcwLDB4MzQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MzQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MzQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDAwLDB4MDAsMHgwMCwweDcwLDB4MzQsCisJMHg0MCwweDQzLDB4MzQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MzQsCisJMHg0NCwweDAwLDB4MDAsMHgwNywweDAwLDB4NzcsMHg3NywweDcwLDB4MzQsCisJMHg0NCwweDQzLDB4MzMsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MzQsCisJMHg0NCwweDQ0LDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMzLDB4MzMsMHgzMywweDMzLDB4MzQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX3Bhc3RlX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9wYXN0ZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9wcmludF9kYXRhW10gPSB7CisJMHg0NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHgwNCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzAsMHgwMCwweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzAsMHgwMCwweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzAsMHgwMCwweDAwLDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NzcsMHg3NywweDc3LDB4NzcsMHgwMywweDQ0LDB4NDQsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsCisJMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHg3NywweDMwLDB4NDQsCisJMHgwNywweDU1LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMwLDB4MzQsCisJMHgwNywweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMwLDB4MzQsCisJMHgwNywweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDMwLDB4MzQsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsCisJMHg0MCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDAzLDB4MzQsCisJMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NDQsCisJMHg0NCwweDQzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX3ByaW50X3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9wcmludF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9yZWRvX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDAwLDB4MDAsMHgwNCwweDQwLDB4MDQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDc3LDB4NzcsMHg3MCwweDA3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDAwLDB4MDAsMHg3NywweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4MDcsMHg3MCwweDMzLDB4MzAsMHg3NywweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4MDcsMHg3MCwweDM0LDB4MDcsMHg3NywweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4MDcsMHg3MCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDMsMHg0NCwKKwkweDQ0LDB4MDcsMHg3MCwweDM0LDB4NDMsMHgzMywweDAzLDB4MzMsMHg0NCwKKwkweDQ0LDB4MDcsMHg3MCwweDM0LDB4NDQsMHg0MCwweDcwLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDAwLDB4MDAsMHgwNywweDcwLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDAzLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDQsMHgwMCwweDc3LDB4NzcsMHg3MCwweDMzLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDAwLDB4MDAsMHgwMywweDM0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQzLDB4MzMsMHgzMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfcmVkb19waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfcmVkb19kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9yZXBsYWNlX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDc3LDB4NzcsMHgwMCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDcsMHgwMCwweDc3LDB4NzcsMHgwNywweDA0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MzQsMHgwMCwweDM3LDB4NzcsMHgwMCwweDAwLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDAsMHg3MCwweDA3LDB4NzcsMHg3NywweDcwLDB4NDQsMHg0NCwKKwkweDQ0LDB4MzAsMHgwMCwweDAzLDB4NzcsMHg3NywweDcwLDB4MzQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDAwLDB4NzcsMHg3NywweDcwLDB4MzQsMHg0NCwKKwkweDQwLDB4MDMsMHg3MywweDAwLDB4MDcsMHg3NywweDQwLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDcsMHg3NywweDc3LDB4NzcsMHg3NywweDc0LDB4MzQsMHg0NCwKKwkweDQ0LDB4MDcsMHg1NSwweDQ0LDB4NTcsMHg3NywweDAwLDB4MDAsMHg0NCwKKwkweDQ0LDB4MDcsMHgzNSwweDQ0LDB4NTUsMHg3NywweDAzLDB4NzAsMHgwNCwKKwkweDQ0LDB4MDcsMHg3MywweDU1LDB4NTUsMHg1NywweDAwLDB4MDAsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDc3LDB4NTUsMHg3NywweDAzLDB4NzAsMHgwNCwKKwkweDQ0LDB4MDcsMHg3NywweDc3LDB4NTcsMHg3NywweDAzLDB4NzAsMHgwNCwKKwkweDQ0LDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwNCwweDAwLDB4MDAsMHg0NCwKKwkweDQ0LDB4NDQsMHg0MywweDMzLDB4MzMsMHgzMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfcmVwbGFjZV9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfcmVwbGFjZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9zYXZlX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDAsMHg0NCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MDAsMHgzNCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0MCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0MCwweDAwLDB4MDAsMHgwNCwweDQwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0MCwweDAwLDB4MDAsMHgwNCwweDQwLDB4NDAsMHgzNCwKKwkweDQ0LDB4MDQsMHg0MCwweDAwLDB4MDAsMHgwNCwweDQwLDB4NDAsMHgzNCwKKwkweDQ0LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwKKwkweDQ0LDB4NDQsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfc2F2ZV9waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfc2F2ZV9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9zYXZlX2FsbF9kYXRhW10gPSB7CisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4NDQsCisJMHgwNCwweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHg3MCwweDQ0LDB4NDQsCisJMHgwNCwweDA3LDB4NzcsMHg3NywweDc3LDB4NzAsMHgwMCwweDM0LDB4NDQsCisJMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsCisJMHgwNCwweDAwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDA3LDB4MDQsCisJMHgwNCwweDAwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDAwLDB4MDMsCisJMHgwNCwweDAwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4MDMsCisJMHgwNCwweDQwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4MDMsCisJMHgwNCwweDQwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4MDMsCisJMHgwNCwweDQwLDB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDA0LDB4MDMsCisJMHgwNCwweDQwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MDMsCisJMHgwNCwweDQwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDMsCisJMHgwNCwweDQwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDMsCisJMHg0MCwweDAwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHg3NywweDA0LDB4MDMsCisJMHg0NCwweDMwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHg3NywweDA0LDB4MDMsCisJMHg0NCwweDQwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHg3NywweDA0LDB4MDMsCisJMHg0NCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsCisJMHg0NCwweDQ0LDB4NDMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX3NhdmVfYWxsX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9zYXZlX2FsbF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9zYXZlX3Nlc3Npb25fZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHgxMSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQxLDB4MTEsMHg1NSwweDExLDB4MTQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4MTUsMHg1NSwweDUxLDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDEsMHg1NSwweDE0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHgxMSwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDQsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LAorCTB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDc3LDB4NzQsMHg0MywweDA0LAorCTB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4NzcsMHgzMywweDA0LAorCTB4NDAsMHg3NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NTUsMHgzMywweDA0LAorCTB4NDAsMHg3NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHgzMywweDA0LAorCTB4NDAsMHg3MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgzMywweDAzLAorCTB4NDAsMHg3NywweDc3LDB4NzcsMHg3NywweDc3LDB4NzQsMHgzMywweDAzLAorCTB4NDAsMHg0MywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMCwweDM0LAorCTB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDQ0LAorCTB4NDQsMHg0NCwweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzNCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl9zYXZlX3Nlc3Npb25fcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX3NhdmVfc2Vzc2lvbl9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9zaGVsbF9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDAsMHgwMCwweDQwLDB4MDAsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDMsMHg0MywweDMzLDB4NDMsMHgwNCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4NDcsMHg0MywweDAzLDB4NDcsMHg0MCwweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4MzQsMHg3NCwweDM0LDB4NzQsMHgzMCwweDQ0LDB4NDQsCisJMHg0NCwweDAzLDB4NDQsMHg0NCwweDA0LDB4NDQsMHg0MywweDA0LDB4NDQsCisJMHg0MCwweDM0LDB4MDMsMHg3NCwweDM0LDB4NzMsMHgwNCwweDMwLDB4NDQsCisJMHg0MCwweDQ0LDB4NDMsMHg3NCwweDA0LDB4NzMsMHg0NCwweDQwLDB4NDQsCisJMHg0MCwweDQ3LDB4NDAsMHgzNywweDM3LDB4MzAsMHg0NywweDQwLDB4MzQsCisJMHg0MCwweDM0LDB4NzQsMHgwNCwweDA0LDB4MDQsMHg3NCwweDMwLDB4MzQsCisJMHg0NCwweDAzLDB4NzQsMHgzNCwweDQ0LDB4MzQsMHg3MywweDAzLDB4NDQsCisJMHg0NCwweDQwLDB4MzQsMHg0NCwweDc0LDB4NDQsMHgzMCwweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDQsMHg0NywweDc3LDB4NDQsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQ0LDB4MDAsMHgzNCwweDQ0LDB4MzAsMHgwMywweDQ0LDB4NDQsCisJMHg0NCwweDQwLDB4MzQsMHg0NCwweDQ0LDB4NDQsMHgzMCwweDM0LDB4NDQsCisJMHg0NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDMsMHgzMywweDMzLDB4MzMsMHgzMywweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX3NoZWxsX3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9zaGVsbF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl9zcGxpdF9kYXRhW10gPSB7CisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDQ0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg3NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDcsMHg3NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4MzMsMHgzMywweDMzLDB4MzMsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg3NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDcsMHg3NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4NzcsMHg3NywweDc3LDB4NzcsMHg3MCwweDM0LDB4NDQsCisJMHg0NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDMsMHgzMywweDMzLDB4MzMsMHgzMywweDM0LDB4NDQsCisJMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsCit9OworCitzdGF0aWMgUGhJbWFnZV90IHRiX3NwbGl0X3BoaSA9IHsKKwlQZ19JTUFHRV9QQUxFVFRFX05JQkJMRSwKKwkwLAorCTksCisJeyAxOCwxOCB9LAorCTQyMDM5Mzk5MiwKKwk4LAorCU5VTEwsCisJUGdHcmV5KDB4YzApLAorCTAsCisJUGhfVVNFX1RSQU5TUEFSRU5DWSwKKwkwLAorCTAsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJdGJfcGFsZXR0ZSwKKwl0Yl9zcGxpdF9kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl91bmRvX2RhdGFbXSA9IHsKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDAsMHg0NCwweDAwLDB4MDAsMHgwNCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDcsMHgwMCwweDc3LDB4NzcsMHg3MCwweDA0LDB4NDQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDc3LDB4NzcsMHg3NywweDcwLDB4NDQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDcwLDB4MDAsMHgwNywweDcwLDB4MzQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDcwLDB4MzMsMHgzMCwweDc3LDB4MDQsMHg0NCwKKwkweDQ0LDB4MDcsMHg3NywweDc3LDB4MDQsMHg0MCwweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDMsMHg0MCwweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDMsMHgwMywweDMzLDB4MzMsMHg0MCwweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDAsMHg3MCwweDQ0LDB4NDQsMHg0MCwweDc3LDB4MDMsMHg0NCwKKwkweDQ0LDB4NDAsMHg3NywweDAwLDB4MDAsMHgwNywweDcwLDB4MzMsMHg0NCwKKwkweDQ0LDB4NDQsMHgwNywweDc3LDB4NzcsMHg3NywweDcwLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0MCwweDc3LDB4NzcsMHg3MCwweDAzLDB4MzQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDAwLDB4MDAsMHgwMywweDMzLDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQzLDB4MzMsMHgzMywweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwKK307CisKK3N0YXRpYyBQaEltYWdlX3QgdGJfdW5kb19waGkgPSB7CisJUGdfSU1BR0VfUEFMRVRURV9OSUJCTEUsCisJMCwKKwk5LAorCXsgMTgsMTggfSwKKwk0MjAzOTM5OTIsCisJOCwKKwlOVUxMLAorCVBnR3JleSgweGMwKSwKKwkwLAorCVBoX1VTRV9UUkFOU1BBUkVOQ1ksCisJMCwKKwkwLAorCU5VTEwsCisJMCwKKwlOVUxMLAorCXRiX3BhbGV0dGUsCisJdGJfdW5kb19kYXRhCit9OworCitzdGF0aWMgdWludDhfdCB0Yl92c3BsaXRfZGF0YVtdID0geworCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorCTB4NDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDQ0LAorCTB4NDcsMHgwNCwweDQ3LDB4NDcsMHgwMywweDQ0LDB4NzQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDc3LDB4NDcsMHgwMywweDQ3LDB4NzQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNCwweDQ0LDB4NDcsMHgwMywweDQ0LDB4NDQsMHg3MCwweDM0LAorCTB4NDcsMHgwNywweDc3LDB4NzcsMHgwNywweDc3LDB4NzcsMHg3MCwweDM0LAorCTB4NDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LAorCTB4NDQsMHg0NCwweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDM0LAorCTB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LDB4NDQsMHg0NCwweDQ0LAorfTsKKworc3RhdGljIFBoSW1hZ2VfdCB0Yl92c3BsaXRfcGhpID0geworCVBnX0lNQUdFX1BBTEVUVEVfTklCQkxFLAorCTAsCisJOSwKKwl7IDE4LDE4IH0sCisJNDIwMzkzOTkyLAorCTgsCisJTlVMTCwKKwlQZ0dyZXkoMHhjMCksCisJMCwKKwlQaF9VU0VfVFJBTlNQQVJFTkNZLAorCTAsCisJMCwKKwlOVUxMLAorCTAsCisJTlVMTCwKKwl0Yl9wYWxldHRlLAorCXRiX3ZzcGxpdF9kYXRhCit9OwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xjaGVjayBiL3NyYy90b29sY2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjA1MTE4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90b29sY2hlY2sKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIHRvb2xjaGVjayAtLSBjaGVjayBmb3IgdG9vbHMgdGhhdCBoYXZlIHNldmVyZSBidWdzLiBHb29kIHRoYXQgYWxsIHRoZSBidWdneQorIwkgICAgICAgdG9vbHMgaWRlbnRpZnkgYnkgdmVyc2lvbiBudW1iZXJzLiBUaGlzIGlzIHRoZSBzcGlyaXQgb2YgR05VIDotKQorIworIyAyNC43Ljk1IGp3LgorCityZXR2YWw9MAorcmVwbHk9ImBzaCAtdmVyc2lvbiAtYyBleGl0IDI+JjEgPCAvZGV2L251bGxgIgorY2FzZSAiJHJlcGx5IiBpbgorCUdOVSoxLjE0LjMqKQorCQllY2hvICItIHNoIGlzCSckcmVwbHknIjsKKwkJZWNobyAiICBDQVVUSU9OOiBUaGlzIHNoZWxsIGhhcyBhIGJ1Z2d5ICd0cmFwJyBjb21tYW5kLiI7CisJCWVjaG8gIiAgICAgICAgICAgVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbWF5IGZhaWwgc2lsZW50bHkuIjsKKwkJcmV0dmFsPTE7CisJCTs7CisJR05VKikKKwkJZWNobyAiLSBzaCBpcwknJHJlcGx5JyAtIHByb2JhYmx5IE9LLiI7CisJCTs7CisJKikJOzsKK2VzYWMKKworcmVwbHk9ImBzZWQgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGxgIgorY2FzZSAiJHJlcGx5IiBpbgorCUdOVVwgc2VkXCB2ZXJzaW9uXCAyLjBbMzRdKQorCQllY2hvICItIHNlZCBpcwknJHJlcGx5JyI7CisJCWVjaG8gIiAgQ0FVVElPTjogVGhpcyBzZWQgY2Fubm90IGNvbmZpZ3VyZSBzY3JlZW4gcHJvcGVybHkuIgorCQlyZXR2YWw9MTsKKwkJOzsKKwlHTlVcIHNlZFwgdmVyc2lvblwgMi4wNXxHTlVcIHNlZFwgdmVyc2lvblwgMi4wM1wga2V2aW4pCisJCWVjaG8gIi0gc2VkIGlzCSckcmVwbHknIC0gZ29vZC4iOworCQk7OworCUdOVSopCWVjaG8gIi0gc2VkIGlzCSckcmVwbHknLiI7CisJCTs7CisJKikJOzsKK2VzYWMKK2V4aXQgJHJldHZhbApkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzLmJtcCBiL3NyYy90b29scy5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1MjBjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90b29scy5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzMTYuYm1wIGIvc3JjL3Rvb2xzMTYuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmJjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdG9vbHMxNi5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3R5cGVtYXAgYi9zcmMvdHlwZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA0OTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGVtYXAKQEAgLTAsMCArMSwxNCBAQAorVFlQRU1BUAorVklXSU4JVF9WSU9CSk5PTVVOR0UKK1ZJQlVGCVRfVklPQkpOT01VTkdFCisKK0lOUFVUCitUX1ZJT0JKTk9NVU5HRQorCWlmIChzdl9pc2EoJGFyZywgXCIke250eXBlfVwiKSkgeworCSAgICBJViB0bXAgPSBTdklWKChTViopU3ZSVigkYXJnKSk7CisJICAgICR2YXIgPSAoJHR5cGUpIHRtcDsKKwkgICAgaWYgKCF0bXApCisJCWNyb2FrKFwiJG50eXBlIG5vIGxvbmdlciBleGlzdHNcIik7CisJfQorCWVsc2UKKwkgICAgY3JvYWsoXCIkdmFyIGlzIG5vdCBvZiB0eXBlICR7bnR5cGV9XCIpCmRpZmYgLS1naXQgYS9zcmMvdWkuYyBiL3NyYy91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmY4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdWkuYwpAQCAtMCwwICsxLDMwNjAgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIHVpLmM6IGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgdXNlciBpbnRlcmZhY2UuCisgKiAxLiBLZXlib2FyZCBpbnB1dCBzdHVmZiwgYW5kIGEgYml0IG9mIHdpbmRvd2luZyBzdHVmZi4gIFRoZXNlIGFyZSBjYWxsZWQKKyAqICAgIGJlZm9yZSB0aGUgbWFjaGluZSBzcGVjaWZpYyBzdHVmZiAobWNoXyopIHNvIHRoYXQgd2UgY2FuIGNhbGwgdGhlIEdVSQorICogICAgc3R1ZmYgaW5zdGVhZCBpZiB0aGUgR1VJIGlzIHJ1bm5pbmcuCisgKiAyLiBDbGlwYm9hcmQgc3R1ZmYuCisgKiAzLiBJbnB1dCBidWZmZXIgc3R1ZmYuCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCisgICAgdm9pZAordWlfd3JpdGUocywgbGVuKQorICAgIGNoYXJfdSAgKnM7CisgICAgaW50CSAgICBsZW47Cit7CisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSAmJiAhZ3VpLmR5aW5nICYmICFndWkuc3RhcnRpbmcpCisgICAgeworCWd1aV93cml0ZShzLCBsZW4pOworCWlmIChwX3dkKQorCSAgICBndWlfd2FpdF9mb3JfY2hhcnMocF93ZCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmbmRlZiBOT19DT05TT0xFCisgICAgLyogRG9uJ3Qgb3V0cHV0IGFueXRoaW5nIGluIHNpbGVudCBtb2RlICgiZXggLXMiKSB1bmxlc3MgJ3ZlcmJvc2UnIHNldCAqLworICAgIGlmICghKHNpbGVudF9tb2RlICYmIHBfdmVyYm9zZSA9PSAwKSkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWNoYXJfdQkqdG9mcmVlID0gTlVMTDsKKworCWlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwl7CisJICAgIC8qIENvbnZlcnQgY2hhcmFjdGVycyBmcm9tICdlbmNvZGluZycgdG8gJ3Rlcm1lbmNvZGluZycuICovCisJICAgIHRvZnJlZSA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgcywgJmxlbik7CisJICAgIGlmICh0b2ZyZWUgIT0gTlVMTCkKKwkJcyA9IHRvZnJlZTsKKwl9CisjZW5kaWYKKworCW1jaF93cml0ZShzLCBsZW4pOworCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKKwkgICAgdmltX2ZyZWUodG9mcmVlKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorfQorCisjaWYgKGRlZmluZWQoRkVBVF9HVUkpICYmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSkpIFwKKwl8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBXaGVuIGV4ZWN1dGluZyBhbiBleHRlcm5hbCBwcm9ncmFtLCB0aGVyZSBtYXkgYmUgc29tZSB0eXBlZCBjaGFyYWN0ZXJzIHRoYXQKKyAqIGFyZSBub3QgY29uc3VtZWQgYnkgaXQuICBHaXZlIHRoZW0gYmFjayB0byB1aV9pbmNoYXIoKSBhbmQgdGhleSBhcmUgc3RvcmVkCisgKiBoZXJlIGZvciB0aGUgbmV4dCBjYWxsLgorICovCitzdGF0aWMgY2hhcl91ICp0YV9zdHIgPSBOVUxMOworc3RhdGljIGludCB0YV9vZmY7CS8qIG9mZnNldCBmb3IgbmV4dCBjaGFyIHRvIHVzZSB3aGVuIHRhX3N0ciAhPSBOVUxMICovCitzdGF0aWMgaW50IHRhX2xlbjsJLyogbGVuZ3RoIG9mIHRhX3N0ciB3aGVuIGl0J3Mgbm90IE5VTEwqLworCisgICAgdm9pZAordWlfaW5jaGFyX3VuZG8ocywgbGVuKQorICAgIGNoYXJfdQkqczsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBjaGFyX3UgICpuZXc7CisgICAgaW50CSAgICBuZXdsZW47CisKKyAgICBuZXdsZW4gPSBsZW47CisgICAgaWYgKHRhX3N0ciAhPSBOVUxMKQorCW5ld2xlbiArPSB0YV9sZW4gLSB0YV9vZmY7CisgICAgbmV3ID0gYWxsb2MobmV3bGVuKTsKKyAgICBpZiAobmV3ICE9IE5VTEwpCisgICAgeworCWlmICh0YV9zdHIgIT0gTlVMTCkKKwl7CisJICAgIG1jaF9tZW1tb3ZlKG5ldywgdGFfc3RyICsgdGFfb2ZmLCAoc2l6ZV90KSh0YV9sZW4gLSB0YV9vZmYpKTsKKwkgICAgbWNoX21lbW1vdmUobmV3ICsgdGFfbGVuIC0gdGFfb2ZmLCBzLCAoc2l6ZV90KWxlbik7CisJICAgIHZpbV9mcmVlKHRhX3N0cik7CisJfQorCWVsc2UKKwkgICAgbWNoX21lbW1vdmUobmV3LCBzLCAoc2l6ZV90KWxlbik7CisJdGFfc3RyID0gbmV3OworCXRhX2xlbiA9IG5ld2xlbjsKKwl0YV9vZmYgPSAwOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogdWlfaW5jaGFyKCk6IGxvdyBsZXZlbCBpbnB1dCBmdW5jaW9uLgorICogR2V0IGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZS4KKyAqIElmICJ3dGltZSIgPT0gMCBkbyBub3Qgd2FpdCBmb3IgY2hhcmFjdGVycy4KKyAqIElmICJ3dGltZSIgPT0gLTEgd2FpdCBmb3JldmVyIGZvciBjaGFyYWN0ZXJzLgorICogSWYgInd0aW1lIiA+IDAgd2FpdCAid3RpbWUiIG1pbGxpc2Vjb25kcyBmb3IgYSBjaGFyYWN0ZXIuCisgKgorICogInRiX2NoYW5nZV9jbnQiIGlzIHRoZSB2YWx1ZSBvZiB0eXBlYnVmLnRiX2NoYW5nZV9jbnQgaWYgImJ1ZiIgcG9pbnRzIGludG8KKyAqIGl0LiAgV2hlbiB0eXBlYnVmLnRiX2NoYW5nZV9jbnQgY2hhbmdlcyAoZS5nLiwgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQKKyAqIGZyb20gYSByZW1vdGUgY2xpZW50KSAiYnVmIiBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICAidGJfY2hhbmdlX2NudCIgaXMgTlVMTAorICogb3RoZXJ3aXNlLgorICovCisgICAgaW50Cit1aV9pbmNoYXIoYnVmLCBtYXhsZW4sIHd0aW1lLCB0Yl9jaGFuZ2VfY250KQorICAgIGNoYXJfdQkqYnVmOworICAgIGludAkJbWF4bGVuOworICAgIGxvbmcJd3RpbWU7CSAgICAvKiBkb24ndCB1c2UgInRpbWUiLCBNSVBTIGNhbm5vdCBoYW5kbGUgaXQgKi8KKyAgICBpbnQJCXRiX2NoYW5nZV9jbnQ7Cit7CisgICAgaW50CQlyZXR2YWwgPSAwOworCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpKQorICAgIC8qCisgICAgICogVXNlIHRoZSB0eXBlYWhlYWQgaWYgdGhlcmUgaXMgYW55LgorICAgICAqLworICAgIGlmICh0YV9zdHIgIT0gTlVMTCkKKyAgICB7CisJaWYgKG1heGxlbiA+PSB0YV9sZW4gLSB0YV9vZmYpCisJeworCSAgICBtY2hfbWVtbW92ZShidWYsIHRhX3N0ciArIHRhX29mZiwgKHNpemVfdCl0YV9sZW4pOworCSAgICB2aW1fZnJlZSh0YV9zdHIpOworCSAgICB0YV9zdHIgPSBOVUxMOworCSAgICByZXR1cm4gdGFfbGVuOworCX0KKwltY2hfbWVtbW92ZShidWYsIHRhX3N0ciArIHRhX29mZiwgKHNpemVfdCltYXhsZW4pOworCXRhX29mZiArPSBtYXhsZW47CisJcmV0dXJuIG1heGxlbjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIE5PX0NPTlNPTEVfSU5QVVQKKyAgICAvKiBEb24ndCB3YWl0IGZvciBjaGFyYWN0ZXIgaW5wdXQgd2hlbiB0aGUgd2luZG93IGhhc24ndCBiZWVuIG9wZW5lZCB5ZXQuCisgICAgICogRG8gdHJ5IHJlYWRpbmcsIHRoaXMgd29ya3Mgd2hlbiByZWRpcmVjdGluZyBzdGRpbiBmcm9tIGEgZmlsZS4KKyAgICAgKiBNdXN0IHJldHVybiBzb21ldGhpbmcsIG90aGVyd2lzZSB3ZSdsbCBsb29wIGZvcmV2ZXIuICBJZiB3ZSBydW4gaW50bworICAgICAqIHRoaXMgdmVyeSBvZnRlbiB3ZSBwcm9iYWJseSBnb3Qgc3R1Y2ssIGV4aXQgVmltLiAqLworICAgIGlmIChub19jb25zb2xlX2lucHV0KCkpCisgICAgeworCXN0YXRpYyBpbnQgY291bnQgPSAwOworCisjIGlmbmRlZiBOT19DT05TT0xFCisJcmV0dmFsID0gbWNoX2luY2hhcihidWYsIG1heGxlbiwgMTBMLCB0Yl9jaGFuZ2VfY250KTsKKwlpZiAocmV0dmFsID4gMCB8fCB0eXBlYnVmX2NoYW5nZWQodGJfY2hhbmdlX2NudCkpCisJICAgIHJldHVybiByZXR2YWw7CisjIGVuZGlmCisJaWYgKHd0aW1lID09IC0xICYmICsrY291bnQgPT0gMTAwMCkKKwkgICAgcmVhZF9lcnJvcl9leGl0KCk7CisJYnVmWzBdID0gQ0FSOworCXJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgLyogV2hlbiBkb2luZyBhIGJsb2NraW5nIHdhaXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgQ1RSTC1DIHRvIGludGVycnVwdAorICAgICAqIHNvbWV0aGluZywgZG9uJ3QgbGV0IGl0IHNldCBnb3RfaW50IHdoZW4gaXQgd2FzIG1hcHBlZC4gKi8KKyAgICBpZiAobWFwcGVkX2N0cmxfYyAmJiAod3RpbWUgPT0gLTEgfHwgd3RpbWUgPiAxMDBMKSkKKwljdHJsX2NfaW50ZXJydXB0cyA9IEZBTFNFOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkKKyAgICB7CisJaWYgKGd1aV93YWl0X2Zvcl9jaGFycyh3dGltZSkgJiYgIXR5cGVidWZfY2hhbmdlZCh0Yl9jaGFuZ2VfY250KSkKKwkgICAgcmV0dmFsID0gcmVhZF9mcm9tX2lucHV0X2J1ZihidWYsIChsb25nKW1heGxlbik7CisgICAgfQorI2VuZGlmCisjaWZuZGVmIE5PX0NPTlNPTEUKKyMgaWZkZWYgRkVBVF9HVUkKKyAgICBlbHNlCisjIGVuZGlmCisJcmV0dmFsID0gbWNoX2luY2hhcihidWYsIG1heGxlbiwgd3RpbWUsIHRiX2NoYW5nZV9jbnQpOworI2VuZGlmCisKKyAgICBjdHJsX2NfaW50ZXJydXB0cyA9IFRSVUU7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogcmV0dXJuIG5vbi16ZXJvIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZQorICovCisgICAgaW50Cit1aV9jaGFyX2F2YWlsKCkKK3sKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorICAgIHsKKwlndWlfbWNoX3VwZGF0ZSgpOworCXJldHVybiBpbnB1dF9hdmFpbGFibGUoKTsKKyAgICB9CisjZW5kaWYKKyNpZm5kZWYgTk9fQ09OU09MRQorIyBpZmRlZiBOT19DT05TT0xFX0lOUFVUCisgICAgaWYgKG5vX2NvbnNvbGVfaW5wdXQoKSkKKwlyZXR1cm4gMDsKKyMgZW5kaWYKKyAgICByZXR1cm4gbWNoX2NoYXJfYXZhaWwoKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoKKyAqIERlbGF5IGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4JSWYgaWdub3JlaW5wdXQgaXMgRkFMU0UgdGhlbiB3ZQorICogY2FuY2VsIHRoZSBkZWxheSBpZiBhIGtleSBpcyBoaXQuCisgKi8KKyAgICB2b2lkCit1aV9kZWxheShtc2VjLCBpZ25vcmVpbnB1dCkKKyAgICBsb25nCW1zZWM7CisgICAgaW50CQlpZ25vcmVpbnB1dDsKK3sKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlICYmICFpZ25vcmVpbnB1dCkKKwlndWlfd2FpdF9mb3JfY2hhcnMobXNlYyk7CisgICAgZWxzZQorI2VuZGlmCisJbWNoX2RlbGF5KG1zZWMsIGlnbm9yZWlucHV0KTsKK30KKworLyoKKyAqIElmIHRoZSBtYWNoaW5lIGhhcyBqb2IgY29udHJvbCwgdXNlIGl0IHRvIHN1c3BlbmQgdGhlIHByb2dyYW0sCisgKiBvdGhlcndpc2UgZmFrZSBpdCBieSBzdGFydGluZyBhIG5ldyBzaGVsbC4KKyAqIFdoZW4gcnVubmluZyB0aGUgR1VJIGljb25pZnkgdGhlIHdpbmRvdy4KKyAqLworICAgIHZvaWQKK3VpX3N1c3BlbmQoKQoreworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCWd1aV9tY2hfaWNvbmlmeSgpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBtY2hfc3VzcGVuZCgpOworfQorCisjaWYgIWRlZmluZWQoVU5JWCkgfHwgIWRlZmluZWQoU0lHVFNUUCkgfHwgZGVmaW5lZChQUk9UTykgfHwgZGVmaW5lZChfX0JFT1NfXykKKy8qCisgKiBXaGVuIHRoZSBPUyBjYW4ndCByZWFsbHkgc3VzcGVuZCwgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHN0YXJ0IGEgc2hlbGwuCisgKiBUaGlzIGlzIG5ldmVyIGNhbGxlZCBpbiB0aGUgR1VJLgorICovCisgICAgdm9pZAorc3VzcGVuZF9zaGVsbCgpCit7CisgICAgaWYgKCpwX3NoID09IE5VTCkKKwlFTVNHKF8oZV9zaGVsbGVtcHR5KSk7CisgICAgZWxzZQorICAgIHsKKwlNU0dfUFVUUyhfKCJuZXcgc2hlbGwgc3RhcnRlZFxuIikpOworCWRvX3NoZWxsKE5VTEwsIDApOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogVHJ5IHRvIGdldCB0aGUgY3VycmVudCBWaW0gc2hlbGwgc2l6ZS4gIFB1dCB0aGUgcmVzdWx0IGluIFJvd3MgYW5kIENvbHVtbnMuCisgKiBVc2UgdGhlIG5ldyBzaXplcyBhcyBkZWZhdWx0cyBmb3IgJ2NvbHVtbnMnIGFuZCAnbGluZXMnLgorICogUmV0dXJuIE9LIHdoZW4gc2l6ZSBjb3VsZCBiZSBkZXRlcm1pbmVkLCBGQUlMIG90aGVyd2lzZS4KKyAqLworICAgIGludAordWlfZ2V0X3NoZWxsc2l6ZSgpCit7CisgICAgaW50CSAgICByZXR2YWw7CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCXJldHZhbCA9IGd1aV9nZXRfc2hlbGxzaXplKCk7CisgICAgZWxzZQorI2VuZGlmCisJcmV0dmFsID0gbWNoX2dldF9zaGVsbHNpemUoKTsKKworICAgIGNoZWNrX3NoZWxsc2l6ZSgpOworCisgICAgLyogYWRqdXN0IHRoZSBkZWZhdWx0IGZvciAnbGluZXMnIGFuZCAnY29sdW1ucycgKi8KKyAgICBpZiAocmV0dmFsID09IE9LKQorICAgIHsKKwlzZXRfbnVtYmVyX2RlZmF1bHQoImxpbmVzIiwgUm93cyk7CisJc2V0X251bWJlcl9kZWZhdWx0KCJjb2x1bW5zIiwgQ29sdW1ucyk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNpemUgb2YgdGhlIFZpbSBzaGVsbCBhY2NvcmRpbmcgdG8gUm93cyBhbmQgQ29sdW1ucywgaWYgcG9zc2libGUuCisgKiBUaGUgZ3VpX3NldF9zaGVsbHNpemUoKSBvciBtY2hfc2V0X3NoZWxsc2l6ZSgpIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHNldCB0aGUKKyAqIG5ldyBzaXplLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGl0IHdpbGwgYWRqdXN0IFJvd3MgYW5kIENvbHVtbnMuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK3VpX3NldF9zaGVsbHNpemUobXVzdHNldCkKKyAgICBpbnQJCW11c3RzZXQ7CS8qIHNldCBieSB0aGUgdXNlciAqLworeworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJZ3VpX3NldF9zaGVsbHNpemUobXVzdHNldCwKKyMgaWZkZWYgV0lOMzI2NAorCQlUUlVFCisjIGVsc2UKKwkJRkFMU0UKKyMgZW5kaWYKKwkJKTsKKyAgICBlbHNlCisjZW5kaWYKKwltY2hfc2V0X3NoZWxsc2l6ZSgpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gUm93cyBhbmQvb3IgQ29sdW1ucyBjaGFuZ2VkLiAgQWRqdXN0IHNjcm9sbCByZWdpb24gYW5kIG1vdXNlCisgKiByZWdpb24uCisgKi8KKyAgICB2b2lkCit1aV9uZXdfc2hlbGxzaXplKCkKK3sKKyAgICBpZiAoZnVsbF9zY3JlZW4gJiYgIWV4aXRpbmcpCisgICAgeworI2lmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5pbl91c2UpCisJICAgIGd1aV9uZXdfc2hlbGxzaXplKCk7CisJZWxzZQorI2VuZGlmCisJICAgIG1jaF9uZXdfc2hlbGxzaXplKCk7CisgICAgfQorfQorCisgICAgdm9pZAordWlfYnJlYWtjaGVjaygpCit7CisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlndWlfbWNoX3VwZGF0ZSgpOworICAgIGVsc2UKKyNlbmRpZgorCW1jaF9icmVha2NoZWNrKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb25zIGZvciBjb3B5aW5nIGFuZCBwYXN0aW5nIHRleHQgYmV0d2VlbiBhcHBsaWNhdGlvbnMuCisgKiBUaGlzIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBhIEdVSSB2ZXJzaW9uLCBidXQgbWF5IGFsc28gYmUgaW5jbHVkZWQgd2hlbiB0aGUKKyAqIGNsaXBib2FyZCBhbmQgbW91c2UgaXMgYXZhaWxhYmxlIHRvIGEgdGVybWluYWwgdmVyc2lvbiBzdWNoIGFzIHh0ZXJtLgorICogTm90ZTogdGhlcmUgYXJlIHNvbWUgbW9yZSBmdW5jdGlvbnMgaW4gb3BzLmMgdGhhdCBoYW5kbGUgc2VsZWN0aW9uIHN0dWZmLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IHRoZSBtYWpvcml0eSBvZiBmdW5jdGlvbnMgaGVyZSBkZWFsIHdpdGggdGhlIFggJ3ByaW1hcnknCisgKiAodmlzaWJsZSAtIGZvciBWaXN1YWwgbW9kZSB1c2UpIHNlbGVjdGlvbiwgYW5kIG9ubHkgdGhhdC4gVGhlcmUgYXJlIG5vCisgKiB2ZXJzaW9ucyBvZiB0aGVzZSBmb3IgdGhlICdjbGlwYm9hcmQnIHNlbGVjdGlvbiwgYXMgVmlzdWFsIG1vZGUgaGFzIG5vIHVzZQorICogZm9yIHRoZW0uCisgKi8KKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBTZWxlY3Rpb24gc3R1ZmYgdXNpbmcgVmlzdWFsIG1vZGUsIGZvciBjdXR0aW5nIGFuZCBwYXN0aW5nIHRleHQgdG8gb3RoZXIKKyAqIHdpbmRvd3MuCisgKi8KKworLyoKKyAqIENhbGwgdGhpcyB0byBpbml0aWFsaXNlIHRoZSBjbGlwYm9hcmQuICBQYXNzIGl0IEZBTFNFIGlmIHRoZSBjbGlwYm9hcmQgY29kZQorICogaXMgaW5jbHVkZWQsIGJ1dCB0aGUgY2xpcGJvYXJkIGNhbiBub3QgYmUgdXNlZCwgb3IgVFJVRSBpZiB0aGUgY2xpcGJvYXJkIGNhbgorICogYmUgdXNlZC4gIEVnIHVuaXggbWF5IGNhbGwgdGhpcyB3aXRoIEZBTFNFLCB0aGVuIGNhbGwgaXQgYWdhaW4gd2l0aCBUUlVFIGlmCisgKiB0aGUgR1VJIHN0YXJ0cy4KKyAqLworICAgIHZvaWQKK2NsaXBfaW5pdChjYW5fdXNlKQorICAgIGludAkgICAgY2FuX3VzZTsKK3sKKyAgICBWaW1DbGlwYm9hcmQgKmNiOworCisgICAgY2IgPSAmY2xpcF9zdGFyOworICAgIGZvciAoOzspCisgICAgeworCWNiLT5hdmFpbGFibGUgID0gY2FuX3VzZTsKKwljYi0+b3duZWQgICAgICA9IEZBTFNFOworCWNiLT5zdGFydC5sbnVtID0gMDsKKwljYi0+c3RhcnQuY29sICA9IDA7CisJY2ItPmVuZC5sbnVtICAgPSAwOworCWNiLT5lbmQuY29sICAgID0gMDsKKwljYi0+c3RhdGUgICAgICA9IFNFTEVDVF9DTEVBUkVEOworCisJaWYgKGNiID09ICZjbGlwX3BsdXMpCisJICAgIGJyZWFrOworCWNiID0gJmNsaXBfcGx1czsKKyAgICB9Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoZSBWSXN1YWwgYXJlYSBoYXMgY2hhbmdlZCwgYW5kIGlmIHNvIHRyeSB0byBiZWNvbWUgdGhlIG93bmVyCisgKiBvZiB0aGUgc2VsZWN0aW9uLCBhbmQgZnJlZSBhbnkgb2xkIGNvbnZlcnRlZCBzZWxlY3Rpb24gd2UgbWF5IHN0aWxsIGhhdmUKKyAqIGx5aW5nIGFyb3VuZC4gIElmIHRoZSBWSXN1YWwgbW9kZSBoYXMgZW5kZWQsIG1ha2UgYSBjb3B5IG9mIHdoYXQgd2FzCisgKiBzZWxlY3RlZCBzbyB3ZSBjYW4gc3RpbGwgZ2l2ZSBpdCB0byBvdGhlcnMuCVdpbGwgcHJvYmFibHkgaGF2ZSB0byBtYWtlIHN1cmUKKyAqIHRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIFZJc3VhbCBtb2RlIGlzIGVuZGVkLgorICovCisgICAgdm9pZAorY2xpcF91cGRhdGVfc2VsZWN0aW9uKCkKK3sKKyAgICBwb3NfVCAgICBzdGFydCwgZW5kOworCisgICAgLyogSWYgdmlzdWFsIG1vZGUgaXMgb25seSBkdWUgdG8gYSByZWRvIGNvbW1hbmQgKCIuIiksIHRoZW4gaWdub3JlIGl0ICovCisgICAgaWYgKCFyZWRvX1ZJc3VhbF9idXN5ICYmIFZJc3VhbF9hY3RpdmUgJiYgKFN0YXRlICYgTk9STUFMKSkKKyAgICB7CisJaWYgKGx0KFZJc3VhbCwgY3Vyd2luLT53X2N1cnNvcikpCisJeworCSAgICBzdGFydCA9IFZJc3VhbDsKKwkgICAgZW5kID0gY3Vyd2luLT53X2N1cnNvcjsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCWVuZC5jb2wgKz0gKCptYl9wdHIybGVuX2NoZWNrKShtbF9nZXRfY3Vyc29yKCkpIC0gMTsKKyNlbmRpZgorCX0KKwllbHNlCisJeworCSAgICBzdGFydCA9IGN1cndpbi0+d19jdXJzb3I7CisJICAgIGVuZCA9IFZJc3VhbDsKKwl9CisJaWYgKCFlcXVhbHBvcyhjbGlwX3N0YXIuc3RhcnQsIHN0YXJ0KQorCQl8fCAhZXF1YWxwb3MoY2xpcF9zdGFyLmVuZCwgZW5kKQorCQl8fCBjbGlwX3N0YXIudm1vZGUgIT0gVklzdWFsX21vZGUpCisJeworCSAgICBjbGlwX2NsZWFyX3NlbGVjdGlvbigpOworCSAgICBjbGlwX3N0YXIuc3RhcnQgPSBzdGFydDsKKwkgICAgY2xpcF9zdGFyLmVuZCA9IGVuZDsKKwkgICAgY2xpcF9zdGFyLnZtb2RlID0gVklzdWFsX21vZGU7CisJICAgIGNsaXBfZnJlZV9zZWxlY3Rpb24oJmNsaXBfc3Rhcik7CisJICAgIGNsaXBfb3duX3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwkgICAgY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwl9CisgICAgfQorfQorCisgICAgdm9pZAorY2xpcF9vd25fc2VsZWN0aW9uKGNiZCkKKyAgICBWaW1DbGlwYm9hcmQJKmNiZDsKK3sKKyAgICAvKgorICAgICAqIEFsc28gd2FudCB0byBjaGVjayBzb21laG93IHRoYXQgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUga2V5Ym9hcmQgcmF0aGVyCisgICAgICogdGhhbiBhIG1hcHBpbmcgZXRjLgorICAgICAqLworICAgIGlmICghY2JkLT5vd25lZCAmJiBjYmQtPmF2YWlsYWJsZSkKKyAgICB7CisJY2JkLT5vd25lZCA9IChjbGlwX2dlbl9vd25fc2VsZWN0aW9uKGNiZCkgPT0gT0spOworI2lmZGVmIEZFQVRfWDExCisJaWYgKGNiZCA9PSAmY2xpcF9zdGFyKQorCXsKKwkgICAgLyogTWF5IGhhdmUgdG8gc2hvdyBhIGRpZmZlcmVudCBraW5kIG9mIGhpZ2hsaWdodGluZyBmb3IgdGhlIHNlbGVjdGVkCisJICAgICAqIGFyZWEuICBUaGVyZSBpcyBubyBzcGVjaWZpYyByZWRyYXcgY29tbWFuZCBmb3IgdGhpcywganVzdCByZWRyYXcKKwkgICAgICogYWxsIHdpbmRvd3Mgb24gdGhlIGN1cnJlbnQgYnVmZmVyLiAqLworCSAgICBpZiAoY2JkLT5vd25lZAorCQkgICAgJiYgZ2V0X3JlYWxfc3RhdGUoKSA9PSBWSVNVQUwKKwkJICAgICYmIGNsaXBfaXNhdXRvc2VsKCkKKwkJICAgICYmIGhsX2F0dHIoSExGX1YpICE9IGhsX2F0dHIoSExGX1ZOQykpCisJCXJlZHJhd19jdXJidWZfbGF0ZXIoSU5WRVJURURfQUxMKTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCitjbGlwX2xvc2Vfc2VsZWN0aW9uKGNiZCkKKyAgICBWaW1DbGlwYm9hcmQJKmNiZDsKK3sKKyNpZmRlZiBGRUFUX1gxMQorICAgIGludAkgICAgd2FzX293bmVkID0gY2JkLT5vd25lZDsKKyNlbmRpZgorICAgIGludCAgICAgdmlzdWFsX3NlbGVjdGlvbiA9IChjYmQgPT0gJmNsaXBfc3Rhcik7CisKKyAgICBjbGlwX2ZyZWVfc2VsZWN0aW9uKGNiZCk7CisgICAgY2JkLT5vd25lZCA9IEZBTFNFOworICAgIGlmICh2aXN1YWxfc2VsZWN0aW9uKQorCWNsaXBfY2xlYXJfc2VsZWN0aW9uKCk7CisgICAgY2xpcF9nZW5fbG9zZV9zZWxlY3Rpb24oY2JkKTsKKyNpZmRlZiBGRUFUX1gxMQorICAgIGlmICh2aXN1YWxfc2VsZWN0aW9uKQorICAgIHsKKwkvKiBNYXkgaGF2ZSB0byBzaG93IGEgZGlmZmVyZW50IGtpbmQgb2YgaGlnaGxpZ2h0aW5nIGZvciB0aGUgc2VsZWN0ZWQKKwkgKiBhcmVhLiAgVGhlcmUgaXMgbm8gc3BlY2lmaWMgcmVkcmF3IGNvbW1hbmQgZm9yIHRoaXMsIGp1c3QgcmVkcmF3IGFsbAorCSAqIHdpbmRvd3Mgb24gdGhlIGN1cnJlbnQgYnVmZmVyLiAqLworCWlmICh3YXNfb3duZWQKKwkJJiYgZ2V0X3JlYWxfc3RhdGUoKSA9PSBWSVNVQUwKKwkJJiYgY2xpcF9pc2F1dG9zZWwoKQorCQkmJiBobF9hdHRyKEhMRl9WKSAhPSBobF9hdHRyKEhMRl9WTkMpKQorCXsKKwkgICAgdXBkYXRlX2N1cmJ1ZihJTlZFUlRFRF9BTEwpOworCSAgICBzZXRjdXJzb3IoKTsKKwkgICAgY3Vyc29yX29uKCk7CisJICAgIG91dF9mbHVzaCgpOworIyBpZmRlZiBGRUFUX0dVSQorCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkJZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOworIyBlbmRpZgorCX0KKyAgICB9CisjZW5kaWYKK30KKworICAgIHZvaWQKK2NsaXBfY29weV9zZWxlY3Rpb24oKQoreworICAgIGlmIChWSXN1YWxfYWN0aXZlICYmIChTdGF0ZSAmIE5PUk1BTCkgJiYgY2xpcF9zdGFyLmF2YWlsYWJsZSkKKyAgICB7CisJaWYgKGNsaXBfaXNhdXRvc2VsKCkpCisJICAgIGNsaXBfdXBkYXRlX3NlbGVjdGlvbigpOworCWNsaXBfZnJlZV9zZWxlY3Rpb24oJmNsaXBfc3Rhcik7CisJY2xpcF9vd25fc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworCWlmIChjbGlwX3N0YXIub3duZWQpCisJICAgIGNsaXBfZ2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKwljbGlwX2dlbl9zZXRfc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworICAgIH0KK30KKworLyoKKyAqIENhbGxlZCB3aGVuIFZpc3VhbCBtb2RlIGlzIGVuZGVkOiB1cGRhdGUgdGhlIHNlbGVjdGlvbi4KKyAqLworICAgIHZvaWQKK2NsaXBfYXV0b19zZWxlY3QoKQoreworICAgIGlmIChjbGlwX2lzYXV0b3NlbCgpKQorCWNsaXBfY29weV9zZWxlY3Rpb24oKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGF1dG9tYXRpYyBzZWxlY3Rpb24gb2YgVmlzdWFsIGFyZWEgaXMgZGVzaXJlZC4KKyAqLworICAgIGludAorY2xpcF9pc2F1dG9zZWwoKQoreworICAgIHJldHVybiAoCisjaWZkZWYgRkVBVF9HVUkKKwkgICAgZ3VpLmluX3VzZSA/ICh2aW1fc3RyY2hyKHBfZ28sIEdPX0FTRUwpICE9IE5VTEwpIDoKKyNlbmRpZgorCSAgICBjbGlwX2F1dG9zZWxlY3QpOworfQorCisKKy8qCisgKiBTdHVmZiBmb3IgZ2VuZXJhbCBtb3VzZSBzZWxlY3Rpb24sIHdpdGhvdXQgdXNpbmcgVmlzdWFsIG1vZGUuCisgKi8KKworc3RhdGljIGludCBjbGlwX2NvbXBhcmVfcG9zIF9fQVJHUygoaW50IHJvdzEsIGludCBjb2wxLCBpbnQgcm93MiwgaW50IGNvbDIpKTsKK3N0YXRpYyB2b2lkIGNsaXBfaW52ZXJ0X2FyZWEgX19BUkdTKChpbnQsIGludCwgaW50LCBpbnQsIGludCBob3cpKTsKK3N0YXRpYyB2b2lkIGNsaXBfaW52ZXJ0X3JlY3RhbmdsZSBfX0FSR1MoKGludCByb3csIGludCBjb2wsIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IGludmVydCkpOworc3RhdGljIHZvaWQgY2xpcF9nZXRfd29yZF9ib3VuZGFyaWVzIF9fQVJHUygoVmltQ2xpcGJvYXJkICosIGludCwgaW50KSk7CitzdGF0aWMgaW50ICBjbGlwX2dldF9saW5lX2VuZCBfX0FSR1MoKGludCkpOworc3RhdGljIHZvaWQgY2xpcF91cGRhdGVfbW9kZWxlc3Nfc2VsZWN0aW9uIF9fQVJHUygoVmltQ2xpcGJvYXJkICosIGludCwgaW50LAorCQkJCQkJICAgIGludCwgaW50KSk7CisKKy8qIGZsYWdzIGZvciBjbGlwX2ludmVydF9hcmVhKCkgKi8KKyNkZWZpbmUgQ0xJUF9DTEVBUgkxCisjZGVmaW5lIENMSVBfU0VUCTIKKyNkZWZpbmUgQ0xJUF9UT0dHTEUJMworCisvKgorICogU3RhcnQsIGNvbnRpbnVlIG9yIGVuZCBhIG1vZGVsZXNzIHNlbGVjdGlvbi4gIFVzZWQgd2hlbiBlZGl0aW5nIHRoZQorICogY29tbWFuZC1saW5lIGFuZCBpbiB0aGUgY21kbGluZSB3aW5kb3cuCisgKi8KKyAgICB2b2lkCitjbGlwX21vZGVsZXNzKGJ1dHRvbiwgaXNfY2xpY2ssIGlzX2RyYWcpCisgICAgaW50CQlidXR0b247CisgICAgaW50CQlpc19jbGljazsKKyAgICBpbnQJCWlzX2RyYWc7Cit7CisgICAgaW50CQlyZXBlYXQ7CisKKyAgICByZXBlYXQgPSAoKGNsaXBfc3Rhci5tb2RlID09IFNFTEVDVF9NT0RFX0NIQVIKKwkJfHwgY2xpcF9zdGFyLm1vZGUgPT0gU0VMRUNUX01PREVfTElORSkKKwkJCQkJICAgICAgJiYgKG1vZF9tYXNrICYgTU9EX01BU0tfMkNMSUNLKSkKKwkgICAgfHwgKGNsaXBfc3Rhci5tb2RlID09IFNFTEVDVF9NT0RFX1dPUkQKKwkJCQkJICAgICAmJiAobW9kX21hc2sgJiBNT0RfTUFTS18zQ0xJQ0spKTsKKyAgICBpZiAoaXNfY2xpY2sgJiYgYnV0dG9uID09IE1PVVNFX1JJR0hUKQorICAgIHsKKwkvKiBSaWdodCBtb3VzZSBidXR0b246IElmIHRoZXJlIHdhcyBubyBzZWxlY3Rpb24sIHN0YXJ0IG9uZS4KKwkgKiBPdGhlcndpc2UgZXh0ZW5kIHRoZSBleGlzdGluZyBzZWxlY3Rpb24uICovCisJaWYgKGNsaXBfc3Rhci5zdGF0ZSA9PSBTRUxFQ1RfQ0xFQVJFRCkKKwkgICAgY2xpcF9zdGFydF9zZWxlY3Rpb24obW91c2VfY29sLCBtb3VzZV9yb3csIEZBTFNFKTsKKwljbGlwX3Byb2Nlc3Nfc2VsZWN0aW9uKGJ1dHRvbiwgbW91c2VfY29sLCBtb3VzZV9yb3csIHJlcGVhdCk7CisgICAgfQorICAgIGVsc2UgaWYgKGlzX2NsaWNrKQorCWNsaXBfc3RhcnRfc2VsZWN0aW9uKG1vdXNlX2NvbCwgbW91c2Vfcm93LCByZXBlYXQpOworICAgIGVsc2UgaWYgKGlzX2RyYWcpCisgICAgeworCS8qIERvbid0IHRyeSBleHRlbmRpbmcgYSBzZWxlY3Rpb24gaWYgdGhlcmUgaXNuJ3Qgb25lLiAgSGFwcGVucyB3aGVuCisJICogYnV0dG9uLWRvd24gaXMgaW4gdGhlIGNtZGxpbmUgYW5kIHRoZW0gbW92aW5nIG1vdXNlIHVwd2FyZHMuICovCisJaWYgKGNsaXBfc3Rhci5zdGF0ZSAhPSBTRUxFQ1RfQ0xFQVJFRCkKKwkgICAgY2xpcF9wcm9jZXNzX3NlbGVjdGlvbihidXR0b24sIG1vdXNlX2NvbCwgbW91c2Vfcm93LCByZXBlYXQpOworICAgIH0KKyAgICBlbHNlIC8qIHJlbGVhc2UgKi8KKwljbGlwX3Byb2Nlc3Nfc2VsZWN0aW9uKE1PVVNFX1JFTEVBU0UsIG1vdXNlX2NvbCwgbW91c2Vfcm93LCBGQUxTRSk7Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBzY3JlZW4gcG9zaXRpb25zIGFsYSBzdHJjbXAoKQorICovCisgICAgc3RhdGljIGludAorY2xpcF9jb21wYXJlX3Bvcyhyb3cxLCBjb2wxLCByb3cyLCBjb2wyKQorICAgIGludAkJcm93MTsKKyAgICBpbnQJCWNvbDE7CisgICAgaW50CQlyb3cyOworICAgIGludAkJY29sMjsKK3sKKyAgICBpZiAocm93MSA+IHJvdzIpIHJldHVybigxKTsKKyAgICBpZiAocm93MSA8IHJvdzIpIHJldHVybigtMSk7CisgICAgaWYgKGNvbDEgPiBjb2wyKSByZXR1cm4oMSk7CisgICAgaWYgKGNvbDEgPCBjb2wyKSByZXR1cm4oLTEpOworCQkgICAgIHJldHVybigwKTsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBzZWxlY3Rpb24KKyAqLworICAgIHZvaWQKK2NsaXBfc3RhcnRfc2VsZWN0aW9uKGNvbCwgcm93LCByZXBlYXRlZF9jbGljaykKKyAgICBpbnQJCWNvbDsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCXJlcGVhdGVkX2NsaWNrOworeworICAgIFZpbUNsaXBib2FyZAkqY2IgPSAmY2xpcF9zdGFyOworCisgICAgaWYgKGNiLT5zdGF0ZSA9PSBTRUxFQ1RfRE9ORSkKKwljbGlwX2NsZWFyX3NlbGVjdGlvbigpOworCisgICAgcm93ID0gY2hlY2tfcm93KHJvdyk7CisgICAgY29sID0gY2hlY2tfY29sKGNvbCk7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGNvbCA9IG1iX2ZpeF9jb2woY29sLCByb3cpOworI2VuZGlmCisKKyAgICBjYi0+c3RhcnQubG51bSAgPSByb3c7CisgICAgY2ItPnN0YXJ0LmNvbCAgID0gY29sOworICAgIGNiLT5lbmQJICAgID0gY2ItPnN0YXJ0OworICAgIGNiLT5vcmlnaW5fcm93ICA9IChzaG9ydF91KWNiLT5zdGFydC5sbnVtOworICAgIGNiLT5zdGF0ZQkgICAgPSBTRUxFQ1RfSU5fUFJPR1JFU1M7CisKKyAgICBpZiAocmVwZWF0ZWRfY2xpY2spCisgICAgeworCWlmICgrK2NiLT5tb2RlID4gU0VMRUNUX01PREVfTElORSkKKwkgICAgY2ItPm1vZGUgPSBTRUxFQ1RfTU9ERV9DSEFSOworICAgIH0KKyAgICBlbHNlCisJY2ItPm1vZGUgPSBTRUxFQ1RfTU9ERV9DSEFSOworCisjaWZkZWYgRkVBVF9HVUkKKyAgICAvKiBjbGVhciB0aGUgY3Vyc29yIHVudGlsIHRoZSBzZWxlY3Rpb24gaXMgbWFkZSAqLworICAgIGlmIChndWkuaW5fdXNlKQorCWd1aV91bmRyYXdfY3Vyc29yKCk7CisjZW5kaWYKKworICAgIHN3aXRjaCAoY2ItPm1vZGUpCisgICAgeworCWNhc2UgU0VMRUNUX01PREVfQ0hBUjoKKwkgICAgY2ItPm9yaWdpbl9zdGFydF9jb2wgPSBjYi0+c3RhcnQuY29sOworCSAgICBjYi0+d29yZF9lbmRfY29sID0gY2xpcF9nZXRfbGluZV9lbmQoKGludCljYi0+c3RhcnQubG51bSk7CisJICAgIGJyZWFrOworCisJY2FzZSBTRUxFQ1RfTU9ERV9XT1JEOgorCSAgICBjbGlwX2dldF93b3JkX2JvdW5kYXJpZXMoY2IsIChpbnQpY2ItPnN0YXJ0LmxudW0sIGNiLT5zdGFydC5jb2wpOworCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCA9IGNiLT53b3JkX3N0YXJ0X2NvbDsKKwkgICAgY2ItPm9yaWdpbl9lbmRfY29sCSA9IGNiLT53b3JkX2VuZF9jb2w7CisKKwkgICAgY2xpcF9pbnZlcnRfYXJlYSgoaW50KWNiLT5zdGFydC5sbnVtLCBjYi0+d29yZF9zdGFydF9jb2wsCisJCQkgICAgKGludCljYi0+ZW5kLmxudW0sIGNiLT53b3JkX2VuZF9jb2wsIENMSVBfU0VUKTsKKwkgICAgY2ItPnN0YXJ0LmNvbCA9IGNiLT53b3JkX3N0YXJ0X2NvbDsKKwkgICAgY2ItPmVuZC5jb2wgICA9IGNiLT53b3JkX2VuZF9jb2w7CisJICAgIGJyZWFrOworCisJY2FzZSBTRUxFQ1RfTU9ERV9MSU5FOgorCSAgICBjbGlwX2ludmVydF9hcmVhKChpbnQpY2ItPnN0YXJ0LmxudW0sIDAsIChpbnQpY2ItPnN0YXJ0LmxudW0sCisJCQkgICAgKGludClDb2x1bW5zLCBDTElQX1NFVCk7CisJICAgIGNiLT5zdGFydC5jb2wgPSAwOworCSAgICBjYi0+ZW5kLmNvbCAgID0gQ29sdW1uczsKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgY2ItPnByZXYgPSBjYi0+c3RhcnQ7CisKKyNpZmRlZiBERUJVR19TRUxFQ1RJT04KKyAgICBwcmludGYoIlNlbGVjdGlvbiBzdGFydGVkIGF0ICgldSwldSlcbiIsIGNiLT5zdGFydC5sbnVtLCBjYi0+c3RhcnQuY29sKTsKKyNlbmRpZgorfQorCisvKgorICogQ29udGludWUgcHJvY2Vzc2luZyB0aGUgc2VsZWN0aW9uCisgKi8KKyAgICB2b2lkCitjbGlwX3Byb2Nlc3Nfc2VsZWN0aW9uKGJ1dHRvbiwgY29sLCByb3csIHJlcGVhdGVkX2NsaWNrKQorICAgIGludAkJYnV0dG9uOworICAgIGludAkJY29sOworICAgIGludAkJcm93OworICAgIGludF91CXJlcGVhdGVkX2NsaWNrOworeworICAgIFZpbUNsaXBib2FyZAkqY2IgPSAmY2xpcF9zdGFyOworICAgIGludAkJCWRpZmY7CisgICAgaW50CQkJc2xlbiA9IDE7CS8qIGN1cnNvciBzaGFwZSB3aWR0aCAqLworCisgICAgaWYgKGJ1dHRvbiA9PSBNT1VTRV9SRUxFQVNFKQorICAgIHsKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgc2VsZWN0ZWQgKi8KKwlpZiAoY2ItPnN0YXJ0LmxudW0gPT0gY2ItPmVuZC5sbnVtICYmIGNiLT5zdGFydC5jb2wgPT0gY2ItPmVuZC5jb2wpCisJeworI2lmZGVmIEZFQVRfR1VJCisJICAgIGlmIChndWkuaW5fdXNlKQorCQlndWlfdXBkYXRlX2N1cnNvcihGQUxTRSwgRkFMU0UpOworI2VuZGlmCisJICAgIGNiLT5zdGF0ZSA9IFNFTEVDVF9DTEVBUkVEOworCSAgICByZXR1cm47CisJfQorCisjaWZkZWYgREVCVUdfU0VMRUNUSU9OCisJcHJpbnRmKCJTZWxlY3Rpb24gZW5kZWQ6ICgldSwldSkgdG8gKCV1LCV1KVxuIiwgY2ItPnN0YXJ0LmxudW0sCisJCWNiLT5zdGFydC5jb2wsIGNiLT5lbmQubG51bSwgY2ItPmVuZC5jb2wpOworI2VuZGlmCisJaWYgKGNsaXBfaXNhdXRvc2VsKCkKKwkJfHwgKAorI2lmZGVmIEZFQVRfR1VJCisJCSAgICBndWkuaW5fdXNlID8gKHZpbV9zdHJjaHIocF9nbywgR09fQVNFTE1MKSAhPSBOVUxMKSA6CisjZW5kaWYKKwkJICAgIGNsaXBfYXV0b3NlbGVjdG1sKSkKKwkgICAgY2xpcF9jb3B5X21vZGVsZXNzX3NlbGVjdGlvbihGQUxTRSk7CisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLmluX3VzZSkKKwkgICAgZ3VpX3VwZGF0ZV9jdXJzb3IoRkFMU0UsIEZBTFNFKTsKKyNlbmRpZgorCisJY2ItPnN0YXRlID0gU0VMRUNUX0RPTkU7CisJcmV0dXJuOworICAgIH0KKworICAgIHJvdyA9IGNoZWNrX3Jvdyhyb3cpOworICAgIGNvbCA9IGNoZWNrX2NvbChjb2wpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBjb2wgPSBtYl9maXhfY29sKGNvbCwgcm93KTsKKyNlbmRpZgorCisgICAgaWYgKGNvbCA9PSAoaW50KWNiLT5wcmV2LmNvbCAmJiByb3cgPT0gY2ItPnByZXYubG51bSAmJiAhcmVwZWF0ZWRfY2xpY2spCisJcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBXaGVuIGV4dGVuZGluZyB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiwgc3dhcCB0aGUKKyAgICAgKiBzdGFydCBhbmQgZW5kIGlmIHRoZSBwb3NpdGlvbiBpcyBiZWZvcmUgaGFsZiB0aGUgc2VsZWN0aW9uCisgICAgICovCisgICAgaWYgKGNiLT5zdGF0ZSA9PSBTRUxFQ1RfRE9ORSAmJiBidXR0b24gPT0gTU9VU0VfUklHSFQpCisgICAgeworCS8qCisJICogSWYgdGhlIGNsaWNrIGlzIGJlZm9yZSB0aGUgc3RhcnQsIG9yIHRoZSBjbGljayBpcyBpbnNpZGUgdGhlCisJICogc2VsZWN0aW9uIGFuZCB0aGUgc3RhcnQgaXMgdGhlIGNsb3Nlc3Qgc2lkZSwgc2V0IHRoZSBvcmlnaW4gdG8gdGhlCisJICogZW5kIG9mIHRoZSBzZWxlY3Rpb24uCisJICovCisJaWYgKGNsaXBfY29tcGFyZV9wb3Mocm93LCBjb2wsIChpbnQpY2ItPnN0YXJ0LmxudW0sIGNiLT5zdGFydC5jb2wpIDwgMAorCQl8fCAoY2xpcF9jb21wYXJlX3Bvcyhyb3csIGNvbCwKKwkJCQkJICAgKGludCljYi0+ZW5kLmxudW0sIGNiLT5lbmQuY29sKSA8IDAKKwkJICAgICYmICgoKGNiLT5zdGFydC5sbnVtID09IGNiLT5lbmQubG51bQorCQkJICAgICYmIGNiLT5lbmQuY29sIC0gY29sID4gY29sIC0gY2ItPnN0YXJ0LmNvbCkpCisJCQl8fCAoKGRpZmYgPSAoY2ItPmVuZC5sbnVtIC0gcm93KSAtCisJCQkJCQkgICAocm93IC0gY2ItPnN0YXJ0LmxudW0pKSA+IDAKKwkJCSAgICB8fCAoZGlmZiA9PSAwICYmIGNvbCA8IChpbnQpKGNiLT5zdGFydC5jb2wgKworCQkJCQkJCSBjYi0+ZW5kLmNvbCkgLyAyKSkpKSkKKwl7CisJICAgIGNiLT5vcmlnaW5fcm93ID0gKHNob3J0X3UpY2ItPmVuZC5sbnVtOworCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCA9IGNiLT5lbmQuY29sIC0gMTsKKwkgICAgY2ItPm9yaWdpbl9lbmRfY29sID0gY2ItPmVuZC5jb2w7CisJfQorCWVsc2UKKwl7CisJICAgIGNiLT5vcmlnaW5fcm93ID0gKHNob3J0X3UpY2ItPnN0YXJ0LmxudW07CisJICAgIGNiLT5vcmlnaW5fc3RhcnRfY29sID0gY2ItPnN0YXJ0LmNvbDsKKwkgICAgY2ItPm9yaWdpbl9lbmRfY29sID0gY2ItPnN0YXJ0LmNvbDsKKwl9CisJaWYgKGNiLT5tb2RlID09IFNFTEVDVF9NT0RFX1dPUkQgJiYgIXJlcGVhdGVkX2NsaWNrKQorCSAgICBjYi0+bW9kZSA9IFNFTEVDVF9NT0RFX0NIQVI7CisgICAgfQorCisgICAgLyogc2V0IHN0YXRlLCBmb3Igd2hlbiB1c2luZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uICovCisgICAgY2ItPnN0YXRlID0gU0VMRUNUX0lOX1BST0dSRVNTOworCisjaWZkZWYgREVCVUdfU0VMRUNUSU9OCisgICAgcHJpbnRmKCJTZWxlY3Rpb24gZXh0ZW5kaW5nIHRvICglZCwlZClcbiIsIHJvdywgY29sKTsKKyNlbmRpZgorCisgICAgaWYgKHJlcGVhdGVkX2NsaWNrICYmICsrY2ItPm1vZGUgPiBTRUxFQ1RfTU9ERV9MSU5FKQorCWNiLT5tb2RlID0gU0VMRUNUX01PREVfQ0hBUjsKKworICAgIHN3aXRjaCAoY2ItPm1vZGUpCisgICAgeworCWNhc2UgU0VMRUNUX01PREVfQ0hBUjoKKwkgICAgLyogSWYgd2UncmUgb24gYSBkaWZmZXJlbnQgbGluZSwgZmluZCB3aGVyZSB0aGUgbGluZSBlbmRzICovCisJICAgIGlmIChyb3cgIT0gY2ItPnByZXYubG51bSkKKwkJY2ItPndvcmRfZW5kX2NvbCA9IGNsaXBfZ2V0X2xpbmVfZW5kKHJvdyk7CisKKwkgICAgLyogU2VlIGlmIHdlIGFyZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG9yaWdpbiBvZiB0aGUgc2VsZWN0aW9uICovCisJICAgIGlmIChjbGlwX2NvbXBhcmVfcG9zKHJvdywgY29sLCBjYi0+b3JpZ2luX3JvdywKKwkJCQkJCSAgIGNiLT5vcmlnaW5fc3RhcnRfY29sKSA+PSAwKQorCSAgICB7CisJCWlmIChjb2wgPj0gKGludCljYi0+d29yZF9lbmRfY29sKQorCQkgICAgY2xpcF91cGRhdGVfbW9kZWxlc3Nfc2VsZWN0aW9uKGNiLCBjYi0+b3JpZ2luX3JvdywKKwkJCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCwgcm93LCAoaW50KUNvbHVtbnMpOworCQllbHNlCisJCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJCSAgICBpZiAoaGFzX21ieXRlICYmIG1iX2xlZnRoYWx2ZShyb3csIGNvbCkpCisJCQlzbGVuID0gMjsKKyNlbmRpZgorCQkgICAgY2xpcF91cGRhdGVfbW9kZWxlc3Nfc2VsZWN0aW9uKGNiLCBjYi0+b3JpZ2luX3JvdywKKwkJCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCwgcm93LCBjb2wgKyBzbGVuKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZQorCQkJJiYgbWJfbGVmdGhhbHZlKGNiLT5vcmlnaW5fcm93LCBjYi0+b3JpZ2luX3N0YXJ0X2NvbCkpCisJCSAgICBzbGVuID0gMjsKKyNlbmRpZgorCQlpZiAoY29sID49IChpbnQpY2ItPndvcmRfZW5kX2NvbCkKKwkJICAgIGNsaXBfdXBkYXRlX21vZGVsZXNzX3NlbGVjdGlvbihjYiwgcm93LCBjYi0+d29yZF9lbmRfY29sLAorCQkJICAgIGNiLT5vcmlnaW5fcm93LCBjYi0+b3JpZ2luX3N0YXJ0X2NvbCArIHNsZW4pOworCQllbHNlCisJCSAgICBjbGlwX3VwZGF0ZV9tb2RlbGVzc19zZWxlY3Rpb24oY2IsIHJvdywgY29sLAorCQkJICAgIGNiLT5vcmlnaW5fcm93LCBjYi0+b3JpZ2luX3N0YXJ0X2NvbCArIHNsZW4pOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBTRUxFQ1RfTU9ERV9XT1JEOgorCSAgICAvKiBJZiB3ZSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHdvcmQsIGRvIG5vdGhpbmcgKi8KKwkgICAgaWYgKHJvdyA9PSBjYi0+cHJldi5sbnVtICYmIGNvbCA+PSAoaW50KWNiLT53b3JkX3N0YXJ0X2NvbAorCQkgICAgJiYgY29sIDwgKGludCljYi0+d29yZF9lbmRfY29sICYmICFyZXBlYXRlZF9jbGljaykKKwkJcmV0dXJuOworCisJICAgIC8qIEdldCBuZXcgd29yZCBib3VuZGFyaWVzICovCisJICAgIGNsaXBfZ2V0X3dvcmRfYm91bmRhcmllcyhjYiwgcm93LCBjb2wpOworCisJICAgIC8qIEhhbmRsZSBiZWluZyBhZnRlciB0aGUgb3JpZ2luIHBvaW50IG9mIHNlbGVjdGlvbiAqLworCSAgICBpZiAoY2xpcF9jb21wYXJlX3Bvcyhyb3csIGNvbCwgY2ItPm9yaWdpbl9yb3csCisJCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCkgPj0gMCkKKwkJY2xpcF91cGRhdGVfbW9kZWxlc3Nfc2VsZWN0aW9uKGNiLCBjYi0+b3JpZ2luX3JvdywKKwkJCWNiLT5vcmlnaW5fc3RhcnRfY29sLCByb3csIGNiLT53b3JkX2VuZF9jb2wpOworCSAgICBlbHNlCisJCWNsaXBfdXBkYXRlX21vZGVsZXNzX3NlbGVjdGlvbihjYiwgcm93LCBjYi0+d29yZF9zdGFydF9jb2wsCisJCQljYi0+b3JpZ2luX3JvdywgY2ItPm9yaWdpbl9lbmRfY29sKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNFTEVDVF9NT0RFX0xJTkU6CisJICAgIGlmIChyb3cgPT0gY2ItPnByZXYubG51bSAmJiAhcmVwZWF0ZWRfY2xpY2spCisJCXJldHVybjsKKworCSAgICBpZiAoY2xpcF9jb21wYXJlX3Bvcyhyb3csIGNvbCwgY2ItPm9yaWdpbl9yb3csCisJCSAgICBjYi0+b3JpZ2luX3N0YXJ0X2NvbCkgPj0gMCkKKwkJY2xpcF91cGRhdGVfbW9kZWxlc3Nfc2VsZWN0aW9uKGNiLCBjYi0+b3JpZ2luX3JvdywgMCwgcm93LAorCQkJKGludClDb2x1bW5zKTsKKwkgICAgZWxzZQorCQljbGlwX3VwZGF0ZV9tb2RlbGVzc19zZWxlY3Rpb24oY2IsIHJvdywgMCwgY2ItPm9yaWdpbl9yb3csCisJCQkoaW50KUNvbHVtbnMpOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICBjYi0+cHJldi5sbnVtID0gcm93OworICAgIGNiLT5wcmV2LmNvbCAgPSBjb2w7CisKKyNpZmRlZiBERUJVR19TRUxFQ1RJT04KKwlwcmludGYoIlNlbGVjdGlvbiBpczogKCV1LCV1KSB0byAoJXUsJXUpXG4iLCBjYi0+c3RhcnQubG51bSwKKwkJY2ItPnN0YXJ0LmNvbCwgY2ItPmVuZC5sbnVtLCBjYi0+ZW5kLmNvbCk7CisjZW5kaWYKK30KKworI2lmIDAgLyogbm90IHVzZWQgKi8KKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYW4gRXhwb3NlIGV2ZW50IHRvIHJlZHJhdyB0aGUgc2VsZWN0aW9uCisgKi8KKyAgICB2b2lkCitjbGlwX3JlZHJhd19zZWxlY3Rpb24oeCwgeSwgdywgaCkKKyAgICBpbnQJICAgIHg7CisgICAgaW50CSAgICB5OworICAgIGludAkgICAgdzsKKyAgICBpbnQJICAgIGg7Cit7CisgICAgVmltQ2xpcGJvYXJkICAgICpjYiA9ICZjbGlwX3N0YXI7CisgICAgaW50CQkgICAgcm93MSwgY29sMSwgcm93MiwgY29sMjsKKyAgICBpbnQJCSAgICByb3c7CisgICAgaW50CQkgICAgc3RhcnQ7CisgICAgaW50CQkgICAgZW5kOworCisgICAgaWYgKGNiLT5zdGF0ZSA9PSBTRUxFQ1RfQ0xFQVJFRCkKKwlyZXR1cm47CisKKyAgICByb3cxID0gY2hlY2tfcm93KFlfMl9ST1coeSkpOworICAgIGNvbDEgPSBjaGVja19jb2woWF8yX0NPTCh4KSk7CisgICAgcm93MiA9IGNoZWNrX3JvdyhZXzJfUk9XKHkgKyBoIC0gMSkpOworICAgIGNvbDIgPSBjaGVja19jb2woWF8yX0NPTCh4ICsgdyAtIDEpKTsKKworICAgIC8qIExpbWl0IHRoZSByb3dzIHRoYXQgbmVlZCB0byBiZSByZS1kcmF3biAqLworICAgIGlmIChjYi0+c3RhcnQubG51bSA+IHJvdzEpCisJcm93MSA9IGNiLT5zdGFydC5sbnVtOworICAgIGlmIChjYi0+ZW5kLmxudW0gPCByb3cyKQorCXJvdzIgPSBjYi0+ZW5kLmxudW07CisKKyAgICAvKiBMb29rIGF0IGVhY2ggcm93IHRoYXQgbWlnaHQgbmVlZCB0byBiZSByZS1kcmF3biAqLworICAgIGZvciAocm93ID0gcm93MTsgcm93IDw9IHJvdzI7IHJvdysrKQorICAgIHsKKwkvKiBGb3IgdGhlIGZpcnN0IHNlbGVjdGlvbiByb3csIHVzZSB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uIGNvbHVtbiAqLworCWlmIChyb3cgPT0gY2ItPnN0YXJ0LmxudW0pCisJICAgIHN0YXJ0ID0gY2ItPnN0YXJ0LmNvbDsKKwllbHNlCisJICAgIHN0YXJ0ID0gMDsKKworCS8qIEZvciB0aGUgbGFzdCBzZWxlY3Rpb24gcm93LCB1c2UgdGhlIGVuZGluZyBzZWxlY3Rpb24gY29sdW1uICovCisJaWYgKHJvdyA9PSBjYi0+ZW5kLmxudW0pCisJICAgIGVuZCA9IGNiLT5lbmQuY29sOworCWVsc2UKKwkgICAgZW5kID0gQ29sdW1uczsKKworCWlmIChjb2wxID4gc3RhcnQpCisJICAgIHN0YXJ0ID0gY29sMTsKKworCWlmIChjb2wyIDwgZW5kKQorCSAgICBlbmQgPSBjb2wyICsgMTsKKworCWlmIChlbmQgPiBzdGFydCkKKwkgICAgZ3VpX21jaF9pbnZlcnRfcmVjdGFuZ2xlKHJvdywgc3RhcnQsIDEsIGVuZCAtIHN0YXJ0KTsKKyAgICB9Cit9CisjZW5kaWYKKworIyBpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJlZHJhdyBwYXJ0IG9mIHRoZSBzZWxlY3Rpb24gaWYgY2hhcmFjdGVyIGF0ICJyb3csY29sIiBpcyBpbnNpZGUgb2YgaXQuCisgKiBPbmx5IHVzZWQgZm9yIHRoZSBHVUkuCisgKi8KKyAgICB2b2lkCitjbGlwX21heV9yZWRyYXdfc2VsZWN0aW9uKHJvdywgY29sLCBsZW4pCisgICAgaW50CQlyb3csIGNvbDsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBpbnQJCXN0YXJ0ID0gY29sOworICAgIGludAkJZW5kID0gY29sICsgbGVuOworCisgICAgaWYgKGNsaXBfc3Rhci5zdGF0ZSAhPSBTRUxFQ1RfQ0xFQVJFRAorCSAgICAmJiByb3cgPj0gY2xpcF9zdGFyLnN0YXJ0LmxudW0KKwkgICAgJiYgcm93IDw9IGNsaXBfc3Rhci5lbmQubG51bSkKKyAgICB7CisJaWYgKHJvdyA9PSBjbGlwX3N0YXIuc3RhcnQubG51bSAmJiBzdGFydCA8IChpbnQpY2xpcF9zdGFyLnN0YXJ0LmNvbCkKKwkgICAgc3RhcnQgPSBjbGlwX3N0YXIuc3RhcnQuY29sOworCWlmIChyb3cgPT0gY2xpcF9zdGFyLmVuZC5sbnVtICYmIGVuZCA+IChpbnQpY2xpcF9zdGFyLmVuZC5jb2wpCisJICAgIGVuZCA9IGNsaXBfc3Rhci5lbmQuY29sOworCWlmIChlbmQgPiBzdGFydCkKKwkgICAgY2xpcF9pbnZlcnRfYXJlYShyb3csIHN0YXJ0LCByb3csIGVuZCwgMCk7CisgICAgfQorfQorIyBlbmRpZgorCisvKgorICogQ2FsbGVkIGZyb20gb3V0c2lkZSB0byBjbGVhciBzZWxlY3RlZCByZWdpb24gZnJvbSB0aGUgZGlzcGxheQorICovCisgICAgdm9pZAorY2xpcF9jbGVhcl9zZWxlY3Rpb24oKQoreworICAgIFZpbUNsaXBib2FyZCAgICAqY2IgPSAmY2xpcF9zdGFyOworCisgICAgaWYgKGNiLT5zdGF0ZSA9PSBTRUxFQ1RfQ0xFQVJFRCkKKwlyZXR1cm47CisKKyAgICBjbGlwX2ludmVydF9hcmVhKChpbnQpY2ItPnN0YXJ0LmxudW0sIGNiLT5zdGFydC5jb2wsIChpbnQpY2ItPmVuZC5sbnVtLAorCQkJCQkJICAgICBjYi0+ZW5kLmNvbCwgQ0xJUF9DTEVBUik7CisgICAgY2ItPnN0YXRlID0gU0VMRUNUX0NMRUFSRUQ7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgc2VsZWN0aW9uIGlmIGFueSBsaW5lcyBmcm9tICJyb3cxIiB0byAicm93MiIgYXJlIGluc2lkZSBvZiBpdC4KKyAqLworICAgIHZvaWQKK2NsaXBfbWF5X2NsZWFyX3NlbGVjdGlvbihyb3cxLCByb3cyKQorICAgIGludAlyb3cxLCByb3cyOworeworICAgIGlmIChjbGlwX3N0YXIuc3RhdGUgPT0gU0VMRUNUX0RPTkUKKwkgICAgJiYgcm93MiA+PSBjbGlwX3N0YXIuc3RhcnQubG51bQorCSAgICAmJiByb3cxIDw9IGNsaXBfc3Rhci5lbmQubG51bSkKKwljbGlwX2NsZWFyX3NlbGVjdGlvbigpOworfQorCisvKgorICogQ2FsbGVkIGJlZm9yZSB0aGUgc2NyZWVuIGlzIHNjcm9sbGVkIHVwIG9yIGRvd24uICBBZGp1c3RzIHRoZSBsaW5lIG51bWJlcnMKKyAqIG9mIHRoZSBzZWxlY3Rpb24uICBDYWxsIHdpdGggYmlnIG51bWJlciB3aGVuIGNsZWFyaW5nIHRoZSBzY3JlZW4uCisgKi8KKyAgICB2b2lkCitjbGlwX3Njcm9sbF9zZWxlY3Rpb24ocm93cykKKyAgICBpbnQJICAgIHJvd3M7CQkvKiBuZWdhdGl2ZSBmb3Igc2Nyb2xsIGRvd24gKi8KK3sKKyAgICBpbnQJICAgIGxudW07CisKKyAgICBpZiAoY2xpcF9zdGFyLnN0YXRlID09IFNFTEVDVF9DTEVBUkVEKQorCXJldHVybjsKKworICAgIGxudW0gPSBjbGlwX3N0YXIuc3RhcnQubG51bSAtIHJvd3M7CisgICAgaWYgKGxudW0gPD0gMCkKKwljbGlwX3N0YXIuc3RhcnQubG51bSA9IDA7CisgICAgZWxzZSBpZiAobG51bSA+PSBzY3JlZW5fUm93cykJLyogc2Nyb2xsZWQgb2ZmIG9mIHRoZSBzY3JlZW4gKi8KKwljbGlwX3N0YXIuc3RhdGUgPSBTRUxFQ1RfQ0xFQVJFRDsKKyAgICBlbHNlCisJY2xpcF9zdGFyLnN0YXJ0LmxudW0gPSBsbnVtOworCisgICAgbG51bSA9IGNsaXBfc3Rhci5lbmQubG51bSAtIHJvd3M7CisgICAgaWYgKGxudW0gPCAwKQkJCS8qIHNjcm9sbGVkIG9mZiBvZiB0aGUgc2NyZWVuICovCisJY2xpcF9zdGFyLnN0YXRlID0gU0VMRUNUX0NMRUFSRUQ7CisgICAgZWxzZSBpZiAobG51bSA+PSBzY3JlZW5fUm93cykKKwljbGlwX3N0YXIuZW5kLmxudW0gPSBzY3JlZW5fUm93cyAtIDE7CisgICAgZWxzZQorCWNsaXBfc3Rhci5lbmQubG51bSA9IGxudW07Cit9CisKKy8qCisgKiBJbnZlcnQgYSByZWdpb24gb2YgdGhlIGRpc3BsYXkgYmV0d2VlbiBhIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcm93IGFuZCBjb2x1bW4KKyAqIFZhbHVlcyBmb3IgImhvdyI6CisgKiBDTElQX0NMRUFSOiAgdW5kbyBpbnZlcnNpb24KKyAqIENMSVBfU0VUOiAgICBzZXQgaW52ZXJzaW9uCisgKiBDTElQX1RPR0dMRTogc2V0IGludmVyc2lvbiBpZiBwb3MxIDwgcG9zMiwgdW5kbyBpbnZlcnNpb24gb3RoZXJ3aXNlLgorICogMDogaW52ZXJ0IChHVUkgb25seSkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xpcF9pbnZlcnRfYXJlYShyb3cxLCBjb2wxLCByb3cyLCBjb2wyLCBob3cpCisgICAgaW50CQlyb3cxOworICAgIGludAkJY29sMTsKKyAgICBpbnQJCXJvdzI7CisgICAgaW50CQljb2wyOworICAgIGludAkJaG93OworeworICAgIGludAkJaW52ZXJ0ID0gRkFMU0U7CisKKyAgICBpZiAoaG93ID09IENMSVBfU0VUKQorCWludmVydCA9IFRSVUU7CisKKyAgICAvKiBTd2FwIHRoZSBmcm9tIGFuZCB0byBwb3NpdGlvbnMgc28gdGhlIGZyb20gaXMgYWx3YXlzIGJlZm9yZSAqLworICAgIGlmIChjbGlwX2NvbXBhcmVfcG9zKHJvdzEsIGNvbDEsIHJvdzIsIGNvbDIpID4gMCkKKyAgICB7CisJaW50IHRtcF9yb3csIHRtcF9jb2w7CisKKwl0bXBfcm93ID0gcm93MTsKKwl0bXBfY29sID0gY29sMTsKKwlyb3cxCT0gcm93MjsKKwljb2wxCT0gY29sMjsKKwlyb3cyCT0gdG1wX3JvdzsKKwljb2wyCT0gdG1wX2NvbDsKKyAgICB9CisgICAgZWxzZSBpZiAoaG93ID09IENMSVBfVE9HR0xFKQorCWludmVydCA9IFRSVUU7CisKKyAgICAvKiBJZiBhbGwgb24gdGhlIHNhbWUgbGluZSwgZG8gaXQgdGhlIGVhc3kgd2F5ICovCisgICAgaWYgKHJvdzEgPT0gcm93MikKKyAgICB7CisJY2xpcF9pbnZlcnRfcmVjdGFuZ2xlKHJvdzEsIGNvbDEsIDEsIGNvbDIgLSBjb2wxLCBpbnZlcnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIEhhbmRsZSBhIHBpZWNlIG9mIHRoZSBmaXJzdCBsaW5lICovCisJaWYgKGNvbDEgPiAwKQorCXsKKwkgICAgY2xpcF9pbnZlcnRfcmVjdGFuZ2xlKHJvdzEsIGNvbDEsIDEsIChpbnQpQ29sdW1ucyAtIGNvbDEsIGludmVydCk7CisJICAgIHJvdzErKzsKKwl9CisKKwkvKiBIYW5kbGUgYSBwaWVjZSBvZiB0aGUgbGFzdCBsaW5lICovCisJaWYgKGNvbDIgPCBDb2x1bW5zIC0gMSkKKwl7CisJICAgIGNsaXBfaW52ZXJ0X3JlY3RhbmdsZShyb3cyLCAwLCAxLCBjb2wyLCBpbnZlcnQpOworCSAgICByb3cyLS07CisJfQorCisJLyogSGFuZGxlIHRoZSByZWN0YW5nbGUgdGhhdHMgbGVmdCAqLworCWlmIChyb3cyID49IHJvdzEpCisJICAgIGNsaXBfaW52ZXJ0X3JlY3RhbmdsZShyb3cxLCAwLCByb3cyIC0gcm93MSArIDEsIChpbnQpQ29sdW1ucywKKwkJCQkJCQkJICAgICAgaW52ZXJ0KTsKKyAgICB9Cit9CisKKy8qCisgKiBJbnZlcnQgb3IgdW4taW52ZXJ0IGEgcmVjdGFuZ2xlIG9mIHRoZSBzY3JlZW4uCisgKiAiaW52ZXJ0IiBpcyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgaW52ZXJ0ZWQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2xpcF9pbnZlcnRfcmVjdGFuZ2xlKHJvdywgY29sLCBoZWlnaHQsIHdpZHRoLCBpbnZlcnQpCisgICAgaW50CQlyb3c7CisgICAgaW50CQljb2w7CisgICAgaW50CQloZWlnaHQ7CisgICAgaW50CQl3aWR0aDsKKyAgICBpbnQJCWludmVydDsKK3sKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCWd1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZShyb3csIGNvbCwgaGVpZ2h0LCB3aWR0aCk7CisgICAgZWxzZQorI2VuZGlmCisJc2NyZWVuX2RyYXdfcmVjdGFuZ2xlKHJvdywgY29sLCBoZWlnaHQsIHdpZHRoLCBpbnZlcnQpOworfQorCisvKgorICogQ29weSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGFyZWEgaW50byB0aGUgJyonIHJlZ2lzdGVyIHNvIGl0IHdpbGwgYmUKKyAqIGF2YWlsYWJsZSBmb3IgcGFzdGluZy4KKyAqIFdoZW4gImJvdGgiIGlzIFRSVUUgYWxzbyBjb3B5IHRvIHRoZSAnKycgcmVnaXN0ZXIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2NsaXBfY29weV9tb2RlbGVzc19zZWxlY3Rpb24oYm90aCkKKyAgICBpbnQJCWJvdGg7Cit7CisgICAgY2hhcl91CSpidWZmZXI7CisgICAgY2hhcl91CSpidWZwOworICAgIGludAkJcm93OworICAgIGludAkJc3RhcnRfY29sOworICAgIGludAkJZW5kX2NvbDsKKyAgICBpbnQJCWxpbmVfZW5kX2NvbDsKKyAgICBpbnQJCWFkZF9uZXdsaW5lX2ZsYWcgPSBGQUxTRTsKKyAgICBpbnQJCWxlbjsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CSpwOworICAgIGludAkJaTsKKyNlbmRpZgorICAgIGludAkJcm93MSA9IGNsaXBfc3Rhci5zdGFydC5sbnVtOworICAgIGludAkJY29sMSA9IGNsaXBfc3Rhci5zdGFydC5jb2w7CisgICAgaW50CQlyb3cyID0gY2xpcF9zdGFyLmVuZC5sbnVtOworICAgIGludAkJY29sMiA9IGNsaXBfc3Rhci5lbmQuY29sOworCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgcm93MSA8PSByb3cyLCBhbmQgaWYgcm93MSA9PSByb3cyIHRoYXQgY29sMSA8PSBjb2wyLgorICAgICAqLworICAgIGlmIChyb3cxID4gcm93MikKKyAgICB7CisJcm93ID0gcm93MTsgcm93MSA9IHJvdzI7IHJvdzIgPSByb3c7CisJcm93ID0gY29sMTsgY29sMSA9IGNvbDI7IGNvbDIgPSByb3c7CisgICAgfQorICAgIGVsc2UgaWYgKHJvdzEgPT0gcm93MiAmJiBjb2wxID4gY29sMikKKyAgICB7CisJcm93ID0gY29sMTsgY29sMSA9IGNvbDI7IGNvbDIgPSByb3c7CisgICAgfQorI2lmZGVmIEZFQVRfTUJZVEUKKyAgICAvKiBjb3JyZWN0IHN0YXJ0aW5nIHBvaW50IGZvciBiZWluZyBvbiByaWdodCBoYWx2ZSBvZiBkb3VibGUtd2lkZSBjaGFyICovCisgICAgcCA9IFNjcmVlbkxpbmVzICsgTGluZU9mZnNldFtyb3cxXTsKKyAgICBpZiAoZW5jX2RiY3MgIT0gMCkKKwljb2wxIC09ICgqbWJfaGVhZF9vZmYpKHAsIHAgKyBjb2wxKTsKKyAgICBlbHNlIGlmIChlbmNfdXRmOCAmJiBwW2NvbDFdID09IDApCisJLS1jb2wxOworI2VuZGlmCisKKyAgICAvKiBDcmVhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBzdG9yaW5nIHRoZSB0ZXh0ICovCisgICAgbGVuID0gKHJvdzIgLSByb3cxICsgMSkgKiBDb2x1bW5zICsgMTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaWYgKGVuY19kYmNzICE9IDApCisJbGVuICo9IDI7CS8qIG1heC4gMiBieXRlcyBwZXIgZGlzcGxheSBjZWxsICovCisgICAgZWxzZSBpZiAoZW5jX3V0ZjgpCisJbGVuICo9IDk7CS8qIG1heC4gMyBieXRlcyBwZXIgZGlzcGxheSBjZWxsICsgMiBjb21wb3NpbmcgY2hhcnMgKi8KKyNlbmRpZgorICAgIGJ1ZmZlciA9IGxhbGxvYygobG9uZ191KWxlbiwgVFJVRSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLworCXJldHVybjsKKworICAgIC8qIFByb2Nlc3MgZWFjaCByb3cgaW4gdGhlIHNlbGVjdGlvbiAqLworICAgIGZvciAoYnVmcCA9IGJ1ZmZlciwgcm93ID0gcm93MTsgcm93IDw9IHJvdzI7IHJvdysrKQorICAgIHsKKwlpZiAocm93ID09IHJvdzEpCisJICAgIHN0YXJ0X2NvbCA9IGNvbDE7CisJZWxzZQorCSAgICBzdGFydF9jb2wgPSAwOworCisJaWYgKHJvdyA9PSByb3cyKQorCSAgICBlbmRfY29sID0gY29sMjsKKwllbHNlCisJICAgIGVuZF9jb2wgPSBDb2x1bW5zOworCisJbGluZV9lbmRfY29sID0gY2xpcF9nZXRfbGluZV9lbmQocm93KTsKKworCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIG51a2Ugc29tZSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJaWYgKGVuZF9jb2wgPj0gQ29sdW1ucyAmJiAocm93IDwgcm93MiB8fCBlbmRfY29sID4gbGluZV9lbmRfY29sKSkKKwl7CisJICAgIC8qIEdldCByaWQgb2YgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCSAgICBlbmRfY29sID0gbGluZV9lbmRfY29sOworCSAgICBpZiAoZW5kX2NvbCA8IHN0YXJ0X2NvbCkKKwkJZW5kX2NvbCA9IHN0YXJ0X2NvbDsKKworCSAgICAvKiBJZiB0aGUgbGFzdCBsaW5lIGV4dGVuZGVkIHRvIHRoZSBlbmQsIGFkZCBhbiBleHRyYSBuZXdsaW5lICovCisJICAgIGlmIChyb3cgPT0gcm93MikKKwkJYWRkX25ld2xpbmVfZmxhZyA9IFRSVUU7CisJfQorCisJLyogSWYgYWZ0ZXIgdGhlIGZpcnN0IHJvdywgd2UgbmVlZCB0byBhbHdheXMgYWRkIGEgbmV3bGluZSAqLworCWlmIChyb3cgPiByb3cxICYmICFMaW5lV3JhcHNbcm93IC0gMV0pCisJICAgICpidWZwKysgPSBOTDsKKworCWlmIChyb3cgPCBzY3JlZW5fUm93cyAmJiBlbmRfY29sIDw9IHNjcmVlbl9Db2x1bW5zKQorCXsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChlbmNfZGJjcyAhPSAwKQorCSAgICB7CisJCXAgPSBTY3JlZW5MaW5lcyArIExpbmVPZmZzZXRbcm93XTsKKwkJZm9yIChpID0gc3RhcnRfY29sOyBpIDwgZW5kX2NvbDsgKytpKQorCQkgICAgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBwW2ldID09IDB4OGUpCisJCSAgICB7CisJCQkvKiBzaW5nbGUtd2lkdGggZG91YmxlLWJ5dGUgY2hhciAqLworCQkJKmJ1ZnArKyA9IDB4OGU7CisJCQkqYnVmcCsrID0gU2NyZWVuTGluZXMyW0xpbmVPZmZzZXRbcm93XSArIGldOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJKmJ1ZnArKyA9IHBbaV07CisJCQlpZiAoTUJfQllURTJMRU4ocFtpXSkgPT0gMikKKwkJCSAgICAqYnVmcCsrID0gcFsrK2ldOworCQkgICAgfQorCSAgICB9CisJICAgIGVsc2UgaWYgKGVuY191dGY4KQorCSAgICB7CisJCWludAlvZmY7CisKKwkJb2ZmID0gTGluZU9mZnNldFtyb3ddOworCQlmb3IgKGkgPSBzdGFydF9jb2w7IGkgPCBlbmRfY29sOyArK2kpCisJCXsKKwkJICAgIC8qIFRoZSBiYXNlIGNoYXJhY3RlciBpcyBlaXRoZXIgaW4gU2NyZWVuTGluZXNVQ1tdIG9yCisJCSAgICAgKiBTY3JlZW5MaW5lc1tdLiAqLworCQkgICAgaWYgKFNjcmVlbkxpbmVzVUNbb2ZmICsgaV0gPT0gMCkKKwkJCSpidWZwKysgPSBTY3JlZW5MaW5lc1tvZmYgKyBpXTsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWJ1ZnAgKz0gdXRmX2NoYXIyYnl0ZXMoU2NyZWVuTGluZXNVQ1tvZmYgKyBpXSwgYnVmcCk7CisJCQlpZiAoU2NyZWVuTGluZXNDMVtvZmYgKyBpXSAhPSAwKQorCQkJeworCQkJICAgIC8qIEFkZCBvbmUgb3IgdHdvIGNvbXBvc2luZyBjaGFyYWN0ZXJzLiAqLworCQkJICAgIGJ1ZnAgKz0gdXRmX2NoYXIyYnl0ZXMoU2NyZWVuTGluZXNDMVtvZmYgKyBpXSwKKwkJCQkJCQkJCWJ1ZnApOworCQkJICAgIGlmIChTY3JlZW5MaW5lc0MyW29mZiArIGldICE9IDApCisJCQkJYnVmcCArPSB1dGZfY2hhcjJieXRlcyhTY3JlZW5MaW5lc0MyW29mZiArIGldLAorCQkJCQlidWZwKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIC8qIFNraXAgcmlnaHQgaGFsdmUgb2YgZG91YmxlLXdpZGUgY2hhcmFjdGVyLiAqLworCQkgICAgaWYgKFNjcmVlbkxpbmVzW29mZiArIGkgKyAxXSA9PSAwKQorCQkJKytpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorI2VuZGlmCisJICAgIHsKKwkJU1RSTkNQWShidWZwLCBTY3JlZW5MaW5lcyArIExpbmVPZmZzZXRbcm93XSArIHN0YXJ0X2NvbCwKKwkJCQkJCQkgZW5kX2NvbCAtIHN0YXJ0X2NvbCk7CisJCWJ1ZnAgKz0gZW5kX2NvbCAtIHN0YXJ0X2NvbDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBBZGQgYSBuZXdsaW5lIGF0IHRoZSBlbmQgaWYgdGhlIHNlbGVjdGlvbiBlbmRlZCB0aGVyZSAqLworICAgIGlmIChhZGRfbmV3bGluZV9mbGFnKQorCSpidWZwKysgPSBOTDsKKworICAgIC8qIEZpcnN0IGNsZWFudXAgYW55IG9sZCBzZWxlY3Rpb24gYW5kIGJlY29tZSB0aGUgb3duZXIuICovCisgICAgY2xpcF9mcmVlX3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKyAgICBjbGlwX293bl9zZWxlY3Rpb24oJmNsaXBfc3Rhcik7CisKKyAgICAvKiBZYW5rIHRoZSB0ZXh0IGludG8gdGhlICcqJyByZWdpc3Rlci4gKi8KKyAgICBjbGlwX3lhbmtfc2VsZWN0aW9uKE1DSEFSLCBidWZmZXIsIChsb25nKShidWZwIC0gYnVmZmVyKSwgJmNsaXBfc3Rhcik7CisKKyAgICAvKiBNYWtlIHRoZSByZWdpc3RlciBjb250ZW50cyBhdmFpbGFibGUgdG8gdGhlIG91dHNpZGUgd29ybGQuICovCisgICAgY2xpcF9nZW5fc2V0X3NlbGVjdGlvbigmY2xpcF9zdGFyKTsKKworI2lmZGVmIEZFQVRfWDExCisgICAgaWYgKGJvdGgpCisgICAgeworCS8qIERvIHRoZSBzYW1lIGZvciB0aGUgJysnIHJlZ2lzdGVyLiAqLworCWNsaXBfZnJlZV9zZWxlY3Rpb24oJmNsaXBfcGx1cyk7CisJY2xpcF9vd25fc2VsZWN0aW9uKCZjbGlwX3BsdXMpOworCWNsaXBfeWFua19zZWxlY3Rpb24oTUNIQVIsIGJ1ZmZlciwgKGxvbmcpKGJ1ZnAgLSBidWZmZXIpLCAmY2xpcF9wbHVzKTsKKwljbGlwX2dlbl9zZXRfc2VsZWN0aW9uKCZjbGlwX3BsdXMpOworICAgIH0KKyNlbmRpZgorICAgIHZpbV9mcmVlKGJ1ZmZlcik7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBvc2l0aW9ucyBvZiB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcm93IGFuZAorICogY29sdW1uLiAgT25seSB3aGl0ZS1zZXBhcmF0ZWQgd29yZHMgYXJlIHJlY29nbml6ZWQgaGVyZS4KKyAqLworI2RlZmluZSBDSEFSX0NMQVNTKGMpCShjIDw9ICcgJyA/ICcgJyA6IHZpbV9pc3dvcmRjKGMpKQorCisgICAgc3RhdGljIHZvaWQKK2NsaXBfZ2V0X3dvcmRfYm91bmRhcmllcyhjYiwgcm93LCBjb2wpCisgICAgVmltQ2xpcGJvYXJkCSpjYjsKKyAgICBpbnQJCQlyb3c7CisgICAgaW50CQkJY29sOworeworICAgIGludAkJc3RhcnRfY2xhc3M7CisgICAgaW50CQl0ZW1wX2NvbDsKKyAgICBjaGFyX3UJKnA7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGludAkJbWJvZmY7CisjZW5kaWYKKworICAgIGlmIChyb3cgPj0gc2NyZWVuX1Jvd3MgfHwgY29sID49IHNjcmVlbl9Db2x1bW5zKQorCXJldHVybjsKKworICAgIHAgPSBTY3JlZW5MaW5lcyArIExpbmVPZmZzZXRbcm93XTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogQ29ycmVjdCBmb3Igc3RhcnRpbmcgaW4gdGhlIHJpZ2h0IGhhbHZlIG9mIGEgZG91YmxlLXdpZGUgY2hhciAqLworICAgIGlmIChlbmNfZGJjcyAhPSAwKQorCWNvbCAtPSBkYmNzX3NjcmVlbl9oZWFkX29mZihwLCBwICsgY29sKTsKKyAgICBlbHNlIGlmIChlbmNfdXRmOCAmJiBwW2NvbF0gPT0gMCkKKwktLWNvbDsKKyNlbmRpZgorICAgIHN0YXJ0X2NsYXNzID0gQ0hBUl9DTEFTUyhwW2NvbF0pOworCisgICAgdGVtcF9jb2wgPSBjb2w7CisgICAgZm9yICggOyB0ZW1wX2NvbCA+IDA7IHRlbXBfY29sLS0pCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChlbmNfZGJjcyAhPSAwCisJCSAgICYmIChtYm9mZiA9IGRiY3Nfc2NyZWVuX2hlYWRfb2ZmKHAsIHAgKyB0ZW1wX2NvbCAtIDEpKSA+IDApCisJICAgIHRlbXBfY29sIC09IG1ib2ZmOworCWVsc2UKKyNlbmRpZgorCWlmIChDSEFSX0NMQVNTKHBbdGVtcF9jb2wgLSAxXSkgIT0gc3RhcnRfY2xhc3MKKyNpZmRlZiBGRUFUX01CWVRFCisJCSYmICEoZW5jX3V0ZjggJiYgcFt0ZW1wX2NvbCAtIDFdID09IDApCisjZW5kaWYKKwkJKQorCSAgICBicmVhazsKKyAgICBjYi0+d29yZF9zdGFydF9jb2wgPSB0ZW1wX2NvbDsKKworICAgIHRlbXBfY29sID0gY29sOworICAgIGZvciAoIDsgdGVtcF9jb2wgPCBzY3JlZW5fQ29sdW1uczsgdGVtcF9jb2wrKykKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGVuY19kYmNzICE9IDAgJiYgZGJjc19wdHIyY2VsbHMocCArIHRlbXBfY29sKSA9PSAyKQorCSAgICArK3RlbXBfY29sOworCWVsc2UKKyNlbmRpZgorCWlmIChDSEFSX0NMQVNTKHBbdGVtcF9jb2xdKSAhPSBzdGFydF9jbGFzcworI2lmZGVmIEZFQVRfTUJZVEUKKwkJJiYgIShlbmNfdXRmOCAmJiBwW3RlbXBfY29sXSA9PSAwKQorI2VuZGlmCisJCSkKKwkgICAgYnJlYWs7CisgICAgY2ItPndvcmRfZW5kX2NvbCA9IHRlbXBfY29sOworfQorCisvKgorICogRmluZCB0aGUgY29sdW1uIHBvc2l0aW9uIGZvciB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24gdGhlIGdpdmVuCisgKiBsaW5lLgorICovCisgICAgc3RhdGljIGludAorY2xpcF9nZXRfbGluZV9lbmQocm93KQorICAgIGludAkJcm93OworeworICAgIGludAkgICAgaTsKKworICAgIGlmIChyb3cgPj0gc2NyZWVuX1Jvd3MpCisJcmV0dXJuIDA7CisgICAgZm9yIChpID0gc2NyZWVuX0NvbHVtbnM7IGkgPiAwOyBpLS0pCisJaWYgKFNjcmVlbkxpbmVzW0xpbmVPZmZzZXRbcm93XSArIGkgLSAxXSAhPSAnICcpCisJICAgIGJyZWFrOworICAgIHJldHVybiBpOworfQorCisvKgorICogVXBkYXRlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9uIGJ5IGFkZGluZyBhbmQvb3Igc3VidHJhY3RpbmcgZnJvbSB0aGUKKyAqIGJlZ2lubmluZyBvciBlbmQgYW5kIGludmVydGluZyB0aGUgY2hhbmdlZCBhcmVhKHMpLgorICovCisgICAgc3RhdGljIHZvaWQKK2NsaXBfdXBkYXRlX21vZGVsZXNzX3NlbGVjdGlvbihjYiwgcm93MSwgY29sMSwgcm93MiwgY29sMikKKyAgICBWaW1DbGlwYm9hcmQgICAgKmNiOworICAgIGludAkJICAgIHJvdzE7CisgICAgaW50CQkgICAgY29sMTsKKyAgICBpbnQJCSAgICByb3cyOworICAgIGludAkJICAgIGNvbDI7Cit7CisgICAgLyogU2VlIGlmIHdlIGNoYW5nZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uICovCisgICAgaWYgKHJvdzEgIT0gY2ItPnN0YXJ0LmxudW0gfHwgY29sMSAhPSAoaW50KWNiLT5zdGFydC5jb2wpCisgICAgeworCWNsaXBfaW52ZXJ0X2FyZWEocm93MSwgY29sMSwgKGludCljYi0+c3RhcnQubG51bSwgY2ItPnN0YXJ0LmNvbCwKKwkJCQkJCQkJIENMSVBfVE9HR0xFKTsKKwljYi0+c3RhcnQubG51bSA9IHJvdzE7CisJY2ItPnN0YXJ0LmNvbCAgPSBjb2wxOworICAgIH0KKworICAgIC8qIFNlZSBpZiB3ZSBjaGFuZ2VkIGF0IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiAqLworICAgIGlmIChyb3cyICE9IGNiLT5lbmQubG51bSB8fCBjb2wyICE9IChpbnQpY2ItPmVuZC5jb2wpCisgICAgeworCWNsaXBfaW52ZXJ0X2FyZWEoKGludCljYi0+ZW5kLmxudW0sIGNiLT5lbmQuY29sLCByb3cyLCBjb2wyLAorCQkJCQkJCQkgQ0xJUF9UT0dHTEUpOworCWNiLT5lbmQubG51bSA9IHJvdzI7CisJY2ItPmVuZC5jb2wgID0gY29sMjsKKyAgICB9Cit9CisKKyAgICBpbnQKK2NsaXBfZ2VuX293bl9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZAkqY2JkOworeworI2lmZGVmIEZFQVRfWENMSVBCT0FSRAorIyBpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCXJldHVybiBjbGlwX21jaF9vd25fc2VsZWN0aW9uKGNiZCk7CisgICAgZWxzZQorIyBlbmRpZgorCXJldHVybiBjbGlwX3h0ZXJtX293bl9zZWxlY3Rpb24oY2JkKTsKKyNlbHNlCisgICAgcmV0dXJuIGNsaXBfbWNoX293bl9zZWxlY3Rpb24oY2JkKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorY2xpcF9nZW5fbG9zZV9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZAkqY2JkOworeworI2lmZGVmIEZFQVRfWENMSVBCT0FSRAorIyBpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorCWNsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKGNiZCk7CisgICAgZWxzZQorIyBlbmRpZgorCWNsaXBfeHRlcm1fbG9zZV9zZWxlY3Rpb24oY2JkKTsKKyNlbHNlCisgICAgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oY2JkKTsKKyNlbmRpZgorfQorCisgICAgdm9pZAorY2xpcF9nZW5fc2V0X3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisjaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisjIGlmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJY2xpcF9tY2hfc2V0X3NlbGVjdGlvbihjYmQpOworICAgIGVsc2UKKyMgZW5kaWYKKwljbGlwX3h0ZXJtX3NldF9zZWxlY3Rpb24oY2JkKTsKKyNlbHNlCisgICAgY2xpcF9tY2hfc2V0X3NlbGVjdGlvbihjYmQpOworI2VuZGlmCit9CisKKyAgICB2b2lkCitjbGlwX2dlbl9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpCisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisjaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisjIGlmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oY2JkKTsKKyAgICBlbHNlCisjIGVuZGlmCisJY2xpcF94dGVybV9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpOworI2Vsc2UKKyAgICBjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGRUFUX0NMSVBCT0FSRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGUgaW5wdXQgYnVmZmVyLgorICogVGhpcyBpcyB1c2VkIGZvciBhbnkgR1VJIHZlcnNpb24sIGFuZCB0aGUgdW5peCB0ZXJtaW5hbCB2ZXJzaW9uLgorICoKKyAqIEZvciBVbml4LCB0aGUgaW5wdXQgY2hhcmFjdGVycyBhcmUgYnVmZmVyZWQgdG8gYmUgYWJsZSB0byBjaGVjayBmb3IgYQorICogQ1RSTC1DLiAgVGhpcyBzaG91bGQgYmUgZG9uZSB3aXRoIHNpZ25hbHMsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQKKyAqIGluIGEgcG9ydGFibGUgd2F5IGZvciBhIHR0eSBpbiBSQVcgbW9kZS4KKyAqCisgKiBGb3IgdGhlIGNsaWVudC1zZXJ2ZXIgY29kZSBpbiB0aGUgY29uc29sZSB0aGUgcmVjZWl2ZWQga2V5cyBhcmUgcHV0IGluIHRoZQorICogaW5wdXQgYnVmZmVyLgorICovCisKKyNpZiBkZWZpbmVkKFVTRV9JTlBVVF9CVUYpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBJbnRlcm5hbCB0eXBlYWhlYWQgYnVmZmVyLiAgSW5jbHVkZXMgZXh0cmEgc3BhY2UgZm9yIGxvbmcga2V5IGNvZGUKKyAqIGRlc2NyaXB0aW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2Ugb3ZlcmZsb3cuICBUaGUgYnVmZmVyIGlzIGNvbnNpZGVyZWQgZnVsbAorICogd2hlbiBvbmx5IHRoaXMgZXh0cmEgc3BhY2UgKG9yIHBhcnQgb2YgaXQpIHJlbWFpbnMuCisgKi8KKyNpZiBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKSB8fCBkZWZpbmVkKEZFQVRfTkVUQkVBTlNfSU5URykgXAorCXx8IGRlZmluZWQoRkVBVF9DTElFTlRTRVJWRVIpCisgICAvKgorICAgICogU3VuIFdvcmtTaG9wIGFuZCBOZXRCZWFucyBzdHVmZiBkZWJ1Z2dlciBjb21tYW5kcyBpbnRvIHRoZSBpbnB1dCBidWZmZXIuCisgICAgKiBUaGlzIHJlcXVpcmVzIGEgbGFyZ2VyIGJ1ZmZlci4uLgorICAgICogKE1hZHNlbikgR28gd2l0aCB0aGlzIGZvciByZW1vdGUgaW5wdXQgYXMgd2VsbCAuLi4KKyAgICAqLworIyBkZWZpbmUgSU5CVUZMRU4gNDA5NgorI2Vsc2UKKyMgZGVmaW5lIElOQlVGTEVOIDI1MAorI2VuZGlmCisKK3N0YXRpYyBjaGFyX3UJaW5idWZbSU5CVUZMRU4gKyBNQVhfS0VZX0NPREVfTEVOXTsKK3N0YXRpYyBpbnQJaW5idWZjb3VudCA9IDA7CSAgICAvKiBudW1iZXIgb2YgY2hhcnMgaW4gaW5idWZbXSAqLworCisvKgorICogdmltX2lzX2lucHV0X2J1Zl9mdWxsKCksIHZpbV9pc19pbnB1dF9idWZfZW1wdHkoKSwgYWRkX3RvX2lucHV0X2J1ZigpLCBhbmQKKyAqIHRyYXNoX2lucHV0X2J1ZigpIGFyZSBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlc2UKKyAqIGFyZSB1c2VkIGJ5IHRoZSBndWlfKiBjYWxscyB3aGVuIGEgR1VJIGlzIHVzZWQgdG8gaGFuZGxlIGtleWJvYXJkIGlucHV0LgorICovCisKKyAgICBpbnQKK3ZpbV9pc19pbnB1dF9idWZfZnVsbCgpCit7CisgICAgcmV0dXJuIChpbmJ1ZmNvdW50ID49IElOQlVGTEVOKTsKK30KKworICAgIGludAordmltX2lzX2lucHV0X2J1Zl9lbXB0eSgpCit7CisgICAgcmV0dXJuIChpbmJ1ZmNvdW50ID09IDApOworfQorCisjaWYgZGVmaW5lZChGRUFUX09MRSkgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK3ZpbV9mcmVlX2luX2lucHV0X2J1ZigpCit7CisgICAgcmV0dXJuIChJTkJVRkxFTiAtIGluYnVmY291bnQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZChQUk9UTykKKyAgICBpbnQKK3ZpbV91c2VkX2luX2lucHV0X2J1ZigpCit7CisgICAgcmV0dXJuIGluYnVmY291bnQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKEZFQVRfRVhfRVhUUkEpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBidWZmZXIgYW5kIG1ha2UgaXQgZW1wdHkuCisgKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBzZXRfaW5wdXRfYnVmKCkgbGF0ZXIuCisgKi8KKyAgICBjaGFyX3UgKgorZ2V0X2lucHV0X2J1ZigpCit7CisgICAgZ2FycmF5X1QJKmdhcDsKKworICAgIC8qIFdlIHVzZSBhIGdyb3dhcnJheSB0byBzdG9yZSB0aGUgZGF0YSBwb2ludGVyIGFuZCB0aGUgbGVuZ3RoLiAqLworICAgIGdhcCA9IChnYXJyYXlfVCAqKWFsbG9jKCh1bnNpZ25lZClzaXplb2YoZ2FycmF5X1QpKTsKKyAgICBpZiAoZ2FwICE9IE5VTEwpCisgICAgeworCS8qIEFkZCBvbmUgdG8gYXZvaWQgYSB6ZXJvIHNpemUuICovCisJZ2FwLT5nYV9kYXRhID0gYWxsb2MoKHVuc2lnbmVkKWluYnVmY291bnQgKyAxKTsKKwlpZiAoZ2FwLT5nYV9kYXRhICE9IE5VTEwpCisJICAgIG1jaF9tZW1tb3ZlKGdhcC0+Z2FfZGF0YSwgaW5idWYsIChzaXplX3QpaW5idWZjb3VudCk7CisJZ2FwLT5nYV9sZW4gPSBpbmJ1ZmNvdW50OworICAgIH0KKyAgICB0cmFzaF9pbnB1dF9idWYoKTsKKyAgICByZXR1cm4gKGNoYXJfdSAqKWdhcDsKK30KKworLyoKKyAqIFJlc3RvcmUgdGhlIGlucHV0IGJ1ZmZlciB3aXRoIGEgcG9pbnRlciByZXR1cm5lZCBmcm9tIGdldF9pbnB1dF9idWYoKS4KKyAqIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZyZWVkLCB0aGlzIG9ubHkgd29ya3Mgb25jZSEKKyAqLworICAgIHZvaWQKK3NldF9pbnB1dF9idWYocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgZ2FycmF5X1QJKmdhcCA9IChnYXJyYXlfVCAqKXA7CisKKyAgICBpZiAoZ2FwICE9IE5VTEwpCisgICAgeworCWlmIChnYXAtPmdhX2RhdGEgIT0gTlVMTCkKKwl7CisJICAgIG1jaF9tZW1tb3ZlKGluYnVmLCBnYXAtPmdhX2RhdGEsIGdhcC0+Z2FfbGVuKTsKKwkgICAgaW5idWZjb3VudCA9IGdhcC0+Z2FfbGVuOworCSAgICB2aW1fZnJlZShnYXAtPmdhX2RhdGEpOworCX0KKwl2aW1fZnJlZShnYXApOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0dQTSkgXAorCXx8IGRlZmluZWQoRkVBVF9YQ0xJUEJPQVJEKSB8fCBkZWZpbmVkKFZNUykgXAorCXx8IGRlZmluZWQoRkVBVF9TTklGRikgfHwgZGVmaW5lZChGRUFUX0NMSUVOVFNFUlZFUikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBBZGQgdGhlIGdpdmVuIGJ5dGVzIHRvIHRoZSBpbnB1dCBidWZmZXIKKyAqIFNwZWNpYWwga2V5cyBzdGFydCB3aXRoIENTSS4gIEEgcmVhbCBDU0kgbXVzdCBoYXZlIGJlZW4gdHJhbnNsYXRlZCB0bworICogQ1NJIEtTX0VYVFJBIEtFX0NTSS4gIEtfU1BFQ0lBTCBkb2Vzbid0IHJlcXVpcmUgdHJhbnNsYXRpb24uCisgKi8KKyAgICB2b2lkCithZGRfdG9faW5wdXRfYnVmKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworICAgIGlmIChpbmJ1ZmNvdW50ICsgbGVuID4gSU5CVUZMRU4gKyBNQVhfS0VZX0NPREVfTEVOKQorCXJldHVybjsJICAgIC8qIFNob3VsZG4ndCBldmVyIGhhcHBlbiEgKi8KKworI2lmZGVmIEZFQVRfSEFOR1VMSU4KKyAgICBpZiAoKFN0YXRlICYgKElOU0VSVHxDTURMSU5FKSkgJiYgaGFuZ3VsX2lucHV0X3N0YXRlX2dldCgpKQorCWlmICgobGVuID0gaGFuZ3VsX2lucHV0X3Byb2Nlc3MocywgbGVuKSkgPT0gMCkKKwkgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICB3aGlsZSAobGVuLS0pCisJaW5idWZbaW5idWZjb3VudCsrXSA9ICpzKys7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKEZFQVRfWElNKSAmJiBkZWZpbmVkKEZFQVRfR1VJX0dUSykpIFwKKwl8fCAoZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEVfSU1FKSkgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQWRkICJzdHJbbGVuXSIgdG8gdGhlIGlucHV0IGJ1ZmZlciB3aGlsZSBlc2NhcGluZyBDU0kgYnl0ZXMuCisgKi8KKyAgICB2b2lkCithZGRfdG9faW5wdXRfYnVmX2NzaShjaGFyX3UgKnN0ciwgaW50IGxlbikKK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CWJ1ZlsyXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICB7CisJYWRkX3RvX2lucHV0X2J1ZihzdHIgKyBpLCAxKTsKKwlpZiAoc3RyW2ldID09IENTSSkKKwl7CisJICAgIC8qIFR1cm4gQ1NJIGludG8gS19DU0kuICovCisJICAgIGJ1ZlswXSA9IEtTX0VYVFJBOworCSAgICBidWZbMV0gPSAoaW50KUtFX0NTSTsKKwkgICAgYWRkX3RvX2lucHV0X2J1ZihidWYsIDIpOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9IQU5HVUxJTikgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitwdXNoX3Jhd19rZXkgKHMsIGxlbikKKyAgICBjaGFyX3UgICpzOworICAgIGludAkgICAgbGVuOworeworICAgIHdoaWxlIChsZW4tLSkKKwlpbmJ1ZltpbmJ1ZmNvdW50KytdID0gKnMrKzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoRkVBVF9FWF9FWFRSQSkgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKiBSZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICBDYWxsZWQgd2hlbiBeQyBpcyBmb3VuZCAqLworICAgIHZvaWQKK3RyYXNoX2lucHV0X2J1ZigpCit7CisgICAgaW5idWZjb3VudCA9IDA7Cit9CisjZW5kaWYKKworLyoKKyAqIFJlYWQgYXMgbXVjaCBkYXRhIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhcyBwb3NzaWJsZSB1cCB0byBtYXhsZW4sIGFuZCBzdG9yZQorICogaXQgaW4gYnVmLgorICogTm90ZTogdGhpcyBmdW5jdGlvbiB1c2VkIHRvIGJlIFJlYWQoKSBpbiB1bml4LmMKKyAqLworICAgIGludAorcmVhZF9mcm9tX2lucHV0X2J1ZihidWYsIG1heGxlbikKKyAgICBjaGFyX3UgICpidWY7CisgICAgbG9uZyAgICBtYXhsZW47Cit7CisgICAgaWYgKGluYnVmY291bnQgPT0gMCkJLyogaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSwgZmlsbCBpdCAqLworCWZpbGxfaW5wdXRfYnVmKFRSVUUpOworICAgIGlmIChtYXhsZW4gPiBpbmJ1ZmNvdW50KQorCW1heGxlbiA9IGluYnVmY291bnQ7CisgICAgbWNoX21lbW1vdmUoYnVmLCBpbmJ1ZiwgKHNpemVfdCltYXhsZW4pOworICAgIGluYnVmY291bnQgLT0gbWF4bGVuOworICAgIGlmIChpbmJ1ZmNvdW50KQorCW1jaF9tZW1tb3ZlKGluYnVmLCBpbmJ1ZiArIG1heGxlbiwgKHNpemVfdClpbmJ1ZmNvdW50KTsKKyAgICByZXR1cm4gKGludCltYXhsZW47Cit9CisKKyAgICB2b2lkCitmaWxsX2lucHV0X2J1ZihleGl0X29uX2Vycm9yKQorICAgIGludAlleGl0X29uX2Vycm9yOworeworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCXRyeTsKKyAgICBzdGF0aWMgaW50CWRpZF9yZWFkX3NvbWV0aGluZyA9IEZBTFNFOworIyBpZmRlZiBGRUFUX01CWVRFCisgICAgc3RhdGljIGNoYXJfdSAqcmVzdCA9IE5VTEw7CSAgICAvKiB1bmNvbnZlcnRlZCByZXN0IG9mIHByZXZpb3VzIHJlYWQgKi8KKyAgICBzdGF0aWMgaW50CXJlc3RsZW4gPSAwOworICAgIGludAkJdW5jb252ZXJ0ZWQ7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCWd1aV9tY2hfdXBkYXRlKCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyAgICBpZiAodmltX2lzX2lucHV0X2J1Zl9mdWxsKCkpCisJcmV0dXJuOworICAgIC8qCisgICAgICogRmlsbF9pbnB1dF9idWYoKSBpcyBvbmx5IGNhbGxlZCB3aGVuIHdlIHJlYWxseSBuZWVkIGEgY2hhcmFjdGVyLgorICAgICAqIElmIHdlIGNhbid0IGdldCBhbnksIGJ1dCB0aGVyZSBpcyBzb21lIGluIHRoZSBidWZmZXIsIGp1c3QgcmV0dXJuLgorICAgICAqIElmIHdlIGNhbid0IGdldCBhbnksIGFuZCB0aGVyZSBpc24ndCBhbnkgaW4gdGhlIGJ1ZmZlciwgd2UgZ2l2ZSB1cCBhbmQKKyAgICAgKiBleGl0IFZpbS4KKyAgICAgKi8KKyMgaWZkZWYgX19CRU9TX18KKyAgICAvKgorICAgICAqIE9uIHRoZSBCZUJveCB2ZXJzaW9uIChmb3Igbm93KSwgYWxsIGlucHV0IGlzIHNlY3JldGx5IHBlcmZvcm1lZCB3aXRoaW4KKyAgICAgKiBiZW9zX3NlbGVjdCgpIHdoaWNoIGlzIGNhbGxlZCBmcm9tIFJlYWxXYWl0Rm9yQ2hhcigpLgorICAgICAqLworICAgIHdoaWxlICghdmltX2lzX2lucHV0X2J1Zl9mdWxsKCkgJiYgUmVhbFdhaXRGb3JDaGFyKHJlYWRfY21kX2ZkLCAwLCBOVUxMKSkKKwkgICAgOworICAgIGxlbiA9IGluYnVmY291bnQ7CisgICAgaW5idWZjb3VudCA9IDA7CisjIGVsc2UKKworIyAgaWZkZWYgRkVBVF9TTklGRgorICAgIGlmIChzbmlmZl9yZXF1ZXN0X3dhaXRpbmcpCisgICAgeworCWFkZF90b19pbnB1dF9idWYoKGNoYXJfdSAqKSJcMjMzc25pZmYiLDYpOyAvKiByZXN1bHRzIGluIEtfU05JRkYgKi8KKwlzbmlmZl9yZXF1ZXN0X3dhaXRpbmcgPSAwOworCXdhbnRfc25pZmZfcmVxdWVzdCA9IDA7CisJcmV0dXJuOworICAgIH0KKyMgIGVuZGlmCisKKyMgaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChyZXN0ICE9IE5VTEwpCisgICAgeworCS8qIFVzZSByZW1haW5kZXIgb2YgcHJldmlvdXMgY2FsbCwgc3RhcnRzIHdpdGggYW4gaW52YWxpZCBjaGFyYWN0ZXIKKwkgKiB0aGF0IG1heSBiZWNvbWUgdmFsaWQgd2hlbiByZWFkaW5nIG1vcmUuICovCisJaWYgKHJlc3RsZW4gPiBJTkJVRkxFTiAtIGluYnVmY291bnQpCisJICAgIHVuY29udmVydGVkID0gSU5CVUZMRU4gLSBpbmJ1ZmNvdW50OworCWVsc2UKKwkgICAgdW5jb252ZXJ0ZWQgPSByZXN0bGVuOworCW1jaF9tZW1tb3ZlKGluYnVmICsgaW5idWZjb3VudCwgcmVzdCwgdW5jb252ZXJ0ZWQpOworCWlmICh1bmNvbnZlcnRlZCA9PSByZXN0bGVuKQorCXsKKwkgICAgdmltX2ZyZWUocmVzdCk7CisJICAgIHJlc3QgPSBOVUxMOworCX0KKwllbHNlCisJeworCSAgICByZXN0bGVuIC09IHVuY29udmVydGVkOworCSAgICBtY2hfbWVtbW92ZShyZXN0LCByZXN0ICsgdW5jb252ZXJ0ZWQsIHJlc3RsZW4pOworCX0KKwlpbmJ1ZmNvdW50ICs9IHVuY29udmVydGVkOworICAgIH0KKyAgICBlbHNlCisJdW5jb252ZXJ0ZWQgPSAwOworI2VuZGlmCisKKyAgICBsZW4gPSAwOwkvKiB0byBhdm9pZCBnY2Mgd2FybmluZyAqLworICAgIGZvciAodHJ5ID0gMDsgdHJ5IDwgMTAwOyArK3RyeSkKKyAgICB7CisjICBpZmRlZiBWTVMKKwlsZW4gPSB2bXNfcmVhZCgKKyMgIGVsc2UKKwlsZW4gPSByZWFkKHJlYWRfY21kX2ZkLAorIyAgZW5kaWYKKwkgICAgKGNoYXIgKilpbmJ1ZiArIGluYnVmY291bnQsIChzaXplX3QpKChJTkJVRkxFTiAtIGluYnVmY291bnQpCisjICBpZmRlZiBGRUFUX01CWVRFCisJCS8gaW5wdXRfY29udi52Y19mYWN0b3IKKyMgIGVuZGlmCisJCSkpOworIyAgaWYgMAorCQkpCS8qIGF2b2lkIHN5bnRheCBoaWdobGlnaHQgZXJyb3IgKi8KKyMgIGVuZGlmCisJaWYgKGxlbiA+IDAgfHwgZ290X2ludCkKKwkgICAgYnJlYWs7CisJLyoKKwkgKiBJZiByZWFkaW5nIHN0ZGluIHJlc3VsdHMgaW4gYW4gZXJyb3IsIGNvbnRpbnVlIHJlYWRpbmcgc3RkZXJyLgorCSAqIFRoaXMgaGVscHMgd2hlbiB1c2luZyAiZm9vIHwgeGFyZ3MgdmltIi4KKwkgKi8KKwlpZiAoIWRpZF9yZWFkX3NvbWV0aGluZyAmJiAhaXNhdHR5KHJlYWRfY21kX2ZkKSAmJiByZWFkX2NtZF9mZCA9PSAwKQorCXsKKwkgICAgaW50IG0gPSBjdXJfdG1vZGU7CisKKwkgICAgLyogV2UgcHJvYmFibHkgc2V0IHRoZSB3cm9uZyBmaWxlIGRlc2NyaXB0b3IgdG8gcmF3IG1vZGUuICBTd2l0Y2gKKwkgICAgICogYmFjayB0byBjb29rZWQgbW9kZSwgdXNlIGFub3RoZXIgZGVzY3JpcHRvciBhbmQgc2V0IHRoZSBtb2RlIHRvCisJICAgICAqIHdoYXQgaXQgd2FzLiAqLworCSAgICBzZXR0bW9kZShUTU9ERV9DT09LKTsKKyNpZmRlZiBIQVZFX0RVUAorCSAgICAvKiBVc2Ugc3RkZXJyIGZvciBzdGRpbiwgYWxzbyB3b3JrcyBmb3Igc2hlbGwgY29tbWFuZHMuICovCisJICAgIGNsb3NlKDApOworCSAgICBkdXAoMik7CisjZWxzZQorCSAgICByZWFkX2NtZF9mZCA9IDI7CS8qIHJlYWQgZnJvbSBzdGRlcnIgaW5zdGVhZCBvZiBzdGRpbiAqLworI2VuZGlmCisJICAgIHNldHRtb2RlKG0pOworCX0KKwlpZiAoIWV4aXRfb25fZXJyb3IpCisJICAgIHJldHVybjsKKyAgICB9CisjIGVuZGlmCisgICAgaWYgKGxlbiA8PSAwICYmICFnb3RfaW50KQorCXJlYWRfZXJyb3JfZXhpdCgpOworICAgIGlmIChsZW4gPiAwKQorCWRpZF9yZWFkX3NvbWV0aGluZyA9IFRSVUU7CisgICAgaWYgKGdvdF9pbnQpCisgICAgeworCS8qIEludGVycnVwdGVkLCBwcmV0ZW5kIGEgQ1RSTC1DIHdhcyB0eXBlZC4gKi8KKwlpbmJ1ZlswXSA9IDM7CisJaW5idWZjb3VudCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjIGlmZGVmIEZFQVRfTUJZVEUKKwkvKgorCSAqIE1heSBwZXJmb3JtIGNvbnZlcnNpb24gb24gdGhlIGlucHV0IGNoYXJhY3RlcnMuCisJICogSW5jbHVkZSB0aGUgdW5jb252ZXJ0ZWQgcmVzdCBvZiB0aGUgcHJldmlvdXMgY2FsbC4KKwkgKiBJZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIGNoYXIgYXQgdGhlIGVuZCBpdCBpcyBrZXB0IGZvciB0aGUgbmV4dAorCSAqIHRpbWUsIHJlYWRpbmcgbW9yZSBieXRlcyBzaG91bGQgbWFrZSBjb252ZXJzaW9uIHBvc3NpYmxlLgorCSAqIERvbid0IGRvIHRoaXMgaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgdGhlIGlucHV0IGJ1ZmZlciBpcyB0b28KKwkgKiBzbWFsbCAoInJlc3QiIHN0aWxsIGNvbnRhaW5zIG1vcmUgYnl0ZXMpLgorCSAqLworCWlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgaW5idWZjb3VudCAtPSB1bmNvbnZlcnRlZDsKKwkgICAgbGVuID0gY29udmVydF9pbnB1dF9zYWZlKGluYnVmICsgaW5idWZjb3VudCwKKwkJCQkgICAgIGxlbiArIHVuY29udmVydGVkLCBJTkJVRkxFTiAtIGluYnVmY291bnQsCisJCQkJICAgICAgIHJlc3QgPT0gTlVMTCA/ICZyZXN0IDogTlVMTCwgJnJlc3RsZW4pOworCX0KKyMgZW5kaWYKKwl3aGlsZSAobGVuLS0gPiAwKQorCXsKKwkgICAgLyoKKwkgICAgICogaWYgYSBDVFJMLUMgd2FzIHR5cGVkLCByZW1vdmUgaXQgZnJvbSB0aGUgYnVmZmVyIGFuZCBzZXQgZ290X2ludAorCSAgICAgKi8KKwkgICAgaWYgKGluYnVmW2luYnVmY291bnRdID09IDMgJiYgY3RybF9jX2ludGVycnVwdHMpCisJICAgIHsKKwkJLyogcmVtb3ZlIGV2ZXJ5dGhpbmcgdHlwZWQgYmVmb3JlIHRoZSBDVFJMLUMgKi8KKwkJbWNoX21lbW1vdmUoaW5idWYsIGluYnVmICsgaW5idWZjb3VudCwgKHNpemVfdCkobGVuICsgMSkpOworCQlpbmJ1ZmNvdW50ID0gMDsKKwkJZ290X2ludCA9IFRSVUU7CisJICAgIH0KKwkgICAgKytpbmJ1ZmNvdW50OworCX0KKyAgICB9CisjZW5kaWYgLyogVU5JWCBvciBPUzIgb3IgVk1TKi8KK30KKyNlbmRpZiAvKiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoT1MyKSAgfHwgZGVmaW5lZChWTVMpICovCisKKy8qCisgKiBFeGl0IGJlY2F1c2Ugb2YgYW4gaW5wdXQgcmVhZCBlcnJvci4KKyAqLworICAgIHZvaWQKK3JlYWRfZXJyb3JfZXhpdCgpCit7CisgICAgaWYgKHNpbGVudF9tb2RlKQkvKiBOb3JtYWwgd2F5IHRvIGV4aXQgZm9yICJleCAtcyIgKi8KKwlnZXRvdXQoMCk7CisgICAgU1RSQ1BZKElPYnVmZiwgXygiVmltOiBFcnJvciByZWFkaW5nIGlucHV0LCBleGl0aW5nLi4uXG4iKSk7CisgICAgcHJlc2VydmVfZXhpdCgpOworfQorCisjaWYgZGVmaW5lZChDVVJTT1JfU0hBUEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogTWF5IHVwZGF0ZSB0aGUgc2hhcGUgb2YgdGhlIGN1cnNvci4KKyAqLworICAgIHZvaWQKK3VpX2N1cnNvcl9zaGFwZSgpCit7CisjIGlmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJZ3VpX3VwZGF0ZV9jdXJzb3JfbGF0ZXIoKTsKKyMgZW5kaWYKKyMgaWZkZWYgTUNIX0NVUlNPUl9TSEFQRQorICAgIG1jaF91cGRhdGVfY3Vyc29yKCk7CisjIGVuZGlmCit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoRkVBVF9SSUdIVExFRlQpIFwKKwl8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENoZWNrIGJvdW5kcyBmb3IgY29sdW1uIG51bWJlcgorICovCisgICAgaW50CitjaGVja19jb2woY29sKQorICAgIGludAkgICAgY29sOworeworICAgIGlmIChjb2wgPCAwKQorCXJldHVybiAwOworICAgIGlmIChjb2wgPj0gKGludClzY3JlZW5fQ29sdW1ucykKKwlyZXR1cm4gKGludClzY3JlZW5fQ29sdW1ucyAtIDE7CisgICAgcmV0dXJuIGNvbDsKK30KKworLyoKKyAqIENoZWNrIGJvdW5kcyBmb3Igcm93IG51bWJlcgorICovCisgICAgaW50CitjaGVja19yb3cocm93KQorICAgIGludAkgICAgcm93OworeworICAgIGlmIChyb3cgPCAwKQorCXJldHVybiAwOworICAgIGlmIChyb3cgPj0gKGludClzY3JlZW5fUm93cykKKwlyZXR1cm4gKGludClzY3JlZW5fUm93cyAtIDE7CisgICAgcmV0dXJuIHJvdzsKK30KKyNlbmRpZgorCisvKgorICogU3R1ZmYgZm9yIHRoZSBYIGNsaXBib2FyZC4gIFNoYXJlZCBiZXR3ZWVuIFZNUyBhbmQgVW5peC4KKyAqLworCisjaWYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpIHx8IGRlZmluZWQoRkVBVF9HVUlfWDExKSB8fCBkZWZpbmVkKFBST1RPKQorIyBpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyMgaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorCisvKgorICogT3BlbiB0aGUgYXBwbGljYXRpb24gY29udGV4dCAoaWYgaXQgaGFzbid0IGJlZW4gb3BlbmVkIHlldCkuCisgKiBVc2VkIGZvciBNb3RpZiBhbmQgQXRoZW5hIEdVSSBhbmQgdGhlIHh0ZXJtIGNsaXBib2FyZC4KKyAqLworICAgIHZvaWQKK29wZW5fYXBwX2NvbnRleHQoKQoreworICAgIGlmIChhcHBfY29udGV4dCA9PSBOVUxMKQorICAgIHsKKwlYdFRvb2xraXRJbml0aWFsaXplKCk7CisJYXBwX2NvbnRleHQgPSBYdENyZWF0ZUFwcGxpY2F0aW9uQ29udGV4dCgpOworICAgIH0KK30KKworc3RhdGljIEF0b20JdmltX2F0b207CS8qIFZpbSdzIG93biBzcGVjaWFsIHNlbGVjdGlvbiBmb3JtYXQgKi8KKyNpZmRlZiBGRUFUX01CWVRFCitzdGF0aWMgQXRvbQl2aW1lbmNfYXRvbTsJLyogVmltJ3MgZXh0ZW5kZWQgc2VsZWN0aW9uIGZvcm1hdCAqLworI2VuZGlmCitzdGF0aWMgQXRvbQljb21wb3VuZF90ZXh0X2F0b207CitzdGF0aWMgQXRvbQl0ZXh0X2F0b207CitzdGF0aWMgQXRvbQl0YXJnZXRzX2F0b207CisKKyAgICB2b2lkCit4MTFfc2V0dXBfYXRvbXMoZHB5KQorICAgIERpc3BsYXkJKmRweTsKK3sKKyAgICB2aW1fYXRvbQkgICAgICAgPSBYSW50ZXJuQXRvbShkcHksIFZJTV9BVE9NX05BTUUsICAgRmFsc2UpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1lbmNfYXRvbQkgICAgICAgPSBYSW50ZXJuQXRvbShkcHksIFZJTUVOQ19BVE9NX05BTUUsRmFsc2UpOworI2VuZGlmCisgICAgY29tcG91bmRfdGV4dF9hdG9tID0gWEludGVybkF0b20oZHB5LCAiQ09NUE9VTkRfVEVYVCIsIEZhbHNlKTsKKyAgICB0ZXh0X2F0b20JICAgICAgID0gWEludGVybkF0b20oZHB5LCAiVEVYVCIsCSAgIEZhbHNlKTsKKyAgICB0YXJnZXRzX2F0b20gICAgICAgPSBYSW50ZXJuQXRvbShkcHksICJUQVJHRVRTIiwgICAgICAgRmFsc2UpOworICAgIGNsaXBfc3Rhci5zZWxfYXRvbSA9IFhBX1BSSU1BUlk7CisgICAgY2xpcF9wbHVzLnNlbF9hdG9tID0gWEludGVybkF0b20oZHB5LCAiQ0xJUEJPQVJEIiwgICAgIEZhbHNlKTsKK30KKworLyoKKyAqIFggU2VsZWN0aW9uIHN0dWZmLCBmb3IgY3V0dGluZyBhbmQgcGFzdGluZyB0ZXh0IHRvIG90aGVyIHdpbmRvd3MuCisgKi8KKworc3RhdGljIHZvaWQgIGNsaXBfeDExX3JlcXVlc3Rfc2VsZWN0aW9uX2NiIF9fQVJHUygoV2lkZ2V0LCBYdFBvaW50ZXIsIEF0b20gKiwgQXRvbSAqLCBYdFBvaW50ZXIsIGxvbmdfdSAqLCBpbnQgKikpOworCisvKiBBUkdTVVNFRCAqLworICAgIHN0YXRpYyB2b2lkCitjbGlwX3gxMV9yZXF1ZXN0X3NlbGVjdGlvbl9jYih3LCBzdWNjZXNzLCBzZWxfYXRvbSwgdHlwZSwgdmFsdWUsIGxlbmd0aCwKKwkJCSAgICAgIGZvcm1hdCkKKyAgICBXaWRnZXQJdzsKKyAgICBYdFBvaW50ZXIJc3VjY2VzczsKKyAgICBBdG9tCSpzZWxfYXRvbTsKKyAgICBBdG9tCSp0eXBlOworICAgIFh0UG9pbnRlcgl2YWx1ZTsKKyAgICBsb25nX3UJKmxlbmd0aDsKKyAgICBpbnQJCSpmb3JtYXQ7Cit7CisgICAgaW50CQltb3Rpb25fdHlwZTsKKyAgICBsb25nX3UJbGVuOworICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyCSoqdGV4dF9saXN0ID0gTlVMTDsKKyAgICBWaW1DbGlwYm9hcmQJKmNiZDsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgY2hhcl91CSp0bXBidWYgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoKnNlbF9hdG9tID09IGNsaXBfcGx1cy5zZWxfYXRvbSkKKwljYmQgPSAmY2xpcF9wbHVzOworICAgIGVsc2UKKwljYmQgPSAmY2xpcF9zdGFyOworCisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgKmxlbmd0aCA9PSAwKQorICAgIHsKKwljbGlwX2ZyZWVfc2VsZWN0aW9uKGNiZCk7CS8qID8/PyAgW3doYXQncyB0aGUgcXVlcnk/XSAqLworCSooaW50ICopc3VjY2VzcyA9IEZBTFNFOworCXJldHVybjsKKyAgICB9CisgICAgbW90aW9uX3R5cGUgPSBNQ0hBUjsKKyAgICBwID0gKGNoYXJfdSAqKXZhbHVlOworICAgIGxlbiA9ICpsZW5ndGg7CisgICAgaWYgKCp0eXBlID09IHZpbV9hdG9tKQorICAgIHsKKwltb3Rpb25fdHlwZSA9ICpwKys7CisJbGVuLS07CisgICAgfQorCisjaWZkZWYgRkVBVF9NQllURQorICAgIGVsc2UgaWYgKCp0eXBlID09IHZpbWVuY19hdG9tKQorICAgIHsKKwljaGFyX3UJCSplbmM7CisJdmltY29udl9UCWNvbnY7CisJaW50CQljb252bGVuOworCisJbW90aW9uX3R5cGUgPSAqcCsrOworCS0tbGVuOworCisJZW5jID0gcDsKKwlwICs9IFNUUkxFTihwKSArIDE7CisJbGVuIC09IHAgLSBlbmM7CisKKwkvKiBJZiB0aGUgZW5jb2Rpbmcgb2YgdGhlIHRleHQgaXMgZGlmZmVyZW50IGZyb20gJ2VuY29kaW5nJywgYXR0ZW1wdAorCSAqIGNvbnZlcnRpbmcgaXQuICovCisJY29udi52Y190eXBlID0gQ09OVl9OT05FOworCWNvbnZlcnRfc2V0dXAoJmNvbnYsIGVuYywgcF9lbmMpOworCWlmIChjb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQorCXsKKwkgICAgY29udmxlbiA9IGxlbjsJLyogTmVlZCB0byB1c2UgYW4gaW50IGhlcmUuICovCisJICAgIHRtcGJ1ZiA9IHN0cmluZ19jb252ZXJ0KCZjb252LCBwLCAmY29udmxlbik7CisJICAgIGxlbiA9IGNvbnZsZW47CisJICAgIGlmICh0bXBidWYgIT0gTlVMTCkKKwkJcCA9IHRtcGJ1ZjsKKwkgICAgY29udmVydF9zZXR1cCgmY29udiwgTlVMTCwgTlVMTCk7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgZWxzZSBpZiAoKnR5cGUgPT0gY29tcG91bmRfdGV4dF9hdG9tIHx8ICgKKyNpZmRlZiBGRUFUX01CWVRFCisJCWVuY19kYmNzICE9IDAgJiYKKyNlbmRpZgorCQkqdHlwZSA9PSB0ZXh0X2F0b20pKQorICAgIHsKKwlYVGV4dFByb3BlcnR5CXRleHRfcHJvcDsKKwlpbnQJCW5fdGV4dCA9IDA7CisJaW50CQlzdGF0dXM7CisKKwl0ZXh0X3Byb3AudmFsdWUgPSAodW5zaWduZWQgY2hhciAqKXZhbHVlOworCXRleHRfcHJvcC5lbmNvZGluZyA9ICp0eXBlOworCXRleHRfcHJvcC5mb3JtYXQgPSAqZm9ybWF0OworCXRleHRfcHJvcC5uaXRlbXMgPSBTVFJMRU4odmFsdWUpOworCXN0YXR1cyA9IFhtYlRleHRQcm9wZXJ0eVRvVGV4dExpc3QoWF9ESVNQTEFZLCAmdGV4dF9wcm9wLAorCQkJCQkJCSAmdGV4dF9saXN0LCAmbl90ZXh0KTsKKwlpZiAoc3RhdHVzICE9IFN1Y2Nlc3MgfHwgbl90ZXh0IDwgMSkKKwl7CisJICAgICooaW50ICopc3VjY2VzcyA9IEZBTFNFOworCSAgICByZXR1cm47CisJfQorCXAgPSAoY2hhcl91ICopdGV4dF9saXN0WzBdOworCWxlbiA9IFNUUkxFTihwKTsKKyAgICB9CisgICAgY2xpcF95YW5rX3NlbGVjdGlvbihtb3Rpb25fdHlwZSwgcCwgKGxvbmcpbGVuLCBjYmQpOworCisgICAgaWYgKHRleHRfbGlzdCAhPSBOVUxMKQorCVhGcmVlU3RyaW5nTGlzdCh0ZXh0X2xpc3QpOworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICB2aW1fZnJlZSh0bXBidWYpOworI2VuZGlmCisgICAgWHRGcmVlKChjaGFyICopdmFsdWUpOworICAgICooaW50ICopc3VjY2VzcyA9IFRSVUU7Cit9CisKKyAgICB2b2lkCitjbGlwX3gxMV9yZXF1ZXN0X3NlbGVjdGlvbihteVNoZWxsLCBkcHksIGNiZCkKKyAgICBXaWRnZXQJbXlTaGVsbDsKKyAgICBEaXNwbGF5CSpkcHk7CisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisgICAgWEV2ZW50CWV2ZW50OworICAgIEF0b20JdHlwZTsKKyAgICBzdGF0aWMgaW50CXN1Y2Nlc3M7CisgICAgaW50CQlpOworICAgIGludAkJbmJ5dGVzID0gMDsKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKworICAgIGZvciAoaSA9CisjaWZkZWYgRkVBVF9NQllURQorCSAgICAwCisjZWxzZQorCSAgICAxCisjZW5kaWYKKwkgICAgOyBpIDwgNTsgaSsrKQorICAgIHsKKwlzd2l0Y2ggKGkpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgY2FzZSAwOiAgdHlwZSA9IHZpbWVuY19hdG9tOwlicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIDE6ICB0eXBlID0gdmltX2F0b207CQlicmVhazsKKwkgICAgY2FzZSAyOiAgdHlwZSA9IGNvbXBvdW5kX3RleHRfYXRvbTsgYnJlYWs7CisJICAgIGNhc2UgMzogIHR5cGUgPSB0ZXh0X2F0b207CQlicmVhazsKKwkgICAgZGVmYXVsdDogdHlwZSA9IFhBX1NUUklORzsKKwl9CisJWHRHZXRTZWxlY3Rpb25WYWx1ZShteVNoZWxsLCBjYmQtPnNlbF9hdG9tLCB0eXBlLAorCSAgICBjbGlwX3gxMV9yZXF1ZXN0X3NlbGVjdGlvbl9jYiwgKFh0UG9pbnRlcikmc3VjY2VzcywgQ3VycmVudFRpbWUpOworCisJLyogTWFrZSBzdXJlIHRoZSByZXF1ZXN0IGZvciB0aGUgc2VsZWN0aW9uIGdvZXMgb3V0IGJlZm9yZSB3YWl0aW5nIGZvcgorCSAqIGEgcmVzcG9uc2UuICovCisJWEZsdXNoKGRweSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHJlc3VsdCBvZiBzZWxlY3Rpb24gcmVxdWVzdCwgb3RoZXJ3aXNlIGlmIHdlIHR5cGUgbW9yZQorCSAqIGNoYXJhY3RlcnMsIHRoZW4gdGhleSB3aWxsIGFwcGVhciBiZWZvcmUgdGhlIG9uZSB0aGF0IHJlcXVlc3RlZCB0aGUKKwkgKiBwYXN0ZSEgIERvbid0IHdvcnJ5LCB3ZSB3aWxsIGNhdGNoIHVwIHdpdGggYW55IG90aGVyIGV2ZW50cyBsYXRlci4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKFhDaGVja1R5cGVkRXZlbnQoZHB5LCBTZWxlY3Rpb25Ob3RpZnksICZldmVudCkpCisJCWJyZWFrOworCisJICAgIC8qIERvIHdlIG5lZWQgdGhpcz8gIFByb2JhYmx5IG5vdC4gKi8KKwkgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisKKwkgICAgLyogQmVybmhhcmQgV2FsbGUgc29sdmVkIGEgc2xvdyBwYXN0ZSByZXNwb25zZSBpbiBhbiBYIHRlcm1pbmFsIGJ5CisJICAgICAqIGFkZGluZzogdXNsZWVwKDEwMDAwKTsgaGVyZS4gKi8KKwl9CisKKwkvKiB0aGlzIGlzIHdoZXJlIGNsaXBfeDExX3JlcXVlc3Rfc2VsZWN0aW9uX2NiKCkgaXMgYWN0dWFsbHkgY2FsbGVkICovCisJWHREaXNwYXRjaEV2ZW50KCZldmVudCk7CisKKwlpZiAoc3VjY2VzcykKKwkgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEZpbmFsIGZhbGxiYWNrIHBvc2l0aW9uIC0gdXNlIHRoZSBYIENVVF9CVUZGRVIwIHN0b3JlICovCisgICAgYnVmZmVyID0gKGNoYXJfdSAqKVhGZXRjaEJ1ZmZlcihkcHksICZuYnl0ZXMsIDApOworICAgIGlmIChuYnl0ZXMgPiAwKQorICAgIHsKKwkvKiBHb3Qgc29tZXRoaW5nICovCisJY2xpcF95YW5rX3NlbGVjdGlvbihNQ0hBUiwgYnVmZmVyLCAobG9uZyluYnl0ZXMsIGNiZCk7CisJWEZyZWUoKHZvaWQgKilidWZmZXIpOworCWlmIChwX3ZlcmJvc2UgPiAwKQorCSAgICBzbXNnKChjaGFyX3UgKilfKCJVc2VkIENVVF9CVUZGRVIwIGluc3RlYWQgb2YgZW1wdHkgc2VsZWN0aW9uIikgKTsKKyAgICB9Cit9CisKK3N0YXRpYyBCb29sZWFuCWNsaXBfeDExX2NvbnZlcnRfc2VsZWN0aW9uX2NiIF9fQVJHUygoV2lkZ2V0LCBBdG9tICosIEF0b20gKiwgQXRvbSAqLCBYdFBvaW50ZXIgKiwgbG9uZ191ICosIGludCAqKSk7CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIEJvb2xlYW4KK2NsaXBfeDExX2NvbnZlcnRfc2VsZWN0aW9uX2NiKHcsIHNlbF9hdG9tLCB0YXJnZXQsIHR5cGUsIHZhbHVlLCBsZW5ndGgsIGZvcm1hdCkKKyAgICBXaWRnZXQJdzsKKyAgICBBdG9tCSpzZWxfYXRvbTsKKyAgICBBdG9tCSp0YXJnZXQ7CisgICAgQXRvbQkqdHlwZTsKKyAgICBYdFBvaW50ZXIJKnZhbHVlOworICAgIGxvbmdfdQkqbGVuZ3RoOworICAgIGludAkJKmZvcm1hdDsKK3sKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBjaGFyX3UJKnJlc3VsdDsKKyAgICBpbnQJCW1vdGlvbl90eXBlOworICAgIFZpbUNsaXBib2FyZAkqY2JkOworICAgIGludAkJaTsKKworICAgIGlmICgqc2VsX2F0b20gPT0gY2xpcF9wbHVzLnNlbF9hdG9tKQorCWNiZCA9ICZjbGlwX3BsdXM7CisgICAgZWxzZQorCWNiZCA9ICZjbGlwX3N0YXI7CisKKyAgICBpZiAoIWNiZC0+b3duZWQpCisJcmV0dXJuIEZhbHNlOwkgICAgLyogU2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisKKyAgICAvKiByZXF1ZXN0b3Igd2FudHMgdG8ga25vdyB3aGF0IHRhcmdldCB0eXBlcyB3ZSBzdXBwb3J0ICovCisgICAgaWYgKCp0YXJnZXQgPT0gdGFyZ2V0c19hdG9tKQorICAgIHsKKwlBdG9tICphcnJheTsKKworCWlmICgoYXJyYXkgPSAoQXRvbSAqKVh0TWFsbG9jKCh1bnNpZ25lZCkoc2l6ZW9mKEF0b20pICogNikpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gRmFsc2U7CisJKnZhbHVlID0gKFh0UG9pbnRlcilhcnJheTsKKwlpID0gMDsKKwlhcnJheVtpKytdID0gWEFfU1RSSU5HOworCWFycmF5W2krK10gPSB0YXJnZXRzX2F0b207CisjaWZkZWYgRkVBVF9NQllURQorCWFycmF5W2krK10gPSB2aW1lbmNfYXRvbTsKKyNlbmRpZgorCWFycmF5W2krK10gPSB2aW1fYXRvbTsKKwlhcnJheVtpKytdID0gdGV4dF9hdG9tOworCWFycmF5W2krK10gPSBjb21wb3VuZF90ZXh0X2F0b207CisJKnR5cGUgPSBYQV9BVE9NOworCS8qIFRoaXMgdXNlZCB0byBiZTogKmZvcm1hdCA9IHNpemVvZihBdG9tKSAqIDg7IGJ1dCB0aGF0IGNhdXNlZAorCSAqIGNyYXNoZXMgb24gNjQgYml0IG1hY2hpbmVzLiAoUGV0ZXIgRGVycikgKi8KKwkqZm9ybWF0ID0gMzI7CisJKmxlbmd0aCA9IGk7CisJcmV0dXJuIFRydWU7CisgICAgfQorCisgICAgaWYgKCAgICAgICAqdGFyZ2V0ICE9IFhBX1NUUklORworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgJiYgKnRhcmdldCAhPSB2aW1lbmNfYXRvbQorI2VuZGlmCisJICAgICYmICp0YXJnZXQgIT0gdmltX2F0b20KKwkgICAgJiYgKnRhcmdldCAhPSB0ZXh0X2F0b20KKwkgICAgJiYgKnRhcmdldCAhPSBjb21wb3VuZF90ZXh0X2F0b20pCisJcmV0dXJuIEZhbHNlOworCisgICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CisgICAgbW90aW9uX3R5cGUgPSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCZzdHJpbmcsIGxlbmd0aCwgY2JkKTsKKyAgICBpZiAobW90aW9uX3R5cGUgPCAwKQorCXJldHVybiBGYWxzZTsKKworICAgIC8qIEZvciBvdXIgb3duIGZvcm1hdCwgdGhlIGZpcnN0IGJ5dGUgY29udGFpbnMgdGhlIG1vdGlvbiB0eXBlICovCisgICAgaWYgKCp0YXJnZXQgPT0gdmltX2F0b20pCisJKCpsZW5ndGgpKys7CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogT3VyIG93biBmb3JtYXQgd2l0aCBlbmNvZGluZzogbW90aW9uICdlbmNvZGluZycgTlVMIHRleHQgKi8KKyAgICBpZiAoKnRhcmdldCA9PSB2aW1lbmNfYXRvbSkKKwkqbGVuZ3RoICs9IFNUUkxFTihwX2VuYykgKyAyOworI2VuZGlmCisKKyAgICAqdmFsdWUgPSBYdE1hbGxvYygoQ2FyZGluYWwpKmxlbmd0aCk7CisgICAgcmVzdWx0ID0gKGNoYXJfdSAqKSp2YWx1ZTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKHN0cmluZyk7CisJcmV0dXJuIEZhbHNlOworICAgIH0KKworICAgIGlmICgqdGFyZ2V0ID09IFhBX1NUUklORykKKyAgICB7CisJbWNoX21lbW1vdmUocmVzdWx0LCBzdHJpbmcsIChzaXplX3QpKCpsZW5ndGgpKTsKKwkqdHlwZSA9IFhBX1NUUklORzsKKyAgICB9CisgICAgZWxzZSBpZiAoKnRhcmdldCA9PSBjb21wb3VuZF90ZXh0X2F0b20KKwkgICAgfHwgKnRhcmdldCA9PSB0ZXh0X2F0b20pCisgICAgeworCVhUZXh0UHJvcGVydHkJdGV4dF9wcm9wOworCWNoYXIJCSpzdHJpbmdfbnQgPSAoY2hhciAqKWFsbG9jKCh1bnNpZ25lZCkqbGVuZ3RoICsgMSk7CisKKwkvKiBjcmVhdGUgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIFhtYlRleHRMaXN0VG9UZXh0UHJvcGVydHkgd2FudHMgKi8KKwltY2hfbWVtbW92ZShzdHJpbmdfbnQsIHN0cmluZywgKHNpemVfdCkqbGVuZ3RoKTsKKwlzdHJpbmdfbnRbKmxlbmd0aF0gPSBOVUw7CisJWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eShYX0RJU1BMQVksIChjaGFyICoqKSZzdHJpbmdfbnQsIDEsCisJCQkJCSAgICAgIFhDb21wb3VuZFRleHRTdHlsZSwgJnRleHRfcHJvcCk7CisJdmltX2ZyZWUoc3RyaW5nX250KTsKKwlYdEZyZWUoKnZhbHVlKTsJCQkvKiByZXBsYWNlIHdpdGggQ09NUE9VTkQgdGV4dCAqLworCSp2YWx1ZSA9IChYdFBvaW50ZXIpKHRleHRfcHJvcC52YWx1ZSk7CS8qICAgIGZyb20gcGxhaW4gdGV4dCAqLworCSpsZW5ndGggPSB0ZXh0X3Byb3Aubml0ZW1zOworCSp0eXBlID0gY29tcG91bmRfdGV4dF9hdG9tOworICAgIH0KKworI2lmZGVmIEZFQVRfTUJZVEUKKyAgICBlbHNlIGlmICgqdGFyZ2V0ID09IHZpbWVuY19hdG9tKQorICAgIHsKKwlpbnQgbCA9IFNUUkxFTihwX2VuYyk7CisKKwlyZXN1bHRbMF0gPSBtb3Rpb25fdHlwZTsKKwlTVFJDUFkocmVzdWx0ICsgMSwgcF9lbmMpOworCW1jaF9tZW1tb3ZlKHJlc3VsdCArIGwgKyAyLCBzdHJpbmcsIChzaXplX3QpKCpsZW5ndGggLSBsIC0gMikpOworCSp0eXBlID0gdmltZW5jX2F0b207CisgICAgfQorI2VuZGlmCisKKyAgICBlbHNlCisgICAgeworCXJlc3VsdFswXSA9IG1vdGlvbl90eXBlOworCW1jaF9tZW1tb3ZlKHJlc3VsdCArIDEsIHN0cmluZywgKHNpemVfdCkoKmxlbmd0aCAtIDEpKTsKKwkqdHlwZSA9IHZpbV9hdG9tOworICAgIH0KKyAgICAqZm9ybWF0ID0gODsJICAgIC8qIDggYml0cyBwZXIgY2hhciAqLworICAgIHZpbV9mcmVlKHN0cmluZyk7CisgICAgcmV0dXJuIFRydWU7Cit9CisKK3N0YXRpYyB2b2lkICBjbGlwX3gxMV9sb3NlX293bmVyc2hpcF9jYiBfX0FSR1MoKFdpZGdldCwgQXRvbSAqKSk7CisKKy8qIEFSR1NVU0VEICovCisgICAgc3RhdGljIHZvaWQKK2NsaXBfeDExX2xvc2Vfb3duZXJzaGlwX2NiKHcsIHNlbF9hdG9tKQorICAgIFdpZGdldCAgdzsKKyAgICBBdG9tICAgICpzZWxfYXRvbTsKK3sKKyAgICBpZiAoKnNlbF9hdG9tID09IGNsaXBfcGx1cy5zZWxfYXRvbSkKKwljbGlwX2xvc2Vfc2VsZWN0aW9uKCZjbGlwX3BsdXMpOworICAgIGVsc2UKKwljbGlwX2xvc2Vfc2VsZWN0aW9uKCZjbGlwX3N0YXIpOworfQorCisgICAgdm9pZAorY2xpcF94MTFfbG9zZV9zZWxlY3Rpb24obXlTaGVsbCwgY2JkKQorICAgIFdpZGdldAlteVNoZWxsOworICAgIFZpbUNsaXBib2FyZAkqY2JkOworeworICAgIFh0RGlzb3duU2VsZWN0aW9uKG15U2hlbGwsIGNiZC0+c2VsX2F0b20sIEN1cnJlbnRUaW1lKTsKK30KKworICAgIGludAorY2xpcF94MTFfb3duX3NlbGVjdGlvbihteVNoZWxsLCBjYmQpCisgICAgV2lkZ2V0CW15U2hlbGw7CisgICAgVmltQ2xpcGJvYXJkCSpjYmQ7Cit7CisgICAgaWYgKFh0T3duU2VsZWN0aW9uKG15U2hlbGwsIGNiZC0+c2VsX2F0b20sIEN1cnJlbnRUaW1lLAorCSAgICBjbGlwX3gxMV9jb252ZXJ0X3NlbGVjdGlvbl9jYiwgY2xpcF94MTFfbG9zZV9vd25lcnNoaXBfY2IsCisJCQkJCQkJICAgICAgIE5VTEwpID09IEZhbHNlKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFNlbmQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQuICBEbyBub3RoaW5nIGZvciBYIGJlY2F1c2Ugd2UKKyAqIHdpbGwgZmlsbCBpbiB0aGUgc2VsZWN0aW9uIG9ubHkgd2hlbiByZXF1ZXN0ZWQgYnkgYW5vdGhlciBhcHAuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2NsaXBfeDExX3NldF9zZWxlY3Rpb24oY2JkKQorICAgIFZpbUNsaXBib2FyZCAqY2JkOworeworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0UpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiBvbiB0aGUgc2NyZWVuLgorICogQ2hhbmdlIGN1cnJlbnQgd2luZG93IGlmIG5lY2Nlc2FyeS4JUmV0dXJucyBhbiBpbnRlZ2VyIHdpdGggdGhlCisgKiBDVVJTT1JfTU9WRUQgYml0IHNldCBpZiB0aGUgY3Vyc29yIGhhcyBtb3ZlZCBvciB1bnNldCBvdGhlcndpc2UuCisgKgorICogVGhlIE1PVVNFX0ZPTERfQ0xPU0UgYml0IGlzIHNldCB3aGVuIGNsaWNrZWQgb24gdGhlICctJyBpbiBhIGZvbGQgY29sdW1uLgorICogVGhlIE1PVVNFX0ZPTERfT1BFTiBiaXQgaXMgc2V0IHdoZW4gY2xpY2tlZCBvbiB0aGUgJysnIGluIGEgZm9sZCBjb2x1bW4uCisgKgorICogSWYgZmxhZ3MgaGFzIE1PVVNFX0ZPQ1VTLCB0aGVuIHRoZSBjdXJyZW50IHdpbmRvdyB3aWxsIG5vdCBiZSBjaGFuZ2VkLCBhbmQKKyAqIGlmIHRoZSBtb3VzZSBpcyBvdXRzaWRlIHRoZSB3aW5kb3cgdGhlbiB0aGUgdGV4dCB3aWxsIHNjcm9sbCwgb3IgaWYgdGhlCisgKiBtb3VzZSB3YXMgcHJldmlvdXNseSBvbiBhIHN0YXR1cyBsaW5lLCB0aGVuIHRoZSBzdGF0dXMgbGluZSBtYXkgYmUgZHJhZ2dlZC4KKyAqCisgKiBJZiBmbGFncyBoYXMgTU9VU0VfTUFZX1ZJUywgdGhlbiBWSXN1YWwgbW9kZSB3aWxsIGJlIHN0YXJ0ZWQgYmVmb3JlIHRoZQorICogY3Vyc29yIGlzIG1vdmVkIHVubGVzcyB0aGUgY3Vyc29yIHdhcyBvbiBhIHN0YXR1cyBsaW5lLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiBJTl9VTktOT1dOLCBJTl9CVUZGRVIsIElOX1NUQVRVU19MSU5FIG9yCisgKiBJTl9TRVBfTElORSBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGN1cnNvciB3YXMgY2xpY2tlZC4KKyAqCisgKiBJZiBmbGFncyBoYXMgTU9VU0VfTUFZX1NUT1BfVklTLCB0aGVuIFZpc3VhbCBtb2RlIHdpbGwgYmUgc3RvcHBlZCwgdW5sZXNzCisgKiB0aGUgbW91c2UgaXMgb24gdGhlIHN0YXR1cyBsaW5lIG9mIHRoZSBzYW1lIHdpbmRvdy4KKyAqCisgKiBJZiBmbGFncyBoYXMgTU9VU0VfRElEX01PVkUsIG5vdGhpbmcgaXMgZG9uZSBpZiB0aGUgbW91c2UgZGlkbid0IG1vdmUgc2luY2UKKyAqIHRoZSBsYXN0IGNhbGwuCisgKgorICogSWYgZmxhZ3MgaGFzIE1PVVNFX1NFVFBPUywgbm90aGluZyBpcyBkb25lLCBvbmx5IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzCisgKiByZW1lbWJlcmVkLgorICovCisgICAgaW50CitqdW1wX3RvX21vdXNlKGZsYWdzLCBpbmNsdXNpdmUsIHdoaWNoX2J1dHRvbikKKyAgICBpbnQJCWZsYWdzOworICAgIGludAkJKmluY2x1c2l2ZTsJLyogdXNlZCBmb3IgaW5jbHVzaXZlIG9wZXJhdG9yLCBjYW4gYmUgTlVMTCAqLworICAgIGludAkJd2hpY2hfYnV0dG9uOwkvKiBNT1VTRV9MRUZULCBNT1VTRV9SSUdIVCwgTU9VU0VfTUlERExFICovCit7CisgICAgc3RhdGljIGludAlvbl9zdGF0dXNfbGluZSA9IDA7CS8qICNsaW5lcyBiZWxvdyBib3R0b20gb2Ygd2luZG93ICovCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBzdGF0aWMgaW50CW9uX3NlcF9saW5lID0gMDsJLyogb24gc2VwYXJhdG9yIHJpZ2h0IG9mIHdpbmRvdyAqLworI2VuZGlmCisgICAgc3RhdGljIGludAlwcmV2X3JvdyA9IC0xOworICAgIHN0YXRpYyBpbnQJcHJldl9jb2wgPSAtMTsKKyAgICBzdGF0aWMgd2luX1QgKmRyYWd3aW4gPSBOVUxMOwkvKiB3aW5kb3cgYmVpbmcgZHJhZ2dlZCAqLworICAgIHN0YXRpYyBpbnQJZGlkX2RyYWcgPSBGQUxTRTsJLyogZHJhZyB3YXMgbm90aWNlZCAqLworCisgICAgd2luX1QJKndwLCAqb2xkX2N1cndpbjsKKyAgICBwb3NfVAlvbGRfY3Vyc29yOworICAgIGludAkJY291bnQ7CisgICAgaW50CQlmaXJzdDsKKyAgICBpbnQJCXJvdyA9IG1vdXNlX3JvdzsKKyAgICBpbnQJCWNvbCA9IG1vdXNlX2NvbDsKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpbnQJCW1vdXNlX2NoYXI7CisjZW5kaWYKKworICAgIG1vdXNlX3Bhc3RfYm90dG9tID0gRkFMU0U7CisgICAgbW91c2VfcGFzdF9lb2wgPSBGQUxTRTsKKworICAgIGlmIChmbGFncyAmIE1PVVNFX1JFTEVBU0VEKQorICAgIHsKKwkvKiBPbiBidXR0b24gcmVsZWFzZSB3ZSBtYXkgY2hhbmdlIHdpbmRvdyBmb2N1cyBpZiBwb3NpdGlvbmVkIG9uIGEKKwkgKiBzdGF0dXMgbGluZSBhbmQgbm8gZHJhZ2dpbmcgaGFwcGVuZWQuICovCisJaWYgKGRyYWd3aW4gIT0gTlVMTCAmJiAhZGlkX2RyYWcpCisJICAgIGZsYWdzICY9IH4oTU9VU0VfRk9DVVMgfCBNT1VTRV9ESURfTU9WRSk7CisJZHJhZ3dpbiA9IE5VTEw7CisJZGlkX2RyYWcgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYgTU9VU0VfRElEX01PVkUpCisJICAgICYmIHByZXZfcm93ID09IG1vdXNlX3JvdworCSAgICAmJiBwcmV2X2NvbCA9PSBtb3VzZV9jb2wpCisgICAgeworcmV0bm9tb3ZlOgorCS8qIGJlZm9yZSBtb3ZpbmcgdGhlIGN1cnNvciBmb3IgYSBsZWZ0IGNsaWNrIHdpY2ggaXMgTk9UIGluIGEgc3RhdHVzCisJICogbGluZSwgc3RvcCBWaXN1YWwgbW9kZSAqLworCWlmIChvbl9zdGF0dXNfbGluZSkKKwkgICAgcmV0dXJuIElOX1NUQVRVU19MSU5FOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJaWYgKG9uX3NlcF9saW5lKQorCSAgICByZXR1cm4gSU5fU0VQX0xJTkU7CisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZJU1VBTAorCWlmIChmbGFncyAmIE1PVVNFX01BWV9TVE9QX1ZJUykKKwl7CisJICAgIGVuZF92aXN1YWxfbW9kZSgpOworCSAgICByZWRyYXdfY3VyYnVmX2xhdGVyKElOVkVSVEVEKTsJLyogZGVsZXRlIHRoZSBpbnZlcnNpb24gKi8KKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQVRfQ01EV0lOKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQorCS8qIENvbnRpbnVlIGEgbW9kZWxlc3Mgc2VsZWN0aW9uIGluIGFub3RoZXIgd2luZG93LiAqLworCWlmIChjbWR3aW5fdHlwZSAhPSAwICYmIHJvdyA8IFdfV0lOUk9XKGN1cndpbikpCisJICAgIHJldHVybiBJTl9PVEhFUl9XSU47CisjZW5kaWYKKwlyZXR1cm4gSU5fQlVGRkVSOworICAgIH0KKworICAgIHByZXZfcm93ID0gbW91c2Vfcm93OworICAgIHByZXZfY29sID0gbW91c2VfY29sOworCisgICAgaWYgKGZsYWdzICYgTU9VU0VfU0VUUE9TKQorCWdvdG8gcmV0bm9tb3ZlOwkJCQkvKiB1Z2x5IGdvdG8uLi4gKi8KKworI2lmZGVmIEZFQVRfRk9MRElORworICAgIC8qIFJlbWVtYmVyIHRoZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIG1vdXNlLCBpdCBtaWdodCBiZSBhICctJyBvciAnKycgaW4gdGhlCisgICAgICogZm9sZCBjb2x1bW4uICovCisgICAgaWYgKHJvdyA+PSAwICYmIHJvdyA8IFJvd3MgJiYgY29sID49IDAgJiYgY29sIDw9IENvbHVtbnMpCisJbW91c2VfY2hhciA9IFNjcmVlbkxpbmVzW0xpbmVPZmZzZXRbcm93XSArIGNvbF07CisgICAgZWxzZQorCW1vdXNlX2NoYXIgPSAnICc7CisjZW5kaWYKKworICAgIG9sZF9jdXJ3aW4gPSBjdXJ3aW47CisgICAgb2xkX2N1cnNvciA9IGN1cndpbi0+d19jdXJzb3I7CisKKyAgICBpZiAoIShmbGFncyAmIE1PVVNFX0ZPQ1VTKSkKKyAgICB7CisJaWYgKHJvdyA8IDAgfHwgY29sIDwgMCkJCQkvKiBjaGVjayBpZiBpdCBtYWtlcyBzZW5zZSAqLworCSAgICByZXR1cm4gSU5fVU5LTk9XTjsKKworI2lmZGVmIEZFQVRfV0lORE9XUworCS8qIGZpbmQgdGhlIHdpbmRvdyB3aGVyZSB0aGUgcm93IGlzIGluICovCisJd3AgPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKyNlbHNlCisJd3AgPSBmaXJzdHdpbjsKKyNlbmRpZgorCWRyYWd3aW4gPSBOVUxMOworCS8qCisJICogd2lucG9zIGFuZCBoZWlnaHQgbWF5IGNoYW5nZSBpbiB3aW5fZW50ZXIoKSEKKwkgKi8KKwlpZiAocm93ID49IHdwLT53X2hlaWdodCkJCS8qIEluIChvciBiZWxvdykgc3RhdHVzIGxpbmUgKi8KKwl7CisJICAgIG9uX3N0YXR1c19saW5lID0gcm93IC0gd3AtPndfaGVpZ2h0ICsgMTsKKwkgICAgZHJhZ3dpbiA9IHdwOworCX0KKwllbHNlCisJICAgIG9uX3N0YXR1c19saW5lID0gMDsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCWlmIChjb2wgPj0gd3AtPndfd2lkdGgpCQkvKiBJbiBzZXBhcmF0b3IgbGluZSAqLworCXsKKwkgICAgb25fc2VwX2xpbmUgPSBjb2wgLSB3cC0+d193aWR0aCArIDE7CisJICAgIGRyYWd3aW4gPSB3cDsKKwl9CisJZWxzZQorCSAgICBvbl9zZXBfbGluZSA9IDA7CisKKwkvKiBUaGUgcmlnaHRtb3N0IGNoYXJhY3RlciBvZiB0aGUgc3RhdHVzIGxpbmUgbWlnaHQgYmUgYSB2ZXJ0aWNhbAorCSAqIHNlcGFyYXRvciBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgbm8gY29ubmVjdGluZyB3aW5kb3cgdG8gdGhlIHJpZ2h0LiAqLworCWlmIChvbl9zdGF0dXNfbGluZSAmJiBvbl9zZXBfbGluZSkKKwl7CisJICAgIGlmIChzdGxfY29ubmVjdGVkKHdwKSkKKwkJb25fc2VwX2xpbmUgPSAwOworCSAgICBlbHNlCisJCW9uX3N0YXR1c19saW5lID0gMDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVklTVUFMCisJLyogQmVmb3JlIGp1bXBpbmcgdG8gYW5vdGhlciBidWZmZXIsIG9yIG1vdmluZyB0aGUgY3Vyc29yIGZvciBhIGxlZnQKKwkgKiBjbGljaywgc3RvcCBWaXN1YWwgbW9kZS4gKi8KKwlpZiAoVklzdWFsX2FjdGl2ZQorCQkmJiAod3AtPndfYnVmZmVyICE9IGN1cndpbi0+d19idWZmZXIKKwkJICAgIHx8ICghb25fc3RhdHVzX2xpbmUKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJCSYmICFvbl9zZXBfbGluZQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX0ZPTERJTkcKKwkJCSYmICgKKyMgIGlmZGVmIEZFQVRfUklHSFRMRUZUCisJCQkgICAgd3AtPndfcF9ybCA/IGNvbCA8IFdfV0lEVEgod3ApIC0gd3AtPndfcF9mZGMgOgorIyAgZW5kaWYKKwkJCSAgICBjb2wgPj0gd3AtPndfcF9mZGMKKyMgIGlmZGVmIEZFQVRfQ01EV0lOCisJCQkJICArIChjbWR3aW5fdHlwZSA9PSAwICYmIHdwID09IGN1cndpbiA/IDAgOiAxKQorIyAgZW5kaWYKKwkJCSAgICApCisjIGVuZGlmCisJCQkmJiAoZmxhZ3MgJiBNT1VTRV9NQVlfU1RPUF9WSVMpKSkpCisJeworCSAgICBlbmRfdmlzdWFsX21vZGUoKTsKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CS8qIGRlbGV0ZSB0aGUgaW52ZXJzaW9uICovCisJfQorI2VuZGlmCisjaWZkZWYgRkVBVF9DTURXSU4KKwlpZiAoY21kd2luX3R5cGUgIT0gMCAmJiB3cCAhPSBjdXJ3aW4pCisJeworCSAgICAvKiBBIGNsaWNrIG91dHNpZGUgdGhlIGNvbW1hbmQtbGluZSB3aW5kb3c6IFVzZSBtb2RlbGVzcworCSAgICAgKiBzZWxlY3Rpb24gaWYgcG9zc2libGUuICBBbGxvdyBkcmFnZ2luZyB0aGUgc3RhdHVzIGxpbmUgb2YKKwkgICAgICogd2luZG93cyBqdXN0IGFib3ZlIHRoZSBjb21tYW5kLWxpbmUgd2luZG93LiAqLworCSAgICBpZiAod3AtPndfd2lucm93ICsgd3AtPndfaGVpZ2h0CisJCSAgICAgICAhPSBjdXJ3aW4tPndfcHJldi0+d193aW5yb3cgKyBjdXJ3aW4tPndfcHJldi0+d19oZWlnaHQpCisJICAgIHsKKwkJb25fc3RhdHVzX2xpbmUgPSAwOworCQlkcmFnd2luID0gTlVMTDsKKwkgICAgfQorIyBpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICBvbl9zZXBfbGluZSA9IDA7CisjIGVuZGlmCisjIGlmZGVmIEZFQVRfQ0xJUEJPQVJECisJICAgIGlmIChvbl9zdGF0dXNfbGluZSkKKwkJcmV0dXJuIElOX1NUQVRVU19MSU5FOworCSAgICByZXR1cm4gSU5fT1RIRVJfV0lOOworIyBlbHNlCisJICAgIHJvdyA9IDA7CisJICAgIGNvbCArPSB3cC0+d193aW5jb2w7CisJICAgIHdwID0gY3Vyd2luOworIyBlbmRpZgorCX0KKyNlbmRpZgorI2lmZGVmIEZFQVRfV0lORE9XUworCS8qIE9ubHkgY2hhbmdlIHdpbmRvdyBmb2N1cyB3aGVuIG5vdCBjbGlja2luZyBvbiBvciBkcmFnZ2luZyB0aGUKKwkgKiBzdGF0dXMgbGluZS4gIERvIGNoYW5nZSBmb2N1cyB3aGVuIHJlbGVhc2luZyB0aGUgbW91c2UgYnV0dG9uCisJICogKE1PVVNFX0ZPQ1VTIHdhcyBzZXQgYWJvdmUgaWYgd2UgZHJhZ2dlZCBmaXJzdCkuICovCisJaWYgKGRyYWd3aW4gPT0gTlVMTCB8fCAoZmxhZ3MgJiBNT1VTRV9SRUxFQVNFRCkpCisJICAgIHdpbl9lbnRlcih3cCwgVFJVRSk7CQkvKiBjYW4gbWFrZSB3cCBpbnZhbGlkISAqLworIyBpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKKwkvKiBzZXQgdG9wbGluZSwgdG8gYmUgYWJsZSB0byBjaGVjayBmb3IgZG91YmxlIGNsaWNrIG91cnNlbHZlcyAqLworCWlmIChjdXJ3aW4gIT0gb2xkX2N1cndpbikKKwkgICAgc2V0X21vdXNlX3RvcGxpbmUoY3Vyd2luKTsKKyMgZW5kaWYKKyNlbmRpZgorCWlmIChvbl9zdGF0dXNfbGluZSkJCQkvKiBJbiAob3IgYmVsb3cpIHN0YXR1cyBsaW5lICovCisJeworCSAgICAvKiBEb24ndCB1c2Ugc3RhcnRfYXJyb3coKSBpZiB3ZSdyZSBpbiB0aGUgc2FtZSB3aW5kb3cgKi8KKwkgICAgaWYgKGN1cndpbiA9PSBvbGRfY3Vyd2luKQorCQlyZXR1cm4gSU5fU1RBVFVTX0xJTkU7CisJICAgIGVsc2UKKwkJcmV0dXJuIElOX1NUQVRVU19MSU5FIHwgQ1VSU09SX01PVkVEOworCX0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCWlmIChvbl9zZXBfbGluZSkJCQkvKiBJbiAob3IgYmVsb3cpIHN0YXR1cyBsaW5lICovCisJeworCSAgICAvKiBEb24ndCB1c2Ugc3RhcnRfYXJyb3coKSBpZiB3ZSdyZSBpbiB0aGUgc2FtZSB3aW5kb3cgKi8KKwkgICAgaWYgKGN1cndpbiA9PSBvbGRfY3Vyd2luKQorCQlyZXR1cm4gSU5fU0VQX0xJTkU7CisJICAgIGVsc2UKKwkJcmV0dXJuIElOX1NFUF9MSU5FIHwgQ1VSU09SX01PVkVEOworCX0KKyNlbmRpZgorCisJY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9HVUkKKwkvKiByZW1lbWJlciB0b3BsaW5lLCBuZWVkZWQgZm9yIGRvdWJsZSBjbGljayAqLworCWd1aV9wcmV2X3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyMgaWZkZWYgRkVBVF9ESUZGCisJZ3VpX3ByZXZfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworIyBlbmRpZgorI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKG9uX3N0YXR1c19saW5lICYmIHdoaWNoX2J1dHRvbiA9PSBNT1VTRV9MRUZUKQorICAgIHsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwlpZiAoZHJhZ3dpbiAhPSBOVUxMKQorCXsKKwkgICAgLyogRHJhZyB0aGUgc3RhdHVzIGxpbmUgKi8KKwkgICAgY291bnQgPSByb3cgLSBkcmFnd2luLT53X3dpbnJvdyAtIGRyYWd3aW4tPndfaGVpZ2h0ICsgMQorCQkJCQkJCSAgICAgLSBvbl9zdGF0dXNfbGluZTsKKwkgICAgd2luX2RyYWdfc3RhdHVzX2xpbmUoZHJhZ3dpbiwgY291bnQpOworCSAgICBkaWRfZHJhZyB8PSBjb3VudDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gSU5fU1RBVFVTX0xJTkU7CQkJLyogQ3Vyc29yIGRpZG4ndCBtb3ZlICovCisgICAgfQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgZWxzZSBpZiAob25fc2VwX2xpbmUgJiYgd2hpY2hfYnV0dG9uID09IE1PVVNFX0xFRlQpCisgICAgeworCWlmIChkcmFnd2luICE9IE5VTEwpCisJeworCSAgICAvKiBEcmFnIHRoZSBzZXBhcmF0b3IgY29sdW1uICovCisJICAgIGNvdW50ID0gY29sIC0gZHJhZ3dpbi0+d193aW5jb2wgLSBkcmFnd2luLT53X3dpZHRoICsgMQorCQkJCQkJCQktIG9uX3NlcF9saW5lOworCSAgICB3aW5fZHJhZ192c2VwX2xpbmUoZHJhZ3dpbiwgY291bnQpOworCSAgICBkaWRfZHJhZyB8PSBjb3VudDsKKwl9CisJcmV0dXJuIElOX1NFUF9MSU5FOwkJCS8qIEN1cnNvciBkaWRuJ3QgbW92ZSAqLworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgLyoga2VlcF93aW5kb3dfZm9jdXMgbXVzdCBiZSBUUlVFICovCisgICAgeworI2lmZGVmIEZFQVRfVklTVUFMCisJLyogYmVmb3JlIG1vdmluZyB0aGUgY3Vyc29yIGZvciBhIGxlZnQgY2xpY2ssIHN0b3AgVmlzdWFsIG1vZGUgKi8KKwlpZiAoZmxhZ3MgJiBNT1VTRV9NQVlfU1RPUF9WSVMpCisJeworCSAgICBlbmRfdmlzdWFsX21vZGUoKTsKKwkgICAgcmVkcmF3X2N1cmJ1Zl9sYXRlcihJTlZFUlRFRCk7CS8qIGRlbGV0ZSB0aGUgaW52ZXJzaW9uICovCisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01EV0lOKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQorCS8qIENvbnRpbnVlIGEgbW9kZWxlc3Mgc2VsZWN0aW9uIGluIGFub3RoZXIgd2luZG93LiAqLworCWlmIChjbWR3aW5fdHlwZSAhPSAwICYmIHJvdyA8IFdfV0lOUk9XKGN1cndpbikpCisJICAgIHJldHVybiBJTl9PVEhFUl9XSU47CisjZW5kaWYKKworCXJvdyAtPSBXX1dJTlJPVyhjdXJ3aW4pOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJY29sIC09IFdfV0lOQ09MKGN1cndpbik7CisjZW5kaWYKKworCS8qCisJICogV2hlbiBjbGlja2luZyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgd2luZG93LCBzY3JvbGwgdGhlIHNjcmVlbi4KKwkgKiBTY3JvbGwgYnkgaG93ZXZlciBtYW55IHJvd3Mgb3V0c2lkZSB0aGUgd2luZG93IHdlIGFyZS4KKwkgKi8KKwlpZiAocm93IDwgMCkKKwl7CisJICAgIGNvdW50ID0gMDsKKwkgICAgZm9yIChmaXJzdCA9IFRSVUU7IGN1cndpbi0+d190b3BsaW5lID4gMTsgKQorCSAgICB7CisjaWZkZWYgRkVBVF9ESUZGCisJCWlmIChjdXJ3aW4tPndfdG9wZmlsbCA8IGRpZmZfY2hlY2soY3Vyd2luLCBjdXJ3aW4tPndfdG9wbGluZSkpCisJCSAgICArK2NvdW50OworCQllbHNlCisjZW5kaWYKKwkJICAgIGNvdW50ICs9IHBsaW5lcyhjdXJ3aW4tPndfdG9wbGluZSAtIDEpOworCQlpZiAoIWZpcnN0ICYmIGNvdW50ID4gLXJvdykKKwkJICAgIGJyZWFrOworCQlmaXJzdCA9IEZBTFNFOworI2lmZGVmIEZFQVRfRk9MRElORworCQloYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lLCAmY3Vyd2luLT53X3RvcGxpbmUsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisJCWlmIChjdXJ3aW4tPndfdG9wZmlsbCA8IGRpZmZfY2hlY2soY3Vyd2luLCBjdXJ3aW4tPndfdG9wbGluZSkpCisJCSAgICArK2N1cndpbi0+d190b3BmaWxsOworCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgLS1jdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIGN1cndpbi0+d190b3BmaWxsID0gMDsKKyNlbmRpZgorCQl9CisJICAgIH0KKyNpZmRlZiBGRUFUX0RJRkYKKwkgICAgY2hlY2tfdG9wZmlsbChjdXJ3aW4sIEZBTFNFKTsKKyNlbmRpZgorCSAgICBjdXJ3aW4tPndfdmFsaWQgJj0KKwkJICAgICAgfihWQUxJRF9XUk9XfFZBTElEX0NST1d8VkFMSURfQk9UTElORXxWQUxJRF9CT1RMSU5FX0FQKTsKKwkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkgICAgcm93ID0gMDsKKwl9CisJZWxzZSBpZiAocm93ID49IGN1cndpbi0+d19oZWlnaHQpCisJeworCSAgICBjb3VudCA9IDA7CisJICAgIGZvciAoZmlyc3QgPSBUUlVFOyBjdXJ3aW4tPndfdG9wbGluZSA8IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OyApCisJICAgIHsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJaWYgKGN1cndpbi0+d190b3BmaWxsID4gMCkKKwkJICAgICsrY291bnQ7CisJCWVsc2UKKyNlbmRpZgorCQkgICAgY291bnQgKz0gcGxpbmVzKGN1cndpbi0+d190b3BsaW5lKTsKKwkJaWYgKCFmaXJzdCAmJiBjb3VudCA+IHJvdyAtIGN1cndpbi0+d19oZWlnaHQgKyAxKQorCQkgICAgYnJlYWs7CisJCWZpcnN0ID0gRkFMU0U7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWlmIChoYXNGb2xkaW5nKGN1cndpbi0+d190b3BsaW5lLCBOVUxMLCAmY3Vyd2luLT53X3RvcGxpbmUpCisJCQkmJiBjdXJ3aW4tPndfdG9wbGluZSA9PSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisJCWlmIChjdXJ3aW4tPndfdG9wZmlsbCA+IDApCisJCSAgICAtLWN1cndpbi0+d190b3BmaWxsOworCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgKytjdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIGN1cndpbi0+d190b3BmaWxsID0KKwkJCQkgICBkaWZmX2NoZWNrX2ZpbGwoY3Vyd2luLCBjdXJ3aW4tPndfdG9wbGluZSk7CisjZW5kaWYKKwkJfQorCSAgICB9CisjaWZkZWYgRkVBVF9ESUZGCisJICAgIGNoZWNrX3RvcGZpbGwoY3Vyd2luLCBGQUxTRSk7CisjZW5kaWYKKwkgICAgcmVkcmF3X2xhdGVyKFZBTElEKTsKKwkgICAgY3Vyd2luLT53X3ZhbGlkICY9CisJCSAgICAgIH4oVkFMSURfV1JPV3xWQUxJRF9DUk9XfFZBTElEX0JPVExJTkV8VkFMSURfQk9UTElORV9BUCk7CisJICAgIHJvdyA9IGN1cndpbi0+d19oZWlnaHQgLSAxOworCX0KKwllbHNlIGlmIChyb3cgPT0gMCkKKwl7CisJICAgIC8qIFdoZW4gZHJhZ2dpbmcgdGhlIG1vdXNlLCB3aGlsZSB0aGUgdGV4dCBoYXMgYmVlbiBzY3JvbGxlZCB1cCBhcworCSAgICAgKiBmYXIgYXMgaXQgZ29lcywgbW92aW5nIHRoZSBtb3VzZSBpbiB0aGUgdG9wIGxpbmUgc2hvdWxkIHNjcm9sbAorCSAgICAgKiB0aGUgdGV4dCBkb3duIChkb25lIGxhdGVyIHdoZW4gcmVjb21wdXRpbmcgd190b3BsaW5lKS4gKi8KKwkgICAgaWYgKG1vdXNlX2RyYWdnaW5nCisJCSAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJCQkgICAgICAgPT0gY3Vyd2luLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50CisJCSAgICAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3Vyd2luLT53X3RvcGxpbmUpCisJCWN1cndpbi0+d192YWxpZCAmPSB+KFZBTElEX1RPUExJTkUpOworCX0KKyAgICB9CisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICAvKiBDaGVjayBmb3IgcG9zaXRpb24gb3V0c2lkZSBvZiB0aGUgZm9sZCBjb2x1bW4uICovCisgICAgaWYgKAorIyBpZmRlZiBGRUFUX1JJR0hUTEVGVAorCSAgICBjdXJ3aW4tPndfcF9ybCA/IGNvbCA8IFdfV0lEVEgoY3Vyd2luKSAtIGN1cndpbi0+d19wX2ZkYyA6CisjIGVuZGlmCisJICAgIGNvbCA+PSBjdXJ3aW4tPndfcF9mZGMKKyMgIGlmZGVmIEZFQVRfQ01EV0lOCisJCQkJKyAoY21kd2luX3R5cGUgPT0gMCA/IDAgOiAxKQorIyAgZW5kaWYKKyAgICAgICApCisJbW91c2VfY2hhciA9ICcgJzsKKyNlbmRpZgorCisgICAgLyogY29tcHV0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBsaW5lIGZyb20gdGhlIHBvc24gb24gdGhlIHNjcmVlbiAqLworICAgIGlmIChtb3VzZV9jb21wX3BvcyhjdXJ3aW4sICZyb3csICZjb2wsICZjdXJ3aW4tPndfY3Vyc29yLmxudW0pKQorCW1vdXNlX3Bhc3RfYm90dG9tID0gVFJVRTsKKworI2lmZGVmIEZFQVRfVklTVUFMCisgICAgLyogU3RhcnQgVmlzdWFsIG1vZGUgYmVmb3JlIGNvbGFkdmFuY2UoKSwgZm9yIHdoZW4gJ3NlbCcgIT0gIm9sZCIgKi8KKyAgICBpZiAoKGZsYWdzICYgTU9VU0VfTUFZX1ZJUykgJiYgIVZJc3VhbF9hY3RpdmUpCisgICAgeworCWNoZWNrX3Zpc3VhbF9oaWdobGlnaHQoKTsKKwlWSXN1YWwgPSBvbGRfY3Vyc29yOworCVZJc3VhbF9hY3RpdmUgPSBUUlVFOworCVZJc3VhbF9yZXNlbGVjdCA9IFRSVUU7CisJLyogaWYgJ3NlbGVjdG1vZGUnIGNvbnRhaW5zICJtb3VzZSIsIHN0YXJ0IFNlbGVjdCBtb2RlICovCisJbWF5X3N0YXJ0X3NlbGVjdCgnbycpOworCXNldG1vdXNlKCk7CisJaWYgKHBfc21kKQorCSAgICByZWRyYXdfY21kbGluZSA9IFRSVUU7CS8qIHNob3cgdmlzdWFsIG1vZGUgbGF0ZXIgKi8KKyAgICB9CisjZW5kaWYKKworICAgIGN1cndpbi0+d19jdXJzd2FudCA9IGNvbDsKKyAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gRkFMU0U7CS8qIE1heSBzdGlsbCBoYXZlIGJlZW4gVFJVRSAqLworICAgIGlmIChjb2xhZHZhbmNlKGNvbCkgPT0gRkFJTCkJLyogTW91c2UgY2xpY2sgYmV5b25kIGVuZCBvZiBsaW5lICovCisgICAgeworCWlmIChpbmNsdXNpdmUgIT0gTlVMTCkKKwkgICAgKmluY2x1c2l2ZSA9IFRSVUU7CisJbW91c2VfcGFzdF9lb2wgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChpbmNsdXNpdmUgIT0gTlVMTCkKKwkqaW5jbHVzaXZlID0gRkFMU0U7CisKKyAgICBjb3VudCA9IElOX0JVRkZFUjsKKyAgICBpZiAoY3Vyd2luICE9IG9sZF9jdXJ3aW4gfHwgY3Vyd2luLT53X2N1cnNvci5sbnVtICE9IG9sZF9jdXJzb3IubG51bQorCSAgICB8fCBjdXJ3aW4tPndfY3Vyc29yLmNvbCAhPSBvbGRfY3Vyc29yLmNvbCkKKwljb3VudCB8PSBDVVJTT1JfTU9WRUQ7CQkvKiBDdXJzb3IgaGFzIG1vdmVkICovCisKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKyAgICBpZiAobW91c2VfY2hhciA9PSAnKycpCisJY291bnQgfD0gTU9VU0VfRk9MRF9PUEVOOworICAgIGVsc2UgaWYgKG1vdXNlX2NoYXIgIT0gJyAnKQorCWNvdW50IHw9IE1PVVNFX0ZPTERfQ0xPU0U7CisjZW5kaWYKKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgbGluZSBmcm9tIHRoZSBwb3NuIG9uIHRoZSBzY3JlZW4gaW4KKyAqIHdpbmRvdyAid2luIi4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgcG9zaXRpb24gaXMgYmVsb3cgdGhlIGxhc3QgbGluZS4KKyAqLworICAgIGludAorbW91c2VfY29tcF9wb3Mod2luLCByb3dwLCBjb2xwLCBsbnVtcCkKKyAgICB3aW5fVAkqd2luOworICAgIGludAkJKnJvd3A7CisgICAgaW50CQkqY29scDsKKyAgICBsaW5lbnJfVAkqbG51bXA7Cit7CisgICAgaW50CQljb2wgPSAqY29scDsKKyAgICBpbnQJCXJvdyA9ICpyb3dwOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlyZXR2YWwgPSBGQUxTRTsKKyAgICBpbnQJCW9mZjsKKyAgICBpbnQJCWNvdW50OworCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKyAgICBpZiAod2luLT53X3BfcmwpCisJY29sID0gV19XSURUSCh3aW4pIC0gMSAtIGNvbDsKKyNlbmRpZgorCisgICAgbG51bSA9IHdpbi0+d190b3BsaW5lOworCisgICAgd2hpbGUgKHJvdyA+IDApCisgICAgeworI2lmZGVmIEZFQVRfRElGRgorCS8qIERvbid0IGluY2x1ZGUgZmlsbGVyIGxpbmVzIGluICJjb3VudCIgKi8KKwlpZiAod2luLT53X3BfZGlmZiAmJiAhaGFzRm9sZGluZ1dpbih3aW4sIGxudW0sIE5VTEwsIE5VTEwsIFRSVUUsIE5VTEwpKQorCXsKKwkgICAgaWYgKGxudW0gPT0gd2luLT53X3RvcGxpbmUpCisJCXJvdyAtPSB3aW4tPndfdG9wZmlsbDsKKwkgICAgZWxzZQorCQlyb3cgLT0gZGlmZl9jaGVja19maWxsKHdpbiwgbG51bSk7CisJICAgIGNvdW50ID0gcGxpbmVzX3dpbl9ub2ZpbGwod2luLCBsbnVtLCBUUlVFKTsKKwl9CisJZWxzZQorI2VuZGlmCisJICAgIGNvdW50ID0gcGxpbmVzX3dpbih3aW4sIGxudW0sIFRSVUUpOworCWlmIChjb3VudCA+IHJvdykKKwkgICAgYnJlYWs7CS8qIFBvc2l0aW9uIGlzIGluIHRoaXMgYnVmZmVyIGxpbmUuICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisJKHZvaWQpaGFzRm9sZGluZ1dpbih3aW4sIGxudW0sIE5VTEwsICZsbnVtLCBUUlVFLCBOVUxMKTsKKyNlbmRpZgorCWlmIChsbnVtID09IHdpbi0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCkKKwl7CisJICAgIHJldHZhbCA9IFRSVUU7CisJICAgIGJyZWFrOwkJLyogcGFzdCBlbmQgb2YgZmlsZSAqLworCX0KKwlyb3cgLT0gY291bnQ7CisJKytsbnVtOworICAgIH0KKworICAgIGlmICghcmV0dmFsKQorICAgIHsKKwkvKiBDb21wdXRlIHRoZSBjb2x1bW4gd2l0aG91dCB3cmFwcGluZy4gKi8KKwlvZmYgPSB3aW5fY29sX29mZih3aW4pIC0gd2luX2NvbF9vZmYyKHdpbik7CisJaWYgKGNvbCA8IG9mZikKKwkgICAgY29sID0gb2ZmOworCWNvbCArPSByb3cgKiAoV19XSURUSCh3aW4pIC0gb2ZmKTsKKwkvKiBhZGQgc2tpcCBjb2x1bW4gKGZvciBsb25nIHdyYXBwaW5nIGxpbmUpICovCisJY29sICs9IHdpbi0+d19za2lwY29sOworICAgIH0KKworICAgIGlmICghd2luLT53X3Bfd3JhcCkKKwljb2wgKz0gd2luLT53X2xlZnRjb2w7CisKKyAgICAvKiBza2lwIGxpbmUgbnVtYmVyIGFuZCBmb2xkIGNvbHVtbiBpbiBmcm9udCBvZiB0aGUgbGluZSAqLworICAgIGNvbCAtPSB3aW5fY29sX29mZih3aW4pOworICAgIGlmIChjb2wgPCAwKQorICAgIHsKKyNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKKwlpZiAodXNpbmdOZXRiZWFucykKKwkgICAgbmV0YmVhbnNfZ3V0dGVyX2NsaWNrKGxudW0pOworI2VuZGlmCisJY29sID0gMDsKKyAgICB9CisKKyAgICAqY29scCA9IGNvbDsKKyAgICAqcm93cCA9IHJvdzsKKyAgICAqbG51bXAgPSBsbnVtOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBGaW5kIHRoZSB3aW5kb3cgYXQgc2NyZWVuIHBvc2l0aW9uICIqcm93cCIgYW5kICIqY29scCIuICBUaGUgcG9zaXRpb25zIGFyZQorICogdXBkYXRlZCB0byBiZWNvbWUgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IG9mIHRoZSB3aW5kb3cuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHdpbl9UICoKK21vdXNlX2ZpbmRfd2luKHJvd3AsIGNvbHApCisgICAgaW50CQkqcm93cDsKKyAgICBpbnQJCSpjb2xwOworeworICAgIGZyYW1lX1QJKmZwOworCisgICAgZnAgPSB0b3BmcmFtZTsKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAoZnAtPmZyX2xheW91dCA9PSBGUl9MRUFGKQorCSAgICBicmVhazsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCWlmIChmcC0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKwl7CisJICAgIGZvciAoZnAgPSBmcC0+ZnJfY2hpbGQ7IGZwLT5mcl9uZXh0ICE9IE5VTEw7IGZwID0gZnAtPmZyX25leHQpCisJICAgIHsKKwkJaWYgKCpjb2xwIDwgZnAtPmZyX3dpZHRoKQorCQkgICAgYnJlYWs7CisJCSpjb2xwIC09IGZwLT5mcl93aWR0aDsKKwkgICAgfQorCX0KKyNlbmRpZgorCWVsc2UgICAgLyogZnJfbGF5b3V0ID09IEZSX0NPTCAqLworCXsKKwkgICAgZm9yIChmcCA9IGZwLT5mcl9jaGlsZDsgZnAtPmZyX25leHQgIT0gTlVMTDsgZnAgPSBmcC0+ZnJfbmV4dCkKKwkgICAgeworCQlpZiAoKnJvd3AgPCBmcC0+ZnJfaGVpZ2h0KQorCQkgICAgYnJlYWs7CisJCSpyb3dwIC09IGZwLT5mcl9oZWlnaHQ7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiBmcC0+ZnJfd2luOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX01PVElGKSB8fCBkZWZpbmVkKEZFQVRfR1VJX0dUSykgfHwgZGVmaW5lZCAoRkVBVF9HVUlfTUFDKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIHx8IGRlZmluZWQoRkVBVF9HVUlfTVNXSU4pIFwKKwl8fCBkZWZpbmVkKEZFQVRfR1VJX1BIT1RPTikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUcmFuc2xhdGUgd2luZG93IGNvb3JkaW5hdGVzIHRvIGJ1ZmZlciBwb3NpdGlvbiB3aXRob3V0IGFueSBzaWRlIGVmZmVjdHMKKyAqLworICAgIGludAorZ2V0X2Zwb3Nfb2ZfbW91c2UobXBvcykKKyAgICBwb3NfVAkqbXBvczsKK3sKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQlyb3cgPSBtb3VzZV9yb3c7CisgICAgaW50CQljb2wgPSBtb3VzZV9jb2w7CisKKyAgICBpZiAocm93IDwgMCB8fCBjb2wgPCAwKQkJLyogY2hlY2sgaWYgaXQgbWFrZXMgc2Vuc2UgKi8KKwlyZXR1cm4gSU5fVU5LTk9XTjsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIC8qIGZpbmQgdGhlIHdpbmRvdyB3aGVyZSB0aGUgcm93IGlzIGluICovCisgICAgd3AgPSBtb3VzZV9maW5kX3dpbigmcm93LCAmY29sKTsKKyNlbHNlCisgICAgd3AgPSBmaXJzdHdpbjsKKyNlbmRpZgorICAgIC8qCisgICAgICogd2lucG9zIGFuZCBoZWlnaHQgbWF5IGNoYW5nZSBpbiB3aW5fZW50ZXIoKSEKKyAgICAgKi8KKyAgICBpZiAocm93ID49IHdwLT53X2hlaWdodCkJLyogSW4gKG9yIGJlbG93KSBzdGF0dXMgbGluZSAqLworCXJldHVybiBJTl9TVEFUVVNfTElORTsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmIChjb2wgPj0gd3AtPndfd2lkdGgpCS8qIEluIHZlcnRpY2FsIHNlcGFyYXRvciBsaW5lICovCisJcmV0dXJuIElOX1NFUF9MSU5FOworI2VuZGlmCisKKyAgICBpZiAod3AgIT0gY3Vyd2luKQorCXJldHVybiBJTl9VTktOT1dOOworCisgICAgLyogY29tcHV0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBsaW5lIGZyb20gdGhlIHBvc24gb24gdGhlIHNjcmVlbiAqLworICAgIGlmIChtb3VzZV9jb21wX3BvcyhjdXJ3aW4sICZyb3csICZjb2wsICZtcG9zLT5sbnVtKSkKKwlyZXR1cm4gSU5fU1RBVFVTX0xJTkU7IC8qIHBhc3QgYm90dG9tICovCisKKyAgICBtcG9zLT5jb2wgPSB2Y29sMmNvbCh3cCwgbXBvcy0+bG51bSwgY29sKTsKKworICAgIGlmIChtcG9zLT5jb2wgPiAwKQorCS0tbXBvcy0+Y29sOworICAgIHJldHVybiBJTl9CVUZGRVI7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgdmlydHVhbCAoc2NyZWVuKSBjb2x1bW4gdG8gYSBjaGFyYWN0ZXIgY29sdW1uLgorICogVGhlIGZpcnN0IGNvbHVtbiBpcyBvbmUuCisgKi8KKyAgICBpbnQKK3Zjb2wyY29sKHdwLCBsbnVtLCB2Y29sKQorICAgIHdpbl9UCSp3cDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGludAkJdmNvbDsKK3sKKyAgICAvKiB0cnkgdG8gYWR2YW5jZSB0byB0aGUgc3BlY2lmaWVkIGNvbHVtbiAqLworICAgIGludAkJY29sID0gMDsKKyAgICBpbnQJCWNvdW50ID0gMDsKKyAgICBjaGFyX3UJKnB0cjsKKworICAgIHB0ciA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBsbnVtLCBGQUxTRSk7CisgICAgd2hpbGUgKGNvdW50IDw9IHZjb2wgJiYgKnB0ciAhPSBOVUwpCisgICAgeworCSsrY29sOworCWNvdW50ICs9IHdpbl9sYnJfY2hhcnRhYnNpemUod3AsIHB0ciwgY291bnQsIE5VTEwpOworIyBpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgcHRyICs9ICgqbWJfcHRyMmxlbl9jaGVjaykocHRyKTsKKwllbHNlCisjIGVuZGlmCisJICAgICsrcHRyOworICAgIH0KKyAgICByZXR1cm4gY29sOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2FsbGVkIHdoZW4gZm9jdXMgY2hhbmdlZC4gIFVzZWQgZm9yIHRoZSBHVUkgb3IgZm9yIHN5c3RlbXMgd2hlcmUgdGhpcyBjYW4KKyAqIGJlIGRvbmUgaW4gdGhlIGNvbnNvbGUgKFdpbjMyKS4KKyAqLworICAgIHZvaWQKK3VpX2ZvY3VzX2NoYW5nZShpbl9mb2N1cykKKyAgICBpbnQJCWluX2ZvY3VzOwkvKiBUUlVFIGlmIGZvY3VzIGdhaW5lZC4gKi8KK3sKKyAgICBzdGF0aWMgdGltZV90CWxhc3RfdGltZSA9ICh0aW1lX3QpMDsKKyAgICBpbnQJCQluZWVkX3JlZHJhdyA9IEZBTFNFOworCisgICAgLyogV2hlbiBhY3RpdmF0ZWQ6IENoZWNrIGlmIGFueSBmaWxlIHdhcyBtb2RpZmllZCBvdXRzaWRlIG9mIFZpbS4KKyAgICAgKiBPbmx5IGRvIHRoaXMgd2hlbiBub3QgZG9uZSB3aXRoaW4gdGhlIGxhc3QgdHdvIHNlY29uZHMgKGNvdWxkIGdldAorICAgICAqIHNldmVyYWwgZXZlbnRzIGluIGEgcm93KS4gKi8KKyAgICBpZiAoaW5fZm9jdXMgJiYgbGFzdF90aW1lICsgMiA8IHRpbWUoTlVMTCkpCisgICAgeworCW5lZWRfcmVkcmF3ID0gY2hlY2tfdGltZXN0YW1wcygKKyMgaWZkZWYgRkVBVF9HVUkKKwkJZ3VpLmluX3VzZQorIyBlbHNlCisJCUZBTFNFCisjIGVuZGlmCisJCSk7CisJbGFzdF90aW1lID0gdGltZShOVUxMKTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKgorICAgICAqIEZpcmUgdGhlIGZvY3VzIGdhaW5lZC9sb3N0IGF1dG9jb21tYW5kLgorICAgICAqLworICAgIG5lZWRfcmVkcmF3IHw9IGFwcGx5X2F1dG9jbWRzKGluX2ZvY3VzID8gRVZFTlRfRk9DVVNHQUlORUQKKwkJCQk6IEVWRU5UX0ZPQ1VTTE9TVCwgTlVMTCwgTlVMTCwgRkFMU0UsIGN1cmJ1Zik7CisjZW5kaWYKKworICAgIGlmIChuZWVkX3JlZHJhdykKKyAgICB7CisJLyogU29tZXRoaW5nIHdhcyBleGVjdXRlZCwgbWFrZSBzdXJlIHRoZSBjdXJzb3IgaXMgcHV0IGJhY2sgd2hlcmUgaXQKKwkgKiBiZWxvbmdzLiAqLworCW5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKworCWlmIChTdGF0ZSAmIENNRExJTkUpCisJICAgIHJlZHJhd2NtZGxpbmUoKTsKKwllbHNlIGlmIChTdGF0ZSA9PSBISVRSRVRVUk4gfHwgU3RhdGUgPT0gU0VUV1NJWkUgfHwgU3RhdGUgPT0gQVNLTU9SRQorCQl8fCBTdGF0ZSA9PSBFWFRFUk5DTUQgfHwgU3RhdGUgPT0gQ09ORklSTSB8fCBleG1vZGVfYWN0aXZlKQorCSAgICByZXBlYXRfbWVzc2FnZSgpOworCWVsc2UgaWYgKChTdGF0ZSAmIE5PUk1BTCkgfHwgKFN0YXRlICYgSU5TRVJUKSkKKwl7CisJICAgIGlmIChtdXN0X3JlZHJhdyAhPSAwKQorCQl1cGRhdGVfc2NyZWVuKDApOworCSAgICBzZXRjdXJzb3IoKTsKKwl9CisJY3Vyc29yX29uKCk7CSAgICAvKiByZWRyYXdpbmcgbWF5IGhhdmUgc3dpdGNoZWQgaXQgb2ZmICovCisJb3V0X2ZsdXNoKCk7CisjIGlmZGVmIEZFQVRfR1VJCisJaWYgKGd1aS5pbl91c2UpCisJeworCSAgICBndWlfdXBkYXRlX2N1cnNvcihGQUxTRSwgVFJVRSk7CisJICAgIGd1aV91cGRhdGVfc2Nyb2xsYmFycyhGQUxTRSk7CisJfQorIyBlbmRpZgorICAgIH0KKyNpZmRlZiBGRUFUX1RJVExFCisgICAgLyogRmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSAncmVhZG9ubHknIHRvICdub3JlYWRvbmx5JyAqLworICAgIGlmIChuZWVkX21ha2V0aXRsZSkKKwltYWtldGl0bGUoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFNhdmUgY3VycmVudCBJbnB1dCBNZXRob2Qgc3RhdHVzIHRvIHNwZWNpZmllZCBwbGFjZS4KKyAqLworICAgIHZvaWQKK2ltX3NhdmVfc3RhdHVzKHBzYXZlKQorICAgIGxvbmcgKnBzYXZlOworeworICAgIC8qIERvbid0IHNhdmUgd2hlbiAnaW1kaXNhYmxlJyBpcyBzZXQgb3IgInhpYyIgaXMgTlVMTCwgSU0gaXMgYWx3YXlzCisgICAgICogZGlzYWJsZWQgdGhlbiAoYnV0IG1pZ2h0IHN0YXJ0IGxhdGVyKS4KKyAgICAgKiBBbHNvIGRvbid0IHNhdmUgd2hlbiBpbnNpZGUgYSBtYXBwaW5nLCB2Z2V0Y19pbV9hY3RpdmUgaGFzIG5vdCBiZWVuIHNldAorICAgICAqIHRoZW4uCisgICAgICogQW5kIGRvbid0IHNhdmUgd2hlbiB0aGUga2V5cyB3ZXJlIHN0dWZmZWQgKGUuZy4sIGZvciBhICIuIiBjb21tYW5kKS4KKyAgICAgKiBBbmQgZG9uJ3Qgc2F2ZSB3aGVuIHRoZSBHVUkgaXMgcnVubmluZyBidXQgb3VyIHdpbmRvdyBkb2Vzbid0IGhhdmUKKyAgICAgKiBpbnB1dCBmb2N1cyAoZS5nLiwgd2hlbiBhIGZpbmQgZGlhbG9nIGlzIG9wZW4pLiAqLworICAgIGlmICghcF9pbWRpc2FibGUgJiYgS2V5VHlwZWQgJiYgIUtleVN0dWZmZWQKKyMgaWZkZWYgRkVBVF9YSU0KKwkgICAgJiYgeGljICE9IE5VTEwKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9HVUkKKwkgICAgJiYgKCFndWkuaW5fdXNlIHx8IGd1aS5pbl9mb2N1cykKKyMgZW5kaWYKKwkpCisgICAgeworCS8qIERvIHNhdmUgd2hlbiBJTSBpcyBvbiwgb3IgSU0gaXMgb2ZmIGFuZCBzYXZlZCBzdGF0dXMgaXMgb24uICovCisJaWYgKHZnZXRjX2ltX2FjdGl2ZSkKKwkgICAgKnBzYXZlID0gQl9JTU9ERV9JTTsKKwllbHNlIGlmICgqcHNhdmUgPT0gQl9JTU9ERV9JTSkKKwkgICAgKnBzYXZlID0gQl9JTU9ERV9OT05FOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3VuZG8uYyBiL3NyYy91bmRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmY2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy91bmRvLmMKQEAgLTAsMCArMSwxMzgwIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKy8qCisgKiB1bmRvLmM6IG11bHRpIGxldmVsIHVuZG8gZmFjaWxpdHkKKyAqCisgKiBUaGUgc2F2ZWQgbGluZXMgYXJlIHN0b3JlZCBpbiBhIGxpc3Qgb2YgbGlzdHMgKG9uZSBmb3IgZWFjaCBidWZmZXIpOgorICoKKyAqIGJfdV9vbGRoZWFkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoJCQkJCQkJICAgICAgfAorICoJCQkJCQkJICAgICAgVgorICoJCSAgKy0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0rCSAgKy0tLS0tLS0tLS0tLS0tKworICogYl91X25ld2hlYWQtLS0+fCB1X2hlYWRlcgkgfCAgICB8IHVfaGVhZGVyICAgICB8CSAgfCB1X2hlYWRlcgkgfAorICoJCSAgfAl1aF9uZXh0LS0tLS0tPnwgICAgIHVoX25leHQtLS0tLS0+fAl1aF9uZXh0LS0tLT5OVUxMCisgKgkgICBOVUxMPC0tLS0tLS0tdWhfcHJldiAgfDwtLS0tLS0tLS11aF9wcmV2ICB8PC0tLS0tLS0tLXVoX3ByZXYgIHwKKyAqCQkgIHwJdWhfZW50cnkgfCAgICB8ICAgICB1aF9lbnRyeSB8CSAgfAl1aF9lbnRyeSB8CisgKgkJICArLS0tLS0tLS18LS0tLS0rICAgICstLS0tLS0tLXwtLS0tLSsJICArLS0tLS0tLS18LS0tLS0rCisgKgkJCSAgIHwJCSAgICAgICB8CQkgICB8CisgKgkJCSAgIFYJCSAgICAgICBWCQkgICBWCisgKgkJICArLS0tLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tLSsJICArLS0tLS0tLS0tLS0tLS0rCisgKgkJICB8IHVfZW50cnkJIHwgICAgfCB1X2VudHJ5ICAgICAgfAkgIHwgdV9lbnRyeQkgfAorICoJCSAgfAl1ZV9uZXh0ICB8ICAgIHwgICAgIHVlX25leHQgIHwJICB8CXVlX25leHQgIHwKKyAqCQkgICstLS0tLS0tLXwtLS0tLSsgICAgKy0tLS0tLS0tfC0tLS0tKwkgICstLS0tLS0tLXwtLS0tLSsKKyAqCQkJICAgfAkJICAgICAgIHwJCSAgIHwKKyAqCQkJICAgVgkJICAgICAgIFYJCSAgIFYKKyAqCQkgICstLS0tLS0tLS0tLS0tLSsJICAgICAgTlVMTAkJICBOVUxMCisgKgkJICB8IHVfZW50cnkJIHwKKyAqCQkgIHwJdWVfbmV4dCAgfAorICoJCSAgKy0tLS0tLS0tfC0tLS0tKworICoJCQkgICB8CisgKgkJCSAgIFYKKyAqCQkJICBldGMuCisgKgorICogRWFjaCB1X2VudHJ5IGxpc3QgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGZvciBvbmUgdW5kbyBvciByZWRvLgorICogY3VyYnVmLT5iX3VfY3VyaGVhZCBwb2ludHMgdG8gdGhlIGhlYWRlciBvZiB0aGUgbGFzdCB1bmRvICh0aGUgbmV4dCByZWRvKSwKKyAqIG9yIGlzIE5VTEwgaWYgbm90aGluZyBoYXMgYmVlbiB1bmRvbmUuCisgKgorICogQWxsIGRhdGEgaXMgYWxsb2NhdGVkIHdpdGggdV9hbGxvY19saW5lKCksIHRodXMgaXQgd2lsbCBiZSBmcmVlZCBhcyBzb29uIGFzCisgKiB3ZSBzd2l0Y2ggZmlsZXMhCisgKi8KKworI2luY2x1ZGUgInZpbS5oIgorCitzdGF0aWMgdV9lbnRyeV9UICp1X2dldF9oZWFkZW50cnkgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB1X2dldGJvdCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyBpbnQgdV9zYXZlY29tbW9uIF9fQVJHUygobGluZW5yX1QsIGxpbmVucl9ULCBsaW5lbnJfVCkpOworc3RhdGljIHZvaWQgdV9kb2l0IF9fQVJHUygoaW50IGNvdW50KSk7CitzdGF0aWMgdm9pZCB1X3VuZG9yZWRvIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgdV91bmRvX2VuZCBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHVfZnJlZWxpc3QgX19BUkdTKChzdHJ1Y3QgdV9oZWFkZXIgKikpOworc3RhdGljIHZvaWQgdV9mcmVlZW50cnkgX19BUkdTKCh1X2VudHJ5X1QgKiwgbG9uZykpOworCitzdGF0aWMgY2hhcl91ICp1X2Jsb2NrYWxsb2MgX19BUkdTKChsb25nX3UpKTsKK3N0YXRpYyB2b2lkIHVfZnJlZV9saW5lIF9fQVJHUygoY2hhcl91ICosIGludCBrZWVwKSk7CitzdGF0aWMgY2hhcl91ICp1X2FsbG9jX2xpbmUgX19BUkdTKCh1bnNpZ25lZCkpOworc3RhdGljIGNoYXJfdSAqdV9zYXZlX2xpbmUgX19BUkdTKChsaW5lbnJfVCkpOworCitzdGF0aWMgbG9uZwl1X25ld2NvdW50LCB1X29sZGNvdW50OworCisvKgorICogV2hlbiAndScgZmxhZyBpbmNsdWRlZCBpbiAnY3BvcHRpb25zJywgd2UgYmVoYXZlIGxpa2UgdmkuICBOZWVkIHRvIHJlbWVtYmVyCisgKiB0aGUgYWN0aW9uIHRoYXQgInUiIHNob3VsZCBkby4KKyAqLworc3RhdGljIGludAl1bmRvX3VuZG9lcyA9IEZBTFNFOworCisvKgorICogc2F2ZSB0aGUgY3VycmVudCBsaW5lIGZvciBib3RoIHRoZSAidSIgYW5kICJVIiBjb21tYW5kCisgKi8KKyAgICBpbnQKK3Vfc2F2ZV9jdXJzb3IoKQoreworICAgIHJldHVybiAodV9zYXZlKChsaW5lbnJfVCkoY3Vyd2luLT53X2N1cnNvci5sbnVtIC0gMSksCisJCQkJICAgICAgKGxpbmVucl9UKShjdXJ3aW4tPndfY3Vyc29yLmxudW0gKyAxKSkpOworfQorCisvKgorICogU2F2ZSB0aGUgbGluZXMgYmV0d2VlbiAidG9wIiBhbmQgImJvdCIgZm9yIGJvdGggdGhlICJ1IiBhbmQgIlUiIGNvbW1hbmQuCisgKiAidG9wIiBtYXkgYmUgMCBhbmQgYm90IG1heSBiZSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCArIDEuCisgKiBSZXR1cm5zIEZBSUwgd2hlbiBsaW5lcyBjb3VsZCBub3QgYmUgc2F2ZWQsIE9LIG90aGVyd2lzZS4KKyAqLworICAgIGludAordV9zYXZlKHRvcCwgYm90KQorICAgIGxpbmVucl9UIHRvcCwgYm90OworeworICAgIGlmICh1bmRvX29mZikKKwlyZXR1cm4gT0s7CisKKyAgICBpZiAodG9wID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgfHwKKwkJCSAgICB0b3AgPj0gYm90IHx8IGJvdCA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMSkKKwlyZXR1cm4gRkFMU0U7CS8qIHJlbHkgb24gY2FsbGVyIHRvIGRvIGVycm9yIG1lc3NhZ2VzICovCisKKyAgICBpZiAodG9wICsgMiA9PSBib3QpCisJdV9zYXZlbGluZSgobGluZW5yX1QpKHRvcCArIDEpKTsKKworICAgIHJldHVybiAodV9zYXZlY29tbW9uKHRvcCwgYm90LCAobGluZW5yX1QpMCkpOworfQorCisvKgorICogc2F2ZSB0aGUgbGluZSAibG51bSIgKHVzZWQgYnkgIjpzIiBhbmQgIn4iIGNvbW1hbmQpCisgKiBUaGUgbGluZSBpcyByZXBsYWNlZCwgc28gdGhlIG5ldyBib3R0b20gbGluZSBpcyBsbnVtICsgMS4KKyAqLworICAgIGludAordV9zYXZlc3ViKGxudW0pCisgICAgbGluZW5yX1QJbG51bTsKK3sKKyAgICBpZiAodW5kb19vZmYpCisJcmV0dXJuIE9LOworCisgICAgcmV0dXJuICh1X3NhdmVjb21tb24obG51bSAtIDEsIGxudW0gKyAxLCBsbnVtICsgMSkpOworfQorCisvKgorICogYSBuZXcgbGluZSBpcyBpbnNlcnRlZCBiZWZvcmUgbGluZSAibG51bSIgKHVzZWQgYnkgOnMgY29tbWFuZCkKKyAqIFRoZSBsaW5lIGlzIGluc2VydGVkLCBzbyB0aGUgbmV3IGJvdHRvbSBsaW5lIGlzIGxudW0gKyAxLgorICovCisgICAgaW50Cit1X2luc3N1YihsbnVtKQorICAgIGxpbmVucl9UCWxudW07Cit7CisgICAgaWYgKHVuZG9fb2ZmKQorCXJldHVybiBPSzsKKworICAgIHJldHVybiAodV9zYXZlY29tbW9uKGxudW0gLSAxLCBsbnVtLCBsbnVtICsgMSkpOworfQorCisvKgorICogc2F2ZSB0aGUgbGluZXMgImxudW0iIC0gImxudW0iICsgbmxpbmVzICh1c2VkIGJ5IGRlbGV0ZSBjb21tYW5kKQorICogVGhlIGxpbmVzIGFyZSBkZWxldGVkLCBzbyB0aGUgbmV3IGJvdHRvbSBsaW5lIGlzIGxudW0sIHVubGVzcyB0aGUgYnVmZmVyCisgKiBiZWNvbWVzIGVtcHR5LgorICovCisgICAgaW50Cit1X3NhdmVkZWwobG51bSwgbmxpbmVzKQorICAgIGxpbmVucl9UCWxudW07CisgICAgbG9uZwlubGluZXM7Cit7CisgICAgaWYgKHVuZG9fb2ZmKQorCXJldHVybiBPSzsKKworICAgIHJldHVybiAodV9zYXZlY29tbW9uKGxudW0gLSAxLCBsbnVtICsgbmxpbmVzLAorCQkJbmxpbmVzID09IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID8gMiA6IGxudW0pKTsKK30KKworICAgIHN0YXRpYyBpbnQKK3Vfc2F2ZWNvbW1vbih0b3AsIGJvdCwgbmV3Ym90KQorICAgIGxpbmVucl9UCXRvcCwgYm90OworICAgIGxpbmVucl9UCW5ld2JvdDsKK3sKKyAgICBsaW5lbnJfVAkJbG51bTsKKyAgICBsb25nCQlpOworICAgIHN0cnVjdCB1X2hlYWRlcgkqdWhwOworICAgIHVfZW50cnlfVAkJKnVlcDsKKyAgICB1X2VudHJ5X1QJCSpwcmV2X3VlcDsKKyAgICBsb25nCQlzaXplOworCisgICAgLyoKKyAgICAgKiBEb24ndCBhbGxvdyBjaGFuZ2VzIHdoZW4gJ21vZGlmaWFibGUnIGlzIG9mZi4gIExldHRpbmcgdGhlCisgICAgICogdW5kbyBmYWlsIGlzIGEgY3J1ZGUgd2F5IHRvIG1ha2UgYWxsIGNoYW5nZSBjb21tYW5kcyBmYWlsLgorICAgICAqLworICAgIGlmICghY3VyYnVmLT5iX3BfbWEpCisgICAgeworCUVNU0coXyhlX21vZGlmaWFibGUpKTsKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1NBTkRCT1gKKyAgICAvKgorICAgICAqIEluIHRoZSBzYW5kYm94IGl0J3Mgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSB0ZXh0LiAgTGV0dGluZyB0aGUKKyAgICAgKiB1bmRvIGZhaWwgaXMgYSBjcnVkZSB3YXkgdG8gbWFrZSBhbGwgY2hhbmdlIGNvbW1hbmRzIGZhaWwuCisgICAgICovCisgICAgaWYgKHNhbmRib3ggIT0gMCkKKyAgICB7CisJRU1TRyhfKGVfc2FuZGJveCkpOworCXJldHVybiBGQUlMOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgLyoKKyAgICAgKiBOZXRiZWFucyBkZWZpbmVzIGFyZWFzIHRoYXQgY2Fubm90IGJlIG1vZGlmaWVkLiAgQmFpbCBvdXQgaGVyZSB3aGVuCisgICAgICogdHJ5aW5nIHRvIGNoYW5nZSB0ZXh0IGluIGEgZ3VhcmRlZCBhcmVhLgorICAgICAqLworICAgIGlmICh1c2luZ05ldGJlYW5zICYmIG5ldGJlYW5zX2lzX2d1YXJkZWQodG9wLCBib3QpKQorICAgIHsKKwlFTVNHKF8oZV9ndWFyZGVkKSk7CisJcmV0dXJuIEZBSUw7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICAvKgorICAgICAqIFNhdmluZyB0ZXh0IGZvciB1bmRvIG1lYW5zIHdlIGFyZSBnb2luZyB0byBtYWtlIGEgY2hhbmdlLiAgR2l2ZSBhCisgICAgICogd2FybmluZyBmb3IgYSByZWFkLW9ubHkgZmlsZSBiZWZvcmUgbWFraW5nIHRoZSBjaGFuZ2UsIHNvIHRoYXQgdGhlCisgICAgICogRmlsZUNoYW5nZWRSTyBldmVudCBjYW4gcmVwbGFjZSB0aGUgYnVmZmVyIHdpdGggYSByZWFkLXdyaXRlIHZlcnNpb24KKyAgICAgKiAoZS5nLiwgb2J0YWluZWQgZnJvbSBhIHNvdXJjZSBjb250cm9sIHN5c3RlbSkuCisgICAgICovCisgICAgY2hhbmdlX3dhcm5pbmcoMCk7CisjZW5kaWYKKworICAgIHNpemUgPSBib3QgLSB0b3AgLSAxOworCisgICAgLyoKKyAgICAgKiBpZiBjdXJidWYtPmJfdV9zeW5jZWQgPT0gVFJVRSBtYWtlIGEgbmV3IGhlYWRlcgorICAgICAqLworICAgIGlmIChjdXJidWYtPmJfdV9zeW5jZWQpCisgICAgeworI2lmZGVmIEZFQVRfSlVNUExJU1QKKwkvKiBOZWVkIHRvIGNyZWF0ZSBuZXcgZW50cnkgaW4gYl9jaGFuZ2VsaXN0LiAqLworCWN1cmJ1Zi0+Yl9uZXdfY2hhbmdlID0gVFJVRTsKKyNlbmRpZgorCisJLyoKKwkgKiBpZiB3ZSB1bmRpZCBtb3JlIHRoYW4gd2UgcmVkaWQsIGZyZWUgdGhlIGVudHJ5IGxpc3RzIGJlZm9yZSBhbmQKKwkgKiBpbmNsdWRpbmcgY3VyYnVmLT5iX3VfY3VyaGVhZAorCSAqLworCXdoaWxlIChjdXJidWYtPmJfdV9jdXJoZWFkICE9IE5VTEwpCisJICAgIHVfZnJlZWxpc3QoY3VyYnVmLT5iX3VfbmV3aGVhZCk7CisKKwkvKgorCSAqIGZyZWUgaGVhZGVycyB0byBrZWVwIHRoZSBzaXplIHJpZ2h0CisJICovCisJd2hpbGUgKGN1cmJ1Zi0+Yl91X251bWhlYWQgPiBwX3VsICYmIGN1cmJ1Zi0+Yl91X29sZGhlYWQgIT0gTlVMTCkKKwkgICAgdV9mcmVlbGlzdChjdXJidWYtPmJfdV9vbGRoZWFkKTsKKworCWlmIChwX3VsIDwgMCkJCS8qIG5vIHVuZG8gYXQgYWxsICovCisJeworCSAgICBjdXJidWYtPmJfdV9zeW5jZWQgPSBGQUxTRTsKKwkgICAgcmV0dXJuIE9LOworCX0KKworCS8qCisJICogbWFrZSBhIG5ldyBoZWFkZXIgZW50cnkKKwkgKi8KKwl1aHAgPSAoc3RydWN0IHVfaGVhZGVyICopdV9hbGxvY19saW5lKCh1bnNpZ25lZCkKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB1X2hlYWRlcikpOworCWlmICh1aHAgPT0gTlVMTCkKKwkgICAgZ290byBub21lbTsKKwl1aHAtPnVoX3ByZXYgPSBOVUxMOworCXVocC0+dWhfbmV4dCA9IGN1cmJ1Zi0+Yl91X25ld2hlYWQ7CisJaWYgKGN1cmJ1Zi0+Yl91X25ld2hlYWQgIT0gTlVMTCkKKwkgICAgY3VyYnVmLT5iX3VfbmV3aGVhZC0+dWhfcHJldiA9IHVocDsKKwl1aHAtPnVoX2VudHJ5ID0gTlVMTDsKKwl1aHAtPnVoX2dldGJvdF9lbnRyeSA9IE5VTEw7CisJdWhwLT51aF9jdXJzb3IgPSBjdXJ3aW4tPndfY3Vyc29yOwkvKiBzYXZlIGN1cnNvciBwb3MuIGZvciB1bmRvICovCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCWlmICh2aXJ0dWFsX2FjdGl2ZSgpICYmIGN1cndpbi0+d19jdXJzb3IuY29sYWRkID4gMCkKKwkgICAgdWhwLT51aF9jdXJzb3JfdmNvbCA9IGdldHZpc2NvbCgpOworCWVsc2UKKwkgICAgdWhwLT51aF9jdXJzb3JfdmNvbCA9IC0xOworI2VuZGlmCisKKwkvKiBzYXZlIGNoYW5nZWQgYW5kIGJ1ZmZlciBlbXB0eSBmbGFnIGZvciB1bmRvICovCisJdWhwLT51aF9mbGFncyA9IChjdXJidWYtPmJfY2hhbmdlZCA/IFVIX0NIQU5HRUQgOiAwKSArCisJCSAgICAgICAoKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKSA/IFVIX0VNUFRZQlVGIDogMCk7CisKKwkvKiBzYXZlIG5hbWVkIG1hcmtzIGZvciB1bmRvICovCisJbWNoX21lbW1vdmUodWhwLT51aF9uYW1lZG0sIGN1cmJ1Zi0+Yl9uYW1lZG0sIHNpemVvZihwb3NfVCkgKiBOTUFSS1MpOworCWN1cmJ1Zi0+Yl91X25ld2hlYWQgPSB1aHA7CisJaWYgKGN1cmJ1Zi0+Yl91X29sZGhlYWQgPT0gTlVMTCkKKwkgICAgY3VyYnVmLT5iX3Vfb2xkaGVhZCA9IHVocDsKKwkrK2N1cmJ1Zi0+Yl91X251bWhlYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKHBfdWwgPCAwKQkJLyogbm8gdW5kbyBhdCBhbGwgKi8KKwkgICAgcmV0dXJuIE9LOworCisJLyoKKwkgKiBXaGVuIHNhdmluZyBhIHNpbmdsZSBsaW5lLCBhbmQgaXQgaGFzIGJlZW4gc2F2ZWQganVzdCBiZWZvcmUsIGl0CisJICogZG9lc24ndCBtYWtlIHNlbnNlIHNhdmluZyBpdCBhZ2Fpbi4gIFNhdmVzIGEgbG90IG9mIG1lbW9yeSB3aGVuCisJICogbWFraW5nIGxvdHMgb2YgY2hhbmdlcyBpbnNpZGUgdGhlIHNhbWUgbGluZS4KKwkgKiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHByZXZpb3VzIGNoYW5nZSBkaWRuJ3QgaW5jcmVhc2Ugb3IKKwkgKiBkZWNyZWFzZSB0aGUgbnVtYmVyIG9mIGxpbmVzLgorCSAqIENoZWNrIHRoZSB0ZW4gbGFzdCBjaGFuZ2VzLiAgTW9yZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW5kIHRha2VzIHRvbworCSAqIGxvbmcuCisJICovCisJaWYgKHNpemUgPT0gMSkKKwl7CisJICAgIHVlcCA9IHVfZ2V0X2hlYWRlbnRyeSgpOworCSAgICBwcmV2X3VlcCA9IE5VTEw7CisJICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorCSAgICB7CisJCWlmICh1ZXAgPT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCS8qIElmIGxpbmVzIGhhdmUgYmVlbiBpbnNlcnRlZC9kZWxldGVkIHdlIGdpdmUgdXAuCisJCSAqIEFsc28gd2hlbiB0aGUgbGluZSB3YXMgaW5jbHVkZWQgaW4gYSBtdWx0aS1saW5lIHNhdmUuICovCisJCWlmICgoY3VyYnVmLT5iX3VfbmV3aGVhZC0+dWhfZ2V0Ym90X2VudHJ5ICE9IHVlcAorCQkJICAgID8gKHVlcC0+dWVfdG9wICsgdWVwLT51ZV9zaXplICsgMQorCQkJCSE9ICh1ZXAtPnVlX2JvdCA9PSAwCisJCQkJICAgID8gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgKyAxCisJCQkJICAgIDogdWVwLT51ZV9ib3QpKQorCQkJICAgIDogdWVwLT51ZV9sY291bnQgIT0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCQl8fCAodWVwLT51ZV9zaXplID4gMQorCQkJICAgICYmIHRvcCA+PSB1ZXAtPnVlX3RvcAorCQkJICAgICYmIHRvcCArIDIgPD0gdWVwLT51ZV90b3AgKyB1ZXAtPnVlX3NpemUgKyAxKSkKKwkJICAgIGJyZWFrOworCisJCS8qIElmIGl0J3MgdGhlIHNhbWUgbGluZSB3ZSBjYW4gc2tpcCBzYXZpbmcgaXQgYWdhaW4uICovCisJCWlmICh1ZXAtPnVlX3NpemUgPT0gMSAmJiB1ZXAtPnVlX3RvcCA9PSB0b3ApCisJCXsKKwkJICAgIGlmIChpID4gMCkKKwkJICAgIHsKKwkJCS8qIEl0J3Mgbm90IHRoZSBsYXN0IGVudHJ5OiBnZXQgdWVfYm90IGZvciB0aGUgbGFzdAorCQkJICogZW50cnkgbm93LiAgRm9sbG93aW5nIGRlbGV0ZWQvaW5zZXJ0ZWQgbGluZXMgZ28gdG8KKwkJCSAqIHRoZSByZS11c2VkIGVudHJ5LiAqLworCQkJdV9nZXRib3QoKTsKKwkJCWN1cmJ1Zi0+Yl91X3N5bmNlZCA9IEZBTFNFOworCisJCQkvKiBNb3ZlIHRoZSBmb3VuZCBlbnRyeSB0byBiZWNvbWUgdGhlIGxhc3QgZW50cnkuICBUaGUKKwkJCSAqIG9yZGVyIG9mIHVuZG8vcmVkbyBkb2Vzbid0IG1hdHRlciBmb3IgdGhlIGVudHJpZXMKKwkJCSAqIHdlIG1vdmUgaXQgb3Zlciwgc2luY2UgdGhleSBkb24ndCBjaGFuZ2UgdGhlIGxpbmUKKwkJCSAqIGNvdW50IGFuZCBkb24ndCBpbmNsdWRlIHRoaXMgbGluZS4gIEl0IGRvZXMgbWF0dGVyCisJCQkgKiBmb3IgdGhlIGZvdW5kIGVudHJ5IGlmIHRoZSBsaW5lIGNvdW50IGlzIGNoYW5nZWQgYnkKKwkJCSAqIHRoZSBleGVjdXRlZCBjb21tYW5kLiAqLworCQkJcHJldl91ZXAtPnVlX25leHQgPSB1ZXAtPnVlX25leHQ7CisJCQl1ZXAtPnVlX25leHQgPSBjdXJidWYtPmJfdV9uZXdoZWFkLT51aF9lbnRyeTsKKwkJCWN1cmJ1Zi0+Yl91X25ld2hlYWQtPnVoX2VudHJ5ID0gdWVwOworCQkgICAgfQorCisJCSAgICAvKiBUaGUgZXhlY3V0ZWQgY29tbWFuZCBtYXkgY2hhbmdlIHRoZSBsaW5lIGNvdW50LiAqLworCQkgICAgaWYgKG5ld2JvdCAhPSAwKQorCQkJdWVwLT51ZV9ib3QgPSBuZXdib3Q7CisJCSAgICBlbHNlIGlmIChib3QgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwkJCXVlcC0+dWVfYm90ID0gMDsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCXVlcC0+dWVfbGNvdW50ID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJCQljdXJidWYtPmJfdV9uZXdoZWFkLT51aF9nZXRib3RfZW50cnkgPSB1ZXA7CisJCSAgICB9CisJCSAgICByZXR1cm4gT0s7CisJCX0KKwkJcHJldl91ZXAgPSB1ZXA7CisJCXVlcCA9IHVlcC0+dWVfbmV4dDsKKwkgICAgfQorCX0KKworCS8qIGZpbmQgbGluZSBudW1iZXIgZm9yIHVlX2JvdCBmb3IgcHJldmlvdXMgdV9zYXZlKCkgKi8KKwl1X2dldGJvdCgpOworICAgIH0KKworI2lmICFkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKERKR1BQKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19FTVhfXykKKwkvKgorCSAqIFdpdGggQW1pZ2EgYW5kIE1TRE9TIDE2IGJpdCB3ZSBjYW4ndCBoYW5kbGUgYmlnIHVuZG8ncywgYmVjYXVzZQorCSAqIHRoZW4gdV9hbGxvY19saW5lIHdvdWxkIGhhdmUgdG8gYWxsb2NhdGUgYSBibG9jayBsYXJnZXIgdGhhbiAzMksKKwkgKi8KKyAgICBpZiAoc2l6ZSA+PSA4MDAwKQorCWdvdG8gbm9tZW07CisjZW5kaWYKKworICAgIC8qCisgICAgICogYWRkIGxpbmVzIGluIGZyb250IG9mIGVudHJ5IGxpc3QKKyAgICAgKi8KKyAgICB1ZXAgPSAodV9lbnRyeV9UICopdV9hbGxvY19saW5lKCh1bnNpZ25lZClzaXplb2YodV9lbnRyeV9UKSk7CisgICAgaWYgKHVlcCA9PSBOVUxMKQorCWdvdG8gbm9tZW07CisKKyAgICB1ZXAtPnVlX3NpemUgPSBzaXplOworICAgIHVlcC0+dWVfdG9wID0gdG9wOworICAgIGlmIChuZXdib3QgIT0gMCkKKwl1ZXAtPnVlX2JvdCA9IG5ld2JvdDsKKyAgICAvKgorICAgICAqIFVzZSAwIGZvciB1ZV9ib3QgaWYgYm90IGlzIGJlbG93IGxhc3QgbGluZS4KKyAgICAgKiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBjb21wdXRlIHVlX2JvdCBsYXRlci4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChib3QgPiBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKKwl1ZXAtPnVlX2JvdCA9IDA7CisgICAgZWxzZQorICAgIHsKKwl1ZXAtPnVlX2xjb3VudCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OworCWN1cmJ1Zi0+Yl91X25ld2hlYWQtPnVoX2dldGJvdF9lbnRyeSA9IHVlcDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSkKKyAgICB7CisJaWYgKCh1ZXAtPnVlX2FycmF5ID0gKGNoYXJfdSAqKil1X2FsbG9jX2xpbmUoCisJCQkJKHVuc2lnbmVkKShzaXplb2YoY2hhcl91ICopICogc2l6ZSkpKSA9PSBOVUxMKQorCXsKKwkgICAgdV9mcmVlZW50cnkodWVwLCAwTCk7CisJICAgIGdvdG8gbm9tZW07CisJfQorCWZvciAoaSA9IDAsIGxudW0gPSB0b3AgKyAxOyBpIDwgc2l6ZTsgKytpKQorCXsKKwkgICAgaWYgKCh1ZXAtPnVlX2FycmF5W2ldID0gdV9zYXZlX2xpbmUobG51bSsrKSkgPT0gTlVMTCkKKwkgICAgeworCQl1X2ZyZWVlbnRyeSh1ZXAsIGkpOworCQlnb3RvIG5vbWVtOworCSAgICB9CisJfQorICAgIH0KKyAgICB1ZXAtPnVlX25leHQgPSBjdXJidWYtPmJfdV9uZXdoZWFkLT51aF9lbnRyeTsKKyAgICBjdXJidWYtPmJfdV9uZXdoZWFkLT51aF9lbnRyeSA9IHVlcDsKKyAgICBjdXJidWYtPmJfdV9zeW5jZWQgPSBGQUxTRTsKKyAgICB1bmRvX3VuZG9lcyA9IEZBTFNFOworCisgICAgcmV0dXJuIE9LOworCitub21lbToKKyAgICBtc2dfc2lsZW50ID0gMDsJLyogbXVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgKi8KKyAgICBpZiAoYXNrX3llc25vKChjaGFyX3UgKilfKCJObyB1bmRvIHBvc3NpYmxlOyBjb250aW51ZSBhbnl3YXkiKSwgVFJVRSkKKwkJCQkJCQkJICAgICAgID09ICd5JykKKyAgICB7CisJdW5kb19vZmYgPSBUUlVFOwkgICAgLyogd2lsbCBiZSByZXNldCB3aGVuIGNoYXJhY3RlciB0eXBlZCAqLworCXJldHVybiBPSzsKKyAgICB9CisgICAgZG9fb3V0b2ZtZW1fbXNnKChsb25nX3UpMCk7CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKy8qCisgKiBJZiAnY3BvcHRpb25zJyBjb250YWlucyAndSc6IFVuZG8gdGhlIHByZXZpb3VzIHVuZG8gb3IgcmVkbyAodmkgY29tcGF0aWJsZSkuCisgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICd1JzogQWx3YXlzIHVuZG8uCisgKi8KKyAgICB2b2lkCit1X3VuZG8oY291bnQpCisgICAgaW50IGNvdW50OworeworICAgIC8qCisgICAgICogSWYgd2UgZ2V0IGFuIHVuZG8gY29tbWFuZCB3aGlsZSBleGVjdXRpbmcgYSBtYWNybywgd2UgYmVoYXZlIGxpa2UgdGhlCisgICAgICogb3JpZ2luYWwgdmkuIElmIHRoaXMgaGFwcGVucyB0d2ljZSBpbiBvbmUgbWFjcm8gdGhlIHJlc3VsdCB3aWxsIG5vdAorICAgICAqIGJlIGNvbXBhdGlibGUuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl91X3N5bmNlZCA9PSBGQUxTRSkKKyAgICB7CisJdV9zeW5jKCk7CisJY291bnQgPSAxOworICAgIH0KKworICAgIGlmICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fVU5ETykgPT0gTlVMTCkKKwl1bmRvX3VuZG9lcyA9IFRSVUU7CisgICAgZWxzZQorCXVuZG9fdW5kb2VzID0gIXVuZG9fdW5kb2VzOworICAgIHVfZG9pdChjb3VudCk7Cit9CisKKy8qCisgKiBJZiAnY3BvcHRpb25zJyBjb250YWlucyAndSc6IFJlcGVhdCB0aGUgcHJldmlvdXMgdW5kbyBvciByZWRvLgorICogSWYgJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAndSc6IEFsd2F5cyByZWRvLgorICovCisgICAgdm9pZAordV9yZWRvKGNvdW50KQorICAgIGludCBjb3VudDsKK3sKKyAgICBpZiAodmltX3N0cmNocihwX2NwbywgQ1BPX1VORE8pID09IE5VTEwpCisJdW5kb191bmRvZXMgPSBGQUxTRTsKKyAgICB1X2RvaXQoY291bnQpOworfQorCisvKgorICogVW5kbyBvciByZWRvLCBkZXBlbmRpbmcgb24gJ3VuZG9fdW5kb2VzJywgJ2NvdW50JyB0aW1lcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCit1X2RvaXQoY291bnQpCisgICAgaW50IGNvdW50OworeworICAgIC8qIERvbid0IGFsbG93IGNoYW5nZXMgd2hlbiAnbW9kaWZpYWJsZScgaXMgb2ZmLiAqLworICAgIGlmICghY3VyYnVmLT5iX3BfbWEpCisgICAgeworCUVNU0coXyhlX21vZGlmaWFibGUpKTsKKwlyZXR1cm47CisgICAgfQorI2lmZGVmIEhBVkVfU0FOREJPWAorICAgIC8qIEluIHRoZSBzYW5kYm94IGl0J3Mgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSB0ZXh0LiAqLworICAgIGlmIChzYW5kYm94ICE9IDApCisgICAgeworCUVNU0coXyhlX3NhbmRib3gpKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICB1X25ld2NvdW50ID0gMDsKKyAgICB1X29sZGNvdW50ID0gMDsKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisJaWYgKHVuZG9fdW5kb2VzKQorCXsKKwkgICAgaWYgKGN1cmJ1Zi0+Yl91X2N1cmhlYWQgPT0gTlVMTCkJCS8qIGZpcnN0IHVuZG8gKi8KKwkJY3VyYnVmLT5iX3VfY3VyaGVhZCA9IGN1cmJ1Zi0+Yl91X25ld2hlYWQ7CisJICAgIGVsc2UgaWYgKHBfdWwgPiAwKQkJCQkvKiBtdWx0aSBsZXZlbCB1bmRvICovCisJCS8qIGdldCBuZXh0IHVuZG8gKi8KKwkJY3VyYnVmLT5iX3VfY3VyaGVhZCA9IGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX25leHQ7CisJICAgIC8qIG5vdGhpbmcgdG8gdW5kbyAqLworCSAgICBpZiAoY3VyYnVmLT5iX3VfbnVtaGVhZCA9PSAwIHx8IGN1cmJ1Zi0+Yl91X2N1cmhlYWQgPT0gTlVMTCkKKwkgICAgeworCQkvKiBzdGljayBjdXJidWYtPmJfdV9jdXJoZWFkIGF0IGVuZCAqLworCQljdXJidWYtPmJfdV9jdXJoZWFkID0gY3VyYnVmLT5iX3Vfb2xkaGVhZDsKKwkJYmVlcF9mbHVzaCgpOworCQlicmVhazsKKwkgICAgfQorCisJICAgIHVfdW5kb3JlZG8oKTsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGN1cmJ1Zi0+Yl91X2N1cmhlYWQgPT0gTlVMTCB8fCBwX3VsIDw9IDApCisJICAgIHsKKwkJYmVlcF9mbHVzaCgpOwkvKiBub3RoaW5nIHRvIHJlZG8gKi8KKwkJYnJlYWs7CisJICAgIH0KKworCSAgICB1X3VuZG9yZWRvKCk7CisJICAgIC8qIGFkdmFuY2UgZm9yIG5leHQgcmVkbyAqLworCSAgICBjdXJidWYtPmJfdV9jdXJoZWFkID0gY3VyYnVmLT5iX3VfY3VyaGVhZC0+dWhfcHJldjsKKwl9CisgICAgfQorICAgIHVfdW5kb19lbmQoKTsKK30KKworLyoKKyAqIHVfdW5kb3JlZG86IGNvbW1vbiBjb2RlIGZvciB1bmRvIGFuZCByZWRvCisgKgorICogVGhlIGxpbmVzIGluIHRoZSBmaWxlIGFyZSByZXBsYWNlZCBieSB0aGUgbGluZXMgaW4gdGhlIGVudHJ5IGxpc3QgYXQKKyAqIGN1cmJ1Zi0+Yl91X2N1cmhlYWQuIFRoZSByZXBsYWNlZCBsaW5lcyBpbiB0aGUgZmlsZSBhcmUgc2F2ZWQgaW4gdGhlIGVudHJ5CisgKiBsaXN0IGZvciB0aGUgbmV4dCB1bmRvL3JlZG8uCisgKi8KKyAgICBzdGF0aWMgdm9pZAordV91bmRvcmVkbygpCit7CisgICAgY2hhcl91CSoqbmV3YXJyYXkgPSBOVUxMOworICAgIGxpbmVucl9UCW9sZHNpemU7CisgICAgbGluZW5yX1QJbmV3c2l6ZTsKKyAgICBsaW5lbnJfVAl0b3AsIGJvdDsKKyAgICBsaW5lbnJfVAlsbnVtOworICAgIGxpbmVucl9UCW5ld2xudW0gPSBNQVhMTlVNOworICAgIGxvbmcJaTsKKyAgICB1X2VudHJ5X1QJKnVlcCwgKm51ZXA7CisgICAgdV9lbnRyeV9UCSpuZXdsaXN0ID0gTlVMTDsKKyAgICBpbnQJCW9sZF9mbGFnczsKKyAgICBpbnQJCW5ld19mbGFnczsKKyAgICBwb3NfVAluYW1lZG1bTk1BUktTXTsKKyAgICBpbnQJCWVtcHR5X2J1ZmZlcjsJCSAgICAvKiBidWZmZXIgYmVjYW1lIGVtcHR5ICovCisKKyAgICBvbGRfZmxhZ3MgPSBjdXJidWYtPmJfdV9jdXJoZWFkLT51aF9mbGFnczsKKyAgICBuZXdfZmxhZ3MgPSAoY3VyYnVmLT5iX2NoYW5nZWQgPyBVSF9DSEFOR0VEIDogMCkgKworCSAgICAgICAoKGN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyAmIE1MX0VNUFRZKSA/IFVIX0VNUFRZQlVGIDogMCk7CisgICAgc2V0cGNtYXJrKCk7CisKKyAgICAvKgorICAgICAqIHNhdmUgbWFya3MgYmVmb3JlIHVuZG8vcmVkbworICAgICAqLworICAgIG1jaF9tZW1tb3ZlKG5hbWVkbSwgY3VyYnVmLT5iX25hbWVkbSwgc2l6ZW9mKHBvc19UKSAqIE5NQVJLUyk7CisgICAgY3VyYnVmLT5iX29wX3N0YXJ0LmxudW0gPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKyAgICBjdXJidWYtPmJfb3Bfc3RhcnQuY29sID0gMDsKKyAgICBjdXJidWYtPmJfb3BfZW5kLmxudW0gPSAwOworICAgIGN1cmJ1Zi0+Yl9vcF9lbmQuY29sID0gMDsKKworICAgIGZvciAodWVwID0gY3VyYnVmLT5iX3VfY3VyaGVhZC0+dWhfZW50cnk7IHVlcCAhPSBOVUxMOyB1ZXAgPSBudWVwKQorICAgIHsKKwl0b3AgPSB1ZXAtPnVlX3RvcDsKKwlib3QgPSB1ZXAtPnVlX2JvdDsKKwlpZiAoYm90ID09IDApCisJICAgIGJvdCA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMTsKKwlpZiAodG9wID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQgfHwgdG9wID49IGJvdAorCQkJCSAgICAgIHx8IGJvdCA+IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ICsgMSkKKwl7CisJICAgIEVNU0coXygiRTQzODogdV91bmRvOiBsaW5lIG51bWJlcnMgd3JvbmciKSk7CisJICAgIGNoYW5nZWQoKTsJCS8qIGRvbid0IHdhbnQgVU5DSEFOR0VEIG5vdyAqLworCSAgICByZXR1cm47CisJfQorCisJb2xkc2l6ZSA9IGJvdCAtIHRvcCAtIDE7ICAgIC8qIG51bWJlciBvZiBsaW5lcyBiZWZvcmUgdW5kbyAqLworCW5ld3NpemUgPSB1ZXAtPnVlX3NpemU7CSAgICAvKiBudW1iZXIgb2YgbGluZXMgYWZ0ZXIgdW5kbyAqLworCisJaWYgKHRvcCA8IG5ld2xudW0pCisJeworCSAgICAvKiBJZiB0aGUgc2F2ZWQgY3Vyc29yIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHVuZG8gYmxvY2ssIG1vdmUgaXQgdG8KKwkgICAgICogdGhlIHJlbWVtYmVyZWQgcG9zaXRpb24uICBNYWtlcyAiZ3dhcCIgcHV0IHRoZSBjdXJzb3IgYmFjaworCSAgICAgKiB3aGVyZSBpdCB3YXMuICovCisJICAgIGxudW0gPSBjdXJidWYtPmJfdV9jdXJoZWFkLT51aF9jdXJzb3IubG51bTsKKwkgICAgaWYgKGxudW0gPj0gdG9wICYmIGxudW0gPD0gdG9wICsgbmV3c2l6ZSArIDEpCisJICAgIHsKKwkJY3Vyd2luLT53X2N1cnNvciA9IGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX2N1cnNvcjsKKwkJbmV3bG51bSA9IGN1cndpbi0+d19jdXJzb3IubG51bSAtIDE7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIFVzZSB0aGUgZmlyc3QgbGluZSB0aGF0IGFjdHVhbGx5IGNoYW5nZWQuICBBdm9pZHMgdGhhdAorCQkgKiB1bmRvaW5nIGF1dG8tZm9ybWF0dGluZyBwdXRzIHRoZSBjdXJzb3IgaW4gdGhlIHByZXZpb3VzCisJCSAqIGxpbmUuICovCisJCWZvciAoaSA9IDA7IGkgPCBuZXdzaXplICYmIGkgPCBvbGRzaXplOyArK2kpCisJCSAgICBpZiAoU1RSQ01QKHVlcC0+dWVfYXJyYXlbaV0sIG1sX2dldCh0b3AgKyAxICsgaSkpICE9IDApCisJCQlicmVhazsKKwkJaWYgKGkgPT0gbmV3c2l6ZSAmJiBuZXdsbnVtID09IE1BWExOVU0gJiYgdWVwLT51ZV9uZXh0ID09IE5VTEwpCisJCXsKKwkJICAgIG5ld2xudW0gPSB0b3A7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBuZXdsbnVtICsgMTsKKwkJfQorCQllbHNlIGlmIChpIDwgbmV3c2l6ZSkKKwkJeworCQkgICAgbmV3bG51bSA9IHRvcCArIGk7CisJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPSBuZXdsbnVtICsgMTsKKwkJfQorCSAgICB9CisJfQorCisJZW1wdHlfYnVmZmVyID0gRkFMU0U7CisKKwkvKiBkZWxldGUgdGhlIGxpbmVzIGJldHdlZW4gdG9wIGFuZCBib3QgYW5kIHNhdmUgdGhlbSBpbiBuZXdhcnJheSAqLworCWlmIChvbGRzaXplKQorCXsKKwkgICAgaWYgKChuZXdhcnJheSA9IChjaGFyX3UgKiopdV9hbGxvY19saW5lKAorCQkJICAgICh1bnNpZ25lZCkoc2l6ZW9mKGNoYXJfdSAqKSAqIG9sZHNpemUpKSkgPT0gTlVMTCkKKwkgICAgeworCQlkb19vdXRvZm1lbV9tc2coKGxvbmdfdSkoc2l6ZW9mKGNoYXJfdSAqKSAqIG9sZHNpemUpKTsKKwkJLyoKKwkJICogV2UgaGF2ZSBtZXNzZWQgdXAgdGhlIGVudHJ5IGxpc3QsIHJlcGFpciBpcyBpbXBvc3NpYmxlLgorCQkgKiB3ZSBoYXZlIHRvIGZyZWUgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCisJCSAqLworCQl3aGlsZSAodWVwICE9IE5VTEwpCisJCXsKKwkJICAgIG51ZXAgPSB1ZXAtPnVlX25leHQ7CisJCSAgICB1X2ZyZWVlbnRyeSh1ZXAsIHVlcC0+dWVfc2l6ZSk7CisJCSAgICB1ZXAgPSBudWVwOworCQl9CisJCWJyZWFrOworCSAgICB9CisJICAgIC8qIGRlbGV0ZSBiYWNrd2FyZHMsIGl0IGdvZXMgZmFzdGVyIGluIG1vc3QgY2FzZXMgKi8KKwkgICAgZm9yIChsbnVtID0gYm90IC0gMSwgaSA9IG9sZHNpemU7IC0taSA+PSAwOyAtLWxudW0pCisJICAgIHsKKwkJLyogd2hhdCBjYW4gd2UgZG8gd2hlbiB3ZSBydW4gb3V0IG9mIG1lbW9yeT8gKi8KKwkJaWYgKChuZXdhcnJheVtpXSA9IHVfc2F2ZV9saW5lKGxudW0pKSA9PSBOVUxMKQorCQkgICAgZG9fb3V0b2ZtZW1fbXNnKChsb25nX3UpMCk7CisJCS8qIHJlbWVtYmVyIHdlIGRlbGV0ZWQgdGhlIGxhc3QgbGluZSBpbiB0aGUgYnVmZmVyLCBhbmQgYQorCQkgKiBkdW1teSBlbXB0eSBsaW5lIHdpbGwgYmUgaW5zZXJ0ZWQgKi8KKwkJaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID09IDEpCisJCSAgICBlbXB0eV9idWZmZXIgPSBUUlVFOworCQltbF9kZWxldGUobG51bSwgRkFMU0UpOworCSAgICB9CisJfQorCisJLyogaW5zZXJ0IHRoZSBsaW5lcyBpbiB1X2FycmF5IGJldHdlZW4gdG9wIGFuZCBib3QgKi8KKwlpZiAobmV3c2l6ZSkKKwl7CisJICAgIGZvciAobG51bSA9IHRvcCwgaSA9IDA7IGkgPCBuZXdzaXplOyArK2ksICsrbG51bSkKKwkgICAgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBpcyBlbXB0eSwgdGhlcmUgaXMgYW4gZW1wdHkgbGluZSAxIHRoYXQgd2UKKwkJICogc2hvdWxkIGdldCByaWQgb2YsIGJ5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuZXcgbGluZQorCQkgKi8KKwkJaWYgKGVtcHR5X2J1ZmZlciAmJiBsbnVtID09IDApCisJCSAgICBtbF9yZXBsYWNlKChsaW5lbnJfVCkxLCB1ZXAtPnVlX2FycmF5W2ldLCBUUlVFKTsKKwkJZWxzZQorCQkgICAgbWxfYXBwZW5kKGxudW0sIHVlcC0+dWVfYXJyYXlbaV0sIChjb2xucl9UKTAsIEZBTFNFKTsKKwkJdV9mcmVlX2xpbmUodWVwLT51ZV9hcnJheVtpXSwgRkFMU0UpOworCSAgICB9CisJICAgIHVfZnJlZV9saW5lKChjaGFyX3UgKil1ZXAtPnVlX2FycmF5LCBGQUxTRSk7CisJfQorCisJLyogYWRqdXN0IG1hcmtzICovCisJaWYgKG9sZHNpemUgIT0gbmV3c2l6ZSkKKwl7CisJICAgIG1hcmtfYWRqdXN0KHRvcCArIDEsIHRvcCArIG9sZHNpemUsIChsb25nKU1BWExOVU0sCisJCQkJCSAgICAgICAobG9uZyluZXdzaXplIC0gKGxvbmcpb2xkc2l6ZSk7CisJICAgIGlmIChjdXJidWYtPmJfb3Bfc3RhcnQubG51bSA+IHRvcCArIG9sZHNpemUpCisJCWN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtICs9IG5ld3NpemUgLSBvbGRzaXplOworCSAgICBpZiAoY3VyYnVmLT5iX29wX2VuZC5sbnVtID4gdG9wICsgb2xkc2l6ZSkKKwkJY3VyYnVmLT5iX29wX2VuZC5sbnVtICs9IG5ld3NpemUgLSBvbGRzaXplOworCX0KKworCWNoYW5nZWRfbGluZXModG9wICsgMSwgMCwgYm90LCBuZXdzaXplIC0gb2xkc2l6ZSk7CisKKwkvKiBzZXQgJ1sgYW5kICddIG1hcmsgKi8KKwlpZiAodG9wICsgMSA8IGN1cmJ1Zi0+Yl9vcF9zdGFydC5sbnVtKQorCSAgICBjdXJidWYtPmJfb3Bfc3RhcnQubG51bSA9IHRvcCArIDE7CisJaWYgKG5ld3NpemUgPT0gMCAmJiB0b3AgKyAxID4gY3VyYnVmLT5iX29wX2VuZC5sbnVtKQorCSAgICBjdXJidWYtPmJfb3BfZW5kLmxudW0gPSB0b3AgKyAxOworCWVsc2UgaWYgKHRvcCArIG5ld3NpemUgPiBjdXJidWYtPmJfb3BfZW5kLmxudW0pCisJICAgIGN1cmJ1Zi0+Yl9vcF9lbmQubG51bSA9IHRvcCArIG5ld3NpemU7CisKKwl1X25ld2NvdW50ICs9IG5ld3NpemU7CisJdV9vbGRjb3VudCArPSBvbGRzaXplOworCXVlcC0+dWVfc2l6ZSA9IG9sZHNpemU7CisJdWVwLT51ZV9hcnJheSA9IG5ld2FycmF5OworCXVlcC0+dWVfYm90ID0gdG9wICsgbmV3c2l6ZSArIDE7CisKKwkvKgorCSAqIGluc2VydCB0aGlzIGVudHJ5IGluIGZyb250IG9mIHRoZSBuZXcgZW50cnkgbGlzdAorCSAqLworCW51ZXAgPSB1ZXAtPnVlX25leHQ7CisJdWVwLT51ZV9uZXh0ID0gbmV3bGlzdDsKKwluZXdsaXN0ID0gdWVwOworICAgIH0KKworICAgIGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX2VudHJ5ID0gbmV3bGlzdDsKKyAgICBjdXJidWYtPmJfdV9jdXJoZWFkLT51aF9mbGFncyA9IG5ld19mbGFnczsKKyAgICBpZiAoKG9sZF9mbGFncyAmIFVIX0VNUFRZQlVGKSAmJiBidWZlbXB0eSgpKQorCWN1cmJ1Zi0+Yl9tbC5tbF9mbGFncyB8PSBNTF9FTVBUWTsKKyAgICBpZiAob2xkX2ZsYWdzICYgVUhfQ0hBTkdFRCkKKwljaGFuZ2VkKCk7CisgICAgZWxzZQorCXVuY2hhbmdlZChjdXJidWYsIEZBTFNFKTsKKworICAgIC8qCisgICAgICogcmVzdG9yZSBtYXJrcyBmcm9tIGJlZm9yZSB1bmRvL3JlZG8KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTk1BUktTOyArK2kpCisJaWYgKGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX25hbWVkbVtpXS5sbnVtKQorCXsKKwkgICAgY3VyYnVmLT5iX25hbWVkbVtpXSA9IGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX25hbWVkbVtpXTsKKwkgICAgY3VyYnVmLT5iX3VfY3VyaGVhZC0+dWhfbmFtZWRtW2ldID0gbmFtZWRtW2ldOworCX0KKworICAgIC8qCisgICAgICogSWYgdGhlIGN1cnNvciBpcyBvbmx5IG9mZiBieSBvbmUgbGluZSwgcHV0IGl0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzCisgICAgICogYmVmb3JlIHN0YXJ0aW5nIHRoZSBjaGFuZ2UgKGZvciB0aGUgIm8iIGNvbW1hbmQpLgorICAgICAqIE90aGVyd2lzZSB0aGUgY3Vyc29yIHNob3VsZCBnbyB0byB0aGUgZmlyc3QgdW5kb25lIGxpbmUuCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl91X2N1cmhlYWQtPnVoX2N1cnNvci5sbnVtICsgMSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0KKwkJCQkJCSAmJiBjdXJ3aW4tPndfY3Vyc29yLmxudW0gPiAxKQorCS0tY3Vyd2luLT53X2N1cnNvci5sbnVtOworICAgIGlmIChjdXJidWYtPmJfdV9jdXJoZWFkLT51aF9jdXJzb3IubG51bSA9PSBjdXJ3aW4tPndfY3Vyc29yLmxudW0pCisgICAgeworCWN1cndpbi0+d19jdXJzb3IuY29sID0gY3VyYnVmLT5iX3VfY3VyaGVhZC0+dWhfY3Vyc29yLmNvbDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJaWYgKHZpcnR1YWxfYWN0aXZlKCkgJiYgY3VyYnVmLT5iX3VfY3VyaGVhZC0+dWhfY3Vyc29yX3Zjb2wgPj0gMCkKKwkgICAgY29sYWR2YW5jZSgoY29sbnJfVCljdXJidWYtPmJfdV9jdXJoZWFkLT51aF9jdXJzb3JfdmNvbCk7CisJZWxzZQorCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyd2luLT53X2N1cnNvci5sbnVtIDw9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50KQorCWJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOworICAgIGVsc2UKKyAgICB7CisJLyogV2UgZ2V0IGhlcmUgd2l0aCB0aGUgY3VycmVudCBjdXJzb3IgbGluZSBiZWluZyBwYXN0IHRoZSBlbmQgKGVnCisJICogYWZ0ZXIgYWRkaW5nIGxpbmVzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCB0aGVuIHVuZG9pbmcgaXQpLgorCSAqIGNoZWNrX2N1cnNvcigpIHdpbGwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IGxpbmUuICBNb3ZlIGl0IHRvCisJICogdGhlIGZpcnN0IGNvbHVtbiBoZXJlLiAqLworCWN1cndpbi0+d19jdXJzb3IuY29sID0gMDsKKyNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXMgb24gYW4gZXhpc3RpbmcgbGluZSBhbmQgY29sdW1uLiAqLworICAgIGNoZWNrX2N1cnNvcigpOworfQorCisvKgorICogSWYgd2UgZGVsZXRlZCBvciBhZGRlZCBsaW5lcywgcmVwb3J0IHRoZSBudW1iZXIgb2YgbGVzcy9tb3JlIGxpbmVzLgorICogT3RoZXJ3aXNlLCByZXBvcnQgdGhlIG51bWJlciBvZiBjaGFuZ2VzICh0aGlzIG1heSBiZSBpbmNvcnJlY3QKKyAqIGluIHNvbWUgY2FzZXMsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcpLgorICovCisgICAgc3RhdGljIHZvaWQKK3VfdW5kb19lbmQoKQoreworICAgIGlmICgodV9vbGRjb3VudCAtPSB1X25ld2NvdW50KSAhPSAwKQorCW1zZ21vcmUoLXVfb2xkY291bnQpOworICAgIGVsc2UgaWYgKHVfbmV3Y291bnQgPiBwX3JlcG9ydCkKKyAgICB7CisJaWYgKHVfbmV3Y291bnQgPT0gMSkKKwkgICAgTVNHKF8oIjEgY2hhbmdlIikpOworCWVsc2UKKwkgICAgc21zZygoY2hhcl91ICopXygiJWxkIGNoYW5nZXMiKSwgdV9uZXdjb3VudCk7CisgICAgfQorI2lmZGVmIEZFQVRfRk9MRElORworICAgIGlmICgoZmRvX2ZsYWdzICYgRkRPX1VORE8pICYmIEtleVR5cGVkKQorCWZvbGRPcGVuQ3Vyc29yKCk7CisjZW5kaWYKK30KKworLyoKKyAqIHVfc3luYzogc3RvcCBhZGRpbmcgdG8gdGhlIGN1cnJlbnQgZW50cnkgbGlzdAorICovCisgICAgdm9pZAordV9zeW5jKCkKK3sKKyAgICBpZiAoY3VyYnVmLT5iX3Vfc3luY2VkKQorCXJldHVybjsJCSAgICAvKiBhbHJlYWR5IHN5bmNlZCAqLworI2lmIGRlZmluZWQoRkVBVF9YSU0pICYmIGRlZmluZWQoRkVBVF9HVUlfR1RLKQorICAgIGlmIChpbV9pc19wcmVlZGl0aW5nKCkpCisJcmV0dXJuOwkJICAgIC8qIFhJTSBpcyBidXN5LCBkb24ndCBicmVhayBhbiB1bmRvIHNlcXVlbmNlICovCisjZW5kaWYKKyAgICBpZiAocF91bCA8IDApCisJY3VyYnVmLT5iX3Vfc3luY2VkID0gVFJVRTsgIC8qIG5vIGVudHJpZXMsIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBlbHNlCisgICAgeworCXVfZ2V0Ym90KCk7CQkgICAgLyogY29tcHV0ZSB1ZV9ib3Qgb2YgcHJldmlvdXMgdV9zYXZlICovCisJY3VyYnVmLT5iX3VfY3VyaGVhZCA9IE5VTEw7CisgICAgfQorfQorCisvKgorICogQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIGZpbGUgYW5kIHNldHRpbmcgYl9jaGFuZ2VkIHRvIEZBTFNFLgorICogTm93IGFuIHVuZG8gbWVhbnMgdGhhdCB0aGUgYnVmZmVyIGlzIG1vZGlmaWVkLgorICovCisgICAgdm9pZAordV91bmNoYW5nZWQoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgc3RydWN0IHVfaGVhZGVyCSp1aDsKKworICAgIGZvciAodWggPSBidWYtPmJfdV9uZXdoZWFkOyB1aDsgdWggPSB1aC0+dWhfbmV4dCkKKwl1aC0+dWhfZmxhZ3MgfD0gVUhfQ0hBTkdFRDsKKyAgICBidWYtPmJfZGlkX3dhcm4gPSBGQUxTRTsKK30KKworLyoKKyAqIEdldCBwb2ludGVyIHRvIGxhc3QgYWRkZWQgZW50cnkuCisgKiBJZiBpdCdzIG5vdCB2YWxpZCwgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gTlVMTC4KKyAqLworICAgIHN0YXRpYyB1X2VudHJ5X1QgKgordV9nZXRfaGVhZGVudHJ5KCkKK3sKKyAgICBpZiAoY3VyYnVmLT5iX3VfbmV3aGVhZCA9PSBOVUxMIHx8IGN1cmJ1Zi0+Yl91X25ld2hlYWQtPnVoX2VudHJ5ID09IE5VTEwpCisgICAgeworCUVNU0coXygiRTQzOTogdW5kbyBsaXN0IGNvcnJ1cHQiKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBjdXJidWYtPmJfdV9uZXdoZWFkLT51aF9lbnRyeTsKK30KKworLyoKKyAqIHVfZ2V0Ym90KCk6IGNvbXB1dGUgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyB1X3NhdmUKKyAqCQlJdCBpcyBjYWxsZWQgb25seSB3aGVuIGJfdV9zeW5jZWQgaXMgRkFMU0UuCisgKi8KKyAgICBzdGF0aWMgdm9pZAordV9nZXRib3QoKQoreworICAgIHVfZW50cnlfVAkqdWVwOworICAgIGxpbmVucl9UCWV4dHJhOworCisgICAgdWVwID0gdV9nZXRfaGVhZGVudHJ5KCk7CS8qIGNoZWNrIGZvciBjb3JydXB0IHVuZG8gbGlzdCAqLworICAgIGlmICh1ZXAgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICB1ZXAgPSBjdXJidWYtPmJfdV9uZXdoZWFkLT51aF9nZXRib3RfZW50cnk7CisgICAgaWYgKHVlcCAhPSBOVUxMKQorICAgIHsKKwkvKgorCSAqIHRoZSBuZXcgdWVfYm90IGlzIGNvbXB1dGVkIGZyb20gdGhlIG51bWJlciBvZiBsaW5lcyB0aGF0IGhhcyBiZWVuCisJICogaW5zZXJ0ZWQgKDAgLSBkZWxldGVkKSBzaW5jZSBjYWxsaW5nIHVfc2F2ZS4gVGhpcyBpcyBlcXVhbCB0byB0aGUKKwkgKiBvbGQgbGluZSBjb3VudCBzdWJ0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQgbGluZSBjb3VudC4KKwkgKi8KKwlleHRyYSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50IC0gdWVwLT51ZV9sY291bnQ7CisJdWVwLT51ZV9ib3QgPSB1ZXAtPnVlX3RvcCArIHVlcC0+dWVfc2l6ZSArIDEgKyBleHRyYTsKKwlpZiAodWVwLT51ZV9ib3QgPCAxIHx8IHVlcC0+dWVfYm90ID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJeworCSAgICBFTVNHKF8oIkU0NDA6IHVuZG8gbGluZSBtaXNzaW5nIikpOworCSAgICB1ZXAtPnVlX2JvdCA9IHVlcC0+dWVfdG9wICsgMTsgIC8qIGFzc3VtZSBhbGwgbGluZXMgZGVsZXRlZCwgd2lsbAorCQkJCQkgICAgICogZ2V0IGFsbCB0aGUgb2xkIGxpbmVzIGJhY2sKKwkJCQkJICAgICAqIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGN1cnJlbnQKKwkJCQkJICAgICAqIG9uZXMgKi8KKwl9CisKKwljdXJidWYtPmJfdV9uZXdoZWFkLT51aF9nZXRib3RfZW50cnkgPSBOVUxMOworICAgIH0KKworICAgIGN1cmJ1Zi0+Yl91X3N5bmNlZCA9IFRSVUU7Cit9CisKKy8qCisgKiB1X2ZyZWVsaXN0OiBmcmVlIG9uZSBlbnRyeSBsaXN0IGFuZCBhZGp1c3QgdGhlIHBvaW50ZXJzCisgKi8KKyAgICBzdGF0aWMgdm9pZAordV9mcmVlbGlzdCh1aHApCisgICAgc3RydWN0IHVfaGVhZGVyICp1aHA7Cit7CisgICAgdV9lbnRyeV9UCSp1ZXAsICpudWVwOworCisgICAgZm9yICh1ZXAgPSB1aHAtPnVoX2VudHJ5OyB1ZXAgIT0gTlVMTDsgdWVwID0gbnVlcCkKKyAgICB7CisJbnVlcCA9IHVlcC0+dWVfbmV4dDsKKwl1X2ZyZWVlbnRyeSh1ZXAsIHVlcC0+dWVfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGN1cmJ1Zi0+Yl91X2N1cmhlYWQgPT0gdWhwKQorCWN1cmJ1Zi0+Yl91X2N1cmhlYWQgPSBOVUxMOworCisgICAgaWYgKHVocC0+dWhfbmV4dCA9PSBOVUxMKQorCWN1cmJ1Zi0+Yl91X29sZGhlYWQgPSB1aHAtPnVoX3ByZXY7CisgICAgZWxzZQorCXVocC0+dWhfbmV4dC0+dWhfcHJldiA9IHVocC0+dWhfcHJldjsKKworICAgIGlmICh1aHAtPnVoX3ByZXYgPT0gTlVMTCkKKwljdXJidWYtPmJfdV9uZXdoZWFkID0gdWhwLT51aF9uZXh0OworICAgIGVsc2UKKwl1aHAtPnVoX3ByZXYtPnVoX25leHQgPSB1aHAtPnVoX25leHQ7CisKKyAgICB1X2ZyZWVfbGluZSgoY2hhcl91ICopdWhwLCBGQUxTRSk7CisgICAgLS1jdXJidWYtPmJfdV9udW1oZWFkOworfQorCisvKgorICogZnJlZSBlbnRyeSAndWVwJyBhbmQgJ24nIGxpbmVzIGluIHVlcC0+dWVfYXJyYXlbXQorICovCisgICAgc3RhdGljIHZvaWQKK3VfZnJlZWVudHJ5KHVlcCwgbikKKyAgICB1X2VudHJ5X1QJKnVlcDsKKyAgICBsb25nCSAgICBuOworeworICAgIHdoaWxlIChuKQorCXVfZnJlZV9saW5lKHVlcC0+dWVfYXJyYXlbLS1uXSwgRkFMU0UpOworICAgIHVfZnJlZV9saW5lKChjaGFyX3UgKil1ZXAsIEZBTFNFKTsKK30KKworLyoKKyAqIGludmFsaWRhdGUgdGhlIHVuZG8gYnVmZmVyOyBjYWxsZWQgd2hlbiBzdG9yYWdlIGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQKKyAqLworICAgIHZvaWQKK3VfY2xlYXJhbGwoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgYnVmLT5iX3VfbmV3aGVhZCA9IGJ1Zi0+Yl91X29sZGhlYWQgPSBidWYtPmJfdV9jdXJoZWFkID0gTlVMTDsKKyAgICBidWYtPmJfdV9zeW5jZWQgPSBUUlVFOworICAgIGJ1Zi0+Yl91X251bWhlYWQgPSAwOworICAgIGJ1Zi0+Yl91X2xpbmVfcHRyID0gTlVMTDsKKyAgICBidWYtPmJfdV9saW5lX2xudW0gPSAwOworfQorCisvKgorICogc2F2ZSB0aGUgbGluZSAibG51bSIgZm9yIHRoZSAiVSIgY29tbWFuZAorICovCisgICAgdm9pZAordV9zYXZlbGluZShsbnVtKQorICAgIGxpbmVucl9UIGxudW07Cit7CisgICAgaWYgKGxudW0gPT0gY3VyYnVmLT5iX3VfbGluZV9sbnVtKQkgICAgLyogbGluZSBpcyBhbHJlYWR5IHNhdmVkICovCisJcmV0dXJuOworICAgIGlmIChsbnVtIDwgMSB8fCBsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlyZXR1cm47CisgICAgdV9jbGVhcmxpbmUoKTsKKyAgICBjdXJidWYtPmJfdV9saW5lX2xudW0gPSBsbnVtOworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gbG51bSkKKwljdXJidWYtPmJfdV9saW5lX2NvbG5yID0gY3Vyd2luLT53X2N1cnNvci5jb2w7CisgICAgZWxzZQorCWN1cmJ1Zi0+Yl91X2xpbmVfY29sbnIgPSAwOworICAgIGlmICgoY3VyYnVmLT5iX3VfbGluZV9wdHIgPSB1X3NhdmVfbGluZShsbnVtKSkgPT0gTlVMTCkKKwlkb19vdXRvZm1lbV9tc2coKGxvbmdfdSkwKTsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBsaW5lIHNhdmVkIGZvciB0aGUgIlUiIGNvbW1hbmQKKyAqICh0aGlzIGlzIHVzZWQgZXh0ZXJuYWxseSBmb3IgY3Jvc3NpbmcgYSBsaW5lIHdoaWxlIGluIGluc2VydCBtb2RlKQorICovCisgICAgdm9pZAordV9jbGVhcmxpbmUoKQoreworICAgIGlmIChjdXJidWYtPmJfdV9saW5lX3B0ciAhPSBOVUxMKQorICAgIHsKKwl1X2ZyZWVfbGluZShjdXJidWYtPmJfdV9saW5lX3B0ciwgRkFMU0UpOworCWN1cmJ1Zi0+Yl91X2xpbmVfcHRyID0gTlVMTDsKKwljdXJidWYtPmJfdV9saW5lX2xudW0gPSAwOworICAgIH0KK30KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSAiVSIgY29tbWFuZC4KKyAqIERpZmZlcmVudGlhdGlvbiBmcm9tIHZpOiAiVSIgY2FuIGJlIHVuZG9uZSB3aXRoIHRoZSBuZXh0ICJVIi4KKyAqIFdlIGFsc28gYWxsb3cgdGhlIGN1cnNvciB0byBiZSBpbiBhbm90aGVyIGxpbmUuCisgKi8KKyAgICB2b2lkCit1X3VuZG9saW5lKCkKK3sKKyAgICBjb2xucl9UIHQ7CisgICAgY2hhcl91ICAqb2xkcDsKKworICAgIGlmICh1bmRvX29mZikKKwlyZXR1cm47CisKKyAgICBpZiAoY3VyYnVmLT5iX3VfbGluZV9wdHIgPT0gTlVMTCB8fAorCQkJY3VyYnVmLT5iX3VfbGluZV9sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm47CisgICAgfQorCS8qIGZpcnN0IHNhdmUgdGhlIGxpbmUgZm9yIHRoZSAndScgY29tbWFuZCAqLworICAgIGlmICh1X3NhdmVjb21tb24oY3VyYnVmLT5iX3VfbGluZV9sbnVtIC0gMSwKKwkJCQljdXJidWYtPmJfdV9saW5lX2xudW0gKyAxLCAobGluZW5yX1QpMCkgPT0gRkFJTCkKKwlyZXR1cm47CisgICAgb2xkcCA9IHVfc2F2ZV9saW5lKGN1cmJ1Zi0+Yl91X2xpbmVfbG51bSk7CisgICAgaWYgKG9sZHAgPT0gTlVMTCkKKyAgICB7CisJZG9fb3V0b2ZtZW1fbXNnKChsb25nX3UpMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBtbF9yZXBsYWNlKGN1cmJ1Zi0+Yl91X2xpbmVfbG51bSwgY3VyYnVmLT5iX3VfbGluZV9wdHIsIFRSVUUpOworICAgIGNoYW5nZWRfYnl0ZXMoY3VyYnVmLT5iX3VfbGluZV9sbnVtLCAwKTsKKyAgICB1X2ZyZWVfbGluZShjdXJidWYtPmJfdV9saW5lX3B0ciwgRkFMU0UpOworICAgIGN1cmJ1Zi0+Yl91X2xpbmVfcHRyID0gb2xkcDsKKworICAgIHQgPSBjdXJidWYtPmJfdV9saW5lX2NvbG5yOworICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gPT0gY3VyYnVmLT5iX3VfbGluZV9sbnVtKQorCWN1cmJ1Zi0+Yl91X2xpbmVfY29sbnIgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbDsKKyAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHQ7CisgICAgY3Vyd2luLT53X2N1cnNvci5sbnVtID0gY3VyYnVmLT5iX3VfbGluZV9sbnVtOworfQorCisvKgorICogc3RvcmFnZSBhbGxvY2F0aW9uIGZvciB0aGUgdW5kbyBsaW5lcyBhbmQgYmxvY2tzIG9mIHRoZSBjdXJyZW50IGZpbGUKKyAqLworCisvKgorICogTWVtb3J5IGlzIGFsbG9jYXRlZCBpbiByZWxhdGl2ZWx5IGxhcmdlIGJsb2Nrcy4gVGhlc2UgYmxvY2tzIGFyZSBsaW5rZWQKKyAqIGluIHRoZSBhbGxvY2F0ZWQgYmxvY2sgbGlzdCwgaGVhZGVkIGJ5IGN1cmJ1Zi0+Yl9ibG9ja19oZWFkLiBUaGV5IGFyZSBhbGwKKyAqIGZyZWVkIHdoZW4gYWJhbmRvbmluZyBhIGZpbGUsIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBldmVyeSBzaW5nbGUgbGluZS4KKyAqIFRoZSBsaXN0IGlzIGtlcHQgc29ydGVkIG9uIG1lbW9yeSBhZGRyZXNzLgorICogYmxvY2tfYWxsb2MoKSBhbGxvY2F0ZXMgYSBibG9jay4KKyAqIG1fYmxvY2tmcmVlKCkgZnJlZXMgYWxsIGJsb2Nrcy4KKyAqCisgKiBUaGUgYXZhaWxhYmxlIGNodW5rcyBvZiBtZW1vcnkgYXJlIGtlcHQgaW4gZnJlZSBjaHVuayBsaXN0cy4gVGhlcmUgaXMKKyAqIG9uZSBmcmVlIGxpc3QgZm9yIGVhY2ggYmxvY2sgb2YgYWxsb2NhdGVkIG1lbW9yeS4gVGhlIGxpc3QgaXMga2VwdCBzb3J0ZWQKKyAqIG9uIG1lbW9yeSBhZGRyZXNzLgorICogdV9hbGxvY19saW5lKCkgZ2V0cyBhIGNodW5rIGZyb20gdGhlIGZyZWUgbGlzdHMuCisgKiB1X2ZyZWVfbGluZSgpIHJldHVybnMgYSBjaHVuayB0byB0aGUgZnJlZSBsaXN0cy4KKyAqIGN1cmJ1Zi0+Yl9tX3NlYXJjaCBwb2ludHMgdG8gdGhlIGNodW5rIGJlZm9yZSB0aGUgY2h1bmsgdGhhdCB3YXMKKyAqIGZyZWVkL2FsbG9jYXRlZCB0aGUgbGFzdCB0aW1lLgorICogY3VyYnVmLT5iX21iX2N1cnJlbnQgcG9pbnRzIHRvIHRoZSBiX2hlYWQgd2hlcmUgY3VyYnVmLT5iX21fc2VhcmNoCisgKiBwb2ludHMgaW50byB0aGUgZnJlZSBsaXN0LgorICoKKyAqCisgKiAgYl9ibG9ja19oZWFkICAgICAvLS0tPiBibG9jayAjMQkvLS0tPiBibG9jayAjMgorICoJIG1iX25leHQgLS0tLwkgICAgbWJfbmV4dCAtLS0vICAgICAgIG1iX25leHQgLS0tPiBOVUxMCisgKgkgbWJfaW5mbwkgICAgbWJfaW5mbwkgICAgICAgbWJfaW5mbworICoJICAgIHwJCSAgICAgICB8CQkgIHwKKyAqCSAgICBWCQkgICAgICAgVgkJICBWCisgKgkgIE5VTEwJCWZyZWUgY2h1bmsgIzEuMSAgICAgIGZyZWUgY2h1bmsgIzIuMQorICoJCQkgICAgICAgfAkJICB8CisgKgkJCSAgICAgICBWCQkgIFYKKyAqCQkJZnJlZSBjaHVuayAjMS4yCQkgTlVMTAorICoJCQkgICAgICAgfAorICoJCQkgICAgICAgVgorICoJCQkgICAgICBOVUxMCisgKgorICogV2hlbiBhIHNpbmdsZSBmcmVlIGNodW5rIGxpc3Qgd291bGQgaGF2ZSBiZWVuIHVzZWQsIGl0IGNvdWxkIHRha2UgYSBsb3QKKyAqIG9mIHRpbWUgaW4gdV9mcmVlX2xpbmUoKSB0byBmaW5kIHRoZSBjb3JyZWN0IHBsYWNlIHRvIGluc2VydCBhIGNodW5rIGluIHRoZQorICogZnJlZSBsaXN0LiBUaGUgc2luZ2xlIGZyZWUgbGlzdCB3b3VsZCBiZWNvbWUgdmVyeSBsb25nIHdoZW4gbWFueSBsaW5lcyBhcmUKKyAqIGNoYW5nZWQgKGUuZy4gd2l0aCA6JXMvXk0kLy8pLgorICovCisKKyAvKgorICAqIHRoaXMgYmxvY2tzaXplIGlzIHVzZWQgd2hlbiBhbGxvY2F0aW5nIG5ldyBsaW5lcworICAqLworI2RlZmluZSBNRU1CTE9DS1NJWkUgMjA0NAorCisvKgorICogVGhlIHNpemUgZmllbGQgY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGNodW5rLCBpbmNsdWRpbmcgdGhlIHNpemUgZmllbGQKKyAqIGl0c2VsZi4KKyAqCisgKiBXaGVuIHRoZSBjaHVuayBpcyBub3QgaW4tdXNlIGl0IGlzIHByZWNlZGVkIHdpdGggdGhlIG1faW5mbyBzdHJ1Y3R1cmUuCisgKiBUaGUgbV9uZXh0IGZpZWxkIGxpbmtzIGl0IGluIG9uZSBvZiB0aGUgZnJlZSBjaHVuayBsaXN0cy4KKyAqCisgKiBPbiBtb3N0IHVuaXggc3lzdGVtcyBzdHJ1Y3R1cmVzIGhhdmUgdG8gYmUgbG9uZ3dvcmQgKDMyIG9yIDY0IGJpdCkgYWxpZ25lZC4KKyAqIE9uIG1vc3Qgb3RoZXIgc3lzdGVtcyB0aGV5IGFyZSBzaG9ydCAoMTYgYml0KSBhbGlnbmVkLgorICovCisKKy8qIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYXJlIG5vdyBpbiBzdHJ1Y3RzLmggKi8KKworI2lmZGVmIEFMSUdOX0xPTkcKKyAgICAvKiBzaXplIG9mIG1fc2l6ZSAqLworIyBkZWZpbmUgTV9PRkZTRVQgKHNpemVvZihsb25nX3UpKQorI2Vsc2UKKyAgICAvKiBzaXplIG9mIG1fc2l6ZSAqLworIyBkZWZpbmUgTV9PRkZTRVQgKHNpemVvZihzaG9ydF91KSkKKyNlbmRpZgorCisvKgorICogQWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkgYW5kIGxpbmsgaXQgaW4gdGhlIGFsbG9jYXRlZCBibG9jayBsaXN0LgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCit1X2Jsb2NrYWxsb2Moc2l6ZSkKKyAgICBsb25nX3UJc2l6ZTsKK3sKKyAgICBtYmxvY2tfVAkqcDsKKyAgICBtYmxvY2tfVAkqbXAsICpuZXh0OworCisgICAgcCA9IChtYmxvY2tfVCAqKWxhbGxvYyhzaXplICsgc2l6ZW9mKG1ibG9ja19UKSwgRkFMU0UpOworICAgIGlmIChwICE9IE5VTEwpCisgICAgeworCSAvKiBJbnNlcnQgdGhlIGJsb2NrIGludG8gdGhlIGFsbG9jYXRlZCBibG9jayBsaXN0LCBrZWVwaW5nIGl0CisJCSAgICBzb3J0ZWQgb24gYWRkcmVzcy4gKi8KKwlmb3IgKG1wID0gJmN1cmJ1Zi0+Yl9ibG9ja19oZWFkOworCQkobmV4dCA9IG1wLT5tYl9uZXh0KSAhPSBOVUxMICYmIG5leHQgPCBwOworCQkJbXAgPSBuZXh0KQorCSAgICA7CisJcC0+bWJfbmV4dCA9IG5leHQ7CQkvKiBsaW5rIGluIGJsb2NrIGxpc3QgKi8KKwlwLT5tYl9zaXplID0gc2l6ZTsKKwltcC0+bWJfbmV4dCA9IHA7CisJcC0+bWJfaW5mby5tX25leHQgPSBOVUxMOwkvKiBjbGVhciBmcmVlIGxpc3QgKi8KKwlwLT5tYl9pbmZvLm1fc2l6ZSA9IDA7CisJY3VyYnVmLT5iX21iX2N1cnJlbnQgPSBwOwkvKiByZW1lbWJlciBjdXJyZW50IGJsb2NrICovCisJY3VyYnVmLT5iX21fc2VhcmNoID0gTlVMTDsKKwlwKys7CQkJCS8qIHJldHVybiB1c2FibGUgbWVtb3J5ICovCisgICAgfQorICAgIHJldHVybiAoY2hhcl91ICopcDsKK30KKworLyoKKyAqIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzIGZvciB0aGUgYnVmZmVyICdidWYnCisgKi8KKyAgICB2b2lkCit1X2Jsb2NrZnJlZShidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyAgICBtYmxvY2tfVAkqcCwgKm5wOworCisgICAgZm9yIChwID0gYnVmLT5iX2Jsb2NrX2hlYWQubWJfbmV4dDsgcCAhPSBOVUxMOyBwID0gbnApCisgICAgeworCW5wID0gcC0+bWJfbmV4dDsKKwl2aW1fZnJlZShwKTsKKyAgICB9CisgICAgYnVmLT5iX2Jsb2NrX2hlYWQubWJfbmV4dCA9IE5VTEw7CisgICAgYnVmLT5iX21fc2VhcmNoID0gTlVMTDsKKyAgICBidWYtPmJfbWJfY3VycmVudCA9IE5VTEw7Cit9CisKKy8qCisgKiBGcmVlIGEgY2h1bmsgb2YgbWVtb3J5IGZvciB0aGUgY3VycmVudCBidWZmZXIuCisgKiBJbnNlcnQgdGhlIGNodW5rIGludG8gdGhlIGNvcnJlY3QgZnJlZSBsaXN0LCBrZWVwaW5nIGl0IHNvcnRlZCBvbiBhZGRyZXNzLgorICovCisgICAgc3RhdGljIHZvaWQKK3VfZnJlZV9saW5lKHB0ciwga2VlcCkKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWtlZXA7CS8qIGRvbid0IGZyZWUgdGhlIGJsb2NrIHdoZW4gaXQncyBlbXB0eSAqLworeworICAgIG1pbmZvX1QJKm5leHQ7CisgICAgbWluZm9fVAkqcHJldiwgKmN1cnI7CisgICAgbWluZm9fVAkqbXA7CisgICAgbWJsb2NrX1QJKm5leHRiOworICAgIG1ibG9ja19UCSpwcmV2YjsKKworICAgIGlmIChwdHIgPT0gTlVMTCB8fCBwdHIgPT0gSU9idWZmKQorCXJldHVybjsJLyogaWxsZWdhbCBhZGRyZXNzIGNhbiBoYXBwZW4gaW4gb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zICovCisKKyAgICBtcCA9IChtaW5mb19UICopKHB0ciAtIE1fT0ZGU0VUKTsKKworICAgIC8qIGZpbmQgYmxvY2sgd2hlcmUgY2h1bmsgY291bGQgYmUgYSBwYXJ0IG9mZiAqLworICAgIC8qIGlmIHdlIGNoYW5nZSBjdXJidWYtPmJfbWJfY3VycmVudCwgY3VyYnVmLT5iX21fc2VhcmNoIGlzIHNldCB0byBOVUxMICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9tYl9jdXJyZW50ID09IE5VTEwgfHwgbXAgPCAobWluZm9fVCAqKWN1cmJ1Zi0+Yl9tYl9jdXJyZW50KQorICAgIHsKKwljdXJidWYtPmJfbWJfY3VycmVudCA9IGN1cmJ1Zi0+Yl9ibG9ja19oZWFkLm1iX25leHQ7CisJY3VyYnVmLT5iX21fc2VhcmNoID0gTlVMTDsKKyAgICB9CisgICAgaWYgKChuZXh0YiA9IGN1cmJ1Zi0+Yl9tYl9jdXJyZW50LT5tYl9uZXh0KSAhPSBOVUxMCisJCQkJCQkgICAgICYmIChtaW5mb19UICopbmV4dGIgPCBtcCkKKyAgICB7CisJY3VyYnVmLT5iX21iX2N1cnJlbnQgPSBuZXh0YjsKKwljdXJidWYtPmJfbV9zZWFyY2ggPSBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoKG5leHRiID0gY3VyYnVmLT5iX21iX2N1cnJlbnQtPm1iX25leHQpICE9IE5VTEwKKwkJCQkJCSAgICAgJiYgKG1pbmZvX1QgKiluZXh0YiA8IG1wKQorCWN1cmJ1Zi0+Yl9tYl9jdXJyZW50ID0gbmV4dGI7CisKKyAgICBjdXJyID0gTlVMTDsKKyAgICAvKgorICAgICAqIElmIG1wIGlzIHNtYWxsZXIgdGhhbiBjdXJidWYtPmJfbV9zZWFyY2gtPm1fbmV4dCBnbyB0byB0aGUgc3RhcnQgb2YKKyAgICAgKiB0aGUgZnJlZSBsaXN0CisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9tX3NlYXJjaCA9PSBOVUxMIHx8IG1wIDwgKGN1cmJ1Zi0+Yl9tX3NlYXJjaC0+bV9uZXh0KSkKKwluZXh0ID0gJihjdXJidWYtPmJfbWJfY3VycmVudC0+bWJfaW5mbyk7CisgICAgZWxzZQorCW5leHQgPSBjdXJidWYtPmJfbV9zZWFyY2g7CisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIGxvb3AgaXMgZXhlY3V0ZWQgdmVyeSBvZnRlbi4KKyAgICAgKiBUaGVyZWZvcmUgaXQgaGFzIGJlZW4gb3B0aW1pemVkIGF0IHRoZSBjb3N0IG9mIHJlYWRhYmlsaXR5LgorICAgICAqIEtlZXAgaXQgZmFzdCEKKyAgICAgKi8KKyNpZmRlZiBTTE9XX0JVVF9FQVNZX1RPX1JFQUQKKyAgICBkbworICAgIHsKKwlwcmV2ID0gY3VycjsKKwljdXJyID0gbmV4dDsKKwluZXh0ID0gbmV4dC0+bV9uZXh0OworICAgIH0KKyAgICB3aGlsZSAobXAgPiBuZXh0ICYmIG5leHQgIT0gTlVMTCk7CisjZWxzZQorICAgIGRvCQkJCQkgICAgLyogZmlyc3QsIG1pZGRsZSwgbGFzdCAqLworICAgIHsKKwlwcmV2ID0gbmV4dC0+bV9uZXh0OwkJICAgIC8qIGN1cnIsIG5leHQsIHByZXYgKi8KKwlpZiAocHJldiA9PSBOVUxMIHx8IG1wIDw9IHByZXYpCisJeworCSAgICBwcmV2ID0gY3VycjsKKwkgICAgY3VyciA9IG5leHQ7CisJICAgIG5leHQgPSBuZXh0LT5tX25leHQ7CisJICAgIGJyZWFrOworCX0KKwljdXJyID0gcHJldi0+bV9uZXh0OwkJICAgIC8qIG5leHQsIHByZXYsIGN1cnIgKi8KKwlpZiAoY3VyciA9PSBOVUxMIHx8IG1wIDw9IGN1cnIpCisJeworCSAgICBwcmV2ID0gbmV4dDsKKwkgICAgY3VyciA9IHByZXYtPm1fbmV4dDsKKwkgICAgbmV4dCA9IGN1cnItPm1fbmV4dDsKKwkgICAgYnJlYWs7CisJfQorCW5leHQgPSBjdXJyLT5tX25leHQ7CQkgICAgLyogcHJldiwgY3VyciwgbmV4dCAqLworICAgIH0KKyAgICB3aGlsZSAobXAgPiBuZXh0ICYmIG5leHQgIT0gTlVMTCk7CisjZW5kaWYKKworICAgIC8qIGlmICptcCBhbmQgKm5leHQgYXJlIGNvbmNhdGVuYXRlZCwgam9pbiB0aGVtIGludG8gb25lIGNodW5rICovCisgICAgaWYgKChjaGFyX3UgKiltcCArIG1wLT5tX3NpemUgPT0gKGNoYXJfdSAqKW5leHQpCisgICAgeworCW1wLT5tX3NpemUgKz0gbmV4dC0+bV9zaXplOworCW1wLT5tX25leHQgPSBuZXh0LT5tX25leHQ7CisgICAgfQorICAgIGVsc2UKKwltcC0+bV9uZXh0ID0gbmV4dDsKKworICAgIC8qIGlmICpjdXJyIGFuZCAqbXAgYXJlIGNvbmNhdGVuYXRlZCwgam9pbiB0aGVtICovCisgICAgaWYgKHByZXYgIT0gTlVMTCAmJiAoY2hhcl91ICopY3VyciArIGN1cnItPm1fc2l6ZSA9PSAoY2hhcl91ICopbXApCisgICAgeworCWN1cnItPm1fc2l6ZSArPSBtcC0+bV9zaXplOworCWN1cnItPm1fbmV4dCA9IG1wLT5tX25leHQ7CisJY3VyYnVmLT5iX21fc2VhcmNoID0gcHJldjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljdXJyLT5tX25leHQgPSBtcDsKKwljdXJidWYtPmJfbV9zZWFyY2ggPSBjdXJyOyAgLyogcHV0IGN1cmJ1Zi0+Yl9tX3NlYXJjaCBiZWZvcmUgZnJlZWQKKwkJCQkgICAgICAgY2h1bmsgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBibG9jayBvbmx5IGNvbnRhaW5lcyBmcmVlIG1lbW9yeSBub3csIHJlbGVhc2UgaXQuCisgICAgICovCisgICAgaWYgKCFrZWVwICYmIGN1cmJ1Zi0+Yl9tYl9jdXJyZW50LT5tYl9zaXplCisJCQkgICAgICA9PSBjdXJidWYtPmJfbWJfY3VycmVudC0+bWJfaW5mby5tX25leHQtPm1fc2l6ZSkKKyAgICB7CisJLyogRmluZCB0aGUgYmxvY2sgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSB0byBiZSBhYmxlIHRvIHVubGluayBpdCBmcm9tCisJICogdGhlIGxpc3Qgb2YgYmxvY2tzLiAqLworCXByZXZiID0gJmN1cmJ1Zi0+Yl9ibG9ja19oZWFkOworCWZvciAobmV4dGIgPSBwcmV2Yi0+bWJfbmV4dDsgbmV4dGIgIT0gY3VyYnVmLT5iX21iX2N1cnJlbnQ7CisJCQkJCQkgICAgICAgbmV4dGIgPSBuZXh0Yi0+bWJfbmV4dCkKKwkgICAgcHJldmIgPSBuZXh0YjsKKwlwcmV2Yi0+bWJfbmV4dCA9IG5leHRiLT5tYl9uZXh0OworCXZpbV9mcmVlKG5leHRiKTsKKwljdXJidWYtPmJfbWJfY3VycmVudCA9IE5VTEw7CisJY3VyYnVmLT5iX21fc2VhcmNoID0gTlVMTDsKKyAgICB9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBsaW5lIHN0cnVjdHVyZSB3aXRoIHJvb20gZm9yIGF0IGxlYXN0CisgKiAnc2l6ZScgY2hhcmFjdGVycyBwbHVzIGEgdGVybWluYXRpbmcgTlVMLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCit1X2FsbG9jX2xpbmUoc2l6ZSkKKyAgICB1bnNpZ25lZAlzaXplOworeworICAgIG1pbmZvX1QJKm1wLCAqbXByZXYsICptcDI7CisgICAgbWJsb2NrX1QJKm1icDsKKyAgICBpbnQJCXNpemVfYWxpZ247CisKKyAgICAvKgorICAgICAqIEFkZCByb29tIGZvciBzaXplIGZpZWxkIGFuZCB0cmFpbGluZyBOVUwgYnl0ZS4KKyAgICAgKiBBZGp1c3QgZm9yIG1pbmltYWwgc2l6ZSAobXVzdCBiZSBhYmxlIHRvIHN0b3JlIG1pbmZvX1QKKyAgICAgKiBwbHVzIGEgdHJhaWxpbmcgTlVMLCBzbyB0aGUgY2h1bmsgY2FuIGJlIHJlbGVhc2VkIGFnYWluKQorICAgICAqLworICAgIHNpemUgKz0gTV9PRkZTRVQgKyAxOworICAgIGlmIChzaXplIDwgc2l6ZW9mKG1pbmZvX1QpICsgMSkKKwlzaXplID0gc2l6ZW9mKG1pbmZvX1QpICsgMTsKKworICAgIC8qCisgICAgICogcm91bmQgc2l6ZSB1cCBmb3IgYWxpZ25tZW50CisgICAgICovCisgICAgc2l6ZV9hbGlnbiA9IChzaXplICsgQUxJR05fTUFTSykgJiB+QUxJR05fTUFTSzsKKworICAgIC8qCisgICAgICogSWYgY3VyYnVmLT5iX21fc2VhcmNoIGlzIE5VTEwgKHVuaW5pdGlhbGl6ZWQgZnJlZSBsaXN0KSBzdGFydCBhdAorICAgICAqIGN1cmJ1Zi0+Yl9ibG9ja19oZWFkCisgICAgICovCisgICAgaWYgKGN1cmJ1Zi0+Yl9tYl9jdXJyZW50ID09IE5VTEwgfHwgY3VyYnVmLT5iX21fc2VhcmNoID09IE5VTEwpCisgICAgeworCWN1cmJ1Zi0+Yl9tYl9jdXJyZW50ID0gJmN1cmJ1Zi0+Yl9ibG9ja19oZWFkOworCWN1cmJ1Zi0+Yl9tX3NlYXJjaCA9ICYoY3VyYnVmLT5iX2Jsb2NrX2hlYWQubWJfaW5mbyk7CisgICAgfQorCisgICAgLyogc2VhcmNoIGZvciBzcGFjZSBpbiBmcmVlIGxpc3QgKi8KKyAgICBtcHJldiA9IGN1cmJ1Zi0+Yl9tX3NlYXJjaDsKKyAgICBtYnAgPSBjdXJidWYtPmJfbWJfY3VycmVudDsKKyAgICBtcCA9IGN1cmJ1Zi0+Yl9tX3NlYXJjaC0+bV9uZXh0OworICAgIGlmIChtcCA9PSBOVUxMKQorICAgIHsKKwlpZiAobWJwLT5tYl9uZXh0KQorCSAgICBtYnAgPSBtYnAtPm1iX25leHQ7CisJZWxzZQorCSAgICBtYnAgPSAmY3VyYnVmLT5iX2Jsb2NrX2hlYWQ7CisJbXAgPSBjdXJidWYtPmJfbV9zZWFyY2ggPSAmKG1icC0+bWJfaW5mbyk7CisgICAgfQorICAgIHdoaWxlIChtcC0+bV9zaXplIDwgc2l6ZSkKKyAgICB7CisJaWYgKG1wID09IGN1cmJ1Zi0+Yl9tX3NlYXJjaCkJICAgIC8qIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCBpbiBmcmVlCisJCQkJCSAgICAgICBjaHVuayBsaXN0ICovCisJeworCSAgICBpZiAobWJwLT5tYl9uZXh0KQorCQltYnAgPSBtYnAtPm1iX25leHQ7CisJICAgIGVsc2UKKwkJbWJwID0gJmN1cmJ1Zi0+Yl9ibG9ja19oZWFkOworCSAgICBtcCA9IGN1cmJ1Zi0+Yl9tX3NlYXJjaCA9ICYobWJwLT5tYl9pbmZvKTsKKwkgICAgaWYgKG1icCA9PSBjdXJidWYtPmJfbWJfY3VycmVudCkJLyogYmFjayB3aGVyZSB3ZSBzdGFydGVkIGluCisJCQkJCQkgICBibG9jayBsaXN0ICovCisJICAgIHsKKwkJaW50CW4gPSAoc2l6ZV9hbGlnbiA+IChNRU1CTE9DS1NJWkUgLyA0KQorCQkJCQkJID8gc2l6ZV9hbGlnbiA6IE1FTUJMT0NLU0laRSk7CisKKwkJbXAgPSAobWluZm9fVCAqKXVfYmxvY2thbGxvYygobG9uZ191KW4pOworCQlpZiAobXAgPT0gTlVMTCkKKwkJICAgIHJldHVybiAoTlVMTCk7CisJCW1wLT5tX3NpemUgPSBuOworCQl1X2ZyZWVfbGluZSgoY2hhcl91ICopbXAgKyBNX09GRlNFVCwgVFJVRSk7CisJCW1wID0gY3VyYnVmLT5iX21fc2VhcmNoOworCQltYnAgPSBjdXJidWYtPmJfbWJfY3VycmVudDsKKwkgICAgfQorCX0KKwltcHJldiA9IG1wOworCWlmICgobXAgPSBtcC0+bV9uZXh0KSA9PSBOVUxMKQkgICAgLyogYXQgZW5kIG9mIHRoZSBsaXN0ICovCisJICAgIG1wID0gJihtYnAtPm1iX2luZm8pOwkgICAgLyogd3JhcCBhcm91bmQgdG8gYmVnaW4gKi8KKyAgICB9CisKKyAgICAvKiBpZiB0aGUgY2h1bmsgd2UgZm91bmQgaXMgbGFyZ2UgZW5vdWdoLCBzcGxpdCBpdCB1cCBpbiB0d28gKi8KKyAgICBpZiAoKGxvbmcpbXAtPm1fc2l6ZSAtIHNpemVfYWxpZ24gPj0gKGxvbmcpKHNpemVvZihtaW5mb19UKSArIDEpKQorICAgIHsKKwltcDIgPSAobWluZm9fVCAqKSgoY2hhcl91ICopbXAgKyBzaXplX2FsaWduKTsKKwltcDItPm1fc2l6ZSA9IG1wLT5tX3NpemUgLSBzaXplX2FsaWduOworCW1wMi0+bV9uZXh0ID0gbXAtPm1fbmV4dDsKKwltcHJldi0+bV9uZXh0ID0gbXAyOworCW1wLT5tX3NpemUgPSBzaXplX2FsaWduOworICAgIH0KKyAgICBlbHNlCQkgICAgLyogcmVtb3ZlICptcCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKyAgICB7CisJbXByZXYtPm1fbmV4dCA9IG1wLT5tX25leHQ7CisgICAgfQorICAgIGN1cmJ1Zi0+Yl9tX3NlYXJjaCA9IG1wcmV2OworICAgIGN1cmJ1Zi0+Yl9tYl9jdXJyZW50ID0gbWJwOworCisgICAgbXAgPSAobWluZm9fVCAqKSgoY2hhcl91ICopbXAgKyBNX09GRlNFVCk7CisgICAgKihjaGFyX3UgKiltcCA9IE5VTDsJCSAgICAvKiBzZXQgdGhlIGZpcnN0IGJ5dGUgdG8gTlVMICovCisKKyAgICByZXR1cm4gKChjaGFyX3UgKiltcCk7Cit9CisKKy8qCisgKiB1X3NhdmVfbGluZSgpOiBhbGxvY2F0ZSBtZW1vcnkgd2l0aCB1X2FsbG9jX2xpbmUoKSBhbmQgY29weSBsaW5lICdsbnVtJworICogaW50byBpdC4KKyAqLworICAgIHN0YXRpYyBjaGFyX3UgKgordV9zYXZlX2xpbmUobG51bSkKKyAgICBsaW5lbnJfVAlsbnVtOworeworICAgIGNoYXJfdQkqc3JjOworICAgIGNoYXJfdQkqZHN0OworICAgIHVuc2lnbmVkCWxlbjsKKworICAgIHNyYyA9IG1sX2dldChsbnVtKTsKKyAgICBsZW4gPSAodW5zaWduZWQpU1RSTEVOKHNyYyk7CisgICAgaWYgKChkc3QgPSB1X2FsbG9jX2xpbmUobGVuKSkgIT0gTlVMTCkKKwltY2hfbWVtbW92ZShkc3QsIHNyYywgKHNpemVfdCkobGVuICsgMSkpOworICAgIHJldHVybiAoZHN0KTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSAnbW9kaWZpZWQnIGZsYWcgaXMgc2V0LCBvciAnZmYnIGhhcyBjaGFuZ2VkIChvbmx5IG5lZWQgdG8KKyAqIGNoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGJlY2F1c2UgaXQgY2FuIG9ubHkgYmUgImRvcyIsICJ1bml4IiBvciAibWFjIikuCisgKiAibm9maWxlIiBhbmQgInNjcmF0Y2giIHR5cGUgYnVmZmVycyBhcmUgY29uc2lkZXJlZCB0byBhbHdheXMgYmUgdW5jaGFuZ2VkLgorICovCisgICAgaW50CitidWZJc0NoYW5nZWQoYnVmKQorICAgIGJ1Zl9UCSpidWY7Cit7CisgICAgcmV0dXJuCisjaWZkZWYgRkVBVF9RVUlDS0ZJWAorCSAgICAhYnRfZG9udHdyaXRlKGJ1ZikgJiYKKyNlbmRpZgorCSAgICAoYnVmLT5iX2NoYW5nZWQgfHwgZmlsZV9mZl9kaWZmZXJzKGJ1ZikpOworfQorCisgICAgaW50CitjdXJidWZJc0NoYW5nZWQoKQoreworICAgIHJldHVybgorI2lmZGVmIEZFQVRfUVVJQ0tGSVgKKwkhYnRfZG9udHdyaXRlKGN1cmJ1ZikgJiYKKyNlbmRpZgorCShjdXJidWYtPmJfY2hhbmdlZCB8fCBmaWxlX2ZmX2RpZmZlcnMoY3VyYnVmKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdW5pbnN0YWwuYyBiL3NyYy91bmluc3RhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzI0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdW5pbnN0YWwuYwpAQCAtMCwwICsxLDQzOCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogdW5pbnN0YWwuYzoJTWluaW1hbGlzdGljIHVuaW5zdGFsbCBwcm9ncmFtIGZvciBWaW0gb24gTVMtV2luZG93cworICoJCVJlbW92ZXM6CisgKgkJLSB0aGUgIkVkaXQgd2l0aCBWaW0iIHBvcHVwIG1lbnUgZW50cnkKKyAqCQktIHRoZSBWaW0gIk9wZW4gV2l0aC4uLiIgcG9wdXAgbWVudSBlbnRyeQorICoJCS0gYW55IFZpbSBCYXRjaCBmaWxlcyBpbiB0aGUgcGF0aAorICoJCS0gaWNvbnMgZm9yIFZpbSBvbiB0aGUgRGVza3RvcAorICoJCS0gdGhlIFZpbSBlbnRyeSBpbiB0aGUgU3RhcnQgTWVudQorICovCisKKy8qIEluY2x1ZGUgY29tbW9uIGNvZGUgZm9yIGRvc2luc3QuYyBhbmQgdW5pbnN0YWwuYy4gKi8KKyNpbmNsdWRlICJkb3NpbnN0LmgiCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgdXNlciB0eXBlcyBhICd5JyBvciAnWScsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NvbmZpcm0odm9pZCkKK3sKKyAgICBjaGFyCWFuc3dlclsxMF07CisKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gKHNjYW5mKCIgJWMiLCBhbnN3ZXIpID09IDEgJiYgdG91cHBlcihhbnN3ZXJbMF0pID09ICdZJyk7Cit9CisKKyNpZmRlZiBXSU4zMjY0CisvKgorICogQ2hlY2sgaWYgdGhlIHBvcHVwIG1lbnUgZW50cnkgZXhpc3RzIGFuZCB3aGF0IGd2aW0gaXQgcmVmZXJzIHRvLgorICogUmV0dXJucyBub24temVybyB3aGVuIGl0J3MgZm91bmQuCisgKi8KKyAgICBzdGF0aWMgaW50Citwb3B1cF9ndmltX3BhdGgoY2hhciAqYnVmKQoreworICAgIEhLRVkJa2V5X2hhbmRsZTsKKyAgICBEV09SRAl2YWx1ZV90eXBlOworICAgIERXT1JECWJ1ZnNpemUgPSBCVUZTSVpFOworICAgIGludAkJcjsKKworICAgIC8qIE9wZW4gdGhlIGtleSB3aGVyZSB0aGUgcGF0aCB0byBndmltLmV4ZSBpcyBzdG9yZWQuICovCisgICAgaWYgKFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVmltXFxHdmltIiwgMCwgS0VZX1JFQUQsCisJCQkJCQkma2V5X2hhbmRsZSkgIT0gRVJST1JfU1VDQ0VTUykKKwlyZXR1cm4gMDsKKworICAgIC8qIGdldCB0aGUgRGlzcGxheU5hbWUgb3V0IG9mIGl0IHRvIHNob3cgdGhlIHVzZXIgKi8KKyAgICByID0gUmVnUXVlcnlWYWx1ZUV4KGtleV9oYW5kbGUsICJwYXRoIiwgMCwKKwkJCQkJICAmdmFsdWVfdHlwZSwgKExQQllURSlidWYsICZidWZzaXplKTsKKyAgICBSZWdDbG9zZUtleShrZXlfaGFuZGxlKTsKKworICAgIHJldHVybiAociA9PSBFUlJPUl9TVUNDRVNTKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSAiT3BlbiBXaXRoLi4uIiBtZW51IGVudHJ5IGV4aXN0cyBhbmQgd2hhdCBndmltIGl0IHJlZmVycyB0by4KKyAqIFJldHVybnMgbm9uLXplcm8gd2hlbiBpdCdzIGZvdW5kLgorICovCisgICAgc3RhdGljIGludAorb3BlbndpdGhfZ3ZpbV9wYXRoKGNoYXIgKmJ1ZikKK3sKKyAgICBIS0VZCWtleV9oYW5kbGU7CisgICAgRFdPUkQJdmFsdWVfdHlwZTsKKyAgICBEV09SRAlidWZzaXplID0gQlVGU0laRTsKKyAgICBpbnQJCXI7CisKKyAgICAvKiBPcGVuIHRoZSBrZXkgd2hlcmUgdGhlIHBhdGggdG8gZ3ZpbS5leGUgaXMgc3RvcmVkLiAqLworICAgIGlmIChSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JPT1QsCisJCSJBcHBsaWNhdGlvbnNcXGd2aW0uZXhlXFxzaGVsbFxcZWRpdFxcY29tbWFuZCIsIDAsIEtFWV9SRUFELAorCQkJCQkJJmtleV9oYW5kbGUpICE9IEVSUk9SX1NVQ0NFU1MpCisJcmV0dXJuIDA7CisKKyAgICAvKiBnZXQgdGhlIERpc3BsYXlOYW1lIG91dCBvZiBpdCB0byBzaG93IHRoZSB1c2VyICovCisgICAgciA9IFJlZ1F1ZXJ5VmFsdWVFeChrZXlfaGFuZGxlLCAiIiwgMCwgJnZhbHVlX3R5cGUsIChMUEJZVEUpYnVmLCAmYnVmc2l6ZSk7CisgICAgUmVnQ2xvc2VLZXkoa2V5X2hhbmRsZSk7CisKKyAgICByZXR1cm4gKHIgPT0gRVJST1JfU1VDQ0VTUyk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcmVtb3ZlX3BvcHVwKHZvaWQpCit7CisgICAgaW50CQlmYWlsID0gMDsKKyAgICBIS0VZCWtoOworCisgICAgaWYgKFJlZ0RlbGV0ZUtleShIS0VZX0NMQVNTRVNfUk9PVCwgIkNMU0lEXFx7NTFFRUUyNDItQUQ4Ny0xMWQzLTlDMUUtMDA5MDI3OEJCRDk5fVxcSW5Qcm9jU2VydmVyMzIiKSAhPSBFUlJPUl9TVUNDRVNTKQorCSsrZmFpbDsKKyAgICBpZiAoUmVnRGVsZXRlS2V5KEhLRVlfQ0xBU1NFU19ST09ULCAiQ0xTSURcXHs1MUVFRTI0Mi1BRDg3LTExZDMtOUMxRS0wMDkwMjc4QkJEOTl9IikgIT0gRVJST1JfU1VDQ0VTUykKKwkrK2ZhaWw7CisgICAgaWYgKFJlZ0RlbGV0ZUtleShIS0VZX0NMQVNTRVNfUk9PVCwgIipcXHNoZWxsZXhcXENvbnRleHRNZW51SGFuZGxlcnNcXGd2aW0iKSAhPSBFUlJPUl9TVUNDRVNTKQorCSsrZmFpbDsKKyAgICBpZiAoUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxTaGVsbCBFeHRlbnNpb25zXFxBcHByb3ZlZCIsIDAsIEtFWV9BTExfQUNDRVNTLCAma2gpICE9IEVSUk9SX1NVQ0NFU1MpCisJKytmYWlsOworICAgIGVsc2UKKyAgICB7CisJaWYgKFJlZ0RlbGV0ZVZhbHVlKGtoLCAiezUxRUVFMjQyLUFEODctMTFkMy05QzFFLTAwOTAyNzhCQkQ5OX0iKSAhPSBFUlJPUl9TVUNDRVNTKQorCSAgICArK2ZhaWw7CisJUmVnQ2xvc2VLZXkoa2gpOworICAgIH0KKyAgICBpZiAoUmVnRGVsZXRlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxWaW1cXEd2aW0iKSAhPSBFUlJPUl9TVUNDRVNTKQorCSsrZmFpbDsKKyAgICBpZiAoUmVnRGVsZXRlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxWaW0iKSAhPSBFUlJPUl9TVUNDRVNTKQorCSsrZmFpbDsKKworICAgIGlmIChmYWlsID09IDYpCisJcHJpbnRmKCJObyBWaW0gcG9wdXAgcmVnaXN0cnkgZW50cmllcyBjb3VsZCBiZSByZW1vdmVkXG4iKTsKKyAgICBlbHNlIGlmIChmYWlsID4gMCkKKwlwcmludGYoIlNvbWUgVmltIHBvcHVwIHJlZ2lzdHJ5IGVudHJpZXMgY291bGQgbm90IGJlIHJlbW92ZWRcbiIpOworICAgIGVsc2UKKwlwcmludGYoIlRoZSBWaW0gcG9wdXAgcmVnaXN0cnkgZW50cmllcyBoYXZlIGJlZW4gcmVtb3ZlZFxuIik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorcmVtb3ZlX29wZW53aXRoKHZvaWQpCit7CisgICAgaW50CQlmYWlsID0gMDsKKworICAgIGlmIChSZWdEZWxldGVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsICJBcHBsaWNhdGlvbnNcXGd2aW0uZXhlXFxzaGVsbFxcZWRpdFxcY29tbWFuZCIpICE9IEVSUk9SX1NVQ0NFU1MpCisJKytmYWlsOworICAgIGlmIChSZWdEZWxldGVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsICJBcHBsaWNhdGlvbnNcXGd2aW0uZXhlXFxzaGVsbFxcZWRpdCIpICE9IEVSUk9SX1NVQ0NFU1MpCisJKytmYWlsOworICAgIGlmIChSZWdEZWxldGVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsICJBcHBsaWNhdGlvbnNcXGd2aW0uZXhlXFxzaGVsbCIpICE9IEVSUk9SX1NVQ0NFU1MpCisJKytmYWlsOworICAgIGlmIChSZWdEZWxldGVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsICJBcHBsaWNhdGlvbnNcXGd2aW0uZXhlIikgIT0gRVJST1JfU1VDQ0VTUykKKwkrK2ZhaWw7CisgICAgaWYgKFJlZ0RlbGV0ZUtleShIS0VZX0NMQVNTRVNfUk9PVCwgIi5odG1cXE9wZW5XaXRoTGlzdFxcZ3ZpbS5leGUiKSAhPSBFUlJPUl9TVUNDRVNTKQorCSsrZmFpbDsKKyAgICBpZiAoUmVnRGVsZXRlS2V5KEhLRVlfQ0xBU1NFU19ST09ULCAiLnZpbVxcT3BlbldpdGhMaXN0XFxndmltLmV4ZSIpICE9IEVSUk9SX1NVQ0NFU1MpCisJKytmYWlsOworICAgIGlmIChSZWdEZWxldGVLZXkoSEtFWV9DTEFTU0VTX1JPT1QsICIqXFxPcGVuV2l0aExpc3RcXGd2aW0uZXhlIikgIT0gRVJST1JfU1VDQ0VTUykKKwkrK2ZhaWw7CisKKyAgICBpZiAoZmFpbCA9PSA3KQorCXByaW50ZigiTm8gVmltIG9wZW4td2l0aCByZWdpc3RyeSBlbnRyaWVzIGNvdWxkIGJlIHJlbW92ZWRcbiIpOworICAgIGVsc2UgaWYgKGZhaWwgPiAwKQorCXByaW50ZigiU29tZSBWaW0gb3Blbi13aXRoIHJlZ2lzdHJ5IGVudHJpZXMgY291bGQgbm90IGJlIHJlbW92ZWRcbiIpOworICAgIGVsc2UKKwlwcmludGYoIlRoZSBWaW0gb3Blbi13aXRoIHJlZ2lzdHJ5IGVudHJpZXMgaGF2ZSBiZWVuIHJlbW92ZWRcbiIpOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayBpZiBhIGJhdGNoIGZpbGUgaXMgcmVhbGx5IGZvciB0aGUgY3VycmVudCB2ZXJzaW9uLiAgRG9uJ3QgZGVsZXRlIGEKKyAqIGJhdGNoIGZpbGUgdGhhdCB3YXMgd3JpdHRlbiBmb3IgYW5vdGhlciAocG9zc2libHkgbmV3ZXIpIHZlcnNpb24uCisgKi8KKyAgICBzdGF0aWMgaW50CitiYXRmaWxlX3RoaXN2ZXJzaW9uKGNoYXIgKnBhdGgpCit7CisgICAgRklMRQkqZmQ7CisgICAgY2hhcglsaW5lW0JVRlNJWkVdOworICAgIGNoYXIJKnA7CisgICAgaW50CQl2ZXJfbGVuID0gc3RybGVuKFZJTV9WRVJTSU9OX05PRE9UKTsKKyAgICBpbnQJCWZvdW5kID0gRkFMU0U7CisKKyAgICBmZCA9IGZvcGVuKHBhdGgsICJyIik7CisgICAgaWYgKGZkICE9IE5VTEwpCisgICAgeworCXdoaWxlIChmZ2V0cyhsaW5lLCBCVUZTSVpFLCBmZCkgIT0gTlVMTCkKKwl7CisJICAgIGZvciAocCA9IGxpbmU7ICpwICE9IDA7ICsrcCkKKwkJLyogZG9uJ3QgYWNjZXB0ICJ2aW02MGFuIiB3aGVuIGxvb2tpbmcgZm9yICJ2aW02MCIuICovCisJCWlmIChzdHJuaWNtcChwLCBWSU1fVkVSU0lPTl9OT0RPVCwgdmVyX2xlbikgPT0gMAorCQkJJiYgIWlzZGlnaXQocFt2ZXJfbGVuXSkKKwkJCSYmICFpc2FscGhhKHBbdmVyX2xlbl0pKQorCQl7CisJCSAgICBmb3VuZCA9IFRSVUU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICBpZiAoZm91bmQpCisJCWJyZWFrOworCX0KKwlmY2xvc2UoZmQpOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKyAgICBzdGF0aWMgaW50CityZW1vdmVfYmF0ZmlsZXMoaW50IGRvaXQpCit7CisgICAgY2hhciAqYmF0ZmlsZV9wYXRoOworICAgIGludAkgaTsKKyAgICBpbnQJIGZvdW5kID0gMDsKKworICAgIGZvciAoaSA9IDE7IGkgPCBUQVJHRVRfQ09VTlQ7ICsraSkKKyAgICB7CisJYmF0ZmlsZV9wYXRoID0gc2VhcmNocGF0aF9zYXZlKHRhcmdldHNbaV0uYmF0bmFtZSk7CisJaWYgKGJhdGZpbGVfcGF0aCAhPSBOVUxMICYmIGJhdGZpbGVfdGhpc3ZlcnNpb24oYmF0ZmlsZV9wYXRoKSkKKwl7CisJICAgICsrZm91bmQ7CisJICAgIGlmIChkb2l0KQorCSAgICB7CisJCXByaW50ZigicmVtb3ZpbmcgJXNcbiIsIGJhdGZpbGVfcGF0aCk7CisJCXJlbW92ZShiYXRmaWxlX3BhdGgpOworCSAgICB9CisJICAgIGVsc2UKKwkJcHJpbnRmKCIgLSB0aGUgYmF0Y2ggZmlsZSAlc1xuIiwgYmF0ZmlsZV9wYXRoKTsKKwkgICAgZnJlZShiYXRmaWxlX3BhdGgpOworCX0KKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOworfQorCisjaWZkZWYgV0lOMzI2NAorICAgIHN0YXRpYyB2b2lkCityZW1vdmVfaWZfZXhpc3RzKGNoYXIgKnBhdGgsIGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgYnVmW0JVRlNJWkVdOworICAgIEZJTEUgKmZkOworCisgICAgc3ByaW50ZihidWYsICIlc1xcJXMiLCBwYXRoLCBmaWxlbmFtZSk7CisKKyAgICBmZCA9IGZvcGVuKGJ1ZiwgInIiKTsKKyAgICBpZiAoZmQgIT0gTlVMTCkKKyAgICB7CisJZmNsb3NlKGZkKTsKKwlwcmludGYoInJlbW92aW5nICVzXG4iLCBidWYpOworCXJlbW92ZShidWYpOworICAgIH0KK30KKworICAgIHN0YXRpYyB2b2lkCityZW1vdmVfaWNvbnModm9pZCkKK3sKKyAgICBjaGFyCXBhdGhbQlVGU0laRV07CisgICAgaW50CQlpOworCisgICAgaWYgKGdldF9zaGVsbF9mb2xkZXJfcGF0aChwYXRoLCAiZGVza3RvcCIpKQorCWZvciAoaSA9IDA7IGkgPCBJQ09OX0NPVU5UOyArK2kpCisJICAgIHJlbW92ZV9pZl9leGlzdHMocGF0aCwgaWNvbl9saW5rX25hbWVzW2ldKTsKK30KKworICAgIHN0YXRpYyB2b2lkCityZW1vdmVfc3RhcnRfbWVudSh2b2lkKQoreworICAgIGNoYXIJcGF0aFtCVUZTSVpFXTsKKyAgICBpbnQJCWk7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICBpZiAoZ2V0X3NoZWxsX2ZvbGRlcl9wYXRoKHBhdGgsIFZJTV9TVEFSVE1FTlUpKQorICAgIHsKKwlmb3IgKGkgPSAxOyBpIDwgVEFSR0VUX0NPVU5UOyArK2kpCisJICAgIHJlbW92ZV9pZl9leGlzdHMocGF0aCwgdGFyZ2V0c1tpXS5sbmtuYW1lKTsKKwlyZW1vdmVfaWZfZXhpc3RzKHBhdGgsICJ1bmluc3RhbGwubG5rIik7CisJcmVtb3ZlX2lmX2V4aXN0cyhwYXRoLCAiSGVscC5sbmsiKTsKKwkvKiBXaW45NSB1c2VzIC5waWYsIFdpbk5UIHVzZXMgLmxuayAqLworCXJlbW92ZV9pZl9leGlzdHMocGF0aCwgIlZpbSB0dXRvci5waWYiKTsKKwlyZW1vdmVfaWZfZXhpc3RzKHBhdGgsICJWaW0gdHV0b3IubG5rIik7CisJcmVtb3ZlX2lmX2V4aXN0cyhwYXRoLCAiVmltIG9ubGluZS51cmwiKTsKKwlpZiAoc3RhdChwYXRoLCAmc3QpID09IDApCisJeworCSAgICBwcmludGYoInJlbW92aW5nICVzXG4iLCBwYXRoKTsKKwkgICAgcm1kaXIocGF0aCk7CisJfQorICAgIH0KK30KKyNlbmRpZgorCisjaWYgMCAgLyogY3VycmVudGx5IG5vdCB1c2VkICovCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiB3ZSdyZSBvbiBXaW5kb3dzIDk1Lzk4L01FLgorICovCisgICAgc3RhdGljIGludAord2luOTUodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmUgPSBGQUxTRTsKKyAgICBzdGF0aWMgRFdPUkQgUGxhdGZvcm1JZDsKKworICAgIGlmICghZG9uZSkKKyAgICB7CisJT1NWRVJTSU9OSU5GTyBvdmk7CisKKwlvdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihvdmkpOworCUdldFZlcnNpb25FeCgmb3ZpKTsKKwlQbGF0Zm9ybUlkID0gb3ZpLmR3UGxhdGZvcm1JZDsKKwlkb25lID0gVFJVRTsKKyAgICB9CisgICAgLyogV2luIE5ULzIwMDAvWFAgaXMgVkVSX1BMQVRGT1JNX1dJTjMyX05UICovCisgICAgcmV0dXJuIFBsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1M7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCitkZWxldGVfdW5pbnN0YWxsX2tleSh2b2lkKQoreworI2lmZGVmIFdJTjMyNjQKKyAgICBSZWdEZWxldGVLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcVmltICIgVklNX1ZFUlNJT05fU0hPUlQpOworI2Vsc2UKKyAgICBGSUxFCSpmZDsKKyAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKKworICAgIC8qCisgICAgICogT24gREpHUFAgd2UgZGVsZXRlIHJlZ2lzdHJ5IGVudHJpZXMgYnkgY3JlYXRpbmcgYSAuaW5mIGZpbGUgYW5kCisgICAgICogaW5zdGFsbGluZyBpdC4KKyAgICAgKi8KKyAgICBmZCA9IGZvcGVuKCJ2aW0uaW5mIiwgInciKTsKKyAgICBpZiAoZmQgIT0gTlVMTCkKKyAgICB7CisJZnByaW50ZihmZCwgIlt2ZXJzaW9uXVxuIik7CisJZnByaW50ZihmZCwgInNpZ25hdHVyZT1cIiRDSElDQUdPJFwiXG5cbiIpOworCWZwcmludGYoZmQsICJbRGVmYXVsdEluc3RhbGxdXG4iKTsKKwlmcHJpbnRmKGZkLCAiRGVsUmVnPURlbGV0ZU1lXG5cbiIpOworCWZwcmludGYoZmQsICJbRGVsZXRlTWVdXG4iKTsKKwlmcHJpbnRmKGZkLCAiSEtMTSxcIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXFZpbSAiIFZJTV9WRVJTSU9OX1NIT1JUICJcIlxuIik7CisJZmNsb3NlKGZkKTsKKworCS8qIERvbid0IGtub3cgaG93IHRvIGRldGVjdCBXaW4gTlQgd2l0aCBESkdQUC4gIEhhY2s6IEp1c3QgdHJ5IHRoZSBXaW4KKwkgKiA5NS85OC9NRSBtZXRob2QsIHNpbmNlIHRoZSBESkdQUCB2ZXJzaW9uIGNhbid0IHVzZSBsb25nIGZpbGVuYW1lcworCSAqIG9uIFdpbiBOVCBhbnl3YXkuICovCisJc3ByaW50ZihidWYsICJydW5kbGwgc2V0dXB4LmRsbCxJbnN0YWxsSGluZlNlY3Rpb24gRGVmYXVsdEluc3RhbGwgMTMyICVzXFx2aW0uaW5mIiwgaW5zdGFsbGRpcik7CisJcnVuX2NvbW1hbmQoYnVmKTsKKyNpZiAwCisJLyogV2luZG93cyBOVCBtZXRob2QgKHVudGVzdGVkKS4gKi8KKwlzcHJpbnRmKGJ1ZiwgInJ1bmRsbDMyIHN5c3NldHVwLFNldHVwSW5mT2JqZWN0SW5zdGFsbEFjdGlvbiBEZWZhdWx0SW5zdGFsbCAxMjggJXNcXHZpbS5pbmYiLCBpbnN0YWxsZGlyKTsKKwlydW5fY29tbWFuZChidWYpOworI2VuZGlmCisKKwlyZW1vdmUoInZpbS5pbmYiKTsKKyAgICB9CisjZW5kaWYKK30KKworICAgIGludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludAkJZm91bmQgPSAwOworICAgIEZJTEUJKmZkOworI2lmZGVmIFdJTjMyNjQKKyAgICBpbnQJCWk7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgY2hhcglpY29uW0JVRlNJWkVdOworICAgIGNoYXIJcGF0aFtCVUZTSVpFXTsKKyAgICBjaGFyCXBvcHVwX3BhdGhbQlVGU0laRV07CisKKyAgICAvKiBUaGUgbnNpcyB1bmluc3RhbGxlciBjYWxscyB1cyB3aXRoIGEgIi1uc2lzIiBhcmd1bWVudC4gKi8KKyAgICBpZiAoYXJnYyA9PSAyICYmIHN0cmljbXAoYXJndlsxXSwgIi1uc2lzIikgPT0gMCkKKwlpbnRlcmFjdGl2ZSA9IEZBTFNFOworICAgIGVsc2UKKyNlbmRpZgorCWludGVyYWN0aXZlID0gVFJVRTsKKworICAgIC8qIEluaXRpYWxpemUgdGhpcyBwcm9ncmFtLiAqLworICAgIGRvX2luaXRzKGFyZ3YpOworCisgICAgcHJpbnRmKCJUaGlzIHByb2dyYW0gd2lsbCByZW1vdmUgdGhlIGZvbGxvd2luZyBpdGVtczpcbiIpOworCisjaWZkZWYgV0lOMzI2NAorICAgIGlmIChwb3B1cF9ndmltX3BhdGgocG9wdXBfcGF0aCkpCisgICAgeworCXByaW50ZigiIC0gdGhlIFwiRWRpdCB3aXRoIFZpbVwiIGVudHJ5IGluIHRoZSBwb3B1cCBtZW51XG4iKTsKKwlwcmludGYoIiAgIHdoaWNoIHVzZXMgXCIlc1wiXG4iLCBwb3B1cF9wYXRoKTsKKwlwcmludGYoIlxuUmVtb3ZlIGl0ICh5L24pPyAiKTsKKwlpZiAoY29uZmlybSgpKQorCXsKKwkgICAgcmVtb3ZlX3BvcHVwKCk7CisJICAgIC8qIEFzc3VtZSB0aGUgIk9wZW4gV2l0aCIgZW50cnkgY2FuIGJlIHJlbW92ZWQgYXMgd2VsbCwgZG9uJ3QKKwkgICAgICogYm90aGVyIHRoZSB1c2VyIHdpdGggYXNraW5nIGhpbSBhZ2Fpbi4gKi8KKwkgICAgcmVtb3ZlX29wZW53aXRoKCk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChvcGVud2l0aF9ndmltX3BhdGgocG9wdXBfcGF0aCkpCisgICAgeworCXByaW50ZigiIC0gdGhlIFZpbSBcIk9wZW4gV2l0aC4uLlwiIGVudHJ5IGluIHRoZSBwb3B1cCBtZW51XG4iKTsKKwlwcmludGYoIiAgIHdoaWNoIHVzZXMgXCIlc1wiXG4iLCBwb3B1cF9wYXRoKTsKKwlwcmludGYoIlxuUmVtb3ZlIGl0ICh5L24pPyAiKTsKKwlpZiAoY29uZmlybSgpKQorCSAgICByZW1vdmVfb3BlbndpdGgoKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3NoZWxsX2ZvbGRlcl9wYXRoKHBhdGgsICJkZXNrdG9wIikpCisgICAgeworCXByaW50ZigiXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgSUNPTl9DT1VOVDsgKytpKQorCXsKKwkgICAgc3ByaW50ZihpY29uLCAiJXNcXCVzIiwgcGF0aCwgaWNvbl9saW5rX25hbWVzW2ldKTsKKwkgICAgaWYgKHN0YXQoaWNvbiwgJnN0KSA9PSAwKQorCSAgICB7CisJCXByaW50ZigiIC0gdGhlIFwiJXNcIiBpY29uIG9uIHRoZSBkZXNrdG9wXG4iLCBpY29uX25hbWVzW2ldKTsKKwkJKytmb3VuZDsKKwkgICAgfQorCX0KKwlpZiAoZm91bmQgPiAwKQorCXsKKwkgICAgaWYgKGludGVyYWN0aXZlKQorCQlwcmludGYoIlxuUmVtb3ZlICVzICh5L24pPyAiLCBmb3VuZCA+IDEgPyAidGhlbSIgOiAiaXQiKTsKKwkgICAgaWYgKCFpbnRlcmFjdGl2ZSB8fCBjb25maXJtKCkpCisJCXJlbW92ZV9pY29ucygpOworCX0KKyAgICB9CisKKyAgICBpZiAoZ2V0X3NoZWxsX2ZvbGRlcl9wYXRoKHBhdGgsIFZJTV9TVEFSVE1FTlUpCisJICAgICYmIHN0YXQocGF0aCwgJnN0KSA9PSAwKQorICAgIHsKKwlwcmludGYoIlxuIC0gdGhlIFwiJXNcIiBlbnRyeSBpbiB0aGUgU3RhcnQgTWVudVxuIiwgVklNX1NUQVJUTUVOVSk7CisJaWYgKGludGVyYWN0aXZlKQorCSAgICBwcmludGYoIlxuUmVtb3ZlIGl0ICh5L24pPyAiKTsKKwlpZiAoIWludGVyYWN0aXZlIHx8IGNvbmZpcm0oKSkKKwkgICAgcmVtb3ZlX3N0YXJ0X21lbnUoKTsKKyAgICB9CisjZW5kaWYKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBmb3VuZCA9IHJlbW92ZV9iYXRmaWxlcygwKTsKKyAgICBpZiAoZm91bmQgPiAwKQorICAgIHsKKwlpZiAoaW50ZXJhY3RpdmUpCisJICAgIHByaW50ZigiXG5SZW1vdmUgJXMgKHkvbik/ICIsIGZvdW5kID4gMSA/ICJ0aGVtIiA6ICJpdCIpOworCWlmICghaW50ZXJhY3RpdmUgfHwgY29uZmlybSgpKQorCSAgICByZW1vdmVfYmF0ZmlsZXMoMSk7CisgICAgfQorCisgICAgZmQgPSBmb3BlbigiZ3ZpbS5leGUiLCAiciIpOworICAgIGlmIChmZCAhPSBOVUxMKQorICAgIHsKKwlmY2xvc2UoZmQpOworCXByaW50ZigiZ3ZpbS5leGUgZGV0ZWN0ZWQuICBBdHRlbXB0aW5nIHRvIHVucmVnaXN0ZXIgZ3ZpbSB3aXRoIE9MRVxuIik7CisJc3lzdGVtKCJndmltLmV4ZSAtc2lsZW50IC11bnJlZ2lzdGVyIik7CisgICAgfQorCisgICAgZGVsZXRlX3VuaW5zdGFsbF9rZXkoKTsKKworICAgIGlmIChpbnRlcmFjdGl2ZSkKKyAgICB7CisJcHJpbnRmKCJcbllvdSBtYXkgbm93IHdhbnQgdG8gZGVsZXRlIHRoZSBWaW0gZXhlY3V0YWJsZXMgYW5kIHJ1bnRpbWUgZmlsZXMuXG4iKTsKKwlwcmludGYoIihUaGV5IGFyZSBzdGlsbCB3aGVyZSB5b3UgdW5wYWNrZWQgdGhlbS4pXG4iKTsKKyAgICB9CisKKyAgICByZXdpbmQoc3RkaW4pOworICAgIHByaW50ZigiXG5QcmVzcyBFbnRlciB0byBleGl0Li4uIik7CisgICAgKHZvaWQpZ2V0Y2hhcigpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdmVyc2lvbi5jIGIvc3JjL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI5MzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZlcnNpb24uYwpAQCAtMCwwICsxLDEyMTkgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEFNSUdBCisjIGluY2x1ZGUgPHRpbWUuaD4JLyogZm9yIHRpbWUoKSAqLworI2VuZGlmCisKKy8qCisgKiBWaW0gb3JpZ2luYXRlZCBmcm9tIFN0ZXZpZSB2ZXJzaW9uIDMuNiAoRmlzaCBkaXNrIDIxNykgYnkgR1JXYWx0ZXIgKEZyZWQpCisgKiBJdCBoYXMgYmVlbiBjaGFuZ2VkIGJleW9uZCByZWNvZ25pdGlvbiBzaW5jZSB0aGVuLgorICoKKyAqIERpZmZlcmVuY2VzIGJldHdlZW4gdmVyc2lvbiA1LnggYW5kIDYueCBjYW4gYmUgZm91bmQgd2l0aCAiOmhlbHAgdmVyc2lvbjYiLgorICogRGlmZmVyZW5jZXMgYmV0d2VlbiB2ZXJzaW9uIDQueCBhbmQgNS54IGNhbiBiZSBmb3VuZCB3aXRoICI6aGVscCB2ZXJzaW9uNSIuCisgKiBEaWZmZXJlbmNlcyBiZXR3ZWVuIHZlcnNpb24gMy4wIGFuZCA0LnggY2FuIGJlIGZvdW5kIHdpdGggIjpoZWxwIHZlcnNpb240Ii4KKyAqIEFsbCB0aGUgcmVtYXJrcyBhYm91dCBvbGRlciB2ZXJzaW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCwgdGhleSBhcmUgbm90IHZlcnkKKyAqIGludGVyZXN0aW5nLgorICovCisKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK2NoYXIJKlZlcnNpb24gPSBWSU1fVkVSU0lPTl9TSE9SVDsKK2NoYXIJKm1lZGl1bVZlcnNpb24gPSBWSU1fVkVSU0lPTl9NRURJVU07CisKKyNpZiBkZWZpbmVkKEhBVkVfREFURV9USU1FKSB8fCBkZWZpbmVkKFBST1RPKQorIyBpZiAoZGVmaW5lZChWTVMpICYmIGRlZmluZWQoVkFYQykpIHx8IGRlZmluZWQoUFJPVE8pCitjaGFyCWxvbmdWZXJzaW9uW3NpemVvZihWSU1fVkVSU0lPTl9MT05HX0RBVEUpICsgc2l6ZW9mKF9fREFURV9fKQorCQkJCQkJICAgICAgKyBzaXplb2YoX19USU1FX18pICsgM107CisgICAgdm9pZAorbWFrZV92ZXJzaW9uKCkKK3sKKyAgICAvKgorICAgICAqIENvbnN0cnVjdCB0aGUgbG9uZyB2ZXJzaW9uIHN0cmluZy4gIE5lY2Vzc2FyeSBiZWNhdXNlCisgICAgICogVkFYIEMgY2FuJ3QgY2F0ZW5hdGUgc3RyaW5ncyBpbiB0aGUgcHJlcHJvY2Vzc29yLgorICAgICAqLworICAgIHN0cmNweShsb25nVmVyc2lvbiwgVklNX1ZFUlNJT05fTE9OR19EQVRFKTsKKyAgICBzdHJjYXQobG9uZ1ZlcnNpb24sIF9fREFURV9fKTsKKyAgICBzdHJjYXQobG9uZ1ZlcnNpb24sICIgIik7CisgICAgc3RyY2F0KGxvbmdWZXJzaW9uLCBfX1RJTUVfXyk7CisgICAgc3RyY2F0KGxvbmdWZXJzaW9uLCAiKSIpOworfQorIyBlbHNlCitjaGFyCSpsb25nVmVyc2lvbiA9IFZJTV9WRVJTSU9OX0xPTkdfREFURSBfX0RBVEVfXyAiICIgX19USU1FX18gIikiOworIyBlbmRpZgorI2Vsc2UKK2NoYXIJKmxvbmdWZXJzaW9uID0gVklNX1ZFUlNJT05fTE9ORzsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2ZXJzaW9uX21zZyBfX0FSR1MoKGNoYXIgKnMpKTsKKworc3RhdGljIGNoYXIgKihmZWF0dXJlc1tdKSA9Cit7CisjaWZkZWYgQU1JR0EJCS8qIG9ubHkgZm9yIEFtaWdhIHN5c3RlbXMgKi8KKyMgaWZkZWYgRkVBVF9BUlAKKwkiK0FSUCIsCisjIGVsc2UKKwkiLUFSUCIsCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX0FSQUJJQworCSIrYXJhYmljIiwKKyNlbHNlCisJIi1hcmFiaWMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJIithdXRvY21kIiwKKyNlbHNlCisJIi1hdXRvY21kIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQkVWQUwKKwkiK2JhbGxvb25fZXZhbCIsCisjZWxzZQorCSItYmFsbG9vbl9ldmFsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQlJPV1NFCisJIiticm93c2UiLAorI2Vsc2UKKwkiLWJyb3dzZSIsCisjZW5kaWYKKyNpZmRlZiBOT19CVUlMVElOX1RDQVBTCisJIi1idWlsdGluX3Rlcm1zIiwKKyNlbmRpZgorI2lmZGVmIFNPTUVfQlVJTFRJTl9UQ0FQUworCSIrYnVpbHRpbl90ZXJtcyIsCisjZW5kaWYKKyNpZmRlZiBBTExfQlVJTFRJTl9UQ0FQUworCSIrK2J1aWx0aW5fdGVybXMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9CWVRFT0ZGCisJIitieXRlX29mZnNldCIsCisjZWxzZQorCSItYnl0ZV9vZmZzZXQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DSU5ERU5UCisJIitjaW5kZW50IiwKKyNlbHNlCisJIi1jaW5kZW50IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ0xJRU5UU0VSVkVSCisJIitjbGllbnRzZXJ2ZXIiLAorI2Vsc2UKKwkiLWNsaWVudHNlcnZlciIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorCSIrY2xpcGJvYXJkIiwKKyNlbHNlCisJIi1jbGlwYm9hcmQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0NPTVBMCisJIitjbWRsaW5lX2NvbXBsIiwKKyNlbHNlCisJIi1jbWRsaW5lX2NvbXBsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ01ESElTVAorCSIrY21kbGluZV9oaXN0IiwKKyNlbHNlCisJIi1jbWRsaW5lX2hpc3QiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkiK2NtZGxpbmVfaW5mbyIsCisjZWxzZQorCSItY21kbGluZV9pbmZvIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfQ09NTUVOVFMKKwkiK2NvbW1lbnRzIiwKKyNlbHNlCisJIi1jb21tZW50cyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NSWVBUCisJIitjcnlwdHYiLAorI2Vsc2UKKwkiLWNyeXB0diIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0NTQ09QRQorCSIrY3Njb3BlIiwKKyNlbHNlCisJIi1jc2NvcGUiLAorI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpICYmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKQorCSIrZGlhbG9nX2Nvbl9ndWkiLAorI2Vsc2UKKyMgaWYgZGVmaW5lZChGRUFUX0NPTl9ESUFMT0cpCisJIitkaWFsb2dfY29uIiwKKyMgZWxzZQorIyAgaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpCisJIitkaWFsb2dfZ3VpIiwKKyMgIGVsc2UKKwkiLWRpYWxvZyIsCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9ESUZGCisJIitkaWZmIiwKKyNlbHNlCisJIi1kaWZmIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRElHUkFQSFMKKwkiK2RpZ3JhcGhzIiwKKyNlbHNlCisJIi1kaWdyYXBocyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0RORAorCSIrZG5kIiwKKyNlbHNlCisJIi1kbmQiLAorI2VuZGlmCisjaWZkZWYgRUJDRElDCisJIitlYmNkaWMiLAorI2Vsc2UKKwkiLWViY2RpYyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkiK2VtYWNzX3RhZ3MiLAorI2Vsc2UKKwkiLWVtYWNzX3RhZ3MiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9FVkFMCisJIitldmFsIiwKKyNlbHNlCisJIi1ldmFsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfRVhfRVhUUkEKKwkiK2V4X2V4dHJhIiwKKyNlbHNlCisJIi1leF9leHRyYSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorCSIrZXh0cmFfc2VhcmNoIiwKKyNlbHNlCisJIi1leHRyYV9zZWFyY2giLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GS01BUAorCSIrZmFyc2kiLAorI2Vsc2UKKwkiLWZhcnNpIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAorCSIrZmlsZV9pbl9wYXRoIiwKKyNlbHNlCisJIi1maWxlX2luX3BhdGgiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GSU5EX0lECisJIitmaW5kX2luX3BhdGgiLAorI2Vsc2UKKwkiLWZpbmRfaW5fcGF0aCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0ZPTERJTkcKKwkiK2ZvbGRpbmciLAorI2Vsc2UKKwkiLWZvbGRpbmciLAorI2VuZGlmCisjaWZkZWYgRkVBVF9GT09URVIKKwkiK2Zvb3RlciIsCisjZWxzZQorCSItZm9vdGVyIiwKKyNlbmRpZgorCSAgICAvKiBvbmx5IGludGVyZXN0aW5nIG9uIFVuaXggc3lzdGVtcyAqLworI2lmICFkZWZpbmVkKFVTRV9TWVNURU0pICYmIGRlZmluZWQoVU5JWCkKKwkiK2ZvcmsoKSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0dFVFRFWFQKKyMgaWZkZWYgRFlOQU1JQ19HRVRURVhUCisJIitnZXR0ZXh0L2R5biIsCisjIGVsc2UKKwkiK2dldHRleHQiLAorIyBlbmRpZgorI2Vsc2UKKwkiLWdldHRleHQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9IQU5HVUxJTgorCSIraGFuZ3VsX2lucHV0IiwKKyNlbHNlCisJIi1oYW5ndWxfaW5wdXQiLAorI2VuZGlmCisjaWYgKGRlZmluZWQoSEFWRV9JQ09OVl9IKSAmJiBkZWZpbmVkKFVTRV9JQ09OVikpIHx8IGRlZmluZWQoRFlOQU1JQ19JQ09OVikKKyMgaWZkZWYgRFlOQU1JQ19JQ09OVgorCSIraWNvbnYvZHluIiwKKyMgZWxzZQorCSIraWNvbnYiLAorIyBlbmRpZgorI2Vsc2UKKwkiLWljb252IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfSU5TX0VYUEFORAorCSIraW5zZXJ0X2V4cGFuZCIsCisjZWxzZQorCSItaW5zZXJ0X2V4cGFuZCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0pVTVBMSVNUCisJIitqdW1wbGlzdCIsCisjZWxzZQorCSItanVtcGxpc3QiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9LRVlNQVAKKwkiK2tleW1hcCIsCisjZWxzZQorCSIta2V5bWFwIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTEFOR01BUAorCSIrbGFuZ21hcCIsCisjZWxzZQorCSItbGFuZ21hcCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJQkNBTEwKKwkiK2xpYmNhbGwiLAorI2Vsc2UKKwkiLWxpYmNhbGwiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9MSU5FQlJFQUsKKwkiK2xpbmVicmVhayIsCisjZWxzZQorCSItbGluZWJyZWFrIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTElTUAorCSIrbGlzcGluZGVudCIsCisjZWxzZQorCSItbGlzcGluZGVudCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX0xJU1RDTURTCisJIitsaXN0Y21kcyIsCisjZWxzZQorCSItbGlzdGNtZHMiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9MT0NBTE1BUAorCSIrbG9jYWxtYXAiLAorI2Vsc2UKKwkiLWxvY2FsbWFwIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUVOVQorCSIrbWVudSIsCisjZWxzZQorCSItbWVudSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NFU1NJT04KKwkiK21rc2Vzc2lvbiIsCisjZWxzZQorCSItbWtzZXNzaW9uIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfTU9ESUZZX0ZOQU1FCisJIittb2RpZnlfZm5hbWUiLAorI2Vsc2UKKwkiLW1vZGlmeV9mbmFtZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX01PVVNFCisJIittb3VzZSIsCisjICBpZmRlZiBGRUFUX01PVVNFU0hBUEUKKwkiK21vdXNlc2hhcGUiLAorIyAgZWxzZQorCSItbW91c2VzaGFwZSIsCisjICBlbmRpZgorIyBlbHNlCisJIi1tb3VzZSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorIyBpZmRlZiBGRUFUX01PVVNFX0RFQworCSIrbW91c2VfZGVjIiwKKyMgZWxzZQorCSItbW91c2VfZGVjIiwKKyMgZW5kaWYKKyMgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKwkiK21vdXNlX2dwbSIsCisjIGVsc2UKKwkiLW1vdXNlX2dwbSIsCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfSlNCCisJIittb3VzZV9qc2J0ZXJtIiwKKyMgZWxzZQorCSItbW91c2VfanNidGVybSIsCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfTkVUCisJIittb3VzZV9uZXR0ZXJtIiwKKyMgZWxzZQorCSItbW91c2VfbmV0dGVybSIsCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KKwkiK21vdXNlX3h0ZXJtIiwKKyMgZWxzZQorCSItbW91c2VfeHRlcm0iLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19RTlhfXworIyBpZmRlZiBGRUFUX01PVVNFX1BURVJNCisJIittb3VzZV9wdGVybSIsCisjIGVsc2UKKwkiLW1vdXNlX3B0ZXJtIiwKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfTUJZVEVfSU1FCisjIGlmZGVmIERZTkFNSUNfSU1FCisJIittdWx0aV9ieXRlX2ltZS9keW4iLAorIyBlbHNlCisJIittdWx0aV9ieXRlX2ltZSIsCisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBGRUFUX01CWVRFCisJIittdWx0aV9ieXRlIiwKKyMgZWxzZQorCSItbXVsdGlfYnl0ZSIsCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX01VTFRJX0xBTkcKKwkiK211bHRpX2xhbmciLAorI2Vsc2UKKwkiLW11bHRpX2xhbmciLAorI2VuZGlmCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisJIituZXRiZWFuc19pbnRnIiwKKyNlbHNlCisJIi1uZXRiZWFuc19pbnRnIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJX1czMgorIyBpZmRlZiBGRUFUX09MRQorCSIrb2xlIiwKKyMgZWxzZQorCSItb2xlIiwKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfT1NGSUxFVFlQRQorCSIrb3NmaWxldHlwZSIsCisjZWxzZQorCSItb3NmaWxldHlwZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1BBVEhfRVhUUkEKKwkiK3BhdGhfZXh0cmEiLAorI2Vsc2UKKwkiLXBhdGhfZXh0cmEiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9QRVJMCisjIGlmZGVmIERZTkFNSUNfUEVSTAorCSIrcGVybC9keW4iLAorIyBlbHNlCisJIitwZXJsIiwKKyMgZW5kaWYKKyNlbHNlCisJIi1wZXJsIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfUFJJTlRFUgorIyBpZmRlZiBGRUFUX1BPU1RTQ1JJUFQKKwkiK3Bvc3RzY3JpcHQiLAorIyBlbHNlCisJIi1wb3N0c2NyaXB0IiwKKyMgZW5kaWYKKwkiK3ByaW50ZXIiLAorI2Vsc2UKKwkiLXByaW50ZXIiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9QWVRIT04KKyMgaWZkZWYgRFlOQU1JQ19QWVRIT04KKwkiK3B5dGhvbi9keW4iLAorIyBlbHNlCisJIitweXRob24iLAorIyBlbmRpZgorI2Vsc2UKKwkiLXB5dGhvbiIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJIitxdWlja2ZpeCIsCisjZWxzZQorCSItcXVpY2tmaXgiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKKwkiK3JpZ2h0bGVmdCIsCisjZWxzZQorCSItcmlnaHRsZWZ0IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfUlVCWQorIyBpZmRlZiBEWU5BTUlDX1JVQlkKKwkiK3J1YnkvZHluIiwKKyMgZWxzZQorCSIrcnVieSIsCisjIGVuZGlmCisjZWxzZQorCSItcnVieSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwkiK3Njcm9sbGJpbmQiLAorI2Vsc2UKKwkiLXNjcm9sbGJpbmQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9TSUdOUworCSIrc2lnbnMiLAorI2Vsc2UKKwkiLXNpZ25zIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKKwkiK3NtYXJ0aW5kZW50IiwKKyNlbHNlCisJIi1zbWFydGluZGVudCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NOSUZGCisJIitzbmlmZiIsCisjZWxzZQorCSItc25pZmYiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9TVExfT1BUCisJIitzdGF0dXNsaW5lIiwKKyNlbHNlCisJIi1zdGF0dXNsaW5lIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfU1VOX1dPUktTSE9QCisJIitzdW5fd29ya3Nob3AiLAorI2Vsc2UKKwkiLXN1bl93b3Jrc2hvcCIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1NZTl9ITAorCSIrc3ludGF4IiwKKyNlbHNlCisJIi1zeW50YXgiLAorI2VuZGlmCisJICAgIC8qIG9ubHkgaW50ZXJlc3Rpbmcgb24gVW5peCBzeXN0ZW1zICovCisjaWYgZGVmaW5lZChVU0VfU1lTVEVNKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKF9fRU1YX18pKQorCSIrc3lzdGVtKCkiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9UQUdfQklOUworCSIrdGFnX2JpbmFyeSIsCisjZWxzZQorCSItdGFnX2JpbmFyeSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RBR19PTERTVEFUSUMKKwkiK3RhZ19vbGRfc3RhdGljIiwKKyNlbHNlCisJIi10YWdfb2xkX3N0YXRpYyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RBR19BTllXSElURQorCSIrdGFnX2FueV93aGl0ZSIsCisjZWxzZQorCSItdGFnX2FueV93aGl0ZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RDTAorIyBpZmRlZiBEWU5BTUlDX1RDTAorCSIrdGNsL2R5biIsCisjIGVsc2UKKwkiK3RjbCIsCisjIGVuZGlmCisjZWxzZQorCSItdGNsIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKQorLyogb25seSBVbml4IChvciBPUy8yIHdpdGggRU1YISkgY2FuIGhhdmUgdGVybWluZm8gaW5zdGVhZCBvZiB0ZXJtY2FwICovCisjIGlmZGVmIFRFUk1JTkZPCisJIit0ZXJtaW5mbyIsCisjIGVsc2UKKwkiLXRlcm1pbmZvIiwKKyMgZW5kaWYKKyNlbHNlCQkgICAgLyogdW5peCBhbHdheXMgaW5jbHVkZXMgdGVybWNhcCBzdXBwb3J0ICovCisjIGlmZGVmIEhBVkVfVEdFVEVOVAorCSIrdGdldGVudCIsCisjIGVsc2UKKwkiLXRnZXRlbnQiLAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwkiK3Rlcm1yZXNwb25zZSIsCisjZWxzZQorCSItdGVybXJlc3BvbnNlIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEVYVE9CSgorCSIrdGV4dG9iamVjdHMiLAorI2Vsc2UKKwkiLXRleHRvYmplY3RzIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVElUTEUKKwkiK3RpdGxlIiwKKyNlbHNlCisJIi10aXRsZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1RPT0xCQVIKKwkiK3Rvb2xiYXIiLAorI2Vsc2UKKwkiLXRvb2xiYXIiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9VU1JfQ01EUworCSIrdXNlcl9jb21tYW5kcyIsCisjZWxzZQorCSItdXNlcl9jb21tYW5kcyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSIrdmVydHNwbGl0IiwKKyNlbHNlCisJIi12ZXJ0c3BsaXQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorCSIrdmlydHVhbGVkaXQiLAorI2Vsc2UKKwkiLXZpcnR1YWxlZGl0IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCisJIit2aXN1YWwiLAorIyBpZmRlZiBGRUFUX1ZJU1VBTEVYVFJBCisJIit2aXN1YWxleHRyYSIsCisjIGVsc2UKKwkiLXZpc3VhbGV4dHJhIiwKKyMgZW5kaWYKKyNlbHNlCisJIi12aXN1YWwiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9WSU1JTkZPCisJIit2aW1pbmZvIiwKKyNlbHNlCisJIi12aW1pbmZvIiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfVlJFUExBQ0UKKwkiK3ZyZXBsYWNlIiwKKyNlbHNlCisJIi12cmVwbGFjZSIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTERJR04KKwkiK3dpbGRpZ25vcmUiLAorI2Vsc2UKKwkiLXdpbGRpZ25vcmUiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9XSUxETUVOVQorCSIrd2lsZG1lbnUiLAorI2Vsc2UKKwkiLXdpbGRtZW51IiwKKyNlbmRpZgorI2lmZGVmIEZFQVRfV0lORE9XUworCSIrd2luZG93cyIsCisjZWxzZQorCSItd2luZG93cyIsCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dSSVRFQkFDS1VQCisJIit3cml0ZWJhY2t1cCIsCisjZWxzZQorCSItd3JpdGViYWNrdXAiLAorI2VuZGlmCisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKyMgaWZkZWYgRkVBVF9YMTEKKwkiK1gxMSIsCisjIGVsc2UKKwkiLVgxMSIsCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX1hGT05UU0VUCisJIit4Zm9udHNldCIsCisjZWxzZQorCSIteGZvbnRzZXQiLAorI2VuZGlmCisjaWZkZWYgRkVBVF9YSU0KKwkiK3hpbSIsCisjZWxzZQorCSIteGltIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisjIGlmZGVmIFVTRV9YU01QX0lOVEVSQUNUCisJIit4c21wX2ludGVyYWN0IiwKKyMgZWxzZQorIyAgaWZkZWYgVVNFX1hTTVAKKwkiK3hzbXAiLAorIyAgZWxzZQorCSIteHNtcCIsCisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBGRUFUX1hDTElQQk9BUkQKKwkiK3h0ZXJtX2NsaXBib2FyZCIsCisjIGVsc2UKKwkiLXh0ZXJtX2NsaXBib2FyZCIsCisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBGRUFUX1hURVJNX1NBVkUKKwkiK3h0ZXJtX3NhdmUiLAorI2Vsc2UKKwkiLXh0ZXJtX3NhdmUiLAorI2VuZGlmCisjaWZkZWYgV0lOMzI2NAorIyBpZmRlZiBGRUFUX1hQTV9XMzIKKwkiK3hwbV93MzIiLAorIyBlbHNlCisJIi14cG1fdzMyIiwKKyMgZW5kaWYKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgaW5jbHVkZWRfcGF0Y2hlc1tdID0KK3sgICAvKiBBZGQgbmV3IHBhdGNoIG51bWJlciBiZWxvdyB0aGlzIGxpbmUgKi8KKy8qKi8KKyAgICAwCit9OworCisgICAgaW50CitoaWdoZXN0X3BhdGNoKCkKK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQloID0gMDsKKworICAgIGZvciAoaSA9IDA7IGluY2x1ZGVkX3BhdGNoZXNbaV0gIT0gMDsgKytpKQorCWlmIChpbmNsdWRlZF9wYXRjaGVzW2ldID4gaCkKKwkgICAgaCA9IGluY2x1ZGVkX3BhdGNoZXNbaV07CisgICAgcmV0dXJuIGg7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBSZXR1cm4gVFJVRSBpZiBwYXRjaCAibiIgaGFzIGJlZW4gaW5jbHVkZWQuCisgKi8KKyAgICBpbnQKK2hhc19wYXRjaChuKQorICAgIGludAkJbjsKK3sKKyAgICBpbnQJCWk7CisKKyAgICBmb3IgKGkgPSAwOyBpbmNsdWRlZF9wYXRjaGVzW2ldICE9IDA7ICsraSkKKwlpZiAoaW5jbHVkZWRfcGF0Y2hlc1tpXSA9PSBuKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworICAgIHZvaWQKK2V4X3ZlcnNpb24oZWFwKQorICAgIGV4YXJnX1QJKmVhcDsKK3sKKyAgICAvKgorICAgICAqIElnbm9yZSBhICI6dmVyc2lvbiA5Ljk5IiBjb21tYW5kLgorICAgICAqLworICAgIGlmICgqZWFwLT5hcmcgPT0gTlVMKQorICAgIHsKKwltc2dfcHV0Y2hhcignXG4nKTsKKwlsaXN0X3ZlcnNpb24oKTsKKyAgICB9Cit9CisKKyAgICB2b2lkCitsaXN0X3ZlcnNpb24oKQoreworICAgIGludAkJaTsKKyAgICBpbnQJCWZpcnN0OworICAgIGNoYXIJKnMgPSAiIjsKKworICAgIC8qCisgICAgICogV2hlbiBhZGRpbmcgZmVhdHVyZXMgaGVyZSwgZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgbGlzdCBvZgorICAgICAqIGludGVybmFsIHZhcmlhYmxlcyBpbiBldmFsLmMhCisgICAgICovCisgICAgTVNHKGxvbmdWZXJzaW9uKTsKKyNpZmRlZiBXSU4zMjY0CisjIGlmZGVmIEZFQVRfR1VJX1czMgorIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDEwMTApCisgICAgLyogT25seSBNUyBWQyA0LjEgYW5kIGVhcmxpZXIgY2FuIGRvIFdpbjMycyAqLworICAgIE1TR19QVVRTKF8oIlxuTVMtV2luZG93cyAxNi8zMiBiaXQgR1VJIHZlcnNpb24iKSk7CisjICBlbHNlCisgICAgTVNHX1BVVFMoXygiXG5NUy1XaW5kb3dzIDMyIGJpdCBHVUkgdmVyc2lvbiIpKTsKKyMgIGVuZGlmCisgICAgaWYgKGd1aV9pc193aW4zMnMoKSkKKwlNU0dfUFVUUyhfKCIgaW4gV2luMzJzIG1vZGUiKSk7CisjIGlmZGVmIEZFQVRfT0xFCisgICAgTVNHX1BVVFMoXygiIHdpdGggT0xFIHN1cHBvcnQiKSk7CisjIGVuZGlmCisjIGVsc2UKKyAgICBNU0dfUFVUUyhfKCJcbk1TLVdpbmRvd3MgMzIgYml0IGNvbnNvbGUgdmVyc2lvbiIpKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJTjE2CisgICAgTVNHX1BVVFMoXygiXG5NUy1XaW5kb3dzIDE2IGJpdCB2ZXJzaW9uIikpOworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgaWZkZWYgREpHUFAKKyAgICBNU0dfUFVUUyhfKCJcbjMyIGJpdCBNUy1ET1MgdmVyc2lvbiIpKTsKKyMgZWxzZQorICAgIE1TR19QVVRTKF8oIlxuMTYgYml0IE1TLURPUyB2ZXJzaW9uIikpOworIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgTUFDT1MKKyMgaWZkZWYgTUFDT1NfWAorIyAgaWZkZWYgTUFDT1NfWF9VTklYCisgICAgTVNHX1BVVFMoXygiXG5NYWNPUyBYICh1bml4KSB2ZXJzaW9uIikpOworIyAgZWxzZQorICAgIE1TR19QVVRTKF8oIlxuTWFjT1MgWCB2ZXJzaW9uIikpOworIyAgZW5kaWYKKyNlbHNlCisgICAgTVNHX1BVVFMoXygiXG5NYWNPUyB2ZXJzaW9uIikpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBSSVNDT1MKKyAgICBNU0dfUFVUUyhfKCJcblJJU0MgT1MgdmVyc2lvbiIpKTsKKyNlbmRpZgorI2lmZGVmIFZNUworICAgIE1TR19QVVRTKCJcbk9wZW5WTVMgdmVyc2lvbiIpOworI2VuZGlmCisKKyAgICAvKiBQcmludCB0aGUgbGlzdCBvZiBwYXRjaCBudW1iZXJzIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZS4gKi8KKyAgICAvKiBQcmludCBhIHJhbmdlIHdoZW4gcGF0Y2hlcyBhcmUgY29uc2VjdXRpdmU6ICIxLTEwLCAxMiwgMTUtNDAsIDQyLTQ1IiAqLworICAgIGlmIChpbmNsdWRlZF9wYXRjaGVzWzBdICE9IDApCisgICAgeworCU1TR19QVVRTKF8oIlxuSW5jbHVkZWQgcGF0Y2hlczogIikpOworCWZpcnN0ID0gLTE7CisJLyogZmluZCBsYXN0IG9uZSAqLworCWZvciAoaSA9IDA7IGluY2x1ZGVkX3BhdGNoZXNbaV0gIT0gMDsgKytpKQorCSAgICA7CisJd2hpbGUgKC0taSA+PSAwKQorCXsKKwkgICAgaWYgKGZpcnN0IDwgMCkKKwkJZmlyc3QgPSBpbmNsdWRlZF9wYXRjaGVzW2ldOworCSAgICBpZiAoaSA9PSAwIHx8IGluY2x1ZGVkX3BhdGNoZXNbaSAtIDFdICE9IGluY2x1ZGVkX3BhdGNoZXNbaV0gKyAxKQorCSAgICB7CisJCU1TR19QVVRTKHMpOworCQlzID0gIiwgIjsKKwkJbXNnX291dG51bSgobG9uZylmaXJzdCk7CisJCWlmIChmaXJzdCAhPSBpbmNsdWRlZF9wYXRjaGVzW2ldKQorCQl7CisJCSAgICBNU0dfUFVUUygiLSIpOworCQkgICAgbXNnX291dG51bSgobG9uZylpbmNsdWRlZF9wYXRjaGVzW2ldKTsKKwkJfQorCQlmaXJzdCA9IC0xOworCSAgICB9CisJfQorICAgIH0KKworI2lmZGVmIE1PRElGSUVEX0JZCisgICAgTVNHX1BVVFMoIlxuIik7CisgICAgTVNHX1BVVFMoXygiTW9kaWZpZWQgYnkgIikpOworICAgIE1TR19QVVRTKE1PRElGSUVEX0JZKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QQVRIREVGCisgICAgaWYgKCpjb21waWxlZF91c2VyICE9IE5VTCB8fCAqY29tcGlsZWRfc3lzICE9IE5VTCkKKyAgICB7CisJTVNHX1BVVFMoXygiXG5Db21waWxlZCAiKSk7CisJaWYgKCpjb21waWxlZF91c2VyICE9IE5VTCkKKwl7CisJICAgIE1TR19QVVRTKF8oImJ5ICIpKTsKKwkgICAgTVNHX1BVVFMoY29tcGlsZWRfdXNlcik7CisJfQorCWlmICgqY29tcGlsZWRfc3lzICE9IE5VTCkKKwl7CisJICAgIE1TR19QVVRTKCJAIik7CisJICAgIE1TR19QVVRTKGNvbXBpbGVkX3N5cyk7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9IVUdFCisgICAgTVNHX1BVVFMoXygiXG5IdWdlIHZlcnNpb24gIikpOworI2Vsc2UKKyMgaWZkZWYgRkVBVF9CSUcKKyAgICBNU0dfUFVUUyhfKCJcbkJpZyB2ZXJzaW9uICIpKTsKKyMgZWxzZQorIyAgaWZkZWYgRkVBVF9OT1JNQUwKKyAgICBNU0dfUFVUUyhfKCJcbk5vcm1hbCB2ZXJzaW9uICIpKTsKKyMgIGVsc2UKKyMgICBpZmRlZiBGRUFUX1NNQUxMCisgICAgTVNHX1BVVFMoXygiXG5TbWFsbCB2ZXJzaW9uICIpKTsKKyMgICBlbHNlCisgICAgTVNHX1BVVFMoXygiXG5UaW55IHZlcnNpb24gIikpOworIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIEZFQVRfR1VJCisgICAgTVNHX1BVVFMoXygid2l0aG91dCBHVUkuIikpOworI2Vsc2UKKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisjICBpZmRlZiBGRUFUX0dVSV9HTk9NRQorIyAgIGlmZGVmIEhBVkVfR1RLMgorICAgIE1TR19QVVRTKF8oIndpdGggR1RLMi1HTk9NRSBHVUkuIikpOworIyAgIGVsc2UKKyAgICBNU0dfUFVUUyhfKCJ3aXRoIEdUSy1HTk9NRSBHVUkuIikpOworIyAgIGVuZGlmCisjICBlbHNlCisjICAgaWZkZWYgSEFWRV9HVEsyCisgICAgTVNHX1BVVFMoXygid2l0aCBHVEsyIEdVSS4iKSk7CisjICAgZWxzZQorICAgIE1TR19QVVRTKF8oIndpdGggR1RLIEdVSS4iKSk7CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGlmZGVmIEZFQVRfR1VJX01PVElGCisgICAgTVNHX1BVVFMoXygid2l0aCBYMTEtTW90aWYgR1VJLiIpKTsKKyMgIGVsc2UKKyMgICBpZmRlZiBGRUFUX0dVSV9BVEhFTkEKKyMgICAgaWZkZWYgRkVBVF9HVUlfTkVYVEFXCisgICAgTVNHX1BVVFMoXygid2l0aCBYMTEtbmVYdGF3IEdVSS4iKSk7CisjICAgIGVsc2UKKyAgICBNU0dfUFVUUyhfKCJ3aXRoIFgxMS1BdGhlbmEgR1VJLiIpKTsKKyMgICAgZW5kaWYKKyMgICBlbHNlCisjICAgIGlmZGVmIEZFQVRfR1VJX0JFT1MKKyAgICBNU0dfUFVUUyhfKCJ3aXRoIEJlT1MgR1VJLiIpKTsKKyMgICAgZWxzZQorIyAgICAgaWZkZWYgRkVBVF9HVUlfUEhPVE9OCisgICAgTVNHX1BVVFMoXygid2l0aCBQaG90b24gR1VJLiIpKTsKKyMgICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkKE1TV0lOKQorICAgIE1TR19QVVRTKF8oIndpdGggR1VJLiIpKTsKKyMgICAgICBlbHNlCisjCWlmIGRlZmluZWQgKFRBUkdFVF9BUElfTUFDX0NBUkJPTikgJiYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCisgICAgTVNHX1BVVFMoXygid2l0aCBDYXJib24gR1VJLiIpKTsKKyMJZWxzZQorIwkgaWYgZGVmaW5lZCAoVEFSR0VUX0FQSV9NQUNfT1NYKSAmJiBUQVJHRVRfQVBJX01BQ19PU1gKKyAgICBNU0dfUFVUUyhfKCJ3aXRoIENvY29hIEdVSS4iKSk7CisjCSBlbHNlCisjCSAgaWYgZGVmaW5lZCAoTUFDT1MpCisgICAgTVNHX1BVVFMoXygid2l0aCAoY2xhc3NpYykgR1VJLiIpKTsKKyMJICBlbmRpZgorIwkgZW5kaWYKKyMJZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorICAgIHZlcnNpb25fbXNnKF8oIiAgRmVhdHVyZXMgaW5jbHVkZWQgKCspIG9yIG5vdCAoLSk6XG4iKSk7CisKKyAgICAvKiBwcmludCBhbGwgdGhlIGZlYXR1cmVzICovCisgICAgZm9yIChpID0gMDsgZmVhdHVyZXNbaV0gIT0gTlVMTDsgKytpKQorICAgIHsKKwl2ZXJzaW9uX21zZyhmZWF0dXJlc1tpXSk7CisJaWYgKG1zZ19jb2wgPiAwKQorCSAgICB2ZXJzaW9uX21zZygiICIpOworICAgIH0KKworICAgIHZlcnNpb25fbXNnKCJcbiIpOworI2lmZGVmIFNZU19WSU1SQ19GSUxFCisgICAgdmVyc2lvbl9tc2coXygiICAgc3lzdGVtIHZpbXJjIGZpbGU6IFwiIikpOworICAgIHZlcnNpb25fbXNnKFNZU19WSU1SQ19GSUxFKTsKKyAgICB2ZXJzaW9uX21zZygiXCJcbiIpOworI2VuZGlmCisjaWZkZWYgVVNSX1ZJTVJDX0ZJTEUKKyAgICB2ZXJzaW9uX21zZyhfKCIgICAgIHVzZXIgdmltcmMgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coVVNSX1ZJTVJDX0ZJTEUpOworICAgIHZlcnNpb25fbXNnKCJcIlxuIik7CisjZW5kaWYKKyNpZmRlZiBVU1JfVklNUkNfRklMRTIKKyAgICB2ZXJzaW9uX21zZyhfKCIgMm5kIHVzZXIgdmltcmMgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coVVNSX1ZJTVJDX0ZJTEUyKTsKKyAgICB2ZXJzaW9uX21zZygiXCJcbiIpOworI2VuZGlmCisjaWZkZWYgVVNSX1ZJTVJDX0ZJTEUzCisgICAgdmVyc2lvbl9tc2coXygiIDNyZCB1c2VyIHZpbXJjIGZpbGU6IFwiIikpOworICAgIHZlcnNpb25fbXNnKFVTUl9WSU1SQ19GSUxFMyk7CisgICAgdmVyc2lvbl9tc2coIlwiXG4iKTsKKyNlbmRpZgorI2lmZGVmIFVTUl9FWFJDX0ZJTEUKKyAgICB2ZXJzaW9uX21zZyhfKCIgICAgICB1c2VyIGV4cmMgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coVVNSX0VYUkNfRklMRSk7CisgICAgdmVyc2lvbl9tc2coIlwiXG4iKTsKKyNlbmRpZgorI2lmZGVmIFVTUl9FWFJDX0ZJTEUyCisgICAgdmVyc2lvbl9tc2coXygiICAybmQgdXNlciBleHJjIGZpbGU6IFwiIikpOworICAgIHZlcnNpb25fbXNnKFVTUl9FWFJDX0ZJTEUyKTsKKyAgICB2ZXJzaW9uX21zZygiXCJcbiIpOworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUkKKyMgaWZkZWYgU1lTX0dWSU1SQ19GSUxFCisgICAgdmVyc2lvbl9tc2coXygiICBzeXN0ZW0gZ3ZpbXJjIGZpbGU6IFwiIikpOworICAgIHZlcnNpb25fbXNnKFNZU19HVklNUkNfRklMRSk7CisgICAgdmVyc2lvbl9tc2coIlwiXG4iKTsKKyMgZW5kaWYKKyAgICB2ZXJzaW9uX21zZyhfKCIgICAgdXNlciBndmltcmMgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coVVNSX0dWSU1SQ19GSUxFKTsKKyAgICB2ZXJzaW9uX21zZygiXCJcbiIpOworIyBpZmRlZiBVU1JfR1ZJTVJDX0ZJTEUyCisgICAgdmVyc2lvbl9tc2coXygiMm5kIHVzZXIgZ3ZpbXJjIGZpbGU6IFwiIikpOworICAgIHZlcnNpb25fbXNnKFVTUl9HVklNUkNfRklMRTIpOworICAgIHZlcnNpb25fbXNnKCJcIlxuIik7CisjIGVuZGlmCisjIGlmZGVmIFVTUl9HVklNUkNfRklMRTMKKyAgICB2ZXJzaW9uX21zZyhfKCIzcmQgdXNlciBndmltcmMgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coVVNSX0dWSU1SQ19GSUxFMyk7CisgICAgdmVyc2lvbl9tc2coIlwiXG4iKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisjIGlmZGVmIFNZU19NRU5VX0ZJTEUKKyAgICB2ZXJzaW9uX21zZyhfKCIgICAgc3lzdGVtIG1lbnUgZmlsZTogXCIiKSk7CisgICAgdmVyc2lvbl9tc2coU1lTX01FTlVfRklMRSk7CisgICAgdmVyc2lvbl9tc2coIlwiXG4iKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfUEFUSERFRgorICAgIGlmICgqZGVmYXVsdF92aW1fZGlyICE9IE5VTCkKKyAgICB7CisJdmVyc2lvbl9tc2coXygiICBmYWxsLWJhY2sgZm9yICRWSU06IFwiIikpOworCXZlcnNpb25fbXNnKChjaGFyICopZGVmYXVsdF92aW1fZGlyKTsKKwl2ZXJzaW9uX21zZygiXCJcbiIpOworICAgIH0KKyAgICBpZiAoKmRlZmF1bHRfdmltcnVudGltZV9kaXIgIT0gTlVMKQorICAgIHsKKwl2ZXJzaW9uX21zZyhfKCIgZi1iIGZvciAkVklNUlVOVElNRTogXCIiKSk7CisJdmVyc2lvbl9tc2coKGNoYXIgKilkZWZhdWx0X3ZpbXJ1bnRpbWVfZGlyKTsKKwl2ZXJzaW9uX21zZygiXCJcbiIpOworICAgIH0KKyAgICB2ZXJzaW9uX21zZyhfKCJDb21waWxhdGlvbjogIikpOworICAgIHZlcnNpb25fbXNnKChjaGFyICopYWxsX2NmbGFncyk7CisgICAgdmVyc2lvbl9tc2coIlxuIik7CisjaWZkZWYgVk1TCisgICAgaWYgKCpjb21waWxlcl92ZXJzaW9uICE9IE5VTCkKKyAgICB7CisJdmVyc2lvbl9tc2coXygiQ29tcGlsZXI6ICIpKTsKKwl2ZXJzaW9uX21zZygoY2hhciAqKWNvbXBpbGVyX3ZlcnNpb24pOworCXZlcnNpb25fbXNnKCJcbiIpOworICAgIH0KKyNlbmRpZgorICAgIHZlcnNpb25fbXNnKF8oIkxpbmtpbmc6ICIpKTsKKyAgICB2ZXJzaW9uX21zZygoY2hhciAqKWFsbF9sZmxhZ3MpOworI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICB2ZXJzaW9uX21zZygiXG4iKTsKKyAgICB2ZXJzaW9uX21zZyhfKCIgIERFQlVHIEJVSUxEIikpOworI2VuZGlmCit9CisKKy8qCisgKiBPdXRwdXQgYSBzdHJpbmcgZm9yIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuICBJZiBpdCdzIGdvaW5nIHRvIHdyYXAsIG91dHB1dCBhCisgKiBuZXdsaW5lLCB1bmxlc3MgdGhlIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gZml0IG9uIHRoZSBzY3JlZW4gYW55d2F5LgorICovCisgICAgc3RhdGljIHZvaWQKK3ZlcnNpb25fbXNnKHMpCisgICAgY2hhcgkqczsKK3sKKyAgICBpbnQJCWxlbiA9IChpbnQpU1RSTEVOKHMpOworCisgICAgaWYgKCFnb3RfaW50ICYmIGxlbiA8IChpbnQpQ29sdW1ucyAmJiBtc2dfY29sICsgbGVuID49IChpbnQpQ29sdW1ucworCQkJCQkJCQkmJiAqcyAhPSAnXG4nKQorCW1zZ19wdXRjaGFyKCdcbicpOworICAgIGlmICghZ290X2ludCkKKwlNU0dfUFVUUyhzKTsKK30KKworc3RhdGljIHZvaWQgZG9faW50cm9fbGluZSBfX0FSR1MoKGludCByb3csIGNoYXJfdSAqbWVzZywgaW50IGFkZF92ZXJzaW9uLCBpbnQgYXR0cikpOworCisvKgorICogR2l2ZSBhbiBpbnRyb2R1Y3RvcnkgbWVzc2FnZSBhYm91dCBWaW0uCisgKiBPbmx5IHVzZWQgd2hlbiBzdGFydGluZyBWaW0gb24gYW4gZW1wdHkgZmlsZSwgd2l0aG91dCBhIGZpbGUgbmFtZS4KKyAqIE9yIHdpdGggdGhlICI6aW50cm8iIGNvbW1hbmQgKGZvciBTdmVuIDotKS4KKyAqLworICAgIHZvaWQKK2ludHJvX21lc3NhZ2UoY29sb24pCisgICAgaW50CQljb2xvbjsJCS8qIFRSVUUgZm9yICI6aW50cm8iICovCit7CisgICAgaW50CQlpOworICAgIGludAkJcm93OworICAgIGludAkJYmxhbmtsaW5lczsKKyAgICBpbnQJCXNwb25zb3I7CisgICAgY2hhcgkqcDsKKyAgICBzdGF0aWMgY2hhcgkqKGxpbmVzW10pID0KKyAgICB7CisJTl8oIlZJTSAtIFZpIElNcHJvdmVkIiksCisJIiIsCisJTl8oInZlcnNpb24gIiksCisJTl8oImJ5IEJyYW0gTW9vbGVuYWFyIGV0IGFsLiIpLAorI2lmZGVmIE1PRElGSUVEX0JZCisJIiAiLAorI2VuZGlmCisJTl8oIlZpbSBpcyBvcGVuIHNvdXJjZSBhbmQgZnJlZWx5IGRpc3RyaWJ1dGFibGUiKSwKKwkiIiwKKwlOXygiSGVscCBwb29yIGNoaWxkcmVuIGluIFVnYW5kYSEiKSwKKwlOXygidHlwZSAgOmhlbHAgaWNjZjxFbnRlcj4gICAgICAgZm9yIGluZm9ybWF0aW9uICIpLAorCSIiLAorCU5fKCJ0eXBlICA6cTxFbnRlcj4gICAgICAgICAgICAgICB0byBleGl0ICAgICAgICAgIiksCisJTl8oInR5cGUgIDpoZWxwPEVudGVyPiAgb3IgIDxGMT4gIGZvciBvbi1saW5lIGhlbHAiKSwKKwlOXygidHlwZSAgOmhlbHAgdmVyc2lvbjY8RW50ZXI+ICAgZm9yIHZlcnNpb24gaW5mbyIpLAorCU5VTEwsCisJIiIsCisJTl8oIlJ1bm5pbmcgaW4gVmkgY29tcGF0aWJsZSBtb2RlIiksCisJTl8oInR5cGUgIDpzZXQgbm9jcDxFbnRlcj4gICAgICAgIGZvciBWaW0gZGVmYXVsdHMiKSwKKwlOXygidHlwZSAgOmhlbHAgY3AtZGVmYXVsdDxFbnRlcj4gZm9yIGluZm8gb24gdGhpcyIpLAorICAgIH07CisjaWZkZWYgRkVBVF9HVUkKKyAgICBzdGF0aWMgY2hhcgkqKGd1aV9saW5lc1tdKSA9CisgICAgeworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisjaWZkZWYgTU9ESUZJRURfQlkKKwlOVUxMLAorI2VuZGlmCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTl8oIm1lbnUgIEhlbHAtPk9ycGhhbnMgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiAgICAiKSwKKwlOVUxMLAorCU5fKCJSdW5uaW5nIG1vZGVsZXNzLCB0eXBlZCB0ZXh0IGlzIGluc2VydGVkIiksCisJTl8oIm1lbnUgIEVkaXQtPkdsb2JhbCBTZXR0aW5ncy0+VG9nZ2xlIEluc2VydCBNb2RlICAiKSwKKwlOXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR3byBtb2RlcyAgICAgICIpLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5fKCJtZW51ICBFZGl0LT5HbG9iYWwgU2V0dGluZ3MtPlRvZ2dsZSBWaSBDb21wYXRpYmxlIiksCisJTl8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWaW0gZGVmYXVsdHMgICAiKSwKKyAgICB9OworI2VuZGlmCisKKyAgICAvKiBibGFua2xpbmVzID0gc2NyZWVuIGhlaWdodCAtICMgbWVzc2FnZSBsaW5lcyAqLworICAgIGJsYW5rbGluZXMgPSAoaW50KVJvd3MgLSAoKHNpemVvZihsaW5lcykgLyBzaXplb2YoY2hhciAqKSkgLSAxKTsKKyAgICBpZiAoIXBfY3ApCisJYmxhbmtsaW5lcyArPSA0OyAgLyogYWRkIDQgZm9yIG5vdCBzaG93aW5nICJWaSBjb21wYXRpYmxlIiBtZXNzYWdlICovCisjaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCisgICAgaWYgKG1jaF93aW5kb3dzOTUoKSkKKwlibGFua2xpbmVzIC09IDM7ICAvKiBzdWJ0cmFjdCAzIGZvciBzaG93aW5nICJXaW5kb3dzIDk1IiBtZXNzYWdlICovCisjZW5kaWYKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIC8qIERvbid0IG92ZXJ3cml0ZSBhIHN0YXR1c2xpbmUuICBEZXBlbmRzIG9uICdjbWRoZWlnaHQnLiAqLworICAgIGlmIChwX2xzID4gMSkKKwlibGFua2xpbmVzIC09IFJvd3MgLSB0b3BmcmFtZS0+ZnJfaGVpZ2h0OworI2VuZGlmCisgICAgaWYgKGJsYW5rbGluZXMgPCAwKQorCWJsYW5rbGluZXMgPSAwOworCisgICAgLyogU2hvdyB0aGUgc3BvbnNvciBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBvbmUgb3V0IG9mIGZvdXIgdGltZXMsIHRoZSBVZ2FuZGEKKyAgICAgKiBtZXNzYWdlIHR3byBvdXQgb2YgZm91ciB0aW1lcy4gKi8KKyAgICBzcG9uc29yID0gdGltZShOVUxMKTsKKyAgICBzcG9uc29yID0gKChzcG9uc29yICYgMikgPT0gMCkgLSAoKHNwb25zb3IgJiA0KSA9PSAwKTsKKworICAgIC8qIHN0YXJ0IGRpc3BsYXlpbmcgdGhlIG1lc3NhZ2UgbGluZXMgYWZ0ZXIgaGFsZiBvZiB0aGUgYmxhbmsgbGluZXMgKi8KKyAgICByb3cgPSBibGFua2xpbmVzIC8gMjsKKyAgICBpZiAoKHJvdyA+PSAyICYmIENvbHVtbnMgPj0gNTApIHx8IGNvbG9uKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGxpbmVzKSAvIHNpemVvZihjaGFyICopKTsgKytpKQorCXsKKwkgICAgcCA9IGxpbmVzW2ldOworI2lmZGVmIEZFQVRfR1VJCisJICAgIGlmIChwX2ltICYmIGd1aS5pbl91c2UgJiYgZ3VpX2xpbmVzW2ldICE9IE5VTEwpCisJCXAgPSBndWlfbGluZXNbaV07CisjZW5kaWYKKwkgICAgaWYgKHAgPT0gTlVMTCkKKwkgICAgeworCQlpZiAoIXBfY3ApCisJCSAgICBicmVhazsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHNwb25zb3IgIT0gMCkKKwkgICAgeworCQlpZiAoc3Ryc3RyKHAsICJjaGlsZHJlbiIpICE9IE5VTEwpCisJCSAgICBwID0gc3BvbnNvciA8IDAKKwkJCT8gTl8oIlNwb25zb3IgVmltIGRldmVsb3BtZW50ISIpCisJCQk6IE5fKCJCZWNvbWUgYSByZWdpc3RlcmVkIFZpbSB1c2VyISIpOworCQllbHNlIGlmIChzdHJzdHIocCwgImljY2YiKSAhPSBOVUxMKQorCQkgICAgcCA9IHNwb25zb3IgPCAwCisJCQk/IE5fKCJ0eXBlICA6aGVscCBzcG9uc29yPEVudGVyPiAgICBmb3IgaW5mb3JtYXRpb24gIikKKwkJCTogTl8oInR5cGUgIDpoZWxwIHJlZ2lzdGVyPEVudGVyPiAgIGZvciBpbmZvcm1hdGlvbiAiKTsKKwkJZWxzZSBpZiAoc3Ryc3RyKHAsICJPcnBoYW5zIikgIT0gTlVMTCkKKwkJICAgIHAgPSBOXygibWVudSAgSGVscC0+U3BvbnNvci9SZWdpc3RlciAgZm9yIGluZm9ybWF0aW9uICAgICIpOworCSAgICB9CisJICAgIGlmICgqcCAhPSBOVUwpCisJCWRvX2ludHJvX2xpbmUocm93LCAoY2hhcl91ICopXyhwKSwgaSA9PSAyLCAwKTsKKwkgICAgKytyb3c7CisJfQorI2lmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQorCWlmIChtY2hfd2luZG93czk1KCkpCisJeworCSAgICBkb19pbnRyb19saW5lKCsrcm93LAorCQkgICAgKGNoYXJfdSAqKV8oIldBUk5JTkc6IFdpbmRvd3MgOTUvOTgvTUUgZGV0ZWN0ZWQiKSwKKwkJCQkJCQlGQUxTRSwgaGxfYXR0cihITEZfRSkpOworCSAgICBkb19pbnRyb19saW5lKCsrcm93LAorCQkoY2hhcl91ICopXygidHlwZSAgOmhlbHAgd2luZG93czk1PEVudGVyPiAgZm9yIGluZm8gb24gdGhpcyIpLAorCQkJCQkJCQkgICAgRkFMU0UsIDApOworCX0KKyNlbmRpZgorICAgIH0KKworICAgIC8qIE1ha2UgdGhlIHdhaXQtcmV0dXJuIG1lc3NhZ2UgYXBwZWFyIGp1c3QgYmVsb3cgdGhlIHRleHQuICovCisgICAgaWYgKGNvbG9uKQorCW1zZ19yb3cgPSByb3c7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorZG9faW50cm9fbGluZShyb3csIG1lc2csIGFkZF92ZXJzaW9uLCBhdHRyKQorICAgIGludAkJcm93OworICAgIGNoYXJfdQkqbWVzZzsKKyAgICBpbnQJCWFkZF92ZXJzaW9uOworICAgIGludAkJYXR0cjsKK3sKKyAgICBjaGFyX3UJdmVyc1syMF07CisgICAgaW50CQljb2w7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbDsKKyAgICBpbnQJCWNsZW47CisjaWZkZWYgTU9ESUZJRURfQlkKKyMgZGVmaW5lIE1PREJZX0xFTiAxNTAKKyAgICBjaGFyX3UJbW9kYnlbTU9EQllfTEVOXTsKKworICAgIGlmICgqbWVzZyA9PSAnICcpCisgICAgeworCVNUUk5DUFkobW9kYnksIF8oIk1vZGlmaWVkIGJ5ICIpLCBNT0RCWV9MRU4pOworCW1vZGJ5W01PREJZX0xFTiAtIDFdID0gTlVMOworCWwgPSBTVFJMRU4obW9kYnkpOworCVNUUk5DUFkobW9kYnkgKyBsLCBNT0RJRklFRF9CWSwgTU9EQllfTEVOIC0gbCk7CisJbW9kYnlbTU9EQllfTEVOIC0gMV0gPSBOVUw7CisJbWVzZyA9IG1vZGJ5OworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ2VudGVyIHRoZSBtZXNzYWdlIGhvcml6b250YWxseS4gKi8KKyAgICBjb2wgPSB2aW1fc3Ryc2l6ZShtZXNnKTsKKyAgICBpZiAoYWRkX3ZlcnNpb24pCisgICAgeworCVNUUkNQWSh2ZXJzLCBtZWRpdW1WZXJzaW9uKTsKKwlpZiAoaGlnaGVzdF9wYXRjaCgpKQorCXsKKwkgICAgLyogQ2hlY2sgZm9yIDkuOXggb3IgOS45eHgsIGFscGhhL2JldGEgdmVyc2lvbiAqLworCSAgICBpZiAoaXNhbHBoYSgoaW50KW1lZGl1bVZlcnNpb25bM10pKQorCSAgICB7CisJCWlmIChpc2FscGhhKChpbnQpbWVkaXVtVmVyc2lvbls0XSkpCisJCSAgICBzcHJpbnRmKChjaGFyICopdmVycyArIDUsICIuJWQlcyIsIGhpZ2hlc3RfcGF0Y2goKSwKKwkJCQkJCQkgICBtZWRpdW1WZXJzaW9uICsgNSk7CisJCWVsc2UKKwkJICAgIHNwcmludGYoKGNoYXIgKil2ZXJzICsgNCwgIi4lZCVzIiwgaGlnaGVzdF9wYXRjaCgpLAorCQkJCQkJCSAgIG1lZGl1bVZlcnNpb24gKyA0KTsKKwkgICAgfQorCSAgICBlbHNlCisJCXNwcmludGYoKGNoYXIgKil2ZXJzICsgMywgIi4lZCIsIGhpZ2hlc3RfcGF0Y2goKSk7CisJfQorCWNvbCArPSAoaW50KVNUUkxFTih2ZXJzKTsKKyAgICB9CisgICAgY29sID0gKENvbHVtbnMgLSBjb2wpIC8gMjsKKyAgICBpZiAoY29sIDwgMCkKKwljb2wgPSAwOworCisgICAgLyogU3BsaXQgdXAgaW4gcGFydHMgdG8gaGlnaGxpZ2h0IDw+IGl0ZW1zIGRpZmZlcmVudGx5LiAqLworICAgIGZvciAocCA9IG1lc2c7ICpwICE9IE5VTDsgcCArPSBsKQorICAgIHsKKwljbGVuID0gMDsKKwlmb3IgKGwgPSAwOyBwW2xdICE9IE5VTAorCQkJICYmIChsID09IDAgfHwgKHBbbF0gIT0gJzwnICYmIHBbbCAtIDFdICE9ICc+JykpOyArK2wpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQljbGVuICs9IHB0cjJjZWxscyhwICsgbCk7CisJCWwgKz0gKCptYl9wdHIybGVuX2NoZWNrKShwICsgbCkgLSAxOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCQljbGVuICs9IGJ5dGUyY2VsbHMocFtsXSk7CisJfQorCXNjcmVlbl9wdXRzX2xlbihwLCBsLCByb3csIGNvbCwgKnAgPT0gJzwnID8gaGxfYXR0cihITEZfOCkgOiBhdHRyKTsKKwljb2wgKz0gY2xlbjsKKyAgICB9CisKKyAgICAvKiBBZGQgdGhlIHZlcnNpb24gbnVtYmVyIHRvIHRoZSB2ZXJzaW9uIGxpbmUuICovCisgICAgaWYgKGFkZF92ZXJzaW9uKQorCXNjcmVlbl9wdXRzKHZlcnMsIHJvdywgY29sLCAwKTsKK30KKworLyoKKyAqICI6aW50cm8iOiBjbGVhciBzY3JlZW4sIGRpc3BsYXkgaW50cm8gc2NyZWVuIGFuZCB3YWl0IGZvciByZXR1cm4uCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK2V4X2ludHJvKGVhcCkKKyAgICBleGFyZ19UCSplYXA7Cit7CisgICAgc2NyZWVuY2xlYXIoKTsKKyAgICBpbnRyb19tZXNzYWdlKFRSVUUpOworICAgIHdhaXRfcmV0dXJuKFRSVUUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uaCBiL3NyYy92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5OGQyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92ZXJzaW9uLmgKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAkJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisKKy8qCisgKiBEZWZpbmUgdGhlIHZlcnNpb24gbnVtYmVyLCBuYW1lLCBldGMuCisgKiBUaGUgcGF0Y2hsZXZlbCBpcyBpbiBpbmNsdWRlZF9wYXRjaGVzW10sIGluIHZlcnNpb24uYy4KKyAqCisgKiBUaGlzIGRvZXNuJ3QgdXNlIHN0cmluZyBjb250YXRlbmF0aW9uLCBzb21lIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IGl0LgorICovCisKKyNkZWZpbmUgVklNX1ZFUlNJT05fTUFKT1IJCSA3CisjZGVmaW5lIFZJTV9WRVJTSU9OX01BSk9SX1NUUgkJIjciCisjZGVmaW5lIFZJTV9WRVJTSU9OX01JTk9SCQkgMAorI2RlZmluZSBWSU1fVkVSU0lPTl9NSU5PUl9TVFIJCSIwIgorI2RlZmluZSBWSU1fVkVSU0lPTl8xMDAJICAgIChWSU1fVkVSU0lPTl9NQUpPUiAqIDEwMCArIFZJTV9WRVJTSU9OX01JTk9SKQorCisjZGVmaW5lIFZJTV9WRVJTSU9OX0JVSUxECQkgMjU2CisjZGVmaW5lIFZJTV9WRVJTSU9OX0JVSUxEX0JDRAkJMHgxMDAKKyNkZWZpbmUgVklNX1ZFUlNJT05fQlVJTERfU1RSCQkiMjU2IgorI2RlZmluZSBWSU1fVkVSU0lPTl9QQVRDSExFVkVMCQkgMAorI2RlZmluZSBWSU1fVkVSU0lPTl9QQVRDSExFVkVMX1NUUgkiMCIKKy8qIFVzZWQgYnkgTWFjT1MgcG9ydCBzaG91bGQgYmUgb25lIG9mOiBkZXZlbG9wbWVudCwgYWxwaGEsIGJldGEsIGZpbmFsICovCisjZGVmaW5lIFZJTV9WRVJTSU9OX1JFTEVBU0UJCWFscGhhCisKKy8qCisgKiBWSU1fVkVSU0lPTl9OT0RPVCBpcyB1c2VkIGZvciB0aGUgcnVudGltZSBkaXJlY3RvcnkgbmFtZS4KKyAqIFZJTV9WRVJTSU9OX1NIT1JUIGlzIGNvcGllZCBpbnRvIHRoZSBzd2FwIGZpbGUgKG1heC4gbGVuZ3RoIGlzIDYgY2hhcnMpLgorICogVklNX1ZFUlNJT05fTUVESVVNIGlzIHVzZWQgZm9yIHRoZSBzdGFydHVwLXNjcmVlbi4KKyAqIFZJTV9WRVJTSU9OX0xPTkcgaXMgdXNlZCBmb3IgdGhlICI6dmVyc2lvbiIgY29tbWFuZCBhbmQgIlZpbSAtaCIuCisgKi8KKyNkZWZpbmUgVklNX1ZFUlNJT05fTk9ET1QJInZpbTcwYWEiCisjZGVmaW5lIFZJTV9WRVJTSU9OX1NIT1JUCSI3LjBhYSIKKyNkZWZpbmUgVklNX1ZFUlNJT05fTUVESVVNCSI3LjBhYSBBTFBIQSIKKyNkZWZpbmUgVklNX1ZFUlNJT05fTE9ORwkiVklNIC0gVmkgSU1wcm92ZWQgNy4wYWEgQUxQSEEgKDIwMDQgSnVuZSA3KSIKKyNkZWZpbmUgVklNX1ZFUlNJT05fTE9OR19EQVRFCSJWSU0gLSBWaSBJTXByb3ZlZCA3LjBhYSBBTFBIQSAoMjAwNCBKdW5lIDcsIGNvbXBpbGVkICIKZGlmZiAtLWdpdCBhL3NyYy92aW0uZGVmIGIvc3JjL3ZpbS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjMDljNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92aW0uZGVmCkBAIC0wLDAgKzEsNCBAQAorQ09ERSBQUkVMT0FEIEVYRUNVVEVPTkxZCitEQVRBIE1VTFRJUExFIFNIQVJFRAorREVTQ1JJUFRJT04gJ1ZpbSA2LjAnCitIRUFQU0laRSAwLDAKZGlmZiAtLWdpdCBhL3NyYy92aW0uaCBiL3NyYy92aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVhYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbS5oCkBAIC0wLDAgKzEsMTc4OCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworI2lmbmRlZiBWSU1fX0gKKyMgZGVmaW5lIFZJTV9fSAorCisvKiB1c2UgZmFzdGNhbGwgZm9yIEJvcmxhbmQsIHdoZW4gY29tcGlsaW5nIGZvciBXaW4zMiAobm90IGZvciBET1MxNikgKi8KKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoREVCVUcpCisjaWYgZGVmaW5lZChGRUFUX1BFUkwpIHx8IFwKKyAgICBkZWZpbmVkKEZFQVRfUFlUSE9OKSB8fCBcCisgICAgZGVmaW5lZChGRUFUX1JVQlkpIHx8IFwKKyAgICBkZWZpbmVkKEZFQVRfVENMKSB8fCBcCisgICAgZGVmaW5lZChEWU5BTUlDX0dFVFRFWFQpIHx8IFwKKyAgICBkZWZpbmVkKERZTkFNSUNfSUNPTlYpIHx8IFwKKyAgICBkZWZpbmVkKERZTkFNSUNfSU1FKSB8fCBcCisgICAgZGVmaW5lZChYUE0pCisjICBwcmFnbWEgb3B0aW9uIC1wYworIyBlbHNlCisjICBwcmFnbWEgb3B0aW9uIC1wcgorIyBlbmRpZgorI2VuZGlmCisKKy8qID09PT09PT09PT09PSB0aGUgaGVhZGVyIGZpbGUgcHV6emxlIChjYS4gNTAtMTAwIHBpZWNlcykgPT09PT09PT09ICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICS8qIEdOVSBhdXRvY29uZiAob3Igc29tZXRoaW5nIGVsc2UpIHdhcyBoZXJlICovCisjIGluY2x1ZGUgImF1dG8vY29uZmlnLmgiCisjIGRlZmluZSBIQVZFX1BBVEhERUYKKworLyoKKyAqIENoZWNrIGlmIGNvbmZpZ3VyZSBjb3JyZWNseSBtYW5hZ2VkIHRvIGZpbmQgc2l6ZW9mKGludCkuICBJZiB0aGlzIGZhaWxlZCwKKyAqIGl0IGJlY29tZXMgemVyby4gIFRoaXMgaXMgbGlrZWx5IGEgcHJvYmxlbSBvZiBub3QgYmVpbmcgYWJsZSB0byBydW4gdGhlCisgKiB0ZXN0IHByb2dyYW0uICBPdGhlciBpdGVtcyBmcm9tIGNvbmZpZ3VyZSBtYXkgYWxzbyBiZSB3cm9uZyB0aGVuIQorICovCisjIGlmIChTSVpFT0ZfSU5UID09IDApCisgICAgRXJyb3I6IGNvbmZpZ3VyZSBkaWQgbm90IHJ1biBwcm9wZXJseS4gIENoZWNrIGF1dG8vY29uZmlnLmxvZy4KKyMgZW5kaWYKKworLyoKKyAqIEN5Z3dpbiBtYXkgaGF2ZSBmY2hkaXIoKSBpbiBhIG5ld2VyIHJsZWVhc2UsIGJ1dCBpbiBtb3N0IHZlcnNpb25zIGl0CisgKiBkb2Vzbid0IHdvcmsgd2VsbCBhbmQgYXZvaWRpbmcgaXQga2VlcHMgdGhlIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmxlLgorICovCisjIGlmIGRlZmluZWQoX19DWUdXSU4zMl9fKSAmJiBkZWZpbmVkKEhBVkVfRkNIRElSKQorIyAgdW5kZWYgSEFWRV9GQ0hESVIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19FTVhfXwkJLyogaGFuZC1lZGl0ZWQgY29uZmlnLmggZm9yIE9TLzIgd2l0aCBFTVggKi8KKyMgaW5jbHVkZSAib3Nfb3MyX2NmZy5oIgorI2VuZGlmCisKKy8qCisgKiBNQUNPU19DTEFTU0lDIGNvbXBpbGluZyBmb3IgTWFjT1MgcHJpb3IgdG8gTWFjT1MgWAorICogTUFDT1NfWF9VTklYICBjb21waWxpbmcgZm9yIE1hY09TIFggKHVzaW5nIG9zX3VuaXguYykKKyAqIE1BQ09TX1ggICAgICAgY29tcGlsaW5nIGZvciBNYWNPUyBYICh1c2luZyBvc191bml4LmMgb3Igb3NfbWFjLmMpCisgKiBNQUNPUwkgY29tcGlsaW5nIGZvciBlaXRoZXIgb25lCisgKi8KKyNpZiBkZWZpbmVkKG1hY2ludG9zaCkgJiYgIWRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyMgIGRlZmluZSBNQUNPU19DTEFTU0lDCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyMgZGVmaW5lIE1BQ09TX1gKKyMgaWZuZGVmIEhBVkVfQ09ORklHX0gKKyMgIGRlZmluZSBVTklYCisjIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1BQ09TX1gpIHx8IGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyMgIGRlZmluZSBNQUNPUworI2VuZGlmCisjaWYgZGVmaW5lZChNQUNPU19YKSAmJiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCisgICAgRXJyb3I6IFRvIGNvbXBpbGUgZm9yIGJvdGggTUFDT1MgWCBhbmQgQ2xhc3NpYyB1c2UgYSBDbGFzc2ljIENhcmJvbgorI2VuZGlmCisvKiBVbmxlc3MgbWFkZSB0aHJvdWdoIHRoZSBNYWtlZmlsZSBlbmZvcmNlIEdVSSBvbiBNYWMgKi8KKyNpZiBkZWZpbmVkKE1BQ09TKSAmJiAhZGVmaW5lZChIQVZFX0NPTkZJR19IKQorIyBkZWZpbmUgRkVBVF9HVUlfTUFDCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgXAorICAgIHx8IGRlZmluZWQoRkVBVF9HVUlfR1RLKSBcCisgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9BVEhFTkEpIFwKKyAgICB8fCBkZWZpbmVkKEZFQVRfR1VJX01BQykgXAorICAgIHx8IGRlZmluZWQoRkVBVF9HVUlfVzMyKSBcCisgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9XMTYpIFwKKyAgICB8fCBkZWZpbmVkKEZFQVRfR1VJX0JFT1MpIFwKKyAgICB8fCBkZWZpbmVkKEZFQVRfR1VJX0FNSUdBKSBcCisgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9QSE9UT04pCisjIGlmbmRlZiBGRUFUX0dVSQorIyAgZGVmaW5lIEZFQVRfR1VJCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUlfVzMyKSB8fCBkZWZpbmVkKEZFQVRfR1VJX1cxNikKKyMgZGVmaW5lIEZFQVRfR1VJX01TV0lOCisjZW5kaWYKKyNpZiBkZWZpbmVkKFdJTjE2KSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyMgZGVmaW5lIE1TV0lOCisjZW5kaWYKKy8qIFByYWN0aWNhbGx5IGV2ZXJ5dGhpbmcgaXMgY29tbW9uIHRvIGJvdGggV2luMzIgYW5kIFdpbjY0ICovCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisjIGRlZmluZSBXSU4zMjY0CisjZW5kaWYKKworLyoKKyAqIFNJWkVPRl9JTlQgaXMgdXNlZCBpbiBmZWF0dXJlLmgsIGFuZCB0aGUgc3lzdGVtLXNwZWNpZmljIGluY2x1ZGVkIGZpbGVzCisgKiBuZWVkIGl0ZW1zIGZyb20gZmVhdHVyZS5oLiAgVGhlcmVmb3JlIGRlZmluZSBTSVpFT0ZfSU5UIGhlcmUuCisgKi8KKyNpZmRlZiBXSU4zMjY0CisjIGRlZmluZSBTSVpFT0ZfSU5UIDQKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjIGlmZGVmIERKR1BQCisjICBpZm5kZWYgRkVBVF9HVUlfR1RLCQkvKiBhdm9pZCBwcm9ibGVtcyB3aGVuIGdlbmVyYXRpbmcgcHJvdG90eXBlcyAqLworIyAgIGRlZmluZSBTSVpFT0ZfSU5UIDQJCS8qIDMyIGJpdCBpbnRzICovCisjICBlbmRpZgorIyAgZGVmaW5lIERPUzMyCisjICBkZWZpbmUgRkVBVF9DTElQQk9BUkQKKyMgZWxzZQorIyAgaWZuZGVmIEZFQVRfR1VJX0dUSwkJLyogYXZvaWQgcHJvYmxlbXMgd2hlbiBnZW5lcmF0aW5nIHByb3RvdHlwZXMgKi8KKyMgICBkZWZpbmUgU0laRU9GX0lOVCAyCQkvKiAxNiBiaXQgaW50cyAqLworIyAgZW5kaWYKKyMgIGRlZmluZSBTTUFMTF9NQUxMT0MJCS8qIDE2IGJpdCBzdG9yYWdlIGFsbG9jYXRpb24gKi8KKyMgIGRlZmluZSBET1MxNgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBBTUlHQQorICAvKiBCZSBjb25zZXJ2YXRpdmUgYWJvdXQgc2l6ZW9mKGludCkuIEl0IGNvdWxkIGJlIDQgdG9vLiAqLworIyBpZm5kZWYgRkVBVF9HVUlfR1RLCS8qIGF2b2lkIHByb2JsZW1zIHdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzICovCisjICBpZmRlZiBfX0dOVUNfXworIyAgIGRlZmluZSBTSVpFT0ZfSU5UCTQKKyMgIGVsc2UKKyMgICBkZWZpbmUgU0laRU9GX0lOVAkyCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgTUFDT1MKKyMgaWYgZGVmaW5lZChfX1BPV0VSUENfXykgfHwgZGVmaW5lZChfX2ZvdXJieXRlaW50c19fKSBcCisgIHx8IGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoX19BUFBMRV9DQ19fKS8qIE1QVyBDb21waWxlcnMgKi8KKyMgIGRlZmluZSBTSVpFT0ZfSU5UIDQKKyMgZWxzZQorIyAgZGVmaW5lIFNJWkVPRl9JTlQgMgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgUklTQ09TCisjIGRlZmluZSBTSVpFT0ZfSU5UIDQKKyNlbmRpZgorCisKKyNpbmNsdWRlICJmZWF0dXJlLmgiCS8qICNkZWZpbmVzIGZvciBvcHRpb25hbHMgYW5kIGZlYXR1cmVzICovCisKKy8qICt4MTEgaXMgb25seSBlbmFibGVkIHdoZW4gaXQncyBib3RoIGF2YWlsYWJsZSBhbmQgd2FudGVkLiAqLworI2lmIGRlZmluZWQoSEFWRV9YMTEpICYmIGRlZmluZWQoV0FOVF9YMTEpCisjIGRlZmluZSBGRUFUX1gxMQorI2VuZGlmCisKKy8qIENhbid0IHVzZSAiUEFDS0FHRSIgaGVyZSwgY29uZmxpY3RzIHdpdGggYSBQZXJsIGluY2x1ZGUgZmlsZS4gKi8KKyNpZm5kZWYgVklNUEFDS0FHRQorIyBkZWZpbmUgVklNUEFDS0FHRQkidmltIgorI2VuZGlmCisKKy8qCisgKiBGaW5kIG91dCBpZiBmdW5jdGlvbiBkZWZpbml0aW9ucyBzaG91bGQgaW5jbHVkZSBhcmd1bWVudCB0eXBlcworICovCisjaWZkZWYgQVpURUNfQworIyBpbmNsdWRlIDxmdW5jdGlvbnMuaD4KKyMgZGVmaW5lIF9fQVJHUyh4KSAgeAorI2VuZGlmCisKKyNpZmRlZiBTQVNDCisjIGluY2x1ZGUgPGNsaWIvZXhlY19wcm90b3MuaD4KKyMgZGVmaW5lIF9fQVJHUyh4KSAgeAorI2VuZGlmCisKKyNpZmRlZiBfRENDCisjIGluY2x1ZGUgPGNsaWIvZXhlY19wcm90b3MuaD4KKyMgZGVmaW5lIF9fQVJHUyh4KSAgeAorI2VuZGlmCisKKyNpZmRlZiBfX1RVUkJPQ19fCisjIGRlZmluZSBfX0FSR1MoeCkgeAorI2VuZGlmCisKKyNpZmRlZiBfX0JFT1NfXworIyBpbmNsdWRlICJvc19iZW9zLmgiCisjIGRlZmluZSBfX0FSR1MoeCkgIHgKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykpIFwKKwkmJiAoIWRlZmluZWQoTUFDT1NfWCkgfHwgZGVmaW5lZChIQVZFX0NPTkZJR19IKSkKKyMgaW5jbHVkZSAib3NfdW5peC5oIgkgICAgLyogYnJpbmcgbG90cyBvZiBzeXN0ZW0gaGVhZGVyIGZpbGVzICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpICYmIChkZWZpbmVkKF9fTVJDX18pIHx8IGRlZmluZWQoX19TQ19fKSkKKyAgIC8qIEFwcGxlJ3MgQ29tcGlsZXJzIHN1cHBvcnQgcHJvdG90eXBlcyAqLworIyBkZWZpbmUgX19BUkdTKHgpIHgKKyNlbmRpZgorI2lmbmRlZiBfX0FSR1MKKyMgaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChXSU4zMjY0KQorIyAgZGVmaW5lIF9fQVJHUyh4KSB4CisjIGVsc2UKKyMgIGRlZmluZSBfX0FSR1MoeCkgKCkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBfX0FSR1MgYW5kIF9fUEFSTVMgYXJlIHRoZSBzYW1lIHRoaW5nLiAqLworI2lmbmRlZiBfX1BBUk1TCisjIGRlZmluZSBfX1BBUk1TKHgpIF9fQVJHUyh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKE1BQ09TX1gpIC8qIE1BQ09TX1ggZG9lc24ndCB5ZXQgc3VwcG9ydCBvc2RlZi5oICovCisjIGluY2x1ZGUgImF1dG8vb3NkZWYuaCIJLyogYnJpbmcgbWlzc2luZyBkZWNsYXJhdGlvbnMgaW4gKi8KKyNlbmRpZgorCisjaWZkZWYgX19FTVhfXworIyBkZWZpbmUgICAgZ2V0Y3dkICBfZ2V0Y3dkMgorIyBkZWZpbmUgICAgY2hkaXIgICBfY2hkaXIyCisjIHVuZGVmCSAgICBDSEVDS19JTk9ERQorI2VuZGlmCisKKyNpZmRlZiBBTUlHQQorIyBpbmNsdWRlICJvc19hbWlnYS5oIgorI2VuZGlmCisKKyNpZmRlZiBNU0RPUworIyBpbmNsdWRlICJvc19tc2Rvcy5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4xNgorIyBpbmNsdWRlICJvc193aW4xNi5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMjY0CisjIGluY2x1ZGUgIm9zX3dpbjMyLmgiCisjZW5kaWYKKworI2lmZGVmIF9fTUlOVF9fCisjIGluY2x1ZGUgIm9zX21pbnQuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNQUNPUykKKyMgaWYgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgLyogTVBXIENvbXBpbGVycyAqLworIyAgZGVmaW5lIEhBVkVfU0VURU5WCisjIGVuZGlmCisjIGluY2x1ZGUgIm9zX21hYy5oIgorI2VuZGlmCisKKyNpZmRlZiBSSVNDT1MKKyMgaW5jbHVkZSAib3NfcmlzY29zLmgiCisjZW5kaWYKKworI2lmZGVmIF9fUU5YX18KKyMgaW5jbHVkZSAib3NfcW54LmgiCisjZW5kaWYKKworI2lmZGVmIEZFQVRfU1VOX1dPUktTSE9QCisjIGluY2x1ZGUgIndvcmtzaG9wLmgiCisjZW5kaWYKKworI2lmZGVmIFhfTE9DQUxFCisjIGluY2x1ZGUgPFgxMS9YbG9jYWxlLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX0xPQ0FMRV9ICisjICBpbmNsdWRlIDxsb2NhbGUuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogTWF4aW11bSBsZW5ndGggb2YgYSBwYXRoIChmb3Igbm9uLXVuaXggc3lzdGVtcykgTWFrZSBpdCBhIGJpdCBsb25nLCB0byBzdGF5CisgKiBvbiB0aGUgc2FmZSBzaWRlLiAgQnV0IG5vdCB0b28gbG9uZyB0byBwdXQgb24gdGhlIHN0YWNrLgorICovCisjaWZuZGVmIE1BWFBBVEhMCisjIGlmZGVmIE1BWFBBVEhMRU4KKyMgIGRlZmluZSBNQVhQQVRITCAgTUFYUEFUSExFTgorIyBlbHNlCisjICBkZWZpbmUgTUFYUEFUSEwgIDI1NgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisjIGRlZmluZSBQQVRIX0VTQ19DSEFSUyAoKGNoYXJfdSAqKSIgKj9be2AlIyIpCisjZWxzZQorIyBpZmRlZiBDT0xPTl9BU19QQVRIU0VQCisjICBkZWZpbmUgUEFUSF9FU0NfQ0hBUlMgKChjaGFyX3UgKikiICo/W3tgJCUjLyIpCisjIGVsc2UKKyMgIGRlZmluZSBQQVRIX0VTQ19DSEFSUyAoKGNoYXJfdSAqKSIgKj9be2AkXFwlIydcInwiKQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTlVNQlVGTEVOIDMwCSAgICAvKiBsZW5ndGggb2YgYSBidWZmZXIgdG8gc3RvcmUgYSBudW1iZXIgaW4gQVNDSUkgKi8KKworLyoKKyAqIFNob3J0aGFuZCBmb3IgdW5zaWduZWQgdmFyaWFibGVzLiBNYW55IHN5c3RlbXMsIGJ1dCBub3QgYWxsLCBoYXZlIHVfY2hhcgorICogYWxyZWFkeSBkZWZpbmVkLCBzbyB3ZSB1c2UgY2hhcl91IHRvIGF2b2lkIHRyb3VibGUuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgljaGFyX3U7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CXNob3J0X3U7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlpbnRfdTsKKy8qIE1ha2Ugc3VyZSBsb25nX3UgaXMgYmlnIGVub3VnaCB0byBob2xkIGEgcG9pbnRlci4gIE9uIFdpbjY0IGxvbmdzIGFyZSAzMgorICogYml0IGFuZCBwb2ludGVycyA2NCBiaXQuICovCisjaWZkZWYgX1dJTjY0Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgbG9uZ191OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlsb25nX3U7CisjZW5kaWYKKworLyoKKyAqIFRoZSBjaGFyYWN0ZXJzIGFuZCBhdHRyaWJ1dGVzIGNhY2hlZCBmb3IgdGhlIHNjcmVlbi4KKyAqIEN1cnJlbnRseSBhIHNpbmdsZSBieXRlLiAgVGhlIGF0dHJpYnV0ZXMgbWF5IGJlY29tZSBsYXJnZXIgc29tZSBkYXkuCisgKi8KKyNkZWZpbmUgc2NoYXJfVAljaGFyX3UKKyNkZWZpbmUgc2F0dHJfVAljaGFyX3UKKworLyoKKyAqIFRoZSB1OGNoYXJfVCBjYW4gaG9sZCBvbmUgZGVjb2RlZCBVVEYtOCBjaGFyYWN0ZXIuCisgKiBWaW0gYWx3YXlzIHVzZSBhbiBpbnQgKDMyIGJpdHMpIGZvciBjaGFyYWN0ZXJzIG1vc3QgcGxhY2VzLCBzbyB0aGF0IHdlIGNhbgorICogaGFuZGxlIDMyIGJpdCBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLiAgdThjaGFyX1QgaXMgb25seSB1c2VkIGZvcgorICogZGlzcGxheWluZy4gIFRoYXQgc2hvdWxkIGJlIGVub3VnaCwgYmVjYXVzZSB0aGVyZSBpcyBubyBmb250IGZvciA+IDE2IGJpdHMuCisgKi8KKyNpZmRlZiBGRUFUX01CWVRFCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHU4Y2hhcl9UOworI2VuZGlmCisKKyNpZm5kZWYgVU5JWAkJICAgIC8qIEZvciBVbml4IHRoaXMgaXMgaW5jbHVkZWQgaW4gb3NfdW5peC5oICovCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImFzY2lpLmgiCisjaW5jbHVkZSAia2V5bWFwLmgiCisjaW5jbHVkZSAidGVybS5oIgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorCisjaWZkZWYgTEFUVElDRQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIF9EQ0MKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworLyoKKyAqIEFsbG93IG90aGVyIChub24tdW5peCkgc3lzdGVtcyB0byBjb25maWd1cmUgdGhlbXNlbHZlcyBub3cKKyAqIFRoZXNlIGFyZSBhbHNvIGluIG9zX3VuaXguaCwgYmVjYXVzZSBvc2RlZi5zaCBuZWVkcyB0aGVtIHRoZXJlLgorICovCisjaWZuZGVmIFVOSVgKKy8qIE5vdGU6IFNvbWUgc3lzdGVtcyBuZWVkIGJvdGggc3RyaW5nLmggYW5kIHN0cmluZ3MuaCAoU2F2YWdlKS4gIElmIHRoZQorICogc3lzdGVtIGNhbid0IGhhbmRsZSB0aGlzLCBkZWZpbmUgTk9fU1RSSU5HU19XSVRIX1NUUklOR19ILiAqLworIyBpZmRlZiBIQVZFX1NUUklOR19ICisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChIQVZFX1NUUklOR1NfSCkgJiYgIWRlZmluZWQoTk9fU1RSSU5HU19XSVRIX1NUUklOR19IKQorIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9TVEFUX0gKKyMgIGluY2x1ZGUgPHN0YXQuaD4KKyMgZW5kaWYKKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYgLyogTk9OLVVOSVggKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKiA9PT09PT09PT09PT09PT09IGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUgcHV6emxlID09PT09PT09PT09PT09PSAqLworCisvKgorICogRm9yIGR5bmFtaWNhbGx5IGxvYWRlZCBpbW0gbGlicmFyeS4gQ3VycmVudGx5LCBvbmx5IGZvciBXaW4zMi4KKyAqLworI2lmZGVmIERZTkFNSUNfSU1FCisjIGlmbmRlZiBGRUFUX01CWVRFX0lNRQorIyAgZGVmaW5lIEZFQVRfTUJZVEVfSU1FCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlucHV0IG1ldGhvZCBjb250cm9sLgorICovCisjaWYgZGVmaW5lZChGRUFUX1hJTSkgfHwgXAorICAgIChkZWZpbmVkKEZFQVRfR1VJKSAmJiAoZGVmaW5lZChGRUFUX01CWVRFX0lNRSkgfHwgZGVmaW5lZChHTE9CQUxfSU1FKSkpCisjIGRlZmluZSBVU0VfSU1fQ09OVFJPTAorI2VuZGlmCisKKy8qCisgKiBGb3IgZHluYW1pY2FsbHkgbG9hZGVkIGdldHRleHQgbGlicmFyeS4gIEN1cnJlbnRseSwgb25seSBmb3IgV2luMzIuCisgKi8KKyNpZmRlZiBEWU5BTUlDX0dFVFRFWFQKKyMgaWZuZGVmIEZFQVRfR0VUVEVYVAorIyAgZGVmaW5lIEZFQVRfR0VUVEVYVAorIyBlbmRpZgorLyogVGhlc2UgYXJlIGluIG9zX3dpbjMyLmMgKi8KK2V4dGVybiBjaGFyKiAoKmR5bl9saWJpbnRsX2dldHRleHQpKGNvbnN0IGNoYXIqIG1zZ2lkKTsKK2V4dGVybiBjaGFyKiAoKmR5bl9saWJpbnRsX2JpbmR0ZXh0ZG9tYWluKShjb25zdCBjaGFyKiBkb21haW5uYW1lLCBjb25zdCBjaGFyKiBkaXJuYW1lKTsKK2V4dGVybiBjaGFyKiAoKmR5bl9saWJpbnRsX3RleHRkb21haW4pKGNvbnN0IGNoYXIqIGRvbWFpbm5hbWUpOworI2VuZGlmCisKKworLyoKKyAqIFRoZSBfKCkgc3R1ZmYgaXMgZm9yIHVzaW5nIGdldHRleHQoKS4gIEl0IGlzIGEgbm8tb3Agd2hlbiBsaWJpbnRsLmggaXMgbm90CisgKiBmb3VuZCBvciB0aGUgK211bHRpbGFuZyBmZWF0dXJlIGlzIGRpc2FibGVkLgorICovCisjaWZkZWYgRkVBVF9HRVRURVhUCisjIGlmZGVmIERZTkFNSUNfR0VUVEVYVAorIyAgZGVmaW5lIF8oeCkgKCpkeW5fbGliaW50bF9nZXR0ZXh0KSgoY2hhciAqKSh4KSkKKyMgIGRlZmluZSBOXyh4KSB4CisjICBkZWZpbmUgYmluZHRleHRkb21haW4oZG9tYWluLGRpcikgKCpkeW5fbGliaW50bF9iaW5kdGV4dGRvbWFpbikoZG9tYWluLGRpcikKKyMgIGRlZmluZSB0ZXh0ZG9tYWluKGRvbWFpbikgKCpkeW5fbGliaW50bF90ZXh0ZG9tYWluKShkb21haW4pCisjIGVsc2UKKyMgIGluY2x1ZGUgPGxpYmludGwuaD4KKyMgIGRlZmluZSBfKHgpIGdldHRleHQoKGNoYXIgKikoeCkpCisjICBpZmRlZiBnZXR0ZXh0X25vb3AKKyMgICBkZWZpbmUgTl8oeCkgZ2V0dGV4dF9ub29wKHgpCisjICBlbHNlCisjICAgZGVmaW5lIE5fKHgpIHgKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgXyh4KSAoKGNoYXIgKikoeCkpCisjIGRlZmluZSBOXyh4KSB4CisjIGlmZGVmIGJpbmR0ZXh0ZG9tYWluCisjICB1bmRlZiBiaW5kdGV4dGRvbWFpbgorIyBlbmRpZgorIyBkZWZpbmUgYmluZHRleHRkb21haW4oeCwgeSkgLyogZW1wdHkgKi8KKyMgaWZkZWYgdGV4dGRvbWFpbgorIyAgdW5kZWYgdGV4dGRvbWFpbgorIyBlbmRpZgorIyBkZWZpbmUgdGV4dGRvbWFpbih4KSAvKiBlbXB0eSAqLworI2VuZGlmCisKKy8qCisgKiBmbGFncyBmb3IgdXBkYXRlX3NjcmVlbigpCisgKiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIGhpZ2hlciB0aGUgcHJpb3JpdHkKKyAqLworI2RlZmluZSBWQUxJRAkJCTEwICAvKiBidWZmZXIgbm90IGNoYW5nZWQsIG9yIGNoYW5nZXMgbWFya2VkCisJCQkJICAgICAgIHdpdGggYl9tb2RfKiAqLworI2RlZmluZSBJTlZFUlRFRAkJMjAgIC8qIHJlZGlzcGxheSBpbnZlcnRlZCBwYXJ0IHRoYXQgY2hhbmdlZCAqLworI2RlZmluZSBJTlZFUlRFRF9BTEwJCTI1ICAvKiByZWRpc3BsYXkgd2hvbGUgaW52ZXJ0ZWQgcGFydCAqLworI2RlZmluZSBSRURSQVdfVE9QCQkzMCAgLyogZGlzcGxheSBmaXJzdCB3X3VwZF9yb3dzIHNjcmVlbiBsaW5lcyAqLworI2RlZmluZSBOT1RfVkFMSUQJCTQwICAvKiBidWZmZXIgbmVlZHMgY29tcGxldGUgcmVkcmF3ICovCisjZGVmaW5lIENMRUFSCQkJNTAgIC8qIHNjcmVlbiBtZXNzZWQgdXAsIGNsZWFyIGl0ICovCisKKy8qCisgKiBIaW50cyB1c2VkIHRvIG9wdGltaXplIHNjcmVlbiB1cGRhdGluZy4KKyAqLworI2RlZmluZSBISU5UX05PTkUJMAkgICAgLyogbm8gY3VycmVudCBoaW50ICovCisjZGVmaW5lIEhJTlRfREVMX0NIQVIJMQkgICAgLyogZGVsZXRlIGNoYXJhY3RlciAqLworI2RlZmluZSBISU5UX0lOU19DSEFSCTIJICAgIC8qIGluc2VydCBjaGFyYWN0ZXIgKi8KKworLyoKKyAqIEZsYWdzIGZvciB3X3ZhbGlkLgorICogVGhlc2UgYXJlIHNldCB3aGVuIHNvbWV0aGluZyBpbiBhIHdpbmRvdyBzdHJ1Y3R1cmUgYmVjb21lcyBpbnZhbGlkLCBleGNlcHQKKyAqIHdoZW4gdGhlIGN1cnNvciBpcyBtb3ZlZC4gIENhbGwgY2hlY2tfY3Vyc29yX21vdmVkKCkgYmVmb3JlIHRlc3Rpbmcgb25lIG9mCisgKiB0aGUgZmxhZ3MuCisgKiBUaGVzZSBhcmUgcmVzZXQgd2hlbiB0aGF0IHRoaW5nIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGlzIHZhbGlkIGFnYWluLgorICoKKyAqIEV2ZXJ5IGZ1bmN0aW9uIHRoYXQgaW52YWxpZGF0ZXMgb25lIG9mIHRoZXNlIG11c3QgY2FsbCBvbmUgb2YgdGhlCisgKiBpbnZhbGlkYXRlXyogZnVuY3Rpb25zLgorICoKKyAqIHdfdmFsaWQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5IGluIHNjcmVlbi5jLiAgRnJvbSBvdGhlciBmaWxlcywgdXNlIHRoZQorICogZnVuY3Rpb25zIHRoYXQgc2V0IG9yIHJlc2V0IHRoZSBmbGFncy4KKyAqCisgKiBWQUxJRF9CT1RMSU5FICAgIFZBTElEX0JPVExJTkVfQVAKKyAqICAgICBvbgkJb24JCXdfYm90bGluZSB2YWxpZAorICogICAgIG9mZgkJb24JCXdfYm90bGluZSBhcHByb3hpbWF0ZWQKKyAqICAgICBvZmYJCW9mZgkJd19ib3RsaW5lIG5vdCB2YWxpZAorICogICAgIG9uCQlvZmYJCW5vdCBwb3NzaWJsZQorICovCisjZGVmaW5lIFZBTElEX1dST1cJMHgwMQkvKiB3X3dyb3cgKHdpbmRvdyByb3cpIGlzIHZhbGlkICovCisjZGVmaW5lIFZBTElEX1dDT0wJMHgwMgkvKiB3X3djb2wgKHdpbmRvdyBjb2wpIGlzIHZhbGlkICovCisjZGVmaW5lIFZBTElEX1ZJUlRDT0wJMHgwNAkvKiB3X3ZpcnRjb2wgKGZpbGUgY29sKSBpcyB2YWxpZCAqLworI2RlZmluZSBWQUxJRF9DSEVJR0hUCTB4MDgJLyogd19jbGluZV9oZWlnaHQgYW5kIHdfY2xpbmVfZm9sZGVkIHZhbGlkICovCisjZGVmaW5lIFZBTElEX0NST1cJMHgxMAkvKiB3X2NsaW5lX3JvdyBpcyB2YWxpZCAqLworI2RlZmluZSBWQUxJRF9CT1RMSU5FCTB4MjAJLyogd19ib3RpbmUgYW5kIHdfZW1wdHlfcm93cyBhcmUgdmFsaWQgKi8KKyNkZWZpbmUgVkFMSURfQk9UTElORV9BUCAweDQwCS8qIHdfYm90aW5lIGlzIGFwcHJveGltYXRlZCAqLworI2RlZmluZSBWQUxJRF9UT1BMSU5FCTB4ODAJLyogd190b3BsaW5lIGlzIHZhbGlkIChmb3IgY3Vyc29yIHBvc2l0aW9uKSAqLworCisvKgorICogVGVybWluYWwgaGlnaGxpZ2h0aW5nIGF0dHJpYnV0ZSBiaXRzLgorICogQXR0aWJ1dGVzIGFib3ZlIEhMX0FMTCBhcmUgdXNlZCBmb3Igc3ludGF4IGhpZ2hsaWdodGluZy4KKyAqLworI2RlZmluZSBITF9OT1JNQUwJCTB4MDAKKyNkZWZpbmUgSExfSU5WRVJTRQkJMHgwMQorI2RlZmluZSBITF9CT0xECQkJMHgwMgorI2RlZmluZSBITF9JVEFMSUMJCTB4MDQKKyNkZWZpbmUgSExfVU5ERVJMSU5FCQkweDA4CisjZGVmaW5lIEhMX1NUQU5ET1VUCQkweDEwCisjZGVmaW5lIEhMX0FMTAkJCTB4MWYKKworLyogc3BlY2lhbCBhdHRyaWJ1dGUgYWRkaXRpb246IFB1dCBtZXNzYWdlIGluIGhpc3RvcnkgKi8KKyNkZWZpbmUgTVNHX0hJU1QJCTB4MTAwMAorCisvKgorICogdmFsdWVzIGZvciBTdGF0ZQorICoKKyAqIFRoZSBsb3dlciBiaXRzIHVwIHRvIDB4MjAgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbm9ybWFsL3Zpc3VhbC9vcF9wZW5kaW5nCisgKiBhbmQgY21kbGluZS9pbnNlcnQrcmVwbGFjZSBtb2RlLiAgVGhpcyBpcyB1c2VkIGZvciBtYXBwaW5nLiAgSWYgbm9uZSBvZgorICogdGhlc2UgYml0cyBhcmUgc2V0LCBubyBtYXBwaW5nIGlzIGRvbmUuCisgKiBUaGUgdXBwZXIgYml0cyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG90aGVyIHN0YXRlcy4KKyAqLworI2RlZmluZSBOT1JNQUwJCTB4MDEJLyogTm9ybWFsIG1vZGUsIGNvbW1hbmQgZXhwZWN0ZWQgKi8KKyNkZWZpbmUgVklTVUFMCQkweDAyCS8qIFZpc3VhbCBtb2RlIC0gdXNlIGdldF9yZWFsX3N0YXRlKCkgKi8KKyNkZWZpbmUgT1BfUEVORElORwkweDA0CS8qIE5vcm1hbCBtb2RlLCBvcGVyYXRvciBpcyBwZW5kaW5nIC0gdXNlCisJCQkJICAgZ2V0X3JlYWxfc3RhdGUoKSAqLworI2RlZmluZSBDTURMSU5FCQkweDA4CS8qIEVkaXRpbmcgY29tbWFuZCBsaW5lICovCisjZGVmaW5lIElOU0VSVAkJMHgxMAkvKiBJbnNlcnQgbW9kZSAqLworI2RlZmluZSBMQU5HTUFQCQkweDIwCS8qIExhbmd1YWdlIG1hcHBpbmcsIGNhbiBiZSBjb21iaW5lZCB3aXRoCisJCQkJICAgSU5TRVJUIGFuZCBDTURMSU5FICovCisjZGVmaW5lIE1BUF9BTExfTU9ERVMJMHgzZgkvKiBhbGwgbW9kZSBiaXRzIHVzZWQgZm9yIG1hcHBpbmcgKi8KKworI2RlZmluZSBSRVBMQUNFX0ZMQUcJMHg0MAkvKiBSZXBsYWNlIG1vZGUgZmxhZyAqLworI2RlZmluZSBSRVBMQUNFCQkoUkVQTEFDRV9GTEFHICsgSU5TRVJUKQorI2lmZGVmIEZFQVRfVlJFUExBQ0UKKyMgZGVmaW5lIFZSRVBMQUNFX0ZMQUcJMHg4MAkvKiBWaXJ0dWFsLXJlcGxhY2UgbW9kZSBmbGFnICovCisjIGRlZmluZSBWUkVQTEFDRQkoUkVQTEFDRV9GTEFHICsgVlJFUExBQ0VfRkxBRyArIElOU0VSVCkKKyNlbmRpZgorI2RlZmluZSBMUkVQTEFDRQkoUkVQTEFDRV9GTEFHICsgTEFOR01BUCkKKworI2RlZmluZSBOT1JNQUxfQlVTWQkoMHgxMDAgKyBOT1JNQUwpIC8qIE5vcm1hbCBtb2RlLCBidXN5IHdpdGggYSBjb21tYW5kICovCisjZGVmaW5lIEhJVFJFVFVSTgkoMHgyMDAgKyBOT1JNQUwpIC8qIHdhaXRpbmcgZm9yIHJldHVybiBvciBjb21tYW5kICovCisjZGVmaW5lIEFTS01PUkUJCTB4MzAwCS8qIEFza2luZyBpZiB5b3Ugd2FudCAtLW1vcmUtLSAqLworI2RlZmluZSBTRVRXU0laRQkweDQwMAkvKiB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCAqLworI2RlZmluZSBBQkJSRVYJCTB4NTAwCS8qIGFiYnJldmlhdGlvbiBpbnN0ZWFkIG9mIG1hcHBpbmcgKi8KKyNkZWZpbmUgRVhURVJOQ01ECTB4NjAwCS8qIGV4ZWN1dGluZyBhbiBleHRlcm5hbCBjb21tYW5kICovCisjZGVmaW5lIFNIT1dNQVRDSAkoMHg3MDAgKyBJTlNFUlQpIC8qIHNob3cgbWF0Y2hpbmcgcGFyZW4gKi8KKyNkZWZpbmUgQ09ORklSTQkJMHg4MDAJLyogIjpjb25maXJtIiBwcm9tcHQgKi8KKworLyogZGlyZWN0aW9ucyAqLworI2RlZmluZSBGT1JXQVJECQkJMQorI2RlZmluZSBCQUNLV0FSRAkJKC0xKQorI2RlZmluZSBGT1JXQVJEX0ZJTEUJCTMKKyNkZWZpbmUgQkFDS1dBUkRfRklMRQkJKC0zKQorCisvKiByZXR1cm4gdmFsdWVzIGZvciBmdW5jdGlvbnMgKi8KKyNpZiAhKGRlZmluZWQoT0spICYmIChPSyA9PSAxKSkKKy8qIE9LIGFscmVhZHkgZGVmaW5lZCB0byAxIGluIE1hY09TIFggY3Vyc2VzLCBza2lwIHRoaXMgKi8KKyMgZGVmaW5lIE9LCQkJMQorI2VuZGlmCisjZGVmaW5lIEZBSUwJCQkwCisKKy8qIGZsYWdzIGZvciBiX2ZsYWdzICovCisjZGVmaW5lIEJGX1JFQ09WRVJFRAkweDAxCS8qIGJ1ZmZlciBoYXMgYmVlbiByZWNvdmVyZWQgKi8KKyNkZWZpbmUgQkZfQ0hFQ0tfUk8JMHgwMgkvKiBuZWVkIHRvIGNoZWNrIHJlYWRvbmx5IHdoZW4gbG9hZGluZyBmaWxlCisJCQkJICAgaW50byBidWZmZXIgKHNldCBieSAiOmUiLCBtYXkgYmUgcmVzZXQgYnkKKwkJCQkgICAiOmJ1ZiIgKi8KKyNkZWZpbmUgQkZfTkVWRVJMT0FERUQJMHgwNAkvKiBmaWxlIGhhcyBuZXZlciBiZWVuIGxvYWRlZCBpbnRvIGJ1ZmZlciwKKwkJCQkgICBtYW55IHZhcmlhYmxlcyBzdGlsbCBuZWVkIHRvIGJlIHNldCAqLworI2RlZmluZSBCRl9OT1RFRElURUQJMHgwOAkvKiBTZXQgd2hlbiBmaWxlIG5hbWUgaXMgY2hhbmdlZCBhZnRlcgorCQkJCSAgIHN0YXJ0aW5nIHRvIGVkaXQsIHJlc2V0IHdoZW4gZmlsZSBpcworCQkJCSAgIHdyaXR0ZW4gb3V0LiAqLworI2RlZmluZSBCRl9ORVcJCTB4MTAJLyogZmlsZSBkaWRuJ3QgZXhpc3Qgd2hlbiBlZGl0aW5nIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgQkZfTkVXX1cJMHgyMAkvKiBXYXJuZWQgZm9yIEJGX05FVyBhbmQgZmlsZSBjcmVhdGVkICovCisjZGVmaW5lIEJGX1JFQURFUlIJMHg0MAkvKiBnb3QgZXJyb3JzIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUgKi8KKworLyogTWFzayB0byBjaGVjayBmb3IgZmxhZ3MgdGhhdCBwcmV2ZW50IG5vcm1hbCB3cml0aW5nICovCisjZGVmaW5lIEJGX1dSSVRFX01BU0sJKEJGX05PVEVESVRFRCArIEJGX05FVyArIEJGX1JFQURFUlIpCisKKy8qCisgKiB2YWx1ZXMgZm9yIHhwX2NvbnRleHQgd2hlbiBkb2luZyBjb21tYW5kIGxpbmUgY29tcGxldGlvbgorICovCisjZGVmaW5lIENPTlRFWFRfVU5LTk9XTgkJKC0zKQorI2RlZmluZSBFWFBBTkRfVU5TVUNDRVNTRlVMCSgtMikKKyNkZWZpbmUgRVhQQU5EX09LCQkoLTEpCisjZGVmaW5lIEVYUEFORF9OT1RISU5HCQkwCisjZGVmaW5lIEVYUEFORF9DT01NQU5EUwkJMQorI2RlZmluZSBFWFBBTkRfRklMRVMJCTIKKyNkZWZpbmUgRVhQQU5EX0RJUkVDVE9SSUVTCTMKKyNkZWZpbmUgRVhQQU5EX1NFVFRJTkdTCQk0CisjZGVmaW5lIEVYUEFORF9CT09MX1NFVFRJTkdTCTUKKyNkZWZpbmUgRVhQQU5EX1RBR1MJCTYKKyNkZWZpbmUgRVhQQU5EX09MRF9TRVRUSU5HCTcKKyNkZWZpbmUgRVhQQU5EX0hFTFAJCTgKKyNkZWZpbmUgRVhQQU5EX0JVRkZFUlMJCTkKKyNkZWZpbmUgRVhQQU5EX0VWRU5UUwkJMTAKKyNkZWZpbmUgRVhQQU5EX01FTlVTCQkxMQorI2RlZmluZSBFWFBBTkRfU1lOVEFYCQkxMgorI2RlZmluZSBFWFBBTkRfSElHSExJR0hUCTEzCisjZGVmaW5lIEVYUEFORF9BVUdST1VQCQkxNAorI2RlZmluZSBFWFBBTkRfVVNFUl9WQVJTCTE1CisjZGVmaW5lIEVYUEFORF9NQVBQSU5HUwkJMTYKKyNkZWZpbmUgRVhQQU5EX1RBR1NfTElTVEZJTEVTCTE3CisjZGVmaW5lIEVYUEFORF9GVU5DVElPTlMJMTgKKyNkZWZpbmUgRVhQQU5EX1VTRVJfRlVOQwkxOQorI2RlZmluZSBFWFBBTkRfRVhQUkVTU0lPTgkyMAorI2RlZmluZSBFWFBBTkRfTUVOVU5BTUVTCTIxCisjZGVmaW5lIEVYUEFORF9VU0VSX0NPTU1BTkRTCTIyCisjZGVmaW5lIEVYUEFORF9VU0VSX0NNRF9GTEFHUwkyMworI2RlZmluZSBFWFBBTkRfVVNFUl9OQVJHUwkyNAorI2RlZmluZSBFWFBBTkRfVVNFUl9DT01QTEVURQkyNQorI2RlZmluZSBFWFBBTkRfRU5WX1ZBUlMJCTI2CisjZGVmaW5lIEVYUEFORF9MQU5HVUFHRQkJMjcKKyNkZWZpbmUgRVhQQU5EX0NPTE9SUwkJMjgKKyNkZWZpbmUgRVhQQU5EX0NPTVBJTEVSCQkyOQorI2RlZmluZSBFWFBBTkRfVVNFUl9ERUZJTkVECTMwCisKKy8qIFZhbHVlcyBmb3IgZXhtb2RlX2FjdGl2ZSAoMCBpcyBubyBleG1vZGUpICovCisjZGVmaW5lIEVYTU9ERV9OT1JNQUwJCTEKKyNkZWZpbmUgRVhNT0RFX1ZJTQkJMgorCisvKiBWYWx1ZXMgZm9yIG5leHR3aWxkKCkgYW5kIEV4cGFuZE9uZSgpLiAgU2VlIEV4cGFuZE9uZSgpIGZvciBtZWFuaW5nLiAqLworI2RlZmluZSBXSUxEX0ZSRUUJCTEKKyNkZWZpbmUgV0lMRF9FWFBBTkRfRlJFRQkyCisjZGVmaW5lIFdJTERfRVhQQU5EX0tFRVAJMworI2RlZmluZSBXSUxEX05FWFQJCTQKKyNkZWZpbmUgV0lMRF9QUkVWCQk1CisjZGVmaW5lIFdJTERfQUxMCQk2CisjZGVmaW5lIFdJTERfTE9OR0VTVAkJNworCisjZGVmaW5lIFdJTERfTElTVF9OT1RGT1VORAkxCisjZGVmaW5lIFdJTERfSE9NRV9SRVBMQUNFCTIKKyNkZWZpbmUgV0lMRF9VU0VfTkwJCTQKKyNkZWZpbmUgV0lMRF9OT19CRUVQCQk4CisjZGVmaW5lIFdJTERfQUREX1NMQVNICQkxNgorI2RlZmluZSBXSUxEX0tFRVBfQUxMCQkzMgorI2RlZmluZSBXSUxEX1NJTEVOVAkJNjQKKyNkZWZpbmUgV0lMRF9FU0NBUEUJCTEyOAorCisvKiBGbGFncyBmb3IgZXhwYW5kX3dpbGRjYXJkcygpICovCisjZGVmaW5lIEVXX0RJUgkJMQkvKiBpbmNsdWRlIGRpcmVjdG9yeSBuYW1lcyAqLworI2RlZmluZSBFV19GSUxFCQkyCS8qIGluY2x1ZGUgZmlsZSBuYW1lcyAqLworI2RlZmluZSBFV19OT1RGT1VORAk0CS8qIGluY2x1ZGUgbm90IGZvdW5kIG5hbWVzICovCisjZGVmaW5lIEVXX0FERFNMQVNICTgJLyogYXBwZW5kIHNsYXNoIHRvIGRpcmVjdG9yeSBuYW1lICovCisjZGVmaW5lIEVXX0tFRVBBTEwJMTYJLyoga2VlcCBhbGwgbWF0Y2hlcyAqLworI2RlZmluZSBFV19TSUxFTlQJMzIJLyogZG9uJ3QgcHJpbnQgIjEgcmV0dXJuZWQiIGZyb20gc2hlbGwgKi8KKy8qIE5vdGU6IG1vc3RseSBFV19OT1RGT1VORCBhbmQgRVdfU0lMRU5UIGFyZSBtdXR1YWxseSBleGNsdXNpdmU6IEVXX05PVEZPVU5ECisgKiBpcyB1c2VkIHdoZW4gZXhlY3V0aW5nIGNvbW1hbmRzIGFuZCBFV19TSUxFTlQgZm9yIGludGVyYWN0aXZlIGV4cGFuZGluZy4gKi8KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisjIGRlZmluZSBXX1dJTkNPTCh3cCkJKHdwLT53X3dpbmNvbCkKKyMgZGVmaW5lIFdfV0lEVEgod3ApCSh3cC0+d193aWR0aCkKKyMgZGVmaW5lIFdfRU5EQ09MKHdwKQkod3AtPndfd2luY29sICsgd3AtPndfd2lkdGgpCisjIGRlZmluZSBXX1ZTRVBfV0lEVEgod3ApICh3cC0+d192c2VwX3dpZHRoKQorI2Vsc2UKKyMgZGVmaW5lIFdfV0lOQ09MKHdwKQkwCisjIGRlZmluZSBXX1dJRFRIKHdwKQlDb2x1bW5zCisjIGRlZmluZSBXX0VORENPTCh3cCkJQ29sdW1ucworIyBkZWZpbmUgV19WU0VQX1dJRFRIKHdwKSAwCisjZW5kaWYKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyMgZGVmaW5lIFdfU1RBVFVTX0hFSUdIVCh3cCkgKHdwLT53X3N0YXR1c19oZWlnaHQpCisjIGRlZmluZSBXX1dJTlJPVyh3cCkJKHdwLT53X3dpbnJvdykKKyNlbHNlCisjIGRlZmluZSBXX1NUQVRVU19IRUlHSFQod3ApIDAKKyMgZGVmaW5lIFdfV0lOUk9XKHdwKQkwCisjZW5kaWYKKworI2lmZGVmIE5PX0VYUEFORFBBVEgKKyMgZGVmaW5lIGdlbl9leHBhbmRfd2lsZGNhcmRzIG1jaF9leHBhbmRfd2lsZGNhcmRzCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgZmluZF9wYXR0ZXJuX2luX3BhdGgoKSBmdW5jdGlvbiBhcmdzICd0eXBlJyBhbmQgJ2FjdGlvbic6ICovCisjZGVmaW5lIEZJTkRfQU5ZCTEKKyNkZWZpbmUgRklORF9ERUZJTkUJMgorI2RlZmluZSBDSEVDS19QQVRICTMKKworI2RlZmluZSBBQ1RJT05fU0hPVwkxCisjZGVmaW5lIEFDVElPTl9HT1RPCTIKKyNkZWZpbmUgQUNUSU9OX1NQTElUCTMKKyNkZWZpbmUgQUNUSU9OX1NIT1dfQUxMCTQKKyNpZmRlZiBGRUFUX0lOU19FWFBBTkQKKyMgZGVmaW5lIEFDVElPTl9FWFBBTkQJNQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX1NZTl9ITAorIyBkZWZpbmUgU1NUX01JTl9FTlRSSUVTIDE1MAkvKiBtaW5pbWFsIHNpemUgZm9yIHN0YXRlIHN0YWNrIGFycmF5ICovCisjIGlmZGVmIEZFQVRfR1VJX1cxNgorIyAgZGVmaW5lIFNTVF9NQVhfRU5UUklFUyA1MDAJLyogKG9ubHkgdXAgdG8gNjRLIGJsb2NrcykgKi8KKyMgZWxzZQorIyAgZGVmaW5lIFNTVF9NQVhfRU5UUklFUyAxMDAwCS8qIG1heGltYWwgc2l6ZSBmb3Igc3RhdGUgc3RhY2sgYXJyYXkgKi8KKyMgZW5kaWYKKyMgZGVmaW5lIFNTVF9GSVhfU1RBVEVTCSA3CS8qIHNpemUgb2Ygc3N0X3N0YWNrW10uICovCisjIGRlZmluZSBTU1RfRElTVAkgMTYJLyogbm9ybWFsIGRpc3RhbmNlIGJldHdlZW4gZW50cmllcyAqLworIyBkZWZpbmUgU1NUX0lOVkFMSUQJKHN5bnN0YXRlX1QgKiktMQkvKiBpbnZhbGlkIHN5bl9zdGF0ZSBwb2ludGVyICovCisjZW5kaWYKKworLyogVmFsdWVzIGZvciAnb3B0aW9ucycgYXJndW1lbnQgaW4gZG9fc2VhcmNoKCkgYW5kIHNlYXJjaGl0KCkgKi8KKyNkZWZpbmUgU0VBUkNIX1JFViAgICAweDAxICAvKiBnbyBpbiByZXZlcnNlIG9mIHByZXZpb3VzIGRpci4gKi8KKyNkZWZpbmUgU0VBUkNIX0VDSE8gICAweDAyICAvKiBlY2hvIHRoZSBzZWFyY2ggY29tbWFuZCBhbmQgaGFuZGxlIG9wdGlvbnMgKi8KKyNkZWZpbmUgU0VBUkNIX01TRyAgICAweDBjICAvKiBnaXZlIG1lc3NhZ2VzICh5ZXMsIGl0J3Mgbm90IDB4MDQpICovCisjZGVmaW5lIFNFQVJDSF9ORk1TRyAgMHgwOCAgLyogZ2l2ZSBhbGwgbWVzc2FnZXMgZXhjZXB0IG5vdCBmb3VuZCAqLworI2RlZmluZSBTRUFSQ0hfT1BUICAgIDB4MTAgIC8qIGludGVycHJldCBvcHRpb25hbCBmbGFncyAqLworI2RlZmluZSBTRUFSQ0hfSElTICAgIDB4MjAgIC8qIHB1dCBzZWFyY2ggcGF0dGVybiBpbiBoaXN0b3J5ICovCisjZGVmaW5lIFNFQVJDSF9FTkQgICAgMHg0MCAgLyogcHV0IGN1cnNvciBhdCBlbmQgb2YgbWF0Y2ggKi8KKyNkZWZpbmUgU0VBUkNIX05PT0YgICAweDgwICAvKiBkb24ndCBhZGQgb2Zmc2V0IHRvIHBvc2l0aW9uICovCisjZGVmaW5lIFNFQVJDSF9TVEFSVCAweDEwMCAgLyogc3RhcnQgc2VhcmNoIHdpdGhvdXQgY29sIG9mZnNldCAqLworI2RlZmluZSBTRUFSQ0hfTUFSSyAgMHgyMDAgIC8qIHNldCBwcmV2aW91cyBjb250ZXh0IG1hcmsgKi8KKyNkZWZpbmUgU0VBUkNIX0tFRVAgIDB4NDAwICAvKiBrZWVwIHByZXZpb3VzIHNlYXJjaCBwYXR0ZXJuICovCisjZGVmaW5lIFNFQVJDSF9QRUVLICAweDgwMCAgLyogcGVlayBmb3IgdHlwZWQgY2hhciwgY2FuY2VsIHNlYXJjaCAqLworCisvKiBWYWx1ZXMgZm9yIGZpbmRfaWRlbnRfdW5kZXJfY3Vyc29yKCkgKi8KKyNkZWZpbmUgRklORF9JREVOVAkxCS8qIGZpbmQgaWRlbnRpZmllciAod29yZCkgKi8KKyNkZWZpbmUgRklORF9TVFJJTkcJMgkvKiBmaW5kIGFueSBzdHJpbmcgKFdPUkQpICovCisjZGVmaW5lIEZJTkRfRVZBTAk0CS8qIGluY2x1ZGUgIi0+IiwgIltdIiBhbmQgIi4iICovCisKKy8qIFZhbHVlcyBmb3IgZmlsZV9uYW1lX2luX2xpbmUoKSAqLworI2RlZmluZSBGTkFNRV9NRVNTCTEJLyogZ2l2ZSBlcnJvciBtZXNzYWdlICovCisjZGVmaW5lIEZOQU1FX0VYUAkyCS8qIGV4cGFuZCB0byBwYXRoICovCisjZGVmaW5lIEZOQU1FX0hZUAk0CS8qIGNoZWNrIGZvciBoeXBlcnRleHQgbGluayAqLworI2RlZmluZSBGTkFNRV9JTkNMCTgJLyogYXBwbHkgJ2luY2x1ZGVleHByJyAqLworI2RlZmluZSBGTkFNRV9SRUwJMTYJLyogIi4uIiBhbmQgIi4vIiBhcmUgcmVsYXRpdmUgdG8gdGhlIChjdXJyZW50KQorCQkJCSAgIGZpbGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKworLyogVmFsdWVzIGZvciBidWZsaXN0X2dldGZpbGUoKSAqLworI2RlZmluZSBHRVRGX1NFVE1BUksJMHgwMQkvKiBzZXQgcGNtYXJrIGJlZm9yZSBqdW1waW5nICovCisjZGVmaW5lIEdFVEZfQUxUCTB4MDIJLyoganVtcGluZyB0byBhbHRlcm5hdGUgZmlsZSAobm90IGJ1ZiBudW0pICovCisjZGVmaW5lIEdFVEZfU1dJVENICTB4MDQJLyogcmVzcGVjdCAnc3dpdGNoYnVmJyBzZXR0aW5ncyB3aGVuIGp1bXBpbmcgKi8KKworLyogVmFsdWVzIGZvciBidWZsaXN0X25ldygpIGZsYWdzICovCisjZGVmaW5lIEJMTl9DVVJCVUYJMQkvKiBNYXkgcmUtdXNlIGN1cmJ1ZiBmb3IgbmV3IGJ1ZmZlciAqLworI2RlZmluZSBCTE5fTElTVEVECTIJLyogUHV0IG5ldyBidWZmZXIgaW4gYnVmZmVyIGxpc3QgKi8KKyNkZWZpbmUgQkxOX0RVTU1ZCTQJLyogQWxsb2NhdGluZyBkdW1teSBidWZmZXIgKi8KKyNkZWZpbmUgQkxOX0ZPUkNFCTgJLyogRG9uJ3QgYWJvcnQgb24gZXJyb3IgKi8KKworLyogVmFsdWVzIGZvciBpbl9jaW5rZXlzKCkgKi8KKyNkZWZpbmUgS0VZX09QRU5fRk9SVwkweDEwMQorI2RlZmluZSBLRVlfT1BFTl9CQUNLCTB4MTAyCisjZGVmaW5lIEtFWV9DT01QTEVURQkweDEwMwkvKiBlbmQgb2YgY29tcGxldGlvbiAqLworCisvKiBWYWx1ZXMgZm9yICJub3JlbWFwIiBhcmd1bWVudCBvZiBpbnNfdHlwZWJ1ZigpLiAgQWxzbyB1c2VkIGZvcgorICogbWFwLT5tX25vcmVtYXAgYW5kIG1lbnUtPm5vcmVtYXBbXS4gKi8KKyNkZWZpbmUgUkVNQVBfWUVTCTAJLyogYWxsb3cgcmVtYXBwaW5nICovCisjZGVmaW5lIFJFTUFQX05PTkUJLTEJLyogbm8gcmVtYXBwaW5nICovCisjZGVmaW5lIFJFTUFQX1NDUklQVAktMgkvKiByZW1hcCBzY3JpcHQtbG9jYWwgbWFwcGluZ3Mgb25seSAqLworCisvKiBWYWx1ZXMgZm9yIG1jaF9jYWxsX3NoZWxsKCkgc2Vjb25kIGFyZ3VtZW50ICovCisjZGVmaW5lIFNIRUxMX0ZJTFRFUgkxCS8qIGZpbHRlcmluZyB0ZXh0ICovCisjZGVmaW5lIFNIRUxMX0VYUEFORAkyCS8qIGV4cGFuZGluZyB3aWxkY2FyZHMgKi8KKyNkZWZpbmUgU0hFTExfQ09PS0VECTQJLyogc2V0IHRlcm0gdG8gY29va2VkIG1vZGUgKi8KKyNkZWZpbmUgU0hFTExfRE9PVVQJOAkvKiByZWRpcmVjdGluZyBvdXRwdXQgKi8KKyNkZWZpbmUgU0hFTExfU0lMRU5UCTE2CS8qIGRvbid0IHByaW50IGVycm9yIHJldHVybmVkIGJ5IGNvbW1hbmQgKi8KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IG1jaF9ub2RldHlwZSgpICovCisjZGVmaW5lIE5PREVfTk9STUFMCTAJLyogZmlsZSBvciBkaXJlY3RvcnksIGNoZWNrIHdpdGggbWNoX2lzZGlyKCkqLworI2RlZmluZSBOT0RFX1dSSVRBQkxFCTEJLyogc29tZXRoaW5nIHdlIGNhbiB3cml0ZSB0byAoY2hhcmFjdGVyCisJCQkJICAgZGV2aWNlLCBmaWZvLCBzb2NrZXQsIC4uKSAqLworI2RlZmluZSBOT0RFX09USEVSCTIJLyogbm9uLXdyaXRhYmxlIHRoaW5nIChlLmcuLCBibG9jayBkZXZpY2UpICovCisKKy8qIFZhbHVlcyBmb3IgcmVhZGZpbGUoKSBmbGFncyAqLworI2RlZmluZSBSRUFEX05FVwkweDAxCS8qIHJlYWQgYSBmaWxlIGludG8gYSBuZXcgYnVmZmVyICovCisjZGVmaW5lIFJFQURfRklMVEVSCTB4MDIJLyogcmVhZCBmaWx0ZXIgb3V0cHV0ICovCisjZGVmaW5lIFJFQURfU1RESU4JMHgwNAkvKiByZWFkIGZyb20gc3RkaW4gKi8KKyNkZWZpbmUgUkVBRF9CVUZGRVIJMHgwOAkvKiByZWFkIGZyb20gY3VyYnVmIChjb252ZXJ0aW5nIHN0ZGluKSAqLworI2RlZmluZSBSRUFEX0RVTU1ZCTB4MTAJLyogcmVhZGluZyBpbnRvIGEgZHVtbXkgYnVmZmVyICovCisKKy8qIFZhbHVlcyBmb3IgY2hhbmdlX2luZGVudCgpICovCisjZGVmaW5lIElOREVOVF9TRVQJMQkvKiBzZXQgaW5kZW50ICovCisjZGVmaW5lIElOREVOVF9JTkMJMgkvKiBpbmNyZWFzZSBpbmRlbnQgKi8KKyNkZWZpbmUgSU5ERU5UX0RFQwkzCS8qIGRlY3JlYXNlIGluZGVudCAqLworCisvKiBWYWx1ZXMgZm9yIGZsYWdzIGFyZ3VtZW50IGZvciBmaW5kbWF0Y2hsaW1pdCgpICovCisjZGVmaW5lIEZNX0JBQ0tXQVJECTB4MDEJLyogc2VhcmNoIGJhY2t3YXJkcyAqLworI2RlZmluZSBGTV9GT1JXQVJECTB4MDIJLyogc2VhcmNoIGZvcndhcmRzICovCisjZGVmaW5lIEZNX0JMT0NLU1RPUAkweDA0CS8qIHN0b3AgYXQgc3RhcnQvZW5kIG9mIGJsb2NrICovCisjZGVmaW5lIEZNX1NLSVBDT01NCTB4MDgJLyogc2tpcCBjb21tZW50cyAqLworCisvKiBWYWx1ZXMgZm9yIGFjdGlvbiBhcmd1bWVudCBmb3IgZG9fYnVmZmVyKCkgKi8KKyNkZWZpbmUgRE9CVUZfR09UTwkwCS8qIGdvIHRvIHNwZWNpZmllZCBidWZmZXIgKi8KKyNkZWZpbmUgRE9CVUZfU1BMSVQJMQkvKiBzcGxpdCB3aW5kb3cgYW5kIGdvIHRvIHNwZWNpZmllZCBidWZmZXIgKi8KKyNkZWZpbmUgRE9CVUZfVU5MT0FECTIJLyogdW5sb2FkIHNwZWNpZmllZCBidWZmZXIocykgKi8KKyNkZWZpbmUgRE9CVUZfREVMCTMJLyogZGVsZXRlIHNwZWNpZmllZCBidWZmZXIocykgZnJvbSBidWZsaXN0ICovCisjZGVmaW5lIERPQlVGX1dJUEUJNAkvKiBkZWxldGUgc3BlY2lmaWVkIGJ1ZmZlcihzKSByZWFsbHkgKi8KKworLyogVmFsdWVzIGZvciBzdGFydCBhcmd1bWVudCBmb3IgZG9fYnVmZmVyKCkgKi8KKyNkZWZpbmUgRE9CVUZfQ1VSUkVOVAkwCS8qICJjb3VudCIgYnVmZmVyIGZyb20gY3VycmVudCBidWZmZXIgKi8KKyNkZWZpbmUgRE9CVUZfRklSU1QJMQkvKiAiY291bnQiIGJ1ZmZlciBmcm9tIGZpcnN0IGJ1ZmZlciAqLworI2RlZmluZSBET0JVRl9MQVNUCTIJLyogImNvdW50IiBidWZmZXIgZnJvbSBsYXN0IGJ1ZmZlciAqLworI2RlZmluZSBET0JVRl9NT0QJMwkvKiAiY291bnQiIG1vZC4gYnVmZmVyIGZyb20gY3VycmVudCBidWZmZXIgKi8KKworLyogVmFsdWVzIGZvciBzdWJfY21kIGFuZCB3aGljaF9wYXQgYXJndW1lbnQgZm9yIHNlYXJjaF9yZWdjb21wKCkgKi8KKy8qIEFsc28gdXNlZCBmb3Igd2hpY2hfcGF0IGFyZ3VtZW50IGZvciBzZWFyY2hpdCgpICovCisjZGVmaW5lIFJFX1NFQVJDSAkwCS8qIHNhdmUvdXNlIHBhdCBpbi9mcm9tIHNlYXJjaF9wYXR0ZXJuICovCisjZGVmaW5lIFJFX1NVQlNUCTEJLyogc2F2ZS91c2UgcGF0IGluL2Zyb20gc3Vic3RfcGF0dGVybiAqLworI2RlZmluZSBSRV9CT1RICQkyCS8qIHNhdmUgcGF0IGluIGJvdGggcGF0dGVybnMgKi8KKyNkZWZpbmUgUkVfTEFTVAkJMgkvKiB1c2UgbGFzdCB1c2VkIHBhdHRlcm4gaWYgInBhdCIgaXMgTlVMTCAqLworCisvKiBTZWNvbmQgYXJndW1lbnQgZm9yIHZpbV9yZWdjb21wKCkuICovCisjZGVmaW5lIFJFX01BR0lDCTEJLyogJ21hZ2ljJyBvcHRpb24gKi8KKyNkZWZpbmUgUkVfU1RSSU5HCTIJLyogbWF0Y2ggaW4gc3RyaW5nIGluc3RlYWQgb2YgYnVmZmVyIHRleHQgKi8KKworI2lmZGVmIEZFQVRfU1lOX0hMCisvKiB2YWx1ZXMgZm9yIHJlZ19kb19leHRtYXRjaCAqLworIyBkZWZpbmUgUkVYX1NFVAkxCS8qIHRvIGFsbG93IFx6XCguLi5cKSwgKi8KKyMgZGVmaW5lIFJFWF9VU0UJMgkvKiB0byBhbGxvdyBcelwxIGV0IGFsLiAqLworI2VuZGlmCisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGZ1bGxwYXRoY21wKCkgKi8KKy8qIE5vdGU6IGNhbiB1c2UgKGZ1bGxwYXRoY21wKCkgJiBGUENfU0FNRSkgdG8gY2hlY2sgZm9yIGVxdWFsIGZpbGVzICovCisjZGVmaW5lIEZQQ19TQU1FCTEJLyogYm90aCBleGlzdCBhbmQgYXJlIHRoZSBzYW1lIGZpbGUuICovCisjZGVmaW5lIEZQQ19ESUZGCTIJLyogYm90aCBleGlzdCBhbmQgYXJlIGRpZmZlcmVudCBmaWxlcy4gKi8KKyNkZWZpbmUgRlBDX05PVFgJNAkvKiBib3RoIGRvbid0IGV4aXN0LiAqLworI2RlZmluZSBGUENfRElGRlgJNgkvKiBvbmUgb2YgdGhlbSBkb2Vzbid0IGV4aXN0LiAqLworI2RlZmluZSBGUENfU0FNRVgJNwkvKiBib3RoIGRvbid0IGV4aXN0IGFuZCBmaWxlIG5hbWVzIGFyZSBzYW1lLiAqLworCisvKiBmbGFncyBmb3IgZG9fZWNtZCgpICovCisjZGVmaW5lIEVDTURfSElERQkweDAxCS8qIGRvbid0IGZyZWUgdGhlIGN1cnJlbnQgYnVmZmVyICovCisjZGVmaW5lIEVDTURfU0VUX0hFTFAJMHgwMgkvKiBzZXQgYl9oZWxwIGZsYWcgb2YgKG5ldykgYnVmZmVyIGJlZm9yZQorCQkJCSAgIG9wZW5pbmcgZmlsZSAqLworI2RlZmluZSBFQ01EX09MREJVRgkweDA0CS8qIHVzZSBleGlzdGluZyBidWZmZXIgaWYgaXQgZXhpc3RzICovCisjZGVmaW5lIEVDTURfRk9SQ0VJVAkweDA4CS8qICEgdXNlZCBpbiBFeCBjb21tYW5kICovCisjZGVmaW5lIEVDTURfQUREQlVGCTB4MTAJLyogZG9uJ3QgZWRpdCwganVzdCBhZGQgdG8gYnVmZmVyIGxpc3QgKi8KKworLyogZm9yIGxudW0gYXJndW1lbnQgaW4gZG9fZWNtZCgpICovCisjZGVmaW5lIEVDTURfTEFTVEwJKGxpbmVucl9UKTAJLyogdXNlIGxhc3QgcG9zaXRpb24gaW4gbG9hZGVkIGZpbGUgKi8KKyNkZWZpbmUgRUNNRF9MQVNUCShsaW5lbnJfVCktMQkvKiB1c2UgbGFzdCBwb3NpdGlvbiBpbiBhbGwgZmlsZXMgKi8KKyNkZWZpbmUgRUNNRF9PTkUJKGxpbmVucl9UKTEJLyogdXNlIGZpcnN0IGxpbmUgKi8KKworLyogZmxhZ3MgZm9yIGRvX2NtZGxpbmUoKSAqLworI2RlZmluZSBET0NNRF9WRVJCT1NFCTB4MDEJLyogaW5jbHVkZWQgY29tbWFuZCBpbiBlcnJvciBtZXNzYWdlICovCisjZGVmaW5lIERPQ01EX05PV0FJVAkweDAyCS8qIGRvbid0IGNhbGwgd2FpdF9yZXR1cm4oKSBhbmQgZnJpZW5kcyAqLworI2RlZmluZSBET0NNRF9SRVBFQVQJMHgwNAkvKiByZXBlYXQgZXhlYy4gdW50aWwgZ2V0bGluZSgpIHJldHVybnMgTlVMTCAqLworI2RlZmluZSBET0NNRF9LRVlUWVBFRAkweDA4CS8qIGRvbid0IHJlc2V0IEtleVR5cGVkICovCisjZGVmaW5lIERPQ01EX0VYQ1JFU0VUCTB4MTAJLyogcmVzZXQgZXhjZXB0aW9uIGVudmlyb25tZW50IChmb3IgZGVidWdnaW5nKSovCisjZGVmaW5lIERPQ01EX0tFRVBMSU5FICAweDIwCS8qIGtlZXAgdHlwZWQgbGluZSBmb3IgcmVwZWF0aW5nIHdpdGggIi4iICovCisKKy8qIGZsYWdzIGZvciBiZWdpbmxpbmUoKSAqLworI2RlZmluZSBCTF9XSElURQkxCS8qIGN1cnNvciBvbiBmaXJzdCBub24td2hpdGUgaW4gdGhlIGxpbmUgKi8KKyNkZWZpbmUgQkxfU09MCQkyCS8qIHVzZSAnc29sJyBvcHRpb24gKi8KKyNkZWZpbmUgQkxfRklYCQk0CS8qIGRvbid0IGxlYXZlIGN1cnNvciBvbiBhIE5VTCAqLworCisvKiBmbGFncyBmb3IgbWZfc3luYygpICovCisjZGVmaW5lIE1GU19BTEwJCTEJLyogYWxzbyBzeW5jIGJsb2NrcyB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgKi8KKyNkZWZpbmUgTUZTX1NUT1AJMgkvKiBzdG9wIHN5bmNpbmcgd2hlbiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUZTX0ZMVVNICTQJLyogZmx1c2hlZCBmaWxlIHRvIGRpc2sgKi8KKyNkZWZpbmUgTUZTX1pFUk8JOAkvKiBvbmx5IHdyaXRlIGJsb2NrIDAgKi8KKworLyogZmxhZ3MgZm9yIGJ1Zl9jb3B5X29wdGlvbnMoKSAqLworI2RlZmluZSBCQ09fRU5URVIJMQkvKiBnb2luZyB0byBlbnRlciB0aGUgYnVmZmVyICovCisjZGVmaW5lIEJDT19BTFdBWVMJMgkvKiBhbHdheXMgY29weSB0aGUgb3B0aW9ucyAqLworI2RlZmluZSBCQ09fTk9IRUxQCTQJLyogZG9uJ3QgdG91Y2ggdGhlIGhlbHAgcmVsYXRlZCBvcHRpb25zICovCisKKy8qIGZsYWdzIGZvciBkb19wdXQoKSAqLworI2RlZmluZSBQVVRfRklYSU5ERU5UCTEJLyogbWFrZSBpbmRlbnQgbG9vayBuaWNlICovCisjZGVmaW5lIFBVVF9DVVJTRU5ECTIJLyogbGVhdmUgY3Vyc29yIGFmdGVyIGVuZCBvZiBuZXcgdGV4dCAqLworI2RlZmluZSBQVVRfTElORQk0CS8qIHB1dCByZWdpc3RlciBhcyBsaW5lcyAqLworI2RlZmluZSBQVVRfTElORV9TUExJVAk4CS8qIHNwbGl0IGxpbmUgZm9yIGxpbmV3aXNlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBVVF9MSU5FX0ZPUldBUkQgMTYJLyogcHV0IGxpbmV3aXNlIHJlZ2lzdGVyIGJlbG93IFZpc3VhbCBzZWwuICovCisKKy8qIGZsYWdzIGZvciBzZXRfaW5kZW50KCkgKi8KKyNkZWZpbmUgU0lOX0NIQU5HRUQJMQkvKiBjYWxsIGNoYW5nZWRfYnl0ZXMoKSB3aGVuIGxpbmUgY2hhbmdlZCAqLworI2RlZmluZSBTSU5fSU5TRVJUCTIJLyogaW5zZXJ0IGluZGVudCBiZWZvcmUgZXhpc3RpbmcgdGV4dCAqLworI2RlZmluZSBTSU5fVU5ETwk0CS8qIHNhdmUgbGluZSBmb3IgdW5kbyBiZWZvcmUgY2hhbmdpbmcgaXQgKi8KKworLyogZmxhZ3MgZm9yIGluc2VydGNoYXIoKSAqLworI2RlZmluZSBJTlNDSEFSX0ZPUk1BVAkxCS8qIGZvcmNlIGZvcm1hdHRpbmcgKi8KKyNkZWZpbmUgSU5TQ0hBUl9ET19DT00JMgkvKiBmb3JtYXQgY29tbWVudHMgKi8KKyNkZWZpbmUgSU5TQ0hBUl9DVFJMVgk0CS8qIGNoYXIgdHlwZWQganVzdCBhZnRlciBDVFJMLVYgKi8KKworLyogZmxhZ3MgZm9yIG9wZW5fbGluZSgpICovCisjZGVmaW5lIE9QRU5MSU5FX0RFTFNQQUNFUyAgMQkvKiBkZWxldGUgc3BhY2VzIGFmdGVyIGN1cnNvciAqLworI2RlZmluZSBPUEVOTElORV9ET19DT00JICAgIDIJLyogZm9ybWF0IGNvbW1lbnRzICovCisjZGVmaW5lIE9QRU5MSU5FX0tFRVBUUkFJTCAgNAkvKiBrZWVwIHRyYWlsaW5nIHNwYWNlcyAqLworI2RlZmluZSBPUEVOTElORV9NQVJLRklYICAgIDgJLyogZml4IG1hcmsgcG9zaXRpb25zICovCisKKy8qCisgKiBUaGVyZSBhcmUgZm91ciBoaXN0b3J5IHRhYmxlczoKKyAqLworI2RlZmluZSBISVNUX0NNRAkwCS8qIGNvbG9uIGNvbW1hbmRzICovCisjZGVmaW5lIEhJU1RfU0VBUkNICTEJLyogc2VhcmNoIGNvbW1hbmRzICovCisjZGVmaW5lIEhJU1RfRVhQUgkyCS8qIGV4cHJlc3Npb25zIChmcm9tIGVudGVyaW5nID0gcmVnaXN0ZXIpICovCisjZGVmaW5lIEhJU1RfSU5QVVQJMwkvKiBpbnB1dCgpIGxpbmVzICovCisjZGVmaW5lIEhJU1RfREVCVUcJNAkvKiBkZWJ1ZyBjb21tYW5kcyAqLworI2RlZmluZSBISVNUX0NPVU5UCTUJLyogbnVtYmVyIG9mIGhpc3RvcnkgdGFibGVzICovCisKKy8qCisgKiBGbGFncyBmb3IgY2hhcnRhYltdLgorICovCisjZGVmaW5lIENUX0NFTExfTUFTSwkweDA3CS8qIG1hc2s6IG5yIG9mIGRpc3BsYXkgY2VsbHMgKDEsIDIgb3IgNCkgKi8KKyNkZWZpbmUgQ1RfUFJJTlRfQ0hBUgkweDEwCS8qIGZsYWc6IHNldCBmb3IgcHJpbnRhYmxlIGNoYXJzICovCisjZGVmaW5lIENUX0lEX0NIQVIJMHgyMAkvKiBmbGFnOiBzZXQgZm9yIElEIGNoYXJzICovCisjZGVmaW5lIENUX0ZOQU1FX0NIQVIJMHg0MAkvKiBmbGFnOiBzZXQgZm9yIGZpbGUgbmFtZSBjaGFycyAqLworCisvKgorICogVmFsdWVzIGZvciBkb190YWcoKS4KKyAqLworI2RlZmluZSBEVF9UQUcJCTEJLyoganVtcCB0byBuZXdlciBwb3NpdGlvbiBvciBzYW1lIHRhZyBhZ2FpbiAqLworI2RlZmluZSBEVF9QT1AJCTIJLyoganVtcCB0byBvbGRlciBwb3NpdGlvbiAqLworI2RlZmluZSBEVF9ORVhUCQkzCS8qIGp1bXAgdG8gbmV4dCBtYXRjaCBvZiBzYW1lIHRhZyAqLworI2RlZmluZSBEVF9QUkVWCQk0CS8qIGp1bXAgdG8gcHJldmlvdXMgbWF0Y2ggb2Ygc2FtZSB0YWcgKi8KKyNkZWZpbmUgRFRfRklSU1QJNQkvKiBqdW1wIHRvIGZpcnN0IG1hdGNoIG9mIHNhbWUgdGFnICovCisjZGVmaW5lIERUX0xBU1QJCTYJLyoganVtcCB0byBmaXJzdCBtYXRjaCBvZiBzYW1lIHRhZyAqLworI2RlZmluZSBEVF9TRUxFQ1QJNwkvKiBqdW1wIHRvIHNlbGVjdGlvbiBmcm9tIGxpc3QgKi8KKyNkZWZpbmUgRFRfSEVMUAkJOAkvKiBsaWtlIERUX1RBRywgYnV0IG5vIHdpbGRjYXJkcyAqLworI2RlZmluZSBEVF9KVU1QCQk5CS8qIGp1bXAgdG8gbmV3IHRhZyBvciBzZWxlY3Rpb24gZnJvbSBsaXN0ICovCisjZGVmaW5lIERUX0NTQ09QRQkxMAkvKiBjc2NvcGUgZmluZCBjb21tYW5kIChsaWtlIHRqdW1wKSAqLworCisvKgorICogZmxhZ3MgZm9yIGZpbmRfdGFncygpLgorICovCisjZGVmaW5lIFRBR19IRUxQCTEJLyogb25seSBzZWFyY2ggZm9yIGhlbHAgdGFncyAqLworI2RlZmluZSBUQUdfTkFNRVMJMgkvKiBvbmx5IHJldHVybiBuYW1lIG9mIHRhZyAqLworI2RlZmluZQlUQUdfUkVHRVhQCTQJLyogdXNlIHRhZyBwYXR0ZXJuIGFzIHJlZ2V4cCAqLworI2RlZmluZQlUQUdfTk9JQwk4CS8qIGRvbid0IGFsd2F5cyBpZ25vcmUgY2FzZSAqLworI2lmZGVmIEZFQVRfQ1NDT1BFCisjIGRlZmluZSBUQUdfQ1NDT1BFCTE2CS8qIGNzY29wZSB0YWcgKi8KKyNlbmRpZgorI2RlZmluZSBUQUdfVkVSQk9TRQkzMgkvKiBtZXNzYWdlIHZlcmJvc2l0eSAqLworI2RlZmluZSBUQUdfSU5TX0NPTVAJNjQJLyogQ3VycmVudGx5IGRvaW5nIGluc2VydCBjb21wbGV0aW9uICovCisjZGVmaW5lIFRBR19LRUVQX0xBTkcJMTI4CS8qIGtlZXAgY3VycmVudCBsYW5ndWFnZSAqLworCisjZGVmaW5lIFRBR19NQU5ZCTIwMAkvKiBXaGVuIGZpbmRpbmcgbWFueSB0YWdzIChmb3IgY29tcGxldGlvbiksCisJCQkJICAgZmluZCB1cCB0byB0aGlzIG1hbnkgdGFncyAqLworCisvKgorICogVHlwZXMgb2YgZGlhbG9ncyBwYXNzZWQgdG8gZG9fdmltX2RpYWxvZygpLgorICovCisjZGVmaW5lIFZJTV9HRU5FUklDCTAKKyNkZWZpbmUgVklNX0VSUk9SCTEKKyNkZWZpbmUgVklNX1dBUk5JTkcJMgorI2RlZmluZSBWSU1fSU5GTwkzCisjZGVmaW5lIFZJTV9RVUVTVElPTgk0CisjZGVmaW5lIFZJTV9MQVNUX1RZUEUJNAkvKiBzZW50aW5lbCB2YWx1ZSAqLworCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGxpa2UgZ3VpX3llc25vY2FuY2VsKCkKKyAqLworI2RlZmluZSBWSU1fT0sJCTEKKyNkZWZpbmUgVklNX1lFUwkJMgorI2RlZmluZSBWSU1fTk8JCTMKKyNkZWZpbmUgVklNX0NBTkNFTAk0CisjZGVmaW5lIFZJTV9BTEwJCTUKKyNkZWZpbmUgVklNX0RJU0NBUkRBTEwgIDYKKworLyoKKyAqIGFyZ3VtZW50cyBmb3Igd2luX3NwbGl0KCkKKyAqLworI2RlZmluZSBXU1BfUk9PTQkxCS8qIHJlcXVpcmUgZW5vdWdoIHJvb20gKi8KKyNkZWZpbmUgV1NQX1ZFUlQJMgkvKiBzcGxpdCB2ZXJ0aWNhbGx5ICovCisjZGVmaW5lIFdTUF9UT1AJCTQJLyogd2luZG93IGF0IHRvcC1sZWZ0IG9mIHNoZWxsICovCisjZGVmaW5lIFdTUF9CT1QJCTgJLyogd2luZG93IGF0IGJvdHRvbS1yaWdodCBvZiBzaGVsbCAqLworI2RlZmluZSBXU1BfSEVMUAkxNgkvKiBjcmVhdGluZyB0aGUgaGVscCB3aW5kb3cgKi8KKyNkZWZpbmUgV1NQX0JFTE9XCTMyCS8qIHB1dCBuZXcgd2luZG93IGJlbG93L3JpZ2h0ICovCisjZGVmaW5lIFdTUF9BQk9WRQk2NAkvKiBwdXQgbmV3IHdpbmRvdyBhYm92ZS9sZWZ0ICovCisKKy8qCisgKiAiZmxhZ3MiIHZhbHVlcyBmb3Igb3B0aW9uLXNldHRpbmcgZnVuY3Rpb25zLgorICogV2hlbiBPUFRfR0xPQkFMIGFuZCBPUFRfTE9DQUwgYXJlIGJvdGggbWlzc2luZywgc2V0IGJvdGggbG9jYWwgYW5kIGdsb2JhbAorICogdmFsdWVzLCBnZXQgbG9jYWwgdmFsdWUuCisgKi8KKyNkZWZpbmUgT1BUX0ZSRUUJMQkvKiBmcmVlIG9sZCB2YWx1ZSBpZiBpdCB3YXMgYWxsb2NhdGVkICovCisjZGVmaW5lIE9QVF9HTE9CQUwJMgkvKiB1c2UgZ2xvYmFsIHZhbHVlICovCisjZGVmaW5lIE9QVF9MT0NBTAk0CS8qIHVzZSBsb2NhbCB2YWx1ZSAqLworI2RlZmluZSBPUFRfTU9ERUxJTkUJOAkvKiBvcHRpb24gaW4gbW9kZWxpbmUgKi8KKworLyogTWFnaWMgY2hhcnMgdXNlZCBpbiBjb25maXJtIGRpYWxvZyBzdHJpbmdzICovCisjZGVmaW5lIERMR19CVVRUT05fU0VQCSdcbicKKyNkZWZpbmUgRExHX0hPVEtFWV9DSEFSCScmJworCisvKiBWYWx1ZXMgZm9yICJzdGFydGluZyIgKi8KKyNkZWZpbmUgTk9fU0NSRUVOCTIJLyogbm8gc2NyZWVuIHVwZGF0aW5nIHlldCAqLworI2RlZmluZSBOT19CVUZGRVJTCTEJLyogbm90IGFsbCBidWZmZXJzIGxvYWRlZCB5ZXQgKi8KKy8qCQkJMAkgICBub3Qgc3RhcnRpbmcgYW55bW9yZSAqLworCisvKiBWYWx1ZXMgZm9yIHN3YXBfZXhpc3RzX2FjdGlvbjogd2hhdCB0byBkbyB3aGVuIHN3YXAgZmlsZSBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBTRUFfTk9ORQkwCS8qIGRvbid0IHVzZSBkaWFsb2cgKi8KKyNkZWZpbmUgU0VBX0RJQUxPRwkxCS8qIHVzZSBkaWFsb2cgd2hlbiAqLworI2RlZmluZSBTRUFfUVVJVAkyCS8qIHF1aXQgZWRpdGluZyB0aGUgZmlsZSAqLworI2RlZmluZSBTRUFfUkVDT1ZFUgkzCS8qIHJlY292ZXIgdGhlIGZpbGUgKi8KKworLyoKKyAqIE1pbmltYWwgc2l6ZSBmb3IgYmxvY2sgMCBvZiBhIHN3YXAgZmlsZS4KKyAqIE5PVEU6IFRoaXMgZGVwZW5kcyBvbiBzaXplIG9mIHN0cnVjdCBibG9jazAhIEl0J3Mgbm90IGRvbmUgd2l0aCBhIHNpemVvZigpLAorICogYmVjYXVzZSBzdHJ1Y3QgYmxvY2swIGlzIGRlZmluZWQgaW4gbWVtbGluZS5jIChTb3JyeSkuCisgKiBUaGUgbWF4aW1hbCBibG9jayBzaXplIGlzIGFyYml0cmFyeS4KKyAqLworI2RlZmluZSBNSU5fU1dBUF9QQUdFX1NJWkUgMTA0OAorI2RlZmluZSBNQVhfU1dBUF9QQUdFX1NJWkUgNTAwMDAKKworLyogU3BlY2lhbCB2YWx1ZXMgZm9yIGN1cnJlbnRfU0lELiAqLworI2RlZmluZSBTSURfTU9ERUxJTkUJLTEJLyogd2hlbiB1c2luZyBhIG1vZGVsaW5lICovCisjZGVmaW5lIFNJRF9DTURBUkcJLTIJLyogZm9yICItLWNtZCIgYXJndW1lbnQgKi8KKyNkZWZpbmUgU0lEX0NBUkcJLTMJLyogZm9yICItYyIgYXJndW1lbnQgKi8KKyNkZWZpbmUgU0lEX0VOVgkJLTQJLyogZm9yIHNvdXJjaW5nIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKy8qCisgKiBFdmVudHMgZm9yIGF1dG9jb21tYW5kcy4KKyAqLworZW51bSBhdXRvX2V2ZW50Cit7CisgICAgRVZFTlRfQlVGQUREID0gMCwJCS8qIGFmdGVyIGFkZGluZyBhIGJ1ZmZlciB0byB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgICBFVkVOVF9CVUZORVcsCQkvKiBhZnRlciBjcmVhdGluZyBhbnkgYnVmZmVyICovCisgICAgRVZFTlRfQlVGREVMRVRFLAkJLyogZGVsZXRpbmcgYSBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgICBFVkVOVF9CVUZXSVBFT1VULAkJLyoganVzdCBiZWZvcmUgcmVhbGx5IGRlbGV0aW5nIGEgYnVmZmVyICovCisgICAgRVZFTlRfQlVGRU5URVIsCQkvKiBhZnRlciBlbnRlcmluZyBhIGJ1ZmZlciAqLworICAgIEVWRU5UX0JVRkZJTEVQT1NULAkJLyogYWZ0ZXIgcmVuYW1pbmcgYSBidWZmZXIgKi8KKyAgICBFVkVOVF9CVUZGSUxFUFJFLAkJLyogYmVmb3JlIHJlbmFtaW5nIGEgYnVmZmVyICovCisgICAgRVZFTlRfQlVGTEVBVkUsCQkvKiBiZWZvcmUgbGVhdmluZyBhIGJ1ZmZlciAqLworICAgIEVWRU5UX0JVRk5FV0ZJTEUsCQkvKiB3aGVuIGNyZWF0aW5nIGEgYnVmZmVyIGZvciBhIG5ldyBmaWxlICovCisgICAgRVZFTlRfQlVGUkVBRFBPU1QsCQkvKiBhZnRlciByZWFkaW5nIGEgYnVmZmVyICovCisgICAgRVZFTlRfQlVGUkVBRFBSRSwJCS8qIGJlZm9yZSByZWFkaW5nIGEgYnVmZmVyICovCisgICAgRVZFTlRfQlVGUkVBRENNRCwJCS8qIHJlYWQgYnVmZmVyIHVzaW5nIGNvbW1hbmQgKi8KKyAgICBFVkVOVF9CVUZVTkxPQUQsCQkvKiBqdXN0IGJlZm9yZSB1bmxvYWRpbmcgYSBidWZmZXIgKi8KKyAgICBFVkVOVF9CVUZISURERU4sCQkvKiBqdXN0IGFmdGVyIGJ1ZmZlciBiZWNvbWVzIGhpZGRlbiAqLworICAgIEVWRU5UX0JVRldJTkVOVEVSLAkJLyogYWZ0ZXIgc2hvd2luZyBhIGJ1ZmZlciBpbiBhIHdpbmRvdyAqLworICAgIEVWRU5UX0JVRldJTkxFQVZFLAkJLyoganVzdCBhZnRlciBidWZmZXIgcmVtb3ZlZCBmcm9tIHdpbmRvdyAqLworICAgIEVWRU5UX0JVRldSSVRFUE9TVCwJCS8qIGFmdGVyIHdyaXRpbmcgYSBidWZmZXIgKi8KKyAgICBFVkVOVF9CVUZXUklURVBSRSwJCS8qIGJlZm9yZSB3cml0aW5nIGEgYnVmZmVyICovCisgICAgRVZFTlRfQlVGV1JJVEVDTUQsCQkvKiB3cml0ZSBidWZmZXIgdXNpbmcgY29tbWFuZCAqLworICAgIEVWRU5UX0NNRFdJTkVOVEVSLAkJLyogYWZ0ZXIgZW50ZXJpbmcgdGhlIGNtZGxpbmUgd2luZG93ICovCisgICAgRVZFTlRfQ01EV0lOTEVBVkUsCQkvKiBiZWZvcmUgbGVhdmluZyB0aGUgY21kbGluZSB3aW5kb3cgKi8KKyAgICBFVkVOVF9GSUxFQVBQRU5EUE9TVCwJLyogYWZ0ZXIgYXBwZW5kaW5nIHRvIGEgZmlsZSAqLworICAgIEVWRU5UX0ZJTEVBUFBFTkRQUkUsCS8qIGJlZm9yZSBhcHBlbmRpbmcgdG8gYSBmaWxlICovCisgICAgRVZFTlRfRklMRUFQUEVORENNRCwJLyogYXBwZW5kZSB0byBhIGZpbGUgdXNpbmcgY29tbWFuZCAqLworICAgIEVWRU5UX0ZJTEVDSEFOR0VEU0hFTEwsCS8qIGFmdGVyIHNoZWxsIGNvbW1hbmQgdGhhdCBjaGFuZ2VkIGZpbGUgKi8KKyAgICBFVkVOVF9GSUxFQ0hBTkdFRFJPLAkvKiBiZWZvcmUgZmlyc3QgY2hhbmdlIHRvIHJlYWQtb25seSBmaWxlICovCisgICAgRVZFTlRfRklMRVJFQURQT1NULAkJLyogYWZ0ZXIgcmVhZGluZyBhIGZpbGUgKi8KKyAgICBFVkVOVF9GSUxFUkVBRFBSRSwJCS8qIGJlZm9yZSByZWFkaW5nIGEgZmlsZSAqLworICAgIEVWRU5UX0ZJTEVSRUFEQ01ELAkJLyogcmVhZCBmcm9tIGEgZmlsZSB1c2luZyBjb21tYW5kICovCisgICAgRVZFTlRfRklMRVRZUEUsCQkvKiBuZXcgZmlsZSB0eXBlIGRldGVjdGVkICh1c2VyIGRlZmluZWQpICovCisgICAgRVZFTlRfRklMRVdSSVRFUE9TVCwJLyogYWZ0ZXIgd3JpdGluZyBhIGZpbGUgKi8KKyAgICBFVkVOVF9GSUxFV1JJVEVQUkUsCQkvKiBiZWZvcmUgd3JpdGluZyBhIGZpbGUgKi8KKyAgICBFVkVOVF9GSUxFV1JJVEVDTUQsCQkvKiB3cml0ZSB0byBhIGZpbGUgdXNpbmcgY29tbWFuZCAqLworICAgIEVWRU5UX0ZJTFRFUlJFQURQT1NULAkvKiBhZnRlciByZWFkaW5nIGZyb20gYSBmaWx0ZXIgKi8KKyAgICBFVkVOVF9GSUxURVJSRUFEUFJFLAkvKiBiZWZvcmUgcmVhZGluZyBmcm9tIGEgZmlsdGVyICovCisgICAgRVZFTlRfRklMVEVSV1JJVEVQT1NULAkvKiBhZnRlciB3cml0aW5nIHRvIGEgZmlsdGVyICovCisgICAgRVZFTlRfRklMVEVSV1JJVEVQUkUsCS8qIGJlZm9yZSB3cml0aW5nIHRvIGEgZmlsdGVyICovCisgICAgRVZFTlRfRk9DVVNHQUlORUQsCQkvKiBnb3QgdGhlIGZvY3VzICovCisgICAgRVZFTlRfRk9DVVNMT1NULAkJLyogbG9zdCB0aGUgZm9jdXMgdG8gYW5vdGhlciBhcHAgKi8KKyAgICBFVkVOVF9HVUlFTlRFUiwJCS8qIGFmdGVyIHN0YXJ0aW5nIHRoZSBHVUkgKi8KKyAgICBFVkVOVF9TVERJTlJFQURQT1NULAkvKiBhZnRlciByZWFkaW5nIGZyb20gc3RkaW4gKi8KKyAgICBFVkVOVF9TVERJTlJFQURQUkUsCQkvKiBiZWZvcmUgcmVhZGluZyBmcm9tIHN0ZGluICovCisgICAgRVZFTlRfU1lOVEFYLAkJLyogc3ludGF4IHNlbGVjdGVkICovCisgICAgRVZFTlRfVEVSTUNIQU5HRUQsCQkvKiBhZnRlciBjaGFuZ2luZyAndGVybScgKi8KKyAgICBFVkVOVF9URVJNUkVTUE9OU0UsCQkvKiBhZnRlciBzZXR0aW5nICJ2OnRlcm1yZXNwb25zZSIgKi8KKyAgICBFVkVOVF9VU0VSLAkJCS8qIHVzZXIgZGVmaW5lZCBhdXRvY29tbWFuZCAqLworICAgIEVWRU5UX1ZJTUVOVEVSLAkJLyogYWZ0ZXIgc3RhcnRpbmcgVmltICovCisgICAgRVZFTlRfVklNTEVBVkUsCQkvKiBiZWZvcmUgZXhpdGluZyBWaW0gKi8KKyAgICBFVkVOVF9WSU1MRUFWRVBSRSwJCS8qIGJlZm9yZSBleGl0aW5nIFZpbSBhbmQgd3JpdGluZyAudmltaW5mbyAqLworICAgIEVWRU5UX1dJTkVOVEVSLAkJLyogYWZ0ZXIgZW50ZXJpbmcgYSB3aW5kb3cgKi8KKyAgICBFVkVOVF9XSU5MRUFWRSwJCS8qIGJlZm9yZSBsZWF2aW5nIGEgd2luZG93ICovCisgICAgRVZFTlRfRU5DT0RJTkdDSEFOR0VELAkvKiBhZnRlciBjaGFuZ2luZyB0aGUgJ2VuY29kaW5nJyBvcHRpb24gKi8KKyAgICBFVkVOVF9DVVJTT1JIT0xELAkJLyogY3Vyc29yIGluIHNhbWUgcG9zaXRpb24gZm9yIGEgd2hpbGUgKi8KKyAgICBFVkVOVF9GVU5DVU5ERUZJTkVELAkvKiBpZiBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBleGlzdCAqLworICAgIEVWRU5UX1JFTU9URVJFUExZLAkJLyogdXBvbiBzdHJpbmcgcmVjZXB0aW9uIGZyb20gYSByZW1vdGUgdmltICovCisgICAgTlVNX0VWRU5UUwkJCS8qIE1VU1QgYmUgdGhlIGxhc3Qgb25lICovCit9OworCit0eXBlZGVmIGVudW0gYXV0b19ldmVudCBFVkVOVF9UOworCisvKgorICogVmFsdWVzIGZvciBpbmRleCBpbiBoaWdobGlnaHRfYXR0cltdLgorICogV2hlbiBtYWtpbmcgY2hhbmdlcywgYWxzbyB1cGRhdGUgSExfRkxBR1MgYmVsb3chICBBbmQgdXBkYXRlIHRoZSBkZWZhdWx0CisgKiB2YWx1ZSBvZiAnaGlnaGxpZ2h0JyBpbiBvcHRpb24uYy4KKyAqLworZW51bSBobGZfdmFsdWUKK3sKKyAgICBITEZfOCA9IDAJICAgIC8qIE1ldGEgJiBzcGVjaWFsIGtleXMgbGlzdGVkIHdpdGggIjptYXAiLCB0ZXh0IHRoYXQgaXMKKwkJICAgICAgIGRpc3BsYXllZCBkaWZmZXJlbnQgZnJvbSB3aGF0IGl0IGlzICovCisgICAgLCBITEZfQVQJICAgIC8qIEAgYW5kIH4gY2hhcmFjdGVycyBhdCBlbmQgb2Ygc2NyZWVuLCBjaGFyYWN0ZXJzIHRoYXQKKwkJICAgICAgIGRvbid0IHJlYWxseSBleGlzdCBpbiB0aGUgdGV4dCAqLworICAgICwgSExGX0QJICAgIC8qIGRpcmVjdG9yaWVzIGluIENUUkwtRCBsaXN0aW5nICovCisgICAgLCBITEZfRQkgICAgLyogZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAsIEhMRl9ICSAgICAvKiBvYnNvbGV0ZSwgaWdub3JlZCAqLworICAgICwgSExGX0kJICAgIC8qIGluY3JlbWVudGFsIHNlYXJjaCAqLworICAgICwgSExGX0wJICAgIC8qIGxhc3Qgc2VhcmNoIHN0cmluZyAqLworICAgICwgSExGX00JICAgIC8qICItLU1vcmUtLSIgbWVzc2FnZSAqLworICAgICwgSExGX0NNCSAgICAvKiBNb2RlIChlLmcuLCAiLS0gSU5TRVJUIC0tIikgKi8KKyAgICAsIEhMRl9OCSAgICAvKiBsaW5lIG51bWJlciBmb3IgIjpudW1iZXIiIGFuZCAiOiMiIGNvbW1hbmRzICovCisgICAgLCBITEZfUgkgICAgLyogcmV0dXJuIHRvIGNvbnRpbnVlIG1lc3NhZ2UgYW5kIHllcy9ubyBxdWVzdGlvbnMgKi8KKyAgICAsIEhMRl9TCSAgICAvKiBzdGF0dXMgbGluZXMgKi8KKyAgICAsIEhMRl9TTkMJICAgIC8qIHN0YXR1cyBsaW5lcyBvZiBub3QtY3VycmVudCB3aW5kb3dzICovCisgICAgLCBITEZfQwkgICAgLyogY29sdW1uIHRvIHNlcGFyYXRlIHZlcnRpY2FsbHkgc3BsaXQgd2luZG93cyAqLworICAgICwgSExGX1QJICAgIC8qIFRpdGxlcyBmb3Igb3V0cHV0IGZyb20gIjpzZXQgYWxsIiwgIjphdXRvY21kIiBldGMuICovCisgICAgLCBITEZfVgkgICAgLyogVmlzdWFsIG1vZGUgKi8KKyAgICAsIEhMRl9WTkMJICAgIC8qIFZpc3VhbCBtb2RlLCBhdXRvc2VsZWN0aW5nIGFuZCBub3QgY2xpcGJvYXJkIG93bmVyICovCisgICAgLCBITEZfVwkgICAgLyogd2FybmluZyBtZXNzYWdlcyAqLworICAgICwgSExGX1dNCSAgICAvKiBXaWxkbWVudSBoaWdobGlnaHQgKi8KKyAgICAsIEhMRl9GTAkgICAgLyogRm9sZGVkIGxpbmUgKi8KKyAgICAsIEhMRl9GQwkgICAgLyogRm9sZCBjb2x1bW4gKi8KKyAgICAsIEhMRl9BREQJICAgIC8qIEFkZGVkIGRpZmYgbGluZSAqLworICAgICwgSExGX0NIRAkgICAgLyogQ2hhbmdlZCBkaWZmIGxpbmUgKi8KKyAgICAsIEhMRl9ERUQJICAgIC8qIERlbGV0ZWQgZGlmZiBsaW5lICovCisgICAgLCBITEZfVFhECSAgICAvKiBUZXh0IENoYW5nZWQgaW4gZGlmZiBsaW5lICovCisgICAgLCBITEZfU0MJICAgIC8qIFNpZ24gY29sdW1uICovCisgICAgLCBITEZfQ09VTlQJICAgIC8qIE1VU1QgYmUgdGhlIGxhc3Qgb25lICovCit9OworCisvKiB0aGUgSExfRkxBR1MgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgSExGXyBlbnVtcyEgKi8KKyNkZWZpbmUgSExfRkxBR1Mgeyc4JywgJ0AnLCAnZCcsICdlJywgJ2gnLCAnaScsICdsJywgJ20nLCAnTScsIFwKKwkJICAnbicsICdyJywgJ3MnLCAnUycsICdjJywgJ3QnLCAndicsICdWJywgJ3cnLCAnVycsIFwKKwkJICAnZicsICdGJywgJ0EnLCAnQycsICdEJywgJ1QnLCAnPid9CisKKy8qCisgKiBCb29sZWFuIGNvbnN0YW50cworICovCisjaWZuZGVmIFRSVUUKKyMgZGVmaW5lIEZBTFNFCTAJICAgIC8qIG5vdGU6IHRoaXMgaXMgYW4gaW50LCBub3QgYSBsb25nISAqLworIyBkZWZpbmUgVFJVRQkxCisjZW5kaWYKKworI2RlZmluZSBNQVlCRQkyCSAgICAvKiBzb21ldGltZXMgdXNlZCBmb3IgYSB2YXJpYW50IG9uIFRSVUUgKi8KKworLyogTWF5IGJlIHJldHVybmVkIGJ5IGFkZF9uZXdfY29tcGxldGlvbigpOiAqLworI2RlZmluZSBSRVRfRVJST1IJCSgtMSkKKworLyoKKyAqIE9wZXJhdG9yIElEczsgVGhlIG9yZGVyIG11c3QgY29ycmVzcG9uZCB0byBvcGNoYXJzW10gaW4gb3BzLmMhCisgKi8KKyNkZWZpbmUgT1BfTk9QCQkwCS8qIG5vIHBlbmRpbmcgb3BlcmF0aW9uICovCisjZGVmaW5lIE9QX0RFTEVURQkxCS8qICJkIiAgZGVsZXRlIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX1lBTksJCTIJLyogInkiICB5YW5rIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX0NIQU5HRQkzCS8qICJjIiAgY2hhbmdlIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX0xTSElGVAk0CS8qICI8IiAgbGVmdCBzaGlmdCBvcGVyYXRvciAqLworI2RlZmluZSBPUF9SU0hJRlQJNQkvKiAiPiIgIHJpZ2h0IHNoaWZ0IG9wZXJhdG9yICovCisjZGVmaW5lIE9QX0ZJTFRFUgk2CS8qICIhIiAgZmlsdGVyIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX1RJTERFCTcJLyogImd+IiBzd2l0Y2ggY2FzZSBvcGVyYXRvciAqLworI2RlZmluZSBPUF9JTkRFTlQJOAkvKiAiPSIgIGluZGVudCBvcGVyYXRvciAqLworI2RlZmluZSBPUF9GT1JNQVQJOQkvKiAiZ3EiIGZvcm1hdCBvcGVyYXRvciAqLworI2RlZmluZSBPUF9DT0xPTgkxMAkvKiAiOiIgIGNvbG9uIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX1VQUEVSCTExCS8qICJnVSIgbWFrZSB1cHBlciBjYXNlIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX0xPV0VSCTEyCS8qICJndSIgbWFrZSBsb3dlciBjYXNlIG9wZXJhdG9yICovCisjZGVmaW5lIE9QX0pPSU4JCTEzCS8qICJKIiAgam9pbiBvcGVyYXRvciwgb25seSBmb3IgVmlzdWFsIG1vZGUgKi8KKyNkZWZpbmUgT1BfSk9JTl9OUwkxNAkvKiAiZ0oiICBqb2luIG9wZXJhdG9yLCBvbmx5IGZvciBWaXN1YWwgbW9kZSAqLworI2RlZmluZSBPUF9ST1QxMwkxNQkvKiAiZz8iIHJvdC0xMyBlbmNvZGluZyAqLworI2RlZmluZSBPUF9SRVBMQUNFCTE2CS8qICJyIiAgcmVwbGFjZSBjaGFycywgb25seSBmb3IgVmlzdWFsIG1vZGUgKi8KKyNkZWZpbmUgT1BfSU5TRVJUCTE3CS8qICJJIiAgSW5zZXJ0IGNvbHVtbiwgb25seSBmb3IgVmlzdWFsIG1vZGUgKi8KKyNkZWZpbmUgT1BfQVBQRU5ECTE4CS8qICJBIiAgQXBwZW5kIGNvbHVtbiwgb25seSBmb3IgVmlzdWFsIG1vZGUgKi8KKyNkZWZpbmUgT1BfRk9MRAkJMTkJLyogInpmIiBkZWZpbmUgYSBmb2xkICovCisjZGVmaW5lIE9QX0ZPTERPUEVOCTIwCS8qICJ6byIgb3BlbiBmb2xkcyAqLworI2RlZmluZSBPUF9GT0xET1BFTlJFQwkyMQkvKiAiek8iIG9wZW4gZm9sZHMgcmVjdXJzaXZlbHkgKi8KKyNkZWZpbmUgT1BfRk9MRENMT1NFCTIyCS8qICJ6YyIgY2xvc2UgZm9sZHMgKi8KKyNkZWZpbmUgT1BfRk9MRENMT1NFUkVDCTIzCS8qICJ6QyIgY2xvc2UgZm9sZHMgcmVjdXJzaXZlbHkgKi8KKyNkZWZpbmUgT1BfRk9MRERFTAkyNAkvKiAiemQiIGRlbGV0ZSBmb2xkcyAqLworI2RlZmluZSBPUF9GT0xEREVMUkVDCTI1CS8qICJ6RCIgZGVsZXRlIGZvbGRzIHJlY3Vyc2l2ZWx5ICovCisjZGVmaW5lIE9QX0ZPUk1BVDIJMjYJLyogImd3IiBmb3JtYXQgb3BlcmF0b3IsIGtlZXBzIGN1cnNvciBwb3MgKi8KKworLyoKKyAqIE1vdGlvbiB0eXBlcywgdXNlZCBmb3Igb3BlcmF0b3JzIGFuZCBmb3IgeWFuay9kZWxldGUgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIE1DSEFSCTAJCS8qIGNoYXJhY3Rlci13aXNlIG1vdmVtZW50L3JlZ2lzdGVyICovCisjZGVmaW5lIE1MSU5FCTEJCS8qIGxpbmUtd2lzZSBtb3ZlbWVudC9yZWdpc3RlciAqLworI2RlZmluZSBNQkxPQ0sJMgkJLyogYmxvY2std2lzZSByZWdpc3RlciAqLworCisjZGVmaW5lIE1BVVRPCTB4ZmYJCS8qIERlY2lkZSBiZXR3ZWVuIE1MSU5FL01DSEFSICovCisKKy8qCisgKiBNaW5pbXVtIHNjcmVlbiBzaXplCisgKi8KKyNkZWZpbmUgTUlOX0NPTFVNTlMJMTIJLyogbWluaW1hbCBjb2x1bW5zIGZvciBzY3JlZW4gKi8KKyNkZWZpbmUgTUlOX0xJTkVTCTIJLyogbWluaW1hbCBsaW5lcyBmb3Igc2NyZWVuICovCisjZGVmaW5lIFNUQVRVU19IRUlHSFQJMQkvKiBoZWlnaHQgb2YgYSBzdGF0dXMgbGluZSB1bmRlciBhIHdpbmRvdyAqLworI2RlZmluZSBRRl9XSU5IRUlHSFQJMTAJLyogZGVmYXVsdCBoZWlnaHQgZm9yIHF1aWNrZml4IHdpbmRvdyAqLworCisvKgorICogQnVmZmVyIHNpemVzCisgKi8KKyNpZm5kZWYgQ01EQlVGRlNJWkUKKyMgZGVmaW5lIENNREJVRkZTSVpFCTI1NgkvKiBzaXplIG9mIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcgYnVmZmVyICovCisjZW5kaWYKKworI2RlZmluZSBMU0laRQkgICAgNTEyCQkvKiBtYXguIHNpemUgb2YgYSBsaW5lIGluIHRoZSB0YWdzIGZpbGUgKi8KKworI2RlZmluZSBJT1NJWkUJICAgKDEwMjQrMSkJLyogZmlsZSBpL28gYW5kIHNwcmludGYgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgTVNHX0JVRl9MRU4gODAJCS8qIGxlbmd0aCBvZiBidWZmZXIgZm9yIHNtYWxsIG1lc3NhZ2VzICovCisKKyNpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX1FOWF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykgfHwgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgVEJVRlNaIDIwNDgJCS8qIGJ1ZmZlciBzaXplIGZvciB0ZXJtY2FwIGVudHJ5ICovCisjZWxzZQorIyBkZWZpbmUgVEJVRlNaIDEwMjQJCS8qIGJ1ZmZlciBzaXplIGZvciB0ZXJtY2FwIGVudHJ5ICovCisjZW5kaWYKKworLyoKKyAqIE1heGltdW0gbGVuZ3RoIG9mIGtleSBzZXF1ZW5jZSB0byBiZSBtYXBwZWQuCisgKiBNdXN0IGJlIGFibGUgdG8gaG9sZCBhbiBBbWlnYSByZXNpemUgcmVwb3J0LgorICovCisjZGVmaW5lIE1BWE1BUExFTiAgIDUwCisKKyNpZmRlZiBCSU5BUllfRklMRV9JTworIyBkZWZpbmUgV1JJVEVCSU4gICAid2IiCS8qIG5vIENSLUxGIHRyYW5zbGF0aW9uICovCisjIGRlZmluZSBSRUFEQklOICAgICJyYiIKKyMgZGVmaW5lIEFQUEVOREJJTiAgImFiIgorI2Vsc2UKKyMgZGVmaW5lIFdSSVRFQklOICAgInciCisjIGRlZmluZSBSRUFEQklOICAgICJyIgorIyBkZWZpbmUgQVBQRU5EQklOICAiYSIKKyNlbmRpZgorCisvKgorICogRU1YIGRvZXNuJ3QgaGF2ZSBhIGdsb2JhbCB3YXkgb2YgbWFraW5nIG9wZW4oKSB1c2UgYmluYXJ5IEkvTy4KKyAqIFVzZSBPX0JJTkFSWSBmb3IgYWxsIG9wZW4oKSBjYWxscy4KKyAqLworI2lmIGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChfX0NZR1dJTjMyX18pCisjIGRlZmluZSBPX0VYVFJBICAgIE9fQklOQVJZCisjZWxzZQorIyBkZWZpbmUgT19FWFRSQSAgICAwCisjZW5kaWYKKworI2lmbmRlZiBXX09LCisjIGRlZmluZSBXX09LIDIJCS8qIGZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBXX09LIGluIHVuaXN0ZC5oICovCisjZW5kaWYKKyNpZm5kZWYgUl9PSworIyBkZWZpbmUgUl9PSyA0CQkvKiBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgUl9PSyBpbiB1bmlzdGQuaCAqLworI2VuZGlmCisKKy8qCisgKiBkZWZpbmVzIHRvIGF2b2lkIHR5cGVjYXN0cyBmcm9tIChjaGFyX3UgKikgdG8gKGNoYXIgKikgYW5kIGJhY2sKKyAqICh2aW1fc3RyY2hyKCkgYW5kIHZpbV9zdHJyY2hyKCkgYXJlIG5vdyBpbiBhbGxvYy5jKQorICovCisjZGVmaW5lIFNUUkxFTihzKQkgICAgc3RybGVuKChjaGFyICopKHMpKQorI2RlZmluZSBTVFJDUFkoZCwgcykJICAgIHN0cmNweSgoY2hhciAqKShkKSwgKGNoYXIgKikocykpCisjZGVmaW5lIFNUUk5DUFkoZCwgcywgbikgICAgc3RybmNweSgoY2hhciAqKShkKSwgKGNoYXIgKikocyksIChzaXplX3QpKG4pKQorI2RlZmluZSBTVFJDTVAoZCwgcykJICAgIHN0cmNtcCgoY2hhciAqKShkKSwgKGNoYXIgKikocykpCisjZGVmaW5lIFNUUk5DTVAoZCwgcywgbikgICAgc3RybmNtcCgoY2hhciAqKShkKSwgKGNoYXIgKikocyksIChzaXplX3QpKG4pKQorI2lmZGVmIEhBVkVfU1RSQ0FTRUNNUAorIyBkZWZpbmUgU1RSSUNNUChkLCBzKQkgICAgc3RyY2FzZWNtcCgoY2hhciAqKShkKSwgKGNoYXIgKikocykpCisjZWxzZQorIyBpZmRlZiBIQVZFX1NUUklDTVAKKyMgIGRlZmluZSBTVFJJQ01QKGQsIHMpCSAgICBzdHJpY21wKChjaGFyICopKGQpLCAoY2hhciAqKShzKSkKKyMgZWxzZQorIyAgZGVmaW5lIFNUUklDTVAoZCwgcykJICAgIHZpbV9zdHJpY21wKChjaGFyICopKGQpLCAoY2hhciAqKShzKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJOQ0FTRUNNUAorIyBkZWZpbmUgU1RSTklDTVAoZCwgcywgbikgIHN0cm5jYXNlY21wKChjaGFyICopKGQpLCAoY2hhciAqKShzKSwgKHNpemVfdCkobikpCisjZWxzZQorIyBpZmRlZiBIQVZFX1NUUk5JQ01QCisjICBkZWZpbmUgU1RSTklDTVAoZCwgcywgbikgc3RybmljbXAoKGNoYXIgKikoZCksIChjaGFyICopKHMpLCAoc2l6ZV90KShuKSkKKyMgZWxzZQorIyAgZGVmaW5lIFNUUk5JQ01QKGQsIHMsIG4pIHZpbV9zdHJuaWNtcCgoY2hhciAqKShkKSwgKGNoYXIgKikocyksIChzaXplX3QpKG4pKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisjIGRlZmluZSBNQl9TVFJJQ01QKGQsIHMpCShoYXNfbWJ5dGUgPyBtYl9zdHJuaWNtcCgoY2hhcl91ICopKGQpLCAoY2hhcl91ICopKHMpLCAoaW50KU1BWENPTCkgOiBTVFJJQ01QKChkKSwgKHMpKSkKKyMgZGVmaW5lIE1CX1NUUk5JQ01QKGQsIHMsIG4pCShoYXNfbWJ5dGUgPyBtYl9zdHJuaWNtcCgoY2hhcl91ICopKGQpLCAoY2hhcl91ICopKHMpLCAoaW50KShuKSkgOiBTVFJOSUNNUCgoZCksIChzKSwgKG4pKSkKKyNlbHNlCisjIGRlZmluZSBNQl9TVFJJQ01QKGQsIHMpCVNUUklDTVAoKGQpLCAocykpCisjIGRlZmluZSBNQl9TVFJOSUNNUChkLCBzLCBuKQlTVFJOSUNNUCgoZCksIChzKSwgKG4pKQorIyBkZWZpbmUgdHJhbnNjaGFyX2J5dGUoYykJdHJhbnNjaGFyKGMpCisjZW5kaWYKKworI2RlZmluZSBTVFJDQVQoZCwgcykJICAgIHN0cmNhdCgoY2hhciAqKShkKSwgKGNoYXIgKikocykpCisjZGVmaW5lIFNUUk5DQVQoZCwgcywgbikgICAgc3RybmNhdCgoY2hhciAqKShkKSwgKGNoYXIgKikocyksIChzaXplX3QpKG4pKQorCisjaWZkZWYgSEFWRV9TVFJQQlJLCisjIGRlZmluZSB2aW1fc3RycGJyayhzLCBjcykgKGNoYXJfdSAqKXN0cnBicmsoKGNoYXIgKikocyksIChjaGFyICopKGNzKSkKKyNlbmRpZgorCisjZGVmaW5lIE1TRyhzKQkJCSAgICBtc2coKGNoYXJfdSAqKShzKSkKKyNkZWZpbmUgTVNHX0FUVFIocywgYXR0cikJICAgIG1zZ19hdHRyKChjaGFyX3UgKikocyksIChhdHRyKSkKKyNkZWZpbmUgRU1TRyhzKQkJCSAgICBlbXNnKChjaGFyX3UgKikocykpCisjZGVmaW5lIEVNU0cyKHMsIHApCQkgICAgZW1zZzIoKGNoYXJfdSAqKShzKSwgKGNoYXJfdSAqKShwKSkKKyNkZWZpbmUgRU1TRzMocywgcCwgcSkJCSAgICBlbXNnMygoY2hhcl91ICopKHMpLCAoY2hhcl91ICopKHApLCAoY2hhcl91ICopKHEpKQorI2RlZmluZSBFTVNHTihzLCBuKQkJICAgIGVtc2duKChjaGFyX3UgKikocyksIChsb25nKShuKSkKKyNkZWZpbmUgT1VUX1NUUihzKQkJICAgIG91dF9zdHIoKGNoYXJfdSAqKShzKSkKKyNkZWZpbmUgT1VUX1NUUl9ORihzKQkJICAgIG91dF9zdHJfbmYoKGNoYXJfdSAqKShzKSkKKyNkZWZpbmUgTVNHX1BVVFMocykJCSAgICBtc2dfcHV0cygoY2hhcl91ICopKHMpKQorI2RlZmluZSBNU0dfUFVUU19BVFRSKHMsIGEpCSAgICBtc2dfcHV0c19hdHRyKChjaGFyX3UgKikocyksIChhKSkKKyNkZWZpbmUgTVNHX1BVVFNfVElUTEUocykJICAgIG1zZ19wdXRzX3RpdGxlKChjaGFyX3UgKikocykpCisjZGVmaW5lIE1TR19QVVRTX0xPTkcocykJICAgIG1zZ19wdXRzX2xvbmcoKGNoYXJfdSAqKShzKSkKKyNkZWZpbmUgTVNHX1BVVFNfTE9OR19BVFRSKHMsIGEpICAgIG1zZ19wdXRzX2xvbmdfYXR0cigoY2hhcl91ICopKHMpLCAoYSkpCisKKy8qIFByZWZlciB1c2luZyBlbXNnMygpLCBiZWNhdXNlIHBlcnJvcigpIG1heSBzZW5kIHRoZSBvdXRwdXQgdG8gdGhlIHdyb25nCisgKiBkZXN0aW5hdGlvbiBhbmQgbWVzcyB1cCB0aGUgc2NyZWVuLiAqLworI2lmZGVmIEhBVkVfU1RSRVJST1IKKyMgZGVmaW5lIFBFUlJPUihtc2cpCQkgICAgKHZvaWQpZW1zZzMoKGNoYXJfdSAqKSIlczogJXMiLCAoY2hhcl91ICopbXNnLCAoY2hhcl91ICopc3RyZXJyb3IoZXJybm8pKQorI2Vsc2UKKyMgZGVmaW5lIFBFUlJPUihtc2cpCQkgICAgcGVycm9yKG1zZykKKyNlbmRpZgorCit0eXBlZGVmIGxvbmcJICAgIGxpbmVucl9UOwkJLyogbGluZSBudW1iZXIgdHlwZSAqLwordHlwZWRlZiB1bnNpZ25lZCAgICBjb2xucl9UOwkJLyogY29sdW1uIG51bWJlciB0eXBlICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGRpc3B0aWNrX1Q7CS8qIGRpc3BsYXkgdGljayB0eXBlICovCisKKyNkZWZpbmUgTUFYTE5VTSAoMHg3ZmZmZmZmZkwpCQkvKiBtYXhpbXVtIChpbnZhbGlkKSBsaW5lIG51bWJlciAqLworCisvKgorICogV2VsbCwgeW91IHdvbid0IGJlbGlldmUgaXQsIGJ1dCBzb21lIFMvMzkwIG1hY2hpbmVzICgiaG9zdCIsIG5vdyBhbHNvIGtub3duCisgKiBhcyB6U2VydmVyKSB1cyAzMSBiaXQgcG9pbnRlcnMuIFRoZXJlIGFyZSBhbHNvIHNvbWUgbmV3ZXIgbWFjaGluZXMsIHRoYXQKKyAqIHVzZSA2NCBiaXQgcG9pbnRlcnMuIEkgZG9uJ3Qga25vdyBob3cgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAzMSBhbmQgNjQgYml0CisgKiBtYWNoaW5lcywgc28gdGhlIGJlc3Qgd2F5IGlzIHRvIGFzc3VtZSAzMSBiaXRzIHdoZW5ldmVyIHdlIGRldGVjdCBPUy8zOTAKKyAqIFVuaXguCisgKiBXaXRoIHRoaXMgd2UgcmVzdHJpY3QgdGhlIG1heGltdW0gbGluZSBsZW5ndGggdG8gMTA3Mzc0MTgyMy4gSSBndWVzcyB0aGlzIGlzCisgKiBub3QgYSByZWFsIHByb2JsZW0uIEJUVzogIExvbmdlciBsaW5lcyBhcmUgc3BsaXQuCisgKi8KKyNpZiBTSVpFT0ZfSU5UID49IDQKKyMgaWZkZWYgX19NVlNfXworIyAgZGVmaW5lIE1BWENPTCAoMHgzZmZmZmZmZkwpCQkvKiBtYXhpbXVtIGNvbHVtbiBudW1iZXIsIDMwIGJpdHMgKi8KKyMgZWxzZQorIyAgZGVmaW5lIE1BWENPTCAoMHg3ZmZmZmZmZkwpCQkvKiBtYXhpbXVtIGNvbHVtbiBudW1iZXIsIDMxIGJpdHMgKi8KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBNQVhDT0wJKDB4N2ZmZikJCS8qIG1heGltdW0gY29sdW1uIG51bWJlciwgMTUgYml0cyAqLworI2VuZGlmCisKKyNkZWZpbmUgU0hPV0NNRF9DT0xTIDEwCQkJLyogY29sdW1ucyBuZWVkZWQgYnkgc2hvd24gY29tbWFuZCAqLworI2RlZmluZSBTVExfTUFYX0lURU0gODAJCQkvKiBtYXggbnIgb2YgJTxmbGFnPiBpbiBzdGF0dXNsaW5lICovCisKK3R5cGVkZWYgdm9pZAkgICAgKnZpbV9hY2xfVDsJCS8qIGR1bW15IHRvIHBhc3MgYW4gQUNMIHRvIGEgZnVuY3Rpb24gKi8KKworLyoKKyAqIEluY2x1ZGUgYSBwcm90b3R5cGUgZm9yIG1jaF9tZW1tb3ZlKCksIGl0IG1heSBub3QgYmUgaW4gYWxsb2MucHJvLgorICovCisjaWZkZWYgVklNX01FTU1PVkUKK3ZvaWQgbWNoX21lbW1vdmUgX19BUkdTKCh2b2lkICosIHZvaWQgKiwgc2l6ZV90KSk7CisjZWxzZQorIyBpZm5kZWYgbWNoX21lbW1vdmUKKyMgIGRlZmluZSBtY2hfbWVtbW92ZSh0bywgZnJvbSwgbGVuKSBtZW1tb3ZlKHRvLCBmcm9tLCBsZW4pCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIGZuYW1lY21wKCkgaXMgdXNlZCB0byBjb21wYXJlIGZpbGUgbmFtZXMuCisgKiBPbiBzb21lIHN5c3RlbXMgY2FzZSBpbiBhIGZpbGUgbmFtZSBkb2VzIG5vdCBtYXR0ZXIsIG9uIG90aGVycyBpdCBkb2VzLgorICogKHRoaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgbWF4aW11bSBuYW1lIGxlbmd0aHMgYW5kIHRoaW5ncyBsaWtlICIuLi9kaXIiLAorICogdGh1cyBpdCBpcyBub3QgMTAwJSBhY2N1cmF0ZSEpCisgKi8KKyNpZmRlZiBDQVNFX0lOU0VOU0lUSVZFX0ZJTEVOQU1FCisjIGlmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQorIyAgZGVmaW5lIGZuYW1lY21wKHgsIHkpIHZpbV9mbmFtZWNtcCgoeCksICh5KSkKKyMgIGRlZmluZSBmbmFtZW5jbXAoeCwgeSwgbikgdmltX2ZuYW1lbmNtcCgoeCksICh5KSwgKHNpemVfdCkobikpCisjIGVsc2UKKyMgIGRlZmluZSBmbmFtZWNtcCh4LCB5KSBNQl9TVFJJQ01QKCh4KSwgKHkpKQorIyAgZGVmaW5lIGZuYW1lbmNtcCh4LCB5LCBuKSBNQl9TVFJOSUNNUCgoeCksICh5KSwgKG4pKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIGZuYW1lY21wKHgsIHkpIHN0cmNtcCgoY2hhciAqKSh4KSwgKGNoYXIgKikoeSkpCisjIGRlZmluZSBmbmFtZW5jbXAoeCwgeSwgbikgc3RybmNtcCgoY2hhciAqKSh4KSwgKGNoYXIgKikoeSksIChzaXplX3QpKG4pKQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX01FTVNFVAorIyBkZWZpbmUgdmltX21lbXNldChwdHIsIGMsIHNpemUpICAgbWVtc2V0KChwdHIpLCAoYyksIChzaXplKSkKKyNlbHNlCit2b2lkICp2aW1fbWVtc2V0IF9fQVJHUygodm9pZCAqLCBpbnQsIHNpemVfdCkpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX01FTUNNUAorIyBkZWZpbmUgdmltX21lbWNtcChwMSwgcDIsIGxlbikgICBtZW1jbXAoKHAxKSwgKHAyKSwgKGxlbikpCisjZWxzZQorIyBpZmRlZiBIQVZFX0JDTVAKKyMgIGRlZmluZSB2aW1fbWVtY21wKHAxLCBwMiwgbGVuKSAgIGJjbXAoKHAxKSwgKHAyKSwgKGxlbikpCisjIGVsc2UKK2ludCB2aW1fbWVtY21wIF9fQVJHUygodm9pZCAqLCB2b2lkICosIHNpemVfdCkpOworIyAgZGVmaW5lIFZJTV9NRU1DTVAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfR1VJKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChWTVMpIFwKKwl8fCBkZWZpbmVkKEZFQVRfQ0xJRU5UU0VSVkVSKQorIyBkZWZpbmUgVVNFX0lOUFVUX0JVRgorI2VuZGlmCisKKyNpZmRlZiBNU1dJTgorLyogT24gTVMtV2luZG93cyB0aGUgdGhpcmQgYXJndW1lbnQgaXNuJ3Qgc2l6ZV90LiAgVGhpcyBtYXR0ZXJzIGZvciBXaW42NCwKKyAqIHdoZXJlIHNpemVvZihzaXplX3QpPT04LCBub3QgNCAqLworIyBkZWZpbmUgdmltX3JlYWQoZmQsIGJ1ZiwgY291bnQpICAgcmVhZCgoZmQpLCAoY2hhciAqKShidWYpLCAodW5zaWduZWQgaW50KShjb3VudCkpCisjIGRlZmluZSB2aW1fd3JpdGUoZmQsIGJ1ZiwgY291bnQpICB3cml0ZSgoZmQpLCAoY2hhciAqKShidWYpLCAodW5zaWduZWQgaW50KShjb3VudCkpCisjZWxzZQorIyBkZWZpbmUgdmltX3JlYWQoZmQsIGJ1ZiwgY291bnQpICAgcmVhZCgoZmQpLCAoY2hhciAqKShidWYpLCAoc2l6ZV90KSAoY291bnQpKQorIyBkZWZpbmUgdmltX3dyaXRlKGZkLCBidWYsIGNvdW50KSAgd3JpdGUoKGZkKSwgKGNoYXIgKikoYnVmKSwgKHNpemVfdCkgKGNvdW50KSkKKyNlbmRpZgorCisvKgorICogRW51bXMgbmVlZCBhIHR5cGVjYXN0IHRvIGJlIHVzZWQgYXMgYXJyYXkgaW5kZXggKGZvciBVbHRyaXgpLgorICovCisjZGVmaW5lIGhsX2F0dHIobikJaGlnaGxpZ2h0X2F0dHJbKGludCkobildCisjZGVmaW5lIHRlcm1fc3RyKG4pCXRlcm1fc3RyaW5nc1soaW50KShuKV0KKworLyoKKyAqIHZpbV9pc3doaXRlKCkgaXMgdXNlZCBmb3IgIl4iIGFuZCB0aGUgbGlrZS4gSXQgZGlmZmVycyBmcm9tIGlzc3BhY2UoKQorICogYmVjYXVzZSBpdCBkb2Vzbid0IGluY2x1ZGUgPENSPiBhbmQgPExGPiBhbmQgdGhlIGxpa2UuCisgKi8KKyNkZWZpbmUgdmltX2lzd2hpdGUoeCkJKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCisKKy8qIE5vdGUgdGhhdCBndWkuaCBpcyBpbmNsdWRlZCBieSBzdHJ1Y3RzLmggKi8KKworI2luY2x1ZGUgInN0cnVjdHMuaCIJICAgIC8qIGZpbGUgdGhhdCBkZWZpbmVzIG1hbnkgc3RydWN0dXJlcyAqLworCisjaWZkZWYgRkVBVF9NT1VTRQorCisvKiBDb2RlcyBmb3IgbW91c2UgYnV0dG9uIGV2ZW50cyBpbiBsb3dlciB0aHJlZSBiaXRzOiAqLworIyBkZWZpbmUgTU9VU0VfTEVGVAkweDAwCisjIGRlZmluZSBNT1VTRV9NSURETEUJMHgwMQorIyBkZWZpbmUgTU9VU0VfUklHSFQJMHgwMgorIyBkZWZpbmUgTU9VU0VfUkVMRUFTRQkweDAzCisKKy8qIGJpdCBtYXNrcyBmb3IgbW9kaWZpZXJzOiAqLworIyBkZWZpbmUgTU9VU0VfU0hJRlQJMHgwNAorIyBkZWZpbmUgTU9VU0VfQUxUCTB4MDgKKyMgZGVmaW5lIE1PVVNFX0NUUkwJMHgxMAorCisvKiBtb3VzZSBidXR0b25zIHRoYXQgYXJlIGhhbmRsZWQgbGlrZSBhIGtleSBwcmVzcyAoR1VJIG9ubHkpICovCisjIGRlZmluZSBNT1VTRV80CTB4MTAwCS8qIHNjcm9sbCB3aGVlbCBkb3duICovCisjIGRlZmluZSBNT1VTRV81CTB4MjAwCS8qIHNjcm9sbCB3aGVlbCB1cCAqLworCisjIGRlZmluZSBNT1VTRV9YMQkweDMwMCAvKiBNb3VzZS1idXR0b24gWDEgKDZ0aCkgKi8KKyMgZGVmaW5lIE1PVVNFX1gyCTB4NDAwIC8qIE1vdXNlLWJ1dHRvbiBYMiAqLworCisvKiAweDIwIGlzIHJlc2VydmVkIGJ5IHh0ZXJtICovCisjIGRlZmluZSBNT1VTRV9EUkFHX1hURVJNICAgMHg0MAorCisjIGRlZmluZSBNT1VTRV9EUkFHCSgweDQwIHwgTU9VU0VfUkVMRUFTRSkKKworLyogTG93ZXN0IGJ1dHRvbiBjb2RlIGZvciB1c2luZyB0aGUgbW91c2Ugd2hlZWwgKHh0ZXJtIG9ubHkpICovCisjIGRlZmluZSBNT1VTRVdIRUVMX0xPVwkJMHg2MAorCisjIGRlZmluZSBNT1VTRV9DTElDS19NQVNLCTB4MDMKKworIyBkZWZpbmUgTlVNX01PVVNFX0NMSUNLUyhjb2RlKSBcCisgICAgKCgodW5zaWduZWQpKChjb2RlKSAmIDB4QzApID4+IDYpICsgMSkKKworIyBkZWZpbmUgU0VUX05VTV9NT1VTRV9DTElDS1MoY29kZSwgbnVtKSBcCisgICAgKGNvZGUpID0gKChjb2RlKSAmIDB4M2YpIHwgKCgoKG51bSkgLSAxKSAmIDMpIDw8IDYpCisKKy8qCisgKiBqdW1wX3RvX21vdXNlKCkgcmV0dXJucyBvbmUgb2YgZmlyc3QgZm91ciB0aGVzZSB2YWx1ZXMsIHBvc3NpYmx5IHdpdGgKKyAqIHNvbWUgb2YgdGhlIG90aGVyIHRocmVlIGFkZGVkLgorICovCisjIGRlZmluZSBJTl9VTktOT1dOCQkwCisjIGRlZmluZSBJTl9CVUZGRVIJCTEKKyMgZGVmaW5lIElOX1NUQVRVU19MSU5FCQkyCS8qIG9uIHN0YXR1cyBvciBjb21tYW5kIGxpbmUgKi8KKyMgZGVmaW5lIElOX1NFUF9MSU5FCQk0CS8qIG9uIHZlcnRpY2FsIHNlcGFyYXRvciBsaW5lICovCisjIGRlZmluZSBJTl9PVEhFUl9XSU4JCTgJLyogaW4gb3RoZXIgd2luZG93IGJ1dCBjYW4ndCBnbyB0aGVyZSAqLworIyBkZWZpbmUgQ1VSU09SX01PVkVECQkweDEwMAorIyBkZWZpbmUgTU9VU0VfRk9MRF9DTE9TRQkweDIwMAkvKiBjbGlja2VkIG9uICctJyBpbiBmb2xkIGNvbHVtbiAqLworIyBkZWZpbmUgTU9VU0VfRk9MRF9PUEVOCTB4NDAwCS8qIGNsaWNrZWQgb24gJysnIGluIGZvbGQgY29sdW1uICovCisKKy8qIGZsYWdzIGZvciBqdW1wX3RvX21vdXNlKCkgKi8KKyMgZGVmaW5lIE1PVVNFX0ZPQ1VTCQkweDAxCS8qIG5lZWQgdG8gc3RheSBpbiB0aGlzIHdpbmRvdyAqLworIyBkZWZpbmUgTU9VU0VfTUFZX1ZJUwkJMHgwMgkvKiBtYXkgc3RhcnQgVmlzdWFsIG1vZGUgKi8KKyMgZGVmaW5lIE1PVVNFX0RJRF9NT1ZFCQkweDA0CS8qIG9ubHkgYWN0IHdoZW4gbW91c2UgaGFzIG1vdmVkICovCisjIGRlZmluZSBNT1VTRV9TRVRQT1MJCTB4MDgJLyogb25seSBzZXQgY3VycmVudCBtb3VzZSBwb3NpdGlvbiAqLworIyBkZWZpbmUgTU9VU0VfTUFZX1NUT1BfVklTCTB4MTAJLyogbWF5IHN0b3AgVmlzdWFsIG1vZGUgKi8KKyMgZGVmaW5lIE1PVVNFX1JFTEVBU0VECQkweDIwCS8qIGJ1dHRvbiB3YXMgcmVsZWFzZWQgKi8KKworIyBpZiBkZWZpbmVkKFVOSVgpICYmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQorIyAgZGVmaW5lIENIRUNLX0RPVUJMRV9DTElDSyAxCS8qIENoZWNraW5nIGZvciBkb3VibGUgY2xpY2tzIG91cnNlbHZlcy4gKi8KKyMgZW5kaWYKKworI2VuZGlmIC8qIEZFQVRfTU9VU0UgKi8KKworLyogZGVmaW5lcyBmb3IgZXZhbF92YXJzKCkgKi8KKyNkZWZpbmUgVkFMSURfUEFUSAkJMQorI2RlZmluZSBWQUxJRF9IRUFECQkyCisKKy8qIERlZmluZXMgZm9yIFZpbSB2YXJpYWJsZXMuICBUaGVzZSBtdXN0IG1hdGNoIHZpbXZhcnNbXSBpbiBldmFsLmMhICovCisjZGVmaW5lIFZWX0NPVU5UCTAKKyNkZWZpbmUgVlZfQ09VTlQxCTEKKyNkZWZpbmUgVlZfUFJFVkNPVU5UCTIKKyNkZWZpbmUgVlZfRVJSTVNHCTMKKyNkZWZpbmUgVlZfV0FSTklOR01TRwk0CisjZGVmaW5lIFZWX1NUQVRVU01TRwk1CisjZGVmaW5lIFZWX1NIRUxMX0VSUk9SCTYKKyNkZWZpbmUgVlZfVEhJU19TRVNTSU9OCTcKKyNkZWZpbmUgVlZfVkVSU0lPTgk4CisjZGVmaW5lIFZWX0xOVU0JCTkKKyNkZWZpbmUgVlZfVEVSTVJFU1BPTlNFCTEwCisjZGVmaW5lIFZWX0ZOQU1FCTExCisjZGVmaW5lIFZWX0xBTkcJCTEyCisjZGVmaW5lIFZWX0xDX1RJTUUJMTMKKyNkZWZpbmUgVlZfQ1RZUEUJMTQKKyNkZWZpbmUgVlZfQ0NfRlJPTQkxNQorI2RlZmluZSBWVl9DQ19UTwkxNgorI2RlZmluZSBWVl9GTkFNRV9JTgkxNworI2RlZmluZSBWVl9GTkFNRV9PVVQJMTgKKyNkZWZpbmUgVlZfRk5BTUVfTkVXCTE5CisjZGVmaW5lIFZWX0ZOQU1FX0RJRkYJMjAKKyNkZWZpbmUgVlZfQ01EQVJHCTIxCisjZGVmaW5lIFZWX0ZPTERTVEFSVAkyMgorI2RlZmluZSBWVl9GT0xERU5ECTIzCisjZGVmaW5lIFZWX0ZPTEREQVNIRVMJMjQKKyNkZWZpbmUgVlZfRk9MRExFVkVMCTI1CisjZGVmaW5lIFZWX1BST0dOQU1FCTI2CisjZGVmaW5lIFZWX1NFTkRfU0VSVkVSCTI3CisjZGVmaW5lIFZWX0RZSU5HCTI4CisjZGVmaW5lIFZWX0VYQ0VQVElPTgkyOQorI2RlZmluZSBWVl9USFJPV1BPSU5UCTMwCisjZGVmaW5lIFZWX1JFRwkJMzEKKyNkZWZpbmUgVlZfQ01EQkFORwkzMgorI2RlZmluZSBWVl9MRU4JCTMzCS8qIG51bWJlciBvZiB2OiB2YXJzICovCisKKyNpZmRlZiBGRUFUX0NMSVBCT0FSRAorCisvKiBWSU1fQVRPTV9OQU1FIGlzIHRoZSBvbGRlciBWaW0tc3BlY2lmaWMgc2VsZWN0aW9uIHR5cGUgZm9yIFgxMS4gIFN0aWxsCisgKiBzdXBwb3J0ZWQgZm9yIHdoZW4gYSBtaXggb2YgVmltIHZlcnNpb25zIGlzIHVzZWQuIFZJTUVOQ19BVE9NX05BTUUgaW5jbHVkZXMKKyAqIHRoZSBlbmNvZGluZyB0byBzdXBwb3J0IFZpbXMgdXNpbmcgZGlmZmVyZW50ICdlbmNvZGluZycgdmFsdWVzLiAqLworI2RlZmluZSBWSU1fQVRPTV9OQU1FICJfVklNX1RFWFQiCisjZGVmaW5lIFZJTUVOQ19BVE9NX05BTUUgIl9WSU1FTkNfVEVYVCIKKworLyogU2VsZWN0aW9uIHN0YXRlcyBmb3IgbW9kZWxlc3Mgc2VsZWN0aW9uICovCisjIGRlZmluZSBTRUxFQ1RfQ0xFQVJFRAkJMAorIyBkZWZpbmUgU0VMRUNUX0lOX1BST0dSRVNTCTEKKyMgZGVmaW5lIFNFTEVDVF9ET05FCQkyCisKKyMgZGVmaW5lIFNFTEVDVF9NT0RFX0NIQVIJMAorIyBkZWZpbmUgU0VMRUNUX01PREVfV09SRAkxCisjIGRlZmluZSBTRUxFQ1RfTU9ERV9MSU5FCTIKKworIyBpZmRlZiBGRUFUX0dVSV9XMzIKKyMgIGlmZGVmIEZFQVRfT0xFCisjICAgZGVmaW5lIFdNX09MRSAoV01fQVBQKzApCisjICBlbmRpZgorIyAgaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisgICAgLyogbWVzc2FnZSBmb3IgTmV0YmVhbnMgc29ja2V0IGV2ZW50ICovCisjICAgZGVmaW5lIFdNX05FVEJFQU5TIChXTV9BUFArMSkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIEluZm8gYWJvdXQgc2VsZWN0ZWQgdGV4dCAqLwordHlwZWRlZiBzdHJ1Y3QgVmltQ2xpcGJvYXJkCit7CisgICAgaW50CQlhdmFpbGFibGU7CS8qIElzIGNsaXBib2FyZCBhdmFpbGFibGU/ICovCisgICAgaW50CQlvd25lZDsJCS8qIEZsYWc6IGRvIHdlIG93biB0aGUgc2VsZWN0aW9uPyAqLworICAgIHBvc19UCXN0YXJ0OwkJLyogU3RhcnQgb2Ygc2VsZWN0ZWQgYXJlYSAqLworICAgIHBvc19UCWVuZDsJCS8qIEVuZCBvZiBzZWxlY3RlZCBhcmVhICovCisgICAgaW50CQl2bW9kZTsJCS8qIFZpc3VhbCBtb2RlIGNoYXJhY3RlciAqLworCisgICAgLyogRmllbGRzIGZvciBzZWxlY3Rpb24gdGhhdCBkb2Vzbid0IHVzZSBWaXN1YWwgbW9kZSAqLworICAgIHNob3J0X3UJb3JpZ2luX3JvdzsKKyAgICBzaG9ydF91CW9yaWdpbl9zdGFydF9jb2w7CisgICAgc2hvcnRfdQlvcmlnaW5fZW5kX2NvbDsKKyAgICBzaG9ydF91CXdvcmRfc3RhcnRfY29sOworICAgIHNob3J0X3UJd29yZF9lbmRfY29sOworCisgICAgcG9zX1QJcHJldjsJCS8qIFByZXZpb3VzIHBvc2l0aW9uICovCisgICAgc2hvcnRfdQlzdGF0ZTsJCS8qIEN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlICovCisgICAgc2hvcnRfdQltb2RlOwkJLyogU2VsZWN0IGJ5IGNoYXIsIHdvcmQsIG9yIGxpbmUuICovCisKKyMgaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpIHx8IGRlZmluZWQoRkVBVF9YQ0xJUEJPQVJEKQorICAgIEF0b20Jc2VsX2F0b207CS8qIFBSSU1BUlkvQ0xJUEJPQVJEIHNlbGVjdGlvbiBJRCAqLworIyBlbmRpZgorCisjIGlmZGVmIEZFQVRfR1VJX0dUSworICAgIEdka0F0b20gICAgIGd0a19zZWxfYXRvbTsJLyogUFJJTUFSWS9DTElQQk9BUkQgc2VsZWN0aW9uIElEICovCisjIGVuZGlmCisKKyMgaWZkZWYgTVNXSU4KKyAgICBpbnRfdQlmb3JtYXQ7CQkvKiBWaW0ncyBvd24gc3BlY2lhbCBjbGlwYm9hcmQgZm9ybWF0ICovCisgICAgaW50X3UJZm9ybWF0X3JhdzsJLyogVmltJ3MgcmF3IHRleHQgY2xpcGJvYXJkIGZvcm1hdCAqLworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0dVSV9CRU9TCisJCQkJLyogbm8gY2xpcGJvYXJkIGF0IHRoZSBtb21lbnQgKi8KKyMgZW5kaWYKK30gVmltQ2xpcGJvYXJkOworI2Vsc2UKK3R5cGVkZWYgaW50IFZpbUNsaXBib2FyZDsJLyogVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3RvdHlwZXMuICovCisjZW5kaWYKKworI2lmZGVmIF9fQk9STEFORENfXworLyogd29yayBhcm91bmQgYSBidWcgaW4gdGhlIEJvcmxhbmQgJ3N0YXQnIGZ1bmN0aW9uOiAqLworIyBpbmNsdWRlIDxpby5oPgkgICAgLyogZm9yIGFjY2VzcygpICovCisKKyMgZGVmaW5lIHN0YXQoYSxiKSAoYWNjZXNzKGEsMCkgPyAtMSA6IHN0YXQoYSxiKSkKKyNlbmRpZgorCisvKgorICogRVhURVJOIGlzIG9ubHkgZGVmaW5lZCBpbiBtYWluLmMuICBUaGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBhcmUKKyAqIGFjdHVhbGx5IGRlZmluZWQgYW5kIGluaXRpYWxpemVkLgorICovCisjaWZuZGVmIEVYVEVSTgorIyBkZWZpbmUgRVhURVJOIGV4dGVybgorIyBkZWZpbmUgSU5JVCh4KQorI2Vsc2UKKyMgaWZuZGVmIElOSVQKKyMgIGRlZmluZSBJTklUKHgpIHgKKyMgIGRlZmluZSBET19JTklUCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgIm9wdGlvbi5oIgkgICAgLyogb3B0aW9uIHZhcmlhYmxlcyBhbmQgZGVmaW5lcyAqLworI2luY2x1ZGUgImV4X2NtZHMuaCIJICAgIC8qIEV4IGNvbW1hbmQgZGVmaW5lcyAqLworI2luY2x1ZGUgInByb3RvLmgiCSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKy8qIFRoaXMgaGFzIHRvIGdvIGFmdGVyIHRoZSBpbmNsdWRlIG9mIHByb3RvLmgsIGFzIHByb3RvL2d1aS5wcm8gZGVjbGFyZXMKKyAqIGZ1bmN0aW9ucyBvZiB0aGVzZSBuYW1lcy4gVGhlIGRlY2xhcmF0aW9ucyB3b3VsZCBicmVhayBpZiB0aGUgZGVmaW5lcyBoYWQKKyAqIGJlZW4gc2VlbiBhdCB0aGF0IHN0YWdlLiAgQnV0IGl0IG11c3QgYmUgYmVmb3JlIGdsb2JhbHMuaCwgd2hlcmUgZXJyb3JfZ2EKKyAqIGlzIGRlY2xhcmVkLiAqLworI2lmICFkZWZpbmVkKEZFQVRfR1VJX1czMikgJiYgIWRlZmluZWQoRkVBVF9HVUlfWDExKSBcCisJJiYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9NQUMpCisjIGRlZmluZSBtY2hfZXJybXNnKHN0cikJZnByaW50ZihzdGRlcnIsICIlcyIsIChzdHIpKQorIyBkZWZpbmUgZGlzcGxheV9lcnJvcnMoKQlmZmx1c2goc3RkZXJyKQorIyBkZWZpbmUgbWNoX21zZyhzdHIpCQlwcmludGYoIiVzIiwgKHN0cikpCisjZWxzZQorIyBkZWZpbmUgVVNFX01DSF9FUlJNU0cKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2xvYmFscy5oIgkgICAgLyogZ2xvYmFsIHZhcmlhYmxlcyBhbmQgbWVzc2FnZXMgKi8KKworI2lmZGVmIEZFQVRfU05JRkYKKyMgaW5jbHVkZSAiaWZfc25pZmYuaCIKKyNlbmRpZgorCisjaWZuZGVmIEZFQVRfVklSVFVBTEVESVQKKyMgZGVmaW5lIGdldHZ2Y29sKHcsIHAsIHMsIGMsIGUpIGdldHZjb2wodywgcCwgcywgYywgZSkKKyMgZGVmaW5lIHZpcnR1YWxfYWN0aXZlKCkgMAorIyBkZWZpbmUgdmlydHVhbF9vcCBGQUxTRQorI2VuZGlmCisKKy8qCisgKiBJZiBjb25zb2xlIGRpYWxvZyBub3Qgc3VwcG9ydGVkLCBidXQgR1VJIGRpYWxvZyBpcywgdXNlIHRoZSBHVUkgb25lLgorICovCisjaWYgZGVmaW5lZChGRUFUX0dVSV9ESUFMT0cpICYmICFkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKyMgZGVmaW5lIGRvX2RpYWxvZyBndWlfbWNoX2RpYWxvZworI2VuZGlmCisKKy8qCisgKiBEZWZhdWx0IGZpbHRlcnMgZm9yIGd1aV9tY2hfYnJvd3NlKCkuCisgKiBUaGUgZmlsdGVycyBhcmUgYWxtb3N0IHN5c3RlbSBpbmRlcGVuZGVudC4gIEV4Y2VwdCBmb3IgdGhlIGRpZmZlcmVuY2UKKyAqIGJldHdlZW4gIioiIGFuZCAiKi4qIiBmb3IgTVNET1MtbGlrZSBzeXN0ZW1zLgorICogTk9URTogTW90aWYgb25seSB1c2VzIHRoZSB2ZXJ5IGZpcnN0IHBhdHRlcm4uICBUaGVyZWZvcmUKKyAqIEJST1dTRV9GSUxURVJfREVGQVVMVCBzaG91bGQgc3RhcnQgd2l0aCBhICIqIiBwYXR0ZXJuLgorICovCisjaWZkZWYgRkVBVF9CUk9XU0UKKyMgaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisjICBkZWZpbmUgQlJPV1NFX0ZJTFRFUl9NQUNST1MgXAorCShjaGFyX3UgKikiVmltIG1hY3JvIGZpbGVzICgqLnZpbSlcdCoudmltXG5BbGwgRmlsZXMgKCouKilcdCouKlxuIgorIyAgZGVmaW5lIEJST1dTRV9GSUxURVJfQUxMX0ZJTEVTIChjaGFyX3UgKikiQWxsIEZpbGVzICgqLiopXHQqLipcbiIKKyMgIGRlZmluZSBCUk9XU0VfRklMVEVSX0RFRkFVTFQgXAorCShjaGFyX3UgKikiQWxsIEZpbGVzICgqLiopXHQqLipcbkMgc291cmNlICgqLmMsICouaClcdCouYzsqLmhcbkMrKyBzb3VyY2UgKCouY3BwLCAqLmhwcClcdCouY3BwOyouaHBwXG5WQiBjb2RlICgqLmJhcywgKi5mcm0pXHQqLmJhczsqLmZybVxuVmltIGZpbGVzICgqLnZpbSwgX3ZpbXJjLCBfZ3ZpbXJjKVx0Ki52aW07X3ZpbXJjO19ndmltcmNcbiIKKyMgZWxzZQorIyAgZGVmaW5lIEJST1dTRV9GSUxURVJfTUFDUk9TIFwKKwkoY2hhcl91ICopIlZpbSBtYWNybyBmaWxlcyAoKi52aW0pXHQqLnZpbVxuQWxsIEZpbGVzICgqKVx0KlxuIgorIyAgZGVmaW5lIEJST1dTRV9GSUxURVJfQUxMX0ZJTEVTIChjaGFyX3UgKikiQWxsIEZpbGVzICgqKVx0KlxuIgorIyAgZGVmaW5lIEJST1dTRV9GSUxURVJfREVGQVVMVCBcCisJKGNoYXJfdSAqKSJBbGwgRmlsZXMgKCopXHQqXG5DIHNvdXJjZSAoKi5jLCAqLmgpXHQqLmM7Ki5oXG5DKysgc291cmNlICgqLmNwcCwgKi5ocHApXHQqLmNwcDsqLmhwcFxuVmltIGZpbGVzICgqLnZpbSwgX3ZpbXJjLCBfZ3ZpbXJjKVx0Ki52aW07X3ZpbXJjO19ndmltcmNcbiIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBzdG9wIHVzaW5nIGZhc3RjYWxsIGZvciBCb3JsYW5kICovCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKERFQlVHKQorIyBwcmFnbWEgb3B0aW9uIC1wLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1FTV9QUk9GSUxFKQorIyBkZWZpbmUgdmltX3JlYWxsb2MocHRyLCBzaXplKSAgbWVtX3JlYWxsb2MoKHB0ciksIChzaXplKSkKKyNlbHNlCisjIGRlZmluZSB2aW1fcmVhbGxvYyhwdHIsIHNpemUpICByZWFsbG9jKChwdHIpLCAoc2l6ZSkpCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHN0b3AgZGlzcGxhdC9ldmVudCBsb29wIG5lc3RpbmcgYXQgdGhlIHdyb25nIHRpbWUuCisgKi8KKyNpZmRlZiBBTFRfWF9JTlBVVAorIyBkZWZpbmUgQUxUX0lOUFVUX0xPQ0tfT0ZGCXN1cHByZXNzX2FsdGVybmF0ZV9pbnB1dCA9IEZBTFNFCisjIGRlZmluZSBBTFRfSU5QVVRfTE9DS19PTglzdXBwcmVzc19hbHRlcm5hdGVfaW5wdXQgPSBUUlVFCisjZW5kaWYKKworI2lmZGVmIEZFQVRfTUJZVEUKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICBJdCBjYW4gYmUgb25lIDMyLWJpdAorICogY2hhcmFjdGVyIG9mIHVwIHRvIDYgYnl0ZXMsIG9yIG9uZSAxNi1iaXQgY2hhcmFjdGVyIG9mIHVwIHRvIHRocmVlIGJ5dGVzCisgKiBwbHVzIHR3byBmb2xsb3dpbmcgY29tcG9zaW5nIGNoYXJhY3RlcnMgb2YgdGhyZWUgYnl0ZXMgZWFjaC4gKi8KKyMgZGVmaW5lIE1CX01BWEJZVEVTCTkKKworLyoKKyAqIFJldHVybiBieXRlIGxlbmd0aCBvZiBjaGFyYWN0ZXIgdGhhdCBzdGFydHMgd2l0aCBieXRlICJiIi4KKyAqIFJldHVybnMgMSBmb3IgYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIuCisgKiBNQl9CWVRFMkxFTl9DSEVDSygpIGNhbiBiZSB1c2VkIHRvIGNvdW50IGEgc3BlY2lhbCBrZXkgYXMgb25lIGJ5dGUuCisgKiBEb24ndCBjYWxsIE1CX0JZVEUyTEVOKGIpIHdpdGggYiA8IDAgb3IgYiA+IDI1NSEKKyAqLworIyBkZWZpbmUgTUJfQllURTJMRU4oYikJCW1iX2J5dGVsZW5fdGFiW2JdCisjIGRlZmluZSBNQl9CWVRFMkxFTl9DSEVDSyhiKQkoKChiKSA8IDAgfHwgKGIpID4gMjU1KSA/IDEgOiBtYl9ieXRlbGVuX3RhYltiXSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkKKy8qIHByb3BlcnRpZXMgdXNlZCBpbiBlbmNfY2Fub25fdGFibGVbXSAoZmlyc3QgdGhyZWUgbXV0dWFsbHkgZXhjbHVzaXZlKSAqLworIyBkZWZpbmUgRU5DXzhCSVQJMHgwMQorIyBkZWZpbmUgRU5DX0RCQ1MJMHgwMgorIyBkZWZpbmUgRU5DX1VOSUNPREUJMHgwNAorCisjIGRlZmluZSBFTkNfRU5ESUFOX0IJMHgxMAkgICAgLyogVW5pY29kZTogQmlnIGVuZGlhbiAqLworIyBkZWZpbmUgRU5DX0VORElBTl9MCTB4MjAJICAgIC8qIFVuaWNvZGU6IExpdHRsZSBlbmRpYW4gKi8KKworIyBkZWZpbmUgRU5DXzJCWVRFCTB4NDAJICAgIC8qIFVuaWNvZGU6IFVDUy0yICovCisjIGRlZmluZSBFTkNfNEJZVEUJMHg4MAkgICAgLyogVW5pY29kZTogVUNTLTQgKi8KKyMgZGVmaW5lIEVOQ18yV09SRAkweDEwMAkgICAgLyogVW5pY29kZTogVVRGLTE2ICovCisKKyMgZGVmaW5lIEVOQ19MQVRJTjEJMHgyMDAJICAgIC8qIExhdGluMSAqLworIyBkZWZpbmUgRU5DX01BQ1JPTUFOCTB4NDAwCSAgICAvKiBNYWMgUm9tYW4gKG5vdCBNYWNybyBNYW4hIDotKSAqLworI2VuZGlmCisKKyNpZmRlZiBGRUFUX01CWVRFCisjIGlmZGVmIFVTRV9JQ09OVgorIyAgaWZuZGVmIEVJTFNFUQorIyAgIGRlZmluZSBFSUxTRVEgMTIzCisjICBlbmRpZgorIyAgaWZkZWYgRFlOQU1JQ19JQ09OVgorLyogT24gV2luMzIgaWNvbnYuZGxsIGlzIGR5bmFtaWNhbGx5IGxvYWRlZC4gKi8KKyMgICBkZWZpbmUgSUNPTlZfRVJSTk8gKCppY29udl9lcnJubygpKQorIyAgIGRlZmluZSBJQ09OVl9FMkJJRyAgNworIyAgIGRlZmluZSBJQ09OVl9FSU5WQUwgMjIKKyMgICBkZWZpbmUgSUNPTlZfRUlMU0VRIDQyCisjICBlbHNlCisjICAgZGVmaW5lIElDT05WX0VSUk5PIGVycm5vCisjICAgZGVmaW5lIElDT05WX0UyQklHICBFMkJJRworIyAgIGRlZmluZSBJQ09OVl9FSU5WQUwgRUlOVkFMCisjICAgZGVmaW5lIElDT05WX0VJTFNFUSBFSUxTRVEKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZgorCisvKiBJU1NZTUxJTksobW9kZSkgdGVzdHMgaWYgYSBmaWxlIGlzIGEgc3ltYm9saWMgbGluay4gKi8KKyNpZiAoZGVmaW5lZChTX0lGTVQpICYmIGRlZmluZWQoU19JRkxOSykpIHx8IGRlZmluZWQoU19JU0xOSykKKyMgZGVmaW5lIEhBVkVfSVNTWU1MSU5LCisjIGlmIGRlZmluZWQoU19JRk1UKSAmJiBkZWZpbmVkKFNfSUZMTkspCisjICBkZWZpbmUgSVNTWU1MSU5LKG1vZGUpICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGTE5LKQorIyBlbHNlCisjICBkZWZpbmUgSVNTWU1MSU5LKG1vZGUpIFNfSVNMTksobW9kZSkKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNJR05fQllURSAxCSAgICAvKiBieXRlIHZhbHVlIHVzZWQgd2hlcmUgc2lnbiBpcyBkaXNwbGF5ZWQ7CisJCQkgICAgICAgYXR0cmlidXRlIHZhbHVlIGlzIHNpZ24gdHlwZSAqLworCisjaWZkZWYgRkVBVF9ORVRCRUFOU19JTlRHCisjIGRlZmluZSBNVUxUSVNJR05fQllURSAyICAgLyogYnl0ZSB2YWx1ZSB1c2VkIHdoZXJlIHNpZ24gaXMgZGlzcGxheWVkIGlmCisJCQkgICAgICAgbXVsdGlwbGUgc2lnbnMgZXhpc3Qgb24gdGhlIGxpbmUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChGRUFUX1hDTElQQk9BUkQpCisjIGlmZGVmIEZFQVRfR1VJX0dUSworICAgLyogQXZvaWQgdXNpbmcgYSBnbG9iYWwgdmFyaWFibGUgZm9yIHRoZSBYIGRpc3BsYXkuICBJdCdzIHVnbHkKKyAgICAqIGFuZCBpcyBsaWtlbHkgdG8gY2F1c2UgdHJvdWJsZSBpbiBtdWx0aWhlYWQgZW52aXJvbm1lbnRzLiAqLworIyAgZGVmaW5lIFhfRElTUExBWQkoKGd1aS5pbl91c2UpID8gZ3VpX21jaF9nZXRfZGlzcGxheSgpIDogeHRlcm1fZHB5KQorIyBlbHNlCisjICBkZWZpbmUgWF9ESVNQTEFZCShndWkuaW5fdXNlID8gZ3VpLmRweSA6IHh0ZXJtX2RweSkKKyMgZW5kaWYKKyNlbHNlCisjIGlmZGVmIEZFQVRfR1VJCisjICBpZmRlZiBGRUFUX0dVSV9HVEsKKyMgICBkZWZpbmUgWF9ESVNQTEFZCSgoZ3VpLmluX3VzZSkgPyBndWlfbWNoX2dldF9kaXNwbGF5KCkgOiAoRGlzcGxheSAqKU5VTEwpCisjICBlbHNlCisjICAgZGVmaW5lIFhfRElTUExBWQlndWkuZHB5CisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgWF9ESVNQTEFZCXh0ZXJtX2RweQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBOQkRFQlVHIC8qIE5ldGJlYW5zIGRlYnVnZ2luZy4gKi8KKyMgaW5jbHVkZSAibmJkZWJ1Zy5oIgorI2Vsc2UKKyMgZGVmaW5lIG5iZGVidWcoYSkKKyNlbmRpZgorCisjaWZkZWYgSU5fUEVSTF9GSUxFCisgIC8qCisgICAqIEF2b2lkIGNsYXNoZXMgYmV0d2VlbiBQZXJsIGFuZCBWaW0gbmFtZXNwYWNlLgorICAgKi8KKyMgdW5kZWYgTk9STUFMCisjIHVuZGVmIFNUUkxFTgorIyB1bmRlZiBGRgorIyB1bmRlZiBPUF9ERUxFVEUKKyMgdW5kZWYgT1BfSk9JTgorIyBpZmRlZiBfX0JPUkxBTkRDX18KKyMgIGRlZmluZSBOT1BST1RPIDEKKyMgZW5kaWYKKyAgLyogcmVtb3ZlIE1BWCBhbmQgTUlOLCBpbmNsdWRlZCBieSBnbGliLmgsIHJlZGVmaW5lZCBieSBzeXMvcGFyYW0uaCAqLworIyBpZmRlZiBNQVgKKyMgIHVuZGVmIE1BWAorIyBlbmRpZgorIyBpZmRlZiBNSU4KKyMgIHVuZGVmIE1JTgorIyBlbmRpZgorICAvKiBXZSB1c2UgXygpIGZvciBnZXR0ZXh0KCksIFBlcmwgdXNlcyBpdCBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcy4uLiAqLworIyBpZmRlZiBfCisjICB1bmRlZiBfCisjIGVuZGlmCisjIGlmZGVmIERFQlVHCisjICB1bmRlZiBERUJVRworIyBlbmRpZgorIyBpZmRlZiBfREVCVUcKKyMgIHVuZGVmIF9ERUJVRworIyBlbmRpZgorIyBpZmRlZiBpbnN0cgorIyAgdW5kZWYgaW5zdHIKKyMgZW5kaWYKKyAgLyogYm9vbCBjYXVzZXMgdHJvdWJsZSBvbiBNQUNPUyBidXQgaXMgcmVxdWlyZWQgb24gYSBmZXcgb3RoZXIgc3lzdGVtcyAqLworIyBpZiBkZWZpbmVkKGJvb2wpICYmIGRlZmluZWQoTUFDT1MpCisjICB1bmRlZiBib29sCisjIGVuZGlmCisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCisgIC8qIEJvcmxhbmQgaGFzIHRoZSBzdHJ1Y3R1cmUgc3RhdGk2NCBidXQgbm90IF9zdGF0aTY0ICovCisjICBkZWZpbmUgX3N0YXRpNjQgc3RhdGk2NAorIyBlbmRpZgorCisjIGluY2x1ZGUgPEVYVEVSTi5oPgorIyBpbmNsdWRlIDxwZXJsLmg+CisjIGluY2x1ZGUgPFhTVUIuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogVklNX19IICovCmRpZmYgLS1naXQgYS9zcmMvdmltLmljbyBiL3NyYy92aW0uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTQwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmltLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdmltLnJjIGIvc3JjL3ZpbS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QzNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbS5yYwpAQCAtMCwwICsxLDEzNSBAQAorLy8gdmltOnRzPTg6c3c9NDpzdHM9NDoKKy8vCisvLyBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorLy8KKy8vIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorLy8gRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisKKy8vIHZpbS5yYworLy8gICBJY29uIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgV2luMzIgdmVyc2lvbiBvZiBWaW0KKy8vICAgTXVzdCBiZSBpbiBET1MgZm9ybWF0IDxDUj48Tkw+IQorCisjaWZkZWYgX19NSU5HVzMyX18KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpZm5kZWYgVlNfRkZJX0ZJTEVGTEFHU01BU0sKKyMgIGRlZmluZSBWU19GRklfRklMRUZMQUdTTUFTSyAgICAweDAwMDAwMDNGTAorIyBlbmRpZgorIyBpZm5kZWYgVk9TX19XSU5ET1dTMzIKKyMgIGRlZmluZSBWT1NfX1dJTkRPV1MzMgkgIDB4MDAwMDAwMDRMCisjIGVuZGlmCisjZWxzZQorIyBpbmNsdWRlIDx3aW52ZXIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJndWlfdzMyX3JjLmgiCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorIyBpbmNsdWRlIDx3aW5yZXNyYy5oPgorI2Vsc2UKKyMgaWZuZGVmIF9fTUlOR1czMl9fCisjICBpbmNsdWRlIDx3aW5yZXMuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisvLworLy8gSWNvbnMKKy8vCitJRFJfVklNCQlJQ09OICJ2aW0uaWNvIgorCisjaWZkZWYgRkVBVF9HVUlfVzMyCitJRFJfVklNX0VSUk9SCUlDT04gInZpbV9lcnJvci5pY28iCitJRFJfVklNX0FMRVJUCUlDT04gInZpbV9hbGVydC5pY28iCitJRFJfVklNX0lORk8JSUNPTiAidmltX2luZm8uaWNvIgorSURSX1ZJTV9RVUVTVElPTiBJQ09OICJ2aW1fcXVlc3QuaWNvIgorCisvLworLy8gQml0bWFwcworLy8KK0lEQl9URUFST0ZGCUJJVE1BUCAgRElTQ0FSREFCTEUgICJ0ZWFyb2ZmLmJtcCIKK0lEUl9UT09MQkFSMQlCSVRNQVAgIERJU0NBUkRBQkxFICAidG9vbHMuYm1wIgorCisvLworLy8gV2luWFAgdGhlbWUgc3VwcG9ydAorLy8KKyNpZm5kZWYgQ1JFQVRFUFJPQ0VTU19NQU5JRkVTVF9SRVNPVVJDRV9JRAorIyBkZWZpbmUgQ1JFQVRFUFJPQ0VTU19NQU5JRkVTVF9SRVNPVVJDRV9JRCAxCisjZW5kaWYKKyNpZm5kZWYgUlRfTUFOSUZFU1QKKyMgZGVmaW5lIFJUX01BTklGRVNUIDI0CisjZW5kaWYKKworQ1JFQVRFUFJPQ0VTU19NQU5JRkVTVF9SRVNPVVJDRV9JRCBSVF9NQU5JRkVTVCAiZ3ZpbS5leGUubW5mIgorI2VuZGlmIC8vIEZFQVRfR1VJX1czMgorCisvLworLy8gVHlwZSBMaWJyYXJ5CisvLworI2lmZGVmIEZFQVRfT0xFCisgMSBUWVBFTElCICJWSU0uVExCIgorI2VuZGlmCisKKy8vCisvLyBWZXJzaW9uCisvLworCitWU19WRVJTSU9OX0lORk8JCVZFUlNJT05JTkZPCisgIEZJTEVWRVJTSU9OCQlWSU1fVkVSU0lPTl9NQUpPUixWSU1fVkVSU0lPTl9NSU5PUixWSU1fVkVSU0lPTl9CVUlMRCxWSU1fVkVSU0lPTl9QQVRDSExFVkVMCisgIFBST0RVQ1RWRVJTSU9OCVZJTV9WRVJTSU9OX01BSk9SLFZJTV9WRVJTSU9OX01JTk9SLFZJTV9WRVJTSU9OX0JVSUxELFZJTV9WRVJTSU9OX1BBVENITEVWRUwKKyAgRklMRUZMQUdTTUFTSwkJVlNfRkZJX0ZJTEVGTEFHU01BU0sKKworI2lmIFZJTV9WRVJTSU9OX1BBVENITEVWRUwgPiAwCisgI2lmZGVmIF9ERUJVRworICBGSUxFRkxBR1MJCVZTX0ZGX1BSRVJFTEVBU0UgfCBWU19GRl9ERUJVRyB8IFZTX0ZGX1BBVENIRUQKKyAjZWxzZQorICBGSUxFRkxBR1MJCVZTX0ZGX1BSRVJFTEVBU0UgfCBWU19GRl9QQVRDSEVECisgI2VuZGlmCisjZWxzZQorICNpZmRlZiBfREVCVUcKKyAgRklMRUZMQUdTCQlWU19GRl9QUkVSRUxFQVNFIHwgVlNfRkZfREVCVUcKKyAjZWxzZQorICBGSUxFRkxBR1MJCVZTX0ZGX1BSRVJFTEVBU0UKKyAjZW5kaWYKKyNlbmRpZgorCisgIEZJTEVPUwkJVk9TX19XSU5ET1dTMzIKKyAgRklMRVRZUEUJCVZGVF9BUFAKKyAgRklMRVNVQlRZUEUJCTB4MEwKK0JFR0lOCisgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgQkVHSU4KKyAgICAvLyAweDA0MDkgPT0gVS5TLiBFbmdsaXNoOyAweDA0RTQgPT4gV2luZG93cyBNdWx0aWxpbmd1YWwKKyAgICBCTE9DSyAiMDQwOTA0RTQiCisgICAgQkVHSU4KKwlWQUxVRSAiQ29tcGFueU5hbWUiLAkJIlZpbSBEZXZlbG9wZXJzXDAiCisJVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsCSJWaSBJbXByb3ZlZCAtIEEgVGV4dCBFZGl0b3JcMCIKKwlWQUxVRSAiRmlsZVZlcnNpb24iLAkJVklNX1ZFUlNJT05fTUFKT1JfU1RSICIsICIgVklNX1ZFUlNJT05fTUlOT1JfU1RSICIsICIgVklNX1ZFUlNJT05fQlVJTERfU1RSICIsICIgVklNX1ZFUlNJT05fUEFUQ0hMRVZFTF9TVFIgICJcMCIKKwlWQUxVRSAiSW50ZXJuYWxOYW1lIiwJCSJWSU1cMCIKKwlWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLAkJIkNvcHlyaWdodCBcMjUxIDE5OTYtMjAwM1wwIgorCVZBTFVFICJMZWdhbFRyYWRlbWFya3MiLAkiVmltXDAiCisJVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLAkiVklNLkVYRVwwIgorCVZBTFVFICJQcm9kdWN0TmFtZSIsCQkiVmltXDAiCisJVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwJCVZJTV9WRVJTSU9OX01BSk9SX1NUUiAiLCAiIFZJTV9WRVJTSU9OX01JTk9SX1NUUiAiLCAiIFZJTV9WRVJTSU9OX0JVSUxEX1NUUiAiLCAiIFZJTV9WRVJTSU9OX1BBVENITEVWRUxfU1RSICJcMCIKKyAgICBFTkQKKyAgRU5ECisgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgQkVHSU4KKwlWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMHg0RTQKKyAgRU5ECitFTkQKKworLyoKKyAqICBQcmludGluZyBTdGF0dXMgRGlhbG9nIChzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gRkVBVF9QUklOVEVSIGlzIGRlZmluZWQpCisgKi8KKyNkZWZpbmUgSURDX0JPWDEJCTQwMAorI2RlZmluZSBJRENfUFJJTlRURVhUMQkJNDAxCisjZGVmaW5lIElEQ19QUklOVFRFWFQyCQk0MDIKKyNkZWZpbmUgSURDX1BST0dSRVNTCQk0MDMKK1BSSU5URExHQk9YIERJQUxPRyAxMTUsIDYzLCAyMTAsIDgwCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0ZPTlQgOCwgIkhlbHYiCitCRUdJTgorICAgIERFRlBVU0hCVVRUT04gICAiQ2FuY2VsIiwgSURDQU5DRUwsIDg1LCA2MCwgNDAsIDE0CisgICAgQ1RFWFQJICAgICJQcmludGluZyIsSURDX1BSSU5UVEVYVDEsMjMsMTUsMTU3LDgKKyAgICBDVEVYVAkgICAgIiAiLElEQ19QUklOVFRFWFQyLDIzLDI1LDE1Nyw4CisgICAgQ1RFWFQJICAgICJJbml0aWFsaXppbmcuLi4iLElEQ19QUk9HUkVTUywyNCwzOCwxNTcsOAorICAgIEdST1VQQk9YCSAgICAiIixJRENfQk9YMSwxOSw5LDE3MCw0NworRU5ECmRpZmYgLS1naXQgYS9zcmMvdmltLnRsYiBiL3NyYy92aW0udGxiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjYwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmltLnRsYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdmltMTYuZGVmIGIvc3JjL3ZpbTE2LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I4YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbTE2LmRlZgpAQCAtMCwwICsxLDUgQEAKK0NPREUgUFJFTE9BRCBFWEVDVVRFT05MWQorREFUQSBNVUxUSVBMRSBTSEFSRUQKK0RFU0NSSVBUSU9OICdWaW0gNy4wYWEnCitTVEFDS1NJWkUgMTYwMDAKK0hFQVBTSVpFIDEwMDAwCmRpZmYgLS1naXQgYS9zcmMvdmltMTYucmMgYi9zcmMvdmltMTYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyOWUwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92aW0xNi5yYwpAQCAtMCwwICsxLDgxIEBACisvLyB2aW06dHM9ODpzdz00OnN0cz00OgorLy8KKy8vIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisvLworLy8gRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisvLyBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKworLy8gdmltLnJjCisvLyAgIEljb24gYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBXaW4zMiB2ZXJzaW9uIG9mIFZpbQorLy8gICBNdXN0IGJlIGluIERPUyBmb3JtYXQgPENSPjxOTD4hCisKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZ3VpX3czfjEuaCIKKyNpbmNsdWRlICJndWl3MTZyYy5oIgorCisvLworLy8gSWNvbnMKKy8vCitJRFJfVklNIElDT04gIlZJTS5JQ08iCisKKyNpZm5kZWYgRkVBVF9USU5ZCitJRFJfVklNX0VSUk9SCUlDT04gIlZJTV9FUn4xLklDTyIKK0lEUl9WSU1fQUxFUlQJSUNPTiAiVklNX0FMfjEuSUNPIgorSURSX1ZJTV9JTkZPCUlDT04gIlZJTV9JTkZPLklDTyIKK0lEUl9WSU1fUVVFU1RJT04gSUNPTiAiVklNX1FVfjEuSUNPIgorI2VuZGlmCisKKy8vCisvLyBCaXRtYXBzCisvLworI2lmZGVmIEZFQVRfVE9PTEJBUgorSURSX1RPT0xCQVIxCUJJVE1BUCAgRElTQ0FSREFCTEUgICJ0b29sczE2LmJtcCIKKyNlbmRpZgorLy8KKy8vIFZlcnNpb24KKy8vCisKK1ZTX1ZFUlNJT05fSU5GTwkJVkVSU0lPTklORk8KKyAgRklMRVZFUlNJT04JCVZJTV9WRVJTSU9OX01BSk9SLFZJTV9WRVJTSU9OX01JTk9SLFZJTV9WRVJTSU9OX0JVSUxELFZJTV9WRVJTSU9OX1BBVENITEVWRUwKKyAgUFJPRFVDVFZFUlNJT04JVklNX1ZFUlNJT05fTUFKT1IsVklNX1ZFUlNJT05fTUlOT1IsVklNX1ZFUlNJT05fQlVJTEQsVklNX1ZFUlNJT05fUEFUQ0hMRVZFTAorICBGSUxFRkxBR1NNQVNLCQlWU19GRklfRklMRUZMQUdTTUFTSworCisjaWYgVklNX1ZFUlNJT05fUEFUQ0hMRVZFTCA+IDAKKyAjaWZkZWYgX0RFQlVHCisgIEZJTEVGTEFHUwkJVlNfRkZfUFJFUkVMRUFTRSB8IFZTX0ZGX0RFQlVHIHwgVlNfRkZfUEFUQ0hFRAorICNlbHNlCisgIEZJTEVGTEFHUwkJVlNfRkZfUFJFUkVMRUFTRSB8IFZTX0ZGX1BBVENIRUQKKyAjZW5kaWYKKyNlbHNlCisgI2lmZGVmIF9ERUJVRworICBGSUxFRkxBR1MJCVZTX0ZGX1BSRVJFTEVBU0UgfCBWU19GRl9ERUJVRworICNlbHNlCisgIEZJTEVGTEFHUwkJVlNfRkZfUFJFUkVMRUFTRQorICNlbmRpZgorI2VuZGlmCisKKyAgRklMRU9TCQlWT1NfX1dJTkRPV1MzMgorICBGSUxFVFlQRQkJVkZUX0FQUAorICBGSUxFU1VCVFlQRQkJMHgwTAorQkVHSU4KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICBCRUdJTgorICAgIC8vIDB4MDQwOSA9PSBVLlMuIEVuZ2xpc2g7IDB4MDRFNCA9PiBXaW5kb3dzIE11bHRpbGluZ3VhbAorICAgIEJMT0NLICIwNDA5MDRFNCIKKyAgICBCRUdJTgorCVZBTFVFICJDb21wYW55TmFtZSIsCQkiVmltIERldmVsb3BlcnNcMCIKKwlWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwJIlZpIEltcHJvdmVkIC0gQSBUZXh0IEVkaXRvclwwIgorCVZBTFVFICJGaWxlVmVyc2lvbiIsCQlWSU1fVkVSU0lPTl9NQUpPUl9TVFIgIiwgIiBWSU1fVkVSU0lPTl9NSU5PUl9TVFIgIiwgIiBWSU1fVkVSU0lPTl9CVUlMRF9TVFIgIiwgIiBWSU1fVkVSU0lPTl9QQVRDSExFVkVMX1NUUiAgIlwwIgorCVZBTFVFICJJbnRlcm5hbE5hbWUiLAkJIlZJTVwwIgorCVZBTFVFICJMZWdhbENvcHlyaWdodCIsCQkiQ29weXJpZ2h0IFwyNTEgMTk5Ni0xOTk5XDAiCisJVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsCSJWaW1cMCIKKwlWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJWSU0uRVhFXDAiCisJVkFMVUUgIlByb2R1Y3ROYW1lIiwJCSJWaW1cMCIKKwlWQUxVRSAiUHJvZHVjdFZlcnNpb24iLAkJVklNX1ZFUlNJT05fTUFKT1JfU1RSICIsICIgVklNX1ZFUlNJT05fTUlOT1JfU1RSICIsICIgVklNX1ZFUlNJT05fQlVJTERfU1RSICIsICIgVklNX1ZFUlNJT05fUEFUQ0hMRVZFTF9TVFIgIlwwIgorICAgIEVORAorICBFTkQKKyAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICBCRUdJTgorCVZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAweDRFNAorICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvc3JjL3ZpbV9hbGVydC5pY28gYi9zcmMvdmltX2FsZXJ0LmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q5ODJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbV9hbGVydC5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3ZpbV9lcnJvci5pY28gYi9zcmMvdmltX2Vycm9yLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZiYWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbV9lcnJvci5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3ZpbV9pY29uLnhibSBiL3NyYy92aW1faWNvbi54Ym0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhMjRiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92aW1faWNvbi54Ym0KQEAgLTAsMCArMSwxNCBAQAorI2RlZmluZSB2aW1faWNvbl93aWR0aCAzMgorI2RlZmluZSB2aW1faWNvbl9oZWlnaHQgMzIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHZpbV9pY29uX2JpdHNbXSA9IHsKKyAgIDB4MDAsIDB4ODAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDMsIDB4MDAsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsCisgICAweDA0LCAweDgwLCAweDAzLCAweDIwLCAweDA0LCAweDgwLCAweDBmLCAweDQwLCAweDA4LCAweGMwLCAweDFmLCAweDYwLAorICAgMHgxMCwgMHhlMCwgMHgzZiwgMHg2MCwgMHgxMCwgMHhlMCwgMHgxZiwgMHgzMCwgMHgxMCwgMHhlMCwgMHgwZiwgMHgxOCwKKyAgIDB4MTAsIDB4ZTAsIDB4MDcsIDB4MGUsIDB4MTAsIDB4ZTAsIDB4MDMsIDB4MDcsIDB4MTAsIDB4ZTAsIDB4ODEsIDB4MGYsCisgICAweDE4LCAweGUwLCAweDgwLCAweDFmLCAweDFjLCAweDYwLCAweGUwLCAweDNmLCAweDFlLCAweDIwLCAweGYwLCAweDdmLAorICAgMHgxZiwgMHgwMCwgMHhmOCwgMHhmZiwgMHgxZiwgMHgwMCwgMHhmYywgMHhmZiwgMHgxZSwgMHgwMCwgMHhmYywgMHg3ZiwKKyAgIDB4MWMsIDB4MDAsIDB4ZmYsIDB4M2YsIDB4MTgsIDB4ODAsIDB4ZmMsIDB4MWYsIDB4MTAsIDB4ODAsIDB4ZmMsIDB4MGYsCisgICAweDEwLCAweGMwLCAweGZmLCAweDVmLCAweDEwLCAweDYwLCAweDQ0LCAweDI0LCAweDEwLCAweDUwLCAweDBjLCAweDQwLAorICAgMHgxMCwgMHg3MCwgMHhjZSwgMHgyNCwgMHgxMCwgMHg3YywgMHg2ZSwgMHgyNiwgMHgxMCwgMHg3YSwgMHg2NiwgMHgyNiwKKyAgIDB4MTAsIDB4M2QsIDB4MjIsIDB4MTMsIDB4YTAsIDB4MzIsIDB4MzIsIDB4NjcsIDB4ZDAsIDB4ZTEsIDB4ZGYsIDB4MWMsCisgICAweDAwLCAweGMwLCAweDQzLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwfTsKZGlmZiAtLWdpdCBhL3NyYy92aW1faW5mby5pY28gYi9zcmMvdmltX2luZm8uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDQzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmltX2luZm8uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy92aW1fbWFzay54Ym0gYi9zcmMvdmltX21hc2sueGJtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGQ5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmltX21hc2sueGJtCkBAIC0wLDAgKzEsMTQgQEAKKyNkZWZpbmUgdmltX21hc2tfaWNvbl93aWR0aCAzMgorI2RlZmluZSB2aW1fbWFza19pY29uX2hlaWdodCAzMgorc3RhdGljIHVuc2lnbmVkIGNoYXIgdmltX21hc2tfaWNvbl9iaXRzW10gPSB7CisgICAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweGZjLCAweGZmLCAweGZmLCAweDNmLAorICAgMHhmYywgMHhmZiwgMHhmZiwgMHgzZiwgMHhmYywgMHhmZiwgMHhmZiwgMHg3ZiwgMHhmOCwgMHhmZiwgMHhmZiwgMHg3ZiwKKyAgIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4MWYsCisgICAweGYwLCAweGZmLCAweGZmLCAweDBmLCAweGYwLCAweGZmLCAweGZmLCAweDA3LCAweGYwLCAweGZmLCAweGZmLCAweDBmLAorICAgMHhmOCwgMHhmZiwgMHhmZiwgMHgxZiwgMHhmYywgMHhmZiwgMHhmZiwgMHgzZiwgMHhmZSwgMHhmZiwgMHhmZiwgMHg3ZiwKKyAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsCisgICAweGZjLCAweGZmLCAweGZmLCAweDNmLCAweGY4LCAweGZmLCAweGZmLCAweDFmLCAweGYwLCAweGZmLCAweGZmLCAweDBmLAorICAgMHhmMCwgMHhmZiwgMHhmZiwgMHg1ZiwgMHhmMCwgMHhmZiwgMHhmZiwgMHgzZiwgMHhmMCwgMHhmZiwgMHhmZiwgMHg3ZiwKKyAgIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4M2YsCisgICAweGYwLCAweGZmLCAweGZmLCAweDNmLCAweGYwLCAweGZmLCAweGZmLCAweDdmLCAweGQwLCAweGUxLCAweGRmLCAweDFjLAorICAgMHgwMCwgMHhjMCwgMHg0MywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMH07CmRpZmYgLS1naXQgYS9zcmMvdmltX3F1ZXN0LmljbyBiL3NyYy92aW1fcXVlc3QuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmltX3F1ZXN0LmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdmltcnVuLmMgYi9zcmMvdmltcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNTA3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92aW1ydW4uYwpAQCAtMCwwICsxLDExNyBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoJCQl0aGlzIGZpbGUgYnkgVmluY2UgTmVncmkKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIHZpbXJ1bi5jIC0gVGlueSBXaW4zMiBwcm9ncmFtIHRvIHNhZmVseSBydW4gYW4gZXh0ZXJuYWwgY29tbWFuZCBpbiBhCisgKgkgICAgICBET1MgY29uc29sZS4KKyAqCSAgICAgIFRoaXMgcHJvZ3JhbSBpcyByZXF1aXJlZCB0byBhdm9pZCB0aGF0IHR5cGluZyBDVFJMLUMgaW4gdGhlIERPUworICoJICAgICAgY29uc29sZSBraWxscyBWaW0uICBOb3cgaXQgb25seSBraWxscyB2aW1ydW4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZuZGVmIF9fQ1lHV0lOX18KKyMgaW5jbHVkZSA8Y29uaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgX19CT1JMQU5EQ19fCitleHRlcm4gY2hhciAqCisjaWZkZWYgX1JUTERMTAorX19pbXBvcnQKKyNlbmRpZgorX29zY21kOworIyBkZWZpbmUgX2tiaGl0IGtiaGl0CisjIGRlZmluZSBfZ2V0Y2ggZ2V0Y2gKKyNlbHNlCisjIGlmZGVmIF9fTUlOR1czMl9fCisjICBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICBlbmRpZgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyBlbHNlCisjICBpZmRlZiBfX0NZR1dJTl9fCisjICAgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICBkZWZpbmUgX2dldGNoIGdldGNoYXIKKyMgIGVsc2UKK2V4dGVybiBjaGFyICpfYWNtZGxuOworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisgICAgaW50CittYWluKHZvaWQpCit7CisgICAgY29uc3QgY2hhcgkqcDsKKyAgICBpbnQJCXJldHZhbDsKKyAgICBpbnQJCWlucXVvdGUgPSAwOworICAgIGludAkJc2lsZW50ID0gMDsKKworI2lmZGVmIF9fQk9STEFORENfXworICAgIHAgPSBfb3NjbWQ7CisjZWxzZQorIyBpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgICAgcCA9IChjb25zdCBjaGFyICopR2V0Q29tbWFuZExpbmUoKTsKKyMgZWxzZQorICAgIHAgPSBfYWNtZGxuOworIyBlbmRpZgorI2VuZGlmCisgICAgLyoKKyAgICAgKiBTa2lwIHRoZSBleGVjdXRhYmxlIG5hbWUsIHdoaWNoIG1pZ2h0IGJlIGluICIiLgorICAgICAqLworICAgIHdoaWxlICgqcCkKKyAgICB7CisJaWYgKCpwID09ICciJykKKwkgICAgaW5xdW90ZSA9ICFpbnF1b3RlOworCWVsc2UgaWYgKCFpbnF1b3RlICYmICpwID09ICcgJykKKwl7CisJICAgICsrcDsKKwkgICAgYnJlYWs7CisJfQorCSsrcDsKKyAgICB9CisKKyAgICAvKgorICAgICAqICItcyIgYXJndW1lbnQ6IGRvbid0IHdhaXQgZm9yIGEga2V5IGhpdC4KKyAgICAgKi8KKyAgICBpZiAocFswXSA9PSAnLScgJiYgcFsxXSA9PSAncycgJiYgcFsyXSA9PSAnICcpCisgICAgeworCXNpbGVudCA9IDE7CisJcCArPSAzOworCXdoaWxlICgqcCA9PSAnICcpCisJICAgICsrcDsKKyAgICB9CisKKyAgICAvKiBQcmludCB0aGUgY29tbWFuZCwgaW5jbHVkaW5nIHF1b3RlcyBhbmQgcmVkaXJlY3Rpb24uICovCisgICAgcHV0cyhwKTsKKworICAgIC8qCisgICAgICogRG8gaXQhCisgICAgICovCisgICAgcmV0dmFsID0gc3lzdGVtKHApOworCisgICAgaWYgKHJldHZhbCAhPSAwKQorCXByaW50Zigic2hlbGwgcmV0dXJuZWQgJWRcbiIsIHJldHZhbCk7CisKKyAgICBpZiAoIXNpbGVudCkKKyAgICB7CisJcHV0cygiSGl0IGFueSBrZXkgdG8gY2xvc2UgdGhpcyB3aW5kb3cuLi4iKTsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisJd2hpbGUgKF9rYmhpdCgpKQorCSAgICAodm9pZClfZ2V0Y2goKTsKKyNlbmRpZgorCSh2b2lkKV9nZXRjaCgpOworICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9zcmMvdmltdGJhci5kbGwgYi9zcmMvdmltdGJhci5kbGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmE4ZGZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy92aW10YmFyLmRsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdmltdGJhci5oIGIvc3JjL3ZpbXRiYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI3ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbXRiYXIuaApAQCAtMCwwICsxLDE4NSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoJCQlXaW4xNiBUb29sYmFyIGJ5IFZpbmNlIE5lZ3JpIC0gRXh0ZXJuYWwgSGVhZGVyCisgKgkJCShCYXNlZCBvbiBNUyBTYW1wbGUgQ29kZSkKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICovCisvLworLy8gQnV0dG9uIFN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IHRhZ1RCQlVUVE9OCit7CisgICAgaW50ICBpQml0bWFwOwkgLy8gaW5kZXggaW50byBiaXRtYXAgb2YgdGhpcyBidXR0b24ncyBwaWN0dXJlCisgICAgaW50ICBpZENvbW1hbmQ7CSAvLyBXTV9DT01NQU5EIG1lbnUgSUQgdGhhdCB0aGlzIGJ1dHRvbiBzZW5kcworICAgIEJZVEUgZnNTdGF0ZTsJIC8vIGJ1dHRvbidzIHN0YXRlCisgICAgQllURSBmc1N0eWxlOwkgLy8gYnV0dG9uJ3Mgc3R5bGUKK30gVEJCVVRUT047CisKK3R5cGVkZWYgVEJCVVRUT04gTkVBUiogUFRCQlVUVE9OOwordHlwZWRlZiBUQkJVVFRPTiBGQVIqIExQVEJCVVRUT047Cit0eXBlZGVmIGNvbnN0IFRCQlVUVE9OIEZBUiogTFBDVEJCVVRUT047CisKKworLy8KKy8vIFN0eWxlcworLy8KKyNkZWZpbmUgVEJTVFlMRV9CVVRUT04JCTB4MDAJLy8gdGhpcyBlbnRyeSBpcyBidXR0b24KKyNkZWZpbmUgVEJTVFlMRV9TRVAJCTB4MDEJLy8gdGhpcyBlbnRyeSBpcyBhIHNlcGFyYXRvcgorI2RlZmluZSBUQlNUWUxFX0NIRUNLCQkweDAyCS8vIHRoaXMgaXMgYSBjaGVjayBidXR0b24gKGl0IHN0YXlzIGRvd24pCisjZGVmaW5lIFRCU1RZTEVfR1JPVVAJCTB4MDQJLy8gdGhpcyBpcyBhIGNoZWNrIGJ1dHRvbiAoaXQgc3RheXMgZG93bikKKyNkZWZpbmUgVEJTVFlMRV9DSEVDS0dST1VQCShUQlNUWUxFX0dST1VQIHwgVEJTVFlMRV9DSEVDSykgLy8gdGhpcyBncm91cCBpcyBhIG1lbWJlciBvZiBhIGdyb3VwIHJhZGlvIGdyb3VwCisKKy8vCisvLyBTdGF0ZXMKKy8vCisjZGVmaW5lIFRCU1RBVEVfQ0hFQ0tFRAkJMHgwMQkvLyByYWRpbyBidXR0b24gaXMgY2hlY2tlZAorI2RlZmluZSBUQlNUQVRFX1BSRVNTRUQJCTB4MDIJLy8gYnV0dG9uIGlzIGJlaW5nIGRlcHJlc3NlZCAoYW55IHN0eWxlKQorI2RlZmluZSBUQlNUQVRFX0VOQUJMRUQJCTB4MDQJLy8gYnV0dG9uIGlzIGVuYWJsZWQKKyNkZWZpbmUgVEJTVEFURV9ISURERU4JCTB4MDgJLy8gYnV0dG9uIGlzIGhpZGRlbgorI2RlZmluZSBUQlNUQVRFX0lOREVURVJNSU5BVEUgICAweDEwICAgIC8vIGJ1dHRvbiBpcyBpbmRldGVybWluYXRlCisjZGVmaW5lIFRCU1RBVEVfU0VMRUNURUQJMHgyMAkvLyBtb3VzZSBob3ZlcmluZyBvdmVyIGJ1dHRvbiAoZm9yIGNvb2xiYXIgbG9vaykKKworCisKK3R5cGVkZWYgc3RydWN0IHRhZ0FESlVTVElORk8KK3sKKyAgICBUQkJVVFRPTiB0YkJ1dHRvbjsKKyAgICBjaGFyIHN6RGVzY3JpcHRpb25bMV07Cit9IEFESlVTVElORk87CisKK3R5cGVkZWYgQURKVVNUSU5GTyBORUFSKiBQQURKVVNUSU5GTzsKK3R5cGVkZWYgQURKVVNUSU5GTyBGQVIqIExQQURKVVNUSU5GTzsKKworCitIV05EIFdJTkFQSSBDcmVhdGVUb29sYmFyKEhXTkQgaHduZCwgRFdPUkQgd3MsIFdPUkQgd0lELCBpbnQgbkJpdG1hcHMsCisJSElOU1RBTkNFIGhCTUluc3QsIFdPUkQgd0JNSUQsCisJTFBDVEJCVVRUT04gbHBCdXR0b25zLCBpbnQgaU51bUJ1dHRvbnMpOworCisjZGVmaW5lIENNQl9ESVNDQVJEQUJMRSAweDAxICAgIC8vIGNyZWF0ZSBiaXRtYXAgYXMgZGlzY2FyZGFibGUKKyNkZWZpbmUgQ01CX01BU0tFRCAgICAgIDB4MDIgICAgLy8gY3JlYXRlIGltYWdlL21hc2sgcGFpciBpbiBiaXRtYXAKKworCisjZGVmaW5lIFRCX0VOQUJMRUJVVFRPTgkoV01fVVNFUiArIDEpCisvLyB3UGFyYW06IFVJTlQsIGJ1dHRvbiBJRAorLy8gbFBhcmFtOiBCT09MIExPV09SRCwgZW5hYmxlIGlmIG5vbnplcm87IEhJV09SRCBub3QgdXNlZCwgMAorLy8gcmV0dXJuOiBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9DSEVDS0JVVFRPTgkoV01fVVNFUiArIDIpCisvLyB3UGFyYW06IFVJTlQsIGJ1dHRvbiBJRAorLy8gbFBhcmFtOiBCT09MIExPV09SRCwgY2hlY2sgaWYgbm9uemVybzsgSElXT1JEIG5vdCB1c2VkLCAwCisvLyByZXR1cm46IG5vdCB1c2VkCisvLworCisjZGVmaW5lIFRCX1BSRVNTQlVUVE9OCShXTV9VU0VSICsgMykKKy8vIHdQYXJhbTogVUlOVCwgYnV0dG9uIElECisvLyBsUGFyYW06IEJPT0wgTE9XT1JELCBwcmVzcyBpZiBub256ZXJvOyBISVdPUkQgbm90IHVzZWQsIDAKKy8vIHJldHVybjogbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfSElERUJVVFRPTgkoV01fVVNFUiArIDQpCisvLyB3UGFyYW06IFVJTlQsIGJ1dHRvbiBJRAorLy8gbFBhcmFtOiBCT09MIExPV09SRCwgaGlkZSBpZiBub256ZXJvOyBISVdPUkQgbm90IHVzZWQsIDAKKy8vIHJldHVybjogbm90IHVzZWQKKy8vCisjZGVmaW5lIFRCX0lOREVURVJNSU5BVEUJKFdNX1VTRVIgKyA1KQorLy8gd1BhcmFtOiBVSU5ULCBidXR0b24gSUQKKy8vIGxQYXJhbTogQk9PTCBMT1dPUkQsIG1ha2UgaW5kZXRlcm1pbmF0ZSBpZiBub256ZXJvOyBISVdPUkQgbm90IHVzZWQsIDAKKy8vIHJldHVybjogbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfSVNCVVRUT05FTkFCTEVECShXTV9VU0VSICsgOSkKKy8vIHdQYXJhbTogVUlOVCwgYnV0dG9uIElECisvLyBsUGFyYW06IG5vdCB1c2VkLCAwCisvLyByZXR1cm46IEJPT0wgTE9XT1JELCBlbmFibGVkIGlmIG5vbnplcm87IEhJV09SRCBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9JU0JVVFRPTkNIRUNLRUQJKFdNX1VTRVIgKyAxMCkKKy8vIHdQYXJhbTogVUlOVCwgYnV0dG9uIElECisvLyBsUGFyYW06IG5vdCB1c2VkLCAwCisvLyByZXR1cm46IEJPT0wgTE9XT1JELCBjaGVja2VkIGlmIG5vbnplcm87IEhJV09SRCBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9JU0JVVFRPTlBSRVNTRUQJKFdNX1VTRVIgKyAxMSkKKy8vIHdQYXJhbTogVUlOVCwgYnV0dG9uIElECisvLyBsUGFyYW06IG5vdCB1c2VkLCAwCisvLyByZXR1cm46IEJPT0wgTE9XT1JELCBwcmVzc2VkIGlmIG5vbnplcm87IEhJV09SRCBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9JU0JVVFRPTkhJRERFTgkoV01fVVNFUiArIDEyKQorLy8gd1BhcmFtOiBVSU5ULCBidXR0b24gSUQKKy8vIGxQYXJhbTogbm90IHVzZWQsIDAKKy8vIHJldHVybjogQk9PTCBMT1dPUkQsIGhpZGRlbiBpZiBub256ZXJvOyBISVdPUkQgbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfSVNCVVRUT05JTkRFVEVSTUlOQVRFCShXTV9VU0VSICsgMTMpCisvLyB3UGFyYW06IFVJTlQsIGJ1dHRvbiBJRAorLy8gbFBhcmFtOiBub3QgdXNlZCwgMAorLy8gcmV0dXJuOiBCT09MIExPV09SRCwgaW5kZXRlcm1pbmF0ZSBpZiBub256ZXJvOyBISVdPUkQgbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfU0VUU1RBVEUJCShXTV9VU0VSICsgMTcpCisvLyB3UGFyYW06IFVJTlQsIGJ1dHRvbiBJRAorLy8gbFBhcmFtOiBVSU5UIExPV09SRCwgc3RhdGUgYml0czsgSElXT1JEIG5vdCB1c2VkLCAwCisvLyByZXR1cm46IG5vdCB1c2VkCisvLworCisjZGVmaW5lIFRCX0dFVFNUQVRFCQkoV01fVVNFUiArIDE4KQorLy8gd1BhcmFtOiBVSU5ULCBidXR0b24gSUQKKy8vIGxQYXJhbTogbm90IHVzZWQsIDAKKy8vIHJldHVybjogVUlOVCBMT1dPUkQsIHN0YXRlIGJpdHM7IEhJV09SRCBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9BRERCSVRNQVAJCShXTV9VU0VSICsgMTkpCisvLyB3UGFyYW06IFVJTlQsIG51bWJlciBvZiBidXR0b24gZ3JhcGhpY3MgaW4gYml0bWFwCisvLyBsUGFyYW06IG9uZSBvZjoKKy8vCSAgIEhJTlNUQU5DRSBMT1dPUkQsIG1vZHVsZSBoYW5kbGU7IFVJTlQgSElXT1JELCByZXNvdXJjZSBpZAorLy8JICAgSElOU1RBTkNFIExPV09SRCwgTlVMTDsgSEJJVE1BUCBISVdPUkQsIGJpdG1hcCBoYW5kbGUKKy8vIHJldHVybjogb25lIG9mOgorLy8JICAgaW50IExPV09SRCwgaW5kZXggZm9yIGZpcnN0IG5ldyBidXR0b247IEhJV09SRCBub3QgdXNlZAorLy8JICAgaW50IExPV09SRCwgLTEgaW5kaWNhdGluZyBlcnJvcjsgSElXT1JEIG5vdCB1c2VkCisvLworCisjZGVmaW5lIFRCX0FEREJVVFRPTlMJCShXTV9VU0VSICsgMjApCisvLyB3UGFyYW06IFVJTlQsIG51bWJlciBvZiBidXR0b25zIHRvIGFkZAorLy8gbFBhcmFtOiBMUFRCQlVUVE9OLCBwb2ludGVyIHRvIGFycmF5IG9mIFRCQlVUVE9OIHN0cnVjdHVyZXMKKy8vIHJldHVybjogbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfSU5TRVJUQlVUVE9OCQkoV01fVVNFUiArIDIxKQorLy8gd1BhcmFtOiBVSU5ULCBpbmRleCBmb3IgaW5zZXJ0aW9uIChhcHBlbmRlZCBpZiBpbmRleCBkb2Vzbid0IGV4aXN0KQorLy8gbFBhcmFtOiBMUFRCQlVUVE9OLCBwb2ludGVyIHRvIG9uZSBUQkJVVFRPTiBzdHJ1Y3R1cmUKKy8vIHJldHVybjogbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfREVMRVRFQlVUVE9OCQkoV01fVVNFUiArIDIyKQorLy8gd1BhcmFtOiBVSU5ULCBpbmRleCBvZiBidXR0b24gdG8gZGVsZXRlCisvLyBsUGFyYW06IG5vdCB1c2VkLCAwCisvLyByZXR1cm46IG5vdCB1c2VkCisvLworCisjZGVmaW5lIFRCX0dFVEJVVFRPTgkJKFdNX1VTRVIgKyAyMykKKy8vIHdQYXJhbTogVUlOVCwgaW5kZXggb2YgYnV0dG9uIHRvIGdldAorLy8gbFBhcmFtOiBMUFRCQlVUVE9OLCBwb2ludGVyIHRvIFRCQlVUVE9OIGJ1ZmZlciB0byByZWNlaXZlIGJ1dHRvbgorLy8gcmV0dXJuOiBub3QgdXNlZAorLy8KKworI2RlZmluZSBUQl9CVVRUT05DT1VOVAkJKFdNX1VTRVIgKyAyNCkKKy8vIHdQYXJhbTogbm90IHVzZWQsIDAKKy8vIGxQYXJhbTogbm90IHVzZWQsIDAKKy8vIHJldHVybjogVUlOVCBMT1dPUkQsIG51bWJlciBvZiBidXR0b25zOyBISVdPUkQgbm90IHVzZWQKKy8vCisKKyNkZWZpbmUgVEJfQ09NTUFORFRPSU5ERVgJKFdNX1VTRVIgKyAyNSkKKy8vIHdQYXJhbTogVUlOVCwgY29tbWFuZCBpZAorLy8gbFBhcmFtOiBub3QgdXNlZCwgMAorLy8gcmV0dXJuOiBVSU5UIExPV09SRCwgaW5kZXggb2YgYnV0dG9uICgtMSBpZiBjb21tYW5kIG5vdCBmb3VuZCk7CisvLwkgICBISVdPUkQgbm90IHVzZWQKKy8vCisKKworI2RlZmluZSBUQk5fQkVHSU5EUkFHCTB4MDIwMQorI2RlZmluZSBUQk5fRU5ERFJBRwkweDAyMDMKZGlmZiAtLWdpdCBhL3NyYy92aW10YmFyLmxpYiBiL3NyYy92aW10YmFyLmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNiN2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbXRiYXIubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy92aW10dXRvciBiL3NyYy92aW10dXRvcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZmJiMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZpbXR1dG9yCkBAIC0wLDAgKzEsNjEgQEAKKyMhIC9iaW4vc2gKKworIyBTdGFydCBWaW0gb24gYSBjb3B5IG9mIHRoZSB0dXRvciBmaWxlLgorCisjIFVzYWdlOiB2aW10dXRvciBbeHhdLCB3aGVyZSB4eCBpcyBhIGxhbmd1YWdlIGNvZGUgbGlrZSAiZXMiIG9yICJubCIuCisjIFdoZW4gYW4gYXJndW1lbnQgaXMgZ2l2ZW4sIGl0IHRyaWVzIGxvYWRpbmcgdGhhdCB0dXRvci4KKyMgV2hlbiB0aGlzIGZhaWxzIG9yIG5vIGFyZ3VtZW50IHdhcyBnaXZlbiwgaXQgdHJpZXMgdXNpbmcgJ3Y6bGFuZycKKyMgV2hlbiB0aGF0IGFsc28gZmFpbHMsIGl0IHVzZXMgdGhlIEVuZ2xpc2ggdmVyc2lvbi4KKworeHg9JDEKK2V4cG9ydCB4eAorCisjIFdlIG5lZWQgYSB0ZW1wIGZpbGUgZm9yIHRoZSBjb3B5LiAgRmlyc3QgdHJ5IHVzaW5nIGEgc3RhbmRhcmQgY29tbWFuZC4KK3RtcD0iJHtUTVBESVItL3RtcH0iCitUVVRPUkNPUFk9YG1rdGVtcCAkdG1wL3R1dG9yWFhYWFhYIHx8IHRlbXBmaWxlIC1wIHR1dG9yIHx8IGVjaG8gbm9uZWAKKworIyBJZiB0aGUgc3RhbmRhcmQgY29tbWFuZHMgZmFpbGVkIHRoZW4gY3JlYXRlIGEgZGlyZWN0b3J5IHRvIHB1dCB0aGUgY29weSBpbi4KKyMgVGhhdCBpcyBhIHNlY3VyZSB3YXkgdG8gbWFrZSBhIHRlbXAgZmlsZS4KK2lmIHRlc3QgIiRUVVRPUkNPUFkiID0gbm9uZTsgdGhlbgorCXRtcGRpcj0kdG1wL3ZpbXR1dG9yJCQKKwlPTERfVU1BU0s9YHVtYXNrYAorCXVtYXNrIDA3NworCWdldG91dD1ubworCW1rZGlyICR0bXBkaXIgfHwgZ2V0b3V0PXllcworCXVtYXNrICRPTERfVU1BU0sKKwlpZiB0ZXN0ICRnZXRvdXQgPSB5ZXM7IHRoZW4KKwkJZWNobyAiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHR1dG9yIGNvcHksIGV4aXRpbmcuIgorCQlleGl0IDEKKwlmaQorCVRVVE9SQ09QWT0kdG1wZGlyL3R1dG9yY29weQorCXRvdWNoICRUVVRPUkNPUFkKKwlUT0RFTEVURT0kdG1wZGlyCitlbHNlCisJVE9ERUxFVEU9JFRVVE9SQ09QWQorZmkKKworZXhwb3J0IFRVVE9SQ09QWQorCisjIHJlbW92ZSB0aGUgY29weSBvZiB0aGUgdHV0b3Igb24gZXhpdAordHJhcCAicm0gLXJmICRUT0RFTEVURSIgMCAxIDIgMyA5IDExIDEzIDE1CisKKyMgVmltIGNvdWxkIGJlIGNhbGxlZCAidmltIiBvciAidmkiLiAgQWxzbyBjaGVjayBmb3IgInZpbTYiLCBmb3IgcGVvcGxlIHdobworIyBoYXZlIFZpbSA1LnggaW5zdGFsbGVkIGFzICJ2aW0iIGFuZCBWaW0gNi4wIGFzICJ2aW02Ii4KK3Rlc3R2aW09YHdoaWNoIHZpbTYgMj4vZGV2L251bGxgCitpZiB0ZXN0IC1mICIkdGVzdHZpbSI7IHRoZW4KKwlWSU09dmltNgorZWxzZQorCXRlc3R2aW09YHdoaWNoIHZpbWAKKwlpZiB0ZXN0IC1mICIkdGVzdHZpbSI7IHRoZW4KKwkJVklNPXZpbQorCWVsc2UKKwkJVklNPXZpCisJZmkKK2ZpCisKKyMgVXNlIFZpbSB0byBjb3B5IHRoZSB0dXRvciwgaXQga25vd3MgdGhlIHZhbHVlIG9mICRWSU1SVU5USU1FCisjIFRoZSBzY3JpcHQgdHV0b3IudmltIHRlbGxzIFZpbSB3aGljaCBmaWxlIHRvIGNvcHkKKyRWSU0gLXUgTk9ORSAtYyAnc28gJFZJTVJVTlRJTUUvdHV0b3IvdHV0b3IudmltJworCisjIFN0YXJ0IHZpbSB3aXRob3V0IGFueSAudmltcmMsIHNldCAnbm9jb21wYXRpYmxlJworJFZJTSAtdSBOT05FIC1jICJzZXQgbm9jcCIgJFRVVE9SQ09QWQpkaWZmIC0tZ2l0IGEvc3JjL3doaWNoLnNoIGIvc3JjL3doaWNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjMmM2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2hpY2guc2gKQEAgLTAsMCArMSwxMiBAQAorIyEgL2Jpbi9zaAorIworIyB3aGljaC5zaCAtLSBmaW5kIHdoZXJlIGFuIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4gIEl0J3MgaGVyZSBiZWNhdXNlIHRoZQorIyAid2hpY2giIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlLiAgVXNlZCBieSBNYWtlZmlsZS4KKworSUZTPSI6IgorZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKwlpZiB0ZXN0IC1mICIkYWNfZGlyLyQxIjsgdGhlbgorCQllY2hvICIkYWNfZGlyLyQxIgorCQlicmVhaworCWZpCitkb25lCmRpZmYgLS1naXQgYS9zcmMvd2luZG93LmMgYi9zcmMvd2luZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2M2UwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3cuYwpAQCAtMCwwICsxLDQ5NDYgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgorICovCisKKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmZGVmIEhBVkVfRkNOVExfSAorIyBpbmNsdWRlIDxmY250bC5oPgkgICAgLyogZm9yIGNoZGlyKCkgKi8KKyNlbmRpZgorCitzdGF0aWMgaW50IHBhdGhfaXNfdXJsIF9fQVJHUygoY2hhcl91ICpwKSk7CisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCitzdGF0aWMgaW50IHdpbl9zcGxpdF9pbnMgX19BUkdTKChpbnQgc2l6ZSwgaW50IGZsYWdzLCB3aW5fVCAqbmV3d2luLCBpbnQgZGlyKSk7CitzdGF0aWMgaW50IHdpbl9jb21wX3BvcyBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGZyYW1lX2NvbXBfcG9zIF9fQVJHUygoZnJhbWVfVCAqdG9wZnJwLCBpbnQgKnJvdywgaW50ICpjb2wpKTsKK3N0YXRpYyB2b2lkIGZyYW1lX3NldGhlaWdodCBfX0FSR1MoKGZyYW1lX1QgKmN1cmZycCwgaW50IGhlaWdodCkpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCitzdGF0aWMgdm9pZCBmcmFtZV9zZXR3aWR0aCBfX0FSR1MoKGZyYW1lX1QgKmN1cmZycCwgaW50IHdpZHRoKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHdpbl9leGNoYW5nZSBfX0FSR1MoKGxvbmcpKTsKK3N0YXRpYyB2b2lkIHdpbl9yb3RhdGUgX19BUkdTKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgd2luX3RvdG9wIF9fQVJHUygoaW50IHNpemUsIGludCBmbGFncykpOworc3RhdGljIHZvaWQgd2luX2VxdWFsX3JlYyBfX0FSR1MoKHdpbl9UICpuZXh0X2N1cndpbiwgaW50IGN1cnJlbnQsIGZyYW1lX1QgKnRvcGZyLCBpbnQgZGlyLCBpbnQgY29sLCBpbnQgcm93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpKTsKK3N0YXRpYyB3aW5fVCAqd2luZnJhbWVfcmVtb3ZlIF9fQVJHUygod2luX1QgKndpbiwgaW50ICpkaXJwKSk7CitzdGF0aWMgZnJhbWVfVCAqd2luX2FsdGZyYW1lIF9fQVJHUygod2luX1QgKndpbikpOworc3RhdGljIHdpbl9UICpmcmFtZTJ3aW4gX19BUkdTKChmcmFtZV9UICpmcnApKTsKK3N0YXRpYyBpbnQgZnJhbWVfaGFzX3dpbiBfX0FSR1MoKGZyYW1lX1QgKmZycCwgd2luX1QgKndwKSk7CitzdGF0aWMgdm9pZCBmcmFtZV9uZXdfaGVpZ2h0IF9fQVJHUygoZnJhbWVfVCAqdG9wZnJwLCBpbnQgaGVpZ2h0LCBpbnQgdG9wZmlyc3QsIGludCB3ZmgpKTsKK3N0YXRpYyBpbnQgZnJhbWVfZml4ZWRfaGVpZ2h0IF9fQVJHUygoZnJhbWVfVCAqZnJwKSk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKK3N0YXRpYyB2b2lkIGZyYW1lX2FkZF9zdGF0dXNsaW5lIF9fQVJHUygoZnJhbWVfVCAqZnJwKSk7CitzdGF0aWMgdm9pZCBmcmFtZV9uZXdfd2lkdGggX19BUkdTKChmcmFtZV9UICp0b3BmcnAsIGludCB3aWR0aCwgaW50IGxlZnRmaXJzdCkpOworc3RhdGljIHZvaWQgZnJhbWVfYWRkX3ZzZXAgX19BUkdTKChmcmFtZV9UICpmcnApKTsKK3N0YXRpYyBpbnQgZnJhbWVfbWlud2lkdGggX19BUkdTKChmcmFtZV9UICp0b3BmcnAsIHdpbl9UICpuZXh0X2N1cndpbikpOworc3RhdGljIHZvaWQgZnJhbWVfZml4X3dpZHRoIF9fQVJHUygod2luX1QgKndwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGZyYW1lX2ZpeF9oZWlnaHQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyBpbnQgZnJhbWVfbWluaGVpZ2h0IF9fQVJHUygoZnJhbWVfVCAqdG9wZnJwLCB3aW5fVCAqbmV4dF9jdXJ3aW4pKTsKK3N0YXRpYyB2b2lkIHdpbl9lbnRlcl9leHQgX19BUkdTKCh3aW5fVCAqd3AsIGludCB1bmRvX3N5bmMsIGludCBub19jdXJ3aW4pKTsKK3N0YXRpYyB2b2lkIHdpbl9mcmVlIF9fQVJHUygod2luX1QgKndwKSk7CitzdGF0aWMgdm9pZCB3aW5fYXBwZW5kIF9fQVJHUygod2luX1QgKiwgd2luX1QgKikpOworc3RhdGljIHZvaWQgd2luX3JlbW92ZSBfX0FSR1MoKHdpbl9UICopKTsKK3N0YXRpYyB2b2lkIGZyYW1lX2FwcGVuZCBfX0FSR1MoKGZyYW1lX1QgKmFmdGVyLCBmcmFtZV9UICpmcnApKTsKK3N0YXRpYyB2b2lkIGZyYW1lX2luc2VydCBfX0FSR1MoKGZyYW1lX1QgKmJlZm9yZSwgZnJhbWVfVCAqZnJwKSk7CitzdGF0aWMgdm9pZCBmcmFtZV9yZW1vdmUgX19BUkdTKChmcmFtZV9UICpmcnApKTsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorc3RhdGljIHZvaWQgd2luX25ld193aWR0aCBfX0FSR1MoKHdpbl9UICp3cCwgaW50IHdpZHRoKSk7CitzdGF0aWMgaW50IHdpbl9taW5oZWlnaHQgX19BUkdTKCh3aW5fVCAqd3ApKTsKK3N0YXRpYyB2b2lkIHdpbl9nb3RvX3ZlciBfX0FSR1MoKGludCB1cCwgbG9uZyBjb3VudCkpOworc3RhdGljIHZvaWQgd2luX2dvdG9faG9yIF9fQVJHUygoaW50IGxlZnQsIGxvbmcgY291bnQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZnJhbWVfYWRkX2hlaWdodCBfX0FSR1MoKGZyYW1lX1QgKmZycCwgaW50IG4pKTsKK3N0YXRpYyB2b2lkIGxhc3Rfc3RhdHVzX3JlYyBfX0FSR1MoKGZyYW1lX1QgKmZyLCBpbnQgc3RhdHVzbGluZSkpOworCitzdGF0aWMgdm9pZCBtYWtlX3NuYXBzaG90IF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgbWFrZV9zbmFwc2hvdF9yZWMgX19BUkdTKChmcmFtZV9UICpmciwgZnJhbWVfVCAqKmZycCkpOworc3RhdGljIHZvaWQgY2xlYXJfc25hcHNob3QgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBjbGVhcl9zbmFwc2hvdF9yZWMgX19BUkdTKChmcmFtZV9UICpmcikpOworc3RhdGljIHZvaWQgcmVzdG9yZV9zbmFwc2hvdCBfX0FSR1MoKGludCBjbG9zZV9jdXJ3aW4pKTsKK3N0YXRpYyBpbnQgY2hlY2tfc25hcHNob3RfcmVjIF9fQVJHUygoZnJhbWVfVCAqc24sIGZyYW1lX1QgKmZyKSk7CitzdGF0aWMgd2luX1QgKnJlc3RvcmVfc25hcHNob3RfcmVjIF9fQVJHUygoZnJhbWVfVCAqc24sIGZyYW1lX1QgKmZyKSk7CisKKyNlbmRpZiAvKiBGRUFUX1dJTkRPV1MgKi8KK3N0YXRpYyB3aW5fVCAqd2luX2FsbG9jIF9fQVJHUygod2luX1QgKmFmdGVyKSk7CitzdGF0aWMgdm9pZCB3aW5fbmV3X2hlaWdodCBfX0FSR1MoKHdpbl9UICosIGludCkpOworCisjZGVmaW5lIFVSTF9TTEFTSAkxCQkvKiBwYXRoX2lzX3VybCgpIGhhcyBmb3VuZCAiOi8vIiAqLworI2RlZmluZSBVUkxfQkFDS1NMQVNICTIJCS8qIHBhdGhfaXNfdXJsKCkgaGFzIGZvdW5kICI6XFwiICovCisKKyNkZWZpbmUgTk9XSU4JCSh3aW5fVCAqKS0xCS8qIG5vbi1leGlzaXRpbmcgd2luZG93ICovCisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBhbGwgQ1RSTC1XIHdpbmRvdyBjb21tYW5kcyBhcmUgaGFuZGxlZCBoZXJlLCBjYWxsZWQgZnJvbSBub3JtYWxfY21kKCkuCisgKi8KKyAgICB2b2lkCitkb193aW5kb3cobmNoYXIsIFByZW51bSwgeGNoYXIpCisgICAgaW50CQluY2hhcjsKKyAgICBsb25nCVByZW51bTsKKyAgICBpbnQJCXhjaGFyOwkgICAgLyogZXh0cmEgY2hhciBmcm9tICI6d2luY21kIGd4IiBvciBOVUwgKi8KK3sKKyAgICBsb25nCVByZW51bTE7CisgICAgd2luX1QJKndwOworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKSB8fCBkZWZpbmVkKEZFQVRfRklORF9JRCkKKyAgICBjaGFyX3UJKnB0cjsKKyNlbmRpZgorI2lmZGVmIEZFQVRfRklORF9JRAorICAgIGludAkJdHlwZSA9IEZJTkRfREVGSU5FOworICAgIGludAkJbGVuOworI2VuZGlmCisgICAgY2hhcl91CWNidWZbNDBdOworCisgICAgaWYgKFByZW51bSA9PSAwKQorCVByZW51bTEgPSAxOworICAgIGVsc2UKKwlQcmVudW0xID0gUHJlbnVtOworCisjaWZkZWYgRkVBVF9DTURXSU4KKyMgZGVmaW5lIENIRUNLX0NNRFdJTiBpZiAoY21kd2luX3R5cGUgIT0gMCkgeyBFTVNHKF8oZV9jbWR3aW4pKTsgYnJlYWs7IH0KKyNlbHNlCisjIGRlZmluZSBDSEVDS19DTURXSU4KKyNlbmRpZgorCisgICAgc3dpdGNoIChuY2hhcikKKyAgICB7CisvKiBzcGxpdCBjdXJyZW50IHdpbmRvdyBpbiB0d28gcGFydHMsIGhvcml6b250YWxseSAqLworICAgIGNhc2UgJ1MnOgorICAgIGNhc2UgQ3RybF9TOgorICAgIGNhc2UgJ3MnOgorCQlDSEVDS19DTURXSU4KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlyZXNldF9WSXN1YWxfYW5kX3Jlc2VsKCk7CS8qIHN0b3AgVmlzdWFsIG1vZGUgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfR1VJCisJCW5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKwkJd2luX3NwbGl0KChpbnQpUHJlbnVtLCAwKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorLyogc3BsaXQgY3VycmVudCB3aW5kb3cgaW4gdHdvIHBhcnRzLCB2ZXJ0aWNhbGx5ICovCisgICAgY2FzZSBDdHJsX1Y6CisgICAgY2FzZSAndic6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIEZFQVRfVklTVUFMCisJCXJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fc3BsaXQoKGludClQcmVudW0sIFdTUF9WRVJUKTsKKwkJYnJlYWs7CisjZW5kaWYKKworLyogc3BsaXQgY3VycmVudCB3aW5kb3cgYW5kIGVkaXQgYWx0ZXJuYXRlIGZpbGUgKi8KKyAgICBjYXNlIEN0cmxfSEFUOgorICAgIGNhc2UgJ14nOgorCQlDSEVDS19DTURXSU4KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlyZXNldF9WSXN1YWxfYW5kX3Jlc2VsKCk7CS8qIHN0b3AgVmlzdWFsIG1vZGUgKi8KKyNlbmRpZgorCQlTVFJDUFkoY2J1ZiwgInNwbGl0ICMiKTsKKwkJaWYgKFByZW51bSkKKwkJICAgIHNwcmludGYoKGNoYXIgKiljYnVmICsgNywgIiVsZCIsIFByZW51bSk7CisJCWRvX2NtZGxpbmVfY21kKGNidWYpOworCQlicmVhazsKKworLyogb3BlbiBuZXcgd2luZG93ICovCisgICAgY2FzZSBDdHJsX046CisgICAgY2FzZSAnbic6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIEZFQVRfVklTVUFMCisJCXJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisJCWlmIChQcmVudW0pCisJCSAgICBzcHJpbnRmKChjaGFyICopY2J1ZiwgIiVsZCIsIFByZW51bSk7IC8qIHdpbmRvdyBoZWlnaHQgKi8KKwkJZWxzZQorCQkgICAgY2J1ZlswXSA9IE5VTDsKKwkJU1RSQ0FUKGNidWYsICJuZXciKTsKKwkJZG9fY21kbGluZV9jbWQoY2J1Zik7CisJCWJyZWFrOworCisvKiBxdWl0IGN1cnJlbnQgd2luZG93ICovCisgICAgY2FzZSBDdHJsX1E6CisgICAgY2FzZSAncSc6CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJcmVzZXRfVklzdWFsX2FuZF9yZXNlbCgpOwkvKiBzdG9wIFZpc3VhbCBtb2RlICovCisjZW5kaWYKKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJxdWl0Iik7CisJCWJyZWFrOworCisvKiBjbG9zZSBjdXJyZW50IHdpbmRvdyAqLworICAgIGNhc2UgQ3RybF9DOgorICAgIGNhc2UgJ2MnOgorI2lmZGVmIEZFQVRfVklTVUFMCisJCXJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisJCWRvX2NtZGxpbmVfY21kKChjaGFyX3UgKikiY2xvc2UiKTsKKwkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChGRUFUX1FVSUNLRklYKQorLyogY2xvc2UgcHJldmlldyB3aW5kb3cgKi8KKyAgICBjYXNlIEN0cmxfWjoKKyAgICBjYXNlICd6JzoKKwkJQ0hFQ0tfQ01EV0lOCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJcmVzZXRfVklzdWFsX2FuZF9yZXNlbCgpOwkvKiBzdG9wIFZpc3VhbCBtb2RlICovCisjZW5kaWYKKwkJZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJwY2xvc2UiKTsKKwkJYnJlYWs7CisKKy8qIGN1cnNvciB0byBwcmV2aWV3IHdpbmRvdyAqLworICAgIGNhc2UgJ1AnOgorCQlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwkJICAgIGlmICh3cC0+d19wX3B2dykKKwkJCWJyZWFrOworCQlpZiAod3AgPT0gTlVMTCkKKwkJICAgIEVNU0coXygiRTQ0MTogVGhlcmUgaXMgbm8gcHJldmlldyB3aW5kb3ciKSk7CisJCWVsc2UKKwkJICAgIHdpbl9nb3RvKHdwKTsKKwkJYnJlYWs7CisjZW5kaWYKKworLyogY2xvc2UgYWxsIGJ1dCBjdXJyZW50IHdpbmRvdyAqLworICAgIGNhc2UgQ3RybF9POgorICAgIGNhc2UgJ28nOgorCQlDSEVDS19DTURXSU4KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlyZXNldF9WSXN1YWxfYW5kX3Jlc2VsKCk7CS8qIHN0b3AgVmlzdWFsIG1vZGUgKi8KKyNlbmRpZgorCQlkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopIm9ubHkiKTsKKwkJYnJlYWs7CisKKy8qIGN1cnNvciB0byBuZXh0IHdpbmRvdyB3aXRoIHdyYXAgYXJvdW5kICovCisgICAgY2FzZSBDdHJsX1c6CisgICAgY2FzZSAndyc6CisvKiBjdXJzb3IgdG8gcHJldmlvdXMgd2luZG93IHdpdGggd3JhcCBhcm91bmQgKi8KKyAgICBjYXNlICdXJzoKKwkJQ0hFQ0tfQ01EV0lOCisJCWlmIChsYXN0d2luID09IGZpcnN0d2luICYmIFByZW51bSAhPSAxKQkvKiBqdXN0IG9uZSB3aW5kb3cgKi8KKwkJICAgIGJlZXBfZmx1c2goKTsKKwkJZWxzZQorCQl7CisJCSAgICBpZiAoUHJlbnVtKQkJCS8qIGdvIHRvIHNwZWNpZmllZCB3aW5kb3cgKi8KKwkJICAgIHsKKwkJCWZvciAod3AgPSBmaXJzdHdpbjsgLS1QcmVudW0gPiAwOyApCisJCQl7CisJCQkgICAgaWYgKHdwLT53X25leHQgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCSAgICBlbHNlCisJCQkJd3AgPSB3cC0+d19uZXh0OworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJaWYgKG5jaGFyID09ICdXJykJICAgIC8qIGdvIHRvIHByZXZpb3VzIHdpbmRvdyAqLworCQkJeworCQkJICAgIHdwID0gY3Vyd2luLT53X3ByZXY7CisJCQkgICAgaWYgKHdwID09IE5VTEwpCisJCQkJd3AgPSBsYXN0d2luOwkgICAgLyogd3JhcCBhcm91bmQgKi8KKwkJCX0KKwkJCWVsc2UJCQkgICAgLyogZ28gdG8gbmV4dCB3aW5kb3cgKi8KKwkJCXsKKwkJCSAgICB3cCA9IGN1cndpbi0+d19uZXh0OworCQkJICAgIGlmICh3cCA9PSBOVUxMKQorCQkJCXdwID0gZmlyc3R3aW47CSAgICAvKiB3cmFwIGFyb3VuZCAqLworCQkJfQorCQkgICAgfQorCQkgICAgd2luX2dvdG8od3ApOworCQl9CisJCWJyZWFrOworCisvKiBjdXJzb3IgdG8gd2luZG93IGJlbG93ICovCisgICAgY2FzZSAnaic6CisgICAgY2FzZSBLX0RPV046CisgICAgY2FzZSBDdHJsX0o6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCXdpbl9nb3RvX3ZlcihGQUxTRSwgUHJlbnVtMSk7CisjZWxzZQorCQlmb3IgKHdwID0gY3Vyd2luOyB3cC0+d19uZXh0ICE9IE5VTEwgJiYgUHJlbnVtMS0tID4gMDsKKwkJCQkJCQkgICAgd3AgPSB3cC0+d19uZXh0KQorCQkgICAgOworCQl3aW5fZ290byh3cCk7CisjZW5kaWYKKwkJYnJlYWs7CisKKy8qIGN1cnNvciB0byB3aW5kb3cgYWJvdmUgKi8KKyAgICBjYXNlICdrJzoKKyAgICBjYXNlIEtfVVA6CisgICAgY2FzZSBDdHJsX0s6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCXdpbl9nb3RvX3ZlcihUUlVFLCBQcmVudW0xKTsKKyNlbHNlCisJCWZvciAod3AgPSBjdXJ3aW47IHdwLT53X3ByZXYgIT0gTlVMTCAmJiBQcmVudW0xLS0gPiAwOworCQkJCQkJCSAgICB3cCA9IHdwLT53X3ByZXYpCisJCSAgICA7CisJCXdpbl9nb3RvKHdwKTsKKyNlbmRpZgorCQlicmVhazsKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKiBjdXJzb3IgdG8gbGVmdCB3aW5kb3cgKi8KKyAgICBjYXNlICdoJzoKKyAgICBjYXNlIEtfTEVGVDoKKyAgICBjYXNlIEN0cmxfSDoKKyAgICBjYXNlIEtfQlM6CisJCUNIRUNLX0NNRFdJTgorCQl3aW5fZ290b19ob3IoVFJVRSwgUHJlbnVtMSk7CisJCWJyZWFrOworCisvKiBjdXJzb3IgdG8gcmlnaHQgd2luZG93ICovCisgICAgY2FzZSAnbCc6CisgICAgY2FzZSBLX1JJR0hUOgorICAgIGNhc2UgQ3RybF9MOgorCQlDSEVDS19DTURXSU4KKwkJd2luX2dvdG9faG9yKEZBTFNFLCBQcmVudW0xKTsKKwkJYnJlYWs7CisjZW5kaWYKKworLyogY3Vyc29yIHRvIHRvcC1sZWZ0IHdpbmRvdyAqLworICAgIGNhc2UgJ3QnOgorICAgIGNhc2UgQ3RybF9UOgorCQl3aW5fZ290byhmaXJzdHdpbik7CisJCWJyZWFrOworCisvKiBjdXJzb3IgdG8gYm90dG9tLXJpZ2h0IHdpbmRvdyAqLworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgQ3RybF9COgorCQl3aW5fZ290byhsYXN0d2luKTsKKwkJYnJlYWs7CisKKy8qIGN1cnNvciB0byBsYXN0IGFjY2Vzc2VkIChwcmV2aW91cykgd2luZG93ICovCisgICAgY2FzZSAncCc6CisgICAgY2FzZSBDdHJsX1A6CisJCWlmIChwcmV2d2luID09IE5VTEwpCisJCSAgICBiZWVwX2ZsdXNoKCk7CisJCWVsc2UKKwkJICAgIHdpbl9nb3RvKHByZXZ3aW4pOworCQlicmVhazsKKworLyogZXhjaGFuZ2UgY3VycmVudCBhbmQgbmV4dCB3aW5kb3cgKi8KKyAgICBjYXNlICd4JzoKKyAgICBjYXNlIEN0cmxfWDoKKwkJQ0hFQ0tfQ01EV0lOCisJCXdpbl9leGNoYW5nZShQcmVudW0pOworCQlicmVhazsKKworLyogcm90YXRlIHdpbmRvd3MgZG93bndhcmRzICovCisgICAgY2FzZSBDdHJsX1I6CisgICAgY2FzZSAncic6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIEZFQVRfVklTVUFMCisJCXJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisJCXdpbl9yb3RhdGUoRkFMU0UsIChpbnQpUHJlbnVtMSk7ICAgIC8qIGRvd253YXJkcyAqLworCQlicmVhazsKKworLyogcm90YXRlIHdpbmRvd3MgdXB3YXJkcyAqLworICAgIGNhc2UgJ1InOgorCQlDSEVDS19DTURXSU4KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlyZXNldF9WSXN1YWxfYW5kX3Jlc2VsKCk7CS8qIHN0b3AgVmlzdWFsIG1vZGUgKi8KKyNlbmRpZgorCQl3aW5fcm90YXRlKFRSVUUsIChpbnQpUHJlbnVtMSk7CSAgICAvKiB1cHdhcmRzICovCisJCWJyZWFrOworCisvKiBtb3ZlIHdpbmRvdyB0byB0aGUgdmVyeSB0b3AvYm90dG9tL2xlZnQvcmlnaHQgKi8KKyAgICBjYXNlICdLJzoKKyAgICBjYXNlICdKJzoKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGNhc2UgJ0gnOgorICAgIGNhc2UgJ0wnOgorI2VuZGlmCisJCUNIRUNLX0NNRFdJTgorCQl3aW5fdG90b3AoKGludClQcmVudW0sCisJCQkoKG5jaGFyID09ICdIJyB8fCBuY2hhciA9PSAnTCcpID8gV1NQX1ZFUlQgOiAwKQorCQkJfCAoKG5jaGFyID09ICdIJyB8fCBuY2hhciA9PSAnSycpID8gV1NQX1RPUCA6IFdTUF9CT1QpKTsKKwkJYnJlYWs7CisKKy8qIG1ha2UgYWxsIHdpbmRvd3MgdGhlIHNhbWUgaGVpZ2h0ICovCisgICAgY2FzZSAnPSc6CisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fZXF1YWwoTlVMTCwgRkFMU0UsICdiJyk7CisJCWJyZWFrOworCisvKiBpbmNyZWFzZSBjdXJyZW50IHdpbmRvdyBoZWlnaHQgKi8KKyAgICBjYXNlICcrJzoKKyNpZmRlZiBGRUFUX0dVSQorCQluZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisJCXdpbl9zZXRoZWlnaHQoY3Vyd2luLT53X2hlaWdodCArIChpbnQpUHJlbnVtMSk7CisJCWJyZWFrOworCisvKiBkZWNyZWFzZSBjdXJyZW50IHdpbmRvdyBoZWlnaHQgKi8KKyAgICBjYXNlICctJzoKKyNpZmRlZiBGRUFUX0dVSQorCQluZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisJCXdpbl9zZXRoZWlnaHQoY3Vyd2luLT53X2hlaWdodCAtIChpbnQpUHJlbnVtMSk7CisJCWJyZWFrOworCisvKiBzZXQgY3VycmVudCB3aW5kb3cgaGVpZ2h0ICovCisgICAgY2FzZSBDdHJsX186CisgICAgY2FzZSAnXyc6CisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fc2V0aGVpZ2h0KFByZW51bSA/IChpbnQpUHJlbnVtIDogOTk5OSk7CisJCWJyZWFrOworCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKy8qIGluY3JlYXNlIGN1cnJlbnQgd2luZG93IHdpZHRoICovCisgICAgY2FzZSAnPic6CisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fc2V0d2lkdGgoY3Vyd2luLT53X3dpZHRoICsgKGludClQcmVudW0xKTsKKwkJYnJlYWs7CisKKy8qIGRlY3JlYXNlIGN1cnJlbnQgd2luZG93IHdpZHRoICovCisgICAgY2FzZSAnPCc6CisjaWZkZWYgRkVBVF9HVUkKKwkJbmVlZF9tb3VzZV9jb3JyZWN0ID0gVFJVRTsKKyNlbmRpZgorCQl3aW5fc2V0d2lkdGgoY3Vyd2luLT53X3dpZHRoIC0gKGludClQcmVudW0xKTsKKwkJYnJlYWs7CisKKy8qIHNldCBjdXJyZW50IHdpbmRvdyB3aWR0aCAqLworICAgIGNhc2UgJ3wnOgorI2lmZGVmIEZFQVRfR1VJCisJCW5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKwkJd2luX3NldHdpZHRoKFByZW51bSAhPSAwID8gKGludClQcmVudW0gOiA5OTk5KTsKKwkJYnJlYWs7CisjZW5kaWYKKworLyoganVtcCB0byB0YWcgYW5kIHNwbGl0IHdpbmRvdyBpZiB0YWcgZXhpc3RzIChpbiBwcmV2aWV3IHdpbmRvdykgKi8KKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisgICAgY2FzZSAnfSc6CisJCUNIRUNLX0NNRFdJTgorCQlpZiAoUHJlbnVtKQorCQkgICAgZ19kb190YWdwcmV2aWV3ID0gUHJlbnVtOworCQllbHNlCisJCSAgICBnX2RvX3RhZ3ByZXZpZXcgPSBwX3B2aDsKKwkJLypGQUxMVEhST1VHSCovCisjZW5kaWYKKyAgICBjYXNlICddJzoKKyAgICBjYXNlIEN0cmxfUlNCOgorCQlDSEVDS19DTURXSU4KKyNpZmRlZiBGRUFUX1ZJU1VBTAorCQlyZXNldF9WSXN1YWxfYW5kX3Jlc2VsKCk7CS8qIHN0b3AgVmlzdWFsIG1vZGUgKi8KKyNlbmRpZgorCQlpZiAoUHJlbnVtKQorCQkgICAgcG9zdHBvbmVkX3NwbGl0ID0gUHJlbnVtOworCQllbHNlCisJCSAgICBwb3N0cG9uZWRfc3BsaXQgPSAtMTsKKworCQkvKiBFeGVjdXRlIHRoZSBjb21tYW5kIHJpZ2h0IGhlcmUsIHJlcXVpcmVkIHdoZW4KKwkJICogIndpbmNtZCBdIiB3YXMgdXNlZCBpbiBhIGZ1bmN0aW9uLiAqLworCQlkb19udl9pZGVudChDdHJsX1JTQiwgTlVMKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBGRUFUX1NFQVJDSFBBVEgKKy8qIGVkaXQgZmlsZSBuYW1lIHVuZGVyIGN1cnNvciBpbiBhIG5ldyB3aW5kb3cgKi8KKyAgICBjYXNlICdmJzoKKyAgICBjYXNlIEN0cmxfRjoKKwkJQ0hFQ0tfQ01EV0lOCisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJcmVzZXRfVklzdWFsX2FuZF9yZXNlbCgpOwkvKiBzdG9wIFZpc3VhbCBtb2RlICovCisjZW5kaWYKKwkJcHRyID0gZmlsZV9uYW1lX2F0X2N1cnNvcihGTkFNRV9NRVNTfEZOQU1FX0hZUHxGTkFNRV9FWFAsCisJCQkJCQkJCSAgICAgUHJlbnVtMSk7CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJeworI2lmZGVmIEZFQVRfR1VJCisJCSAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisJCSAgICBzZXRwY21hcmsoKTsKKwkJICAgIGlmICh3aW5fc3BsaXQoMCwgMCkgPT0gT0spCisJCSAgICB7CisjIGlmZGVmIEZFQVRfU0NST0xMQklORAorCQkJY3Vyd2luLT53X3Bfc2NiID0gRkFMU0U7CisjIGVuZGlmCisJCQkodm9pZClkb19lY21kKDAsIHB0ciwgTlVMTCwgTlVMTCwgRUNNRF9MQVNUTCwKKwkJCQkJCQkJICAgRUNNRF9ISURFKTsKKwkJICAgIH0KKwkJICAgIHZpbV9mcmVlKHB0cik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfRklORF9JRAorLyogR28gdG8gdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiB0aGUgaWRlbnRpZmllciB1bmRlciBjdXJzb3IgYWxvbmcgcGF0aCBpbiBhCisgKiBuZXcgd2luZG93IC0tIHdlYmIKKyAqLworICAgIGNhc2UgJ2knOgkJCSAgICAvKiBHbyB0byBhbnkgbWF0Y2ggKi8KKyAgICBjYXNlIEN0cmxfSToKKwkJdHlwZSA9IEZJTkRfQU5ZOworCQkvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgJ2QnOgkJCSAgICAvKiBHbyB0byBkZWZpbml0aW9uLCB1c2luZyAnZGVmaW5lJyAqLworICAgIGNhc2UgQ3RybF9EOgorCQlDSEVDS19DTURXSU4KKwkJaWYgKChsZW4gPSBmaW5kX2lkZW50X3VuZGVyX2N1cnNvcigmcHRyLCBGSU5EX0lERU5UKSkgPT0gMCkKKwkJICAgIGJyZWFrOworCQlmaW5kX3BhdHRlcm5faW5fcGF0aChwdHIsIDAsIGxlbiwgVFJVRSwKKwkJCVByZW51bSA9PSAwID8gVFJVRSA6IEZBTFNFLCB0eXBlLAorCQkJUHJlbnVtMSwgQUNUSU9OX1NQTElULCAobGluZW5yX1QpMSwgKGxpbmVucl9UKU1BWExOVU0pOworCQljdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKworLyogQ1RSTC1XIGcgIGV4dGVuZGVkIGNvbW1hbmRzICovCisgICAgY2FzZSAnZyc6CisgICAgY2FzZSBDdHJsX0c6CisJCUNIRUNLX0NNRFdJTgorI2lmZGVmIFVTRV9PTl9GTFlfU0NST0xMCisJCWRvbnRfc2Nyb2xsID0gVFJVRTsJCS8qIGRpc2FsbG93IHNjcm9sbGluZyBoZXJlICovCisjZW5kaWYKKwkJKytub19tYXBwaW5nOworCQkrK2FsbG93X2tleXM7ICAgLyogbm8gbWFwcGluZyBmb3IgeGNoYXIsIGJ1dCBhbGxvdyBrZXkgY29kZXMgKi8KKwkJaWYgKHhjaGFyID09IE5VTCkKKwkJICAgIHhjaGFyID0gc2FmZV92Z2V0YygpOworI2lmZGVmIEZFQVRfTEFOR01BUAorCQlMQU5HTUFQX0FESlVTVCh4Y2hhciwgVFJVRSk7CisjZW5kaWYKKwkJLS1ub19tYXBwaW5nOworCQktLWFsbG93X2tleXM7CisjaWZkZWYgRkVBVF9DTURMX0lORk8KKwkJKHZvaWQpYWRkX3RvX3Nob3djbWQoeGNoYXIpOworI2VuZGlmCisJCXN3aXRjaCAoeGNoYXIpCisJCXsKKyNpZiBkZWZpbmVkKEZFQVRfUVVJQ0tGSVgpCisJCSAgICBjYXNlICd9JzoKKwkJCXhjaGFyID0gQ3RybF9SU0I7CisJCQlpZiAoUHJlbnVtKQorCQkJICAgIGdfZG9fdGFncHJldmlldyA9IFByZW51bTsKKwkJCWVsc2UKKwkJCSAgICBnX2RvX3RhZ3ByZXZpZXcgPSBwX3B2aDsKKwkJCS8qRkFMTFRIUk9VR0gqLworI2VuZGlmCisJCSAgICBjYXNlICddJzoKKwkJICAgIGNhc2UgQ3RybF9SU0I6CisjaWZkZWYgRkVBVF9WSVNVQUwKKwkJCXJlc2V0X1ZJc3VhbF9hbmRfcmVzZWwoKTsJLyogc3RvcCBWaXN1YWwgbW9kZSAqLworI2VuZGlmCisJCQlpZiAoUHJlbnVtKQorCQkJICAgIHBvc3Rwb25lZF9zcGxpdCA9IFByZW51bTsKKwkJCWVsc2UKKwkJCSAgICBwb3N0cG9uZWRfc3BsaXQgPSAtMTsKKworCQkJLyogRXhlY3V0ZSB0aGUgY29tbWFuZCByaWdodCBoZXJlLCByZXF1aXJlZCB3aGVuCisJCQkgKiAid2luY21kIGd9IiB3YXMgdXNlZCBpbiBhIGZ1bmN0aW9uLiAqLworCQkJZG9fbnZfaWRlbnQoJ2cnLCB4Y2hhcik7CisJCQlicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJCWJlZXBfZmx1c2goKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisgICAgZGVmYXVsdDoJYmVlcF9mbHVzaCgpOworCQlicmVhazsKKyAgICB9Cit9CisKKy8qCisgKiBzcGxpdCB0aGUgY3VycmVudCB3aW5kb3csIGltcGxlbWVudHMgQ1RSTC1XIHMgYW5kIDpzcGxpdAorICoKKyAqICJzaXplIiBpcyB0aGUgaGVpZ2h0IG9yIHdpZHRoIGZvciB0aGUgbmV3IHdpbmRvdywgMCB0byB1c2UgaGFsZiBvZiBjdXJyZW50CisgKiBoZWlnaHQgb3Igd2lkdGguCisgKgorICogImZsYWdzIjoKKyAqIFdTUF9ST09NOiByZXF1aXJlIGVub3VnaCByb29tIGZvciBuZXcgd2luZG93CisgKiBXU1BfVkVSVDogdmVydGljYWwgc3BsaXQuCisgKiBXU1BfVE9QOiAgb3BlbiB3aW5kb3cgYXQgdGhlIHRvcC1sZWZ0IG9mIHRoZSBzaGVsbCAoaGVscCB3aW5kb3cpLgorICogV1NQX0JPVDogIG9wZW4gd2luZG93IGF0IHRoZSBib3R0b20tcmlnaHQgb2YgdGhlIHNoZWxsIChxdWlja2ZpeCB3aW5kb3cpLgorICogV1NQX0hFTFA6IGNyZWF0aW5nIHRoZSBoZWxwIHdpbmRvdywga2VlcCBsYXlvdXQgc25hcHNob3QKKyAqCisgKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKi8KKyAgICBpbnQKK3dpbl9zcGxpdChzaXplLCBmbGFncykKKyAgICBpbnQJCXNpemU7CisgICAgaW50CQlmbGFnczsKK3sKKyAgICAvKiBBZGQgZmxhZ3MgZnJvbSAiOnZlcnRpY2FsIiwgIjp0b3BsZWZ0IiBhbmQgIjpib3RyaWdodCIuICovCisgICAgZmxhZ3MgfD0gY21kbW9kLnNwbGl0OworICAgIGlmICgoZmxhZ3MgJiBXU1BfVE9QKSAmJiAoZmxhZ3MgJiBXU1BfQk9UKSkKKyAgICB7CisJRU1TRyhfKCJFNDQyOiBDYW4ndCBzcGxpdCB0b3BsZWZ0IGFuZCBib3RyaWdodCBhdCB0aGUgc2FtZSB0aW1lIikpOworCXJldHVybiBGQUlMOworICAgIH0KKworICAgIC8qIFdoZW4gY3JlYXRpbmcgdGhlIGhlbHAgd2luZG93IG1ha2UgYSBzbmFwc2hvdCBvZiB0aGUgd2luZG93IGxheW91dC4KKyAgICAgKiBPdGhlcndpc2UgY2xlYXIgdGhlIHNuYXBzaG90LCBpdCdzIG5vdyBpbnZhbGlkLiAqLworICAgIGlmIChmbGFncyAmIFdTUF9IRUxQKQorCW1ha2Vfc25hcHNob3QoKTsKKyAgICBlbHNlCisJY2xlYXJfc25hcHNob3QoKTsKKworICAgIHJldHVybiB3aW5fc3BsaXRfaW5zKHNpemUsIGZsYWdzLCBOVUxMLCAwKTsKK30KKworLyoKKyAqIFdoZW4gIm5ld3dpbiIgaXMgTlVMTDogc3BsaXQgYSB3aW5kb3cgaW4gdHdvLgorICogV2hlbiAibmV3d2luIiBpcyBub3QgTlVMTDogaW5zZXJ0IHRoaXMgd2luZG93IGF0IHRoZSBmYXIKKyAqIHRvcC9sZWZ0L3JpZ2h0L2JvdHRvbS4KKyAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKKyAqLworICAgIHN0YXRpYyBpbnQKK3dpbl9zcGxpdF9pbnMoc2l6ZSwgZmxhZ3MsIG5ld3dpbiwgZGlyKQorICAgIGludAkJc2l6ZTsKKyAgICBpbnQJCWZsYWdzOworICAgIHdpbl9UCSpuZXd3aW47CisgICAgaW50CQlkaXI7Cit7CisgICAgd2luX1QJKndwID0gbmV3d2luOworICAgIHdpbl9UCSpvbGR3aW47CisgICAgaW50CQluZXdfc2l6ZSA9IHNpemU7CisgICAgaW50CQlpOworICAgIGludAkJbmVlZF9zdGF0dXMgPSAwOworICAgIGludAkJZG9fZXF1YWwgPSBGQUxTRTsKKyAgICBpbnQJCW5lZWRlZDsKKyAgICBpbnQJCWF2YWlsYWJsZTsKKyAgICBpbnQJCW9sZHdpbl9oZWlnaHQgPSAwOworICAgIGludAkJbGF5b3V0OworICAgIGZyYW1lX1QJKmZycCwgKmN1cmZycDsKKyAgICBpbnQJCWJlZm9yZTsKKworICAgIGlmIChmbGFncyAmIFdTUF9UT1ApCisJb2xkd2luID0gZmlyc3R3aW47CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBXU1BfQk9UKQorCW9sZHdpbiA9IGxhc3R3aW47CisgICAgZWxzZQorCW9sZHdpbiA9IGN1cndpbjsKKworICAgIC8qIGFkZCBhIHN0YXR1cyBsaW5lIHdoZW4gcF9scyA9PSAxIGFuZCBzcGxpdHRpbmcgdGhlIGZpcnN0IHdpbmRvdyAqLworICAgIGlmIChsYXN0d2luID09IGZpcnN0d2luICYmIHBfbHMgPT0gMSAmJiBvbGR3aW4tPndfc3RhdHVzX2hlaWdodCA9PSAwKQorICAgIHsKKwlpZiAob2xkd2luLT53X2hlaWdodCA8PSBwX3dtaCAmJiBuZXd3aW4gPT0gTlVMTCkKKwl7CisJICAgIEVNU0coXyhlX25vcm9vbSkpOworCSAgICByZXR1cm4gRkFJTDsKKwl9CisJbmVlZF9zdGF0dXMgPSBTVEFUVVNfSEVJR0hUOworICAgIH0KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGZsYWdzICYgV1NQX1ZFUlQpCisgICAgeworCWxheW91dCA9IEZSX1JPVzsKKwlkb19lcXVhbCA9IChwX2VhICYmIG5ld19zaXplID09IDAgJiYgKnBfZWFkICE9ICd2Jyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIGFyZSBhYmxlIHRvIHNwbGl0IHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgY29tcHV0ZSBpdHMKKwkgKiB3aWR0aC4KKwkgKi8KKwluZWVkZWQgPSBwX3dtdyArIDE7CisJaWYgKGZsYWdzICYgV1NQX1JPT00pCisJICAgIG5lZWRlZCArPSBwX3dpdyAtIHBfd213OworCWlmIChwX2VhIHx8IChmbGFncyAmIChXU1BfQk9UIHwgV1NQX1RPUCkpKQorCXsKKwkgICAgYXZhaWxhYmxlID0gdG9wZnJhbWUtPmZyX3dpZHRoOworCSAgICBuZWVkZWQgKz0gZnJhbWVfbWlud2lkdGgodG9wZnJhbWUsIE5VTEwpOworCX0KKwllbHNlCisJICAgIGF2YWlsYWJsZSA9IG9sZHdpbi0+d193aWR0aDsKKwlpZiAoYXZhaWxhYmxlIDwgbmVlZGVkICYmIG5ld3dpbiA9PSBOVUxMKQorCXsKKwkgICAgRU1TRyhfKGVfbm9yb29tKSk7CisJICAgIHJldHVybiBGQUlMOworCX0KKwlpZiAobmV3X3NpemUgPT0gMCkKKwkgICAgbmV3X3NpemUgPSBvbGR3aW4tPndfd2lkdGggLyAyOworCWlmIChuZXdfc2l6ZSA+IG9sZHdpbi0+d193aWR0aCAtIHBfd213IC0gMSkKKwkgICAgbmV3X3NpemUgPSBvbGR3aW4tPndfd2lkdGggLSBwX3dtdyAtIDE7CisJaWYgKG5ld19zaXplIDwgcF93bXcpCisJICAgIG5ld19zaXplID0gcF93bXc7CisKKwkvKiBpZiBpdCBkb2Vzbid0IGZpdCBpbiB0aGUgY3VycmVudCB3aW5kb3csIG5lZWQgd2luX2VxdWFsKCkgKi8KKwlpZiAob2xkd2luLT53X3dpZHRoIC0gbmV3X3NpemUgLSAxIDwgcF93bXcpCisJICAgIGRvX2VxdWFsID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCWxheW91dCA9IEZSX0NPTDsKKwlkb19lcXVhbCA9IChwX2VhICYmIG5ld19zaXplID09IDAKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCQkmJiAqcF9lYWQgIT0gJ2gnCisjZW5kaWYKKwkJKTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgYXJlIGFibGUgdG8gc3BsaXQgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBjb21wdXRlIGl0cworCSAqIGhlaWdodC4KKwkgKi8KKwluZWVkZWQgPSBwX3dtaCArIFNUQVRVU19IRUlHSFQgKyBuZWVkX3N0YXR1czsKKwlpZiAoZmxhZ3MgJiBXU1BfUk9PTSkKKwkgICAgbmVlZGVkICs9IHBfd2ggLSBwX3dtaDsKKwlpZiAocF9lYSB8fCAoZmxhZ3MgJiAoV1NQX0JPVCB8IFdTUF9UT1ApKSkKKwl7CisJICAgIGF2YWlsYWJsZSA9IHRvcGZyYW1lLT5mcl9oZWlnaHQ7CisJICAgIG5lZWRlZCArPSBmcmFtZV9taW5oZWlnaHQodG9wZnJhbWUsIE5VTEwpOworCX0KKwllbHNlCisJeworCSAgICBhdmFpbGFibGUgPSBvbGR3aW4tPndfaGVpZ2h0OworCSAgICBuZWVkZWQgKz0gcF93bWg7CisJfQorCWlmIChhdmFpbGFibGUgPCBuZWVkZWQgJiYgbmV3d2luID09IE5VTEwpCisJeworCSAgICBFTVNHKF8oZV9ub3Jvb20pKTsKKwkgICAgcmV0dXJuIEZBSUw7CisJfQorCW9sZHdpbl9oZWlnaHQgPSBvbGR3aW4tPndfaGVpZ2h0OworCWlmIChuZWVkX3N0YXR1cykKKwl7CisJICAgIG9sZHdpbi0+d19zdGF0dXNfaGVpZ2h0ID0gU1RBVFVTX0hFSUdIVDsKKwkgICAgb2xkd2luX2hlaWdodCAtPSBTVEFUVVNfSEVJR0hUOworCX0KKwlpZiAobmV3X3NpemUgPT0gMCkKKwkgICAgbmV3X3NpemUgPSBvbGR3aW5faGVpZ2h0IC8gMjsKKworCWlmIChuZXdfc2l6ZSA+IG9sZHdpbl9oZWlnaHQgLSBwX3dtaCAtIFNUQVRVU19IRUlHSFQpCisJICAgIG5ld19zaXplID0gb2xkd2luX2hlaWdodCAtIHBfd21oIC0gU1RBVFVTX0hFSUdIVDsKKwlpZiAobmV3X3NpemUgPCBwX3dtaCkKKwkgICAgbmV3X3NpemUgPSBwX3dtaDsKKworCS8qIGlmIGl0IGRvZXNuJ3QgZml0IGluIHRoZSBjdXJyZW50IHdpbmRvdywgbmVlZCB3aW5fZXF1YWwoKSAqLworCWlmIChvbGR3aW5faGVpZ2h0IC0gbmV3X3NpemUgLSBTVEFUVVNfSEVJR0hUIDwgcF93bWgpCisJICAgIGRvX2VxdWFsID0gVFJVRTsKKworCS8qIFdlIGRvbid0IGxpa2UgdG8gdGFrZSBsaW5lcyBmb3IgdGhlIG5ldyB3aW5kb3cgZnJvbSBhCisJICogJ3dpbmZpeGhlaWdodCcgd2luZG93LiAgVGFrZSB0aGVtIGZyb20gYSB3aW5kb3cgYWJvdmUgb3IgYmVsb3cKKwkgKiBpbnN0ZWFkLCBpZiBwb3NzaWJsZS4gKi8KKwlpZiAob2xkd2luLT53X3Bfd2ZoKQorCXsKKwkgICAgd2luX3NldGhlaWdodF93aW4ob2xkd2luLT53X2hlaWdodCArIG5ld19zaXplICsgU1RBVFVTX0hFSUdIVCwKKwkJCQkJCQkJICAgICAgb2xkd2luKTsKKwkgICAgb2xkd2luX2hlaWdodCA9IG9sZHdpbi0+d19oZWlnaHQ7CisJICAgIGlmIChuZWVkX3N0YXR1cykKKwkJb2xkd2luX2hlaWdodCAtPSBTVEFUVVNfSEVJR0hUOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIGFsbG9jYXRlIG5ldyB3aW5kb3cgc3RydWN0dXJlIGFuZCBsaW5rIGl0IGluIHRoZSB3aW5kb3cgbGlzdAorICAgICAqLworICAgIGlmICgoZmxhZ3MgJiBXU1BfVE9QKSA9PSAwCisJICAgICYmICgoZmxhZ3MgJiBXU1BfQk9UKQorCQl8fCAoZmxhZ3MgJiBXU1BfQkVMT1cpCisJCXx8ICghKGZsYWdzICYgV1NQX0FCT1ZFKQorCQkgICAgJiYgKAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCQkoZmxhZ3MgJiBXU1BfVkVSVCkgPyBwX3NwciA6CisjZW5kaWYKKwkJCXBfc2IpKSkpCisgICAgeworCS8qIG5ldyB3aW5kb3cgYmVsb3cvcmlnaHQgb2YgY3VycmVudCBvbmUgKi8KKwlpZiAobmV3d2luID09IE5VTEwpCisJICAgIHdwID0gd2luX2FsbG9jKG9sZHdpbik7CisJZWxzZQorCSAgICB3aW5fYXBwZW5kKG9sZHdpbiwgd3ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChuZXd3aW4gPT0gTlVMTCkKKwkgICAgd3AgPSB3aW5fYWxsb2Mob2xkd2luLT53X3ByZXYpOworCWVsc2UKKwkgICAgd2luX2FwcGVuZChvbGR3aW4tPndfcHJldiwgd3ApOworICAgIH0KKworICAgIGlmIChuZXd3aW4gPT0gTlVMTCkKKyAgICB7CisJaWYgKHdwID09IE5VTEwpCisJICAgIHJldHVybiBGQUlMOworCisJLyoKKwkgKiBtYWtlIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IHdpbmRvdyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmUKKwkgKi8KKwl3cC0+d19idWZmZXIgPSBjdXJidWY7CisJY3VyYnVmLT5iX253aW5kb3dzKys7CisJd3AtPndfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKwl3cC0+d192YWxpZCA9IDA7CisJd3AtPndfY3Vyc3dhbnQgPSBjdXJ3aW4tPndfY3Vyc3dhbnQ7CisJd3AtPndfc2V0X2N1cnN3YW50ID0gY3Vyd2luLT53X3NldF9jdXJzd2FudDsKKwl3cC0+d190b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CisjaWZkZWYgRkVBVF9ESUZGCisJd3AtPndfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisJd3AtPndfbGVmdGNvbCA9IGN1cndpbi0+d19sZWZ0Y29sOworCXdwLT53X3BjbWFyayA9IGN1cndpbi0+d19wY21hcms7CisJd3AtPndfcHJldl9wY21hcmsgPSBjdXJ3aW4tPndfcHJldl9wY21hcms7CisJd3AtPndfYWx0X2ZudW0gPSBjdXJ3aW4tPndfYWx0X2ZudW07CisJd3AtPndfZnJhY3Rpb24gPSBjdXJ3aW4tPndfZnJhY3Rpb247CisJd3AtPndfcHJldl9mcmFjdGlvbl9yb3cgPSBjdXJ3aW4tPndfcHJldl9mcmFjdGlvbl9yb3c7CisjaWZkZWYgRkVBVF9KVU1QTElTVAorCWNvcHlfanVtcGxpc3QoY3Vyd2luLCB3cCk7CisjZW5kaWYKKwlpZiAoY3Vyd2luLT53X2xvY2FsZGlyICE9IE5VTEwpCisJICAgIHdwLT53X2xvY2FsZGlyID0gdmltX3N0cnNhdmUoY3Vyd2luLT53X2xvY2FsZGlyKTsKKworCS8qIFVzZSB0aGUgc2FtZSBhcmd1bWVudCBsaXN0LiAqLworCXdwLT53X2FsaXN0ID0gY3Vyd2luLT53X2FsaXN0OworCSsrd3AtPndfYWxpc3QtPmFsX3JlZmNvdW50OworCXdwLT53X2FyZ19pZHggPSBjdXJ3aW4tPndfYXJnX2lkeDsKKworCS8qCisJICogY29weSB0YWdzdGFjayBhbmQgb3B0aW9ucyBmcm9tIGV4aXN0aW5nIHdpbmRvdworCSAqLworCWZvciAoaSA9IDA7IGkgPCBjdXJ3aW4tPndfdGFnc3RhY2tsZW47IGkrKykKKwl7CisJICAgIHdwLT53X3RhZ3N0YWNrW2ldID0gY3Vyd2luLT53X3RhZ3N0YWNrW2ldOworCSAgICBpZiAod3AtPndfdGFnc3RhY2tbaV0udGFnbmFtZSAhPSBOVUxMKQorCQl3cC0+d190YWdzdGFja1tpXS50YWduYW1lID0KKwkJCQkgICAgICAgdmltX3N0cnNhdmUod3AtPndfdGFnc3RhY2tbaV0udGFnbmFtZSk7CisJfQorCXdwLT53X3RhZ3N0YWNraWR4ID0gY3Vyd2luLT53X3RhZ3N0YWNraWR4OworCXdwLT53X3RhZ3N0YWNrbGVuID0gY3Vyd2luLT53X3RhZ3N0YWNrbGVuOworCXdpbl9jb3B5X29wdGlvbnMoY3Vyd2luLCB3cCk7CisjaWZkZWYgRkVBVF9GT0xESU5HCisJY29weUZvbGRpbmdTdGF0ZShjdXJ3aW4sIHdwKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogUmVvcmdhbmlzZSB0aGUgdHJlZSBvZiBmcmFtZXMgdG8gaW5zZXJ0IHRoZSBuZXcgd2luZG93LgorICAgICAqLworICAgIGlmIChmbGFncyAmIChXU1BfVE9QIHwgV1NQX0JPVCkpCisgICAgeworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJaWYgKCh0b3BmcmFtZS0+ZnJfbGF5b3V0ID09IEZSX0NPTCAmJiAoZmxhZ3MgJiBXU1BfVkVSVCkgPT0gMCkKKwkgICAgfHwgKHRvcGZyYW1lLT5mcl9sYXlvdXQgPT0gRlJfUk9XICYmIChmbGFncyAmIFdTUF9WRVJUKSAhPSAwKSkKKyNlbHNlCisJaWYgKHRvcGZyYW1lLT5mcl9sYXlvdXQgPT0gRlJfQ09MKQorI2VuZGlmCisJeworCSAgICBjdXJmcnAgPSB0b3BmcmFtZS0+ZnJfY2hpbGQ7CisJICAgIGlmIChmbGFncyAmIFdTUF9CT1QpCisJCXdoaWxlIChjdXJmcnAtPmZyX25leHQgIT0gTlVMTCkKKwkJICAgIGN1cmZycCA9IGN1cmZycC0+ZnJfbmV4dDsKKwl9CisJZWxzZQorCSAgICBjdXJmcnAgPSB0b3BmcmFtZTsKKwliZWZvcmUgPSAoZmxhZ3MgJiBXU1BfVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwljdXJmcnAgPSBvbGR3aW4tPndfZnJhbWU7CisJaWYgKGZsYWdzICYgV1NQX0JFTE9XKQorCSAgICBiZWZvcmUgPSBGQUxTRTsKKwllbHNlIGlmIChmbGFncyAmIFdTUF9BQk9WRSkKKwkgICAgYmVmb3JlID0gVFJVRTsKKwllbHNlCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlpZiAoZmxhZ3MgJiBXU1BfVkVSVCkKKwkgICAgYmVmb3JlID0gIXBfc3ByOworCWVsc2UKKyNlbmRpZgorCSAgICBiZWZvcmUgPSAhcF9zYjsKKyAgICB9CisgICAgaWYgKGN1cmZycC0+ZnJfcGFyZW50ID09IE5VTEwgfHwgY3VyZnJwLT5mcl9wYXJlbnQtPmZyX2xheW91dCAhPSBsYXlvdXQpCisgICAgeworCS8qIE5lZWQgdG8gY3JlYXRlIGEgbmV3IGZyYW1lIGluIHRoZSB0cmVlIHRvIG1ha2UgYSBicmFuY2guICovCisJZnJwID0gKGZyYW1lX1QgKilhbGxvY19jbGVhcigodW5zaWduZWQpc2l6ZW9mKGZyYW1lX1QpKTsKKwkqZnJwID0gKmN1cmZycDsKKwljdXJmcnAtPmZyX2xheW91dCA9IGxheW91dDsKKwlmcnAtPmZyX3BhcmVudCA9IGN1cmZycDsKKwlmcnAtPmZyX25leHQgPSBOVUxMOworCWZycC0+ZnJfcHJldiA9IE5VTEw7CisJY3VyZnJwLT5mcl9jaGlsZCA9IGZycDsKKwljdXJmcnAtPmZyX3dpbiA9IE5VTEw7CisJY3VyZnJwID0gZnJwOworCWlmIChmcnAtPmZyX3dpbiAhPSBOVUxMKQorCSAgICBvbGR3aW4tPndfZnJhbWUgPSBmcnA7CisJZWxzZQorCSAgICBmb3IgKGZycCA9IGZycC0+ZnJfY2hpbGQ7IGZycCAhPSBOVUxMOyBmcnAgPSBmcnAtPmZyX25leHQpCisJCWZycC0+ZnJfcGFyZW50ID0gY3VyZnJwOworICAgIH0KKworICAgIGlmIChuZXd3aW4gPT0gTlVMTCkKKyAgICB7CisJLyogQ3JlYXRlIGEgZnJhbWUgZm9yIHRoZSBuZXcgd2luZG93LiAqLworCWZycCA9IChmcmFtZV9UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKXNpemVvZihmcmFtZV9UKSk7CisJZnJwLT5mcl9sYXlvdXQgPSBGUl9MRUFGOworCWZycC0+ZnJfd2luID0gd3A7CisJd3AtPndfZnJhbWUgPSBmcnA7CisgICAgfQorICAgIGVsc2UKKwlmcnAgPSBuZXd3aW4tPndfZnJhbWU7CisgICAgZnJwLT5mcl9wYXJlbnQgPSBjdXJmcnAtPmZyX3BhcmVudDsKKworICAgIC8qIEluc2VydCB0aGUgbmV3IGZyYW1lIGF0IHRoZSByaWdodCBwbGFjZSBpbiB0aGUgZnJhbWUgbGlzdC4gKi8KKyAgICBpZiAoYmVmb3JlKQorCWZyYW1lX2luc2VydChjdXJmcnAsIGZycCk7CisgICAgZWxzZQorCWZyYW1lX2FwcGVuZChjdXJmcnAsIGZycCk7CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmIChmbGFncyAmIFdTUF9WRVJUKQorICAgIHsKKwl3cC0+d19wX3NjciA9IGN1cndpbi0+d19wX3NjcjsKKwlpZiAobmVlZF9zdGF0dXMpCisJeworCSAgICAtLW9sZHdpbi0+d19oZWlnaHQ7CisJICAgIG9sZHdpbi0+d19zdGF0dXNfaGVpZ2h0ID0gbmVlZF9zdGF0dXM7CisJfQorCWlmIChmbGFncyAmIChXU1BfVE9QIHwgV1NQX0JPVCkpCisJeworCSAgICAvKiBzZXQgaGVpZ2h0IGFuZCByb3cgb2YgbmV3IHdpbmRvdyB0byBmdWxsIGhlaWdodCAqLworCSAgICB3cC0+d193aW5yb3cgPSAwOworCSAgICB3cC0+d19oZWlnaHQgPSBjdXJmcnAtPmZyX2hlaWdodCAtIChwX2xzID4gMCk7CisJICAgIHdwLT53X3N0YXR1c19oZWlnaHQgPSAocF9scyA+IDApOworCX0KKwllbHNlCisJeworCSAgICAvKiBoZWlnaHQgYW5kIHJvdyBvZiBuZXcgd2luZG93IGlzIHNhbWUgYXMgY3VycmVudCB3aW5kb3cgKi8KKwkgICAgd3AtPndfd2lucm93ID0gb2xkd2luLT53X3dpbnJvdzsKKwkgICAgd3AtPndfaGVpZ2h0ID0gb2xkd2luLT53X2hlaWdodDsKKwkgICAgd3AtPndfc3RhdHVzX2hlaWdodCA9IG9sZHdpbi0+d19zdGF0dXNfaGVpZ2h0OworCX0KKwlmcnAtPmZyX2hlaWdodCA9IGN1cmZycC0+ZnJfaGVpZ2h0OworCisJLyogIm5ld19zaXplIiBvZiB0aGUgY3VycmVudCB3aW5kb3cgZ29lcyB0byB0aGUgbmV3IHdpbmRvdywgdXNlCisJICogb25lIGNvbHVtbiBmb3IgdGhlIHZlcnRpY2FsIHNlcGFyYXRvciAqLworCXdwLT53X3dpZHRoID0gbmV3X3NpemU7CisJaWYgKGJlZm9yZSkKKwkgICAgd3AtPndfdnNlcF93aWR0aCA9IDE7CisJZWxzZQorCXsKKwkgICAgd3AtPndfdnNlcF93aWR0aCA9IG9sZHdpbi0+d192c2VwX3dpZHRoOworCSAgICBvbGR3aW4tPndfdnNlcF93aWR0aCA9IDE7CisJfQorCWlmIChmbGFncyAmIChXU1BfVE9QIHwgV1NQX0JPVCkpCisJeworCSAgICBpZiAoZmxhZ3MgJiBXU1BfQk9UKQorCQlmcmFtZV9hZGRfdnNlcChjdXJmcnApOworCSAgICAvKiBTZXQgd2lkdGggb2YgbmVpZ2hib3IgZnJhbWUgKi8KKwkgICAgZnJhbWVfbmV3X3dpZHRoKGN1cmZycCwgY3VyZnJwLT5mcl93aWR0aAorCQkgICAgLSAobmV3X3NpemUgKyAoKGZsYWdzICYgV1NQX1RPUCkgIT0gMCkpLCBmbGFncyAmIFdTUF9UT1ApOworCX0KKwllbHNlCisJICAgIG9sZHdpbi0+d193aWR0aCAtPSBuZXdfc2l6ZSArIDE7CisJaWYgKGJlZm9yZSkJLyogbmV3IHdpbmRvdyBsZWZ0IG9mIGN1cnJlbnQgb25lICovCisJeworCSAgICB3cC0+d193aW5jb2wgPSBvbGR3aW4tPndfd2luY29sOworCSAgICBvbGR3aW4tPndfd2luY29sICs9IG5ld19zaXplICsgMTsKKwl9CisJZWxzZQkJLyogbmV3IHdpbmRvdyByaWdodCBvZiBjdXJyZW50IG9uZSAqLworCSAgICB3cC0+d193aW5jb2wgPSBvbGR3aW4tPndfd2luY29sICsgb2xkd2luLT53X3dpZHRoICsgMTsKKwlmcmFtZV9maXhfd2lkdGgob2xkd2luKTsKKwlmcmFtZV9maXhfd2lkdGgod3ApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJLyogd2lkdGggYW5kIGNvbHVtbiBvZiBuZXcgd2luZG93IGlzIHNhbWUgYXMgY3VycmVudCB3aW5kb3cgKi8KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCWlmIChmbGFncyAmIChXU1BfVE9QIHwgV1NQX0JPVCkpCisJeworCSAgICB3cC0+d193aW5jb2wgPSAwOworCSAgICB3cC0+d193aWR0aCA9IENvbHVtbnM7CisJICAgIHdwLT53X3ZzZXBfd2lkdGggPSAwOworCX0KKwllbHNlCisJeworCSAgICB3cC0+d193aW5jb2wgPSBvbGR3aW4tPndfd2luY29sOworCSAgICB3cC0+d193aWR0aCA9IG9sZHdpbi0+d193aWR0aDsKKwkgICAgd3AtPndfdnNlcF93aWR0aCA9IG9sZHdpbi0+d192c2VwX3dpZHRoOworCX0KKwlmcnAtPmZyX3dpZHRoID0gY3VyZnJwLT5mcl93aWR0aDsKKyNlbmRpZgorCisJLyogIm5ld19zaXplIiBvZiB0aGUgY3VycmVudCB3aW5kb3cgZ29lcyB0byB0aGUgbmV3IHdpbmRvdywgdXNlCisJICogb25lIHJvdyBmb3IgdGhlIHN0YXR1cyBsaW5lICovCisJd2luX25ld19oZWlnaHQod3AsIG5ld19zaXplKTsKKwlpZiAoZmxhZ3MgJiAoV1NQX1RPUCB8IFdTUF9CT1QpKQorCSAgICBmcmFtZV9uZXdfaGVpZ2h0KGN1cmZycCwgY3VyZnJwLT5mcl9oZWlnaHQKKwkJCS0gKG5ld19zaXplICsgU1RBVFVTX0hFSUdIVCksIGZsYWdzICYgV1NQX1RPUCwgRkFMU0UpOworCWVsc2UKKwkgICAgd2luX25ld19oZWlnaHQob2xkd2luLCBvbGR3aW5faGVpZ2h0IC0gKG5ld19zaXplICsgU1RBVFVTX0hFSUdIVCkpOworCWlmIChiZWZvcmUpCS8qIG5ldyB3aW5kb3cgYWJvdmUgY3VycmVudCBvbmUgKi8KKwl7CisJICAgIHdwLT53X3dpbnJvdyA9IG9sZHdpbi0+d193aW5yb3c7CisJICAgIHdwLT53X3N0YXR1c19oZWlnaHQgPSBTVEFUVVNfSEVJR0hUOworCSAgICBvbGR3aW4tPndfd2lucm93ICs9IHdwLT53X2hlaWdodCArIFNUQVRVU19IRUlHSFQ7CisJfQorCWVsc2UJCS8qIG5ldyB3aW5kb3cgYmVsb3cgY3VycmVudCBvbmUgKi8KKwl7CisJICAgIHdwLT53X3dpbnJvdyA9IG9sZHdpbi0+d193aW5yb3cgKyBvbGR3aW4tPndfaGVpZ2h0ICsgU1RBVFVTX0hFSUdIVDsKKwkgICAgd3AtPndfc3RhdHVzX2hlaWdodCA9IG9sZHdpbi0+d19zdGF0dXNfaGVpZ2h0OworCSAgICBvbGR3aW4tPndfc3RhdHVzX2hlaWdodCA9IFNUQVRVU19IRUlHSFQ7CisJfQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJaWYgKGZsYWdzICYgV1NQX0JPVCkKKwkgICAgZnJhbWVfYWRkX3N0YXR1c2xpbmUoY3VyZnJwKTsKKyNlbmRpZgorCWZyYW1lX2ZpeF9oZWlnaHQod3ApOworCWZyYW1lX2ZpeF9oZWlnaHQob2xkd2luKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiAoV1NQX1RPUCB8IFdTUF9CT1QpKQorCSh2b2lkKXdpbl9jb21wX3BvcygpOworCisgICAgLyoKKyAgICAgKiBCb3RoIHdpbmRvd3MgbmVlZCByZWRyYXdpbmcKKyAgICAgKi8KKyAgICByZWRyYXdfd2luX2xhdGVyKHdwLCBOT1RfVkFMSUQpOworICAgIHdwLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyAgICByZWRyYXdfd2luX2xhdGVyKG9sZHdpbiwgTk9UX1ZBTElEKTsKKyAgICBvbGR3aW4tPndfcmVkcl9zdGF0dXMgPSBUUlVFOworCisgICAgaWYgKG5lZWRfc3RhdHVzKQorICAgIHsKKwltc2dfcm93ID0gUm93cyAtIDE7CisJbXNnX2NvbCA9IHNjX2NvbDsKKwltc2dfY2xyX2Vvc19mb3JjZSgpOwkvKiBPbGQgY29tbWFuZC9ydWxlciBtYXkgc3RpbGwgYmUgdGhlcmUgKi8KKwljb21wX2NvbCgpOworCW1zZ19yb3cgPSBSb3dzIC0gMTsKKwltc2dfY29sID0gMDsJLyogcHV0IHBvc2l0aW9uIGJhY2sgYXQgc3RhcnQgb2YgbGluZSAqLworICAgIH0KKworICAgIC8qCisgICAgICogbWFrZSB0aGUgbmV3IHdpbmRvdyB0aGUgY3VycmVudCB3aW5kb3cgYW5kIHJlZHJhdworICAgICAqLworICAgIGlmIChkb19lcXVhbCB8fCBkaXIgIT0gMCkKKwl3aW5fZXF1YWwod3AsIFRSVUUsCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJKGZsYWdzICYgV1NQX1ZFUlQpID8gKGRpciA9PSAndicgPyAnYicgOiAnaCcpCisJCTogZGlyID09ICdoJyA/ICdiJyA6CisjZW5kaWYKKwkJJ3YnKTsKKworICAgIC8qIERvbid0IGNoYW5nZSB0aGUgd2luZG93IGhlaWdodC93aWR0aCB0byAnd2luaGVpZ2h0JyAvICd3aW53aWR0aCcgaWYgYQorICAgICAqIHNpemUgd2FzIGdpdmVuLiAqLworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGZsYWdzICYgV1NQX1ZFUlQpCisgICAgeworCWkgPSBwX3dpdzsKKwlpZiAoc2l6ZSAhPSAwKQorCSAgICBwX3dpdyA9IHNpemU7CisKKyMgaWZkZWYgRkVBVF9HVUkKKwkvKiBXaGVuICdndWlvcHRpb25zJyBpbmNsdWRlcyAnTCcgb3IgJ1InIG1heSBoYXZlIHRvIGFkZCBzY3JvbGxiYXJzLiAqLworCWlmIChndWkuaW5fdXNlKQorCSAgICBndWlfaW5pdF93aGljaF9jb21wb25lbnRzKE5VTEwpOworIyBlbmRpZgorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJaSA9IHBfd2g7CisJaWYgKHNpemUgIT0gMCkKKwkgICAgcF93aCA9IHNpemU7CisgICAgfQorICAgIHdpbl9lbnRlcih3cCwgRkFMU0UpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgaWYgKGZsYWdzICYgV1NQX1ZFUlQpCisJcF93aXcgPSBpOworICAgIGVsc2UKKyNlbmRpZgorCXBfd2ggPSBpOworCisgICAgcmV0dXJuIE9LOworfQorCisjZW5kaWYgLyogRkVBVF9XSU5ET1dTICovCisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorLyoKKyAqIFJldHVybiBtaW5pbWFsIGhlaWdodCBmb3Igd2luZG93ICJ3cCIgYW5kIHdpbmRvd3MgZWFzdCBvZiBpdC4KKyAqIFRha2VzIGludG8gYWNjb3VudCB0aGUgZWFzdGJvdW5kIHdpbmR3cyBjYW4gYmUgc3BsaXQsIGVhY2ggb2YgdGhlbQorICogcmVxdWlyZWluZyBwX3dtaCBsaW5lcy4gIERvZXNuJ3QgY291bnQgc3RhdHVzIGxpbmVzLgorICovCisgICAgc3RhdGljIGludAord2luX21pbmhlaWdodCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaW50CQltaW5oZWlnaHQgPSBwX3dtaDsKKyAgICBpbnQJCW47CisgICAgd2luX1QJKndwMSwgKndwMjsKKworICAgIHdwMSA9IHdwOworICAgIGZvciAoOzspCisgICAgeworCXdwMSA9IHdwMS0+d19uZXh0OworCWlmICh3cDEgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJbiA9IHBfd21oOworCXdwMiA9IHdwMTsKKwlmb3IgKDs7KQorCXsKKwkgICAgd3AyID0gd3AyLT53X25leHQ7CisJICAgIGlmICh3cDIgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIG4gKz0gd2luX21pbmhlaWdodCh3cDIpOworCX0KKwlpZiAobiA+IG1pbmhlaWdodCkKKwkgICAgbWluaGVpZ2h0ID0gbjsKKyAgICB9CisgICAgcmV0dXJuIG1pbmhlaWdodDsKK30KKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBDaGVjayBpZiAid2luIiBpcyBhIHBvaW50ZXIgdG8gYW4gZXhpc3Rpbmcgd2luZG93LgorICovCisgICAgaW50Cit3aW5fdmFsaWQod2luKQorICAgIHdpbl9UCSp3aW47Cit7CisgICAgd2luX1QJKndwOworCisgICAgaWYgKHdpbiA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwlpZiAod3AgPT0gd2luKQorCSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3aW5kb3dzLgorICovCisgICAgaW50Cit3aW5fY291bnQoKQoreworICAgIHdpbl9UCSp3cDsKKyAgICBpbnQJCWNvdW50ID0gMDsKKworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCSsrY291bnQ7CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKgorICogTWFrZSAiY291bnQiIHdpbmRvd3Mgb24gdGhlIHNjcmVlbi4KKyAqIFJldHVybiBhY3R1YWwgbnVtYmVyIG9mIHdpbmRvd3Mgb24gdGhlIHNjcmVlbi4KKyAqIE11c3QgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMganVzdCBvbmUgd2luZG93LCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4KKyAqIChleGNsdWRpbmcgdGhlIGNvbW1hbmQgbGluZSkuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIGludAorbWFrZV93aW5kb3dzKGNvdW50LCB2ZXJ0aWNhbCkKKyAgICBpbnQJCWNvdW50OworICAgIGludAkJdmVydGljYWw7CS8qIHNwbGl0IHdpbmRvd3MgdmVydGljYWxseSBpZiBUUlVFICovCit7CisgICAgaW50CQltYXhjb3VudDsKKyAgICBpbnQJCXRvZG87CisKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmICh2ZXJ0aWNhbCkKKyAgICB7CisJLyogRWFjaCB3aW5kb3dzIG5lZWRzIGF0IGxlYXN0ICd3aW5taW53aWR0aCcgbGluZXMgYW5kIGEgc2VwYXJhdG9yCisJICogY29sdW1uLiAqLworCW1heGNvdW50ID0gKGN1cndpbi0+d193aWR0aCArIGN1cndpbi0+d192c2VwX3dpZHRoCisJCQkJCSAgICAgLSAocF93aXcgLSBwX3dtdykpIC8gKHBfd213ICsgMSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKiBFYWNoIHdpbmRvdyBuZWVkcyBhdCBsZWFzdCAnd2lubWluaGVpZ2h0JyBsaW5lcyBhbmQgYSBzdGF0dXMgbGluZS4gKi8KKwltYXhjb3VudCA9IChjdXJ3aW4tPndfaGVpZ2h0ICsgY3Vyd2luLT53X3N0YXR1c19oZWlnaHQKKwkJCQkgIC0gKHBfd2ggLSBwX3dtaCkpIC8gKHBfd21oICsgU1RBVFVTX0hFSUdIVCk7CisgICAgfQorCisgICAgaWYgKG1heGNvdW50IDwgMikKKwltYXhjb3VudCA9IDI7CisgICAgaWYgKGNvdW50ID4gbWF4Y291bnQpCisJY291bnQgPSBtYXhjb3VudDsKKworICAgIC8qCisgICAgICogYWRkIHN0YXR1cyBsaW5lIG5vdywgb3RoZXJ3aXNlIGZpcnN0IHdpbmRvdyB3aWxsIGJlIHRvbyBiaWcKKyAgICAgKi8KKyAgICBpZiAoY291bnQgPiAxKQorCWxhc3Rfc3RhdHVzKFRSVUUpOworCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLyoKKyAgICAgKiBEb24ndCBleGVjdXRlIGF1dG9jb21tYW5kcyB3aGlsZSBjcmVhdGluZyB0aGUgd2luZG93cy4gIE11c3QgZG8gdGhhdAorICAgICAqIHdoZW4gcHV0dGluZyB0aGUgYnVmZmVycyBpbiB0aGUgd2luZG93cy4KKyAgICAgKi8KKyAgICArK2F1dG9jbWRfYmxvY2s7CisjZW5kaWYKKworICAgIC8qIHRvZG8gaXMgbnVtYmVyIG9mIHdpbmRvd3MgbGVmdCB0byBjcmVhdGUgKi8KKyAgICBmb3IgKHRvZG8gPSBjb3VudCAtIDE7IHRvZG8gPiAwOyAtLXRvZG8pCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlpZiAodmVydGljYWwpCisJeworCSAgICBpZiAod2luX3NwbGl0KGN1cndpbi0+d193aWR0aCAtIChjdXJ3aW4tPndfd2lkdGggLSB0b2RvKQorCQkJLyAodG9kbyArIDEpIC0gMSwgV1NQX1ZFUlQgfCBXU1BfQUJPVkUpID09IEZBSUwpCisJCWJyZWFrOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJICAgIGlmICh3aW5fc3BsaXQoY3Vyd2luLT53X2hlaWdodCAtIChjdXJ3aW4tPndfaGVpZ2h0IC0gdG9kbworCQkJICAgICogU1RBVFVTX0hFSUdIVCkgLyAodG9kbyArIDEpCisJCQktIFNUQVRVU19IRUlHSFQsIFdTUF9BQk9WRSkgPT0gRkFJTCkKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgLS1hdXRvY21kX2Jsb2NrOworI2VuZGlmCisKKyAgICAvKiByZXR1cm4gYWN0dWFsIG51bWJlciBvZiB3aW5kb3dzICovCisgICAgcmV0dXJuIChjb3VudCAtIHRvZG8pOworfQorCisvKgorICogRXhjaGFuZ2UgY3VycmVudCBhbmQgbmV4dCB3aW5kb3cKKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fZXhjaGFuZ2UoUHJlbnVtKQorICAgIGxvbmcJUHJlbnVtOworeworICAgIGZyYW1lX1QJKmZycDsKKyAgICBmcmFtZV9UCSpmcnAyOworICAgIHdpbl9UCSp3cDsKKyAgICB3aW5fVAkqd3AyOworICAgIGludAkJdGVtcDsKKworICAgIGlmIChsYXN0d2luID09IGZpcnN0d2luKQkgICAgLyoganVzdCBvbmUgd2luZG93ICovCisgICAgeworCWJlZXBfZmx1c2goKTsKKwlyZXR1cm47CisgICAgfQorCisjaWZkZWYgRkVBVF9HVUkKKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIGZpbmQgd2luZG93IHRvIGV4Y2hhbmdlIHdpdGgKKyAgICAgKi8KKyAgICBpZiAoUHJlbnVtKQorICAgIHsKKwlmcnAgPSBjdXJ3aW4tPndfZnJhbWUtPmZyX3BhcmVudC0+ZnJfY2hpbGQ7CisJd2hpbGUgKGZycCAhPSBOVUxMICYmIC0tUHJlbnVtID4gMCkKKwkgICAgZnJwID0gZnJwLT5mcl9uZXh0OworICAgIH0KKyAgICBlbHNlIGlmIChjdXJ3aW4tPndfZnJhbWUtPmZyX25leHQgIT0gTlVMTCkJLyogU3dhcCB3aXRoIG5leHQgKi8KKwlmcnAgPSBjdXJ3aW4tPndfZnJhbWUtPmZyX25leHQ7CisgICAgZWxzZSAgICAvKiBTd2FwIGxhc3Qgd2luZG93IGluIHJvdy9jb2wgd2l0aCBwcmV2aW91cyAqLworCWZycCA9IGN1cndpbi0+d19mcmFtZS0+ZnJfcHJldjsKKworICAgIC8qIFdlIGNhbiBvbmx5IGV4Y2hhbmdlIGEgd2luZG93IHdpdGggYW5vdGhlciB3aW5kb3csIG5vdCB3aXRoIGEgZnJhbWUKKyAgICAgKiBjb250YWluaW5nIHdpbmRvd3MuICovCisgICAgaWYgKGZycCA9PSBOVUxMIHx8IGZycC0+ZnJfd2luID09IE5VTEwgfHwgZnJwLT5mcl93aW4gPT0gY3Vyd2luKQorCXJldHVybjsKKyAgICB3cCA9IGZycC0+ZnJfd2luOworCisvKgorICogMS4gcmVtb3ZlIGN1cndpbiBmcm9tIHRoZSBsaXN0LiBSZW1lbWJlciBhZnRlciB3aGljaCB3aW5kb3cgaXQgd2FzIGluIHdwMgorICogMi4gaW5zZXJ0IGN1cndpbiBiZWZvcmUgd3AgaW4gdGhlIGxpc3QKKyAqIGlmIHdwICE9IHdwMgorICogICAgMy4gcmVtb3ZlIHdwIGZyb20gdGhlIGxpc3QKKyAqICAgIDQuIGluc2VydCB3cCBhZnRlciB3cDIKKyAqIDUuIGV4Y2hhbmdlIHRoZSBzdGF0dXMgbGluZSBoZWlnaHQgYW5kIHZzZXAgd2lkdGguCisgKi8KKyAgICB3cDIgPSBjdXJ3aW4tPndfcHJldjsKKyAgICBmcnAyID0gY3Vyd2luLT53X2ZyYW1lLT5mcl9wcmV2OworICAgIGlmICh3cC0+d19wcmV2ICE9IGN1cndpbikKKyAgICB7CisJd2luX3JlbW92ZShjdXJ3aW4pOworCWZyYW1lX3JlbW92ZShjdXJ3aW4tPndfZnJhbWUpOworCXdpbl9hcHBlbmQod3AtPndfcHJldiwgY3Vyd2luKTsKKwlmcmFtZV9pbnNlcnQoZnJwLCBjdXJ3aW4tPndfZnJhbWUpOworICAgIH0KKyAgICBpZiAod3AgIT0gd3AyKQorICAgIHsKKwl3aW5fcmVtb3ZlKHdwKTsKKwlmcmFtZV9yZW1vdmUod3AtPndfZnJhbWUpOworCXdpbl9hcHBlbmQod3AyLCB3cCk7CisJaWYgKGZycDIgPT0gTlVMTCkKKwkgICAgZnJhbWVfaW5zZXJ0KHdwLT53X2ZyYW1lLT5mcl9wYXJlbnQtPmZyX2NoaWxkLCB3cC0+d19mcmFtZSk7CisJZWxzZQorCSAgICBmcmFtZV9hcHBlbmQoZnJwMiwgd3AtPndfZnJhbWUpOworICAgIH0KKyAgICB0ZW1wID0gY3Vyd2luLT53X3N0YXR1c19oZWlnaHQ7CisgICAgY3Vyd2luLT53X3N0YXR1c19oZWlnaHQgPSB3cC0+d19zdGF0dXNfaGVpZ2h0OworICAgIHdwLT53X3N0YXR1c19oZWlnaHQgPSB0ZW1wOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgdGVtcCA9IGN1cndpbi0+d192c2VwX3dpZHRoOworICAgIGN1cndpbi0+d192c2VwX3dpZHRoID0gd3AtPndfdnNlcF93aWR0aDsKKyAgICB3cC0+d192c2VwX3dpZHRoID0gdGVtcDsKKworICAgIC8qIElmIHRoZSB3aW5kb3dzIGFyZSBub3QgaW4gdGhlIHNhbWUgZnJhbWUsIGV4Y2hhbmdlIHRoZSBzaXplcyB0byBhdm9pZAorICAgICAqIG1lc3NpbmcgdXAgdGhlIHdpbmRvdyBsYXlvdXQuICBPdGhlcndpc2UgZml4IHRoZSBmcmFtZSBzaXplcy4gKi8KKyAgICBpZiAoY3Vyd2luLT53X2ZyYW1lLT5mcl9wYXJlbnQgIT0gd3AtPndfZnJhbWUtPmZyX3BhcmVudCkKKyAgICB7CisJdGVtcCA9IGN1cndpbi0+d19oZWlnaHQ7CisJY3Vyd2luLT53X2hlaWdodCA9IHdwLT53X2hlaWdodDsKKwl3cC0+d19oZWlnaHQgPSB0ZW1wOworCXRlbXAgPSBjdXJ3aW4tPndfd2lkdGg7CisJY3Vyd2luLT53X3dpZHRoID0gd3AtPndfd2lkdGg7CisJd3AtPndfd2lkdGggPSB0ZW1wOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWZyYW1lX2ZpeF9oZWlnaHQoY3Vyd2luKTsKKwlmcmFtZV9maXhfaGVpZ2h0KHdwKTsKKwlmcmFtZV9maXhfd2lkdGgoY3Vyd2luKTsKKwlmcmFtZV9maXhfd2lkdGgod3ApOworICAgIH0KKyNlbmRpZgorCisgICAgKHZvaWQpd2luX2NvbXBfcG9zKCk7CQkvKiByZWNvbXB1dGUgd2luZG93IHBvc2l0aW9ucyAqLworCisgICAgd2luX2VudGVyKHdwLCBUUlVFKTsKKyAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOworfQorCisvKgorICogcm90YXRlIHdpbmRvd3M6IGlmIHVwd2FyZHMgVFJVRSB0aGUgc2Vjb25kIHdpbmRvdyBiZWNvbWVzIHRoZSBmaXJzdCBvbmUKKyAqCQkgICBpZiB1cHdhcmRzIEZBTFNFIHRoZSBmaXJzdCB3aW5kb3cgYmVjb21lcyB0aGUgc2Vjb25kIG9uZQorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9yb3RhdGUodXB3YXJkcywgY291bnQpCisgICAgaW50CQl1cHdhcmRzOworICAgIGludAkJY291bnQ7Cit7CisgICAgd2luX1QJKndwMTsKKyAgICB3aW5fVAkqd3AyOworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCW47CisKKyAgICBpZiAoZmlyc3R3aW4gPT0gbGFzdHdpbikJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB7CisJYmVlcF9mbHVzaCgpOworCXJldHVybjsKKyAgICB9CisKKyNpZmRlZiBGRUFUX0dVSQorICAgIG5lZWRfbW91c2VfY29ycmVjdCA9IFRSVUU7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgLyogQ2hlY2sgaWYgYWxsIGZyYW1lcyBpbiB0aGlzIHJvdy9jb2wgaGF2ZSBvbmUgd2luZG93LiAqLworICAgIGZvciAoZnJwID0gY3Vyd2luLT53X2ZyYW1lLT5mcl9wYXJlbnQtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsKKwkJCQkJCQkgICBmcnAgPSBmcnAtPmZyX25leHQpCisJaWYgKGZycC0+ZnJfd2luID09IE5VTEwpCisJeworCSAgICBFTVNHKF8oIkU0NDM6IENhbm5vdCByb3RhdGUgd2hlbiBhbm90aGVyIHdpbmRvdyBpcyBzcGxpdCIpKTsKKwkgICAgcmV0dXJuOworCX0KKyNlbmRpZgorCisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgeworCWlmICh1cHdhcmRzKQkJLyogZmlyc3Qgd2luZG93IGJlY29tZXMgbGFzdCB3aW5kb3cgKi8KKwl7CisJICAgIC8qIHJlbW92ZSBmaXJzdCB3aW5kb3cvZnJhbWUgZnJvbSB0aGUgbGlzdCAqLworCSAgICBmcnAgPSBjdXJ3aW4tPndfZnJhbWUtPmZyX3BhcmVudC0+ZnJfY2hpbGQ7CisJICAgIHdwMSA9IGZycC0+ZnJfd2luOworCSAgICB3aW5fcmVtb3ZlKHdwMSk7CisJICAgIGZyYW1lX3JlbW92ZShmcnApOworCisJICAgIC8qIGZpbmQgbGFzdCBmcmFtZSBhbmQgYXBwZW5kIHJlbW92ZWQgd2luZG93L2ZyYW1lIGFmdGVyIGl0ICovCisJICAgIGZvciAoIDsgZnJwLT5mcl9uZXh0ICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwkJOworCSAgICB3aW5fYXBwZW5kKGZycC0+ZnJfd2luLCB3cDEpOworCSAgICBmcmFtZV9hcHBlbmQoZnJwLCB3cDEtPndfZnJhbWUpOworCisJICAgIHdwMiA9IGZycC0+ZnJfd2luOwkJLyogcHJldmlvdXNseSBsYXN0IHdpbmRvdyAqLworCX0KKwllbHNlCQkJLyogbGFzdCB3aW5kb3cgYmVjb21lcyBmaXJzdCB3aW5kb3cgKi8KKwl7CisJICAgIC8qIGZpbmQgbGFzdCB3aW5kb3cvZnJhbWUgaW4gdGhlIGxpc3QgYW5kIHJlbW92ZSBpdCAqLworCSAgICBmb3IgKGZycCA9IGN1cndpbi0+d19mcmFtZTsgZnJwLT5mcl9uZXh0ICE9IE5VTEw7CisJCQkJCQkJICAgZnJwID0gZnJwLT5mcl9uZXh0KQorCQk7CisJICAgIHdwMSA9IGZycC0+ZnJfd2luOworCSAgICB3cDIgPSB3cDEtPndfcHJldjsJCSAgICAvKiB3aWxsIGJlY29tZSBsYXN0IHdpbmRvdyAqLworCSAgICB3aW5fcmVtb3ZlKHdwMSk7CisJICAgIGZyYW1lX3JlbW92ZShmcnApOworCisJICAgIC8qIGFwcGVuZCB0aGUgcmVtb3ZlZCB3aW5kb3cvZnJhbWUgYmVmb3JlIHRoZSBmaXJzdCBpbiB0aGUgbGlzdCAqLworCSAgICB3aW5fYXBwZW5kKGZycC0+ZnJfcGFyZW50LT5mcl9jaGlsZC0+ZnJfd2luLT53X3ByZXYsIHdwMSk7CisJICAgIGZyYW1lX2luc2VydChmcnAtPmZyX3BhcmVudC0+ZnJfY2hpbGQsIGZycCk7CisJfQorCisJLyogZXhjaGFuZ2Ugc3RhdHVzIGhlaWdodCBhbmQgdnNlcCB3aWR0aCBvZiBvbGQgYW5kIG5ldyBsYXN0IHdpbmRvdyAqLworCW4gPSB3cDItPndfc3RhdHVzX2hlaWdodDsKKwl3cDItPndfc3RhdHVzX2hlaWdodCA9IHdwMS0+d19zdGF0dXNfaGVpZ2h0OworCXdwMS0+d19zdGF0dXNfaGVpZ2h0ID0gbjsKKwlmcmFtZV9maXhfaGVpZ2h0KHdwMSk7CisJZnJhbWVfZml4X2hlaWdodCh3cDIpOworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJbiA9IHdwMi0+d192c2VwX3dpZHRoOworCXdwMi0+d192c2VwX3dpZHRoID0gd3AxLT53X3ZzZXBfd2lkdGg7CisJd3AxLT53X3ZzZXBfd2lkdGggPSBuOworCWZyYW1lX2ZpeF93aWR0aCh3cDEpOworCWZyYW1lX2ZpeF93aWR0aCh3cDIpOworI2VuZGlmCisKKwkgICAgLyogcmVjb21wdXRlIHdfd2lucm93IGFuZCB3X3dpbmNvbCBmb3IgYWxsIHdpbmRvd3MgKi8KKwkodm9pZCl3aW5fY29tcF9wb3MoKTsKKyAgICB9CisKKyAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOworfQorCisvKgorICogTW92ZSB0aGUgY3VycmVudCB3aW5kb3cgdG8gdGhlIHZlcnkgdG9wL2JvdHRvbS9sZWZ0L3JpZ2h0IG9mIHRoZSBzY3JlZW4uCisgKi8KKyAgICBzdGF0aWMgdm9pZAord2luX3RvdG9wKHNpemUsIGZsYWdzKQorICAgIGludAkJc2l6ZTsKKyAgICBpbnQJCWZsYWdzOworeworICAgIGludAkJZGlyOworICAgIGludAkJaGVpZ2h0ID0gY3Vyd2luLT53X2hlaWdodDsKKworICAgIGlmIChsYXN0d2luID09IGZpcnN0d2luKQorICAgIHsKKwliZWVwX2ZsdXNoKCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFJlbW92ZSB0aGUgd2luZG93IGFuZCBmcmFtZSBmcm9tIHRoZSB0cmVlIG9mIGZyYW1lcy4gKi8KKyAgICAodm9pZCl3aW5mcmFtZV9yZW1vdmUoY3Vyd2luLCAmZGlyKTsKKyAgICB3aW5fcmVtb3ZlKGN1cndpbik7CisgICAgbGFzdF9zdGF0dXMoRkFMU0UpOwkgICAgLyogbWF5IG5lZWQgdG8gcmVtb3ZlIGxhc3Qgc3RhdHVzIGxpbmUgKi8KKyAgICAodm9pZCl3aW5fY29tcF9wb3MoKTsgICAvKiByZWNvbXB1dGUgd2luZG93IHBvc2l0aW9ucyAqLworCisgICAgLyogU3BsaXQgYSB3aW5kb3cgb24gdGhlIGRlc2lyZWQgc2lkZSBhbmQgcHV0IHRoZSB3aW5kb3cgdGhlcmUuICovCisgICAgKHZvaWQpd2luX3NwbGl0X2lucyhzaXplLCBmbGFncywgY3Vyd2luLCBkaXIpOworICAgIGlmICghKGZsYWdzICYgV1NQX1ZFUlQpKQorICAgIHsKKwl3aW5fc2V0aGVpZ2h0KGhlaWdodCk7CisJaWYgKHBfZWEpCisJICAgIHdpbl9lcXVhbChjdXJ3aW4sIFRSVUUsICd2Jyk7CisgICAgfQorCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChGRUFUX1ZFUlRTUExJVCkKKyAgICAvKiBXaGVuICdndWlvcHRpb25zJyBpbmNsdWRlcyAnTCcgb3IgJ1InIG1heSBoYXZlIHRvIHJlbW92ZSBvciBhZGQKKyAgICAgKiBzY3JvbGxiYXJzLiAgSGF2ZSB0byB1cGRhdGUgdGhlbSBhbnl3YXkuICovCisgICAgaWYgKGd1aS5pbl91c2UpCisgICAgeworCW91dF9mbHVzaCgpOworCWd1aV9pbml0X3doaWNoX2NvbXBvbmVudHMoTlVMTCk7CisJZ3VpX3VwZGF0ZV9zY3JvbGxiYXJzKFRSVUUpOworICAgIH0KKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisKK30KKworLyoKKyAqIE1vdmUgd2luZG93ICJ3aW4xIiB0byBiZWxvdy9yaWdodCBvZiAid2luMiIgYW5kIG1ha2UgIndpbjEiIHRoZSBjdXJyZW50CisgKiB3aW5kb3cuICBPbmx5IHdvcmtzIHdpdGhpbiB0aGUgc2FtZSBmcmFtZSEKKyAqLworICAgIHZvaWQKK3dpbl9tb3ZlX2FmdGVyKHdpbjEsIHdpbjIpCisgICAgd2luX1QJKndpbjEsICp3aW4yOworeworICAgIGludAkJaGVpZ2h0OworCisgICAgLyogY2hlY2sgaWYgdGhlIGFyZ3VtZW50cyBhcmUgcmVhc29uYWJsZSAqLworICAgIGlmICh3aW4xID09IHdpbjIpCisJcmV0dXJuOworCisgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvICovCisgICAgaWYgKHdpbjItPndfbmV4dCAhPSB3aW4xKQorICAgIHsKKwkvKiBtYXkgbmVlZCBtb3ZlIHRoZSBzdGF0dXMgbGluZS92ZXJ0aWNhbCBzZXBhcmF0b3Igb2YgdGhlIGxhc3Qgd2luZG93CisJICogKi8KKwlpZiAod2luMSA9PSBsYXN0d2luKQorCXsKKwkgICAgaGVpZ2h0ID0gd2luMS0+d19wcmV2LT53X3N0YXR1c19oZWlnaHQ7CisJICAgIHdpbjEtPndfcHJldi0+d19zdGF0dXNfaGVpZ2h0ID0gd2luMS0+d19zdGF0dXNfaGVpZ2h0OworCSAgICB3aW4xLT53X3N0YXR1c19oZWlnaHQgPSBoZWlnaHQ7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgd2luMS0+d19wcmV2LT53X3ZzZXBfd2lkdGggPSAwOworCSAgICB3aW4xLT53X3ZzZXBfd2lkdGggPSAxOworI2VuZGlmCisJfQorCWVsc2UgaWYgKHdpbjIgPT0gbGFzdHdpbikKKwl7CisJICAgIGhlaWdodCA9IHdpbjEtPndfc3RhdHVzX2hlaWdodDsKKwkgICAgd2luMS0+d19zdGF0dXNfaGVpZ2h0ID0gd2luMi0+d19zdGF0dXNfaGVpZ2h0OworCSAgICB3aW4yLT53X3N0YXR1c19oZWlnaHQgPSBoZWlnaHQ7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgd2luMi0+d192c2VwX3dpZHRoID0gMTsKKwkgICAgd2luMS0+d192c2VwX3dpZHRoID0gMDsKKyNlbmRpZgorCX0KKwl3aW5fcmVtb3ZlKHdpbjEpOworCWZyYW1lX3JlbW92ZSh3aW4xLT53X2ZyYW1lKTsKKwl3aW5fYXBwZW5kKHdpbjIsIHdpbjEpOworCWZyYW1lX2FwcGVuZCh3aW4yLT53X2ZyYW1lLCB3aW4xLT53X2ZyYW1lKTsKKworCSh2b2lkKXdpbl9jb21wX3BvcygpOwkvKiByZWNvbXB1dGUgd193aW5yb3cgZm9yIGFsbCB3aW5kb3dzICovCisJcmVkcmF3X2xhdGVyKE5PVF9WQUxJRCk7CisgICAgfQorICAgIHdpbl9lbnRlcih3aW4xLCBGQUxTRSk7Cit9CisKKy8qCisgKiBNYWtlIGFsbCB3aW5kb3dzIHRoZSBzYW1lIGhlaWdodC4KKyAqICduZXh0X2N1cndpbicgd2lsbCBzb29uIGJlIHRoZSBjdXJyZW50IHdpbmRvdywgbWFrZSBzdXJlIGl0IGhhcyBlbm91Z2gKKyAqIHJvd3MuCisgKi8KKyAgICB2b2lkCit3aW5fZXF1YWwobmV4dF9jdXJ3aW4sIGN1cnJlbnQsIGRpcikKKyAgICB3aW5fVAkqbmV4dF9jdXJ3aW47CS8qIHBvaW50ZXIgdG8gY3VycmVudCB3aW5kb3cgdG8gYmUgb3IgTlVMTCAqLworICAgIGludAkJY3VycmVudDsJLyogZG8gb25seSBmcmFtZSB3aXRoIGN1cnJlbnQgd2luZG93ICovCisgICAgaW50CQlkaXI7CQkvKiAndicgZm9yIHZlcnRpY2FsbHksICdoJyBmb3IgaG9yaXpvbnRhbGx5LAorCQkJCSAgICdiJyBmb3IgYm90aCwgMCBmb3IgdXNpbmcgcF9lYWQgKi8KK3sKKyAgICBpZiAoZGlyID09IDApCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlkaXIgPSAqcF9lYWQ7CisjZWxzZQorCWRpciA9ICdiJzsKKyNlbmRpZgorICAgIHdpbl9lcXVhbF9yZWMobmV4dF9jdXJ3aW4gPT0gTlVMTCA/IGN1cndpbiA6IG5leHRfY3Vyd2luLCBjdXJyZW50LAorCQkgICAgICB0b3BmcmFtZSwgZGlyLCAwLCAwLCAoaW50KUNvbHVtbnMsIHRvcGZyYW1lLT5mcl9oZWlnaHQpOworfQorCisvKgorICogU2V0IGEgZnJhbWUgdG8gYSBuZXcgcG9zaXRpb24gYW5kIGhlaWdodCwgc3ByZWFkaW5nIHRoZSBhdmFpbGFibGUgcm9vbQorICogZXF1YWxseSBvdmVyIGNvbnRhaW5lZCBmcmFtZXMuCisgKiBUaGUgd2luZG93ICJuZXh0X2N1cndpbiIgKGlmIG5vdCBOVUxMKSBzaG91bGQgYXQgbGVhc3QgZ2V0IHRoZSBzaXplIGZyb20KKyAqICd3aW5oZWlnaHQnIGFuZCAnd2lud2lkdGgnIGlmIHBvc3NpYmxlLgorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9lcXVhbF9yZWMobmV4dF9jdXJ3aW4sIGN1cnJlbnQsIHRvcGZyLCBkaXIsIGNvbCwgcm93LCB3aWR0aCwgaGVpZ2h0KQorICAgIHdpbl9UCSpuZXh0X2N1cndpbjsJLyogcG9pbnRlciB0byBjdXJyZW50IHdpbmRvdyB0byBiZSBvciBOVUxMICovCisgICAgaW50CQljdXJyZW50OwkvKiBkbyBvbmx5IGZyYW1lIHdpdGggY3VycmVudCB3aW5kb3cgKi8KKyAgICBmcmFtZV9UCSp0b3BmcjsJCS8qIGZyYW1lIHRvIHNldCBzaXplIG9mZiAqLworICAgIGludAkJZGlyOwkJLyogJ3YnLCAnaCcgb3IgJ2InLCBzZWUgd2luX2VxdWFsKCkgKi8KKyAgICBpbnQJCWNvbDsJCS8qIGhvcml6b250YWwgcG9zaXRpb24gZm9yIGZyYW1lICovCisgICAgaW50CQlyb3c7CQkvKiB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgZnJhbWUgKi8KKyAgICBpbnQJCXdpZHRoOwkJLyogbmV3IHdpZHRoIG9mIGZyYW1lICovCisgICAgaW50CQloZWlnaHQ7CQkvKiBuZXcgaGVpZ2h0IG9mIGZyYW1lICovCit7CisgICAgaW50CQluLCBtOworICAgIGludAkJZXh0cmFfc2VwID0gMDsKKyAgICBpbnQJCXdpbmNvdW50LCB0b3R3aW5jb3VudCA9IDA7CisgICAgZnJhbWVfVAkqZnI7CisgICAgaW50CQluZXh0X2N1cndpbl9zaXplID0gMDsKKyAgICBpbnQJCXJvb20gPSAwOworICAgIGludAkJbmV3X3NpemU7CisgICAgaW50CQloYXNfbmV4dF9jdXJ3aW4gPSAwOworICAgIGludAkJaG5jOworCisgICAgaWYgKHRvcGZyLT5mcl9sYXlvdXQgPT0gRlJfTEVBRikKKyAgICB7CisJLyogU2V0IHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhpcyBmcmFtZS4KKwkgKiBSZWRyYXcgd2hlbiBzaXplIG9yIHBvc2l0aW9uIGNoYW5nZXMgKi8KKwlpZiAodG9wZnItPmZyX2hlaWdodCAhPSBoZWlnaHQgfHwgdG9wZnItPmZyX3dpbi0+d193aW5yb3cgIT0gcm93CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkJfHwgdG9wZnItPmZyX3dpZHRoICE9IHdpZHRoIHx8IHRvcGZyLT5mcl93aW4tPndfd2luY29sICE9IGNvbAorI2VuZGlmCisJICAgKQorCXsKKwkgICAgdG9wZnItPmZyX3dpbi0+d193aW5yb3cgPSByb3c7CisJICAgIGZyYW1lX25ld19oZWlnaHQodG9wZnIsIGhlaWdodCwgRkFMU0UsIEZBTFNFKTsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICB0b3Bmci0+ZnJfd2luLT53X3dpbmNvbCA9IGNvbDsKKwkgICAgZnJhbWVfbmV3X3dpZHRoKHRvcGZyLCB3aWR0aCwgRkFMU0UpOworI2VuZGlmCisJICAgIHJlZHJhd19hbGxfbGF0ZXIoQ0xFQVIpOworCX0KKyAgICB9CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBlbHNlIGlmICh0b3Bmci0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKyAgICB7CisJdG9wZnItPmZyX3dpZHRoID0gd2lkdGg7CisJdG9wZnItPmZyX2hlaWdodCA9IGhlaWdodDsKKworCWlmIChkaXIgIT0gJ3YnKQkJCS8qIGVxdWFsaXplIGZyYW1lIHdpZHRocyAqLworCXsKKwkgICAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd2luZG93cyBob3Jpem9udGFsbHkgaW4gdGhpcworCSAgICAgKiBmcmFtZS4gKi8KKwkgICAgbiA9IGZyYW1lX21pbndpZHRoKHRvcGZyLCBOT1dJTik7CisJICAgIC8qIGFkZCBvbmUgZm9yIHRoZSByaWdodG1vc3Qgd2luZG93LCBpdCBkb2Vzbid0IGhhdmUgYSBzZXBhcmF0b3IgKi8KKwkgICAgaWYgKGNvbCArIHdpZHRoID09IENvbHVtbnMpCisJCWV4dHJhX3NlcCA9IDE7CisJICAgIGVsc2UKKwkJZXh0cmFfc2VwID0gMDsKKwkgICAgdG90d2luY291bnQgPSAobiArIGV4dHJhX3NlcCkgLyAocF93bXcgKyAxKTsKKworCSAgICAvKiBDb21wdXRlIHJvb20gYXZhaWxhYmxlIGZvciB3aW5kb3dzIG90aGVyIHRoYW4gIm5leHRfY3Vyd2luIiAqLworCSAgICBtID0gZnJhbWVfbWlud2lkdGgodG9wZnIsIG5leHRfY3Vyd2luKTsKKwkgICAgcm9vbSA9IHdpZHRoIC0gbTsKKwkgICAgaWYgKHJvb20gPCAwKQorCSAgICB7CisJCW5leHRfY3Vyd2luX3NpemUgPSBwX3dpdyArIHJvb207CisJCXJvb20gPSAwOworCSAgICB9CisJICAgIGVsc2UgaWYgKG4gPT0gbSkJCS8qIGRvZXNuJ3QgY29udGFpbiBjdXJ3aW4gKi8KKwkJbmV4dF9jdXJ3aW5fc2l6ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgeworCQluZXh0X2N1cndpbl9zaXplID0gKHJvb20gKyBwX3dpdyArICh0b3R3aW5jb3VudCAtIDEpICogcF93bXcKKwkJCQkJICAgKyAodG90d2luY291bnQgLSAxKSkgLyB0b3R3aW5jb3VudDsKKwkJaWYgKG5leHRfY3Vyd2luX3NpemUgID4gcF93aXcpCisJCSAgICByb29tIC09IG5leHRfY3Vyd2luX3NpemUgLSBwX3dpdzsKKwkJZWxzZQorCQkgICAgbmV4dF9jdXJ3aW5fc2l6ZSA9IHBfd2l3OworCSAgICB9CisJICAgIGlmIChuICE9IG0pCisJCS0tdG90d2luY291bnQ7CQkvKiBkb24ndCBjb3VudCBjdXJ3aW4gKi8KKwl9CisKKwlmb3IgKGZyID0gdG9wZnItPmZyX2NoaWxkOyBmciAhPSBOVUxMOyBmciA9IGZyLT5mcl9uZXh0KQorCXsKKwkgICAgbiA9IG0gPSAwOworCSAgICB3aW5jb3VudCA9IDE7CisJICAgIGlmIChmci0+ZnJfbmV4dCA9PSBOVUxMKQorCQkvKiBsYXN0IGZyYW1lIGdldHMgYWxsIHRoYXQgcmVtYWlucyAoYXZvaWQgcm91bmRvZmYgZXJyb3IpICovCisJCW5ld19zaXplID0gd2lkdGg7CisJICAgIGVsc2UgaWYgKGRpciA9PSAndicpCisJCW5ld19zaXplID0gZnItPmZyX3dpZHRoOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd2luZG93cyBob3Jpei4gaW4gImZyIi4gKi8KKwkJbiA9IGZyYW1lX21pbndpZHRoKGZyLCBOT1dJTik7CisJCXdpbmNvdW50ID0gKG4gKyAoZnItPmZyX25leHQgPT0gTlVMTCA/IGV4dHJhX3NlcCA6IDApKQorCQkJCQkJCQkvIChwX3dtdyArIDEpOworCQltID0gZnJhbWVfbWlud2lkdGgoZnIsIG5leHRfY3Vyd2luKTsKKwkJaWYgKG4gIT0gbSkJICAgIC8qIGRvbid0IGNvdW50IG5leHRfY3Vyd2luICovCisJCSAgICAtLXdpbmNvdW50OworCQluZXdfc2l6ZSA9ICh3aW5jb3VudCAqIHJvb20gKyAoKHVuc2lnbmVkKXRvdHdpbmNvdW50ID4+IDEpKQorCQkJCQkJCQkvIHRvdHdpbmNvdW50OworCQlpZiAobiAhPSBtKQkgICAgLyogYWRkIG5leHRfY3Vyd2luIHNpemUgKi8KKwkJeworCQkgICAgbmV4dF9jdXJ3aW5fc2l6ZSAtPSBwX3dpdyAtIChtIC0gbik7CisJCSAgICBuZXdfc2l6ZSArPSBuZXh0X2N1cndpbl9zaXplOworCQl9CisJICAgIH0KKworCSAgICAvKiBTa2lwIGZyYW1lIHRoYXQgaXMgZnVsbCBoZWlnaHQgd2hlbiBzcGxpdHRpbmcgb3IgY2xvc2luZyBhCisJICAgICAqIHdpbmRvdywgdW5sZXNzIGVxdWFsaXppbmcgYWxsIGZyYW1lcy4gKi8KKwkgICAgaWYgKCFjdXJyZW50IHx8IGRpciAhPSAndicgfHwgdG9wZnItPmZyX3BhcmVudCAhPSBOVUxMCisJCSAgICB8fCAobmV3X3NpemUgIT0gZnItPmZyX3dpZHRoKQorCQkgICAgfHwgZnJhbWVfaGFzX3dpbihmciwgbmV4dF9jdXJ3aW4pKQorCQl3aW5fZXF1YWxfcmVjKG5leHRfY3Vyd2luLCBjdXJyZW50LCBmciwgZGlyLCBjb2wsIHJvdywKKwkJCQkJCQluZXdfc2l6ZSArIG4sIGhlaWdodCk7CisJICAgIGNvbCArPSBuZXdfc2l6ZSArIG47CisJICAgIHdpZHRoIC09IG5ld19zaXplICsgbjsKKwkgICAgaWYgKG4gIT0gbSkJICAgIC8qIGNvbnRhaW5zIGN1cndpbiAqLworCQlyb29tIC09IG5ld19zaXplIC0gbmV4dF9jdXJ3aW5fc2l6ZTsKKwkgICAgZWxzZQorCQlyb29tIC09IG5ld19zaXplOworCSAgICB0b3R3aW5jb3VudCAtPSB3aW5jb3VudDsKKwl9CisgICAgfQorI2VuZGlmCisgICAgZWxzZSAvKiB0b3Bmci0+ZnJfbGF5b3V0ID09IEZSX0NPTCAqLworICAgIHsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCXRvcGZyLT5mcl93aWR0aCA9IHdpZHRoOworI2VuZGlmCisJdG9wZnItPmZyX2hlaWdodCA9IGhlaWdodDsKKworCWlmIChkaXIgIT0gJ2gnKQkJCS8qIGVxdWFsaXplIGZyYW1lIGhlaWdodHMgKi8KKwl7CisJICAgIC8qIENvbXB1dGUgbWF4aW11bSBudW1iZXIgb2Ygd2luZG93cyB2ZXJ0aWNhbGx5IGluIHRoaXMgZnJhbWUuICovCisJICAgIG4gPSBmcmFtZV9taW5oZWlnaHQodG9wZnIsIE5PV0lOKTsKKwkgICAgLyogYWRkIG9uZSBmb3IgdGhlIGJvdHRvbSB3aW5kb3cgaWYgaXQgZG9lc24ndCBoYXZlIGEgc3RhdHVzbGluZSAqLworCSAgICBpZiAocm93ICsgaGVpZ2h0ID09IGNtZGxpbmVfcm93ICYmIHBfbHMgPT0gMCkKKwkJZXh0cmFfc2VwID0gMTsKKwkgICAgZWxzZQorCQlleHRyYV9zZXAgPSAwOworCSAgICB0b3R3aW5jb3VudCA9IChuICsgZXh0cmFfc2VwKSAvIChwX3dtaCArIDEpOworCSAgICBoYXNfbmV4dF9jdXJ3aW4gPSBmcmFtZV9oYXNfd2luKHRvcGZyLCBuZXh0X2N1cndpbik7CisKKwkgICAgLyoKKwkgICAgICogQ29tcHV0ZSBoZWlnaHQgZm9yICJuZXh0X2N1cndpbiIgd2luZG93IGFuZCByb29tIGF2YWlsYWJsZSBmb3IKKwkgICAgICogb3RoZXIgd2luZG93cy4KKwkgICAgICogIm0iIGlzIHRoZSBtaW5pbWFsIGhlaWdodCB3aGVuIGNvdW50aW5nIHBfd2ggZm9yICJuZXh0X2N1cndpbiIuCisJICAgICAqLworCSAgICBtID0gZnJhbWVfbWluaGVpZ2h0KHRvcGZyLCBuZXh0X2N1cndpbik7CisJICAgIHJvb20gPSBoZWlnaHQgLSBtOworCSAgICBpZiAocm9vbSA8IDApCisJICAgIHsKKwkJLyogVGhlIHJvb20gaXMgbGVzcyB0aGVuICd3aW5oZWlnaHQnLCB1c2UgYWxsIHNwYWNlIGZvciB0aGUKKwkJICogY3VycmVudCB3aW5kb3cuICovCisJCW5leHRfY3Vyd2luX3NpemUgPSBwX3doICsgcm9vbTsKKwkJcm9vbSA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCW5leHRfY3Vyd2luX3NpemUgPSAtMTsKKwkJZm9yIChmciA9IHRvcGZyLT5mcl9jaGlsZDsgZnIgIT0gTlVMTDsgZnIgPSBmci0+ZnJfbmV4dCkKKwkJeworCQkgICAgLyogSWYgJ3dpbmZpeGhlaWdodCcgc2V0IGtlZXAgdGhlIHdpbmRvdyBoZWlnaHQgaWYKKwkJICAgICAqIHBvc3NpYmxlLgorCQkgICAgICogV2F0Y2ggb3V0IGZvciB0aGlzIHdpbmRvdyBiZWluZyB0aGUgbmV4dF9jdXJ3aW4uICovCisJCSAgICBpZiAoZnJhbWVfZml4ZWRfaGVpZ2h0KGZyKSkKKwkJICAgIHsKKwkJCW4gPSBmcmFtZV9taW5oZWlnaHQoZnIsIE5PV0lOKTsKKwkJCW5ld19zaXplID0gZnItPmZyX2hlaWdodDsKKwkJCWlmIChmcmFtZV9oYXNfd2luKGZyLCBuZXh0X2N1cndpbikpCisJCQl7CisJCQkgICAgcm9vbSArPSBwX3doIC0gcF93bWg7CisJCQkgICAgbmV4dF9jdXJ3aW5fc2l6ZSA9IDA7CisJCQkgICAgaWYgKG5ld19zaXplIDwgcF93aCkKKwkJCQluZXdfc2l6ZSA9IHBfd2g7CisJCQl9CisJCQllbHNlCisJCQkgICAgLyogVGhlc2Ugd2luZG93cyBkb24ndCB1c2UgdXAgcm9vbS4gKi8KKwkJCSAgICB0b3R3aW5jb3VudCAtPSAobiArIChmci0+ZnJfbmV4dCA9PSBOVUxMCisJCQkJCSAgICAgID8gZXh0cmFfc2VwIDogMCkpIC8gKHBfd21oICsgMSk7CisJCQlyb29tIC09IG5ld19zaXplIC0gbjsKKwkJCWlmIChyb29tIDwgMCkKKwkJCXsKKwkJCSAgICBuZXdfc2l6ZSArPSByb29tOworCQkJICAgIHJvb20gPSAwOworCQkJfQorCQkJZnItPmZyX25ld2hlaWdodCA9IG5ld19zaXplOworCQkgICAgfQorCQl9CisJCWlmIChuZXh0X2N1cndpbl9zaXplID09IC0xKQorCQl7CisJCSAgICBpZiAoIWhhc19uZXh0X2N1cndpbikKKwkJCW5leHRfY3Vyd2luX3NpemUgPSAwOworCQkgICAgZWxzZSBpZiAodG90d2luY291bnQgPiAxCisJCQkgICAgJiYgKHJvb20gKyAodG90d2luY291bnQgLSAyKSkKKwkJCQkJCSAgIC8gKHRvdHdpbmNvdW50IC0gMSkgPiBwX3doKQorCQkgICAgeworCQkJbmV4dF9jdXJ3aW5fc2l6ZSA9IChyb29tICsgcF93aCArIHRvdHdpbmNvdW50ICogcF93bWgKKwkJCQkJICAgKyAodG90d2luY291bnQgLSAxKSkgLyB0b3R3aW5jb3VudDsKKwkJCXJvb20gLT0gbmV4dF9jdXJ3aW5fc2l6ZSAtIHBfd2g7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQluZXh0X2N1cndpbl9zaXplID0gcF93aDsKKwkJfQorCSAgICB9CisKKwkgICAgaWYgKGhhc19uZXh0X2N1cndpbikKKwkJLS10b3R3aW5jb3VudDsJCS8qIGRvbid0IGNvdW50IGN1cndpbiAqLworCX0KKworCWZvciAoZnIgPSB0b3Bmci0+ZnJfY2hpbGQ7IGZyICE9IE5VTEw7IGZyID0gZnItPmZyX25leHQpCisJeworCSAgICBuID0gbSA9IDA7CisJICAgIHdpbmNvdW50ID0gMTsKKwkgICAgaWYgKGZyLT5mcl9uZXh0ID09IE5VTEwpCisJCS8qIGxhc3QgZnJhbWUgZ2V0cyBhbGwgdGhhdCByZW1haW5zIChhdm9pZCByb3VuZG9mZiBlcnJvcikgKi8KKwkJbmV3X3NpemUgPSBoZWlnaHQ7CisJICAgIGVsc2UgaWYgKGRpciA9PSAnaCcpCisJCW5ld19zaXplID0gZnItPmZyX2hlaWdodDsKKwkgICAgZWxzZSBpZiAoZnJhbWVfZml4ZWRfaGVpZ2h0KGZyKSkKKwkgICAgeworCQluZXdfc2l6ZSA9IGZyLT5mcl9uZXdoZWlnaHQ7CisJCXdpbmNvdW50ID0gMDsJICAgIC8qIGRvZXNuJ3QgY291bnQgYXMgYSBzaXplYWJsZSB3aW5kb3cgKi8KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd2luZG93cyB2ZXJ0LiBpbiAiZnIiLiAqLworCQluID0gZnJhbWVfbWluaGVpZ2h0KGZyLCBOT1dJTik7CisJCXdpbmNvdW50ID0gKG4gKyAoZnItPmZyX25leHQgPT0gTlVMTCA/IGV4dHJhX3NlcCA6IDApKQorCQkJCQkJCQkvIChwX3dtaCArIDEpOworCQltID0gZnJhbWVfbWluaGVpZ2h0KGZyLCBuZXh0X2N1cndpbik7CisJCWlmIChoYXNfbmV4dF9jdXJ3aW4pCisJCSAgICBobmMgPSBmcmFtZV9oYXNfd2luKGZyLCBuZXh0X2N1cndpbik7CisJCWVsc2UKKwkJICAgIGhuYyA9IEZBTFNFOworCQlpZiAoaG5jKQkgICAgLyogZG9uJ3QgY291bnQgbmV4dF9jdXJ3aW4gKi8KKwkJICAgIC0td2luY291bnQ7CisJCWlmICh0b3R3aW5jb3VudCA9PSAwKQorCQkgICAgbmV3X3NpemUgPSByb29tOworCQllbHNlCisJCSAgICBuZXdfc2l6ZSA9ICh3aW5jb3VudCAqIHJvb20gKyAoKHVuc2lnbmVkKXRvdHdpbmNvdW50ID4+IDEpKQorCQkJCQkJCQkvIHRvdHdpbmNvdW50OworCQlpZiAoaG5jKQkgICAgLyogYWRkIG5leHRfY3Vyd2luIHNpemUgKi8KKwkJeworCQkgICAgbmV4dF9jdXJ3aW5fc2l6ZSAtPSBwX3doIC0gKG0gLSBuKTsKKwkJICAgIG5ld19zaXplICs9IG5leHRfY3Vyd2luX3NpemU7CisJCSAgICByb29tIC09IG5ld19zaXplIC0gbmV4dF9jdXJ3aW5fc2l6ZTsKKwkJfQorCQllbHNlCisJCSAgICByb29tIC09IG5ld19zaXplOworCQluZXdfc2l6ZSArPSBuOworCSAgICB9CisJICAgIC8qIFNraXAgZnJhbWUgdGhhdCBpcyBmdWxsIHdpZHRoIHdoZW4gc3BsaXR0aW5nIG9yIGNsb3NpbmcgYQorCSAgICAgKiB3aW5kb3csIHVubGVzcyBlcXVhbGl6aW5nIGFsbCBmcmFtZXMuICovCisJICAgIGlmICghY3VycmVudCB8fCBkaXIgIT0gJ2gnIHx8IHRvcGZyLT5mcl9wYXJlbnQgIT0gTlVMTAorCQkgICAgfHwgKG5ld19zaXplICE9IGZyLT5mcl9oZWlnaHQpCisJCSAgICB8fCBmcmFtZV9oYXNfd2luKGZyLCBuZXh0X2N1cndpbikpCisJCXdpbl9lcXVhbF9yZWMobmV4dF9jdXJ3aW4sIGN1cnJlbnQsIGZyLCBkaXIsIGNvbCwgcm93LAorCQkJCQkJCSAgICAgd2lkdGgsIG5ld19zaXplKTsKKwkgICAgcm93ICs9IG5ld19zaXplOworCSAgICBoZWlnaHQgLT0gbmV3X3NpemU7CisJICAgIHRvdHdpbmNvdW50IC09IHdpbmNvdW50OworCX0KKyAgICB9Cit9CisKKy8qCisgKiBjbG9zZSBhbGwgd2luZG93cyBmb3IgYnVmZmVyICdidWYnCisgKi8KKyAgICB2b2lkCitjbG9zZV93aW5kb3dzKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIHdpbl9UCSp3aW47CisKKyAgICArK1JlZHJhd2luZ0Rpc2FibGVkOworICAgIGZvciAod2luID0gZmlyc3R3aW47IHdpbiAhPSBOVUxMICYmIGxhc3R3aW4gIT0gZmlyc3R3aW47ICkKKyAgICB7CisJaWYgKHdpbi0+d19idWZmZXIgPT0gYnVmKQorCXsKKwkgICAgd2luX2Nsb3NlKHdpbiwgRkFMU0UpOworCSAgICB3aW4gPSBmaXJzdHdpbjsJICAgIC8qIGdvIGJhY2sgdG8gdGhlIHN0YXJ0ICovCisJfQorCWVsc2UKKwkgICAgd2luID0gd2luLT53X25leHQ7CisgICAgfQorICAgIC0tUmVkcmF3aW5nRGlzYWJsZWQ7Cit9CisKKy8qCisgKiBjbG9zZSB3aW5kb3cgIndpbiIKKyAqIElmICJmcmVlX2J1ZiIgaXMgVFJVRSByZWxhdGVkIGJ1ZmZlciBtYXkgYmUgdW5sb2FkZWQuCisgKgorICogY2FsbGVkIGJ5IDpxdWl0LCA6Y2xvc2UsIDp4aXQsIDp3cSBhbmQgZmluZHRhZygpCisgKi8KKyAgICB2b2lkCit3aW5fY2xvc2Uod2luLCBmcmVlX2J1ZikKKyAgICB3aW5fVAkqd2luOworICAgIGludAkJZnJlZV9idWY7Cit7CisgICAgd2luX1QJKndwOworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGludAkJb3RoZXJfYnVmZmVyID0gRkFMU0U7CisjZW5kaWYKKyAgICBpbnQJCWNsb3NlX2N1cndpbiA9IEZBTFNFOworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCWRpcjsKKyAgICBpbnQJCWhlbHBfd2luZG93ID0gRkFMU0U7CisKKyAgICBpZiAobGFzdHdpbiA9PSBmaXJzdHdpbikKKyAgICB7CisJRU1TRyhfKCJFNDQ0OiBDYW5ub3QgY2xvc2UgbGFzdCB3aW5kb3ciKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFdoZW4gY2xvc2luZyB0aGUgaGVscCB3aW5kb3csIHRyeSByZXN0b3JpbmcgYSBzbmFwc2hvdCBhZnRlciBjbG9zaW5nCisgICAgICogdGhlIHdpbmRvdy4gIE90aGVyd2lzZSBjbGVhciB0aGUgc25hcHNob3QsIGl0J3Mgbm93IGludmFsaWQuICovCisgICAgaWYgKHdpbi0+d19idWZmZXItPmJfaGVscCkKKwloZWxwX3dpbmRvdyA9IFRSVUU7CisgICAgZWxzZQorCWNsZWFyX3NuYXBzaG90KCk7CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAod2luID09IGN1cndpbikKKyAgICB7CisJLyoKKwkgKiBHdWVzcyB3aGljaCB3aW5kb3cgaXMgZ29pbmcgdG8gYmUgdGhlIG5ldyBjdXJyZW50IHdpbmRvdy4KKwkgKiBUaGlzIG1heSBjaGFuZ2UgYmVjYXVzZSBvZiB0aGUgYXV0b2NvbW1hbmRzIChzaWdoKS4KKwkgKi8KKwl3cCA9IGZyYW1lMndpbih3aW5fYWx0ZnJhbWUod2luKSk7CisKKwkvKgorCSAqIEJlIGNhcmVmdWw6IElmIGF1dG9jb21tYW5kcyBkZWxldGUgdGhlIHdpbmRvdywgcmV0dXJuIG5vdy4KKwkgKi8KKwlpZiAod3AtPndfYnVmZmVyICE9IGN1cmJ1ZikKKwl7CisJICAgIG90aGVyX2J1ZmZlciA9IFRSVUU7CisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkxFQVZFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwkgICAgaWYgKCF3aW5fdmFsaWQod2luKSB8fCBmaXJzdHdpbiA9PSBsYXN0d2luKQorCQlyZXR1cm47CisJfQorCWFwcGx5X2F1dG9jbWRzKEVWRU5UX1dJTkxFQVZFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwlpZiAoIXdpbl92YWxpZCh3aW4pIHx8IGZpcnN0d2luID09IGxhc3R3aW4pCisJICAgIHJldHVybjsKKyMgaWZkZWYgRkVBVF9FVkFMCisJLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJaWYgKGFib3J0aW5nKCkpCisJICAgIHJldHVybjsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIC8qCisgICAgICogQ2xvc2UgdGhlIGxpbmsgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBjbG9zZV9idWZmZXIod2luLCB3aW4tPndfYnVmZmVyLCBmcmVlX2J1ZiA/IERPQlVGX1VOTE9BRCA6IDApOworICAgIC8qIEF1dG9jb21tYW5kcyBtYXkgaGF2ZSBjbG9zZWQgdGhlIHdpbmRvdyBhbHJlYWR5LCBvciBjbG9zZWQgdGhlIG9ubHkKKyAgICAgKiBvdGhlciB3aW5kb3cuICovCisgICAgaWYgKCF3aW5fdmFsaWQod2luKSB8fCBmaXJzdHdpbiA9PSBsYXN0d2luKQorCXJldHVybjsKKworICAgIC8qIHJlZHVjZSB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LiAqLworICAgIGFsaXN0X3VubGluayh3aW4tPndfYWxpc3QpOworCisgICAgLyogcmVtb3ZlIHRoZSB3aW5kb3cgYW5kIGl0cyBmcmFtZSBmcm9tIHRoZSB0cmVlIG9mIGZyYW1lcy4gKi8KKyAgICBmcnAgPSB3aW4tPndfZnJhbWU7CisgICAgd3AgPSB3aW5mcmFtZV9yZW1vdmUod2luLCAmZGlyKTsKKyAgICB2aW1fZnJlZShmcnApOworICAgIHdpbl9mcmVlKHdpbik7CisKKyAgICAvKiBNYWtlIHN1cmUgY3Vyd2luIGlzbid0IGludmFsaWQuICBJdCBjYW4gY2F1c2Ugc2V2ZXJlIHRyb3VibGUgd2hlbgorICAgICAqIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuICBGb3Igd2luX2VxdWFsKCkgY3VyYnVmIG5lZWRzIHRvIGJlIHZhbGlkCisgICAgICogdG9vLiAqLworICAgIGlmICh3aW4gPT0gY3Vyd2luKQorICAgIHsKKwljdXJ3aW4gPSB3cDsKKyNpZmRlZiBGRUFUX1FVSUNLRklYCisJaWYgKHdwLT53X3BfcHZ3IHx8IGJ0X3F1aWNrZml4KHdwLT53X2J1ZmZlcikpCisJeworCSAgICAvKgorCSAgICAgKiBUaGUgY3Vyc29yIGdvZXMgdG8gdGhlIHByZXZpZXcgb3IgdGhlIHF1aWNrZml4IHdpbmRvdywgdHJ5CisJICAgICAqIGZpbmRpbmcgYW5vdGhlciB3aW5kb3cgdG8gZ28gdG8uCisJICAgICAqLworCSAgICBmb3IgKDs7KQorCSAgICB7CisJCWlmICh3cC0+d19uZXh0ID09IE5VTEwpCisJCSAgICB3cCA9IGZpcnN0d2luOworCQllbHNlCisJCSAgICB3cCA9IHdwLT53X25leHQ7CisJCWlmICh3cCA9PSBjdXJ3aW4pCisJCSAgICBicmVhazsKKwkJaWYgKCF3cC0+d19wX3B2dyAmJiAhYnRfcXVpY2tmaXgod3AtPndfYnVmZmVyKSkKKwkJeworCQkgICAgY3Vyd2luID0gd3A7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisJY3VyYnVmID0gY3Vyd2luLT53X2J1ZmZlcjsKKwljbG9zZV9jdXJ3aW4gPSBUUlVFOworICAgIH0KKyAgICBpZiAocF9lYSkKKwl3aW5fZXF1YWwoY3Vyd2luLCBUUlVFLAorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCWRpcgorI2Vsc2UKKwkJMAorI2VuZGlmCisJCSk7CisgICAgZWxzZQorCXdpbl9jb21wX3BvcygpOworICAgIGlmIChjbG9zZV9jdXJ3aW4pCisgICAgeworCXdpbl9lbnRlcl9leHQod3AsIEZBTFNFLCBUUlVFKTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwlpZiAob3RoZXJfYnVmZmVyKQorCSAgICAvKiBjYXJlZnVsOiBhZnRlciB0aGlzIHdwIGFuZCB3aW4gbWF5IGJlIGludmFsaWQhICovCisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkVOVEVSLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qCisgICAgICogaWYgbGFzdCB3aW5kb3cgaGFzIGEgc3RhdHVzIGxpbmUgbm93IGFuZCB3ZSBkb24ndCB3YW50IG9uZSwKKyAgICAgKiByZW1vdmUgdGhlIHN0YXR1cyBsaW5lCisgICAgICovCisgICAgbGFzdF9zdGF0dXMoRkFMU0UpOworCisgICAgLyogQWZ0ZXIgY2xvc2luZyB0aGUgaGVscCB3aW5kb3csIHRyeSByZXN0b3JpbmcgdGhlIHdpbmRvdyBsYXlvdXQgZnJvbQorICAgICAqIGJlZm9yZSBpdCB3YXMgb3BlbmVkLiAqLworICAgIGlmIChoZWxwX3dpbmRvdykKKwlyZXN0b3JlX3NuYXBzaG90KGNsb3NlX2N1cndpbik7CisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKEZFQVRfVkVSVFNQTElUKQorICAgIC8qIFdoZW4gJ2d1aW9wdGlvbnMnIGluY2x1ZGVzICdMJyBvciAnUicgbWF5IGhhdmUgdG8gcmVtb3ZlIHNjcm9sbGJhcnMuICovCisgICAgaWYgKGd1aS5pbl91c2UgJiYgIXdpbl9oYXN2ZXJ0c3BsaXQoKSkKKwlndWlfaW5pdF93aGljaF9jb21wb25lbnRzKE5VTEwpOworI2VuZGlmCisKKyAgICByZWRyYXdfYWxsX2xhdGVyKE5PVF9WQUxJRCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSB3aW5kb3cgYW5kIGl0cyBmcmFtZSBmcm9tIHRoZSB0cmVlIG9mIGZyYW1lcy4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB3aW5kb3cgdGhhdCBnb3QgdGhlIGZyZWVkIHVwIHNwYWNlLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgd2luX1QgKgord2luZnJhbWVfcmVtb3ZlKHdpbiwgZGlycCkKKyAgICB3aW5fVAkqd2luOworICAgIGludAkJKmRpcnA7CQkvKiBzZXQgdG8gJ3YnIG9yICdoJyBmb3IgZGlyZWN0aW9uIGlmICdlYScgKi8KK3sKKyAgICBmcmFtZV9UCSpmcnAsICpmcnAyLCAqZnJwMzsKKyAgICBmcmFtZV9UCSpmcnBfY2xvc2UgPSB3aW4tPndfZnJhbWU7CisgICAgd2luX1QJKndwOworICAgIGludAkJb2xkX2hlaWdodCA9IDA7CisKKyAgICAvKgorICAgICAqIFJlbW92ZSB0aGUgd2luZG93IGZyb20gaXRzIGZyYW1lLgorICAgICAqLworICAgIGZycDIgPSB3aW5fYWx0ZnJhbWUod2luKTsKKyAgICB3cCA9IGZyYW1lMndpbihmcnAyKTsKKworICAgIC8qIFJlbW92ZSB0aGlzIGZyYW1lIGZyb20gdGhlIGxpc3Qgb2YgZnJhbWVzLiAqLworICAgIGZyYW1lX3JlbW92ZShmcnBfY2xvc2UpOworCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAoZnJwX2Nsb3NlLT5mcl9wYXJlbnQtPmZyX2xheW91dCA9PSBGUl9DT0wpCisgICAgeworI2VuZGlmCisJLyogV2hlbiAnd2luZml4aGVpZ2h0JyBpcyBzZXQsIHJlbWVtYmVyIGl0cyBvbGQgc2l6ZSBhbmQgcmVzdG9yZQorCSAqIGl0IGxhdGVyIChpdCdzIGEgc2ltcGxpc3RpYyBzb2x1dGlvbi4uLikuICBEb24ndCBkbyB0aGlzIGlmIHRoZQorCSAqIHdpbmRvdyB3aWxsIG9jY3VweSB0aGUgZnVsbCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4gKi8KKwlpZiAoZnJwMi0+ZnJfd2luICE9IE5VTEwKKwkJJiYgKGZycDItPmZyX25leHQgIT0gTlVMTCB8fCBmcnAyLT5mcl9wcmV2ICE9IE5VTEwpCisJCSYmIGZycDItPmZyX3dpbi0+d19wX3dmaCkKKwkgICAgb2xkX2hlaWdodCA9IGZycDItPmZyX3dpbi0+d19oZWlnaHQ7CisJZnJhbWVfbmV3X2hlaWdodChmcnAyLCBmcnAyLT5mcl9oZWlnaHQgKyBmcnBfY2xvc2UtPmZyX2hlaWdodCwKKwkJCSAgICBmcnAyID09IGZycF9jbG9zZS0+ZnJfbmV4dCA/IFRSVUUgOiBGQUxTRSwgRkFMU0UpOworCWlmIChvbGRfaGVpZ2h0ICE9IDApCisJICAgIHdpbl9zZXRoZWlnaHRfd2luKG9sZF9oZWlnaHQsIGZycDItPmZyX3dpbik7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkqZGlycCA9ICd2JzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlmcmFtZV9uZXdfd2lkdGgoZnJwMiwgZnJwMi0+ZnJfd2lkdGggKyBmcnBfY2xvc2UtPmZyX3dpZHRoLAorCQkJCSAgIGZycDIgPT0gZnJwX2Nsb3NlLT5mcl9uZXh0ID8gVFJVRSA6IEZBTFNFKTsKKwkqZGlycCA9ICdoJzsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIHJvd3MvY29sdW1ucyBnbyB0byBhIHdpbmRvdyBiZWxvdy9yaWdodCBpdHMgcG9zaXRpb25zIG5lZWQgdG8gYmUKKyAgICAgKiB1cGRhdGVkLiAgQ2FuIG9ubHkgYmUgZG9uZSBhZnRlciB0aGUgc2l6ZXMgaGF2ZSBiZWVuIHVwZGF0ZWQuICovCisgICAgaWYgKGZycDIgPT0gZnJwX2Nsb3NlLT5mcl9uZXh0KQorICAgIHsKKwlpbnQgcm93ID0gd2luLT53X3dpbnJvdzsKKwlpbnQgY29sID0gV19XSU5DT0wod2luKTsKKworCWZyYW1lX2NvbXBfcG9zKGZycDIsICZyb3csICZjb2wpOworICAgIH0KKworICAgIGlmIChmcnAyLT5mcl9uZXh0ID09IE5VTEwgJiYgZnJwMi0+ZnJfcHJldiA9PSBOVUxMKQorICAgIHsKKwkvKiBUaGVyZSBpcyBubyBvdGhlciBmcmFtZSBpbiB0aGlzIGxpc3QsIG1vdmUgaXRzIGluZm8gdG8gdGhlIHBhcmVudAorCSAqIGFuZCByZW1vdmUgaXQuICovCisJZnJwMi0+ZnJfcGFyZW50LT5mcl9sYXlvdXQgPSBmcnAyLT5mcl9sYXlvdXQ7CisJZnJwMi0+ZnJfcGFyZW50LT5mcl9jaGlsZCA9IGZycDItPmZyX2NoaWxkOworCWZvciAoZnJwID0gZnJwMi0+ZnJfY2hpbGQ7IGZycCAhPSBOVUxMOyBmcnAgPSBmcnAtPmZyX25leHQpCisJICAgIGZycC0+ZnJfcGFyZW50ID0gZnJwMi0+ZnJfcGFyZW50OworCWZycDItPmZyX3BhcmVudC0+ZnJfd2luID0gZnJwMi0+ZnJfd2luOworCWlmIChmcnAyLT5mcl93aW4gIT0gTlVMTCkKKwkgICAgZnJwMi0+ZnJfd2luLT53X2ZyYW1lID0gZnJwMi0+ZnJfcGFyZW50OworCWZycCA9IGZycDItPmZyX3BhcmVudDsKKwl2aW1fZnJlZShmcnAyKTsKKworCWZycDIgPSBmcnAtPmZyX3BhcmVudDsKKwlpZiAoZnJwMiAhPSBOVUxMICYmIGZycDItPmZyX2xheW91dCA9PSBmcnAtPmZyX2xheW91dCkKKwl7CisJICAgIC8qIFRoZSBmcmFtZSBhYm92ZSB0aGUgcGFyZW50IGhhcyB0aGUgc2FtZSBsYXlvdXQsIGhhdmUgdG8gbWVyZ2UKKwkgICAgICogdGhlIGZyYW1lcyBpbnRvIHRoaXMgbGlzdC4gKi8KKwkgICAgaWYgKGZycDItPmZyX2NoaWxkID09IGZycCkKKwkJZnJwMi0+ZnJfY2hpbGQgPSBmcnAtPmZyX2NoaWxkOworCSAgICBmcnAtPmZyX2NoaWxkLT5mcl9wcmV2ID0gZnJwLT5mcl9wcmV2OworCSAgICBpZiAoZnJwLT5mcl9wcmV2ICE9IE5VTEwpCisJCWZycC0+ZnJfcHJldi0+ZnJfbmV4dCA9IGZycC0+ZnJfY2hpbGQ7CisJICAgIGZvciAoZnJwMyA9IGZycC0+ZnJfY2hpbGQ7IDsgZnJwMyA9IGZycDMtPmZyX25leHQpCisJICAgIHsKKwkJZnJwMy0+ZnJfcGFyZW50ID0gZnJwMjsKKwkJaWYgKGZycDMtPmZyX25leHQgPT0gTlVMTCkKKwkJeworCQkgICAgZnJwMy0+ZnJfbmV4dCA9IGZycC0+ZnJfbmV4dDsKKwkJICAgIGlmIChmcnAtPmZyX25leHQgIT0gTlVMTCkKKwkJCWZycC0+ZnJfbmV4dC0+ZnJfcHJldiA9IGZycDM7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIHZpbV9mcmVlKGZycCk7CisJfQorICAgIH0KKworICAgIHJldHVybiB3cDsKK30KKworLyoKKyAqIEZpbmQgb3V0IHdoaWNoIGZyYW1lIGlzIGdvaW5nIHRvIGdldCB0aGUgZnJlZWQgdXAgc3BhY2Ugd2hlbiAid2luIiBpcworICogY2xvc2VkLgorICogaWYgJ3NwbGl0YmVsb3cnLydzcGxpdGxlZnQnIHRoZSBzcGFjZSBnb2VzIHRvIHRoZSB3aW5kb3cgYWJvdmUvbGVmdC4KKyAqIGlmICdub3NwbGl0YmVsb3cnLydub3NwbGl0bGVmdCcgdGhlIHNwYWNlIGdvZXMgdG8gdGhlIHdpbmRvdyBiZWxvdy9yaWdodC4KKyAqIFRoaXMgbWFrZXMgb3BlbmluZyBhIHdpbmRvdyBhbmQgY2xvc2luZyBpdCBpbW1lZGlhdGVseSBrZWVwIHRoZSBzYW1lIHdpbmRvdworICogbGF5b3V0LgorICovCisgICAgc3RhdGljIGZyYW1lX1QgKgord2luX2FsdGZyYW1lKHdpbikKKyAgICB3aW5fVAkqd2luOworeworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCWI7CisKKyAgICBmcnAgPSB3aW4tPndfZnJhbWU7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAoZnJwLT5mcl9wYXJlbnQtPmZyX2xheW91dCA9PSBGUl9ST1cpCisJYiA9IHBfc3ByOworICAgIGVsc2UKKyNlbmRpZgorCWIgPSBwX3NiOworICAgIGlmICgoIWIgJiYgZnJwLT5mcl9uZXh0ICE9IE5VTEwpIHx8IGZycC0+ZnJfcHJldiA9PSBOVUxMKQorCXJldHVybiBmcnAtPmZyX25leHQ7CisgICAgcmV0dXJuIGZycC0+ZnJfcHJldjsKK30KKworLyoKKyAqIEZpbmQgdGhlIGxlZnQtdXBwZXIgd2luZG93IGluIGZyYW1lICJmcnAiLgorICovCisgICAgc3RhdGljIHdpbl9UICoKK2ZyYW1lMndpbihmcnApCisgICAgZnJhbWVfVAkqZnJwOworeworICAgIHdoaWxlIChmcnAtPmZyX3dpbiA9PSBOVUxMKQorCWZycCA9IGZycC0+ZnJfY2hpbGQ7CisgICAgcmV0dXJuIGZycC0+ZnJfd2luOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgZnJhbWUgImZycCIgY29udGFpbnMgd2luZG93ICJ3cCIuCisgKi8KKyAgICBzdGF0aWMgaW50CitmcmFtZV9oYXNfd2luKGZycCwgd3ApCisgICAgZnJhbWVfVAkqZnJwOworICAgIHdpbl9UCSp3cDsKK3sKKyAgICBmcmFtZV9UCSpwOworCisgICAgaWYgKGZycC0+ZnJfbGF5b3V0ID09IEZSX0xFQUYpCisJcmV0dXJuIGZycC0+ZnJfd2luID09IHdwOworCisgICAgZm9yIChwID0gZnJwLT5mcl9jaGlsZDsgcCAhPSBOVUxMOyBwID0gcC0+ZnJfbmV4dCkKKwlpZiAoZnJhbWVfaGFzX3dpbihwLCB3cCkpCisJICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFNldCBhIG5ldyBoZWlnaHQgZm9yIGEgZnJhbWUuICBSZWN1cnNpdmVseSBzZXRzIHRoZSBoZWlnaHQgZm9yIGNvbnRhaW5lZAorICogZnJhbWVzIGFuZCB3aW5kb3dzLiAgQ2FsbGVyIG11c3QgdGFrZSBjYXJlIG9mIHBvc2l0aW9ucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9uZXdfaGVpZ2h0KHRvcGZycCwgaGVpZ2h0LCB0b3BmaXJzdCwgd2ZoKQorICAgIGZyYW1lX1QJKnRvcGZycDsKKyAgICBpbnQJCWhlaWdodDsKKyAgICBpbnQJCXRvcGZpcnN0OwkvKiByZXNpemUgdG9wbW9zdCBjb250YWluZWQgZnJhbWUgZmlyc3QgKi8KKyAgICBpbnQJCXdmaDsJCS8qIG9iZXkgJ3dpbmZpeGhlaWdodCcgd2hlbiB0aGVyZSBpcyBhIGNob2ljZTsKKwkJCQkgICBtYXkgY2F1c2UgdGhlIGhlaWdodCBub3QgdG8gYmUgc2V0ICovCit7CisgICAgZnJhbWVfVAkqZnJwOworICAgIGludAkJZXh0cmFfbGluZXM7CisgICAgaW50CQloOworCisgICAgaWYgKHRvcGZycC0+ZnJfd2luICE9IE5VTEwpCisgICAgeworCS8qIFNpbXBsZSBjYXNlOiBqdXN0IG9uZSB3aW5kb3cuICovCisJd2luX25ld19oZWlnaHQodG9wZnJwLT5mcl93aW4sCisJCQkJICAgIGhlaWdodCAtIHRvcGZycC0+ZnJfd2luLT53X3N0YXR1c19oZWlnaHQpOworICAgIH0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGVsc2UgaWYgKHRvcGZycC0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKyAgICB7CisJZG8KKwl7CisJICAgIC8qIEFsbCBmcmFtZXMgaW4gdGhpcyByb3cgZ2V0IHRoZSBzYW1lIG5ldyBoZWlnaHQuICovCisJICAgIGZvciAoZnJwID0gdG9wZnJwLT5mcl9jaGlsZDsgZnJwICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwkgICAgeworCQlmcmFtZV9uZXdfaGVpZ2h0KGZycCwgaGVpZ2h0LCB0b3BmaXJzdCwgd2ZoKTsKKwkJaWYgKGZycC0+ZnJfaGVpZ2h0ID4gaGVpZ2h0KQorCQl7CisJCSAgICAvKiBDb3VsZCBub3QgZml0IHRoZSB3aW5kb3dzLCBtYWtlIHRoZSB3aG9sZSByb3cgaGlnaGVyLiAqLworCQkgICAgaGVpZ2h0ID0gZnJwLT5mcl9oZWlnaHQ7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCXdoaWxlIChmcnAgIT0gTlVMTCk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKwkvKiBDb21wbGljYXRlZCBjYXNlOiBSZXNpemUgYSBjb2x1bW4gb2YgZnJhbWVzLiAgUmVzaXplIHRoZSBib3R0b20KKwkgKiBmcmFtZSBmaXJzdCwgZnJhbWVzIGFib3ZlIHRoYXQgd2hlbiBuZWVkZWQuICovCisKKwlmcnAgPSB0b3BmcnAtPmZyX2NoaWxkOworCWlmICh3ZmgpCisJICAgIC8qIEFkdmFuY2UgcGFzdCBmcmFtZXMgd2l0aCBvbmUgd2luZG93IHdpdGggJ3dmaCcgc2V0LiAqLworCSAgICB3aGlsZSAoZnJhbWVfZml4ZWRfaGVpZ2h0KGZycCkpCisJICAgIHsKKwkJZnJwID0gZnJwLT5mcl9uZXh0OworCQlpZiAoZnJwID09IE5VTEwpCisJCSAgICByZXR1cm47CSAgICAvKiBubyBmcmFtZSB3aXRob3V0ICd3ZmgnLCBnaXZlIHVwICovCisJICAgIH0KKwlpZiAoIXRvcGZpcnN0KQorCXsKKwkgICAgLyogRmluZCB0aGUgYm90dG9tIGZyYW1lIG9mIHRoaXMgY29sdW1uICovCisJICAgIHdoaWxlIChmcnAtPmZyX25leHQgIT0gTlVMTCkKKwkJZnJwID0gZnJwLT5mcl9uZXh0OworCSAgICBpZiAod2ZoKQorCQkvKiBBZHZhbmNlIGJhY2sgZm9yIGZyYW1lcyB3aXRoIG9uZSB3aW5kb3cgd2l0aCAnd2ZoJyBzZXQuICovCisJCXdoaWxlIChmcmFtZV9maXhlZF9oZWlnaHQoZnJwKSkKKwkJICAgIGZycCA9IGZycC0+ZnJfcHJldjsKKwl9CisKKwlleHRyYV9saW5lcyA9IGhlaWdodCAtIHRvcGZycC0+ZnJfaGVpZ2h0OworCWlmIChleHRyYV9saW5lcyA8IDApCisJeworCSAgICAvKiByZWR1Y2UgaGVpZ2h0IG9mIGNvbnRhaW5lZCBmcmFtZXMsIGJvdHRvbSBvciB0b3AgZnJhbWUgZmlyc3QgKi8KKwkgICAgd2hpbGUgKGZycCAhPSBOVUxMKQorCSAgICB7CisJCWggPSBmcmFtZV9taW5oZWlnaHQoZnJwLCBOVUxMKTsKKwkJaWYgKGZycC0+ZnJfaGVpZ2h0ICsgZXh0cmFfbGluZXMgPCBoKQorCQl7CisJCSAgICBleHRyYV9saW5lcyArPSBmcnAtPmZyX2hlaWdodCAtIGg7CisJCSAgICBmcmFtZV9uZXdfaGVpZ2h0KGZycCwgaCwgdG9wZmlyc3QsIHdmaCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBmcmFtZV9uZXdfaGVpZ2h0KGZycCwgZnJwLT5mcl9oZWlnaHQgKyBleHRyYV9saW5lcywKKwkJCQkJCQkgICAgICAgdG9wZmlyc3QsIHdmaCk7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAodG9wZmlyc3QpCisJCXsKKwkJICAgIGRvCisJCQlmcnAgPSBmcnAtPmZyX25leHQ7CisJCSAgICB3aGlsZSAod2ZoICYmIGZycCAhPSBOVUxMICYmIGZyYW1lX2ZpeGVkX2hlaWdodChmcnApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGRvCisJCQlmcnAgPSBmcnAtPmZyX3ByZXY7CisJCSAgICB3aGlsZSAod2ZoICYmIGZycCAhPSBOVUxMICYmIGZyYW1lX2ZpeGVkX2hlaWdodChmcnApKTsKKwkJfQorCQkvKiBJbmNyZWFzZSAiaGVpZ2h0IiBpZiB3ZSBjb3VsZCBub3QgcmVkdWNlIGVub3VnaCBmcmFtZXMuICovCisJCWlmIChmcnAgPT0gTlVMTCkKKwkJICAgIGhlaWdodCAtPSBleHRyYV9saW5lczsKKwkgICAgfQorCX0KKwllbHNlIGlmIChleHRyYV9saW5lcyA+IDApCisJeworCSAgICAvKiBpbmNyZWFzZSBoZWlnaHQgb2YgYm90dG9tIG9yIHRvcCBmcmFtZSAqLworCSAgICBmcmFtZV9uZXdfaGVpZ2h0KGZycCwgZnJwLT5mcl9oZWlnaHQgKyBleHRyYV9saW5lcywgdG9wZmlyc3QsIHdmaCk7CisJfQorICAgIH0KKyAgICB0b3BmcnAtPmZyX2hlaWdodCA9IGhlaWdodDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGhlaWdodCBvZiBmcmFtZSAiZnJwIiBzaG91bGQgbm90IGJlIGNoYW5nZWQgYmVjYXVzZSBvZgorICogdGhlICd3aW5maXhoZWlnaHQnIG9wdGlvbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2ZyYW1lX2ZpeGVkX2hlaWdodChmcnApCisgICAgZnJhbWVfVAkqZnJwOworeworICAgIC8qIGZyYW1lIHdpdGggb25lIHdpbmRvdzogZml4ZWQgaGVpZ2h0IGlmICd3aW5maXhoZWlnaHQnIHNldC4gKi8KKyAgICBpZiAoZnJwLT5mcl93aW4gIT0gTlVMTCkKKwlyZXR1cm4gZnJwLT5mcl93aW4tPndfcF93Zmg7CisKKyAgICBpZiAoZnJwLT5mcl9sYXlvdXQgPT0gRlJfUk9XKQorICAgIHsKKwkvKiBUaGUgZnJhbWUgaXMgZml4ZWQgaGVpZ2h0IGlmIG9uZSBvZiB0aGUgZnJhbWVzIGluIHRoZSByb3cgaXMgZml4ZWQKKwkgKiBoZWlnaHQuICovCisJZm9yIChmcnAgPSBmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCSAgICBpZiAoZnJhbWVfZml4ZWRfaGVpZ2h0KGZycCkpCisJCXJldHVybiBUUlVFOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBmcnAtPmZyX2xheW91dCA9PSBGUl9DT0w6IFRoZSBmcmFtZSBpcyBmaXhlZCBoZWlnaHQgaWYgYWxsIG9mIHRoZQorICAgICAqIGZyYW1lcyBpbiB0aGUgcm93IGFyZSBmaXhlZCBoZWlnaHQuICovCisgICAgZm9yIChmcnAgPSBmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCWlmICghZnJhbWVfZml4ZWRfaGVpZ2h0KGZycCkpCisJICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKgorICogQWRkIGEgc3RhdHVzIGxpbmUgdG8gd2luZG93cyBhdCB0aGUgYm90dG9tIG9mICJmcnAiLgorICogTm90ZTogRG9lcyBub3QgY2hlY2sgaWYgdGhlcmUgaXMgcm9vbSEKKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9hZGRfc3RhdHVzbGluZShmcnApCisgICAgZnJhbWVfVAkqZnJwOworeworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChmcnAtPmZyX2xheW91dCA9PSBGUl9MRUFGKQorICAgIHsKKwl3cCA9IGZycC0+ZnJfd2luOworCWlmICh3cC0+d19zdGF0dXNfaGVpZ2h0ID09IDApCisJeworCSAgICBpZiAod3AtPndfaGVpZ2h0ID4gMCkJLyogZG9uJ3QgbWFrZSBpdCBuZWdhdGl2ZSAqLworCQktLXdwLT53X2hlaWdodDsKKwkgICAgd3AtPndfc3RhdHVzX2hlaWdodCA9IFNUQVRVU19IRUlHSFQ7CisJfQorICAgIH0KKyAgICBlbHNlIGlmIChmcnAtPmZyX2xheW91dCA9PSBGUl9ST1cpCisgICAgeworCS8qIEhhbmRsZSBhbGwgdGhlIGZyYW1lcyBpbiB0aGUgcm93LiAqLworCWZvciAoZnJwID0gZnJwLT5mcl9jaGlsZDsgZnJwICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwkgICAgZnJhbWVfYWRkX3N0YXR1c2xpbmUoZnJwKTsKKyAgICB9CisgICAgZWxzZSAvKiBmcnAtPmZyX2xheW91dCA9PSBGUl9DT0wgKi8KKyAgICB7CisJLyogT25seSBuZWVkIHRvIGhhbmRsZSB0aGUgbGFzdCBmcmFtZSBpbiB0aGUgY29sdW1uLiAqLworCWZvciAoZnJwID0gZnJwLT5mcl9jaGlsZDsgZnJwLT5mcl9uZXh0ICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwkgICAgOworCWZyYW1lX2FkZF9zdGF0dXNsaW5lKGZycCk7CisgICAgfQorfQorCisvKgorICogU2V0IHdpZHRoIG9mIGEgZnJhbWUuICBIYW5kbGVzIHJlY3Vyc2l2ZWx5IGdvaW5nIHRocm91Z2ggY29udGFpbmVkIGZyYW1lcy4KKyAqIE1heSByZW1vdmUgc2VwYXJhdG9yIGxpbmUgZm9yIHdpbmRvd3MgYXQgdGhlIHJpZ2h0IHNpZGUgKGZvciB3aW5fY2xvc2UoKSkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJhbWVfbmV3X3dpZHRoKHRvcGZycCwgd2lkdGgsIGxlZnRmaXJzdCkKKyAgICBmcmFtZV9UCSp0b3BmcnA7CisgICAgaW50CQl3aWR0aDsKKyAgICBpbnQJCWxlZnRmaXJzdDsJLyogcmVzaXplIGxlZnRtb3N0IGNvbnRhaW5lZCBmcmFtZSBmaXJzdCAqLworeworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCWV4dHJhX2NvbHM7CisgICAgaW50CQl3OworICAgIHdpbl9UCSp3cDsKKworICAgIGlmICh0b3BmcnAtPmZyX2xheW91dCA9PSBGUl9MRUFGKQorICAgIHsKKwkvKiBTaW1wbGUgY2FzZToganVzdCBvbmUgd2luZG93LiAqLworCXdwID0gdG9wZnJwLT5mcl93aW47CisJLyogRmluZCBvdXQgaWYgdGhlcmUgYXJlIGFueSB3aW5kb3dzIHJpZ2h0IG9mIHRoaXMgb25lLiAqLworCWZvciAoZnJwID0gdG9wZnJwOyBmcnAtPmZyX3BhcmVudCAhPSBOVUxMOyBmcnAgPSBmcnAtPmZyX3BhcmVudCkKKwkgICAgaWYgKGZycC0+ZnJfcGFyZW50LT5mcl9sYXlvdXQgPT0gRlJfUk9XICYmIGZycC0+ZnJfbmV4dCAhPSBOVUxMKQorCQlicmVhazsKKwlpZiAoZnJwLT5mcl9wYXJlbnQgPT0gTlVMTCkKKwkgICAgd3AtPndfdnNlcF93aWR0aCA9IDA7CisJd2luX25ld193aWR0aCh3cCwgd2lkdGggLSB3cC0+d192c2VwX3dpZHRoKTsKKyAgICB9CisgICAgZWxzZSBpZiAodG9wZnJwLT5mcl9sYXlvdXQgPT0gRlJfQ09MKQorICAgIHsKKwkvKiBBbGwgZnJhbWVzIGluIHRoaXMgY29sdW1uIGdldCB0aGUgc2FtZSBuZXcgd2lkdGguICovCisJZm9yIChmcnAgPSB0b3BmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCSAgICBmcmFtZV9uZXdfd2lkdGgoZnJwLCB3aWR0aCwgbGVmdGZpcnN0KTsKKyAgICB9CisgICAgZWxzZSAgICAvKiBmcl9sYXlvdXQgPT0gRlJfUk9XICovCisgICAgeworCS8qIENvbXBsaWNhdGVkIGNhc2U6IFJlc2l6ZSBhIHJvdyBvZiBmcmFtZXMuICBSZXNpemUgdGhlIHJpZ2h0bW9zdAorCSAqIGZyYW1lIGZpcnN0LCBmcmFtZXMgbGVmdCBvZiBpdCB3aGVuIG5lZWRlZC4gKi8KKworCS8qIEZpbmQgdGhlIHJpZ2h0bW9zdCBmcmFtZSBvZiB0aGlzIHJvdyAqLworCWZycCA9IHRvcGZycC0+ZnJfY2hpbGQ7CisJaWYgKCFsZWZ0Zmlyc3QpCisJICAgIHdoaWxlIChmcnAtPmZyX25leHQgIT0gTlVMTCkKKwkJZnJwID0gZnJwLT5mcl9uZXh0OworCisJZXh0cmFfY29scyA9IHdpZHRoIC0gdG9wZnJwLT5mcl93aWR0aDsKKwlpZiAoZXh0cmFfY29scyA8IDApCisJeworCSAgICAvKiByZWR1Y2UgZnJhbWUgd2lkdGgsIHJpZ2h0bW9zdCBmcmFtZSBmaXJzdCAqLworCSAgICB3aGlsZSAoZnJwICE9IE5VTEwpCisJICAgIHsKKwkJdyA9IGZyYW1lX21pbndpZHRoKGZycCwgTlVMTCk7CisJCWlmIChmcnAtPmZyX3dpZHRoICsgZXh0cmFfY29scyA8IHcpCisJCXsKKwkJICAgIGV4dHJhX2NvbHMgKz0gZnJwLT5mcl93aWR0aCAtIHc7CisJCSAgICBmcmFtZV9uZXdfd2lkdGgoZnJwLCB3LCBsZWZ0Zmlyc3QpOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgZnJhbWVfbmV3X3dpZHRoKGZycCwgZnJwLT5mcl93aWR0aCArIGV4dHJhX2NvbHMsIGxlZnRmaXJzdCk7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAobGVmdGZpcnN0KQorCQkgICAgZnJwID0gZnJwLT5mcl9uZXh0OworCQllbHNlCisJCSAgICBmcnAgPSBmcnAtPmZyX3ByZXY7CisJICAgIH0KKwl9CisJZWxzZSBpZiAoZXh0cmFfY29scyA+IDApCisJeworCSAgICAvKiBpbmNyZWFzZSB3aWR0aCBvZiByaWdodG1vc3QgZnJhbWUgKi8KKwkgICAgZnJhbWVfbmV3X3dpZHRoKGZycCwgZnJwLT5mcl93aWR0aCArIGV4dHJhX2NvbHMsIGxlZnRmaXJzdCk7CisJfQorICAgIH0KKyAgICB0b3BmcnAtPmZyX3dpZHRoID0gd2lkdGg7Cit9CisKKy8qCisgKiBBZGQgdGhlIHZlcnRpY2FsIHNlcGFyYXRvciB0byB3aW5kb3dzIGF0IHRoZSByaWdodCBzaWRlIG9mICJmcnAiLgorICogTm90ZTogRG9lcyBub3QgY2hlY2sgaWYgdGhlcmUgaXMgcm9vbSEKKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9hZGRfdnNlcChmcnApCisgICAgZnJhbWVfVAkqZnJwOworeworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChmcnAtPmZyX2xheW91dCA9PSBGUl9MRUFGKQorICAgIHsKKwl3cCA9IGZycC0+ZnJfd2luOworCWlmICh3cC0+d192c2VwX3dpZHRoID09IDApCisJeworCSAgICBpZiAod3AtPndfd2lkdGggPiAwKQkvKiBkb24ndCBtYWtlIGl0IG5lZ2F0aXZlICovCisJCS0td3AtPndfd2lkdGg7CisJICAgIHdwLT53X3ZzZXBfd2lkdGggPSAxOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAoZnJwLT5mcl9sYXlvdXQgPT0gRlJfQ09MKQorICAgIHsKKwkvKiBIYW5kbGUgYWxsIHRoZSBmcmFtZXMgaW4gdGhlIGNvbHVtbi4gKi8KKwlmb3IgKGZycCA9IGZycC0+ZnJfY2hpbGQ7IGZycCAhPSBOVUxMOyBmcnAgPSBmcnAtPmZyX25leHQpCisJICAgIGZyYW1lX2FkZF92c2VwKGZycCk7CisgICAgfQorICAgIGVsc2UgLyogZnJwLT5mcl9sYXlvdXQgPT0gRlJfUk9XICovCisgICAgeworCS8qIE9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGxhc3QgZnJhbWUgaW4gdGhlIHJvdy4gKi8KKwlmcnAgPSBmcnAtPmZyX2NoaWxkOworCXdoaWxlIChmcnAtPmZyX25leHQgIT0gTlVMTCkKKwkgICAgZnJwID0gZnJwLT5mcl9uZXh0OworCWZyYW1lX2FkZF92c2VwKGZycCk7CisgICAgfQorfQorCisvKgorICogU2V0IGZyYW1lIHdpZHRoIGZyb20gdGhlIHdpbmRvdyBpdCBjb250YWlucy4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9maXhfd2lkdGgod3ApCisgICAgd2luX1QJKndwOworeworICAgIHdwLT53X2ZyYW1lLT5mcl93aWR0aCA9IHdwLT53X3dpZHRoICsgd3AtPndfdnNlcF93aWR0aDsKK30KKyNlbmRpZgorCisvKgorICogU2V0IGZyYW1lIGhlaWdodCBmcm9tIHRoZSB3aW5kb3cgaXQgY29udGFpbnMuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJhbWVfZml4X2hlaWdodCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgd3AtPndfZnJhbWUtPmZyX2hlaWdodCA9IHdwLT53X2hlaWdodCArIHdwLT53X3N0YXR1c19oZWlnaHQ7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBtaW5pbWFsIGhlaWdodCBmb3IgZnJhbWUgInRvcGZycCIuCisgKiBVc2VzIHRoZSAnd2lubWluaGVpZ2h0JyBvcHRpb24uCisgKiBXaGVuICJuZXh0X2N1cndpbiIgaXNuJ3QgTlVMTCwgdXNlIHBfd2ggZm9yIHRoaXMgd2luZG93LgorICogV2hlbiAibmV4dF9jdXJ3aW4iIGlzIE5PV0lOLCBkb24ndCB1c2UgYXQgbGVhc3Qgb25lIGxpbmUgZm9yIHRoZSBjdXJyZW50CisgKiB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgaW50CitmcmFtZV9taW5oZWlnaHQodG9wZnJwLCBuZXh0X2N1cndpbikKKyAgICBmcmFtZV9UCSp0b3BmcnA7CisgICAgd2luX1QJKm5leHRfY3Vyd2luOworeworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCW07CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpbnQJCW47CisjZW5kaWYKKworICAgIGlmICh0b3BmcnAtPmZyX3dpbiAhPSBOVUxMKQorICAgIHsKKwlpZiAodG9wZnJwLT5mcl93aW4gPT0gbmV4dF9jdXJ3aW4pCisJICAgIG0gPSBwX3doICsgdG9wZnJwLT5mcl93aW4tPndfc3RhdHVzX2hlaWdodDsKKwllbHNlCisJeworCSAgICAvKiB3aW5kb3c6IG1pbmltYWwgaGVpZ2h0IG9mIHRoZSB3aW5kb3cgcGx1cyBzdGF0dXMgbGluZSAqLworCSAgICBtID0gcF93bWggKyB0b3BmcnAtPmZyX3dpbi0+d19zdGF0dXNfaGVpZ2h0OworCSAgICAvKiBDdXJyZW50IHdpbmRvdyBpcyBtaW5pbWFsIG9uZSBsaW5lIGhpZ2ggKi8KKwkgICAgaWYgKHBfd21oID09IDAgJiYgdG9wZnJwLT5mcl93aW4gPT0gY3Vyd2luICYmIG5leHRfY3Vyd2luID09IE5VTEwpCisJCSsrbTsKKwl9CisgICAgfQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgZWxzZSBpZiAodG9wZnJwLT5mcl9sYXlvdXQgPT0gRlJfUk9XKQorICAgIHsKKwkvKiBnZXQgdGhlIG1pbmltYWwgaGVpZ2h0IGZyb20gZWFjaCBmcmFtZSBpbiB0aGlzIHJvdyAqLworCW0gPSAwOworCWZvciAoZnJwID0gdG9wZnJwLT5mcl9jaGlsZDsgZnJwICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwl7CisJICAgIG4gPSBmcmFtZV9taW5oZWlnaHQoZnJwLCBuZXh0X2N1cndpbik7CisJICAgIGlmIChuID4gbSkKKwkJbSA9IG47CisJfQorICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisJLyogQWRkIHVwIHRoZSBtaW5pbWFsIGhlaWdodHMgZm9yIGFsbCBmcmFtZXMgaW4gdGhpcyBjb2x1bW4uICovCisJbSA9IDA7CisJZm9yIChmcnAgPSB0b3BmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCSAgICBtICs9IGZyYW1lX21pbmhlaWdodChmcnAsIG5leHRfY3Vyd2luKTsKKyAgICB9CisKKyAgICByZXR1cm4gbTsKK30KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKgorICogQ29tcHV0ZSB0aGUgbWluaW1hbCB3aWR0aCBmb3IgZnJhbWUgInRvcGZycCIuCisgKiBXaGVuICJuZXh0X2N1cndpbiIgaXNuJ3QgTlVMTCwgdXNlIHBfd2l3IGZvciB0aGlzIHdpbmRvdy4KKyAqIFdoZW4gIm5leHRfY3Vyd2luIiBpcyBOT1dJTiwgZG9uJ3QgdXNlIGF0IGxlYXN0IG9uZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50CisgKiB3aW5kb3cuCisgKi8KKyAgICBzdGF0aWMgaW50CitmcmFtZV9taW53aWR0aCh0b3BmcnAsIG5leHRfY3Vyd2luKQorICAgIGZyYW1lX1QJKnRvcGZycDsKKyAgICB3aW5fVAkqbmV4dF9jdXJ3aW47CS8qIHVzZSBwX3doIGFuZCBwX3dpdyBmb3IgbmV4dF9jdXJ3aW4gKi8KK3sKKyAgICBmcmFtZV9UCSpmcnA7CisgICAgaW50CQltLCBuOworCisgICAgaWYgKHRvcGZycC0+ZnJfd2luICE9IE5VTEwpCisgICAgeworCWlmICh0b3BmcnAtPmZyX3dpbiA9PSBuZXh0X2N1cndpbikKKwkgICAgbSA9IHBfd2l3ICsgdG9wZnJwLT5mcl93aW4tPndfdnNlcF93aWR0aDsKKwllbHNlCisJeworCSAgICAvKiB3aW5kb3c6IG1pbmltYWwgd2lkdGggb2YgdGhlIHdpbmRvdyBwbHVzIHNlcGFyYXRvciBjb2x1bW4gKi8KKwkgICAgbSA9IHBfd213ICsgdG9wZnJwLT5mcl93aW4tPndfdnNlcF93aWR0aDsKKwkgICAgLyogQ3VycmVudCB3aW5kb3cgaXMgbWluaW1hbCBvbmUgY29sdW1uIHdpZGUgKi8KKwkgICAgaWYgKHBfd213ID09IDAgJiYgdG9wZnJwLT5mcl93aW4gPT0gY3Vyd2luICYmIG5leHRfY3Vyd2luID09IE5VTEwpCisJCSsrbTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYgKHRvcGZycC0+ZnJfbGF5b3V0ID09IEZSX0NPTCkKKyAgICB7CisJLyogZ2V0IHRoZSBtaW5pbWFsIHdpZHRoIGZyb20gZWFjaCBmcmFtZSBpbiB0aGlzIGNvbHVtbiAqLworCW0gPSAwOworCWZvciAoZnJwID0gdG9wZnJwLT5mcl9jaGlsZDsgZnJwICE9IE5VTEw7IGZycCA9IGZycC0+ZnJfbmV4dCkKKwl7CisJICAgIG4gPSBmcmFtZV9taW53aWR0aChmcnAsIG5leHRfY3Vyd2luKTsKKwkgICAgaWYgKG4gPiBtKQorCQltID0gbjsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyogQWRkIHVwIHRoZSBtaW5pbWFsIHdpZHRocyBmb3IgYWxsIGZyYW1lcyBpbiB0aGlzIHJvdy4gKi8KKwltID0gMDsKKwlmb3IgKGZycCA9IHRvcGZycC0+ZnJfY2hpbGQ7IGZycCAhPSBOVUxMOyBmcnAgPSBmcnAtPmZyX25leHQpCisJICAgIG0gKz0gZnJhbWVfbWlud2lkdGgoZnJwLCBuZXh0X2N1cndpbik7CisgICAgfQorCisgICAgcmV0dXJuIG07Cit9CisjZW5kaWYKKworCisvKgorICogVHJ5IHRvIGNsb3NlIGFsbCB3aW5kb3dzIGV4Y2VwdCBjdXJyZW50IG9uZS4KKyAqIEJ1ZmZlcnMgaW4gdGhlIG90aGVyIHdpbmRvd3MgYmVjb21lIGhpZGRlbiBpZiAnaGlkZGVuJyBpcyBzZXQsIG9yICchJyBpcworICogdXNlZCBhbmQgdGhlIGJ1ZmZlciB3YXMgbW9kaWZpZWQuCisgKgorICogVXNlZCBieSAiOmJkZWwiIGFuZCAiOm9ubHkiLgorICovCisgICAgdm9pZAorY2xvc2Vfb3RoZXJzKG1lc3NhZ2UsIGZvcmNlaXQpCisgICAgaW50CQltZXNzYWdlOworICAgIGludAkJZm9yY2VpdDsJICAgIC8qIGFsd2F5cyBoaWRlIGFsbCBvdGhlciB3aW5kb3dzICovCit7CisgICAgd2luX1QJKndwOworICAgIHdpbl9UCSpuZXh0d3A7CisgICAgaW50CQlyOworCisgICAgaWYgKGxhc3R3aW4gPT0gZmlyc3R3aW4pCisgICAgeworCWlmIChtZXNzYWdlCisjaWZkZWYgRkVBVF9BVVRPQ01ECisJCSAgICAmJiAhYXV0b2NtZF9idXN5CisjZW5kaWYKKwkJCQkgICAgKQorCSAgICBNU0coXygiQWxyZWFkeSBvbmx5IG9uZSB3aW5kb3ciKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEJlIHZlcnkgY2FyZWZ1bCBoZXJlOiBhdXRvY29tbWFuZHMgbWF5IGNoYW5nZSB0aGUgd2luZG93IGxheW91dC4gKi8KKyAgICBmb3IgKHdwID0gZmlyc3R3aW47IHdpbl92YWxpZCh3cCk7IHdwID0gbmV4dHdwKQorICAgIHsKKwluZXh0d3AgPSB3cC0+d19uZXh0OworCWlmICh3cCAhPSBjdXJ3aW4pCQkvKiBkb24ndCBjbG9zZSBjdXJyZW50IHdpbmRvdyAqLworCXsKKworCSAgICAvKiBDaGVjayBpZiBpdCdzIGFsbG93ZWQgdG8gYWJhbmRvbiB0aGlzIHdpbmRvdyAqLworCSAgICByID0gY2FuX2FiYW5kb24od3AtPndfYnVmZmVyLCBmb3JjZWl0KTsKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKwkgICAgaWYgKCF3aW5fdmFsaWQod3ApKQkJLyogYXV0b2NvbW1hbmRzIG1lc3NlZCB3cCB1cCAqLworCSAgICB7CisJCW5leHR3cCA9IGZpcnN0d2luOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisJICAgIGlmICghcikKKwkgICAgeworI2lmIGRlZmluZWQoRkVBVF9HVUlfRElBTE9HKSB8fCBkZWZpbmVkKEZFQVRfQ09OX0RJQUxPRykKKwkJaWYgKG1lc3NhZ2UgJiYgKHBfY29uZmlybSB8fCBjbWRtb2QuY29uZmlybSkgJiYgcF93cml0ZSkKKwkJeworCQkgICAgZGlhbG9nX2NoYW5nZWQod3AtPndfYnVmZmVyLCBGQUxTRSk7CisjIGlmZGVmIEZFQVRfQVVUT0NNRAorCQkgICAgaWYgKCF3aW5fdmFsaWQod3ApKQkJLyogYXV0b2NvbW1hbmRzIG1lc3NlZCB3cCB1cCAqLworCQkgICAgeworCQkJbmV4dHdwID0gZmlyc3R3aW47CisJCQljb250aW51ZTsKKwkJICAgIH0KKyMgZW5kaWYKKwkJfQorCQlpZiAoYnVmSXNDaGFuZ2VkKHdwLT53X2J1ZmZlcikpCisjZW5kaWYKKwkJICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIHdpbl9jbG9zZSh3cCwgIVBfSElEKHdwLT53X2J1ZmZlcikgJiYgIWJ1ZklzQ2hhbmdlZCh3cC0+d19idWZmZXIpKTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBjdXJyZW50IHdpbmRvdyBoYXMgYSBzdGF0dXMgbGluZSBhbmQgd2UgZG9uJ3Qgd2FudCBvbmUsCisgICAgICogcmVtb3ZlIHRoZSBzdGF0dXMgbGluZS4KKyAgICAgKi8KKyAgICBpZiAobGFzdHdpbiAhPSBmaXJzdHdpbikKKwlFTVNHKF8oIkU0NDU6IE90aGVyIHdpbmRvdyBjb250YWlucyBjaGFuZ2VzIikpOworfQorCisjZW5kaWYgLyogRkVBVF9XSU5ET1dTICovCisKKy8qCisgKiBpbml0IHRoZSBjdXJzb3IgaW4gdGhlIHdpbmRvdworICoKKyAqIGNhbGxlZCB3aGVuIGEgbmV3IGZpbGUgaXMgYmVpbmcgZWRpdGVkCisgKi8KKyAgICB2b2lkCit3aW5faW5pdCh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgcmVkcmF3X3dpbl9sYXRlcih3cCwgTk9UX1ZBTElEKTsKKyAgICB3cC0+d19saW5lc192YWxpZCA9IDA7CisgICAgd3AtPndfY3Vyc29yLmxudW0gPSAxOworICAgIHdwLT53X2N1cnN3YW50ID0gd3AtPndfY3Vyc29yLmNvbCA9IDA7CisjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAorICAgIHdwLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgd3AtPndfcGNtYXJrLmxudW0gPSAxOwkvKiBwY21hcmsgbm90IGNsZWFyZWQgYnV0IHNldCB0byBsaW5lIDEgKi8KKyAgICB3cC0+d19wY21hcmsuY29sID0gMDsKKyAgICB3cC0+d19wcmV2X3BjbWFyay5sbnVtID0gMDsKKyAgICB3cC0+d19wcmV2X3BjbWFyay5jb2wgPSAwOworICAgIHdwLT53X3RvcGxpbmUgPSAxOworI2lmZGVmIEZFQVRfRElGRgorICAgIHdwLT53X3RvcGZpbGwgPSAwOworI2VuZGlmCisgICAgd3AtPndfYm90bGluZSA9IDI7CisjaWZkZWYgRkVBVF9GS01BUAorICAgIGlmIChjdXJ3aW4tPndfcF9ybCkKKwl3cC0+d19mYXJzaSA9IFdfQ09OViArIFdfUl9MOworICAgIGVsc2UKKwl3cC0+d19mYXJzaSA9IFdfQ09OVjsKKyNlbmRpZgorfQorCisvKgorICogQWxsb2NhdGUgdGhlIGZpcnN0IHdpbmRvdyBhbmQgcHV0IGFuIGVtcHR5IGJ1ZmZlciBpbiBpdC4KKyAqIENhbGxlZCBmcm9tIG1haW4oKS4KKyAqIFdoZW4gdGhpcyBmYWlscyB3ZSBjYW4ndCBkbyBhbnl0aGluZzogZXhpdC4KKyAqLworICAgIHZvaWQKK3dpbl9hbGxvY19maXJzdCgpCit7CisgICAgY3Vyd2luID0gd2luX2FsbG9jKE5VTEwpOworICAgIGN1cmJ1ZiA9IGJ1Zmxpc3RfbmV3KE5VTEwsIE5VTEwsIDFMLCBCTE5fTElTVEVEKTsKKyAgICBpZiAoY3Vyd2luID09IE5VTEwgfHwgY3VyYnVmID09IE5VTEwpCisJbWNoX2V4aXQoMCk7CisgICAgY3Vyd2luLT53X2J1ZmZlciA9IGN1cmJ1ZjsKKyAgICBjdXJidWYtPmJfbndpbmRvd3MgPSAxOwkvKiB0aGVyZSBpcyBvbmUgd2luZG93ICovCisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgY3Vyd2luLT53X2FsaXN0ID0gJmdsb2JhbF9hbGlzdDsKKyNlbmRpZgorICAgIHdpbl9pbml0KGN1cndpbik7CQkvKiBpbml0IGN1cnJlbnQgd2luZG93ICovCisKKyAgICB0b3BmcmFtZSA9IChmcmFtZV9UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKXNpemVvZihmcmFtZV9UKSk7CisgICAgaWYgKHRvcGZyYW1lID09IE5VTEwpCisJbWNoX2V4aXQoMCk7CisgICAgdG9wZnJhbWUtPmZyX2xheW91dCA9IEZSX0xFQUY7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICB0b3BmcmFtZS0+ZnJfd2lkdGggPSBDb2x1bW5zOworI2VuZGlmCisgICAgdG9wZnJhbWUtPmZyX2hlaWdodCA9IFJvd3MgLSBwX2NoOworICAgIHRvcGZyYW1lLT5mcl93aW4gPSBjdXJ3aW47CisgICAgY3Vyd2luLT53X2ZyYW1lID0gdG9wZnJhbWU7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKKworLyoKKyAqIEdvIHRvIGFub3RoZXIgd2luZG93LgorICogV2hlbiBqdW1waW5nIHRvIGFub3RoZXIgYnVmZmVyLCBzdG9wIFZpc3VhbCBtb2RlLiAgRG8gdGhpcyBiZWZvcmUKKyAqIGNoYW5naW5nIHdpbmRvd3Mgc28gd2UgY2FuIHlhbmsgdGhlIHNlbGVjdGlvbiBpbnRvIHRoZSAnKicgcmVnaXN0ZXIuCisgKiBXaGVuIGp1bXBpbmcgdG8gYW5vdGhlciB3aW5kb3cgb24gdGhlIHNhbWUgYnVmZmVyLCBhZGp1c3QgaXRzIGN1cnNvcgorICogcG9zaXRpb24gdG8ga2VlcCB0aGUgc2FtZSBWaXN1YWwgYXJlYS4KKyAqLworICAgIHZvaWQKK3dpbl9nb3RvKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyNpZmRlZiBGRUFUX0NNRFdJTgorICAgIGlmIChjbWR3aW5fdHlwZSAhPSAwKQorICAgIHsKKwliZWVwX2ZsdXNoKCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKHdwLT53X2J1ZmZlciAhPSBjdXJidWYpCisJcmVzZXRfVklzdWFsX2FuZF9yZXNlbCgpOworICAgIGVsc2UgaWYgKFZJc3VhbF9hY3RpdmUpCisJd3AtPndfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9HVUkKKyAgICBuZWVkX21vdXNlX2NvcnJlY3QgPSBUUlVFOworI2VuZGlmCisgICAgd2luX2VudGVyKHdwLCBUUlVFKTsKK30KKworI2lmIGRlZmluZWQoRkVBVF9QRVJMKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIEZpbmQgd2luZG93IG51bWJlciAid2lubnIiIChjb3VudGluZyB0b3AgdG8gYm90dG9tKS4KKyAqLworICAgIHdpbl9UICoKK3dpbl9maW5kX25yKHdpbm5yKQorICAgIGludAkJd2lubnI7Cit7CisgICAgd2luX1QJKndwOworCisjIGlmZGVmIEZFQVRfV0lORE9XUworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICgtLXdpbm5yID09IDApCisJICAgIGJyZWFrOworICAgIHJldHVybiB3cDsKKyMgZWxzZQorICAgIHJldHVybiBjdXJ3aW47CisjIGVuZGlmCit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKgorICogTW92ZSB0byB3aW5kb3cgYWJvdmUgb3IgYmVsb3cgImNvdW50IiB0aW1lcy4KKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fZ290b192ZXIodXAsIGNvdW50KQorICAgIGludAkJdXA7CQkvKiBUUlVFIHRvIGdvIHRvIHdpbiBhYm92ZSAqLworICAgIGxvbmcJY291bnQ7Cit7CisgICAgZnJhbWVfVAkqZnI7CisgICAgZnJhbWVfVAkqbmZyOworICAgIGZyYW1lX1QJKmZvdW5kZnI7CisKKyAgICBmb3VuZGZyID0gY3Vyd2luLT53X2ZyYW1lOworICAgIHdoaWxlIChjb3VudC0tKQorICAgIHsKKwkvKgorCSAqIEZpcnN0IGdvIHVwd2FyZHMgaW4gdGhlIHRyZWUgb2YgZnJhbWVzIHVudGlsIHdlIGZpbmQgYSB1cHdhcmRzIG9yCisJICogZG93bndhcmRzIG5laWdoYm9yLgorCSAqLworCWZyID0gZm91bmRmcjsKKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKGZyID09IHRvcGZyYW1lKQorCQlnb3RvIGVuZDsKKwkgICAgaWYgKHVwKQorCQluZnIgPSBmci0+ZnJfcHJldjsKKwkgICAgZWxzZQorCQluZnIgPSBmci0+ZnJfbmV4dDsKKwkgICAgaWYgKGZyLT5mcl9wYXJlbnQtPmZyX2xheW91dCA9PSBGUl9DT0wgJiYgbmZyICE9IE5VTEwpCisJCWJyZWFrOworCSAgICBmciA9IGZyLT5mcl9wYXJlbnQ7CisJfQorCisJLyoKKwkgKiBOb3cgZ28gZG93bndhcmRzIHRvIGZpbmQgdGhlIGJvdHRvbSBvciB0b3AgZnJhbWUgaW4gaXQuCisJICovCisJZm9yICg7OykKKwl7CisJICAgIGlmIChuZnItPmZyX2xheW91dCA9PSBGUl9MRUFGKQorCSAgICB7CisJCWZvdW5kZnIgPSBuZnI7CisJCWJyZWFrOworCSAgICB9CisJICAgIGZyID0gbmZyLT5mcl9jaGlsZDsKKwkgICAgaWYgKG5mci0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKwkgICAgeworCQkvKiBGaW5kIHRoZSBmcmFtZSBhdCB0aGUgY3Vyc29yIHJvdy4gKi8KKwkJd2hpbGUgKGZyLT5mcl9uZXh0ICE9IE5VTEwKKwkJCSYmIGZyYW1lMndpbihmciktPndfd2luY29sICsgZnItPmZyX3dpZHRoCisJCQkJCSA8PSBjdXJ3aW4tPndfd2luY29sICsgY3Vyd2luLT53X3djb2wpCisJCSAgICBmciA9IGZyLT5mcl9uZXh0OworCSAgICB9CisJICAgIGlmIChuZnItPmZyX2xheW91dCA9PSBGUl9DT0wgJiYgdXApCisJCXdoaWxlIChmci0+ZnJfbmV4dCAhPSBOVUxMKQorCQkgICAgZnIgPSBmci0+ZnJfbmV4dDsKKwkgICAgbmZyID0gZnI7CisJfQorICAgIH0KK2VuZDoKKyAgICBpZiAoZm91bmRmciAhPSBOVUxMKQorCXdpbl9nb3RvKGZvdW5kZnItPmZyX3dpbik7Cit9CisKKy8qCisgKiBNb3ZlIHRvIGxlZnQgb3IgcmlnaHQgd2luZG93LgorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9nb3RvX2hvcihsZWZ0LCBjb3VudCkKKyAgICBpbnQJCWxlZnQ7CQkvKiBUUlVFIHRvIGdvIHRvIGxlZnQgd2luICovCisgICAgbG9uZwljb3VudDsKK3sKKyAgICBmcmFtZV9UCSpmcjsKKyAgICBmcmFtZV9UCSpuZnI7CisgICAgZnJhbWVfVAkqZm91bmRmcjsKKworICAgIGZvdW5kZnIgPSBjdXJ3aW4tPndfZnJhbWU7CisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgeworCS8qCisJICogRmlyc3QgZ28gdXB3YXJkcyBpbiB0aGUgdHJlZSBvZiBmcmFtZXMgdW50aWwgd2UgZmluZCBhIGxlZnQgb3IKKwkgKiByaWdodCBuZWlnaGJvci4KKwkgKi8KKwlmciA9IGZvdW5kZnI7CisJZm9yICg7OykKKwl7CisJICAgIGlmIChmciA9PSB0b3BmcmFtZSkKKwkJZ290byBlbmQ7CisJICAgIGlmIChsZWZ0KQorCQluZnIgPSBmci0+ZnJfcHJldjsKKwkgICAgZWxzZQorCQluZnIgPSBmci0+ZnJfbmV4dDsKKwkgICAgaWYgKGZyLT5mcl9wYXJlbnQtPmZyX2xheW91dCA9PSBGUl9ST1cgJiYgbmZyICE9IE5VTEwpCisJCWJyZWFrOworCSAgICBmciA9IGZyLT5mcl9wYXJlbnQ7CisJfQorCisJLyoKKwkgKiBOb3cgZ28gZG93bndhcmRzIHRvIGZpbmQgdGhlIGxlZnRtb3N0IG9yIHJpZ2h0bW9zdCBmcmFtZSBpbiBpdC4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgaWYgKG5mci0+ZnJfbGF5b3V0ID09IEZSX0xFQUYpCisJICAgIHsKKwkJZm91bmRmciA9IG5mcjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZnIgPSBuZnItPmZyX2NoaWxkOworCSAgICBpZiAobmZyLT5mcl9sYXlvdXQgPT0gRlJfQ09MKQorCSAgICB7CisJCS8qIEZpbmQgdGhlIGZyYW1lIGF0IHRoZSBjdXJzb3Igcm93LiAqLworCQl3aGlsZSAoZnItPmZyX25leHQgIT0gTlVMTAorCQkJJiYgZnJhbWUyd2luKGZyKS0+d193aW5yb3cgKyBmci0+ZnJfaGVpZ2h0CisJCQkJCSA8PSBjdXJ3aW4tPndfd2lucm93ICsgY3Vyd2luLT53X3dyb3cpCisJCSAgICBmciA9IGZyLT5mcl9uZXh0OworCSAgICB9CisJICAgIGlmIChuZnItPmZyX2xheW91dCA9PSBGUl9ST1cgJiYgbGVmdCkKKwkJd2hpbGUgKGZyLT5mcl9uZXh0ICE9IE5VTEwpCisJCSAgICBmciA9IGZyLT5mcl9uZXh0OworCSAgICBuZnIgPSBmcjsKKwl9CisgICAgfQorZW5kOgorICAgIGlmIChmb3VuZGZyICE9IE5VTEwpCisJd2luX2dvdG8oZm91bmRmci0+ZnJfd2luKTsKK30KKyNlbmRpZgorCisvKgorICogTWFrZSB3aW5kb3cgIndwIiB0aGUgY3VycmVudCB3aW5kb3cuCisgKi8KKyAgICB2b2lkCit3aW5fZW50ZXIod3AsIHVuZG9fc3luYykKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl1bmRvX3N5bmM7Cit7CisgICAgd2luX2VudGVyX2V4dCh3cCwgdW5kb19zeW5jLCBGQUxTRSk7Cit9CisKKy8qCisgKiBNYWtlIHdpbmRvdyB3cCB0aGUgY3VycmVudCB3aW5kb3cuCisgKiBDYW4gYmUgY2FsbGVkIHdpdGggImN1cndpbl9pbnZhbGlkIiBUUlVFLCB3aGljaCBtZWFucyB0aGF0IGN1cndpbiBoYXMganVzdAorICogYmVlbiBjbG9zZWQgYW5kIGlzbid0IHZhbGlkLgorICovCisgICAgc3RhdGljIHZvaWQKK3dpbl9lbnRlcl9leHQod3AsIHVuZG9fc3luYywgY3Vyd2luX2ludmFsaWQpCisgICAgd2luX1QJKndwOworICAgIGludAkJdW5kb19zeW5jOworICAgIGludAkJY3Vyd2luX2ludmFsaWQ7Cit7CisjaWZkZWYgRkVBVF9BVVRPQ01ECisgICAgaW50CQlvdGhlcl9idWZmZXIgPSBGQUxTRTsKKyNlbmRpZgorCisgICAgaWYgKHdwID09IGN1cndpbiAmJiAhY3Vyd2luX2ludmFsaWQpCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm47CisKKyNpZmRlZiBGRUFUX0FVVE9DTUQKKyAgICBpZiAoIWN1cndpbl9pbnZhbGlkKQorICAgIHsKKwkvKgorCSAqIEJlIGNhcmVmdWw6IElmIGF1dG9jb21tYW5kcyBkZWxldGUgdGhlIHdpbmRvdywgcmV0dXJuIG5vdy4KKwkgKi8KKwlpZiAod3AtPndfYnVmZmVyICE9IGN1cmJ1ZikKKwl7CisJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkxFQVZFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwkgICAgb3RoZXJfYnVmZmVyID0gVFJVRTsKKwkgICAgaWYgKCF3aW5fdmFsaWQod3ApKQorCQlyZXR1cm47CisJfQorCWFwcGx5X2F1dG9jbWRzKEVWRU5UX1dJTkxFQVZFLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKwlpZiAoIXdpbl92YWxpZCh3cCkpCisJICAgIHJldHVybjsKKyMgaWZkZWYgRkVBVF9FVkFMCisJLyogYXV0b2NtZHMgbWF5IGFib3J0IHNjcmlwdCBwcm9jZXNzaW5nICovCisJaWYgKGFib3J0aW5nKCkpCisJICAgIHJldHVybjsKKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIC8qIHN5bmMgdW5kbyBiZWZvcmUgbGVhdmluZyB0aGUgY3VycmVudCBidWZmZXIgKi8KKyAgICBpZiAodW5kb19zeW5jICYmIGN1cmJ1ZiAhPSB3cC0+d19idWZmZXIpCisJdV9zeW5jKCk7CisgICAgLyogbWF5IGhhdmUgdG8gY29weSB0aGUgYnVmZmVyIG9wdGlvbnMgd2hlbiAnY3BvJyBjb250YWlucyAnUycgKi8KKyAgICBpZiAod3AtPndfYnVmZmVyICE9IGN1cmJ1ZikKKwlidWZfY29weV9vcHRpb25zKHdwLT53X2J1ZmZlciwgQkNPX0VOVEVSIHwgQkNPX05PSEVMUCk7CisgICAgaWYgKCFjdXJ3aW5faW52YWxpZCkKKyAgICB7CisJcHJldndpbiA9IGN1cndpbjsJLyogcmVtZW1iZXIgZm9yIENUUkwtVyBwICovCisJY3Vyd2luLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyAgICB9CisgICAgY3Vyd2luID0gd3A7CisgICAgY3VyYnVmID0gd3AtPndfYnVmZmVyOworICAgIGNoZWNrX2N1cnNvcigpOworI2lmZGVmIEZFQVRfVklSVFVBTEVESVQKKyAgICBpZiAoIXZpcnR1YWxfYWN0aXZlKCkpCisJY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPSAwOworI2VuZGlmCisgICAgY2hhbmdlZF9saW5lX2Fidl9jdXJzKCk7CS8qIGFzc3VtZSBjdXJzb3IgcG9zaXRpb24gbmVlZHMgdXBkYXRpbmcgKi8KKworICAgIGlmIChjdXJ3aW4tPndfbG9jYWxkaXIgIT0gTlVMTCkKKyAgICB7CisJLyogV2luZG93IGhhcyBhIGxvY2FsIGRpcmVjdG9yeTogU2F2ZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBnbG9iYWwKKwkgKiBkaXJlY3RvcnkgKHVubGVzcyB0aGF0IHdhcyBkb25lIGFscmVhZHkpIGFuZCBjaGFuZ2UgdG8gdGhlIGxvY2FsCisJICogZGlyZWN0b3J5LiAqLworCWlmIChnbG9iYWxkaXIgPT0gTlVMTCkKKwl7CisJICAgIGNoYXJfdQljd2RbTUFYUEFUSExdOworCisJICAgIGlmIChtY2hfZGlybmFtZShjd2QsIE1BWFBBVEhMKSA9PSBPSykKKwkJZ2xvYmFsZGlyID0gdmltX3N0cnNhdmUoY3dkKTsKKwl9CisJbWNoX2NoZGlyKChjaGFyICopY3Vyd2luLT53X2xvY2FsZGlyKTsKKwlzaG9ydGVuX2ZuYW1lcyhUUlVFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZ2xvYmFsZGlyICE9IE5VTEwpCisgICAgeworCS8qIFdpbmRvdyBkb2Vzbid0IGhhdmUgYSBsb2NhbCBkaXJlY3RvcnkgYW5kIHdlIGFyZSBub3QgaW4gdGhlIGdsb2JhbAorCSAqIGRpcmVjdG9yeTogQ2hhbmdlIHRvIHRoZSBnbG9iYWwgZGlyZWN0b3J5LiAqLworCW1jaF9jaGRpcigoY2hhciAqKWdsb2JhbGRpcik7CisJdmltX2ZyZWUoZ2xvYmFsZGlyKTsKKwlnbG9iYWxkaXIgPSBOVUxMOworCXNob3J0ZW5fZm5hbWVzKFRSVUUpOworICAgIH0KKworI2lmZGVmIEZFQVRfQVVUT0NNRAorICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1dJTkVOVEVSLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKyAgICBpZiAob3RoZXJfYnVmZmVyKQorCWFwcGx5X2F1dG9jbWRzKEVWRU5UX0JVRkVOVEVSLCBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9USVRMRQorICAgIG1ha2V0aXRsZSgpOworI2VuZGlmCisgICAgY3Vyd2luLT53X3JlZHJfc3RhdHVzID0gVFJVRTsKKyAgICBpZiAocmVzdGFydF9lZGl0KQorCXJlZHJhd19sYXRlcihWQUxJRCk7CS8qIGNhdXNlcyBzdGF0dXMgbGluZSByZWRyYXcgKi8KKworICAgIC8qIHNldCB3aW5kb3cgaGVpZ2h0IHRvIGRlc2lyZWQgbWluaW1hbCB2YWx1ZSAqLworICAgIGlmIChjdXJ3aW4tPndfaGVpZ2h0IDwgcF93aCAmJiAhY3Vyd2luLT53X3Bfd2ZoKQorCXdpbl9zZXRoZWlnaHQoKGludClwX3doKTsKKyAgICBlbHNlIGlmIChjdXJ3aW4tPndfaGVpZ2h0ID09IDApCisJd2luX3NldGhlaWdodCgxKTsKKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgLyogc2V0IHdpbmRvdyB3aWR0aCB0byBkZXNpcmVkIG1pbmltYWwgdmFsdWUgKi8KKyAgICBpZiAoY3Vyd2luLT53X3dpZHRoIDwgcF93aXcpCisJd2luX3NldHdpZHRoKChpbnQpcF93aXcpOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX01PVVNFCisgICAgc2V0bW91c2UoKTsJCQkvKiBpbiBjYXNlIGp1bXBlZCB0by9mcm9tIGhlbHAgYnVmZmVyICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9ORVRCRUFOU19JTlRHKSB8fCBkZWZpbmVkKEZFQVRfU1VOX1dPUktTSE9QKQorICAgIC8qIENoYW5nZSBkaXJlY3RvcmllcyB3aGVuIHRoZSBhY2Qgb3B0aW9uIGlzIHNldCBvbiBhbmQgYWZ0ZXIKKyAgICAgKiBzd2l0Y2hpbmcgd2luZG93cy4gKi8KKyAgICBpZiAocF9hY2QgJiYgY3VyYnVmLT5iX2ZmbmFtZSAhPSBOVUxMCisJCQkJICAgICAmJiB2aW1fY2hkaXJmaWxlKGN1cmJ1Zi0+Yl9mZm5hbWUpID09IE9LKQorCXNob3J0ZW5fZm5hbWVzKFRSVUUpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGRUFUX1dJTkRPV1MgKi8KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKEZFQVRfU0lHTlMpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogSnVtcCB0byB0aGUgZmlyc3Qgb3BlbiB3aW5kb3cgdGhhdCBjb250YWlucyBidWZmZXIgYnVmIGlmIG9uZSBleGlzdHMKKyAqIFRPRE86IEFsdGVybmF0aXZlbHkganVtcCB0byBsYXN0IG9wZW4gd2luZG93PyBEZXBlbmRlbnQgZnJvbSAnc3BsaXRiZWxvdyc/CisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gd2luZG93IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIE5VTEwuCisgKi8KKyAgICB3aW5fVCAqCitidWZfanVtcF9vcGVuX3dpbihidWYpCisgICAgYnVmX1QJKmJ1ZjsKK3sKKyMgaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgd2luX1QJKndwOworCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICh3cC0+d19idWZmZXIgPT0gYnVmKQorCSAgICBicmVhazsKKyAgICBpZiAod3AgIT0gTlVMTCkKKwl3aW5fZW50ZXIod3AsIEZBTFNFKTsKKyAgICByZXR1cm4gd3A7CisjIGVsc2UKKyAgICBpZiAoY3Vyd2luLT53X2J1ZmZlciA9PSBidWYpCisJcmV0dXJuIGN1cndpbjsKKyAgICByZXR1cm4gTlVMTDsKKyMgZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogYWxsb2NhdGUgYSB3aW5kb3cgc3RydWN0dXJlIGFuZCBsaW5rIGl0IGluIHRoZSB3aW5kb3cgbGlzdAorICovCisvKkFSR1NVU0VEKi8KKyAgICBzdGF0aWMgd2luX1QgKgord2luX2FsbG9jKGFmdGVyKQorICAgIHdpbl9UCSphZnRlcjsKK3sKKyAgICB3aW5fVAkqbmV3d2luOworCisgICAgLyoKKyAgICAgKiBhbGxvY2F0ZSB3aW5kb3cgc3RydWN0dXJlIGFuZCBsaW5lc2l6ZXMgYXJyYXlzCisgICAgICovCisgICAgbmV3d2luID0gKHdpbl9UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKXNpemVvZih3aW5fVCkpOworICAgIGlmIChuZXd3aW4gIT0gTlVMTCAmJiB3aW5fYWxsb2NfbGluZXMobmV3d2luKSA9PSBGQUlMKQorICAgIHsKKwl2aW1fZnJlZShuZXd3aW4pOworCW5ld3dpbiA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG5ld3dpbiAhPSBOVUxMKQorICAgIHsKKwkvKgorCSAqIGxpbmsgdGhlIHdpbmRvdyBpbiB0aGUgd2luZG93IGxpc3QKKwkgKi8KKyNpZmRlZiBGRUFUX1dJTkRPV1MKKwl3aW5fYXBwZW5kKGFmdGVyLCBuZXd3aW4pOworI2VuZGlmCisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwluZXd3aW4tPndfd2luY29sID0gMDsKKwluZXd3aW4tPndfd2lkdGggPSBDb2x1bW5zOworI2VuZGlmCisKKwkvKiBwb3NpdGlvbiB0aGUgZGlzcGxheSBhbmQgdGhlIGN1cnNvciBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLworCW5ld3dpbi0+d190b3BsaW5lID0gMTsKKyNpZmRlZiBGRUFUX0RJRkYKKwluZXd3aW4tPndfdG9wZmlsbCA9IDA7CisjZW5kaWYKKwluZXd3aW4tPndfYm90bGluZSA9IDI7CisJbmV3d2luLT53X2N1cnNvci5sbnVtID0gMTsKKyNpZmRlZiBGRUFUX1NDUk9MTEJJTkQKKwluZXd3aW4tPndfc2NiaW5kX3BvcyA9IDE7CisjZW5kaWYKKworCS8qIFdlIHdvbid0IGNhbGN1bGF0ZSB3X2ZyYWN0aW9uIHVudGlsIHJlc2l6aW5nIHRoZSB3aW5kb3cgKi8KKwluZXd3aW4tPndfZnJhY3Rpb24gPSAwOworCW5ld3dpbi0+d19wcmV2X2ZyYWN0aW9uX3JvdyA9IC0xOworCisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLmluX3VzZSkKKwl7CisJICAgIG91dF9mbHVzaCgpOworCSAgICBndWlfY3JlYXRlX3Njcm9sbGJhcigmbmV3d2luLT53X3Njcm9sbGJhcnNbU0JBUl9MRUZUXSwKKwkJICAgIFNCQVJfTEVGVCwgbmV3d2luKTsKKwkgICAgZ3VpX2NyZWF0ZV9zY3JvbGxiYXIoJm5ld3dpbi0+d19zY3JvbGxiYXJzW1NCQVJfUklHSFRdLAorCQkgICAgU0JBUl9SSUdIVCwgbmV3d2luKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBGRUFUX0VWQUwKKwl2YXJfaW5pdCgmbmV3d2luLT53X3ZhcnMpOwkgICAgLyogaW5pdCBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyNlbmRpZgorI2lmZGVmIEZFQVRfRk9MRElORworCWZvbGRJbml0V2luKG5ld3dpbik7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIG5ld3dpbjsKK30KKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogcmVtb3ZlIHdpbmRvdyAnd3AnIGZyb20gdGhlIHdpbmRvdyBsaXN0IGFuZCBmcmVlIHRoZSBzdHJ1Y3R1cmUKKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fZnJlZSh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaW50CQlpOworCisjaWZkZWYgRkVBVF9QRVJMCisgICAgcGVybF93aW5fZnJlZSh3cCk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfUFlUSE9OCisgICAgcHl0aG9uX3dpbmRvd19mcmVlKHdwKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9UQ0wKKyAgICB0Y2xfd2luZG93X2ZyZWUod3ApOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX1JVQlkKKyAgICBydWJ5X3dpbmRvd19mcmVlKHdwKTsKKyNlbmRpZgorCisgICAgY2xlYXJfd2lub3B0KCZ3cC0+d19vbmVidWZfb3B0KTsKKyAgICBjbGVhcl93aW5vcHQoJndwLT53X2FsbGJ1Zl9vcHQpOworCisjaWZkZWYgRkVBVF9FVkFMCisgICAgdmFyX2NsZWFyKCZ3cC0+d192YXJzKTsJICAgIC8qIGZyZWUgYWxsIGludGVybmFsIHZhcmlhYmxlcyAqLworI2VuZGlmCisKKyAgICBpZiAocHJldndpbiA9PSB3cCkKKwlwcmV2d2luID0gTlVMTDsKKyAgICB3aW5fZnJlZV9sc2l6ZSh3cCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd3AtPndfdGFnc3RhY2tsZW47ICsraSkKKwl2aW1fZnJlZSh3cC0+d190YWdzdGFja1tpXS50YWduYW1lKTsKKworICAgIHZpbV9mcmVlKHdwLT53X2xvY2FsZGlyKTsKKyNpZmRlZiBGRUFUX1NFQVJDSF9FWFRSQQorICAgIHZpbV9mcmVlKHdwLT53X21hdGNoLnJlZ3Byb2cpOworI2VuZGlmCisjaWZkZWYgRkVBVF9KVU1QTElTVAorICAgIGZyZWVfanVtcGxpc3Qod3ApOworI2VuZGlmCisKKyNpZmRlZiBGRUFUX0dVSQorICAgIGlmIChndWkuaW5fdXNlKQorICAgIHsKKwlvdXRfZmx1c2goKTsKKwlndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKCZ3cC0+d19zY3JvbGxiYXJzW1NCQVJfTEVGVF0pOworCWd1aV9tY2hfZGVzdHJveV9zY3JvbGxiYXIoJndwLT53X3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0pOworICAgIH0KKyNlbmRpZiAvKiBGRUFUX0dVSSAqLworCisgICAgd2luX3JlbW92ZSh3cCk7CisgICAgdmltX2ZyZWUod3ApOworfQorCisvKgorICogQXBwZW5kIHdpbmRvdyAid3AiIGluIHRoZSB3aW5kb3cgbGlzdCBhZnRlciB3aW5kb3cgImFmdGVyIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fYXBwZW5kKGFmdGVyLCB3cCkKKyAgICB3aW5fVAkqYWZ0ZXIsICp3cDsKK3sKKyAgICB3aW5fVAkqYmVmb3JlOworCisgICAgaWYgKGFmdGVyID09IE5VTEwpCSAgICAvKiBhZnRlciBOVUxMIGlzIGluIGZyb250IG9mIHRoZSBmaXJzdCAqLworCWJlZm9yZSA9IGZpcnN0d2luOworICAgIGVsc2UKKwliZWZvcmUgPSBhZnRlci0+d19uZXh0OworCisgICAgd3AtPndfbmV4dCA9IGJlZm9yZTsKKyAgICB3cC0+d19wcmV2ID0gYWZ0ZXI7CisgICAgaWYgKGFmdGVyID09IE5VTEwpCisJZmlyc3R3aW4gPSB3cDsKKyAgICBlbHNlCisJYWZ0ZXItPndfbmV4dCA9IHdwOworICAgIGlmIChiZWZvcmUgPT0gTlVMTCkKKwlsYXN0d2luID0gd3A7CisgICAgZWxzZQorCWJlZm9yZS0+d19wcmV2ID0gd3A7Cit9CisKKy8qCisgKiBSZW1vdmUgYSB3aW5kb3cgZnJvbSB0aGUgd2luZG93IGxpc3QuCisgKi8KKyAgICBzdGF0aWMgdm9pZAord2luX3JlbW92ZSh3cCkKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgaWYgKHdwLT53X3ByZXYgIT0gTlVMTCkKKwl3cC0+d19wcmV2LT53X25leHQgPSB3cC0+d19uZXh0OworICAgIGVsc2UKKwlmaXJzdHdpbiA9IHdwLT53X25leHQ7CisgICAgaWYgKHdwLT53X25leHQgIT0gTlVMTCkKKwl3cC0+d19uZXh0LT53X3ByZXYgPSB3cC0+d19wcmV2OworICAgIGVsc2UKKwlsYXN0d2luID0gd3AtPndfcHJldjsKK30KKworLyoKKyAqIEFwcGVuZCBmcmFtZSAiZnJwIiBpbiBhIGZyYW1lIGxpc3QgYWZ0ZXIgZnJhbWUgImFmdGVyIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9hcHBlbmQoYWZ0ZXIsIGZycCkKKyAgICBmcmFtZV9UCSphZnRlciwgKmZycDsKK3sKKyAgICBmcnAtPmZyX25leHQgPSBhZnRlci0+ZnJfbmV4dDsKKyAgICBhZnRlci0+ZnJfbmV4dCA9IGZycDsKKyAgICBpZiAoZnJwLT5mcl9uZXh0ICE9IE5VTEwpCisJZnJwLT5mcl9uZXh0LT5mcl9wcmV2ID0gZnJwOworICAgIGZycC0+ZnJfcHJldiA9IGFmdGVyOworfQorCisvKgorICogSW5zZXJ0IGZyYW1lICJmcnAiIGluIGEgZnJhbWUgbGlzdCBiZWZvcmUgZnJhbWUgImJlZm9yZSIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJhbWVfaW5zZXJ0KGJlZm9yZSwgZnJwKQorICAgIGZyYW1lX1QJKmJlZm9yZSwgKmZycDsKK3sKKyAgICBmcnAtPmZyX25leHQgPSBiZWZvcmU7CisgICAgZnJwLT5mcl9wcmV2ID0gYmVmb3JlLT5mcl9wcmV2OworICAgIGJlZm9yZS0+ZnJfcHJldiA9IGZycDsKKyAgICBpZiAoZnJwLT5mcl9wcmV2ICE9IE5VTEwpCisJZnJwLT5mcl9wcmV2LT5mcl9uZXh0ID0gZnJwOworICAgIGVsc2UKKwlmcnAtPmZyX3BhcmVudC0+ZnJfY2hpbGQgPSBmcnA7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBmcmFtZSBmcm9tIGEgZnJhbWUgbGlzdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9yZW1vdmUoZnJwKQorICAgIGZyYW1lX1QJKmZycDsKK3sKKyAgICBpZiAoZnJwLT5mcl9wcmV2ICE9IE5VTEwpCisJZnJwLT5mcl9wcmV2LT5mcl9uZXh0ID0gZnJwLT5mcl9uZXh0OworICAgIGVsc2UKKwlmcnAtPmZyX3BhcmVudC0+ZnJfY2hpbGQgPSBmcnAtPmZyX25leHQ7CisgICAgaWYgKGZycC0+ZnJfbmV4dCAhPSBOVUxMKQorCWZycC0+ZnJfbmV4dC0+ZnJfcHJldiA9IGZycC0+ZnJfcHJldjsKK30KKworI2VuZGlmIC8qIEZFQVRfV0lORE9XUyAqLworCisvKgorICogQWxsb2NhdGUgd19saW5lc1tdIGZvciB3aW5kb3cgIndwIi4KKyAqIFJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBmb3Igc3VjY2Vzcy4KKyAqLworICAgIGludAord2luX2FsbG9jX2xpbmVzKHdwKQorICAgIHdpbl9UCSp3cDsKK3sKKyAgICB3cC0+d19saW5lc192YWxpZCA9IDA7CisgICAgd3AtPndfbGluZXMgPSAod2xpbmVfVCAqKWFsbG9jKCh1bnNpZ25lZCkoUm93cyAqIHNpemVvZih3bGluZV9UKSkpOworICAgIGlmICh3cC0+d19saW5lcyA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIGZyZWUgbHNpemUgYXJyYXlzIGZvciBhIHdpbmRvdworICovCisgICAgdm9pZAord2luX2ZyZWVfbHNpemUod3ApCisgICAgd2luX1QJKndwOworeworICAgIHZpbV9mcmVlKHdwLT53X2xpbmVzKTsKKyAgICB3cC0+d19saW5lcyA9IE5VTEw7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB3aW5fbmV3X3NoZWxsc2l6ZSgpIGFmdGVyIFJvd3MgY2hhbmdlZC4KKyAqLworICAgIHZvaWQKK3NoZWxsX25ld19yb3dzKCkKK3sKKyAgICBpbnQJCWggPSAoaW50KShSb3dzIC0gcF9jaCk7CisKKyAgICBpZiAoZmlyc3R3aW4gPT0gTlVMTCkJLyogbm90IGluaXRpYWxpemVkIHlldCAqLworCXJldHVybjsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBpZiAoaCA8IGZyYW1lX21pbmhlaWdodCh0b3BmcmFtZSwgTlVMTCkpCisJaCA9IGZyYW1lX21pbmhlaWdodCh0b3BmcmFtZSwgTlVMTCk7CisgICAgLyogRmlyc3QgdHJ5IHNldHRpbmcgdGhlIGhlaWdodHMgb2Ygd2luZG93cyB3aXRob3V0ICd3aW5maXhoZWlnaHQnLiAgSWYKKyAgICAgKiB0aGF0IGRvZXNuJ3QgcmVzdWx0IGluIHRoZSByaWdodCBoZWlnaHQsIGZvcmdldCBhYm91dCB0aGF0IG9wdGlvbi4gKi8KKyAgICBmcmFtZV9uZXdfaGVpZ2h0KHRvcGZyYW1lLCBoLCBGQUxTRSwgVFJVRSk7CisgICAgaWYgKHRvcGZyYW1lLT5mcl9oZWlnaHQgIT0gaCkKKwlmcmFtZV9uZXdfaGVpZ2h0KHRvcGZyYW1lLCBoLCBGQUxTRSwgRkFMU0UpOworCisgICAgKHZvaWQpd2luX2NvbXBfcG9zKCk7CQkvKiByZWNvbXB1dGUgd193aW5yb3cgYW5kIHdfd2luY29sICovCisjZWxzZQorICAgIGlmIChoIDwgMSkKKwloID0gMTsKKyAgICB3aW5fbmV3X2hlaWdodChmaXJzdHdpbiwgaCk7CisjZW5kaWYKKyAgICBjb21wdXRlX2NtZHJvdygpOworI2lmIDAKKyAgICAvKiBEaXNhYmxlZDogZG9uJ3Qgd2FudCBtYWtpbmcgdGhlIHNjcmVlbiBzbWFsbGVyIG1ha2UgYSB3aW5kb3cgbGFyZ2VyLiAqLworICAgIGlmIChwX2VhKQorCXdpbl9lcXVhbChjdXJ3aW4sIEZBTFNFLCAndicpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfVkVSVFNQTElUKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIENhbGxlZCBmcm9tIHdpbl9uZXdfc2hlbGxzaXplKCkgYWZ0ZXIgQ29sdW1ucyBjaGFuZ2VkLgorICovCisgICAgdm9pZAorc2hlbGxfbmV3X2NvbHVtbnMoKQoreworICAgIGlmIChmaXJzdHdpbiA9PSBOVUxMKQkvKiBub3QgaW5pdGlhbGl6ZWQgeWV0ICovCisJcmV0dXJuOworICAgIGZyYW1lX25ld193aWR0aCh0b3BmcmFtZSwgKGludClDb2x1bW5zLCBGQUxTRSk7CisgICAgKHZvaWQpd2luX2NvbXBfcG9zKCk7CQkvKiByZWNvbXB1dGUgd193aW5yb3cgYW5kIHdfd2luY29sICovCisjaWYgMAorICAgIC8qIERpc2FibGVkOiBkb24ndCB3YW50IG1ha2luZyB0aGUgc2NyZWVuIHNtYWxsZXIgbWFrZSBhIHdpbmRvdyBsYXJnZXIuICovCisgICAgaWYgKHBfZWEpCisJd2luX2VxdWFsKGN1cndpbiwgRkFMU0UsICdoJyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGRUFUX0NNRFdJTikgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTYXZlIHRoZSBzaXplIG9mIGFsbCB3aW5kb3dzIGluICJnYXAiLgorICovCisgICAgdm9pZAord2luX3NpemVfc2F2ZShnYXApCisgICAgZ2FycmF5X1QJKmdhcDsKKworeworICAgIHdpbl9UCSp3cDsKKworICAgIGdhX2luaXQyKGdhcCwgKGludClzaXplb2YoaW50KSwgMSk7CisgICAgaWYgKGdhX2dyb3coZ2FwLCB3aW5fY291bnQoKSAqIDIpID09IE9LKQorCWZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCXsKKwkgICAgKChpbnQgKilnYXAtPmdhX2RhdGEpW2dhcC0+Z2FfbGVuKytdID0KKwkJCQkJICAgICAgIHdwLT53X3dpZHRoICsgd3AtPndfdnNlcF93aWR0aDsKKwkgICAgKChpbnQgKilnYXAtPmdhX2RhdGEpW2dhcC0+Z2FfbGVuKytdID0gd3AtPndfaGVpZ2h0OworCX0KK30KKworLyoKKyAqIFJlc3RvcmUgd2luZG93IHNpemVzLCBidXQgb25seSBpZiB0aGUgbnVtYmVyIG9mIHdpbmRvd3MgaXMgc3RpbGwgdGhlIHNhbWUuCisgKiBEb2VzIG5vdCBmcmVlIHRoZSBncm93YXJyYXkuCisgKi8KKyAgICB2b2lkCit3aW5fc2l6ZV9yZXN0b3JlKGdhcCkKKyAgICBnYXJyYXlfVAkqZ2FwOworeworICAgIHdpbl9UCSp3cDsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAod2luX2NvdW50KCkgKiAyID09IGdhcC0+Z2FfbGVuKQorICAgIHsKKwlpID0gMDsKKwlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwl7CisJICAgIGZyYW1lX3NldHdpZHRoKHdwLT53X2ZyYW1lLCAoKGludCAqKWdhcC0+Z2FfZGF0YSlbaSsrXSk7CisJICAgIHdpbl9zZXRoZWlnaHRfd2luKCgoaW50ICopZ2FwLT5nYV9kYXRhKVtpKytdLCB3cCk7CisJfQorCS8qIHJlY29tcHV0ZSB0aGUgd2luZG93IHBvc2l0aW9ucyAqLworCSh2b2lkKXdpbl9jb21wX3BvcygpOworICAgIH0KK30KKyNlbmRpZiAvKiBGRUFUX0NNRFdJTiAqLworCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVXBkYXRlIHRoZSBwb3NpdGlvbiBmb3IgYWxsIHdpbmRvd3MsIHVzaW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZQorICogZnJhbWVzLgorICogUmV0dXJucyB0aGUgcm93IGp1c3QgYWZ0ZXIgdGhlIGxhc3Qgd2luZG93LgorICovCisgICAgc3RhdGljIGludAord2luX2NvbXBfcG9zKCkKK3sKKyAgICBpbnQJCXJvdyA9IDA7CisgICAgaW50CQljb2wgPSAwOworCisgICAgZnJhbWVfY29tcF9wb3ModG9wZnJhbWUsICZyb3csICZjb2wpOworICAgIHJldHVybiByb3c7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3dzIGluIGZyYW1lICJ0b3BmcnAiLCB1c2luZyB0aGUgd2lkdGggYW5kCisgKiBoZWlnaHQgb2YgdGhlIGZyYW1lcy4KKyAqICIqcm93IiBhbmQgIipjb2wiIGFyZSB0aGUgdG9wLWxlZnQgcG9zaXRpb24gb2YgdGhlIGZyYW1lLiAgVGhleSBhcmUgdXBkYXRlZAorICogdG8gdGhlIGJvdHRvbS1yaWdodCBwb3NpdGlvbiBwbHVzIG9uZS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitmcmFtZV9jb21wX3Bvcyh0b3BmcnAsIHJvdywgY29sKQorICAgIGZyYW1lX1QJKnRvcGZycDsKKyAgICBpbnQJCSpyb3c7CisgICAgaW50CQkqY29sOworeworICAgIHdpbl9UCSp3cDsKKyAgICBmcmFtZV9UCSpmcnA7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpbnQJCXN0YXJ0Y29sOworICAgIGludAkJc3RhcnRyb3c7CisjZW5kaWYKKworICAgIHdwID0gdG9wZnJwLT5mcl93aW47CisgICAgaWYgKHdwICE9IE5VTEwpCisgICAgeworCWlmICh3cC0+d193aW5yb3cgIT0gKnJvdworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJCXx8IHdwLT53X3dpbmNvbCAhPSAqY29sCisjZW5kaWYKKwkJKQorCXsKKwkgICAgLyogcG9zaXRpb24gY2hhbmdlZCwgcmVkcmF3ICovCisJICAgIHdwLT53X3dpbnJvdyA9ICpyb3c7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgd3AtPndfd2luY29sID0gKmNvbDsKKyNlbmRpZgorCSAgICByZWRyYXdfd2luX2xhdGVyKHdwLCBOT1RfVkFMSUQpOworCSAgICB3cC0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisJfQorCSpyb3cgKz0gd3AtPndfaGVpZ2h0ICsgd3AtPndfc3RhdHVzX2hlaWdodDsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSpjb2wgKz0gd3AtPndfd2lkdGggKyB3cC0+d192c2VwX3dpZHRoOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlzdGFydHJvdyA9ICpyb3c7CisJc3RhcnRjb2wgPSAqY29sOworI2VuZGlmCisJZm9yIChmcnAgPSB0b3BmcnAtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsgZnJwID0gZnJwLT5mcl9uZXh0KQorCXsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICBpZiAodG9wZnJwLT5mcl9sYXlvdXQgPT0gRlJfUk9XKQorCQkqcm93ID0gc3RhcnRyb3c7CS8qIGFsbCBmcmFtZXMgYXJlIGF0IHRoZSBzYW1lIHJvdyAqLworCSAgICBlbHNlCisJCSpjb2wgPSBzdGFydGNvbDsJLyogYWxsIGZyYW1lcyBhcmUgYXQgdGhlIHNhbWUgY29sICovCisjZW5kaWYKKwkgICAgZnJhbWVfY29tcF9wb3MoZnJwLCByb3csIGNvbCk7CisJfQorICAgIH0KK30KKworI2VuZGlmIC8qIEZFQVRfV0lORE9XUyAqLworCisvKgorICogU2V0IGN1cnJlbnQgd2luZG93IGhlaWdodCBhbmQgdGFrZSBjYXJlIG9mIHJlcG9zaXRpb25pbmcgb3RoZXIgd2luZG93cyB0bworICogZml0IGFyb3VuZCBpdC4KKyAqLworICAgIHZvaWQKK3dpbl9zZXRoZWlnaHQoaGVpZ2h0KQorICAgIGludAkJaGVpZ2h0OworeworICAgIHdpbl9zZXRoZWlnaHRfd2luKGhlaWdodCwgY3Vyd2luKTsKK30KKworLyoKKyAqIFNldCB0aGUgd2luZG93IGhlaWdodCBvZiB3aW5kb3cgIndpbiIgYW5kIHRha2UgY2FyZSBvZiByZXBvc2l0aW9uaW5nIG90aGVyCisgKiB3aW5kb3dzIHRvIGZpdCBhcm91bmQgaXQuCisgKi8KKyAgICB2b2lkCit3aW5fc2V0aGVpZ2h0X3dpbihoZWlnaHQsIHdpbikKKyAgICBpbnQJCWhlaWdodDsKKyAgICB3aW5fVAkqd2luOworeworICAgIGludAkJcm93OworCisgICAgaWYgKHdpbiA9PSBjdXJ3aW4pCisgICAgeworCS8qIEFsd2F5cyBrZWVwIGN1cnJlbnQgd2luZG93IGF0IGxlYXN0IG9uZSBsaW5lIGhpZ2gsIGV2ZW4gd2hlbgorCSAqICd3aW5taW5oZWlnaHQnIGlzIHplcm8uICovCisjaWZkZWYgRkVBVF9XSU5ET1dTCisJaWYgKGhlaWdodCA8IHBfd21oKQorCSAgICBoZWlnaHQgPSBwX3dtaDsKKyNlbmRpZgorCWlmIChoZWlnaHQgPT0gMCkKKwkgICAgaGVpZ2h0ID0gMTsKKyAgICB9CisKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICBmcmFtZV9zZXRoZWlnaHQod2luLT53X2ZyYW1lLCBoZWlnaHQgKyB3aW4tPndfc3RhdHVzX2hlaWdodCk7CisKKyAgICAvKiByZWNvbXB1dGUgdGhlIHdpbmRvdyBwb3NpdGlvbnMgKi8KKyAgICByb3cgPSB3aW5fY29tcF9wb3MoKTsKKyNlbHNlCisgICAgaWYgKGhlaWdodCA+IHRvcGZyYW1lLT5mcl9oZWlnaHQpCisJaGVpZ2h0ID0gdG9wZnJhbWUtPmZyX2hlaWdodDsKKyAgICB3aW4tPndfaGVpZ2h0ID0gaGVpZ2h0OworICAgIHJvdyA9IGhlaWdodDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyBleHRyYSBzcGFjZSBjcmVhdGVkIGJldHdlZW4gdGhlIGxhc3Qgd2luZG93IGFuZCB0aGUgY29tbWFuZAorICAgICAqIGxpbmUsIGNsZWFyIGl0LgorICAgICAqLworICAgIGlmIChmdWxsX3NjcmVlbiAmJiBtc2dfc2Nyb2xsZWQgPT0gMCAmJiByb3cgPCBjbWRsaW5lX3JvdykKKwlzY3JlZW5fZmlsbChyb3csIGNtZGxpbmVfcm93LCAwLCAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKyAgICBjbWRsaW5lX3JvdyA9IHJvdzsKKyAgICBtc2dfcm93ID0gcm93OworICAgIG1zZ19jb2wgPSAwOworCisgICAgcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisKKy8qCisgKiBTZXQgdGhlIGhlaWdodCBvZiBhIGZyYW1lIHRvICJoZWlnaHQiIGFuZCB0YWtlIGNhcmUgdGhhdCBhbGwgZnJhbWVzIGFuZAorICogd2luZG93cyBpbnNpZGUgaXQgYXJlIHJlc2l6ZWQuICBBbHNvIHJlc2l6ZSBmcmFtZXMgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IGlmCisgKiB0aGUgYXJlIGluIHRoZSBzYW1lIEZSX1JPVyBmcmFtZS4KKyAqCisgKiBTdHJhdGVneToKKyAqIElmIHRoZSBmcmFtZSBpcyBwYXJ0IG9mIGEgRlJfQ09MIGZyYW1lLCB0cnkgZml0dGluZyB0aGUgZnJhbWUgaW4gdGhhdAorICogZnJhbWUuICBJZiB0aGF0IGRvZXNuJ3Qgd29yayAodGhlIEZSX0NPTCBmcmFtZSBpcyB0b28gc21hbGwpLCByZWN1cnNpdmVseQorICogZ28gdG8gY29udGFpbmluZyBmcmFtZXMgdG8gcmVzaXplIHRoZW0gYW5kIG1ha2Ugcm9vbS4KKyAqIElmIHRoZSBmcmFtZSBpcyBwYXJ0IG9mIGEgRlJfUk9XIGZyYW1lLCBhbGwgZnJhbWVzIG11c3QgYmUgcmVzaXplZCBhcyB3ZWxsLgorICogQ2hlY2sgZm9yIHRoZSBtaW5pbWFsIGhlaWdodCBvZiB0aGUgRlJfUk9XIGZyYW1lLgorICogQXQgdGhlIHRvcCBsZXZlbCB3ZSBjYW4gYWxzbyB1c2UgY2hhbmdlIHRoZSBjb21tYW5kIGxpbmUgaGVpZ2h0LgorICovCisgICAgc3RhdGljIHZvaWQKK2ZyYW1lX3NldGhlaWdodChjdXJmcnAsIGhlaWdodCkKKyAgICBmcmFtZV9UCSpjdXJmcnA7CisgICAgaW50CQloZWlnaHQ7Cit7CisgICAgaW50CQlyb29tOwkJLyogdG90YWwgbnVtYmVyIG9mIGxpbmVzIGF2YWlsYWJsZSAqLworICAgIGludAkJdGFrZTsJCS8qIG51bWJlciBvZiBsaW5lcyB0YWtlbiBmcm9tIG90aGVyIHdpbmRvd3MgKi8KKyAgICBpbnQJCXJvb21fY21kbGluZTsJLyogbGluZXMgYXZhaWxhYmxlIGZyb20gY21kbGluZSAqLworICAgIGludAkJcnVuOworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCWg7CisgICAgaW50CQlyb29tX3Jlc2VydmVkOworCisgICAgLyogSWYgdGhlIGhlaWdodCBhbHJlYWR5IGlzIHRoZSBkZXNpcmVkIHZhbHVlLCBub3RoaW5nIHRvIGRvLiAqLworICAgIGlmIChjdXJmcnAtPmZyX2hlaWdodCA9PSBoZWlnaHQpCisJcmV0dXJuOworCisgICAgaWYgKGN1cmZycC0+ZnJfcGFyZW50ID09IE5VTEwpCisgICAgeworCS8qIHRvcGZyYW1lOiBjYW4gb25seSBjaGFuZ2UgdGhlIGNvbW1hbmQgbGluZSAqLworCWlmIChoZWlnaHQgPiBSb3dzIC0gcF9jaCkKKwkgICAgaGVpZ2h0ID0gUm93cyAtIHBfY2g7CisJaWYgKGhlaWdodCA+IDApCisJICAgIGZyYW1lX25ld19oZWlnaHQoY3VyZnJwLCBoZWlnaHQsIEZBTFNFLCBGQUxTRSk7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cmZycC0+ZnJfcGFyZW50LT5mcl9sYXlvdXQgPT0gRlJfUk9XKQorICAgIHsKKwkvKiBSb3cgb2YgZnJhbWVzOiBBbHNvIG5lZWQgdG8gcmVzaXplIGZyYW1lcyBsZWZ0IGFuZCByaWdodCBvZiB0aGlzCisJICogb25lLiAgRmlyc3QgY2hlY2sgZm9yIHRoZSBtaW5pbWFsIGhlaWdodCBvZiB0aGVzZS4gKi8KKwloID0gZnJhbWVfbWluaGVpZ2h0KGN1cmZycC0+ZnJfcGFyZW50LCBOVUxMKTsKKwlpZiAoaGVpZ2h0IDwgaCkKKwkgICAgaGVpZ2h0ID0gaDsKKwlmcmFtZV9zZXRoZWlnaHQoY3VyZnJwLT5mcl9wYXJlbnQsIGhlaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJLyoKKwkgKiBDb2x1bW4gb2YgZnJhbWVzOiB0cnkgdG8gY2hhbmdlIG9ubHkgZnJhbWVzIGluIHRoaXMgY29sdW1uLgorCSAqLworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJLyoKKwkgKiBEbyB0aGlzIHR3aWNlOgorCSAqIDE6IGNvbXB1dGUgcm9vbSBhdmFpbGFibGUsIGlmIGl0J3Mgbm90IGVub3VnaCB0cnkgcmVzaXppbmcgdGhlCisJICogICAgY29udGFpbmluZyBmcmFtZS4KKwkgKiAyOiBjb21wdXRlIHRoZSByb29tIGF2YWlsYWJsZSBhbmQgYWRqdXN0IHRoZSBoZWlnaHQgdG8gaXQuCisJICogVHJ5IG5vdCB0byByZWR1Y2UgdGhlIGhlaWdodCBvZiBhIHdpbmRvdyB3aXRoICd3aW5maXhoZWlnaHQnIHNldC4KKwkgKi8KKwlmb3IgKHJ1biA9IDE7IHJ1biA8PSAyOyArK3J1bikKKyNlbHNlCisJZm9yICg7OykKKyNlbmRpZgorCXsKKwkgICAgcm9vbSA9IDA7CisJICAgIHJvb21fcmVzZXJ2ZWQgPSAwOworCSAgICBmb3IgKGZycCA9IGN1cmZycC0+ZnJfcGFyZW50LT5mcl9jaGlsZDsgZnJwICE9IE5VTEw7CisJCQkJCQkJICAgZnJwID0gZnJwLT5mcl9uZXh0KQorCSAgICB7CisJCWlmIChmcnAgIT0gY3VyZnJwCisJCQkmJiBmcnAtPmZyX3dpbiAhPSBOVUxMCisJCQkmJiBmcnAtPmZyX3dpbi0+d19wX3dmaCkKKwkJICAgIHJvb21fcmVzZXJ2ZWQgKz0gZnJwLT5mcl9oZWlnaHQ7CisJCXJvb20gKz0gZnJwLT5mcl9oZWlnaHQ7CisJCWlmIChmcnAgIT0gY3VyZnJwKQorCQkgICAgcm9vbSAtPSBmcmFtZV9taW5oZWlnaHQoZnJwLCBOVUxMKTsKKwkgICAgfQorI2lmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgIGlmIChjdXJmcnAtPmZyX3dpZHRoICE9IENvbHVtbnMpCisJCXJvb21fY21kbGluZSA9IDA7CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCXJvb21fY21kbGluZSA9IFJvd3MgLSBwX2NoIC0gKGxhc3R3aW4tPndfd2lucm93CisJCQkgICAgICAgKyBsYXN0d2luLT53X2hlaWdodCArIGxhc3R3aW4tPndfc3RhdHVzX2hlaWdodCk7CisJCWlmIChyb29tX2NtZGxpbmUgPCAwKQorCQkgICAgcm9vbV9jbWRsaW5lID0gMDsKKwkgICAgfQorCisJICAgIGlmIChoZWlnaHQgPD0gcm9vbSArIHJvb21fY21kbGluZSkKKwkJYnJlYWs7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwkgICAgaWYgKHJ1biA9PSAyIHx8IGN1cmZycC0+ZnJfd2lkdGggPT0gQ29sdW1ucykKKyNlbmRpZgorCSAgICB7CisJCWlmIChoZWlnaHQgPiByb29tICsgcm9vbV9jbWRsaW5lKQorCQkgICAgaGVpZ2h0ID0gcm9vbSArIHJvb21fY21kbGluZTsKKwkJYnJlYWs7CisJICAgIH0KKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorCSAgICBmcmFtZV9zZXRoZWlnaHQoY3VyZnJwLT5mcl9wYXJlbnQsIGhlaWdodAorCQkrIGZyYW1lX21pbmhlaWdodChjdXJmcnAtPmZyX3BhcmVudCwgTk9XSU4pIC0gKGludClwX3dtaCAtIDEpOworI2VuZGlmCisJICAgIC8qTk9UUkVBQ0hFRCovCisJfQorCisJLyoKKwkgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgbGluZXMgd2Ugd2lsbCB0YWtlIGZyb20gb3RoZXJzIGZyYW1lcyAoY2FuIGJlCisJICogbmVnYXRpdmUhKS4KKwkgKi8KKwl0YWtlID0gaGVpZ2h0IC0gY3VyZnJwLT5mcl9oZWlnaHQ7CisKKwkvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIGFsc28gcmVkdWNlIHRoZSBoZWlnaHQgb2YgYSB3aW5kb3cKKwkgKiB3aXRoICd3aW5maXhoZWlnaHQnIHNldC4gKi8KKwlpZiAoaGVpZ2h0ID4gcm9vbSArIHJvb21fY21kbGluZSAtIHJvb21fcmVzZXJ2ZWQpCisJICAgIHJvb21fcmVzZXJ2ZWQgPSByb29tICsgcm9vbV9jbWRsaW5lIC0gaGVpZ2h0OworCS8qIElmIHRoZXJlIGlzIG9ubHkgYSAnd2luZml4aGVpZ2h0JyB3aW5kb3cgYW5kIG1ha2luZyB0aGUKKwkgKiB3aW5kb3cgc21hbGxlciwgbmVlZCB0byBtYWtlIHRoZSBvdGhlciB3aW5kb3cgdGFsbGVyLiAqLworCWlmICh0YWtlIDwgMCAmJiByb29tIC0gY3VyZnJwLT5mcl9oZWlnaHQgPCByb29tX3Jlc2VydmVkKQorCSAgICByb29tX3Jlc2VydmVkID0gMDsKKworCWlmICh0YWtlID4gMCAmJiByb29tX2NtZGxpbmUgPiAwKQorCXsKKwkgICAgLyogdXNlIGxpbmVzIGZyb20gY21kbGluZSBmaXJzdCAqLworCSAgICBpZiAodGFrZSA8IHJvb21fY21kbGluZSkKKwkJcm9vbV9jbWRsaW5lID0gdGFrZTsKKwkgICAgdGFrZSAtPSByb29tX2NtZGxpbmU7CisJICAgIHRvcGZyYW1lLT5mcl9oZWlnaHQgKz0gcm9vbV9jbWRsaW5lOworCX0KKworCS8qCisJICogc2V0IHRoZSBjdXJyZW50IGZyYW1lIHRvIHRoZSBuZXcgaGVpZ2h0CisJICovCisJZnJhbWVfbmV3X2hlaWdodChjdXJmcnAsIGhlaWdodCwgRkFMU0UsIEZBTFNFKTsKKworCS8qCisJICogRmlyc3QgdGFrZSBsaW5lcyBmcm9tIHRoZSBmcmFtZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUuICBJZgorCSAqIHRoYXQgaXMgbm90IGVub3VnaCwgdGFrZXMgbGluZXMgZnJvbSBmcmFtZXMgYWJvdmUgdGhlIGN1cnJlbnQKKwkgKiBmcmFtZS4KKwkgKi8KKwlmb3IgKHJ1biA9IDA7IHJ1biA8IDI7ICsrcnVuKQorCXsKKwkgICAgaWYgKHJ1biA9PSAwKQorCQlmcnAgPSBjdXJmcnAtPmZyX25leHQ7CS8qIDFzdCBydW46IHN0YXJ0IHdpdGggbmV4dCB3aW5kb3cgKi8KKwkgICAgZWxzZQorCQlmcnAgPSBjdXJmcnAtPmZyX3ByZXY7CS8qIDJuZCBydW46IHN0YXJ0IHdpdGggcHJldiB3aW5kb3cgKi8KKwkgICAgd2hpbGUgKGZycCAhPSBOVUxMICYmIHRha2UgIT0gMCkKKwkgICAgeworCQloID0gZnJhbWVfbWluaGVpZ2h0KGZycCwgTlVMTCk7CisJCWlmIChyb29tX3Jlc2VydmVkID4gMAorCQkJJiYgZnJwLT5mcl93aW4gIT0gTlVMTAorCQkJJiYgZnJwLT5mcl93aW4tPndfcF93ZmgpCisJCXsKKwkJICAgIGlmIChyb29tX3Jlc2VydmVkID49IGZycC0+ZnJfaGVpZ2h0KQorCQkJcm9vbV9yZXNlcnZlZCAtPSBmcnAtPmZyX2hlaWdodDsKKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCWlmIChmcnAtPmZyX2hlaWdodCAtIHJvb21fcmVzZXJ2ZWQgPiB0YWtlKQorCQkJICAgIHJvb21fcmVzZXJ2ZWQgPSBmcnAtPmZyX2hlaWdodCAtIHRha2U7CisJCQl0YWtlIC09IGZycC0+ZnJfaGVpZ2h0IC0gcm9vbV9yZXNlcnZlZDsKKwkJCWZyYW1lX25ld19oZWlnaHQoZnJwLCByb29tX3Jlc2VydmVkLCBGQUxTRSwgRkFMU0UpOworCQkJcm9vbV9yZXNlcnZlZCA9IDA7CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBpZiAoZnJwLT5mcl9oZWlnaHQgLSB0YWtlIDwgaCkKKwkJICAgIHsKKwkJCXRha2UgLT0gZnJwLT5mcl9oZWlnaHQgLSBoOworCQkJZnJhbWVfbmV3X2hlaWdodChmcnAsIGgsIEZBTFNFLCBGQUxTRSk7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCQlmcmFtZV9uZXdfaGVpZ2h0KGZycCwgZnJwLT5mcl9oZWlnaHQgLSB0YWtlLAorCQkJCQkJCQlGQUxTRSwgRkFMU0UpOworCQkJdGFrZSA9IDA7CisJCSAgICB9CisJCX0KKwkJaWYgKHJ1biA9PSAwKQorCQkgICAgZnJwID0gZnJwLT5mcl9uZXh0OworCQllbHNlCisJCSAgICBmcnAgPSBmcnAtPmZyX3ByZXY7CisJICAgIH0KKwl9CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRUFUX1ZFUlRTUExJVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBTZXQgY3VycmVudCB3aW5kb3cgd2lkdGggYW5kIHRha2UgY2FyZSBvZiByZXBvc2l0aW9uaW5nIG90aGVyIHdpbmRvd3MgdG8KKyAqIGZpdCBhcm91bmQgaXQuCisgKi8KKyAgICB2b2lkCit3aW5fc2V0d2lkdGgod2lkdGgpCisgICAgaW50CQl3aWR0aDsKK3sKKyAgICB3aW5fc2V0d2lkdGhfd2luKHdpZHRoLCBjdXJ3aW4pOworfQorCisgICAgdm9pZAord2luX3NldHdpZHRoX3dpbih3aWR0aCwgd3ApCisgICAgaW50CQl3aWR0aDsKKyAgICB3aW5fVAkqd3A7Cit7CisgICAgLyogQWx3YXlzIGtlZXAgY3VycmVudCB3aW5kb3cgYXQgbGVhc3Qgb25lIGNvbHVtbiB3aWRlLCBldmVuIHdoZW4KKyAgICAgKiAnd2lubWlud2lkdGgnIGlzIHplcm8uICovCisgICAgaWYgKHdwID09IGN1cndpbikKKyAgICB7CisJaWYgKHdpZHRoIDwgcF93bXcpCisJICAgIHdpZHRoID0gcF93bXc7CisJaWYgKHdpZHRoID09IDApCisJICAgIHdpZHRoID0gMTsKKyAgICB9CisKKyAgICBmcmFtZV9zZXR3aWR0aCh3cC0+d19mcmFtZSwgd2lkdGggKyB3cC0+d192c2VwX3dpZHRoKTsKKworICAgIC8qIHJlY29tcHV0ZSB0aGUgd2luZG93IHBvc2l0aW9ucyAqLworICAgICh2b2lkKXdpbl9jb21wX3BvcygpOworCisgICAgcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworfQorCisvKgorICogU2V0IHRoZSB3aWR0aCBvZiBhIGZyYW1lIHRvICJ3aWR0aCIgYW5kIHRha2UgY2FyZSB0aGF0IGFsbCBmcmFtZXMgYW5kCisgKiB3aW5kb3dzIGluc2lkZSBpdCBhcmUgcmVzaXplZC4gIEFsc28gcmVzaXplIGZyYW1lcyBhYm92ZSBhbmQgYmVsb3cgaWYgdGhlCisgKiBhcmUgaW4gdGhlIHNhbWUgRlJfUk9XIGZyYW1lLgorICoKKyAqIFN0cmF0ZWd5IGlzIHNpbWlsYXIgdG8gZnJhbWVfc2V0aGVpZ2h0KCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJhbWVfc2V0d2lkdGgoY3VyZnJwLCB3aWR0aCkKKyAgICBmcmFtZV9UCSpjdXJmcnA7CisgICAgaW50CQl3aWR0aDsKK3sKKyAgICBpbnQJCXJvb207CQkvKiB0b3RhbCBudW1iZXIgb2YgbGluZXMgYXZhaWxhYmxlICovCisgICAgaW50CQl0YWtlOwkJLyogbnVtYmVyIG9mIGxpbmVzIHRha2VuIGZyb20gb3RoZXIgd2luZG93cyAqLworICAgIGludAkJcnVuOworICAgIGZyYW1lX1QJKmZycDsKKyAgICBpbnQJCXc7CisKKyAgICAvKiBJZiB0aGUgd2lkdGggYWxyZWFkeSBpcyB0aGUgZGVzaXJlZCB2YWx1ZSwgbm90aGluZyB0byBkby4gKi8KKyAgICBpZiAoY3VyZnJwLT5mcl93aWR0aCA9PSB3aWR0aCkKKwlyZXR1cm47CisKKyAgICBpZiAoY3VyZnJwLT5mcl9wYXJlbnQgPT0gTlVMTCkKKwkvKiB0b3BmcmFtZTogY2FuJ3QgY2hhbmdlIHdpZHRoICovCisJcmV0dXJuOworCisgICAgaWYgKGN1cmZycC0+ZnJfcGFyZW50LT5mcl9sYXlvdXQgPT0gRlJfQ09MKQorICAgIHsKKwkvKiBDb2x1bW4gb2YgZnJhbWVzOiBBbHNvIG5lZWQgdG8gcmVzaXplIGZyYW1lcyBhYm92ZSBhbmQgYmVsb3cgb2YKKwkgKiB0aGlzIG9uZS4gIEZpcnN0IGNoZWNrIGZvciB0aGUgbWluaW1hbCB3aWR0aCBvZiB0aGVzZS4gKi8KKwl3ID0gZnJhbWVfbWlud2lkdGgoY3VyZnJwLT5mcl9wYXJlbnQsIE5VTEwpOworCWlmICh3aWR0aCA8IHcpCisJICAgIHdpZHRoID0gdzsKKwlmcmFtZV9zZXR3aWR0aChjdXJmcnAtPmZyX3BhcmVudCwgd2lkdGgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogUm93IG9mIGZyYW1lczogdHJ5IHRvIGNoYW5nZSBvbmx5IGZyYW1lcyBpbiB0aGlzIHJvdy4KKwkgKgorCSAqIERvIHRoaXMgdHdpY2U6CisJICogMTogY29tcHV0ZSByb29tIGF2YWlsYWJsZSwgaWYgaXQncyBub3QgZW5vdWdoIHRyeSByZXNpemluZyB0aGUKKwkgKiAgICBjb250YWluaW5nIGZyYW1lLgorCSAqIDI6IGNvbXB1dGUgdGhlIHJvb20gYXZhaWxhYmxlIGFuZCBhZGp1c3QgdGhlIHdpZHRoIHRvIGl0LgorCSAqLworCWZvciAocnVuID0gMTsgcnVuIDw9IDI7ICsrcnVuKQorCXsKKwkgICAgcm9vbSA9IDA7CisJICAgIGZvciAoZnJwID0gY3VyZnJwLT5mcl9wYXJlbnQtPmZyX2NoaWxkOyBmcnAgIT0gTlVMTDsKKwkJCQkJCQkgICBmcnAgPSBmcnAtPmZyX25leHQpCisJICAgIHsKKwkJcm9vbSArPSBmcnAtPmZyX3dpZHRoOworCQlpZiAoZnJwICE9IGN1cmZycCkKKwkJICAgIHJvb20gLT0gZnJhbWVfbWlud2lkdGgoZnJwLCBOVUxMKTsKKwkgICAgfQorCisJICAgIGlmICh3aWR0aCA8PSByb29tKQorCQlicmVhazsKKwkgICAgaWYgKHJ1biA9PSAyIHx8IGN1cmZycC0+ZnJfaGVpZ2h0ID49IFJvd3MgLSBwX2NoKQorCSAgICB7CisJCWlmICh3aWR0aCA+IHJvb20pCisJCSAgICB3aWR0aCA9IHJvb207CisJCWJyZWFrOworCSAgICB9CisJICAgIGZyYW1lX3NldHdpZHRoKGN1cmZycC0+ZnJfcGFyZW50LCB3aWR0aAorCQkgKyBmcmFtZV9taW53aWR0aChjdXJmcnAtPmZyX3BhcmVudCwgTk9XSU4pIC0gKGludClwX3dtdyAtIDEpOworCX0KKworCisJLyoKKwkgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgbGluZXMgd2Ugd2lsbCB0YWtlIGZyb20gb3RoZXJzIGZyYW1lcyAoY2FuIGJlCisJICogbmVnYXRpdmUhKS4KKwkgKi8KKwl0YWtlID0gd2lkdGggLSBjdXJmcnAtPmZyX3dpZHRoOworCisJLyoKKwkgKiBzZXQgdGhlIGN1cnJlbnQgZnJhbWUgdG8gdGhlIG5ldyB3aWR0aAorCSAqLworCWZyYW1lX25ld193aWR0aChjdXJmcnAsIHdpZHRoLCBGQUxTRSk7CisKKwkvKgorCSAqIEZpcnN0IHRha2UgbGluZXMgZnJvbSB0aGUgZnJhbWVzIHJpZ2h0IG9mIHRoZSBjdXJyZW50IGZyYW1lLiAgSWYKKwkgKiB0aGF0IGlzIG5vdCBlbm91Z2gsIHRha2VzIGxpbmVzIGZyb20gZnJhbWVzIGxlZnQgb2YgdGhlIGN1cnJlbnQKKwkgKiBmcmFtZS4KKwkgKi8KKwlmb3IgKHJ1biA9IDA7IHJ1biA8IDI7ICsrcnVuKQorCXsKKwkgICAgaWYgKHJ1biA9PSAwKQorCQlmcnAgPSBjdXJmcnAtPmZyX25leHQ7CS8qIDFzdCBydW46IHN0YXJ0IHdpdGggbmV4dCB3aW5kb3cgKi8KKwkgICAgZWxzZQorCQlmcnAgPSBjdXJmcnAtPmZyX3ByZXY7CS8qIDJuZCBydW46IHN0YXJ0IHdpdGggcHJldiB3aW5kb3cgKi8KKwkgICAgd2hpbGUgKGZycCAhPSBOVUxMICYmIHRha2UgIT0gMCkKKwkgICAgeworCQl3ID0gZnJhbWVfbWlud2lkdGgoZnJwLCBOVUxMKTsKKwkJaWYgKGZycC0+ZnJfd2lkdGggLSB0YWtlIDwgdykKKwkJeworCQkgICAgdGFrZSAtPSBmcnAtPmZyX3dpZHRoIC0gdzsKKwkJICAgIGZyYW1lX25ld193aWR0aChmcnAsIHcsIEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIGZyYW1lX25ld193aWR0aChmcnAsIGZycC0+ZnJfd2lkdGggLSB0YWtlLCBGQUxTRSk7CisJCSAgICB0YWtlID0gMDsKKwkJfQorCQlpZiAocnVuID09IDApCisJCSAgICBmcnAgPSBmcnAtPmZyX25leHQ7CisJCWVsc2UKKwkJICAgIGZycCA9IGZycC0+ZnJfcHJldjsKKwkgICAgfQorCX0KKyAgICB9Cit9CisjZW5kaWYgLyogRkVBVF9WRVJUU1BMSVQgKi8KKworLyoKKyAqIENoZWNrICd3aW5taW5oZWlnaHQnIGZvciBhIHZhbGlkIHZhbHVlLgorICovCisgICAgdm9pZAord2luX3NldG1pbmhlaWdodCgpCit7CisgICAgaW50CQlyb29tOworICAgIGludAkJZmlyc3QgPSBUUlVFOworICAgIHdpbl9UCSp3cDsKKworICAgIC8qIGxvb3AgdW50aWwgdGhlcmUgaXMgYSAnd2lubWluaGVpZ2h0JyB0aGF0IGlzIHBvc3NpYmxlICovCisgICAgd2hpbGUgKHBfd21oID4gMCkKKyAgICB7CisJLyogVE9ETzogaGFuZGxlIHZlcnRpY2FsIHNwbGl0cyAqLworCXJvb20gPSAtcF93aDsKKwlmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IE5VTEw7IHdwID0gd3AtPndfbmV4dCkKKwkgICAgcm9vbSArPSB3cC0+d19oZWlnaHQgLSBwX3dtaDsKKwlpZiAocm9vbSA+PSAwKQorCSAgICBicmVhazsKKwktLXBfd21oOworCWlmIChmaXJzdCkKKwl7CisJICAgIEVNU0coXyhlX25vcm9vbSkpOworCSAgICBmaXJzdCA9IEZBTFNFOworCX0KKyAgICB9Cit9CisKKyNpZmRlZiBGRUFUX01PVVNFCisKKy8qCisgKiBTdGF0dXMgbGluZSBvZiBkcmFnd2luIGlzIGRyYWdnZWQgIm9mZnNldCIgbGluZXMgZG93biAobmVnYXRpdmUgaXMgdXApLgorICovCisgICAgdm9pZAord2luX2RyYWdfc3RhdHVzX2xpbmUoZHJhZ3dpbiwgb2Zmc2V0KQorICAgIHdpbl9UCSpkcmFnd2luOworICAgIGludAkJb2Zmc2V0OworeworICAgIGZyYW1lX1QJKmN1cmZyOworICAgIGZyYW1lX1QJKmZyOworICAgIGludAkJcm9vbTsKKyAgICBpbnQJCXJvdzsKKyAgICBpbnQJCXVwOwkvKiBpZiBUUlVFLCBkcmFnIHN0YXR1cyBsaW5lIHVwLCBvdGhlcndpc2UgZG93biAqLworICAgIGludAkJbjsKKworICAgIGZyID0gZHJhZ3dpbi0+d19mcmFtZTsKKyAgICBjdXJmciA9IGZyOworICAgIGlmIChmciAhPSB0b3BmcmFtZSkJCS8qIG1vcmUgdGhhbiBvbmUgd2luZG93ICovCisgICAgeworCWZyID0gZnItPmZyX3BhcmVudDsKKwkvKiBXaGVuIHRoZSBwYXJlbnQgZnJhbWUgaXMgbm90IGEgY29sdW1uIG9mIGZyYW1lcywgaXRzIHBhcmVudCBzaG91bGQKKwkgKiBiZS4gKi8KKwlpZiAoZnItPmZyX2xheW91dCAhPSBGUl9DT0wpCisJeworCSAgICBjdXJmciA9IGZyOworCSAgICBpZiAoZnIgIT0gdG9wZnJhbWUpCS8qIG9ubHkgYSByb3cgb2Ygd2luZG93cywgbWF5IGRyYWcgc3RhdHVzbGluZSAqLworCQlmciA9IGZyLT5mcl9wYXJlbnQ7CisJfQorICAgIH0KKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgaW4gYSBjb2x1bW4sIG1heSB3YW50IHRvIHJlc2l6ZSB0aGUgcGFyZW50CisgICAgICogZnJhbWUgaW5zdGVhZCAoZ28gdHdvIHVwIHRvIHNraXAgYSByb3cgb2YgZnJhbWVzKS4gKi8KKyAgICB3aGlsZSAoY3VyZnIgIT0gdG9wZnJhbWUgJiYgY3VyZnItPmZyX25leHQgPT0gTlVMTCkKKyAgICB7CisJaWYgKGZyICE9IHRvcGZyYW1lKQorCSAgICBmciA9IGZyLT5mcl9wYXJlbnQ7CisJY3VyZnIgPSBmcjsKKwlpZiAoZnIgIT0gdG9wZnJhbWUpCisJICAgIGZyID0gZnItPmZyX3BhcmVudDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0IDwgMCkgLyogZHJhZyB1cCAqLworICAgIHsKKwl1cCA9IFRSVUU7CisJb2Zmc2V0ID0gLW9mZnNldDsKKwkvKiBzdW0gdXAgdGhlIHJvb20gb2YgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIGFib3ZlIGl0ICovCisJaWYgKGZyID09IGN1cmZyKQorCXsKKwkgICAgLyogb25seSBvbmUgd2luZG93ICovCisJICAgIHJvb20gPSBmci0+ZnJfaGVpZ2h0IC0gZnJhbWVfbWluaGVpZ2h0KGZyLCBOVUxMKTsKKwl9CisJZWxzZQorCXsKKwkgICAgcm9vbSA9IDA7CisJICAgIGZvciAoZnIgPSBmci0+ZnJfY2hpbGQ7IDsgZnIgPSBmci0+ZnJfbmV4dCkKKwkgICAgeworCQlyb29tICs9IGZyLT5mcl9oZWlnaHQgLSBmcmFtZV9taW5oZWlnaHQoZnIsIE5VTEwpOworCQlpZiAoZnIgPT0gY3VyZnIpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKwlmciA9IGN1cmZyLT5mcl9uZXh0OwkJLyogcHV0IGZyIGF0IGZyYW1lIHRoYXQgZ3Jvd3MgKi8KKyAgICB9CisgICAgZWxzZSAgICAvKiBkcmFnIGRvd24gKi8KKyAgICB7CisJdXAgPSBGQUxTRTsKKwkvKgorCSAqIE9ubHkgZHJhZ2dpbmcgdGhlIGxhc3Qgc3RhdHVzIGxpbmUgY2FuIHJlZHVjZSBwX2NoLgorCSAqLworCXJvb20gPSBSb3dzIC0gY21kbGluZV9yb3c7CisJaWYgKGN1cmZyLT5mcl9uZXh0ID09IE5VTEwpCisJICAgIHJvb20gLT0gMTsKKwllbHNlCisJICAgIHJvb20gLT0gcF9jaDsKKwlpZiAocm9vbSA8IDApCisJICAgIHJvb20gPSAwOworCS8qIHN1bSB1cCB0aGUgcm9vbSBvZiBmcmFtZXMgYmVsb3cgb2YgdGhlIGN1cnJlbnQgb25lICovCisJZm9yIChmciA9IGN1cmZyLT5mcl9uZXh0OyBmciAhPSBOVUxMOyBmciA9IGZyLT5mcl9uZXh0KQorCSAgICByb29tICs9IGZyLT5mcl9oZWlnaHQgLSBmcmFtZV9taW5oZWlnaHQoZnIsIE5VTEwpOworCWZyID0gY3VyZnI7CQkJLyogcHV0IGZyIGF0IHdpbmRvdyB0aGF0IGdyb3dzICovCisgICAgfQorCisgICAgaWYgKHJvb20gPCBvZmZzZXQpCQkvKiBOb3QgZW5vdWdoIHJvb20gKi8KKwlvZmZzZXQgPSByb29tOwkJLyogTW92ZSBhcyBmYXIgYXMgd2UgY2FuICovCisgICAgaWYgKG9mZnNldCA8PSAwKQorCXJldHVybjsKKworICAgIC8qCisgICAgICogR3JvdyBmcmFtZSBmciBieSAib2Zmc2V0IiBsaW5lcy4KKyAgICAgKiBEb2Vzbid0IGhhcHBlbiB3aGVuIGRyYWdnaW5nIHRoZSBsYXN0IHN0YXR1cyBsaW5lIHVwLgorICAgICAqLworICAgIGlmIChmciAhPSBOVUxMKQorCWZyYW1lX25ld19oZWlnaHQoZnIsIGZyLT5mcl9oZWlnaHQgKyBvZmZzZXQsIHVwLCBGQUxTRSk7CisKKyAgICBpZiAodXApCisJZnIgPSBjdXJmcjsJCS8qIGN1cnJlbnQgZnJhbWUgZ2V0cyBzbWFsbGVyICovCisgICAgZWxzZQorCWZyID0gY3VyZnItPmZyX25leHQ7CS8qIG5leHQgZnJhbWUgZ2V0cyBzbWFsbGVyICovCisKKyAgICAvKgorICAgICAqIE5vdyBtYWtlIHRoZSBvdGhlciBmcmFtZXMgc21hbGxlci4KKyAgICAgKi8KKyAgICB3aGlsZSAoZnIgIT0gTlVMTCAmJiBvZmZzZXQgPiAwKQorICAgIHsKKwluID0gZnJhbWVfbWluaGVpZ2h0KGZyLCBOVUxMKTsKKwlpZiAoZnItPmZyX2hlaWdodCAtIG9mZnNldCA8PSBuKQorCXsKKwkgICAgb2Zmc2V0IC09IGZyLT5mcl9oZWlnaHQgLSBuOworCSAgICBmcmFtZV9uZXdfaGVpZ2h0KGZyLCBuLCAhdXAsIEZBTFNFKTsKKwl9CisJZWxzZQorCXsKKwkgICAgZnJhbWVfbmV3X2hlaWdodChmciwgZnItPmZyX2hlaWdodCAtIG9mZnNldCwgIXVwLCBGQUxTRSk7CisJICAgIGJyZWFrOworCX0KKwlpZiAodXApCisJICAgIGZyID0gZnItPmZyX3ByZXY7CisJZWxzZQorCSAgICBmciA9IGZyLT5mcl9uZXh0OworICAgIH0KKyAgICByb3cgPSB3aW5fY29tcF9wb3MoKTsKKyAgICBzY3JlZW5fZmlsbChyb3csIGNtZGxpbmVfcm93LCAwLCAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKyAgICBjbWRsaW5lX3JvdyA9IHJvdzsKKyAgICBwX2NoID0gUm93cyAtIGNtZGxpbmVfcm93OworICAgIGlmIChwX2NoIDwgMSkKKwlwX2NoID0gMTsKKyAgICByZWRyYXdfYWxsX2xhdGVyKE5PVF9WQUxJRCk7CisgICAgc2hvd21vZGUoKTsKK30KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKgorICogU2VwYXJhdG9yIGxpbmUgb2YgZHJhZ3dpbiBpcyBkcmFnZ2VkICJvZmZzZXQiIGxpbmVzIHJpZ2h0IChuZWdhdGl2ZSBpcyBsZWZ0KS4KKyAqLworICAgIHZvaWQKK3dpbl9kcmFnX3ZzZXBfbGluZShkcmFnd2luLCBvZmZzZXQpCisgICAgd2luX1QJKmRyYWd3aW47CisgICAgaW50CQlvZmZzZXQ7Cit7CisgICAgZnJhbWVfVAkqY3VyZnI7CisgICAgZnJhbWVfVAkqZnI7CisgICAgaW50CQlyb29tOworICAgIGludAkJbGVmdDsJLyogaWYgVFJVRSwgZHJhZyBzZXBhcmF0b3IgbGluZSBsZWZ0LCBvdGhlcndpc2UgcmlnaHQgKi8KKyAgICBpbnQJCW47CisKKyAgICBmciA9IGRyYWd3aW4tPndfZnJhbWU7CisgICAgaWYgKGZyID09IHRvcGZyYW1lKQkJLyogb25seSBvbmUgd2luZG93IChjYW5ub3QgaGFwcGU/KSAqLworCXJldHVybjsKKyAgICBjdXJmciA9IGZyOworICAgIGZyID0gZnItPmZyX3BhcmVudDsKKyAgICAvKiBXaGVuIHRoZSBwYXJlbnQgZnJhbWUgaXMgbm90IGEgcm93IG9mIGZyYW1lcywgaXRzIHBhcmVudCBzaG91bGQgYmUuICovCisgICAgaWYgKGZyLT5mcl9sYXlvdXQgIT0gRlJfUk9XKQorICAgIHsKKwlpZiAoZnIgPT0gdG9wZnJhbWUpCS8qIG9ubHkgYSBjb2x1bW4gb2Ygd2luZG93cyAoY2Fubm90IGhhcHBlbj8pICovCisJICAgIHJldHVybjsKKwljdXJmciA9IGZyOworCWZyID0gZnItPmZyX3BhcmVudDsKKyAgICB9CisKKyAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIGluIGEgcm93LCBtYXkgd2FudCB0byByZXNpemUgYSBwYXJlbnQKKyAgICAgKiBmcmFtZSBpbnN0ZWFkLiAqLworICAgIHdoaWxlIChjdXJmci0+ZnJfbmV4dCA9PSBOVUxMKQorICAgIHsKKwlpZiAoZnIgPT0gdG9wZnJhbWUpCisJICAgIGJyZWFrOworCWN1cmZyID0gZnI7CisJZnIgPSBmci0+ZnJfcGFyZW50OworCWlmIChmciAhPSB0b3BmcmFtZSkKKwl7CisJICAgIGN1cmZyID0gZnI7CisJICAgIGZyID0gZnItPmZyX3BhcmVudDsKKwl9CisgICAgfQorCisgICAgaWYgKG9mZnNldCA8IDApIC8qIGRyYWcgbGVmdCAqLworICAgIHsKKwlsZWZ0ID0gVFJVRTsKKwlvZmZzZXQgPSAtb2Zmc2V0OworCS8qIHN1bSB1cCB0aGUgcm9vbSBvZiB0aGUgY3VycmVudCBmcmFtZSBhbmQgbGVmdCBvZiBpdCAqLworCXJvb20gPSAwOworCWZvciAoZnIgPSBmci0+ZnJfY2hpbGQ7IDsgZnIgPSBmci0+ZnJfbmV4dCkKKwl7CisJICAgIHJvb20gKz0gZnItPmZyX3dpZHRoIC0gZnJhbWVfbWlud2lkdGgoZnIsIE5VTEwpOworCSAgICBpZiAoZnIgPT0gY3VyZnIpCisJCWJyZWFrOworCX0KKwlmciA9IGN1cmZyLT5mcl9uZXh0OwkJLyogcHV0IGZyIGF0IGZyYW1lIHRoYXQgZ3Jvd3MgKi8KKyAgICB9CisgICAgZWxzZSAgICAvKiBkcmFnIHJpZ2h0ICovCisgICAgeworCWxlZnQgPSBGQUxTRTsKKwkvKiBzdW0gdXAgdGhlIHJvb20gb2YgZnJhbWVzIHJpZ2h0IG9mIHRoZSBjdXJyZW50IG9uZSAqLworCXJvb20gPSAwOworCWZvciAoZnIgPSBjdXJmci0+ZnJfbmV4dDsgZnIgIT0gTlVMTDsgZnIgPSBmci0+ZnJfbmV4dCkKKwkgICAgcm9vbSArPSBmci0+ZnJfd2lkdGggLSBmcmFtZV9taW53aWR0aChmciwgTlVMTCk7CisJZnIgPSBjdXJmcjsJCQkvKiBwdXQgZnIgYXQgd2luZG93IHRoYXQgZ3Jvd3MgKi8KKyAgICB9CisKKyAgICBpZiAocm9vbSA8IG9mZnNldCkJCS8qIE5vdCBlbm91Z2ggcm9vbSAqLworCW9mZnNldCA9IHJvb207CQkvKiBNb3ZlIGFzIGZhciBhcyB3ZSBjYW4gKi8KKyAgICBpZiAob2Zmc2V0IDw9IDApCQkvKiBObyByb29tIGF0IGFsbCwgcXVpdC4gKi8KKwlyZXR1cm47CisKKyAgICAvKiBncm93IGZyYW1lIGZyIGJ5IG9mZnNldCBsaW5lcyAqLworICAgIGZyYW1lX25ld193aWR0aChmciwgZnItPmZyX3dpZHRoICsgb2Zmc2V0LCBsZWZ0KTsKKworICAgIC8qIHNocmluayBvdGhlciBmcmFtZXM6IGN1cnJlbnQgYW5kIGF0IHRoZSBsZWZ0IG9yIGF0IHRoZSByaWdodCAqLworICAgIGlmIChsZWZ0KQorCWZyID0gY3VyZnI7CQkvKiBjdXJyZW50IGZyYW1lIGdldHMgc21hbGxlciAqLworICAgIGVsc2UKKwlmciA9IGN1cmZyLT5mcl9uZXh0OwkvKiBuZXh0IGZyYW1lIGdldHMgc21hbGxlciAqLworCisgICAgd2hpbGUgKGZyICE9IE5VTEwgJiYgb2Zmc2V0ID4gMCkKKyAgICB7CisJbiA9IGZyYW1lX21pbndpZHRoKGZyLCBOVUxMKTsKKwlpZiAoZnItPmZyX3dpZHRoIC0gb2Zmc2V0IDw9IG4pCisJeworCSAgICBvZmZzZXQgLT0gZnItPmZyX3dpZHRoIC0gbjsKKwkgICAgZnJhbWVfbmV3X3dpZHRoKGZyLCBuLCAhbGVmdCk7CisJfQorCWVsc2UKKwl7CisJICAgIGZyYW1lX25ld193aWR0aChmciwgZnItPmZyX3dpZHRoIC0gb2Zmc2V0LCAhbGVmdCk7CisJICAgIGJyZWFrOworCX0KKwlpZiAobGVmdCkKKwkgICAgZnIgPSBmci0+ZnJfcHJldjsKKwllbHNlCisJICAgIGZyID0gZnItPmZyX25leHQ7CisgICAgfQorICAgICh2b2lkKXdpbl9jb21wX3BvcygpOworICAgIHJlZHJhd19hbGxfbGF0ZXIoTk9UX1ZBTElEKTsKK30KKyNlbmRpZiAvKiBGRUFUX1ZFUlRTUExJVCAqLworI2VuZGlmIC8qIEZFQVRfTU9VU0UgKi8KKworI2VuZGlmIC8qIEZFQVRfV0lORE9XUyAqLworCisvKgorICogU2V0IHRoZSBoZWlnaHQgb2YgYSB3aW5kb3cuCisgKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIHRoaW5ncyBpbnNpZGUgdGhlIHdpbmRvdywgbm90IHdoYXQgaGFwcGVucyB0byB0aGUKKyAqIHdpbmRvdyBwb3NpdGlvbiwgdGhlIGZyYW1lIG9yIHRvIG90aGVyIHdpbmRvd3MuCisgKi8KKyAgICBzdGF0aWMgdm9pZAord2luX25ld19oZWlnaHQod3AsIGhlaWdodCkKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQloZWlnaHQ7Cit7CisgICAgbGluZW5yX1QJbG51bTsKKyAgICBpbnQJCXNsaW5lLCBsaW5lX3NpemU7CisjZGVmaW5lIEZSQUNUSU9OX01VTFQJMTYzODRMCisKKyAgICAvKiBEb24ndCB3YW50IGEgbmVnYXRpdmUgaGVpZ2h0LiAgSGFwcGVucyB3aGVuIHNwbGl0dGluZyBhIHRpbnkgd2luZG93LgorICAgICAqIFdpbGwgZXF1YWxpemUgaGVpZ2h0cyBzb29uIHRvIGZpeCBpdC4gKi8KKyAgICBpZiAoaGVpZ2h0IDwgMCkKKwloZWlnaHQgPSAwOworCisgICAgaWYgKHdwLT53X3dyb3cgIT0gd3AtPndfcHJldl9mcmFjdGlvbl9yb3cgJiYgd3AtPndfaGVpZ2h0ID4gMCkKKwl3cC0+d19mcmFjdGlvbiA9ICgobG9uZyl3cC0+d193cm93ICogRlJBQ1RJT05fTVVMVAorCQkJCSAgICArIEZSQUNUSU9OX01VTFQgLyAyKSAvIChsb25nKXdwLT53X2hlaWdodDsKKworICAgIHdwLT53X2hlaWdodCA9IGhlaWdodDsKKyAgICB3cC0+d19za2lwY29sID0gMDsKKworICAgIC8qIERvbid0IGNoYW5nZSB3X3RvcGxpbmUgd2hlbiBoZWlnaHQgaXMgemVyby4gIERvbid0IHNldCB3X3RvcGxpbmUgd2hlbgorICAgICAqICdzY3JvbGxiaW5kJyBpcyBzZXQgYW5kIHRoaXMgaXNuJ3QgdGhlIGN1cnJlbnQgd2luZG93LiAqLworICAgIGlmIChoZWlnaHQgPiAwCisjaWZkZWYgRkVBVF9TQ1JPTExCSU5ECisJICAgICYmICghd3AtPndfcF9zY2IgfHwgd3AgPT0gY3Vyd2luKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKwlsbnVtID0gd3AtPndfY3Vyc29yLmxudW07CisJaWYgKGxudW0gPCAxKQkJLyogY2FuIGhhcHBlbiB3aGVuIHN0YXJ0aW5nIHVwICovCisJICAgIGxudW0gPSAxOworCXdwLT53X3dyb3cgPSAoKGxvbmcpd3AtPndfZnJhY3Rpb24gKiAobG9uZyloZWlnaHQgLSAxTCkgLyBGUkFDVElPTl9NVUxUOworCWxpbmVfc2l6ZSA9IHBsaW5lc193aW5fY29sKHdwLCBsbnVtLCAobG9uZykod3AtPndfY3Vyc29yLmNvbCkpIC0gMTsKKwlzbGluZSA9IHdwLT53X3dyb3cgLSBsaW5lX3NpemU7CisJaWYgKHNsaW5lIDwgMCkKKwl7CisJICAgIC8qCisJICAgICAqIEN1cnNvciBsaW5lIHdvdWxkIGdvIG9mZiB0b3Agb2Ygc2NyZWVuIGlmIHdfd3JvdyB3YXMgdGhpcyBoaWdoLgorCSAgICAgKi8KKwkgICAgd3AtPndfd3JvdyA9IGxpbmVfc2l6ZTsKKwl9CisJZWxzZQorCXsKKwkgICAgd2hpbGUgKHNsaW5lID4gMCAmJiBsbnVtID4gMSkKKwkgICAgeworI2lmZGVmIEZFQVRfRk9MRElORworCQloYXNGb2xkaW5nV2luKHdwLCBsbnVtLCAmbG51bSwgTlVMTCwgVFJVRSwgTlVMTCk7CisJCWlmIChsbnVtID09IDEpCisJCXsKKwkJICAgIC8qIGZpcnN0IGxpbmUgaW4gYnVmZmVyIGlzIGZvbGRlZCAqLworCQkgICAgbGluZV9zaXplID0gMTsKKwkJICAgIC0tc2xpbmU7CisJCSAgICBicmVhazsKKwkJfQorI2VuZGlmCisJCS0tbG51bTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJaWYgKGxudW0gPT0gd3AtPndfdG9wbGluZSkKKwkJICAgIGxpbmVfc2l6ZSA9IHBsaW5lc193aW5fbm9maWxsKHdwLCBsbnVtLCBUUlVFKQorCQkJCQkJCSAgICAgICsgd3AtPndfdG9wZmlsbDsKKwkJZWxzZQorI2VuZGlmCisJCSAgICBsaW5lX3NpemUgPSBwbGluZXNfd2luKHdwLCBsbnVtLCBUUlVFKTsKKwkJc2xpbmUgLT0gbGluZV9zaXplOworCSAgICB9CisJICAgIGlmIChzbGluZSA8IDApCisJICAgIHsKKwkJLyoKKwkJICogTGluZSB3ZSB3YW50IGF0IHRvcCB3b3VsZCBnbyBvZmYgdG9wIG9mIHNjcmVlbi4gIFVzZSBuZXh0CisJCSAqIGxpbmUgaW5zdGVhZC4KKwkJICovCisjaWZkZWYgRkVBVF9GT0xESU5HCisJCWhhc0ZvbGRpbmdXaW4od3AsIGxudW0sIE5VTEwsICZsbnVtLCBUUlVFLCBOVUxMKTsKKyNlbmRpZgorCQlsbnVtKys7CisJCXdwLT53X3dyb3cgLT0gbGluZV9zaXplICsgc2xpbmU7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoc2xpbmUgPiAwKQorCSAgICB7CisJCS8qIEZpcnN0IGxpbmUgb2YgZmlsZSByZWFjaGVkLCB1c2UgdGhhdCBhcyB0b3BsaW5lLiAqLworCQlsbnVtID0gMTsKKwkJd3AtPndfd3JvdyAtPSBzbGluZTsKKwkgICAgfQorCX0KKwlzZXRfdG9wbGluZSh3cCwgbG51bSk7CisgICAgfQorCisgICAgaWYgKHdwID09IGN1cndpbikKKyAgICB7CisJaWYgKHBfc28pCisJICAgIHVwZGF0ZV90b3BsaW5lKCk7CisJY3Vyc19jb2x1bW5zKEZBTFNFKTsJLyogdmFsaWRhdGUgd193cm93ICovCisgICAgfQorICAgIHdwLT53X3ByZXZfZnJhY3Rpb25fcm93ID0gd3AtPndfd3JvdzsKKworICAgIHdpbl9jb21wX3Njcm9sbCh3cCk7CisgICAgcmVkcmF3X3dpbl9sYXRlcih3cCwgTk9UX1ZBTElEKTsKKyNpZmRlZiBGRUFUX1dJTkRPV1MKKyAgICB3cC0+d19yZWRyX3N0YXR1cyA9IFRSVUU7CisjZW5kaWYKKyAgICBpbnZhbGlkYXRlX2JvdGxpbmVfd2luKHdwKTsKK30KKworI2lmZGVmIEZFQVRfVkVSVFNQTElUCisvKgorICogU2V0IHRoZSB3aWR0aCBvZiBhIHdpbmRvdy4KKyAqLworICAgIHN0YXRpYyB2b2lkCit3aW5fbmV3X3dpZHRoKHdwLCB3aWR0aCkKKyAgICB3aW5fVAkqd3A7CisgICAgaW50CQl3aWR0aDsKK3sKKyAgICB3cC0+d193aWR0aCA9IHdpZHRoOworICAgIHdwLT53X2xpbmVzX3ZhbGlkID0gMDsKKyAgICBjaGFuZ2VkX2xpbmVfYWJ2X2N1cnNfd2luKHdwKTsKKyAgICBpbnZhbGlkYXRlX2JvdGxpbmVfd2luKHdwKTsKKyAgICBpZiAod3AgPT0gY3Vyd2luKQorICAgIHsKKwl1cGRhdGVfdG9wbGluZSgpOworCWN1cnNfY29sdW1ucyhUUlVFKTsJLyogdmFsaWRhdGUgd193cm93ICovCisgICAgfQorICAgIHJlZHJhd193aW5fbGF0ZXIod3AsIE5PVF9WQUxJRCk7CisgICAgd3AtPndfcmVkcl9zdGF0dXMgPSBUUlVFOworfQorI2VuZGlmCisKKyAgICB2b2lkCit3aW5fY29tcF9zY3JvbGwod3ApCisgICAgd2luX1QJKndwOworeworICAgIHdwLT53X3Bfc2NyID0gKCh1bnNpZ25lZCl3cC0+d19oZWlnaHQgPj4gMSk7CisgICAgaWYgKHdwLT53X3Bfc2NyID09IDApCisJd3AtPndfcF9zY3IgPSAxOworfQorCisvKgorICogY29tbWFuZF9oZWlnaHQ6IGNhbGxlZCB3aGVuZXZlciBwX2NoIGhhcyBiZWVuIGNoYW5nZWQKKyAqLworICAgIHZvaWQKK2NvbW1hbmRfaGVpZ2h0KG9sZF9wX2NoKQorICAgIGxvbmcJb2xkX3BfY2g7Cit7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaW50CQloOworICAgIGZyYW1lX1QJKmZycDsKKworICAgIC8qIEZpbmQgYm90dG9tIGZyYW1lIHdpdGggd2lkdGggb2Ygc2NyZWVuLiAqLworICAgIGZycCA9IGxhc3R3aW4tPndfZnJhbWU7CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgd2hpbGUgKGZycC0+ZnJfd2lkdGggIT0gQ29sdW1ucyAmJiBmcnAtPmZyX3BhcmVudCAhPSBOVUxMKQorCWZycCA9IGZycC0+ZnJfcGFyZW50OworIyBlbmRpZgorCisgICAgLyogQXZvaWQgY2hhbmdpbmcgdGhlIGhlaWdodCBvZiBhIHdpbmRvdyB3aXRoICd3aW5maXhoZWlnaHQnIHNldC4gKi8KKyAgICB3aGlsZSAoZnJwLT5mcl9wcmV2ICE9IE5VTEwgJiYgZnJwLT5mcl9sYXlvdXQgPT0gRlJfTEVBRgorCQkJCQkJICAgICAgJiYgZnJwLT5mcl93aW4tPndfcF93ZmgpCisJZnJwID0gZnJwLT5mcl9wcmV2OworCisgICAgaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKKyAgICB7CisJY21kbGluZV9yb3cgPSBSb3dzIC0gcF9jaDsKKworCWlmIChwX2NoID4gb2xkX3BfY2gpCQkgICAgLyogcF9jaCBnb3QgYmlnZ2VyICovCisJeworCSAgICB3aGlsZSAocF9jaCA+IG9sZF9wX2NoKQorCSAgICB7CisJCWlmIChmcnAgPT0gTlVMTCkKKwkJeworCQkgICAgRU1TRyhfKGVfbm9yb29tKSk7CisJCSAgICBwX2NoID0gb2xkX3BfY2g7CisJCSAgICBjbWRsaW5lX3JvdyA9IFJvd3MgLSBwX2NoOworCQkgICAgYnJlYWs7CisJCX0KKwkJaCA9IGZycC0+ZnJfaGVpZ2h0IC0gZnJhbWVfbWluaGVpZ2h0KGZycCwgTlVMTCk7CisJCWlmIChoID4gcF9jaCAtIG9sZF9wX2NoKQorCQkgICAgaCA9IHBfY2ggLSBvbGRfcF9jaDsKKwkJb2xkX3BfY2ggKz0gaDsKKwkJZnJhbWVfYWRkX2hlaWdodChmcnAsIC1oKTsKKwkJZnJwID0gZnJwLT5mcl9wcmV2OworCSAgICB9CisKKwkgICAgLyogUmVjb21wdXRlIHdpbmRvdyBwb3NpdGlvbnMuICovCisJICAgICh2b2lkKXdpbl9jb21wX3BvcygpOworCisJICAgIC8qIGNsZWFyIHRoZSBsaW5lcyBhZGRlZCB0byBjbWRsaW5lICovCisJICAgIGlmIChmdWxsX3NjcmVlbikKKwkJc2NyZWVuX2ZpbGwoKGludCkoY21kbGluZV9yb3cpLCAoaW50KVJvd3MsIDAsCisJCQkJCQkgICAoaW50KUNvbHVtbnMsICcgJywgJyAnLCAwKTsKKwkgICAgbXNnX3JvdyA9IGNtZGxpbmVfcm93OworCSAgICByZWRyYXdfY21kbGluZSA9IFRSVUU7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAobXNnX3JvdyA8IGNtZGxpbmVfcm93KQorCSAgICBtc2dfcm93ID0gY21kbGluZV9yb3c7CisJcmVkcmF3X2NtZGxpbmUgPSBUUlVFOworICAgIH0KKyAgICBmcmFtZV9hZGRfaGVpZ2h0KGZycCwgKGludCkob2xkX3BfY2ggLSBwX2NoKSk7CisKKyAgICAvKiBSZWNvbXB1dGUgd2luZG93IHBvc2l0aW9ucy4gKi8KKyAgICBpZiAoZnJwICE9IGxhc3R3aW4tPndfZnJhbWUpCisJKHZvaWQpd2luX2NvbXBfcG9zKCk7CisjZWxzZQorICAgIHdpbl9zZXRoZWlnaHQoKGludCkoZmlyc3R3aW4tPndfaGVpZ2h0ICsgb2xkX3BfY2ggLSBwX2NoKSk7CisgICAgY21kbGluZV9yb3cgPSBSb3dzIC0gcF9jaDsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmVzaXplIGZyYW1lICJmcnAiIHRvIGJlICJuIiBsaW5lcyBoaWdoZXIgKG5lZ2F0aXZlIGZvciBsZXNzIGhpZ2gpLgorICogQWxzbyByZXNpemUgdGhlIGZyYW1lcyBpdCBpcyBjb250YWluZWQgaW4uCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZnJhbWVfYWRkX2hlaWdodChmcnAsIG4pCisgICAgZnJhbWVfVAkqZnJwOworICAgIGludAkJbjsKK3sKKyAgICBmcmFtZV9uZXdfaGVpZ2h0KGZycCwgZnJwLT5mcl9oZWlnaHQgKyBuLCBGQUxTRSwgRkFMU0UpOworICAgIGZvciAoOzspCisgICAgeworCWZycCA9IGZycC0+ZnJfcGFyZW50OworCWlmIChmcnAgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJZnJwLT5mcl9oZWlnaHQgKz0gbjsKKyAgICB9Cit9CisKKy8qCisgKiBBZGQgb3IgcmVtb3ZlIGEgc3RhdHVzIGxpbmUgZm9yIHRoZSBib3R0b20gd2luZG93KHMpLCBhY2NvcmRpbmcgdG8gdGhlCisgKiB2YWx1ZSBvZiAnbGFzdHN0YXR1cycuCisgKi8KKyAgICB2b2lkCitsYXN0X3N0YXR1cyhtb3Jld2luKQorICAgIGludAkJbW9yZXdpbjsJLyogcHJldGVuZCB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgd2luZG93cyAqLworeworICAgIC8qIERvbid0IG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzcGxpdC4gKi8KKyAgICBsYXN0X3N0YXR1c19yZWModG9wZnJhbWUsIChwX2xzID09IDIKKwkJCSAgfHwgKHBfbHMgPT0gMSAmJiAobW9yZXdpbiB8fCBsYXN0d2luICE9IGZpcnN0d2luKSkpKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitsYXN0X3N0YXR1c19yZWMoZnIsIHN0YXR1c2xpbmUpCisgICAgZnJhbWVfVAkqZnI7CisgICAgaW50CQlzdGF0dXNsaW5lOworeworICAgIGZyYW1lX1QJKmZwOworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChmci0+ZnJfbGF5b3V0ID09IEZSX0xFQUYpCisgICAgeworCXdwID0gZnItPmZyX3dpbjsKKwlpZiAod3AtPndfc3RhdHVzX2hlaWdodCAhPSAwICYmICFzdGF0dXNsaW5lKQorCXsKKwkgICAgLyogcmVtb3ZlIHN0YXR1cyBsaW5lICovCisJICAgIHdpbl9uZXdfaGVpZ2h0KHdwLCB3cC0+d19oZWlnaHQgKyAxKTsKKwkgICAgd3AtPndfc3RhdHVzX2hlaWdodCA9IDA7CisJICAgIGNvbXBfY29sKCk7CisJfQorCWVsc2UgaWYgKHdwLT53X3N0YXR1c19oZWlnaHQgPT0gMCAmJiBzdGF0dXNsaW5lKQorCXsKKwkgICAgLyogRmluZCBhIGZyYW1lIHRvIHRha2UgYSBsaW5lIGZyb20uICovCisJICAgIGZwID0gZnI7CisJICAgIHdoaWxlIChmcC0+ZnJfaGVpZ2h0IDw9IGZyYW1lX21pbmhlaWdodChmcCwgTlVMTCkpCisJICAgIHsKKwkJaWYgKGZwID09IHRvcGZyYW1lKQorCQl7CisJCSAgICBFTVNHKF8oZV9ub3Jvb20pKTsKKwkJICAgIHJldHVybjsKKwkJfQorCQkvKiBJbiBhIGNvbHVtbiBvZiBmcmFtZXM6IGdvIHRvIGZyYW1lIGFib3ZlLiAgSWYgYWxyZWFkeSBhdAorCQkgKiB0aGUgdG9wIG9yIGluIGEgcm93IG9mIGZyYW1lczogZ28gdG8gcGFyZW50LiAqLworCQlpZiAoZnAtPmZyX3BhcmVudC0+ZnJfbGF5b3V0ID09IEZSX0NPTCAmJiBmcC0+ZnJfcHJldiAhPSBOVUxMKQorCQkgICAgZnAgPSBmcC0+ZnJfcHJldjsKKwkJZWxzZQorCQkgICAgZnAgPSBmcC0+ZnJfcGFyZW50OworCSAgICB9CisJICAgIHdwLT53X3N0YXR1c19oZWlnaHQgPSAxOworCSAgICBpZiAoZnAgIT0gZnIpCisJICAgIHsKKwkJZnJhbWVfbmV3X2hlaWdodChmcCwgZnAtPmZyX2hlaWdodCAtIDEsIEZBTFNFLCBGQUxTRSk7CisJCWZyYW1lX2ZpeF9oZWlnaHQod3ApOworCQkodm9pZCl3aW5fY29tcF9wb3MoKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXdpbl9uZXdfaGVpZ2h0KHdwLCB3cC0+d19oZWlnaHQgLSAxKTsKKwkgICAgY29tcF9jb2woKTsKKwkgICAgcmVkcmF3X2FsbF9sYXRlcihOT1RfVkFMSUQpOworCX0KKyAgICB9CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBlbHNlIGlmIChmci0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKyAgICB7CisJLyogdmVydGljYWxseSBzcGxpdCB3aW5kb3dzLCBzZXQgc3RhdHVzIGxpbmUgZm9yIGVhY2ggb25lICovCisJZm9yIChmcCA9IGZyLT5mcl9jaGlsZDsgZnAgIT0gTlVMTDsgZnAgPSBmcC0+ZnJfbmV4dCkKKwkgICAgbGFzdF9zdGF0dXNfcmVjKGZwLCBzdGF0dXNsaW5lKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgeworCS8qIGhvcml6b250YWxseSBzcGxpdCB3aW5kb3csIHNldCBzdGF0dXMgbGluZSBmb3IgbGFzdCBvbmUgKi8KKwlmb3IgKGZwID0gZnItPmZyX2NoaWxkOyBmcC0+ZnJfbmV4dCAhPSBOVUxMOyBmcCA9IGZwLT5mcl9uZXh0KQorCSAgICA7CisJbGFzdF9zdGF0dXNfcmVjKGZwLCBzdGF0dXNsaW5lKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBGRUFUX1dJTkRPV1MgKi8KKworI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKSB8fCBkZWZpbmVkKFBST1RPKQorLyoKKyAqIFJldHVybiB0aGUgZmlsZSBuYW1lIHVuZGVyIG9yIGFmdGVyIHRoZSBjdXJzb3IuCisgKgorICogVGhlICdwYXRoJyBvcHRpb24gaXMgc2VhcmNoZWQgaWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgYWJzb2x1dGUuCisgKiBUaGUgc3RyaW5nIHJldHVybmVkIGhhcyBiZWVuIGFsbG9jJ2VkIGFuZCBzaG91bGQgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIGZpbGUgbmFtZSBvciBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBvcHRpb25zOgorICogRk5BTUVfTUVTUwkgICAgZ2l2ZSBlcnJvciBtZXNzYWdlcworICogRk5BTUVfRVhQCSAgICBleHBhbmQgdG8gcGF0aAorICogRk5BTUVfSFlQCSAgICBjaGVjayBmb3IgaHlwZXJ0ZXh0IGxpbmsKKyAqIEZOQU1FX0lOQ0wJICAgIGFwcGx5ICJpbmNsdWRlZXhwciIKKyAqLworICAgIGNoYXJfdSAqCitmaWxlX25hbWVfYXRfY3Vyc29yKG9wdGlvbnMsIGNvdW50KQorICAgIGludAkgICAgb3B0aW9uczsKKyAgICBsb25nICAgIGNvdW50OworeworICAgIHJldHVybiBmaWxlX25hbWVfaW5fbGluZShtbF9nZXRfY3VybGluZSgpLAorCQkgICAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCwgb3B0aW9ucywgY291bnQsIGN1cmJ1Zi0+Yl9mZm5hbWUpOworfQorCisvKgorICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHVuZGVyIG9yIGFmdGVyIHB0cltjb2xdLgorICogT3RoZXJ3aXNlIGxpa2UgZmlsZV9uYW1lX2F0X2N1cnNvcigpLgorICovCisgICAgY2hhcl91ICoKK2ZpbGVfbmFtZV9pbl9saW5lKGxpbmUsIGNvbCwgb3B0aW9ucywgY291bnQsIHJlbF9mbmFtZSkKKyAgICBjaGFyX3UJKmxpbmU7CisgICAgaW50CQljb2w7CisgICAgaW50CQlvcHRpb25zOworICAgIGxvbmcJY291bnQ7CisgICAgY2hhcl91CSpyZWxfZm5hbWU7CS8qIGZpbGUgd2UgYXJlIHNlYXJjaGluZyByZWxhdGl2ZSB0byAqLworeworICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJbGVuOworCisgICAgLyoKKyAgICAgKiBzZWFyY2ggZm9yd2FyZCBmb3Igd2hhdCBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdHIgPSBsaW5lICsgY29sOworICAgIHdoaWxlICgqcHRyICE9IE5VTCAmJiAhdmltX2lzZmlsZWMoKnB0cikpCisJKytwdHI7CisgICAgaWYgKCpwdHIgPT0gTlVMKQkJLyogbm90aGluZyBmb3VuZCAqLworICAgIHsKKwlpZiAob3B0aW9ucyAmIEZOQU1FX01FU1MpCisJICAgIEVNU0coXygiRTQ0NjogTm8gZmlsZSBuYW1lIHVuZGVyIGN1cnNvciIpKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlYXJjaCBiYWNrd2FyZCBmb3IgZmlyc3QgY2hhciBvZiB0aGUgZmlsZSBuYW1lLgorICAgICAqIEdvIG9uZSBjaGFyIGJhY2sgdG8gIjoiIGJlZm9yZSAiLy8iIGV2ZW4gd2hlbiAnOicgaXMgbm90IGluICdpc2ZuYW1lJy4KKyAgICAgKi8KKyAgICB3aGlsZSAocHRyID4gbGluZSkKKyAgICB7CisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUgJiYgKGxlbiA9ICgqbWJfaGVhZF9vZmYpKGxpbmUsIHB0ciAtIDEpKSA+IDApCisJICAgIHB0ciAtPSBsZW4gKyAxOworCWVsc2UKKyNlbmRpZgorCWlmICh2aW1faXNmaWxlYyhwdHJbLTFdKQorCQl8fCAoKG9wdGlvbnMgJiBGTkFNRV9IWVApICYmIHBhdGhfaXNfdXJsKHB0ciAtIDEpKSkKKwkgICAgLS1wdHI7CisJZWxzZQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlYXJjaCBmb3J3YXJkIGZvciB0aGUgbGFzdCBjaGFyIG9mIHRoZSBmaWxlIG5hbWUuCisgICAgICogQWxzbyBhbGxvdyAiOi8vIiB3aGVuICc6JyBpcyBub3QgaW4gJ2lzZm5hbWUnLgorICAgICAqLworICAgIGxlbiA9IDA7CisgICAgd2hpbGUgKHZpbV9pc2ZpbGVjKHB0cltsZW5dKQorCQkJIHx8ICgob3B0aW9ucyAmIEZOQU1FX0hZUCkgJiYgcGF0aF9pc191cmwocHRyICsgbGVuKSkpCisjaWZkZWYgRkVBVF9NQllURQorCWlmIChoYXNfbWJ5dGUpCisJICAgIGxlbiArPSAoKm1iX3B0cjJsZW5fY2hlY2spKHB0ciArIGxlbik7CisJZWxzZQorI2VuZGlmCisJICAgICsrbGVuOworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSBpcyB0cmFpbGluZyBwdW5jdHVhdGlvbiwgcmVtb3ZlIGl0LgorICAgICAqIEJ1dCBkb24ndCByZW1vdmUgIi4uIiwgY291bGQgYmUgYSBkaXJlY3RvcnkgbmFtZS4KKyAgICAgKi8KKyAgICBpZiAobGVuID4gMiAmJiB2aW1fc3RyY2hyKChjaGFyX3UgKikiLiw6OyEiLCBwdHJbbGVuIC0gMV0pICE9IE5VTEwKKwkJCQkJCSAgICAgICAmJiBwdHJbbGVuIC0gMl0gIT0gJy4nKQorCS0tbGVuOworCisgICAgcmV0dXJuIGZpbmRfZmlsZV9uYW1lX2luX3BhdGgocHRyLCBsZW4sIG9wdGlvbnMsIGNvdW50LCByZWxfZm5hbWUpOworfQorCisjIGlmIGRlZmluZWQoRkVBVF9GSU5EX0lEKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKK3N0YXRpYyBjaGFyX3UgKmV2YWxfaW5jbHVkZWV4cHIgX19BUkdTKChjaGFyX3UgKnB0ciwgaW50IGxlbikpOworCisgICAgc3RhdGljIGNoYXJfdSAqCitldmFsX2luY2x1ZGVleHByKHB0ciwgbGVuKQorICAgIGNoYXJfdQkqcHRyOworICAgIGludAkJbGVuOworeworICAgIGNoYXJfdQkqcmVzOworCisgICAgc2V0X3ZpbV92YXJfc3RyaW5nKFZWX0ZOQU1FLCBwdHIsIGxlbik7CisgICAgcmVzID0gZXZhbF90b19zdHJpbmdfc2FmZShjdXJidWYtPmJfcF9pbmV4LCBOVUxMKTsKKyAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfRk5BTUUsIE5VTEwsIDApOworICAgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZSBwdHJbbGVuXSBpbiAncGF0aCcuCisgKiBPdGhlcndpc2UgbGlrZSBmaWxlX25hbWVfYXRfY3Vyc29yKCkuCisgKi8KKyAgICBjaGFyX3UgKgorZmluZF9maWxlX25hbWVfaW5fcGF0aChwdHIsIGxlbiwgb3B0aW9ucywgY291bnQsIHJlbF9mbmFtZSkKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCW9wdGlvbnM7CisgICAgbG9uZwljb3VudDsKKyAgICBjaGFyX3UJKnJlbF9mbmFtZTsJLyogZmlsZSB3ZSBhcmUgc2VhcmNoaW5nIHJlbGF0aXZlIHRvICovCit7CisgICAgY2hhcl91CSpmaWxlX25hbWU7CisgICAgaW50CQljOworIyBpZiBkZWZpbmVkKEZFQVRfRklORF9JRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisgICAgY2hhcl91CSp0b2ZyZWUgPSBOVUxMOworCisgICAgaWYgKChvcHRpb25zICYgRk5BTUVfSU5DTCkgJiYgKmN1cmJ1Zi0+Yl9wX2luZXggIT0gTlVMKQorICAgIHsKKwl0b2ZyZWUgPSBldmFsX2luY2x1ZGVleHByKHB0ciwgbGVuKTsKKwlpZiAodG9mcmVlICE9IE5VTEwpCisJeworCSAgICBwdHIgPSB0b2ZyZWU7CisJICAgIGxlbiA9IChpbnQpU1RSTEVOKHB0cik7CisJfQorICAgIH0KKyMgZW5kaWYKKworICAgIGlmIChvcHRpb25zICYgRk5BTUVfRVhQKQorICAgIHsKKwlmaWxlX25hbWUgPSBmaW5kX2ZpbGVfaW5fcGF0aChwdHIsIGxlbiwgb3B0aW9ucyAmIH5GTkFNRV9NRVNTLAorCQkJCQkJCSAgICAgVFJVRSwgcmVsX2ZuYW1lKTsKKworIyBpZiBkZWZpbmVkKEZFQVRfRklORF9JRCkgJiYgZGVmaW5lZChGRUFUX0VWQUwpCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgaW4gYSBub3JtYWwgd2F5LCB0cnkgYXBwbHlpbmcKKwkgKiAnaW5jbHVkZWV4cHInICh1bmxlc3MgZG9uZSBhbHJlYWR5KS4KKwkgKi8KKwlpZiAoZmlsZV9uYW1lID09IE5VTEwKKwkJJiYgIShvcHRpb25zICYgRk5BTUVfSU5DTCkgJiYgKmN1cmJ1Zi0+Yl9wX2luZXggIT0gTlVMKQorCXsKKwkgICAgdG9mcmVlID0gZXZhbF9pbmNsdWRlZXhwcihwdHIsIGxlbik7CisJICAgIGlmICh0b2ZyZWUgIT0gTlVMTCkKKwkgICAgeworCQlwdHIgPSB0b2ZyZWU7CisJCWxlbiA9IChpbnQpU1RSTEVOKHB0cik7CisJCWZpbGVfbmFtZSA9IGZpbmRfZmlsZV9pbl9wYXRoKHB0ciwgbGVuLCBvcHRpb25zICYgfkZOQU1FX01FU1MsCisJCQkJCQkJICAgICBUUlVFLCByZWxfZm5hbWUpOworCSAgICB9CisJfQorIyBlbmRpZgorCWlmIChmaWxlX25hbWUgPT0gTlVMTCAmJiAob3B0aW9ucyAmIEZOQU1FX01FU1MpKQorCXsKKwkgICAgYyA9IHB0cltsZW5dOworCSAgICBwdHJbbGVuXSA9IE5VTDsKKwkgICAgRU1TRzIoXygiRTQ0NzogQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiBpbiBwYXRoIiksIHB0cik7CisJICAgIHB0cltsZW5dID0gYzsKKwl9CisKKwkvKiBSZXBlYXQgZmluZGluZyB0aGUgZmlsZSAiY291bnQiIHRpbWVzLiAgVGhpcyBtYXR0ZXJzIHdoZW4gaXQKKwkgKiBhcHBlYXJzIHNldmVyYWwgdGltZXMgaW4gdGhlIHBhdGguICovCisJd2hpbGUgKGZpbGVfbmFtZSAhPSBOVUxMICYmIC0tY291bnQgPiAwKQorCXsKKwkgICAgdmltX2ZyZWUoZmlsZV9uYW1lKTsKKwkgICAgZmlsZV9uYW1lID0gZmluZF9maWxlX2luX3BhdGgocHRyLCBsZW4sIG9wdGlvbnMsIEZBTFNFLCByZWxfZm5hbWUpOworCX0KKyAgICB9CisgICAgZWxzZQorCWZpbGVfbmFtZSA9IHZpbV9zdHJuc2F2ZShwdHIsIGxlbik7CisKKyMgaWYgZGVmaW5lZChGRUFUX0ZJTkRfSUQpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorICAgIHZpbV9mcmVlKHRvZnJlZSk7CisjIGVuZGlmCisKKyAgICByZXR1cm4gZmlsZV9uYW1lOworfQorI2VuZGlmIC8qIEZFQVRfU0VBUkNIUEFUSCAqLworCisvKgorICogQ2hlY2sgaWYgdGhlICI6Ly8iIG9mIGEgVVJMIGlzIGF0IHRoZSBwb2ludGVyLCByZXR1cm4gVVJMX1NMQVNILgorICogQWxzbyBjaGVjayBmb3IgIjpcXCIsIHdoaWNoIE1TIEludGVybmV0IEV4cGxvcmVyIGFjY2VwdHMsIHJldHVybgorICogVVJMX0JBQ0tTTEFTSC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3BhdGhfaXNfdXJsKHApCisgICAgY2hhcl91ICAqcDsKK3sKKyAgICBpZiAoU1RSTkNNUChwLCAiOi8vIiwgKHNpemVfdCkzKSA9PSAwKQorCXJldHVybiBVUkxfU0xBU0g7CisgICAgZWxzZSBpZiAoU1RSTkNNUChwLCAiOlxcXFwiLCAoc2l6ZV90KTMpID09IDApCisJcmV0dXJuIFVSTF9CQUNLU0xBU0g7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiAiZm5hbWUiIHN0YXJ0cyB3aXRoICJuYW1lOi8vIi4gIFJldHVybiBVUkxfU0xBU0ggaWYgaXQgZG9lcy4KKyAqIFJldHVybiBVUkxfQkFDS1NMQVNIIGZvciAibmFtZTpcXCIuCisgKiBSZXR1cm4gemVybyBvdGhlcndpc2UuCisgKi8KKyAgICBpbnQKK3BhdGhfd2l0aF91cmwoZm5hbWUpCisgICAgY2hhcl91ICpmbmFtZTsKK3sKKyAgICBjaGFyX3UgKnA7CisKKyAgICBmb3IgKHAgPSBmbmFtZTsgaXNhbHBoYSgqcCk7ICsrcCkKKwk7CisgICAgcmV0dXJuIHBhdGhfaXNfdXJsKHApOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgIm5hbWUiIGlzIGEgZnVsbCAoYWJzb2x1dGUpIHBhdGggbmFtZSBvciBVUkwuCisgKi8KKyAgICBpbnQKK3ZpbV9pc0Fic05hbWUobmFtZSkKKyAgICBjaGFyX3UJKm5hbWU7Cit7CisgICAgcmV0dXJuIChwYXRoX3dpdGhfdXJsKG5hbWUpICE9IDAgfHwgbWNoX2lzRnVsbE5hbWUobmFtZSkpOworfQorCisvKgorICogR2V0IGFic29sdXRlIGZpbGUgbmFtZSBpbnRvIGJ1ZmZlciAnYnVmJyBvZiBsZW5ndGggJ2xlbicgYnl0ZXMuCisgKgorICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQorICovCisgICAgaW50Cit2aW1fRnVsbE5hbWUoZm5hbWUsIGJ1ZiwgbGVuLCBmb3JjZSkKKyAgICBjaGFyX3UJKmZuYW1lLCAqYnVmOworICAgIGludAkJbGVuOworICAgIGludAkJZm9yY2U7Cit7CisgICAgaW50CQlyZXR2YWwgPSBPSzsKKyAgICBpbnQJCXVybDsKKworICAgICpidWYgPSBOVUw7CisgICAgaWYgKGZuYW1lID09IE5VTEwpCisJcmV0dXJuIEZBSUw7CisKKyAgICB1cmwgPSBwYXRoX3dpdGhfdXJsKGZuYW1lKTsKKyAgICBpZiAoIXVybCkKKwlyZXR2YWwgPSBtY2hfRnVsbE5hbWUoZm5hbWUsIGJ1ZiwgbGVuLCBmb3JjZSk7CisgICAgaWYgKHVybCB8fCByZXR2YWwgPT0gRkFJTCkKKyAgICB7CisJLyogc29tZXRoaW5nIGZhaWxlZDsgdXNlIHRoZSBmaWxlIG5hbWUgKHRydW5jYXRlIHdoZW4gdG9vIGxvbmcpICovCisJU1RSTkNQWShidWYsIGZuYW1lLCBsZW4pOworCWJ1ZltsZW4gLSAxXSA9IE5VTDsKKyAgICB9CisjaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyAgICBzbGFzaF9hZGp1c3QoYnVmKTsKKyNlbmRpZgorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG1pbmltYWwgbnVtYmVyIG9mIHJvd3MgdGhhdCBpcyBuZWVkZWQgb24gdGhlIHNjcmVlbiB0byBkaXNwbGF5CisgKiB0aGUgY3VycmVudCBudW1iZXIgb2Ygd2luZG93cy4KKyAqLworICAgIGludAorbWluX3Jvd3MoKQoreworICAgIGludAkJdG90YWw7CisKKyAgICBpZiAoZmlyc3R3aW4gPT0gTlVMTCkJLyogbm90IGluaXRpYWxpemVkIHlldCAqLworCXJldHVybiBNSU5fTElORVM7CisKKyAgICB0b3RhbCA9IDE7CQkvKiBjb3VudCB0aGUgcm9vbSBmb3IgdGhlIGNvbW1hbmQgbGluZSAqLworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIHRvdGFsICs9IGZyYW1lX21pbmhlaWdodCh0b3BmcmFtZSwgTlVMTCk7CisjZWxzZQorICAgIHRvdGFsICs9IDE7CQkvKiBhdCBsZWFzdCBvbmUgd2luZG93IHNob3VsZCBoYXZlIGEgbGluZSEgKi8KKyNlbmRpZgorICAgIHJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIGlmIHRoZXJlIGlzIG9ubHkgb25lIHdpbmRvdywgbm90IGNvdW50aW5nIGEgaGVscCBvciBwcmV2aWV3CisgKiB3aW5kb3csIHVubGVzcyBpdCBpcyB0aGUgY3VycmVudCB3aW5kb3cuCisgKi8KKyAgICBpbnQKK29ubHlfb25lX3dpbmRvdygpCit7CisjaWZkZWYgRkVBVF9XSU5ET1dTCisgICAgaW50CQljb3VudCA9IDA7CisgICAgd2luX1QJKndwOworCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT53X25leHQpCisJaWYgKCEod3AtPndfYnVmZmVyLT5iX2hlbHAKKyMgaWZkZWYgRkVBVF9RVUlDS0ZJWAorCQkgICAgfHwgd3AtPndfcF9wdncKKyMgZW5kaWYKKwkgICAgICkgfHwgd3AgPT0gY3Vyd2luKQorCSAgICArK2NvdW50OworICAgIHJldHVybiAoY291bnQgPD0gMSk7CisjZWxzZQorICAgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChGRUFUX0FVVE9DTUQpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ29ycmVjdCB0aGUgY3Vyc29yIGxpbmUgbnVtYmVyIGluIG90aGVyIHdpbmRvd3MuICBVc2VkIGFmdGVyIGNoYW5naW5nIHRoZQorICogY3VycmVudCBidWZmZXIsIGFuZCBiZWZvcmUgYXBwbHlpbmcgYXV0b2NvbW1hbmRzLgorICogV2hlbiAiZG9fY3Vyd2luIiBpcyBUUlVFLCBhbHNvIGNoZWNrIGN1cnJlbnQgd2luZG93LgorICovCisgICAgdm9pZAorY2hlY2tfbG51bXMoZG9fY3Vyd2luKQorICAgIGludAkJZG9fY3Vyd2luOworeworICAgIHdpbl9UCSp3cDsKKworI2lmZGVmIEZFQVRfV0lORE9XUworICAgIGZvciAod3AgPSBmaXJzdHdpbjsgd3AgIT0gTlVMTDsgd3AgPSB3cC0+d19uZXh0KQorCWlmICgoZG9fY3Vyd2luIHx8IHdwICE9IGN1cndpbikgJiYgd3AtPndfYnVmZmVyID09IGN1cmJ1ZikKKyNlbHNlCisgICAgd3AgPSBjdXJ3aW47CisgICAgaWYgKGRvX2N1cndpbikKKyNlbmRpZgorCXsKKwkgICAgaWYgKHdwLT53X2N1cnNvci5sbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCXdwLT53X2N1cnNvci5sbnVtID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisJICAgIGlmICh3cC0+d190b3BsaW5lID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCisJCXdwLT53X3RvcGxpbmUgPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudDsKKwl9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSB8fCBkZWZpbmVkKFBST1RPKQorCisvKgorICogQSBzbmFwc2hvdCBvZiB0aGUgd2luZG93IHNpemVzLCB0byByZXN0b3JlIHRoZW0gYWZ0ZXIgY2xvc2luZyB0aGUgaGVscAorICogd2luZG93LgorICogT25seSB0aGVzZSBmaWVsZHMgYXJlIHVzZWQ6CisgKiBmcl9sYXlvdXQKKyAqIGZyX3dpZHRoCisgKiBmcl9oZWlnaHQKKyAqIGZyX25leHQKKyAqIGZyX2NoaWxkCisgKiBmcl93aW4gKG9ubHkgdmFsaWQgZm9yIHRoZSBvbGQgY3Vyd2luLCBOVUxMIG90aGVyd2lzZSkKKyAqLworc3RhdGljIGZyYW1lX1QgKnNuYXBzaG90ID0gTlVMTDsKKworLyoKKyAqIENyZWF0ZSBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGZyYW1lIHNpemVzLgorICovCisgICAgc3RhdGljIHZvaWQKK21ha2Vfc25hcHNob3QoKQoreworICAgIGNsZWFyX3NuYXBzaG90KCk7CisgICAgbWFrZV9zbmFwc2hvdF9yZWModG9wZnJhbWUsICZzbmFwc2hvdCk7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorbWFrZV9zbmFwc2hvdF9yZWMoZnIsIGZycCkKKyAgICBmcmFtZV9UCSpmcjsKKyAgICBmcmFtZV9UCSoqZnJwOworeworICAgICpmcnAgPSAoZnJhbWVfVCAqKWFsbG9jX2NsZWFyKCh1bnNpZ25lZClzaXplb2YoZnJhbWVfVCkpOworICAgIGlmICgqZnJwID09IE5VTEwpCisJcmV0dXJuOworICAgICgqZnJwKS0+ZnJfbGF5b3V0ID0gZnItPmZyX2xheW91dDsKKyMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICAoKmZycCktPmZyX3dpZHRoID0gZnItPmZyX3dpZHRoOworIyBlbmRpZgorICAgICgqZnJwKS0+ZnJfaGVpZ2h0ID0gZnItPmZyX2hlaWdodDsKKyAgICBpZiAoZnItPmZyX25leHQgIT0gTlVMTCkKKwltYWtlX3NuYXBzaG90X3JlYyhmci0+ZnJfbmV4dCwgJigoKmZycCktPmZyX25leHQpKTsKKyAgICBpZiAoZnItPmZyX2NoaWxkICE9IE5VTEwpCisJbWFrZV9zbmFwc2hvdF9yZWMoZnItPmZyX2NoaWxkLCAmKCgqZnJwKS0+ZnJfY2hpbGQpKTsKKyAgICBpZiAoZnItPmZyX2xheW91dCA9PSBGUl9MRUFGICYmIGZyLT5mcl93aW4gPT0gY3Vyd2luKQorCSgqZnJwKS0+ZnJfd2luID0gY3Vyd2luOworfQorCisvKgorICogUmVtb3ZlIGFueSBleGlzdGluZyBzbmFwc2hvdC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjbGVhcl9zbmFwc2hvdCgpCit7CisgICAgY2xlYXJfc25hcHNob3RfcmVjKHNuYXBzaG90KTsKKyAgICBzbmFwc2hvdCA9IE5VTEw7Cit9CisKKyAgICBzdGF0aWMgdm9pZAorY2xlYXJfc25hcHNob3RfcmVjKGZyKQorICAgIGZyYW1lX1QJKmZyOworeworICAgIGlmIChmciAhPSBOVUxMKQorICAgIHsKKwljbGVhcl9zbmFwc2hvdF9yZWMoZnItPmZyX25leHQpOworCWNsZWFyX3NuYXBzaG90X3JlYyhmci0+ZnJfY2hpbGQpOworCXZpbV9mcmVlKGZyKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXN0b3JlIGEgcHJldmlvdXNseSBjcmVhdGVkIHNuYXBzaG90LCBpZiB0aGVyZSBpcyBhbnkuCisgKiBUaGlzIGlzIG9ubHkgZG9uZSBpZiB0aGUgc2NyZWVuIHNpemUgZGlkbid0IGNoYW5nZSBhbmQgdGhlIHdpbmRvdyBsYXlvdXQgaXMKKyAqIHN0aWxsIHRoZSBzYW1lLgorICovCisgICAgc3RhdGljIHZvaWQKK3Jlc3RvcmVfc25hcHNob3QoY2xvc2VfY3Vyd2luKQorICAgIGludAkJY2xvc2VfY3Vyd2luOwkgICAgLyogY2xvc2luZyBjdXJyZW50IHdpbmRvdyAqLworeworICAgIHdpbl9UCSp3cDsKKworICAgIGlmIChzbmFwc2hvdCAhPSBOVUxMCisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisJICAgICYmIHNuYXBzaG90LT5mcl93aWR0aCA9PSB0b3BmcmFtZS0+ZnJfd2lkdGgKKyMgZW5kaWYKKwkgICAgJiYgc25hcHNob3QtPmZyX2hlaWdodCA9PSB0b3BmcmFtZS0+ZnJfaGVpZ2h0CisJICAgICYmIGNoZWNrX3NuYXBzaG90X3JlYyhzbmFwc2hvdCwgdG9wZnJhbWUpID09IE9LKQorICAgIHsKKwl3cCA9IHJlc3RvcmVfc25hcHNob3RfcmVjKHNuYXBzaG90LCB0b3BmcmFtZSk7CisJd2luX2NvbXBfcG9zKCk7CisJaWYgKHdwICE9IE5VTEwgJiYgY2xvc2VfY3Vyd2luKQorCSAgICB3aW5fZ290byh3cCk7CisJcmVkcmF3X2FsbF9sYXRlcihDTEVBUik7CisgICAgfQorICAgIGNsZWFyX3NuYXBzaG90KCk7Cit9CisKKy8qCisgKiBDaGVjayBpZiBmcmFtZXMgInNuIiBhbmQgImZyIiBoYXZlIHRoZSBzYW1lIGxheW91dCwgc2FtZSBmb2xsb3dpbmcgZnJhbWVzCisgKiBhbmQgc2FtZSBjaGlsZHJlbi4KKyAqLworICAgIHN0YXRpYyBpbnQKK2NoZWNrX3NuYXBzaG90X3JlYyhzbiwgZnIpCisgICAgZnJhbWVfVAkqc247CisgICAgZnJhbWVfVAkqZnI7Cit7CisgICAgaWYgKHNuLT5mcl9sYXlvdXQgIT0gZnItPmZyX2xheW91dAorCSAgICB8fCAoc24tPmZyX25leHQgPT0gTlVMTCkgIT0gKGZyLT5mcl9uZXh0ID09IE5VTEwpCisJICAgIHx8IChzbi0+ZnJfY2hpbGQgPT0gTlVMTCkgIT0gKGZyLT5mcl9jaGlsZCA9PSBOVUxMKQorCSAgICB8fCAoc24tPmZyX25leHQgIT0gTlVMTAorCQkmJiBjaGVja19zbmFwc2hvdF9yZWMoc24tPmZyX25leHQsIGZyLT5mcl9uZXh0KSA9PSBGQUlMKQorCSAgICB8fCAoc24tPmZyX2NoaWxkICE9IE5VTEwKKwkJJiYgY2hlY2tfc25hcHNob3RfcmVjKHNuLT5mcl9jaGlsZCwgZnItPmZyX2NoaWxkKSA9PSBGQUlMKSkKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBDb3B5IHRoZSBzaXplIG9mIHNuYXBzaG90IGZyYW1lICJzbiIgdG8gZnJhbWUgImZyIi4gIERvIHRoZSBzYW1lIGZvciBhbGwKKyAqIGZvbGxvd2luZyBmcmFtZXMgYW5kIGNoaWxkcmVuLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBjdXJyZW50IHdpbmRvdywgb3IgTlVMTC4KKyAqLworICAgIHN0YXRpYyB3aW5fVCAqCityZXN0b3JlX3NuYXBzaG90X3JlYyhzbiwgZnIpCisgICAgZnJhbWVfVAkqc247CisgICAgZnJhbWVfVAkqZnI7Cit7CisgICAgd2luX1QJKndwID0gTlVMTDsKKyAgICB3aW5fVAkqd3AyOworCisgICAgZnItPmZyX2hlaWdodCA9IHNuLT5mcl9oZWlnaHQ7CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgZnItPmZyX3dpZHRoID0gc24tPmZyX3dpZHRoOworIyBlbmRpZgorICAgIGlmIChmci0+ZnJfbGF5b3V0ID09IEZSX0xFQUYpCisgICAgeworCWZyYW1lX25ld19oZWlnaHQoZnIsIGZyLT5mcl9oZWlnaHQsIEZBTFNFLCBGQUxTRSk7CisjIGlmZGVmIEZFQVRfVkVSVFNQTElUCisJZnJhbWVfbmV3X3dpZHRoKGZyLCBmci0+ZnJfd2lkdGgsIEZBTFNFKTsKKyMgZW5kaWYKKwl3cCA9IHNuLT5mcl93aW47CisgICAgfQorICAgIGlmIChzbi0+ZnJfbmV4dCAhPSBOVUxMKQorICAgIHsKKwl3cDIgPSByZXN0b3JlX3NuYXBzaG90X3JlYyhzbi0+ZnJfbmV4dCwgZnItPmZyX25leHQpOworCWlmICh3cDIgIT0gTlVMTCkKKwkgICAgd3AgPSB3cDI7CisgICAgfQorICAgIGlmIChzbi0+ZnJfY2hpbGQgIT0gTlVMTCkKKyAgICB7CisJd3AyID0gcmVzdG9yZV9zbmFwc2hvdF9yZWMoc24tPmZyX2NoaWxkLCBmci0+ZnJfY2hpbGQpOworCWlmICh3cDIgIT0gTlVMTCkKKwkgICAgd3AgPSB3cDI7CisgICAgfQorICAgIHJldHVybiB3cDsKK30KKworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChGRUFUX1ZFUlRTUExJVCkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlcmUgaXMgYW55IHZlcnRpY2FsbHkgc3BsaXQgd2luZG93LgorICovCisgICAgaW50Cit3aW5faGFzdmVydHNwbGl0KCkKK3sKKyAgICBmcmFtZV9UCSpmcjsKKworICAgIGlmICh0b3BmcmFtZS0+ZnJfbGF5b3V0ID09IEZSX1JPVykKKwlyZXR1cm4gVFJVRTsKKworICAgIGlmICh0b3BmcmFtZS0+ZnJfbGF5b3V0ID09IEZSX0NPTCkKKwlmb3IgKGZyID0gdG9wZnJhbWUtPmZyX2NoaWxkOyBmciAhPSBOVUxMOyBmciA9IGZyLT5mcl9uZXh0KQorCSAgICBpZiAoZnItPmZyX2xheW91dCA9PSBGUl9ST1cpCisJCXJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvd29ya3Nob3AuYyBiL3NyYy93b3Jrc2hvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd29ya3Nob3AuYwpAQCAtMCwwICsxLDE4ODUgQEAKKy8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJVmlzdWFsIFdvcmtzaG9wIGludGVncmF0aW9uIGJ5IEdvcmRvbiBQcmlldXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiYXV0by9jb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX0xJQkdFTl9ICisjIGluY2x1ZGUgPGxpYmdlbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYbS9YbS5oPgorI2luY2x1ZGUgPFhtL1B1c2hCLmg+CisKKyNpbmNsdWRlICJpbnRlZ3JhdGlvbi5oIgkvKiA8RWRpdFBsdWdpbi9pbnRlZ3JhdGlvbi5oPiAqLworCisjaW5jbHVkZSAidmltLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImd1aV9iZXZhbC5oIgorI2luY2x1ZGUgIndvcmtzaG9wLmgiCisKK3ZvaWQJCSB3b3Jrc2hvcF9ob3RrZXlzKEJvb2xlYW4pOworCitzdGF0aWMgQm9vbGVhbgkgaXNTaG93aW5nKGludCk7CitzdGF0aWMgd2luX1QJKmdldF93aW5kb3coYnVmX1QgKik7CisjaWYgMAorc3RhdGljIGludAkgZ2V0X2J1ZmZlcl9udW1iZXIoYnVmX1QgKik7CisjZW5kaWYKK3N0YXRpYyB2b2lkCSB1cGRhdGVQcmlvcml0eShCb29sZWFuKTsKK3N0YXRpYyBjaGFyCSphZGRVbmlxdWVNbmVtb25pYyhjaGFyICosIGNoYXIgKik7CitzdGF0aWMgY2hhcgkqZml4dXAoY2hhciAqKTsKK3N0YXRpYyBjaGFyCSpnZXRfc2VsZWN0aW9uKGJ1Zl9UICopOworc3RhdGljIGNoYXIJKmFwcGVuZF9zZWxlY3Rpb24oaW50LCBjaGFyICosIGludCAqLCBpbnQgKik7CitzdGF0aWMgdm9pZAkgbG9hZF9idWZmZXJfYnlfbmFtZShjaGFyICosIGludCk7CisjaWYgMAorc3RhdGljIHZvaWQJIGxvYWRfYnVmZmVyX2J5X251bWJlcihpbnQsIGludCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkCSBsb2FkX3dpbmRvdyhjaGFyICosIGludCBsbnVtKTsKK3N0YXRpYyB2b2lkCSB3YXJwX3RvX3BjKGludCk7CisjaWZkZWYgRkVBVF9CRVZBTAorc3RhdGljIHZvaWQJIGJldmFsQ0IoQmFsbG9vbkV2YWwgKiwgaW50KTsKKyNlbmRpZgorc3RhdGljIGNoYXIJKmZpeEFjY2VsVGV4dChjaGFyICopOworc3RhdGljIHZvaWQJIGFkZE1lbnUoY2hhciAqLCBjaGFyICosIGNoYXIgKik7CitzdGF0aWMgY2hhcgkqbG9va3VwVmVyYihjaGFyICosIGludCk7CitzdGF0aWMgaW50CSBjb21wdXRlSW5kZXgoaW50LCBjaGFyX3UgKiwgaW50KTsKK3N0YXRpYyB2b2lkCSBjb2xvbmNtZChjaGFyICosIEJvb2xlYW4pOworCitleHRlcm4gV2lkZ2V0CSB2aW1TaGVsbDsKK2V4dGVybiBXaWRnZXQJIHRleHRBcmVhOworZXh0ZXJuIFh0QXBwQ29udGV4dCBhcHBfY29udGV4dDsKKworc3RhdGljIGludAkgdGJwcmk7CQkJLyogVG9vbEJhciBwcmlvcml0eSAqLworaW50CQkgdXNpbmdTdW5Xb3JrU2hvcCA9IDA7CS8qIHNldCBpZiAtd3MgZmxhZyBpcyB1c2VkICovCitjaGFyCQkgY3VyTWVudU5hbWVbQlVGU0laXTsKK2NoYXIJCSBjdXJNZW51UHJpb3JpdHlbQlVGU0laXTsKK0JhbGxvb25FdmFsCSpiYWxsb29uRXZhbDsKKworc3RhdGljIEJvb2xlYW4JIHdvcmtzaG9wSW5pdERvbmUgPSBGYWxzZTsKK3N0YXRpYyBCb29sZWFuCSB3b3Jrc2hvcEhvdEtleXNFbmFibGVkID0gRmFsc2U7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGVudW0gaXMgZnJvbSA8Z3BfZGJ4L2dwX2RieF9jb21tb24uaD4uIFdlIGNhbid0IGluY2x1ZGUgaXQKKyAqIGhlcmUgYmVjYXVzZSBpdHMgQysrLgorICovCitlbnVtCit7CisgICAgR1BMaW5lRXZhbF9FVkFMVUFURSwJCS8qIGV2YWx1YXRlIGV4cHJlc3Npb24gKi8KKyAgICBHUExpbmVFdmFsX0lORElSRUNULAkJLyogZXZhbHVhdGUgKjxleHByZXNzaW9uPiAqLworICAgIEdQTGluZUV2YWxfVFlQRQkJCS8qIHR5cGUgb2YgZXhwcmVzc2lvbiAqLworfTsKKworLyoKKyAqIFN0b3JlIGVhY2ggdmVyYiBpbiB0aGUgTWVudU1hcC4gVGhpcyBsZXRzIHVzIG1hcCBmcm9tIGEgdmVyYiB0byBhIG1lbnUuCisgKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgbWF0Y2hlcyBmb3IgYSBzaW5nbGUgdmVyYiBpbiB0aGlzIHRhYmxlLgorICovCisjZGVmaW5lIE1FTlVfSU5DCTUwCQkvKiBtZW51TWFwIGluY3JlbWVudGFsIHNpemUgaW5jcmVhc2VzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIJKm5hbWU7CQkJLyogbmFtZSBvZiB0aGUgbWVudSAqLworICAgIGNoYXIJKmFjY2VsOwkJCS8qIG9wdGlvbmFsIGFjY2VsZXJhdG9yIGtleSAqLworICAgIGNoYXIJKnZlcmI7CQkJLyogbWVudSB2ZXJiICovCit9IE1lbnVNYXA7CitzdGF0aWMgTWVudU1hcAkqbWVudU1hcDsJCS8qIGxpc3Qgb2YgdmVyYi9tZW51IG1hcHBpbmdzICovCitzdGF0aWMgaW50CSBtZW51TWFwU2l6ZTsJCS8qIGN1cnJlbnQgc2l6ZSBvZiBtZW51TWFwICovCitzdGF0aWMgaW50CSBtZW51TWFwTWF4OwkJLyogYWxsb2NhdGVkIHNpemUgb2YgbWVudU1hcCAqLworc3RhdGljIGNoYXIJKmluaXRpYWxGaWxlQ21kOwkvKiBzYXZlIGNvbW1hbmQgYnV0IGRlZmVyIGRvaW5nIGl0ICovCisKKworICAgIHZvaWQKK3dvcmtzaG9wX2luaXQoKQoreworICAgIGNoYXJfdQkgYnVmWzY0XTsKKyAgICBpbnQJCSBpc19kaXJ0eSA9IEZBTFNFOworICAgIGludAkJIHdpZHRoLCBoZWlnaHQ7CisgICAgWHRJbnB1dE1hc2sJIG1hc2s7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gTWVudUJhciwgVG9vbEJhciwgYW5kIEZvb3Rlci4KKyAgICAgKi8KKyAgICBTVFJDUFkoYnVmLCBwX2dvKTsKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19NRU5VUykgPT0gTlVMTCkKKyAgICB7CisJU1RSQ0FUKGJ1ZiwgIm0iKTsKKwlpc19kaXJ0eSA9IFRSVUU7CisgICAgfQorICAgIGlmICh2aW1fc3RyY2hyKHBfZ28sIEdPX1RPT0xCQVIpID09IE5VTEwpCisgICAgeworCVNUUkNBVChidWYsICJUIik7CisJaXNfZGlydHkgPSBUUlVFOworICAgIH0KKyAgICBpZiAodmltX3N0cmNocihwX2dvLCBHT19GT09URVIpID09IE5VTEwpCisgICAgeworCVNUUkNBVChidWYsICJGIik7CisJaXNfZGlydHkgPSBUUlVFOworICAgIH0KKyAgICBpZiAoaXNfZGlydHkpCisJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImdvIiwgMEwsIGJ1ZiwgMCk7CisKKyAgICAvKgorICAgICAqIFNldCBzaXplIGZyb20gd29ya3Nob3BfZ2V0X3dpZHRoX2hlaWdodCgpLgorICAgICAqLworICAgIHdpZHRoID0gaGVpZ2h0ID0gMDsKKyAgICBpZiAod29ya3Nob3BfZ2V0X3dpZHRoX2hlaWdodCgmd2lkdGgsICZoZWlnaHQpKQorICAgIHsKKwlYdFZhU2V0VmFsdWVzKHZpbVNoZWxsLAorCQlYbU53aWR0aCwgd2lkdGgsCisJCVhtTmhlaWdodCwgaGVpZ2h0LAorCQlOVUxMKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyByZWFkIGluIHRoZSBpbml0aWFsIG1lc3NhZ2VzIGZyb20gZXNlcnZlLgorICAgICAqLworICAgIHdoaWxlICgobWFzayA9IFh0QXBwUGVuZGluZyhhcHBfY29udGV4dCkpCisJICAgICYmIChtYXNrICYgWHRJTUFsdGVybmF0ZUlucHV0KSAmJiAhd29ya3Nob3BJbml0RG9uZSkKKwlYdEFwcFByb2Nlc3NFdmVudChhcHBfY29udGV4dCwgKFh0SW5wdXRNYXNrKVh0SU1BbHRlcm5hdGVJbnB1dCk7Cit9CisKKyAgICB2b2lkCit3b3Jrc2hvcF9wb3N0aW5pdCgpCit7CisgICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKWluaXRpYWxGaWxlQ21kKTsKKyAgICBBTFRfSU5QVVRfTE9DS19PRkY7CisgICAgZnJlZShpbml0aWFsRmlsZUNtZCk7CisgICAgaW5pdGlhbEZpbGVDbWQgPSBOVUxMOworfQorCisgICAgdm9pZAorZXhfd3N2ZXJiKGV4YXJnX1QgKmVhcCkKK3sKKyAgICBtc2dfY2xyX2NtZGxpbmUoKTsKKyAgICB3b3Jrc2hvcF9wZXJmb3JtX3ZlcmIoKGNoYXIgKikgZWFwLT5hcmcsIE5VTEwpOworfQorCisvKgorICogRWRpdG9yIG5hbWUKKyAqIFRoaXMgc3RyaW5nIGlzIHJlY29nbml6ZWQgYnkgZXNlcnZlIGFuZCBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UuCisgKiBUaGlzIGlzIGhvdyB0aGUgZWRpdG9yIGRldGVjdHMgdGhhdCBpdCBpcyB0YWxraW5nIHRvIGd2aW0gaW5zdGVhZAorICogb2YgTkVkaXQsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBmcm9tIHRoZSBlZGl0b3IuCisgKi8KKyAgICBjaGFyICoKK3dvcmtzaG9wX2dldF9lZGl0b3JfbmFtZSgpCit7CisgICAgcmV0dXJuICJndmltIjsKK30KKworLyoKKyAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBlZGl0b3IuCisgKiBUaGlzIG51bWJlciBpcyBjb21tdW5pY2F0ZWQgYWxvbmcgd2l0aCB0aGUgcHJvdG9jb2wKKyAqIHZlcnNpb24gdG8gdGhlIGFwcGxpY2F0aW9uLgorICovCisgICAgY2hhciAqCit3b3Jrc2hvcF9nZXRfZWRpdG9yX3ZlcnNpb24oKQoreworICAgIHJldHVybiBWZXJzaW9uOworfQorCisvKgorICogQW5zd2VyIGZ1bmN0aW9uczogY2FsbGVkIGJ5IGVzZXJ2ZQorICovCisKKy8qCisgKiBOYW1lOgorICoJd29ya3Nob3BfbG9hZF9maWxlCisgKgorICogRnVuY3Rpb246CisgKglMb2FkIGEgZ2l2ZW4gZmlsZSBpbnRvIHRoZSBXb3JrU2hvcCBidWZmZXIuCisgKi8KKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK3dvcmtzaG9wX2xvYWRfZmlsZSgKKwljaGFyCSpmaWxlbmFtZSwJCS8qIHRoZSBmaWxlIHRvIGxvYWQgKi8KKwlpbnQJIGxpbmUsCQkJLyogYW4gb3B0aW9uYWwgbGluZSBudW1iZXIgKG9yIDApICovCisJY2hhcgkqZnJhbWVpZCkJCS8qIHVzZWQgZm9yIG11bHRpLWZyYW1lIHN1cHBvcnQgKi8KK3sKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfbG9hZF9maWxlKCVzLCAlZClcbiIsIGZpbGVuYW1lLCBsaW5lKTsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9CRVZBTAorICAgIGlmIChiYWxsb29uRXZhbCA9PSBOVUxMKQorICAgIHsKKwkvKgorCSAqIFNldCB1cCB0aGUgQmFsbG9vbiBFeHByZXNzaW9uIEV2YWx1YXRpb24gYXJlYS4KKwkgKiBJdCdzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIERpc2FibGUgaXQgd2hlbiAnYmFsbG9vbmV2YWwnIGlzIG9mZi4KKwkgKi8KKyMgaWZkZWYgRkVBVF9HVUlfR1RLCisJYmFsbG9vbkV2YWwgPSBndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKGd1aS5kcmF3YXJlYSwgTlVMTCwKKwkJCQkJCQkgICAgICAmYmV2YWxDQiwgTlVMTCk7CisjIGVsc2UKKwliYWxsb29uRXZhbCA9IGd1aV9tY2hfY3JlYXRlX2JldmFsX2FyZWEodGV4dEFyZWEsIE5VTEwsIGJldmFsQ0IsIE5VTEwpOworIyBlbmRpZgorCWlmICghcF9iZXZhbCkKKwkgICAgZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEoYmFsbG9vbkV2YWwpOworICAgIH0KKyNlbmRpZgorCisgICAgbG9hZF93aW5kb3coZmlsZW5hbWUsIGxpbmUpOworfQorCisvKgorICogUmVsb2FkIHRoZSBXb3JrU2hvcCBidWZmZXIKKyAqLworICAgIHZvaWQKK3dvcmtzaG9wX3JlbG9hZF9maWxlKAorCWNoYXIJKmZpbGVuYW1lLAorCWludAkgbGluZSkKK3sKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfcmVsb2FkX2ZpbGUoJXMsICVkKVxuIiwgZmlsZW5hbWUsIGxpbmUpOworI2VuZGlmCisgICAgbG9hZF93aW5kb3coZmlsZW5hbWUsIGxpbmUpOworfQorCisgICAgdm9pZAord29ya3Nob3Bfc2hvd19maWxlKAorICAgIGNoYXIJKmZpbGVuYW1lKQoreworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9zaG93X2ZpbGUoJXMpXG4iLCBmaWxlbmFtZSk7CisjZW5kaWYKKworICAgIGxvYWRfd2luZG93KGZpbGVuYW1lLCAwKTsKK30KKworICAgIHZvaWQKK3dvcmtzaG9wX2dvdG9fbGluZSgKKyAgICBjaGFyCSpmaWxlbmFtZSwKKyAgICBpbnQJCSBsaW5lbm8pCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2dvdG9fbGluZSglcywgJWQpXG4iLCBmaWxlbmFtZSwgbGluZW5vKTsKKyNlbmRpZgorCisgICAgbG9hZF93aW5kb3coZmlsZW5hbWUsIGxpbmVubyk7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK3dvcmtzaG9wX2Zyb250X2ZpbGUoCisJY2hhcgkqZmlsZW5hbWUpCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2Zyb250X2ZpbGUoKVxuIik7CisjZW5kaWYKKyAgICAvKgorICAgICAqIEFzc3VtcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIGEgY2FsbCB0bworICAgICAqIHdvcmtzaG9wX3Nob3dfZmlsZSgpLCBzbyB0aGUgZmlsZSBpcyBhbHdheXMgc2hvd2luZy4KKyAgICAgKi8KKyAgICBpZiAodmltU2hlbGwgIT0gTlVMTCkKKwlYUmFpc2VXaW5kb3coZ3VpLmRweSwgWHRXaW5kb3codmltU2hlbGwpKTsKK30KKworICAgIHZvaWQKK3dvcmtzaG9wX3NhdmVfZmlsZSgKKwkgICAgY2hhcgkqZmlsZW5hbWUpCit7CisgICAgY2hhcgkgY2J1ZltCVUZTSVpdOwkJLyogYnVpbGQgdmltIGNvbW1hbmQgaGVyZSAqLworCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX3NhdmVfZmlsZSglcylcbiIsIGZpbGVuYW1lKTsKKyNlbmRpZgorCisgICAgLyogU2F2ZSB0aGUgZ2l2ZW4gZmlsZSAqLworICAgIHNwcmludGYoY2J1ZiwgIncgJXMiLCBmaWxlbmFtZSk7CisgICAgY29sb25jbWQoY2J1ZiwgVFJVRSk7Cit9CisKKyAgICB2b2lkCit3b3Jrc2hvcF9zYXZlX2ZpbGVzKCkKK3sKKyAgICAvKiBTYXZlIHRoZSBnaXZlbiBmaWxlICovCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX3NhdmVfZmlsZXMoKVxuIik7CisjZW5kaWYKKworICAgIGFkZF90b19pbnB1dF9idWYoKGNoYXJfdSAqKSAiOndhbGxcbiIsIDYpOworfQorCisgICAgdm9pZAord29ya3Nob3BfcXVpdCgpCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX3F1aXQoKVxuIik7CisjZW5kaWYKKworICAgIGFkZF90b19pbnB1dF9idWYoKGNoYXJfdSAqKSAiOnFhbGxcbiIsIDYpOworfQorCisgICAgdm9pZAord29ya3Nob3BfbWluaW1pemUoKQoreworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9taW5pbWl6ZSgpXG4iKTsKKyNlbmRpZgorICAgIHdvcmtzaG9wX21pbmltaXplX3NoZWxsKHZpbVNoZWxsKTsKK30KKyAgICB2b2lkCit3b3Jrc2hvcF9tYXhpbWl6ZSgpCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX21heGltaXplKClcbiIpOworI2VuZGlmCisKKyAgICB3b3Jrc2hvcF9tYXhpbWl6ZV9zaGVsbCh2aW1TaGVsbCk7Cit9CisKKyAgICB2b2lkCit3b3Jrc2hvcF9hZGRfbWFya190eXBlKAorCWludAkJIGlkeCwKKwljaGFyCQkqY29sb3JzcGVjLAorCWNoYXIJCSpzaWduKQoreworICAgIGNoYXIJIGdidWZbQlVGU0laXTsJLyogYnVmZmVyIGZvciBzaWduIG5hbWUgKi8KKyAgICBjaGFyCSBjaWJ1ZltCVUZTSVpdOwkvKiBjb2xvciBpbmZvcm1hdGlvbiAqLworICAgIGNoYXIJIGNidWZbQlVGU0laXTsJLyogY29tbWFuZCBidWZmZXIgKi8KKyAgICBjaGFyCSpicDsKKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKyAgICB7CisJY2hhciAqY3A7CisKKwljcCA9IHN0cnJjaHIoc2lnbiwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkgICAgY3AgPSBzaWduOworCWVsc2UKKwkgICAgY3ArKzsJCS8qIHNraXAgJy8nIGNoYXJhY3RlciAqLworCXdzdHJhY2UoIndvcmtzaG9wX2FkZF9tYXJrX3R5cGUoJWQsIFwiJXNcIiwgXCIlc1wiKVxuIiwgaWR4LAorCQljb2xvcnNwZWMgJiYgKmNvbG9yc3BlYyA/IGNvbG9yc3BlYyA6ICI8Tm9uZT4iLCBjcCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIElzb2xhdGUgdGhlIGJhc2VuYW1lIG9mIHNpZ24gaW4gZ2J1Zi4gV2Ugd2lsbCB1c2UgdGhpcyBmb3IgdGhlCisgICAgICogR3JvdXBOYW1lIGluIHRoZSBoaWdobGlnaHQgY29tbWFuZCBzZW50IHRvIHZpbS4KKyAgICAgKi8KKyAgICBTVFJDUFkoZ2J1ZiwgZ2V0dGFpbCgoY2hhcl91ICopc2lnbikpOworICAgIGJwID0gc3RycmNocihnYnVmLCAnLicpOworICAgIGlmIChicCAhPSBOVUxMKQorCSpicCA9IE5VTDsKKworICAgIGlmIChnYnVmWzBdICE9ICctJyAmJiBnYnVmWzFdICE9IE5VTCkKKyAgICB7CisJaWYgKGNvbG9yc3BlYyAhPSBOVUxMICYmICpjb2xvcnNwZWMpCisJeworCSAgICBzcHJpbnRmKGNidWYsICJoaWdobGlnaHQgV1MlcyBndWliZz0lcyIsIGdidWYsIGNvbG9yc3BlYyk7CisJICAgIGNvbG9uY21kKGNidWYsIEZBTFNFKTsKKwkgICAgc3ByaW50ZihjaWJ1ZiwgImxpbmVobD1XUyVzIiwgZ2J1Zik7CisJfQorCWVsc2UKKwkgICAgY2lidWZbMF0gPSBOVUw7CisKKwlzcHJpbnRmKGNidWYsICJzaWduIGRlZmluZSAlZCAlcyBpY29uPSVzIiwgaWR4LCBjaWJ1Ziwgc2lnbik7CisJY29sb25jbWQoY2J1ZiwgVFJVRSk7CisgICAgfQorfQorCisgICAgdm9pZAord29ya3Nob3Bfc2V0X21hcmsoCisJY2hhcgkJKmZpbGVuYW1lLAkvKiBmaWxlbmFtZSB3aGljaCBnZXRzIHRoZSBtYXJrICovCisJaW50CQkgbGluZW5vLAkvKiBsaW5lIG51bWJlciB3aGljaCBnZXRzIHRoZSBtYXJrICovCisJaW50CQkgbWFya0lkLAkvKiB1bmlxdWUgbWFyayBpZGVudGlmaWVyICovCisJaW50CQkgaWR4KQkJLyogd2hpY2ggbWFyayB0byB1c2UgKi8KK3sKKyAgICBjaGFyCWNidWZbQlVGU0laXTsJLyogY29tbWFuZCBidWZmZXIgKi8KKworICAgIC8qIFNldCBtYXJrIGluIGEgZ2l2ZW4gZmlsZSAqLworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9zZXRfbWFyayglcywgJWQgKGxuKSwgJWQgKGlkKSwgJWQgKGlkeCkpXG4iLAorCQlmaWxlbmFtZSwgbGluZW5vLCBtYXJrSWQsIGlkeCk7CisjZW5kaWYKKworICAgIHNwcmludGYoY2J1ZiwgInNpZ24gcGxhY2UgJWQgbGluZT0lZCBuYW1lPSVkIGZpbGU9JXMiLAorCQkJCQkgICAgICAgbWFya0lkLCBsaW5lbm8sIGlkeCwgZmlsZW5hbWUpOworICAgIGNvbG9uY21kKGNidWYsIFRSVUUpOworfQorCisgICAgdm9pZAord29ya3Nob3BfY2hhbmdlX21hcmtfdHlwZSgKKwljaGFyCQkqZmlsZW5hbWUsCS8qIGZpbGVuYW1lIHdoaWNoIGdldHMgdGhlIG1hcmsgKi8KKwlpbnQJCSBtYXJrSWQsCS8qIHVuaXF1ZSBtYXJrIGlkZW50aWZpZXIgKi8KKwlpbnQJCSBpZHgpCQkvKiB3aGljaCBtYXJrIHRvIHVzZSAqLworeworICAgIGNoYXIJY2J1ZltCVUZTSVpdOwkvKiBjb21tYW5kIGJ1ZmZlciAqLworCisgICAgLyogQ2hhbmdlIG1hcmsgdHlwZSAqLworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9jaGFuZ2VfbWFya190eXBlKCVzLCAlZCwgJWQpXG4iLAorCQlmaWxlbmFtZSwgbWFya0lkLCBpZHgpOworI2VuZGlmCisKKyAgICBzcHJpbnRmKGNidWYsICJzaWduIHBsYWNlICVkIG5hbWU9JWQgZmlsZT0lcyIsIG1hcmtJZCwgaWR4LCBmaWxlbmFtZSk7CisgICAgY29sb25jbWQoY2J1ZiwgVFJVRSk7Cit9CisKKy8qCisgKiBHb3RvIHRoZSBnaXZlbiBtYXJrIGluIGEgZmlsZSAoZS5nLiBzaG93IGl0KS4KKyAqIElmIG1lc3NhZ2UgaXMgbm90IG51bGwsIGRpc3BsYXkgaXQgaW4gdGhlIGZvb3Rlci4KKyAqLworICAgIHZvaWQKK3dvcmtzaG9wX2dvdG9fbWFyaygKKwljaGFyCQkqZmlsZW5hbWUsCisJaW50CQkgbWFya0lkLAorCWNoYXIJCSptZXNzYWdlKQoreworICAgIGNoYXIJY2J1ZltCVUZTSVpdOwkvKiBjb21tYW5kIGJ1ZmZlciAqLworCisgICAgLyogR290byBtYXJrICovCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2dvdG9fbWFyayglcywgJWQgKGlkKSwgJXMpXG4iLAorCQlmaWxlbmFtZSwgbWFya0lkLCBtZXNzYWdlICYmICptZXNzYWdlICYmCisJCSEoKm1lc3NhZ2UgPT0gJyAnICYmIG1lc3NhZ2VbMV0gPT0gTlVMTCkgPworCQltZXNzYWdlIDogIjxOb25lPiIpOworI2VuZGlmCisKKyAgICBzcHJpbnRmKGNidWYsICJzaWduIGp1bXAgJWQgZmlsZT0lcyIsIG1hcmtJZCwgZmlsZW5hbWUpOworICAgIGNvbG9uY21kKGNidWYsIFRSVUUpOworICAgIGlmIChtZXNzYWdlICE9IE5VTEwgJiYgKm1lc3NhZ2UgIT0gTlVMKQorCWd1aV9tY2hfc2V0X2Zvb3RlcigoY2hhcl91ICopbWVzc2FnZSk7Cit9CisKKyAgICB2b2lkCit3b3Jrc2hvcF9kZWxldGVfbWFyaygKKwljaGFyCQkqZmlsZW5hbWUsCisJaW50CQkgbWFya0lkKQoreworICAgIGNoYXIJY2J1ZltCVUZTSVpdOwkvKiBjb21tYW5kIGJ1ZmZlciAqLworCisgICAgLyogRGVsZXRlIG1hcmsgKi8KKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfZGVsZXRlX21hcmsoJXMsICVkIChpZCkpXG4iLAorCQlmaWxlbmFtZSwgbWFya0lkKTsKKyNlbmRpZgorCisgICAgc3ByaW50ZihjYnVmLCAic2lnbiB1bnBsYWNlICVkIGZpbGU9JXMiLCBtYXJrSWQsIGZpbGVuYW1lKTsKKyAgICBjb2xvbmNtZChjYnVmLCBUUlVFKTsKK30KKworI2lmIDAJLyogbm90IHVzZWQgKi8KKyAgICB2b2lkCit3b3Jrc2hvcF9kZWxldGVfYWxsX21hcmtzKAorICAgIHZvaWQJKndpbmRvdywKKyAgICBCb29sZWFuCSBkb1JlZnJlc2gpCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2RlbGV0ZV9hbGxfbWFya3MoJSN4LCAlcylcbiIsCisJCXdpbmRvdywgZG9SZWZyZXNoID8gIlRydWUiIDogIkZhbHNlIik7CisjZW5kaWYKKworICAgIGNvbG9uY21kKCJzaWduIHVucGxhY2UgKiIsIFRSVUUpOworfQorI2VuZGlmCisKKyAgICBpbnQKK3dvcmtzaG9wX2dldF9tYXJrX2xpbmVubygKKwljaGFyCSpmaWxlbmFtZSwKKwlpbnQJIG1hcmtJZCkKK3sKKyAgICBidWZfVAkqYnVmOwkJLyogYnVmZmVyIGNvbnRhaW5pbmcgZmlsZW5hbWUgKi8KKyAgICBpbnQJCWxpbmVubzsJCS8qIGxpbmUgbnVtYmVyIG9mIGZpbGVuYW1lIGluIGJ1ZiAqLworCisgICAgLyogR2V0IG1hcmsgbGluZSBudW1iZXIgKi8KKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfZ2V0X21hcmtfbGluZW5vKCVzLCAlZClcbiIsCisJCWZpbGVuYW1lLCBtYXJrSWQpOworI2VuZGlmCisKKyAgICBsaW5lbm8gPSAwOworICAgIGJ1ZiA9IGJ1Zmxpc3RfZmluZG5hbWUoKGNoYXJfdSAqKWZpbGVuYW1lKTsKKyAgICBpZiAoYnVmICE9IE5VTEwpCisJbGluZW5vID0gYnVmX2ZpbmRzaWduKGJ1ZiwgbWFya0lkKTsKKworICAgIHJldHVybiBsaW5lbm87Cit9CisKKworI2lmIDAJLyogbm90IHVzZWQgKi8KKyAgICB2b2lkCit3b3Jrc2hvcF9hZGp1c3RfbWFya3MoV2lkZ2V0ICp3aW5kb3csIGludCBwb3MsCisJCQlpbnQgaW5zZXJ0ZWQsIGludCBkZWxldGVkKQoreworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJYWFh3b3Jrc2hvcF9hZGp1c3RfbWFya3MoJXMsICVkLCAlZCwgJWQpXG4iLAorCQl3aW5kb3cgPyBYdE5hbWUod2luZG93KSA6ICI8Tm9uZT4iLCBwb3MsIGluc2VydGVkLCBkZWxldGVkKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBBcmUgdGhlcmUgYW55IG1vdmVkIG1hcmtzPyBJZiBzbywgY2FsbCB3b3Jrc2hvcF9tb3ZlX21hcmsgb24KKyAqIGVhY2ggb2YgdGhlbSBub3cuIFRoaXMgaXMgaG93IGVzZXJ2ZSBjYW4gZmluZCBvdXQgaWYgZm9yIGV4YW1wbGUKKyAqIGJyZWFrcG9pbnRzIGhhdmUgbW92ZWQgd2hlbiBhIHByb2dyYW0gaGFzIGJlZW4gcmVjb21waWxlZCBhbmQKKyAqIHJlbG9hZGVkIGludG8gZGJ4LgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCit3b3Jrc2hvcF9tb3ZlZF9tYXJrcyhjaGFyICpmaWxlbmFtZSkKK3sKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgiWFhYd29ya3Nob3BfbW92ZWRfbWFya3MoJXMpXG4iLCBmaWxlbmFtZSk7CisjZW5kaWYKK30KKworICAgIGludAord29ya3Nob3BfZ2V0X2ZvbnRfaGVpZ2h0KCkKK3sKKyAgICBYbUZvbnRMaXN0CSBmb250TGlzdDsJLyogZm9udExpc3QgbWFkZSBmcm9tIGd1aS5ub3JtX2ZvbnQgKi8KKyAgICBYbVN0cmluZwkgc3RyOworICAgIERpbWVuc2lvbgkgdzsKKyAgICBEaW1lbnNpb24JIGg7CisKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfZ2V0X2ZvbnRfaGVpZ2h0KClcbiIpOworI2VuZGlmCisKKyAgICAvKiBQaWNrIHRoZSBwcm9wZXIgc2lnbnMgZm9yIHRoaXMgZm9udCBzaXplICovCisgICAgZm9udExpc3QgPSBndWlfbW90aWZfY3JlYXRlX2ZvbnRsaXN0KChYRm9udFN0cnVjdCAqKWd1aS5ub3JtX2ZvbnQpOworICAgIGggPSAwOworICAgIGlmIChmb250TGlzdCAhPSBOVUxMKQorICAgIHsKKwlzdHIgPSBYbVN0cmluZ0NyZWF0ZUxvY2FsaXplZCgiQSIpOworCVhtU3RyaW5nRXh0ZW50KGZvbnRMaXN0LCBzdHIsICZ3LCAmaCk7CisJWG1TdHJpbmdGcmVlKHN0cik7CisJWG1Gb250TGlzdEZyZWUoZm9udExpc3QpOworICAgIH0KKworICAgIHJldHVybiAoaW50KWg7Cit9CisKKy8qQVJHU1VTRUQqLworICAgIHZvaWQKK3dvcmtzaG9wX2Zvb3Rlcl9tZXNzYWdlKAorCWNoYXIJCSptZXNzYWdlLAorCWludAkJIHNldmVyaXR5KQkvKiBzZXZlcml0eSBpcyBjdXJyZW50bHkgdW51c2VkICovCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2Zvb3Rlcl9tZXNzYWdlKCVzLCAlZClcbiIsIG1lc3NhZ2UsIHNldmVyaXR5KTsKKyNlbmRpZgorCisgICAgZ3VpX21jaF9zZXRfZm9vdGVyKChjaGFyX3UgKikgbWVzc2FnZSk7Cit9CisKKy8qCisgKiB3b3Jrc2hvcF9tZW51X2JlZ2luKCkgaXMgcGFzc2VkIHRoZSBtZW51IG5hbWUuIFdlIGRldGVybWluZSBpdHMgbW5lbW9uaWMKKyAqIGhlcmUgYW5kIHN0b3JlIGl0cyBuYW1lIGFuZCBwcmlvcml0eS4KKyAqLworICAgIHZvaWQKK3dvcmtzaG9wX21lbnVfYmVnaW4oCisJY2hhcgkJKmxhYmVsKQoreworICAgIHZpbW1lbnVfVAkqbWVudTsJCQkvKiBwb2ludGVyIHRvIGxhc3QgbWVudSAqLworICAgIGludAkJbWVudVByaW9yaXR5ID0gMDsJLyogcHJpb3JpdHkgb2YgbmV3IG1lbnUgKi8KKyAgICBjaGFyCW1uZW1idWZbNjRdOwkJLyogc3RvcmUgbWVudWJhciBtbmVtb25pY3MgaGVyZSAqLworICAgIGNoYXIJKm5hbWU7CQkJLyogbGFiZWwgd2l0aCBhIG1uZW1vbmljICovCisgICAgY2hhcgkqcDsJCQkvKiB1c2VkIHRvIGZpbmQgbW5lbW9uaWNzICovCisgICAgaW50CQlpZHg7CQkJLyogaW5kZXggaW50byBtbmVtYnVmICovCisKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfbWVudV9iZWdpbigpXG4iKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBMb29rIHRocm91Z2ggYWxsIGV4aXN0aW5nIChub24tUG9wVXAgYW5kIG5vbi1Ub29sYmFyKSBtZW51cworICAgICAqIGFuZCBnYXRoZXIgdGhlaXIgbW5lbW9uaWNzLiBVc2UgdGhpcyBsaXN0IHRvIGRlY2lkZSB3aGF0CisgICAgICogbW5lbW9uaWMgc2hvdWxkIGJlIHVzZWQgZm9yIGxhYmVsLgorICAgICAqLworCisgICAgaWR4ID0gMDsKKyAgICBtbmVtYnVmW2lkeCsrXSA9ICdIJzsJCS8qIEggaXMgbW5lbW9uaWMgZm9yIEhlbHAgKi8KKyAgICBmb3IgKG1lbnUgPSByb290X21lbnU7IG1lbnUgIT0gTlVMTDsgbWVudSA9IG1lbnUtPm5leHQpCisgICAgeworCWlmIChtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCisJeworCSAgICBwID0gc3RyY2hyKChjaGFyICopbWVudS0+bmFtZSwgJyYnKTsKKwkgICAgaWYgKHAgIT0gTlVMTCkKKwkJbW5lbWJ1ZltpZHgrK10gPSAqKytwOworCX0KKwlpZiAobWVudS0+bmV4dCAhPSBOVUxMCisJCSYmIHN0cmNtcCgoY2hhciAqKSBtZW51LT5uZXh0LT5kbmFtZSwgIkhlbHAiKSA9PSAwKQorCXsKKwkgICAgbWVudVByaW9yaXR5ID0gbWVudS0+cHJpb3JpdHkgKyAxMDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBtbmVtYnVmW2lkeCsrXSA9IE5VTDsKKyAgICBuYW1lID0gYWRkVW5pcXVlTW5lbW9uaWMobW5lbWJ1ZiwgbGFiZWwpOworCisgICAgc3ByaW50ZihjdXJNZW51TmFtZSwgIiVzIiwgbmFtZSk7CisgICAgc3ByaW50ZihjdXJNZW51UHJpb3JpdHksICIlZC4wIiwgbWVudVByaW9yaXR5KTsKK30KKworLyoKKyAqIEFwcGVuZCB0aGUgbmFtZSBhbmQgcHJpb3JpdHkgdG8gc3RyaW5ncyB0byBiZSB1c2VkIGluIHZpbSBtZW51IGNvbW1hbmRzLgorICovCisgICAgdm9pZAord29ya3Nob3Bfc3VibWVudV9iZWdpbigKKwljaGFyCQkqbGFiZWwpCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmICh3c19kZWJ1ZyAgJiYgd3NfZGxldmVsICYgV1NfVFJBQ0UKKwkgICAgJiYgc3RybmNtcChjdXJNZW51TmFtZSwgIlRvb2xCYXIiLCA3KSAhPSAwKQorCXdzdHJhY2UoIndvcmtzaG9wX3N1Ym1lbnVfYmVnaW4oJXMpXG4iLCBsYWJlbCk7CisjZW5kaWYKKworICAgIHN0cmNhdChjdXJNZW51TmFtZSwgIi4iKTsKKyAgICBzdHJjYXQoY3VyTWVudU5hbWUsIGZpeHVwKGxhYmVsKSk7CisKKyAgICB1cGRhdGVQcmlvcml0eShUcnVlKTsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgc3VibWVudSBuYW1lIGFuZCBwcmlvcml0eSBmcm9tIGN1ck1lbnUqLgorICovCisKKyAgICB2b2lkCit3b3Jrc2hvcF9zdWJtZW51X2VuZCgpCit7CisgICAgY2hhcgkJKnA7CisKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkKKwkgICAgJiYgc3RybmNtcChjdXJNZW51TmFtZSwgIlRvb2xCYXIiLCA3KSAhPSAwKQorCXdzdHJhY2UoIndvcmtzaG9wX3N1Ym1lbnVfZW5kKClcbiIpOworI2VuZGlmCisKKyAgICBwID0gc3RycmNocihjdXJNZW51UHJpb3JpdHksICcuJyk7CisgICAgQVNTRVJUKHAgIT0gTlVMTCk7CisgICAgKnAgPSBOVUw7CisKKyAgICBwID0gc3RycmNocihjdXJNZW51TmFtZSwgJy4nKTsKKyAgICBBU1NFUlQocCAhPSBOVUxMKTsKKyAgICAqcCA9IE5VTDsKK30KKworLyoKKyAqIFRoaXMgaXMgd2hlcmUgbWVudXMgYXJlIHJlYWxseSBtYWRlLiBFYWNoIGl0ZW0gd2lsbCBnZW5lcmF0ZSBhbiBhbWVudSB2aW0KKyAqIGNvbW1hbmQuIFRoZSBnbG9iYWxzIGN1ck1lbnVOYW1lIGFuZCBjdXJNZW51UHJpb3JpdHkgY29udGFpbiB0aGUgbmFtZSBhbmQKKyAqIHByaW9yaXR5IG9mIHRoZSBwYXJlbnQgbWVudSB0cmVlLgorICovCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCit3b3Jrc2hvcF9tZW51X2l0ZW0oCisJY2hhcgkJKmxhYmVsLAorCWNoYXIJCSp2ZXJiLAorCWNoYXIJCSphY2NlbGVyYXRvciwKKwljaGFyCQkqYWNjZWxlcmF0b3JUZXh0LAorCWNoYXIJCSpuYW1lLAorCWNoYXIJCSpmaWxlcG9zLAorCWNoYXIJCSpzZW5zaXRpdmUpCit7CisgICAgY2hhcgkJIGNidWZbQlVGU0laXTsKKyAgICBjaGFyCQkgbmFtZWJ1ZltCVUZTSVpdOworICAgIGNoYXIJCSBhY2NUZXh0W0JVRlNJWl07CisKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UpCisJICAgICYmIHN0cm5jbXAoY3VyTWVudU5hbWUsICJUb29sQmFyIiwgNykgIT0gMCkKKyAgICB7CisJaWYgKHdzX2RsZXZlbCAmIFdTX1RSQUNFX1ZFUkJPU0UpCisJICAgIHdzZGVidWcoIndvcmtzaG9wX21lbnVfaXRlbShcbiIKKwkJICAgICJcdGxhYmVsID0gXCIlc1wiLFxuIgorCQkgICAgIlx0dmVyYiA9ICVzLFxuIgorCQkgICAgIlx0YWNjZWxlcmF0b3IgPSAlcyxcbiIKKwkJICAgICJcdGFjY2VsZXJhdG9yVGV4dCA9IFwiJXNcIixcbiIKKwkJICAgICJcdG5hbWUgPSAlcyxcbiIKKwkJICAgICJcdGZpbGVwb3MgPSAlcyxcbiIKKwkJICAgICJcdHNlbnNpdGl2ZSA9ICVzKVxuIiwKKwkJICAgIGxhYmVsICYmICpsYWJlbCA/IGxhYmVsIDogIjxOb25lPiIsCisJCSAgICB2ZXJiICYmICp2ZXJiID8gdmVyYiA6ICI8Tm9uZT4iLAorCQkgICAgYWNjZWxlcmF0b3IgJiYgKmFjY2VsZXJhdG9yID8KKwkJICAgIGFjY2VsZXJhdG9yIDogIjxOb25lPiIsCisJCSAgICBhY2NlbGVyYXRvclRleHQgJiYgKmFjY2VsZXJhdG9yVGV4dCA/CisJCSAgICBhY2NlbGVyYXRvclRleHQgOiAiPE5vbmU+IiwKKwkJICAgIG5hbWUgJiYgKm5hbWUgPyBuYW1lIDogIjxOb25lPiIsCisJCSAgICBmaWxlcG9zICYmICpmaWxlcG9zID8gZmlsZXBvcyA6ICI8Tm9uZT4iLAorCQkgICAgc2Vuc2l0aXZlKTsKKwllbHNlIGlmICh3c19kbGV2ZWwgJiBXU19UUkFDRSkKKwkgICAgd3N0cmFjZSgid29ya3Nob3BfbWVudV9pdGVtKFwiJXNcIiwgJXMpXG4iLAorCQkgICAgbGFiZWwgJiYgKmxhYmVsID8gbGFiZWwgOiAiPE5vbmU+IiwKKwkJICAgIHZlcmIgJiYgKnZlcmIgPyB2ZXJiIDogIjxOb25lPiIsIHNlbnNpdGl2ZSk7CisgICAgfQorI2VuZGlmCisjaWZkZWYgV1NERUJVR19TRU5TRQorICAgIGlmICh3c19kZWJ1ZykKKwl3c3RyYWNlKCJtZW51OiAgICUtMjEuMjBzJS0yMS4yMHMoJXMpXG4iLCBsYWJlbCwgdmVyYiwKKwkJKnNlbnNpdGl2ZSA9PSAnMScgPyAiU2Vuc2l0aXZlIiA6ICJJbnNlbnNpdGl2ZSIpOworI2VuZGlmCisKKyAgICBpZiAoYWNjZWxlcmF0b3JUZXh0ICE9IE5VTEwpCisJc3ByaW50ZihhY2NUZXh0LCAiPFRhYj4lcyIsIGFjY2VsZXJhdG9yVGV4dCk7CisgICAgZWxzZQorCWFjY1RleHRbMF0gPSBOVUw7CisgICAgdXBkYXRlUHJpb3JpdHkoRmFsc2UpOworICAgIHNwcmludGYobmFtZWJ1ZiwgIiVzLiVzIiwgY3VyTWVudU5hbWUsIGZpeHVwKGxhYmVsKSk7CisgICAgc3ByaW50ZihjYnVmLCAiYW1lbnUgJXMgJXMlc1x0OndzdmVyYiAlczxDUj4iLAorCSAgICBjdXJNZW51UHJpb3JpdHksIG5hbWVidWYsIGFjY1RleHQsIHZlcmIpOworCisgICAgY29sb25jbWQoY2J1ZiwgVFJVRSk7CisgICAgYWRkTWVudShuYW1lYnVmLCBmaXhBY2NlbFRleHQoYWNjZWxlcmF0b3JUZXh0KSwgdmVyYik7CisKKyAgICBpZiAoKnNlbnNpdGl2ZSA9PSAnMCcpCisgICAgeworCXNwcmludGYoY2J1ZiwgImFtZW51IGRpc2FibGUgJXMiLCBuYW1lYnVmKTsKKwljb2xvbmNtZChjYnVmLCBUUlVFKTsKKyAgICB9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgY29tcGxldGUgV29ya1Nob3AgbWVudSBkZXNjcmlwdGlvbiBoYXMgYmVlbgorICogc2VudCBvdmVyIGZyb20gZXNlcnZlLiBXZSBkbyBzb21lIG1lbnUgY2xlYW51cC4KKyAqLworCisgICAgdm9pZAord29ya3Nob3BfbWVudV9lbmQoKQoreworICAgIEJvb2xlYW4JCSB1c2luZ190ZWFyb2ZmOwkvKiBzZXQgcGVyIGN1cnJlbnQgb3B0aW9uIHNldHRpbmcgKi8KKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9tZW51X2VuZCgpXG4iKTsKKyNlbmRpZgorCisgICAgdXNpbmdfdGVhcm9mZiA9IHZpbV9zdHJjaHIocF9nbywgR09fVEVBUk9GRikgIT0gTlVMTDsKKyAgICBndWlfbWNoX3RvZ2dsZV90ZWFyb2Zmcyh1c2luZ190ZWFyb2ZmKTsKK30KKworICAgIHZvaWQKK3dvcmtzaG9wX3Rvb2xiYXJfYmVnaW4oKQoreworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF90b29sYmFyX2JlZ2luKClcbiIpOworI2VuZGlmCisKKyAgICBjb2xvbmNtZCgiYXVubWVudSBUb29sQmFyIiwgVHJ1ZSk7CisgICAgdGJwcmkgPSAxMDsKK30KKworICAgIHZvaWQKK3dvcmtzaG9wX3Rvb2xiYXJfZW5kKCkKK3sKKyAgICBjaGFyX3UJYnVmWzY0XTsKKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKyAgICB7CisJd3N0cmFjZSgid29ya3Nob3BfdG9vbGJhcl9lbmQoKVxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIFR1cm4gb24gVG9vbEJhci4KKyAgICAgKi8KKyAgICBTVFJDUFkoYnVmLCBwX2dvKTsKKyAgICBpZiAodmltX3N0cmNocihwX2dvLCAnVCcpID09IE5VTEwpCisgICAgeworCVNUUkNBVChidWYsICJUIik7CisJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImdvIiwgMEwsIGJ1ZiwgMCk7CisgICAgfQorICAgIHdvcmtzaG9wSW5pdERvbmUgPSBUcnVlOworfQorCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCit3b3Jrc2hvcF90b29sYmFyX2J1dHRvbigKKwljaGFyCSpsYWJlbCwKKwljaGFyCSp2ZXJiLAorCWNoYXIJKnNlbnNlVmVyYiwKKwljaGFyCSpmaWxlcG9zLAorCWNoYXIJKmhlbHAsCisJY2hhcgkqc2Vuc2UsCisJY2hhcgkqZmlsZSwKKwljaGFyCSpsZWZ0KQoreworICAgIGNoYXIJY2J1ZltCVUZTSVogKyBNQVhQQVRITEVOXTsKKyAgICBjaGFyCW5hbWVidWZbQlVGU0laXTsKKyAgICBzdGF0aWMgaW50CXRiaWQgPSAxOworICAgIGNoYXJfdQkqcDsKKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSkpCisJd3NkZWJ1Zygid29ya3Nob3BfdG9vbGJhcl9idXR0b24oXCIlc1wiLCAlcywgJXMsXG4iCisJCSJcdCVzLCBcIiVzXCIsICVzLFxuXHRcIiVzXCIsXG5cdDwlcz4pXG4iLAorCQlsYWJlbCAgICYmICpsYWJlbCAgID8gbGFiZWwgICA6ICI8Tm9uZT4iLAorCQl2ZXJiICAgICYmICp2ZXJiICAgID8gdmVyYiAgICA6ICI8Tm9uZT4iLAorCQlzZW5zZVZlcmIgJiYgKnNlbnNlVmVyYiAgICA/IHNlbnNlVmVyYiAgICA6ICI8Tm9uZT4iLAorCQlmaWxlcG9zICYmICpmaWxlcG9zID8gZmlsZXBvcyA6ICI8Tm9uZT4iLAorCQloZWxwICAgICYmICpoZWxwICAgID8gaGVscCAgICA6ICI8Tm9uZT4iLAorCQlzZW5zZSAgICYmICpzZW5zZSAgID8gc2Vuc2UgICA6ICI8Tm9uZT4iLAorCQlmaWxlICAgICYmICpmaWxlICAgID8gZmlsZSAgICA6ICI8Tm9uZT4iLAorCQlsZWZ0ICAgICYmICpsZWZ0ICAgID8gbGVmdCAgICA6ICI8Tm9uZT4iKTsKKyAgICBlbHNlIGlmIChXU0RMRVZFTChXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfdG9vbGJhcl9idXR0b24oXCIlc1wiLCAlcylcbiIsCisJCWxhYmVsICAgJiYgKmxhYmVsICAgPyBsYWJlbCAgIDogIjxOb25lPiIsCisJCXZlcmIgICAgJiYgKnZlcmIgICAgPyB2ZXJiICAgIDogIjxOb25lPiIpOworI2VuZGlmCisjaWZkZWYgV1NERUJVR19TRU5TRQorICAgIGlmICh3c19kZWJ1ZykKKwl3c2RlYnVnKCJidXR0b246ICUtMjEuMjBzJS0yMS4yMHMoJXMpXG4iLCBsYWJlbCwgdmVyYiwKKwkJKnNlbnNlID09ICcxJyA/ICJTZW5zaXRpdmUiIDogIkluc2Vuc2l0aXZlIik7CisjZW5kaWYKKworICAgIGlmIChsZWZ0ICYmICpsZWZ0ICYmIGF0b2kobGVmdCkgPiAwKQorICAgIHsKKwkvKiBBZGQgYSBzZXBhcmF0b3IgKGJ1dCBwYXNzIHRoZSB3aWR0aCBwYXNzZWQgYWZ0ZXIgdGhlICc6JykgKi8KKwlzcHJpbnRmKGNidWYsICJhbWVudSAxLiVkIFRvb2xCYXIuLXNlcCVkOiVzLSA8bnVsPiIsCisJCXRicHJpIC0gNSwgdGJpZCsrLCBsZWZ0KTsKKworCWNvbG9uY21kKGNidWYsIFRydWUpOworICAgIH0KKworICAgIHAgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKChjaGFyX3UgKilsYWJlbCwgKGNoYXJfdSAqKSJcXC4gIik7CisgICAgc3ByaW50ZihuYW1lYnVmLCAiVG9vbEJhci4lcyIsIHApOworICAgIHZpbV9mcmVlKHApOworICAgIFNUUkNQWShjYnVmLCAiYW1lbnUgPHNpbGVudD4gIik7CisgICAgaWYgKGZpbGUgIT0gTlVMTCAmJiAqZmlsZSAhPSBOVUwpCisgICAgeworCXAgPSB2aW1fc3Ryc2F2ZV9lc2NhcGVkKChjaGFyX3UgKilmaWxlLCAoY2hhcl91ICopIiAiKTsKKwlzcHJpbnRmKGNidWYgKyBTVFJMRU4oY2J1ZiksICJpY29uPSVzICIsIHApOworCXZpbV9mcmVlKHApOworICAgIH0KKyAgICBzcHJpbnRmKGNidWYgKyBTVFJMRU4oY2J1ZiksICIxLiVkICVzIDp3c3ZlcmIgJXM8Q1I+IiwKKwkJCQkJCQl0YnByaSwgbmFtZWJ1ZiwgdmVyYik7CisKKyAgICAvKiBEZWZpbmUgdGhlIG1lbnUgaXRlbSAqLworICAgIGNvbG9uY21kKGNidWYsIFRydWUpOworCisgICAgaWYgKCpzZW5zZSA9PSAnMCcpCisgICAgeworCS8qIElmIG1lbnUgaXNuJ3Qgc2Vuc2l0aXZlIGF0IHN0YXJ0dXAuLi4gKi8KKwlzcHJpbnRmKGNidWYsICJhbWVudSBkaXNhYmxlICVzIiwgbmFtZWJ1Zik7CisJY29sb25jbWQoY2J1ZiwgVHJ1ZSk7CisgICAgfQorCisgICAgaWYgKGhlbHAgJiYgKmhlbHApCisgICAgeworCS8qIERvIHRoZSB0b29sdGlwICovCisJc3ByaW50ZihjYnVmLCAidG1lbnUgJXMgJXMiLCBuYW1lYnVmLCBoZWxwKTsKKwljb2xvbmNtZChjYnVmLCBUcnVlKTsKKyAgICB9CisKKyAgICBhZGRNZW51KG5hbWVidWYsIE5VTEwsIHZlcmIpOworICAgIHRicHJpICs9IDEwOworfQorCisgICAgdm9pZAord29ya3Nob3BfZnJhbWVfc2Vuc2l0aXZpdGllcygKKwlWZXJiU2Vuc2UJKnZzKQkJLyogbGlzdCBvZiB2ZXJicyB0byAoZGUpc2Vuc2l0aXplICovCit7CisgICAgVmVyYlNlbnNlCSp2cDsJCS8qIGl0ZXJhdGUgdGhyb3VnaCB2cyAqLworICAgIGNoYXIJKm1lbnVfbmFtZTsJLyogdXNlZCBpbiBtZW51IGxvb2t1cCAqLworICAgIGludAkJIGNudDsJCS8qIGNvdW50IG9mIHZlcmJzIHRvIHNraXAgKi8KKyAgICBpbnQJCSBsZW47CQkvKiBsZW5ndGggb2Ygbm9udmFyaWFudCBwYXJ0IG9mIGNvbW1hbmQgKi8KKyAgICBjaGFyCSBjYnVmWzQwOTZdOworCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFKSB8fCBXU0RMRVZFTCg0KSkKKyAgICB7CisJd3NkZWJ1Zygid29ya3Nob3BfZnJhbWVfc2Vuc2l0aXZpdGllcyhcbiIpOworCWZvciAodnAgPSB2czsgdnAtPnZlcmIgIT0gTlVMTDsgdnArKykKKwkgICAgd3NkZWJ1ZygiXHQlLTI1cyVkXG4iLCB2cC0+dmVyYiwgdnAtPnNlbnNlKTsKKwl3c2RlYnVnKCIpXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoV1NETEVWRUwoV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2ZyYW1lX3NlbnNpdGl2aXRpZXMoKVxuIik7CisjZW5kaWYKKyNpZmRlZiBXU0RFQlVHX1NFTlNFCisgICAgaWYgKHdzX2RlYnVnKQorCWZvciAodnAgPSB2czsgdnAtPnZlcmIgIT0gTlVMTDsgdnArKykKKwkgICAgd3NkZWJ1ZygiY2hhbmdlOiAlLTIxLjIwcyUtMjEuMjBzKCVzKVxuIiwKKwkJICAgICIiLCB2cC0+dmVyYiwgdnAtPnNlbnNlID09IDEgPworCQkgICAgIlNlbnNpdGl2ZSIgOiAiSW5zZW5zaXRpdmUiKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBMb29rIGZvciBhbGwgbWF0Y2hpbmcgbWVudSBlbnRyaWVzIGZvciB0aGUgdmVyYi4gVGhlcmUgbWF5IGJlIG1vcmUKKyAgICAgKiB0aGFuIG9uZSBpZiB0aGUgdmVyYiBoYXMgYm90aCBhIG1lbnUgYW5kIHRvb2xiYXIgZW50cnkuCisgICAgICovCisgICAgZm9yICh2cCA9IHZzOyB2cC0+dmVyYiAhPSBOVUxMOyB2cCsrKQorICAgIHsKKwljbnQgPSAwOworCXN0cmNweShjYnVmLCAiYW1lbnUiKTsKKwlzdHJjYXQoY2J1ZiwgIiAiKTsKKwlzdHJjYXQoY2J1ZiwgdnAtPnNlbnNlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCXN0cmNhdChjYnVmLCAiICIpOworCWxlbiA9IHN0cmxlbihjYnVmKTsKKwl3aGlsZSAoKG1lbnVfbmFtZSA9IGxvb2t1cFZlcmIodnAtPnZlcmIsIGNudCsrKSkgIT0gTlVMTCkKKwl7CisJICAgIHN0cmNweSgmY2J1ZltsZW5dLCBtZW51X25hbWUpOworCSAgICBjb2xvbmNtZChjYnVmLCBGQUxTRSk7CisJfQorICAgIH0KKyAgICBndWlfdXBkYXRlX21lbnVzKDApOworICAgIGd1aV9tY2hfZmx1c2goKTsKK30KKworICAgIHZvaWQKK3dvcmtzaG9wX3NldF9vcHRpb24oCisJY2hhcgkqb3B0aW9uLAkJLyogbmFtZSBvZiBhIHN1cHBvcnRlZCBvcHRpb24gKi8KKwljaGFyCSp2YWx1ZSkJCQkvKiB2YWx1ZSB0byBzZXQgb3B0aW9uIHRvICovCit7CisgICAgY2hhcgkgY2J1ZltCVUZTSVpdOwkJLyogY29tbWFuZCBidWZmZXIgKi8KKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKyAgICB7CisJd3N0cmFjZSgid29ya3Nob3Bfc2V0X29wdGlvbiglcywgJXMpXG4iLCBvcHRpb24sIHZhbHVlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGNidWZbMF0gPSBOVUw7CisgICAgc3dpdGNoICgqb3B0aW9uKQkJLyogc3dpdGNoIG9uIDFzdCBsZXR0ZXIgKi8KKyAgICB7CisJY2FzZSAncyc6CisJICAgIGlmIChzdHJjbXAob3B0aW9uLCAic3ludGF4IikgPT0gMCkKKwkJc3ByaW50ZihjYnVmLCAic3ludGF4ICVzIiwgdmFsdWUpOworCSAgICBlbHNlIGlmIChzdHJjbXAob3B0aW9uLCAic2F2ZWZpbGVzIikgPT0gMCkKKwkJOyAvKiBYWFggLSBOb3QgeWV0IGltcGxlbWVudGVkICovCisJICAgIGJyZWFrOworCisJY2FzZSAnbCc6CisJICAgIGlmIChzdHJjbXAob3B0aW9uLCAibGluZW5vIikgPT0gMCkKKwkJc3ByaW50ZihjYnVmLCAic2V0ICVzbnUiLAorCQkJKHN0cmNtcCh2YWx1ZSwgIm9uIikgPT0gMCkgPyAiIiA6ICJubyIpOworCSAgICBicmVhazsKKworCWNhc2UgJ3AnOgorCSAgICBpZiAoc3RyY21wKG9wdGlvbiwgInBhcmVudGhlc2VzIikgPT0gMCkKKwkJc3ByaW50ZihjYnVmLCAic2V0ICVzc20iLAorCQkJKHN0cmNtcCh2YWx1ZSwgIm9uIikgPT0gMCkgPyAiIiA6ICJubyIpOworCSAgICBicmVhazsKKworCWNhc2UgJ3cnOgorCSAgICAvKiB0aGlzIG9wdGlvbiBpcyBzZXQgYnkgYSBkaXJlY3QgY2FsbCAqLworI2lmZGVmIFdTREVCVUcKKwkgICAgd3NkZWJ1Zygid29ya3Nob3Bfc2V0X29wdGlvbjogIgorCQkgICAgIkdvdCB1bmV4cGVjdGVkIHdvcmtzaG9wa2V5cyBvcHRpb24iKTsKKyNlbmRpZgorCSAgICBicmVhazsKKworCWNhc2UgJ2InOgkvKiB0aGVzZSBvcHRpb25zIGFyZSBzZXQgZnJvbSBkaXJlY3QgY2FsbHMgKi8KKwkgICAgaWYgKG9wdGlvbls3XSA9PSBOVUwgJiYgc3RyY21wKG9wdGlvbiwgImJhbGxvb24iKSA9PSAwKQorCSAgICB7CisjaWZkZWYgV1NERUJVRworCQkvKiBzZXQgYnkgZGlyZWN0IGNhbGwgdG8gd29ya3Nob3BfYmFsbG9vbl9tb2RlICovCisJCXdzZGVidWcoIndvcmtzaG9wX3NldF9vcHRpb246ICIKKwkJCSJHb3QgdW5leHBlY3RlZCBiYWxsb29uZXZhbCBvcHRpb24iKTsKKyNlbmRpZgorCSAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcChvcHRpb24sICJiYWxsb29uZGVsYXkiKSA9PSAwKQorCSAgICB7CisjaWZkZWYgV1NERUJVRworCQkvKiBzZXQgYnkgZGlyZWN0IGNhbGwgdG8gd29ya3Nob3BfYmFsbG9vbl9kZWxheSAqLworCQl3c2RlYnVnKCJ3b3Jrc2hvcF9zZXRfb3B0aW9uOiAiCisJCQkiR290IHVuZXhwZWN0ZWQgYmFsbG9vbmRlbGF5IG9wdGlvbiIpOworI2VuZGlmCisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjYnVmWzBdICE9IE5VTCkKKwljb2xvbmNtZChjYnVmLCBUUlVFKTsKK30KKworCisgICAgdm9pZAord29ya3Nob3BfYmFsbG9vbl9tb2RlKAorCUJvb2xlYW4JIG9uKQoreworICAgIGNoYXIJIGNidWZbQlVGU0laXTsJCS8qIGNvbW1hbmQgYnVmZmVyICovCisKKyNpZmRlZiBXU0RFQlVHX1RSQUNFCisgICAgaWYgKFdTRExFVkVMKFdTX1RSQUNFX1ZFUkJPU0UgfCBXU19UUkFDRSkpCisJd3N0cmFjZSgid29ya3Nob3BfYmFsbG9vbl9tb2RlKCVzKVxuIiwgb24gPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyNlbmRpZgorCisgICAgc3ByaW50ZihjYnVmLCAic2V0ICVzYmV2YWwiLCBvbiA/ICIiIDogIm5vIik7CisgICAgY29sb25jbWQoY2J1ZiwgVFJVRSk7Cit9CisKKworICAgIHZvaWQKK3dvcmtzaG9wX2JhbGxvb25fZGVsYXkoCisJaW50CSBkZWxheSkKK3sKKyAgICBjaGFyCSBjYnVmW0JVRlNJWl07CQkvKiBjb21tYW5kIGJ1ZmZlciAqLworCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2JhbGxvb25fZGVsYXkoJWQpXG4iLCBkZWxheSk7CisjZW5kaWYKKworICAgIHNwcmludGYoY2J1ZiwgInNldCBiZGxheT0lZCIsIGRlbGF5KTsKKyAgICBjb2xvbmNtZChjYnVmLCBUUlVFKTsKK30KKworCisgICAgdm9pZAord29ya3Nob3Bfc2hvd19iYWxsb29uX3RpcCgKKwljaGFyCSp0aXApCit7CisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX3Nob3dfYmFsbG9vbl90aXAoJXMpXG4iLCB0aXApOworI2VuZGlmCisKKyAgICBpZiAoYmFsbG9vbkV2YWwgIT0gTlVMTCkKKwlndWlfbWNoX3Bvc3RfYmFsbG9vbihiYWxsb29uRXZhbCwgKGNoYXJfdSAqKXRpcCk7Cit9CisKKworICAgIHZvaWQKK3dvcmtzaG9wX2hvdGtleXMoCisJQm9vbGVhbglvbikKK3sKKyAgICBjaGFyCSBjYnVmW0JVRlNJWl07CQkvKiBjb21tYW5kIGJ1ZmZlciAqLworICAgIE1lbnVNYXAJKm1wOwkJCS8qIGl0ZXJhdGUgb3ZlciBtZW51TWFwIGVudHJpZXMgKi8KKworI2lmZGVmIFdTREVCVUdfVFJBQ0UKKyAgICBpZiAoV1NETEVWRUwoV1NfVFJBQ0VfVkVSQk9TRSB8IFdTX1RSQUNFKSkKKwl3c3RyYWNlKCJ3b3Jrc2hvcF9ob3RrZXlzKCVzKVxuIiwgb24gPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyNlbmRpZgorCisgICAgd29ya3Nob3BIb3RLZXlzRW5hYmxlZCA9IG9uOworICAgIGlmICh3b3Jrc2hvcEhvdEtleXNFbmFibGVkKQorCWZvciAobXAgPSBtZW51TWFwOyBtcCA8ICZtZW51TWFwW21lbnVNYXBTaXplXTsgbXArKykKKwl7CisJICAgIGlmIChtcC0+YWNjZWwgIT0gTlVMTCkKKwkgICAgeworCQlzcHJpbnRmKGNidWYsICJtYXAgJXMgOndzdmVyYiAlczxDUj4iLCBtcC0+YWNjZWwsIG1wLT52ZXJiKTsKKwkJY29sb25jbWQoY2J1ZiwgVFJVRSk7CisJICAgIH0KKwl9CisgICAgZWxzZQorCWZvciAobXAgPSBtZW51TWFwOyBtcCA8ICZtZW51TWFwW21lbnVNYXBTaXplXTsgbXArKykKKwl7CisJICAgIGlmIChtcC0+YWNjZWwgIT0gTlVMTCkKKwkgICAgeworCQlzcHJpbnRmKGNidWYsICJ1bm1hcCAlcyIsIG1wLT5hY2NlbCk7CisJCWNvbG9uY21kKGNidWYsIFRSVUUpOworCSAgICB9CisJfQorfQorCisvKgorICogQSBidXR0b24gaW4gdGhlIHRvb2xiYXIgaGFzIGJlZW4gcHVzaGVkLgorICovCisvKkFSR1NVU0VEKi8KKyAgICBpbnQKK3dvcmtzaG9wX2dldF9wb3NpdGlvbnMoCisJdm9pZAkJKmNsaWVudERhdGEsCS8qIHVudXNlZCAqLworCWNoYXIJICAgICAgICoqZmlsZW5hbWUsCS8qIG91dHB1dCBkYXRhICovCisJaW50CQkqY3VyTGluZSwJLyogb3V0cHV0IGRhdGEgKi8KKwlpbnQJCSpjdXJDb2wsCS8qIG91dHB1dCBkYXRhICovCisJaW50CQkqc2VsU3RhcnRMaW5lLAkvKiBvdXRwdXQgZGF0YSAqLworCWludAkJKnNlbFN0YXJ0Q29sLAkvKiBvdXRwdXQgZGF0YSAqLworCWludAkJKnNlbEVuZExpbmUsCS8qIG91dHB1dCBkYXRhICovCisJaW50CQkqc2VsRW5kQ29sLAkvKiBvdXRwdXQgZGF0YSAqLworCWludAkJKnNlbExlbmd0aCwJLyogb3V0cHV0IGRhdGEgKi8KKwljaGFyCSAgICAgICAqKnNlbGVjdGlvbikJLyogb3V0cHV0IGRhdGEgKi8KK3sKKyAgICBzdGF0aWMgY2hhcgkgZmZuYW1lW01BWFBBVEhMRU5dOworCisjaWZkZWYgV1NERUJVR19UUkFDRQorICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9WRVJCT1NFIHwgV1NfVFJBQ0UpKQorCXdzdHJhY2UoIndvcmtzaG9wX2dldF9wb3NpdGlvbnMoJSN4LCBcIiVzXCIsIC4uLilcbiIsCisJCWNsaWVudERhdGEsIChjdXJidWYgJiYgY3VyYnVmLT5iX3NmbmFtZSAhPSBOVUxMKQorCQkJCSAgICAgID8gKGNoYXIgKiljdXJidWYtPmJfc2ZuYW1lIDogIjxOb25lPiIpOworI2VuZGlmCisKKyAgICBzdHJjcHkoZmZuYW1lLCAoY2hhciAqKSBjdXJidWYtPmJfZmZuYW1lKTsKKyAgICAqZmlsZW5hbWUgPSBmZm5hbWU7CQkvKiBjb3B5IHNvIG5vYm9keSBjYW4gY2hhbmdlIGJfZmZuYW1lICovCisgICAgKmN1ckxpbmUgPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CisgICAgKmN1ckNvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOworCisgICAgaWYgKGN1cmJ1Zi0+Yl92aXN1YWxfbW9kZSA9PSAndicgJiYKKwkgICAgZXF1YWxwb3MoY3Vyd2luLT53X2N1cnNvciwgY3VyYnVmLT5iX3Zpc3VhbF9lbmQpKQorICAgIHsKKwkqc2VsU3RhcnRMaW5lID0gY3VyYnVmLT5iX3Zpc3VhbF9zdGFydC5sbnVtOworCSpzZWxTdGFydENvbCA9IGN1cmJ1Zi0+Yl92aXN1YWxfc3RhcnQuY29sOworCSpzZWxFbmRMaW5lID0gY3VyYnVmLT5iX3Zpc3VhbF9lbmQubG51bTsKKwkqc2VsRW5kQ29sID0gY3VyYnVmLT5iX3Zpc3VhbF9lbmQuY29sOworCSpzZWxlY3Rpb24gPSBnZXRfc2VsZWN0aW9uKGN1cmJ1Zik7CisJaWYgKCpzZWxlY3Rpb24pCisJICAgICpzZWxMZW5ndGggPSBzdHJsZW4oKnNlbGVjdGlvbik7CisJZWxzZQorCSAgICAqc2VsTGVuZ3RoID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkqc2VsU3RhcnRMaW5lID0gKnNlbEVuZExpbmUgPSAtMTsKKwkqc2VsU3RhcnRDb2wgPSAqc2VsRW5kQ29sID0gLTE7CisJKnNlbExlbmd0aCA9IDA7CisJKnNlbGVjdGlvbiA9ICIiOworICAgIH0KKworICAgIHJldHVybiBUcnVlOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXRpbGl0eSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGF0aWMgY2hhciAqCitnZXRfc2VsZWN0aW9uKAorCWJ1Zl9UCQkqYnVmKQkJLyogYnVmZmVyIHdob3NlIHNlbGVjdGlvbiB3ZSB3YW50ICovCit7CisgICAgcG9zX1QJKnN0YXJ0OwkJLyogc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiAqLworICAgIHBvc19UCSplbmQ7CQkvKiBlbmQgb2YgdGhlIHNlbGVjdGlvbiAqLworICAgIGNoYXIJKmxwOwkJLyogcG9pbnRlciB0byBhY3R1YWwgbGluZSBkYXRhICovCisgICAgaW50CQkgbGxlbjsJCS8qIGxlbmd0aCBvZiBhY3R1YWwgbGluZSBkYXRhICovCisgICAgY2hhcgkqc3A7CQkvKiBwb2ludGVyIHRvIHNlbGVjdGlvbiAgYnVmZmVyICovCisgICAgaW50CQkgc2xlbjsJCS8qIHN0cmluZyBsZW5ndGggaW4gc2VsZWN0aW9uIGJ1ZmZlciAqLworICAgIGludAkJIHNpemU7CQkvKiBzaXplIG9mIHNlbGVjdGlvbiBidWZmZXIgKi8KKyAgICBjaGFyCSpuZXdfc3A7CS8qIHRlbXAgcG9pbnRlciB0byBuZXcgc3AgKi8KKyAgICBpbnQJCSBsbnVtOwkJLyogbGluZSBudW1iZXIgd2UgYXJlIGFwcGVuZGluZyAqLworCisgICAgaWYgKGJ1Zi0+Yl92aXN1YWxfbW9kZSA9PSAndicpCisgICAgeworCXN0YXJ0ID0gJmJ1Zi0+Yl92aXN1YWxfc3RhcnQ7CisJZW5kID0gJmJ1Zi0+Yl92aXN1YWxfZW5kOworCWlmIChzdGFydC0+bG51bSA9PSBlbmQtPmxudW0pCisJeworCSAgICAvKiBzZWxlY3Rpb24gaXMgYWxsIG9uIG9uZSBsaW5lICovCisJICAgIGxwID0gKGNoYXIgKikgbWxfZ2V0X3BvcyhzdGFydCk7CisJICAgIGxsZW4gPSBlbmQtPmNvbCAtIHN0YXJ0LT5jb2wgKyAxOworCSAgICBzcCA9IChjaGFyICopIG1hbGxvYyhsbGVuICsgMSk7CisJICAgIGlmIChzcCAhPSBOVUxMKQorCSAgICB7CisJCXN0cm5jcHkoc3AsIGxwLCBsbGVuKTsKKwkJc3BbbGxlbl0gPSBOVUw7CisJICAgIH0KKwl9CisJZWxzZQorCXsKKwkgICAgLyogbXVsdGktbGluZSBzZWxlY3Rpb24gKi8KKwkgICAgbHAgPSAoY2hhciAqKSBtbF9nZXRfcG9zKHN0YXJ0KTsKKwkgICAgbGxlbiA9IHN0cmxlbihscCk7CisJICAgIHNwID0gKGNoYXIgKikgbWFsbG9jKEJVRlNJWiArIGxsZW4pOworCSAgICBpZiAoc3AgIT0gTlVMTCkKKwkgICAgeworCQlzaXplID0gQlVGU0laICsgbGxlbjsKKwkJc3RyY3B5KHNwLCBscCk7CisJCXNwW2xsZW5dID0gJ1xuJzsKKwkJc2xlbiA9IGxsZW4gKyAxOworCisJCWxudW0gPSBzdGFydC0+bG51bSArIDE7CisJCXdoaWxlIChsbnVtIDwgZW5kLT5sbnVtKQorCQkgICAgc3AgPSBhcHBlbmRfc2VsZWN0aW9uKGxudW0rKywgc3AsICZzaXplLCAmc2xlbik7CisKKwkJbHAgPSAoY2hhciAqKSBtbF9nZXQoZW5kLT5sbnVtKTsKKwkJbGxlbiA9IGVuZC0+Y29sICsgMTsKKwkJaWYgKChzbGVuICsgbGxlbikgPj0gc2l6ZSkKKwkJeworCQkgICAgbmV3X3NwID0gKGNoYXIgKikKKwkJCXJlYWxsb2Moc3AsIHNsZW4gKyBsbGVuICsgMSk7CisJCSAgICBpZiAobmV3X3NwICE9IE5VTEwpCisJCSAgICB7CisJCQlzaXplICs9IGxsZW4gKyAxOworCQkJc3AgPSBuZXdfc3A7CisJCSAgICB9CisJCX0KKwkJaWYgKChzbGVuICsgbGxlbikgPCBzaXplKQorCQl7CisJCSAgICBzdHJuY3B5KCZzcFtzbGVuXSwgbHAsIGxsZW4pOworCQkgICAgc3Bbc2xlbiArIGxsZW5dID0gTlVMOworCQl9CisKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZQorCXNwID0gTlVMTDsKKworICAgIHJldHVybiBzcDsKK30KKworICAgIHN0YXRpYyBjaGFyICoKK2FwcGVuZF9zZWxlY3Rpb24oCisJaW50CQkgbG51bSwJCS8qIGxpbmUgbnVtYmVyIHRvIGFwcGVuZCAqLworCWNoYXIJCSpzcCwJCS8qIHBvaW50ZXIgdG8gc2VsZWN0aW9uIGJ1ZmZlciAqLworCWludAkJKnNpemUsCQkvKiBwdHIgdG8gc2l6ZSBvZiBzcCAqLworCWludAkJKnNsZW4pCQkvKiBwdHIgdG8gbGVuZ3RoIG9mIHNlbGVjdGlvbiBzdHJpbmcgKi8KK3sKKyAgICBjaGFyCSpscDsJCS8qIGxpbmUgb2YgZGF0YSBmcm9tIGJ1ZmZlciAqLworICAgIGludAkJIGxsZW47CQkvKiBzdHJsZW4gb2YgbHAgKi8KKyAgICBjaGFyCSpuZXdfc3A7CS8qIHRlbXAgcG9pbnRlciB0byBuZXcgc3AgKi8KKworICAgIGxwID0gKGNoYXIgKiltbF9nZXQoKGxpbmVucl9UKWxudW0pOworICAgIGxsZW4gPSBzdHJsZW4obHApOworCisgICAgaWYgKCgqc2xlbiArIGxsZW4pIDw9ICpzaXplKQorICAgIHsKKwluZXdfc3AgPSAoY2hhciAqKSByZWFsbG9jKCh2b2lkICopIHNwLCBCVUZTSVogKyAqc2xlbiArIGxsZW4pOworCWlmICgqbmV3X3NwICE9IE5VTCkKKwl7CisJICAgICpzaXplID0gQlVGU0laICsgKnNsZW4gKyBsbGVuOworCSAgICBzcCA9IG5ld19zcDsKKwl9CisgICAgfQorICAgIGlmICgoKnNsZW4gKyBsbGVuKSA+ICpzaXplKQorICAgIHsKKwlzdHJjYXQoJnNwWypzbGVuXSwgbHApOworCSpzbGVuICs9IGxsZW47CisJc3BbKnNsZW4rK10gPSAnXG4nOworICAgIH0KKworICAgIHJldHVybiBzcDsKK30KKworCisKKyAgICBzdGF0aWMgdm9pZAorbG9hZF9idWZmZXJfYnlfbmFtZSgKKwljaGFyCSpmaWxlbmFtZSwJCS8qIHRoZSBmaWxlIHRvIGxvYWQgKi8KKwlpbnQJIGxudW0pCQkJLyogYW4gb3B0aW9uYWwgbGluZSBudW1iZXIgKG9yIDApICovCit7CisgICAgY2hhcgkgbG51bWJ1ZlsxNl07CQkvKiBtYWtlIGxpbmUgbnVtYmVyIG9wdGlvbiBmb3IgOmUgKi8KKyAgICBjaGFyCSBjYnVmW0JVRlNJWl07CQkvKiBjb21tYW5kIGJ1ZmZlciAqLworCisgICAgaWYgKGxudW0gPiAwKQorCXNwcmludGYobG51bWJ1ZiwgIislZCIsIGxudW0pOworICAgIGVsc2UKKwlsbnVtYnVmWzBdID0gTlVMOworCisgICAgc3ByaW50ZihjYnVmLCAiZSAlcyAlcyIsIGxudW1idWYsIGZpbGVuYW1lKTsKKyAgICBjb2xvbmNtZChjYnVmLCBGYWxzZSk7Cit9CisKKworICAgIHN0YXRpYyB2b2lkCitsb2FkX3dpbmRvdygKKwljaGFyCSpmaWxlbmFtZSwJCS8qIGZpbGVuYW1lIHRvIGxvYWQgKi8KKwlpbnQJIGxudW0pCQkJLyogbGluZW51bWJlciB0byBnbyB0byAqLworeworICAgIGJ1Zl9UCSpidWY7CQkvKiBidWZmZXIgZmlsZW5hbWUgaXMgc3RvcmVkIGluICovCisgICAgd2luX1QJKndpbjsJCS8qIHdpbmRvdyBmaWxlbm1lIGlzIGRpc3BsYXllZCBpbiAqLworCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgZmlsZW5hbWUgaXMgZGlzcGxheWVkIGFuZCBpcyB0aGUgY3VycmVudCB3aW5kb3cuCisgICAgICovCisKKyAgICBidWYgPSBidWZsaXN0X2ZpbmRuYW1lKChjaGFyX3UgKilmaWxlbmFtZSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8ICh3aW4gPSBnZXRfd2luZG93KGJ1ZikpID09IE5VTEwpCisgICAgeworCS8qIE5vIGJ1ZmZlciBvciBidWZmZXIgaXMgbm90IGluIGN1cnJlbnQgd2luZG93ICovCisJLyogd3NkZWJ1ZygibG9hZF93aW5kb3c6IGxvYWRfYnVmZmVyX2J5X25hbWUoXCIlc1wiLCAlZClcbiIsCisJCWZpbGVuYW1lLCBsbnVtKTsgKi8KKwlsb2FkX2J1ZmZlcl9ieV9uYW1lKGZpbGVuYW1lLCBsbnVtKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBidWYgaXMgaW4gYSB3aW5kb3cgKi8KKwlpZiAod2luICE9IGN1cndpbikKKwl7CisJICAgIHdpbl9lbnRlcih3aW4sIEZhbHNlKTsKKwkgICAgLyogd3NkZWJ1ZygibG9hZF93aW5kb3c6IHdpbmRvdyBlbmR0ZXIgJXNcbiIsCisJCSAgICB3aW4tPndfYnVmZmVyLT5iX3NmbmFtZSk7ICovCisJfQorCWlmIChsbnVtID4gMCAmJiB3aW4tPndfY3Vyc29yLmxudW0gIT0gbG51bSkKKwl7CisJICAgIHdhcnBfdG9fcGMobG51bSk7CisJICAgIC8qIHdzZGVidWcoImxvYWRfd2luZG93OiB3YXJwIHRvICVzWyVkXVxuIiwKKwkJICAgIHdpbi0+d19idWZmZXItPmJfc2ZuYW1lLCBsbnVtKTsgKi8KKwl9CisgICAgfQorICAgIG91dF9mbHVzaCgpOworfQorCisKKworICAgIHN0YXRpYyB2b2lkCit3YXJwX3RvX3BjKAorCWludAkgbG51bSkJCQkvKiBsaW5lIG51bWJlciB0byB3YXJwIHRvICovCit7CisgICAgY2hhcgkgbGJ1ZlsyNTZdOwkJLyogYnVpbGQgbGluZSBjb21hbmQgaGVyZSAqLworCisgICAgaWYgKGxudW0gPiAwKQorICAgIHsKKwlpZiAoU3RhdGUgJiBJTlNFUlQpCisJICAgIGFkZF90b19pbnB1dF9idWYoKGNoYXJfdSAqKSAiXDAzMyIsIDEpOworCWlmIChpc1Nob3dpbmcobG51bSkpCisJICAgIHNwcmludGYobGJ1ZiwgIiVkRyIsIGxudW0pOworCWVsc2UKKwkgICAgc3ByaW50ZihsYnVmLCAiJWR6LiIsIGxudW0pOworCWFkZF90b19pbnB1dF9idWYoKGNoYXJfdSAqKSBsYnVmLCBzdHJsZW4obGJ1ZikpOworICAgIH0KK30KKworICAgIHN0YXRpYyBCb29sZWFuCitpc1Nob3dpbmcoCisJaW50CSBsbnVtKQkJCS8qIHRlbGwgaWYgbGluZSBudW1iZXIgaXMgc2hvd2luZyAqLworeworICAgIHJldHVybiBsbnVtID49IGN1cndpbi0+d190b3BsaW5lICYmIGxudW0gPCBjdXJ3aW4tPndfYm90bGluZTsKK30KKworCisKKyAgICBzdGF0aWMgd2luX1QgKgorZ2V0X3dpbmRvdygKKwlidWZfVAkqYnVmKQkJLyogYnVmZmVyIHRvIGZpbmQgd2luZG93IGZvciAqLworeworICAgIHdpbl9UCSp3cCA9IE5VTEw7CS8qIHdpbmRvdyBmaWxlbmFtZSBpcyBpbiAqLworCisgICAgZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBOVUxMOyB3cCA9IFdfTkVYVCh3cCkpCisJaWYgKGJ1ZiA9PSB3cC0+d19idWZmZXIpCisJICAgIGJyZWFrOworICAgIHJldHVybiB3cDsKK30KKworCisjaWYgMCAvKiBub3QgdXNlZCAqLworICAgIHN0YXRpYyBpbnQKK2dldF9idWZmZXJfbnVtYmVyKAorCWJ1Zl9UCQkqYnVmKQkJLyogYnVmZmVyIHRvIGdldCBwb3NpdGlvbiBvZiAqLworeworICAgIGJ1Zl9UCSpicDsJCS8qIGl0ZXJhdGUgb3ZlciBidWZmZXIgbGlzdCAqLworICAgIGludAkJIHBvczsJCS8qIHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGxpc3QgKi8KKworICAgIHBvcyA9IDE7CisgICAgZm9yIChicCA9IGZpcnN0YnVmOyBicCAhPSBOVUxMOyBicCA9IGJwLT5iX25leHQpCisgICAgeworCWlmIChicCA9PSBidWYpCisJICAgIHJldHVybiBwb3M7CisJcG9zKys7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkCit1cGRhdGVQcmlvcml0eSgKKwlCb29sZWFuCQkgc3ViTWVudSkJLyogaWYgVHJ1ZSB0aGVuIHN0YXJ0IG5ldyBzdWJtZW51IHByaSAqLworeworICAgIGludAkJIHByaTsJCS8qIHByaW9yaXR5IG9mIHRoaXMgbWVudS9pdGVtICovCisgICAgY2hhcgkqcDsKKworICAgIHAgPSBzdHJyY2hyKGN1ck1lbnVQcmlvcml0eSwgJy4nKTsKKyAgICBBU1NFUlQocCAhPSBOVUxMKTsKKyAgICAqcCsrID0gTlVMOworCisgICAgcHJpID0gYXRvaShwKSArIDEwOwkJLyogb3VyIG5ldyBwcmlvcml0eSAqLworCisgICAgaWYgKHN1Yk1lbnUpCisJc3ByaW50ZihjdXJNZW51UHJpb3JpdHksICIlcy4lZC4wIiwgY3VyTWVudVByaW9yaXR5LCBwcmkpOworICAgIGVsc2UKKwlzcHJpbnRmKGN1ck1lbnVQcmlvcml0eSwgIiVzLiVkIiwgY3VyTWVudVByaW9yaXR5LCBwcmkpOworfQorCisgICAgc3RhdGljIGNoYXIgKgorYWRkVW5pcXVlTW5lbW9uaWMoCisJY2hhcgkJKm1uZW1vbmljcywJLyogY3VycmVudGx5IHVzZWQgbW5lbW9uaWNzICovCisJY2hhcgkJKmxhYmVsKQkJLyogbGFiZWwgb2YgbWVudSBuZWVkaW5nIG1uZW1vbmljICovCit7CisgICAgc3RhdGljIGNoYXIJIG5hbWVbQlVGU0laXTsJLyogYnVmZmVyIGZvciB0aGUgdXBkYXRlZCBuYW1lICovCisgICAgY2hhcgkqcDsJCS8qIHBvaW50ZXIgaW50byBsYWJlbCAqLworICAgIGNoYXIJKmZvdW5kOwkJLyogcG9pbnRlciB0byBwb3NzaWJsZSBtbmVtb25pYyAqLworCisgICAgZm91bmQgPSBOVUxMOworICAgIGZvciAocCA9IGxhYmVsOyAqcCAhPSBOVUw7IHArKykKKwlpZiAoc3RyY2hyKG1uZW1vbmljcywgKnApID09IDApCisJICAgIGlmIChmb3VuZCA9PSBOVUxMIHx8IChpc3VwcGVyKChpbnQpKnApICYmIGlzbG93ZXIoKGludCkqZm91bmQpKSkKKwkJZm91bmQgPSBwOworCisgICAgaWYgKGZvdW5kICE9IE5VTEwpCisgICAgeworCXN0cm5jcHkobmFtZSwgbGFiZWwsIChmb3VuZCAtIGxhYmVsKSk7CisJc3RyY2F0KG5hbWUsICImIik7CisJc3RyY2F0KG5hbWUsIGZvdW5kKTsKKyAgICB9CisgICAgZWxzZQorCXN0cmNweShuYW1lLCBsYWJlbCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworLyoKKyAqIFNvbWUgY2hhcmFjdGVycyBpbiBhIG1lbnUgbmFtZSBtdXN0IGJlIGVzY2FwZWQgaW4gdmltLiBTaW5jZSB0aGlzIGlzIHZpbQorICogc3BlY2lmaWMsIGl0IG11c3QgYmUgZG9uZSBvbiB0aGlzIHNpZGUuCisgKi8KKyAgICBzdGF0aWMgY2hhciAqCitmaXh1cCgKKwljaGFyCQkqbGFiZWwpCit7CisgICAgc3RhdGljIGNoYXIJIGJ1ZltCVUZTSVpdOworICAgIGNoYXIJCSpicDsJCS8qIHBvaW50ZXIgaW50byBidWYgKi8KKyAgICBjaGFyCQkqbHA7CQkvKiBwb2ludGVyIGludG8gbGFiZWwgKi8KKworICAgIGxwID0gbGFiZWw7CisgICAgYnAgPSBidWY7CisgICAgd2hpbGUgKCpscCAhPSBOVUwpCisgICAgeworCWlmICgqbHAgPT0gJyAnIHx8ICpscCA9PSAnLicpCisJICAgICpicCsrID0gJ1xcJzsKKwkqYnArKyA9ICpscCsrOworICAgIH0KKyAgICAqYnAgPSBOVUw7CisKKyAgICByZXR1cm4gYnVmOworfQorCisKKyNpZmRlZiBOT0hBTkRTX1NVUFBPUlRfRlVOQ1RJT05TCisKKy8qIEZvciB0aGUgTm9IYW5kcyB0ZXN0IHN1aXRlICovCisKKyAgICBjaGFyICoKK3dvcmtzaG9wX3Rlc3RfZ2V0Y3VycmVudGZpbGUoKQoreworICAgIGNoYXIJKmZpbGVuYW1lLCAqc2VsZWN0aW9uOworICAgIGludAkJY3VyTGluZSwgY3VyQ29sLCBzZWxTdGFydExpbmUsIHNlbFN0YXJ0Q29sLCBzZWxFbmRMaW5lOworICAgIGludAkJc2VsRW5kQ29sLCBzZWxMZW5ndGg7CisKKyAgICBpZiAod29ya3Nob3BfZ2V0X3Bvc2l0aW9ucygKKwkJTlVMTCwgJmZpbGVuYW1lLCAmY3VyTGluZSwgJmN1ckNvbCwgJnNlbFN0YXJ0TGluZSwKKwkJJnNlbFN0YXJ0Q29sLCAmc2VsRW5kTGluZSwgJnNlbEVuZENvbCwgJnNlbExlbmd0aCwKKwkJJnNlbGVjdGlvbikpCisJcmV0dXJuIGZpbGVuYW1lOworICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKK30KKworICAgIGludAord29ya3Nob3BfdGVzdF9nZXRjdXJzb3Jyb3coKQoreworICAgIHJldHVybiAwOworfQorCisgICAgaW50Cit3b3Jrc2hvcF90ZXN0X2dldGN1cnNvcmNvbCgpCit7CisgICAgY2hhcgkqZmlsZW5hbWUsICpzZWxlY3Rpb247CisgICAgaW50CQljdXJMaW5lLCBjdXJDb2wsIHNlbFN0YXJ0TGluZSwgc2VsU3RhcnRDb2wsIHNlbEVuZExpbmU7CisgICAgaW50CQlzZWxFbmRDb2wsIHNlbExlbmd0aDsKKworICAgIGlmICh3b3Jrc2hvcF9nZXRfcG9zaXRpb25zKAorCQlOVUxMLCAmZmlsZW5hbWUsICZjdXJMaW5lLCAmY3VyQ29sLCAmc2VsU3RhcnRMaW5lLAorCQkmc2VsU3RhcnRDb2wsICZzZWxFbmRMaW5lLCAmc2VsRW5kQ29sLCAmc2VsTGVuZ3RoLAorCQkmc2VsZWN0aW9uKSkKKwlyZXR1cm4gY3VyQ29sOworICAgIGVsc2UKKwlyZXR1cm4gLTE7Cit9CisKKyAgICBjaGFyICoKK3dvcmtzaG9wX3Rlc3RfZ2V0Y3Vyc29ycm93dGV4dCgpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyAgICBjaGFyICoKK3dvcmtzaG9wX3Rlc3RfZ2V0c2VsZWN0ZWR0ZXh0KCkKK3sKKyAgICBjaGFyCSpmaWxlbmFtZSwgKnNlbGVjdGlvbjsKKyAgICBpbnQJCWN1ckxpbmUsIGN1ckNvbCwgc2VsU3RhcnRMaW5lLCBzZWxTdGFydENvbCwgc2VsRW5kTGluZTsKKyAgICBpbnQJCXNlbEVuZENvbCwgc2VsTGVuZ3RoOworCisgICAgaWYgKHdvcmtzaG9wX2dldF9wb3NpdGlvbnMoCisJCU5VTEwsICZmaWxlbmFtZSwgJmN1ckxpbmUsICZjdXJDb2wsICZzZWxTdGFydExpbmUsCisJCSZzZWxTdGFydENvbCwgJnNlbEVuZExpbmUsICZzZWxFbmRDb2wsICZzZWxMZW5ndGgsCisJCSZzZWxlY3Rpb24pKQorCXJldHVybiBzZWxlY3Rpb247CisgICAgZWxzZQorCXJldHVybiBOVUxMOworfQorCisvKkFSR1NVU0VEKi8KKyAgICB2b2lkCit3b3Jrc2hvcF9zYXZlX3NlbnNpdGl2aXR5KGNoYXIgKmZpbGVuYW1lKQoreworfQorCisjZW5kaWYKKworICAgIHN0YXRpYyBjaGFyICoKK2ZpeEFjY2VsVGV4dCgKKwljaGFyCQkqYXApCQkvKiBvcmlnaW5hbCBhY2NlbGVyYXRvclRleHQgKi8KK3sKKyAgICBjaGFyCWJ1ZlsyNTZdOwkvKiBidWlsZCBpbiB0ZW1wIGJ1ZmZlciAqLworICAgIGNoYXIJKnNoaWZ0OwkJLyogc2hpZnQgc3RyaW5nIG9mICIiICovCisKKyAgICBpZiAoYXAgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qIElmIHRoZSBhY2NlbGVyYXRvciBpcyBzaGlmdGVkIHVzZSB0aGUgdmltIGZvcm0gKi8KKyAgICBpZiAoc3RybmNtcCgiU2hpZnQrIiwgYXAsIDYpID09IDApCisgICAgeworCXNoaWZ0ID0gIlMtIjsKKwlhcCArPSA2OworICAgIH0KKyAgICBlbHNlCisJc2hpZnQgPSAiIjsKKworICAgIGlmICgqYXAgPT0gJ0YnICYmIGF0b2koJmFwWzFdKSA+IDApCisgICAgeworCXNwcmludGYoYnVmLCAiPCVzJXM+Iiwgc2hpZnQsIGFwKTsKKwlyZXR1cm4gc3RyZHVwKGJ1Zik7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIEZFQVRfQkVWQUwKKyAgICBzdGF0aWMgdm9pZAorYmV2YWxDQigKKwlCYWxsb29uRXZhbAkqYmV2YWwsCisJaW50CQkgc3RhdGUpCit7CisgICAgY2hhcl91CSpmaWxlbmFtZTsKKyAgICBjaGFyX3UJKnRleHQ7CisgICAgaW50CQkgdHlwZTsKKyAgICBpbnQJCSBsaW5lOworICAgIGludAkJIGNvbDsKKyAgICBpbnQJCSBpZHg7CisgICAgY2hhcgkgYnVmW01BWFBBVEhMRU4gKiAyXTsKKyAgICBzdGF0aWMgaW50CSBzZXJpYWxObyA9IC0xOworCisgICAgaWYgKCFwX2JldmFsKQorCXJldHVybjsKKworICAgIGlmIChndWlfbWNoX2dldF9iZXZhbF9pbmZvKGJldmFsLCAmZmlsZW5hbWUsICZsaW5lLCAmdGV4dCwgJmNvbCkgPT0gT0spCisgICAgeworCWlmICh0ZXh0ICYmIHRleHRbMF0pCisJeworCSAgICAvKiBTZW5kIGRlYnVnZ2VyIHJlcXVlc3QgKi8KKwkgICAgaWYgKHN0cmxlbigoY2hhciAqKSB0ZXh0KSA+IChNQVhQQVRITEVOLzIpKQorCSAgICB7CisJCS8qCisJCSAqIFRoZSB1c2VyIGhhcyBwcm9iYWJseSBzZWxlY3RlZCB0aGUgZW50aXJlCisJCSAqIGJ1ZmZlciBvciBzb21ldGhpbmcgbGlrZSB0aGF0IC0gZG9uJ3QgYXR0ZW1wdAorCQkgKiB0byBldmFsdWF0ZSBpdAorCQkgKi8KKwkJcmV0dXJuOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogV29ya1Nob3AgZXhwZWN0cyB0aGUgY29sIHRvIGJlIGEgY2hhcmFjdGVyIGluZGV4LCBub3QKKwkgICAgICogYSBjb2x1bW4gbnVtYmVyLiBDb21wdXRlIHRoZSBpbmRleCBmcm9tIGNvbC4gQWxzbyBzZXQKKwkgICAgICogbGluZSB0byAwIGJlY2F1c2UgdGhhdHMgd2hhdCBkYnggZXhwZWN0cy4KKwkgICAgICovCisJICAgIGlkeCA9IGNvbXB1dGVJbmRleChjb2wsIHRleHQsIGJldmFsLT50cyk7CisJICAgIGlmIChpZHggPiAwKQorCSAgICB7CisJCWxpbmUgPSAwOworCisJCS8qCisJCSAqIElmIHN1Y2Nlc3NmdWwsIGl0IHdpbGwgcmVzcG9uZCB3aXRoIGEgYmFsbG9vbiBjbWQuCisJCSAqLworCQlpZiAoc3RhdGUgJiBDb250cm9sTWFzaykKKwkJICAgIC8qIEV2YWx1YXRlICooZXhwcmVzc2lvbikgKi8KKwkJICAgIHR5cGUgPSAoaW50KUdQTGluZUV2YWxfSU5ESVJFQ1Q7CisJCWVsc2UgaWYgKHN0YXRlICYgU2hpZnRNYXNrKQorCQkgICAgLyogRXZhbHVhdGUgdHlwZShleHByZXNzaW9uKSAqLworCQkgICAgdHlwZSA9IChpbnQpR1BMaW5lRXZhbF9UWVBFOworCQllbHNlCisJCSAgICAvKiBFdmFsdWF0ZSB2YWx1ZShleHByZXNzaW9uKSAqLworCQkgICAgdHlwZSA9IChpbnQpR1BMaW5lRXZhbF9FVkFMVUFURTsKKworCQkvKiBTZW5kIHJlcXVlc3QgdG8gZGJ4ICovCisJCXNwcmludGYoYnVmLCAidG9vbFZlcmIgZGVidWcuYmFsbG9vbkV2YWwgIgorCQkJIiVzICVkLDAgJWQsMCAlZCwlZCAlZCAlc1xuIiwgKGNoYXIgKikgZmlsZW5hbWUsCisJCQlsaW5lLCBpZHgsIHR5cGUsIHNlcmlhbE5vKyssCisJCQlzdHJsZW4oKGNoYXIgKikgdGV4dCksIChjaGFyICopIHRleHQpOworCQliYWxsb29uRXZhbCA9IGJldmFsOworCQl3b3Jrc2hvcF9zZW5kX21lc3NhZ2UoYnVmKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisjZW5kaWYKKworCisgICAgc3RhdGljIGludAorY29tcHV0ZUluZGV4KAorCWludAkJIHdhbnRlZENvbCwKKwljaGFyX3UJCSpsaW5lLAorCWludAkJIHRzKQoreworICAgIGludAkJIGNvbCA9IDA7CisgICAgaW50CQkgaWR4ID0gMDsKKworICAgIHdoaWxlIChsaW5lW2lkeF0pCisgICAgeworCWlmIChsaW5lW2lkeF0gPT0gJ1x0JykKKwkgICAgY29sICs9IHRzIC0gKGNvbCAlIHRzKTsKKwllbHNlCisJICAgIGNvbCsrOworCWlkeCsrOworCWlmIChjb2wgPj0gd2FudGVkQ29sKQorCSAgICByZXR1cm4gaWR4OworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworICAgIHN0YXRpYyB2b2lkCithZGRNZW51KAorCWNoYXIJCSptZW51LAkJLyogbWVudSBuYW1lICovCisJY2hhcgkJKmFjY2VsLAkJLyogYWNjZWxlcmF0b3IgdGV4dCAob3B0aW9uYWwpICovCisJY2hhcgkJKnZlcmIpCQkvKiBXb3JrU2hvcCBhY3Rpb24tdmVyYiAqLworeworICAgIE1lbnVNYXAJCSpuZXdNYXA7CisgICAgY2hhcgkJIGNidWZbQlVGU0laXTsKKworICAgIGlmIChtZW51TWFwU2l6ZSA+PSBtZW51TWFwTWF4KQorICAgIHsKKwluZXdNYXAgPSByZWFsbG9jKG1lbnVNYXAsCisJCXNpemVvZihNZW51TWFwKSAqIChtZW51TWFwTWF4ICsgTUVOVV9JTkMpKTsKKwlpZiAobmV3TWFwICE9IE5VTEwpCisJeworCSAgICBtZW51TWFwID0gbmV3TWFwOworCSAgICBtZW51TWFwTWF4ICs9IE1FTlVfSU5DOworCX0KKyAgICB9CisgICAgaWYgKG1lbnVNYXBTaXplIDwgbWVudU1hcE1heCkKKyAgICB7CisJbWVudU1hcFttZW51TWFwU2l6ZV0ubmFtZSA9IHN0cmR1cChtZW51KTsKKwltZW51TWFwW21lbnVNYXBTaXplXS5hY2NlbCA9IGFjY2VsICYmICphY2NlbCA/IHN0cmR1cChhY2NlbCkgOiBOVUxMOworCW1lbnVNYXBbbWVudU1hcFNpemUrK10udmVyYiA9IHN0cmR1cCh2ZXJiKTsKKwlpZiAoYWNjZWwgJiYgd29ya3Nob3BIb3RLZXlzRW5hYmxlZCkKKwl7CisJICAgIHNwcmludGYoY2J1ZiwgIm1hcCAlcyA6d3N2ZXJiICVzPENSPiIsIGFjY2VsLCB2ZXJiKTsKKwkgICAgY29sb25jbWQoY2J1ZiwgVFJVRSk7CisJfQorICAgIH0KK30KKworICAgIHN0YXRpYyBjaGFyICoKK25hbWVTdHJpcCgKKwljaGFyCQkqcmF3KQkJLyogbWVudSBuYW1lLCBwb3NzaWJseSB3aXRoICYgY2hhcnMgKi8KK3sKKyAgICBzdGF0aWMgY2hhcgkJYnVmW0JVRlNJWl07CS8qIGJ1aWxkIHN0cmlwcGVkIG5hbWUgaGVyZSAqLworICAgIGNoYXIJCSpicCA9IGJ1ZjsKKworICAgIHdoaWxlICgqcmF3KQorICAgIHsKKwlpZiAoKnJhdyAhPSAnJicpCisJICAgICpicCsrID0gKnJhdzsKKwlyYXcrKzsKKyAgICB9CisgICAgKmJwID0gTlVMOworICAgIHJldHVybiBidWY7Cit9CisKKworICAgIHN0YXRpYyBjaGFyICoKK2xvb2t1cFZlcmIoCisJY2hhcgkqdmVyYiwKKwlpbnQJc2tpcCkJCS8qIG51bWJlciBvZiBtYXRjaGVzIHRvIHNraXAgKi8KK3sKKyAgICBpbnQJCWk7CQkvKiBsb29wIGl0ZXJhdG9yICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVudU1hcFNpemU7IGkrKykKKwlpZiAoc3RyY21wKG1lbnVNYXBbaV0udmVyYiwgdmVyYikgPT0gMCAmJiBza2lwLS0gPT0gMCkKKwkgICAgcmV0dXJuIG5hbWVTdHJpcChtZW51TWFwW2ldLm5hbWUpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworICAgIHN0YXRpYyB2b2lkCitjb2xvbmNtZCgKKwljaGFyCSpjbWQsCQkvKiB0aGUgY29tbWFuZCB0byBwcmludCAqLworCUJvb2xlYW4JZm9yY2UpCQkvKiBmb3JjZSBjdXJzb3IgdXBkYXRlICovCit7CisgICAgY2hhcl91CSpjcG9fc2F2ZSA9IHBfY3BvOworCisjaWZkZWYgV1NERUJVRworICAgIGlmIChXU0RMRVZFTChXU19UUkFDRV9DT0xPTkNNRCkpCisJd3NkZWJ1ZygiQ21kOiAlc1xuIiwgY21kKTsKKyNlbmRpZgorCisgICAgcF9jcG8gPSBlbXB0eV9vcHRpb247CisKKyAgICBBTFRfSU5QVVRfTE9DS19PTjsKKyAgICBkb19jbWRsaW5lX2NtZCgoY2hhcl91ICopY21kKTsKKyAgICBBTFRfSU5QVVRfTE9DS19PRkY7CisKKyAgICBwX2NwbyA9IGNwb19zYXZlOworCisgICAgaWYgKGZvcmNlKQorCWd1aV91cGRhdGVfc2NyZWVuKCk7Cit9CisKKy8qCisgKiBzZXREb2xsYXJWaW0gLQlHaXZlbiB0aGUgcnVuIGRpcmVjdG9yeSwgc2VhcmNoIGZvciB0aGUgdmltIGluc3RhbGwKKyAqCQkJZGlyZWN0b3J5IGFuZCBzZXQgJFZJTS4KKyAqCisgKgkJCVdlIGNhbiBiZSBydW5uaW5nIG91dCBvZiBTVU5Xc3Byby9iaW4gb3Igb3V0IG9mCisgKgkJCVNVTldzcHJvL2NvbnRyaWIvY29udHJpYjYvdmltNS42L2JpbiBzbyB3ZSBjaGVjaworICoJCQlyZWxhdGl2ZSB0byBib3RoIG9mIHRoZXNlIGRpcmVjdG9yaWVzLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldERvbGxhclZpbSgKKwljaGFyCSpydW5kaXIpCit7CisgICAgY2hhcgkgYnVmW01BWFBBVEhMRU5dOworICAgIGNoYXIJKmNwOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBjYXNlOiBSdW5uaW5nIGZyb20gPGluc3RhbGwtZGlyPi9TVU5Xc3Byby9iaW4KKyAgICAgKi8KKyAgICBzdHJjcHkoYnVmLCBydW5kaXIpOworICAgIHN0cmNhdChidWYsICIvLi4vY29udHJpYi9jb250cmliNi92aW0iIFZJTV9WRVJTSU9OX1NIT1JUICIvc2hhcmUvdmltLyIKKwkgICAgVklNX1ZFUlNJT05fTk9ET1QgIi9zeW50YXgvc3ludGF4LnZpbSIpOworICAgIGlmIChhY2Nlc3MoYnVmLCBSX09LKSA9PSAwKQorICAgIHsKKwlzdHJjcHkoYnVmLCAiU1BST19XU0RJUj0iKTsKKwlzdHJjYXQoYnVmLCBydW5kaXIpOworCWNwID0gc3RycmNocihidWYsICcvJyk7CisJaWYgKGNwICE9IE5VTEwpCisJICAgIHN0cmNweShjcCwgIi9XUzZVMiIpOworCXB1dGVudihzdHJkdXAoYnVmKSk7CisKKwlzdHJjcHkoYnVmLCAiVklNPSIpOworCXN0cmNhdChidWYsIHJ1bmRpcik7CisJc3RyY2F0KGJ1ZiwgIi8uLi9jb250cmliL2NvbnRyaWI2L3ZpbSIgVklNX1ZFUlNJT05fU0hPUlQgIi9zaGFyZS92aW0vIgorCQlWSU1fVkVSU0lPTl9OT0RPVCk7CisJcHV0ZW52KHN0cmR1cChidWYpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWNvbmQgY2FzZTogUHJvYmFibHkgcnVubmluZyBmcm9tCisgICAgICoJCTxpbnN0YWxsLWRpcj4vU1VOV3Nwcm8vY29udHJpYi9jb250cmliNi92aW01LjYvYmluCisgICAgICovCisgICAgc3RyY3B5KGJ1ZiwgcnVuZGlyKTsKKyAgICBzdHJjYXQoYnVmLCAiLy4uLy4uLy4uL2NvbnRyaWIvY29udHJpYjYvdmltIiBWSU1fVkVSU0lPTl9TSE9SVAorCSAgICAiL3NoYXJlL3ZpbS8iIFZJTV9WRVJTSU9OX05PRE9UICIvc3ludGF4L3N5bnRheC52aW0iKTsKKyAgICBpZiAoYWNjZXNzKGJ1ZiwgUl9PSykgPT0gMCkKKyAgICB7CisJc3RyY3B5KGJ1ZiwgIlNQUk9fV1NESVI9Iik7CisJc3RyY2F0KGJ1ZiwgcnVuZGlyKTsKKwljcCA9IHN0cnJjaHIoYnVmLCAnLycpOworCWlmIChjcCAhPSBOVUxMKQorCSAgICBzdHJjcHkoY3AsICIuLi8uLi8uLi8uLi9XUzZVMiIpOworCXB1dGVudihzdHJkdXAoYnVmKSk7CisKKwlzdHJjcHkoYnVmLCAiVklNPSIpOworCXN0cmNhdChidWYsIHJ1bmRpcik7CisJc3RyY2F0KGJ1ZiwgIi8uLi8uLi8uLi9jb250cmliL2NvbnRyaWI2L3ZpbSIgVklNX1ZFUlNJT05fU0hPUlQKKwkJIi9zaGFyZS92aW0vIiBWSU1fVkVSU0lPTl9OT0RPVCk7CisJcHV0ZW52KHN0cmR1cChidWYpKTsKKwlyZXR1cm47CisgICAgfQorfQorCisvKgorICogZmluZFlvdXJzZWxmIC0JRmluZCB0aGUgZGlyZWN0b3J5IHdlIGFyZSBydW5uaW5nIGZyb20uIFRoaXMgaXMgdXNlZCB0bworICoJCQlzZXQgJFZJTS4gV2UgbmVlZCB0byBzZXQgdGhpcyBiZWNhdXNlIHVzZXJzIGNhbiBpbnN0YWxsCisgKgkJCXRoZSBwYWNrYWdlIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuIHRoZSBjb21waWxlZAorICoJCQlkaXJlY3RvcnkuIFRoaXMgaXMgYSBTdW4gVmlzdWFsIFdvcmtTaG9wIHJlcXVpcmVtZW50IQorICoKKyAqIE5vdGU6CQlXZSBvdmVycmlkZSBhIHVzZXIncyAkVklNIGJlY2F1c2UgaXQgd29uJ3QgaGF2ZSB0aGUKKyAqCQkJV29ya1Nob3Agc3BlY2lmaWMgZmlsZXMuIFMvaGUgbWF5IG5vdCBsaWtlIHRoaXMgYnV0IGl0cworICoJCQliZXR0ZXIgdGhhbiBnZXR0aW5nIHRoZSB3cm9uZyBmaWxlcyAoZXNwZWNpYWxseSBhcyB0aGUKKyAqCQkJdXNlciBpcyBsaWtlbHkgdG8gaGF2ZSAkVklNIHNldCB0byA1LjQgb3IgbGF0ZXIpLgorICovCisgICAgdm9pZAorZmluZFlvdXJzZWxmKAorICAgIGNoYXIJKmFyZ3YwKQoreworICAgIGNoYXIJKnJ1bnBhdGggPSBOVUxMOworICAgIGNoYXIJKnBhdGg7CisgICAgY2hhcgkqcGF0aGJ1ZjsKKworICAgIGlmICgqYXJndjAgPT0gJy8nKQorCXJ1bnBhdGggPSBzdHJkdXAoYXJndjApOworICAgIGVsc2UgaWYgKCphcmd2MCA9PSAnLicgfHwgc3RyY2hyKGFyZ3YwLCAnLycpKQorICAgIHsKKwlydW5wYXRoID0gKGNoYXIgKikgbWFsbG9jKE1BWFBBVEhMRU4pOworCWdldGN3ZChydW5wYXRoLCBNQVhQQVRITEVOKTsKKwlzdHJjYXQocnVucGF0aCwgIi8iKTsKKwlzdHJjYXQocnVucGF0aCwgYXJndjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwlpZiAocGF0aCAhPSBOVUxMKQorCXsKKwkgICAgcnVucGF0aCA9IChjaGFyICopIG1hbGxvYyhNQVhQQVRITEVOKTsKKwkgICAgcGF0aGJ1ZiA9IHN0cmR1cChwYXRoKTsKKwkgICAgcGF0aCA9IHN0cnRvayhwYXRoYnVmLCAiOiIpOworCSAgICBkbworCSAgICB7CisJCXN0cmNweShydW5wYXRoLCBwYXRoKTsKKwkJc3RyY2F0KHJ1bnBhdGgsICIvIik7CisJCXN0cmNhdChydW5wYXRoLCBhcmd2MCk7CisJCWlmIChhY2Nlc3MocnVucGF0aCwgWF9PSykgPT0gMCkKKwkJICAgIGJyZWFrOworCSAgICB9IHdoaWxlICgocGF0aCA9IHN0cnRvayhOVUxMLCAiOiIpKSAhPSBOVUxMKTsKKwkgICAgZnJlZShwYXRoYnVmKTsKKwl9CisgICAgfQorCisgICAgaWYgKHJ1bnBhdGggIT0gTlVMTCkKKyAgICB7CisJY2hhciBydW5idWZbTUFYUEFUSExFTl07CisKKwkvKgorCSAqIFdlIGZvdW5kIHRoZSBydW4gZGlyZWN0b3J5LiBOb3cgZmluZCB0aGUgaW5zdGFsbCBkaXIuCisJICovCisJKHZvaWQpdmltX0Z1bGxOYW1lKChjaGFyX3UgKilydW5wYXRoLCAoY2hhcl91ICopcnVuYnVmLCBNQVhQQVRITEVOLCAxKTsKKwlwYXRoID0gc3RycmNocihydW5idWYsICcvJyk7CisJaWYgKHBhdGggIT0gTlVMTCkKKwkgICAgKnBhdGggPSBOVUw7CQkvKiByZW1vdmUgdGhlIHZpbS9ndmltIG5hbWUgKi8KKwlwYXRoID0gc3RycmNocihydW5idWYsICcvJyk7CisJaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICAgIGlmIChzdHJuY21wKHBhdGgsICIvYmluIiwgNCkgPT0gMCkKKwkJc2V0RG9sbGFyVmltKHJ1bmJ1Zik7CisJICAgIGVsc2UgaWYgKHN0cm5jbXAocGF0aCwgIi9zcmMiLCA0KSA9PSAwKQorCSAgICB7CisJCSpwYXRoID0gTlVMOwkvKiBkZXZlbG9wbWVudCB0cmVlICovCisJCXNldERvbGxhclZpbShydW5idWYpOworCSAgICB9CisJfQorCWZyZWUocnVucGF0aCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3dvcmtzaG9wLmggYi9zcmMvd29ya3Nob3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIxMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dvcmtzaG9wLmgKQEAgLTAsMCArMSwyOCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoJCQlWaXN1YWwgV29ya3Nob3AgaW50ZWdyYXRpb24gYnkgR29yZG9uIFByaWV1cgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKi8KKworI2lmICFkZWZpbmVkKFdPUktTSE9QX0gpICYmIGRlZmluZWQoRkVBVF9TVU5fV09SS1NIT1ApCisjZGVmaW5lIFdPUktTSE9QX0gKKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYbS9YbS5oPgorCisjaW5jbHVkZSAiaW50ZWdyYXRpb24uaCIKKworI2lmZGVmIFdTREVCVUcKKyMgaW5jbHVkZSAid3NkZWJ1Zy5oIgorI2Vsc2UKKyMgaWZuZGVmIEFTU0VSVAorIyAgZGVmaW5lIEFTU0VSVChjKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBpbnQJCXVzaW5nU3VuV29ya1Nob3A7CS8qIHNldCBpZiAtd3MgZmxhZyBpcyB1c2VkICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3dzZGVidWcuYyBiL3NyYy93c2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkYmE5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93c2RlYnVnLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIHZpOnNldCB0cz04IHN0cz04IHN3PTg6CisgKgorICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKKyAqCQkJVmlzdWFsIFdvcmtzaG9wIGludGVncmF0aW9uIGJ5IEdvcmRvbiBQcmlldXIKKyAqCisgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KKyAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgorICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCisgKi8KKworLyoKKyAqIFdvcmtTaG9wIERlYnVnZ2luZyBUb29scy4gV2hhdCBhcmUgdGhlc2UgdG9vbHMgYW5kIHdoeSBhcmUgdGhleSBpbXBvcnRhbnQ/CisgKiBUaGVyZSBhcmUgdHdvIG1haW4gdG9vbHMgaGVyZS4gVGhlIGZpcnN0IHRvb2wgaXMgYSB0b29sIGZvciBkZWxheWluZyBvcgorICogc3RvcHBpbmcgZ3ZpbSBkdXJpbmcgc3RhcnR1cC4gIFRoZSBzZWNvbmQgdG9vbCBpcyBhIHByb3RvY29sIGxvZyB0b29sLgorICoKKyAqIFRoZSBzdGFydHVwIGRlbGF5IHRvb2wgaXMgY2FsbGVkIHdzZGVidWdfd2FpdCgpLiBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IGZvcgorICogZGVidWdnaW5nIHN0YXJ0dXAgcHJvYmxlbXMgYmVjYXVzZSBndmltIHdpbGwgYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGZyb20KKyAqIHdvcmtzaG9wIGFuZCBjYW5ub3QgYmUgcnVuIGRpcmVjdGx5IGZyb20gYSBkZWJ1Z2dlci4gVGhlIG9ubHkgd2F5IHRvIGRlYnVnCisgKiBhIGd2aW0gc3RhcnRlZCBieSB3b3Jrc2hvcCBpcyBieSBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byBpdC4gV2l0aG91dCB0aGlzCisgKiB0b29sIGFsbCBzdGFydXAgY29kZSB3aWxsIGhhdmUgY29tcGxldGVkIGJlZm9yZSB5b3UgY2FuIGdldCB0aGUgcGlkIGFuZAorICogYXR0YWNoLgorICoKKyAqIFRoZSBzZWNvbmQgdG9vbCBpcyBhIHByb3RvY29sIGxvZyB0b29sLiBUaGUgd29ya3Nob3AgZWRpdG9yIHNlcnZlciBhbmQgZ3ZpbQorICogcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aCBkdXJpbmcgYSB3b3Jrc2hvcCBzZXNzaW9uLiBTb21ldGltZXMgaXQgaXMKKyAqIHZlcnkgaW1wb3J0YW50IHRvIHBlcnVzZSB0aGlzIGNvbnZlcnNhdGlvbiBpbiBvcmRlciB0byB1bmRlcnN0YW5kIHdoYXQgaXMKKyAqIGhhcHBlbmluZy4gVGhlIHdzZGVidWdfbG9nX2luaXQoKSBjYWxsIHNldHMgdXAgdGhpcyBwcm90b2NvbCBsb2cgdG9vbCBhbmQKKyAqIHdzZGVidWcoKSBhbmQgd3N0cmFjZSgpIGNhbGxzIG91dHB1dCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIGxvZy4KKyAqCisgKiBUaGlzIGNvZGUgbXVzdCBoYXZlIFdTREVCVUcgZGVmaW5lZCBmb3IgaXQgdG8gYmUgY29tcGlsZWQgaW50byB2aW0vZ3ZpbS4KKyAqLworCisjaWZkZWYgV1NERUJVRworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJ2aW0uaCIKKworRklMRQkJKndzX2RlYnVnID0gTlVMTDsKK3VfaW50CQkgd3NfZGxldmVsID0gMDsJCS8qIHdzX2RlYnVnIHZlcmJvc2l0eSBsZXZlbCAqLworCit2b2lkCQkgd3NkZWJ1ZyhjaGFyICosIC4uLik7Cit2b2lkCQkgd3N0cmFjZShjaGFyICosIC4uLik7CisKK3N0YXRpYyBpbnQJIGxvb2t1cChjaGFyICopOworc3RhdGljIGludAkgZXJyb3JIYW5kbGVyKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKik7CisKKworLyoKKyAqIHdzZGVidWdfd2FpdAktICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWxheSBvciBzdG9wIGV4ZWN1dGlvbiBvZiB2aW0uCisgKgkJICAgIEl0cyBub3JtYWxseSB1c2VkIHRvIGRlbGF5IHN0YXJ0dXAgd2hpbGUgYXR0YWNoaW5nIGEKKyAqCQkgICAgZGVidWdnZXIgdG8gYSBydW5uaW5nIHByb2Nlc3MuIFNpbmNlIHdvcmtzaG9wIHN0YXJ0cyBndmltCisgKgkJICAgIGZyb20gYSBiYWNrZ3JvdW5kIHByb2Nlc3MgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZGVidWcKKyAqCQkgICAgc3RhcnR1cCBwcm9ibGVtcy4KKyAqLworCit2b2lkIHdzZGVidWdfd2FpdCgKKwl1X2ludAkJIHdhaXRfZmxhZ3MsCS8qIHRlbGxzIHdoYXQgdG8gZG8gKi8KKwljaGFyCQkqd2FpdF92YXIsCS8qIHdhaXQgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwl1X2ludAkJIHdhaXRfc2VjcykJLyogaG93IG1hbnkgc2Vjb25kcyB0byB3YWl0ICovCit7CisKKwlpbml0X2hvbWVkaXIoKTsJCQkvKiBub3QgaW5pdGVkIHlldCAqLworI2lmZGVmIFVTRV9XRERVTVAKKwlXRER1bXAoMCwgMCwgMCk7CisjZW5kaWYKKworCS8qIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLworCWlmICh3YWl0X2ZsYWdzICYgV1RfRU5WICYmIHdhaXRfdmFyICYmIGdldGVudih3YWl0X3ZhcikgIT0gTlVMTCkgeworCQlzbGVlcChhdG9pKGdldGVudih3YWl0X3ZhcikpKTsKKwl9IGVsc2UgaWYgKHdhaXRfZmxhZ3MgJiBXVF9XQUlUICYmIGxvb2t1cCgifi8uZ3ZpbXdhaXQiKSkgeworCQlzbGVlcCh3YWl0X3NlY3MgPiAwICYmIHdhaXRfc2VjcyA8IDEyMCA/IHdhaXRfc2VjcyA6IDIwKTsKKwl9IGVsc2UgaWYgKHdhaXRfZmxhZ3MgJiBXVF9TVE9QICYmIGxvb2t1cCgifi8uZ3ZpbXN0b3AiKSkgeworCQlpbnQgdyA9IDE7CisJCXdoaWxlICh3KSB7CisJCQk7CisJCX0KKwl9Cit9ICAgIC8qIGVuZCB3c2RlYnVnX3dhaXQgKi8KKworCit2b2lkCit3c2RlYnVnX2xvZ19pbml0KAorCWNoYXIJCSpsb2dfdmFyLAkvKiBlbnYgdmFyIHdpdGggbG9nIGZpbGUgKi8KKwljaGFyCQkqbGV2ZWxfdmFyKQkvKiBlbnYgdmFyIHdpdGggd3NfZGVidWcgbGV2ZWwgKi8KK3sKKwljaGFyCQkqZmlsZTsJCS8qIHBvc3NpYmxlIHdzX2RlYnVnIG91dHB1dCBmaWxlICovCisJY2hhcgkJKmNwOwkJLyogd3NfZGxldmVsIHBvaW50ZXIgKi8KKworCWlmIChsb2dfdmFyICYmIChmaWxlID0gZ2V0ZW52KGxvZ192YXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgYnVmW0JVRlNJWl07CisKKwkJc3ByaW50ZihidWYsICJkYXRlID4gJXMiLCBmaWxlKTsKKwkJc3lzdGVtKGJ1Zik7CisJCXdzX2RlYnVnID0gZm9wZW4oZmlsZSwgImEiKTsKKwkJaWYgKGxldmVsX3ZhciAmJiAoY3AgPSBnZXRlbnYobGV2ZWxfdmFyKSkgIT0gTlVMTCkgeworCQkJd3NfZGxldmVsID0gc3RydG91bChjcCwgTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQl3c19kbGV2ZWwgPSBXU19UUkFDRTsJLyogZGVmYXVsdCBsZXZlbCAqLworCQl9CisJCS8qIFhTZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsgKi8KKwl9CisKK30gICAgLyogZW5kIHdzZGVidWdfbG9nX2luaXQgKi8KKworCisKKwordm9pZAord3N0cmFjZSgKKwljaGFyCQkqZm10LAorCS4uLikKK3sKKwl2YV9saXN0CQkgYXA7CisKKwlpZiAod3NfZGVidWchPSBOVUxMICYmICh3c19kbGV2ZWwgJiAoV1NfVFJBQ0UgfCBXU19UUkFDRV9WRVJCT1NFKSkpIHsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCXZmcHJpbnRmKHdzX2RlYnVnLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJZmZsdXNoKHdzX2RlYnVnKTsKKwl9CisKK30gICAgLyogZW5kIHdzdHJhY2UgKi8KKworCit2b2lkCit3c2RlYnVnKAorCWNoYXIJCSpmbXQsCisJLi4uKQoreworCXZhX2xpc3QJCSBhcDsKKworCWlmICh3c19kZWJ1ZyAhPSBOVUxMKSB7CisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQl2ZnByaW50Zih3c19kZWJ1ZywgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWZmbHVzaCh3c19kZWJ1Zyk7CisJfQorCit9ICAgIC8qIGVuZCB3c2RlYnVnICovCisKKworc3RhdGljIGludAorbG9va3VwKAorCWNoYXIJCSpmaWxlKQoreworCWNoYXIJCSBidWZbQlVGU0laXTsKKworCWV4cGFuZF9lbnYoKGNoYXJfdSAqKSBmaWxlLCAoY2hhcl91ICopIGJ1ZiwgQlVGU0laKTsKKwlyZXR1cm4gKGFjY2VzcyhidWYsIEZfT0spID09IDApOworCit9ICAgIC8qIGVuZCBsb29rdXAgKi8KKworc3RhdGljIGludAorZXJyb3JIYW5kbGVyKAorCURpc3BsYXkJCSpkcHksCisJWEVycm9yRXZlbnQJKmVycikKK3sKKwljaGFyCQkgbXNnWzI1Nl07CisJY2hhcgkJIGJ1ZlsyNTZdOworCisJWEdldEVycm9yVGV4dChkcHksIGVyci0+ZXJyb3JfY29kZSwgbXNnLCBzaXplb2YobXNnKSk7CisJd3NkZWJ1ZygiXG5cbldTREVCVUcgVmltOiBYIEVycm9yIG9mIGZhaWxlZCByZXF1ZXN0OiAlc1xuIiwgbXNnKTsKKworCXNwcmludGYoYnVmLCAiJWQiLCBlcnItPnJlcXVlc3RfY29kZSk7CisJWEdldEVycm9yRGF0YWJhc2VUZXh0KGRweSwKKwkgICAgIlhSZXF1ZXN0IiwgYnVmLCAiVW5rbm93biIsIG1zZywgc2l6ZW9mKG1zZykpOworCXdzZGVidWcoIlx0TWFqb3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0OiAlZCAoJXMpXG4iLAorCSAgICBlcnItPnJlcXVlc3RfY29kZSwgbXNnKTsKKwlpZiAoZXJyLT5yZXF1ZXN0X2NvZGUgPiAxMjgpIHsKKwkJd3NkZWJ1ZygiXHRNaW5vciBvcGNvZGUgb2YgZmFpbGVkIHJlcXVlc3Q6ICVkXG4iLAorCQkgICAgZXJyLT5taW5vcl9jb2RlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKyNlbmRpZiAvKiBXU0RFQlVHICovCmRpZmYgLS1naXQgYS9zcmMvd3NkZWJ1Zy5oIGIvc3JjL3dzZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RhNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dzZGVidWcuaApAQCAtMCwwICsxLDgxIEBACisvKiB2aTpzZXQgdHM9OCBzdHM9OCBzdz04OgorICoKKyAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCisgKgkJCVZpc3VhbCBXb3Jrc2hvcCBpbnRlZ3JhdGlvbiBieSBHb3Jkb24gUHJpZXVyCisgKgorICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCisgKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KKyAqLworCisKKyNpZm5kZWYgV1NERUJVR19ICisjZGVmaW5lIFdTREVCVUdfSAorCisjaWZkZWYgV1NERUJVRworCisjaWZuZGVmIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoYykgXAorICAgIGlmICghKGMpKSB7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQsIGZpbGUgJXNcbiIsIFwKKwkJX19MSU5FX18sIF9fRklMRV9fKTsgXAorCWZmbHVzaChzdGRlcnIpOyBcCisJYWJvcnQoKTsgXAorICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIFdTX1RSQUNFCQkweDAwMDAwMDAxCisjZGVmaW5lIFdTX1RSQUNFX1ZFUkJPU0UJMHgwMDAwMDAwMgorI2RlZmluZSBXU19UUkFDRV9DT0xPTkNNRAkweDAwMDAwMDA0CisjZGVmaW5lIFdTX0RFQlVHX0FMTAkJMHhmZmZmZmZmZgorCisjZGVmaW5lIFdTRExFVkVMKGZsYWdzKQkJKHdzX2RlYnVnICE9IE5VTEwgJiYgKHdzX2RsZXZlbCAmIChmbGFncykpKQorCisjaWZkZWYgVVNFX1dERFVNUAorI2luY2x1ZGUgIndkdW1wLmgiCisjZW5kaWYKKworI2RlZmluZSBXU0RFQlVHX1RSQUNFCTEKKy8vI2RlZmluZSBXU0RFQlVHX1NFTlNFCTIKKwordHlwZWRlZiBlbnVtIHsKKwkJV1RfRU5WID0gMSwJCS8qIGxvb2sgZm9yIGVudiB2YXIgaWYgc2V0ICovCisJCVdUX1dBSVQsCQkvKiBsb29rIGZvciB+Ly5ndmltd2FpdCBpZiBzZXQgKi8KKwkJV1RfU1RPUAkJCS8qIGxvb2sgZm9yIH4vLmd2aW1zdG9wIGlmIHNldCAqLworfSBXdFdhaXQ7CisKKwordm9pZAkJIHdzZGVidWcoY2hhciAqLCAuLi4pOwordm9pZAkJIHdzdHJhY2UoY2hhciAqLCAuLi4pOworCisKK2V4dGVybiBGSUxFCSp3c19kZWJ1ZzsKK2V4dGVybiB1X2ludAkgd3NfZGxldmVsOwkJLyogd3NfZGVidWcgdmVyYm9zaXR5IGxldmVsICovCisKKyMgZWxzZQkJLyogbm90IFdTREVCVUcgKi8KKworI2lmbmRlZiBBU1NFUlQKKyMgZGVmaW5lIEFTU0VSVChjKQorI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDIgc3R1YnMgYXJlIG5lZWRlZCBiZWNhdXNlIGEgbWFjcm8gY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBvZgorICogdGhlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCisgKi8KKwordm9pZAord3NkZWJ1ZygKKwljaGFyCQkqZm10LAorCS4uLikKK3sKK30KKworCit2b2lkCit3c3RyYWNlKAorCWNoYXIJCSpmbXQsCisJLi4uKQoreworfQorCisjZW5kaWYgLyogV1NERUJVRyAqLworI2VuZGlmIC8qIFdTREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3hwbV93MzIuYyBiL3NyYy94cG1fdzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NjVlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94cG1fdzMyLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExvYWQgWFBNIGltYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcGxhY2VkIGluIHNlcGFyYXRlIGZpbGUgYmVjYXVzZSBYcG0gaGVhZGVycyBjb25mbGljdCB3aXRoCisgKiBWaW0gb25lcyA6KAorICoKKyAqIFdyaXR0ZW4gYnkgU2VyZ2V5IEtob3Jldi4KKyAqIGh0dHA6Ly9pYW1waGV0Lm5tLnJ1L3ZpbS9pbmRleC5odG1sCisgKi8KKworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8qIHJlZHVjZWQgZGVmIGZyb20gVmltLmggKi8KKyNpZm5kZWYgX19BUkdTCisjIGlmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoV0lOMzI2NCkKKyMgIGRlZmluZSBfX0FSR1MoeCkgeAorIyBlbHNlCisjICBkZWZpbmUgX19BUkdTKHgpICgpCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgInhwbV93MzIuaCIKKworLyogRW5nYWdlIFdpbmRvd3Mgc3VwcG9ydCBpbiBsaWJYcG0gKi8KKyNkZWZpbmUgRk9SX01TVworCisjaW5jbHVkZSAieHBtLmgiCisKKy8qCisgKiBUcmllcyB0byBsb2FkIFhwbSBpbWFnZSBmcm9tIGZpbGUgJ2ZpbGVuYW1lJy4KKyAqIElmIGZhaWxzIHJldHVybiAtMS4KKyAqIHN1Y2Nlc3MgLSAwIGFuZCBpbWFnZSBhbmQgbWFzayBCSVRNQVBTCisgKi8KKyAgICBpbnQKK0xvYWRYcG1JbWFnZShmaWxlbmFtZSwgaEltYWdlLCBoU2hhcGUpCisgICAgY2hhciAgICAqZmlsZW5hbWU7CisgICAgSEJJVE1BUCAqaEltYWdlOworICAgIEhCSVRNQVAgKmhTaGFwZTsKK3sKKyAgICBYSW1hZ2UJICAgICppbWc7ICAgLyogbG9hZGVkIGltYWdlICovCisgICAgWEltYWdlCSAgICAqc2hwOyAgLyogc2hhcGVpbWFnZSAqLworICAgIFhwbUF0dHJpYnV0ZXMgICBhdHRyOworICAgIGludAkJICAgIHJlczsKKyAgICBIREMJCSAgICBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisKKyAgICBhdHRyLnZhbHVlbWFzayA9IDA7CisgICAgcmVzID0gWHBtUmVhZEZpbGVUb0ltYWdlKCZoZGMsIGZpbGVuYW1lLCAmaW1nLCAmc2hwLCAmYXR0cik7CisgICAgRGVsZXRlREMoaGRjKTsKKyAgICBpZiAocmVzIDwgMCkKKwlyZXR1cm4gLTE7CisgICAgZWxzZQorICAgIHsKKwkqaEltYWdlID0gaW1nLT5iaXRtYXA7CisJKmhTaGFwZSA9IHNocC0+Yml0bWFwOworCXJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy94cG1fdzMyLmggYi9zcmMveHBtX3czMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTQ0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveHBtX3czMi5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciB4cG1fdzMyLmMKKyAqLworCisjaWZuZGVmIFhQTV9XMzJfX0gKK2ludCBMb2FkWHBtSW1hZ2UgX19BUkdTKChjaGFyICpmaWxlbmFtZSwgSEJJVE1BUCAqaEltYWdlLCBIQklUTUFQICpoU2hhcGUpKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3h4ZC9NYWtlX2FtaWdhLm1hayBiL3NyYy94eGQvTWFrZV9hbWlnYS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzODIwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94eGQvTWFrZV9hbWlnYS5tYWsKQEAgLTAsMCArMSwxOCBAQAorIyBNYWtlZmlsZSBmb3IgeHhkIG9uIHRoZSBBbWlnYSwgdXNpbmcgQXp0ZWMvTWFueCBDIDUuMCBvciBsYXRlcgorIworCisjPj4+Pj4gY2hvb3NlIGJldHdlZW4gZGVidWdnaW5nICgtYnMpIG9yIG9wdGltaXppbmcgKC1zbykKK09QVElPTlMgPSAtc28KKyNPUFRJT05TID0gLWJzCisKKyM+Pj4+Pj4gY2hvb3NlIC1nIGZvciBkZWJ1Z2dpbmcKK0xOX0RFQlVHID0KKyNMTl9ERUJVRyA9IC1nCisKK0NGTEFHUyA9ICQoT1BUSU9OUykgLXdhcHJ1cSAtcHMgLXFmIC1EQU1JR0EgLURjb25zdD0KKworWHhkOiB4eGQubworCWxuICtxIC1tICQoTE5fREVCVUcpIC1vIFh4ZCB4eGQubyAtbGMxNgorCit4eGQubzogeHhkLmMKKwljYyAkKENGTEFHUykgeHhkLmMgLW8geHhkLm8KZGlmZiAtLWdpdCBhL3NyYy94eGQvTWFrZV9iYzMubWFrIGIvc3JjL3h4ZC9NYWtlX2JjMy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlMjUyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94eGQvTWFrZV9iYzMubWFrCkBAIC0wLDAgKzEsMzEgQEAKKyMgU2ltcGxlIG1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyA0LjAKKyMgMy4xIGNhbiBOT1QgYmUgdXNlZCwgaXQgaGFzIHByb2JsZW1zIHdpdGggdGhlIGZpbGVubygpIGRlZmluZS4KKworIyBDb21tYW5kIGxpbmUgdmFyaWFibGVzOgorIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgKEU6XEJPUkxBTkRDKQorIyBERUJVRwkJc2V0IHRvICJ5ZXMiIGZvciBkZWJ1Z2dpbmcgKG5vKQorCishaWZuZGVmIEJPUgorQk9SCT0gZTpcYmM0CishZW5kaWYKKworIWlmICgiJChERUJVRykiID09ICJ5ZXMiKQorREVCVUdfRkxBRyA9IC12IC1EREVCVUcKKyFlbHNlCitERUJVR19GTEFHID0KKyFlbmRpZgorCitDQwk9ICQoQk9SKVxiaW5cYmNjCitJTkMJPSAtSSQoQk9SKVxpbmNsdWRlCitMSUIJPSAtTCQoQk9SKVxsaWIKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGUgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBmb3IgYmV0dGVyIG1hY2hpbmVzLgorIwlyZXBsYWNlIC0xLSB3aXRoIC0yIHRvIHByb2R1Y2UgY29kZSBmb3IgYSA4MDI4NiBvciBoaWdoZXIKKyMJcmVwbGFjZSAtMS0gd2l0aCAtMyB0byBwcm9kdWNlIGNvZGUgZm9yIGEgODAzODYgb3IgaGlnaGVyCisjCWFkZCAtdiBmb3Igc291cmNlIGRlYnVnZ2luZworT1BUSU1JWkU9IC0xLSAtT3gKKworQ0ZMQUdTCT0gLUEgLW1jIC1ETVNET1MgJChERUJVR19GTEFHKSAkKE9QVElNSVpFKSAkKElOQykgJChMSUIpCisKK3h4ZC5leGU6IHh4ZC5jCisJJChDQykgJChDRkxBR1MpIHh4ZC5jCmRpZmYgLS1naXQgYS9zcmMveHhkL01ha2VfYmM1Lm1hayBiL3NyYy94eGQvTWFrZV9iYzUubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDQ2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveHhkL01ha2VfYmM1Lm1hawpAQCAtMCwwICsxLDE4IEBACisjIFRoZSBtb3N0IHNpbXBsaXN0aWMgTWFrZWZpbGUgZm9yIFdpbjMyIChOVCBhbmQgV2luZG93cyA5NSkuCisjIFVzZWQgZm9yIEJvcmxhbmQgQysrLgorCishaWYgKCIkKEJPUikiPT0iIikKK0JPUiA9IGM6XGJjNQorIWVuZGlmCishaWYgKCIkKEJDQykiPT0iIikKK0JDQyA9IGJjYzMyCishZW5kaWYKKworeHhkOiB4eGQuZXhlCisKK3h4ZC5leGU6IHh4ZC5jCisJJChCQ0MpIC1JJChCT1IpXGluY2x1ZGUgLUwkKEJPUilcbGliIC1EV0lOMzIgeHhkLmMgJChCT1IpXGxpYlx3aWxkYXJncy5vYmoKKworY2xlYW46CisJLSBkZWwgeHhkLm9iagorCS0gZGVsIHh4ZC5leGUKZGlmZiAtLWdpdCBhL3NyYy94eGQvTWFrZV9jeWcubWFrIGIvc3JjL3h4ZC9NYWtlX2N5Zy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0YjdiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94eGQvTWFrZV9jeWcubWFrCkBAIC0wLDAgKzEsMjcgQEAKKyMgVGhlIG1vc3Qgc2ltcGxpc3RpYyBNYWtlZmlsZSwgZm9yIEN5Z251cyBnY2Mgb24gTVMtRE9TCisKK2lmbmRlZiBVU0VETEwKK1VTRURMTCA9IG5vCitlbmRpZgorCitpZmVxICh5ZXMsICQoVVNFRExMKSkKK0RFRklORVMgPQorTElCUyAgICA9IC1sYworZWxzZQorREVGSU5FUyA9IC1tbm8tY3lnd2luCitMSUJTICAgID0KK2VuZGlmCisKK0NGTEFHUyA9IC1PMiAtV2FsbCAtRFdJTjMyICQoREVGSU5FUykKKworaWZuZXEgKHNoLmV4ZSwgJChTSEVMTCkpCitERUwgPSBybQorZWxzZQorREVMID0gZGVsCitlbmRpZgorCit4eGQuZXhlOiB4eGQuYworCWdjYyAkKENGTEFHUykgLXMgLW8geHhkLmV4ZSB4eGQuYyAkKExJQlMpCisKK2NsZWFuOgorCS0kKERFTCkgeHhkLmV4ZQpkaWZmIC0tZ2l0IGEvc3JjL3h4ZC9NYWtlX2RqZy5tYWsgYi9zcmMveHhkL01ha2VfZGpnLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVlZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3h4ZC9NYWtlX2RqZy5tYWsKQEAgLTAsMCArMSw5IEBACisjIFRoZSBtb3N0IHNpbXBsaXN0aWMgTWFrZWZpbGUsIGZvciBESkdQUCBvbiBNUy1ET1MKKworQ0ZMQUdTID0gLU8yIC1XYWxsCisKK3h4ZC5leGU6IHh4ZC5jCisJZ2NjICQoQ0ZMQUdTKSAtcyAtbyB4eGQuZXhlIHh4ZC5jIC1scGMKKworY2xlYW46CisJZGVsIHh4ZC5leGUKZGlmZiAtLWdpdCBhL3NyYy94eGQvTWFrZV9tdmMubWFrIGIvc3JjL3h4ZC9NYWtlX212Yy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5NDM4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94eGQvTWFrZV9tdmMubWFrCkBAIC0wLDAgKzEsMTEgQEAKKyMgVGhlIG1vc3Qgc2ltcGxpc3RpYyBNYWtlZmlsZSBmb3IgV2luMzIgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysKKyMgKE5UIGFuZCBXaW5kb3dzIDk1KQorCit4eGQ6IHh4ZC5leGUKKworeHhkLmV4ZTogeHhkLmMKKyAgICAgY2wgL25vbG9nbyAtRFdJTjMyIHh4ZC5jIC9saW5rIHNldGFyZ3Yub2JqCisKK2NsZWFuOgorICAgICAtIGlmIGV4aXN0IHh4ZC5vYmogZGVsIHh4ZC5vYmoKKyAgICAgLSBpZiBleGlzdCB4eGQuZXhlIGRlbCB4eGQuZXhlCmRpZmYgLS1naXQgYS9zcmMveHhkL01ha2Vfb3MyLm1hayBiL3NyYy94eGQvTWFrZV9vczIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveHhkL01ha2Vfb3MyLm1hawpAQCAtMCwwICsxLDExIEBACisjIEEgdmVyeSAoaWYgbW9zdCB0aGUgbW9zdCkgc2ltcGxpc3RpYyBNYWtlZmlsZSBmb3IgT1MvMgorCitDQz1nY2MKK0NGTEFHUz0tTzIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLURPUzIKKworeHhkLmV4ZTogeHhkLmMKKwkkKENDKSAkKENGTEFHUykgLXMgLW8gJEAgJDwKKworY2xlYW46CisJLSBkZWwgeHhkLm8KKwktIGRlbCB4eGQuZXhlCmRpZmYgLS1naXQgYS9zcmMveHhkL01ha2Vfdm1zLm1tcyBiL3NyYy94eGQvTWFrZV92bXMubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MmNkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveHhkL01ha2Vfdm1zLm1tcwpAQCAtMCwwICsxLDY5IEBACisjIFZNUyBNTVtLU10gbWFrZWZpbGUgZm9yIFhYRAorIyB0ZXN0ZWQgd2l0aCBNTUsgYW5kIE1NUyBhcyB3ZWxsLgorIworIyBNYWludGFpbmVkIGJ5IFpvbHRhbiBBcnBhZGZmeSA8YXJwYWRmZnlAcG9sYXJob21lLmNvbT4KKyMKKyMgRWRpdCB0aGUgbGluZXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBiZWxvdyB0byBzZWxlY3QuCisjCisjIFRvIGJ1aWxkOiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmU6CisjCisjCW1tcy9kZXNjcmlwPU1ha2Vfdm1zLm1tcworIwkgIG9yIGlmIHlvdSB1c2UgbW1rCisjCW1tay9kZXNjcmlwPU1ha2Vfdm1zLm1tcworIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZ3VyYXRpb24gc2VjdGlvbi4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tcGlsZXIgc2VsZWN0aW9uLgorIyBDb21tZW50IG91dCBpZiB5b3UgdXNlIHRoZSBWQVhDIGNvbXBpbGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERFQ0MgPSBZRVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFVuY29tbWVudCBpZiB3YW50IGEgZGVidWcgdmVyc2lvbi4gUmVzdWx0aW5nIGV4ZWN1dGFibGUgaXMgRFZJTS5FWEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgREVCVUcgPSBZRVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbmQgb2YgY29uZmlndXJhdGlvbiBzZWN0aW9uLgorIworIyBQbGVhc2UsIGRvIG5vdCBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgd2l0aG91dCBwcm9ncmFtbWluZyBleHBlcmllbmNlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDQyAgICAgID0gY2MKKworLklGREVGIERFQ0MKK0NDX0RFRiAgPSAkKENDKS9kZWNjCitQUkVGSVggID0gL3ByZWZpeD1hbGwKKy5FTFNFCitDQ19ERUYgID0gJChDQykKK1BSRUZJWCAgPQorLkVORElGCisKK0xEX0RFRiAgPSBsaW5rCisKKy5JRkRFRiBERUJVRworVEFSR0VUICA9IGR4eGQuZXhlCitDRkxBR1MgID0gL2RlYnVnL25vb3B0JChQUkVGSVgpL2Nyb3NzX3JlZmVyZW5jZS9pbmNsdWRlPVtdCitMREZMQUdTID0gL2RlYnVnCisuRUxTRQorVEFSR0VUICA9IHh4ZC5leGUKK0NGTEFHUyAgPSAvb3B0JChQUkVGSVgpL2luY2x1ZGU9W10KK0xERkxBR1MgPQorLkVORElGCisKKy5TVUZGSVhFUyA6IC5vYmogLmMKKworU09VUkNFUwk9IHh4ZC5jCitPQkogICAgID0geHhkLm9iagorCisub2JqLmMgOgorCSQoQ0NfREVGKSAkKENGTEFHUykgJDwKKworJChUQVJHRVQpIDogJChPQkopCisJJChMRF9ERUYpICQoTERGTEFHUykgL2V4ZT0kKFRBUkdFVCkgJCsKKworY2xlYW4gOgorCS1AIGlmICInJ0YkU0VBUkNIKCIqLm9iaiIpJyIgLk5FUy4gIiIgIHRoZW4gZGVsZXRlL25vY29uZmlybS9ub2xvZyAqLm9iajsqCisJLUAgaWYgIicnRiRTRUFSQ0goIiouZXhlIiknIiAuTkVTLiAiIiAgdGhlbiBkZWxldGUvbm9jb25maXJtL25vbG9nICouZXhlOyoKZGlmZiAtLWdpdCBhL3NyYy94eGQvTWFrZWZpbGUgYi9zcmMveHhkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YmJjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveHhkL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIyBUaGUgbW9zdCBzaW1wbGlzdGljIE1ha2VmaWxlCisKK3h4ZDogeHhkLmMKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtRFVOSVggLW8geHhkIHh4ZC5jCisKK2NsZWFuOgorCXJtIC1mIHh4ZCB4eGQubwpkaWZmIC0tZ2l0IGEvc3JjL3h4ZC94eGQuYyBiL3NyYy94eGQveHhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5Zjc2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94eGQveHhkLmMKQEAgLTAsMCArMSw3NjcgQEAKKy8qIHh4ZDogbXkgaGV4ZHVtcCBmYWNpbGl0eS4gancKKyAqCisgKiAgMi4xMC45MCBjaGFuZ2VkIHRvIHdvcmQgb3V0cHV0CisgKiAgMy4wMy45MyBuZXcgaW5kZW50IHN0eWxlLCBkdW1iIGJ1ZyBpbnNlcnRlZCBhbmQgZml4ZWQuCisgKgkgICAgLWMgb3B0aW9uLCBtbHMKKyAqIDI2LjA0Ljk0IGJldHRlciBvcHRpb24gcGFyc2VyLCAtcHMsIC1sLCAtcyBhZGRlZC4KKyAqICAxLjA3Ljk0IC1yIGJhZGx5IG5lZWRzIC0gYXMgaW5wdXQgZmlsZS4gIFBlciBkZWZhdWx0IGF1dG9za2lwIG92ZXIKKyAqCSAgICAgICBjb25zZXF1dGl2ZSBsaW5lcyBvZiB6ZXJvZXMsIGFzIHVuaXggb2QgZG9lcy4KKyAqCSAgICAtYSBzaG93cyB0aGVtIHRvby4KKyAqCSAgICAtaSBkdW1wIGFzIGMtc3R5bGUgI2luY2x1ZGUgImZpbGUuaCIKKyAqICAxLjExLjk1IGlmICJ4eGQgLWkiIGtub3dzIHRoZSBmaWxlbmFtZSwgYW4gJ3Vuc2lnbmVkIGNoYXIgZmlsZW5hbWVfYml0c1tdJworICoJICAgIGFycmF5IGlzIHdyaXR0ZW4gaW4gY29ycmVjdCBjLXN5bnRheC4KKyAqCSAgICAtcyBpbXByb3ZlZCwgbm93IGRlZmF1bHRzIHRvIGFic29sdXRlIHNlZWssIHJlbGF0aXZlIHJlcXVpcmVzIGEgJysnLgorICoJICAgIC1yIGltcHJvdmVkLCBub3cgLXIgLXMgLTB4Li4uIGlzIHN1cHBvcnRlZC4KKyAqCSAgICAgICBjaGFuZ2Uvc3VwcHJlc3MgbGVhZGluZyAnXDAnIGJ5dGVzLgorICoJICAgIC1sIG4gaW1wcm92ZWQ6IHN0b3BzIGV4YWN0bHkgYWZ0ZXIgbiBieXRlcy4KKyAqCSAgICAtciBpbXByb3ZlZCwgYmV0dGVyIGhhbmRsaW5nIG9mIHBhcnRpYWwgbGluZXMgd2l0aCB0cmFpbGluZyBnYXJiYWdlLgorICoJICAgIC1yIGltcHJvdmVkLCBub3cgLXIgLXAgd29ya3MgYWdhaW4hCisgKgkgICAgLXIgaW1wcm92ZWQsIGxlc3MgZmx1c2hpbmcsIG11Y2ggZmFzdGVyIG5vdyEgKHRoYXQgd2FzIHNpbGx5KQorICogIDMuMDQuOTYgUGVyIHJlcGVhdGVkIHJlcXVlc3Qgb2YgYSBzaW5nbGUgcGVyc29uOiBhdXRvc2tpcCBkZWZhdWx0cyB0byBvZmYuCisgKiAxNS4wNS45NiAtdiBhZGRlZC4gVGhleSB3YW50IHRvIGtub3cgdGhlIHZlcnNpb24uCisgKgkgICAgLWEgZml4ZWQsIHRvIHNob3cgbGFzdCBsaW5lIGluZiBmaWxlIGVuZHMgaW4gYWxsIHplcm9zLgorICoJICAgIC11IGFkZGVkOiBQcmludCB1cHBlciBjYXNlIGhleC1sZXR0ZXJzLCBhcyBwcmVmZXJyZWQgYnkgdW5peCBiYy4KKyAqCSAgICAtaCBhZGRlZCB0byB1c2FnZSBtZXNzYWdlLiBVc2FnZSBtZXNzYWdlIGV4dGVuZGVkLgorICoJICAgIE5vdyB1c2luZyBvdXRmaWxlIGlmIHNwZWNpZmllZCBldmVuIGluIG5vcm1hbCBtb2RlLCBhZWhlbS4KKyAqCSAgICBObyBsb25nZXIgbWl4aW5nIG9mIGludHMgYW5kIGxvbmdzLiBNYXkgaGVscCBkb3plIHBlb3BsZS4KKyAqCSAgICBBZGRlZCBiaW5pZnkgaW9jdGwgZm9yIHNhbWUgcmVhc29uLiAoRW5vdWdoIERvemUgc3RyZXNzIGZvciAxOTk2ISkKKyAqIDE2LjA1Ljk2IC1wIGltcHJvdmVkLCByZW1vdmVkIG9jY2FzaW9uYWwgc3VwZXJmbHVvdXMgbGluZWZlZWQuCisgKiAyMC4wNS45NiAtbCAwIGZpeGVkLiB0cmllZCB0byByZWFkIGFueXdheS4KKyAqIDIxLjA1Ljk2IC1pIGZpeGVkLiBub3cgaG9ub3VycyAtdSwgYW5kIHByZXBlbmRzIF9fIHRvIG51bWVyaWMgZmlsZW5hbWVzLgorICoJICAgIGNvbXBpbGUgLURXSU4zMiBmb3IgTlQgb3IgVzk1LiBHZW9yZ2UgVi4gUmVpbGx5LCAqIC12IGltcHJvdmVkIDotKQorICoJICAgIHN1cHBvcnQgLS1nbnVpc2gtbG9uZ2hvcm4tb3B0aW9ucworICogMjUuMDUuOTYgTUFDIHN1cHBvcnQgYWRkZWQ6IENvZGVXYXJyaW9yIGFscmVhZHkgdXNlcyBgYG91dGxpbmUnJyBpbiBUeXBlcy5oCisgKgkgICAgd2hpY2ggaXMgaW5jbHVkZWQgYnkgTWFjSGVhZGVycyAoQXhlbCBLaWVsaG9ybikuIFJlbmFtZWQgdG8KKyAqCSAgICB4eGRsaW5lKCkuCisgKiAgNy4wNi45NiAtaSBwcmludGVkICdpbnQnIGluc3RlYWQgb2YgJ2NoYXInLiAqYmx1c2gqCisgKgkgICAgYWRkZWQgQnJhbSdzIE9TMiBpZmRlZnMuLi4KKyAqIDE4LjA3Ljk2IGdjYyAtV2FsbCBAIFN1bk9TNCBpcyBub3cgc2xpZW50LgorICoJICAgIEFkZGVkIG9zdmVyIGZvciBNU0RPUy9ESkdQUC9XSU4zMi4KKyAqIDI5LjA4Ljk2IEFkZGVkIHNpemVfdCB0byBzdHJuY21wKCkgZm9yIEFtaWdhLgorICogMjQuMDMuOTcgV2luZG93cyBOVCBzdXBwb3J0IChQaGlsIEhhbm5hKS4gQ2xlYW4gZXhpdCBmb3IgQW1pZ2EgV0IgKEJyYW0pCisgKiAwMi4wNC45NyBBZGRlZCAtRSBvcHRpb24sIHRvIGhhdmUgRUJDRElDIHRyYW5zbGF0aW9uIGluc3RlYWQgb2YgQVNDSUkKKyAqCSAgICAoYW50b25pby5jb2xvbWJvQGpyYy5pdCkKKyAqIDIyLjA1Ljk3IGFkZGVkIC1nIChncm91cCBvY3RldHMpIG9wdGlvbiAoamNvb2tAbmFtZXJpY2Eua2xhLmNvbSkuCisgKiAyMy4wOS45OCBuYXN0eSAtcCAtciBtaXNmZWF0dXJlIGZpeGVkOiBzbGlnaHRseSB3cm9uZyBvdXRwdXQsIHdoZW4gLWMgd2FzCisgKgkgICAgbWlzc2luZyBvciB3cm9uZy4KKyAqIDI2LjA5Ljk4IEZpeGVkOiAneHhkIC1pIGluZmlsZSBvdXRmaWxlJyBkaWQgbm90IHRydW5jYXRlIG91dGZpbGUuCisgKiAyNy4xMC45OCBGaXhlZDogLWcgb3B0aW9uIHBhcnNlciByZXF1aXJlZCBibGFuay4KKyAqCSAgICBvcHRpb24gLWIgYWRkZWQ6IDAxMDAwMTAxIGJpbmFyeSBvdXRwdXQgaW4gbm9ybWFsIGZvcm1hdC4KKyAqIDE2LjA1LjAwIEFkZGVkIFZBWEMgY2hhbmdlcyBieSBTdGVwaGVuIFAuIFdhbGwKKyAqIDE2LjA1LjAwIEltcHJvdmVkIE1NUyBmaWxlIGFuZCBtZXJlZ2UgZm9yIFZNUyBieSBab2x0YW4gQXJwYWRmZnkKKyAqCisgKiAoYykgMTk5MC0xOTk4IGJ5IEp1ZXJnZW4gV2VpZ2VydCAoam53ZWlnZXJAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisgKgorICogU21hbGwgY2hhbmdlcyBtYWRlIGFmdGVyd2FyZHMgYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuCisgKgorICogRGlzdHJpYnV0ZSBmcmVlbHkgYW5kIGNyZWRpdCBtZSwKKyAqIG1ha2UgbW9uZXkgYW5kIHNoYXJlIHdpdGggbWUsCisgKiBsb3NlIG1vbmV5IGFuZCBkb24ndCBhc2sgbWUuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIFZBWEMKKyMgaW5jbHVkZSA8ZmlsZS5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorI2lmZGVmIF9fVFNDX18KKyMgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUzIpICYmIGRlZmluZWQoX19FTVhfXykKKyMgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyBpbmNsdWRlIDxpby5oPgkvKiBmb3Igc2V0bW9kZSgpICovCisjZWxzZQorIyBpZmRlZiBVTklYCisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBmb3Igc3RybmNtcCgpICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JLyogZm9yIGlzYWxudW0oKSAqLworI2lmIF9fTVdFUktTX18gJiYgIWRlZmluZWQoQkVCT1gpCisjIGluY2x1ZGUgPHVuaXguaD4JLyogZm9yIGZkb3BlbigpIG9uIE1BQyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgX19CT1JMQU5EQ19fIDw9IDB4MDQxMCAmJiAhZGVmaW5lZChmaWxlbm8pCisvKiBNaXNzaW5nIGRlZmluZSBhbmQgcHJvdG90eXBlIGdyYWJiZWQgZnJvbSB0aGUgQkMgNC4wIDxzdGRpby5oPiAqLworIyBkZWZpbmUgZmlsZW5vKGYpICAgICAgICgoZiktPmZkKQorRklMRSAgIF9GQVIgKl9DZGVjbCBfRkFSRlVOQyBmZG9wZW4oaW50IF9faGFuZGxlLCBjaGFyIF9GQVIgKl9fdHlwZSk7CisjZW5kaWYKKworCisvKiAgVGhpcyBjb3JyZWN0cyB0aGUgcHJvYmxlbSBvZiBtaXNzaW5nIHByb3RvdHlwZXMgZm9yIGNlcnRhaW4gZnVuY3Rpb25zCisgKiAgaW4gc29tZSBHTlUgaW5zdGFsbGF0aW9ucyAoZS5nLiBTdW5PUyA0LjEueCkuCisgKiAgRGFycmVuIEhpZWJlcnQgPGRhcnJlbkBobWkuY29tPiAoc3BhcmMtc3VuLXN1bm9zNC4xLjNfVTEvMi43LjIuMikKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19TVERDX18pCisjIGlmbmRlZiBfX1VTRV9GSVhFRF9QUk9UT1RZUEVTX18KKyMgIGRlZmluZSBfX1VTRV9GSVhFRF9QUk9UT1RZUEVTX18KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fVVNFX0ZJWEVEX1BST1RPVFlQRVNfXworLyoKKyAqIFRoaXMgaXMgaGlzdG9yaWMgYW5kIHdvcmtzIG9ubHkgaWYgdGhlIGNvbXBpbGVyIHJlYWxseSBoYXMgbm8gcHJvdG90eXBlczoKKyAqCisgKiBJbmNsdWRlIHByb3RvdHlwZXMgZm9yIFN1biBPUyA0LngsIHdoZW4gdXNpbmcgYW4gQU5TSSBjb21waWxlci4KKyAqIEZJTEUgaXMgZGVmaW5lZCBvbiBPUyA0LngsIG5vdCBvbiA1LnggKFNvbGFyaXMpLgorICogaWYgX19TVlI0IGlzIGRlZmluZWQgKHNvbWUgU29sYXJpcyB2ZXJzaW9ucyksIGRvbid0IGluY2x1ZGUgdGhpcy4KKyAqLworI2lmIGRlZmluZWQoc3VuKSAmJiBkZWZpbmVkKEZJTEUpICYmICFkZWZpbmVkKF9fU1ZSNCkgJiYgZGVmaW5lZChfX1NURENfXykKKyMgIGRlZmluZSBfX1AoYSkgYQorLyogZXhjZXJwdCBmcm9tIG15IHN1bl9zdGRsaWIuaCAqLworZXh0ZXJuIGludCBmcHJpbnRmIF9fUCgoRklMRSAqLCBjaGFyICosIC4uLikpOworZXh0ZXJuIGludCBmcHV0cyAgIF9fUCgoY2hhciAqLCBGSUxFICopKTsKK2V4dGVybiBpbnQgX2Zsc2J1ZiBfX1AoKHVuc2lnbmVkIGNoYXIsIEZJTEUgKikpOworZXh0ZXJuIGludCBfZmlsYnVmIF9fUCgoRklMRSAqKSk7CitleHRlcm4gaW50IGZmbHVzaCAgX19QKChGSUxFICopKTsKK2V4dGVybiBpbnQgZmNsb3NlICBfX1AoKEZJTEUgKikpOworZXh0ZXJuIGludCBmc2VlayAgIF9fUCgoRklMRSAqLCBsb25nLCBpbnQpKTsKK2V4dGVybiBpbnQgcmV3aW5kICBfX1AoKEZJTEUgKikpOworCitleHRlcm4gdm9pZCBwZXJyb3IgX19QKChjaGFyICopKTsKKyMgZW5kaWYKKyNlbmRpZgorCitleHRlcm4gbG9uZyBpbnQgc3RydG9sKCk7CitleHRlcm4gbG9uZyBpbnQgZnRlbGwoKTsKKworY2hhciB2ZXJzaW9uW10gPSAieHhkIFYxLjEwIDI3b2N0OTggYnkgSnVlcmdlbiBXZWlnZXJ0IjsKKyNpZmRlZiBXSU4zMgorY2hhciBvc3ZlcltdID0gIiAoV2luMzIpIjsKKyNlbHNlCisjIGlmZGVmIERKR1BQCitjaGFyIG9zdmVyW10gPSAiIChkb3MgMzIgYml0KSI7CisjIGVsc2UKKyMgIGlmZGVmIE1TRE9TCitjaGFyIG9zdmVyW10gPSAiIChkb3MgMTYgYml0KSI7CisjICBlbHNlCitjaGFyIG9zdmVyW10gPSAiIjsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENZR1dJTikgJiYgKGRlZmluZWQoQ1lHV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0NZR1dJTjMyX18pKQorIyBkZWZpbmUgQ1lHV0lOCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChDWUdXSU4pCisjIGRlZmluZSBCSU5fUkVBRCh5ZXMpICAoKHllcykgPyAicmIiIDogInJ0IikKKyMgZGVmaW5lIEJJTl9XUklURSh5ZXMpICgoeWVzKSA/ICJ3YiIgOiAid3QiKQorIyBkZWZpbmUgQklOX0NSRUFUKHllcykgKCh5ZXMpID8gKE9fQ1JFQVR8T19CSU5BUlkpIDogT19DUkVBVCkKKyMgZGVmaW5lIEJJTl9BU1NJR04oZnAsIHllcykgc2V0bW9kZShmaWxlbm8oZnApLCAoeWVzKSA/IE9fQklOQVJZIDogT19URVhUKQorIyBpZiBkZWZpbmVkKENZR1dJTikKKyMgIGRlZmluZSBQQVRIX1NFUCAnLycKKyMgZWxzZQorIyAgZGVmaW5lIFBBVEhfU0VQICdcXCcKKyMgZW5kaWYKKyNlbHNlCisjIGlmZGVmIFZNUworIyAgZGVmaW5lIEJJTl9SRUFEKGR1bW15KSAgInIiCisjICBkZWZpbmUgQklOX1dSSVRFKGR1bW15KSAidyIKKyMgIGRlZmluZSBCSU5fQ1JFQVQoZHVtbXkpIE9fQ1JFQVQKKyMgIGRlZmluZSBCSU5fQVNTSUdOKGZwLCBkdW1teSkgZnAKKyMgIGRlZmluZSBQQVRIX1NFUCAnXScKKyMgIGRlZmluZSBGSUxFX1NFUCAnLicKKyMgZWxzZQorIyAgZGVmaW5lIEJJTl9SRUFEKGR1bW15KSAgInIiCisjICBkZWZpbmUgQklOX1dSSVRFKGR1bW15KSAidyIKKyMgIGRlZmluZSBCSU5fQ1JFQVQoZHVtbXkpIE9fQ1JFQVQKKyMgIGRlZmluZSBCSU5fQVNTSUdOKGZwLCBkdW1teSkgZnAKKyMgIGRlZmluZSBQQVRIX1NFUCAnLycKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBvcGVuIGhhcyBvbmx5IHRvIGFyZ3VtZW50cyBvbiB0aGUgTWFjICovCisjaWYgX19NV0VSS1NfXworIyBkZWZpbmUgT1BFTihuYW1lLCBtb2RlLCB1bWFzaykgb3BlbihuYW1lLCBtb2RlKQorI2Vsc2UKKyMgZGVmaW5lIE9QRU4obmFtZSwgbW9kZSwgdW1hc2spIG9wZW4obmFtZSwgbW9kZSwgdW1hc2spCisjZW5kaWYKKworI2lmZGVmIEFNSUdBCisjIGRlZmluZSBTVFJOQ01QKHMxLCBzMiwgbCkgc3RybmNtcChzMSwgczIsIChzaXplX3QpbCkKKyNlbHNlCisjIGRlZmluZSBTVFJOQ01QKHMxLCBzMiwgbCkgc3RybmNtcChzMSwgczIsIGwpCisjZW5kaWYKKworI2lmbmRlZiBfX1AKKyMgaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChPUzIpIFwKKwkJfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjICBkZWZpbmUgX19QKGEpIGEKKyMgZWxzZQorIyAgZGVmaW5lIF9fUChhKSAoKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIExldCdzIGNvbGxlY3Qgc29tZSBwcm90b3R5cGVzICovCisvKiBDb2RlV2FycmlvciBpcyByZWFsbHkgcGlja3kgYWJvdXQgbWlzc2luZyBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBleGl0X3dpdGhfdXNhZ2UgX19QKChjaGFyICopKTsKK3N0YXRpYyBpbnQgaHVudHlwZSBfX1AoKEZJTEUgKiwgRklMRSAqLCBGSUxFICosIGNoYXIgKiwgaW50LCBpbnQsIGxvbmcpKTsKK3N0YXRpYyB2b2lkIHh4ZGxpbmUgX19QKChGSUxFICosIGNoYXIgKiwgaW50KSk7CisKKyNkZWZpbmUgVFJZX1NFRUsJLyogYXR0ZW1wdCB0byB1c2UgbHNlZWssIG9yIHNraXAgZm9yd2FyZCBieSByZWFkaW5nICovCisjZGVmaW5lIENPTFMgMjU2CS8qIGNoYW5nZSBoZXJlLCBpZiB5b3UgZXZlciBuZWVkIG1vcmUgY29sdW1ucyAqLworI2RlZmluZSBMTEVOICg5ICsgKDUqQ09MUy0xKS8yICsgMiArIENPTFMpCisKK2NoYXIgaGV4eGFbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRiIsICpoZXh4ID0gaGV4eGE7CisKKy8qIHRoZSBkaWZmZXJlbnQgaGV4dHlwZXMga25vd24gYnkgdGhpcyBwcm9ncmFtOiAqLworI2RlZmluZSBIRVhfTk9STUFMIDAKKyNkZWZpbmUgSEVYX1BPU1RTQ1JJUFQgMQorI2RlZmluZSBIRVhfQ0lOQ0xVREUgMgorI2RlZmluZSBIRVhfQklUUyAzCQkvKiBub3QgaGV4IGEgZHVtcCwgYnV0IGJpdHM6IDAxMTExMDAxICovCisKK3N0YXRpYyB2b2lkCitleGl0X3dpdGhfdXNhZ2UocG5hbWUpCitjaGFyICpwbmFtZTsKK3sKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTpcbiAgICAgICAlcyBbb3B0aW9uc10gW2luZmlsZSBbb3V0ZmlsZV1dXG4iLCBwbmFtZSk7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIG9yXG4gICAgICAgJXMgLXIgWy1zIFstXW9mZnNldF0gWy1jIGNvbHNdIFstcHNdIFtpbmZpbGUgW291dGZpbGVdXVxuIiwgcG5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLWEgICAgICAgICAgdG9nZ2xlIGF1dG9za2lwOiBBIHNpbmdsZSAnKicgcmVwbGFjZXMgbnVsLWxpbmVzLiBEZWZhdWx0IG9mZi5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYiAgICAgICAgICBiaW5hcnkgZGlnaXQgZHVtcCAoaW5jb21wYXRpYmxlIHdpdGggLXAsLWksLXIpLiBEZWZhdWx0IGhleC5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyBjb2xzICAgICBmb3JtYXQgPGNvbHM+IG9jdGV0cyBwZXIgbGluZS4gRGVmYXVsdCAxNiAoLWk6IDEyLCAtcHM6IDMwKS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtRSAgICAgICAgICBzaG93IGNoYXJhY3RlcnMgaW4gRUJDRElDLiBEZWZhdWx0IEFTQ0lJLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1nICAgICAgICAgIG51bWJlciBvZiBvY3RldHMgcGVyIGdyb3VwIGluIG5vcm1hbCBvdXRwdXQuIERlZmF1bHQgMi5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtaCAgICAgICAgICBwcmludCB0aGlzIHN1bW1hcnkuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLWkgICAgICAgICAgb3V0cHV0IGluIEMgaW5jbHVkZSBmaWxlIHN0eWxlLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1sIGxlbiAgICAgIHN0b3AgYWZ0ZXIgPGxlbj4gb2N0ZXRzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1wcyAgICAgICAgIG91dHB1dCBpbiBwb3N0c2NyaXB0IHBsYWluIGhleGR1bXAgc3R5bGUuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLXIgICAgICAgICAgcmV2ZXJzZSBvcGVyYXRpb246IGNvbnZlcnQgKG9yIHBhdGNoKSBoZXhkdW1wIGludG8gYmluYXJ5LlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1yIC1zIG9mZiAgIHJldmVydCB3aXRoIDxvZmY+IGFkZGVkIHRvIGZpbGUgcG9zaXRpb25zIGZvdW5kIGluIGhleGR1bXAuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLXMgJXNzZWVrICBzdGFydCBhdCA8c2Vlaz4gYnl0ZXMgYWJzLiAlc2luZmlsZSBvZmZzZXQuXG4iLAorI2lmZGVmIFRSWV9TRUVLCisJICAiWytdWy1dIiwgIihvciArOiByZWwuKSAiKTsKKyNlbHNlCisJICAiIiwgIiIpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAgIC11ICAgICAgICAgIHVzZSB1cHBlciBjYXNlIGhleCBsZXR0ZXJzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC12ICAgICAgICAgIHNob3cgdmVyc2lvbjogXCIlcyVzXCIuXG4iLCB2ZXJzaW9uLCBvc3Zlcik7CisgIGV4aXQoMSk7Cit9CisKKy8qCisgKiBNYXguIGNvbHMgYmluYXJ5IGNoYXJhY3RlcnMgYXJlIGRlY29kZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHBlciBsaW5lLgorICogVHdvIGFkamFjZW50IGdhcmJhZ2UgY2hhcmFjdGVycyBhZnRlciBldmFsdWF0ZWQgZGF0YSBkZWxpbWl0IHZhbGlkIGRhdGEuCisgKiBFdmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IG5ld2xpbmUgaXMgZGlzY2FyZGVkLgorICoKKyAqIFRoZSBuYW1lIGlzIGhpc3RvcmljIGFuZCBjYW1lIGZyb20gJ3VuZG8gdHlwZSBvcHQgaCcuCisgKi8KK3N0YXRpYyBpbnQKK2h1bnR5cGUoZnBpLCBmcG8sIGZwZXJyLCBwbmFtZSwgY29scywgaGV4dHlwZSwgYmFzZV9vZmYpCitGSUxFICpmcGksICpmcG8sICpmcGVycjsKK2NoYXIgKnBuYW1lOworaW50IGNvbHMsIGhleHR5cGU7Citsb25nIGJhc2Vfb2ZmOworeworICBpbnQgYywgaWduX2dhcmIgPSAxLCBuMSA9IC0xLCBuMiA9IDAsIG4zLCBwID0gY29sczsKKyAgbG9uZyBoYXZlX29mZiA9IDAsIHdhbnRfb2ZmID0gMDsKKworICByZXdpbmQoZnBpKTsKKworICB3aGlsZSAoKGMgPSBnZXRjKGZwaSkpICE9IEVPRikKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXHInKQkvKiBEb3plIHN0eWxlIGlucHV0IGZpbGU/ICovCisJY29udGludWU7CisKKyAgICAgIG4zID0gbjI7CisgICAgICBuMiA9IG4xOworCisgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJbjEgPSBjIC0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJbjEgPSBjIC0gJ2EnICsgMTA7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwluMSA9IGMgLSAnQScgKyAxMDsKKyAgICAgIGVsc2UKKwl7CisJICBuMSA9IC0xOworCSAgaWYgKGlnbl9nYXJiKQorCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlnbl9nYXJiID0gMDsKKworICAgICAgaWYgKHAgPj0gY29scykKKwl7CisJICBpZiAoIWhleHR5cGUpCisJICAgIHsKKwkgICAgICBpZiAobjEgPCAwKQorCQl7CisJCSAgcCA9IDA7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICB3YW50X29mZiA9ICh3YW50X29mZiA8PCA0KSB8IG4xOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHAgPSAwOworCX0KKworICAgICAgaWYgKGJhc2Vfb2ZmICsgd2FudF9vZmYgIT0gaGF2ZV9vZmYpCisJeworCSAgZmZsdXNoKGZwbyk7CisjaWZkZWYgVFJZX1NFRUsKKwkgIGMgPSBmc2VlayhmcG8sIGJhc2Vfb2ZmICsgd2FudF9vZmYgLSBoYXZlX29mZiwgMSk7CisJICBpZiAoYyA+PSAwKQorCSAgICBoYXZlX29mZiA9IGJhc2Vfb2ZmICsgd2FudF9vZmY7CisjZW5kaWYKKwkgIGlmIChiYXNlX29mZiArIHdhbnRfb2ZmIDwgaGF2ZV9vZmYpCisJICAgIHsKKwkgICAgICBmcHJpbnRmKGZwZXJyLCAiJXM6IHNvcnJ5LCBjYW5ub3Qgc2VlayBiYWNrd2FyZHMuXG4iLCBwbmFtZSk7CisJICAgICAgcmV0dXJuIDU7CisJICAgIH0KKwkgIGZvciAoOyBoYXZlX29mZiA8IGJhc2Vfb2ZmICsgd2FudF9vZmY7IGhhdmVfb2ZmKyspCisJICAgIHB1dGMoMCwgZnBvKTsKKwl9CisKKyAgICAgIGlmIChuMiA+PSAwICYmIG4xID49IDApCisJeworCSAgcHV0YygobjIgPDwgNCkgfCBuMSwgZnBvKTsKKwkgIGhhdmVfb2ZmKys7CisJICB3YW50X29mZisrOworCSAgbjEgPSAtMTsKKwkgIGlmICgoKytwID49IGNvbHMpICYmICFoZXh0eXBlKQorCSAgICB7CisJICAgICAgLyogc2tpcCByZXN0IG9mIGxpbmUgYXMgZ2FyYmFnYSAqLworCSAgICAgIHdhbnRfb2ZmID0gMDsKKwkgICAgICB3aGlsZSAoKGMgPSBnZXRjKGZwaSkpICE9ICdcbicgJiYgYyAhPSBFT0YpCisJCTsKKwkgICAgICBpZ25fZ2FyYiA9IDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChuMSA8IDAgJiYgbjIgPCAwICYmIG4zIDwgMCkKKwl7CisJICAvKiBhbHJlYWR5IHN0dW1ibGVkIGludG8gZ2FyYmFnZSwgc2tpcCBsaW5lLCB3YWl0IGFuZCBzZWUgKi8KKwkgIGlmICghaGV4dHlwZSkKKwkgICAgd2FudF9vZmYgPSAwOworCSAgd2hpbGUgKChjID0gZ2V0YyhmcGkpKSAhPSAnXG4nICYmIGMgIT0gRU9GKQorCSAgICA7CisJICBpZ25fZ2FyYiA9IDE7CisJfQorICAgIH0KKyAgZmZsdXNoKGZwbyk7CisjaWZkZWYgVFJZX1NFRUsKKyAgZnNlZWsoZnBvLCAwTCwgMik7CisjZW5kaWYKKyAgZmNsb3NlKGZwbyk7CisgIGZjbG9zZShmcGkpOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IGxpbmUgbC4gSWYgbnogaXMgZmFsc2UsIHh4ZGxpbmUgcmVnYXJkcyB0aGUgbGluZSBhIGxpbmUgb2YKKyAqIHplcm9lcy4gSWYgdGhlcmUgYXJlIHRocmVlIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgemVyb2VzLAorICogdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgJyonIGNoYXJhY3Rlci4KKyAqCisgKiBJZiB0aGUgb3V0cHV0IGVuZHMgd2l0aCBtb3JlIHRoYW4gdHdvIGxpbmVzIG9mIHplcm9lcywgeW91CisgKiBzaG91bGQgY2FsbCB4eGRsaW5lIGFnYWluIHdpdGggbCBiZWluZyB0aGUgbGFzdCBsaW5lIGFuZCBuegorICogbmVnYXRpdmUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGxpbmUgaXMgc2hvd24gZXZlbiB3aGVuCisgKiBpdCBpcyBhbGwgemVyb2VzLgorICoKKyAqIElmIG56IGlzIGFsd2F5cyBwb3NpdGl2ZSwgbGluZXMgYXJlIG5ldmVyIHN1cHByZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkCit4eGRsaW5lKGZwLCBsLCBueikKK0ZJTEUgKmZwOworY2hhciAqbDsKK2ludCBuejsKK3sKKyAgc3RhdGljIGNoYXIgeltMTEVOKzFdOworICBzdGF0aWMgaW50IHplcm9fc2VlbiA9IDA7CisKKyAgaWYgKCFueiAmJiB6ZXJvX3NlZW4gPT0gMSkKKyAgICBzdHJjcHkoeiwgbCk7CisKKyAgaWYgKG56IHx8ICF6ZXJvX3NlZW4rKykKKyAgICB7CisgICAgICBpZiAobnopCisJeworCSAgaWYgKG56IDwgMCkKKwkgICAgemVyb19zZWVuLS07CisJICBpZiAoemVyb19zZWVuID09IDIpCisJICAgIGZwdXRzKHosIGZwKTsKKwkgIGlmICh6ZXJvX3NlZW4gPiAyKQorCSAgICBmcHV0cygiKlxuIiwgZnApOworCX0KKyAgICAgIGlmIChueiA+PSAwIHx8IHplcm9fc2VlbiA+IDApCisJZnB1dHMobCwgZnApOworICAgICAgaWYgKG56KQorCXplcm9fc2VlbiA9IDA7CisgICAgfQorfQorCisvKiBUaGlzIGlzIGFuIEVCQ0RJQyB0byBBU0NJSSBjb252ZXJzaW9uIHRhYmxlICovCisvKiBmcm9tIGEgcHJvcG9zZWQgQlRMIHN0YW5kYXJkIEFwcmlsIDE2LCAxOTc5ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBldG9hNjRbXSA9Cit7CisgICAgMDA0MCwwMjQwLDAyNDEsMDI0MiwwMjQzLDAyNDQsMDI0NSwwMjQ2LAorICAgIDAyNDcsMDI1MCwwMzI1LDAwNTYsMDA3NCwwMDUwLDAwNTMsMDE3NCwKKyAgICAwMDQ2LDAyNTEsMDI1MiwwMjUzLDAyNTQsMDI1NSwwMjU2LDAyNTcsCisgICAgMDI2MCwwMjYxLDAwNDEsMDA0NCwwMDUyLDAwNTEsMDA3MywwMTc2LAorICAgIDAwNTUsMDA1NywwMjYyLDAyNjMsMDI2NCwwMjY1LDAyNjYsMDI2NywKKyAgICAwMjcwLDAyNzEsMDMxMywwMDU0LDAwNDUsMDEzNywwMDc2LDAwNzcsCisgICAgMDI3MiwwMjczLDAyNzQsMDI3NSwwMjc2LDAyNzcsMDMwMCwwMzAxLAorICAgIDAzMDIsMDE0MCwwMDcyLDAwNDMsMDEwMCwwMDQ3LDAwNzUsMDA0MiwKKyAgICAwMzAzLDAxNDEsMDE0MiwwMTQzLDAxNDQsMDE0NSwwMTQ2LDAxNDcsCisgICAgMDE1MCwwMTUxLDAzMDQsMDMwNSwwMzA2LDAzMDcsMDMxMCwwMzExLAorICAgIDAzMTIsMDE1MiwwMTUzLDAxNTQsMDE1NSwwMTU2LDAxNTcsMDE2MCwKKyAgICAwMTYxLDAxNjIsMDEzNiwwMzE0LDAzMTUsMDMxNiwwMzE3LDAzMjAsCisgICAgMDMyMSwwMzQ1LDAxNjMsMDE2NCwwMTY1LDAxNjYsMDE2NywwMTcwLAorICAgIDAxNzEsMDE3MiwwMzIyLDAzMjMsMDMyNCwwMTMzLDAzMjYsMDMyNywKKyAgICAwMzMwLDAzMzEsMDMzMiwwMzMzLDAzMzQsMDMzNSwwMzM2LDAzMzcsCisgICAgMDM0MCwwMzQxLDAzNDIsMDM0MywwMzQ0LDAxMzUsMDM0NiwwMzQ3LAorICAgIDAxNzMsMDEwMSwwMTAyLDAxMDMsMDEwNCwwMTA1LDAxMDYsMDEwNywKKyAgICAwMTEwLDAxMTEsMDM1MCwwMzUxLDAzNTIsMDM1MywwMzU0LDAzNTUsCisgICAgMDE3NSwwMTEyLDAxMTMsMDExNCwwMTE1LDAxMTYsMDExNywwMTIwLAorICAgIDAxMjEsMDEyMiwwMzU2LDAzNTcsMDM2MCwwMzYxLDAzNjIsMDM2MywKKyAgICAwMTM0LDAyMzcsMDEyMywwMTI0LDAxMjUsMDEyNiwwMTI3LDAxMzAsCisgICAgMDEzMSwwMTMyLDAzNjQsMDM2NSwwMzY2LDAzNjcsMDM3MCwwMzcxLAorICAgIDAwNjAsMDA2MSwwMDYyLDAwNjMsMDA2NCwwMDY1LDAwNjYsMDA2NywKKyAgICAwMDcwLDAwNzEsMDM3MiwwMzczLDAzNzQsMDM3NSwwMzc2LDAzNzcKK307CisKK2ludAorbWFpbihhcmdjLCBhcmd2KQoraW50IGFyZ2M7CitjaGFyICphcmd2W107Cit7CisgIEZJTEUgKmZwLCAqZnBvOworICBpbnQgYywgZSwgcCA9IDAsIHJlbHNlZWsgPSAxLCBuZWdzZWVrID0gMCwgcmV2ZXJ0ID0gMDsKKyAgaW50IGNvbHMgPSAwLCBub256ZXJvID0gMCwgYXV0b3NraXAgPSAwLCBoZXh0eXBlID0gSEVYX05PUk1BTDsKKyAgaW50IGViY2RpYyA9IDA7CisgIGludCBvY3RzcGVyZ3JwID0gLTE7CS8qIG51bWJlciBvZiBvY3RldHMgZ3JvdXBlZCBpbiBvdXRwdXQgKi8KKyAgaW50IGdycGxlbjsJCS8qIHRvdGFsIGNoYXJzIHBlciBvY3RldCBncm91cCAqLworICBsb25nIGxlbmd0aCA9IC0xLCBuID0gMCwgc2Vla29mZiA9IDA7CisgIGNoYXIgbFtMTEVOKzFdOworICBjaGFyICpwbmFtZSwgKnBwOworCisjaWZkZWYgQU1JR0EKKyAgLyogVGhpcyBwcm9ncmFtIGRvZXNuJ3Qgd29yayB3aGVuIHN0YXJ0ZWQgZnJvbSB0aGUgV29ya2JlbmNoICovCisgIGlmIChhcmdjID09IDApCisgICAgZXhpdCgxKTsKKyNlbmRpZgorCisgIHBuYW1lID0gYXJndlswXTsKKyAgZm9yIChwcCA9IHBuYW1lOyAqcHA7ICkKKyAgICBpZiAoKnBwKysgPT0gUEFUSF9TRVApCisgICAgICBwbmFtZSA9IHBwOworI2lmZGVmIEZJTEVfU0VQCisgIGZvciAocHAgPSBwbmFtZTsgKnBwOyBwcCsrKQorICAgIGlmICgqcHAgPT0gRklMRV9TRVApCisgICAgICB7CisJKnBwID0gJ1wwJzsKKwlicmVhazsKKyAgICAgIH0KKyNlbmRpZgorCisgIHdoaWxlIChhcmdjID49IDIpCisgICAgeworICAgICAgcHAgPSBhcmd2WzFdICsgKCFTVFJOQ01QKGFyZ3ZbMV0sICItLSIsIDIpICYmIGFyZ3ZbMV1bMl0pOworCSAgIGlmICghU1RSTkNNUChwcCwgIi1hIiwgMikpIGF1dG9za2lwID0gMSAtIGF1dG9za2lwOworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItYiIsIDIpKSBoZXh0eXBlID0gSEVYX0JJVFM7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi11IiwgMikpIGhleHggPSBoZXh4YSArIDE2OworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItcCIsIDIpKSBoZXh0eXBlID0gSEVYX1BPU1RTQ1JJUFQ7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi1pIiwgMikpIGhleHR5cGUgPSBIRVhfQ0lOQ0xVREU7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi1yIiwgMikpIHJldmVydCsrOworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItRSIsIDIpKSBlYmNkaWMrKzsKKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLXYiLCAyKSkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzJXNcbiIsIHZlcnNpb24sIG9zdmVyKTsKKwkgIGV4aXQoMCk7CisJfQorICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItYyIsIDIpKQorCXsKKwkgIGlmIChwcFsyXSAmJiBTVFJOQ01QKCJvbHMiLCBwcCArIDIsIDMpKQorCSAgICBjb2xzID0gKGludClzdHJ0b2wocHAgKyAyLCBOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBjb2xzID0gKGludClzdHJ0b2woYXJndlsyXSwgTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLWciLCAyKSkKKwl7CisJICBpZiAocHBbMl0gJiYgU1RSTkNNUCgiZ3JvdXAiLCBwcCArIDIsIDUpKQorCSAgICBvY3RzcGVyZ3JwID0gKGludClzdHJ0b2wocHAgKyAyLCBOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBvY3RzcGVyZ3JwID0gKGludClzdHJ0b2woYXJndlsyXSwgTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLXMiLCAyKSkKKwl7CisJICByZWxzZWVrID0gMDsKKwkgIG5lZ3NlZWsgPSAwOworCSAgaWYgKHBwWzJdICYmIFNUUk5DTVAoImtpcCIsIHBwKzIsIDMpICYmIFNUUk5DTVAoImVlayIsIHBwKzIsIDMpKQorCSAgICB7CisjaWZkZWYgVFJZX1NFRUsKKwkgICAgICBpZiAocHBbMl0gPT0gJysnKQorCQlyZWxzZWVrKys7CisJICAgICAgaWYgKHBwWzIrcmVsc2Vla10gPT0gJy0nKQorCQluZWdzZWVrKys7CisjZW5kaWYKKwkgICAgICBzZWVrb2ZmID0gc3RydG9sKHBwICsgMityZWxzZWVrK25lZ3NlZWssIChjaGFyICoqKU5VTEwsIDApOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIWFyZ3ZbMl0pCisJCWV4aXRfd2l0aF91c2FnZShwbmFtZSk7CisjaWZkZWYgVFJZX1NFRUsKKwkgICAgICBpZiAoYXJndlsyXVswXSA9PSAnKycpCisJCXJlbHNlZWsrKzsKKwkgICAgICBpZiAoYXJndlsyXVtyZWxzZWVrXSA9PSAnLScpCisJCW5lZ3NlZWsrKzsKKyNlbmRpZgorCSAgICAgIHNlZWtvZmYgPSBzdHJ0b2woYXJndlsyXSArIHJlbHNlZWsrbmVnc2VlaywgKGNoYXIgKiopTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLWwiLCAyKSkKKwl7CisJICBpZiAocHBbMl0gJiYgU1RSTkNNUCgiZW4iLCBwcCArIDIsIDIpKQorCSAgICBsZW5ndGggPSBzdHJ0b2wocHAgKyAyLCAoY2hhciAqKilOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBsZW5ndGggPSBzdHJ0b2woYXJndlsyXSwgKGNoYXIgKiopTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAocHAsICItLSIpKQkvKiBlbmQgb2Ygb3B0aW9ucyAqLworCXsKKwkgIGFyZ3YrKzsKKwkgIGFyZ2MtLTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKHBwWzBdID09ICctJyAmJiBwcFsxXSkJLyogdW5rbm93biBvcHRpb24gKi8KKwlleGl0X3dpdGhfdXNhZ2UocG5hbWUpOworICAgICAgZWxzZQorCWJyZWFrOwkJCQkvKiBub3QgYW4gb3B0aW9uICovCisKKyAgICAgIGFyZ3YrKzsJCQkJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisgICAgICBhcmdjLS07CisgICAgfQorCisgIGlmICghY29scykKKyAgICBzd2l0Y2ggKGhleHR5cGUpCisgICAgICB7CisgICAgICBjYXNlIEhFWF9QT1NUU0NSSVBUOgljb2xzID0gMzA7IGJyZWFrOworICAgICAgY2FzZSBIRVhfQ0lOQ0xVREU6CWNvbHMgPSAxMjsgYnJlYWs7CisgICAgICBjYXNlIEhFWF9CSVRTOgkJY29scyA9IDY7IGJyZWFrOworICAgICAgY2FzZSBIRVhfTk9STUFMOgorICAgICAgZGVmYXVsdDoJCQljb2xzID0gMTY7IGJyZWFrOworICAgICAgfQorCisgIGlmIChvY3RzcGVyZ3JwIDwgMCkKKyAgICBzd2l0Y2ggKGhleHR5cGUpCisgICAgICB7CisgICAgICBjYXNlIEhFWF9CSVRTOgkJb2N0c3BlcmdycCA9IDE7IGJyZWFrOworICAgICAgY2FzZSBIRVhfTk9STUFMOgkJb2N0c3BlcmdycCA9IDI7IGJyZWFrOworICAgICAgY2FzZSBIRVhfUE9TVFNDUklQVDoKKyAgICAgIGNhc2UgSEVYX0NJTkNMVURFOgorICAgICAgZGVmYXVsdDoJCQlvY3RzcGVyZ3JwID0gMDsgYnJlYWs7CisgICAgICB9CisKKyAgaWYgKGNvbHMgPCAxIHx8ICghaGV4dHlwZSAmJiAoY29scyA+IENPTFMpKSkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG51bWJlciBvZiBjb2x1bW5zIChtYXguICVkKS5cbiIsIHBuYW1lLCBDT0xTKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIGlmIChvY3RzcGVyZ3JwIDwgMSkKKyAgICBvY3RzcGVyZ3JwID0gY29sczsKKworICBpZiAoYXJnYyA+IDMpCisgICAgZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKworICBpZiAoYXJnYyA9PSAxIHx8IChhcmd2WzFdWzBdID09ICctJyAmJiAhYXJndlsxXVsxXSkpCisgICAgQklOX0FTU0lHTihmcCA9IHN0ZGluLCAhcmV2ZXJ0KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZnAgPSBmb3Blbihhcmd2WzFdLCBCSU5fUkVBRCghcmV2ZXJ0KSkpID09IE5VTEwpCisJeworCSAgZnByaW50ZihzdGRlcnIsIiVzOiAiLCBwbmFtZSk7CisJICBwZXJyb3IoYXJndlsxXSk7CisJICByZXR1cm4gMjsKKwl9CisgICAgfQorCisgIGlmIChhcmdjIDwgMyB8fCAoYXJndlsyXVswXSA9PSAnLScgJiYgIWFyZ3ZbMl1bMV0pKQorICAgIEJJTl9BU1NJR04oZnBvID0gc3Rkb3V0LCByZXZlcnQpOworICBlbHNlCisgICAgeworICAgICAgaW50IGZkOworICAgICAgaW50IG1vZGUgPSByZXZlcnQgPyBPX1dST05MWSA6IChPX1RSVU5DfE9fV1JPTkxZKTsKKworICAgICAgaWYgKCgoZmQgPSBPUEVOKGFyZ3ZbMl0sIG1vZGUgfCBCSU5fQ1JFQVQocmV2ZXJ0KSwgMDY2NikpIDwgMCkgfHwKKwkgIChmcG8gPSBmZG9wZW4oZmQsIEJJTl9XUklURShyZXZlcnQpKSkgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwbmFtZSk7CisJICBwZXJyb3IoYXJndlsyXSk7CisJICByZXR1cm4gMzsKKwl9CisgICAgICByZXdpbmQoZnBvKTsKKyAgICB9CisKKyAgaWYgKHJldmVydCkKKyAgICB7CisgICAgICBpZiAoaGV4dHlwZSAmJiAoaGV4dHlwZSAhPSBIRVhfUE9TVFNDUklQVCkpCisJeworCSAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGNhbm5vdCByZXZlcnQgdGhpcyB0eXBlIG9mIGhleGR1bXBcbiIsIHBuYW1lKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICByZXR1cm4gaHVudHlwZShmcCwgZnBvLCBzdGRlcnIsIHBuYW1lLCBjb2xzLCBoZXh0eXBlLAorCQluZWdzZWVrID8gLXNlZWtvZmYgOiBzZWVrb2ZmKTsKKyAgICB9CisKKyAgaWYgKHNlZWtvZmYgfHwgbmVnc2VlayB8fCAhcmVsc2VlaykKKyAgICB7CisjaWZkZWYgVFJZX1NFRUsKKyAgICAgIGlmIChyZWxzZWVrKQorCWUgPSBmc2VlayhmcCwgbmVnc2VlayA/IC1zZWVrb2ZmIDogc2Vla29mZiwgMSk7CisgICAgICBlbHNlCisJZSA9IGZzZWVrKGZwLCBuZWdzZWVrID8gLXNlZWtvZmYgOiBzZWVrb2ZmLCBuZWdzZWVrID8gMiA6IDApOworICAgICAgaWYgKGUgPCAwICYmIG5lZ3NlZWspCisJeworCSAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnkgY2Fubm90IHNlZWsuXG4iLCBwbmFtZSk7CisJICByZXR1cm4gNDsKKwl9CisgICAgICBpZiAoZSA+PSAwKQorCXNlZWtvZmYgPSBmdGVsbChmcCk7CisgICAgICBlbHNlCisjZW5kaWYKKwl7CisJICBsb25nIHMgPSBzZWVrb2ZmOworCisJICB3aGlsZSAocy0tKQorCSAgICAodm9pZClnZXRjKGZwKTsKKwl9CisgICAgfQorCisgIGlmIChoZXh0eXBlID09IEhFWF9DSU5DTFVERSkKKyAgICB7CisgICAgICBpZiAoZnAgIT0gc3RkaW4pCisJeworCSAgZnByaW50ZihmcG8sICJ1bnNpZ25lZCBjaGFyICVzIiwgaXNkaWdpdCgoaW50KWFyZ3ZbMV1bMF0pID8gIl9fIiA6ICIiKTsKKwkgIGZvciAoZSA9IDA7IChjID0gYXJndlsxXVtlXSkgIT0gMDsgZSsrKQorCSAgICBwdXRjKGlzYWxudW0oYykgPyBjIDogJ18nLCBmcG8pOworCSAgZnB1dHMoIltdID0ge1xuIiwgZnBvKTsKKwl9CisKKyAgICAgIHAgPSAwOworICAgICAgd2hpbGUgKChsZW5ndGggPCAwIHx8IHAgPCBsZW5ndGgpICYmIChjID0gZ2V0YyhmcCkpICE9IEVPRikKKwl7CisJICBmcHJpbnRmKGZwbywgKGhleHggPT0gaGV4eGEpID8gIiVzMHglMDJ4IiA6ICIlczBYJTAyWCIsCisJICAgIChwICUgY29scykgPyAiLCAiIDogIixcbiAgIisyKiFwLCAgYyk7CisJICBwKys7CisJfQorCisgICAgICBpZiAocCkKKwlmcHV0cygiXG59O1xuIiszKihmcCA9PSBzdGRpbiksIGZwbyk7CisKKyAgICAgIGlmIChmcCAhPSBzdGRpbikKKwl7CisJICBmcHJpbnRmKGZwbywgInVuc2lnbmVkIGludCAlcyIsIGlzZGlnaXQoKGludClhcmd2WzFdWzBdKSA/ICJfXyIgOiAiIik7CisJICBmb3IgKGUgPSAwOyAoYyA9IGFyZ3ZbMV1bZV0pICE9IDA7IGUrKykKKwkgICAgcHV0Yyhpc2FsbnVtKGMpID8gYyA6ICdfJywgZnBvKTsKKwkgIGZwcmludGYoZnBvLCAiX2xlbiA9ICVkO1xuIiwgcCk7CisJfQorCisgICAgICBmY2xvc2UoZnApOworICAgICAgZmNsb3NlKGZwbyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGhleHR5cGUgPT0gSEVYX1BPU1RTQ1JJUFQpCisgICAgeworICAgICAgcCA9IGNvbHM7CisgICAgICB3aGlsZSAoKGxlbmd0aCA8IDAgfHwgbiA8IGxlbmd0aCkgJiYgKGUgPSBnZXRjKGZwKSkgIT0gRU9GKQorCXsKKwkgIHB1dGNoYXIoaGV4eFsoZSA+PiA0KSAmIDB4Zl0pOworCSAgcHV0Y2hhcihoZXh4WyhlICAgICApICYgMHhmXSk7CisJICBuKys7CisJICBpZiAoIS0tcCkKKwkgICAgeworCSAgICAgIHB1dGNoYXIoJ1xuJyk7CisJICAgICAgcCA9IGNvbHM7CisJICAgIH0KKwl9CisgICAgICBpZiAocCA8IGNvbHMpCisJcHV0Y2hhcignXG4nKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBmY2xvc2UoZnBvKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBoZXh0eXBlOiBIRVhfTk9STUFMIG9yIEhFWF9CSVRTICovCisKKyAgaWYgKGhleHR5cGUgPT0gSEVYX05PUk1BTCkKKyAgICBncnBsZW4gPSBvY3RzcGVyZ3JwICsgb2N0c3BlcmdycCArIDE7CS8qIGNoYXJzIHBlciBvY3RldCBncm91cCAqLworICBlbHNlCS8qIGhleHR5cGUgPT0gSEVYX0JJVFMgKi8KKyAgICBncnBsZW4gPSA4ICogb2N0c3BlcmdycCArIDE7CisKKyAgd2hpbGUgKChsZW5ndGggPCAwIHx8IG4gPCBsZW5ndGgpICYmIChlID0gZ2V0YyhmcCkpICE9IEVPRikKKyAgICB7CisgICAgICBpZiAocCA9PSAwKQorCXsKKwkgIHNwcmludGYobCwgIiUwN2x4OiAiLCBuICsgc2Vla29mZik7CisJICBmb3IgKGMgPSA5OyBjIDwgTExFTjsgbFtjKytdID0gJyAnKTsKKwl9CisgICAgICBpZiAoaGV4dHlwZSA9PSBIRVhfTk9STUFMKQorCXsKKwkgIGxbYyA9ICg5ICsgKGdycGxlbiAqIHApIC8gb2N0c3BlcmdycCldID0gaGV4eFsoZSA+PiA0KSAmIDB4Zl07CisJICBsWysrY10JCQkgICAgICAgPSBoZXh4WyBlICAgICAgICYgMHhmXTsKKwl9CisgICAgICBlbHNlIC8qIGhleHR5cGUgPT0gSEVYX0JJVFMgKi8KKwl7CisJICBpbnQgaTsKKworCSAgYyA9ICg5ICsgKGdycGxlbiAqIHApIC8gb2N0c3BlcmdycCkgLSAxOworCSAgZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCisJICAgIGxbKytjXSA9IChlICYgKDEgPDwgaSkpID8gJzEnIDogJzAnOworCX0KKyAgICAgIGlmIChlYmNkaWMpCisJZSA9IChlIDwgNjQpID8gJy4nIDogZXRvYTY0W2UtNjRdOworICAgICAgbFsxMSArIChncnBsZW4gKiBjb2xzIC0gMSkvb2N0c3BlcmdycCArIHBdID0KKyNpZmRlZiBfX01WU19fCisJICAoZSA+PSA2NCkKKyNlbHNlCisJICAoZSA+IDMxICYmIGUgPCAxMjcpCisjZW5kaWYKKwkgID8gZSA6ICcuJzsKKyAgICAgIGlmIChlKQorCW5vbnplcm8rKzsKKyAgICAgIG4rKzsKKyAgICAgIGlmICgrK3AgPT0gY29scykKKwl7CisJICBsW2MgPSAoMTEgKyAoZ3JwbGVuICogY29scyAtIDEpL29jdHNwZXJncnAgKyBwKV0gPSAnXG4nOyBsWysrY10gPSAnXDAnOworCSAgeHhkbGluZShmcG8sIGwsIGF1dG9za2lwID8gbm9uemVybyA6IDEpOworCSAgbm9uemVybyA9IDA7CisJICBwID0gMDsKKwl9CisgICAgfQorICBpZiAocCkKKyAgICB7CisgICAgICBsW2MgPSAoMTEgKyAoZ3JwbGVuICogY29scyAtIDEpL29jdHNwZXJncnAgKyBwKV0gPSAnXG4nOyBsWysrY10gPSAnXDAnOworICAgICAgeHhkbGluZShmcG8sIGwsIDEpOworICAgIH0KKyAgZWxzZSBpZiAoYXV0b3NraXApCisgICAgeHhkbGluZShmcG8sIGwsIC0xKTsJLyogbGFzdCBjaGFuY2UgdG8gZmx1c2ggb3V0IHN1cHJlc3NlZCBsaW5lcyAqLworCisgIGZjbG9zZShmcCk7CisgIGZjbG9zZShmcG8pOworICByZXR1cm4gMDsKK30K